diff --git a/Doc/Makefile b/Doc/Makefile index b8ca1edfbc60a58cabc4f29b770329fe1b45bbc4..f653d70674eb1c6565c41c2f2b0dc66cac214599 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -143,7 +143,7 @@ clean: venv: $(PYTHON) -m venv $(VENVDIR) $(VENVDIR)/bin/python3 -m pip install -U pip setuptools - $(VENVDIR)/bin/python3 -m pip install -U Sphinx==2.3.1 blurb python-docs-theme + $(VENVDIR)/bin/python3 -m pip install -r requirements.txt @echo "The venv has been created in the $(VENVDIR) directory" dist: diff --git a/Doc/c-api/abstract.rst b/Doc/c-api/abstract.rst index 0edd1d5f6240af7d1e547f5e2c5c32a20d19e019..1823f9d70c79f3ef4d873ca0d46f7d56a42f2964 100644 --- a/Doc/c-api/abstract.rst +++ b/Doc/c-api/abstract.rst @@ -18,6 +18,7 @@ but whose items have not been set to some non-\ ``NULL`` value yet. .. toctree:: object.rst + call.rst number.rst sequence.rst mapping.rst diff --git a/Doc/c-api/arg.rst b/Doc/c-api/arg.rst index b7baad589a72c83a73d8624ba0ed1b1e318f6dda..a187a8fb814371cdd501dd2c14284910e5f0067c 100644 --- a/Doc/c-api/arg.rst +++ b/Doc/c-api/arg.rst @@ -131,12 +131,12 @@ which disallows mutable objects such as :class:`bytearray`. ``S`` (:class:`bytes`) [PyBytesObject \*] Requires that the Python object is a :class:`bytes` object, without attempting any conversion. Raises :exc:`TypeError` if the object is not - a bytes object. The C variable may also be declared as :c:type:`PyObject\*`. + a bytes object. The C variable may also be declared as :c:type:`PyObject*`. ``Y`` (:class:`bytearray`) [PyByteArrayObject \*] Requires that the Python object is a :class:`bytearray` object, without attempting any conversion. Raises :exc:`TypeError` if the object is not - a :class:`bytearray` object. The C variable may also be declared as :c:type:`PyObject\*`. + a :class:`bytearray` object. The C variable may also be declared as :c:type:`PyObject*`. ``u`` (:class:`str`) [const Py_UNICODE \*] Convert a Python Unicode object to a C pointer to a NUL-terminated buffer of @@ -183,7 +183,7 @@ which disallows mutable objects such as :class:`bytearray`. ``U`` (:class:`str`) [PyObject \*] Requires that the Python object is a Unicode object, without attempting any conversion. Raises :exc:`TypeError` if the object is not a Unicode - object. The C variable may also be declared as :c:type:`PyObject\*`. + object. The C variable may also be declared as :c:type:`PyObject*`. ``w*`` (read-write :term:`bytes-like object`) [Py_buffer] This format accepts any object which implements the read-write buffer @@ -196,10 +196,10 @@ which disallows mutable objects such as :class:`bytearray`. It only works for encoded data without embedded NUL bytes. This format requires two arguments. The first is only used as input, and - must be a :c:type:`const char\*` which points to the name of an encoding as a + must be a :c:type:`const char*` which points to the name of an encoding as a NUL-terminated string, or ``NULL``, in which case ``'utf-8'`` encoding is used. An exception is raised if the named encoding is not known to Python. The - second argument must be a :c:type:`char\*\*`; the value of the pointer it + second argument must be a :c:type:`char**`; the value of the pointer it references will be set to a buffer with the contents of the argument text. The text will be encoded in the encoding specified by the first argument. @@ -219,10 +219,10 @@ which disallows mutable objects such as :class:`bytearray`. characters. It requires three arguments. The first is only used as input, and must be a - :c:type:`const char\*` which points to the name of an encoding as a + :c:type:`const char*` which points to the name of an encoding as a NUL-terminated string, or ``NULL``, in which case ``'utf-8'`` encoding is used. An exception is raised if the named encoding is not known to Python. The - second argument must be a :c:type:`char\*\*`; the value of the pointer it + second argument must be a :c:type:`char**`; the value of the pointer it references will be set to a buffer with the contents of the argument text. The text will be encoded in the encoding specified by the first argument. The third argument must be a pointer to an integer; the referenced integer @@ -322,7 +322,7 @@ Other objects ``O!`` (object) [*typeobject*, PyObject \*] Store a Python object in a C object pointer. This is similar to ``O``, but takes two C arguments: the first is the address of a Python type object, the - second is the address of the C variable (of type :c:type:`PyObject\*`) into which + second is the address of the C variable (of type :c:type:`PyObject*`) into which the object pointer is stored. If the Python object does not have the required type, :exc:`TypeError` is raised. @@ -331,13 +331,13 @@ Other objects ``O&`` (object) [*converter*, *anything*] Convert a Python object to a C variable through a *converter* function. This takes two arguments: the first is a function, the second is the address of a C - variable (of arbitrary type), converted to :c:type:`void \*`. The *converter* + variable (of arbitrary type), converted to :c:type:`void *`. The *converter* function in turn is called as follows:: status = converter(object, address); where *object* is the Python object to be converted and *address* is the - :c:type:`void\*` argument that was passed to the :c:func:`PyArg_Parse\*` function. + :c:type:`void*` argument that was passed to the :c:func:`PyArg_Parse\*` function. The returned *status* should be ``1`` for a successful conversion and ``0`` if the conversion has failed. When the conversion fails, the *converter* function should raise an exception and leave the content of *address* unmodified. @@ -483,7 +483,7 @@ API Functions *args*; it must actually be a tuple. The length of the tuple must be at least *min* and no more than *max*; *min* and *max* may be equal. Additional arguments must be passed to the function, each of which should be a pointer to a - :c:type:`PyObject\*` variable; these will be filled in with the values from + :c:type:`PyObject*` variable; these will be filled in with the values from *args*; they will contain borrowed references. The variables which correspond to optional parameters not given by *args* will not be filled in; these should be initialized by the caller. This function returns true on success and false if @@ -652,8 +652,8 @@ Building values ``O&`` (object) [*converter*, *anything*] Convert *anything* to a Python object through a *converter* function. The - function is called with *anything* (which should be compatible with :c:type:`void - \*`) as its argument and should return a "new" Python object, or ``NULL`` if an + function is called with *anything* (which should be compatible with :c:type:`void*`) + as its argument and should return a "new" Python object, or ``NULL`` if an error occurred. ``(items)`` (:class:`tuple`) [*matching-items*] diff --git a/Doc/c-api/bool.rst b/Doc/c-api/bool.rst index ce8de6e22f44caf19026385b597cdbb1df40f767..c197d447e9618c9998851c7fe2c6d1df5aefd731 100644 --- a/Doc/c-api/bool.rst +++ b/Doc/c-api/bool.rst @@ -13,7 +13,8 @@ are available, however. .. c:function:: int PyBool_Check(PyObject *o) - Return true if *o* is of type :c:data:`PyBool_Type`. + Return true if *o* is of type :c:data:`PyBool_Type`. This function always + succeeds. .. c:var:: PyObject* Py_False diff --git a/Doc/c-api/buffer.rst b/Doc/c-api/buffer.rst index 4e6fa0b32e66961a171f0b1c22e05e440f732fd0..e32719373cc71663561c7889721a18b1e9e6fe08 100644 --- a/Doc/c-api/buffer.rst +++ b/Doc/c-api/buffer.rst @@ -89,7 +89,7 @@ a buffer, see :c:func:`PyObject_GetBuffer`. .. c:type:: Py_buffer - .. c:member:: void \*buf + .. c:member:: void *buf A pointer to the start of the logical structure described by the buffer fields. This can be any location within the underlying physical memory @@ -99,7 +99,7 @@ a buffer, see :c:func:`PyObject_GetBuffer`. For :term:`contiguous` arrays, the value points to the beginning of the memory block. - .. c:member:: void \*obj + .. c:member:: void *obj A new reference to the exporting object. The reference is owned by the consumer and automatically decremented and set to ``NULL`` by @@ -145,7 +145,7 @@ a buffer, see :c:func:`PyObject_GetBuffer`. or a :c:macro:`PyBUF_WRITABLE` request, the consumer must disregard :c:member:`~Py_buffer.itemsize` and assume ``itemsize == 1``. - .. c:member:: const char \*format + .. c:member:: const char *format A *NUL* terminated string in :mod:`struct` module style syntax describing the contents of a single item. If this is ``NULL``, ``"B"`` (unsigned bytes) @@ -164,7 +164,7 @@ a buffer, see :c:func:`PyObject_GetBuffer`. to 64. Exporters MUST respect this limit, consumers of multi-dimensional buffers SHOULD be able to handle up to :c:macro:`PyBUF_MAX_NDIM` dimensions. - .. c:member:: Py_ssize_t \*shape + .. c:member:: Py_ssize_t *shape An array of :c:type:`Py_ssize_t` of length :c:member:`~Py_buffer.ndim` indicating the shape of the memory as an n-dimensional array. Note that @@ -177,7 +177,7 @@ a buffer, see :c:func:`PyObject_GetBuffer`. The shape array is read-only for the consumer. - .. c:member:: Py_ssize_t \*strides + .. c:member:: Py_ssize_t *strides An array of :c:type:`Py_ssize_t` of length :c:member:`~Py_buffer.ndim` giving the number of bytes to skip to get to a new element in each @@ -189,7 +189,7 @@ a buffer, see :c:func:`PyObject_GetBuffer`. The strides array is read-only for the consumer. - .. c:member:: Py_ssize_t \*suboffsets + .. c:member:: Py_ssize_t *suboffsets An array of :c:type:`Py_ssize_t` of length :c:member:`~Py_buffer.ndim`. If ``suboffsets[n] >= 0``, the values stored along the nth dimension are @@ -207,7 +207,7 @@ a buffer, see :c:func:`PyObject_GetBuffer`. The suboffsets array is read-only for the consumer. - .. c:member:: void \*internal + .. c:member:: void *internal This is for use internally by the exporting object. For example, this might be re-cast as an integer by the exporter and used to store flags @@ -301,7 +301,7 @@ must be C-contiguous. +-----------------------------------+-------+---------+------------+--------+ | .. c:macro:: PyBUF_ANY_CONTIGUOUS | yes | yes | NULL | C or F | +-----------------------------------+-------+---------+------------+--------+ -| .. c:macro:: PyBUF_ND | yes | NULL | NULL | C | +| :c:macro:`PyBUF_ND` | yes | NULL | NULL | C | +-----------------------------------+-------+---------+------------+--------+ @@ -438,12 +438,12 @@ Buffer-related functions Send a request to *exporter* to fill in *view* as specified by *flags*. If the exporter cannot provide a buffer of the exact type, it MUST raise - :c:data:`PyExc_BufferError`, set :c:member:`view->obj` to ``NULL`` and + :c:data:`PyExc_BufferError`, set ``view->obj`` to ``NULL`` and return ``-1``. - On success, fill in *view*, set :c:member:`view->obj` to a new reference + On success, fill in *view*, set ``view->obj`` to a new reference to *exporter* and return 0. In the case of chained buffer providers - that redirect requests to a single object, :c:member:`view->obj` MAY + that redirect requests to a single object, ``view->obj`` MAY refer to this object instead of *exporter* (See :ref:`Buffer Object Structures `). Successful calls to :c:func:`PyObject_GetBuffer` must be paired with calls @@ -455,17 +455,19 @@ Buffer-related functions .. c:function:: void PyBuffer_Release(Py_buffer *view) Release the buffer *view* and decrement the reference count for - :c:member:`view->obj`. This function MUST be called when the buffer + ``view->obj``. This function MUST be called when the buffer is no longer being used, otherwise reference leaks may occur. It is an error to call this function on a buffer that was not obtained via :c:func:`PyObject_GetBuffer`. -.. c:function:: Py_ssize_t PyBuffer_SizeFromFormat(const char *) +.. c:function:: Py_ssize_t PyBuffer_SizeFromFormat(const char *format) Return the implied :c:data:`~Py_buffer.itemsize` from :c:data:`~Py_buffer.format`. - This function is not yet implemented. + On error, raise an exception and return -1. + + .. versionadded:: 3.9 .. c:function:: int PyBuffer_IsContiguous(Py_buffer *view, char order) @@ -514,9 +516,9 @@ Buffer-related functions *view* as specified by flags, unless *buf* has been designated as read-only and :c:macro:`PyBUF_WRITABLE` is set in *flags*. - On success, set :c:member:`view->obj` to a new reference to *exporter* and + On success, set ``view->obj`` to a new reference to *exporter* and return 0. Otherwise, raise :c:data:`PyExc_BufferError`, set - :c:member:`view->obj` to ``NULL`` and return ``-1``; + ``view->obj`` to ``NULL`` and return ``-1``; If this function is used as part of a :ref:`getbufferproc `, *exporter* MUST be set to the exporting object and *flags* must be passed diff --git a/Doc/c-api/bytearray.rst b/Doc/c-api/bytearray.rst index b2f409c15abb7a15b035b8896bb41b362e9cd6ed..30bcfc7cf9f500802a297a50553dc7beec13b971 100644 --- a/Doc/c-api/bytearray.rst +++ b/Doc/c-api/bytearray.rst @@ -25,13 +25,13 @@ Type check macros .. c:function:: int PyByteArray_Check(PyObject *o) Return true if the object *o* is a bytearray object or an instance of a - subtype of the bytearray type. + subtype of the bytearray type. This function always succeeds. .. c:function:: int PyByteArray_CheckExact(PyObject *o) Return true if the object *o* is a bytearray object, but not an instance of a - subtype of the bytearray type. + subtype of the bytearray type. This function always succeeds. Direct API functions diff --git a/Doc/c-api/bytes.rst b/Doc/c-api/bytes.rst index 0e33ed2c7c94037a34cbaee53299ed7b7afc81b6..de65701037a7c1471402a8c54ad9f9b3ee2b9368 100644 --- a/Doc/c-api/bytes.rst +++ b/Doc/c-api/bytes.rst @@ -25,13 +25,13 @@ called with a non-bytes parameter. .. c:function:: int PyBytes_Check(PyObject *o) Return true if the object *o* is a bytes object or an instance of a subtype - of the bytes type. + of the bytes type. This function always succeeds. .. c:function:: int PyBytes_CheckExact(PyObject *o) Return true if the object *o* is a bytes object, but not an instance of a - subtype of the bytes type. + subtype of the bytes type. This function always succeeds. .. c:function:: PyObject* PyBytes_FromString(const char *v) diff --git a/Doc/c-api/call.rst b/Doc/c-api/call.rst new file mode 100644 index 0000000000000000000000000000000000000000..31dc9c8031fdb6d3af92aacd8955b206a5bade91 --- /dev/null +++ b/Doc/c-api/call.rst @@ -0,0 +1,424 @@ +.. highlight:: c + +.. _call: + +Call Protocol +============= + +CPython supports two different calling protocols: +*tp_call* and vectorcall. + +The *tp_call* Protocol +---------------------- + +Instances of classes that set :c:member:`~PyTypeObject.tp_call` are callable. +The signature of the slot is:: + + PyObject *tp_call(PyObject *callable, PyObject *args, PyObject *kwargs); + +A call is made using a tuple for the positional arguments +and a dict for the keyword arguments, similarly to +``callable(*args, **kwargs)`` in Python code. +*args* must be non-NULL (use an empty tuple if there are no arguments) +but *kwargs* may be *NULL* if there are no keyword arguments. + +This convention is not only used by *tp_call*: +:c:member:`~PyTypeObject.tp_new` and :c:member:`~PyTypeObject.tp_init` +also pass arguments this way. + +To call an object, use :c:func:`PyObject_Call` or other +:ref:`call API `. + + +.. _vectorcall: + +The Vectorcall Protocol +----------------------- + +.. versionadded:: 3.9 + +The vectorcall protocol was introduced in :pep:`590` as an additional protocol +for making calls more efficient. + +As rule of thumb, CPython will prefer the vectorcall for internal calls +if the callable supports it. However, this is not a hard rule. +Additionally, some third-party extensions use *tp_call* directly +(rather than using :c:func:`PyObject_Call`). +Therefore, a class supporting vectorcall must also implement +:c:member:`~PyTypeObject.tp_call`. +Moreover, the callable must behave the same +regardless of which protocol is used. +The recommended way to achieve this is by setting +:c:member:`~PyTypeObject.tp_call` to :c:func:`PyVectorcall_Call`. +This bears repeating: + +.. warning:: + + A class supporting vectorcall **must** also implement + :c:member:`~PyTypeObject.tp_call` with the same semantics. + +A class should not implement vectorcall if that would be slower +than *tp_call*. For example, if the callee needs to convert +the arguments to an args tuple and kwargs dict anyway, then there is no point +in implementing vectorcall. + +Classes can implement the vectorcall protocol by enabling the +:const:`Py_TPFLAGS_HAVE_VECTORCALL` flag and setting +:c:member:`~PyTypeObject.tp_vectorcall_offset` to the offset inside the +object structure where a *vectorcallfunc* appears. +This is a pointer to a function with the following signature: + +.. c:type:: PyObject *(*vectorcallfunc)(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) + +- *callable* is the object being called. +- *args* is a C array consisting of the positional arguments followed by the + values of the keyword arguments. + This can be *NULL* if there are no arguments. +- *nargsf* is the number of positional arguments plus possibly the + :const:`PY_VECTORCALL_ARGUMENTS_OFFSET` flag. + To get the actual number of positional arguments from *nargsf*, + use :c:func:`PyVectorcall_NARGS`. +- *kwnames* is a tuple containing the names of the keyword arguments; + in other words, the keys of the kwargs dict. + These names must be strings (instances of ``str`` or a subclass) + and they must be unique. + If there are no keyword arguments, then *kwnames* can instead be *NULL*. + +.. c:macro:: PY_VECTORCALL_ARGUMENTS_OFFSET + + If this flag is set in a vectorcall *nargsf* argument, the callee is allowed + to temporarily change ``args[-1]``. In other words, *args* points to + argument 1 (not 0) in the allocated vector. + The callee must restore the value of ``args[-1]`` before returning. + + For :c:func:`PyObject_VectorcallMethod`, this flag means instead that + ``args[0]`` may be changed. + + Whenever they can do so cheaply (without additional allocation), callers + are encouraged to use :const:`PY_VECTORCALL_ARGUMENTS_OFFSET`. + Doing so will allow callables such as bound methods to make their onward + calls (which include a prepended *self* argument) very efficiently. + +To call an object that implements vectorcall, use a :ref:`call API ` +function as with any other callable. +:c:func:`PyObject_Vectorcall` will usually be most efficient. + + +.. note:: + + In CPython 3.8, the vectorcall API and related functions were available + provisionally under names with a leading underscore: + ``_PyObject_Vectorcall``, ``_Py_TPFLAGS_HAVE_VECTORCALL``, + ``_PyObject_VectorcallMethod``, ``_PyVectorcall_Function``, + ``_PyObject_CallOneArg``, ``_PyObject_CallMethodNoArgs``, + ``_PyObject_CallMethodOneArg``. + Additionally, ``PyObject_VectorcallDict`` was available as + ``_PyObject_FastCallDict``. + The old names are still defined as aliases of the new, non-underscored names. + + +Recursion Control +................. + +When using *tp_call*, callees do not need to worry about +:ref:`recursion `: CPython uses +:c:func:`Py_EnterRecursiveCall` and :c:func:`Py_LeaveRecursiveCall` +for calls made using *tp_call*. + +For efficiency, this is not the case for calls done using vectorcall: +the callee should use *Py_EnterRecursiveCall* and *Py_LeaveRecursiveCall* +if needed. + + +Vectorcall Support API +...................... + +.. c:function:: Py_ssize_t PyVectorcall_NARGS(size_t nargsf) + + Given a vectorcall *nargsf* argument, return the actual number of + arguments. + Currently equivalent to:: + + (Py_ssize_t)(nargsf & ~PY_VECTORCALL_ARGUMENTS_OFFSET) + + However, the function ``PyVectorcall_NARGS`` should be used to allow + for future extensions. + + This function is not part of the :ref:`limited API `. + + .. versionadded:: 3.8 + +.. c:function:: vectorcallfunc PyVectorcall_Function(PyObject *op) + + If *op* does not support the vectorcall protocol (either because the type + does not or because the specific instance does not), return *NULL*. + Otherwise, return the vectorcall function pointer stored in *op*. + This function never raises an exception. + + This is mostly useful to check whether or not *op* supports vectorcall, + which can be done by checking ``PyVectorcall_Function(op) != NULL``. + + This function is not part of the :ref:`limited API `. + + .. versionadded:: 3.8 + +.. c:function:: PyObject* PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *dict) + + Call *callable*'s :c:type:`vectorcallfunc` with positional and keyword + arguments given in a tuple and dict, respectively. + + This is a specialized function, intended to be put in the + :c:member:`~PyTypeObject.tp_call` slot or be used in an implementation of ``tp_call``. + It does not check the :const:`Py_TPFLAGS_HAVE_VECTORCALL` flag + and it does not fall back to ``tp_call``. + + This function is not part of the :ref:`limited API `. + + .. versionadded:: 3.8 + + +.. _capi-call: + +Object Calling API +------------------ + +Various functions are available for calling a Python object. +Each converts its arguments to a convention supported by the called object – +either *tp_call* or vectorcall. +In order to do as litle conversion as possible, pick one that best fits +the format of data you have available. + +The following table summarizes the available functions; +please see individual documentation for details. + ++------------------------------------------+------------------+--------------------+---------------+ +| Function | callable | args | kwargs | ++==========================================+==================+====================+===============+ +| :c:func:`PyObject_Call` | ``PyObject *`` | tuple | dict/``NULL`` | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_CallNoArgs` | ``PyObject *`` | --- | --- | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_CallOneArg` | ``PyObject *`` | 1 object | --- | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_CallObject` | ``PyObject *`` | tuple/``NULL`` | --- | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_CallFunction` | ``PyObject *`` | format | --- | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_CallMethod` | obj + ``char*`` | format | --- | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_CallFunctionObjArgs` | ``PyObject *`` | variadic | --- | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_CallMethodObjArgs` | obj + name | variadic | --- | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_CallMethodNoArgs` | obj + name | --- | --- | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_CallMethodOneArg` | obj + name | 1 object | --- | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_Vectorcall` | ``PyObject *`` | vectorcall | vectorcall | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_VectorcallDict` | ``PyObject *`` | vectorcall | dict/``NULL`` | ++------------------------------------------+------------------+--------------------+---------------+ +| :c:func:`PyObject_VectorcallMethod` | arg + name | vectorcall | vectorcall | ++------------------------------------------+------------------+--------------------+---------------+ + + +.. c:function:: PyObject* PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs) + + Call a callable Python object *callable*, with arguments given by the + tuple *args*, and named arguments given by the dictionary *kwargs*. + + *args* must not be *NULL*; use an empty tuple if no arguments are needed. + If no named arguments are needed, *kwargs* can be *NULL*. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + This is the equivalent of the Python expression: + ``callable(*args, **kwargs)``. + + +.. c:function:: PyObject* PyObject_CallNoArgs(PyObject *callable) + + Call a callable Python object *callable* without any arguments. It is the + most efficient way to call a callable Python object without any argument. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + .. versionadded:: 3.9 + + +.. c:function:: PyObject* PyObject_CallOneArg(PyObject *callable, PyObject *arg) + + Call a callable Python object *callable* with exactly 1 positional argument + *arg* and no keyword arguments. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + This function is not part of the :ref:`limited API `. + + .. versionadded:: 3.9 + + +.. c:function:: PyObject* PyObject_CallObject(PyObject *callable, PyObject *args) + + Call a callable Python object *callable*, with arguments given by the + tuple *args*. If no arguments are needed, then *args* can be *NULL*. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + This is the equivalent of the Python expression: ``callable(*args)``. + + +.. c:function:: PyObject* PyObject_CallFunction(PyObject *callable, const char *format, ...) + + Call a callable Python object *callable*, with a variable number of C arguments. + The C arguments are described using a :c:func:`Py_BuildValue` style format + string. The format can be *NULL*, indicating that no arguments are provided. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + This is the equivalent of the Python expression: ``callable(*args)``. + + Note that if you only pass :c:type:`PyObject *` args, + :c:func:`PyObject_CallFunctionObjArgs` is a faster alternative. + + .. versionchanged:: 3.4 + The type of *format* was changed from ``char *``. + + +.. c:function:: PyObject* PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...) + + Call the method named *name* of object *obj* with a variable number of C + arguments. The C arguments are described by a :c:func:`Py_BuildValue` format + string that should produce a tuple. + + The format can be *NULL*, indicating that no arguments are provided. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + This is the equivalent of the Python expression: + ``obj.name(arg1, arg2, ...)``. + + Note that if you only pass :c:type:`PyObject *` args, + :c:func:`PyObject_CallMethodObjArgs` is a faster alternative. + + .. versionchanged:: 3.4 + The types of *name* and *format* were changed from ``char *``. + + +.. c:function:: PyObject* PyObject_CallFunctionObjArgs(PyObject *callable, ...) + + Call a callable Python object *callable*, with a variable number of + :c:type:`PyObject *` arguments. The arguments are provided as a variable number + of parameters followed by *NULL*. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + This is the equivalent of the Python expression: + ``callable(arg1, arg2, ...)``. + + +.. c:function:: PyObject* PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...) + + Call a method of the Python object *obj*, where the name of the method is given as a + Python string object in *name*. It is called with a variable number of + :c:type:`PyObject *` arguments. The arguments are provided as a variable number + of parameters followed by *NULL*. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + +.. c:function:: PyObject* PyObject_CallMethodNoArgs(PyObject *obj, PyObject *name) + + Call a method of the Python object *obj* without arguments, + where the name of the method is given as a Python string object in *name*. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + This function is not part of the :ref:`limited API `. + + .. versionadded:: 3.9 + + +.. c:function:: PyObject* PyObject_CallMethodOneArg(PyObject *obj, PyObject *name, PyObject *arg) + + Call a method of the Python object *obj* with a single positional argument + *arg*, where the name of the method is given as a Python string object in + *name*. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + This function is not part of the :ref:`limited API `. + + .. versionadded:: 3.9 + + +.. c:function:: PyObject* PyObject_Vectorcall(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) + + Call a callable Python object *callable*. + The arguments are the same as for :c:type:`vectorcallfunc`. + If *callable* supports vectorcall_, this directly calls + the vectorcall function stored in *callable*. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + This function is not part of the :ref:`limited API `. + + .. versionadded:: 3.9 + +.. c:function:: PyObject* PyObject_VectorcallDict(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwdict) + + Call *callable* with positional arguments passed exactly as in the vectorcall_ protocol, + but with keyword arguments passed as a dictionary *kwdict*. + The *args* array contains only the positional arguments. + + Regardless of which protocol is used internally, + a conversion of arguments needs to be done. + Therefore, this function should only be used if the caller + already has a dictionary ready to use for the keyword arguments, + but not a tuple for the positional arguments. + + This function is not part of the :ref:`limited API `. + + .. versionadded:: 3.9 + +.. c:function:: PyObject* PyObject_VectorcallMethod(PyObject *name, PyObject *const *args, size_t nargsf, PyObject *kwnames) + + Call a method using the vectorcall calling convention. The name of the method + is given as a Python string *name*. The object whose method is called is + *args[0]*, and the *args* array starting at *args[1]* represents the arguments + of the call. There must be at least one positional argument. + *nargsf* is the number of positional arguments including *args[0]*, + plus :const:`PY_VECTORCALL_ARGUMENTS_OFFSET` if the value of ``args[0]`` may + temporarily be changed. Keyword arguments can be passed just like in + :c:func:`PyObject_Vectorcall`. + + If the object has the :const:`Py_TPFLAGS_METHOD_DESCRIPTOR` feature, + this will call the unbound method object with the full + *args* vector as arguments. + + Return the result of the call on success, or raise an exception and return + *NULL* on failure. + + This function is not part of the :ref:`limited API `. + + .. versionadded:: 3.9 + + +Call Support API +---------------- + +.. c:function:: int PyCallable_Check(PyObject *o) + + Determine if the object *o* is callable. Return ``1`` if the object is callable + and ``0`` otherwise. This function always succeeds. diff --git a/Doc/c-api/capsule.rst b/Doc/c-api/capsule.rst index 78e21140b2f80cf29e0da188c089ec72f4be2ca6..908e92653dd483791159e466e4c3fd0260a430c3 100644 --- a/Doc/c-api/capsule.rst +++ b/Doc/c-api/capsule.rst @@ -15,7 +15,7 @@ Refer to :ref:`using-capsules` for more information on using these objects. .. c:type:: PyCapsule This subtype of :c:type:`PyObject` represents an opaque value, useful for C - extension modules who need to pass an opaque value (as a :c:type:`void\*` + extension modules who need to pass an opaque value (as a :c:type:`void*` pointer) through Python code to other C code. It is often used to make a C function pointer defined in one module available to other modules, so the regular import mechanism can be used to access C APIs defined in dynamically @@ -34,7 +34,8 @@ Refer to :ref:`using-capsules` for more information on using these objects. .. c:function:: int PyCapsule_CheckExact(PyObject *p) - Return true if its argument is a :c:type:`PyCapsule`. + Return true if its argument is a :c:type:`PyCapsule`. This function always + succeeds. .. c:function:: PyObject* PyCapsule_New(void *pointer, const char *name, PyCapsule_Destructor destructor) diff --git a/Doc/c-api/cell.rst b/Doc/c-api/cell.rst index 8408f7e398db7b63e99e77fe578d271100f7d0e3..ac4ef5adc5cc20f8b95d3a892a43080a08e5f719 100644 --- a/Doc/c-api/cell.rst +++ b/Doc/c-api/cell.rst @@ -27,7 +27,8 @@ Cell objects are not likely to be useful elsewhere. .. c:function:: int PyCell_Check(ob) - Return true if *ob* is a cell object; *ob* must not be ``NULL``. + Return true if *ob* is a cell object; *ob* must not be ``NULL``. This + function always succeeds. .. c:function:: PyObject* PyCell_New(PyObject *ob) diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst index 6f8c41ccbf6e853d9728f101e4f0b4e9dbb63203..b3a17f1898e8e19974741b4f10c1b1a235d0fa54 100644 --- a/Doc/c-api/code.rst +++ b/Doc/c-api/code.rst @@ -27,7 +27,7 @@ bound into a function. .. c:function:: int PyCode_Check(PyObject *co) - Return true if *co* is a :class:`code` object. + Return true if *co* is a :class:`code` object. This function always succeeds. .. c:function:: int PyCode_GetNumFree(PyCodeObject *co) diff --git a/Doc/c-api/complex.rst b/Doc/c-api/complex.rst index 06dbb2572725ee7b6b5f84cdb85610fc576a8a9f..e2ea766b3a32a759d93fbd3f12dc6c1439898c50 100644 --- a/Doc/c-api/complex.rst +++ b/Doc/c-api/complex.rst @@ -94,13 +94,13 @@ Complex Numbers as Python Objects .. c:function:: int PyComplex_Check(PyObject *p) Return true if its argument is a :c:type:`PyComplexObject` or a subtype of - :c:type:`PyComplexObject`. + :c:type:`PyComplexObject`. This function always succeeds. .. c:function:: int PyComplex_CheckExact(PyObject *p) Return true if its argument is a :c:type:`PyComplexObject`, but not a subtype of - :c:type:`PyComplexObject`. + :c:type:`PyComplexObject`. This function always succeeds. .. c:function:: PyObject* PyComplex_FromCComplex(Py_complex v) diff --git a/Doc/c-api/contextvars.rst b/Doc/c-api/contextvars.rst index 38256a3b0f2a06d05646344c3be2cf3e6c0f5fc1..9c088814314a81404c7c4d580f9a9a809ab4a8c3 100644 --- a/Doc/c-api/contextvars.rst +++ b/Doc/c-api/contextvars.rst @@ -101,11 +101,6 @@ Context object management functions: current context for the current thread. Returns ``0`` on success, and ``-1`` on error. -.. c:function:: int PyContext_ClearFreeList() - - Clear the context variable free list. Return the total number of - freed items. This function always succeeds. - Context variable functions: diff --git a/Doc/c-api/conversion.rst b/Doc/c-api/conversion.rst index b310fcb5e4f91e4908b4bdc9ecb427177b377bfe..ee76accae62b8d940b9c1a49d758ae0691ee73e4 100644 --- a/Doc/c-api/conversion.rst +++ b/Doc/c-api/conversion.rst @@ -11,14 +11,14 @@ Functions for number conversion and formatted string output. .. c:function:: int PyOS_snprintf(char *str, size_t size, const char *format, ...) Output not more than *size* bytes to *str* according to the format string - *format* and the extra arguments. See the Unix man page :manpage:`snprintf(2)`. + *format* and the extra arguments. See the Unix man page :manpage:`snprintf(3)`. .. c:function:: int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) Output not more than *size* bytes to *str* according to the format string *format* and the variable argument list *va*. Unix man page - :manpage:`vsnprintf(2)`. + :manpage:`vsnprintf(3)`. :c:func:`PyOS_snprintf` and :c:func:`PyOS_vsnprintf` wrap the Standard C library functions :c:func:`snprintf` and :c:func:`vsnprintf`. Their purpose is to diff --git a/Doc/c-api/coro.rst b/Doc/c-api/coro.rst index 2260944a9a93a9e897e9dbc4b04723e79a02ecab..caa855a10d20ca93c66e33967671f1116d491efd 100644 --- a/Doc/c-api/coro.rst +++ b/Doc/c-api/coro.rst @@ -24,6 +24,7 @@ return. .. c:function:: int PyCoro_CheckExact(PyObject *ob) Return true if *ob*'s type is :c:type:`PyCoro_Type`; *ob* must not be ``NULL``. + This function always succeeds. .. c:function:: PyObject* PyCoro_New(PyFrameObject *frame, PyObject *name, PyObject *qualname) diff --git a/Doc/c-api/datetime.rst b/Doc/c-api/datetime.rst index bd4f1ff446bcf4c44195b09f78de30dd999d69a0..66f148df28680770490a6a14f1440b3e37ba1815 100644 --- a/Doc/c-api/datetime.rst +++ b/Doc/c-api/datetime.rst @@ -28,61 +28,66 @@ Type-check macros: .. c:function:: int PyDate_Check(PyObject *ob) Return true if *ob* is of type :c:data:`PyDateTime_DateType` or a subtype of - :c:data:`PyDateTime_DateType`. *ob* must not be ``NULL``. + :c:data:`PyDateTime_DateType`. *ob* must not be ``NULL``. This function always + succeeds. .. c:function:: int PyDate_CheckExact(PyObject *ob) Return true if *ob* is of type :c:data:`PyDateTime_DateType`. *ob* must not be - ``NULL``. + ``NULL``. This function always succeeds. .. c:function:: int PyDateTime_Check(PyObject *ob) Return true if *ob* is of type :c:data:`PyDateTime_DateTimeType` or a subtype of - :c:data:`PyDateTime_DateTimeType`. *ob* must not be ``NULL``. + :c:data:`PyDateTime_DateTimeType`. *ob* must not be ``NULL``. This function always + succeeds. .. c:function:: int PyDateTime_CheckExact(PyObject *ob) Return true if *ob* is of type :c:data:`PyDateTime_DateTimeType`. *ob* must not - be ``NULL``. + be ``NULL``. This function always succeeds. .. c:function:: int PyTime_Check(PyObject *ob) Return true if *ob* is of type :c:data:`PyDateTime_TimeType` or a subtype of - :c:data:`PyDateTime_TimeType`. *ob* must not be ``NULL``. + :c:data:`PyDateTime_TimeType`. *ob* must not be ``NULL``. This function always + succeeds. .. c:function:: int PyTime_CheckExact(PyObject *ob) Return true if *ob* is of type :c:data:`PyDateTime_TimeType`. *ob* must not be - ``NULL``. + ``NULL``. This function always succeeds. .. c:function:: int PyDelta_Check(PyObject *ob) Return true if *ob* is of type :c:data:`PyDateTime_DeltaType` or a subtype of - :c:data:`PyDateTime_DeltaType`. *ob* must not be ``NULL``. + :c:data:`PyDateTime_DeltaType`. *ob* must not be ``NULL``. This function always + succeeds. .. c:function:: int PyDelta_CheckExact(PyObject *ob) Return true if *ob* is of type :c:data:`PyDateTime_DeltaType`. *ob* must not be - ``NULL``. + ``NULL``. This function always succeeds. .. c:function:: int PyTZInfo_Check(PyObject *ob) Return true if *ob* is of type :c:data:`PyDateTime_TZInfoType` or a subtype of - :c:data:`PyDateTime_TZInfoType`. *ob* must not be ``NULL``. + :c:data:`PyDateTime_TZInfoType`. *ob* must not be ``NULL``. This function always + succeeds. .. c:function:: int PyTZInfo_CheckExact(PyObject *ob) Return true if *ob* is of type :c:data:`PyDateTime_TZInfoType`. *ob* must not be - ``NULL``. + ``NULL``. This function always succeeds. Macros to create objects: diff --git a/Doc/c-api/dict.rst b/Doc/c-api/dict.rst index e48c11d336b8ce8e024bab0736733313f8573e0f..5803ac2ad97adb8bc548e160b9f4fcab086ea492 100644 --- a/Doc/c-api/dict.rst +++ b/Doc/c-api/dict.rst @@ -22,13 +22,13 @@ Dictionary Objects .. c:function:: int PyDict_Check(PyObject *p) Return true if *p* is a dict object or an instance of a subtype of the dict - type. + type. This function always succeeds. .. c:function:: int PyDict_CheckExact(PyObject *p) Return true if *p* is a dict object, but not an instance of a subtype of - the dict type. + the dict type. This function always succeeds. .. c:function:: PyObject* PyDict_New() @@ -73,7 +73,7 @@ Dictionary Objects .. index:: single: PyUnicode_FromString() Insert *val* into the dictionary *p* using *key* as a key. *key* should - be a :c:type:`const char\*`. The key object is created using + be a :c:type:`const char*`. The key object is created using ``PyUnicode_FromString(key)``. Return ``0`` on success or ``-1`` on failure. This function *does not* steal a reference to *val*. @@ -81,14 +81,16 @@ Dictionary Objects .. c:function:: int PyDict_DelItem(PyObject *p, PyObject *key) Remove the entry in dictionary *p* with key *key*. *key* must be hashable; - if it isn't, :exc:`TypeError` is raised. Return ``0`` on success or ``-1`` - on failure. + if it isn't, :exc:`TypeError` is raised. + If *key* is not in the dictionary, :exc:`KeyError` is raised. + Return ``0`` on success or ``-1`` on failure. .. c:function:: int PyDict_DelItemString(PyObject *p, const char *key) - Remove the entry in dictionary *p* which has a key specified by the string - *key*. Return ``0`` on success or ``-1`` on failure. + Remove the entry in dictionary *p* which has a key specified by the string *key*. + If *key* is not in the dictionary, :exc:`KeyError` is raised. + Return ``0`` on success or ``-1`` on failure. .. c:function:: PyObject* PyDict_GetItem(PyObject *p, PyObject *key) @@ -112,7 +114,7 @@ Dictionary Objects .. c:function:: PyObject* PyDict_GetItemString(PyObject *p, const char *key) This is the same as :c:func:`PyDict_GetItem`, but *key* is specified as a - :c:type:`const char\*`, rather than a :c:type:`PyObject\*`. + :c:type:`const char*`, rather than a :c:type:`PyObject*`. Note that exceptions which occur while calling :meth:`__hash__` and :meth:`__eq__` methods and creating a temporary string object @@ -161,7 +163,7 @@ Dictionary Objects prior to the first call to this function to start the iteration; the function returns true for each pair in the dictionary, and false once all pairs have been reported. The parameters *pkey* and *pvalue* should either - point to :c:type:`PyObject\*` variables that will be filled in with each key + point to :c:type:`PyObject*` variables that will be filled in with each key and value, respectively, or may be ``NULL``. Any references returned through them are borrowed. *ppos* should not be altered during iteration. Its value represents offsets within the internal dictionary structure, and @@ -232,10 +234,3 @@ Dictionary Objects for key, value in seq2: if override or key not in a: a[key] = value - - -.. c:function:: int PyDict_ClearFreeList() - - Clear the free list. Return the total number of freed items. - - .. versionadded:: 3.3 diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 85a3d941ed8c11a05ba8c389e05b1cde2c96d200..247b6d68eceae958bfa9d06e115a6813a7db0739 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -374,6 +374,8 @@ Querying the error indicator own a reference to the return value, so you do not need to :c:func:`Py_DECREF` it. + The caller must hold the GIL. + .. note:: Do not compare the return value to a specific exception; use @@ -635,11 +637,21 @@ The following functions are used to create and modify Unicode exceptions from C. *object*, *length*, *start*, *end* and *reason*. *encoding* and *reason* are UTF-8 encoded strings. + .. deprecated:: 3.3 3.11 + + ``Py_UNICODE`` is deprecated since Python 3.3. Please migrate to + ``PyObject_CallFunction(PyExc_UnicodeEncodeError, "sOnns", ...)``. + .. c:function:: PyObject* PyUnicodeTranslateError_Create(const Py_UNICODE *object, Py_ssize_t length, Py_ssize_t start, Py_ssize_t end, const char *reason) Create a :class:`UnicodeTranslateError` object with the attributes *object*, *length*, *start*, *end* and *reason*. *reason* is a UTF-8 encoded string. + .. deprecated:: 3.3 3.11 + + ``Py_UNICODE`` is deprecated since Python 3.3. Please migrate to + ``PyObject_CallFunction(PyExc_UnicodeTranslateError, "Onns", ...)``. + .. c:function:: PyObject* PyUnicodeDecodeError_GetEncoding(PyObject *exc) PyObject* PyUnicodeEncodeError_GetEncoding(PyObject *exc) @@ -695,6 +707,8 @@ The following functions are used to create and modify Unicode exceptions from C. ``0`` on success, ``-1`` on failure. +.. _recursion: + Recursion Control ================= @@ -702,6 +716,8 @@ These two functions provide a way to perform safe recursive calls at the C level, both in the core and in extension modules. They are needed if the recursive code does not necessarily invoke Python code (which tracks its recursion depth automatically). +They are also not needed for *tp_call* implementations +because the :ref:`call protocol ` takes care of recursion handling. .. c:function:: int Py_EnterRecursiveCall(const char *where) @@ -715,15 +731,21 @@ recursion depth automatically). case, a :exc:`RecursionError` is set and a nonzero value is returned. Otherwise, zero is returned. - *where* should be a string such as ``" in instance check"`` to be - concatenated to the :exc:`RecursionError` message caused by the recursion + *where* should be a UTF-8 encoded string such as ``" in instance check"`` to + be concatenated to the :exc:`RecursionError` message caused by the recursion depth limit. -.. c:function:: void Py_LeaveRecursiveCall() + .. versionchanged:: 3.9 + This function is now also available in the limited API. + +.. c:function:: void Py_LeaveRecursiveCall(void) Ends a :c:func:`Py_EnterRecursiveCall`. Must be called once for each *successful* invocation of :c:func:`Py_EnterRecursiveCall`. + .. versionchanged:: 3.9 + This function is now also available in the limited API. + Properly implementing :c:member:`~PyTypeObject.tp_repr` for container types requires special recursion handling. In addition to protecting the stack, :c:member:`~PyTypeObject.tp_repr` also needs to track objects to prevent cycles. The @@ -761,7 +783,7 @@ Standard Exceptions All standard Python exceptions are available as global variables whose names are ``PyExc_`` followed by the Python exception name. These have the type -:c:type:`PyObject\*`; they are all class objects. For completeness, here are all +:c:type:`PyObject*`; they are all class objects. For completeness, here are all the variables: .. index:: @@ -981,7 +1003,7 @@ Standard Warning Categories All standard Python warning categories are available as global variables whose names are ``PyExc_`` followed by the Python exception name. These have the type -:c:type:`PyObject\*`; they are all class objects. For completeness, here are all +:c:type:`PyObject*`; they are all class objects. For completeness, here are all the variables: .. index:: diff --git a/Doc/c-api/file.rst b/Doc/c-api/file.rst index 5370c4e350a0b5812841f93d9c60a720d23f74b0..ed3735aa83608a8545f906a909a0ae7d0a57fdc6 100644 --- a/Doc/c-api/file.rst +++ b/Doc/c-api/file.rst @@ -8,7 +8,7 @@ File Objects .. index:: object: file These APIs are a minimal emulation of the Python 2 C API for built-in file -objects, which used to rely on the buffered I/O (:c:type:`FILE\*`) support +objects, which used to rely on the buffered I/O (:c:type:`FILE*`) support from the C standard library. In Python 3, files and streams use the new :mod:`io` module, which defines several layers over the low-level unbuffered I/O of the operating system. The functions described below are @@ -17,7 +17,7 @@ error reporting in the interpreter; third-party code is advised to access the :mod:`io` APIs instead. -.. c:function:: PyFile_FromFd(int fd, const char *name, const char *mode, int buffering, const char *encoding, const char *errors, const char *newline, int closefd) +.. c:function:: PyObject* PyFile_FromFd(int fd, const char *name, const char *mode, int buffering, const char *encoding, const char *errors, const char *newline, int closefd) Create a Python file object from the file descriptor of an already opened file *fd*. The arguments *name*, *encoding*, *errors* and *newline* @@ -82,6 +82,8 @@ the :mod:`io` APIs instead. This function is safe to call before :c:func:`Py_Initialize`. + .. audit-event:: setopencodehook "" c.PyFile_SetOpenCodeHook + .. versionadded:: 3.8 diff --git a/Doc/c-api/float.rst b/Doc/c-api/float.rst index bfc28a79ecfdc7a4fe092aeec04c6fc053da82f3..c107243a88dfc66bc444eaee44b8725db7a3949d 100644 --- a/Doc/c-api/float.rst +++ b/Doc/c-api/float.rst @@ -22,13 +22,13 @@ Floating Point Objects .. c:function:: int PyFloat_Check(PyObject *p) Return true if its argument is a :c:type:`PyFloatObject` or a subtype of - :c:type:`PyFloatObject`. + :c:type:`PyFloatObject`. This function always succeeds. .. c:function:: int PyFloat_CheckExact(PyObject *p) Return true if its argument is a :c:type:`PyFloatObject`, but not a subtype of - :c:type:`PyFloatObject`. + :c:type:`PyFloatObject`. This function always succeeds. .. c:function:: PyObject* PyFloat_FromString(PyObject *str) @@ -76,8 +76,3 @@ Floating Point Objects .. c:function:: double PyFloat_GetMin() Return the minimum normalized positive float *DBL_MIN* as C :c:type:`double`. - -.. c:function:: int PyFloat_ClearFreeList() - - Clear the float free list. Return the number of items that could not - be freed. diff --git a/Doc/c-api/function.rst b/Doc/c-api/function.rst index bb416f4bb63aa2b16bba3cd6a1b30bc5abc7566e..20968828e0bb36ef127fdd148fb6ba09639dfa20 100644 --- a/Doc/c-api/function.rst +++ b/Doc/c-api/function.rst @@ -26,7 +26,7 @@ There are a few functions specific to Python functions. .. c:function:: int PyFunction_Check(PyObject *o) Return true if *o* is a function object (has type :c:data:`PyFunction_Type`). - The parameter must not be ``NULL``. + The parameter must not be ``NULL``. This function always succeeds. .. c:function:: PyObject* PyFunction_New(PyObject *code, PyObject *globals) diff --git a/Doc/c-api/gcsupport.rst b/Doc/c-api/gcsupport.rst index 924a7fd2fda4d563bc3e1743b9de4739c8e3197c..eee114c19d59049c8fce8263271853e17b9a3d69 100644 --- a/Doc/c-api/gcsupport.rst +++ b/Doc/c-api/gcsupport.rst @@ -61,6 +61,33 @@ Constructors for container types must conform to two rules: end of the constructor. +.. c:function:: int PyObject_IS_GC(PyObject *obj) + + Returns non-zero if the object implements the garbage collector protocol, + otherwise returns 0. + + The object cannot be tracked by the garbage collector if this function returns 0. + + +.. c:function:: int PyObject_GC_IsTracked(PyObject *op) + + Returns 1 if the object type of *op* implements the GC protocol and *op* is being + currently tracked by the garbage collector and 0 otherwise. + + This is analogous to the Python function :func:`gc.is_tracked`. + + .. versionadded:: 3.9 + + +.. c:function:: int PyObject_GC_IsFinalized(PyObject *op) + + Returns 1 if the object type of *op* implements the GC protocol and *op* has been + already finalized by the garbage collector and 0 otherwise. + + This is analogous to the Python function :func:`gc.is_finalized`. + + .. versionadded:: 3.9 + Similarly, the deallocator for the object must conform to a similar pair of rules: diff --git a/Doc/c-api/gen.rst b/Doc/c-api/gen.rst index 74410927bfde107c8a8c1e4a5ee1f0a4a9302a0a..0eb5922f6da75f25803ced5b45f0f9cd3e01514a 100644 --- a/Doc/c-api/gen.rst +++ b/Doc/c-api/gen.rst @@ -22,12 +22,14 @@ than explicitly calling :c:func:`PyGen_New` or :c:func:`PyGen_NewWithQualName`. .. c:function:: int PyGen_Check(PyObject *ob) - Return true if *ob* is a generator object; *ob* must not be ``NULL``. + Return true if *ob* is a generator object; *ob* must not be ``NULL``. This + function always succeeds. .. c:function:: int PyGen_CheckExact(PyObject *ob) - Return true if *ob*'s type is :c:type:`PyGen_Type`; *ob* must not be ``NULL``. + Return true if *ob*'s type is :c:type:`PyGen_Type`; *ob* must not be + ``NULL``. This function always succeeds. .. c:function:: PyObject* PyGen_New(PyFrameObject *frame) diff --git a/Doc/c-api/import.rst b/Doc/c-api/import.rst index 78f935a2911bc6324e2358af3b49c7e81a229a87..c6fc33076f0f516e6b470bcce50be5f8bf3c35c0 100644 --- a/Doc/c-api/import.rst +++ b/Doc/c-api/import.rst @@ -223,21 +223,6 @@ Importing Modules Return a new reference to the finder object. -.. c:function:: void _PyImport_Init() - - Initialize the import mechanism. For internal use only. - - -.. c:function:: void PyImport_Cleanup() - - Empty the module table. For internal use only. - - -.. c:function:: void _PyImport_Fini() - - Finalize the import mechanism. For internal use only. - - .. c:function:: int PyImport_ImportFrozenModuleObject(PyObject *name) Load a frozen module named *name*. Return ``1`` for success, ``0`` if the diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 68d892dcae4046118d6028111f30a0be5dca0cd3..eb0bd14587145be1a5755fa7329fb0f3df0371d2 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -81,7 +81,7 @@ When a flag is set by an option, the value of the flag is the number of times that the option was set. For example, ``-b`` sets :c:data:`Py_BytesWarningFlag` to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. -.. c:var:: Py_BytesWarningFlag +.. c:var:: int Py_BytesWarningFlag Issue a warning when comparing :class:`bytes` or :class:`bytearray` with :class:`str` or :class:`bytes` with :class:`int`. Issue an error if greater @@ -89,7 +89,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. Set by the :option:`-b` option. -.. c:var:: Py_DebugFlag +.. c:var:: int Py_DebugFlag Turn on parser debugging output (for expert only, depending on compilation options). @@ -97,7 +97,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. Set by the :option:`-d` option and the :envvar:`PYTHONDEBUG` environment variable. -.. c:var:: Py_DontWriteBytecodeFlag +.. c:var:: int Py_DontWriteBytecodeFlag If set to non-zero, Python won't try to write ``.pyc`` files on the import of source modules. @@ -105,14 +105,14 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. Set by the :option:`-B` option and the :envvar:`PYTHONDONTWRITEBYTECODE` environment variable. -.. c:var:: Py_FrozenFlag +.. c:var:: int Py_FrozenFlag Suppress error messages when calculating the module search path in :c:func:`Py_GetPath`. Private flag used by ``_freeze_importlib`` and ``frozenmain`` programs. -.. c:var:: Py_HashRandomizationFlag +.. c:var:: int Py_HashRandomizationFlag Set to ``1`` if the :envvar:`PYTHONHASHSEED` environment variable is set to a non-empty string. @@ -120,14 +120,14 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. If the flag is non-zero, read the :envvar:`PYTHONHASHSEED` environment variable to initialize the secret hash seed. -.. c:var:: Py_IgnoreEnvironmentFlag +.. c:var:: int Py_IgnoreEnvironmentFlag Ignore all :envvar:`PYTHON*` environment variables, e.g. :envvar:`PYTHONPATH` and :envvar:`PYTHONHOME`, that might be set. Set by the :option:`-E` and :option:`-I` options. -.. c:var:: Py_InspectFlag +.. c:var:: int Py_InspectFlag When a script is passed as first argument or the :option:`-c` option is used, enter interactive mode after executing the script or the command, even when @@ -136,11 +136,11 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. Set by the :option:`-i` option and the :envvar:`PYTHONINSPECT` environment variable. -.. c:var:: Py_InteractiveFlag +.. c:var:: int Py_InteractiveFlag Set by the :option:`-i` option. -.. c:var:: Py_IsolatedFlag +.. c:var:: int Py_IsolatedFlag Run Python in isolated mode. In isolated mode :data:`sys.path` contains neither the script's directory nor the user's site-packages directory. @@ -149,7 +149,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. versionadded:: 3.4 -.. c:var:: Py_LegacyWindowsFSEncodingFlag +.. c:var:: int Py_LegacyWindowsFSEncodingFlag If the flag is non-zero, use the ``mbcs`` encoding instead of the UTF-8 encoding for the filesystem encoding. @@ -161,7 +161,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. availability:: Windows. -.. c:var:: Py_LegacyWindowsStdioFlag +.. c:var:: int Py_LegacyWindowsStdioFlag If the flag is non-zero, use :class:`io.FileIO` instead of :class:`WindowsConsoleIO` for :mod:`sys` standard streams. @@ -173,7 +173,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. availability:: Windows. -.. c:var:: Py_NoSiteFlag +.. c:var:: int Py_NoSiteFlag Disable the import of the module :mod:`site` and the site-dependent manipulations of :data:`sys.path` that it entails. Also disable these @@ -182,7 +182,7 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. Set by the :option:`-S` option. -.. c:var:: Py_NoUserSiteDirectory +.. c:var:: int Py_NoUserSiteDirectory Don't add the :data:`user site-packages directory ` to :data:`sys.path`. @@ -190,12 +190,12 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. Set by the :option:`-s` and :option:`-I` options, and the :envvar:`PYTHONNOUSERSITE` environment variable. -.. c:var:: Py_OptimizeFlag +.. c:var:: int Py_OptimizeFlag Set by the :option:`-O` option and the :envvar:`PYTHONOPTIMIZE` environment variable. -.. c:var:: Py_QuietFlag +.. c:var:: int Py_QuietFlag Don't display the copyright and version messages even in interactive mode. @@ -203,14 +203,14 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. versionadded:: 3.2 -.. c:var:: Py_UnbufferedStdioFlag +.. c:var:: int Py_UnbufferedStdioFlag Force the stdout and stderr streams to be unbuffered. Set by the :option:`-u` option and the :envvar:`PYTHONUNBUFFERED` environment variable. -.. c:var:: Py_VerboseFlag +.. c:var:: int Py_VerboseFlag Print a message each time a module is initialized, showing the place (filename or built-in module) from which it is loaded. If greater or equal @@ -830,7 +830,7 @@ code, or when embedding the Python interpreter: .. c:type:: PyThreadState This data structure represents the state of a single thread. The only public - data member is :c:type:`PyInterpreterState \*`:attr:`interp`, which points to + data member is :attr:`interp` (:c:type:`PyInterpreterState *`), which points to this thread's interpreter state. @@ -842,12 +842,12 @@ code, or when embedding the Python interpreter: single: PyEval_SaveThread() single: PyEval_RestoreThread() - Initialize and acquire the global interpreter lock. It should be called in the - main thread before creating a second thread or engaging in any other thread - operations such as ``PyEval_ReleaseThread(tstate)``. It is not needed before - calling :c:func:`PyEval_SaveThread` or :c:func:`PyEval_RestoreThread`. + Deprecated function which does nothing. - This is a no-op when called for a second time. + In Python 3.6 and older, this function created the GIL if it didn't exist. + + .. versionchanged:: 3.9 + The function now does nothing. .. versionchanged:: 3.7 This function is now called by :c:func:`Py_Initialize()`, so you don't @@ -856,6 +856,8 @@ code, or when embedding the Python interpreter: .. versionchanged:: 3.2 This function cannot be called before :c:func:`Py_Initialize()` anymore. + .. deprecated-removed:: 3.9 3.11 + .. index:: module: _thread @@ -868,6 +870,8 @@ code, or when embedding the Python interpreter: .. versionchanged:: 3.7 The :term:`GIL` is now initialized by :c:func:`Py_Initialize()`. + .. deprecated-removed:: 3.9 3.11 + .. c:function:: PyThreadState* PyEval_SaveThread() @@ -1048,6 +1052,10 @@ All of the following functions must be called after :c:func:`Py_Initialize`. Reset all information in a thread state object. The global interpreter lock must be held. + .. versionchanged:: 3.9 + This function now calls the :c:member:`PyThreadState.on_delete` callback. + Previously, that happened in :c:func:`PyThreadState_Delete`. + .. c:function:: void PyThreadState_Delete(PyThreadState *tstate) @@ -1056,11 +1064,65 @@ All of the following functions must be called after :c:func:`Py_Initialize`. :c:func:`PyThreadState_Clear`. -.. c:function:: PY_INT64_T PyInterpreterState_GetID(PyInterpreterState *interp) +.. c:function:: void PyThreadState_DeleteCurrent(void) + + Destroy the current thread state and release the global interpreter lock. + Like :c:func:`PyThreadState_Delete`, the global interpreter lock need not + be held. The thread state must have been reset with a previous call + to :c:func:`PyThreadState_Clear`. + + +.. c:function:: PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate) + + Get the current frame of the Python thread state *tstate*. + + Return a strong reference. Return ``NULL`` if no frame is currently + executing. + + See also :c:func:`PyEval_GetFrame`. + + *tstate* must not be ``NULL``. + + .. versionadded:: 3.9 + + +.. c:function:: uint64_t PyThreadState_GetID(PyThreadState *tstate) + + Get the unique thread state identifier of the Python thread state *tstate*. + + *tstate* must not be ``NULL``. + + .. versionadded:: 3.9 + + +.. c:function:: PyInterpreterState* PyThreadState_GetInterpreter(PyThreadState *tstate) + + Get the interpreter of the Python thread state *tstate*. + + *tstate* must not be ``NULL``. + + .. versionadded:: 3.9 + + +.. c:function:: PyInterpreterState* PyInterpreterState_Get(void) + + Get the current interpreter. + + Issue a fatal error if there no current Python thread state or no current + interpreter. It cannot return NULL. + + The caller must hold the GIL. + + .. versionadded:: 3.9 + + +.. c:function:: int64_t PyInterpreterState_GetID(PyInterpreterState *interp) Return the interpreter's unique ID. If there was any error in doing so then ``-1`` is returned and an error is set. + The caller must hold the GIL. + .. versionadded:: 3.7 @@ -1075,6 +1137,32 @@ All of the following functions must be called after :c:func:`Py_Initialize`. .. versionadded:: 3.8 +.. c:type:: PyObject* (*_PyFrameEvalFunction)(PyThreadState *tstate, PyFrameObject *frame, int throwflag) + + Type of a frame evaluation function. + + The *throwflag* parameter is used by the ``throw()`` method of generators: + if non-zero, handle the current exception. + + .. versionchanged:: 3.9 + The function now takes a *tstate* parameter. + +.. c:function:: _PyFrameEvalFunction _PyInterpreterState_GetEvalFrameFunc(PyInterpreterState *interp) + + Get the frame evaluation function. + + See the :pep:`523` "Adding a frame evaluation API to CPython". + + .. versionadded:: 3.9 + +.. c:function:: void _PyInterpreterState_SetEvalFrameFunc(PyInterpreterState *interp, _PyFrameEvalFunction eval_frame) + + Set the frame evaluation function. + + See the :pep:`523` "Adding a frame evaluation API to CPython". + + .. versionadded:: 3.9 + .. c:function:: PyObject* PyThreadState_GetDict() @@ -1102,7 +1190,7 @@ All of the following functions must be called after :c:func:`Py_Initialize`. .. c:function:: void PyEval_AcquireThread(PyThreadState *tstate) Acquire the global interpreter lock and set the current thread state to - *tstate*, which should not be ``NULL``. The lock must have been created earlier. + *tstate*, which must not be ``NULL``. The lock must have been created earlier. If this thread already has the lock, deadlock ensues. .. note:: @@ -1326,6 +1414,10 @@ pointer and a void pointer argument. This function doesn't need a current thread state to run, and it doesn't need the global interpreter lock. + To call this function in a subinterpreter, the caller must hold the GIL. + Otherwise, the function *func* can be scheduled to be called from the wrong + interpreter. + .. warning:: This is a low-level function, only useful for very special cases. There is no guarantee that *func* will be called as quick as @@ -1334,6 +1426,12 @@ pointer and a void pointer argument. function is generally **not** suitable for calling Python code from arbitrary C threads. Instead, use the :ref:`PyGILState API`. + .. versionchanged:: 3.9 + If this function is called in a subinterpreter, the function *func* is + now scheduled to be called from the subinterpreter, rather than being + called from the main interpreter. Each subinterpreter now has its own + list of scheduled calls. + .. versionadded:: 3.1 .. _profiling: @@ -1456,6 +1554,8 @@ Python-level trace functions in previous versions. profile function is called for all monitored events except :const:`PyTrace_LINE` :const:`PyTrace_OPCODE` and :const:`PyTrace_EXCEPTION`. + The caller must hold the :term:`GIL`. + .. c:function:: void PyEval_SetTrace(Py_tracefunc func, PyObject *obj) @@ -1466,6 +1566,9 @@ Python-level trace functions in previous versions. will not receive :const:`PyTrace_C_CALL`, :const:`PyTrace_C_EXCEPTION` or :const:`PyTrace_C_RETURN` as a value for the *what* parameter. + The caller must hold the :term:`GIL`. + + .. _advanced-debugging: Advanced Debugger Support @@ -1516,7 +1619,7 @@ The Python interpreter provides low-level support for thread-local storage (TLS) which wraps the underlying native TLS implementation to support the Python-level thread local storage API (:class:`threading.local`). The CPython C level APIs are similar to those offered by pthreads and Windows: -use a thread key and functions to associate a :c:type:`void\*` value per +use a thread key and functions to associate a :c:type:`void*` value per thread. The GIL does *not* need to be held when calling these functions; they supply @@ -1527,8 +1630,8 @@ you need to include :file:`pythread.h` to use thread-local storage. .. note:: None of these API functions handle memory management on behalf of the - :c:type:`void\*` values. You need to allocate and deallocate them yourself. - If the :c:type:`void\*` values happen to be :c:type:`PyObject\*`, these + :c:type:`void*` values. You need to allocate and deallocate them yourself. + If the :c:type:`void*` values happen to be :c:type:`PyObject*`, these functions don't do refcount operations on them either. .. _thread-specific-storage-api: @@ -1624,14 +1727,14 @@ undefined if the given :c:type:`Py_tss_t` has not been initialized by .. c:function:: int PyThread_tss_set(Py_tss_t *key, void *value) - Return a zero value to indicate successfully associating a :c:type:`void\*` + Return a zero value to indicate successfully associating a :c:type:`void*` value with a TSS key in the current thread. Each thread has a distinct - mapping of the key to a :c:type:`void\*` value. + mapping of the key to a :c:type:`void*` value. .. c:function:: void* PyThread_tss_get(Py_tss_t *key) - Return the :c:type:`void\*` value associated with a TSS key in the current + Return the :c:type:`void*` value associated with a TSS key in the current thread. This returns ``NULL`` if no value is associated with the key in the current thread. diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index ff4ccb8dbbb5fc5ed50d5884313288aa1d555fb8..f2b82a0c6a511846dd5ead968a7a13a47a53c744 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -43,6 +43,7 @@ Functions: * :c:func:`Py_PreInitializeFromArgs` * :c:func:`Py_PreInitializeFromBytesArgs` * :c:func:`Py_RunMain` +* :c:func:`Py_GetArgcArgv` The preconfiguration (``PyPreConfig`` type) is stored in ``_PyRuntime.preconfig`` and the configuration (``PyConfig`` type) is stored in @@ -436,6 +437,14 @@ PyConfig :data:`sys.base_prefix`. + .. c:member:: wchar_t* platlibdir + + :data:`sys.platlibdir`: platform library directory name, set at configure time + by ``--with-platlibdir``, overrideable by the ``PYTHONPLATLIBDIR`` + environment variable. + + .. versionadded:: 3.9 + .. c:member:: int buffered_stdio If equals to 0, enable unbuffered mode, making the stdout and stderr @@ -466,13 +475,13 @@ PyConfig .. c:member:: int dev_mode - Development mode: see :option:`-X dev <-X>`. + If non-zero, enable the :ref:`Python Development Mode `. .. c:member:: int dump_refs If non-zero, dump all objects which are still alive at exit. - Require a debug build of Python (``Py_REF_DEBUG`` macro must be defined). + ``Py_TRACE_REFS`` macro must be defined in build. .. c:member:: wchar_t* exec_prefix @@ -627,14 +636,6 @@ PyConfig ``python3 -m MODULE`` argument. Used by :c:func:`Py_RunMain`. - .. c:member:: int show_alloc_count - - Show allocation counts at exit? - - Set to 1 by :option:`-X showalloccount <-X>` command line option. - - Need a special Python build with ``COUNT_ALLOCS`` macro defined. - .. c:member:: int show_ref_count Show total reference count at exit? @@ -694,6 +695,16 @@ PyConfig :data:`sys._xoptions`. + .. c:member:: int _use_peg_parser + + Enable PEG parser? Default: 1. + + Set to 0 by :option:`-X oldparser <-X>` and :envvar:`PYTHONOLDPARSER`. + + See also :pep:`617`. + + .. deprecated-removed:: 3.9 3.10 + If ``parse_argv`` is non-zero, ``argv`` arguments are parsed the same way the regular Python parses command line arguments, and Python arguments are stripped from ``argv``: see :ref:`Command Line Arguments @@ -702,6 +713,10 @@ arguments are stripped from ``argv``: see :ref:`Command Line Arguments The ``xoptions`` options are parsed to set other options: see :option:`-X` option. +.. versionchanged:: 3.9 + + The ``show_alloc_count`` field has been removed. + Initialization with PyConfig ---------------------------- @@ -878,6 +893,7 @@ Path Configuration * Path configuration inputs: * :c:member:`PyConfig.home` + * :c:member:`PyConfig.platlibdir` * :c:member:`PyConfig.pathconfig_warnings` * :c:member:`PyConfig.program_name` * :c:member:`PyConfig.pythonpath_env` @@ -969,6 +985,14 @@ customized Python always running in isolated mode using :c:func:`Py_RunMain`. +Py_GetArgcArgv() +---------------- + +.. c:function:: void Py_GetArgcArgv(int *argc, wchar_t ***argv) + + Get the original command line arguments, before Python modified them. + + Multi-Phase Initialization Private Provisional API -------------------------------------------------- @@ -998,6 +1022,8 @@ Private provisional API: * :c:member:`PyConfig._init_main`: if set to 0, :c:func:`Py_InitializeFromConfig` stops at the "Core" initialization phase. +* :c:member:`PyConfig._isolated_interpreter`: if non-zero, + disallow threads, subprocesses and fork. .. c:function:: PyStatus _Py_InitializeMain(void) diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index 718f40eb6c2474e1246582c2abb89a9a212fb880..7ca8693afab79c174108944fed5da226930da8dc 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -107,11 +107,24 @@ complete listing. .. c:macro:: Py_UNREACHABLE() - Use this when you have a code path that you do not expect to be reached. + Use this when you have a code path that cannot be reached by design. For example, in the ``default:`` clause in a ``switch`` statement for which all possible values are covered in ``case`` statements. Use this in places where you might be tempted to put an ``assert(0)`` or ``abort()`` call. + In release mode, the macro helps the compiler to optimize the code, and + avoids a warning about unreachable code. For example, the macro is + implemented with ``__builtin_unreachable()`` on GCC in release mode. + + A use for ``Py_UNREACHABLE()`` is following a call a function that + never returns but that is not declared :c:macro:`_Py_NO_RETURN`. + + If a code path is very unlikely code but can be reached under exceptional + case, this macro must not be used. For example, under low memory condition + or if a system call returns a value out of the expected range. In this + case, it's better to report the error to the caller. If the error cannot + be reported to caller, :c:func:`Py_FatalError` can be used. + .. versionadded:: 3.7 .. c:macro:: Py_ABS(x) @@ -216,13 +229,13 @@ Objects, Types and Reference Counts .. index:: object: type Most Python/C API functions have one or more arguments as well as a return value -of type :c:type:`PyObject\*`. This type is a pointer to an opaque data type +of type :c:type:`PyObject*`. This type is a pointer to an opaque data type representing an arbitrary Python object. Since all Python object types are treated the same way by the Python language in most situations (e.g., assignments, scope rules, and argument passing), it is only fitting that they should be represented by a single C type. Almost all Python objects live on the heap: you never declare an automatic or static variable of type -:c:type:`PyObject`, only pointer variables of type :c:type:`PyObject\*` can be +:c:type:`PyObject`, only pointer variables of type :c:type:`PyObject*` can be declared. The sole exception are the type objects; since these must never be deallocated, they are typically static :c:type:`PyTypeObject` objects. @@ -483,7 +496,7 @@ Types There are few other data types that play a significant role in the Python/C API; most are simple C types such as :c:type:`int`, :c:type:`long`, -:c:type:`double` and :c:type:`char\*`. A few structure types are used to +:c:type:`double` and :c:type:`char*`. A few structure types are used to describe static tables used to list the functions exported by a module or the data attributes of a new object type, and another is used to describe the value of a complex number. These will be discussed together with the functions that diff --git a/Doc/c-api/iter.rst b/Doc/c-api/iter.rst index a2992b3452f91c3c1fb9d3fc9a5ebd4a75e3be3d..189f80b9b8193255dbfec462298ea1d71ed2b4c5 100644 --- a/Doc/c-api/iter.rst +++ b/Doc/c-api/iter.rst @@ -9,7 +9,8 @@ There are two functions specifically for working with iterators. .. c:function:: int PyIter_Check(PyObject *o) - Return true if the object *o* supports the iterator protocol. + Return true if the object *o* supports the iterator protocol. This + function always succeeds. .. c:function:: PyObject* PyIter_Next(PyObject *o) diff --git a/Doc/c-api/iterator.rst b/Doc/c-api/iterator.rst index 4d91e4a224fe82c119a450fedba4c36d70d6eb7b..3fcf099134d4dd418ca6da2692433d6103baef5d 100644 --- a/Doc/c-api/iterator.rst +++ b/Doc/c-api/iterator.rst @@ -21,7 +21,8 @@ sentinel value is returned. .. c:function:: int PySeqIter_Check(op) - Return true if the type of *op* is :c:data:`PySeqIter_Type`. + Return true if the type of *op* is :c:data:`PySeqIter_Type`. This function + always succeeds. .. c:function:: PyObject* PySeqIter_New(PyObject *seq) @@ -39,7 +40,8 @@ sentinel value is returned. .. c:function:: int PyCallIter_Check(op) - Return true if the type of *op* is :c:data:`PyCallIter_Type`. + Return true if the type of *op* is :c:data:`PyCallIter_Type`. This + function always succeeds. .. c:function:: PyObject* PyCallIter_New(PyObject *callable, PyObject *sentinel) diff --git a/Doc/c-api/list.rst b/Doc/c-api/list.rst index b247cdfba0187e73bf8218d91a79f53225d72cde..f338e2ae0668956d68fd2fb95cb92a67bb65faff 100644 --- a/Doc/c-api/list.rst +++ b/Doc/c-api/list.rst @@ -22,13 +22,13 @@ List Objects .. c:function:: int PyList_Check(PyObject *p) Return true if *p* is a list object or an instance of a subtype of the list - type. + type. This function always succeeds. .. c:function:: int PyList_CheckExact(PyObject *p) Return true if *p* is a list object, but not an instance of a subtype of - the list type. + the list type. This function always succeeds. .. c:function:: PyObject* PyList_New(Py_ssize_t len) @@ -142,10 +142,3 @@ List Objects Return a new tuple object containing the contents of *list*; equivalent to ``tuple(list)``. - - -.. c:function:: int PyList_ClearFreeList() - - Clear the free list. Return the total number of freed items. - - .. versionadded:: 3.3 diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst index 3bada415aa37eff10d3061556c730e876f0b2f3b..60e1791df9a4510cd3d41639fc5ab7b40678f4df 100644 --- a/Doc/c-api/long.rst +++ b/Doc/c-api/long.rst @@ -27,13 +27,13 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. .. c:function:: int PyLong_Check(PyObject *p) Return true if its argument is a :c:type:`PyLongObject` or a subtype of - :c:type:`PyLongObject`. + :c:type:`PyLongObject`. This function always succeeds. .. c:function:: int PyLong_CheckExact(PyObject *p) Return true if its argument is a :c:type:`PyLongObject`, but not a subtype of - :c:type:`PyLongObject`. + :c:type:`PyLongObject`. This function always succeeds. .. c:function:: PyObject* PyLong_FromLong(long v) @@ -42,9 +42,7 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. The current implementation keeps an array of integer objects for all integers between ``-5`` and ``256``, when you create an int in that range you actually - just get back a reference to the existing object. So it should be possible to - change the value of ``1``. I suspect the behaviour of Python in this case is - undefined. :-) + just get back a reference to the existing object. .. c:function:: PyObject* PyLong_FromUnsignedLong(unsigned long v) @@ -193,8 +191,8 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. :meth:`__int__` method (if present) to convert it to a :c:type:`PyLongObject`. - If the value of *obj* is greater than :const:`PY_LLONG_MAX` or less than - :const:`PY_LLONG_MIN`, set *\*overflow* to ``1`` or ``-1``, respectively, + If the value of *obj* is greater than :const:`LLONG_MAX` or less than + :const:`LLONG_MIN`, set *\*overflow* to ``1`` or ``-1``, respectively, and return ``-1``; otherwise, set *\*overflow* to ``0``. If any other exception occurs set *\*overflow* to ``0`` and return ``-1`` as usual. @@ -302,7 +300,7 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. it to a :c:type:`PyLongObject`. If the value of *obj* is out of range for an :c:type:`unsigned long long`, - return the reduction of that value modulo ``PY_ULLONG_MAX + 1``. + return the reduction of that value modulo ``ULLONG_MAX + 1``. Returns ``(unsigned long long)-1`` on error. Use :c:func:`PyErr_Occurred` to disambiguate. diff --git a/Doc/c-api/marshal.rst b/Doc/c-api/marshal.rst index 7b179e22e290e1ce727b9fe8e66aba55b1700879..7bb0dad2b6b6d50edca1c8429483044f7bee66ec 100644 --- a/Doc/c-api/marshal.rst +++ b/Doc/c-api/marshal.rst @@ -43,7 +43,7 @@ The following functions allow marshalled values to be read back in. .. c:function:: long PyMarshal_ReadLongFromFile(FILE *file) - Return a C :c:type:`long` from the data stream in a :c:type:`FILE\*` opened + Return a C :c:type:`long` from the data stream in a :c:type:`FILE*` opened for reading. Only a 32-bit value can be read in using this function, regardless of the native size of :c:type:`long`. @@ -53,7 +53,7 @@ The following functions allow marshalled values to be read back in. .. c:function:: int PyMarshal_ReadShortFromFile(FILE *file) - Return a C :c:type:`short` from the data stream in a :c:type:`FILE\*` opened + Return a C :c:type:`short` from the data stream in a :c:type:`FILE*` opened for reading. Only a 16-bit value can be read in using this function, regardless of the native size of :c:type:`short`. @@ -63,7 +63,7 @@ The following functions allow marshalled values to be read back in. .. c:function:: PyObject* PyMarshal_ReadObjectFromFile(FILE *file) - Return a Python object from the data stream in a :c:type:`FILE\*` opened for + Return a Python object from the data stream in a :c:type:`FILE*` opened for reading. On error, sets the appropriate exception (:exc:`EOFError`, :exc:`ValueError` @@ -72,7 +72,7 @@ The following functions allow marshalled values to be read back in. .. c:function:: PyObject* PyMarshal_ReadLastObjectFromFile(FILE *file) - Return a Python object from the data stream in a :c:type:`FILE\*` opened for + Return a Python object from the data stream in a :c:type:`FILE*` opened for reading. Unlike :c:func:`PyMarshal_ReadObjectFromFile`, this function assumes that no further objects will be read from the file, allowing it to aggressively load file data into memory so that the de-serialization can diff --git a/Doc/c-api/memory.rst b/Doc/c-api/memory.rst index 8a8542f0479ec595d08358f16c069ebbd7f80153..87425bcf1e71f2711c479f0a90e0f3d6a142c7e7 100644 --- a/Doc/c-api/memory.rst +++ b/Doc/c-api/memory.rst @@ -109,7 +109,7 @@ zero bytes. .. c:function:: void* PyMem_RawMalloc(size_t n) - Allocates *n* bytes and returns a pointer of type :c:type:`void\*` to the + Allocates *n* bytes and returns a pointer of type :c:type:`void*` to the allocated memory, or ``NULL`` if the request fails. Requesting zero bytes returns a distinct non-``NULL`` pointer if possible, as @@ -120,7 +120,7 @@ zero bytes. .. c:function:: void* PyMem_RawCalloc(size_t nelem, size_t elsize) Allocates *nelem* elements each whose size in bytes is *elsize* and returns - a pointer of type :c:type:`void\*` to the allocated memory, or ``NULL`` if the + a pointer of type :c:type:`void*` to the allocated memory, or ``NULL`` if the request fails. The memory is initialized to zeros. Requesting zero elements or elements of size zero bytes returns a distinct @@ -180,7 +180,7 @@ The :ref:`default memory allocator ` uses the .. c:function:: void* PyMem_Malloc(size_t n) - Allocates *n* bytes and returns a pointer of type :c:type:`void\*` to the + Allocates *n* bytes and returns a pointer of type :c:type:`void*` to the allocated memory, or ``NULL`` if the request fails. Requesting zero bytes returns a distinct non-``NULL`` pointer if possible, as @@ -191,7 +191,7 @@ The :ref:`default memory allocator ` uses the .. c:function:: void* PyMem_Calloc(size_t nelem, size_t elsize) Allocates *nelem* elements each whose size in bytes is *elsize* and returns - a pointer of type :c:type:`void\*` to the allocated memory, or ``NULL`` if the + a pointer of type :c:type:`void*` to the allocated memory, or ``NULL`` if the request fails. The memory is initialized to zeros. Requesting zero elements or elements of size zero bytes returns a distinct @@ -233,14 +233,14 @@ The following type-oriented macros are provided for convenience. Note that .. c:function:: TYPE* PyMem_New(TYPE, size_t n) Same as :c:func:`PyMem_Malloc`, but allocates ``(n * sizeof(TYPE))`` bytes of - memory. Returns a pointer cast to :c:type:`TYPE\*`. The memory will not have + memory. Returns a pointer cast to :c:type:`TYPE*`. The memory will not have been initialized in any way. .. c:function:: TYPE* PyMem_Resize(void *p, TYPE, size_t n) Same as :c:func:`PyMem_Realloc`, but the memory block is resized to ``(n * - sizeof(TYPE))`` bytes. Returns a pointer cast to :c:type:`TYPE\*`. On return, + sizeof(TYPE))`` bytes. Returns a pointer cast to :c:type:`TYPE*`. On return, *p* will be a pointer to the new memory area, or ``NULL`` in the event of failure. @@ -282,7 +282,7 @@ The :ref:`default object allocator ` uses the .. c:function:: void* PyObject_Malloc(size_t n) - Allocates *n* bytes and returns a pointer of type :c:type:`void\*` to the + Allocates *n* bytes and returns a pointer of type :c:type:`void*` to the allocated memory, or ``NULL`` if the request fails. Requesting zero bytes returns a distinct non-``NULL`` pointer if possible, as @@ -293,7 +293,7 @@ The :ref:`default object allocator ` uses the .. c:function:: void* PyObject_Calloc(size_t nelem, size_t elsize) Allocates *nelem* elements each whose size in bytes is *elsize* and returns - a pointer of type :c:type:`void\*` to the allocated memory, or ``NULL`` if the + a pointer of type :c:type:`void*` to the allocated memory, or ``NULL`` if the request fails. The memory is initialized to zeros. Requesting zero elements or elements of size zero bytes returns a distinct @@ -388,7 +388,7 @@ Customize Memory Allocators Enum used to identify an allocator domain. Domains: - .. c:var:: PYMEM_DOMAIN_RAW + .. c:macro:: PYMEM_DOMAIN_RAW Functions: @@ -397,7 +397,7 @@ Customize Memory Allocators * :c:func:`PyMem_RawCalloc` * :c:func:`PyMem_RawFree` - .. c:var:: PYMEM_DOMAIN_MEM + .. c:macro:: PYMEM_DOMAIN_MEM Functions: @@ -406,7 +406,7 @@ Customize Memory Allocators * :c:func:`PyMem_Calloc` * :c:func:`PyMem_Free` - .. c:var:: PYMEM_DOMAIN_OBJ + .. c:macro:: PYMEM_DOMAIN_OBJ Functions: @@ -519,11 +519,11 @@ Customize pymalloc Arena Allocator | ``void free(void *ctx, size_t size, void *ptr)`` | free an arena | +--------------------------------------------------+---------------------------------------+ -.. c:function:: PyObject_GetArenaAllocator(PyObjectArenaAllocator *allocator) +.. c:function:: void PyObject_GetArenaAllocator(PyObjectArenaAllocator *allocator) Get the arena allocator. -.. c:function:: PyObject_SetArenaAllocator(PyObjectArenaAllocator *allocator) +.. c:function:: void PyObject_SetArenaAllocator(PyObjectArenaAllocator *allocator) Set the arena allocator. diff --git a/Doc/c-api/memoryview.rst b/Doc/c-api/memoryview.rst index de429e5c11dc76252061da135e97ef3122f44e72..24f8c935302e8ebaf0bd47dc59df2ca2cde77b8a 100644 --- a/Doc/c-api/memoryview.rst +++ b/Doc/c-api/memoryview.rst @@ -45,7 +45,8 @@ any other object. .. c:function:: int PyMemoryView_Check(PyObject *obj) Return true if the object *obj* is a memoryview object. It is not - currently allowed to create subclasses of :class:`memoryview`. + currently allowed to create subclasses of :class:`memoryview`. This + function always succeeds. .. c:function:: Py_buffer *PyMemoryView_GET_BUFFER(PyObject *mview) diff --git a/Doc/c-api/method.rst b/Doc/c-api/method.rst index b1862d796c9f4125fb49c0d0d1321b4ab9f3f32a..23852251dfe020bdb3da5c2f41eb2abb978a7144 100644 --- a/Doc/c-api/method.rst +++ b/Doc/c-api/method.rst @@ -22,6 +22,7 @@ to bind a :c:data:`PyCFunction` to a class object. It replaces the former call Return true if *o* is an instance method object (has type :c:data:`PyInstanceMethod_Type`). The parameter must not be ``NULL``. + This function always succeeds. .. c:function:: PyObject* PyInstanceMethod_New(PyObject *func) @@ -64,7 +65,7 @@ no longer available. .. c:function:: int PyMethod_Check(PyObject *o) Return true if *o* is a method object (has type :c:data:`PyMethod_Type`). The - parameter must not be ``NULL``. + parameter must not be ``NULL``. This function always succeeds. .. c:function:: PyObject* PyMethod_New(PyObject *func, PyObject *self) @@ -92,9 +93,3 @@ no longer available. .. c:function:: PyObject* PyMethod_GET_SELF(PyObject *meth) Macro version of :c:func:`PyMethod_Self` which avoids error checking. - - -.. c:function:: int PyMethod_ClearFreeList() - - Clear the free list. Return the total number of freed items. - diff --git a/Doc/c-api/module.rst b/Doc/c-api/module.rst index d2b8f4c12503e76fad6797093624306f1dfa2181..90766dca78bfa759143593a6aa5b4d867776c8c5 100644 --- a/Doc/c-api/module.rst +++ b/Doc/c-api/module.rst @@ -19,12 +19,13 @@ Module Objects .. c:function:: int PyModule_Check(PyObject *p) Return true if *p* is a module object, or a subtype of a module object. + This function always succeeds. .. c:function:: int PyModule_CheckExact(PyObject *p) Return true if *p* is a module object, but not a subtype of - :c:data:`PyModule_Type`. + :c:data:`PyModule_Type`. This function always succeeds. .. c:function:: PyObject* PyModule_NewObject(PyObject *name) @@ -196,23 +197,47 @@ or request "multi-phase initialization" by returning the definition struct itsel .. c:member:: traverseproc m_traverse A traversal function to call during GC traversal of the module object, or - ``NULL`` if not needed. This function may be called before module state - is allocated (:c:func:`PyModule_GetState()` may return `NULL`), - and before the :c:member:`Py_mod_exec` function is executed. + ``NULL`` if not needed. + + This function is not called if the module state was requested but is not + allocated yet. This is the case immediately after the module is created + and before the module is executed (:c:data:`Py_mod_exec` function). More + precisely, this function is not called if :c:member:`m_size` is greater + than 0 and the module state (as returned by :c:func:`PyModule_GetState`) + is ``NULL``. + + .. versionchanged:: 3.9 + No longer called before the module state is allocated. .. c:member:: inquiry m_clear A clear function to call during GC clearing of the module object, or - ``NULL`` if not needed. This function may be called before module state - is allocated (:c:func:`PyModule_GetState()` may return `NULL`), - and before the :c:member:`Py_mod_exec` function is executed. + ``NULL`` if not needed. + + This function is not called if the module state was requested but is not + allocated yet. This is the case immediately after the module is created + and before the module is executed (:c:data:`Py_mod_exec` function). More + precisely, this function is not called if :c:member:`m_size` is greater + than 0 and the module state (as returned by :c:func:`PyModule_GetState`) + is ``NULL``. + + .. versionchanged:: 3.9 + No longer called before the module state is allocated. .. c:member:: freefunc m_free - A function to call during deallocation of the module object, or ``NULL`` if - not needed. This function may be called before module state - is allocated (:c:func:`PyModule_GetState()` may return `NULL`), - and before the :c:member:`Py_mod_exec` function is executed. + A function to call during deallocation of the module object, or ``NULL`` + if not needed. + + This function is not called if the module state was requested but is not + allocated yet. This is the case immediately after the module is created + and before the module is executed (:c:data:`Py_mod_exec` function). More + precisely, this function is not called if :c:member:`m_size` is greater + than 0 and the module state (as returned by :c:func:`PyModule_GetState`) + is ``NULL``. + + .. versionchanged:: 3.9 + No longer called before the module state is allocated. Single-phase initialization ........................... @@ -301,7 +326,7 @@ The *m_slots* array must be terminated by a slot with id 0. The available slot types are: -.. c:var:: Py_mod_create +.. c:macro:: Py_mod_create Specifies a function that is called to create the module object itself. The *value* pointer of this slot must point to a function of the signature: @@ -333,7 +358,7 @@ The available slot types are: ``PyModuleDef`` has non-``NULL`` ``m_traverse``, ``m_clear``, ``m_free``; non-zero ``m_size``; or slots other than ``Py_mod_create``. -.. c:var:: Py_mod_exec +.. c:macro:: Py_mod_exec Specifies a function that is called to *execute* the module. This is equivalent to executing the code of a Python module: typically, @@ -417,7 +442,7 @@ state: Add an object to *module* as *name*. This is a convenience function which can be used from the module's initialization function. This steals a reference to - *value* on success. Return ``-1`` on error, ``0`` on success. + *value* on success. Return ``-1`` on error, ``0`` on success. .. note:: @@ -460,6 +485,16 @@ state: Add a string constant to *module*. +.. c:function:: int PyModule_AddType(PyObject *module, PyTypeObject *type) + + Add a type object to *module*. + The type object is finalized by calling internally :c:func:`PyType_Ready`. + The name of the type object is taken from the last component of + :c:member:`~PyTypeObject.tp_name` after dot. + Return ``-1`` on error, ``0`` on success. + + .. versionadded:: 3.9 + Module lookup ^^^^^^^^^^^^^ @@ -493,6 +528,8 @@ since multiple such modules can be created from a single definition. mechanisms (either by calling it directly, or by referring to its implementation for details of the required state updates). + The caller must hold the GIL. + Return 0 on success or -1 on failure. .. versionadded:: 3.3 @@ -502,4 +539,6 @@ since multiple such modules can be created from a single definition. Removes the module object created from *def* from the interpreter state. Return 0 on success or -1 on failure. + The caller must hold the GIL. + .. versionadded:: 3.3 diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index 3bdc0f56eb251548663bc88518b0e2cad8f5f31d..a387b4a2df1342978db3c88bf113bd2d2d73081c 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -196,6 +196,7 @@ Object Protocol This function now includes a debug assertion to help ensure that it does not silently discard an active exception. + .. c:function:: PyObject* PyObject_Bytes(PyObject *o) .. index:: builtin: bytes @@ -247,179 +248,6 @@ Object Protocol of base classes). -.. c:function:: int PyCallable_Check(PyObject *o) - - Determine if the object *o* is callable. Return ``1`` if the object is callable - and ``0`` otherwise. This function always succeeds. - - -.. c:function:: PyObject* PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs) - - Call a callable Python object *callable*, with arguments given by the - tuple *args*, and named arguments given by the dictionary *kwargs*. - - *args* must not be ``NULL``, use an empty tuple if no arguments are needed. - If no named arguments are needed, *kwargs* can be ``NULL``. - - Return the result of the call on success, or raise an exception and return - ``NULL`` on failure. - - This is the equivalent of the Python expression: - ``callable(*args, **kwargs)``. - - -.. c:function:: PyObject* PyObject_CallObject(PyObject *callable, PyObject *args) - - Call a callable Python object *callable*, with arguments given by the - tuple *args*. If no arguments are needed, then *args* can be ``NULL``. - - Return the result of the call on success, or raise an exception and return - ``NULL`` on failure. - - This is the equivalent of the Python expression: ``callable(*args)``. - - -.. c:function:: PyObject* PyObject_CallFunction(PyObject *callable, const char *format, ...) - - Call a callable Python object *callable*, with a variable number of C arguments. - The C arguments are described using a :c:func:`Py_BuildValue` style format - string. The format can be ``NULL``, indicating that no arguments are provided. - - Return the result of the call on success, or raise an exception and return - ``NULL`` on failure. - - This is the equivalent of the Python expression: ``callable(*args)``. - - Note that if you only pass :c:type:`PyObject \*` args, - :c:func:`PyObject_CallFunctionObjArgs` is a faster alternative. - - .. versionchanged:: 3.4 - The type of *format* was changed from ``char *``. - - -.. c:function:: PyObject* PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...) - - Call the method named *name* of object *obj* with a variable number of C - arguments. The C arguments are described by a :c:func:`Py_BuildValue` format - string that should produce a tuple. - - The format can be ``NULL``, indicating that no arguments are provided. - - Return the result of the call on success, or raise an exception and return - ``NULL`` on failure. - - This is the equivalent of the Python expression: - ``obj.name(arg1, arg2, ...)``. - - Note that if you only pass :c:type:`PyObject \*` args, - :c:func:`PyObject_CallMethodObjArgs` is a faster alternative. - - .. versionchanged:: 3.4 - The types of *name* and *format* were changed from ``char *``. - - -.. c:function:: PyObject* PyObject_CallFunctionObjArgs(PyObject *callable, ..., NULL) - - Call a callable Python object *callable*, with a variable number of - :c:type:`PyObject\*` arguments. The arguments are provided as a variable number - of parameters followed by ``NULL``. - - Return the result of the call on success, or raise an exception and return - ``NULL`` on failure. - - This is the equivalent of the Python expression: - ``callable(arg1, arg2, ...)``. - - -.. c:function:: PyObject* PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ..., NULL) - - Calls a method of the Python object *obj*, where the name of the method is given as a - Python string object in *name*. It is called with a variable number of - :c:type:`PyObject\*` arguments. The arguments are provided as a variable number - of parameters followed by ``NULL``. - - Return the result of the call on success, or raise an exception and return - ``NULL`` on failure. - - -.. c:function:: PyObject* _PyObject_Vectorcall(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) - - Call a callable Python object *callable*, using - :c:data:`vectorcall ` if possible. - - *args* is a C array with the positional arguments. - - *nargsf* is the number of positional arguments plus optionally the flag - :const:`PY_VECTORCALL_ARGUMENTS_OFFSET` (see below). - To get actual number of arguments, use - :c:func:`PyVectorcall_NARGS(nargsf) `. - - *kwnames* can be either ``NULL`` (no keyword arguments) or a tuple of keyword - names. In the latter case, the values of the keyword arguments are stored - in *args* after the positional arguments. - The number of keyword arguments does not influence *nargsf*. - - *kwnames* must contain only objects of type ``str`` (not a subclass), - and all keys must be unique. - - Return the result of the call on success, or raise an exception and return - ``NULL`` on failure. - - This uses the vectorcall protocol if the callable supports it; - otherwise, the arguments are converted to use - :c:member:`~PyTypeObject.tp_call`. - - .. note:: - - This function is provisional and expected to become public in Python 3.9, - with a different name and, possibly, changed semantics. - If you use the function, plan for updating your code for Python 3.9. - - .. versionadded:: 3.8 - -.. c:var:: PY_VECTORCALL_ARGUMENTS_OFFSET - - If set in a vectorcall *nargsf* argument, the callee is allowed to - temporarily change ``args[-1]``. In other words, *args* points to - argument 1 (not 0) in the allocated vector. - The callee must restore the value of ``args[-1]`` before returning. - - Whenever they can do so cheaply (without additional allocation), callers - are encouraged to use :const:`PY_VECTORCALL_ARGUMENTS_OFFSET`. - Doing so will allow callables such as bound methods to make their onward - calls (which include a prepended *self* argument) cheaply. - - .. versionadded:: 3.8 - -.. c:function:: Py_ssize_t PyVectorcall_NARGS(size_t nargsf) - - Given a vectorcall *nargsf* argument, return the actual number of - arguments. - Currently equivalent to ``nargsf & ~PY_VECTORCALL_ARGUMENTS_OFFSET``. - - .. versionadded:: 3.8 - -.. c:function:: PyObject* _PyObject_FastCallDict(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwdict) - - Same as :c:func:`_PyObject_Vectorcall` except that the keyword arguments - are passed as a dictionary in *kwdict*. This may be ``NULL`` if there - are no keyword arguments. - - For callables supporting :c:data:`vectorcall `, - the arguments are internally converted to the vectorcall convention. - Therefore, this function adds some overhead compared to - :c:func:`_PyObject_Vectorcall`. - It should only be used if the caller already has a dictionary ready to use. - - .. note:: - - This function is provisional and expected to become public in Python 3.9, - with a different name and, possibly, changed semantics. - If you use the function, plan for updating your code for Python 3.9. - - .. versionadded:: 3.8 - - .. c:function:: Py_hash_t PyObject_Hash(PyObject *o) .. index:: builtin: hash @@ -463,7 +291,7 @@ Object Protocol is equivalent to the Python expression ``type(o)``. This function increments the reference count of the return value. There's really no reason to use this function instead of the common expression ``o->ob_type``, which returns a - pointer of type :c:type:`PyTypeObject\*`, except when the incremented reference + pointer of type :c:type:`PyTypeObject*`, except when the incremented reference count is needed. diff --git a/Doc/c-api/reflection.rst b/Doc/c-api/reflection.rst index 1d86de66ed3edaed82c68c6116d796707303d253..9207d86012c8b338175ba72b849510b7d8edb8c4 100644 --- a/Doc/c-api/reflection.rst +++ b/Doc/c-api/reflection.rst @@ -5,34 +5,60 @@ Reflection ========== -.. c:function:: PyObject* PyEval_GetBuiltins() +.. c:function:: PyObject* PyEval_GetBuiltins(void) Return a dictionary of the builtins in the current execution frame, or the interpreter of the thread state if no frame is currently executing. -.. c:function:: PyObject* PyEval_GetLocals() +.. c:function:: PyObject* PyEval_GetLocals(void) Return a dictionary of the local variables in the current execution frame, or ``NULL`` if no frame is currently executing. -.. c:function:: PyObject* PyEval_GetGlobals() +.. c:function:: PyObject* PyEval_GetGlobals(void) Return a dictionary of the global variables in the current execution frame, or ``NULL`` if no frame is currently executing. -.. c:function:: PyFrameObject* PyEval_GetFrame() +.. c:function:: PyFrameObject* PyEval_GetFrame(void) Return the current thread state's frame, which is ``NULL`` if no frame is currently executing. + See also :c:func:`PyThreadState_GetFrame`. + + +.. c:function:: int PyFrame_GetBack(PyFrameObject *frame) + + Get the *frame* next outer frame. + + Return a strong reference, or ``NULL`` if *frame* has no outer frame. + + *frame* must not be ``NULL``. + + .. versionadded:: 3.9 + + +.. c:function:: int PyFrame_GetCode(PyFrameObject *frame) + + Get the *frame* code. + + Return a strong reference. + + *frame* must not be ``NULL``. The result (frame code) cannot be ``NULL``. + + .. versionadded:: 3.9 + .. c:function:: int PyFrame_GetLineNumber(PyFrameObject *frame) Return the line number that *frame* is currently executing. + *frame* must not be ``NULL``. + .. c:function:: const char* PyEval_GetFuncName(PyObject *func) diff --git a/Doc/c-api/set.rst b/Doc/c-api/set.rst index 54819e8fd6cbdc6ffb2410c8697e6106bb97040a..84f34e7dae80be42757f4f369a4dda8148fc9dd3 100644 --- a/Doc/c-api/set.rst +++ b/Doc/c-api/set.rst @@ -53,28 +53,29 @@ the constructor functions work with any iterable Python object. .. c:function:: int PySet_Check(PyObject *p) Return true if *p* is a :class:`set` object or an instance of a subtype. + This function always succeeds. .. c:function:: int PyFrozenSet_Check(PyObject *p) Return true if *p* is a :class:`frozenset` object or an instance of a - subtype. + subtype. This function always succeeds. .. c:function:: int PyAnySet_Check(PyObject *p) Return true if *p* is a :class:`set` object, a :class:`frozenset` object, or an - instance of a subtype. + instance of a subtype. This function always succeeds. .. c:function:: int PyAnySet_CheckExact(PyObject *p) Return true if *p* is a :class:`set` object or a :class:`frozenset` object but - not an instance of a subtype. + not an instance of a subtype. This function always succeeds. .. c:function:: int PyFrozenSet_CheckExact(PyObject *p) Return true if *p* is a :class:`frozenset` object but not an instance of a - subtype. + subtype. This function always succeeds. .. c:function:: PyObject* PySet_New(PyObject *iterable) @@ -157,10 +158,3 @@ subtypes but not for instances of :class:`frozenset` or its subtypes. .. c:function:: int PySet_Clear(PyObject *set) Empty an existing set of all elements. - - -.. c:function:: int PySet_ClearFreeList() - - Clear the free list. Return the total number of freed items. - - .. versionadded:: 3.3 diff --git a/Doc/c-api/slice.rst b/Doc/c-api/slice.rst index 48a58c6c6f7e3652fe38ded7a9d4cac18e36cff1..8271d9acfb645e182beda6727c6dd3c039b0d9bc 100644 --- a/Doc/c-api/slice.rst +++ b/Doc/c-api/slice.rst @@ -14,7 +14,8 @@ Slice Objects .. c:function:: int PySlice_Check(PyObject *ob) - Return true if *ob* is a slice object; *ob* must not be ``NULL``. + Return true if *ob* is a slice object; *ob* must not be ``NULL``. This + function always succeeds. .. c:function:: PyObject* PySlice_New(PyObject *start, PyObject *stop, PyObject *step) diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index 2dc0762ee7fb8abf9fa4ac34aa6458eb22d3b806..0a0e03ff77ce64b0fa4ebf8c3625444303fb37bd 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -9,6 +9,10 @@ There are a large number of structures which are used in the definition of object types for Python. This section describes these structures and how they are used. + +Base object types and macros +---------------------------- + All Python objects ultimately share a small number of fields at the beginning of the object's representation in memory. These are represented by the :c:type:`PyObject` and :c:type:`PyVarObject` types, which are defined, in turn, @@ -66,6 +70,21 @@ the definition of all other Python objects. (((PyObject*)(o))->ob_type) +.. c:function:: int Py_IS_TYPE(PyObject *o, PyTypeObject *type) + + Return non-zero if the object *o* type is *type*. Return zero otherwise. + Equivalent to: ``Py_TYPE(o) == type``. + + .. versionadded:: 3.9 + + +.. c:function:: void Py_SET_TYPE(PyObject *o, PyTypeObject *type) + + Set the object *o* type to *type*. + + .. versionadded:: 3.9 + + .. c:macro:: Py_REFCNT(o) This macro is used to access the :attr:`ob_refcnt` member of a Python @@ -75,6 +94,13 @@ the definition of all other Python objects. (((PyObject*)(o))->ob_refcnt) +.. c:function:: void Py_SET_REFCNT(PyObject *o, Py_ssize_t refcnt) + + Set the object *o* reference counter to *refcnt*. + + .. versionadded:: 3.9 + + .. c:macro:: Py_SIZE(o) This macro is used to access the :attr:`ob_size` member of a Python object. @@ -83,6 +109,13 @@ the definition of all other Python objects. (((PyVarObject*)(o))->ob_size) +.. c:function:: void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size) + + Set the object *o* size to *size*. + + .. versionadded:: 3.9 + + .. c:macro:: PyObject_HEAD_INIT(type) This is a macro which expands to initialization values for a new @@ -102,32 +135,68 @@ the definition of all other Python objects. 1, type, size, +Implementing functions and methods +---------------------------------- + .. c:type:: PyCFunction Type of the functions used to implement most Python callables in C. - Functions of this type take two :c:type:`PyObject\*` parameters and return + Functions of this type take two :c:type:`PyObject*` parameters and return one such value. If the return value is ``NULL``, an exception shall have been set. If not ``NULL``, the return value is interpreted as the return value of the function as exposed in Python. The function must return a new reference. + The function signature is:: + + PyObject *PyCFunction(PyObject *self, + PyObject *args); .. c:type:: PyCFunctionWithKeywords Type of the functions used to implement Python callables in C with signature :const:`METH_VARARGS | METH_KEYWORDS`. + The function signature is:: + + PyObject *PyCFunctionWithKeywords(PyObject *self, + PyObject *args, + PyObject *kwargs); .. c:type:: _PyCFunctionFast Type of the functions used to implement Python callables in C with signature :const:`METH_FASTCALL`. + The function signature is:: + PyObject *_PyCFunctionFast(PyObject *self, + PyObject *const *args, + Py_ssize_t nargs); .. c:type:: _PyCFunctionFastWithKeywords Type of the functions used to implement Python callables in C with signature :const:`METH_FASTCALL | METH_KEYWORDS`. + The function signature is:: + + PyObject *_PyCFunctionFastWithKeywords(PyObject *self, + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwnames); + +.. c:type:: PyCMethod + + Type of the functions used to implement Python callables in C + with signature :const:`METH_METHOD | METH_FASTCALL | METH_KEYWORDS`. + The function signature is:: + + PyObject *PyCMethod(PyObject *self, + PyTypeObject *defining_class, + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwnames) + + .. versionadded:: 3.9 .. c:type:: PyMethodDef @@ -151,24 +220,22 @@ the definition of all other Python objects. +------------------+---------------+-------------------------------+ The :attr:`ml_meth` is a C function pointer. The functions may be of different -types, but they always return :c:type:`PyObject\*`. If the function is not of +types, but they always return :c:type:`PyObject*`. If the function is not of the :c:type:`PyCFunction`, the compiler will require a cast in the method table. Even though :c:type:`PyCFunction` defines the first parameter as -:c:type:`PyObject\*`, it is common that the method implementation uses the +:c:type:`PyObject*`, it is common that the method implementation uses the specific C type of the *self* object. The :attr:`ml_flags` field is a bitfield which can include the following flags. The individual flags indicate either a calling convention or a binding convention. -There are four basic calling conventions for positional arguments -and two of them can be combined with :const:`METH_KEYWORDS` to support -also keyword arguments. So there are a total of 6 calling conventions: +There are these calling conventions: .. data:: METH_VARARGS This is the typical calling convention, where the methods have the type - :c:type:`PyCFunction`. The function expects two :c:type:`PyObject\*` values. + :c:type:`PyCFunction`. The function expects two :c:type:`PyObject*` values. The first one is the *self* object for methods; for module functions, it is the module object. The second parameter (often called *args*) is a tuple object representing all arguments. This parameter is typically processed @@ -189,7 +256,7 @@ also keyword arguments. So there are a total of 6 calling conventions: Fast calling convention supporting only positional arguments. The methods have the type :c:type:`_PyCFunctionFast`. The first parameter is *self*, the second parameter is a C array - of :c:type:`PyObject\*` values indicating the arguments and the third + of :c:type:`PyObject*` values indicating the arguments and the third parameter is the number of arguments (the length of the array). This is not part of the :ref:`limited API `. @@ -201,9 +268,11 @@ also keyword arguments. So there are a total of 6 calling conventions: Extension of :const:`METH_FASTCALL` supporting also keyword arguments, with methods of type :c:type:`_PyCFunctionFastWithKeywords`. - Keyword arguments are passed the same way as in the vectorcall protocol: - there is an additional fourth :c:type:`PyObject\*` parameter + Keyword arguments are passed the same way as in the + :ref:`vectorcall protocol `: + there is an additional fourth :c:type:`PyObject*` parameter which is a tuple representing the names of the keyword arguments + (which are guaranteed to be strings) or possibly ``NULL`` if there are no keywords. The values of the keyword arguments are stored in the *args* array, after the positional arguments. @@ -212,6 +281,19 @@ also keyword arguments. So there are a total of 6 calling conventions: .. versionadded:: 3.7 +.. data:: METH_METHOD | METH_FASTCALL | METH_KEYWORDS + + Extension of :const:`METH_FASTCALL | METH_KEYWORDS` supporting the *defining + class*, that is, the class that contains the method in question. + The defining class might be a superclass of ``Py_TYPE(self)``. + + The method needs to be of type :c:type:`PyCMethod`, the same as for + ``METH_FASTCALL | METH_KEYWORDS`` with ``defining_class`` argument added after + ``self``. + + .. versionadded:: 3.9 + + .. data:: METH_NOARGS Methods without parameters don't need to check whether arguments are given if @@ -226,7 +308,7 @@ also keyword arguments. So there are a total of 6 calling conventions: Methods with a single object argument can be listed with the :const:`METH_O` flag, instead of invoking :c:func:`PyArg_ParseTuple` with a ``"O"`` argument. They have the type :c:type:`PyCFunction`, with the *self* parameter, and a - :c:type:`PyObject\*` parameter representing the single argument. + :c:type:`PyObject*` parameter representing the single argument. These two constants are not used to indicate the calling convention but the @@ -270,6 +352,9 @@ definition with the same method name. than wrapper object calls. +Accessing attributes of extension types +--------------------------------------- + .. c:type:: PyMemberDef Structure which describes an attribute of a type which corresponds to a C @@ -335,6 +420,21 @@ definition with the same method name. Only :c:macro:`T_OBJECT` and :c:macro:`T_OBJECT_EX` members can be deleted. (They are set to ``NULL``). + .. _pymemberdef-offsets: + + Heap allocated types (created using :c:func:`PyType_FromSpec` or similar), + ``PyMemberDef`` may contain definitions for the special members + ``__dictoffset__``, ``__weaklistoffset__`` and ``__vectorcalloffset__``, + corresponding to + :c:member:`~PyTypeObject.tp_dictoffset`, + :c:member:`~PyTypeObject.tp_weaklistoffset` and + :c:member:`~PyTypeObject.tp_vectorcall_offset` in type objects. + These must be defined with ``T_PYSSIZET`` and ``READONLY``, for example:: + + static PyMemberDef spam_type_members[] = { + {"__dictoffset__", T_PYSSIZET, offsetof(Spam_object, dict), READONLY}, + {NULL} /* Sentinel */ + }; .. c:type:: PyGetSetDef @@ -359,7 +459,7 @@ definition with the same method name. | | | getter and setter | +-------------+------------------+-----------------------------------+ - The ``get`` function takes one :c:type:`PyObject\*` parameter (the + The ``get`` function takes one :c:type:`PyObject*` parameter (the instance) and a function pointer (the associated ``closure``):: typedef PyObject *(*getter)(PyObject *, void *); @@ -367,7 +467,7 @@ definition with the same method name. It should return a new reference on success or ``NULL`` with a set exception on failure. - ``set`` functions take two :c:type:`PyObject\*` parameters (the instance and + ``set`` functions take two :c:type:`PyObject*` parameters (the instance and the value to be set) and a function pointer (the associated ``closure``):: typedef int (*setter)(PyObject *, PyObject *, void *); diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst index c851ff66487d5c8d2bad4102f7efb3e171c5c1d3..9ac91790978926478b1740919473443d40eb7c77 100644 --- a/Doc/c-api/sys.rst +++ b/Doc/c-api/sys.rst @@ -388,6 +388,13 @@ Process Control function :c:func:`abort` is called which will attempt to produce a :file:`core` file. + The ``Py_FatalError()`` function is replaced with a macro which logs + automatically the name of the current function, unless the + ``Py_LIMITED_API`` macro is defined. + + .. versionchanged:: 3.9 + Log the function name automatically. + .. c:function:: void Py_Exit(int status) diff --git a/Doc/c-api/tuple.rst b/Doc/c-api/tuple.rst index 25df3974e870e2cbaf399d455290653ed76983d6..1dbf7dbb67ccd4ca24712a787cbc906e93f01eaf 100644 --- a/Doc/c-api/tuple.rst +++ b/Doc/c-api/tuple.rst @@ -21,14 +21,14 @@ Tuple Objects .. c:function:: int PyTuple_Check(PyObject *p) - Return true if *p* is a tuple object or an instance of a subtype of the tuple - type. + Return true if *p* is a tuple object or an instance of a subtype of the + tuple type. This function always succeeds. .. c:function:: int PyTuple_CheckExact(PyObject *p) Return true if *p* is a tuple object, but not an instance of a subtype of the - tuple type. + tuple type. This function always succeeds. .. c:function:: PyObject* PyTuple_New(Py_ssize_t len) @@ -111,11 +111,6 @@ Tuple Objects raises :exc:`MemoryError` or :exc:`SystemError`. -.. c:function:: int PyTuple_ClearFreeList() - - Clear the free list. Return the total number of freed items. - - Struct Sequence Objects ----------------------- @@ -166,7 +161,7 @@ type. .. c:type:: PyStructSequence_Field Describes a field of a struct sequence. As a struct sequence is modeled as a - tuple, all fields are typed as :c:type:`PyObject\*`. The index in the + tuple, all fields are typed as :c:type:`PyObject*`. The index in the :attr:`fields` array of the :c:type:`PyStructSequence_Desc` determines which field of the struct sequence is described. @@ -182,10 +177,13 @@ type. +-----------+------------------+-----------------------------------------+ -.. c:var:: char* PyStructSequence_UnnamedField +.. c:var:: const char * const PyStructSequence_UnnamedField Special value for a field name to leave it unnamed. + .. versionchanged:: 3.9 + The type was changed from ``char *``. + .. c:function:: PyObject* PyStructSequence_New(PyTypeObject *type) diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index dcdec5329bdbc6c8df997ceaf7a9546f890256f5..ee76f52289387fb7ff750408f491dc3caeb95037 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -21,14 +21,16 @@ Type Objects .. c:function:: int PyType_Check(PyObject *o) - Return true if the object *o* is a type object, including instances of types - derived from the standard type object. Return false in all other cases. + Return non-zero if the object *o* is a type object, including instances of + types derived from the standard type object. Return 0 in all other cases. + This function always succeeds. .. c:function:: int PyType_CheckExact(PyObject *o) - Return true if the object *o* is a type object, but not a subtype of the - standard type object. Return false in all other cases. + Return non-zero if the object *o* is a type object, but not a subtype of + the standard type object. Return 0 in all other cases. This function + always succeeds. .. c:function:: unsigned int PyType_ClearCache() @@ -57,8 +59,8 @@ Type Objects .. c:function:: int PyType_HasFeature(PyTypeObject *o, int feature) - Return true if the type object *o* sets the feature *feature*. Type features - are denoted by single bit flags. + Return non-zero if the type object *o* sets the feature *feature*. + Type features are denoted by single bit flags. .. c:function:: int PyType_IS_GC(PyTypeObject *o) @@ -109,6 +111,37 @@ Type Objects .. versionadded:: 3.4 +.. c:function:: PyObject* PyType_GetModule(PyTypeObject *type) + + Return the module object associated with the given type when the type was + created using :c:func:`PyType_FromModuleAndSpec`. + + If no module is associated with the given type, sets :py:class:`TypeError` + and returns ``NULL``. + + This function is usually used to get the module in which a method is defined. + Note that in such a method, ``PyType_GetModule(Py_TYPE(self))`` + may not return the intended result. + ``Py_TYPE(self)`` may be a *subclass* of the intended class, and subclasses + are not necessarily defined in the same module as their superclass. + See :c:type:`PyCMethod` to get the class that defines the method. + + .. versionadded:: 3.9 + +.. c:function:: void* PyType_GetModuleState(PyTypeObject *type) + + Return the state of the module object associated with the given type. + This is a shortcut for calling :c:func:`PyModule_GetState()` on the result + of :c:func:`PyType_GetModule`. + + If no module is associated with the given type, sets :py:class:`TypeError` + and returns ``NULL``. + + If the *type* has an associated module but its state is ``NULL``, + returns ``NULL`` without setting an exception. + + .. versionadded:: 3.9 + Creating Heap-Allocated Types ............................. @@ -116,7 +149,7 @@ Creating Heap-Allocated Types The following functions and structs are used to create :ref:`heap types `. -.. c:function:: PyObject* PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) +.. c:function:: PyObject* PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) Creates and returns a heap type object from the *spec* (:const:`Py_TPFLAGS_HEAPTYPE`). @@ -124,11 +157,25 @@ The following functions and structs are used to create If *bases* is a tuple, the created heap type contains all types contained in it as base types. - If *bases* is ``NULL``, the *Py_tp_base* slot is used instead. + If *bases* is ``NULL``, the *Py_tp_bases* slot is used instead. + If that also is ``NULL``, the *Py_tp_base* slot is used instead. If that also is ``NULL``, the new type derives from :class:`object`. + The *module* argument can be used to record the module in which the new + class is defined. It must be a module object or ``NULL``. + If not ``NULL``, the module is associated with the new type and can later be + retreived with :c:func:`PyType_GetModule`. + The associated module is not inherited by subclasses; it must be specified + for each class individually. + This function calls :c:func:`PyType_Ready` on the new type. + .. versionadded:: 3.9 + +.. c:function:: PyObject* PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) + + Equivalent to ``PyType_FromModuleAndSpec(NULL, spec, bases)``. + .. versionadded:: 3.3 .. c:function:: PyObject* PyType_FromSpec(PyType_Spec *spec) @@ -181,23 +228,37 @@ The following functions and structs are used to create * ``Py_nb_add`` to set :c:member:`PyNumberMethods.nb_add` * ``Py_sq_length`` to set :c:member:`PySequenceMethods.sq_length` - The following fields cannot be set using :c:type:`PyType_Spec` and :c:type:`PyType_Slot`: + The following fields cannot be set at all using :c:type:`PyType_Spec` and + :c:type:`PyType_Slot`: * :c:member:`~PyTypeObject.tp_dict` * :c:member:`~PyTypeObject.tp_mro` * :c:member:`~PyTypeObject.tp_cache` * :c:member:`~PyTypeObject.tp_subclasses` * :c:member:`~PyTypeObject.tp_weaklist` - * :c:member:`~PyTypeObject.tp_print` + * :c:member:`~PyTypeObject.tp_vectorcall` * :c:member:`~PyTypeObject.tp_weaklistoffset` + (see :ref:`PyMemberDef `) * :c:member:`~PyTypeObject.tp_dictoffset` + (see :ref:`PyMemberDef `) + * :c:member:`~PyTypeObject.tp_vectorcall_offset` + (see :ref:`PyMemberDef `) + + The following fields cannot be set using :c:type:`PyType_Spec` and + :c:type:`PyType_Slot` under the limited API: + * :c:member:`~PyBufferProcs.bf_getbuffer` * :c:member:`~PyBufferProcs.bf_releasebuffer` - Setting :c:data:`Py_tp_bases` may be problematic on some platforms. + Setting :c:data:`Py_tp_bases` or :c:data:`Py_tp_base` may be + problematic on some platforms. To avoid issues, use the *bases* argument of :py:func:`PyType_FromSpecWithBases` instead. + .. versionchanged:: 3.9 + + Slots in :c:type:`PyBufferProcs` in may be set in the unlimited API. + .. c:member:: void *PyType_Slot.pfunc The desired value of the slot. In most cases, this is a pointer diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index 163f599d1c2641673be98344f03cde5ea112cea6..ddcb8ae3d0950ceb5adb995970f35e474a25973e 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -49,7 +49,7 @@ Quick Reference +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | :c:member:`~PyTypeObject.tp_dealloc` | :c:type:`destructor` | | X | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_vectorcall_offset` | Py_ssize_t | | | | | ? | + | :c:member:`~PyTypeObject.tp_vectorcall_offset` | Py_ssize_t | | | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | (:c:member:`~PyTypeObject.tp_getattr`) | :c:type:`getattrfunc` | __getattribute__, | | | | G | | | | __getattr__ | | | | | @@ -145,15 +145,8 @@ Quick Reference +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | :c:member:`~PyTypeObject.tp_finalize` | :c:type:`destructor` | __del__ | | | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - -If :const:`COUNT_ALLOCS` is defined then the following (internal-only) -fields exist as well: - -* :c:member:`~PyTypeObject.tp_allocs` -* :c:member:`~PyTypeObject.tp_frees` -* :c:member:`~PyTypeObject.tp_maxalloc` -* :c:member:`~PyTypeObject.tp_prev` -* :c:member:`~PyTypeObject.tp_next` + | :c:member:`~PyTypeObject.tp_vectorcall` | :c:type:`vectorcallfunc` | | | | | | + +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ .. [#slots] A slot name in parentheses indicates it is (effectively) deprecated. @@ -180,7 +173,7 @@ fields exist as well: .. code-block:: none - X - type slot is inherited via PyType_Ready if defined with a NULL value + X - type slot is inherited via *PyType_Ready* if defined with a *NULL* value % - the slots of the sub-struct are inherited individually G - inherited, but only in combination with other slots; see the slot's description ? - it's complicated; see the slot's description @@ -687,42 +680,29 @@ and :c:type:`PyType_Type` effectively act as defaults.) .. c:member:: Py_ssize_t PyTypeObject.tp_vectorcall_offset An optional offset to a per-instance function that implements calling - the object using the *vectorcall* protocol, a more efficient alternative + the object using the :ref:`vectorcall protocol `, + a more efficient alternative of the simpler :c:member:`~PyTypeObject.tp_call`. - This field is only used if the flag :const:`_Py_TPFLAGS_HAVE_VECTORCALL` + This field is only used if the flag :const:`Py_TPFLAGS_HAVE_VECTORCALL` is set. If so, this must be a positive integer containing the offset in the instance of a :c:type:`vectorcallfunc` pointer. - The signature is the same as for :c:func:`_PyObject_Vectorcall`:: - - PyObject *vectorcallfunc(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) - The *vectorcallfunc* pointer may be zero, in which case the instance behaves - as if :const:`_Py_TPFLAGS_HAVE_VECTORCALL` was not set: calling the instance + The *vectorcallfunc* pointer may be ``NULL``, in which case the instance behaves + as if :const:`Py_TPFLAGS_HAVE_VECTORCALL` was not set: calling the instance falls back to :c:member:`~PyTypeObject.tp_call`. - Any class that sets ``_Py_TPFLAGS_HAVE_VECTORCALL`` must also set + Any class that sets ``Py_TPFLAGS_HAVE_VECTORCALL`` must also set :c:member:`~PyTypeObject.tp_call` and make sure its behaviour is consistent with the *vectorcallfunc* function. - This can be done by setting *tp_call* to ``PyVectorcall_Call``: + This can be done by setting *tp_call* to :c:func:`PyVectorcall_Call`. - .. c:function:: PyObject *PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *dict) - - Call *callable*'s *vectorcallfunc* with positional and keyword - arguments given in a tuple and dict, respectively. - - This function is intended to be used in the ``tp_call`` slot. - It does not fall back to ``tp_call`` and it currently does not check the - ``_Py_TPFLAGS_HAVE_VECTORCALL`` flag. - To call an object, use one of the :c:func:`PyObject_Call ` - functions instead. - - .. note:: + .. warning:: It is not recommended for :ref:`heap types ` to implement the vectorcall protocol. - When a user sets ``__call__`` in Python code, only ``tp_call`` is updated, - possibly making it inconsistent with the vectorcall function. + When a user sets :attr:`__call__` in Python code, only *tp_call* is updated, + likely making it inconsistent with the vectorcall function. .. note:: @@ -732,18 +712,19 @@ and :c:type:`PyType_Type` effectively act as defaults.) .. versionchanged:: 3.8 - This slot was used for print formatting in Python 2.x. - In Python 3.0 to 3.7, it was reserved and named ``tp_print``. + Before version 3.8, this slot was named ``tp_print``. + In Python 2.x, it was used for printing to a file. + In Python 3.0 to 3.7, it was unused. **Inheritance:** - This field is inherited by subtypes together with - :c:member:`~PyTypeObject.tp_call`: a subtype inherits - :c:member:`~PyTypeObject.tp_vectorcall_offset` from its base type when - the subtype’s :c:member:`~PyTypeObject.tp_call` is ``NULL``. - - Note that `heap types`_ (including subclasses defined in Python) do not - inherit the :const:`_Py_TPFLAGS_HAVE_VECTORCALL` flag. + This field is always inherited. + However, the :const:`Py_TPFLAGS_HAVE_VECTORCALL` flag is not + always inherited. If it's not, then the subclass won't use + :ref:`vectorcall `, except when + :c:func:`PyVectorcall_Call` is explicitly called. + This is in particular the case for `heap types`_ + (including subclasses defined in Python). .. c:member:: getattrfunc PyTypeObject.tp_getattr @@ -965,7 +946,7 @@ and :c:type:`PyType_Type` effectively act as defaults.) The signature is the same as for :c:func:`PyObject_SetAttr`:: - PyObject *tp_setattro(PyObject *self, PyObject *attr, PyObject *value); + int tp_setattro(PyObject *self, PyObject *attr, PyObject *value); In addition, setting *value* to ``NULL`` to delete an attribute must be supported. It is usually convenient to set this field to @@ -1171,27 +1152,20 @@ and :c:type:`PyType_Type` effectively act as defaults.) :c:member:`~PyTypeObject.tp_finalize` slot is always present in the type structure. - .. data:: _Py_TPFLAGS_HAVE_VECTORCALL - This bit is set when the class implements the vectorcall protocol. + .. data:: Py_TPFLAGS_HAVE_VECTORCALL + + This bit is set when the class implements + the :ref:`vectorcall protocol `. See :c:member:`~PyTypeObject.tp_vectorcall_offset` for details. **Inheritance:** - This bit is set on *static* subtypes if ``tp_flags`` is not overridden: - a subtype inherits ``_Py_TPFLAGS_HAVE_VECTORCALL`` from its base type - when the subtype’s :c:member:`~PyTypeObject.tp_call` is ``NULL`` - and the subtype's ``Py_TPFLAGS_HEAPTYPE`` is not set. - - `Heap types`_ do not inherit ``_Py_TPFLAGS_HAVE_VECTORCALL``. - - .. note:: - - This flag is provisional and expected to become public in Python 3.9, - with a different name and, possibly, changed semantics. - If you use vectorcall, plan for updating your code for Python 3.9. + This bit is inherited for *static* subtypes if + :c:member:`~PyTypeObject.tp_call` is also inherited. + `Heap types`_ do not inherit ``Py_TPFLAGS_HAVE_VECTORCALL``. - .. versionadded:: 3.8 + .. versionadded:: 3.9 .. c:member:: const char* PyTypeObject.tp_doc @@ -1249,11 +1223,25 @@ and :c:type:`PyType_Type` effectively act as defaults.) but the instance has no strong reference to the elements inside it, as they are allowed to be removed even if the instance is still alive). - Note that :c:func:`Py_VISIT` requires the *visit* and *arg* parameters to :c:func:`local_traverse` to have these specific names; don't name them just anything. + Heap-allocated types (:const:`Py_TPFLAGS_HEAPTYPE`, such as those created + with :c:func:`PyType_FromSpec` and similar APIs) hold a reference to their + type. Their traversal function must therefore either visit + :c:func:`Py_TYPE(self) `, or delegate this responsibility by + calling ``tp_traverse`` of another heap-allocated type (such as a + heap-allocated superclass). + If they do not, the type object may not be garbage-collected. + + .. versionchanged:: 3.9 + + Heap-allocated types are expected to visit ``Py_TYPE(self)`` in + ``tp_traverse``. In earlier versions of Python, due to + `bug 40217 `_, doing this + may lead to crashes in subclasses. + **Inheritance:** Group: :const:`Py_TPFLAGS_HAVE_GC`, :attr:`tp_traverse`, :attr:`tp_clear` @@ -1360,7 +1348,7 @@ and :c:type:`PyType_Type` effectively act as defaults.) The following macro is defined to ease writing rich comparison functions: - .. c:function:: PyObject \*Py_RETURN_RICHCOMPARE(VAL_A, VAL_B, int op) + .. c:macro:: Py_RETURN_RICHCOMPARE(VAL_A, VAL_B, op) Return ``Py_True`` or ``Py_False`` from the function, depending on the result of a comparison. @@ -1398,7 +1386,7 @@ and :c:type:`PyType_Type` effectively act as defaults.) than zero and contains the offset in the instance structure of the weak reference list head (ignoring the GC header, if present); this offset is used by :c:func:`PyObject_ClearWeakRefs` and the :c:func:`PyWeakref_\*` functions. The - instance structure needs to include a field of type :c:type:`PyObject\*` which is + instance structure needs to include a field of type :c:type:`PyObject*` which is initialized to ``NULL``. Do not confuse this field with :c:member:`~PyTypeObject.tp_weaklist`; that is the list head for @@ -1727,9 +1715,9 @@ and :c:type:`PyType_Type` effectively act as defaults.) PyObject *tp_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds); - The subtype argument is the type of the object being created; the *args* and + The *subtype* argument is the type of the object being created; the *args* and *kwds* arguments represent positional and keyword arguments of the call to the - type. Note that subtype doesn't have to equal the type whose :c:member:`~PyTypeObject.tp_new` + type. Note that *subtype* doesn't have to equal the type whose :c:member:`~PyTypeObject.tp_new` function is called; it may be a subtype of that type (but not an unrelated type). @@ -1912,30 +1900,20 @@ and :c:type:`PyType_Type` effectively act as defaults.) .. seealso:: "Safe object finalization" (:pep:`442`) -The remaining fields are only defined if the feature test macro -:const:`COUNT_ALLOCS` is defined, and are for internal use only. They are -documented here for completeness. None of these fields are inherited by -subtypes. - -.. c:member:: Py_ssize_t PyTypeObject.tp_allocs - - Number of allocations. - -.. c:member:: Py_ssize_t PyTypeObject.tp_frees +.. c:member:: vectorcallfunc PyTypeObject.tp_vectorcall - Number of frees. + Vectorcall function to use for calls of this type object. + In other words, it is used to implement + :ref:`vectorcall ` for ``type.__call__``. + If ``tp_vectorcall`` is ``NULL``, the default call implementation + using :attr:`__new__` and :attr:`__init__` is used. -.. c:member:: Py_ssize_t PyTypeObject.tp_maxalloc - - Maximum simultaneously allocated objects. - -.. c:member:: PyTypeObject* PyTypeObject.tp_prev + **Inheritance:** - Pointer to the previous type object with a non-zero :c:member:`~PyTypeObject.tp_allocs` field. + This field is never inherited. -.. c:member:: PyTypeObject* PyTypeObject.tp_next + .. versionadded:: 3.9 (the field exists since 3.8 but it's only used since 3.9) - Pointer to the next type object with a non-zero :c:member:`~PyTypeObject.tp_allocs` field. Also, note that, in a garbage collected Python, :c:member:`~PyTypeObject.tp_dealloc` may be called from any Python thread, not just the thread which created the object (if the object @@ -2381,14 +2359,6 @@ Slot Type typedefs .. c:type:: void (*destructor)(PyObject *) -.. c:type:: PyObject *(*vectorcallfunc)(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) - - See :c:member:`~PyTypeObject.tp_vectorcall_offset`. - - Arguments to ``vectorcallfunc`` are the same as for :c:func:`_PyObject_Vectorcall`. - - .. versionadded:: 3.8 - .. c:type:: void (*freefunc)(void *) See :c:member:`~PyTypeObject.tp_free`. diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index b261efe2ba477778cea9c5283e5edb2bb0612169..62295b4c52934d8c110272fb7857cfc7320dab6f 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -34,6 +34,11 @@ can internally be in two states depending on how they were created: :c:type:`Py_UNICODE*` representation; you will have to call :c:func:`PyUnicode_READY` on them before calling any other API. +.. note:: + The "legacy" Unicode object will be removed in Python 3.12 with deprecated + APIs. All Unicode objects will be "canonical" since then. See :pep:`623` + for more information. + Unicode Type """""""""""" @@ -86,13 +91,13 @@ access internal read-only data of Unicode objects: .. c:function:: int PyUnicode_Check(PyObject *o) Return true if the object *o* is a Unicode object or an instance of a Unicode - subtype. + subtype. This function always succeeds. .. c:function:: int PyUnicode_CheckExact(PyObject *o) Return true if the object *o* is a Unicode object, but not an instance of a - subtype. + subtype. This function always succeeds. .. c:function:: int PyUnicode_READY(PyObject *o) @@ -107,6 +112,9 @@ access internal read-only data of Unicode objects: .. versionadded:: 3.3 + .. deprecated-removed:: 3.10 3.12 + This API will be removed with :c:func:`PyUnicode_FromUnicode`. + .. c:function:: Py_ssize_t PyUnicode_GET_LENGTH(PyObject *o) @@ -138,6 +146,9 @@ access internal read-only data of Unicode objects: .. versionadded:: 3.3 + .. deprecated-removed:: 3.10 3.12 + ``PyUnicode_WCHAR_KIND`` is deprecated. + .. c:function:: int PyUnicode_KIND(PyObject *o) @@ -188,7 +199,7 @@ access internal read-only data of Unicode objects: .. versionadded:: 3.3 -.. c:function:: PyUnicode_MAX_CHAR_VALUE(PyObject *o) +.. c:macro:: PyUnicode_MAX_CHAR_VALUE(o) Return the maximum code point that is suitable for creating another string based on *o*, which must be in the "canonical" representation. This is @@ -197,18 +208,13 @@ access internal read-only data of Unicode objects: .. versionadded:: 3.3 -.. c:function:: int PyUnicode_ClearFreeList() - - Clear the free list. Return the total number of freed items. - - .. c:function:: Py_ssize_t PyUnicode_GET_SIZE(PyObject *o) Return the size of the deprecated :c:type:`Py_UNICODE` representation, in code units (this includes surrogate pairs as 2 units). *o* has to be a Unicode object (not checked). - .. deprecated-removed:: 3.3 4.0 + .. deprecated-removed:: 3.3 3.12 Part of the old-style Unicode API, please migrate to using :c:func:`PyUnicode_GET_LENGTH`. @@ -218,7 +224,7 @@ access internal read-only data of Unicode objects: Return the size of the deprecated :c:type:`Py_UNICODE` representation in bytes. *o* has to be a Unicode object (not checked). - .. deprecated-removed:: 3.3 4.0 + .. deprecated-removed:: 3.3 3.12 Part of the old-style Unicode API, please migrate to using :c:func:`PyUnicode_GET_LENGTH`. @@ -240,11 +246,21 @@ access internal read-only data of Unicode objects: code to use the new :c:func:`PyUnicode_nBYTE_DATA` macros or use :c:func:`PyUnicode_WRITE` or :c:func:`PyUnicode_READ`. - .. deprecated-removed:: 3.3 4.0 + .. deprecated-removed:: 3.3 3.12 Part of the old-style Unicode API, please migrate to using the :c:func:`PyUnicode_nBYTE_DATA` family of macros. +.. c:function:: int PyUnicode_IsIdentifier(PyObject *o) + + Return ``1`` if the string is a valid identifier according to the language + definition, section :ref:`identifiers`. Return ``0`` otherwise. + + .. versionchanged:: 3.9 + The function does not call :c:func:`Py_FatalError` anymore if the string + is not ready. + + Unicode Character Properties """""""""""""""""""""""""""" @@ -682,8 +698,10 @@ Extension modules can continue using them, as they will not be removed in Python string content has been filled before using any of the access macros such as :c:func:`PyUnicode_KIND`. - Please migrate to using :c:func:`PyUnicode_FromKindAndData`, - :c:func:`PyUnicode_FromWideChar` or :c:func:`PyUnicode_New`. + .. deprecated-removed:: 3.3 3.12 + Part of the old-style Unicode API, please migrate to using + :c:func:`PyUnicode_FromKindAndData`, :c:func:`PyUnicode_FromWideChar`, or + :c:func:`PyUnicode_New`. .. c:function:: Py_UNICODE* PyUnicode_AsUnicode(PyObject *unicode) @@ -696,9 +714,10 @@ Extension modules can continue using them, as they will not be removed in Python embedded null code points, which would cause the string to be truncated when used in most C functions. - Please migrate to using :c:func:`PyUnicode_AsUCS4`, - :c:func:`PyUnicode_AsWideChar`, :c:func:`PyUnicode_ReadChar` or similar new - APIs. + .. deprecated-removed:: 3.3 3.12 + Part of the old-style Unicode API, please migrate to using + :c:func:`PyUnicode_AsUCS4`, :c:func:`PyUnicode_AsWideChar`, + :c:func:`PyUnicode_ReadChar` or similar new APIs. .. deprecated-removed:: 3.3 3.10 @@ -720,6 +739,11 @@ Extension modules can continue using them, as they will not be removed in Python .. versionadded:: 3.3 + .. deprecated-removed:: 3.3 3.12 + Part of the old-style Unicode API, please migrate to using + :c:func:`PyUnicode_AsUCS4`, :c:func:`PyUnicode_AsWideChar`, + :c:func:`PyUnicode_ReadChar` or similar new APIs. + .. c:function:: Py_UNICODE* PyUnicode_AsUnicodeCopy(PyObject *unicode) @@ -740,7 +764,9 @@ Extension modules can continue using them, as they will not be removed in Python Return the size of the deprecated :c:type:`Py_UNICODE` representation, in code units (this includes surrogate pairs as 2 units). - Please migrate to using :c:func:`PyUnicode_GetLength`. + .. deprecated-removed:: 3.3 3.12 + Part of the old-style Unicode API, please migrate to using + :c:func:`PyUnicode_GET_LENGTH`. .. c:function:: PyObject* PyUnicode_FromObject(PyObject *obj) @@ -985,7 +1011,7 @@ have the same semantics as the ones of the built-in :func:`str` string object constructor. Setting encoding to ``NULL`` causes the default encoding to be used -which is ASCII. The file system calls should use +which is UTF-8. The file system calls should use :c:func:`PyUnicode_FSConverter` for encoding file names. This uses the variable :c:data:`Py_FileSystemDefaultEncoding` internally. This variable should be treated as read-only: on some systems, it will be a @@ -1477,17 +1503,21 @@ These are the mapping codec APIs: The following codec API is special in that maps Unicode to Unicode. -.. c:function:: PyObject* PyUnicode_Translate(PyObject *unicode, \ - PyObject *mapping, const char *errors) +.. c:function:: PyObject* PyUnicode_Translate(PyObject *str, PyObject *table, const char *errors) - Translate a Unicode object using the given *mapping* object and return the - resulting Unicode object. Return ``NULL`` if an exception was raised by the + Translate a string by applying a character mapping table to it and return the + resulting Unicode object. Return ``NULL`` if an exception was raised by the codec. - The *mapping* object must map Unicode ordinal integers to Unicode strings, - integers (which are then interpreted as Unicode ordinals) or ``None`` - (causing deletion of the character). Unmapped character ordinals (ones - which cause a :exc:`LookupError`) are left untouched and are copied as-is. + The mapping table must map Unicode ordinal integers to Unicode ordinal integers + or ``None`` (causing deletion of the character). + + Mapping tables need only provide the :meth:`__getitem__` interface; dictionaries + and sequences work well. Unmapped character ordinals (ones which cause a + :exc:`LookupError`) are left untouched and are copied as-is. + + *errors* has the usual meaning for codecs. It may be ``NULL`` which indicates to + use the default error handling. .. c:function:: PyObject* PyUnicode_TranslateCharmap(const Py_UNICODE *s, Py_ssize_t size, \ @@ -1590,23 +1620,6 @@ They all return ``NULL`` or ``-1`` if an exception occurs. characters are not included in the resulting strings. -.. c:function:: PyObject* PyUnicode_Translate(PyObject *str, PyObject *table, \ - const char *errors) - - Translate a string by applying a character mapping table to it and return the - resulting Unicode object. - - The mapping table must map Unicode ordinal integers to Unicode ordinal integers - or ``None`` (causing deletion of the character). - - Mapping tables need only provide the :meth:`__getitem__` interface; dictionaries - and sequences work well. Unmapped character ordinals (ones which cause a - :exc:`LookupError`) are left untouched and are copied as-is. - - *errors* has the usual meaning for codecs. It may be ``NULL`` which indicates to - use the default error handling. - - .. c:function:: PyObject* PyUnicode_Join(PyObject *separator, PyObject *seq) Join a sequence of strings using the given *separator* and return the resulting diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst index 98cea52ab7193887099cc72412d519fc2e7627e1..551846ea6d7205870fb8ceb02eacd9eb4d608fcc 100644 --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -16,11 +16,11 @@ parameter. The available start symbols are :const:`Py_eval_input`, :const:`Py_file_input`, and :const:`Py_single_input`. These are described following the functions which accept them as parameters. -Note also that several of these functions take :c:type:`FILE\*` parameters. One +Note also that several of these functions take :c:type:`FILE*` parameters. One particular issue which needs to be handled carefully is that the :c:type:`FILE` structure for different C libraries can be different and incompatible. Under Windows (at least), it is possible for dynamically linked extensions to actually -use different libraries, so care should be taken that :c:type:`FILE\*` parameters +use different libraries, so care should be taken that :c:type:`FILE*` parameters are only passed to these functions if it is certain that they were created by the same library that the Python runtime is using. @@ -117,7 +117,7 @@ the same library that the Python runtime is using. closed before PyRun_SimpleFileExFlags returns. .. note:: - On Windows, *fp* should be opened as binary mode (e.g. ``fopen(filename, "rb")``. + On Windows, *fp* should be opened as binary mode (e.g. ``fopen(filename, "rb")``). Otherwise, Python may not handle script file with LF line ending correctly. @@ -193,6 +193,8 @@ the same library that the Python runtime is using. :c:func:`PyParser_SimpleParseStringFlagsFilename` below, leaving *filename* set to ``NULL`` and *flags* set to ``0``. + .. deprecated-removed:: 3.9 3.10 + .. c:function:: struct _node* PyParser_SimpleParseStringFlags( const char *str, int start, int flags) @@ -200,6 +202,8 @@ the same library that the Python runtime is using. :c:func:`PyParser_SimpleParseStringFlagsFilename` below, leaving *filename* set to ``NULL``. + .. deprecated-removed:: 3.9 3.10 + .. c:function:: struct _node* PyParser_SimpleParseStringFlagsFilename( const char *str, const char *filename, int start, int flags) @@ -209,18 +213,24 @@ the same library that the Python runtime is using. many times. *filename* is decoded from the filesystem encoding (:func:`sys.getfilesystemencoding`). + .. deprecated-removed:: 3.9 3.10 + .. c:function:: struct _node* PyParser_SimpleParseFile(FILE *fp, const char *filename, int start) This is a simplified interface to :c:func:`PyParser_SimpleParseFileFlags` below, leaving *flags* set to ``0``. + .. deprecated-removed:: 3.9 3.10 + .. c:function:: struct _node* PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags) Similar to :c:func:`PyParser_SimpleParseStringFlagsFilename`, but the Python source code is read from *fp* instead of an in-memory string. + .. deprecated-removed:: 3.9 3.10 + .. c:function:: PyObject* PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals) diff --git a/Doc/c-api/weakref.rst b/Doc/c-api/weakref.rst index e3a9bda54d671a52634b158e7197a00c34d6d178..67698de77fef1d023c4656744abb613afb8d6324 100644 --- a/Doc/c-api/weakref.rst +++ b/Doc/c-api/weakref.rst @@ -13,17 +13,18 @@ as much as it can. .. c:function:: int PyWeakref_Check(ob) - Return true if *ob* is either a reference or proxy object. + Return true if *ob* is either a reference or proxy object. This function + always succeeds. .. c:function:: int PyWeakref_CheckRef(ob) - Return true if *ob* is a reference object. + Return true if *ob* is a reference object. This function always succeeds. .. c:function:: int PyWeakref_CheckProxy(ob) - Return true if *ob* is a proxy object. + Return true if *ob* is a proxy object. This function always succeeds. .. c:function:: PyObject* PyWeakref_NewRef(PyObject *ob, PyObject *callback) diff --git a/Doc/conf.py b/Doc/conf.py index abaa760c98c1aa24c5109d30db2f3e358b9bb2a7..079d17717f381c66f72f5f13bfcd0fdf7d6beadb 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -14,7 +14,8 @@ # --------------------- extensions = ['sphinx.ext.coverage', 'sphinx.ext.doctest', - 'pyspecific', 'c_annotations', 'escape4chm'] + 'pyspecific', 'c_annotations', 'escape4chm', + 'asdl_highlight', 'peg_highlight'] doctest_global_setup = ''' @@ -127,6 +128,7 @@ } \let\Verbatim=\OriginalVerbatim \let\endVerbatim=\endOriginalVerbatim +\setcounter{tocdepth}{2} ''' # The paper size ('letter' or 'a4'). @@ -226,3 +228,13 @@ # Relative filename of the reference count data file. refcount_file = 'data/refcounts.dat' + +# Sphinx 2 and Sphinx 3 compatibility +# ----------------------------------- + +# bpo-40204: Allow Sphinx 2 syntax in the C domain +c_allow_pre_v3 = True + +# bpo-40204: Disable warnings on Sphinx 2 syntax of the C domain since the +# documentation is built with -W (warnings treated as errors). +c_warn_on_allowed_pre_v3 = False diff --git a/Doc/copyright.rst b/Doc/copyright.rst index 1b90d9f172c992e852a95fd128f92e06dd776cc4..4191c0bb63a2c1fde73c0457472d646006fb9343 100644 --- a/Doc/copyright.rst +++ b/Doc/copyright.rst @@ -4,7 +4,7 @@ Copyright Python and this documentation is: -Copyright © 2001-2020 Python Software Foundation. All rights reserved. +Copyright © 2001-2021 Python Software Foundation. All rights reserved. Copyright © 2000 BeOpen.com. All rights reserved. diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat index 3ccc20b70c62e6509180951e1264d6248f1b7de9..aac135113ad7eb13ec513e5cb5092dfa96be4713 100644 --- a/Doc/data/refcounts.dat +++ b/Doc/data/refcounts.dat @@ -2306,6 +2306,11 @@ PyType_CheckExact:PyObject*:o:0: PyType_FromSpec:PyObject*::+1: PyType_FromSpec:PyType_Spec*:spec:: +PyType_FromModuleAndSpec:PyObject*::+1: +PyType_FromModuleAndSpec:PyObject*:module:+1: +PyType_FromModuleAndSpec:PyType_Spec*:spec:: +PyType_FromModuleAndSpec:PyObject*:bases:0: + PyType_FromSpecWithBases:PyObject*::+1: PyType_FromSpecWithBases:PyType_Spec*:spec:: PyType_FromSpecWithBases:PyObject*:bases:0: @@ -3046,8 +3051,6 @@ Py_XINCREF:PyObject*:o:+1:if o is not NULL _PyImport_Fini:void::: -_PyImport_Init:void::: - _PyObject_New:PyObject*::+1: _PyObject_New:PyTypeObject*:type:0: diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst index 80136b8a6bcdd804e84451084c1bda6c7da3bba8..b14197c2f94dbabfb57884a6b29dc009f2dae896 100644 --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -1142,6 +1142,24 @@ other utility module. * ``macosx-10.6-intel`` + For AIX, Python 3.9 and later return a string starting with "aix", followed + by additional fields (separated by ``'-'``) that represent the combined + values of AIX Version, Release and Technology Level (first field), Build Date + (second field), and bit-size (third field). Python 3.8 and earlier returned + only a single additional field with the AIX Version and Release. + + Examples of returned values on AIX: + + * ``aix-5307-0747-32`` # 32-bit build on AIX ``oslevel -s``: 5300-07-00-0000 + + * ``aix-7105-1731-64`` # 64-bit build on AIX ``oslevel -s``: 7100-05-01-1731 + + * ``aix-7.2`` # Legacy form reported in Python 3.8 and earlier + + .. versionchanged:: 3.9 + The AIX platform string format now also includes the technology level, + build date, and ABI bit-size. + .. function:: convert_path(pathname) @@ -1837,6 +1855,9 @@ Subclasses of :class:`Command` must define the following methods. .. class:: bdist_msi +.. deprecated:: 3.9 + Use bdist_wheel (wheel packages) instead. + Builds a `Windows Installer`_ (.msi) binary package. .. _Windows Installer: https://msdn.microsoft.com/en-us/library/cc185688(VS.85).aspx diff --git a/Doc/distutils/builtdist.rst b/Doc/distutils/builtdist.rst index b814f2e9508c9cab049f5bb11059e83a8c63a032..e032c03e229a5cbca6a789c27fab6903ff15638e 100644 --- a/Doc/distutils/builtdist.rst +++ b/Doc/distutils/builtdist.rst @@ -149,6 +149,9 @@ generated by each, are: .. note:: bdist_wininst is deprecated since Python 3.8. +.. note:: + bdist_msi is deprecated since Python 3.9. + The following sections give details on the individual :command:`bdist_\*` commands. @@ -304,6 +307,9 @@ Creating Windows Installers .. warning:: bdist_wininst is deprecated since Python 3.8. +.. warning:: + bdist_msi is deprecated since Python 3.9. + Executable installers are the natural format for binary distributions on Windows. They display a nice graphical user interface, display some information about the module distribution to be installed taken from the metadata in the @@ -468,3 +474,6 @@ installed for all users) and 'force' (meaning always prompt for elevation). .. note:: bdist_wininst is deprecated since Python 3.8. + +.. note:: + bdist_msi is deprecated since Python 3.9. diff --git a/Doc/distutils/examples.rst b/Doc/distutils/examples.rst index 44f70831d0bf8721dc8c30c1e0099164abcf3717..e492b7f6057596b3af5a11178e4ebb2a5382f4e7 100644 --- a/Doc/distutils/examples.rst +++ b/Doc/distutils/examples.rst @@ -255,7 +255,7 @@ Running the ``check`` command will display some warnings: running check warning: check: missing required meta-data: version, url warning: check: missing meta-data: either (author and author_email) or - (maintainer and maintainer_email) must be supplied + (maintainer and maintainer_email) should be supplied If you use the reStructuredText syntax in the ``long_description`` field and diff --git a/Doc/extending/newtypes.rst b/Doc/extending/newtypes.rst index 19c5e51537b19251567478f4cc27a9e39e7346d3..d9023709fddc86ff42c387c2d912e047ac6c77ab 100644 --- a/Doc/extending/newtypes.rst +++ b/Doc/extending/newtypes.rst @@ -104,7 +104,7 @@ done. This can be done using the :c:func:`PyErr_Fetch` and /* This saves the current exception state */ PyErr_Fetch(&err_type, &err_value, &err_traceback); - cbresult = PyObject_CallObject(self->my_callback, NULL); + cbresult = PyObject_CallNoArgs(self->my_callback); if (cbresult == NULL) PyErr_WriteUnraisable(self->my_callback); else diff --git a/Doc/extending/newtypes_tutorial.rst b/Doc/extending/newtypes_tutorial.rst index 0eb6ffd026f495913e9651085f5c2361361d0f00..4da77e797d222c44aeac458d939ff7e375027d3d 100644 --- a/Doc/extending/newtypes_tutorial.rst +++ b/Doc/extending/newtypes_tutorial.rst @@ -416,7 +416,7 @@ But this would be risky. Our type doesn't restrict the type of the ``first`` member, so it could be any kind of object. It could have a destructor that causes code to be executed that tries to access the ``first`` member; or that destructor could release the -:term:`Global interpreter Lock` and let arbitrary code run in other +:term:`Global interpreter Lock ` and let arbitrary code run in other threads that accesses and modifies our object. To be paranoid and protect ourselves against this possibility, we almost diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst index e7921baf242f52c1813b8f35dcfcbe3d9b633d31..8cf271c30240848599e875a5bb79641dd5590553 100644 --- a/Doc/faq/design.rst +++ b/Doc/faq/design.rst @@ -24,14 +24,16 @@ programmers will encounter a fragment of code like this:: z++; Only the ``x++`` statement is executed if the condition is true, but the -indentation leads you to believe otherwise. Even experienced C programmers will -sometimes stare at it a long time wondering why ``y`` is being decremented even +indentation leads many to believe otherwise. Even experienced C programmers will +sometimes stare at it a long time wondering as to why ``y`` is being decremented even for ``x > y``. Because there are no begin/end brackets, Python is much less prone to coding-style conflicts. In C there are many different ways to place the braces. -If you're used to reading and writing code that uses one style, you will feel at -least slightly uneasy when reading (or being required to write) another style. +After becoming used to reading and writing code using a particular style, +it is normal to feel somewhat uneasy when reading (or being required to write) +in a different one. + Many coding styles place begin/end brackets on a line by themselves. This makes programs considerably longer and wastes valuable screen space, making it harder @@ -571,8 +573,7 @@ whether an instance or a class implements a particular ABC. The :class:`~collections.abc.MutableMapping`. For Python, many of the advantages of interface specifications can be obtained -by an appropriate test discipline for components. There is also a tool, -PyChecker, which can be used to find problems due to subclassing. +by an appropriate test discipline for components. A good test suite for a module can both provide a regression test and serve as a module interface specification and a set of examples. Many Python modules can @@ -590,11 +591,11 @@ to the end of some internal list; an interface specification cannot test that your :meth:`append` implementation will actually do this correctly, but it's trivial to check this property in a test suite. -Writing test suites is very helpful, and you might want to design your code with -an eye to making it easily tested. One increasingly popular technique, -test-directed development, calls for writing parts of the test suite first, -before you write any of the actual code. Of course Python allows you to be -sloppy and not write test cases at all. +Writing test suites is very helpful, and you might want to design your code to +make it easily tested. One increasingly popular technique, test-driven +development, calls for writing parts of the test suite first, before you write +any of the actual code. Of course Python allows you to be sloppy and not write +test cases at all. Why is there no goto? @@ -649,7 +650,7 @@ Why doesn't Python have a "with" statement for attribute assignments? --------------------------------------------------------------------- Python has a 'with' statement that wraps the execution of a block, calling code -on the entrance and exit from the block. Some language have a construct that +on the entrance and exit from the block. Some languages have a construct that looks like this:: with obj: diff --git a/Doc/faq/general.rst b/Doc/faq/general.rst index eee3c3c203efa5c5006c96f26a4ec62dab1645f7..cf70f16c6fe3281493332e8d4ebec11b5f005647 100644 --- a/Doc/faq/general.rst +++ b/Doc/faq/general.rst @@ -142,9 +142,9 @@ to fix critical bugs. Alpha, beta and release candidate versions have an additional suffix. The suffix for an alpha version is "aN" for some small number N, the suffix for a beta version is "bN" for some small number N, and the suffix for a release -candidate version is "cN" for some small number N. In other words, all versions +candidate version is "rcN" for some small number N. In other words, all versions labeled 2.0aN precede the versions labeled 2.0bN, which precede versions labeled -2.0cN, and *those* precede 2.0. +2.0rcN, and *those* precede 2.0. You may also find version numbers with a "+" suffix, e.g. "2.2+". These are unreleased versions, built directly from the CPython development repository. In @@ -309,8 +309,8 @@ releases. The latest stable releases can always be found on the `Python download page `_. There are two production-ready versions of Python: 2.x and 3.x. The recommended version is 3.x, which is supported by -most widely used libraries. Although 2.x is still widely used, `it will not -be maintained after January 1, 2020 `_. +most widely used libraries. Although 2.x is still widely used, `it is not +maintained anymore `_. How many people are using Python? --------------------------------- diff --git a/Doc/faq/library.rst b/Doc/faq/library.rst index ab92a879a8851617accefcf9c4cf11f5442054a5..97058b5806a35c30d34b4568d9f1073902769983 100644 --- a/Doc/faq/library.rst +++ b/Doc/faq/library.rst @@ -125,7 +125,7 @@ argument list. It is called as :: handler(signum, frame) -so it should be declared with two arguments:: +so it should be declared with two parameters:: def handler(signum, frame): ... @@ -159,9 +159,9 @@ The "global main logic" of your program may be as simple as :: at the bottom of the main module of your program. -Once your program is organized as a tractable collection of functions and class -behaviours you should write test functions that exercise the behaviours. A test -suite that automates a sequence of tests can be associated with each module. +Once your program is organized as a tractable collection of function and class +behaviours, you should write test functions that exercise the behaviours. A +test suite that automates a sequence of tests can be associated with each module. This sounds like a lot of work, but since Python is so terse and flexible it's surprisingly easy. You can make coding much more pleasant and fun by writing your test functions in parallel with the "production code", since this makes it @@ -295,7 +295,7 @@ queue as there are threads. How do I parcel out work among a bunch of worker threads? --------------------------------------------------------- -The easiest way is to use the new :mod:`concurrent.futures` module, +The easiest way is to use the :mod:`concurrent.futures` module, especially the :mod:`~concurrent.futures.ThreadPoolExecutor` class. Or, if you want fine control over the dispatching algorithm, you can write @@ -679,7 +679,7 @@ How can I mimic CGI form submission (METHOD=POST)? I would like to retrieve web pages that are the result of POSTing a form. Is there existing code that would let me do this easily? -Yes. Here's a simple example that uses urllib.request:: +Yes. Here's a simple example that uses :mod:`urllib.request`:: #!/usr/local/bin/python @@ -765,20 +765,21 @@ The :mod:`select` module is commonly used to help with asynchronous I/O on sockets. To prevent the TCP connect from blocking, you can set the socket to non-blocking -mode. Then when you do the ``connect()``, you will either connect immediately +mode. Then when you do the :meth:`socket.connect`, you will either connect immediately (unlikely) or get an exception that contains the error number as ``.errno``. ``errno.EINPROGRESS`` indicates that the connection is in progress, but hasn't finished yet. Different OSes will return different values, so you're going to have to check what's returned on your system. -You can use the ``connect_ex()`` method to avoid creating an exception. It will -just return the errno value. To poll, you can call ``connect_ex()`` again later +You can use the :meth:`socket.connect_ex` method to avoid creating an exception. It will +just return the errno value. To poll, you can call :meth:`socket.connect_ex` again later -- ``0`` or ``errno.EISCONN`` indicate that you're connected -- or you can pass this -socket to select to check if it's writable. +socket to :meth:`select.select` to check if it's writable. .. note:: - The :mod:`asyncore` module presents a framework-like approach to the problem - of writing non-blocking networking code. + The :mod:`asyncio` module provides a general purpose single-threaded and + concurrent asynchronous library, which can be used for writing non-blocking + network code. The third-party `Twisted `_ library is a popular and feature-rich alternative. @@ -832,8 +833,8 @@ There are also many other specialized generators in this module, such as: Some higher-level functions operate on sequences directly, such as: -* ``choice(S)`` chooses random element from a given sequence -* ``shuffle(L)`` shuffles a list in-place, i.e. permutes it randomly +* ``choice(S)`` chooses a random element from a given sequence. +* ``shuffle(L)`` shuffles a list in-place, i.e. permutes it randomly. There's also a ``Random`` class you can instantiate to create independent multiple random number generators. diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index 6cc1b52ed7b98bfcbf40eb746c7d598119b4fa01..8df62c56045979b9abe2de22ab3d83b6055408f1 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -35,12 +35,6 @@ for Windows Extensions `__ project an as a part of the ActivePython distribution (see https://www.activestate.com/activepython\ ). -`Boa Constructor `_ is an IDE and GUI -builder that uses wxWidgets. It offers visual frame creation and manipulation, -an object inspector, many views on the source like object browsers, inheritance -hierarchies, doc string generated html documentation, an advanced debugger, -integrated help, and Zope support. - `Eric `_ is an IDE built on PyQt and the Scintilla editing component. @@ -57,22 +51,14 @@ They include: * PyCharm (https://www.jetbrains.com/pycharm/) -Is there a tool to help find bugs or perform static analysis? +Are there tools to help find bugs or perform static analysis? ------------------------------------------------------------- Yes. -PyChecker is a static analysis tool that finds bugs in Python source code and -warns about code complexity and style. You can get PyChecker from -http://pychecker.sourceforge.net/. - -`Pylint `_ is another tool that checks -if a module satisfies a coding standard, and also makes it possible to write -plug-ins to add a custom feature. In addition to the bug checking that -PyChecker performs, Pylint offers some additional features such as checking line -length, whether variable names are well-formed according to your coding -standard, whether declared interfaces are fully implemented, and more. -https://docs.pylint.org/ provides a full list of Pylint's features. +`Pylint `_ and +`Pyflakes `_ do basic checking that will +help you catch bugs sooner. Static type checkers such as `Mypy `_, `Pyre `_, and @@ -518,14 +504,14 @@ desired effect in a number of ways. 1) By returning a tuple of the results:: - def func2(a, b): - a = 'new-value' # a and b are local names - b = b + 1 # assigned to new objects - return a, b # return new values - - x, y = 'old-value', 99 - x, y = func2(x, y) - print(x, y) # output: new-value 100 + >>> def func1(a, b): + ... a = 'new-value' # a and b are local names + ... b = b + 1 # assigned to new objects + ... return a, b # return new values + ... + >>> x, y = 'old-value', 99 + >>> func1(x, y) + ('new-value', 100) This is almost always the clearest solution. @@ -533,38 +519,41 @@ desired effect in a number of ways. 3) By passing a mutable (changeable in-place) object:: - def func1(a): - a[0] = 'new-value' # 'a' references a mutable list - a[1] = a[1] + 1 # changes a shared object - - args = ['old-value', 99] - func1(args) - print(args[0], args[1]) # output: new-value 100 + >>> def func2(a): + ... a[0] = 'new-value' # 'a' references a mutable list + ... a[1] = a[1] + 1 # changes a shared object + ... + >>> args = ['old-value', 99] + >>> func2(args) + >>> args + ['new-value', 100] 4) By passing in a dictionary that gets mutated:: - def func3(args): - args['a'] = 'new-value' # args is a mutable dictionary - args['b'] = args['b'] + 1 # change it in-place - - args = {'a': 'old-value', 'b': 99} - func3(args) - print(args['a'], args['b']) + >>> def func3(args): + ... args['a'] = 'new-value' # args is a mutable dictionary + ... args['b'] = args['b'] + 1 # change it in-place + ... + >>> args = {'a': 'old-value', 'b': 99} + >>> func3(args) + >>> args + {'a': 'new-value', 'b': 100} 5) Or bundle up values in a class instance:: - class callByRef: - def __init__(self, /, **args): - for key, value in args.items(): - setattr(self, key, value) - - def func4(args): - args.a = 'new-value' # args is a mutable callByRef - args.b = args.b + 1 # change object in-place - - args = callByRef(a='old-value', b=99) - func4(args) - print(args.a, args.b) + >>> class Namespace: + ... def __init__(self, /, **args): + ... for key, value in args.items(): + ... setattr(self, key, value) + ... + >>> def func4(args): + ... args.a = 'new-value' # args is a mutable Namespace + ... args.b = args.b + 1 # change object in-place + ... + >>> args = Namespace(a='old-value', b=99) + >>> func4(args) + >>> vars(args) + {'a': 'new-value', 'b': 100} There's almost never a good reason to get this complicated. @@ -851,10 +840,11 @@ For integers, use the built-in :func:`int` type constructor, e.g. ``int('144') e.g. ``float('144') == 144.0``. By default, these interpret the number as decimal, so that ``int('0144') == -144`` and ``int('0x144')`` raises :exc:`ValueError`. ``int(string, base)`` takes -the base to convert from as a second optional argument, so ``int('0x144', 16) == -324``. If the base is specified as 0, the number is interpreted using Python's -rules: a leading '0o' indicates octal, and '0x' indicates a hex number. +144`` holds true, and ``int('0x144')`` raises :exc:`ValueError`. ``int(string, +base)`` takes the base to convert from as a second optional argument, so ``int( +'0x144', 16) == 324``. If the base is specified as 0, the number is interpreted +using Python's rules: a leading '0o' indicates octal, and '0x' indicates a hex +number. Do not use the built-in function :func:`eval` if all you need is to convert strings to numbers. :func:`eval` will be significantly slower and it presents a @@ -952,7 +942,7 @@ There are various techniques. f() -* Use :func:`locals` or :func:`eval` to resolve the function name:: +* Use :func:`locals` to resolve the function name:: def myFunc(): print("hello") @@ -962,12 +952,6 @@ There are various techniques. f = locals()[fname] f() - f = eval(fname) - f() - - Note: Using :func:`eval` is slow and dangerous. If you don't have absolute - control over the contents of the string, someone could pass a string that - resulted in an arbitrary function being executed. Is there an equivalent to Perl's chomp() for removing trailing newlines from strings? ------------------------------------------------------------------------------------- @@ -1132,7 +1116,7 @@ trailing newline from a string. How do I iterate over a sequence in reverse order? -------------------------------------------------- -Use the :func:`reversed` built-in function, which is new in Python 2.4:: +Use the :func:`reversed` built-in function:: for x in reversed(sequence): ... # do something with x ... @@ -1140,11 +1124,6 @@ Use the :func:`reversed` built-in function, which is new in Python 2.4:: This won't touch your original sequence, but build a new copy with reversed order to iterate over. -With Python 2.3, you can use an extended slice syntax:: - - for x in sequence[::-1]: - ... # do something with x ... - How do you remove duplicates from a list? ----------------------------------------- @@ -1174,6 +1153,21 @@ This converts the list into a set, thereby removing duplicates, and then back into a list. +How do you remove multiple items from a list +-------------------------------------------- + +As with removing duplicates, explicitly iterating in reverse with a +delete condition is one possibility. However, it is easier and faster +to use slice replacement with an implicit or explicit forward iteration. +Here are three variations.:: + + mylist[:] = filter(keep_function, mylist) + mylist[:] = (x for x in mylist if keep_condition) + mylist[:] = [x for x in mylist if keep_condition] + +The list comprehension may be fastest. + + How do you make an array in Python? ----------------------------------- @@ -1376,20 +1370,6 @@ out the element you want. :: ['else', 'sort', 'to', 'something'] -An alternative for the last step is:: - - >>> result = [] - >>> for p in pairs: result.append(p[1]) - -If you find this more legible, you might prefer to use this instead of the final -list comprehension. However, it is almost twice as slow for long lists. Why? -First, the ``append()`` operation has to reallocate memory, and while it uses -some tricks to avoid doing that each time, it still has to do it occasionally, -and that costs quite a bit. Second, the expression "result.append" requires an -extra attribute lookup, and third, there's a speed reduction from having to make -all those function calls. - - Objects ======= @@ -1533,18 +1513,18 @@ provide the ``self`` argument. How can I organize my code to make it easier to change the base class? ---------------------------------------------------------------------- -You could define an alias for the base class, assign the real base class to it -before your class definition, and use the alias throughout your class. Then all +You could assign the base class to an alias and derive from the alias. Then all you have to change is the value assigned to the alias. Incidentally, this trick is also handy if you want to decide dynamically (e.g. depending on availability of resources) which base class to use. Example:: - BaseAlias = + class Base: + ... + + BaseAlias = Base class Derived(BaseAlias): - def meth(self): - BaseAlias.meth(self) - ... + ... How do I create static class data and static class methods? diff --git a/Doc/faq/windows.rst b/Doc/faq/windows.rst index a181086e9ce6271b38f3316471de2417e010e3b9..c8e9c5fb670301b4965696ddbfa5bb66e8d431f2 100644 --- a/Doc/faq/windows.rst +++ b/Doc/faq/windows.rst @@ -140,7 +140,7 @@ offender. How do I make an executable from a Python script? ------------------------------------------------- -See `cx_Freeze `_ for a distutils extension +See `cx_Freeze `_ for a distutils extension that allows you to create console and GUI executables from Python code. `py2exe `_, the most popular extension for building Python 2.x-based executables, does not yet support Python 3 but a version that @@ -279,7 +279,7 @@ in batch mode. How do I check for a keypress without blocking? ----------------------------------------------- -Use the msvcrt module. This is a standard Windows-specific extension module. +Use the :mod:`msvcrt` module. This is a standard Windows-specific extension module. It defines a function ``kbhit()`` which checks whether a keyboard hit is present, and ``getch()`` which gets one character without echoing it. diff --git a/Doc/glossary.rst b/Doc/glossary.rst index e997d366777b384390a3a57129319ef3db6bf293..4fd01e0160c26ca83c1c665cdbe2dcc001a68c22 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -301,13 +301,20 @@ Glossary including functions, methods, properties, class methods, static methods, and reference to super classes. - For more information about descriptors' methods, see :ref:`descriptors`. + For more information about descriptors' methods, see :ref:`descriptors` + or the :ref:`Descriptor How To Guide `. dictionary An associative array, where arbitrary keys are mapped to values. The keys can be any object with :meth:`__hash__` and :meth:`__eq__` methods. Called a hash in Perl. + dictionary comprehension + A compact way to process all or part of the elements in an iterable and + return a dictionary with the results. ``results = {n: n ** 2 for n in + range(10)}`` generates a dictionary containing key ``n`` mapped to + value ``n ** 2``. See :ref:`comprehensions`. + dictionary view The objects returned from :meth:`dict.keys`, :meth:`dict.values`, and :meth:`dict.items` are called dictionary views. They provide a dynamic @@ -476,6 +483,13 @@ Glossary See also the :term:`single dispatch` glossary entry, the :func:`functools.singledispatch` decorator, and :pep:`443`. + generic type + A :term:`type` that can be parameterized; typically a container like + :class:`list`. Used for :term:`type hints ` and + :term:`annotations `. + + See :pep:`483` for more details, and :mod:`typing` or + :ref:`generic alias type ` for its uses. GIL See :term:`global interpreter lock`. @@ -587,7 +601,7 @@ Glossary and :class:`tuple`) and some non-sequence types like :class:`dict`, :term:`file objects `, and objects of any classes you define with an :meth:`__iter__` method or with a :meth:`__getitem__` method - that implements :term:`Sequence` semantics. + that implements :term:`Sequence ` semantics. Iterables can be used in a :keyword:`for` loop and in many other places where a sequence is @@ -1024,7 +1038,13 @@ Glossary :meth:`index`, :meth:`__contains__`, and :meth:`__reversed__`. Types that implement this expanded interface can be registered explicitly using - :func:`~abc.register`. + :func:`~abc.ABCMeta.register`. + + set comprehension + A compact way to process all or part of the elements in an iterable and + return a set with the results. ``results = {c for c in 'abracadabra' if + c not in 'abc'}`` generates the set of strings ``{'r', 'd'}``. See + :ref:`comprehensions`. single dispatch A form of :term:`generic function` dispatch where the implementation is @@ -1084,19 +1104,15 @@ Glossary Type aliases are useful for simplifying :term:`type hints `. For example:: - from typing import List, Tuple - def remove_gray_shades( - colors: List[Tuple[int, int, int]]) -> List[Tuple[int, int, int]]: + colors: list[tuple[int, int, int]]) -> list[tuple[int, int, int]]: pass could be made more readable like this:: - from typing import List, Tuple - - Color = Tuple[int, int, int] + Color = tuple[int, int, int] - def remove_gray_shades(colors: List[Color]) -> List[Color]: + def remove_gray_shades(colors: list[Color]) -> list[Color]: pass See :mod:`typing` and :pep:`484`, which describe this functionality. diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index 9856e6caec09286421c91d4d82622a7ddce48c9d..0f999c95596aafe51cc37d221efb286c896ce1f6 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -1,3 +1,5 @@ +.. _descriptorhowto: + ====================== Descriptor HowTo Guide ====================== @@ -7,45 +9,514 @@ Descriptor HowTo Guide .. Contents:: + +:term:`Descriptors ` let objects customize attribute lookup, +storage, and deletion. + +This guide has four major sections: + +1) The "primer" gives a basic overview, moving gently from simple examples, + adding one feature at a time. Start here if you're new to descriptors. + +2) The second section shows a complete, practical descriptor example. If you + already know the basics, start there. + +3) The third section provides a more technical tutorial that goes into the + detailed mechanics of how descriptors work. Most people don't need this + level of detail. + +4) The last section has pure Python equivalents for built-in descriptors that + are written in C. Read this if you're curious about how functions turn + into bound methods or about the implementation of common tools like + :func:`classmethod`, :func:`staticmethod`, :func:`property`, and + :term:`__slots__`. + + +Primer +^^^^^^ + +In this primer, we start with the most basic possible example and then we'll +add new capabilities one by one. + + +Simple example: A descriptor that returns a constant +---------------------------------------------------- + +The :class:`Ten` class is a descriptor that always returns the constant ``10`` +from its :meth:`__get__` method: + +.. testcode:: + + class Ten: + def __get__(self, obj, objtype=None): + return 10 + +To use the descriptor, it must be stored as a class variable in another class: + +.. testcode:: + + class A: + x = 5 # Regular class attribute + y = Ten() # Descriptor instance + +An interactive session shows the difference between normal attribute lookup +and descriptor lookup: + +.. doctest:: + + >>> a = A() # Make an instance of class A + >>> a.x # Normal attribute lookup + 5 + >>> a.y # Descriptor lookup + 10 + +In the ``a.x`` attribute lookup, the dot operator finds the key ``x`` and the +value ``5`` in the class dictionary. In the ``a.y`` lookup, the dot operator +finds a descriptor instance, recognized by its ``__get__`` method, and calls +that method which returns ``10``. + +Note that the value ``10`` is not stored in either the class dictionary or the +instance dictionary. Instead, the value ``10`` is computed on demand. + +This example shows how a simple descriptor works, but it isn't very useful. +For retrieving constants, normal attribute lookup would be better. + +In the next section, we'll create something more useful, a dynamic lookup. + + +Dynamic lookups +--------------- + +Interesting descriptors typically run computations instead of returning +constants: + +.. testcode:: + + import os + + class DirectorySize: + + def __get__(self, obj, objtype=None): + return len(os.listdir(obj.dirname)) + + class Directory: + + size = DirectorySize() # Descriptor instance + + def __init__(self, dirname): + self.dirname = dirname # Regular instance attribute + +An interactive session shows that the lookup is dynamic — it computes +different, updated answers each time:: + + >>> s = Directory('songs') + >>> g = Directory('games') + >>> s.size # The songs directory has twenty files + 20 + >>> g.size # The games directory has three files + 3 + >>> open('games/newfile').close() # Add a fourth file to the directory + >>> g.size # File count is automatically updated + 4 + +Besides showing how descriptors can run computations, this example also +reveals the purpose of the parameters to :meth:`__get__`. The *self* +parameter is *size*, an instance of *DirectorySize*. The *obj* parameter is +either *g* or *s*, an instance of *Directory*. It is the *obj* parameter that +lets the :meth:`__get__` method learn the target directory. The *objtype* +parameter is the class *Directory*. + + +Managed attributes +------------------ + +A popular use for descriptors is managing access to instance data. The +descriptor is assigned to a public attribute in the class dictionary while the +actual data is stored as a private attribute in the instance dictionary. The +descriptor's :meth:`__get__` and :meth:`__set__` methods are triggered when +the public attribute is accessed. + +In the following example, *age* is the public attribute and *_age* is the +private attribute. When the public attribute is accessed, the descriptor logs +the lookup or update: + +.. testcode:: + + import logging + + logging.basicConfig(level=logging.INFO) + + class LoggedAgeAccess: + + def __get__(self, obj, objtype=None): + value = obj._age + logging.info('Accessing %r giving %r', 'age', value) + return value + + def __set__(self, obj, value): + logging.info('Updating %r to %r', 'age', value) + obj._age = value + + class Person: + + age = LoggedAgeAccess() # Descriptor instance + + def __init__(self, name, age): + self.name = name # Regular instance attribute + self.age = age # Calls __set__() + + def birthday(self): + self.age += 1 # Calls both __get__() and __set__() + + +An interactive session shows that all access to the managed attribute *age* is +logged, but that the regular attribute *name* is not logged: + +.. testcode:: + :hide: + + import logging, sys + logging.basicConfig(level=logging.INFO, stream=sys.stdout, force=True) + +.. doctest:: + + >>> mary = Person('Mary M', 30) # The initial age update is logged + INFO:root:Updating 'age' to 30 + >>> dave = Person('David D', 40) + INFO:root:Updating 'age' to 40 + + >>> vars(mary) # The actual data is in a private attribute + {'name': 'Mary M', '_age': 30} + >>> vars(dave) + {'name': 'David D', '_age': 40} + + >>> mary.age # Access the data and log the lookup + INFO:root:Accessing 'age' giving 30 + 30 + >>> mary.birthday() # Updates are logged as well + INFO:root:Accessing 'age' giving 30 + INFO:root:Updating 'age' to 31 + + >>> dave.name # Regular attribute lookup isn't logged + 'David D' + >>> dave.age # Only the managed attribute is logged + INFO:root:Accessing 'age' giving 40 + 40 + +One major issue with this example is that the private name *_age* is hardwired in +the *LoggedAgeAccess* class. That means that each instance can only have one +logged attribute and that its name is unchangeable. In the next example, +we'll fix that problem. + + +Customized names +---------------- + +When a class uses descriptors, it can inform each descriptor about which +variable name was used. + +In this example, the :class:`Person` class has two descriptor instances, +*name* and *age*. When the :class:`Person` class is defined, it makes a +callback to :meth:`__set_name__` in *LoggedAccess* so that the field names can +be recorded, giving each descriptor its own *public_name* and *private_name*: + +.. testcode:: + + import logging + + logging.basicConfig(level=logging.INFO) + + class LoggedAccess: + + def __set_name__(self, owner, name): + self.public_name = name + self.private_name = '_' + name + + def __get__(self, obj, objtype=None): + value = getattr(obj, self.private_name) + logging.info('Accessing %r giving %r', self.public_name, value) + return value + + def __set__(self, obj, value): + logging.info('Updating %r to %r', self.public_name, value) + setattr(obj, self.private_name, value) + + class Person: + + name = LoggedAccess() # First descriptor instance + age = LoggedAccess() # Second descriptor instance + + def __init__(self, name, age): + self.name = name # Calls the first descriptor + self.age = age # Calls the second descriptor + + def birthday(self): + self.age += 1 + +An interactive session shows that the :class:`Person` class has called +:meth:`__set_name__` so that the field names would be recorded. Here +we call :func:`vars` to look up the descriptor without triggering it: + +.. doctest:: + + >>> vars(vars(Person)['name']) + {'public_name': 'name', 'private_name': '_name'} + >>> vars(vars(Person)['age']) + {'public_name': 'age', 'private_name': '_age'} + +The new class now logs access to both *name* and *age*: + +.. testcode:: + :hide: + + import logging, sys + logging.basicConfig(level=logging.INFO, stream=sys.stdout, force=True) + +.. doctest:: + + >>> pete = Person('Peter P', 10) + INFO:root:Updating 'name' to 'Peter P' + INFO:root:Updating 'age' to 10 + >>> kate = Person('Catherine C', 20) + INFO:root:Updating 'name' to 'Catherine C' + INFO:root:Updating 'age' to 20 + +The two *Person* instances contain only the private names:: + + >>> vars(pete) + {'_name': 'Peter P', '_age': 10} + >>> vars(kate) + {'_name': 'Catherine C', '_age': 20} + + +Closing thoughts +---------------- + +A :term:`descriptor` is what we call any object that defines :meth:`__get__`, +:meth:`__set__`, or :meth:`__delete__`. + +Optionally, descriptors can have a :meth:`__set_name__` method. This is only +used in cases where a descriptor needs to know either the class where it was +created or the name of class variable it was assigned to. (This method, if +present, is called even if the class is not a descriptor.) + +Descriptors get invoked by the dot "operator" during attribute lookup. If a +descriptor is accessed indirectly with ``vars(some_class)[descriptor_name]``, +the descriptor instance is returned without invoking it. + +Descriptors only work when used as class variables. When put in instances, +they have no effect. + +The main motivation for descriptors is to provide a hook allowing objects +stored in class variables to control what happens during attribute lookup. + +Traditionally, the calling class controls what happens during lookup. +Descriptors invert that relationship and allow the data being looked-up to +have a say in the matter. + +Descriptors are used throughout the language. It is how functions turn into +bound methods. Common tools like :func:`classmethod`, :func:`staticmethod`, +:func:`property`, and :func:`functools.cached_property` are all implemented as +descriptors. + + +Complete Practical Example +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this example, we create a practical and powerful tool for locating +notoriously hard to find data corruption bugs. + + +Validator class +--------------- + +A validator is a descriptor for managed attribute access. Prior to storing +any data, it verifies that the new value meets various type and range +restrictions. If those restrictions aren't met, it raises an exception to +prevent data corruption at its source. + +This :class:`Validator` class is both an :term:`abstract base class` and a +managed attribute descriptor: + +.. testcode:: + + from abc import ABC, abstractmethod + + class Validator(ABC): + + def __set_name__(self, owner, name): + self.private_name = '_' + name + + def __get__(self, obj, objtype=None): + return getattr(obj, self.private_name) + + def __set__(self, obj, value): + self.validate(value) + setattr(obj, self.private_name, value) + + @abstractmethod + def validate(self, value): + pass + +Custom validators need to inherit from :class:`Validator` and must supply a +:meth:`validate` method to test various restrictions as needed. + + +Custom validators +----------------- + +Here are three practical data validation utilities: + +1) :class:`OneOf` verifies that a value is one of a restricted set of options. + +2) :class:`Number` verifies that a value is either an :class:`int` or + :class:`float`. Optionally, it verifies that a value is between a given + minimum or maximum. + +3) :class:`String` verifies that a value is a :class:`str`. Optionally, it + validates a given minimum or maximum length. It can validate a + user-defined `predicate + `_ as well. + +.. testcode:: + + class OneOf(Validator): + + def __init__(self, *options): + self.options = set(options) + + def validate(self, value): + if value not in self.options: + raise ValueError(f'Expected {value!r} to be one of {self.options!r}') + + class Number(Validator): + + def __init__(self, minvalue=None, maxvalue=None): + self.minvalue = minvalue + self.maxvalue = maxvalue + + def validate(self, value): + if not isinstance(value, (int, float)): + raise TypeError(f'Expected {value!r} to be an int or float') + if self.minvalue is not None and value < self.minvalue: + raise ValueError( + f'Expected {value!r} to be at least {self.minvalue!r}' + ) + if self.maxvalue is not None and value > self.maxvalue: + raise ValueError( + f'Expected {value!r} to be no more than {self.maxvalue!r}' + ) + + class String(Validator): + + def __init__(self, minsize=None, maxsize=None, predicate=None): + self.minsize = minsize + self.maxsize = maxsize + self.predicate = predicate + + def validate(self, value): + if not isinstance(value, str): + raise TypeError(f'Expected {value!r} to be an str') + if self.minsize is not None and len(value) < self.minsize: + raise ValueError( + f'Expected {value!r} to be no smaller than {self.minsize!r}' + ) + if self.maxsize is not None and len(value) > self.maxsize: + raise ValueError( + f'Expected {value!r} to be no bigger than {self.maxsize!r}' + ) + if self.predicate is not None and not self.predicate(value): + raise ValueError( + f'Expected {self.predicate} to be true for {value!r}' + ) + + +Practical application +--------------------- + +Here's how the data validators can be used in a real class: + +.. testcode:: + + class Component: + + name = String(minsize=3, maxsize=10, predicate=str.isupper) + kind = OneOf('wood', 'metal', 'plastic') + quantity = Number(minvalue=0) + + def __init__(self, name, kind, quantity): + self.name = name + self.kind = kind + self.quantity = quantity + +The descriptors prevent invalid instances from being created: + +.. doctest:: + + >>> Component('Widget', 'metal', 5) # Blocked: 'Widget' is not all uppercase + Traceback (most recent call last): + ... + ValueError: Expected to be true for 'Widget' + + >>> Component('WIDGET', 'metle', 5) # Blocked: 'metle' is misspelled + Traceback (most recent call last): + ... + ValueError: Expected 'metle' to be one of {'metal', 'plastic', 'wood'} + + >>> Component('WIDGET', 'metal', -5) # Blocked: -5 is negative + Traceback (most recent call last): + ... + ValueError: Expected -5 to be at least 0 + >>> Component('WIDGET', 'metal', 'V') # Blocked: 'V' isn't a number + Traceback (most recent call last): + ... + TypeError: Expected 'V' to be an int or float + + >>> c = Component('WIDGET', 'metal', 5) # Allowed: The inputs are valid + + +Technical Tutorial +^^^^^^^^^^^^^^^^^^ + +What follows is a more technical tutorial for the mechanics and details of how +descriptors work. + + Abstract -------- Defines descriptors, summarizes the protocol, and shows how descriptors are -called. Examines a custom descriptor and several built-in Python descriptors -including functions, properties, static methods, and class methods. Shows how -each works by giving a pure Python equivalent and a sample application. +called. Provides an example showing how object relational mappings work. Learning about descriptors not only provides access to a larger toolset, it -creates a deeper understanding of how Python works and an appreciation for the -elegance of its design. +creates a deeper understanding of how Python works. -Definition and Introduction +Definition and introduction --------------------------- -In general, a descriptor is an object attribute with "binding behavior", one -whose attribute access has been overridden by methods in the descriptor -protocol. Those methods are :meth:`__get__`, :meth:`__set__`, and -:meth:`__delete__`. If any of those methods are defined for an object, it is -said to be a descriptor. +In general, a descriptor is an attribute value that has one of the methods in +the descriptor protocol. Those methods are :meth:`__get__`, :meth:`__set__`, +and :meth:`__delete__`. If any of those methods are defined for an +attribute, it is said to be a :term:`descriptor`. The default behavior for attribute access is to get, set, or delete the attribute from an object's dictionary. For instance, ``a.x`` has a lookup chain starting with ``a.__dict__['x']``, then ``type(a).__dict__['x']``, and -continuing through the base classes of ``type(a)`` excluding metaclasses. If the +continuing through the method resolution order of ``type(a)``. If the looked-up value is an object defining one of the descriptor methods, then Python may override the default behavior and invoke the descriptor method instead. Where this occurs in the precedence chain depends on which descriptor methods were defined. Descriptors are a powerful, general purpose protocol. They are the mechanism -behind properties, methods, static methods, class methods, and :func:`super()`. -They are used throughout Python itself to implement the new style classes -introduced in version 2.2. Descriptors simplify the underlying C-code and offer -a flexible set of new tools for everyday Python programs. +behind properties, methods, static methods, class methods, and +:func:`super()`. They are used throughout Python itself. Descriptors +simplify the underlying C code and offer a flexible set of new tools for +everyday Python programs. -Descriptor Protocol +Descriptor protocol ------------------- ``descr.__get__(self, obj, type=None) -> value`` @@ -60,7 +531,7 @@ as an attribute. If an object defines :meth:`__set__` or :meth:`__delete__`, it is considered a data descriptor. Descriptors that only define :meth:`__get__` are called -non-data descriptors (they are typically used for methods but other uses are +non-data descriptors (they are often used for methods but other uses are possible). Data and non-data descriptors differ in how overrides are calculated with @@ -75,135 +546,385 @@ called. Defining the :meth:`__set__` method with an exception raising placeholder is enough to make it a data descriptor. -Invoking Descriptors --------------------- +Overview of descriptor invocation +--------------------------------- + +A descriptor can be called directly with ``desc.__get__(obj)`` or +``desc.__get__(None, cls)``. + +But it is more common for a descriptor to be invoked automatically from +attribute access. + +The expression ``obj.x`` looks up the attribute ``x`` in the chain of +namespaces for ``obj``. If the search finds a descriptor outside of the +instance ``__dict__``, its :meth:`__get__` method is invoked according to the +precedence rules listed below. + +The details of invocation depend on whether ``obj`` is an object, class, or +instance of super. + + +Invocation from an instance +--------------------------- + +Instance lookup scans through a chain of namespaces giving data descriptors +the highest priority, followed by instance variables, then non-data +descriptors, then class variables, and lastly :meth:`__getattr__` if it is +provided. -A descriptor can be called directly by its method name. For example, -``d.__get__(obj)``. +If a descriptor is found for ``a.x``, then it is invoked with: +``desc.__get__(a, type(a))``. -Alternatively, it is more common for a descriptor to be invoked automatically -upon attribute access. For example, ``obj.d`` looks up ``d`` in the dictionary -of ``obj``. If ``d`` defines the method :meth:`__get__`, then ``d.__get__(obj)`` -is invoked according to the precedence rules listed below. +The logic for a dotted lookup is in :meth:`object.__getattribute__`. Here is +a pure Python equivalent: -The details of invocation depend on whether ``obj`` is an object or a class. +.. testcode:: + + def object_getattribute(obj, name): + "Emulate PyObject_GenericGetAttr() in Objects/object.c" + null = object() + objtype = type(obj) + cls_var = getattr(objtype, name, null) + descr_get = getattr(type(cls_var), '__get__', null) + if descr_get is not null: + if (hasattr(type(cls_var), '__set__') + or hasattr(type(cls_var), '__delete__')): + return descr_get(cls_var, obj, objtype) # data descriptor + if hasattr(obj, '__dict__') and name in vars(obj): + return vars(obj)[name] # instance variable + if descr_get is not null: + return descr_get(cls_var, obj, objtype) # non-data descriptor + if cls_var is not null: + return cls_var # class variable + raise AttributeError(name) -For objects, the machinery is in :meth:`object.__getattribute__` which -transforms ``b.x`` into ``type(b).__dict__['x'].__get__(b, type(b))``. The -implementation works through a precedence chain that gives data descriptors -priority over instance variables, instance variables priority over non-data -descriptors, and assigns lowest priority to :meth:`__getattr__` if provided. -The full C implementation can be found in :c:func:`PyObject_GenericGetAttr()` in -:source:`Objects/object.c`. -For classes, the machinery is in :meth:`type.__getattribute__` which transforms -``B.x`` into ``B.__dict__['x'].__get__(None, B)``. In pure Python, it looks -like:: +.. testcode:: + :hide: - def __getattribute__(self, key): - "Emulate type_getattro() in Objects/typeobject.c" - v = object.__getattribute__(self, key) - if hasattr(v, '__get__'): - return v.__get__(None, self) - return v + # Test the fidelity of object_getattribute() by comparing it with the + # normal object.__getattribute__(). The former will be accessed by + # square brackets and the latter by the dot operator. + + class Object: + + def __getitem__(obj, name): + try: + return object_getattribute(obj, name) + except AttributeError: + if not hasattr(type(obj), '__getattr__'): + raise + return type(obj).__getattr__(obj, name) # __getattr__ + + class DualOperator(Object): + + x = 10 + + def __init__(self, z): + self.z = z + + @property + def p2(self): + return 2 * self.x + + @property + def p3(self): + return 3 * self.x + + def m5(self, y): + return 5 * y + + def m7(self, y): + return 7 * y + + def __getattr__(self, name): + return ('getattr_hook', self, name) + + class DualOperatorWithSlots: + + __getitem__ = Object.__getitem__ + + __slots__ = ['z'] + + x = 15 + + def __init__(self, z): + self.z = z + + @property + def p2(self): + return 2 * self.x + + def m5(self, y): + return 5 * y + + def __getattr__(self, name): + return ('getattr_hook', self, name) + + +.. doctest:: + :hide: + + >>> a = DualOperator(11) + >>> vars(a).update(p3 = '_p3', m7 = '_m7') + >>> a.x == a['x'] == 10 + True + >>> a.z == a['z'] == 11 + True + >>> a.p2 == a['p2'] == 20 + True + >>> a.p3 == a['p3'] == 30 + True + >>> a.m5(100) == a.m5(100) == 500 + True + >>> a.m7 == a['m7'] == '_m7' + True + >>> a.g == a['g'] == ('getattr_hook', a, 'g') + True + + >>> b = DualOperatorWithSlots(22) + >>> b.x == b['x'] == 15 + True + >>> b.z == b['z'] == 22 + True + >>> b.p2 == b['p2'] == 30 + True + >>> b.m5(200) == b['m5'](200) == 1000 + True + >>> b.g == b['g'] == ('getattr_hook', b, 'g') + True + + +Interestingly, attribute lookup doesn't call :meth:`object.__getattribute__` +directly. Instead, both the dot operator and the :func:`getattr` function +perform attribute lookup by way of a helper function: + +.. testcode:: + + def getattr_hook(obj, name): + "Emulate slot_tp_getattr_hook() in Objects/typeobject.c" + try: + return obj.__getattribute__(name) + except AttributeError: + if not hasattr(type(obj), '__getattr__'): + raise + return type(obj).__getattr__(obj, name) # __getattr__ + +So if :meth:`__getattr__` exists, it is called whenever :meth:`__getattribute__` +raises :exc:`AttributeError` (either directly or in one of the descriptor calls). + +Also, if a user calls :meth:`object.__getattribute__` directly, the +:meth:`__getattr__` hook is bypassed entirely. + + +Invocation from a class +----------------------- + +The logic for a dotted lookup such as ``A.x`` is in +:meth:`type.__getattribute__`. The steps are similar to those for +:meth:`object.__getattribute__` but the instance dictionary lookup is replaced +by a search through the class's :term:`method resolution order`. + +If a descriptor is found, it is invoked with ``desc.__get__(None, A)``. + +The full C implementation can be found in :c:func:`type_getattro()` and +:c:func:`_PyType_Lookup()` in :source:`Objects/typeobject.c`. + + +Invocation from super +--------------------- + +The logic for super's dotted lookup is in the :meth:`__getattribute__` method for +object returned by :class:`super()`. + +A dotted lookup such as ``super(A, obj).m`` searches ``obj.__class__.__mro__`` +for the base class ``B`` immediately following ``A`` and then returns +``B.__dict__['m'].__get__(obj, A)``. If not a descriptor, ``m`` is returned +unchanged. + +The full C implementation can be found in :c:func:`super_getattro()` in +:source:`Objects/typeobject.c`. A pure Python equivalent can be found in +`Guido's Tutorial +`_. + + +Summary of invocation logic +--------------------------- + +The mechanism for descriptors is embedded in the :meth:`__getattribute__()` +methods for :class:`object`, :class:`type`, and :func:`super`. The important points to remember are: -* descriptors are invoked by the :meth:`__getattribute__` method -* overriding :meth:`__getattribute__` prevents automatic descriptor calls +* Descriptors are invoked by the :meth:`__getattribute__` method. + +* Classes inherit this machinery from :class:`object`, :class:`type`, or + :func:`super`. + +* Overriding :meth:`__getattribute__` prevents automatic descriptor calls + because all the descriptor logic is in that method. + * :meth:`object.__getattribute__` and :meth:`type.__getattribute__` make - different calls to :meth:`__get__`. -* data descriptors always override instance dictionaries. -* non-data descriptors may be overridden by instance dictionaries. + different calls to :meth:`__get__`. The first includes the instance and may + include the class. The second puts in ``None`` for the instance and always + includes the class. -The object returned by ``super()`` also has a custom :meth:`__getattribute__` -method for invoking descriptors. The attribute lookup ``super(B, obj).m`` searches -``obj.__class__.__mro__`` for the base class ``A`` immediately following ``B`` -and then returns ``A.__dict__['m'].__get__(obj, B)``. If not a descriptor, -``m`` is returned unchanged. If not in the dictionary, ``m`` reverts to a -search using :meth:`object.__getattribute__`. +* Data descriptors always override instance dictionaries. -The implementation details are in :c:func:`super_getattro()` in -:source:`Objects/typeobject.c`. and a pure Python equivalent can be found in -`Guido's Tutorial`_. +* Non-data descriptors may be overridden by instance dictionaries. -.. _`Guido's Tutorial`: https://www.python.org/download/releases/2.2.3/descrintro/#cooperation -The details above show that the mechanism for descriptors is embedded in the -:meth:`__getattribute__()` methods for :class:`object`, :class:`type`, and -:func:`super`. Classes inherit this machinery when they derive from -:class:`object` or if they have a meta-class providing similar functionality. -Likewise, classes can turn-off descriptor invocation by overriding -:meth:`__getattribute__()`. +Automatic name notification +--------------------------- +Sometimes it is desirable for a descriptor to know what class variable name it +was assigned to. When a new class is created, the :class:`type` metaclass +scans the dictionary of the new class. If any of the entries are descriptors +and if they define :meth:`__set_name__`, that method is called with two +arguments. The *owner* is the class where the descriptor is used, and the +*name* is the class variable the descriptor was assigned to. -Descriptor Example ------------------- +The implementation details are in :c:func:`type_new()` and +:c:func:`set_names()` in :source:`Objects/typeobject.c`. -The following code creates a class whose objects are data descriptors which -print a message for each get or set. Overriding :meth:`__getattribute__` is -alternate approach that could do this for every attribute. However, this -descriptor is useful for monitoring just a few chosen attributes:: +Since the update logic is in :meth:`type.__new__`, notifications only take +place at the time of class creation. If descriptors are added to the class +afterwards, :meth:`__set_name__` will need to be called manually. - class RevealAccess(object): - """A data descriptor that sets and returns values - normally and prints a message logging their access. - """ - def __init__(self, initval=None, name='var'): - self.val = initval - self.name = name +ORM example +----------- - def __get__(self, obj, objtype): - print('Retrieving', self.name) - return self.val +The following code is simplified skeleton showing how data descriptors could +be used to implement an `object relational mapping +`_. - def __set__(self, obj, val): - print('Updating', self.name) - self.val = val +The essential idea is that the data is stored in an external database. The +Python instances only hold keys to the database's tables. Descriptors take +care of lookups or updates: - >>> class MyClass(object): - ... x = RevealAccess(10, 'var "x"') - ... y = 5 - ... - >>> m = MyClass() - >>> m.x - Retrieving var "x" - 10 - >>> m.x = 20 - Updating var "x" - >>> m.x - Retrieving var "x" - 20 - >>> m.y - 5 +.. testcode:: + + class Field: + + def __set_name__(self, owner, name): + self.fetch = f'SELECT {name} FROM {owner.table} WHERE {owner.key}=?;' + self.store = f'UPDATE {owner.table} SET {name}=? WHERE {owner.key}=?;' + + def __get__(self, obj, objtype=None): + return conn.execute(self.fetch, [obj.key]).fetchone()[0] + + def __set__(self, obj, value): + conn.execute(self.store, [value, obj.key]) + conn.commit() + +We can use the :class:`Field` class to define `models +`_ that describe the schema for +each table in a database: + +.. testcode:: + + class Movie: + table = 'Movies' # Table name + key = 'title' # Primary key + director = Field() + year = Field() + + def __init__(self, key): + self.key = key + + class Song: + table = 'Music' + key = 'title' + artist = Field() + year = Field() + genre = Field() + + def __init__(self, key): + self.key = key -The protocol is simple and offers exciting possibilities. Several use cases are -so common that they have been packaged into individual function calls. -Properties, bound methods, static methods, and class methods are all -based on the descriptor protocol. +To use the models, first connect to the database:: + + >>> import sqlite3 + >>> conn = sqlite3.connect('entertainment.db') + +An interactive session shows how data is retrieved from the database and how +it can be updated: + +.. testsetup:: + + song_data = [ + ('Country Roads', 'John Denver', 1972), + ('Me and Bobby McGee', 'Janice Joplin', 1971), + ('Coal Miners Daughter', 'Loretta Lynn', 1970), + ] + + movie_data = [ + ('Star Wars', 'George Lucas', 1977), + ('Jaws', 'Steven Spielberg', 1975), + ('Aliens', 'James Cameron', 1986), + ] + + import sqlite3 + + conn = sqlite3.connect(':memory:') + conn.execute('CREATE TABLE Music (title text, artist text, year integer);') + conn.execute('CREATE INDEX MusicNdx ON Music (title);') + conn.executemany('INSERT INTO Music VALUES (?, ?, ?);', song_data) + conn.execute('CREATE TABLE Movies (title text, director text, year integer);') + conn.execute('CREATE INDEX MovieNdx ON Music (title);') + conn.executemany('INSERT INTO Movies VALUES (?, ?, ?);', movie_data) + conn.commit() + +.. doctest:: + + >>> Movie('Star Wars').director + 'George Lucas' + >>> jaws = Movie('Jaws') + >>> f'Released in {jaws.year} by {jaws.director}' + 'Released in 1975 by Steven Spielberg' + + >>> Song('Country Roads').artist + 'John Denver' + + >>> Movie('Star Wars').director = 'J.J. Abrams' + >>> Movie('Star Wars').director + 'J.J. Abrams' + + +Pure Python Equivalents +^^^^^^^^^^^^^^^^^^^^^^^ + +The descriptor protocol is simple and offers exciting possibilities. Several +use cases are so common that they have been prepackaged into built-in tools. +Properties, bound methods, static methods, class methods, and \_\_slots\_\_ are +all based on the descriptor protocol. Properties ---------- Calling :func:`property` is a succinct way of building a data descriptor that -triggers function calls upon access to an attribute. Its signature is:: +triggers a function call upon access to an attribute. Its signature is:: - property(fget=None, fset=None, fdel=None, doc=None) -> property attribute + property(fget=None, fset=None, fdel=None, doc=None) -> property -The documentation shows a typical use to define a managed attribute ``x``:: +The documentation shows a typical use to define a managed attribute ``x``: - class C(object): +.. testcode:: + + class C: def getx(self): return self.__x def setx(self, value): self.__x = value def delx(self): del self.__x x = property(getx, setx, delx, "I'm the 'x' property.") To see how :func:`property` is implemented in terms of the descriptor protocol, -here is a pure Python equivalent:: +here is a pure Python equivalent: + +.. testcode:: - class Property(object): + class Property: "Emulate PyProperty_Type() in Objects/descrobject.c" def __init__(self, fget=None, fset=None, fdel=None, doc=None): @@ -240,6 +961,57 @@ here is a pure Python equivalent:: def deleter(self, fdel): return type(self)(self.fget, self.fset, fdel, self.__doc__) +.. testcode:: + :hide: + + # Verify the Property() emulation + + class CC: + def getx(self): + return self.__x + def setx(self, value): + self.__x = value + def delx(self): + del self.__x + x = Property(getx, setx, delx, "I'm the 'x' property.") + + # Now do it again but use the decorator style + + class CCC: + @Property + def x(self): + return self.__x + @x.setter + def x(self, value): + self.__x = value + @x.deleter + def x(self): + del self.__x + + +.. doctest:: + :hide: + + >>> cc = CC() + >>> hasattr(cc, 'x') + False + >>> cc.x = 33 + >>> cc.x + 33 + >>> del cc.x + >>> hasattr(cc, 'x') + False + + >>> ccc = CCC() + >>> hasattr(ccc, 'x') + False + >>> ccc.x = 333 + >>> ccc.x == 333 + True + >>> del ccc.x + >>> hasattr(ccc, 'x') + False + The :func:`property` builtin helps whenever a user interface has granted attribute access and then subsequent changes require the intervention of a method. @@ -248,102 +1020,137 @@ For instance, a spreadsheet class may grant access to a cell value through ``Cell('b10').value``. Subsequent improvements to the program require the cell to be recalculated on every access; however, the programmer does not want to affect existing client code accessing the attribute directly. The solution is -to wrap access to the value attribute in a property data descriptor:: +to wrap access to the value attribute in a property data descriptor: + +.. testcode:: + + class Cell: + ... - class Cell(object): - . . . - def getvalue(self): + @property + def value(self): "Recalculate the cell before returning value" self.recalc() return self._value - value = property(getvalue) +Either the built-in :func:`property` or our :func:`Property` equivalent would +work in this example. -Functions and Methods + +Functions and methods --------------------- Python's object oriented features are built upon a function based environment. Using non-data descriptors, the two are merged seamlessly. -Class dictionaries store methods as functions. In a class definition, methods -are written using :keyword:`def` or :keyword:`lambda`, the usual tools for -creating functions. Methods only differ from regular functions in that the -first argument is reserved for the object instance. By Python convention, the -instance reference is called *self* but may be called *this* or any other -variable name. +Functions stored in class dictionaries get turned into methods when invoked. +Methods only differ from regular functions in that the object instance is +prepended to the other arguments. By convention, the instance is called +*self* but could be called *this* or any other variable name. + +Methods can be created manually with :class:`types.MethodType` which is +roughly equivalent to: -To support method calls, functions include the :meth:`__get__` method for -binding methods during attribute access. This means that all functions are -non-data descriptors which return bound methods when they are invoked from an -object. In pure Python, it works like this:: +.. testcode:: + + class MethodType: + "Emulate Py_MethodType in Objects/classobject.c" + + def __init__(self, func, obj): + self.__func__ = func + self.__self__ = obj + + def __call__(self, *args, **kwargs): + func = self.__func__ + obj = self.__self__ + return func(obj, *args, **kwargs) + +To support automatic creation of methods, functions include the +:meth:`__get__` method for binding methods during attribute access. This +means that functions are non-data descriptors that return bound methods +during dotted lookup from an instance. Here's how it works: + +.. testcode:: + + class Function: + ... - class Function(object): - . . . def __get__(self, obj, objtype=None): "Simulate func_descr_get() in Objects/funcobject.c" if obj is None: return self - return types.MethodType(self, obj) + return MethodType(self, obj) -Running the interpreter shows how the function descriptor works in practice:: +Running the following class in the interpreter shows how the function +descriptor works in practice: - >>> class D(object): - ... def f(self, x): - ... return x - ... - >>> d = D() +.. testcode:: + + class D: + def f(self, x): + return x + +The function has a :term:`qualified name` attribute to support introspection: + +.. doctest:: + + >>> D.f.__qualname__ + 'D.f' + +Accessing the function through the class dictionary does not invoke +:meth:`__get__`. Instead, it just returns the underlying function object:: - # Access through the class dictionary does not invoke __get__. - # It just returns the underlying function object. >>> D.__dict__['f'] - # Dotted access from a class calls __get__() which just returns - # the underlying function unchanged. +Dotted access from a class calls :meth:`__get__` which just returns the +underlying function unchanged:: + >>> D.f - # The function has a __qualname__ attribute to support introspection - >>> D.f.__qualname__ - 'D.f' +The interesting behavior occurs during dotted access from an instance. The +dotted lookup calls :meth:`__get__` which returns a bound method object:: - # Dotted access from an instance calls __get__() which returns the - # function wrapped in a bound method object + >>> d = D() >>> d.f > - # Internally, the bound method stores the underlying function, - # the bound instance, and the class of the bound instance. +Internally, the bound method stores the underlying function and the bound +instance:: + >>> d.f.__func__ - + + >>> d.f.__self__ <__main__.D object at 0x1012e1f98> - >>> d.f.__class__ - + +If you have ever wondered where *self* comes from in regular methods or where +*cls* comes from in class methods, this is it! -Static Methods and Class Methods --------------------------------- +Static methods +-------------- Non-data descriptors provide a simple mechanism for variations on the usual patterns of binding functions into methods. To recap, functions have a :meth:`__get__` method so that they can be converted to a method when accessed as attributes. The non-data descriptor transforms an -``obj.f(*args)`` call into ``f(obj, *args)``. Calling ``klass.f(*args)`` +``obj.f(*args)`` call into ``f(obj, *args)``. Calling ``cls.f(*args)`` becomes ``f(*args)``. This chart summarizes the binding and its two most useful variants: +-----------------+----------------------+------------------+ | Transformation | Called from an | Called from a | - | | Object | Class | + | | object | class | +=================+======================+==================+ | function | f(obj, \*args) | f(\*args) | +-----------------+----------------------+------------------+ | staticmethod | f(\*args) | f(\*args) | +-----------------+----------------------+------------------+ - | classmethod | f(type(obj), \*args) | f(klass, \*args) | + | classmethod | f(type(obj), \*args) | f(cls, \*args) | +-----------------+----------------------+------------------+ Static methods return the underlying function without changes. Calling either @@ -364,23 +1171,29 @@ in statistical work but does not directly depend on a particular dataset. It can be called either from an object or the class: ``s.erf(1.5) --> .9332`` or ``Sample.erf(1.5) --> .9332``. -Since staticmethods return the underlying function with no changes, the example -calls are unexciting:: +Since static methods return the underlying function with no changes, the +example calls are unexciting: + +.. testcode:: + + class E: + @staticmethod + def f(x): + print(x) + +.. doctest:: - >>> class E(object): - ... def f(x): - ... print(x) - ... f = staticmethod(f) - ... >>> E.f(3) 3 >>> E().f(3) 3 Using the non-data descriptor protocol, a pure Python version of -:func:`staticmethod` would look like this:: +:func:`staticmethod` would look like this: - class StaticMethod(object): +.. doctest:: + + class StaticMethod: "Emulate PyStaticMethod_Type() in Objects/funcobject.c" def __init__(self, f): @@ -389,55 +1202,361 @@ Using the non-data descriptor protocol, a pure Python version of def __get__(self, obj, objtype=None): return self.f + +Class methods +------------- + Unlike static methods, class methods prepend the class reference to the argument list before calling the function. This format is the same -for whether the caller is an object or a class:: +for whether the caller is an object or a class: - >>> class E(object): - ... def f(klass, x): - ... return klass.__name__, x - ... f = classmethod(f) - ... - >>> print(E.f(3)) - ('E', 3) - >>> print(E().f(3)) - ('E', 3) +.. testcode:: + + class F: + @classmethod + def f(cls, x): + return cls.__name__, x +.. doctest:: -This behavior is useful whenever the function only needs to have a class -reference and does not care about any underlying data. One use for classmethods -is to create alternate class constructors. In Python 2.3, the classmethod -:func:`dict.fromkeys` creates a new dictionary from a list of keys. The pure -Python equivalent is:: + >>> F.f(3) + ('F', 3) + >>> F().f(3) + ('F', 3) - class Dict(object): - . . . - def fromkeys(klass, iterable, value=None): +This behavior is useful whenever the method only needs to have a class +reference and does not rely on data stored in a specific instance. One use for +class methods is to create alternate class constructors. For example, the +classmethod :func:`dict.fromkeys` creates a new dictionary from a list of +keys. The pure Python equivalent is: + +.. testcode:: + + class Dict(dict): + @classmethod + def fromkeys(cls, iterable, value=None): "Emulate dict_fromkeys() in Objects/dictobject.c" - d = klass() + d = cls() for key in iterable: d[key] = value return d - fromkeys = classmethod(fromkeys) -Now a new dictionary of unique keys can be constructed like this:: +Now a new dictionary of unique keys can be constructed like this: + +.. doctest:: - >>> Dict.fromkeys('abracadabra') - {'a': None, 'r': None, 'b': None, 'c': None, 'd': None} + >>> d = Dict.fromkeys('abracadabra') + >>> type(d) is Dict + True + >>> d + {'a': None, 'b': None, 'r': None, 'c': None, 'd': None} Using the non-data descriptor protocol, a pure Python version of -:func:`classmethod` would look like this:: +:func:`classmethod` would look like this: - class ClassMethod(object): +.. testcode:: + + class ClassMethod: "Emulate PyClassMethod_Type() in Objects/funcobject.c" def __init__(self, f): self.f = f - def __get__(self, obj, klass=None): - if klass is None: - klass = type(obj) - def newfunc(*args): - return self.f(klass, *args) - return newfunc + def __get__(self, obj, cls=None): + if cls is None: + cls = type(obj) + if hasattr(obj, '__get__'): + return self.f.__get__(cls) + return MethodType(self.f, cls) + +.. testcode:: + :hide: + + # Verify the emulation works + class T: + @ClassMethod + def cm(cls, x, y): + return (cls, x, y) + +.. doctest:: + :hide: + + >>> T.cm(11, 22) + (, 11, 22) + + # Also call it from an instance + >>> t = T() + >>> t.cm(11, 22) + (, 11, 22) + +The code path for ``hasattr(obj, '__get__')`` was added in Python 3.9 and +makes it possible for :func:`classmethod` to support chained decorators. +For example, a classmethod and property could be chained together: +.. testcode:: + + class G: + @classmethod + @property + def __doc__(cls): + return f'A doc for {cls.__name__!r}' + +.. doctest:: + + >>> G.__doc__ + "A doc for 'G'" + + +Member objects and __slots__ +---------------------------- + +When a class defines ``__slots__``, it replaces instance dictionaries with a +fixed-length array of slot values. From a user point of view that has +several effects: + +1. Provides immediate detection of bugs due to misspelled attribute +assignments. Only attribute names specified in ``__slots__`` are allowed: + +.. testcode:: + + class Vehicle: + __slots__ = ('id_number', 'make', 'model') + +.. doctest:: + + >>> auto = Vehicle() + >>> auto.id_nubmer = 'VYE483814LQEX' + Traceback (most recent call last): + ... + AttributeError: 'Vehicle' object has no attribute 'id_nubmer' + +2. Helps create immutable objects where descriptors manage access to private +attributes stored in ``__slots__``: + +.. testcode:: + + class Immutable: + + __slots__ = ('_dept', '_name') # Replace the instance dictionary + + def __init__(self, dept, name): + self._dept = dept # Store to private attribute + self._name = name # Store to private attribute + + @property # Read-only descriptor + def dept(self): + return self._dept + + @property + def name(self): # Read-only descriptor + return self._name + +.. doctest:: + + >>> mark = Immutable('Botany', 'Mark Watney') + >>> mark.dept + 'Botany' + >>> mark.dept = 'Space Pirate' + Traceback (most recent call last): + ... + AttributeError: can't set attribute + >>> mark.location = 'Mars' + Traceback (most recent call last): + ... + AttributeError: 'Immutable' object has no attribute 'location' + +3. Saves memory. On a 64-bit Linux build, an instance with two attributes +takes 48 bytes with ``__slots__`` and 152 bytes without. This `flyweight +design pattern `_ likely only +matters when a large number of instances are going to be created. + +4. Blocks tools like :func:`functools.cached_property` which require an +instance dictionary to function correctly: + +.. testcode:: + + from functools import cached_property + + class CP: + __slots__ = () # Eliminates the instance dict + + @cached_property # Requires an instance dict + def pi(self): + return 4 * sum((-1.0)**n / (2.0*n + 1.0) + for n in reversed(range(100_000))) + +.. doctest:: + + >>> CP().pi + Traceback (most recent call last): + ... + TypeError: No '__dict__' attribute on 'CP' instance to cache 'pi' property. + +It is not possible to create an exact drop-in pure Python version of +``__slots__`` because it requires direct access to C structures and control +over object memory allocation. However, we can build a mostly faithful +simulation where the actual C structure for slots is emulated by a private +``_slotvalues`` list. Reads and writes to that private structure are managed +by member descriptors: + +.. testcode:: + + null = object() + + class Member: + + def __init__(self, name, clsname, offset): + 'Emulate PyMemberDef in Include/structmember.h' + # Also see descr_new() in Objects/descrobject.c + self.name = name + self.clsname = clsname + self.offset = offset + + def __get__(self, obj, objtype=None): + 'Emulate member_get() in Objects/descrobject.c' + # Also see PyMember_GetOne() in Python/structmember.c + value = obj._slotvalues[self.offset] + if value is null: + raise AttributeError(self.name) + return value + + def __set__(self, obj, value): + 'Emulate member_set() in Objects/descrobject.c' + obj._slotvalues[self.offset] = value + + def __delete__(self, obj): + 'Emulate member_delete() in Objects/descrobject.c' + value = obj._slotvalues[self.offset] + if value is null: + raise AttributeError(self.name) + obj._slotvalues[self.offset] = null + + def __repr__(self): + 'Emulate member_repr() in Objects/descrobject.c' + return f'' + +The :meth:`type.__new__` method takes care of adding member objects to class +variables: + +.. testcode:: + + class Type(type): + 'Simulate how the type metaclass adds member objects for slots' + + def __new__(mcls, clsname, bases, mapping): + 'Emuluate type_new() in Objects/typeobject.c' + # type_new() calls PyTypeReady() which calls add_methods() + slot_names = mapping.get('slot_names', []) + for offset, name in enumerate(slot_names): + mapping[name] = Member(name, clsname, offset) + return type.__new__(mcls, clsname, bases, mapping) + +The :meth:`object.__new__` method takes care of creating instances that have +slots instead of an instance dictionary. Here is a rough simulation in pure +Python: + +.. testcode:: + + class Object: + 'Simulate how object.__new__() allocates memory for __slots__' + + def __new__(cls, *args): + 'Emulate object_new() in Objects/typeobject.c' + inst = super().__new__(cls) + if hasattr(cls, 'slot_names'): + empty_slots = [null] * len(cls.slot_names) + object.__setattr__(inst, '_slotvalues', empty_slots) + return inst + + def __setattr__(self, name, value): + 'Emulate _PyObject_GenericSetAttrWithDict() Objects/object.c' + cls = type(self) + if hasattr(cls, 'slot_names') and name not in cls.slot_names: + raise AttributeError( + f'{type(self).__name__!r} object has no attribute {name!r}' + ) + super().__setattr__(name, value) + + def __delattr__(self, name): + 'Emulate _PyObject_GenericSetAttrWithDict() Objects/object.c' + cls = type(self) + if hasattr(cls, 'slot_names') and name not in cls.slot_names: + raise AttributeError( + f'{type(self).__name__!r} object has no attribute {name!r}' + ) + super().__delattr__(name) + +To use the simulation in a real class, just inherit from :class:`Object` and +set the :term:`metaclass` to :class:`Type`: + +.. testcode:: + + class H(Object, metaclass=Type): + 'Instance variables stored in slots' + + slot_names = ['x', 'y'] + + def __init__(self, x, y): + self.x = x + self.y = y + +At this point, the metaclass has loaded member objects for *x* and *y*:: + + >>> from pprint import pp + >>> pp(dict(vars(H))) + {'__module__': '__main__', + '__doc__': 'Instance variables stored in slots', + 'slot_names': ['x', 'y'], + '__init__': , + 'x': , + 'y': } + +.. doctest:: + :hide: + + # We test this separately because the preceding section is not + # doctestable due to the hex memory address for the __init__ function + >>> isinstance(vars(H)['x'], Member) + True + >>> isinstance(vars(H)['y'], Member) + True + +When instances are created, they have a ``slot_values`` list where the +attributes are stored: + +.. doctest:: + + >>> h = H(10, 20) + >>> vars(h) + {'_slotvalues': [10, 20]} + >>> h.x = 55 + >>> vars(h) + {'_slotvalues': [55, 20]} + +Misspelled or unassigned attributes will raise an exception: + +.. doctest:: + + >>> h.xz + Traceback (most recent call last): + ... + AttributeError: 'H' object has no attribute 'xz' + +.. doctest:: + :hide: + + # Examples for deleted attributes are not shown because this section + # is already a bit lengthy. We still test that code here. + >>> del h.x + >>> hasattr(h, 'x') + False + + # Also test the code for uninitialized slots + >>> class HU(Object, metaclass=Type): + ... slot_names = ['x', 'y'] + ... + >>> hu = HU() + >>> hasattr(hu, 'x') + False + >>> hasattr(hu, 'y') + False diff --git a/Doc/howto/instrumentation.rst b/Doc/howto/instrumentation.rst index 909deb5fed33fff52c6cd28249c3294541accc93..f0081e4ec28905a040bfa823fe947365482af8c6 100644 --- a/Doc/howto/instrumentation.rst +++ b/Doc/howto/instrumentation.rst @@ -272,9 +272,7 @@ should instead read: Available static markers ------------------------ -.. I'm reusing the "c:function" type for markers - -.. c:function:: function__entry(str filename, str funcname, int lineno) +.. object:: function__entry(str filename, str funcname, int lineno) This marker indicates that execution of a Python function has begun. It is only triggered for pure-Python (bytecode) functions. @@ -290,7 +288,7 @@ Available static markers * ``$arg3`` : ``int`` line number -.. c:function:: function__return(str filename, str funcname, int lineno) +.. object:: function__return(str filename, str funcname, int lineno) This marker is the converse of :c:func:`function__entry`, and indicates that execution of a Python function has ended (either via ``return``, or via an @@ -298,7 +296,7 @@ Available static markers The arguments are the same as for :c:func:`function__entry` -.. c:function:: line(str filename, str funcname, int lineno) +.. object:: line(str filename, str funcname, int lineno) This marker indicates a Python line is about to be executed. It is the equivalent of line-by-line tracing with a Python profiler. It is @@ -306,24 +304,24 @@ Available static markers The arguments are the same as for :c:func:`function__entry`. -.. c:function:: gc__start(int generation) +.. object:: gc__start(int generation) Fires when the Python interpreter starts a garbage collection cycle. ``arg0`` is the generation to scan, like :func:`gc.collect()`. -.. c:function:: gc__done(long collected) +.. object:: gc__done(long collected) Fires when the Python interpreter finishes a garbage collection cycle. ``arg0`` is the number of collected objects. -.. c:function:: import__find__load__start(str modulename) +.. object:: import__find__load__start(str modulename) Fires before :mod:`importlib` attempts to find and load the module. ``arg0`` is the module name. .. versionadded:: 3.7 -.. c:function:: import__find__load__done(str modulename, int found) +.. object:: import__find__load__done(str modulename, int found) Fires after :mod:`importlib`'s find_and_load function is called. ``arg0`` is the module name, ``arg1`` indicates if module was @@ -332,7 +330,7 @@ Available static markers .. versionadded:: 3.7 -.. c:function:: audit(str event, void *tuple) +.. object:: 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` @@ -375,14 +373,14 @@ If this file is installed in SystemTap's tapset directory (e.g. ``/usr/share/systemtap/tapset``), then these additional probepoints become available: -.. c:function:: python.function.entry(str filename, str funcname, int lineno, frameptr) +.. object:: python.function.entry(str filename, str funcname, int lineno, frameptr) This probe point indicates that execution of a Python function has begun. It is only triggered for pure-Python (bytecode) functions. -.. c:function:: python.function.return(str filename, str funcname, int lineno, frameptr) +.. object:: python.function.return(str filename, str funcname, int lineno, frameptr) - This probe point is the converse of :c:func:`python.function.return`, and + This probe point is the converse of ``python.function.return``, and indicates that execution of a Python function has ended (either via ``return``, or via an exception). It is only triggered for pure-Python (bytecode) functions. diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst index 17f4ff6e474c23ef688d97600484176f82cf53a7..de0f834551f5ddd61d2b0990200f80bce076f942 100644 --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -1368,7 +1368,7 @@ An example dictionary-based configuration ----------------------------------------- Below is an example of a logging configuration dictionary - it's taken from -the `documentation on the Django project `_. +the `documentation on the Django project `_. This dictionary is passed to :func:`~config.dictConfig` to put the configuration into effect:: LOGGING = { @@ -1424,7 +1424,7 @@ This dictionary is passed to :func:`~config.dictConfig` to put the configuration } For more information about this configuration, you can see the `relevant -section `_ +section `_ of the Django documentation. .. _cookbook-rotator-namer: diff --git a/Doc/howto/logging.rst b/Doc/howto/logging.rst index 7a68ca89199c777a8d8cc270f232f0935f2cebe5..6316e086ef43ba25bd15f3804aff5cc45e84ba0a 100644 --- a/Doc/howto/logging.rst +++ b/Doc/howto/logging.rst @@ -128,10 +128,18 @@ look at that next. Be sure to try the following in a newly-started Python interpreter, and don't just continue from the session described above:: import logging - logging.basicConfig(filename='example.log',level=logging.DEBUG) + logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too') + logging.error('And non-ASCII stuff, too, like Øresund and Malmö') + +.. versionchanged:: 3.9 + The *encoding* argument was added. In earlier Python versions, or if not + specified, the encoding used is the default value used by :func:`open`. While + not shown in the above example, an *errors* argument can also now be passed, + which determines how encoding errors are handled. For available values and + the default, see the documentation for :func:`open`. And now if we open the file and look at what we have, we should find the log messages: @@ -141,6 +149,7 @@ messages: DEBUG:root:This message should go to the log file INFO:root:So should this WARNING:root:And this, too + ERROR:root:And non-ASCII stuff, too, like Øresund and Malmö This example also shows how you can set the logging level which acts as the threshold for tracking. In this case, because we set the threshold to @@ -1077,8 +1086,7 @@ need: | | :func:`sys._getframe`, which may help | | | to speed up your code in environments | | | like PyPy (which can't speed up code | -| | that uses :func:`sys._getframe`), if | -| | and when PyPy supports Python 3.x. | +| | that uses :func:`sys._getframe`). | +-----------------------------------------------+----------------------------------------+ | Threading information. | Set ``logging.logThreads`` to ``0``. | +-----------------------------------------------+----------------------------------------+ diff --git a/Doc/howto/pyporting.rst b/Doc/howto/pyporting.rst index 8608162bace357a2676fbbac5b3fcc2fbac5fe06..1543823c104c289409f8c071e076784754a4cd43 100644 --- a/Doc/howto/pyporting.rst +++ b/Doc/howto/pyporting.rst @@ -31,20 +31,26 @@ are: #. Only worry about supporting Python 2.7 #. Make sure you have good test coverage (coverage.py_ can help; - ``pip install coverage``) + ``python -m pip install coverage``) #. Learn the differences between Python 2 & 3 -#. Use Futurize_ (or Modernize_) to update your code (e.g. ``pip install future``) +#. Use Futurize_ (or Modernize_) to update your code (e.g. ``python -m pip install future``) #. Use Pylint_ to help make sure you don't regress on your Python 3 support - (``pip install pylint``) + (``python -m pip install pylint``) #. Use caniusepython3_ to find out which of your dependencies are blocking your - use of Python 3 (``pip install caniusepython3``) + use of Python 3 (``python -m pip install caniusepython3``) #. Once your dependencies are no longer blocking you, use continuous integration to make sure you stay compatible with Python 2 & 3 (tox_ can help test - against multiple versions of Python; ``pip install tox``) + against multiple versions of Python; ``python -m pip install tox``) #. Consider using optional static type checking to make sure your type usage works in both Python 2 & 3 (e.g. use mypy_ to check your typing under both - Python 2 & Python 3). + Python 2 & Python 3; ``python -m pip install mypy``). +.. note:: + + Note: Using ``python -m pip install`` guarantees that the ``pip`` you invoke + is the one installed for the Python currently in use, whether it be + a system-wide ``pip`` or one installed within a + :ref:`virtual environment `. Details ======= @@ -71,7 +77,7 @@ Drop support for Python 2.6 and older While you can make Python 2.5 work with Python 3, it is **much** easier if you only have to work with Python 2.7. If dropping Python 2.5 is not an option then the six_ project can help you support Python 2.5 & 3 simultaneously -(``pip install six``). Do realize, though, that nearly all the projects listed +(``python -m pip install six``). Do realize, though, that nearly all the projects listed in this HOWTO will not be available to you. If you are able to skip Python 2.5 and older, then the required changes diff --git a/Doc/howto/sockets.rst b/Doc/howto/sockets.rst index b5c2152ec7004d52eee249ac6b8ced5c4f336e5f..d6ed128e073fd682c0b0282fd495396121826e1c 100644 --- a/Doc/howto/sockets.rst +++ b/Doc/howto/sockets.rst @@ -317,7 +317,7 @@ know about the mechanics of using sockets. You'll still use the same calls, in much the same ways. It's just that, if you do it right, your app will be almost inside-out. -In Python, you use ``socket.setblocking(0)`` to make it non-blocking. In C, it's +In Python, you use ``socket.setblocking(False)`` to make it non-blocking. In C, it's more complex, (for one thing, you'll need to choose between the BSD flavor ``O_NONBLOCK`` and the almost indistinguishable POSIX flavor ``O_NDELAY``, which is completely different from ``TCP_NODELAY``), but it's the exact same idea. You diff --git a/Doc/howto/sorting.rst b/Doc/howto/sorting.rst index 1d6d5c45b4d9f9fcf1607536cb1d23969e601b80..a8efe65353d6e14b7aa0cb5d4ad7b4aff5245043 100644 --- a/Doc/howto/sorting.rst +++ b/Doc/howto/sorting.rst @@ -43,16 +43,18 @@ Key Functions ============= Both :meth:`list.sort` and :func:`sorted` have a *key* parameter to specify a -function to be called on each list element prior to making comparisons. +function (or other callable) to be called on each list element prior to making +comparisons. For example, here's a case-insensitive string comparison: >>> sorted("This is a test string from Andrew".split(), key=str.lower) ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This'] -The value of the *key* parameter should be a function that takes a single argument -and returns a key to use for sorting purposes. This technique is fast because -the key function is called exactly once for each input record. +The value of the *key* parameter should be a function (or other callable) that +takes a single argument and returns a key to use for sorting purposes. This +technique is fast because the key function is called exactly once for each +input record. A common pattern is to sort complex objects using some of the object's indices as keys. For example: diff --git a/Doc/howto/unicode.rst b/Doc/howto/unicode.rst index 51bd64bfc232ca03c8aa8195341e22463fa5cfff..e948c1e3c662d6b201dc534e9a0de56fe3eb9acd 100644 --- a/Doc/howto/unicode.rst +++ b/Doc/howto/unicode.rst @@ -41,8 +41,9 @@ but these are two different characters that have different meanings. The Unicode standard describes how characters are represented by **code points**. A code point value is an integer in the range 0 to -0x10FFFF (about 1.1 million values, with some 110 thousand assigned so -far). In the standard and in this document, a code point is written +0x10FFFF (about 1.1 million values, the +`actual number assigned `_ +is less than that). In the standard and in this document, a code point is written using the notation ``U+265E`` to mean the character with value ``0x265e`` (9,822 in decimal). @@ -156,9 +157,9 @@ UTF-8 has several convenient properties: References ---------- -The `Unicode Consortium site `_ has character charts, a +The `Unicode Consortium site `_ has character charts, a glossary, and PDF versions of the Unicode specification. Be prepared for some -difficult reading. `A chronology `_ of the +difficult reading. `A chronology `_ of the origin and development of Unicode is also available on the site. On the Computerphile Youtube channel, Tom Scott briefly @@ -393,7 +394,7 @@ These are grouped into categories such as "Letter", "Number", "Punctuation", or from the above output, ``'Ll'`` means 'Letter, lowercase', ``'No'`` means "Number, other", ``'Mn'`` is "Mark, nonspacing", and ``'So'`` is "Symbol, other". See -`the General Category Values section of the Unicode Character Database documentation `_ for a +`the General Category Values section of the Unicode Character Database documentation `_ for a list of category codes. diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst index 046a88af62f0b3e31ddb2ce9cfc69642cc9cf366..12d525771ddc2876c5c6b3eb93722d5fdf01de35 100644 --- a/Doc/howto/urllib2.rst +++ b/Doc/howto/urllib2.rst @@ -97,7 +97,7 @@ schemes. For example, you can make an FTP request like so:: In the case of HTTP, there are two extra things that Request objects allow you to do: First, you can pass data to be sent to the server. Second, you can pass -extra information ("metadata") *about* the data or the about request itself, to +extra information ("metadata") *about* the data or about the request itself, to the server - this information is sent as HTTP "headers". Let's look at each of these in turn. diff --git a/Doc/install/index.rst b/Doc/install/index.rst index e6d5a3e6ebde6031a7e33791daed86885cdc2036..ae0d0294ef777380a908f67457052ff5531b5d6b 100644 --- a/Doc/install/index.rst +++ b/Doc/install/index.rst @@ -1064,8 +1064,7 @@ normal libraries do. .. [#] This also means you could replace all existing COFF-libraries with OMF-libraries of the same name. -.. [#] Check https://www.sourceware.org/cygwin/ and http://www.mingw.org/ for more - information +.. [#] Check https://www.sourceware.org/cygwin/ for more information .. [#] Then you have no POSIX emulation available, but you also don't need :file:`cygwin1.dll`. diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst index c3ff3e607e7978121403ed05e0a910e6c0f0d597..1d7bd262872905654cd67049dce165955b17356a 100644 --- a/Doc/library/2to3.rst +++ b/Doc/library/2to3.rst @@ -9,9 +9,7 @@ of *fixers* to transform it into valid Python 3.x code. The standard library contains a rich set of fixers that will handle almost all code. 2to3 supporting library :mod:`lib2to3` is, however, a flexible and generic library, so it is -possible to write your own fixers for 2to3. :mod:`lib2to3` could also be -adapted to custom applications in which Python code needs to be edited -automatically. +possible to write your own fixers for 2to3. .. _2to3-using: @@ -102,7 +100,7 @@ presence of the ``from __future__ import print_function`` compiler directive, it modifies its internal grammar to interpret :func:`print` as a function. This change can also be enabled manually with the :option:`!-p` flag. Use :option:`!-p` to run fixers on code that already has had its print statements -converted. +converted. Also :option:`!-e` can be used to make :func:`exec` a function. The :option:`!-o` or :option:`!--output-dir` option allows specification of an alternate directory for processed output files to be written to. The @@ -466,9 +464,17 @@ and off individually. They are described here in more detail. -------------- +.. deprecated:: 3.10 + Python 3.9 will switch to a PEG parser (see :pep:`617`), and Python 3.10 may + include new language syntax that is not parsable by lib2to3's LL(1) parser. + The ``lib2to3`` module may be removed from the standard library in a future + Python version. Consider third-party alternatives such as `LibCST`_ or + `parso`_. + .. note:: The :mod:`lib2to3` API should be considered unstable and may change drastically in the future. -.. XXX What is the public interface anyway? +.. _LibCST: https://libcst.readthedocs.io/ +.. _parso: https://parso.readthedocs.io/ diff --git a/Doc/library/__future__.rst b/Doc/library/__future__.rst index e3d749e60178478fe8645fa9b6ad5465b449ef8f..41399942d3030832080e97c57758875c59a51256 100644 --- a/Doc/library/__future__.rst +++ b/Doc/library/__future__.rst @@ -90,7 +90,7 @@ language using this mechanism: | generator_stop | 3.5.0b1 | 3.7 | :pep:`479`: | | | | | *StopIteration handling inside generators* | +------------------+-------------+--------------+---------------------------------------------+ -| annotations | 3.7.0b1 | 4.0 | :pep:`563`: | +| annotations | 3.7.0b1 | 3.10 | :pep:`563`: | | | | | *Postponed evaluation of annotations* | +------------------+-------------+--------------+---------------------------------------------+ diff --git a/Doc/library/_dummy_thread.rst b/Doc/library/_dummy_thread.rst deleted file mode 100644 index 7dccbc55475aae73c684418af76b35e1e22b7d97..0000000000000000000000000000000000000000 --- a/Doc/library/_dummy_thread.rst +++ /dev/null @@ -1,22 +0,0 @@ -:mod:`_dummy_thread` --- Drop-in replacement for the :mod:`_thread` module -========================================================================== - -.. module:: _dummy_thread - :synopsis: Drop-in replacement for the _thread module. - -**Source code:** :source:`Lib/_dummy_thread.py` - -.. deprecated:: 3.7 - Python now always has threading enabled. Please use :mod:`_thread` - (or, better, :mod:`threading`) instead. - --------------- - -This module provides a duplicate interface to the :mod:`_thread` module. -It was meant to be imported when the :mod:`_thread` module was not provided -on a platform. - -Be careful to not use this module where deadlock might occur from a thread being -created that blocks waiting for another thread to be created. This often occurs -with blocking I/O. - diff --git a/Doc/library/aifc.rst b/Doc/library/aifc.rst index 7328907730fb107ae853bf5195a4e6a60228000b..2e917cf7321b857bb7a0bcb317e93d2ab88ba443 100644 --- a/Doc/library/aifc.rst +++ b/Doc/library/aifc.rst @@ -208,6 +208,7 @@ number of frames must be filled in. .. method:: aifc.tell() + :noindex: Return the current write position in the output file. Useful in combination with :meth:`setmark`. @@ -232,6 +233,7 @@ number of frames must be filled in. .. method:: aifc.close() + :noindex: Close the AIFF file. The header of the file is updated to reflect the actual size of the audio data. After calling this method, the object can no longer be diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index e1b28e32ed1858deb231d8bcd68a6f9599be5fcc..4542961d7816ea5ba26c427c41f859bdb45cb941 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -142,7 +142,7 @@ ArgumentParser objects formatter_class=argparse.HelpFormatter, \ prefix_chars='-', fromfile_prefix_chars=None, \ argument_default=None, conflict_handler='error', \ - add_help=True, allow_abbrev=True) + add_help=True, allow_abbrev=True, exit_on_error=True) Create a new :class:`ArgumentParser` object. All parameters should be passed as keyword arguments. Each parameter has its own more detailed description @@ -179,6 +179,9 @@ ArgumentParser objects * allow_abbrev_ - Allows long options to be abbreviated if the abbreviation is unambiguous. (default: ``True``) + * exit_on_error_ - Determines whether or not ArgumentParser exits with + error info when an error occurs. (default: ``True``) + .. versionchanged:: 3.5 *allow_abbrev* parameter was added. @@ -186,6 +189,9 @@ ArgumentParser objects In previous versions, *allow_abbrev* also disabled grouping of short flags such as ``-vv`` to mean ``-v -v``. + .. versionchanged:: 3.9 + *exit_on_error* parameter was added. + The following sections describe how each of these are used. @@ -443,7 +449,7 @@ default values to each of the argument help messages:: >>> parser.add_argument('--foo', type=int, default=42, help='FOO!') >>> parser.add_argument('bar', nargs='*', default=[1, 2, 3], help='BAR!') >>> parser.print_help() - usage: PROG [-h] [--foo FOO] [bar [bar ...]] + usage: PROG [-h] [--foo FOO] [bar ...] positional arguments: bar BAR! (default: [1, 2, 3]) @@ -647,6 +653,28 @@ the help options:: +h, ++help show this help message and exit +exit_on_error +^^^^^^^^^^^^^ + +Normally, when you pass an invalid argument list to the :meth:`~ArgumentParser.parse_args` +method of an :class:`ArgumentParser`, it will exit with error info. + +If the user would like catch errors manually, the feature can be enable by setting +``exit_on_error`` to ``False``:: + + >>> parser = argparse.ArgumentParser(exit_on_error=False) + >>> parser.add_argument('--integers', type=int) + _StoreAction(option_strings=['--integers'], dest='integers', nargs=None, const=None, default=None, type=, choices=None, help=None, metavar=None) + >>> try: + ... parser.parse_args('--integers a'.split()) + ... except argparse.ArgumentError: + ... print('Catching an argumentError') + ... + Catching an argumentError + +.. versionadded:: 3.9 + + The add_argument() method ------------------------- @@ -668,7 +696,7 @@ The add_argument() method * const_ - A constant value required by some action_ and nargs_ selections. * default_ - The value produced if the argument is absent from the - command line. + command line and if it is absent from the namespace object. * type_ - The type to which the command-line argument should be converted. @@ -815,9 +843,19 @@ how the command-line arguments should be handled. The supplied actions are: .. versionadded:: 3.8 You may also specify an arbitrary action by passing an Action subclass or -other object that implements the same interface. The recommended way to do -this is to extend :class:`Action`, overriding the ``__call__`` method -and optionally the ``__init__`` method. +other object that implements the same interface. The ``BooleanOptionalAction`` +is available in ``argparse`` and adds support for boolean actions such as +``--foo`` and ``--no-foo``:: + + >>> import argparse + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('--foo', action=argparse.BooleanOptionalAction) + >>> parser.parse_args(['--no-foo']) + Namespace(foo=False) + +The recommended way to create a custom action is to extend :class:`Action`, +overriding the ``__call__`` method and optionally the ``__init__`` and +``format_usage`` methods. An example of a custom action:: @@ -923,19 +961,6 @@ values are: usage: PROG [-h] foo [foo ...] PROG: error: the following arguments are required: foo -.. _`argparse.REMAINDER`: - -* ``argparse.REMAINDER``. All the remaining command-line arguments are gathered - into a list. This is commonly useful for command line utilities that dispatch - to other command line utilities:: - - >>> parser = argparse.ArgumentParser(prog='PROG') - >>> parser.add_argument('--foo') - >>> parser.add_argument('command') - >>> parser.add_argument('args', nargs=argparse.REMAINDER) - >>> print(parser.parse_args('--foo B cmd --arg1 XX ZZ'.split())) - Namespace(args=['--arg1', 'XX', 'ZZ'], command='cmd', foo='B') - If the ``nargs`` keyword argument is not provided, the number of arguments consumed is determined by the action_. Generally this means a single command-line argument will be consumed and a single item (not a list) will be produced. @@ -981,6 +1006,14 @@ was not present at the command line:: >>> parser.parse_args([]) Namespace(foo=42) +If the target namespace already has an attribute set, the action *default* +will not over write it:: + + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('--foo', default=42) + >>> parser.parse_args([], namespace=argparse.Namespace(foo=101)) + Namespace(foo=101) + If the ``default`` value is a string, the parser parses the value as if it were a command-line argument. In particular, the parser applies any type_ conversion argument, if provided, before setting the attribute on the @@ -1017,63 +1050,70 @@ command-line argument was not present:: type ^^^^ -By default, :class:`ArgumentParser` objects read command-line arguments in as simple +By default, the parser reads command-line arguments in as simple strings. However, quite often the command-line string should instead be -interpreted as another type, like a :class:`float` or :class:`int`. The -``type`` keyword argument of :meth:`~ArgumentParser.add_argument` allows any -necessary type-checking and type conversions to be performed. Common built-in -types and functions can be used directly as the value of the ``type`` argument:: +interpreted as another type, such as a :class:`float` or :class:`int`. The +``type`` keyword for :meth:`~ArgumentParser.add_argument` allows any +necessary type-checking and type conversions to be performed. - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('foo', type=int) - >>> parser.add_argument('bar', type=open) - >>> parser.parse_args('2 temp.txt'.split()) - Namespace(bar=<_io.TextIOWrapper name='temp.txt' encoding='UTF-8'>, foo=2) +If the type_ keyword is used with the default_ keyword, the type converter +is only applied if the default is a string. -See the section on the default_ keyword argument for information on when the -``type`` argument is applied to default arguments. +The argument to ``type`` can be any callable that accepts a single string. +If the function raises :exc:`ArgumentTypeError`, :exc:`TypeError`, or +:exc:`ValueError`, the exception is caught and a nicely formatted error +message is displayed. No other exception types are handled. -To ease the use of various types of files, the argparse module provides the -factory FileType which takes the ``mode=``, ``bufsize=``, ``encoding=`` and -``errors=`` arguments of the :func:`open` function. For example, -``FileType('w')`` can be used to create a writable file:: +Common built-in types and functions can be used as type converters: - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('bar', type=argparse.FileType('w')) - >>> parser.parse_args(['out.txt']) - Namespace(bar=<_io.TextIOWrapper name='out.txt' encoding='UTF-8'>) - -``type=`` can take any callable that takes a single string argument and returns -the converted value:: - - >>> def perfect_square(string): - ... value = int(string) - ... sqrt = math.sqrt(value) - ... if sqrt != int(sqrt): - ... msg = "%r is not a perfect square" % string - ... raise argparse.ArgumentTypeError(msg) - ... return value +.. testcode:: + + import argparse + import pathlib + + parser = argparse.ArgumentParser() + parser.add_argument('count', type=int) + parser.add_argument('distance', type=float) + parser.add_argument('street', type=ascii) + parser.add_argument('code_point', type=ord) + parser.add_argument('source_file', type=open) + parser.add_argument('dest_file', type=argparse.FileType('w', encoding='latin-1')) + parser.add_argument('datapath', type=pathlib.Path) + +User defined functions can be used as well: + +.. doctest:: + + >>> def hyphenated(string): + ... return '-'.join([word[:4] for word in string.casefold().split()]) ... - >>> parser = argparse.ArgumentParser(prog='PROG') - >>> parser.add_argument('foo', type=perfect_square) - >>> parser.parse_args(['9']) - Namespace(foo=9) - >>> parser.parse_args(['7']) - usage: PROG [-h] foo - PROG: error: argument foo: '7' is not a perfect square + >>> parser = argparse.ArgumentParser() + >>> _ = parser.add_argument('short_title', type=hyphenated) + >>> parser.parse_args(['"The Tale of Two Cities"']) + Namespace(short_title='"the-tale-of-two-citi') -The choices_ keyword argument may be more convenient for type checkers that -simply check against a range of values:: +The :func:`bool` function is not recommended as a type converter. All it does +is convert empty strings to ``False`` and non-empty strings to ``True``. +This is usually not what is desired. - >>> parser = argparse.ArgumentParser(prog='PROG') - >>> parser.add_argument('foo', type=int, choices=range(5, 10)) - >>> parser.parse_args(['7']) - Namespace(foo=7) - >>> parser.parse_args(['11']) - usage: PROG [-h] {5,6,7,8,9} - PROG: error: argument foo: invalid choice: 11 (choose from 5, 6, 7, 8, 9) +In general, the ``type`` keyword is a convenience that should only be used for +simple conversions that can only raise one of the three supported exceptions. +Anything with more interesting error-handling or resource management should be +done downstream after the arguments are parsed. -See the choices_ section for more details. +For example, JSON or YAML conversions have complex error cases that require +better reporting than can be given by the ``type`` keyword. An +:exc:`~json.JSONDecodeError` would not be well formatted and a +:exc:`FileNotFound` exception would not be handled at all. + +Even :class:`~argparse.FileType` has its limitations for use with the ``type`` +keyword. If one argument uses *FileType* and then a subsequent argument fails, +an error is reported but the file is not automatically closed. In this case, it +would be better to wait until after the parser has run and then use the +:keyword:`with`-statement to manage the files. + +For type checkers that simply check against a fixed set of values, consider +using the choices_ keyword instead. choices @@ -1109,6 +1149,14 @@ container should match the type_ specified:: Any container can be passed as the *choices* value, so :class:`list` objects, :class:`set` objects, and custom containers are all supported. +Use of :class:`enum.Enum` is not recommended because it is difficult to +control its appearance in usage, help, and error messages. + +Formatted choices overrides the default *metavar* which is normally derived +from *dest*. This is usually what you want because the user never sees the +*dest* parameter. If this display isn't desirable (perhaps because there are +many choices), just specify an explicit metavar_. + required ^^^^^^^^ @@ -1123,8 +1171,8 @@ keyword argument to :meth:`~ArgumentParser.add_argument`:: >>> parser.parse_args(['--foo', 'BAR']) Namespace(foo='BAR') >>> parser.parse_args([]) - usage: argparse.py [-h] [--foo FOO] - argparse.py: error: option --foo is required + usage: [-h] --foo FOO + : error: the following arguments are required: --foo As the example shows, if an option is marked as ``required``, :meth:`~ArgumentParser.parse_args` will report an error if that option is not @@ -1337,6 +1385,9 @@ Action instances should be callable, so subclasses must override the The ``__call__`` method may perform arbitrary actions, but will typically set attributes on the ``namespace`` based on ``dest`` and ``values``. +Action subclasses can define a ``format_usage`` method that takes no argument +and return a string which will be used when printing the usage of the program. +If such method is not provided, a sensible default will be used. The parse_args() method ----------------------- diff --git a/Doc/library/array.rst b/Doc/library/array.rst index 6809c512b3f02097a4fe36cbee6dd2e6f696cbd9..78020738bf4f75b1206ec89e3a8c3130d00d7f34 100644 --- a/Doc/library/array.rst +++ b/Doc/library/array.rst @@ -22,7 +22,7 @@ defined: +-----------+--------------------+-------------------+-----------------------+-------+ | ``'B'`` | unsigned char | int | 1 | | +-----------+--------------------+-------------------+-----------------------+-------+ -| ``'u'`` | Py_UNICODE | Unicode character | 2 | \(1) | +| ``'u'`` | wchar_t | Unicode character | 2 | \(1) | +-----------+--------------------+-------------------+-----------------------+-------+ | ``'h'`` | signed short | int | 2 | | +-----------+--------------------+-------------------+-----------------------+-------+ @@ -48,15 +48,16 @@ defined: Notes: (1) - The ``'u'`` type code corresponds to Python's obsolete unicode character - (:c:type:`Py_UNICODE` which is :c:type:`wchar_t`). Depending on the - platform, it can be 16 bits or 32 bits. + It can be 16 bits or 32 bits depending on the platform. - ``'u'`` will be removed together with the rest of the :c:type:`Py_UNICODE` - API. + .. versionchanged:: 3.9 + ``array('u')`` now uses ``wchar_t`` as C type instead of deprecated + ``Py_UNICODE``. This change doesn't affect to its behavior because + ``Py_UNICODE`` is alias of ``wchar_t`` since Python 3.3. .. deprecated-removed:: 3.3 4.0 + The actual representation of values is determined by the machine architecture (strictly speaking, by the C implementation). The actual size can be accessed through the :attr:`itemsize` attribute. @@ -169,13 +170,6 @@ The following data items and methods are also supported: a.append(x)`` except that if there is a type error, the array is unchanged. -.. method:: array.fromstring() - - Deprecated alias for :meth:`frombytes`. - - .. deprecated-removed:: 3.2 3.9 - - .. method:: array.fromunicode(s) Extends this array with data from the given unicode string. The array must @@ -233,13 +227,6 @@ The following data items and methods are also supported: Convert the array to an ordinary list with the same items. -.. method:: array.tostring() - - Deprecated alias for :meth:`tobytes`. - - .. deprecated-removed:: 3.2 3.9 - - .. method:: array.tounicode() Convert the array to a unicode string. The array must be a type ``'u'`` array; diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index 6ca27609e93bae5bf92e8a420add10b82b1ca7a9..95cb017d145ca8f3e17c658daffd02250c2767ba 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -7,6 +7,10 @@ .. sectionauthor:: Martin v. Löwis .. sectionauthor:: Georg Brandl +.. testsetup:: + + import ast + **Source code:** :source:`Lib/ast.py` -------------- @@ -23,6 +27,17 @@ classes all inherit from :class:`ast.AST`. An abstract syntax tree can be compiled into a Python code object using the built-in :func:`compile` function. +.. _abstract-grammar: + +Abstract Grammar +---------------- + +The abstract grammar is currently defined as follows: + +.. literalinclude:: ../../Parser/Python.asdl + :language: asdl + + Node classes ------------ @@ -105,23 +120,1395 @@ Node classes Class :class:`ast.Constant` is now used for all constants. +.. versionchanged:: 3.9 + + Simple indices are represented by their value, extended slices are + represented as tuples. + .. deprecated:: 3.8 Old classes :class:`ast.Num`, :class:`ast.Str`, :class:`ast.Bytes`, :class:`ast.NameConstant` and :class:`ast.Ellipsis` are still available, - but they will be removed in future Python releases. In the meanwhile, + but they will be removed in future Python releases. In the meantime, instantiating them will return an instance of a different class. +.. deprecated:: 3.9 -.. _abstract-grammar: + Old classes :class:`ast.Index` and :class:`ast.ExtSlice` are still + available, but they will be removed in future Python releases. + In the meantime, instantiating them will return an instance of + a different class. -Abstract Grammar ----------------- -The abstract grammar is currently defined as follows: +Literals +^^^^^^^^ -.. literalinclude:: ../../Parser/Python.asdl - :language: none +.. class:: Constant(value) + + A constant value. The ``value`` attribute of the ``Constant`` literal contains the + Python object it represents. The values represented can be simple types + such as a number, string or ``None``, but also immutable container types + (tuples and frozensets) if all of their elements are constant. + + .. doctest:: + + >>> print(ast.dump(ast.parse('123', mode='eval'), indent=4)) + Expression( + body=Constant(value=123)) + + +.. class:: FormattedValue(value, conversion, format_spec) + + Node representing a single formatting field in an f-string. If the string + contains a single formatting field and nothing else the node can be + isolated otherwise it appears in :class:`JoinedStr`. + + * ``value`` is any expression node (such as a literal, a variable, or a + function call). + * ``conversion`` is an integer: + + * -1: no formatting + * 115: ``!s`` string formatting + * 114: ``!r`` repr formatting + * 97: ``!a`` ascii formatting + + * ``format_spec`` is a :class:`JoinedStr` node representing the formatting + of the value, or ``None`` if no format was specified. Both + ``conversion`` and ``format_spec`` can be set at the same time. + + +.. class:: JoinedStr(values) + + An f-string, comprising a series of :class:`FormattedValue` and :class:`Constant` + nodes. + + .. doctest:: + + >>> print(ast.dump(ast.parse('f"sin({a}) is {sin(a):.3}"', mode='eval'), indent=4)) + Expression( + body=JoinedStr( + values=[ + Constant(value='sin('), + FormattedValue( + value=Name(id='a', ctx=Load()), + conversion=-1), + Constant(value=') is '), + FormattedValue( + value=Call( + func=Name(id='sin', ctx=Load()), + args=[ + Name(id='a', ctx=Load())], + keywords=[]), + conversion=-1, + format_spec=JoinedStr( + values=[ + Constant(value='.3')]))])) + + +.. class:: List(elts, ctx) + Tuple(elts, ctx) + + A list or tuple. ``elts`` holds a list of nodes representing the elements. + ``ctx`` is :class:`Store` if the container is an assignment target (i.e. + ``(x,y)=something``), and :class:`Load` otherwise. + + .. doctest:: + + >>> print(ast.dump(ast.parse('[1, 2, 3]', mode='eval'), indent=4)) + Expression( + body=List( + elts=[ + Constant(value=1), + Constant(value=2), + Constant(value=3)], + ctx=Load())) + >>> print(ast.dump(ast.parse('(1, 2, 3)', mode='eval'), indent=4)) + Expression( + body=Tuple( + elts=[ + Constant(value=1), + Constant(value=2), + Constant(value=3)], + ctx=Load())) + + +.. class:: Set(elts) + + A set. ``elts`` holds a list of nodes representing the set's elements. + + .. doctest:: + + >>> print(ast.dump(ast.parse('{1, 2, 3}', mode='eval'), indent=4)) + Expression( + body=Set( + elts=[ + Constant(value=1), + Constant(value=2), + Constant(value=3)])) + + +.. class:: Dict(keys, values) + + A dictionary. ``keys`` and ``values`` hold lists of nodes representing the + keys and the values respectively, in matching order (what would be returned + when calling :code:`dictionary.keys()` and :code:`dictionary.values()`). + + When doing dictionary unpacking using dictionary literals the expression to be + expanded goes in the ``values`` list, with a ``None`` at the corresponding + position in ``keys``. + + .. doctest:: + + >>> print(ast.dump(ast.parse('{"a":1, **d}', mode='eval'), indent=4)) + Expression( + body=Dict( + keys=[ + Constant(value='a'), + None], + values=[ + Constant(value=1), + Name(id='d', ctx=Load())])) + + +Variables +^^^^^^^^^ + +.. class:: Name(id, ctx) + + A variable name. ``id`` holds the name as a string, and ``ctx`` is one of + the following types. + + +.. class:: Load() + Store() + Del() + + Variable references can be used to load the value of a variable, to assign + a new value to it, or to delete it. Variable references are given a context + to distinguish these cases. + + .. doctest:: + + >>> print(ast.dump(ast.parse('a'), indent=4)) + Module( + body=[ + Expr( + value=Name(id='a', ctx=Load()))], + type_ignores=[]) + + >>> print(ast.dump(ast.parse('a = 1'), indent=4)) + Module( + body=[ + Assign( + targets=[ + Name(id='a', ctx=Store())], + value=Constant(value=1))], + type_ignores=[]) + + >>> print(ast.dump(ast.parse('del a'), indent=4)) + Module( + body=[ + Delete( + targets=[ + Name(id='a', ctx=Del())])], + type_ignores=[]) + + +.. class:: Starred(value, ctx) + + A ``*var`` variable reference. ``value`` holds the variable, typically a + :class:`Name` node. This type must be used when building a :class:`Call` + node with ``*args``. + + .. doctest:: + + >>> print(ast.dump(ast.parse('a, *b = it'), indent=4)) + Module( + body=[ + Assign( + targets=[ + Tuple( + elts=[ + Name(id='a', ctx=Store()), + Starred( + value=Name(id='b', ctx=Store()), + ctx=Store())], + ctx=Store())], + value=Name(id='it', ctx=Load()))], + type_ignores=[]) + + +Expressions +^^^^^^^^^^^ + +.. class:: Expr(value) + + When an expression, such as a function call, appears as a statement by itself + with its return value not used or stored, it is wrapped in this container. + ``value`` holds one of the other nodes in this section, a :class:`Constant`, a + :class:`Name`, a :class:`Lambda`, a :class:`Yield` or :class:`YieldFrom` node. + + .. doctest:: + + >>> print(ast.dump(ast.parse('-a'), indent=4)) + Module( + body=[ + Expr( + value=UnaryOp( + op=USub(), + operand=Name(id='a', ctx=Load())))], + type_ignores=[]) + + +.. class:: UnaryOp(op, operand) + + A unary operation. ``op`` is the operator, and ``operand`` any expression + node. + + +.. class:: UAdd + USub + Not + Invert + + Unary operator tokens. :class:`Not` is the ``not`` keyword, :class:`Invert` + is the ``~`` operator. + + .. doctest:: + + >>> print(ast.dump(ast.parse('not x', mode='eval'), indent=4)) + Expression( + body=UnaryOp( + op=Not(), + operand=Name(id='x', ctx=Load()))) + + +.. class:: BinOp(left, op, right) + + A binary operation (like addition or division). ``op`` is the operator, and + ``left`` and ``right`` are any expression nodes. + + .. doctest:: + + >>> print(ast.dump(ast.parse('x + y', mode='eval'), indent=4)) + Expression( + body=BinOp( + left=Name(id='x', ctx=Load()), + op=Add(), + right=Name(id='y', ctx=Load()))) + + +.. class:: Add + Sub + Mult + Div + FloorDiv + Mod + Pow + LShift + RShift + BitOr + BitXor + BitAnd + MatMult + + Binary operator tokens. + + +.. class:: BoolOp(op, values) + + A boolean operation, 'or' or 'and'. ``op`` is :class:`Or` or :class:`And`. + ``values`` are the values involved. Consecutive operations with the same + operator, such as ``a or b or c``, are collapsed into one node with several + values. + + This doesn't include ``not``, which is a :class:`UnaryOp`. + + .. doctest:: + + >>> print(ast.dump(ast.parse('x or y', mode='eval'), indent=4)) + Expression( + body=BoolOp( + op=Or(), + values=[ + Name(id='x', ctx=Load()), + Name(id='y', ctx=Load())])) + + +.. class:: And + Or + + Boolean operator tokens. + + +.. class:: Compare(left, ops, comparators) + + A comparison of two or more values. ``left`` is the first value in the + comparison, ``ops`` the list of operators, and ``comparators`` the list + of values after the first element in the comparison. + + .. doctest:: + + >>> print(ast.dump(ast.parse('1 <= a < 10', mode='eval'), indent=4)) + Expression( + body=Compare( + left=Constant(value=1), + ops=[ + LtE(), + Lt()], + comparators=[ + Name(id='a', ctx=Load()), + Constant(value=10)])) + + +.. class:: Eq + NotEq + Lt + LtE + Gt + GtE + Is + IsNot + In + NotIn + + Comparison operator tokens. + + +.. class:: Call(func, args, keywords, starargs, kwargs) + + A function call. ``func`` is the function, which will often be a + :class:`Name` or :class:`Attribute` object. Of the arguments: + + * ``args`` holds a list of the arguments passed by position. + * ``keywords`` holds a list of :class:`keyword` objects representing + arguments passed by keyword. + + When creating a ``Call`` node, ``args`` and ``keywords`` are required, but + they can be empty lists. ``starargs`` and ``kwargs`` are optional. + + .. doctest:: + + >>> print(ast.dump(ast.parse('func(a, b=c, *d, **e)', mode='eval'), indent=4)) + Expression( + body=Call( + func=Name(id='func', ctx=Load()), + args=[ + Name(id='a', ctx=Load()), + Starred( + value=Name(id='d', ctx=Load()), + ctx=Load())], + keywords=[ + keyword( + arg='b', + value=Name(id='c', ctx=Load())), + keyword( + value=Name(id='e', ctx=Load()))])) + + +.. class:: keyword(arg, value) + + A keyword argument to a function call or class definition. ``arg`` is a raw + string of the parameter name, ``value`` is a node to pass in. + + +.. class:: IfExp(test, body, orelse) + + An expression such as ``a if b else c``. Each field holds a single node, so + in the following example, all three are :class:`Name` nodes. + + .. doctest:: + + >>> print(ast.dump(ast.parse('a if b else c', mode='eval'), indent=4)) + Expression( + body=IfExp( + test=Name(id='b', ctx=Load()), + body=Name(id='a', ctx=Load()), + orelse=Name(id='c', ctx=Load()))) + + +.. class:: Attribute(value, attr, ctx) + + Attribute access, e.g. ``d.keys``. ``value`` is a node, typically a + :class:`Name`. ``attr`` is a bare string giving the name of the attribute, + and ``ctx`` is :class:`Load`, :class:`Store` or :class:`Del` according to how + the attribute is acted on. + + .. doctest:: + + >>> print(ast.dump(ast.parse('snake.colour', mode='eval'), indent=4)) + Expression( + body=Attribute( + value=Name(id='snake', ctx=Load()), + attr='colour', + ctx=Load())) + + +.. class:: NamedExpr(target, value) + + A named expression. This AST node is produced by the assignment expressions + operator (also known as the walrus operator). As opposed to the :class:`Assign` + node in which the first argument can be multiple nodes, in this case both + ``target`` and ``value`` must be single nodes. + + .. doctest:: + + >>> print(ast.dump(ast.parse('(x := 4)', mode='eval'), indent=4)) + Expression( + body=NamedExpr( + target=Name(id='x', ctx=Store()), + value=Constant(value=4))) + + +Subscripting +~~~~~~~~~~~~ + +.. class:: Subscript(value, slice, ctx) + + A subscript, such as ``l[1]``. ``value`` is the subscripted object + (usually sequence or mapping). ``slice`` is an index, slice or key. + It can be a :class:`Tuple` and contain a :class:`Slice`. + ``ctx`` is :class:`Load`, :class:`Store` or :class:`Del` + according to the action performed with the subscript. + + .. doctest:: + + >>> print(ast.dump(ast.parse('l[1:2, 3]', mode='eval'), indent=4)) + Expression( + body=Subscript( + value=Name(id='l', ctx=Load()), + slice=Tuple( + elts=[ + Slice( + lower=Constant(value=1), + upper=Constant(value=2)), + Constant(value=3)], + ctx=Load()), + ctx=Load())) + + +.. class:: Slice(lower, upper, step) + + Regular slicing (on the form ``lower:upper`` or ``lower:upper:step``). + Can occur only inside the *slice* field of :class:`Subscript`, either + directly or as an element of :class:`Tuple`. + + .. doctest:: + + >>> print(ast.dump(ast.parse('l[1:2]', mode='eval'), indent=4)) + Expression( + body=Subscript( + value=Name(id='l', ctx=Load()), + slice=Slice( + lower=Constant(value=1), + upper=Constant(value=2)), + ctx=Load())) + + +Comprehensions +~~~~~~~~~~~~~~ + +.. class:: ListComp(elt, generators) + SetComp(elt, generators) + GeneratorExp(elt, generators) + DictComp(key, value, generators) + + List and set comprehensions, generator expressions, and dictionary + comprehensions. ``elt`` (or ``key`` and ``value``) is a single node + representing the part that will be evaluated for each item. + + ``generators`` is a list of :class:`comprehension` nodes. + + .. doctest:: + + >>> print(ast.dump(ast.parse('[x for x in numbers]', mode='eval'), indent=4)) + Expression( + body=ListComp( + elt=Name(id='x', ctx=Load()), + generators=[ + comprehension( + target=Name(id='x', ctx=Store()), + iter=Name(id='numbers', ctx=Load()), + ifs=[], + is_async=0)])) + >>> print(ast.dump(ast.parse('{x: x**2 for x in numbers}', mode='eval'), indent=4)) + Expression( + body=DictComp( + key=Name(id='x', ctx=Load()), + value=BinOp( + left=Name(id='x', ctx=Load()), + op=Pow(), + right=Constant(value=2)), + generators=[ + comprehension( + target=Name(id='x', ctx=Store()), + iter=Name(id='numbers', ctx=Load()), + ifs=[], + is_async=0)])) + >>> print(ast.dump(ast.parse('{x for x in numbers}', mode='eval'), indent=4)) + Expression( + body=SetComp( + elt=Name(id='x', ctx=Load()), + generators=[ + comprehension( + target=Name(id='x', ctx=Store()), + iter=Name(id='numbers', ctx=Load()), + ifs=[], + is_async=0)])) + + +.. class:: comprehension(target, iter, ifs, is_async) + + One ``for`` clause in a comprehension. ``target`` is the reference to use for + each element - typically a :class:`Name` or :class:`Tuple` node. ``iter`` + is the object to iterate over. ``ifs`` is a list of test expressions: each + ``for`` clause can have multiple ``ifs``. + + ``is_async`` indicates a comprehension is asynchronous (using an + ``async for`` instead of ``for``). The value is an integer (0 or 1). + + .. doctest:: + + >>> print(ast.dump(ast.parse('[ord(c) for line in file for c in line]', mode='eval'), + ... indent=4)) # Multiple comprehensions in one. + Expression( + body=ListComp( + elt=Call( + func=Name(id='ord', ctx=Load()), + args=[ + Name(id='c', ctx=Load())], + keywords=[]), + generators=[ + comprehension( + target=Name(id='line', ctx=Store()), + iter=Name(id='file', ctx=Load()), + ifs=[], + is_async=0), + comprehension( + target=Name(id='c', ctx=Store()), + iter=Name(id='line', ctx=Load()), + ifs=[], + is_async=0)])) + + >>> print(ast.dump(ast.parse('(n**2 for n in it if n>5 if n<10)', mode='eval'), + ... indent=4)) # generator comprehension + Expression( + body=GeneratorExp( + elt=BinOp( + left=Name(id='n', ctx=Load()), + op=Pow(), + right=Constant(value=2)), + generators=[ + comprehension( + target=Name(id='n', ctx=Store()), + iter=Name(id='it', ctx=Load()), + ifs=[ + Compare( + left=Name(id='n', ctx=Load()), + ops=[ + Gt()], + comparators=[ + Constant(value=5)]), + Compare( + left=Name(id='n', ctx=Load()), + ops=[ + Lt()], + comparators=[ + Constant(value=10)])], + is_async=0)])) + + >>> print(ast.dump(ast.parse('[i async for i in soc]', mode='eval'), + ... indent=4)) # Async comprehension + Expression( + body=ListComp( + elt=Name(id='i', ctx=Load()), + generators=[ + comprehension( + target=Name(id='i', ctx=Store()), + iter=Name(id='soc', ctx=Load()), + ifs=[], + is_async=1)])) + +Statements +^^^^^^^^^^ + +.. class:: Assign(targets, value, type_comment) + + An assignment. ``targets`` is a list of nodes, and ``value`` is a single node. + + Multiple nodes in ``targets`` represents assigning the same value to each. + Unpacking is represented by putting a :class:`Tuple` or :class:`List` + within ``targets``. + + .. attribute:: type_comment + + ``type_comment`` is an optional string with the type annotation as a comment. + + .. doctest:: + + >>> print(ast.dump(ast.parse('a = b = 1'), indent=4)) # Multiple assignment + Module( + body=[ + Assign( + targets=[ + Name(id='a', ctx=Store()), + Name(id='b', ctx=Store())], + value=Constant(value=1))], + type_ignores=[]) + + >>> print(ast.dump(ast.parse('a,b = c'), indent=4)) # Unpacking + Module( + body=[ + Assign( + targets=[ + Tuple( + elts=[ + Name(id='a', ctx=Store()), + Name(id='b', ctx=Store())], + ctx=Store())], + value=Name(id='c', ctx=Load()))], + type_ignores=[]) + + +.. class:: AnnAssign(target, annotation, value, simple) + + An assignment with a type annotation. ``target`` is a single node and can + be a :class:`Name`, a :class:`Attribute` or a :class:`Subscript`. + ``annotation`` is the annotation, such as a :class:`Constant` or :class:`Name` + node. ``value`` is a single optional node. ``simple`` is a boolean integer + set to True for a :class:`Name` node in ``target`` that do not appear in + between parenthesis and are hence pure names and not expressions. + + .. doctest:: + + >>> print(ast.dump(ast.parse('c: int'), indent=4)) + Module( + body=[ + AnnAssign( + target=Name(id='c', ctx=Store()), + annotation=Name(id='int', ctx=Load()), + simple=1)], + type_ignores=[]) + + >>> print(ast.dump(ast.parse('(a): int = 1'), indent=4)) # Annotation with parenthesis + Module( + body=[ + AnnAssign( + target=Name(id='a', ctx=Store()), + annotation=Name(id='int', ctx=Load()), + value=Constant(value=1), + simple=0)], + type_ignores=[]) + + >>> print(ast.dump(ast.parse('a.b: int'), indent=4)) # Attribute annotation + Module( + body=[ + AnnAssign( + target=Attribute( + value=Name(id='a', ctx=Load()), + attr='b', + ctx=Store()), + annotation=Name(id='int', ctx=Load()), + simple=0)], + type_ignores=[]) + + >>> print(ast.dump(ast.parse('a[1]: int'), indent=4)) # Subscript annotation + Module( + body=[ + AnnAssign( + target=Subscript( + value=Name(id='a', ctx=Load()), + slice=Constant(value=1), + ctx=Store()), + annotation=Name(id='int', ctx=Load()), + simple=0)], + type_ignores=[]) + + +.. class:: AugAssign(target, op, value) + + Augmented assignment, such as ``a += 1``. In the following example, + ``target`` is a :class:`Name` node for ``x`` (with the :class:`Store` + context), ``op`` is :class:`Add`, and ``value`` is a :class:`Constant` with + value for 1. + + The ``target`` attribute connot be of class :class:`Tuple` or :class:`List`, + unlike the targets of :class:`Assign`. + + .. doctest:: + + >>> print(ast.dump(ast.parse('x += 2'), indent=4)) + Module( + body=[ + AugAssign( + target=Name(id='x', ctx=Store()), + op=Add(), + value=Constant(value=2))], + type_ignores=[]) + + +.. class:: Raise(exc, cause) + + A ``raise`` statement. ``exc`` is the exception object to be raised, normally a + :class:`Call` or :class:`Name`, or ``None`` for a standalone ``raise``. + ``cause`` is the optional part for ``y`` in ``raise x from y``. + + .. doctest:: + + >>> print(ast.dump(ast.parse('raise x from y'), indent=4)) + Module( + body=[ + Raise( + exc=Name(id='x', ctx=Load()), + cause=Name(id='y', ctx=Load()))], + type_ignores=[]) + + +.. class:: Assert(test, msg) + + An assertion. ``test`` holds the condition, such as a :class:`Compare` node. + ``msg`` holds the failure message. + + .. doctest:: + + >>> print(ast.dump(ast.parse('assert x,y'), indent=4)) + Module( + body=[ + Assert( + test=Name(id='x', ctx=Load()), + msg=Name(id='y', ctx=Load()))], + type_ignores=[]) + + +.. class:: Delete(targets) + + Represents a ``del`` statement. ``targets`` is a list of nodes, such as + :class:`Name`, :class:`Attribute` or :class:`Subscript` nodes. + + .. doctest:: + + >>> print(ast.dump(ast.parse('del x,y,z'), indent=4)) + Module( + body=[ + Delete( + targets=[ + Name(id='x', ctx=Del()), + Name(id='y', ctx=Del()), + Name(id='z', ctx=Del())])], + type_ignores=[]) + + +.. class:: Pass() + + A ``pass`` statement. + + .. doctest:: + + >>> print(ast.dump(ast.parse('pass'), indent=4)) + Module( + body=[ + Pass()], + type_ignores=[]) + + +Other statements which are only applicable inside functions or loops are +described in other sections. + +Imports +~~~~~~~ + +.. class:: Import(names) + + An import statement. ``names`` is a list of :class:`alias` nodes. + + .. doctest:: + + >>> print(ast.dump(ast.parse('import x,y,z'), indent=4)) + Module( + body=[ + Import( + names=[ + alias(name='x'), + alias(name='y'), + alias(name='z')])], + type_ignores=[]) + + +.. class:: ImportFrom(module, names, level) + + Represents ``from x import y``. ``module`` is a raw string of the 'from' name, + without any leading dots, or ``None`` for statements such as ``from . import foo``. + ``level`` is an integer holding the level of the relative import (0 means + absolute import). + + .. doctest:: + + >>> print(ast.dump(ast.parse('from y import x,y,z'), indent=4)) + Module( + body=[ + ImportFrom( + module='y', + names=[ + alias(name='x'), + alias(name='y'), + alias(name='z')], + level=0)], + type_ignores=[]) + + +.. class:: alias(name, asname) + + Both parameters are raw strings of the names. ``asname`` can be ``None`` if + the regular name is to be used. + + .. doctest:: + + >>> print(ast.dump(ast.parse('from ..foo.bar import a as b, c'), indent=4)) + Module( + body=[ + ImportFrom( + module='foo.bar', + names=[ + alias(name='a', asname='b'), + alias(name='c')], + level=2)], + type_ignores=[]) + +Control flow +^^^^^^^^^^^^ + +.. note:: + Optional clauses such as ``else`` are stored as an empty list if they're + not present. + +.. class:: If(test, body, orelse) + + An ``if`` statement. ``test`` holds a single node, such as a :class:`Compare` + node. ``body`` and ``orelse`` each hold a list of nodes. + + ``elif`` clauses don't have a special representation in the AST, but rather + appear as extra :class:`If` nodes within the ``orelse`` section of the + previous one. + + .. doctest:: + + >>> print(ast.dump(ast.parse(""" + ... if x: + ... ... + ... elif y: + ... ... + ... else: + ... ... + ... """), indent=4)) + Module( + body=[ + If( + test=Name(id='x', ctx=Load()), + body=[ + Expr( + value=Constant(value=Ellipsis))], + orelse=[ + If( + test=Name(id='y', ctx=Load()), + body=[ + Expr( + value=Constant(value=Ellipsis))], + orelse=[ + Expr( + value=Constant(value=Ellipsis))])])], + type_ignores=[]) + + +.. class:: For(target, iter, body, orelse, type_comment) + + A ``for`` loop. ``target`` holds the variable(s) the loop assigns to, as a + single :class:`Name`, :class:`Tuple` or :class:`List` node. ``iter`` holds + the item to be looped over, again as a single node. ``body`` and ``orelse`` + contain lists of nodes to execute. Those in ``orelse`` are executed if the + loop finishes normally, rather than via a ``break`` statement. + + .. attribute:: type_comment + + ``type_comment`` is an optional string with the type annotation as a comment. + + .. doctest:: + + >>> print(ast.dump(ast.parse(""" + ... for x in y: + ... ... + ... else: + ... ... + ... """), indent=4)) + Module( + body=[ + For( + target=Name(id='x', ctx=Store()), + iter=Name(id='y', ctx=Load()), + body=[ + Expr( + value=Constant(value=Ellipsis))], + orelse=[ + Expr( + value=Constant(value=Ellipsis))])], + type_ignores=[]) + + +.. class:: While(test, body, orelse) + + A ``while`` loop. ``test`` holds the condition, such as a :class:`Compare` + node. + + .. doctest:: + + >> print(ast.dump(ast.parse(""" + ... while x: + ... ... + ... else: + ... ... + ... """), indent=4)) + Module( + body=[ + While( + test=Name(id='x', ctx=Load()), + body=[ + Expr( + value=Constant(value=Ellipsis))], + orelse=[ + Expr( + value=Constant(value=Ellipsis))])], + type_ignores=[]) + + +.. class:: Break + Continue + + The ``break`` and ``continue`` statements. + + .. doctest:: + + >>> print(ast.dump(ast.parse("""\ + ... for a in b: + ... if a > 5: + ... break + ... else: + ... continue + ... + ... """), indent=4)) + Module( + body=[ + For( + target=Name(id='a', ctx=Store()), + iter=Name(id='b', ctx=Load()), + body=[ + If( + test=Compare( + left=Name(id='a', ctx=Load()), + ops=[ + Gt()], + comparators=[ + Constant(value=5)]), + body=[ + Break()], + orelse=[ + Continue()])], + orelse=[])], + type_ignores=[]) + + +.. class:: Try(body, handlers, orelse, finalbody) + + ``try`` blocks. All attributes are list of nodes to execute, except for + ``handlers``, which is a list of :class:`ExceptHandler` nodes. + + .. doctest:: + + >>> print(ast.dump(ast.parse(""" + ... try: + ... ... + ... except Exception: + ... ... + ... except OtherException as e: + ... ... + ... else: + ... ... + ... finally: + ... ... + ... """), indent=4)) + Module( + body=[ + Try( + body=[ + Expr( + value=Constant(value=Ellipsis))], + handlers=[ + ExceptHandler( + type=Name(id='Exception', ctx=Load()), + body=[ + Expr( + value=Constant(value=Ellipsis))]), + ExceptHandler( + type=Name(id='OtherException', ctx=Load()), + name='e', + body=[ + Expr( + value=Constant(value=Ellipsis))])], + orelse=[ + Expr( + value=Constant(value=Ellipsis))], + finalbody=[ + Expr( + value=Constant(value=Ellipsis))])], + type_ignores=[]) + + +.. class:: ExceptHandler(type, name, body) + + A single ``except`` clause. ``type`` is the exception type it will match, + typically a :class:`Name` node (or ``None`` for a catch-all ``except:`` clause). + ``name`` is a raw string for the name to hold the exception, or ``None`` if + the clause doesn't have ``as foo``. ``body`` is a list of nodes. + + .. doctest:: + + >>> print(ast.dump(ast.parse("""\ + ... try: + ... a + 1 + ... except TypeError: + ... pass + ... """), indent=4)) + Module( + body=[ + Try( + body=[ + Expr( + value=BinOp( + left=Name(id='a', ctx=Load()), + op=Add(), + right=Constant(value=1)))], + handlers=[ + ExceptHandler( + type=Name(id='TypeError', ctx=Load()), + body=[ + Pass()])], + orelse=[], + finalbody=[])], + type_ignores=[]) + + +.. class:: With(items, body, type_comment) + + A ``with`` block. ``items`` is a list of :class:`withitem` nodes representing + the context managers, and ``body`` is the indented block inside the context. + + .. attribute:: type_comment + + ``type_comment`` is an optional string with the type annotation as a comment. + + +.. class:: withitem(context_expr, optional_vars) + + A single context manager in a ``with`` block. ``context_expr`` is the context + manager, often a :class:`Call` node. ``optional_vars`` is a :class:`Name`, + :class:`Tuple` or :class:`List` for the ``as foo`` part, or ``None`` if that + isn't used. + + .. doctest:: + + >>> print(ast.dump(ast.parse("""\ + ... with a as b, c as d: + ... something(b, d) + ... """), indent=4)) + Module( + body=[ + With( + items=[ + withitem( + context_expr=Name(id='a', ctx=Load()), + optional_vars=Name(id='b', ctx=Store())), + withitem( + context_expr=Name(id='c', ctx=Load()), + optional_vars=Name(id='d', ctx=Store()))], + body=[ + Expr( + value=Call( + func=Name(id='something', ctx=Load()), + args=[ + Name(id='b', ctx=Load()), + Name(id='d', ctx=Load())], + keywords=[]))])], + type_ignores=[]) + + +Function and class definitions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. class:: FunctionDef(name, args, body, decorator_list, returns, type_comment) + + A function definition. + + * ``name`` is a raw string of the function name. + * ``args`` is a :class:`arguments` node. + * ``body`` is the list of nodes inside the function. + * ``decorator_list`` is the list of decorators to be applied, stored outermost + first (i.e. the first in the list will be applied last). + * ``returns`` is the return annotation. + + .. attribute:: type_comment + + ``type_comment`` is an optional string with the type annotation as a comment. + + +.. class:: Lambda(args, body) + + ``lambda`` is a minimal function definition that can be used inside an + expression. Unlike :class:`FunctionDef`, ``body`` holds a single node. + + .. doctest:: + + >>> print(ast.dump(ast.parse('lambda x,y: ...'), indent=4)) + Module( + body=[ + Expr( + value=Lambda( + args=arguments( + posonlyargs=[], + args=[ + arg(arg='x'), + arg(arg='y')], + kwonlyargs=[], + kw_defaults=[], + defaults=[]), + body=Constant(value=Ellipsis)))], + type_ignores=[]) + + +.. class:: arguments(posonlyargs, args, vararg, kwonlyargs, kw_defaults, kwarg, defaults) + + The arguments for a function. + + * ``posonlyargs``, ``args`` and ``kwonlyargs`` are lists of :class:`arg` nodes. + * ``vararg`` and ``kwarg`` are single :class:`arg` nodes, referring to the + ``*args, **kwargs`` parameters. + * ``kw_defaults`` is a list of default values for keyword-only arguments. If + one is ``None``, the corresponding argument is required. + * ``defaults`` is a list of default values for arguments that can be passed + positionally. If there are fewer defaults, they correspond to the last n + arguments. + + +.. class:: arg(arg, annotation, type_comment) + + A single argument in a list. ``arg`` is a raw string of the argument + name, ``annotation`` is its annotation, such as a :class:`Str` or + :class:`Name` node. + + .. attribute:: type_comment + + ``type_comment`` is an optional string with the type annotation as a comment + + .. doctest:: + + >>> print(ast.dump(ast.parse("""\ + ... @decorator1 + ... @decorator2 + ... def f(a: 'annotation', b=1, c=2, *d, e, f=3, **g) -> 'return annotation': + ... pass + ... """), indent=4)) + Module( + body=[ + FunctionDef( + name='f', + args=arguments( + posonlyargs=[], + args=[ + arg( + arg='a', + annotation=Constant(value='annotation')), + arg(arg='b'), + arg(arg='c')], + vararg=arg(arg='d'), + kwonlyargs=[ + arg(arg='e'), + arg(arg='f')], + kw_defaults=[ + None, + Constant(value=3)], + kwarg=arg(arg='g'), + defaults=[ + Constant(value=1), + Constant(value=2)]), + body=[ + Pass()], + decorator_list=[ + Name(id='decorator1', ctx=Load()), + Name(id='decorator2', ctx=Load())], + returns=Constant(value='return annotation'))], + type_ignores=[]) + + +.. class:: Return(value) + + A ``return`` statement. + + .. doctest:: + + >>> print(ast.dump(ast.parse('return 4'), indent=4)) + Module( + body=[ + Return( + value=Constant(value=4))], + type_ignores=[]) + + +.. class:: Yield(value) + YieldFrom(value) + + A ``yield`` or ``yield from`` expression. Because these are expressions, they + must be wrapped in a :class:`Expr` node if the value sent back is not used. + + .. doctest:: + + >>> print(ast.dump(ast.parse('yield x'), indent=4)) + Module( + body=[ + Expr( + value=Yield( + value=Name(id='x', ctx=Load())))], + type_ignores=[]) + + >>> print(ast.dump(ast.parse('yield from x'), indent=4)) + Module( + body=[ + Expr( + value=YieldFrom( + value=Name(id='x', ctx=Load())))], + type_ignores=[]) + + +.. class:: Global(names) + Nonlocal(names) + + ``global`` and ``nonlocal`` statements. ``names`` is a list of raw strings. + + .. doctest:: + + >>> print(ast.dump(ast.parse('global x,y,z'), indent=4)) + Module( + body=[ + Global( + names=[ + 'x', + 'y', + 'z'])], + type_ignores=[]) + + >>> print(ast.dump(ast.parse('nonlocal x,y,z'), indent=4)) + Module( + body=[ + Nonlocal( + names=[ + 'x', + 'y', + 'z'])], + type_ignores=[]) + + +.. class:: ClassDef(name, bases, keywords, starargs, kwargs, body, decorator_list) + + A class definition. + + * ``name`` is a raw string for the class name + * ``bases`` is a list of nodes for explicitly specified base classes. + * ``keywords`` is a list of :class:`keyword` nodes, principally for 'metaclass'. + Other keywords will be passed to the metaclass, as per `PEP-3115 + `_. + * ``starargs`` and ``kwargs`` are each a single node, as in a function call. + starargs will be expanded to join the list of base classes, and kwargs will + be passed to the metaclass. + * ``body`` is a list of nodes representing the code within the class + definition. + * ``decorator_list`` is a list of nodes, as in :class:`FunctionDef`. + + .. doctest:: + + >>> print(ast.dump(ast.parse("""\ + ... @decorator1 + ... @decorator2 + ... class Foo(base1, base2, metaclass=meta): + ... pass + ... """), indent=4)) + Module( + body=[ + ClassDef( + name='Foo', + bases=[ + Name(id='base1', ctx=Load()), + Name(id='base2', ctx=Load())], + keywords=[ + keyword( + arg='metaclass', + value=Name(id='meta', ctx=Load()))], + body=[ + Pass()], + decorator_list=[ + Name(id='decorator1', ctx=Load()), + Name(id='decorator2', ctx=Load())])], + type_ignores=[]) + +Async and await +^^^^^^^^^^^^^^^ + +.. class:: AsyncFunctionDef(name, args, body, decorator_list, returns, type_comment) + + An ``async def`` function definition. Has the same fields as + :class:`FunctionDef`. + + +.. class:: Await(value) + + An ``await`` expression. ``value`` is what it waits for. + Only valid in the body of an :class:`AsyncFunctionDef`. + +.. doctest:: + + >>> print(ast.dump(ast.parse("""\ + ... async def f(): + ... await other_func() + ... """), indent=4)) + Module( + body=[ + AsyncFunctionDef( + name='f', + args=arguments( + posonlyargs=[], + args=[], + kwonlyargs=[], + kw_defaults=[], + defaults=[]), + body=[ + Expr( + value=Await( + value=Call( + func=Name(id='other_func', ctx=Load()), + args=[], + keywords=[])))], + decorator_list=[])], + type_ignores=[]) + + +.. class:: AsyncFor(target, iter, body, orelse, type_comment) + AsyncWith(items, body, type_comment) + + ``async for`` loops and ``async with`` context managers. They have the same + fields as :class:`For` and :class:`With`, respectively. Only valid in the + body of an :class:`AsyncFunctionDef`. + +.. note:: + When a string is parsed by :func:`ast.parse`, operator nodes (subclasses + of :class:`ast.operator`, :class:`ast.unaryop`, :class:`ast.cmpop`, + :class:`ast.boolop` and :class:`ast.expr_context`) on the returned tree + will be singletons. Changes to one will be reflected in all other + occurrences of the same value (e.g. :class:`ast.Add`). :mod:`ast` Helpers @@ -165,6 +1552,24 @@ and classes for traversing abstract syntax trees: Added ``type_comments``, ``mode='func_type'`` and ``feature_version``. +.. function:: unparse(ast_obj) + + Unparse an :class:`ast.AST` object and generate a string with code + that would produce an equivalent :class:`ast.AST` object if parsed + back with :func:`ast.parse`. + + .. warning:: + The produced code string will not necessarily be equal to the original + code that generated the :class:`ast.AST` object (without any compiler + optimizations, such as constant tuples/frozensets). + + .. warning:: + Trying to unparse a highly complex expression would result with + :exc:`RecursionError`. + + .. versionadded:: 3.9 + + .. function:: literal_eval(node_or_string) Safely evaluate an expression node or a string containing a Python literal or @@ -185,6 +1590,9 @@ and classes for traversing abstract syntax trees: .. versionchanged:: 3.2 Now allows bytes and set literals. + .. versionchanged:: 3.9 + Now supports creating empty sets with ``'set()'``. + .. function:: get_docstring(node, clean=True) @@ -306,7 +1714,7 @@ and classes for traversing abstract syntax trees: def visit_Name(self, node): return Subscript( value=Name(id='data', ctx=Load()), - slice=Index(value=Constant(value=node.id)), + slice=Constant(value=node.id), ctx=node.ctx ) @@ -331,7 +1739,7 @@ and classes for traversing abstract syntax trees: node = YourTransformer().visit(node) -.. function:: dump(node, annotate_fields=True, include_attributes=False) +.. function:: dump(node, annotate_fields=True, include_attributes=False, *, indent=None) Return a formatted dump of the tree in *node*. This is mainly useful for debugging purposes. If *annotate_fields* is true (by default), @@ -341,7 +1749,110 @@ and classes for traversing abstract syntax trees: numbers and column offsets are not dumped by default. If this is wanted, *include_attributes* can be set to true. + If *indent* is a non-negative integer or string, then the tree will be + pretty-printed with that indent level. An indent level + of 0, negative, or ``""`` will only insert newlines. ``None`` (the default) + selects the single line representation. Using a positive integer indent + indents that many spaces per level. If *indent* is a string (such as ``"\t"``), + that string is used to indent each level. + + .. versionchanged:: 3.9 + Added the *indent* option. + + +.. _ast-compiler-flags: + +Compiler Flags +-------------- + +The following flags may be passed to :func:`compile` in order to change +effects on the compilation of a program: + +.. data:: PyCF_ALLOW_TOP_LEVEL_AWAIT + + Enables support for top-level ``await``, ``async for``, ``async with`` + and async comprehensions. + + .. versionadded:: 3.8 + +.. data:: PyCF_ONLY_AST + + Generates and returns an abstract syntax tree instead of returning a + compiled code object. + +.. data:: PyCF_TYPE_COMMENTS + + Enables support for :pep:`484` and :pep:`526` style type comments + (``# type: ``, ``# type: ignore ``). + + .. versionadded:: 3.8 + + +.. _ast-cli: + +Command-Line Usage +------------------ + +.. versionadded:: 3.9 + +The :mod:`ast` module can be executed as a script from the command line. +It is as simple as: + +.. code-block:: sh + + python -m ast [-m ] [-a] [infile] + +The following options are accepted: + +.. program:: ast + +.. cmdoption:: -h, --help + + Show the help message and exit. + +.. cmdoption:: -m + --mode + + Specify what kind of code must be compiled, like the *mode* argument + in :func:`parse`. + +.. cmdoption:: --no-type-comments + + Don't parse type comments. + +.. cmdoption:: -a, --include-attributes + + Include attributes such as line numbers and column offsets. + +.. cmdoption:: -i + --indent + + Indentation of nodes in AST (number of spaces). + +If :file:`infile` is specified its contents are parsed to AST and dumped +to stdout. Otherwise, the content is read from stdin. + + .. seealso:: - `Green Tree Snakes `_, an external documentation resource, has good - details on working with Python ASTs. + `Green Tree Snakes `_, an external + documentation resource, has good details on working with Python ASTs. + + `ASTTokens `_ + annotates Python ASTs with the positions of tokens and text in the source + code that generated them. This is helpful for tools that make source code + transformations. + + `leoAst.py `_ unifies the + token-based and parse-tree-based views of python programs by inserting + two-way links between tokens and ast nodes. + + `LibCST `_ parses code as a Concrete Syntax + Tree that looks like an ast tree and keeps all formatting details. It's + useful for building automated refactoring (codemod) applications and + linters. + + `Parso `_ is a Python parser that supports + error recovery and round-trip parsing for different Python versions (in + multiple Python versions). Parso is also able to list multiple syntax errors + in your python file. \ No newline at end of file diff --git a/Doc/library/asyncio-api-index.rst b/Doc/library/asyncio-api-index.rst index d5b5659abc65e2fa4e1ec513996ebcdb20042e49..047e5bbc58ccadec69c067c517b9d9943b1d4c1c 100644 --- a/Doc/library/asyncio-api-index.rst +++ b/Doc/library/asyncio-api-index.rst @@ -48,6 +48,9 @@ await on multiple things with timeouts. * - :class:`Task` - Task object. + * - :func:`to_thread` + - Asychronously run a function in a separate OS thread. + * - :func:`run_coroutine_threadsafe` - Schedule a coroutine from another OS thread. diff --git a/Doc/library/asyncio-dev.rst b/Doc/library/asyncio-dev.rst index 0d302ea49b0de525f5aad89442718b181a3353c2..02a00033152aba764c3ad04daa55ed87493b7199 100644 --- a/Doc/library/asyncio-dev.rst +++ b/Doc/library/asyncio-dev.rst @@ -25,7 +25,7 @@ There are several ways to enable asyncio debug mode: * Setting the :envvar:`PYTHONASYNCIODEBUG` environment variable to ``1``. -* Using the :option:`-X` ``dev`` Python command line option. +* Using the :ref:`Python Development Mode `. * Passing ``debug=True`` to :func:`asyncio.run`. @@ -107,6 +107,16 @@ The :meth:`loop.run_in_executor` method can be used with a blocking code in a different OS thread without blocking the OS thread that the event loop runs in. +There is currently no way to schedule coroutines or callbacks directly +from a different process (such as one started with +:mod:`multiprocessing`). The :ref:`Event Loop Methods ` +section lists APIs that can read from pipes and watch file descriptors +without blocking the event loop. In addition, asyncio's +:ref:`Subprocess ` APIs provide a way to start a +process and communicate with it from the event loop. Lastly, the +aforementioned :meth:`loop.run_in_executor` method can also be used +with a :class:`concurrent.futures.ProcessPoolExecutor` to execute +code in a different process. .. _asyncio-handle-blocking: diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index 32bc219cf5c376c0244f0421106f9ce6cd83287f..be43ca4aebe81a5ca4e1ff43caeb205157c41ad7 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -173,6 +173,18 @@ Running and stopping the loop .. versionadded:: 3.6 +.. coroutinemethod:: loop.shutdown_default_executor() + + Schedule the closure of the default executor and wait for it to join all of + the threads in the :class:`ThreadPoolExecutor`. After calling this method, a + :exc:`RuntimeError` will be raised if :meth:`loop.run_in_executor` is called + while using the default executor. + + Note that there is no need to call this function when + :func:`asyncio.run` is used. + + .. versionadded:: 3.9 + Scheduling callbacks ^^^^^^^^^^^^^^^^^^^^ @@ -309,7 +321,7 @@ Creating Futures and Tasks .. versionadded:: 3.5.2 -.. method:: loop.create_task(coro, \*, name=None) +.. method:: loop.create_task(coro, *, name=None) Schedule the execution of a :ref:`coroutine`. Return a :class:`Task` object. @@ -344,7 +356,7 @@ Opening network connections ^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. coroutinemethod:: loop.create_connection(protocol_factory, \ - host=None, port=None, \*, ssl=None, \ + host=None, port=None, *, ssl=None, \ family=0, proto=0, flags=0, sock=None, \ local_addr=None, server_hostname=None, \ ssl_handshake_timeout=None, \ @@ -470,7 +482,7 @@ Opening network connections that can be used directly in async/await code. .. coroutinemethod:: loop.create_datagram_endpoint(protocol_factory, \ - local_addr=None, remote_addr=None, \*, \ + local_addr=None, remote_addr=None, *, \ family=0, proto=0, flags=0, \ reuse_address=None, reuse_port=None, \ allow_broadcast=None, sock=None) @@ -547,7 +559,7 @@ Opening network connections Added support for Windows. .. coroutinemethod:: loop.create_unix_connection(protocol_factory, \ - path=None, \*, ssl=None, sock=None, \ + path=None, *, ssl=None, sock=None, \ server_hostname=None, ssl_handshake_timeout=None) Create a Unix connection. @@ -580,7 +592,7 @@ Creating network servers ^^^^^^^^^^^^^^^^^^^^^^^^ .. coroutinemethod:: loop.create_server(protocol_factory, \ - host=None, port=None, \*, \ + host=None, port=None, *, \ family=socket.AF_UNSPEC, \ flags=socket.AI_PASSIVE, \ sock=None, backlog=100, ssl=None, \ @@ -671,7 +683,7 @@ Creating network servers .. coroutinemethod:: loop.create_unix_server(protocol_factory, path=None, \ - \*, sock=None, backlog=100, ssl=None, \ + *, sock=None, backlog=100, ssl=None, \ ssl_handshake_timeout=None, start_serving=True) Similar to :meth:`loop.create_server` but works with the @@ -696,7 +708,7 @@ Creating network servers The *path* parameter can now be a :class:`~pathlib.Path` object. .. coroutinemethod:: loop.connect_accepted_socket(protocol_factory, \ - sock, \*, ssl=None, ssl_handshake_timeout=None) + sock, *, ssl=None, ssl_handshake_timeout=None) Wrap an already accepted connection into a transport/protocol pair. @@ -761,7 +773,7 @@ TLS Upgrade ^^^^^^^^^^^ .. coroutinemethod:: loop.start_tls(transport, protocol, \ - sslcontext, \*, server_side=False, \ + sslcontext, *, server_side=False, \ server_hostname=None, ssl_handshake_timeout=None) Upgrade an existing transport-based connection to TLS. @@ -794,7 +806,7 @@ TLS Upgrade Watching file descriptors ^^^^^^^^^^^^^^^^^^^^^^^^^ -.. method:: loop.add_reader(fd, callback, \*args) +.. method:: loop.add_reader(fd, callback, *args) Start monitoring the *fd* file descriptor for read availability and invoke *callback* with the specified arguments once *fd* is available for @@ -804,7 +816,7 @@ Watching file descriptors Stop monitoring the *fd* file descriptor for read availability. -.. method:: loop.add_writer(fd, callback, \*args) +.. method:: loop.add_writer(fd, callback, *args) Start monitoring the *fd* file descriptor for write availability and invoke *callback* with the specified arguments once *fd* is available for @@ -918,7 +930,7 @@ convenient. :meth:`loop.create_server` and :func:`start_server`. .. coroutinemethod:: loop.sock_sendfile(sock, file, offset=0, count=None, \ - \*, fallback=True) + *, fallback=True) Send a file using high-performance :mod:`os.sendfile` if possible. Return the total number of bytes sent. @@ -952,7 +964,7 @@ convenient. DNS ^^^ -.. coroutinemethod:: loop.getaddrinfo(host, port, \*, family=0, \ +.. coroutinemethod:: loop.getaddrinfo(host, port, *, family=0, \ type=0, proto=0, flags=0) Asynchronous version of :meth:`socket.getaddrinfo`. @@ -1017,7 +1029,7 @@ Working with pipes Unix signals ^^^^^^^^^^^^ -.. method:: loop.add_signal_handler(signum, callback, \*args) +.. method:: loop.add_signal_handler(signum, callback, *args) Set *callback* as the handler for the *signum* signal. @@ -1052,7 +1064,7 @@ Unix signals Executing code in thread or process pools ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. awaitablemethod:: loop.run_in_executor(executor, func, \*args) +.. awaitablemethod:: loop.run_in_executor(executor, func, *args) Arrange for *func* to be called in the specified executor. @@ -1200,7 +1212,7 @@ Enabling debug mode .. versionchanged:: 3.7 - The new ``-X dev`` command line option can now also be used + The new :ref:`Python Development Mode ` can now also be used to enable the debug mode. .. seealso:: @@ -1222,9 +1234,9 @@ async/await code consider using the high-level subprocesses. See :ref:`Subprocess Support on Windows ` for details. -.. coroutinemethod:: loop.subprocess_exec(protocol_factory, \*args, \ +.. coroutinemethod:: loop.subprocess_exec(protocol_factory, *args, \ stdin=subprocess.PIPE, stdout=subprocess.PIPE, \ - stderr=subprocess.PIPE, \*\*kwargs) + stderr=subprocess.PIPE, **kwargs) Create a subprocess from one or more string arguments specified by *args*. @@ -1304,9 +1316,9 @@ async/await code consider using the high-level conforms to the :class:`asyncio.SubprocessTransport` base class and *protocol* is an object instantiated by the *protocol_factory*. -.. coroutinemethod:: loop.subprocess_shell(protocol_factory, cmd, \*, \ +.. coroutinemethod:: loop.subprocess_shell(protocol_factory, cmd, *, \ stdin=subprocess.PIPE, stdout=subprocess.PIPE, \ - stderr=subprocess.PIPE, \*\*kwargs) + stderr=subprocess.PIPE, **kwargs) Create a subprocess from *cmd*, which can be a :class:`str` or a :class:`bytes` string encoded to the diff --git a/Doc/library/asyncio-future.rst b/Doc/library/asyncio-future.rst index 832d58119b7b079d1e59dc4b39bae5b6a2126512..939d4c1a84523a057cc9e360c7782dda459dc761 100644 --- a/Doc/library/asyncio-future.rst +++ b/Doc/library/asyncio-future.rst @@ -31,7 +31,7 @@ Future Functions .. versionadded:: 3.5 -.. function:: ensure_future(obj, \*, loop=None) +.. function:: ensure_future(obj, *, loop=None) Return: @@ -58,7 +58,7 @@ Future Functions The function accepts any :term:`awaitable` object. -.. function:: wrap_future(future, \*, loop=None) +.. function:: wrap_future(future, *, loop=None) Wrap a :class:`concurrent.futures.Future` object in a :class:`asyncio.Future` object. @@ -67,7 +67,7 @@ Future Functions Future Object ============= -.. class:: Future(\*, loop=None) +.. class:: Future(*, loop=None) A Future represents an eventual result of an asynchronous operation. Not thread-safe. @@ -170,7 +170,7 @@ Future Object Returns the number of callbacks removed, which is typically 1, unless a callback was added more than once. - .. method:: cancel() + .. method:: cancel(msg=None) Cancel the Future and schedule callbacks. @@ -178,6 +178,9 @@ Future Object Otherwise, change the Future's state to *cancelled*, schedule the callbacks, and return ``True``. + .. versionchanged:: 3.9 + Added the ``msg`` parameter. + .. method:: exception() Return the exception that was set on this Future. @@ -255,3 +258,6 @@ the Future has a result:: - asyncio Future is not compatible with the :func:`concurrent.futures.wait` and :func:`concurrent.futures.as_completed` functions. + + - :meth:`asyncio.Future.cancel` accepts an optional ``msg`` argument, + but :func:`concurrent.futures.cancel` does not. diff --git a/Doc/library/asyncio-policy.rst b/Doc/library/asyncio-policy.rst index aa8f8f13eae02165d336ef0efa534f9005930137..ef6a0588506b52bcc81ecd97cbebc11772a027ac 100644 --- a/Doc/library/asyncio-policy.rst +++ b/Doc/library/asyncio-policy.rst @@ -159,7 +159,7 @@ implementation used by the asyncio event loop: .. class:: AbstractChildWatcher - .. method:: add_child_handler(pid, callback, \*args) + .. method:: add_child_handler(pid, callback, *args) Register a new child handler. @@ -209,7 +209,7 @@ implementation used by the asyncio event loop: It works reliably even when the asyncio event loop is run in a non-main OS thread. There is no noticeable overhead when handling a big number of children (*O(1)* each - time a child terminates), but stating a thread per process requires extra memory. + time a child terminates), but starting a thread per process requires extra memory. This watcher is used by default. @@ -219,7 +219,7 @@ implementation used by the asyncio event loop: This implementation registers a :py:data:`SIGCHLD` signal handler on instantiation. That can break third-party code that installs a custom handler for - `SIGCHLD`. signal). + :py:data:`SIGCHLD` signal. The watcher avoids disrupting other code spawning processes by polling every process explicitly on a :py:data:`SIGCHLD` signal. @@ -257,6 +257,18 @@ implementation used by the asyncio event loop: This solution requires a running event loop in the main thread to work, as :class:`SafeChildWatcher`. +.. class:: PidfdChildWatcher + + This implementation polls process file descriptors (pidfds) to await child + process termination. In some respects, :class:`PidfdChildWatcher` is a + "Goldilocks" child watcher implementation. It doesn't require signals or + threads, doesn't interfere with any processes launched outside the event + loop, and scales linearly with the number of subprocesses launched by the + event loop. The main disadvantage is that pidfds are specific to Linux, and + only work on recent (5.3+) kernels. + + .. versionadded:: 3.9 + Custom Policies =============== diff --git a/Doc/library/asyncio-protocol.rst b/Doc/library/asyncio-protocol.rst index 816ddcd03b008688667bd521d5d97521df1cd18e..9dbd3ab46a3f681bc31aadde0479495a0df1d811 100644 --- a/Doc/library/asyncio-protocol.rst +++ b/Doc/library/asyncio-protocol.rst @@ -588,9 +588,6 @@ Buffered Streaming Protocols ---------------------------- .. versionadded:: 3.7 - **Important:** this has been added to asyncio in Python 3.7 - *on a provisional basis*! This is as an experimental API that - might be changed or removed completely in Python 3.8. Buffered Protocols can be used with any event loop method that supports `Streaming Protocols`_. diff --git a/Doc/library/asyncio-stream.rst b/Doc/library/asyncio-stream.rst index b76ed379c7f4c88d5bbeefd10c1b28cb590689b9..714de8d41a3503cfde0c4131d9983c32932f7e5c 100644 --- a/Doc/library/asyncio-stream.rst +++ b/Doc/library/asyncio-stream.rst @@ -48,7 +48,7 @@ The following top-level asyncio functions can be used to create and work with streams: -.. coroutinefunction:: open_connection(host=None, port=None, \*, \ +.. coroutinefunction:: open_connection(host=None, port=None, *, \ loop=None, limit=None, ssl=None, family=0, \ proto=0, flags=0, sock=None, local_addr=None, \ server_hostname=None, ssl_handshake_timeout=None) @@ -74,7 +74,7 @@ and work with streams: The *ssl_handshake_timeout* parameter. .. coroutinefunction:: start_server(client_connected_cb, host=None, \ - port=None, \*, loop=None, limit=None, \ + port=None, *, loop=None, limit=None, \ family=socket.AF_UNSPEC, \ flags=socket.AI_PASSIVE, sock=None, \ backlog=100, ssl=None, reuse_address=None, \ @@ -109,7 +109,7 @@ and work with streams: .. rubric:: Unix Sockets -.. coroutinefunction:: open_unix_connection(path=None, \*, loop=None, \ +.. coroutinefunction:: open_unix_connection(path=None, *, loop=None, \ limit=None, ssl=None, sock=None, \ server_hostname=None, ssl_handshake_timeout=None) @@ -132,7 +132,7 @@ and work with streams: .. coroutinefunction:: start_unix_server(client_connected_cb, path=None, \ - \*, loop=None, limit=None, sock=None, \ + *, loop=None, limit=None, sock=None, \ backlog=100, ssl=None, ssl_handshake_timeout=None, \ start_serving=True) diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst index eb1312a949a10a784518d1fdb37a3149032ae71b..fb98552c86d4c131301d46b27f9b69f79a075dd1 100644 --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -61,9 +61,9 @@ See also the `Examples`_ subsection. Creating Subprocesses ===================== -.. coroutinefunction:: create_subprocess_exec(program, \*args, stdin=None, \ +.. coroutinefunction:: create_subprocess_exec(program, *args, stdin=None, \ stdout=None, stderr=None, loop=None, \ - limit=None, \*\*kwds) + limit=None, **kwds) Create a subprocess. @@ -82,7 +82,7 @@ Creating Subprocesses .. coroutinefunction:: create_subprocess_shell(cmd, stdin=None, \ stdout=None, stderr=None, loop=None, \ - limit=None, \*\*kwds) + limit=None, **kwds) Run the *cmd* shell command. @@ -110,10 +110,8 @@ Creating Subprocesses .. note:: - The default asyncio event loop implementation on **Windows** does not - support subprocesses. Subprocesses are available for Windows if a - :class:`ProactorEventLoop` is used. - See :ref:`Subprocess Support on Windows ` + Subprocesses are available for Windows if a :class:`ProactorEventLoop` is + used. See :ref:`Subprocess Support on Windows ` for details. .. seealso:: diff --git a/Doc/library/asyncio-sync.rst b/Doc/library/asyncio-sync.rst index f080b03bc7c51ccc72c6daa254e344a80e5076be..f62ce670fccbf9eb14ebe41f89f2f7bc60fab230 100644 --- a/Doc/library/asyncio-sync.rst +++ b/Doc/library/asyncio-sync.rst @@ -104,8 +104,8 @@ Event that some event has happened. An Event object manages an internal flag that can be set to *true* - with the :meth:`set` method and reset to *false* with the - :meth:`clear` method. The :meth:`wait` method blocks until the + with the :meth:`~Event.set` method and reset to *false* with the + :meth:`clear` method. The :meth:`~Event.wait` method blocks until the flag is set to *true*. The flag is set to *false* initially. @@ -142,7 +142,7 @@ Event Wait until the event is set. If the event is set, return ``True`` immediately. - Otherwise block until another task calls :meth:`set`. + Otherwise block until another task calls :meth:`~Event.set`. .. method:: set() @@ -155,8 +155,8 @@ Event Clear (unset) the event. - Tasks awaiting on :meth:`wait` will now block until the - :meth:`set` method is called again. + Tasks awaiting on :meth:`~Event.wait` will now block until the + :meth:`~Event.set` method is called again. .. method:: is_set() @@ -347,8 +347,8 @@ BoundedSemaphore --------- -.. deprecated:: 3.7 +.. versionchanged:: 3.9 Acquiring a lock using ``await lock`` or ``yield from lock`` and/or :keyword:`with` statement (``with await lock``, ``with (yield from - lock)``) is deprecated. Use ``async with lock`` instead. + lock)``) was removed. Use ``async with lock`` instead. diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index c96dde2dde9254f7b4db1ad2ee9790169d3d16e9..201678b0a3d57e9526572448d8e624aeee43b7b1 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -210,13 +210,13 @@ is :meth:`loop.run_in_executor`. Running an asyncio Program ========================== -.. function:: run(coro, \*, debug=False) +.. function:: run(coro, *, debug=False) Execute the :term:`coroutine` *coro* and return the result. This function runs the passed coroutine, taking care of - managing the asyncio event loop and *finalizing asynchronous - generators*. + managing the asyncio event loop, *finalizing asynchronous + generators*, and closing the threadpool. This function cannot be called when another asyncio event loop is running in the same thread. @@ -237,6 +237,8 @@ Running an asyncio Program .. versionadded:: 3.7 + .. versionchanged:: 3.9 + Updated to use :meth:`loop.shutdown_default_executor`. .. note:: The source code for ``asyncio.run()`` can be found in @@ -245,7 +247,7 @@ Running an asyncio Program Creating Tasks ============== -.. function:: create_task(coro, \*, name=None) +.. function:: create_task(coro, *, name=None) Wrap the *coro* :ref:`coroutine ` into a :class:`Task` and schedule its execution. Return the Task object. @@ -281,7 +283,7 @@ Creating Tasks Sleeping ======== -.. coroutinefunction:: sleep(delay, result=None, \*, loop=None) +.. coroutinefunction:: sleep(delay, result=None, *, loop=None) Block for *delay* seconds. @@ -317,7 +319,7 @@ Sleeping Running Tasks Concurrently ========================== -.. awaitablefunction:: gather(\*aws, loop=None, return_exceptions=False) +.. awaitablefunction:: gather(*aws, loop=None, return_exceptions=False) Run :ref:`awaitable objects ` in the *aws* sequence *concurrently*. @@ -401,7 +403,7 @@ Running Tasks Concurrently Shielding From Cancellation =========================== -.. awaitablefunction:: shield(aw, \*, loop=None) +.. awaitablefunction:: shield(aw, *, loop=None) Protect an :ref:`awaitable object ` from being :meth:`cancelled `. @@ -441,7 +443,7 @@ Shielding From Cancellation Timeouts ======== -.. coroutinefunction:: wait_for(aw, timeout, \*, loop=None) +.. coroutinefunction:: wait_for(aw, timeout, *, loop=None) Wait for the *aw* :ref:`awaitable ` to complete with a timeout. @@ -459,7 +461,8 @@ Timeouts wrap it in :func:`shield`. The function will wait until the future is actually cancelled, - so the total wait time may exceed the *timeout*. + so the total wait time may exceed the *timeout*. If an exception + happens during cancellation, it is propagated. If the wait is cancelled, the future *aw* is also cancelled. @@ -497,13 +500,15 @@ Timeouts Waiting Primitives ================== -.. coroutinefunction:: wait(aws, \*, loop=None, timeout=None,\ +.. coroutinefunction:: wait(aws, *, loop=None, timeout=None,\ return_when=ALL_COMPLETED) Run :ref:`awaitable objects ` in the *aws* - set concurrently and block until the condition specified + iterable concurrently and block until the condition specified by *return_when*. + The *aws* iterable must not be empty. + Returns two sets of Tasks/Futures: ``(done, pending)``. Usage:: @@ -579,18 +584,18 @@ Waiting Primitives if task in done: # Everything will work as expected now. - .. deprecated:: 3.8 + .. deprecated-removed:: 3.8 3.11 Passing coroutine objects to ``wait()`` directly is deprecated. -.. function:: as_completed(aws, \*, loop=None, timeout=None) +.. function:: as_completed(aws, *, loop=None, timeout=None) Run :ref:`awaitable objects ` in the *aws* - set concurrently. Return an iterator of coroutines. + iterable concurrently. Return an iterator of coroutines. Each coroutine returned can be awaited to get the earliest next - result from the set of the remaining awaitables. + result from the iterable of the remaining awaitables. Raises :exc:`asyncio.TimeoutError` if the timeout occurs before all Futures are done. @@ -605,6 +610,65 @@ Waiting Primitives # ... +Running in Threads +================== + +.. coroutinefunction:: to_thread(func, /, *args, **kwargs) + + Asynchronously run function *func* in a separate thread. + + Any \*args and \*\*kwargs supplied for this function are directly passed + to *func*. Also, the current :class:`contextvars.Context` is propagated, + allowing context variables from the event loop thread to be accessed in the + separate thread. + + Return a coroutine that can be awaited to get the eventual result of *func*. + + This coroutine function is primarily intended to be used for executing + IO-bound functions/methods that would otherwise block the event loop if + they were ran in the main thread. For example:: + + def blocking_io(): + print(f"start blocking_io at {time.strftime('%X')}") + # Note that time.sleep() can be replaced with any blocking + # IO-bound operation, such as file operations. + time.sleep(1) + print(f"blocking_io complete at {time.strftime('%X')}") + + async def main(): + print(f"started main at {time.strftime('%X')}") + + await asyncio.gather( + asyncio.to_thread(blocking_io), + asyncio.sleep(1)) + + print(f"finished main at {time.strftime('%X')}") + + + asyncio.run(main()) + + # Expected output: + # + # started main at 19:50:53 + # start blocking_io at 19:50:53 + # blocking_io complete at 19:50:54 + # finished main at 19:50:54 + + Directly calling `blocking_io()` in any coroutine would block the event loop + for its duration, resulting in an additional 1 second of run time. Instead, + by using `asyncio.to_thread()`, we can run it in a separate thread without + blocking the event loop. + + .. note:: + + Due to the :term:`GIL`, `asyncio.to_thread()` can typically only be used + to make IO-bound functions non-blocking. However, for extension modules + that release the GIL or alternative Python implementations that don't + have one, `asyncio.to_thread()` can also be used for CPU-bound functions. + + .. versionadded:: 3.9 + + Scheduling From Other Threads ============================= @@ -679,7 +743,7 @@ Introspection Task Object =========== -.. class:: Task(coro, \*, loop=None, name=None) +.. class:: Task(coro, *, loop=None, name=None) A :class:`Future-like ` object that runs a Python :ref:`coroutine `. Not thread-safe. @@ -727,7 +791,7 @@ Task Object .. deprecated-removed:: 3.8 3.10 The *loop* parameter. - .. method:: cancel() + .. method:: cancel(msg=None) Request the Task to be cancelled. @@ -742,6 +806,9 @@ Task Object suppressing cancellation completely is not common and is actively discouraged. + .. versionchanged:: 3.9 + Added the ``msg`` parameter. + .. _asyncio_example_task_cancel: The following example illustrates how coroutines can intercept @@ -842,7 +909,7 @@ Task Object See the documentation of :meth:`Future.remove_done_callback` for more details. - .. method:: get_stack(\*, limit=None) + .. method:: get_stack(*, limit=None) Return the list of stack frames for this Task. @@ -863,7 +930,7 @@ Task Object stack are returned, but the oldest frames of a traceback are returned. (This matches the behavior of the traceback module.) - .. method:: print_stack(\*, limit=None, file=None) + .. method:: print_stack(*, limit=None, file=None) Print the stack or traceback for this Task. @@ -903,31 +970,6 @@ Task Object .. versionadded:: 3.8 - .. classmethod:: all_tasks(loop=None) - - Return a set of all tasks for an event loop. - - By default all tasks for the current event loop are returned. - If *loop* is ``None``, the :func:`get_event_loop` function - is used to get the current loop. - - .. deprecated-removed:: 3.7 3.9 - - Do not call this as a task method. Use the :func:`asyncio.all_tasks` - function instead. - - .. classmethod:: current_task(loop=None) - - Return the currently running task or ``None``. - - If *loop* is ``None``, the :func:`get_event_loop` function - is used to get the current loop. - - .. deprecated-removed:: 3.7 3.9 - - Do not call this as a task method. Use the - :func:`asyncio.current_task` function instead. - .. _asyncio_generator_based_coro: diff --git a/Doc/library/audit_events.rst b/Doc/library/audit_events.rst index 3c68a1515b3effbc4b5efef985f4f1ab87ebc833..367d56e4e37359cd04ee9def5abfb983be568a0f 100644 --- a/Doc/library/audit_events.rst +++ b/Doc/library/audit_events.rst @@ -19,3 +19,29 @@ information on handling these events. specific documentation for actual events raised. .. audit-event-table:: + +The following events are raised internally and do not correspond to any +public API of CPython: + ++--------------------------+-------------------------------------------+ +| Audit event | Arguments | ++==========================+===========================================+ +| _winapi.CreateFile | ``file_name``, ``desired_access``, | +| | ``share_mode``, ``creation_disposition``, | +| | ``flags_and_attributes`` | ++--------------------------+-------------------------------------------+ +| _winapi.CreateJunction | ``src_path``, ``dst_path`` | ++--------------------------+-------------------------------------------+ +| _winapi.CreateNamedPipe | ``name``, ``open_mode``, ``pipe_mode`` | ++--------------------------+-------------------------------------------+ +| _winapi.CreatePipe | | ++--------------------------+-------------------------------------------+ +| _winapi.CreateProcess | ``application_name``, ``command_line``, | +| | ``current_directory`` | ++--------------------------+-------------------------------------------+ +| _winapi.OpenProcess | ``process_id``, ``desired_access`` | ++--------------------------+-------------------------------------------+ +| _winapi.TerminateProcess | ``handle``, ``exit_code`` | ++--------------------------+-------------------------------------------+ +| ctypes.PyObj_FromPtr | ``obj`` | ++--------------------------+-------------------------------------------+ diff --git a/Doc/library/base64.rst b/Doc/library/base64.rst index ad9f5f58bee2aac1f330f612519809b01dbb5a64..1ff22a00d6199de0b79e1d37fbea32d3bd6657e9 100644 --- a/Doc/library/base64.rst +++ b/Doc/library/base64.rst @@ -235,12 +235,6 @@ The legacy interface: .. versionadded:: 3.1 -.. function:: decodestring(s) - - Deprecated alias of :func:`decodebytes`. - - .. deprecated:: 3.1 - .. function:: encode(input, output) @@ -261,12 +255,6 @@ The legacy interface: .. versionadded:: 3.1 -.. function:: encodestring(s) - - Deprecated alias of :func:`encodebytes`. - - .. deprecated:: 3.1 - An example usage of the module: diff --git a/Doc/library/bdb.rst b/Doc/library/bdb.rst index 116ffcf88e3b69dee35d4e6ba77bc3dbf8fb16cd..7e4066cd436ad538136c0d2d4d644bdb3ec8437b 100644 --- a/Doc/library/bdb.rst +++ b/Doc/library/bdb.rst @@ -343,7 +343,7 @@ The :mod:`bdb` module also defines two classes: For backwards compatibility. Calls the :meth:`run` method. - .. method:: runcall(func, *args, **kwds) + .. method:: runcall(func, /, *args, **kwds) Debug a single function call, and return its result. diff --git a/Doc/library/binascii.rst b/Doc/library/binascii.rst index 98d8679fa3dcda3d359101f0a8edf59470522c89..2c0c1bce5d7f8f9a0f18f0be815a0c4c5605b6df 100644 --- a/Doc/library/binascii.rst +++ b/Doc/library/binascii.rst @@ -92,6 +92,8 @@ The :mod:`binascii` module defines the following functions: The string should contain a complete number of binary bytes, or (in case of the last portion of the binhex4 data) have the remaining bits zero. + .. deprecated:: 3.9 + .. function:: rledecode_hqx(data) @@ -104,11 +106,15 @@ The :mod:`binascii` module defines the following functions: .. versionchanged:: 3.2 Accept only bytestring or bytearray objects as input. + .. deprecated:: 3.9 + .. function:: rlecode_hqx(data) Perform binhex4 style RLE-compression on *data* and return the result. + .. deprecated:: 3.9 + .. function:: b2a_hqx(data) @@ -116,6 +122,8 @@ The :mod:`binascii` module defines the following functions: argument should already be RLE-coded, and have a length divisible by 3 (except possibly the last fragment). + .. deprecated:: 3.9 + .. function:: crc_hqx(data, value) diff --git a/Doc/library/binhex.rst b/Doc/library/binhex.rst index 2966e0dbfbcfe8750f537eee6ac3bfd0f4dd6919..7de6a663762f0c019422a67bc66a2b29f7ae891b 100644 --- a/Doc/library/binhex.rst +++ b/Doc/library/binhex.rst @@ -6,6 +6,8 @@ **Source code:** :source:`Lib/binhex.py` +.. deprecated:: 3.9 + -------------- This module encodes and decodes files in binhex4 format, a format allowing diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst index 277de601cb7b6ff65b5a15b7443a94dbd064bd94..637baf49da1fc0eaf0ec09163dc79f940a6c1360 100644 --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -31,7 +31,7 @@ All of the classes in this module may safely be accessed from multiple threads. (De)compression of files ------------------------ -.. function:: open(filename, mode='r', compresslevel=9, encoding=None, errors=None, newline=None) +.. function:: open(filename, mode='rb', compresslevel=9, encoding=None, errors=None, newline=None) Open a bzip2-compressed file in binary or text mode, returning a :term:`file object`. @@ -65,7 +65,7 @@ All of the classes in this module may safely be accessed from multiple threads. Accepts a :term:`path-like object`. -.. class:: BZ2File(filename, mode='r', buffering=None, compresslevel=9) +.. class:: BZ2File(filename, mode='r', *, compresslevel=9) Open a bzip2-compressed file in binary mode. @@ -81,8 +81,6 @@ All of the classes in this module may safely be accessed from multiple threads. If *filename* is a file object (rather than an actual file name), a mode of ``'w'`` does not truncate the file, and is instead equivalent to ``'a'``. - The *buffering* argument is ignored. Its use is deprecated since Python 3.0. - If *mode* is ``'w'`` or ``'a'``, *compresslevel* can be an integer between ``1`` and ``9`` specifying the level of compression: ``1`` produces the least compression, and ``9`` (default) produces the most compression. @@ -110,9 +108,6 @@ All of the classes in this module may safely be accessed from multiple threads. .. versionadded:: 3.3 - .. deprecated:: 3.0 - The keyword argument *buffering* was deprecated and is now ignored. - .. versionchanged:: 3.1 Support for the :keyword:`with` statement was added. @@ -138,6 +133,13 @@ All of the classes in this module may safely be accessed from multiple threads. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. + .. versionchanged:: 3.9 + The *buffering* parameter has been removed. It was ignored and deprecated + since Python 3.0. Pass an open file object to control how the file is + opened. + + The *compresslevel* parameter became keyword-only. + Incremental (de)compression --------------------------- @@ -264,7 +266,6 @@ Below are some examples of typical usage of the :mod:`bz2` module. Using :func:`compress` and :func:`decompress` to demonstrate round-trip compression: >>> import bz2 - >>> data = b"""\ ... Donec rhoncus quis sapien sit amet molestie. Fusce scelerisque vel augue ... nec ullamcorper. Nam rutrum pretium placerat. Aliquam vel tristique lorem, @@ -273,11 +274,9 @@ Using :func:`compress` and :func:`decompress` to demonstrate round-trip compress ... Aliquam pharetra lacus non risus vehicula rutrum. Maecenas aliquam leo ... felis. Pellentesque semper nunc sit amet nibh ullamcorper, ac elementum ... dolor luctus. Curabitur lacinia mi ornare consectetur vestibulum.""" - >>> c = bz2.compress(data) >>> len(data) / len(c) # Data compression ratio 1.513595166163142 - >>> d = bz2.decompress(c) >>> data == d # Check equality to original object after round-trip True @@ -285,7 +284,6 @@ Using :func:`compress` and :func:`decompress` to demonstrate round-trip compress Using :class:`BZ2Compressor` for incremental compression: >>> import bz2 - >>> def gen_data(chunks=10, chunksize=1000): ... """Yield incremental blocks of chunksize bytes.""" ... for _ in range(chunks): @@ -308,7 +306,6 @@ while ordered, repetitive data usually yields a high compression ratio. Writing and reading a bzip2-compressed file in binary mode: >>> import bz2 - >>> data = b"""\ ... Donec rhoncus quis sapien sit amet molestie. Fusce scelerisque vel augue ... nec ullamcorper. Nam rutrum pretium placerat. Aliquam vel tristique lorem, @@ -317,14 +314,11 @@ Writing and reading a bzip2-compressed file in binary mode: ... Aliquam pharetra lacus non risus vehicula rutrum. Maecenas aliquam leo ... felis. Pellentesque semper nunc sit amet nibh ullamcorper, ac elementum ... dolor luctus. Curabitur lacinia mi ornare consectetur vestibulum.""" - >>> with bz2.open("myfile.bz2", "wb") as f: ... # Write compressed data to file ... unused = f.write(data) - >>> with bz2.open("myfile.bz2", "rb") as f: ... # Decompress data from file ... content = f.read() - >>> content == data # Check equality to original object after round-trip True diff --git a/Doc/library/cgi.rst b/Doc/library/cgi.rst index 4048592e7361f705b2bcf93e8bafc1284eb5bd99..e60a3f13595cf00dcf09d3a01ab51ca06b1f1d98 100644 --- a/Doc/library/cgi.rst +++ b/Doc/library/cgi.rst @@ -277,14 +277,14 @@ These are useful if you want more control, or if you want to employ some of the algorithms implemented in this module in other circumstances. -.. function:: parse(fp=None, environ=os.environ, keep_blank_values=False, strict_parsing=False) +.. function:: parse(fp=None, environ=os.environ, keep_blank_values=False, strict_parsing=False, separator="&") Parse a query in the environment or from a file (the file defaults to - ``sys.stdin``). The *keep_blank_values* and *strict_parsing* parameters are + ``sys.stdin``). The *keep_blank_values*, *strict_parsing* and *separator* parameters are passed to :func:`urllib.parse.parse_qs` unchanged. -.. function:: parse_multipart(fp, pdict, encoding="utf-8", errors="replace") +.. function:: parse_multipart(fp, pdict, encoding="utf-8", errors="replace", separator="&") Parse input of type :mimetype:`multipart/form-data` (for file uploads). Arguments are *fp* for the input file, *pdict* for a dictionary containing @@ -303,6 +303,9 @@ algorithms implemented in this module in other circumstances. Added the *encoding* and *errors* parameters. For non-file fields, the value is now a list of strings, not bytes. + .. versionchanged:: 3.9.2 + Added the *separator* parameter. + .. function:: parse_header(string) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index 992672e806f336bb347c263c88f7d94c6089ad2f..6eb907afce3c6c30f05f2b7d7113d9b0e82df3cc 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -694,7 +694,7 @@ compatible with the Python codec registry. .. method:: reset() - Flushes and resets the codec buffers used for keeping state. + Resets the codec buffers used for keeping internal state. Calling this method should ensure that the data on the output is put into a clean state that allows appending of new fresh data without having to @@ -789,7 +789,7 @@ compatible with the Python codec registry. .. method:: reset() - Resets the codec buffers used for keeping state. + Resets the codec buffers used for keeping internal state. Note that no stream repositioning should take place. This method is primarily intended to be able to recover from decoding errors. @@ -1198,7 +1198,8 @@ particular, the following variants typically exist: +-----------------+--------------------------------+--------------------------------+ | mac_iceland | maciceland | Icelandic | +-----------------+--------------------------------+--------------------------------+ -| mac_latin2 | maclatin2, maccentraleurope | Central and Eastern Europe | +| mac_latin2 | maclatin2, maccentraleurope, | Central and Eastern Europe | +| | mac_centeuro | | +-----------------+--------------------------------+--------------------------------+ | mac_roman | macroman, macintosh | Western Europe | +-----------------+--------------------------------+--------------------------------+ diff --git a/Doc/library/collections.abc.rst b/Doc/library/collections.abc.rst index 2a3fb142f7297e56d4294987f9078764ea509894..2345e78a17e4f573c9409d95e13dc3aaeecc631a 100644 --- a/Doc/library/collections.abc.rst +++ b/Doc/library/collections.abc.rst @@ -98,12 +98,20 @@ ABC Inherits from Abstract Methods Mixin .. class:: Container - Hashable - Sized - Callable - ABCs for classes that provide respectively the methods :meth:`__contains__`, - :meth:`__hash__`, :meth:`__len__`, and :meth:`__call__`. + ABC for classes that provide the :meth:`__contains__` method. + +.. class:: Hashable + + ABC for classes that provide the :meth:`__hash__` method. + +.. class:: Sized + + ABC for classes that provide the :meth:`__len__` method. + +.. class:: Callable + + ABC for classes that provide the :meth:`__call__` method. .. class:: Iterable @@ -185,7 +193,7 @@ ABC Inherits from Abstract Methods Mixin expressions. Custom implementations must provide the :meth:`__await__` method. - :term:`Coroutine` objects and instances of the + :term:`Coroutine ` objects and instances of the :class:`~collections.abc.Coroutine` ABC are all instances of this ABC. .. note:: @@ -283,7 +291,7 @@ Notes on using :class:`Set` and :class:`MutableSet` as a mixin: :meth:`_from_iterable` which calls ``cls(iterable)`` to produce a new set. If the :class:`Set` mixin is being used in a class with a different constructor signature, you will need to override :meth:`_from_iterable` - with a classmethod that can construct new instances from + with a classmethod or regular method that can construct new instances from an iterable argument. (2) diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index d4297166597b643180b39757e2f1958fe501c4af..2ffdb49dbe6da80c7a06c3c0ed9e1051d537e718 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -116,6 +116,9 @@ The class can be used to simulate nested scopes and is useful in templating. >>> list(combined) ['music', 'art', 'opera'] + .. versionchanged:: 3.9 + Added support for ``|`` and ``|=`` operators, specified in :pep:`584`. + .. seealso:: * The `MultiContext class @@ -729,6 +732,10 @@ stack manipulations such as ``dup``, ``drop``, ``swap``, ``over``, ``pick``, initialized from the first argument to the constructor, if present, or to ``None``, if absent. + .. versionchanged:: 3.9 + Added merge (``|``) and update (``|=``) operators, specified in + :pep:`584`. + :class:`defaultdict` Examples ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -842,6 +849,9 @@ they add the ability to access fields by name instead of position index. Named tuple instances do not have per-instance dictionaries, so they are lightweight and require no more memory than regular tuples. + To support pickling, the named tuple class should be assigned to a variable + that matches *typename*. + .. versionchanged:: 3.1 Added support for *rename*. @@ -1119,6 +1129,10 @@ anywhere a regular dictionary is used. passed to the :class:`OrderedDict` constructor and its :meth:`update` method. +.. versionchanged:: 3.9 + Added merge (``|``) and update (``|=``) operators, specified in :pep:`584`. + + :class:`OrderedDict` Examples and Recipes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/Doc/library/colorsys.rst b/Doc/library/colorsys.rst index 1360c7cc9f1db46eda64511c42853dffba7dfee1..b672a05b39145d45ce0de160c4717aa2edfd37d8 100644 --- a/Doc/library/colorsys.rst +++ b/Doc/library/colorsys.rst @@ -21,7 +21,7 @@ spaces, the coordinates are all between 0 and 1. .. seealso:: More information about color spaces can be found at - http://poynton.ca/ColorFAQ.html and + https://poynton.ca/ColorFAQ.html and https://www.cambridgeincolour.com/tutorials/color-spaces.htm. The :mod:`colorsys` module defines the following functions: diff --git a/Doc/library/compileall.rst b/Doc/library/compileall.rst index 9ce5ca819c68a1cbb36fe01ac2532e0c7fda591b..5c6e68f93047537085ec0265fc5e0bd16c3c158d 100644 --- a/Doc/library/compileall.rst +++ b/Doc/library/compileall.rst @@ -52,6 +52,13 @@ compile Python sources. cases where the source file does not exist at the time the byte-code file is executed. +.. cmdoption:: -s strip_prefix +.. cmdoption:: -p prepend_prefix + + Remove (``-s``) or append (``-p``) the given prefix of paths + recorded in the ``.pyc`` files. + Cannot be combined with ``-d``. + .. cmdoption:: -x regex regex is used to search the full path to each file considered for @@ -96,6 +103,21 @@ compile Python sources. variable is not set, and ``checked-hash`` if the ``SOURCE_DATE_EPOCH`` environment variable is set. +.. cmdoption:: -o level + + Compile with the given optimization level. May be used multiple times + to compile for multiple levels at a time (for example, + ``compileall -o 1 -o 2``). + +.. cmdoption:: -e dir + + Ignore symlinks pointing outside the given directory. + +.. cmdoption:: --hardlink-dupes + + If two ``.pyc`` files with different optimization level have + the same content, use hard links to consolidate duplicate files. + .. versionchanged:: 3.2 Added the ``-i``, ``-b`` and ``-h`` options. @@ -107,6 +129,12 @@ compile Python sources. .. versionchanged:: 3.7 Added the ``--invalidation-mode`` option. +.. versionchanged:: 3.9 + Added the ``-s``, ``-p``, ``-e`` and ``--hardlink-dupes`` options. + Raised the default recursion limit from 10 to + :py:func:`sys.getrecursionlimit()`. + Added the possibility to specify the ``-o`` option multiple times. + There is no command-line option to control the optimization level used by the :func:`compile` function, because the Python interpreter itself already @@ -120,14 +148,14 @@ runtime. Public functions ---------------- -.. function:: compile_dir(dir, maxlevels=10, ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1, workers=1, invalidation_mode=None) +.. function:: compile_dir(dir, maxlevels=sys.getrecursionlimit(), ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1, workers=1, invalidation_mode=None, *, stripdir=None, prependdir=None, limit_sl_dest=None, hardlink_dupes=False) Recursively descend the directory tree named by *dir*, compiling all :file:`.py` files along the way. Return a true value if all the files compiled successfully, and a false value otherwise. The *maxlevels* parameter is used to limit the depth of the recursion; it - defaults to ``10``. + defaults to ``sys.getrecursionlimit()``. If *ddir* is given, it is prepended to the path to each file being compiled for use in compilation time tracebacks, and is also compiled in to the @@ -153,7 +181,8 @@ Public functions coexist. *optimize* specifies the optimization level for the compiler. It is passed to - the built-in :func:`compile` function. + the built-in :func:`compile` function. Accepts also a sequence of optimization + levels which lead to multiple compilations of one :file:`.py` file in one call. The argument *workers* specifies how many workers are used to compile files in parallel. The default is to not use multiple workers. @@ -166,6 +195,13 @@ Public functions :class:`py_compile.PycInvalidationMode` enum and controls how the generated pycs are invalidated at runtime. + The *stripdir*, *prependdir* and *limit_sl_dest* arguments correspond to + the ``-s``, ``-p`` and ``-e`` options described above. + They may be specified as ``str``, ``bytes`` or :py:class:`os.PathLike`. + + If *hardlink_dupes* is true and two ``.pyc`` files with different optimization + level have the same content, use hard links to consolidate duplicate files. + .. versionchanged:: 3.2 Added the *legacy* and *optimize* parameter. @@ -191,7 +227,11 @@ Public functions .. versionchanged:: 3.8 Setting *workers* to 0 now chooses the optimal number of cores. -.. function:: compile_file(fullname, ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1, invalidation_mode=None) + .. versionchanged:: 3.9 + Added *stripdir*, *prependdir*, *limit_sl_dest* and *hardlink_dupes* arguments. + Default value of *maxlevels* was changed from ``10`` to ``sys.getrecursionlimit()`` + +.. function:: compile_file(fullname, ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1, invalidation_mode=None, *, stripdir=None, prependdir=None, limit_sl_dest=None, hardlink_dupes=False) Compile the file with path *fullname*. Return a true value if the file compiled successfully, and a false value otherwise. @@ -217,12 +257,20 @@ Public functions coexist. *optimize* specifies the optimization level for the compiler. It is passed to - the built-in :func:`compile` function. + the built-in :func:`compile` function. Accepts also a sequence of optimization + levels which lead to multiple compilations of one :file:`.py` file in one call. *invalidation_mode* should be a member of the :class:`py_compile.PycInvalidationMode` enum and controls how the generated pycs are invalidated at runtime. + The *stripdir*, *prependdir* and *limit_sl_dest* arguments correspond to + the ``-s``, ``-p`` and ``-e`` options described above. + They may be specified as ``str``, ``bytes`` or :py:class:`os.PathLike`. + + If *hardlink_dupes* is true and two ``.pyc`` files with different optimization + level have the same content, use hard links to consolidate duplicate files. + .. versionadded:: 3.2 .. versionchanged:: 3.5 @@ -238,6 +286,9 @@ Public functions .. versionchanged:: 3.7.2 The *invalidation_mode* parameter's default value is updated to None. + .. versionchanged:: 3.9 + Added *stripdir*, *prependdir*, *limit_sl_dest* and *hardlink_dupes* arguments. + .. function:: compile_path(skip_curdir=True, maxlevels=0, force=False, quiet=0, legacy=False, optimize=-1, invalidation_mode=None) Byte-compile all the :file:`.py` files found along ``sys.path``. Return a diff --git a/Doc/library/concurrency.rst b/Doc/library/concurrency.rst index 39cd9ff4826597be78b85aea7a665c27ccb1c472..b150990b83b75b4b20ee1882d0244f5678dbc203 100644 --- a/Doc/library/concurrency.rst +++ b/Doc/library/concurrency.rst @@ -28,5 +28,3 @@ The following are support modules for some of the above services: .. toctree:: _thread.rst - _dummy_thread.rst - dummy_threading.rst diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index 41d47c7ef1530bea4b3cf75b7149f738e686afa1..d57f8ce23d12c49c43e27881cd635228d5a3be0f 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -28,7 +28,7 @@ Executor Objects An abstract class that provides methods to execute calls asynchronously. It should not be used directly, but through its concrete subclasses. - .. method:: submit(fn, *args, **kwargs) + .. method:: submit(fn, /, *args, **kwargs) Schedules the callable, *fn*, to be executed as ``fn(*args **kwargs)`` and returns a :class:`Future` object representing the execution of the @@ -67,7 +67,7 @@ Executor Objects .. versionchanged:: 3.5 Added the *chunksize* argument. - .. method:: shutdown(wait=True) + .. method:: shutdown(wait=True, *, cancel_futures=False) Signal the executor that it should free any resources that it is using when the currently pending futures are done executing. Calls to @@ -82,6 +82,15 @@ Executor Objects value of *wait*, the entire Python program will not exit until all pending futures are done executing. + If *cancel_futures* is ``True``, this method will cancel all pending + futures that the executor has not started running. Any futures that + are completed or running won't be cancelled, regardless of the value + of *cancel_futures*. + + If both *cancel_futures* and *wait* are ``True``, all futures that the + executor has started running will be completed prior to this method + returning. The remaining futures are cancelled. + You can avoid having to call this method explicitly if you use the :keyword:`with` statement, which will shutdown the :class:`Executor` (waiting as if :meth:`Executor.shutdown` were called with *wait* set to @@ -94,6 +103,9 @@ Executor Objects e.submit(shutil.copy, 'src3.txt', 'dest3.txt') e.submit(shutil.copy, 'src4.txt', 'dest4.txt') + .. versionchanged:: 3.9 + Added *cancel_futures*. + ThreadPoolExecutor ------------------ @@ -209,7 +221,8 @@ ProcessPoolExecutor The :class:`ProcessPoolExecutor` class is an :class:`Executor` subclass that uses a pool of processes to execute calls asynchronously. :class:`ProcessPoolExecutor` uses the :mod:`multiprocessing` module, which -allows it to side-step the :term:`Global Interpreter Lock` but also means that +allows it to side-step the :term:`Global Interpreter Lock +` but also means that only picklable objects can be executed and returned. The ``__main__`` module must be importable by worker subprocesses. This means @@ -223,9 +236,9 @@ to a :class:`ProcessPoolExecutor` will result in deadlock. An :class:`Executor` subclass that executes calls asynchronously using a pool of at most *max_workers* processes. If *max_workers* is ``None`` or not given, it will default to the number of processors on the machine. - If *max_workers* is lower or equal to ``0``, then a :exc:`ValueError` + If *max_workers* is less than or equal to ``0``, then a :exc:`ValueError` will be raised. - On Windows, *max_workers* must be equal or lower than ``61``. If it is not + On Windows, *max_workers* must be less than or equal to ``61``. If it is not then :exc:`ValueError` will be raised. If *max_workers* is ``None``, then the default chosen will be at most ``61``, even if more processors are available. @@ -237,7 +250,7 @@ to a :class:`ProcessPoolExecutor` will result in deadlock. each worker process; *initargs* is a tuple of arguments passed to the initializer. Should *initializer* raise an exception, all currently pending jobs will raise a :exc:`~concurrent.futures.process.BrokenProcessPool`, - as well any attempt to submit more jobs to the pool. + as well as any attempt to submit more jobs to the pool. .. versionchanged:: 3.3 When one of the worker processes terminates abruptly, a diff --git a/Doc/library/configparser.rst b/Doc/library/configparser.rst index 739477f55fddda8f3bd27ac49760552d3b13f7ea..2e22a549ee2813d676b086286959447512fbf525 100644 --- a/Doc/library/configparser.rst +++ b/Doc/library/configparser.rst @@ -674,97 +674,98 @@ be overridden by subclasses or by attribute assignment. .. attribute:: ConfigParser.BOOLEAN_STATES - By default when using :meth:`~ConfigParser.getboolean`, config parsers - consider the following values ``True``: ``'1'``, ``'yes'``, ``'true'``, - ``'on'`` and the following values ``False``: ``'0'``, ``'no'``, ``'false'``, - ``'off'``. You can override this by specifying a custom dictionary of strings - and their Boolean outcomes. For example: - - .. doctest:: - - >>> custom = configparser.ConfigParser() - >>> custom['section1'] = {'funky': 'nope'} - >>> custom['section1'].getboolean('funky') - Traceback (most recent call last): - ... - ValueError: Not a boolean: nope - >>> custom.BOOLEAN_STATES = {'sure': True, 'nope': False} - >>> custom['section1'].getboolean('funky') - False - - Other typical Boolean pairs include ``accept``/``reject`` or - ``enabled``/``disabled``. + By default when using :meth:`~ConfigParser.getboolean`, config parsers + consider the following values ``True``: ``'1'``, ``'yes'``, ``'true'``, + ``'on'`` and the following values ``False``: ``'0'``, ``'no'``, ``'false'``, + ``'off'``. You can override this by specifying a custom dictionary of strings + and their Boolean outcomes. For example: + + .. doctest:: + + >>> custom = configparser.ConfigParser() + >>> custom['section1'] = {'funky': 'nope'} + >>> custom['section1'].getboolean('funky') + Traceback (most recent call last): + ... + ValueError: Not a boolean: nope + >>> custom.BOOLEAN_STATES = {'sure': True, 'nope': False} + >>> custom['section1'].getboolean('funky') + False + + Other typical Boolean pairs include ``accept``/``reject`` or + ``enabled``/``disabled``. .. method:: ConfigParser.optionxform(option) + :noindex: - This method transforms option names on every read, get, or set - operation. The default converts the name to lowercase. This also - means that when a configuration file gets written, all keys will be - lowercase. Override this method if that's unsuitable. - For example: + This method transforms option names on every read, get, or set + operation. The default converts the name to lowercase. This also + means that when a configuration file gets written, all keys will be + lowercase. Override this method if that's unsuitable. + For example: - .. doctest:: + .. doctest:: + + >>> config = """ + ... [Section1] + ... Key = Value + ... + ... [Section2] + ... AnotherKey = Value + ... """ + >>> typical = configparser.ConfigParser() + >>> typical.read_string(config) + >>> list(typical['Section1'].keys()) + ['key'] + >>> list(typical['Section2'].keys()) + ['anotherkey'] + >>> custom = configparser.RawConfigParser() + >>> custom.optionxform = lambda option: option + >>> custom.read_string(config) + >>> list(custom['Section1'].keys()) + ['Key'] + >>> list(custom['Section2'].keys()) + ['AnotherKey'] - >>> config = """ - ... [Section1] - ... Key = Value - ... - ... [Section2] - ... AnotherKey = Value - ... """ - >>> typical = configparser.ConfigParser() - >>> typical.read_string(config) - >>> list(typical['Section1'].keys()) - ['key'] - >>> list(typical['Section2'].keys()) - ['anotherkey'] - >>> custom = configparser.RawConfigParser() - >>> custom.optionxform = lambda option: option - >>> custom.read_string(config) - >>> list(custom['Section1'].keys()) - ['Key'] - >>> list(custom['Section2'].keys()) - ['AnotherKey'] - - .. note:: - The optionxform function transforms option names to a canonical form. - This should be an idempotent function: if the name is already in - canonical form, it should be returned unchanged. + .. note:: + The optionxform function transforms option names to a canonical form. + This should be an idempotent function: if the name is already in + canonical form, it should be returned unchanged. .. attribute:: ConfigParser.SECTCRE - A compiled regular expression used to parse section headers. The default - matches ``[section]`` to the name ``"section"``. Whitespace is considered - part of the section name, thus ``[ larch ]`` will be read as a section of - name ``" larch "``. Override this attribute if that's unsuitable. For - example: + A compiled regular expression used to parse section headers. The default + matches ``[section]`` to the name ``"section"``. Whitespace is considered + part of the section name, thus ``[ larch ]`` will be read as a section of + name ``" larch "``. Override this attribute if that's unsuitable. For + example: + + .. doctest:: + + >>> import re + >>> config = """ + ... [Section 1] + ... option = value + ... + ... [ Section 2 ] + ... another = val + ... """ + >>> typical = configparser.ConfigParser() + >>> typical.read_string(config) + >>> typical.sections() + ['Section 1', ' Section 2 '] + >>> custom = configparser.ConfigParser() + >>> custom.SECTCRE = re.compile(r"\[ *(?P
[^]]+?) *\]") + >>> custom.read_string(config) + >>> custom.sections() + ['Section 1', 'Section 2'] - .. doctest:: + .. note:: - >>> import re - >>> config = """ - ... [Section 1] - ... option = value - ... - ... [ Section 2 ] - ... another = val - ... """ - >>> typical = configparser.ConfigParser() - >>> typical.read_string(config) - >>> typical.sections() - ['Section 1', ' Section 2 '] - >>> custom = configparser.ConfigParser() - >>> custom.SECTCRE = re.compile(r"\[ *(?P
[^]]+?) *\]") - >>> custom.read_string(config) - >>> custom.sections() - ['Section 1', 'Section 2'] - - .. note:: - - While ConfigParser objects also use an ``OPTCRE`` attribute for recognizing - option lines, it's not recommended to override it because that would - interfere with constructor options *allow_no_value* and *delimiters*. + While ConfigParser objects also use an ``OPTCRE`` attribute for recognizing + option lines, it's not recommended to override it because that would + interfere with constructor options *allow_no_value* and *delimiters*. Legacy API Examples diff --git a/Doc/library/constants.rst b/Doc/library/constants.rst index 501715980f95728310a3bb21cca2d4b1e983612e..f17e1a37875168fa9b4833cf52c5d49038b9e760 100644 --- a/Doc/library/constants.rst +++ b/Doc/library/constants.rst @@ -31,7 +31,7 @@ A small number of constants live in the built-in namespace. They are: etc.) to indicate that the operation is not implemented with respect to the other type; may be returned by the in-place binary special methods (e.g. :meth:`__imul__`, :meth:`__iand__`, etc.) for the same purpose. - Its truth value is true. + It should not be evaluated in a boolean context. .. note:: @@ -50,6 +50,11 @@ A small number of constants live in the built-in namespace. They are: even though they have similar names and purposes. See :exc:`NotImplementedError` for details on when to use it. + .. versionchanged:: 3.9 + Evaluating ``NotImplemented`` in a boolean context is deprecated. While + it currently evaluates as true, it will emit a :exc:`DeprecationWarning`. + It will raise a :exc:`TypeError` in a future version of Python. + .. index:: single: ...; ellipsis literal .. data:: Ellipsis diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst index 73b24e5f251a94a386b9ef493f3ba168dee22cfc..0aa4ad76523480b5076ddbd386709b231d3b9024 100644 --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -416,7 +416,7 @@ Functions and classes provided: The passed in object is returned from the function, allowing this method to be used as a function decorator. - .. method:: callback(callback, *args, **kwds) + .. method:: callback(callback, /, *args, **kwds) Accepts an arbitrary callback function and arguments and adds it to the callback stack. @@ -473,7 +473,7 @@ Functions and classes provided: Similar to :meth:`push` but expects either an asynchronous context manager or a coroutine function. - .. method:: push_async_callback(callback, *args, **kwds) + .. method:: push_async_callback(callback, /, *args, **kwds) Similar to :meth:`callback` but expects a coroutine function. diff --git a/Doc/library/contextvars.rst b/Doc/library/contextvars.rst index 8805661c456edb611c877ee1823cf8a1feb47f7c..14ac47f4c9eb164050749ff5b7431b720c11145d 100644 --- a/Doc/library/contextvars.rst +++ b/Doc/library/contextvars.rst @@ -26,7 +26,7 @@ See also :pep:`567` for additional details. Context Variables ----------------- -.. class:: ContextVar(name, [\*, default]) +.. class:: ContextVar(name, [*, default]) This class is used to declare a new Context Variable, e.g.:: @@ -146,7 +146,7 @@ Manual Context Management Context implements the :class:`collections.abc.Mapping` interface. - .. method:: run(callable, \*args, \*\*kwargs) + .. method:: run(callable, *args, **kwargs) Execute ``callable(*args, **kwargs)`` code in the context object the *run* method is called on. Return the result of the execution diff --git a/Doc/library/copyreg.rst b/Doc/library/copyreg.rst index 40fca56d8029e9a9f45b6a36c730bc9a2c5e264f..439202100959516f1e492f82292a1b288776bf93 100644 --- a/Doc/library/copyreg.rst +++ b/Doc/library/copyreg.rst @@ -49,7 +49,7 @@ The example below would like to show how to register a pickle function and how it will be used: >>> import copyreg, copy, pickle - >>> class C(object): + >>> class C: ... def __init__(self, a): ... self.a = a ... diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 2d6c6d0a1c3c574c2648a2eb76631f633af2e7e7..7313148721dac60cc49cc70218f13e80871b9367 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1326,6 +1326,21 @@ way is to instantiate one of the following classes: libraries use the standard C calling convention, and are assumed to return :c:type:`int`. + On Windows creating a :class:`CDLL` instance may fail even if the DLL name + exists. When a dependent DLL of the loaded DLL is not found, a + :exc:`OSError` error is raised with the message *"[WinError 126] The + specified module could not be found".* This error message does not contain + the name of the missing DLL because the Windows API does not return this + information making this error hard to diagnose. To resolve this error and + determine which DLL is not found, you need to find the list of dependent + DLLs and determine which one is not found using Windows debugging and + tracing tools. + +.. seealso:: + + `Microsoft DUMPBIN tool `_ + -- A tool to find DLL dependents. + .. class:: OleDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=0) @@ -1618,7 +1633,7 @@ They are instances of a private class: ``ctypes.seh_exception`` with argument ``code`` will be raised, allowing an audit hook to replace the exception with its own. -.. audit-event:: ctypes.call_function func_pointer,arguments ctype-foreign-functions +.. audit-event:: ctypes.call_function func_pointer,arguments foreign-functions Some ways to invoke foreign function calls may raise an auditing event ``ctypes.call_function`` with arguments ``function pointer`` and ``arguments``. @@ -2493,7 +2508,7 @@ other data types containing pointer type fields. Arrays and pointers ^^^^^^^^^^^^^^^^^^^ -.. class:: Array(\*args) +.. class:: Array(*args) Abstract base class for arrays. @@ -2545,4 +2560,3 @@ Arrays and pointers Returns the object to which to pointer points. Assigning to this attribute changes the pointer to point to the assigned object. - diff --git a/Doc/library/curses.rst b/Doc/library/curses.rst index cbd68834b6cbee3d6b1832c34b395d3800ccbd80..c72840a07c192ef3949f4f86d0145f209916a012 100644 --- a/Doc/library/curses.rst +++ b/Doc/library/curses.rst @@ -112,14 +112,15 @@ The module :mod:`curses` defines the following functions: .. function:: color_content(color_number) Return the intensity of the red, green, and blue (RGB) components in the color - *color_number*, which must be between ``0`` and :const:`COLORS`. Return a 3-tuple, + *color_number*, which must be between ``0`` and ``COLORS - 1``. Return a 3-tuple, containing the R,G,B values for the given color, which will be between ``0`` (no component) and ``1000`` (maximum amount of component). -.. function:: color_pair(color_number) +.. function:: color_pair(pair_number) - Return the attribute value for displaying text in the specified color. This + Return the attribute value for displaying text in the specified color pair. + Only the first 256 color pairs are supported. This attribute value can be combined with :const:`A_STANDOUT`, :const:`A_REVERSE`, and the other :const:`A_\*` attributes. :func:`pair_number` is the counterpart to this function. @@ -214,7 +215,7 @@ The module :mod:`curses` defines the following functions: .. function:: getmouse() After :meth:`~window.getch` returns :const:`KEY_MOUSE` to signal a mouse event, this - method should be call to retrieve the queued mouse event, represented as a + method should be called to retrieve the queued mouse event, represented as a 5-tuple ``(id, x, y, z, bstate)``. *id* is an ID value used to distinguish multiple devices, and *x*, *y*, *z* are the event's coordinates. (*z* is currently unused.) *bstate* is an integer value whose bits will be set to @@ -278,7 +279,7 @@ The module :mod:`curses` defines the following functions: Change the definition of a color, taking the number of the color to be changed followed by three RGB values (for the amounts of red, green, and blue components). The value of *color_number* must be between ``0`` and - :const:`COLORS`. Each of *r*, *g*, *b*, must be a value between ``0`` and + `COLORS - 1`. Each of *r*, *g*, *b*, must be a value between ``0`` and ``1000``. When :func:`init_color` is used, all occurrences of that color on the screen immediately change to the new definition. This function is a no-op on most terminals; it is active only if :func:`can_change_color` returns ``True``. @@ -291,7 +292,8 @@ The module :mod:`curses` defines the following functions: color number. The value of *pair_number* must be between ``1`` and ``COLOR_PAIRS - 1`` (the ``0`` color pair is wired to white on black and cannot be changed). The value of *fg* and *bg* arguments must be between ``0`` and - :const:`COLORS`. If the color-pair was previously initialized, the screen is + ``COLORS - 1``, or, after calling :func:`use_default_colors`, ``-1``. + If the color-pair was previously initialized, the screen is refreshed and all occurrences of that color-pair are changed to the new definition. @@ -441,7 +443,7 @@ The module :mod:`curses` defines the following functions: .. function:: pair_content(pair_number) Return a tuple ``(fg, bg)`` containing the colors for the requested color pair. - The value of *pair_number* must be between ``1`` and ``COLOR_PAIRS - 1``. + The value of *pair_number* must be between ``0`` and ``COLOR_PAIRS - 1``. .. function:: pair_number(attr) @@ -511,6 +513,32 @@ The module :mod:`curses` defines the following functions: Save the current state of the terminal modes in a buffer, usable by :func:`resetty`. +.. function:: get_escdelay() + + Retrieves the value set by :func:`set_escdelay`. + + .. versionadded:: 3.9 + +.. function:: set_escdelay(ms) + + Sets the number of milliseconds to wait after reading an escape character, + to distinguish between an individual escape character entered on the + keyboard from escape sequences sent by cursor and function keys. + + .. versionadded:: 3.9 + +.. function:: get_tabsize() + + Retrieves the value set by :func:`set_tabsize`. + + .. versionadded:: 3.9 + +.. function:: set_tabsize(size) + + Sets the number of columns used by the curses library when converting a tab + character to spaces as it adds the tab to a window. + + .. versionadded:: 3.9 .. function:: setsyx(y, x) @@ -656,7 +684,7 @@ The module :mod:`curses` defines the following functions: foreground color on the default background. -.. function:: wrapper(func, ...) +.. function:: wrapper(func, /, *args, **kwargs) Initialize curses and call another callable object, *func*, which should be the rest of your curses-using application. If the application raises an exception, @@ -682,7 +710,7 @@ the following methods and attributes: window.addch(y, x, ch[, attr]) Paint character *ch* at ``(y, x)`` with attributes *attr*, overwriting any - character previously painter at that location. By default, the character + character previously painted at that location. By default, the character position and attributes are the current settings for the window object. .. note:: diff --git a/Doc/library/dataclasses.rst b/Doc/library/dataclasses.rst index a7fbaaa106707cad39b2ccac2dde93044a2ccdb3..e706f7fcc566d8959d1e7a553113dab3c46f1067 100644 --- a/Doc/library/dataclasses.rst +++ b/Doc/library/dataclasses.rst @@ -188,7 +188,7 @@ Module-level decorators, classes, and functions @dataclass class C: - mylist: List[int] = field(default_factory=list) + mylist: list[int] = field(default_factory=list) c = C() c.mylist += [1, 2, 3] @@ -301,7 +301,7 @@ Module-level decorators, classes, and functions @dataclass class C: - mylist: List[Point] + mylist: list[Point] p = Point(10, 20) assert asdict(p) == {'x': 10, 'y': 20} @@ -359,7 +359,7 @@ Module-level decorators, classes, and functions def add_one(self): return self.x + 1 -.. function:: replace(instance, **changes) +.. function:: replace(instance, /, **changes) Creates a new object of the same type of ``instance``, replacing fields with values from ``changes``. If ``instance`` is not a Data diff --git a/Doc/library/datatypes.rst b/Doc/library/datatypes.rst index 94010c0e391b0b0ed67c746e242f5c32e5622994..ff51b2779e5fa336ffb5810a4537c2383594796f 100644 --- a/Doc/library/datatypes.rst +++ b/Doc/library/datatypes.rst @@ -20,6 +20,7 @@ The following modules are documented in this chapter: .. toctree:: datetime.rst + zoneinfo.rst calendar.rst collections.rst collections.abc.rst @@ -32,3 +33,4 @@ The following modules are documented in this chapter: pprint.rst reprlib.rst enum.rst + graphlib.rst diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index b733c4406af71245fd05e8ef9b3e69c31909f702..dae0dd7aa55898d84c9a43f18f69411bba719948 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -671,7 +671,8 @@ Instance methods: .. method:: date.isocalendar() - Return a 3-tuple, (ISO year, ISO week number, ISO weekday). + Return a :term:`named tuple` object with three components: ``year``, + ``week`` and ``weekday``. The ISO calendar is a widely used variant of the Gregorian calendar. [#]_ @@ -683,11 +684,14 @@ Instance methods: For example, 2004 begins on a Thursday, so the first week of ISO year 2004 begins on Monday, 29 Dec 2003 and ends on Sunday, 4 Jan 2004:: - >>> from datetime import date - >>> date(2003, 12, 29).isocalendar() - (2004, 1, 1) - >>> date(2004, 1, 4).isocalendar() - (2004, 1, 7) + >>> from datetime import date + >>> date(2003, 12, 29).isocalendar() + datetime.IsoCalendarDate(year=2004, week=1, weekday=1) + >>> date(2004, 1, 4).isocalendar() + datetime.IsoCalendarDate(year=2004, week=1, weekday=7) + + .. versionchanged:: 3.9 + Result changed from a tuple to a :term:`named tuple`. .. method:: date.isoformat() @@ -1215,7 +1219,7 @@ Instance methods: .. method:: datetime.replace(year=self.year, month=self.month, day=self.day, \ hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, \ - tzinfo=self.tzinfo, * fold=0) + tzinfo=self.tzinfo, *, fold=0) Return a datetime with the same attributes, except for those attributes given new values by whichever keyword arguments are specified. Note that @@ -1398,8 +1402,8 @@ Instance methods: .. method:: datetime.isocalendar() - Return a 3-tuple, (ISO year, ISO week number, ISO weekday). The same as - ``self.date().isocalendar()``. + Return a :term:`named tuple` with three components: ``year``, ``week`` + and ``weekday``. The same as ``self.date().isocalendar()``. .. method:: datetime.isoformat(sep='T', timespec='auto') @@ -1779,7 +1783,7 @@ Other constructor: Instance methods: .. method:: time.replace(hour=self.hour, minute=self.minute, second=self.second, \ - microsecond=self.microsecond, tzinfo=self.tzinfo, * fold=0) + microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0) Return a :class:`.time` with the same value, except for those attributes given new values by whichever keyword arguments are specified. Note that @@ -2361,7 +2365,7 @@ requires, and these work on all platforms with a standard C implementation. | | string if the object is | +063415, | | | | naive). | -030712.345216 | | +-----------+--------------------------------+------------------------+-------+ -| ``%Z`` | Time zone name (empty string | (empty), UTC, EST, CST | | +| ``%Z`` | Time zone name (empty string | (empty), UTC, GMT | \(6) | | | if the object is naive). | | | +-----------+--------------------------------+------------------------+-------+ | ``%j`` | Day of the year as a | 001, 002, ..., 366 | \(9) | @@ -2532,9 +2536,18 @@ Notes: In addition, providing ``'Z'`` is identical to ``'+00:00'``. ``%Z`` - If :meth:`tzname` returns ``None``, ``%Z`` is replaced by an empty - string. Otherwise ``%Z`` is replaced by the returned value, which must - be a string. + In :meth:`strftime`, ``%Z`` is replaced by an empty string if + :meth:`tzname` returns ``None``; otherwise ``%Z`` is replaced by the + returned value, which must be a string. + + :meth:`strptime` only accepts certain values for ``%Z``: + + 1. any value in ``time.tzname`` for your machine's locale + 2. the hard-coded values ``UTC`` and ``GMT`` + + So someone living in Japan may have ``JST``, ``UTC``, and ``GMT`` as + valid values, but probably not ``EST``. It will raise ``ValueError`` for + invalid values. .. versionchanged:: 3.2 When the ``%z`` directive is provided to the :meth:`strptime` method, an diff --git a/Doc/library/decimal.rst b/Doc/library/decimal.rst index 38173f18ca66020a1ee5e7a12cb2e2a3ac2bb645..e194649e30d85c0095f7fc5f434574dab6d817eb 100644 --- a/Doc/library/decimal.rst +++ b/Doc/library/decimal.rst @@ -1488,7 +1488,7 @@ are also included in the pure Python version for compatibility. the C version uses a thread-local rather than a coroutine-local context and the value is ``False``. This is slightly faster in some nested context scenarios. -.. versionadded:: 3.9 backported to 3.7 and 3.8 +.. versionadded:: 3.9 backported to 3.7 and 3.8. Rounding modes @@ -2133,17 +2133,66 @@ Q. Is the CPython implementation fast for large numbers? A. Yes. In the CPython and PyPy3 implementations, the C/CFFI versions of the decimal module integrate the high speed `libmpdec `_ library for -arbitrary precision correctly-rounded decimal floating point arithmetic. +arbitrary precision correctly-rounded decimal floating point arithmetic [#]_. ``libmpdec`` uses `Karatsuba multiplication `_ for medium-sized numbers and the `Number Theoretic Transform `_ -for very large numbers. However, to realize this performance gain, the -context needs to be set for unrounded calculations. +for very large numbers. - >>> c = getcontext() - >>> c.prec = MAX_PREC - >>> c.Emax = MAX_EMAX - >>> c.Emin = MIN_EMIN +The context must be adapted for exact arbitrary precision arithmetic. :attr:`Emin` +and :attr:`Emax` should always be set to the maximum values, :attr:`clamp` +should always be 0 (the default). Setting :attr:`prec` requires some care. -.. versionadded:: 3.3 \ No newline at end of file +The easiest approach for trying out bignum arithmetic is to use the maximum +value for :attr:`prec` as well [#]_:: + + >>> setcontext(Context(prec=MAX_PREC, Emax=MAX_EMAX, Emin=MIN_EMIN)) + >>> x = Decimal(2) ** 256 + >>> x / 128 + Decimal('904625697166532776746648320380374280103671755200316906558262375061821325312') + + +For inexact results, :attr:`MAX_PREC` is far too large on 64-bit platforms and +the available memory will be insufficient:: + + >>> Decimal(1) / 3 + Traceback (most recent call last): + File "", line 1, in + MemoryError + +On systems with overallocation (e.g. Linux), a more sophisticated approach is to +adjust :attr:`prec` to the amount of available RAM. Suppose that you have 8GB of +RAM and expect 10 simultaneous operands using a maximum of 500MB each:: + + >>> import sys + >>> + >>> # Maximum number of digits for a single operand using 500MB in 8-byte words + >>> # with 19 digits per word (4-byte and 9 digits for the 32-bit build): + >>> maxdigits = 19 * ((500 * 1024**2) // 8) + >>> + >>> # Check that this works: + >>> c = Context(prec=maxdigits, Emax=MAX_EMAX, Emin=MIN_EMIN) + >>> c.traps[Inexact] = True + >>> setcontext(c) + >>> + >>> # Fill the available precision with nines: + >>> x = Decimal(0).logical_invert() * 9 + >>> sys.getsizeof(x) + 524288112 + >>> x + 2 + Traceback (most recent call last): + File "", line 1, in + decimal.Inexact: [] + +In general (and especially on systems without overallocation), it is recommended +to estimate even tighter bounds and set the :attr:`Inexact` trap if all calculations +are expected to be exact. + + +.. [#] + .. versionadded:: 3.3 + +.. [#] + .. versionchanged:: 3.9 + This approach now works for all exact results except for non-integer powers. diff --git a/Doc/library/development.rst b/Doc/library/development.rst index ab34e1f7ce5f64e767ae75cefe13ce7ed28ffb55..9edce758688e2d7f4deca24bb2b67a71c0e9527d 100644 --- a/Doc/library/development.rst +++ b/Doc/library/development.rst @@ -18,12 +18,10 @@ The list of modules described in this chapter is: typing.rst pydoc.rst + devmode.rst doctest.rst unittest.rst unittest.mock.rst unittest.mock-examples.rst 2to3.rst test.rst - -See also the Python development mode: the :option:`-X` ``dev`` option and -:envvar:`PYTHONDEVMODE` environment variable. diff --git a/Doc/library/devmode.rst b/Doc/library/devmode.rst new file mode 100644 index 0000000000000000000000000000000000000000..d5a40cdeeac5efb4e02056178ae434f4649d7304 --- /dev/null +++ b/Doc/library/devmode.rst @@ -0,0 +1,214 @@ +.. _devmode: + +Python Development Mode +======================= + +.. versionadded:: 3.7 + +The Python Development Mode introduces additional runtime checks that are too +expensive to be enabled by default. It should not be more verbose than the +default if the code is correct; new warnings are only emitted when an issue is +detected. + +It can be enabled using the :option:`-X dev <-X>` command line option or by +setting the :envvar:`PYTHONDEVMODE` environment variable to ``1``. + +Effects of the Python Development Mode +====================================== + +Enabling the Python Development Mode is similar to the following command, but +with additional effects described below:: + + PYTHONMALLOC=debug PYTHONASYNCIODEBUG=1 python3 -W default -X faulthandler + +Effects of the Python Development Mode: + +* Add ``default`` :ref:`warning filter `. The + following warnings are shown: + + * :exc:`DeprecationWarning` + * :exc:`ImportWarning` + * :exc:`PendingDeprecationWarning` + * :exc:`ResourceWarning` + + Normally, the above warnings are filtered by the default :ref:`warning + filters `. + + It behaves as if the :option:`-W default <-W>` command line option is used. + + Use the :option:`-W error <-W>` command line option or set the + :envvar:`PYTHONWARNINGS` environment variable to ``error`` to treat warnings + as errors. + +* Install debug hooks on memory allocators to check for: + + * Buffer underflow + * Buffer overflow + * Memory allocator API violation + * Unsafe usage of the GIL + + See the :c:func:`PyMem_SetupDebugHooks` C function. + + It behaves as if the :envvar:`PYTHONMALLOC` environment variable is set to + ``debug``. + + To enable the Python Development Mode without installing debug hooks on + memory allocators, set the :envvar:`PYTHONMALLOC` environment variable to + ``default``. + +* Call :func:`faulthandler.enable` at Python startup to install handlers for + the :const:`SIGSEGV`, :const:`SIGFPE`, :const:`SIGABRT`, :const:`SIGBUS` and + :const:`SIGILL` signals to dump the Python traceback on a crash. + + It behaves as if the :option:`-X faulthandler <-X>` command line option is + used or if the :envvar:`PYTHONFAULTHANDLER` environment variable is set to + ``1``. + +* Enable :ref:`asyncio debug mode `. For example, + :mod:`asyncio` checks for coroutines that were not awaited and logs them. + + It behaves as if the :envvar:`PYTHONASYNCIODEBUG` environment variable is set + to ``1``. + +* Check the *encoding* and *errors* arguments for string encoding and decoding + operations. Examples: :func:`open`, :meth:`str.encode` and + :meth:`bytes.decode`. + + By default, for best performance, the *errors* argument is only checked at + the first encoding/decoding error and the *encoding* argument is sometimes + ignored for empty strings. + +* The :class:`io.IOBase` destructor logs ``close()`` exceptions. +* Set the :attr:`~sys.flags.dev_mode` attribute of :attr:`sys.flags` to + ``True``. + +The Python Development Mode does not enable the :mod:`tracemalloc` module by +default, because the overhead cost (to performance and memory) would be too +large. Enabling the :mod:`tracemalloc` module provides additional information +on the origin of some errors. For example, :exc:`ResourceWarning` logs the +traceback where the resource was allocated, and a buffer overflow error logs +the traceback where the memory block was allocated. + +The Python Development Mode does not prevent the :option:`-O` command line +option from removing :keyword:`assert` statements nor from setting +:const:`__debug__` to ``False``. + +.. versionchanged:: 3.8 + The :class:`io.IOBase` destructor now logs ``close()`` exceptions. + +.. versionchanged:: 3.9 + The *encoding* and *errors* arguments are now checked for string encoding + and decoding operations. + + +ResourceWarning Example +======================= + +Example of a script counting the number of lines of the text file specified in +the command line:: + + import sys + + def main(): + fp = open(sys.argv[1]) + nlines = len(fp.readlines()) + print(nlines) + # The file is closed implicitly + + if __name__ == "__main__": + main() + +The script does not close the file explicitly. By default, Python does not emit +any warning. Example using README.txt, which has 269 lines: + +.. code-block:: shell-session + + $ python3 script.py README.txt + 269 + +Enabling the Python Development Mode displays a :exc:`ResourceWarning` warning: + +.. code-block:: shell-session + + $ python3 -X dev script.py README.txt + 269 + script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'> + main() + ResourceWarning: Enable tracemalloc to get the object allocation traceback + +In addition, enabling :mod:`tracemalloc` shows the line where the file was +opened: + +.. code-block:: shell-session + + $ python3 -X dev -X tracemalloc=5 script.py README.rst + 269 + script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'> + main() + Object allocated at (most recent call last): + File "script.py", lineno 10 + main() + File "script.py", lineno 4 + fp = open(sys.argv[1]) + +The fix is to close explicitly the file. Example using a context manager:: + + def main(): + # Close the file explicitly when exiting the with block + with open(sys.argv[1]) as fp: + nlines = len(fp.readlines()) + print(nlines) + +Not closing a resource explicitly can leave a resource open for way longer than +expected; it can cause severe issues upon exiting Python. It is bad in +CPython, but it is even worse in PyPy. Closing resources explicitly makes an +application more deterministic and more reliable. + + +Bad file descriptor error example +================================= + +Script displaying the first line of itself:: + + import os + + def main(): + fp = open(__file__) + firstline = fp.readline() + print(firstline.rstrip()) + os.close(fp.fileno()) + # The file is closed implicitly + + main() + +By default, Python does not emit any warning: + +.. code-block:: shell-session + + $ python3 script.py + import os + +The Python Development Mode shows a :exc:`ResourceWarning` and logs a "Bad file +descriptor" error when finalizing the file object: + +.. code-block:: shell-session + + $ python3 script.py + import os + script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'> + main() + ResourceWarning: Enable tracemalloc to get the object allocation traceback + Exception ignored in: <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'> + Traceback (most recent call last): + File "script.py", line 10, in + main() + OSError: [Errno 9] Bad file descriptor + +``os.close(fp.fileno())`` closes the file descriptor. When the file object +finalizer tries to close the file descriptor again, it fails with the ``Bad +file descriptor`` error. A file descriptor must be closed only once. In the +worst case scenario, closing it twice can lead to a crash (see :issue:`18748` +for an example). + +The fix is to remove the ``os.close(fp.fileno())`` line, or open the file with +``closefd=False``. diff --git a/Doc/library/dialog.rst b/Doc/library/dialog.rst new file mode 100644 index 0000000000000000000000000000000000000000..53f98c1018988f8394526658bbd8c1e0813ddf70 --- /dev/null +++ b/Doc/library/dialog.rst @@ -0,0 +1,230 @@ +Tkinter Dialogs +=============== + +:mod:`tkinter.simpledialog` --- Standard Tkinter input dialogs +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. module:: tkinter.simpledialog + :platform: Tk + :synopsis: Simple dialog windows + +**Source code:** :source:`Lib/tkinter/simpledialog.py` + +-------------- + +The :mod:`tkinter.simpledialog` module contains convenience classes and +functions for creating simple modal dialogs to get a value from the user. + + +.. function:: askfloat(title, prompt, **kw) + askinteger(title, prompt, **kw) + askstring(title, prompt, **kw) + + The above three functions provide dialogs that prompt the user to enter a value + of the desired type. + +.. class:: Dialog(parent, title=None) + + The base class for custom dialogs. + + .. method:: body(master) + + Override to construct the dialog's interface and return the widget that + should have initial focus. + + .. method:: buttonbox() + + Default behaviour adds OK and Cancel buttons. Override for custom button + layouts. + + + +:mod:`tkinter.filedialog` --- File selection dialogs +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. module:: tkinter.filedialog + :platform: Tk + :synopsis: Dialog classes for file selection + +**Source code:** :source:`Lib/tkinter/filedialog.py` + +-------------- + +The :mod:`tkinter.filedialog` module provides classes and factory functions for +creating file/directory selection windows. + +Native Load/Save Dialogs +------------------------ + +The following classes and functions provide file dialog windows that combine a +native look-and-feel with configuration options to customize behaviour. +The following keyword arguments are applicable to the classes and functions +listed below: + + | *parent* - the window to place the dialog on top of + + | *title* - the title of the window + + | *initialdir* - the directory that the dialog starts in + + | *initialfile* - the file selected upon opening of the dialog + + | *filetypes* - a sequence of (label, pattern) tuples, '*' wildcard is allowed + + | *defaultextension* - default extension to append to file (save dialogs) + + | *multiple* - when true, selection of multiple items is allowed + + +**Static factory functions** + +The below functions when called create a modal, native look-and-feel dialog, +wait for the user's selection, then return the selected value(s) or ``None`` to the +caller. + +.. function:: askopenfile(mode="r", **options) + askopenfiles(mode="r", **options) + + The above two functions create an :class:`Open` dialog and return the opened + file object(s) in read-only mode. + +.. function:: asksaveasfile(mode="w", **options) + + Create a :class:`SaveAs` dialog and return a file object opened in write-only mode. + +.. function:: askopenfilename(**options) + askopenfilenames(**options) + + The above two functions create an :class:`Open` dialog and return the + selected filename(s) that correspond to existing file(s). + +.. function:: asksaveasfilename(**options) + + Create a :class:`SaveAs` dialog and return the selected filename. + +.. function:: askdirectory(**options) + + | Prompt user to select a directory. + | Additional keyword option: + | *mustexist* - determines if selection must be an existing directory. + +.. class:: Open(master=None, **options) + SaveAs(master=None, **options) + + The above two classes provide native dialog windows for saving and loading + files. + +**Convenience classes** + +The below classes are used for creating file/directory windows from scratch. +These do not emulate the native look-and-feel of the platform. + +.. class:: Directory(master=None, **options) + + Create a dialog prompting the user to select a directory. + +.. note:: The *FileDialog* class should be subclassed for custom event + handling and behaviour. + +.. class:: FileDialog(master, title=None) + + Create a basic file selection dialog. + + .. method:: cancel_command(event=None) + + Trigger the termination of the dialog window. + + .. method:: dirs_double_event(event) + + Event handler for double-click event on directory. + + .. method:: dirs_select_event(event) + + Event handler for click event on directory. + + .. method:: files_double_event(event) + + Event handler for double-click event on file. + + .. method:: files_select_event(event) + + Event handler for single-click event on file. + + .. method:: filter_command(event=None) + + Filter the files by directory. + + .. method:: get_filter() + + Retrieve the file filter currently in use. + + .. method:: get_selection() + + Retrieve the currently selected item. + + .. method:: go(dir_or_file=os.curdir, pattern="*", default="", key=None) + + Render dialog and start event loop. + + .. method:: ok_event(event) + + Exit dialog returning current selection. + + .. method:: quit(how=None) + + Exit dialog returning filename, if any. + + .. method:: set_filter(dir, pat) + + Set the file filter. + + .. method:: set_selection(file) + + Update the current file selection to *file*. + + +.. class:: LoadFileDialog(master, title=None) + + A subclass of FileDialog that creates a dialog window for selecting an + existing file. + + .. method:: ok_command() + + Test that a file is provided and that the selection indicates an + already existing file. + +.. class:: SaveFileDialog(master, title=None) + + A subclass of FileDialog that creates a dialog window for selecting a + destination file. + + .. method:: ok_command() + + Test whether or not the selection points to a valid file that is not a + directory. Confirmation is required if an already existing file is + selected. + +:mod:`tkinter.commondialog` --- Dialog window templates +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. module:: tkinter.commondialog + :platform: Tk + :synopsis: Tkinter base class for dialogs + +**Source code:** :source:`Lib/tkinter/commondialog.py` + +-------------- + +The :mod:`tkinter.commondialog` module provides the :class:`Dialog` class that +is the base class for dialogs defined in other supporting modules. + +.. class:: Dialog(master=None, **options) + + .. method:: show(color=None, **options) + + Render the Dialog window. + + +.. seealso:: + + Modules :mod:`tkinter.messagebox`, :ref:`tut-files` diff --git a/Doc/library/difflib.rst b/Doc/library/difflib.rst index ada311bc3a205b950cf4d26f450a7729e1beefde..aa08988c8b36f71e574a4909dff4a7c74190e29f 100644 --- a/Doc/library/difflib.rst +++ b/Doc/library/difflib.rst @@ -18,12 +18,13 @@ -------------- This module provides classes and functions for comparing sequences. It -can be used for example, for comparing files, and can produce difference -information in various formats, including HTML and context and unified +can be used for example, for comparing files, and can produce information +about file differences in various formats, including HTML and context and unified diffs. For comparing directories and files, see also, the :mod:`filecmp` module. .. class:: SequenceMatcher + :noindex: This is a flexible class for comparing pairs of sequences of any type, so long as the sequence elements are :term:`hashable`. The basic algorithm predates, and is a @@ -421,7 +422,7 @@ The :class:`SequenceMatcher` class has this constructor: is not changed. - .. method:: find_longest_match(alo, ahi, blo, bhi) + .. method:: find_longest_match(alo=0, ahi=None, blo=0, bhi=None) Find longest matching block in ``a[alo:ahi]`` and ``b[blo:bhi]``. @@ -458,6 +459,9 @@ The :class:`SequenceMatcher` class has this constructor: This method returns a :term:`named tuple` ``Match(a, b, size)``. + .. versionchanged:: 3.9 + Added default arguments. + .. method:: get_matching_blocks() @@ -648,6 +652,7 @@ The :class:`Differ` class has this constructor: .. class:: Differ(linejunk=None, charjunk=None) + :noindex: Optional keyword parameters *linejunk* and *charjunk* are for filter functions (or ``None``): diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 5b34e68cb027c00e3ee40d90bbeeddb943fb8cd8..c1e72d1d1633b514ee706587b8a58bb523213a2e 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -640,7 +640,7 @@ the original TOS1. .. opcode:: LIST_APPEND (i) - Calls ``list.append(TOS[-i], TOS)``. Used to implement list comprehensions. + Calls ``list.append(TOS1[-i], TOS)``. Used to implement list comprehensions. .. opcode:: MAP_ADD (i) @@ -706,50 +706,29 @@ iterations of the loop. popped values are used to restore the exception state. -.. opcode:: POP_FINALLY (preserve_tos) +.. opcode:: RERAISE - Cleans up the value stack and the block stack. If *preserve_tos* is not - ``0`` TOS first is popped from the stack and pushed on the stack after - performing other stack operations: + Re-raises the exception currently on top of the stack. - * If TOS is ``NULL`` or an integer (pushed by :opcode:`BEGIN_FINALLY` - or :opcode:`CALL_FINALLY`) it is popped from the stack. - * If TOS is an exception type (pushed when an exception has been raised) - 6 values are popped from the stack, the last three popped values are - used to restore the exception state. An exception handler block is - removed from the block stack. + .. versionadded:: 3.9 - It is similar to :opcode:`END_FINALLY`, but doesn't change the bytecode - counter nor raise an exception. Used for implementing :keyword:`break`, - :keyword:`continue` and :keyword:`return` in the :keyword:`finally` block. - .. versionadded:: 3.8 - - -.. opcode:: BEGIN_FINALLY +.. opcode:: WITH_EXCEPT_START - Pushes ``NULL`` onto the stack for using it in :opcode:`END_FINALLY`, - :opcode:`POP_FINALLY`, :opcode:`WITH_CLEANUP_START` and - :opcode:`WITH_CLEANUP_FINISH`. Starts the :keyword:`finally` block. + Calls the function in position 7 on the stack with the top three + items on the stack as arguments. + Used to implement the call ``context_manager.__exit__(*exc_info())`` when an exception + has occurred in a :keyword:`with` statement. - .. versionadded:: 3.8 + .. versionadded:: 3.9 -.. opcode:: END_FINALLY +.. opcode:: LOAD_ASSERTION_ERROR - Terminates a :keyword:`finally` clause. The interpreter recalls whether the - exception has to be re-raised or execution has to be continued depending on - the value of TOS. + Pushes :exc:`AssertionError` onto the stack. Used by the :keyword:`assert` + statement. - * If TOS is ``NULL`` (pushed by :opcode:`BEGIN_FINALLY`) continue from - the next instruction. TOS is popped. - * If TOS is an integer (pushed by :opcode:`CALL_FINALLY`), sets the - bytecode counter to TOS. TOS is popped. - * If TOS is an exception type (pushed when an exception has been raised) - 6 values are popped from the stack, the first three popped values are - used to re-raise the exception and the last three popped values are used - to restore the exception state. An exception handler block is removed - from the block stack. + .. versionadded:: 3.9 .. opcode:: LOAD_BUILD_CLASS @@ -772,35 +751,6 @@ iterations of the loop. .. versionadded:: 3.2 -.. opcode:: WITH_CLEANUP_START - - Starts cleaning up the stack when a :keyword:`with` statement block exits. - - At the top of the stack are either ``NULL`` (pushed by - :opcode:`BEGIN_FINALLY`) or 6 values pushed if an exception has been - raised in the with block. Below is the context manager's - :meth:`~object.__exit__` or :meth:`~object.__aexit__` bound method. - - If TOS is ``NULL``, calls ``SECOND(None, None, None)``, - removes the function from the stack, leaving TOS, and pushes ``None`` - to the stack. Otherwise calls ``SEVENTH(TOP, SECOND, THIRD)``, - shifts the bottom 3 values of the stack down, replaces the empty spot - with ``NULL`` and pushes TOS. Finally pushes the result of the call. - - -.. opcode:: WITH_CLEANUP_FINISH - - Finishes cleaning up the stack when a :keyword:`with` statement block exits. - - TOS is result of ``__exit__()`` or ``__aexit__()`` function call pushed - by :opcode:`WITH_CLEANUP_START`. SECOND is ``None`` or an exception type - (pushed when an exception has been raised). - - Pops two values from the stack. If SECOND is not None and TOS is true - unwinds the EXCEPT_HANDLER block which was created when the exception - was caught and pushes ``NULL`` to the stack. - - All of the following opcodes use their arguments. .. opcode:: STORE_NAME (namei) @@ -909,61 +859,39 @@ All of the following opcodes use their arguments. .. versionadded:: 3.6 -.. opcode:: BUILD_TUPLE_UNPACK (count) - - Pops *count* iterables from the stack, joins them in a single tuple, - and pushes the result. Implements iterable unpacking in tuple - displays ``(*x, *y, *z)``. - - .. versionadded:: 3.5 +.. opcode:: LIST_TO_TUPLE + Pops a list from the stack and pushes a tuple containing the same values. -.. opcode:: BUILD_TUPLE_UNPACK_WITH_CALL (count) + .. versionadded:: 3.9 - This is similar to :opcode:`BUILD_TUPLE_UNPACK`, - but is used for ``f(*x, *y, *z)`` call syntax. The stack item at position - ``count + 1`` should be the corresponding callable ``f``. - .. versionadded:: 3.6 +.. opcode:: LIST_EXTEND (i) + Calls ``list.extend(TOS1[-i], TOS)``. Used to build lists. -.. opcode:: BUILD_LIST_UNPACK (count) + .. versionadded:: 3.9 - This is similar to :opcode:`BUILD_TUPLE_UNPACK`, but pushes a list - instead of tuple. Implements iterable unpacking in list - displays ``[*x, *y, *z]``. - .. versionadded:: 3.5 +.. opcode:: SET_UPDATE (i) + Calls ``set.update(TOS1[-i], TOS)``. Used to build sets. -.. opcode:: BUILD_SET_UNPACK (count) + .. versionadded:: 3.9 - This is similar to :opcode:`BUILD_TUPLE_UNPACK`, but pushes a set - instead of tuple. Implements iterable unpacking in set - displays ``{*x, *y, *z}``. - .. versionadded:: 3.5 +.. opcode:: DICT_UPDATE (i) + Calls ``dict.update(TOS1[-i], TOS)``. Used to build dicts. -.. opcode:: BUILD_MAP_UNPACK (count) + .. versionadded:: 3.9 - Pops *count* mappings from the stack, merges them into a single dictionary, - and pushes the result. Implements dictionary unpacking in dictionary - displays ``{**x, **y, **z}``. - .. versionadded:: 3.5 +.. opcode:: DICT_MERGE + Like :opcode:`DICT_UPDATE` but raises an exception for duplicate keys. -.. opcode:: BUILD_MAP_UNPACK_WITH_CALL (count) - - This is similar to :opcode:`BUILD_MAP_UNPACK`, - but is used for ``f(**x, **y, **z)`` call syntax. The stack item at - position ``count + 2`` should be the corresponding callable ``f``. - - .. versionadded:: 3.5 - .. versionchanged:: 3.6 - The position of the callable is determined by adding 2 to the opcode - argument instead of encoding it in the second byte of the argument. + .. versionadded:: 3.9 .. opcode:: LOAD_ATTR (namei) @@ -977,6 +905,20 @@ All of the following opcodes use their arguments. ``cmp_op[opname]``. +.. opcode:: IS_OP (invert) + + Performs ``is`` comparison, or ``is not`` if ``invert`` is 1. + + .. versionadded:: 3.9 + + +.. opcode:: CONTAINS_OP (invert) + + Performs ``in`` comparison, or ``not in`` if ``invert`` is 1. + + .. versionadded:: 3.9 + + .. opcode:: IMPORT_NAME (namei) Imports the module ``co_names[namei]``. TOS and TOS1 are popped and provide @@ -1011,6 +953,13 @@ All of the following opcodes use their arguments. .. versionadded:: 3.1 +.. opcode:: JUMP_IF_NOT_EXC_MATCH (target) + + Tests whether the second value on the stack is an exception matching TOS, + and jumps if it is not. Pops two values from the stack. + + .. versionadded:: 3.9 + .. opcode:: JUMP_IF_TRUE_OR_POP (target) @@ -1037,7 +986,7 @@ All of the following opcodes use their arguments. TOS is an :term:`iterator`. Call its :meth:`~iterator.__next__` method. If this yields a new value, push it on the stack (leaving the iterator below - it). If the iterator indicates it is exhausted TOS is popped, and the byte + it). If the iterator indicates it is exhausted, TOS is popped, and the byte code counter is incremented by *delta*. @@ -1052,15 +1001,6 @@ All of the following opcodes use their arguments. stack. *delta* points to the finally block or the first except block. -.. opcode:: CALL_FINALLY (delta) - - Pushes the address of the next instruction onto the stack and increments - bytecode counter by *delta*. Used for calling the finally block as a - "subroutine". - - .. versionadded:: 3.8 - - .. opcode:: LOAD_FAST (var_num) Pushes a reference to the local ``co_varnames[var_num]`` onto the stack. @@ -1142,8 +1082,10 @@ All of the following opcodes use their arguments. Calls a callable object with positional (if any) and keyword arguments. *argc* indicates the total number of positional and keyword arguments. - The top element on the stack contains a tuple of keyword argument names. - Below that are keyword arguments in the order corresponding to the tuple. + The top element on the stack contains a tuple with the names of the + keyword arguments, which must be strings. + Below that are the values for the keyword arguments, + in the order corresponding to the tuple. Below that are positional arguments, with the right-most parameter on top. Below the arguments is a callable object to call. ``CALL_FUNCTION_KW`` pops all arguments and the callable object off the stack, @@ -1160,10 +1102,6 @@ All of the following opcodes use their arguments. Calls a callable object with variable set of positional and keyword arguments. If the lowest bit of *flags* is set, the top of the stack contains a mapping object containing additional keyword arguments. - Below that is an iterable object containing positional arguments and - a callable object to call. :opcode:`BUILD_MAP_UNPACK_WITH_CALL` and - :opcode:`BUILD_TUPLE_UNPACK_WITH_CALL` can be used for merging multiple - mapping objects and iterables containing arguments. Before the callable is called, the mapping object and iterable object are each "unpacked" and their contents passed in as keyword and positional arguments respectively. diff --git a/Doc/library/dummy_threading.rst b/Doc/library/dummy_threading.rst deleted file mode 100644 index dfc3289abb15c1550dc4e36bd9b7032873a01145..0000000000000000000000000000000000000000 --- a/Doc/library/dummy_threading.rst +++ /dev/null @@ -1,20 +0,0 @@ -:mod:`dummy_threading` --- Drop-in replacement for the :mod:`threading` module -============================================================================== - -.. module:: dummy_threading - :synopsis: Drop-in replacement for the threading module. - -**Source code:** :source:`Lib/dummy_threading.py` - -.. deprecated:: 3.7 - Python now always has threading enabled. Please use :mod:`threading` instead. - --------------- - -This module provides a duplicate interface to the :mod:`threading` module. -It was meant to be imported when the :mod:`_thread` module was not provided -on a platform. - -Be careful to not use this module where deadlock might occur from a thread being -created that blocks waiting for another thread to be created. This often occurs -with blocking I/O. diff --git a/Doc/library/email.contentmanager.rst b/Doc/library/email.contentmanager.rst index e09c7c0e402bbcbebc8c9c941ca889c8ca43416b..918fc55677e72390833e06c7b8c515305a9455c4 100644 --- a/Doc/library/email.contentmanager.rst +++ b/Doc/library/email.contentmanager.rst @@ -116,7 +116,7 @@ Currently the email package provides only one concrete content manager, decoding the payload to unicode. The default error handler is ``replace``. - .. method:: set_content(msg, <'str'>, subtype="plain", charset='utf-8' \ + .. method:: set_content(msg, <'str'>, subtype="plain", charset='utf-8', \ cte=None, \ disposition=None, filename=None, cid=None, \ params=None, headers=None) diff --git a/Doc/library/email.encoders.rst b/Doc/library/email.encoders.rst index e4752a5edf841f09b6c3c67f0b23f8f6a7c529d4..5d68b104f3a45c60660e78f467caf5103de08ef0 100644 --- a/Doc/library/email.encoders.rst +++ b/Doc/library/email.encoders.rst @@ -15,7 +15,7 @@ the :meth:`~email.message.EmailMessage.set_content` method. This module is deprecated in Python 3. The functions provided here should not be called explicitly since the :class:`~email.mime.text.MIMEText` class sets the content type and CTE header using the *_subtype* and *_charset* -values passed during the instaniation of that class. +values passed during the instantiation of that class. The remaining text in this section is the original documentation of the module. diff --git a/Doc/library/email.headerregistry.rst b/Doc/library/email.headerregistry.rst index 9376da2b8d39ce78eec59ba70005457b85c65f6d..3e1d97a03264b2df2032a33afb8607af3fb081b4 100644 --- a/Doc/library/email.headerregistry.rst +++ b/Doc/library/email.headerregistry.rst @@ -289,7 +289,7 @@ variant, :attr:`~.BaseHeader.max_count` is set to 1. A :class:`ParameterizedMIMEHeader` class that handles the :mailheader:`Content-Disposition` header. - .. attribute:: content-disposition + .. attribute:: content_disposition ``inline`` and ``attachment`` are the only valid values in common use. diff --git a/Doc/library/email.policy.rst b/Doc/library/email.policy.rst index 8e7076259810f55bb75727fb67f0cb0e1447cb3c..bf53b9520fc723e0fb4e9570e0934398f537c764 100644 --- a/Doc/library/email.policy.rst +++ b/Doc/library/email.policy.rst @@ -210,7 +210,7 @@ added matters. To illustrate:: :meth:`register_defect` method. - .. attribute:: mangle_from\_ + .. attribute:: mangle_from_ If :const:`True`, lines starting with *"From "* in the body are escaped by putting a ``>`` in front of them. This parameter is used when diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 2649b7d8a51fdc3a4652d6103ddbf76da1c88437..8836b24912e9e35b3c339ffd216db87c9cdc5813 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -19,6 +19,12 @@ An enumeration is a set of symbolic names (members) bound to unique, constant values. Within an enumeration, the members can be compared by identity, and the enumeration itself can be iterated over. +.. note:: Case of Enum Members + + Because Enums are used to represent constants we recommend using + UPPER_CASE names for enum members, and will be using that style + in our examples. + Module Contents --------------- @@ -50,12 +56,13 @@ helper, :class:`auto`. the bitwise operations without losing their :class:`Flag` membership. .. function:: unique + :noindex: Enum class decorator that ensures only one name is bound to any one value. .. class:: auto - Instances are replaced with an appropriate value for Enum members. Initial value starts at 1. + Instances are replaced with an appropriate value for Enum members. By default, the initial value starts at 1. .. versionadded:: 3.6 ``Flag``, ``IntFlag``, ``auto`` @@ -387,8 +394,8 @@ enumeration, with the exception of special methods (:meth:`__str__`, variable names listed in :attr:`_ignore_`. Note: if your enumeration defines :meth:`__new__` and/or :meth:`__init__` then -whatever value(s) were given to the enum member will be passed into those -methods. See `Planet`_ for an example. +any value(s) given to the enum member will be passed into those methods. +See `Planet`_ for an example. Restricted Enum subclassing @@ -734,8 +741,7 @@ Some rules: 2. While :class:`Enum` can have members of any type, once you mix in an additional type, all the members must have values of that type, e.g. :class:`int` above. This restriction does not apply to mix-ins which only - add methods and don't specify another data type such as :class:`int` or - :class:`str`. + add methods and don't specify another type. 3. When another data type is mixed in, the :attr:`value` attribute is *not the same* as the enum member itself, although it is equivalent and will compare equal. @@ -743,9 +749,11 @@ Some rules: :meth:`__str__` and :meth:`__repr__` respectively; other codes (such as `%i` or `%h` for IntEnum) treat the enum member as its mixed-in type. 5. :ref:`Formatted string literals `, :meth:`str.format`, - and :func:`format` will use the mixed-in - type's :meth:`__format__`. If the :class:`Enum` class's :func:`str` or - :func:`repr` is desired, use the `!s` or `!r` format codes. + and :func:`format` will use the mixed-in type's :meth:`__format__` + unless :meth:`__str__` or :meth:`__format__` is overridden in the subclass, + in which case the overridden methods or :class:`Enum` methods will be used. + Use the !s and !r format codes to force usage of the :class:`Enum` class's + :meth:`__str__` and :meth:`__repr__` methods. When to use :meth:`__new__` vs. :meth:`__init__` ------------------------------------------------ @@ -879,6 +887,32 @@ Using an auto-numbering :meth:`__new__` would look like:: >>> Color.GREEN.value 2 +To make a more general purpose ``AutoNumber``, add ``*args`` to the signature:: + + >>> class AutoNumber(NoValue): + ... def __new__(cls, *args): # this is the only change from above + ... value = len(cls.__members__) + 1 + ... obj = object.__new__(cls) + ... obj._value_ = value + ... return obj + ... + +Then when you inherit from ``AutoNumber`` you can write your own ``__init__`` +to handle any extra arguments:: + + >>> class Swatch(AutoNumber): + ... def __init__(self, pantone='unknown'): + ... self.pantone = pantone + ... AUBURN = '3497' + ... SEA_GREEN = '1246' + ... BLEACHED_CORAL = () # New color, no Pantone code yet! + ... + >>> Swatch.SEA_GREEN + + >>> Swatch.SEA_GREEN.pantone + '1246' + >>> Swatch.BLEACHED_CORAL.pantone + 'unknown' .. note:: @@ -1056,7 +1090,7 @@ Supported ``_sunder_`` names - ``_missing_`` -- a lookup function used when a value is not found; may be overridden -- ``_ignore_`` -- a list of names, either as a :func:`list` or a :func:`str`, +- ``_ignore_`` -- a list of names, either as a :class:`list` or a :class:`str`, that will not be transformed into members, and will be removed from the final class - ``_order_`` -- used in Python 2/3 code to ensure member order is consistent @@ -1087,6 +1121,15 @@ and raise an error if the two do not match:: In Python 2 code the :attr:`_order_` attribute is necessary as definition order is lost before it can be recorded. + +_Private__names +""""""""""""""" + +Private names will be normal attributes in Python 3.10 instead of either an error +or a member (depending on if the name ends with an underscore). Using these names +in 3.9 will issue a :exc:`DeprecationWarning`. + + ``Enum`` member type """""""""""""""""""" diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst index 52a505e0a0ff8f17807a6a8990c11c8327e26e13..df2cda9d67ad153971e374db1eef138ffe8d44da 100644 --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -688,6 +688,10 @@ The following exceptions are used as warning categories; see the Base class for warnings about deprecated features when those warnings are intended for other Python developers. + Ignored by the default warning filters, except in the ``__main__`` module + (:pep:`565`). Enabling the :ref:`Python Development Mode ` shows + this warning. + .. exception:: PendingDeprecationWarning @@ -699,6 +703,9 @@ The following exceptions are used as warning categories; see the upcoming deprecation is unusual, and :exc:`DeprecationWarning` is preferred for already active deprecations. + Ignored by the default warning filters. Enabling the :ref:`Python + Development Mode ` shows this warning. + .. exception:: SyntaxWarning @@ -720,6 +727,9 @@ The following exceptions are used as warning categories; see the Base class for warnings about probable mistakes in module imports. + Ignored by the default warning filters. Enabling the :ref:`Python + Development Mode ` shows this warning. + .. exception:: UnicodeWarning @@ -733,8 +743,10 @@ The following exceptions are used as warning categories; see the .. exception:: ResourceWarning - Base class for warnings related to resource usage. Ignored by the default - warning filters. + Base class for warnings related to resource usage. + + Ignored by the default warning filters. Enabling the :ref:`Python + Development Mode ` shows this warning. .. versionadded:: 3.2 diff --git a/Doc/library/faulthandler.rst b/Doc/library/faulthandler.rst index b588dfa18db2dda687115c07914e73cbdae35b70..59274c1dd7ec354a8b0094e71fcd281c1fa63173 100644 --- a/Doc/library/faulthandler.rst +++ b/Doc/library/faulthandler.rst @@ -40,6 +40,9 @@ alternatively be passed to :func:`faulthandler.enable`. The module is implemented in C, so tracebacks can be dumped on a crash or when Python is deadlocked. +The :ref:`Python Development Mode ` calls :func:`faulthandler.enable` +at Python startup. + Dumping the traceback --------------------- diff --git a/Doc/library/fcntl.rst b/Doc/library/fcntl.rst index 69484b647363ddf88d04a3790fd0fd2b953a357e..07a15d27216e92ae497858e5b06e9dea7457987e 100644 --- a/Doc/library/fcntl.rst +++ b/Doc/library/fcntl.rst @@ -33,6 +33,12 @@ descriptor. ``F_SEAL_*`` constants for sealing of :func:`os.memfd_create` file descriptors. +.. versionchanged:: 3.9 + On macOS, the fcntl module exposes the ``F_GETPATH`` constant, which obtains + the path of a file from a file descriptor. + On Linux(>=3.15), the fcntl module exposes the ``F_OFD_GETLK``, ``F_OFD_SETLK`` + and ``F_OFD_SETLKW`` constants, which working with open file description locks. + The module defines the following functions: diff --git a/Doc/library/fnmatch.rst b/Doc/library/fnmatch.rst index ce07d326b395d80605e4b712343a6b79feb5a37e..925f08e914685e89c5c176a53ad39fc368d4d7db 100644 --- a/Doc/library/fnmatch.rst +++ b/Doc/library/fnmatch.rst @@ -75,7 +75,7 @@ patterns. .. function:: filter(names, pattern) - Return the subset of the list of *names* that match *pattern*. It is the same as + Construct a list from those elements of the iterable *names* that match *pattern*. It is the same as ``[n for n in names if fnmatch(n, pattern)]``, but implemented more efficiently. diff --git a/Doc/library/fractions.rst b/Doc/library/fractions.rst index 58e7126b0bf212fddadfc125cee7dae05251752f..a4d006eb58ffeb487aba0d1688fa6911dceb4f74 100644 --- a/Doc/library/fractions.rst +++ b/Doc/library/fractions.rst @@ -84,6 +84,10 @@ another rational number, or from a string. The :class:`Fraction` constructor now accepts :class:`float` and :class:`decimal.Decimal` instances. + .. versionchanged:: 3.9 + The :func:`math.gcd` function is now used to normalize the *numerator* + and *denominator*. :func:`math.gcd` always return a :class:`int` type. + Previously, the GCD type depended on *numerator* and *denominator*. .. attribute:: numerator @@ -172,18 +176,6 @@ another rational number, or from a string. method can also be accessed through the :func:`round` function. -.. function:: gcd(a, b) - - Return the greatest common divisor of the integers *a* and *b*. If either - *a* or *b* is nonzero, then the absolute value of ``gcd(a, b)`` is the - largest integer that divides both *a* and *b*. ``gcd(a,b)`` has the same - sign as *b* if *b* is nonzero; otherwise it takes the sign of *a*. ``gcd(0, - 0)`` returns ``0``. - - .. deprecated:: 3.5 - Use :func:`math.gcd` instead. - - .. seealso:: Module :mod:`numbers` diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst index db0212367340d9bd56004594a011cfbb554b167f..f4d4cdf9ada9d98403b15a9ac7ffd475ec28311d 100644 --- a/Doc/library/ftplib.rst +++ b/Doc/library/ftplib.rst @@ -19,10 +19,12 @@ as mirroring other FTP servers. It is also used by the module :mod:`urllib.request` to handle URLs that use FTP. For more information on FTP (File Transfer Protocol), see Internet :rfc:`959`. +The default encoding is UTF-8, following :rfc:`2640`. + Here's a sample session using the :mod:`ftplib` module:: >>> from ftplib import FTP - >>> ftp = FTP('ftp.debian.org') # connect to host, default port + >>> ftp = FTP('ftp.us.debian.org') # connect to host, default port >>> ftp.login() # user anonymous, passwd anonymous@ '230 Login successful.' >>> ftp.cwd('debian') # change into "debian" directory @@ -41,7 +43,7 @@ Here's a sample session using the :mod:`ftplib` module:: The module defines the following items: -.. class:: FTP(host='', user='', passwd='', acct='', timeout=None, source_address=None) +.. class:: FTP(host='', user='', passwd='', acct='', timeout=None, source_address=None, *, encoding='utf-8') Return a new instance of the :class:`FTP` class. When *host* is given, the method call ``connect(host)`` is made. When *user* is given, additionally @@ -50,7 +52,8 @@ The module defines the following items: parameter specifies a timeout in seconds for blocking operations like the connection attempt (if is not specified, the global default timeout setting will be used). *source_address* is a 2-tuple ``(host, port)`` for the socket - to bind to as its source address before connecting. + to bind to as its source address before connecting. The *encoding* parameter + specifies the encoding for directories and filenames. The :class:`FTP` class supports the :keyword:`with` statement, e.g.: @@ -72,8 +75,13 @@ The module defines the following items: .. versionchanged:: 3.3 *source_address* parameter was added. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket. + The *encoding* parameter was added, and the default was changed from + Latin-1 to UTF-8 to follow :rfc:`2640`. -.. class:: FTP_TLS(host='', user='', passwd='', acct='', keyfile=None, certfile=None, context=None, timeout=None, source_address=None) +.. class:: FTP_TLS(host='', user='', passwd='', acct='', keyfile=None, certfile=None, context=None, timeout=None, source_address=None, *, encoding='utf-8') A :class:`FTP` subclass which adds TLS support to FTP as described in :rfc:`4217`. @@ -105,6 +113,12 @@ The module defines the following items: :func:`ssl.create_default_context` select the system's trusted CA certificates for you. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket. + The *encoding* parameter was added, and the default was changed from + Latin-1 to UTF-8 to follow :rfc:`2640`. + Here's a sample session using the :class:`FTP_TLS` class:: >>> ftps = FTP_TLS('ftp.pureftpd.org') @@ -252,9 +266,10 @@ followed by ``lines`` for the text version or ``binary`` for the binary version. .. method:: FTP.retrlines(cmd, callback=None) - Retrieve a file or directory listing in ASCII transfer mode. *cmd* should be - an appropriate ``RETR`` command (see :meth:`retrbinary`) or a command such as - ``LIST`` or ``NLST`` (usually just the string ``'LIST'``). + Retrieve a file or directory listing in the encoding specified by the + *encoding* parameter at initialization. + *cmd* should be an appropriate ``RETR`` command (see :meth:`retrbinary`) or + a command such as ``LIST`` or ``NLST`` (usually just the string ``'LIST'``). ``LIST`` retrieves a list of files and information about those files. ``NLST`` retrieves a list of file names. The *callback* function is called for each line with a string argument @@ -284,7 +299,7 @@ followed by ``lines`` for the text version or ``binary`` for the binary version. .. method:: FTP.storlines(cmd, fp, callback=None) - Store a file in ASCII transfer mode. *cmd* should be an appropriate + Store a file in line mode. *cmd* should be an appropriate ``STOR`` command (see :meth:`storbinary`). Lines are read until EOF from the :term:`file object` *fp* (opened in binary mode) using its :meth:`~io.IOBase.readline` method to provide the data to be stored. *callback* is an optional single @@ -302,10 +317,9 @@ followed by ``lines`` for the text version or ``binary`` for the binary version. If optional *rest* is given, a ``REST`` command is sent to the server, passing *rest* as an argument. *rest* is usually a byte offset into the requested file, telling the server to restart sending the file's bytes at the requested offset, - skipping over the initial bytes. Note however that :rfc:`959` requires only that - *rest* be a string containing characters in the printable range from ASCII code - 33 to ASCII code 126. The :meth:`transfercmd` method, therefore, converts - *rest* to a string, but no check is performed on the string's contents. If the + skipping over the initial bytes. Note however that the :meth:`transfercmd` + method converts *rest* to a string with the *encoding* parameter specified + at initialization, but no check is performed on the string's contents. If the server does not recognize the ``REST`` command, an :exc:`error_reply` exception will be raised. If this happens, simply call :meth:`transfercmd` without a *rest* argument. diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 0f7df0e5e9107fde7f737b8c87cca8e62a85f5e9..990fc10c8cc9745bc1146b97549b88fc2f650f12 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -43,9 +43,8 @@ are always available. They are listed here in alphabetical order. .. function:: abs(x) Return the absolute value of a number. The argument may be an - integer or a floating point number. If the argument is a complex number, its - magnitude is returned. If *x* defines :meth:`__abs__`, - ``abs(x)`` returns ``x.__abs__()``. + integer, a floating point number, or an object implementing :meth:`__abs__`. + If the argument is a complex number, its magnitude is returned. .. function:: all(iterable) @@ -151,8 +150,8 @@ are always available. They are listed here in alphabetical order. * If it is an *integer*, the array will have that size and will be initialized with null bytes. - * If it is an object conforming to the *buffer* interface, a read-only buffer - of the object will be used to initialize the bytes array. + * If it is an object conforming to the :ref:`buffer interface `, + a read-only buffer of the object will be used to initialize the bytes array. * If it is an *iterable*, it must be an iterable of integers in the range ``0 <= x < 256``, which are used as the initial contents of the array. @@ -222,10 +221,12 @@ are always available. They are listed here in alphabetical order. implied first argument. Class methods are different than C++ or Java static methods. If you want those, - see :func:`staticmethod`. - + see :func:`staticmethod` in this section. For more information on class methods, see :ref:`types`. + .. versionchanged:: 3.9 + Class methods can now wrap other :term:`descriptors ` such as + :func:`property`. .. function:: compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1) @@ -244,26 +245,24 @@ are always available. They are listed here in alphabetical order. interactive statement (in the latter case, expression statements that evaluate to something other than ``None`` will be printed). - The optional arguments *flags* and *dont_inherit* control which :ref:`future - statements ` affect the compilation of *source*. If neither - is present (or both are zero) the code is compiled with those future - statements that are in effect in the code that is calling :func:`compile`. If the - *flags* argument is given and *dont_inherit* is not (or is zero) then the - future statements specified by the *flags* argument are used in addition to - those that would be used anyway. If *dont_inherit* is a non-zero integer then - the *flags* argument is it -- the future statements in effect around the call - to compile are ignored. - - Future statements are specified by bits which can be bitwise ORed together to - specify multiple statements. The bitfield required to specify a given feature - can be found as the :attr:`~__future__._Feature.compiler_flag` attribute on - the :class:`~__future__._Feature` instance in the :mod:`__future__` module. - - The optional argument *flags* also controls whether the compiled source is - allowed to contain top-level ``await``, ``async for`` and ``async with``. - When the bit ``ast.PyCF_ALLOW_TOP_LEVEL_AWAIT`` is set, the return code - object has ``CO_COROUTINE`` set in ``co_code``, and can be interactively - executed via ``await eval(code_object)``. + The optional arguments *flags* and *dont_inherit* control which + :ref:`compiler options ` should be activated + and which :ref:`future features ` should be allowed. If neither + is present (or both are zero) the code is compiled with the same flags that + affect the code that is calling :func:`compile`. If the *flags* + argument is given and *dont_inherit* is not (or is zero) then the compiler + options and the future statements specified by the *flags* argument are used + in addition to those that would be used anyway. If *dont_inherit* is a + non-zero integer then the *flags* argument is it -- the flags (future + features and compiler options) in the surrounding code are ignored. + + Compiler options and future statements are specified by bits which can be + bitwise ORed together to specify multiple options. The bitfield required to + specify a given future feature can be found as the + :attr:`~__future__._Feature.compiler_flag` attribute on the + :class:`~__future__._Feature` instance in the :mod:`__future__` module. + :ref:`Compiler flags ` can be found in :mod:`ast` + module, with ``PyCF_`` prefix. The argument *optimize* specifies the optimization level of the compiler; the default value of ``-1`` selects the optimization level of the interpreter as @@ -509,7 +508,8 @@ are always available. They are listed here in alphabetical order. occurs). [#]_ If it is a code object, it is simply executed. In all cases, the code that's executed is expected to be valid as file input (see the section "File input" in the Reference Manual). Be aware that the - :keyword:`return` and :keyword:`yield` statements may not be used outside of + :keyword:`nonlocal`, :keyword:`yield`, and :keyword:`return` + statements may not be used outside of function definitions even within the context of code passed to the :func:`exec` function. The return value is ``None``. @@ -581,7 +581,7 @@ are always available. They are listed here in alphabetical order. input must conform to the following grammar after leading and trailing whitespace characters are removed: - .. productionlist:: + .. productionlist:: float sign: "+" | "-" infinity: "Infinity" | "inf" nan: "nan" @@ -767,6 +767,8 @@ are always available. They are listed here in alphabetical order. .. impl-detail:: This is the address of the object in memory. + .. audit-event:: builtins.id id id + .. function:: input([prompt]) @@ -890,6 +892,11 @@ are always available. They are listed here in alphabetical order. sequence (such as a string, bytes, tuple, list, or range) or a collection (such as a dictionary, set, or frozen set). + .. impl-detail:: + + ``len`` raises :exc:`OverflowError` on lengths larger than + :data:`sys.maxsize`, such as :class:`range(2 ** 100) `. + .. _func-list: .. class:: list([iterable]) @@ -1035,7 +1042,8 @@ are always available. They are listed here in alphabetical order. .. function:: open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) Open *file* and return a corresponding :term:`file object`. If the file - cannot be opened, an :exc:`OSError` is raised. + cannot be opened, an :exc:`OSError` is raised. See + :ref:`tut-files` for more examples of how to use this function. *file* is a :term:`path-like object` giving the pathname (absolute or relative to the current working directory) of the file to be opened or an @@ -1245,7 +1253,7 @@ are always available. They are listed here in alphabetical order. * The file is now non-inheritable. - .. deprecated-removed:: 3.4 3.9 + .. deprecated-removed:: 3.4 3.10 The ``'U'`` mode. @@ -1680,18 +1688,19 @@ are always available. They are listed here in alphabetical order. With three arguments, return a new type object. This is essentially a - dynamic form of the :keyword:`class` statement. The *name* string is the - class name and becomes the :attr:`~definition.__name__` attribute; the *bases* - tuple itemizes the base classes and becomes the :attr:`~class.__bases__` - attribute; and the *dict* dictionary is the namespace containing definitions - for class body and is copied to a standard dictionary to become the - :attr:`~object.__dict__` attribute. For example, the following two - statements create identical :class:`type` objects: + dynamic form of the :keyword:`class` statement. The *name* string is + the class name and becomes the :attr:`~definition.__name__` attribute. + The *bases* tuple contains the base classes and becomes the + :attr:`~class.__bases__` attribute; if empty, :class:`object`, the + ultimate base of all classes, is added. The *dict* dictionary contains + attribute and method definitions for the class body; it may be copied + or wrapped before becoming the :attr:`~object.__dict__` attribute. + The following two statements create identical :class:`type` objects: >>> class X: ... a = 1 ... - >>> X = type('X', (object,), dict(a=1)) + >>> X = type('X', (), dict(a=1)) See also :ref:`bltin-type-objects`. @@ -1713,6 +1722,9 @@ are always available. They are listed here in alphabetical order. locals dictionary is only useful for reads since updates to the locals dictionary are ignored. + A :exc:`TypeError` exception is raised if an object is specified but + it doesn't have a :attr:`~object.__dict__` attribute (for example, if + its class defines the :attr:`~object.__slots__` attribute). .. function:: zip(*iterables) @@ -1828,6 +1840,9 @@ are always available. They are listed here in alphabetical order. Negative values for *level* are no longer supported (which also changes the default value to 0). + .. versionchanged:: 3.9 + When the command line options :option:`-E` or :option:`-I` are being used, + the environment variable :envvar:`PYTHONCASEOK` is now ignored. .. rubric:: Footnotes diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index 0fb8d900c7362713c4297200474be6c60cf97c25..85d4e74698d2f1302b1ba8885df6c6db1c208775 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -8,10 +8,16 @@ .. moduleauthor:: Raymond Hettinger .. moduleauthor:: Nick Coghlan .. moduleauthor:: Łukasz Langa +.. moduleauthor:: Pablo Galindo .. sectionauthor:: Peter Harris **Source code:** :source:`Lib/functools.py` +.. testsetup:: default + + import functools + from functools import * + -------------- The :mod:`functools` module is for higher-order functions: functions that act on @@ -20,6 +26,32 @@ function for the purposes of this module. The :mod:`functools` module defines the following functions: +.. decorator:: cache(user_function) + + Simple lightweight unbounded function cache. Sometimes called + `"memoize" `_. + + Returns the same as ``lru_cache(maxsize=None)``, creating a thin + wrapper around a dictionary lookup for the function arguments. Because it + never needs to evict old values, this is smaller and faster than + :func:`lru_cache()` with a size limit. + + For example:: + + @cache + def factorial(n): + return n * factorial(n-1) if n else 1 + + >>> factorial(10) # no previously cached result, makes 11 recursive calls + 3628800 + >>> factorial(5) # just looks up cached value result + 120 + >>> factorial(12) # makes two new recursive calls, the other 10 are cached + 479001600 + + .. versionadded:: 3.9 + + .. decorator:: cached_property(func) Transform a method of a class into a property whose value is computed once @@ -30,27 +62,52 @@ The :mod:`functools` module defines the following functions: Example:: class DataSet: + def __init__(self, sequence_of_numbers): - self._data = sequence_of_numbers + self._data = tuple(sequence_of_numbers) @cached_property def stdev(self): return statistics.stdev(self._data) - @cached_property - def variance(self): - return statistics.variance(self._data) + The mechanics of :func:`cached_property` are somewhat different from + :func:`property`. A regular property blocks attribute writes unless a + setter is defined. In contrast, a *cached_property* allows writes. - .. versionadded:: 3.8 + The *cached_property* decorator only runs on lookups and only when an + attribute of the same name doesn't exist. When it does run, the + *cached_property* writes to the attribute with the same name. Subsequent + attribute reads and writes take precedence over the *cached_property* + method and it works like a normal attribute. - .. note:: + The cached value can be cleared by deleting the attribute. This + allows the *cached_property* method to run again. + + Note, this decorator interferes with the operation of :pep:`412` + key-sharing dictionaries. This means that instance dictionaries + can take more space than usual. - This decorator requires that the ``__dict__`` attribute on each instance - be a mutable mapping. This means it will not work with some types, such as - metaclasses (since the ``__dict__`` attributes on type instances are - read-only proxies for the class namespace), and those that specify - ``__slots__`` without including ``__dict__`` as one of the defined slots - (as such classes don't provide a ``__dict__`` attribute at all). + Also, this decorator requires that the ``__dict__`` attribute on each instance + be a mutable mapping. This means it will not work with some types, such as + metaclasses (since the ``__dict__`` attributes on type instances are + read-only proxies for the class namespace), and those that specify + ``__slots__`` without including ``__dict__`` as one of the defined slots + (as such classes don't provide a ``__dict__`` attribute at all). + + If a mutable mapping is not available or if space-efficient key sharing + is desired, an effect similar to :func:`cached_property` can be achieved + by a stacking :func:`property` on top of :func:`cache`:: + + class DataSet: + def __init__(self, sequence_of_numbers): + self._data = sequence_of_numbers + + @property + @cache + def stdev(self): + return statistics.stdev(self._data) + + .. versionadded:: 3.8 .. function:: cmp_to_key(func) @@ -107,6 +164,11 @@ The :mod:`functools` module defines the following functions: cached separately. For example, ``f(3)`` and ``f(3.0)`` will be treated as distinct calls with distinct results. + The wrapped function is instrumented with a :func:`cache_parameters` + function that returns a new :class:`dict` showing the values for *maxsize* + and *typed*. This is for information purposes only. Mutating the values + has no effect. + To help measure the effectiveness of the cache and tune the *maxsize* parameter, the wrapped function is instrumented with a :func:`cache_info` function that returns a :term:`named tuple` showing *hits*, *misses*, @@ -121,11 +183,11 @@ The :mod:`functools` module defines the following functions: bypassing the cache, or for rewrapping the function with a different cache. An `LRU (least recently used) cache - `_ works - best when the most recent calls are the best predictors of upcoming calls (for - example, the most popular articles on a news server tend to change each day). - The cache's size limit assures that the cache does not grow without bound on - long-running processes such as web servers. + `_ + works best when the most recent calls are the best predictors of upcoming + calls (for example, the most popular articles on a news server tend to + change each day). The cache's size limit assures that the cache does not + grow without bound on long-running processes such as web servers. In general, the LRU cache should only be used when you want to reuse previously computed values. Accordingly, it doesn't make sense to cache @@ -177,6 +239,9 @@ The :mod:`functools` module defines the following functions: .. versionchanged:: 3.8 Added the *user_function* option. + .. versionadded:: 3.9 + Added the function :func:`cache_parameters` + .. decorator:: total_ordering Given a class defining one or more rich comparison ordering methods, this @@ -274,7 +339,7 @@ The :mod:`functools` module defines the following functions: Example:: - >>> class Cell(object): + >>> class Cell: ... def __init__(self): ... self._alive = False ... @property @@ -414,6 +479,20 @@ The :mod:`functools` module defines the following functions: for the base ``object`` type, which means it is used if no better implementation is found. + If an implementation registered to :term:`abstract base class`, virtual + subclasses will be dispatched to that implementation:: + + >>> from collections.abc import Mapping + >>> @fun.register + ... def _(arg: Mapping, verbose=False): + ... if verbose: + ... print("Keys & Values") + ... for key, value in arg.items(): + ... print(key, "=>", value) + ... + >>> fun({"a": "b"}) + a => b + To check which implementation will the generic function choose for a given type, use the ``dispatch()`` attribute:: diff --git a/Doc/library/gc.rst b/Doc/library/gc.rst index 13eda917b9a801522e2af51e7fa59e1e5985f25d..2d85cd3431711ab603ba517858725c5c06ec0e91 100644 --- a/Doc/library/gc.rst +++ b/Doc/library/gc.rst @@ -106,9 +106,9 @@ The :mod:`gc` module provides the following functions: allocations minus the number of deallocations exceeds *threshold0*, collection starts. Initially only generation ``0`` is examined. If generation ``0`` has been examined more than *threshold1* times since generation ``1`` has been - examined, then generation ``1`` is examined as well. Similarly, *threshold2* - controls the number of collections of generation ``1`` before collecting - generation ``2``. + examined, then generation ``1`` is examined as well. + With the third generation, things are a bit more complicated, + see `Collecting the oldest generation `_ for more information. .. function:: get_count() @@ -177,6 +177,27 @@ The :mod:`gc` module provides the following functions: .. versionadded:: 3.1 +.. function:: is_finalized(obj) + + Returns ``True`` if the given object has been finalized by the + garbage collector, ``False`` otherwise. :: + + >>> x = None + >>> class Lazarus: + ... def __del__(self): + ... global x + ... x = self + ... + >>> lazarus = Lazarus() + >>> gc.is_finalized(lazarus) + False + >>> del lazarus + >>> gc.is_finalized(x) + True + + .. versionadded:: 3.9 + + .. function:: freeze() Freeze all the objects tracked by gc - move them to a permanent generation diff --git a/Doc/library/glob.rst b/Doc/library/glob.rst index 92a8c4d1eb871cfe8120dca583a63756cf8d07b2..3c468ebf73769f713595d6cb7af68bd14dc3ff81 100644 --- a/Doc/library/glob.rst +++ b/Doc/library/glob.rst @@ -43,7 +43,9 @@ For example, ``'[?]'`` matches the character ``'?'``. (like :file:`/usr/src/Python-1.5/Makefile`) or relative (like :file:`../../Tools/\*/\*.gif`), and can contain shell-style wildcards. Broken symlinks are included in the results (as in the shell). Whether or not the - results are sorted depends on the file system. + results are sorted depends on the file system. If a file that satisfies + conditions is removed or added during the call of this function, whether + a path name for that file be included is unspecified. .. index:: single: **; in glob-style wildcards diff --git a/Doc/library/graphlib.rst b/Doc/library/graphlib.rst new file mode 100644 index 0000000000000000000000000000000000000000..0faca2186b268cc5ac66e144952574b5f6ef01ee --- /dev/null +++ b/Doc/library/graphlib.rst @@ -0,0 +1,209 @@ +:mod:`graphlib` --- Functionality to operate with graph-like structures +========================================================================= + +.. module:: graphlib + :synopsis: Functionality to operate with graph-like structures + + +**Source code:** :source:`Lib/graphlib.py` + +.. testsetup:: default + + import graphlib + from graphlib import * + +-------------- + + +.. class:: TopologicalSorter(graph=None) + + Provides functionality to topologically sort a graph of hashable nodes. + + A topological order is a linear ordering of the vertices in a graph such that + for every directed edge u -> v from vertex u to vertex v, vertex u comes + before vertex v in the ordering. For instance, the vertices of the graph may + represent tasks to be performed, and the edges may represent constraints that + one task must be performed before another; in this example, a topological + ordering is just a valid sequence for the tasks. A complete topological + ordering is possible if and only if the graph has no directed cycles, that + is, if it is a directed acyclic graph. + + If the optional *graph* argument is provided it must be a dictionary + representing a directed acyclic graph where the keys are nodes and the values + are iterables of all predecessors of that node in the graph (the nodes that + have edges that point to the value in the key). Additional nodes can be added + to the graph using the :meth:`~TopologicalSorter.add` method. + + In the general case, the steps required to perform the sorting of a given + graph are as follows: + + * Create an instance of the :class:`TopologicalSorter` with an optional + initial graph. + * Add additional nodes to the graph. + * Call :meth:`~TopologicalSorter.prepare` on the graph. + * While :meth:`~TopologicalSorter.is_active` is ``True``, iterate over + the nodes returned by :meth:`~TopologicalSorter.get_ready` and + process them. Call :meth:`~TopologicalSorter.done` on each node as it + finishes processing. + + In case just an immediate sorting of the nodes in the graph is required and + no parallelism is involved, the convenience method + :meth:`TopologicalSorter.static_order` can be used directly: + + .. doctest:: + + >>> graph = {"D": {"B", "C"}, "C": {"A"}, "B": {"A"}} + >>> ts = TopologicalSorter(graph) + >>> tuple(ts.static_order()) + ('A', 'C', 'B', 'D') + + The class is designed to easily support parallel processing of the nodes as + they become ready. For instance:: + + topological_sorter = TopologicalSorter() + + # Add nodes to 'topological_sorter'... + + topological_sorter.prepare() + while topological_sorter.is_active(): + for node in topological_sorter.get_ready(): + # Worker threads or processes take nodes to work on off the + # 'task_queue' queue. + task_queue.put(node) + + # When the work for a node is done, workers put the node in + # 'finalized_tasks_queue' so we can get more nodes to work on. + # The definition of 'is_active()' guarantees that, at this point, at + # least one node has been placed on 'task_queue' that hasn't yet + # been passed to 'done()', so this blocking 'get()' must (eventually) + # succeed. After calling 'done()', we loop back to call 'get_ready()' + # again, so put newly freed nodes on 'task_queue' as soon as + # logically possible. + node = finalized_tasks_queue.get() + topological_sorter.done(node) + + .. method:: add(node, *predecessors) + + Add a new node and its predecessors to the graph. Both the *node* and all + elements in *predecessors* must be hashable. + + If called multiple times with the same node argument, the set of + dependencies will be the union of all dependencies passed in. + + It is possible to add a node with no dependencies (*predecessors* is not + provided) or to provide a dependency twice. If a node that has not been + provided before is included among *predecessors* it will be automatically + added to the graph with no predecessors of its own. + + Raises :exc:`ValueError` if called after :meth:`~TopologicalSorter.prepare`. + + .. method:: prepare() + + Mark the graph as finished and check for cycles in the graph. If any cycle + is detected, :exc:`CycleError` will be raised, but + :meth:`~TopologicalSorter.get_ready` can still be used to obtain as many + nodes as possible until cycles block more progress. After a call to this + function, the graph cannot be modified, and therefore no more nodes can be + added using :meth:`~TopologicalSorter.add`. + + .. method:: is_active() + + Returns ``True`` if more progress can be made and ``False`` otherwise. + Progress can be made if cycles do not block the resolution and either + there are still nodes ready that haven't yet been returned by + :meth:`TopologicalSorter.get_ready` or the number of nodes marked + :meth:`TopologicalSorter.done` is less than the number that have been + returned by :meth:`TopologicalSorter.get_ready`. + + The :meth:`~TopologicalSorter.__bool__` method of this class defers to + this function, so instead of:: + + if ts.is_active(): + ... + + it is possible to simply do:: + + if ts: + ... + + Raises :exc:`ValueError` if called without calling + :meth:`~TopologicalSorter.prepare` previously. + + .. method:: done(*nodes) + + Marks a set of nodes returned by :meth:`TopologicalSorter.get_ready` as + processed, unblocking any successor of each node in *nodes* for being + returned in the future by a call to :meth:`TopologicalSorter.get_ready`. + + Raises :exc:`ValueError` if any node in *nodes* has already been marked as + processed by a previous call to this method or if a node was not added to + the graph by using :meth:`TopologicalSorter.add`, if called without + calling :meth:`~TopologicalSorter.prepare` or if node has not yet been + returned by :meth:`~TopologicalSorter.get_ready`. + + .. method:: get_ready() + + Returns a ``tuple`` with all the nodes that are ready. Initially it + returns all nodes with no predecessors, and once those are marked as + processed by calling :meth:`TopologicalSorter.done`, further calls will + return all new nodes that have all their predecessors already processed. + Once no more progress can be made, empty tuples are returned. + + Raises :exc:`ValueError` if called without calling + :meth:`~TopologicalSorter.prepare` previously. + + .. method:: static_order() + + Returns an iterable of nodes in a topological order. Using this method + does not require to call :meth:`TopologicalSorter.prepare` or + :meth:`TopologicalSorter.done`. This method is equivalent to:: + + def static_order(self): + self.prepare() + while self.is_active(): + node_group = self.get_ready() + yield from node_group + self.done(*node_group) + + The particular order that is returned may depend on the specific order in + which the items were inserted in the graph. For example: + + .. doctest:: + + >>> ts = TopologicalSorter() + >>> ts.add(3, 2, 1) + >>> ts.add(1, 0) + >>> print([*ts.static_order()]) + [2, 0, 1, 3] + + >>> ts2 = TopologicalSorter() + >>> ts2.add(1, 0) + >>> ts2.add(3, 2, 1) + >>> print([*ts2.static_order()]) + [0, 2, 1, 3] + + This is due to the fact that "0" and "2" are in the same level in the + graph (they would have been returned in the same call to + :meth:`~TopologicalSorter.get_ready`) and the order between them is + determined by the order of insertion. + + + If any cycle is detected, :exc:`CycleError` will be raised. + + .. versionadded:: 3.9 + + +Exceptions +---------- +The :mod:`graphlib` module defines the following exception classes: + +.. exception:: CycleError + + Subclass of :exc:`ValueError` raised by :meth:`TopologicalSorter.prepare` if cycles exist + in the working graph. If multiple cycles exist, only one undefined choice among them will + be reported and included in the exception. + + The detected cycle can be accessed via the second element in the :attr:`~CycleError.args` + attribute of the exception instance and consists in a list of nodes, such that each node is, + in the graph, an immediate predecessor of the next node in the list. In the reported list, + the first and the last node will be the same, to make it clear that it is cyclic. \ No newline at end of file diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst index 3349a94446d0ce59919146c44e7303cc1eb3c50a..33c40676f747c57bdd494f17c7c5cf71ee28e956 100644 --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -88,7 +88,8 @@ The module defines the following items: The *mode* argument can be any of ``'r'``, ``'rb'``, ``'a'``, ``'ab'``, ``'w'``, ``'wb'``, ``'x'``, or ``'xb'``, depending on whether the file will be read or written. The default is the mode of *fileobj* if discernible; otherwise, the - default is ``'rb'``. + default is ``'rb'``. In future Python releases the mode of *fileobj* will + not be used. It is better to always specify *mode* for writing. Note that the file is always opened in binary mode. To open a compressed file in text mode, use :func:`.open` (or wrap your :class:`GzipFile` with an @@ -164,6 +165,10 @@ The module defines the following items: .. versionchanged:: 3.6 Accepts a :term:`path-like object`. + .. deprecated:: 3.9 + Opening :class:`GzipFile` for writing without specifying the *mode* + argument is deprecated. + .. function:: compress(data, compresslevel=9, *, mtime=None) diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst index a16c7cd4d7cd6e9e6a618a6b7bf350c0013e02ff..d644974e660984adc8e3448d65cfd7787661d382 100644 --- a/Doc/library/hashlib.rst +++ b/Doc/library/hashlib.rst @@ -67,7 +67,7 @@ Constructors for hash algorithms that are always present in this module are :func:`sha1`, :func:`sha224`, :func:`sha256`, :func:`sha384`, :func:`sha512`, :func:`blake2b`, and :func:`blake2s`. :func:`md5` is normally available as well, though it -may be missing if you are using a rare "FIPS compliant" build of Python. +may be missing or blocked if you are using a rare "FIPS compliant" build of Python. Additional algorithms may also be available depending upon the OpenSSL library that Python uses on your platform. On most platforms the :func:`sha3_224`, :func:`sha3_256`, :func:`sha3_384`, :func:`sha3_512`, @@ -80,6 +80,15 @@ library that Python uses on your platform. On most platforms the .. versionadded:: 3.6 :func:`blake2b` and :func:`blake2s` were added. +.. versionchanged:: 3.9 + All hashlib constructors take a keyword-only argument *usedforsecurity* + with default value ``True``. A false value allows the use of insecure and + blocked hashing algorithms in restricted environments. ``False`` indicates + that the hashing algorithm is not used in a security context, e.g. as a + non-cryptographic one-way compression function. + + Hashlib now uses SHA3 and SHAKE from OpenSSL 1.1.1 and newer. + For example, to obtain the digest of the byte string ``b'Nobody inspects the spammish repetition'``:: @@ -99,7 +108,7 @@ More condensed: >>> hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest() 'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2' -.. function:: new(name[, data]) +.. function:: new(name[, data], *, usedforsecurity=True) Is a generic constructor that takes the string *name* of the desired algorithm as its first parameter. It also exists to allow access to the @@ -308,11 +317,13 @@ New hash objects are created by calling constructor functions: .. function:: blake2b(data=b'', *, digest_size=64, key=b'', salt=b'', \ person=b'', fanout=1, depth=1, leaf_size=0, node_offset=0, \ - node_depth=0, inner_size=0, last_node=False) + node_depth=0, inner_size=0, last_node=False, \ + usedforsecurity=True) .. function:: blake2s(data=b'', *, digest_size=32, key=b'', salt=b'', \ person=b'', fanout=1, depth=1, leaf_size=0, node_offset=0, \ - node_depth=0, inner_size=0, last_node=False) + node_depth=0, inner_size=0, last_node=False, \ + usedforsecurity=True) These functions return the corresponding hash objects for calculating diff --git a/Doc/library/hmac.rst b/Doc/library/hmac.rst index 57ac8bb16120f5d75e44f168fe023a5809f3b6a4..897edc2d19517c4580a5ff62258f4109840d1cc1 100644 --- a/Doc/library/hmac.rst +++ b/Doc/library/hmac.rst @@ -114,6 +114,12 @@ A hash object has the following attributes: .. versionadded:: 3.4 +.. deprecated:: 3.9 + + The undocumented attributes ``HMAC.digest_cons``, ``HMAC.inner``, and + ``HMAC.outer`` are internal implementation details and will be removed in + Python 3.10. + This module also provides the following helper function: .. function:: compare_digest(a, b) @@ -132,6 +138,11 @@ This module also provides the following helper function: .. versionadded:: 3.3 + .. versionchanged:: 3.9 + + The function uses OpenSSL's ``CRYPTO_memcmp()`` internally when + available. + .. seealso:: diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst index be31c3c07154f40aaafe67bb0d28803fc29bc167..35997db2a9d27d29ac61e7f5ec78614c5bcb13fd 100644 --- a/Doc/library/http.client.rst +++ b/Doc/library/http.client.rst @@ -484,6 +484,14 @@ statement. HTTP protocol version used by server. 10 for HTTP/1.0, 11 for HTTP/1.1. +.. attribute:: HTTPResponse.url + + URL of the resource retrieved, commonly used to determine if a redirect was followed. + +.. attribute:: HTTPResponse.headers + + Headers of the response in the form of an :class:`email.message.EmailMessage` instance. + .. attribute:: HTTPResponse.status Status code returned by server. @@ -501,6 +509,21 @@ statement. Is ``True`` if the stream is closed. +.. method:: HTTPResponse.geturl() + + .. deprecated:: 3.9 + Deprecated in favor of :attr:`~HTTPResponse.url`. + +.. method:: HTTPResponse.info() + + .. deprecated:: 3.9 + Deprecated in favor of :attr:`~HTTPResponse.headers`. + +.. method:: HTTPResponse.getstatus() + + .. deprecated:: 3.9 + Deprecated in favor of :attr:`~HTTPResponse.status`. + Examples -------- diff --git a/Doc/library/http.rst b/Doc/library/http.rst index 0e3441cbcb718ccaf570e4da02bcb108c1d54b7e..14ee73363e62e0ccbdeb39fb4dfb31495aaf52bf 100644 --- a/Doc/library/http.rst +++ b/Doc/library/http.rst @@ -62,6 +62,7 @@ Code Enum Name Details ``100`` ``CONTINUE`` HTTP/1.1 :rfc:`7231`, Section 6.2.1 ``101`` ``SWITCHING_PROTOCOLS`` HTTP/1.1 :rfc:`7231`, Section 6.2.2 ``102`` ``PROCESSING`` WebDAV :rfc:`2518`, Section 10.1 +``103`` ``EARLY_HINTS`` An HTTP Status Code for Indicating Hints :rfc:`8297` ``200`` ``OK`` HTTP/1.1 :rfc:`7231`, Section 6.3.1 ``201`` ``CREATED`` HTTP/1.1 :rfc:`7231`, Section 6.3.2 ``202`` ``ACCEPTED`` HTTP/1.1 :rfc:`7231`, Section 6.3.3 @@ -98,10 +99,12 @@ Code Enum Name Details ``415`` ``UNSUPPORTED_MEDIA_TYPE`` HTTP/1.1 :rfc:`7231`, Section 6.5.13 ``416`` ``REQUESTED_RANGE_NOT_SATISFIABLE`` HTTP/1.1 Range Requests :rfc:`7233`, Section 4.4 ``417`` ``EXPECTATION_FAILED`` HTTP/1.1 :rfc:`7231`, Section 6.5.14 +``418`` ``IM_A_TEAPOT`` HTCPCP/1.0 :rfc:`2324`, Section 2.3.2 ``421`` ``MISDIRECTED_REQUEST`` HTTP/2 :rfc:`7540`, Section 9.1.2 ``422`` ``UNPROCESSABLE_ENTITY`` WebDAV :rfc:`4918`, Section 11.2 ``423`` ``LOCKED`` WebDAV :rfc:`4918`, Section 11.3 ``424`` ``FAILED_DEPENDENCY`` WebDAV :rfc:`4918`, Section 11.4 +``425`` ``TOO_EARLY`` Using Early Data in HTTP :rfc:`8470` ``426`` ``UPGRADE_REQUIRED`` HTTP/1.1 :rfc:`7231`, Section 6.5.15 ``428`` ``PRECONDITION_REQUIRED`` Additional HTTP Status Codes :rfc:`6585` ``429`` ``TOO_MANY_REQUESTS`` Additional HTTP Status Codes :rfc:`6585` @@ -130,3 +133,6 @@ equal to the constant name (i.e. ``http.HTTPStatus.OK`` is also available as .. versionadded:: 3.8 Added ``451 UNAVAILABLE_FOR_LEGAL_REASONS`` status code. + +.. versionadded:: 3.9 + Added ``103 EARLY_HINTS``, ``418 IM_A_TEAPOT`` and ``425 TOO_EARLY`` status codes. diff --git a/Doc/library/http.server.rst b/Doc/library/http.server.rst index a367e373dc3c03b0b4223ab0782355dc348caad9..478a5b31475cfd8676b437a9c34c659c0dee1cc4 100644 --- a/Doc/library/http.server.rst +++ b/Doc/library/http.server.rst @@ -335,15 +335,21 @@ provides three different variants: .. attribute:: extensions_map - A dictionary mapping suffixes into MIME types. The default is - signified by an empty string, and is considered to be - ``application/octet-stream``. The mapping is used case-insensitively, + A dictionary mapping suffixes into MIME types, contains custom overrides + for the default system mappings. The mapping is used case-insensitively, and so should contain only lower-cased keys. + .. versionchanged:: 3.9 + This dictionary is no longer filled with the default system mappings, + but only contains overrides. + .. attribute:: directory If not specified, the directory to serve is the current working directory. + .. versionchanged:: 3.9 + Accepts a :term:`path-like object`. + The :class:`SimpleHTTPRequestHandler` class defines the following methods: .. method:: do_HEAD() diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index 75b6fa3861b23d09c50947816531485e38a7d0b4..e7eaabd8bfa25a209c1ab9cc38cb59cb57dbb341 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -250,7 +250,7 @@ View Last Restart Scroll the shell window to the last Shell restart. Restart Shell - Restart the shell to clean the environment. + Restart the shell to clean the environment and reset display and exception handling. Previous History Cycle through earlier commands in history which match the current entry. @@ -491,7 +491,7 @@ in the settings dialog. (To prevent auto popups, set the delay to a large number of milliseconds, such as 100000000.) For imported module names or class or function attributes, type '.'. For filenames in the root directory, type :data:`os.sep` or -data:`os.altsep` immediately after an opening quote. (On Windows, +:data:`os.altsep` immediately after an opening quote. (On Windows, one can specify a drive first.) Move into subdirectories by typing a directory name and a separator. @@ -527,30 +527,33 @@ by typing '_' after '.', either before or after the box is opened. Calltips ^^^^^^^^ -A calltip is shown when one types :kbd:`(` after the name of an *accessible* -function. A name expression may include dots and subscripts. A calltip -remains until it is clicked, the cursor is moved out of the argument area, -or :kbd:`)` is typed. When the cursor is in the argument part of a definition, -the menu or shortcut display a calltip. +A calltip is shown automatically when one types :kbd:`(` after the name +of an *accessible* function. A function name expression may include +dots and subscripts. A calltip remains until it is clicked, the cursor +is moved out of the argument area, or :kbd:`)` is typed. Whenever the +cursor is in the argument part of a definition, select Edit and "Show +Call Tip" on the menu or enter its shortcut to display a calltip. -A calltip consists of the function signature and the first line of the -docstring. For builtins without an accessible signature, the calltip -consists of all lines up the fifth line or the first blank line. These -details may change. +The calltip consists of the function's signature and docstring up to +the latter's first blank line or the fifth non-blank line. (Some builtin +functions lack an accessible signature.) A '/' or '*' in the signature +indicates that the preceding or following arguments are passed by +position or name (keyword) only. Details are subject to change. -The set of *accessible* functions depends on what modules have been imported -into the user process, including those imported by Idle itself, -and what definitions have been run, all since the last restart. +In Shell, the accessible functions depends on what modules have been +imported into the user process, including those imported by Idle itself, +and which definitions have been run, all since the last restart. For example, restart the Shell and enter ``itertools.count(``. A calltip -appears because Idle imports itertools into the user process for its own use. -(This could change.) Enter ``turtle.write(`` and nothing appears. Idle does -not import turtle. The menu or shortcut do nothing either. Enter -``import turtle`` and then ``turtle.write(`` will work. - -In an editor, import statements have no effect until one runs the file. One -might want to run a file after writing the import statements at the top, -or immediately run an existing file before editing. +appears because Idle imports itertools into the user process for its own +use. (This could change.) Enter ``turtle.write(`` and nothing appears. +Idle does not itself import turtle. The menu entry and shortcut also do +nothing. Enter ``import turtle``. Thereafter, ``turtle.write(`` +will display a calltip. + +In an editor, import statements have no effect until one runs the file. +One might want to run a file after writing import statements, after +adding function definitions, or after opening an existing file. .. _code-context: diff --git a/Doc/library/imaplib.rst b/Doc/library/imaplib.rst index df63d820cfe043797578b646cb4a87ac33564f9a..65681ec093598c209e93d5d43799f5783eaffefc 100644 --- a/Doc/library/imaplib.rst +++ b/Doc/library/imaplib.rst @@ -30,12 +30,14 @@ Three classes are provided by the :mod:`imaplib` module, :class:`IMAP4` is the base class: -.. class:: IMAP4(host='', port=IMAP4_PORT) +.. class:: IMAP4(host='', port=IMAP4_PORT, timeout=None) This class implements the actual IMAP4 protocol. The connection is created and protocol version (IMAP4 or IMAP4rev1) is determined when the instance is initialized. If *host* is not specified, ``''`` (the local host) is used. If - *port* is omitted, the standard IMAP4 port (143) is used. + *port* is omitted, the standard IMAP4 port (143) is used. The optional *timeout* + parameter specifies a timeout in seconds for the connection attempt. + If timeout is not given or is None, the global default socket timeout is used. The :class:`IMAP4` class supports the :keyword:`with` statement. When used like this, the IMAP4 ``LOGOUT`` command is issued automatically when the @@ -50,6 +52,9 @@ base class: .. versionchanged:: 3.5 Support for the :keyword:`with` statement was added. + .. versionchanged:: 3.9 + The optional *timeout* parameter was added. + Three exceptions are defined as attributes of the :class:`IMAP4` class: @@ -78,7 +83,7 @@ There's also a subclass for secure connections: .. class:: IMAP4_SSL(host='', port=IMAP4_SSL_PORT, keyfile=None, \ - certfile=None, ssl_context=None) + certfile=None, ssl_context=None, timeout=None) This is a subclass derived from :class:`IMAP4` that connects over an SSL encrypted socket (to use this class you need a socket module that was compiled @@ -95,8 +100,12 @@ There's also a subclass for secure connections: mutually exclusive with *ssl_context*, a :class:`ValueError` is raised if *keyfile*/*certfile* is provided along with *ssl_context*. + The optional *timeout* parameter specifies a timeout in seconds for the + connection attempt. If timeout is not given or is None, the global default + socket timeout is used. + .. versionchanged:: 3.3 - *ssl_context* parameter added. + *ssl_context* parameter was added. .. versionchanged:: 3.4 The class now supports hostname check with @@ -110,6 +119,8 @@ There's also a subclass for secure connections: :func:`ssl.create_default_context` select the system's trusted CA certificates for you. + .. versionchanged:: 3.9 + The optional *timeout* parameter was added. The second subclass allows for connections created by a child process: @@ -132,7 +143,7 @@ The following utility functions are defined: .. function:: Int2AP(num) - Converts an integer into a string representation using characters from the set + Converts an integer into a bytes representation using characters from the set [``A`` .. ``P``]. @@ -163,9 +174,9 @@ example of usage. .. seealso:: - Documents describing the protocol, and sources and binaries for servers - implementing it, can all be found at the University of Washington's *IMAP - Information Center* (https://www.washington.edu/imap/). + Documents describing the protocol, sources for servers + implementing it, by the University of Washington's IMAP Information Center + can all be found at (**Source Code**) https://github.com/uw-imap/imap (**Not Maintained**). .. _imap4-objects: @@ -186,7 +197,7 @@ you want to avoid having an argument string quoted (eg: the *flags* argument to Each command returns a tuple: ``(type, [data, ...])`` where *type* is usually ``'OK'`` or ``'NO'``, and *data* is either the text from the command response, -or mandated results from the command. Each *data* is either a string, or a +or mandated results from the command. Each *data* is either a ``bytes``, or a tuple. If a tuple, then the first part is the header of the response, and the second part contains the data (ie: 'literal' value). @@ -353,16 +364,22 @@ An :class:`IMAP4` instance has the following methods: Send ``NOOP`` to server. -.. method:: IMAP4.open(host, port) +.. method:: IMAP4.open(host, port, timeout=None) - Opens socket to *port* at *host*. This method is implicitly called by - the :class:`IMAP4` constructor. The connection objects established by this - method will be used in the :meth:`IMAP4.read`, :meth:`IMAP4.readline`, - :meth:`IMAP4.send`, and :meth:`IMAP4.shutdown` methods. You may override - this method. + Opens socket to *port* at *host*. The optional *timeout* parameter + specifies a timeout in seconds for the connection attempt. + If timeout is not given or is None, the global default socket timeout + is used. Also note that if the *timeout* parameter is set to be zero, + it will raise a :class:`ValueError` to reject creating a non-blocking socket. + This method is implicitly called by the :class:`IMAP4` constructor. + The connection objects established by this method will be used in + the :meth:`IMAP4.read`, :meth:`IMAP4.readline`, :meth:`IMAP4.send`, + and :meth:`IMAP4.shutdown` methods. You may override this method. .. audit-event:: imaplib.open self,host,port imaplib.IMAP4.open + .. versionchanged:: 3.9 + The *timeout* parameter was added. .. method:: IMAP4.partial(message_num, message_part, start, length) @@ -565,6 +582,15 @@ An :class:`IMAP4` instance has the following methods: Unsubscribe from old mailbox. +.. method:: IMAP4.unselect() + + :meth:`imaplib.IMAP4.unselect` frees server's resources associated with the + selected mailbox and returns the server to the authenticated + state. This command performs the same actions as :meth:`imaplib.IMAP4.close`, except + that no messages are permanently removed from the currently + selected mailbox. + + .. versionadded:: 3.9 .. method:: IMAP4.xatom(name[, ...]) diff --git a/Doc/library/importlib.metadata.rst b/Doc/library/importlib.metadata.rst index dc6b66ca384d0423ea91350d7e7259641a4419d1..0dd3daaa54892bab4f560de775e2660551750dfa 100644 --- a/Doc/library/importlib.metadata.rst +++ b/Doc/library/importlib.metadata.rst @@ -1,8 +1,8 @@ .. _using: -========================== - Using importlib.metadata -========================== +================================= + Using :mod:`!importlib.metadata` +================================= .. note:: This functionality is provisional and may deviate from the usual @@ -12,8 +12,8 @@ package metadata. Built in part on Python's import system, this library intends to replace similar functionality in the `entry point API`_ and `metadata API`_ of ``pkg_resources``. Along with -``importlib.resources`` in `Python 3.7 -and newer`_ (backported as `importlib_resources`_ for older versions of +:mod:`importlib.resources` in Python 3.7 +and newer (backported as `importlib_resources`_ for older versions of Python), this can eliminate the need to use the older and less efficient ``pkg_resources`` package. @@ -21,9 +21,9 @@ By "installed package" we generally mean a third-party package installed into Python's ``site-packages`` directory via tools such as `pip `_. Specifically, it means a package with either a discoverable ``dist-info`` or ``egg-info`` -directory, and metadata defined by `PEP 566`_ or its older specifications. +directory, and metadata defined by :pep:`566` or its older specifications. By default, package metadata can live on the file system or in zip archives on -``sys.path``. Through an extension mechanism, the metadata can live almost +:data:`sys.path`. Through an extension mechanism, the metadata can live almost anywhere. @@ -77,7 +77,9 @@ Entry points The ``entry_points()`` function returns a dictionary of all entry points, keyed by group. Entry points are represented by ``EntryPoint`` instances; each ``EntryPoint`` has a ``.name``, ``.group``, and ``.value`` attributes and -a ``.load()`` method to resolve the value. +a ``.load()`` method to resolve the value. There are also ``.module``, +``.attr``, and ``.extras`` attributes for getting the components of the +``.value`` attribute:: >>> eps = entry_points() # doctest: +SKIP >>> list(eps) # doctest: +SKIP @@ -86,6 +88,12 @@ a ``.load()`` method to resolve the value. >>> wheel = [ep for ep in scripts if ep.name == 'wheel'][0] # doctest: +SKIP >>> wheel # doctest: +SKIP EntryPoint(name='wheel', value='wheel.cli:main', group='console_scripts') + >>> wheel.module # doctest: +SKIP + 'wheel.cli' + >>> wheel.attr # doctest: +SKIP + 'main' + >>> wheel.extras # doctest: +SKIP + [] >>> main = wheel.load() # doctest: +SKIP >>> main # doctest: +SKIP @@ -94,7 +102,7 @@ The ``group`` and ``name`` are arbitrary values defined by the package author and usually a client will wish to resolve all entry points for a particular group. Read `the setuptools docs `_ -for more information on entrypoints, their definition, and usage. +for more information on entry points, their definition, and usage. .. _metadata: @@ -134,7 +142,7 @@ Distribution files You can also get the full set of files contained within a distribution. The ``files()`` function takes a distribution package name and returns all of the files installed by this distribution. Each file object returned is a -``PackagePath``, a `pathlib.Path`_ derived object with additional ``dist``, +``PackagePath``, a :class:`pathlib.Path` derived object with additional ``dist``, ``size``, and ``hash`` properties as indicated by the metadata. For example:: >>> util = [p for p in files('wheel') if 'util.py' in str(p)][0] # doctest: +SKIP @@ -198,23 +206,23 @@ Thus, an alternative way to get the version number is through the There are all kinds of additional metadata available on the ``Distribution`` instance:: - >>> d.metadata['Requires-Python'] # doctest: +SKIP + >>> dist.metadata['Requires-Python'] # doctest: +SKIP '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*' - >>> d.metadata['License'] # doctest: +SKIP + >>> dist.metadata['License'] # doctest: +SKIP 'MIT' -The full set of available metadata is not described here. See `PEP 566 -`_ for additional details. +The full set of available metadata is not described here. See :pep:`566` +for additional details. Extending the search algorithm ============================== -Because package metadata is not available through ``sys.path`` searches, or +Because package metadata is not available through :data:`sys.path` searches, or package loaders directly, the metadata for a package is found through import -system `finders`_. To find a distribution package's metadata, -``importlib.metadata`` queries the list of `meta path finders`_ on -`sys.meta_path`_. +system :ref:`finders `. To find a distribution package's metadata, +``importlib.metadata`` queries the list of :term:`meta path finders ` on +:data:`sys.meta_path`. The default ``PathFinder`` for Python includes a hook that calls into ``importlib.metadata.MetadataPathFinder`` for finding distributions @@ -224,7 +232,7 @@ The abstract class :py:class:`importlib.abc.MetaPathFinder` defines the interface expected of finders by Python's import system. ``importlib.metadata`` extends this protocol by looking for an optional ``find_distributions`` callable on the finders from -``sys.meta_path`` and presents this extended interface as the +:data:`sys.meta_path` and presents this extended interface as the ``DistributionFinder`` abstract base class, which defines this abstract method:: @@ -235,7 +243,7 @@ method:: """ The ``DistributionFinder.Context`` object provides ``.path`` and ``.name`` -properties indicating the path to search and names to match and may +properties indicating the path to search and name to match and may supply other relevant context. What this means in practice is that to support finding distribution package @@ -247,20 +255,13 @@ a custom finder, return instances of this derived ``Distribution`` in the .. _`entry point API`: https://setuptools.readthedocs.io/en/latest/pkg_resources.html#entry-points .. _`metadata API`: https://setuptools.readthedocs.io/en/latest/pkg_resources.html#metadata-api -.. _`Python 3.7 and newer`: https://docs.python.org/3/library/importlib.html#module-importlib.resources .. _`importlib_resources`: https://importlib-resources.readthedocs.io/en/latest/index.html -.. _`PEP 566`: https://www.python.org/dev/peps/pep-0566/ -.. _`finders`: https://docs.python.org/3/reference/import.html#finders-and-loaders -.. _`meta path finders`: https://docs.python.org/3/glossary.html#term-meta-path-finder -.. _`sys.meta_path`: https://docs.python.org/3/library/sys.html#sys.meta_path -.. _`pathlib.Path`: https://docs.python.org/3/library/pathlib.html#pathlib.Path .. rubric:: Footnotes .. [#f1] Technically, the returned distribution metadata object is an - `email.message.Message - `_ + :class:`email.message.EmailMessage` instance, but this is an implementation detail, and not part of the stable API. You should only use dictionary-like methods and syntax to access the metadata contents. diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst index 2de10435904aa1c3fc0b338d9d96e44e6310562f..cb2a5686a95a50023a4ccee8d570a26ab516694a 100644 --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -438,8 +438,9 @@ ABC hierarchy:: package. This attribute is not set on modules. - :attr:`__package__` - The parent package for the module/package. If the module is - top-level then it has a value of the empty string. The + The fully-qualified name of the package under which the module was + loaded as a submodule (or the empty string for top-level modules). + For packages, it is the same as :attr:`__name__`. The :func:`importlib.util.module_for_loader` decorator can handle the details for :attr:`__package__`. @@ -480,6 +481,8 @@ ABC hierarchy:: .. class:: ResourceReader + *Superseded by TraversableReader* + An :term:`abstract base class` to provide the ability to read *resources*. @@ -795,6 +798,25 @@ ABC hierarchy:: itself does not end in ``__init__``. +.. class:: Traversable + + An object with a subset of pathlib.Path methods suitable for + traversing directories and opening files. + + .. versionadded:: 3.9 + + +.. class:: TraversableReader + + An abstract base class for resource readers capable of serving + the ``files`` interface. Subclasses ResourceReader and provides + concrete implementations of the ResourceReader's abstract + methods. Therefore, any loader supplying TraversableReader + also supplies ResourceReader. + + .. versionadded:: 3.9 + + :mod:`importlib.resources` -- Resources --------------------------------------- @@ -853,6 +875,19 @@ The following types are defined. The following functions are available. + +.. function:: files(package) + + Returns an :class:`importlib.resources.abc.Traversable` object + representing the resource container for the package (think directory) + and its resources (think files). A Traversable may contain other + containers (think subdirectories). + + *package* is either a name or a module object which conforms to the + ``Package`` requirements. + + .. versionadded:: 3.9 + .. function:: open_binary(package, resource) Open for binary reading the *resource* within *package*. @@ -1036,7 +1071,7 @@ find and load modules. .. class:: WindowsRegistryFinder - :term:`Finder` for modules declared in the Windows registry. This class + :term:`Finder ` for modules declared in the Windows registry. This class implements the :class:`importlib.abc.MetaPathFinder` ABC. Only class methods are defined by this class to alleviate the need for @@ -1051,7 +1086,7 @@ find and load modules. .. class:: PathFinder - A :term:`Finder` for :data:`sys.path` and package ``__path__`` attributes. + A :term:`Finder ` for :data:`sys.path` and package ``__path__`` attributes. This class implements the :class:`importlib.abc.MetaPathFinder` ABC. Only class methods are defined by this class to alleviate the need for @@ -1100,7 +1135,7 @@ find and load modules. directory for ``''`` (i.e. the empty string). -.. class:: FileFinder(path, \*loader_details) +.. class:: FileFinder(path, *loader_details) A concrete implementation of :class:`importlib.abc.PathEntryFinder` which caches results from the file system. @@ -1143,7 +1178,7 @@ find and load modules. Clear out the internal cache. - .. classmethod:: path_hook(\*loader_details) + .. classmethod:: path_hook(*loader_details) A class method which returns a closure for use on :attr:`sys.path_hooks`. An instance of :class:`FileFinder` is returned by the closure using the @@ -1310,8 +1345,8 @@ find and load modules. (``__loader__``) - The loader to use for loading. For namespace packages this should be - set to ``None``. + The :term:`Loader ` that should be used when loading + the module. :term:`Finders ` should always set this. .. attribute:: origin @@ -1344,8 +1379,9 @@ find and load modules. (``__package__``) - (Read-only) Fully-qualified name of the package to which the module - belongs as a submodule (or ``None``). + (Read-only) The fully-qualified name of the package under which the module + should be loaded as a submodule (or the empty string for top-level modules). + For packages, it is the same as :attr:`__name__`. .. attribute:: has_location @@ -1437,16 +1473,21 @@ an :term:`importer`. If **name** has no leading dots, then **name** is simply returned. This allows for usage such as - ``importlib.util.resolve_name('sys', __package__)`` without doing a + ``importlib.util.resolve_name('sys', __spec__.parent)`` without doing a check to see if the **package** argument is needed. - :exc:`ValueError` is raised if **name** is a relative module name but - package is a false value (e.g. ``None`` or the empty string). - :exc:`ValueError` is also raised a relative name would escape its containing + :exc:`ImportError` is raised if **name** is a relative module name but + **package** is a false value (e.g. ``None`` or the empty string). + :exc:`ImportError` is also raised a relative name would escape its containing package (e.g. requesting ``..bacon`` from within the ``spam`` package). .. versionadded:: 3.3 + .. versionchanged:: 3.9 + To improve consistency with import statements, raise + :exc:`ImportError` instead of :exc:`ValueError` for invalid relative + import attempts. + .. function:: find_spec(name, package=None) Find the :term:`spec ` for a module, optionally relative to diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index bab2c41e4e2242a24ac9544eb08a320dc8af9648..b53a9421fbca612b0f3ab729e4a8a02197adc028 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -556,7 +556,7 @@ The Signature object represents the call signature of a callable object and its return annotation. To retrieve a Signature object, use the :func:`signature` function. -.. function:: signature(callable, \*, follow_wrapped=True) +.. function:: signature(callable, *, follow_wrapped=True) Return a :class:`Signature` object for the given ``callable``:: @@ -597,7 +597,7 @@ function. C provide no metadata about their arguments. -.. class:: Signature(parameters=None, \*, return_annotation=Signature.empty) +.. class:: Signature(parameters=None, *, return_annotation=Signature.empty) A Signature object represents the call signature of a function and its return annotation. For each parameter accepted by the function it stores a @@ -668,7 +668,7 @@ function. >>> str(new_sig) "(a, b) -> 'new return anno'" - .. classmethod:: Signature.from_callable(obj, \*, follow_wrapped=True) + .. classmethod:: Signature.from_callable(obj, *, follow_wrapped=True) Return a :class:`Signature` (or its subclass) object for a given callable ``obj``. Pass ``follow_wrapped=False`` to get a signature of ``obj`` @@ -684,7 +684,7 @@ function. .. versionadded:: 3.5 -.. class:: Parameter(name, kind, \*, default=Parameter.empty, annotation=Parameter.empty) +.. class:: Parameter(name, kind, *, default=Parameter.empty, annotation=Parameter.empty) Parameter objects are *immutable*. Instead of modifying a Parameter object, you can use :meth:`Parameter.replace` to create a modified copy. @@ -821,10 +821,9 @@ function. .. attribute:: BoundArguments.arguments - An ordered, mutable mapping (:class:`collections.OrderedDict`) of - parameters' names to arguments' values. Contains only explicitly bound - arguments. Changes in :attr:`arguments` will reflect in :attr:`args` and - :attr:`kwargs`. + A mutable mapping of parameters' names to arguments' values. + Contains only explicitly bound arguments. Changes in :attr:`arguments` + will reflect in :attr:`args` and :attr:`kwargs`. Should be used in conjunction with :attr:`Signature.parameters` for any argument processing purposes. @@ -836,6 +835,10 @@ function. However, if needed, use :meth:`BoundArguments.apply_defaults` to add them. + .. versionchanged:: 3.9 + :attr:`arguments` is now of type :class:`dict`. Formerly, it was of + type :class:`collections.OrderedDict`. + .. attribute:: BoundArguments.args A tuple of positional arguments values. Dynamically computed from the @@ -866,7 +869,7 @@ function. >>> ba = inspect.signature(foo).bind('spam') >>> ba.apply_defaults() >>> ba.arguments - OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())]) + {'a': 'spam', 'b': 'ham', 'args': ()} .. versionadded:: 3.5 diff --git a/Doc/library/io.rst b/Doc/library/io.rst index 32151a0ace458e2b4647942e6d0a02d513ae0a69..aecbec56866d73d1127e0ac3d7c659d5c4a56dba 100644 --- a/Doc/library/io.rst +++ b/Doc/library/io.rst @@ -196,18 +196,18 @@ The :class:`RawIOBase` ABC extends :class:`IOBase`. It deals with the reading and writing of bytes to a stream. :class:`FileIO` subclasses :class:`RawIOBase` to provide an interface to files in the machine's file system. -The :class:`BufferedIOBase` ABC deals with buffering on a raw byte stream -(:class:`RawIOBase`). Its subclasses, :class:`BufferedWriter`, -:class:`BufferedReader`, and :class:`BufferedRWPair` buffer streams that are -readable, writable, and both readable and writable. :class:`BufferedRandom` -provides a buffered interface to random access streams. Another -:class:`BufferedIOBase` subclass, :class:`BytesIO`, is a stream of in-memory -bytes. - -The :class:`TextIOBase` ABC, another subclass of :class:`IOBase`, deals with +The :class:`BufferedIOBase` ABC extends :class:`IOBase`. It deals with +buffering on a raw binary stream (:class:`RawIOBase`). Its subclasses, +:class:`BufferedWriter`, :class:`BufferedReader`, and :class:`BufferedRWPair` +buffer raw binary streams that are readable, writable, and both readable and writable, +respectively. :class:`BufferedRandom` provides a buffered interface to seekable streams. +Another :class:`BufferedIOBase` subclass, :class:`BytesIO`, is a stream of +in-memory bytes. + +The :class:`TextIOBase` ABC extends :class:`IOBase`. It deals with streams whose bytes represent text, and handles encoding and decoding to and -from strings. :class:`TextIOWrapper`, which extends it, is a buffered text -interface to a buffered raw stream (:class:`BufferedIOBase`). Finally, +from strings. :class:`TextIOWrapper`, which extends :class:`TextIOBase`, is a buffered text +interface to a buffered raw stream (:class:`BufferedIOBase`). Finally, :class:`StringIO` is an in-memory stream for text. Argument names are not part of the specification, and only the arguments of @@ -392,15 +392,16 @@ I/O Base Classes .. class:: RawIOBase - Base class for raw binary I/O. It inherits :class:`IOBase`. There is no + Base class for raw binary streams. It inherits :class:`IOBase`. There is no public constructor. - Raw binary I/O typically provides low-level access to an underlying OS - device or API, and does not try to encapsulate it in high-level primitives - (this is left to Buffered I/O and Text I/O, described later in this page). + Raw binary streams typically provide low-level access to an underlying OS + device or API, and do not try to encapsulate it in high-level primitives + (this functionality is done at a higher-level in buffered binary streams and text streams, described later + in this page). - In addition to the attributes and methods from :class:`IOBase`, - :class:`RawIOBase` provides the following methods: + :class:`RawIOBase` provides these methods in addition to those from + :class:`IOBase`: .. method:: read(size=-1) @@ -464,8 +465,8 @@ I/O Base Classes :class:`RawIOBase` implementation, but wrap one, like :class:`BufferedWriter` and :class:`BufferedReader` do. - :class:`BufferedIOBase` provides or overrides these methods and attribute in - addition to those from :class:`IOBase`: + :class:`BufferedIOBase` provides or overrides these data attributes and + methods in addition to those from :class:`IOBase`: .. attribute:: raw @@ -558,9 +559,8 @@ Raw File I/O .. class:: FileIO(name, mode='r', closefd=True, opener=None) - :class:`FileIO` represents an OS-level file containing bytes data. - It implements the :class:`RawIOBase` interface (and therefore the - :class:`IOBase` interface, too). + A raw binary stream representing an OS-level file containing bytes data. It + inherits :class:`RawIOBase`. The *name* can be one of two things: @@ -601,9 +601,8 @@ Raw File I/O .. versionchanged:: 3.4 The file is now non-inheritable. - In addition to the attributes and methods from :class:`IOBase` and - :class:`RawIOBase`, :class:`FileIO` provides the following data - attributes: + :class:`FileIO` provides these data attributes in addition to those from + :class:`RawIOBase` and :class:`IOBase`: .. attribute:: mode @@ -623,7 +622,7 @@ than raw I/O does. .. class:: BytesIO([initial_bytes]) - A stream implementation using an in-memory bytes buffer. It inherits + A binary stream using an in-memory bytes buffer. It inherits :class:`BufferedIOBase`. The buffer is discarded when the :meth:`~IOBase.close` method is called. @@ -671,8 +670,10 @@ than raw I/O does. .. class:: BufferedReader(raw, buffer_size=DEFAULT_BUFFER_SIZE) - A buffer providing higher-level access to a readable, sequential - :class:`RawIOBase` object. It inherits :class:`BufferedIOBase`. + A buffered binary stream providing higher-level access to a readable, non + seekable :class:`RawIOBase` raw binary stream. It inherits + :class:`BufferedIOBase`. + When reading data from this object, a larger amount of data may be requested from the underlying raw stream, and kept in an internal buffer. The buffered data can then be returned directly on subsequent reads. @@ -707,8 +708,10 @@ than raw I/O does. .. class:: BufferedWriter(raw, buffer_size=DEFAULT_BUFFER_SIZE) - A buffer providing higher-level access to a writeable, sequential - :class:`RawIOBase` object. It inherits :class:`BufferedIOBase`. + A buffered binary stream providing higher-level access to a writeable, non + seekable :class:`RawIOBase` raw binary stream. It inherits + :class:`BufferedIOBase`. + When writing to this object, data is normally placed into an internal buffer. The buffer will be written out to the underlying :class:`RawIOBase` object under various conditions, including: @@ -740,8 +743,9 @@ than raw I/O does. .. class:: BufferedRandom(raw, buffer_size=DEFAULT_BUFFER_SIZE) - A buffered interface to random access streams. It inherits - :class:`BufferedReader` and :class:`BufferedWriter`. + A buffered binary stream providing higher-level access to a seekable + :class:`RawIOBase` raw binary stream. It inherits :class:`BufferedReader` + and :class:`BufferedWriter`. The constructor creates a reader and writer for a seekable raw stream, given in the first argument. If the *buffer_size* is omitted it defaults to @@ -754,9 +758,9 @@ than raw I/O does. .. class:: BufferedRWPair(reader, writer, buffer_size=DEFAULT_BUFFER_SIZE) - A buffered I/O object combining two unidirectional :class:`RawIOBase` - objects -- one readable, the other writeable -- into a single bidirectional - endpoint. It inherits :class:`BufferedIOBase`. + A buffered binary stream providing higher-level access to two non seekable + :class:`RawIOBase` raw binary streams---one readable, the other writeable. + It inherits :class:`BufferedIOBase`. *reader* and *writer* are :class:`RawIOBase` objects that are readable and writeable respectively. If the *buffer_size* is omitted it defaults to @@ -779,8 +783,8 @@ Text I/O .. class:: TextIOBase Base class for text streams. This class provides a character and line based - interface to stream I/O. It inherits :class:`IOBase`. - There is no public constructor. + interface to stream I/O. It inherits :class:`IOBase`. There is no public + constructor. :class:`TextIOBase` provides or overrides these data attributes and methods in addition to those from :class:`IOBase`: @@ -868,8 +872,9 @@ Text I/O .. class:: TextIOWrapper(buffer, encoding=None, errors=None, newline=None, \ line_buffering=False, write_through=False) - A buffered text stream over a :class:`BufferedIOBase` binary stream. - It inherits :class:`TextIOBase`. + A buffered text stream providing higher-level access to a + :class:`BufferedIOBase` buffered binary stream. It inherits + :class:`TextIOBase`. *encoding* gives the name of the encoding that the stream will be decoded or encoded with. It defaults to @@ -897,11 +902,11 @@ Text I/O * When reading input from the stream, if *newline* is ``None``, :term:`universal newlines` mode is enabled. Lines in the input can end in ``'\n'``, ``'\r'``, or ``'\r\n'``, and these are translated into ``'\n'`` - before being returned to the caller. If it is ``''``, universal newlines - mode is enabled, but line endings are returned to the caller untranslated. - If it has any of the other legal values, input lines are only terminated - by the given string, and the line ending is returned to the caller - untranslated. + before being returned to the caller. If *newline* is ``''``, universal + newlines mode is enabled, but line endings are returned to the caller + untranslated. If *newline* has any of the other legal values, input lines + are only terminated by the given string, and the line ending is returned to + the caller untranslated. * When writing output to the stream, if *newline* is ``None``, any ``'\n'`` characters written are translated to the system default line separator, @@ -925,8 +930,8 @@ Text I/O locale encoding using :func:`locale.setlocale`, use the current locale encoding instead of the user preferred encoding. - :class:`TextIOWrapper` provides these members in addition to those of - :class:`TextIOBase` and its parents: + :class:`TextIOWrapper` provides these data attributes and methods in + addition to those from :class:`TextIOBase` and :class:`IOBase`: .. attribute:: line_buffering @@ -961,22 +966,23 @@ Text I/O .. class:: StringIO(initial_value='', newline='\\n') - An in-memory stream for text I/O. The text buffer is discarded when the - :meth:`~IOBase.close` method is called. + A text stream using an in-memory text buffer. It inherits + :class:`TextIOBase`. + + The text buffer is discarded when the :meth:`~IOBase.close` method is + called. The initial value of the buffer can be set by providing *initial_value*. If newline translation is enabled, newlines will be encoded as if by :meth:`~TextIOBase.write`. The stream is positioned at the start of the buffer. - The *newline* argument works like that of :class:`TextIOWrapper`. - The default is to consider only ``\n`` characters as ends of lines and - to do no newline translation. If *newline* is set to ``None``, - newlines are written as ``\n`` on all platforms, but universal - newline decoding is still performed when reading. + The *newline* argument works like that of :class:`TextIOWrapper`, + except that when writing output to the stream, if *newline* is ``None``, + newlines are written as ``\n`` on all platforms. :class:`StringIO` provides this method in addition to those from - :class:`TextIOBase` and its parents: + :class:`TextIOBase` and :class:`IOBase`: .. method:: getvalue() @@ -1067,5 +1073,5 @@ buffered object. The above implicitly extends to text files, since the :func:`open()` function will wrap a buffered object inside a :class:`TextIOWrapper`. This includes -standard streams and therefore affects the built-in function :func:`print()` as +standard streams and therefore affects the built-in :func:`print()` function as well. diff --git a/Doc/library/ipaddress.rst b/Doc/library/ipaddress.rst index 140401d2f36739ebfe083e09103a95b7f31a51b6..d6d1f1e362137bd78f4e002b59e2554797db2a15 100644 --- a/Doc/library/ipaddress.rst +++ b/Doc/library/ipaddress.rst @@ -202,6 +202,32 @@ write code that handles both IP versions correctly. Address objects are .. _iana-ipv4-special-registry: https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml .. _iana-ipv6-special-registry: https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml +.. method:: IPv4Address.__format__(fmt) + + Returns a string representation of the IP address, controlled by + an explicit format string. + *fmt* can be one of the following: ``'s'``, the default option, + equivalent to :func:`str`, ``'b'`` for a zero-padded binary string, + ``'X'`` or ``'x'`` for an uppercase or lowercase hexadecimal + representation, or ``'n'``, which is equivalent to ``'b'`` for IPv4 + addresses and ``'x'`` for IPv6. For binary and hexadecimal + representations, the form specifier ``'#'`` and the grouping option + ``'_'`` are available. ``__format__`` is used by ``format``, ``str.format`` + and f-strings. + + >>> format(ipaddress.IPv4Address('192.168.0.1')) + '192.168.0.1' + >>> '{:#b}'.format(ipaddress.IPv4Address('192.168.0.1')) + '0b11000000101010000000000000000001' + >>> f'{ipaddress.IPv6Address("2001:db8::1000"):s}' + '2001:db8::1000' + >>> format(ipaddress.IPv6Address('2001:db8::1000'), '_X') + '2001_0DB8_0000_0000_0000_0000_0000_1000' + >>> '{:#_n}'.format(ipaddress.IPv6Address('2001:db8::1000')) + '0x2001_0db8_0000_0000_0000_0000_0000_1000' + + .. versionadded:: 3.9 + .. class:: IPv6Address(address) @@ -217,11 +243,20 @@ write code that handles both IP versions correctly. Address objects are :RFC:`4291` for details. For example, ``"0000:0000:0000:0000:0000:0abc:0007:0def"`` can be compressed to ``"::abc:7:def"``. + + Optionally, the string may also have a scope zone ID, expressed + with a suffix ``%scope_id``. If present, the scope ID must be non-empty, + and may not contain ``%``. + See :RFC:`4007` for details. + For example, ``fe80::1234%1`` might identify address ``fe80::1234`` on the first link of the node. 2. An integer that fits into 128 bits. 3. An integer packed into a :class:`bytes` object of length 16, big-endian. + >>> ipaddress.IPv6Address('2001:db8::1000') IPv6Address('2001:db8::1000') + >>> ipaddress.IPv6Address('ff02::5678%1') + IPv6Address('ff02::5678%1') .. attribute:: compressed @@ -237,8 +272,8 @@ write code that handles both IP versions correctly. Address objects are groups consisting entirely of zeroes included. - For the following attributes, see the corresponding documentation of the - :class:`IPv4Address` class: + For the following attributes and methods, see the corresponding + documentation of the :class:`IPv4Address` class: .. attribute:: packed .. attribute:: reverse_pointer @@ -268,6 +303,12 @@ write code that handles both IP versions correctly. Address objects are ``::FFFF/96``), this property will report the embedded IPv4 address. For any other address, this property will be ``None``. + .. attribute:: scope_id + + For scoped addresses as defined by :RFC:`4007`, this property identifies + the particular zone of the address's scope that the address belongs to, + as a string. When no scope zone is specified, this property will be ``None``. + .. attribute:: sixtofour For addresses that appear to be 6to4 addresses (starting with @@ -282,6 +323,12 @@ write code that handles both IP versions correctly. Address objects are the embedded ``(server, client)`` IP address pair. For any other address, this property will be ``None``. +.. method:: IPv6Address.__format__(fmt) + + Refer to the corresponding method documentation in + :class:`IPv4Address`. + + .. versionadded:: 3.9 Conversion to Strings and Integers ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -299,6 +346,8 @@ the :func:`str` and :func:`int` builtin functions:: >>> int(ipaddress.IPv6Address('::1')) 1 +Note that IPv6 scoped addresses are converted to integers without scope zone ID. + Operators ^^^^^^^^^ @@ -311,8 +360,9 @@ IPv6). Comparison operators """""""""""""""""""" -Address objects can be compared with the usual set of comparison operators. Some -examples:: +Address objects can be compared with the usual set of comparison operators. +Same IPv6 addresses with different scope zone IDs are not equal. +Some examples:: >>> IPv4Address('127.0.0.2') > IPv4Address('127.0.0.1') True @@ -320,6 +370,10 @@ examples:: False >>> IPv4Address('127.0.0.2') != IPv4Address('127.0.0.1') True + >>> IPv6Address('fe80::1234') == IPv6Address('fe80::1234%1') + False + >>> IPv6Address('fe80::1234%1') != IPv6Address('fe80::1234%2') + True Arithmetic operators @@ -487,7 +541,8 @@ dictionaries. hosts are all the IP addresses that belong to the network, except the network address itself and the network broadcast address. For networks with a mask length of 31, the network address and network broadcast - address are also included in the result. + address are also included in the result. Networks with a mask of 32 + will return a list containing the single host address. >>> list(ip_network('192.0.2.0/29').hosts()) #doctest: +NORMALIZE_WHITESPACE [IPv4Address('192.0.2.1'), IPv4Address('192.0.2.2'), @@ -495,6 +550,8 @@ dictionaries. IPv4Address('192.0.2.5'), IPv4Address('192.0.2.6')] >>> list(ip_network('192.0.2.0/31').hosts()) [IPv4Address('192.0.2.0'), IPv4Address('192.0.2.1')] + >>> list(ip_network('192.0.2.1/32').hosts()) + [IPv4Address('192.0.2.1')] .. method:: overlaps(other) @@ -656,6 +713,8 @@ dictionaries. hosts are all the IP addresses that belong to the network, except the Subnet-Router anycast address. For networks with a mask length of 127, the Subnet-Router anycast address is also included in the result. + Networks with a mask of 128 will return a list containing the + single host address. .. method:: overlaps(other) .. method:: address_exclude(network) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 134afbe64b3adb4bf5134353ddc6e81fb15edc63..6da55f8a3f49cf08ffdc3ac64037325b58e8e30f 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -563,6 +563,9 @@ loops that truncate the stream. for prod in result: yield tuple(prod) + Before :func:`product` runs, it completely consumes the input iterables, + keeping pools of values in memory to generate the products. Accordingly, + it is only useful with finite inputs. .. function:: repeat(object[, times]) @@ -752,7 +755,7 @@ which incur interpreter overhead. "Count how many times the predicate is true" return sum(map(pred, iterable)) - def padnone(iterable): + def pad_none(iterable): """Returns the sequence elements and then returns None indefinitely. Useful for emulating the behavior of the built-in map() function. @@ -766,6 +769,18 @@ which incur interpreter overhead. def dotproduct(vec1, vec2): return sum(map(operator.mul, vec1, vec2)) + def convolve(signal, kernel): + # See: https://betterexplained.com/articles/intuitive-convolution/ + # convolve(data, [0.25, 0.25, 0.25, 0.25]) --> Moving average (blur) + # convolve(data, [1, -1]) --> 1st finite difference (1st derivative) + # convolve(data, [1, -2, 1]) --> 2nd finite difference (2nd derivative) + kernel = tuple(kernel)[::-1] + n = len(kernel) + window = collections.deque([0], maxlen=n) * n + for x in chain(signal, repeat(0, n-1)): + window.append(x) + yield sum(map(operator.mul, kernel, window)) + def flatten(list_of_lists): "Flatten one level of nesting" return chain.from_iterable(list_of_lists) @@ -806,7 +821,7 @@ which incur interpreter overhead. nexts = cycle(islice(nexts, num_active)) def partition(pred, iterable): - 'Use a predicate to partition entries into false entries and true entries' + "Use a predicate to partition entries into false entries and true entries" # partition(is_odd, range(10)) --> 0 2 4 6 8 and 1 3 5 7 9 t1, t2 = tee(iterable) return filterfalse(pred, t1), filter(pred, t2) @@ -878,7 +893,7 @@ which incur interpreter overhead. def random_product(*args, repeat=1): "Random selection from itertools.product(*args, **kwds)" pools = [tuple(pool) for pool in args] * repeat - return tuple(random.choice(pool) for pool in pools) + return tuple(map(random.choice, pools)) def random_permutation(iterable, r=None): "Random selection from itertools.permutations(iterable, r)" @@ -897,11 +912,11 @@ which incur interpreter overhead. "Random selection from itertools.combinations_with_replacement(iterable, r)" pool = tuple(iterable) n = len(pool) - indices = sorted(random.randrange(n) for i in range(r)) + indices = sorted(random.choices(range(n), k=r)) return tuple(pool[i] for i in indices) def nth_combination(iterable, r, index): - 'Equivalent to list(combinations(iterable, r))[index]' + "Equivalent to list(combinations(iterable, r))[index]" pool = tuple(iterable) n = len(pool) if r < 0 or r > n: diff --git a/Doc/library/json.rst b/Doc/library/json.rst index 23e39e95f783ef2cf49694b30b688e681f2e8123..e1a246aad6190b7e6cb3f7a664f9f16986e5d3d2 100644 --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -283,19 +283,18 @@ Basic Usage instance containing a JSON document) to a Python object using this :ref:`conversion table `. - The other arguments have the same meaning as in :func:`load`, except - *encoding* which is ignored and deprecated since Python 3.1. + The other arguments have the same meaning as in :func:`load`. If the data being deserialized is not a valid JSON document, a :exc:`JSONDecodeError` will be raised. - .. deprecated-removed:: 3.1 3.9 - *encoding* keyword argument. - .. versionchanged:: 3.6 *s* can now be of type :class:`bytes` or :class:`bytearray`. The input encoding should be UTF-8, UTF-16 or UTF-32. + .. versionchanged:: 3.9 + The keyword argument *encoding* has been removed. + Encoders and Decoders --------------------- @@ -732,12 +731,24 @@ Command line options .. versionadded:: 3.5 +.. cmdoption:: --no-ensure-ascii + + Disable escaping of non-ascii characters, see :func:`json.dumps` for more information. + + .. versionadded:: 3.9 + .. cmdoption:: --json-lines Parse every input line as separate JSON object. .. versionadded:: 3.8 +.. cmdoption:: --indent, --tab, --no-indent, --compact + + Mutually exclusive options for whitespace control. + + .. versionadded:: 3.9 + .. cmdoption:: -h, --help Show the help message. diff --git a/Doc/library/keyword.rst b/Doc/library/keyword.rst index acec45cdcd586e36a3ed65461dc513fd17d808ae..5cae79f5dc9dbce3e0d40da5b2648eed12f38d53 100644 --- a/Doc/library/keyword.rst +++ b/Doc/library/keyword.rst @@ -22,3 +22,19 @@ This module allows a Python program to determine if a string is a Sequence containing all the :ref:`keywords ` defined for the interpreter. If any keywords are defined to only be active when particular :mod:`__future__` statements are in effect, these will be included as well. + + +.. function:: issoftkeyword(s) + + Return ``True`` if *s* is a Python soft :ref:`keyword `. + + .. versionadded:: 3.9 + + +.. data:: softkwlist + + Sequence containing all the soft :ref:`keywords ` defined for the + interpreter. If any soft keywords are defined to only be active when particular + :mod:`__future__` statements are in effect, these will be included as well. + + .. versionadded:: 3.9 diff --git a/Doc/library/logging.config.rst b/Doc/library/logging.config.rst index 683d6ed5e8ba525739db836bb6f6aeca13ee8770..0b5e2fc2a658d5f04175d8ea04db2563b355f659 100644 --- a/Doc/library/logging.config.rst +++ b/Doc/library/logging.config.rst @@ -35,45 +35,45 @@ in :mod:`logging` itself) and defining handlers which are declared either in .. function:: dictConfig(config) - Takes the logging configuration from a dictionary. The contents of - this dictionary are described in :ref:`logging-config-dictschema` - below. - - If an error is encountered during configuration, this function will - raise a :exc:`ValueError`, :exc:`TypeError`, :exc:`AttributeError` - or :exc:`ImportError` with a suitably descriptive message. The - following is a (possibly incomplete) list of conditions which will - raise an error: - - * A ``level`` which is not a string or which is a string not - corresponding to an actual logging level. - * A ``propagate`` value which is not a boolean. - * An id which does not have a corresponding destination. - * A non-existent handler id found during an incremental call. - * An invalid logger name. - * Inability to resolve to an internal or external object. - - Parsing is performed by the :class:`DictConfigurator` class, whose - constructor is passed the dictionary used for configuration, and - has a :meth:`configure` method. The :mod:`logging.config` module - has a callable attribute :attr:`dictConfigClass` - which is initially set to :class:`DictConfigurator`. - You can replace the value of :attr:`dictConfigClass` with a - suitable implementation of your own. - - :func:`dictConfig` calls :attr:`dictConfigClass` passing - the specified dictionary, and then calls the :meth:`configure` method on - the returned object to put the configuration into effect:: - - def dictConfig(config): - dictConfigClass(config).configure() - - For example, a subclass of :class:`DictConfigurator` could call - ``DictConfigurator.__init__()`` in its own :meth:`__init__()`, then - set up custom prefixes which would be usable in the subsequent - :meth:`configure` call. :attr:`dictConfigClass` would be bound to - this new subclass, and then :func:`dictConfig` could be called exactly as - in the default, uncustomized state. + Takes the logging configuration from a dictionary. The contents of + this dictionary are described in :ref:`logging-config-dictschema` + below. + + If an error is encountered during configuration, this function will + raise a :exc:`ValueError`, :exc:`TypeError`, :exc:`AttributeError` + or :exc:`ImportError` with a suitably descriptive message. The + following is a (possibly incomplete) list of conditions which will + raise an error: + + * A ``level`` which is not a string or which is a string not + corresponding to an actual logging level. + * A ``propagate`` value which is not a boolean. + * An id which does not have a corresponding destination. + * A non-existent handler id found during an incremental call. + * An invalid logger name. + * Inability to resolve to an internal or external object. + + Parsing is performed by the :class:`DictConfigurator` class, whose + constructor is passed the dictionary used for configuration, and + has a :meth:`configure` method. The :mod:`logging.config` module + has a callable attribute :attr:`dictConfigClass` + which is initially set to :class:`DictConfigurator`. + You can replace the value of :attr:`dictConfigClass` with a + suitable implementation of your own. + + :func:`dictConfig` calls :attr:`dictConfigClass` passing + the specified dictionary, and then calls the :meth:`configure` method on + the returned object to put the configuration into effect:: + + def dictConfig(config): + dictConfigClass(config).configure() + + For example, a subclass of :class:`DictConfigurator` could call + ``DictConfigurator.__init__()`` in its own :meth:`__init__()`, then + set up custom prefixes which would be usable in the subsequent + :meth:`configure` call. :attr:`dictConfigClass` would be bound to + this new subclass, and then :func:`dictConfig` could be called exactly as + in the default, uncustomized state. .. versionadded:: 3.2 diff --git a/Doc/library/logging.handlers.rst b/Doc/library/logging.handlers.rst index fa0424dcd18f5933599d7fea759997dd932315ad..059ab3d3a34448d41a7ef4ef171b8bc5bc94361e 100644 --- a/Doc/library/logging.handlers.rst +++ b/Doc/library/logging.handlers.rst @@ -48,7 +48,7 @@ and :meth:`flush` methods). .. method:: emit(record) If a formatter is specified, it is used to format the record. The record - is then written to the stream with a terminator. If exception information + is then written to the stream followed by :attr:`terminator`. If exception information is present, it is formatted using :func:`traceback.print_exception` and appended to the stream. @@ -68,15 +68,19 @@ and :meth:`flush` methods). :return: the old stream, if the stream was changed, or *None* if it wasn't. - .. versionadded:: 3.7 + .. versionadded:: 3.7 + .. attribute:: terminator -.. versionchanged:: 3.2 - The ``StreamHandler`` class now has a ``terminator`` attribute, default - value ``'\n'``, which is used as the terminator when writing a formatted - record to a stream. If you don't want this newline termination, you can - set the handler instance's ``terminator`` attribute to the empty string. - In earlier versions, the terminator was hardcoded as ``'\n'``. + String used as the terminator when writing a formatted record to a stream. + Default value is ``'\n'``. + + If you don't want a newline termination, you can set the handler instance's + ``terminator`` attribute to the empty string. + + In earlier versions, the terminator was hardcoded as ``'\n'``. + + .. versionadded:: 3.2 .. _file-handler: @@ -89,23 +93,26 @@ sends logging output to a disk file. It inherits the output functionality from :class:`StreamHandler`. -.. class:: FileHandler(filename, mode='a', encoding=None, delay=False) +.. class:: FileHandler(filename, mode='a', encoding=None, delay=False, errors=None) Returns a new instance of the :class:`FileHandler` class. The specified file is opened and used as the stream for logging. If *mode* is not specified, :const:`'a'` is used. If *encoding* is not ``None``, it is used to open the file with that encoding. If *delay* is true, then file opening is deferred until the - first call to :meth:`emit`. By default, the file grows indefinitely. + first call to :meth:`emit`. By default, the file grows indefinitely. If + *errors* is specified, it's used to determine how encoding errors are handled. .. versionchanged:: 3.6 As well as string values, :class:`~pathlib.Path` objects are also accepted for the *filename* argument. + .. versionchanged:: 3.9 + The *errors* parameter was added. + .. method:: close() Closes the file. - .. method:: emit(record) Outputs the record to the file. @@ -168,18 +175,22 @@ exclusive locks - and so there is no need for such a handler. Furthermore, for this value. -.. class:: WatchedFileHandler(filename, mode='a', encoding=None, delay=False) +.. class:: WatchedFileHandler(filename, mode='a', encoding=None, delay=False, errors=None) Returns a new instance of the :class:`WatchedFileHandler` class. The specified file is opened and used as the stream for logging. If *mode* is not specified, :const:`'a'` is used. If *encoding* is not ``None``, it is used to open the file with that encoding. If *delay* is true, then file opening is deferred until the - first call to :meth:`emit`. By default, the file grows indefinitely. + first call to :meth:`emit`. By default, the file grows indefinitely. If + *errors* is provided, it determines how encoding errors are handled. .. versionchanged:: 3.6 As well as string values, :class:`~pathlib.Path` objects are also accepted for the *filename* argument. + .. versionchanged:: 3.9 + The *errors* parameter was added. + .. method:: reopenIfNeeded() Checks to see if the file has changed. If it has, the existing stream is @@ -205,7 +216,7 @@ module, is the base class for the rotating file handlers, not need to instantiate this class, but it has attributes and methods you may need to override. -.. class:: BaseRotatingHandler(filename, mode, encoding=None, delay=False) +.. class:: BaseRotatingHandler(filename, mode, encoding=None, delay=False, errors=None) The parameters are as for :class:`FileHandler`. The attributes are: @@ -284,13 +295,14 @@ The :class:`RotatingFileHandler` class, located in the :mod:`logging.handlers` module, supports rotation of disk log files. -.. class:: RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False) +.. class:: RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False, errors=None) Returns a new instance of the :class:`RotatingFileHandler` class. The specified file is opened and used as the stream for logging. If *mode* is not specified, ``'a'`` is used. If *encoding* is not ``None``, it is used to open the file with that encoding. If *delay* is true, then file opening is deferred until the - first call to :meth:`emit`. By default, the file grows indefinitely. + first call to :meth:`emit`. By default, the file grows indefinitely. If + *errors* is provided, it determines how encoding errors are handled. You can use the *maxBytes* and *backupCount* values to allow the file to :dfn:`rollover` at a predetermined size. When the size is about to be exceeded, @@ -311,6 +323,9 @@ module, supports rotation of disk log files. As well as string values, :class:`~pathlib.Path` objects are also accepted for the *filename* argument. + .. versionchanged:: 3.9 + The *errors* parameter was added. + .. method:: doRollover() Does a rollover, as described above. @@ -331,7 +346,7 @@ The :class:`TimedRotatingFileHandler` class, located in the timed intervals. -.. class:: TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None) +.. class:: TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None, errors=None) Returns a new instance of the :class:`TimedRotatingFileHandler` class. The specified file is opened and used as the stream for logging. On rotating it also @@ -391,6 +406,9 @@ timed intervals. rollover, and subsequent rollovers would be calculated via the normal interval calculation. + If *errors* is specified, it's used to determine how encoding errors are + handled. + .. note:: Calculation of the initial rollover time is done when the handler is initialised. Calculation of subsequent rollover times is done only when rollover occurs, and rollover occurs only when emitting output. If @@ -411,6 +429,9 @@ timed intervals. As well as string values, :class:`~pathlib.Path` objects are also accepted for the *filename* argument. + .. versionchanged:: 3.9 + The *errors* parameter was added. + .. method:: doRollover() Does a rollover, as described above. diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index 14e7190cbb0fe220025c13ff8da48eb40c8f3254..e63475d3b5a024a27a1b0ac833e7421ee90eae37 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -529,7 +529,7 @@ The useful mapping keys in a :class:`LogRecord` are given in the section on :ref:`logrecord-attributes`. -.. class:: Formatter(fmt=None, datefmt=None, style='%') +.. class:: Formatter(fmt=None, datefmt=None, style='%', validate=True) Returns a new instance of the :class:`Formatter` class. The instance is initialized with a format string for the message as a whole, as well as a @@ -539,8 +539,11 @@ The useful mapping keys in a :class:`LogRecord` are given in the section on The *style* parameter can be one of '%', '{' or '$' and determines how the format string will be merged with its data: using one of %-formatting, - :meth:`str.format` or :class:`string.Template`. See :ref:`formatting-styles` - for more information on using {- and $-formatting for log messages. + :meth:`str.format` or :class:`string.Template`. This only applies to the + format string *fmt* (e.g. ``'%(message)s'`` or ``{message}``), not to the + actual log messages passed to ``Logger.debug`` etc; see + :ref:`formatting-styles` for more information on using {- and $-formatting + for log messages. .. versionchanged:: 3.2 The *style* parameter was added. @@ -605,6 +608,9 @@ The useful mapping keys in a :class:`LogRecord` are given in the section on attributes are ``default_time_format`` (for the strptime format string) and ``default_msec_format`` (for appending the millisecond value). + .. versionchanged:: 3.9 + The ``default_msec_format`` can be ``None``. + .. method:: formatException(exc_info) Formats the specified exception information (a standard exception tuple as @@ -1083,8 +1089,8 @@ functions. suitable value. .. versionchanged:: 3.7 - The *level* parameter was defaulted to level ``CRITICAL``. See Issue - #28524 for more information about this change. + The *level* parameter was defaulted to level ``CRITICAL``. See + :issue:`28524` for more information about this change. .. function:: addLevelName(level, levelName) @@ -1197,6 +1203,21 @@ functions. | | carrying out the configuration as specified | | | by the other arguments. | +--------------+---------------------------------------------+ + | *encoding* | If this keyword argument is specified along | + | | with *filename*, its value is used when the | + | | FileHandler is created, and thus used when | + | | opening the output file. | + +--------------+---------------------------------------------+ + | *errors* | If this keyword argument is specified along | + | | with *filename*, its value is used when the | + | | FileHandler is created, and thus used when | + | | opening the output file. If not specified, | + | | the value 'backslashreplace' is used. Note | + | | that if ``None`` is specified, it will be | + | | passed as such to func:`open`, which means | + | | that it will be treated the same as passing | + | | 'errors'. | + +--------------+---------------------------------------------+ .. versionchanged:: 3.2 The *style* argument was added. @@ -1210,6 +1231,9 @@ functions. .. versionchanged:: 3.8 The *force* argument was added. + .. versionchanged:: 3.9 + The *encoding* and *errors* arguments were added. + .. function:: shutdown() Informs the logging system to perform an orderly shutdown by flushing and diff --git a/Doc/library/lzma.rst b/Doc/library/lzma.rst index 4bfff9c6147ed4c9e00e7b5f7e3a9294b106a986..633c87873cd8ce4c32557616f0919cefd9fd471d 100644 --- a/Doc/library/lzma.rst +++ b/Doc/library/lzma.rst @@ -33,7 +33,7 @@ from multiple threads, it is necessary to protect it with a lock. Reading and writing compressed files ------------------------------------ -.. function:: open(filename, mode="rb", \*, format=None, check=-1, preset=None, filters=None, encoding=None, errors=None, newline=None) +.. function:: open(filename, mode="rb", *, format=None, check=-1, preset=None, filters=None, encoding=None, errors=None, newline=None) Open an LZMA-compressed file in binary or text mode, returning a :term:`file object`. @@ -69,7 +69,7 @@ Reading and writing compressed files Accepts a :term:`path-like object`. -.. class:: LZMAFile(filename=None, mode="r", \*, format=None, check=-1, preset=None, filters=None) +.. class:: LZMAFile(filename=None, mode="r", *, format=None, check=-1, preset=None, filters=None) Open an LZMA-compressed file in binary mode. diff --git a/Doc/library/mailbox.rst b/Doc/library/mailbox.rst index f82a3b200deb7c4d01820376a7d51a72e2c4dc7b..94d95d10290b006c376230beb66ec070798ec375 100644 --- a/Doc/library/mailbox.rst +++ b/Doc/library/mailbox.rst @@ -426,17 +426,14 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. .. seealso:: - `maildir man page from qmail `_ - The original specification of the format. + `maildir man page from Courier `_ + A specification of the format. Describes a common extension for + supporting folders. `Using maildir format `_ Notes on Maildir by its inventor. Includes an updated name-creation scheme and details on "info" semantics. - `maildir man page from Courier `_ - Another specification of the format. Describes a common extension for supporting - folders. - .. _mailbox-mbox: @@ -485,11 +482,8 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF. .. seealso:: - `mbox man page from qmail `_ - A specification of the format and its variations. - `mbox man page from tin `_ - Another specification of the format, with details on locking. + A specification of the format, with details on locking. `Configuring Netscape Mail on Unix: Why The Content-Length Format is Bad `_ An argument for using the original mbox format rather than a variation. diff --git a/Doc/library/math.rst b/Doc/library/math.rst index 776768dd8ee7c69c0a7e86c23fe7d3e741609fec..b20e557b5c6109b514db9acf833f246a1ad0803a 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -71,6 +71,9 @@ Number-theoretic and representation functions Return *x* factorial as an integer. Raises :exc:`ValueError` if *x* is not integral or is negative. + .. deprecated:: 3.9 + Accepting floats with integral values (like ``5.0``) is deprecated. + .. function:: floor(x) @@ -123,15 +126,20 @@ Number-theoretic and representation functions `_\. -.. function:: gcd(a, b) +.. function:: gcd(*integers) - Return the greatest common divisor of the integers *a* and *b*. If either - *a* or *b* is nonzero, then the value of ``gcd(a, b)`` is the largest - positive integer that divides both *a* and *b*. ``gcd(0, 0)`` returns - ``0``. + Return the greatest common divisor of the specified integer arguments. + If any of the arguments is nonzero, then the returned value is the largest + positive integer that is a divisor of all arguments. If all arguments + are zero, then the returned value is ``0``. ``gcd()`` without arguments + returns ``0``. .. versionadded:: 3.5 + .. versionchanged:: 3.9 + Added support for an arbitrary number of arguments. Formerly, only two + arguments were supported. + .. function:: isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0) @@ -198,6 +206,17 @@ Number-theoretic and representation functions .. versionadded:: 3.8 +.. function:: lcm(*integers) + + Return the least common multiple of the specified integer arguments. + If all arguments are nonzero, then the returned value is the smallest + positive integer that is a multiple of all arguments. If any of the arguments + is zero, then the returned value is ``0``. ``lcm()`` without arguments + returns ``1``. + + .. versionadded:: 3.9 + + .. function:: ldexp(x, i) Return ``x * (2**i)``. This is essentially the inverse of function @@ -210,6 +229,23 @@ Number-theoretic and representation functions of *x* and are floats. +.. function:: nextafter(x, y) + + Return the next floating-point value after *x* towards *y*. + + If *x* is equal to *y*, return *y*. + + Examples: + + * ``math.nextafter(x, math.inf)`` goes up: towards positive infinity. + * ``math.nextafter(x, -math.inf)`` goes down: towards minus infinity. + * ``math.nextafter(x, 0.0)`` goes towards zero. + * ``math.nextafter(x, math.copysign(math.inf, x))`` goes away from zero. + + See also :func:`math.ulp`. + + .. versionadded:: 3.9 + .. function:: perm(n, k=None) Return the number of ways to choose *k* items from *n* items @@ -266,6 +302,30 @@ Number-theoretic and representation functions :class:`~numbers.Integral` (usually an integer). Delegates to :meth:`x.__trunc__() `. +.. function:: ulp(x) + + Return the value of the least significant bit of the float *x*: + + * If *x* is a NaN (not a number), return *x*. + * If *x* is negative, return ``ulp(-x)``. + * If *x* is a positive infinity, return *x*. + * If *x* is equal to zero, return the smallest positive + *denormalized* representable float (smaller than the minimum positive + *normalized* float, :data:`sys.float_info.min `). + * If *x* is equal to the largest positive representable float, + return the value of the least significant bit of *x*, such that the first + float smaller than *x* is ``x - ulp(x)``. + * Otherwise (*x* is a positive finite number), return the value of the least + significant bit of *x*, such that the first float bigger than *x* + is ``x + ulp(x)``. + + ULP stands for "Unit in the Last Place". + + See also :func:`math.nextafter` and :data:`sys.float_info.epsilon + `. + + .. versionadded:: 3.9 + Note that :func:`frexp` and :func:`modf` have a different call/return pattern than their C equivalents: they take a single argument and return a pair of @@ -363,17 +423,20 @@ Trigonometric functions .. function:: acos(x) - Return the arc cosine of *x*, in radians. + Return the arc cosine of *x*, in radians. The result is between ``0`` and + ``pi``. .. function:: asin(x) - Return the arc sine of *x*, in radians. + Return the arc sine of *x*, in radians. The result is between ``-pi/2`` and + ``pi/2``. .. function:: atan(x) - Return the arc tangent of *x*, in radians. + Return the arc tangent of *x*, in radians. The result is between ``-pi/2`` and + ``pi/2``. .. function:: atan2(y, x) diff --git a/Doc/library/mmap.rst b/Doc/library/mmap.rst index 12b14d69332d72a08697002b08f44687ba65c2ed..1f3fbc340fc26762227e81044782704a2d299365 100644 --- a/Doc/library/mmap.rst +++ b/Doc/library/mmap.rst @@ -244,7 +244,8 @@ To map anonymous memory, -1 should be passed as the fileno along with the length .. method:: readline() Returns a single line, starting at the current file position and up to the - next newline. + next newline. The file position is updated to point after the bytes that were + returned. .. method:: resize(newsize) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index bb3ee87a4403a047c41c320ec77ead083de0b357..352f48f513df99661fc13621dfbed667023dd64e 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -14,7 +14,8 @@ Introduction :mod:`multiprocessing` is a package that supports spawning processes using an API similar to the :mod:`threading` module. The :mod:`multiprocessing` package offers both local and remote concurrency, effectively side-stepping the -:term:`Global Interpreter Lock` by using subprocesses instead of threads. Due +:term:`Global Interpreter Lock ` by using +subprocesses instead of threads. Due to this, the :mod:`multiprocessing` module allows the programmer to fully leverage multiple processors on a given machine. It runs on both Unix and Windows. @@ -97,7 +98,7 @@ to start a process. These *start methods* are *spawn* The parent process starts a fresh python interpreter process. The child process will only inherit those resources necessary to run - the process objects :meth:`~Process.run` method. In particular, + the process object's :meth:`~Process.run` method. In particular, unnecessary file descriptors and handles from the parent process will not be inherited. Starting a process using this method is rather slow compared to using *fork* or *forkserver*. @@ -878,6 +879,16 @@ For an example of the usage of queues for interprocess communication see It is a simplified :class:`Queue` type, very close to a locked :class:`Pipe`. + .. method:: close() + + Close the queue: release internal resources. + + A queue must not be used anymore after it is closed. For example, + :meth:`get`, :meth:`put` and :meth:`empty` methods must no longer be + called. + + .. versionadded:: 3.9 + .. method:: empty() Return ``True`` if the queue is empty, ``False`` otherwise. @@ -2558,9 +2569,9 @@ Address Formats filesystem. * An ``'AF_PIPE'`` address is a string of the form - :samp:`r'\\\\.\\pipe\\{PipeName}'`. To use :func:`Client` to connect to a named - pipe on a remote computer called *ServerName* one should use an address of the - form :samp:`r'\\\\{ServerName}\\pipe\\{PipeName}'` instead. + :samp:`r'\\\\.\\pipe\\{PipeName}'`. To use :func:`Client` to connect to a named + pipe on a remote computer called *ServerName* one should use an address of the + form :samp:`r'\\\\{ServerName}\\pipe\\{PipeName}'` instead. Note that any string beginning with two backslashes is assumed by default to be an ``'AF_PIPE'`` address rather than an ``'AF_UNIX'`` address. @@ -2650,6 +2661,46 @@ The :mod:`multiprocessing.dummy` module :mod:`multiprocessing.dummy` replicates the API of :mod:`multiprocessing` but is no more than a wrapper around the :mod:`threading` module. +.. currentmodule:: multiprocessing.pool + +In particular, the ``Pool`` function provided by :mod:`multiprocessing.dummy` +returns an instance of :class:`ThreadPool`, which is a subclass of +:class:`Pool` that supports all the same method calls but uses a pool of +worker threads rather than worker processes. + + +.. class:: ThreadPool([processes[, initializer[, initargs]]]) + + A thread pool object which controls a pool of worker threads to which jobs + can be submitted. :class:`ThreadPool` instances are fully interface + compatible with :class:`Pool` instances, and their resources must also be + properly managed, either by using the pool as a context manager or by + calling :meth:`~multiprocessing.pool.Pool.close` and + :meth:`~multiprocessing.pool.Pool.terminate` manually. + + *processes* is the number of worker threads to use. If *processes* is + ``None`` then the number returned by :func:`os.cpu_count` is used. + + If *initializer* is not ``None`` then each worker process will call + ``initializer(*initargs)`` when it starts. + + Unlike :class:`Pool`, *maxtasksperchild* and *context* cannot be provided. + + .. note:: + + A :class:`ThreadPool` shares the same interface as :class:`Pool`, which + is designed around a pool of processes and predates the introduction of + the :class:`concurrent.futures` module. As such, it inherits some + operations that don't make sense for a pool backed by threads, and it + has its own type for representing the status of asynchronous jobs, + :class:`AsyncResult`, that is not understood by any other libraries. + + Users should generally prefer to use + :class:`concurrent.futures.ThreadPoolExecutor`, which has a simpler + interface that was designed around threads from the start, and which + returns :class:`concurrent.futures.Future` instances that are + compatible with many other libraries, including :mod:`asyncio`. + .. _multiprocessing-programming: diff --git a/Doc/library/optparse.rst b/Doc/library/optparse.rst index c1a18e0147431901e724bd0297cfa58f76a3b7dc..b1094198f4c8448bb28a1d2790c5bcaa2aac61ab 100644 --- a/Doc/library/optparse.rst +++ b/Doc/library/optparse.rst @@ -55,7 +55,7 @@ equivalent to the above example:: -q -foutfile -qfoutfile -Additionally, users can run one of :: +Additionally, users can run one of the following :: -h --help diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 77bbf998863459bdc1ec73491ecb770035c3e4d1..9d206f46aebeb2515d3bb1f3e34619ba50c4a7a0 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -111,9 +111,9 @@ process and user. to the environment made after this time are not reflected in ``os.environ``, except for changes made by modifying ``os.environ`` directly. - If the platform supports the :func:`putenv` function, this mapping may be used - to modify the environment as well as query the environment. :func:`putenv` will - be called automatically when the mapping is modified. + This mapping may be used to modify the environment as well as query the + environment. :func:`putenv` will be called automatically when the mapping + is modified. On Unix, keys and values use :func:`sys.getfilesystemencoding` and ``'surrogateescape'`` error handler. Use :data:`environb` if you would like @@ -130,14 +130,13 @@ process and user. cause memory leaks. Refer to the system documentation for :c:func:`putenv`. - If :func:`putenv` is not provided, a modified copy of this mapping may be - passed to the appropriate process-creation functions to cause child processes - to use a modified environment. + You can delete items in this mapping to unset environment variables. + :func:`unsetenv` will be called automatically when an item is deleted from + ``os.environ``, and when one of the :meth:`pop` or :meth:`clear` methods is + called. - If the platform supports the :func:`unsetenv` function, you can delete items in - this mapping to unset environment variables. :func:`unsetenv` will be called - automatically when an item is deleted from ``os.environ``, and when - one of the :meth:`pop` or :meth:`clear` methods is called. + .. versionchanged:: 3.9 + Updated to support :pep:`584`'s merge (``|``) and update (``|=``) operators. .. data:: environb @@ -152,6 +151,9 @@ process and user. .. versionadded:: 3.2 + .. versionchanged:: 3.9 + Updated to support :pep:`584`'s merge (``|``) and update (``|=``) operators. + .. function:: chdir(path) fchdir(fd) @@ -439,20 +441,21 @@ process and user. changes to the environment affect subprocesses started with :func:`os.system`, :func:`popen` or :func:`fork` and :func:`execv`. - .. availability:: most flavors of Unix, Windows. + Assignments to items in ``os.environ`` are automatically translated into + corresponding calls to :func:`putenv`; however, calls to :func:`putenv` + don't update ``os.environ``, so it is actually preferable to assign to items + of ``os.environ``. .. note:: On some platforms, including FreeBSD and Mac OS X, setting ``environ`` may - cause memory leaks. Refer to the system documentation for putenv. - - When :func:`putenv` is supported, assignments to items in ``os.environ`` are - automatically translated into corresponding calls to :func:`putenv`; however, - calls to :func:`putenv` don't update ``os.environ``, so it is actually - preferable to assign to items of ``os.environ``. + cause memory leaks. Refer to the system documentation for :c:func:`putenv`. .. audit-event:: os.putenv key,value os.putenv + .. versionchanged:: 3.9 + The function is now always available. + .. function:: setegid(egid) @@ -640,14 +643,15 @@ process and user. environment affect subprocesses started with :func:`os.system`, :func:`popen` or :func:`fork` and :func:`execv`. - When :func:`unsetenv` is supported, deletion of items in ``os.environ`` is - automatically translated into a corresponding call to :func:`unsetenv`; however, - calls to :func:`unsetenv` don't update ``os.environ``, so it is actually - preferable to delete items of ``os.environ``. + Deletion of items in ``os.environ`` is automatically translated into a + corresponding call to :func:`unsetenv`; however, calls to :func:`unsetenv` + don't update ``os.environ``, so it is actually preferable to delete items of + ``os.environ``. .. audit-event:: os.unsetenv key os.unsetenv - .. availability:: most flavors of Unix. + .. versionchanged:: 3.9 + The function is now always available and is also available on Windows. .. _os-newstreams: @@ -1147,7 +1151,8 @@ or `the MSDN `_ on Windo Combine the functionality of :func:`os.readv` and :func:`os.pread`. .. availability:: Linux 2.6.30 and newer, FreeBSD 6.0 and newer, - OpenBSD 2.7 and newer. Using flags requires Linux 4.6 or newer. + OpenBSD 2.7 and newer, AIX 7.1 and newer. Using flags requires + Linux 4.6 or newer. .. versionadded:: 3.7 @@ -1215,7 +1220,8 @@ or `the MSDN `_ on Windo Combine the functionality of :func:`os.writev` and :func:`os.pwrite`. .. availability:: Linux 2.6.30 and newer, FreeBSD 6.0 and newer, - OpenBSD 2.7 and newer. Using flags requires Linux 4.7 or newer. + OpenBSD 2.7 and newer, AIX 7.1 and newer. Using flags requires + Linux 4.7 or newer. .. versionadded:: 3.7 @@ -1261,27 +1267,27 @@ or `the MSDN `_ on Windo :exc:`InterruptedError` exception (see :pep:`475` for the rationale). -.. function:: sendfile(out, in, offset, count) - sendfile(out, in, offset, count, [headers], [trailers], flags=0) +.. function:: sendfile(out_fd, in_fd, offset, count) + sendfile(out_fd, in_fd, offset, count, headers=(), trailers=(), flags=0) - Copy *count* bytes from file descriptor *in* to file descriptor *out* + Copy *count* bytes from file descriptor *in_fd* to file descriptor *out_fd* starting at *offset*. - Return the number of bytes sent. When EOF is reached return 0. + Return the number of bytes sent. When EOF is reached return ``0``. The first function notation is supported by all platforms that define :func:`sendfile`. On Linux, if *offset* is given as ``None``, the bytes are read from the - current position of *in* and the position of *in* is updated. + current position of *in_fd* and the position of *in_fd* is updated. The second case may be used on Mac OS X and FreeBSD where *headers* and *trailers* are arbitrary sequences of buffers that are written before and - after the data from *in* is written. It returns the same as the first case. + after the data from *in_fd* is written. It returns the same as the first case. - On Mac OS X and FreeBSD, a value of 0 for *count* specifies to send until - the end of *in* is reached. + On Mac OS X and FreeBSD, a value of ``0`` for *count* specifies to send until + the end of *in_fd* is reached. - All platforms support sockets as *out* file descriptor, and some platforms + All platforms support sockets as *out_fd* file descriptor, and some platforms allow other types (e.g. regular file, pipe) as well. Cross-platform applications should not use *headers*, *trailers* and *flags* @@ -1296,6 +1302,9 @@ or `the MSDN `_ on Windo .. versionadded:: 3.3 + .. versionchanged:: 3.9 + Parameters *out* and *in* was renamed to *out_fd* and *in_fd*. + .. function:: set_blocking(fd, blocking) @@ -1828,6 +1837,8 @@ features: Return a list containing the names of the entries in the directory given by *path*. The list is in arbitrary order, and does not include the special entries ``'.'`` and ``'..'`` even if they are present in the directory. + If a file is removed from or added to the directory during the call of + this function, whether a name for that file be included is unspecified. *path* may be a :term:`path-like object`. If *path* is of type ``bytes`` (directly or indirectly through the :class:`PathLike` interface), @@ -1858,7 +1869,7 @@ features: Accepts a :term:`path-like object`. -.. function:: lstat(path, \*, dir_fd=None) +.. function:: lstat(path, *, dir_fd=None) Perform the equivalent of an :c:func:`lstat` system call on the given path. Similar to :func:`~os.stat`, but does not follow symbolic links. Return a @@ -2233,7 +2244,9 @@ features: Return an iterator of :class:`os.DirEntry` objects corresponding to the entries in the directory given by *path*. The entries are yielded in arbitrary order, and the special entries ``'.'`` and ``'..'`` are not - included. + included. If a file is removed from or added to the directory after + creating the iterator, whether an entry for that file be included is + unspecified. Using :func:`scandir` instead of :func:`listdir` can significantly increase the performance of code that also needs file type or file @@ -2363,7 +2376,7 @@ features: On the first, uncached call, a system call is required on Windows but not on Unix. - .. method:: is_dir(\*, follow_symlinks=True) + .. method:: is_dir(*, follow_symlinks=True) Return ``True`` if this entry is a directory or a symbolic link pointing to a directory; return ``False`` if the entry is or points to any other @@ -2387,7 +2400,7 @@ features: This method can raise :exc:`OSError`, such as :exc:`PermissionError`, but :exc:`FileNotFoundError` is caught and not raised. - .. method:: is_file(\*, follow_symlinks=True) + .. method:: is_file(*, follow_symlinks=True) Return ``True`` if this entry is a file or a symbolic link pointing to a file; return ``False`` if the entry is or points to a directory or other @@ -2417,7 +2430,7 @@ features: This method can raise :exc:`OSError`, such as :exc:`PermissionError`, but :exc:`FileNotFoundError` is caught and not raised. - .. method:: stat(\*, follow_symlinks=True) + .. method:: stat(*, follow_symlinks=True) Return a :class:`stat_result` object for this entry. This method follows symbolic links by default; to stat a symbolic link add the @@ -2449,7 +2462,7 @@ features: for :class:`bytes` paths on Windows. -.. function:: stat(path, \*, dir_fd=None, follow_symlinks=True) +.. function:: stat(path, *, dir_fd=None, follow_symlinks=True) Get the status of a file or a file descriptor. Perform the equivalent of a :c:func:`stat` system call on the given path. *path* may be specified as @@ -2983,7 +2996,10 @@ features: *filenames* is a list of the names of the non-directory files in *dirpath*. Note that the names in the lists contain no path components. To get a full path (which begins with *top*) to a file or directory in *dirpath*, do - ``os.path.join(dirpath, name)``. + ``os.path.join(dirpath, name)``. Whether or not the lists are sorted + depends on the file system. If a file is removed from or added to the + *dirpath* directory during generating the lists, whether a name for that + file be included is unspecified. If optional argument *topdown* is ``True`` or not specified, the triple for a directory is generated before the triples for any of its subdirectories @@ -3052,6 +3068,8 @@ features: for name in dirs: os.rmdir(os.path.join(root, name)) + .. audit-event:: os.walk top,topdown,onerror,followlinks os.walk + .. versionchanged:: 3.5 This function now calls :func:`os.scandir` instead of :func:`os.listdir`, making it faster by reducing the number of calls to :func:`os.stat`. @@ -3111,6 +3129,8 @@ features: for name in dirs: os.rmdir(name, dir_fd=rootfd) + .. audit-event:: os.fwalk top,topdown,onerror,follow_symlinks,dir_fd os.fwalk + .. availability:: Unix. .. versionadded:: 3.3 @@ -3614,6 +3634,19 @@ written in Python, such as a mail server's external command delivery program. .. availability:: Unix. +.. function:: pidfd_open(pid, flags=0) + + Return a file descriptor referring to the process *pid*. This descriptor can + be used to perform process management without races and signals. The *flags* + argument is provided for future extensions; no flag values are currently + defined. + + See the :manpage:`pidfd_open(2)` man page for more details. + + .. availability:: Linux 5.3+ + .. versionadded:: 3.9 + + .. function:: plock(op) Lock program segments into memory. The value of *op* (defined in @@ -3641,6 +3674,11 @@ written in Python, such as a mail server's external command delivery program. subprocess was killed.) On Windows systems, the return value contains the signed integer return code from the child process. + On Unix, :func:`waitstatus_to_exitcode` can be used to convert the ``close`` + method result (exit status) into an exit code if it is not ``None``. On + Windows, the ``close`` method result is directly the exit code + (or ``None``). + This is implemented using :class:`subprocess.Popen`; see that class's documentation for more powerful ways to manage and communicate with subprocesses. @@ -3657,8 +3695,8 @@ written in Python, such as a mail server's external command delivery program. The positional-only arguments *path*, *args*, and *env* are similar to :func:`execve`. - The *path* parameter is the path to the executable file.The *path* should - contain a directory.Use :func:`posix_spawnp` to pass an executable file + The *path* parameter is the path to the executable file. The *path* should + contain a directory. Use :func:`posix_spawnp` to pass an executable file without directory. The *file_actions* argument may be a sequence of tuples describing actions @@ -3944,6 +3982,10 @@ written in Python, such as a mail server's external command delivery program. to using this function. See the :ref:`subprocess-replacements` section in the :mod:`subprocess` documentation for some helpful recipes. + On Unix, :func:`waitstatus_to_exitcode` can be used to convert the result + (exit status) into an exit code. On Windows, the result is directly the exit + code. + .. audit-event:: os.system command os.system .. availability:: Unix, Windows. @@ -3984,12 +4026,21 @@ written in Python, such as a mail server's external command delivery program. number is zero); the high bit of the low byte is set if a core file was produced. + :func:`waitstatus_to_exitcode` can be used to convert the exit status into an + exit code. + .. availability:: Unix. + .. seealso:: + + :func:`waitpid` can be used to wait for the completion of a specific + child process and has more options. + .. function:: waitid(idtype, id, options) Wait for the completion of one or more child processes. - *idtype* can be :data:`P_PID`, :data:`P_PGID` or :data:`P_ALL`. + *idtype* can be :data:`P_PID`, :data:`P_PGID`, :data:`P_ALL`, or + :data:`P_PIDFD` on Linux. *id* specifies the pid to wait on. *options* is constructed from the ORing of one or more of :data:`WEXITED`, :data:`WSTOPPED` or :data:`WCONTINUED` and additionally may be ORed with @@ -4014,6 +4065,15 @@ written in Python, such as a mail server's external command delivery program. .. versionadded:: 3.3 +.. data:: P_PIDFD + + This is a Linux-specific *idtype* that indicates that *id* is a file + descriptor that refers to a process. + + .. availability:: Linux 5.4+ + + .. versionadded:: 3.9 + .. data:: WEXITED WSTOPPED WNOWAIT @@ -4027,8 +4087,10 @@ written in Python, such as a mail server's external command delivery program. .. data:: CLD_EXITED + CLD_KILLED CLD_DUMPED CLD_TRAPPED + CLD_STOPPED CLD_CONTINUED These are the possible values for :attr:`si_code` in the result returned by @@ -4038,6 +4100,9 @@ written in Python, such as a mail server's external command delivery program. .. versionadded:: 3.3 + .. versionchanged:: 3.9 + Added :data:`CLD_KILLED` and :data:`CLD_STOPPED` values. + .. function:: waitpid(pid, options) @@ -4066,6 +4131,9 @@ written in Python, such as a mail server's external command delivery program. id is known, not necessarily a child process. The :func:`spawn\* ` functions called with :const:`P_NOWAIT` return suitable process handles. + :func:`waitstatus_to_exitcode` can be used to convert the exit status into an + exit code. + .. versionchanged:: 3.5 If the system call is interrupted and the signal handler does not raise an exception, the function now retries the system call instead of raising an @@ -4081,6 +4149,9 @@ written in Python, such as a mail server's external command delivery program. information. The option argument is the same as that provided to :func:`waitpid` and :func:`wait4`. + :func:`waitstatus_to_exitcode` can be used to convert the exit status into an + exitcode. + .. availability:: Unix. @@ -4092,9 +4163,42 @@ written in Python, such as a mail server's external command delivery program. resource usage information. The arguments to :func:`wait4` are the same as those provided to :func:`waitpid`. + :func:`waitstatus_to_exitcode` can be used to convert the exit status into an + exitcode. + .. availability:: Unix. +.. function:: waitstatus_to_exitcode(status) + + Convert a wait status to an exit code. + + On Unix: + + * If the process exited normally (if ``WIFEXITED(status)`` is true), + return the process exit status (return ``WEXITSTATUS(status)``): + result greater than or equal to 0. + * If the process was terminated by a signal (if ``WIFSIGNALED(status)`` is + true), return ``-signum`` where *signum* is the number of the signal that + caused the process to terminate (return ``-WTERMSIG(status)``): + result less than 0. + * Otherwise, raise a :exc:`ValueError`. + + On Windows, return *status* shifted right by 8 bits. + + On Unix, if the process is being traced or if :func:`waitpid` was called + with :data:`WUNTRACED` option, the caller must first check if + ``WIFSTOPPED(status)`` is true. This function must not be called if + ``WIFSTOPPED(status)`` is true. + + .. seealso:: + + :func:`WIFEXITED`, :func:`WEXITSTATUS`, :func:`WIFSIGNALED`, + :func:`WTERMSIG`, :func:`WIFSTOPPED`, :func:`WSTOPSIG` functions. + + .. versionadded:: 3.9 + + .. data:: WNOHANG The option for :func:`waitpid` to return immediately if no child process status diff --git a/Doc/library/parser.rst b/Doc/library/parser.rst index 7b380c367028c02cec3cbb79f71dcccfd600139a..79fc10d0675af48c7cfcf7954ecb0c90bca751ae 100644 --- a/Doc/library/parser.rst +++ b/Doc/library/parser.rst @@ -25,11 +25,11 @@ from this. This is better than trying to parse and modify an arbitrary Python code fragment as a string because parsing is performed in a manner identical to the code forming the application. It is also faster. -.. note:: +.. warning:: - From Python 2.5 onward, it's much more convenient to cut in at the Abstract - Syntax Tree (AST) generation and compilation stage, using the :mod:`ast` - module. + The parser module is deprecated and will be removed in future versions of + Python. For the majority of use cases you can leverage the Abstract Syntax + Tree (AST) generation and compilation stage, using the :mod:`ast` module. There are a few things to note about this module which are important to making use of the data structures created. This is not a tutorial on editing the parse diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index b900d093b7565b382707f75856240ced07538763..9526a03b053986c1b4a7ae38560c71b42a385dd0 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -273,7 +273,7 @@ Methods and properties .. testsetup:: - from pathlib import PurePosixPath, PureWindowsPath + from pathlib import PurePath, PurePosixPath, PureWindowsPath Pure paths provide the following methods and properties: @@ -462,6 +462,19 @@ Pure paths provide the following methods and properties: True +.. method:: PurePath.is_relative_to(*other) + + Return whether or not this path is relative to the *other* path. + + >>> p = PurePath('/etc/passwd') + >>> p.is_relative_to('/etc') + True + >>> p.is_relative_to('/usr') + False + + .. versionadded:: 3.9 + + .. method:: PurePath.is_reserved() With :class:`PureWindowsPath`, return ``True`` if the path is considered @@ -538,7 +551,9 @@ Pure paths provide the following methods and properties: File "", line 1, in File "pathlib.py", line 694, in relative_to .format(str(self), str(formatted))) - ValueError: '/etc/passwd' does not start with '/usr' + ValueError: '/etc/passwd' is not in the subpath of '/usr' OR one path is relative and the other absolute. + + NOTE: This function is part of :class:`PurePath` and works with strings. It does not check or access the underlying file structure. .. method:: PurePath.with_name(name) @@ -558,6 +573,30 @@ Pure paths provide the following methods and properties: ValueError: PureWindowsPath('c:/') has an empty name +.. method:: PurePath.with_stem(stem) + + Return a new path with the :attr:`stem` changed. If the original path + doesn't have a name, ValueError is raised:: + + >>> p = PureWindowsPath('c:/Downloads/draft.txt') + >>> p.with_stem('final') + PureWindowsPath('c:/Downloads/final.txt') + >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz') + >>> p.with_stem('lib') + PureWindowsPath('c:/Downloads/lib.gz') + >>> p = PureWindowsPath('c:/') + >>> p.with_stem('') + Traceback (most recent call last): + File "", line 1, in + File "/home/antoine/cpython/default/Lib/pathlib.py", line 861, in with_stem + return self.with_name(stem + self.suffix) + File "/home/antoine/cpython/default/Lib/pathlib.py", line 851, in with_name + raise ValueError("%r has an empty name" % (self,)) + ValueError: PureWindowsPath('c:/') has an empty name + + .. versionadded:: 3.9 + + .. method:: PurePath.with_suffix(suffix) Return a new path with the :attr:`suffix` changed. If the original path @@ -752,6 +791,8 @@ call fails (for example because the path doesn't exist). Using the "``**``" pattern in large directory trees may consume an inordinate amount of time. + .. audit-event:: pathlib.Path.glob self,pattern pathlib.Path.glob + .. method:: Path.group() @@ -849,6 +890,11 @@ call fails (for example because the path doesn't exist). PosixPath('docs/_static') PosixPath('docs/Makefile') + The children are yielded in arbitrary order, and the special entries + ``'.'`` and ``'..'`` are not included. If a file is removed from or added + to the directory after creating the iterator, whether an path object for + that file be included is unspecified. + .. method:: Path.lchmod(mode) Like :meth:`Path.chmod` but, if the path points to a symbolic link, the @@ -933,6 +979,19 @@ call fails (for example because the path doesn't exist). .. versionadded:: 3.5 +.. method:: Path.readlink() + + Return the path to which the symbolic link points (as returned by + :func:`os.readlink`):: + + >>> p = Path('mylink') + >>> p.symlink_to('setup.py') + >>> p.readlink() + PosixPath('setup.py') + + .. versionadded:: 3.9 + + .. method:: Path.rename(target) Rename this file or directory to the given *target*, and return a new Path @@ -949,6 +1008,10 @@ call fails (for example because the path doesn't exist). >>> target.open().read() 'some text' + The target path may be absolute or relative. Relative paths are interpreted + relative to the current working directory, *not* the directory of the Path + object. + .. versionchanged:: 3.8 Added return value, return the new Path instance. @@ -959,6 +1022,10 @@ call fails (for example because the path doesn't exist). instance pointing to *target*. If *target* points to an existing file or directory, it will be unconditionally replaced. + The target path may be absolute or relative. Relative paths are interpreted + relative to the current working directory, *not* the directory of the Path + object. + .. versionchanged:: 3.8 Added return value, return the new Path instance. @@ -1001,6 +1068,8 @@ call fails (for example because the path doesn't exist). PosixPath('setup.py'), PosixPath('test_pathlib.py')] + .. audit-event:: pathlib.Path.rglob self,pattern pathlib.Path.rglob + .. method:: Path.rmdir() @@ -1078,7 +1147,7 @@ call fails (for example because the path doesn't exist). Create a hard link pointing to a path named *target*. - .. versionchanged:: 3.8 + .. versionadded:: 3.8 .. method:: Path.write_bytes(data) @@ -1131,6 +1200,7 @@ os and os.path pathlib :func:`os.path.abspath` :meth:`Path.resolve` :func:`os.chmod` :meth:`Path.chmod` :func:`os.mkdir` :meth:`Path.mkdir` +:func:`os.makedirs` :meth:`Path.mkdir` :func:`os.rename` :meth:`Path.rename` :func:`os.replace` :meth:`Path.replace` :func:`os.rmdir` :meth:`Path.rmdir` @@ -1139,9 +1209,13 @@ os and os.path pathlib :func:`os.path.exists` :meth:`Path.exists` :func:`os.path.expanduser` :meth:`Path.expanduser` and :meth:`Path.home` +:func:`os.listdir` :meth:`Path.iterdir` :func:`os.path.isdir` :meth:`Path.is_dir` :func:`os.path.isfile` :meth:`Path.is_file` :func:`os.path.islink` :meth:`Path.is_symlink` +:func:`os.link` :meth:`Path.link_to` +:func:`os.symlink` :meth:`Path.symlink_to` +:func:`os.readlink` :meth:`Path.readlink` :func:`os.stat` :meth:`Path.stat`, :meth:`Path.owner`, :meth:`Path.group` diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst index ca0a507a0e64e9334423ced3474486c5878f3b81..ed1e9712c0e3de41247ffcfb2ca4cb381b85dd42 100644 --- a/Doc/library/pdb.rst +++ b/Doc/library/pdb.rst @@ -296,20 +296,20 @@ by the local file. Temporary breakpoint, which is removed automatically when it is first hit. The arguments are the same as for :pdbcmd:`break`. -.. pdbcommand:: cl(ear) [filename:lineno | bpnumber [bpnumber ...]] +.. pdbcommand:: cl(ear) [filename:lineno | bpnumber ...] With a *filename:lineno* argument, clear all the breakpoints at this line. With a space separated list of breakpoint numbers, clear those breakpoints. Without argument, clear all breaks (but first ask confirmation). -.. pdbcommand:: disable [bpnumber [bpnumber ...]] +.. pdbcommand:: disable [bpnumber ...] Disable the breakpoints given as a space separated list of breakpoint numbers. Disabling a breakpoint means it cannot cause the program to stop execution, but unlike clearing a breakpoint, it remains in the list of breakpoints and can be (re-)enabled. -.. pdbcommand:: enable [bpnumber [bpnumber ...]] +.. pdbcommand:: enable [bpnumber ...] Enable the breakpoints specified. diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst index d92e947a76403e1cf7017e8d4d70d7279d80a487..be48561ed10ac8024077e8f66d2f75bcfa469eac 100644 --- a/Doc/library/pickle.rst +++ b/Doc/library/pickle.rst @@ -213,7 +213,7 @@ The :mod:`pickle` module provides the following constants: The :mod:`pickle` module provides the following functions to make the pickling process more convenient: -.. function:: dump(obj, file, protocol=None, \*, fix_imports=True, buffer_callback=None) +.. function:: dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None) Write the pickled representation of the object *obj* to the open :term:`file object` *file*. This is equivalent to @@ -225,7 +225,7 @@ process more convenient: .. versionchanged:: 3.8 The *buffer_callback* argument was added. -.. function:: dumps(obj, protocol=None, \*, fix_imports=True, buffer_callback=None) +.. function:: dumps(obj, protocol=None, *, fix_imports=True, buffer_callback=None) Return the pickled representation of the object *obj* as a :class:`bytes` object, instead of writing it to a file. @@ -236,7 +236,7 @@ process more convenient: .. versionchanged:: 3.8 The *buffer_callback* argument was added. -.. function:: load(file, \*, fix_imports=True, encoding="ASCII", errors="strict", buffers=None) +.. function:: load(file, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None) Read the pickled representation of an object from the open :term:`file object` *file* and return the reconstituted object hierarchy specified therein. @@ -252,7 +252,7 @@ process more convenient: .. versionchanged:: 3.8 The *buffers* argument was added. -.. function:: loads(data, \*, fix_imports=True, encoding="ASCII", errors="strict", buffers=None) +.. function:: loads(data, /, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None) Return the reconstituted object hierarchy of the pickled representation *data* of an object. *data* must be a :term:`bytes-like object`. @@ -296,7 +296,7 @@ The :mod:`pickle` module defines three exceptions: The :mod:`pickle` module exports three classes, :class:`Pickler`, :class:`Unpickler` and :class:`PickleBuffer`: -.. class:: Pickler(file, protocol=None, \*, fix_imports=True, buffer_callback=None) +.. class:: Pickler(file, protocol=None, *, fix_imports=True, buffer_callback=None) This takes a binary file for writing a pickle data stream. @@ -391,7 +391,7 @@ The :mod:`pickle` module exports three classes, :class:`Pickler`, Use :func:`pickletools.optimize` if you need more compact pickles. -.. class:: Unpickler(file, \*, fix_imports=True, encoding="ASCII", errors="strict", buffers=None) +.. class:: Unpickler(file, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None) This takes a binary file for reading a pickle data stream. diff --git a/Doc/library/pkgutil.rst b/Doc/library/pkgutil.rst index 78a51573458583781e854f6aa354470f0b687885..3b17b9a62198705ef950f69f1b3f7aa9af0da6f8 100644 --- a/Doc/library/pkgutil.rst +++ b/Doc/library/pkgutil.rst @@ -68,7 +68,7 @@ support. .. class:: ImpLoader(fullname, file, filename, etc) - :term:`Loader` that wraps Python's "classic" import algorithm. + :term:`Loader ` that wraps Python's "classic" import algorithm. .. deprecated:: 3.3 This emulation is no longer needed, as the standard import mechanism @@ -227,3 +227,44 @@ support. then ``None`` is returned. In particular, the :term:`loader` for :term:`namespace packages ` does not support :meth:`get_data `. + + +.. function:: resolve_name(name) + + Resolve a name to an object. + + This functionality is used in numerous places in the standard library (see + :issue:`12915`) - and equivalent functionality is also in widely used + third-party packages such as setuptools, Django and Pyramid. + + It is expected that *name* will be a string in one of the following + formats, where W is shorthand for a valid Python identifier and dot stands + for a literal period in these pseudo-regexes: + + * ``W(.W)*`` + * ``W(.W)*:(W(.W)*)?`` + + The first form is intended for backward compatibility only. It assumes that + some part of the dotted name is a package, and the rest is an object + somewhere within that package, possibly nested inside other objects. + Because the place where the package stops and the object hierarchy starts + can't be inferred by inspection, repeated attempts to import must be done + with this form. + + In the second form, the caller makes the division point clear through the + provision of a single colon: the dotted name to the left of the colon is a + package to be imported, and the dotted name to the right is the object + hierarchy within that package. Only one import is needed in this form. If + it ends with the colon, then a module object is returned. + + The function will return an object (which might be a module), or raise one + of the following exceptions: + + :exc:`ValueError` -- if *name* isn't in a recognised format. + + :exc:`ImportError` -- if an import failed when it shouldn't have. + + :exc:`AttributeError` -- If a failure occurred when traversing the object + hierarchy within the imported package to get to the desired object. + + .. versionadded:: 3.9 diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst index 8e8e3775aaff4a11c187a9d595fbacf3c8ee3356..b293adf48e6e33004f98479be1fe73eaa952e95f 100644 --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -209,13 +209,6 @@ Windows Platform which means the OS version uses debugging code, i.e. code that checks arguments, ranges, etc. - .. note:: - - This function works best with Mark Hammond's - :mod:`win32all` package installed, but also on Python 2.3 and - later (support for this was added in Python 2.6). It obviously - only runs on Win32 compatible platforms. - .. function:: win32_edition() Returns a string representing the current Windows edition. Possible diff --git a/Doc/library/plistlib.rst b/Doc/library/plistlib.rst index 9dfe3c8a0dc984860be90fdf2bf38af8ae2d3223..ce6d4a85bf5e9d2668d3afd92219de729360acb9 100644 --- a/Doc/library/plistlib.rst +++ b/Doc/library/plistlib.rst @@ -1,8 +1,8 @@ -:mod:`plistlib` --- Generate and parse Mac OS X ``.plist`` files -================================================================ +:mod:`plistlib` --- Generate and parse Apple ``.plist`` files +============================================================= .. module:: plistlib - :synopsis: Generate and parse Mac OS X plist files. + :synopsis: Generate and parse Apple plist files. .. moduleauthor:: Jack Jansen .. sectionauthor:: Georg Brandl @@ -17,7 +17,8 @@ -------------- This module provides an interface for reading and writing the "property list" -files used mainly by Mac OS X and supports both binary and XML plist files. +files used by Apple, primarily on macOS and iOS. This module supports both binary +and XML plist files. The property list (``.plist``) file format is a simple serialization supporting basic object types, like dictionaries, lists, numbers and strings. Usually the @@ -30,7 +31,7 @@ To work with plist data in bytes objects, use :func:`dumps` and :func:`loads`. Values can be strings, integers, floats, booleans, tuples, lists, dictionaries -(but only with string keys), :class:`Data`, :class:`bytes`, :class:`bytesarray` +(but only with string keys), :class:`bytes`, :class:`bytearray` or :class:`datetime.datetime` objects. .. versionchanged:: 3.4 @@ -40,6 +41,9 @@ or :class:`datetime.datetime` objects. Support added for reading and writing :class:`UID` tokens in binary plists as used by NSKeyedArchiver and NSKeyedUnarchiver. +.. versionchanged:: 3.9 + Old API removed. + .. seealso:: `PList manual page `_ @@ -48,7 +52,7 @@ or :class:`datetime.datetime` objects. This module defines the following functions: -.. function:: load(fp, \*, fmt=None, use_builtin_types=True, dict_type=dict) +.. function:: load(fp, *, fmt=None, dict_type=dict) Read a plist file. *fp* should be a readable and binary file object. Return the unpacked root object (which usually is a @@ -62,10 +66,6 @@ This module defines the following functions: * :data:`FMT_BINARY`: Binary plist format - If *use_builtin_types* is true (the default) binary data will be returned - as instances of :class:`bytes`, otherwise it is returned as instances of - :class:`Data`. - The *dict_type* is the type used for dictionaries that are read from the plist file. @@ -80,7 +80,7 @@ This module defines the following functions: .. versionadded:: 3.4 -.. function:: loads(data, \*, fmt=None, use_builtin_types=True, dict_type=dict) +.. function:: loads(data, *, fmt=None, dict_type=dict) Load a plist from a bytes object. See :func:`load` for an explanation of the keyword arguments. @@ -88,7 +88,7 @@ This module defines the following functions: .. versionadded:: 3.4 -.. function:: dump(value, fp, \*, fmt=FMT_XML, sort_keys=True, skipkeys=False) +.. function:: dump(value, fp, *, fmt=FMT_XML, sort_keys=True, skipkeys=False) Write *value* to a plist file. *Fp* should be a writable, binary file object. @@ -116,7 +116,7 @@ This module defines the following functions: .. versionadded:: 3.4 -.. function:: dumps(value, \*, fmt=FMT_XML, sort_keys=True, skipkeys=False) +.. function:: dumps(value, *, fmt=FMT_XML, sort_keys=True, skipkeys=False) Return *value* as a plist-formatted bytes object. See the documentation for :func:`dump` for an explanation of the keyword @@ -124,65 +124,9 @@ This module defines the following functions: .. versionadded:: 3.4 -The following functions are deprecated: - -.. function:: readPlist(pathOrFile) - - Read a plist file. *pathOrFile* may be either a file name or a (readable - and binary) file object. Returns the unpacked root object (which usually - is a dictionary). - - This function calls :func:`load` to do the actual work, see the documentation - of :func:`that function ` for an explanation of the keyword arguments. - - .. deprecated:: 3.4 Use :func:`load` instead. - - .. versionchanged:: 3.7 - Dict values in the result are now normal dicts. You no longer can use - attribute access to access items of these dictionaries. - - -.. function:: writePlist(rootObject, pathOrFile) - - Write *rootObject* to an XML plist file. *pathOrFile* may be either a file name - or a (writable and binary) file object - - .. deprecated:: 3.4 Use :func:`dump` instead. - - -.. function:: readPlistFromBytes(data) - - Read a plist data from a bytes object. Return the root object. - - See :func:`load` for a description of the keyword arguments. - - .. deprecated:: 3.4 Use :func:`loads` instead. - - .. versionchanged:: 3.7 - Dict values in the result are now normal dicts. You no longer can use - attribute access to access items of these dictionaries. - - -.. function:: writePlistToBytes(rootObject) - - Return *rootObject* as an XML plist-formatted bytes object. - - .. deprecated:: 3.4 Use :func:`dumps` instead. - The following classes are available: -.. class:: Data(data) - - Return a "data" wrapper object around the bytes object *data*. This is used - in functions converting from/to plists to represent the ```` type - available in plists. - - It has one attribute, :attr:`data`, that can be used to retrieve the Python - bytes object stored in it. - - .. deprecated:: 3.4 Use a :class:`bytes` object instead. - .. class:: UID(data) Wraps an :class:`int`. This is used when reading or writing NSKeyedArchiver diff --git a/Doc/library/poplib.rst b/Doc/library/poplib.rst index 28b42fa60c1859b2aadef2d44d053d20519e48b6..9bf9212d917a55d0dcc2ecb1c7051fd55072b1d6 100644 --- a/Doc/library/poplib.rst +++ b/Doc/library/poplib.rst @@ -47,6 +47,9 @@ The :mod:`poplib` module provides two classes: ``poplib.putline`` with arguments ``self`` and ``line``, where ``line`` is the bytes about to be sent to the remote host. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket. .. class:: POP3_SSL(host, port=POP3_SSL_PORT, keyfile=None, certfile=None, timeout=None, context=None) @@ -64,7 +67,7 @@ The :mod:`poplib` module provides two classes: .. audit-event:: poplib.connect self,host,port poplib.POP3_SSL - .. audit-event:: poplib.putline self,line popplib.POP3_SSL + .. audit-event:: poplib.putline self,line poplib.POP3_SSL All commands will raise an :ref:`auditing event ` ``poplib.putline`` with arguments ``self`` and ``line``, @@ -85,6 +88,10 @@ The :mod:`poplib` module provides two classes: :func:`ssl.create_default_context` select the system's trusted CA certificates for you. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket. + One exception is defined as an attribute of the :mod:`poplib` module: @@ -268,4 +275,3 @@ retrieves and prints all messages:: At the end of the module, there is a test section that contains a more extensive example of usage. - diff --git a/Doc/library/pprint.rst b/Doc/library/pprint.rst index b8b7f4213969a9b02f07aba07db18623f96fec15..16256c549208fcac975935029bbe613e4e4cce01 100644 --- a/Doc/library/pprint.rst +++ b/Doc/library/pprint.rst @@ -25,6 +25,9 @@ width constraint. Dictionaries are sorted by key before the display is computed. +.. versionchanged:: 3.9 + Added support for pretty-printing :class:`types.SimpleNamespace`. + The :mod:`pprint` module defines one class: .. First the implementation class: diff --git a/Doc/library/profile.rst b/Doc/library/profile.rst index d8039fd28e0d8a8799d7a9762aa87ec0c4a1b383..774d46d0e9624781588efde530aa880c628b1faa 100644 --- a/Doc/library/profile.rst +++ b/Doc/library/profile.rst @@ -309,7 +309,7 @@ functions: Profile the cmd via :func:`exec` with the specified global and local environment. - .. method:: runcall(func, *args, **kwargs) + .. method:: runcall(func, /, *args, **kwargs) Profile ``func(*args, **kwargs)`` @@ -525,6 +525,17 @@ Analysis of the profiler data is done using the :class:`~pstats.Stats` class. ordering are identical to the :meth:`~pstats.Stats.print_callers` method. + .. method:: get_stats_profile() + + This method returns an instance of StatsProfile, which contains a mapping + of function names to instances of FunctionProfile. Each FunctionProfile + instance holds information related to the function's profile such as how + long the function took to run, how many times it was called, etc... + + .. versionadded:: 3.9 + Added the following dataclasses: StatsProfile, FunctionProfile. + Added the following function: get_stats_profile. + .. _deterministic-profiling: What Is Deterministic Profiling? diff --git a/Doc/library/pty.rst b/Doc/library/pty.rst index e85d2e239fdbdb69537f4fe3f0ac96031f40d542..73d4f102fd4d8e2f57c994f55adc2925f17fa314 100644 --- a/Doc/library/pty.rst +++ b/Doc/library/pty.rst @@ -69,6 +69,11 @@ The :mod:`pty` module defines the following functions: *select* throws an error on your platform when passed three empty lists. This is a bug, documented in `issue 26228 `_. + Return the exit status value from :func:`os.waitpid` on the child process. + + :func:`waitstatus_to_exitcode` can be used to convert the exit status into + an exit code. + .. audit-event:: pty.spawn argv pty.spawn .. versionchanged:: 3.4 diff --git a/Doc/library/py_compile.rst b/Doc/library/py_compile.rst index a12a5bb0b1aa2c0c5c290d5c619ac1cd08be11c1..cac6dcb63e7f3e6db3cf6161230d8ba92a521bc7 100644 --- a/Doc/library/py_compile.rst +++ b/Doc/library/py_compile.rst @@ -35,7 +35,7 @@ byte-code cache files in the directory containing the source code. in ``.pyc``. For example, if *file* is ``/foo/bar/baz.py`` *cfile* will default to ``/foo/bar/__pycache__/baz.cpython-32.pyc`` for Python 3.2. If *dfile* is - specified, it is used as the name of the source file in error messages when + specified, it is used as the name of the source file in error messages instead of *file*. If *doraise* is true, a :exc:`PyCompileError` is raised when an error is encountered while compiling *file*. If *doraise* is false (the default), an error string is written to ``sys.stderr``, but no exception diff --git a/Doc/library/pyexpat.rst b/Doc/library/pyexpat.rst index e43b9aecd86835a212b9bfa2367c4bc388f149d5..034e579315de00f9d6516534b46fb583f8ddb87e 100644 --- a/Doc/library/pyexpat.rst +++ b/Doc/library/pyexpat.rst @@ -665,14 +665,14 @@ The ``errors`` module has the following attributes: .. data:: codes - A dictionary mapping numeric error codes to their string descriptions. + A dictionary mapping string descriptions to their error codes. .. versionadded:: 3.2 .. data:: messages - A dictionary mapping string descriptions to their error codes. + A dictionary mapping numeric error codes to their string descriptions. .. versionadded:: 3.2 diff --git a/Doc/library/random.rst b/Doc/library/random.rst index 2149e800e16572e765b4935797b0c23028562161..0e703251259aa756ebcf5c665e03f7fb59b52f84 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -86,6 +86,11 @@ Bookkeeping functions .. versionchanged:: 3.2 Moved to the version 2 scheme which uses all of the bits in a string seed. + .. deprecated:: 3.9 + In the future, the *seed* must be one of the following types: + *NoneType*, :class:`int`, :class:`float`, :class:`str`, + :class:`bytes`, or :class:`bytearray`. + .. function:: getstate() Return an object capturing the current internal state of the generator. This @@ -99,12 +104,17 @@ Bookkeeping functions the time :func:`getstate` was called. -.. function:: getrandbits(k) +Functions for bytes +------------------- + +.. function:: randbytes(n) + + Generate *n* random bytes. + + This method should not be used for generating security tokens. + Use :func:`secrets.token_bytes` instead. - Returns a Python integer with *k* random bits. This method is supplied with - the Mersenne Twister generator and some other generators may also provide it - as an optional part of the API. When available, :meth:`getrandbits` enables - :meth:`randrange` to handle arbitrarily large ranges. + .. versionadded:: 3.9 Functions for integers @@ -130,6 +140,17 @@ Functions for integers Return a random integer *N* such that ``a <= N <= b``. Alias for ``randrange(a, b+1)``. +.. function:: getrandbits(k) + + Returns a non-negative Python integer with *k* random bits. This method + is supplied with the MersenneTwister generator and some other generators + may also provide it as an optional part of the API. When available, + :meth:`getrandbits` enables :meth:`randrange` to handle arbitrarily large + ranges. + + .. versionchanged:: 3.9 + This method now accepts zero for *k*. + Functions for sequences ----------------------- @@ -160,8 +181,9 @@ Functions for sequences The *weights* or *cum_weights* can use any numeric type that interoperates with the :class:`float` values returned by :func:`random` (that includes - integers, floats, and fractions but excludes decimals). Weights are - assumed to be non-negative. + integers, floats, and fractions but excludes decimals). Behavior is + undefined if any weight is negative. A :exc:`ValueError` is raised if all + weights are zero. For a given seed, the :func:`choices` function with equal weighting typically produces a different sequence than repeated calls to @@ -172,6 +194,9 @@ Functions for sequences .. versionadded:: 3.6 + .. versionchanged:: 3.9 + Raises a :exc:`ValueError` if all weights are zero. + .. function:: shuffle(x[, random]) @@ -189,8 +214,11 @@ Functions for sequences generated. For example, a sequence of length 2080 is the largest that can fit within the period of the Mersenne Twister random number generator. + .. deprecated-removed:: 3.9 3.11 + The optional parameter *random*. + -.. function:: sample(population, k) +.. function:: sample(population, k, *, counts=None) Return a *k* length list of unique elements chosen from the population sequence or set. Used for random sampling without replacement. @@ -204,6 +232,11 @@ Functions for sequences Members of the population need not be :term:`hashable` or unique. If the population contains repeats, then each occurrence is a possible selection in the sample. + Repeated elements can be specified one at a time or with the optional + keyword-only *counts* parameter. For example, ``sample(['red', 'blue'], + counts=[4, 2], k=5)`` is equivalent to ``sample(['red', 'red', 'red', 'red', + 'blue', 'blue'], k=5)``. + To choose a sample from a range of integers, use a :func:`range` object as an argument. This is especially fast and space efficient for sampling from a large population: ``sample(range(10000000), k=60)``. @@ -211,6 +244,18 @@ Functions for sequences If the sample size is larger than the population size, a :exc:`ValueError` is raised. + .. versionchanged:: 3.9 + Added the *counts* parameter. + + .. deprecated:: 3.9 + In the future, the *population* must be a sequence. Instances of + :class:`set` are no longer supported. The set must first be converted + to a :class:`list` or :class:`tuple`, preferably in a deterministic + order so that the sample is reproducible. + + +.. _real-valued-distributions: + Real-valued distributions ------------------------- @@ -275,6 +320,13 @@ be found in any statistics text. deviation. This is slightly faster than the :func:`normalvariate` function defined below. + Multithreading note: When two threads call this function + simultaneously, it is possible that they will receive the + same return value. This can be avoided in three ways. + 1) Have each thread use a different instance of the random + number generator. 2) Put locks around all calls. 3) Use the + slower, but thread-safe :func:`normalvariate` function instead. + .. function:: lognormvariate(mu, sigma) @@ -316,6 +368,11 @@ Alternative Generator Class that implements the default pseudo-random number generator used by the :mod:`random` module. + .. deprecated:: 3.9 + In the future, the *seed* must be one of the following types: + :class:`NoneType`, :class:`int`, :class:`float`, :class:`str`, + :class:`bytes`, or :class:`bytearray`. + .. class:: SystemRandom([seed]) Class that uses the :func:`os.urandom` function for generating random numbers @@ -329,8 +386,8 @@ Alternative Generator Notes on Reproducibility ------------------------ -Sometimes it is useful to be able to reproduce the sequences given by a pseudo -random number generator. By re-using a seed value, the same sequence should be +Sometimes it is useful to be able to reproduce the sequences given by a +pseudo-random number generator. By re-using a seed value, the same sequence should be reproducible from run to run as long as multiple threads are not running. Most of the random module's algorithms and seeding functions are subject to @@ -344,8 +401,8 @@ change across Python versions, but two aspects are guaranteed not to change: .. _random-examples: -Examples and Recipes --------------------- +Examples +-------- Basic examples:: @@ -381,12 +438,11 @@ Simulations:: >>> choices(['red', 'black', 'green'], [18, 18, 2], k=6) ['red', 'green', 'black', 'black', 'red', 'black'] - >>> # Deal 20 cards without replacement from a deck of 52 playing cards - >>> # and determine the proportion of cards with a ten-value - >>> # (a ten, jack, queen, or king). - >>> deck = collections.Counter(tens=16, low_cards=36) - >>> seen = sample(list(deck.elements()), k=20) - >>> seen.count('tens') / 20 + >>> # Deal 20 cards without replacement from a deck + >>> # of 52 playing cards, and determine the proportion of cards + >>> # with a ten-value: ten, jack, queen, or king. + >>> dealt = sample(['tens', 'low cards'], counts=[16, 36], k=20) + >>> dealt.count('tens') / 20 0.15 >>> # Estimate the probability of getting 5 or more heads from 7 spins @@ -490,3 +546,58 @@ Simulation of arrival times and service deliveries for a multiserver queue:: a tutorial by `Peter Norvig `_ covering the basics of probability theory, how to write simulations, and how to perform data analysis using Python. + + +Recipes +------- + +The default :func:`.random` returns multiples of 2⁻⁵³ in the range +*0.0 ≤ x < 1.0*. All such numbers are evenly spaced and are exactly +representable as Python floats. However, many other representable +floats in that interval are not possible selections. For example, +``0.05954861408025609`` isn't an integer multiple of 2⁻⁵³. + +The following recipe takes a different approach. All floats in the +interval are possible selections. The mantissa comes from a uniform +distribution of integers in the range *2⁵² ≤ mantissa < 2⁵³*. The +exponent comes from a geometric distribution where exponents smaller +than *-53* occur half as often as the next larger exponent. + +:: + + from random import Random + from math import ldexp + + class FullRandom(Random): + + def random(self): + mantissa = 0x10_0000_0000_0000 | self.getrandbits(52) + exponent = -53 + x = 0 + while not x: + x = self.getrandbits(32) + exponent += x.bit_length() - 32 + return ldexp(mantissa, exponent) + +All :ref:`real valued distributions ` +in the class will use the new method:: + + >>> fr = FullRandom() + >>> fr.random() + 0.05954861408025609 + >>> fr.expovariate(0.25) + 8.87925541791544 + +The recipe is conceptually equivalent to an algorithm that chooses from +all the multiples of 2⁻¹⁰⁷⁴ in the range *0.0 ≤ x < 1.0*. All such +numbers are evenly spaced, but most have to be rounded down to the +nearest representable Python float. (The value 2⁻¹⁰⁷⁴ is the smallest +positive unnormalized float and is equal to ``math.ulp(0.0)``.) + + +.. seealso:: + + `Generating Pseudo-random Floating-Point Values + `_ a + paper by Allen B. Downey describing ways to generate more + fine-grained floats than normally generated by :func:`.random`. diff --git a/Doc/library/secrets.rst b/Doc/library/secrets.rst index bc4766da2785b36dfe8b0621abb5389d3138f197..afa8e2d385fa46581976c123f32f80efb3bf0da1 100644 --- a/Doc/library/secrets.rst +++ b/Doc/library/secrets.rst @@ -21,7 +21,7 @@ The :mod:`secrets` module is used for generating cryptographically strong random numbers suitable for managing data such as passwords, account authentication, security tokens, and related secrets. -In particularly, :mod:`secrets` should be used in preference to the +In particular, :mod:`secrets` should be used in preference to the default pseudo-random number generator in the :mod:`random` module, which is designed for modelling and simulation, not security or cryptography. diff --git a/Doc/library/select.rst b/Doc/library/select.rst index 39622aadf3fa540dba9b2a0897b522dfc6be5063..a354187c266c7fb9dcc3fee785fc4dfb84cd89ef 100644 --- a/Doc/library/select.rst +++ b/Doc/library/select.rst @@ -355,6 +355,9 @@ Edge and Level Trigger Polling (epoll) Objects Remove a registered file descriptor from the epoll object. + .. versionchanged:: 3.9 + The method no longer ignores the :data:`~errno.EBADF` error. + .. method:: epoll.poll(timeout=None, maxevents=-1) diff --git a/Doc/library/shlex.rst b/Doc/library/shlex.rst index adc23da6d491b7c088f1a661bacb51f85971687a..7f7f0c7f124ac5a4278354d668caca5e662c0775 100644 --- a/Doc/library/shlex.rst +++ b/Doc/library/shlex.rst @@ -36,6 +36,9 @@ The :mod:`shlex` module defines the following functions: instance, passing ``None`` for *s* will read the string to split from standard input. + .. deprecated:: 3.9 + Passing ``None`` for *s* will raise an exception in future Python + versions. .. function:: join(split_command) diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index 25b749e57b27d4d17d6eabe27def973a8454b5d3..d5080da15bba41b3c6d2eb996b9871bd38fcd55a 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -158,9 +158,9 @@ Directory and files operations .. function:: copy(src, dst, *, follow_symlinks=True) Copies the file *src* to the file or directory *dst*. *src* and *dst* - should be strings. If *dst* specifies a directory, the file will be - copied into *dst* using the base filename from *src*. Returns the - path to the newly created file. + should be :term:`path-like objects ` or strings. If + *dst* specifies a directory, the file will be copied into *dst* using the + base filename from *src*. Returns the path to the newly created file. If *follow_symlinks* is false, and *src* is a symbolic link, *dst* will be created as a symbolic link. If *follow_symlinks* @@ -218,7 +218,7 @@ Directory and files operations copy the file more efficiently. See :ref:`shutil-platform-dependent-efficient-copy-operations` section. -.. function:: ignore_patterns(\*patterns) +.. function:: ignore_patterns(*patterns) This factory function creates a function that can be used as a callable for :func:`copytree`\'s *ignore* argument, ignoring files and directories that @@ -349,7 +349,7 @@ Directory and files operations will be created in or as *dst* and *src* will be removed. If *copy_function* is given, it must be a callable that takes two arguments - *src* and *dst*, and will be used to copy *src* to *dest* if + *src* and *dst*, and will be used to copy *src* to *dst* if :func:`os.rename` cannot be used. If the source is a directory, :func:`copytree` is called, passing it the :func:`copy_function`. The default *copy_function* is :func:`copy2`. Using :func:`~shutil.copy` as the @@ -371,6 +371,9 @@ Directory and files operations copy the file more efficiently. See :ref:`shutil-platform-dependent-efficient-copy-operations` section. + .. versionchanged:: 3.9 + Accepts a :term:`path-like object` for both *src* and *dst*. + .. function:: disk_usage(path) Return disk usage statistics about the given path as a :term:`named tuple` @@ -440,8 +443,9 @@ Directory and files operations Platform-dependent efficient copy operations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Starting from Python 3.8 all functions involving a file copy (:func:`copyfile`, -:func:`copy`, :func:`copy2`, :func:`copytree`, and :func:`move`) may use +Starting from Python 3.8, all functions involving a file copy +(:func:`copyfile`, :func:`~shutil.copy`, :func:`copy2`, +:func:`copytree`, and :func:`move`) may use platform-specific "fast-copy" syscalls in order to copy the file more efficiently (see :issue:`33671`). "fast-copy" means that the copying operation occurs within the kernel, avoiding diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst index 5488f4a1f9685f7d863817f45fb68ad2a1e55a4b..e1daeff48ad8fc96773a0ce7aa0b9a611df5541d 100644 --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -53,12 +53,12 @@ This has consequences: Signals and threads ^^^^^^^^^^^^^^^^^^^ -Python signal handlers are always executed in the main Python thread, +Python signal handlers are always executed in the main Python thread of the main interpreter, even if the signal was received in another thread. This means that signals can't be used as a means of inter-thread communication. You can use the synchronization primitives from the :mod:`threading` module instead. -Besides, only the main thread is allowed to set a new signal handler. +Besides, only the main thread of the main interpreter is allowed to set a new signal handler. Module contents @@ -117,7 +117,7 @@ The variables defined in the :mod:`signal` module are: Child process stopped or terminated. - .. availability:: Windows. + .. availability:: Unix. .. data:: SIGCLD @@ -351,13 +351,26 @@ The :mod:`signal` module defines the following functions: .. versionadded:: 3.8 +.. function:: pidfd_send_signal(pidfd, sig, siginfo=None, flags=0) + + Send signal *sig* to the process referred to by file descriptor *pidfd*. + Python does not currently support the *siginfo* parameter; it must be + ``None``. The *flags* argument is provided for future extensions; no flag + values are currently defined. + + See the :manpage:`pidfd_send_signal(2)` man page for more information. + + .. availability:: Linux 5.1+ + .. versionadded:: 3.9 + + .. function:: pthread_kill(thread_id, signalnum) Send the signal *signalnum* to the thread *thread_id*, another thread in the same process as the caller. The target thread can be executing any code (Python or not). However, if the target thread is executing the Python interpreter, the Python signal handlers will be :ref:`executed by the main - thread `. Therefore, the only point of sending a + thread of the main interpreter `. Therefore, the only point of sending a signal to a particular Python thread would be to force a running system call to fail with :exc:`InterruptedError`. @@ -453,7 +466,8 @@ The :mod:`signal` module defines the following functions: If not -1, *fd* must be non-blocking. It is up to the library to remove any bytes from *fd* before calling poll or select again. - When threads are enabled, this function can only be called from the main thread; + When threads are enabled, this function can only be called + from :ref:`the main thread of the main interpreter `; attempting to call it from other threads will cause a :exc:`ValueError` exception to be raised. @@ -506,7 +520,8 @@ The :mod:`signal` module defines the following functions: signal handler will be returned (see the description of :func:`getsignal` above). (See the Unix man page :manpage:`signal(2)` for further information.) - When threads are enabled, this function can only be called from the main thread; + When threads are enabled, this function can only be called + from :ref:`the main thread of the main interpreter `; attempting to call it from other threads will cause a :exc:`ValueError` exception to be raised. diff --git a/Doc/library/site.rst b/Doc/library/site.rst index b424e1ba348d870a7534d54cec06a29fcb9cec88..2e3646f6a74f80ce19d9aa7725a7388a1980a3b2 100644 --- a/Doc/library/site.rst +++ b/Doc/library/site.rst @@ -231,7 +231,9 @@ Module contents Return the path of the user-specific site-packages directory, :data:`USER_SITE`. If it is not initialized yet, this function will also set - it, respecting :envvar:`PYTHONNOUSERSITE` and :data:`USER_BASE`. + it, respecting :data:`USER_BASE`. To determine if the user-specific + site-packages was added to ``sys.path`` :data:`ENABLE_USER_SITE` should be + used. .. versionadded:: 3.2 diff --git a/Doc/library/smtpd.rst b/Doc/library/smtpd.rst index 85ee8a75cf77a9a032f2b05b230b12f02d0db7e4..d84e74a8ceaaff506cfcfcc62f6985be3cf80915 100644 --- a/Doc/library/smtpd.rst +++ b/Doc/library/smtpd.rst @@ -148,6 +148,12 @@ MailmanProxy Objects .. class:: MailmanProxy(localaddr, remoteaddr) + .. deprecated-removed:: 3.9 3.11 + + :class:`MailmanProxy` is deprecated, it depends on a ``Mailman`` + module which no longer exists and therefore is already broken. + + Create a new pure proxy server. Arguments are as per :class:`SMTPServer`. Everything will be relayed to *remoteaddr*, unless local mailman configurations knows about an address, in which case it will be handled via mailman. Note that diff --git a/Doc/library/smtplib.rst b/Doc/library/smtplib.rst index 6176c35a0e4a50d139845b8528577e75969a8828..c1a20fee6cf02450d0a2ba8f589f7c5dc1fec358 100644 --- a/Doc/library/smtplib.rst +++ b/Doc/library/smtplib.rst @@ -70,6 +70,9 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions). .. versionadded:: 3.5 The SMTPUTF8 extension (:rfc:`6531`) is now supported. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket .. class:: SMTP_SSL(host='', port=0, local_hostname=None, keyfile=None, \ certfile=None [, timeout], context=None, \ @@ -108,8 +111,12 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions). :func:`ssl.create_default_context` select the system's trusted CA certificates for you. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket -.. class:: LMTP(host='', port=LMTP_PORT, local_hostname=None, source_address=None) +.. class:: LMTP(host='', port=LMTP_PORT, local_hostname=None, \ + source_address=None[, timeout]) The LMTP protocol, which is very similar to ESMTP, is heavily based on the standard SMTP client. It's common to use Unix sockets for LMTP, so our @@ -122,6 +129,9 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions). Unix socket, LMTP generally don't support or require any authentication, but your mileage might vary. + .. versionchanged:: 3.9 + The optional *timeout* parameter was added. + A nice selection of exceptions is defined as well: diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index c72f22b5f6699ecc74317145bbdae9ac9a71e8d0..2fc170a0bc0bd30d2fd17ca387b382fd1dc759e8 100644 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -56,12 +56,12 @@ created. Socket addresses are represented as follows: bytes-like object can be used for either type of address when passing it as an argument. - .. versionchanged:: 3.3 - Previously, :const:`AF_UNIX` socket paths were assumed to use UTF-8 - encoding. + .. versionchanged:: 3.3 + Previously, :const:`AF_UNIX` socket paths were assumed to use UTF-8 + encoding. - .. versionchanged:: 3.5 - Writable :term:`bytes-like object` is now accepted. + .. versionchanged:: 3.5 + Writable :term:`bytes-like object` is now accepted. .. _host_port: @@ -78,15 +78,15 @@ created. Socket addresses are represented as follows: Python programs. - For :const:`AF_INET6` address family, a four-tuple ``(host, port, flowinfo, - scopeid)`` is used, where *flowinfo* and *scopeid* represent the ``sin6_flowinfo`` + scope_id)`` is used, where *flowinfo* and *scope_id* represent the ``sin6_flowinfo`` and ``sin6_scope_id`` members in :const:`struct sockaddr_in6` in C. For - :mod:`socket` module methods, *flowinfo* and *scopeid* can be omitted just for - backward compatibility. Note, however, omission of *scopeid* can cause problems + :mod:`socket` module methods, *flowinfo* and *scope_id* can be omitted just for + backward compatibility. Note, however, omission of *scope_id* can cause problems in manipulating scoped IPv6 addresses. .. versionchanged:: 3.7 - For multicast addresses (with *scopeid* meaningful) *address* may not contain - ``%scope`` (or ``zone id``) part. This information is superfluous and may + For multicast addresses (with *scope_id* meaningful) *address* may not contain + ``%scope_id`` (or ``zone id``) part. This information is superfluous and may be safely omitted (recommended). - :const:`AF_NETLINK` sockets are represented as pairs ``(pid, groups)``. @@ -118,6 +118,10 @@ created. Socket addresses are represented as follows: - :const:`CAN_ISOTP` protocol require a tuple ``(interface, rx_addr, tx_addr)`` where both additional parameters are unsigned long integer that represent a CAN identifier (standard or extended). + - :const:`CAN_J1939` protocol require a tuple ``(interface, name, pgn, addr)`` + where additional parameters are 64-bit unsigned integer representing the + ECU name, a 32-bit unsigned integer representing the Parameter Group Number + (PGN), and an 8-bit integer representing the address. - A string or a tuple ``(id, unit)`` is used for the :const:`SYSPROTO_CONTROL` protocol of the :const:`PF_SYSTEM` family. The string is the name of a @@ -200,6 +204,23 @@ created. Socket addresses are represented as follows: .. versionadded:: 3.8 +- :const:`IPPROTO_UDPLITE` is a variant of UDP which allows you to specify + what portion of a packet is covered with the checksum. It adds two socket + options that you can change. + ``self.setsockopt(IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV, length)`` will + change what portion of outgoing packets are covered by the checksum and + ``self.setsockopt(IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, length)`` will + filter out packets which cover too little of their data. In both cases + ``length`` should be in ``range(8, 2**16, 8)``. + + Such a socket should be constructed with + ``socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE)`` for IPv4 or + ``socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDPLITE)`` for IPv6. + + .. availability:: Linux >= 2.6.20, FreeBSD >= 10.1-RELEASE + + .. versionadded:: 3.9 + If you use a hostname in the *host* portion of IPv4/v6 socket address, the program may show a nondeterministic behavior, as Python uses the first address returned from the DNS resolution. The socket address will be resolved @@ -391,6 +412,17 @@ Constants .. versionadded:: 3.5 +.. data:: CAN_RAW_JOIN_FILTERS + + Joins the applied CAN filters such that only CAN frames that match all + given CAN filters are passed to user space. + + This constant is documented in the Linux documentation. + + .. availability:: Linux >= 4.1. + + .. versionadded:: 3.9 + .. data:: CAN_ISOTP CAN_ISOTP, in the CAN protocol family, is the ISO-TP (ISO 15765-2) protocol. @@ -400,6 +432,15 @@ Constants .. versionadded:: 3.7 +.. data:: CAN_J1939 + + CAN_J1939, in the CAN protocol family, is the SAE J1939 protocol. + J1939 constants, documented in the Linux documentation. + + .. availability:: Linux >= 5.4. + + .. versionadded:: 3.9 + .. data:: AF_PACKET PF_PACKET @@ -516,7 +557,8 @@ The following functions all create :ref:`socket objects `. default), :const:`SOCK_DGRAM`, :const:`SOCK_RAW` or perhaps one of the other ``SOCK_`` constants. The protocol number is usually zero and may be omitted or in the case where the address family is :const:`AF_CAN` the protocol - should be one of :const:`CAN_RAW`, :const:`CAN_BCM` or :const:`CAN_ISOTP`. + should be one of :const:`CAN_RAW`, :const:`CAN_BCM`, :const:`CAN_ISOTP` or + :const:`CAN_J1939`. If *fileno* is specified, the values for *family*, *type*, and *proto* are auto-detected from the specified file descriptor. Auto-detection can be @@ -560,6 +602,9 @@ The following functions all create :ref:`socket objects `. ``SOCK_NONBLOCK``, but ``sock.type`` will be set to ``socket.SOCK_STREAM``. + .. versionchanged:: 3.9 + The CAN_J1939 protocol was added. + .. function:: socketpair([family[, type[, proto]]]) Build a pair of connected socket objects using the given address family, socket @@ -721,7 +766,7 @@ The :mod:`socket` module also offers various network-related services: :const:`AI_CANONNAME` is part of the *flags* argument; else *canonname* will be empty. *sockaddr* is a tuple describing a socket address, whose format depends on the returned *family* (a ``(address, port)`` 2-tuple for - :const:`AF_INET`, a ``(address, port, flow info, scope id)`` 4-tuple for + :const:`AF_INET`, a ``(address, port, flowinfo, scope_id)`` 4-tuple for :const:`AF_INET6`), and is meant to be passed to the :meth:`socket.connect` method. @@ -742,7 +787,7 @@ The :mod:`socket` module also offers various network-related services: .. versionchanged:: 3.7 for IPv6 multicast addresses, string representing an address will not - contain ``%scope`` part. + contain ``%scope_id`` part. .. function:: getfqdn([name]) @@ -810,8 +855,8 @@ The :mod:`socket` module also offers various network-related services: or numeric address representation in *host*. Similarly, *port* can contain a string port name or a numeric port number. - For IPv6 addresses, ``%scope`` is appended to the host part if *sockaddr* - contains meaningful *scopeid*. Usually this happens for multicast addresses. + For IPv6 addresses, ``%scope_id`` is appended to the host part if *sockaddr* + contains meaningful *scope_id*. Usually this happens for multicast addresses. For more information about *flags* you can consult :manpage:`getnameinfo(3)`. @@ -1046,6 +1091,19 @@ The :mod:`socket` module also offers various network-related services: .. versionchanged:: 3.8 Windows support was added. + .. note:: + + On Windows network interfaces have different names in different contexts + (all names are examples): + + * UUID: ``{FB605B73-AAC2-49A6-9A2F-25416AEA0573}`` + * name: ``ethernet_32770`` + * friendly name: ``vEthernet (nat)`` + * description: ``Hyper-V Virtual Ethernet Adapter`` + + This function returns names of the second form from the list, ``ethernet_32770`` + in this example case. + .. function:: if_nametoindex(if_name) @@ -1060,6 +1118,9 @@ The :mod:`socket` module also offers various network-related services: .. versionchanged:: 3.8 Windows support was added. + .. seealso:: + "Interface name" is a name as documented in :func:`if_nameindex`. + .. function:: if_indextoname(if_index) @@ -1074,6 +1135,9 @@ The :mod:`socket` module also offers various network-related services: .. versionchanged:: 3.8 Windows support was added. + .. seealso:: + "Interface name" is a name as documented in :func:`if_nameindex`. + .. _socket-objects: @@ -1337,7 +1401,7 @@ to sockets. .. versionchanged:: 3.7 For multicast IPv6 address, first item of *address* does not contain - ``%scope`` part anymore. In order to get full IPv6 address use + ``%scope_id`` part anymore. In order to get full IPv6 address use :func:`getnameinfo`. .. method:: socket.recvmsg(bufsize[, ancbufsize[, flags]]) @@ -1569,6 +1633,29 @@ to sockets. .. versionadded:: 3.6 +.. method:: socket.send_fds(sock, buffers, fds[, flags[, address]]) + + Send the list of file descriptors *fds* over an :const:`AF_UNIX` socket. + The *fds* parameter is a sequence of file descriptors. + Consult :meth:`sendmsg` for the documentation of these parameters. + + .. availability:: Unix supporting :meth:`~socket.sendmsg` and :const:`SCM_RIGHTS` mechanism. + + .. versionadded:: 3.9 + +.. method:: socket.recv_fds(sock, bufsize, maxfds[, flags]) + + Receive up to *maxfds* file descriptors. Return ``(msg, list(fds), flags, addr)``. Consult + :meth:`recvmsg` for the documentation of these parameters. + + .. availability:: Unix supporting :meth:`~socket.recvmsg` and :const:`SCM_RIGHTS` mechanism. + + .. versionadded:: 3.9 + + .. note:: + + Any truncated integers at the end of the list of file descriptors. + .. method:: socket.sendfile(file, offset=0, count=None) Send a file until EOF is reached by using high-performance @@ -1627,7 +1714,9 @@ to sockets. .. method:: socket.setsockopt(level, optname, value: int) .. method:: socket.setsockopt(level, optname, value: buffer) + :noindex: .. method:: socket.setsockopt(level, optname, None, optlen: int) + :noindex: .. index:: module: struct diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index 314d3a58e2759a85ba1bb3316e8e490f01cbfe23..2e2e5e9cdae377c4a637d46447f4957dbea2ad78 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -99,10 +99,6 @@ This example uses the iterator form:: .. seealso:: - https://github.com/ghaering/pysqlite - The pysqlite web page -- sqlite3 is developed externally under the name - "pysqlite". - https://www.sqlite.org The SQLite web page; the documentation describes the syntax and the available data types for the supported SQL dialect. @@ -197,7 +193,9 @@ Module functions and constants *detect_types* defaults to 0 (i. e. off, no type detection), you can set it to any combination of :const:`PARSE_DECLTYPES` and :const:`PARSE_COLNAMES` to turn - type detection on. + type detection on. Due to SQLite behaviour, types can't be detected for generated + fields (for example ``max(data)``), even when *detect_types* parameter is set. In + such case, the returned type is :class:`str`. By default, *check_same_thread* is :const:`True` and only the creating thread may use the connection. If set :const:`False`, the returned connection may be shared @@ -543,7 +541,7 @@ Connection Objects con.close() - .. method:: backup(target, *, pages=0, progress=None, name="main", sleep=0.250) + .. method:: backup(target, *, pages=-1, progress=None, name="main", sleep=0.250) This method makes a backup of a SQLite database even while it's being accessed by other clients, or concurrently by the same connection. The copy will be @@ -928,7 +926,7 @@ a class like this:: self.x, self.y = x, y Now you want to store the point in a single SQLite column. First you'll have to -choose one of the supported types first to be used for representing the point. +choose one of the supported types to be used for representing the point. Let's just use str and separate the coordinates using a semicolon. Then you need to give your class a method ``__conform__(self, protocol)`` which must return the converted value. The parameter *protocol* will be :class:`PrepareProtocol`. @@ -1091,19 +1089,6 @@ committed: .. literalinclude:: ../includes/sqlite3/ctx_manager.py -Common issues -------------- - -Multithreading -^^^^^^^^^^^^^^ - -Older SQLite versions had issues with sharing connections between threads. -That's why the Python module disallows sharing connections and cursors between -threads. If you still try to do so, you will get an exception at runtime. - -The only exception is calling the :meth:`~Connection.interrupt` method, which -only makes sense to call from a different thread. - .. rubric:: Footnotes .. [#f1] The sqlite3 module is not built with loadable extension support by diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index ea0f13c4f18b976f1e63e205b6d4ff693f8ed5bd..852091c02ec9a484e5a99f2a5eb16fa88fc76553 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -293,7 +293,7 @@ Random generation Read the Wikipedia article, `Cryptographically secure pseudorandom number generator (CSPRNG) `_, - to get the requirements of a cryptographically generator. + to get the requirements of a cryptographically strong generator. .. versionadded:: 3.3 @@ -615,7 +615,7 @@ Constants Possible value for :attr:`SSLContext.verify_flags`. In this mode, only the peer cert is checked but none of the intermediate CA certificates. The mode requires a valid CRL that is signed by the peer cert's issuer (its direct - ancestor CA). If no proper CRL has has been loaded with + ancestor CA). If no proper CRL has been loaded with :attr:`SSLContext.load_verify_locations`, validation will fail. .. versionadded:: 3.4 @@ -1256,7 +1256,7 @@ SSL sockets also have the following additional methods and attributes: The returned dictionary includes additional X509v3 extension items such as ``crlDistributionPoints``, ``caIssuers`` and ``OCSP`` URIs. - .. versionchanged:: 3.8.1 + .. versionchanged:: 3.9 IPv6 address strings no longer have a trailing new line. .. method:: SSLSocket.cipher() diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index 026f4aa462d3d73d671422900ef5224f3a062639..38a499ab37e890d377ae9f1a29da9470356ba524 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -696,6 +696,16 @@ of applications in statistics. Set *n* to 100 for percentiles which gives the 99 cuts points that separate the normal distribution into 100 equal sized groups. + .. method:: NormalDist.zscore(x) + + Compute the + `Standard Score `_ + describing *x* in terms of the number of standard deviations + above or below the mean of the normal distribution: + ``(x - mean) / stdev``. + + .. versionadded:: 3.9 + Instances of :class:`NormalDist` support addition, subtraction, multiplication and division by a constant. These operations are used for translation and scaling. For example: diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index ccd2f99ccb34f6acf2afd44f2b63af36b6c4d476..0667a60157616575caba643493f523f0415fa48e 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -352,7 +352,7 @@ Notes: The numeric literals accepted include the digits ``0`` to ``9`` or any Unicode equivalent (code points with the ``Nd`` property). - See http://www.unicode.org/Public/12.1.0/ucd/extracted/DerivedNumericType.txt + See https://www.unicode.org/Public/13.0.0/ucd/extracted/DerivedNumericType.txt for a complete list of code points with the ``Nd`` property. @@ -478,7 +478,7 @@ class`. In addition, it provides a few more methods: .. versionadded:: 3.1 -.. method:: int.to_bytes(length, byteorder, \*, signed=False) +.. method:: int.to_bytes(length, byteorder, *, signed=False) Return an array of bytes representing an integer. @@ -510,7 +510,7 @@ class`. In addition, it provides a few more methods: .. versionadded:: 3.2 -.. classmethod:: int.from_bytes(bytes, byteorder, \*, signed=False) +.. classmethod:: int.from_bytes(bytes, byteorder, *, signed=False) Return the integer represented by the given array of bytes. @@ -1558,9 +1558,16 @@ expression support in the :mod:`re` module). :func:`codecs.register_error`, see section :ref:`error-handlers`. For a list of possible encodings, see section :ref:`standard-encodings`. + By default, the *errors* argument is not checked for best performances, but + only used at the first encoding error. Enable the :ref:`Python Development + Mode `, or use a debug build to check *errors*. + .. versionchanged:: 3.1 Support for keyword arguments added. + .. versionchanged:: 3.9 + The *errors* is now checked in development mode and in debug mode. + .. method:: str.endswith(suffix[, start[, end]]) @@ -1775,6 +1782,16 @@ expression support in the :mod:`re` module). Return ``True`` if all cased characters [4]_ in the string are uppercase and there is at least one cased character, ``False`` otherwise. + >>> 'BANANA'.isupper() + True + >>> 'banana'.isupper() + False + >>> 'baNana'.isupper() + False + >>> ' '.isupper() + False + + .. method:: str.join(iterable) @@ -1812,6 +1829,14 @@ expression support in the :mod:`re` module). >>> 'www.example.com'.lstrip('cmowz.') 'example.com' + See :meth:`str.removeprefix` for a method that will remove a single prefix + string rather than all of a set of characters. For example:: + + >>> 'Arthur: three!'.lstrip('Arthur: ') + 'ee!' + >>> 'Arthur: three!'.removeprefix('Arthur: ') + 'three!' + .. staticmethod:: str.maketrans(x[, y[, z]]) @@ -1836,6 +1861,34 @@ expression support in the :mod:`re` module). the string itself, followed by two empty strings. +.. method:: str.removeprefix(prefix, /) + + If the string starts with the *prefix* string, return + ``string[len(prefix):]``. Otherwise, return a copy of the original + string:: + + >>> 'TestHook'.removeprefix('Test') + 'Hook' + >>> 'BaseTestCase'.removeprefix('Test') + 'BaseTestCase' + + .. versionadded:: 3.9 + + +.. method:: str.removesuffix(suffix, /) + + If the string ends with the *suffix* string and that *suffix* is not empty, + return ``string[:-len(suffix)]``. Otherwise, return a copy of the + original string:: + + >>> 'MiscTests'.removesuffix('Tests') + 'Misc' + >>> 'TmpDirMixin'.removesuffix('Tests') + 'TmpDirMixin' + + .. versionadded:: 3.9 + + .. method:: str.replace(old, new[, count]) Return a copy of the string with all occurrences of substring *old* replaced by @@ -1892,6 +1945,13 @@ expression support in the :mod:`re` module). >>> 'mississippi'.rstrip('ipz') 'mississ' + See :meth:`str.removesuffix` for a method that will remove a single suffix + string rather than all of a set of characters. For example:: + + >>> 'Monty Python'.rstrip(' Python') + 'M' + >>> 'Monty Python'.removesuffix(' Python') + 'Monty' .. method:: str.split(sep=None, maxsplit=-1) @@ -2572,6 +2632,50 @@ arbitrary binary data. Also accept an integer in the range 0 to 255 as the subsequence. +.. method:: bytes.removeprefix(prefix, /) + bytearray.removeprefix(prefix, /) + + If the binary data starts with the *prefix* string, return + ``bytes[len(prefix):]``. Otherwise, return a copy of the original + binary data:: + + >>> b'TestHook'.removeprefix(b'Test') + b'Hook' + >>> b'BaseTestCase'.removeprefix(b'Test') + b'BaseTestCase' + + The *prefix* may be any :term:`bytes-like object`. + + .. note:: + + The bytearray version of this method does *not* operate in place - + it always produces a new object, even if no changes were made. + + .. versionadded:: 3.9 + + +.. method:: bytes.removesuffix(suffix, /) + bytearray.removesuffix(suffix, /) + + If the binary data ends with the *suffix* string and that *suffix* is + not empty, return ``bytes[:-len(suffix)]``. Otherwise, return a copy of + the original binary data:: + + >>> b'MiscTests'.removesuffix(b'Tests') + b'Misc' + >>> b'TmpDirMixin'.removesuffix(b'Tests') + b'TmpDirMixin' + + The *suffix* may be any :term:`bytes-like object`. + + .. note:: + + The bytearray version of this method does *not* operate in place - + it always produces a new object, even if no changes were made. + + .. versionadded:: 3.9 + + .. method:: bytes.decode(encoding="utf-8", errors="strict") bytearray.decode(encoding="utf-8", errors="strict") @@ -2583,6 +2687,10 @@ arbitrary binary data. :func:`codecs.register_error`, see section :ref:`error-handlers`. For a list of possible encodings, see section :ref:`standard-encodings`. + By default, the *errors* argument is not checked for best performances, but + only used at the first decoding error. Enable the :ref:`Python Development + Mode `, or use a debug build to check *errors*. + .. note:: Passing the *encoding* argument to :class:`str` allows decoding any @@ -2592,6 +2700,9 @@ arbitrary binary data. .. versionchanged:: 3.1 Added support for keyword arguments. + .. versionchanged:: 3.9 + The *errors* is now checked in development mode and in debug mode. + .. method:: bytes.endswith(suffix[, start[, end]]) bytearray.endswith(suffix[, start[, end]]) @@ -2815,7 +2926,14 @@ produce new objects. b'example.com' The binary sequence of byte values to remove may be any - :term:`bytes-like object`. + :term:`bytes-like object`. See :meth:`~bytes.removeprefix` for a method + that will remove a single prefix string rather than all of a set of + characters. For example:: + + >>> b'Arthur: three!'.lstrip(b'Arthur: ') + b'ee!' + >>> b'Arthur: three!'.removeprefix(b'Arthur: ') + b'three!' .. note:: @@ -2864,7 +2982,14 @@ produce new objects. b'mississ' The binary sequence of byte values to remove may be any - :term:`bytes-like object`. + :term:`bytes-like object`. See :meth:`~bytes.removesuffix` for a method + that will remove a single suffix string rather than all of a set of + characters. For example:: + + >>> b'Monty Python'.rstrip(b' Python') + b'M' + >>> b'Monty Python'.removesuffix(b' Python') + b'Monty' .. note:: @@ -3994,6 +4119,12 @@ The constructors for both classes work the same: objects. If *iterable* is not specified, a new empty set is returned. + Sets can be created by several means: + + * Use a comma-separated list of elements within braces: ``{'jack', 'sjoerd'}`` + * Use a set comprehension: ``{c for c in 'abracadabra' if c not in 'abc'}`` + * Use the type constructor: ``set()``, ``set('foobar')``, ``set(['a', 'b', 'foo'])`` + Instances of :class:`set` and :class:`frozenset` provide the following operations: @@ -4186,6 +4317,14 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098: Return a new dictionary initialized from an optional positional argument and a possibly empty set of keyword arguments. + Dictionaries can be created by several means: + + * Use a comma-separated list of ``key: value`` pairs within braces: + ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098: 'jack', 4127: 'sjoerd'}`` + * Use a dict comprehension: ``{}``, ``{x: x ** 2 for x in range(10)}`` + * Use the type constructor: ``dict()``, + ``dict([('foo', 100), ('bar', 200)])``, ``dict(foo=100, bar=200)`` + If no positional argument is given, an empty dictionary is created. If a positional argument is given and it is a mapping object, a dictionary is created with the same key-value pairs as the mapping object. Otherwise, @@ -4209,7 +4348,8 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098: >>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3])) >>> d = dict([('two', 2), ('one', 1), ('three', 3)]) >>> e = dict({'three': 3, 'one': 1, 'two': 2}) - >>> a == b == c == d == e + >>> f = dict({'one': 1, 'three': 3}, two=2) + >>> a == b == c == d == e == f True Providing keyword arguments as in the first example only works for keys that @@ -4367,6 +4507,22 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098: >>> d.values() == d.values() False + .. describe:: d | other + + Create a new dictionary with the merged keys and values of *d* and + *other*, which must both be dictionaries. The values of *other* take + priority when *d* and *other* share keys. + + .. versionadded:: 3.9 + + .. describe:: d |= other + + Update the dictionary *d* with keys and values from *other*, which may be + either a :term:`mapping` or an :term:`iterable` of key/value pairs. The + values of *other* take priority when *d* and *other* share keys. + + .. versionadded:: 3.9 + Dictionaries compare equal if and only if they have the same ``(key, value)`` pairs (regardless of ordering). Order comparisons ('<', '<=', '>=', '>') raise :exc:`TypeError`. @@ -4575,6 +4731,200 @@ Compared to the overhead of setting up the runtime context, the overhead of a single class dictionary lookup is negligible. +.. _types-genericalias: + +Generic Alias Type +================== + +.. index:: + object: GenericAlias + pair: Generic; Alias + +``GenericAlias`` objects are created by subscripting a class (usually a +container), such as ``list[int]``. They are intended primarily for +:term:`type annotations `. + +Usually, the :ref:`subscription ` of container objects calls the +method :meth:`__getitem__` of the object. However, the subscription of some +containers' classes may call the classmethod :meth:`__class_getitem__` of the +class instead. The classmethod :meth:`__class_getitem__` should return a +``GenericAlias`` object. + +.. note:: + If the :meth:`__getitem__` of the class' metaclass is present, it will take + precedence over the :meth:`__class_getitem__` defined in the class (see + :pep:`560` for more details). + +The ``GenericAlias`` object acts as a proxy for :term:`generic types +`, implementing *parameterized generics* - a specific instance +of a generic which provides the types for container elements. + +The user-exposed type for the ``GenericAlias`` object can be accessed from +:class:`types.GenericAlias` and used for :func:`isinstance` checks. It can +also be used to create ``GenericAlias`` objects directly. + +.. describe:: T[X, Y, ...] + + Creates a ``GenericAlias`` representing a type ``T`` containing elements + of types *X*, *Y*, and more depending on the ``T`` used. + For example, a function expecting a :class:`list` containing + :class:`float` elements:: + + def average(values: list[float]) -> float: + return sum(values) / len(values) + + Another example for :term:`mapping` objects, using a :class:`dict`, which + is a generic type expecting two type parameters representing the key type + and the value type. In this example, the function expects a ``dict`` with + keys of type :class:`str` and values of type :class:`int`:: + + def send_post_request(url: str, body: dict[str, int]) -> None: + ... + +The builtin functions :func:`isinstance` and :func:`issubclass` do not accept +``GenericAlias`` types for their second argument:: + + >>> isinstance([1, 2], list[str]) + Traceback (most recent call last): + File "", line 1, in + TypeError: isinstance() argument 2 cannot be a parameterized generic + +The Python runtime does not enforce :term:`type annotations `. +This extends to generic types and their type parameters. When creating +an object from a ``GenericAlias``, container elements are not checked +against their type. For example, the following code is discouraged, but will +run without errors:: + + >>> t = list[str] + >>> t([1, 2, 3]) + [1, 2, 3] + +Furthermore, parameterized generics erase type parameters during object +creation:: + + >>> t = list[str] + >>> type(t) + + + >>> l = t() + >>> type(l) + + +Calling :func:`repr` or :func:`str` on a generic shows the parameterized type:: + + >>> repr(list[int]) + 'list[int]' + + >>> str(list[int]) + 'list[int]' + +The :meth:`__getitem__` method of generics will raise an exception to disallow +mistakes like ``dict[str][str]``:: + + >>> dict[str][str] + Traceback (most recent call last): + File "", line 1, in + TypeError: There are no type variables left in dict[str] + +However, such expressions are valid when :ref:`type variables ` are +used. The index must have as many elements as there are type variable items +in the ``GenericAlias`` object's :attr:`__args__ `. :: + + >>> from typing import TypeVar + >>> Y = TypeVar('Y') + >>> dict[str, Y][int] + dict[str, int] + + +Standard Generic Collections +---------------------------- + +These standard library collections support parameterized generics. + +* :class:`tuple` +* :class:`list` +* :class:`dict` +* :class:`set` +* :class:`frozenset` +* :class:`type` +* :class:`collections.deque` +* :class:`collections.defaultdict` +* :class:`collections.OrderedDict` +* :class:`collections.Counter` +* :class:`collections.ChainMap` +* :class:`collections.abc.Awaitable` +* :class:`collections.abc.Coroutine` +* :class:`collections.abc.AsyncIterable` +* :class:`collections.abc.AsyncIterator` +* :class:`collections.abc.AsyncGenerator` +* :class:`collections.abc.Iterable` +* :class:`collections.abc.Iterator` +* :class:`collections.abc.Generator` +* :class:`collections.abc.Reversible` +* :class:`collections.abc.Container` +* :class:`collections.abc.Collection` +* :class:`collections.abc.Callable` +* :class:`collections.abc.Set` +* :class:`collections.abc.MutableSet` +* :class:`collections.abc.Mapping` +* :class:`collections.abc.MutableMapping` +* :class:`collections.abc.Sequence` +* :class:`collections.abc.MutableSequence` +* :class:`collections.abc.ByteString` +* :class:`collections.abc.MappingView` +* :class:`collections.abc.KeysView` +* :class:`collections.abc.ItemsView` +* :class:`collections.abc.ValuesView` +* :class:`contextlib.AbstractContextManager` +* :class:`contextlib.AbstractAsyncContextManager` +* :ref:`re.Pattern ` +* :ref:`re.Match ` + + +Special Attributes of Generic Alias +----------------------------------- + +All parameterized generics implement special read-only attributes. + +.. attribute:: genericalias.__origin__ + + This attribute points at the non-parameterized generic class:: + + >>> list[int].__origin__ + + + +.. attribute:: genericalias.__args__ + + This attribute is a :class:`tuple` (possibly of length 1) of generic + types passed to the original :meth:`__class_getitem__` + of the generic container:: + + >>> dict[str, list[int]].__args__ + (, list[int]) + + +.. attribute:: genericalias.__parameters__ + + This attribute is a lazily computed tuple (possibly empty) of unique type + variables found in ``__args__``:: + + >>> from typing import TypeVar + + >>> T = TypeVar('T') + >>> list[T].__parameters__ + (~T,) + + +.. seealso:: + + * :pep:`585` -- "Type Hinting Generics In Standard Collections" + * :meth:`__class_getitem__` -- Used to implement parameterized generics. + * :ref:`generics` -- Generics in the :mod:`typing` module. + +.. versionadded:: 3.9 + + .. _typesother: Other Built-in Types @@ -4846,8 +5196,8 @@ types, where they are relevant. Some of these are not reported by the .. method:: class.__subclasses__ Each class keeps a list of weak references to its immediate subclasses. This - method returns a list of all those references still alive. - Example:: + method returns a list of all those references still alive. The list is in + definition order. Example:: >>> int.__subclasses__() [] diff --git a/Doc/library/string.rst b/Doc/library/string.rst index fa906f799c1082c627d391fb1d9558fa16354ee4..54786d0c2ab0dfb3247f2ea406d3793f0b9a06c6 100644 --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -205,7 +205,7 @@ literal text, it can be escaped by doubling: ``{{`` and ``}}``. The grammar for a replacement field is as follows: - .. productionlist:: sf + .. productionlist:: format-string replacement_field: "{" [`field_name`] ["!" `conversion`] [":" `format_spec`] "}" field_name: arg_name ("." `attribute_name` | "[" `element_index` "]")* arg_name: [`identifier` | `digit`+] @@ -308,7 +308,7 @@ non-empty format specification typically modifies the result. The general form of a *standard format specifier* is: -.. productionlist:: sf +.. productionlist:: format-spec format_spec: [[`fill`]`align`][`sign`][#][0][`width`][`grouping_option`][.`precision`][`type`] fill: align: "<" | ">" | "=" | "^" @@ -384,10 +384,10 @@ following: The ``'#'`` option causes the "alternate form" to be used for the conversion. The alternate form is defined differently for different -types. This option is only valid for integer, float, complex and -Decimal types. For integers, when binary, octal, or hexadecimal output +types. This option is only valid for integer, float and complex +types. For integers, when binary, octal, or hexadecimal output is used, this option adds the prefix respective ``'0b'``, ``'0o'``, or -``'0x'`` to the output value. For floats, complex and Decimal the +``'0x'`` to the output value. For float and complex the alternate form causes the result of the conversion to always contain a decimal-point character, even if no digits follow it. Normally, a decimal-point character appears in the result of these conversions @@ -476,20 +476,36 @@ with the floating point presentation types listed below (except ``'n'`` and ``None``). When doing so, :func:`float` is used to convert the integer to a floating point number before formatting. -The available presentation types for floating point and decimal values are: +The available presentation types for :class:`float` and +:class:`~decimal.Decimal` values are: +---------+----------------------------------------------------------+ | Type | Meaning | +=========+==========================================================+ - | ``'e'`` | Exponent notation. Prints the number in scientific | - | | notation using the letter 'e' to indicate the exponent. | - | | The default precision is ``6``. | + | ``'e'`` | Scientific notation. For a given precision ``p``, | + | | formats the number in scientific notation with the | + | | letter 'e' separating the coefficient from the exponent. | + | | The coefficient has one digit before and ``p`` digits | + | | after the decimal point, for a total of ``p + 1`` | + | | significant digits. With no precision given, uses a | + | | precision of ``6`` digits after the decimal point for | + | | :class:`float`, and shows all coefficient digits | + | | for :class:`~decimal.Decimal`. If no digits follow the | + | | decimal point, the decimal point is also removed unless | + | | the ``#`` option is used. | +---------+----------------------------------------------------------+ - | ``'E'`` | Exponent notation. Same as ``'e'`` except it uses an | - | | upper case 'E' as the separator character. | + | ``'E'`` | Scientific notation. Same as ``'e'`` except it uses | + | | an upper case 'E' as the separator character. | +---------+----------------------------------------------------------+ - | ``'f'`` | Fixed-point notation. Displays the number as a | - | | fixed-point number. The default precision is ``6``. | + | ``'f'`` | Fixed-point notation. For a given precision ``p``, | + | | formats the number as a decimal number with exactly | + | | ``p`` digits following the decimal point. With no | + | | precision given, uses a precision of ``6`` digits after | + | | the decimal point for :class:`float`, and uses a | + | | precision large enough to show all coefficient digits | + | | for :class:`~decimal.Decimal`. If no digits follow the | + | | decimal point, the decimal point is also removed unless | + | | the ``#`` option is used. | +---------+----------------------------------------------------------+ | ``'F'`` | Fixed-point notation. Same as ``'f'``, but converts | | | ``nan`` to ``NAN`` and ``inf`` to ``INF``. | @@ -498,6 +514,8 @@ The available presentation types for floating point and decimal values are: | | this rounds the number to ``p`` significant digits and | | | then formats the result in either fixed-point format | | | or in scientific notation, depending on its magnitude. | + | | A precision of ``0`` is treated as equivalent to a | + | | precision of ``1``. | | | | | | The precise rules are as follows: suppose that the | | | result formatted with presentation type ``'e'`` and | @@ -512,13 +530,19 @@ The available presentation types for floating point and decimal values are: | | removed if there are no remaining digits following it, | | | unless the ``'#'`` option is used. | | | | + | | With no precision given, uses a precision of ``6`` | + | | significant digits for :class:`float`. For | + | | :class:`~decimal.Decimal`, the coefficient of the result | + | | is formed from the coefficient digits of the value; | + | | scientific notation is used for values smaller than | + | | ``1e-6`` in absolute value and values where the place | + | | value of the least significant digit is larger than 1, | + | | and fixed-point notation is used otherwise. | + | | | | | Positive and negative infinity, positive and negative | | | zero, and nans, are formatted as ``inf``, ``-inf``, | | | ``0``, ``-0`` and ``nan`` respectively, regardless of | | | the precision. | - | | | - | | A precision of ``0`` is treated as equivalent to a | - | | precision of ``1``. The default precision is ``6``. | +---------+----------------------------------------------------------+ | ``'G'`` | General format. Same as ``'g'`` except switches to | | | ``'E'`` if the number gets too large. The | @@ -531,12 +555,18 @@ The available presentation types for floating point and decimal values are: | ``'%'`` | Percentage. Multiplies the number by 100 and displays | | | in fixed (``'f'``) format, followed by a percent sign. | +---------+----------------------------------------------------------+ - | None | Similar to ``'g'``, except that fixed-point notation, | - | | when used, has at least one digit past the decimal point.| - | | The default precision is as high as needed to represent | - | | the particular value. The overall effect is to match the | - | | output of :func:`str` as altered by the other format | - | | modifiers. | + | None | For :class:`float` this is the same as ``'g'``, except | + | | that when fixed-point notation is used to format the | + | | result, it always includes at least one digit past the | + | | decimal point. The precision used is as large as needed | + | | to represent the given value faithfully. | + | | | + | | For :class:`~decimal.Decimal`, this is the same as | + | | either ``'g'`` or ``'G'`` depending on the value of | + | | ``context.capitals`` for the current decimal context. | + | | | + | | The overall effect is to match the output of :func:`str` | + | | as altered by the other format modifiers. | +---------+----------------------------------------------------------+ diff --git a/Doc/library/struct.rst b/Doc/library/struct.rst index 56b0a3614df5332da247fe6f77a0bdc9dec7bc3a..eccba20fb8fe7e9bcdfe7a7aa949b951c10cf7c4 100644 --- a/Doc/library/struct.rst +++ b/Doc/library/struct.rst @@ -70,7 +70,7 @@ The module defines the following exception and functions: size required by the format, as reflected by :func:`calcsize`. -.. function:: unpack_from(format, buffer, offset=0) +.. function:: unpack_from(format, /, buffer, offset=0) Unpack from *buffer* starting at position *offset*, according to the format string *format*. The result is a tuple even if it contains exactly one @@ -159,8 +159,8 @@ the :ref:`format-characters` section. Note the difference between ``'@'`` and ``'='``: both use native byte order, but the size and alignment of the latter is standardized. -The form ``'!'`` is available for those poor souls who claim they can't remember -whether network byte order is big-endian or little-endian. +The form ``'!'`` represents the network byte order which is always big-endian +as defined in `IETF RFC 1700 `_. There is no way to indicate non-native byte order (force byte-swapping); use the appropriate choice of ``'<'`` or ``'>'``. @@ -259,7 +259,7 @@ Notes: called to convert the argument to an integer before packing. .. versionchanged:: 3.2 - Use of the :meth:`__index__` method for non-integers is new in 3.2. + Added use of the :meth:`__index__` method for non-integers. (3) The ``'n'`` and ``'N'`` conversion codes are only available for the native @@ -312,7 +312,7 @@ When packing a value ``x`` using one of the integer formats (``'b'``, then :exc:`struct.error` is raised. .. versionchanged:: 3.1 - In 3.0, some of the integer formats wrapped out-of-range values and + Previously, some of the integer formats wrapped out-of-range values and raised :exc:`DeprecationWarning` instead of :exc:`struct.error`. The ``'p'`` format character encodes a "Pascal string", meaning a short @@ -467,3 +467,5 @@ The :mod:`struct` module also defines the following type: .. _half precision format: https://en.wikipedia.org/wiki/Half-precision_floating-point_format .. _ieee 754 standard: https://en.wikipedia.org/wiki/IEEE_floating_point#IEEE_754-2008 + +.. _IETF RFC 1700: https://tools.ietf.org/html/rfc1700 diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index a93a6c186f8d803e23e55853c91a69ba5c1e5294..3150aa60700ee709f4490bac39f0ee5600c86064 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -339,7 +339,8 @@ functions. stderr=None, preexec_fn=None, close_fds=True, shell=False, \ cwd=None, env=None, universal_newlines=None, \ startupinfo=None, creationflags=0, restore_signals=True, \ - start_new_session=False, pass_fds=(), *, \ + start_new_session=False, pass_fds=(), *, group=None, \ + extra_groups=None, user=None, umask=-1, \ encoding=None, errors=None, text=None) Execute a child program in a new process. On POSIX, the class uses @@ -550,6 +551,39 @@ functions. .. versionchanged:: 3.2 *start_new_session* was added. + If *group* is not ``None``, the setregid() system call will be made in the + child process prior to the execution of the subprocess. If the provided + value is a string, it will be looked up via :func:`grp.getgrnam()` and + the value in ``gr_gid`` will be used. If the value is an integer, it + will be passed verbatim. (POSIX only) + + .. availability:: POSIX + .. versionadded:: 3.9 + + If *extra_groups* is not ``None``, the setgroups() system call will be + made in the child process prior to the execution of the subprocess. + Strings provided in *extra_groups* will be looked up via + :func:`grp.getgrnam()` and the values in ``gr_gid`` will be used. + Integer values will be passed verbatim. (POSIX only) + + .. availability:: POSIX + .. versionadded:: 3.9 + + If *user* is not ``None``, the setreuid() system call will be made in the + child process prior to the execution of the subprocess. If the provided + value is a string, it will be looked up via :func:`pwd.getpwnam()` and + the value in ``pw_uid`` will be used. If the value is an integer, it will + be passed verbatim. (POSIX only) + + .. availability:: POSIX + .. versionadded:: 3.9 + + If *umask* is not negative, the umask() system call will be made in the + child process prior to the execution of the subprocess. + + .. availability:: POSIX + .. versionadded:: 3.9 + If *env* is not ``None``, it must be a mapping that defines the environment variables for the new process; these are used instead of the default behavior of inheriting the current process' environment. @@ -747,6 +781,8 @@ Instances of the :class:`Popen` class have the following methods: Sends the signal *signal* to the child. + Do nothing if the process completed. + .. note:: On Windows, SIGTERM is an alias for :meth:`terminate`. CTRL_C_EVENT and @@ -1127,8 +1163,9 @@ calls these functions. The arguments shown above are merely some common ones. The full function signature is largely the same as that of :func:`run` - most arguments are passed directly through to that interface. - However, explicitly passing ``input=None`` to inherit the parent's - standard input file handle is not supported. + One API deviation from :func:`run` behavior exists: passing ``input=None`` + will behave the same as ``input=b''`` (or ``input=''``, depending on other + arguments) rather than using the parent's standard input file handle. By default, this function will return the data as encoded bytes. The actual encoding of the output data may depend on the command being invoked, so the diff --git a/Doc/library/sunau.rst b/Doc/library/sunau.rst index 2064fd7e20bfc2acf616144071d5f88649898d2c..aad6f93b6bff18ebc2f431481fd4d7631ccbbbe1 100644 --- a/Doc/library/sunau.rst +++ b/Doc/library/sunau.rst @@ -59,13 +59,6 @@ The :mod:`sunau` module defines the following functions: or ``'wb'`` returns an :class:`AU_write` object. -.. function:: openfp(file, mode) - - A synonym for :func:`.open`, maintained for backwards compatibility. - - .. deprecated-removed:: 3.7 3.9 - - The :mod:`sunau` module defines the following exception: .. exception:: Error diff --git a/Doc/library/symbol.rst b/Doc/library/symbol.rst index 44996936e2d28f85535ebd61b57e15d515ea6d18..d56600af29d6e2ee0409918a30c2be5326260073 100644 --- a/Doc/library/symbol.rst +++ b/Doc/library/symbol.rst @@ -17,6 +17,11 @@ the definitions of the names in the context of the language grammar. The specific numeric values which the names map to may change between Python versions. +.. warning:: + + The symbol module is deprecated and will be removed in future versions of + Python. + This module also provides one additional data object: diff --git a/Doc/library/symtable.rst b/Doc/library/symtable.rst index 7c6ac4dccf8b76d4ddb8a9f01d5dbac9aa8b4515..e364232247c2004fda1b5534c9658c5e985e1e96 100644 --- a/Doc/library/symtable.rst +++ b/Doc/library/symtable.rst @@ -67,10 +67,6 @@ Examining Symbol Tables Return ``True`` if the block has nested namespaces within it. These can be obtained with :meth:`get_children`. - .. method:: has_exec() - - Return ``True`` if the block uses ``exec``. - .. method:: get_identifiers() Return a list of names of symbols in this table. @@ -160,6 +156,12 @@ Examining Symbol Tables Return ``True`` if the symbol is local to its block. + .. method:: is_annotated() + + Return ``True`` if the symbol is annotated. + + .. versionadded:: 3.6 + .. method:: is_free() Return ``True`` if the symbol is referenced in its block, but not assigned diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index d3473de1292eab8a997100683dc26e35ab16db17..3df529f8100eb8121179c31438727e079a12928b 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -31,16 +31,22 @@ always available. 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. + called first, followed by hooks added in the current interpreter. Hooks + can then log the event, raise an exception to abort the operation, + or terminate the process entirely. .. audit-event:: sys.addaudithook "" sys.addaudithook - Raise an auditing event ``sys.addaudithook`` with no arguments. If any + Calling :func:`sys.addaudithook` will itself raise an auditing event + named ``sys.addaudithook`` with no arguments. If any existing hooks raise an exception derived from :class:`RuntimeError`, the new hook will not be added and the exception suppressed. As a result, callers cannot assume that their hook has been added unless they control all existing hooks. + See the :ref:`audit events table ` for all events raised by + CPython, and :pep:`578` for the original design discussion. + .. versionadded:: 3.8 .. versionchanged:: 3.8.1 @@ -79,14 +85,23 @@ always available. .. index:: single: auditing - Raise 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. + Raise an auditing event and trigger any active auditing hooks. + *event* is a string identifying the event, and *args* may contain + optional arguments with more information about the event. The + number and types of arguments for a given event are considered a + public and stable API and should not be modified between releases. + + For example, one auditing event is named ``os.chdir``. This event has + one argument called *path* that will contain the requested new + working directory. - 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. + :func:`sys.audit` will call the existing auditing hooks, passing + the event name and arguments, and will re-raise the first exception + from any hook. In general, if an exception is raised, it should not + be handled and the process should be terminated as quickly as + possible. This allows hook implementations to decide how to respond + to particular events: they can merely log the event or abort the + operation by raising an exception. Hooks are added using the :func:`sys.addaudithook` or :c:func:`PySys_AddAuditHook` functions. @@ -430,9 +445,9 @@ always available. The :term:`named tuple` *flags* exposes the status of command line flags. The attributes are read only. - ============================= ============================= + ============================= ================================================================ attribute flag - ============================= ============================= + ============================= ================================================================ :const:`debug` :option:`-d` :const:`inspect` :option:`-i` :const:`interactive` :option:`-i` @@ -446,9 +461,9 @@ always available. :const:`bytes_warning` :option:`-b` :const:`quiet` :option:`-q` :const:`hash_randomization` :option:`-R` - :const:`dev_mode` :option:`-X` ``dev`` - :const:`utf8_mode` :option:`-X` ``utf8`` - ============================= ============================= + :const:`dev_mode` :option:`-X dev <-X>` (:ref:`Python Development Mode `) + :const:`utf8_mode` :option:`-X utf8 <-X>` + ============================= ================================================================ .. versionchanged:: 3.2 Added ``quiet`` attribute for the new :option:`-q` flag. @@ -463,8 +478,9 @@ always available. Added ``isolated`` attribute for :option:`-I` ``isolated`` flag. .. versionchanged:: 3.7 - Added ``dev_mode`` attribute for the new :option:`-X` ``dev`` flag - and ``utf8_mode`` attribute for the new :option:`-X` ``utf8`` flag. + Added the ``dev_mode`` attribute for the new :ref:`Python Development + Mode ` and the ``utf8_mode`` attribute for the new :option:`-X` + ``utf8`` flag. .. data:: float_info @@ -483,6 +499,8 @@ always available. +=====================+================+==================================================+ | :const:`epsilon` | DBL_EPSILON | difference between 1.0 and the least value | | | | greater than 1.0 that is representable as a float| + | | | | + | | | See also :func:`math.ulp`. | +---------------------+----------------+--------------------------------------------------+ | :const:`dig` | DBL_DIG | maximum number of decimal digits that can be | | | | faithfully represented in a float; see below | @@ -499,6 +517,10 @@ always available. | | | range of representable finite floats | +---------------------+----------------+--------------------------------------------------+ | :const:`min` | DBL_MIN | minimum representable positive *normalized* float| + | | | | + | | | Use :func:`math.ulp(0.0) ` to get the | + | | | smallest positive *denormalized* representable | + | | | float. | +---------------------+----------------+--------------------------------------------------+ | :const:`min_exp` | DBL_MIN_EXP | minimum integer *e* such that ``radix**(e-1)`` is| | | | a normalized float | @@ -573,14 +595,6 @@ always available. .. versionadded:: 3.7 -.. function:: getcheckinterval() - - Return the interpreter's "check interval"; see :func:`setcheckinterval`. - - .. deprecated:: 3.2 - Use :func:`getswitchinterval` instead. - - .. function:: getdefaultencoding() Return the name of the current default string encoding used by the Unicode @@ -1139,6 +1153,28 @@ always available. system's identity. +.. data:: platlibdir + + Name of the platform-specific library directory. It is used to build the + path of standard library and the paths of installed extension modules. + + It is equal to ``"lib"`` on most platforms. On Fedora and SuSE, it is equal + to ``"lib64"`` on 64-bit platforms which gives the following ``sys.path`` + paths (where ``X.Y`` is the Python ``major.minor`` version): + + * ``/usr/lib64/pythonX.Y/``: + Standard library (like ``os.py`` of the :mod:`os` module) + * ``/usr/lib64/pythonX.Y/lib-dynload/``: + C extension modules of the standard library (like the :mod:`errno` module, + the exact filename is platform specific) + * ``/usr/lib/pythonX.Y/site-packages/`` (always use ``lib``, not + :data:`sys.platlibdir`): Third-party modules + * ``/usr/lib64/pythonX.Y/site-packages/``: + C extension modules of third-party packages + + .. versionadded:: 3.9 + + .. data:: prefix A string giving the site-specific directory prefix where the platform @@ -1173,21 +1209,6 @@ always available. implement a dynamic prompt. -.. function:: setcheckinterval(interval) - - Set the interpreter's "check interval". This integer value determines how often - the interpreter checks for periodic things such as thread switches and signal - handlers. The default is ``100``, meaning the check is performed every 100 - Python virtual instructions. Setting it to a larger value may increase - performance for programs using threads. Setting it to a value ``<=`` 0 checks - every virtual instruction, maximizing responsiveness as well as overhead. - - .. deprecated:: 3.2 - This function doesn't have an effect anymore, as the internal logic for - thread switching and asynchronous tasks has been rewritten. Use - :func:`setswitchinterval` instead. - - .. function:: setdlopenflags(n) Set the flags used by the interpreter for :c:func:`dlopen` calls, such as when @@ -1471,9 +1492,15 @@ always available. for the Windows console, this only applies when :envvar:`PYTHONLEGACYWINDOWSSTDIO` is also set. - * When interactive, ``stdout`` and ``stderr`` streams are line-buffered. - Otherwise, they are block-buffered like regular text files. You can - override this value with the :option:`-u` command-line option. + * When interactive, the ``stdout`` stream is line-buffered. Otherwise, + it is block-buffered like regular text files. The ``stderr`` stream + is line-buffered in both cases. You can make both streams unbuffered + by passing the :option:`-u` command-line option or setting the + :envvar:`PYTHONUNBUFFERED` environment variable. + + .. versionchanged:: 3.9 + Non-interactive ``stderr`` is now line-buffered instead of fully + buffered. .. note:: diff --git a/Doc/library/sysconfig.rst b/Doc/library/sysconfig.rst index 78a1dfce9ae05cd799e1c4b2a30f00384f7d0a29..c9306e9bf9de162c23f6686b951fbe178e000229 100644 --- a/Doc/library/sysconfig.rst +++ b/Doc/library/sysconfig.rst @@ -32,7 +32,7 @@ can be accessed using :func:`get_config_vars` or :func:`get_config_var`. Notice that on Windows, it's a much smaller set. -.. function:: get_config_vars(\*args) +.. function:: get_config_vars(*args) With no arguments, return a dictionary of all configuration variables relevant for the current platform. diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst index d60f1c8a5f2d8b58595dc7af1a8684519c368486..13088a10d77c57603c8c3f882df5164f04f84ded 100644 --- a/Doc/library/tarfile.rst +++ b/Doc/library/tarfile.rst @@ -37,7 +37,7 @@ Some facts and figures: Added support for :mod:`lzma` compression. -.. function:: open(name=None, mode='r', fileobj=None, bufsize=10240, \*\*kwargs) +.. function:: open(name=None, mode='r', fileobj=None, bufsize=10240, **kwargs) Return a :class:`TarFile` object for the pathname *name*. For detailed information on :class:`TarFile` objects and the keyword arguments that are @@ -151,6 +151,7 @@ Some facts and figures: .. class:: TarFile + :noindex: Class for reading and writing tar archives. Do not use this class directly: use :func:`tarfile.open` instead. See :ref:`tarfile-objects`. @@ -159,7 +160,10 @@ Some facts and figures: .. function:: is_tarfile(name) Return :const:`True` if *name* is a tar archive file, that the :mod:`tarfile` - module can read. + module can read. *name* may be a :class:`str`, file, or file-like object. + + .. versionchanged:: 3.9 + Support for file and file-like objects. The :mod:`tarfile` module defines the following exceptions: @@ -441,10 +445,11 @@ be finalized; only the internally used file object will be closed. See the .. method:: TarFile.extractfile(member) - Extract a member from the archive as a file object. *member* may be a filename - or a :class:`TarInfo` object. If *member* is a regular file or a link, an - :class:`io.BufferedReader` object is returned. Otherwise, :const:`None` is - returned. + Extract a member from the archive as a file object. *member* may be + a filename or a :class:`TarInfo` object. If *member* is a regular file or + a link, an :class:`io.BufferedReader` object is returned. For all other + existing members, :const:`None` is returned. If *member* does not appear + in the archive, :exc:`KeyError` is raised. .. versionchanged:: 3.3 Return an :class:`io.BufferedReader` object. diff --git a/Doc/library/tempfile.rst b/Doc/library/tempfile.rst index a59817c1039210913ebf5848ddc2cb6447e1d9dc..f9421da5fe7dfab84e3331fc8d9a4b0b8f186760 100644 --- a/Doc/library/tempfile.rst +++ b/Doc/library/tempfile.rst @@ -31,7 +31,7 @@ is recommended to use keyword arguments for clarity. The module defines the following user-callable items: -.. function:: TemporaryFile(mode='w+b', buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None) +.. function:: TemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None) Return a :term:`file-like object` that can be used as a temporary storage area. The file is created securely, using the same rules as :func:`mkstemp`. It will be destroyed as soon @@ -72,7 +72,7 @@ The module defines the following user-callable items: Added *errors* parameter. -.. function:: NamedTemporaryFile(mode='w+b', buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True, *, errors=None) +.. function:: NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True, *, errors=None) This function operates exactly as :func:`TemporaryFile` does, except that the file is guaranteed to have a visible name in the file system (on @@ -93,7 +93,7 @@ The module defines the following user-callable items: Added *errors* parameter. -.. function:: SpooledTemporaryFile(max_size=0, mode='w+b', buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None) +.. function:: SpooledTemporaryFile(max_size=0, mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None) This function operates exactly as :func:`TemporaryFile` does, except that data is spooled in memory until the file size exceeds *max_size*, or @@ -175,9 +175,8 @@ The module defines the following user-callable items: If you want to force a bytes return value with otherwise default behavior, pass ``suffix=b''``. - If *text* is specified, it indicates whether to open the file in binary - mode (the default) or text mode. On some platforms, this makes no - difference. + If *text* is specified and true, the file is opened in text mode. + Otherwise, (the default) the file is opened in binary mode. :func:`mkstemp` returns a tuple containing an OS-level handle to an open file (as would be returned by :func:`os.open`) and the absolute pathname diff --git a/Doc/library/test.rst b/Doc/library/test.rst index da6a85d340be34feeb5e8ae2a614754a9a30966f..bb1bd29bf698ed690aa362d77f491b62dac9ba9b 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -287,9 +287,65 @@ The :mod:`test.support` module defines the following constants: Set to a filename containing the :data:`FS_NONASCII` character. -.. data:: IPV6_ENABLED +.. data:: LOOPBACK_TIMEOUT + + Timeout in seconds for tests using a network server listening on the network + local loopback interface like ``127.0.0.1``. + + The timeout is long enough to prevent test failure: it takes into account + that the client and the server can run in different threads or even + different processes. + + The timeout should be long enough for :meth:`~socket.socket.connect`, + :meth:`~socket.socket.recv` and :meth:`~socket.socket.send` methods of + :class:`socket.socket`. + + Its default value is 5 seconds. + + See also :data:`INTERNET_TIMEOUT`. + + +.. data:: INTERNET_TIMEOUT + + Timeout in seconds for network requests going to the Internet. + + The timeout is short enough to prevent a test to wait for too long if the + Internet request is blocked for whatever reason. + + Usually, a timeout using :data:`INTERNET_TIMEOUT` should not mark a test as + failed, but skip the test instead: see + :func:`~test.support.socket_helper.transient_internet`. + + Its default value is 1 minute. + + See also :data:`LOOPBACK_TIMEOUT`. + + +.. data:: SHORT_TIMEOUT + + Timeout in seconds to mark a test as failed if the test takes "too long". + + The timeout value depends on the regrtest ``--timeout`` command line option. + + If a test using :data:`SHORT_TIMEOUT` starts to fail randomly on slow + buildbots, use :data:`LONG_TIMEOUT` instead. + + Its default value is 30 seconds. + + +.. data:: LONG_TIMEOUT + + Timeout in seconds to detect when a test hangs. + + It is long enough to reduce the risk of test failure on the slowest Python + buildbots. It should not be used to mark a test as failed if the test takes + "too long". The timeout value depends on the regrtest ``--timeout`` command + line option. + + Its default value is 5 minutes. - Set to ``True`` if IPV6 is enabled on this host, ``False`` otherwise. + See also :data:`LOOPBACK_TIMEOUT`, :data:`INTERNET_TIMEOUT` and + :data:`SHORT_TIMEOUT`. .. data:: SAVEDCWD @@ -367,6 +423,12 @@ The :mod:`test.support` module defines the following constants: Object that is equal to anything. Used to test mixed type comparison. +.. data:: NEVER_EQ + + Object that is not equal to anything (even to :data:`ALWAYS_EQ`). + Used to test mixed type comparison. + + .. data:: LARGEST Object that is greater than anything (except itself). @@ -484,7 +546,7 @@ The :mod:`test.support` module defines the following functions: Define match test with regular expression *patterns*. -.. function:: run_unittest(\*classes) +.. function:: run_unittest(*classes) Execute :class:`unittest.TestCase` subclasses passed to the function. The function scans the classes for methods starting with the prefix ``test_`` @@ -619,13 +681,6 @@ The :mod:`test.support` module defines the following functions: ``sys.stdout`` if it's not set. -.. function:: strip_python_strerr(stderr) - - Strip the *stderr* of a Python process from potential debug output - emitted by the interpreter. This will typically be run on the result of - :meth:`subprocess.Popen.communicate`. - - .. function:: args_from_interpreter_flags() Return a list of command line arguments reproducing the current settings @@ -704,12 +759,6 @@ The :mod:`test.support` module defines the following functions: A context manager that temporarily sets the process umask. -.. function:: transient_internet(resource_name, *, timeout=30.0, errnos=()) - - A context manager that raises :exc:`ResourceDenied` when various issues - with the internet connection manifest themselves as exceptions. - - .. function:: disable_faulthandler() A context manager that replaces ``sys.stderr`` with ``sys.__stderr__``. @@ -765,6 +814,30 @@ The :mod:`test.support` module defines the following functions: target of the "as" clause, if there is one. +.. function:: print_warning(msg) + + Print a warning into :data:`sys.__stderr__`. Format the message as: + ``f"Warning -- {msg}"``. If *msg* is made of multiple lines, add + ``"Warning -- "`` prefix to each line. + + .. versionadded:: 3.9 + + +.. function:: wait_process(pid, *, exitcode, timeout=None) + + Wait until process *pid* completes and check that the process exit code is + *exitcode*. + + Raise an :exc:`AssertionError` if the process exit code is not equal to + *exitcode*. + + If the process runs longer than *timeout* seconds (:data:`SHORT_TIMEOUT` by + default), kill the process and raise an :exc:`AssertionError`. The timeout + feature is not available on Windows. + + .. versionadded:: 3.9 + + .. function:: wait_threads_exit(timeout=60.0) Context manager to wait until all threads created in the ``with`` statement @@ -817,12 +890,6 @@ The :mod:`test.support` module defines the following functions: A decorator for running tests that require support for xattr. -.. decorator:: skip_unless_bind_unix_socket - - A decorator for running tests that require a functional bind() for Unix - sockets. - - .. decorator:: anticipate_failure(condition) A decorator to conditionally mark tests with @@ -1073,31 +1140,6 @@ The :mod:`test.support` module defines the following functions: is raised. -.. function:: bind_port(sock, host=HOST) - - Bind the socket to a free port and return the port number. Relies on - ephemeral ports in order to ensure we are using an unbound port. This is - important as many tests may be running simultaneously, especially in a - buildbot environment. This method raises an exception if the - ``sock.family`` is :const:`~socket.AF_INET` and ``sock.type`` is - :const:`~socket.SOCK_STREAM`, and the socket has - :const:`~socket.SO_REUSEADDR` or :const:`~socket.SO_REUSEPORT` set on it. - Tests should never set these socket options for TCP/IP sockets. - The only case for setting these options is testing multicasting via - multiple UDP sockets. - - Additionally, if the :const:`~socket.SO_EXCLUSIVEADDRUSE` socket option is - available (i.e. on Windows), it will be set on the socket. This will - prevent anyone else from binding to our host/port for the duration of the - test. - - -.. function:: bind_unix_socket(sock, addr) - - Bind a unix socket, raising :exc:`unittest.SkipTest` if - :exc:`PermissionError` is raised. - - .. function:: catch_threading_exception() Context manager catching :class:`threading.Thread` exception using @@ -1159,29 +1201,6 @@ The :mod:`test.support` module defines the following functions: .. versionadded:: 3.8 -.. function:: find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM) - - Returns an unused port that should be suitable for binding. This is - achieved by creating a temporary socket with the same family and type as - the ``sock`` parameter (default is :const:`~socket.AF_INET`, - :const:`~socket.SOCK_STREAM`), - and binding it to the specified host address (defaults to ``0.0.0.0``) - with the port set to 0, eliciting an unused ephemeral port from the OS. - The temporary socket is then closed and deleted, and the ephemeral port is - returned. - - Either this method or :func:`bind_port` should be used for any tests - where a server socket needs to be bound to a particular port for the - duration of the test. - Which one to use depends on whether the calling code is creating a Python - socket, or if an unused port needs to be provided in a constructor - or passed to an external program (i.e. the ``-accept`` argument to - openssl's s_server mode). Always prefer :func:`bind_port` over - :func:`find_unused_port` where possible. Using a hard coded port is - discouraged since it can make multiple instances of the test impossible to - run simultaneously, which is a problem for buildbots. - - .. function:: load_package_tests(pkg_dir, loader, standard_tests, pattern) Generic implementation of the :mod:`unittest` ``load_tests`` protocol for @@ -1385,11 +1404,6 @@ The :mod:`test.support` module defines the following classes: Run *test* and return the result. -.. class:: TestHandler(logging.handlers.BufferingHandler) - - Class for logging support. - - .. class:: FakePath(path) Simple :term:`path-like object`. It implements the :meth:`__fspath__` @@ -1397,6 +1411,84 @@ The :mod:`test.support` module defines the following classes: it will be raised in :meth:`!__fspath__`. +:mod:`test.support.socket_helper` --- Utilities for socket tests +================================================================ + +.. module:: test.support.socket_helper + :synopsis: Support for socket tests. + + +The :mod:`test.support.socket_helper` module provides support for socket tests. + +.. versionadded:: 3.9 + + +.. data:: IPV6_ENABLED + + Set to ``True`` if IPv6 is enabled on this host, ``False`` otherwise. + + +.. function:: find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM) + + Returns an unused port that should be suitable for binding. This is + achieved by creating a temporary socket with the same family and type as + the ``sock`` parameter (default is :const:`~socket.AF_INET`, + :const:`~socket.SOCK_STREAM`), + and binding it to the specified host address (defaults to ``0.0.0.0``) + with the port set to 0, eliciting an unused ephemeral port from the OS. + The temporary socket is then closed and deleted, and the ephemeral port is + returned. + + Either this method or :func:`bind_port` should be used for any tests + where a server socket needs to be bound to a particular port for the + duration of the test. + Which one to use depends on whether the calling code is creating a Python + socket, or if an unused port needs to be provided in a constructor + or passed to an external program (i.e. the ``-accept`` argument to + openssl's s_server mode). Always prefer :func:`bind_port` over + :func:`find_unused_port` where possible. Using a hard coded port is + discouraged since it can make multiple instances of the test impossible to + run simultaneously, which is a problem for buildbots. + + +.. function:: bind_port(sock, host=HOST) + + Bind the socket to a free port and return the port number. Relies on + ephemeral ports in order to ensure we are using an unbound port. This is + important as many tests may be running simultaneously, especially in a + buildbot environment. This method raises an exception if the + ``sock.family`` is :const:`~socket.AF_INET` and ``sock.type`` is + :const:`~socket.SOCK_STREAM`, and the socket has + :const:`~socket.SO_REUSEADDR` or :const:`~socket.SO_REUSEPORT` set on it. + Tests should never set these socket options for TCP/IP sockets. + The only case for setting these options is testing multicasting via + multiple UDP sockets. + + Additionally, if the :const:`~socket.SO_EXCLUSIVEADDRUSE` socket option is + available (i.e. on Windows), it will be set on the socket. This will + prevent anyone else from binding to our host/port for the duration of the + test. + + +.. function:: bind_unix_socket(sock, addr) + + Bind a unix socket, raising :exc:`unittest.SkipTest` if + :exc:`PermissionError` is raised. + + +.. decorator:: skip_unless_bind_unix_socket + + A decorator for running tests that require a functional ``bind()`` for Unix + sockets. + + +.. function:: transient_internet(resource_name, *, timeout=30.0, errnos=()) + + A context manager that raises :exc:`~test.support.ResourceDenied` when + various issues with the internet connection manifest themselves as + exceptions. + + :mod:`test.support.script_helper` --- Utilities for the Python execution tests ============================================================================== @@ -1432,6 +1524,9 @@ script execution tests. in a subprocess. The values can include ``__isolated``, ``__cleanenv``, ``__cwd``, and ``TERM``. + .. versionchanged:: 3.9 + The function no longer strips whitespaces from *stderr*. + .. function:: assert_python_ok(*args, **env_vars) @@ -1445,6 +1540,9 @@ script execution tests. Python is started in isolated mode (command line option ``-I``), except if the ``__isolated`` keyword is set to ``False``. + .. versionchanged:: 3.9 + The function no longer strips whitespaces from *stderr*. + .. function:: assert_python_failure(*args, **env_vars) @@ -1454,6 +1552,9 @@ script execution tests. See :func:`assert_python_ok` for more options. + .. versionchanged:: 3.9 + The function no longer strips whitespaces from *stderr*. + .. function:: spawn_python(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw) @@ -1497,3 +1598,35 @@ script execution tests. containing the *source*. If *compiled* is ``True``, both source files will be compiled and added to the zip package. Return a tuple of the full zip path and the archive name for the zip file. + + +:mod:`test.support.bytecode_helper` --- Support tools for testing correct bytecode generation +============================================================================================= + +.. module:: test.support.bytecode_helper + :synopsis: Support tools for testing correct bytecode generation. + +The :mod:`test.support.bytecode_helper` module provides support for testing +and inspecting bytecode generation. + +.. versionadded:: 3.9 + +The module defines the following class: + +.. class:: BytecodeTestCase(unittest.TestCase) + + This class has custom assertion methods for inspecting bytecode. + +.. method:: BytecodeTestCase.get_disassembly_as_string(co) + + Return the disassembly of *co* as string. + + +.. method:: BytecodeTestCase.assertInBytecode(x, opname, argval=_UNSPECIFIED) + + Return instr if *opname* is found, otherwise throws :exc:`AssertionError`. + + +.. method:: BytecodeTestCase.assertNotInBytecode(x, opname, argval=_UNSPECIFIED) + + Throws :exc:`AssertionError` if *opname* is found. diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index f4b58d3d3aebb142eade32a0dcd4b29bde23c453..f4de3c4e0331a1b8108ff0d1cd5f1b31dfe64e7a 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -395,7 +395,8 @@ since it is impossible to detect the termination of alien threads. .. impl-detail:: - In CPython, due to the :term:`Global Interpreter Lock`, only one thread + In CPython, due to the :term:`Global Interpreter Lock + `, only one thread can execute Python code at once (even though certain performance-oriented libraries might overcome this limitation). If you want your application to make better use of the computational @@ -799,11 +800,14 @@ Semaphores also support the :ref:`context management protocol `. .. versionchanged:: 3.2 The *timeout* parameter is new. - .. method:: release() + .. method:: release(n=1) + + Release a semaphore, incrementing the internal counter by *n*. When it + was zero on entry and other threads are waiting for it to become larger + than zero again, wake up *n* of those threads. - Release a semaphore, incrementing the internal counter by one. When it - was zero on entry and another thread is waiting for it to become larger - than zero again, wake up that thread. + .. versionchanged:: 3.9 + Added the *n* parameter to release multiple waiting threads at once. .. class:: BoundedSemaphore(value=1) diff --git a/Doc/library/time.rst b/Doc/library/time.rst index 6842e9075e1a682fbc014cb0959d4b463d7a3f68..cff6320b526db5601d1d3e36bdd16569d6f9b9a2 100644 --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -774,6 +774,16 @@ These constants are used as parameters for :func:`clock_getres` and .. versionadded:: 3.7 +.. data:: CLOCK_TAI + + `International Atomic Time `_ + + The system must have a current leap second table in order for this to give + the correct answer. PTP or NTP software can maintain a leap second table. + + .. availability:: Linux. + + .. versionadded:: 3.9 .. data:: CLOCK_THREAD_CPUTIME_ID @@ -805,7 +815,6 @@ These constants are used as parameters for :func:`clock_getres` and .. versionadded:: 3.8 - The following constant is the only parameter that can be sent to :func:`clock_settime`. diff --git a/Doc/library/timeit.rst b/Doc/library/timeit.rst index 46fa62c15fc2ef0001b114ea018f333c6706db06..668fcb860cea87bbb1acefceba44f858b097409f 100644 --- a/Doc/library/timeit.rst +++ b/Doc/library/timeit.rst @@ -233,7 +233,7 @@ Where the following options are understood: .. cmdoption:: -u, --unit=U - specify a time unit for timer output; can select nsec, usec, msec, or sec + specify a time unit for timer output; can select nsec, usec, msec, or sec .. versionadded:: 3.5 diff --git a/Doc/library/tk.rst b/Doc/library/tk.rst index 95cd1c7712e7c988379ec0b917d4de112bcbdc36..c6c73f057cab165bb4c190d14c003653d3584eb8 100644 --- a/Doc/library/tk.rst +++ b/Doc/library/tk.rst @@ -33,14 +33,17 @@ alternatives, see the :ref:`other-gui-packages` section. .. toctree:: tkinter.rst + tkinter.colorchooser.rst + tkinter.font.rst + dialog.rst + tkinter.messagebox.rst + tkinter.scrolledtext.rst + tkinter.dnd.rst tkinter.ttk.rst tkinter.tix.rst - tkinter.scrolledtext.rst idle.rst othergui.rst .. Other sections I have in mind are Tkinter internals - Freezing Tkinter applications - - + Freezing Tkinter applications \ No newline at end of file diff --git a/Doc/library/tk_msg.png b/Doc/library/tk_msg.png new file mode 100644 index 0000000000000000000000000000000000000000..c122d8f8ae5ba94f876479caa175a16d8b482ca7 Binary files /dev/null and b/Doc/library/tk_msg.png differ diff --git a/Doc/library/tkinter.colorchooser.rst b/Doc/library/tkinter.colorchooser.rst new file mode 100644 index 0000000000000000000000000000000000000000..60f4d707270d64d6928ca2d32998920b38914a97 --- /dev/null +++ b/Doc/library/tkinter.colorchooser.rst @@ -0,0 +1,29 @@ +:mod:`tkinter.colorchooser` --- Color choosing dialog +===================================================== + +.. module:: tkinter.colorchooser + :platform: Tk + :synopsis: Color choosing dialog + +**Source code:** :source:`Lib/tkinter/colorchooser.py` + +-------------- + +The :mod:`tkinter.colorchooser` module provides the :class:`Chooser` class +as an interface to the native color picker dialog. ``Chooser`` implements +a modal color choosing dialog window. The ``Chooser`` class inherits from +the :class:`~tkinter.commondialog.Dialog` class. + +.. class:: Chooser(master=None, **options) + +.. function:: askcolor(color=None, **options) + + Create a color choosing dialog. A call to this method will show the window, + wait for the user to make a selection, and return the selected color (or + ``None``) to the caller. + + +.. seealso:: + + Module :mod:`tkinter.commondialog` + Tkinter standard dialog module \ No newline at end of file diff --git a/Doc/library/tkinter.dnd.rst b/Doc/library/tkinter.dnd.rst new file mode 100644 index 0000000000000000000000000000000000000000..6c11c739e1fa111af7957fcd2bf93aadd6e0fbb1 --- /dev/null +++ b/Doc/library/tkinter.dnd.rst @@ -0,0 +1,64 @@ +:mod:`tkinter.dnd` --- Drag and drop support +============================================ + +.. module:: tkinter.dnd + :platform: Tk + :synopsis: Tkinter drag-and-drop interface + +**Source code:** :source:`Lib/tkinter/dnd.py` + +-------------- + +.. note:: This is experimental and due to be deprecated when it is replaced + with the Tk DND. + +The :mod:`tkinter.dnd` module provides drag-and-drop support for objects within +a single application, within the same window or between windows. To enable an +object to be dragged, you must create an event binding for it that starts the +drag-and-drop process. Typically, you bind a ButtonPress event to a callback +function that you write (see :ref:`Bindings-and-Events`). The function should +call :func:`dnd_start`, where 'source' is the object to be dragged, and 'event' +is the event that invoked the call (the argument to your callback function). + +Selection of a target object occurs as follows: + +#. Top-down search of area under mouse for target widget + + * Target widget should have a callable *dnd_accept* attribute + * If *dnd_accept* is not present or returns None, search moves to parent widget + * If no target widget is found, then the target object is None + +2. Call to *.dnd_leave(source, event)* +#. Call to *.dnd_enter(source, event)* +#. Call to *.dnd_commit(source, event)* to notify of drop +#. Call to *.dnd_end(target, event)* to signal end of drag-and-drop + + +.. class:: DndHandler(source, event) + + The *DndHandler* class handles drag-and-drop events tracking Motion and + ButtonRelease events on the root of the event widget. + + .. method:: cancel(event=None) + + Cancel the drag-and-drop process. + + .. method:: finish(event, commit=0) + + Execute end of drag-and-drop functions. + + .. method:: on_motion(event) + + Inspect area below mouse for target objects while drag is performed. + + .. method:: on_release(event) + + Signal end of drag when the release pattern is triggered. + +.. function:: dnd_start(source, event) + + Factory function for drag-and-drop process. + +.. seealso:: + + :ref:`Bindings-and-Events` \ No newline at end of file diff --git a/Doc/library/tkinter.font.rst b/Doc/library/tkinter.font.rst new file mode 100644 index 0000000000000000000000000000000000000000..b0f4505e9e3c69280fb14816cba22f2147e572f5 --- /dev/null +++ b/Doc/library/tkinter.font.rst @@ -0,0 +1,96 @@ +:mod:`tkinter.font` --- Tkinter font wrapper +============================================ + +.. module:: tkinter.font + :platform: Tk + :synopsis: Tkinter font-wrapping class + +**Source code:** :source:`Lib/tkinter/font.py` + +-------------- + +The :mod:`tkinter.font` module provides the :class:`Font` class for creating +and using named fonts. + +The different font weights and slants are: + +.. data:: NORMAL + BOLD + ITALIC + ROMAN + +.. class:: Font(root=None, font=None, name=None, exists=False, **options) + + The :class:`Font` class represents a named font. *Font* instances are given + unique names and can be specified by their family, size, and style + configuration. Named fonts are Tk's method of creating and identifying + fonts as a single object, rather than specifying a font by its attributes + with each occurrence. + + arguments: + + | *font* - font specifier tuple (family, size, options) + | *name* - unique font name + | *exists* - self points to existing named font if true + + additional keyword options (ignored if *font* is specified): + + | *family* - font family i.e. Courier, Times + | *size* - font size + | If *size* is positive it is interpreted as size in points. + | If *size* is a negative number its absolute value is treated + | as size in pixels. + | *weight* - font emphasis (NORMAL, BOLD) + | *slant* - ROMAN, ITALIC + | *underline* - font underlining (0 - none, 1 - underline) + | *overstrike* - font strikeout (0 - none, 1 - strikeout) + + .. method:: actual(option=None, displayof=None) + + Return the attributes of the font. + + .. method:: cget(option) + + Retrieve an attribute of the font. + + .. method:: config(**options) + + Modify attributes of the font. + + .. method:: copy() + + Return new instance of the current font. + + .. method:: measure(text, displayof=None) + + Return amount of space the text would occupy on the specified display + when formatted in the current font. If no display is specified then the + main application window is assumed. + + .. method:: metrics(*options, **kw) + + Return font-specific data. + Options include: + + *ascent* - distance between baseline and highest point that a + character of the font can occupy + + *descent* - distance between baseline and lowest point that a + character of the font can occupy + + *linespace* - minimum vertical separation necessary between any two + characters of the font that ensures no vertical overlap between lines. + + *fixed* - 1 if font is fixed-width else 0 + +.. function:: families(root=None, displayof=None) + + Return the different font families. + +.. function:: names(root=None) + + Return the names of defined fonts. + +.. function:: nametofont(name) + + Return a :class:`Font` representation of a tk named font. \ No newline at end of file diff --git a/Doc/library/tkinter.messagebox.rst b/Doc/library/tkinter.messagebox.rst new file mode 100644 index 0000000000000000000000000000000000000000..872e72f7a7e2b85e1a09589698050eea8003290d --- /dev/null +++ b/Doc/library/tkinter.messagebox.rst @@ -0,0 +1,39 @@ +:mod:`tkinter.messagebox` --- Tkinter message prompts +===================================================== + +.. module:: tkinter.messagebox + :platform: Tk + :synopsis: Various types of alert dialogs + +**Source code:** :source:`Lib/tkinter/messagebox.py` + +-------------- + +The :mod:`tkinter.messagebox` module provides a template base class as well as +a variety of convenience methods for commonly used configurations. The message +boxes are modal and will return a subset of (True, False, OK, None, Yes, No) based on +the user's selection. Common message box styles and layouts include but are not +limited to: + +.. figure:: tk_msg.png + +.. class:: Message(master=None, **options) + + Create a default information message box. + +**Information message box** + +.. method:: showinfo(title=None, message=None, **options) + +**Warning message boxes** + +.. method:: showwarning(title=None, message=None, **options) + showerror(title=None, message=None, **options) + +**Question message boxes** + +.. method:: askquestion(title=None, message=None, **options) + askokcancel(title=None, message=None, **options) + askretrycancel(title=None, message=None, **options) + askyesno(title=None, message=None, **options) + askyesnocancel(title=None, message=None, **options) \ No newline at end of file diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst index e1fc051d9597c6ffea75e01849f3fa97bbe93752..7739f2f60a7980c88834751539b361921641629a 100644 --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -31,7 +31,7 @@ installed, so you can read the Tcl/Tk documentation specific to that version. `TKDocs `_ Extensive tutorial plus friendlier widget pages for some of the widgets. - `Tkinter 8.5 reference: a GUI for Python `_ + `Tkinter 8.5 reference: a GUI for Python `_ On-line reference material. `Tkinter docs from effbot `_ @@ -109,9 +109,6 @@ Or, more often:: Other modules that provide Tk support include: -:mod:`tkinter.scrolledtext` - Text widget with a vertical scroll bar built in. - :mod:`tkinter.colorchooser` Dialog to let the user choose a color. @@ -127,6 +124,9 @@ Other modules that provide Tk support include: :mod:`tkinter.messagebox` Access to standard Tk dialog boxes. +:mod:`tkinter.scrolledtext` + Text widget with a vertical scroll bar built in. + :mod:`tkinter.simpledialog` Basic dialogs and convenience functions. @@ -464,12 +464,11 @@ The Packer .. index:: single: packing (widgets) The packer is one of Tk's geometry-management mechanisms. Geometry managers -are used to specify the relative positioning of the positioning of widgets -within their container - their mutual *master*. In contrast to the more -cumbersome *placer* (which is used less commonly, and we do not cover here), the -packer takes qualitative relationship specification - *above*, *to the left of*, -*filling*, etc - and works everything out to determine the exact placement -coordinates for you. +are used to specify the relative positioning of widgets within their container - +their mutual *master*. In contrast to the more cumbersome *placer* (which is +used less commonly, and we do not cover here), the packer takes qualitative +relationship specification - *above*, *to the left of*, *filling*, etc - and +works everything out to determine the exact placement coordinates for you. The size of any *master* widget is determined by the size of the "slave widgets" inside. The packer is used to control where slave widgets appear inside the @@ -542,31 +541,35 @@ the variable, with no further intervention on your part. For example:: - class App(Frame): - def __init__(self, master=None): + import tkinter as tk + + class App(tk.Frame): + def __init__(self, master): super().__init__(master) self.pack() - self.entrythingy = Entry() + self.entrythingy = tk.Entry() self.entrythingy.pack() - # here is the application variable - self.contents = StringVar() - # set it to some value + # Create the application variable. + self.contents = tk.StringVar() + # Set it to some value. self.contents.set("this is a variable") - # tell the entry widget to watch this variable + # Tell the entry widget to watch this variable. self.entrythingy["textvariable"] = self.contents - # and here we get a callback when the user hits return. - # we will have the program print out the value of the - # application variable when the user hits return + # Define a callback for when the user hits return. + # It prints the current value of the variable. self.entrythingy.bind('', - self.print_contents) + self.print_contents) def print_contents(self, event): - print("hi. contents of entry is now ---->", + print("Hi. The current entry content is:", self.contents.get()) + root = tk.Tk() + myapp = App(root) + myapp.mainloop() The Window Manager ^^^^^^^^^^^^^^^^^^ @@ -680,9 +683,10 @@ scrollcommand This is almost always the :meth:`!set` method of some scrollbar widget, but can be any widget method that takes a single argument. -wrap: +wrap Must be one of: ``"none"``, ``"char"``, or ``"word"``. +.. _Bindings-and-Events: Bindings and Events ^^^^^^^^^^^^^^^^^^^ diff --git a/Doc/library/tkinter.scrolledtext.rst b/Doc/library/tkinter.scrolledtext.rst index 138720e4785f6ba5c637d1771cd5c4f83cc355c9..d20365baa38690a084a3eaba4a31497f9a01c49d 100644 --- a/Doc/library/tkinter.scrolledtext.rst +++ b/Doc/library/tkinter.scrolledtext.rst @@ -14,8 +14,7 @@ The :mod:`tkinter.scrolledtext` module provides a class of the same name which implements a basic text widget which has a vertical scroll bar configured to do the "right thing." Using the :class:`ScrolledText` class is a lot easier than -setting up a text widget and scroll bar directly. The constructor is the same -as that of the :class:`tkinter.Text` class. +setting up a text widget and scroll bar directly. The text widget and scrollbar are packed together in a :class:`Frame`, and the methods of the :class:`Grid` and :class:`Pack` geometry managers are acquired @@ -25,12 +24,14 @@ be used directly to achieve most normal geometry management behavior. Should more specific control be necessary, the following attributes are available: +.. class:: ScrolledText(master=None, **kw) -.. attribute:: ScrolledText.frame - The frame which surrounds the text and scroll bar widgets. + .. attribute:: frame + The frame which surrounds the text and scroll bar widgets. -.. attribute:: ScrolledText.vbar - The scroll bar widget. + .. attribute:: vbar + + The scroll bar widget. diff --git a/Doc/library/token.rst b/Doc/library/token.rst index dab8f0fa9b64fcf348dba3044e8bfef498c63b2a..7f598cd38d7f8c1deacc4008d6294346e63042dc 100644 --- a/Doc/library/token.rst +++ b/Doc/library/token.rst @@ -70,6 +70,7 @@ the :mod:`tokenize` module. .. data:: TYPE_COMMENT + :noindex: Token value indicating that a type comment was recognized. Such tokens are only produced when :func:`ast.parse()` is invoked with diff --git a/Doc/library/trace.rst b/Doc/library/trace.rst index 85fec6830006c7e763f8e49f2bf61e3e0f2fc1f7..40cf198f1287d78f378d454e5f9560b382c33b4a 100644 --- a/Doc/library/trace.rst +++ b/Doc/library/trace.rst @@ -153,47 +153,47 @@ Programmatic Interface count information. *timing* enables a timestamp relative to when tracing was started to be displayed. - .. method:: run(cmd) + .. method:: run(cmd) - Execute the command and gather statistics from the execution with - the current tracing parameters. *cmd* must be a string or code object, - suitable for passing into :func:`exec`. + Execute the command and gather statistics from the execution with + the current tracing parameters. *cmd* must be a string or code object, + suitable for passing into :func:`exec`. - .. method:: runctx(cmd, globals=None, locals=None) + .. method:: runctx(cmd, globals=None, locals=None) - Execute the command and gather statistics from the execution with the - current tracing parameters, in the defined global and local - environments. If not defined, *globals* and *locals* default to empty - dictionaries. + Execute the command and gather statistics from the execution with the + current tracing parameters, in the defined global and local + environments. If not defined, *globals* and *locals* default to empty + dictionaries. - .. method:: runfunc(func, *args, **kwds) + .. method:: runfunc(func, /, *args, **kwds) - Call *func* with the given arguments under control of the :class:`Trace` - object with the current tracing parameters. + Call *func* with the given arguments under control of the :class:`Trace` + object with the current tracing parameters. - .. method:: results() + .. method:: results() - Return a :class:`CoverageResults` object that contains the cumulative - results of all previous calls to ``run``, ``runctx`` and ``runfunc`` - for the given :class:`Trace` instance. Does not reset the accumulated - trace results. + Return a :class:`CoverageResults` object that contains the cumulative + results of all previous calls to ``run``, ``runctx`` and ``runfunc`` + for the given :class:`Trace` instance. Does not reset the accumulated + trace results. .. class:: CoverageResults A container for coverage results, created by :meth:`Trace.results`. Should not be created directly by the user. - .. method:: update(other) + .. method:: update(other) - Merge in data from another :class:`CoverageResults` object. + Merge in data from another :class:`CoverageResults` object. - .. method:: write_results(show_missing=True, summary=False, coverdir=None) + .. method:: write_results(show_missing=True, summary=False, coverdir=None) - Write coverage results. Set *show_missing* to show lines that had no - hits. Set *summary* to include in the output the coverage summary per - module. *coverdir* specifies the directory into which the coverage - result files will be output. If ``None``, the results for each source - file are placed in its directory. + Write coverage results. Set *show_missing* to show lines that had no + hits. Set *summary* to include in the output the coverage summary per + module. *coverdir* specifies the directory into which the coverage + result files will be output. If ``None``, the results for each source + file are placed in its directory. A simple example demonstrating the use of the programmatic interface:: diff --git a/Doc/library/tracemalloc.rst b/Doc/library/tracemalloc.rst index 000c0ee9405901672aac648c5654b44fdcd16f11..20f668c72820282bf31f896f01e1f59305dd1951 100644 --- a/Doc/library/tracemalloc.rst +++ b/Doc/library/tracemalloc.rst @@ -249,6 +249,47 @@ Example of output of the Python test suite:: See :meth:`Snapshot.statistics` for more options. +Record the current and peak size of all traced memory blocks +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The following code computes two sums like ``0 + 1 + 2 + ...`` inefficiently, by +creating a list of those numbers. This list consumes a lot of memory +temporarily. We can use :func:`get_traced_memory` and :func:`reset_peak` to +observe the small memory usage after the sum is computed as well as the peak +memory usage during the computations:: + + import tracemalloc + + tracemalloc.start() + + # Example code: compute a sum with a large temporary list + large_sum = sum(list(range(100000))) + + first_size, first_peak = tracemalloc.get_traced_memory() + + tracemalloc.reset_peak() + + # Example code: compute a sum with a small temporary list + small_sum = sum(list(range(1000))) + + second_size, second_peak = tracemalloc.get_traced_memory() + + print(f"{first_size=}, {first_peak=}") + print(f"{second_size=}, {second_peak=}") + +Output:: + + first_size=664, first_peak=3592984 + second_size=804, second_peak=29704 + +Using :func:`reset_peak` ensured we could accurately record the peak during the +computation of ``small_sum``, even though it is much smaller than the overall +peak size of memory blocks since the :func:`start` call. Without the call to +:func:`reset_peak`, ``second_peak`` would still be the peak from the +computation ``large_sum`` (that is, equal to ``first_peak``). In this case, +both peaks are much higher than the final memory usage, and which suggests we +could optimise (by removing the unnecessary call to :class:`list`, and writing +``sum(range(...))``). API --- @@ -289,6 +330,24 @@ Functions :mod:`tracemalloc` module as a tuple: ``(current: int, peak: int)``. +.. function:: reset_peak() + + Set the peak size of memory blocks traced by the :mod:`tracemalloc` module + to the current size. + + Do nothing if the :mod:`tracemalloc` module is not tracing memory + allocations. + + This function only modifies the recorded peak size, and does not modify or + clear any traces, unlike :func:`clear_traces`. Snapshots taken with + :func:`take_snapshot` before a call to :func:`reset_peak` can be + meaningfully compared to snapshots taken after the call. + + See also :func:`get_traced_memory`. + + .. versionadded:: 3.9 + + .. function:: get_tracemalloc_memory() Get the memory usage in bytes of the :mod:`tracemalloc` module used to store @@ -311,6 +370,9 @@ Functions frames. By default, a trace of a memory block only stores the most recent frame: the limit is ``1``. *nframe* must be greater or equal to ``1``. + You can still read the original number of total frames that composed the + traceback by looking at the :attr:`Traceback.total_nframe` attribute. + Storing more than ``1`` frame is only useful to compute statistics grouped by ``'traceback'`` or to compute cumulative statistics: see the :meth:`Snapshot.compare_to` and :meth:`Snapshot.statistics` methods. @@ -657,6 +719,9 @@ Traceback When a snapshot is taken, tracebacks of traces are limited to :func:`get_traceback_limit` frames. See the :func:`take_snapshot` function. + The original number of frames of the traceback is stored in the + :attr:`Traceback.total_nframe` attribute. That allows to know if a traceback + has been truncated by the traceback limit. The :attr:`Trace.traceback` attribute is an instance of :class:`Traceback` instance. @@ -664,6 +729,15 @@ Traceback .. versionchanged:: 3.7 Frames are now sorted from the oldest to the most recent, instead of most recent to oldest. + .. attribute:: total_nframe + + Total number of frames that composed the traceback before truncation. + This attribute can be set to ``None`` if the information is not + available. + + .. versionchanged:: 3.9 + The :attr:`Traceback.total_nframe` attribute was added. + .. method:: format(limit=None, most_recent_first=False) Format the traceback as a list of lines with newlines. Use the diff --git a/Doc/library/turtle.rst b/Doc/library/turtle.rst index fed85045435b1b614f84d3a917f2102876fef133..6a9d61916ad1a584cc069ba29f3d7d50dbd885ea 100644 --- a/Doc/library/turtle.rst +++ b/Doc/library/turtle.rst @@ -662,7 +662,7 @@ Tell Turtle's state Return the angle between the line from turtle position to position specified by (x,y), the vector or the other turtle. This depends on the turtle's start - orientation which depends on the mode - "standard"/"world" or "logo"). + orientation which depends on the mode - "standard"/"world" or "logo". .. doctest:: :skipif: _tkinter is None @@ -913,8 +913,8 @@ Color control Set pencolor to the RGB color represented by *r*, *g*, and *b*. Each of *r*, *g*, and *b* must be in the range 0..colormode. - If turtleshape is a polygon, the outline of that polygon is drawn with the - newly set pencolor. + If turtleshape is a polygon, the outline of that polygon is drawn with the + newly set pencolor. .. doctest:: :skipif: _tkinter is None @@ -962,8 +962,8 @@ Color control Set fillcolor to the RGB color represented by *r*, *g*, and *b*. Each of *r*, *g*, and *b* must be in the range 0..colormode. - If turtleshape is a polygon, the interior of that polygon is drawn - with the newly set fillcolor. + If turtleshape is a polygon, the interior of that polygon is drawn + with the newly set fillcolor. .. doctest:: :skipif: _tkinter is None @@ -1001,8 +1001,8 @@ Color control Equivalent to ``pencolor(colorstring1)`` and ``fillcolor(colorstring2)`` and analogously if the other input format is used. - If turtleshape is a polygon, outline and interior of that polygon is drawn - with the newly set colors. + If turtleshape is a polygon, outline and interior of that polygon is drawn + with the newly set colors. .. doctest:: :skipif: _tkinter is None @@ -1069,6 +1069,7 @@ More drawing control ~~~~~~~~~~~~~~~~~~~~ .. function:: reset() + :noindex: Delete the turtle's drawings from the screen, re-center the turtle and set variables to the default values. @@ -1090,6 +1091,7 @@ More drawing control .. function:: clear() + :noindex: Delete the turtle's drawings from the screen. Do not move turtle. State and position of the turtle as well as drawings of other turtles are not affected. @@ -1103,7 +1105,7 @@ More drawing control :param font: a triple (fontname, fontsize, fonttype) Write text - the string representation of *arg* - at the current turtle - position according to *align* ("left", "center" or right") and with the given + position according to *align* ("left", "center" or "right") and with the given font. If *move* is true, the pen is moved to the bottom-right corner of the text. By default, *move* is ``False``. @@ -1190,7 +1192,7 @@ Appearance :func:`shapesize`. - "noresize": no adaption of the turtle's appearance takes place. - resizemode("user") is called by :func:`shapesize` when used with arguments. + ``resizemode("user")`` is called by :func:`shapesize` when used with arguments. .. doctest:: :skipif: _tkinter is None @@ -1328,7 +1330,7 @@ Appearance matrix as a tuple of 4 elements. Otherwise set the given elements and transform the turtleshape according to the matrix consisting of first row t11, t12 and - second row t21, 22. The determinant t11 * t22 - t12 * t21 must not be + second row t21, t22. The determinant t11 * t22 - t12 * t21 must not be zero, otherwise an error is raised. Modify stretchfactor, shearfactor and tiltangle according to the given matrix. @@ -1362,6 +1364,7 @@ Using events ------------ .. function:: onclick(fun, btn=1, add=None) + :noindex: :param fun: a function with two arguments which will be called with the coordinates of the clicked point on the canvas @@ -1510,7 +1513,7 @@ Special Turtle methods :param size: an integer or ``None`` - Set or disable undobuffer. If *size* is an integer an empty undobuffer of + Set or disable undobuffer. If *size* is an integer, an empty undobuffer of given size is installed. *size* gives the maximum number of turtle actions that can be undone by the :func:`undo` method/function. If *size* is ``None``, the undobuffer is disabled. @@ -1818,7 +1821,7 @@ Using screen events existing bindings are removed. Example for a TurtleScreen instance named ``screen`` and a Turtle instance - named turtle: + named ``turtle``: .. doctest:: :skipif: _tkinter is None @@ -2045,7 +2048,7 @@ Methods specific to Screen, not inherited from TurtleScreen .. function:: exitonclick() - Bind bye() method to mouse clicks on the Screen. + Bind ``bye()`` method to mouse clicks on the Screen. If the value "using_IDLE" in the configuration dictionary is ``False`` diff --git a/Doc/library/types.rst b/Doc/library/types.rst index 3529c2b0edb896630fdf6c9a78ddff033f9114b3..d83d9667ba3a7ca761bde03060a611ee552733e7 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -109,6 +109,11 @@ Standard names are defined for the following types: The type of user-defined functions and functions created by :keyword:`lambda` expressions. + .. audit-event:: function.__new__ code types.FunctionType + + The audit event only occurs for direct instantiation of function objects, + and is not raised for normal compilation. + .. data:: GeneratorType @@ -138,10 +143,11 @@ Standard names are defined for the following types: The type for code objects such as returned by :func:`compile`. - .. audit-event:: code.__new__ code,filename,name,argcount,posonlyargcount,kwonlyargcount,nlocals,stacksize,flags CodeType + .. audit-event:: code.__new__ code,filename,name,argcount,posonlyargcount,kwonlyargcount,nlocals,stacksize,flags types.CodeType Note that the audited arguments may not match the names or positions - required by the initializer. + required by the initializer. The audit event only occurs for direct + instantiation of code objects, and is not raised for normal compilation. .. method:: CodeType.replace(**kwargs) @@ -236,6 +242,28 @@ Standard names are defined for the following types: Defaults to ``None``. Previously the attribute was optional. +.. class:: GenericAlias(t_origin, t_args) + + The type of :ref:`parameterized generics ` such as + ``list[int]``. + + ``t_origin`` should be a non-parameterized generic class, such as ``list``, + ``tuple`` or ``dict``. ``t_args`` should be a :class:`tuple` (possibly of + length 1) of types which parameterize ``t_origin``:: + + >>> from types import GenericAlias + + >>> list[int] == GenericAlias(list, (int,)) + True + >>> dict[str, int] == GenericAlias(dict, (str, int)) + True + + .. versionadded:: 3.9 + + .. versionchanged:: 3.9.2 + This type can now be subclassed. + + .. class:: TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno) The type of traceback objects such as found in ``sys.exc_info()[2]``. @@ -282,6 +310,11 @@ Standard names are defined for the following types: .. versionadded:: 3.3 + .. versionchanged:: 3.9 + + Updated to support the new union (``|``) operator from :pep:`584`, which + simply delegates to the underlying mapping. + .. describe:: key in proxy Return ``True`` if the underlying mapping has a key *key*, else @@ -324,6 +357,12 @@ Standard names are defined for the following types: Return a new view of the underlying mapping's values. + .. describe:: reversed(proxy) + + Return a reverse iterator over the keys of the underlying mapping. + + .. versionadded:: 3.9 + Additional Utility Classes and Functions ---------------------------------------- @@ -344,12 +383,13 @@ Additional Utility Classes and Functions self.__dict__.update(kwargs) def __repr__(self): - keys = sorted(self.__dict__) - items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys) + items = (f"{k}={v!r}" for k, v in self.__dict__.items()) return "{}({})".format(type(self).__name__, ", ".join(items)) def __eq__(self, other): - return self.__dict__ == other.__dict__ + if isinstance(self, SimpleNamespace) and isinstance(other, SimpleNamespace): + return self.__dict__ == other.__dict__ + return NotImplemented ``SimpleNamespace`` may be useful as a replacement for ``class NS: pass``. However, for a structured record type use :func:`~collections.namedtuple` @@ -357,6 +397,9 @@ Additional Utility Classes and Functions .. versionadded:: 3.3 + .. versionchanged:: 3.9 + Attribute order in the repr changed from alphabetical to insertion (like + ``dict``). .. function:: DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None) @@ -368,7 +411,7 @@ Additional Utility Classes and Functions class's __getattr__ method; this is done by raising AttributeError. This allows one to have properties active on an instance, and have virtual - attributes on the class with the same name (see Enum for an example). + attributes on the class with the same name (see :class:`enum.Enum` for an example). .. versionadded:: 3.4 diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 1467276d0141d0cfbcd78a4df06dcb35b4cad1d3..688564f1d24f5199579232869b4a27d5bb5a7a3f 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1,3 +1,4 @@ +======================================== :mod:`typing` --- Support for type hints ======================================== @@ -34,13 +35,12 @@ In the function ``greeting``, the argument ``name`` is expected to be of type arguments. Type aliases ------------- +============ A type alias is defined by assigning the type to the alias. In this example, -``Vector`` and ``List[float]`` will be treated as interchangeable synonyms:: +``Vector`` and ``list[float]`` will be treated as interchangeable synonyms:: - from typing import List - Vector = List[float] + Vector = list[float] def scale(scalar: float, vector: Vector) -> Vector: return [scalar * num for num in vector] @@ -50,11 +50,11 @@ A type alias is defined by assigning the type to the alias. In this example, Type aliases are useful for simplifying complex type signatures. For example:: - from typing import Dict, Tuple, Sequence + from collections.abc import Sequence - ConnectionOptions = Dict[str, str] - Address = Tuple[str, int] - Server = Tuple[Address, ConnectionOptions] + ConnectionOptions = dict[str, str] + Address = tuple[str, int] + Server = tuple[Address, ConnectionOptions] def broadcast_message(message: str, servers: Sequence[Server]) -> None: ... @@ -63,7 +63,7 @@ Type aliases are useful for simplifying complex type signatures. For example:: # being exactly equivalent to this one. def broadcast_message( message: str, - servers: Sequence[Tuple[Tuple[str, int], Dict[str, str]]]) -> None: + servers: Sequence[tuple[tuple[str, int], dict[str, str]]]) -> None: ... Note that ``None`` as a type hint is a special case and is replaced by @@ -72,7 +72,7 @@ Note that ``None`` as a type hint is a special case and is replaced by .. _distinct: NewType -------- +======= Use the :func:`NewType` helper function to create distinct types:: @@ -149,14 +149,14 @@ See :pep:`484` for more details. .. versionadded:: 3.5.2 Callable --------- +======== Frameworks expecting callback functions of specific signatures might be type hinted using ``Callable[[Arg1Type, Arg2Type], ReturnType]``. For example:: - from typing import Callable + from collections.abc import Callable def feeder(get_next_item: Callable[[], str]) -> None: # Body @@ -172,7 +172,7 @@ for the list of arguments in the type hint: ``Callable[..., ReturnType]``. .. _generics: Generics --------- +======== Since type information about objects kept in containers cannot be statically inferred in a generic way, abstract base classes have been extended to support @@ -180,7 +180,7 @@ subscription to denote expected types for container elements. :: - from typing import Mapping, Sequence + from collections.abc import Mapping, Sequence def notify_by_email(employees: Sequence[Employee], overrides: Mapping[str, str]) -> None: ... @@ -190,7 +190,8 @@ called :class:`TypeVar`. :: - from typing import Sequence, TypeVar + from collections.abc import Sequence + from typing import TypeVar T = TypeVar('T') # Declare type variable @@ -199,7 +200,7 @@ called :class:`TypeVar`. User-defined generic types --------------------------- +========================== A user-defined class can be defined as a generic class. @@ -234,7 +235,7 @@ class body. The :class:`Generic` base class defines :meth:`__class_getitem__` so that ``LoggedVar[t]`` is valid as a type:: - from typing import Iterable + from collections.abc import Iterable def zero_all_vars(vars: Iterable[LoggedVar[int]]) -> None: for var in vars: @@ -265,7 +266,8 @@ This is thus invalid:: You can use multiple inheritance with :class:`Generic`:: - from typing import TypeVar, Generic, Sized + from collections.abc import Sized + from typing import TypeVar, Generic T = TypeVar('T') @@ -274,7 +276,8 @@ You can use multiple inheritance with :class:`Generic`:: When inheriting from generic classes, some type variables could be fixed:: - from typing import TypeVar, Mapping + from collections.abc import Mapping + from typing import TypeVar T = TypeVar('T') @@ -287,13 +290,14 @@ Using a generic class without specifying type parameters assumes :data:`Any` for each position. In the following example, ``MyIterable`` is not generic but implicitly inherits from ``Iterable[Any]``:: - from typing import Iterable + from collections.abc import Iterable class MyIterable(Iterable): # Same as Iterable[Any] User defined generic type aliases are also supported. Examples:: - from typing import TypeVar, Iterable, Tuple, Union + from collections.abc import Iterable + from typing import TypeVar, Union S = TypeVar('S') Response = Union[Iterable[S], int] @@ -302,9 +306,9 @@ User defined generic type aliases are also supported. Examples:: ... T = TypeVar('T', int, float, complex) - Vec = Iterable[Tuple[T, T]] + Vec = Iterable[tuple[T, T]] - def inproduct(v: Vec[T]) -> T: # Same as Iterable[Tuple[T, T]] + def inproduct(v: Vec[T]) -> T: # Same as Iterable[tuple[T, T]] return sum(x*y for x, y in v) .. versionchanged:: 3.7 @@ -317,14 +321,14 @@ comparable for equality. The :data:`Any` type --------------------- +==================== A special kind of type is :data:`Any`. A static type checker will treat every type as being compatible with :data:`Any` and :data:`Any` as being compatible with every type. This means that it is possible to perform any operation or method call on a -value of type on :data:`Any` and assign it to any variable:: +value of type :data:`Any` and assign it to any variable:: from typing import Any @@ -395,19 +399,19 @@ manner. Use :data:`Any` to indicate that a value is dynamically typed. Nominal vs structural subtyping -------------------------------- +=============================== Initially :pep:`484` defined Python static type system as using *nominal subtyping*. This means that a class ``A`` is allowed where a class ``B`` is expected if and only if ``A`` is a subclass of ``B``. This requirement previously also applied to abstract base classes, such as -:class:`Iterable`. The problem with this approach is that a class had +:class:`~collections.abc.Iterable`. The problem with this approach is that a class had to be explicitly marked to support them, which is unpythonic and unlike what one would normally do in idiomatic dynamically typed Python code. -For example, this conforms to the :pep:`484`:: +For example, this conforms to :pep:`484`:: - from typing import Sized, Iterable, Iterator + from collections.abc import Sized, Iterable, Iterator class Bucket(Sized, Iterable[int]): ... @@ -420,7 +424,7 @@ allowing ``Bucket`` to be implicitly considered a subtype of both ``Sized`` and ``Iterable[int]`` by static type checkers. This is known as *structural subtyping* (or static duck-typing):: - from typing import Iterator, Iterable + from collections.abc import Iterator, Iterable class Bucket: # Note: no base classes ... @@ -434,106 +438,154 @@ Moreover, by subclassing a special class :class:`Protocol`, a user can define new custom protocols to fully enjoy structural subtyping (see examples below). +Module contents +=============== -Classes, functions, and decorators ----------------------------------- +The module defines the following classes, functions and decorators. -The module defines the following classes, functions and decorators: +.. note:: -.. class:: TypeVar + This module defines several types that are subclasses of pre-existing + standard library classes which also extend :class:`Generic` + to support type variables inside ``[]``. + These types became redundant in Python 3.9 when the + corresponding pre-existing classes were enhanced to support ``[]``. - Type variable. + The redundant types are deprecated as of Python 3.9 but no + deprecation warnings will be issued by the interpreter. + It is expected that type checkers will flag the deprecated types + when the checked program targets Python 3.9 or newer. - Usage:: + The deprecated types will be removed from the :mod:`typing` module + in the first Python version released 5 years after the release of Python 3.9.0. + See details in :pep:`585`—*Type Hinting Generics In Standard Collections*. - T = TypeVar('T') # Can be anything - A = TypeVar('A', str, bytes) # Must be str or bytes - Type variables exist primarily for the benefit of static type - checkers. They serve as the parameters for generic types as well - as for generic function definitions. See class Generic for more - information on generic types. Generic functions work as follows:: +Special typing primitives +------------------------- - def repeat(x: T, n: int) -> Sequence[T]: - """Return a list containing n references to x.""" - return [x]*n +Special types +""""""""""""" - def longest(x: A, y: A) -> A: - """Return the longest of two strings.""" - return x if len(x) >= len(y) else y +These can be used as types in annotations and do not support ``[]``. - The latter example's signature is essentially the overloading - of ``(str, str) -> str`` and ``(bytes, bytes) -> bytes``. Also note - that if the arguments are instances of some subclass of :class:`str`, - the return type is still plain :class:`str`. +.. data:: Any - At runtime, ``isinstance(x, T)`` will raise :exc:`TypeError`. In general, - :func:`isinstance` and :func:`issubclass` should not be used with types. + Special type indicating an unconstrained type. - Type variables may be marked covariant or contravariant by passing - ``covariant=True`` or ``contravariant=True``. See :pep:`484` for more - details. By default type variables are invariant. Alternatively, - a type variable may specify an upper bound using ``bound=``. - This means that an actual type substituted (explicitly or implicitly) - for the type variable must be a subclass of the boundary type, - see :pep:`484`. + * Every type is compatible with :data:`Any`. + * :data:`Any` is compatible with every type. -.. class:: Generic +.. data:: NoReturn - Abstract base class for generic types. + Special type indicating that a function never returns. + For example:: - A generic type is typically declared by inheriting from an - instantiation of this class with one or more type variables. - For example, a generic mapping type might be defined as:: + from typing import NoReturn - class Mapping(Generic[KT, VT]): - def __getitem__(self, key: KT) -> VT: - ... - # Etc. + def stop() -> NoReturn: + raise RuntimeError('no way') - This class can then be used as follows:: + .. versionadded:: 3.5.4 + .. versionadded:: 3.6.2 - X = TypeVar('X') - Y = TypeVar('Y') +Special forms +""""""""""""" - def lookup_name(mapping: Mapping[X, Y], key: X, default: Y) -> Y: - try: - return mapping[key] - except KeyError: - return default +These can be used as types in annotations using ``[]``, each having a unique syntax. -.. class:: Protocol(Generic) +.. data:: Tuple - Base class for protocol classes. Protocol classes are defined like this:: + Tuple type; ``Tuple[X, Y]`` is the type of a tuple of two items + with the first item of type X and the second of type Y. The type of + the empty tuple can be written as ``Tuple[()]``. - class Proto(Protocol): - def meth(self) -> int: - ... + Example: ``Tuple[T1, T2]`` is a tuple of two elements corresponding + to type variables T1 and T2. ``Tuple[int, float, str]`` is a tuple + of an int, a float and a string. - Such classes are primarily used with static type checkers that recognize - structural subtyping (static duck-typing), for example:: + To specify a variable-length tuple of homogeneous type, + use literal ellipsis, e.g. ``Tuple[int, ...]``. A plain :data:`Tuple` + is equivalent to ``Tuple[Any, ...]``, and in turn to :class:`tuple`. - class C: - def meth(self) -> int: - return 0 + .. deprecated:: 3.9 + :class:`builtins.tuple ` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. - def func(x: Proto) -> int: - return x.meth() +.. data:: Union - func(C()) # Passes static type check + Union type; ``Union[X, Y]`` means either X or Y. - See :pep:`544` for details. Protocol classes decorated with - :func:`runtime_checkable` (described later) act as simple-minded runtime - protocols that check only the presence of given attributes, ignoring their - type signatures. + To define a union, use e.g. ``Union[int, str]``. Details: - Protocol classes can be generic, for example:: + * The arguments must be types and there must be at least one. - class GenProto(Protocol[T]): - def meth(self) -> T: - ... + * Unions of unions are flattened, e.g.:: - .. versionadded:: 3.8 + Union[Union[int, str], float] == Union[int, str, float] + + * Unions of a single argument vanish, e.g.:: + + Union[int] == int # The constructor actually returns int + + * Redundant arguments are skipped, e.g.:: + + Union[int, str, int] == Union[int, str] + + * When comparing unions, the argument order is ignored, e.g.:: + + Union[int, str] == Union[str, int] + + * You cannot subclass or instantiate a union. + + * You cannot write ``Union[X][Y]``. + + * You can use ``Optional[X]`` as a shorthand for ``Union[X, None]``. + + .. versionchanged:: 3.7 + Don't remove explicit subclasses from unions at runtime. + +.. data:: Optional + + Optional type. + + ``Optional[X]`` is equivalent to ``Union[X, None]``. + + Note that this is not the same concept as an optional argument, + which is one that has a default. An optional argument with a + default does not require the ``Optional`` qualifier on its type + annotation just because it is optional. For example:: + + def foo(arg: int = 0) -> None: + ... + + On the other hand, if an explicit value of ``None`` is allowed, the + use of ``Optional`` is appropriate, whether the argument is optional + or not. For example:: + + def foo(arg: Optional[int] = None) -> None: + ... + +.. data:: Callable + + Callable type; ``Callable[[int], str]`` is a function of (int) -> str. + + The subscription syntax must always be used with exactly two + values: the argument list and the return type. The argument list + must be a list of types or an ellipsis; the return type must be + a single type. + + There is no syntax to indicate optional or keyword arguments; + such function types are rarely used as callback types. + ``Callable[..., ReturnType]`` (literal ellipsis) can be used to + type hint a callable taking any number of arguments and returning + ``ReturnType``. A plain :data:`Callable` is equivalent to + ``Callable[..., Any]``, and in turn to + :class:`collections.abc.Callable`. + + .. deprecated:: 3.9 + :class:`collections.abc.Callable` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. .. class:: Type(Generic[CT_co]) @@ -570,246 +622,733 @@ The module defines the following classes, functions and decorators: :ref:`type variables `, and unions of any of these types. For example:: - def new_non_team_user(user_class: Type[Union[BaseUser, ProUser]]): ... + def new_non_team_user(user_class: Type[Union[BasicUser, ProUser]]): ... ``Type[Any]`` is equivalent to ``Type`` which in turn is equivalent to ``type``, which is the root of Python's metaclass hierarchy. .. versionadded:: 3.5.2 -.. class:: Iterable(Generic[T_co]) - - A generic version of :class:`collections.abc.Iterable`. + .. deprecated:: 3.9 + :class:`builtins.type ` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. -.. class:: Iterator(Iterable[T_co]) +.. data:: Literal - A generic version of :class:`collections.abc.Iterator`. + A type that can be used to indicate to type checkers that the + corresponding variable or function parameter has a value equivalent to + the provided literal (or one of several literals). For example:: -.. class:: Reversible(Iterable[T_co]) + def validate_simple(data: Any) -> Literal[True]: # always returns True + ... - A generic version of :class:`collections.abc.Reversible`. + MODE = Literal['r', 'rb', 'w', 'wb'] + def open_helper(file: str, mode: MODE) -> str: + ... -.. class:: SupportsInt + open_helper('/some/path', 'r') # Passes type check + open_helper('/other/path', 'typo') # Error in type checker - An ABC with one abstract method ``__int__``. + ``Literal[...]`` cannot be subclassed. At runtime, an arbitrary value + is allowed as type argument to ``Literal[...]``, but type checkers may + impose restrictions. See :pep:`586` for more details about literal types. -.. class:: SupportsFloat + .. versionadded:: 3.8 - An ABC with one abstract method ``__float__``. + .. versionchanged:: 3.9.1 + ``Literal`` now de-duplicates parameters. Equality comparison of + ``Literal`` objects are no longer order dependent. ``Literal`` objects + will now raise a :exc:`TypeError` exception during equality comparisons + if one of their parameters are not :term:`immutable`. -.. class:: SupportsComplex +.. data:: ClassVar - An ABC with one abstract method ``__complex__``. + Special type construct to mark class variables. -.. class:: SupportsBytes + As introduced in :pep:`526`, a variable annotation wrapped in ClassVar + indicates that a given attribute is intended to be used as a class variable + and should not be set on instances of that class. Usage:: - An ABC with one abstract method ``__bytes__``. + class Starship: + stats: ClassVar[dict[str, int]] = {} # class variable + damage: int = 10 # instance variable -.. class:: SupportsIndex + :data:`ClassVar` accepts only types and cannot be further subscribed. - An ABC with one abstract method ``__index__``. + :data:`ClassVar` is not a class itself, and should not + be used with :func:`isinstance` or :func:`issubclass`. + :data:`ClassVar` does not change Python runtime behavior, but + it can be used by third-party type checkers. For example, a type checker + might flag the following code as an error:: - .. versionadded:: 3.8 + enterprise_d = Starship(3000) + enterprise_d.stats = {} # Error, setting class variable on instance + Starship.stats = {} # This is OK -.. class:: SupportsAbs + .. versionadded:: 3.5.3 - An ABC with one abstract method ``__abs__`` that is covariant - in its return type. +.. data:: Final -.. class:: SupportsRound + A special typing construct to indicate to type checkers that a name + cannot be re-assigned or overridden in a subclass. For example:: - An ABC with one abstract method ``__round__`` - that is covariant in its return type. + MAX_SIZE: Final = 9000 + MAX_SIZE += 1 # Error reported by type checker -.. class:: Container(Generic[T_co]) + class Connection: + TIMEOUT: Final[int] = 10 - A generic version of :class:`collections.abc.Container`. + class FastConnector(Connection): + TIMEOUT = 1 # Error reported by type checker -.. class:: Hashable + There is no runtime checking of these properties. See :pep:`591` for + more details. - An alias to :class:`collections.abc.Hashable` + .. versionadded:: 3.8 -.. class:: Sized +.. data:: Annotated - An alias to :class:`collections.abc.Sized` + A type, introduced in :pep:`593` (``Flexible function and variable + annotations``), to decorate existing types with context-specific metadata + (possibly multiple pieces of it, as ``Annotated`` is variadic). + Specifically, a type ``T`` can be annotated with metadata ``x`` via the + typehint ``Annotated[T, x]``. This metadata can be used for either static + analysis or at runtime. If a library (or tool) encounters a typehint + ``Annotated[T, x]`` and has no special logic for metadata ``x``, it + should ignore it and simply treat the type as ``T``. Unlike the + ``no_type_check`` functionality that currently exists in the ``typing`` + module which completely disables typechecking annotations on a function + or a class, the ``Annotated`` type allows for both static typechecking + of ``T`` (e.g., via mypy or Pyre, which can safely ignore ``x``) + together with runtime access to ``x`` within a specific application. -.. class:: Collection(Sized, Iterable[T_co], Container[T_co]) + Ultimately, the responsibility of how to interpret the annotations (if + at all) is the responsibility of the tool or library encountering the + ``Annotated`` type. A tool or library encountering an ``Annotated`` type + can scan through the annotations to determine if they are of interest + (e.g., using ``isinstance()``). - A generic version of :class:`collections.abc.Collection` + When a tool or a library does not support annotations or encounters an + unknown annotation it should just ignore it and treat annotated type as + the underlying type. - .. versionadded:: 3.6.0 + It's up to the tool consuming the annotations to decide whether the + client is allowed to have several annotations on one type and how to + merge those annotations. -.. class:: AbstractSet(Sized, Collection[T_co]) + Since the ``Annotated`` type allows you to put several annotations of + the same (or different) type(s) on any node, the tools or libraries + consuming those annotations are in charge of dealing with potential + duplicates. For example, if you are doing value range analysis you might + allow this:: - A generic version of :class:`collections.abc.Set`. + T1 = Annotated[int, ValueRange(-10, 5)] + T2 = Annotated[T1, ValueRange(-20, 3)] -.. class:: MutableSet(AbstractSet[T]) + Passing ``include_extras=True`` to :func:`get_type_hints` lets one + access the extra annotations at runtime. - A generic version of :class:`collections.abc.MutableSet`. + The details of the syntax: -.. class:: Mapping(Sized, Collection[KT], Generic[VT_co]) + * The first argument to ``Annotated`` must be a valid type - A generic version of :class:`collections.abc.Mapping`. - This type can be used as follows:: + * Multiple type annotations are supported (``Annotated`` supports variadic + arguments):: - def get_position_in_index(word_list: Mapping[str, int], word: str) -> int: - return word_list[word] + Annotated[int, ValueRange(3, 10), ctype("char")] -.. class:: MutableMapping(Mapping[KT, VT]) + * ``Annotated`` must be called with at least two arguments ( + ``Annotated[int]`` is not valid) - A generic version of :class:`collections.abc.MutableMapping`. + * The order of the annotations is preserved and matters for equality + checks:: -.. class:: Sequence(Reversible[T_co], Collection[T_co]) + Annotated[int, ValueRange(3, 10), ctype("char")] != Annotated[ + int, ctype("char"), ValueRange(3, 10) + ] - A generic version of :class:`collections.abc.Sequence`. + * Nested ``Annotated`` types are flattened, with metadata ordered + starting with the innermost annotation:: -.. class:: MutableSequence(Sequence[T]) + Annotated[Annotated[int, ValueRange(3, 10)], ctype("char")] == Annotated[ + int, ValueRange(3, 10), ctype("char") + ] - A generic version of :class:`collections.abc.MutableSequence`. + * Duplicated annotations are not removed:: -.. class:: ByteString(Sequence[int]) + Annotated[int, ValueRange(3, 10)] != Annotated[ + int, ValueRange(3, 10), ValueRange(3, 10) + ] - A generic version of :class:`collections.abc.ByteString`. + * ``Annotated`` can be used with nested and generic aliases:: - This type represents the types :class:`bytes`, :class:`bytearray`, - and :class:`memoryview` of byte sequences. + T = TypeVar('T') + Vec = Annotated[list[tuple[T, T]], MaxLen(10)] + V = Vec[int] - As a shorthand for this type, :class:`bytes` can be used to - annotate arguments of any of the types mentioned above. + V == Annotated[list[tuple[int, int]], MaxLen(10)] -.. class:: Deque(deque, MutableSequence[T]) + .. versionadded:: 3.9 - A generic version of :class:`collections.deque`. +Building generic types +"""""""""""""""""""""" - .. versionadded:: 3.5.4 - .. versionadded:: 3.6.1 +These are not used in annotations. They are building blocks for creating generic types. -.. class:: List(list, MutableSequence[T]) +.. class:: Generic - Generic version of :class:`list`. - Useful for annotating return types. To annotate arguments it is preferred - to use an abstract collection type such as :class:`Sequence` or - :class:`Iterable`. + Abstract base class for generic types. + + A generic type is typically declared by inheriting from an + instantiation of this class with one or more type variables. + For example, a generic mapping type might be defined as:: + + class Mapping(Generic[KT, VT]): + def __getitem__(self, key: KT) -> VT: + ... + # Etc. + + This class can then be used as follows:: + + X = TypeVar('X') + Y = TypeVar('Y') + + def lookup_name(mapping: Mapping[X, Y], key: X, default: Y) -> Y: + try: + return mapping[key] + except KeyError: + return default + +.. class:: TypeVar + + Type variable. + + Usage:: + + T = TypeVar('T') # Can be anything + A = TypeVar('A', str, bytes) # Must be str or bytes + + Type variables exist primarily for the benefit of static type + checkers. They serve as the parameters for generic types as well + as for generic function definitions. See :class:`Generic` for more + information on generic types. Generic functions work as follows:: + + def repeat(x: T, n: int) -> Sequence[T]: + """Return a list containing n references to x.""" + return [x]*n + + def longest(x: A, y: A) -> A: + """Return the longest of two strings.""" + return x if len(x) >= len(y) else y + + The latter example's signature is essentially the overloading + of ``(str, str) -> str`` and ``(bytes, bytes) -> bytes``. Also note + that if the arguments are instances of some subclass of :class:`str`, + the return type is still plain :class:`str`. + + At runtime, ``isinstance(x, T)`` will raise :exc:`TypeError`. In general, + :func:`isinstance` and :func:`issubclass` should not be used with types. + + Type variables may be marked covariant or contravariant by passing + ``covariant=True`` or ``contravariant=True``. See :pep:`484` for more + details. By default type variables are invariant. Alternatively, + a type variable may specify an upper bound using ``bound=``. + This means that an actual type substituted (explicitly or implicitly) + for the type variable must be a subclass of the boundary type, + see :pep:`484`. + +.. data:: AnyStr + + ``AnyStr`` is a type variable defined as + ``AnyStr = TypeVar('AnyStr', str, bytes)``. + + It is meant to be used for functions that may accept any kind of string + without allowing different kinds of strings to mix. For example:: + + def concat(a: AnyStr, b: AnyStr) -> AnyStr: + return a + b + + concat(u"foo", u"bar") # Ok, output has type 'unicode' + concat(b"foo", b"bar") # Ok, output has type 'bytes' + concat(u"foo", b"bar") # Error, cannot mix unicode and bytes + +.. class:: Protocol(Generic) + + Base class for protocol classes. Protocol classes are defined like this:: + + class Proto(Protocol): + def meth(self) -> int: + ... + + Such classes are primarily used with static type checkers that recognize + structural subtyping (static duck-typing), for example:: + + class C: + def meth(self) -> int: + return 0 + + def func(x: Proto) -> int: + return x.meth() + + func(C()) # Passes static type check + + See :pep:`544` for details. Protocol classes decorated with + :func:`runtime_checkable` (described later) act as simple-minded runtime + protocols that check only the presence of given attributes, ignoring their + type signatures. + + Protocol classes can be generic, for example:: + + class GenProto(Protocol[T]): + def meth(self) -> T: + ... + + .. versionadded:: 3.8 + +.. decorator:: runtime_checkable + + Mark a protocol class as a runtime protocol. + + Such a protocol can be used with :func:`isinstance` and :func:`issubclass`. + This raises :exc:`TypeError` when applied to a non-protocol class. This + allows a simple-minded structural check, very similar to "one trick ponies" + in :mod:`collections.abc` such as :class:`~collections.abc.Iterable`. For example:: + + @runtime_checkable + class Closable(Protocol): + def close(self): ... + + assert isinstance(open('/some/file'), Closable) + + .. note:: + + :func:`runtime_checkable` will check only the presence of the required methods, + not their type signatures! For example, :class:`builtins.complex ` + implements :func:`__float__`, therefore it passes an :func:`issubclass` check + against :class:`SupportsFloat`. However, the ``complex.__float__`` method + exists only to raise a :class:`TypeError` with a more informative message. + + .. versionadded:: 3.8 + +Other special directives +"""""""""""""""""""""""" + +These are not used in annotations. They are building blocks for declaring types. + +.. class:: NamedTuple + + Typed version of :func:`collections.namedtuple`. + + Usage:: + + class Employee(NamedTuple): + name: str + id: int + + This is equivalent to:: + + Employee = collections.namedtuple('Employee', ['name', 'id']) + + To give a field a default value, you can assign to it in the class body:: + + class Employee(NamedTuple): + name: str + id: int = 3 + + employee = Employee('Guido') + assert employee.id == 3 + + Fields with a default value must come after any fields without a default. + + The resulting class has an extra attribute ``__annotations__`` giving a + dict that maps the field names to the field types. (The field names are in + the ``_fields`` attribute and the default values are in the + ``_field_defaults`` attribute both of which are part of the namedtuple + API.) + + ``NamedTuple`` subclasses can also have docstrings and methods:: + + class Employee(NamedTuple): + """Represents an employee.""" + name: str + id: int = 3 + + def __repr__(self) -> str: + return f'' + + Backward-compatible usage:: + + Employee = NamedTuple('Employee', [('name', str), ('id', int)]) + + .. versionchanged:: 3.6 + Added support for :pep:`526` variable annotation syntax. + + .. versionchanged:: 3.6.1 + Added support for default values, methods, and docstrings. + + .. versionchanged:: 3.8 + The ``_field_types`` and ``__annotations__`` attributes are + now regular dictionaries instead of instances of ``OrderedDict``. + + .. versionchanged:: 3.9 + Removed the ``_field_types`` attribute in favor of the more + standard ``__annotations__`` attribute which has the same information. + +.. function:: NewType(name, tp) + + A helper function to indicate a distinct type to a typechecker, + see :ref:`distinct`. At runtime it returns a function that returns + its argument. Usage:: + + UserId = NewType('UserId', int) + first_user = UserId(1) + + .. versionadded:: 3.5.2 + +.. class:: TypedDict(dict) + + Special construct to add type hints to a dictionary. + At runtime it is a plain :class:`dict`. + + ``TypedDict`` declares a dictionary type that expects all of its + instances to have a certain set of keys, where each key is + associated with a value of a consistent type. This expectation + is not checked at runtime but is only enforced by type checkers. + Usage:: + + class Point2D(TypedDict): + x: int + y: int + label: str + + a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK + b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check + + assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') + + The type info for introspection can be accessed via ``Point2D.__annotations__`` + and ``Point2D.__total__``. To allow using this feature with older versions + of Python that do not support :pep:`526`, ``TypedDict`` supports two additional + equivalent syntactic forms:: + + Point2D = TypedDict('Point2D', x=int, y=int, label=str) + Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) + + By default, all keys must be present in a TypedDict. It is possible + to override this by specifying totality. + Usage:: + + class point2D(TypedDict, total=False): + x: int + y: int + + This means that a point2D TypedDict can have any of the keys omitted. A type + checker is only expected to support a literal False or True as the value of + the total argument. True is the default, and makes all items defined in the + class body be required. + + See :pep:`589` for more examples and detailed rules of using ``TypedDict``. + + .. versionadded:: 3.8 + +Generic concrete collections +---------------------------- + +Corresponding to built-in types +""""""""""""""""""""""""""""""" + +.. class:: Dict(dict, MutableMapping[KT, VT]) + + A generic version of :class:`dict`. + Useful for annotating return types. To annotate arguments it is preferred + to use an abstract collection type such as :class:`Mapping`. + + This type can be used as follows:: + + def count_words(text: str) -> Dict[str, int]: + ... + + .. deprecated:: 3.9 + :class:`builtins.dict ` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. + +.. class:: List(list, MutableSequence[T]) + + Generic version of :class:`list`. + Useful for annotating return types. To annotate arguments it is preferred + to use an abstract collection type such as :class:`Sequence` or + :class:`Iterable`. This type may be used as follows:: - T = TypeVar('T', int, float) + T = TypeVar('T', int, float) + + def vec2(x: T, y: T) -> List[T]: + return [x, y] + + def keep_positives(vector: Sequence[T]) -> List[T]: + return [item for item in vector if item > 0] + + .. deprecated:: 3.9 + :class:`builtins.list ` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. + +.. class:: Set(set, MutableSet[T]) + + A generic version of :class:`builtins.set `. + Useful for annotating return types. To annotate arguments it is preferred + to use an abstract collection type such as :class:`AbstractSet`. + + .. deprecated:: 3.9 + :class:`builtins.set ` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. + +.. class:: FrozenSet(frozenset, AbstractSet[T_co]) + + A generic version of :class:`builtins.frozenset `. + + .. deprecated:: 3.9 + :class:`builtins.frozenset ` now supports ``[]``. See + :pep:`585` and :ref:`types-genericalias`. + +.. note:: :data:`Tuple` is a special form. + +Corresponding to types in :mod:`collections` +"""""""""""""""""""""""""""""""""""""""""""" + +.. class:: DefaultDict(collections.defaultdict, MutableMapping[KT, VT]) + + A generic version of :class:`collections.defaultdict`. + + .. versionadded:: 3.5.2 + + .. deprecated:: 3.9 + :class:`collections.defaultdict` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. + +.. class:: OrderedDict(collections.OrderedDict, MutableMapping[KT, VT]) + + A generic version of :class:`collections.OrderedDict`. + + .. versionadded:: 3.7.2 + + .. deprecated:: 3.9 + :class:`collections.OrderedDict` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. + +.. class:: ChainMap(collections.ChainMap, MutableMapping[KT, VT]) + + A generic version of :class:`collections.ChainMap`. + + .. versionadded:: 3.5.4 + .. versionadded:: 3.6.1 + + .. deprecated:: 3.9 + :class:`collections.ChainMap` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. + +.. class:: Counter(collections.Counter, Dict[T, int]) + + A generic version of :class:`collections.Counter`. + + .. versionadded:: 3.5.4 + .. versionadded:: 3.6.1 + + .. deprecated:: 3.9 + :class:`collections.Counter` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. + +.. class:: Deque(deque, MutableSequence[T]) + + A generic version of :class:`collections.deque`. + + .. versionadded:: 3.5.4 + .. versionadded:: 3.6.1 + + .. deprecated:: 3.9 + :class:`collections.deque` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. + +Other concrete types +"""""""""""""""""""" + +.. class:: IO + TextIO + BinaryIO + + Generic type ``IO[AnyStr]`` and its subclasses ``TextIO(IO[str])`` + and ``BinaryIO(IO[bytes])`` + represent the types of I/O streams such as returned by + :func:`open`. These types are also in the ``typing.io`` namespace. + +.. class:: Pattern + Match + + These type aliases + correspond to the return types from :func:`re.compile` and + :func:`re.match`. These types (and the corresponding functions) + are generic in ``AnyStr`` and can be made specific by writing + ``Pattern[str]``, ``Pattern[bytes]``, ``Match[str]``, or + ``Match[bytes]``. These types are also in the ``typing.re`` namespace. + + .. deprecated:: 3.9 + Classes ``Pattern`` and ``Match`` from :mod:`re` now support ``[]``. + See :pep:`585` and :ref:`types-genericalias`. + +.. class:: Text + + ``Text`` is an alias for ``str``. It is provided to supply a forward + compatible path for Python 2 code: in Python 2, ``Text`` is an alias for + ``unicode``. + + Use ``Text`` to indicate that a value must contain a unicode string in + a manner that is compatible with both Python 2 and Python 3:: - def vec2(x: T, y: T) -> List[T]: - return [x, y] + def add_unicode_checkmark(text: Text) -> Text: + return text + u' \u2713' - def keep_positives(vector: Sequence[T]) -> List[T]: - return [item for item in vector if item > 0] + .. versionadded:: 3.5.2 -.. class:: Set(set, MutableSet[T]) +Abstract Base Classes +--------------------- - A generic version of :class:`builtins.set `. - Useful for annotating return types. To annotate arguments it is preferred - to use an abstract collection type such as :class:`AbstractSet`. +Corresponding to collections in :mod:`collections.abc` +"""""""""""""""""""""""""""""""""""""""""""""""""""""" -.. class:: FrozenSet(frozenset, AbstractSet[T_co]) +.. class:: AbstractSet(Sized, Collection[T_co]) - A generic version of :class:`builtins.frozenset `. + A generic version of :class:`collections.abc.Set`. -.. class:: MappingView(Sized, Iterable[T_co]) + .. deprecated:: 3.9 + :class:`collections.abc.Set` now supports ``[]``. See :pep:`585` and + :ref:`types-genericalias`. - A generic version of :class:`collections.abc.MappingView`. +.. class:: ByteString(Sequence[int]) -.. class:: KeysView(MappingView[KT_co], AbstractSet[KT_co]) + A generic version of :class:`collections.abc.ByteString`. - A generic version of :class:`collections.abc.KeysView`. + This type represents the types :class:`bytes`, :class:`bytearray`, + and :class:`memoryview` of byte sequences. -.. class:: ItemsView(MappingView, Generic[KT_co, VT_co]) + As a shorthand for this type, :class:`bytes` can be used to + annotate arguments of any of the types mentioned above. - A generic version of :class:`collections.abc.ItemsView`. + .. deprecated:: 3.9 + :class:`collections.abc.ByteString` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. -.. class:: ValuesView(MappingView[VT_co]) +.. class:: Collection(Sized, Iterable[T_co], Container[T_co]) - A generic version of :class:`collections.abc.ValuesView`. + A generic version of :class:`collections.abc.Collection` -.. class:: Awaitable(Generic[T_co]) + .. versionadded:: 3.6.0 - A generic version of :class:`collections.abc.Awaitable`. + .. deprecated:: 3.9 + :class:`collections.abc.Collection` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. - .. versionadded:: 3.5.2 +.. class:: Container(Generic[T_co]) -.. class:: Coroutine(Awaitable[V_co], Generic[T_co T_contra, V_co]) + A generic version of :class:`collections.abc.Container`. - A generic version of :class:`collections.abc.Coroutine`. - The variance and order of type variables - correspond to those of :class:`Generator`, for example:: + .. deprecated:: 3.9 + :class:`collections.abc.Container` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. - from typing import List, Coroutine - c = None # type: Coroutine[List[str], str, int] - ... - x = c.send('hi') # type: List[str] - async def bar() -> None: - x = await c # type: int +.. class:: ItemsView(MappingView, Generic[KT_co, VT_co]) - .. versionadded:: 3.5.3 + A generic version of :class:`collections.abc.ItemsView`. -.. class:: AsyncIterable(Generic[T_co]) + .. deprecated:: 3.9 + :class:`collections.abc.ItemsView` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. - A generic version of :class:`collections.abc.AsyncIterable`. +.. class:: KeysView(MappingView[KT_co], AbstractSet[KT_co]) - .. versionadded:: 3.5.2 + A generic version of :class:`collections.abc.KeysView`. -.. class:: AsyncIterator(AsyncIterable[T_co]) + .. deprecated:: 3.9 + :class:`collections.abc.KeysView` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. - A generic version of :class:`collections.abc.AsyncIterator`. +.. class:: Mapping(Sized, Collection[KT], Generic[VT_co]) - .. versionadded:: 3.5.2 + A generic version of :class:`collections.abc.Mapping`. + This type can be used as follows:: -.. class:: ContextManager(Generic[T_co]) + def get_position_in_index(word_list: Mapping[str, int], word: str) -> int: + return word_list[word] - A generic version of :class:`contextlib.AbstractContextManager`. + .. deprecated:: 3.9 + :class:`collections.abc.Mapping` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. - .. versionadded:: 3.5.4 - .. versionadded:: 3.6.0 +.. class:: MappingView(Sized, Iterable[T_co]) -.. class:: AsyncContextManager(Generic[T_co]) + A generic version of :class:`collections.abc.MappingView`. - A generic version of :class:`contextlib.AbstractAsyncContextManager`. + .. deprecated:: 3.9 + :class:`collections.abc.MappingView` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. - .. versionadded:: 3.5.4 - .. versionadded:: 3.6.2 +.. class:: MutableMapping(Mapping[KT, VT]) -.. class:: Dict(dict, MutableMapping[KT, VT]) + A generic version of :class:`collections.abc.MutableMapping`. - A generic version of :class:`dict`. - Useful for annotating return types. To annotate arguments it is preferred - to use an abstract collection type such as :class:`Mapping`. + .. deprecated:: 3.9 + :class:`collections.abc.MutableMapping` now supports ``[]``. See + :pep:`585` and :ref:`types-genericalias`. - This type can be used as follows:: +.. class:: MutableSequence(Sequence[T]) - def count_words(text: str) -> Dict[str, int]: - ... + A generic version of :class:`collections.abc.MutableSequence`. -.. class:: DefaultDict(collections.defaultdict, MutableMapping[KT, VT]) + .. deprecated:: 3.9 + :class:`collections.abc.MutableSequence` now supports ``[]``. See + :pep:`585` and :ref:`types-genericalias`. - A generic version of :class:`collections.defaultdict`. +.. class:: MutableSet(AbstractSet[T]) - .. versionadded:: 3.5.2 + A generic version of :class:`collections.abc.MutableSet`. -.. class:: OrderedDict(collections.OrderedDict, MutableMapping[KT, VT]) + .. deprecated:: 3.9 + :class:`collections.abc.MutableSet` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. - A generic version of :class:`collections.OrderedDict`. +.. class:: Sequence(Reversible[T_co], Collection[T_co]) - .. versionadded:: 3.7.2 + A generic version of :class:`collections.abc.Sequence`. -.. class:: Counter(collections.Counter, Dict[T, int]) + .. deprecated:: 3.9 + :class:`collections.abc.Sequence` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. - A generic version of :class:`collections.Counter`. +.. class:: ValuesView(MappingView[VT_co]) - .. versionadded:: 3.5.4 - .. versionadded:: 3.6.1 + A generic version of :class:`collections.abc.ValuesView`. -.. class:: ChainMap(collections.ChainMap, MutableMapping[KT, VT]) + .. deprecated:: 3.9 + :class:`collections.abc.ValuesView` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. - A generic version of :class:`collections.ChainMap`. +Corresponding to other types in :mod:`collections.abc` +"""""""""""""""""""""""""""""""""""""""""""""""""""""" - .. versionadded:: 3.5.4 - .. versionadded:: 3.6.1 +.. class:: Iterable(Generic[T_co]) + + A generic version of :class:`collections.abc.Iterable`. + + .. deprecated:: 3.9 + :class:`collections.abc.Iterable` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. + +.. class:: Iterator(Iterable[T_co]) + + A generic version of :class:`collections.abc.Iterator`. + + .. deprecated:: 3.9 + :class:`collections.abc.Iterator` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. .. class:: Generator(Iterator[T_co], Generic[T_co, T_contra, V_co]) @@ -842,6 +1381,48 @@ The module defines the following classes, functions and decorators: yield start start += 1 + .. deprecated:: 3.9 + :class:`collections.abc.Generator` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. + +.. class:: Hashable + + An alias to :class:`collections.abc.Hashable` + +.. class:: Reversible(Iterable[T_co]) + + A generic version of :class:`collections.abc.Reversible`. + + .. deprecated:: 3.9 + :class:`collections.abc.Reversible` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. + +.. class:: Sized + + An alias to :class:`collections.abc.Sized` + +Asynchronous programming +"""""""""""""""""""""""" + +.. class:: Coroutine(Awaitable[V_co], Generic[T_co, T_contra, V_co]) + + A generic version of :class:`collections.abc.Coroutine`. + The variance and order of type variables + correspond to those of :class:`Generator`, for example:: + + from collections.abc import Coroutine + c = None # type: Coroutine[list[str], str, int] + ... + x = c.send('hi') # type: list[str] + async def bar() -> None: + x = await c # type: int + + .. versionadded:: 3.5.3 + + .. deprecated:: 3.9 + :class:`collections.abc.Coroutine` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. + .. class:: AsyncGenerator(AsyncIterator[T_co], Generic[T_co, T_contra]) An async generator can be annotated by the generic type @@ -875,161 +1456,105 @@ The module defines the following classes, functions and decorators: .. versionadded:: 3.6.1 -.. class:: Text - - ``Text`` is an alias for ``str``. It is provided to supply a forward - compatible path for Python 2 code: in Python 2, ``Text`` is an alias for - ``unicode``. + .. deprecated:: 3.9 + :class:`collections.abc.AsyncGenerator` now supports ``[]``. See + :pep:`585` and :ref:`types-genericalias`. - Use ``Text`` to indicate that a value must contain a unicode string in - a manner that is compatible with both Python 2 and Python 3:: +.. class:: AsyncIterable(Generic[T_co]) - def add_unicode_checkmark(text: Text) -> Text: - return text + u' \u2713' + A generic version of :class:`collections.abc.AsyncIterable`. .. versionadded:: 3.5.2 -.. class:: IO - TextIO - BinaryIO - - Generic type ``IO[AnyStr]`` and its subclasses ``TextIO(IO[str])`` - and ``BinaryIO(IO[bytes])`` - represent the types of I/O streams such as returned by - :func:`open`. - -.. class:: Pattern - Match - - These type aliases - correspond to the return types from :func:`re.compile` and - :func:`re.match`. These types (and the corresponding functions) - are generic in ``AnyStr`` and can be made specific by writing - ``Pattern[str]``, ``Pattern[bytes]``, ``Match[str]``, or - ``Match[bytes]``. - -.. class:: NamedTuple - - Typed version of :func:`collections.namedtuple`. - - Usage:: - - class Employee(NamedTuple): - name: str - id: int + .. deprecated:: 3.9 + :class:`collections.abc.AsyncIterable` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. - This is equivalent to:: +.. class:: AsyncIterator(AsyncIterable[T_co]) - Employee = collections.namedtuple('Employee', ['name', 'id']) + A generic version of :class:`collections.abc.AsyncIterator`. - To give a field a default value, you can assign to it in the class body:: + .. versionadded:: 3.5.2 - class Employee(NamedTuple): - name: str - id: int = 3 + .. deprecated:: 3.9 + :class:`collections.abc.AsyncIterator` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. - employee = Employee('Guido') - assert employee.id == 3 +.. class:: Awaitable(Generic[T_co]) - Fields with a default value must come after any fields without a default. + A generic version of :class:`collections.abc.Awaitable`. - The resulting class has an extra attribute ``__annotations__`` giving a - dict that maps the field names to the field types. (The field names are in - the ``_fields`` attribute and the default values are in the - ``_field_defaults`` attribute both of which are part of the namedtuple - API.) + .. versionadded:: 3.5.2 - ``NamedTuple`` subclasses can also have docstrings and methods:: + .. deprecated:: 3.9 + :class:`collections.abc.Awaitable` now supports ``[]``. See :pep:`585` + and :ref:`types-genericalias`. - class Employee(NamedTuple): - """Represents an employee.""" - name: str - id: int = 3 - def __repr__(self) -> str: - return f'' +Context manager types +""""""""""""""""""""" - Backward-compatible usage:: +.. class:: ContextManager(Generic[T_co]) - Employee = NamedTuple('Employee', [('name', str), ('id', int)]) + A generic version of :class:`contextlib.AbstractContextManager`. - .. versionchanged:: 3.6 - Added support for :pep:`526` variable annotation syntax. + .. versionadded:: 3.5.4 + .. versionadded:: 3.6.0 - .. versionchanged:: 3.6.1 - Added support for default values, methods, and docstrings. + .. deprecated:: 3.9 + :class:`contextlib.AbstractContextManager` now supports ``[]``. See + :pep:`585` and :ref:`types-genericalias`. - .. deprecated-removed:: 3.8 3.9 - Deprecated the ``_field_types`` attribute in favor of the more - standard ``__annotations__`` attribute which has the same information. +.. class:: AsyncContextManager(Generic[T_co]) - .. versionchanged:: 3.8 - The ``_field_types`` and ``__annotations__`` attributes are - now regular dictionaries instead of instances of ``OrderedDict``. + A generic version of :class:`contextlib.AbstractAsyncContextManager`. -.. class:: TypedDict(dict) + .. versionadded:: 3.5.4 + .. versionadded:: 3.6.2 - A simple typed namespace. At runtime it is equivalent to - a plain :class:`dict`. + .. deprecated:: 3.9 + :class:`contextlib.AbstractAsyncContextManager` now supports ``[]``. See + :pep:`585` and :ref:`types-genericalias`. - ``TypedDict`` creates a dictionary type that expects all of its - instances to have a certain set of keys, where each key is - associated with a value of a consistent type. This expectation - is not checked at runtime but is only enforced by type checkers. - Usage:: +Protocols +--------- - class Point2D(TypedDict): - x: int - y: int - label: str +These protocols are decorated with :func:`runtime_checkable`. - a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK - b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check +.. class:: SupportsAbs - assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') + An ABC with one abstract method ``__abs__`` that is covariant + in its return type. - The type info for introspection can be accessed via ``Point2D.__annotations__`` - and ``Point2D.__total__``. To allow using this feature with older versions - of Python that do not support :pep:`526`, ``TypedDict`` supports two additional - equivalent syntactic forms:: +.. class:: SupportsBytes - Point2D = TypedDict('Point2D', x=int, y=int, label=str) - Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) + An ABC with one abstract method ``__bytes__``. - By default, all keys must be present in a TypedDict. It is possible - to override this by specifying totality. - Usage:: +.. class:: SupportsComplex - class point2D(TypedDict, total=False): - x: int - y: int + An ABC with one abstract method ``__complex__``. - This means that a point2D TypedDict can have any of the keys omitted. A type - checker is only expected to support a literal False or True as the value of - the total argument. True is the default, and makes all items defined in the - class body be required. +.. class:: SupportsFloat - See :pep:`589` for more examples and detailed rules of using ``TypedDict``. + An ABC with one abstract method ``__float__``. - .. versionadded:: 3.8 +.. class:: SupportsIndex -.. class:: ForwardRef + An ABC with one abstract method ``__index__``. - A class used for internal typing representation of string forward references. - For example, ``List["SomeClass"]`` is implicitly transformed into - ``List[ForwardRef("SomeClass")]``. This class should not be instantiated by - a user, but may be used by introspection tools. + .. versionadded:: 3.8 -.. function:: NewType(name, tp) +.. class:: SupportsInt - A helper function to indicate a distinct type to a typechecker, - see :ref:`distinct`. At runtime it returns a function that returns - its argument. Usage:: + An ABC with one abstract method ``__int__``. - UserId = NewType('UserId', int) - first_user = UserId(1) +.. class:: SupportsRound - .. versionadded:: 3.5.2 + An ABC with one abstract method ``__round__`` + that is covariant in its return type. + +Functions and decorators +------------------------ .. function:: cast(typ, val) @@ -1040,38 +1565,6 @@ The module defines the following classes, functions and decorators: runtime we intentionally don't check anything (we want this to be as fast as possible). -.. function:: get_type_hints(obj[, globals[, locals]]) - - Return a dictionary containing type hints for a function, method, module - or class object. - - This is often the same as ``obj.__annotations__``. In addition, - forward references encoded as string literals are handled by evaluating - them in ``globals`` and ``locals`` namespaces. If necessary, - ``Optional[t]`` is added for function and method annotations if a default - value equal to ``None`` is set. For a class ``C``, return - a dictionary constructed by merging all the ``__annotations__`` along - ``C.__mro__`` in reverse order. - -.. function:: get_origin(tp) -.. function:: get_args(tp) - - Provide basic introspection for generic types and special typing forms. - - For a typing object of the form ``X[Y, Z, ...]`` these functions return - ``X`` and ``(Y, Z, ...)``. If ``X`` is a generic alias for a builtin or - :mod:`collections` class, it gets normalized to the original class. - For unsupported objects return ``None`` and ``()`` correspondingly. - Examples:: - - assert get_origin(Dict[str, int]) is dict - assert get_args(Dict[int, str]) == (int, str) - - assert get_origin(Union[int, str]) is Union - assert get_args(Union[int, str]) == (int, str) - - .. versionadded:: 3.8 - .. decorator:: overload The ``@overload`` decorator allows describing functions and methods @@ -1090,7 +1583,7 @@ The module defines the following classes, functions and decorators: def process(response: None) -> None: ... @overload - def process(response: int) -> Tuple[int, str]: + def process(response: int) -> tuple[int, str]: ... @overload def process(response: bytes) -> str: @@ -1160,212 +1653,71 @@ The module defines the following classes, functions and decorators: Note that returning instances of private classes is not recommended. It is usually preferable to make such classes public. -.. decorator:: runtime_checkable - - Mark a protocol class as a runtime protocol. - - Such a protocol can be used with :func:`isinstance` and :func:`issubclass`. - This raises :exc:`TypeError` when applied to a non-protocol class. This - allows a simple-minded structural check, very similar to "one trick ponies" - in :mod:`collections.abc` such as :class:`Iterable`. For example:: - - @runtime_checkable - class Closable(Protocol): - def close(self): ... - - assert isinstance(open('/some/file'), Closable) - - **Warning:** this will check only the presence of the required methods, - not their type signatures! - - .. versionadded:: 3.8 - -.. data:: Any - - Special type indicating an unconstrained type. - - * Every type is compatible with :data:`Any`. - * :data:`Any` is compatible with every type. - -.. data:: NoReturn - - Special type indicating that a function never returns. - For example:: - - from typing import NoReturn - - def stop() -> NoReturn: - raise RuntimeError('no way') - - .. versionadded:: 3.5.4 - .. versionadded:: 3.6.2 - -.. data:: Union - - Union type; ``Union[X, Y]`` means either X or Y. - - To define a union, use e.g. ``Union[int, str]``. Details: - - * The arguments must be types and there must be at least one. - - * Unions of unions are flattened, e.g.:: - - Union[Union[int, str], float] == Union[int, str, float] - - * Unions of a single argument vanish, e.g.:: - - Union[int] == int # The constructor actually returns int - - * Redundant arguments are skipped, e.g.:: - - Union[int, str, int] == Union[int, str] - - * When comparing unions, the argument order is ignored, e.g.:: - - Union[int, str] == Union[str, int] - - * You cannot subclass or instantiate a union. - - * You cannot write ``Union[X][Y]``. - - * You can use ``Optional[X]`` as a shorthand for ``Union[X, None]``. - - .. versionchanged:: 3.7 - Don't remove explicit subclasses from unions at runtime. - -.. data:: Optional - - Optional type. - - ``Optional[X]`` is equivalent to ``Union[X, None]``. - - Note that this is not the same concept as an optional argument, - which is one that has a default. An optional argument with a - default does not require the ``Optional`` qualifier on its type - annotation just because it is optional. For example:: - - def foo(arg: int = 0) -> None: - ... - - On the other hand, if an explicit value of ``None`` is allowed, the - use of ``Optional`` is appropriate, whether the argument is optional - or not. For example:: - - def foo(arg: Optional[int] = None) -> None: - ... - -.. data:: Tuple - - Tuple type; ``Tuple[X, Y]`` is the type of a tuple of two items - with the first item of type X and the second of type Y. The type of - the empty tuple can be written as ``Tuple[()]``. - - Example: ``Tuple[T1, T2]`` is a tuple of two elements corresponding - to type variables T1 and T2. ``Tuple[int, float, str]`` is a tuple - of an int, a float and a string. - - To specify a variable-length tuple of homogeneous type, - use literal ellipsis, e.g. ``Tuple[int, ...]``. A plain :data:`Tuple` - is equivalent to ``Tuple[Any, ...]``, and in turn to :class:`tuple`. - -.. data:: Callable - - Callable type; ``Callable[[int], str]`` is a function of (int) -> str. - - The subscription syntax must always be used with exactly two - values: the argument list and the return type. The argument list - must be a list of types or an ellipsis; the return type must be - a single type. - - There is no syntax to indicate optional or keyword arguments; - such function types are rarely used as callback types. - ``Callable[..., ReturnType]`` (literal ellipsis) can be used to - type hint a callable taking any number of arguments and returning - ``ReturnType``. A plain :data:`Callable` is equivalent to - ``Callable[..., Any]``, and in turn to - :class:`collections.abc.Callable`. - -.. data:: Literal - - A type that can be used to indicate to type checkers that the - corresponding variable or function parameter has a value equivalent to - the provided literal (or one of several literals). For example:: - - def validate_simple(data: Any) -> Literal[True]: # always returns True - ... - - MODE = Literal['r', 'rb', 'w', 'wb'] - def open_helper(file: str, mode: MODE) -> str: - ... - - open_helper('/some/path', 'r') # Passes type check - open_helper('/other/path', 'typo') # Error in type checker - - ``Literal[...]`` cannot be subclassed. At runtime, an arbitrary value - is allowed as type argument to ``Literal[...]``, but type checkers may - impose restrictions. See :pep:`586` for more details about literal types. - - .. versionadded:: 3.8 - -.. data:: ClassVar - - Special type construct to mark class variables. +Introspection helpers +--------------------- - As introduced in :pep:`526`, a variable annotation wrapped in ClassVar - indicates that a given attribute is intended to be used as a class variable - and should not be set on instances of that class. Usage:: +.. function:: get_type_hints(obj, globalns=None, localns=None, include_extras=False) - class Starship: - stats: ClassVar[Dict[str, int]] = {} # class variable - damage: int = 10 # instance variable + Return a dictionary containing type hints for a function, method, module + or class object. - :data:`ClassVar` accepts only types and cannot be further subscribed. + This is often the same as ``obj.__annotations__``. In addition, + forward references encoded as string literals are handled by evaluating + them in ``globals`` and ``locals`` namespaces. If necessary, + ``Optional[t]`` is added for function and method annotations if a default + value equal to ``None`` is set. For a class ``C``, return + a dictionary constructed by merging all the ``__annotations__`` along + ``C.__mro__`` in reverse order. - :data:`ClassVar` is not a class itself, and should not - be used with :func:`isinstance` or :func:`issubclass`. - :data:`ClassVar` does not change Python runtime behavior, but - it can be used by third-party type checkers. For example, a type checker - might flag the following code as an error:: + The function recursively replaces all ``Annotated[T, ...]`` with ``T``, + unless ``include_extras`` is set to ``True`` (see :class:`Annotated` for + more information). For example:: - enterprise_d = Starship(3000) - enterprise_d.stats = {} # Error, setting class variable on instance - Starship.stats = {} # This is OK + class Student(NamedTuple): + name: Annotated[str, 'some marker'] - .. versionadded:: 3.5.3 + get_type_hints(Student) == {'name': str} + get_type_hints(Student, include_extras=False) == {'name': str} + get_type_hints(Student, include_extras=True) == { + 'name': Annotated[str, 'some marker'] + } -.. data:: Final + .. versionchanged:: 3.9 + Added ``include_extras`` parameter as part of :pep:`593`. - A special typing construct to indicate to type checkers that a name - cannot be re-assigned or overridden in a subclass. For example:: +.. function:: get_args(tp) +.. function:: get_origin(tp) - MAX_SIZE: Final = 9000 - MAX_SIZE += 1 # Error reported by type checker + Provide basic introspection for generic types and special typing forms. - class Connection: - TIMEOUT: Final[int] = 10 + For a typing object of the form ``X[Y, Z, ...]`` these functions return + ``X`` and ``(Y, Z, ...)``. If ``X`` is a generic alias for a builtin or + :mod:`collections` class, it gets normalized to the original class. + If ``X`` is a :class:`Union` or :class:`Literal` contained in another + generic type, the order of ``(Y, Z, ...)`` may be different from the order + of the original arguments ``[Y, Z, ...]`` due to type caching. + For unsupported objects return ``None`` and ``()`` correspondingly. + Examples:: - class FastConnector(Connection): - TIMEOUT = 1 # Error reported by type checker + assert get_origin(Dict[str, int]) is dict + assert get_args(Dict[int, str]) == (int, str) - There is no runtime checking of these properties. See :pep:`591` for - more details. + assert get_origin(Union[int, str]) is Union + assert get_args(Union[int, str]) == (int, str) .. versionadded:: 3.8 -.. data:: AnyStr - - ``AnyStr`` is a type variable defined as - ``AnyStr = TypeVar('AnyStr', str, bytes)``. +.. class:: ForwardRef - It is meant to be used for functions that may accept any kind of string - without allowing different kinds of strings to mix. For example:: + A class used for internal typing representation of string forward references. + For example, ``list["SomeClass"]`` is implicitly transformed into + ``list[ForwardRef("SomeClass")]``. This class should not be instantiated by + a user, but may be used by introspection tools. - def concat(a: AnyStr, b: AnyStr) -> AnyStr: - return a + b + .. versionadded:: 3.7.4 - concat(u"foo", u"bar") # Ok, output has type 'unicode' - concat(b"foo", b"bar") # Ok, output has type 'bytes' - concat(u"foo", b"bar") # Error, cannot mix unicode and bytes +Constant +-------- .. data:: TYPE_CHECKING @@ -1378,9 +1730,18 @@ The module defines the following classes, functions and decorators: def fun(arg: 'expensive_mod.SomeType') -> None: local_var: expensive_mod.AnotherType = other_fun() - Note that the first type annotation must be enclosed in quotes, making it a + The first type annotation must be enclosed in quotes, making it a "forward reference", to hide the ``expensive_mod`` reference from the interpreter runtime. Type annotations for local variables are not evaluated, so the second annotation does not need to be enclosed in quotes. + .. note:: + + If ``from __future__ import annotations`` is used in Python 3.7 or later, + annotations are not evaluated at function definition time. + Instead, they are stored as strings in ``__annotations__``, + This makes it unnecessary to use quotes around the annotation. + (see :pep:`563`). + .. versionadded:: 3.5.2 + diff --git a/Doc/library/unicodedata.rst b/Doc/library/unicodedata.rst index 225384cf391e99629de1a8caaedab518e2436b86..dade3f265b56a7de7aa09a22a8f36f45e4426292 100644 --- a/Doc/library/unicodedata.rst +++ b/Doc/library/unicodedata.rst @@ -17,8 +17,8 @@ This module provides access to the Unicode Character Database (UCD) which defines character properties for all Unicode characters. The data contained in -this database is compiled from the `UCD version 12.1.0 -`_. +this database is compiled from the `UCD version 13.0.0 +`_. The module uses the same names and symbols as defined by Unicode Standard Annex #44, `"Unicode Character Database" @@ -175,6 +175,6 @@ Examples: .. rubric:: Footnotes -.. [#] http://www.unicode.org/Public/12.1.0/ucd/NameAliases.txt +.. [#] https://www.unicode.org/Public/13.0.0/ucd/NameAliases.txt -.. [#] http://www.unicode.org/Public/12.1.0/ucd/NamedSequences.txt +.. [#] https://www.unicode.org/Public/13.0.0/ucd/NamedSequences.txt diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index 34966b38a0dcd8fbc3fe3cf4010ed5d7982cec29..c5360f91f518d61f50b07b9c764046c04ca4dad0 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -857,7 +857,7 @@ object:: .. class:: AsyncMock(spec=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, unsafe=False, **kwargs) - An asynchronous version of :class:`Mock`. The :class:`AsyncMock` object will + An asynchronous version of :class:`MagicMock`. The :class:`AsyncMock` object will behave so the object is recognized as an async function, and the result of a call is an awaitable. @@ -1330,8 +1330,7 @@ patch .. note:: - :func:`patch` is straightforward to use. The key is to do the patching in the - right namespace. See the section `where to patch`_. + The key is to do the patching in the right namespace. See the section `where to patch`_. .. function:: patch(target, new=DEFAULT, spec=None, create=False, spec_set=None, autospec=None, new_callable=None, **kwargs) @@ -1404,7 +1403,8 @@ patch "as"; very useful if :func:`patch` is creating a mock object for you. :func:`patch` takes arbitrary keyword arguments. These will be passed to - the :class:`Mock` (or *new_callable*) on construction. + :class:`AsyncMock` if the patched object is asynchronous, to + :class:`MagicMock` otherwise or to *new_callable* if specified. ``patch.dict(...)``, ``patch.multiple(...)`` and ``patch.object(...)`` are available for alternate use-cases. diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index d9f080a862ff25344755eacf636b2950024b2a3d..9fc6620335f88c89fa9d799945bb2c1c0621f1f0 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -73,7 +73,7 @@ test runner for those new to unit testing. For production environments it is recommended that tests be driven by a continuous integration system such as `Buildbot `_, `Jenkins `_ - or `Hudson `_. + or `Travis-CI `_, or `AppVeyor `_. .. _unittest-minimal-example: @@ -593,8 +593,9 @@ The following decorators and exception implement test skipping and expected fail .. decorator:: expectedFailure - Mark the test as an expected failure. If the test fails it will be - considered a success. If the test passes, it will be considered a failure. + Mark the test as an expected failure or error. If the test fails or errors + it will be considered a success. If the test passes, it will be considered + a failure. .. exception:: SkipTest(reason) @@ -896,8 +897,7 @@ Test cases .. method:: assertIs(first, second, msg=None) assertIsNot(first, second, msg=None) - Test that *first* and *second* evaluate (or don't evaluate) to the - same object. + Test that *first* and *second* are (or are not) the same object. .. versionadded:: 3.1 @@ -1088,7 +1088,8 @@ Test cases If given, *logger* should be a :class:`logging.Logger` object or a :class:`str` giving the name of a logger. The default is the root - logger, which will catch all messages. + logger, which will catch all messages that were not blocked by a + non-propagating descendent logger. If given, *level* should be either a numeric logging level or its string equivalent (for example either ``"ERROR"`` or @@ -1427,7 +1428,7 @@ Test cases :class:`TextTestResult` in Python 3.2. - .. method:: addCleanup(function, *args, **kwargs) + .. method:: addCleanup(function, /, *args, **kwargs) Add a function to be called after :meth:`tearDown` to cleanup resources used during the test. Functions will be called in reverse order to the @@ -1945,7 +1946,7 @@ Loading and running tests A list containing 2-tuples of :class:`TestCase` instances and strings holding formatted tracebacks. Each tuple represents an expected failure - of the test case. + or error of the test case. .. attribute:: unexpectedSuccesses @@ -2071,8 +2072,8 @@ Loading and running tests .. method:: addExpectedFailure(test, err) - Called when the test case *test* fails, but was marked with the - :func:`expectedFailure` decorator. + Called when the test case *test* fails or errors, but was marked with + the :func:`expectedFailure` decorator. The default implementation appends a tuple ``(test, formatted_err)`` to the instance's :attr:`expectedFailures` attribute, where *formatted_err* diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index 25e5cc1a6ce0b27356be08875cb1533932adf95d..38e2986334c807aa755849dc167f9a3d1b53f5e3 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -42,8 +42,8 @@ or on combining URL components into a URL string. Parse a URL into six components, returning a 6-item :term:`named tuple`. This corresponds to the general structure of a URL: ``scheme://netloc/path;parameters?query#fragment``. - Each tuple item is a string, possibly empty. The components are not broken up in - smaller parts (for example, the network location is a single string), and % + Each tuple item is a string, possibly empty. The components are not broken up + into smaller parts (for example, the network location is a single string), and % escapes are not expanded. The delimiters as shown above are not part of the result, except for a leading slash in the *path* component, which is retained if present. For example: @@ -165,7 +165,7 @@ or on combining URL components into a URL string. now raise :exc:`ValueError`. -.. function:: parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None) +.. function:: parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None, separator='&') Parse a query string given as a string argument (data of type :mimetype:`application/x-www-form-urlencoded`). Data are returned as a @@ -190,6 +190,9 @@ or on combining URL components into a URL string. read. If set, then throws a :exc:`ValueError` if there are more than *max_num_fields* fields read. + The optional argument *separator* is the symbol to use for separating the + query arguments. It defaults to ``&``. + Use the :func:`urllib.parse.urlencode` function (with the ``doseq`` parameter set to ``True``) to convert such dictionaries into query strings. @@ -201,8 +204,14 @@ or on combining URL components into a URL string. .. versionchanged:: 3.8 Added *max_num_fields* parameter. + .. versionchanged:: 3.9.2 + Added *separator* parameter with the default value of ``&``. Python + versions earlier than Python 3.9.2 allowed using both ``;`` and ``&`` as + query parameter separator. This has been changed to allow only a single + separator key, with ``&`` as the default separator. + -.. function:: parse_qsl(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None) +.. function:: parse_qsl(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None, separator='&') Parse a query string given as a string argument (data of type :mimetype:`application/x-www-form-urlencoded`). Data are returned as a list of @@ -226,6 +235,8 @@ or on combining URL components into a URL string. read. If set, then throws a :exc:`ValueError` if there are more than *max_num_fields* fields read. + The optional argument *separator* is the symbol to use for separating the query arguments. It defaults to ``&``. + Use the :func:`urllib.parse.urlencode` function to convert such lists of pairs into query strings. @@ -235,6 +246,12 @@ or on combining URL components into a URL string. .. versionchanged:: 3.8 Added *max_num_fields* parameter. + .. versionchanged:: 3.9.2 + Added *separator* parameter with the default value of ``&``. Python + versions earlier than Python 3.9.2 allowed using both ``;`` and ``&`` as + query parameter separator. This has been changed to allow only a single + separator key, with ``&`` as the default separator. + .. function:: urlunparse(parts) @@ -328,22 +345,22 @@ or on combining URL components into a URL string. .. note:: - If *url* is an absolute URL (that is, starting with ``//`` or ``scheme://``), - the *url*'s host name and/or scheme will be present in the result. For example: + If *url* is an absolute URL (that is, it starts with ``//`` or ``scheme://``), + the *url*'s hostname and/or scheme will be present in the result. For example: - .. doctest:: + .. doctest:: - >>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', - ... '//www.python.org/%7Eguido') - 'http://www.python.org/%7Eguido' + >>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', + ... '//www.python.org/%7Eguido') + 'http://www.python.org/%7Eguido' - If you do not want that behavior, preprocess the *url* with :func:`urlsplit` and - :func:`urlunsplit`, removing possible *scheme* and *netloc* parts. + If you do not want that behavior, preprocess the *url* with :func:`urlsplit` and + :func:`urlunsplit`, removing possible *scheme* and *netloc* parts. .. versionchanged:: 3.5 - Behaviour updated to match the semantics defined in :rfc:`3986`. + Behavior updated to match the semantics defined in :rfc:`3986`. .. function:: urldefrag(url) @@ -521,11 +538,11 @@ task isn't already covered by the URL parsing functions above. Replace special characters in *string* using the ``%xx`` escape. Letters, digits, and the characters ``'_.-~'`` are never quoted. By default, this - function is intended for quoting the path section of URL. The optional *safe* - parameter specifies additional ASCII characters that should not be quoted - --- its default value is ``'/'``. + function is intended for quoting the path section of a URL. The optional + *safe* parameter specifies additional ASCII characters that should not be + quoted --- its default value is ``'/'``. - *string* may be either a :class:`str` or a :class:`bytes`. + *string* may be either a :class:`str` or a :class:`bytes` object. .. versionchanged:: 3.7 Moved from :rfc:`2396` to :rfc:`3986` for quoting URL strings. "~" is now @@ -547,7 +564,7 @@ task isn't already covered by the URL parsing functions above. .. function:: quote_plus(string, safe='', encoding=None, errors=None) - Like :func:`quote`, but also replace spaces by plus signs, as required for + Like :func:`quote`, but also replace spaces with plus signs, as required for quoting HTML form values when building up a query string to go into a URL. Plus signs in the original string are escaped unless they are included in *safe*. It also does not have *safe* default to ``'/'``. @@ -566,12 +583,12 @@ task isn't already covered by the URL parsing functions above. .. function:: unquote(string, encoding='utf-8', errors='replace') - Replace ``%xx`` escapes by their single-character equivalent. + Replace ``%xx`` escapes with their single-character equivalent. The optional *encoding* and *errors* parameters specify how to decode percent-encoded sequences into Unicode characters, as accepted by the :meth:`bytes.decode` method. - *string* must be a :class:`str`. + *string* may be either a :class:`str` or a :class:`bytes` object. *encoding* defaults to ``'utf-8'``. *errors* defaults to ``'replace'``, meaning invalid sequences are replaced @@ -579,11 +596,16 @@ task isn't already covered by the URL parsing functions above. Example: ``unquote('/El%20Ni%C3%B1o/')`` yields ``'/El Niño/'``. + .. versionchanged:: 3.9 + *string* parameter supports bytes and str objects (previously only str). + + + .. function:: unquote_plus(string, encoding='utf-8', errors='replace') - Like :func:`unquote`, but also replace plus signs by spaces, as required for - unquoting HTML form values. + Like :func:`unquote`, but also replace plus signs with spaces, as required + for unquoting HTML form values. *string* must be a :class:`str`. @@ -592,10 +614,10 @@ task isn't already covered by the URL parsing functions above. .. function:: unquote_to_bytes(string) - Replace ``%xx`` escapes by their single-octet equivalent, and return a + Replace ``%xx`` escapes with their single-octet equivalent, and return a :class:`bytes` object. - *string* may be either a :class:`str` or a :class:`bytes`. + *string* may be either a :class:`str` or a :class:`bytes` object. If it is a :class:`str`, unescaped non-ASCII characters in *string* are encoded into UTF-8 bytes. @@ -626,7 +648,7 @@ task isn't already covered by the URL parsing functions above. When a sequence of two-element tuples is used as the *query* argument, the first element of each tuple is a key and the second is a value. The value element in itself can be a sequence and in that case, if - the optional parameter *doseq* is evaluates to ``True``, individual + the optional parameter *doseq* evaluates to ``True``, individual ``key=value`` pairs separated by ``'&'`` are generated for each element of the value sequence for the key. The order of parameters in the encoded string will match the order of parameter tuples in the sequence. @@ -638,11 +660,12 @@ task isn't already covered by the URL parsing functions above. To reverse this encoding process, :func:`parse_qs` and :func:`parse_qsl` are provided in this module to parse query strings into Python data structures. - Refer to :ref:`urllib examples ` to find out how urlencode - method can be used for generating query string for a URL or data for POST. + Refer to :ref:`urllib examples ` to find out how the + :func:`urllib.parse.urlencode` method can be used for generating the query + string of a URL or data for a POST request. .. versionchanged:: 3.2 - Query parameter supports bytes and string objects. + *query* supports bytes and string objects. .. versionadded:: 3.5 *quote_via* parameter. diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst index adc0593e8094a1b01b773f6ad8096ad849cd3ddd..785ecf8fafdcc56d83d975286ef788fb6dd66d00 100644 --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -55,16 +55,8 @@ The :mod:`urllib.request` module defines the following functions: The *cadefault* parameter is ignored. This function always returns an object which can work as a - :term:`context manager` and has methods such as - - * :meth:`~urllib.response.addinfourl.geturl` --- return the URL of the resource retrieved, - commonly used to determine if a redirect was followed - - * :meth:`~urllib.response.addinfourl.info` --- return the meta-information of the page, such as headers, - in the form of an :func:`email.message_from_string` instance (see - `Quick Reference to HTTP Headers `_) - - * :meth:`~urllib.response.addinfourl.getcode` -- return the HTTP status code of the response. + :term:`context manager` and has the properties *url*, *headers*, and *status*. + See :class:`urllib.response.addinfourl` for more detail on these properties. For HTTP and HTTPS URLs, this function returns a :class:`http.client.HTTPResponse` object slightly modified. In addition @@ -954,7 +946,7 @@ tracking URIs for which authentication credentials should always be sent. If *is_authenticated* is specified as ``True``, *realm* is ignored. -.. method:: HTTPPasswordMgr.find_user_password(realm, authuri) +.. method:: HTTPPasswordMgrWithPriorAuth.find_user_password(realm, authuri) Same as for :class:`HTTPPasswordMgrWithDefaultRealm` objects @@ -1585,9 +1577,42 @@ some point in the future. :synopsis: Response classes used by urllib. The :mod:`urllib.response` module defines functions and classes which define a -minimal file like interface, including ``read()`` and ``readline()``. The -typical response object is an addinfourl instance, which defines an ``info()`` -method and that returns headers and a ``geturl()`` method that returns the url. -Functions defined by this module are used internally by the -:mod:`urllib.request` module. +minimal file-like interface, including ``read()`` and ``readline()``. +Functions defined by this module are used internally by the :mod:`urllib.request` module. +The typical response object is a :class:`urllib.response.addinfourl` instance: + +.. class:: addinfourl + + .. attribute:: url + + URL of the resource retrieved, commonly used to determine if a redirect was followed. + + .. attribute:: headers + + Returns the headers of the response in the form of an :class:`~email.message.EmailMessage` instance. + + .. attribute:: status + + .. versionadded:: 3.9 + + Status code returned by server. + + .. method:: geturl() + + .. deprecated:: 3.9 + Deprecated in favor of :attr:`~addinfourl.url`. + + .. method:: info() + + .. deprecated:: 3.9 + Deprecated in favor of :attr:`~addinfourl.headers`. + + .. attribute:: code + + .. deprecated:: 3.9 + Deprecated in favor of :attr:`~addinfourl.status`. + + .. method:: getstatus() + .. deprecated:: 3.9 + Deprecated in favor of :attr:`~addinfourl.status`. diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst index 59b251837a4896c33175c89cec7f457947aa5d75..8abadc4df3cac8c651a457eaff166a852fe956bb 100644 --- a/Doc/library/venv.rst +++ b/Doc/library/venv.rst @@ -98,7 +98,7 @@ creation according to their needs, the :class:`EnvBuilder` class. .. class:: EnvBuilder(system_site_packages=False, clear=False, \ symlinks=False, upgrade=False, with_pip=False, \ - prompt=None) + prompt=None, upgrade_deps=False) The :class:`EnvBuilder` class accepts the following keyword arguments on instantiation: @@ -122,7 +122,10 @@ creation according to their needs, the :class:`EnvBuilder` class. * ``prompt`` -- a String to be used after virtual environment is activated (defaults to ``None`` which means directory name of the environment would - be used). + be used). If the special string ``"."`` is provided, the basename of the + current directory is used as the prompt. + + * ``upgrade_deps`` -- Update the base venv modules to the latest on PyPI .. versionchanged:: 3.4 Added the ``with_pip`` parameter @@ -130,6 +133,9 @@ creation according to their needs, the :class:`EnvBuilder` class. .. versionadded:: 3.6 Added the ``prompt`` parameter + .. versionadded:: 3.9 + Added the ``upgrade_deps`` parameter + Creators of third-party virtual environment tools will be free to use the provided :class:`EnvBuilder` class as a base class. @@ -186,6 +192,14 @@ creation according to their needs, the :class:`EnvBuilder` class. Installs activation scripts appropriate to the platform into the virtual environment. + .. method:: upgrade_dependencies(context) + + Upgrades the core venv dependency packages (currently ``pip`` and + ``setuptools``) in the environment. This is done by shelling out to the + ``pip`` executable in the environment. + + .. versionadded:: 3.9 + .. method:: post_setup(context) A placeholder method which can be overridden in third party diff --git a/Doc/library/warnings.rst b/Doc/library/warnings.rst index a481a3509d4ec83770ea3cfe8679f6859a6d8d8e..9c1743cad23cb780529479b2056ce327499e800a 100644 --- a/Doc/library/warnings.rst +++ b/Doc/library/warnings.rst @@ -491,7 +491,7 @@ Available Functions Available Context Managers -------------------------- -.. class:: catch_warnings(\*, record=False, module=None) +.. class:: catch_warnings(*, record=False, module=None) A context manager that copies and, upon exit, restores the warnings filter and the :func:`showwarning` function. diff --git a/Doc/library/wave.rst b/Doc/library/wave.rst index 60d19a8d5f7dc079d35723aee36d1ea30e6d2a53..f63e0d3dce19c6383828cf2bedbc587f88f2888b 100644 --- a/Doc/library/wave.rst +++ b/Doc/library/wave.rst @@ -47,13 +47,6 @@ The :mod:`wave` module defines the following function and exception: .. versionchanged:: 3.4 Added support for unseekable files. -.. function:: openfp(file, mode) - - A synonym for :func:`.open`, maintained for backwards compatibility. - - .. deprecated-removed:: 3.7 3.9 - - .. exception:: Error An error raised when something is impossible because it violates the WAV diff --git a/Doc/library/weakref.rst b/Doc/library/weakref.rst index 0d9f21d2e83a4cc492de84e5de3b2789db32add6..d3c3a070f38af0a4c177c9e830c0e97ad9799bea 100644 --- a/Doc/library/weakref.rst +++ b/Doc/library/weakref.rst @@ -163,6 +163,8 @@ Extension types can easily be made to support weak references; see application without adding attributes to those objects. This can be especially useful with objects that override attribute accesses. + .. versionchanged:: 3.9 + Added support for ``|`` and ``|=`` operators, specified in :pep:`584`. :class:`WeakKeyDictionary` objects have an additional method that exposes the internal references directly. The references are not guaranteed to @@ -182,6 +184,8 @@ than needed. Mapping class that references values weakly. Entries in the dictionary will be discarded when no strong reference to the value exists any more. + .. versionchanged:: 3.9 + Added support for ``|`` and ``|=`` operators, as specified in :pep:`584`. :class:`WeakValueDictionary` objects have an additional method that has the same issues as the :meth:`keyrefs` method of :class:`WeakKeyDictionary` @@ -227,7 +231,7 @@ objects. .. versionadded:: 3.4 -.. class:: finalize(obj, func, *args, **kwargs) +.. class:: finalize(obj, func, /, *args, **kwargs) Return a callable finalizer object which will be called when *obj* is garbage collected. Unlike an ordinary weak reference, a finalizer diff --git a/Doc/library/winreg.rst b/Doc/library/winreg.rst index dccb7db27e90cc0df30976b213af0d816dc8f7e6..487856a3ac6c60050e7e4e320333d935f3d88522 100644 --- a/Doc/library/winreg.rst +++ b/Doc/library/winreg.rst @@ -791,7 +791,7 @@ integer handle, and also disconnect the Windows handle from the handle object. .. method:: PyHKEY.__enter__() - PyHKEY.__exit__(\*exc_info) + PyHKEY.__exit__(*exc_info) The HKEY object implements :meth:`~object.__enter__` and :meth:`~object.__exit__` and thus supports the context protocol for the diff --git a/Doc/library/wsgiref.rst b/Doc/library/wsgiref.rst index 1e30aa4a898c13bb7eef7442b762a5462c52d65f..e92a689de0b9ba960ae062ff855d1b209ca9c523 100644 --- a/Doc/library/wsgiref.rst +++ b/Doc/library/wsgiref.rst @@ -480,8 +480,8 @@ input, output, and error streams. rarely used and is not guaranteed by WSGI. On IIS<7, though, the setting can only be made on a vhost level, affecting all other script mappings, many of which break when exposed to the ``PATH_TRANSLATED`` bug. - For this reason IIS<7 is almost never deployed with the fix. (Even IIS7 - rarely uses it because there is still no UI for it.) + For this reason IIS<7 is almost never deployed with the fix (Even IIS7 + rarely uses it because there is still no UI for it.). There is no way for CGI code to tell whether the option was set, so a separate handler class is provided. It is used in the same way as diff --git a/Doc/library/xml.dom.minidom.rst b/Doc/library/xml.dom.minidom.rst index 8711242d95d741c320668a4bbe3d26ba5eb6d0d3..bf72c46561b7c7906fd17f0d81cd921afb5fa362 100644 --- a/Doc/library/xml.dom.minidom.rst +++ b/Doc/library/xml.dom.minidom.rst @@ -132,7 +132,8 @@ module documentation. This section lists the differences between the API and ... # Work with dom. -.. method:: Node.writexml(writer, indent="", addindent="", newl="") +.. method:: Node.writexml(writer, indent="", addindent="", newl="", \ + encoding=None, standalone=None) Write XML to the writer object. The writer receives texts but not bytes as input, it should have a :meth:`write` method which matches that of the file object @@ -144,11 +145,18 @@ module documentation. This section lists the differences between the API and For the :class:`Document` node, an additional keyword argument *encoding* can be used to specify the encoding field of the XML header. + Silimarly, explicitly stating the *standalone* argument causes the + standalone document declarations to be added to the prologue of the XML + document. + If the value is set to `True`, `standalone="yes"` is added, + otherwise it is set to `"no"`. + Not stating the argument will omit the declaration from the document. + .. versionchanged:: 3.8 The :meth:`writexml` method now preserves the attribute order specified by the user. -.. method:: Node.toxml(encoding=None) +.. method:: Node.toxml(encoding=None, standalone=None) Return a string or byte string containing the XML represented by the DOM node. @@ -160,11 +168,14 @@ module documentation. This section lists the differences between the API and encoding. Encoding this string in an encoding other than UTF-8 is likely incorrect, since UTF-8 is the default encoding of XML. + The *standalone* argument behaves exactly as in :meth:`writexml`. + .. versionchanged:: 3.8 The :meth:`toxml` method now preserves the attribute order specified by the user. -.. method:: Node.toprettyxml(indent="\\t", newl="\\n", encoding=None) +.. method:: Node.toprettyxml(indent="\\t", newl="\\n", encoding=None, \ + standalone=None) Return a pretty-printed version of the document. *indent* specifies the indentation string and defaults to a tabulator; *newl* specifies the string @@ -173,6 +184,8 @@ module documentation. This section lists the differences between the API and The *encoding* argument behaves like the corresponding argument of :meth:`toxml`. + The *standalone* argument behaves exactly as in :meth:`writexml`. + .. versionchanged:: 3.8 The :meth:`toprettyxml` method now preserves the attribute order specified by the user. diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst index 44ac52aa83079aa575cbd36200bec6b1231f62e9..f4bccf6609810ee05814d0ce5a0eac1654f197f5 100644 --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -15,6 +15,8 @@ for parsing and creating XML data. .. versionchanged:: 3.3 This module will use a fast implementation whenever available. + +.. deprecated:: 3.3 The :mod:`xml.etree.cElementTree` module is deprecated. @@ -249,12 +251,18 @@ We can remove elements using :meth:`Element.remove`. Let's say we want to remove all countries with a rank higher than 50:: >>> for country in root.findall('country'): + ... # using root.findall() to avoid removal during traversal ... rank = int(country.find('rank').text) ... if rank > 50: ... root.remove(country) ... >>> tree.write('output.xml') +Note that concurrent modification while iterating can lead to problems, +just like when iterating and modifying Python lists or dicts. +Therefore, the example first collects all matching elements with +``root.findall()``, and only then iterates over the list of matches. + Our XML now looks like this: .. code-block:: xml @@ -572,6 +580,18 @@ Functions .. versionadded:: 3.2 +.. function:: indent(tree, space=" ", level=0) + + Appends whitespace to the subtree to indent the tree visually. + This can be used to generate pretty-printed XML output. + *tree* can be an Element or ElementTree. *space* is the whitespace + string that will be inserted for each indentation level, two space + characters by default. For indenting partial subtrees inside of an + already indented tree, pass the initial indentation level as *level*. + + .. versionadded:: 3.9 + + .. function:: iselement(element) Check if an object appears to be a valid element object. *element* is an @@ -804,16 +824,25 @@ Functions loader fails, it can return None or raise an exception. -.. function:: xml.etree.ElementInclude.include( elem, loader=None) +.. function:: xml.etree.ElementInclude.include( elem, loader=None, base_url=None, \ + max_depth=6) This function expands XInclude directives. *elem* is the root element. *loader* is an optional resource loader. If omitted, it defaults to :func:`default_loader`. If given, it should be a callable that implements the same interface as - :func:`default_loader`. Returns the expanded resource. If the parse mode is + :func:`default_loader`. *base_url* is base URL of the original file, to resolve + relative include file references. *max_depth* is the maximum number of recursive + inclusions. Limited to reduce the risk of malicious content explosion. Pass a + negative value to disable the limitation. + + Returns the expanded resource. If the parse mode is ``"xml"``, this is an ElementTree instance. If the parse mode is "text", this is a Unicode string. If the loader fails, it can return None or raise an exception. + .. versionadded:: 3.9 + The *base_url* and *max_depth* parameters. + .. _elementtree-element-objects: @@ -950,18 +979,6 @@ Element Objects in the expression into the given namespace. - .. method:: getchildren() - - .. deprecated-removed:: 3.2 3.9 - Use ``list(elem)`` or iteration. - - - .. method:: getiterator(tag=None) - - .. deprecated-removed:: 3.2 3.9 - Use method :meth:`Element.iter` instead. - - .. method:: insert(index, subelement) Inserts *subelement* at the given position in this element. Raises @@ -1096,12 +1113,6 @@ ElementTree Objects Same as :meth:`Element.findtext`, starting at the root of the tree. - .. method:: getiterator(tag=None) - - .. deprecated-removed:: 3.2 3.9 - Use method :meth:`ElementTree.iter` instead. - - .. method:: getroot() Returns the root element for this tree. diff --git a/Doc/library/xml.rst b/Doc/library/xml.rst index fb86b6f5564d7673ebedab8fcf788fe9a6ad7f33..1981cab7cd438d76ce8b75bc5c4e40d200d28d8d 100644 --- a/Doc/library/xml.rst +++ b/Doc/library/xml.rst @@ -20,7 +20,7 @@ Python's interfaces for processing XML are grouped in the ``xml`` package. The XML modules are not secure against erroneous or maliciously constructed data. If you need to parse untrusted or unauthenticated data see the :ref:`xml-vulnerabilities` and - :ref:`defused-packages` sections. + :ref:`defusedxml-package` sections. It is important to note that modules in the :mod:`xml` package require that there be at least one SAX-compliant XML parser available. The Expat parser is @@ -113,9 +113,9 @@ decompression bomb The documentation for `defusedxml`_ on PyPI has further information about all known attack vectors with examples and references. -.. _defused-packages: +.. _defusedxml-package: -The :mod:`defusedxml` and :mod:`defusedexpat` Packages +The :mod:`defusedxml` Package ------------------------------------------------------ `defusedxml`_ is a pure Python package with modified subclasses of all stdlib @@ -124,16 +124,8 @@ package is recommended for any server code that parses untrusted XML data. The package also ships with example exploits and extended documentation on more XML exploits such as XPath injection. -`defusedexpat`_ provides a modified libexpat and a patched -:mod:`pyexpat` module that have countermeasures against entity expansion -DoS attacks. The :mod:`defusedexpat` module still allows a sane and configurable amount of entity -expansions. The modifications may be included in some future release of Python, -but will not be included in any bugfix releases of -Python because they break backward compatibility. - .. _defusedxml: https://pypi.org/project/defusedxml/ -.. _defusedexpat: https://pypi.org/project/defusedexpat/ .. _Billion Laughs: https://en.wikipedia.org/wiki/Billion_laughs .. _ZIP bomb: https://en.wikipedia.org/wiki/Zip_bomb .. _DTD: https://en.wikipedia.org/wiki/Document_type_definition diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index 97da6cab806e397b6d2a0924726ea8b31368948e..7126d8bd703f62902eb400059132529bd393b8bc 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -489,16 +489,20 @@ Path objects are traversable using the ``/`` operator. The final path component. -.. method:: Path.open(*, **) - - Invoke :meth:`ZipFile.open` on the current path. Accepts - the same arguments as :meth:`ZipFile.open`. - - .. caution:: - - The signature on this function changes in an incompatible way - in Python 3.9. For a future-compatible version, consider using - the third-party zipp.Path package (3.0 or later). +.. method:: Path.open(mode='r', *, pwd, **) + + Invoke :meth:`ZipFile.open` on the current path. + Allows opening for read or write, text or binary + through supported modes: 'r', 'w', 'rb', 'wb'. + Positional and keyword arguments are passed through to + :class:`io.TextIOWrapper` when opened as text and + ignored otherwise. + ``pwd`` is the ``pwd`` parameter to + :meth:`ZipFile.open`. + + .. versionchanged:: 3.9 + Added support for text and binary modes for open. Default + mode is now text. .. method:: Path.iterdir() diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst index aa61278e099ac651506b5cb7049aca516e1e97eb..ec60ea24db662709f0745715e91cf3c738885164 100644 --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -9,9 +9,9 @@ For applications that require data compression, the functions in this module allow compression and decompression, using the zlib library. The zlib library -has its own home page at http://www.zlib.net. There are known +has its own home page at https://www.zlib.net. There are known incompatibilities between the Python module and versions of the zlib library -earlier than 1.1.3; 1.1.3 has a security vulnerability, so we recommend using +earlier than 1.1.3; 1.1.3 has a `security vulnerability `_, so we recommend using 1.1.4 or later. zlib's functions have many options and often need to be used in a particular @@ -47,7 +47,7 @@ The available exception and functions in this module are: platforms, use ``adler32(data) & 0xffffffff``. -.. function:: compress(data, level=-1) +.. function:: compress(data, /, level=-1) Compresses the bytes in *data*, returning a bytes object containing compressed data. *level* is an integer from ``0`` to ``9`` or ``-1`` controlling the level of compression; @@ -132,7 +132,7 @@ The available exception and functions in this module are: platforms, use ``crc32(data) & 0xffffffff``. -.. function:: decompress(data, wbits=MAX_WBITS, bufsize=DEF_BUF_SIZE) +.. function:: decompress(data, /, wbits=MAX_WBITS, bufsize=DEF_BUF_SIZE) Decompresses the bytes in *data*, returning a bytes object containing the uncompressed data. The *wbits* parameter depends on @@ -337,4 +337,3 @@ the following constants: http://www.zlib.net/manual.html The zlib manual explains the semantics and usage of the library's many functions. - diff --git a/Doc/library/zoneinfo.rst b/Doc/library/zoneinfo.rst new file mode 100644 index 0000000000000000000000000000000000000000..3a4c12a73acd7268f382bf4415e1703a80bec4a7 --- /dev/null +++ b/Doc/library/zoneinfo.rst @@ -0,0 +1,413 @@ +:mod:`zoneinfo` --- IANA time zone support +========================================== + +.. module:: zoneinfo + :synopsis: IANA time zone support + +.. versionadded:: 3.9 + +.. moduleauthor:: Paul Ganssle +.. sectionauthor:: Paul Ganssle + +-------------- + +The :mod:`zoneinfo` module provides a concrete time zone implementation to +support the IANA time zone database as originally specified in :pep:`615`. By +default, :mod:`zoneinfo` uses the system's time zone data if available; if no +system time zone data is available, the library will fall back to using the +first-party `tzdata`_ package available on PyPI. + +.. seealso:: + + Module: :mod:`datetime` + Provides the :class:`~datetime.time` and :class:`~datetime.datetime` + types with which the :class:`ZoneInfo` class is designed to be used. + + Package `tzdata`_ + First-party package maintained by the CPython core developers to supply + time zone data via PyPI. + + +Using ``ZoneInfo`` +------------------ + +:class:`ZoneInfo` is a concrete implementation of the :class:`datetime.tzinfo` +abstract base class, and is intended to be attached to ``tzinfo``, either via +the constructor, the :meth:`datetime.replace ` +method or :meth:`datetime.astimezone `:: + + >>> from zoneinfo import ZoneInfo + >>> from datetime import datetime, timedelta + + >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles")) + >>> print(dt) + 2020-10-31 12:00:00-07:00 + + >>> dt.tzname() + 'PDT' + +Datetimes constructed in this way are compatible with datetime arithmetic and +handle daylight saving time transitions with no further intervention:: + + >>> dt_add = dt + timedelta(days=1) + + >>> print(dt_add) + 2020-11-01 12:00:00-08:00 + + >>> dt_add.tzname() + 'PST' + +These time zones also support the :attr:`~datetime.datetime.fold` attribute +introduced in :pep:`495`. During offset transitions which induce ambiguous +times (such as a daylight saving time to standard time transition), the offset +from *before* the transition is used when ``fold=0``, and the offset *after* +the transition is used when ``fold=1``, for example:: + + >>> dt = datetime(2020, 11, 1, 1, tzinfo=ZoneInfo("America/Los_Angeles")) + >>> print(dt) + 2020-11-01 01:00:00-07:00 + + >>> print(dt.replace(fold=1)) + 2020-11-01 01:00:00-08:00 + +When converting from another time zone, the fold will be set to the correct +value:: + + >>> from datetime import timezone + >>> LOS_ANGELES = ZoneInfo("America/Los_Angeles") + >>> dt_utc = datetime(2020, 11, 1, 8, tzinfo=timezone.utc) + + >>> # Before the PDT -> PST transition + >>> print(dt_utc.astimezone(LOS_ANGELES)) + 2020-11-01 01:00:00-07:00 + + >>> # After the PDT -> PST transition + >>> print((dt_utc + timedelta(hours=1)).astimezone(LOS_ANGELES)) + 2020-11-01 01:00:00-08:00 + +Data sources +------------ + +The ``zoneinfo`` module does not directly provide time zone data, and instead +pulls time zone information from the system time zone database or the +first-party PyPI package `tzdata`_, if available. Some systems, including +notably Windows systems, do not have an IANA database available, and so for +projects targeting cross-platform compatibility that require time zone data, it +is recommended to declare a dependency on tzdata. If neither system data nor +tzdata are available, all calls to :class:`ZoneInfo` will raise +:exc:`ZoneInfoNotFoundError`. + +.. _zoneinfo_data_configuration: + +Configuring the data sources +**************************** + +When ``ZoneInfo(key)`` is called, the constructor first searches the +directories specified in :data:`TZPATH` for a file matching ``key``, and on +failure looks for a match in the tzdata package. This behavior can be +configured in three ways: + +1. The default :data:`TZPATH` when not otherwise specified can be configured at + :ref:`compile time `. +2. :data:`TZPATH` can be configured using :ref:`an environment variable + `. +3. At :ref:`runtime `, the search path can be + manipulated using the :func:`reset_tzpath` function. + +.. _zoneinfo_data_compile_time_config: + +Compile-time configuration +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The default :data:`TZPATH` includes several common deployment locations for the +time zone database (except on Windows, where there are no "well-known" +locations for time zone data). On POSIX systems, downstream distributors and +those building Python from source who know where their system +time zone data is deployed may change the default time zone path by specifying +the compile-time option ``TZPATH`` (or, more likely, the ``configure`` flag +``--with-tzpath``), which should be a string delimited by :data:`os.pathsep`. + +On all platforms, the configured value is available as the ``TZPATH`` key in +:func:`sysconfig.get_config_var`. + +.. _zoneinfo_data_environment_var: + +Environment configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ + +When initializing :data:`TZPATH` (either at import time or whenever +:func:`reset_tzpath` is called with no arguments), the ``zoneinfo`` module will +use the environment variable ``PYTHONTZPATH``, if it exists, to set the search +path. + +.. envvar:: PYTHONTZPATH + + This is an :data:`os.pathsep`-separated string containing the time zone + search path to use. It must consist of only absolute rather than relative + paths. Relative components specified in ``PYTHONTZPATH`` will not be used, + but otherwise the behavior when a relative path is specified is + implementation-defined; CPython will raise :exc:`InvalidTZPathWarning`, but + other implementations are free to silently ignore the erroneous component + or raise an exception. + +To set the system to ignore the system data and use the tzdata package +instead, set ``PYTHONTZPATH=""``. + +.. _zoneinfo_data_runtime_config: + +Runtime configuration +^^^^^^^^^^^^^^^^^^^^^ + +The TZ search path can also be configured at runtime using the +:func:`reset_tzpath` function. This is generally not an advisable operation, +though it is reasonable to use it in test functions that require the use of a +specific time zone path (or require disabling access to the system time zones). + + +The ``ZoneInfo`` class +---------------------- + +.. class:: ZoneInfo(key) + + A concrete :class:`datetime.tzinfo` subclass that represents an IANA time + zone specified by the string ``key``. Calls to the primary constructor will + always return objects that compare identically; put another way, barring + cache invalidation via :meth:`ZoneInfo.clear_cache`, for all values of + ``key``, the following assertion will always be true: + + .. code-block:: python + + a = ZoneInfo(key) + b = ZoneInfo(key) + assert a is b + + ``key`` must be in the form of a relative, normalized POSIX path, with no + up-level references. The constructor will raise :exc:`ValueError` if a + non-conforming key is passed. + + If no file matching ``key`` is found, the constructor will raise + :exc:`ZoneInfoNotFoundError`. + + +The ``ZoneInfo`` class has two alternate constructors: + +.. classmethod:: ZoneInfo.from_file(fobj, /, key=None) + + Constructs a ``ZoneInfo`` object from a file-like object returning bytes + (e.g. a file opened in binary mode or an :class:`io.BytesIO` object). + Unlike the primary constructor, this always constructs a new object. + + The ``key`` parameter sets the name of the zone for the purposes of + :py:meth:`~object.__str__` and :py:meth:`~object.__repr__`. + + Objects created via this constructor cannot be pickled (see `pickling`_). + +.. classmethod:: ZoneInfo.no_cache(key) + + An alternate constructor that bypasses the constructor's cache. It is + identical to the primary constructor, but returns a new object on each + call. This is most likely to be useful for testing or demonstration + purposes, but it can also be used to create a system with a different cache + invalidation strategy. + + Objects created via this constructor will also bypass the cache of a + deserializing process when unpickled. + + .. TODO: Add "See `cache_behavior`_" reference when that section is ready. + + .. caution:: + + Using this constructor may change the semantics of your datetimes in + surprising ways, only use it if you know that you need to. + +The following class methods are also available: + +.. classmethod:: ZoneInfo.clear_cache(*, only_keys=None) + + A method for invalidating the cache on the ``ZoneInfo`` class. If no + arguments are passed, all caches are invalidated and the next call to + the primary constructor for each key will return a new instance. + + If an iterable of key names is passed to the ``only_keys`` parameter, only + the specified keys will be removed from the cache. Keys passed to + ``only_keys`` but not found in the cache are ignored. + + .. TODO: Add "See `cache_behavior`_" reference when that section is ready. + + .. warning:: + + Invoking this function may change the semantics of datetimes using + ``ZoneInfo`` in surprising ways; this modifies process-wide global state + and thus may have wide-ranging effects. Only use it if you know that you + need to. + +The class has one attribute: + +.. attribute:: ZoneInfo.key + + This is a read-only :term:`attribute` that returns the value of ``key`` + passed to the constructor, which should be a lookup key in the IANA time + zone database (e.g. ``America/New_York``, ``Europe/Paris`` or + ``Asia/Tokyo``). + + For zones constructed from file without specifying a ``key`` parameter, + this will be set to ``None``. + + .. note:: + + Although it is a somewhat common practice to expose these to end users, + these values are designed to be primary keys for representing the + relevant zones and not necessarily user-facing elements. Projects like + CLDR (the Unicode Common Locale Data Repository) can be used to get + more user-friendly strings from these keys. + +String representations +********************** + +The string representation returned when calling :py:class:`str` on a +:class:`ZoneInfo` object defaults to using the :attr:`ZoneInfo.key` attribute (see +the note on usage in the attribute documentation):: + + >>> zone = ZoneInfo("Pacific/Kwajalein") + >>> str(zone) + 'Pacific/Kwajalein' + + >>> dt = datetime(2020, 4, 1, 3, 15, tzinfo=zone) + >>> f"{dt.isoformat()} [{dt.tzinfo}]" + '2020-04-01T03:15:00+12:00 [Pacific/Kwajalein]' + +For objects constructed from a file without specifying a ``key`` parameter, +``str`` falls back to calling :func:`repr`. ``ZoneInfo``'s ``repr`` is +implementation-defined and not necessarily stable between versions, but it is +guaranteed not to be a valid ``ZoneInfo`` key. + +.. _pickling: + +Pickle serialization +******************** + +Rather than serializing all transition data, ``ZoneInfo`` objects are +serialized by key, and ``ZoneInfo`` objects constructed from files (even those +with a value for ``key`` specified) cannot be pickled. + +The behavior of a ``ZoneInfo`` file depends on how it was constructed: + +1. ``ZoneInfo(key)``: When constructed with the primary constructor, a + ``ZoneInfo`` object is serialized by key, and when deserialized, the + deserializing process uses the primary and thus it is expected that these + are expected to be the same object as other references to the same time + zone. For example, if ``europe_berlin_pkl`` is a string containing a pickle + constructed from ``ZoneInfo("Europe/Berlin")``, one would expect the + following behavior: + + .. code-block:: pycon + + >>> a = ZoneInfo("Europe/Berlin") + >>> b = pickle.loads(europe_berlin_pkl) + >>> a is b + True + +2. ``ZoneInfo.no_cache(key)``: When constructed from the cache-bypassing + constructor, the ``ZoneInfo`` object is also serialized by key, but when + deserialized, the deserializing process uses the cache bypassing + constructor. If ``europe_berlin_pkl_nc`` is a string containing a pickle + constructed from ``ZoneInfo.no_cache("Europe/Berlin")``, one would expect + the following behavior: + + .. code-block:: pycon + + >>> a = ZoneInfo("Europe/Berlin") + >>> b = pickle.loads(europe_berlin_pkl_nc) + >>> a is b + False + +3. ``ZoneInfo.from_file(fobj, /, key=None)``: When constructed from a file, the + ``ZoneInfo`` object raises an exception on pickling. If an end user wants to + pickle a ``ZoneInfo`` constructed from a file, it is recommended that they + use a wrapper type or a custom serialization function: either serializing by + key or storing the contents of the file object and serializing that. + +This method of serialization requires that the time zone data for the required +key be available on both the serializing and deserializing side, similar to the +way that references to classes and functions are expected to exist in both the +serializing and deserializing environments. It also means that no guarantees +are made about the consistency of results when unpickling a ``ZoneInfo`` +pickled in an environment with a different version of the time zone data. + +Functions +--------- + +.. function:: available_timezones() + + Get a set containing all the valid keys for IANA time zones available + anywhere on the time zone path. This is recalculated on every call to the + function. + + This function only includes canonical zone names and does not include + "special" zones such as those under the ``posix/`` and ``right/`` + directories, or the ``posixrules`` zone. + + .. caution:: + + This function may open a large number of files, as the best way to + determine if a file on the time zone path is a valid time zone is to + read the "magic string" at the beginning. + + .. note:: + + These values are not designed to be exposed to end-users; for user + facing elements, applications should use something like CLDR (the + Unicode Common Locale Data Repository) to get more user-friendly + strings. See also the cautionary note on :attr:`ZoneInfo.key`. + +.. function:: reset_tzpath(to=None) + + Sets or resets the time zone search path (:data:`TZPATH`) for the module. + When called with no arguments, :data:`TZPATH` is set to the default value. + + Calling ``reset_tzpath`` will not invalidate the :class:`ZoneInfo` cache, + and so calls to the primary ``ZoneInfo`` constructor will only use the new + ``TZPATH`` in the case of a cache miss. + + The ``to`` parameter must be a :term:`sequence` of strings or + :class:`os.PathLike` and not a string, all of which must be absolute paths. + :exc:`ValueError` will be raised if something other than an absolute path + is passed. + +Globals +------- + +.. data:: TZPATH + + A read-only sequence representing the time zone search path -- when + constructing a ``ZoneInfo`` from a key, the key is joined to each entry in + the ``TZPATH``, and the first file found is used. + + ``TZPATH`` may contain only absolute paths, never relative paths, + regardless of how it is configured. + + The object that ``zoneinfo.TZPATH`` points to may change in response to a + call to :func:`reset_tzpath`, so it is recommended to use + ``zoneinfo.TZPATH`` rather than importing ``TZPATH`` from ``zoneinfo`` or + assigning a long-lived variable to ``zoneinfo.TZPATH``. + + For more information on configuring the time zone search path, see + :ref:`zoneinfo_data_configuration`. + +Exceptions and warnings +----------------------- + +.. exception:: ZoneInfoNotFoundError + + Raised when construction of a :class:`ZoneInfo` object fails because the + specified key could not be found on the system. This is a subclass of + :exc:`KeyError`. + +.. exception:: InvalidTZPathWarning + + Raised when :envvar:`PYTHONTZPATH` contains an invalid component that will + be filtered out, such as a relative path. + +.. Links and references: + +.. _tzdata: https://pypi.org/project/tzdata/ diff --git a/Doc/license.rst b/Doc/license.rst index 472a5cf3d88b3409c838cff7e26ec7436fb96e4b..f487d98b2b43a3b596c80158790c70828ec01908 100644 --- a/Doc/license.rst +++ b/Doc/license.rst @@ -72,6 +72,19 @@ make these releases possible. Terms and conditions for accessing or otherwise using Python ============================================================ +Python software and documentation are licensed under the +:ref:`PSF License Agreement `. + +Starting with Python 3.8.6, examples, recipes, and other code in +the documentation are dual licensed under the PSF License Agreement +and the :ref:`Zero-Clause BSD license `. + +Some software incorporated into Python is under different licenses. +The licenses are listed with code falling under that license. +See :ref:`OtherLicenses` for an incomplete list of these licenses. + + +.. _PSF-license: PSF LICENSE AGREEMENT FOR PYTHON |release| ------------------------------------------ @@ -87,7 +100,7 @@ PSF LICENSE AGREEMENT FOR PYTHON |release| analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python |release| alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of - copyright, i.e., "Copyright © 2001-2020 Python Software Foundation; All Rights + copyright, i.e., "Copyright © 2001-2021 Python Software Foundation; All Rights Reserved" are retained in Python |release| alone or in any derivative version prepared by Licensee. @@ -258,6 +271,27 @@ CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 SOFTWARE. +.. _BSD0: + +ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON |release| DOCUMENTATION +---------------------------------------------------------------------- + +.. parsed-literal:: + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + + +.. _OtherLicenses: + Licenses and Acknowledgements for Incorporated Software ======================================================= @@ -889,7 +923,7 @@ libmpdec The :mod:`_decimal` module is built using an included copy of the libmpdec library unless the build is configured ``--with-system-libmpdec``:: - Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + Copyright (c) 2008-2020 Stefan Krah. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index feaf3109d5a24e1d10c53e59055cd49b6e973aca..7e666351b1b31e2750cafa5533b86c7e6a9a09fd 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -44,7 +44,8 @@ executed:: Summarizing: -.. productionlist:: + +.. productionlist:: python-grammar compound_stmt: `if_stmt` : | `while_stmt` : | `for_stmt` @@ -89,7 +90,7 @@ The :keyword:`!if` statement The :keyword:`if` statement is used for conditional execution: -.. productionlist:: +.. productionlist:: python-grammar if_stmt: "if" `assignment_expression` ":" `suite` : ("elif" `assignment_expression` ":" `suite`)* : ["else" ":" `suite`] @@ -115,7 +116,7 @@ The :keyword:`!while` statement The :keyword:`while` statement is used for repeated execution as long as an expression is true: -.. productionlist:: +.. productionlist:: python-grammar while_stmt: "while" `assignment_expression` ":" `suite` : ["else" ":" `suite`] @@ -151,7 +152,7 @@ The :keyword:`!for` statement The :keyword:`for` statement is used to iterate over the elements of a sequence (such as a string, tuple or list) or other iterable object: -.. productionlist:: +.. productionlist:: python-grammar for_stmt: "for" `target_list` "in" `expression_list` ":" `suite` : ["else" ":" `suite`] @@ -234,7 +235,7 @@ The :keyword:`!try` statement The :keyword:`try` statement specifies exception handlers and/or cleanup code for a group of statements: -.. productionlist:: +.. productionlist:: python-grammar try_stmt: `try1_stmt` | `try2_stmt` try1_stmt: "try" ":" `suite` : ("except" [`expression` ["as" `identifier`]] ":" `suite`)+ @@ -253,7 +254,8 @@ present, must be last; it matches any exception. For an except clause with an expression, that expression is evaluated, and the clause matches the exception if the resulting object is "compatible" with the exception. An object is compatible with an exception if it is the class or a base class of the exception -object or a tuple containing an item compatible with the exception. +object, or a tuple containing an item that is the class or a base class of +the exception object. If no except clause matches the exception, the search for an exception handler continues in the surrounding code and on the invocation stack. [#]_ @@ -390,7 +392,7 @@ methods defined by a context manager (see section :ref:`context-managers`). This allows common :keyword:`try`...\ :keyword:`except`...\ :keyword:`finally` usage patterns to be encapsulated for convenient reuse. -.. productionlist:: +.. productionlist:: python-grammar with_stmt: "with" `with_item` ("," `with_item`)* ":" `suite` with_item: `expression` ["as" `target`] @@ -503,11 +505,11 @@ Function definitions A function definition defines a user-defined function object (see section :ref:`types`): -.. productionlist:: +.. productionlist:: python-grammar funcdef: [`decorators`] "def" `funcname` "(" [`parameter_list`] ")" : ["->" `expression`] ":" `suite` decorators: `decorator`+ - decorator: "@" `dotted_name` ["(" [`argument_list` [","]] ")"] NEWLINE + decorator: "@" `assignment_expression` NEWLINE dotted_name: `identifier` ("." `identifier`)* parameter_list: `defparameter` ("," `defparameter`)* "," "/" ["," [`parameter_list_no_posonly`]] : | `parameter_list_no_posonly` @@ -550,6 +552,11 @@ is roughly equivalent to :: except that the original function is not temporarily bound to the name ``func``. +.. versionchanged:: 3.9 + Functions may be decorated with any valid :token:`assignment_expression`. + Previously, the grammar was much more restrictive; see :pep:`614` for + details. + .. index:: triple: default; parameter; value single: argument; function definition @@ -665,7 +672,7 @@ Class definitions A class definition defines a class object (see section :ref:`types`): -.. productionlist:: +.. productionlist:: python-grammar classdef: [`decorators`] "class" `classname` [`inheritance`] ":" `suite` inheritance: "(" [`argument_list`] ")" classname: `identifier` @@ -717,6 +724,11 @@ is roughly equivalent to :: The evaluation rules for the decorator expressions are the same as for function decorators. The result is then bound to the class name. +.. versionchanged:: 3.9 + Classes may be decorated with any valid :token:`assignment_expression`. + Previously, the grammar was much more restrictive; see :pep:`614` for + details. + **Programmer's note:** Variables defined in the class definition are class attributes; they are shared by instances. Instance attributes can be set in a method with ``self.name = value``. Both class and instance attributes are @@ -752,7 +764,7 @@ Coroutines Coroutine function definition ----------------------------- -.. productionlist:: +.. productionlist:: python-grammar async_funcdef: [`decorators`] "async" "def" `funcname` "(" [`parameter_list`] ")" : ["->" `expression`] ":" `suite` @@ -785,15 +797,15 @@ An example of a coroutine function:: The :keyword:`!async for` statement ----------------------------------- -.. productionlist:: +.. productionlist:: python-grammar async_for_stmt: "async" `for_stmt` -An :term:`asynchronous iterable` is able to call asynchronous code in its -*iter* implementation, and :term:`asynchronous iterator` can call asynchronous -code in its *next* method. +An :term:`asynchronous iterable` provides an ``__aiter__`` method that directly +returns an :term:`asynchronous iterator`, which can call asynchronous code in +its ``__anext__`` method. The ``async for`` statement allows convenient iteration over asynchronous -iterators. +iterables. The following code:: @@ -830,7 +842,7 @@ body of a coroutine function. The :keyword:`!async with` statement ------------------------------------ -.. productionlist:: +.. productionlist:: python-grammar async_with_stmt: "async" `with_stmt` An :term:`asynchronous context manager` is a :term:`context manager` that is @@ -844,8 +856,8 @@ The following code:: is semantically equivalent to:: manager = (EXPRESSION) - aexit = type(manager).__aexit__ aenter = type(manager).__aenter__ + aexit = type(manager).__aexit__ value = await aenter(manager) hit_except = False diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index d364e61b8cf46f2f792656b5ad7e09e165dfae78..3b3bd5524ec5dcea852bf06622365c2acf3a459b 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -156,13 +156,18 @@ NotImplemented object is accessed through the built-in name ``NotImplemented``. Numeric methods and rich comparison methods should return this value if they do not implement the operation for the operands provided. (The interpreter will then try the - reflected operation, or some other fallback, depending on the operator.) Its - truth value is true. + reflected operation, or some other fallback, depending on the operator.) It + should not be evaluated in a boolean context. See :ref:`implementing-the-arithmetic-operations` for more details. + .. versionchanged:: 3.9 + Evaluating ``NotImplemented`` in a boolean context is deprecated. While + it currently evaluates as true, it will emit a :exc:`DeprecationWarning`. + It will raise a :exc:`TypeError` in a future version of Python. + Ellipsis .. index:: @@ -182,6 +187,24 @@ Ellipsis related to mathematical numbers, but subject to the limitations of numerical representation in computers. + The string representations of the numeric classes, computed by + :meth:`__repr__` and :meth:`__str__`, have the following + properties: + + * They are valid numeric literals which, when passed to their + class constructor, produce an object having the value of the + original numeric. + + * The representation is in base 10, when possible. + + * Leading zeros, possibly excepting a single zero before a + decimal point, are not shown. + + * Trailing zeros, possibly excepting a single zero after a + decimal point, are not shown. + + * A sign is shown only when the number is negative. + Python distinguishes between integers, floating point numbers, and complex numbers: @@ -194,7 +217,6 @@ Ellipsis There are two types of integers: Integers (:class:`int`) - These represent numbers in an unlimited range, subject to available (virtual) memory only. For the purpose of shift and mask operations, a binary representation is assumed, and negative numbers are represented in a variant of @@ -1345,7 +1367,7 @@ Basic customization .. versionchanged:: 3.7 ``object.__format__(x, '')`` is now equivalent to ``str(x)`` rather - than ``format(str(self), '')``. + than ``format(str(x), '')``. .. _richcmpfuncs: @@ -1372,12 +1394,14 @@ Basic customization context (e.g., in the condition of an ``if`` statement), Python will call :func:`bool` on the value to determine if the result is true or false. - By default, :meth:`__ne__` delegates to :meth:`__eq__` and - inverts the result unless it is ``NotImplemented``. There are no other - implied relationships among the comparison operators, for example, - the truth of ``(x` ``object.__getattr__`` with arguments + ``obj`` and ``name``. + .. method:: object.__setattr__(self, name, value) @@ -1546,12 +1576,24 @@ access (use of, assignment to, or deletion of ``x.name``) for class instances. call the base class method with the same name, for example, ``object.__setattr__(self, name, value)``. + .. audit-event:: object.__setattr__ obj,name,value object.__setattr__ + + For certain sensitive attribute assignments, raises an + :ref:`auditing event ` ``object.__setattr__`` with arguments + ``obj``, ``name``, ``value``. + .. method:: object.__delattr__(self, name) Like :meth:`__setattr__` but for attribute deletion instead of assignment. This should only be implemented if ``del obj.name`` is meaningful for the object. + .. audit-event:: object.__delattr__ obj,name object.__delattr__ + + For certain sensitive attribute deletions, raises an + :ref:`auditing event ` ``object.__delattr__`` with arguments + ``obj`` and ``name``. + .. method:: object.__dir__(self) @@ -1740,7 +1782,7 @@ the descriptor defines :meth:`__set__` and/or :meth:`__delete__`, it is a data descriptor; if it defines neither, it is a non-data descriptor. Normally, data descriptors define both :meth:`__get__` and :meth:`__set__`, while non-data descriptors have just the :meth:`__get__` method. Data descriptors with -:meth:`__set__` and :meth:`__get__` defined always override a redefinition in an +:meth:`__get__` and :meth:`__set__` (and/or :meth:`__delete__`) defined always override a redefinition in an instance dictionary. In contrast, non-data descriptors can be overridden by instances. @@ -2125,7 +2167,7 @@ Emulating callable objects .. index:: pair: call; instance Called when the instance is "called" as a function; if this method is defined, - ``x(arg1, arg2, ...)`` is a shorthand for ``x.__call__(arg1, arg2, ...)``. + ``x(arg1, arg2, ...)`` roughly translates to ``type(x).__call__(x, arg1, ...)``. .. _sequence-types: @@ -2371,10 +2413,11 @@ left undefined. .. note:: - If the right operand's type is a subclass of the left operand's type and that - subclass provides the reflected method for the operation, this method will be - called before the left operand's non-reflected method. This behavior allows - subclasses to override their ancestors' operations. + If the right operand's type is a subclass of the left operand's type and + that subclass provides a different implementation of the reflected method + for the operation, this method will be called before the left operand's + non-reflected method. This behavior allows subclasses to override their + ancestors' operations. .. method:: object.__iadd__(self, other) @@ -2404,6 +2447,13 @@ left undefined. :ref:`faq-augmented-assignment-tuple-error`), but this behavior is in fact part of the data model. + .. note:: + + Due to a bug in the dispatching mechanism for ``**=``, a class that + defines :meth:`__ipow__` but returns ``NotImplemented`` would fail to + fall back to ``x.__pow__(y)`` and ``y.__rpow__(x)``. This bug is fixed + in Python 3.10. + .. method:: object.__neg__(self) object.__pos__(self) @@ -2596,7 +2646,7 @@ Awaitable Objects ----------------- An :term:`awaitable` object generally implements an :meth:`__await__` method. -:term:`Coroutine` objects returned from :keyword:`async def` functions +:term:`Coroutine objects ` returned from :keyword:`async def` functions are awaitable. .. note:: @@ -2621,7 +2671,7 @@ are awaitable. Coroutine Objects ----------------- -:term:`Coroutine` objects are :term:`awaitable` objects. +:term:`Coroutine objects ` are :term:`awaitable` objects. A coroutine's execution can be controlled by calling :meth:`__await__` and iterating over the result. When the coroutine has finished executing and returns, the iterator raises :exc:`StopIteration`, and the exception's @@ -2766,6 +2816,6 @@ An example of an asynchronous context manager class:: method—that will instead have the opposite effect of explicitly *blocking* such fallback. -.. [#] For operands of the same type, it is assumed that if the non-reflected method - (such as :meth:`__add__`) fails the operation is not supported, which is why the - reflected method is not called. +.. [#] For operands of the same type, it is assumed that if the non-reflected + method -- such as :meth:`__add__` -- fails then the overall operation is not + supported, which is why the reflected method is not called. diff --git a/Doc/reference/executionmodel.rst b/Doc/reference/executionmodel.rst index 49cb86b56084d34fb595b32a8ad7b4a80cdfb38d..55ac01b6a844dcef91ea7358fbfe9781ee4cc63a 100644 --- a/Doc/reference/executionmodel.rst +++ b/Doc/reference/executionmodel.rst @@ -22,7 +22,9 @@ The following are blocks: a module, a function body, and a class definition. Each command typed interactively is a block. A script file (a file given as standard input to the interpreter or specified as a command line argument to the interpreter) is a code block. A script command (a command specified on the -interpreter command line with the :option:`-c` option) is a code block. The string +interpreter command line with the :option:`-c` option) is a code block. +A module run as a top level script (as module ``__main__``) from the command +line using a :option:`-m` argument is also a code block. The string argument passed to the built-in functions :func:`eval` and :func:`exec` is a code block. diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 8036a491c29ab11266f3cf0cf0ab121b96fc0216..512aa5af95619866735b5acc2bedf4557b202dd0 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -13,7 +13,7 @@ This chapter explains the meaning of the elements of expressions in Python. be used to describe syntax, not lexical analysis. When (one alternative of) a syntax rule has the form -.. productionlist:: * +.. productionlist:: python-grammar name: `othername` and no semantics are given, the semantics of this form of ``name`` are the same @@ -54,7 +54,7 @@ Atoms are the most basic elements of expressions. The simplest atoms are identifiers or literals. Forms enclosed in parentheses, brackets or braces are also categorized syntactically as atoms. The syntax for atoms is: -.. productionlist:: +.. productionlist:: python-grammar atom: `identifier` | `literal` | `enclosure` enclosure: `parenth_form` | `list_display` | `dict_display` | `set_display` : | `generator_expression` | `yield_atom` @@ -103,7 +103,7 @@ Literals Python supports string and bytes literals and various numeric literals: -.. productionlist:: +.. productionlist:: python-grammar literal: `stringliteral` | `bytesliteral` : | `integer` | `floatnumber` | `imagnumber` @@ -134,7 +134,7 @@ Parenthesized forms A parenthesized form is an optional expression list enclosed in parentheses: -.. productionlist:: +.. productionlist:: python-grammar parenth_form: "(" [`starred_expression`] ")" A parenthesized expression list yields whatever that expression list yields: if @@ -162,6 +162,8 @@ ambiguities and allow common typos to pass uncaught. Displays for lists, sets and dictionaries ----------------------------------------- +.. index:: single: comprehensions + For constructing a list, a set or a dictionary Python provides special syntax called "displays", each of them in two flavors: @@ -177,7 +179,7 @@ called "displays", each of them in two flavors: Common syntax elements for comprehensions are: -.. productionlist:: +.. productionlist:: python-grammar comprehension: `assignment_expression` `comp_for` comp_for: ["async"] "for" `target_list` "in" `or_test` [`comp_iter`] comp_iter: `comp_for` | `comp_if` @@ -243,7 +245,7 @@ List displays A list display is a possibly empty series of expressions enclosed in square brackets: -.. productionlist:: +.. productionlist:: python-grammar list_display: "[" [`starred_list` | `comprehension`] "]" A list display yields a new list object, the contents being specified by either @@ -260,6 +262,7 @@ Set displays .. index:: pair: set; display + pair: set; comprehensions object: set single: {} (curly brackets); set expression single: , (comma); expression list @@ -267,7 +270,7 @@ Set displays A set display is denoted by curly braces and distinguishable from dictionary displays by the lack of colons separating keys and values: -.. productionlist:: +.. productionlist:: python-grammar set_display: "{" (`starred_list` | `comprehension`) "}" A set display yields a new mutable set object, the contents being specified by @@ -287,6 +290,7 @@ Dictionary displays .. index:: pair: dictionary; display + pair: dictionary; comprehensions key, datum, key/datum pair object: dictionary single: {} (curly brackets); dictionary expression @@ -296,7 +300,7 @@ Dictionary displays A dictionary display is a possibly empty series of key/datum pairs enclosed in curly braces: -.. productionlist:: +.. productionlist:: python-grammar dict_display: "{" [`key_datum_list` | `dict_comprehension`] "}" key_datum_list: `key_datum` ("," `key_datum`)* [","] key_datum: `expression` ":" `expression` | "**" `or_expr` @@ -355,7 +359,7 @@ Generator expressions A generator expression is a compact generator notation in parentheses: -.. productionlist:: +.. productionlist:: python-grammar generator_expression: "(" `expression` `comp_for` ")" A generator expression yields a new generator object. Its syntax is the same as @@ -409,7 +413,7 @@ Yield expressions pair: yield; expression pair: generator; function -.. productionlist:: +.. productionlist:: python-grammar yield_atom: "(" `yield_expression` ")" yield_expression: "yield" [`expression_list` | "from" `expression`] @@ -746,7 +750,7 @@ Primaries Primaries represent the most tightly bound operations of the language. Their syntax is: -.. productionlist:: +.. productionlist:: python-grammar primary: `atom` | `attributeref` | `subscription` | `slicing` | `call` @@ -761,7 +765,7 @@ Attribute references An attribute reference is a primary followed by a period and a name: -.. productionlist:: +.. productionlist:: python-grammar attributeref: `primary` "." `identifier` .. index:: @@ -796,10 +800,10 @@ Subscriptions object: dictionary pair: sequence; item -A subscription selects an item of a sequence (string, tuple or list) or mapping -(dictionary) object: +Subscription of a sequence (string, tuple or list) or mapping (dictionary) +object usually selects an item from the collection: -.. productionlist:: +.. productionlist:: python-grammar subscription: `primary` "[" `expression_list` "]" The primary must evaluate to an object that supports subscription (lists or @@ -833,6 +837,11 @@ this method will need to explicitly add that support. A string's items are characters. A character is not a separate data type but a string of exactly one character. +Subscription of certain :term:`classes ` or :term:`types ` +creates a :ref:`generic alias `. +In this case, user-defined classes can support subscription by providing a +:meth:`__class_getitem__` classmethod. + .. _slicings: @@ -855,7 +864,7 @@ A slicing selects a range of items in a sequence object (e.g., a string, tuple or list). Slicings may be used as expressions or as targets in assignment or :keyword:`del` statements. The syntax for a slicing: -.. productionlist:: +.. productionlist:: python-grammar slicing: `primary` "[" `slice_list` "]" slice_list: `slice_item` ("," `slice_item`)* [","] slice_item: `expression` | `proper_slice` @@ -905,7 +914,7 @@ Calls A call calls a callable object (e.g., a :term:`function`) with a possibly empty series of :term:`arguments `: -.. productionlist:: +.. productionlist:: python-grammar call: `primary` "(" [`argument_list` [","] | `comprehension`] ")" argument_list: `positional_arguments` ["," `starred_and_keywords`] : ["," `keywords_arguments`] @@ -1088,7 +1097,7 @@ Await expression Suspend the execution of :term:`coroutine` on an :term:`awaitable` object. Can only be used inside a :term:`coroutine function`. -.. productionlist:: +.. productionlist:: python-grammar await_expr: "await" `primary` .. versionadded:: 3.5 @@ -1106,7 +1115,7 @@ The power operator The power operator binds more tightly than unary operators on its left; it binds less tightly than unary operators on its right. The syntax is: -.. productionlist:: +.. productionlist:: python-grammar power: (`await_expr` | `primary`) ["**" `u_expr`] Thus, in an unparenthesized sequence of power and unary operators, the operators @@ -1139,7 +1148,7 @@ Unary arithmetic and bitwise operations All unary arithmetic and bitwise operations have the same priority: -.. productionlist:: +.. productionlist:: python-grammar u_expr: `power` | "-" `u_expr` | "+" `u_expr` | "~" `u_expr` .. index:: @@ -1183,7 +1192,7 @@ that some of these operations also apply to certain non-numeric types. Apart from the power operator, there are only two levels, one for multiplicative operators and one for additive operators: -.. productionlist:: +.. productionlist:: python-grammar m_expr: `u_expr` | `m_expr` "*" `u_expr` | `m_expr` "@" `m_expr` | : `m_expr` "//" `u_expr` | `m_expr` "/" `u_expr` | : `m_expr` "%" `u_expr` @@ -1279,7 +1288,7 @@ Shifting operations The shifting operations have lower priority than the arithmetic operations: -.. productionlist:: +.. productionlist:: python-grammar shift_expr: `a_expr` | `shift_expr` ("<<" | ">>") `a_expr` These operators accept integers as arguments. They shift the first argument to @@ -1300,7 +1309,7 @@ Binary bitwise operations Each of the three bitwise operations has a different priority level: -.. productionlist:: +.. productionlist:: python-grammar and_expr: `shift_expr` | `and_expr` "&" `shift_expr` xor_expr: `and_expr` | `xor_expr` "^" `and_expr` or_expr: `xor_expr` | `or_expr` "|" `xor_expr` @@ -1349,7 +1358,7 @@ lower than that of any arithmetic, shifting or bitwise operation. Also unlike C, expressions like ``a < b < c`` have the interpretation that is conventional in mathematics: -.. productionlist:: +.. productionlist:: python-grammar comparison: `or_expr` (`comp_operator` `or_expr`)* comp_operator: "<" | ">" | "==" | ">=" | "<=" | "!=" : | "is" ["not"] | ["not"] "in" @@ -1608,7 +1617,7 @@ Boolean operations pair: Conditional; expression pair: Boolean; operation -.. productionlist:: +.. productionlist:: python-grammar or_test: `and_test` | `or_test` "or" `and_test` and_test: `not_test` | `and_test` "and" `not_test` not_test: `comparison` | "not" `not_test` @@ -1647,12 +1656,29 @@ returns a boolean value regardless of the type of its argument Assignment expressions ====================== -.. productionlist:: +.. productionlist:: python-grammar assignment_expression: [`identifier` ":="] `expression` -.. TODO: BPO-39868 +An assignment expression (sometimes also called a "named expression" or +"walrus") assigns an :token:`expression` to an :token:`identifier`, while also +returning the value of the :token:`expression`. + +One common use case is when handling matched regular expressions: + +.. code-block:: python + + if matching := pattern.search(data): + do_something(matching) + +Or, when processing a file stream in chunks: + +.. code-block:: python + + while chunk := file.read(9000): + process(chunk) -See :pep:`572` for more details about assignment expressions. +.. versionadded:: 3.8 + See :pep:`572` for more details about assignment expressions. .. _if_expr: @@ -1666,7 +1692,7 @@ Conditional expressions single: if; conditional expression single: else; conditional expression -.. productionlist:: +.. productionlist:: python-grammar conditional_expression: `or_test` ["if" `or_test` "else" `expression`] expression: `conditional_expression` | `lambda_expr` expression_nocond: `or_test` | `lambda_expr_nocond` @@ -1693,7 +1719,7 @@ Lambdas pair: anonymous; function single: : (colon); lambda expression -.. productionlist:: +.. productionlist:: python-grammar lambda_expr: "lambda" [`parameter_list`] ":" `expression` lambda_expr_nocond: "lambda" [`parameter_list`] ":" `expression_nocond` @@ -1720,7 +1746,7 @@ Expression lists pair: expression; list single: , (comma); expression list -.. productionlist:: +.. productionlist:: python-grammar expression_list: `expression` ("," `expression`)* [","] starred_list: `starred_item` ("," `starred_item`)* [","] starred_expression: `expression` | (`starred_item` ",")* [`starred_item`] diff --git a/Doc/reference/grammar.rst b/Doc/reference/grammar.rst index 83d0f8532c636662139e5178700ee6d52be68f6e..acf83765b5796cc8883e66a70cdfb81f0e7698db 100644 --- a/Doc/reference/grammar.rst +++ b/Doc/reference/grammar.rst @@ -1,7 +1,19 @@ Full Grammar specification ========================== -This is the full Python grammar, as it is read by the parser generator and used -to parse Python source files: +This is the full Python grammar, derived directly from the grammar +used to generate the CPython parser (see :source:`Grammar/python.gram`). +The version here omits details related to code generation and +error recovery. -.. literalinclude:: ../../Grammar/Grammar +The notation is a mixture of `EBNF +`_ +and `PEG `_. +In particular, ``&`` followed by a symbol, token or parenthesized +group indicates a positive lookahead (i.e., is required to match but +not consumed), while ``!`` indicates a negative lookahead (i.e., is +required _not_ to match). We use the ``|`` separator to mean PEG's +"ordered choice" (written as ``/`` in traditional PEG grammars). + +.. literalinclude:: ../../Grammar/python.gram + :language: peg diff --git a/Doc/reference/import.rst b/Doc/reference/import.rst index 1c98aab7d83aadb138ce98faa758b0545cf2f598..c5952426fdcf8d1800678885fe0b2353222dbe2c 100644 --- a/Doc/reference/import.rst +++ b/Doc/reference/import.rst @@ -83,7 +83,7 @@ module. Specifically, any module that contains a ``__path__`` attribute is considered a package. All modules have a name. Subpackage names are separated from their parent -package name by dots, akin to Python's standard attribute access syntax. Thus +package name by a dot, akin to Python's standard attribute access syntax. Thus you might have a module called :mod:`sys` and a package called :mod:`email`, which in turn has a subpackage called :mod:`email.mime` and a module within that subpackage called :mod:`email.mime.text`. @@ -202,6 +202,8 @@ named module, the two module objects will *not* be the same. By contrast, reinitialise the module contents by rerunning the module's code. +.. _finders-and-loaders: + Finders and loaders ------------------- @@ -678,7 +680,7 @@ Here are the exact rules used: Cached bytecode invalidation ---------------------------- -Before Python loads cached bytecode from ``.pyc`` file, it checks whether the +Before Python loads cached bytecode from a ``.pyc`` file, it checks whether the cache is up-to-date with the source ``.py`` file. By default, Python does this by storing the source's last-modified timestamp and size in the cache file when writing it. At runtime, the import system then validates the cache file by @@ -855,9 +857,8 @@ module. ``find_spec()`` returns a fully populated spec for the module. This spec will always have "loader" set (with one exception). To indicate to the import machinery that the spec represents a namespace -:term:`portion`, the path entry finder sets "loader" on the spec to -``None`` and "submodule_search_locations" to a list containing the -portion. +:term:`portion`, the path entry finder sets "submodule_search_locations" to +a list containing the portion. .. versionchanged:: 3.4 :meth:`~importlib.abc.PathEntryFinder.find_spec` replaced @@ -873,18 +874,7 @@ portion. :meth:`~importlib.abc.PathEntryFinder.find_loader` takes one argument, the fully qualified name of the module being imported. ``find_loader()`` returns a 2-tuple where the first item is the loader and the second item - is a namespace :term:`portion`. When the first item (i.e. the loader) is - ``None``, this means that while the path entry finder does not have a - loader for the named module, it knows that the path entry contributes to - a namespace portion for the named module. This will almost always be the - case where Python is asked to import a namespace package that has no - physical presence on the file system. When a path entry finder returns - ``None`` for the loader, the second item of the 2-tuple return value must - be a sequence, although it can be empty. - - If ``find_loader()`` returns a non-``None`` loader value, the portion is - ignored and the loader is returned from the path based finder, terminating - the search through the path entries. + is a namespace :term:`portion`. For backwards compatibility with other implementations of the import protocol, many path entry finders also support the same, diff --git a/Doc/reference/introduction.rst b/Doc/reference/introduction.rst index bb7e3906dba6072a83bbeeda437de40dba2d06b0..72e874ee98e466063056fe06113f5dc679482913 100644 --- a/Doc/reference/introduction.rst +++ b/Doc/reference/introduction.rst @@ -93,7 +93,7 @@ Notation The descriptions of lexical analysis and syntax use a modified BNF grammar notation. This uses the following style of definition: -.. productionlist:: * +.. productionlist:: notation name: `lc_letter` (`lc_letter` | "_")* lc_letter: "a"..."z" diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index d0e7fde0f5ae3398f6bfd0ab6078e1b46c63faa6..77e0578f5d89b65dd4f8ba7caa19fabb32349beb 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -296,7 +296,7 @@ Unicode Character Database as included in the :mod:`unicodedata` module. Identifiers are unlimited in length. Case is significant. -.. productionlist:: +.. productionlist:: python-grammar identifier: `xid_start` `xid_continue`* id_start: id_continue: @@ -316,7 +316,7 @@ The Unicode category codes mentioned above stand for: * *Nd* - decimal numbers * *Pc* - connector punctuations * *Other_ID_Start* - explicit list of characters in `PropList.txt - `_ to support backwards + `_ to support backwards compatibility * *Other_ID_Continue* - likewise @@ -412,7 +412,7 @@ String and Bytes literals String literals are described by the following lexical definitions: -.. productionlist:: +.. productionlist:: python-grammar stringliteral: [`stringprefix`](`shortstring` | `longstring`) stringprefix: "r" | "u" | "R" | "U" | "f" | "F" : | "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF" @@ -424,7 +424,7 @@ String literals are described by the following lexical definitions: longstringchar: stringescapeseq: "\" -.. productionlist:: +.. productionlist:: python-grammar bytesliteral: `bytesprefix`(`shortbytes` | `longbytes`) bytesprefix: "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB" shortbytes: "'" `shortbytesitem`* "'" | '"' `shortbytesitem`* '"' @@ -637,9 +637,11 @@ and formatted string literals may be concatenated with plain string literals. single: string; formatted literal single: string; interpolated literal single: f-string + single: fstring single: {} (curly brackets); in formatted string literal single: ! (exclamation); in formatted string literal single: : (colon); in formatted string literal + single: = (equals); for help in debugging using string literals .. _f-strings: Formatted string literals @@ -657,9 +659,9 @@ Escape sequences are decoded like in ordinary string literals (except when a literal is also marked as a raw string). After decoding, the grammar for the contents of the string is: -.. productionlist:: +.. productionlist:: python-grammar f_string: (`literal_char` | "{{" | "}}" | `replacement_field`)* - replacement_field: "{" `f_expression` ["!" `conversion`] [":" `format_spec`] "}" + replacement_field: "{" `f_expression` ["="] ["!" `conversion`] [":" `format_spec`] "}" f_expression: (`conditional_expression` | "*" `or_expr`) : ("," `conditional_expression` | "," "*" `or_expr`)* [","] : | `yield_expression` @@ -671,10 +673,11 @@ The parts of the string outside curly braces are treated literally, except that any doubled curly braces ``'{{'`` or ``'}}'`` are replaced with the corresponding single curly brace. A single opening curly bracket ``'{'`` marks a replacement field, which starts with a -Python expression. After the expression, there may be a conversion field, -introduced by an exclamation point ``'!'``. A format specifier may also -be appended, introduced by a colon ``':'``. A replacement field ends -with a closing curly bracket ``'}'``. +Python expression. To display both the expression text and its value after +evaluation, (useful in debugging), an equal sign ``'='`` may be added after the +expression. A conversion field, introduced by an exclamation point ``'!'`` may +follow. A format specifier may also be appended, introduced by a colon ``':'``. +A replacement field ends with a closing curly bracket ``'}'``. Expressions in formatted string literals are treated like regular Python expressions surrounded by parentheses, with a few exceptions. @@ -690,6 +693,17 @@ left to right. containing an :keyword:`async for` clause were illegal in the expressions in formatted string literals due to a problem with the implementation. +When the equal sign ``'='`` is provided, the output will have the expression +text, the ``'='`` and the evaluated value. Spaces after the opening brace +``'{'``, within the expression and after the ``'='`` are all retained in the +output. By default, the ``'='`` causes the :func:`repr` of the expression to be +provided, unless there is a format specified. When a format is specified it +defaults to the :func:`str` of the expression unless a conversion ``'!r'`` is +declared. + +.. versionadded:: 3.8 + The equal sign ``'='``. + If a conversion is specified, the result of evaluating the expression is converted before formatting. Conversion ``'!s'`` calls :func:`str` on the result, ``'!r'`` calls :func:`repr`, and ``'!a'`` calls :func:`ascii`. @@ -704,7 +718,7 @@ Top-level format specifiers may include nested replacement fields. These nested fields may include their own conversion fields and :ref:`format specifiers `, but may not include more deeply-nested replacement fields. The :ref:`format specifier mini-language ` is the same as that used by -the string .format() method. +the :meth:`str.format` method. Formatted string literals may be concatenated, but replacement fields cannot be split across literals. @@ -724,9 +738,22 @@ Some examples of formatted string literals:: >>> today = datetime(year=2017, month=1, day=27) >>> f"{today:%B %d, %Y}" # using date format specifier 'January 27, 2017' + >>> f"{today=:%B %d, %Y}" # using date format specifier and debugging + 'today=January 27, 2017' >>> number = 1024 >>> f"{number:#0x}" # using integer format specifier '0x400' + >>> foo = "bar" + >>> f"{ foo = }" # preserves whitespace + " foo = 'bar'" + >>> line = "The mill's closed" + >>> f"{line = }" + 'line = "The mill\'s closed"' + >>> f"{line = :20}" + "line = The mill's closed " + >>> f"{line = !r:20}" + 'line = "The mill\'s closed" ' + A consequence of sharing the same syntax as regular string literals is that characters in the replacement fields must not conflict with the @@ -793,7 +820,7 @@ Integer literals Integer literals are described by the following lexical definitions: -.. productionlist:: +.. productionlist:: python-grammar integer: `decinteger` | `bininteger` | `octinteger` | `hexinteger` decinteger: `nonzerodigit` (["_"] `digit`)* | "0"+ (["_"] "0")* bininteger: "0" ("b" | "B") (["_"] `bindigit`)+ @@ -837,7 +864,7 @@ Floating point literals Floating point literals are described by the following lexical definitions: -.. productionlist:: +.. productionlist:: python-grammar floatnumber: `pointfloat` | `exponentfloat` pointfloat: [`digitpart`] `fraction` | `digitpart` "." exponentfloat: (`digitpart` | `pointfloat`) `exponent` @@ -867,7 +894,7 @@ Imaginary literals Imaginary literals are described by the following lexical definitions: -.. productionlist:: +.. productionlist:: python-grammar imagnumber: (`floatnumber` | `digitpart`) ("j" | "J") An imaginary literal yields a complex number with a real part of 0.0. Complex @@ -934,4 +961,4 @@ occurrence outside string literals and comments is an unconditional error: .. rubric:: Footnotes -.. [#] http://www.unicode.org/Public/11.0.0/ucd/NameAliases.txt +.. [#] https://www.unicode.org/Public/11.0.0/ucd/NameAliases.txt diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index a8ec0fbe8b732cd5ece1d47a4df4c974dcd464c0..f8ab2e918c6a10d19cb63f0d76ff2e9ad0338292 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -11,7 +11,7 @@ A simple statement is comprised within a single logical line. Several simple statements may occur on a single line separated by semicolons. The syntax for simple statements is: -.. productionlist:: +.. productionlist:: python-grammar simple_stmt: `expression_stmt` : | `assert_stmt` : | `assignment_stmt` @@ -46,7 +46,7 @@ result; in Python, procedures return the value ``None``). Other uses of expression statements are allowed and occasionally useful. The syntax for an expression statement is: -.. productionlist:: +.. productionlist:: python-grammar expression_stmt: `starred_expression` An expression statement evaluates the expression list (which may be a single @@ -82,7 +82,7 @@ Assignment statements Assignment statements are used to (re)bind names to values and to modify attributes or items of mutable objects: -.. productionlist:: +.. productionlist:: python-grammar assignment_stmt: (`target_list` "=")+ (`starred_expression` | `yield_expression`) target_list: `target` ("," `target`)* [","] target: `identifier` @@ -280,7 +280,7 @@ Augmented assignment statements Augmented assignment is the combination, in a single statement, of a binary operation and an assignment statement: -.. productionlist:: +.. productionlist:: python-grammar augmented_assignment_stmt: `augtarget` `augop` (`expression_list` | `yield_expression`) augtarget: `identifier` | `attributeref` | `subscription` | `slicing` augop: "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**=" @@ -328,7 +328,7 @@ Annotated assignment statements :term:`Annotation ` assignment is the combination, in a single statement, of a variable or attribute annotation and an optional assignment statement: -.. productionlist:: +.. productionlist:: python-grammar annotated_assignment_stmt: `augtarget` ":" `expression` : ["=" (`starred_expression` | `yield_expression`)] @@ -385,7 +385,7 @@ The :keyword:`!assert` statement Assert statements are a convenient way to insert debugging assertions into a program: -.. productionlist:: +.. productionlist:: python-grammar assert_stmt: "assert" `expression` ["," `expression`] The simple form, ``assert expression``, is equivalent to :: @@ -425,7 +425,7 @@ The :keyword:`!pass` statement pair: null; operation pair: null; operation -.. productionlist:: +.. productionlist:: python-grammar pass_stmt: "pass" :keyword:`pass` is a null operation --- when it is executed, nothing happens. @@ -447,7 +447,7 @@ The :keyword:`!del` statement pair: deletion; target triple: deletion; target; list -.. productionlist:: +.. productionlist:: python-grammar del_stmt: "del" `target_list` Deletion is recursively defined very similar to the way assignment is defined. @@ -486,7 +486,7 @@ The :keyword:`!return` statement pair: function; definition pair: class; definition -.. productionlist:: +.. productionlist:: python-grammar return_stmt: "return" [`expression_list`] :keyword:`return` may only occur syntactically nested in a function definition, @@ -525,7 +525,7 @@ The :keyword:`!yield` statement single: function; generator exception: StopIteration -.. productionlist:: +.. productionlist:: python-grammar yield_stmt: `yield_expression` A :keyword:`yield` statement is semantically equivalent to a :ref:`yield @@ -560,7 +560,7 @@ The :keyword:`!raise` statement pair: raising; exception single: __traceback__ (exception attribute) -.. productionlist:: +.. productionlist:: python-grammar raise_stmt: "raise" [`expression` ["from" `expression`]] If no expressions are present, :keyword:`raise` re-raises the last exception @@ -663,7 +663,7 @@ The :keyword:`!break` statement statement: while pair: loop; statement -.. productionlist:: +.. productionlist:: python-grammar break_stmt: "break" :keyword:`break` may only occur syntactically nested in a :keyword:`for` or @@ -698,7 +698,7 @@ The :keyword:`!continue` statement pair: loop; statement keyword: finally -.. productionlist:: +.. productionlist:: python-grammar continue_stmt: "continue" :keyword:`continue` may only occur syntactically nested in a :keyword:`for` or @@ -725,7 +725,7 @@ The :keyword:`!import` statement exception: ImportError single: , (comma); import statement -.. productionlist:: +.. productionlist:: python-grammar import_stmt: "import" `module` ["as" `identifier`] ("," `module` ["as" `identifier`])* : | "from" `relative_module` "import" `identifier` ["as" `identifier`] : ("," `identifier` ["as" `identifier`])* @@ -859,7 +859,7 @@ that introduce incompatible changes to the language. It allows use of the new features on a per-module basis before the release in which the feature becomes standard. -.. productionlist:: * +.. productionlist:: python-grammar future_stmt: "from" "__future__" "import" `feature` ["as" `identifier`] : ("," `feature` ["as" `identifier`])* : | "from" "__future__" "import" "(" `feature` ["as" `identifier`] @@ -874,8 +874,8 @@ can appear before a future statement are: * blank lines, and * other future statements. -The only feature in Python 3.7 that requires using the future statement is -``annotations``. +The only feature that requires using the future statement is +``annotations`` (see :pep:`563`). All historical features enabled by the future statement are still recognized by Python 3. The list includes ``absolute_import``, ``division``, @@ -937,7 +937,7 @@ The :keyword:`!global` statement triple: global; name; binding single: , (comma); identifier list -.. productionlist:: +.. productionlist:: python-grammar global_stmt: "global" `identifier` ("," `identifier`)* The :keyword:`global` statement is a declaration which holds for the entire @@ -982,7 +982,7 @@ The :keyword:`!nonlocal` statement .. index:: statement: nonlocal single: , (comma); identifier list -.. productionlist:: +.. productionlist:: python-grammar nonlocal_stmt: "nonlocal" `identifier` ("," `identifier`)* .. XXX add when implemented diff --git a/Doc/reference/toplevel_components.rst b/Doc/reference/toplevel_components.rst index d5ffb37b2e58cde69f65d4ea134b521e2c4edb08..319c9de484241e231de677f91aee4a425ec127cf 100644 --- a/Doc/reference/toplevel_components.rst +++ b/Doc/reference/toplevel_components.rst @@ -66,7 +66,7 @@ File input All input read from non-interactive files has the same form: -.. productionlist:: +.. productionlist:: python-grammar file_input: (NEWLINE | `statement`)* This syntax is used in the following situations: @@ -85,7 +85,7 @@ Interactive input Input in interactive mode is parsed using the following grammar: -.. productionlist:: +.. productionlist:: python-grammar interactive_input: [`stmt_list`] NEWLINE | `compound_stmt` NEWLINE Note that a (top-level) compound statement must be followed by a blank line in @@ -103,5 +103,5 @@ Expression input :func:`eval` is used for expression input. It ignores leading whitespace. The string argument to :func:`eval` must have the following form: -.. productionlist:: +.. productionlist:: python-grammar eval_input: `expression_list` NEWLINE* diff --git a/Doc/requirements.txt b/Doc/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..47b78eeac817e010c759698cdafac7b1654fade7 --- /dev/null +++ b/Doc/requirements.txt @@ -0,0 +1,12 @@ +# Requirements to build the Python documentation + +# Sphinx version is pinned so that new versions that introduce new warnings +# won't suddenly cause build failures. Updating the version is fine as long +# as no warnings are raised by doing so. +sphinx==2.4.4 + +blurb + +# The theme used by the documentation is stored separately, so we need +# to install that as well. +python-docs-theme diff --git a/Doc/runtime.txt b/Doc/runtime.txt new file mode 100644 index 0000000000000000000000000000000000000000..548d71365f0ec73769cdca035854598aa03d5485 --- /dev/null +++ b/Doc/runtime.txt @@ -0,0 +1 @@ +3.7 \ No newline at end of file diff --git a/Doc/tools/extensions/asdl_highlight.py b/Doc/tools/extensions/asdl_highlight.py new file mode 100644 index 0000000000000000000000000000000000000000..b1989e53957072fc9fec4ba92731729f567839e6 --- /dev/null +++ b/Doc/tools/extensions/asdl_highlight.py @@ -0,0 +1,54 @@ +import os +import sys +from pathlib import Path + +CPYTHON_ROOT = Path(__file__).resolve().parent.parent.parent.parent +sys.path.append(str(CPYTHON_ROOT / "Parser")) + +from pygments.lexer import RegexLexer, bygroups, include, words +from pygments.token import (Comment, Generic, Keyword, Name, Operator, + Punctuation, Text) + +from asdl import builtin_types +from sphinx.highlighting import lexers + +class ASDLLexer(RegexLexer): + name = "ASDL" + aliases = ["asdl"] + filenames = ["*.asdl"] + _name = r"([^\W\d]\w*)" + _text_ws = r"(\s*)" + + tokens = { + "ws": [ + (r"\n", Text), + (r"\s+", Text), + (r"--.*?$", Comment.Singleline), + ], + "root": [ + include("ws"), + ( + r"(module)" + _text_ws + _name, + bygroups(Keyword, Text, Name.Tag), + ), + ( + r"(\w+)(\*\s|\?\s|\s)(\w+)", + bygroups(Name.Builtin.Pseudo, Operator, Name), + ), + (words(builtin_types), Name.Builtin), + (r"attributes", Name.Builtin), + ( + _name + _text_ws + "(=)", + bygroups(Name, Text, Operator), + ), + (_name, Name.Class), + (r"\|", Operator), + (r"{|}|\(|\)", Punctuation), + (r".", Text), + ], + } + + +def setup(app): + lexers["asdl"] = ASDLLexer() + return {'version': '1.0', 'parallel_read_safe': True} diff --git a/Doc/tools/extensions/c_annotations.py b/Doc/tools/extensions/c_annotations.py index fa8244a8fd318e9b68cb3178f5e2eba51788f51c..76c9d920cbe31f38ecaa6897bfc92bcab2b183ed 100644 --- a/Doc/tools/extensions/c_annotations.py +++ b/Doc/tools/extensions/c_annotations.py @@ -79,9 +79,9 @@ def add_annotations(self, app, doctree): classes=['stableabi'])) if par['objtype'] != 'function': continue - if not par[0].has_key('names') or not par[0]['names']: + if not par[0].has_key('ids') or not par[0]['ids']: continue - name = par[0]['names'][0] + name = par[0]['ids'][0] if name.startswith("c."): name = name[2:] entry = self.get(name) diff --git a/Doc/tools/extensions/peg_highlight.py b/Doc/tools/extensions/peg_highlight.py new file mode 100644 index 0000000000000000000000000000000000000000..8bc24670fbe0abe5020c6055f7bea80bb8ab25de --- /dev/null +++ b/Doc/tools/extensions/peg_highlight.py @@ -0,0 +1,75 @@ +from pygments.lexer import RegexLexer, bygroups, include +from pygments.token import Comment, Generic, Keyword, Name, Operator, Punctuation, Text + +from sphinx.highlighting import lexers + + +class PEGLexer(RegexLexer): + """Pygments Lexer for PEG grammar (.gram) files + + This lexer strips the following elements from the grammar: + + - Meta-tags + - Variable assignments + - Actions + - Lookaheads + - Rule types + - Rule options + - Rules named `invalid_*` or `incorrect_*` + """ + + name = "PEG" + aliases = ["peg"] + filenames = ["*.gram"] + _name = r"([^\W\d]\w*)" + _text_ws = r"(\s*)" + + tokens = { + "ws": [(r"\n", Text), (r"\s+", Text), (r"#.*$", Comment.Singleline),], + "lookaheads": [ + (r"(?<=\|\s)(&\w+\s?)", bygroups(None)), + (r"(?<=\|\s)(&'.+'\s?)", bygroups(None)), + (r'(?<=\|\s)(&".+"\s?)', bygroups(None)), + (r"(?<=\|\s)(&\(.+\)\s?)", bygroups(None)), + ], + "metas": [ + (r"(@\w+ '''(.|\n)+?''')", bygroups(None)), + (r"^(@.*)$", bygroups(None)), + ], + "actions": [(r"{(.|\n)+?}", bygroups(None)),], + "strings": [ + (r"'\w+?'", Keyword), + (r'"\w+?"', Keyword), + (r"'\W+?'", Text), + (r'"\W+?"', Text), + ], + "variables": [(_name + _text_ws + "(=)", bygroups(None, None, None),),], + "invalids": [ + (r"^(\s+\|\s+invalid_\w+\s*\n)", bygroups(None)), + (r"^(\s+\|\s+incorrect_\w+\s*\n)", bygroups(None)), + (r"^(#.*invalid syntax.*(?:.|\n)*)", bygroups(None),), + ], + "root": [ + include("invalids"), + include("ws"), + include("lookaheads"), + include("metas"), + include("actions"), + include("strings"), + include("variables"), + (r"\b(?!(NULL|EXTRA))([A-Z_]+)\b\s*(?!\()", Text,), + ( + r"^\s*" + _name + r"\s*" + r"(\[.*\])?" + r"\s*" + r"(\(.+\))?" + r"\s*(:)", + bygroups(Name.Function, None, None, Punctuation), + ), + (_name, Name.Function), + (r"[\||\.|\+|\*|\?]", Operator), + (r"{|}|\(|\)|\[|\]", Punctuation), + (r".", Text), + ], + } + + +def setup(app): + lexers["peg"] = PEGLexer() + return {"version": "1.0", "parallel_read_safe": True} diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index a128c705847e940ab13d870128fb7a2da0c61886..2fad9ec00cd568b0025d1ce4caa45f25465e1a47 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -31,7 +31,12 @@ from sphinx.util.nodes import split_explicit_title from sphinx.writers.text import TextWriter, TextTranslator from sphinx.writers.latex import LaTeXTranslator -from sphinx.domains.python import PyModulelevel, PyClassmember + +try: + from sphinx.domains.python import PyFunction, PyMethod +except ImportError: + from sphinx.domains.python import PyClassmember as PyMethod + from sphinx.domains.python import PyModulelevel as PyFunction # Support for checking for suspicious markup @@ -39,7 +44,7 @@ ISSUE_URI = 'https://bugs.python.org/issue%s' -SOURCE_URI = 'https://github.com/python/cpython/tree/3.8/%s' +SOURCE_URI = 'https://github.com/python/cpython/tree/3.9/%s' # monkey-patch reST parser to disable alphabetic and roman enumerated lists from docutils.parsers.rst.states import Body @@ -238,17 +243,18 @@ def needs_arglist(self): return False -class PyDecoratorFunction(PyDecoratorMixin, PyModulelevel): +class PyDecoratorFunction(PyDecoratorMixin, PyFunction): def run(self): # a decorator function is a function after all self.name = 'py:function' - return PyModulelevel.run(self) + return PyFunction.run(self) -class PyDecoratorMethod(PyDecoratorMixin, PyClassmember): +# TODO: Use sphinx.domains.python.PyDecoratorMethod when possible +class PyDecoratorMethod(PyDecoratorMixin, PyMethod): def run(self): self.name = 'py:method' - return PyClassmember.run(self) + return PyMethod.run(self) class PyCoroutineMixin(object): @@ -265,31 +271,31 @@ def handle_signature(self, sig, signode): return ret -class PyCoroutineFunction(PyCoroutineMixin, PyModulelevel): +class PyCoroutineFunction(PyCoroutineMixin, PyFunction): def run(self): self.name = 'py:function' - return PyModulelevel.run(self) + return PyFunction.run(self) -class PyCoroutineMethod(PyCoroutineMixin, PyClassmember): +class PyCoroutineMethod(PyCoroutineMixin, PyMethod): def run(self): self.name = 'py:method' - return PyClassmember.run(self) + return PyMethod.run(self) -class PyAwaitableFunction(PyAwaitableMixin, PyClassmember): +class PyAwaitableFunction(PyAwaitableMixin, PyFunction): def run(self): self.name = 'py:function' - return PyClassmember.run(self) + return PyFunction.run(self) -class PyAwaitableMethod(PyAwaitableMixin, PyClassmember): +class PyAwaitableMethod(PyAwaitableMixin, PyMethod): def run(self): self.name = 'py:method' - return PyClassmember.run(self) + return PyMethod.run(self) -class PyAbstractMethod(PyClassmember): +class PyAbstractMethod(PyMethod): def handle_signature(self, sig, signode): ret = super(PyAbstractMethod, self).handle_signature(sig, signode) @@ -299,7 +305,7 @@ def handle_signature(self, sig, signode): def run(self): self.name = 'py:method' - return PyClassmember.run(self) + return PyMethod.run(self) # Support for documenting version of removal in deprecations diff --git a/Doc/tools/static/switchers.js b/Doc/tools/static/switchers.js index c51f178ce645c0ca8369e78dc9506f3fff3a49b0..1a1c7d0fa57e23856f292d8e70e1c5a002878819 100644 --- a/Doc/tools/static/switchers.js +++ b/Doc/tools/static/switchers.js @@ -15,7 +15,6 @@ '3.8': '3.8', '3.7': '3.7', '3.6': '3.6', - '3.5': '3.5', '2.7': '2.7', }; diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index 33fbaf69c3fbdfeb654a2acc295beb3a2f34f051..9f0c42a9bb5abc9dc21ee7b9389ec6c7b5c15f2c 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -5,14 +5,13 @@ c-api/sequence,,:i2,o[i1:i2] c-api/tuple,,:high,p[low:high] c-api/unicode,,:end,str[start:end] c-api/unicode,,:start,unicode[start:start+length] -distutils/examples,267,`,This is the description of the ``foobar`` package. +distutils/examples,,`,This is the description of the ``foobar`` package. distutils/setupscript,,::, extending/embedding,,:numargs,"if(!PyArg_ParseTuple(args, "":numargs""))" extending/extending,,:myfunction,"PyArg_ParseTuple(args, ""D:myfunction"", &c);" extending/extending,,:set,"if (PyArg_ParseTuple(args, ""O:set_callback"", &temp)) {" extending/newtypes,,:call,"if (!PyArg_ParseTuple(args, ""sss:call"", &arg1, &arg2, &arg3)) {" faq/programming,,:chr,">=4.0) or 1+f(xc,yc,x*x-y*y+xc,2.0*x*y+yc,k-1,f):f(xc,yc,x,y,k,f):chr(" -faq/programming,,::,for x in sequence[::-1]: faq/programming,,:reduce,"print((lambda Ru,Ro,Iu,Io,IM,Sx,Sy:reduce(lambda x,y:x+y,map(lambda y," faq/programming,,:reduce,"Sx=Sx,Sy=Sy:reduce(lambda x,y:x+y,map(lambda x,xc=Ru,yc=yc,Ru=Ru,Ro=Ro," faq/windows,,:d48eceb,"Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32" @@ -24,6 +23,9 @@ howto/curses,,:blue,"2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and 7:white. howto/curses,,:magenta,"2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and 7:white. The" howto/curses,,:cyan,"2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and 7:white. The" howto/curses,,:white,"2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and 7:white. The" +howto/descriptor,,:root,"INFO:root" +howto/descriptor,,:Updating,"root:Updating" +howto/descriptor,,:Accessing,"root:Accessing" howto/instrumentation,,::,python$target:::function-entry howto/instrumentation,,:function,python$target:::function-entry howto/instrumentation,,::,python$target:::function-return @@ -82,6 +84,7 @@ howto/ipaddress,,::,IPv6Address('2001:db8::ffff:ffff') howto/ipaddress,,:ffff,IPv6Address('2001:db8::ffff:ffff') howto/logging,,:And,"WARNING:And this, too" howto/logging,,:And,"WARNING:root:And this, too" +howto/logging,,:And,"ERROR:root:And non-ASCII stuff, too, like " howto/logging,,:Doing,INFO:root:Doing something howto/logging,,:Finished,INFO:root:Finished howto/logging,,:logger,severity:logger name:message @@ -91,6 +94,7 @@ howto/logging,,:root,DEBUG:root:This message should go to the log file howto/logging,,:root,INFO:root:Doing something howto/logging,,:root,INFO:root:Finished howto/logging,,:root,INFO:root:So should this +howto/logging,,:root,"ERROR:root:And non-ASCII stuff, too, like " howto/logging,,:root,INFO:root:Started howto/logging,,:root,"WARNING:root:And this, too" howto/logging,,:root,WARNING:root:Look before you leap! @@ -106,6 +110,8 @@ howto/pyporting,,::,Programming Language :: Python :: 3 howto/regex,,::, howto/regex,,:foo,(?:foo) howto/urllib2,,:password,"""joe:password@example.com""" +library/ast,,:upper,lower:upper +library/ast,,:step,lower:upper:step library/audioop,,:ipos,"# factor = audioop.findfactor(in_test[ipos*2:ipos*2+len(out_test)]," library/bisect,32,:hi,all(val >= x for val in a[i:hi]) library/bisect,42,:hi,all(val > x for val in a[i:hi]) @@ -143,8 +149,12 @@ library/ipaddress,,:db8,IPv6Address('2001:db8::') library/ipaddress,,::,IPv6Address('2001:db8::') library/ipaddress,,:db8,>>> ipaddress.IPv6Address('2001:db8::1000') library/ipaddress,,::,>>> ipaddress.IPv6Address('2001:db8::1000') -library/ipaddress,,:db8,IPv6Address('2001:db8::1000') -library/ipaddress,,::,IPv6Address('2001:db8::1000') +library/ipaddress,,:db8,'2001:db8::1000' +library/ipaddress,,::,'2001:db8::1000' +library/ipaddress,231,:db8,">>> f'{ipaddress.IPv6Address(""2001:db8::1000""):s}'" +library/ipaddress,231,::,">>> f'{ipaddress.IPv6Address(""2001:db8::1000""):s}'" +library/ipaddress,,::,IPv6Address('ff02::5678%1') +library/ipaddress,,::,fe80::1234 library/ipaddress,,:db8,">>> ipaddress.ip_address(""2001:db8::1"").reverse_pointer" library/ipaddress,,::,">>> ipaddress.ip_address(""2001:db8::1"").reverse_pointer" library/ipaddress,,::,"""::abc:7:def""" @@ -161,6 +171,7 @@ library/ipaddress,,:db00,2001:db00::0/ffff:ff00:: library/ipaddress,,::,2001:db00::0/ffff:ff00:: library/itertools,,:step,elements from seq[start:stop:step] library/itertools,,:stop,elements from seq[start:stop:step] +library/itertools,,::,kernel = tuple(kernel)[::-1] library/logging.handlers,,:port,host:port library/mmap,,:i2,obj[i1:i2] library/multiprocessing,,`,# Add more tasks using `put()` diff --git a/Doc/tools/templates/customsourcelink.html b/Doc/tools/templates/customsourcelink.html index 21af621efce95b15a6e7b092201ad1b7ce79a3c4..fca44e9163cac744c03c4b9a80ffa5c6903f299c 100644 --- a/Doc/tools/templates/customsourcelink.html +++ b/Doc/tools/templates/customsourcelink.html @@ -4,7 +4,7 @@

{{ _('This Page') }}

diff --git a/Doc/tutorial/classes.rst b/Doc/tutorial/classes.rst index 685552f99f440e9da8bdd6fb5e02ef50037850fa..0d780e3ba89643e2c5292a048fb13d39912451da 100644 --- a/Doc/tutorial/classes.rst +++ b/Doc/tutorial/classes.rst @@ -849,7 +849,7 @@ defines :meth:`__next__`, then :meth:`__iter__` can just return ``self``:: Generators ========== -:term:`Generator`\s are a simple and powerful tool for creating iterators. They +:term:`Generators ` are a simple and powerful tool for creating iterators. They are written like regular functions but use the :keyword:`yield` statement whenever they want to return data. Each time :func:`next` is called on it, the generator resumes where it left off (it remembers all the data values and which diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index de2c73a398edafee74400588035a534b5fcadf42..3af288a17b270d93fc27421e7ec3d990288bd81a 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -207,15 +207,15 @@ iteration of the loop:: ... if num % 2 == 0: ... print("Found an even number", num) ... continue - ... print("Found a number", num) + ... print("Found an odd number", num) Found an even number 2 - Found a number 3 + Found an odd number 3 Found an even number 4 - Found a number 5 + Found an odd number 5 Found an even number 6 - Found a number 7 + Found an odd number 7 Found an even number 8 - Found a number 9 + Found an odd number 9 .. _tut-pass: @@ -658,7 +658,7 @@ Finally, consider this function definition which has a potential collision betwe return 'name' in kwds There is no possible call that will make it return ``True`` as the keyword ``'name'`` -will always to bind to the first parameter. For example:: +will always bind to the first parameter. For example:: >>> foo(1, **{'name': 2}) Traceback (most recent call last): diff --git a/Doc/tutorial/datastructures.rst b/Doc/tutorial/datastructures.rst index 0edb73ad736919dfe3e941e721b97d52ae9d0078..5c6b65f05e1e5ffd382a8d63548761af8cd1dc37 100644 --- a/Doc/tutorial/datastructures.rst +++ b/Doc/tutorial/datastructures.rst @@ -78,7 +78,7 @@ objects: Return the number of times *x* appears in the list. -.. method:: list.sort(key=None, reverse=False) +.. method:: list.sort(*, key=None, reverse=False) :noindex: Sort the items of the list in place (the arguments can be used for sort @@ -613,6 +613,21 @@ direction and then call the :func:`reversed` function. :: To loop over a sequence in sorted order, use the :func:`sorted` function which returns a new sorted list while leaving the source unaltered. :: + >>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana'] + >>> for i in sorted(basket): + ... print(i) + ... + apple + apple + banana + orange + orange + pear + +Using :func:`set` on a sequence eliminates duplicate elements. The use of +:func:`sorted` in combination with :func:`set` over a sequence is an idiomatic +way to loop over unique elements of the sequence in sorted order. :: + >>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana'] >>> for f in sorted(set(basket)): ... print(f) diff --git a/Doc/tutorial/errors.rst b/Doc/tutorial/errors.rst index 27c67c6e015af531cc2c94c6ac3943ef7537c653..efe44da3043c5e2faffcddd0aeb200c1ec5c8393 100644 --- a/Doc/tutorial/errors.rst +++ b/Doc/tutorial/errors.rst @@ -67,7 +67,7 @@ The rest of the line provides detail based on the type of exception and what caused it. The preceding part of the error message shows the context where the exception -happened, in the form of a stack traceback. In general it contains a stack +occurred, in the form of a stack traceback. In general it contains a stack traceback listing source lines; however, it will not display lines read from standard input. @@ -267,6 +267,54 @@ re-raise the exception:: NameError: HiThere +.. _tut-exception-chaining: + +Exception Chaining +================== + +The :keyword:`raise` statement allows an optional :keyword:`from` which enables +chaining exceptions. For example:: + + # exc must be exception instance or None. + raise RuntimeError from exc + +This can be useful when you are transforming exceptions. For example:: + + >>> def func(): + ... raise IOError + ... + >>> try: + ... func() + ... except IOError as exc: + ... raise RuntimeError('Failed to open database') from exc + ... + Traceback (most recent call last): + File "", line 2, in + File "", line 2, in func + OSError + + The above exception was the direct cause of the following exception: + + Traceback (most recent call last): + File "", line 4, in + RuntimeError: Failed to open database + +Exception chaining happens automatically when an exception is raised inside an +:keyword:`except` or :keyword:`finally` section. Exception chaining can be +disabled by using ``from None`` idiom: + + >>> try: + ... open('database.sqlite') + ... except IOError: + ... raise RuntimeError from None + ... + Traceback (most recent call last): + File "", line 4, in + RuntimeError + +For more information about chaining mechanics, see :ref:`bltin-exceptions`. + + .. _tut-userexceptions: User-defined Exceptions diff --git a/Doc/tutorial/inputoutput.rst b/Doc/tutorial/inputoutput.rst index 366a532e817afad783d204579314e0e2202baceb..4e27cff83ce59fcd87f38aafc9d7120970bcdb0d 100644 --- a/Doc/tutorial/inputoutput.rst +++ b/Doc/tutorial/inputoutput.rst @@ -329,11 +329,16 @@ equivalent :keyword:`try`\ -\ :keyword:`finally` blocks:: If you're not using the :keyword:`with` keyword, then you should call ``f.close()`` to close the file and immediately free up any system -resources used by it. If you don't explicitly close a file, Python's -garbage collector will eventually destroy the object and close the -open file for you, but the file may stay open for a while. Another -risk is that different Python implementations will do this clean-up at -different times. +resources used by it. + +.. warning:: + Calling ``f.write()`` without using the :keyword:`!with` keyword or calling + ``f.close()`` **might** result in the arguments + of ``f.write()`` not being completely written to the disk, even if the + program exits successfully. + +.. + See also https://bugs.python.org/issue17852 After a file object is closed, either by a :keyword:`with` statement or by calling ``f.close()``, attempts to use the file object will diff --git a/Doc/tutorial/interpreter.rst b/Doc/tutorial/interpreter.rst index 501fb6a785624ad5f7a4ea9b3e61b1cd635843ea..b78d2960ac5432a2b6e6c353309c591d1c879eff 100644 --- a/Doc/tutorial/interpreter.rst +++ b/Doc/tutorial/interpreter.rst @@ -10,13 +10,13 @@ Using the Python Interpreter Invoking the Interpreter ======================== -The Python interpreter is usually installed as :file:`/usr/local/bin/python3.8` +The Python interpreter is usually installed as :file:`/usr/local/bin/python3.9` on those machines where it is available; putting :file:`/usr/local/bin` in your Unix shell's search path makes it possible to start it by typing the command: .. code-block:: text - python3.8 + python3.9 to the shell. [#]_ Since the choice of the directory where the interpreter lives is an installation option, other places are possible; check with your local @@ -24,7 +24,7 @@ Python guru or system administrator. (E.g., :file:`/usr/local/python` is a popular alternative location.) On Windows machines where you have installed Python from the :ref:`Microsoft Store -`, the :file:`python3.8` command will be available. If you have +`, the :file:`python3.9` command will be available. If you have the :ref:`py.exe launcher ` installed, you can use the :file:`py` command. See :ref:`setting-envvars` for other ways to launch Python. @@ -97,8 +97,8 @@ before printing the first prompt: .. code-block:: shell-session - $ python3.8 - Python 3.8 (default, Sep 16 2015, 09:25:04) + $ python3.9 + Python 3.9 (default, June 4 2019, 09:25:04) [GCC 4.8.2] on linux Type "help", "copyright", "credits" or "license" for more information. >>> diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst index d0a68faa2ee2503a452050d7ccbb19d31a140794..af595e5ca04d7e17185e47d4a5fbc24a2405dba1 100644 --- a/Doc/tutorial/modules.rst +++ b/Doc/tutorial/modules.rst @@ -306,23 +306,27 @@ defines. It returns a sorted list of strings:: >>> dir(fibo) ['__name__', 'fib', 'fib2'] >>> dir(sys) # doctest: +NORMALIZE_WHITESPACE - ['__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__', - '__package__', '__stderr__', '__stdin__', '__stdout__', - '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe', - '_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv', - 'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder', - 'call_tracing', 'callstats', 'copyright', 'displayhook', - 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', - 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', - 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags', - 'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit', - 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount', + ['__breakpointhook__', '__displayhook__', '__doc__', '__excepthook__', + '__interactivehook__', '__loader__', '__name__', '__package__', '__spec__', + '__stderr__', '__stdin__', '__stdout__', '__unraisablehook__', + '_clear_type_cache', '_current_frames', '_debugmallocstats', '_framework', + '_getframe', '_git', '_home', '_xoptions', 'abiflags', 'addaudithook', + 'api_version', 'argv', 'audit', 'base_exec_prefix', 'base_prefix', + 'breakpointhook', 'builtin_module_names', 'byteorder', 'call_tracing', + 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info', + 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', + 'float_repr_style', 'get_asyncgen_hooks', 'get_coroutine_origin_tracking_depth', + 'getallocatedblocks', 'getdefaultencoding', 'getdlopenflags', + 'getfilesystemencodeerrors', 'getfilesystemencoding', 'getprofile', + 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info', - 'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', - 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', - 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', - 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout', - 'thread_info', 'version', 'version_info', 'warnoptions'] + 'intern', 'is_finalizing', 'last_traceback', 'last_type', 'last_value', + 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', + 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'pycache_prefix', + 'set_asyncgen_hooks', 'set_coroutine_origin_tracking_depth', 'setdlopenflags', + 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', + 'stdin', 'stdout', 'thread_info', 'unraisablehook', 'version', 'version_info', + 'warnoptions'] Without arguments, :func:`dir` lists the names you have defined currently:: diff --git a/Doc/tutorial/stdlib.rst b/Doc/tutorial/stdlib.rst index 1b89056970852b0d4312ce9b694d205f4d4479cf..a52653b94a32535a92265178453415ed22b3523a 100644 --- a/Doc/tutorial/stdlib.rst +++ b/Doc/tutorial/stdlib.rst @@ -15,7 +15,7 @@ operating system:: >>> import os >>> os.getcwd() # Return the current working directory - 'C:\\Python38' + 'C:\\Python39' >>> os.chdir('/server/accesslogs') # Change current working directory >>> os.system('mkdir today') # Run the command mkdir in the system shell 0 diff --git a/Doc/tutorial/stdlib2.rst b/Doc/tutorial/stdlib2.rst index d2ac57b8e4d3a7b7c8151b38e0f1c500f24a5305..299482856ff324716618538007e74c2833a92554 100644 --- a/Doc/tutorial/stdlib2.rst +++ b/Doc/tutorial/stdlib2.rst @@ -278,7 +278,7 @@ applications include caching objects that are expensive to create:: Traceback (most recent call last): File "", line 1, in d['primary'] # entry was automatically removed - File "C:/python38/lib/weakref.py", line 46, in __getitem__ + File "C:/python39/lib/weakref.py", line 46, in __getitem__ o = self.data[key]() KeyError: 'primary' diff --git a/Doc/tutorial/venv.rst b/Doc/tutorial/venv.rst index 558076d57356d4e1f330c1589c0d02aba86acf6c..f422146aae8a30ec2565a00b6420cc1f12697696 100644 --- a/Doc/tutorial/venv.rst +++ b/Doc/tutorial/venv.rst @@ -116,7 +116,7 @@ You can install the latest version of a package by specifying a package's name: .. code-block:: bash - (tutorial-env) $ pip install novas + (tutorial-env) $ python -m pip install novas Collecting novas Downloading novas-3.1.1.3.tar.gz (136kB) Installing collected packages: novas @@ -128,7 +128,7 @@ package name followed by ``==`` and the version number: .. code-block:: bash - (tutorial-env) $ pip install requests==2.6.0 + (tutorial-env) $ python -m pip install requests==2.6.0 Collecting requests==2.6.0 Using cached requests-2.6.0-py2.py3-none-any.whl Installing collected packages: requests @@ -141,7 +141,7 @@ install --upgrade`` to upgrade the package to the latest version: .. code-block:: bash - (tutorial-env) $ pip install --upgrade requests + (tutorial-env) $ python -m pip install --upgrade requests Collecting requests Installing collected packages: requests Found existing installation: requests 2.6.0 @@ -199,7 +199,7 @@ necessary packages with ``install -r``: .. code-block:: bash - (tutorial-env) $ pip install -r requirements.txt + (tutorial-env) $ python -m pip install -r requirements.txt Collecting novas==3.1.1.3 (from -r requirements.txt (line 1)) ... Collecting numpy==1.9.2 (from -r requirements.txt (line 2)) diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index d3f04004efc750ab894ee85998a7ef6308e50a82..95342f3a510e194d45dc1dcb74c585ea8d155c46 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -426,6 +426,8 @@ Miscellaneous options defines the following possible values: * ``-X faulthandler`` to enable :mod:`faulthandler`; + * ``-X oldparser``: enable the traditional LL(1) parser. See also + :envvar:`PYTHONOLDPARSER` and :pep:`617`. * ``-X showrefcount`` to output the total reference count and number of used memory blocks when the program finishes or after each statement in the interactive interpreter. This only works on debug builds. @@ -434,29 +436,14 @@ Miscellaneous options stored in a traceback of a trace. Use ``-X tracemalloc=NFRAME`` to start tracing with a traceback limit of *NFRAME* frames. See the :func:`tracemalloc.start` for more information. - * ``-X showalloccount`` to output the total count of allocated objects for - each type when the program finishes. This only works when Python was built with - ``COUNT_ALLOCS`` defined. * ``-X importtime`` to show how long each import takes. It shows module name, cumulative time (including nested imports) and self time (excluding nested imports). Note that its output may be broken in multi-threaded application. Typical usage is ``python3 -X importtime -c 'import asyncio'``. See also :envvar:`PYTHONPROFILEIMPORTTIME`. - * ``-X dev``: enable CPython's "development mode", introducing additional - runtime checks which are too expensive to be enabled by default. It should - not be more verbose than the default if the code is correct: new warnings - are only emitted when an issue is detected. Effect of the developer mode: - - * Add ``default`` warning filter, as :option:`-W` ``default``. - * Install debug hooks on memory allocators: see the - :c:func:`PyMem_SetupDebugHooks` C function. - * Enable the :mod:`faulthandler` module to dump the Python traceback - on a crash. - * Enable :ref:`asyncio debug mode `. - * Set the :attr:`~sys.flags.dev_mode` attribute of :attr:`sys.flags` to - ``True``. - * :class:`io.IOBase` destructor logs ``close()`` exceptions. - + * ``-X dev``: enable :ref:`Python Development Mode `, introducing + additional runtime checks that are too expensive to be enabled by + default. * ``-X utf8`` enables UTF-8 mode for operating system interfaces, overriding the default locale-aware mode. ``-X utf8=0`` explicitly disables UTF-8 mode (even when it would otherwise activate automatically). @@ -487,6 +474,15 @@ Miscellaneous options The ``-X pycache_prefix`` option. The ``-X dev`` option now logs ``close()`` exceptions in :class:`io.IOBase` destructor. + .. versionchanged:: 3.9 + Using ``-X dev`` option, check *encoding* and *errors* arguments on + string encoding and decoding operations. + + The ``-X showalloccount`` option has been removed. + + .. deprecated-removed:: 3.9 3.10 + The ``-X oldparser`` option. + Options you shouldn't use ~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -542,6 +538,14 @@ conflict. within a Python program as the variable :data:`sys.path`. +.. envvar:: PYTHONPLATLIBDIR + + If this is set to a non-empty string, it overrides the :data:`sys.platlibdir` + value. + + .. versionadded:: 3.9 + + .. envvar:: PYTHONSTARTUP If this is the name of a readable file, the Python commands in that file are @@ -551,7 +555,7 @@ conflict. the interactive session. You can also change the prompts :data:`sys.ps1` and :data:`sys.ps2` and the hook :data:`sys.__interactivehook__` in this file. - .. audit-event:: cpython.run_startup filename PYTHONSTARTUP + .. audit-event:: cpython.run_startup filename envvar-PYTHONSTARTUP Raises an :ref:`auditing event ` ``cpython.run_startup`` with the filename as the argument when called on startup. @@ -583,6 +587,15 @@ conflict. :option:`-d` multiple times. +.. envvar:: PYTHONOLDPARSER + + If this is set to a non-empty string, enable the traditional LL(1) parser. + + See also the :option:`-X` ``oldparser`` option and :pep:`617`. + + .. deprecated-removed:: 3.9 3.10 + + .. envvar:: PYTHONINSPECT If this is set to a non-empty string it is equivalent to specifying the @@ -883,8 +896,9 @@ conflict. .. envvar:: PYTHONDEVMODE - If this environment variable is set to a non-empty string, enable the - CPython "development mode". See the :option:`-X` ``dev`` option. + If this environment variable is set to a non-empty string, enable + :ref:`Python Development Mode `, introducing additional runtime + checks that are too expensive to be enabled by default. .. versionadded:: 3.7 diff --git a/Doc/using/mac.rst b/Doc/using/mac.rst index 0253625f369d88290230af55124729599d3c9d16..ead71e1b079b3b9cd0139d18798647c631344354 100644 --- a/Doc/using/mac.rst +++ b/Doc/using/mac.rst @@ -25,7 +25,7 @@ there. What you get after installing is a number of things: -* A :file:`Python 3.8` folder in your :file:`Applications` folder. In here +* A :file:`Python 3.9` folder in your :file:`Applications` folder. In here you find IDLE, the development environment that is a standard part of official Python distributions; and PythonLauncher, which handles double-clicking Python scripts from the Finder. @@ -92,7 +92,7 @@ aware of: programs that talk to the Aqua window manager (in other words, anything that has a GUI) need to be run in a special way. Use :program:`pythonw` instead of :program:`python` to start such scripts. -With Python 3.8, you can use either :program:`python` or :program:`pythonw`. +With Python 3.9, you can use either :program:`python` or :program:`pythonw`. Configuration diff --git a/Doc/using/venv-create.inc b/Doc/using/venv-create.inc index c81aaf15d885a21d99f32e9ceb61cceebdced76c..ddb36f94667d9f5e5d83b302217b91acf33c16b1 100644 --- a/Doc/using/venv-create.inc +++ b/Doc/using/venv-create.inc @@ -36,7 +36,7 @@ your :ref:`Python installation `:: The command, if run with ``-h``, will show the available options:: usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear] - [--upgrade] [--without-pip] [--prompt PROMPT] + [--upgrade] [--without-pip] [--prompt PROMPT] [--upgrade-deps] ENV_DIR [ENV_DIR ...] Creates virtual Python environments in one or more target directories. @@ -61,10 +61,15 @@ The command, if run with ``-h``, will show the available options:: environment (pip is bootstrapped by default) --prompt PROMPT Provides an alternative prompt prefix for this environment. + --upgrade-deps Upgrade core dependencies: pip setuptools to the + latest version in PyPI Once an environment has been created, you may wish to activate it, e.g. by sourcing an activate script in its bin directory. +.. versionchanged:: 3.9 + Add ``--upgrade-deps`` option to upgrade pip + setuptools to the latest on PyPI + .. versionchanged:: 3.4 Installs pip by default, added the ``--without-pip`` and ``--copies`` options @@ -110,7 +115,7 @@ directory containing the virtual environment): +=============+=================+=========================================+ | POSIX | bash/zsh | $ source /bin/activate | +-------------+-----------------+-----------------------------------------+ -| | fish | $ . /bin/activate.fish | +| | fish | $ source /bin/activate.fish | +-------------+-----------------+-----------------------------------------+ | | csh/tcsh | $ source /bin/activate.csh | +-------------+-----------------+-----------------------------------------+ @@ -121,6 +126,10 @@ directory containing the virtual environment): | | PowerShell | PS C:\\> \\Scripts\\Activate.ps1 | +-------------+-----------------+-----------------------------------------+ +When a virtual environment is active, the :envvar:`VIRTUAL_ENV` environment +variable is set to the path of the virtual environment. This can be used to +check if one is running inside a virtual environment. + You don't specifically *need* to activate an environment; activation just prepends the virtual environment's binary directory to your path, so that "python" invokes the virtual environment's Python interpreter and you can run diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 5114a26a57d072abf852f503c8490b877b1ed378..4699e37509e6f3c1912e8ea4652eb3f328492aa6 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -23,8 +23,8 @@ available for application-local distributions. As specified in :pep:`11`, a Python release only supports a Windows platform while Microsoft considers the platform under extended support. This means that -Python |version| supports Windows Vista and newer. If you require Windows XP -support then please install Python 3.4. +Python |version| supports Windows 8.1 and newer. If you require Windows 7 +support, please install Python 3.8. There are a number of different installers available for Windows, each with certain benefits and downsides. @@ -103,9 +103,9 @@ paths longer than this would not resolve and errors would result. In the latest versions of Windows, this limitation can be expanded to approximately 32,000 characters. Your administrator will need to activate the -"Enable Win32 long paths" group policy, or set the registry value -``HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled`` -to ``1``. +"Enable Win32 long paths" group policy, or set ``LongPathsEnabled`` to ``1`` +in the registry key +``HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem``. This allows the :func:`open` function, the :mod:`os` module and most other path functionality to accept and return paths longer than 260 characters. @@ -212,13 +212,13 @@ of available options is shown below. For example, to silently install a default, system-wide Python installation, you could use the following command (from an elevated command prompt):: - python-3.8.0.exe /quiet InstallAllUsers=1 PrependPath=1 Include_test=0 + python-3.9.0.exe /quiet InstallAllUsers=1 PrependPath=1 Include_test=0 To allow users to easily install a personal copy of Python without the test suite, you could provide a shortcut with the following command. This will display a simplified initial page and disallow customization:: - python-3.8.0.exe InstallAllUsers=0 Include_launcher=0 Include_test=0 + python-3.9.0.exe InstallAllUsers=0 Include_launcher=0 Include_test=0 SimpleInstall=1 SimpleInstallDescription="Just for me, no test suite." (Note that omitting the launcher also omits file associations, and is only @@ -255,13 +255,13 @@ where a large number of installations are going to be performed it is very useful to have a locally cached copy. Execute the following command from Command Prompt to download all possible -required files. Remember to substitute ``python-3.8.0.exe`` for the actual +required files. Remember to substitute ``python-3.9.0.exe`` for the actual name of your installer, and to create layouts in their own directories to avoid collisions between files with the same name. :: - python-3.8.0.exe /layout [optional target directory] + python-3.9.0.exe /layout [optional target directory] You may also specify the ``/quiet`` option to hide the progress display. @@ -339,6 +339,11 @@ full write access to shared locations such as ``TEMP`` and the registry. Instead, it will write to a private copy. If your scripts must modify the shared locations, you will need to install the full installer. +For more detail on the technical basis for these limitations, please consult +Microsoft's documentation on packaged full-trust apps, currently available at +`docs.microsoft.com/en-us/windows/msix/desktop/desktop-to-uwp-behind-the-scenes +`_ + .. _windows-nuget: @@ -525,7 +530,7 @@ To temporarily set environment variables, open Command Prompt and use the .. code-block:: doscon - C:\>set PATH=C:\Program Files\Python 3.8;%PATH% + C:\>set PATH=C:\Program Files\Python 3.9;%PATH% C:\>set PYTHONPATH=%PYTHONPATH%;C:\My_python_lib C:\>python @@ -598,7 +603,7 @@ of your Python installation, delimited by a semicolon from other entries. An example variable could look like this (assuming the first two entries already existed):: - C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Python 3.8 + C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Python 3.9 .. _win-utf8-mode: @@ -1150,8 +1155,6 @@ For extension modules, consult :ref:`building-on-windows`. MinGW gcc under Windows" or "Installing Python extension with distutils and without Microsoft Visual C++" by Sébastien Sauvage, 2003 - `MingW -- Python extensions `_ - Other Platforms =============== diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst index ca3eda05c515af4d5d7db53fb9a162e81edbfad9..06bee9966c0be24213cb4bb5dec9ca7044cd43aa 100644 --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -2311,7 +2311,7 @@ Multi-threading =============== * The mechanism for serializing execution of concurrently running Python threads - (generally known as the :term:`GIL` or :term:`Global Interpreter Lock`) has + (generally known as the :term:`GIL` or Global Interpreter Lock) has been rewritten. Among the objectives were more predictable switching intervals and reduced overhead due to lock contention and the number of ensuing system calls. The notion of a "check interval" to allow thread diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst index f1a033c6dae61fd9bcaab895e360082a3c895534..361e6db07c3cdbf253dd74958cc036f27b0ac9d6 100644 --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -2309,9 +2309,9 @@ Encoders: :c:func:`PyUnicode_AsUTF8String` * :c:func:`PyUnicode_EncodeUTF32` * :c:func:`PyUnicode_EncodeUTF16` -* :c:func:`PyUnicode_EncodeUnicodeEscape:` use +* :c:func:`PyUnicode_EncodeUnicodeEscape` use :c:func:`PyUnicode_AsUnicodeEscapeString` -* :c:func:`PyUnicode_EncodeRawUnicodeEscape:` use +* :c:func:`PyUnicode_EncodeRawUnicodeEscape` use :c:func:`PyUnicode_AsRawUnicodeEscapeString` * :c:func:`PyUnicode_EncodeLatin1`: use :c:func:`PyUnicode_AsLatin1String` * :c:func:`PyUnicode_EncodeASCII`: use :c:func:`PyUnicode_AsASCIIString` diff --git a/Doc/whatsnew/3.5.rst b/Doc/whatsnew/3.5.rst index b4540ac1dd9028db6b8cf873d2e64431c7a1080c..1defee4090f288446dcbda87e1c2694640c8f4b1 100644 --- a/Doc/whatsnew/3.5.rst +++ b/Doc/whatsnew/3.5.rst @@ -412,7 +412,7 @@ uses were to provide type hints to function parameters and return values. It became evident that it would be beneficial for Python users, if the standard library included the base definitions and tools for type annotations. -:pep:`484` introduces a :term:`provisional module ` to +:pep:`484` introduces a :term:`provisional module ` to provide these standard definitions and tools, along with some conventions for situations where annotations are not available. @@ -726,7 +726,7 @@ New Modules typing ------ -The new :mod:`typing` :term:`provisional ` module +The new :mod:`typing` :term:`provisional ` module provides standard definitions and tools for function type annotations. See :ref:`Type Hints ` for more information. @@ -772,7 +772,7 @@ Steven Bethard, paul j3 and Daniel Eriksson in :issue:`14910`.) asyncio ------- -Since the :mod:`asyncio` module is :term:`provisional `, +Since the :mod:`asyncio` module is :term:`provisional `, all changes introduced in Python 3.5 have also been backported to Python 3.4.x. Notable changes in the :mod:`asyncio` module since Python 3.4.0: @@ -1867,7 +1867,7 @@ A new :func:`~sys.set_coroutine_wrapper` function allows setting a global hook that will be called whenever a :term:`coroutine object ` is created by an :keyword:`async def` function. A corresponding :func:`~sys.get_coroutine_wrapper` can be used to obtain a currently set -wrapper. Both functions are :term:`provisional `, +wrapper. Both functions are :term:`provisional `, and are intended for debugging purposes only. (Contributed by Yury Selivanov in :issue:`24017`.) diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst index 04c1f7e71db3214d255eb385092a1338682a2774..03a877a3d9178586bafb00767fc242557b9fe2f5 100644 --- a/Doc/whatsnew/3.6.rst +++ b/Doc/whatsnew/3.6.rst @@ -1597,7 +1597,7 @@ to filter block traces by their address space (domain). typing ------ -Since the :mod:`typing` module is :term:`provisional `, +Since the :mod:`typing` module is :term:`provisional `, all changes introduced in Python 3.6 have also been backported to Python 3.5.x. @@ -2443,3 +2443,16 @@ because of the behavior of the socket option ``SO_REUSEADDR`` in UDP. For more details, see the documentation for ``loop.create_datagram_endpoint()``. (Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in :issue:`37228`.) + +Notable changes in Python 3.6.13 +================================ + +Earlier Python versions allowed using both ``;`` and ``&`` as +query parameter separators in :func:`urllib.parse.parse_qs` and +:func:`urllib.parse.parse_qsl`. Due to security concerns, and to conform with +newer W3C recommendations, this has been changed to allow only a single +separator key, with ``&`` as the default. This change also affects +:func:`cgi.parse` and :func:`cgi.parse_multipart` as they use the affected +functions internally. For more details, please see their respective +documentation. +(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in :issue:`42967`.) diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst index b9b50216d23a639d548679afb6862428ba32914c..9204cc7fbf8c47235baeb9d9885488784e491fb9 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -102,7 +102,7 @@ CPython implementation improvements: * :ref:`PEP 538 `, legacy C locale coercion * :ref:`PEP 540 `, forced UTF-8 runtime mode * :ref:`PEP 552 `, deterministic .pycs -* :ref:`the new development runtime mode ` +* :ref:`New Python Development Mode ` * :ref:`PEP 565 `, improved :exc:`DeprecationWarning` handling @@ -171,7 +171,7 @@ on a per-module basis in Python 3.7 using a :mod:`__future__` import:: from __future__ import annotations -It will become the default in Python 4.0. +It will become the default in Python 3.10. .. seealso:: @@ -479,15 +479,15 @@ Three new translations have been added: .. _whatsnew37-devmode: -Development Runtime Mode: -X dev +Python Development Mode (-X dev) -------------------------------- The new :option:`-X` ``dev`` command line option or the new :envvar:`PYTHONDEVMODE` environment variable can be used to enable -CPython's *development mode*. When in development mode, CPython performs +:ref:`Python Development Mode `. When in development mode, Python performs additional runtime checks that are too expensive to be enabled by default. -See :option:`-X` ``dev`` documentation for the full description of the effects -of this mode. +See :ref:`Python Development Mode ` documentation for the full +description. Other Language Changes @@ -636,7 +636,7 @@ The :mod:`asyncio` module has received many new features, usability and :ref:`performance improvements `. Notable changes include: -* The new :term:`provisional ` :func:`asyncio.run` function can +* The new :term:`provisional ` :func:`asyncio.run` function can be used to run a coroutine from synchronous code by automatically creating and destroying the event loop. (Contributed by Yury Selivanov in :issue:`32314`.) @@ -2556,3 +2556,16 @@ because of the behavior of the socket option ``SO_REUSEADDR`` in UDP. For more details, see the documentation for ``loop.create_datagram_endpoint()``. (Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in :issue:`37228`.) + +Notable changes in Python 3.7.10 +================================ + +Earlier Python versions allowed using both ``;`` and ``&`` as +query parameter separators in :func:`urllib.parse.parse_qs` and +:func:`urllib.parse.parse_qsl`. Due to security concerns, and to conform with +newer W3C recommendations, this has been changed to allow only a single +separator key, with ``&`` as the default. This change also affects +:func:`cgi.parse` and :func:`cgi.parse_multipart` as they use the affected +functions internally. For more details, please see their respective +documentation. +(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in :issue:`42967`.) diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 475e3ab964312091871296ddfea72ba3f54d05af..dbc3875aae61b3888cc2ecae3eb270d7c96a00d6 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -47,8 +47,6 @@ This article explains the new features in Python 3.8, compared to 3.7. For full details, see the :ref:`changelog `. -Python 3.8 was released on October 14th, 2019. - .. testsetup:: from datetime import date @@ -348,20 +346,20 @@ See :pep:`587` for a full description. (Contributed by Victor Stinner in :issue:`36763`.) -Vectorcall: a fast calling protocol for CPython ------------------------------------------------ +PEP 590: Vectorcall: a fast calling protocol for CPython +-------------------------------------------------------- -The "vectorcall" protocol is added to the Python/C API. +:ref:`vectorcall` is added to the Python/C API. It is meant to formalize existing optimizations which were already done for various classes. -Any extension type implementing a callable can use this protocol. +Any static type implementing a callable can use this protocol. This is currently provisional. The aim is to make it fully public in Python 3.9. See :pep:`590` for a full description. -(Contributed by Jeroen Demeyer and Mark Shannon in :issue:`36974`.) +(Contributed by Jeroen Demeyer, Mark Shannon and Petr Viktorin in :issue:`36974`.) Pickle protocol 5 with out-of-band data buffers @@ -430,8 +428,8 @@ Other Language Changes lastname, *members = family.split() return lastname.upper(), *members - >>> parse('simpsons homer marge bart lisa sally') - ('SIMPSONS', 'homer', 'marge', 'bart', 'lisa', 'sally') + >>> parse('simpsons homer marge bart lisa maggie') + ('SIMPSONS', 'homer', 'marge', 'bart', 'lisa', 'maggie') (Contributed by David Cuthbert and Jordan Chapman in :issue:`32117`.) @@ -872,8 +870,18 @@ clipboard. Converting strings from Tcl to Python and back now never fails. (Many people worked on this for eight years but the problem was finally solved by Serhiy Storchaka in :issue:`13153`.) +New in 3.8.1: + +Add option to toggle cursor blink off. (Contributed by Zackery Spytz +in :issue:`4603`.) + +Escape key now closes IDLE completion windows. (Contributed by Johnny +Najera in :issue:`38944`.) + The changes above have been backported to 3.7 maintenance releases. +Add keywords to module name completion list. (Contributed by Terry J. +Reedy in :issue:`37765`.) inspect ------- @@ -1695,7 +1703,7 @@ Deprecated :meth:`~gettext.NullTranslations.set_output_charset`, and the *codeset* parameter of functions :func:`~gettext.translation` and :func:`~gettext.install` are also deprecated, since they are only used for - for the ``l*gettext()`` functions. + the ``l*gettext()`` functions. (Contributed by Serhiy Storchaka in :issue:`33710`.) * The :meth:`~threading.Thread.isAlive()` method of :class:`threading.Thread` @@ -2105,9 +2113,6 @@ Changes in the C API (Contributed by Antoine Pitrou in :issue:`32388`.) -* The :c:func:`PyCode_New` has a new parameter in the second position (*posonlyargcount*) - to support :pep:`570`, indicating the number of positional-only arguments. - * The functions :c:func:`PyNode_AddChild` and :c:func:`PyParser_AddToken` now accept two additional ``int`` arguments *end_lineno* and *end_col_offset*. @@ -2230,17 +2235,15 @@ details, see the documentation for ``loop.create_datagram_endpoint()``. (Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in :issue:`37228`.) -Notable changes in Python 3.8.2 +Notable changes in Python 3.8.8 =============================== -Fixed a regression with the ``ignore`` callback of :func:`shutil.copytree`. -The argument types are now str and List[str] again. -(Contributed by Manuel Barkhau and Giampaolo Rodola in :issue:`39390`.) - -Notable changes in Python 3.8.3 -=============================== - -The constant values of future flags in the :mod:`__future__` module -are updated in order to prevent collision with compiler flags. Previously -``PyCF_ALLOW_TOP_LEVEL_AWAIT`` was clashing with ``CO_FUTURE_DIVISION``. -(Contributed by Batuhan Taskaya in :issue:`39562`) +Earlier Python versions allowed using both ``;`` and ``&`` as +query parameter separators in :func:`urllib.parse.parse_qs` and +:func:`urllib.parse.parse_qsl`. Due to security concerns, and to conform with +newer W3C recommendations, this has been changed to allow only a single +separator key, with ``&`` as the default. This change also affects +:func:`cgi.parse` and :func:`cgi.parse_multipart` as they use the affected +functions internally. For more details, please see their respective +documentation. +(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in :issue:`42967`.) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst new file mode 100644 index 0000000000000000000000000000000000000000..3086930569dc9884886f19f27ab9f9d342e3983f --- /dev/null +++ b/Doc/whatsnew/3.9.rst @@ -0,0 +1,1531 @@ +**************************** + What's New In Python 3.9 +**************************** + +:Release: |release| +:Date: |today| +:Editor: Łukasz Langa + +.. Rules for maintenance: + + * Anyone can add text to this document. Your text might get + rewritten to some degree. + + * The maintainer will go through Misc/NEWS periodically and add + changes; it's therefore more important to add your changes to + Misc/NEWS than to this file. + + * This is not a complete list of every single change; completeness + is the purpose of Misc/NEWS. Some changes will be too small + or esoteric to include. If such a change is added to the text, + it might get removed during final editing. + + * If you want to draw your new text to the attention of the + maintainer, add 'XXX' to the beginning of the paragraph or + section. + + * It's OK to just add a fragmentary note about a change. For + example: "XXX Describe the transmogrify() function added to the + socket module." The maintainer will research the change and + write the necessary text. + + * You can comment out your additions if you like, but it's not + necessary (especially when a final release is some months away). + + * Credit the author of a patch or bugfix. Just the name is + sufficient; the e-mail address isn't necessary. + + * It's helpful to add the bug/patch number as a comment: + + XXX Describe the transmogrify() function added to the socket + module. + (Contributed by P.Y. Developer in :issue:`12345`.) + + This saves the maintainer the effort of going through the Mercurial log + when researching a change. + +This article explains the new features in Python 3.9, compared to 3.8. +Python 3.9 was released on October 5th, 2020. + +For full details, see the :ref:`changelog `. + +.. seealso:: + + :pep:`596` - Python 3.9 Release Schedule + + +Summary -- Release highlights +============================= + +.. This section singles out the most important changes in Python 3.9. + Brevity is key. + +New syntax features: + +* :pep:`584`, union operators added to ``dict``; +* :pep:`585`, type hinting generics in standard collections; +* :pep:`614`, relaxed grammar restrictions on decorators. + +New built-in features: + +* :pep:`616`, string methods to remove prefixes and suffixes. + +New features in the standard library: + +* :pep:`593`, flexible function and variable annotations; +* :func:`os.pidfd_open` added that allows process management without races + and signals. + +Interpreter improvements: + +* :pep:`573`, fast access to module state from methods of C extension + types; +* :pep:`617`, CPython now uses a new parser based on PEG; +* a number of Python builtins (range, tuple, set, frozenset, list, dict) are + now sped up using :pep:`590` vectorcall; +* garbage collection does not block on resurrected objects; +* a number of Python modules (:mod:`_abc`, :mod:`audioop`, :mod:`_bz2`, + :mod:`_codecs`, :mod:`_contextvars`, :mod:`_crypt`, :mod:`_functools`, + :mod:`_json`, :mod:`_locale`, :mod:`math`, :mod:`operator`, :mod:`resource`, + :mod:`time`, :mod:`_weakref`) now use multiphase initialization as defined + by PEP 489; +* a number of standard library modules (:mod:`audioop`, :mod:`ast`, :mod:`grp`, + :mod:`_hashlib`, :mod:`pwd`, :mod:`_posixsubprocess`, :mod:`random`, + :mod:`select`, :mod:`struct`, :mod:`termios`, :mod:`zlib`) are now using + the stable ABI defined by PEP 384. + +New library modules: + +* :pep:`615`, the IANA Time Zone Database is now present in the standard + library in the :mod:`zoneinfo` module; +* an implementation of a topological sort of a graph is now provided in + the new :mod:`graphlib` module. + +Release process changes: + +* :pep:`602`, CPython adopts an annual release cycle. + + +You should check for DeprecationWarning in your code +==================================================== + +When Python 2.7 was still supported, a lot of functionality in Python 3 +was kept for backward compatibility with Python 2.7. With the end of Python +2 support, these backward compatibility layers have been removed, or will +be removed soon. Most of them emitted a :exc:`DeprecationWarning` warning for +several years. For example, using ``collections.Mapping`` instead of +``collections.abc.Mapping`` emits a :exc:`DeprecationWarning` since Python +3.3, released in 2012. + +Test your application with the :option:`-W` ``default`` command-line option to see +:exc:`DeprecationWarning` and :exc:`PendingDeprecationWarning`, or even with +:option:`-W` ``error`` to treat them as errors. :ref:`Warnings Filter +` can be used to ignore warnings from third-party code. + +Python 3.9 is the last version providing those Python 2 backward compatibility +layers, to give more time to Python projects maintainers to organize the +removal of the Python 2 support and add support for Python 3.9. + +Aliases to :ref:`Abstract Base Classes ` in +the :mod:`collections` module, like ``collections.Mapping`` alias to +:class:`collections.abc.Mapping`, are kept for one last release for backward +compatibility. They will be removed from Python 3.10. + +More generally, try to run your tests in the :ref:`Python Development Mode +` which helps to prepare your code to make it compatible with the +next Python version. + +Note: a number of pre-existing deprecations were removed in this version of +Python as well. Consult the :ref:`removed-in-python-39` section. + + +New Features +============ + +Dictionary Merge & Update Operators +----------------------------------- + +Merge (``|``) and update (``|=``) operators have been added to the built-in +:class:`dict` class. Those complement the existing ``dict.update`` and +``{**d1, **d2}`` methods of merging dictionaries. + +Example:: + + >>> x = {"key1": "value1 from x", "key2": "value2 from x"} + >>> y = {"key2": "value2 from y", "key3": "value3 from y"} + >>> x | y + {'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'} + >>> y | x + {'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'} + +See :pep:`584` for a full description. +(Contributed by Brandt Bucher in :issue:`36144`.) + +New String Methods to Remove Prefixes and Suffixes +-------------------------------------------------- + +:meth:`str.removeprefix(prefix)` and +:meth:`str.removesuffix(suffix)` have been added +to easily remove an unneeded prefix or a suffix from a string. Corresponding +``bytes``, ``bytearray``, and ``collections.UserString`` methods have also been +added. See :pep:`616` for a full description. (Contributed by Dennis Sweeney in +:issue:`39939`.) + +Type Hinting Generics in Standard Collections +--------------------------------------------- + +In type annotations you can now use built-in collection types such as +``list`` and ``dict`` as generic types instead of importing the +corresponding capitalized types (e.g. ``List`` or ``Dict``) from +``typing``. Some other types in the standard library are also now generic, +for example ``queue.Queue``. + +Example: + +.. code-block:: python + + def greet_all(names: list[str]) -> None: + for name in names: + print("Hello", name) + +See :pep:`585` for more details. (Contributed by Guido van Rossum, +Ethan Smith, and Batuhan Taşkaya in :issue:`39481`.) + +New Parser +---------- + +Python 3.9 uses a new parser, based on `PEG +`_ instead +of `LL(1) `_. The new +parser's performance is roughly comparable to that of the old parser, +but the PEG formalism is more flexible than LL(1) when it comes to +designing new language features. We'll start using this flexibility +in Python 3.10 and later. + +The :mod:`ast` module uses the new parser and produces the same AST as +the old parser. + +In Python 3.10, the old parser will be deleted and so will all +functionality that depends on it (primarily the :mod:`parser` module, +which has long been deprecated). In Python 3.9 *only*, you can switch +back to the LL(1) parser using a command line switch (``-X +oldparser``) or an environment variable (``PYTHONOLDPARSER=1``). + +See :pep:`617` for more details. (Contributed by Guido van Rossum, +Pablo Galindo and Lysandros Nikolaou in :issue:`40334`.) + + +Other Language Changes +====================== + +* :func:`__import__` now raises :exc:`ImportError` instead of + :exc:`ValueError`, which used to occur when a relative import went past + its top-level package. + (Contributed by Ngalim Siregar in :issue:`37444`.) + +* Python now gets the absolute path of the script filename specified on + the command line (ex: ``python3 script.py``): the ``__file__`` attribute of + the :mod:`__main__` module became an absolute path, rather than a relative + path. These paths now remain valid after the current directory is changed + by :func:`os.chdir`. As a side effect, the traceback also displays the + absolute path for :mod:`__main__` module frames in this case. + (Contributed by Victor Stinner in :issue:`20443`.) + +* In the :ref:`Python Development Mode ` and in debug build, the + *encoding* and *errors* arguments are now checked for string encoding and + decoding operations. Examples: :func:`open`, :meth:`str.encode` and + :meth:`bytes.decode`. + + By default, for best performance, the *errors* argument is only checked at + the first encoding/decoding error and the *encoding* argument is sometimes + ignored for empty strings. + (Contributed by Victor Stinner in :issue:`37388`.) + +* ``"".replace("", s, n)`` now returns ``s`` instead of an empty string for + all non-zero ``n``. It is now consistent with ``"".replace("", s)``. + There are similar changes for :class:`bytes` and :class:`bytearray` objects. + (Contributed by Serhiy Storchaka in :issue:`28029`.) + +* Any valid expression can now be used as a :term:`decorator`. Previously, the + grammar was much more restrictive. See :pep:`614` for details. + (Contributed by Brandt Bucher in :issue:`39702`.) + +* Improved help for the :mod:`typing` module. Docstrings are now shown for + all special forms and special generic aliases (like ``Union`` and ``List``). + Using :func:`help` with generic alias like ``List[int]`` will show the help + for the correspondent concrete type (``list`` in this case). + (Contributed by Serhiy Storchaka in :issue:`40257`.) + +* Parallel running of :meth:`~agen.aclose` / :meth:`~agen.asend` / + :meth:`~agen.athrow` is now prohibited, and ``ag_running`` now reflects + the actual running status of the async generator. + (Contributed by Yury Selivanov in :issue:`30773`.) + +* Unexpected errors in calling the ``__iter__`` method are no longer masked by + ``TypeError`` in the :keyword:`in` operator and functions + :func:`~operator.contains`, :func:`~operator.indexOf` and + :func:`~operator.countOf` of the :mod:`operator` module. + (Contributed by Serhiy Storchaka in :issue:`40824`.) + + +New Modules +=========== + +zoneinfo +-------- + +The :mod:`zoneinfo` module brings support for the IANA time zone database to +the standard library. It adds :class:`zoneinfo.ZoneInfo`, a concrete +:class:`datetime.tzinfo` implementation backed by the system's time zone data. + +Example:: + + >>> from zoneinfo import ZoneInfo + >>> from datetime import datetime, timedelta + + >>> # Daylight saving time + >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles")) + >>> print(dt) + 2020-10-31 12:00:00-07:00 + >>> dt.tzname() + 'PDT' + + >>> # Standard time + >>> dt += timedelta(days=7) + >>> print(dt) + 2020-11-07 12:00:00-08:00 + >>> print(dt.tzname()) + PST + + +As a fall-back source of data for platforms that don't ship the IANA database, +the |tzdata|_ module was released as a first-party package -- distributed via +PyPI and maintained by the CPython core team. + +.. |tzdata| replace:: ``tzdata`` +.. _tzdata: https://pypi.org/project/tzdata/ + +.. seealso:: + + :pep:`615` -- Support for the IANA Time Zone Database in the Standard Library + PEP written and implemented by Paul Ganssle + + +graphlib +--------- + +A new module, :mod:`graphlib`, was added that contains the +:class:`graphlib.TopologicalSorter` class to offer functionality to perform +topological sorting of graphs. (Contributed by Pablo Galindo, Tim Peters and +Larry Hastings in :issue:`17005`.) + + +Improved Modules +================ + +ast +--- + +Added the *indent* option to :func:`~ast.dump` which allows it to produce a +multiline indented output. +(Contributed by Serhiy Storchaka in :issue:`37995`.) + +Added :func:`ast.unparse` as a function in the :mod:`ast` module that can +be used to unparse an :class:`ast.AST` object and produce a string with code +that would produce an equivalent :class:`ast.AST` object when parsed. +(Contributed by Pablo Galindo and Batuhan Taskaya in :issue:`38870`.) + +Added docstrings to AST nodes that contains the ASDL signature used to +construct that node. (Contributed by Batuhan Taskaya in :issue:`39638`.) + +asyncio +------- + +Due to significant security concerns, the *reuse_address* parameter of +:meth:`asyncio.loop.create_datagram_endpoint` is no longer supported. This is +because of the behavior of the socket option ``SO_REUSEADDR`` in UDP. For more +details, see the documentation for ``loop.create_datagram_endpoint()``. +(Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in +:issue:`37228`.) + +Added a new :term:`coroutine` :meth:`~asyncio.loop.shutdown_default_executor` +that schedules a shutdown for the default executor that waits on the +:class:`~concurrent.futures.ThreadPoolExecutor` to finish closing. Also, +:func:`asyncio.run` has been updated to use the new :term:`coroutine`. +(Contributed by Kyle Stanley in :issue:`34037`.) + +Added :class:`asyncio.PidfdChildWatcher`, a Linux-specific child watcher +implementation that polls process file descriptors. (:issue:`38692`) + +Added a new :term:`coroutine` :func:`asyncio.to_thread`. It is mainly used for +running IO-bound functions in a separate thread to avoid blocking the event +loop, and essentially works as a high-level version of +:meth:`~asyncio.loop.run_in_executor` that can directly take keyword arguments. +(Contributed by Kyle Stanley and Yury Selivanov in :issue:`32309`.) + +When cancelling the task due to a timeout, :meth:`asyncio.wait_for` will now +wait until the cancellation is complete also in the case when *timeout* is +<= 0, like it does with positive timeouts. +(Contributed by Elvis Pranskevichus in :issue:`32751`.) + +:mod:`asyncio` now raises :exc:`TyperError` when calling incompatible +methods with an :class:`ssl.SSLSocket` socket. +(Contributed by Ido Michael in :issue:`37404`.) + +compileall +---------- + +Added new possibility to use hardlinks for duplicated ``.pyc`` files: *hardlink_dupes* parameter and --hardlink-dupes command line option. +(Contributed by Lumír 'Frenzy' Balhar in :issue:`40495`.) + +Added new options for path manipulation in resulting ``.pyc`` files: *stripdir*, *prependdir*, *limit_sl_dest* parameters and -s, -p, -e command line options. +Added the possibility to specify the option for an optimization level multiple times. +(Contributed by Lumír 'Frenzy' Balhar in :issue:`38112`.) + +concurrent.futures +------------------ + +Added a new *cancel_futures* parameter to +:meth:`concurrent.futures.Executor.shutdown` that cancels all pending futures +which have not started running, instead of waiting for them to complete before +shutting down the executor. +(Contributed by Kyle Stanley in :issue:`39349`.) + +Removed daemon threads from :class:`~concurrent.futures.ThreadPoolExecutor` +and :class:`~concurrent.futures.ProcessPoolExecutor`. This improves +compatibility with subinterpreters and predictability in their shutdown +processes. (Contributed by Kyle Stanley in :issue:`39812`.) + +Workers in :class:`~concurrent.futures.ProcessPoolExecutor` are now spawned on +demand, only when there are no available idle workers to reuse. This optimizes +startup overhead and reduces the amount of lost CPU time to idle workers. +(Contributed by Kyle Stanley in :issue:`39207`.) + +curses +------ + +Added :func:`curses.get_escdelay`, :func:`curses.set_escdelay`, +:func:`curses.get_tabsize`, and :func:`curses.set_tabsize` functions. +(Contributed by Anthony Sottile in :issue:`38312`.) + +datetime +-------- +The :meth:`~datetime.date.isocalendar()` of :class:`datetime.date` +and :meth:`~datetime.datetime.isocalendar()` of :class:`datetime.datetime` +methods now returns a :func:`~collections.namedtuple` instead of a :class:`tuple`. +(Contributed by Dong-hee Na in :issue:`24416`.) + +distutils +--------- + +The :command:`upload` command now creates SHA2-256 and Blake2b-256 hash +digests. It skips MD5 on platforms that block MD5 digest. +(Contributed by Christian Heimes in :issue:`40698`.) + +fcntl +----- + +Added constants :data:`~fcntl.F_OFD_GETLK`, :data:`~fcntl.F_OFD_SETLK` +and :data:`~fcntl.F_OFD_SETLKW`. +(Contributed by Dong-hee Na in :issue:`38602`.) + +ftplib +------- + +:class:`~ftplib.FTP` and :class:`~ftplib.FTP_TLS` now raise a :class:`ValueError` +if the given timeout for their constructor is zero to prevent the creation of +a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) + +gc +-- + +When the garbage collector makes a collection in which some objects resurrect +(they are reachable from outside the isolated cycles after the finalizers have +been executed), do not block the collection of all objects that are still +unreachable. (Contributed by Pablo Galindo and Tim Peters in :issue:`38379`.) + +Added a new function :func:`gc.is_finalized` to check if an object has been +finalized by the garbage collector. (Contributed by Pablo Galindo in +:issue:`39322`.) + +hashlib +------- + +The :mod:`hashlib` module can now use SHA3 hashes and SHAKE XOF from OpenSSL +when available. +(Contributed by Christian Heimes in :issue:`37630`.) + +Builtin hash modules can now be disabled with +``./configure --without-builtin-hashlib-hashes`` or selectively enabled with +e.g. ``./configure --with-builtin-hashlib-hashes=sha3,blake2`` to force use +of OpenSSL based implementation. +(Contributed by Christian Heimes in :issue:`40479`) + + +http +---- + +HTTP status codes ``103 EARLY_HINTS``, ``418 IM_A_TEAPOT`` and ``425 TOO_EARLY`` are added to +:class:`http.HTTPStatus`. (Contributed by Dong-hee Na in :issue:`39509` and Ross Rhodes in :issue:`39507`.) + +IDLE and idlelib +---------------- + +Added option to toggle cursor blink off. (Contributed by Zackery Spytz +in :issue:`4603`.) + +Escape key now closes IDLE completion windows. (Contributed by Johnny +Najera in :issue:`38944`.) + +Added keywords to module name completion list. (Contributed by Terry J. +Reedy in :issue:`37765`.) + +The changes above have been backported to 3.8 maintenance releases. + +imaplib +------- + +:class:`~imaplib.IMAP4` and :class:`~imaplib.IMAP4_SSL` now have +an optional *timeout* parameter for their constructors. +Also, the :meth:`~imaplib.IMAP4.open` method now has an optional *timeout* parameter +with this change. The overridden methods of :class:`~imaplib.IMAP4_SSL` and +:class:`~imaplib.IMAP4_stream` were applied to this change. +(Contributed by Dong-hee Na in :issue:`38615`.) + +:meth:`imaplib.IMAP4.unselect` is added. +:meth:`imaplib.IMAP4.unselect` frees server's resources associated with the +selected mailbox and returns the server to the authenticated +state. This command performs the same actions as :meth:`imaplib.IMAP4.close`, except +that no messages are permanently removed from the currently +selected mailbox. (Contributed by Dong-hee Na in :issue:`40375`.) + +importlib +--------- + +To improve consistency with import statements, :func:`importlib.util.resolve_name` +now raises :exc:`ImportError` instead of :exc:`ValueError` for invalid relative +import attempts. +(Contributed by Ngalim Siregar in :issue:`37444`.) + +Import loaders which publish immutable module objects can now publish +immutable packages in addition to individual modules. +(Contributed by Dino Viehland in :issue:`39336`.) + +Added :func:`importlib.resources.files` function with support for +subdirectories in package data, matching backport in ``importlib_resources`` +version 1.5. +(Contributed by Jason R. Coombs in :issue:`39791`.) + +Refreshed ``importlib.metadata`` from ``importlib_metadata`` version 1.6.1. + +inspect +------- + +:attr:`inspect.BoundArguments.arguments` is changed from ``OrderedDict`` to regular +dict. (Contributed by Inada Naoki in :issue:`36350` and :issue:`39775`.) + +ipaddress +--------- + +:mod:`ipaddress` now supports IPv6 Scoped Addresses (IPv6 address with suffix ``%``). + +Scoped IPv6 addresses can be parsed using :class:`ipaddress.IPv6Address`. +If present, scope zone ID is available through the :attr:`~ipaddress.IPv6Address.scope_id` attribute. +(Contributed by Oleksandr Pavliuk in :issue:`34788`.) + +math +---- + +Expanded the :func:`math.gcd` function to handle multiple arguments. +Formerly, it only supported two arguments. +(Contributed by Serhiy Storchaka in :issue:`39648`.) + +Added :func:`math.lcm`: return the least common multiple of specified arguments. +(Contributed by Mark Dickinson, Ananthakrishnan and Serhiy Storchaka in +:issue:`39479` and :issue:`39648`.) + +Added :func:`math.nextafter`: return the next floating-point value after *x* +towards *y*. +(Contributed by Victor Stinner in :issue:`39288`.) + +Added :func:`math.ulp`: return the value of the least significant bit +of a float. +(Contributed by Victor Stinner in :issue:`39310`.) + +multiprocessing +--------------- + +The :class:`multiprocessing.SimpleQueue` class has a new +:meth:`~multiprocessing.SimpleQueue.close` method to explicitly close the +queue. +(Contributed by Victor Stinner in :issue:`30966`.) + +nntplib +------- + +:class:`~nntplib.NNTP` and :class:`~nntplib.NNTP_SSL` now raise a :class:`ValueError` +if the given timeout for their constructor is zero to prevent the creation of +a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) + +os +-- + +Added :data:`~os.CLD_KILLED` and :data:`~os.CLD_STOPPED` for :attr:`si_code`. +(Contributed by Dong-hee Na in :issue:`38493`.) + +Exposed the Linux-specific :func:`os.pidfd_open` (:issue:`38692`) and +:data:`os.P_PIDFD` (:issue:`38713`) for process management with file +descriptors. + +The :func:`os.unsetenv` function is now also available on Windows. +(Contributed by Victor Stinner in :issue:`39413`.) + +The :func:`os.putenv` and :func:`os.unsetenv` functions are now always +available. +(Contributed by Victor Stinner in :issue:`39395`.) + +Added :func:`os.waitstatus_to_exitcode` function: +convert a wait status to an exit code. +(Contributed by Victor Stinner in :issue:`40094`.) + +pathlib +------- + +Added :meth:`pathlib.Path.readlink()` which acts similarly to +:func:`os.readlink`. +(Contributed by Girts Folkmanis in :issue:`30618`) + +pdb +--- + +On Windows now :class:`~pdb.Pdb` supports ``~/.pdbrc``. +(Contributed by Tim Hopper and Dan Lidral-Porter in :issue:`20523`.) + +poplib +------ + +:class:`~poplib.POP3` and :class:`~poplib.POP3_SSL` now raise a :class:`ValueError` +if the given timeout for their constructor is zero to prevent the creation of +a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) + +pprint +------ + +:mod:`pprint` can now pretty-print :class:`types.SimpleNamespace`. +(Contributed by Carl Bordum Hansen in :issue:`37376`.) + +pydoc +----- + +The documentation string is now shown not only for class, function, +method etc, but for any object that has its own ``__doc__`` attribute. +(Contributed by Serhiy Storchaka in :issue:`40257`.) + +random +------ + +Added a new :attr:`random.Random.randbytes` method: generate random bytes. +(Contributed by Victor Stinner in :issue:`40286`.) + +signal +------ + +Exposed the Linux-specific :func:`signal.pidfd_send_signal` for sending to +signals to a process using a file descriptor instead of a pid. (:issue:`38712`) + +smtplib +------- + +:class:`~smtplib.SMTP` and :class:`~smtplib.SMTP_SSL` now raise a :class:`ValueError` +if the given timeout for their constructor is zero to prevent the creation of +a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) + +:class:`~smtplib.LMTP` constructor now has an optional *timeout* parameter. +(Contributed by Dong-hee Na in :issue:`39329`.) + +socket +------ + +The :mod:`socket` module now exports the :data:`~socket.CAN_RAW_JOIN_FILTERS` +constant on Linux 4.1 and greater. +(Contributed by Stefan Tatschner and Zackery Spytz in :issue:`25780`.) + +The socket module now supports the :data:`~socket.CAN_J1939` protocol on +platforms that support it. (Contributed by Karl Ding in :issue:`40291`.) + +The socket module now has the :func:`socket.send_fds` and +:func:`socket.recv.fds` methods. (Contributed by Joannah Nanjekye, Shinya +Okano and Victor Stinner in :issue:`28724`.) + + +time +---- + +On AIX, :func:`~time.thread_time` is now implemented with ``thread_cputime()`` +which has nanosecond resolution, rather than +``clock_gettime(CLOCK_THREAD_CPUTIME_ID)`` which has a resolution of 10 ms. +(Contributed by Batuhan Taskaya in :issue:`40192`) + +sys +--- + +Added a new :attr:`sys.platlibdir` attribute: name of the platform-specific +library directory. It is used to build the path of standard library and the +paths of installed extension modules. It is equal to ``"lib"`` on most +platforms. On Fedora and SuSE, it is equal to ``"lib64"`` on 64-bit platforms. +(Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in :issue:`1294959`.) + +Previously, :attr:`sys.stderr` was block-buffered when non-interactive. Now +``stderr`` defaults to always being line-buffered. +(Contributed by Jendrik Seipp in :issue:`13601`.) + +tracemalloc +----------- + +Added :func:`tracemalloc.reset_peak` to set the peak size of traced memory +blocks to the current size, to measure the peak of specific pieces of code. +(Contributed by Huon Wilson in :issue:`40630`.) + +typing +------ + +:pep:`593` introduced an :data:`typing.Annotated` type to decorate existing +types with context-specific metadata and new ``include_extras`` parameter to +:func:`typing.get_type_hints` to access the metadata at runtime. (Contributed +by Till Varoquaux and Konstantin Kashin.) + +unicodedata +----------- + +The Unicode database has been updated to version 13.0.0. (:issue:`39926`). + +venv +---- + +The activation scripts provided by :mod:`venv` now all specify their prompt +customization consistently by always using the value specified by +``__VENV_PROMPT__``. Previously some scripts unconditionally used +``__VENV_PROMPT__``, others only if it happened to be set (which was the default +case), and one used ``__VENV_NAME__`` instead. +(Contributed by Brett Cannon in :issue:`37663`.) + +xml +--- + +White space characters within attributes are now preserved when serializing +:mod:`xml.etree.ElementTree` to XML file. EOLNs are no longer normalized +to "\n". This is the result of discussion about how to interpret +section 2.11 of XML spec. +(Contributed by Mefistotelis in :issue:`39011`.) + + +Optimizations +============= + +* Optimized the idiom for assignment a temporary variable in comprehensions. + Now ``for y in [expr]`` in comprehensions is as fast as a simple assignment + ``y = expr``. For example: + + sums = [s for s in [0] for x in data for s in [s + x]] + + Unlike the ``:=`` operator this idiom does not leak a variable to the + outer scope. + + (Contributed by Serhiy Storchaka in :issue:`32856`.) + +* Optimized signal handling in multithreaded applications. If a thread different + than the main thread gets a signal, the bytecode evaluation loop is no longer + interrupted at each bytecode instruction to check for pending signals which + cannot be handled. Only the main thread of the main interpreter can handle + signals. + + Previously, the bytecode evaluation loop was interrupted at each instruction + until the main thread handles signals. + (Contributed by Victor Stinner in :issue:`40010`.) + +* Optimized the :mod:`subprocess` module on FreeBSD using ``closefrom()``. + (Contributed by Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Kocak and Victor + Stinner in :issue:`38061`.) + +* :c:func:`PyLong_FromDouble` is now up to 1.87x faster for values that + fit into :c:type:`long`. + (Contributed by Sergey Fedoseev in :issue:`37986`.) + +* A number of Python builtins (:class:`range`, :class:`tuple`, :class:`set`, + :class:`frozenset`, :class:`list`, :class:`dict`) are now sped up by using + :pep:`590` vectorcall protocol. + (Contributed by Dong-hee Na, Mark Shannon, Jeroen Demeyer and Petr Viktorin in :issue:`37207`.) + +* Optimized :func:`~set.difference_update` for the case when the other set + is much larger than the base set. + (Suggested by Evgeny Kapun with code contributed by Michele Orrù in :issue:`8425`.) + +* Python's small object allocator (``obmalloc.c``) now allows (no more than) + one empty arena to remain available for immediate reuse, without returning + it to the OS. This prevents thrashing in simple loops where an arena could + be created and destroyed anew on each iteration. + (Contributed by Tim Peters in :issue:`37257`.) + +* :term:`floor division` of float operation now has a better performance. Also + the message of :exc:`ZeroDivisionError` for this operation is updated. + (Contributed by Dong-hee Na in :issue:`39434`.) + +* Decoding short ASCII strings with UTF-8 and ascii codecs is now about + 15% faster. (Contributed by Inada Naoki in :issue:`37348`.) + +Here's a summary of performance improvements from Python 3.4 through Python 3.9: + +.. code-block:: none + + Python version 3.4 3.5 3.6 3.7 3.8 3.9 + -------------- --- --- --- --- --- --- + + Variable and attribute read access: + read_local 7.1 7.1 5.4 5.1 3.9 3.9 + read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.5 + read_global 15.5 19.0 14.3 13.6 7.6 7.8 + read_builtin 21.1 21.6 18.5 19.0 7.5 7.8 + read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 17.9 + read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 16.9 + read_instancevar 32.4 33.1 28.0 26.3 25.4 25.3 + read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 20.5 + read_namedtuple 73.8 57.5 45.0 46.8 18.4 18.7 + read_boundmethod 37.6 37.9 29.6 26.9 27.7 41.1 + + Variable and attribute write access: + write_local 8.7 9.3 5.5 5.3 4.3 4.3 + write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.8 + write_global 19.7 21.2 18.0 18.0 15.8 16.7 + write_classvar 92.9 96.0 104.6 102.1 39.2 39.8 + write_instancevar 44.6 45.8 40.0 38.9 35.5 37.4 + write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 25.8 + + Data structure read access: + read_list 24.2 24.5 20.8 20.8 19.0 19.5 + read_deque 24.7 25.5 20.2 20.6 19.8 20.2 + read_dict 24.3 25.7 22.3 23.0 21.0 22.4 + read_strdict 22.6 24.3 19.5 21.2 18.9 21.5 + + Data structure write access: + write_list 27.1 28.5 22.5 21.6 20.0 20.0 + write_deque 28.7 30.1 22.7 21.8 23.5 21.7 + write_dict 31.4 33.3 29.3 29.2 24.7 25.4 + write_strdict 28.4 29.9 27.5 25.2 23.1 24.5 + + Stack (or queue) operations: + list_append_pop 93.4 112.7 75.4 74.2 50.8 50.6 + deque_append_pop 43.5 57.0 49.4 49.2 42.5 44.2 + deque_append_popleft 43.7 57.3 49.7 49.7 42.8 46.4 + + Timing loop: + loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3 + +These results were generated from the variable access benchmark script at: +``Tools/scripts/var_access_benchmark.py``. The benchmark script displays timings +in nanoseconds. The benchmarks were measured on an +`Intel® Core™ i7-4960HQ processor +`_ +running the macOS 64-bit builds found at +`python.org `_. + + +Deprecated +========== + +* The distutils ``bdist_msi`` command is now deprecated, use + ``bdist_wheel`` (wheel packages) instead. + (Contributed by Hugo van Kemenade in :issue:`39586`.) + +* Currently :func:`math.factorial` accepts :class:`float` instances with + non-negative integer values (like ``5.0``). It raises a :exc:`ValueError` + for non-integral and negative floats. It is now deprecated. In future + Python versions it will raise a :exc:`TypeError` for all floats. + (Contributed by Serhiy Storchaka in :issue:`37315`.) + +* The :mod:`parser` and :mod:`symbol` modules are deprecated and will be + removed in future versions of Python. For the majority of use cases, + users can leverage the Abstract Syntax Tree (AST) generation and compilation + stage, using the :mod:`ast` module. + +* The Public C API functions :c:func:`PyParser_SimpleParseStringFlags`, + :c:func:`PyParser_SimpleParseStringFlagsFilename`, + :c:func:`PyParser_SimpleParseFileFlags` and :c:func:`PyNode_Compile` + are deprecated and will be removed in Python 3.10 together with the old parser. + +* Using :data:`NotImplemented` in a boolean context has been deprecated, + as it is almost exclusively the result of incorrect rich comparator + implementations. It will be made a :exc:`TypeError` in a future version + of Python. + (Contributed by Josh Rosenberg in :issue:`35712`.) + +* The :mod:`random` module currently accepts any hashable type as a + possible seed value. Unfortunately, some of those types are not + guaranteed to have a deterministic hash value. After Python 3.9, + the module will restrict its seeds to :const:`None`, :class:`int`, + :class:`float`, :class:`str`, :class:`bytes`, and :class:`bytearray`. + +* Opening the :class:`~gzip.GzipFile` file for writing without specifying + the *mode* argument is deprecated. In future Python versions it will always + be opened for reading by default. Specify the *mode* argument for opening + it for writing and silencing a warning. + (Contributed by Serhiy Storchaka in :issue:`28286`.) + +* Deprecated the ``split()`` method of :class:`_tkinter.TkappType` in + favour of the ``splitlist()`` method which has more consistent and + predicable behavior. + (Contributed by Serhiy Storchaka in :issue:`38371`.) + +* The explicit passing of coroutine objects to :func:`asyncio.wait` has been + deprecated and will be removed in version 3.11. + (Contributed by Yury Selivanov and Kyle Stanley in :issue:`34790`.) + +* binhex4 and hexbin4 standards are now deprecated. The :mod:`binhex` module + and the following :mod:`binascii` functions are now deprecated: + + * :func:`~binascii.b2a_hqx`, :func:`~binascii.a2b_hqx` + * :func:`~binascii.rlecode_hqx`, :func:`~binascii.rledecode_hqx` + + (Contributed by Victor Stinner in :issue:`39353`.) + +* :mod:`ast` classes ``slice``, ``Index`` and ``ExtSlice`` are considered deprecated + and will be removed in future Python versions. ``value`` itself should be + used instead of ``Index(value)``. ``Tuple(slices, Load())`` should be + used instead of ``ExtSlice(slices)``. + (Contributed by Serhiy Storchaka in :issue:`34822`.) + +* :mod:`ast` classes ``Suite``, ``Param``, ``AugLoad`` and ``AugStore`` + are considered deprecated and will be removed in future Python versions. + They were not generated by the parser and not accepted by the code + generator in Python 3. + (Contributed by Batuhan Taskaya in :issue:`39639` and :issue:`39969` + and Serhiy Storchaka in :issue:`39988`.) + +* The :c:func:`PyEval_InitThreads` and :c:func:`PyEval_ThreadsInitialized` + functions are now deprecated and will be removed in Python 3.11. Calling + :c:func:`PyEval_InitThreads` now does nothing. The :term:`GIL` is initialized + by :c:func:`Py_Initialize()` since Python 3.7. + (Contributed by Victor Stinner in :issue:`39877`.) + +* Passing ``None`` as the first argument to the :func:`shlex.split` function + has been deprecated. (Contributed by Zackery Spytz in :issue:`33262`.) + +* :func:`smtpd.MailmanProxy` is now deprecated as it is unusable without + an external module, ``mailman``. (Contributed by Samuel Colvin in :issue:`35800`.) + +* The :mod:`lib2to3` module now emits a :exc:`PendingDeprecationWarning`. + Python 3.9 switched to a PEG parser (see :pep:`617`), and Python 3.10 may + include new language syntax that is not parsable by lib2to3's LL(1) parser. + The ``lib2to3`` module may be removed from the standard library in a future + Python version. Consider third-party alternatives such as `LibCST`_ or + `parso`_. + (Contributed by Carl Meyer in :issue:`40360`.) + +* The *random* parameter of :func:`random.shuffle` has been deprecated. + (Contributed by Raymond Hettinger in :issue:`40465`) + +.. _LibCST: https://libcst.readthedocs.io/ +.. _parso: https://parso.readthedocs.io/ + +.. _removed-in-python-39: + +Removed +======= + +* The erroneous version at :data:`unittest.mock.__version__` has been removed. + +* :class:`nntplib.NNTP`: ``xpath()`` and ``xgtitle()`` methods have been removed. + These methods are deprecated since Python 3.3. Generally, these extensions + are not supported or not enabled by NNTP server administrators. + For ``xgtitle()``, please use :meth:`nntplib.NNTP.descriptions` or + :meth:`nntplib.NNTP.description` instead. + (Contributed by Dong-hee Na in :issue:`39366`.) + +* :class:`array.array`: ``tostring()`` and ``fromstring()`` methods have been + removed. They were aliases to ``tobytes()`` and ``frombytes()``, deprecated + since Python 3.2. + (Contributed by Victor Stinner in :issue:`38916`.) + +* The undocumented ``sys.callstats()`` function has been removed. Since Python + 3.7, it was deprecated and always returned :const:`None`. It required a special + build option ``CALL_PROFILE`` which was already removed in Python 3.7. + (Contributed by Victor Stinner in :issue:`37414`.) + +* The ``sys.getcheckinterval()`` and ``sys.setcheckinterval()`` functions have + been removed. They were deprecated since Python 3.2. Use + :func:`sys.getswitchinterval` and :func:`sys.setswitchinterval` instead. + (Contributed by Victor Stinner in :issue:`37392`.) + +* The C function ``PyImport_Cleanup()`` has been removed. It was documented as: + "Empty the module table. For internal use only." + (Contributed by Victor Stinner in :issue:`36710`.) + +* ``_dummy_thread`` and ``dummy_threading`` modules have been removed. These + modules were deprecated since Python 3.7 which requires threading support. + (Contributed by Victor Stinner in :issue:`37312`.) + +* ``aifc.openfp()`` alias to ``aifc.open()``, ``sunau.openfp()`` alias to + ``sunau.open()``, and ``wave.openfp()`` alias to :func:`wave.open()` have been + removed. They were deprecated since Python 3.7. + (Contributed by Victor Stinner in :issue:`37320`.) + +* The :meth:`~threading.Thread.isAlive()` method of :class:`threading.Thread` + has been removed. It was deprecated since Python 3.8. + Use :meth:`~threading.Thread.is_alive()` instead. + (Contributed by Dong-hee Na in :issue:`37804`.) + +* Methods ``getchildren()`` and ``getiterator()`` of classes + :class:`~xml.etree.ElementTree.ElementTree` and + :class:`~xml.etree.ElementTree.Element` in the :mod:`~xml.etree.ElementTree` + module have been removed. They were deprecated in Python 3.2. + Use ``iter(x)`` or ``list(x)`` instead of ``x.getchildren()`` and + ``x.iter()`` or ``list(x.iter())`` instead of ``x.getiterator()``. + (Contributed by Serhiy Storchaka in :issue:`36543`.) + +* The old :mod:`plistlib` API has been removed, it was deprecated since Python + 3.4. Use the :func:`~plistlib.load`, :func:`~plistlib.loads`, :func:`~plistlib.dump`, and + :func:`~plistlib.dumps` functions. Additionally, the *use_builtin_types* parameter was + removed, standard :class:`bytes` objects are always used instead. + (Contributed by Jon Janzen in :issue:`36409`.) + +* The C function ``PyGen_NeedsFinalizing`` has been removed. It was not + documented, tested, or used anywhere within CPython after the implementation + of :pep:`442`. Patch by Joannah Nanjekye. + (Contributed by Joannah Nanjekye in :issue:`15088`) + +* ``base64.encodestring()`` and ``base64.decodestring()``, aliases deprecated + since Python 3.1, have been removed: use :func:`base64.encodebytes` and + :func:`base64.decodebytes` instead. + (Contributed by Victor Stinner in :issue:`39351`.) + +* ``fractions.gcd()`` function has been removed, it was deprecated since Python + 3.5 (:issue:`22486`): use :func:`math.gcd` instead. + (Contributed by Victor Stinner in :issue:`39350`.) + +* The *buffering* parameter of :class:`bz2.BZ2File` has been removed. Since + Python 3.0, it was ignored and using it emitted a :exc:`DeprecationWarning`. + Pass an open file object to control how the file is opened. + (Contributed by Victor Stinner in :issue:`39357`.) + +* The *encoding* parameter of :func:`json.loads` has been removed. + As of Python 3.1, it was deprecated and ignored; using it has emitted a + :exc:`DeprecationWarning` since Python 3.8. + (Contributed by Inada Naoki in :issue:`39377`) + +* ``with (await asyncio.lock):`` and ``with (yield from asyncio.lock):`` statements are + not longer supported, use ``async with lock`` instead. The same is correct for + ``asyncio.Condition`` and ``asyncio.Semaphore``. + (Contributed by Andrew Svetlov in :issue:`34793`.) + +* The :func:`sys.getcounts` function, the ``-X showalloccount`` command line + option and the ``show_alloc_count`` field of the C structure + :c:type:`PyConfig` have been removed. They required a special Python build by + defining ``COUNT_ALLOCS`` macro. + (Contributed by Victor Stinner in :issue:`39489`.) + +* The ``_field_types`` attribute of the :class:`typing.NamedTuple` class + has been removed. It was deprecated since Python 3.8. Use + the ``__annotations__`` attribute instead. + (Contributed by Serhiy Storchaka in :issue:`40182`.) + +* The :meth:`symtable.SymbolTable.has_exec` method has been removed. It was + deprecated since 2006, and only returning ``False`` when it's called. + (Contributed by Batuhan Taskaya in :issue:`40208`) + +* The :meth:`asyncio.Task.current_task` and :meth:`asyncio.Task.all_tasks` + have been removed. They were deprecated since Python 3.7 and you can use + :func:`asyncio.current_task` and :func:`asyncio.all_tasks` instead. + (Contributed by Rémi Lapeyre in :issue:`40967`) + +* The ``unescape()`` method in the :class:`html.parser.HTMLParser` class + has been removed (it was deprecated since Python 3.4). :func:`html.unescape` + should be used for converting character references to the corresponding + unicode characters. + + +Porting to Python 3.9 +===================== + +This section lists previously described changes and other bugfixes +that may require changes to your code. + + +Changes in the Python API +------------------------- + +* :func:`__import__` and :func:`importlib.util.resolve_name` now raise + :exc:`ImportError` where it previously raised :exc:`ValueError`. Callers + catching the specific exception type and supporting both Python 3.9 and + earlier versions will need to catch both using ``except (ImportError, ValueError):``. + +* The :mod:`venv` activation scripts no longer special-case when + ``__VENV_PROMPT__`` is set to ``""``. + +* The :meth:`select.epoll.unregister` method no longer ignores the + :data:`~errno.EBADF` error. + (Contributed by Victor Stinner in :issue:`39239`.) + +* The *compresslevel* parameter of :class:`bz2.BZ2File` became keyword-only, + since the *buffering* parameter has been removed. + (Contributed by Victor Stinner in :issue:`39357`.) + +* Simplified AST for subscription. Simple indices will be represented by + their value, extended slices will be represented as tuples. + ``Index(value)`` will return a ``value`` itself, ``ExtSlice(slices)`` + will return ``Tuple(slices, Load())``. + (Contributed by Serhiy Storchaka in :issue:`34822`.) + +* The :mod:`importlib` module now ignores the :envvar:`PYTHONCASEOK` + environment variable when the :option:`-E` or :option:`-I` command line + options are being used. + +* The *encoding* parameter has been added to the classes :class:`ftplib.FTP` and + :class:`ftplib.FTP_TLS` as a keyword-only parameter, and the default encoding + is changed from Latin-1 to UTF-8 to follow :rfc:`2640`. + +* :meth:`asyncio.loop.shutdown_default_executor` has been added to + :class:`~asyncio.AbstractEventLoop`, meaning alternative event loops that + inherit from it should have this method defined. + (Contributed by Kyle Stanley in :issue:`34037`.) + +* The constant values of future flags in the :mod:`__future__` module + is updated in order to prevent collision with compiler flags. Previously + ``PyCF_ALLOW_TOP_LEVEL_AWAIT`` was clashing with ``CO_FUTURE_DIVISION``. + (Contributed by Batuhan Taskaya in :issue:`39562`) + +* ``array('u')`` now uses ``wchar_t`` as C type instead of ``Py_UNICODE``. + This change doesn't affect to its behavior because ``Py_UNICODE`` is alias + of ``wchar_t`` since Python 3.3. + (Contributed by Inada Naoki in :issue:`34538`.) + +* The :func:`logging.getLogger` API now returns the root logger when passed + the name ``'root'``, whereas previously it returned a non-root logger named + ``'root'``. This could affect cases where user code explicitly wants a + non-root logger named ``'root'``, or instantiates a logger using + ``logging.getLogger(__name__)`` in some top-level module called ``'root.py'``. + (Contributed by Vinay Sajip in :issue:`37742`.) + +* Division handling of :class:`~pathlib.PurePath` now returns ``NotImplemented`` + instead of raising a :exc:`TypeError` when passed something other than an + instance of ``str`` or :class:`~pathlib.PurePath`. This allows creating + compatible classes that don't inherit from those mentioned types. + (Contributed by Roger Aiudi in :issue:`34775`). + + +Changes in the C API +-------------------- + +* Instances of heap-allocated types (such as those created with + :c:func:`PyType_FromSpec` and similar APIs) hold a reference to their type + object since Python 3.8. As indicated in the "Changes in the C API" of Python + 3.8, for the vast majority of cases, there should be no side effect but for + types that have a custom :c:member:`~PyTypeObject.tp_traverse` function, + ensure that all custom ``tp_traverse`` functions of heap-allocated types + visit the object's type. + + Example: + + .. code-block:: c + + int + foo_traverse(foo_struct *self, visitproc visit, void *arg) { + // Rest of the traverse function + #if PY_VERSION_HEX >= 0x03090000 + // This was not needed before Python 3.9 (Python issue 35810 and 40217) + Py_VISIT(Py_TYPE(self)); + #endif + } + + If your traverse function delegates to ``tp_traverse`` of its base class + (or another type), ensure that ``Py_TYPE(self)`` is visited only once. + Note that only heap types are expected to visit the type in ``tp_traverse``. + + For example, if your ``tp_traverse`` function includes: + + .. code-block:: c + + base->tp_traverse(self, visit, arg) + + then add: + + .. code-block:: c + + #if PY_VERSION_HEX >= 0x03090000 + // This was not needed before Python 3.9 (Python issue 35810 and 40217) + if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) { + // a heap type's tp_traverse already visited Py_TYPE(self) + } else { + Py_VISIT(Py_TYPE(self)); + } + #else + + (See :issue:`35810` and :issue:`40217` for more information.) + +* The functions ``PyEval_CallObject``, ``PyEval_CallFunction``, + ``PyEval_CallMethod`` and ``PyEval_CallObjectWithKeywords`` are deprecated. + Use :c:func:`PyObject_Call` and its variants instead. + (See more details in :issue:`29548`.) + +CPython bytecode changes +------------------------ + +* The :opcode:`LOAD_ASSERTION_ERROR` opcode was added for handling the + :keyword:`assert` statement. Previously, the assert statement would not work + correctly if the :exc:`AssertionError` exception was being shadowed. + (Contributed by Zackery Spytz in :issue:`34880`.) + +* The :opcode:`COMPARE_OP` opcode was split into four distinct instructions: + + * ``COMPARE_OP`` for rich comparisons + * ``IS_OP`` for 'is' and 'is not' tests + * ``CONTAINS_OP`` for 'in' and 'not in' tests + * ``JUMP_IF_NOT_EXC_MATCH`` for checking exceptions in 'try-except' + statements. + + (Contributed by Mark Shannon in :issue:`39156`.) + + +Build Changes +============= + +* Added ``--with-platlibdir`` option to the ``configure`` script: name of the + platform-specific library directory, stored in the new :attr:`sys.platlibdir` + attribute. See :attr:`sys.platlibdir` attribute for more information. + (Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis + and Victor Stinner in :issue:`1294959`.) + +* The ``COUNT_ALLOCS`` special build macro has been removed. + (Contributed by Victor Stinner in :issue:`39489`.) + +* On non-Windows platforms, the :c:func:`setenv` and :c:func:`unsetenv` + functions are now required to build Python. + (Contributed by Victor Stinner in :issue:`39395`.) + +* On non-Windows platforms, creating ``bdist_wininst`` installers is now + officially unsupported. (See :issue:`10945` for more details.) + +* When building Python on macOS from source, ``_tkinter`` now links with + non-system Tcl and Tk frameworks if they are installed in + ``/Library/Frameworks``, as had been the case on older releases + of macOS. If a macOS SDK is explicitly configured, by using + ``--enable-universalsdk=`` or ``-isysroot``, only the SDK itself is + searched. The default behavior can still be overridden with + ``--with-tcltk-includes`` and ``--with-tcltk-libs``. + (Contributed by Ned Deily in :issue:`34956`.) + +* Python can now be built for Windows 10 ARM64. + (Contributed by Steve Dower in :issue:`33125`.) + +* Some individual tests are now skipped when ``--pgo`` is used. The tests + in question increased the PGO task time significantly and likely + didn't help improve optimization of the final executable. This + speeds up the task by a factor of about 15x. Running the full unit test + suite is slow. This change may result in a slightly less optimized build + since not as many code branches will be executed. If you are willing to + wait for the much slower build, the old behavior can be restored using + ``./configure [..] PROFILE_TASK="-m test --pgo-extended"``. We make no + guarantees as to which PGO task set produces a faster build. Users who care + should run their own relevant benchmarks as results can depend on the + environment, workload, and compiler tool chain. + (See :issue:`36044` and :issue:`37707` for more details.) + + +C API Changes +============= + +New Features +------------ + +* :pep:`573`: Added :c:func:`PyType_FromModuleAndSpec` to associate + a module with a class; :c:func:`PyType_GetModule` and + :c:func:`PyType_GetModuleState` to retrieve the module and its state; and + :c:data:`PyCMethod` and :c:data:`METH_METHOD` to allow a method to + access the class it was defined in. + (Contributed by Marcel Plch and Petr Viktorin in :issue:`38787`.) + +* Added :c:func:`PyFrame_GetCode` function: get a frame code. + Added :c:func:`PyFrame_GetBack` function: get the frame next outer frame. + (Contributed by Victor Stinner in :issue:`40421`.) + +* Added :c:func:`PyFrame_GetLineNumber` to the limited C API. + (Contributed by Victor Stinner in :issue:`40421`.) + +* Added :c:func:`PyThreadState_GetInterpreter` and + :c:func:`PyInterpreterState_Get` functions to get the interpreter. + Added :c:func:`PyThreadState_GetFrame` function to get the current frame of a + Python thread state. + Added :c:func:`PyThreadState_GetID` function: get the unique identifier of a + Python thread state. + (Contributed by Victor Stinner in :issue:`39947`.) + +* Added a new public :c:func:`PyObject_CallNoArgs` function to the C API, which + calls a callable Python object without any arguments. It is the most efficient + way to call a callable Python object without any argument. + (Contributed by Victor Stinner in :issue:`37194`.) + +* Changes in the limited C API (if ``Py_LIMITED_API`` macro is defined): + + * Provide :c:func:`Py_EnterRecursiveCall` and :c:func:`Py_LeaveRecursiveCall` + as regular functions for the limited API. Previously, there were defined as + macros, but these macros didn't compile with the limited C API which cannot + access ``PyThreadState.recursion_depth`` field (the structure is opaque in + the limited C API). + + * ``PyObject_INIT()`` and ``PyObject_INIT_VAR()`` become regular "opaque" + function to hide implementation details. + + (Contributed by Victor Stinner in :issue:`38644` and :issue:`39542`.) + +* The :c:func:`PyModule_AddType` function is added to help adding a type + to a module. + (Contributed by Dong-hee Na in :issue:`40024`.) + +* Added the functions :c:func:`PyObject_GC_IsTracked` and + :c:func:`PyObject_GC_IsFinalized` to the public API to allow to query if + Python objects are being currently tracked or have been already finalized by + the garbage collector respectively. + (Contributed by Pablo Galindo Salgado in :issue:`40241`.) + +* Added :c:func:`_PyObject_FunctionStr` to get a user-friendly string + representation of a function-like object. + (Patch by Jeroen Demeyer in :issue:`37645`.) + +* Added :c:func:`PyObject_CallOneArg` for calling an object with one + positional argument + (Patch by Jeroen Demeyer in :issue:`37483`.) + + +Porting to Python 3.9 +--------------------- + +* ``PyInterpreterState.eval_frame`` (:pep:`523`) now requires a new mandatory + *tstate* parameter (``PyThreadState*``). + (Contributed by Victor Stinner in :issue:`38500`.) + +* Extension modules: :c:member:`~PyModuleDef.m_traverse`, + :c:member:`~PyModuleDef.m_clear` and :c:member:`~PyModuleDef.m_free` + functions of :c:type:`PyModuleDef` are no longer called if the module state + was requested but is not allocated yet. This is the case immediately after + the module is created and before the module is executed + (:c:data:`Py_mod_exec` function). More precisely, these functions are not called + if :c:member:`~PyModuleDef.m_size` is greater than 0 and the module state (as + returned by :c:func:`PyModule_GetState`) is ``NULL``. + + Extension modules without module state (``m_size <= 0``) are not affected. + +* If :c:func:`Py_AddPendingCall` is called in a subinterpreter, the function is + now scheduled to be called from the subinterpreter, rather than being called + from the main interpreter. Each subinterpreter now has its own list of + scheduled calls. + (Contributed by Victor Stinner in :issue:`39984`.) + +* The Windows registry is no longer used to initialize :data:`sys.path` when + the ``-E`` option is used (if :c:member:`PyConfig.use_environment` is set to + ``0``). This is significant when embedding Python on Windows. + (Contributed by Zackery Spytz in :issue:`8901`.) + +* The global variable :c:data:`PyStructSequence_UnnamedField` is now a constant + and refers to a constant string. + (Contributed by Serhiy Storchaka in :issue:`38650`.) + +* The :c:type:`PyGC_Head` structure is now opaque. It is only defined in the + internal C API (``pycore_gc.h``). + (Contributed by Victor Stinner in :issue:`40241`.) + +* The ``Py_UNICODE_COPY``, ``Py_UNICODE_FILL``, ``PyUnicode_WSTR_LENGTH``, + :c:func:`PyUnicode_FromUnicode`, :c:func:`PyUnicode_AsUnicode`, + ``_PyUnicode_AsUnicode``, and :c:func:`PyUnicode_AsUnicodeAndSize` are + marked as deprecated in C. They have been deprecated by :pep:`393` since + Python 3.3. + (Contributed by Inada Naoki in :issue:`36346`.) + +* The :c:func:`Py_FatalError` function is replaced with a macro which logs + automatically the name of the current function, unless the + ``Py_LIMITED_API`` macro is defined. + (Contributed by Victor Stinner in :issue:`39882`.) + +* The vectorcall protocol now requires that the caller passes only strings as + keyword names. (See :issue:`37540` for more information.) + +* Implementation details of a number of macros and functions are now hidden: + + * :c:func:`PyObject_IS_GC` macro was converted to a function. + + * The :c:func:`PyObject_NEW` macro becomes an alias to the + :c:func:`PyObject_New` macro, and the :c:func:`PyObject_NEW_VAR` macro + becomes an alias to the :c:func:`PyObject_NewVar` macro. They no longer + access directly the :c:member:`PyTypeObject.tp_basicsize` member. + + * :c:func:`PyType_HasFeature` now always calls :c:func:`PyType_GetFlags`. + Previously, it accessed directly the :c:member:`PyTypeObject.tp_flags` + member when the limited C API was not used. + + * :c:func:`PyObject_GET_WEAKREFS_LISTPTR` macro was converted to a function: + the macro accessed directly the :c:member:`PyTypeObject.tp_weaklistoffset` + member. + + * :c:func:`PyObject_CheckBuffer` macro was converted to a function: the macro + accessed directly the :c:member:`PyTypeObject.tp_as_buffer` member. + + * :c:func:`PyIndex_Check` is now always declared as an opaque function to hide + implementation details: removed the ``PyIndex_Check()`` macro. The macro accessed + directly the :c:member:`PyTypeObject.tp_as_number` member. + + (See :issue:`40170` for more details.) + +Removed +------- + +* Excluded ``PyFPE_START_PROTECT()`` and ``PyFPE_END_PROTECT()`` macros of + ``pyfpe.h`` from the limited C API. + (Contributed by Victor Stinner in :issue:`38835`.) + +* The ``tp_print`` slot of :ref:`PyTypeObject ` has been removed. + It was used for printing objects to files in Python 2.7 and before. Since + Python 3.0, it has been ignored and unused. + (Contributed by Jeroen Demeyer in :issue:`36974`.) + +* Changes in the limited C API (if ``Py_LIMITED_API`` macro is defined): + + * Excluded the following functions from the limited C API: + + * ``PyThreadState_DeleteCurrent()`` + (Contributed by Joannah Nanjekye in :issue:`37878`.) + * ``_Py_CheckRecursionLimit`` + * ``_Py_NewReference()`` + * ``_Py_ForgetReference()`` + * ``_PyTraceMalloc_NewReference()`` + * ``_Py_GetRefTotal()`` + * The trashcan mechanism which never worked in the limited C API. + * ``PyTrash_UNWIND_LEVEL`` + * ``Py_TRASHCAN_BEGIN_CONDITION`` + * ``Py_TRASHCAN_BEGIN`` + * ``Py_TRASHCAN_END`` + * ``Py_TRASHCAN_SAFE_BEGIN`` + * ``Py_TRASHCAN_SAFE_END`` + + * Moved following functions and definitions to the internal C API: + + * ``_PyDebug_PrintTotalRefs()`` + * ``_Py_PrintReferences()`` + * ``_Py_PrintReferenceAddresses()`` + * ``_Py_tracemalloc_config`` + * ``_Py_AddToAllObjects()`` (specific to ``Py_TRACE_REFS`` build) + + (Contributed by Victor Stinner in :issue:`38644` and :issue:`39542`.) + +* Removed ``_PyRuntime.getframe`` hook and removed ``_PyThreadState_GetFrame`` + macro which was an alias to ``_PyRuntime.getframe``. They were only exposed + by the internal C API. Removed also ``PyThreadFrameGetter`` type. + (Contributed by Victor Stinner in :issue:`39946`.) + +* Removed the following functions from the C API. Call :c:func:`PyGC_Collect` + explicitly to clear all free lists. + (Contributed by Inada Naoki and Victor Stinner in :issue:`37340`, + :issue:`38896` and :issue:`40428`.) + + * ``PyAsyncGen_ClearFreeLists()`` + * ``PyContext_ClearFreeList()`` + * ``PyDict_ClearFreeList()`` + * ``PyFloat_ClearFreeList()`` + * ``PyFrame_ClearFreeList()`` + * ``PyList_ClearFreeList()`` + * ``PyMethod_ClearFreeList()`` and ``PyCFunction_ClearFreeList()``: + the free lists of bound method objects have been removed. + * ``PySet_ClearFreeList()``: the set free list has been removed + in Python 3.4. + * ``PyTuple_ClearFreeList()`` + * ``PyUnicode_ClearFreeList()``: the Unicode free list has been removed in + Python 3.3. + +* Removed ``_PyUnicode_ClearStaticStrings()`` function. + (Contributed by Victor Stinner in :issue:`39465`.) + +* Removed ``Py_UNICODE_MATCH``. It has been deprecated by :pep:`393`, and + broken since Python 3.3. The :c:func:`PyUnicode_Tailmatch` function can be + used instead. + (Contributed by Inada Naoki in :issue:`36346`.) + +* Cleaned header files of interfaces defined but with no implementation. + The public API symbols being removed are: + ``_PyBytes_InsertThousandsGroupingLocale``, + ``_PyBytes_InsertThousandsGrouping``, ``_Py_InitializeFromArgs``, + ``_Py_InitializeFromWideArgs``, ``_PyFloat_Repr``, ``_PyFloat_Digits``, + ``_PyFloat_DigitsInit``, ``PyFrame_ExtendStack``, ``_PyAIterWrapper_Type``, + ``PyNullImporter_Type``, ``PyCmpWrapper_Type``, ``PySortWrapper_Type``, + ``PyNoArgsFunction``. + (Contributed by Pablo Galindo Salgado in :issue:`39372`.) + +Notable changes in Python 3.9.1 +=============================== + +typing +------ + +The behavior of :class:`typing.Literal` was changed to conform with :pep:`586` +and to match the behavior of static type checkers specified in the PEP. + +1. ``Literal`` now de-duplicates parameters. +2. Equality comparisons between ``Literal`` objects are now order independent. +3. ``Literal`` comparisons now respect types. For example, + ``Literal[0] == Literal[False]`` previously evaluated to ``True``. It is + now ``False``. To support this change, the internally used type cache now + supports differentiating types. +4. ``Literal`` objects will now raise a :exc:`TypeError` exception during + equality comparisons if one of their parameters are not :term:`immutable`. + Note that declaring ``Literal`` with mutable parameters will not throw + an error:: + + >>> from typing import Literal + >>> Literal[{0}] + >>> Literal[{0}] == Literal[{False}] + Traceback (most recent call last): + File "", line 1, in + TypeError: unhashable type: 'set' + +(Contributed by Yurii Karabas in :issue:`42345`.) + +macOS 11.0 (Big Sur) and Apple Silicon Mac support +-------------------------------------------------- + +As of 3.9.1, Python now fully supports building and running on macOS 11.0 +(Big Sur) and on Apple Silicon Macs (based on the ``ARM64`` architecture). +A new universal build variant, ``universal2``, is now available to natively +support both ``ARM64`` and ``Intel 64`` in one set of executables. Binaries +can also now be built on current versions of macOS to be deployed on a range +of older macOS versions (tested to 10.9) while making some newer OS +functions and options conditionally available based on the operating system +version in use at runtime ("weaklinking"). + +(Contributed by Ronald Oussoren and Lawrence D'Anna in :issue:`41100`.) + +Notable changes in Python 3.9.2 +=============================== + +collections.abc +--------------- + +:class:`collections.abc.Callable` generic now flattens type parameters, similar +to what :data:`typing.Callable` currently does. This means that +``collections.abc.Callable[[int, str], str]`` will have ``__args__`` of +``(int, str, str)``; previously this was ``([int, str], str)``. To allow this +change, :class:`types.GenericAlias` can now be subclassed, and a subclass will +be returned when subscripting the :class:`collections.abc.Callable` type. +Code which accesses the arguments via :func:`typing.get_args` or ``__args__`` +need to account for this change. A :exc:`DeprecationWarning` may be emitted for +invalid forms of parameterizing :class:`collections.abc.Callable` which may have +passed silently in Python 3.9.1. This :exc:`DeprecationWarning` will +become a :exc:`TypeError` in Python 3.10. +(Contributed by Ken Jin in :issue:`42195`.) + +urllib.parse +------------ + +Earlier Python versions allowed using both ``;`` and ``&`` as +query parameter separators in :func:`urllib.parse.parse_qs` and +:func:`urllib.parse.parse_qsl`. Due to security concerns, and to conform with +newer W3C recommendations, this has been changed to allow only a single +separator key, with ``&`` as the default. This change also affects +:func:`cgi.parse` and :func:`cgi.parse_multipart` as they use the affected +functions internally. For more details, please see their respective +documentation. +(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in :issue:`42967`.) diff --git a/Doc/whatsnew/index.rst b/Doc/whatsnew/index.rst index b1160c0398215240b25c26362f899a937e75bfc8..954e38bc6f1e3d48e922c9734c4ca416047022a5 100644 --- a/Doc/whatsnew/index.rst +++ b/Doc/whatsnew/index.rst @@ -11,6 +11,7 @@ anyone wishing to stay up-to-date after a new release. .. toctree:: :maxdepth: 2 + 3.9.rst 3.8.rst 3.7.rst 3.6.rst diff --git a/Grammar/Grammar b/Grammar/Grammar index 21f7e1a89115b29c96470dc5e84bbc341408501c..170518af74e5a7bce9a34438fa4590bac43ef2a8 100644 --- a/Grammar/Grammar +++ b/Grammar/Grammar @@ -14,7 +14,7 @@ single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE file_input: (NEWLINE | stmt)* ENDMARKER eval_input: testlist NEWLINE* ENDMARKER -decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE +decorator: '@' namedexpr_test NEWLINE decorators: decorator+ decorated: decorators (classdef | funcdef | async_funcdef) diff --git a/Grammar/python.gram b/Grammar/python.gram new file mode 100644 index 0000000000000000000000000000000000000000..64e205e7fd815443164764e083926203fd6ac475 --- /dev/null +++ b/Grammar/python.gram @@ -0,0 +1,707 @@ +# PEG grammar for Python + +@trailer ''' +void * +_PyPegen_parse(Parser *p) +{ + // Initialize keywords + p->keywords = reserved_keywords; + p->n_keyword_lists = n_keyword_lists; + + // Run parser + void *result = NULL; + if (p->start_rule == Py_file_input) { + result = file_rule(p); + } else if (p->start_rule == Py_single_input) { + result = interactive_rule(p); + } else if (p->start_rule == Py_eval_input) { + result = eval_rule(p); + } else if (p->start_rule == Py_func_type_input) { + result = func_type_rule(p); + } else if (p->start_rule == Py_fstring_input) { + result = fstring_rule(p); + } + + return result; +} + +// The end +''' +file[mod_ty]: a=[statements] ENDMARKER { _PyPegen_make_module(p, a) } +interactive[mod_ty]: a=statement_newline { Interactive(a, p->arena) } +eval[mod_ty]: a=expressions NEWLINE* ENDMARKER { Expression(a, p->arena) } +func_type[mod_ty]: '(' a=[type_expressions] ')' '->' b=expression NEWLINE* ENDMARKER { FunctionType(a, b, p->arena) } +fstring[expr_ty]: star_expressions + +# type_expressions allow */** but ignore them +type_expressions[asdl_seq*]: + | a=','.expression+ ',' '*' b=expression ',' '**' c=expression { + _PyPegen_seq_append_to_end(p, CHECK(_PyPegen_seq_append_to_end(p, a, b)), c) } + | a=','.expression+ ',' '*' b=expression { _PyPegen_seq_append_to_end(p, a, b) } + | a=','.expression+ ',' '**' b=expression { _PyPegen_seq_append_to_end(p, a, b) } + | '*' a=expression ',' '**' b=expression { + _PyPegen_seq_append_to_end(p, CHECK(_PyPegen_singleton_seq(p, a)), b) } + | '*' a=expression { _PyPegen_singleton_seq(p, a) } + | '**' a=expression { _PyPegen_singleton_seq(p, a) } + | ','.expression+ + +statements[asdl_seq*]: a=statement+ { _PyPegen_seq_flatten(p, a) } +statement[asdl_seq*]: a=compound_stmt { _PyPegen_singleton_seq(p, a) } | simple_stmt +statement_newline[asdl_seq*]: + | a=compound_stmt NEWLINE { _PyPegen_singleton_seq(p, a) } + | simple_stmt + | NEWLINE { _PyPegen_singleton_seq(p, CHECK(_Py_Pass(EXTRA))) } + | ENDMARKER { _PyPegen_interactive_exit(p) } +simple_stmt[asdl_seq*]: + | a=small_stmt !';' NEWLINE { _PyPegen_singleton_seq(p, a) } # Not needed, there for speedup + | a=';'.small_stmt+ [';'] NEWLINE { a } +# NOTE: assignment MUST precede expression, else parsing a simple assignment +# will throw a SyntaxError. +small_stmt[stmt_ty] (memo): + | assignment + | e=star_expressions { _Py_Expr(e, EXTRA) } + | &'return' return_stmt + | &('import' | 'from') import_stmt + | &'raise' raise_stmt + | 'pass' { _Py_Pass(EXTRA) } + | &'del' del_stmt + | &'yield' yield_stmt + | &'assert' assert_stmt + | 'break' { _Py_Break(EXTRA) } + | 'continue' { _Py_Continue(EXTRA) } + | &'global' global_stmt + | &'nonlocal' nonlocal_stmt +compound_stmt[stmt_ty]: + | &('def' | '@' | ASYNC) function_def + | &'if' if_stmt + | &('class' | '@') class_def + | &('with' | ASYNC) with_stmt + | &('for' | ASYNC) for_stmt + | &'try' try_stmt + | &'while' while_stmt + +# NOTE: annotated_rhs may start with 'yield'; yield_expr must start with 'yield' +assignment[stmt_ty]: + | a=NAME ':' b=expression c=['=' d=annotated_rhs { d }] { + CHECK_VERSION( + 6, + "Variable annotation syntax is", + _Py_AnnAssign(CHECK(_PyPegen_set_expr_context(p, a, Store)), b, c, 1, EXTRA) + ) } + | a=('(' b=single_target ')' { b } + | single_subscript_attribute_target) ':' b=expression c=['=' d=annotated_rhs { d }] { + CHECK_VERSION(6, "Variable annotations syntax is", _Py_AnnAssign(a, b, c, 0, EXTRA)) } + | a=(z=star_targets '=' { z })+ b=(yield_expr | star_expressions) !'=' tc=[TYPE_COMMENT] { + _Py_Assign(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) } + | a=single_target b=augassign ~ c=(yield_expr | star_expressions) { + _Py_AugAssign(a, b->kind, c, EXTRA) } + | invalid_assignment + +augassign[AugOperator*]: + | '+=' { _PyPegen_augoperator(p, Add) } + | '-=' { _PyPegen_augoperator(p, Sub) } + | '*=' { _PyPegen_augoperator(p, Mult) } + | '@=' { CHECK_VERSION(5, "The '@' operator is", _PyPegen_augoperator(p, MatMult)) } + | '/=' { _PyPegen_augoperator(p, Div) } + | '%=' { _PyPegen_augoperator(p, Mod) } + | '&=' { _PyPegen_augoperator(p, BitAnd) } + | '|=' { _PyPegen_augoperator(p, BitOr) } + | '^=' { _PyPegen_augoperator(p, BitXor) } + | '<<=' { _PyPegen_augoperator(p, LShift) } + | '>>=' { _PyPegen_augoperator(p, RShift) } + | '**=' { _PyPegen_augoperator(p, Pow) } + | '//=' { _PyPegen_augoperator(p, FloorDiv) } + +global_stmt[stmt_ty]: 'global' a=','.NAME+ { + _Py_Global(CHECK(_PyPegen_map_names_to_ids(p, a)), EXTRA) } +nonlocal_stmt[stmt_ty]: 'nonlocal' a=','.NAME+ { + _Py_Nonlocal(CHECK(_PyPegen_map_names_to_ids(p, a)), EXTRA) } + +yield_stmt[stmt_ty]: y=yield_expr { _Py_Expr(y, EXTRA) } + +assert_stmt[stmt_ty]: 'assert' a=expression b=[',' z=expression { z }] { _Py_Assert(a, b, EXTRA) } + +del_stmt[stmt_ty]: + | 'del' a=del_targets &(';' | NEWLINE) { _Py_Delete(a, EXTRA) } + | invalid_del_stmt + +import_stmt[stmt_ty]: import_name | import_from +import_name[stmt_ty]: 'import' a=dotted_as_names { _Py_Import(a, EXTRA) } +# note below: the ('.' | '...') is necessary because '...' is tokenized as ELLIPSIS +import_from[stmt_ty]: + | 'from' a=('.' | '...')* b=dotted_name 'import' c=import_from_targets { + _Py_ImportFrom(b->v.Name.id, c, _PyPegen_seq_count_dots(a), EXTRA) } + | 'from' a=('.' | '...')+ 'import' b=import_from_targets { + _Py_ImportFrom(NULL, b, _PyPegen_seq_count_dots(a), EXTRA) } +import_from_targets[asdl_seq*]: + | '(' a=import_from_as_names [','] ')' { a } + | import_from_as_names !',' + | '*' { _PyPegen_singleton_seq(p, CHECK(_PyPegen_alias_for_star(p))) } + | invalid_import_from_targets +import_from_as_names[asdl_seq*]: + | a=','.import_from_as_name+ { a } +import_from_as_name[alias_ty]: + | a=NAME b=['as' z=NAME { z }] { _Py_alias(a->v.Name.id, + (b) ? ((expr_ty) b)->v.Name.id : NULL, + p->arena) } +dotted_as_names[asdl_seq*]: + | a=','.dotted_as_name+ { a } +dotted_as_name[alias_ty]: + | a=dotted_name b=['as' z=NAME { z }] { _Py_alias(a->v.Name.id, + (b) ? ((expr_ty) b)->v.Name.id : NULL, + p->arena) } +dotted_name[expr_ty]: + | a=dotted_name '.' b=NAME { _PyPegen_join_names_with_dot(p, a, b) } + | NAME + +if_stmt[stmt_ty]: + | 'if' a=named_expression ':' b=block c=elif_stmt { _Py_If(a, b, CHECK(_PyPegen_singleton_seq(p, c)), EXTRA) } + | 'if' a=named_expression ':' b=block c=[else_block] { _Py_If(a, b, c, EXTRA) } +elif_stmt[stmt_ty]: + | 'elif' a=named_expression ':' b=block c=elif_stmt { _Py_If(a, b, CHECK(_PyPegen_singleton_seq(p, c)), EXTRA) } + | 'elif' a=named_expression ':' b=block c=[else_block] { _Py_If(a, b, c, EXTRA) } +else_block[asdl_seq*]: 'else' ':' b=block { b } + +while_stmt[stmt_ty]: + | 'while' a=named_expression ':' b=block c=[else_block] { _Py_While(a, b, c, EXTRA) } + +for_stmt[stmt_ty]: + | 'for' t=star_targets 'in' ~ ex=star_expressions ':' tc=[TYPE_COMMENT] b=block el=[else_block] { + _Py_For(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA) } + | ASYNC 'for' t=star_targets 'in' ~ ex=star_expressions ':' tc=[TYPE_COMMENT] b=block el=[else_block] { + CHECK_VERSION(5, "Async for loops are", _Py_AsyncFor(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA)) } + | invalid_for_target + +with_stmt[stmt_ty]: + | 'with' '(' a=','.with_item+ ','? ')' ':' b=block { + _Py_With(a, b, NULL, EXTRA) } + | 'with' a=','.with_item+ ':' tc=[TYPE_COMMENT] b=block { + _Py_With(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) } + | ASYNC 'with' '(' a=','.with_item+ ','? ')' ':' b=block { + CHECK_VERSION(5, "Async with statements are", _Py_AsyncWith(a, b, NULL, EXTRA)) } + | ASYNC 'with' a=','.with_item+ ':' tc=[TYPE_COMMENT] b=block { + CHECK_VERSION(5, "Async with statements are", _Py_AsyncWith(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA)) } +with_item[withitem_ty]: + | e=expression 'as' t=star_target &(',' | ')' | ':') { _Py_withitem(e, t, p->arena) } + | invalid_with_item + | e=expression { _Py_withitem(e, NULL, p->arena) } + +try_stmt[stmt_ty]: + | 'try' ':' b=block f=finally_block { _Py_Try(b, NULL, NULL, f, EXTRA) } + | 'try' ':' b=block ex=except_block+ el=[else_block] f=[finally_block] { _Py_Try(b, ex, el, f, EXTRA) } +except_block[excepthandler_ty]: + | 'except' e=expression t=['as' z=NAME { z }] ':' b=block { + _Py_ExceptHandler(e, (t) ? ((expr_ty) t)->v.Name.id : NULL, b, EXTRA) } + | 'except' ':' b=block { _Py_ExceptHandler(NULL, NULL, b, EXTRA) } +finally_block[asdl_seq*]: 'finally' ':' a=block { a } + +return_stmt[stmt_ty]: + | 'return' a=[star_expressions] { _Py_Return(a, EXTRA) } + +raise_stmt[stmt_ty]: + | 'raise' a=expression b=['from' z=expression { z }] { _Py_Raise(a, b, EXTRA) } + | 'raise' { _Py_Raise(NULL, NULL, EXTRA) } + +function_def[stmt_ty]: + | d=decorators f=function_def_raw { _PyPegen_function_def_decorators(p, d, f) } + | function_def_raw + +function_def_raw[stmt_ty]: + | 'def' n=NAME '(' params=[params] ')' a=['->' z=expression { z }] ':' tc=[func_type_comment] b=block { + _Py_FunctionDef(n->v.Name.id, + (params) ? params : CHECK(_PyPegen_empty_arguments(p)), + b, NULL, a, NEW_TYPE_COMMENT(p, tc), EXTRA) } + | ASYNC 'def' n=NAME '(' params=[params] ')' a=['->' z=expression { z }] ':' tc=[func_type_comment] b=block { + CHECK_VERSION( + 5, + "Async functions are", + _Py_AsyncFunctionDef(n->v.Name.id, + (params) ? params : CHECK(_PyPegen_empty_arguments(p)), + b, NULL, a, NEW_TYPE_COMMENT(p, tc), EXTRA) + ) } +func_type_comment[Token*]: + | NEWLINE t=TYPE_COMMENT &(NEWLINE INDENT) { t } # Must be followed by indented block + | invalid_double_type_comments + | TYPE_COMMENT + +params[arguments_ty]: + | invalid_parameters + | parameters + +parameters[arguments_ty]: + | a=slash_no_default b=param_no_default* c=param_with_default* d=[star_etc] { + _PyPegen_make_arguments(p, a, NULL, b, c, d) } + | a=slash_with_default b=param_with_default* c=[star_etc] { + _PyPegen_make_arguments(p, NULL, a, NULL, b, c) } + | a=param_no_default+ b=param_with_default* c=[star_etc] { + _PyPegen_make_arguments(p, NULL, NULL, a, b, c) } + | a=param_with_default+ b=[star_etc] { _PyPegen_make_arguments(p, NULL, NULL, NULL, a, b)} + | a=star_etc { _PyPegen_make_arguments(p, NULL, NULL, NULL, NULL, a) } + +# Some duplication here because we can't write (',' | &')'), +# which is because we don't support empty alternatives (yet). +# +slash_no_default[asdl_seq*]: + | a=param_no_default+ '/' ',' { a } + | a=param_no_default+ '/' &')' { a } +slash_with_default[SlashWithDefault*]: + | a=param_no_default* b=param_with_default+ '/' ',' { _PyPegen_slash_with_default(p, a, b) } + | a=param_no_default* b=param_with_default+ '/' &')' { _PyPegen_slash_with_default(p, a, b) } + +star_etc[StarEtc*]: + | '*' a=param_no_default b=param_maybe_default* c=[kwds] { + _PyPegen_star_etc(p, a, b, c) } + | '*' ',' b=param_maybe_default+ c=[kwds] { + _PyPegen_star_etc(p, NULL, b, c) } + | a=kwds { _PyPegen_star_etc(p, NULL, NULL, a) } + | invalid_star_etc + +kwds[arg_ty]: '**' a=param_no_default { a } + +# One parameter. This *includes* a following comma and type comment. +# +# There are three styles: +# - No default +# - With default +# - Maybe with default +# +# There are two alternative forms of each, to deal with type comments: +# - Ends in a comma followed by an optional type comment +# - No comma, optional type comment, must be followed by close paren +# The latter form is for a final parameter without trailing comma. +# +param_no_default[arg_ty]: + | a=param ',' tc=TYPE_COMMENT? { _PyPegen_add_type_comment_to_arg(p, a, tc) } + | a=param tc=TYPE_COMMENT? &')' { _PyPegen_add_type_comment_to_arg(p, a, tc) } +param_with_default[NameDefaultPair*]: + | a=param c=default ',' tc=TYPE_COMMENT? { _PyPegen_name_default_pair(p, a, c, tc) } + | a=param c=default tc=TYPE_COMMENT? &')' { _PyPegen_name_default_pair(p, a, c, tc) } +param_maybe_default[NameDefaultPair*]: + | a=param c=default? ',' tc=TYPE_COMMENT? { _PyPegen_name_default_pair(p, a, c, tc) } + | a=param c=default? tc=TYPE_COMMENT? &')' { _PyPegen_name_default_pair(p, a, c, tc) } +param[arg_ty]: a=NAME b=annotation? { _Py_arg(a->v.Name.id, b, NULL, EXTRA) } + +annotation[expr_ty]: ':' a=expression { a } +default[expr_ty]: '=' a=expression { a } + +decorators[asdl_seq*]: a=('@' f=named_expression NEWLINE { f })+ { a } + +class_def[stmt_ty]: + | a=decorators b=class_def_raw { _PyPegen_class_def_decorators(p, a, b) } + | class_def_raw +class_def_raw[stmt_ty]: + | 'class' a=NAME b=['(' z=[arguments] ')' { z }] ':' c=block { + _Py_ClassDef(a->v.Name.id, + (b) ? ((expr_ty) b)->v.Call.args : NULL, + (b) ? ((expr_ty) b)->v.Call.keywords : NULL, + c, NULL, EXTRA) } + +block[asdl_seq*] (memo): + | NEWLINE INDENT a=statements DEDENT { a } + | simple_stmt + | invalid_block + +star_expressions[expr_ty]: + | a=star_expression b=(',' c=star_expression { c })+ [','] { + _Py_Tuple(CHECK(_PyPegen_seq_insert_in_front(p, a, b)), Load, EXTRA) } + | a=star_expression ',' { _Py_Tuple(CHECK(_PyPegen_singleton_seq(p, a)), Load, EXTRA) } + | star_expression +star_expression[expr_ty] (memo): + | '*' a=bitwise_or { _Py_Starred(a, Load, EXTRA) } + | expression + +star_named_expressions[asdl_seq*]: a=','.star_named_expression+ [','] { a } +star_named_expression[expr_ty]: + | '*' a=bitwise_or { _Py_Starred(a, Load, EXTRA) } + | named_expression +named_expression[expr_ty]: + | a=NAME ':=' ~ b=expression { _Py_NamedExpr(CHECK(_PyPegen_set_expr_context(p, a, Store)), b, EXTRA) } + | expression !':=' + | invalid_named_expression + +annotated_rhs[expr_ty]: yield_expr | star_expressions + +expressions[expr_ty]: + | a=expression b=(',' c=expression { c })+ [','] { + _Py_Tuple(CHECK(_PyPegen_seq_insert_in_front(p, a, b)), Load, EXTRA) } + | a=expression ',' { _Py_Tuple(CHECK(_PyPegen_singleton_seq(p, a)), Load, EXTRA) } + | expression +expression[expr_ty] (memo): + | a=disjunction 'if' b=disjunction 'else' c=expression { _Py_IfExp(b, a, c, EXTRA) } + | disjunction + | lambdef + +lambdef[expr_ty]: + | 'lambda' a=[lambda_params] ':' b=expression { _Py_Lambda((a) ? a : CHECK(_PyPegen_empty_arguments(p)), b, EXTRA) } + +lambda_params[arguments_ty]: + | invalid_lambda_parameters + | lambda_parameters + +# lambda_parameters etc. duplicates parameters but without annotations +# or type comments, and if there's no comma after a parameter, we expect +# a colon, not a close parenthesis. (For more, see parameters above.) +# +lambda_parameters[arguments_ty]: + | a=lambda_slash_no_default b=lambda_param_no_default* c=lambda_param_with_default* d=[lambda_star_etc] { + _PyPegen_make_arguments(p, a, NULL, b, c, d) } + | a=lambda_slash_with_default b=lambda_param_with_default* c=[lambda_star_etc] { + _PyPegen_make_arguments(p, NULL, a, NULL, b, c) } + | a=lambda_param_no_default+ b=lambda_param_with_default* c=[lambda_star_etc] { + _PyPegen_make_arguments(p, NULL, NULL, a, b, c) } + | a=lambda_param_with_default+ b=[lambda_star_etc] { _PyPegen_make_arguments(p, NULL, NULL, NULL, a, b)} + | a=lambda_star_etc { _PyPegen_make_arguments(p, NULL, NULL, NULL, NULL, a) } + +lambda_slash_no_default[asdl_seq*]: + | a=lambda_param_no_default+ '/' ',' { a } + | a=lambda_param_no_default+ '/' &':' { a } +lambda_slash_with_default[SlashWithDefault*]: + | a=lambda_param_no_default* b=lambda_param_with_default+ '/' ',' { _PyPegen_slash_with_default(p, a, b) } + | a=lambda_param_no_default* b=lambda_param_with_default+ '/' &':' { _PyPegen_slash_with_default(p, a, b) } + +lambda_star_etc[StarEtc*]: + | '*' a=lambda_param_no_default b=lambda_param_maybe_default* c=[lambda_kwds] { + _PyPegen_star_etc(p, a, b, c) } + | '*' ',' b=lambda_param_maybe_default+ c=[lambda_kwds] { + _PyPegen_star_etc(p, NULL, b, c) } + | a=lambda_kwds { _PyPegen_star_etc(p, NULL, NULL, a) } + | invalid_lambda_star_etc + +lambda_kwds[arg_ty]: '**' a=lambda_param_no_default { a } + +lambda_param_no_default[arg_ty]: + | a=lambda_param ',' { a } + | a=lambda_param &':' { a } +lambda_param_with_default[NameDefaultPair*]: + | a=lambda_param c=default ',' { _PyPegen_name_default_pair(p, a, c, NULL) } + | a=lambda_param c=default &':' { _PyPegen_name_default_pair(p, a, c, NULL) } +lambda_param_maybe_default[NameDefaultPair*]: + | a=lambda_param c=default? ',' { _PyPegen_name_default_pair(p, a, c, NULL) } + | a=lambda_param c=default? &':' { _PyPegen_name_default_pair(p, a, c, NULL) } +lambda_param[arg_ty]: a=NAME { _Py_arg(a->v.Name.id, NULL, NULL, EXTRA) } + +disjunction[expr_ty] (memo): + | a=conjunction b=('or' c=conjunction { c })+ { _Py_BoolOp( + Or, + CHECK(_PyPegen_seq_insert_in_front(p, a, b)), + EXTRA) } + | conjunction +conjunction[expr_ty] (memo): + | a=inversion b=('and' c=inversion { c })+ { _Py_BoolOp( + And, + CHECK(_PyPegen_seq_insert_in_front(p, a, b)), + EXTRA) } + | inversion +inversion[expr_ty] (memo): + | 'not' a=inversion { _Py_UnaryOp(Not, a, EXTRA) } + | comparison +comparison[expr_ty]: + | a=bitwise_or b=compare_op_bitwise_or_pair+ { + _Py_Compare(a, CHECK(_PyPegen_get_cmpops(p, b)), CHECK(_PyPegen_get_exprs(p, b)), EXTRA) } + | bitwise_or +compare_op_bitwise_or_pair[CmpopExprPair*]: + | eq_bitwise_or + | noteq_bitwise_or + | lte_bitwise_or + | lt_bitwise_or + | gte_bitwise_or + | gt_bitwise_or + | notin_bitwise_or + | in_bitwise_or + | isnot_bitwise_or + | is_bitwise_or +eq_bitwise_or[CmpopExprPair*]: '==' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, Eq, a) } +noteq_bitwise_or[CmpopExprPair*]: + | (tok='!=' { _PyPegen_check_barry_as_flufl(p, tok) ? NULL : tok}) a=bitwise_or {_PyPegen_cmpop_expr_pair(p, NotEq, a) } +lte_bitwise_or[CmpopExprPair*]: '<=' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, LtE, a) } +lt_bitwise_or[CmpopExprPair*]: '<' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, Lt, a) } +gte_bitwise_or[CmpopExprPair*]: '>=' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, GtE, a) } +gt_bitwise_or[CmpopExprPair*]: '>' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, Gt, a) } +notin_bitwise_or[CmpopExprPair*]: 'not' 'in' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, NotIn, a) } +in_bitwise_or[CmpopExprPair*]: 'in' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, In, a) } +isnot_bitwise_or[CmpopExprPair*]: 'is' 'not' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, IsNot, a) } +is_bitwise_or[CmpopExprPair*]: 'is' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, Is, a) } + +bitwise_or[expr_ty]: + | a=bitwise_or '|' b=bitwise_xor { _Py_BinOp(a, BitOr, b, EXTRA) } + | bitwise_xor +bitwise_xor[expr_ty]: + | a=bitwise_xor '^' b=bitwise_and { _Py_BinOp(a, BitXor, b, EXTRA) } + | bitwise_and +bitwise_and[expr_ty]: + | a=bitwise_and '&' b=shift_expr { _Py_BinOp(a, BitAnd, b, EXTRA) } + | shift_expr +shift_expr[expr_ty]: + | a=shift_expr '<<' b=sum { _Py_BinOp(a, LShift, b, EXTRA) } + | a=shift_expr '>>' b=sum { _Py_BinOp(a, RShift, b, EXTRA) } + | sum + +sum[expr_ty]: + | a=sum '+' b=term { _Py_BinOp(a, Add, b, EXTRA) } + | a=sum '-' b=term { _Py_BinOp(a, Sub, b, EXTRA) } + | term +term[expr_ty]: + | a=term '*' b=factor { _Py_BinOp(a, Mult, b, EXTRA) } + | a=term '/' b=factor { _Py_BinOp(a, Div, b, EXTRA) } + | a=term '//' b=factor { _Py_BinOp(a, FloorDiv, b, EXTRA) } + | a=term '%' b=factor { _Py_BinOp(a, Mod, b, EXTRA) } + | a=term '@' b=factor { CHECK_VERSION(5, "The '@' operator is", _Py_BinOp(a, MatMult, b, EXTRA)) } + | factor +factor[expr_ty] (memo): + | '+' a=factor { _Py_UnaryOp(UAdd, a, EXTRA) } + | '-' a=factor { _Py_UnaryOp(USub, a, EXTRA) } + | '~' a=factor { _Py_UnaryOp(Invert, a, EXTRA) } + | power +power[expr_ty]: + | a=await_primary '**' b=factor { _Py_BinOp(a, Pow, b, EXTRA) } + | await_primary +await_primary[expr_ty] (memo): + | AWAIT a=primary { CHECK_VERSION(5, "Await expressions are", _Py_Await(a, EXTRA)) } + | primary +primary[expr_ty]: + | invalid_primary # must be before 'primay genexp' because of invalid_genexp + | a=primary '.' b=NAME { _Py_Attribute(a, b->v.Name.id, Load, EXTRA) } + | a=primary b=genexp { _Py_Call(a, CHECK(_PyPegen_singleton_seq(p, b)), NULL, EXTRA) } + | a=primary '(' b=[arguments] ')' { + _Py_Call(a, + (b) ? ((expr_ty) b)->v.Call.args : NULL, + (b) ? ((expr_ty) b)->v.Call.keywords : NULL, + EXTRA) } + | a=primary '[' b=slices ']' { _Py_Subscript(a, b, Load, EXTRA) } + | atom + +slices[expr_ty]: + | a=slice !',' { a } + | a=','.slice+ [','] { _Py_Tuple(a, Load, EXTRA) } +slice[expr_ty]: + | a=[expression] ':' b=[expression] c=[':' d=[expression] { d }] { _Py_Slice(a, b, c, EXTRA) } + | a=expression { a } +atom[expr_ty]: + | NAME + | 'True' { _Py_Constant(Py_True, NULL, EXTRA) } + | 'False' { _Py_Constant(Py_False, NULL, EXTRA) } + | 'None' { _Py_Constant(Py_None, NULL, EXTRA) } + | '__peg_parser__' { RAISE_SYNTAX_ERROR("You found it!") } + | &STRING strings + | NUMBER + | &'(' (tuple | group | genexp) + | &'[' (list | listcomp) + | &'{' (dict | set | dictcomp | setcomp) + | '...' { _Py_Constant(Py_Ellipsis, NULL, EXTRA) } + +strings[expr_ty] (memo): a=STRING+ { _PyPegen_concatenate_strings(p, a) } +list[expr_ty]: + | '[' a=[star_named_expressions] ']' { _Py_List(a, Load, EXTRA) } +listcomp[expr_ty]: + | '[' a=named_expression ~ b=for_if_clauses ']' { _Py_ListComp(a, b, EXTRA) } + | invalid_comprehension +tuple[expr_ty]: + | '(' a=[y=star_named_expression ',' z=[star_named_expressions] { _PyPegen_seq_insert_in_front(p, y, z) } ] ')' { + _Py_Tuple(a, Load, EXTRA) } +group[expr_ty]: + | '(' a=(yield_expr | named_expression) ')' { a } + | invalid_group +genexp[expr_ty]: + | '(' a=named_expression ~ b=for_if_clauses ')' { _Py_GeneratorExp(a, b, EXTRA) } + | invalid_comprehension +set[expr_ty]: '{' a=star_named_expressions '}' { _Py_Set(a, EXTRA) } +setcomp[expr_ty]: + | '{' a=named_expression ~ b=for_if_clauses '}' { _Py_SetComp(a, b, EXTRA) } + | invalid_comprehension +dict[expr_ty]: + | '{' a=[double_starred_kvpairs] '}' { + _Py_Dict(CHECK(_PyPegen_get_keys(p, a)), CHECK(_PyPegen_get_values(p, a)), EXTRA) } +dictcomp[expr_ty]: + | '{' a=kvpair b=for_if_clauses '}' { _Py_DictComp(a->key, a->value, b, EXTRA) } + | invalid_dict_comprehension +double_starred_kvpairs[asdl_seq*]: a=','.double_starred_kvpair+ [','] { a } +double_starred_kvpair[KeyValuePair*]: + | '**' a=bitwise_or { _PyPegen_key_value_pair(p, NULL, a) } + | kvpair +kvpair[KeyValuePair*]: a=expression ':' b=expression { _PyPegen_key_value_pair(p, a, b) } +for_if_clauses[asdl_seq*]: + | for_if_clause+ +for_if_clause[comprehension_ty]: + | ASYNC 'for' a=star_targets 'in' ~ b=disjunction c=('if' z=disjunction { z })* { + CHECK_VERSION(6, "Async comprehensions are", _Py_comprehension(a, b, c, 1, p->arena)) } + | 'for' a=star_targets 'in' ~ b=disjunction c=('if' z=disjunction { z })* { + _Py_comprehension(a, b, c, 0, p->arena) } + | invalid_for_target + +yield_expr[expr_ty]: + | 'yield' 'from' a=expression { _Py_YieldFrom(a, EXTRA) } + | 'yield' a=[star_expressions] { _Py_Yield(a, EXTRA) } + +arguments[expr_ty] (memo): + | a=args [','] &')' { a } + | invalid_arguments +args[expr_ty]: + | a=','.(starred_expression | named_expression !'=')+ b=[',' k=kwargs {k}] { _PyPegen_collect_call_seqs(p, a, b, EXTRA) } + | a=kwargs { _Py_Call(_PyPegen_dummy_name(p), + CHECK_NULL_ALLOWED(_PyPegen_seq_extract_starred_exprs(p, a)), + CHECK_NULL_ALLOWED(_PyPegen_seq_delete_starred_exprs(p, a)), + EXTRA) } +kwargs[asdl_seq*]: + | a=','.kwarg_or_starred+ ',' b=','.kwarg_or_double_starred+ { _PyPegen_join_sequences(p, a, b) } + | ','.kwarg_or_starred+ + | ','.kwarg_or_double_starred+ +starred_expression[expr_ty]: + | '*' a=expression { _Py_Starred(a, Load, EXTRA) } +kwarg_or_starred[KeywordOrStarred*]: + | a=NAME '=' b=expression { + _PyPegen_keyword_or_starred(p, CHECK(_Py_keyword(a->v.Name.id, b, EXTRA)), 1) } + | a=starred_expression { _PyPegen_keyword_or_starred(p, a, 0) } + | invalid_kwarg +kwarg_or_double_starred[KeywordOrStarred*]: + | a=NAME '=' b=expression { + _PyPegen_keyword_or_starred(p, CHECK(_Py_keyword(a->v.Name.id, b, EXTRA)), 1) } + | '**' a=expression { _PyPegen_keyword_or_starred(p, CHECK(_Py_keyword(NULL, a, EXTRA)), 1) } + | invalid_kwarg + +# NOTE: star_targets may contain *bitwise_or, targets may not. +star_targets[expr_ty]: + | a=star_target !',' { a } + | a=star_target b=(',' c=star_target { c })* [','] { + _Py_Tuple(CHECK(_PyPegen_seq_insert_in_front(p, a, b)), Store, EXTRA) } +star_targets_list_seq[asdl_seq*]: a=','.star_target+ [','] { a } +star_targets_tuple_seq[asdl_seq*]: + | a=star_target b=(',' c=star_target { c })+ [','] { _PyPegen_seq_insert_in_front(p, a, b) } + | a=star_target ',' { _PyPegen_singleton_seq(p, a) } +star_target[expr_ty] (memo): + | '*' a=(!'*' star_target) { + _Py_Starred(CHECK(_PyPegen_set_expr_context(p, a, Store)), Store, EXTRA) } + | target_with_star_atom +target_with_star_atom[expr_ty] (memo): + | a=t_primary '.' b=NAME !t_lookahead { _Py_Attribute(a, b->v.Name.id, Store, EXTRA) } + | a=t_primary '[' b=slices ']' !t_lookahead { _Py_Subscript(a, b, Store, EXTRA) } + | star_atom +star_atom[expr_ty]: + | a=NAME { _PyPegen_set_expr_context(p, a, Store) } + | '(' a=target_with_star_atom ')' { _PyPegen_set_expr_context(p, a, Store) } + | '(' a=[star_targets_tuple_seq] ')' { _Py_Tuple(a, Store, EXTRA) } + | '[' a=[star_targets_list_seq] ']' { _Py_List(a, Store, EXTRA) } + +single_target[expr_ty]: + | single_subscript_attribute_target + | a=NAME { _PyPegen_set_expr_context(p, a, Store) } + | '(' a=single_target ')' { a } +single_subscript_attribute_target[expr_ty]: + | a=t_primary '.' b=NAME !t_lookahead { _Py_Attribute(a, b->v.Name.id, Store, EXTRA) } + | a=t_primary '[' b=slices ']' !t_lookahead { _Py_Subscript(a, b, Store, EXTRA) } + +del_targets[asdl_seq*]: a=','.del_target+ [','] { a } +del_target[expr_ty] (memo): + | a=t_primary '.' b=NAME !t_lookahead { _Py_Attribute(a, b->v.Name.id, Del, EXTRA) } + | a=t_primary '[' b=slices ']' !t_lookahead { _Py_Subscript(a, b, Del, EXTRA) } + | del_t_atom +del_t_atom[expr_ty]: + | a=NAME { _PyPegen_set_expr_context(p, a, Del) } + | '(' a=del_target ')' { _PyPegen_set_expr_context(p, a, Del) } + | '(' a=[del_targets] ')' { _Py_Tuple(a, Del, EXTRA) } + | '[' a=[del_targets] ']' { _Py_List(a, Del, EXTRA) } + +targets[asdl_seq*]: a=','.target+ [','] { a } +target[expr_ty] (memo): + | a=t_primary '.' b=NAME !t_lookahead { _Py_Attribute(a, b->v.Name.id, Store, EXTRA) } + | a=t_primary '[' b=slices ']' !t_lookahead { _Py_Subscript(a, b, Store, EXTRA) } + | t_atom +t_primary[expr_ty]: + | a=t_primary '.' b=NAME &t_lookahead { _Py_Attribute(a, b->v.Name.id, Load, EXTRA) } + | a=t_primary '[' b=slices ']' &t_lookahead { _Py_Subscript(a, b, Load, EXTRA) } + | a=t_primary b=genexp &t_lookahead { _Py_Call(a, CHECK(_PyPegen_singleton_seq(p, b)), NULL, EXTRA) } + | a=t_primary '(' b=[arguments] ')' &t_lookahead { + _Py_Call(a, + (b) ? ((expr_ty) b)->v.Call.args : NULL, + (b) ? ((expr_ty) b)->v.Call.keywords : NULL, + EXTRA) } + | a=atom &t_lookahead { a } +t_lookahead: '(' | '[' | '.' +t_atom[expr_ty]: + | a=NAME { _PyPegen_set_expr_context(p, a, Store) } + | '(' a=target ')' { _PyPegen_set_expr_context(p, a, Store) } + | '(' b=[targets] ')' { _Py_Tuple(b, Store, EXTRA) } + | '[' b=[targets] ']' { _Py_List(b, Store, EXTRA) } + + +# From here on, there are rules for invalid syntax with specialised error messages +invalid_arguments: + | args ',' '*' { RAISE_SYNTAX_ERROR("iterable argument unpacking follows keyword argument unpacking") } + | a=expression for_if_clauses ',' [args | expression for_if_clauses] { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "Generator expression must be parenthesized") } + | a=args for_if_clauses { _PyPegen_nonparen_genexp_in_call(p, a) } + | args ',' a=expression for_if_clauses { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "Generator expression must be parenthesized") } + | a=args ',' args { _PyPegen_arguments_parsing_error(p, a) } +invalid_kwarg: + | a=expression '=' { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION( + a, "expression cannot contain assignment, perhaps you meant \"==\"?") } +invalid_named_expression: + | a=expression ':=' expression { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION( + a, "cannot use assignment expressions with %s", _PyPegen_get_expr_name(a)) } +invalid_assignment: + | a=invalid_ann_assign_target ':' expression { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION( + a, + "only single target (not %s) can be annotated", + _PyPegen_get_expr_name(a) + )} + | a=star_named_expression ',' star_named_expressions* ':' expression { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "only single target (not tuple) can be annotated") } + | a=expression ':' expression { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "illegal target for annotation") } + | (star_targets '=')* a=star_expressions '=' { + RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) } + | (star_targets '=')* a=yield_expr '=' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "assignment to yield expression not possible") } + | a=star_expressions augassign (yield_expr | star_expressions) { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION( + a, + "'%s' is an illegal expression for augmented assignment", + _PyPegen_get_expr_name(a) + )} +invalid_ann_assign_target[expr_ty]: + | list + | tuple + | '(' a=invalid_ann_assign_target ')' { a } +invalid_del_stmt: + | 'del' a=star_expressions { + RAISE_SYNTAX_ERROR_INVALID_TARGET(DEL_TARGETS, a) } +invalid_block: + | NEWLINE !INDENT { RAISE_INDENTATION_ERROR("expected an indented block") } +invalid_primary: + | primary a='{' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "invalid syntax") } +invalid_comprehension: + | ('[' | '(' | '{') a=starred_expression for_if_clauses { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "iterable unpacking cannot be used in comprehension") } +invalid_dict_comprehension: + | '{' a='**' bitwise_or for_if_clauses '}' { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "dict unpacking cannot be used in dict comprehension") } +invalid_parameters: + | param_no_default* (slash_with_default | param_with_default+) param_no_default { + RAISE_SYNTAX_ERROR("non-default argument follows default argument") } +invalid_lambda_parameters: + | lambda_param_no_default* (lambda_slash_with_default | lambda_param_with_default+) lambda_param_no_default { + RAISE_SYNTAX_ERROR("non-default argument follows default argument") } +invalid_star_etc: + | '*' (')' | ',' (')' | '**')) { RAISE_SYNTAX_ERROR("named arguments must follow bare *") } + | '*' ',' TYPE_COMMENT { RAISE_SYNTAX_ERROR("bare * has associated type comment") } +invalid_lambda_star_etc: + | '*' (':' | ',' (':' | '**')) { RAISE_SYNTAX_ERROR("named arguments must follow bare *") } +invalid_double_type_comments: + | TYPE_COMMENT NEWLINE TYPE_COMMENT NEWLINE INDENT { + RAISE_SYNTAX_ERROR("Cannot have two type comments on def") } +invalid_with_item: + | expression 'as' a=expression { + RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) } + +invalid_for_target: + | ASYNC? 'for' a=star_expressions { + RAISE_SYNTAX_ERROR_INVALID_TARGET(FOR_TARGETS, a) } + +invalid_group: + | '(' a=starred_expression ')' { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "can't use starred expression here") } +invalid_import_from_targets: + | import_from_as_names ',' { + RAISE_SYNTAX_ERROR("trailing comma not allowed without surrounding parentheses") } diff --git a/Include/Python-ast.h b/Include/Python-ast.h index 5fe4f2b4314c6991a49289f0a8511cad8513746b..e7afa1e6579e8d4c98fee8c4d05cfb4249779a98 100644 --- a/Include/Python-ast.h +++ b/Include/Python-ast.h @@ -6,6 +6,7 @@ extern "C" { #endif +#ifndef Py_LIMITED_API #include "asdl.h" #undef Yield /* undefine macro conflicting with */ @@ -16,10 +17,7 @@ typedef struct _stmt *stmt_ty; typedef struct _expr *expr_ty; -typedef enum _expr_context { Load=1, Store=2, Del=3, AugLoad=4, AugStore=5, - Param=6 } expr_context_ty; - -typedef struct _slice *slice_ty; +typedef enum _expr_context { Load=1, Store=2, Del=3 } expr_context_ty; typedef enum _boolop { And=1, Or=2 } boolop_ty; @@ -50,7 +48,7 @@ typedef struct _type_ignore *type_ignore_ty; enum _mod_kind {Module_kind=1, Interactive_kind=2, Expression_kind=3, - FunctionType_kind=4, Suite_kind=5}; + FunctionType_kind=4}; struct _mod { enum _mod_kind kind; union { @@ -72,10 +70,6 @@ struct _mod { expr_ty returns; } FunctionType; - struct { - asdl_seq *body; - } Suite; - } v; }; @@ -236,7 +230,7 @@ enum _expr_kind {BoolOp_kind=1, NamedExpr_kind=2, BinOp_kind=3, UnaryOp_kind=4, YieldFrom_kind=15, Compare_kind=16, Call_kind=17, FormattedValue_kind=18, JoinedStr_kind=19, Constant_kind=20, Attribute_kind=21, Subscript_kind=22, Starred_kind=23, - Name_kind=24, List_kind=25, Tuple_kind=26}; + Name_kind=24, List_kind=25, Tuple_kind=26, Slice_kind=27}; struct _expr { enum _expr_kind kind; union { @@ -349,7 +343,7 @@ struct _expr { struct { expr_ty value; - slice_ty slice; + expr_ty slice; expr_context_ty ctx; } Subscript; @@ -373,32 +367,17 @@ struct _expr { expr_context_ty ctx; } Tuple; - } v; - int lineno; - int col_offset; - int end_lineno; - int end_col_offset; -}; - -enum _slice_kind {Slice_kind=1, ExtSlice_kind=2, Index_kind=3}; -struct _slice { - enum _slice_kind kind; - union { struct { expr_ty lower; expr_ty upper; expr_ty step; } Slice; - struct { - asdl_seq *dims; - } ExtSlice; - - struct { - expr_ty value; - } Index; - } v; + int lineno; + int col_offset; + int end_lineno; + int end_col_offset; }; struct _comprehension { @@ -448,6 +427,10 @@ struct _arg { struct _keyword { identifier arg; expr_ty value; + int lineno; + int col_offset; + int end_lineno; + int end_col_offset; }; struct _alias { @@ -482,8 +465,6 @@ mod_ty _Py_Interactive(asdl_seq * body, PyArena *arena); mod_ty _Py_Expression(expr_ty body, PyArena *arena); #define FunctionType(a0, a1, a2) _Py_FunctionType(a0, a1, a2) mod_ty _Py_FunctionType(asdl_seq * argtypes, expr_ty returns, PyArena *arena); -#define Suite(a0, a1) _Py_Suite(a0, a1) -mod_ty _Py_Suite(asdl_seq * body, PyArena *arena); #define FunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) _Py_FunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) stmt_ty _Py_FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq * decorator_list, expr_ty returns, string @@ -653,7 +634,7 @@ expr_ty _Py_Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define Subscript(a0, a1, a2, a3, a4, a5, a6, a7) _Py_Subscript(a0, a1, a2, a3, a4, a5, a6, a7) -expr_ty _Py_Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int +expr_ty _Py_Subscript(expr_ty value, expr_ty slice, expr_context_ty ctx, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); #define Starred(a0, a1, a2, a3, a4, a5, a6) _Py_Starred(a0, a1, a2, a3, a4, a5, a6) @@ -672,12 +653,10 @@ expr_ty _Py_List(asdl_seq * elts, expr_context_ty ctx, int lineno, int expr_ty _Py_Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); -#define Slice(a0, a1, a2, a3) _Py_Slice(a0, a1, a2, a3) -slice_ty _Py_Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena); -#define ExtSlice(a0, a1) _Py_ExtSlice(a0, a1) -slice_ty _Py_ExtSlice(asdl_seq * dims, PyArena *arena); -#define Index(a0, a1) _Py_Index(a0, a1) -slice_ty _Py_Index(expr_ty value, PyArena *arena); +#define Slice(a0, a1, a2, a3, a4, a5, a6, a7) _Py_Slice(a0, a1, a2, a3, a4, a5, a6, a7) +expr_ty _Py_Slice(expr_ty lower, expr_ty upper, expr_ty step, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena + *arena); #define comprehension(a0, a1, a2, a3, a4) _Py_comprehension(a0, a1, a2, a3, a4) comprehension_ty _Py_comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, int is_async, PyArena *arena); @@ -695,8 +674,10 @@ arguments_ty _Py_arguments(asdl_seq * posonlyargs, asdl_seq * args, arg_ty arg_ty _Py_arg(identifier arg, expr_ty annotation, string type_comment, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); -#define keyword(a0, a1, a2) _Py_keyword(a0, a1, a2) -keyword_ty _Py_keyword(identifier arg, expr_ty value, PyArena *arena); +#define keyword(a0, a1, a2, a3, a4, a5, a6) _Py_keyword(a0, a1, a2, a3, a4, a5, a6) +keyword_ty _Py_keyword(identifier arg, expr_ty value, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena + *arena); #define alias(a0, a1, a2) _Py_alias(a0, a1, a2) alias_ty _Py_alias(identifier name, identifier asname, PyArena *arena); #define withitem(a0, a1, a2) _Py_withitem(a0, a1, a2) @@ -708,6 +689,7 @@ type_ignore_ty _Py_TypeIgnore(int lineno, string tag, PyArena *arena); PyObject* PyAST_mod2obj(mod_ty t); mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode); int PyAST_Check(PyObject* obj); +#endif /* !Py_LIMITED_API */ #ifdef __cplusplus } diff --git a/Include/Python.h b/Include/Python.h index d6e5b139ac67964e8457bfd57304157b0eabafb3..dcd0a57ac1f03f939365ef7c0e4c45105c085f9f 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -114,12 +114,15 @@ #include "classobject.h" #include "fileobject.h" #include "pycapsule.h" +#include "code.h" +#include "pyframe.h" #include "traceback.h" #include "sliceobject.h" #include "cellobject.h" #include "iterobject.h" #include "genobject.h" #include "descrobject.h" +#include "genericaliasobject.h" #include "warnings.h" #include "weakrefobject.h" #include "structseq.h" @@ -130,6 +133,7 @@ #include "pyerrors.h" #include "cpython/initconfig.h" +#include "pythread.h" #include "pystate.h" #include "context.h" @@ -152,7 +156,6 @@ #include "pyctype.h" #include "pystrtod.h" #include "pystrcmp.h" -#include "dtoa.h" #include "fileutils.h" #include "pyfpe.h" #include "tracemalloc.h" diff --git a/Include/abstract.h b/Include/abstract.h index 777fd7077c2d6520cd97473dbc0874359084824a..bb51c668ac69837da363572bbc78548df4188c97 100644 --- a/Include/abstract.h +++ b/Include/abstract.h @@ -141,6 +141,12 @@ extern "C" { #endif +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000 +/* Call a callable Python object without any arguments */ +PyAPI_FUNC(PyObject *) PyObject_CallNoArgs(PyObject *func); +#endif + + /* Call a callable Python object 'callable' with arguments given by the tuple 'args' and keywords arguments given by the dictionary 'kwargs'. @@ -696,7 +702,7 @@ PyAPI_FUNC(PyObject *) PySequence_Fast(PyObject *o, const char* m); (PyList_Check(o) ? PyList_GET_ITEM(o, i) : PyTuple_GET_ITEM(o, i)) /* Return a pointer to the underlying item array for - an object retured by PySequence_Fast */ + an object returned by PySequence_Fast */ #define PySequence_Fast_ITEMS(sf) \ (PyList_Check(sf) ? ((PyListObject *)(sf))->ob_item \ : ((PyTupleObject *)(sf))->ob_item) diff --git a/Include/asdl.h b/Include/asdl.h index fc6d22371b63fac2c99840083c4a088ba354eab4..e962560bcd4cbef2167bfe5e8d4beb9ff87a3911 100644 --- a/Include/asdl.h +++ b/Include/asdl.h @@ -1,11 +1,10 @@ +#ifndef Py_LIMITED_API #ifndef Py_ASDL_H #define Py_ASDL_H typedef PyObject * identifier; typedef PyObject * string; -typedef PyObject * bytes; typedef PyObject * object; -typedef PyObject * singleton; typedef PyObject * constant; /* It would be nice if the code generated by asdl_c.py was completely @@ -44,3 +43,4 @@ asdl_int_seq *_Py_asdl_int_seq_new(Py_ssize_t size, PyArena *arena); #endif #endif /* !Py_ASDL_H */ +#endif /* Py_LIMITED_API */ diff --git a/Include/ast.h b/Include/ast.h index f1d734852eca79ffb0ebf213751461c8ec54d64d..a8c52af786b1472200b9b3651462f8101f2d8e0a 100644 --- a/Include/ast.h +++ b/Include/ast.h @@ -1,3 +1,4 @@ +#ifndef Py_LIMITED_API #ifndef Py_AST_H #define Py_AST_H #ifdef __cplusplus @@ -19,19 +20,16 @@ PyAPI_FUNC(mod_ty) PyAST_FromNodeObject( PyObject *filename, PyArena *arena); -#ifndef Py_LIMITED_API - /* _PyAST_ExprAsUnicode is defined in ast_unparse.c */ PyAPI_FUNC(PyObject *) _PyAST_ExprAsUnicode(expr_ty); /* Return the borrowed reference to the first literal string in the - sequence of statemnts or NULL if it doesn't start from a literal string. + sequence of statements or NULL if it doesn't start from a literal string. Doesn't set exception. */ PyAPI_FUNC(PyObject *) _PyAST_GetDocString(asdl_seq *); -#endif /* !Py_LIMITED_API */ - #ifdef __cplusplus } #endif #endif /* !Py_AST_H */ +#endif /* !Py_LIMITED_API */ diff --git a/Include/boolobject.h b/Include/boolobject.h index 7cc2f1fe23937acbca1ac7c2f3e4654395214b1b..bb8044a2b02cf6ddb55be24d96ba80e72b7a49bd 100644 --- a/Include/boolobject.h +++ b/Include/boolobject.h @@ -9,7 +9,7 @@ extern "C" { PyAPI_DATA(PyTypeObject) PyBool_Type; -#define PyBool_Check(x) (Py_TYPE(x) == &PyBool_Type) +#define PyBool_Check(x) Py_IS_TYPE(x, &PyBool_Type) /* Py_False and Py_True are the only two bools in existence. Don't forget to apply Py_INCREF() when returning either!!! */ diff --git a/Include/bytearrayobject.h b/Include/bytearrayobject.h index a757b880592979fe8f2496f32b95868273a71b1a..9e95433f0f26f0b319c1bf5c1c469a0e089a31f2 100644 --- a/Include/bytearrayobject.h +++ b/Include/bytearrayobject.h @@ -18,25 +18,13 @@ extern "C" { * to contain a char pointer, not an unsigned char pointer. */ -/* Object layout */ -#ifndef Py_LIMITED_API -typedef struct { - PyObject_VAR_HEAD - Py_ssize_t ob_alloc; /* How many bytes allocated in ob_bytes */ - char *ob_bytes; /* Physical backing buffer */ - char *ob_start; /* Logical start inside ob_bytes */ - /* XXX(nnorwitz): should ob_exports be Py_ssize_t? */ - int ob_exports; /* How many buffer exports */ -} PyByteArrayObject; -#endif - /* Type object */ PyAPI_DATA(PyTypeObject) PyByteArray_Type; PyAPI_DATA(PyTypeObject) PyByteArrayIter_Type; /* Type check macros */ #define PyByteArray_Check(self) PyObject_TypeCheck(self, &PyByteArray_Type) -#define PyByteArray_CheckExact(self) (Py_TYPE(self) == &PyByteArray_Type) +#define PyByteArray_CheckExact(self) Py_IS_TYPE(self, &PyByteArray_Type) /* Direct API functions */ PyAPI_FUNC(PyObject *) PyByteArray_FromObject(PyObject *); @@ -46,14 +34,10 @@ PyAPI_FUNC(Py_ssize_t) PyByteArray_Size(PyObject *); PyAPI_FUNC(char *) PyByteArray_AsString(PyObject *); PyAPI_FUNC(int) PyByteArray_Resize(PyObject *, Py_ssize_t); -/* Macros, trading safety for speed */ #ifndef Py_LIMITED_API -#define PyByteArray_AS_STRING(self) \ - (assert(PyByteArray_Check(self)), \ - Py_SIZE(self) ? ((PyByteArrayObject *)(self))->ob_start : _PyByteArray_empty_string) -#define PyByteArray_GET_SIZE(self) (assert(PyByteArray_Check(self)), Py_SIZE(self)) - -PyAPI_DATA(char) _PyByteArray_empty_string[]; +# define Py_CPYTHON_BYTEARRAYOBJECT_H +# include "cpython/bytearrayobject.h" +# undef Py_CPYTHON_BYTEARRAYOBJECT_H #endif #ifdef __cplusplus diff --git a/Include/bytesobject.h b/Include/bytesobject.h index 3fde4a221fdb18b5e50e5eb3936675f553ed00ea..5062d8d123ad3e6bdca0311ff821dc3134ea04a2 100644 --- a/Include/bytesobject.h +++ b/Include/bytesobject.h @@ -27,26 +27,12 @@ functions should be applied to nil objects. /* Caching the hash (ob_shash) saves recalculation of a string's hash value. This significantly speeds up dict lookups. */ -#ifndef Py_LIMITED_API -typedef struct { - PyObject_VAR_HEAD - Py_hash_t ob_shash; - char ob_sval[1]; - - /* Invariants: - * ob_sval contains space for 'ob_size+1' elements. - * ob_sval[ob_size] == 0. - * ob_shash is the hash of the string or -1 if not computed yet. - */ -} PyBytesObject; -#endif - PyAPI_DATA(PyTypeObject) PyBytes_Type; PyAPI_DATA(PyTypeObject) PyBytesIter_Type; #define PyBytes_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_BYTES_SUBCLASS) -#define PyBytes_CheckExact(op) (Py_TYPE(op) == &PyBytes_Type) +#define PyBytes_CheckExact(op) Py_IS_TYPE(op, &PyBytes_Type) PyAPI_FUNC(PyObject *) PyBytes_FromStringAndSize(const char *, Py_ssize_t); PyAPI_FUNC(PyObject *) PyBytes_FromString(const char *); @@ -60,40 +46,9 @@ PyAPI_FUNC(char *) PyBytes_AsString(PyObject *); PyAPI_FUNC(PyObject *) PyBytes_Repr(PyObject *, int); PyAPI_FUNC(void) PyBytes_Concat(PyObject **, PyObject *); PyAPI_FUNC(void) PyBytes_ConcatAndDel(PyObject **, PyObject *); -#ifndef Py_LIMITED_API -PyAPI_FUNC(int) _PyBytes_Resize(PyObject **, Py_ssize_t); -PyAPI_FUNC(PyObject*) _PyBytes_FormatEx( - const char *format, - Py_ssize_t format_len, - PyObject *args, - int use_bytearray); -PyAPI_FUNC(PyObject*) _PyBytes_FromHex( - PyObject *string, - int use_bytearray); -#endif PyAPI_FUNC(PyObject *) PyBytes_DecodeEscape(const char *, Py_ssize_t, const char *, Py_ssize_t, const char *); -#ifndef Py_LIMITED_API -/* Helper for PyBytes_DecodeEscape that detects invalid escape chars. */ -PyAPI_FUNC(PyObject *) _PyBytes_DecodeEscape(const char *, Py_ssize_t, - const char *, Py_ssize_t, - const char *, - const char **); -#endif - -/* Macro, trading safety for speed */ -#ifndef Py_LIMITED_API -#define PyBytes_AS_STRING(op) (assert(PyBytes_Check(op)), \ - (((PyBytesObject *)(op))->ob_sval)) -#define PyBytes_GET_SIZE(op) (assert(PyBytes_Check(op)),Py_SIZE(op)) -#endif - -/* _PyBytes_Join(sep, x) is like sep.join(x). sep must be PyBytesObject*, - x must be an iterable object. */ -#ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _PyBytes_Join(PyObject *sep, PyObject *x); -#endif /* Provides access to the internal data buffer and size of a string object or the default encoded version of a Unicode object. Passing @@ -108,28 +63,6 @@ PyAPI_FUNC(int) PyBytes_AsStringAndSize( strings) */ ); -/* Using the current locale, insert the thousands grouping - into the string pointed to by buffer. For the argument descriptions, - see Objects/stringlib/localeutil.h */ -#ifndef Py_LIMITED_API -PyAPI_FUNC(Py_ssize_t) _PyBytes_InsertThousandsGroupingLocale(char *buffer, - Py_ssize_t n_buffer, - char *digits, - Py_ssize_t n_digits, - Py_ssize_t min_width); - -/* Using explicit passed-in values, insert the thousands grouping - into the string pointed to by buffer. For the argument descriptions, - see Objects/stringlib/localeutil.h */ -PyAPI_FUNC(Py_ssize_t) _PyBytes_InsertThousandsGrouping(char *buffer, - Py_ssize_t n_buffer, - char *digits, - Py_ssize_t n_digits, - Py_ssize_t min_width, - const char *grouping, - const char *thousands_sep); -#endif - /* Flags used by string formatting */ #define F_LJUST (1<<0) #define F_SIGN (1<<1) @@ -138,85 +71,10 @@ PyAPI_FUNC(Py_ssize_t) _PyBytes_InsertThousandsGrouping(char *buffer, #define F_ZERO (1<<4) #ifndef Py_LIMITED_API -/* The _PyBytesWriter structure is big: it contains an embedded "stack buffer". - A _PyBytesWriter variable must be declared at the end of variables in a - function to optimize the memory allocation on the stack. */ -typedef struct { - /* bytes, bytearray or NULL (when the small buffer is used) */ - PyObject *buffer; - - /* Number of allocated size. */ - Py_ssize_t allocated; - - /* Minimum number of allocated bytes, - incremented by _PyBytesWriter_Prepare() */ - Py_ssize_t min_size; - - /* If non-zero, use a bytearray instead of a bytes object for buffer. */ - int use_bytearray; - - /* If non-zero, overallocate the buffer (default: 0). - This flag must be zero if use_bytearray is non-zero. */ - int overallocate; - - /* Stack buffer */ - int use_small_buffer; - char small_buffer[512]; -} _PyBytesWriter; - -/* Initialize a bytes writer - - By default, the overallocation is disabled. Set the overallocate attribute - to control the allocation of the buffer. */ -PyAPI_FUNC(void) _PyBytesWriter_Init(_PyBytesWriter *writer); - -/* Get the buffer content and reset the writer. - Return a bytes object, or a bytearray object if use_bytearray is non-zero. - Raise an exception and return NULL on error. */ -PyAPI_FUNC(PyObject *) _PyBytesWriter_Finish(_PyBytesWriter *writer, - void *str); - -/* Deallocate memory of a writer (clear its internal buffer). */ -PyAPI_FUNC(void) _PyBytesWriter_Dealloc(_PyBytesWriter *writer); - -/* Allocate the buffer to write size bytes. - Return the pointer to the beginning of buffer data. - Raise an exception and return NULL on error. */ -PyAPI_FUNC(void*) _PyBytesWriter_Alloc(_PyBytesWriter *writer, - Py_ssize_t size); - -/* Ensure that the buffer is large enough to write *size* bytes. - Add size to the writer minimum size (min_size attribute). - - str is the current pointer inside the buffer. - Return the updated current pointer inside the buffer. - Raise an exception and return NULL on error. */ -PyAPI_FUNC(void*) _PyBytesWriter_Prepare(_PyBytesWriter *writer, - void *str, - Py_ssize_t size); - -/* Resize the buffer to make it larger. - The new buffer may be larger than size bytes because of overallocation. - Return the updated current pointer inside the buffer. - Raise an exception and return NULL on error. - - Note: size must be greater than the number of allocated bytes in the writer. - - This function doesn't use the writer minimum size (min_size attribute). - - See also _PyBytesWriter_Prepare(). - */ -PyAPI_FUNC(void*) _PyBytesWriter_Resize(_PyBytesWriter *writer, - void *str, - Py_ssize_t size); - -/* Write bytes. - Raise an exception and return NULL on error. */ -PyAPI_FUNC(void*) _PyBytesWriter_WriteBytes(_PyBytesWriter *writer, - void *str, - const void *bytes, - Py_ssize_t size); -#endif /* Py_LIMITED_API */ +# define Py_CPYTHON_BYTESOBJECT_H +# include "cpython/bytesobject.h" +# undef Py_CPYTHON_BYTESOBJECT_H +#endif #ifdef __cplusplus } diff --git a/Include/cellobject.h b/Include/cellobject.h index 2f9b5b75d998aeda50113fe4b62849fdcf4714e6..f12aa90a42a8fe9f4d74b4b235d66a8e112ebeff 100644 --- a/Include/cellobject.h +++ b/Include/cellobject.h @@ -13,7 +13,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyCell_Type; -#define PyCell_Check(op) (Py_TYPE(op) == &PyCell_Type) +#define PyCell_Check(op) Py_IS_TYPE(op, &PyCell_Type) PyAPI_FUNC(PyObject *) PyCell_New(PyObject *); PyAPI_FUNC(PyObject *) PyCell_Get(PyObject *); diff --git a/Include/ceval.h b/Include/ceval.h index 36fd014a91a7dd26c6d0071fa20db0a4ded241ec..0f372e2044a1c8ab4ba600331107b4f2dfcd2d14 100644 --- a/Include/ceval.h +++ b/Include/ceval.h @@ -8,52 +8,30 @@ extern "C" { /* Interface to random parts in ceval.c */ /* PyEval_CallObjectWithKeywords(), PyEval_CallObject(), PyEval_CallFunction - * and PyEval_CallMethod are kept for backward compatibility: PyObject_Call(), - * PyObject_CallFunction() and PyObject_CallMethod() are recommended to call - * a callable object. + * and PyEval_CallMethod are deprecated. Since they are officially part of the + * stable ABI (PEP 384), they must be kept for backward compatibility. + * PyObject_Call(), PyObject_CallFunction() and PyObject_CallMethod() are + * recommended to call a callable object. */ -PyAPI_FUNC(PyObject *) PyEval_CallObjectWithKeywords( +Py_DEPRECATED(3.9) PyAPI_FUNC(PyObject *) PyEval_CallObjectWithKeywords( PyObject *callable, PyObject *args, PyObject *kwargs); -/* Inline this */ +/* Deprecated since PyEval_CallObjectWithKeywords is deprecated */ #define PyEval_CallObject(callable, arg) \ PyEval_CallObjectWithKeywords(callable, arg, (PyObject *)NULL) -PyAPI_FUNC(PyObject *) PyEval_CallFunction(PyObject *callable, - const char *format, ...); -PyAPI_FUNC(PyObject *) PyEval_CallMethod(PyObject *obj, - const char *name, - const char *format, ...); - -#ifndef Py_LIMITED_API -PyAPI_FUNC(void) PyEval_SetProfile(Py_tracefunc, PyObject *); -PyAPI_FUNC(void) PyEval_SetTrace(Py_tracefunc, PyObject *); -PyAPI_FUNC(void) _PyEval_SetCoroutineOriginTrackingDepth(int new_depth); -PyAPI_FUNC(int) _PyEval_GetCoroutineOriginTrackingDepth(void); -PyAPI_FUNC(void) _PyEval_SetAsyncGenFirstiter(PyObject *); -PyAPI_FUNC(PyObject *) _PyEval_GetAsyncGenFirstiter(void); -PyAPI_FUNC(void) _PyEval_SetAsyncGenFinalizer(PyObject *); -PyAPI_FUNC(PyObject *) _PyEval_GetAsyncGenFinalizer(void); -#endif - -struct _frame; /* Avoid including frameobject.h */ +Py_DEPRECATED(3.9) PyAPI_FUNC(PyObject *) PyEval_CallFunction( + PyObject *callable, const char *format, ...); +Py_DEPRECATED(3.9) PyAPI_FUNC(PyObject *) PyEval_CallMethod( + PyObject *obj, const char *name, const char *format, ...); PyAPI_FUNC(PyObject *) PyEval_GetBuiltins(void); PyAPI_FUNC(PyObject *) PyEval_GetGlobals(void); PyAPI_FUNC(PyObject *) PyEval_GetLocals(void); -PyAPI_FUNC(struct _frame *) PyEval_GetFrame(void); - -#ifndef Py_LIMITED_API -/* Helper to look up a builtin object */ -PyAPI_FUNC(PyObject *) _PyEval_GetBuiltinId(_Py_Identifier *); -/* Look at the current frame's (if any) code's co_flags, and turn on - the corresponding compiler flags in cf->cf_flags. Return 1 if any - flag was set, else return 0. */ -PyAPI_FUNC(int) PyEval_MergeCompilerFlags(PyCompilerFlags *cf); -#endif +PyAPI_FUNC(PyFrameObject *) PyEval_GetFrame(void); PyAPI_FUNC(int) Py_AddPendingCall(int (*func)(void *), void *arg); PyAPI_FUNC(int) Py_MakePendingCalls(void); @@ -86,41 +64,8 @@ PyAPI_FUNC(int) Py_MakePendingCalls(void); PyAPI_FUNC(void) Py_SetRecursionLimit(int); PyAPI_FUNC(int) Py_GetRecursionLimit(void); -#define Py_EnterRecursiveCall(where) \ - (_Py_MakeRecCheck(PyThreadState_GET()->recursion_depth) && \ - _Py_CheckRecursiveCall(where)) -#define Py_LeaveRecursiveCall() \ - do{ if(_Py_MakeEndRecCheck(PyThreadState_GET()->recursion_depth)) \ - PyThreadState_GET()->overflowed = 0; \ - } while(0) -PyAPI_FUNC(int) _Py_CheckRecursiveCall(const char *where); - -/* Due to the macros in which it's used, _Py_CheckRecursionLimit is in - the stable ABI. It should be removed therefrom when possible. -*/ -PyAPI_DATA(int) _Py_CheckRecursionLimit; - -#ifdef USE_STACKCHECK -/* With USE_STACKCHECK, trigger stack checks in _Py_CheckRecursiveCall() - on every 64th call to Py_EnterRecursiveCall. -*/ -# define _Py_MakeRecCheck(x) \ - (++(x) > _Py_CheckRecursionLimit || \ - ++(PyThreadState_GET()->stackcheck_counter) > 64) -#else -# define _Py_MakeRecCheck(x) (++(x) > _Py_CheckRecursionLimit) -#endif - -/* Compute the "lower-water mark" for a recursion limit. When - * Py_LeaveRecursiveCall() is called with a recursion depth below this mark, - * the overflowed flag is reset to 0. */ -#define _Py_RecursionLimitLowerWaterMark(limit) \ - (((limit) > 200) \ - ? ((limit) - 50) \ - : (3 * ((limit) >> 2))) - -#define _Py_MakeEndRecCheck(x) \ - (--(x) < _Py_RecursionLimitLowerWaterMark(_Py_CheckRecursionLimit)) +PyAPI_FUNC(int) Py_EnterRecursiveCall(const char *where); +PyAPI_FUNC(void) Py_LeaveRecursiveCall(void); #define Py_ALLOW_RECURSION \ do { unsigned char _old = PyThreadState_GET()->recursion_critical;\ @@ -133,11 +78,8 @@ PyAPI_DATA(int) _Py_CheckRecursionLimit; PyAPI_FUNC(const char *) PyEval_GetFuncName(PyObject *); PyAPI_FUNC(const char *) PyEval_GetFuncDesc(PyObject *); -PyAPI_FUNC(PyObject *) PyEval_EvalFrame(struct _frame *); -PyAPI_FUNC(PyObject *) PyEval_EvalFrameEx(struct _frame *f, int exc); -#ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _PyEval_EvalFrameDefault(struct _frame *f, int exc); -#endif +PyAPI_FUNC(PyObject *) PyEval_EvalFrame(PyFrameObject *); +PyAPI_FUNC(PyObject *) PyEval_EvalFrameEx(PyFrameObject *f, int exc); /* Interface for threads. @@ -177,9 +119,6 @@ PyAPI_FUNC(PyObject *) _PyEval_EvalFrameDefault(struct _frame *f, int exc); WARNING: NEVER NEST CALLS TO Py_BEGIN_ALLOW_THREADS AND Py_END_ALLOW_THREADS!!! - The function PyEval_InitThreads() should be called only from - init_thread() in "_threadmodule.c". - Note that not yet all candidates have been converted to use this mechanism! */ @@ -187,22 +126,17 @@ PyAPI_FUNC(PyObject *) _PyEval_EvalFrameDefault(struct _frame *f, int exc); PyAPI_FUNC(PyThreadState *) PyEval_SaveThread(void); PyAPI_FUNC(void) PyEval_RestoreThread(PyThreadState *); -PyAPI_FUNC(int) PyEval_ThreadsInitialized(void); -PyAPI_FUNC(void) PyEval_InitThreads(void); +Py_DEPRECATED(3.9) PyAPI_FUNC(int) PyEval_ThreadsInitialized(void); +Py_DEPRECATED(3.9) PyAPI_FUNC(void) PyEval_InitThreads(void); +/* PyEval_AcquireLock() and PyEval_ReleaseLock() are part of stable ABI. + * They will be removed from this header file in the future version. + * But they will be remained in ABI until Python 4.0. + */ Py_DEPRECATED(3.2) PyAPI_FUNC(void) PyEval_AcquireLock(void); -/* Py_DEPRECATED(3.2) */ PyAPI_FUNC(void) PyEval_ReleaseLock(void); +Py_DEPRECATED(3.2) PyAPI_FUNC(void) PyEval_ReleaseLock(void); PyAPI_FUNC(void) PyEval_AcquireThread(PyThreadState *tstate); PyAPI_FUNC(void) PyEval_ReleaseThread(PyThreadState *tstate); -#ifndef Py_LIMITED_API -PyAPI_FUNC(void) _PyEval_SetSwitchInterval(unsigned long microseconds); -PyAPI_FUNC(unsigned long) _PyEval_GetSwitchInterval(void); -#endif - -#ifndef Py_LIMITED_API -PyAPI_FUNC(Py_ssize_t) _PyEval_RequestCodeExtraIndex(freefunc); -#endif - #define Py_BEGIN_ALLOW_THREADS { \ PyThreadState *_save; \ _save = PyEval_SaveThread(); @@ -211,11 +145,6 @@ PyAPI_FUNC(Py_ssize_t) _PyEval_RequestCodeExtraIndex(freefunc); #define Py_END_ALLOW_THREADS PyEval_RestoreThread(_save); \ } -#ifndef Py_LIMITED_API -PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *); -PyAPI_FUNC(int) _PyEval_SliceIndexNotNone(PyObject *, Py_ssize_t *); -#endif - /* Masks and values used by FORMAT_VALUE opcode. */ #define FVC_MASK 0x3 #define FVC_NONE 0x0 @@ -225,6 +154,12 @@ PyAPI_FUNC(int) _PyEval_SliceIndexNotNone(PyObject *, Py_ssize_t *); #define FVS_MASK 0x4 #define FVS_HAVE_SPEC 0x4 +#ifndef Py_LIMITED_API +# define Py_CPYTHON_CEVAL_H +# include "cpython/ceval.h" +# undef Py_CPYTHON_CEVAL_H +#endif + #ifdef __cplusplus } #endif diff --git a/Include/classobject.h b/Include/classobject.h index c83303c390055380d1777c6233b90f36200c438c..1952f673b7d865442a85487f70c36fbab58f7102 100644 --- a/Include/classobject.h +++ b/Include/classobject.h @@ -19,7 +19,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyMethod_Type; -#define PyMethod_Check(op) ((op)->ob_type == &PyMethod_Type) +#define PyMethod_Check(op) Py_IS_TYPE(op, &PyMethod_Type) PyAPI_FUNC(PyObject *) PyMethod_New(PyObject *, PyObject *); @@ -33,8 +33,6 @@ PyAPI_FUNC(PyObject *) PyMethod_Self(PyObject *); #define PyMethod_GET_SELF(meth) \ (((PyMethodObject *)meth) -> im_self) -PyAPI_FUNC(int) PyMethod_ClearFreeList(void); - typedef struct { PyObject_HEAD PyObject *func; @@ -42,7 +40,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyInstanceMethod_Type; -#define PyInstanceMethod_Check(op) ((op)->ob_type == &PyInstanceMethod_Type) +#define PyInstanceMethod_Check(op) Py_IS_TYPE(op, &PyInstanceMethod_Type) PyAPI_FUNC(PyObject *) PyInstanceMethod_New(PyObject *); PyAPI_FUNC(PyObject *) PyInstanceMethod_Function(PyObject *); diff --git a/Include/code.h b/Include/code.h index a1cd58f44a0e892b6ac1b6a9e63e572e75c11765..b9e23eb816529b52143783c99885565cc3eb58d4 100644 --- a/Include/code.h +++ b/Include/code.h @@ -1,180 +1,20 @@ /* Definitions for bytecode */ -#ifndef Py_LIMITED_API #ifndef Py_CODE_H #define Py_CODE_H #ifdef __cplusplus extern "C" { #endif -typedef uint16_t _Py_CODEUNIT; - -#ifdef WORDS_BIGENDIAN -# define _Py_OPCODE(word) ((word) >> 8) -# define _Py_OPARG(word) ((word) & 255) -#else -# define _Py_OPCODE(word) ((word) & 255) -# define _Py_OPARG(word) ((word) >> 8) -#endif - -typedef struct _PyOpcache _PyOpcache; - -/* Bytecode object */ -typedef struct { - PyObject_HEAD - int co_argcount; /* #arguments, except *args */ - int co_posonlyargcount; /* #positional only arguments */ - int co_kwonlyargcount; /* #keyword only arguments */ - int co_nlocals; /* #local variables */ - int co_stacksize; /* #entries needed for evaluation stack */ - int co_flags; /* CO_..., see below */ - int co_firstlineno; /* first source line number */ - PyObject *co_code; /* instruction opcodes */ - PyObject *co_consts; /* list (constants used) */ - PyObject *co_names; /* list of strings (names used) */ - PyObject *co_varnames; /* tuple of strings (local variable names) */ - PyObject *co_freevars; /* tuple of strings (free variable names) */ - PyObject *co_cellvars; /* tuple of strings (cell variable names) */ - /* The rest aren't used in either hash or comparisons, except for co_name, - used in both. This is done to preserve the name and line number - for tracebacks and debuggers; otherwise, constant de-duplication - would collapse identical functions/lambdas defined on different lines. - */ - Py_ssize_t *co_cell2arg; /* Maps cell vars which are arguments. */ - PyObject *co_filename; /* unicode (where it was loaded from) */ - PyObject *co_name; /* unicode (name, for reference) */ - PyObject *co_lnotab; /* string (encoding addr<->lineno mapping) See - Objects/lnotab_notes.txt for details. */ - void *co_zombieframe; /* for optimization only (see frameobject.c) */ - PyObject *co_weakreflist; /* to support weakrefs to code objects */ - /* Scratch space for extra data relating to the code object. - Type is a void* to keep the format private in codeobject.c to force - people to go through the proper APIs. */ - void *co_extra; - - /* Per opcodes just-in-time cache - * - * To reduce cache size, we use indirect mapping from opcode index to - * cache object: - * cache = co_opcache[co_opcache_map[next_instr - first_instr] - 1] - */ - - // co_opcache_map is indexed by (next_instr - first_instr). - // * 0 means there is no cache for this opcode. - // * n > 0 means there is cache in co_opcache[n-1]. - unsigned char *co_opcache_map; - _PyOpcache *co_opcache; - int co_opcache_flag; // used to determine when create a cache. - unsigned char co_opcache_size; // length of co_opcache. -} PyCodeObject; - -/* Masks for co_flags above */ -#define CO_OPTIMIZED 0x0001 -#define CO_NEWLOCALS 0x0002 -#define CO_VARARGS 0x0004 -#define CO_VARKEYWORDS 0x0008 -#define CO_NESTED 0x0010 -#define CO_GENERATOR 0x0020 -/* The CO_NOFREE flag is set if there are no free or cell variables. - This information is redundant, but it allows a single flag test - to determine whether there is any extra work to be done when the - call frame it setup. -*/ -#define CO_NOFREE 0x0040 - -/* The CO_COROUTINE flag is set for coroutine functions (defined with - ``async def`` keywords) */ -#define CO_COROUTINE 0x0080 -#define CO_ITERABLE_COROUTINE 0x0100 -#define CO_ASYNC_GENERATOR 0x0200 - -/* bpo-39562: These constant values are changed in Python 3.9 - to prevent collision with compiler flags. CO_FUTURE_ and PyCF_ - constants must be kept unique. PyCF_ constants can use bits from - 0x0100 to 0x10000. CO_FUTURE_ constants use bits starting at 0x20000. */ -#define CO_FUTURE_DIVISION 0x20000 -#define CO_FUTURE_ABSOLUTE_IMPORT 0x40000 /* do absolute imports by default */ -#define CO_FUTURE_WITH_STATEMENT 0x80000 -#define CO_FUTURE_PRINT_FUNCTION 0x100000 -#define CO_FUTURE_UNICODE_LITERALS 0x200000 - -#define CO_FUTURE_BARRY_AS_BDFL 0x400000 -#define CO_FUTURE_GENERATOR_STOP 0x800000 -#define CO_FUTURE_ANNOTATIONS 0x1000000 - -/* This value is found in the co_cell2arg array when the associated cell - variable does not correspond to an argument. */ -#define CO_CELL_NOT_AN_ARG (-1) - -/* This should be defined if a future statement modifies the syntax. - For example, when a keyword is added. -*/ -#define PY_PARSER_REQUIRES_FUTURE_KEYWORD - -#define CO_MAXBLOCKS 20 /* Max static block nesting within a function */ - -PyAPI_DATA(PyTypeObject) PyCode_Type; - -#define PyCode_Check(op) (Py_TYPE(op) == &PyCode_Type) -#define PyCode_GetNumFree(op) (PyTuple_GET_SIZE((op)->co_freevars)) - -/* Public interface */ -PyAPI_FUNC(PyCodeObject *) PyCode_New( - int, int, int, int, int, PyObject *, PyObject *, - PyObject *, PyObject *, PyObject *, PyObject *, - PyObject *, PyObject *, int, PyObject *); - -PyAPI_FUNC(PyCodeObject *) PyCode_NewWithPosOnlyArgs( - int, int, int, int, int, int, PyObject *, PyObject *, - PyObject *, PyObject *, PyObject *, PyObject *, - PyObject *, PyObject *, int, PyObject *); - /* same as struct above */ - -/* Creates a new empty code object with the specified source location. */ -PyAPI_FUNC(PyCodeObject *) -PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno); - -/* Return the line number associated with the specified bytecode index - in this code object. If you just need the line number of a frame, - use PyFrame_GetLineNumber() instead. */ -PyAPI_FUNC(int) PyCode_Addr2Line(PyCodeObject *, int); - -/* for internal use only */ -typedef struct _addr_pair { - int ap_lower; - int ap_upper; -} PyAddrPair; - -#ifndef Py_LIMITED_API -/* Update *bounds to describe the first and one-past-the-last instructions in the - same line as lasti. Return the number of that line. -*/ -PyAPI_FUNC(int) _PyCode_CheckLineNumber(PyCodeObject* co, - int lasti, PyAddrPair *bounds); - -/* Create a comparable key used to compare constants taking in account the - * object type. It is used to make sure types are not coerced (e.g., float and - * complex) _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms - * - * Return (type(obj), obj, ...): a tuple with variable size (at least 2 items) - * depending on the type and the value. The type is the first item to not - * compare bytes and str which can raise a BytesWarning exception. */ -PyAPI_FUNC(PyObject*) _PyCode_ConstantKey(PyObject *obj); -#endif - -PyAPI_FUNC(PyObject*) PyCode_Optimize(PyObject *code, PyObject* consts, - PyObject *names, PyObject *lnotab); - +typedef struct PyCodeObject PyCodeObject; #ifndef Py_LIMITED_API -PyAPI_FUNC(int) _PyCode_GetExtra(PyObject *code, Py_ssize_t index, - void **extra); -PyAPI_FUNC(int) _PyCode_SetExtra(PyObject *code, Py_ssize_t index, - void *extra); +# define Py_CPYTHON_CODE_H +# include "cpython/code.h" +# undef Py_CPYTHON_CODE_H #endif #ifdef __cplusplus } #endif #endif /* !Py_CODE_H */ -#endif /* Py_LIMITED_API */ diff --git a/Include/compile.h b/Include/compile.h index 015584d03b0233aba038f8e1e2c0032a53739b57..98adee3d19120407ab43e1c3b7f4249c9bcb0cd1 100644 --- a/Include/compile.h +++ b/Include/compile.h @@ -2,7 +2,6 @@ #define Py_COMPILE_H #ifndef Py_LIMITED_API -#include "code.h" #ifdef __cplusplus extern "C" { @@ -10,6 +9,9 @@ extern "C" { /* Public interface */ struct _node; /* Declare the existence of this type */ +#ifndef Py_BUILD_CORE +Py_DEPRECATED(3.9) +#endif PyAPI_FUNC(PyCodeObject *) PyNode_Compile(struct _node *, const char *); /* XXX (ncoghlan): Unprefixed type name in a public API! */ @@ -89,7 +91,12 @@ PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name); PyAPI_FUNC(int) PyCompile_OpcodeStackEffect(int opcode, int oparg); PyAPI_FUNC(int) PyCompile_OpcodeStackEffectWithJump(int opcode, int oparg, int jump); -PyAPI_FUNC(int) _PyAST_Optimize(struct _mod *, PyArena *arena, int optimize); +typedef struct { + int optimize; + int ff_features; +} _PyASTOptimizeState; + +PyAPI_FUNC(int) _PyAST_Optimize(struct _mod *, PyArena *arena, _PyASTOptimizeState *state); #ifdef __cplusplus } @@ -103,4 +110,7 @@ PyAPI_FUNC(int) _PyAST_Optimize(struct _mod *, PyArena *arena, int optimize); #define Py_eval_input 258 #define Py_func_type_input 345 +/* This doesn't need to match anything */ +#define Py_fstring_input 800 + #endif /* !Py_COMPILE_H */ diff --git a/Include/complexobject.h b/Include/complexobject.h index cb8c52c580085444313fc6aee36401be638ffd3e..9221f9c51d65be46edcddc81f5c1d1b41a070144 100644 --- a/Include/complexobject.h +++ b/Include/complexobject.h @@ -39,7 +39,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyComplex_Type; #define PyComplex_Check(op) PyObject_TypeCheck(op, &PyComplex_Type) -#define PyComplex_CheckExact(op) (Py_TYPE(op) == &PyComplex_Type) +#define PyComplex_CheckExact(op) Py_IS_TYPE(op, &PyComplex_Type) #ifndef Py_LIMITED_API PyAPI_FUNC(PyObject *) PyComplex_FromCComplex(Py_complex); diff --git a/Include/context.h b/Include/context.h index 9581285247b3976e2973dcae3a6d22c305dc624c..4e5007089dd94bc1a50ca07340674deace6188bf 100644 --- a/Include/context.h +++ b/Include/context.h @@ -17,9 +17,9 @@ PyAPI_DATA(PyTypeObject) PyContextToken_Type; typedef struct _pycontexttokenobject PyContextToken; -#define PyContext_CheckExact(o) (Py_TYPE(o) == &PyContext_Type) -#define PyContextVar_CheckExact(o) (Py_TYPE(o) == &PyContextVar_Type) -#define PyContextToken_CheckExact(o) (Py_TYPE(o) == &PyContextToken_Type) +#define PyContext_CheckExact(o) Py_IS_TYPE(o, &PyContext_Type) +#define PyContextVar_CheckExact(o) Py_IS_TYPE(o, &PyContextVar_Type) +#define PyContextToken_CheckExact(o) Py_IS_TYPE(o, &PyContextToken_Type) PyAPI_FUNC(PyObject *) PyContext_New(void); @@ -73,9 +73,6 @@ PyAPI_FUNC(int) PyContextVar_Reset(PyObject *var, PyObject *token); PyAPI_FUNC(PyObject *) _PyContext_NewHamtForTests(void); -PyAPI_FUNC(int) PyContext_ClearFreeList(void); - - #endif /* !Py_LIMITED_API */ #ifdef __cplusplus diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index 2ea3209bca1098f11b1a1a78e43280eea79459c9..0f1304d26af335881960445544bd8491f9d810e1 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -26,28 +26,10 @@ PyAPI_FUNC(PyObject *) _PyStack_AsDict( PyObject *const *values, PyObject *kwnames); -/* Convert (args, nargs, kwargs: dict) into a (stack, nargs, kwnames: tuple). - - Return 0 on success, raise an exception and return -1 on error. - - Write the new stack into *p_stack. If *p_stack is differen than args, it - must be released by PyMem_Free(). - - The stack uses borrowed references. - - The type of keyword keys is not checked, these checks should be done - later (ex: _PyArg_ParseStackAndKeywords). */ -PyAPI_FUNC(int) _PyStack_UnpackDict( - PyObject *const *args, - Py_ssize_t nargs, - PyObject *kwargs, - PyObject *const **p_stack, - PyObject **p_kwnames); - /* Suggested size (number of positional arguments) for arrays of PyObject* allocated on a C stack to avoid allocating memory on the heap memory. Such array is used to pass positional arguments to call functions of the - _PyObject_Vectorcall() family. + PyObject_Vectorcall() family. The size is chosen to not abuse the C stack and so limit the risk of stack overflow. The size is also chosen to allow using the small stack for most @@ -55,16 +37,19 @@ PyAPI_FUNC(int) _PyStack_UnpackDict( 40 bytes on the stack. */ #define _PY_FASTCALL_SMALL_STACK 5 -PyAPI_FUNC(PyObject *) _Py_CheckFunctionResult(PyObject *callable, - PyObject *result, - const char *where); +PyAPI_FUNC(PyObject *) _Py_CheckFunctionResult( + PyThreadState *tstate, + PyObject *callable, + PyObject *result, + const char *where); /* === Vectorcall protocol (PEP 590) ============================= */ -/* Call callable using tp_call. Arguments are like _PyObject_Vectorcall() - or _PyObject_FastCallDict() (both forms are supported), +/* Call callable using tp_call. Arguments are like PyObject_Vectorcall() + or PyObject_FastCallDict() (both forms are supported), except that nargs is plainly the number of arguments without flags. */ PyAPI_FUNC(PyObject *) _PyObject_MakeTpCall( + PyThreadState *tstate, PyObject *callable, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords); @@ -78,18 +63,22 @@ PyVectorcall_NARGS(size_t n) } static inline vectorcallfunc -_PyVectorcall_Function(PyObject *callable) +PyVectorcall_Function(PyObject *callable) { - PyTypeObject *tp = Py_TYPE(callable); - Py_ssize_t offset = tp->tp_vectorcall_offset; - vectorcallfunc *ptr; - if (!PyType_HasFeature(tp, _Py_TPFLAGS_HAVE_VECTORCALL)) { + PyTypeObject *tp; + Py_ssize_t offset; + vectorcallfunc ptr; + + assert(callable != NULL); + tp = Py_TYPE(callable); + if (!PyType_HasFeature(tp, Py_TPFLAGS_HAVE_VECTORCALL)) { return NULL; } assert(PyCallable_Check(callable)); + offset = tp->tp_vectorcall_offset; assert(offset > 0); - ptr = (vectorcallfunc*)(((char *)callable) + offset); - return *ptr; + memcpy(&ptr, (char *) callable + offset, sizeof(ptr)); + return ptr; } /* Call the callable object 'callable' with the "vectorcall" calling @@ -106,31 +95,51 @@ _PyVectorcall_Function(PyObject *callable) of keyword arguments does not change nargsf). kwnames can also be NULL if there are no keyword arguments. - keywords must only contains str strings (no subclass), and all keys must - be unique. + keywords must only contain strings and all keys must be unique. Return the result on success. Raise an exception and return NULL on error. */ static inline PyObject * -_PyObject_Vectorcall(PyObject *callable, PyObject *const *args, - size_t nargsf, PyObject *kwnames) +_PyObject_VectorcallTstate(PyThreadState *tstate, PyObject *callable, + PyObject *const *args, size_t nargsf, + PyObject *kwnames) { - PyObject *res; vectorcallfunc func; + PyObject *res; + assert(kwnames == NULL || PyTuple_Check(kwnames)); assert(args != NULL || PyVectorcall_NARGS(nargsf) == 0); - func = _PyVectorcall_Function(callable); + + func = PyVectorcall_Function(callable); if (func == NULL) { Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); - return _PyObject_MakeTpCall(callable, args, nargs, kwnames); + return _PyObject_MakeTpCall(tstate, callable, args, nargs, kwnames); } res = func(callable, args, nargsf, kwnames); - return _Py_CheckFunctionResult(callable, res, NULL); + return _Py_CheckFunctionResult(tstate, callable, res, NULL); } -/* Same as _PyObject_Vectorcall except that keyword arguments are passed as +static inline PyObject * +PyObject_Vectorcall(PyObject *callable, PyObject *const *args, + size_t nargsf, PyObject *kwnames) +{ + PyThreadState *tstate = PyThreadState_GET(); + return _PyObject_VectorcallTstate(tstate, callable, + args, nargsf, kwnames); +} + +// Backwards compatibility aliases for API that was provisional in Python 3.8 +#define _PyObject_Vectorcall PyObject_Vectorcall +#define _PyObject_VectorcallMethod PyObject_VectorcallMethod +#define _PyObject_FastCallDict PyObject_VectorcallDict +#define _PyVectorcall_Function PyVectorcall_Function +#define _PyObject_CallOneArg PyObject_CallOneArg +#define _PyObject_CallMethodNoArgs PyObject_CallMethodNoArgs +#define _PyObject_CallMethodOneArg PyObject_CallMethodOneArg + +/* Same as PyObject_Vectorcall except that keyword arguments are passed as dict, which may be NULL if there are no keyword arguments. */ -PyAPI_FUNC(PyObject *) _PyObject_FastCallDict( +PyAPI_FUNC(PyObject *) PyObject_VectorcallDict( PyObject *callable, PyObject *const *args, size_t nargsf, @@ -140,30 +149,65 @@ PyAPI_FUNC(PyObject *) _PyObject_FastCallDict( "tuple" and keyword arguments "dict". "dict" may also be NULL */ PyAPI_FUNC(PyObject *) PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *dict); -/* Same as _PyObject_Vectorcall except without keyword arguments */ +static inline PyObject * +_PyObject_FastCallTstate(PyThreadState *tstate, PyObject *func, PyObject *const *args, Py_ssize_t nargs) +{ + return _PyObject_VectorcallTstate(tstate, func, args, (size_t)nargs, NULL); +} + +/* Same as PyObject_Vectorcall except without keyword arguments */ static inline PyObject * _PyObject_FastCall(PyObject *func, PyObject *const *args, Py_ssize_t nargs) { - return _PyObject_Vectorcall(func, args, (size_t)nargs, NULL); + PyThreadState *tstate = PyThreadState_GET(); + return _PyObject_FastCallTstate(tstate, func, args, nargs); } -/* Call a callable without any arguments */ +/* Call a callable without any arguments + Private static inline function variant of public function + PyObject_CallNoArgs(). */ static inline PyObject * _PyObject_CallNoArg(PyObject *func) { - return _PyObject_Vectorcall(func, NULL, 0, NULL); + PyThreadState *tstate = PyThreadState_GET(); + return _PyObject_VectorcallTstate(tstate, func, NULL, 0, NULL); } -PyAPI_FUNC(PyObject *) _PyObject_Call_Prepend( - PyObject *callable, - PyObject *obj, - PyObject *args, - PyObject *kwargs); +static inline PyObject * +PyObject_CallOneArg(PyObject *func, PyObject *arg) +{ + PyObject *_args[2]; + PyObject **args; + PyThreadState *tstate; + size_t nargsf; + + assert(arg != NULL); + args = _args + 1; // For PY_VECTORCALL_ARGUMENTS_OFFSET + args[0] = arg; + tstate = PyThreadState_GET(); + nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET; + return _PyObject_VectorcallTstate(tstate, func, args, nargsf, NULL); +} -PyAPI_FUNC(PyObject *) _PyObject_FastCall_Prepend( - PyObject *callable, - PyObject *obj, - PyObject *const *args, - Py_ssize_t nargs); +PyAPI_FUNC(PyObject *) PyObject_VectorcallMethod( + PyObject *name, PyObject *const *args, + size_t nargsf, PyObject *kwnames); + +static inline PyObject * +PyObject_CallMethodNoArgs(PyObject *self, PyObject *name) +{ + return PyObject_VectorcallMethod(name, &self, + 1 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); +} + +static inline PyObject * +PyObject_CallMethodOneArg(PyObject *self, PyObject *name, PyObject *arg) +{ + PyObject *args[2] = {self, arg}; + + assert(arg != NULL); + return PyObject_VectorcallMethod(name, args, + 2 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); +} /* Like PyObject_CallMethod(), but expect a _Py_Identifier* as the method name. */ @@ -181,6 +225,35 @@ PyAPI_FUNC(PyObject *) _PyObject_CallMethodIdObjArgs( struct _Py_Identifier *name, ...); +static inline PyObject * +_PyObject_VectorcallMethodId( + _Py_Identifier *name, PyObject *const *args, + size_t nargsf, PyObject *kwnames) +{ + PyObject *oname = _PyUnicode_FromId(name); /* borrowed */ + if (!oname) { + return NULL; + } + return PyObject_VectorcallMethod(oname, args, nargsf, kwnames); +} + +static inline PyObject * +_PyObject_CallMethodIdNoArgs(PyObject *self, _Py_Identifier *name) +{ + return _PyObject_VectorcallMethodId(name, &self, + 1 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); +} + +static inline PyObject * +_PyObject_CallMethodIdOneArg(PyObject *self, _Py_Identifier *name, PyObject *arg) +{ + PyObject *args[2] = {self, arg}; + + assert(arg != NULL); + return _PyObject_VectorcallMethodId(name, args, + 2 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); +} + PyAPI_FUNC(int) _PyObject_HasLen(PyObject *o); /* Guess the size of object 'o' using len(o) or o.__length_hint__(). @@ -191,9 +264,7 @@ PyAPI_FUNC(Py_ssize_t) PyObject_LengthHint(PyObject *o, Py_ssize_t); /* === New Buffer API ============================================ */ /* Return 1 if the getbuffer function is available, otherwise return 0. */ -#define PyObject_CheckBuffer(obj) \ - (((obj)->ob_type->tp_as_buffer != NULL) && \ - ((obj)->ob_type->tp_as_buffer->bf_getbuffer != NULL)) +PyAPI_FUNC(int) PyObject_CheckBuffer(PyObject *obj); /* This is a C-API version of the getbuffer function call. It checks to make sure object has the required function pointer and issues the @@ -209,7 +280,7 @@ PyAPI_FUNC(void *) PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices); /* Return the implied itemsize of the data-format area from a struct-style description. */ -PyAPI_FUNC(int) PyBuffer_SizeFromFormat(const char *); +PyAPI_FUNC(Py_ssize_t) PyBuffer_SizeFromFormat(const char *format); /* Implementation in memoryobject.c */ PyAPI_FUNC(int) PyBuffer_ToContiguous(void *buf, Py_buffer *view, @@ -261,14 +332,8 @@ PyAPI_FUNC(void) PyBuffer_Release(Py_buffer *view); /* ==== Iterators ================================================ */ #define PyIter_Check(obj) \ - ((obj)->ob_type->tp_iternext != NULL && \ - (obj)->ob_type->tp_iternext != &_PyObject_NextNotImplemented) - -/* === Number Protocol ================================================== */ - -#define PyIndex_Check(obj) \ - ((obj)->ob_type->tp_as_number != NULL && \ - (obj)->ob_type->tp_as_number->nb_index != NULL) + (Py_TYPE(obj)->tp_iternext != NULL && \ + Py_TYPE(obj)->tp_iternext != &_PyObject_NextNotImplemented) /* === Sequence protocol ================================================ */ diff --git a/Include/cpython/bytearrayobject.h b/Include/cpython/bytearrayobject.h new file mode 100644 index 0000000000000000000000000000000000000000..569b0cd0369861a4bbc539d676599ea4329859e1 --- /dev/null +++ b/Include/cpython/bytearrayobject.h @@ -0,0 +1,20 @@ +#ifndef Py_CPYTHON_BYTEARRAYOBJECT_H +# error "this header file must not be included directly" +#endif + +/* Object layout */ +typedef struct { + PyObject_VAR_HEAD + Py_ssize_t ob_alloc; /* How many bytes allocated in ob_bytes */ + char *ob_bytes; /* Physical backing buffer */ + char *ob_start; /* Logical start inside ob_bytes */ + Py_ssize_t ob_exports; /* How many buffer exports */ +} PyByteArrayObject; + +/* Macros, trading safety for speed */ +#define PyByteArray_AS_STRING(self) \ + (assert(PyByteArray_Check(self)), \ + Py_SIZE(self) ? ((PyByteArrayObject *)(self))->ob_start : _PyByteArray_empty_string) +#define PyByteArray_GET_SIZE(self) (assert(PyByteArray_Check(self)), Py_SIZE(self)) + +PyAPI_DATA(char) _PyByteArray_empty_string[]; diff --git a/Include/cpython/bytesobject.h b/Include/cpython/bytesobject.h new file mode 100644 index 0000000000000000000000000000000000000000..f284c5835df099a01ec646bb78c35ef66212a1b6 --- /dev/null +++ b/Include/cpython/bytesobject.h @@ -0,0 +1,118 @@ +#ifndef Py_CPYTHON_BYTESOBJECT_H +# error "this header file must not be included directly" +#endif + +typedef struct { + PyObject_VAR_HEAD + Py_hash_t ob_shash; + char ob_sval[1]; + + /* Invariants: + * ob_sval contains space for 'ob_size+1' elements. + * ob_sval[ob_size] == 0. + * ob_shash is the hash of the string or -1 if not computed yet. + */ +} PyBytesObject; + +PyAPI_FUNC(int) _PyBytes_Resize(PyObject **, Py_ssize_t); +PyAPI_FUNC(PyObject*) _PyBytes_FormatEx( + const char *format, + Py_ssize_t format_len, + PyObject *args, + int use_bytearray); +PyAPI_FUNC(PyObject*) _PyBytes_FromHex( + PyObject *string, + int use_bytearray); + +/* Helper for PyBytes_DecodeEscape that detects invalid escape chars. */ +PyAPI_FUNC(PyObject *) _PyBytes_DecodeEscape(const char *, Py_ssize_t, + const char *, const char **); + +/* Macro, trading safety for speed */ +#define PyBytes_AS_STRING(op) (assert(PyBytes_Check(op)), \ + (((PyBytesObject *)(op))->ob_sval)) +#define PyBytes_GET_SIZE(op) (assert(PyBytes_Check(op)),Py_SIZE(op)) + +/* _PyBytes_Join(sep, x) is like sep.join(x). sep must be PyBytesObject*, + x must be an iterable object. */ +PyAPI_FUNC(PyObject *) _PyBytes_Join(PyObject *sep, PyObject *x); + + +/* The _PyBytesWriter structure is big: it contains an embedded "stack buffer". + A _PyBytesWriter variable must be declared at the end of variables in a + function to optimize the memory allocation on the stack. */ +typedef struct { + /* bytes, bytearray or NULL (when the small buffer is used) */ + PyObject *buffer; + + /* Number of allocated size. */ + Py_ssize_t allocated; + + /* Minimum number of allocated bytes, + incremented by _PyBytesWriter_Prepare() */ + Py_ssize_t min_size; + + /* If non-zero, use a bytearray instead of a bytes object for buffer. */ + int use_bytearray; + + /* If non-zero, overallocate the buffer (default: 0). + This flag must be zero if use_bytearray is non-zero. */ + int overallocate; + + /* Stack buffer */ + int use_small_buffer; + char small_buffer[512]; +} _PyBytesWriter; + +/* Initialize a bytes writer + + By default, the overallocation is disabled. Set the overallocate attribute + to control the allocation of the buffer. */ +PyAPI_FUNC(void) _PyBytesWriter_Init(_PyBytesWriter *writer); + +/* Get the buffer content and reset the writer. + Return a bytes object, or a bytearray object if use_bytearray is non-zero. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(PyObject *) _PyBytesWriter_Finish(_PyBytesWriter *writer, + void *str); + +/* Deallocate memory of a writer (clear its internal buffer). */ +PyAPI_FUNC(void) _PyBytesWriter_Dealloc(_PyBytesWriter *writer); + +/* Allocate the buffer to write size bytes. + Return the pointer to the beginning of buffer data. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(void*) _PyBytesWriter_Alloc(_PyBytesWriter *writer, + Py_ssize_t size); + +/* Ensure that the buffer is large enough to write *size* bytes. + Add size to the writer minimum size (min_size attribute). + + str is the current pointer inside the buffer. + Return the updated current pointer inside the buffer. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(void*) _PyBytesWriter_Prepare(_PyBytesWriter *writer, + void *str, + Py_ssize_t size); + +/* Resize the buffer to make it larger. + The new buffer may be larger than size bytes because of overallocation. + Return the updated current pointer inside the buffer. + Raise an exception and return NULL on error. + + Note: size must be greater than the number of allocated bytes in the writer. + + This function doesn't use the writer minimum size (min_size attribute). + + See also _PyBytesWriter_Prepare(). + */ +PyAPI_FUNC(void*) _PyBytesWriter_Resize(_PyBytesWriter *writer, + void *str, + Py_ssize_t size); + +/* Write bytes. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(void*) _PyBytesWriter_WriteBytes(_PyBytesWriter *writer, + void *str, + const void *bytes, + Py_ssize_t size); diff --git a/Include/cpython/ceval.h b/Include/cpython/ceval.h new file mode 100644 index 0000000000000000000000000000000000000000..e1922a677bd38c0563cc491c4e2969fdd872f812 --- /dev/null +++ b/Include/cpython/ceval.h @@ -0,0 +1,38 @@ +#ifndef Py_CPYTHON_CEVAL_H +# error "this header file must not be included directly" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(void) PyEval_SetProfile(Py_tracefunc, PyObject *); +PyAPI_DATA(int) _PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg); +PyAPI_FUNC(void) PyEval_SetTrace(Py_tracefunc, PyObject *); +PyAPI_FUNC(int) _PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg); +PyAPI_FUNC(int) _PyEval_GetCoroutineOriginTrackingDepth(void); +PyAPI_FUNC(int) _PyEval_SetAsyncGenFirstiter(PyObject *); +PyAPI_FUNC(PyObject *) _PyEval_GetAsyncGenFirstiter(void); +PyAPI_FUNC(int) _PyEval_SetAsyncGenFinalizer(PyObject *); +PyAPI_FUNC(PyObject *) _PyEval_GetAsyncGenFinalizer(void); + +/* Helper to look up a builtin object */ +PyAPI_FUNC(PyObject *) _PyEval_GetBuiltinId(_Py_Identifier *); +/* Look at the current frame's (if any) code's co_flags, and turn on + the corresponding compiler flags in cf->cf_flags. Return 1 if any + flag was set, else return 0. */ +PyAPI_FUNC(int) PyEval_MergeCompilerFlags(PyCompilerFlags *cf); + +PyAPI_FUNC(PyObject *) _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int exc); + +PyAPI_FUNC(void) _PyEval_SetSwitchInterval(unsigned long microseconds); +PyAPI_FUNC(unsigned long) _PyEval_GetSwitchInterval(void); + +PyAPI_FUNC(Py_ssize_t) _PyEval_RequestCodeExtraIndex(freefunc); + +PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) _PyEval_SliceIndexNotNone(PyObject *, Py_ssize_t *); + +#ifdef __cplusplus +} +#endif diff --git a/Include/cpython/code.h b/Include/cpython/code.h new file mode 100644 index 0000000000000000000000000000000000000000..cda28ac6ee9343d5c08c07699688ac4f2fe1ffb3 --- /dev/null +++ b/Include/cpython/code.h @@ -0,0 +1,165 @@ +#ifndef Py_CPYTHON_CODE_H +# error "this header file must not be included directly" +#endif + +typedef uint16_t _Py_CODEUNIT; + +#ifdef WORDS_BIGENDIAN +# define _Py_OPCODE(word) ((word) >> 8) +# define _Py_OPARG(word) ((word) & 255) +#else +# define _Py_OPCODE(word) ((word) & 255) +# define _Py_OPARG(word) ((word) >> 8) +#endif + +typedef struct _PyOpcache _PyOpcache; + +/* Bytecode object */ +struct PyCodeObject { + PyObject_HEAD + int co_argcount; /* #arguments, except *args */ + int co_posonlyargcount; /* #positional only arguments */ + int co_kwonlyargcount; /* #keyword only arguments */ + int co_nlocals; /* #local variables */ + int co_stacksize; /* #entries needed for evaluation stack */ + int co_flags; /* CO_..., see below */ + int co_firstlineno; /* first source line number */ + PyObject *co_code; /* instruction opcodes */ + PyObject *co_consts; /* list (constants used) */ + PyObject *co_names; /* list of strings (names used) */ + PyObject *co_varnames; /* tuple of strings (local variable names) */ + PyObject *co_freevars; /* tuple of strings (free variable names) */ + PyObject *co_cellvars; /* tuple of strings (cell variable names) */ + /* The rest aren't used in either hash or comparisons, except for co_name, + used in both. This is done to preserve the name and line number + for tracebacks and debuggers; otherwise, constant de-duplication + would collapse identical functions/lambdas defined on different lines. + */ + Py_ssize_t *co_cell2arg; /* Maps cell vars which are arguments. */ + PyObject *co_filename; /* unicode (where it was loaded from) */ + PyObject *co_name; /* unicode (name, for reference) */ + PyObject *co_lnotab; /* string (encoding addr<->lineno mapping) See + Objects/lnotab_notes.txt for details. */ + void *co_zombieframe; /* for optimization only (see frameobject.c) */ + PyObject *co_weakreflist; /* to support weakrefs to code objects */ + /* Scratch space for extra data relating to the code object. + Type is a void* to keep the format private in codeobject.c to force + people to go through the proper APIs. */ + void *co_extra; + + /* Per opcodes just-in-time cache + * + * To reduce cache size, we use indirect mapping from opcode index to + * cache object: + * cache = co_opcache[co_opcache_map[next_instr - first_instr] - 1] + */ + + // co_opcache_map is indexed by (next_instr - first_instr). + // * 0 means there is no cache for this opcode. + // * n > 0 means there is cache in co_opcache[n-1]. + unsigned char *co_opcache_map; + _PyOpcache *co_opcache; + int co_opcache_flag; // used to determine when create a cache. + unsigned char co_opcache_size; // length of co_opcache. +}; + +/* Masks for co_flags above */ +#define CO_OPTIMIZED 0x0001 +#define CO_NEWLOCALS 0x0002 +#define CO_VARARGS 0x0004 +#define CO_VARKEYWORDS 0x0008 +#define CO_NESTED 0x0010 +#define CO_GENERATOR 0x0020 +/* The CO_NOFREE flag is set if there are no free or cell variables. + This information is redundant, but it allows a single flag test + to determine whether there is any extra work to be done when the + call frame it setup. +*/ +#define CO_NOFREE 0x0040 + +/* The CO_COROUTINE flag is set for coroutine functions (defined with + ``async def`` keywords) */ +#define CO_COROUTINE 0x0080 +#define CO_ITERABLE_COROUTINE 0x0100 +#define CO_ASYNC_GENERATOR 0x0200 + +/* bpo-39562: These constant values are changed in Python 3.9 + to prevent collision with compiler flags. CO_FUTURE_ and PyCF_ + constants must be kept unique. PyCF_ constants can use bits from + 0x0100 to 0x10000. CO_FUTURE_ constants use bits starting at 0x20000. */ +#define CO_FUTURE_DIVISION 0x20000 +#define CO_FUTURE_ABSOLUTE_IMPORT 0x40000 /* do absolute imports by default */ +#define CO_FUTURE_WITH_STATEMENT 0x80000 +#define CO_FUTURE_PRINT_FUNCTION 0x100000 +#define CO_FUTURE_UNICODE_LITERALS 0x200000 + +#define CO_FUTURE_BARRY_AS_BDFL 0x400000 +#define CO_FUTURE_GENERATOR_STOP 0x800000 +#define CO_FUTURE_ANNOTATIONS 0x1000000 + +/* This value is found in the co_cell2arg array when the associated cell + variable does not correspond to an argument. */ +#define CO_CELL_NOT_AN_ARG (-1) + +/* This should be defined if a future statement modifies the syntax. + For example, when a keyword is added. +*/ +#define PY_PARSER_REQUIRES_FUTURE_KEYWORD + +#define CO_MAXBLOCKS 20 /* Max static block nesting within a function */ + +PyAPI_DATA(PyTypeObject) PyCode_Type; + +#define PyCode_Check(op) Py_IS_TYPE(op, &PyCode_Type) +#define PyCode_GetNumFree(op) (PyTuple_GET_SIZE((op)->co_freevars)) + +/* Public interface */ +PyAPI_FUNC(PyCodeObject *) PyCode_New( + int, int, int, int, int, PyObject *, PyObject *, + PyObject *, PyObject *, PyObject *, PyObject *, + PyObject *, PyObject *, int, PyObject *); + +PyAPI_FUNC(PyCodeObject *) PyCode_NewWithPosOnlyArgs( + int, int, int, int, int, int, PyObject *, PyObject *, + PyObject *, PyObject *, PyObject *, PyObject *, + PyObject *, PyObject *, int, PyObject *); + /* same as struct above */ + +/* Creates a new empty code object with the specified source location. */ +PyAPI_FUNC(PyCodeObject *) +PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno); + +/* Return the line number associated with the specified bytecode index + in this code object. If you just need the line number of a frame, + use PyFrame_GetLineNumber() instead. */ +PyAPI_FUNC(int) PyCode_Addr2Line(PyCodeObject *, int); + +/* for internal use only */ +typedef struct _addr_pair { + int ap_lower; + int ap_upper; +} PyAddrPair; + +/* Update *bounds to describe the first and one-past-the-last instructions in the + same line as lasti. Return the number of that line. +*/ +PyAPI_FUNC(int) _PyCode_CheckLineNumber(PyCodeObject* co, + int lasti, PyAddrPair *bounds); + +/* Create a comparable key used to compare constants taking in account the + * object type. It is used to make sure types are not coerced (e.g., float and + * complex) _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms + * + * Return (type(obj), obj, ...): a tuple with variable size (at least 2 items) + * depending on the type and the value. The type is the first item to not + * compare bytes and str which can raise a BytesWarning exception. */ +PyAPI_FUNC(PyObject*) _PyCode_ConstantKey(PyObject *obj); + +PyAPI_FUNC(PyObject*) PyCode_Optimize(PyObject *code, PyObject* consts, + PyObject *names, PyObject *lnotab); + + +PyAPI_FUNC(int) _PyCode_GetExtra(PyObject *code, Py_ssize_t index, + void **extra); +PyAPI_FUNC(int) _PyCode_SetExtra(PyObject *code, Py_ssize_t index, + void *extra); diff --git a/Include/cpython/dictobject.h b/Include/cpython/dictobject.h index 64c012a012b793bf5f5954ab67f880ae81cda138..e33a0d156fead2a90773025699fad9d0ab992558 100644 --- a/Include/cpython/dictobject.h +++ b/Include/cpython/dictobject.h @@ -62,8 +62,6 @@ PyObject *_PyDict_Pop_KnownHash(PyObject *, PyObject *, Py_hash_t, PyObject *); PyObject *_PyDict_FromKeys(PyObject *, PyObject *, PyObject *); #define _PyDict_HasSplitTable(d) ((d)->ma_values != NULL) -PyAPI_FUNC(int) PyDict_ClearFreeList(void); - /* Like PyDict_Merge, but override can be 0, 1 or 2. If override is 0, the first occurrence of a key wins, if override is 1, the last occurrence of a key wins, if override is 2, a KeyError with conflicting key as diff --git a/Include/cpython/fileobject.h b/Include/cpython/fileobject.h index 57eac13c064c2e8905bd8c1d57c93405b7c00842..3005ce1f00f9d5b7644fde56fb064ade7abbff5f 100644 --- a/Include/cpython/fileobject.h +++ b/Include/cpython/fileobject.h @@ -8,14 +8,6 @@ extern "C" { 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); diff --git a/Include/cpython/fileutils.h b/Include/cpython/fileutils.h new file mode 100644 index 0000000000000000000000000000000000000000..e79d03e24f57714eefe1cc20ea907f965715d378 --- /dev/null +++ b/Include/cpython/fileutils.h @@ -0,0 +1,165 @@ +#ifndef Py_CPYTHON_FILEUTILS_H +# error "this header file must not be included directly" +#endif + +typedef enum { + _Py_ERROR_UNKNOWN=0, + _Py_ERROR_STRICT, + _Py_ERROR_SURROGATEESCAPE, + _Py_ERROR_REPLACE, + _Py_ERROR_IGNORE, + _Py_ERROR_BACKSLASHREPLACE, + _Py_ERROR_SURROGATEPASS, + _Py_ERROR_XMLCHARREFREPLACE, + _Py_ERROR_OTHER +} _Py_error_handler; + +PyAPI_FUNC(_Py_error_handler) _Py_GetErrorHandler(const char *errors); + +PyAPI_FUNC(int) _Py_DecodeLocaleEx( + const char *arg, + wchar_t **wstr, + size_t *wlen, + const char **reason, + int current_locale, + _Py_error_handler errors); + +PyAPI_FUNC(int) _Py_EncodeLocaleEx( + const wchar_t *text, + char **str, + size_t *error_pos, + const char **reason, + int current_locale, + _Py_error_handler errors); + + +PyAPI_FUNC(PyObject *) _Py_device_encoding(int); + +#if defined(MS_WINDOWS) || defined(__APPLE__) + /* On Windows, the count parameter of read() is an int (bpo-9015, bpo-9611). + On macOS 10.13, read() and write() with more than INT_MAX bytes + fail with EINVAL (bpo-24658). */ +# define _PY_READ_MAX INT_MAX +# define _PY_WRITE_MAX INT_MAX +#else + /* write() should truncate the input to PY_SSIZE_T_MAX bytes, + but it's safer to do it ourself to have a portable behaviour */ +# define _PY_READ_MAX PY_SSIZE_T_MAX +# define _PY_WRITE_MAX PY_SSIZE_T_MAX +#endif + +#ifdef MS_WINDOWS +struct _Py_stat_struct { + unsigned long st_dev; + uint64_t st_ino; + unsigned short st_mode; + int st_nlink; + int st_uid; + int st_gid; + unsigned long st_rdev; + __int64 st_size; + time_t st_atime; + int st_atime_nsec; + time_t st_mtime; + int st_mtime_nsec; + time_t st_ctime; + int st_ctime_nsec; + unsigned long st_file_attributes; + unsigned long st_reparse_tag; +}; +#else +# define _Py_stat_struct stat +#endif + +PyAPI_FUNC(int) _Py_fstat( + int fd, + struct _Py_stat_struct *status); + +PyAPI_FUNC(int) _Py_fstat_noraise( + int fd, + struct _Py_stat_struct *status); + +PyAPI_FUNC(int) _Py_stat( + PyObject *path, + struct stat *status); + +PyAPI_FUNC(int) _Py_open( + const char *pathname, + int flags); + +PyAPI_FUNC(int) _Py_open_noraise( + const char *pathname, + int flags); + +PyAPI_FUNC(FILE *) _Py_wfopen( + const wchar_t *path, + const wchar_t *mode); + +PyAPI_FUNC(FILE*) _Py_fopen( + const char *pathname, + const char *mode); + +PyAPI_FUNC(FILE*) _Py_fopen_obj( + PyObject *path, + const char *mode); + +PyAPI_FUNC(Py_ssize_t) _Py_read( + int fd, + void *buf, + size_t count); + +PyAPI_FUNC(Py_ssize_t) _Py_write( + int fd, + const void *buf, + size_t count); + +PyAPI_FUNC(Py_ssize_t) _Py_write_noraise( + int fd, + const void *buf, + size_t count); + +#ifdef HAVE_READLINK +PyAPI_FUNC(int) _Py_wreadlink( + const wchar_t *path, + wchar_t *buf, + /* Number of characters of 'buf' buffer + including the trailing NUL character */ + size_t buflen); +#endif + +#ifdef HAVE_REALPATH +PyAPI_FUNC(wchar_t*) _Py_wrealpath( + const wchar_t *path, + wchar_t *resolved_path, + /* Number of characters of 'resolved_path' buffer + including the trailing NUL character */ + size_t resolved_path_len); +#endif + +#ifndef MS_WINDOWS +PyAPI_FUNC(int) _Py_isabs(const wchar_t *path); +#endif + +PyAPI_FUNC(int) _Py_abspath(const wchar_t *path, wchar_t **abspath_p); + +PyAPI_FUNC(wchar_t*) _Py_wgetcwd( + wchar_t *buf, + /* Number of characters of 'buf' buffer + including the trailing NUL character */ + size_t buflen); + +PyAPI_FUNC(int) _Py_get_inheritable(int fd); + +PyAPI_FUNC(int) _Py_set_inheritable(int fd, int inheritable, + int *atomic_flag_works); + +PyAPI_FUNC(int) _Py_set_inheritable_async_safe(int fd, int inheritable, + int *atomic_flag_works); + +PyAPI_FUNC(int) _Py_dup(int fd); + +#ifndef MS_WINDOWS +PyAPI_FUNC(int) _Py_get_blocking(int fd); + +PyAPI_FUNC(int) _Py_set_blocking(int fd, int blocking); +#endif /* !MS_WINDOWS */ diff --git a/Include/cpython/frameobject.h b/Include/cpython/frameobject.h new file mode 100644 index 0000000000000000000000000000000000000000..36a51baae8784bae26ab18169dce77ed4780edf9 --- /dev/null +++ b/Include/cpython/frameobject.h @@ -0,0 +1,84 @@ +/* Frame object interface */ + +#ifndef Py_CPYTHON_FRAMEOBJECT_H +# error "this header file must not be included directly" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + int b_type; /* what kind of block this is */ + int b_handler; /* where to jump to find handler */ + int b_level; /* value stack level to pop to */ +} PyTryBlock; + +struct _frame { + PyObject_VAR_HEAD + struct _frame *f_back; /* previous frame, or NULL */ + PyCodeObject *f_code; /* code segment */ + PyObject *f_builtins; /* builtin symbol table (PyDictObject) */ + PyObject *f_globals; /* global symbol table (PyDictObject) */ + PyObject *f_locals; /* local symbol table (any mapping) */ + PyObject **f_valuestack; /* points after the last local */ + /* Next free slot in f_valuestack. Frame creation sets to f_valuestack. + Frame evaluation usually NULLs it, but a frame that yields sets it + to the current stack top. */ + PyObject **f_stacktop; + PyObject *f_trace; /* Trace function */ + char f_trace_lines; /* Emit per-line trace events? */ + char f_trace_opcodes; /* Emit per-opcode trace events? */ + + /* Borrowed reference to a generator, or NULL */ + PyObject *f_gen; + + int f_lasti; /* Last instruction if called */ + /* Call PyFrame_GetLineNumber() instead of reading this field + directly. As of 2.3 f_lineno is only valid when tracing is + active (i.e. when f_trace is set). At other times we use + PyCode_Addr2Line to calculate the line from the current + bytecode index. */ + int f_lineno; /* Current line number */ + int f_iblock; /* index in f_blockstack */ + char f_executing; /* whether the frame is still executing */ + PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */ + PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */ +}; + + +/* Standard object interface */ + +PyAPI_DATA(PyTypeObject) PyFrame_Type; + +#define PyFrame_Check(op) Py_IS_TYPE(op, &PyFrame_Type) + +PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *, + PyObject *, PyObject *); + +/* only internal use */ +PyFrameObject* _PyFrame_New_NoTrack(PyThreadState *, PyCodeObject *, + PyObject *, PyObject *); + + +/* The rest of the interface is specific for frame objects */ + +/* Block management functions */ + +PyAPI_FUNC(void) PyFrame_BlockSetup(PyFrameObject *, int, int, int); +PyAPI_FUNC(PyTryBlock *) PyFrame_BlockPop(PyFrameObject *); + +/* Conversions between "fast locals" and locals in dictionary */ + +PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int); + +PyAPI_FUNC(int) PyFrame_FastToLocalsWithError(PyFrameObject *f); +PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *); + +PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out); + +PyAPI_FUNC(PyFrameObject *) PyFrame_GetBack(PyFrameObject *frame); + +#ifdef __cplusplus +} +#endif diff --git a/Include/cpython/import.h b/Include/cpython/import.h new file mode 100644 index 0000000000000000000000000000000000000000..c1b47121f1246422759d4d0ffdd76522afb46e0d --- /dev/null +++ b/Include/cpython/import.h @@ -0,0 +1,50 @@ +#ifndef Py_CPYTHON_IMPORT_H +# error "this header file must not be included directly" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +PyMODINIT_FUNC PyInit__imp(void); + +PyAPI_FUNC(int) _PyImport_IsInitialized(PyInterpreterState *); + +PyAPI_FUNC(PyObject *) _PyImport_GetModuleId(struct _Py_Identifier *name); +PyAPI_FUNC(int) _PyImport_SetModule(PyObject *name, PyObject *module); +PyAPI_FUNC(int) _PyImport_SetModuleString(const char *name, PyObject* module); + +PyAPI_FUNC(void) _PyImport_AcquireLock(void); +PyAPI_FUNC(int) _PyImport_ReleaseLock(void); + +PyAPI_FUNC(PyObject *) _PyImport_FindExtensionObject(PyObject *, PyObject *); + +PyAPI_FUNC(int) _PyImport_FixupBuiltin( + PyObject *mod, + const char *name, /* UTF-8 encoded string */ + PyObject *modules + ); +PyAPI_FUNC(int) _PyImport_FixupExtensionObject(PyObject*, PyObject *, + PyObject *, PyObject *); + +struct _inittab { + const char *name; /* ASCII encoded string */ + PyObject* (*initfunc)(void); +}; +PyAPI_DATA(struct _inittab *) PyImport_Inittab; +PyAPI_FUNC(int) PyImport_ExtendInittab(struct _inittab *newtab); + +struct _frozen { + const char *name; /* ASCII encoded string */ + const unsigned char *code; + int size; +}; + +/* Embedding apps may change this pointer to point to their favorite + collection of frozen modules: */ + +PyAPI_DATA(const struct _frozen *) PyImport_FrozenModules; + +#ifdef __cplusplus +} +#endif diff --git a/Include/cpython/initconfig.h b/Include/cpython/initconfig.h index 4b5ceafe02dbc22faf65eea69a9cf043f20431be..0a256d4b5b0b8206dae4cc6a72493fe6195bd679 100644 --- a/Include/cpython/initconfig.h +++ b/Include/cpython/initconfig.h @@ -113,7 +113,11 @@ typedef struct { "POSIX", otherwise it is set to 0. Inherit Py_UTF8Mode value value. */ int utf8_mode; - int dev_mode; /* Development mode. PYTHONDEVMODE, -X dev */ + /* If non-zero, enable the Python Development Mode. + + Set to 1 by the -X dev command line option. Set by the PYTHONDEVMODE + environment variable. */ + int dev_mode; /* Memory allocator: PYTHONMALLOC env var. See PyMemAllocatorName for valid values. */ @@ -131,7 +135,7 @@ typedef struct { int isolated; /* Isolated mode? see PyPreConfig.isolated */ int use_environment; /* Use environment variables? see PyPreConfig.use_environment */ - int dev_mode; /* Development mode? See PyPreConfig.dev_mode */ + int dev_mode; /* Python Development Mode? See PyPreConfig.dev_mode */ /* Install signal handlers? Yes by default. */ int install_signal_handlers; @@ -143,13 +147,16 @@ typedef struct { Set to 1 by -X faulthandler and PYTHONFAULTHANDLER. -1 means unset. */ int faulthandler; + /* Enable PEG parser? + 1 by default, set to 0 by -X oldparser and PYTHONOLDPARSER */ + int _use_peg_parser; + /* Enable tracemalloc? Set by -X tracemalloc=N and PYTHONTRACEMALLOC. -1 means unset */ int tracemalloc; int import_time; /* PYTHONPROFILEIMPORTTIME, -X importtime */ int show_ref_count; /* -X showrefcount */ - int show_alloc_count; /* -X showalloccount */ int dump_refs; /* PYTHONDUMPREFS */ int malloc_stats; /* PYTHONMALLOCSTATS */ @@ -381,6 +388,7 @@ typedef struct { wchar_t *base_prefix; /* sys.base_prefix */ wchar_t *exec_prefix; /* sys.exec_prefix */ wchar_t *base_exec_prefix; /* sys.base_exec_prefix */ + wchar_t *platlibdir; /* sys.platlibdir */ /* --- Parameter only used by Py_Main() ---------- */ @@ -402,6 +410,18 @@ typedef struct { /* If equal to 0, stop Python initialization before the "main" phase */ int _init_main; + + /* If non-zero, disallow threads, subprocesses, and fork. + Default: 0. */ + int _isolated_interpreter; + + /* Original command line arguments. If _orig_argv is empty and _argv is + not equal to [''], PyConfig_Read() copies the configuration 'argv' list + into '_orig_argv' list before modifying 'argv' list (if parse_argv + is non-zero). + + _PyConfig_Write() initializes Py_GetArgcArgv() to this list. */ + PyWideStringList _orig_argv; } PyConfig; PyAPI_FUNC(void) PyConfig_InitPythonConfig(PyConfig *config); @@ -427,6 +447,14 @@ PyAPI_FUNC(PyStatus) PyConfig_SetWideStringList(PyConfig *config, PyWideStringList *list, Py_ssize_t length, wchar_t **items); + +/* --- Helper functions --------------------------------------- */ + +/* Get the original command line arguments, before Python modified them. + + See also PyConfig._orig_argv. */ +PyAPI_FUNC(void) Py_GetArgcArgv(int *argc, wchar_t ***argv); + #ifdef __cplusplus } #endif diff --git a/Include/cpython/listobject.h b/Include/cpython/listobject.h new file mode 100644 index 0000000000000000000000000000000000000000..74fe3301a7ab719faedba246790415cb1305b164 --- /dev/null +++ b/Include/cpython/listobject.h @@ -0,0 +1,43 @@ +#ifndef Py_CPYTHON_LISTOBJECT_H +# error "this header file must not be included directly" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_VAR_HEAD + /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ + PyObject **ob_item; + + /* ob_item contains space for 'allocated' elements. The number + * currently in use is ob_size. + * Invariants: + * 0 <= ob_size <= allocated + * len(list) == ob_size + * ob_item == NULL implies ob_size == allocated == 0 + * list.sort() temporarily sets allocated to -1 to detect mutations. + * + * Items must normally not be NULL, except during construction when + * the list is not yet visible outside the function that builds it. + */ + Py_ssize_t allocated; +} PyListObject; + +PyAPI_FUNC(PyObject *) _PyList_Extend(PyListObject *, PyObject *); +PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out); + +/* Macro, trading safety for speed */ + +/* Cast argument to PyTupleObject* type. */ +#define _PyList_CAST(op) (assert(PyList_Check(op)), (PyListObject *)(op)) + +#define PyList_GET_ITEM(op, i) (_PyList_CAST(op)->ob_item[i]) +#define PyList_SET_ITEM(op, i, v) (_PyList_CAST(op)->ob_item[i] = (v)) +#define PyList_GET_SIZE(op) Py_SIZE(_PyList_CAST(op)) +#define _PyList_ITEMS(op) (_PyList_CAST(op)->ob_item) + +#ifdef __cplusplus +} +#endif diff --git a/Include/cpython/methodobject.h b/Include/cpython/methodobject.h new file mode 100644 index 0000000000000000000000000000000000000000..7ecbfe3b5e2fe87d9482bd56f72b69fce37d6c26 --- /dev/null +++ b/Include/cpython/methodobject.h @@ -0,0 +1,35 @@ +#ifndef Py_CPYTHON_METHODOBJECT_H +# error "this header file must not be included directly" +#endif + +PyAPI_DATA(PyTypeObject) PyCMethod_Type; + +#define PyCMethod_CheckExact(op) Py_IS_TYPE(op, &PyCMethod_Type) +#define PyCMethod_Check(op) PyObject_TypeCheck(op, &PyCMethod_Type) + +/* Macros for direct access to these values. Type checks are *not* + done, so use with care. */ +#define PyCFunction_GET_FUNCTION(func) \ + (((PyCFunctionObject *)func) -> m_ml -> ml_meth) +#define PyCFunction_GET_SELF(func) \ + (((PyCFunctionObject *)func) -> m_ml -> ml_flags & METH_STATIC ? \ + NULL : ((PyCFunctionObject *)func) -> m_self) +#define PyCFunction_GET_FLAGS(func) \ + (((PyCFunctionObject *)func) -> m_ml -> ml_flags) +#define PyCFunction_GET_CLASS(func) \ + (((PyCFunctionObject *)func) -> m_ml -> ml_flags & METH_METHOD ? \ + ((PyCMethodObject *)func) -> mm_class : NULL) + +typedef struct { + PyObject_HEAD + PyMethodDef *m_ml; /* Description of the C function to call */ + PyObject *m_self; /* Passed as 'self' arg to the C func, can be NULL */ + PyObject *m_module; /* The __module__ attribute, can be anything */ + PyObject *m_weakreflist; /* List of weak references */ + vectorcallfunc vectorcall; +} PyCFunctionObject; + +typedef struct { + PyCFunctionObject func; + PyTypeObject *mm_class; /* Class that defines this method */ +} PyCMethodObject; diff --git a/Include/cpython/object.h b/Include/cpython/object.h index 5a0ac4afdae83d91a6211172834f5a0afbc2f832..444f832f5bd8d313250d2328d2fe7f8628e473d5 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -6,6 +6,22 @@ extern "C" { #endif +PyAPI_FUNC(void) _Py_NewReference(PyObject *op); + +#ifdef Py_TRACE_REFS +/* Py_TRACE_REFS is such major surgery that we call external routines. */ +PyAPI_FUNC(void) _Py_ForgetReference(PyObject *); +#endif + +/* Update the Python traceback of an object. This function must be called + when a memory block is reused from a free list. */ +PyAPI_FUNC(int) _PyTraceMalloc_NewReference(PyObject *op); + +#ifdef Py_REF_DEBUG +PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void); +#endif + + /********************* String Literals ****************************************/ /* This structure helps managing static strings. The basic usage goes like this: Instead of doing @@ -20,7 +36,7 @@ extern "C" { PyId_foo is a static variable, either on block level or file level. On first usage, the string "foo" is interned, and the structures are linked. On interpreter - shutdown, all strings are released (through _PyUnicode_ClearStaticStrings). + shutdown, all strings are released. Alternatively, _Py_static_string allows choosing the variable name. _PyUnicode_FromId returns a borrowed reference to the interned string. @@ -174,7 +190,7 @@ typedef struct { * backwards-compatibility */ typedef Py_ssize_t printfunc; -typedef struct _typeobject { +struct _typeobject { PyObject_VAR_HEAD const char *tp_name; /* For printing, in format "." */ Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */ @@ -255,19 +271,7 @@ typedef struct _typeobject { destructor tp_finalize; vectorcallfunc tp_vectorcall; - - /* bpo-37250: kept for backwards compatibility in CPython 3.8 only */ - Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int); - -#ifdef COUNT_ALLOCS - /* these must be last and never explicitly initialized */ - Py_ssize_t tp_allocs; - Py_ssize_t tp_frees; - Py_ssize_t tp_maxalloc; - struct _typeobject *tp_prev; - struct _typeobject *tp_next; -#endif -} PyTypeObject; +}; /* The *real* layout of a type object when allocated on the heap */ typedef struct _heaptypeobject { @@ -285,6 +289,7 @@ typedef struct _heaptypeobject { PyBufferProcs as_buffer; PyObject *ht_name, *ht_slots, *ht_qualname; struct _dictkeysobject *ht_cached_keys; + PyObject *ht_module; /* here are optional user slots, followed by the members. */ } PyHeapTypeObject; @@ -321,6 +326,9 @@ PyAPI_FUNC(int) _PyObject_HasAttrId(PyObject *, struct _Py_Identifier *); */ PyAPI_FUNC(int) _PyObject_LookupAttr(PyObject *, PyObject *, PyObject **); PyAPI_FUNC(int) _PyObject_LookupAttrId(PyObject *, struct _Py_Identifier *, PyObject **); + +PyAPI_FUNC(int) _PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); + PyAPI_FUNC(PyObject **) _PyObject_GetDictPtr(PyObject *); PyAPI_FUNC(PyObject *) _PyObject_NextNotImplemented(PyObject *); PyAPI_FUNC(void) PyObject_CallFinalizer(PyObject *); @@ -334,20 +342,7 @@ PyAPI_FUNC(int) _PyObject_GenericSetAttrWithDict(PyObject *, PyObject *, PyObject *, PyObject *); -#define PyType_HasFeature(t,f) (((t)->tp_flags & (f)) != 0) - -static inline void _Py_Dealloc_inline(PyObject *op) -{ - destructor dealloc = Py_TYPE(op)->tp_dealloc; -#ifdef Py_TRACE_REFS - _Py_ForgetReference(op); -#else - _Py_INC_TPFREES(op); -#endif - (*dealloc)(op); -} -#define _Py_Dealloc(op) _Py_Dealloc_inline(op) - +PyAPI_FUNC(PyObject *) _PyObject_FunctionStr(PyObject *); /* Safely decref `op` and set `op` to `op2`. * @@ -391,11 +386,6 @@ PyAPI_DATA(PyTypeObject) _PyNotImplemented_Type; */ PyAPI_DATA(int) _Py_SwappedOp[]; -/* This is the old private API, invoked by the macros before 3.2.4. - Kept for binary compatibility of extensions using the stable ABI. */ -PyAPI_FUNC(void) _PyTrash_deposit_object(PyObject*); -PyAPI_FUNC(void) _PyTrash_destroy_chain(void); - PyAPI_FUNC(void) _PyDebugAllocatorStats(FILE *out, const char *block_name, int num_blocks, size_t sizeof_block); @@ -442,7 +432,7 @@ _PyObject_DebugTypeStats(FILE *out); NDEBUG against a Python built with NDEBUG defined. msg, expr and function can be NULL. */ -PyAPI_FUNC(void) _PyObject_AssertFailed( +PyAPI_FUNC(void) _Py_NO_RETURN _PyObject_AssertFailed( PyObject *obj, const char *expr, const char *msg, @@ -465,6 +455,100 @@ PyAPI_FUNC(int) _PyObject_CheckConsistency( PyObject *op, int check_content); + +/* Trashcan mechanism, thanks to Christian Tismer. + +When deallocating a container object, it's possible to trigger an unbounded +chain of deallocations, as each Py_DECREF in turn drops the refcount on "the +next" object in the chain to 0. This can easily lead to stack overflows, +especially in threads (which typically have less stack space to work with). + +A container object can avoid this by bracketing the body of its tp_dealloc +function with a pair of macros: + +static void +mytype_dealloc(mytype *p) +{ + ... declarations go here ... + + PyObject_GC_UnTrack(p); // must untrack first + Py_TRASHCAN_BEGIN(p, mytype_dealloc) + ... The body of the deallocator goes here, including all calls ... + ... to Py_DECREF on contained objects. ... + Py_TRASHCAN_END // there should be no code after this +} + +CAUTION: Never return from the middle of the body! If the body needs to +"get out early", put a label immediately before the Py_TRASHCAN_END +call, and goto it. Else the call-depth counter (see below) will stay +above 0 forever, and the trashcan will never get emptied. + +How it works: The BEGIN macro increments a call-depth counter. So long +as this counter is small, the body of the deallocator is run directly without +further ado. But if the counter gets large, it instead adds p to a list of +objects to be deallocated later, skips the body of the deallocator, and +resumes execution after the END macro. The tp_dealloc routine then returns +without deallocating anything (and so unbounded call-stack depth is avoided). + +When the call stack finishes unwinding again, code generated by the END macro +notices this, and calls another routine to deallocate all the objects that +may have been added to the list of deferred deallocations. In effect, a +chain of N deallocations is broken into (N-1)/(PyTrash_UNWIND_LEVEL-1) pieces, +with the call stack never exceeding a depth of PyTrash_UNWIND_LEVEL. + +Since the tp_dealloc of a subclass typically calls the tp_dealloc of the base +class, we need to ensure that the trashcan is only triggered on the tp_dealloc +of the actual class being deallocated. Otherwise we might end up with a +partially-deallocated object. To check this, the tp_dealloc function must be +passed as second argument to Py_TRASHCAN_BEGIN(). +*/ + +/* This is the old private API, invoked by the macros before 3.2.4. + Kept for binary compatibility of extensions using the stable ABI. */ +PyAPI_FUNC(void) _PyTrash_deposit_object(PyObject*); +PyAPI_FUNC(void) _PyTrash_destroy_chain(void); + +/* This is the old private API, invoked by the macros before 3.9. + Kept for binary compatibility of extensions using the stable ABI. */ +PyAPI_FUNC(void) _PyTrash_thread_deposit_object(PyObject*); +PyAPI_FUNC(void) _PyTrash_thread_destroy_chain(void); + +/* Forward declarations for PyThreadState */ +struct _ts; + +/* Python 3.9 private API, invoked by the macros below. */ +PyAPI_FUNC(int) _PyTrash_begin(struct _ts *tstate, PyObject *op); +PyAPI_FUNC(void) _PyTrash_end(struct _ts *tstate); + +#define PyTrash_UNWIND_LEVEL 50 + +#define Py_TRASHCAN_BEGIN_CONDITION(op, cond) \ + do { \ + PyThreadState *_tstate = NULL; \ + /* If "cond" is false, then _tstate remains NULL and the deallocator \ + * is run normally without involving the trashcan */ \ + if (cond) { \ + _tstate = PyThreadState_GET(); \ + if (_PyTrash_begin(_tstate, _PyObject_CAST(op))) { \ + break; \ + } \ + } + /* The body of the deallocator is here. */ +#define Py_TRASHCAN_END \ + if (_tstate) { \ + _PyTrash_end(_tstate); \ + } \ + } while (0); + +#define Py_TRASHCAN_BEGIN(op, dealloc) \ + Py_TRASHCAN_BEGIN_CONDITION(op, \ + Py_TYPE(op)->tp_dealloc == (destructor)(dealloc)) + +/* For backwards compatibility, these macros enable the trashcan + * unconditionally */ +#define Py_TRASHCAN_SAFE_BEGIN(op) Py_TRASHCAN_BEGIN_CONDITION(op, 1) +#define Py_TRASHCAN_SAFE_END(op) Py_TRASHCAN_END + #ifdef __cplusplus } #endif diff --git a/Include/cpython/objimpl.h b/Include/cpython/objimpl.h index f121922bc42ced372845ca462c7ba742d4856710..b835936db701120c562d35bfd6b7bbacfa9009f6 100644 --- a/Include/cpython/objimpl.h +++ b/Include/cpython/objimpl.h @@ -6,6 +6,89 @@ extern "C" { #endif +#define _PyObject_SIZE(typeobj) ( (typeobj)->tp_basicsize ) + +/* _PyObject_VAR_SIZE returns the number of bytes (as size_t) allocated for a + vrbl-size object with nitems items, exclusive of gc overhead (if any). The + value is rounded up to the closest multiple of sizeof(void *), in order to + ensure that pointer fields at the end of the object are correctly aligned + for the platform (this is of special importance for subclasses of, e.g., + str or int, so that pointers can be stored after the embedded data). + + Note that there's no memory wastage in doing this, as malloc has to + return (at worst) pointer-aligned memory anyway. +*/ +#if ((SIZEOF_VOID_P - 1) & SIZEOF_VOID_P) != 0 +# error "_PyObject_VAR_SIZE requires SIZEOF_VOID_P be a power of 2" +#endif + +#define _PyObject_VAR_SIZE(typeobj, nitems) \ + _Py_SIZE_ROUND_UP((typeobj)->tp_basicsize + \ + (nitems)*(typeobj)->tp_itemsize, \ + SIZEOF_VOID_P) + + +/* This example code implements an object constructor with a custom + allocator, where PyObject_New is inlined, and shows the important + distinction between two steps (at least): + 1) the actual allocation of the object storage; + 2) the initialization of the Python specific fields + in this storage with PyObject_{Init, InitVar}. + + PyObject * + YourObject_New(...) + { + PyObject *op; + + op = (PyObject *) Your_Allocator(_PyObject_SIZE(YourTypeStruct)); + if (op == NULL) + return PyErr_NoMemory(); + + PyObject_Init(op, &YourTypeStruct); + + op->ob_field = value; + ... + return op; + } + + Note that in C++, the use of the new operator usually implies that + the 1st step is performed automatically for you, so in a C++ class + constructor you would start directly with PyObject_Init/InitVar. */ + + +/* Inline functions trading binary compatibility for speed: + PyObject_INIT() is the fast version of PyObject_Init(), and + PyObject_INIT_VAR() is the fast version of PyObject_InitVar(). + + These inline functions must not be called with op=NULL. */ +static inline PyObject* +_PyObject_INIT(PyObject *op, PyTypeObject *typeobj) +{ + assert(op != NULL); + Py_SET_TYPE(op, typeobj); + if (PyType_GetFlags(typeobj) & Py_TPFLAGS_HEAPTYPE) { + Py_INCREF(typeobj); + } + _Py_NewReference(op); + return op; +} + +#define PyObject_INIT(op, typeobj) \ + _PyObject_INIT(_PyObject_CAST(op), (typeobj)) + +static inline PyVarObject* +_PyObject_INIT_VAR(PyVarObject *op, PyTypeObject *typeobj, Py_ssize_t size) +{ + assert(op != NULL); + Py_SET_SIZE(op, size); + PyObject_INIT((PyObject *)op, typeobj); + return op; +} + +#define PyObject_INIT_VAR(op, typeobj, size) \ + _PyObject_INIT_VAR(_PyVarObject_CAST(op), (typeobj), (size)) + + /* This function returns the number of allocated memory blocks, regardless of size */ PyAPI_FUNC(Py_ssize_t) _Py_GetAllocatedBlocks(void); @@ -37,66 +120,16 @@ PyAPI_FUNC(Py_ssize_t) _PyGC_CollectNoFail(void); PyAPI_FUNC(Py_ssize_t) _PyGC_CollectIfEnabled(void); -/* Test if an object has a GC head */ -#define PyObject_IS_GC(o) \ - (PyType_IS_GC(Py_TYPE(o)) \ - && (Py_TYPE(o)->tp_is_gc == NULL || Py_TYPE(o)->tp_is_gc(o))) +/* Test if an object implements the garbage collector protocol */ +PyAPI_FUNC(int) PyObject_IS_GC(PyObject *obj); -/* GC information is stored BEFORE the object structure. */ -typedef struct { - // Pointer to next object in the list. - // 0 means the object is not tracked - uintptr_t _gc_next; - - // Pointer to previous object in the list. - // Lowest two bits are used for flags documented later. - uintptr_t _gc_prev; -} PyGC_Head; - -#define _Py_AS_GC(o) ((PyGC_Head *)(o)-1) - -/* True if the object is currently tracked by the GC. */ -#define _PyObject_GC_IS_TRACKED(o) (_Py_AS_GC(o)->_gc_next != 0) - -/* True if the object may be tracked by the GC in the future, or already is. - This can be useful to implement some optimizations. */ -#define _PyObject_GC_MAY_BE_TRACKED(obj) \ - (PyObject_IS_GC(obj) && \ - (!PyTuple_CheckExact(obj) || _PyObject_GC_IS_TRACKED(obj))) - - -/* Bit flags for _gc_prev */ -/* Bit 0 is set when tp_finalize is called */ -#define _PyGC_PREV_MASK_FINALIZED (1) -/* Bit 1 is set when the object is in generation which is GCed currently. */ -#define _PyGC_PREV_MASK_COLLECTING (2) -/* The (N-2) most significant bits contain the real address. */ -#define _PyGC_PREV_SHIFT (2) -#define _PyGC_PREV_MASK (((uintptr_t) -1) << _PyGC_PREV_SHIFT) - -// Lowest bit of _gc_next is used for flags only in GC. -// But it is always 0 for normal code. -#define _PyGCHead_NEXT(g) ((PyGC_Head*)(g)->_gc_next) -#define _PyGCHead_SET_NEXT(g, p) ((g)->_gc_next = (uintptr_t)(p)) - -// Lowest two bits of _gc_prev is used for _PyGC_PREV_MASK_* flags. -#define _PyGCHead_PREV(g) ((PyGC_Head*)((g)->_gc_prev & _PyGC_PREV_MASK)) -#define _PyGCHead_SET_PREV(g, p) do { \ - assert(((uintptr_t)p & ~_PyGC_PREV_MASK) == 0); \ - (g)->_gc_prev = ((g)->_gc_prev & ~_PyGC_PREV_MASK) \ - | ((uintptr_t)(p)); \ - } while (0) - -#define _PyGCHead_FINALIZED(g) \ - (((g)->_gc_prev & _PyGC_PREV_MASK_FINALIZED) != 0) -#define _PyGCHead_SET_FINALIZED(g) \ - ((g)->_gc_prev |= _PyGC_PREV_MASK_FINALIZED) - -#define _PyGC_FINALIZED(o) \ - _PyGCHead_FINALIZED(_Py_AS_GC(o)) -#define _PyGC_SET_FINALIZED(o) \ - _PyGCHead_SET_FINALIZED(_Py_AS_GC(o)) +/* Code built with Py_BUILD_CORE must include pycore_gc.h instead which + defines a different _PyGC_FINALIZED() macro. */ +#ifndef Py_BUILD_CORE + // Kept for backward compatibility with Python 3.8 +# define _PyGC_FINALIZED(o) PyObject_GC_IsFinalized(o) +#endif PyAPI_FUNC(PyObject *) _PyObject_GC_Malloc(size_t size); PyAPI_FUNC(PyObject *) _PyObject_GC_Calloc(size_t size); @@ -105,8 +138,7 @@ PyAPI_FUNC(PyObject *) _PyObject_GC_Calloc(size_t size); /* Test if a type supports weak references */ #define PyType_SUPPORTS_WEAKREFS(t) ((t)->tp_weaklistoffset > 0) -#define PyObject_GET_WEAKREFS_LISTPTR(o) \ - ((PyObject **) (((char *) (o)) + Py_TYPE(o)->tp_weaklistoffset)) +PyAPI_FUNC(PyObject **) PyObject_GET_WEAKREFS_LISTPTR(PyObject *op); #ifdef __cplusplus } diff --git a/Include/cpython/pyerrors.h b/Include/cpython/pyerrors.h index e3098b3925bd7949e863cd3a30c700123707d3fc..9c87b53979024d6c3eaf2fd64b374e84b284e43c 100644 --- a/Include/cpython/pyerrors.h +++ b/Include/cpython/pyerrors.h @@ -75,7 +75,8 @@ typedef PyOSErrorObject PyWindowsErrorObject; /* Error handling definitions */ PyAPI_FUNC(void) _PyErr_SetKeyError(PyObject *); -_PyErr_StackItem *_PyErr_GetTopmostException(PyThreadState *tstate); +PyAPI_FUNC(_PyErr_StackItem*) _PyErr_GetTopmostException(PyThreadState *tstate); +PyAPI_FUNC(void) _PyErr_GetExcInfo(PyThreadState *, PyObject **, PyObject **, PyObject **); /* Context manipulation (PEP 3134) */ @@ -148,7 +149,10 @@ PyAPI_FUNC(PyObject *) PyErr_ProgramTextObject( PyObject *filename, int lineno); -/* Create a UnicodeEncodeError object */ +/* Create a UnicodeEncodeError object. + * + * TODO: This API will be removed in Python 3.11. + */ Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_Create( const char *encoding, /* UTF-8 encoded string */ const Py_UNICODE *object, @@ -158,7 +162,10 @@ Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject *) PyUnicodeEncodeError_Create( const char *reason /* UTF-8 encoded string */ ); -/* Create a UnicodeTranslateError object */ +/* Create a UnicodeTranslateError object. + * + * TODO: This API will be removed in Python 3.11. + */ Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject *) PyUnicodeTranslateError_Create( const Py_UNICODE *object, Py_ssize_t length, @@ -177,6 +184,17 @@ PyAPI_FUNC(void) _PyErr_WriteUnraisableMsg( const char *err_msg, PyObject *obj); +PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalErrorFunc( + const char *func, + const char *message); + +PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalErrorFormat( + const char *func, + const char *format, + ...); + +#define Py_FatalError(message) _Py_FatalErrorFunc(__func__, message) + #ifdef __cplusplus } #endif diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index 2f3a0dbdfe64c52f3dcc29c04654628baaf0a146..eb523b82e182d8c4018661ed8ea7c9e2e587efb8 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -32,14 +32,6 @@ PyAPI_FUNC(int) _Py_IsCoreInitialized(void); PyAPI_FUNC(PyStatus) Py_InitializeFromConfig( const PyConfig *config); -PyAPI_FUNC(PyStatus) _Py_InitializeFromArgs( - const PyConfig *config, - Py_ssize_t argc, - char * const *argv); -PyAPI_FUNC(PyStatus) _Py_InitializeFromWideArgs( - const PyConfig *config, - Py_ssize_t argc, - wchar_t * const *argv); PyAPI_FUNC(PyStatus) _Py_InitializeMain(void); PyAPI_FUNC(int) Py_RunMain(void); @@ -73,6 +65,8 @@ PyAPI_FUNC(int) _Py_CoerceLegacyLocale(int warn); PyAPI_FUNC(int) _Py_LegacyLocaleDetected(int warn); PyAPI_FUNC(char *) _Py_SetLocaleFromEnv(int category); +PyAPI_FUNC(PyThreadState *) _Py_NewInterpreter(int isolated_subinterpreter); + #ifdef __cplusplus } #endif diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index e22b0539136083eea918f7ea42906c7419aa0863..f292da1d3c6c5ee48ceaad0639b9cb42d4414d9f 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -16,7 +16,7 @@ PyAPI_FUNC(PyObject *) _PyInterpreterState_GetMainModule(PyInterpreterState *); /* State unique per thread */ /* Py_tracefunc return -1 when raising an exception, or 0 for success. */ -typedef int (*Py_tracefunc)(PyObject *, struct _frame *, int, PyObject *); +typedef int (*Py_tracefunc)(PyObject *, PyFrameObject *, int, PyObject *); /* The following values are used for 'what' for tracefunc functions * @@ -56,7 +56,7 @@ struct _ts { PyInterpreterState *interp; /* Borrowed reference to the current frame (it can be NULL) */ - struct _frame *frame; + PyFrameObject *frame; int recursion_depth; char overflowed; /* The stack has overflowed. Allow 50 more calls to handle the runtime error. */ @@ -140,22 +140,17 @@ struct _ts { }; -/* Get the current interpreter state. +// Alias for backward compatibility with Python 3.8 +#define _PyInterpreterState_Get PyInterpreterState_Get - Issue a fatal error if there no current Python thread state or no current - interpreter. It cannot return NULL. - - The caller must hold the GIL.*/ -PyAPI_FUNC(PyInterpreterState *) _PyInterpreterState_Get(void); - -PyAPI_FUNC(int) _PyState_AddModule(PyObject*, struct PyModuleDef*); -PyAPI_FUNC(void) _PyState_ClearModules(void); PyAPI_FUNC(PyThreadState *) _PyThreadState_Prealloc(PyInterpreterState *); /* Similar to PyThreadState_Get(), but don't issue a fatal error * if it is NULL. */ PyAPI_FUNC(PyThreadState *) _PyThreadState_UncheckedGet(void); +PyAPI_FUNC(PyObject *) _PyThreadState_GetDict(PyThreadState *tstate); + /* PyGILState */ /* Helper/diagnostic function - return 1 if the current thread @@ -170,7 +165,7 @@ PyAPI_FUNC(int) PyGILState_Check(void); This function doesn't check for error. Return NULL before _PyGILState_Init() is called and after _PyGILState_Fini() is called. - See also _PyInterpreterState_Get() and _PyInterpreterState_GET_UNSAFE(). */ + See also _PyInterpreterState_Get() and _PyInterpreterState_GET(). */ PyAPI_FUNC(PyInterpreterState *) _PyGILState_GetInterpreterStateUnsafe(void); /* The implementation of sys._current_frames() Returns a dict mapping @@ -185,8 +180,24 @@ PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Head(void); PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Next(PyInterpreterState *); PyAPI_FUNC(PyThreadState *) PyInterpreterState_ThreadHead(PyInterpreterState *); PyAPI_FUNC(PyThreadState *) PyThreadState_Next(PyThreadState *); +PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void); + +/* Frame evaluation API */ + +typedef PyObject* (*_PyFrameEvalFunction)(PyThreadState *tstate, PyFrameObject *, int); + +PyAPI_FUNC(_PyFrameEvalFunction) _PyInterpreterState_GetEvalFrameFunc( + PyInterpreterState *interp); +PyAPI_FUNC(void) _PyInterpreterState_SetEvalFrameFunc( + PyInterpreterState *interp, + _PyFrameEvalFunction eval_frame); + +PyAPI_FUNC(const PyConfig*) _PyInterpreterState_GetConfig(PyInterpreterState *interp); + +// Get the configuration of the currrent interpreter. +// The caller must hold the GIL. +PyAPI_FUNC(const PyConfig*) _Py_GetConfig(void); -typedef struct _frame *(*PyThreadFrameGetter)(PyThreadState *self_); /* cross-interpreter data */ diff --git a/Include/cpython/sysmodule.h b/Include/cpython/sysmodule.h index 72d8ffed29fd6f73f8b2c6f157dbbdf86aa36bcb..1802b5b300018e6498e0a4fdf469df0bb3a1285d 100644 --- a/Include/cpython/sysmodule.h +++ b/Include/cpython/sysmodule.h @@ -13,7 +13,10 @@ 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_Audit( + const char *event, + const char *argFormat, + ...); PyAPI_FUNC(int) PySys_AddAuditHook(Py_AuditHookFunction, void*); #ifdef __cplusplus diff --git a/Include/cpython/traceback.h b/Include/cpython/traceback.h index 746097daaf9400cfb783eba79d73d70d32217c69..837470c3ba2bca9491901e7d8cf14557fde27130 100644 --- a/Include/cpython/traceback.h +++ b/Include/cpython/traceback.h @@ -9,7 +9,7 @@ extern "C" { typedef struct _traceback { PyObject_HEAD struct _traceback *tb_next; - struct _frame *tb_frame; + PyFrameObject *tb_frame; int tb_lasti; int tb_lineno; } PyTracebackObject; diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 54a13e32ba22b55e64f9048ac3528037b35bf753..17db79cffbc547bdb4a5567219c707aa17dd9e72 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -22,7 +22,7 @@ extern "C" { */ #define Py_UNICODE_ISSPACE(ch) \ - ((ch) < 128U ? _Py_ascii_whitespace[(ch)] : _PyUnicode_IsWhitespace(ch)) + ((Py_UCS4)(ch) < 128U ? _Py_ascii_whitespace[(ch)] : _PyUnicode_IsWhitespace(ch)) #define Py_UNICODE_ISLOWER(ch) _PyUnicode_IsLowercase(ch) #define Py_UNICODE_ISUPPER(ch) _PyUnicode_IsUppercase(ch) @@ -50,13 +50,18 @@ extern "C" { Py_UNICODE_ISDIGIT(ch) || \ Py_UNICODE_ISNUMERIC(ch)) -#define Py_UNICODE_COPY(target, source, length) \ - memcpy((target), (source), (length)*sizeof(Py_UNICODE)) +Py_DEPRECATED(3.3) static inline void +Py_UNICODE_COPY(Py_UNICODE *target, const Py_UNICODE *source, Py_ssize_t length) { + memcpy(target, source, (size_t)(length) * sizeof(Py_UNICODE)); +} -#define Py_UNICODE_FILL(target, value, length) \ - do {Py_ssize_t i_; Py_UNICODE *t_ = (target); Py_UNICODE v_ = (value);\ - for (i_ = 0; i_ < (length); i_++) t_[i_] = v_;\ - } while (0) +Py_DEPRECATED(3.3) static inline void +Py_UNICODE_FILL(Py_UNICODE *target, Py_UNICODE value, Py_ssize_t length) { + Py_ssize_t i; + for (i = 0; i < length; i++) { + target[i] = value; + } +} /* macros to work with surrogates */ #define Py_UNICODE_IS_SURROGATE(ch) (0xD800 <= (ch) && (ch) <= 0xDFFF) @@ -71,14 +76,6 @@ extern "C" { /* low surrogate = bottom 10 bits added to DC00 */ #define Py_UNICODE_LOW_SURROGATE(ch) (0xDC00 + ((ch) & 0x3FF)) -/* Check if substring matches at given offset. The offset must be - valid, and the substring must not be empty. */ - -#define Py_UNICODE_MATCH(string, offset, substring) \ - ((*((string)->wstr + (offset)) == *((substring)->wstr)) && \ - ((*((string)->wstr + (offset) + (substring)->wstr_length-1) == *((substring)->wstr + (substring)->wstr_length-1))) && \ - !memcmp((string)->wstr + (offset), (substring)->wstr, (substring)->wstr_length*sizeof(Py_UNICODE))) - /* --- Unicode Type ------------------------------------------------------- */ /* ASCII-only strings created through PyUnicode_New use the PyASCIIObject @@ -251,10 +248,6 @@ PyAPI_FUNC(int) _PyUnicode_CheckConsistency( int check_content); /* Fast access macros */ -#define PyUnicode_WSTR_LENGTH(op) \ - (PyUnicode_IS_COMPACT_ASCII(op) ? \ - ((PyASCIIObject*)op)->length : \ - ((PyCompactUnicodeObject*)op)->wstr_length) /* Returns the deprecated Py_UNICODE representation's size in code units (this includes surrogate pairs as 2 units). @@ -449,6 +442,14 @@ enum PyUnicode_Kind { (0xffffU) : \ (0x10ffffU))))) +Py_DEPRECATED(3.3) +static inline Py_ssize_t _PyUnicode_get_wstr_length(PyObject *op) { + return PyUnicode_IS_COMPACT_ASCII(op) ? + ((PyASCIIObject*)op)->length : + ((PyCompactUnicodeObject*)op)->wstr_length; +} +#define PyUnicode_WSTR_LENGTH(op) _PyUnicode_get_wstr_length((PyObject*)op) + /* === Public API ========================================================= */ /* --- Plain Py_UNICODE --------------------------------------------------- */ @@ -547,7 +548,7 @@ PyAPI_FUNC(void) _PyUnicode_FastFill( only allowed if u was set to NULL. The buffer is copied into the new object. */ -/* Py_DEPRECATED(3.3) */ PyAPI_FUNC(PyObject*) PyUnicode_FromUnicode( +Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_FromUnicode( const Py_UNICODE *u, /* Unicode buffer */ Py_ssize_t size /* size of buffer */ ); @@ -576,13 +577,13 @@ PyAPI_FUNC(Py_UCS4) _PyUnicode_FindMaxChar ( Py_UNICODE buffer. If the wchar_t/Py_UNICODE representation is not yet available, this function will calculate it. */ -/* Py_DEPRECATED(3.3) */ PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicode( +Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicode( PyObject *unicode /* Unicode object */ ); /* Similar to PyUnicode_AsUnicode(), but raises a ValueError if the string contains null characters. */ -PyAPI_FUNC(const Py_UNICODE *) _PyUnicode_AsUnicode( +Py_DEPRECATED(3.3) PyAPI_FUNC(const Py_UNICODE *) _PyUnicode_AsUnicode( PyObject *unicode /* Unicode object */ ); @@ -591,7 +592,7 @@ PyAPI_FUNC(const Py_UNICODE *) _PyUnicode_AsUnicode( If the wchar_t/Py_UNICODE representation is not yet available, this function will calculate it. */ -/* Py_DEPRECATED(3.3) */ PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicodeAndSize( +Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicodeAndSize( PyObject *unicode, /* Unicode object */ Py_ssize_t *size /* location where to save the length */ ); @@ -726,12 +727,6 @@ PyAPI_FUNC(int) _PyUnicode_FormatAdvancedWriter( Py_ssize_t start, Py_ssize_t end); -/* --- wchar_t support for platforms which support it --------------------- */ - -#ifdef HAVE_WCHAR_H -PyAPI_FUNC(void*) _PyUnicode_AsKind(PyObject *s, unsigned int kind); -#endif - /* --- Manage the default encoding ---------------------------------------- */ /* Returns a pointer to the default encoding (UTF-8) of the @@ -746,12 +741,6 @@ PyAPI_FUNC(void*) _PyUnicode_AsKind(PyObject *s, unsigned int kind); _PyUnicode_AsStringAndSize is a #define for PyUnicode_AsUTF8AndSize to support the previous internal function with the same behaviour. - - *** This API is for interpreter INTERNAL USE ONLY and will likely - *** be removed or changed in the future. - - *** If you need to access the Unicode object as UTF-8 bytes string, - *** please use PyUnicode_AsUTF8String() instead. */ PyAPI_FUNC(const char *) PyUnicode_AsUTF8AndSize( @@ -771,13 +760,6 @@ PyAPI_FUNC(const char *) PyUnicode_AsUTF8AndSize( Use of this API is DEPRECATED since no size information can be extracted from the returned data. - - *** This API is for interpreter INTERNAL USE ONLY and will likely - *** be removed or changed for Python 3.1. - - *** If you need to access the Unicode object as UTF-8 bytes string, - *** please use PyUnicode_AsUTF8String() instead. - */ PyAPI_FUNC(const char *) PyUnicode_AsUTF8(PyObject *unicode); @@ -990,7 +972,7 @@ Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_EncodeMBCS( */ -/* Py_DEPRECATED(3.3) */ PyAPI_FUNC(int) PyUnicode_EncodeDecimal( +Py_DEPRECATED(3.3) PyAPI_FUNC(int) PyUnicode_EncodeDecimal( Py_UNICODE *s, /* Unicode buffer */ Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ char *output, /* Output buffer; must have size >= length */ @@ -1003,7 +985,7 @@ Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_EncodeMBCS( Returns a new Unicode string on success, NULL on failure. */ -/* Py_DEPRECATED(3.3) */ +Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_TransformDecimalToASCII( Py_UNICODE *s, /* Unicode buffer */ Py_ssize_t length /* Number of Py_UNICODE chars to transform */ @@ -1227,13 +1209,13 @@ Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE*) PyUnicode_AsUnicodeCopy( /* Return an interned Unicode object for an Identifier; may fail if there is no memory.*/ PyAPI_FUNC(PyObject*) _PyUnicode_FromId(_Py_Identifier*); -/* Clear all static strings. */ -PyAPI_FUNC(void) _PyUnicode_ClearStaticStrings(void); /* Fast equality check when the inputs are known to be exact unicode types and where the hash values are equal (i.e. a very probable match) */ PyAPI_FUNC(int) _PyUnicode_EQ(PyObject *, PyObject *); +PyAPI_FUNC(Py_ssize_t) _PyUnicode_ScanIdentifier(PyObject *); + #ifdef __cplusplus } #endif diff --git a/Include/datetime.h b/Include/datetime.h index 00507cb85cc04aaf3fdd229547d3d8d8aa4e65de..5d9f2558f924d0b66403348195bd7fdfbe8d30e7 100644 --- a/Include/datetime.h +++ b/Include/datetime.h @@ -196,19 +196,19 @@ static PyDateTime_CAPI *PyDateTimeAPI = NULL; /* Macros for type checking when not building the Python core. */ #define PyDate_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateType) -#define PyDate_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateType) +#define PyDate_CheckExact(op) Py_IS_TYPE(op, PyDateTimeAPI->DateType) #define PyDateTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateTimeType) -#define PyDateTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateTimeType) +#define PyDateTime_CheckExact(op) Py_IS_TYPE(op, PyDateTimeAPI->DateTimeType) #define PyTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TimeType) -#define PyTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TimeType) +#define PyTime_CheckExact(op) Py_IS_TYPE(op, PyDateTimeAPI->TimeType) #define PyDelta_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DeltaType) -#define PyDelta_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DeltaType) +#define PyDelta_CheckExact(op) Py_IS_TYPE(op, PyDateTimeAPI->DeltaType) #define PyTZInfo_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TZInfoType) -#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TZInfoType) +#define PyTZInfo_CheckExact(op) Py_IS_TYPE(op, PyDateTimeAPI->TZInfoType) /* Macros for accessing constructors in a simplified fashion. */ diff --git a/Include/dictobject.h b/Include/dictobject.h index b37573ad48c003d3f700c1073585244c672bc563..c88b0aa0a5d0f96aab1d17a4c001c72cc633ef14 100644 --- a/Include/dictobject.h +++ b/Include/dictobject.h @@ -16,7 +16,7 @@ PyAPI_DATA(PyTypeObject) PyDict_Type; #define PyDict_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_DICT_SUBCLASS) -#define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type) +#define PyDict_CheckExact(op) Py_IS_TYPE(op, &PyDict_Type) PyAPI_FUNC(PyObject *) PyDict_New(void); PyAPI_FUNC(PyObject *) PyDict_GetItem(PyObject *mp, PyObject *key); diff --git a/Include/errcode.h b/Include/errcode.h index b37cd261d5ec4d54ac6b8ca9fd6008e70e35859a..790518b8b7730ed5e24a64d0e99f9c921b48d8ec 100644 --- a/Include/errcode.h +++ b/Include/errcode.h @@ -29,7 +29,6 @@ extern "C" { #define E_EOFS 23 /* EOF in triple-quoted string */ #define E_EOLS 24 /* EOL in single-quoted string */ #define E_LINECONT 25 /* Unexpected characters after a line continuation */ -#define E_IDENTIFIER 26 /* Invalid characters in identifier */ #define E_BADSINGLE 27 /* Ill-formed single statement input */ #ifdef __cplusplus diff --git a/Include/exports.h b/Include/exports.h new file mode 100644 index 0000000000000000000000000000000000000000..fc1a5c5ead6276e856de8e07080a125375a8acd0 --- /dev/null +++ b/Include/exports.h @@ -0,0 +1,30 @@ +#ifndef Py_EXPORTS_H +#define Py_EXPORTS_H + +#if defined(_WIN32) || defined(__CYGWIN__) + #define Py_IMPORTED_SYMBOL __declspec(dllimport) + #define Py_EXPORTED_SYMBOL __declspec(dllexport) + #define Py_LOCAL_SYMBOL +#else +/* + * If we only ever used gcc >= 5, we could use __has_attribute(visibility) + * as a cross-platform way to determine if visibility is supported. However, + * we may still need to support gcc >= 4, as some Ubuntu LTS and Centos versions + * have 4 < gcc < 5. + */ + #ifndef __has_attribute + #define __has_attribute(x) 0 // Compatibility with non-clang compilers. + #endif + #if (defined(__GNUC__) && (__GNUC__ >= 4)) ||\ + (defined(__clang__) && __has_attribute(visibility)) + #define Py_IMPORTED_SYMBOL __attribute__ ((visibility ("default"))) + #define Py_EXPORTED_SYMBOL __attribute__ ((visibility ("default"))) + #define Py_LOCAL_SYMBOL __attribute__ ((visibility ("hidden"))) + #else + #define Py_IMPORTED_SYMBOL + #define Py_EXPORTED_SYMBOL + #define Py_LOCAL_SYMBOL + #endif +#endif + +#endif /* Py_EXPORTS_H */ diff --git a/Include/fileobject.h b/Include/fileobject.h index 456887ef9d045da0e5fa3147554164cd01a70522..6ec2994aa859b6fbcd71d12fd283733ea1d049ab 100644 --- a/Include/fileobject.h +++ b/Include/fileobject.h @@ -20,8 +20,15 @@ PyAPI_FUNC(int) PyObject_AsFileDescriptor(PyObject *); 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 + /* 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 */ diff --git a/Include/fileutils.h b/Include/fileutils.h index 359dd0ad4ead015abbdb6638e2b57dd22dfbea95..12bd071c49c04a514978a402067051f8461a4cbf 100644 --- a/Include/fileutils.h +++ b/Include/fileutils.h @@ -18,167 +18,12 @@ PyAPI_FUNC(char*) _Py_EncodeLocaleRaw( size_t *error_pos); #endif - -#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03080000 -typedef enum { - _Py_ERROR_UNKNOWN=0, - _Py_ERROR_STRICT, - _Py_ERROR_SURROGATEESCAPE, - _Py_ERROR_REPLACE, - _Py_ERROR_IGNORE, - _Py_ERROR_BACKSLASHREPLACE, - _Py_ERROR_SURROGATEPASS, - _Py_ERROR_XMLCHARREFREPLACE, - _Py_ERROR_OTHER -} _Py_error_handler; - -PyAPI_FUNC(_Py_error_handler) _Py_GetErrorHandler(const char *errors); - -PyAPI_FUNC(int) _Py_DecodeLocaleEx( - const char *arg, - wchar_t **wstr, - size_t *wlen, - const char **reason, - int current_locale, - _Py_error_handler errors); - -PyAPI_FUNC(int) _Py_EncodeLocaleEx( - const wchar_t *text, - char **str, - size_t *error_pos, - const char **reason, - int current_locale, - _Py_error_handler errors); -#endif - #ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _Py_device_encoding(int); - -#if defined(MS_WINDOWS) || defined(__APPLE__) - /* On Windows, the count parameter of read() is an int (bpo-9015, bpo-9611). - On macOS 10.13, read() and write() with more than INT_MAX bytes - fail with EINVAL (bpo-24658). */ -# define _PY_READ_MAX INT_MAX -# define _PY_WRITE_MAX INT_MAX -#else - /* write() should truncate the input to PY_SSIZE_T_MAX bytes, - but it's safer to do it ourself to have a portable behaviour */ -# define _PY_READ_MAX PY_SSIZE_T_MAX -# define _PY_WRITE_MAX PY_SSIZE_T_MAX -#endif - -#ifdef MS_WINDOWS -struct _Py_stat_struct { - unsigned long st_dev; - uint64_t st_ino; - unsigned short st_mode; - int st_nlink; - int st_uid; - int st_gid; - unsigned long st_rdev; - __int64 st_size; - time_t st_atime; - int st_atime_nsec; - time_t st_mtime; - int st_mtime_nsec; - time_t st_ctime; - int st_ctime_nsec; - unsigned long st_file_attributes; - unsigned long st_reparse_tag; -}; -#else -# define _Py_stat_struct stat -#endif - -PyAPI_FUNC(int) _Py_fstat( - int fd, - struct _Py_stat_struct *status); - -PyAPI_FUNC(int) _Py_fstat_noraise( - int fd, - struct _Py_stat_struct *status); - -PyAPI_FUNC(int) _Py_stat( - PyObject *path, - struct stat *status); - -PyAPI_FUNC(int) _Py_open( - const char *pathname, - int flags); - -PyAPI_FUNC(int) _Py_open_noraise( - const char *pathname, - int flags); - -PyAPI_FUNC(FILE *) _Py_wfopen( - const wchar_t *path, - const wchar_t *mode); - -PyAPI_FUNC(FILE*) _Py_fopen( - const char *pathname, - const char *mode); - -PyAPI_FUNC(FILE*) _Py_fopen_obj( - PyObject *path, - const char *mode); - -PyAPI_FUNC(Py_ssize_t) _Py_read( - int fd, - void *buf, - size_t count); - -PyAPI_FUNC(Py_ssize_t) _Py_write( - int fd, - const void *buf, - size_t count); - -PyAPI_FUNC(Py_ssize_t) _Py_write_noraise( - int fd, - const void *buf, - size_t count); - -#ifdef HAVE_READLINK -PyAPI_FUNC(int) _Py_wreadlink( - const wchar_t *path, - wchar_t *buf, - /* Number of characters of 'buf' buffer - including the trailing NUL character */ - size_t buflen); -#endif - -#ifdef HAVE_REALPATH -PyAPI_FUNC(wchar_t*) _Py_wrealpath( - const wchar_t *path, - wchar_t *resolved_path, - /* Number of characters of 'resolved_path' buffer - including the trailing NUL character */ - size_t resolved_path_len); +# define Py_CPYTHON_FILEUTILS_H +# include "cpython/fileutils.h" +# undef Py_CPYTHON_FILEUTILS_H #endif -PyAPI_FUNC(wchar_t*) _Py_wgetcwd( - wchar_t *buf, - /* Number of characters of 'buf' buffer - including the trailing NUL character */ - size_t buflen); - -PyAPI_FUNC(int) _Py_get_inheritable(int fd); - -PyAPI_FUNC(int) _Py_set_inheritable(int fd, int inheritable, - int *atomic_flag_works); - -PyAPI_FUNC(int) _Py_set_inheritable_async_safe(int fd, int inheritable, - int *atomic_flag_works); - -PyAPI_FUNC(int) _Py_dup(int fd); - -#ifndef MS_WINDOWS -PyAPI_FUNC(int) _Py_get_blocking(int fd); - -PyAPI_FUNC(int) _Py_set_blocking(int fd, int blocking); -#endif /* !MS_WINDOWS */ - -#endif /* Py_LIMITED_API */ - #ifdef __cplusplus } #endif diff --git a/Include/floatobject.h b/Include/floatobject.h index f1044d64cba84d3d328d3485431f103cf2a2b3fe..e994aa8f29da484a1e4660c28d782d2324b93145 100644 --- a/Include/floatobject.h +++ b/Include/floatobject.h @@ -21,7 +21,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyFloat_Type; #define PyFloat_Check(op) PyObject_TypeCheck(op, &PyFloat_Type) -#define PyFloat_CheckExact(op) (Py_TYPE(op) == &PyFloat_Type) +#define PyFloat_CheckExact(op) Py_IS_TYPE(op, &PyFloat_Type) #ifdef Py_NAN #define Py_RETURN_NAN return PyFloat_FromDouble(Py_NAN) @@ -88,15 +88,6 @@ PyAPI_FUNC(int) _PyFloat_Pack2(double x, unsigned char *p, int le); PyAPI_FUNC(int) _PyFloat_Pack4(double x, unsigned char *p, int le); PyAPI_FUNC(int) _PyFloat_Pack8(double x, unsigned char *p, int le); -/* Needed for the old way for marshal to store a floating point number. - Returns the string length copied into p, -1 on error. - */ -PyAPI_FUNC(int) _PyFloat_Repr(double x, char *p, size_t len); - -/* Used to get the important decimal digits of a double */ -PyAPI_FUNC(int) _PyFloat_Digits(char *buf, double v, int *signum); -PyAPI_FUNC(void) _PyFloat_DigitsInit(void); - /* The unpack routines read 2, 4 or 8 bytes, starting at p. le is a bool * argument, true if the string is in little-endian format (exponent * last, at p+1, p+3 or p+7), false if big-endian (exponent first, at p). @@ -109,9 +100,6 @@ PyAPI_FUNC(double) _PyFloat_Unpack2(const unsigned char *p, int le); PyAPI_FUNC(double) _PyFloat_Unpack4(const unsigned char *p, int le); PyAPI_FUNC(double) _PyFloat_Unpack8(const unsigned char *p, int le); -/* free list api */ -PyAPI_FUNC(int) PyFloat_ClearFreeList(void); - PyAPI_FUNC(void) _PyFloat_DebugMallocStats(FILE* out); /* Format the object based on the format_spec, as defined in PEP 3101 diff --git a/Include/frameobject.h b/Include/frameobject.h index 3bad86a66f752df021975714a208088d0fba00ad..c118af1201a4c854ab899e17ca9148ae21a72991 100644 --- a/Include/frameobject.h +++ b/Include/frameobject.h @@ -1,92 +1,20 @@ /* Frame object interface */ -#ifndef Py_LIMITED_API #ifndef Py_FRAMEOBJECT_H #define Py_FRAMEOBJECT_H #ifdef __cplusplus extern "C" { #endif -typedef struct { - int b_type; /* what kind of block this is */ - int b_handler; /* where to jump to find handler */ - int b_level; /* value stack level to pop to */ -} PyTryBlock; - -typedef struct _frame { - PyObject_VAR_HEAD - struct _frame *f_back; /* previous frame, or NULL */ - PyCodeObject *f_code; /* code segment */ - PyObject *f_builtins; /* builtin symbol table (PyDictObject) */ - PyObject *f_globals; /* global symbol table (PyDictObject) */ - PyObject *f_locals; /* local symbol table (any mapping) */ - PyObject **f_valuestack; /* points after the last local */ - /* Next free slot in f_valuestack. Frame creation sets to f_valuestack. - Frame evaluation usually NULLs it, but a frame that yields sets it - to the current stack top. */ - PyObject **f_stacktop; - PyObject *f_trace; /* Trace function */ - char f_trace_lines; /* Emit per-line trace events? */ - char f_trace_opcodes; /* Emit per-opcode trace events? */ - - /* Borrowed reference to a generator, or NULL */ - PyObject *f_gen; - - int f_lasti; /* Last instruction if called */ - /* Call PyFrame_GetLineNumber() instead of reading this field - directly. As of 2.3 f_lineno is only valid when tracing is - active (i.e. when f_trace is set). At other times we use - PyCode_Addr2Line to calculate the line from the current - bytecode index. */ - int f_lineno; /* Current line number */ - int f_iblock; /* index in f_blockstack */ - char f_executing; /* whether the frame is still executing */ - PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */ - PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */ -} PyFrameObject; - - -/* Standard object interface */ - -PyAPI_DATA(PyTypeObject) PyFrame_Type; - -#define PyFrame_Check(op) (Py_TYPE(op) == &PyFrame_Type) - -PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *, - PyObject *, PyObject *); - -/* only internal use */ -PyFrameObject* _PyFrame_New_NoTrack(PyThreadState *, PyCodeObject *, - PyObject *, PyObject *); - - -/* The rest of the interface is specific for frame objects */ +#include "pyframe.h" -/* Block management functions */ - -PyAPI_FUNC(void) PyFrame_BlockSetup(PyFrameObject *, int, int, int); -PyAPI_FUNC(PyTryBlock *) PyFrame_BlockPop(PyFrameObject *); - -/* Extend the value stack */ - -PyAPI_FUNC(PyObject **) PyFrame_ExtendStack(PyFrameObject *, int, int); - -/* Conversions between "fast locals" and locals in dictionary */ - -PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int); - -PyAPI_FUNC(int) PyFrame_FastToLocalsWithError(PyFrameObject *f); -PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *); - -PyAPI_FUNC(int) PyFrame_ClearFreeList(void); - -PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out); - -/* Return the line of code the frame is currently executing. */ -PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *); +#ifndef Py_LIMITED_API +# define Py_CPYTHON_FRAMEOBJECT_H +# include "cpython/frameobject.h" +# undef Py_CPYTHON_FRAMEOBJECT_H +#endif #ifdef __cplusplus } #endif #endif /* !Py_FRAMEOBJECT_H */ -#endif /* Py_LIMITED_API */ diff --git a/Include/funcobject.h b/Include/funcobject.h index e563a74a15b6e182a99bdc7bb276b4a660c9f6c6..c5cc9d261a314e61005fb82889e53f699936d74a 100644 --- a/Include/funcobject.h +++ b/Include/funcobject.h @@ -43,7 +43,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyFunction_Type; -#define PyFunction_Check(op) (Py_TYPE(op) == &PyFunction_Type) +#define PyFunction_Check(op) Py_IS_TYPE(op, &PyFunction_Type) PyAPI_FUNC(PyObject *) PyFunction_New(PyObject *, PyObject *); PyAPI_FUNC(PyObject *) PyFunction_NewWithQualName(PyObject *, PyObject *, PyObject *); @@ -60,12 +60,6 @@ PyAPI_FUNC(PyObject *) PyFunction_GetAnnotations(PyObject *); PyAPI_FUNC(int) PyFunction_SetAnnotations(PyObject *, PyObject *); #ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _PyFunction_FastCallDict( - PyObject *func, - PyObject *const *args, - Py_ssize_t nargs, - PyObject *kwargs); - PyAPI_FUNC(PyObject *) _PyFunction_Vectorcall( PyObject *func, PyObject *const *stack, diff --git a/Include/genericaliasobject.h b/Include/genericaliasobject.h new file mode 100644 index 0000000000000000000000000000000000000000..cf002976b27cd7712ee80bf348f55c5c562bc12d --- /dev/null +++ b/Include/genericaliasobject.h @@ -0,0 +1,14 @@ +// Implementation of PEP 585: support list[int] etc. +#ifndef Py_GENERICALIASOBJECT_H +#define Py_GENERICALIASOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(PyObject *) Py_GenericAlias(PyObject *, PyObject *); +PyAPI_DATA(PyTypeObject) Py_GenericAliasType; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GENERICALIASOBJECT_H */ diff --git a/Include/genobject.h b/Include/genobject.h index 59ede281f44f22eb29fa8083ec89902e7c414436..8ffd15646f084e2aae375e2638d5abe7325e92f3 100644 --- a/Include/genobject.h +++ b/Include/genobject.h @@ -10,14 +10,12 @@ extern "C" { #include "pystate.h" /* _PyErr_StackItem */ -struct _frame; /* Avoid including frameobject.h */ - /* _PyGenObject_HEAD defines the initial segment of generator and coroutine objects. */ #define _PyGenObject_HEAD(prefix) \ PyObject_HEAD \ /* Note: gi_frame can be NULL if the generator is "finished" */ \ - struct _frame *prefix##_frame; \ + PyFrameObject *prefix##_frame; \ /* True if generator is being executed. */ \ char prefix##_running; \ /* The code object backing the generator */ \ @@ -38,12 +36,11 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyGen_Type; #define PyGen_Check(op) PyObject_TypeCheck(op, &PyGen_Type) -#define PyGen_CheckExact(op) (Py_TYPE(op) == &PyGen_Type) +#define PyGen_CheckExact(op) Py_IS_TYPE(op, &PyGen_Type) -PyAPI_FUNC(PyObject *) PyGen_New(struct _frame *); -PyAPI_FUNC(PyObject *) PyGen_NewWithQualName(struct _frame *, +PyAPI_FUNC(PyObject *) PyGen_New(PyFrameObject *); +PyAPI_FUNC(PyObject *) PyGen_NewWithQualName(PyFrameObject *, PyObject *name, PyObject *qualname); -PyAPI_FUNC(int) PyGen_NeedsFinalizing(PyGenObject *); PyAPI_FUNC(int) _PyGen_SetStopIterationValue(PyObject *); PyAPI_FUNC(int) _PyGen_FetchStopIterationValue(PyObject **); PyAPI_FUNC(PyObject *) _PyGen_Send(PyGenObject *, PyObject *); @@ -59,11 +56,9 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyCoro_Type; PyAPI_DATA(PyTypeObject) _PyCoroWrapper_Type; -PyAPI_DATA(PyTypeObject) _PyAIterWrapper_Type; - -#define PyCoro_CheckExact(op) (Py_TYPE(op) == &PyCoro_Type) +#define PyCoro_CheckExact(op) Py_IS_TYPE(op, &PyCoro_Type) PyObject *_PyCoro_GetAwaitableIter(PyObject *o); -PyAPI_FUNC(PyObject *) PyCoro_New(struct _frame *, +PyAPI_FUNC(PyObject *) PyCoro_New(PyFrameObject *, PyObject *name, PyObject *qualname); /* Asynchronous Generators */ @@ -89,15 +84,13 @@ PyAPI_DATA(PyTypeObject) _PyAsyncGenASend_Type; PyAPI_DATA(PyTypeObject) _PyAsyncGenWrappedValue_Type; PyAPI_DATA(PyTypeObject) _PyAsyncGenAThrow_Type; -PyAPI_FUNC(PyObject *) PyAsyncGen_New(struct _frame *, +PyAPI_FUNC(PyObject *) PyAsyncGen_New(PyFrameObject *, PyObject *name, PyObject *qualname); -#define PyAsyncGen_CheckExact(op) (Py_TYPE(op) == &PyAsyncGen_Type) +#define PyAsyncGen_CheckExact(op) Py_IS_TYPE(op, &PyAsyncGen_Type) PyObject *_PyAsyncGenValueWrapperNew(PyObject *); -int PyAsyncGen_ClearFreeLists(void); - #endif #undef _PyGenObject_HEAD diff --git a/Include/import.h b/Include/import.h index 13c614933c7c2b062770cb7bfcb5ee34acc37362..aeef3efd0bcee8e20183c91c41c1cda50ff7888f 100644 --- a/Include/import.h +++ b/Include/import.h @@ -1,4 +1,3 @@ - /* Module definition and import interface */ #ifndef Py_IMPORT_H @@ -7,9 +6,6 @@ extern "C" { #endif -#ifndef Py_LIMITED_API -PyMODINIT_FUNC PyInit__imp(void); -#endif /* !Py_LIMITED_API */ PyAPI_FUNC(long) PyImport_GetMagicNumber(void); PyAPI_FUNC(const char *) PyImport_GetMagicTag(void); PyAPI_FUNC(PyObject *) PyImport_ExecCodeModule( @@ -39,14 +35,6 @@ PyAPI_FUNC(PyObject *) PyImport_GetModuleDict(void); #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 PyAPI_FUNC(PyObject *) PyImport_GetModule(PyObject *name); #endif -#ifndef Py_LIMITED_API -PyAPI_FUNC(int) _PyImport_IsInitialized(PyInterpreterState *); -PyAPI_FUNC(PyObject *) _PyImport_GetModuleId(struct _Py_Identifier *name); -PyAPI_FUNC(PyObject *) _PyImport_AddModuleObject(PyObject *name, - PyObject *modules); -PyAPI_FUNC(int) _PyImport_SetModule(PyObject *name, PyObject *module); -PyAPI_FUNC(int) _PyImport_SetModuleString(const char *name, PyObject* module); -#endif #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 PyAPI_FUNC(PyObject *) PyImport_AddModuleObject( PyObject *name @@ -84,7 +72,6 @@ PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevelObject( PyAPI_FUNC(PyObject *) PyImport_GetImporter(PyObject *path); PyAPI_FUNC(PyObject *) PyImport_Import(PyObject *name); PyAPI_FUNC(PyObject *) PyImport_ReloadModule(PyObject *m); -PyAPI_FUNC(void) PyImport_Cleanup(void); #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 PyAPI_FUNC(int) PyImport_ImportFrozenModuleObject( PyObject *name @@ -94,53 +81,15 @@ PyAPI_FUNC(int) PyImport_ImportFrozenModule( const char *name /* UTF-8 encoded string */ ); -#ifndef Py_LIMITED_API -PyAPI_FUNC(void) _PyImport_AcquireLock(void); -PyAPI_FUNC(int) _PyImport_ReleaseLock(void); - -PyAPI_FUNC(void) _PyImport_ReInitLock(void); - -PyAPI_FUNC(PyObject *) _PyImport_FindBuiltin( - const char *name, /* UTF-8 encoded string */ - PyObject *modules - ); -PyAPI_FUNC(PyObject *) _PyImport_FindExtensionObject(PyObject *, PyObject *); -PyAPI_FUNC(PyObject *) _PyImport_FindExtensionObjectEx(PyObject *, PyObject *, - PyObject *); -PyAPI_FUNC(int) _PyImport_FixupBuiltin( - PyObject *mod, - const char *name, /* UTF-8 encoded string */ - PyObject *modules - ); -PyAPI_FUNC(int) _PyImport_FixupExtensionObject(PyObject*, PyObject *, - PyObject *, PyObject *); - -struct _inittab { - const char *name; /* ASCII encoded string */ - PyObject* (*initfunc)(void); -}; -PyAPI_DATA(struct _inittab *) PyImport_Inittab; -PyAPI_FUNC(int) PyImport_ExtendInittab(struct _inittab *newtab); -#endif /* Py_LIMITED_API */ - -PyAPI_DATA(PyTypeObject) PyNullImporter_Type; - PyAPI_FUNC(int) PyImport_AppendInittab( const char *name, /* ASCII encoded string */ PyObject* (*initfunc)(void) ); #ifndef Py_LIMITED_API -struct _frozen { - const char *name; /* ASCII encoded string */ - const unsigned char *code; - int size; -}; - -/* Embedding apps may change this pointer to point to their favorite - collection of frozen modules: */ - -PyAPI_DATA(const struct _frozen *) PyImport_FrozenModules; +# define Py_CPYTHON_IMPORT_H +# include "cpython/import.h" +# undef Py_CPYTHON_IMPORT_H #endif #ifdef __cplusplus diff --git a/Include/internal/pegen_interface.h b/Include/internal/pegen_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..ee4c77ec006760cb14c34340fc3a5a5248d51735 --- /dev/null +++ b/Include/internal/pegen_interface.h @@ -0,0 +1,46 @@ +#ifndef Py_PEGENINTERFACE +#define Py_PEGENINTERFACE +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "Python.h" +#include "Python-ast.h" + +PyAPI_FUNC(mod_ty) PyPegen_ASTFromString( + const char *str, + const char *filename, + int mode, + PyCompilerFlags *flags, + PyArena *arena); +PyAPI_FUNC(mod_ty) PyPegen_ASTFromStringObject( + const char *str, + PyObject* filename, + int mode, + PyCompilerFlags *flags, + PyArena *arena); +PyAPI_FUNC(mod_ty) PyPegen_ASTFromFileObject( + FILE *fp, + PyObject *filename_ob, + int mode, + const char *enc, + const char *ps1, + const char *ps2, + PyCompilerFlags *flags, + int *errcode, + PyArena *arena); +PyAPI_FUNC(mod_ty) PyPegen_ASTFromFilename( + const char *filename, + int mode, + PyCompilerFlags *flags, + PyArena *arena); + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PEGENINTERFACE*/ diff --git a/Include/internal/pycore_abstract.h b/Include/internal/pycore_abstract.h new file mode 100644 index 0000000000000000000000000000000000000000..b791bf24321991508ac9eb0186323c3d1ce4dc3b --- /dev/null +++ b/Include/internal/pycore_abstract.h @@ -0,0 +1,22 @@ +#ifndef Py_INTERNAL_ABSTRACT_H +#define Py_INTERNAL_ABSTRACT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +// Fast inlined version of PyIndex_Check() +static inline int +_PyIndex_Check(PyObject *obj) +{ + PyNumberMethods *tp_as_number = Py_TYPE(obj)->tp_as_number; + return (tp_as_number != NULL && tp_as_number->nb_index != NULL); +} + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_ABSTRACT_H */ diff --git a/Include/internal/pycore_atomic.h b/Include/internal/pycore_atomic.h index 336bc3fec27e5d9f85df21418597a9e34c15802c..1d5c5621677eb3706e9fe09010dcf7ee1f9a701f 100644 --- a/Include/internal/pycore_atomic.h +++ b/Include/internal/pycore_atomic.h @@ -8,8 +8,7 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "dynamic_annotations.h" - +#include "dynamic_annotations.h" /* _Py_ANNOTATE_MEMORY_ORDER */ #include "pyconfig.h" #if defined(HAVE_STD_ATOMIC) diff --git a/Include/bytes_methods.h b/Include/internal/pycore_bytes_methods.h similarity index 97% rename from Include/bytes_methods.h rename to Include/internal/pycore_bytes_methods.h index 8434a50a4bba717ee6c3a4428de3be3677e5c928..11e8ab20e91367ced72b6c7660201f77a0230cd1 100644 --- a/Include/bytes_methods.h +++ b/Include/internal/pycore_bytes_methods.h @@ -2,6 +2,10 @@ #ifndef Py_BYTES_CTYPE_H #define Py_BYTES_CTYPE_H +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + /* * The internal implementation behind PyBytes (bytes) and PyByteArray (bytearray) * methods of the given names, they operate on ASCII byte strings. diff --git a/Include/internal/pycore_byteswap.h b/Include/internal/pycore_byteswap.h new file mode 100644 index 0000000000000000000000000000000000000000..2b20fc6c7d3136bcf90cba28de95e61a9de10054 --- /dev/null +++ b/Include/internal/pycore_byteswap.h @@ -0,0 +1,88 @@ +/* Bytes swap functions, reverse order of bytes: + + - _Py_bswap16(uint16_t) + - _Py_bswap32(uint32_t) + - _Py_bswap64(uint64_t) +*/ + +#ifndef Py_INTERNAL_BSWAP_H +#define Py_INTERNAL_BSWAP_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#if defined(__GNUC__) \ + && ((__GNUC__ >= 5) || (__GNUC__ == 4) && (__GNUC_MINOR__ >= 8)) + /* __builtin_bswap16() is available since GCC 4.8, + __builtin_bswap32() is available since GCC 4.3, + __builtin_bswap64() is available since GCC 4.3. */ +# define _PY_HAVE_BUILTIN_BSWAP +#endif + +#ifdef _MSC_VER + /* Get _byteswap_ushort(), _byteswap_ulong(), _byteswap_uint64() */ +# include +#endif + +static inline uint16_t +_Py_bswap16(uint16_t word) +{ +#if defined(_PY_HAVE_BUILTIN_BSWAP) || _Py__has_builtin(__builtin_bswap16) + return __builtin_bswap16(word); +#elif defined(_MSC_VER) + Py_BUILD_ASSERT(sizeof(word) == sizeof(unsigned short)); + return _byteswap_ushort(word); +#else + // Portable implementation which doesn't rely on circular bit shift + return ( ((word & UINT16_C(0x00FF)) << 8) + | ((word & UINT16_C(0xFF00)) >> 8)); +#endif +} + +static inline uint32_t +_Py_bswap32(uint32_t word) +{ +#if defined(_PY_HAVE_BUILTIN_BSWAP) || _Py__has_builtin(__builtin_bswap32) + return __builtin_bswap32(word); +#elif defined(_MSC_VER) + Py_BUILD_ASSERT(sizeof(word) == sizeof(unsigned long)); + return _byteswap_ulong(word); +#else + // Portable implementation which doesn't rely on circular bit shift + return ( ((word & UINT32_C(0x000000FF)) << 24) + | ((word & UINT32_C(0x0000FF00)) << 8) + | ((word & UINT32_C(0x00FF0000)) >> 8) + | ((word & UINT32_C(0xFF000000)) >> 24)); +#endif +} + +static inline uint64_t +_Py_bswap64(uint64_t word) +{ +#if defined(_PY_HAVE_BUILTIN_BSWAP) || _Py__has_builtin(__builtin_bswap64) + return __builtin_bswap64(word); +#elif defined(_MSC_VER) + return _byteswap_uint64(word); +#else + // Portable implementation which doesn't rely on circular bit shift + return ( ((word & UINT64_C(0x00000000000000FF)) << 56) + | ((word & UINT64_C(0x000000000000FF00)) << 40) + | ((word & UINT64_C(0x0000000000FF0000)) << 24) + | ((word & UINT64_C(0x00000000FF000000)) << 8) + | ((word & UINT64_C(0x000000FF00000000)) >> 8) + | ((word & UINT64_C(0x0000FF0000000000)) >> 24) + | ((word & UINT64_C(0x00FF000000000000)) >> 40) + | ((word & UINT64_C(0xFF00000000000000)) >> 56)); +#endif +} + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_BSWAP_H */ + diff --git a/Include/internal/pycore_call.h b/Include/internal/pycore_call.h new file mode 100644 index 0000000000000000000000000000000000000000..f7d856a54bd4a9d60accf14f3ba52068804a15fd --- /dev/null +++ b/Include/internal/pycore_call.h @@ -0,0 +1,39 @@ +#ifndef Py_INTERNAL_CALL_H +#define Py_INTERNAL_CALL_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +PyAPI_FUNC(PyObject *) _PyObject_Call_Prepend( + PyThreadState *tstate, + PyObject *callable, + PyObject *obj, + PyObject *args, + PyObject *kwargs); + +PyAPI_FUNC(PyObject *) _PyObject_FastCallDictTstate( + PyThreadState *tstate, + PyObject *callable, + PyObject *const *args, + size_t nargsf, + PyObject *kwargs); + +PyAPI_FUNC(PyObject *) _PyObject_Call( + PyThreadState *tstate, + PyObject *callable, + PyObject *args, + PyObject *kwargs); + +static inline PyObject * +_PyObject_CallNoArgTstate(PyThreadState *tstate, PyObject *func) { + return _PyObject_VectorcallTstate(tstate, func, NULL, 0, NULL); +} + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_CALL_H */ diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 4c1c0e2439eea450bbc969fd75a4129f0278a2ce..18c8f027af16e6410452648f7a110bd11cf86d78 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -8,29 +8,116 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_atomic.h" -#include "pycore_pystate.h" -#include "pythread.h" - -PyAPI_FUNC(void) _Py_FinishPendingCalls(_PyRuntimeState *runtime); -PyAPI_FUNC(void) _PyEval_Initialize(struct _ceval_runtime_state *); -PyAPI_FUNC(void) _PyEval_FiniThreads( - struct _ceval_runtime_state *ceval); -PyAPI_FUNC(void) _PyEval_SignalReceived( - struct _ceval_runtime_state *ceval); +/* Forward declarations */ +struct pyruntimestate; +struct _ceval_runtime_state; + +#include "pycore_interp.h" /* PyInterpreterState.eval_frame */ + +extern void _Py_FinishPendingCalls(PyThreadState *tstate); +extern void _PyEval_InitRuntimeState(struct _ceval_runtime_state *); +extern int _PyEval_InitState(struct _ceval_state *ceval); +extern void _PyEval_FiniState(struct _ceval_state *ceval); +PyAPI_FUNC(void) _PyEval_SignalReceived(PyInterpreterState *interp); PyAPI_FUNC(int) _PyEval_AddPendingCall( - PyThreadState *tstate, - struct _ceval_runtime_state *ceval, + PyInterpreterState *interp, int (*func)(void *), void *arg); -PyAPI_FUNC(void) _PyEval_SignalAsyncExc( - struct _ceval_runtime_state *ceval); -PyAPI_FUNC(void) _PyEval_ReInitThreads( - _PyRuntimeState *runtime); +PyAPI_FUNC(void) _PyEval_SignalAsyncExc(PyThreadState *tstate); +#ifdef HAVE_FORK +extern void _PyEval_ReInitThreads(struct pyruntimestate *runtime); +#endif +PyAPI_FUNC(void) _PyEval_SetCoroutineOriginTrackingDepth( + PyThreadState *tstate, + int new_depth); /* Private function */ void _PyEval_Fini(void); +static inline PyObject* +_PyEval_EvalFrame(PyThreadState *tstate, PyFrameObject *f, int throwflag) +{ + return tstate->interp->eval_frame(tstate, f, throwflag); +} + +extern PyObject *_PyEval_EvalCode( + PyThreadState *tstate, + PyObject *_co, PyObject *globals, PyObject *locals, + PyObject *const *args, Py_ssize_t argcount, + PyObject *const *kwnames, PyObject *const *kwargs, + Py_ssize_t kwcount, int kwstep, + PyObject *const *defs, Py_ssize_t defcount, + PyObject *kwdefs, PyObject *closure, + PyObject *name, PyObject *qualname); + +extern int _PyEval_ThreadsInitialized(struct pyruntimestate *runtime); +extern PyStatus _PyEval_InitGIL(PyThreadState *tstate); +extern void _PyEval_FiniGIL(PyThreadState *tstate); + +extern void _PyEval_ReleaseLock(PyThreadState *tstate); + + +/* --- _Py_EnterRecursiveCall() ----------------------------------------- */ + +PyAPI_DATA(int) _Py_CheckRecursionLimit; + +#ifdef USE_STACKCHECK +/* With USE_STACKCHECK macro defined, trigger stack checks in + _Py_CheckRecursiveCall() on every 64th call to Py_EnterRecursiveCall. */ +static inline int _Py_MakeRecCheck(PyThreadState *tstate) { + return (++tstate->recursion_depth > tstate->interp->ceval.recursion_limit + || ++tstate->stackcheck_counter > 64); +} +#else +static inline int _Py_MakeRecCheck(PyThreadState *tstate) { + return (++tstate->recursion_depth > tstate->interp->ceval.recursion_limit); +} +#endif + +PyAPI_FUNC(int) _Py_CheckRecursiveCall( + PyThreadState *tstate, + const char *where); + +static inline int _Py_EnterRecursiveCall(PyThreadState *tstate, + const char *where) { + return (_Py_MakeRecCheck(tstate) && _Py_CheckRecursiveCall(tstate, where)); +} + +static inline int _Py_EnterRecursiveCall_inline(const char *where) { + PyThreadState *tstate = PyThreadState_GET(); + return _Py_EnterRecursiveCall(tstate, where); +} + +#define Py_EnterRecursiveCall(where) _Py_EnterRecursiveCall_inline(where) + +/* Compute the "lower-water mark" for a recursion limit. When + * Py_LeaveRecursiveCall() is called with a recursion depth below this mark, + * the overflowed flag is reset to 0. */ +static inline int _Py_RecursionLimitLowerWaterMark(int limit) { + if (limit > 200) { + return (limit - 50); + } + else { + return (3 * (limit >> 2)); + } +} + +static inline void _Py_LeaveRecursiveCall(PyThreadState *tstate) { + tstate->recursion_depth--; + int limit = tstate->interp->ceval.recursion_limit; + if (tstate->recursion_depth < _Py_RecursionLimitLowerWaterMark(limit)) { + tstate->overflowed = 0; + } +} + +static inline void _Py_LeaveRecursiveCall_inline(void) { + PyThreadState *tstate = PyThreadState_GET(); + _Py_LeaveRecursiveCall(tstate); +} + +#define Py_LeaveRecursiveCall() _Py_LeaveRecursiveCall_inline() + + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_context.h b/Include/internal/pycore_context.h index 5e1ba0d0393f4a690e0e2857ea13222fe777028d..f665ad5c115b07ac839917db3271ade9b4663475 100644 --- a/Include/internal/pycore_context.h +++ b/Include/internal/pycore_context.h @@ -5,7 +5,7 @@ # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_hamt.h" +#include "pycore_hamt.h" /* PyHamtObject */ struct _pycontextobject { PyObject_HEAD diff --git a/Include/dtoa.h b/Include/internal/pycore_dtoa.h similarity index 66% rename from Include/dtoa.h rename to Include/internal/pycore_dtoa.h index 9bfb6251db831c59579b157625e8a3fc492d1e77..3faf8cf6b2eefc7d7fe688e3df95c94a6ca52e85 100644 --- a/Include/dtoa.h +++ b/Include/internal/pycore_dtoa.h @@ -1,9 +1,15 @@ -#ifndef Py_LIMITED_API #ifndef PY_NO_SHORT_FLOAT_REPR #ifdef __cplusplus extern "C" { #endif +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +/* These functions are used by modules compiled as C extension like math: + they must be exported. */ + PyAPI_FUNC(double) _Py_dg_strtod(const char *str, char **ptr); PyAPI_FUNC(char *) _Py_dg_dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve); @@ -11,9 +17,7 @@ PyAPI_FUNC(void) _Py_dg_freedtoa(char *s); PyAPI_FUNC(double) _Py_dg_stdnan(int sign); PyAPI_FUNC(double) _Py_dg_infinity(int sign); - #ifdef __cplusplus } #endif -#endif -#endif +#endif /* !PY_NO_SHORT_FLOAT_REPR */ diff --git a/Include/internal/pycore_gc.h b/Include/internal/pycore_gc.h new file mode 100644 index 0000000000000000000000000000000000000000..0511eea779a7e7dfa78d7676de3a3d1671a0fef7 --- /dev/null +++ b/Include/internal/pycore_gc.h @@ -0,0 +1,179 @@ +#ifndef Py_INTERNAL_GC_H +#define Py_INTERNAL_GC_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +/* GC information is stored BEFORE the object structure. */ +typedef struct { + // Pointer to next object in the list. + // 0 means the object is not tracked + uintptr_t _gc_next; + + // Pointer to previous object in the list. + // Lowest two bits are used for flags documented later. + uintptr_t _gc_prev; +} PyGC_Head; + +#define _Py_AS_GC(o) ((PyGC_Head *)(o)-1) + +/* True if the object is currently tracked by the GC. */ +#define _PyObject_GC_IS_TRACKED(o) (_Py_AS_GC(o)->_gc_next != 0) + +/* True if the object may be tracked by the GC in the future, or already is. + This can be useful to implement some optimizations. */ +#define _PyObject_GC_MAY_BE_TRACKED(obj) \ + (PyObject_IS_GC(obj) && \ + (!PyTuple_CheckExact(obj) || _PyObject_GC_IS_TRACKED(obj))) + + +/* Bit flags for _gc_prev */ +/* Bit 0 is set when tp_finalize is called */ +#define _PyGC_PREV_MASK_FINALIZED (1) +/* Bit 1 is set when the object is in generation which is GCed currently. */ +#define _PyGC_PREV_MASK_COLLECTING (2) +/* The (N-2) most significant bits contain the real address. */ +#define _PyGC_PREV_SHIFT (2) +#define _PyGC_PREV_MASK (((uintptr_t) -1) << _PyGC_PREV_SHIFT) + +// Lowest bit of _gc_next is used for flags only in GC. +// But it is always 0 for normal code. +#define _PyGCHead_NEXT(g) ((PyGC_Head*)(g)->_gc_next) +#define _PyGCHead_SET_NEXT(g, p) ((g)->_gc_next = (uintptr_t)(p)) + +// Lowest two bits of _gc_prev is used for _PyGC_PREV_MASK_* flags. +#define _PyGCHead_PREV(g) ((PyGC_Head*)((g)->_gc_prev & _PyGC_PREV_MASK)) +#define _PyGCHead_SET_PREV(g, p) do { \ + assert(((uintptr_t)p & ~_PyGC_PREV_MASK) == 0); \ + (g)->_gc_prev = ((g)->_gc_prev & ~_PyGC_PREV_MASK) \ + | ((uintptr_t)(p)); \ + } while (0) + +#define _PyGCHead_FINALIZED(g) \ + (((g)->_gc_prev & _PyGC_PREV_MASK_FINALIZED) != 0) +#define _PyGCHead_SET_FINALIZED(g) \ + ((g)->_gc_prev |= _PyGC_PREV_MASK_FINALIZED) + +#define _PyGC_FINALIZED(o) \ + _PyGCHead_FINALIZED(_Py_AS_GC(o)) +#define _PyGC_SET_FINALIZED(o) \ + _PyGCHead_SET_FINALIZED(_Py_AS_GC(o)) + + +/* GC runtime state */ + +/* If we change this, we need to change the default value in the + signature of gc.collect. */ +#define NUM_GENERATIONS 3 +/* + NOTE: about untracking of mutable objects. + + Certain types of container cannot participate in a reference cycle, and + so do not need to be tracked by the garbage collector. Untracking these + objects reduces the cost of garbage collections. However, determining + which objects may be untracked is not free, and the costs must be + weighed against the benefits for garbage collection. + + There are two possible strategies for when to untrack a container: + + i) When the container is created. + ii) When the container is examined by the garbage collector. + + Tuples containing only immutable objects (integers, strings etc, and + recursively, tuples of immutable objects) do not need to be tracked. + The interpreter creates a large number of tuples, many of which will + not survive until garbage collection. It is therefore not worthwhile + to untrack eligible tuples at creation time. + + Instead, all tuples except the empty tuple are tracked when created. + During garbage collection it is determined whether any surviving tuples + can be untracked. A tuple can be untracked if all of its contents are + already not tracked. Tuples are examined for untracking in all garbage + collection cycles. It may take more than one cycle to untrack a tuple. + + Dictionaries containing only immutable objects also do not need to be + tracked. Dictionaries are untracked when created. If a tracked item is + inserted into a dictionary (either as a key or value), the dictionary + becomes tracked. During a full garbage collection (all generations), + the collector will untrack any dictionaries whose contents are not + tracked. + + The module provides the python function is_tracked(obj), which returns + the CURRENT tracking status of the object. Subsequent garbage + collections may change the tracking status of the object. + + Untracking of certain containers was introduced in issue #4688, and + the algorithm was refined in response to issue #14775. +*/ + +struct gc_generation { + PyGC_Head head; + int threshold; /* collection threshold */ + int count; /* count of allocations or collections of younger + generations */ +}; + +/* Running stats per generation */ +struct gc_generation_stats { + /* total number of collections */ + Py_ssize_t collections; + /* total number of collected objects */ + Py_ssize_t collected; + /* total number of uncollectable objects (put into gc.garbage) */ + Py_ssize_t uncollectable; +}; + +struct _gc_runtime_state { + /* List of objects that still need to be cleaned up, singly linked + * via their gc headers' gc_prev pointers. */ + PyObject *trash_delete_later; + /* Current call-stack depth of tp_dealloc calls. */ + int trash_delete_nesting; + + int enabled; + int debug; + /* linked lists of container objects */ + struct gc_generation generations[NUM_GENERATIONS]; + PyGC_Head *generation0; + /* a permanent generation which won't be collected */ + struct gc_generation permanent_generation; + struct gc_generation_stats generation_stats[NUM_GENERATIONS]; + /* true if we are currently running the collector */ + int collecting; + /* list of uncollectable objects */ + PyObject *garbage; + /* a list of callbacks to be invoked when collection is performed */ + PyObject *callbacks; + /* This is the number of objects that survived the last full + collection. It approximates the number of long lived objects + tracked by the GC. + + (by "full collection", we mean a collection of the oldest + generation). */ + Py_ssize_t long_lived_total; + /* This is the number of objects that survived all "non-full" + collections, and are awaiting to undergo a full collection for + the first time. */ + Py_ssize_t long_lived_pending; +}; + +PyAPI_FUNC(void) _PyGC_InitState(struct _gc_runtime_state *); + + +// Functions to clear types free lists +extern void _PyFrame_ClearFreeList(void); +extern void _PyTuple_ClearFreeList(void); +extern void _PyFloat_ClearFreeList(void); +extern void _PyList_ClearFreeList(void); +extern void _PyDict_ClearFreeList(void); +extern void _PyAsyncGen_ClearFreeLists(void); +extern void _PyContext_ClearFreeList(void); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_GC_H */ diff --git a/Include/internal/pycore_gil.h b/Include/internal/pycore_gil.h index 7de316397b15e8ac9bbbc5ddb280bff19519f786..8ebad37b686cd4c9cdfd4236b2bd9387497f489e 100644 --- a/Include/internal/pycore_gil.h +++ b/Include/internal/pycore_gil.h @@ -8,8 +8,8 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_condvar.h" -#include "pycore_atomic.h" +#include "pycore_atomic.h" /* _Py_atomic_address */ +#include "pycore_condvar.h" /* PyCOND_T */ #ifndef Py_HAVE_CONDVAR # error You need either a POSIX-compatible or a Windows system! diff --git a/Include/internal/pycore_hamt.h b/Include/internal/pycore_hamt.h index e65aef5e21a9548493a1e797881e42bd72f8382a..aaf655909551af4704c98a1c4a1dbd80b29aaf79 100644 --- a/Include/internal/pycore_hamt.h +++ b/Include/internal/pycore_hamt.h @@ -8,7 +8,7 @@ #define _Py_HAMT_MAX_TREE_DEPTH 7 -#define PyHamt_Check(o) (Py_TYPE(o) == &_PyHamt_Type) +#define PyHamt_Check(o) Py_IS_TYPE(o, &_PyHamt_Type) /* Abstract tree node. */ diff --git a/Modules/hashtable.h b/Include/internal/pycore_hashtable.h similarity index 30% rename from Modules/hashtable.h rename to Include/internal/pycore_hashtable.h index dbec23d28518729a8d5632449f884ccf86d29447..18757abc28c195883b6e3e1cd39e501a85e45381 100644 --- a/Modules/hashtable.h +++ b/Include/internal/pycore_hashtable.h @@ -1,7 +1,12 @@ -#ifndef Py_HASHTABLE_H -#define Py_HASHTABLE_H -/* The whole API is private */ -#ifndef Py_LIMITED_API +#ifndef Py_INTERNAL_HASHTABLE_H +#define Py_INTERNAL_HASHTABLE_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif /* Single linked list */ @@ -25,117 +30,72 @@ typedef struct { _Py_slist_item_t _Py_slist_item; Py_uhash_t key_hash; - - /* key (key_size bytes) and then data (data_size bytes) follows */ + void *key; + void *value; } _Py_hashtable_entry_t; -#define _Py_HASHTABLE_ENTRY_PKEY(ENTRY) \ - ((const void *)((char *)(ENTRY) \ - + sizeof(_Py_hashtable_entry_t))) - -#define _Py_HASHTABLE_ENTRY_PDATA(TABLE, ENTRY) \ - ((const void *)((char *)(ENTRY) \ - + sizeof(_Py_hashtable_entry_t) \ - + (TABLE)->key_size)) - -/* Get a key value from pkey: use memcpy() rather than a pointer dereference - to avoid memory alignment issues. */ -#define _Py_HASHTABLE_READ_KEY(TABLE, PKEY, DST_KEY) \ - do { \ - assert(sizeof(DST_KEY) == (TABLE)->key_size); \ - memcpy(&(DST_KEY), (PKEY), sizeof(DST_KEY)); \ - } while (0) - -#define _Py_HASHTABLE_ENTRY_READ_KEY(TABLE, ENTRY, KEY) \ - do { \ - assert(sizeof(KEY) == (TABLE)->key_size); \ - memcpy(&(KEY), _Py_HASHTABLE_ENTRY_PKEY(ENTRY), sizeof(KEY)); \ - } while (0) - -#define _Py_HASHTABLE_ENTRY_READ_DATA(TABLE, ENTRY, DATA) \ - do { \ - assert(sizeof(DATA) == (TABLE)->data_size); \ - memcpy(&(DATA), _Py_HASHTABLE_ENTRY_PDATA(TABLE, (ENTRY)), \ - sizeof(DATA)); \ - } while (0) - -#define _Py_HASHTABLE_ENTRY_WRITE_DATA(TABLE, ENTRY, DATA) \ - do { \ - assert(sizeof(DATA) == (TABLE)->data_size); \ - memcpy((void *)_Py_HASHTABLE_ENTRY_PDATA((TABLE), (ENTRY)), \ - &(DATA), sizeof(DATA)); \ - } while (0) - /* _Py_hashtable: prototypes */ /* Forward declaration */ struct _Py_hashtable_t; +typedef struct _Py_hashtable_t _Py_hashtable_t; -typedef Py_uhash_t (*_Py_hashtable_hash_func) (struct _Py_hashtable_t *ht, - const void *pkey); -typedef int (*_Py_hashtable_compare_func) (struct _Py_hashtable_t *ht, - const void *pkey, - const _Py_hashtable_entry_t *he); +typedef Py_uhash_t (*_Py_hashtable_hash_func) (const void *key); +typedef int (*_Py_hashtable_compare_func) (const void *key1, const void *key2); +typedef void (*_Py_hashtable_destroy_func) (void *key); +typedef _Py_hashtable_entry_t* (*_Py_hashtable_get_entry_func)(_Py_hashtable_t *ht, + const void *key); typedef struct { - /* allocate a memory block */ + // Allocate a memory block void* (*malloc) (size_t size); - /* release a memory block */ + // Release a memory block void (*free) (void *ptr); } _Py_hashtable_allocator_t; /* _Py_hashtable: table */ - -typedef struct _Py_hashtable_t { - size_t num_buckets; - size_t entries; /* Total number of entries in the table. */ +struct _Py_hashtable_t { + size_t nentries; // Total number of entries in the table + size_t nbuckets; _Py_slist_t *buckets; - size_t key_size; - size_t data_size; + _Py_hashtable_get_entry_func get_entry_func; _Py_hashtable_hash_func hash_func; _Py_hashtable_compare_func compare_func; + _Py_hashtable_destroy_func key_destroy_func; + _Py_hashtable_destroy_func value_destroy_func; _Py_hashtable_allocator_t alloc; -} _Py_hashtable_t; +}; -/* hash a pointer (void*) */ -PyAPI_FUNC(Py_uhash_t) _Py_hashtable_hash_ptr( - struct _Py_hashtable_t *ht, - const void *pkey); +/* Hash a pointer (void*) */ +PyAPI_FUNC(Py_uhash_t) _Py_hashtable_hash_ptr(const void *key); -/* comparison using memcmp() */ +/* Comparison using memcmp() */ PyAPI_FUNC(int) _Py_hashtable_compare_direct( - _Py_hashtable_t *ht, - const void *pkey, - const _Py_hashtable_entry_t *entry); + const void *key1, + const void *key2); PyAPI_FUNC(_Py_hashtable_t *) _Py_hashtable_new( - size_t key_size, - size_t data_size, _Py_hashtable_hash_func hash_func, _Py_hashtable_compare_func compare_func); PyAPI_FUNC(_Py_hashtable_t *) _Py_hashtable_new_full( - size_t key_size, - size_t data_size, - size_t init_size, _Py_hashtable_hash_func hash_func, _Py_hashtable_compare_func compare_func, + _Py_hashtable_destroy_func key_destroy_func, + _Py_hashtable_destroy_func value_destroy_func, _Py_hashtable_allocator_t *allocator); PyAPI_FUNC(void) _Py_hashtable_destroy(_Py_hashtable_t *ht); -/* Return a copy of the hash table */ -PyAPI_FUNC(_Py_hashtable_t *) _Py_hashtable_copy(_Py_hashtable_t *src); - PyAPI_FUNC(void) _Py_hashtable_clear(_Py_hashtable_t *ht); typedef int (*_Py_hashtable_foreach_func) (_Py_hashtable_t *ht, - _Py_hashtable_entry_t *entry, - void *arg); + const void *key, const void *value, + void *user_data); /* Call func() on each entry of the hashtable. Iteration stops if func() result is non-zero, in this case it's the result @@ -143,69 +103,46 @@ typedef int (*_Py_hashtable_foreach_func) (_Py_hashtable_t *ht, PyAPI_FUNC(int) _Py_hashtable_foreach( _Py_hashtable_t *ht, _Py_hashtable_foreach_func func, - void *arg); + void *user_data); -PyAPI_FUNC(size_t) _Py_hashtable_size(_Py_hashtable_t *ht); +PyAPI_FUNC(size_t) _Py_hashtable_size(const _Py_hashtable_t *ht); /* Add a new entry to the hash. The key must not be present in the hash table. - Return 0 on success, -1 on memory error. - - Don't call directly this function, - but use _Py_HASHTABLE_SET() and _Py_HASHTABLE_SET_NODATA() macros */ + Return 0 on success, -1 on memory error. */ PyAPI_FUNC(int) _Py_hashtable_set( _Py_hashtable_t *ht, - size_t key_size, - const void *pkey, - size_t data_size, - const void *data); - -#define _Py_HASHTABLE_SET(TABLE, KEY, DATA) \ - _Py_hashtable_set(TABLE, sizeof(KEY), &(KEY), sizeof(DATA), &(DATA)) - -#define _Py_HASHTABLE_SET_NODATA(TABLE, KEY) \ - _Py_hashtable_set(TABLE, sizeof(KEY), &(KEY), 0, NULL) + const void *key, + void *value); /* Get an entry. - Return NULL if the key does not exist. - - Don't call directly this function, but use _Py_HASHTABLE_GET_ENTRY() - macro */ -PyAPI_FUNC(_Py_hashtable_entry_t*) _Py_hashtable_get_entry( - _Py_hashtable_t *ht, - size_t key_size, - const void *pkey); - -#define _Py_HASHTABLE_GET_ENTRY(TABLE, KEY) \ - _Py_hashtable_get_entry(TABLE, sizeof(KEY), &(KEY)) + Return NULL if the key does not exist. */ +static inline _Py_hashtable_entry_t * +_Py_hashtable_get_entry(_Py_hashtable_t *ht, const void *key) +{ + return ht->get_entry_func(ht, key); +} -/* Get data from an entry. Copy entry data into data and return 1 if the entry - exists, return 0 if the entry does not exist. +/* Get value from an entry. + Return NULL if the entry is not found. - Don't call directly this function, but use _Py_HASHTABLE_GET() macro */ -PyAPI_FUNC(int) _Py_hashtable_get( - _Py_hashtable_t *ht, - size_t key_size, - const void *pkey, - size_t data_size, - void *data); + Use _Py_hashtable_get_entry() to distinguish entry value equal to NULL + and entry not found. */ +PyAPI_FUNC(void*) _Py_hashtable_get(_Py_hashtable_t *ht, const void *key); -#define _Py_HASHTABLE_GET(TABLE, KEY, DATA) \ - _Py_hashtable_get(TABLE, sizeof(KEY), &(KEY), sizeof(DATA), &(DATA)) +/* Remove a key and its associated value without calling key and value destroy + functions. -/* Don't call directly this function, but use _Py_HASHTABLE_POP() macro */ -PyAPI_FUNC(int) _Py_hashtable_pop( + Return the removed value if the key was found. + Return NULL if the key was not found. */ +PyAPI_FUNC(void*) _Py_hashtable_steal( _Py_hashtable_t *ht, - size_t key_size, - const void *pkey, - size_t data_size, - void *data); - -#define _Py_HASHTABLE_POP(TABLE, KEY, DATA) \ - _Py_hashtable_pop(TABLE, sizeof(KEY), &(KEY), sizeof(DATA), &(DATA)) + const void *key); -#endif /* Py_LIMITED_API */ +#ifdef __cplusplus +} #endif +#endif /* !Py_INTERNAL_HASHTABLE_H */ diff --git a/Include/internal/pycore_import.h b/Include/internal/pycore_import.h new file mode 100644 index 0000000000000000000000000000000000000000..b011ea4425112b13fc214de954f348df3f09f92b --- /dev/null +++ b/Include/internal/pycore_import.h @@ -0,0 +1,22 @@ +#ifndef Py_LIMITED_API +#ifndef Py_INTERNAL_IMPORT_H +#define Py_INTERNAL_IMPORT_H +#ifdef __cplusplus +extern "C" { +#endif + +PyAPI_FUNC(PyObject *) _PyImport_FindBuiltin( + PyThreadState *tstate, + const char *name /* UTF-8 encoded string */ + ); + +#ifdef HAVE_FORK +extern void _PyImport_ReInitLock(void); +#endif +extern void _PyImport_Cleanup(PyThreadState *tstate); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_IMPORT_H */ +#endif /* !Py_LIMITED_API */ diff --git a/Include/internal/pycore_initconfig.h b/Include/internal/pycore_initconfig.h index 40831c44b2fa674be62fe60eafbe16b842eb1f34..457a005860b2026f29d9699bc5e9d8cc9ec2668f 100644 --- a/Include/internal/pycore_initconfig.h +++ b/Include/internal/pycore_initconfig.h @@ -8,7 +8,8 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_pystate.h" /* _PyRuntimeState */ +/* Forward declaration */ +struct pyruntimestate; /* --- PyStatus ----------------------------------------------- */ @@ -60,7 +61,7 @@ PyAPI_FUNC(PyObject*) _PyWideStringList_AsList(const PyWideStringList *list); /* --- _PyArgv ---------------------------------------------------- */ -typedef struct { +typedef struct _PyArgv { Py_ssize_t argc; int use_bytes_argv; char * const *bytes_argv; @@ -149,8 +150,8 @@ extern PyStatus _PyConfig_Copy( PyConfig *config, const PyConfig *config2); extern PyStatus _PyConfig_InitPathConfig(PyConfig *config); -extern void _PyConfig_Write(const PyConfig *config, - _PyRuntimeState *runtime); +extern PyStatus _PyConfig_Write(const PyConfig *config, + struct pyruntimestate *runtime); extern PyStatus _PyConfig_SetPyArgv( PyConfig *config, const _PyArgv *args); diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h new file mode 100644 index 0000000000000000000000000000000000000000..551ad833bb69271864bcd31dbf6bfee66ea05dd7 --- /dev/null +++ b/Include/internal/pycore_interp.h @@ -0,0 +1,192 @@ +#ifndef Py_INTERNAL_INTERP_H +#define Py_INTERNAL_INTERP_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_atomic.h" /* _Py_atomic_address */ +#include "pycore_gil.h" /* struct _gil_runtime_state */ +#include "pycore_gc.h" /* struct _gc_runtime_state */ +#include "pycore_warnings.h" /* struct _warnings_runtime_state */ + +/* ceval state */ + +struct _pending_calls { + PyThread_type_lock lock; + /* Request for running pending calls. */ + _Py_atomic_int calls_to_do; + /* Request for looking at the `async_exc` field of the current + thread state. + Guarded by the GIL. */ + int async_exc; +#define NPENDINGCALLS 32 + struct { + int (*func)(void *); + void *arg; + } calls[NPENDINGCALLS]; + int first; + int last; +}; + +struct _ceval_state { + int recursion_limit; + /* Records whether tracing is on for any thread. Counts the number + of threads for which tstate->c_tracefunc is non-NULL, so if the + value is 0, we know we don't have to check this thread's + c_tracefunc. This speeds up the if statement in + _PyEval_EvalFrameDefault() after fast_next_opcode. */ + int tracing_possible; + /* This single variable consolidates all requests to break out of + the fast path in the eval loop. */ + _Py_atomic_int eval_breaker; + /* Request for dropping the GIL */ + _Py_atomic_int gil_drop_request; + struct _pending_calls pending; +}; + +/* fs_codec.encoding is initialized to NULL. + Later, it is set to a non-NULL string by _PyUnicode_InitEncodings(). */ +struct _Py_unicode_fs_codec { + char *encoding; // Filesystem encoding (encoded to UTF-8) + int utf8; // encoding=="utf-8"? + char *errors; // Filesystem errors (encoded to UTF-8) + _Py_error_handler error_handler; +}; + +struct _Py_unicode_state { + struct _Py_unicode_fs_codec fs_codec; +}; + + +/* interpreter state */ + +#define _PY_NSMALLPOSINTS 257 +#define _PY_NSMALLNEGINTS 5 + +// The PyInterpreterState typedef is in Include/pystate.h. +struct _is { + + struct _is *next; + struct _ts *tstate_head; + + /* Reference to the _PyRuntime global variable. This field exists + to not have to pass runtime in addition to tstate to a function. + Get runtime from tstate: tstate->interp->runtime. */ + struct pyruntimestate *runtime; + + int64_t id; + int64_t id_refcount; + int requires_idref; + PyThread_type_lock id_mutex; + + int finalizing; + + struct _ceval_state ceval; + struct _gc_runtime_state gc; + + PyObject *modules; + PyObject *modules_by_index; + PyObject *sysdict; + PyObject *builtins; + PyObject *importlib; + + /* Used in Modules/_threadmodule.c. */ + long num_threads; + /* Support for runtime thread stack size tuning. + A value of 0 means using the platform's default stack size + or the size specified by the THREAD_STACK_SIZE macro. */ + /* Used in Python/thread.c. */ + size_t pythread_stacksize; + + PyObject *codec_search_path; + PyObject *codec_search_cache; + PyObject *codec_error_registry; + int codecs_initialized; + + struct _Py_unicode_state unicode; + + PyConfig config; +#ifdef HAVE_DLOPEN + int dlopenflags; +#endif + + PyObject *dict; /* Stores per-interpreter state */ + + PyObject *builtins_copy; + PyObject *import_func; + /* Initialized to PyEval_EvalFrameDefault(). */ + _PyFrameEvalFunction eval_frame; + + Py_ssize_t co_extra_user_count; + freefunc co_extra_freefuncs[MAX_CO_EXTRA_USERS]; + +#ifdef HAVE_FORK + PyObject *before_forkers; + PyObject *after_forkers_parent; + PyObject *after_forkers_child; +#endif + /* AtExit module */ + void (*pyexitfunc)(PyObject *); + PyObject *pyexitmodule; + + uint64_t tstate_next_unique_id; + + struct _warnings_runtime_state warnings; + + PyObject *audit_hooks; + + struct { + struct { + int level; + int atbol; + } listnode; + } parser; + +#if _PY_NSMALLNEGINTS + _PY_NSMALLPOSINTS > 0 + /* Small integers are preallocated in this array so that they + can be shared. + The integers that are preallocated are those in the range + -_PY_NSMALLNEGINTS (inclusive) to _PY_NSMALLPOSINTS (not inclusive). + */ + PyLongObject* small_ints[_PY_NSMALLNEGINTS + _PY_NSMALLPOSINTS]; +#endif +}; + +/* Used by _PyImport_Cleanup() */ +extern void _PyInterpreterState_ClearModules(PyInterpreterState *interp); + +extern PyStatus _PyInterpreterState_SetConfig( + PyInterpreterState *interp, + const PyConfig *config); + + + +/* cross-interpreter data registry */ + +/* For now we use a global registry of shareable classes. An + alternative would be to add a tp_* slot for a class's + crossinterpdatafunc. It would be simpler and more efficient. */ + +struct _xidregitem; + +struct _xidregitem { + PyTypeObject *cls; + crossinterpdatafunc getdata; + struct _xidregitem *next; +}; + +PyAPI_FUNC(struct _is*) _PyInterpreterState_LookUpID(int64_t); + +PyAPI_FUNC(int) _PyInterpreterState_IDInitref(struct _is *); +PyAPI_FUNC(void) _PyInterpreterState_IDIncref(struct _is *); +PyAPI_FUNC(void) _PyInterpreterState_IDDecref(struct _is *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_INTERP_H */ + diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h index 7418c6936b8f0b8eda6cef18b65e11aa08de450a..32e86d06db5b432b65aae3d30092ef5bcde34444 100644 --- a/Include/internal/pycore_object.h +++ b/Include/internal/pycore_object.h @@ -8,7 +8,9 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_pystate.h" /* _PyRuntime */ +#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() +#include "pycore_interp.h" // PyInterpreterState.gc +#include "pycore_pystate.h" // _PyThreadState_GET() PyAPI_FUNC(int) _PyType_CheckConsistency(PyTypeObject *type); PyAPI_FUNC(int) _PyDict_CheckConsistency(PyObject *mp, int check_content); @@ -18,7 +20,7 @@ PyAPI_FUNC(int) _PyDict_CheckConsistency(PyObject *mp, int check_content); * NB: While the object is tracked by the collector, it must be safe to call the * ob_traverse method. * - * Internal note: _PyRuntime.gc.generation0->_gc_prev doesn't have any bit flags + * Internal note: interp->gc.generation0->_gc_prev doesn't have any bit flags * because it's not object header. So we don't use _PyGCHead_PREV() and * _PyGCHead_SET_PREV() for it to avoid unnecessary bitwise operations. * @@ -37,11 +39,13 @@ static inline void _PyObject_GC_TRACK_impl(const char *filename, int lineno, "object is in generation which is garbage collected", filename, lineno, "_PyObject_GC_TRACK"); - PyGC_Head *last = (PyGC_Head*)(_PyRuntime.gc.generation0->_gc_prev); + PyThreadState *tstate = _PyThreadState_GET(); + PyGC_Head *generation0 = tstate->interp->gc.generation0; + PyGC_Head *last = (PyGC_Head*)(generation0->_gc_prev); _PyGCHead_SET_NEXT(last, gc); _PyGCHead_SET_PREV(gc, last); - _PyGCHead_SET_NEXT(gc, _PyRuntime.gc.generation0); - _PyRuntime.gc.generation0->_gc_prev = (uintptr_t)gc; + _PyGCHead_SET_NEXT(gc, generation0); + generation0->_gc_prev = (uintptr_t)gc; } #define _PyObject_GC_TRACK(op) \ @@ -75,6 +79,41 @@ static inline void _PyObject_GC_UNTRACK_impl(const char *filename, int lineno, #define _PyObject_GC_UNTRACK(op) \ _PyObject_GC_UNTRACK_impl(__FILE__, __LINE__, _PyObject_CAST(op)) +#ifdef Py_REF_DEBUG +extern void _PyDebug_PrintTotalRefs(void); +#endif + +#ifdef Py_TRACE_REFS +extern void _Py_AddToAllObjects(PyObject *op, int force); +extern void _Py_PrintReferences(FILE *); +extern void _Py_PrintReferenceAddresses(FILE *); +#endif + +static inline PyObject ** +_PyObject_GET_WEAKREFS_LISTPTR(PyObject *op) +{ + Py_ssize_t offset = Py_TYPE(op)->tp_weaklistoffset; + return (PyObject **)((char *)op + offset); +} + +// Fast inlined version of PyType_HasFeature() +static inline int +_PyType_HasFeature(PyTypeObject *type, unsigned long feature) { + return ((type->tp_flags & feature) != 0); +} + +// Fast inlined version of PyObject_IS_GC() +static inline int +_PyObject_IS_GC(PyObject *obj) +{ + return (PyType_IS_GC(Py_TYPE(obj)) + && (Py_TYPE(obj)->tp_is_gc == NULL + || Py_TYPE(obj)->tp_is_gc(obj))); +} + +// Fast inlined version of PyType_IS_GC() +#define _PyType_IS_GC(t) _PyType_HasFeature((t), Py_TPFLAGS_HAVE_GC) + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_pathconfig.h b/Include/internal/pycore_pathconfig.h index ce75ccee835a204230fe92f93cae9e4a5761e1a7..42d61b1ca26bdfd0d6715192383271591e796f11 100644 --- a/Include/internal/pycore_pathconfig.h +++ b/Include/internal/pycore_pathconfig.h @@ -47,8 +47,6 @@ PyAPI_DATA(wchar_t*) _Py_dll_path; #endif extern void _PyPathConfig_ClearGlobal(void); -extern PyStatus _PyPathConfig_SetGlobal( - const struct _PyPathConfig *pathconfig); extern PyStatus _PyPathConfig_Calculate( _PyPathConfig *pathconfig, @@ -56,11 +54,10 @@ extern PyStatus _PyPathConfig_Calculate( extern int _PyPathConfig_ComputeSysPath0( const PyWideStringList *argv, PyObject **path0); -extern int _Py_FindEnvConfigValue( +extern PyStatus _Py_FindEnvConfigValue( FILE *env_file, const wchar_t *key, - wchar_t *value, - size_t value_size); + wchar_t **value_p); #ifdef MS_WINDOWS extern wchar_t* _Py_GetDLLPath(void); diff --git a/Include/internal/pycore_pyerrors.h b/Include/internal/pycore_pyerrors.h index 23327ef78397430e841d329f457978116bb3e7c8..2cf1160afc01490621d828108acc7afcb1ec30f2 100644 --- a/Include/internal/pycore_pyerrors.h +++ b/Include/internal/pycore_pyerrors.h @@ -10,7 +10,22 @@ extern "C" { static inline PyObject* _PyErr_Occurred(PyThreadState *tstate) { - return tstate == NULL ? NULL : tstate->curexc_type; + assert(tstate != NULL); + return tstate->curexc_type; +} + +static inline void _PyErr_ClearExcState(_PyErr_StackItem *exc_state) +{ + PyObject *t, *v, *tb; + t = exc_state->exc_type; + v = exc_state->exc_value; + tb = exc_state->exc_traceback; + exc_state->exc_type = NULL; + exc_state->exc_value = NULL; + exc_state->exc_traceback = NULL; + Py_XDECREF(t); + Py_XDECREF(v); + Py_XDECREF(tb); } @@ -35,10 +50,15 @@ PyAPI_FUNC(void) _PyErr_SetObject( PyObject *type, PyObject *value); +PyAPI_FUNC(void) _PyErr_ChainStackItem( + _PyErr_StackItem *exc_info); + PyAPI_FUNC(void) _PyErr_Clear(PyThreadState *tstate); PyAPI_FUNC(void) _PyErr_SetNone(PyThreadState *tstate, PyObject *exception); +PyAPI_FUNC(PyObject *) _PyErr_NoMemory(PyThreadState *tstate); + PyAPI_FUNC(void) _PyErr_SetString( PyThreadState *tstate, PyObject *exception, @@ -56,6 +76,14 @@ PyAPI_FUNC(void) _PyErr_NormalizeException( PyObject **val, PyObject **tb); +PyAPI_FUNC(PyObject *) _PyErr_FormatFromCauseTstate( + PyThreadState *tstate, + PyObject *exception, + const char *format, + ...); + +PyAPI_FUNC(int) _PyErr_CheckSignalsTstate(PyThreadState *tstate); + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index d4f0ae2da72e407c9dff1b3ec28925f696b01d3d..50ab645fc7485973e41201d764de3653227ae50d 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -8,8 +8,9 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_initconfig.h" /* _PyArgv */ -#include "pycore_pystate.h" /* _PyRuntimeState */ +/* Forward declarations */ +struct _PyArgv; +struct pyruntimestate; /* True if the main interpreter thread exited due to an unhandled * KeyboardInterrupt exception, suggesting the user pressed ^C. */ @@ -32,74 +33,69 @@ PyAPI_FUNC(int) _Py_IsLocaleCoercionTarget(const char *ctype_loc); extern PyStatus _PyUnicode_Init(void); extern int _PyStructSequence_Init(void); -extern int _PyLong_Init(void); +extern int _PyLong_Init(PyThreadState *tstate); extern PyStatus _PyFaulthandler_Init(int enable); extern int _PyTraceMalloc_Init(int enable); -extern PyObject * _PyBuiltin_Init(void); +extern PyObject * _PyBuiltin_Init(PyThreadState *tstate); extern PyStatus _PySys_Create( - _PyRuntimeState *runtime, - PyInterpreterState *interp, + PyThreadState *tstate, PyObject **sysmod_p); -extern PyStatus _PySys_SetPreliminaryStderr(PyObject *sysdict); extern PyStatus _PySys_ReadPreinitWarnOptions(PyWideStringList *options); extern PyStatus _PySys_ReadPreinitXOptions(PyConfig *config); -extern int _PySys_InitMain( - _PyRuntimeState *runtime, - PyInterpreterState *interp); -extern PyStatus _PyImport_Init(PyInterpreterState *interp); +extern int _PySys_InitMain(PyThreadState *tstate); extern PyStatus _PyExc_Init(void); extern PyStatus _PyErr_Init(void); extern PyStatus _PyBuiltins_AddExceptions(PyObject * bltinmod); -extern PyStatus _PyImportHooks_Init(void); +extern PyStatus _PyImportHooks_Init(PyThreadState *tstate); extern int _PyFloat_Init(void); extern PyStatus _Py_HashRandomization_Init(const PyConfig *); extern PyStatus _PyTypes_Init(void); -extern PyStatus _PyImportZip_Init(PyInterpreterState *interp); +extern PyStatus _PyTypes_InitSlotDefs(void); +extern PyStatus _PyImportZip_Init(PyThreadState *tstate); +extern PyStatus _PyGC_Init(PyThreadState *tstate); /* Various internal finalizers */ -extern void PyMethod_Fini(void); -extern void PyFrame_Fini(void); -extern void PyCFunction_Fini(void); -extern void PyDict_Fini(void); -extern void PyTuple_Fini(void); -extern void PyList_Fini(void); -extern void PySet_Fini(void); -extern void PyBytes_Fini(void); -extern void PyFloat_Fini(void); +extern void _PyFrame_Fini(void); +extern void _PyDict_Fini(void); +extern void _PyTuple_Fini(void); +extern void _PyList_Fini(void); +extern void _PySet_Fini(void); +extern void _PyBytes_Fini(void); +extern void _PyFloat_Fini(void); +extern void _PySlice_Fini(void); +extern void _PyAsyncGen_Fini(void); + +extern int _PySignal_Init(int install_signal_handlers); extern void PyOS_FiniInterrupts(void); -extern void PySlice_Fini(void); -extern void PyAsyncGen_Fini(void); extern void _PyExc_Fini(void); extern void _PyImport_Fini(void); extern void _PyImport_Fini2(void); -extern void _PyGC_Fini(_PyRuntimeState *runtime); +extern void _PyGC_Fini(PyThreadState *tstate); extern void _PyType_Fini(void); extern void _Py_HashRandomization_Fini(void); -extern void _PyUnicode_Fini(void); -extern void PyLong_Fini(void); +extern void _PyUnicode_Fini(PyThreadState *tstate); +extern void _PyLong_Fini(PyThreadState *tstate); extern void _PyFaulthandler_Fini(void); extern void _PyHash_Fini(void); extern void _PyTraceMalloc_Fini(void); extern void _PyWarnings_Fini(PyInterpreterState *interp); +extern void _PyAST_Fini(void); -extern void _PyGILState_Init( - _PyRuntimeState *runtime, - PyInterpreterState *interp, - PyThreadState *tstate); -extern void _PyGILState_Fini(_PyRuntimeState *runtime); +extern PyStatus _PyGILState_Init(PyThreadState *tstate); +extern void _PyGILState_Fini(PyThreadState *tstate); -PyAPI_FUNC(void) _PyGC_DumpShutdownStats(_PyRuntimeState *runtime); +PyAPI_FUNC(void) _PyGC_DumpShutdownStats(PyThreadState *tstate); PyAPI_FUNC(PyStatus) _Py_PreInitializeFromPyArgv( const PyPreConfig *src_config, - const _PyArgv *args); + const struct _PyArgv *args); PyAPI_FUNC(PyStatus) _Py_PreInitializeFromConfig( const PyConfig *config, - const _PyArgv *args); + const struct _PyArgv *args); PyAPI_FUNC(int) _Py_HandleSystemExit(int *exitcode_p); @@ -110,6 +106,8 @@ PyAPI_FUNC(void) _PyErr_Print(PyThreadState *tstate); PyAPI_FUNC(void) _PyErr_Display(PyObject *file, PyObject *exception, PyObject *value, PyObject *tb); +PyAPI_FUNC(void) _PyThreadState_DeleteCurrent(PyThreadState *tstate); + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_pymem.h b/Include/internal/pycore_pymem.h index 47d092f3e53ff3a511365027f140edc4ec1c55a7..3d925e2250d25218bef240b535d93ac2d71ea388 100644 --- a/Include/internal/pycore_pymem.h +++ b/Include/internal/pycore_pymem.h @@ -8,144 +8,7 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "objimpl.h" -#include "pymem.h" - - -/* GC runtime state */ - -/* If we change this, we need to change the default value in the - signature of gc.collect. */ -#define NUM_GENERATIONS 3 - -/* - NOTE: about the counting of long-lived objects. - - To limit the cost of garbage collection, there are two strategies; - - make each collection faster, e.g. by scanning fewer objects - - do less collections - This heuristic is about the latter strategy. - - In addition to the various configurable thresholds, we only trigger a - full collection if the ratio - long_lived_pending / long_lived_total - is above a given value (hardwired to 25%). - - The reason is that, while "non-full" collections (i.e., collections of - the young and middle generations) will always examine roughly the same - number of objects -- determined by the aforementioned thresholds --, - the cost of a full collection is proportional to the total number of - long-lived objects, which is virtually unbounded. - - Indeed, it has been remarked that doing a full collection every - of object creations entails a dramatic performance - degradation in workloads which consist in creating and storing lots of - long-lived objects (e.g. building a large list of GC-tracked objects would - show quadratic performance, instead of linear as expected: see issue #4074). - - Using the above ratio, instead, yields amortized linear performance in - the total number of objects (the effect of which can be summarized - thusly: "each full garbage collection is more and more costly as the - number of objects grows, but we do fewer and fewer of them"). - - This heuristic was suggested by Martin von Löwis on python-dev in - June 2008. His original analysis and proposal can be found at: - http://mail.python.org/pipermail/python-dev/2008-June/080579.html -*/ - -/* - NOTE: about untracking of mutable objects. - - Certain types of container cannot participate in a reference cycle, and - so do not need to be tracked by the garbage collector. Untracking these - objects reduces the cost of garbage collections. However, determining - which objects may be untracked is not free, and the costs must be - weighed against the benefits for garbage collection. - - There are two possible strategies for when to untrack a container: - - i) When the container is created. - ii) When the container is examined by the garbage collector. - - Tuples containing only immutable objects (integers, strings etc, and - recursively, tuples of immutable objects) do not need to be tracked. - The interpreter creates a large number of tuples, many of which will - not survive until garbage collection. It is therefore not worthwhile - to untrack eligible tuples at creation time. - - Instead, all tuples except the empty tuple are tracked when created. - During garbage collection it is determined whether any surviving tuples - can be untracked. A tuple can be untracked if all of its contents are - already not tracked. Tuples are examined for untracking in all garbage - collection cycles. It may take more than one cycle to untrack a tuple. - - Dictionaries containing only immutable objects also do not need to be - tracked. Dictionaries are untracked when created. If a tracked item is - inserted into a dictionary (either as a key or value), the dictionary - becomes tracked. During a full garbage collection (all generations), - the collector will untrack any dictionaries whose contents are not - tracked. - - The module provides the python function is_tracked(obj), which returns - the CURRENT tracking status of the object. Subsequent garbage - collections may change the tracking status of the object. - - Untracking of certain containers was introduced in issue #4688, and - the algorithm was refined in response to issue #14775. -*/ - -struct gc_generation { - PyGC_Head head; - int threshold; /* collection threshold */ - int count; /* count of allocations or collections of younger - generations */ -}; - -/* Running stats per generation */ -struct gc_generation_stats { - /* total number of collections */ - Py_ssize_t collections; - /* total number of collected objects */ - Py_ssize_t collected; - /* total number of uncollectable objects (put into gc.garbage) */ - Py_ssize_t uncollectable; -}; - -struct _gc_runtime_state { - /* List of objects that still need to be cleaned up, singly linked - * via their gc headers' gc_prev pointers. */ - PyObject *trash_delete_later; - /* Current call-stack depth of tp_dealloc calls. */ - int trash_delete_nesting; - - int enabled; - int debug; - /* linked lists of container objects */ - struct gc_generation generations[NUM_GENERATIONS]; - PyGC_Head *generation0; - /* a permanent generation which won't be collected */ - struct gc_generation permanent_generation; - struct gc_generation_stats generation_stats[NUM_GENERATIONS]; - /* true if we are currently running the collector */ - int collecting; - /* list of uncollectable objects */ - PyObject *garbage; - /* a list of callbacks to be invoked when collection is performed */ - PyObject *callbacks; - /* This is the number of objects that survived the last full - collection. It approximates the number of long lived objects - tracked by the GC. - - (by "full collection", we mean a collection of the oldest - generation). */ - Py_ssize_t long_lived_total; - /* This is the number of objects that survived all "non-full" - collections, and are awaiting to undergo a full collection for - the first time. */ - Py_ssize_t long_lived_pending; -}; - -PyAPI_FUNC(void) _PyGC_Initialize(struct _gc_runtime_state *); +#include "pymem.h" // PyMemAllocatorName /* Set the memory allocator of the specified domain to the default. @@ -206,6 +69,35 @@ PyAPI_FUNC(int) _PyMem_GetAllocatorName( PYMEM_ALLOCATOR_NOT_SET does nothing. */ PyAPI_FUNC(int) _PyMem_SetupAllocators(PyMemAllocatorName allocator); +/* bpo-35053: Expose _Py_tracemalloc_config for _Py_NewReference() + which access directly _Py_tracemalloc_config.tracing for best + performances. */ +struct _PyTraceMalloc_Config { + /* Module initialized? + Variable protected by the GIL */ + enum { + TRACEMALLOC_NOT_INITIALIZED, + TRACEMALLOC_INITIALIZED, + TRACEMALLOC_FINALIZED + } initialized; + + /* Is tracemalloc tracing memory allocations? + Variable protected by the GIL */ + int tracing; + + /* limit of the number of frames in a traceback, 1 by default. + Variable protected by the GIL. */ + int max_nframe; +}; + +#define _PyTraceMalloc_Config_INIT \ + {.initialized = TRACEMALLOC_NOT_INITIALIZED, \ + .tracing = 0, \ + .max_nframe = 1} + +PyAPI_DATA(struct _PyTraceMalloc_Config) _Py_tracemalloc_config; + + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 96d5e31d83a6e9485812efc71e8e22fb14ff7988..835d6e029c44988acf7721452320c8bd97f9b7b5 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -8,270 +8,52 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "cpython/initconfig.h" -#include "fileobject.h" -#include "pystate.h" -#include "pythread.h" -#include "sysmodule.h" - -#include "pycore_gil.h" /* _gil_runtime_state */ -#include "pycore_pathconfig.h" -#include "pycore_pymem.h" -#include "pycore_warnings.h" - - -/* ceval state */ - -struct _pending_calls { - int finishing; - PyThread_type_lock lock; - /* Request for running pending calls. */ - _Py_atomic_int calls_to_do; - /* Request for looking at the `async_exc` field of the current - thread state. - Guarded by the GIL. */ - int async_exc; -#define NPENDINGCALLS 32 - struct { - int (*func)(void *); - void *arg; - } calls[NPENDINGCALLS]; - int first; - int last; -}; - -struct _ceval_runtime_state { - int recursion_limit; - /* Records whether tracing is on for any thread. Counts the number - of threads for which tstate->c_tracefunc is non-NULL, so if the - value is 0, we know we don't have to check this thread's - c_tracefunc. This speeds up the if statement in - PyEval_EvalFrameEx() after fast_next_opcode. */ - int tracing_possible; - /* This single variable consolidates all requests to break out of - the fast path in the eval loop. */ - _Py_atomic_int eval_breaker; - /* Request for dropping the GIL */ - _Py_atomic_int gil_drop_request; - struct _pending_calls pending; - /* Request for checking signals. */ - _Py_atomic_int signals_pending; - struct _gil_runtime_state gil; -}; - -/* interpreter state */ - -typedef PyObject* (*_PyFrameEvalFunction)(struct _frame *, int); - -// The PyInterpreterState typedef is in Include/pystate.h. -struct _is { - - struct _is *next; - struct _ts *tstate_head; - - int64_t id; - int64_t id_refcount; - int requires_idref; - PyThread_type_lock id_mutex; - - int finalizing; - - PyObject *modules; - PyObject *modules_by_index; - PyObject *sysdict; - PyObject *builtins; - PyObject *importlib; - - /* Used in Python/sysmodule.c. */ - int check_interval; - - /* Used in Modules/_threadmodule.c. */ - long num_threads; - /* Support for runtime thread stack size tuning. - A value of 0 means using the platform's default stack size - or the size specified by the THREAD_STACK_SIZE macro. */ - /* Used in Python/thread.c. */ - size_t pythread_stacksize; - - PyObject *codec_search_path; - PyObject *codec_search_cache; - PyObject *codec_error_registry; - int codecs_initialized; - - /* fs_codec.encoding is initialized to NULL. - Later, it is set to a non-NULL string by _PyUnicode_InitEncodings(). */ - struct { - char *encoding; /* Filesystem encoding (encoded to UTF-8) */ - char *errors; /* Filesystem errors (encoded to UTF-8) */ - _Py_error_handler error_handler; - } fs_codec; - - PyConfig config; -#ifdef HAVE_DLOPEN - int dlopenflags; -#endif - - PyObject *dict; /* Stores per-interpreter state */ - - PyObject *builtins_copy; - PyObject *import_func; - /* Initialized to PyEval_EvalFrameDefault(). */ - _PyFrameEvalFunction eval_frame; - - Py_ssize_t co_extra_user_count; - freefunc co_extra_freefuncs[MAX_CO_EXTRA_USERS]; - -#ifdef HAVE_FORK - PyObject *before_forkers; - PyObject *after_forkers_parent; - PyObject *after_forkers_child; -#endif - /* AtExit module */ - void (*pyexitfunc)(PyObject *); - PyObject *pyexitmodule; - - uint64_t tstate_next_unique_id; - - struct _warnings_runtime_state warnings; - - PyObject *audit_hooks; -}; - -PyAPI_FUNC(struct _is*) _PyInterpreterState_LookUpID(PY_INT64_T); - -PyAPI_FUNC(int) _PyInterpreterState_IDInitref(struct _is *); -PyAPI_FUNC(void) _PyInterpreterState_IDIncref(struct _is *); -PyAPI_FUNC(void) _PyInterpreterState_IDDecref(struct _is *); - - -/* cross-interpreter data registry */ - -/* For now we use a global registry of shareable classes. An - alternative would be to add a tp_* slot for a class's - crossinterpdatafunc. It would be simpler and more efficient. */ - -struct _xidregitem; - -struct _xidregitem { - PyTypeObject *cls; - crossinterpdatafunc getdata; - struct _xidregitem *next; -}; - -/* runtime audit hook state */ - -typedef struct _Py_AuditHookEntry { - struct _Py_AuditHookEntry *next; - Py_AuditHookFunction hookCFunction; - void *userData; -} _Py_AuditHookEntry; - -/* GIL state */ - -struct _gilstate_runtime_state { - int check_enabled; - /* Assuming the current thread holds the GIL, this is the - PyThreadState for the current thread. */ - _Py_atomic_address tstate_current; - PyThreadFrameGetter getframe; - /* The single PyInterpreterState used by this process' - GILState implementation - */ - /* TODO: Given interp_main, it may be possible to kill this ref */ - PyInterpreterState *autoInterpreterState; - Py_tss_t autoTSSkey; -}; - -/* hook for PyEval_GetFrame(), requested for Psyco */ -#define _PyThreadState_GetFrame _PyRuntime.gilstate.getframe - -/* Issue #26558: Flag to disable PyGILState_Check(). - If set to non-zero, PyGILState_Check() always return 1. */ -#define _PyGILState_check_enabled _PyRuntime.gilstate.check_enabled - - -/* Full Python runtime state */ +#include "pycore_runtime.h" /* PyRuntimeState */ -typedef struct pyruntimestate { - /* Is running Py_PreInitialize()? */ - int preinitializing; - /* Is Python preinitialized? Set to 1 by Py_PreInitialize() */ - int preinitialized; - - /* Is Python core initialized? Set to 1 by _Py_InitializeCore() */ - int core_initialized; - - /* Is Python fully initialized? Set to 1 by Py_Initialize() */ - int initialized; - - /* Set by Py_FinalizeEx(). Only reset to NULL if Py_Initialize() - is called again. */ - PyThreadState *finalizing; - - struct pyinterpreters { - PyThread_type_lock mutex; - PyInterpreterState *head; - PyInterpreterState *main; - /* _next_interp_id is an auto-numbered sequence of small - integers. It gets initialized in _PyInterpreterState_Init(), - which is called in Py_Initialize(), and used in - PyInterpreterState_New(). A negative interpreter ID - indicates an error occurred. The main interpreter will - always have an ID of 0. Overflow results in a RuntimeError. - If that becomes a problem later then we can adjust, e.g. by - using a Python int. */ - int64_t next_id; - } interpreters; - // XXX Remove this field once we have a tp_* slot. - struct _xidregistry { - PyThread_type_lock mutex; - struct _xidregitem *head; - } xidregistry; - - unsigned long main_thread; +/* Check if the current thread is the main thread. + Use _Py_IsMainInterpreter() to check if it's the main interpreter. */ +static inline int +_Py_IsMainThread(void) +{ + unsigned long thread = PyThread_get_thread_ident(); + return (thread == _PyRuntime.main_thread); +} -#define NEXITFUNCS 32 - void (*exitfuncs[NEXITFUNCS])(void); - int nexitfuncs; - struct _gc_runtime_state gc; - struct _ceval_runtime_state ceval; - struct _gilstate_runtime_state gilstate; +static inline int +_Py_IsMainInterpreter(PyThreadState* tstate) +{ + /* Use directly _PyRuntime rather than tstate->interp->runtime, since + this function is used in performance critical code path (ceval) */ + return (tstate->interp == _PyRuntime.interpreters.main); +} - PyPreConfig preconfig; - Py_OpenCodeHookFunction open_code_hook; - void *open_code_userdata; - _Py_AuditHookEntry *audit_hook_head; +/* Only handle signals on the main thread of the main interpreter. */ +static inline int +_Py_ThreadCanHandleSignals(PyInterpreterState *interp) +{ + return (_Py_IsMainThread() && interp == _PyRuntime.interpreters.main); +} - // XXX Consolidate globals found via the check-c-globals script. -} _PyRuntimeState; - -#define _PyRuntimeState_INIT \ - {.preinitialized = 0, .core_initialized = 0, .initialized = 0} -/* Note: _PyRuntimeState_INIT sets other fields to 0/NULL */ - -PyAPI_DATA(_PyRuntimeState) _PyRuntime; -PyAPI_FUNC(PyStatus) _PyRuntimeState_Init(_PyRuntimeState *runtime); -PyAPI_FUNC(void) _PyRuntimeState_Fini(_PyRuntimeState *runtime); -PyAPI_FUNC(void) _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime); -/* Initialize _PyRuntimeState. - Return NULL on success, or return an error message on failure. */ -PyAPI_FUNC(PyStatus) _PyRuntime_Initialize(void); - -PyAPI_FUNC(void) _PyRuntime_Finalize(void); - -#define _Py_CURRENTLY_FINALIZING(runtime, tstate) \ - (runtime->finalizing == tstate) +/* Only execute pending calls on the main thread. */ +static inline int +_Py_ThreadCanHandlePendingCalls(void) +{ + return _Py_IsMainThread(); +} /* Variable and macro for in-line access to current thread and interpreter state */ -#define _PyRuntimeState_GetThreadState(runtime) \ - ((PyThreadState*)_Py_atomic_load_relaxed(&(runtime)->gilstate.tstate_current)) +static inline PyThreadState* +_PyRuntimeState_GetThreadState(_PyRuntimeState *runtime) +{ + return (PyThreadState*)_Py_atomic_load_relaxed(&runtime->gilstate.tstate_current); +} /* Get the current Python thread state. @@ -282,12 +64,31 @@ PyAPI_FUNC(void) _PyRuntime_Finalize(void); The caller must hold the GIL. See also PyThreadState_Get() and PyThreadState_GET(). */ -#define _PyThreadState_GET() _PyRuntimeState_GetThreadState(&_PyRuntime) +static inline PyThreadState* +_PyThreadState_GET(void) +{ + return _PyRuntimeState_GetThreadState(&_PyRuntime); +} /* Redefine PyThreadState_GET() as an alias to _PyThreadState_GET() */ #undef PyThreadState_GET #define PyThreadState_GET() _PyThreadState_GET() +PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalError_TstateNULL(const char *func); + +static inline void +_Py_EnsureFuncTstateNotNULL(const char *func, PyThreadState *tstate) +{ + if (tstate == NULL) { + _Py_FatalError_TstateNULL(func); + } +} + +// Call Py_FatalError() if tstate is NULL +#define _Py_EnsureTstateNotNULL(tstate) \ + _Py_EnsureFuncTstateNotNULL(__func__, tstate) + + /* Get the current interpreter state. The macro is unsafe: it does not check for error and it can return NULL. @@ -296,13 +97,18 @@ PyAPI_FUNC(void) _PyRuntime_Finalize(void); See also _PyInterpreterState_Get() and _PyGILState_GetInterpreterStateUnsafe(). */ -#define _PyInterpreterState_GET_UNSAFE() (_PyThreadState_GET()->interp) +static inline PyInterpreterState* _PyInterpreterState_GET(void) { + PyThreadState *tstate = _PyThreadState_GET(); +#ifdef Py_DEBUG + _Py_EnsureTstateNotNULL(tstate); +#endif + return tstate->interp; +} /* Other */ PyAPI_FUNC(void) _PyThreadState_Init( - _PyRuntimeState *runtime, PyThreadState *tstate); PyAPI_FUNC(void) _PyThreadState_DeleteExcept( _PyRuntimeState *runtime, @@ -318,6 +124,12 @@ PyAPI_FUNC(void) _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime); PyAPI_FUNC(void) _PyGILState_Reinit(_PyRuntimeState *runtime); +PyAPI_FUNC(int) _PyState_AddModule( + PyThreadState *tstate, + PyObject* module, + struct PyModuleDef* def); + + PyAPI_FUNC(int) _PyOS_InterruptOccurred(PyThreadState *tstate); #ifdef __cplusplus diff --git a/Include/internal/pycore_runtime.h b/Include/internal/pycore_runtime.h new file mode 100644 index 0000000000000000000000000000000000000000..34eb492b9f254f8faabef434cebb252249ff07b3 --- /dev/null +++ b/Include/internal/pycore_runtime.h @@ -0,0 +1,144 @@ +#ifndef Py_INTERNAL_RUNTIME_H +#define Py_INTERNAL_RUNTIME_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_atomic.h" /* _Py_atomic_address */ +#include "pycore_gil.h" // struct _gil_runtime_state + +/* ceval state */ + +struct _ceval_runtime_state { + /* Request for checking signals. It is shared by all interpreters (see + bpo-40513). Any thread of any interpreter can receive a signal, but only + the main thread of the main interpreter can handle signals: see + _Py_ThreadCanHandleSignals(). */ + _Py_atomic_int signals_pending; + struct _gil_runtime_state gil; +}; + +/* GIL state */ + +struct _gilstate_runtime_state { + /* bpo-26558: Flag to disable PyGILState_Check(). + If set to non-zero, PyGILState_Check() always return 1. */ + int check_enabled; + /* Assuming the current thread holds the GIL, this is the + PyThreadState for the current thread. */ + _Py_atomic_address tstate_current; + /* The single PyInterpreterState used by this process' + GILState implementation + */ + /* TODO: Given interp_main, it may be possible to kill this ref */ + PyInterpreterState *autoInterpreterState; + Py_tss_t autoTSSkey; +}; + +/* Runtime audit hook state */ + +typedef struct _Py_AuditHookEntry { + struct _Py_AuditHookEntry *next; + Py_AuditHookFunction hookCFunction; + void *userData; +} _Py_AuditHookEntry; + +/* Full Python runtime state */ + +typedef struct pyruntimestate { + /* Is running Py_PreInitialize()? */ + int preinitializing; + + /* Is Python preinitialized? Set to 1 by Py_PreInitialize() */ + int preinitialized; + + /* Is Python core initialized? Set to 1 by _Py_InitializeCore() */ + int core_initialized; + + /* Is Python fully initialized? Set to 1 by Py_Initialize() */ + int initialized; + + /* Set by Py_FinalizeEx(). Only reset to NULL if Py_Initialize() + is called again. + + Use _PyRuntimeState_GetFinalizing() and _PyRuntimeState_SetFinalizing() + to access it, don't access it directly. */ + _Py_atomic_address _finalizing; + + struct pyinterpreters { + PyThread_type_lock mutex; + PyInterpreterState *head; + PyInterpreterState *main; + /* _next_interp_id is an auto-numbered sequence of small + integers. It gets initialized in _PyInterpreterState_Init(), + which is called in Py_Initialize(), and used in + PyInterpreterState_New(). A negative interpreter ID + indicates an error occurred. The main interpreter will + always have an ID of 0. Overflow results in a RuntimeError. + If that becomes a problem later then we can adjust, e.g. by + using a Python int. */ + int64_t next_id; + } interpreters; + // XXX Remove this field once we have a tp_* slot. + struct _xidregistry { + PyThread_type_lock mutex; + struct _xidregitem *head; + } xidregistry; + + unsigned long main_thread; + +#define NEXITFUNCS 32 + void (*exitfuncs[NEXITFUNCS])(void); + int nexitfuncs; + + struct _ceval_runtime_state ceval; + 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; + +#define _PyRuntimeState_INIT \ + {.preinitialized = 0, .core_initialized = 0, .initialized = 0} +/* Note: _PyRuntimeState_INIT sets other fields to 0/NULL */ + + +PyAPI_DATA(_PyRuntimeState) _PyRuntime; + +PyAPI_FUNC(PyStatus) _PyRuntimeState_Init(_PyRuntimeState *runtime); +PyAPI_FUNC(void) _PyRuntimeState_Fini(_PyRuntimeState *runtime); + +#ifdef HAVE_FORK +PyAPI_FUNC(void) _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime); +#endif + +/* Initialize _PyRuntimeState. + Return NULL on success, or return an error message on failure. */ +PyAPI_FUNC(PyStatus) _PyRuntime_Initialize(void); + +PyAPI_FUNC(void) _PyRuntime_Finalize(void); + + +static inline PyThreadState* +_PyRuntimeState_GetFinalizing(_PyRuntimeState *runtime) { + return (PyThreadState*)_Py_atomic_load_relaxed(&runtime->_finalizing); +} + +static inline void +_PyRuntimeState_SetFinalizing(_PyRuntimeState *runtime, PyThreadState *tstate) { + _Py_atomic_store_relaxed(&runtime->_finalizing, (uintptr_t)tstate); +} + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_RUNTIME_H */ diff --git a/Include/internal/pycore_sysmodule.h b/Include/internal/pycore_sysmodule.h new file mode 100644 index 0000000000000000000000000000000000000000..738a7746a03842ed20feca6878339c95d878e960 --- /dev/null +++ b/Include/internal/pycore_sysmodule.h @@ -0,0 +1,24 @@ +#ifndef Py_INTERNAL_SYSMODULE_H +#define Py_INTERNAL_SYSMODULE_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +PyAPI_FUNC(int) _PySys_Audit( + PyThreadState *tstate, + const char *event, + const char *argFormat, + ...); + +/* We want minimal exposure of this function, so use extern rather than + PyAPI_FUNC() to not export the symbol. */ +extern void _PySys_ClearAuditHooks(PyThreadState *tstate); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_SYSMODULE_H */ diff --git a/Include/internal/pycore_traceback.h b/Include/internal/pycore_traceback.h index bf4d7fe5851f96fa58170068ba23955926fcc2a4..1f092411a72ba5c975d11a00cdd9e81ab5ab2f77 100644 --- a/Include/internal/pycore_traceback.h +++ b/Include/internal/pycore_traceback.h @@ -8,7 +8,8 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pystate.h" /* PyInterpreterState */ +/* Forward declaration */ +struct _is; /* Write the Python traceback into the file 'fd'. For example: @@ -56,7 +57,7 @@ PyAPI_FUNC(void) _Py_DumpTraceback( PyAPI_FUNC(const char*) _Py_DumpTracebackThreads( int fd, - PyInterpreterState *interp, + struct _is *interp, PyThreadState *current_tstate); /* Write a Unicode object into the file descriptor fd. Encode the string to @@ -88,7 +89,7 @@ PyAPI_FUNC(void) _Py_DumpHexadecimal( PyAPI_FUNC(PyObject*) _PyTraceBack_FromFrame( PyObject *tb_next, - struct _frame *frame); + PyFrameObject *frame); #ifdef __cplusplus } diff --git a/Include/internal/pycore_tupleobject.h b/Include/internal/pycore_tupleobject.h index 9fcfc5c6ec71960ca97387469b7c001ec4c89293..f95f16c0ed02f2d201ea5809bbb604c048e03778 100644 --- a/Include/internal/pycore_tupleobject.h +++ b/Include/internal/pycore_tupleobject.h @@ -8,7 +8,7 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "tupleobject.h" +#include "tupleobject.h" /* _PyTuple_CAST() */ #define _PyTuple_ITEMS(op) (_PyTuple_CAST(op)->ob_item) PyAPI_FUNC(PyObject *) _PyTuple_FromArray(PyObject *const *, Py_ssize_t); diff --git a/Include/internal/pycore_warnings.h b/Include/internal/pycore_warnings.h index 73e5350aff1451e01accdab1d63559d58276f2b7..cafe305edb0e02429926090d763857855c06a0a4 100644 --- a/Include/internal/pycore_warnings.h +++ b/Include/internal/pycore_warnings.h @@ -8,8 +8,6 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "object.h" - struct _warnings_runtime_state { /* Both 'filters' and 'onceregistry' can be set in warnings.py; get_warnings_attr() will reset these variables accordingly. */ @@ -19,6 +17,8 @@ struct _warnings_runtime_state { long filters_version; }; +extern PyStatus _PyWarnings_InitState(PyThreadState *tstate); + #ifdef __cplusplus } #endif diff --git a/Include/iterobject.h b/Include/iterobject.h index f61726f1f7f83af90a53ef1488b7dad385444698..51139bf1874088965d0f341e442f653a2c5aae0f 100644 --- a/Include/iterobject.h +++ b/Include/iterobject.h @@ -7,14 +7,13 @@ extern "C" { PyAPI_DATA(PyTypeObject) PySeqIter_Type; PyAPI_DATA(PyTypeObject) PyCallIter_Type; -PyAPI_DATA(PyTypeObject) PyCmpWrapper_Type; -#define PySeqIter_Check(op) (Py_TYPE(op) == &PySeqIter_Type) +#define PySeqIter_Check(op) Py_IS_TYPE(op, &PySeqIter_Type) PyAPI_FUNC(PyObject *) PySeqIter_New(PyObject *); -#define PyCallIter_Check(op) (Py_TYPE(op) == &PyCallIter_Type) +#define PyCallIter_Check(op) Py_IS_TYPE(op, &PyCallIter_Type) PyAPI_FUNC(PyObject *) PyCallIter_New(PyObject *, PyObject *); diff --git a/Include/listobject.h b/Include/listobject.h index 6057279d51c3a482510e0a69ad7f99103344fe8c..2a8a25525d1d7bf660ab7ed55592a4714ac6c5af 100644 --- a/Include/listobject.h +++ b/Include/listobject.h @@ -1,16 +1,14 @@ +/* List object interface -/* List object interface */ + Another generally useful object type is a list of object pointers. + This is a mutable type: the list items can be changed, and items can be + added or removed. Out-of-range indices or non-list objects are ignored. -/* -Another generally useful object type is a list of object pointers. -This is a mutable type: the list items can be changed, and items can be -added or removed. Out-of-range indices or non-list objects are ignored. - -*** WARNING *** PyList_SetItem does not increment the new item's reference -count, but does decrement the reference count of the item it replaces, -if not nil. It does *decrement* the reference count if it is *not* -inserted in the list. Similarly, PyList_GetItem does not increment the -returned item's reference count. + WARNING: PyList_SetItem does not increment the new item's reference count, + but does decrement the reference count of the item it replaces, if not nil. + It does *decrement* the reference count if it is *not* inserted in the list. + Similarly, PyList_GetItem does not increment the returned item's reference + count. */ #ifndef Py_LISTOBJECT_H @@ -19,60 +17,33 @@ returned item's reference count. extern "C" { #endif -#ifndef Py_LIMITED_API -typedef struct { - PyObject_VAR_HEAD - /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ - PyObject **ob_item; - - /* ob_item contains space for 'allocated' elements. The number - * currently in use is ob_size. - * Invariants: - * 0 <= ob_size <= allocated - * len(list) == ob_size - * ob_item == NULL implies ob_size == allocated == 0 - * list.sort() temporarily sets allocated to -1 to detect mutations. - * - * Items must normally not be NULL, except during construction when - * the list is not yet visible outside the function that builds it. - */ - Py_ssize_t allocated; -} PyListObject; -#endif - PyAPI_DATA(PyTypeObject) PyList_Type; PyAPI_DATA(PyTypeObject) PyListIter_Type; PyAPI_DATA(PyTypeObject) PyListRevIter_Type; -PyAPI_DATA(PyTypeObject) PySortWrapper_Type; #define PyList_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LIST_SUBCLASS) -#define PyList_CheckExact(op) (Py_TYPE(op) == &PyList_Type) +#define PyList_CheckExact(op) Py_IS_TYPE(op, &PyList_Type) PyAPI_FUNC(PyObject *) PyList_New(Py_ssize_t size); PyAPI_FUNC(Py_ssize_t) PyList_Size(PyObject *); + PyAPI_FUNC(PyObject *) PyList_GetItem(PyObject *, Py_ssize_t); PyAPI_FUNC(int) PyList_SetItem(PyObject *, Py_ssize_t, PyObject *); PyAPI_FUNC(int) PyList_Insert(PyObject *, Py_ssize_t, PyObject *); PyAPI_FUNC(int) PyList_Append(PyObject *, PyObject *); + PyAPI_FUNC(PyObject *) PyList_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t); PyAPI_FUNC(int) PyList_SetSlice(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *); + PyAPI_FUNC(int) PyList_Sort(PyObject *); PyAPI_FUNC(int) PyList_Reverse(PyObject *); PyAPI_FUNC(PyObject *) PyList_AsTuple(PyObject *); -#ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _PyList_Extend(PyListObject *, PyObject *); - -PyAPI_FUNC(int) PyList_ClearFreeList(void); -PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out); -#endif -/* Macro, trading safety for speed */ #ifndef Py_LIMITED_API -#define PyList_GET_ITEM(op, i) (((PyListObject *)(op))->ob_item[i]) -#define PyList_SET_ITEM(op, i, v) (((PyListObject *)(op))->ob_item[i] = (v)) -#define PyList_GET_SIZE(op) (assert(PyList_Check(op)),Py_SIZE(op)) -#define _PyList_ITEMS(op) (((PyListObject *)(op))->ob_item) +# define Py_CPYTHON_LISTOBJECT_H +# include "cpython/listobject.h" +# undef Py_CPYTHON_LISTOBJECT_H #endif #ifdef __cplusplus diff --git a/Include/longobject.h b/Include/longobject.h index 1e7a58d994b8a486e23a4f71cab0ff90d5560d2f..1b288099da8c837b7614f581b35d0e29564610d6 100644 --- a/Include/longobject.h +++ b/Include/longobject.h @@ -13,7 +13,7 @@ PyAPI_DATA(PyTypeObject) PyLong_Type; #define PyLong_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LONG_SUBCLASS) -#define PyLong_CheckExact(op) (Py_TYPE(op) == &PyLong_Type) +#define PyLong_CheckExact(op) Py_IS_TYPE(op, &PyLong_Type) PyAPI_FUNC(PyObject *) PyLong_FromLong(long); PyAPI_FUNC(PyObject *) PyLong_FromUnsignedLong(unsigned long); @@ -74,7 +74,7 @@ PyAPI_FUNC(int) _PyLong_Size_t_Converter(PyObject *, void *); #endif /* Used by Python/mystrtoul.c, _PyBytes_FromHex(), - _PyBytes_DecodeEscapeRecode(), etc. */ + _PyBytes_DecodeEscape(), etc. */ #ifndef Py_LIMITED_API PyAPI_DATA(unsigned char) _PyLong_DigitValue[256]; #endif diff --git a/Include/memoryobject.h b/Include/memoryobject.h index 990a716f220399a11af26a78c15682d9e3ca358b..306028f4b225d8bbd0f0d443969b696cce991fed 100644 --- a/Include/memoryobject.h +++ b/Include/memoryobject.h @@ -11,7 +11,7 @@ PyAPI_DATA(PyTypeObject) _PyManagedBuffer_Type; #endif PyAPI_DATA(PyTypeObject) PyMemoryView_Type; -#define PyMemoryView_Check(op) (Py_TYPE(op) == &PyMemoryView_Type) +#define PyMemoryView_Check(op) Py_IS_TYPE(op, &PyMemoryView_Type) #ifndef Py_LIMITED_API /* Get a pointer to the memoryview's private copy of the exporter's buffer. */ diff --git a/Include/methodobject.h b/Include/methodobject.h index ba3b8878a6c4191aab079c5ed5a014ed3bc68dd5..12e049b4043ba59fe15ea709f261cdce10a29a79 100644 --- a/Include/methodobject.h +++ b/Include/methodobject.h @@ -13,7 +13,8 @@ extern "C" { PyAPI_DATA(PyTypeObject) PyCFunction_Type; -#define PyCFunction_Check(op) (Py_TYPE(op) == &PyCFunction_Type) +#define PyCFunction_CheckExact(op) Py_IS_TYPE(op, &PyCFunction_Type) +#define PyCFunction_Check(op) PyObject_TypeCheck(op, &PyCFunction_Type) typedef PyObject *(*PyCFunction)(PyObject *, PyObject *); typedef PyObject *(*_PyCFunctionFast) (PyObject *, PyObject *const *, Py_ssize_t); @@ -22,31 +23,14 @@ typedef PyObject *(*PyCFunctionWithKeywords)(PyObject *, PyObject *, typedef PyObject *(*_PyCFunctionFastWithKeywords) (PyObject *, PyObject *const *, Py_ssize_t, PyObject *); -typedef PyObject *(*PyNoArgsFunction)(PyObject *); +typedef PyObject *(*PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, + size_t, PyObject *); PyAPI_FUNC(PyCFunction) PyCFunction_GetFunction(PyObject *); PyAPI_FUNC(PyObject *) PyCFunction_GetSelf(PyObject *); PyAPI_FUNC(int) PyCFunction_GetFlags(PyObject *); -/* Macros for direct access to these values. Type checks are *not* - done, so use with care. */ -#ifndef Py_LIMITED_API -#define PyCFunction_GET_FUNCTION(func) \ - (((PyCFunctionObject *)func) -> m_ml -> ml_meth) -#define PyCFunction_GET_SELF(func) \ - (((PyCFunctionObject *)func) -> m_ml -> ml_flags & METH_STATIC ? \ - NULL : ((PyCFunctionObject *)func) -> m_self) -#define PyCFunction_GET_FLAGS(func) \ - (((PyCFunctionObject *)func) -> m_ml -> ml_flags) -#endif -PyAPI_FUNC(PyObject *) PyCFunction_Call(PyObject *, PyObject *, PyObject *); - -#ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _PyCFunction_FastCallDict(PyObject *func, - PyObject *const *args, - Py_ssize_t nargs, - PyObject *kwargs); -#endif +Py_DEPRECATED(3.9) PyAPI_FUNC(PyObject *) PyCFunction_Call(PyObject *, PyObject *, PyObject *); struct PyMethodDef { const char *ml_name; /* The name of the built-in function/method */ @@ -61,6 +45,13 @@ typedef struct PyMethodDef PyMethodDef; PyAPI_FUNC(PyObject *) PyCFunction_NewEx(PyMethodDef *, PyObject *, PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000 +#define PyCFunction_NewEx(ML, SELF, MOD) PyCMethod_New((ML), (SELF), (MOD), NULL) +PyAPI_FUNC(PyObject *) PyCMethod_New(PyMethodDef *, PyObject *, + PyObject *, PyTypeObject *); +#endif + + /* Flag passed to newmethodobject */ /* #define METH_OLDARGS 0x0000 -- unsupported now */ #define METH_VARARGS 0x0001 @@ -93,36 +84,24 @@ PyAPI_FUNC(PyObject *) PyCFunction_NewEx(PyMethodDef *, PyObject *, #define METH_STACKLESS 0x0000 #endif -#ifndef Py_LIMITED_API -typedef struct { - PyObject_HEAD - PyMethodDef *m_ml; /* Description of the C function to call */ - PyObject *m_self; /* Passed as 'self' arg to the C func, can be NULL */ - PyObject *m_module; /* The __module__ attribute, can be anything */ - PyObject *m_weakreflist; /* List of weak references */ - vectorcallfunc vectorcall; -} PyCFunctionObject; - -PyAPI_FUNC(PyObject *) _PyMethodDef_RawFastCallDict( - PyMethodDef *method, - PyObject *self, - PyObject *const *args, - Py_ssize_t nargs, - PyObject *kwargs); - -PyAPI_FUNC(PyObject *) _PyMethodDef_RawFastCallKeywords( - PyMethodDef *method, - PyObject *self, - PyObject *const *args, - Py_ssize_t nargs, - PyObject *kwnames); +/* METH_METHOD means the function stores an + * additional reference to the class that defines it; + * both self and class are passed to it. + * It uses PyCMethodObject instead of PyCFunctionObject. + * May not be combined with METH_NOARGS, METH_O, METH_CLASS or METH_STATIC. + */ + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000 +#define METH_METHOD 0x0200 #endif -PyAPI_FUNC(int) PyCFunction_ClearFreeList(void); #ifndef Py_LIMITED_API -PyAPI_FUNC(void) _PyCFunction_DebugMallocStats(FILE *out); -PyAPI_FUNC(void) _PyMethod_DebugMallocStats(FILE *out); + +#define Py_CPYTHON_METHODOBJECT_H +#include "cpython/methodobject.h" +#undef Py_CPYTHON_METHODOBJECT_H + #endif #ifdef __cplusplus diff --git a/Include/modsupport.h b/Include/modsupport.h index f90ede4831e32ba0bf17f9c7b6716afdb3cb6531..4c4aab65bac10376e1f6b3e44df13ff6df8f73a9 100644 --- a/Include/modsupport.h +++ b/Include/modsupport.h @@ -60,9 +60,12 @@ PyAPI_FUNC(int) _PyArg_UnpackStack( ...); PyAPI_FUNC(int) _PyArg_NoKeywords(const char *funcname, PyObject *kwargs); +PyAPI_FUNC(int) _PyArg_NoKwnames(const char *funcname, PyObject *kwnames); PyAPI_FUNC(int) _PyArg_NoPositional(const char *funcname, PyObject *args); #define _PyArg_NoKeywords(funcname, kwargs) \ ((kwargs) == NULL || _PyArg_NoKeywords((funcname), (kwargs))) +#define _PyArg_NoKwnames(funcname, kwnames) \ + ((kwnames) == NULL || _PyArg_NoKwnames((funcname), (kwnames))) #define _PyArg_NoPositional(funcname, args) \ ((args) == NULL || _PyArg_NoPositional((funcname), (args))) @@ -136,6 +139,10 @@ void _PyArg_Fini(void); PyAPI_FUNC(int) PyModule_AddObject(PyObject *, const char *, PyObject *); PyAPI_FUNC(int) PyModule_AddIntConstant(PyObject *, const char *, long); PyAPI_FUNC(int) PyModule_AddStringConstant(PyObject *, const char *, const char *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000 +/* New in 3.9 */ +PyAPI_FUNC(int) PyModule_AddType(PyObject *module, PyTypeObject *type); +#endif /* Py_LIMITED_API */ #define PyModule_AddIntMacro(m, c) PyModule_AddIntConstant(m, #c, c) #define PyModule_AddStringMacro(m, c) PyModule_AddStringConstant(m, #c, c) diff --git a/Include/moduleobject.h b/Include/moduleobject.h index e246fd2faf9184805a48f93d346a960ed9726868..cf9ad40c0a17a0518f169d9d0d18645206da0cbb 100644 --- a/Include/moduleobject.h +++ b/Include/moduleobject.h @@ -10,7 +10,7 @@ extern "C" { PyAPI_DATA(PyTypeObject) PyModule_Type; #define PyModule_Check(op) PyObject_TypeCheck(op, &PyModule_Type) -#define PyModule_CheckExact(op) (Py_TYPE(op) == &PyModule_Type) +#define PyModule_CheckExact(op) Py_IS_TYPE(op, &PyModule_Type) #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 PyAPI_FUNC(PyObject *) PyModule_NewObject( diff --git a/Include/node.h b/Include/node.h index 2b39074097387335f3675271048b2f3783a7c7f0..ca24f289085920e5c87cbb27beed4cf4d7e19b22 100644 --- a/Include/node.h +++ b/Include/node.h @@ -31,7 +31,6 @@ PyAPI_FUNC(Py_ssize_t) _PyNode_SizeOf(node *n); #define NCH(n) ((n)->n_nchildren) #define CHILD(n, i) (&(n)->n_child[i]) -#define RCHILD(n, i) (CHILD(n, NCH(n) + i)) #define TYPE(n) ((n)->n_type) #define STR(n) ((n)->n_str) #define LINENO(n) ((n)->n_lineno) diff --git a/Include/object.h b/Include/object.h index 5558f65687adc05e00edcad040a0d01b0d777444..9c1a7f479e44906a2cf5a9f69e12dbfc7e7cf557 100644 --- a/Include/object.h +++ b/Include/object.h @@ -1,8 +1,6 @@ #ifndef Py_OBJECT_H #define Py_OBJECT_H -#include "pymem.h" /* _Py_tracemalloc_config */ - #ifdef __cplusplus extern "C" { #endif @@ -63,6 +61,9 @@ whose size is determined when the object is allocated. #error Py_LIMITED_API is incompatible with Py_DEBUG, Py_TRACE_REFS, and Py_REF_DEBUG #endif +/* PyTypeObject structure is defined in cpython/object.h. + In Py_LIMITED_API, PyTypeObject is an opaque structure. */ +typedef struct _typeobject PyTypeObject; #ifdef Py_TRACE_REFS /* Define pointers to support a doubly-linked list of all live heap objects. */ @@ -104,11 +105,12 @@ whose size is determined when the object is allocated. typedef struct _object { _PyObject_HEAD_EXTRA Py_ssize_t ob_refcnt; - struct _typeobject *ob_type; + PyTypeObject *ob_type; } PyObject; /* Cast argument to PyObject* type. */ #define _PyObject_CAST(op) ((PyObject*)(op)) +#define _PyObject_CAST_CONST(op) ((const PyObject*)(op)) typedef struct { PyObject ob_base; @@ -122,6 +124,27 @@ typedef struct { #define Py_TYPE(ob) (_PyObject_CAST(ob)->ob_type) #define Py_SIZE(ob) (_PyVarObject_CAST(ob)->ob_size) +static inline int _Py_IS_TYPE(const PyObject *ob, const PyTypeObject *type) { + return ob->ob_type == type; +} +#define Py_IS_TYPE(ob, type) _Py_IS_TYPE(_PyObject_CAST_CONST(ob), type) + +static inline void _Py_SET_REFCNT(PyObject *ob, Py_ssize_t refcnt) { + ob->ob_refcnt = refcnt; +} +#define Py_SET_REFCNT(ob, refcnt) _Py_SET_REFCNT(_PyObject_CAST(ob), refcnt) + +static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type) { + ob->ob_type = type; +} +#define Py_SET_TYPE(ob, type) _Py_SET_TYPE(_PyObject_CAST(ob), type) + +static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size) { + ob->ob_size = size; +} +#define Py_SET_SIZE(ob, size) _Py_SET_SIZE(_PyVarObject_CAST(ob), size) + + /* Type objects contain a string containing the type name (to help somewhat in debugging), the allocation parameters (see PyObject_New() and @@ -167,15 +190,8 @@ typedef PyObject *(*iternextfunc) (PyObject *); typedef PyObject *(*descrgetfunc) (PyObject *, PyObject *, PyObject *); typedef int (*descrsetfunc) (PyObject *, PyObject *, PyObject *); typedef int (*initproc)(PyObject *, PyObject *, PyObject *); -typedef PyObject *(*newfunc)(struct _typeobject *, PyObject *, PyObject *); -typedef PyObject *(*allocfunc)(struct _typeobject *, Py_ssize_t); - -#ifdef Py_LIMITED_API -/* In Py_LIMITED_API, PyTypeObject is an opaque structure. */ -typedef struct _typeobject PyTypeObject; -#else -/* PyTypeObject is defined in cpython/object.h */ -#endif +typedef PyObject *(*newfunc)(PyTypeObject *, PyObject *, PyObject *); +typedef PyObject *(*allocfunc)(PyTypeObject *, Py_ssize_t); typedef struct{ int slot; /* slot id, see below */ @@ -195,30 +211,31 @@ PyAPI_FUNC(PyObject*) PyType_FromSpec(PyType_Spec*); PyAPI_FUNC(PyObject*) PyType_FromSpecWithBases(PyType_Spec*, PyObject*); #endif #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000 -PyAPI_FUNC(void*) PyType_GetSlot(struct _typeobject*, int); +PyAPI_FUNC(void*) PyType_GetSlot(PyTypeObject*, int); +#endif +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000 +PyAPI_FUNC(PyObject*) PyType_FromModuleAndSpec(PyObject *, PyType_Spec *, PyObject *); +PyAPI_FUNC(PyObject *) PyType_GetModule(struct _typeobject *); +PyAPI_FUNC(void *) PyType_GetModuleState(struct _typeobject *); #endif /* Generic type check */ -PyAPI_FUNC(int) PyType_IsSubtype(struct _typeobject *, struct _typeobject *); +PyAPI_FUNC(int) PyType_IsSubtype(PyTypeObject *, PyTypeObject *); #define PyObject_TypeCheck(ob, tp) \ - (Py_TYPE(ob) == (tp) || PyType_IsSubtype(Py_TYPE(ob), (tp))) - -PyAPI_DATA(struct _typeobject) PyType_Type; /* built-in 'type' */ -PyAPI_DATA(struct _typeobject) PyBaseObject_Type; /* built-in 'object' */ -PyAPI_DATA(struct _typeobject) PySuper_Type; /* built-in 'super' */ + (Py_IS_TYPE(ob, tp) || PyType_IsSubtype(Py_TYPE(ob), (tp))) -PyAPI_FUNC(unsigned long) PyType_GetFlags(struct _typeobject*); +PyAPI_DATA(PyTypeObject) PyType_Type; /* built-in 'type' */ +PyAPI_DATA(PyTypeObject) PyBaseObject_Type; /* built-in 'object' */ +PyAPI_DATA(PyTypeObject) PySuper_Type; /* built-in 'super' */ -#define PyType_Check(op) \ - PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TYPE_SUBCLASS) -#define PyType_CheckExact(op) (Py_TYPE(op) == &PyType_Type) +PyAPI_FUNC(unsigned long) PyType_GetFlags(PyTypeObject*); -PyAPI_FUNC(int) PyType_Ready(struct _typeobject *); -PyAPI_FUNC(PyObject *) PyType_GenericAlloc(struct _typeobject *, Py_ssize_t); -PyAPI_FUNC(PyObject *) PyType_GenericNew(struct _typeobject *, +PyAPI_FUNC(int) PyType_Ready(PyTypeObject *); +PyAPI_FUNC(PyObject *) PyType_GenericAlloc(PyTypeObject *, Py_ssize_t); +PyAPI_FUNC(PyObject *) PyType_GenericNew(PyTypeObject *, PyObject *, PyObject *); PyAPI_FUNC(unsigned int) PyType_ClearCache(void); -PyAPI_FUNC(void) PyType_Modified(struct _typeobject *); +PyAPI_FUNC(void) PyType_Modified(PyTypeObject *); /* Generic operations on objects */ PyAPI_FUNC(PyObject *) PyObject_Repr(PyObject *); @@ -235,8 +252,7 @@ PyAPI_FUNC(int) PyObject_SetAttr(PyObject *, PyObject *, PyObject *); PyAPI_FUNC(int) PyObject_HasAttr(PyObject *, PyObject *); PyAPI_FUNC(PyObject *) PyObject_SelfIter(PyObject *); PyAPI_FUNC(PyObject *) PyObject_GenericGetAttr(PyObject *, PyObject *); -PyAPI_FUNC(int) PyObject_GenericSetAttr(PyObject *, - PyObject *, PyObject *); +PyAPI_FUNC(int) PyObject_GenericSetAttr(PyObject *, PyObject *, PyObject *); #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 PyAPI_FUNC(int) PyObject_GenericSetDict(PyObject *, PyObject *, void *); #endif @@ -290,7 +306,9 @@ given type object has a specified feature. /* Set if the type implements the vectorcall protocol (PEP 590) */ #ifndef Py_LIMITED_API -#define _Py_TPFLAGS_HAVE_VECTORCALL (1UL << 11) +#define Py_TPFLAGS_HAVE_VECTORCALL (1UL << 11) +// Backwards compatibility alias for API that was provisional in Python 3.8 +#define _Py_TPFLAGS_HAVE_VECTORCALL Py_TPFLAGS_HAVE_VECTORCALL #endif /* Set if the type is 'ready' -- fully initialized */ @@ -337,19 +355,14 @@ given type object has a specified feature. /* NOTE: The following flags reuse lower bits (removed as part of the * Python 3.0 transition). */ -/* The following flag is kept for compatibility. Starting with 3.8, - * binary compatibility of C extensions accross feature releases of +/* The following flag is kept for compatibility. Starting with 3.8, + * binary compatibility of C extensions across feature releases of * Python is not supported anymore, except when using the stable ABI. */ /* Type structure has tp_finalize member (3.4) */ #define Py_TPFLAGS_HAVE_FINALIZE (1UL << 0) -#ifdef Py_LIMITED_API -# define PyType_HasFeature(t,f) ((PyType_GetFlags(t) & (f)) != 0) -#endif -#define PyType_FastSubclass(t,f) PyType_HasFeature(t,f) - /* The macros Py_INCREF(op) and Py_DECREF(op) are used to increment or decrement @@ -379,94 +392,33 @@ decision that's up to the implementer of each new type so if you want, you can count such references to the type object.) */ -/* First define a pile of simple helper macros, one set per special - * build symbol. These either expand to the obvious things, or to - * nothing at all when the special mode isn't in effect. The main - * macros can later be defined just once then, yet expand to different - * things depending on which special build options are and aren't in effect. - * Trust me : while painful, this is 20x easier to understand than, - * e.g, defining _Py_NewReference five different times in a maze of nested - * #ifdefs (we used to do that -- it was impenetrable). - */ #ifdef Py_REF_DEBUG PyAPI_DATA(Py_ssize_t) _Py_RefTotal; PyAPI_FUNC(void) _Py_NegativeRefcount(const char *filename, int lineno, PyObject *op); -PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void); -#define _Py_INC_REFTOTAL _Py_RefTotal++ -#define _Py_DEC_REFTOTAL _Py_RefTotal-- - -/* Py_REF_DEBUG also controls the display of refcounts and memory block - * allocations at the interactive prompt and at interpreter shutdown - */ -PyAPI_FUNC(void) _PyDebug_PrintTotalRefs(void); -#else -#define _Py_INC_REFTOTAL -#define _Py_DEC_REFTOTAL #endif /* Py_REF_DEBUG */ -#ifdef COUNT_ALLOCS -PyAPI_FUNC(void) _Py_inc_count(struct _typeobject *); -PyAPI_FUNC(void) _Py_dec_count(struct _typeobject *); -#define _Py_INC_TPALLOCS(OP) _Py_inc_count(Py_TYPE(OP)) -#define _Py_INC_TPFREES(OP) _Py_dec_count(Py_TYPE(OP)) -#define _Py_DEC_TPFREES(OP) Py_TYPE(OP)->tp_frees-- -#define _Py_COUNT_ALLOCS_COMMA , -#else -#define _Py_INC_TPALLOCS(OP) -#define _Py_INC_TPFREES(OP) -#define _Py_DEC_TPFREES(OP) -#define _Py_COUNT_ALLOCS_COMMA -#endif /* COUNT_ALLOCS */ - -/* Update the Python traceback of an object. This function must be called - when a memory block is reused from a free list. */ -PyAPI_FUNC(int) _PyTraceMalloc_NewReference(PyObject *op); - -#ifdef Py_TRACE_REFS -/* Py_TRACE_REFS is such major surgery that we call external routines. */ -PyAPI_FUNC(void) _Py_NewReference(PyObject *); -PyAPI_FUNC(void) _Py_ForgetReference(PyObject *); -PyAPI_FUNC(void) _Py_PrintReferences(FILE *); -PyAPI_FUNC(void) _Py_PrintReferenceAddresses(FILE *); -PyAPI_FUNC(void) _Py_AddToAllObjects(PyObject *, int force); -#else -/* Without Py_TRACE_REFS, there's little enough to do that we expand code - inline. */ -static inline void _Py_NewReference(PyObject *op) -{ - if (_Py_tracemalloc_config.tracing) { - _PyTraceMalloc_NewReference(op); - } - _Py_INC_TPALLOCS(op); - _Py_INC_REFTOTAL; - Py_REFCNT(op) = 1; -} - -static inline void _Py_ForgetReference(PyObject *op) -{ - (void)op; /* may be unused, shut up -Wunused-parameter */ - _Py_INC_TPFREES(op); -} -#endif /* !Py_TRACE_REFS */ - - PyAPI_FUNC(void) _Py_Dealloc(PyObject *); static inline void _Py_INCREF(PyObject *op) { - _Py_INC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal++; +#endif op->ob_refcnt++; } #define Py_INCREF(op) _Py_INCREF(_PyObject_CAST(op)) -static inline void _Py_DECREF(const char *filename, int lineno, - PyObject *op) +static inline void _Py_DECREF( +#ifdef Py_REF_DEBUG + const char *filename, int lineno, +#endif + PyObject *op) { - (void)filename; /* may be unused, shut up -Wunused-parameter */ - (void)lineno; /* may be unused, shut up -Wunused-parameter */ - _Py_DEC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal--; +#endif if (--op->ob_refcnt != 0) { #ifdef Py_REF_DEBUG if (op->ob_refcnt < 0) { @@ -479,7 +431,11 @@ static inline void _Py_DECREF(const char *filename, int lineno, } } -#define Py_DECREF(op) _Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op)) +#ifdef Py_REF_DEBUG +# define Py_DECREF(op) _Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op)) +#else +# define Py_DECREF(op) _Py_DECREF(_PyObject_CAST(op)) +#endif /* Safely decref `op` and set `op` to NULL, especially useful in tp_clear @@ -654,98 +610,37 @@ it carefully, it may save lots of calls to Py_INCREF() and Py_DECREF() at times. */ +#ifndef Py_LIMITED_API +# define Py_CPYTHON_OBJECT_H +# include "cpython/object.h" +# undef Py_CPYTHON_OBJECT_H +#endif -/* Trashcan mechanism, thanks to Christian Tismer. - -When deallocating a container object, it's possible to trigger an unbounded -chain of deallocations, as each Py_DECREF in turn drops the refcount on "the -next" object in the chain to 0. This can easily lead to stack overflows, -especially in threads (which typically have less stack space to work with). - -A container object can avoid this by bracketing the body of its tp_dealloc -function with a pair of macros: -static void -mytype_dealloc(mytype *p) +static inline int +PyType_HasFeature(PyTypeObject *type, unsigned long feature) { - ... declarations go here ... - - PyObject_GC_UnTrack(p); // must untrack first - Py_TRASHCAN_BEGIN(p, mytype_dealloc) - ... The body of the deallocator goes here, including all calls ... - ... to Py_DECREF on contained objects. ... - Py_TRASHCAN_END // there should be no code after this + unsigned long flags; +#ifdef Py_LIMITED_API + // PyTypeObject is opaque in the limited C API + flags = PyType_GetFlags(type); +#else + flags = type->tp_flags; +#endif + return ((flags & feature) != 0); } -CAUTION: Never return from the middle of the body! If the body needs to -"get out early", put a label immediately before the Py_TRASHCAN_END -call, and goto it. Else the call-depth counter (see below) will stay -above 0 forever, and the trashcan will never get emptied. - -How it works: The BEGIN macro increments a call-depth counter. So long -as this counter is small, the body of the deallocator is run directly without -further ado. But if the counter gets large, it instead adds p to a list of -objects to be deallocated later, skips the body of the deallocator, and -resumes execution after the END macro. The tp_dealloc routine then returns -without deallocating anything (and so unbounded call-stack depth is avoided). - -When the call stack finishes unwinding again, code generated by the END macro -notices this, and calls another routine to deallocate all the objects that -may have been added to the list of deferred deallocations. In effect, a -chain of N deallocations is broken into (N-1)/(PyTrash_UNWIND_LEVEL-1) pieces, -with the call stack never exceeding a depth of PyTrash_UNWIND_LEVEL. - -Since the tp_dealloc of a subclass typically calls the tp_dealloc of the base -class, we need to ensure that the trashcan is only triggered on the tp_dealloc -of the actual class being deallocated. Otherwise we might end up with a -partially-deallocated object. To check this, the tp_dealloc function must be -passed as second argument to Py_TRASHCAN_BEGIN(). -*/ - -/* The new thread-safe private API, invoked by the macros below. */ -PyAPI_FUNC(void) _PyTrash_thread_deposit_object(PyObject*); -PyAPI_FUNC(void) _PyTrash_thread_destroy_chain(void); - -#define PyTrash_UNWIND_LEVEL 50 - -#define Py_TRASHCAN_BEGIN_CONDITION(op, cond) \ - do { \ - PyThreadState *_tstate = NULL; \ - /* If "cond" is false, then _tstate remains NULL and the deallocator \ - * is run normally without involving the trashcan */ \ - if (cond) { \ - _tstate = PyThreadState_GET(); \ - if (_tstate->trash_delete_nesting >= PyTrash_UNWIND_LEVEL) { \ - /* Store the object (to be deallocated later) and jump past \ - * Py_TRASHCAN_END, skipping the body of the deallocator */ \ - _PyTrash_thread_deposit_object(_PyObject_CAST(op)); \ - break; \ - } \ - ++_tstate->trash_delete_nesting; \ - } - /* The body of the deallocator is here. */ -#define Py_TRASHCAN_END \ - if (_tstate) { \ - --_tstate->trash_delete_nesting; \ - if (_tstate->trash_delete_later && _tstate->trash_delete_nesting <= 0) \ - _PyTrash_thread_destroy_chain(); \ - } \ - } while (0); - -#define Py_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN_CONDITION(op, \ - Py_TYPE(op)->tp_dealloc == (destructor)(dealloc)) - -/* For backwards compatibility, these macros enable the trashcan - * unconditionally */ -#define Py_TRASHCAN_SAFE_BEGIN(op) Py_TRASHCAN_BEGIN_CONDITION(op, 1) -#define Py_TRASHCAN_SAFE_END(op) Py_TRASHCAN_END +#define PyType_FastSubclass(type, flag) PyType_HasFeature(type, flag) +static inline int _PyType_Check(PyObject *op) { + return PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TYPE_SUBCLASS); +} +#define PyType_Check(op) _PyType_Check(_PyObject_CAST(op)) -#ifndef Py_LIMITED_API -# define Py_CPYTHON_OBJECT_H -# include "cpython/object.h" -# undef Py_CPYTHON_OBJECT_H -#endif +static inline int _PyType_CheckExact(PyObject *op) { + return Py_IS_TYPE(op, &PyType_Type); +} +#define PyType_CheckExact(op) _PyType_CheckExact(_PyObject_CAST(op)) #ifdef __cplusplus } diff --git a/Include/objimpl.h b/Include/objimpl.h index 2337d8a56c774e31b90077e97657edbac97587dc..030d7eee29723e3e71b869edf36d15b612462bd6 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -122,103 +122,32 @@ PyAPI_FUNC(PyVarObject *) PyObject_InitVar(PyVarObject *, PyAPI_FUNC(PyObject *) _PyObject_New(PyTypeObject *); PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t); -#define PyObject_New(type, typeobj) \ - ( (type *) _PyObject_New(typeobj) ) -#define PyObject_NewVar(type, typeobj, n) \ - ( (type *) _PyObject_NewVar((typeobj), (n)) ) - -/* Inline functions trading binary compatibility for speed: - PyObject_INIT() is the fast version of PyObject_Init(), and - PyObject_INIT_VAR() is the fast version of PyObject_InitVar. - See also pymem.h. - - These inline functions expect non-NULL object pointers. */ -static inline PyObject* -_PyObject_INIT(PyObject *op, PyTypeObject *typeobj) -{ - assert(op != NULL); - Py_TYPE(op) = typeobj; - if (PyType_GetFlags(typeobj) & Py_TPFLAGS_HEAPTYPE) { - Py_INCREF(typeobj); - } - _Py_NewReference(op); - return op; -} - -#define PyObject_INIT(op, typeobj) \ - _PyObject_INIT(_PyObject_CAST(op), (typeobj)) - -static inline PyVarObject* -_PyObject_INIT_VAR(PyVarObject *op, PyTypeObject *typeobj, Py_ssize_t size) -{ - assert(op != NULL); - Py_SIZE(op) = size; - PyObject_INIT((PyObject *)op, typeobj); - return op; -} +#define PyObject_New(type, typeobj) ((type *)_PyObject_New(typeobj)) -#define PyObject_INIT_VAR(op, typeobj, size) \ - _PyObject_INIT_VAR(_PyVarObject_CAST(op), (typeobj), (size)) +// Alias to PyObject_New(). In Python 3.8, PyObject_NEW() called directly +// PyObject_MALLOC() with _PyObject_SIZE(). +#define PyObject_NEW(type, typeobj) PyObject_New(type, typeobj) -#define _PyObject_SIZE(typeobj) ( (typeobj)->tp_basicsize ) - -/* _PyObject_VAR_SIZE returns the number of bytes (as size_t) allocated for a - vrbl-size object with nitems items, exclusive of gc overhead (if any). The - value is rounded up to the closest multiple of sizeof(void *), in order to - ensure that pointer fields at the end of the object are correctly aligned - for the platform (this is of special importance for subclasses of, e.g., - str or int, so that pointers can be stored after the embedded data). +#define PyObject_NewVar(type, typeobj, n) \ + ( (type *) _PyObject_NewVar((typeobj), (n)) ) - Note that there's no memory wastage in doing this, as malloc has to - return (at worst) pointer-aligned memory anyway. -*/ -#if ((SIZEOF_VOID_P - 1) & SIZEOF_VOID_P) != 0 -# error "_PyObject_VAR_SIZE requires SIZEOF_VOID_P be a power of 2" +// Alias to PyObject_New(). In Python 3.8, PyObject_NEW() called directly +// PyObject_MALLOC() with _PyObject_VAR_SIZE(). +#define PyObject_NEW_VAR(type, typeobj, n) PyObject_NewVar(type, typeobj, n) + + +#ifdef Py_LIMITED_API +/* Define PyObject_INIT() and PyObject_INIT_VAR() as aliases to PyObject_Init() + and PyObject_InitVar() in the limited C API for compatibility with the + CPython C API. */ +# define PyObject_INIT(op, typeobj) \ + PyObject_Init(_PyObject_CAST(op), (typeobj)) +# define PyObject_INIT_VAR(op, typeobj, size) \ + PyObject_InitVar(_PyVarObject_CAST(op), (typeobj), (size)) +#else +/* PyObject_INIT() and PyObject_INIT_VAR() are defined in cpython/objimpl.h */ #endif -#define _PyObject_VAR_SIZE(typeobj, nitems) \ - _Py_SIZE_ROUND_UP((typeobj)->tp_basicsize + \ - (nitems)*(typeobj)->tp_itemsize, \ - SIZEOF_VOID_P) - -#define PyObject_NEW(type, typeobj) \ -( (type *) PyObject_Init( \ - (PyObject *) PyObject_MALLOC( _PyObject_SIZE(typeobj) ), (typeobj)) ) - -#define PyObject_NEW_VAR(type, typeobj, n) \ -( (type *) PyObject_InitVar( \ - (PyVarObject *) PyObject_MALLOC(_PyObject_VAR_SIZE((typeobj),(n)) ),\ - (typeobj), (n)) ) - -/* This example code implements an object constructor with a custom - allocator, where PyObject_New is inlined, and shows the important - distinction between two steps (at least): - 1) the actual allocation of the object storage; - 2) the initialization of the Python specific fields - in this storage with PyObject_{Init, InitVar}. - - PyObject * - YourObject_New(...) - { - PyObject *op; - - op = (PyObject *) Your_Allocator(_PyObject_SIZE(YourTypeStruct)); - if (op == NULL) - return PyErr_NoMemory(); - - PyObject_Init(op, &YourTypeStruct); - - op->ob_field = value; - ... - return op; - } - - Note that in C++, the use of the new operator usually implies that - the 1st step is performed automatically for you, so in a C++ class - constructor you would start directly with PyObject_Init/InitVar -*/ - - /* * Garbage Collection Support @@ -257,6 +186,8 @@ PyAPI_FUNC(void) PyObject_GC_Del(void *); #define PyObject_GC_NewVar(type, typeobj, n) \ ( (type *) _PyObject_GC_NewVar((typeobj), (n)) ) +PyAPI_FUNC(int) PyObject_GC_IsTracked(PyObject *); +PyAPI_FUNC(int) PyObject_GC_IsFinalized(PyObject *); /* Utility macro to help write tp_traverse functions. * To use this macro, the tp_traverse function must name its arguments diff --git a/Include/odictobject.h b/Include/odictobject.h index 35aff8a29a6e34f2c3262bb9a8d44bd1b449f752..e070413017d801c8c41d430cfb8431371987bf45 100644 --- a/Include/odictobject.h +++ b/Include/odictobject.h @@ -19,7 +19,7 @@ PyAPI_DATA(PyTypeObject) PyODictItems_Type; PyAPI_DATA(PyTypeObject) PyODictValues_Type; #define PyODict_Check(op) PyObject_TypeCheck(op, &PyODict_Type) -#define PyODict_CheckExact(op) (Py_TYPE(op) == &PyODict_Type) +#define PyODict_CheckExact(op) Py_IS_TYPE(op, &PyODict_Type) #define PyODict_SIZE(op) PyDict_GET_SIZE((op)) PyAPI_FUNC(PyObject *) PyODict_New(void); diff --git a/Include/opcode.h b/Include/opcode.h index 2a29e978857035a275055bf54d30149de98c616b..19944fac0b9f2b36fb3998fd2c4c7775c934d872 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -30,10 +30,11 @@ extern "C" { #define BINARY_TRUE_DIVIDE 27 #define INPLACE_FLOOR_DIVIDE 28 #define INPLACE_TRUE_DIVIDE 29 +#define RERAISE 48 +#define WITH_EXCEPT_START 49 #define GET_AITER 50 #define GET_ANEXT 51 #define BEFORE_ASYNC_WITH 52 -#define BEGIN_FINALLY 53 #define END_ASYNC_FOR 54 #define INPLACE_ADD 55 #define INPLACE_SUBTRACT 56 @@ -53,19 +54,18 @@ extern "C" { #define LOAD_BUILD_CLASS 71 #define YIELD_FROM 72 #define GET_AWAITABLE 73 +#define LOAD_ASSERTION_ERROR 74 #define INPLACE_LSHIFT 75 #define INPLACE_RSHIFT 76 #define INPLACE_AND 77 #define INPLACE_XOR 78 #define INPLACE_OR 79 -#define WITH_CLEANUP_START 81 -#define WITH_CLEANUP_FINISH 82 +#define LIST_TO_TUPLE 82 #define RETURN_VALUE 83 #define IMPORT_STAR 84 #define SETUP_ANNOTATIONS 85 #define YIELD_VALUE 86 #define POP_BLOCK 87 -#define END_FINALLY 88 #define POP_EXCEPT 89 #define HAVE_ARGUMENT 90 #define STORE_NAME 90 @@ -94,6 +94,9 @@ extern "C" { #define POP_JUMP_IF_FALSE 114 #define POP_JUMP_IF_TRUE 115 #define LOAD_GLOBAL 116 +#define IS_OP 117 +#define CONTAINS_OP 118 +#define JUMP_IF_NOT_EXC_MATCH 121 #define SETUP_FINALLY 122 #define LOAD_FAST 124 #define STORE_FAST 125 @@ -114,20 +117,16 @@ extern "C" { #define SET_ADD 146 #define MAP_ADD 147 #define LOAD_CLASSDEREF 148 -#define BUILD_LIST_UNPACK 149 -#define BUILD_MAP_UNPACK 150 -#define BUILD_MAP_UNPACK_WITH_CALL 151 -#define BUILD_TUPLE_UNPACK 152 -#define BUILD_SET_UNPACK 153 #define SETUP_ASYNC_WITH 154 #define FORMAT_VALUE 155 #define BUILD_CONST_KEY_MAP 156 #define BUILD_STRING 157 -#define BUILD_TUPLE_UNPACK_WITH_CALL 158 #define LOAD_METHOD 160 #define CALL_METHOD 161 -#define CALL_FINALLY 162 -#define POP_FINALLY 163 +#define LIST_EXTEND 162 +#define SET_UPDATE 163 +#define DICT_MERGE 164 +#define DICT_UPDATE 165 /* EXCEPT_HANDLER is a special, implicit block type which is created when entering an except handler. It is not an opcode but we define it here @@ -135,11 +134,6 @@ extern "C" { remaining private.*/ #define EXCEPT_HANDLER 257 - -enum cmp_op {PyCmp_LT=Py_LT, PyCmp_LE=Py_LE, PyCmp_EQ=Py_EQ, PyCmp_NE=Py_NE, - PyCmp_GT=Py_GT, PyCmp_GE=Py_GE, PyCmp_IN, PyCmp_NOT_IN, - PyCmp_IS, PyCmp_IS_NOT, PyCmp_EXC_MATCH, PyCmp_BAD}; - #define HAS_ARG(op) ((op) >= HAVE_ARGUMENT) #ifdef __cplusplus diff --git a/Include/patchlevel.h b/Include/patchlevel.h index 25fc2d3a7adcad97e2162faf8993bd068bcbcbf7..a23b2f15f79f9340786be311e5d973b3d1cf35bd 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -17,13 +17,13 @@ /* Version parsed out into numeric values */ /*--start constants--*/ #define PY_MAJOR_VERSION 3 -#define PY_MINOR_VERSION 8 -#define PY_MICRO_VERSION 5 +#define PY_MINOR_VERSION 9 +#define PY_MICRO_VERSION 2 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL #define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.8.5" +#define PY_VERSION "3.9.2" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Include/picklebufobject.h b/Include/picklebufobject.h index f07e900bf26dacf2dfcc797495b245fa03df50be..0df2561dceaea04a9942b2aae18762dfc2fe806d 100644 --- a/Include/picklebufobject.h +++ b/Include/picklebufobject.h @@ -12,7 +12,7 @@ extern "C" { PyAPI_DATA(PyTypeObject) PyPickleBuffer_Type; -#define PyPickleBuffer_Check(op) (Py_TYPE(op) == &PyPickleBuffer_Type) +#define PyPickleBuffer_Check(op) Py_IS_TYPE(op, &PyPickleBuffer_Type) /* Create a PickleBuffer redirecting to the given buffer-enabled object */ PyAPI_FUNC(PyObject *) PyPickleBuffer_FromObject(PyObject *); diff --git a/Include/py_curses.h b/Include/py_curses.h index 2702b37ea7cfe95d76be65a4fb0dee3a524eccf8..b70252d9d7605eb315aacc5a1abf10993a054eac 100644 --- a/Include/py_curses.h +++ b/Include/py_curses.h @@ -64,7 +64,7 @@ typedef struct { char *encoding; } PyCursesWindowObject; -#define PyCursesWindow_Check(v) (Py_TYPE(v) == &PyCursesWindow_Type) +#define PyCursesWindow_Check(v) Py_IS_TYPE(v, &PyCursesWindow_Type) #define PyCurses_CAPSULE_NAME "_curses._C_API" @@ -97,4 +97,3 @@ static const char catchall_NULL[] = "curses function returned NULL"; #endif /* !defined(Py_CURSES_H) */ - diff --git a/Include/pycapsule.h b/Include/pycapsule.h index d9ecda7a4b6e4a1f26500770e79b7996425d3832..fb5d503fea73f13a254dc51b003e703b511250dd 100644 --- a/Include/pycapsule.h +++ b/Include/pycapsule.h @@ -22,7 +22,7 @@ PyAPI_DATA(PyTypeObject) PyCapsule_Type; typedef void (*PyCapsule_Destructor)(PyObject *); -#define PyCapsule_CheckExact(op) (Py_TYPE(op) == &PyCapsule_Type) +#define PyCapsule_CheckExact(op) Py_IS_TYPE(op, &PyCapsule_Type) PyAPI_FUNC(PyObject *) PyCapsule_New( diff --git a/Include/pydebug.h b/Include/pydebug.h index bd4aafe3b49f83a3dc5d6e3c56b3425220c5c0b7..78bcb118be46598f866aa62c05e66b87ca81a150 100644 --- a/Include/pydebug.h +++ b/Include/pydebug.h @@ -5,8 +5,6 @@ extern "C" { #endif -/* These global variable are defined in pylifecycle.c */ -/* XXX (ncoghlan): move these declarations to pylifecycle.h? */ PyAPI_DATA(int) Py_DebugFlag; PyAPI_DATA(int) Py_VerboseFlag; PyAPI_DATA(int) Py_QuietFlag; diff --git a/Include/pyerrors.h b/Include/pyerrors.h index 5125a51ec1aa17e9b347eea97dedd54e03462ef6..979a26ba68a0335b760756e08ba55bb311353ea6 100644 --- a/Include/pyerrors.h +++ b/Include/pyerrors.h @@ -4,6 +4,8 @@ extern "C" { #endif +#include // va_list + /* Error handling definitions */ PyAPI_FUNC(void) PyErr_SetNone(PyObject *); @@ -21,7 +23,11 @@ PyAPI_FUNC(void) PyErr_GetExcInfo(PyObject **, PyObject **, PyObject **); PyAPI_FUNC(void) PyErr_SetExcInfo(PyObject *, PyObject *, PyObject *); #endif -/* Defined in Python/pylifecycle.c */ +/* Defined in Python/pylifecycle.c + + The Py_FatalError() function is replaced with a macro which logs + automatically the name of the current function, unless the Py_LIMITED_API + macro is defined. */ PyAPI_FUNC(void) _Py_NO_RETURN Py_FatalError(const char *message); #if defined(Py_DEBUG) || defined(Py_LIMITED_API) @@ -54,11 +60,11 @@ PyAPI_FUNC(void) PyException_SetContext(PyObject *, PyObject *); PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS)) #define PyExceptionInstance_Check(x) \ - PyType_FastSubclass((x)->ob_type, Py_TPFLAGS_BASE_EXC_SUBCLASS) + PyType_FastSubclass(Py_TYPE(x), Py_TPFLAGS_BASE_EXC_SUBCLASS) PyAPI_FUNC(const char *) PyExceptionClass_Name(PyObject *); -#define PyExceptionInstance_Class(x) ((PyObject*)((x)->ob_type)) +#define PyExceptionInstance_Class(x) ((PyObject*)Py_TYPE(x)) /* Predefined exceptions */ @@ -303,21 +309,6 @@ PyAPI_FUNC(int) PyUnicodeTranslateError_SetReason( const char *reason /* UTF-8 encoded string */ ); -/* These APIs aren't really part of the error implementation, but - often needed to format error messages; the native C lib APIs are - not available on all platforms, which is why we provide emulations - for those platforms in Python/mysnprintf.c, - WARNING: The return value of snprintf varies across platforms; do - not rely on any particular behavior; eventually the C99 defn may - be reliable. -*/ -#if defined(MS_WIN32) && !defined(HAVE_SNPRINTF) -# define HAVE_SNPRINTF -# define snprintf _snprintf -# define vsnprintf _vsnprintf -#endif - -#include PyAPI_FUNC(int) PyOS_snprintf(char *str, size_t size, const char *format, ...) Py_GCC_ATTRIBUTE((format(printf, 3, 4))); PyAPI_FUNC(int) PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) diff --git a/Include/pyfpe.h b/Include/pyfpe.h index 5a99e3979311f8118066c9325933ac74e7a48233..cc2def63aa5527f4ac192aa663a14353a88e1774 100644 --- a/Include/pyfpe.h +++ b/Include/pyfpe.h @@ -1,5 +1,7 @@ #ifndef Py_PYFPE_H #define Py_PYFPE_H +/* Header excluded from the stable API */ +#ifndef Py_LIMITED_API /* These macros used to do something when Python was built with --with-fpectl, * but support for that was dropped in 3.7. We continue to define them though, @@ -9,4 +11,5 @@ #define PyFPE_START_PROTECT(err_string, leave_stmt) #define PyFPE_END_PROTECT(v) +#endif /* !defined(Py_LIMITED_API) */ #endif /* !Py_PYFPE_H */ diff --git a/Include/pyframe.h b/Include/pyframe.h new file mode 100644 index 0000000000000000000000000000000000000000..3816224201c7e44725d4aa0bf32d1b9da9256bc5 --- /dev/null +++ b/Include/pyframe.h @@ -0,0 +1,22 @@ +/* Limited C API of PyFrame API + * + * Include "frameobject.h" to get the PyFrameObject structure. + */ + +#ifndef Py_PYFRAME_H +#define Py_PYFRAME_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _frame PyFrameObject; + +/* Return the line of code the frame is currently executing. */ +PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *); + +PyAPI_FUNC(PyCodeObject *) PyFrame_GetCode(PyFrameObject *frame); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYFRAME_H */ diff --git a/Include/pyhash.h b/Include/pyhash.h index dbcc9744be35a7bba2b760840db4312d5b8cc08a..4437b870332bdef3e9e5e7fa361f6d3b02f2207b 100644 --- a/Include/pyhash.h +++ b/Include/pyhash.h @@ -8,7 +8,9 @@ extern "C" { /* Helpers for hash functions */ #ifndef Py_LIMITED_API PyAPI_FUNC(Py_hash_t) _Py_HashDouble(double); -PyAPI_FUNC(Py_hash_t) _Py_HashPointer(void*); +PyAPI_FUNC(Py_hash_t) _Py_HashPointer(const void*); +// Similar to _Py_HashPointer(), but don't replace -1 with -2 +PyAPI_FUNC(Py_hash_t) _Py_HashPointerRaw(const void*); PyAPI_FUNC(Py_hash_t) _Py_HashBytes(const void*, Py_ssize_t); #endif diff --git a/Include/pylifecycle.h b/Include/pylifecycle.h index c5368b3c5edaa08c7db2ca2f30d291127e1839d8..783fcb455eb5289eeb1babca79b99ceb32cdd5bd 100644 --- a/Include/pylifecycle.h +++ b/Include/pylifecycle.h @@ -32,6 +32,8 @@ PyAPI_FUNC(void) _Py_NO_RETURN Py_Exit(int); /* Bootstrap __main__ (defined in Modules/main.c) */ PyAPI_FUNC(int) Py_Main(int argc, wchar_t **argv); +PyAPI_FUNC(int) Py_FrozenMain(int argc, char **argv); + PyAPI_FUNC(int) Py_BytesMain(int argc, char **argv); /* In pathconfig.c */ diff --git a/Include/pymacro.h b/Include/pymacro.h index 495c2c25c90866de20e8607c7e7b77bb438bf503..202b936d964f00dec2f7cb8a3fc993f1bd6cfc85 100644 --- a/Include/pymacro.h +++ b/Include/pymacro.h @@ -100,7 +100,33 @@ # define Py_UNUSED(name) _unused_ ## name #endif -#define Py_UNREACHABLE() \ +#if defined(RANDALL_WAS_HERE) +# define Py_UNREACHABLE() \ + Py_FatalError( \ + "If you're seeing this, the code is in what I thought was\n" \ + "an unreachable state.\n\n" \ + "I could give you advice for what to do, but honestly, why\n" \ + "should you trust me? I clearly screwed this up. I'm writing\n" \ + "a message that should never appear, yet I know it will\n" \ + "probably appear someday.\n\n" \ + "On a deep level, I know I'm not up to this task.\n" \ + "I'm so sorry.\n" \ + "https://xkcd.com/2200") +#elif defined(Py_DEBUG) +# define Py_UNREACHABLE() \ + Py_FatalError( \ + "We've reached an unreachable state. Anything is possible.\n" \ + "The limits were in our heads all along. Follow your dreams.\n" \ + "https://xkcd.com/2200") +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) +# define Py_UNREACHABLE() __builtin_unreachable() +#elif defined(__clang__) || defined(__INTEL_COMPILER) +# define Py_UNREACHABLE() __builtin_unreachable() +#elif defined(_MSC_VER) +# define Py_UNREACHABLE() __assume(0) +#else +# define Py_UNREACHABLE() \ Py_FatalError("Unreachable C code path reached") +#endif #endif /* Py_PYMACRO_H */ diff --git a/Include/pymath.h b/Include/pymath.h index 6cf69f98acf93340a6bc45bee250d89c1d9d436d..63ca972784e3116f087701aa2af65c34564ed8b0 100644 --- a/Include/pymath.h +++ b/Include/pymath.h @@ -125,7 +125,7 @@ PyAPI_FUNC(void) _Py_set_387controlword(unsigned short); /* Py_IS_FINITE(X) * Return 1 if float or double arg is neither infinite nor NAN, else 0. - * Some compilers (e.g. VisualStudio) have intrisics for this, so a special + * Some compilers (e.g. VisualStudio) have intrinsics for this, so a special * macro for this particular test is useful * Note: PC/pyconfig.h defines Py_IS_FINITE as _finite */ @@ -227,4 +227,12 @@ PyAPI_FUNC(void) _Py_set_387controlword(unsigned short); * behavior. */ #define _Py_InIntegralTypeRange(type, v) (_Py_IntegralTypeMin(type) <= v && v <= _Py_IntegralTypeMax(type)) +/* Return the smallest integer k such that n < 2**k, or 0 if n == 0. + * Equivalent to floor(log2(x))+1. Also equivalent to: bitwidth_of_type - + * count_leading_zero_bits(x) + */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(unsigned int) _Py_bit_length(unsigned long d); +#endif + #endif /* Py_PYMATH_H */ diff --git a/Include/pymem.h b/Include/pymem.h index 07b380aa6e7faaf3cc2c9de4ed15375cea19c82f..607feb9484f24f14d562f1a32fbae9ad8b7fe16d 100644 --- a/Include/pymem.h +++ b/Include/pymem.h @@ -101,41 +101,6 @@ PyAPI_FUNC(void) PyMem_Free(void *ptr); #define PyMem_Del PyMem_Free #define PyMem_DEL PyMem_FREE -/* bpo-35053: expose _Py_tracemalloc_config for performance: - _Py_NewReference() needs an efficient check to test if tracemalloc is - tracing. - - It has to be defined in pymem.h, before object.h is included. */ -struct _PyTraceMalloc_Config { - /* Module initialized? - Variable protected by the GIL */ - enum { - TRACEMALLOC_NOT_INITIALIZED, - TRACEMALLOC_INITIALIZED, - TRACEMALLOC_FINALIZED - } initialized; - - /* Is tracemalloc tracing memory allocations? - Variable protected by the GIL */ - int tracing; - - /* limit of the number of frames in a traceback, 1 by default. - Variable protected by the GIL. */ - int max_nframe; - - /* use domain in trace key? - Variable protected by the GIL. */ - int use_domain; -}; - -PyAPI_DATA(struct _PyTraceMalloc_Config) _Py_tracemalloc_config; - -#define _PyTraceMalloc_Config_INIT \ - {.initialized = TRACEMALLOC_NOT_INITIALIZED, \ - .tracing = 0, \ - .max_nframe = 1, \ - .use_domain = 0} - #ifndef Py_LIMITED_API # define Py_CPYTHON_PYMEM_H diff --git a/Include/pyport.h b/Include/pyport.h index 71f5794ded72e1179bef5952a6b4a86e6fefff98..4bd4eb4751b952e34f88844f38248993acee79dd 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -133,8 +133,9 @@ typedef int Py_ssize_clean_t; /* PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf * format to convert an argument with the width of a size_t or Py_ssize_t. - * C99 introduced "z" for this purpose, but not all platforms support that; - * e.g., MS compilers use "I" instead. + * C99 introduced "z" for this purpose, but old MSVCs had not supported it. + * Since MSVC supports "z" since (at least) 2015, we can just use "z" + * for new code. * * These "high level" Python format functions interpret "z" correctly on * all platforms (Python interprets the format string itself, and does whatever @@ -152,19 +153,11 @@ typedef int Py_ssize_clean_t; * Py_ssize_t index; * fprintf(stderr, "index %" PY_FORMAT_SIZE_T "d sucks\n", index); * - * That will expand to %ld, or %Id, or to something else correct for a - * Py_ssize_t on the platform. + * That will expand to %zd or to something else correct for a Py_ssize_t on + * the platform. */ #ifndef PY_FORMAT_SIZE_T -# if SIZEOF_SIZE_T == SIZEOF_INT && !defined(__APPLE__) -# define PY_FORMAT_SIZE_T "" -# elif SIZEOF_SIZE_T == SIZEOF_LONG -# define PY_FORMAT_SIZE_T "l" -# elif defined(MS_WINDOWS) -# define PY_FORMAT_SIZE_T "I" -# else -# error "This platform's pyconfig.h needs to define PY_FORMAT_SIZE_T" -# endif +# define PY_FORMAT_SIZE_T "z" #endif /* Py_LOCAL can be used instead of static to get the fastest possible calling @@ -520,6 +513,26 @@ extern "C" { #define Py_DEPRECATED(VERSION_UNUSED) #endif +#if defined(__clang__) +#define _Py_COMP_DIAG_PUSH _Pragma("clang diagnostic push") +#define _Py_COMP_DIAG_IGNORE_DEPR_DECLS \ + _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") +#define _Py_COMP_DIAG_POP _Pragma("clang diagnostic pop") +#elif defined(__GNUC__) \ + && ((__GNUC__ >= 5) || (__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) +#define _Py_COMP_DIAG_PUSH _Pragma("GCC diagnostic push") +#define _Py_COMP_DIAG_IGNORE_DEPR_DECLS \ + _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#define _Py_COMP_DIAG_POP _Pragma("GCC diagnostic pop") +#elif defined(_MSC_VER) +#define _Py_COMP_DIAG_PUSH __pragma(warning(push)) +#define _Py_COMP_DIAG_IGNORE_DEPR_DECLS __pragma(warning(disable: 4996)) +#define _Py_COMP_DIAG_POP __pragma(warning(pop)) +#else +#define _Py_COMP_DIAG_PUSH +#define _Py_COMP_DIAG_IGNORE_DEPR_DECLS +#define _Py_COMP_DIAG_POP +#endif /* _Py_HOT_FUNCTION * The hot attribute on a function is used to inform the compiler that the @@ -645,16 +658,18 @@ extern char * _getpty(int *, int, mode_t, int); # define HAVE_DECLSPEC_DLL #endif +#include "exports.h" + /* only get special linkage if built as shared or platform is Cygwin */ #if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__) # if defined(HAVE_DECLSPEC_DLL) # if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) -# define PyAPI_FUNC(RTYPE) __declspec(dllexport) RTYPE -# define PyAPI_DATA(RTYPE) extern __declspec(dllexport) RTYPE +# define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE +# define PyAPI_DATA(RTYPE) extern Py_EXPORTED_SYMBOL RTYPE /* module init functions inside the core need no external linkage */ /* except for Cygwin to handle embedding */ # if defined(__CYGWIN__) -# define PyMODINIT_FUNC __declspec(dllexport) PyObject* +# define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject* # else /* __CYGWIN__ */ # define PyMODINIT_FUNC PyObject* # endif /* __CYGWIN__ */ @@ -665,14 +680,14 @@ extern char * _getpty(int *, int, mode_t, int); /* failures similar to those described at the bottom of 4.1: */ /* http://docs.python.org/extending/windows.html#a-cookbook-approach */ # if !defined(__CYGWIN__) -# define PyAPI_FUNC(RTYPE) __declspec(dllimport) RTYPE +# define PyAPI_FUNC(RTYPE) Py_IMPORTED_SYMBOL RTYPE # endif /* !__CYGWIN__ */ -# define PyAPI_DATA(RTYPE) extern __declspec(dllimport) RTYPE +# define PyAPI_DATA(RTYPE) extern Py_IMPORTED_SYMBOL RTYPE /* module init functions outside the core must be exported */ # if defined(__cplusplus) -# define PyMODINIT_FUNC extern "C" __declspec(dllexport) PyObject* +# define PyMODINIT_FUNC extern "C" Py_EXPORTED_SYMBOL PyObject* # else /* __cplusplus */ -# define PyMODINIT_FUNC __declspec(dllexport) PyObject* +# define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject* # endif /* __cplusplus */ # endif /* Py_BUILD_CORE */ # endif /* HAVE_DECLSPEC_DLL */ @@ -680,16 +695,16 @@ extern char * _getpty(int *, int, mode_t, int); /* If no external linkage macros defined by now, create defaults */ #ifndef PyAPI_FUNC -# define PyAPI_FUNC(RTYPE) RTYPE +# define PyAPI_FUNC(RTYPE) Py_EXPORTED_SYMBOL RTYPE #endif #ifndef PyAPI_DATA -# define PyAPI_DATA(RTYPE) extern RTYPE +# define PyAPI_DATA(RTYPE) extern Py_EXPORTED_SYMBOL RTYPE #endif #ifndef PyMODINIT_FUNC # if defined(__cplusplus) -# define PyMODINIT_FUNC extern "C" PyObject* +# define PyMODINIT_FUNC extern "C" Py_EXPORTED_SYMBOL PyObject* # else /* __cplusplus */ -# define PyMODINIT_FUNC PyObject* +# define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject* # endif /* __cplusplus */ #endif @@ -773,11 +788,11 @@ extern char * _getpty(int *, int, mode_t, int); */ #ifdef WORDS_BIGENDIAN -#define PY_BIG_ENDIAN 1 -#define PY_LITTLE_ENDIAN 0 +# define PY_BIG_ENDIAN 1 +# define PY_LITTLE_ENDIAN 0 #else -#define PY_BIG_ENDIAN 0 -#define PY_LITTLE_ENDIAN 1 +# define PY_BIG_ENDIAN 0 +# define PY_LITTLE_ENDIAN 1 #endif #ifdef Py_BUILD_CORE @@ -834,8 +849,9 @@ extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler; #endif /* Mark a function which cannot return. Example: + PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void); - PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void); */ + XLC support is intentionally omitted due to bpo-40244 */ #if defined(__clang__) || \ (defined(__GNUC__) && \ ((__GNUC__ >= 3) || \ @@ -847,4 +863,16 @@ extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler; # define _Py_NO_RETURN #endif + +// Preprocessor check for a builtin preprocessor function. Always return 0 +// if __has_builtin() macro is not defined. +// +// __has_builtin() is available on clang and GCC 10. +#ifdef __has_builtin +# define _Py__has_builtin(x) __has_builtin(x) +#else +# define _Py__has_builtin(x) 0 +#endif + + #endif /* Py_PYPORT_H */ diff --git a/Include/pystate.h b/Include/pystate.h index 4c25e3f7ef84b5d8c3f22ef4b4f5cc5db7d1d357..bae440778b261a425f080aaf085a9d6d72811615 100644 --- a/Include/pystate.h +++ b/Include/pystate.h @@ -7,27 +7,35 @@ extern "C" { #endif -#include "pythread.h" - /* This limitation is for performance and simplicity. If needed it can be removed (with effort). */ #define MAX_CO_EXTRA_USERS 255 /* Forward declarations for PyFrameObject, PyThreadState and PyInterpreterState */ -struct _frame; struct _ts; struct _is; /* struct _ts is defined in cpython/pystate.h */ typedef struct _ts PyThreadState; -/* struct _is is defined in internal/pycore_pystate.h */ +/* struct _is is defined in internal/pycore_interp.h */ typedef struct _is PyInterpreterState; PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_New(void); PyAPI_FUNC(void) PyInterpreterState_Clear(PyInterpreterState *); PyAPI_FUNC(void) PyInterpreterState_Delete(PyInterpreterState *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000 +/* New in 3.9 */ +/* Get the current interpreter state. + + Issue a fatal error if there no current Python thread state or no current + interpreter. It cannot return NULL. + + The caller must hold the GIL. */ +PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Get(void); +#endif + #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03080000 /* New in 3.8 */ PyAPI_FUNC(PyObject *) PyInterpreterState_GetDict(PyInterpreterState *); @@ -50,7 +58,6 @@ PyAPI_FUNC(PyObject*) PyState_FindModule(struct PyModuleDef*); PyAPI_FUNC(PyThreadState *) PyThreadState_New(PyInterpreterState *); PyAPI_FUNC(void) PyThreadState_Clear(PyThreadState *); PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *); -PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void); /* Get the current thread state. @@ -77,6 +84,13 @@ PyAPI_FUNC(PyThreadState *) PyThreadState_Swap(PyThreadState *); PyAPI_FUNC(PyObject *) PyThreadState_GetDict(void); PyAPI_FUNC(int) PyThreadState_SetAsyncExc(unsigned long, PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000 +/* New in 3.9 */ +PyAPI_FUNC(PyInterpreterState*) PyThreadState_GetInterpreter(PyThreadState *tstate); +PyAPI_FUNC(PyFrameObject*) PyThreadState_GetFrame(PyThreadState *tstate); +PyAPI_FUNC(uint64_t) PyThreadState_GetID(PyThreadState *tstate); +#endif + typedef enum {PyGILState_LOCKED, PyGILState_UNLOCKED} PyGILState_STATE; diff --git a/Include/pythonrun.h b/Include/pythonrun.h index 46091e09216330bb39b8bb68a8d718dea40cd33f..57529072432ea75545e8a24da37c88282113b6c0 100644 --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -72,16 +72,23 @@ PyAPI_FUNC(struct _mod *) PyParser_ASTFromFileObject( #define PyParser_SimpleParseFile(FP, S, B) \ PyParser_SimpleParseFileFlags(FP, S, B, 0) #endif -PyAPI_FUNC(struct _node *) PyParser_SimpleParseStringFlags(const char *, int, - int); + +#ifndef Py_BUILD_CORE +Py_DEPRECATED(3.9) +#endif +PyAPI_FUNC(struct _node *) PyParser_SimpleParseStringFlags(const char *, int, int); #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +#ifndef Py_BUILD_CORE +Py_DEPRECATED(3.9) +#endif PyAPI_FUNC(struct _node *) PyParser_SimpleParseStringFlagsFilename(const char *, const char *, int, int); #endif -PyAPI_FUNC(struct _node *) PyParser_SimpleParseFileFlags(FILE *, const char *, - int, int); - +#ifndef Py_BUILD_CORE +Py_DEPRECATED(3.9) +#endif +PyAPI_FUNC(struct _node *) PyParser_SimpleParseFileFlags(FILE *, const char *, int, int); #ifndef Py_LIMITED_API PyAPI_FUNC(PyObject *) PyRun_StringFlags(const char *, int, PyObject *, PyObject *, PyCompilerFlags *); diff --git a/Include/pythread.h b/Include/pythread.h index f22e8c42c502777969e6516c9257341b2b50e4d7..bb9d86412218ad24b189f7b8e221e56e4491b26c 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -3,7 +3,6 @@ #define Py_PYTHREAD_H typedef void *PyThread_type_lock; -typedef void *PyThread_type_sema; #ifdef __cplusplus extern "C" { @@ -37,6 +36,15 @@ PyAPI_FUNC(int) PyThread_acquire_lock(PyThread_type_lock, int); #define WAIT_LOCK 1 #define NOWAIT_LOCK 0 +#ifndef Py_LIMITED_API +#ifdef HAVE_FORK +/* Private function to reinitialize a lock at fork in the child process. + Reset the lock to the unlocked state. + Return 0 on success, return -1 on error. */ +PyAPI_FUNC(int) _PyThread_at_fork_reinit(PyThread_type_lock *lock); +#endif /* HAVE_FORK */ +#endif /* !Py_LIMITED_API */ + /* PY_TIMEOUT_T is the integral type used to specify timeouts when waiting on a lock (see PyThread_acquire_lock_timed() below). PY_TIMEOUT_MAX is the highest usable value (in microseconds) of that @@ -51,16 +59,16 @@ PyAPI_FUNC(int) PyThread_acquire_lock(PyThread_type_lock, int); #if defined(_POSIX_THREADS) /* PyThread_acquire_lock_timed() uses _PyTime_FromNanoseconds(us * 1000), convert microseconds to nanoseconds. */ -# define PY_TIMEOUT_MAX (PY_LLONG_MAX / 1000) +# define PY_TIMEOUT_MAX (LLONG_MAX / 1000) #elif defined (NT_THREADS) /* In the NT API, the timeout is a DWORD and is expressed in milliseconds */ -# if 0xFFFFFFFFLL * 1000 < PY_LLONG_MAX +# if 0xFFFFFFFFLL * 1000 < LLONG_MAX # define PY_TIMEOUT_MAX (0xFFFFFFFFLL * 1000) # else -# define PY_TIMEOUT_MAX PY_LLONG_MAX +# define PY_TIMEOUT_MAX LLONG_MAX # endif #else -# define PY_TIMEOUT_MAX PY_LLONG_MAX +# define PY_TIMEOUT_MAX LLONG_MAX #endif diff --git a/Include/rangeobject.h b/Include/rangeobject.h index 7e4dc28894b042097c22387ad31dfe80ad8917f8..d6af8473f9e8d33f011c6c42d6350fa00ca6ac3d 100644 --- a/Include/rangeobject.h +++ b/Include/rangeobject.h @@ -19,7 +19,7 @@ PyAPI_DATA(PyTypeObject) PyRange_Type; PyAPI_DATA(PyTypeObject) PyRangeIter_Type; PyAPI_DATA(PyTypeObject) PyLongRangeIter_Type; -#define PyRange_Check(op) (Py_TYPE(op) == &PyRange_Type) +#define PyRange_Check(op) Py_IS_TYPE(op, &PyRange_Type) #ifdef __cplusplus } diff --git a/Include/setobject.h b/Include/setobject.h index fc0ea83925f92f2e51a6f61a1e8060ee928f5865..119619ebe72994be28bc58d92fb3df81e849e0b9 100644 --- a/Include/setobject.h +++ b/Include/setobject.h @@ -70,7 +70,6 @@ PyAPI_DATA(PyObject *) _PySet_Dummy; PyAPI_FUNC(int) _PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key, Py_hash_t *hash); PyAPI_FUNC(int) _PySet_Update(PyObject *set, PyObject *iterable); -PyAPI_FUNC(int) PySet_ClearFreeList(void); #endif /* Section excluded by Py_LIMITED_API */ @@ -88,18 +87,18 @@ PyAPI_FUNC(int) PySet_Discard(PyObject *set, PyObject *key); PyAPI_FUNC(PyObject *) PySet_Pop(PyObject *set); PyAPI_FUNC(Py_ssize_t) PySet_Size(PyObject *anyset); -#define PyFrozenSet_CheckExact(ob) (Py_TYPE(ob) == &PyFrozenSet_Type) +#define PyFrozenSet_CheckExact(ob) Py_IS_TYPE(ob, &PyFrozenSet_Type) #define PyAnySet_CheckExact(ob) \ - (Py_TYPE(ob) == &PySet_Type || Py_TYPE(ob) == &PyFrozenSet_Type) + (Py_IS_TYPE(ob, &PySet_Type) || Py_IS_TYPE(ob, &PyFrozenSet_Type)) #define PyAnySet_Check(ob) \ - (Py_TYPE(ob) == &PySet_Type || Py_TYPE(ob) == &PyFrozenSet_Type || \ + (Py_IS_TYPE(ob, &PySet_Type) || Py_IS_TYPE(ob, &PyFrozenSet_Type) || \ PyType_IsSubtype(Py_TYPE(ob), &PySet_Type) || \ PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) #define PySet_Check(ob) \ - (Py_TYPE(ob) == &PySet_Type || \ + (Py_IS_TYPE(ob, &PySet_Type) || \ PyType_IsSubtype(Py_TYPE(ob), &PySet_Type)) #define PyFrozenSet_Check(ob) \ - (Py_TYPE(ob) == &PyFrozenSet_Type || \ + (Py_IS_TYPE(ob, &PyFrozenSet_Type) || \ PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) #ifdef __cplusplus diff --git a/Include/sliceobject.h b/Include/sliceobject.h index aae6f3cc7945e1774d10f58e332dab4fd475d592..2c889508b4b495b56df2fc034f6f6ad5baebba89 100644 --- a/Include/sliceobject.h +++ b/Include/sliceobject.h @@ -28,7 +28,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PySlice_Type; PyAPI_DATA(PyTypeObject) PyEllipsis_Type; -#define PySlice_Check(op) (Py_TYPE(op) == &PySlice_Type) +#define PySlice_Check(op) Py_IS_TYPE(op, &PySlice_Type) PyAPI_FUNC(PyObject *) PySlice_New(PyObject* start, PyObject* stop, PyObject* step); diff --git a/Include/structseq.h b/Include/structseq.h index e5e5d5c5735e9d5dc79d3417c09be5a1e7556d3f..8f51c89163a4e17ef188001de6d9fa53d70b97ad 100644 --- a/Include/structseq.h +++ b/Include/structseq.h @@ -19,7 +19,7 @@ typedef struct PyStructSequence_Desc { int n_in_sequence; } PyStructSequence_Desc; -extern char* PyStructSequence_UnnamedField; +extern const char * const PyStructSequence_UnnamedField; #ifndef Py_LIMITED_API PyAPI_FUNC(void) PyStructSequence_InitType(PyTypeObject *type, diff --git a/Include/symtable.h b/Include/symtable.h index 5dcfa7e2c2bb68e95850975da5fbf65566fcc604..abd19a7923e1ba3186231e9e83826f633198cc50 100644 --- a/Include/symtable.h +++ b/Include/symtable.h @@ -69,7 +69,7 @@ typedef struct _symtable_entry { PyAPI_DATA(PyTypeObject) PySTEntry_Type; -#define PySTEntry_Check(op) (Py_TYPE(op) == &PySTEntry_Type) +#define PySTEntry_Check(op) Py_IS_TYPE(op, &PySTEntry_Type) PyAPI_FUNC(int) PyST_GetScope(PySTEntryObject *, PyObject *); diff --git a/Include/token.h b/Include/token.h index e08708baf196e8b1a63bb841f4c1ef8137aa9f4f..9b8a3aae0746747ed90a86e435ec0594390e0404 100644 --- a/Include/token.h +++ b/Include/token.h @@ -78,6 +78,10 @@ extern "C" { #define ISTERMINAL(x) ((x) < NT_OFFSET) #define ISNONTERMINAL(x) ((x) >= NT_OFFSET) #define ISEOF(x) ((x) == ENDMARKER) +#define ISWHITESPACE(x) ((x) == ENDMARKER || \ + (x) == NEWLINE || \ + (x) == INDENT || \ + (x) == DEDENT) PyAPI_DATA(const char * const) _PyParser_TokenNames[]; /* Token names */ diff --git a/Include/traceback.h b/Include/traceback.h index b451927fafa3a85fb86510c56dffdd0845a43d99..781e5a6eec4edd4c199079aa9f25d8c05082b3f2 100644 --- a/Include/traceback.h +++ b/Include/traceback.h @@ -4,16 +4,14 @@ extern "C" { #endif -struct _frame; - /* Traceback interface */ -PyAPI_FUNC(int) PyTraceBack_Here(struct _frame *); +PyAPI_FUNC(int) PyTraceBack_Here(PyFrameObject *); PyAPI_FUNC(int) PyTraceBack_Print(PyObject *, PyObject *); /* Reveal traceback type so we can typecheck traceback objects */ PyAPI_DATA(PyTypeObject) PyTraceBack_Type; -#define PyTraceBack_Check(v) (Py_TYPE(v) == &PyTraceBack_Type) +#define PyTraceBack_Check(v) Py_IS_TYPE(v, &PyTraceBack_Type) #ifndef Py_LIMITED_API diff --git a/Include/tupleobject.h b/Include/tupleobject.h index 590902de9d0215c35f5455013c729e61cfaddafa..e796a320192c204466ffca35d27a32fd3d064f5c 100644 --- a/Include/tupleobject.h +++ b/Include/tupleobject.h @@ -25,7 +25,7 @@ PyAPI_DATA(PyTypeObject) PyTupleIter_Type; #define PyTuple_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TUPLE_SUBCLASS) -#define PyTuple_CheckExact(op) (Py_TYPE(op) == &PyTuple_Type) +#define PyTuple_CheckExact(op) Py_IS_TYPE(op, &PyTuple_Type) PyAPI_FUNC(PyObject *) PyTuple_New(Py_ssize_t size); PyAPI_FUNC(Py_ssize_t) PyTuple_Size(PyObject *); @@ -34,8 +34,6 @@ PyAPI_FUNC(int) PyTuple_SetItem(PyObject *, Py_ssize_t, PyObject *); PyAPI_FUNC(PyObject *) PyTuple_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t); PyAPI_FUNC(PyObject *) PyTuple_Pack(Py_ssize_t, ...); -PyAPI_FUNC(int) PyTuple_ClearFreeList(void); - #ifndef Py_LIMITED_API # define Py_CPYTHON_TUPLEOBJECT_H # include "cpython/tupleobject.h" diff --git a/Include/typeslots.h b/Include/typeslots.h index 0ce6a377dcfbd692e5b2204496a5c8dd8d7cc8f2..64f6fff51444937d70c3d2af414af0bfa040cbee 100644 --- a/Include/typeslots.h +++ b/Include/typeslots.h @@ -1,7 +1,12 @@ /* Do not renumber the file; these numbers are part of the stable ABI. */ +#if defined(Py_LIMITED_API) /* Disabled, see #10181 */ #undef Py_bf_getbuffer #undef Py_bf_releasebuffer +#else +#define Py_bf_getbuffer 1 +#define Py_bf_releasebuffer 2 +#endif #define Py_mp_ass_subscript 3 #define Py_mp_length 4 #define Py_mp_subscript 5 diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index 97d8cd12f6de5494a1c32140ade1857c47c89020..500ce242e9f0e850f483695463701aed7d3cce14 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -113,7 +113,7 @@ PyAPI_DATA(PyTypeObject) PyUnicodeIter_Type; #define PyUnicode_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_UNICODE_SUBCLASS) -#define PyUnicode_CheckExact(op) (Py_TYPE(op) == &PyUnicode_Type) +#define PyUnicode_CheckExact(op) Py_IS_TYPE(op, &PyUnicode_Type) /* --- Constants ---------------------------------------------------------- */ @@ -328,17 +328,6 @@ PyAPI_FUNC(wchar_t*) PyUnicode_AsWideCharString( PyAPI_FUNC(PyObject*) PyUnicode_FromOrdinal(int ordinal); -/* --- Free-list management ----------------------------------------------- */ - -/* Clear the free list used by the Unicode implementation. - - This can be used to release memory used for objects on the free - list back to the Python memory allocator. - -*/ - -PyAPI_FUNC(int) PyUnicode_ClearFreeList(void); - /* === Builtin Codecs ===================================================== Many of these APIs take two arguments encoding and errors. These diff --git a/Include/weakrefobject.h b/Include/weakrefobject.h index 17051568f3a6e9880a7ceae50b85088f179edf37..ac4b4821c8a1470fd8e0b5f078b62da1521ebf2e 100644 --- a/Include/weakrefobject.h +++ b/Include/weakrefobject.h @@ -46,10 +46,10 @@ PyAPI_DATA(PyTypeObject) _PyWeakref_CallableProxyType; #define PyWeakref_CheckRef(op) PyObject_TypeCheck(op, &_PyWeakref_RefType) #define PyWeakref_CheckRefExact(op) \ - (Py_TYPE(op) == &_PyWeakref_RefType) + Py_IS_TYPE(op, &_PyWeakref_RefType) #define PyWeakref_CheckProxy(op) \ - ((Py_TYPE(op) == &_PyWeakref_ProxyType) || \ - (Py_TYPE(op) == &_PyWeakref_CallableProxyType)) + (Py_IS_TYPE(op, &_PyWeakref_ProxyType) || \ + Py_IS_TYPE(op, &_PyWeakref_CallableProxyType)) #define PyWeakref_Check(op) \ (PyWeakref_CheckRef(op) || PyWeakref_CheckProxy(op)) diff --git a/LICENSE b/LICENSE index 66a3ac80d729a3a5bdfd22002d34be59a6daf222..473861da1be7c5f24f405814ef1370de6ab946c9 100644 --- a/LICENSE +++ b/LICENSE @@ -59,6 +59,17 @@ direction to make these releases possible. B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON =============================================================== +Python software and documentation are licensed under the +Python Software Foundation License Version 2. + +Starting with Python 3.8.6, examples, recipes, and other code in +the documentation are dual licensed under the PSF License Version 2 +and the Zero-Clause BSD license. + +Some software incorporated into Python is under different licenses. +The licenses are listed with code falling under that license. + + PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 -------------------------------------------- @@ -73,7 +84,7 @@ analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation; +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee. @@ -252,3 +263,17 @@ FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION +---------------------------------------------------------------------- + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. diff --git a/Lib/__future__.py b/Lib/__future__.py index d7cb8ac5f497456f1dfac50b584302e99648cf06..0e7b5552343356d75cd17b64c33c0db276bc5848 100644 --- a/Lib/__future__.py +++ b/Lib/__future__.py @@ -66,18 +66,20 @@ # code.h and used by compile.h, so that an editor search will find them here. # However, they're not exported in __all__, because they don't really belong to # this module. -CO_NESTED = 0x0010 # nested_scopes -CO_GENERATOR_ALLOWED = 0 # generators (obsolete, was 0x1000) -CO_FUTURE_DIVISION = 0x20000 # division -CO_FUTURE_ABSOLUTE_IMPORT = 0x40000 # perform absolute imports by default -CO_FUTURE_WITH_STATEMENT = 0x80000 # with statement -CO_FUTURE_PRINT_FUNCTION = 0x100000 # print function -CO_FUTURE_UNICODE_LITERALS = 0x200000 # unicode string literals +CO_NESTED = 0x0010 # nested_scopes +CO_GENERATOR_ALLOWED = 0 # generators (obsolete, was 0x1000) +CO_FUTURE_DIVISION = 0x20000 # division +CO_FUTURE_ABSOLUTE_IMPORT = 0x40000 # perform absolute imports by default +CO_FUTURE_WITH_STATEMENT = 0x80000 # with statement +CO_FUTURE_PRINT_FUNCTION = 0x100000 # print function +CO_FUTURE_UNICODE_LITERALS = 0x200000 # unicode string literals CO_FUTURE_BARRY_AS_BDFL = 0x400000 -CO_FUTURE_GENERATOR_STOP = 0x800000 # StopIteration becomes RuntimeError in generators -CO_FUTURE_ANNOTATIONS = 0x1000000 # annotations become strings at runtime +CO_FUTURE_GENERATOR_STOP = 0x800000 # StopIteration becomes RuntimeError in generators +CO_FUTURE_ANNOTATIONS = 0x1000000 # annotations become strings at runtime + class _Feature: + def __init__(self, optionalRelease, mandatoryRelease, compiler_flag): self.optional = optionalRelease self.mandatory = mandatoryRelease @@ -88,7 +90,6 @@ def getOptionalRelease(self): This is a 5-tuple, of the same form as sys.version_info. """ - return self.optional def getMandatoryRelease(self): @@ -97,7 +98,6 @@ def getMandatoryRelease(self): This is a 5-tuple, of the same form as sys.version_info, or, if the feature was dropped, is None. """ - return self.mandatory def __repr__(self): @@ -105,6 +105,7 @@ def __repr__(self): self.mandatory, self.compiler_flag)) + nested_scopes = _Feature((2, 1, 0, "beta", 1), (2, 2, 0, "alpha", 0), CO_NESTED) @@ -142,5 +143,5 @@ def __repr__(self): CO_FUTURE_GENERATOR_STOP) annotations = _Feature((3, 7, 0, "beta", 1), - (4, 0, 0, "alpha", 0), + (3, 10, 0, "alpha", 0), CO_FUTURE_ANNOTATIONS) diff --git a/Lib/_aix_support.py b/Lib/_aix_support.py new file mode 100644 index 0000000000000000000000000000000000000000..45504934063df87f8e77e790bdd8ae40c4d4c2aa --- /dev/null +++ b/Lib/_aix_support.py @@ -0,0 +1,89 @@ +"""Shared AIX support functions.""" + +import sys +import sysconfig + +try: + import subprocess +except ImportError: # pragma: no cover + # _aix_support is used in distutils by setup.py to build C extensions, + # before subprocess dependencies like _posixsubprocess are available. + import _bootsubprocess as subprocess + + +def _aix_tag(vrtl, bd): + # type: (List[int], int) -> str + # Infer the ABI bitwidth from maxsize (assuming 64 bit as the default) + _sz = 32 if sys.maxsize == (2**31-1) else 64 + # vrtl[version, release, technology_level] + return "aix-{:1x}{:1d}{:02d}-{:04d}-{}".format(vrtl[0], vrtl[1], vrtl[2], bd, _sz) + + +# extract version, release and technology level from a VRMF string +def _aix_vrtl(vrmf): + # type: (str) -> List[int] + v, r, tl = vrmf.split(".")[:3] + return [int(v[-1]), int(r), int(tl)] + + +def _aix_bosmp64(): + # type: () -> Tuple[str, int] + """ + Return a Tuple[str, int] e.g., ['7.1.4.34', 1806] + The fileset bos.mp64 is the AIX kernel. It's VRMF and builddate + reflect the current ABI levels of the runtime environment. + """ + # We expect all AIX systems to have lslpp installed in this location + out = subprocess.check_output(["/usr/bin/lslpp", "-Lqc", "bos.mp64"]) + out = out.decode("utf-8") + out = out.strip().split(":") # type: ignore + # Use str() and int() to help mypy see types + return (str(out[2]), int(out[-1])) + + +def aix_platform(): + # type: () -> str + """ + AIX filesets are identified by four decimal values: V.R.M.F. + V (version) and R (release) can be retreived using ``uname`` + Since 2007, starting with AIX 5.3 TL7, the M value has been + included with the fileset bos.mp64 and represents the Technology + Level (TL) of AIX. The F (Fix) value also increases, but is not + relevant for comparing releases and binary compatibility. + For binary compatibility the so-called builddate is needed. + Again, the builddate of an AIX release is associated with bos.mp64. + AIX ABI compatibility is described as guaranteed at: https://www.ibm.com/\ + support/knowledgecenter/en/ssw_aix_72/install/binary_compatability.html + + For pep425 purposes the AIX platform tag becomes: + "aix-{:1x}{:1d}{:02d}-{:04d}-{}".format(v, r, tl, builddate, bitsize) + e.g., "aix-6107-1415-32" for AIX 6.1 TL7 bd 1415, 32-bit + and, "aix-6107-1415-64" for AIX 6.1 TL7 bd 1415, 64-bit + """ + vrmf, bd = _aix_bosmp64() + return _aix_tag(_aix_vrtl(vrmf), bd) + + +# extract vrtl from the BUILD_GNU_TYPE as an int +def _aix_bgt(): + # type: () -> List[int] + gnu_type = sysconfig.get_config_var("BUILD_GNU_TYPE") + if not gnu_type: + raise ValueError("BUILD_GNU_TYPE is not defined") + return _aix_vrtl(vrmf=gnu_type) + + +def aix_buildtag(): + # type: () -> str + """ + Return the platform_tag of the system Python was built on. + """ + # AIX_BUILDDATE is defined by configure with: + # lslpp -Lcq bos.mp64 | awk -F: '{ print $NF }' + build_date = sysconfig.get_config_var("AIX_BUILDDATE") + try: + build_date = int(build_date) + except (ValueError, TypeError): + raise ValueError(f"AIX_BUILDDATE is not defined or invalid: " + f"{build_date!r}") + return _aix_tag(_aix_bgt(), build_date) diff --git a/Lib/_bootsubprocess.py b/Lib/_bootsubprocess.py new file mode 100644 index 0000000000000000000000000000000000000000..014782f616c823bae543909e3b17dad3dccc8cd0 --- /dev/null +++ b/Lib/_bootsubprocess.py @@ -0,0 +1,97 @@ +""" +Basic subprocess implementation for POSIX which only uses os functions. Only +implement features required by setup.py to build C extension modules when +subprocess is unavailable. setup.py is not used on Windows. +""" +import os + + +# distutils.spawn used by distutils.command.build_ext +# calls subprocess.Popen().wait() +class Popen: + def __init__(self, cmd, env=None): + self._cmd = cmd + self._env = env + self.returncode = None + + def wait(self): + pid = os.fork() + if pid == 0: + # Child process + try: + if self._env is not None: + os.execve(self._cmd[0], self._cmd, self._env) + else: + os.execv(self._cmd[0], self._cmd) + finally: + os._exit(1) + else: + # Parent process + _, status = os.waitpid(pid, 0) + self.returncode = os.waitstatus_to_exitcode(status) + + return self.returncode + + +def _check_cmd(cmd): + # Use regex [a-zA-Z0-9./-]+: reject empty string, space, etc. + safe_chars = [] + for first, last in (("a", "z"), ("A", "Z"), ("0", "9")): + for ch in range(ord(first), ord(last) + 1): + safe_chars.append(chr(ch)) + safe_chars.append("./-") + safe_chars = ''.join(safe_chars) + + if isinstance(cmd, (tuple, list)): + check_strs = cmd + elif isinstance(cmd, str): + check_strs = [cmd] + else: + return False + + for arg in check_strs: + if not isinstance(arg, str): + return False + if not arg: + # reject empty string + return False + for ch in arg: + if ch not in safe_chars: + return False + + return True + + +# _aix_support used by distutil.util calls subprocess.check_output() +def check_output(cmd, **kwargs): + if kwargs: + raise NotImplementedError(repr(kwargs)) + + if not _check_cmd(cmd): + raise ValueError(f"unsupported command: {cmd!r}") + + tmp_filename = "check_output.tmp" + if not isinstance(cmd, str): + cmd = " ".join(cmd) + cmd = f"{cmd} >{tmp_filename}" + + try: + # system() spawns a shell + status = os.system(cmd) + exitcode = os.waitstatus_to_exitcode(status) + if exitcode: + raise ValueError(f"Command {cmd!r} returned non-zero " + f"exit status {exitcode!r}") + + try: + with open(tmp_filename, "rb") as fp: + stdout = fp.read() + except FileNotFoundError: + stdout = b'' + finally: + try: + os.unlink(tmp_filename) + except OSError: + pass + + return stdout diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py index 2b2ddba170e1b18a85d519b356156f89c485791c..b6ecf8eac6368b8e21c1666516fa04b156d9e73c 100644 --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -9,6 +9,12 @@ from abc import ABCMeta, abstractmethod import sys +GenericAlias = type(list[int]) +EllipsisType = type(...) +def _f(): pass +FunctionType = type(_f) +del _f + __all__ = ["Awaitable", "Coroutine", "AsyncIterable", "AsyncIterator", "AsyncGenerator", "Hashable", "Iterable", "Iterator", "Generator", "Reversible", @@ -110,6 +116,8 @@ def __subclasshook__(cls, C): return _check_methods(C, "__await__") return NotImplemented + __class_getitem__ = classmethod(GenericAlias) + class Coroutine(Awaitable): @@ -169,6 +177,8 @@ def __subclasshook__(cls, C): return _check_methods(C, "__aiter__") return NotImplemented + __class_getitem__ = classmethod(GenericAlias) + class AsyncIterator(AsyncIterable): @@ -255,6 +265,8 @@ def __subclasshook__(cls, C): return _check_methods(C, "__iter__") return NotImplemented + __class_getitem__ = classmethod(GenericAlias) + class Iterator(Iterable): @@ -274,6 +286,7 @@ def __subclasshook__(cls, C): return _check_methods(C, '__iter__', '__next__') return NotImplemented + Iterator.register(bytes_iterator) Iterator.register(bytearray_iterator) #Iterator.register(callable_iterator) @@ -353,6 +366,7 @@ def __subclasshook__(cls, C): 'send', 'throw', 'close') return NotImplemented + Generator.register(generator) @@ -385,6 +399,9 @@ def __subclasshook__(cls, C): return _check_methods(C, "__contains__") return NotImplemented + __class_getitem__ = classmethod(GenericAlias) + + class Collection(Sized, Iterable, Container): __slots__ = () @@ -395,6 +412,87 @@ def __subclasshook__(cls, C): return _check_methods(C, "__len__", "__iter__", "__contains__") return NotImplemented + +class _CallableGenericAlias(GenericAlias): + """ Represent `Callable[argtypes, resulttype]`. + + This sets ``__args__`` to a tuple containing the flattened``argtypes`` + followed by ``resulttype``. + + Example: ``Callable[[int, str], float]`` sets ``__args__`` to + ``(int, str, float)``. + """ + + __slots__ = () + + def __new__(cls, origin, args): + try: + return cls.__create_ga(origin, args) + except TypeError as exc: + import warnings + warnings.warn(f'{str(exc)} ' + f'(This will raise a TypeError in Python 3.10.)', + DeprecationWarning) + return GenericAlias(origin, args) + + @classmethod + def __create_ga(cls, origin, args): + if not isinstance(args, tuple) or len(args) != 2: + raise TypeError( + "Callable must be used as Callable[[arg, ...], result].") + t_args, t_result = args + if isinstance(t_args, (list, tuple)): + ga_args = tuple(t_args) + (t_result,) + # This relaxes what t_args can be on purpose to allow things like + # PEP 612 ParamSpec. Responsibility for whether a user is using + # Callable[...] properly is deferred to static type checkers. + else: + ga_args = args + return super().__new__(cls, origin, ga_args) + + def __repr__(self): + if len(self.__args__) == 2 and self.__args__[0] is Ellipsis: + return super().__repr__() + return (f'collections.abc.Callable' + f'[[{", ".join([_type_repr(a) for a in self.__args__[:-1]])}], ' + f'{_type_repr(self.__args__[-1])}]') + + def __reduce__(self): + args = self.__args__ + if not (len(args) == 2 and args[0] is Ellipsis): + args = list(args[:-1]), args[-1] + return _CallableGenericAlias, (Callable, args) + + def __getitem__(self, item): + # Called during TypeVar substitution, returns the custom subclass + # rather than the default types.GenericAlias object. + ga = super().__getitem__(item) + args = ga.__args__ + t_result = args[-1] + t_args = args[:-1] + args = (t_args, t_result) + return _CallableGenericAlias(Callable, args) + + +def _type_repr(obj): + """Return the repr() of an object, special-casing types (internal helper). + + Copied from :mod:`typing` since collections.abc + shouldn't depend on that module. + """ + if isinstance(obj, GenericAlias): + return repr(obj) + if isinstance(obj, type): + if obj.__module__ == 'builtins': + return obj.__qualname__ + return f'{obj.__module__}.{obj.__qualname__}' + if obj is Ellipsis: + return '...' + if isinstance(obj, FunctionType): + return obj.__name__ + return repr(obj) + + class Callable(metaclass=ABCMeta): __slots__ = () @@ -409,6 +507,8 @@ def __subclasshook__(cls, C): return _check_methods(C, "__call__") return NotImplemented + __class_getitem__ = classmethod(_CallableGenericAlias) + ### SETS ### @@ -550,6 +650,7 @@ def _hash(self): h = 590923713 return h + Set.register(frozenset) @@ -632,6 +733,7 @@ def __isub__(self, it): self.discard(value) return self + MutableSet.register(set) @@ -688,6 +790,7 @@ def __eq__(self, other): __reversed__ = None + Mapping.register(mappingproxy) @@ -704,6 +807,8 @@ def __len__(self): def __repr__(self): return '{0.__class__.__name__}({0._mapping!r})'.format(self) + __class_getitem__ = classmethod(GenericAlias) + class KeysView(MappingView, Set): @@ -719,6 +824,7 @@ def __contains__(self, key): def __iter__(self): yield from self._mapping + KeysView.register(dict_keys) @@ -743,6 +849,7 @@ def __iter__(self): for key in self._mapping: yield (key, self._mapping[key]) + ItemsView.register(dict_items) @@ -761,6 +868,7 @@ def __iter__(self): for key in self._mapping: yield self._mapping[key] + ValuesView.register(dict_values) @@ -847,6 +955,7 @@ def setdefault(self, key, default=None): self[key] = default return default + MutableMapping.register(dict) @@ -914,6 +1023,7 @@ def count(self, value): 'S.count(value) -> integer -- return number of occurrences of value' return sum(1 for v in self if v is value or v == value) + Sequence.register(tuple) Sequence.register(str) Sequence.register(range) @@ -1000,5 +1110,6 @@ def __iadd__(self, values): self.extend(values) return self + MutableSequence.register(list) MutableSequence.register(bytearray) # Multiply inheriting, see ByteString diff --git a/Lib/_dummy_thread.py b/Lib/_dummy_thread.py deleted file mode 100644 index 2e46a07603be0916535c47adb8f979501ff794b9..0000000000000000000000000000000000000000 --- a/Lib/_dummy_thread.py +++ /dev/null @@ -1,193 +0,0 @@ -"""Drop-in replacement for the thread module. - -Meant to be used as a brain-dead substitute so that threaded code does -not need to be rewritten for when the thread module is not present. - -Suggested usage is:: - - try: - import _thread - except ImportError: - import _dummy_thread as _thread - -""" -# Exports only things specified by thread documentation; -# skipping obsolete synonyms allocate(), start_new(), exit_thread(). -__all__ = ['error', 'start_new_thread', 'exit', 'get_ident', 'allocate_lock', - 'interrupt_main', 'LockType', 'RLock'] - -# A dummy value -TIMEOUT_MAX = 2**31 - -# NOTE: this module can be imported early in the extension building process, -# and so top level imports of other modules should be avoided. Instead, all -# imports are done when needed on a function-by-function basis. Since threads -# are disabled, the import lock should not be an issue anyway (??). - -error = RuntimeError - -def start_new_thread(function, args, kwargs={}): - """Dummy implementation of _thread.start_new_thread(). - - Compatibility is maintained by making sure that ``args`` is a - tuple and ``kwargs`` is a dictionary. If an exception is raised - and it is SystemExit (which can be done by _thread.exit()) it is - caught and nothing is done; all other exceptions are printed out - by using traceback.print_exc(). - - If the executed function calls interrupt_main the KeyboardInterrupt will be - raised when the function returns. - - """ - if type(args) != type(tuple()): - raise TypeError("2nd arg must be a tuple") - if type(kwargs) != type(dict()): - raise TypeError("3rd arg must be a dict") - global _main - _main = False - try: - function(*args, **kwargs) - except SystemExit: - pass - except: - import traceback - traceback.print_exc() - _main = True - global _interrupt - if _interrupt: - _interrupt = False - raise KeyboardInterrupt - -def exit(): - """Dummy implementation of _thread.exit().""" - raise SystemExit - -def get_ident(): - """Dummy implementation of _thread.get_ident(). - - Since this module should only be used when _threadmodule is not - available, it is safe to assume that the current process is the - only thread. Thus a constant can be safely returned. - """ - return 1 - -def allocate_lock(): - """Dummy implementation of _thread.allocate_lock().""" - return LockType() - -def stack_size(size=None): - """Dummy implementation of _thread.stack_size().""" - if size is not None: - raise error("setting thread stack size not supported") - return 0 - -def _set_sentinel(): - """Dummy implementation of _thread._set_sentinel().""" - return LockType() - -class LockType(object): - """Class implementing dummy implementation of _thread.LockType. - - Compatibility is maintained by maintaining self.locked_status - which is a boolean that stores the state of the lock. Pickling of - the lock, though, should not be done since if the _thread module is - then used with an unpickled ``lock()`` from here problems could - occur from this class not having atomic methods. - - """ - - def __init__(self): - self.locked_status = False - - def acquire(self, waitflag=None, timeout=-1): - """Dummy implementation of acquire(). - - For blocking calls, self.locked_status is automatically set to - True and returned appropriately based on value of - ``waitflag``. If it is non-blocking, then the value is - actually checked and not set if it is already acquired. This - is all done so that threading.Condition's assert statements - aren't triggered and throw a little fit. - - """ - if waitflag is None or waitflag: - self.locked_status = True - return True - else: - if not self.locked_status: - self.locked_status = True - return True - else: - if timeout > 0: - import time - time.sleep(timeout) - return False - - __enter__ = acquire - - def __exit__(self, typ, val, tb): - self.release() - - def release(self): - """Release the dummy lock.""" - # XXX Perhaps shouldn't actually bother to test? Could lead - # to problems for complex, threaded code. - if not self.locked_status: - raise error - self.locked_status = False - return True - - def locked(self): - return self.locked_status - - def __repr__(self): - return "<%s %s.%s object at %s>" % ( - "locked" if self.locked_status else "unlocked", - self.__class__.__module__, - self.__class__.__qualname__, - hex(id(self)) - ) - - -class RLock(LockType): - """Dummy implementation of threading._RLock. - - Re-entrant lock can be aquired multiple times and needs to be released - just as many times. This dummy implemention does not check wheter the - current thread actually owns the lock, but does accounting on the call - counts. - """ - def __init__(self): - super().__init__() - self._levels = 0 - - def acquire(self, waitflag=None, timeout=-1): - """Aquire the lock, can be called multiple times in succession. - """ - locked = super().acquire(waitflag, timeout) - if locked: - self._levels += 1 - return locked - - def release(self): - """Release needs to be called once for every call to acquire(). - """ - if self._levels == 0: - raise error - if self._levels == 1: - super().release() - self._levels -= 1 - -# Used to signal that interrupt_main was called in a "thread" -_interrupt = False -# True when not executing in a "thread" -_main = True - -def interrupt_main(): - """Set _interrupt flag to True to have start_new_thread raise - KeyboardInterrupt upon exiting.""" - if _main: - raise KeyboardInterrupt - else: - global _interrupt - _interrupt = True diff --git a/Lib/_osx_support.py b/Lib/_osx_support.py index e9efce7d7ed5bddc632fca35882d4e985da99c1e..37975fe8a3eefa63dcb485f407a8df63c31d8f0e 100644 --- a/Lib/_osx_support.py +++ b/Lib/_osx_support.py @@ -52,7 +52,7 @@ def _find_executable(executable, path=None): return executable -def _read_output(commandstring): +def _read_output(commandstring, capture_stderr=False): """Output from successful command execution or None""" # Similar to os.popen(commandstring, "r").read(), # but without actually using os.popen because that @@ -67,7 +67,10 @@ def _read_output(commandstring): os.getpid(),), "w+b") with contextlib.closing(fp) as fp: - cmd = "%s 2>/dev/null >'%s'" % (commandstring, fp.name) + if capture_stderr: + cmd = "%s >'%s' 2>&1" % (commandstring, fp.name) + else: + cmd = "%s 2>/dev/null >'%s'" % (commandstring, fp.name) return fp.read().decode('utf-8').strip() if not os.system(cmd) else None @@ -110,6 +113,26 @@ def _get_system_version(): return _SYSTEM_VERSION +_SYSTEM_VERSION_TUPLE = None +def _get_system_version_tuple(): + """ + Return the macOS system version as a tuple + + The return value is safe to use to compare + two version numbers. + """ + global _SYSTEM_VERSION_TUPLE + if _SYSTEM_VERSION_TUPLE is None: + osx_version = _get_system_version() + if osx_version: + try: + _SYSTEM_VERSION_TUPLE = tuple(int(i) for i in osx_version.split('.')) + except ValueError: + _SYSTEM_VERSION_TUPLE = () + + return _SYSTEM_VERSION_TUPLE + + def _remove_original_values(_config_vars): """Remove original unmodified values for testing""" # This is needed for higher-level cross-platform tests of get_platform. @@ -125,6 +148,33 @@ def _save_modified_value(_config_vars, cv, newvalue): _config_vars[_INITPRE + cv] = oldvalue _config_vars[cv] = newvalue + +_cache_default_sysroot = None +def _default_sysroot(cc): + """ Returns the root of the default SDK for this system, or '/' """ + global _cache_default_sysroot + + if _cache_default_sysroot is not None: + return _cache_default_sysroot + + contents = _read_output('%s -c -E -v - "): + in_incdirs = True + elif line.startswith("End of search list"): + in_incdirs = False + elif in_incdirs: + line = line.strip() + if line == '/usr/include': + _cache_default_sysroot = '/' + elif line.endswith(".sdk/usr/include"): + _cache_default_sysroot = line[:-12] + if _cache_default_sysroot is None: + _cache_default_sysroot = '/' + + return _cache_default_sysroot + def _supports_universal_builds(): """Returns True if universal builds are supported on this system""" # As an approximation, we assume that if we are running on 10.4 or above, @@ -132,14 +182,18 @@ def _supports_universal_builds(): # builds, in particular -isysroot and -arch arguments to the compiler. This # is in support of allowing 10.4 universal builds to run on 10.3.x systems. - osx_version = _get_system_version() - if osx_version: - try: - osx_version = tuple(int(i) for i in osx_version.split('.')) - except ValueError: - osx_version = '' + osx_version = _get_system_version_tuple() return bool(osx_version >= (10, 4)) if osx_version else False +def _supports_arm64_builds(): + """Returns True if arm64 builds are supported on this system""" + # There are two sets of systems supporting macOS/arm64 builds: + # 1. macOS 11 and later, unconditionally + # 2. macOS 10.15 with Xcode 12.2 or later + # For now the second category is ignored. + osx_version = _get_system_version_tuple() + return osx_version >= (11, 0) if osx_version else False + def _find_appropriate_compiler(_config_vars): """Find appropriate C compiler for extension module builds""" @@ -331,6 +385,12 @@ def compiler_fixup(compiler_so, cc_args): except ValueError: break + elif not _supports_arm64_builds(): + # Look for "-arch arm64" and drop that + for idx in reversed(range(len(compiler_so))): + if compiler_so[idx] == '-arch' and compiler_so[idx+1] == "arm64": + del compiler_so[idx:idx+2] + if 'ARCHFLAGS' in os.environ and not stripArch: # User specified different -arch flags in the environ, # see also distutils.sysconfig @@ -481,6 +541,8 @@ def get_platform_osx(_config_vars, osname, release, machine): if len(archs) == 1: machine = archs[0] + elif archs == ('arm64', 'x86_64'): + machine = 'universal2' elif archs == ('i386', 'ppc'): machine = 'fat' elif archs == ('i386', 'x86_64'): diff --git a/Lib/_pyio.py b/Lib/_pyio.py index fd31b8ca9d83fbef5c4cb59f1f7e955808e61e67..4804ed27cd14d628eef56df32cc69722d49d94ea 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -36,6 +36,8 @@ # Does io.IOBase finalizer log the exception if the close() method fails? # The exception is ignored silently by default in release build. _IOBASE_EMITS_UNRAISABLE = (hasattr(sys, "gettotalrefcount") or sys.flags.dev_mode) +# Does open() check its 'errors' argument? +_CHECK_ERRORS = _IOBASE_EMITS_UNRAISABLE def open(file, mode="r", buffering=-1, encoding=None, errors=None, @@ -802,6 +804,9 @@ def tell(self): return pos def truncate(self, pos=None): + self._checkClosed() + self._checkWritable() + # Flush the stream. We're mixing buffered I/O with lower-level I/O, # and a flush may be necessary to synch both views of the current # file state. @@ -1571,7 +1576,7 @@ def __init__(self, file, mode='r', closefd=True, opener=None): raise IsADirectoryError(errno.EISDIR, os.strerror(errno.EISDIR), file) except AttributeError: - # Ignore the AttribueError if stat.S_ISDIR or errno.EISDIR + # Ignore the AttributeError if stat.S_ISDIR or errno.EISDIR # don't exist. pass self._blksize = getattr(fdfstat, 'st_blksize', 0) @@ -2026,6 +2031,8 @@ def __init__(self, buffer, encoding=None, errors=None, newline=None, else: if not isinstance(errors, str): raise ValueError("invalid errors: %r" % errors) + if _CHECK_ERRORS: + codecs.lookup_error(errors) self._buffer = buffer self._decoded_chars = '' # buffer for text returned from decoder @@ -2295,7 +2302,7 @@ def _read_chunk(self): return not eof def _pack_cookie(self, position, dec_flags=0, - bytes_to_feed=0, need_eof=0, chars_to_skip=0): + bytes_to_feed=0, need_eof=False, chars_to_skip=0): # The meaning of a tell() cookie is: seek to position, set the # decoder flags to dec_flags, read bytes_to_feed bytes, feed them # into the decoder with need_eof as the EOF flag, then skip @@ -2309,7 +2316,7 @@ def _unpack_cookie(self, bigint): rest, dec_flags = divmod(rest, 1<<64) rest, bytes_to_feed = divmod(rest, 1<<64) need_eof, chars_to_skip = divmod(rest, 1<<64) - return position, dec_flags, bytes_to_feed, need_eof, chars_to_skip + return position, dec_flags, bytes_to_feed, bool(need_eof), chars_to_skip def tell(self): if not self._seekable: @@ -2383,7 +2390,7 @@ def tell(self): # (a point where the decoder has nothing buffered, so seek() # can safely start from there and advance to this location). bytes_fed = 0 - need_eof = 0 + need_eof = False # Chars decoded since `start_pos` chars_decoded = 0 for i in range(skip_bytes, len(next_input)): @@ -2400,7 +2407,7 @@ def tell(self): else: # We didn't get enough decoded data; signal EOF to get more. chars_decoded += len(decoder.decode(b'', final=True)) - need_eof = 1 + need_eof = True if chars_decoded < chars_to_skip: raise OSError("can't reconstruct logical file position") diff --git a/Lib/_strptime.py b/Lib/_strptime.py index f4f3c0b80c1d05bbf383f74d8ee233a1b9e41cab..5df37f5f4b89d5c7e7bbcdc5b986c3208c36c5cc 100644 --- a/Lib/_strptime.py +++ b/Lib/_strptime.py @@ -182,7 +182,7 @@ def __init__(self, locale_time=None): self.locale_time = LocaleTime() base = super() base.__init__({ - # The " \d" part of the regex is to make %c from ANSI C work + # The " [1-9]" part of the regex is to make %c from ANSI C work 'd': r"(?P3[0-1]|[1-2]\d|0[1-9]|[1-9]| [1-9])", 'f': r"(?P[0-9]{1,6})", 'H': r"(?P2[0-3]|[0-1]\d|\d)", diff --git a/Lib/_weakrefset.py b/Lib/_weakrefset.py index 7a84823622ee7c7bec5f97294d3cc9bba94c0137..b267780f0ced73087c8670473fdf4e7fe22ff193 100644 --- a/Lib/_weakrefset.py +++ b/Lib/_weakrefset.py @@ -3,6 +3,7 @@ # by abc.py to load everything else at startup. from _weakref import ref +from types import GenericAlias __all__ = ['WeakSet'] @@ -197,3 +198,5 @@ def isdisjoint(self, other): def __repr__(self): return repr(self.data) + + __class_getitem__ = classmethod(GenericAlias) diff --git a/Lib/aifc.py b/Lib/aifc.py index 1916e7ef8e7eab8d9e425d80f0d7fa4b1f146936..ed5da7d8936fdd94301accd4ac725ab0e5fe8877 100644 --- a/Lib/aifc.py +++ b/Lib/aifc.py @@ -138,7 +138,7 @@ import builtins import warnings -__all__ = ["Error", "open", "openfp"] +__all__ = ["Error", "open"] class Error(Exception): pass @@ -920,10 +920,6 @@ def open(f, mode=None): else: raise Error("mode must be 'r', 'rb', 'w', or 'wb'") -def openfp(f, mode=None): - warnings.warn("aifc.openfp is deprecated since Python 3.7. " - "Use aifc.open instead.", DeprecationWarning, stacklevel=2) - return open(f, mode=mode) if __name__ == '__main__': import sys diff --git a/Lib/antigravity.py b/Lib/antigravity.py index c6f174ca6d8736949754519c167fea0182246827..6dc520733577af68cd7926105204baf807251a39 100644 --- a/Lib/antigravity.py +++ b/Lib/antigravity.py @@ -12,6 +12,6 @@ def geohash(latitude, longitude, datedow): ''' # https://xkcd.com/426/ - h = hashlib.md5(datedow).hexdigest() + h = hashlib.md5(datedow, usedforsecurity=False).hexdigest() p, q = [('%f' % float.fromhex('0.' + x)) for x in (h[:16], h[16:32])] print('%d%s %d%s' % (latitude, p[1:], longitude, q[1:])) diff --git a/Lib/argparse.py b/Lib/argparse.py index 2dad5f123f3903e482a9e5b50941905d26816eb5..2fb1da59f942cff7fbfc136ebd08ee8ec14bcbaa 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -67,6 +67,7 @@ 'ArgumentParser', 'ArgumentError', 'ArgumentTypeError', + 'BooleanOptionalAction', 'FileType', 'HelpFormatter', 'ArgumentDefaultsHelpFormatter', @@ -86,7 +87,6 @@ import os as _os import re as _re -import shutil as _shutil import sys as _sys from gettext import gettext as _, ngettext @@ -129,7 +129,7 @@ def __repr__(self): return '%s(%s)' % (type_name, ', '.join(arg_strings)) def _get_kwargs(self): - return sorted(self.__dict__.items()) + return list(self.__dict__.items()) def _get_args(self): return [] @@ -166,7 +166,8 @@ def __init__(self, # default setting for width if width is None: - width = _shutil.get_terminal_size().columns + import shutil + width = shutil.get_terminal_size().columns width -= 2 self._prog = prog @@ -263,7 +264,7 @@ def add_argument(self, action): invocations.append(get_invocation(subaction)) # update the maximum item length - invocation_length = max([len(s) for s in invocations]) + invocation_length = max(map(len, invocations)) action_length = invocation_length + self._current_indent self._action_max_length = max(self._action_max_length, action_length) @@ -454,7 +455,7 @@ def _format_actions_usage(self, actions, groups): # if the Optional doesn't take a value, format is: # -s or --long if action.nargs == 0: - part = '%s' % option_string + part = action.format_usage() # if the Optional takes a value, format is: # -s ARGS or --long ARGS @@ -590,7 +591,11 @@ def _format_args(self, action, default_metavar): elif action.nargs == OPTIONAL: result = '[%s]' % get_metavar(1) elif action.nargs == ZERO_OR_MORE: - result = '[%s [%s ...]]' % get_metavar(2) + metavar = get_metavar(1) + if len(metavar) == 2: + result = '[%s [%s ...]]' % metavar + else: + result = '[%s ...]' % metavar elif action.nargs == ONE_OR_MORE: result = '%s [%s ...]' % get_metavar(2) elif action.nargs == REMAINDER: @@ -842,9 +847,52 @@ def _get_kwargs(self): ] return [(name, getattr(self, name)) for name in names] + def format_usage(self): + return self.option_strings[0] + def __call__(self, parser, namespace, values, option_string=None): raise NotImplementedError(_('.__call__() not defined')) +class BooleanOptionalAction(Action): + def __init__(self, + option_strings, + dest, + default=None, + type=None, + choices=None, + required=False, + help=None, + metavar=None): + + _option_strings = [] + for option_string in option_strings: + _option_strings.append(option_string) + + if option_string.startswith('--'): + option_string = '--no-' + option_string[2:] + _option_strings.append(option_string) + + if help is not None and default is not None: + help += f" (default: {default})" + + super().__init__( + option_strings=_option_strings, + dest=dest, + nargs=0, + default=default, + type=type, + choices=choices, + required=required, + help=help, + metavar=metavar) + + def __call__(self, parser, namespace, values, option_string=None): + if option_string in self.option_strings: + setattr(namespace, self.dest, not option_string.startswith('--no-')) + + def format_usage(self): + return ' | '.join(self.option_strings) + class _StoreAction(Action): @@ -1490,10 +1538,8 @@ def _get_optional_kwargs(self, *args, **kwargs): # strings starting with two prefix characters are long options option_strings.append(option_string) - if option_string[0] in self.prefix_chars: - if len(option_string) > 1: - if option_string[1] in self.prefix_chars: - long_option_strings.append(option_string) + if len(option_string) > 1 and option_string[1] in self.prefix_chars: + long_option_strings.append(option_string) # infer destination, '--foo-bar' -> 'foo_bar' and '-x' -> 'x' dest = kwargs.pop('dest', None) @@ -1633,6 +1679,8 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): - conflict_handler -- String indicating how to handle conflicts - add_help -- Add a -h/-help option - allow_abbrev -- Allow long options to be abbreviated unambiguously + - exit_on_error -- Determines whether or not ArgumentParser exits with + error info when an error occurs """ def __init__(self, @@ -1647,7 +1695,8 @@ def __init__(self, argument_default=None, conflict_handler='error', add_help=True, - allow_abbrev=True): + allow_abbrev=True, + exit_on_error=True): superinit = super(ArgumentParser, self).__init__ superinit(description=description, @@ -1666,6 +1715,7 @@ def __init__(self, self.fromfile_prefix_chars = fromfile_prefix_chars self.add_help = add_help self.allow_abbrev = allow_abbrev + self.exit_on_error = exit_on_error add_group = self.add_argument_group self._positionals = add_group(_('positional arguments')) @@ -1796,15 +1846,19 @@ def parse_known_args(self, args=None, namespace=None): setattr(namespace, dest, self._defaults[dest]) # parse the arguments and exit if there are any errors - try: + if self.exit_on_error: + try: + namespace, args = self._parse_known_args(args, namespace) + except ArgumentError: + err = _sys.exc_info()[1] + self.error(str(err)) + else: namespace, args = self._parse_known_args(args, namespace) - if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR): - args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR)) - delattr(namespace, _UNRECOGNIZED_ARGS_ATTR) - return namespace, args - except ArgumentError: - err = _sys.exc_info()[1] - self.error(str(err)) + + if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR): + args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR)) + delattr(namespace, _UNRECOGNIZED_ARGS_ATTR) + return namespace, args def _parse_known_args(self, arg_strings, namespace): # replace arg strings that are file references diff --git a/Lib/ast.py b/Lib/ast.py index 99a1148a3ba248e2d51c8838092c31910a1eaf04..ecd4895f7570c93bd3496c5bc8a89ab21daa822d 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -24,7 +24,10 @@ :copyright: Copyright 2008 by Armin Ronacher. :license: Python License. """ +import sys from _ast import * +from contextlib import contextmanager, nullcontext +from enum import IntEnum, auto def parse(source, filename='', mode='exec', *, @@ -82,6 +85,9 @@ def _convert(node): return list(map(_convert, node.elts)) elif isinstance(node, Set): return set(map(_convert, node.elts)) + elif (isinstance(node, Call) and isinstance(node.func, Name) and + node.func.id == 'set' and node.args == node.keywords == []): + return set() elif isinstance(node, Dict): if len(node.keys) != len(node.values): _raise_malformed_node(node) @@ -99,7 +105,7 @@ def _convert(node): return _convert(node_or_string) -def dump(node, annotate_fields=True, include_attributes=False): +def dump(node, annotate_fields=True, include_attributes=False, *, indent=None): """ Return a formatted dump of the tree in node. This is mainly useful for debugging purposes. If annotate_fields is true (by default), @@ -107,35 +113,63 @@ def dump(node, annotate_fields=True, include_attributes=False): If annotate_fields is false, the result string will be more compact by omitting unambiguous field names. Attributes such as line numbers and column offsets are not dumped by default. If this is wanted, - include_attributes can be set to true. + include_attributes can be set to true. If indent is a non-negative + integer or string, then the tree will be pretty-printed with that indent + level. None (the default) selects the single line representation. """ - def _format(node): + def _format(node, level=0): + if indent is not None: + level += 1 + prefix = '\n' + indent * level + sep = ',\n' + indent * level + else: + prefix = '' + sep = ', ' if isinstance(node, AST): + cls = type(node) args = [] + allsimple = True keywords = annotate_fields - for field in node._fields: + for name in node._fields: try: - value = getattr(node, field) + value = getattr(node, name) except AttributeError: keywords = True + continue + if value is None and getattr(cls, name, ...) is None: + keywords = True + continue + value, simple = _format(value, level) + allsimple = allsimple and simple + if keywords: + args.append('%s=%s' % (name, value)) else: - if keywords: - args.append('%s=%s' % (field, _format(value))) - else: - args.append(_format(value)) + args.append(value) if include_attributes and node._attributes: - for a in node._attributes: + for name in node._attributes: try: - args.append('%s=%s' % (a, _format(getattr(node, a)))) + value = getattr(node, name) except AttributeError: - pass - return '%s(%s)' % (node.__class__.__name__, ', '.join(args)) + continue + if value is None and getattr(cls, name, ...) is None: + continue + value, simple = _format(value, level) + allsimple = allsimple and simple + args.append('%s=%s' % (name, value)) + if allsimple and len(args) <= 3: + return '%s(%s)' % (node.__class__.__name__, ', '.join(args)), not args + return '%s(%s%s)' % (node.__class__.__name__, prefix, sep.join(args)), False elif isinstance(node, list): - return '[%s]' % ', '.join(_format(x) for x in node) - return repr(node) + if not node: + return '[]', True + return '[%s%s]' % (prefix, sep.join(_format(x, level)[0] for x in node)), False + return repr(node), True + if not isinstance(node, AST): raise TypeError('expected AST, got %r' % node.__class__.__name__) - return _format(node) + if indent is not None and not isinstance(indent, str): + indent = ' ' * indent + return _format(node)[0] def copy_location(new_node, old_node): @@ -144,9 +178,14 @@ def copy_location(new_node, old_node): attributes) from *old_node* to *new_node* if possible, and return *new_node*. """ for attr in 'lineno', 'col_offset', 'end_lineno', 'end_col_offset': - if attr in old_node._attributes and attr in new_node._attributes \ - and hasattr(old_node, attr): - setattr(new_node, attr, getattr(old_node, attr)) + if attr in old_node._attributes and attr in new_node._attributes: + value = getattr(old_node, attr, None) + # end_lineno and end_col_offset are optional attributes, and they + # should be copied whether the value is None or not. + if value is not None or ( + hasattr(old_node, attr) and attr.startswith("end_") + ): + setattr(new_node, attr, value) return new_node @@ -165,7 +204,7 @@ def _fix(node, lineno, col_offset, end_lineno, end_col_offset): else: lineno = node.lineno if 'end_lineno' in node._attributes: - if not hasattr(node, 'end_lineno'): + if getattr(node, 'end_lineno', None) is None: node.end_lineno = end_lineno else: end_lineno = node.end_lineno @@ -175,7 +214,7 @@ def _fix(node, lineno, col_offset, end_lineno, end_col_offset): else: col_offset = node.col_offset if 'end_col_offset' in node._attributes: - if not hasattr(node, 'end_col_offset'): + if getattr(node, 'end_col_offset', None) is None: node.end_col_offset = end_col_offset else: end_col_offset = node.end_col_offset @@ -194,8 +233,11 @@ def increment_lineno(node, n=1): for child in walk(node): if 'lineno' in child._attributes: child.lineno = getattr(child, 'lineno', 0) + n - if 'end_lineno' in child._attributes: - child.end_lineno = getattr(child, 'end_lineno', 0) + n + if ( + "end_lineno" in child._attributes + and (end_lineno := getattr(child, "end_lineno", 0)) is not None + ): + child.end_lineno = end_lineno + n return node @@ -277,7 +319,7 @@ def _splitlines_no_ff(source): def _pad_whitespace(source): - """Replace all chars except '\f\t' in a line with spaces.""" + r"""Replace all chars except '\f\t' in a line with spaces.""" result = '' for c in source: if c in '\f\t': @@ -297,6 +339,8 @@ def get_source_segment(source, node, *, padded=False): be padded with spaces to match its original position. """ try: + if node.end_lineno is None or node.end_col_offset is None: + return None lineno = node.lineno - 1 end_lineno = node.end_lineno - 1 col_offset = node.col_offset @@ -389,7 +433,7 @@ def visit_Constant(self, node): else: import warnings warnings.warn(f"{method} is deprecated; add visit_Constant", - PendingDeprecationWarning, 2) + DeprecationWarning, 2) return visitor(node) return self.generic_visit(node) @@ -413,7 +457,7 @@ class RewriteName(NodeTransformer): def visit_Name(self, node): return Subscript( value=Name(id='data', ctx=Load()), - slice=Index(value=Str(s=node.id)), + slice=Constant(value=node.id), ctx=node.ctx ) @@ -453,20 +497,26 @@ def generic_visit(self, node): return node -# The following code is for backward compatibility. -# It will be removed in future. +# If the ast module is loaded more than once, only add deprecated methods once +if not hasattr(Constant, 'n'): + # The following code is for backward compatibility. + # It will be removed in future. -def _getter(self): - return self.value + def _getter(self): + """Deprecated. Use value instead.""" + return self.value -def _setter(self, value): - self.value = value + def _setter(self, value): + self.value = value -Constant.n = property(_getter, _setter) -Constant.s = property(_getter, _setter) + Constant.n = property(_getter, _setter) + Constant.s = property(_getter, _setter) class _ABC(type): + def __init__(cls, *args): + cls.__doc__ = """Deprecated AST node class. Use ast.Constant instead""" + def __instancecheck__(cls, inst): if not isinstance(inst, Constant): return False @@ -527,6 +577,7 @@ def __new__(cls, *args, **kwargs): _const_types_not = { Num: (bool,), } + _const_node_type_names = { bool: 'NameConstant', # should be before int type(None): 'NameConstant', @@ -537,3 +588,1005 @@ def __new__(cls, *args, **kwargs): bytes: 'Bytes', type(...): 'Ellipsis', } + +class slice(AST): + """Deprecated AST node class.""" + +class Index(slice): + """Deprecated AST node class. Use the index value directly instead.""" + def __new__(cls, value, **kwargs): + return value + +class ExtSlice(slice): + """Deprecated AST node class. Use ast.Tuple instead.""" + def __new__(cls, dims=(), **kwargs): + return Tuple(list(dims), Load(), **kwargs) + +# If the ast module is loaded more than once, only add deprecated methods once +if not hasattr(Tuple, 'dims'): + # The following code is for backward compatibility. + # It will be removed in future. + + def _dims_getter(self): + """Deprecated. Use elts instead.""" + return self.elts + + def _dims_setter(self, value): + self.elts = value + + Tuple.dims = property(_dims_getter, _dims_setter) + +class Suite(mod): + """Deprecated AST node class. Unused in Python 3.""" + +class AugLoad(expr_context): + """Deprecated AST node class. Unused in Python 3.""" + +class AugStore(expr_context): + """Deprecated AST node class. Unused in Python 3.""" + +class Param(expr_context): + """Deprecated AST node class. Unused in Python 3.""" + + +# Large float and imaginary literals get turned into infinities in the AST. +# We unparse those infinities to INFSTR. +_INFSTR = "1e" + repr(sys.float_info.max_10_exp + 1) + +class _Precedence(IntEnum): + """Precedence table that originated from python grammar.""" + + TUPLE = auto() + YIELD = auto() # 'yield', 'yield from' + TEST = auto() # 'if'-'else', 'lambda' + OR = auto() # 'or' + AND = auto() # 'and' + NOT = auto() # 'not' + CMP = auto() # '<', '>', '==', '>=', '<=', '!=', + # 'in', 'not in', 'is', 'is not' + EXPR = auto() + BOR = EXPR # '|' + BXOR = auto() # '^' + BAND = auto() # '&' + SHIFT = auto() # '<<', '>>' + ARITH = auto() # '+', '-' + TERM = auto() # '*', '@', '/', '%', '//' + FACTOR = auto() # unary '+', '-', '~' + POWER = auto() # '**' + AWAIT = auto() # 'await' + ATOM = auto() + + def next(self): + try: + return self.__class__(self + 1) + except ValueError: + return self + + +_SINGLE_QUOTES = ("'", '"') +_MULTI_QUOTES = ('"""', "'''") +_ALL_QUOTES = (*_SINGLE_QUOTES, *_MULTI_QUOTES) + +class _Unparser(NodeVisitor): + """Methods in this class recursively traverse an AST and + output source code for the abstract syntax; original formatting + is disregarded.""" + + def __init__(self, *, _avoid_backslashes=False): + self._source = [] + self._buffer = [] + self._precedences = {} + self._type_ignores = {} + self._indent = 0 + self._avoid_backslashes = _avoid_backslashes + + def interleave(self, inter, f, seq): + """Call f on each item in seq, calling inter() in between.""" + seq = iter(seq) + try: + f(next(seq)) + except StopIteration: + pass + else: + for x in seq: + inter() + f(x) + + def items_view(self, traverser, items): + """Traverse and separate the given *items* with a comma and append it to + the buffer. If *items* is a single item sequence, a trailing comma + will be added.""" + if len(items) == 1: + traverser(items[0]) + self.write(",") + else: + self.interleave(lambda: self.write(", "), traverser, items) + + def maybe_newline(self): + """Adds a newline if it isn't the start of generated source""" + if self._source: + self.write("\n") + + def fill(self, text=""): + """Indent a piece of text and append it, according to the current + indentation level""" + self.maybe_newline() + self.write(" " * self._indent + text) + + def write(self, text): + """Append a piece of text""" + self._source.append(text) + + def buffer_writer(self, text): + self._buffer.append(text) + + @property + def buffer(self): + value = "".join(self._buffer) + self._buffer.clear() + return value + + @contextmanager + def block(self, *, extra = None): + """A context manager for preparing the source for blocks. It adds + the character':', increases the indentation on enter and decreases + the indentation on exit. If *extra* is given, it will be directly + appended after the colon character. + """ + self.write(":") + if extra: + self.write(extra) + self._indent += 1 + yield + self._indent -= 1 + + @contextmanager + def delimit(self, start, end): + """A context manager for preparing the source for expressions. It adds + *start* to the buffer and enters, after exit it adds *end*.""" + + self.write(start) + yield + self.write(end) + + def delimit_if(self, start, end, condition): + if condition: + return self.delimit(start, end) + else: + return nullcontext() + + def require_parens(self, precedence, node): + """Shortcut to adding precedence related parens""" + return self.delimit_if("(", ")", self.get_precedence(node) > precedence) + + def get_precedence(self, node): + return self._precedences.get(node, _Precedence.TEST) + + def set_precedence(self, precedence, *nodes): + for node in nodes: + self._precedences[node] = precedence + + def get_raw_docstring(self, node): + """If a docstring node is found in the body of the *node* parameter, + return that docstring node, None otherwise. + + Logic mirrored from ``_PyAST_GetDocString``.""" + if not isinstance( + node, (AsyncFunctionDef, FunctionDef, ClassDef, Module) + ) or len(node.body) < 1: + return None + node = node.body[0] + if not isinstance(node, Expr): + return None + node = node.value + if isinstance(node, Constant) and isinstance(node.value, str): + return node + + def get_type_comment(self, node): + comment = self._type_ignores.get(node.lineno) or node.type_comment + if comment is not None: + return f" # type: {comment}" + + def traverse(self, node): + if isinstance(node, list): + for item in node: + self.traverse(item) + else: + super().visit(node) + + def visit(self, node): + """Outputs a source code string that, if converted back to an ast + (using ast.parse) will generate an AST equivalent to *node*""" + self._source = [] + self.traverse(node) + return "".join(self._source) + + def _write_docstring_and_traverse_body(self, node): + if (docstring := self.get_raw_docstring(node)): + self._write_docstring(docstring) + self.traverse(node.body[1:]) + else: + self.traverse(node.body) + + def visit_Module(self, node): + self._type_ignores = { + ignore.lineno: f"ignore{ignore.tag}" + for ignore in node.type_ignores + } + self._write_docstring_and_traverse_body(node) + self._type_ignores.clear() + + def visit_FunctionType(self, node): + with self.delimit("(", ")"): + self.interleave( + lambda: self.write(", "), self.traverse, node.argtypes + ) + + self.write(" -> ") + self.traverse(node.returns) + + def visit_Expr(self, node): + self.fill() + self.set_precedence(_Precedence.YIELD, node.value) + self.traverse(node.value) + + def visit_NamedExpr(self, node): + with self.require_parens(_Precedence.TUPLE, node): + self.set_precedence(_Precedence.ATOM, node.target, node.value) + self.traverse(node.target) + self.write(" := ") + self.traverse(node.value) + + def visit_Import(self, node): + self.fill("import ") + self.interleave(lambda: self.write(", "), self.traverse, node.names) + + def visit_ImportFrom(self, node): + self.fill("from ") + self.write("." * node.level) + if node.module: + self.write(node.module) + self.write(" import ") + self.interleave(lambda: self.write(", "), self.traverse, node.names) + + def visit_Assign(self, node): + self.fill() + for target in node.targets: + self.traverse(target) + self.write(" = ") + self.traverse(node.value) + if type_comment := self.get_type_comment(node): + self.write(type_comment) + + def visit_AugAssign(self, node): + self.fill() + self.traverse(node.target) + self.write(" " + self.binop[node.op.__class__.__name__] + "= ") + self.traverse(node.value) + + def visit_AnnAssign(self, node): + self.fill() + with self.delimit_if("(", ")", not node.simple and isinstance(node.target, Name)): + self.traverse(node.target) + self.write(": ") + self.traverse(node.annotation) + if node.value: + self.write(" = ") + self.traverse(node.value) + + def visit_Return(self, node): + self.fill("return") + if node.value: + self.write(" ") + self.traverse(node.value) + + def visit_Pass(self, node): + self.fill("pass") + + def visit_Break(self, node): + self.fill("break") + + def visit_Continue(self, node): + self.fill("continue") + + def visit_Delete(self, node): + self.fill("del ") + self.interleave(lambda: self.write(", "), self.traverse, node.targets) + + def visit_Assert(self, node): + self.fill("assert ") + self.traverse(node.test) + if node.msg: + self.write(", ") + self.traverse(node.msg) + + def visit_Global(self, node): + self.fill("global ") + self.interleave(lambda: self.write(", "), self.write, node.names) + + def visit_Nonlocal(self, node): + self.fill("nonlocal ") + self.interleave(lambda: self.write(", "), self.write, node.names) + + def visit_Await(self, node): + with self.require_parens(_Precedence.AWAIT, node): + self.write("await") + if node.value: + self.write(" ") + self.set_precedence(_Precedence.ATOM, node.value) + self.traverse(node.value) + + def visit_Yield(self, node): + with self.require_parens(_Precedence.YIELD, node): + self.write("yield") + if node.value: + self.write(" ") + self.set_precedence(_Precedence.ATOM, node.value) + self.traverse(node.value) + + def visit_YieldFrom(self, node): + with self.require_parens(_Precedence.YIELD, node): + self.write("yield from ") + if not node.value: + raise ValueError("Node can't be used without a value attribute.") + self.set_precedence(_Precedence.ATOM, node.value) + self.traverse(node.value) + + def visit_Raise(self, node): + self.fill("raise") + if not node.exc: + if node.cause: + raise ValueError(f"Node can't use cause without an exception.") + return + self.write(" ") + self.traverse(node.exc) + if node.cause: + self.write(" from ") + self.traverse(node.cause) + + def visit_Try(self, node): + self.fill("try") + with self.block(): + self.traverse(node.body) + for ex in node.handlers: + self.traverse(ex) + if node.orelse: + self.fill("else") + with self.block(): + self.traverse(node.orelse) + if node.finalbody: + self.fill("finally") + with self.block(): + self.traverse(node.finalbody) + + def visit_ExceptHandler(self, node): + self.fill("except") + if node.type: + self.write(" ") + self.traverse(node.type) + if node.name: + self.write(" as ") + self.write(node.name) + with self.block(): + self.traverse(node.body) + + def visit_ClassDef(self, node): + self.maybe_newline() + for deco in node.decorator_list: + self.fill("@") + self.traverse(deco) + self.fill("class " + node.name) + with self.delimit_if("(", ")", condition = node.bases or node.keywords): + comma = False + for e in node.bases: + if comma: + self.write(", ") + else: + comma = True + self.traverse(e) + for e in node.keywords: + if comma: + self.write(", ") + else: + comma = True + self.traverse(e) + + with self.block(): + self._write_docstring_and_traverse_body(node) + + def visit_FunctionDef(self, node): + self._function_helper(node, "def") + + def visit_AsyncFunctionDef(self, node): + self._function_helper(node, "async def") + + def _function_helper(self, node, fill_suffix): + self.maybe_newline() + for deco in node.decorator_list: + self.fill("@") + self.traverse(deco) + def_str = fill_suffix + " " + node.name + self.fill(def_str) + with self.delimit("(", ")"): + self.traverse(node.args) + if node.returns: + self.write(" -> ") + self.traverse(node.returns) + with self.block(extra=self.get_type_comment(node)): + self._write_docstring_and_traverse_body(node) + + def visit_For(self, node): + self._for_helper("for ", node) + + def visit_AsyncFor(self, node): + self._for_helper("async for ", node) + + def _for_helper(self, fill, node): + self.fill(fill) + self.traverse(node.target) + self.write(" in ") + self.traverse(node.iter) + with self.block(extra=self.get_type_comment(node)): + self.traverse(node.body) + if node.orelse: + self.fill("else") + with self.block(): + self.traverse(node.orelse) + + def visit_If(self, node): + self.fill("if ") + self.traverse(node.test) + with self.block(): + self.traverse(node.body) + # collapse nested ifs into equivalent elifs. + while node.orelse and len(node.orelse) == 1 and isinstance(node.orelse[0], If): + node = node.orelse[0] + self.fill("elif ") + self.traverse(node.test) + with self.block(): + self.traverse(node.body) + # final else + if node.orelse: + self.fill("else") + with self.block(): + self.traverse(node.orelse) + + def visit_While(self, node): + self.fill("while ") + self.traverse(node.test) + with self.block(): + self.traverse(node.body) + if node.orelse: + self.fill("else") + with self.block(): + self.traverse(node.orelse) + + def visit_With(self, node): + self.fill("with ") + self.interleave(lambda: self.write(", "), self.traverse, node.items) + with self.block(extra=self.get_type_comment(node)): + self.traverse(node.body) + + def visit_AsyncWith(self, node): + self.fill("async with ") + self.interleave(lambda: self.write(", "), self.traverse, node.items) + with self.block(extra=self.get_type_comment(node)): + self.traverse(node.body) + + def _str_literal_helper( + self, string, *, quote_types=_ALL_QUOTES, escape_special_whitespace=False + ): + """Helper for writing string literals, minimizing escapes. + Returns the tuple (string literal to write, possible quote types). + """ + def escape_char(c): + # \n and \t are non-printable, but we only escape them if + # escape_special_whitespace is True + if not escape_special_whitespace and c in "\n\t": + return c + # Always escape backslashes and other non-printable characters + if c == "\\" or not c.isprintable(): + return c.encode("unicode_escape").decode("ascii") + return c + + escaped_string = "".join(map(escape_char, string)) + possible_quotes = quote_types + if "\n" in escaped_string: + possible_quotes = [q for q in possible_quotes if q in _MULTI_QUOTES] + possible_quotes = [q for q in possible_quotes if q not in escaped_string] + if not possible_quotes: + # If there aren't any possible_quotes, fallback to using repr + # on the original string. Try to use a quote from quote_types, + # e.g., so that we use triple quotes for docstrings. + string = repr(string) + quote = next((q for q in quote_types if string[0] in q), string[0]) + return string[1:-1], [quote] + if escaped_string: + # Sort so that we prefer '''"''' over """\"""" + possible_quotes.sort(key=lambda q: q[0] == escaped_string[-1]) + # If we're using triple quotes and we'd need to escape a final + # quote, escape it + if possible_quotes[0][0] == escaped_string[-1]: + assert len(possible_quotes[0]) == 3 + escaped_string = escaped_string[:-1] + "\\" + escaped_string[-1] + return escaped_string, possible_quotes + + def _write_str_avoiding_backslashes(self, string, *, quote_types=_ALL_QUOTES): + """Write string literal value with a best effort attempt to avoid backslashes.""" + string, quote_types = self._str_literal_helper(string, quote_types=quote_types) + quote_type = quote_types[0] + self.write(f"{quote_type}{string}{quote_type}") + + def visit_JoinedStr(self, node): + self.write("f") + if self._avoid_backslashes: + self._fstring_JoinedStr(node, self.buffer_writer) + self._write_str_avoiding_backslashes(self.buffer) + return + + # If we don't need to avoid backslashes globally (i.e., we only need + # to avoid them inside FormattedValues), it's cosmetically preferred + # to use escaped whitespace. That is, it's preferred to use backslashes + # for cases like: f"{x}\n". To accomplish this, we keep track of what + # in our buffer corresponds to FormattedValues and what corresponds to + # Constant parts of the f-string, and allow escapes accordingly. + buffer = [] + for value in node.values: + meth = getattr(self, "_fstring_" + type(value).__name__) + meth(value, self.buffer_writer) + buffer.append((self.buffer, isinstance(value, Constant))) + new_buffer = [] + quote_types = _ALL_QUOTES + for value, is_constant in buffer: + # Repeatedly narrow down the list of possible quote_types + value, quote_types = self._str_literal_helper( + value, quote_types=quote_types, + escape_special_whitespace=is_constant + ) + new_buffer.append(value) + value = "".join(new_buffer) + quote_type = quote_types[0] + self.write(f"{quote_type}{value}{quote_type}") + + def visit_FormattedValue(self, node): + self.write("f") + self._fstring_FormattedValue(node, self.buffer_writer) + self._write_str_avoiding_backslashes(self.buffer) + + def _fstring_JoinedStr(self, node, write): + for value in node.values: + meth = getattr(self, "_fstring_" + type(value).__name__) + meth(value, write) + + def _fstring_Constant(self, node, write): + if not isinstance(node.value, str): + raise ValueError("Constants inside JoinedStr should be a string.") + value = node.value.replace("{", "{{").replace("}", "}}") + write(value) + + def _fstring_FormattedValue(self, node, write): + write("{") + unparser = type(self)(_avoid_backslashes=True) + unparser.set_precedence(_Precedence.TEST.next(), node.value) + expr = unparser.visit(node.value) + if expr.startswith("{"): + write(" ") # Separate pair of opening brackets as "{ {" + if "\\" in expr: + raise ValueError("Unable to avoid backslash in f-string expression part") + write(expr) + if node.conversion != -1: + conversion = chr(node.conversion) + if conversion not in "sra": + raise ValueError("Unknown f-string conversion.") + write(f"!{conversion}") + if node.format_spec: + write(":") + meth = getattr(self, "_fstring_" + type(node.format_spec).__name__) + meth(node.format_spec, write) + write("}") + + def visit_Name(self, node): + self.write(node.id) + + def _write_docstring(self, node): + self.fill() + if node.kind == "u": + self.write("u") + self._write_str_avoiding_backslashes(node.value, quote_types=_MULTI_QUOTES) + + def _write_constant(self, value): + if isinstance(value, (float, complex)): + # Substitute overflowing decimal literal for AST infinities. + self.write(repr(value).replace("inf", _INFSTR)) + elif self._avoid_backslashes and isinstance(value, str): + self._write_str_avoiding_backslashes(value) + else: + self.write(repr(value)) + + def visit_Constant(self, node): + value = node.value + if isinstance(value, tuple): + with self.delimit("(", ")"): + self.items_view(self._write_constant, value) + elif value is ...: + self.write("...") + else: + if node.kind == "u": + self.write("u") + self._write_constant(node.value) + + def visit_List(self, node): + with self.delimit("[", "]"): + self.interleave(lambda: self.write(", "), self.traverse, node.elts) + + def visit_ListComp(self, node): + with self.delimit("[", "]"): + self.traverse(node.elt) + for gen in node.generators: + self.traverse(gen) + + def visit_GeneratorExp(self, node): + with self.delimit("(", ")"): + self.traverse(node.elt) + for gen in node.generators: + self.traverse(gen) + + def visit_SetComp(self, node): + with self.delimit("{", "}"): + self.traverse(node.elt) + for gen in node.generators: + self.traverse(gen) + + def visit_DictComp(self, node): + with self.delimit("{", "}"): + self.traverse(node.key) + self.write(": ") + self.traverse(node.value) + for gen in node.generators: + self.traverse(gen) + + def visit_comprehension(self, node): + if node.is_async: + self.write(" async for ") + else: + self.write(" for ") + self.set_precedence(_Precedence.TUPLE, node.target) + self.traverse(node.target) + self.write(" in ") + self.set_precedence(_Precedence.TEST.next(), node.iter, *node.ifs) + self.traverse(node.iter) + for if_clause in node.ifs: + self.write(" if ") + self.traverse(if_clause) + + def visit_IfExp(self, node): + with self.require_parens(_Precedence.TEST, node): + self.set_precedence(_Precedence.TEST.next(), node.body, node.test) + self.traverse(node.body) + self.write(" if ") + self.traverse(node.test) + self.write(" else ") + self.set_precedence(_Precedence.TEST, node.orelse) + self.traverse(node.orelse) + + def visit_Set(self, node): + if not node.elts: + raise ValueError("Set node should have at least one item") + with self.delimit("{", "}"): + self.interleave(lambda: self.write(", "), self.traverse, node.elts) + + def visit_Dict(self, node): + def write_key_value_pair(k, v): + self.traverse(k) + self.write(": ") + self.traverse(v) + + def write_item(item): + k, v = item + if k is None: + # for dictionary unpacking operator in dicts {**{'y': 2}} + # see PEP 448 for details + self.write("**") + self.set_precedence(_Precedence.EXPR, v) + self.traverse(v) + else: + write_key_value_pair(k, v) + + with self.delimit("{", "}"): + self.interleave( + lambda: self.write(", "), write_item, zip(node.keys, node.values) + ) + + def visit_Tuple(self, node): + with self.delimit("(", ")"): + self.items_view(self.traverse, node.elts) + + unop = {"Invert": "~", "Not": "not", "UAdd": "+", "USub": "-"} + unop_precedence = { + "not": _Precedence.NOT, + "~": _Precedence.FACTOR, + "+": _Precedence.FACTOR, + "-": _Precedence.FACTOR, + } + + def visit_UnaryOp(self, node): + operator = self.unop[node.op.__class__.__name__] + operator_precedence = self.unop_precedence[operator] + with self.require_parens(operator_precedence, node): + self.write(operator) + # factor prefixes (+, -, ~) shouldn't be seperated + # from the value they belong, (e.g: +1 instead of + 1) + if operator_precedence is not _Precedence.FACTOR: + self.write(" ") + self.set_precedence(operator_precedence, node.operand) + self.traverse(node.operand) + + binop = { + "Add": "+", + "Sub": "-", + "Mult": "*", + "MatMult": "@", + "Div": "/", + "Mod": "%", + "LShift": "<<", + "RShift": ">>", + "BitOr": "|", + "BitXor": "^", + "BitAnd": "&", + "FloorDiv": "//", + "Pow": "**", + } + + binop_precedence = { + "+": _Precedence.ARITH, + "-": _Precedence.ARITH, + "*": _Precedence.TERM, + "@": _Precedence.TERM, + "/": _Precedence.TERM, + "%": _Precedence.TERM, + "<<": _Precedence.SHIFT, + ">>": _Precedence.SHIFT, + "|": _Precedence.BOR, + "^": _Precedence.BXOR, + "&": _Precedence.BAND, + "//": _Precedence.TERM, + "**": _Precedence.POWER, + } + + binop_rassoc = frozenset(("**",)) + def visit_BinOp(self, node): + operator = self.binop[node.op.__class__.__name__] + operator_precedence = self.binop_precedence[operator] + with self.require_parens(operator_precedence, node): + if operator in self.binop_rassoc: + left_precedence = operator_precedence.next() + right_precedence = operator_precedence + else: + left_precedence = operator_precedence + right_precedence = operator_precedence.next() + + self.set_precedence(left_precedence, node.left) + self.traverse(node.left) + self.write(f" {operator} ") + self.set_precedence(right_precedence, node.right) + self.traverse(node.right) + + cmpops = { + "Eq": "==", + "NotEq": "!=", + "Lt": "<", + "LtE": "<=", + "Gt": ">", + "GtE": ">=", + "Is": "is", + "IsNot": "is not", + "In": "in", + "NotIn": "not in", + } + + def visit_Compare(self, node): + with self.require_parens(_Precedence.CMP, node): + self.set_precedence(_Precedence.CMP.next(), node.left, *node.comparators) + self.traverse(node.left) + for o, e in zip(node.ops, node.comparators): + self.write(" " + self.cmpops[o.__class__.__name__] + " ") + self.traverse(e) + + boolops = {"And": "and", "Or": "or"} + boolop_precedence = {"and": _Precedence.AND, "or": _Precedence.OR} + + def visit_BoolOp(self, node): + operator = self.boolops[node.op.__class__.__name__] + operator_precedence = self.boolop_precedence[operator] + + def increasing_level_traverse(node): + nonlocal operator_precedence + operator_precedence = operator_precedence.next() + self.set_precedence(operator_precedence, node) + self.traverse(node) + + with self.require_parens(operator_precedence, node): + s = f" {operator} " + self.interleave(lambda: self.write(s), increasing_level_traverse, node.values) + + def visit_Attribute(self, node): + self.set_precedence(_Precedence.ATOM, node.value) + self.traverse(node.value) + # Special case: 3.__abs__() is a syntax error, so if node.value + # is an integer literal then we need to either parenthesize + # it or add an extra space to get 3 .__abs__(). + if isinstance(node.value, Constant) and isinstance(node.value.value, int): + self.write(" ") + self.write(".") + self.write(node.attr) + + def visit_Call(self, node): + self.set_precedence(_Precedence.ATOM, node.func) + self.traverse(node.func) + with self.delimit("(", ")"): + comma = False + for e in node.args: + if comma: + self.write(", ") + else: + comma = True + self.traverse(e) + for e in node.keywords: + if comma: + self.write(", ") + else: + comma = True + self.traverse(e) + + def visit_Subscript(self, node): + def is_simple_tuple(slice_value): + # when unparsing a non-empty tuple, the parantheses can be safely + # omitted if there aren't any elements that explicitly requires + # parantheses (such as starred expressions). + return ( + isinstance(slice_value, Tuple) + and slice_value.elts + and not any(isinstance(elt, Starred) for elt in slice_value.elts) + ) + + self.set_precedence(_Precedence.ATOM, node.value) + self.traverse(node.value) + with self.delimit("[", "]"): + if is_simple_tuple(node.slice): + self.items_view(self.traverse, node.slice.elts) + else: + self.traverse(node.slice) + + def visit_Starred(self, node): + self.write("*") + self.set_precedence(_Precedence.EXPR, node.value) + self.traverse(node.value) + + def visit_Ellipsis(self, node): + self.write("...") + + def visit_Slice(self, node): + if node.lower: + self.traverse(node.lower) + self.write(":") + if node.upper: + self.traverse(node.upper) + if node.step: + self.write(":") + self.traverse(node.step) + + def visit_arg(self, node): + self.write(node.arg) + if node.annotation: + self.write(": ") + self.traverse(node.annotation) + + def visit_arguments(self, node): + first = True + # normal arguments + all_args = node.posonlyargs + node.args + defaults = [None] * (len(all_args) - len(node.defaults)) + node.defaults + for index, elements in enumerate(zip(all_args, defaults), 1): + a, d = elements + if first: + first = False + else: + self.write(", ") + self.traverse(a) + if d: + self.write("=") + self.traverse(d) + if index == len(node.posonlyargs): + self.write(", /") + + # varargs, or bare '*' if no varargs but keyword-only arguments present + if node.vararg or node.kwonlyargs: + if first: + first = False + else: + self.write(", ") + self.write("*") + if node.vararg: + self.write(node.vararg.arg) + if node.vararg.annotation: + self.write(": ") + self.traverse(node.vararg.annotation) + + # keyword-only arguments + if node.kwonlyargs: + for a, d in zip(node.kwonlyargs, node.kw_defaults): + self.write(", ") + self.traverse(a) + if d: + self.write("=") + self.traverse(d) + + # kwargs + if node.kwarg: + if first: + first = False + else: + self.write(", ") + self.write("**" + node.kwarg.arg) + if node.kwarg.annotation: + self.write(": ") + self.traverse(node.kwarg.annotation) + + def visit_keyword(self, node): + if node.arg is None: + self.write("**") + else: + self.write(node.arg) + self.write("=") + self.traverse(node.value) + + def visit_Lambda(self, node): + with self.require_parens(_Precedence.TEST, node): + self.write("lambda ") + self.traverse(node.args) + self.write(": ") + self.set_precedence(_Precedence.TEST, node.body) + self.traverse(node.body) + + def visit_alias(self, node): + self.write(node.name) + if node.asname: + self.write(" as " + node.asname) + + def visit_withitem(self, node): + self.traverse(node.context_expr) + if node.optional_vars: + self.write(" as ") + self.traverse(node.optional_vars) + +def unparse(ast_obj): + unparser = _Unparser() + return unparser.visit(ast_obj) + + +def main(): + import argparse + + parser = argparse.ArgumentParser(prog='python -m ast') + parser.add_argument('infile', type=argparse.FileType(mode='rb'), nargs='?', + default='-', + help='the file to parse; defaults to stdin') + parser.add_argument('-m', '--mode', default='exec', + choices=('exec', 'single', 'eval', 'func_type'), + help='specify what kind of code must be parsed') + parser.add_argument('--no-type-comments', default=True, action='store_false', + help="don't add information about type comments") + parser.add_argument('-a', '--include-attributes', action='store_true', + help='include attributes such as line numbers and ' + 'column offsets') + parser.add_argument('-i', '--indent', type=int, default=3, + help='indentation of nodes (number of spaces)') + args = parser.parse_args() + + with args.infile as infile: + source = infile.read() + tree = parse(source, args.infile.name, args.mode, type_comments=args.no_type_comments) + print(dump(tree, include_attributes=args.include_attributes, indent=args.indent)) + +if __name__ == '__main__': + main() diff --git a/Lib/asynchat.py b/Lib/asynchat.py index fc1146adbb10dc5a8a3d0853afd83bdec9ecadb4..f4ba361bd4a3ef81e6801601a2ec83ac765b230e 100644 --- a/Lib/asynchat.py +++ b/Lib/asynchat.py @@ -117,7 +117,7 @@ def handle_read(self): data = self.recv(self.ac_in_buffer_size) except BlockingIOError: return - except OSError as why: + except OSError: self.handle_error() return diff --git a/Lib/asyncio/__init__.py b/Lib/asyncio/__init__.py index 28c2e2c429f34a8d57d02a3c6caf6218f4d9a642..eb84bfb189ccf348d41c2d4a2c61c1c3294bd8f5 100644 --- a/Lib/asyncio/__init__.py +++ b/Lib/asyncio/__init__.py @@ -17,6 +17,7 @@ from .streams import * from .subprocess import * from .tasks import * +from .threads import * from .transports import * # Exposed for _asynciomodule.c to implement now deprecated @@ -35,6 +36,7 @@ streams.__all__ + subprocess.__all__ + tasks.__all__ + + threads.__all__ + transports.__all__) if sys.platform == 'win32': # pragma: no cover diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index 799013d5ccccb593201b8ab829ba6bb5ad76add8..b2d446a51fedb50a75b7c72ba093799705e99257 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -410,6 +410,8 @@ def __init__(self): self._asyncgens = weakref.WeakSet() # Set to True when `loop.shutdown_asyncgens` is called. self._asyncgens_shutdown_called = False + # Set to True when `loop.shutdown_default_executor` is called. + self._executor_shutdown_called = False def __repr__(self): return ( @@ -507,6 +509,10 @@ def _check_closed(self): if self._closed: raise RuntimeError('Event loop is closed') + def _check_default_executor(self): + if self._executor_shutdown_called: + raise RuntimeError('Executor shutdown has been called') + def _asyncgen_finalizer_hook(self, agen): self._asyncgens.discard(agen) if not self.is_closed(): @@ -547,6 +553,26 @@ async def shutdown_asyncgens(self): 'asyncgen': agen }) + async def shutdown_default_executor(self): + """Schedule the shutdown of the default executor.""" + self._executor_shutdown_called = True + if self._default_executor is None: + return + future = self.create_future() + thread = threading.Thread(target=self._do_shutdown, args=(future,)) + thread.start() + try: + await future + finally: + thread.join() + + def _do_shutdown(self, future): + try: + self._default_executor.shutdown(wait=True) + self.call_soon_threadsafe(future.set_result, None) + except Exception as ex: + self.call_soon_threadsafe(future.set_exception, ex) + def _check_running(self): if self.is_running(): raise RuntimeError('This event loop is already running') @@ -640,6 +666,7 @@ def close(self): self._closed = True self._ready.clear() self._scheduled.clear() + self._executor_shutdown_called = True executor = self._default_executor if executor is not None: self._default_executor = None @@ -776,8 +803,12 @@ def run_in_executor(self, executor, func, *args): self._check_callback(func, 'run_in_executor') if executor is None: executor = self._default_executor + # Only check when the default executor is being used + self._check_default_executor() if executor is None: - executor = concurrent.futures.ThreadPoolExecutor() + executor = concurrent.futures.ThreadPoolExecutor( + thread_name_prefix='asyncio' + ) self._default_executor = executor return futures.wrap_future( executor.submit(func, *args), loop=self) diff --git a/Lib/asyncio/base_futures.py b/Lib/asyncio/base_futures.py index 22f298069c505edb192b030052e4c2ce7a2e70cc..2c01ac98e10fcaa4ac0b88a2f196dc6450769bf7 100644 --- a/Lib/asyncio/base_futures.py +++ b/Lib/asyncio/base_futures.py @@ -1,6 +1,7 @@ __all__ = () import reprlib +from _thread import get_ident from . import format_helpers @@ -41,6 +42,16 @@ def format_cb(callback): return f'cb=[{cb}]' +# bpo-42183: _repr_running is needed for repr protection +# when a Future or Task result contains itself directly or indirectly. +# The logic is borrowed from @reprlib.recursive_repr decorator. +# Unfortunately, the direct decorator usage is impossible because of +# AttributeError: '_asyncio.Task' object has no attribute '__module__' error. +# +# After fixing this thing we can return to the decorator based approach. +_repr_running = set() + + def _future_repr_info(future): # (Future) -> str """helper function for Future.__repr__""" @@ -49,9 +60,17 @@ def _future_repr_info(future): if future._exception is not None: info.append(f'exception={future._exception!r}') else: - # use reprlib to limit the length of the output, especially - # for very long strings - result = reprlib.repr(future._result) + key = id(future), get_ident() + if key in _repr_running: + result = '...' + else: + _repr_running.add(key) + try: + # use reprlib to limit the length of the output, especially + # for very long strings + result = reprlib.repr(future._result) + finally: + _repr_running.discard(key) info.append(f'result={result}') if future._callbacks: info.append(_format_callbacks(future._callbacks)) diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py index ca08663a5b3586382ac620c07e6248f91583b2e3..0dce87b8ecc5861a254dbd1aaffb2f7c3a6e6953 100644 --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -19,7 +19,6 @@ import threading from . import format_helpers -from . import exceptions class Handle: @@ -119,20 +118,24 @@ def __hash__(self): return hash(self._when) def __lt__(self, other): - return self._when < other._when + if isinstance(other, TimerHandle): + return self._when < other._when + return NotImplemented def __le__(self, other): - if self._when < other._when: - return True - return self.__eq__(other) + if isinstance(other, TimerHandle): + return self._when < other._when or self.__eq__(other) + return NotImplemented def __gt__(self, other): - return self._when > other._when + if isinstance(other, TimerHandle): + return self._when > other._when + return NotImplemented def __ge__(self, other): - if self._when > other._when: - return True - return self.__eq__(other) + if isinstance(other, TimerHandle): + return self._when > other._when or self.__eq__(other) + return NotImplemented def __eq__(self, other): if isinstance(other, TimerHandle): @@ -142,10 +145,6 @@ def __eq__(self, other): self._cancelled == other._cancelled) return NotImplemented - def __ne__(self, other): - equal = self.__eq__(other) - return NotImplemented if equal is NotImplemented else not equal - def cancel(self): if not self._cancelled: self._loop._timer_handle_cancelled(self) @@ -249,6 +248,10 @@ async def shutdown_asyncgens(self): """Shutdown all active asynchronous generators.""" raise NotImplementedError + async def shutdown_default_executor(self): + """Schedule the shutdown of the default executor.""" + raise NotImplementedError + # Methods scheduling callbacks. All these return Handles. def _timer_handle_cancelled(self, handle): @@ -280,7 +283,7 @@ def create_task(self, coro, *, name=None): def call_soon_threadsafe(self, callback, *args): raise NotImplementedError - async def run_in_executor(self, executor, func, *args): + def run_in_executor(self, executor, func, *args): raise NotImplementedError def set_default_executor(self, executor): @@ -393,7 +396,7 @@ async def create_unix_server( The return value is a Server object, which can be used to stop the service. - path is a str, representing a file systsem path to bind the + path is a str, representing a file system path to bind the server socket to. sock can optionally be specified in order to use a preexisting @@ -632,7 +635,7 @@ def get_event_loop(self): """ if (self._local._loop is None and not self._local._set_called and - isinstance(threading.current_thread(), threading._MainThread)): + threading.current_thread() is threading.main_thread()): self.set_event_loop(self.new_event_loop()) if self._local._loop is None: diff --git a/Lib/asyncio/exceptions.py b/Lib/asyncio/exceptions.py index e03602ef5762345480e36b2e250024b0cbb5ff0e..f07e4486577381616e7e2f7f05747ed7374316a1 100644 --- a/Lib/asyncio/exceptions.py +++ b/Lib/asyncio/exceptions.py @@ -34,8 +34,9 @@ class IncompleteReadError(EOFError): - expected: total number of expected bytes (or None if unknown) """ def __init__(self, partial, expected): + r_expected = 'undefined' if expected is None else repr(expected) super().__init__(f'{len(partial)} bytes read on a total of ' - f'{expected!r} expected bytes') + f'{r_expected} expected bytes') self.partial = partial self.expected = expected diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py index 9afda220bd78f24f514f016d5721b27698a81809..bed4da52fd4d98b9413be0f92541d41f86cead46 100644 --- a/Lib/asyncio/futures.py +++ b/Lib/asyncio/futures.py @@ -51,6 +51,9 @@ class Future: _exception = None _loop = None _source_traceback = None + _cancel_message = None + # A saved CancelledError for later chaining as an exception context. + _cancelled_exc = None # This field is used for a dual purpose: # - Its presence is a marker to declare that a class implements @@ -103,6 +106,9 @@ def __del__(self): context['source_traceback'] = self._source_traceback self._loop.call_exception_handler(context) + def __class_getitem__(cls, type): + return cls + @property def _log_traceback(self): return self.__log_traceback @@ -120,7 +126,22 @@ def get_loop(self): raise RuntimeError("Future object is not initialized.") return loop - def cancel(self): + def _make_cancelled_error(self): + """Create the CancelledError to raise if the Future is cancelled. + + This should only be called once when handling a cancellation since + it erases the saved context exception value. + """ + if self._cancel_message is None: + exc = exceptions.CancelledError() + else: + exc = exceptions.CancelledError(self._cancel_message) + exc.__context__ = self._cancelled_exc + # Remove the reference since we don't need this anymore. + self._cancelled_exc = None + return exc + + def cancel(self, msg=None): """Cancel the future and schedule callbacks. If the future is already done or cancelled, return False. Otherwise, @@ -131,6 +152,7 @@ def cancel(self): if self._state != _PENDING: return False self._state = _CANCELLED + self._cancel_message = msg self.__schedule_callbacks() return True @@ -170,7 +192,8 @@ def result(self): the future is done and has an exception set, this exception is raised. """ if self._state == _CANCELLED: - raise exceptions.CancelledError + exc = self._make_cancelled_error() + raise exc if self._state != _FINISHED: raise exceptions.InvalidStateError('Result is not ready.') self.__log_traceback = False @@ -187,7 +210,8 @@ def exception(self): InvalidStateError. """ if self._state == _CANCELLED: - raise exceptions.CancelledError + exc = self._make_cancelled_error() + raise exc if self._state != _FINISHED: raise exceptions.InvalidStateError('Exception is not set.') self.__log_traceback = False diff --git a/Lib/asyncio/locks.py b/Lib/asyncio/locks.py index d94daeb5a173f574f8509a366f1bcb9337e487ba..f1ce7324785ba983b8ba12f3283a70757ad0cc86 100644 --- a/Lib/asyncio/locks.py +++ b/Lib/asyncio/locks.py @@ -3,96 +3,13 @@ __all__ = ('Lock', 'Event', 'Condition', 'Semaphore', 'BoundedSemaphore') import collections -import types import warnings from . import events -from . import futures from . import exceptions -from .import coroutines - - -class _ContextManager: - """Context manager. - - This enables the following idiom for acquiring and releasing a - lock around a block: - - with (yield from lock): - - - while failing loudly when accidentally using: - - with lock: - - - Deprecated, use 'async with' statement: - async with lock: - - """ - - def __init__(self, lock): - self._lock = lock - - def __enter__(self): - # We have no use for the "as ..." clause in the with - # statement for locks. - return None - - def __exit__(self, *args): - try: - self._lock.release() - finally: - self._lock = None # Crudely prevent reuse. class _ContextManagerMixin: - def __enter__(self): - raise RuntimeError( - '"yield from" should be used as context manager expression') - - def __exit__(self, *args): - # This must exist because __enter__ exists, even though that - # always raises; that's how the with-statement works. - pass - - @types.coroutine - def __iter__(self): - # This is not a coroutine. It is meant to enable the idiom: - # - # with (yield from lock): - # - # - # as an alternative to: - # - # yield from lock.acquire() - # try: - # - # finally: - # lock.release() - # Deprecated, use 'async with' statement: - # async with lock: - # - warnings.warn("'with (yield from lock)' is deprecated " - "use 'async with lock' instead", - DeprecationWarning, stacklevel=2) - yield from self.acquire() - return _ContextManager(self) - - # The flag is needed for legacy asyncio.iscoroutine() - __iter__._is_coroutine = coroutines._is_coroutine - - async def __acquire_ctx(self): - await self.acquire() - return _ContextManager(self) - - def __await__(self): - warnings.warn("'with await lock' is deprecated " - "use 'async with lock' instead", - DeprecationWarning, stacklevel=2) - # To make "with await lock" work. - return self.__acquire_ctx().__await__() - async def __aenter__(self): await self.acquire() # We have no use for the "as ..." clause in the with diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py index 830d8edc32f90a1538bbf10c4bf2f0881b17e51f..b4cd414b82d72798a03553732ba47109df6c92aa 100644 --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -711,7 +711,7 @@ async def _sock_sendfile_native(self, sock, file, offset, count): raise exceptions.SendfileNotAvailableError("not a regular file") try: fsize = os.fstat(fileno).st_size - except OSError as err: + except OSError: raise exceptions.SendfileNotAvailableError("not a regular file") blocksize = count if count else fsize if not blocksize: @@ -766,6 +766,14 @@ def _loop_self_reading(self, f=None): try: if f is not None: f.result() # may raise + if self._self_reading_future is not f: + # When we scheduled this Future, we assigned it to + # _self_reading_future. If it's not there now, something has + # tried to cancel the loop while this callback was still in the + # queue (see windows_events.ProactorEventLoop.run_forever). In + # that case stop here instead of continuing to schedule a new + # iteration. + return f = self._proactor.recv(self._ssock, 4096) except exceptions.CancelledError: # _close_self_pipe() has been called, stop waiting for data @@ -783,8 +791,17 @@ def _loop_self_reading(self, f=None): f.add_done_callback(self._loop_self_reading) def _write_to_self(self): + # This may be called from a different thread, possibly after + # _close_self_pipe() has been called or even while it is + # running. Guard for self._csock being None or closed. When + # a socket is closed, send() raises OSError (with errno set to + # EBADF, but let's not rely on the exact error code). + csock = self._csock + if csock is None: + return + try: - self._csock.send(b'\0') + csock.send(b'\0') except OSError: if self._debug: logger.debug("Fail to write a null byte into the " diff --git a/Lib/asyncio/queues.py b/Lib/asyncio/queues.py index 390ae9a6821c4d4e3790458c1d5615f396b4fa14..cd3f7c6a56789152052a2d00143b852bca384e0e 100644 --- a/Lib/asyncio/queues.py +++ b/Lib/asyncio/queues.py @@ -76,6 +76,9 @@ def __repr__(self): def __str__(self): return f'<{type(self).__name__} {self._format()}>' + def __class_getitem__(cls, type): + return cls + def _format(self): result = f'maxsize={self._maxsize!r}' if getattr(self, '_queue', None): diff --git a/Lib/asyncio/runners.py b/Lib/asyncio/runners.py index 2e37e18b45fc150536f6deedfc388c30e8aa6410..268635d68fb0c0ec00a828a391c891d077f74c14 100644 --- a/Lib/asyncio/runners.py +++ b/Lib/asyncio/runners.py @@ -5,7 +5,7 @@ from . import tasks -def run(main, *, debug=False): +def run(main, *, debug=None): """Execute the coroutine and return the result. This function runs the passed coroutine, taking care of @@ -39,12 +39,14 @@ async def main(): loop = events.new_event_loop() try: events.set_event_loop(loop) - loop.set_debug(debug) + if debug is not None: + loop.set_debug(debug) return loop.run_until_complete(main) finally: try: _cancel_all_tasks(loop) loop.run_until_complete(loop.shutdown_asyncgens()) + loop.run_until_complete(loop.shutdown_default_executor()) finally: events.set_event_loop(None) loop.close() diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index a05cbb6bdd69dc624d83b807b9a39d91130a97fb..59cb6b1babec54d5e2e53659e982a49afd2ca9ff 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -133,14 +133,16 @@ def _write_to_self(self): # a socket is closed, send() raises OSError (with errno set to # EBADF, but let's not rely on the exact error code). csock = self._csock - if csock is not None: - try: - csock.send(b'\0') - except OSError: - if self._debug: - logger.debug("Fail to write a null byte into the " - "self-pipe socket", - exc_info=True) + if csock is None: + return + + try: + csock.send(b'\0') + except OSError: + if self._debug: + logger.debug("Fail to write a null byte into the " + "self-pipe socket", + exc_info=True) def _start_serving(self, protocol_factory, sock, sslcontext=None, server=None, backlog=100, @@ -266,6 +268,7 @@ def _add_reader(self, fd, callback, *args): (handle, writer)) if reader is not None: reader.cancel() + return handle def _remove_reader(self, fd): if self.is_closed(): @@ -302,6 +305,7 @@ def _add_writer(self, fd, callback, *args): (reader, handle)) if writer is not None: writer.cancel() + return handle def _remove_writer(self, fd): """Remove a writer callback.""" @@ -329,7 +333,7 @@ def _remove_writer(self, fd): def add_reader(self, fd, callback, *args): """Add a reader callback.""" self._ensure_fd_no_transport(fd) - return self._add_reader(fd, callback, *args) + self._add_reader(fd, callback, *args) def remove_reader(self, fd): """Remove a reader callback.""" @@ -339,7 +343,7 @@ def remove_reader(self, fd): def add_writer(self, fd, callback, *args): """Add a writer callback..""" self._ensure_fd_no_transport(fd) - return self._add_writer(fd, callback, *args) + self._add_writer(fd, callback, *args) def remove_writer(self, fd): """Remove a writer callback.""" @@ -362,13 +366,15 @@ async def sock_recv(self, sock, n): pass fut = self.create_future() fd = sock.fileno() - self.add_reader(fd, self._sock_recv, fut, sock, n) + self._ensure_fd_no_transport(fd) + handle = self._add_reader(fd, self._sock_recv, fut, sock, n) fut.add_done_callback( - functools.partial(self._sock_read_done, fd)) + functools.partial(self._sock_read_done, fd, handle=handle)) return await fut - def _sock_read_done(self, fd, fut): - self.remove_reader(fd) + def _sock_read_done(self, fd, fut, handle=None): + if handle is None or not handle.cancelled(): + self.remove_reader(fd) def _sock_recv(self, fut, sock, n): # _sock_recv() can add itself as an I/O callback if the operation can't @@ -401,9 +407,10 @@ async def sock_recv_into(self, sock, buf): pass fut = self.create_future() fd = sock.fileno() - self.add_reader(fd, self._sock_recv_into, fut, sock, buf) + self._ensure_fd_no_transport(fd) + handle = self._add_reader(fd, self._sock_recv_into, fut, sock, buf) fut.add_done_callback( - functools.partial(self._sock_read_done, fd)) + functools.partial(self._sock_read_done, fd, handle=handle)) return await fut def _sock_recv_into(self, fut, sock, buf): @@ -446,11 +453,12 @@ async def sock_sendall(self, sock, data): fut = self.create_future() fd = sock.fileno() - fut.add_done_callback( - functools.partial(self._sock_write_done, fd)) + self._ensure_fd_no_transport(fd) # use a trick with a list in closure to store a mutable state - self.add_writer(fd, self._sock_sendall, fut, sock, - memoryview(data), [n]) + handle = self._add_writer(fd, self._sock_sendall, fut, sock, + memoryview(data), [n]) + fut.add_done_callback( + functools.partial(self._sock_write_done, fd, handle=handle)) return await fut def _sock_sendall(self, fut, sock, view, pos): @@ -502,9 +510,11 @@ def _sock_connect(self, fut, sock, address): # connection runs in background. We have to wait until the socket # becomes writable to be notified when the connection succeed or # fails. + self._ensure_fd_no_transport(fd) + handle = self._add_writer( + fd, self._sock_connect_cb, fut, sock, address) fut.add_done_callback( - functools.partial(self._sock_write_done, fd)) - self.add_writer(fd, self._sock_connect_cb, fut, sock, address) + functools.partial(self._sock_write_done, fd, handle=handle)) except (SystemExit, KeyboardInterrupt): raise except BaseException as exc: @@ -512,8 +522,9 @@ def _sock_connect(self, fut, sock, address): else: fut.set_result(None) - def _sock_write_done(self, fd, fut): - self.remove_writer(fd) + def _sock_write_done(self, fd, fut, handle=None): + if handle is None or not handle.cancelled(): + self.remove_writer(fd) def _sock_connect_cb(self, fut, sock, address): if fut.done(): @@ -546,20 +557,19 @@ async def sock_accept(self, sock): if self._debug and sock.gettimeout() != 0: raise ValueError("the socket must be non-blocking") fut = self.create_future() - self._sock_accept(fut, False, sock) + self._sock_accept(fut, sock) return await fut - def _sock_accept(self, fut, registered, sock): + def _sock_accept(self, fut, sock): fd = sock.fileno() - if registered: - self.remove_reader(fd) - if fut.done(): - return try: conn, address = sock.accept() conn.setblocking(False) except (BlockingIOError, InterruptedError): - self.add_reader(fd, self._sock_accept, fut, True, sock) + self._ensure_fd_no_transport(fd) + handle = self._add_reader(fd, self._sock_accept, fut, sock) + fut.add_done_callback( + functools.partial(self._sock_read_done, fd, handle=handle)) except (SystemExit, KeyboardInterrupt): raise except BaseException as exc: diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py index 3eca6b4a39128bdd6c71af96162df632cc1099f3..cad25b26539f5aa930684eb664b1bdf9fd4c9f82 100644 --- a/Lib/asyncio/sslproto.py +++ b/Lib/asyncio/sslproto.py @@ -5,7 +5,6 @@ except ImportError: # pragma: no cover ssl = None -from . import base_events from . import constants from . import protocols from . import transports diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 66e81f9200a36d8478790bb0fe8f8bda2852fb46..d6262ae75e6569eee152d52a76a8d85aa36d7a19 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -113,34 +113,6 @@ class Task(futures._PyFuture): # Inherit Python Task implementation # status is still pending _log_destroy_pending = True - @classmethod - def current_task(cls, loop=None): - """Return the currently running task in an event loop or None. - - By default the current task for the current event loop is returned. - - None is returned when called not in the context of a Task. - """ - warnings.warn("Task.current_task() is deprecated since Python 3.7, " - "use asyncio.current_task() instead", - DeprecationWarning, - stacklevel=2) - if loop is None: - loop = events.get_event_loop() - return current_task(loop) - - @classmethod - def all_tasks(cls, loop=None): - """Return a set of all tasks for an event loop. - - By default all tasks for the current event loop are returned. - """ - warnings.warn("Task.all_tasks() is deprecated since Python 3.7, " - "use asyncio.all_tasks() instead", - DeprecationWarning, - stacklevel=2) - return _all_tasks_compat(loop) - def __init__(self, coro, *, loop=None, name=None): super().__init__(loop=loop) if self._source_traceback: @@ -175,6 +147,9 @@ def __del__(self): self._loop.call_exception_handler(context) super().__del__() + def __class_getitem__(cls, type): + return cls + def _repr_info(self): return base_tasks._task_repr_info(self) @@ -227,7 +202,7 @@ def print_stack(self, *, limit=None, file=None): """ return base_tasks._task_print_stack(self, limit, file) - def cancel(self): + def cancel(self, msg=None): """Request that this task cancel itself. This arranges for a CancelledError to be thrown into the @@ -251,13 +226,14 @@ def cancel(self): if self.done(): return False if self._fut_waiter is not None: - if self._fut_waiter.cancel(): + if self._fut_waiter.cancel(msg=msg): # Leave self._fut_waiter; it may be a Task that # catches and ignores the cancellation so we may have # to cancel it again later. return True # It must be the case that self.__step is already scheduled. self._must_cancel = True + self._cancel_message = msg return True def __step(self, exc=None): @@ -266,7 +242,7 @@ def __step(self, exc=None): f'_step(): already done: {self!r}, {exc!r}') if self._must_cancel: if not isinstance(exc, exceptions.CancelledError): - exc = exceptions.CancelledError() + exc = self._make_cancelled_error() self._must_cancel = False coro = self._coro self._fut_waiter = None @@ -284,10 +260,12 @@ def __step(self, exc=None): if self._must_cancel: # Task is cancelled right before coro stops. self._must_cancel = False - super().cancel() + super().cancel(msg=self._cancel_message) else: super().set_result(exc.value) - except exceptions.CancelledError: + except exceptions.CancelledError as exc: + # Save the original exception so we can chain it later. + self._cancelled_exc = exc super().cancel() # I.e., Future.cancel(self). except (KeyboardInterrupt, SystemExit) as exc: super().set_exception(exc) @@ -316,7 +294,8 @@ def __step(self, exc=None): self.__wakeup, context=self._context) self._fut_waiter = result if self._must_cancel: - if self._fut_waiter.cancel(): + if self._fut_waiter.cancel( + msg=self._cancel_message): self._must_cancel = False else: new_exc = RuntimeError( @@ -394,7 +373,7 @@ def create_task(coro, *, name=None): async def wait(fs, *, loop=None, timeout=None, return_when=ALL_COMPLETED): """Wait for the Futures and coroutines given by fs to complete. - The sequence futures must not be empty. + The fs iterable must not be empty. Coroutines will be wrapped in Tasks. @@ -421,7 +400,15 @@ async def wait(fs, *, loop=None, timeout=None, return_when=ALL_COMPLETED): "and scheduled for removal in Python 3.10.", DeprecationWarning, stacklevel=2) - fs = {ensure_future(f, loop=loop) for f in set(fs)} + fs = set(fs) + + if any(coroutines.iscoroutine(f) for f in fs): + warnings.warn("The explicit passing of coroutine objects to " + "asyncio.wait() is deprecated since Python 3.8, and " + "scheduled for removal in Python 3.11.", + DeprecationWarning, stacklevel=2) + + fs = {ensure_future(f, loop=loop) for f in fs} return await _wait(fs, timeout, return_when, loop) @@ -460,8 +447,13 @@ async def wait_for(fut, timeout, *, loop=None): if fut.done(): return fut.result() - fut.cancel() - raise exceptions.TimeoutError() + await _cancel_and_wait(fut, loop=loop) + try: + fut.result() + except exceptions.CancelledError as exc: + raise exceptions.TimeoutError() from exc + else: + raise exceptions.TimeoutError() waiter = loop.create_future() timeout_handle = loop.call_later(timeout, _release_waiter, waiter) @@ -475,9 +467,15 @@ async def wait_for(fut, timeout, *, loop=None): try: await waiter except exceptions.CancelledError: - fut.remove_done_callback(cb) - fut.cancel() - raise + if fut.done(): + return fut.result() + else: + fut.remove_done_callback(cb) + # We must ensure that the task is not running + # after wait_for() returns. + # See https://bugs.python.org/issue32751 + await _cancel_and_wait(fut, loop=loop) + raise if fut.done(): return fut.result() @@ -487,7 +485,15 @@ async def wait_for(fut, timeout, *, loop=None): # after wait_for() returns. # See https://bugs.python.org/issue32751 await _cancel_and_wait(fut, loop=loop) - raise exceptions.TimeoutError() + # In case task cancellation failed with some + # exception, we should re-raise it + # See https://bugs.python.org/issue40607 + try: + fut.result() + except exceptions.CancelledError as exc: + raise exceptions.TimeoutError() from exc + else: + raise exceptions.TimeoutError() finally: timeout_handle.cancel() @@ -572,7 +578,7 @@ def as_completed(fs, *, loop=None, timeout=None): Note: The futures 'f' are not necessarily members of fs. """ if futures.isfuture(fs) or coroutines.iscoroutine(fs): - raise TypeError(f"expect a list of futures, not {type(fs).__name__}") + raise TypeError(f"expect an iterable of futures, not {type(fs).__name__}") from .queues import Queue # Import here to avoid circular import problem. done = Queue(loop=loop) @@ -699,12 +705,12 @@ def __init__(self, children, *, loop=None): self._children = children self._cancel_requested = False - def cancel(self): + def cancel(self, msg=None): if self.done(): return False ret = False for child in self._children: - if child.cancel(): + if child.cancel(msg=msg): ret = True if ret: # If any child tasks were actually cancelled, we should @@ -770,7 +776,7 @@ def _done_callback(fut): # Check if 'fut' is cancelled first, as # 'fut.exception()' will *raise* a CancelledError # instead of returning it. - exc = exceptions.CancelledError() + exc = fut._make_cancelled_error() outer.set_exception(exc) return else: @@ -786,10 +792,15 @@ def _done_callback(fut): for fut in children: if fut.cancelled(): - # Check if 'fut' is cancelled first, as - # 'fut.exception()' will *raise* a CancelledError - # instead of returning it. - res = exceptions.CancelledError() + # Check if 'fut' is cancelled first, as 'fut.exception()' + # will *raise* a CancelledError instead of returning it. + # Also, since we're adding the exception return value + # to 'results' instead of raising it, don't bother + # setting __context__. This also lets us preserve + # calling '_make_cancelled_error()' at most once. + res = exceptions.CancelledError( + '' if fut._cancel_message is None else + fut._cancel_message) else: res = fut.exception() if res is None: @@ -800,7 +811,8 @@ def _done_callback(fut): # If gather is being cancelled we must propagate the # cancellation regardless of *return_exceptions* argument. # See issue 32684. - outer.set_exception(exceptions.CancelledError()) + exc = fut._make_cancelled_error() + outer.set_exception(exc) else: outer.set_result(results) diff --git a/Lib/asyncio/threads.py b/Lib/asyncio/threads.py new file mode 100644 index 0000000000000000000000000000000000000000..34b7513a42090298a69a92858e8deb91322c6bfb --- /dev/null +++ b/Lib/asyncio/threads.py @@ -0,0 +1,25 @@ +"""High-level support for working with threads in asyncio""" + +import functools +import contextvars + +from . import events + + +__all__ = "to_thread", + + +async def to_thread(func, /, *args, **kwargs): + """Asynchronously run function *func* in a separate thread. + + Any *args and **kwargs supplied for this function are directly passed + to *func*. Also, the current :class:`contextvars.Context` is propogated, + allowing context variables from the main thread to be accessed in the + separate thread. + + Return a coroutine that can be awaited to get the eventual result of *func*. + """ + loop = events.get_running_loop() + ctx = contextvars.copy_context() + func_call = functools.partial(ctx.run, func, *args, **kwargs) + return await loop.run_in_executor(None, func_call) diff --git a/Lib/asyncio/transports.py b/Lib/asyncio/transports.py index 513b1c024a4d6d83dfaa1fe33352e4a354a9de7d..45e155c94cad1b31fb48e12a2098ba41138f4d31 100644 --- a/Lib/asyncio/transports.py +++ b/Lib/asyncio/transports.py @@ -29,8 +29,8 @@ def close(self): Buffered data will be flushed asynchronously. No more data will be received. After all buffered data is flushed, the - protocol's connection_lost() method will (eventually) called - with None as its argument. + protocol's connection_lost() method will (eventually) be + called with None as its argument. """ raise NotImplementedError diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index 1ff8c427da4a6624ac54e1a5a224f0d58a360eec..3efa6698b89ced4673687957be769602c20c0af0 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -29,7 +29,7 @@ __all__ = ( 'SelectorEventLoop', 'AbstractChildWatcher', 'SafeChildWatcher', - 'FastChildWatcher', + 'FastChildWatcher', 'PidfdChildWatcher', 'MultiLoopChildWatcher', 'ThreadedChildWatcher', 'DefaultEventLoopPolicy', ) @@ -330,7 +330,7 @@ async def create_unix_server( async def _sock_sendfile_native(self, sock, file, offset, count): try: os.sendfile - except AttributeError as exc: + except AttributeError: raise exceptions.SendfileNotAvailableError( "os.sendfile() is not available") try: @@ -339,7 +339,7 @@ async def _sock_sendfile_native(self, sock, file, offset, count): raise exceptions.SendfileNotAvailableError("not a regular file") try: fsize = os.fstat(fileno).st_size - except OSError as err: + except OSError: raise exceptions.SendfileNotAvailableError("not a regular file") blocksize = count if count else fsize if not blocksize: @@ -878,6 +878,84 @@ def __exit__(self, a, b, c): raise NotImplementedError() +class PidfdChildWatcher(AbstractChildWatcher): + """Child watcher implementation using Linux's pid file descriptors. + + This child watcher polls process file descriptors (pidfds) to await child + process termination. In some respects, PidfdChildWatcher is a "Goldilocks" + child watcher implementation. It doesn't require signals or threads, doesn't + interfere with any processes launched outside the event loop, and scales + linearly with the number of subprocesses launched by the event loop. The + main disadvantage is that pidfds are specific to Linux, and only work on + recent (5.3+) kernels. + """ + + def __init__(self): + self._loop = None + self._callbacks = {} + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, exc_traceback): + pass + + def is_active(self): + return self._loop is not None and self._loop.is_running() + + def close(self): + self.attach_loop(None) + + def attach_loop(self, loop): + if self._loop is not None and loop is None and self._callbacks: + warnings.warn( + 'A loop is being detached ' + 'from a child watcher with pending handlers', + RuntimeWarning) + for pidfd, _, _ in self._callbacks.values(): + self._loop._remove_reader(pidfd) + os.close(pidfd) + self._callbacks.clear() + self._loop = loop + + def add_child_handler(self, pid, callback, *args): + existing = self._callbacks.get(pid) + if existing is not None: + self._callbacks[pid] = existing[0], callback, args + else: + pidfd = os.pidfd_open(pid) + self._loop._add_reader(pidfd, self._do_wait, pid) + self._callbacks[pid] = pidfd, callback, args + + def _do_wait(self, pid): + pidfd, callback, args = self._callbacks.pop(pid) + self._loop._remove_reader(pidfd) + try: + _, status = os.waitpid(pid, 0) + except ChildProcessError: + # The child process is already reaped + # (may happen if waitpid() is called elsewhere). + returncode = 255 + logger.warning( + "child process pid %d exit status already read: " + " will report returncode 255", + pid) + else: + returncode = _compute_returncode(status) + + os.close(pidfd) + callback(pid, returncode, *args) + + def remove_child_handler(self, pid): + try: + pidfd, _, _ = self._callbacks.pop(pid) + except KeyError: + return False + self._loop._remove_reader(pidfd) + os.close(pidfd) + return True + + def _compute_returncode(status): if os.WIFSIGNALED(status): # The child process died because of a signal. @@ -1152,13 +1230,15 @@ def is_active(self): def close(self): self._callbacks.clear() - if self._saved_sighandler is not None: - handler = signal.getsignal(signal.SIGCHLD) - if handler != self._sig_chld: - logger.warning("SIGCHLD handler was changed by outside code") - else: - signal.signal(signal.SIGCHLD, self._saved_sighandler) - self._saved_sighandler = None + if self._saved_sighandler is None: + return + + handler = signal.getsignal(signal.SIGCHLD) + if handler != self._sig_chld: + logger.warning("SIGCHLD handler was changed by outside code") + else: + signal.signal(signal.SIGCHLD, self._saved_sighandler) + self._saved_sighandler = None def __enter__(self): return self @@ -1185,15 +1265,17 @@ def attach_loop(self, loop): # The reason to do it here is that attach_loop() is called from # unix policy only for the main thread. # Main thread is required for subscription on SIGCHLD signal + if self._saved_sighandler is not None: + return + + self._saved_sighandler = signal.signal(signal.SIGCHLD, self._sig_chld) if self._saved_sighandler is None: - self._saved_sighandler = signal.signal(signal.SIGCHLD, self._sig_chld) - if self._saved_sighandler is None: - logger.warning("Previous SIGCHLD handler was set by non-Python code, " - "restore to default handler on watcher close.") - self._saved_sighandler = signal.SIG_DFL + logger.warning("Previous SIGCHLD handler was set by non-Python code, " + "restore to default handler on watcher close.") + self._saved_sighandler = signal.SIG_DFL - # Set SA_RESTART to limit EINTR occurrences. - signal.siginterrupt(signal.SIGCHLD, False) + # Set SA_RESTART to limit EINTR occurrences. + signal.siginterrupt(signal.SIGCHLD, False) def _do_waitpid_all(self): for pid in list(self._callbacks): @@ -1346,8 +1428,7 @@ def _init_watcher(self): with events._lock: if self._watcher is None: # pragma: no branch self._watcher = ThreadedChildWatcher() - if isinstance(threading.current_thread(), - threading._MainThread): + if threading.current_thread() is threading.main_thread(): self._watcher.attach_loop(self._local._loop) def set_event_loop(self, loop): @@ -1361,7 +1442,7 @@ def set_event_loop(self, loop): super().set_event_loop(loop) if (self._watcher is not None and - isinstance(threading.current_thread(), threading._MainThread)): + threading.current_thread() is threading.main_thread()): self._watcher.attach_loop(loop) def get_child_watcher(self): diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py index ac51109ff1a83d5fe657f4d3a2109a5c2ecd77c1..5e7cd795895d65456dc8a372421c8cc29c046bcd 100644 --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -75,9 +75,9 @@ def _cancel_overlapped(self): self._loop.call_exception_handler(context) self._ov = None - def cancel(self): + def cancel(self, msg=None): self._cancel_overlapped() - return super().cancel() + return super().cancel(msg=msg) def set_exception(self, exception): super().set_exception(exception) @@ -149,9 +149,9 @@ def _unregister_wait(self): self._unregister_wait_cb(None) - def cancel(self): + def cancel(self, msg=None): self._unregister_wait() - return super().cancel() + return super().cancel(msg=msg) def set_exception(self, exception): self._unregister_wait() @@ -318,8 +318,12 @@ def run_forever(self): if self._self_reading_future is not None: ov = self._self_reading_future._ov self._self_reading_future.cancel() - # self_reading_future was just cancelled so it will never be signalled - # Unregister it otherwise IocpProactor.close will wait for it forever + # self_reading_future was just cancelled so if it hasn't been + # finished yet, it never will be (it's possible that it has + # already finished and its callback is waiting in the queue, + # where it could still happen if the event loop is restarted). + # Unregister it otherwise IocpProactor.close will wait for it + # forever if ov is not None: self._proactor._unregister(ov) self._self_reading_future = None @@ -469,7 +473,7 @@ def recv_into(self, conn, buf, flags=0): else: ov.ReadFileInto(conn.fileno(), buf) except BrokenPipeError: - return self._result(b'') + return self._result(0) def finish_recv(trans, key, ov): try: diff --git a/Lib/asyncore.py b/Lib/asyncore.py index 0e92be3ad1912c14b59ccd240a896f745f08ccc9..ce16f11a2f5ceebe821dbad4c12363e6db13fa22 100644 --- a/Lib/asyncore.py +++ b/Lib/asyncore.py @@ -228,7 +228,7 @@ def __init__(self, sock=None, map=None): if sock: # Set to nonblocking just to make sure for cases where we # get a socket from a blocking source. - sock.setblocking(0) + sock.setblocking(False) self.set_socket(sock, map) self.connected = True # The constructor no longer requires that the socket @@ -280,7 +280,7 @@ def del_channel(self, map=None): def create_socket(self, family=socket.AF_INET, type=socket.SOCK_STREAM): self.family_and_type = family, type sock = socket.socket(family, type) - sock.setblocking(0) + sock.setblocking(False) self.set_socket(sock) def set_socket(self, sock, map=None): diff --git a/Lib/base64.py b/Lib/base64.py index 2e70223dfe78244739be541c439f64e4f6acb28f..ec3823b724a37e31ec828e1547dbed873ed1038b 100755 --- a/Lib/base64.py +++ b/Lib/base64.py @@ -320,7 +320,7 @@ def a85encode(b, *, foldspaces=False, wrapcol=0, pad=False, adobe=False): global _a85chars, _a85chars2 # Delay the initialization of tables to not waste memory # if the function is never called - if _a85chars is None: + if _a85chars2 is None: _a85chars = [bytes((i,)) for i in range(33, 118)] _a85chars2 = [(a + b) for a in _a85chars for b in _a85chars] @@ -428,7 +428,7 @@ def b85encode(b, pad=False): global _b85chars, _b85chars2 # Delay the initialization of tables to not waste memory # if the function is never called - if _b85chars is None: + if _b85chars2 is None: _b85chars = [bytes((i,)) for i in _b85alphabet] _b85chars2 = [(a + b) for a in _b85chars for b in _b85chars] return _85encode(b, _b85chars, _b85chars2, pad) @@ -531,28 +531,12 @@ def encodebytes(s): pieces.append(binascii.b2a_base64(chunk)) return b"".join(pieces) -def encodestring(s): - """Legacy alias of encodebytes().""" - import warnings - warnings.warn("encodestring() is a deprecated alias since 3.1, " - "use encodebytes()", - DeprecationWarning, 2) - return encodebytes(s) - def decodebytes(s): """Decode a bytestring of base-64 data into a bytes object.""" _input_type_check(s) return binascii.a2b_base64(s) -def decodestring(s): - """Legacy alias of decodebytes().""" - import warnings - warnings.warn("decodestring() is a deprecated alias since Python 3.1, " - "use decodebytes()", - DeprecationWarning, 2) - return decodebytes(s) - # Usable as a script... def main(): diff --git a/Lib/bdb.py b/Lib/bdb.py index 18491da897357e152dfe92527b361bf0765002db..b18a0612d8c789b9b51216f3ebffe910751aadec 100644 --- a/Lib/bdb.py +++ b/Lib/bdb.py @@ -611,26 +611,11 @@ def runctx(self, cmd, globals, locals): # This method is more useful to debug a single function call. - def runcall(*args, **kwds): + def runcall(self, func, /, *args, **kwds): """Debug a single function call. Return the result of the function call. """ - if len(args) >= 2: - self, func, *args = args - elif not args: - raise TypeError("descriptor 'runcall' of 'Bdb' object " - "needs an argument") - elif 'func' in kwds: - func = kwds.pop('func') - self, *args = args - import warnings - warnings.warn("Passing 'func' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('runcall expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - self.reset() sys.settrace(self.trace_dispatch) res = None @@ -642,7 +627,6 @@ def runcall(*args, **kwds): self.quitting = True sys.settrace(None) return res - runcall.__text_signature__ = '($self, func, /, *args, **kwds)' def set_trace(): diff --git a/Lib/binhex.py b/Lib/binhex.py index 56b5f852c0038ac3320c34bd976925e2ee140c06..ace5217d2713921d2b03c1a956a0f23ed0bdbccb 100644 --- a/Lib/binhex.py +++ b/Lib/binhex.py @@ -21,10 +21,16 @@ # input. The resulting code (xx 90 90) would appear to be interpreted as an # escaped *value* of 0x90. All coders I've seen appear to ignore this nicety... # +import binascii +import contextlib import io import os import struct -import binascii +import warnings + +warnings.warn('the binhex module is deprecated', DeprecationWarning, + stacklevel=2) + __all__ = ["binhex","hexbin","Error"] @@ -76,6 +82,16 @@ def write(self, *args): def close(self): pass + +# DeprecationWarning is already emitted on "import binhex". There is no need +# to repeat the warning at each call to deprecated binascii functions. +@contextlib.contextmanager +def _ignore_deprecation_warning(): + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', '', DeprecationWarning) + yield + + class _Hqxcoderengine: """Write data to the coder in 3-byte chunks""" @@ -93,23 +109,25 @@ def write(self, data): self.data = self.data[todo:] if not data: return - self.hqxdata = self.hqxdata + binascii.b2a_hqx(data) + with _ignore_deprecation_warning(): + self.hqxdata = self.hqxdata + binascii.b2a_hqx(data) self._flush(0) def _flush(self, force): first = 0 while first <= len(self.hqxdata) - self.linelen: last = first + self.linelen - self.ofp.write(self.hqxdata[first:last] + b'\n') + self.ofp.write(self.hqxdata[first:last] + b'\r') self.linelen = LINELEN first = last self.hqxdata = self.hqxdata[first:] if force: - self.ofp.write(self.hqxdata + b':\n') + self.ofp.write(self.hqxdata + b':\r') def close(self): if self.data: - self.hqxdata = self.hqxdata + binascii.b2a_hqx(self.data) + with _ignore_deprecation_warning(): + self.hqxdata = self.hqxdata + binascii.b2a_hqx(self.data) self._flush(1) self.ofp.close() del self.ofp @@ -125,13 +143,15 @@ def write(self, data): self.data = self.data + data if len(self.data) < REASONABLY_LARGE: return - rledata = binascii.rlecode_hqx(self.data) + with _ignore_deprecation_warning(): + rledata = binascii.rlecode_hqx(self.data) self.ofp.write(rledata) self.data = b'' def close(self): if self.data: - rledata = binascii.rlecode_hqx(self.data) + with _ignore_deprecation_warning(): + rledata = binascii.rlecode_hqx(self.data) self.ofp.write(rledata) self.ofp.close() del self.ofp @@ -276,7 +296,8 @@ def read(self, totalwtd): # while True: try: - decdatacur, self.eof = binascii.a2b_hqx(data) + with _ignore_deprecation_warning(): + decdatacur, self.eof = binascii.a2b_hqx(data) break except binascii.Incomplete: pass @@ -312,8 +333,9 @@ def read(self, wtd): def _fill(self, wtd): self.pre_buffer = self.pre_buffer + self.ifp.read(wtd + 4) if self.ifp.eof: - self.post_buffer = self.post_buffer + \ - binascii.rledecode_hqx(self.pre_buffer) + with _ignore_deprecation_warning(): + self.post_buffer = self.post_buffer + \ + binascii.rledecode_hqx(self.pre_buffer) self.pre_buffer = b'' return @@ -340,8 +362,9 @@ def _fill(self, wtd): else: mark = mark - 1 - self.post_buffer = self.post_buffer + \ - binascii.rledecode_hqx(self.pre_buffer[:mark]) + with _ignore_deprecation_warning(): + self.post_buffer = self.post_buffer + \ + binascii.rledecode_hqx(self.pre_buffer[:mark]) self.pre_buffer = self.pre_buffer[mark:] def close(self): diff --git a/Lib/bisect.py b/Lib/bisect.py index 9786fc9d87c5ef54d9e516005a82e4da3dca1381..8f3f6a3fe35ffea711796e6f7c2a19f5add1342d 100644 --- a/Lib/bisect.py +++ b/Lib/bisect.py @@ -29,6 +29,7 @@ def bisect_right(a, x, lo=0, hi=None): hi = len(a) while lo < hi: mid = (lo+hi)//2 + # Use __lt__ to match the logic in list.sort() and in heapq if x < a[mid]: hi = mid else: lo = mid+1 return lo @@ -63,6 +64,7 @@ def bisect_left(a, x, lo=0, hi=None): hi = len(a) while lo < hi: mid = (lo+hi)//2 + # Use __lt__ to match the logic in list.sort() and in heapq if a[mid] < x: lo = mid+1 else: hi = mid return lo diff --git a/Lib/bz2.py b/Lib/bz2.py index 21e8ff49c67b38882827d04475186593787d0dfc..ce07ebeb142d926aa54b124eca8623b8c483eeb4 100644 --- a/Lib/bz2.py +++ b/Lib/bz2.py @@ -12,7 +12,6 @@ from builtins import open as _builtin_open import io import os -import warnings import _compression from threading import RLock @@ -24,8 +23,6 @@ # Value 2 no longer used _MODE_WRITE = 3 -_sentinel = object() - class BZ2File(_compression.BaseStream): @@ -38,7 +35,7 @@ class BZ2File(_compression.BaseStream): returned as bytes, and data to be written should be given as bytes. """ - def __init__(self, filename, mode="r", buffering=_sentinel, compresslevel=9): + def __init__(self, filename, mode="r", *, compresslevel=9): """Open a bzip2-compressed file. If filename is a str, bytes, or PathLike object, it gives the @@ -49,8 +46,6 @@ def __init__(self, filename, mode="r", buffering=_sentinel, compresslevel=9): 'x' for creating exclusively, or 'a' for appending. These can equivalently be given as 'rb', 'wb', 'xb', and 'ab'. - buffering is ignored since Python 3.0. Its use is deprecated. - If mode is 'w', 'x' or 'a', compresslevel can be a number between 1 and 9 specifying the level of compression: 1 produces the least compression, and 9 (default) produces the most compression. @@ -65,12 +60,6 @@ def __init__(self, filename, mode="r", buffering=_sentinel, compresslevel=9): self._closefp = False self._mode = _MODE_CLOSED - if buffering is not _sentinel: - warnings.warn("Use of 'buffering' argument is deprecated and ignored " - "since Python 3.0.", - DeprecationWarning, - stacklevel=2) - if not (1 <= compresslevel <= 9): raise ValueError("compresslevel must be between 1 and 9") diff --git a/Lib/cProfile.py b/Lib/cProfile.py index 369d02e22e24aa6a582c765ec36b4aac0892001b..22a7d0aade855fd83e72d251cdf6ee4336e41765 100755 --- a/Lib/cProfile.py +++ b/Lib/cProfile.py @@ -103,28 +103,12 @@ def runctx(self, cmd, globals, locals): return self # This method is more useful to profile a single function call. - def runcall(*args, **kw): - if len(args) >= 2: - self, func, *args = args - elif not args: - raise TypeError("descriptor 'runcall' of 'Profile' object " - "needs an argument") - elif 'func' in kw: - func = kw.pop('func') - self, *args = args - import warnings - warnings.warn("Passing 'func' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('runcall expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - + def runcall(self, func, /, *args, **kw): self.enable() try: return func(*args, **kw) finally: self.disable() - runcall.__text_signature__ = '($self, func, /, *args, **kw)' def __enter__(self): self.enable() @@ -168,6 +152,11 @@ def main(): (options, args) = parser.parse_args() sys.argv[:] = args + # The script that we're profiling may chdir, so capture the absolute path + # to the output file at startup. + if options.outfile is not None: + options.outfile = os.path.abspath(options.outfile) + if len(args) > 0: if options.module: code = "run_module(modname, run_name='__main__')" @@ -186,7 +175,12 @@ def main(): '__package__': None, '__cached__': None, } - runctx(code, globs, None, options.outfile, options.sort) + try: + runctx(code, globs, None, options.outfile, options.sort) + except BrokenPipeError as exc: + # Prevent "Exception ignored" during interpreter shutdown. + sys.stdout = None + sys.exit(exc.errno) else: parser.print_usage() return parser diff --git a/Lib/cgi.py b/Lib/cgi.py index 77ab703cc036004a980e5e014d69120fa8e5e072..1e880e51848af2c80f922401b61020e5155b0562 100755 --- a/Lib/cgi.py +++ b/Lib/cgi.py @@ -115,7 +115,8 @@ def closelog(): # 0 ==> unlimited input maxlen = 0 -def parse(fp=None, environ=os.environ, keep_blank_values=0, strict_parsing=0): +def parse(fp=None, environ=os.environ, keep_blank_values=0, + strict_parsing=0, separator='&'): """Parse a query in the environment or from a file (default stdin) Arguments, all optional: @@ -134,6 +135,9 @@ def parse(fp=None, environ=os.environ, keep_blank_values=0, strict_parsing=0): strict_parsing: flag indicating what to do with parsing errors. If false (the default), errors are silently ignored. If true, errors raise a ValueError exception. + + separator: str. The symbol to use for separating the query arguments. + Defaults to &. """ if fp is None: fp = sys.stdin @@ -154,7 +158,7 @@ def parse(fp=None, environ=os.environ, keep_blank_values=0, strict_parsing=0): if environ['REQUEST_METHOD'] == 'POST': ctype, pdict = parse_header(environ['CONTENT_TYPE']) if ctype == 'multipart/form-data': - return parse_multipart(fp, pdict) + return parse_multipart(fp, pdict, separator=separator) elif ctype == 'application/x-www-form-urlencoded': clength = int(environ['CONTENT_LENGTH']) if maxlen and clength > maxlen: @@ -178,10 +182,10 @@ def parse(fp=None, environ=os.environ, keep_blank_values=0, strict_parsing=0): qs = "" environ['QUERY_STRING'] = qs # XXX Shouldn't, really return urllib.parse.parse_qs(qs, keep_blank_values, strict_parsing, - encoding=encoding) + encoding=encoding, separator=separator) -def parse_multipart(fp, pdict, encoding="utf-8", errors="replace"): +def parse_multipart(fp, pdict, encoding="utf-8", errors="replace", separator='&'): """Parse multipart input. Arguments: @@ -205,7 +209,7 @@ def parse_multipart(fp, pdict, encoding="utf-8", errors="replace"): except KeyError: pass fs = FieldStorage(fp, headers=headers, encoding=encoding, errors=errors, - environ={'REQUEST_METHOD': 'POST'}) + environ={'REQUEST_METHOD': 'POST'}, separator=separator) return {k: fs.getlist(k) for k in fs} def _parseparam(s): @@ -315,7 +319,7 @@ class FieldStorage: def __init__(self, fp=None, headers=None, outerboundary=b'', environ=os.environ, keep_blank_values=0, strict_parsing=0, limit=None, encoding='utf-8', errors='replace', - max_num_fields=None): + max_num_fields=None, separator='&'): """Constructor. Read multipart/* until last part. Arguments, all optional: @@ -363,6 +367,7 @@ def __init__(self, fp=None, headers=None, outerboundary=b'', self.keep_blank_values = keep_blank_values self.strict_parsing = strict_parsing self.max_num_fields = max_num_fields + self.separator = separator if 'REQUEST_METHOD' in environ: method = environ['REQUEST_METHOD'].upper() self.qs_on_post = None @@ -589,7 +594,7 @@ def read_urlencoded(self): query = urllib.parse.parse_qsl( qs, self.keep_blank_values, self.strict_parsing, encoding=self.encoding, errors=self.errors, - max_num_fields=self.max_num_fields) + max_num_fields=self.max_num_fields, separator=self.separator) self.list = [MiniFieldStorage(key, value) for key, value in query] self.skip_lines() @@ -605,7 +610,7 @@ def read_multi(self, environ, keep_blank_values, strict_parsing): query = urllib.parse.parse_qsl( self.qs_on_post, self.keep_blank_values, self.strict_parsing, encoding=self.encoding, errors=self.errors, - max_num_fields=self.max_num_fields) + max_num_fields=self.max_num_fields, separator=self.separator) self.list.extend(MiniFieldStorage(key, value) for key, value in query) klass = self.FieldStorageClass or self.__class__ @@ -649,7 +654,7 @@ def read_multi(self, environ, keep_blank_values, strict_parsing): else self.limit - self.bytes_read part = klass(self.fp, headers, ib, environ, keep_blank_values, strict_parsing, limit, - self.encoding, self.errors, max_num_fields) + self.encoding, self.errors, max_num_fields, self.separator) if max_num_fields is not None: max_num_fields -= 1 diff --git a/Lib/codecs.py b/Lib/codecs.py index 7f23e9775df804e79e4d0869a29dc05e1396a892..d2edd148a290aa487df9719e8725739317f48c1e 100644 --- a/Lib/codecs.py +++ b/Lib/codecs.py @@ -386,7 +386,7 @@ def writelines(self, list): def reset(self): - """ Flushes and resets the codec buffers used for keeping state. + """ Resets the codec buffers used for keeping internal state. Calling this method should ensure that the data on the output is put into a clean state, that allows appending @@ -620,7 +620,7 @@ def readlines(self, sizehint=None, keepends=True): def reset(self): - """ Resets the codec buffers used for keeping state. + """ Resets the codec buffers used for keeping internal state. Note that no stream repositioning should take place. This method is primarily intended to be able to recover diff --git a/Lib/codeop.py b/Lib/codeop.py index 3c2bb6083561eb704ec6ee85d458adc177ca8bf7..4c10470aee7b7c1db059a29dd95b02157305fa7f 100644 --- a/Lib/codeop.py +++ b/Lib/codeop.py @@ -81,12 +81,14 @@ def _maybe_compile(compiler, source, filename, symbol): try: code = compiler(source, filename, symbol) - except SyntaxError as err: + except SyntaxError: pass - # Suppress warnings after the first compile to avoid duplication. + # Catch syntax warnings after the first compile + # to emit warnings (SyntaxWarning, DeprecationWarning) at most once. with warnings.catch_warnings(): - warnings.simplefilter("ignore") + warnings.simplefilter("error") + try: code1 = compiler(source + "\n", filename, symbol) except SyntaxError as e: @@ -138,7 +140,7 @@ def __init__(self): self.flags = PyCF_DONT_IMPLY_DEDENT def __call__(self, source, filename, symbol): - codeob = compile(source, filename, symbol, self.flags, 1) + codeob = compile(source, filename, symbol, self.flags, True) for feature in _features: if codeob.co_flags & feature.compiler_flag: self.flags |= feature.compiler_flag diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index a78a47c55a8fc9b434184134649268aed696cc61..5bdd3b3516d3b2c6ddd206745a4ca02a9901def4 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -14,17 +14,30 @@ ''' -__all__ = ['deque', 'defaultdict', 'namedtuple', 'UserDict', 'UserList', - 'UserString', 'Counter', 'OrderedDict', 'ChainMap'] +__all__ = [ + 'ChainMap', + 'Counter', + 'OrderedDict', + 'UserDict', + 'UserList', + 'UserString', + 'defaultdict', + 'deque', + 'namedtuple', +] import _collections_abc -from operator import itemgetter as _itemgetter, eq as _eq -from keyword import iskeyword as _iskeyword -import sys as _sys import heapq as _heapq -from _weakref import proxy as _proxy -from itertools import repeat as _repeat, chain as _chain, starmap as _starmap +import sys as _sys + +from itertools import chain as _chain +from itertools import repeat as _repeat +from itertools import starmap as _starmap +from keyword import iskeyword as _iskeyword +from operator import eq as _eq +from operator import itemgetter as _itemgetter from reprlib import recursive_repr as _recursive_repr +from _weakref import proxy as _proxy try: from _collections import deque @@ -48,12 +61,13 @@ def __getattr__(name): import warnings warnings.warn("Using or importing the ABCs from 'collections' instead " "of from 'collections.abc' is deprecated since Python 3.3, " - "and in 3.9 it will stop working", + "and in 3.10 it will stop working", DeprecationWarning, stacklevel=2) globals()[name] = obj return obj raise AttributeError(f'module {__name__!r} has no attribute {name!r}') + ################################################################################ ### OrderedDict ################################################################################ @@ -293,6 +307,24 @@ def __eq__(self, other): return dict.__eq__(self, other) and all(map(_eq, self, other)) return dict.__eq__(self, other) + def __ior__(self, other): + self.update(other) + return self + + def __or__(self, other): + if not isinstance(other, dict): + return NotImplemented + new = self.__class__(self) + new.update(other) + return new + + def __ror__(self, other): + if not isinstance(other, dict): + return NotImplemented + new = self.__class__(other) + new.update(self) + return new + try: from _collections import OrderedDict @@ -381,18 +413,23 @@ def namedtuple(typename, field_names, *, rename=False, defaults=None, module=Non # Variables used in the methods and docstrings field_names = tuple(map(_sys.intern, field_names)) num_fields = len(field_names) - arg_list = repr(field_names).replace("'", "")[1:-1] + arg_list = ', '.join(field_names) + if num_fields == 1: + arg_list += ',' repr_fmt = '(' + ', '.join(f'{name}=%r' for name in field_names) + ')' tuple_new = tuple.__new__ _dict, _tuple, _len, _map, _zip = dict, tuple, len, map, zip # Create all the named tuple methods to be added to the class namespace - s = f'def __new__(_cls, {arg_list}): return _tuple_new(_cls, ({arg_list}))' - namespace = {'_tuple_new': tuple_new, '__name__': f'namedtuple_{typename}'} - # Note: exec() has the side-effect of interning the field names - exec(s, namespace) - __new__ = namespace['__new__'] + namespace = { + '_tuple_new': tuple_new, + '__builtins__': {}, + '__name__': f'namedtuple_{typename}', + } + code = f'lambda _cls, {arg_list}: _tuple_new(_cls, ({arg_list}))' + __new__ = eval(code, namespace) + __new__.__name__ = '__new__' __new__.__doc__ = f'Create new instance of {typename}({arg_list})' if defaults is not None: __new__.__defaults__ = defaults @@ -429,8 +466,14 @@ def __getnewargs__(self): return _tuple(self) # Modify function metadata to help with introspection and debugging - for method in (__new__, _make.__func__, _replace, - __repr__, _asdict, __getnewargs__): + for method in ( + __new__, + _make.__func__, + _replace, + __repr__, + _asdict, + __getnewargs__, + ): method.__qualname__ = f'{typename}.{method.__name__}' # Build-up the class namespace dictionary @@ -440,8 +483,6 @@ def __getnewargs__(self): '__slots__': (), '_fields': field_names, '_field_defaults': field_defaults, - # alternate spelling for backward compatibility - '_fields_defaults': field_defaults, '__new__': __new__, '_make': _make, '_replace': _replace, @@ -548,7 +589,7 @@ def __init__(self, iterable=None, /, **kwds): >>> c = Counter(a=4, b=2) # a new counter from keyword args ''' - super(Counter, self).__init__() + super().__init__() self.update(iterable, **kwds) def __missing__(self, key): @@ -632,7 +673,8 @@ def update(self, iterable=None, /, **kwds): for elem, count in iterable.items(): self[elem] = count + self_get(elem, 0) else: - super(Counter, self).update(iterable) # fast path when counter is empty + # fast path when counter is empty + super().update(iterable) else: _count_elements(self, iterable) if kwds: @@ -679,13 +721,14 @@ def __delitem__(self, elem): def __repr__(self): if not self: - return '%s()' % self.__class__.__name__ + return f'{self.__class__.__name__}()' try: - items = ', '.join(map('%r: %r'.__mod__, self.most_common())) - return '%s({%s})' % (self.__class__.__name__, items) + # dict() preserves the ordering returned by most_common() + d = dict(self.most_common()) except TypeError: # handle case where values are not orderable - return '{0}({1!r})'.format(self.__class__.__name__, dict(self)) + d = dict(self) + return f'{self.__class__.__name__}({d!r})' # Multiset-style mathematical operations discussed in: # Knuth TAOCP Volume II section 4.6.3 exercise 19 @@ -906,7 +949,7 @@ def __len__(self): def __iter__(self): d = {} for mapping in reversed(self.maps): - d.update(mapping) # reuses stored hash values if possible + d.update(dict.fromkeys(mapping)) # reuses stored hash values if possible return iter(d) def __contains__(self, key): @@ -950,7 +993,7 @@ def __delitem__(self, key): try: del self.maps[0][key] except KeyError: - raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + raise KeyError(f'Key not found in the first mapping: {key!r}') def popitem(self): 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' @@ -964,12 +1007,31 @@ def pop(self, key, *args): try: return self.maps[0].pop(key, *args) except KeyError: - raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + raise KeyError(f'Key not found in the first mapping: {key!r}') def clear(self): 'Clear maps[0], leaving maps[1:] intact.' self.maps[0].clear() + def __ior__(self, other): + self.maps[0].update(other) + return self + + def __or__(self, other): + if not isinstance(other, _collections_abc.Mapping): + return NotImplemented + m = self.copy() + m.maps[0].update(other) + return m + + def __ror__(self, other): + if not isinstance(other, _collections_abc.Mapping): + return NotImplemented + m = dict(other) + for child in reversed(self.maps): + m.update(child) + return self.__class__(m) + ################################################################################ ### UserDict @@ -978,38 +1040,29 @@ def clear(self): class UserDict(_collections_abc.MutableMapping): # Start by filling-out the abstract methods - def __init__(*args, **kwargs): - if not args: - raise TypeError("descriptor '__init__' of 'UserDict' object " - "needs an argument") - self, *args = args - if len(args) > 1: - raise TypeError('expected at most 1 arguments, got %d' % len(args)) - if args: - dict = args[0] - elif 'dict' in kwargs: - dict = kwargs.pop('dict') - import warnings - warnings.warn("Passing 'dict' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - dict = None + def __init__(self, dict=None, /, **kwargs): self.data = {} if dict is not None: self.update(dict) if kwargs: self.update(kwargs) - __init__.__text_signature__ = '($self, dict=None, /, **kwargs)' - def __len__(self): return len(self.data) + def __len__(self): + return len(self.data) + def __getitem__(self, key): if key in self.data: return self.data[key] if hasattr(self.__class__, "__missing__"): return self.__class__.__missing__(self, key) raise KeyError(key) - def __setitem__(self, key, item): self.data[key] = item - def __delitem__(self, key): del self.data[key] + + def __setitem__(self, key, item): + self.data[key] = item + + def __delitem__(self, key): + del self.data[key] + def __iter__(self): return iter(self.data) @@ -1018,7 +1071,30 @@ def __contains__(self, key): return key in self.data # Now, add the methods in dicts but not in MutableMapping - def __repr__(self): return repr(self.data) + def __repr__(self): + return repr(self.data) + + def __or__(self, other): + if isinstance(other, UserDict): + return self.__class__(self.data | other.data) + if isinstance(other, dict): + return self.__class__(self.data | other) + return NotImplemented + + def __ror__(self, other): + if isinstance(other, UserDict): + return self.__class__(other.data | self.data) + if isinstance(other, dict): + return self.__class__(other | self.data) + return NotImplemented + + def __ior__(self, other): + if isinstance(other, UserDict): + self.data |= other.data + else: + self.data |= other + return self + def __copy__(self): inst = self.__class__.__new__(self.__class__) inst.__dict__.update(self.__dict__) @@ -1047,13 +1123,13 @@ def fromkeys(cls, iterable, value=None): return d - ################################################################################ ### UserList ################################################################################ class UserList(_collections_abc.MutableSequence): """A more or less complete user-defined wrapper around list objects.""" + def __init__(self, initlist=None): self.data = [] if initlist is not None: @@ -1064,35 +1140,60 @@ def __init__(self, initlist=None): self.data[:] = initlist.data[:] else: self.data = list(initlist) - def __repr__(self): return repr(self.data) - def __lt__(self, other): return self.data < self.__cast(other) - def __le__(self, other): return self.data <= self.__cast(other) - def __eq__(self, other): return self.data == self.__cast(other) - def __gt__(self, other): return self.data > self.__cast(other) - def __ge__(self, other): return self.data >= self.__cast(other) + + def __repr__(self): + return repr(self.data) + + def __lt__(self, other): + return self.data < self.__cast(other) + + def __le__(self, other): + return self.data <= self.__cast(other) + + def __eq__(self, other): + return self.data == self.__cast(other) + + def __gt__(self, other): + return self.data > self.__cast(other) + + def __ge__(self, other): + return self.data >= self.__cast(other) + def __cast(self, other): return other.data if isinstance(other, UserList) else other - def __contains__(self, item): return item in self.data - def __len__(self): return len(self.data) + + def __contains__(self, item): + return item in self.data + + def __len__(self): + return len(self.data) + def __getitem__(self, i): if isinstance(i, slice): return self.__class__(self.data[i]) else: return self.data[i] - def __setitem__(self, i, item): self.data[i] = item - def __delitem__(self, i): del self.data[i] + + def __setitem__(self, i, item): + self.data[i] = item + + def __delitem__(self, i): + del self.data[i] + def __add__(self, other): if isinstance(other, UserList): return self.__class__(self.data + other.data) elif isinstance(other, type(self.data)): return self.__class__(self.data + other) return self.__class__(self.data + list(other)) + def __radd__(self, other): if isinstance(other, UserList): return self.__class__(other.data + self.data) elif isinstance(other, type(self.data)): return self.__class__(other + self.data) return self.__class__(list(other) + self.data) + def __iadd__(self, other): if isinstance(other, UserList): self.data += other.data @@ -1101,28 +1202,53 @@ def __iadd__(self, other): else: self.data += list(other) return self + def __mul__(self, n): - return self.__class__(self.data*n) + return self.__class__(self.data * n) + __rmul__ = __mul__ + def __imul__(self, n): self.data *= n return self + def __copy__(self): inst = self.__class__.__new__(self.__class__) inst.__dict__.update(self.__dict__) # Create a copy and avoid triggering descriptors inst.__dict__["data"] = self.__dict__["data"][:] return inst - def append(self, item): self.data.append(item) - def insert(self, i, item): self.data.insert(i, item) - def pop(self, i=-1): return self.data.pop(i) - def remove(self, item): self.data.remove(item) - def clear(self): self.data.clear() - def copy(self): return self.__class__(self) - def count(self, item): return self.data.count(item) - def index(self, item, *args): return self.data.index(item, *args) - def reverse(self): self.data.reverse() - def sort(self, /, *args, **kwds): self.data.sort(*args, **kwds) + + def append(self, item): + self.data.append(item) + + def insert(self, i, item): + self.data.insert(i, item) + + def pop(self, i=-1): + return self.data.pop(i) + + def remove(self, item): + self.data.remove(item) + + def clear(self): + self.data.clear() + + def copy(self): + return self.__class__(self) + + def count(self, item): + return self.data.count(item) + + def index(self, item, *args): + return self.data.index(item, *args) + + def reverse(self): + self.data.reverse() + + def sort(self, /, *args, **kwds): + self.data.sort(*args, **kwds) + def extend(self, other): if isinstance(other, UserList): self.data.extend(other.data) @@ -1130,12 +1256,12 @@ def extend(self, other): self.data.extend(other) - ################################################################################ ### UserString ################################################################################ class UserString(_collections_abc.Sequence): + def __init__(self, seq): if isinstance(seq, str): self.data = seq @@ -1143,12 +1269,25 @@ def __init__(self, seq): self.data = seq.data[:] else: self.data = str(seq) - def __str__(self): return str(self.data) - def __repr__(self): return repr(self.data) - def __int__(self): return int(self.data) - def __float__(self): return float(self.data) - def __complex__(self): return complex(self.data) - def __hash__(self): return hash(self.data) + + def __str__(self): + return str(self.data) + + def __repr__(self): + return repr(self.data) + + def __int__(self): + return int(self.data) + + def __float__(self): + return float(self.data) + + def __complex__(self): + return complex(self.data) + + def __hash__(self): + return hash(self.data) + def __getnewargs__(self): return (self.data[:],) @@ -1156,18 +1295,22 @@ def __eq__(self, string): if isinstance(string, UserString): return self.data == string.data return self.data == string + def __lt__(self, string): if isinstance(string, UserString): return self.data < string.data return self.data < string + def __le__(self, string): if isinstance(string, UserString): return self.data <= string.data return self.data <= string + def __gt__(self, string): if isinstance(string, UserString): return self.data > string.data return self.data > string + def __ge__(self, string): if isinstance(string, UserString): return self.data >= string.data @@ -1178,102 +1321,188 @@ def __contains__(self, char): char = char.data return char in self.data - def __len__(self): return len(self.data) - def __getitem__(self, index): return self.__class__(self.data[index]) + def __len__(self): + return len(self.data) + + def __getitem__(self, index): + return self.__class__(self.data[index]) + def __add__(self, other): if isinstance(other, UserString): return self.__class__(self.data + other.data) elif isinstance(other, str): return self.__class__(self.data + other) return self.__class__(self.data + str(other)) + def __radd__(self, other): if isinstance(other, str): return self.__class__(other + self.data) return self.__class__(str(other) + self.data) + def __mul__(self, n): - return self.__class__(self.data*n) + return self.__class__(self.data * n) + __rmul__ = __mul__ + def __mod__(self, args): return self.__class__(self.data % args) + def __rmod__(self, template): return self.__class__(str(template) % self) + # the following methods are defined in alphabetical order: - def capitalize(self): return self.__class__(self.data.capitalize()) + def capitalize(self): + return self.__class__(self.data.capitalize()) + def casefold(self): return self.__class__(self.data.casefold()) + def center(self, width, *args): return self.__class__(self.data.center(width, *args)) + def count(self, sub, start=0, end=_sys.maxsize): if isinstance(sub, UserString): sub = sub.data return self.data.count(sub, start, end) + + def removeprefix(self, prefix, /): + if isinstance(prefix, UserString): + prefix = prefix.data + return self.__class__(self.data.removeprefix(prefix)) + + def removesuffix(self, suffix, /): + if isinstance(suffix, UserString): + suffix = suffix.data + return self.__class__(self.data.removesuffix(suffix)) + def encode(self, encoding='utf-8', errors='strict'): encoding = 'utf-8' if encoding is None else encoding errors = 'strict' if errors is None else errors return self.data.encode(encoding, errors) + def endswith(self, suffix, start=0, end=_sys.maxsize): return self.data.endswith(suffix, start, end) + def expandtabs(self, tabsize=8): return self.__class__(self.data.expandtabs(tabsize)) + def find(self, sub, start=0, end=_sys.maxsize): if isinstance(sub, UserString): sub = sub.data return self.data.find(sub, start, end) + def format(self, /, *args, **kwds): return self.data.format(*args, **kwds) + def format_map(self, mapping): return self.data.format_map(mapping) + def index(self, sub, start=0, end=_sys.maxsize): return self.data.index(sub, start, end) - def isalpha(self): return self.data.isalpha() - def isalnum(self): return self.data.isalnum() - def isascii(self): return self.data.isascii() - def isdecimal(self): return self.data.isdecimal() - def isdigit(self): return self.data.isdigit() - def isidentifier(self): return self.data.isidentifier() - def islower(self): return self.data.islower() - def isnumeric(self): return self.data.isnumeric() - def isprintable(self): return self.data.isprintable() - def isspace(self): return self.data.isspace() - def istitle(self): return self.data.istitle() - def isupper(self): return self.data.isupper() - def join(self, seq): return self.data.join(seq) + + def isalpha(self): + return self.data.isalpha() + + def isalnum(self): + return self.data.isalnum() + + def isascii(self): + return self.data.isascii() + + def isdecimal(self): + return self.data.isdecimal() + + def isdigit(self): + return self.data.isdigit() + + def isidentifier(self): + return self.data.isidentifier() + + def islower(self): + return self.data.islower() + + def isnumeric(self): + return self.data.isnumeric() + + def isprintable(self): + return self.data.isprintable() + + def isspace(self): + return self.data.isspace() + + def istitle(self): + return self.data.istitle() + + def isupper(self): + return self.data.isupper() + + def join(self, seq): + return self.data.join(seq) + def ljust(self, width, *args): return self.__class__(self.data.ljust(width, *args)) - def lower(self): return self.__class__(self.data.lower()) - def lstrip(self, chars=None): return self.__class__(self.data.lstrip(chars)) + + def lower(self): + return self.__class__(self.data.lower()) + + def lstrip(self, chars=None): + return self.__class__(self.data.lstrip(chars)) + maketrans = str.maketrans + def partition(self, sep): return self.data.partition(sep) + def replace(self, old, new, maxsplit=-1): if isinstance(old, UserString): old = old.data if isinstance(new, UserString): new = new.data return self.__class__(self.data.replace(old, new, maxsplit)) + def rfind(self, sub, start=0, end=_sys.maxsize): if isinstance(sub, UserString): sub = sub.data return self.data.rfind(sub, start, end) + def rindex(self, sub, start=0, end=_sys.maxsize): return self.data.rindex(sub, start, end) + def rjust(self, width, *args): return self.__class__(self.data.rjust(width, *args)) + def rpartition(self, sep): return self.data.rpartition(sep) + def rstrip(self, chars=None): return self.__class__(self.data.rstrip(chars)) + def split(self, sep=None, maxsplit=-1): return self.data.split(sep, maxsplit) + def rsplit(self, sep=None, maxsplit=-1): return self.data.rsplit(sep, maxsplit) - def splitlines(self, keepends=False): return self.data.splitlines(keepends) + + def splitlines(self, keepends=False): + return self.data.splitlines(keepends) + def startswith(self, prefix, start=0, end=_sys.maxsize): return self.data.startswith(prefix, start, end) - def strip(self, chars=None): return self.__class__(self.data.strip(chars)) - def swapcase(self): return self.__class__(self.data.swapcase()) - def title(self): return self.__class__(self.data.title()) + + def strip(self, chars=None): + return self.__class__(self.data.strip(chars)) + + def swapcase(self): + return self.__class__(self.data.swapcase()) + + def title(self): + return self.__class__(self.data.title()) + def translate(self, *args): return self.__class__(self.data.translate(*args)) - def upper(self): return self.__class__(self.data.upper()) - def zfill(self, width): return self.__class__(self.data.zfill(width)) + + def upper(self): + return self.__class__(self.data.upper()) + + def zfill(self, width): + return self.__class__(self.data.zfill(width)) diff --git a/Lib/collections/abc.py b/Lib/collections/abc.py index 891600d16bee9e2463573cdda511ad71d9b8e07d..86ca8b8a8414b3860aa80599394e806e156f4b5b 100644 --- a/Lib/collections/abc.py +++ b/Lib/collections/abc.py @@ -1,2 +1,3 @@ from _collections_abc import * from _collections_abc import __all__ +from _collections_abc import _CallableGenericAlias diff --git a/Lib/compileall.py b/Lib/compileall.py index bfac8efc804d06ee8b20081fd72722506c751844..fe7f450c55e1c5173c05d7f626af86119a85d7eb 100644 --- a/Lib/compileall.py +++ b/Lib/compileall.py @@ -15,12 +15,14 @@ import importlib.util import py_compile import struct +import filecmp from functools import partial +from pathlib import Path __all__ = ["compile_dir","compile_file","compile_path"] -def _walk_dir(dir, ddir=None, maxlevels=10, quiet=0): +def _walk_dir(dir, maxlevels, quiet=0): if quiet < 2 and isinstance(dir, os.PathLike): dir = os.fspath(dir) if not quiet: @@ -36,37 +38,49 @@ def _walk_dir(dir, ddir=None, maxlevels=10, quiet=0): if name == '__pycache__': continue fullname = os.path.join(dir, name) - if ddir is not None: - dfile = os.path.join(ddir, name) - else: - dfile = None if not os.path.isdir(fullname): - yield fullname, ddir + yield fullname elif (maxlevels > 0 and name != os.curdir and name != os.pardir and os.path.isdir(fullname) and not os.path.islink(fullname)): - yield from _walk_dir(fullname, ddir=dfile, - maxlevels=maxlevels - 1, quiet=quiet) + yield from _walk_dir(fullname, maxlevels=maxlevels - 1, + quiet=quiet) -def compile_dir(dir, maxlevels=10, ddir=None, force=False, rx=None, - quiet=0, legacy=False, optimize=-1, workers=1, - invalidation_mode=None): +def compile_dir(dir, maxlevels=None, ddir=None, force=False, + rx=None, quiet=0, legacy=False, optimize=-1, workers=1, + invalidation_mode=None, *, stripdir=None, + prependdir=None, limit_sl_dest=None, hardlink_dupes=False): """Byte-compile all modules in the given directory tree. Arguments (only dir is required): dir: the directory to byte-compile - maxlevels: maximum recursion level (default 10) + maxlevels: maximum recursion level (default `sys.getrecursionlimit()`) ddir: the directory that will be prepended to the path to the file as it is compiled into each byte-code file. force: if True, force compilation, even if timestamps are up-to-date quiet: full output with False or 0, errors only with 1, no output with 2 legacy: if True, produce legacy pyc paths instead of PEP 3147 paths - optimize: optimization level or -1 for level of the interpreter + optimize: int or list of optimization levels or -1 for level of + the interpreter. Multiple levels leads to multiple compiled + files each with one optimization level. workers: maximum number of parallel workers invalidation_mode: how the up-to-dateness of the pyc will be checked + stripdir: part of path to left-strip from source file path + prependdir: path to prepend to beginning of original file path, applied + after stripdir + limit_sl_dest: ignore symlinks if they are pointing outside of + the defined path + hardlink_dupes: hardlink duplicated pyc files """ ProcessPoolExecutor = None + if ddir is not None and (stripdir is not None or prependdir is not None): + raise ValueError(("Destination dir (ddir) cannot be used " + "in combination with stripdir or prependdir")) + if ddir is not None: + stripdir = dir + prependdir = ddir + ddir = None if workers < 0: raise ValueError('workers must be greater or equal to 0') if workers != 1: @@ -76,36 +90,40 @@ def compile_dir(dir, maxlevels=10, ddir=None, force=False, rx=None, from concurrent.futures import ProcessPoolExecutor except ImportError: workers = 1 - files_and_ddirs = _walk_dir(dir, quiet=quiet, maxlevels=maxlevels, - ddir=ddir) + if maxlevels is None: + maxlevels = sys.getrecursionlimit() + files = _walk_dir(dir, quiet=quiet, maxlevels=maxlevels) success = True if workers != 1 and ProcessPoolExecutor is not None: # If workers == 0, let ProcessPoolExecutor choose workers = workers or None with ProcessPoolExecutor(max_workers=workers) as executor: - results = executor.map( - partial(_compile_file_tuple, - force=force, rx=rx, quiet=quiet, - legacy=legacy, optimize=optimize, - invalidation_mode=invalidation_mode, - ), - files_and_ddirs) + results = executor.map(partial(compile_file, + ddir=ddir, force=force, + rx=rx, quiet=quiet, + legacy=legacy, + optimize=optimize, + invalidation_mode=invalidation_mode, + stripdir=stripdir, + prependdir=prependdir, + limit_sl_dest=limit_sl_dest, + hardlink_dupes=hardlink_dupes), + files) success = min(results, default=True) else: - for file, dfile in files_and_ddirs: - if not compile_file(file, dfile, force, rx, quiet, - legacy, optimize, invalidation_mode): + for file in files: + if not compile_file(file, ddir, force, rx, quiet, + legacy, optimize, invalidation_mode, + stripdir=stripdir, prependdir=prependdir, + limit_sl_dest=limit_sl_dest, + hardlink_dupes=hardlink_dupes): success = False return success -def _compile_file_tuple(file_and_dfile, **kwargs): - """Needs to be toplevel for ProcessPoolExecutor.""" - file, dfile = file_and_dfile - return compile_file(file, dfile, **kwargs) - def compile_file(fullname, ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1, - invalidation_mode=None): + invalidation_mode=None, *, stripdir=None, prependdir=None, + limit_sl_dest=None, hardlink_dupes=False): """Byte-compile one file. Arguments (only fullname is required): @@ -117,32 +135,85 @@ def compile_file(fullname, ddir=None, force=False, rx=None, quiet=0, quiet: full output with False or 0, errors only with 1, no output with 2 legacy: if True, produce legacy pyc paths instead of PEP 3147 paths - optimize: optimization level or -1 for level of the interpreter + optimize: int or list of optimization levels or -1 for level of + the interpreter. Multiple levels leads to multiple compiled + files each with one optimization level. invalidation_mode: how the up-to-dateness of the pyc will be checked + stripdir: part of path to left-strip from source file path + prependdir: path to prepend to beginning of original file path, applied + after stripdir + limit_sl_dest: ignore symlinks if they are pointing outside of + the defined path. + hardlink_dupes: hardlink duplicated pyc files """ + + if ddir is not None and (stripdir is not None or prependdir is not None): + raise ValueError(("Destination dir (ddir) cannot be used " + "in combination with stripdir or prependdir")) + success = True if quiet < 2 and isinstance(fullname, os.PathLike): fullname = os.fspath(fullname) name = os.path.basename(fullname) + + dfile = None + if ddir is not None: dfile = os.path.join(ddir, name) - else: - dfile = None + + if stripdir is not None: + fullname_parts = fullname.split(os.path.sep) + stripdir_parts = stripdir.split(os.path.sep) + ddir_parts = list(fullname_parts) + + for spart, opart in zip(stripdir_parts, fullname_parts): + if spart == opart: + ddir_parts.remove(spart) + + dfile = os.path.join(*ddir_parts) + + if prependdir is not None: + if dfile is None: + dfile = os.path.join(prependdir, fullname) + else: + dfile = os.path.join(prependdir, dfile) + + if isinstance(optimize, int): + optimize = [optimize] + + # Use set() to remove duplicates. + # Use sorted() to create pyc files in a deterministic order. + optimize = sorted(set(optimize)) + + if hardlink_dupes and len(optimize) < 2: + raise ValueError("Hardlinking of duplicated bytecode makes sense " + "only for more than one optimization level") + if rx is not None: mo = rx.search(fullname) if mo: return success + + if limit_sl_dest is not None and os.path.islink(fullname): + if Path(limit_sl_dest).resolve() not in Path(fullname).resolve().parents: + return success + + opt_cfiles = {} + if os.path.isfile(fullname): - if legacy: - cfile = fullname + 'c' - else: - if optimize >= 0: - opt = optimize if optimize >= 1 else '' - cfile = importlib.util.cache_from_source( - fullname, optimization=opt) + for opt_level in optimize: + if legacy: + opt_cfiles[opt_level] = fullname + 'c' else: - cfile = importlib.util.cache_from_source(fullname) - cache_dir = os.path.dirname(cfile) + if opt_level >= 0: + opt = opt_level if opt_level >= 1 else '' + cfile = (importlib.util.cache_from_source( + fullname, optimization=opt)) + opt_cfiles[opt_level] = cfile + else: + cfile = importlib.util.cache_from_source(fullname) + opt_cfiles[opt_level] = cfile + head, tail = name[:-3], name[-3:] if tail == '.py': if not force: @@ -150,18 +221,28 @@ def compile_file(fullname, ddir=None, force=False, rx=None, quiet=0, mtime = int(os.stat(fullname).st_mtime) expect = struct.pack('<4sll', importlib.util.MAGIC_NUMBER, 0, mtime) - with open(cfile, 'rb') as chandle: - actual = chandle.read(12) - if expect == actual: + for cfile in opt_cfiles.values(): + with open(cfile, 'rb') as chandle: + actual = chandle.read(12) + if expect != actual: + break + else: return success except OSError: pass if not quiet: print('Compiling {!r}...'.format(fullname)) try: - ok = py_compile.compile(fullname, cfile, dfile, True, - optimize=optimize, - invalidation_mode=invalidation_mode) + for index, opt_level in enumerate(optimize): + cfile = opt_cfiles[opt_level] + ok = py_compile.compile(fullname, cfile, dfile, True, + optimize=opt_level, + invalidation_mode=invalidation_mode) + if index > 0 and hardlink_dupes: + previous_cfile = opt_cfiles[optimize[index - 1]] + if filecmp.cmp(cfile, previous_cfile, shallow=False): + os.unlink(cfile) + os.link(previous_cfile, cfile) except py_compile.PyCompileError as err: success = False if quiet >= 2: @@ -230,7 +311,7 @@ def main(): parser = argparse.ArgumentParser( description='Utilities to support installing Python libraries.') parser.add_argument('-l', action='store_const', const=0, - default=10, dest='maxlevels', + default=None, dest='maxlevels', help="don't recurse into subdirectories") parser.add_argument('-r', type=int, dest='recursion', help=('control the maximum recursion level. ' @@ -248,6 +329,20 @@ def main(): 'compile-time tracebacks and in runtime ' 'tracebacks in cases where the source file is ' 'unavailable')) + parser.add_argument('-s', metavar='STRIPDIR', dest='stripdir', + default=None, + help=('part of path to left-strip from path ' + 'to source file - for example buildroot. ' + '`-d` and `-s` options cannot be ' + 'specified together.')) + parser.add_argument('-p', metavar='PREPENDDIR', dest='prependdir', + default=None, + help=('path to add as prefix to path ' + 'to source file - for example / to make ' + 'it absolute when some part is removed ' + 'by `-s` option. ' + '`-d` and `-p` options cannot be ' + 'specified together.')) parser.add_argument('-x', metavar='REGEXP', dest='rx', default=None, help=('skip files matching the regular expression; ' 'the regexp is searched for in the full path ' @@ -270,6 +365,15 @@ def main(): '"checked-hash" if the SOURCE_DATE_EPOCH ' 'environment variable is set, and ' '"timestamp" otherwise.')) + parser.add_argument('-o', action='append', type=int, dest='opt_levels', + help=('Optimization levels to run compilation with.' + 'Default is -1 which uses optimization level of' + 'Python interpreter itself (specified by -O).')) + parser.add_argument('-e', metavar='DIR', dest='limit_sl_dest', + help='Ignore symlinks pointing outsite of the DIR') + parser.add_argument('--hardlink-dupes', action='store_true', + dest='hardlink_dupes', + help='Hardlink duplicated pyc files') args = parser.parse_args() compile_dests = args.compile_dest @@ -278,12 +382,26 @@ def main(): import re args.rx = re.compile(args.rx) + if args.limit_sl_dest == "": + args.limit_sl_dest = None if args.recursion is not None: maxlevels = args.recursion else: maxlevels = args.maxlevels + if args.opt_levels is None: + args.opt_levels = [-1] + + if len(args.opt_levels) == 1 and args.hardlink_dupes: + parser.error(("Hardlinking of duplicated bytecode makes sense " + "only for more than one optimization level.")) + + if args.ddir is not None and ( + args.stripdir is not None or args.prependdir is not None + ): + parser.error("-d cannot be used in combination with -s or -p") + # if flist is provided then load it if args.flist: try: @@ -308,13 +426,23 @@ def main(): if os.path.isfile(dest): if not compile_file(dest, args.ddir, args.force, args.rx, args.quiet, args.legacy, - invalidation_mode=invalidation_mode): + invalidation_mode=invalidation_mode, + stripdir=args.stripdir, + prependdir=args.prependdir, + optimize=args.opt_levels, + limit_sl_dest=args.limit_sl_dest, + hardlink_dupes=args.hardlink_dupes): success = False else: if not compile_dir(dest, maxlevels, args.ddir, args.force, args.rx, args.quiet, args.legacy, workers=args.workers, - invalidation_mode=invalidation_mode): + invalidation_mode=invalidation_mode, + stripdir=args.stripdir, + prependdir=args.prependdir, + optimize=args.opt_levels, + limit_sl_dest=args.limit_sl_dest, + hardlink_dupes=args.hardlink_dupes): success = False return success else: diff --git a/Lib/concurrent/futures/_base.py b/Lib/concurrent/futures/_base.py index 6001e3bdb81bb3855caad825172d88895db824f4..00eb54881f2958d23dadcf0fadb2af552de57161 100644 --- a/Lib/concurrent/futures/_base.py +++ b/Lib/concurrent/futures/_base.py @@ -7,6 +7,7 @@ import logging import threading import time +import types FIRST_COMPLETED = 'FIRST_COMPLETED' FIRST_EXCEPTION = 'FIRST_EXCEPTION' @@ -544,10 +545,12 @@ def set_exception(self, exception): self._condition.notify_all() self._invoke_callbacks() + __class_getitem__ = classmethod(types.GenericAlias) + class Executor(object): """This is an abstract base class for concrete asynchronous executors.""" - def submit(*args, **kwargs): + def submit(self, fn, /, *args, **kwargs): """Submits a callable to be executed with the given arguments. Schedules the callable to be executed as fn(*args, **kwargs) and returns @@ -556,21 +559,7 @@ def submit(*args, **kwargs): Returns: A Future representing the given call. """ - if len(args) >= 2: - pass - elif not args: - raise TypeError("descriptor 'submit' of 'Executor' object " - "needs an argument") - elif 'fn' in kwargs: - import warnings - warnings.warn("Passing 'fn' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('submit expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - raise NotImplementedError() - submit.__text_signature__ = '($self, fn, /, *args, **kwargs)' def map(self, fn, *iterables, timeout=None, chunksize=1): """Returns an iterator equivalent to map(fn, iter). @@ -616,7 +605,7 @@ def result_iterator(): future.cancel() return result_iterator() - def shutdown(self, wait=True): + def shutdown(self, wait=True, *, cancel_futures=False): """Clean-up the resources associated with the Executor. It is safe to call this method several times. Otherwise, no other @@ -626,6 +615,9 @@ def shutdown(self, wait=True): wait: If True then shutdown will not return until all running futures have finished executing and the resources used by the executor have been reclaimed. + cancel_futures: If True then shutdown will cancel all pending + futures. Futures that are completed or running will not be + cancelled. """ pass diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 2b2b78eedd78669a22972d849f998b6f7eeba963..90bc98bf2ecd178eb2eb1801804cc1cb9bf8fd0c 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -45,11 +45,9 @@ __author__ = 'Brian Quinlan (brian@sweetapp.com)' -import atexit import os from concurrent.futures import _base import queue -from queue import Full import multiprocessing as mp import multiprocessing.connection from multiprocessing.queues import Queue @@ -60,19 +58,6 @@ import sys import traceback -# Workers are created as daemon threads and processes. This is done to allow the -# interpreter to exit when there are still idle processes in a -# ProcessPoolExecutor's process pool (i.e. shutdown() was not called). However, -# allowing workers to die with the interpreter has two undesirable properties: -# - The workers would still be running during interpreter shutdown, -# meaning that they would fail in unpredictable ways. -# - The workers could be killed while evaluating a work item, which could -# be bad if the callable being evaluated has external side-effects e.g. -# writing to a file. -# -# To work around this problem, an exit handler is installed which tells the -# workers to exit when their work queues are empty and then waits until the -# threads/processes finish. _threads_wakeups = weakref.WeakKeyDictionary() _global_shutdown = False @@ -80,18 +65,23 @@ class _ThreadWakeup: def __init__(self): + self._closed = False self._reader, self._writer = mp.Pipe(duplex=False) def close(self): - self._writer.close() - self._reader.close() + if not self._closed: + self._closed = True + self._writer.close() + self._reader.close() def wakeup(self): - self._writer.send_bytes(b"") + if not self._closed: + self._writer.send_bytes(b"") def clear(self): - while self._reader.poll(): - self._reader.recv_bytes() + if not self._closed: + while self._reader.poll(): + self._reader.recv_bytes() def _python_exit(): @@ -99,10 +89,17 @@ def _python_exit(): _global_shutdown = True items = list(_threads_wakeups.items()) for _, thread_wakeup in items: + # call not protected by ProcessPoolExecutor._shutdown_lock thread_wakeup.wakeup() for t, _ in items: t.join() +# Register for `_python_exit()` to be called just before joining all +# non-daemon threads. This is used instead of `atexit.register()` for +# compatibility with subinterpreters, which no longer support daemon threads. +# See bpo-39812 for context. +threading._register_atexit(_python_exit) + # Controls how many more calls than processes will be queued in the call queue. # A smaller number will mean that processes spend more time idle waiting for # work while a larger number will make Future.cancel() succeed less frequently @@ -160,8 +157,11 @@ def __init__(self, work_id, fn, args, kwargs): class _SafeQueue(Queue): """Safe Queue set exception to the future object linked to a job""" - def __init__(self, max_size=0, *, ctx, pending_work_items): + def __init__(self, max_size=0, *, ctx, pending_work_items, shutdown_lock, + thread_wakeup): self.pending_work_items = pending_work_items + self.shutdown_lock = shutdown_lock + self.thread_wakeup = thread_wakeup super().__init__(max_size, ctx=ctx) def _on_queue_feeder_error(self, e, obj): @@ -169,8 +169,11 @@ def _on_queue_feeder_error(self, e, obj): tb = traceback.format_exception(type(e), e, e.__traceback__) e.__cause__ = _RemoteTraceback('\n"""\n{}"""'.format(''.join(tb))) work_item = self.pending_work_items.pop(obj.work_id, None) - # work_item can be None if another process terminated. In this case, - # the queue_manager_thread fails all work_items with BrokenProcessPool + with self.shutdown_lock: + self.thread_wakeup.wakeup() + # work_item can be None if another process terminated. In this + # case, the executor_manager_thread fails all work_items + # with BrokenProcessPool if work_item is not None: work_item.future.set_exception(e) else: @@ -186,6 +189,7 @@ def _get_chunks(*iterables, chunksize): return yield chunk + def _process_chunk(fn, chunk): """ Processes a chunk of an iterable passed to map. @@ -249,120 +253,132 @@ def _process_worker(call_queue, result_queue, initializer, initargs): del call_item -def _add_call_item_to_queue(pending_work_items, - work_ids, - call_queue): - """Fills call_queue with _WorkItems from pending_work_items. +class _ExecutorManagerThread(threading.Thread): + """Manages the communication between this process and the worker processes. - This function never blocks. + The manager is run in a local thread. Args: - pending_work_items: A dict mapping work ids to _WorkItems e.g. - {5: <_WorkItem...>, 6: <_WorkItem...>, ...} - work_ids: A queue.Queue of work ids e.g. Queue([5, 6, ...]). Work ids - are consumed and the corresponding _WorkItems from - pending_work_items are transformed into _CallItems and put in - call_queue. - call_queue: A multiprocessing.Queue that will be filled with _CallItems - derived from _WorkItems. + executor: A reference to the ProcessPoolExecutor that owns + this thread. A weakref will be own by the manager as well as + references to internal objects used to introspect the state of + the executor. """ - while True: - if call_queue.full(): - return - try: - work_id = work_ids.get(block=False) - except queue.Empty: - return - else: - work_item = pending_work_items[work_id] - - if work_item.future.set_running_or_notify_cancel(): - call_queue.put(_CallItem(work_id, - work_item.fn, - work_item.args, - work_item.kwargs), - block=True) - else: - del pending_work_items[work_id] - continue + def __init__(self, executor): + # Store references to necessary internals of the executor. + + # A _ThreadWakeup to allow waking up the queue_manager_thread from the + # main Thread and avoid deadlocks caused by permanently locked queues. + self.thread_wakeup = executor._executor_manager_thread_wakeup + self.shutdown_lock = executor._shutdown_lock + + # A weakref.ref to the ProcessPoolExecutor that owns this thread. Used + # to determine if the ProcessPoolExecutor has been garbage collected + # and that the manager can exit. + # When the executor gets garbage collected, the weakref callback + # will wake up the queue management thread so that it can terminate + # if there is no pending work item. + def weakref_cb(_, + thread_wakeup=self.thread_wakeup, + shutdown_lock=self.shutdown_lock): + mp.util.debug('Executor collected: triggering callback for' + ' QueueManager wakeup') + with shutdown_lock: + thread_wakeup.wakeup() -def _queue_management_worker(executor_reference, - processes, - pending_work_items, - work_ids_queue, - call_queue, - result_queue, - thread_wakeup): - """Manages the communication between this process and the worker processes. + self.executor_reference = weakref.ref(executor, weakref_cb) - This function is run in a local thread. + # A list of the ctx.Process instances used as workers. + self.processes = executor._processes - Args: - executor_reference: A weakref.ref to the ProcessPoolExecutor that owns - this thread. Used to determine if the ProcessPoolExecutor has been - garbage collected and that this function can exit. - process: A list of the ctx.Process instances used as - workers. - pending_work_items: A dict mapping work ids to _WorkItems e.g. - {5: <_WorkItem...>, 6: <_WorkItem...>, ...} - work_ids_queue: A queue.Queue of work ids e.g. Queue([5, 6, ...]). - call_queue: A ctx.Queue that will be filled with _CallItems - derived from _WorkItems for processing by the process workers. - result_queue: A ctx.SimpleQueue of _ResultItems generated by the - process workers. - thread_wakeup: A _ThreadWakeup to allow waking up the - queue_manager_thread from the main Thread and avoid deadlocks - caused by permanently locked queues. - """ - executor = None + # A ctx.Queue that will be filled with _CallItems derived from + # _WorkItems for processing by the process workers. + self.call_queue = executor._call_queue - def shutting_down(): - return (_global_shutdown or executor is None - or executor._shutdown_thread) + # A ctx.SimpleQueue of _ResultItems generated by the process workers. + self.result_queue = executor._result_queue - def shutdown_worker(): - # This is an upper bound on the number of children alive. - n_children_alive = sum(p.is_alive() for p in processes.values()) - n_children_to_stop = n_children_alive - n_sentinels_sent = 0 - # Send the right number of sentinels, to make sure all children are - # properly terminated. - while n_sentinels_sent < n_children_to_stop and n_children_alive > 0: - for i in range(n_children_to_stop - n_sentinels_sent): - try: - call_queue.put_nowait(None) - n_sentinels_sent += 1 - except Full: - break - n_children_alive = sum(p.is_alive() for p in processes.values()) + # A queue.Queue of work ids e.g. Queue([5, 6, ...]). + self.work_ids_queue = executor._work_ids - # Release the queue's resources as soon as possible. - call_queue.close() - # If .join() is not called on the created processes then - # some ctx.Queue methods may deadlock on Mac OS X. - for p in processes.values(): - p.join() + # A dict mapping work ids to _WorkItems e.g. + # {5: <_WorkItem...>, 6: <_WorkItem...>, ...} + self.pending_work_items = executor._pending_work_items - result_reader = result_queue._reader - wakeup_reader = thread_wakeup._reader - readers = [result_reader, wakeup_reader] + super().__init__() - while True: - _add_call_item_to_queue(pending_work_items, - work_ids_queue, - call_queue) + def run(self): + # Main loop for the executor manager thread. + + while True: + self.add_call_item_to_queue() + + result_item, is_broken, cause = self.wait_result_broken_or_wakeup() + if is_broken: + self.terminate_broken(cause) + return + if result_item is not None: + self.process_result_item(result_item) + # Delete reference to result_item to avoid keeping references + # while waiting on new results. + del result_item + + # attempt to increment idle process count + executor = self.executor_reference() + if executor is not None: + executor._idle_worker_semaphore.release() + del executor + + if self.is_shutting_down(): + self.flag_executor_shutting_down() + + # Since no new work items can be added, it is safe to shutdown + # this thread if there are no pending work items. + if not self.pending_work_items: + self.join_executor_internals() + return + + def add_call_item_to_queue(self): + # Fills call_queue with _WorkItems from pending_work_items. + # This function never blocks. + while True: + if self.call_queue.full(): + return + try: + work_id = self.work_ids_queue.get(block=False) + except queue.Empty: + return + else: + work_item = self.pending_work_items[work_id] + + if work_item.future.set_running_or_notify_cancel(): + self.call_queue.put(_CallItem(work_id, + work_item.fn, + work_item.args, + work_item.kwargs), + block=True) + else: + del self.pending_work_items[work_id] + continue + + def wait_result_broken_or_wakeup(self): # Wait for a result to be ready in the result_queue while checking # that all worker processes are still running, or for a wake up # signal send. The wake up signals come either from new tasks being # submitted, from the executor being shutdown/gc-ed, or from the # shutdown of the python interpreter. - worker_sentinels = [p.sentinel for p in processes.values()] + result_reader = self.result_queue._reader + assert not self.thread_wakeup._closed + wakeup_reader = self.thread_wakeup._reader + readers = [result_reader, wakeup_reader] + worker_sentinels = [p.sentinel for p in self.processes.values()] ready = mp.connection.wait(readers + worker_sentinels) cause = None is_broken = True + result_item = None if result_reader in ready: try: result_item = result_reader.recv() @@ -372,79 +388,138 @@ def shutdown_worker(): elif wakeup_reader in ready: is_broken = False - result_item = None - thread_wakeup.clear() - if is_broken: - # Mark the process pool broken so that submits fail right now. - executor = executor_reference() - if executor is not None: - executor._broken = ('A child process terminated ' - 'abruptly, the process pool is not ' - 'usable anymore') - executor._shutdown_thread = True - executor = None - bpe = BrokenProcessPool("A process in the process pool was " - "terminated abruptly while the future was " - "running or pending.") - if cause is not None: - bpe.__cause__ = _RemoteTraceback( - f"\n'''\n{''.join(cause)}'''") - # All futures in flight must be marked failed - for work_id, work_item in pending_work_items.items(): - work_item.future.set_exception(bpe) - # Delete references to object. See issue16284 - del work_item - pending_work_items.clear() - # Terminate remaining workers forcibly: the queues or their - # locks may be in a dirty state and block forever. - for p in processes.values(): - p.terminate() - shutdown_worker() - return + + with self.shutdown_lock: + self.thread_wakeup.clear() + + return result_item, is_broken, cause + + def process_result_item(self, result_item): + # Process the received a result_item. This can be either the PID of a + # worker that exited gracefully or a _ResultItem + if isinstance(result_item, int): # Clean shutdown of a worker using its PID # (avoids marking the executor broken) - assert shutting_down() - p = processes.pop(result_item) + assert self.is_shutting_down() + p = self.processes.pop(result_item) p.join() - if not processes: - shutdown_worker() + if not self.processes: + self.join_executor_internals() return - elif result_item is not None: - work_item = pending_work_items.pop(result_item.work_id, None) + else: + # Received a _ResultItem so mark the future as completed. + work_item = self.pending_work_items.pop(result_item.work_id, None) # work_item can be None if another process terminated (see above) if work_item is not None: if result_item.exception: work_item.future.set_exception(result_item.exception) else: work_item.future.set_result(result_item.result) - # Delete references to object. See issue16284 - del work_item - # Delete reference to result_item - del result_item - # Check whether we should start shutting down. - executor = executor_reference() + def is_shutting_down(self): + # Check whether we should start shutting down the executor. + executor = self.executor_reference() # No more work items can be added if: # - The interpreter is shutting down OR # - The executor that owns this worker has been collected OR # - The executor that owns this worker has been shutdown. - if shutting_down(): - try: - # Flag the executor as shutting down as early as possible if it - # is not gc-ed yet. - if executor is not None: - executor._shutdown_thread = True - # Since no new work items can be added, it is safe to shutdown - # this thread if there are no pending work items. - if not pending_work_items: - shutdown_worker() - return - except Full: - # This is not a problem: we will eventually be woken up (in - # result_queue.get()) and be able to send a sentinel again. - pass - executor = None + return (_global_shutdown or executor is None + or executor._shutdown_thread) + + def terminate_broken(self, cause): + # Terminate the executor because it is in a broken state. The cause + # argument can be used to display more information on the error that + # lead the executor into becoming broken. + + # Mark the process pool broken so that submits fail right now. + executor = self.executor_reference() + if executor is not None: + executor._broken = ('A child process terminated ' + 'abruptly, the process pool is not ' + 'usable anymore') + executor._shutdown_thread = True + executor = None + + # All pending tasks are to be marked failed with the following + # BrokenProcessPool error + bpe = BrokenProcessPool("A process in the process pool was " + "terminated abruptly while the future was " + "running or pending.") + if cause is not None: + bpe.__cause__ = _RemoteTraceback( + f"\n'''\n{''.join(cause)}'''") + + # Mark pending tasks as failed. + for work_id, work_item in self.pending_work_items.items(): + work_item.future.set_exception(bpe) + # Delete references to object. See issue16284 + del work_item + self.pending_work_items.clear() + + # Terminate remaining workers forcibly: the queues or their + # locks may be in a dirty state and block forever. + for p in self.processes.values(): + p.terminate() + + # clean up resources + self.join_executor_internals() + + def flag_executor_shutting_down(self): + # Flag the executor as shutting down and cancel remaining tasks if + # requested as early as possible if it is not gc-ed yet. + executor = self.executor_reference() + if executor is not None: + executor._shutdown_thread = True + # Cancel pending work items if requested. + if executor._cancel_pending_futures: + # Cancel all pending futures and update pending_work_items + # to only have futures that are currently running. + new_pending_work_items = {} + for work_id, work_item in self.pending_work_items.items(): + if not work_item.future.cancel(): + new_pending_work_items[work_id] = work_item + self.pending_work_items = new_pending_work_items + # Drain work_ids_queue since we no longer need to + # add items to the call queue. + while True: + try: + self.work_ids_queue.get_nowait() + except queue.Empty: + break + # Make sure we do this only once to not waste time looping + # on running processes over and over. + executor._cancel_pending_futures = False + + def shutdown_workers(self): + n_children_to_stop = self.get_n_children_alive() + n_sentinels_sent = 0 + # Send the right number of sentinels, to make sure all children are + # properly terminated. + while (n_sentinels_sent < n_children_to_stop + and self.get_n_children_alive() > 0): + for i in range(n_children_to_stop - n_sentinels_sent): + try: + self.call_queue.put_nowait(None) + n_sentinels_sent += 1 + except queue.Full: + break + + def join_executor_internals(self): + self.shutdown_workers() + # Release the queue's resources as soon as possible. + self.call_queue.close() + self.call_queue.join_thread() + with self.shutdown_lock: + self.thread_wakeup.close() + # If .join() is not called on the created processes then + # some ctx.Queue methods may deadlock on Mac OS X. + for p in self.processes.values(): + p.join() + + def get_n_children_alive(self): + # This is an upper bound on the number of children alive. + return sum(p.is_alive() for p in self.processes.values()) _system_limits_checked = False @@ -535,7 +610,7 @@ def __init__(self, max_workers=None, mp_context=None, self._initargs = initargs # Management thread - self._queue_management_thread = None + self._executor_manager_thread = None # Map of pids to processes self._processes = {} @@ -543,9 +618,21 @@ def __init__(self, max_workers=None, mp_context=None, # Shutdown is a two-step process. self._shutdown_thread = False self._shutdown_lock = threading.Lock() + self._idle_worker_semaphore = threading.Semaphore(0) self._broken = False self._queue_count = 0 self._pending_work_items = {} + self._cancel_pending_futures = False + + # _ThreadWakeup is a communication channel used to interrupt the wait + # of the main loop of executor_manager_thread from another thread (e.g. + # when calling executor.submit or executor.shutdown). We do not use the + # _result_queue to send wakeup signals to the executor_manager_thread + # as it could result in a deadlock if a worker process dies with the + # _result_queue write lock still acquired. + # + # _shutdown_lock must be locked to access _ThreadWakeup. + self._executor_manager_thread_wakeup = _ThreadWakeup() # Create communication channels for the executor # Make the call queue slightly larger than the number of processes to @@ -554,7 +641,9 @@ def __init__(self, max_workers=None, mp_context=None, queue_size = self._max_workers + EXTRA_QUEUED_CALLS self._call_queue = _SafeQueue( max_size=queue_size, ctx=self._mp_context, - pending_work_items=self._pending_work_items) + pending_work_items=self._pending_work_items, + shutdown_lock=self._shutdown_lock, + thread_wakeup=self._executor_manager_thread_wakeup) # Killed worker processes can produce spurious "broken pipe" # tracebacks in the queue's own worker thread. But we detect killed # processes anyway, so silence the tracebacks. @@ -562,43 +651,21 @@ def __init__(self, max_workers=None, mp_context=None, self._result_queue = mp_context.SimpleQueue() self._work_ids = queue.Queue() - # _ThreadWakeup is a communication channel used to interrupt the wait - # of the main loop of queue_manager_thread from another thread (e.g. - # when calling executor.submit or executor.shutdown). We do not use the - # _result_queue to send the wakeup signal to the queue_manager_thread - # as it could result in a deadlock if a worker process dies with the - # _result_queue write lock still acquired. - self._queue_management_thread_wakeup = _ThreadWakeup() - - def _start_queue_management_thread(self): - if self._queue_management_thread is None: - # When the executor gets garbarge collected, the weakref callback - # will wake up the queue management thread so that it can terminate - # if there is no pending work item. - def weakref_cb(_, - thread_wakeup=self._queue_management_thread_wakeup): - mp.util.debug('Executor collected: triggering callback for' - ' QueueManager wakeup') - thread_wakeup.wakeup() + def _start_executor_manager_thread(self): + if self._executor_manager_thread is None: # Start the processes so that their sentinels are known. - self._adjust_process_count() - self._queue_management_thread = threading.Thread( - target=_queue_management_worker, - args=(weakref.ref(self, weakref_cb), - self._processes, - self._pending_work_items, - self._work_ids, - self._call_queue, - self._result_queue, - self._queue_management_thread_wakeup), - name="QueueManagerThread") - self._queue_management_thread.daemon = True - self._queue_management_thread.start() - _threads_wakeups[self._queue_management_thread] = \ - self._queue_management_thread_wakeup + self._executor_manager_thread = _ExecutorManagerThread(self) + self._executor_manager_thread.start() + _threads_wakeups[self._executor_manager_thread] = \ + self._executor_manager_thread_wakeup def _adjust_process_count(self): - for _ in range(len(self._processes), self._max_workers): + # if there's an idle process, we don't need to spawn a new one. + if self._idle_worker_semaphore.acquire(blocking=False): + return + + process_count = len(self._processes) + if process_count < self._max_workers: p = self._mp_context.Process( target=_process_worker, args=(self._call_queue, @@ -608,22 +675,7 @@ def _adjust_process_count(self): p.start() self._processes[p.pid] = p - def submit(*args, **kwargs): - if len(args) >= 2: - self, fn, *args = args - elif not args: - raise TypeError("descriptor 'submit' of 'ProcessPoolExecutor' object " - "needs an argument") - elif 'fn' in kwargs: - fn = kwargs.pop('fn') - self, *args = args - import warnings - warnings.warn("Passing 'fn' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('submit expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - + def submit(self, fn, /, *args, **kwargs): with self._shutdown_lock: if self._broken: raise BrokenProcessPool(self._broken) @@ -640,11 +692,11 @@ def submit(*args, **kwargs): self._work_ids.put(self._queue_count) self._queue_count += 1 # Wake up queue management thread - self._queue_management_thread_wakeup.wakeup() + self._executor_manager_thread_wakeup.wakeup() - self._start_queue_management_thread() + self._adjust_process_count() + self._start_executor_manager_thread() return f - submit.__text_signature__ = _base.Executor.submit.__text_signature__ submit.__doc__ = _base.Executor.submit.__doc__ def map(self, fn, *iterables, timeout=None, chunksize=1): @@ -676,29 +728,24 @@ def map(self, fn, *iterables, timeout=None, chunksize=1): timeout=timeout) return _chain_from_iterable_of_lists(results) - def shutdown(self, wait=True): + def shutdown(self, wait=True, *, cancel_futures=False): with self._shutdown_lock: + self._cancel_pending_futures = cancel_futures self._shutdown_thread = True - if self._queue_management_thread: - # Wake up queue management thread - self._queue_management_thread_wakeup.wakeup() - if wait: - self._queue_management_thread.join() + if self._executor_manager_thread_wakeup is not None: + # Wake up queue management thread + self._executor_manager_thread_wakeup.wakeup() + + if self._executor_manager_thread is not None and wait: + self._executor_manager_thread.join() # To reduce the risk of opening too many files, remove references to # objects that use file descriptors. - self._queue_management_thread = None - if self._call_queue is not None: - self._call_queue.close() - if wait: - self._call_queue.join_thread() - self._call_queue = None + self._executor_manager_thread = None + self._call_queue = None + if self._result_queue is not None and wait: + self._result_queue.close() self._result_queue = None self._processes = None - - if self._queue_management_thread_wakeup: - self._queue_management_thread_wakeup.close() - self._queue_management_thread_wakeup = None + self._executor_manager_thread_wakeup = None shutdown.__doc__ = _base.Executor.shutdown.__doc__ - -atexit.register(_python_exit) diff --git a/Lib/concurrent/futures/thread.py b/Lib/concurrent/futures/thread.py index 9e669b21962a4a8e214168de6e9790ac0368ac07..b7a2cac7f57015b6dd2915da1652a61f04a4aeb5 100644 --- a/Lib/concurrent/futures/thread.py +++ b/Lib/concurrent/futures/thread.py @@ -5,41 +5,36 @@ __author__ = 'Brian Quinlan (brian@sweetapp.com)' -import atexit from concurrent.futures import _base import itertools import queue import threading +import types import weakref import os -# Workers are created as daemon threads. This is done to allow the interpreter -# to exit when there are still idle threads in a ThreadPoolExecutor's thread -# pool (i.e. shutdown() was not called). However, allowing workers to die with -# the interpreter has two undesirable properties: -# - The workers would still be running during interpreter shutdown, -# meaning that they would fail in unpredictable ways. -# - The workers could be killed while evaluating a work item, which could -# be bad if the callable being evaluated has external side-effects e.g. -# writing to a file. -# -# To work around this problem, an exit handler is installed which tells the -# workers to exit when their work queues are empty and then waits until the -# threads finish. _threads_queues = weakref.WeakKeyDictionary() _shutdown = False +# Lock that ensures that new workers are not created while the interpreter is +# shutting down. Must be held while mutating _threads_queues and _shutdown. +_global_shutdown_lock = threading.Lock() def _python_exit(): global _shutdown - _shutdown = True + with _global_shutdown_lock: + _shutdown = True items = list(_threads_queues.items()) for t, q in items: q.put(None) for t, q in items: t.join() -atexit.register(_python_exit) +# Register for `_python_exit()` to be called just before joining all +# non-daemon threads. This is used instead of `atexit.register()` for +# compatibility with subinterpreters, which no longer support daemon threads. +# See bpo-39812 for context. +threading._register_atexit(_python_exit) class _WorkItem(object): @@ -62,6 +57,8 @@ def run(self): else: self.future.set_result(result) + __class_getitem__ = classmethod(types.GenericAlias) + def _worker(executor_reference, work_queue, initializer, initargs): if initializer is not None: @@ -155,23 +152,8 @@ def __init__(self, max_workers=None, thread_name_prefix='', self._initializer = initializer self._initargs = initargs - def submit(*args, **kwargs): - if len(args) >= 2: - self, fn, *args = args - elif not args: - raise TypeError("descriptor 'submit' of 'ThreadPoolExecutor' object " - "needs an argument") - elif 'fn' in kwargs: - fn = kwargs.pop('fn') - self, *args = args - import warnings - warnings.warn("Passing 'fn' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('submit expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - - with self._shutdown_lock: + def submit(self, fn, /, *args, **kwargs): + with self._shutdown_lock, _global_shutdown_lock: if self._broken: raise BrokenThreadPool(self._broken) @@ -187,7 +169,6 @@ def submit(*args, **kwargs): self._work_queue.put(w) self._adjust_thread_count() return f - submit.__text_signature__ = _base.Executor.submit.__text_signature__ submit.__doc__ = _base.Executor.submit.__doc__ def _adjust_thread_count(self): @@ -209,7 +190,6 @@ def weakref_cb(_, q=self._work_queue): self._work_queue, self._initializer, self._initargs)) - t.daemon = True t.start() self._threads.add(t) _threads_queues[t] = self._work_queue @@ -227,9 +207,22 @@ def _initializer_failed(self): if work_item is not None: work_item.future.set_exception(BrokenThreadPool(self._broken)) - def shutdown(self, wait=True): + def shutdown(self, wait=True, *, cancel_futures=False): with self._shutdown_lock: self._shutdown = True + if cancel_futures: + # Drain all work items from the queue, and then cancel their + # associated futures. + while True: + try: + work_item = self._work_queue.get_nowait() + except queue.Empty: + break + if work_item is not None: + work_item.future.cancel() + + # Send a wake-up to prevent threads calling + # _work_queue.get(block=True) from permanently blocking. self._work_queue.put(None) if wait: for t in self._threads: diff --git a/Lib/contextlib.py b/Lib/contextlib.py index 94dc2bfed06cd8a7d5596f684f2d5d95613af670..ff92d9f913f4c21723e26d33d6654a8f272a4f17 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -4,7 +4,7 @@ import _collections_abc from collections import deque from functools import wraps -from types import MethodType +from types import MethodType, GenericAlias __all__ = ["asynccontextmanager", "contextmanager", "closing", "nullcontext", "AbstractContextManager", "AbstractAsyncContextManager", @@ -16,6 +16,8 @@ class AbstractContextManager(abc.ABC): """An abstract base class for context managers.""" + __class_getitem__ = classmethod(GenericAlias) + def __enter__(self): """Return `self` upon entering the runtime context.""" return self @@ -36,6 +38,8 @@ class AbstractAsyncContextManager(abc.ABC): """An abstract base class for asynchronous context managers.""" + __class_getitem__ = classmethod(GenericAlias) + async def __aenter__(self): """Return `self` upon entering the runtime context.""" return self @@ -426,26 +430,11 @@ def enter_context(self, cm): self._push_cm_exit(cm, _exit) return result - def callback(*args, **kwds): + def callback(self, callback, /, *args, **kwds): """Registers an arbitrary callback and arguments. Cannot suppress exceptions. """ - if len(args) >= 2: - self, callback, *args = args - elif not args: - raise TypeError("descriptor 'callback' of '_BaseExitStack' object " - "needs an argument") - elif 'callback' in kwds: - callback = kwds.pop('callback') - self, *args = args - import warnings - warnings.warn("Passing 'callback' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('callback expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - _exit_wrapper = self._create_cb_wrapper(callback, *args, **kwds) # We changed the signature, so using @wraps is not appropriate, but @@ -453,7 +442,6 @@ def callback(*args, **kwds): _exit_wrapper.__wrapped__ = callback self._push_exit_callback(_exit_wrapper) return callback # Allow use as a decorator - callback.__text_signature__ = '($self, callback, /, *args, **kwds)' def _push_cm_exit(self, cm, cm_exit): """Helper to correctly register callbacks to __exit__ methods.""" @@ -587,26 +575,11 @@ def push_async_exit(self, exit): self._push_async_cm_exit(exit, exit_method) return exit # Allow use as a decorator - def push_async_callback(*args, **kwds): + def push_async_callback(self, callback, /, *args, **kwds): """Registers an arbitrary coroutine function and arguments. Cannot suppress exceptions. """ - if len(args) >= 2: - self, callback, *args = args - elif not args: - raise TypeError("descriptor 'push_async_callback' of " - "'AsyncExitStack' object needs an argument") - elif 'callback' in kwds: - callback = kwds.pop('callback') - self, *args = args - import warnings - warnings.warn("Passing 'callback' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('push_async_callback expected at least 1 ' - 'positional argument, got %d' % (len(args)-1)) - _exit_wrapper = self._create_async_cb_wrapper(callback, *args, **kwds) # We changed the signature, so using @wraps is not appropriate, but @@ -614,7 +587,6 @@ def push_async_callback(*args, **kwds): _exit_wrapper.__wrapped__ = callback self._push_exit_callback(_exit_wrapper, False) return callback # Allow use as a decorator - push_async_callback.__text_signature__ = '($self, callback, /, *args, **kwds)' async def aclose(self): """Immediately unwind the context stack.""" diff --git a/Lib/copyreg.py b/Lib/copyreg.py index dfc463c49a389d59789c982846c3697c456646f1..7ab8c128eb0445bc5a617811d78db4f6800cbc7f 100644 --- a/Lib/copyreg.py +++ b/Lib/copyreg.py @@ -48,6 +48,7 @@ def _reconstructor(cls, base, state): return obj _HEAPTYPE = 1<<9 +_new_type = type(int.__new__) # Python code for object.__reduce_ex__ for protocols 0 and 1 @@ -57,6 +58,9 @@ def _reduce_ex(self, proto): for base in cls.__mro__: if hasattr(base, '__flags__') and not base.__flags__ & _HEAPTYPE: break + new = base.__new__ + if isinstance(new, _new_type) and new.__self__ is base: + break else: base = object # not really reachable if base is object: diff --git a/Lib/crypt.py b/Lib/crypt.py index 8846602d7613ec76c365021ab500252a3f0546e9..33dbc46bb3e96bed9f32f7919c81cfda069b65ce 100644 --- a/Lib/crypt.py +++ b/Lib/crypt.py @@ -10,6 +10,7 @@ else: raise ImportError("The required _crypt module was not built as part of CPython") +import errno import string as _string from random import SystemRandom as _SystemRandom from collections import namedtuple as _namedtuple @@ -88,7 +89,14 @@ def _add_method(name, *args, rounds=None): method = _Method(name, *args) globals()['METHOD_' + name] = method salt = mksalt(method, rounds=rounds) - result = crypt('', salt) + result = None + try: + result = crypt('', salt) + except OSError as e: + # Not all libc libraries support all encryption methods. + if e.errno == errno.EINVAL: + return False + raise if result and len(result) == method.total_size: methods.append(method) return True diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py index 8f0991147d72f20488fd28afbbe12085e574da71..4afa4ebd4224934904e3817d91dcbb45722a7c5a 100644 --- a/Lib/ctypes/__init__.py +++ b/Lib/ctypes/__init__.py @@ -1,6 +1,7 @@ """create and manipulate C data types in Python""" import os as _os, sys as _sys +import types as _types __version__ = "1.1.0" @@ -450,6 +451,8 @@ def __getitem__(self, name): def LoadLibrary(self, name): return self._dlltype(name) + __class_getitem__ = classmethod(_types.GenericAlias) + cdll = LibraryLoader(CDLL) pydll = LibraryLoader(PyDLL) diff --git a/Lib/ctypes/macholib/dyld.py b/Lib/ctypes/macholib/dyld.py index 9d86b058765a3eb8a918a48db314f9558d8f1b2b..1c3f8fd38b0665f47857eca6f549cdb202bf5080 100644 --- a/Lib/ctypes/macholib/dyld.py +++ b/Lib/ctypes/macholib/dyld.py @@ -6,6 +6,11 @@ from ctypes.macholib.framework import framework_info from ctypes.macholib.dylib import dylib_info from itertools import * +try: + from _ctypes import _dyld_shared_cache_contains_path +except ImportError: + def _dyld_shared_cache_contains_path(*args): + raise NotImplementedError __all__ = [ 'dyld_find', 'framework_find', @@ -122,8 +127,15 @@ def dyld_find(name, executable_path=None, env=None): dyld_executable_path_search(name, executable_path), dyld_default_search(name, env), ), env): + if os.path.isfile(path): return path + try: + if _dyld_shared_cache_contains_path(path): + return path + except NotImplementedError: + pass + raise ValueError("dylib %s could not be found" % (name,)) def framework_find(fn, executable_path=None, env=None): diff --git a/Lib/ctypes/test/test_find.py b/Lib/ctypes/test/test_find.py index b99fdcba7b28fc2b248c17d4aef8e449a3e21f3d..92ac1840ad7d435e72d47c89e6e175a48e321630 100644 --- a/Lib/ctypes/test/test_find.py +++ b/Lib/ctypes/test/test_find.py @@ -1,4 +1,5 @@ import unittest +import unittest.mock import os.path import sys import test.support @@ -72,7 +73,7 @@ def test_shell_injection(self): @unittest.skipUnless(sys.platform.startswith('linux'), 'Test only valid for Linux') -class LibPathFindTest(unittest.TestCase): +class FindLibraryLinux(unittest.TestCase): def test_find_on_libpath(self): import subprocess import tempfile @@ -111,6 +112,15 @@ def test_find_on_libpath(self): # LD_LIBRARY_PATH) self.assertEqual(find_library(libname), 'lib%s.so' % libname) + def test_find_library_with_gcc(self): + with unittest.mock.patch("ctypes.util._findSoname_ldconfig", lambda *args: None): + self.assertNotEqual(find_library('c'), None) + + def test_find_library_with_ld(self): + with unittest.mock.patch("ctypes.util._findSoname_ldconfig", lambda *args: None), \ + unittest.mock.patch("ctypes.util._findLib_gcc", lambda *args: None): + self.assertNotEqual(find_library('c'), None) + if __name__ == "__main__": unittest.main() diff --git a/Lib/ctypes/test/test_loading.py b/Lib/ctypes/test/test_loading.py index 5c48b0db4c393956c9caf5f96e1c624c53d03895..ba655bceb8b215f79686a10e5efcbeaac7096254 100644 --- a/Lib/ctypes/test/test_loading.py +++ b/Lib/ctypes/test/test_loading.py @@ -3,7 +3,6 @@ import shutil import subprocess import sys -import sysconfig import unittest import test.support from ctypes.util import find_library diff --git a/Lib/ctypes/test/test_macholib.py b/Lib/ctypes/test/test_macholib.py index 6b3526951acfabd3c4aff7face454fa34ee91f77..a1bac26a7df0587f21817acd5caa9a2b17ea0ba9 100644 --- a/Lib/ctypes/test/test_macholib.py +++ b/Lib/ctypes/test/test_macholib.py @@ -45,19 +45,22 @@ def find_lib(name): class MachOTest(unittest.TestCase): @unittest.skipUnless(sys.platform == "darwin", 'OSX-specific test') def test_find(self): - - self.assertEqual(find_lib('pthread'), - '/usr/lib/libSystem.B.dylib') + # On Mac OS 11, system dylibs are only present in the shared cache, + # so symlinks like libpthread.dylib -> libSystem.B.dylib will not + # be resolved by dyld_find + self.assertIn(find_lib('pthread'), + ('/usr/lib/libSystem.B.dylib', '/usr/lib/libpthread.dylib')) result = find_lib('z') # Issue #21093: dyld default search path includes $HOME/lib and # /usr/local/lib before /usr/lib, which caused test failures if # a local copy of libz exists in one of them. Now ignore the head # of the path. - self.assertRegex(result, r".*/lib/libz\..*.*\.dylib") + self.assertRegex(result, r".*/lib/libz.*\.dylib") - self.assertEqual(find_lib('IOKit'), - '/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit') + self.assertIn(find_lib('IOKit'), + ('/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit', + '/System/Library/Frameworks/IOKit.framework/IOKit')) if __name__ == "__main__": unittest.main() diff --git a/Lib/ctypes/test/test_parameters.py b/Lib/ctypes/test/test_parameters.py index 531894fdec838228dd2c263f8466895b93c8d98c..38af7ac13d756c225af7fbc514668476f66d0184 100644 --- a/Lib/ctypes/test/test_parameters.py +++ b/Lib/ctypes/test/test_parameters.py @@ -240,8 +240,8 @@ def test_parameter_repr(self): self.assertEqual(repr(c_double.from_param(1.5)), "") self.assertEqual(repr(c_double.from_param(1e300)), "") self.assertRegex(repr(c_longdouble.from_param(1.5)), r"^$") - self.assertRegex(repr(c_char_p.from_param(b'hihi')), "^$") - self.assertRegex(repr(c_wchar_p.from_param('hihi')), "^$") + self.assertRegex(repr(c_char_p.from_param(b'hihi')), r"^$") + self.assertRegex(repr(c_wchar_p.from_param('hihi')), r"^$") self.assertRegex(repr(c_void_p.from_param(0x12)), r"^$") ################################################################ diff --git a/Lib/ctypes/test/test_stringptr.py b/Lib/ctypes/test/test_stringptr.py index 95cd1614c6760eb0f1f816b7f9942ca8f08cf6d3..c20951f4ce0016930de71c56b71b5621e4d1d227 100644 --- a/Lib/ctypes/test/test_stringptr.py +++ b/Lib/ctypes/test/test_stringptr.py @@ -70,8 +70,8 @@ def test_functions(self): x = r[0], r[1], r[2], r[3], r[4] self.assertEqual(x, (b"c", b"d", b"e", b"f", b"\000")) del buf - # x1 will NOT be the same as x, usually: - x1 = r[0], r[1], r[2], r[3], r[4] + # Because r is a pointer to memory that is freed after deleting buf, + # the pointer is hanging and using it would reference freed memory. if __name__ == '__main__': unittest.main() diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py index cdbaa7fbd65baf3eeb6ab327cfadb57ccb2fe11a..245cd94c5cdd9e9658dc5e216f83b6b7c44ab654 100644 --- a/Lib/ctypes/test/test_structures.py +++ b/Lib/ctypes/test/test_structures.py @@ -7,6 +7,11 @@ import _ctypes_test from test import support +# The following definition is meant to be used from time to time to assist +# temporarily disabling tests on specific architectures while investigations +# are in progress, to keep buildbots happy. +MACHINE = platform.machine() + class SubclassesTest(unittest.TestCase): def test_subclass(self): class X(Structure): diff --git a/Lib/ctypes/test/test_wintypes.py b/Lib/ctypes/test/test_wintypes.py index 71442df8301affdbd65da31c8579f7694e34f924..243d5962ffa7f1c6b7e0971d42a7b0ec98de99a0 100644 --- a/Lib/ctypes/test/test_wintypes.py +++ b/Lib/ctypes/test/test_wintypes.py @@ -1,12 +1,13 @@ -import sys import unittest +# also work on POSIX + from ctypes import * +from ctypes import wintypes + -@unittest.skipUnless(sys.platform.startswith('win'), 'Windows-only test') class WinTypesTest(unittest.TestCase): def test_variant_bool(self): - from ctypes import wintypes # reads 16-bits from memory, anything non-zero is True for true_value in (1, 32767, 32768, 65535, 65537): true = POINTER(c_int16)(c_int16(true_value)) @@ -37,5 +38,6 @@ def test_variant_bool(self): vb.value = [] self.assertIs(vb.value, False) + if __name__ == "__main__": unittest.main() diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py index 97973bce001d9a539bb5e3d2afda194cdc4f2184..0c2510e1619c8ed33f49aeacfbc72b118ad9d27a 100644 --- a/Lib/ctypes/util.py +++ b/Lib/ctypes/util.py @@ -93,6 +93,12 @@ def find_library(name): # Andreas Degert's find functions, using gcc, /sbin/ldconfig, objdump import re, tempfile + def _is_elf(filename): + "Return True if the given file is an ELF file" + elf_header = b'\x7fELF' + with open(filename, 'br') as thefile: + return thefile.read(4) == elf_header + def _findLib_gcc(name): # Run GCC's linker with the -t (aka --trace) option and examine the # library name it prints out. The GCC command will fail because we @@ -130,10 +136,17 @@ def _findLib_gcc(name): # Raised if the file was already removed, which is the normal # behaviour of GCC if linking fails pass - res = re.search(expr, trace) + res = re.findall(expr, trace) if not res: return None - return os.fsdecode(res.group(0)) + + for file in res: + # Check if the given file is an elf file: gcc can report + # some files that are linker scripts and not actual + # shared objects. See bpo-41976 for more details + if not _is_elf(file): + continue + return os.fsdecode(file) if sys.platform == "sunos5": @@ -299,17 +312,22 @@ def _findLib_ld(name): stderr=subprocess.PIPE, universal_newlines=True) out, _ = p.communicate() - res = re.search(expr, os.fsdecode(out)) - if res: - result = res.group(0) - except Exception as e: + res = re.findall(expr, os.fsdecode(out)) + for file in res: + # Check if the given file is an elf file: gcc can report + # some files that are linker scripts and not actual + # shared objects. See bpo-41976 for more details + if not _is_elf(file): + continue + return os.fsdecode(file) + except Exception: pass # result will be None return result def find_library(name): # See issue #9998 return _findSoname_ldconfig(name) or \ - _get_soname(_findLib_gcc(name) or _findLib_ld(name)) + _get_soname(_findLib_gcc(name)) or _get_soname(_findLib_ld(name)) ################################################################ # test code diff --git a/Lib/curses/__init__.py b/Lib/curses/__init__.py index 24ff3ca93a8933507230ab1e46b15ae1eb82a16a..69270bfcd2b205b15436c920d57a01ac565d6efb 100644 --- a/Lib/curses/__init__.py +++ b/Lib/curses/__init__.py @@ -60,7 +60,7 @@ def start_color(): # raises an exception, wrapper() will restore the terminal to a sane state so # you can read the resulting traceback. -def wrapper(*args, **kwds): +def wrapper(func, /, *args, **kwds): """Wrapper function that initializes curses and calls another function, restoring normal keyboard/screen behavior on error. The callable object 'func' is then passed the main window 'stdscr' @@ -68,17 +68,6 @@ def wrapper(*args, **kwds): wrapper(). """ - if args: - func, *args = args - elif 'func' in kwds: - func = kwds.pop('func') - import warnings - warnings.warn("Passing 'func' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('wrapper expected at least 1 positional argument, ' - 'got %d' % len(args)) - try: # Initialize curses stdscr = initscr() @@ -110,4 +99,3 @@ def wrapper(*args, **kwds): echo() nocbreak() endwin() -wrapper.__text_signature__ = '(func, /, *args, **kwds)' diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 10bb33e3746a8e5481a6f3b33e5afaeaf840737b..530d3e99574e8ea75f74317b22be637cc83a850a 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -7,6 +7,7 @@ import builtins import functools import _thread +from types import GenericAlias __all__ = ['dataclass', @@ -199,11 +200,7 @@ def __repr__(self): # https://bugs.python.org/issue33453 for details. _MODULE_IDENTIFIER_RE = re.compile(r'^(?:\s*(\w+)\s*\.)?\s*(\w+)') -class _InitVarMeta(type): - def __getitem__(self, params): - return InitVar(params) - -class InitVar(metaclass=_InitVarMeta): +class InitVar: __slots__ = ('type', ) def __init__(self, type): @@ -217,6 +214,9 @@ def __repr__(self): type_name = repr(self.type) return f'dataclasses.InitVar[{type_name}]' + def __class_getitem__(cls, type): + return InitVar(type) + # Instances of Field are only ever created from within this module, # and only from the field() function, although Field instances are @@ -285,6 +285,8 @@ def __set_name__(self, owner, name): # it. func(self.default, owner, name) + __class_getitem__ = classmethod(GenericAlias) + class _DataclassParams: __slots__ = ('init', @@ -1231,7 +1233,7 @@ class C(Base): unsafe_hash=unsafe_hash, frozen=frozen) -def replace(*args, **changes): +def replace(obj, /, **changes): """Return a new object replacing specified fields with new values. This is especially useful for frozen classes. Example usage: @@ -1245,17 +1247,6 @@ class C: c1 = replace(c, x=3) assert c1.x == 3 and c1.y == 2 """ - if len(args) > 1: - raise TypeError(f'replace() takes 1 positional argument but {len(args)} were given') - if args: - obj, = args - elif 'obj' in changes: - obj = changes.pop('obj') - import warnings - warnings.warn("Passing 'obj' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError("replace() missing 1 required positional argument: 'obj'") # We're going to mutate 'changes', but that's okay because it's a # new dict, even if called with 'replace(obj, **my_changes)'. @@ -1291,4 +1282,3 @@ class C: # changes that aren't fields, this will correctly raise a # TypeError. return obj.__class__(**changes) -replace.__text_signature__ = '(obj, /, **kwargs)' diff --git a/Lib/datetime.py b/Lib/datetime.py index 0adf1dd67dfb637cf83e93d49d6343e6955afee5..23d2bf0918145fcaff915a1330582a4be06f6ea9 100644 --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -4,6 +4,10 @@ time zone and DST data sources. """ +__all__ = ("date", "datetime", "time", "timedelta", "timezone", "tzinfo", + "MINYEAR", "MAXYEAR") + + import time as _time import math as _math import sys @@ -1091,7 +1095,7 @@ def isoweekday(self): return self.toordinal() % 7 or 7 def isocalendar(self): - """Return a 3-tuple containing ISO year, week number, and weekday. + """Return a named tuple containing ISO year, week number, and weekday. The first ISO week of the year is the (Mon-Sun) week containing the year's first Thursday; everything else derives @@ -1116,7 +1120,7 @@ def isocalendar(self): if today >= _isoweek1monday(year+1): year += 1 week = 0 - return year, week+1, day+1 + return _IsoCalendarDate(year, week+1, day+1) # Pickle support. @@ -1206,6 +1210,36 @@ def __reduce__(self): else: return (self.__class__, args, state) + +class IsoCalendarDate(tuple): + + def __new__(cls, year, week, weekday, /): + return super().__new__(cls, (year, week, weekday)) + + @property + def year(self): + return self[0] + + @property + def week(self): + return self[1] + + @property + def weekday(self): + return self[2] + + def __reduce__(self): + # This code is intended to pickle the object without making the + # class public. See https://bugs.python.org/msg352381 + return (tuple, (tuple(self),)) + + def __repr__(self): + return (f'{self.__class__.__name__}' + f'(year={self[0]}, week={self[1]}, weekday={self[2]})') + + +_IsoCalendarDate = IsoCalendarDate +del IsoCalendarDate _tzinfo_class = tzinfo class time: @@ -1418,7 +1452,8 @@ def isoformat(self, timespec='auto'): part is omitted if self.microsecond == 0. The optional argument timespec specifies the number of additional - terms of the time to include. + terms of the time to include. Valid options are 'auto', 'hours', + 'minutes', 'seconds', 'milliseconds' and 'microseconds'. """ s = _format_time(self._hour, self._minute, self._second, self._microsecond, timespec) @@ -1544,7 +1579,7 @@ def __setstate(self, string, tzinfo): self._tzinfo = tzinfo def __reduce_ex__(self, protocol): - return (time, self._getstate(protocol)) + return (self.__class__, self._getstate(protocol)) def __reduce__(self): return self.__reduce_ex__(2) @@ -1555,6 +1590,7 @@ def __reduce__(self): time.max = time(23, 59, 59, 999999) time.resolution = timedelta(microseconds=1) + class datetime(date): """datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]]) @@ -1902,7 +1938,8 @@ def isoformat(self, sep='T', timespec='auto'): time, default 'T'. The optional argument timespec specifies the number of additional - terms of the time to include. + terms of the time to include. Valid options are 'auto', 'hours', + 'minutes', 'seconds', 'milliseconds' and 'microseconds'. """ s = ("%04d-%02d-%02d%c" % (self._year, self._month, self._day, sep) + _format_time(self._hour, self._minute, self._second, @@ -2321,7 +2358,7 @@ def _name_from_offset(delta): # This is again a requirement for a sane tzinfo class. # # 4. (x+k).s = x.s -# This follows from #2, and that datimetimetz+timedelta preserves tzinfo. +# This follows from #2, and that datetime.timetz+timedelta preserves tzinfo. # # 5. (x+k).n = x.n + k # Again follows from how arithmetic is defined. @@ -2510,7 +2547,7 @@ def _name_from_offset(delta): _format_time, _format_offset, _is_leap, _isoweek1monday, _math, _ord2ymd, _time, _time_class, _tzinfo_class, _wrap_strftime, _ymd2ord, _divide_and_round, _parse_isoformat_date, _parse_isoformat_time, - _parse_hh_mm_ss_ff) + _parse_hh_mm_ss_ff, _IsoCalendarDate) # XXX Since import * above excludes names that start with _, # docstring does not get overwritten. In the future, it may be # appropriate to maintain a single module level docstring and diff --git a/Lib/difflib.py b/Lib/difflib.py index 5d756436a67e194b47e8867db3ecbac408ab10fa..0dda80d38757399ffd9746bb2fa35a07b8aaf6ad 100644 --- a/Lib/difflib.py +++ b/Lib/difflib.py @@ -32,6 +32,7 @@ from heapq import nlargest as _nlargest from collections import namedtuple as _namedtuple +from types import GenericAlias Match = _namedtuple('Match', 'a b size') @@ -129,7 +130,7 @@ class SequenceMatcher: set_seq2(b) Set the second sequence to be compared. - find_longest_match(alo, ahi, blo, bhi) + find_longest_match(alo=0, ahi=None, blo=0, bhi=None) Find longest matching block in a[alo:ahi] and b[blo:bhi]. get_matching_blocks() @@ -333,9 +334,11 @@ def __chain_b(self): for elt in popular: # ditto; as fast for 1% deletion del b2j[elt] - def find_longest_match(self, alo, ahi, blo, bhi): + def find_longest_match(self, alo=0, ahi=None, blo=0, bhi=None): """Find longest matching block in a[alo:ahi] and b[blo:bhi]. + By default it will find the longest match in the entirety of a and b. + If isjunk is not defined: Return (i,j,k) such that a[i:i+k] is equal to b[j:j+k], where @@ -390,6 +393,10 @@ def find_longest_match(self, alo, ahi, blo, bhi): # the unique 'b's and then matching the first two 'a's. a, b, b2j, isbjunk = self.a, self.b, self.b2j, self.bjunk.__contains__ + if ahi is None: + ahi = len(a) + if bhi is None: + bhi = len(b) besti, bestj, bestsize = alo, blo, 0 # find longest junk-free match # during an iteration of the loop, j2len[j] = length of longest @@ -685,6 +692,9 @@ def real_quick_ratio(self): # shorter sequence return _calculate_ratio(min(la, lb), la + lb) + __class_getitem__ = classmethod(GenericAlias) + + def get_close_matches(word, possibilities, n=3, cutoff=0.6): """Use SequenceMatcher to return list of the best "good enough" matches. diff --git a/Lib/dis.py b/Lib/dis.py index 10e5f7fb08ab21c521e08709b7d46751fa3aa5cc..e289e176c78ffd78ee6e42a6b41acc0298f63933 100644 --- a/Lib/dis.py +++ b/Lib/dis.py @@ -542,7 +542,7 @@ def _test(): import argparse parser = argparse.ArgumentParser() - parser.add_argument('infile', type=argparse.FileType(), nargs='?', default='-') + parser.add_argument('infile', type=argparse.FileType('rb'), nargs='?', default='-') args = parser.parse_args() with args.infile as infile: source = infile.read() diff --git a/Lib/distutils/_msvccompiler.py b/Lib/distutils/_msvccompiler.py index 03a5986d984dc36d2f15cbb399c29de1dd954032..af8099a4078192e1b2c940b3fde563f76e611f64 100644 --- a/Lib/distutils/_msvccompiler.py +++ b/Lib/distutils/_msvccompiler.py @@ -14,8 +14,6 @@ # ported to VS 2015 by Steve Dower import os -import shutil -import stat import subprocess import winreg @@ -65,8 +63,6 @@ def _find_vc2017(): If vswhere.exe is not available, by definition, VS 2017 is not installed. """ - import json - root = os.environ.get("ProgramFiles(x86)") or os.environ.get("ProgramFiles") if not root: return None, None diff --git a/Lib/distutils/bcppcompiler.py b/Lib/distutils/bcppcompiler.py index 9f4c432d90e77facc2fd74b50aade770ceef9cb0..071fea5d038cb0425a962a8b6bea55a9c158dd5d 100644 --- a/Lib/distutils/bcppcompiler.py +++ b/Lib/distutils/bcppcompiler.py @@ -14,10 +14,10 @@ import os from distutils.errors import \ - DistutilsExecError, DistutilsPlatformError, \ + DistutilsExecError, \ CompileError, LibError, LinkError, UnknownFileError from distutils.ccompiler import \ - CCompiler, gen_preprocess_options, gen_lib_options + CCompiler, gen_preprocess_options from distutils.file_util import write_file from distutils.dep_util import newer from distutils import log diff --git a/Lib/distutils/ccompiler.py b/Lib/distutils/ccompiler.py index 4cfc6c7065e922dde36aabbe46aa38b9723b1180..b5ef143e72c56481128b8d7f91784096336e2bff 100644 --- a/Lib/distutils/ccompiler.py +++ b/Lib/distutils/ccompiler.py @@ -8,7 +8,7 @@ from distutils.spawn import spawn from distutils.file_util import move_file from distutils.dir_util import mkpath -from distutils.dep_util import newer_pairwise, newer_group +from distutils.dep_util import newer_group from distutils.util import split_quoted, execute from distutils import log diff --git a/Lib/distutils/command/bdist_msi.py b/Lib/distutils/command/bdist_msi.py index f335a34898620e5ff9c47df66170113e30f49e3b..0863a1883e72058a8701a946c644276f047f837e 100644 --- a/Lib/distutils/command/bdist_msi.py +++ b/Lib/distutils/command/bdist_msi.py @@ -6,7 +6,9 @@ Implements the bdist_msi command. """ -import sys, os +import os +import sys +import warnings from distutils.core import Command from distutils.dir_util import remove_tree from distutils.sysconfig import get_python_version @@ -122,6 +124,12 @@ class bdist_msi(Command): '3.5', '3.6', '3.7', '3.8', '3.9'] other_version = 'X' + def __init__(self, *args, **kw): + super().__init__(*args, **kw) + warnings.warn("bdist_msi command is deprecated since Python 3.9, " + "use bdist_wheel (wheel packages) instead", + DeprecationWarning, 2) + def initialize_options(self): self.bdist_dir = None self.plat_name = None diff --git a/Lib/distutils/command/bdist_rpm.py b/Lib/distutils/command/bdist_rpm.py index 74381cc69a6cedca4bc6410e5305ee6e48af7744..550cbfa1e28a2376fe1b4f994bce86b446c0916e 100644 --- a/Lib/distutils/command/bdist_rpm.py +++ b/Lib/distutils/command/bdist_rpm.py @@ -6,7 +6,6 @@ import subprocess, sys, os from distutils.core import Command from distutils.debug import DEBUG -from distutils.util import get_platform from distutils.file_util import write_file from distutils.errors import * from distutils.sysconfig import get_python_version diff --git a/Lib/distutils/command/bdist_wininst.py b/Lib/distutils/command/bdist_wininst.py index b5ed6f041e19a04d69307d7ddf3ff9f7361845e1..0e9ddaa21419e9581392d170a51dfcf53203d5e8 100644 --- a/Lib/distutils/command/bdist_wininst.py +++ b/Lib/distutils/command/bdist_wininst.py @@ -8,7 +8,7 @@ import warnings from distutils.core import Command from distutils.util import get_platform -from distutils.dir_util import create_tree, remove_tree +from distutils.dir_util import remove_tree from distutils.errors import * from distutils.sysconfig import get_python_version from distutils import log diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py index dbcd9d16f28c599114e479288e2b6e6ffff34a67..1a9bd1200f82358c5a758c69c433bb55621e157e 100644 --- a/Lib/distutils/command/build_ext.py +++ b/Lib/distutils/command/build_ext.py @@ -490,7 +490,8 @@ def build_extension(self, ext): "in 'ext_modules' option (extension '%s'), " "'sources' must be present and must be " "a list of source filenames" % ext.name) - sources = list(sources) + # sort to make the resulting .so file build reproducible + sources = sorted(sources) ext_path = self.get_ext_fullpath(ext.name) depends = sources + ext.depends diff --git a/Lib/distutils/command/check.py b/Lib/distutils/command/check.py index 04c2f9642d7334f9f2fa7069550bd5fd4dd00c29..ada250064678ee3ddfbc29244a45ca64d527659c 100644 --- a/Lib/distutils/command/check.py +++ b/Lib/distutils/command/check.py @@ -11,7 +11,6 @@ from docutils.parsers.rst import Parser from docutils import frontend from docutils import nodes - from io import StringIO class SilentReporter(Reporter): @@ -80,8 +79,11 @@ def run(self): def check_metadata(self): """Ensures that all required elements of meta-data are supplied. - name, version, URL, (author and author_email) or - (maintainer and maintainer_email)). + Required fields: + name, version, URL + + Recommended fields: + (author and author_email) or (maintainer and maintainer_email)) Warns if any are missing. """ @@ -97,15 +99,15 @@ def check_metadata(self): if metadata.author: if not metadata.author_email: self.warn("missing meta-data: if 'author' supplied, " + - "'author_email' must be supplied too") + "'author_email' should be supplied too") elif metadata.maintainer: if not metadata.maintainer_email: self.warn("missing meta-data: if 'maintainer' supplied, " + - "'maintainer_email' must be supplied too") + "'maintainer_email' should be supplied too") else: self.warn("missing meta-data: either (author and author_email) " + "or (maintainer and maintainer_email) " + - "must be supplied") + "should be supplied") def check_restructuredtext(self): """Checks if the long string fields are reST-compliant.""" diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py index c625c95bf7e8cf938b409e218026382a52824491..aaa300efa96e6e2c2ebcd0a73cd9a4ceba1d30df 100644 --- a/Lib/distutils/command/install.py +++ b/Lib/distutils/command/install.py @@ -30,14 +30,14 @@ INSTALL_SCHEMES = { 'unix_prefix': { 'purelib': '$base/lib/python$py_version_short/site-packages', - 'platlib': '$platbase/lib/python$py_version_short/site-packages', + 'platlib': '$platbase/$platlibdir/python$py_version_short/site-packages', 'headers': '$base/include/python$py_version_short$abiflags/$dist_name', 'scripts': '$base/bin', 'data' : '$base', }, 'unix_home': { 'purelib': '$base/lib/python', - 'platlib': '$base/lib/python', + 'platlib': '$base/$platlibdir/python', 'headers': '$base/include/python/$dist_name', 'scripts': '$base/bin', 'data' : '$base', @@ -298,6 +298,7 @@ def finalize_options(self): 'sys_exec_prefix': exec_prefix, 'exec_prefix': exec_prefix, 'abiflags': abiflags, + 'platlibdir': sys.platlibdir, } if HAS_USER_SITE: diff --git a/Lib/distutils/command/upload.py b/Lib/distutils/command/upload.py index 11afa24b777a120546f3d3b900ff68000013f9c2..95e9fda186fc8f5b884215f7bea251b515e72cae 100644 --- a/Lib/distutils/command/upload.py +++ b/Lib/distutils/command/upload.py @@ -7,7 +7,6 @@ import os import io -import platform import hashlib from base64 import standard_b64encode from urllib.request import urlopen, Request, HTTPError @@ -17,6 +16,16 @@ from distutils.spawn import spawn from distutils import log + +# PyPI Warehouse supports MD5, SHA256, and Blake2 (blake2-256) +# https://bugs.python.org/issue40698 +_FILE_CONTENT_DIGESTS = { + "md5_digest": getattr(hashlib, "md5", None), + "sha256_digest": getattr(hashlib, "sha256", None), + "blake2_256_digest": getattr(hashlib, "blake2b", None), +} + + class upload(PyPIRCCommand): description = "upload binary package to PyPI" @@ -88,6 +97,7 @@ def upload_file(self, command, pyversion, filename): content = f.read() finally: f.close() + meta = self.distribution.metadata data = { # action @@ -102,7 +112,6 @@ def upload_file(self, command, pyversion, filename): 'content': (os.path.basename(filename),content), 'filetype': command, 'pyversion': pyversion, - 'md5_digest': hashlib.md5(content).hexdigest(), # additional meta-data 'metadata_version': '1.0', @@ -124,6 +133,16 @@ def upload_file(self, command, pyversion, filename): data['comment'] = '' + # file content digests + for digest_name, digest_cons in _FILE_CONTENT_DIGESTS.items(): + if digest_cons is None: + continue + try: + data[digest_name] = digest_cons(content).hexdigest() + except ValueError: + # hash digest not available or blocked by security policy + pass + if self.sign: with open(filename + ".asc", "rb") as f: data['gpg_signature'] = (os.path.basename(filename) + ".asc", diff --git a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py index 6c5d77746b6f567c3dd77d4c0e66f174820b0b50..66c12dd35830b29d9b80bc1fecef65bbc46fe862 100644 --- a/Lib/distutils/cygwinccompiler.py +++ b/Lib/distutils/cygwinccompiler.py @@ -51,12 +51,10 @@ from subprocess import Popen, PIPE, check_output import re -from distutils.ccompiler import gen_preprocess_options, gen_lib_options from distutils.unixccompiler import UnixCCompiler from distutils.file_util import write_file from distutils.errors import (DistutilsExecError, CCompilerError, CompileError, UnknownFileError) -from distutils import log from distutils.version import LooseVersion from distutils.spawn import find_executable diff --git a/Lib/distutils/msvc9compiler.py b/Lib/distutils/msvc9compiler.py index 4c0036a0f13305a80cc353e1cc3438223232bb63..6934e964abd69b371aa4b0ad9587dea61602049f 100644 --- a/Lib/distutils/msvc9compiler.py +++ b/Lib/distutils/msvc9compiler.py @@ -19,8 +19,7 @@ from distutils.errors import DistutilsExecError, DistutilsPlatformError, \ CompileError, LibError, LinkError -from distutils.ccompiler import CCompiler, gen_preprocess_options, \ - gen_lib_options +from distutils.ccompiler import CCompiler, gen_lib_options from distutils import log from distutils.util import get_platform diff --git a/Lib/distutils/msvccompiler.py b/Lib/distutils/msvccompiler.py index d1de2fbfcb947be5e4f72df19c3a93f3da37cc1e..d5857cb1ffe423a1d4bb19fd199ef2f6cf7d158f 100644 --- a/Lib/distutils/msvccompiler.py +++ b/Lib/distutils/msvccompiler.py @@ -13,7 +13,7 @@ DistutilsExecError, DistutilsPlatformError, \ CompileError, LibError, LinkError from distutils.ccompiler import \ - CCompiler, gen_preprocess_options, gen_lib_options + CCompiler, gen_lib_options from distutils import log _can_read_reg = False diff --git a/Lib/distutils/spawn.py b/Lib/distutils/spawn.py index ceb94945dc8bed2a6e28321208cd8b09b7acf2f0..0d1bd0391e6f1134e4472d7e133d8302d564a7dc 100644 --- a/Lib/distutils/spawn.py +++ b/Lib/distutils/spawn.py @@ -8,11 +8,18 @@ import sys import os +import subprocess from distutils.errors import DistutilsPlatformError, DistutilsExecError from distutils.debug import DEBUG from distutils import log + +if sys.platform == 'darwin': + _cfg_target = None + _cfg_target_split = None + + def spawn(cmd, search_path=1, verbose=0, dry_run=0): """Run another program, specified as a command list 'cmd', in a new process. @@ -32,64 +39,16 @@ def spawn(cmd, search_path=1, verbose=0, dry_run=0): # cmd is documented as a list, but just in case some code passes a tuple # in, protect our %-formatting code against horrible death cmd = list(cmd) - if os.name == 'posix': - _spawn_posix(cmd, search_path, dry_run=dry_run) - elif os.name == 'nt': - _spawn_nt(cmd, search_path, dry_run=dry_run) - else: - raise DistutilsPlatformError( - "don't know how to spawn programs on platform '%s'" % os.name) - -def _nt_quote_args(args): - """Quote command-line arguments for DOS/Windows conventions. - - Just wraps every argument which contains blanks in double quotes, and - returns a new argument list. - """ - # XXX this doesn't seem very robust to me -- but if the Windows guys - # say it'll work, I guess I'll have to accept it. (What if an arg - # contains quotes? What other magic characters, other than spaces, - # have to be escaped? Is there an escaping mechanism other than - # quoting?) - for i, arg in enumerate(args): - if ' ' in arg: - args[i] = '"%s"' % arg - return args - -def _spawn_nt(cmd, search_path=1, verbose=0, dry_run=0): - executable = cmd[0] - cmd = _nt_quote_args(cmd) - if search_path: - # either we find one or it stays the same - executable = find_executable(executable) or executable - log.info(' '.join([executable] + cmd[1:])) - if not dry_run: - # spawn for NT requires a full path to the .exe - try: - rc = os.spawnv(os.P_WAIT, executable, cmd) - except OSError as exc: - # this seems to happen when the command isn't found - if not DEBUG: - cmd = executable - raise DistutilsExecError( - "command %r failed: %s" % (cmd, exc.args[-1])) - if rc != 0: - # and this reflects the command running but failing - if not DEBUG: - cmd = executable - raise DistutilsExecError( - "command %r failed with exit status %d" % (cmd, rc)) -if sys.platform == 'darwin': - _cfg_target = None - _cfg_target_split = None - -def _spawn_posix(cmd, search_path=1, verbose=0, dry_run=0): log.info(' '.join(cmd)) if dry_run: return - executable = cmd[0] - exec_fn = search_path and os.execvp or os.execv + + if search_path: + executable = find_executable(cmd[0]) + if executable is not None: + cmd[0] = executable + env = None if sys.platform == 'darwin': global _cfg_target, _cfg_target_split @@ -111,60 +70,23 @@ def _spawn_posix(cmd, search_path=1, verbose=0, dry_run=0): raise DistutilsPlatformError(my_msg) env = dict(os.environ, MACOSX_DEPLOYMENT_TARGET=cur_target) - exec_fn = search_path and os.execvpe or os.execve - pid = os.fork() - if pid == 0: # in the child - try: - if env is None: - exec_fn(executable, cmd) - else: - exec_fn(executable, cmd, env) - except OSError as e: - if not DEBUG: - cmd = executable - sys.stderr.write("unable to execute %r: %s\n" - % (cmd, e.strerror)) - os._exit(1) + try: + proc = subprocess.Popen(cmd, env=env) + proc.wait() + exitcode = proc.returncode + except OSError as exc: if not DEBUG: - cmd = executable - sys.stderr.write("unable to execute %r for unknown reasons" % cmd) - os._exit(1) - else: # in the parent - # Loop until the child either exits or is terminated by a signal - # (ie. keep waiting if it's merely stopped) - while True: - try: - pid, status = os.waitpid(pid, 0) - except OSError as exc: - if not DEBUG: - cmd = executable - raise DistutilsExecError( - "command %r failed: %s" % (cmd, exc.args[-1])) - if os.WIFSIGNALED(status): - if not DEBUG: - cmd = executable - raise DistutilsExecError( - "command %r terminated by signal %d" - % (cmd, os.WTERMSIG(status))) - elif os.WIFEXITED(status): - exit_status = os.WEXITSTATUS(status) - if exit_status == 0: - return # hey, it succeeded! - else: - if not DEBUG: - cmd = executable - raise DistutilsExecError( - "command %r failed with exit status %d" - % (cmd, exit_status)) - elif os.WIFSTOPPED(status): - continue - else: - if not DEBUG: - cmd = executable - raise DistutilsExecError( - "unknown error executing %r: termination status %d" - % (cmd, status)) + cmd = cmd[0] + raise DistutilsExecError( + "command %r failed: %s" % (cmd, exc.args[-1])) from exc + + if exitcode: + if not DEBUG: + cmd = cmd[0] + raise DistutilsExecError( + "command %r failed with exit code %s" % (cmd, exitcode)) + def find_executable(executable, path=None): """Tries to find 'executable' in the directories listed in 'path'. diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py index b51629eb94f825d8d0f857b8aa5b431814199d72..37feae5df72c93d11410f8357a3aaeabd1b31acc 100644 --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -15,7 +15,6 @@ import sys from .errors import DistutilsPlatformError -from .util import get_platform, get_host_platform # These are needed in a couple of spots, so just compute them once. PREFIX = os.path.normpath(sys.prefix) @@ -146,8 +145,15 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None): prefix = plat_specific and EXEC_PREFIX or PREFIX if os.name == "posix": - libpython = os.path.join(prefix, - "lib", "python" + get_python_version()) + if plat_specific or standard_lib: + # Platform-specific modules (any module from a non-pure-Python + # module distribution) or standard Python library modules. + libdir = sys.platlibdir + else: + # Pure Python + libdir = "lib" + libpython = os.path.join(prefix, libdir, + "python" + get_python_version()) if standard_lib: return libpython else: diff --git a/Lib/distutils/tests/support.py b/Lib/distutils/tests/support.py index 041309851d0f39e6da461a5a4a55c51f785dd050..259af882ec0e968afc12b8e347ad82b28617aa1a 100644 --- a/Lib/distutils/tests/support.py +++ b/Lib/distutils/tests/support.py @@ -39,8 +39,6 @@ def _log(self, level, msg, args): self.logs.append((level, msg, args)) def get_logs(self, *levels): - def _format(msg, args): - return msg % args return [msg % args for level, msg, args in self.logs if level in levels] diff --git a/Lib/distutils/tests/test_bdist_msi.py b/Lib/distutils/tests/test_bdist_msi.py index 15d8bdff2b4f559fc359ceb67c5b1cf13d6bc23d..418e60ec7297790ddf1aede31f89f181d66bead9 100644 --- a/Lib/distutils/tests/test_bdist_msi.py +++ b/Lib/distutils/tests/test_bdist_msi.py @@ -1,7 +1,7 @@ """Tests for distutils.command.bdist_msi.""" import sys import unittest -from test.support import run_unittest +from test.support import run_unittest, check_warnings from distutils.tests import support @@ -14,7 +14,8 @@ def test_minimal(self): # minimal test XXX need more tests from distutils.command.bdist_msi import bdist_msi project_dir, dist = self.create_dist() - cmd = bdist_msi(dist) + with check_warnings(("", DeprecationWarning)): + cmd = bdist_msi(dist) cmd.ensure_finalized() diff --git a/Lib/distutils/tests/test_build_clib.py b/Lib/distutils/tests/test_build_clib.py index 85d09906f228d4025b9bc051e9e0be94c81cda38..abd8313770ef7a449ff37d6163b9950d67b8274a 100644 --- a/Lib/distutils/tests/test_build_clib.py +++ b/Lib/distutils/tests/test_build_clib.py @@ -8,7 +8,6 @@ from distutils.command.build_clib import build_clib from distutils.errors import DistutilsSetupError from distutils.tests import support -from distutils.spawn import find_executable class BuildCLibTestCase(support.TempdirManager, support.LoggingSilencer, diff --git a/Lib/distutils/tests/test_build_ext.py b/Lib/distutils/tests/test_build_ext.py index 5e47e0773a964912b1783a63c735a02638379fab..808c0dc2874cd5354684aa8ea999e150429cde3f 100644 --- a/Lib/distutils/tests/test_build_ext.py +++ b/Lib/distutils/tests/test_build_ext.py @@ -492,12 +492,16 @@ def _try_compile_deployment_target(self, operator, target): # format the target value as defined in the Apple # Availability Macros. We can't use the macro names since # at least one value we test with will not exist yet. - if target[1] < 10: + if target[:2] < (10, 10): # for 10.1 through 10.9.x -> "10n0" target = '%02d%01d0' % target else: # for 10.10 and beyond -> "10nn00" - target = '%02d%02d00' % target + if len(target) >= 2: + target = '%02d%02d00' % target + else: + # 11 and later can have no minor version (11 instead of 11.0) + target = '%02d0000' % target deptarget_ext = Extension( 'deptarget', [deptarget_c], diff --git a/Lib/distutils/tests/test_config_cmd.py b/Lib/distutils/tests/test_config_cmd.py index 8bd2c94237846acb1878d617a93b5d3fa92565d1..9aeab07b4683610a118d4e4d5354f1ce5a798865 100644 --- a/Lib/distutils/tests/test_config_cmd.py +++ b/Lib/distutils/tests/test_config_cmd.py @@ -39,7 +39,6 @@ def test_dump_file(self): @unittest.skipIf(sys.platform == 'win32', "can't test on Windows") def test_search_cpp(self): - import shutil cmd = missing_compiler_executable(['preprocessor']) if cmd is not None: self.skipTest('The %r command is not found' % cmd) diff --git a/Lib/distutils/tests/test_dist.py b/Lib/distutils/tests/test_dist.py index cc34725a99efa423db4a5ab38507b66adcac143b..60956dadef2346ac36154d5f80f8450ae2ec09cd 100644 --- a/Lib/distutils/tests/test_dist.py +++ b/Lib/distutils/tests/test_dist.py @@ -8,7 +8,7 @@ from unittest import mock -from distutils.dist import Distribution, fix_help_options, DistributionMetadata +from distutils.dist import Distribution, fix_help_options from distutils.cmd import Command from test.support import ( diff --git a/Lib/distutils/tests/test_install.py b/Lib/distutils/tests/test_install.py index 287ab1989e40836de196d3cfe560afbe6fb79a29..51c80e0421a8c15d111fd6d46518ff840968d7ed 100644 --- a/Lib/distutils/tests/test_install.py +++ b/Lib/distutils/tests/test_install.py @@ -58,7 +58,8 @@ def check_path(got, expected): libdir = os.path.join(destination, "lib", "python") check_path(cmd.install_lib, libdir) - check_path(cmd.install_platlib, libdir) + platlibdir = os.path.join(destination, sys.platlibdir, "python") + check_path(cmd.install_platlib, platlibdir) check_path(cmd.install_purelib, libdir) check_path(cmd.install_headers, os.path.join(destination, "include", "python", "foopkg")) diff --git a/Lib/distutils/tests/test_spawn.py b/Lib/distutils/tests/test_spawn.py index f9ae69ef86b3dae9bdbf182052db38c7a414f1c3..ad5038142faadf6c488074a607f4a950342c16fc 100644 --- a/Lib/distutils/tests/test_spawn.py +++ b/Lib/distutils/tests/test_spawn.py @@ -2,13 +2,11 @@ import os import stat import sys -import unittest -from unittest import mock +import unittest.mock from test.support import run_unittest, unix_shell from test import support as test_support from distutils.spawn import find_executable -from distutils.spawn import _nt_quote_args from distutils.spawn import spawn from distutils.errors import DistutilsExecError from distutils.tests import support @@ -17,16 +15,6 @@ class SpawnTestCase(support.TempdirManager, support.LoggingSilencer, unittest.TestCase): - def test_nt_quote_args(self): - - for (args, wanted) in ((['with space', 'nospace'], - ['"with space"', 'nospace']), - (['nochange', 'nospace'], - ['nochange', 'nospace'])): - res = _nt_quote_args(args) - self.assertEqual(res, wanted) - - @unittest.skipUnless(os.name in ('nt', 'posix'), 'Runs only under posix or nt') def test_spawn(self): @@ -136,6 +124,11 @@ def test_find_executable(self): rv = find_executable(program) self.assertEqual(rv, filename) + def test_spawn_missing_exe(self): + with self.assertRaises(DistutilsExecError) as ctx: + spawn(['does-not-exist']) + self.assertIn("command 'does-not-exist' failed", str(ctx.exception)) + def test_suite(): return unittest.makeSuite(SpawnTestCase) diff --git a/Lib/distutils/tests/test_upload.py b/Lib/distutils/tests/test_upload.py index c17d8e7d54e98c24c4eaf9278a3233f1d508676e..bca5516d2f74f68f26b4592e12fc8082c099f7ab 100644 --- a/Lib/distutils/tests/test_upload.py +++ b/Lib/distutils/tests/test_upload.py @@ -130,14 +130,30 @@ def test_upload(self): # what did we send ? headers = dict(self.last_open.req.headers) - self.assertEqual(headers['Content-length'], '2162') + self.assertGreaterEqual(int(headers['Content-length']), 2162) content_type = headers['Content-type'] self.assertTrue(content_type.startswith('multipart/form-data')) self.assertEqual(self.last_open.req.get_method(), 'POST') expected_url = 'https://upload.pypi.org/legacy/' self.assertEqual(self.last_open.req.get_full_url(), expected_url) - self.assertTrue(b'xxx' in self.last_open.req.data) - self.assertIn(b'protocol_version', self.last_open.req.data) + data = self.last_open.req.data + self.assertIn(b'xxx',data) + self.assertIn(b'protocol_version', data) + self.assertIn(b'sha256_digest', data) + self.assertIn( + b'cd2eb0837c9b4c962c22d2ff8b5441b7b45805887f051d39bf133b583baf' + b'6860', + data + ) + if b'md5_digest' in data: + self.assertIn(b'f561aaf6ef0bf14d4208bb46a4ccb3ad', data) + if b'blake2_256_digest' in data: + self.assertIn( + b'b6f289a27d4fe90da63c503bfe0a9b761a8f76bb86148565065f040be' + b'6d1c3044cf7ded78ef800509bccb4b648e507d88dc6383d67642aadcc' + b'ce443f1534330a', + data + ) # The PyPI response body was echoed results = self.get_logs(INFO) @@ -166,7 +182,7 @@ def test_upload_correct_cr(self): cmd.run() headers = dict(self.last_open.req.headers) - self.assertEqual(headers['Content-length'], '2172') + self.assertGreaterEqual(int(headers['Content-length']), 2172) self.assertIn(b'long description\r', self.last_open.req.data) def test_upload_fails(self): diff --git a/Lib/distutils/tests/test_version.py b/Lib/distutils/tests/test_version.py index 15f14c7de3f1256aa74199ec01ea0bc978db6fc2..8671cd2fc5c148a3ddcc752a71bdce62ff0572dc 100644 --- a/Lib/distutils/tests/test_version.py +++ b/Lib/distutils/tests/test_version.py @@ -45,6 +45,14 @@ def test_cmp_strict(self): self.assertEqual(res, wanted, 'cmp(%s, %s) should be %s, got %s' % (v1, v2, wanted, res)) + res = StrictVersion(v1)._cmp(v2) + self.assertEqual(res, wanted, + 'cmp(%s, %s) should be %s, got %s' % + (v1, v2, wanted, res)) + res = StrictVersion(v1)._cmp(object()) + self.assertIs(res, NotImplemented, + 'cmp(%s, %s) should be NotImplemented, got %s' % + (v1, v2, res)) def test_cmp(self): @@ -63,6 +71,14 @@ def test_cmp(self): self.assertEqual(res, wanted, 'cmp(%s, %s) should be %s, got %s' % (v1, v2, wanted, res)) + res = LooseVersion(v1)._cmp(v2) + self.assertEqual(res, wanted, + 'cmp(%s, %s) should be %s, got %s' % + (v1, v2, wanted, res)) + res = LooseVersion(v1)._cmp(object()) + self.assertIs(res, NotImplemented, + 'cmp(%s, %s) should be NotImplemented, got %s' % + (v1, v2, res)) def test_suite(): return unittest.makeSuite(VersionTestCase) diff --git a/Lib/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py index 4d7a6de740ab3a647a6a2157c0e1dae4b7a10fd4..f0792de74a1a489a8232d89b6302c77d91a7552e 100644 --- a/Lib/distutils/unixccompiler.py +++ b/Lib/distutils/unixccompiler.py @@ -290,7 +290,7 @@ def find_library_file(self, dirs, lib, debug=0): cflags = sysconfig.get_config_var('CFLAGS') m = re.search(r'-isysroot\s*(\S+)', cflags) if m is None: - sysroot = '/' + sysroot = _osx_support._default_sysroot(sysconfig.get_config_var('CC')) else: sysroot = m.group(1) diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py index 17a94bc42832415e46f88c3ffafbd70598342fb7..4b002ecef1df8ffd79a9aa067640eb43027a9bf2 100644 --- a/Lib/distutils/util.py +++ b/Lib/distutils/util.py @@ -79,7 +79,8 @@ def get_host_platform(): machine += ".%s" % bitness[sys.maxsize] # fall through to standard osname-release-machine representation elif osname[:3] == "aix": - return "%s-%s.%s" % (osname, version, release) + from _aix_support import aix_platform + return aix_platform() elif osname[:6] == "cygwin": osname = "cygwin" rel_re = re.compile (r'[\d.]+', re.ASCII) diff --git a/Lib/distutils/version.py b/Lib/distutils/version.py index af14cc1348144745673ccd57a168d728b17b7e28..c33bebaed26aeead3a97b48dcd4f34308ca3976e 100644 --- a/Lib/distutils/version.py +++ b/Lib/distutils/version.py @@ -166,6 +166,8 @@ def __str__ (self): def _cmp (self, other): if isinstance(other, str): other = StrictVersion(other) + elif not isinstance(other, StrictVersion): + return NotImplemented if self.version != other.version: # numeric versions don't match @@ -331,6 +333,8 @@ def __repr__ (self): def _cmp (self, other): if isinstance(other, str): other = LooseVersion(other) + elif not isinstance(other, LooseVersion): + return NotImplemented if self.version == other.version: return 0 diff --git a/Lib/doctest.py b/Lib/doctest.py index ee71984a7d97cf888d400e9dda0d9612a80e22b9..baa503c83f8757534a272a133acb00728f9a37c3 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -1334,7 +1334,7 @@ def __run(self, test, compileflags, out): try: # Don't blink! This is where the user's code gets run. exec(compile(example.source, filename, "single", - compileflags, 1), test.globs) + compileflags, True), test.globs) self.debugger.set_continue() # ==== Example Finished ==== exception = None except KeyboardInterrupt: diff --git a/Lib/dummy_threading.py b/Lib/dummy_threading.py deleted file mode 100644 index 1bb7eee338af2458ce35a55dc946d2057f9a5d80..0000000000000000000000000000000000000000 --- a/Lib/dummy_threading.py +++ /dev/null @@ -1,78 +0,0 @@ -"""Faux ``threading`` version using ``dummy_thread`` instead of ``thread``. - -The module ``_dummy_threading`` is added to ``sys.modules`` in order -to not have ``threading`` considered imported. Had ``threading`` been -directly imported it would have made all subsequent imports succeed -regardless of whether ``_thread`` was available which is not desired. - -""" -from sys import modules as sys_modules - -import _dummy_thread - -# Declaring now so as to not have to nest ``try``s to get proper clean-up. -holding_thread = False -holding_threading = False -holding__threading_local = False - -try: - # Could have checked if ``_thread`` was not in sys.modules and gone - # a different route, but decided to mirror technique used with - # ``threading`` below. - if '_thread' in sys_modules: - held_thread = sys_modules['_thread'] - holding_thread = True - # Must have some module named ``_thread`` that implements its API - # in order to initially import ``threading``. - sys_modules['_thread'] = sys_modules['_dummy_thread'] - - if 'threading' in sys_modules: - # If ``threading`` is already imported, might as well prevent - # trying to import it more than needed by saving it if it is - # already imported before deleting it. - held_threading = sys_modules['threading'] - holding_threading = True - del sys_modules['threading'] - - if '_threading_local' in sys_modules: - # If ``_threading_local`` is already imported, might as well prevent - # trying to import it more than needed by saving it if it is - # already imported before deleting it. - held__threading_local = sys_modules['_threading_local'] - holding__threading_local = True - del sys_modules['_threading_local'] - - import threading - # Need a copy of the code kept somewhere... - sys_modules['_dummy_threading'] = sys_modules['threading'] - del sys_modules['threading'] - sys_modules['_dummy__threading_local'] = sys_modules['_threading_local'] - del sys_modules['_threading_local'] - from _dummy_threading import * - from _dummy_threading import __all__ - -finally: - # Put back ``threading`` if we overwrote earlier - - if holding_threading: - sys_modules['threading'] = held_threading - del held_threading - del holding_threading - - # Put back ``_threading_local`` if we overwrote earlier - - if holding__threading_local: - sys_modules['_threading_local'] = held__threading_local - del held__threading_local - del holding__threading_local - - # Put back ``thread`` if we overwrote, else del the entry we made - if holding_thread: - sys_modules['_thread'] = held_thread - del held_thread - else: - del sys_modules['_thread'] - del holding_thread - - del _dummy_thread - del sys_modules diff --git a/Lib/email/generator.py b/Lib/email/generator.py index ae670c2353c858a8f8a2e5601699df7252bdc259..c9b121624e08d5ec390560b735b05ed411adeed2 100644 --- a/Lib/email/generator.py +++ b/Lib/email/generator.py @@ -186,7 +186,11 @@ def _write(self, msg): # If we munged the cte, copy the message again and re-fix the CTE. if munge_cte: msg = deepcopy(msg) - msg.replace_header('content-transfer-encoding', munge_cte[0]) + # Preserve the header order if the CTE header already exists. + if msg.get('content-transfer-encoding') is None: + msg['Content-Transfer-Encoding'] = munge_cte[0] + else: + msg.replace_header('content-transfer-encoding', munge_cte[0]) msg.replace_header('content-type', munge_cte[1]) # Write the headers. First we see if the message object wants to # handle that itself. If not, we'll do it generically. diff --git a/Lib/email/headerregistry.py b/Lib/email/headerregistry.py index d0914fd1925c6596ab7f708f325f9cf48c492df6..5d84fc0d82d0b04b86c83241c051720f7b586737 100644 --- a/Lib/email/headerregistry.py +++ b/Lib/email/headerregistry.py @@ -74,11 +74,9 @@ def addr_spec(self): """The addr_spec (username@domain) portion of the address, quoted according to RFC 5322 rules, but with no Content Transfer Encoding. """ - nameset = set(self.username) - if len(nameset) > len(nameset-parser.DOT_ATOM_ENDS): - lp = parser.quote_string(self.username) - else: - lp = self.username + lp = self.username + if not parser.DOT_ATOM_ENDS.isdisjoint(lp): + lp = parser.quote_string(lp) if self.domain: return lp + '@' + self.domain if not lp: @@ -91,19 +89,17 @@ def __repr__(self): self.display_name, self.username, self.domain) def __str__(self): - nameset = set(self.display_name) - if len(nameset) > len(nameset-parser.SPECIALS): - disp = parser.quote_string(self.display_name) - else: - disp = self.display_name + disp = self.display_name + if not parser.SPECIALS.isdisjoint(disp): + disp = parser.quote_string(disp) if disp: addr_spec = '' if self.addr_spec=='<>' else self.addr_spec return "{} <{}>".format(disp, addr_spec) return self.addr_spec def __eq__(self, other): - if type(other) != type(self): - return False + if not isinstance(other, Address): + return NotImplemented return (self.display_name == other.display_name and self.username == other.username and self.domain == other.domain) @@ -146,17 +142,15 @@ def __str__(self): if self.display_name is None and len(self.addresses)==1: return str(self.addresses[0]) disp = self.display_name - if disp is not None: - nameset = set(disp) - if len(nameset) > len(nameset-parser.SPECIALS): - disp = parser.quote_string(disp) + if disp is not None and not parser.SPECIALS.isdisjoint(disp): + disp = parser.quote_string(disp) adrstr = ", ".join(str(x) for x in self.addresses) adrstr = ' ' + adrstr if adrstr else adrstr return "{}:{};".format(disp, adrstr) def __eq__(self, other): - if type(other) != type(self): - return False + if not isinstance(other, Group): + return NotImplemented return (self.display_name == other.display_name and self.addresses == other.addresses) diff --git a/Lib/email/message.py b/Lib/email/message.py index 12626026179608e198e079d69d56dbd94c594004..3701b305532b4c15e65e861d042ad395e3d6cd59 100644 --- a/Lib/email/message.py +++ b/Lib/email/message.py @@ -141,7 +141,7 @@ def as_string(self, unixfrom=False, maxheaderlen=0, policy=None): header. For backward compatibility reasons, if maxheaderlen is not specified it defaults to 0, so you must override it explicitly if you want a different maxheaderlen. 'policy' is passed to the - Generator instance used to serialize the mesasge; if it is not + Generator instance used to serialize the message; if it is not specified the policy associated with the message instance is used. If the message object contains binary data that is not encoded @@ -958,7 +958,7 @@ def as_string(self, unixfrom=False, maxheaderlen=None, policy=None): header. maxheaderlen is retained for backward compatibility with the base Message class, but defaults to None, meaning that the policy value for max_line_length controls the header maximum length. 'policy' is - passed to the Generator instance used to serialize the mesasge; if it + passed to the Generator instance used to serialize the message; if it is not specified the policy associated with the message instance is used. """ diff --git a/Lib/email/utils.py b/Lib/email/utils.py index 07dd029cc02800e2e32f0196da7f5fba722dd105..1a7719dbc4898fc328a9b8e792d1d4a603783f77 100644 --- a/Lib/email/utils.py +++ b/Lib/email/utils.py @@ -259,21 +259,13 @@ def decode_params(params): params is a sequence of 2-tuples containing (param name, string value). """ - # Copy params so we don't mess with the original - params = params[:] - new_params = [] + new_params = [params[0]] # Map parameter's name to a list of continuations. The values are a # 3-tuple of the continuation number, the string value, and a flag # specifying whether a particular segment is %-encoded. rfc2231_params = {} - name, value = params.pop(0) - new_params.append((name, value)) - while params: - name, value = params.pop(0) - if name.endswith('*'): - encoded = True - else: - encoded = False + for name, value in params[1:]: + encoded = name.endswith('*') value = unquote(value) mo = rfc2231_continuation.match(name) if mo: diff --git a/Lib/encodings/aliases.py b/Lib/encodings/aliases.py index 2444f9f1795e07c5f9c1b20668aa86ab38d4ef67..d85afd6d5cf704b580a31be2ee79f5cdfe0247c1 100644 --- a/Lib/encodings/aliases.py +++ b/Lib/encodings/aliases.py @@ -450,6 +450,7 @@ # mac_latin2 codec 'maccentraleurope' : 'mac_latin2', + 'mac_centeuro' : 'mac_latin2', 'maclatin2' : 'mac_latin2', # mac_roman codec @@ -493,9 +494,6 @@ 'sjisx0213' : 'shift_jisx0213', 's_jisx0213' : 'shift_jisx0213', - # tactis codec - 'tis260' : 'tactis', - # tis_620 codec 'tis620' : 'tis_620', 'tis_620_0' : 'tis_620', diff --git a/Lib/encodings/mac_centeuro.py b/Lib/encodings/mac_centeuro.py deleted file mode 100644 index 5785a0ec12df42aea69a09d6f3ab6049a36d3ee0..0000000000000000000000000000000000000000 --- a/Lib/encodings/mac_centeuro.py +++ /dev/null @@ -1,307 +0,0 @@ -""" Python Character Mapping Codec mac_centeuro generated from 'MAPPINGS/VENDORS/APPLE/CENTEURO.TXT' with gencodec.py. - -"""#" - -import codecs - -### Codec APIs - -class Codec(codecs.Codec): - - def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_table) - - def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_table) - -class IncrementalEncoder(codecs.IncrementalEncoder): - def encode(self, input, final=False): - return codecs.charmap_encode(input,self.errors,encoding_table)[0] - -class IncrementalDecoder(codecs.IncrementalDecoder): - def decode(self, input, final=False): - return codecs.charmap_decode(input,self.errors,decoding_table)[0] - -class StreamWriter(Codec,codecs.StreamWriter): - pass - -class StreamReader(Codec,codecs.StreamReader): - pass - -### encodings module API - -def getregentry(): - return codecs.CodecInfo( - name='mac-centeuro', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) - - -### Decoding Table - -decoding_table = ( - '\x00' # 0x00 -> CONTROL CHARACTER - '\x01' # 0x01 -> CONTROL CHARACTER - '\x02' # 0x02 -> CONTROL CHARACTER - '\x03' # 0x03 -> CONTROL CHARACTER - '\x04' # 0x04 -> CONTROL CHARACTER - '\x05' # 0x05 -> CONTROL CHARACTER - '\x06' # 0x06 -> CONTROL CHARACTER - '\x07' # 0x07 -> CONTROL CHARACTER - '\x08' # 0x08 -> CONTROL CHARACTER - '\t' # 0x09 -> CONTROL CHARACTER - '\n' # 0x0A -> CONTROL CHARACTER - '\x0b' # 0x0B -> CONTROL CHARACTER - '\x0c' # 0x0C -> CONTROL CHARACTER - '\r' # 0x0D -> CONTROL CHARACTER - '\x0e' # 0x0E -> CONTROL CHARACTER - '\x0f' # 0x0F -> CONTROL CHARACTER - '\x10' # 0x10 -> CONTROL CHARACTER - '\x11' # 0x11 -> CONTROL CHARACTER - '\x12' # 0x12 -> CONTROL CHARACTER - '\x13' # 0x13 -> CONTROL CHARACTER - '\x14' # 0x14 -> CONTROL CHARACTER - '\x15' # 0x15 -> CONTROL CHARACTER - '\x16' # 0x16 -> CONTROL CHARACTER - '\x17' # 0x17 -> CONTROL CHARACTER - '\x18' # 0x18 -> CONTROL CHARACTER - '\x19' # 0x19 -> CONTROL CHARACTER - '\x1a' # 0x1A -> CONTROL CHARACTER - '\x1b' # 0x1B -> CONTROL CHARACTER - '\x1c' # 0x1C -> CONTROL CHARACTER - '\x1d' # 0x1D -> CONTROL CHARACTER - '\x1e' # 0x1E -> CONTROL CHARACTER - '\x1f' # 0x1F -> CONTROL CHARACTER - ' ' # 0x20 -> SPACE - '!' # 0x21 -> EXCLAMATION MARK - '"' # 0x22 -> QUOTATION MARK - '#' # 0x23 -> NUMBER SIGN - '$' # 0x24 -> DOLLAR SIGN - '%' # 0x25 -> PERCENT SIGN - '&' # 0x26 -> AMPERSAND - "'" # 0x27 -> APOSTROPHE - '(' # 0x28 -> LEFT PARENTHESIS - ')' # 0x29 -> RIGHT PARENTHESIS - '*' # 0x2A -> ASTERISK - '+' # 0x2B -> PLUS SIGN - ',' # 0x2C -> COMMA - '-' # 0x2D -> HYPHEN-MINUS - '.' # 0x2E -> FULL STOP - '/' # 0x2F -> SOLIDUS - '0' # 0x30 -> DIGIT ZERO - '1' # 0x31 -> DIGIT ONE - '2' # 0x32 -> DIGIT TWO - '3' # 0x33 -> DIGIT THREE - '4' # 0x34 -> DIGIT FOUR - '5' # 0x35 -> DIGIT FIVE - '6' # 0x36 -> DIGIT SIX - '7' # 0x37 -> DIGIT SEVEN - '8' # 0x38 -> DIGIT EIGHT - '9' # 0x39 -> DIGIT NINE - ':' # 0x3A -> COLON - ';' # 0x3B -> SEMICOLON - '<' # 0x3C -> LESS-THAN SIGN - '=' # 0x3D -> EQUALS SIGN - '>' # 0x3E -> GREATER-THAN SIGN - '?' # 0x3F -> QUESTION MARK - '@' # 0x40 -> COMMERCIAL AT - 'A' # 0x41 -> LATIN CAPITAL LETTER A - 'B' # 0x42 -> LATIN CAPITAL LETTER B - 'C' # 0x43 -> LATIN CAPITAL LETTER C - 'D' # 0x44 -> LATIN CAPITAL LETTER D - 'E' # 0x45 -> LATIN CAPITAL LETTER E - 'F' # 0x46 -> LATIN CAPITAL LETTER F - 'G' # 0x47 -> LATIN CAPITAL LETTER G - 'H' # 0x48 -> LATIN CAPITAL LETTER H - 'I' # 0x49 -> LATIN CAPITAL LETTER I - 'J' # 0x4A -> LATIN CAPITAL LETTER J - 'K' # 0x4B -> LATIN CAPITAL LETTER K - 'L' # 0x4C -> LATIN CAPITAL LETTER L - 'M' # 0x4D -> LATIN CAPITAL LETTER M - 'N' # 0x4E -> LATIN CAPITAL LETTER N - 'O' # 0x4F -> LATIN CAPITAL LETTER O - 'P' # 0x50 -> LATIN CAPITAL LETTER P - 'Q' # 0x51 -> LATIN CAPITAL LETTER Q - 'R' # 0x52 -> LATIN CAPITAL LETTER R - 'S' # 0x53 -> LATIN CAPITAL LETTER S - 'T' # 0x54 -> LATIN CAPITAL LETTER T - 'U' # 0x55 -> LATIN CAPITAL LETTER U - 'V' # 0x56 -> LATIN CAPITAL LETTER V - 'W' # 0x57 -> LATIN CAPITAL LETTER W - 'X' # 0x58 -> LATIN CAPITAL LETTER X - 'Y' # 0x59 -> LATIN CAPITAL LETTER Y - 'Z' # 0x5A -> LATIN CAPITAL LETTER Z - '[' # 0x5B -> LEFT SQUARE BRACKET - '\\' # 0x5C -> REVERSE SOLIDUS - ']' # 0x5D -> RIGHT SQUARE BRACKET - '^' # 0x5E -> CIRCUMFLEX ACCENT - '_' # 0x5F -> LOW LINE - '`' # 0x60 -> GRAVE ACCENT - 'a' # 0x61 -> LATIN SMALL LETTER A - 'b' # 0x62 -> LATIN SMALL LETTER B - 'c' # 0x63 -> LATIN SMALL LETTER C - 'd' # 0x64 -> LATIN SMALL LETTER D - 'e' # 0x65 -> LATIN SMALL LETTER E - 'f' # 0x66 -> LATIN SMALL LETTER F - 'g' # 0x67 -> LATIN SMALL LETTER G - 'h' # 0x68 -> LATIN SMALL LETTER H - 'i' # 0x69 -> LATIN SMALL LETTER I - 'j' # 0x6A -> LATIN SMALL LETTER J - 'k' # 0x6B -> LATIN SMALL LETTER K - 'l' # 0x6C -> LATIN SMALL LETTER L - 'm' # 0x6D -> LATIN SMALL LETTER M - 'n' # 0x6E -> LATIN SMALL LETTER N - 'o' # 0x6F -> LATIN SMALL LETTER O - 'p' # 0x70 -> LATIN SMALL LETTER P - 'q' # 0x71 -> LATIN SMALL LETTER Q - 'r' # 0x72 -> LATIN SMALL LETTER R - 's' # 0x73 -> LATIN SMALL LETTER S - 't' # 0x74 -> LATIN SMALL LETTER T - 'u' # 0x75 -> LATIN SMALL LETTER U - 'v' # 0x76 -> LATIN SMALL LETTER V - 'w' # 0x77 -> LATIN SMALL LETTER W - 'x' # 0x78 -> LATIN SMALL LETTER X - 'y' # 0x79 -> LATIN SMALL LETTER Y - 'z' # 0x7A -> LATIN SMALL LETTER Z - '{' # 0x7B -> LEFT CURLY BRACKET - '|' # 0x7C -> VERTICAL LINE - '}' # 0x7D -> RIGHT CURLY BRACKET - '~' # 0x7E -> TILDE - '\x7f' # 0x7F -> CONTROL CHARACTER - '\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS - '\u0100' # 0x81 -> LATIN CAPITAL LETTER A WITH MACRON - '\u0101' # 0x82 -> LATIN SMALL LETTER A WITH MACRON - '\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE - '\u0104' # 0x84 -> LATIN CAPITAL LETTER A WITH OGONEK - '\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS - '\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS - '\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE - '\u0105' # 0x88 -> LATIN SMALL LETTER A WITH OGONEK - '\u010c' # 0x89 -> LATIN CAPITAL LETTER C WITH CARON - '\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS - '\u010d' # 0x8B -> LATIN SMALL LETTER C WITH CARON - '\u0106' # 0x8C -> LATIN CAPITAL LETTER C WITH ACUTE - '\u0107' # 0x8D -> LATIN SMALL LETTER C WITH ACUTE - '\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE - '\u0179' # 0x8F -> LATIN CAPITAL LETTER Z WITH ACUTE - '\u017a' # 0x90 -> LATIN SMALL LETTER Z WITH ACUTE - '\u010e' # 0x91 -> LATIN CAPITAL LETTER D WITH CARON - '\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE - '\u010f' # 0x93 -> LATIN SMALL LETTER D WITH CARON - '\u0112' # 0x94 -> LATIN CAPITAL LETTER E WITH MACRON - '\u0113' # 0x95 -> LATIN SMALL LETTER E WITH MACRON - '\u0116' # 0x96 -> LATIN CAPITAL LETTER E WITH DOT ABOVE - '\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE - '\u0117' # 0x98 -> LATIN SMALL LETTER E WITH DOT ABOVE - '\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - '\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS - '\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE - '\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE - '\u011a' # 0x9D -> LATIN CAPITAL LETTER E WITH CARON - '\u011b' # 0x9E -> LATIN SMALL LETTER E WITH CARON - '\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS - '\u2020' # 0xA0 -> DAGGER - '\xb0' # 0xA1 -> DEGREE SIGN - '\u0118' # 0xA2 -> LATIN CAPITAL LETTER E WITH OGONEK - '\xa3' # 0xA3 -> POUND SIGN - '\xa7' # 0xA4 -> SECTION SIGN - '\u2022' # 0xA5 -> BULLET - '\xb6' # 0xA6 -> PILCROW SIGN - '\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S - '\xae' # 0xA8 -> REGISTERED SIGN - '\xa9' # 0xA9 -> COPYRIGHT SIGN - '\u2122' # 0xAA -> TRADE MARK SIGN - '\u0119' # 0xAB -> LATIN SMALL LETTER E WITH OGONEK - '\xa8' # 0xAC -> DIAERESIS - '\u2260' # 0xAD -> NOT EQUAL TO - '\u0123' # 0xAE -> LATIN SMALL LETTER G WITH CEDILLA - '\u012e' # 0xAF -> LATIN CAPITAL LETTER I WITH OGONEK - '\u012f' # 0xB0 -> LATIN SMALL LETTER I WITH OGONEK - '\u012a' # 0xB1 -> LATIN CAPITAL LETTER I WITH MACRON - '\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO - '\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO - '\u012b' # 0xB4 -> LATIN SMALL LETTER I WITH MACRON - '\u0136' # 0xB5 -> LATIN CAPITAL LETTER K WITH CEDILLA - '\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL - '\u2211' # 0xB7 -> N-ARY SUMMATION - '\u0142' # 0xB8 -> LATIN SMALL LETTER L WITH STROKE - '\u013b' # 0xB9 -> LATIN CAPITAL LETTER L WITH CEDILLA - '\u013c' # 0xBA -> LATIN SMALL LETTER L WITH CEDILLA - '\u013d' # 0xBB -> LATIN CAPITAL LETTER L WITH CARON - '\u013e' # 0xBC -> LATIN SMALL LETTER L WITH CARON - '\u0139' # 0xBD -> LATIN CAPITAL LETTER L WITH ACUTE - '\u013a' # 0xBE -> LATIN SMALL LETTER L WITH ACUTE - '\u0145' # 0xBF -> LATIN CAPITAL LETTER N WITH CEDILLA - '\u0146' # 0xC0 -> LATIN SMALL LETTER N WITH CEDILLA - '\u0143' # 0xC1 -> LATIN CAPITAL LETTER N WITH ACUTE - '\xac' # 0xC2 -> NOT SIGN - '\u221a' # 0xC3 -> SQUARE ROOT - '\u0144' # 0xC4 -> LATIN SMALL LETTER N WITH ACUTE - '\u0147' # 0xC5 -> LATIN CAPITAL LETTER N WITH CARON - '\u2206' # 0xC6 -> INCREMENT - '\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - '\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - '\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS - '\xa0' # 0xCA -> NO-BREAK SPACE - '\u0148' # 0xCB -> LATIN SMALL LETTER N WITH CARON - '\u0150' # 0xCC -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - '\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE - '\u0151' # 0xCE -> LATIN SMALL LETTER O WITH DOUBLE ACUTE - '\u014c' # 0xCF -> LATIN CAPITAL LETTER O WITH MACRON - '\u2013' # 0xD0 -> EN DASH - '\u2014' # 0xD1 -> EM DASH - '\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK - '\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK - '\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK - '\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK - '\xf7' # 0xD6 -> DIVISION SIGN - '\u25ca' # 0xD7 -> LOZENGE - '\u014d' # 0xD8 -> LATIN SMALL LETTER O WITH MACRON - '\u0154' # 0xD9 -> LATIN CAPITAL LETTER R WITH ACUTE - '\u0155' # 0xDA -> LATIN SMALL LETTER R WITH ACUTE - '\u0158' # 0xDB -> LATIN CAPITAL LETTER R WITH CARON - '\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK - '\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - '\u0159' # 0xDE -> LATIN SMALL LETTER R WITH CARON - '\u0156' # 0xDF -> LATIN CAPITAL LETTER R WITH CEDILLA - '\u0157' # 0xE0 -> LATIN SMALL LETTER R WITH CEDILLA - '\u0160' # 0xE1 -> LATIN CAPITAL LETTER S WITH CARON - '\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK - '\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK - '\u0161' # 0xE4 -> LATIN SMALL LETTER S WITH CARON - '\u015a' # 0xE5 -> LATIN CAPITAL LETTER S WITH ACUTE - '\u015b' # 0xE6 -> LATIN SMALL LETTER S WITH ACUTE - '\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE - '\u0164' # 0xE8 -> LATIN CAPITAL LETTER T WITH CARON - '\u0165' # 0xE9 -> LATIN SMALL LETTER T WITH CARON - '\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE - '\u017d' # 0xEB -> LATIN CAPITAL LETTER Z WITH CARON - '\u017e' # 0xEC -> LATIN SMALL LETTER Z WITH CARON - '\u016a' # 0xED -> LATIN CAPITAL LETTER U WITH MACRON - '\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE - '\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - '\u016b' # 0xF0 -> LATIN SMALL LETTER U WITH MACRON - '\u016e' # 0xF1 -> LATIN CAPITAL LETTER U WITH RING ABOVE - '\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE - '\u016f' # 0xF3 -> LATIN SMALL LETTER U WITH RING ABOVE - '\u0170' # 0xF4 -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - '\u0171' # 0xF5 -> LATIN SMALL LETTER U WITH DOUBLE ACUTE - '\u0172' # 0xF6 -> LATIN CAPITAL LETTER U WITH OGONEK - '\u0173' # 0xF7 -> LATIN SMALL LETTER U WITH OGONEK - '\xdd' # 0xF8 -> LATIN CAPITAL LETTER Y WITH ACUTE - '\xfd' # 0xF9 -> LATIN SMALL LETTER Y WITH ACUTE - '\u0137' # 0xFA -> LATIN SMALL LETTER K WITH CEDILLA - '\u017b' # 0xFB -> LATIN CAPITAL LETTER Z WITH DOT ABOVE - '\u0141' # 0xFC -> LATIN CAPITAL LETTER L WITH STROKE - '\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE - '\u0122' # 0xFE -> LATIN CAPITAL LETTER G WITH CEDILLA - '\u02c7' # 0xFF -> CARON -) - -### Encoding table -encoding_table=codecs.charmap_build(decoding_table) diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py index f3152a55d4430c0beb623d36ce0966e59cf10236..97dfa7ea71f8ff91b506dbd7d3e5fe5072f15a45 100644 --- a/Lib/ensurepip/__init__.py +++ b/Lib/ensurepip/__init__.py @@ -1,17 +1,21 @@ import os import os.path -import pkgutil import sys import runpy import tempfile +import subprocess +from importlib import resources + +from . import _bundled + __all__ = ["version", "bootstrap"] -_SETUPTOOLS_VERSION = "47.1.0" +_SETUPTOOLS_VERSION = "49.2.1" -_PIP_VERSION = "20.1.1" +_PIP_VERSION = "20.2.3" _PROJECTS = [ ("setuptools", _SETUPTOOLS_VERSION, "py3"), @@ -20,22 +24,18 @@ def _run_pip(args, additional_paths=None): - # Add our bundled software to the sys.path so we can import it - if additional_paths is not None: - sys.path = additional_paths + sys.path - - # Invoke pip as if it's the main module, and catch the exit. - backup_argv = sys.argv[:] - sys.argv[1:] = args - try: - # run_module() alters sys.modules and sys.argv, but restores them at exit - runpy.run_module("pip", run_name="__main__", alter_sys=True) - except SystemExit as exc: - return exc.code - finally: - sys.argv[:] = backup_argv - - raise SystemError("pip did not exit, this should never happen") + # Run the bootstraping in a subprocess to avoid leaking any state that happens + # after pip has executed. Particulary, this avoids the case when pip holds onto + # the files in *additional_paths*, preventing us to remove them at the end of the + # invocation. + code = f""" +import runpy +import sys +sys.path = {additional_paths or []} + sys.path +sys.argv[1:] = {args} +runpy.run_module("pip", run_name="__main__", alter_sys=True) +""" + return subprocess.run([sys.executable, "-c", code], check=True).returncode def version(): @@ -106,9 +106,9 @@ def _bootstrap(*, root=None, upgrade=False, user=False, additional_paths = [] for project, version, py_tag in _PROJECTS: wheel_name = "{}-{}-{}-none-any.whl".format(project, version, py_tag) - whl = pkgutil.get_data( - "ensurepip", - "_bundled/{}".format(wheel_name), + whl = resources.read_binary( + _bundled, + wheel_name, ) with open(os.path.join(tmpdir, wheel_name), "wb") as fp: fp.write(whl) diff --git a/Lib/ensurepip/_bundled/__init__.py b/Lib/ensurepip/_bundled/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Lib/ensurepip/_bundled/pip-20.1.1-py2.py3-none-any.whl b/Lib/ensurepip/_bundled/pip-20.2.3-py2.py3-none-any.whl similarity index 54% rename from Lib/ensurepip/_bundled/pip-20.1.1-py2.py3-none-any.whl rename to Lib/ensurepip/_bundled/pip-20.2.3-py2.py3-none-any.whl index ea1d0f7c8604a4cad61409c8ec927d5cac5e5c0e..7ebdc0f31d4e3ec28cab71df496213e7be7711bf 100644 Binary files a/Lib/ensurepip/_bundled/pip-20.1.1-py2.py3-none-any.whl and b/Lib/ensurepip/_bundled/pip-20.2.3-py2.py3-none-any.whl differ diff --git a/Lib/ensurepip/_bundled/setuptools-47.1.0-py3-none-any.whl b/Lib/ensurepip/_bundled/setuptools-49.2.1-py3-none-any.whl similarity index 54% rename from Lib/ensurepip/_bundled/setuptools-47.1.0-py3-none-any.whl rename to Lib/ensurepip/_bundled/setuptools-49.2.1-py3-none-any.whl index f87867ff98254ac4d8341d64f1dfa7b2cd7ae84e..308e2f2ed5ed9b3697944c8f8ff24d7853159891 100644 Binary files a/Lib/ensurepip/_bundled/setuptools-47.1.0-py3-none-any.whl and b/Lib/ensurepip/_bundled/setuptools-49.2.1-py3-none-any.whl differ diff --git a/Lib/enum.py b/Lib/enum.py index 14cc00e783915294e2a9e3a15b102ea5a8cb080c..1fddb1c75e8be44ccb253d8845c6f4e655704923 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -10,31 +10,54 @@ def _is_descriptor(obj): - """Returns True if obj is a descriptor, False otherwise.""" + """ + Returns True if obj is a descriptor, False otherwise. + """ return ( hasattr(obj, '__get__') or hasattr(obj, '__set__') or - hasattr(obj, '__delete__')) - + hasattr(obj, '__delete__') + ) def _is_dunder(name): - """Returns True if a __dunder__ name, False otherwise.""" - return (len(name) > 4 and + """ + Returns True if a __dunder__ name, False otherwise. + """ + return ( + len(name) > 4 and name[:2] == name[-2:] == '__' and name[2] != '_' and - name[-3] != '_') - + name[-3] != '_' + ) def _is_sunder(name): - """Returns True if a _sunder_ name, False otherwise.""" - return (len(name) > 2 and + """ + Returns True if a _sunder_ name, False otherwise. + """ + return ( + len(name) > 2 and name[0] == name[-1] == '_' and name[1:2] != '_' and - name[-2:-1] != '_') - + name[-2:-1] != '_' + ) + +def _is_private(cls_name, name): + # do not use `re` as `re` imports `enum` + pattern = '_%s__' % (cls_name, ) + if ( + len(name) >= 5 + and name.startswith(pattern) + and name[len(pattern)] != '_' + and (name[-1] != '_' or name[-2] != '_') + ): + return True + else: + return False def _make_class_unpicklable(cls): - """Make the given class un-picklable.""" + """ + Make the given class un-picklable. + """ def _break_on_call_reduce(self, proto): raise TypeError('%r cannot be pickled' % self) cls.__reduce_ex__ = _break_on_call_reduce @@ -49,11 +72,11 @@ class auto: class _EnumDict(dict): - """Track enum member order and ensure member names are not reused. + """ + Track enum member order and ensure member names are not reused. EnumMeta will use the names found in self._member_names as the enumeration member names. - """ def __init__(self): super().__init__() @@ -63,14 +86,22 @@ def __init__(self): self._auto_called = False def __setitem__(self, key, value): - """Changes anything not dundered or not a descriptor. + """ + Changes anything not dundered or not a descriptor. If an enum member name is used twice, an error is raised; duplicate values are not checked for. Single underscore (sunder) names are reserved. - """ + if _is_private(self._cls_name, key): + import warnings + warnings.warn( + "private variables, such as %r, will be normal attributes in 3.10" + % (key, ), + DeprecationWarning, + stacklevel=2, + ) if _is_sunder(key): if key not in ( '_order_', '_create_pseudo_member_', @@ -90,7 +121,10 @@ def __setitem__(self, key, value): self._ignore = value already = set(value) & set(self._member_names) if already: - raise ValueError('_ignore_ cannot specify already set names: %r' % (already, )) + raise ValueError( + '_ignore_ cannot specify already set names: %r' + % (already, ) + ) elif _is_dunder(key): if key == '__order__': key = '_order_' @@ -104,9 +138,14 @@ def __setitem__(self, key, value): # enum overwriting a descriptor? raise TypeError('%r already defined as: %r' % (key, self[key])) if isinstance(value, auto): - self._auto_called = True if value.value == _auto_null: - value.value = self._generate_next_value(key, 1, len(self._member_names), self._last_values[:]) + value.value = self._generate_next_value( + key, + 1, + len(self._member_names), + self._last_values[:], + ) + self._auto_called = True value = value.value self._member_names.append(key) self._last_values.append(value) @@ -118,20 +157,26 @@ def __setitem__(self, key, value): # This is also why there are checks in EnumMeta like `if Enum is not None` Enum = None - class EnumMeta(type): - """Metaclass for Enum""" + """ + Metaclass for Enum + """ @classmethod - def __prepare__(metacls, cls, bases): + def __prepare__(metacls, cls, bases, **kwds): + # check that previous enum members do not exist + metacls._check_for_existing_members(cls, bases) # create the namespace dict enum_dict = _EnumDict() + enum_dict._cls_name = cls # inherit previous flags and _generate_next_value_ function - member_type, first_enum = metacls._get_mixins_(bases) + member_type, first_enum = metacls._get_mixins_(cls, bases) if first_enum is not None: - enum_dict['_generate_next_value_'] = getattr(first_enum, '_generate_next_value_', None) + enum_dict['_generate_next_value_'] = getattr( + first_enum, '_generate_next_value_', None, + ) return enum_dict - def __new__(metacls, cls, bases, classdict): + def __new__(metacls, cls, bases, classdict, **kwds): # an Enum class is final once enumeration items have been defined; it # cannot be mixed with other types (int, float, etc.) if it has an # inherited __new__ unless a new __new__ is defined (or the resulting @@ -142,9 +187,10 @@ def __new__(metacls, cls, bases, classdict): ignore = classdict['_ignore_'] for key in ignore: classdict.pop(key, None) - member_type, first_enum = metacls._get_mixins_(bases) - __new__, save_new, use_args = metacls._find_new_(classdict, member_type, - first_enum) + member_type, first_enum = metacls._get_mixins_(cls, bases) + __new__, save_new, use_args = metacls._find_new_( + classdict, member_type, first_enum, + ) # save enum items into separate mapping so they don't get baked into # the new class @@ -165,17 +211,18 @@ def __new__(metacls, cls, bases, classdict): if '__doc__' not in classdict: classdict['__doc__'] = 'An enumeration.' - # create our new Enum type - enum_class = super().__new__(metacls, cls, bases, classdict) + enum_class = super().__new__(metacls, cls, bases, classdict, **kwds) enum_class._member_names_ = [] # names in definition order enum_class._member_map_ = {} # name->value map enum_class._member_type_ = member_type # save DynamicClassAttribute attributes from super classes so we know # if we can take the shortcut of storing members in the class dict - dynamic_attributes = {k for c in enum_class.mro() - for k, v in c.__dict__.items() - if isinstance(v, DynamicClassAttribute)} + dynamic_attributes = { + k for c in enum_class.mro() + for k, v in c.__dict__.items() + if isinstance(v, DynamicClassAttribute) + } # Reverse value->name map for hashable values. enum_class._value2member_map_ = {} @@ -249,7 +296,11 @@ def __new__(metacls, cls, bases, classdict): # double check that repr and friends are not the mixin's or various # things break (such as pickle) + # however, if the method is defined in the Enum itself, don't replace + # it for name in ('__repr__', '__str__', '__format__', '__reduce_ex__'): + if name in classdict: + continue class_method = getattr(enum_class, name) obj_method = getattr(member_type, name, None) enum_method = getattr(first_enum, name, None) @@ -281,7 +332,8 @@ def __bool__(self): return True def __call__(cls, value, names=None, *, module=None, qualname=None, type=None, start=1): - """Either returns an existing member, or creates a new enum class. + """ + Either returns an existing member, or creates a new enum class. This method is used both when an enum class is given a value to match to an enumeration member (i.e. Color(3)) and for the functional API @@ -303,12 +355,18 @@ def __call__(cls, value, names=None, *, module=None, qualname=None, type=None, s not correct, unpickling will fail in some circumstances. `type`, if set, will be mixed in as the first base class. - """ if names is None: # simple value lookup return cls.__new__(cls, value) # otherwise, functional API: we're creating a new Enum type - return cls._create_(value, names, module=module, qualname=qualname, type=type, start=start) + return cls._create_( + value, + names, + module=module, + qualname=qualname, + type=type, + start=start, + ) def __contains__(cls, member): if not isinstance(member, Enum): @@ -321,22 +379,23 @@ def __delattr__(cls, attr): # nicer error message when someone tries to delete an attribute # (see issue19025). if attr in cls._member_map_: - raise AttributeError( - "%s: cannot delete Enum member." % cls.__name__) + raise AttributeError("%s: cannot delete Enum member." % cls.__name__) super().__delattr__(attr) def __dir__(self): - return (['__class__', '__doc__', '__members__', '__module__'] + - self._member_names_) + return ( + ['__class__', '__doc__', '__members__', '__module__'] + + self._member_names_ + ) def __getattr__(cls, name): - """Return the enum member matching `name` + """ + Return the enum member matching `name` We use __getattr__ instead of descriptors or inserting into the enum class' __dict__ in order to support `name` and `value` being both properties for enum members (which live in the class' __dict__) and enum members themselves. - """ if _is_dunder(name): raise AttributeError(name) @@ -349,6 +408,9 @@ def __getitem__(cls, name): return cls._member_map_[name] def __iter__(cls): + """ + Returns members in definition order. + """ return (cls._member_map_[name] for name in cls._member_names_) def __len__(cls): @@ -356,11 +418,11 @@ def __len__(cls): @property def __members__(cls): - """Returns a mapping of member name->value. + """ + Returns a mapping of member name->value. This mapping lists all enum members, including aliases. Note that this is a read-only view of the internal mapping. - """ return MappingProxyType(cls._member_map_) @@ -368,15 +430,18 @@ def __repr__(cls): return "" % cls.__name__ def __reversed__(cls): + """ + Returns members in reverse definition order. + """ return (cls._member_map_[name] for name in reversed(cls._member_names_)) def __setattr__(cls, name, value): - """Block attempts to reassign Enum members. + """ + Block attempts to reassign Enum members. A simple assignment to the class namespace only changes one of the several possible ways to get an Enum member from the Enum class, resulting in an inconsistent Enumeration. - """ member_map = cls.__dict__.get('_member_map_', {}) if name in member_map: @@ -384,7 +449,8 @@ def __setattr__(cls, name, value): super().__setattr__(name, value) def _create_(cls, class_name, names, *, module=None, qualname=None, type=None, start=1): - """Convenience method to create a new Enum class. + """ + Convenience method to create a new Enum class. `names` can be: @@ -393,11 +459,10 @@ def _create_(cls, class_name, names, *, module=None, qualname=None, type=None, s * An iterable of member names. Values are incremented by 1 from `start`. * An iterable of (member name, value) pairs. * A mapping of member name -> value pairs. - """ metacls = cls.__class__ bases = (cls, ) if type is None else (type, cls) - _, first_enum = cls._get_mixins_(bases) + _, first_enum = cls._get_mixins_(cls, bases) classdict = metacls.__prepare__(class_name, bases) # special processing needed for names? @@ -425,7 +490,7 @@ def _create_(cls, class_name, names, *, module=None, qualname=None, type=None, s if module is None: try: module = sys._getframe(2).f_globals['__name__'] - except (AttributeError, ValueError, KeyError) as exc: + except (AttributeError, ValueError, KeyError): pass if module is None: _make_class_unpicklable(enum_class) @@ -469,32 +534,51 @@ def _convert_(cls, name, module, filter, source=None): module_globals[name] = cls return cls - def _convert(cls, *args, **kwargs): - import warnings - warnings.warn("_convert is deprecated and will be removed in 3.9, use " - "_convert_ instead.", DeprecationWarning, stacklevel=2) - return cls._convert_(*args, **kwargs) + @staticmethod + def _check_for_existing_members(class_name, bases): + for chain in bases: + for base in chain.__mro__: + if issubclass(base, Enum) and base._member_names_: + raise TypeError( + "%s: cannot extend enumeration %r" + % (class_name, base.__name__) + ) @staticmethod - def _get_mixins_(bases): - """Returns the type for creating enum members, and the first inherited + def _get_mixins_(class_name, bases): + """ + Returns the type for creating enum members, and the first inherited enum class. bases: the tuple of bases that was given to __new__ - """ if not bases: return object, Enum def _find_data_type(bases): + data_types = [] for chain in bases: + candidate = None for base in chain.__mro__: if base is object: continue + elif issubclass(base, Enum): + if base._member_type_ is not object: + data_types.append(base._member_type_) + break elif '__new__' in base.__dict__: if issubclass(base, Enum): continue - return base + data_types.append(candidate or base) + break + else: + candidate = base + if len(data_types) > 1: + raise TypeError('%r: too many data types: %r' % (class_name, data_types)) + elif data_types: + return data_types[0] + else: + return None # ensure final parent class is an Enum derivative, find any concrete # data type, and check that Enum has no members @@ -509,12 +593,12 @@ def _find_data_type(bases): @staticmethod def _find_new_(classdict, member_type, first_enum): - """Returns the __new__ to be used for creating the enum members. + """ + Returns the __new__ to be used for creating the enum members. classdict: the class dictionary given to __new__ member_type: the data type whose __new__ will be used by default first_enum: enumeration to check for an overriding __new__ - """ # now find the correct __new__, checking to see of one was defined # by the user; also check earlier enum classes in case a __new__ was @@ -554,10 +638,10 @@ def _find_new_(classdict, member_type, first_enum): class Enum(metaclass=EnumMeta): - """Generic enumeration. + """ + Generic enumeration. Derive from this class to define new enumerations. - """ def __new__(cls, value): # all enum instances are actually created during class construction @@ -588,7 +672,7 @@ def __new__(cls, value): if isinstance(result, cls): return result else: - ve_exc = ValueError("%r is not a valid %s" % (value, cls.__name__)) + ve_exc = ValueError("%r is not a valid %s" % (value, cls.__qualname__)) if result is None and exc is None: raise ve_exc elif exc is None: @@ -600,6 +684,14 @@ def __new__(cls, value): raise exc def _generate_next_value_(name, start, count, last_values): + """ + Generate the next value when not given. + + name: the name of the member + start: the initial start value or None + count: the number of existing members + last_value: the last value assigned or None + """ for last_value in reversed(last_values): try: return last_value + 1 @@ -610,7 +702,7 @@ def _generate_next_value_(name, start, count, last_values): @classmethod def _missing_(cls, value): - raise ValueError("%r is not a valid %s" % (value, cls.__name__)) + return None def __repr__(self): return "<%s.%s: %r>" % ( @@ -620,21 +712,28 @@ def __str__(self): return "%s.%s" % (self.__class__.__name__, self._name_) def __dir__(self): + """ + Returns all members and all public methods + """ added_behavior = [ m for cls in self.__class__.mro() for m in cls.__dict__ if m[0] != '_' and m not in self._member_map_ - ] + ] + [m for m in self.__dict__ if m[0] != '_'] return (['__class__', '__doc__', '__module__'] + added_behavior) def __format__(self, format_spec): + """ + Returns format using actual value type unless __str__ has been overridden. + """ # mixed-in Enums should use the mixed-in type's __format__, otherwise # we can get strange results with the Enum name showing up instead of # the value - # pure Enum branch - if self._member_type_ is object: + # pure Enum branch, or branch with __str__ explicitly overridden + str_overridden = type(self).__str__ not in (Enum.__str__, Flag.__str__) + if self._member_type_ is object or str_overridden: cls = str val = str(self) # mix-in branch @@ -675,7 +774,9 @@ def _reduce_ex_by_name(self, proto): return self.name class Flag(Enum): - """Support for flags""" + """ + Support for flags + """ def _generate_next_value_(name, start, count, last_values): """ @@ -698,6 +799,9 @@ def _generate_next_value_(name, start, count, last_values): @classmethod def _missing_(cls, value): + """ + Returns member (possibly creating it) if one can be found for value. + """ original_value = value if value < 0: value = ~value @@ -716,7 +820,7 @@ def _create_pseudo_member_(cls, value): # verify all bits are accounted for _, extra_flags = _decompose(cls, value) if extra_flags: - raise ValueError("%r is not a valid %s" % (value, cls.__name__)) + raise ValueError("%r is not a valid %s" % (value, cls.__qualname__)) # construct a singleton enum pseudo-member pseudo_member = object.__new__(cls) pseudo_member._name_ = None @@ -727,6 +831,9 @@ def _create_pseudo_member_(cls, value): return pseudo_member def __contains__(self, other): + """ + Returns True if self has at least the same flags set as other. + """ if not isinstance(other, self.__class__): raise TypeError( "unsupported operand type(s) for 'in': '%s' and '%s'" % ( @@ -785,17 +892,25 @@ def __invert__(self): class IntFlag(int, Flag): - """Support for integer-based Flags""" + """ + Support for integer-based Flags + """ @classmethod def _missing_(cls, value): + """ + Returns member (possibly creating it) if one can be found for value. + """ if not isinstance(value, int): - raise ValueError("%r is not a valid %s" % (value, cls.__name__)) + raise ValueError("%r is not a valid %s" % (value, cls.__qualname__)) new_member = cls._create_pseudo_member_(value) return new_member @classmethod def _create_pseudo_member_(cls, value): + """ + Create a composite member iff value contains only members. + """ pseudo_member = cls._value2member_map_.get(value, None) if pseudo_member is None: need_to_create = [value] @@ -850,11 +965,15 @@ def __invert__(self): def _high_bit(value): - """returns index of highest bit, or -1 if value is zero or negative""" + """ + returns index of highest bit, or -1 if value is zero or negative + """ return value.bit_length() - 1 def unique(enumeration): - """Class decorator for enumerations ensuring unique member values.""" + """ + Class decorator for enumerations ensuring unique member values. + """ duplicates = [] for name, member in enumeration.__members__.items(): if name != member.name: @@ -867,32 +986,26 @@ def unique(enumeration): return enumeration def _decompose(flag, value): - """Extract all members from the value.""" + """ + Extract all members from the value. + """ # _decompose is only called if the value is not named not_covered = value negative = value < 0 - # issue29167: wrap accesses to _value2member_map_ in a list to avoid race - # conditions between iterating over it and having more pseudo- - # members added to it - if negative: - # only check for named flags - flags_to_check = [ - (m, v) - for v, m in list(flag._value2member_map_.items()) - if m.name is not None - ] - else: - # check for named flags and powers-of-two flags - flags_to_check = [ - (m, v) - for v, m in list(flag._value2member_map_.items()) - if m.name is not None or _power_of_two(v) - ] members = [] - for member, member_value in flags_to_check: + for member in flag: + member_value = member.value if member_value and member_value & value == member_value: members.append(member) not_covered &= ~member_value + if not negative: + tmp = not_covered + while tmp: + flag_value = 2 ** _high_bit(tmp) + if flag_value in flag._value2member_map_: + members.append(flag._value2member_map_[flag_value]) + not_covered &= ~flag_value + tmp &= ~flag_value if not members and value in flag._value2member_map_: members.append(flag._value2member_map_[value]) members.sort(key=lambda m: m._value_, reverse=True) @@ -900,8 +1013,3 @@ def _decompose(flag, value): # we have the breakdown, don't need the value member itself members.pop(0) return members, not_covered - -def _power_of_two(value): - if value < 1: - return False - return value == 2 ** _high_bit(value) diff --git a/Lib/filecmp.py b/Lib/filecmp.py index e5ad8397e4c53956c1503d8abba134015da0a24f..7a4da6beb50500fb5291e88e2c6afb02483da38d 100644 --- a/Lib/filecmp.py +++ b/Lib/filecmp.py @@ -13,6 +13,7 @@ import os import stat from itertools import filterfalse +from types import GenericAlias __all__ = ['clear_cache', 'cmp', 'dircmp', 'cmpfiles', 'DEFAULT_IGNORES'] @@ -156,12 +157,12 @@ def phase2(self): # Distinguish files, directories, funnies ok = 1 try: a_stat = os.stat(a_path) - except OSError as why: + except OSError: # print('Can\'t stat', a_path, ':', why.args[1]) ok = 0 try: b_stat = os.stat(b_path) - except OSError as why: + except OSError: # print('Can\'t stat', b_path, ':', why.args[1]) ok = 0 @@ -247,6 +248,9 @@ def __getattr__(self, attr): self.methodmap[attr](self) return getattr(self, attr) + __class_getitem__ = classmethod(GenericAlias) + + def cmpfiles(a, b, common, shallow=True): """Compare common files in two directories. diff --git a/Lib/fileinput.py b/Lib/fileinput.py index c1b0ec9a8ed084f8b409bc7e81bab5dd53c0a294..0c31f93ed8f2e7eb34324381baf208c8555c387c 100644 --- a/Lib/fileinput.py +++ b/Lib/fileinput.py @@ -73,6 +73,7 @@ """ import sys, os +from types import GenericAlias __all__ = ["input", "close", "nextfile", "filename", "lineno", "filelineno", "fileno", "isfirstline", "isstdin", "FileInput", "hook_compressed", @@ -391,6 +392,8 @@ def isfirstline(self): def isstdin(self): return self._isstdin + __class_getitem__ = classmethod(GenericAlias) + def hook_compressed(filename, mode): ext = os.path.splitext(filename)[1] diff --git a/Lib/fnmatch.py b/Lib/fnmatch.py index b98e6413295e1ca278e164461cf151839d45a242..7c52c23067d40f3e808b160647ff3537823325ec 100644 --- a/Lib/fnmatch.py +++ b/Lib/fnmatch.py @@ -16,6 +16,12 @@ __all__ = ["filter", "fnmatch", "fnmatchcase", "translate"] +# Build a thread-safe incrementing counter to help create unique regexp group +# names across calls. +from itertools import count +_nextgroupnum = count().__next__ +del count + def fnmatch(name, pat): """Test whether FILENAME matches PATTERN. @@ -46,7 +52,7 @@ def _compile_pattern(pat): return re.compile(res).match def filter(names, pat): - """Return the subset of the list NAMES that match PAT.""" + """Construct a list from those elements of the iterable NAMES that match PAT.""" result = [] pat = os.path.normcase(pat) match = _compile_pattern(pat) @@ -77,15 +83,19 @@ def translate(pat): There is no way to quote meta-characters. """ + STAR = object() + res = [] + add = res.append i, n = 0, len(pat) - res = '' while i < n: c = pat[i] i = i+1 if c == '*': - res = res + '.*' + # compress consecutive `*` into one + if (not res) or res[-1] is not STAR: + add(STAR) elif c == '?': - res = res + '.' + add('.') elif c == '[': j = i if j < n and pat[j] == '!': @@ -95,7 +105,7 @@ def translate(pat): while j < n and pat[j] != ']': j = j+1 if j >= n: - res = res + '\\[' + add('\\[') else: stuff = pat[i:j] if '--' not in stuff: @@ -122,7 +132,52 @@ def translate(pat): stuff = '^' + stuff[1:] elif stuff[0] in ('^', '['): stuff = '\\' + stuff - res = '%s[%s]' % (res, stuff) + add(f'[{stuff}]') + else: + add(re.escape(c)) + assert i == n + + # Deal with STARs. + inp = res + res = [] + add = res.append + i, n = 0, len(inp) + # Fixed pieces at the start? + while i < n and inp[i] is not STAR: + add(inp[i]) + i += 1 + # Now deal with STAR fixed STAR fixed ... + # For an interior `STAR fixed` pairing, we want to do a minimal + # .*? match followed by `fixed`, with no possibility of backtracking. + # We can't spell that directly, but can trick it into working by matching + # .*?fixed + # in a lookahead assertion, save the matched part in a group, then + # consume that group via a backreference. If the overall match fails, + # the lookahead assertion won't try alternatives. So the translation is: + # (?=(?P.*?fixed))(?P=name) + # Group names are created as needed: g0, g1, g2, ... + # The numbers are obtained from _nextgroupnum() to ensure they're unique + # across calls and across threads. This is because people rely on the + # undocumented ability to join multiple translate() results together via + # "|" to build large regexps matching "one of many" shell patterns. + while i < n: + assert inp[i] is STAR + i += 1 + if i == n: + add(".*") + break + assert inp[i] is not STAR + fixed = [] + while i < n and inp[i] is not STAR: + fixed.append(inp[i]) + i += 1 + fixed = "".join(fixed) + if i == n: + add(".*") + add(fixed) else: - res = res + re.escape(c) - return r'(?s:%s)\Z' % res + groupnum = _nextgroupnum() + add(f"(?=(?P.*?{fixed}))(?P=g{groupnum})") + assert i == n + res = "".join(res) + return fr'(?s:{res})\Z' diff --git a/Lib/fractions.py b/Lib/fractions.py index e4fcc8901bbf40e18d52ca7e8075e9252219d074..de3e23b759227c3bc03cc299f272b12c513399cc 100644 --- a/Lib/fractions.py +++ b/Lib/fractions.py @@ -10,31 +10,9 @@ import re import sys -__all__ = ['Fraction', 'gcd'] +__all__ = ['Fraction'] - -def gcd(a, b): - """Calculate the Greatest Common Divisor of a and b. - - Unless b==0, the result will have the same sign as b (so that when - b is divided by it, the result comes out positive). - """ - import warnings - warnings.warn('fractions.gcd() is deprecated. Use math.gcd() instead.', - DeprecationWarning, 2) - if type(a) is int is type(b): - if (b or a) < 0: - return -math.gcd(a, b) - return math.gcd(a, b) - return _gcd(a, b) - -def _gcd(a, b): - # Supports non-integers for backward compatibility. - while b: - a, b = b, a%b - return a - # Constants related to the hash implementation; hash(x) is based # on the reduction of x modulo the prime _PyHASH_MODULUS. _PyHASH_MODULUS = sys.hash_info.modulus @@ -177,13 +155,9 @@ def __new__(cls, numerator=0, denominator=None, *, _normalize=True): if denominator == 0: raise ZeroDivisionError('Fraction(%s, 0)' % numerator) if _normalize: - if type(numerator) is int is type(denominator): - # *very* normal case - g = math.gcd(numerator, denominator) - if denominator < 0: - g = -g - else: - g = _gcd(numerator, denominator) + g = math.gcd(numerator, denominator) + if denominator < 0: + g = -g numerator //= g denominator //= g self._numerator = numerator @@ -556,23 +530,34 @@ def __round__(self, ndigits=None): def __hash__(self): """hash(self)""" - # XXX since this method is expensive, consider caching the result - - # In order to make sure that the hash of a Fraction agrees - # with the hash of a numerically equal integer, float or - # Decimal instance, we follow the rules for numeric hashes - # outlined in the documentation. (See library docs, 'Built-in - # Types'). + # To make sure that the hash of a Fraction agrees with the hash + # of a numerically equal integer, float or Decimal instance, we + # follow the rules for numeric hashes outlined in the + # documentation. (See library docs, 'Built-in Types'). - # dinv is the inverse of self._denominator modulo the prime - # _PyHASH_MODULUS, or 0 if self._denominator is divisible by - # _PyHASH_MODULUS. - dinv = pow(self._denominator, _PyHASH_MODULUS - 2, _PyHASH_MODULUS) - if not dinv: + try: + dinv = pow(self._denominator, -1, _PyHASH_MODULUS) + except ValueError: + # ValueError means there is no modular inverse. hash_ = _PyHASH_INF else: - hash_ = abs(self._numerator) * dinv % _PyHASH_MODULUS - result = hash_ if self >= 0 else -hash_ + # The general algorithm now specifies that the absolute value of + # the hash is + # (|N| * dinv) % P + # where N is self._numerator and P is _PyHASH_MODULUS. That's + # optimized here in two ways: first, for a non-negative int i, + # hash(i) == i % P, but the int hash implementation doesn't need + # to divide, and is faster than doing % P explicitly. So we do + # hash(|N| * dinv) + # instead. Second, N is unbounded, so its product with dinv may + # be arbitrarily expensive to compute. The final answer is the + # same if we use the bounded |N| % P instead, which can again + # be done with an int hash() call. If 0 <= i < P, hash(i) == i, + # so this nested hash() call wastes a bit of time making a + # redundant copy when |N| < P, but can save an arbitrarily large + # amount of computation for large |N|. + hash_ = hash(hash(abs(self._numerator)) * dinv) + result = hash_ if self._numerator >= 0 else -hash_ return -2 if result == -1 else result def __eq__(a, b): diff --git a/Lib/ftplib.py b/Lib/ftplib.py index 58a46bca4a36711a155f5df9028a4fd5b7e727bb..1f760ed1ce0bf09e7355f54a90393f6c4ee8cf57 100644 --- a/Lib/ftplib.py +++ b/Lib/ftplib.py @@ -72,17 +72,17 @@ class error_proto(Error): pass # response does not begin with [1-5] # The class itself class FTP: - '''An FTP client class. To create a connection, call the class using these arguments: - host, user, passwd, acct, timeout + host, user, passwd, acct, timeout, source_address, encoding The first four arguments are all strings, and have default value ''. - timeout must be numeric and defaults to None if not passed, - meaning that no timeout will be set on any ftp socket(s) + The parameter ´timeout´ must be numeric and defaults to None if not + passed, meaning that no timeout will be set on any ftp socket(s). If a timeout is passed, then this is now the default timeout for all ftp socket operations for this instance. + The last parameter is the encoding of filenames, which defaults to utf-8. Then use self.connect() with optional host and port argument. @@ -103,14 +103,16 @@ class FTP: file = None welcome = None passiveserver = 1 - encoding = "latin-1" - # Initialization method (called by class instantiation). - # Initialize host to localhost, port to standard ftp port - # Optional arguments are host (for connect()), - # and user, passwd, acct (for login()) def __init__(self, host='', user='', passwd='', acct='', - timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=None): + timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=None, *, + encoding='utf-8'): + """Initialization method (called by class instantiation). + Initialize host to localhost, port to standard ftp port. + Optional arguments are host (for connect()), + and user, passwd, acct (for login()). + """ + self.encoding = encoding self.source_address = source_address self.timeout = timeout if host: @@ -146,6 +148,8 @@ def connect(self, host='', port=0, timeout=-999, source_address=None): self.port = port if timeout != -999: self.timeout = timeout + if self.timeout is not None and not self.timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') if source_address is not None: self.source_address = source_address sys.audit("ftplib.connect", self, self.host, self.port) @@ -704,9 +708,10 @@ class FTP_TLS(FTP): ''' ssl_version = ssl.PROTOCOL_TLS_CLIENT - def __init__(self, host='', user='', passwd='', acct='', keyfile=None, - certfile=None, context=None, - timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=None): + def __init__(self, host='', user='', passwd='', acct='', + keyfile=None, certfile=None, context=None, + timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=None, *, + encoding='utf-8'): if context is not None and keyfile is not None: raise ValueError("context and keyfile arguments are mutually " "exclusive") @@ -725,12 +730,13 @@ def __init__(self, host='', user='', passwd='', acct='', keyfile=None, keyfile=keyfile) self.context = context self._prot_p = False - FTP.__init__(self, host, user, passwd, acct, timeout, source_address) + super().__init__(host, user, passwd, acct, + timeout, source_address, encoding=encoding) def login(self, user='', passwd='', acct='', secure=True): if secure and not isinstance(self.sock, ssl.SSLSocket): self.auth() - return FTP.login(self, user, passwd, acct) + return super().login(user, passwd, acct) def auth(self): '''Set up secure control connection by using TLS/SSL.''' @@ -740,8 +746,7 @@ def auth(self): resp = self.voidcmd('AUTH TLS') else: resp = self.voidcmd('AUTH SSL') - self.sock = self.context.wrap_socket(self.sock, - server_hostname=self.host) + self.sock = self.context.wrap_socket(self.sock, server_hostname=self.host) self.file = self.sock.makefile(mode='r', encoding=self.encoding) return resp @@ -778,7 +783,7 @@ def prot_c(self): # --- Overridden FTP methods def ntransfercmd(self, cmd, rest=None): - conn, size = FTP.ntransfercmd(self, cmd, rest) + conn, size = super().ntransfercmd(cmd, rest) if self._prot_p: conn = self.context.wrap_socket(conn, server_hostname=self.host) @@ -823,7 +828,6 @@ def parse227(resp): '''Parse the '227' response for a PASV request. Raises error_proto if it does not contain '(h1,h2,h3,h4,p1,p2)' Return ('host.addr.as.numbers', port#) tuple.''' - if resp[:3] != '227': raise error_reply(resp) global _227_re @@ -843,7 +847,6 @@ def parse229(resp, peer): '''Parse the '229' response for an EPSV request. Raises error_proto if it does not contain '(|||port|)' Return ('host.addr.as.numbers', port#) tuple.''' - if resp[:3] != '229': raise error_reply(resp) left = resp.find('(') @@ -865,7 +868,6 @@ def parse257(resp): '''Parse the '257' response for a MKD or PWD request. This is a response to a MKD or PWD request: a directory name. Returns the directoryname in the 257 reply.''' - if resp[:3] != '257': raise error_reply(resp) if resp[3:5] != ' "': diff --git a/Lib/functools.py b/Lib/functools.py index 4cde5f590cf29043e8a15ad582001025eb27cf96..5cab497d264037b6dae2d647ce13a1f75663ef5d 100644 --- a/Lib/functools.py +++ b/Lib/functools.py @@ -10,15 +10,16 @@ # See C source code for _functools credits/copyright __all__ = ['update_wrapper', 'wraps', 'WRAPPER_ASSIGNMENTS', 'WRAPPER_UPDATES', - 'total_ordering', 'cmp_to_key', 'lru_cache', 'reduce', 'partial', - 'partialmethod', 'singledispatch', 'singledispatchmethod', - "cached_property"] + 'total_ordering', 'cache', 'cmp_to_key', 'lru_cache', 'reduce', + 'partial', 'partialmethod', 'singledispatch', 'singledispatchmethod', + 'cached_property'] from abc import get_cache_token from collections import namedtuple # import types, weakref # Deferred to single_dispatch() from reprlib import recursive_repr from _thread import RLock +from types import GenericAlias ################################################################################ @@ -95,6 +96,8 @@ def _gt_from_lt(self, other, NotImplemented=NotImplemented): def _le_from_lt(self, other, NotImplemented=NotImplemented): 'Return a <= b. Computed by @total_ordering from (a < b) or (a == b).' op_result = self.__lt__(other) + if op_result is NotImplemented: + return op_result return op_result or self == other def _ge_from_lt(self, other, NotImplemented=NotImplemented): @@ -135,6 +138,8 @@ def _lt_from_gt(self, other, NotImplemented=NotImplemented): def _ge_from_gt(self, other, NotImplemented=NotImplemented): 'Return a >= b. Computed by @total_ordering from (a > b) or (a == b).' op_result = self.__gt__(other) + if op_result is NotImplemented: + return op_result return op_result or self == other def _le_from_gt(self, other, NotImplemented=NotImplemented): @@ -346,23 +351,7 @@ class partialmethod(object): callables as instance methods. """ - def __init__(*args, **keywords): - if len(args) >= 2: - self, func, *args = args - elif not args: - raise TypeError("descriptor '__init__' of partialmethod " - "needs an argument") - elif 'func' in keywords: - func = keywords.pop('func') - self, *args = args - import warnings - warnings.warn("Passing 'func' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError("type 'partialmethod' takes at least one argument, " - "got %d" % (len(args)-1)) - args = tuple(args) - + def __init__(self, func, /, *args, **keywords): if not callable(func) and not hasattr(func, "__get__"): raise TypeError("{!r} is not callable or a descriptor" .format(func)) @@ -380,7 +369,6 @@ def __init__(*args, **keywords): self.func = func self.args = args self.keywords = keywords - __init__.__text_signature__ = '($self, func, /, *args, **keywords)' def __repr__(self): args = ", ".join(map(repr, self.args)) @@ -424,6 +412,9 @@ def __get__(self, obj, cls=None): def __isabstractmethod__(self): return getattr(self.func, "__isabstractmethod__", False) + __class_getitem__ = classmethod(GenericAlias) + + # Helper functions def _unwrap_partial(func): @@ -517,6 +508,7 @@ def lru_cache(maxsize=128, typed=False): # The user_function was passed in directly via the maxsize argument user_function, maxsize = maxsize, 128 wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo) + wrapper.cache_parameters = lambda : {'maxsize': maxsize, 'typed': typed} return update_wrapper(wrapper, user_function) elif maxsize is not None: raise TypeError( @@ -524,6 +516,7 @@ def lru_cache(maxsize=128, typed=False): def decorating_function(user_function): wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo) + wrapper.cache_parameters = lambda : {'maxsize': maxsize, 'typed': typed} return update_wrapper(wrapper, user_function) return decorating_function @@ -650,6 +643,15 @@ def cache_clear(): pass +################################################################################ +### cache -- simplified access to the infinity cache +################################################################################ + +def cache(user_function, /): + 'Simple lightweight unbounded cache. Sometimes called "memoize".' + return lru_cache(maxsize=None)(user_function) + + ################################################################################ ### singledispatch() - single-dispatch generic function decorator ################################################################################ @@ -974,3 +976,5 @@ def __get__(self, instance, owner=None): ) raise TypeError(msg) from None return val + + __class_getitem__ = classmethod(GenericAlias) diff --git a/Lib/getpass.py b/Lib/getpass.py index 36e17e4cb6965db548f445e8e9f156da27d2109b..6911f41d1f2054e73114eb101a0a2d3c102a1b15 100644 --- a/Lib/getpass.py +++ b/Lib/getpass.py @@ -52,7 +52,7 @@ def unix_getpass(prompt='Password: ', stream=None): stack.enter_context(input) if not stream: stream = input - except OSError as e: + except OSError: # If that fails, see if stdin can be controlled. stack.close() try: diff --git a/Lib/gettext.py b/Lib/gettext.py index b98f501884b75a4e7d14ca124ad672938a99e541..77b67aef4204c909931d6eb1f75854324ef796a9 100644 --- a/Lib/gettext.py +++ b/Lib/gettext.py @@ -46,7 +46,6 @@ # find this format documented anywhere. -import locale import os import re import sys @@ -210,6 +209,7 @@ def func(n): def _expand_lang(loc): + import locale loc = locale.normalize(loc) COMPONENT_CODESET = 1 << 0 COMPONENT_TERRITORY = 1 << 1 @@ -278,6 +278,7 @@ def lgettext(self, message): import warnings warnings.warn('lgettext() is deprecated, use gettext() instead', DeprecationWarning, 2) + import locale if self._fallback: with warnings.catch_warnings(): warnings.filterwarnings('ignore', r'.*\blgettext\b.*', @@ -299,6 +300,7 @@ def lngettext(self, msgid1, msgid2, n): import warnings warnings.warn('lngettext() is deprecated, use ngettext() instead', DeprecationWarning, 2) + import locale if self._fallback: with warnings.catch_warnings(): warnings.filterwarnings('ignore', r'.*\blngettext\b.*', @@ -462,6 +464,7 @@ def lgettext(self, message): import warnings warnings.warn('lgettext() is deprecated, use gettext() instead', DeprecationWarning, 2) + import locale missing = object() tmsg = self._catalog.get(message, missing) if tmsg is missing: @@ -476,6 +479,7 @@ def lngettext(self, msgid1, msgid2, n): import warnings warnings.warn('lngettext() is deprecated, use ngettext() instead', DeprecationWarning, 2) + import locale try: tmsg = self._catalog[(msgid1, self.plural(n))] except KeyError: @@ -668,6 +672,7 @@ def ldgettext(domain, message): import warnings warnings.warn('ldgettext() is deprecated, use dgettext() instead', DeprecationWarning, 2) + import locale codeset = _localecodesets.get(domain) try: with warnings.catch_warnings(): @@ -695,6 +700,7 @@ def ldngettext(domain, msgid1, msgid2, n): import warnings warnings.warn('ldngettext() is deprecated, use dngettext() instead', DeprecationWarning, 2) + import locale codeset = _localecodesets.get(domain) try: with warnings.catch_warnings(): diff --git a/Lib/graphlib.py b/Lib/graphlib.py new file mode 100644 index 0000000000000000000000000000000000000000..d0e7a4814c565dc8cd0ccba81c25fa439978c478 --- /dev/null +++ b/Lib/graphlib.py @@ -0,0 +1,246 @@ +__all__ = ["TopologicalSorter", "CycleError"] + +_NODE_OUT = -1 +_NODE_DONE = -2 + + +class _NodeInfo: + __slots__ = "node", "npredecessors", "successors" + + def __init__(self, node): + # The node this class is augmenting. + self.node = node + + # Number of predecessors, generally >= 0. When this value falls to 0, + # and is returned by get_ready(), this is set to _NODE_OUT and when the + # node is marked done by a call to done(), set to _NODE_DONE. + self.npredecessors = 0 + + # List of successor nodes. The list can contain duplicated elements as + # long as they're all reflected in the successor's npredecessors attribute). + self.successors = [] + + +class CycleError(ValueError): + """Subclass of ValueError raised by TopologicalSorter.prepare if cycles + exist in the working graph. + + If multiple cycles exist, only one undefined choice among them will be reported + and included in the exception. The detected cycle can be accessed via the second + element in the *args* attribute of the exception instance and consists in a list + of nodes, such that each node is, in the graph, an immediate predecessor of the + next node in the list. In the reported list, the first and the last node will be + the same, to make it clear that it is cyclic. + """ + + pass + + +class TopologicalSorter: + """Provides functionality to topologically sort a graph of hashable nodes""" + + def __init__(self, graph=None): + self._node2info = {} + self._ready_nodes = None + self._npassedout = 0 + self._nfinished = 0 + + if graph is not None: + for node, predecessors in graph.items(): + self.add(node, *predecessors) + + def _get_nodeinfo(self, node): + if (result := self._node2info.get(node)) is None: + self._node2info[node] = result = _NodeInfo(node) + return result + + def add(self, node, *predecessors): + """Add a new node and its predecessors to the graph. + + Both the *node* and all elements in *predecessors* must be hashable. + + If called multiple times with the same node argument, the set of dependencies + will be the union of all dependencies passed in. + + It is possible to add a node with no dependencies (*predecessors* is not provided) + as well as provide a dependency twice. If a node that has not been provided before + is included among *predecessors* it will be automatically added to the graph with + no predecessors of its own. + + Raises ValueError if called after "prepare". + """ + if self._ready_nodes is not None: + raise ValueError("Nodes cannot be added after a call to prepare()") + + # Create the node -> predecessor edges + nodeinfo = self._get_nodeinfo(node) + nodeinfo.npredecessors += len(predecessors) + + # Create the predecessor -> node edges + for pred in predecessors: + pred_info = self._get_nodeinfo(pred) + pred_info.successors.append(node) + + def prepare(self): + """Mark the graph as finished and check for cycles in the graph. + + If any cycle is detected, "CycleError" will be raised, but "get_ready" can + still be used to obtain as many nodes as possible until cycles block more + progress. After a call to this function, the graph cannot be modified and + therefore no more nodes can be added using "add". + """ + if self._ready_nodes is not None: + raise ValueError("cannot prepare() more than once") + + self._ready_nodes = [ + i.node for i in self._node2info.values() if i.npredecessors == 0 + ] + # ready_nodes is set before we look for cycles on purpose: + # if the user wants to catch the CycleError, that's fine, + # they can continue using the instance to grab as many + # nodes as possible before cycles block more progress + cycle = self._find_cycle() + if cycle: + raise CycleError(f"nodes are in a cycle", cycle) + + def get_ready(self): + """Return a tuple of all the nodes that are ready. + + Initially it returns all nodes with no predecessors; once those are marked + as processed by calling "done", further calls will return all new nodes that + have all their predecessors already processed. Once no more progress can be made, + empty tuples are returned. + + Raises ValueError if called without calling "prepare" previously. + """ + if self._ready_nodes is None: + raise ValueError("prepare() must be called first") + + # Get the nodes that are ready and mark them + result = tuple(self._ready_nodes) + n2i = self._node2info + for node in result: + n2i[node].npredecessors = _NODE_OUT + + # Clean the list of nodes that are ready and update + # the counter of nodes that we have returned. + self._ready_nodes.clear() + self._npassedout += len(result) + + return result + + def is_active(self): + """Return ``True`` if more progress can be made and ``False`` otherwise. + + Progress can be made if cycles do not block the resolution and either there + are still nodes ready that haven't yet been returned by "get_ready" or the + number of nodes marked "done" is less than the number that have been returned + by "get_ready". + + Raises ValueError if called without calling "prepare" previously. + """ + if self._ready_nodes is None: + raise ValueError("prepare() must be called first") + return self._nfinished < self._npassedout or bool(self._ready_nodes) + + def __bool__(self): + return self.is_active() + + def done(self, *nodes): + """Marks a set of nodes returned by "get_ready" as processed. + + This method unblocks any successor of each node in *nodes* for being returned + in the future by a call to "get_ready". + + Raises :exec:`ValueError` if any node in *nodes* has already been marked as + processed by a previous call to this method, if a node was not added to the + graph by using "add" or if called without calling "prepare" previously or if + node has not yet been returned by "get_ready". + """ + + if self._ready_nodes is None: + raise ValueError("prepare() must be called first") + + n2i = self._node2info + + for node in nodes: + + # Check if we know about this node (it was added previously using add() + if (nodeinfo := n2i.get(node)) is None: + raise ValueError(f"node {node!r} was not added using add()") + + # If the node has not being returned (marked as ready) previously, inform the user. + stat = nodeinfo.npredecessors + if stat != _NODE_OUT: + if stat >= 0: + raise ValueError( + f"node {node!r} was not passed out (still not ready)" + ) + elif stat == _NODE_DONE: + raise ValueError(f"node {node!r} was already marked done") + else: + assert False, f"node {node!r}: unknown status {stat}" + + # Mark the node as processed + nodeinfo.npredecessors = _NODE_DONE + + # Go to all the successors and reduce the number of predecessors, collecting all the ones + # that are ready to be returned in the next get_ready() call. + for successor in nodeinfo.successors: + successor_info = n2i[successor] + successor_info.npredecessors -= 1 + if successor_info.npredecessors == 0: + self._ready_nodes.append(successor) + self._nfinished += 1 + + def _find_cycle(self): + n2i = self._node2info + stack = [] + itstack = [] + seen = set() + node2stacki = {} + + for node in n2i: + if node in seen: + continue + + while True: + if node in seen: + # If we have seen already the node and is in the + # current stack we have found a cycle. + if node in node2stacki: + return stack[node2stacki[node] :] + [node] + # else go on to get next successor + else: + seen.add(node) + itstack.append(iter(n2i[node].successors).__next__) + node2stacki[node] = len(stack) + stack.append(node) + + # Backtrack to the topmost stack entry with + # at least another successor. + while stack: + try: + node = itstack[-1]() + break + except StopIteration: + del node2stacki[stack.pop()] + itstack.pop() + else: + break + return None + + def static_order(self): + """Returns an iterable of nodes in a topological order. + + The particular order that is returned may depend on the specific + order in which the items were inserted in the graph. + + Using this method does not require to call "prepare" or "done". If any + cycle is detected, :exc:`CycleError` will be raised. + """ + self.prepare() + while self.is_active(): + node_group = self.get_ready() + yield from node_group + self.done(*node_group) diff --git a/Lib/gzip.py b/Lib/gzip.py index 87b553df66cd8504b27e99f5cc9e8e7970745ae7..e422773b3edfb7082062b0b97f5a0833a04ade5e 100644 --- a/Lib/gzip.py +++ b/Lib/gzip.py @@ -177,6 +177,7 @@ def __init__(self, filename=None, mode=None, filename = '' else: filename = os.fspath(filename) + origmode = mode if mode is None: mode = getattr(fileobj, 'mode', 'rb') @@ -187,6 +188,13 @@ def __init__(self, filename=None, mode=None, self.name = filename elif mode.startswith(('w', 'a', 'x')): + if origmode is None: + import warnings + warnings.warn( + "GzipFile was opened for writing, but this will " + "change in future Python releases. " + "Specify the mode argument for opening it for writing.", + FutureWarning, 2) self.mode = WRITE self._init_write(filename) self.compress = zlib.compressobj(compresslevel, diff --git a/Lib/hashlib.py b/Lib/hashlib.py index 56873b7278b6afc3ac2a50e9503f882cd280609e..58c340d56e3ba510b32c7fabac91fa64982be046 100644 --- a/Lib/hashlib.py +++ b/Lib/hashlib.py @@ -70,9 +70,12 @@ __builtin_constructor_cache = {} +# Prefer our blake2 implementation +# OpenSSL 1.1.0 comes with a limited implementation of blake2b/s. The OpenSSL +# implementations neither support keyed blake2 (blake2 MAC) nor advanced +# features like salt, personalization, or tree hashing. OpenSSL hash-only +# variants are available as 'blake2b512' and 'blake2s256', though. __block_openssl_constructor = { - 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', - 'shake_128', 'shake_256', 'blake2b', 'blake2s', } @@ -122,13 +125,16 @@ def __get_builtin_constructor(name): def __get_openssl_constructor(name): if name in __block_openssl_constructor: - # Prefer our blake2 and sha3 implementation. + # Prefer our builtin blake2 implementation. return __get_builtin_constructor(name) try: + # MD5, SHA1, and SHA2 are in all supported OpenSSL versions + # SHA3/shake are available in OpenSSL 1.1.1+ f = getattr(_hashlib, 'openssl_' + name) # Allow the C module to raise ValueError. The function will be - # defined but the hash not actually available thanks to OpenSSL. - f() + # defined but the hash not actually available. Don't fall back to + # builtin if the current security policy blocks a digest, bpo#40695. + f(usedforsecurity=False) # Use the C function directly (very fast) return f except (AttributeError, ValueError): @@ -148,13 +154,10 @@ def __hash_new(name, data=b'', **kwargs): optionally initialized with data (which must be a bytes-like object). """ if name in __block_openssl_constructor: - # Prefer our blake2 and sha3 implementation - # OpenSSL 1.1.0 comes with a limited implementation of blake2b/s. - # It does neither support keyed blake2 nor advanced features like - # salt, personal, tree hashing or SSE. + # Prefer our builtin blake2 implementation. return __get_builtin_constructor(name)(data, **kwargs) try: - return _hashlib.new(name, data) + return _hashlib.new(name, data, **kwargs) except ValueError: # If the _hashlib module (OpenSSL) doesn't support the named # hash, try using our builtin implementations. diff --git a/Lib/hmac.py b/Lib/hmac.py index b769876e6f7745d82986e4d5b15e3b970f1a0c3c..180bc378b52d6214ccde61d53adb9a05ba311113 100644 --- a/Lib/hmac.py +++ b/Lib/hmac.py @@ -4,14 +4,15 @@ """ import warnings as _warnings -from _operator import _compare_digest as compare_digest try: import _hashlib as _hashopenssl except ImportError: _hashopenssl = None _openssl_md_meths = None + from _operator import _compare_digest as compare_digest else: _openssl_md_meths = frozenset(_hashopenssl.openssl_md_meth_names) + compare_digest = _hashopenssl.compare_digest import hashlib as _hashlib trans_5C = bytes((x ^ 0x5C) for x in range(256)) @@ -30,6 +31,10 @@ class HMAC: """ blocksize = 64 # 512-bit HMAC; can be changed in subclasses. + __slots__ = ( + "_digest_cons", "_inner", "_outer", "block_size", "digest_size" + ) + def __init__(self, key, msg=None, digestmod=''): """Create a new HMAC object. @@ -51,18 +56,18 @@ def __init__(self, key, msg=None, digestmod=''): raise TypeError("Missing required parameter 'digestmod'.") if callable(digestmod): - self.digest_cons = digestmod + self._digest_cons = digestmod elif isinstance(digestmod, str): - self.digest_cons = lambda d=b'': _hashlib.new(digestmod, d) + self._digest_cons = lambda d=b'': _hashlib.new(digestmod, d) else: - self.digest_cons = lambda d=b'': digestmod.new(d) + self._digest_cons = lambda d=b'': digestmod.new(d) - self.outer = self.digest_cons() - self.inner = self.digest_cons() - self.digest_size = self.inner.digest_size + self._outer = self._digest_cons() + self._inner = self._digest_cons() + self.digest_size = self._inner.digest_size - if hasattr(self.inner, 'block_size'): - blocksize = self.inner.block_size + if hasattr(self._inner, 'block_size'): + blocksize = self._inner.block_size if blocksize < 16: _warnings.warn('block_size of %d seems too small; using our ' 'default of %d.' % (blocksize, self.blocksize), @@ -79,21 +84,33 @@ def __init__(self, key, msg=None, digestmod=''): self.block_size = blocksize if len(key) > blocksize: - key = self.digest_cons(key).digest() + key = self._digest_cons(key).digest() key = key.ljust(blocksize, b'\0') - self.outer.update(key.translate(trans_5C)) - self.inner.update(key.translate(trans_36)) + self._outer.update(key.translate(trans_5C)) + self._inner.update(key.translate(trans_36)) if msg is not None: self.update(msg) @property def name(self): - return "hmac-" + self.inner.name + return "hmac-" + self._inner.name + + @property + def digest_cons(self): + return self._digest_cons + + @property + def inner(self): + return self._inner + + @property + def outer(self): + return self._outer def update(self, msg): """Feed data from msg into this hashing object.""" - self.inner.update(msg) + self._inner.update(msg) def copy(self): """Return a separate copy of this hashing object. @@ -102,10 +119,10 @@ def copy(self): """ # Call __new__ directly to avoid the expensive __init__. other = self.__class__.__new__(self.__class__) - other.digest_cons = self.digest_cons + other._digest_cons = self._digest_cons other.digest_size = self.digest_size - other.inner = self.inner.copy() - other.outer = self.outer.copy() + other._inner = self._inner.copy() + other._outer = self._outer.copy() return other def _current(self): @@ -113,8 +130,8 @@ def _current(self): To be used only internally with digest() and hexdigest(). """ - h = self.outer.copy() - h.update(self.inner.digest()) + h = self._outer.copy() + h.update(self._inner.digest()) return h def digest(self): diff --git a/Lib/html/parser.py b/Lib/html/parser.py index de81879a631ac7ea2c4e12c8ac3ffeb376c63418..9e49effca1fcc5ae7378253883073b5d804675a5 100644 --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -9,7 +9,6 @@ import re -import warnings import _markupbase from html import unescape @@ -47,7 +46,7 @@ |"[^"]*" # LIT-enclosed value |(?!['"])[^>\s]* # bare value ) - (?:\s*,)* # possibly followed by a comma + \s* # possibly followed by a space )?(?:\s|/(?!>))* )* )? @@ -461,10 +460,3 @@ def handle_pi(self, data): def unknown_decl(self, data): pass - - # Internal -- helper to remove special character quoting - def unescape(self, s): - warnings.warn('The unescape method is deprecated and will be removed ' - 'in 3.5, use html.unescape() instead.', - DeprecationWarning, stacklevel=2) - return unescape(s) diff --git a/Lib/http/__init__.py b/Lib/http/__init__.py index 350afe77926b029a3e1abf573cdaa136aa0df22b..37be765349ea00733c9affdda384a170b60a03dc 100644 --- a/Lib/http/__init__.py +++ b/Lib/http/__init__.py @@ -17,6 +17,9 @@ class HTTPStatus(IntEnum): * RFC 2774: An HTTP Extension Framework * RFC 7725: An HTTP Status Code to Report Legal Obstacles * RFC 7540: Hypertext Transfer Protocol Version 2 (HTTP/2) + * RFC 2324: Hyper Text Coffee Pot Control Protocol (HTCPCP/1.0) + * RFC 8297: An HTTP Status Code for Indicating Hints + * RFC 8470: Using Early Data in HTTP """ def __new__(cls, value, phrase, description=''): obj = int.__new__(cls, value) @@ -31,6 +34,7 @@ def __new__(cls, value, phrase, description=''): SWITCHING_PROTOCOLS = (101, 'Switching Protocols', 'Switching to new protocol; obey Upgrade header') PROCESSING = 102, 'Processing' + EARLY_HINTS = 103, 'Early Hints' # success OK = 200, 'OK', 'Request fulfilled, document follows' @@ -100,11 +104,14 @@ def __new__(cls, value, phrase, description=''): 'Cannot satisfy request range') EXPECTATION_FAILED = (417, 'Expectation Failed', 'Expect condition could not be satisfied') + IM_A_TEAPOT = (418, 'I\'m a Teapot', + 'Server refuses to brew coffee because it is a teapot.') MISDIRECTED_REQUEST = (421, 'Misdirected Request', 'Server is not able to produce a response') UNPROCESSABLE_ENTITY = 422, 'Unprocessable Entity' LOCKED = 423, 'Locked' FAILED_DEPENDENCY = 424, 'Failed Dependency' + TOO_EARLY = 425, 'Too Early' UPGRADE_REQUIRED = 426, 'Upgrade Required' PRECONDITION_REQUIRED = (428, 'Precondition Required', 'The origin server requires the request to be conditional') diff --git a/Lib/http/client.py b/Lib/http/client.py index c2ad0471bfee50ec85ce239dd8fe7584782716d2..16afc871ea6d7a9dfcabfd6eec03cf69a84f7244 100644 --- a/Lib/http/client.py +++ b/Lib/http/client.py @@ -846,7 +846,7 @@ def set_tunnel(self, host, port=None, headers=None): the endpoint passed to `set_tunnel`. This done by sending an HTTP CONNECT request to the proxy server when the connection is established. - This method must be called before the HTML connection has been + This method must be called before the HTTP connection has been established. The headers argument should be a mapping of extra HTTP headers to send diff --git a/Lib/http/cookies.py b/Lib/http/cookies.py index 6694f5478bdadfb84ac4c5b1398ecf79123fa7b9..35ac2dc6ae280c5ff5adc817af1fbc9620041105 100644 --- a/Lib/http/cookies.py +++ b/Lib/http/cookies.py @@ -131,6 +131,7 @@ # import re import string +import types __all__ = ["CookieError", "BaseCookie", "SimpleCookie"] @@ -419,6 +420,8 @@ def OutputString(self, attrs=None): # Return the result return _semispacejoin(result) + __class_getitem__ = classmethod(types.GenericAlias) + # # Pattern for finding cookie diff --git a/Lib/http/server.py b/Lib/http/server.py index 38f7accad7a346499a7de40c481a8fe73c81ca4c..def05f46be4f9118880aa17697653e73b8c264da 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -639,11 +639,17 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler): """ server_version = "SimpleHTTP/" + __version__ + extensions_map = _encodings_map_default = { + '.gz': 'application/gzip', + '.Z': 'application/octet-stream', + '.bz2': 'application/x-bzip2', + '.xz': 'application/x-xz', + } def __init__(self, *args, directory=None, **kwargs): if directory is None: directory = os.getcwd() - self.directory = directory + self.directory = os.fspath(directory) super().__init__(*args, **kwargs) def do_GET(self): @@ -866,25 +872,16 @@ def guess_type(self, path): slow) to look inside the data to make a better guess. """ - base, ext = posixpath.splitext(path) if ext in self.extensions_map: return self.extensions_map[ext] ext = ext.lower() if ext in self.extensions_map: return self.extensions_map[ext] - else: - return self.extensions_map[''] - - if not mimetypes.inited: - mimetypes.init() # try to read system mime.types - extensions_map = mimetypes.types_map.copy() - extensions_map.update({ - '': 'application/octet-stream', # Default - '.py': 'text/plain', - '.c': 'text/plain', - '.h': 'text/plain', - }) + guess, _ = mimetypes.guess_type(path) + if guess: + return guess + return 'application/octet-stream' # Utilities for CGIHTTPRequestHandler @@ -1015,8 +1012,10 @@ def is_cgi(self): """ collapsed_path = _url_collapse_path(self.path) dir_sep = collapsed_path.find('/', 1) - head, tail = collapsed_path[:dir_sep], collapsed_path[dir_sep+1:] - if head in self.cgi_directories: + while dir_sep > 0 and not collapsed_path[:dir_sep] in self.cgi_directories: + dir_sep = collapsed_path.find('/', dir_sep+1) + if dir_sep > 0: + head, tail = collapsed_path[:dir_sep], collapsed_path[dir_sep+1:] self.cgi_info = head, tail return True return False @@ -1124,12 +1123,7 @@ def run_cgi(self): referer = self.headers.get('referer') if referer: env['HTTP_REFERER'] = referer - accept = [] - for line in self.headers.getallmatchingheaders('accept'): - if line[:1] in "\t\n\r ": - accept.append(line.strip()) - else: - accept = accept + line[7:].split(',') + accept = self.headers.get_all('accept', ()) env['HTTP_ACCEPT'] = ','.join(accept) ua = self.headers.get('user-agent') if ua: @@ -1165,8 +1159,9 @@ def run_cgi(self): while select.select([self.rfile], [], [], 0)[0]: if not self.rfile.read(1): break - if sts: - self.log_error("CGI script exit status %#x", sts) + exitcode = os.waitstatus_to_exitcode(sts) + if exitcode: + self.log_error(f"CGI script exit code {exitcode}") return # Child try: diff --git a/Lib/idlelib/Icons/README.txt b/Lib/idlelib/Icons/README.txt index 8b471629ecb3ea1f96e233ec2d44330da9499ca6..d91c4d5d8d8cfa20b4994de21605b48f47ba430f 100644 --- a/Lib/idlelib/Icons/README.txt +++ b/Lib/idlelib/Icons/README.txt @@ -7,3 +7,7 @@ https://www.doxdesk.com/software/py/pyicons.html Various different formats and sizes are available at this GitHub Pull Request: https://github.com/python/cpython/pull/17473 + +The idle.ico file was created with ImageMagick: + + $ convert idle_16.png idle_32.png idle_48.png idle_256.png idle.ico diff --git a/Lib/idlelib/Icons/idle.ico b/Lib/idlelib/Icons/idle.ico index 3357aef14888c501bcd7bfe02393760306a18d06..2aa9a8300d9e29670ecbe585f5ab21579dece9c2 100644 Binary files a/Lib/idlelib/Icons/idle.ico and b/Lib/idlelib/Icons/idle.ico differ diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index ddc1e22e23ed4865125cae00f13c5ad13a938e78..4bc4aefd1ac352e15d2b310787f9f77a7be18957 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -1,15 +1,58 @@ -What's New in IDLE 3.8.5 -Released on 2020-07-20 +What's New in IDLE 3.9.2 +Released on 2021-02-15? ====================================== -bpo-41300: Save files with non-ascii chars. Fix regression in -3.9.0b4 and 3.8.4. +bpo-23544: Disable Debug=>Stack Viewer when user code is running or +Debugger is active, to prevent hang or crash. Patch by Zackery Spytz. + +bpo-43008: Make IDLE invoke :func:`sys.excepthook` in normal, +2-process mode. Patch by Ken Hilton. + +bpo-33065: Fix problem debugging user classes with __repr__ method. + +bpo-32631: Finish zzdummy example extension module: make menu entries +work; add docstrings and tests with 100% coverage. + + +What's New in IDLE 3.9.1 +Released on 2020-12-07 +====================================== + +bpo-42508: Keep IDLE running on macOS. Remove obsolete workaround +that prevented running files with shortcuts when using new universal2 +installers built on macOS 11. + +bpo-42426: Fix reporting offset of the RE error in searchengine. + +bpo-42416: Get docstrings for IDLE calltips more often +by using inspect.getdoc. + +bpo-33987: Mostly finish using ttk widgets, mainly for editor, +settings, and searches. Some patches by Mark Roseman. + +bpo-41775: Make 'IDLE Shell' the shell title. + +bpo-35764: Rewrite the Calltips doc section. + +bpo-40181: In calltips, stop reminding that '/' marks the end of +positional-only arguments. -What's New in IDLE 3.8.4 -Released on 2020-06-30 + +What's New in IDLE 3.9.0 (since 3.8.0) +Released on 2020-10-05? ====================================== +bpo-41468: Improve IDLE run crash error message (which users should +never see). + +bpo-41373: Save files loaded with no line ending, as when blank, or +different line endings, by setting its line ending to the system +default. Fix regression in 3.8.4 and 3.9.0b4. + +bpo-41300: Save files with non-ascii chars. Fix regression in +3.9.0b4 and 3.8.4. + bpo-37765: Add keywords to module name completion list. Rewrite Completions section of IDLE doc. @@ -21,11 +64,6 @@ bpo-41144: Make Open Module open a special module such as os.path. bpo-40723: Make test_idle pass when run after import. Patch by Florian Dahlitz. - -What's New in IDLE 3.8.3 -Released on 2020-05-13 -====================================== - bpo-38689: IDLE will no longer freeze when inspect.signature fails when fetching a calltip. @@ -43,11 +81,6 @@ bpo-39781: Selecting code context lines no longer causes a jump. bpo-39663: Add tests for pyparse find_good_parse_start(). - -What's New in IDLE 3.8.2 -Released on 2020-02-17 -====================================== - bpo-39600: Remove duplicate font names from configuration list. bpo-38792: Close a shell calltip if a :exc:`KeyboardInterrupt` @@ -64,11 +97,6 @@ bpo-32989: Add tests for editor newline_and_indent_event method. Remove unneeded arguments and dead code from pyparse find_good_parse_start method. - -What's New in IDLE 3.8.1 -Released on 2019-12-18 -====================================== - bpo-38943: Fix autocomplete windows not always appearing on some systems. Patch by Johnny Najera. @@ -82,9 +110,9 @@ bpo-38636: Fix IDLE Format menu tab toggle and file indent width. These functions (default shortcuts Alt-T and Alt-U) were mistakenly disabled in 3.7.5 and 3.8.0. -bpo-4360: Add an option to toggle IDLE's cursor blink for shell, +bpo-4630: Add an option to toggle IDLE's cursor blink for shell, editor, and output windows. See Settings, General, Window Preferences, -Cursor Blink. Patch by Zachary Spytz. +Cursor Blink. Patch by Zackery Spytz. bpo-26353: Stop adding newline when saving an IDLE shell window. diff --git a/Lib/idlelib/calltip.py b/Lib/idlelib/calltip.py index d4092c7847186bf6317fe0cdc97e5bd1d00ec520..40bc5a0ad798fe3eeef6ff38f79f74747b45a21f 100644 --- a/Lib/idlelib/calltip.py +++ b/Lib/idlelib/calltip.py @@ -55,18 +55,50 @@ def refresh_calltip_event(self, event): self.open_calltip(False) def open_calltip(self, evalfuncs): - self.remove_calltip_window() + """Maybe close an existing calltip and maybe open a new calltip. + Called from (force_open|try_open|refresh)_calltip_event functions. + """ hp = HyperParser(self.editwin, "insert") sur_paren = hp.get_surrounding_brackets('(') + + # If not inside parentheses, no calltip. if not sur_paren: + self.remove_calltip_window() return + + # If a calltip is shown for the current parentheses, do + # nothing. + if self.active_calltip: + opener_line, opener_col = map(int, sur_paren[0].split('.')) + if ( + (opener_line, opener_col) == + (self.active_calltip.parenline, self.active_calltip.parencol) + ): + return + hp.set_index(sur_paren[0]) - expression = hp.get_expression() + try: + expression = hp.get_expression() + except ValueError: + expression = None if not expression: + # No expression before the opening parenthesis, e.g. + # because it's in a string or the opener for a tuple: + # Do nothing. return + + # At this point, the current index is after an opening + # parenthesis, in a section of code, preceded by a valid + # expression. If there is a calltip shown, it's not for the + # same index and should be closed. + self.remove_calltip_window() + + # Simple, fast heuristic: If the preceding expression includes + # an opening parenthesis, it likely includes a function call. if not evalfuncs and (expression.find('(') != -1): return + argspec = self.fetch_tip(expression) if not argspec: return @@ -118,7 +150,6 @@ def get_entity(expression): _first_param = re.compile(r'(?<=\()\w*\,?\s*') _default_callable_argspec = "See source or doc" _invalid_method = "invalid method signature" -_argument_positional = " # '/' marks preceding args as positional-only." def get_argspec(ob): '''Return a string describing the signature of a callable object, or ''. @@ -134,6 +165,7 @@ def get_argspec(ob): ob_call = ob.__call__ except BaseException: # Buggy user object could raise anything. return '' # No popup for non-callables. + # For Get_argspecTest.test_buggy_getattr_class, CallA() & CallB(). fob = ob_call if isinstance(ob_call, types.MethodType) else ob # Initialize argspec and wrap it to get lines. @@ -146,9 +178,6 @@ def get_argspec(ob): else: argspec = '' - if '/' in argspec and len(argspec) < _MAX_COLS - len(_argument_positional): - # Add explanation TODO remove after 3.7, before 3.9. - argspec += _argument_positional if isinstance(fob, type) and argspec == '()': # If fob has no argument, use default callable argspec. argspec = _default_callable_argspec @@ -157,10 +186,7 @@ def get_argspec(ob): if len(argspec) > _MAX_COLS else [argspec] if argspec else []) # Augment lines from docstring, if any, and join to get argspec. - if isinstance(ob_call, types.MethodType): - doc = ob_call.__doc__ - else: - doc = getattr(ob, "__doc__", "") + doc = inspect.getdoc(ob) if doc: for line in doc.split('\n', _MAX_LINES)[:_MAX_LINES]: line = line.strip() diff --git a/Lib/idlelib/codecontext.py b/Lib/idlelib/codecontext.py index 989b30e5994650c745eccb302c0e24ef636a4522..f2f44f5f8d4e6112c75a4845e89ba005245abd9b 100644 --- a/Lib/idlelib/codecontext.py +++ b/Lib/idlelib/codecontext.py @@ -7,11 +7,14 @@ enclosing block. The number of hint lines is determined by the maxlines variable in the codecontext section of config-extensions.def. Lines which do not open blocks are not shown in the context hints pane. + +For EditorWindows, <> is bound to CodeContext(self). +toggle_code_context_event. """ import re from sys import maxsize as INFINITY -import tkinter +from tkinter import Frame, Text, TclError from tkinter.constants import NSEW, SUNKEN from idlelib.config import idleConf @@ -83,7 +86,7 @@ def __del__(self): if self.t1 is not None: try: self.text.after_cancel(self.t1) - except tkinter.TclError: # pragma: no cover + except TclError: # pragma: no cover pass self.t1 = None @@ -111,7 +114,7 @@ def toggle_code_context_event(self, event=None): padx += widget.tk.getint(info['padx']) padx += widget.tk.getint(widget.cget('padx')) border += widget.tk.getint(widget.cget('border')) - context = self.context = tkinter.Text( + context = self.context = Text( self.editwin.text_frame, height=1, width=1, # Don't request more than we get. @@ -127,7 +130,7 @@ def toggle_code_context_event(self, event=None): line_number_colors = idleConf.GetHighlight(idleConf.CurrentTheme(), 'linenumber') - self.cell00 = tkinter.Frame(self.editwin.text_frame, + self.cell00 = Frame(self.editwin.text_frame, bg=line_number_colors['background']) self.cell00.grid(row=0, column=0, sticky=NSEW) menu_status = 'Hide' @@ -139,7 +142,7 @@ def toggle_code_context_event(self, event=None): self.text.after_cancel(self.t1) self._reset() menu_status = 'Show' - self.editwin.update_menu_label(menu='options', index='* Code Context', + self.editwin.update_menu_label(menu='options', index='*ode*ontext', label=f'{menu_status} Code Context') return "break" @@ -221,7 +224,7 @@ def jumptoline(self, event=None): """ try: self.context.index("sel.first") - except tkinter.TclError: + except TclError: lines = len(self.info) if lines == 1: # No context lines are showing. newtop = 1 diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 82596498d346111cdc4a7aa52e932130834201e6..c52a04b503adb4a1b4d827326ddf25b2d4dd4ea9 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -18,8 +18,8 @@ HORIZONTAL, VERTICAL, ANCHOR, ACTIVE, END) from tkinter.ttk import (Frame, LabelFrame, Button, Checkbutton, Entry, Label, OptionMenu, Notebook, Radiobutton, Scrollbar, Style) -import tkinter.colorchooser as tkColorChooser -import tkinter.font as tkFont +from tkinter import colorchooser +import tkinter.font as tkfont from tkinter import messagebox from idlelib.config import idleConf, ConfigChanges @@ -67,7 +67,6 @@ def __init__(self, parent, title='', *, _htest=False, _utest=False): if not _utest: self.withdraw() - self.configure(borderwidth=5) self.title(title or 'IDLE Preferences') x = parent.winfo_rootx() + 20 y = parent.winfo_rooty() + (30 if not _htest else 150) @@ -97,6 +96,7 @@ def create_widgets(self): """Create and place widgets for tabbed dialog. Widgets Bound to self: + frame: encloses all other widgets note: Notebook highpage: HighPage fontpage: FontPage @@ -109,7 +109,9 @@ def create_widgets(self): load_configs: Load pages except for extensions. activate_config_changes: Tell editors to reload. """ - self.note = note = Notebook(self) + self.frame = frame = Frame(self, padding="5px") + self.frame.grid(sticky="nwes") + self.note = note = Notebook(frame) self.highpage = HighPage(note) self.fontpage = FontPage(note, self.highpage) self.keyspage = KeysPage(note) @@ -148,7 +150,7 @@ def create_action_buttons(self): padding_args = {} else: padding_args = {'padding': (6, 3)} - outer = Frame(self, padding=2) + outer = Frame(self.frame, padding=2) buttons_frame = Frame(outer, padding=2) self.buttons = {} for txt, cmd in ( @@ -607,7 +609,7 @@ def load_font_cfg(self): font_bold = configured_font[2]=='bold' # Set sorted no-duplicate editor font selection list and font_name. - fonts = sorted(set(tkFont.families(self))) + fonts = sorted(set(tkfont.families(self))) for font in fonts: self.fontlist.insert(END, font) self.font_name.set(font_name) @@ -661,7 +663,7 @@ def set_samples(self, event=None): Updates font_sample and highlight page highlight_sample. """ font_name = self.font_name.get() - font_weight = tkFont.BOLD if self.font_bold.get() else tkFont.NORMAL + font_weight = tkfont.BOLD if self.font_bold.get() else tkfont.NORMAL new_font = (font_name, self.font_size.get(), font_weight) self.font_sample['font'] = new_font self.highlight_sample['font'] = new_font @@ -687,7 +689,7 @@ class HighPage(Frame): def __init__(self, master): super().__init__(master) - self.cd = master.master + self.cd = master.winfo_toplevel() self.style = Style(master) self.create_page_highlight() self.load_theme_cfg() @@ -1098,7 +1100,7 @@ def get_color(self): target = self.highlight_target.get() prev_color = self.style.lookup(self.frame_color_set['style'], 'background') - rgbTuplet, color_string = tkColorChooser.askcolor( + rgbTuplet, color_string = colorchooser.askcolor( parent=self, title='Pick new color for : '+target, initialcolor=prev_color) if color_string and (color_string != prev_color): @@ -1346,7 +1348,7 @@ class KeysPage(Frame): def __init__(self, master): super().__init__(master) - self.cd = master.master + self.cd = master.winfo_toplevel() self.create_page_keys() self.load_key_cfg() @@ -2314,7 +2316,15 @@ def detach(self): Shell Preferences: Auto-Squeeze Min. Lines is the minimum number of lines of output to automatically "squeeze". -''' +''', + 'Extensions': ''' +ZzDummy: This extension is provided as an example for how to create and +use an extension. Enable indicates whether the extension is active or +not; likewise enable_editor and enable_shell indicate which windows it +will be active on. For this extension, z-text is the text that will be +inserted at or removed from the beginning of the lines of selected text, +or the current line if no selection. +''', } diff --git a/Lib/idlelib/debugger_r.py b/Lib/idlelib/debugger_r.py index 9dcfc56414c05059c3d89b68d634d23dcbb16fee..26204438858d8a4b8e3850c5e8276b7208448b2f 100644 --- a/Lib/idlelib/debugger_r.py +++ b/Lib/idlelib/debugger_r.py @@ -19,7 +19,7 @@ barrier, in particular frame and traceback objects. """ - +import reprlib import types from idlelib import debugger @@ -170,7 +170,7 @@ def dict_keys_list(self, did): def dict_item(self, did, key): dict = dicttable[did] value = dict[key] - value = repr(value) ### can't pickle module 'builtins' + value = reprlib.repr(value) ### can't pickle module 'builtins' return value #----------end class IdbAdapter---------- @@ -390,4 +390,4 @@ def restart_subprocess_debugger(rpcclt): if __name__ == "__main__": from unittest import main - main('idlelib.idle_test.test_debugger', verbosity=2, exit=False) + main('idlelib.idle_test.test_debugger_r', verbosity=2, exit=False) diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index a178eaf93c013ab6bfdc24ff3579335842960fb5..b9cb50264ff06f22a36cf6cf405ba27aa1f4305d 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -12,8 +12,8 @@ from tkinter import * from tkinter.font import Font from tkinter.ttk import Scrollbar -import tkinter.simpledialog as tkSimpleDialog -import tkinter.messagebox as tkMessageBox +from tkinter import simpledialog +from tkinter import messagebox from idlelib.config import idleConf from idlelib import configdialog @@ -46,7 +46,7 @@ def _sphinx_version(): return release -class EditorWindow(object): +class EditorWindow: from idlelib.percolator import Percolator from idlelib.colorizer import ColorDelegator, color_config from idlelib.undo import UndoDelegator @@ -295,9 +295,9 @@ def __init__(self, flist=None, filename=None, key=None, root=None): window.register_callback(self.postwindowsmenu) # Some abstractions so IDLE extensions are cross-IDE - self.askyesno = tkMessageBox.askyesno - self.askinteger = tkSimpleDialog.askinteger - self.showerror = tkMessageBox.showerror + self.askinteger = simpledialog.askinteger + self.askyesno = messagebox.askyesno + self.showerror = messagebox.showerror # Add pseudoevents for former extension fixed keys. # (This probably needs to be done once in the process.) @@ -339,7 +339,7 @@ def __init__(self, flist=None, filename=None, key=None, root=None): text.bind("<>", self.code_context.toggle_code_context_event) else: - self.update_menu_state('options', '*Code Context', 'disabled') + self.update_menu_state('options', '*ode*ontext', 'disabled') if self.allow_line_numbers: self.line_numbers = self.LineNumbers(self) if idleConf.GetOption('main', 'EditorWindow', @@ -347,7 +347,7 @@ def __init__(self, flist=None, filename=None, key=None, root=None): self.toggle_line_numbers_event() text.bind("<>", self.toggle_line_numbers_event) else: - self.update_menu_state('options', '*Line Numbers', 'disabled') + self.update_menu_state('options', '*ine*umbers', 'disabled') def handle_winconfig(self, event=None): self.set_width() @@ -450,7 +450,9 @@ def createmenubar(self): self.menudict = menudict = {} for name, label in self.menu_specs: underline, label = prepstr(label) - menudict[name] = menu = Menu(mbar, name=name, tearoff=0) + postcommand = getattr(self, f'{name}_menu_postcommand', None) + menudict[name] = menu = Menu(mbar, name=name, tearoff=0, + postcommand=postcommand) mbar.add_cascade(label=label, menu=menu, underline=underline) if macosx.isCarbonTk(): # Insert the application menu @@ -596,7 +598,7 @@ def python_docs(self, event=None): try: os.startfile(self.help_url) except OSError as why: - tkMessageBox.showerror(title='Document Start Failure', + messagebox.showerror(title='Document Start Failure', message=str(why), parent=self.text) else: webbrowser.open(self.help_url) @@ -927,7 +929,7 @@ def display_extra_help(helpfile=helpfile): try: os.startfile(helpfile) except OSError as why: - tkMessageBox.showerror(title='Document Start Failure', + messagebox.showerror(title='Document Start Failure', message=str(why), parent=self.text) else: webbrowser.open(helpfile) @@ -963,7 +965,7 @@ def update_recent_files_list(self, new_file=None): except OSError as err: if not getattr(self.root, "recentfiles_message", False): self.root.recentfiles_message = True - tkMessageBox.showwarning(title='IDLE Warning', + messagebox.showwarning(title='IDLE Warning', message="Cannot save Recent Files list to disk.\n" f" {err}\n" "Select OK to continue.", @@ -1527,7 +1529,7 @@ def toggle_line_numbers_event(self, event=None): else: self.line_numbers.show_sidebar() menu_label = "Hide" - self.update_menu_label(menu='options', index='*Line Numbers', + self.update_menu_label(menu='options', index='*ine*umbers', label=f'{menu_label} Line Numbers') # "line.col" -> line, as an int @@ -1546,7 +1548,7 @@ def get_line_indent(line, tabwidth): return m.end(), len(m.group().expandtabs(tabwidth)) -class IndentSearcher(object): +class IndentSearcher: # .run() chews over the Text widget, looking for a block opener # and the stmt following it. Returns a pair, diff --git a/Lib/idlelib/extend.txt b/Lib/idlelib/extend.txt index c9cb2e8297eb352586fdc09c47d3d71efb174d82..b482f76c4fb0f752e8f761f854fda0fbb1e10f82 100644 --- a/Lib/idlelib/extend.txt +++ b/Lib/idlelib/extend.txt @@ -28,8 +28,8 @@ variables: (There are a few more, but they are rarely useful.) The extension class must not directly bind Window Manager (e.g. X) events. -Rather, it must define one or more virtual events, e.g. <>, and -corresponding methods, e.g. zoom_height_event(). The virtual events will be +Rather, it must define one or more virtual events, e.g. <>, and +corresponding methods, e.g. z_in_event(). The virtual events will be bound to the corresponding methods, and Window Manager events can then be bound to the virtual events. (This indirection is done so that the key bindings can easily be changed, and so that other sources of virtual events can exist, such @@ -54,21 +54,21 @@ Extensions are not required to define menu entries for all the events they implement. (They are also not required to create keybindings, but in that case there must be empty bindings in cofig-extensions.def) -Here is a complete example: +Here is a partial example from zzdummy.py: -class ZoomHeight: +class ZzDummy: menudefs = [ - ('edit', [ - None, # Separator - ('_Zoom Height', '<>'), - ]) + ('format', [ + ('Z in', '<>'), + ('Z out', '<>'), + ] ) ] def __init__(self, editwin): self.editwin = editwin - def zoom_height_event(self, event): + def z_in_event(self, event=None): "...Do what you want here..." The final piece of the puzzle is the file "config-extensions.def", which is diff --git a/Lib/idlelib/filelist.py b/Lib/idlelib/filelist.py index 0d200854ef0007a4b11f4e19b83d2e3a304828dd..254f5caf6b81b05aa7b34c8c59ce3b7bbbdf418f 100644 --- a/Lib/idlelib/filelist.py +++ b/Lib/idlelib/filelist.py @@ -1,7 +1,7 @@ "idlelib.filelist" import os -from tkinter import messagebox as tkMessageBox +from tkinter import messagebox class FileList: @@ -20,7 +20,7 @@ def open(self, filename, action=None): filename = self.canonize(filename) if os.path.isdir(filename): # This can happen when bad filename is passed on command line: - tkMessageBox.showerror( + messagebox.showerror( "File Error", "%r is a directory." % (filename,), master=self.root) @@ -88,7 +88,7 @@ def filename_changed_edit(self, edit): if newkey in self.dict: conflict = self.dict[newkey] self.inversedict[conflict] = None - tkMessageBox.showerror( + messagebox.showerror( "Name Conflict", "You now have multiple edit windows open for %r" % (filename,), master=self.root) diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index 81ce5100bb8ad5dedf0b8c0ded401266409a23d9..170999e12801730f596b1f9791187abbf173d7c1 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -1,23 +1,24 @@ - + - IDLE — Python 3.10.0a0 documentation + + IDLE — Python 3.10.0a1 documentation - - - - - + + + + + - + @@ -71,11 +72,12 @@

Navigation

  • - 3.10.0a0 Documentation » + 3.10.0a1 Documentation »
  • +
  • @@ -426,30 +428,30 @@

    Key bindingsCommand key on macOS.

    • Backspace deletes to the left; Del deletes to the right

    • -
    • C-Backspace delete word left; C-Del delete word to the right

    • -
    • Arrow keys and Page Up/Page Down to move around

    • -
    • C-LeftArrow and C-RightArrow moves by words

    • +
    • C-Backspace delete word left; C-Del delete word to the right

    • +
    • Arrow keys and Page Up/Page Down to move around

    • +
    • C-LeftArrow and C-RightArrow moves by words

    • Home/End go to begin/end of line

    • -
    • C-Home/C-End go to begin/end of file

    • +
    • C-Home/C-End go to begin/end of file

    • Some useful Emacs bindings are inherited from Tcl/Tk:

        -
      • C-a beginning of line

      • -
      • C-e end of line

      • -
      • C-k kill line (but doesn’t put it in clipboard)

      • -
      • C-l center window around the insertion point

      • -
      • C-b go backward one character without deleting (usually you can +

      • C-a beginning of line

      • +
      • C-e end of line

      • +
      • C-k kill line (but doesn’t put it in clipboard)

      • +
      • C-l center window around the insertion point

      • +
      • C-b go backward one character without deleting (usually you can also use the cursor key for this)

      • -
      • C-f go forward one character without deleting (usually you can +

      • C-f go forward one character without deleting (usually you can also use the cursor key for this)

      • -
      • C-p go up one line (usually you can also use the cursor key for +

      • C-p go up one line (usually you can also use the cursor key for this)

      • -
      • C-d delete next character

      • +
      • C-d delete next character

    -

    Standard keybindings (like C-c to copy and C-v to paste) +

    Standard keybindings (like C-c to copy and C-v to paste) may work. Keybindings are selected in the Configure IDLE dialog.

    @@ -481,13 +483,13 @@

    Automatic indentationos.sep or -data:os.altsep immediately after an opening quote. (On Windows, +os.altsep immediately after an opening quote. (On Windows, one can specify a drive first.) Move into subdirectories by typing a directory name and a separator.

    -

    Instead of waiting, or after a box is closed. open a completion box +

    Instead of waiting, or after a box is closed, open a completion box immediately with Show Completions on the Edit menu. The default hot -key is C-space. If one types a prefix for the desired name -before opening the box, the first match is displayed. +key is C-space. If one types a prefix for the desired name +before opening the box, the first match or near miss is made visible. The result is the same as if one enters a prefix after the box is displayed. Show Completions after a quote completes filenames in the current directory instead of a root directory.

    @@ -509,26 +511,29 @@

    Automatic indentation

    Calltips

    -

    A calltip is shown when one types ( after the name of an accessible -function. A name expression may include dots and subscripts. A calltip -remains until it is clicked, the cursor is moved out of the argument area, -or ) is typed. When the cursor is in the argument part of a definition, -the menu or shortcut display a calltip.

    -

    A calltip consists of the function signature and the first line of the -docstring. For builtins without an accessible signature, the calltip -consists of all lines up the fifth line or the first blank line. These -details may change.

    -

    The set of accessible functions depends on what modules have been imported -into the user process, including those imported by Idle itself, -and what definitions have been run, all since the last restart.

    +

    A calltip is shown automatically when one types ( after the name +of an accessible function. A function name expression may include +dots and subscripts. A calltip remains until it is clicked, the cursor +is moved out of the argument area, or ) is typed. Whenever the +cursor is in the argument part of a definition, select Edit and “Show +Call Tip” on the menu or enter its shortcut to display a calltip.

    +

    The calltip consists of the function’s signature and docstring up to +the latter’s first blank line or the fifth non-blank line. (Some builtin +functions lack an accessible signature.) A ‘/’ or ‘*’ in the signature +indicates that the preceding or following arguments are passed by +position or name (keyword) only. Details are subject to change.

    +

    In Shell, the accessible functions depends on what modules have been +imported into the user process, including those imported by Idle itself, +and which definitions have been run, all since the last restart.

    For example, restart the Shell and enter itertools.count(. A calltip -appears because Idle imports itertools into the user process for its own use. -(This could change.) Enter turtle.write( and nothing appears. Idle does -not import turtle. The menu or shortcut do nothing either. Enter -import turtle and then turtle.write( will work.

    -

    In an editor, import statements have no effect until one runs the file. One -might want to run a file after writing the import statements at the top, -or immediately run an existing file before editing.

    +appears because Idle imports itertools into the user process for its own +use. (This could change.) Enter turtle.write( and nothing appears. +Idle does not itself import turtle. The menu entry and shortcut also do +nothing. Enter import turtle. Thereafter, turtle.write( +will display a calltip.

    +

    In an editor, import statements have no effect until one runs the file. +One might want to run a file after writing import statements, after +adding function definitions, or after opening an existing file.

    Code Context

    @@ -556,14 +561,14 @@

    Python Shell windowC-c interrupts executing command

  • -
  • C-d sends end-of-file; closes window if typed at a >>> prompt

  • -
  • Alt-/ (Expand word) is also useful to reduce typing

    +
  • C-c interrupts executing command

  • +
  • C-d sends end-of-file; closes window if typed at a >>> prompt

  • +
  • Alt-/ (Expand word) is also useful to reduce typing

    Command history

      -
    • Alt-p retrieves previous command matching what you have typed. On -macOS use C-p.

    • -
    • Alt-n retrieves next. On macOS use C-n.

    • +
    • Alt-p retrieves previous command matching what you have typed. On +macOS use C-p.

    • +
    • Alt-n retrieves next. On macOS use C-n.

    • Return while on any previous command retrieves that command

  • @@ -849,6 +854,7 @@

    Extensions @@ -944,11 +950,12 @@

    Navigation

  • - 3.10.0a0 Documentation » + 3.10.0a1 Documentation »
  • +
  • @@ -975,11 +982,11 @@

    Navigation



    - Last updated on Jul 08, 2020. + Last updated on Oct 20, 2020. Found a bug?
    - Created using Sphinx 2.1.1. + Created using Sphinx 3.2.1. diff --git a/Lib/idlelib/help.py b/Lib/idlelib/help.py index 9f63ea0d3990e6db84adc16ed1d191ab51787ea5..f420d40fb9ea404270e96c37b831c279a0b428d6 100644 --- a/Lib/idlelib/help.py +++ b/Lib/idlelib/help.py @@ -28,8 +28,8 @@ from os.path import abspath, dirname, isfile, join from platform import python_version -from tkinter import Toplevel, Frame, Text, Menu -from tkinter.ttk import Menubutton, Scrollbar +from tkinter import Toplevel, Text, Menu +from tkinter.ttk import Frame, Menubutton, Scrollbar, Style from tkinter import font as tkfont from idlelib.config import idleConf @@ -212,7 +212,9 @@ class HelpFrame(Frame): def __init__(self, parent, filename): Frame.__init__(self, parent) self.text = text = HelpText(self, filename) - self['background'] = text['background'] + self.style = Style(parent) + self['style'] = 'helpframe.TFrame' + self.style.configure('helpframe.TFrame', background=text['background']) self.toc = toc = self.toc_menu(text) self.scroll = scroll = Scrollbar(self, command=text.yview) text['yscrollcommand'] = scroll.set diff --git a/Lib/idlelib/idle_test/mock_tk.py b/Lib/idlelib/idle_test/mock_tk.py index 576f7d5d609e4dbf79b4160fbc58dc8009874174..db583553838fb3344c7a09f43500eea6736f6a36 100644 --- a/Lib/idlelib/idle_test/mock_tk.py +++ b/Lib/idlelib/idle_test/mock_tk.py @@ -3,6 +3,9 @@ A gui object is anything with a master or parent parameter, which is typically required in spite of what the doc strings say. """ +import re +from _tkinter import TclError + class Event: '''Minimal mock with attributes for testing event handlers. @@ -22,6 +25,7 @@ def __init__(self, **kwds): "Create event with attributes needed for test" self.__dict__.update(kwds) + class Var: "Use for String/Int/BooleanVar: incomplete" def __init__(self, master=None, value=None, name=None): @@ -33,6 +37,7 @@ def set(self, value): def get(self): return self.value + class Mbox_func: """Generic mock for messagebox functions, which all have the same signature. @@ -50,30 +55,30 @@ def __call__(self, title, message, *args, **kwds): self.kwds = kwds return self.result # Set by tester for ask functions + class Mbox: """Mock for tkinter.messagebox with an Mbox_func for each function. - This module was 'tkMessageBox' in 2.x; hence the 'import as' in 3.x. Example usage in test_module.py for testing functions in module.py: --- from idlelib.idle_test.mock_tk import Mbox import module -orig_mbox = module.tkMessageBox +orig_mbox = module.messagebox showerror = Mbox.showerror # example, for attribute access in test methods class Test(unittest.TestCase): @classmethod def setUpClass(cls): - module.tkMessageBox = Mbox + module.messagebox = Mbox @classmethod def tearDownClass(cls): - module.tkMessageBox = orig_mbox + module.messagebox = orig_mbox --- For 'ask' functions, set func.result return value before calling the method - that uses the message function. When tkMessageBox functions are the + that uses the message function. When messagebox functions are the only gui alls in a method, this replacement makes the method gui-free, """ askokcancel = Mbox_func() # True or False @@ -85,7 +90,6 @@ def tearDownClass(cls): showinfo = Mbox_func() # None showwarning = Mbox_func() # None -from _tkinter import TclError class Text: """A semi-functional non-gui replacement for tkinter.Text text editors. @@ -154,6 +158,8 @@ def _decode(self, index, endflag=0): if char.endswith(' lineend') or char == 'end': return line, linelength # Tk requires that ignored chars before ' lineend' be valid int + if m := re.fullmatch(r'end-(\d*)c', char, re.A): # Used by hyperparser. + return line, linelength - int(m.group(1)) # Out of bounds char becomes first or last index of line char = int(char) @@ -177,7 +183,6 @@ def _endex(self, endflag): n -= 1 return n, len(self.data[n]) + endflag - def insert(self, index, chars): "Insert chars before the character at index." @@ -193,7 +198,6 @@ def insert(self, index, chars): self.data[line+1:line+1] = chars[1:] self.data[line+len(chars)-1] += after - def get(self, index1, index2=None): "Return slice from index1 to index2 (default is 'index1+1')." @@ -212,7 +216,6 @@ def get(self, index1, index2=None): lines.append(self.data[endline][:endchar]) return ''.join(lines) - def delete(self, index1, index2=None): '''Delete slice from index1 to index2 (default is 'index1+1'). @@ -297,6 +300,7 @@ def bind(sequence=None, func=None, add=None): "Bind to this widget at event sequence a call to function func." pass + class Entry: "Mock for tkinter.Entry." def focus_set(self): diff --git a/Lib/idlelib/idle_test/test_autocomplete.py b/Lib/idlelib/idle_test/test_autocomplete.py index 9c113bd893f137861d6303ca5906cd3280d10f10..642bb5db64dc341d238dd5f097c3985c782ea235 100644 --- a/Lib/idlelib/idle_test/test_autocomplete.py +++ b/Lib/idlelib/idle_test/test_autocomplete.py @@ -195,7 +195,7 @@ def test_open_completions_none(self): self.assertFalse(acp.open_completions(ac.TAB)) self.text.delete('1.0', 'end') - class dummy_acw(): + class dummy_acw: __init__ = Func() show_window = Func(result=False) hide_window = Func() diff --git a/Lib/idlelib/idle_test/test_calltip.py b/Lib/idlelib/idle_test/test_calltip.py index d386b5cd8132124bc9c8f3b3fe38bb209baa6955..b23915c5ab7849d5ccd8d23524fe8670f6f86649 100644 --- a/Lib/idlelib/idle_test/test_calltip.py +++ b/Lib/idlelib/idle_test/test_calltip.py @@ -1,14 +1,16 @@ -"Test calltip, coverage 60%" +"Test calltip, coverage 76%" from idlelib import calltip import unittest +from unittest.mock import Mock import textwrap import types import re +from idlelib.idle_test.mock_tk import Text # Test Class TC is used in multiple get_argspec test methods -class TC(): +class TC: 'doc' tip = "(ai=None, *b)" def __init__(self, ai=None, *b): 'doc' @@ -61,18 +63,16 @@ class SB: __call__ = None if List.__doc__ is not None: tiptest(List, - f'(iterable=(), /){calltip._argument_positional}' + f'(iterable=(), /)' f'\n{List.__doc__}') tiptest(list.__new__, '(*args, **kwargs)\n' 'Create and return a new object. ' 'See help(type) for accurate signature.') tiptest(list.__init__, - '(self, /, *args, **kwargs)' - + calltip._argument_positional + '\n' + + '(self, /, *args, **kwargs)\n' 'Initialize self. See help(type(self)) for accurate signature.') - append_doc = (calltip._argument_positional - + "\nAppend object to the end of the list.") + append_doc = "\nAppend object to the end of the list." tiptest(list.append, '(self, object, /)' + append_doc) tiptest(List.append, '(self, object, /)' + append_doc) tiptest([].append, '(object, /)' + append_doc) @@ -99,7 +99,12 @@ def test_signature_wrap(self): (width=70, initial_indent='', subsequent_indent='', expand_tabs=True, replace_whitespace=True, fix_sentence_endings=False, break_long_words=True, drop_whitespace=True, break_on_hyphens=True, tabsize=8, *, max_lines=None, - placeholder=' [...]')''') + placeholder=' [...]') +Object for wrapping/filling text. The public interface consists of +the wrap() and fill() methods; the other methods are just there for +subclasses to override in order to tweak the default behaviour. +If you want to completely replace the main wrapping algorithm, +you\'ll probably have to override _wrap_chunks().''') def test_properly_formated(self): @@ -241,7 +246,7 @@ class Type(type): # Type() requires 3 type args, returns class. __class__ = property({}.__getitem__, {}.__setitem__) class Object(metaclass=Type): __slots__ = '__class__' - for meth, mtip in ((Type, default_tip), (Object, default_tip), + for meth, mtip in ((Type, get_spec(type)), (Object, default_tip), (Object(), '')): with self.subTest(meth=meth, mtip=mtip): self.assertEqual(get_spec(meth), mtip) @@ -259,5 +264,100 @@ def test_good_entity(self): self.assertIs(calltip.get_entity('int'), int) +# Test the 9 Calltip methods. +# open_calltip is about half the code; the others are fairly trivial. +# The default mocks are what are needed for open_calltip. + +class mock_Shell: + "Return mock sufficient to pass to hyperparser." + def __init__(self, text): + text.tag_prevrange = Mock(return_value=None) + self.text = text + self.prompt_last_line = ">>> " + self.indentwidth = 4 + self.tabwidth = 8 + + +class mock_TipWindow: + def __init__(self): + pass + + def showtip(self, text, parenleft, parenright): + self.args = parenleft, parenright + self.parenline, self.parencol = map(int, parenleft.split('.')) + + +class WrappedCalltip(calltip.Calltip): + def _make_tk_calltip_window(self): + return mock_TipWindow() + + def remove_calltip_window(self, event=None): + if self.active_calltip: # Setup to None. + self.active_calltip = None + self.tips_removed += 1 # Setup to 0. + + def fetch_tip(self, expression): + return 'tip' + + +class CalltipTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + cls.text = Text() + cls.ct = WrappedCalltip(mock_Shell(cls.text)) + + def setUp(self): + self.text.delete('1.0', 'end') # Insert and call + self.ct.active_calltip = None + # Test .active_calltip, +args + self.ct.tips_removed = 0 + + def open_close(self, testfunc): + # Open-close template with testfunc called in between. + opentip = self.ct.open_calltip + self.text.insert(1.0, 'f(') + opentip(False) + self.tip = self.ct.active_calltip + testfunc(self) ### + self.text.insert('insert', ')') + opentip(False) + self.assertIsNone(self.ct.active_calltip, None) + + def test_open_close(self): + def args(self): + self.assertEqual(self.tip.args, ('1.1', '1.end')) + self.open_close(args) + + def test_repeated_force(self): + def force(self): + for char in 'abc': + self.text.insert('insert', 'a') + self.ct.open_calltip(True) + self.ct.open_calltip(True) + self.assertIs(self.ct.active_calltip, self.tip) + self.open_close(force) + + def test_repeated_parens(self): + def parens(self): + for context in "a", "'": + with self.subTest(context=context): + self.text.insert('insert', context) + for char in '(()())': + self.text.insert('insert', char) + self.assertIs(self.ct.active_calltip, self.tip) + self.text.insert('insert', "'") + self.open_close(parens) + + def test_comment_parens(self): + def comment(self): + self.text.insert('insert', "# ") + for char in '(()())': + self.text.insert('insert', char) + self.assertIs(self.ct.active_calltip, self.tip) + self.text.insert('insert', "\n") + self.open_close(comment) + + if __name__ == '__main__': unittest.main(verbosity=2) diff --git a/Lib/idlelib/idle_test/test_codecontext.py b/Lib/idlelib/idle_test/test_codecontext.py index 9578cc731a6f93aee4777e53c41e842818c04057..6969ad73b01a81a7ec896a2c1991905e26e7a564 100644 --- a/Lib/idlelib/idle_test/test_codecontext.py +++ b/Lib/idlelib/idle_test/test_codecontext.py @@ -20,7 +20,7 @@ } code_sample = """\ -class C1(): +class C1: # Class comment. def __init__(self, a, b): self.a = a @@ -178,29 +178,29 @@ def test_get_context(self): with self.assertRaises(AssertionError): gc(1, stopline=0) - eq(gc(3), ([(2, 0, 'class C1():', 'class')], 0)) + eq(gc(3), ([(2, 0, 'class C1:', 'class')], 0)) # Don't return comment. - eq(gc(4), ([(2, 0, 'class C1():', 'class')], 0)) + eq(gc(4), ([(2, 0, 'class C1:', 'class')], 0)) # Two indentation levels and no comment. - eq(gc(5), ([(2, 0, 'class C1():', 'class'), + eq(gc(5), ([(2, 0, 'class C1:', 'class'), (4, 4, ' def __init__(self, a, b):', 'def')], 0)) # Only one 'def' is returned, not both at the same indent level. - eq(gc(10), ([(2, 0, 'class C1():', 'class'), + eq(gc(10), ([(2, 0, 'class C1:', 'class'), (7, 4, ' def compare(self):', 'def'), (8, 8, ' if a > b:', 'if')], 0)) # With 'elif', also show the 'if' even though it's at the same level. - eq(gc(11), ([(2, 0, 'class C1():', 'class'), + eq(gc(11), ([(2, 0, 'class C1:', 'class'), (7, 4, ' def compare(self):', 'def'), (8, 8, ' if a > b:', 'if'), (10, 8, ' elif a < b:', 'elif')], 0)) # Set stop_line to not go back to first line in source code. # Return includes stop_line. - eq(gc(11, stopline=2), ([(2, 0, 'class C1():', 'class'), + eq(gc(11, stopline=2), ([(2, 0, 'class C1:', 'class'), (7, 4, ' def compare(self):', 'def'), (8, 8, ' if a > b:', 'if'), (10, 8, ' elif a < b:', 'elif')], 0)) @@ -240,37 +240,37 @@ def test_update_code_context(self): # Scroll down to line 2. cc.text.yview(2) cc.update_code_context() - eq(cc.info, [(0, -1, '', False), (2, 0, 'class C1():', 'class')]) + eq(cc.info, [(0, -1, '', False), (2, 0, 'class C1:', 'class')]) eq(cc.topvisible, 3) - eq(cc.context.get('1.0', 'end-1c'), 'class C1():') + eq(cc.context.get('1.0', 'end-1c'), 'class C1:') # Scroll down to line 3. Since it's a comment, nothing changes. cc.text.yview(3) cc.update_code_context() - eq(cc.info, [(0, -1, '', False), (2, 0, 'class C1():', 'class')]) + eq(cc.info, [(0, -1, '', False), (2, 0, 'class C1:', 'class')]) eq(cc.topvisible, 4) - eq(cc.context.get('1.0', 'end-1c'), 'class C1():') + eq(cc.context.get('1.0', 'end-1c'), 'class C1:') # Scroll down to line 4. cc.text.yview(4) cc.update_code_context() eq(cc.info, [(0, -1, '', False), - (2, 0, 'class C1():', 'class'), + (2, 0, 'class C1:', 'class'), (4, 4, ' def __init__(self, a, b):', 'def')]) eq(cc.topvisible, 5) - eq(cc.context.get('1.0', 'end-1c'), 'class C1():\n' + eq(cc.context.get('1.0', 'end-1c'), 'class C1:\n' ' def __init__(self, a, b):') # Scroll down to line 11. Last 'def' is removed. cc.text.yview(11) cc.update_code_context() eq(cc.info, [(0, -1, '', False), - (2, 0, 'class C1():', 'class'), + (2, 0, 'class C1:', 'class'), (7, 4, ' def compare(self):', 'def'), (8, 8, ' if a > b:', 'if'), (10, 8, ' elif a < b:', 'elif')]) eq(cc.topvisible, 12) - eq(cc.context.get('1.0', 'end-1c'), 'class C1():\n' + eq(cc.context.get('1.0', 'end-1c'), 'class C1:\n' ' def compare(self):\n' ' if a > b:\n' ' elif a < b:') @@ -279,12 +279,12 @@ def test_update_code_context(self): cc.update_code_context() cc.context_depth = 1 eq(cc.info, [(0, -1, '', False), - (2, 0, 'class C1():', 'class'), + (2, 0, 'class C1:', 'class'), (7, 4, ' def compare(self):', 'def'), (8, 8, ' if a > b:', 'if'), (10, 8, ' elif a < b:', 'elif')]) eq(cc.topvisible, 12) - eq(cc.context.get('1.0', 'end-1c'), 'class C1():\n' + eq(cc.context.get('1.0', 'end-1c'), 'class C1:\n' ' def compare(self):\n' ' if a > b:\n' ' elif a < b:') @@ -293,7 +293,7 @@ def test_update_code_context(self): cc.text.yview(5) cc.update_code_context() eq(cc.info, [(0, -1, '', False), - (2, 0, 'class C1():', 'class'), + (2, 0, 'class C1:', 'class'), (4, 4, ' def __init__(self, a, b):', 'def')]) eq(cc.topvisible, 6) # context_depth is 1. @@ -440,7 +440,7 @@ def test_get_line_info(self): # Line 1 is not a BLOCKOPENER. eq(gli(lines[0]), (codecontext.INFINITY, '', False)) # Line 2 is a BLOCKOPENER without an indent. - eq(gli(lines[1]), (0, 'class C1():', 'class')) + eq(gli(lines[1]), (0, 'class C1:', 'class')) # Line 3 is not a BLOCKOPENER and does not return the indent level. eq(gli(lines[2]), (codecontext.INFINITY, ' # Class comment.', False)) # Line 4 is a BLOCKOPENER and is indented. diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py index 1fea6d41df811cc19e9c1e98dcae364a9f09035d..98ddc67afdcc0834c8a5dedc2ec83634b8a80926 100644 --- a/Lib/idlelib/idle_test/test_configdialog.py +++ b/Lib/idlelib/idle_test/test_configdialog.py @@ -423,7 +423,7 @@ def test_custom_name(self): def test_color(self): d = self.page d.on_new_color_set = Func() - # self.color is only set in get_color through ColorChooser. + # self.color is only set in get_color through colorchooser. d.color.set('green') self.assertEqual(d.on_new_color_set.called, 1) del d.on_new_color_set @@ -540,8 +540,8 @@ def test_set_theme_type(self): def test_get_color(self): eq = self.assertEqual d = self.page - orig_chooser = configdialog.tkColorChooser.askcolor - chooser = configdialog.tkColorChooser.askcolor = Func() + orig_chooser = configdialog.colorchooser.askcolor + chooser = configdialog.colorchooser.askcolor = Func() gntn = d.get_new_theme_name = Func() d.highlight_target.set('Editor Breakpoint') @@ -582,7 +582,7 @@ def test_get_color(self): eq(d.color.get(), '#de0000') del d.get_new_theme_name - configdialog.tkColorChooser.askcolor = orig_chooser + configdialog.colorchooser.askcolor = orig_chooser def test_on_new_color_set(self): d = self.page diff --git a/Lib/idlelib/idle_test/test_debugger_r.py b/Lib/idlelib/idle_test/test_debugger_r.py index 199f63447ce6cac9135c31a80e3b39e650a713b7..638ebd36a7405d273105dcc36d474b8746cede4c 100644 --- a/Lib/idlelib/idle_test/test_debugger_r.py +++ b/Lib/idlelib/idle_test/test_debugger_r.py @@ -25,5 +25,19 @@ def test_init(self): # Classes GUIProxy, IdbAdapter, FrameProxy, CodeProxy, DictProxy, # GUIAdapter, IdbProxy plus 7 module functions. +class IdbAdapterTest(unittest.TestCase): + + def test_dict_item_noattr(self): # Issue 33065. + + class BinData: + def __repr__(self): + return self.length + + debugger_r.dicttable[0] = {'BinData': BinData()} + idb = debugger_r.IdbAdapter(None) + self.assertTrue(idb.dict_item(0, 'BinData')) + debugger_r.dicttable.clear() + + if __name__ == '__main__': unittest.main(verbosity=2) diff --git a/Lib/idlelib/idle_test/test_format.py b/Lib/idlelib/idle_test/test_format.py index a79bb515089e7bc101ac200755bce7c2585ad41d..e5e903688597aa770452f15102f9ee7850ace49e 100644 --- a/Lib/idlelib/idle_test/test_format.py +++ b/Lib/idlelib/idle_test/test_format.py @@ -418,7 +418,7 @@ def tearDown(self): code_sample = """\ # WS line needed for test. -class C1(): +class C1: # Class comment. def __init__(self, a, b): self.a = a diff --git a/Lib/idlelib/idle_test/test_help_about.py b/Lib/idlelib/idle_test/test_help_about.py index 7c148d23a135b64e143d7e8587b84b62ec71d7c5..b915535acac0cc448c63cff87bfb212523f36c10 100644 --- a/Lib/idlelib/idle_test/test_help_about.py +++ b/Lib/idlelib/idle_test/test_help_about.py @@ -134,7 +134,7 @@ def test_close(self): self.dialog.winfo_class() -class Dummy_about_dialog(): +class Dummy_about_dialog: # Dummy class for testing file display functions. idle_credits = About.show_idle_credits idle_readme = About.show_readme diff --git a/Lib/idlelib/idle_test/test_mainmenu.py b/Lib/idlelib/idle_test/test_mainmenu.py index 7ec0368371c7dfd783f3430b453403add433a399..51d2accfe48a1c738b73509563d21bc59e5d3a12 100644 --- a/Lib/idlelib/idle_test/test_mainmenu.py +++ b/Lib/idlelib/idle_test/test_mainmenu.py @@ -2,6 +2,7 @@ # Reported as 88%; mocking turtledemo absence would have no point. from idlelib import mainmenu +import re import unittest @@ -16,6 +17,26 @@ def test_menudefs(self): def test_default_keydefs(self): self.assertGreaterEqual(len(mainmenu.default_keydefs), 50) + def test_tcl_indexes(self): + # Test tcl patterns used to find menuitem to alter. + # On failure, change pattern here and in function(s). + # Patterns here have '.*' for re instead of '*' for tcl. + for menu, pattern in ( + ('debug', '.*tack.*iewer'), # PyShell.debug_menu_postcommand + ('options', '.*ode.*ontext'), # EW.__init__, CodeContext.toggle... + ('options', '.*ine.*umbers'), # EW.__init__, EW.toggle...event. + ): + with self.subTest(menu=menu, pattern=pattern): + for menutup in mainmenu.menudefs: + if menutup[0] == menu: + break + else: + self.assertTrue(0, f"{menu} not in menudefs") + self.assertTrue(any(re.search(pattern, menuitem[0]) + for menuitem in menutup[1] + if menuitem is not None), # Separator. + f"{pattern} not in {menu}") + if __name__ == '__main__': unittest.main(verbosity=2) diff --git a/Lib/idlelib/idle_test/test_pyparse.py b/Lib/idlelib/idle_test/test_pyparse.py index f21baf7534420a9d014c9dde3920339e1ff14066..fb5726db1d821ebd4a94db7a83682f250d28b453 100644 --- a/Lib/idlelib/idle_test/test_pyparse.py +++ b/Lib/idlelib/idle_test/test_pyparse.py @@ -73,11 +73,12 @@ def char_in_string_false(index): return False # Split def across lines. setcode('"""This is a module docstring"""\n' - 'class C():\n' + 'class C:\n' ' def __init__(self, a,\n' ' b=True):\n' ' pass\n' ) + pos0, pos = 33, 42 # Start of 'class...', ' def' lines. # Passing no value or non-callable should fail (issue 32989). with self.assertRaises(TypeError): @@ -91,40 +92,41 @@ def char_in_string_false(index): return False # Make all text look like it's not in a string. This means that it # found a good start position. - eq(start(char_in_string_false), 44) + eq(start(char_in_string_false), pos) # If the beginning of the def line is not in a string, then it # returns that as the index. - eq(start(is_char_in_string=lambda index: index > 44), 44) + eq(start(is_char_in_string=lambda index: index > pos), pos) # If the beginning of the def line is in a string, then it # looks for a previous index. - eq(start(is_char_in_string=lambda index: index >= 44), 33) + eq(start(is_char_in_string=lambda index: index >= pos), pos0) # If everything before the 'def' is in a string, then returns None. # The non-continuation def line returns 44 (see below). - eq(start(is_char_in_string=lambda index: index < 44), None) + eq(start(is_char_in_string=lambda index: index < pos), None) # Code without extra line break in def line - mostly returns the same # values. setcode('"""This is a module docstring"""\n' - 'class C():\n' + 'class C:\n' ' def __init__(self, a, b=True):\n' ' pass\n' - ) - eq(start(char_in_string_false), 44) - eq(start(is_char_in_string=lambda index: index > 44), 44) - eq(start(is_char_in_string=lambda index: index >= 44), 33) + ) # Does not affect class, def positions. + eq(start(char_in_string_false), pos) + eq(start(is_char_in_string=lambda index: index > pos), pos) + eq(start(is_char_in_string=lambda index: index >= pos), pos0) # When the def line isn't split, this returns which doesn't match the # split line test. - eq(start(is_char_in_string=lambda index: index < 44), 44) + eq(start(is_char_in_string=lambda index: index < pos), pos) def test_set_lo(self): code = ( '"""This is a module docstring"""\n' - 'class C():\n' + 'class C:\n' ' def __init__(self, a,\n' ' b=True):\n' ' pass\n' ) + pos = 42 p = self.parser p.set_code(code) @@ -137,8 +139,8 @@ def test_set_lo(self): self.assertEqual(p.code, code) # An index that is preceded by a newline. - p.set_lo(44) - self.assertEqual(p.code, code[44:]) + p.set_lo(pos) + self.assertEqual(p.code, code[pos:]) def test_study1(self): eq = self.assertEqual diff --git a/Lib/idlelib/idle_test/test_replace.py b/Lib/idlelib/idle_test/test_replace.py index c3c5d2eeb94998bdfb643eaabdf8e8eec213ce98..6c07389b29ad4558077353dd65eccb32c722dcba 100644 --- a/Lib/idlelib/idle_test/test_replace.py +++ b/Lib/idlelib/idle_test/test_replace.py @@ -10,7 +10,7 @@ from idlelib.idle_test.mock_tk import Mbox import idlelib.searchengine as se -orig_mbox = se.tkMessageBox +orig_mbox = se.messagebox showerror = Mbox.showerror @@ -20,7 +20,7 @@ class ReplaceDialogTest(unittest.TestCase): def setUpClass(cls): cls.root = Tk() cls.root.withdraw() - se.tkMessageBox = Mbox + se.messagebox = Mbox cls.engine = se.SearchEngine(cls.root) cls.dialog = ReplaceDialog(cls.root, cls.engine) cls.dialog.bell = lambda: None @@ -32,7 +32,7 @@ def setUpClass(cls): @classmethod def tearDownClass(cls): - se.tkMessageBox = orig_mbox + se.messagebox = orig_mbox del cls.text, cls.dialog, cls.engine cls.root.destroy() del cls.root diff --git a/Lib/idlelib/idle_test/test_run.py b/Lib/idlelib/idle_test/test_run.py index 9995dbe2eca50235dda8ae297a62576692d3ce63..a31671ee0485fa4e04c305426c0643502bc2cac9 100644 --- a/Lib/idlelib/idle_test/test_run.py +++ b/Lib/idlelib/idle_test/test_run.py @@ -1,15 +1,18 @@ -"Test run, coverage 42%." +"Test run, coverage 49%." from idlelib import run +import io +import sys +from test.support import captured_output, captured_stderr import unittest from unittest import mock -from test.support import captured_stderr +import idlelib +from idlelib.idle_test.mock_idle import Func -import io -import sys +idlelib.testing = True # Use {} for executing test user code. -class RunTest(unittest.TestCase): +class PrintExceptionTest(unittest.TestCase): def test_print_exception_unhashable(self): class UnhashableException(Exception): @@ -282,7 +285,8 @@ def test_close(self): self.assertRaises(TypeError, f.close, 1) -class TestSysRecursionLimitWrappers(unittest.TestCase): +class RecursionLimitTest(unittest.TestCase): + # Test (un)install_recursionlimit_wrappers and fixdoc. def test_bad_setrecursionlimit_calls(self): run.install_recursionlimit_wrappers() @@ -296,12 +300,12 @@ def test_roundtrip(self): run.install_recursionlimit_wrappers() self.addCleanup(run.uninstall_recursionlimit_wrappers) - # check that setting the recursion limit works + # Check that setting the recursion limit works. orig_reclimit = sys.getrecursionlimit() self.addCleanup(sys.setrecursionlimit, orig_reclimit) sys.setrecursionlimit(orig_reclimit + 3) - # check that the new limit is returned by sys.getrecursionlimit() + # Check that the new limit is returned by sys.getrecursionlimit(). new_reclimit = sys.getrecursionlimit() self.assertEqual(new_reclimit, orig_reclimit + 3) @@ -313,6 +317,7 @@ def test_default_recursion_limit_preserved(self): self.assertEqual(new_reclimit, orig_reclimit) def test_fixdoc(self): + # Put here until better place for miscellaneous test. def func(): "docstring" run.fixdoc(func, "more") self.assertEqual(func.__doc__, "docstring\n\nmore") @@ -321,5 +326,65 @@ def func(): "docstring" self.assertEqual(func.__doc__, "more") +class HandleErrorTest(unittest.TestCase): + # Method of MyRPCServer + def test_fatal_error(self): + eq = self.assertEqual + with captured_output('__stderr__') as err,\ + mock.patch('idlelib.run.thread.interrupt_main', + new_callable=Func) as func: + try: + raise EOFError + except EOFError: + run.MyRPCServer.handle_error(None, 'abc', '123') + eq(run.exit_now, True) + run.exit_now = False + eq(err.getvalue(), '') + + try: + raise IndexError + except IndexError: + run.MyRPCServer.handle_error(None, 'abc', '123') + eq(run.quitting, True) + run.quitting = False + msg = err.getvalue() + self.assertIn('abc', msg) + self.assertIn('123', msg) + self.assertIn('IndexError', msg) + eq(func.called, 2) + + +class ExecRuncodeTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + cls.addClassCleanup(setattr,run,'print_exception',run.print_exception) + cls.prt = Func() # Need reference. + run.print_exception = cls.prt + mockrpc = mock.Mock() + mockrpc.console.getvar = Func(result=False) + cls.ex = run.Executive(mockrpc) + + @classmethod + def tearDownClass(cls): + assert sys.excepthook == sys.__excepthook__ + + def test_exceptions(self): + ex = self.ex + ex.runcode('1/0') + self.assertIs(ex.user_exc_info[0], ZeroDivisionError) + + self.addCleanup(setattr, sys, 'excepthook', sys.__excepthook__) + sys.excepthook = lambda t, e, tb: run.print_exception(t) + ex.runcode('1/0') + self.assertIs(self.prt.args[0], ZeroDivisionError) + + sys.excepthook = lambda: None + ex.runcode('1/0') + t, e, tb = ex.user_exc_info + self.assertIs(t, TypeError) + self.assertTrue(isinstance(e.__context__, ZeroDivisionError)) + + if __name__ == '__main__': unittest.main(verbosity=2) diff --git a/Lib/idlelib/idle_test/test_searchbase.py b/Lib/idlelib/idle_test/test_searchbase.py index aee0c4c69929a623409a4e6ffd83356173f3abe2..8c9c410ebaf47c0626655cffe0fda4db83960819 100644 --- a/Lib/idlelib/idle_test/test_searchbase.py +++ b/Lib/idlelib/idle_test/test_searchbase.py @@ -76,7 +76,7 @@ def test_create_widgets(self): def test_make_entry(self): equal = self.assertEqual self.dialog.row = 0 - self.dialog.top = self.root + self.dialog.frame = Frame(self.root) entry, label = self.dialog.make_entry("Test:", 'hello') equal(label['text'], 'Test:') @@ -89,7 +89,7 @@ def test_make_entry(self): equal(self.dialog.row, 1) def test_create_entries(self): - self.dialog.top = self.root + self.dialog.frame = Frame(self.root) self.dialog.row = 0 self.engine.setpat('hello') self.dialog.create_entries() @@ -97,7 +97,7 @@ def test_create_entries(self): def test_make_frame(self): self.dialog.row = 0 - self.dialog.top = self.root + self.dialog.frame = Frame(self.root) frame, label = self.dialog.make_frame() self.assertEqual(label, '') self.assertEqual(str(type(frame)), "") @@ -108,7 +108,7 @@ def test_make_frame(self): self.assertEqual(label['text'], 'testlabel') def btn_test_setup(self, meth): - self.dialog.top = self.root + self.dialog.frame = Frame(self.root) self.dialog.row = 0 return meth() @@ -140,13 +140,13 @@ def test_create_other_buttons(self): self.assertEqual(var.get(), state) def test_make_button(self): - self.dialog.top = self.root - self.dialog.buttonframe = Frame(self.dialog.top) + self.dialog.frame = Frame(self.root) + self.dialog.buttonframe = Frame(self.dialog.frame) btn = self.dialog.make_button('Test', self.dialog.close) self.assertEqual(btn['text'], 'Test') def test_create_command_buttons(self): - self.dialog.top = self.root + self.dialog.frame = Frame(self.root) self.dialog.create_command_buttons() # Look for close button command in buttonframe closebuttoncommand = '' diff --git a/Lib/idlelib/idle_test/test_searchengine.py b/Lib/idlelib/idle_test/test_searchengine.py index 3d26d62a95a8730b90933e5a7928852cc3802880..9d97983941958606af154d8a4f8bb70bf9695d00 100644 --- a/Lib/idlelib/idle_test/test_searchengine.py +++ b/Lib/idlelib/idle_test/test_searchengine.py @@ -4,7 +4,7 @@ import unittest # from test.support import requires from tkinter import BooleanVar, StringVar, TclError # ,Tk, Text -import tkinter.messagebox as tkMessageBox +from tkinter import messagebox from idlelib.idle_test.mock_tk import Var, Mbox from idlelib.idle_test.mock_tk import Text as mockText import re @@ -19,13 +19,13 @@ def setUpModule(): # Replace s-e module tkinter imports other than non-gui TclError. se.BooleanVar = Var se.StringVar = Var - se.tkMessageBox = Mbox + se.messagebox = Mbox def tearDownModule(): # Restore 'just in case', though other tests should also replace. se.BooleanVar = BooleanVar se.StringVar = StringVar - se.tkMessageBox = tkMessageBox + se.messagebox = messagebox class Mock: @@ -175,11 +175,13 @@ def test_getprog(self): engine.setpat('') Equal(engine.getprog(), None) + Equal(Mbox.showerror.message, + 'Error: Empty regular expression') engine.setpat('+') engine.revar.set(1) Equal(engine.getprog(), None) - self.assertEqual(Mbox.showerror.message, - 'Error: nothing to repeat at position 0\nPattern: +') + Equal(Mbox.showerror.message, + 'Error: nothing to repeat\nPattern: +\nOffset: 0') def test_report_error(self): showerror = Mbox.showerror diff --git a/Lib/idlelib/idle_test/test_squeezer.py b/Lib/idlelib/idle_test/test_squeezer.py index e3912f4bbbec892cc6ee257440292f9192af9584..ee1bbd76b50562d8a16fc80ad4808a038d2e6b6e 100644 --- a/Lib/idlelib/idle_test/test_squeezer.py +++ b/Lib/idlelib/idle_test/test_squeezer.py @@ -396,7 +396,7 @@ def test_expand_dangerous_oupput(self): expandingbutton.base_text = expandingbutton.text # Patch the message box module to always return False. - with patch('idlelib.squeezer.tkMessageBox') as mock_msgbox: + with patch('idlelib.squeezer.messagebox') as mock_msgbox: mock_msgbox.askokcancel.return_value = False mock_msgbox.askyesno.return_value = False # Trigger the expand event. @@ -407,7 +407,7 @@ def test_expand_dangerous_oupput(self): self.assertEqual(expandingbutton.text.get('1.0', 'end-1c'), '') # Patch the message box module to always return True. - with patch('idlelib.squeezer.tkMessageBox') as mock_msgbox: + with patch('idlelib.squeezer.messagebox') as mock_msgbox: mock_msgbox.askokcancel.return_value = True mock_msgbox.askyesno.return_value = True # Trigger the expand event. diff --git a/Lib/idlelib/idle_test/test_zzdummy.py b/Lib/idlelib/idle_test/test_zzdummy.py new file mode 100644 index 0000000000000000000000000000000000000000..1013cdc3c46f4f5243da4d955cab722180f091d0 --- /dev/null +++ b/Lib/idlelib/idle_test/test_zzdummy.py @@ -0,0 +1,152 @@ +"Test zzdummy, coverage 100%." + +from idlelib import zzdummy +import unittest +from test.support import requires +from tkinter import Tk, Text +from unittest import mock +from idlelib import config +from idlelib import editor +from idlelib import format + + +usercfg = zzdummy.idleConf.userCfg +testcfg = { + 'main': config.IdleUserConfParser(''), + 'highlight': config.IdleUserConfParser(''), + 'keys': config.IdleUserConfParser(''), + 'extensions': config.IdleUserConfParser(''), +} +code_sample = """\ + +class C1(): + # Class comment. + def __init__(self, a, b): + self.a = a + self.b = b +""" + + +class DummyEditwin: + get_selection_indices = editor.EditorWindow.get_selection_indices + def __init__(self, root, text): + self.root = root + self.top = root + self.text = text + self.fregion = format.FormatRegion(self) + self.text.undo_block_start = mock.Mock() + self.text.undo_block_stop = mock.Mock() + + +class ZZDummyTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + root = cls.root = Tk() + root.withdraw() + text = cls.text = Text(cls.root) + cls.editor = DummyEditwin(root, text) + zzdummy.idleConf.userCfg = testcfg + + @classmethod + def tearDownClass(cls): + zzdummy.idleConf.userCfg = usercfg + del cls.editor, cls.text + cls.root.update_idletasks() + for id in cls.root.tk.call('after', 'info'): + cls.root.after_cancel(id) # Need for EditorWindow. + cls.root.destroy() + del cls.root + + def setUp(self): + text = self.text + text.insert('1.0', code_sample) + text.undo_block_start.reset_mock() + text.undo_block_stop.reset_mock() + zz = self.zz = zzdummy.ZzDummy(self.editor) + zzdummy.ZzDummy.ztext = '# ignore #' + + def tearDown(self): + self.text.delete('1.0', 'end') + del self.zz + + def checklines(self, text, value): + # Verify that there are lines being checked. + end_line = int(float(text.index('end'))) + + # Check each line for the starting text. + actual = [] + for line in range(1, end_line): + txt = text.get(f'{line}.0', f'{line}.end') + actual.append(txt.startswith(value)) + return actual + + def test_init(self): + zz = self.zz + self.assertEqual(zz.editwin, self.editor) + self.assertEqual(zz.text, self.editor.text) + + def test_reload(self): + self.assertEqual(self.zz.ztext, '# ignore #') + testcfg['extensions'].SetOption('ZzDummy', 'z-text', 'spam') + zzdummy.ZzDummy.reload() + self.assertEqual(self.zz.ztext, 'spam') + + def test_z_in_event(self): + eq = self.assertEqual + zz = self.zz + text = zz.text + eq(self.zz.ztext, '# ignore #') + + # No lines have the leading text. + expected = [False, False, False, False, False, False, False] + actual = self.checklines(text, zz.ztext) + eq(expected, actual) + + text.tag_add('sel', '2.0', '4.end') + eq(zz.z_in_event(), 'break') + expected = [False, True, True, True, False, False, False] + actual = self.checklines(text, zz.ztext) + eq(expected, actual) + + text.undo_block_start.assert_called_once() + text.undo_block_stop.assert_called_once() + + def test_z_out_event(self): + eq = self.assertEqual + zz = self.zz + text = zz.text + eq(self.zz.ztext, '# ignore #') + + # Prepend text. + text.tag_add('sel', '2.0', '5.end') + zz.z_in_event() + text.undo_block_start.reset_mock() + text.undo_block_stop.reset_mock() + + # Select a few lines to remove text. + text.tag_remove('sel', '1.0', 'end') + text.tag_add('sel', '3.0', '4.end') + eq(zz.z_out_event(), 'break') + expected = [False, True, False, False, True, False, False] + actual = self.checklines(text, zz.ztext) + eq(expected, actual) + + text.undo_block_start.assert_called_once() + text.undo_block_stop.assert_called_once() + + def test_roundtrip(self): + # Insert and remove to all code should give back original text. + zz = self.zz + text = zz.text + + text.tag_add('sel', '1.0', 'end-1c') + zz.z_in_event() + zz.z_out_event() + + self.assertEqual(text.get('1.0', 'end-1c'), code_sample) + + +if __name__ == '__main__': + unittest.main(verbosity=2) diff --git a/Lib/idlelib/iomenu.py b/Lib/idlelib/iomenu.py index 74ebefd4208f78fac6eede4f1aa25159566a1ef1..5ebf7089fb9abede84b41c504f4d95cac0923de0 100644 --- a/Lib/idlelib/iomenu.py +++ b/Lib/idlelib/iomenu.py @@ -5,8 +5,8 @@ import tempfile import tokenize -import tkinter.filedialog as tkFileDialog -import tkinter.messagebox as tkMessageBox +from tkinter import filedialog +from tkinter import messagebox from tkinter.simpledialog import askstring import idlelib @@ -147,14 +147,25 @@ def loadfile(self, filename): eol_convention = f.newlines converted = True except OSError as err: - tkMessageBox.showerror("I/O Error", str(err), parent=self.text) + messagebox.showerror("I/O Error", str(err), parent=self.text) return False except UnicodeDecodeError: - tkMessageBox.showerror("Decoding Error", + messagebox.showerror("Decoding Error", "File %s\nFailed to Decode" % filename, parent=self.text) return False + if not isinstance(eol_convention, str): + # If the file does not contain line separators, it is None. + # If the file contains mixed line separators, it is a tuple. + if eol_convention is not None: + messagebox.showwarning("Mixed Newlines", + "Mixed newlines detected.\n" + "The file will be changed on save.", + parent=self.text) + converted = True + eol_convention = os.linesep # default + self.text.delete("1.0", "end") self.set_filename(None) self.fileencoding = fileencoding @@ -176,10 +187,10 @@ def maybesave(self): return "yes" message = "Do you want to save %s before closing?" % ( self.filename or "this untitled document") - confirm = tkMessageBox.askyesnocancel( + confirm = messagebox.askyesnocancel( title="Save On Close", message=message, - default=tkMessageBox.YES, + default=messagebox.YES, parent=self.text) if confirm: reply = "yes" @@ -238,7 +249,7 @@ def writefile(self, filename): os.fsync(f.fileno()) return True except OSError as msg: - tkMessageBox.showerror("I/O Error", str(msg), + messagebox.showerror("I/O Error", str(msg), parent=self.text) return False @@ -275,7 +286,7 @@ def encode(self, chars): failed = str(err) except UnicodeEncodeError: failed = "Invalid encoding '%s'" % enc - tkMessageBox.showerror( + messagebox.showerror( "I/O Error", "%s.\nSaving as UTF-8" % failed, parent=self.text) @@ -284,10 +295,10 @@ def encode(self, chars): return chars.encode('utf-8-sig') def print_window(self, event): - confirm = tkMessageBox.askokcancel( + confirm = messagebox.askokcancel( title="Print", message="Print to Default Printer", - default=tkMessageBox.OK, + default=messagebox.OK, parent=self.text) if not confirm: self.text.focus_set() @@ -325,10 +336,10 @@ def print_window(self, event): status + output if output: output = "Printing command: %s\n" % repr(command) + output - tkMessageBox.showerror("Print status", output, parent=self.text) + messagebox.showerror("Print status", output, parent=self.text) else: #no printing for this platform message = "Printing is not enabled for this platform: %s" % platform - tkMessageBox.showinfo("Print status", message, parent=self.text) + messagebox.showinfo("Print status", message, parent=self.text) if tempfilename: os.unlink(tempfilename) return "break" @@ -347,7 +358,7 @@ def print_window(self, event): def askopenfile(self): dir, base = self.defaultfilename("open") if not self.opendialog: - self.opendialog = tkFileDialog.Open(parent=self.text, + self.opendialog = filedialog.Open(parent=self.text, filetypes=self.filetypes) filename = self.opendialog.show(initialdir=dir, initialfile=base) return filename @@ -367,7 +378,7 @@ def defaultfilename(self, mode="open"): def asksavefile(self): dir, base = self.defaultfilename("save") if not self.savedialog: - self.savedialog = tkFileDialog.SaveAs( + self.savedialog = filedialog.SaveAs( parent=self.text, filetypes=self.filetypes, defaultextension=self.defaultextension) diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index 66ae0f7435daba7df06a2d37bc9d4ff66ac382b7..fea3762461e99eabde888c3054dad4750b038480 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -21,13 +21,13 @@ except (ImportError, AttributeError, OSError): pass -import tkinter.messagebox as tkMessageBox +from tkinter import messagebox if TkVersion < 8.5: root = Tk() # otherwise create root in main root.withdraw() from idlelib.run import fix_scaling fix_scaling(root) - tkMessageBox.showerror("Idle Cannot Start", + messagebox.showerror("Idle Cannot Start", "Idle requires tcl/tk 8.5+, not %s." % TkVersion, parent=root) raise SystemExit(1) @@ -261,7 +261,7 @@ def store_file_breaks(self): except OSError as err: if not getattr(self.root, "breakpoint_error_displayed", False): self.root.breakpoint_error_displayed = True - tkMessageBox.showerror(title='IDLE Error', + messagebox.showerror(title='IDLE Error', message='Unable to update breakpoint list:\n%s' % str(err), parent=self.text) @@ -757,7 +757,7 @@ def runcommand(self, code): def runcode(self, code): "Override base class method" if self.tkconsole.executing: - self.interp.restart_subprocess() + self.restart_subprocess() self.checklinecache() debugger = self.debugger try: @@ -771,7 +771,7 @@ def runcode(self, code): exec(code, self.locals) except SystemExit: if not self.tkconsole.closing: - if tkMessageBox.askyesno( + if messagebox.askyesno( "Exit?", "Do you want to exit altogether?", default="yes", @@ -805,7 +805,7 @@ def write(self, s): return self.tkconsole.stderr.write(s) def display_port_binding_error(self): - tkMessageBox.showerror( + messagebox.showerror( "Port Binding Error", "IDLE can't bind to a TCP/IP port, which is necessary to " "communicate with its Python execution server. This might be " @@ -816,7 +816,7 @@ def display_port_binding_error(self): parent=self.tkconsole.text) def display_no_subprocess_error(self): - tkMessageBox.showerror( + messagebox.showerror( "Subprocess Connection Error", "IDLE's subprocess didn't make connection.\n" "See the 'Startup failure' section of the IDLE doc, online at\n" @@ -824,7 +824,7 @@ def display_no_subprocess_error(self): parent=self.tkconsole.text) def display_executing_dialog(self): - tkMessageBox.showerror( + messagebox.showerror( "Already executing", "The Python Shell window is already executing a command; " "please wait until it is finished.", @@ -833,7 +833,7 @@ def display_executing_dialog(self): class PyShell(OutputWindow): - shell_title = "Python " + python_version() + " Shell" + shell_title = "IDLE Shell " + python_version() # Override classes ColorDelegator = ModifiedColorDelegator @@ -945,7 +945,7 @@ def get_warning_stream(self): def toggle_debugger(self, event=None): if self.executing: - tkMessageBox.showerror("Don't debug now", + messagebox.showerror("Don't debug now", "You can only toggle the debugger when idle", parent=self.text) self.set_debugger_indicator() @@ -989,6 +989,10 @@ def open_debugger(self): self.showprompt() self.set_debugger_indicator() + def debug_menu_postcommand(self): + state = 'disabled' if self.executing else 'normal' + self.update_menu_state('debug', '*tack*iewer', state) + def beginexecuting(self): "Helper for ModifiedInterpreter" self.resetoutput() @@ -1003,7 +1007,7 @@ def endexecuting(self): def close(self): "Extend EditorWindow.close()" if self.executing: - response = tkMessageBox.askokcancel( + response = messagebox.askokcancel( "Kill?", "Your program is still running!\n Do you want to kill it?", default="ok", @@ -1061,8 +1065,10 @@ def begin(self): (sys.version, sys.platform, self.COPYRIGHT, nosub)) self.text.focus_force() self.showprompt() + # User code should use separate default Tk root window import tkinter - tkinter._default_root = None # 03Jan04 KBK What's this? + tkinter._support_default_root = True + tkinter._default_root = None return True def stop_readline(self): @@ -1252,7 +1258,7 @@ def open_stack_viewer(self, event=None): try: sys.last_traceback except: - tkMessageBox.showerror("No stack trace", + messagebox.showerror("No stack trace", "There is no stack trace yet.\n" "(sys.last_traceback is not defined)", parent=self.text) diff --git a/Lib/idlelib/rpc.py b/Lib/idlelib/rpc.py index aa8cbd36c47926daeab57a0ecce2a3204504e9f6..8efcf048fa3aa20d60efa1ff7973778f642922dd 100644 --- a/Lib/idlelib/rpc.py +++ b/Lib/idlelib/rpc.py @@ -125,7 +125,7 @@ def handle_error(self, request, client_address): response_queue = queue.Queue(0) -class SocketIO(object): +class SocketIO: nextseq = 0 @@ -486,7 +486,7 @@ def EOFhook(self): #----------------- end class SocketIO -------------------- -class RemoteObject(object): +class RemoteObject: # Token mix-in class pass @@ -497,7 +497,7 @@ def remoteref(obj): return RemoteProxy(oid) -class RemoteProxy(object): +class RemoteProxy: def __init__(self, oid): self.oid = oid @@ -547,7 +547,7 @@ def get_remote_proxy(self, oid): return RPCProxy(self, oid) -class RPCProxy(object): +class RPCProxy: __methods = None __attributes = None @@ -596,7 +596,7 @@ def _getattributes(obj, attributes): attributes[name] = 1 -class MethodProxy(object): +class MethodProxy: def __init__(self, sockio, oid, name): self.sockio = sockio diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index 5bd84aadcd8011ea1eda835ccb242ada0964ee7f..07e9a2bf9ceeae1d356e404c58c2247cd43a688f 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -16,6 +16,7 @@ import threading import warnings +import idlelib # testing from idlelib import autocomplete # AutoComplete, fetch_encodings from idlelib import calltip # Calltip from idlelib import debugger_r # start_debugger @@ -387,14 +388,21 @@ def handle_error(self, request, client_address): thread.interrupt_main() except: erf = sys.__stderr__ - print('\n' + '-'*40, file=erf) - print('Unhandled server exception!', file=erf) - print('Thread: %s' % threading.current_thread().name, file=erf) - print('Client Address: ', client_address, file=erf) - print('Request: ', repr(request), file=erf) - traceback.print_exc(file=erf) - print('\n*** Unrecoverable, server exiting!', file=erf) - print('-'*40, file=erf) + print(textwrap.dedent(f""" + {'-'*40} + Unhandled exception in user code execution server!' + Thread: {threading.current_thread().name} + IDLE Client Address: {client_address} + Request: {request!r} + """), file=erf) + traceback.print_exc(limit=-20, file=erf) + print(textwrap.dedent(f""" + *** Unrecoverable, server exiting! + + Users should never see this message; it is likely transient. + If this recurs, report this with a copy of the message + and an explanation of how to make it repeat. + {'-'*40}"""), file=erf) quitting = True thread.interrupt_main() @@ -531,18 +539,21 @@ def decode_interrupthook(self): thread.interrupt_main() -class Executive(object): +class Executive: def __init__(self, rpchandler): self.rpchandler = rpchandler - self.locals = __main__.__dict__ - self.calltip = calltip.Calltip() - self.autocomplete = autocomplete.AutoComplete() + if idlelib.testing is False: + self.locals = __main__.__dict__ + self.calltip = calltip.Calltip() + self.autocomplete = autocomplete.AutoComplete() + else: + self.locals = {} def runcode(self, code): global interruptable try: - self.usr_exc_info = None + self.user_exc_info = None interruptable = True try: exec(code, self.locals) @@ -555,10 +566,17 @@ def runcode(self, code): print('SystemExit: ' + str(ob), file=sys.stderr) # Return to the interactive prompt. except: - self.usr_exc_info = sys.exc_info() + self.user_exc_info = sys.exc_info() # For testing, hook, viewer. if quitting: exit() - print_exception() + if sys.excepthook is sys.__excepthook__: + print_exception() + else: + try: + sys.excepthook(*self.user_exc_info) + except: + self.user_exc_info = sys.exc_info() # For testing. + print_exception() jit = self.rpchandler.console.getvar("<>") if jit: self.rpchandler.interp.open_remote_stack_viewer() @@ -583,8 +601,8 @@ def get_the_completion_list(self, what, mode): return self.autocomplete.fetch_completions(what, mode) def stackviewer(self, flist_oid=None): - if self.usr_exc_info: - typ, val, tb = self.usr_exc_info + if self.user_exc_info: + typ, val, tb = self.user_exc_info else: return None flist = None diff --git a/Lib/idlelib/runscript.py b/Lib/idlelib/runscript.py index a54108794ab595d1353dce36d3658f496d773ec9..55712e904603f867df186ff076e855ceffe248d9 100644 --- a/Lib/idlelib/runscript.py +++ b/Lib/idlelib/runscript.py @@ -11,9 +11,10 @@ """ import os import tabnanny +import time import tokenize -import tkinter.messagebox as tkMessageBox +from tkinter import messagebox from idlelib.config import idleConf from idlelib import macosx @@ -42,9 +43,7 @@ def __init__(self, editwin): self.root = self.editwin.root # cli_args is list of strings that extends sys.argv self.cli_args = [] - - if macosx.isCocoaTk(): - self.editwin.text_frame.bind('<>', self._run_module_event) + self.perf = 0.0 # Workaround for macOS 11 Uni2; see bpo-42508. def check_module_event(self, event): if isinstance(self.editwin, outwin.OutputWindow): @@ -107,24 +106,10 @@ def checksyntax(self, filename): finally: shell.set_warning_stream(saved_stream) - def run_module_event(self, event): - if macosx.isCocoaTk(): - # Tk-Cocoa in MacOSX is broken until at least - # Tk 8.5.9, and without this rather - # crude workaround IDLE would hang when a user - # tries to run a module using the keyboard shortcut - # (the menu item works fine). - self.editwin.text_frame.after(200, - lambda: self.editwin.text_frame.event_generate( - '<>')) - return 'break' - else: - return self._run_module_event(event) - def run_custom_event(self, event): - return self._run_module_event(event, customize=True) + return self.run_module_event(event, customize=True) - def _run_module_event(self, event, *, customize=False): + def run_module_event(self, event, *, customize=False): """Run the module after setting up the environment. First check the syntax. Next get customization. If OK, make @@ -133,6 +118,8 @@ def _run_module_event(self, event, *, customize=False): module being executed and also add that directory to its sys.path if not already included. """ + if macosx.isCocoaTk() and (time.perf_counter() - self.perf < .05): + return 'break' if isinstance(self.editwin, outwin.OutputWindow): self.editwin.text.bell() return 'break' @@ -208,16 +195,17 @@ def getfilename(self): def ask_save_dialog(self): msg = "Source Must Be Saved\n" + 5*' ' + "OK to Save?" - confirm = tkMessageBox.askokcancel(title="Save Before Run or Check", + confirm = messagebox.askokcancel(title="Save Before Run or Check", message=msg, - default=tkMessageBox.OK, + default=messagebox.OK, parent=self.editwin.text) return confirm def errorbox(self, title, message): # XXX This should really be a function of EditorWindow... - tkMessageBox.showerror(title, message, parent=self.editwin.text) + messagebox.showerror(title, message, parent=self.editwin.text) self.editwin.text.focus_set() + self.perf = time.perf_counter() if __name__ == "__main__": diff --git a/Lib/idlelib/searchbase.py b/Lib/idlelib/searchbase.py index 6fba0b8e583f2b3d48574201459d3d1c360db6b2..fbef87aa2d3d04c1865b28252324b9e39d478947 100644 --- a/Lib/idlelib/searchbase.py +++ b/Lib/idlelib/searchbase.py @@ -33,6 +33,7 @@ def __init__(self, root, engine): '''Initialize root, engine, and top attributes. top (level widget): set in create_widgets() called from open(). + frame: container for all widgets in dialog. text (Text searched): set in open(), only used in subclasses(). ent (ry): created in make_entry() called from create_entry(). row (of grid): 0 in create_widgets(), +1 in make_entry/frame(). @@ -83,10 +84,14 @@ def create_widgets(self): top.wm_title(self.title) top.wm_iconname(self.icon) self.top = top + self.frame = Frame(top, padding="5px") + self.frame.grid(sticky="nwes") + top.grid_columnconfigure(0, weight=100) + top.grid_rowconfigure(0, weight=100) self.row = 0 - self.top.grid_columnconfigure(0, pad=2, weight=0) - self.top.grid_columnconfigure(1, pad=2, minsize=100, weight=100) + self.frame.grid_columnconfigure(0, pad=2, weight=0) + self.frame.grid_columnconfigure(1, pad=2, minsize=100, weight=100) self.create_entries() # row 0 (and maybe 1), cols 0, 1 self.create_option_buttons() # next row, cols 0, 1 @@ -99,9 +104,9 @@ def make_entry(self, label_text, var): entry - gridded labeled Entry for text entry. label - Label widget, returned for testing. ''' - label = Label(self.top, text=label_text) + label = Label(self.frame, text=label_text) label.grid(row=self.row, column=0, sticky="nw") - entry = Entry(self.top, textvariable=var, exportselection=0) + entry = Entry(self.frame, textvariable=var, exportselection=0) entry.grid(row=self.row, column=1, sticky="nwe") self.row = self.row + 1 return entry, label @@ -117,11 +122,11 @@ def make_frame(self,labeltext=None): label - Label widget, returned for testing. ''' if labeltext: - label = Label(self.top, text=labeltext) + label = Label(self.frame, text=labeltext) label.grid(row=self.row, column=0, sticky="nw") else: label = '' - frame = Frame(self.top) + frame = Frame(self.frame) frame.grid(row=self.row, column=1, columnspan=1, sticky="nwe") self.row = self.row + 1 return frame, label @@ -171,7 +176,7 @@ def make_button(self, label, command, isdef=0): def create_command_buttons(self): "Place buttons in vertical command frame gridded on right." - f = self.buttonframe = Frame(self.top) + f = self.buttonframe = Frame(self.frame) f.grid(row=0,column=2,padx=2,pady=2,ipadx=2,ipady=2) b = self.make_button("Close", self.close) diff --git a/Lib/idlelib/searchengine.py b/Lib/idlelib/searchengine.py index 911e7d4691cac11f45cf7f2fd86d641f147ce90c..eddef581ab40a752b287ee43b052d2e65731d12d 100644 --- a/Lib/idlelib/searchengine.py +++ b/Lib/idlelib/searchengine.py @@ -2,7 +2,7 @@ import re from tkinter import StringVar, BooleanVar, TclError -import tkinter.messagebox as tkMessageBox +from tkinter import messagebox def get(root): '''Return the singleton SearchEngine instance for the process. @@ -84,22 +84,19 @@ def getprog(self): flags = flags | re.IGNORECASE try: prog = re.compile(pat, flags) - except re.error as what: - args = what.args - msg = args[0] - col = args[1] if len(args) >= 2 else -1 - self.report_error(pat, msg, col) + except re.error as e: + self.report_error(pat, e.msg, e.pos) return None return prog - def report_error(self, pat, msg, col=-1): + def report_error(self, pat, msg, col=None): # Derived class could override this with something fancier msg = "Error: " + str(msg) if pat: msg = msg + "\nPattern: " + str(pat) - if col >= 0: + if col is not None: msg = msg + "\nOffset: " + str(col) - tkMessageBox.showerror("Regular expression error", + messagebox.showerror("Regular expression error", msg, master=self.root) def search_text(self, text, prog=None, ok=0): diff --git a/Lib/idlelib/squeezer.py b/Lib/idlelib/squeezer.py index be1538a25fdedfc53281985398606dc427c67713..3046d803b74a4e3441785d118971f60356e07c1f 100644 --- a/Lib/idlelib/squeezer.py +++ b/Lib/idlelib/squeezer.py @@ -17,7 +17,7 @@ import re import tkinter as tk -import tkinter.messagebox as tkMessageBox +from tkinter import messagebox from idlelib.config import idleConf from idlelib.textview import view_text @@ -147,7 +147,7 @@ def expand(self, event=None): if self.is_dangerous is None: self.set_is_dangerous() if self.is_dangerous: - confirm = tkMessageBox.askokcancel( + confirm = messagebox.askokcancel( title="Expand huge output?", message="\n\n".join([ "The squeezed output is very long: %d lines, %d chars.", @@ -155,7 +155,7 @@ def expand(self, event=None): "It is recommended to view or copy the output instead.", "Really expand?" ]) % (self.numoflines, len(self.s)), - default=tkMessageBox.CANCEL, + default=messagebox.CANCEL, parent=self.text) if not confirm: return "break" diff --git a/Lib/idlelib/statusbar.py b/Lib/idlelib/statusbar.py index c071f898b0f7443e57cbad073d3ff5fefedd827f..755fafb0ac64388632b472d18b4cd0175e7df615 100644 --- a/Lib/idlelib/statusbar.py +++ b/Lib/idlelib/statusbar.py @@ -1,4 +1,4 @@ -from tkinter import Frame, Label +from tkinter.ttk import Label, Frame class MultiStatusBar(Frame): @@ -20,7 +20,8 @@ def set_label(self, name, text='', side='left', width=0): def _multistatus_bar(parent): # htest # - from tkinter import Toplevel, Frame, Text, Button + from tkinter import Toplevel, Text + from tkinter.ttk import Frame, Button top = Toplevel(parent) x, y = map(int, parent.geometry().split('+')[1:]) top.geometry("+%d+%d" %(x, y + 175)) diff --git a/Lib/idlelib/tooltip.py b/Lib/idlelib/tooltip.py index 69658264dbd4a485051d25cf7762e50098b01b3f..d714318dae8ef190d08df210fc9ef98e1d840c00 100644 --- a/Lib/idlelib/tooltip.py +++ b/Lib/idlelib/tooltip.py @@ -7,7 +7,7 @@ from tkinter import * -class TooltipBase(object): +class TooltipBase: """abstract base class for tooltips""" def __init__(self, anchor_widget): diff --git a/Lib/idlelib/zzdummy.py b/Lib/idlelib/zzdummy.py index 8084499646653df587a5e2c47f155257275fec29..1247e8f1cc052860b173e9959deaf134d4b6906a 100644 --- a/Lib/idlelib/zzdummy.py +++ b/Lib/idlelib/zzdummy.py @@ -1,42 +1,73 @@ -"Example extension, also used for testing." +"""Example extension, also used for testing. + +See extend.txt for more details on creating an extension. +See config-extension.def for configuring an extension. +""" from idlelib.config import idleConf +from functools import wraps + + +def format_selection(format_line): + "Apply a formatting function to all of the selected lines." + + @wraps(format_line) + def apply(self, event=None): + head, tail, chars, lines = self.formatter.get_region() + for pos in range(len(lines) - 1): + line = lines[pos] + lines[pos] = format_line(self, line) + self.formatter.set_region(head, tail, chars, lines) + return 'break' -ztext = idleConf.GetOption('extensions', 'ZzDummy', 'z-text') + return apply class ZzDummy: + """Prepend or remove initial text from selected lines.""" -## menudefs = [ -## ('format', [ -## ('Z in', '<>'), -## ('Z out', '<>'), -## ] ) -## ] + # Extend the format menu. + menudefs = [ + ('format', [ + ('Z in', '<>'), + ('Z out', '<>'), + ] ) + ] def __init__(self, editwin): + "Initialize the settings for this extension." + self.editwin = editwin self.text = editwin.text - z_in = False + self.formatter = editwin.fregion @classmethod def reload(cls): + "Load class variables from config." cls.ztext = idleConf.GetOption('extensions', 'ZzDummy', 'z-text') - def z_in_event(self, event): + @format_selection + def z_in_event(self, line): + """Insert text at the beginning of each selected line. + + This is bound to the <> virtual event when the extensions + are loaded. """ + return f'{self.ztext}{line}' + + @format_selection + def z_out_event(self, line): + """Remove specific text from the beginning of each selected line. + + This is bound to the <> virtual event when the extensions + are loaded. """ - text = self.text - text.undo_block_start() - for line in range(1, text.index('end')): - text.insert('%d.0', ztest) - text.undo_block_stop() - return "break" + zlength = 0 if not line.startswith(self.ztext) else len(self.ztext) + return line[zlength:] - def z_out_event(self, event): pass ZzDummy.reload() -##if __name__ == "__main__": -## import unittest -## unittest.main('idlelib.idle_test.test_zzdummy', -## verbosity=2, exit=False) + +if __name__ == "__main__": + import unittest + unittest.main('idlelib.idle_test.test_zzdummy', verbosity=2, exit=False) diff --git a/Lib/imaplib.py b/Lib/imaplib.py index 822d9d6fdd8f2af116fd1a112f8a8c25a9ecfa15..d9720f20c390256322cc207bf89fb4981dd0b218 100644 --- a/Lib/imaplib.py +++ b/Lib/imaplib.py @@ -98,6 +98,7 @@ 'THREAD': ('SELECTED',), 'UID': ('SELECTED',), 'UNSUBSCRIBE': ('AUTH', 'SELECTED'), + 'UNSELECT': ('SELECTED',), } # Patterns to match server responses @@ -135,10 +136,13 @@ class IMAP4: r"""IMAP4 client class. - Instantiate with: IMAP4([host[, port]]) + Instantiate with: IMAP4([host[, port[, timeout=None]]]) host - host's name (default: localhost); port - port number (default: standard IMAP4 port). + timeout - socket timeout (default: None) + If timeout is not given or is None, + the global default socket timeout is used All IMAP4rev1 commands are supported by methods of the same name (in lower-case). @@ -181,7 +185,7 @@ class error(Exception): pass # Logical errors - debug required class abort(error): pass # Service errors - close and retry class readonly(abort): pass # Mailbox status changed to READ-ONLY - def __init__(self, host='', port=IMAP4_PORT): + def __init__(self, host='', port=IMAP4_PORT, timeout=None): self.debug = Debug self.state = 'LOGOUT' self.literal = None # A literal argument to a command @@ -195,7 +199,7 @@ def __init__(self, host='', port=IMAP4_PORT): # Open socket to server. - self.open(host, port) + self.open(host, port, timeout) try: self._connect() @@ -284,15 +288,20 @@ def __exit__(self, *args): # Overridable methods - def _create_socket(self): + def _create_socket(self, timeout): # Default value of IMAP4.host is '', but socket.getaddrinfo() # (which is used by socket.create_connection()) expects None # as a default value for host. + if timeout is not None and not timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') host = None if not self.host else self.host sys.audit("imaplib.open", self, self.host, self.port) - return socket.create_connection((host, self.port)) + address = (host, self.port) + if timeout is not None: + return socket.create_connection(address, timeout) + return socket.create_connection(address) - def open(self, host = '', port = IMAP4_PORT): + def open(self, host='', port=IMAP4_PORT, timeout=None): """Setup connection to remote server on "host:port" (default: localhost:standard IMAP4 port). This connection will be used by the routines: @@ -300,7 +309,7 @@ def open(self, host = '', port = IMAP4_PORT): """ self.host = host self.port = port - self.sock = self._create_socket() + self.sock = self._create_socket(timeout) self.file = self.sock.makefile('rb') @@ -502,7 +511,7 @@ def deleteacl(self, mailbox, who): def enable(self, capability): """Send an RFC5161 enable string to the server. - (typ, [data]) = .enable(capability) + (typ, [data]) = .enable(capability) """ if 'ENABLE' not in self.capabilities: raise IMAP4.error("Server does not support ENABLE") @@ -894,6 +903,22 @@ def unsubscribe(self, mailbox): return self._simple_command('UNSUBSCRIBE', mailbox) + def unselect(self): + """Free server's resources associated with the selected mailbox + and returns the server to the authenticated state. + This command performs the same actions as CLOSE, except + that no messages are permanently removed from the currently + selected mailbox. + + (typ, [data]) = .unselect() + """ + try: + typ, data = self._simple_command('UNSELECT') + finally: + self.state = 'AUTH' + return typ, data + + def xatom(self, name, *args): """Allow simple extension commands notified by server in CAPABILITY response. @@ -1261,7 +1286,7 @@ class IMAP4_SSL(IMAP4): """IMAP4 client class over SSL connection - Instantiate with: IMAP4_SSL([host[, port[, keyfile[, certfile[, ssl_context]]]]]) + Instantiate with: IMAP4_SSL([host[, port[, keyfile[, certfile[, ssl_context[, timeout=None]]]]]]) host - host's name (default: localhost); port - port number (default: standard IMAP4 SSL port); @@ -1271,13 +1296,15 @@ class IMAP4_SSL(IMAP4): and private key (default: None) Note: if ssl_context is provided, then parameters keyfile or certfile should not be set otherwise ValueError is raised. + timeout - socket timeout (default: None) If timeout is not given or is None, + the global default socket timeout is used for more documentation see the docstring of the parent class IMAP4. """ def __init__(self, host='', port=IMAP4_SSL_PORT, keyfile=None, - certfile=None, ssl_context=None): + certfile=None, ssl_context=None, timeout=None): if ssl_context is not None and keyfile is not None: raise ValueError("ssl_context and keyfile arguments are mutually " "exclusive") @@ -1294,20 +1321,20 @@ def __init__(self, host='', port=IMAP4_SSL_PORT, keyfile=None, ssl_context = ssl._create_stdlib_context(certfile=certfile, keyfile=keyfile) self.ssl_context = ssl_context - IMAP4.__init__(self, host, port) + IMAP4.__init__(self, host, port, timeout) - def _create_socket(self): - sock = IMAP4._create_socket(self) + def _create_socket(self, timeout): + sock = IMAP4._create_socket(self, timeout) return self.ssl_context.wrap_socket(sock, server_hostname=self.host) - def open(self, host='', port=IMAP4_SSL_PORT): + def open(self, host='', port=IMAP4_SSL_PORT, timeout=None): """Setup connection to remote server on "host:port". (default: localhost:standard IMAP4 SSL port). This connection will be used by the routines: read, readline, send, shutdown. """ - IMAP4.open(self, host, port) + IMAP4.open(self, host, port, timeout) __all__.append("IMAP4_SSL") @@ -1329,7 +1356,7 @@ def __init__(self, command): IMAP4.__init__(self) - def open(self, host = None, port = None): + def open(self, host=None, port=None, timeout=None): """Setup a stream connection. This connection will be used by the routines: read, readline, send, shutdown. diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index 32deef10af9ba06d4365300bc3fb8c80b70cb49a..e00b27ece2603ea0b85db66db492095e9b50dc54 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -67,6 +67,7 @@ def has_deadlock(self): # Deadlock avoidance for concurrent circular imports. me = _thread.get_ident() tid = self.owner + seen = set() while True: lock = _blocking_on.get(tid) if lock is None: @@ -74,6 +75,14 @@ def has_deadlock(self): tid = lock.owner if tid == me: return True + if tid in seen: + # bpo 38091: the chain of tid's we encounter here + # eventually leads to a fixpoint or a cycle, but + # does not reach 'me'. This means we would not + # actually deadlock. This can happen if other + # threads are at the beginning of acquire() below. + return False + seen.add(tid) def acquire(self): """ @@ -371,7 +380,7 @@ def __eq__(self, other): self.cached == other.cached and self.has_location == other.has_location) except AttributeError: - return False + return NotImplemented @property def cached(self): @@ -713,6 +722,8 @@ class BuiltinImporter: """ + _ORIGIN = "built-in" + @staticmethod def module_repr(module): """Return repr for the module. @@ -720,14 +731,14 @@ def module_repr(module): The method is deprecated. The import machinery does the job itself. """ - return ''.format(module.__name__) + return f'' @classmethod def find_spec(cls, fullname, path=None, target=None): if path is not None: return None if _imp.is_builtin(fullname): - return spec_from_loader(fullname, cls, origin='built-in') + return spec_from_loader(fullname, cls, origin=cls._ORIGIN) else: return None @@ -873,7 +884,7 @@ def _resolve_name(name, package, level): """Resolve a relative module name to an absolute one.""" bits = package.rsplit('.', level - 1) if len(bits) < level: - raise ValueError('attempted relative import beyond top-level package') + raise ImportError('attempted relative import beyond top-level package') base = bits[0] return '{}.{}'.format(base, name) if name else base @@ -976,7 +987,12 @@ def _find_and_load_unlocked(name, import_): if parent: # Set the module as an attribute on its parent. parent_module = sys.modules[parent] - setattr(parent_module, name.rpartition('.')[2], module) + child = name.rpartition('.')[2] + try: + setattr(parent_module, child, module) + except AttributeError: + msg = f"Cannot set an attribute on {parent!r} for child module {child!r}" + _warnings.warn(msg, ImportWarning) return module diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index b8ac4829949a7c44399eb6fb3128a7f2592bdbe4..25a3f8c0e093433f5acf6b0e1494ee297f0d4c6c 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -34,8 +34,8 @@ def _make_relax_case(): key = b'PYTHONCASEOK' def _relax_case(): - """True if filenames must be checked case-insensitively.""" - return key in _os.environ + """True if filenames must be checked case-insensitively and ignore environment flags are not set.""" + return not sys.flags.ignore_environment and key in _os.environ else: def _relax_case(): """True if filenames must be checked case-insensitively.""" @@ -271,6 +271,13 @@ def _write_atomic(path, data, mode=0o666): # Python 3.8b2 3412 (Swap the position of positional args and positional # only args in ast.arguments #37593) # Python 3.8b4 3413 (Fix "break" and "continue" in "finally" #37830) +# Python 3.9a0 3420 (add LOAD_ASSERTION_ERROR #34880) +# Python 3.9a0 3421 (simplified bytecode for with blocks #32949) +# Python 3.9a0 3422 (remove BEGIN_FINALLY, END_FINALLY, CALL_FINALLY, POP_FINALLY bytecodes #33387) +# Python 3.9a2 3423 (add IS_OP, CONTAINS_OP and JUMP_IF_NOT_EXC_MATCH bytecodes #39156) +# Python 3.9a2 3424 (simplify bytecodes for *value unpacking) +# Python 3.9a2 3425 (simplify bytecodes for **value unpacking) + # # MAGIC must change whenever the bytecode emitted by the compiler may no # longer be understood by older implementations of the eval loop (usually @@ -279,7 +286,7 @@ def _write_atomic(path, data, mode=0o666): # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3413).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3425).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c _PYCACHE = '__pycache__' @@ -709,9 +716,9 @@ class WindowsRegistryFinder: @classmethod def _open_registry(cls, key): try: - return _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, key) + return winreg.OpenKey(winreg.HKEY_CURRENT_USER, key) except OSError: - return _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, key) + return winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, key) @classmethod def _search_registry(cls, fullname): @@ -723,7 +730,7 @@ def _search_registry(cls, fullname): sys_version='%d.%d' % sys.version_info[:2]) try: with cls._open_registry(key) as hkey: - filepath = _winreg.QueryValue(hkey, '') + filepath = winreg.QueryValue(hkey, '') except OSError: return None return filepath @@ -1577,14 +1584,7 @@ def _setup(_bootstrap_module): sys = _bootstrap.sys _imp = _bootstrap._imp - # Directly load built-in modules needed during bootstrap. self_module = sys.modules[__name__] - for builtin_name in ('_io', '_warnings', 'builtins', 'marshal'): - if builtin_name not in sys.modules: - builtin_module = _bootstrap._builtin_from_name(builtin_name) - else: - builtin_module = sys.modules[builtin_name] - setattr(self_module, builtin_name, builtin_module) # Directly load the os module (needed during bootstrap). os_details = ('posix', ['/']), ('nt', ['\\', '/']) @@ -1603,23 +1603,22 @@ def _setup(_bootstrap_module): continue else: raise ImportError('importlib requires posix or nt') + setattr(self_module, '_os', os_module) setattr(self_module, 'path_sep', path_sep) setattr(self_module, 'path_separators', ''.join(path_separators)) setattr(self_module, '_pathseps_with_colon', {f':{s}' for s in path_separators}) - # Directly load the _thread module (needed during bootstrap). - thread_module = _bootstrap._builtin_from_name('_thread') - setattr(self_module, '_thread', thread_module) - - # Directly load the _weakref module (needed during bootstrap). - weakref_module = _bootstrap._builtin_from_name('_weakref') - setattr(self_module, '_weakref', weakref_module) - - # Directly load the winreg module (needed during bootstrap). + # Directly load built-in modules needed during bootstrap. + builtin_names = ['_io', '_warnings', 'marshal'] if builtin_os == 'nt': - winreg_module = _bootstrap._builtin_from_name('winreg') - setattr(self_module, '_winreg', winreg_module) + builtin_names.append('winreg') + for builtin_name in builtin_names: + if builtin_name not in sys.modules: + builtin_module = _bootstrap._builtin_from_name(builtin_name) + else: + builtin_module = sys.modules[builtin_name] + setattr(self_module, builtin_name, builtin_module) # Constants setattr(self_module, '_relax_case', _make_relax_case()) diff --git a/Lib/importlib/_common.py b/Lib/importlib/_common.py new file mode 100644 index 0000000000000000000000000000000000000000..c1204f0b8f94b33dc5d17ee19dcd561d607ed866 --- /dev/null +++ b/Lib/importlib/_common.py @@ -0,0 +1,62 @@ +import os +import pathlib +import zipfile +import tempfile +import functools +import contextlib + + +def from_package(package): + """ + Return a Traversable object for the given package. + + """ + return fallback_resources(package.__spec__) + + +def fallback_resources(spec): + package_directory = pathlib.Path(spec.origin).parent + try: + archive_path = spec.loader.archive + rel_path = package_directory.relative_to(archive_path) + return zipfile.Path(archive_path, str(rel_path) + '/') + except Exception: + pass + return package_directory + + +@contextlib.contextmanager +def _tempfile(reader, suffix=''): + # Not using tempfile.NamedTemporaryFile as it leads to deeper 'try' + # blocks due to the need to close the temporary file to work on Windows + # properly. + fd, raw_path = tempfile.mkstemp(suffix=suffix) + try: + os.write(fd, reader()) + os.close(fd) + yield pathlib.Path(raw_path) + finally: + try: + os.remove(raw_path) + except FileNotFoundError: + pass + + +@functools.singledispatch +@contextlib.contextmanager +def as_file(path): + """ + Given a Traversable object, return that object as a + path on the local file system in a context manager. + """ + with _tempfile(path.read_bytes, suffix=path.name) as local: + yield local + + +@as_file.register(pathlib.Path) +@contextlib.contextmanager +def _(path): + """ + Degenerate behavior for pathlib.Path objects. + """ + yield path diff --git a/Lib/importlib/abc.py b/Lib/importlib/abc.py index 4b2d3de6d96f18ee74eb236160f5e3526e00f75c..b8a9bb1a21ef775946cde305bb5a0f19f90be1e8 100644 --- a/Lib/importlib/abc.py +++ b/Lib/importlib/abc.py @@ -10,10 +10,11 @@ _frozen_importlib = None try: import _frozen_importlib_external -except ImportError as exc: +except ImportError: _frozen_importlib_external = _bootstrap_external import abc import warnings +from typing import Protocol, runtime_checkable def _register(abstract_cls, *classes): @@ -386,3 +387,88 @@ def contents(self): _register(ResourceReader, machinery.SourceFileLoader) + + +@runtime_checkable +class Traversable(Protocol): + """ + An object with a subset of pathlib.Path methods suitable for + traversing directories and opening files. + """ + + @abc.abstractmethod + def iterdir(self): + """ + Yield Traversable objects in self + """ + + @abc.abstractmethod + def read_bytes(self): + """ + Read contents of self as bytes + """ + + @abc.abstractmethod + def read_text(self, encoding=None): + """ + Read contents of self as bytes + """ + + @abc.abstractmethod + def is_dir(self): + """ + Return True if self is a dir + """ + + @abc.abstractmethod + def is_file(self): + """ + Return True if self is a file + """ + + @abc.abstractmethod + def joinpath(self, child): + """ + Return Traversable child in self + """ + + @abc.abstractmethod + def __truediv__(self, child): + """ + Return Traversable child in self + """ + + @abc.abstractmethod + def open(self, mode='r', *args, **kwargs): + """ + mode may be 'r' or 'rb' to open as text or binary. Return a handle + suitable for reading (same as pathlib.Path.open). + + When opening as text, accepts encoding parameters such as those + accepted by io.TextIOWrapper. + """ + + @abc.abstractproperty + def name(self): + # type: () -> str + """ + The base name of this object without any parent references. + """ + + +class TraversableResources(ResourceReader): + @abc.abstractmethod + def files(self): + """Return a Traversable object for the loaded package.""" + + def open_resource(self, resource): + return self.files().joinpath(resource).open('rb') + + def resource_path(self, resource): + raise FileNotFoundError(resource) + + def is_resource(self, path): + return self.files().joinpath(path).isfile() + + def contents(self): + return (item.name for item in self.files().iterdir()) diff --git a/Lib/importlib/metadata.py b/Lib/importlib/metadata.py index 831f593277ccd478a0ec829e6a8462a21e6a5b5f..ffa0cba45706d6e77ffea484fc05ce2cfb405e67 100644 --- a/Lib/importlib/metadata.py +++ b/Lib/importlib/metadata.py @@ -78,6 +78,16 @@ def load(self): attrs = filter(None, (match.group('attr') or '').split('.')) return functools.reduce(getattr, attrs, module) + @property + def module(self): + match = self.pattern.match(self.value) + return match.group('module') + + @property + def attr(self): + match = self.pattern.match(self.value) + return match.group('attr') + @property def extras(self): match = self.pattern.match(self.value) @@ -170,7 +180,7 @@ def from_name(cls, name): """ for resolver in cls._discover_resolvers(): dists = resolver(DistributionFinder.Context(name=name)) - dist = next(dists, None) + dist = next(iter(dists), None) if dist is not None: return dist else: @@ -213,6 +223,17 @@ def _discover_resolvers(): ) return filter(None, declared) + @classmethod + def _local(cls, root='.'): + from pep517 import build, meta + system = build.compat_system(root) + builder = functools.partial( + meta.build, + source_dir=root, + system=system, + ) + return PathDistribution(zipfile.Path(meta.build_as_zip(builder))) + @property def metadata(self): """Return the parsed metadata for this Distribution. @@ -391,7 +412,7 @@ class FastPath: def __init__(self, root): self.root = root - self.base = os.path.basename(root).lower() + self.base = os.path.basename(self.root).lower() def joinpath(self, child): return pathlib.Path(self.root, child) @@ -408,8 +429,8 @@ def zip_children(self): names = zip_path.root.namelist() self.joinpath = zip_path.joinpath - return ( - posixpath.split(child)[0] + return dict.fromkeys( + child.split(posixpath.sep, 1)[0] for child in names ) @@ -475,7 +496,6 @@ def _search_paths(cls, name, paths): ) - class PathDistribution(Distribution): def __init__(self, path): """Construct a distribution from a path to the metadata directory. diff --git a/Lib/importlib/resources.py b/Lib/importlib/resources.py index fc3a1c9cabe636bb88be89c27225ebf66a8e5967..b803a01c91d6527de9f3033d5d4c026cc5745cb2 100644 --- a/Lib/importlib/resources.py +++ b/Lib/importlib/resources.py @@ -1,23 +1,25 @@ import os -import tempfile from . import abc as resources_abc +from . import _common +from ._common import as_file from contextlib import contextmanager, suppress from importlib import import_module from importlib.abc import ResourceLoader from io import BytesIO, TextIOWrapper from pathlib import Path from types import ModuleType -from typing import Iterable, Iterator, Optional, Set, Union # noqa: F401 +from typing import ContextManager, Iterable, Optional, Union from typing import cast from typing.io import BinaryIO, TextIO -from zipimport import ZipImportError __all__ = [ 'Package', 'Resource', + 'as_file', 'contents', + 'files', 'is_resource', 'open_binary', 'open_text', @@ -31,24 +33,23 @@ Resource = Union[str, os.PathLike] +def _resolve(name) -> ModuleType: + """If name is a string, resolve to a module.""" + if hasattr(name, '__spec__'): + return name + return import_module(name) + + def _get_package(package) -> ModuleType: """Take a package name or module object and return the module. - If a name, the module is imported. If the passed or imported module + If a name, the module is imported. If the resolved module object is not a package, raise an exception. """ - if hasattr(package, '__spec__'): - if package.__spec__.submodule_search_locations is None: - raise TypeError('{!r} is not a package'.format( - package.__spec__.name)) - else: - return package - else: - module = import_module(package) - if module.__spec__.submodule_search_locations is None: - raise TypeError('{!r} is not a package'.format(package)) - else: - return module + module = _resolve(package) + if module.__spec__.submodule_search_locations is None: + raise TypeError('{!r} is not a package'.format(package)) + return module def _normalize_path(path) -> str: @@ -59,8 +60,7 @@ def _normalize_path(path) -> str: parent, file_name = os.path.split(path) if parent: raise ValueError('{!r} must be only a file name'.format(path)) - else: - return file_name + return file_name def _get_resource_reader( @@ -89,8 +89,8 @@ def open_binary(package: Package, resource: Resource) -> BinaryIO: reader = _get_resource_reader(package) if reader is not None: return reader.open_resource(resource) - _check_location(package) - absolute_package_path = os.path.abspath(package.__spec__.origin) + absolute_package_path = os.path.abspath( + package.__spec__.origin or 'non-existent file') package_path = os.path.dirname(absolute_package_path) full_path = os.path.join(package_path, resource) try: @@ -109,8 +109,7 @@ def open_binary(package: Package, resource: Resource) -> BinaryIO: message = '{!r} resource not found in {!r}'.format( resource, package_name) raise FileNotFoundError(message) - else: - return BytesIO(data) + return BytesIO(data) def open_text(package: Package, @@ -118,39 +117,12 @@ def open_text(package: Package, encoding: str = 'utf-8', errors: str = 'strict') -> TextIO: """Return a file-like object opened for text reading of the resource.""" - resource = _normalize_path(resource) - package = _get_package(package) - reader = _get_resource_reader(package) - if reader is not None: - return TextIOWrapper(reader.open_resource(resource), encoding, errors) - _check_location(package) - absolute_package_path = os.path.abspath(package.__spec__.origin) - package_path = os.path.dirname(absolute_package_path) - full_path = os.path.join(package_path, resource) - try: - return open(full_path, mode='r', encoding=encoding, errors=errors) - except OSError: - # Just assume the loader is a resource loader; all the relevant - # importlib.machinery loaders are and an AttributeError for - # get_data() will make it clear what is needed from the loader. - loader = cast(ResourceLoader, package.__spec__.loader) - data = None - if hasattr(package.__spec__.loader, 'get_data'): - with suppress(OSError): - data = loader.get_data(full_path) - if data is None: - package_name = package.__spec__.name - message = '{!r} resource not found in {!r}'.format( - resource, package_name) - raise FileNotFoundError(message) - else: - return TextIOWrapper(BytesIO(data), encoding, errors) + return TextIOWrapper( + open_binary(package, resource), encoding=encoding, errors=errors) def read_binary(package: Package, resource: Resource) -> bytes: """Return the binary contents of the resource.""" - resource = _normalize_path(resource) - package = _get_package(package) with open_binary(package, resource) as fp: return fp.read() @@ -164,14 +136,20 @@ def read_text(package: Package, The decoding-related arguments have the same semantics as those of bytes.decode(). """ - resource = _normalize_path(resource) - package = _get_package(package) with open_text(package, resource, encoding, errors) as fp: return fp.read() -@contextmanager -def path(package: Package, resource: Resource) -> Iterator[Path]: +def files(package: Package) -> resources_abc.Traversable: + """ + Get a Traversable resource from a package + """ + return _common.from_package(_get_package(package)) + + +def path( + package: Package, resource: Resource, + ) -> 'ContextManager[Path]': """A context manager providing a file path object to the resource. If the resource does not already exist on its own on the file system, @@ -180,39 +158,23 @@ def path(package: Package, resource: Resource) -> Iterator[Path]: raised if the file was deleted prior to the context manager exiting). """ - resource = _normalize_path(resource) - package = _get_package(package) - reader = _get_resource_reader(package) - if reader is not None: - try: - yield Path(reader.resource_path(resource)) - return - except FileNotFoundError: - pass - else: - _check_location(package) - # Fall-through for both the lack of resource_path() *and* if - # resource_path() raises FileNotFoundError. - package_directory = Path(package.__spec__.origin).parent - file_path = package_directory / resource - if file_path.exists(): - yield file_path - else: - with open_binary(package, resource) as fp: - data = fp.read() - # Not using tempfile.NamedTemporaryFile as it leads to deeper 'try' - # blocks due to the need to close the temporary file to work on - # Windows properly. - fd, raw_path = tempfile.mkstemp() - try: - os.write(fd, data) - os.close(fd) - yield Path(raw_path) - finally: - try: - os.remove(raw_path) - except FileNotFoundError: - pass + reader = _get_resource_reader(_get_package(package)) + return ( + _path_from_reader(reader, resource) + if reader else + _common.as_file(files(package).joinpath(_normalize_path(resource))) + ) + + +@contextmanager +def _path_from_reader(reader, resource): + norm_resource = _normalize_path(resource) + with suppress(FileNotFoundError): + yield Path(reader.resource_path(norm_resource)) + return + opener_reader = reader.open_resource(norm_resource) + with _common._tempfile(opener_reader.read, suffix=norm_resource) as res: + yield res def is_resource(package: Package, name: str) -> bool: @@ -225,17 +187,10 @@ def is_resource(package: Package, name: str) -> bool: reader = _get_resource_reader(package) if reader is not None: return reader.is_resource(name) - try: - package_contents = set(contents(package)) - except (NotADirectoryError, FileNotFoundError): - return False + package_contents = set(contents(package)) if name not in package_contents: return False - # Just because the given file_name lives as an entry in the package's - # contents doesn't necessarily mean it's a resource. Directories are not - # resources, so let's try to find out if it's a directory or not. - path = Path(package.__spec__.origin).parent / name - return path.is_file() + return (_common.from_package(package) / name).is_file() def contents(package: Package) -> Iterable[str]: @@ -250,10 +205,11 @@ def contents(package: Package) -> Iterable[str]: if reader is not None: return reader.contents() # Is the package a namespace package? By definition, namespace packages - # cannot have resources. We could use _check_location() and catch the - # exception, but that's extra work, so just inline the check. - elif package.__spec__.origin is None or not package.__spec__.has_location: + # cannot have resources. + namespace = ( + package.__spec__.origin is None or + package.__spec__.origin == 'namespace' + ) + if namespace or not package.__spec__.has_location: return () - else: - package_directory = Path(package.__spec__.origin).parent - return os.listdir(package_directory) + return list(item.name for item in _common.from_package(package).iterdir()) diff --git a/Lib/importlib/util.py b/Lib/importlib/util.py index 201e0f4cb89d185b477ce83acac0682467387cc5..269a6fa930aabd45bf074c6c0a4fd7ec5f7f7ab1 100644 --- a/Lib/importlib/util.py +++ b/Lib/importlib/util.py @@ -29,8 +29,8 @@ def resolve_name(name, package): if not name.startswith('.'): return name elif not package: - raise ValueError(f'no package specified for {repr(name)} ' - '(required for relative module names)') + raise ImportError(f'no package specified for {repr(name)} ' + '(required for relative module names)') level = 0 for character in name: if character != '.': diff --git a/Lib/inspect.py b/Lib/inspect.py index e8ea8c221f8288abe750d27e5e69010f869aac80..18bed9028ed8ab974aa1eb520192be491f4fde45 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -32,6 +32,7 @@ 'Yury Selivanov ') import abc +import ast import dis import collections.abc import enum @@ -769,6 +770,42 @@ def getmodule(object, _filename=None): if builtinobject is object: return builtin + +class ClassFoundException(Exception): + pass + + +class _ClassFinder(ast.NodeVisitor): + + def __init__(self, qualname): + self.stack = [] + self.qualname = qualname + + def visit_FunctionDef(self, node): + self.stack.append(node.name) + self.stack.append('') + self.generic_visit(node) + self.stack.pop() + self.stack.pop() + + visit_AsyncFunctionDef = visit_FunctionDef + + def visit_ClassDef(self, node): + self.stack.append(node.name) + if self.qualname == '.'.join(self.stack): + # Return the decorator for the class if present + if node.decorator_list: + line_number = node.decorator_list[0].lineno + else: + line_number = node.lineno + + # decrement by one since lines starts with indexing by zero + line_number -= 1 + raise ClassFoundException(line_number) + self.generic_visit(node) + self.stack.pop() + + def findsource(object): """Return the entire source file and starting line number for an object. @@ -801,25 +838,15 @@ def findsource(object): return lines, 0 if isclass(object): - name = object.__name__ - pat = re.compile(r'^(\s*)class\s*' + name + r'\b') - # make some effort to find the best matching class definition: - # use the one with the least indentation, which is the one - # that's most probably not inside a function definition. - candidates = [] - for i in range(len(lines)): - match = pat.match(lines[i]) - if match: - # if it's at toplevel, it's already the best one - if lines[i][0] == 'c': - return lines, i - # else add whitespace to candidate list - candidates.append((match.group(1), i)) - if candidates: - # this will sort by whitespace, and by line number, - # less whitespace first - candidates.sort() - return lines, candidates[0][1] + qualname = object.__qualname__ + source = ''.join(lines) + tree = ast.parse(source) + class_finder = _ClassFinder(qualname) + try: + class_finder.visit(tree) + except ClassFoundException as e: + line_number = e.args[0] + return lines, line_number else: raise OSError('could not find class definition') @@ -837,7 +864,12 @@ def findsource(object): lnum = object.co_firstlineno - 1 pat = re.compile(r'^(\s*def\s)|(\s*async\s+def\s)|(.*(? 0: - if pat.match(lines[lnum]): break + try: + line = lines[lnum] + except IndexError: + raise OSError('lineno is out of bounds') + if pat.match(line): + break lnum = lnum - 1 return lines, lnum raise OSError('could not find code object') @@ -899,6 +931,7 @@ def __init__(self): self.indecorator = False self.decoratorhasargs = False self.last = 1 + self.body_col0 = None def tokeneater(self, type, token, srowcol, erowcol, line): if not self.started and not self.indecorator: @@ -930,6 +963,8 @@ def tokeneater(self, type, token, srowcol, erowcol, line): elif self.passline: pass elif type == tokenize.INDENT: + if self.body_col0 is None and self.started: + self.body_col0 = erowcol[1] self.indent = self.indent + 1 self.passline = True elif type == tokenize.DEDENT: @@ -939,6 +974,10 @@ def tokeneater(self, type, token, srowcol, erowcol, line): # not e.g. for "if: else:" or "try: finally:" blocks) if self.indent <= 0: raise EndOfBlock + elif type == tokenize.COMMENT: + if self.body_col0 is not None and srowcol[1] >= self.body_col0: + # Include comments if indented at least as much as the block + self.last = srowcol[0] elif self.indent == 0 and type not in (tokenize.COMMENT, tokenize.NL): # any other token on the same indentation level end the previous # block as well, except the pseudo-tokens COMMENT and NL. @@ -1136,7 +1175,6 @@ def getfullargspec(func): varkw = None posonlyargs = [] kwonlyargs = [] - defaults = () annotations = {} defaults = () kwdefaults = {} @@ -2603,7 +2641,7 @@ class BoundArguments: Has the following public attributes: - * arguments : OrderedDict + * arguments : dict An ordered mutable mapping of parameters' names to arguments' values. Does not contain arguments' default values. * signature : Signature @@ -2703,7 +2741,7 @@ def apply_defaults(self): # Signature.bind_partial(). continue new_arguments.append((name, val)) - self.arguments = OrderedDict(new_arguments) + self.arguments = dict(new_arguments) def __eq__(self, other): if self is other: @@ -2771,7 +2809,7 @@ def __init__(self, parameters=None, *, return_annotation=_empty, top_kind = _POSITIONAL_ONLY kind_defaults = False - for idx, param in enumerate(parameters): + for param in parameters: kind = param.kind name = param.name @@ -2806,8 +2844,7 @@ def __init__(self, parameters=None, *, return_annotation=_empty, params[name] = param else: - params = OrderedDict(((param.name, param) - for param in parameters)) + params = OrderedDict((param.name, param) for param in parameters) self._parameters = types.MappingProxyType(params) self._return_annotation = return_annotation @@ -2889,7 +2926,7 @@ def __eq__(self, other): def _bind(self, args, kwargs, *, partial=False): """Private method. Don't use directly.""" - arguments = OrderedDict() + arguments = {} parameters = iter(self.parameters.values()) parameters_ex = () diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py index a3a04f7f4b309206e09f1d774396d5764e6d78b1..bc662c415b2a49f0f4066b1fd6e76d59934c9129 100644 --- a/Lib/ipaddress.py +++ b/Lib/ipaddress.py @@ -560,6 +560,8 @@ def __reduce__(self): return self.__class__, (str(self),) +_address_fmt_re = None + @functools.total_ordering class _BaseAddress(_IPAddressBase): @@ -618,6 +620,55 @@ def _get_address_key(self): def __reduce__(self): return self.__class__, (self._ip,) + def __format__(self, fmt): + """Returns an IP address as a formatted string. + + Supported presentation types are: + 's': returns the IP address as a string (default) + 'b': converts to binary and returns a zero-padded string + 'X' or 'x': converts to upper- or lower-case hex and returns a zero-padded string + 'n': the same as 'b' for IPv4 and 'x' for IPv6 + + For binary and hex presentation types, the alternate form specifier + '#' and the grouping option '_' are supported. + """ + + # Support string formatting + if not fmt or fmt[-1] == 's': + return format(str(self), fmt) + + # From here on down, support for 'bnXx' + global _address_fmt_re + if _address_fmt_re is None: + import re + _address_fmt_re = re.compile('(#?)(_?)([xbnX])') + + m = _address_fmt_re.fullmatch(fmt) + if not m: + return super().__format__(fmt) + + alternate, grouping, fmt_base = m.groups() + + # Set some defaults + if fmt_base == 'n': + if self._version == 4: + fmt_base = 'b' # Binary is default for ipv4 + else: + fmt_base = 'x' # Hex is default for ipv6 + + if fmt_base == 'b': + padlen = self._max_prefixlen + else: + padlen = self._max_prefixlen // 4 + + if grouping: + padlen += padlen // 4 - 1 + + if alternate: + padlen += 2 # 0b or 0x + + return format(int(self), f'{alternate}0{padlen}{grouping}{fmt_base}') + @functools.total_ordering class _BaseNetwork(_IPAddressBase): @@ -1073,7 +1124,6 @@ def is_loopback(self): return (self.network_address.is_loopback and self.broadcast_address.is_loopback) - class _BaseV4: """Base IPv4 object. @@ -1347,7 +1397,7 @@ def __str__(self): def __eq__(self, other): address_equal = IPv4Address.__eq__(self, other) - if not address_equal or address_equal is NotImplemented: + if address_equal is NotImplemented or not address_equal: return address_equal try: return self.network == other.network @@ -1416,7 +1466,7 @@ def __init__(self, address, strict=True): address: A string or integer representing the IP [& network]. '192.0.2.0/24' '192.0.2.0/255.255.255.0' - '192.0.0.2/0.0.0.255' + '192.0.2.0/0.0.0.255' are all functionally the same in IPv4. Similarly, '192.0.2.1' '192.0.2.1/255.255.255.255' @@ -1458,6 +1508,8 @@ def __init__(self, address, strict=True): if self._prefixlen == (self._max_prefixlen - 1): self.hosts = self.__iter__ + elif self._prefixlen == (self._max_prefixlen): + self.hosts = lambda: [IPv4Address(addr)] @property @functools.lru_cache() @@ -1785,6 +1837,26 @@ def _reverse_pointer(self): reverse_chars = self.exploded[::-1].replace(':', '') return '.'.join(reverse_chars) + '.ip6.arpa' + @staticmethod + def _split_scope_id(ip_str): + """Helper function to parse IPv6 string address with scope id. + + See RFC 4007 for details. + + Args: + ip_str: A string, the IPv6 address. + + Returns: + (addr, scope_id) tuple. + + """ + addr, sep, scope_id = ip_str.partition('%') + if not sep: + scope_id = None + elif not scope_id or '%' in scope_id: + raise AddressValueError('Invalid IPv6 address: "%r"' % ip_str) + return addr, scope_id + @property def max_prefixlen(self): return self._max_prefixlen @@ -1798,7 +1870,7 @@ class IPv6Address(_BaseV6, _BaseAddress): """Represent and manipulate single IPv6 Addresses.""" - __slots__ = ('_ip', '__weakref__') + __slots__ = ('_ip', '_scope_id', '__weakref__') def __init__(self, address): """Instantiate a new IPv6 address object. @@ -1821,12 +1893,14 @@ def __init__(self, address): if isinstance(address, int): self._check_int_address(address) self._ip = address + self._scope_id = None return # Constructing from a packed address if isinstance(address, bytes): self._check_packed_address(address, 16) self._ip = int.from_bytes(address, 'big') + self._scope_id = None return # Assume input argument to be string or any object representation @@ -1834,8 +1908,37 @@ def __init__(self, address): addr_str = str(address) if '/' in addr_str: raise AddressValueError("Unexpected '/' in %r" % address) + addr_str, self._scope_id = self._split_scope_id(addr_str) + self._ip = self._ip_int_from_string(addr_str) + def __str__(self): + ip_str = super().__str__() + return ip_str + '%' + self._scope_id if self._scope_id else ip_str + + def __hash__(self): + return hash((self._ip, self._scope_id)) + + def __eq__(self, other): + address_equal = super().__eq__(other) + if address_equal is NotImplemented: + return NotImplemented + if not address_equal: + return False + return self._scope_id == getattr(other, '_scope_id', None) + + @property + def scope_id(self): + """Identifier of a particular zone of the address's scope. + + See RFC 4007 for details. + + Returns: + A string identifying the zone of the address if specified, else None. + + """ + return self._scope_id + @property def packed(self): """The binary representation of this address.""" @@ -1989,12 +2092,12 @@ def hostmask(self): return self.network.hostmask def __str__(self): - return '%s/%d' % (self._string_from_ip_int(self._ip), + return '%s/%d' % (super().__str__(), self._prefixlen) def __eq__(self, other): address_equal = IPv6Address.__eq__(self, other) - if not address_equal or address_equal is NotImplemented: + if address_equal is NotImplemented or not address_equal: return address_equal try: return self.network == other.network @@ -2007,7 +2110,7 @@ def __eq__(self, other): def __lt__(self, other): address_less = IPv6Address.__lt__(self, other) if address_less is NotImplemented: - return NotImplemented + return address_less try: return (self.network < other.network or self.network == other.network and address_less) @@ -2110,6 +2213,8 @@ def __init__(self, address, strict=True): if self._prefixlen == (self._max_prefixlen - 1): self.hosts = self.__iter__ + elif self._prefixlen == self._max_prefixlen: + self.hosts = lambda: [IPv6Address(addr)] def hosts(self): """Generate Iterator over usable hosts in a network. diff --git a/Lib/json/__init__.py b/Lib/json/__init__.py index 1ba8b48bd78cde58ef1d3644529394d877ae216c..2c52bdeba67546e2eb96bfa3a3ba68aa5cd3483c 100644 --- a/Lib/json/__init__.py +++ b/Lib/json/__init__.py @@ -329,8 +329,6 @@ def loads(s, *, cls=None, object_hook=None, parse_float=None, To use a custom ``JSONDecoder`` subclass, specify it with the ``cls`` kwarg; otherwise ``JSONDecoder`` is used. - - The ``encoding`` argument is ignored and deprecated since Python 3.1. """ if isinstance(s, str): if s.startswith('\ufeff'): @@ -342,15 +340,6 @@ def loads(s, *, cls=None, object_hook=None, parse_float=None, f'not {s.__class__.__name__}') s = s.decode(detect_encoding(s), 'surrogatepass') - if "encoding" in kw: - import warnings - warnings.warn( - "'encoding' is ignored and deprecated. It will be removed in Python 3.9", - DeprecationWarning, - stacklevel=2 - ) - del kw['encoding'] - if (cls is None and object_hook is None and parse_int is None and parse_float is None and parse_constant is None and object_pairs_hook is None and not kw): diff --git a/Lib/json/tool.py b/Lib/json/tool.py index c42138a05c05e7b6a136a490f7e7b1f43a2a85c5..5dee0a744b2a99e1e88c52dfecfec56a8598d10f 100644 --- a/Lib/json/tool.py +++ b/Lib/json/tool.py @@ -30,22 +30,42 @@ def main(): default=sys.stdout) parser.add_argument('--sort-keys', action='store_true', default=False, help='sort the output of dictionaries alphabetically by key') + parser.add_argument('--no-ensure-ascii', dest='ensure_ascii', action='store_false', + help='disable escaping of non-ASCII characters') parser.add_argument('--json-lines', action='store_true', default=False, - help='parse input using the jsonlines format') + help='parse input using the JSON Lines format. ' + 'Use with --no-indent or --compact to produce valid JSON Lines output.') + group = parser.add_mutually_exclusive_group() + group.add_argument('--indent', default=4, type=int, + help='separate items with newlines and use this number ' + 'of spaces for indentation') + group.add_argument('--tab', action='store_const', dest='indent', + const='\t', help='separate items with newlines and use ' + 'tabs for indentation') + group.add_argument('--no-indent', action='store_const', dest='indent', + const=None, + help='separate items with spaces rather than newlines') + group.add_argument('--compact', action='store_true', + help='suppress all whitespace separation (most compact)') options = parser.parse_args() - infile = options.infile - outfile = options.outfile - sort_keys = options.sort_keys - json_lines = options.json_lines - with infile, outfile: + dump_args = { + 'sort_keys': options.sort_keys, + 'indent': options.indent, + 'ensure_ascii': options.ensure_ascii, + } + if options.compact: + dump_args['indent'] = None + dump_args['separators'] = ',', ':' + + with options.infile as infile, options.outfile as outfile: try: - if json_lines: + if options.json_lines: objs = (json.loads(line) for line in infile) else: objs = (json.load(infile), ) for obj in objs: - json.dump(obj, outfile, sort_keys=sort_keys, indent=4) + json.dump(obj, outfile, **dump_args) outfile.write('\n') except ValueError as e: raise SystemExit(e) diff --git a/Lib/keyword.py b/Lib/keyword.py index ddcbb25d3d3f585de56088850cddafbcd527709c..59fcfb0f0d177838e30725ab95baef6b2bc60927 100644 --- a/Lib/keyword.py +++ b/Lib/keyword.py @@ -1,23 +1,25 @@ -"""Keywords (from "Grammar/Grammar") +"""Keywords (from "Grammar/python.gram") This file is automatically generated; please don't muck it up! To update the symbols in this file, 'cd' to the top directory of the python source tree and run: - python3 -m Parser.pgen.keywordgen Grammar/Grammar \ - Grammar/Tokens \ - Lib/keyword.py + PYTHONPATH=Tools/peg_generator python3 -m pegen.keywordgen \ + Grammar/Grammar \ + Grammar/Tokens \ + Lib/keyword.py Alternatively, you can run 'make regen-keyword'. """ -__all__ = ["iskeyword", "kwlist"] +__all__ = ["iskeyword", "issoftkeyword", "kwlist", "softkwlist"] kwlist = [ 'False', 'None', 'True', + '__peg_parser__', 'and', 'as', 'assert', @@ -52,4 +54,9 @@ kwlist = [ 'yield' ] +softkwlist = [ + +] + iskeyword = frozenset(kwlist).__contains__ +issoftkeyword = frozenset(softkwlist).__contains__ diff --git a/Lib/lib2to3/Grammar.txt b/Lib/lib2to3/Grammar.txt index 8ce7fd8a89da67dade690e8c993c1d66d090bd0a..fa7b15061d941c4d952c8d6446fe33c40890a264 100644 --- a/Lib/lib2to3/Grammar.txt +++ b/Lib/lib2to3/Grammar.txt @@ -18,15 +18,55 @@ decorated: decorators (classdef | funcdef | async_funcdef) async_funcdef: ASYNC funcdef funcdef: 'def' NAME parameters ['->' test] ':' suite parameters: '(' [typedargslist] ')' -typedargslist: ((tfpdef ['=' test] ',')* - ('*' [tname] (',' tname ['=' test])* [',' ['**' tname [',']]] | '**' tname [',']) - | tfpdef ['=' test] (',' tfpdef ['=' test])* [',']) + +# The following definition for typedarglist is equivalent to this set of rules: +# +# arguments = argument (',' argument)* +# argument = tfpdef ['=' test] +# kwargs = '**' tname [','] +# args = '*' [tname] +# kwonly_kwargs = (',' argument)* [',' [kwargs]] +# args_kwonly_kwargs = args kwonly_kwargs | kwargs +# poskeyword_args_kwonly_kwargs = arguments [',' [args_kwonly_kwargs]] +# typedargslist_no_posonly = poskeyword_args_kwonly_kwargs | args_kwonly_kwargs +# typedarglist = arguments ',' '/' [',' [typedargslist_no_posonly]])|(typedargslist_no_posonly)" +# +# It needs to be fully expanded to allow our LL(1) parser to work on it. + +typedargslist: tfpdef ['=' test] (',' tfpdef ['=' test])* ',' '/' [ + ',' [((tfpdef ['=' test] ',')* ('*' [tname] (',' tname ['=' test])* + [',' ['**' tname [',']]] | '**' tname [',']) + | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])] + ] | ((tfpdef ['=' test] ',')* ('*' [tname] (',' tname ['=' test])* + [',' ['**' tname [',']]] | '**' tname [',']) + | tfpdef ['=' test] (',' tfpdef ['=' test])* [',']) + tname: NAME [':' test] tfpdef: tname | '(' tfplist ')' tfplist: tfpdef (',' tfpdef)* [','] -varargslist: ((vfpdef ['=' test] ',')* - ('*' [vname] (',' vname ['=' test])* [',' ['**' vname [',']]] | '**' vname [',']) - | vfpdef ['=' test] (',' vfpdef ['=' test])* [',']) + +# The following definition for varargslist is equivalent to this set of rules: +# +# arguments = argument (',' argument )* +# argument = vfpdef ['=' test] +# kwargs = '**' vname [','] +# args = '*' [vname] +# kwonly_kwargs = (',' argument )* [',' [kwargs]] +# args_kwonly_kwargs = args kwonly_kwargs | kwargs +# poskeyword_args_kwonly_kwargs = arguments [',' [args_kwonly_kwargs]] +# vararglist_no_posonly = poskeyword_args_kwonly_kwargs | args_kwonly_kwargs +# varargslist = arguments ',' '/' [','[(vararglist_no_posonly)]] | (vararglist_no_posonly) +# +# It needs to be fully expanded to allow our LL(1) parser to work on it. + +varargslist: vfpdef ['=' test ](',' vfpdef ['=' test])* ',' '/' [',' [ + ((vfpdef ['=' test] ',')* ('*' [vname] (',' vname ['=' test])* + [',' ['**' vname [',']]] | '**' vname [',']) + | vfpdef ['=' test] (',' vfpdef ['=' test])* [',']) + ]] | ((vfpdef ['=' test] ',')* + ('*' [vname] (',' vname ['=' test])* [',' ['**' vname [',']]]| '**' vname [',']) + | vfpdef ['=' test] (',' vfpdef ['=' test])* [',']) + vname: NAME vfpdef: vname | '(' vfplist ')' vfplist: vfpdef (',' vfpdef)* [','] @@ -49,7 +89,7 @@ pass_stmt: 'pass' flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt break_stmt: 'break' continue_stmt: 'continue' -return_stmt: 'return' [testlist] +return_stmt: 'return' [testlist_star_expr] yield_stmt: yield_expr raise_stmt: 'raise' [test ['from' test | ',' test [',' test]]] import_stmt: import_name | import_from @@ -153,4 +193,4 @@ testlist1: test (',' test)* encoding_decl: NAME yield_expr: 'yield' [yield_arg] -yield_arg: 'from' test | testlist +yield_arg: 'from' test | testlist_star_expr diff --git a/Lib/lib2to3/__init__.py b/Lib/lib2to3/__init__.py index ea30561d839798e1ef284fb70adc009fda12db16..4224dffef429570a3aaca3c1cc3a258a8f322251 100644 --- a/Lib/lib2to3/__init__.py +++ b/Lib/lib2to3/__init__.py @@ -1 +1,8 @@ -#empty +import warnings + + +warnings.warn( + "lib2to3 package is deprecated and may not be able to parse Python 3.10+", + PendingDeprecationWarning, + stacklevel=2, +) diff --git a/Lib/lib2to3/fixer_util.py b/Lib/lib2to3/fixer_util.py index babe6cb3f662a961b2f89d3a9023344327afa036..c2a3a47f503286e05e9bd9d69759e6a2ca214b2c 100644 --- a/Lib/lib2to3/fixer_util.py +++ b/Lib/lib2to3/fixer_util.py @@ -412,7 +412,7 @@ def _find(name, node): return None def _is_import_binding(node, name, package=None): - """ Will reuturn node if node will import name, or node + """ Will return node if node will import name, or node will import * from package. None is returned otherwise. See test cases for examples. """ diff --git a/Lib/lib2to3/fixes/fix_urllib.py b/Lib/lib2to3/fixes/fix_urllib.py index 5a36049df5cb064809d6da4b3ba55061f3ed87d7..ab892bc52494c25bf5b46f92ca862965b4d99e5c 100644 --- a/Lib/lib2to3/fixes/fix_urllib.py +++ b/Lib/lib2to3/fixes/fix_urllib.py @@ -13,7 +13,7 @@ ("urllib.request", ["URLopener", "FancyURLopener", "urlretrieve", "_urlopener", "urlopen", "urlcleanup", - "pathname2url", "url2pathname"]), + "pathname2url", "url2pathname", "getproxies"]), ("urllib.parse", ["quote", "quote_plus", "unquote", "unquote_plus", "urlencode", "splitattr", "splithost", "splitnport", diff --git a/Lib/lib2to3/main.py b/Lib/lib2to3/main.py index d6b708848ede1ac6c2d6dea5ebaca619d80fc170..f2849fd6be3fd93d0f0c48768f09270aea77a209 100644 --- a/Lib/lib2to3/main.py +++ b/Lib/lib2to3/main.py @@ -90,11 +90,11 @@ def write_file(self, new_text, filename, old_text, encoding): if os.path.lexists(backup): try: os.remove(backup) - except OSError as err: + except OSError: self.log_message("Can't remove backup %s", backup) try: os.rename(filename, backup) - except OSError as err: + except OSError: self.log_message("Can't rename %s to %s", filename, backup) # Actually write the new file write = super(StdoutRefactoringTool, self).write_file @@ -154,6 +154,8 @@ def main(fixer_pkg, args=None): help="List available transformations") parser.add_option("-p", "--print-function", action="store_true", help="Modify the grammar so that print() is a function") + parser.add_option("-e", "--exec-function", action="store_true", + help="Modify the grammar so that exec() is a function") parser.add_option("-v", "--verbose", action="store_true", help="More verbose logging") parser.add_option("--no-diffs", action="store_true", @@ -211,6 +213,9 @@ def main(fixer_pkg, args=None): if options.print_function: flags["print_function"] = True + if options.exec_function: + flags["exec_function"] = True + # Set up logging handler level = logging.DEBUG if options.verbose else logging.INFO logging.basicConfig(format='%(name)s: %(message)s', level=level) diff --git a/Lib/lib2to3/refactor.py b/Lib/lib2to3/refactor.py index 55fd60fa27c3da9ba0eed4fff1c472aac62e5d9d..3a5aafffc6df07462dac0829ccfc2eb51c6938e5 100644 --- a/Lib/lib2to3/refactor.py +++ b/Lib/lib2to3/refactor.py @@ -155,6 +155,7 @@ class FixerError(Exception): class RefactoringTool(object): _default_options = {"print_function" : False, + "exec_function": False, "write_unchanged_files" : False} CLASS_PREFIX = "Fix" # The prefix for fixer classes @@ -173,10 +174,13 @@ def __init__(self, fixer_names, options=None, explicit=None): self.options = self._default_options.copy() if options is not None: self.options.update(options) - if self.options["print_function"]: - self.grammar = pygram.python_grammar_no_print_statement - else: - self.grammar = pygram.python_grammar + self.grammar = pygram.python_grammar.copy() + + if self.options['print_function']: + del self.grammar.keywords["print"] + elif self.options['exec_function']: + del self.grammar.keywords["exec"] + # When this is True, the refactor*() methods will call write_file() for # files processed even if they were not changed during refactoring. If # and only if the refactor method's write parameter was True. diff --git a/Lib/lib2to3/tests/data/py3_test_grammar.py b/Lib/lib2to3/tests/data/py3_test_grammar.py index e0b682837e1d89bb5be1853981ec8f429658b570..d06223207e1ec0034c70af38439ac25388370146 100644 --- a/Lib/lib2to3/tests/data/py3_test_grammar.py +++ b/Lib/lib2to3/tests/data/py3_test_grammar.py @@ -473,15 +473,27 @@ def test_inner(extra_burning_oil = 1, count=0): test_inner() def testReturn(self): - # 'return' [testlist] + # 'return' [testlist_star_expr] def g1(): return def g2(): return 1 + return_list = [2, 3] + def g3(): return 1, *return_list g1() x = g2() + x3 = g3() check_syntax_error(self, "class foo:return 1") def testYield(self): + # 'yield' [yield_arg] + def g1(): yield 1 + yield_list = [2, 3] + def g2(): yield 1, *yield_list + def g3(): yield from iter(yield_list) + x1 = g1() + x2 = g2() + x3 = g3() check_syntax_error(self, "class foo:yield 1") + check_syntax_error(self, "def g4(): yield from *a") def testRaise(self): # 'raise' test [',' test] diff --git a/Lib/lib2to3/tests/test_fixers.py b/Lib/lib2to3/tests/test_fixers.py index a28524198181333e37cae56676673b35665c178c..121ebe68e5402ba29b94a2ca122eb272a6cac3e3 100644 --- a/Lib/lib2to3/tests/test_fixers.py +++ b/Lib/lib2to3/tests/test_fixers.py @@ -1913,7 +1913,11 @@ def foo(): """ self.check(b, a) + def test_single_import(self): + b = "from urllib import getproxies" + a = "from urllib.request import getproxies" + self.check(b, a) def test_import_module_usage(self): for old, changes in self.modules.items(): diff --git a/Lib/lib2to3/tests/test_parser.py b/Lib/lib2to3/tests/test_parser.py index 3a0e7f435e6d78754066087fa5ca23b85e553642..d5db66b9b1e7b9a5c0961befe82bfc043dec78e1 100644 --- a/Lib/lib2to3/tests/test_parser.py +++ b/Lib/lib2to3/tests/test_parser.py @@ -272,6 +272,12 @@ def test_dict_display_1(self): def test_dict_display_2(self): self.validate("""{**{}, 3:4, **{5:6, 7:8}}""") + def test_complex_star_expression(self): + self.validate("func(* [] or [1])") + + def test_complex_double_star_expression(self): + self.validate("func(**{1: 3} if False else {x: x for x in range(3)})") + def test_argument_unpacking_1(self): self.validate("""f(a, *b, *c, d)""") @@ -538,7 +544,7 @@ def test_4(self): # Adapted from Python 3's Lib/test/test_unicode_identifiers.py and # Lib/test/test_tokenize.py:TokenizeTest.test_non_ascii_identifiers -class TestIdentfier(GrammarTest): +class TestIdentifier(GrammarTest): def test_non_ascii_identifiers(self): self.validate("Örter = 'places'\ngrün = 'green'") self.validate("蟒 = a蟒 = 锦蛇 = 1") @@ -630,6 +636,7 @@ def test_multiline_str_literals(self): class TestNamedAssignments(GrammarTest): + """Also known as the walrus operator.""" def test_named_assignment_if(self): driver.parse_string("if f := x(): pass\n") @@ -644,6 +651,30 @@ def test_named_assignment_listcomp(self): driver.parse_string("[(lastNum := num) == 1 for num in [1, 2, 3]]\n") +class TestPositionalOnlyArgs(GrammarTest): + + def test_one_pos_only_arg(self): + driver.parse_string("def one_pos_only_arg(a, /): pass\n") + + def test_all_markers(self): + driver.parse_string( + "def all_markers(a, b=2, /, c, d=4, *, e=5, f): pass\n") + + def test_all_with_args_and_kwargs(self): + driver.parse_string( + """def all_markers_with_args_and_kwargs( + aa, b, /, _cc, d, *args, e, f_f, **kwargs, + ): + pass\n""") + + def test_lambda_soup(self): + driver.parse_string( + "lambda a, b, /, c, d, *args, e, f, **kw: kw\n") + + def test_only_positional_or_keyword(self): + driver.parse_string("def func(a,b,/,*,g,e=3): pass\n") + + class TestPickleableException(unittest.TestCase): def test_ParseError(self): err = ParseError('msg', 2, None, (1, 'context')) diff --git a/Lib/lib2to3/tests/test_refactor.py b/Lib/lib2to3/tests/test_refactor.py index 9e3b8fbb90b2f3b0888fe54d0f08589c46290e91..be705679f06dbadefd99edaee240a0a3db02e584 100644 --- a/Lib/lib2to3/tests/test_refactor.py +++ b/Lib/lib2to3/tests/test_refactor.py @@ -44,9 +44,13 @@ def rt(self, options=None, fixers=_DEFAULT_FIXERS, explicit=None): def test_print_function_option(self): rt = self.rt({"print_function" : True}) - self.assertIs(rt.grammar, pygram.python_grammar_no_print_statement) - self.assertIs(rt.driver.grammar, - pygram.python_grammar_no_print_statement) + self.assertNotIn("print", rt.grammar.keywords) + self.assertNotIn("print", rt.driver.grammar.keywords) + + def test_exec_function_option(self): + rt = self.rt({"exec_function" : True}) + self.assertNotIn("exec", rt.grammar.keywords) + self.assertNotIn("exec", rt.driver.grammar.keywords) def test_write_unchanged_files_option(self): rt = self.rt() diff --git a/Lib/linecache.py b/Lib/linecache.py index c87e1807bfafaabe5df5b7a97646b73424964376..fa5dbd09eab8693a0a50fbf98ce2d1ee59b9404c 100644 --- a/Lib/linecache.py +++ b/Lib/linecache.py @@ -10,17 +10,8 @@ import os import tokenize -__all__ = ["getline", "clearcache", "checkcache"] +__all__ = ["getline", "clearcache", "checkcache", "lazycache"] -def getline(filename, lineno, module_globals=None): - lines = getlines(filename, module_globals) - if 1 <= lineno <= len(lines): - return lines[lineno-1] - else: - return '' - - -# The cache # The cache. Maps filenames to either a thunk which will provide source code, # or a tuple (size, mtime, lines, fullname) once loaded. @@ -29,9 +20,17 @@ def getline(filename, lineno, module_globals=None): def clearcache(): """Clear the cache entirely.""" + cache.clear() - global cache - cache = {} + +def getline(filename, lineno, module_globals=None): + """Get a line for a Python source file from the cache. + Update the cache if it doesn't contain an entry for this file already.""" + + lines = getlines(filename, module_globals) + if 1 <= lineno <= len(lines): + return lines[lineno - 1] + return '' def getlines(filename, module_globals=None): @@ -56,11 +55,10 @@ def checkcache(filename=None): if filename is None: filenames = list(cache.keys()) + elif filename in cache: + filenames = [filename] else: - if filename in cache: - filenames = [filename] - else: - return + return for filename in filenames: entry = cache[filename] @@ -109,8 +107,10 @@ def updatecache(filename, module_globals=None): # for this module. return [] cache[filename] = ( - len(data), None, - [line+'\n' for line in data.splitlines()], fullname + len(data), + None, + [line + '\n' for line in data.splitlines()], + fullname ) return cache[filename][2] diff --git a/Lib/locale.py b/Lib/locale.py index dd8a08524a018e8ff34f10a8d96b6cbbc171b063..1a4e9f694f30967f9fd482c835923c92fa0f7cd1 100644 --- a/Lib/locale.py +++ b/Lib/locale.py @@ -279,6 +279,8 @@ def currency(val, symbol=True, grouping=False, international=False): if precedes: s = smb + (separated and ' ' or '') + s else: + if international and smb[-1] == ' ': + smb = smb[:-1] s = s + (separated and ' ' or '') + smb sign_pos = conv[val<0 and 'n_sign_posn' or 'p_sign_posn'] diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 0cfaec84bac139a053cbb619ee5194771596a949..6920a7b654a5989fadc4633e2380192001d2924a 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2001-2017 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2019 by Vinay Sajip. All Rights Reserved. # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, @@ -18,7 +18,7 @@ Logging package for Python. Based on PEP 282 and comments thereto in comp.lang.python. -Copyright (C) 2001-2017 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2019 Vinay Sajip. All Rights Reserved. To use, simply 'import logging' and log away! """ @@ -234,11 +234,9 @@ def _releaseLock(): def _register_at_fork_reinit_lock(instance): pass # no-op when os.register_at_fork does not exist. else: - # A collection of instances with a createLock method (logging.Handler) + # A collection of instances with a _at_fork_reinit method (logging.Handler) # to be called in the child after forking. The weakref avoids us keeping - # discarded Handler instances alive. A set is used to avoid accumulating - # duplicate registrations as createLock() is responsible for registering - # a new Handler instance with this set in the first place. + # discarded Handler instances alive. _at_fork_reinit_lock_weakset = weakref.WeakSet() def _register_at_fork_reinit_lock(instance): @@ -249,16 +247,12 @@ def _register_at_fork_reinit_lock(instance): _releaseLock() def _after_at_fork_child_reinit_locks(): - # _acquireLock() was called in the parent before forking. for handler in _at_fork_reinit_lock_weakset: - try: - handler.createLock() - except Exception as err: - # Similar to what PyErr_WriteUnraisable does. - print("Ignoring exception from logging atfork", instance, - "._reinit_lock() method:", err, file=sys.stderr) - _releaseLock() # Acquired by os.register_at_fork(before=. + handler._at_fork_reinit() + # _acquireLock() was called in the parent before forking. + # The lock is reinitialized to unlocked state. + _lock._at_fork_reinit() os.register_at_fork(before=_acquireLock, after_in_child=_after_at_fork_child_reinit_locks, @@ -515,7 +509,7 @@ class Formatter(object): responsible for converting a LogRecord to (usually) a string which can be interpreted by either a human or an external system. The base Formatter allows a formatting string to be specified. If none is supplied, the - the style-dependent default value, "%(message)s", "{message}", or + style-dependent default value, "%(message)s", "{message}", or "${message}", is used. The Formatter can be initialized with a format string which makes use of @@ -603,8 +597,9 @@ def formatTime(self, record, datefmt=None): if datefmt: s = time.strftime(datefmt, ct) else: - t = time.strftime(self.default_time_format, ct) - s = self.default_msec_format % (t, record.msecs) + s = time.strftime(self.default_time_format, ct) + if self.default_msec_format: + s = self.default_msec_format % (s, record.msecs) return s def formatException(self, ei): @@ -753,8 +748,8 @@ def filter(self, record): """ Determine if the specified record is to be logged. - Is the specified record to be logged? Returns 0 for no, nonzero for - yes. If deemed appropriate, the record may be modified in-place. + Returns True if the record should be logged, or False otherwise. + If deemed appropriate, the record may be modified in-place. """ if self.nlen == 0: return True @@ -891,6 +886,9 @@ def createLock(self): self.lock = threading.RLock() _register_at_fork_reinit_lock(self) + def _at_fork_reinit(self): + self.lock._at_fork_reinit() + def acquire(self): """ Acquire the I/O thread lock. @@ -1122,7 +1120,7 @@ class FileHandler(StreamHandler): """ A handler class which writes formatted logging records to disk files. """ - def __init__(self, filename, mode='a', encoding=None, delay=False): + def __init__(self, filename, mode='a', encoding=None, delay=False, errors=None): """ Open the specified file and use it as the stream for logging. """ @@ -1133,6 +1131,7 @@ def __init__(self, filename, mode='a', encoding=None, delay=False): self.baseFilename = os.path.abspath(filename) self.mode = mode self.encoding = encoding + self.errors = errors self.delay = delay if delay: #We don't open the stream, but we still need to call the @@ -1169,7 +1168,8 @@ def _open(self): Open the current base file with the (original) mode and encoding. Return the resulting stream. """ - return open(self.baseFilename, self.mode, encoding=self.encoding) + return open(self.baseFilename, self.mode, encoding=self.encoding, + errors=self.errors) def emit(self, record): """ @@ -1269,6 +1269,14 @@ def __init__(self, rootnode): self.loggerClass = None self.logRecordFactory = None + @property + def disable(self): + return self._disable + + @disable.setter + def disable(self, value): + self._disable = _checkLevel(value) + def getLogger(self, name): """ Get a logger with the specified name (channel name), creating it @@ -1931,15 +1939,20 @@ def basicConfig(**kwargs): attached to the root logger are removed and closed, before carrying out the configuration as specified by the other arguments. + encoding If specified together with a filename, this encoding is passed to + the created FileHandler, causing it to be used when the file is + opened. + errors If specified together with a filename, this value is passed to the + created FileHandler, causing it to be used when the file is + opened in text mode. If not specified, the default value is + `backslashreplace`. + Note that you could specify a stream created using open(filename, mode) rather than passing the filename and mode in. However, it should be remembered that StreamHandler does not close its stream (since it may be using sys.stdout or sys.stderr), whereas FileHandler closes its stream when the handler is closed. - .. versionchanged:: 3.8 - Added the ``force`` parameter. - .. versionchanged:: 3.2 Added the ``style`` parameter. @@ -1949,12 +1962,20 @@ def basicConfig(**kwargs): ``filename``/``filemode``, or ``filename``/``filemode`` specified together with ``stream``, or ``handlers`` specified together with ``stream``. + + .. versionchanged:: 3.8 + Added the ``force`` parameter. + + .. versionchanged:: 3.9 + Added the ``encoding`` and ``errors`` parameters. """ # Add thread safety in case someone mistakenly calls # basicConfig() from multiple threads _acquireLock() try: force = kwargs.pop('force', False) + encoding = kwargs.pop('encoding', None) + errors = kwargs.pop('errors', 'backslashreplace') if force: for h in root.handlers[:]: root.removeHandler(h) @@ -1973,7 +1994,10 @@ def basicConfig(**kwargs): filename = kwargs.pop("filename", None) mode = kwargs.pop("filemode", 'a') if filename: - h = FileHandler(filename, mode) + if 'b'in mode: + errors = None + h = FileHandler(filename, mode, + encoding=encoding, errors=errors) else: stream = kwargs.pop("stream", None) h = StreamHandler(stream) @@ -2009,10 +2033,9 @@ def getLogger(name=None): If no name is specified, return the root logger. """ - if name: - return Logger.manager.getLogger(name) - else: + if not name or isinstance(name, str) and name == root.name: return root + return Logger.manager.getLogger(name) def critical(msg, *args, **kwargs): """ @@ -2151,6 +2174,9 @@ def emit(self, record): def createLock(self): self.lock = None + def _at_fork_reinit(self): + pass + # Warnings integration _warnings_showwarning = None diff --git a/Lib/logging/config.py b/Lib/logging/config.py index 3cd5fea852449474a06fc5d009de8ff720ba18f8..fd3aded7608cbfebcc7002d456aa3b631eec9453 100644 --- a/Lib/logging/config.py +++ b/Lib/logging/config.py @@ -143,6 +143,7 @@ def _install_handlers(cp, formatters): kwargs = section.get("kwargs", '{}') kwargs = eval(kwargs, vars(logging)) h = klass(*args, **kwargs) + h.name = hand if "level" in section: level = section["level"] h.setLevel(level) diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py index 34ff7a056ef54761832820dbcd3633109951813c..867ef4ebc7600a085ebd5ae7e74159e4fafe4059 100644 --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -48,15 +48,19 @@ class BaseRotatingHandler(logging.FileHandler): Not meant to be instantiated directly. Instead, use RotatingFileHandler or TimedRotatingFileHandler. """ - def __init__(self, filename, mode, encoding=None, delay=False): + namer = None + rotator = None + + def __init__(self, filename, mode, encoding=None, delay=False, errors=None): """ Use the specified filename for streamed logging """ - logging.FileHandler.__init__(self, filename, mode, encoding, delay) + logging.FileHandler.__init__(self, filename, mode=mode, + encoding=encoding, delay=delay, + errors=errors) self.mode = mode self.encoding = encoding - self.namer = None - self.rotator = None + self.errors = errors def emit(self, record): """ @@ -117,7 +121,8 @@ class RotatingFileHandler(BaseRotatingHandler): Handler for logging to a set of files, which switches from one file to the next when the current file reaches a certain size. """ - def __init__(self, filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False): + def __init__(self, filename, mode='a', maxBytes=0, backupCount=0, + encoding=None, delay=False, errors=None): """ Open the specified file and use it as the stream for logging. @@ -145,7 +150,8 @@ def __init__(self, filename, mode='a', maxBytes=0, backupCount=0, encoding=None, # on each run. if maxBytes > 0: mode = 'a' - BaseRotatingHandler.__init__(self, filename, mode, encoding, delay) + BaseRotatingHandler.__init__(self, filename, mode, encoding=encoding, + delay=delay, errors=errors) self.maxBytes = maxBytes self.backupCount = backupCount @@ -196,8 +202,11 @@ class TimedRotatingFileHandler(BaseRotatingHandler): If backupCount is > 0, when rollover is done, no more than backupCount files are kept - the oldest ones are deleted. """ - def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None): - BaseRotatingHandler.__init__(self, filename, 'a', encoding, delay) + def __init__(self, filename, when='h', interval=1, backupCount=0, + encoding=None, delay=False, utc=False, atTime=None, + errors=None): + BaseRotatingHandler.__init__(self, filename, 'a', encoding=encoding, + delay=delay, errors=errors) self.when = when.upper() self.backupCount = backupCount self.utc = utc @@ -431,8 +440,11 @@ class WatchedFileHandler(logging.FileHandler): This handler is based on a suggestion and patch by Chad J. Schroeder. """ - def __init__(self, filename, mode='a', encoding=None, delay=False): - logging.FileHandler.__init__(self, filename, mode, encoding, delay) + def __init__(self, filename, mode='a', encoding=None, delay=False, + errors=None): + logging.FileHandler.__init__(self, filename, mode=mode, + encoding=encoding, delay=delay, + errors=errors) self.dev, self.ino = -1, -1 self._statstream() @@ -730,6 +742,10 @@ class SysLogHandler(logging.Handler): LOG_CRON = 9 # clock daemon LOG_AUTHPRIV = 10 # security/authorization messages (private) LOG_FTP = 11 # FTP daemon + LOG_NTP = 12 # NTP subsystem + LOG_SECURITY = 13 # Log audit + LOG_CONSOLE = 14 # Log alert + LOG_SOLCRON = 15 # Scheduling daemon (Solaris) # other codes through 15 reserved for system use LOG_LOCAL0 = 16 # reserved for local use @@ -757,27 +773,30 @@ class SysLogHandler(logging.Handler): } facility_names = { - "auth": LOG_AUTH, - "authpriv": LOG_AUTHPRIV, - "cron": LOG_CRON, - "daemon": LOG_DAEMON, - "ftp": LOG_FTP, - "kern": LOG_KERN, - "lpr": LOG_LPR, - "mail": LOG_MAIL, - "news": LOG_NEWS, - "security": LOG_AUTH, # DEPRECATED - "syslog": LOG_SYSLOG, - "user": LOG_USER, - "uucp": LOG_UUCP, - "local0": LOG_LOCAL0, - "local1": LOG_LOCAL1, - "local2": LOG_LOCAL2, - "local3": LOG_LOCAL3, - "local4": LOG_LOCAL4, - "local5": LOG_LOCAL5, - "local6": LOG_LOCAL6, - "local7": LOG_LOCAL7, + "auth": LOG_AUTH, + "authpriv": LOG_AUTHPRIV, + "console": LOG_CONSOLE, + "cron": LOG_CRON, + "daemon": LOG_DAEMON, + "ftp": LOG_FTP, + "kern": LOG_KERN, + "lpr": LOG_LPR, + "mail": LOG_MAIL, + "news": LOG_NEWS, + "ntp": LOG_NTP, + "security": LOG_SECURITY, + "solaris-cron": LOG_SOLCRON, + "syslog": LOG_SYSLOG, + "user": LOG_USER, + "uucp": LOG_UUCP, + "local0": LOG_LOCAL0, + "local1": LOG_LOCAL1, + "local2": LOG_LOCAL2, + "local3": LOG_LOCAL3, + "local4": LOG_LOCAL4, + "local5": LOG_LOCAL5, + "local6": LOG_LOCAL6, + "local7": LOG_LOCAL7, } #The map below appears to be trivially lowercasing the key. However, @@ -1154,6 +1173,20 @@ def mapLogRecord(self, record): """ return record.__dict__ + def getConnection(self, host, secure): + """ + get a HTTP[S]Connection. + + Override when a custom connection is required, for example if + there is a proxy. + """ + import http.client + if secure: + connection = http.client.HTTPSConnection(host, context=self.context) + else: + connection = http.client.HTTPConnection(host) + return connection + def emit(self, record): """ Emit a record. @@ -1161,12 +1194,9 @@ def emit(self, record): Send the record to the Web server as a percent-encoded dictionary """ try: - import http.client, urllib.parse + import urllib.parse host = self.host - if self.secure: - h = http.client.HTTPSConnection(host, context=self.context) - else: - h = http.client.HTTPConnection(host) + h = self.getConnection(host, self.secure) url = self.url data = urllib.parse.urlencode(self.mapLogRecord(record)) if self.method == "GET": @@ -1242,7 +1272,7 @@ def flush(self): """ self.acquire() try: - self.buffer = [] + self.buffer.clear() finally: self.release() @@ -1294,7 +1324,11 @@ def setTarget(self, target): """ Set the target handler for this handler. """ - self.target = target + self.acquire() + try: + self.target = target + finally: + self.release() def flush(self): """ @@ -1309,7 +1343,7 @@ def flush(self): if self.target: for record in self.buffer: self.target.handle(record) - self.buffer = [] + self.buffer.clear() finally: self.release() diff --git a/Lib/mailbox.py b/Lib/mailbox.py index 5b4e86419f1173147ab4957af415ebcaef655b20..70da07ed2e9e8bc18dfc26ac1762f4102bcf4426 100644 --- a/Lib/mailbox.py +++ b/Lib/mailbox.py @@ -18,6 +18,7 @@ import email.generator import io import contextlib +from types import GenericAlias try: import fcntl except ImportError: @@ -260,6 +261,8 @@ def _dump_message(self, message, target, mangle_from_=False): else: raise TypeError('Invalid message type: %s' % type(message)) + __class_getitem__ = classmethod(GenericAlias) + class Maildir(Mailbox): """A qmail-style Maildir mailbox.""" @@ -2015,6 +2018,8 @@ def closed(self): return False return self._file.closed + __class_getitem__ = classmethod(GenericAlias) + class _PartialFile(_ProxyFile): """A read-only wrapper of part of a file.""" diff --git a/Lib/mailcap.py b/Lib/mailcap.py index bd0fc0981c8c6d7aee1df962b4a30c08e27a7ecd..ae416a8e9fb27314c41c3f5682ded746196ec3c4 100644 --- a/Lib/mailcap.py +++ b/Lib/mailcap.py @@ -251,6 +251,7 @@ def test(): else: print("Executing:", command) sts = os.system(command) + sts = os.waitstatus_to_exitcode(sts) if sts: print("Exit status:", sts) diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py index 954bb0a7453477fc5aa0ff44adad6a9a4da89dcb..92c2a470e9789df5ab41be97a14a562f6aff2398 100644 --- a/Lib/mimetypes.py +++ b/Lib/mimetypes.py @@ -401,6 +401,7 @@ def _default_mime_types(): '.Z': 'compress', '.bz2': 'bzip2', '.xz': 'xz', + '.br': 'br', } # Before adding new types, make sure they are either registered with IANA, @@ -447,7 +448,6 @@ def _default_mime_types(): '.dvi' : 'application/x-dvi', '.gtar' : 'application/x-gtar', '.hdf' : 'application/x-hdf', - '.h5' : 'application/x-hdf5', '.latex' : 'application/x-latex', '.mif' : 'application/x-mif', '.cdf' : 'application/x-netcdf', diff --git a/Lib/modulefinder.py b/Lib/modulefinder.py index aadcd23edbaaa7c91eb28ffe56b4cd75ab4d418f..cb455f40c4d7894ef73ab25bed6659e917565394 100644 --- a/Lib/modulefinder.py +++ b/Lib/modulefinder.py @@ -7,8 +7,6 @@ import os import io import sys -import types -import warnings LOAD_CONST = dis.opmap['LOAD_CONST'] diff --git a/Lib/msilib/__init__.py b/Lib/msilib/__init__.py index 0bc8dd9952462c028ec0d9dc0fdf4833c33d1530..0e85aa28967eaf44ddca3514c2c82a5f57f5a358 100644 --- a/Lib/msilib/__init__.py +++ b/Lib/msilib/__init__.py @@ -116,7 +116,7 @@ def add_data(db, table, values): raise TypeError("Unsupported type %s" % field.__class__.__name__) try: v.Modify(MSIMODIFY_INSERT, r) - except Exception as e: + except Exception: raise MSIError("Could not insert "+repr(values)+" into "+table) r.ClearData() diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py index 8e2facf92a94aa363a653a0032da4ea063f0162c..510e4b5aba44a6755c4a63fec0d8b297b2066563 100644 --- a/Lib/multiprocessing/connection.py +++ b/Lib/multiprocessing/connection.py @@ -73,6 +73,11 @@ def arbitrary_address(family): if family == 'AF_INET': return ('localhost', 0) elif family == 'AF_UNIX': + # Prefer abstract sockets if possible to avoid problems with the address + # size. When coding portable applications, some implementations have + # sun_path as short as 92 bytes in the sockaddr_un struct. + if util.abstract_sockets_supported: + return f"\0listener-{os.getpid()}-{next(_mmap_counter)}" return tempfile.mktemp(prefix='listener-', dir=util.get_temp_dir()) elif family == 'AF_PIPE': return tempfile.mktemp(prefix=r'\\.\pipe\pyc-%d-%d-' % diff --git a/Lib/multiprocessing/forkserver.py b/Lib/multiprocessing/forkserver.py index 215ac39afcaa07988c907e5a60d4685b6da61512..22a911a7a29cdc0219cb46da48fa7e2081abcc83 100644 --- a/Lib/multiprocessing/forkserver.py +++ b/Lib/multiprocessing/forkserver.py @@ -237,14 +237,8 @@ def sigchld_handler(*_unused): break child_w = pid_to_fd.pop(pid, None) if child_w is not None: - if os.WIFSIGNALED(sts): - returncode = -os.WTERMSIG(sts) - else: - if not os.WIFEXITED(sts): - raise AssertionError( - "Child {0:n} status is {1:n}".format( - pid,sts)) - returncode = os.WEXITSTATUS(sts) + returncode = os.waitstatus_to_exitcode(sts) + # Send exit code to client process try: write_signed(child_w, returncode) diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py index 85e0d886f56474dd00cc318bafef7b49ae633b75..0eb16c664cfab3608f13ac372be2a31491db452d 100644 --- a/Lib/multiprocessing/managers.py +++ b/Lib/multiprocessing/managers.py @@ -21,6 +21,7 @@ import array import queue import time +import types import os from os import getpid @@ -248,7 +249,7 @@ def serve_client(self, conn): try: obj, exposed, gettypeid = \ self.id_to_local_proxy_obj[ident] - except KeyError as second_ke: + except KeyError: raise ke if methodname not in exposed: @@ -296,7 +297,7 @@ def serve_client(self, conn): try: try: send(msg) - except Exception as e: + except Exception: send(('#UNSERIALIZABLE', format_exc())) except Exception as e: util.info('exception in thread serving %r', @@ -360,36 +361,10 @@ def shutdown(self, c): finally: self.stop_event.set() - def create(*args, **kwds): + def create(self, c, typeid, /, *args, **kwds): ''' Create a new shared object and return its id ''' - if len(args) >= 3: - self, c, typeid, *args = args - elif not args: - raise TypeError("descriptor 'create' of 'Server' object " - "needs an argument") - else: - if 'typeid' not in kwds: - raise TypeError('create expected at least 2 positional ' - 'arguments, got %d' % (len(args)-1)) - typeid = kwds.pop('typeid') - if len(args) >= 2: - self, c, *args = args - import warnings - warnings.warn("Passing 'typeid' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - if 'c' not in kwds: - raise TypeError('create expected at least 2 positional ' - 'arguments, got %d' % (len(args)-1)) - c = kwds.pop('c') - self, *args = args - import warnings - warnings.warn("Passing 'c' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - args = tuple(args) - with self.mutex: callable, exposed, method_to_typeid, proxytype = \ self.registry[typeid] @@ -421,7 +396,6 @@ def create(*args, **kwds): self.incref(c, ident) return ident, tuple(exposed) - create.__text_signature__ = '($self, c, typeid, /, *args, **kwds)' def get_methods(self, c, token): ''' @@ -1156,6 +1130,8 @@ def set(self, value): return self._callmethod('set', (value,)) value = property(get, set) + __class_getitem__ = classmethod(types.GenericAlias) + BaseListProxy = MakeProxyType('BaseListProxy', ( '__add__', '__contains__', '__delitem__', '__getitem__', '__len__', @@ -1297,26 +1273,15 @@ def __init__(self, *args, **kwargs): _SharedMemoryTracker(f"shm_{address}_{getpid()}") util.debug(f"SharedMemoryServer started by pid {getpid()}") - def create(*args, **kwargs): + def create(self, c, typeid, /, *args, **kwargs): """Create a new distributed-shared object (not backed by a shared memory block) and return its id to be used in a Proxy Object.""" # Unless set up as a shared proxy, don't make shared_memory_context # a standard part of kwargs. This makes things easier for supplying # simple functions. - if len(args) >= 3: - typeod = args[2] - elif 'typeid' in kwargs: - typeid = kwargs['typeid'] - elif not args: - raise TypeError("descriptor 'create' of 'SharedMemoryServer' " - "object needs an argument") - else: - raise TypeError('create expected at least 2 positional ' - 'arguments, got %d' % (len(args)-1)) if hasattr(self.registry[typeid][-1], "_shared_memory_proxy"): kwargs['shared_memory_context'] = self.shared_memory_context - return Server.create(*args, **kwargs) - create.__text_signature__ = '($self, c, typeid, /, *args, **kwargs)' + return Server.create(self, c, typeid, *args, **kwargs) def shutdown(self, c): "Call unlink() on all tracked shared memory, terminate the Server." diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py index 41dd923d4f9740716ede9323556dfa133d2eef6d..bbe05a550c349cdaaf32f2d849a5b56aaed9a583 100644 --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -20,8 +20,8 @@ import threading import time import traceback +import types import warnings -from queue import Empty # If threading is available then ThreadPool should be provided. Therefore # we avoid top-level imports which are liable to fail on some systems. @@ -780,6 +780,8 @@ def _set(self, i, obj): del self._cache[self._job] self._pool = None + __class_getitem__ = classmethod(types.GenericAlias) + AsyncResult = ApplyResult # create alias -- see #17805 # diff --git a/Lib/multiprocessing/popen_fork.py b/Lib/multiprocessing/popen_fork.py index 11e216072d09190282bd999263128f51dc2583b8..625981cf47627cab9d03cae4d3c6d8224a9375cc 100644 --- a/Lib/multiprocessing/popen_fork.py +++ b/Lib/multiprocessing/popen_fork.py @@ -25,16 +25,12 @@ def poll(self, flag=os.WNOHANG): if self.returncode is None: try: pid, sts = os.waitpid(self.pid, flag) - except OSError as e: + except OSError: # Child process not yet created. See #1731717 # e.errno == errno.ECHILD == 10 return None if pid == self.pid: - if os.WIFSIGNALED(sts): - self.returncode = -os.WTERMSIG(sts) - else: - assert os.WIFEXITED(sts), "Status is {:n}".format(sts) - self.returncode = os.WEXITSTATUS(sts) + self.returncode = os.waitstatus_to_exitcode(sts) return self.returncode def wait(self, timeout=None): diff --git a/Lib/multiprocessing/process.py b/Lib/multiprocessing/process.py index be13c079bb89b3a0a435bc8184914638776d8de7..0b2e0b45b2397be0a672b36b7e4c572b3996cf53 100644 --- a/Lib/multiprocessing/process.py +++ b/Lib/multiprocessing/process.py @@ -317,12 +317,12 @@ def _bootstrap(self, parent_sentinel=None): finally: util._exit_function() except SystemExit as e: - if not e.args: - exitcode = 1 - elif isinstance(e.args[0], int): - exitcode = e.args[0] + if e.code is None: + exitcode = 0 + elif isinstance(e.code, int): + exitcode = e.code else: - sys.stderr.write(str(e.args[0]) + '\n') + sys.stderr.write(str(e.code) + '\n') exitcode = 1 except: exitcode = 1 diff --git a/Lib/multiprocessing/queues.py b/Lib/multiprocessing/queues.py index d112db2cd981d116c226806ef3c84037d7b515e7..a2901814876d6c0a64c50903e778812b5eace037 100644 --- a/Lib/multiprocessing/queues.py +++ b/Lib/multiprocessing/queues.py @@ -14,6 +14,7 @@ import threading import collections import time +import types import weakref import errno @@ -48,8 +49,7 @@ def __init__(self, maxsize=0, *, ctx): self._sem = ctx.BoundedSemaphore(maxsize) # For use by concurrent.futures self._ignore_epipe = False - - self._after_fork() + self._reset() if sys.platform != 'win32': register_after_fork(self, Queue._after_fork) @@ -62,11 +62,17 @@ def __getstate__(self): def __setstate__(self, state): (self._ignore_epipe, self._maxsize, self._reader, self._writer, self._rlock, self._wlock, self._sem, self._opid) = state - self._after_fork() + self._reset() def _after_fork(self): debug('Queue._after_fork()') - self._notempty = threading.Condition(threading.Lock()) + self._reset(after_fork=True) + + def _reset(self, after_fork=False): + if after_fork: + self._notempty._at_fork_reinit() + else: + self._notempty = threading.Condition(threading.Lock()) self._buffer = collections.deque() self._thread = None self._jointhread = None @@ -340,6 +346,10 @@ def __init__(self, *, ctx): else: self._wlock = ctx.Lock() + def close(self): + self._reader.close() + self._writer.close() + def empty(self): return not self._poll() @@ -366,3 +376,5 @@ def put(self, obj): else: with self._wlock: self._writer.send_bytes(obj) + + __class_getitem__ = classmethod(types.GenericAlias) diff --git a/Lib/multiprocessing/resource_sharer.py b/Lib/multiprocessing/resource_sharer.py index 8d5c9900f69fede88b477e49d312ae631128266e..66076509a1202e7a1b4d8a481f64621a4bfbbf3e 100644 --- a/Lib/multiprocessing/resource_sharer.py +++ b/Lib/multiprocessing/resource_sharer.py @@ -63,7 +63,6 @@ class _ResourceSharer(object): def __init__(self): self._key = 0 self._cache = {} - self._old_locks = [] self._lock = threading.Lock() self._listener = None self._address = None @@ -113,10 +112,7 @@ def _afterfork(self): for key, (send, close) in self._cache.items(): close() self._cache.clear() - # If self._lock was locked at the time of the fork, it may be broken - # -- see issue 6721. Replace it without letting it be gc'ed. - self._old_locks.append(self._lock) - self._lock = threading.Lock() + self._lock._at_fork_reinit() if self._listener is not None: self._listener.close() self._listener = None diff --git a/Lib/multiprocessing/shared_memory.py b/Lib/multiprocessing/shared_memory.py index f92eb012c83160e2e10a23e8c7c9741da3e53b9d..122b3fcebf3fedd29ece099d1a64b2ef771e29f6 100644 --- a/Lib/multiprocessing/shared_memory.py +++ b/Lib/multiprocessing/shared_memory.py @@ -14,6 +14,7 @@ import errno import struct import secrets +import types if os.name == "nt": import _winapi @@ -75,6 +76,8 @@ def __init__(self, name=None, create=False, size=0): raise ValueError("'size' must be a positive integer") if create: self._flags = _O_CREX | os.O_RDWR + if size == 0: + raise ValueError("'size' must be a positive number different from zero") if name is None and not self._flags & os.O_EXCL: raise ValueError("'name' can only be None if create=True") @@ -251,6 +254,15 @@ class ShareableList: packing format for any storable value must require no more than 8 characters to describe its format.""" + # The shared memory area is organized as follows: + # - 8 bytes: number of items (N) as a 64-bit integer + # - (N + 1) * 8 bytes: offsets of each element from the start of the + # data area + # - K bytes: the data area storing item values (with encoding and size + # depending on their respective types) + # - N * 8 bytes: `struct` format string for each element + # - N bytes: index into _back_transforms_mapping for each element + # (for reconstructing the corresponding Python value) _types_mapping = { int: "q", float: "d", @@ -282,7 +294,8 @@ def _extract_recreation_code(value): return 3 # NoneType def __init__(self, sequence=None, *, name=None): - if sequence is not None: + if name is None or sequence is not None: + sequence = sequence or () _formats = [ self._types_mapping[type(item)] if not isinstance(item, (str, bytes)) @@ -293,10 +306,14 @@ def __init__(self, sequence=None, *, name=None): ] self._list_len = len(_formats) assert sum(len(fmt) <= 8 for fmt in _formats) == self._list_len - self._allocated_bytes = tuple( - self._alignment if fmt[-1] != "s" else int(fmt[:-1]) - for fmt in _formats - ) + offset = 0 + # The offsets of each list element into the shared memory's + # data area (0 meaning the start of the data area, not the start + # of the shared memory area). + self._allocated_offsets = [0] + for fmt in _formats: + offset += self._alignment if fmt[-1] != "s" else int(fmt[:-1]) + self._allocated_offsets.append(offset) _recreation_codes = [ self._extract_recreation_code(item) for item in sequence ] @@ -307,13 +324,9 @@ def __init__(self, sequence=None, *, name=None): self._format_back_transform_codes ) + self.shm = SharedMemory(name, create=True, size=requested_size) else: - requested_size = 8 # Some platforms require > 0. - - if name is not None and sequence is None: self.shm = SharedMemory(name) - else: - self.shm = SharedMemory(name, create=True, size=requested_size) if sequence is not None: _enc = _encoding @@ -322,7 +335,7 @@ def __init__(self, sequence=None, *, name=None): self.shm.buf, 0, self._list_len, - *(self._allocated_bytes) + *(self._allocated_offsets) ) struct.pack_into( "".join(_formats), @@ -345,10 +358,12 @@ def __init__(self, sequence=None, *, name=None): else: self._list_len = len(self) # Obtains size from offset 0 in buffer. - self._allocated_bytes = struct.unpack_from( - self._format_size_metainfo, - self.shm.buf, - 1 * 8 + self._allocated_offsets = list( + struct.unpack_from( + self._format_size_metainfo, + self.shm.buf, + 1 * 8 + ) ) def _get_packing_format(self, position): @@ -370,7 +385,6 @@ def _get_packing_format(self, position): def _get_back_transform(self, position): "Gets the back transformation function for a single value." - position = position if position >= 0 else position + self._list_len if (position >= self._list_len) or (self._list_len < 0): raise IndexError("Requested position out of range.") @@ -387,7 +401,6 @@ def _set_packing_format_and_transform(self, position, fmt_as_str, value): """Sets the packing format and back transformation code for a single value in the list at the specified position.""" - position = position if position >= 0 else position + self._list_len if (position >= self._list_len) or (self._list_len < 0): raise IndexError("Requested position out of range.") @@ -407,9 +420,9 @@ def _set_packing_format_and_transform(self, position, fmt_as_str, value): ) def __getitem__(self, position): + position = position if position >= 0 else position + self._list_len try: - offset = self._offset_data_start \ - + sum(self._allocated_bytes[:position]) + offset = self._offset_data_start + self._allocated_offsets[position] (v,) = struct.unpack_from( self._get_packing_format(position), self.shm.buf, @@ -424,9 +437,10 @@ def __getitem__(self, position): return v def __setitem__(self, position, value): + position = position if position >= 0 else position + self._list_len try: - offset = self._offset_data_start \ - + sum(self._allocated_bytes[:position]) + item_offset = self._allocated_offsets[position] + offset = self._offset_data_start + item_offset current_format = self._get_packing_format(position) except IndexError: raise IndexError("assignment index out of range") @@ -435,15 +449,17 @@ def __setitem__(self, position, value): new_format = self._types_mapping[type(value)] encoded_value = value else: + allocated_length = self._allocated_offsets[position + 1] - item_offset + encoded_value = (value.encode(_encoding) if isinstance(value, str) else value) - if len(encoded_value) > self._allocated_bytes[position]: + if len(encoded_value) > allocated_length: raise ValueError("bytes/str item exceeds available storage") if current_format[-1] == "s": new_format = current_format else: new_format = self._types_mapping[str] % ( - self._allocated_bytes[position], + allocated_length, ) self._set_packing_format_and_transform( @@ -464,33 +480,35 @@ def __repr__(self): @property def format(self): - "The struct packing format used by all currently stored values." + "The struct packing format used by all currently stored items." return "".join( self._get_packing_format(i) for i in range(self._list_len) ) @property def _format_size_metainfo(self): - "The struct packing format used for metainfo on storage sizes." - return f"{self._list_len}q" + "The struct packing format used for the items' storage offsets." + return "q" * (self._list_len + 1) @property def _format_packing_metainfo(self): - "The struct packing format used for the values' packing formats." + "The struct packing format used for the items' packing formats." return "8s" * self._list_len @property def _format_back_transform_codes(self): - "The struct packing format used for the values' back transforms." + "The struct packing format used for the items' back transforms." return "b" * self._list_len @property def _offset_data_start(self): - return (self._list_len + 1) * 8 # 8 bytes per "q" + # - 8 bytes for the list length + # - (N + 1) * 8 bytes for the element offsets + return (self._list_len + 2) * 8 @property def _offset_packing_formats(self): - return self._offset_data_start + sum(self._allocated_bytes) + return self._offset_data_start + self._allocated_offsets[-1] @property def _offset_back_transform_codes(self): @@ -510,3 +528,5 @@ def index(self, value): return position else: raise ValueError(f"{value!r} not in this container") + + __class_getitem__ = classmethod(types.GenericAlias) diff --git a/Lib/multiprocessing/synchronize.py b/Lib/multiprocessing/synchronize.py index 4fcbefc8bbefd33eb5c4c2956049570e57e2f390..d0be48f1fd7a8f14b935f74d89c168d831b84dbc 100644 --- a/Lib/multiprocessing/synchronize.py +++ b/Lib/multiprocessing/synchronize.py @@ -270,7 +270,7 @@ def wait(self, timeout=None): def notify(self, n=1): assert self._lock._semlock._is_mine(), 'lock is not owned' assert not self._wait_semaphore.acquire( - False), ('notify: Should not have been able to acquire' + False), ('notify: Should not have been able to acquire ' + '_wait_semaphore') # to take account of timeouts since last notify*() we subtract diff --git a/Lib/multiprocessing/util.py b/Lib/multiprocessing/util.py index 44abfe529fc784c85a723342b74ab9893065f0b5..21f2a7ebe250028c97ccf1befa2e769e44bb42de 100644 --- a/Lib/multiprocessing/util.py +++ b/Lib/multiprocessing/util.py @@ -367,13 +367,13 @@ def _exit_function(info=info, debug=debug, _run_finalizers=_run_finalizers, class ForkAwareThreadLock(object): def __init__(self): - self._reset() - register_after_fork(self, ForkAwareThreadLock._reset) - - def _reset(self): self._lock = threading.Lock() self.acquire = self._lock.acquire self.release = self._lock.release + register_after_fork(self, ForkAwareThreadLock._at_fork_reinit) + + def _at_fork_reinit(self): + self._lock._at_fork_reinit() def __enter__(self): return self._lock.__enter__() @@ -452,7 +452,7 @@ def spawnv_passfds(path, args, passfds): return _posixsubprocess.fork_exec( args, [os.fsencode(path)], True, passfds, None, None, -1, -1, -1, -1, -1, -1, errpipe_read, errpipe_write, - False, False, None) + False, False, None, None, None, -1, None) finally: os.close(errpipe_read) os.close(errpipe_write) diff --git a/Lib/nntplib.py b/Lib/nntplib.py index 9036f361b5fb6b9e631b713016f1d341baed8a7b..f6e746e7c95c5bfdcaebff155a140de34d71fed1 100644 --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -67,7 +67,6 @@ import socket import collections import datetime -import warnings import sys try: @@ -294,7 +293,7 @@ def _encrypt_on(sock, context, hostname): # The classes themselves -class _NNTPBase: +class NNTP: # UTF-8 is the character set for all NNTP commands and responses: they # are automatically encoded (when sending) and decoded (and receiving) # by this class. @@ -310,13 +309,18 @@ class _NNTPBase: encoding = 'utf-8' errors = 'surrogateescape' - def __init__(self, file, host, - readermode=None, timeout=_GLOBAL_DEFAULT_TIMEOUT): + def __init__(self, host, port=NNTP_PORT, user=None, password=None, + readermode=None, usenetrc=False, + timeout=_GLOBAL_DEFAULT_TIMEOUT): """Initialize an instance. Arguments: - - file: file-like object (open for read/write in binary mode) - - host: hostname of the server + - host: hostname to connect to + - port: port to connect to (default the standard NNTP port) + - user: username to authenticate with + - password: password to use with username - readermode: if true, send 'mode reader' command after connecting. + - usenetrc: allow loading username and password from ~/.netrc file + if not specified explicitly - timeout: timeout (in seconds) used for socket connections readermode is sometimes necessary if you are connecting to an @@ -326,7 +330,24 @@ def __init__(self, file, host, readermode. """ self.host = host - self.file = file + self.port = port + self.sock = self._create_socket(timeout) + self.file = None + try: + self.file = self.sock.makefile("rwb") + self._base_init(readermode) + if user or usenetrc: + self.login(user, password, usenetrc) + except: + if self.file: + self.file.close() + self.sock.close() + raise + + def _base_init(self, readermode): + """Partial initialization for the NNTP protocol. + This instance method is extracted for supporting the test code. + """ self.debugging = 0 self.welcome = self._getresp() @@ -371,6 +392,12 @@ def __exit__(self, *args): if is_connected(): self._close() + def _create_socket(self, timeout): + if timeout is not None and not timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') + sys.audit("nntplib.connect", self, self.host, self.port) + return socket.create_connection((self.host, self.port), timeout) + def getwelcome(self): """Get the welcome message from the server (this is read and squirreled away by __init__()). @@ -834,44 +861,6 @@ def over(self, message_spec, *, file=None): fmt = self._getoverviewfmt() return resp, _parse_overview(lines, fmt) - def xgtitle(self, group, *, file=None): - """Process an XGTITLE command (optional server extension) Arguments: - - group: group name wildcard (i.e. news.*) - Returns: - - resp: server response if successful - - list: list of (name,title) strings""" - warnings.warn("The XGTITLE extension is not actively used, " - "use descriptions() instead", - DeprecationWarning, 2) - line_pat = re.compile('^([^ \t]+)[ \t]+(.*)$') - resp, raw_lines = self._longcmdstring('XGTITLE ' + group, file) - lines = [] - for raw_line in raw_lines: - match = line_pat.search(raw_line.strip()) - if match: - lines.append(match.group(1, 2)) - return resp, lines - - def xpath(self, id): - """Process an XPATH command (optional server extension) Arguments: - - id: Message id of article - Returns: - resp: server response if successful - path: directory path to article - """ - warnings.warn("The XPATH extension is not actively used", - DeprecationWarning, 2) - - resp = self._shortcmd('XPATH {0}'.format(id)) - if not resp.startswith('223'): - raise NNTPReplyError(resp) - try: - [resp_num, path] = resp.split() - except ValueError: - raise NNTPReplyError(resp) from None - else: - return resp, path - def date(self): """Process the DATE command. Returns: @@ -927,8 +916,12 @@ def ihave(self, message_id, data): return self._post('IHAVE {0}'.format(message_id), data) def _close(self): - self.file.close() - del self.file + try: + if self.file: + self.file.close() + del self.file + finally: + self.sock.close() def quit(self): """Process a QUIT command and close the socket. Returns: @@ -1018,54 +1011,8 @@ def starttls(self, context=None): raise NNTPError("TLS failed to start.") -class NNTP(_NNTPBase): - - def __init__(self, host, port=NNTP_PORT, user=None, password=None, - readermode=None, usenetrc=False, - timeout=_GLOBAL_DEFAULT_TIMEOUT): - """Initialize an instance. Arguments: - - host: hostname to connect to - - port: port to connect to (default the standard NNTP port) - - user: username to authenticate with - - password: password to use with username - - readermode: if true, send 'mode reader' command after - connecting. - - usenetrc: allow loading username and password from ~/.netrc file - if not specified explicitly - - timeout: timeout (in seconds) used for socket connections - - readermode is sometimes necessary if you are connecting to an - NNTP server on the local machine and intend to call - reader-specific commands, such as `group'. If you get - unexpected NNTPPermanentErrors, you might need to set - readermode. - """ - self.host = host - self.port = port - sys.audit("nntplib.connect", self, host, port) - self.sock = socket.create_connection((host, port), timeout) - file = None - try: - file = self.sock.makefile("rwb") - _NNTPBase.__init__(self, file, host, - readermode, timeout) - if user or usenetrc: - self.login(user, password, usenetrc) - except: - if file: - file.close() - self.sock.close() - raise - - def _close(self): - try: - _NNTPBase._close(self) - finally: - self.sock.close() - - if _have_ssl: - class NNTP_SSL(_NNTPBase): + class NNTP_SSL(NNTP): def __init__(self, host, port=NNTP_SSL_PORT, user=None, password=None, ssl_context=None, @@ -1074,27 +1021,19 @@ def __init__(self, host, port=NNTP_SSL_PORT, """This works identically to NNTP.__init__, except for the change in default port and the `ssl_context` argument for SSL connections. """ - sys.audit("nntplib.connect", self, host, port) - self.sock = socket.create_connection((host, port), timeout) - file = None + self.ssl_context = ssl_context + super().__init__(host, port, user, password, readermode, + usenetrc, timeout) + + def _create_socket(self, timeout): + sock = super()._create_socket(timeout) try: - self.sock = _encrypt_on(self.sock, ssl_context, host) - file = self.sock.makefile("rwb") - _NNTPBase.__init__(self, file, host, - readermode=readermode, timeout=timeout) - if user or usenetrc: - self.login(user, password, usenetrc) + sock = _encrypt_on(sock, self.ssl_context, self.host) except: - if file: - file.close() - self.sock.close() + sock.close() raise - - def _close(self): - try: - _NNTPBase._close(self) - finally: - self.sock.close() + else: + return sock __all__.append("NNTP_SSL") diff --git a/Lib/opcode.py b/Lib/opcode.py index 3fb716b5d96a2909556eb25621ec0b354a5a3a03..ac1aa535f66ff6d39b644a0c4b78d294ce6aa0f1 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -21,8 +21,7 @@ except ImportError: pass -cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', - 'is not', 'exception match', 'BAD') +cmp_op = ('<', '<=', '==', '!=', '>', '>=') hasconst = [] hasname = [] @@ -84,10 +83,12 @@ def jabs_op(name, op): def_op('INPLACE_FLOOR_DIVIDE', 28) def_op('INPLACE_TRUE_DIVIDE', 29) +def_op('RERAISE', 48) +def_op('WITH_EXCEPT_START', 49) def_op('GET_AITER', 50) def_op('GET_ANEXT', 51) def_op('BEFORE_ASYNC_WITH', 52) -def_op('BEGIN_FINALLY', 53) + def_op('END_ASYNC_FOR', 54) def_op('INPLACE_ADD', 55) def_op('INPLACE_SUBTRACT', 56) @@ -109,20 +110,20 @@ def jabs_op(name, op): def_op('LOAD_BUILD_CLASS', 71) def_op('YIELD_FROM', 72) def_op('GET_AWAITABLE', 73) - +def_op('LOAD_ASSERTION_ERROR', 74) def_op('INPLACE_LSHIFT', 75) def_op('INPLACE_RSHIFT', 76) def_op('INPLACE_AND', 77) def_op('INPLACE_XOR', 78) def_op('INPLACE_OR', 79) -def_op('WITH_CLEANUP_START', 81) -def_op('WITH_CLEANUP_FINISH', 82) + +def_op('LIST_TO_TUPLE', 82) def_op('RETURN_VALUE', 83) def_op('IMPORT_STAR', 84) def_op('SETUP_ANNOTATIONS', 85) def_op('YIELD_VALUE', 86) def_op('POP_BLOCK', 87) -def_op('END_FINALLY', 88) + def_op('POP_EXCEPT', 89) HAVE_ARGUMENT = 90 # Opcodes from here have an argument: @@ -158,6 +159,10 @@ def jabs_op(name, op): name_op('LOAD_GLOBAL', 116) # Index in name list +def_op('IS_OP', 117) +def_op('CONTAINS_OP', 118) + +jabs_op('JUMP_IF_NOT_EXC_MATCH', 121) jrel_op('SETUP_FINALLY', 122) # Distance to target address def_op('LOAD_FAST', 124) # Local variable number @@ -195,22 +200,18 @@ def jabs_op(name, op): def_op('EXTENDED_ARG', 144) EXTENDED_ARG = 144 -def_op('BUILD_LIST_UNPACK', 149) -def_op('BUILD_MAP_UNPACK', 150) -def_op('BUILD_MAP_UNPACK_WITH_CALL', 151) -def_op('BUILD_TUPLE_UNPACK', 152) -def_op('BUILD_SET_UNPACK', 153) - jrel_op('SETUP_ASYNC_WITH', 154) def_op('FORMAT_VALUE', 155) def_op('BUILD_CONST_KEY_MAP', 156) def_op('BUILD_STRING', 157) -def_op('BUILD_TUPLE_UNPACK_WITH_CALL', 158) name_op('LOAD_METHOD', 160) def_op('CALL_METHOD', 161) -jrel_op('CALL_FINALLY', 162) -def_op('POP_FINALLY', 163) + +def_op('LIST_EXTEND', 162) +def_op('SET_UPDATE', 163) +def_op('DICT_MERGE', 164) +def_op('DICT_UPDATE', 165) del def_op, name_op, jrel_op, jabs_op diff --git a/Lib/os.py b/Lib/os.py index 253cad1a59f35ad40950ae1040cb9542456d90a5..b794159f86c33ef882858c2ed1d8c4749799a4de 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -28,6 +28,8 @@ from _collections_abc import _check_methods +GenericAlias = type(list[int]) + _names = sys.builtin_module_names # Note: more names are added to __all__ later. @@ -336,7 +338,10 @@ def walk(top, topdown=True, onerror=None, followlinks=False): dirs.remove('CVS') # don't visit CVS directories """ - top = fspath(top) + sys.audit("os.walk", top, topdown, onerror, followlinks) + return _walk(fspath(top), topdown, onerror, followlinks) + +def _walk(top, topdown, onerror, followlinks): dirs = [] nondirs = [] walk_dirs = [] @@ -410,11 +415,11 @@ def walk(top, topdown=True, onerror=None, followlinks=False): # the caller can replace the directory entry during the "yield" # above. if followlinks or not islink(new_path): - yield from walk(new_path, topdown, onerror, followlinks) + yield from _walk(new_path, topdown, onerror, followlinks) else: # Recurse into sub-directories for new_path in walk_dirs: - yield from walk(new_path, topdown, onerror, followlinks) + yield from _walk(new_path, topdown, onerror, followlinks) # Yield after recursion if going bottom up yield top, dirs, nondirs @@ -455,6 +460,7 @@ def fwalk(top=".", topdown=True, onerror=None, *, follow_symlinks=False, dir_fd= if 'CVS' in dirs: dirs.remove('CVS') # don't visit CVS directories """ + sys.audit("os.fwalk", top, topdown, onerror, follow_symlinks, dir_fd) if not isinstance(top, int) or not hasattr(top, '__index__'): top = fspath(top) # Note: To guard against symlink races, we use the standard @@ -654,17 +660,15 @@ def get_exec_path(env=None): return path_list.split(pathsep) -# Change environ to automatically call putenv(), unsetenv if they exist. -from _collections_abc import MutableMapping +# Change environ to automatically call putenv() and unsetenv() +from _collections_abc import MutableMapping, Mapping class _Environ(MutableMapping): - def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv): + def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue): self.encodekey = encodekey self.decodekey = decodekey self.encodevalue = encodevalue self.decodevalue = decodevalue - self.putenv = putenv - self.unsetenv = unsetenv self._data = data def __getitem__(self, key): @@ -678,12 +682,12 @@ def __getitem__(self, key): def __setitem__(self, key, value): key = self.encodekey(key) value = self.encodevalue(value) - self.putenv(key, value) + putenv(key, value) self._data[key] = value def __delitem__(self, key): encodedkey = self.encodekey(key) - self.unsetenv(encodedkey) + unsetenv(encodedkey) try: del self._data[encodedkey] except KeyError: @@ -712,21 +716,23 @@ def setdefault(self, key, value): self[key] = value return self[key] -try: - _putenv = putenv -except NameError: - _putenv = lambda key, value: None -else: - if "putenv" not in __all__: - __all__.append("putenv") + def __ior__(self, other): + self.update(other) + return self -try: - _unsetenv = unsetenv -except NameError: - _unsetenv = lambda key: _putenv(key, "") -else: - if "unsetenv" not in __all__: - __all__.append("unsetenv") + def __or__(self, other): + if not isinstance(other, Mapping): + return NotImplemented + new = dict(self) + new.update(other) + return new + + def __ror__(self, other): + if not isinstance(other, Mapping): + return NotImplemented + new = dict(other) + new.update(self) + return new def _createenviron(): if name == 'nt': @@ -755,8 +761,7 @@ def decode(value): data = environ return _Environ(data, encodekey, decode, - encode, decode, - _putenv, _unsetenv) + encode, decode) # unicode environ environ = _createenviron() @@ -781,8 +786,7 @@ def _check_bytes(value): # bytes environ environb = _Environ(environ._data, _check_bytes, bytes, - _check_bytes, bytes, - _putenv, _unsetenv) + _check_bytes, bytes) del _check_bytes def getenvb(key, default=None): @@ -862,12 +866,8 @@ def _spawnvef(mode, file, args, env, func): wpid, sts = waitpid(pid, 0) if WIFSTOPPED(sts): continue - elif WIFSIGNALED(sts): - return -WTERMSIG(sts) - elif WIFEXITED(sts): - return WEXITSTATUS(sts) - else: - raise OSError("Not stopped, signaled or exited???") + + return waitstatus_to_exitcode(sts) def spawnv(mode, file, args): """spawnv(mode, file, args) -> integer @@ -1076,6 +1076,8 @@ def __subclasshook__(cls, subclass): return _check_methods(subclass, '__fspath__') return NotImplemented + __class_getitem__ = classmethod(GenericAlias) + if name == 'nt': class _AddedDllDirectory: diff --git a/Lib/pathlib.py b/Lib/pathlib.py index ff8bac94bc0bea2edbd078a616812708e77ce796..147be2ff0dddfccba0a7969140eafbffc1cfedbe 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -329,7 +329,10 @@ def _resolve(path, rest): # parent dir path, _, _ = path.rpartition(sep) continue - newpath = path + sep + name + if path.endswith(sep): + newpath = path + name + else: + newpath = path + sep + name if newpath in seen: # Already seen this path path = seen[newpath] @@ -447,6 +450,20 @@ def symlink(a, b, target_is_directory): def readlink(self, path): return os.readlink(path) + def owner(self, path): + try: + import pwd + return pwd.getpwuid(self.stat(path).st_uid).pw_name + except ImportError: + raise NotImplementedError("Path.owner() is unsupported on this system") + + def group(self, path): + try: + import grp + return grp.getgrgid(self.stat(path).st_gid).gr_name + except ImportError: + raise NotImplementedError("Path.group() is unsupported on this system") + _normal_accessor = _NormalAccessor() @@ -785,6 +802,9 @@ def __ge__(self, other): return NotImplemented return self._cparts >= other._cparts + def __class_getitem__(cls, type): + return cls + drive = property(attrgetter('_drv'), doc="""The drive prefix (letter or UNC path), if any.""") @@ -853,6 +873,10 @@ def with_name(self, name): return self._from_parsed_parts(self._drv, self._root, self._parts[:-1] + [name]) + def with_stem(self, stem): + """Return a new path with the stem changed.""" + return self.with_name(stem + self.suffix) + def with_suffix(self, suffix): """Return a new path with the file suffix changed. If the path has no suffix, add given suffix. If the given suffix is an empty @@ -901,11 +925,21 @@ def relative_to(self, *other): cf = self._flavour.casefold_parts if (root or drv) if n == 0 else cf(abs_parts[:n]) != cf(to_abs_parts): formatted = self._format_parsed_parts(to_drv, to_root, to_parts) - raise ValueError("{!r} does not start with {!r}" + raise ValueError("{!r} is not in the subpath of {!r}" + " OR one path is relative and the other is absolute." .format(str(self), str(formatted))) return self._from_parsed_parts('', root if n == 1 else '', abs_parts[n:]) + def is_relative_to(self, *other): + """Return True if the path is relative to another path or False. + """ + try: + self.relative_to(*other) + return True + except ValueError: + return False + @property def parts(self): """An object providing sequence-like access to the @@ -1029,7 +1063,6 @@ class Path(PurePath): """ __slots__ = ( '_accessor', - '_closed', ) def __new__(cls, *args, **kwargs): @@ -1046,7 +1079,6 @@ def _init(self, # Private non-constructor arguments template=None, ): - self._closed = False if template is not None: self._accessor = template._accessor else: @@ -1059,15 +1091,18 @@ def _make_child_relpath(self, part): return self._from_parsed_parts(self._drv, self._root, parts) def __enter__(self): - if self._closed: - self._raise_closed() return self def __exit__(self, t, v, tb): - self._closed = True - - def _raise_closed(self): - raise ValueError("I/O operation on closed path") + # https://bugs.python.org/issue39682 + # In previous versions of pathlib, this method marked this path as + # closed; subsequent attempts to perform I/O would raise an IOError. + # This functionality was never documented, and had the effect of + # making Path objects mutable, contrary to PEP 428. In Python 3.9 the + # _closed attribute was removed, and this method made a no-op. + # This method and __enter__()/__exit__() should be deprecated and + # removed in the future. + pass def _opener(self, name, flags, mode=0o666): # A stub for the opener argument to built-in open() @@ -1078,8 +1113,6 @@ def _raw_open(self, flags, mode=0o777): Open the file pointed by this path and return a file descriptor, as os.open() does. """ - if self._closed: - self._raise_closed() return self._accessor.open(self, flags, mode) # Public API @@ -1106,27 +1139,24 @@ def samefile(self, other_path): try: other_st = other_path.stat() except AttributeError: - other_st = os.stat(other_path) + other_st = self._accessor.stat(other_path) return os.path.samestat(st, other_st) def iterdir(self): """Iterate over the files in this directory. Does not yield any result for the special paths '.' and '..'. """ - if self._closed: - self._raise_closed() for name in self._accessor.listdir(self): if name in {'.', '..'}: # Yielding a path object for these makes little sense continue yield self._make_child_relpath(name) - if self._closed: - self._raise_closed() def glob(self, pattern): """Iterate over this subtree and yield all existing files (of any kind, including directories) matching the given relative pattern. """ + sys.audit("pathlib.Path.glob", self, pattern) if not pattern: raise ValueError("Unacceptable pattern: {!r}".format(pattern)) drv, root, pattern_parts = self._flavour.parse_parts((pattern,)) @@ -1141,6 +1171,7 @@ def rglob(self, pattern): directories) matching the given relative pattern, anywhere in this subtree. """ + sys.audit("pathlib.Path.rglob", self, pattern) drv, root, pattern_parts = self._flavour.parse_parts((pattern,)) if drv or root: raise NotImplementedError("Non-relative patterns are unsupported") @@ -1156,8 +1187,6 @@ def absolute(self): Use resolve() to get the canonical path to a file. """ # XXX untested yet! - if self._closed: - self._raise_closed() if self.is_absolute(): return self # FIXME this must defer to the specific flavour (and, under Windows, @@ -1172,8 +1201,6 @@ def resolve(self, strict=False): normalizing it (for example turning slashes into backslashes under Windows). """ - if self._closed: - self._raise_closed() s = self._flavour.resolve(self, strict=strict) if s is None: # No symlink resolution => for consistency, raise an error if @@ -1197,15 +1224,13 @@ def owner(self): """ Return the login name of the file owner. """ - import pwd - return pwd.getpwuid(self.stat().st_uid).pw_name + return self._accessor.owner(self) def group(self): """ Return the group name of the file gid. """ - import grp - return grp.getgrgid(self.stat().st_gid).gr_name + return self._accessor.group(self) def open(self, mode='r', buffering=-1, encoding=None, errors=None, newline=None): @@ -1213,8 +1238,6 @@ def open(self, mode='r', buffering=-1, encoding=None, Open the file pointed by this path and return a file object, as the built-in open() function does. """ - if self._closed: - self._raise_closed() return io.open(self, mode, buffering, encoding, errors, newline, opener=self._opener) @@ -1251,12 +1274,19 @@ def write_text(self, data, encoding=None, errors=None): with self.open(mode='w', encoding=encoding, errors=errors) as f: return f.write(data) + def readlink(self): + """ + Return the path to which the symbolic link points. + """ + path = self._accessor.readlink(self) + obj = self._from_parts((path,), init=False) + obj._init(template=self) + return obj + def touch(self, mode=0o666, exist_ok=True): """ Create this file with the given access mode, if it doesn't exist. """ - if self._closed: - self._raise_closed() if exist_ok: # First try to bump modification time # Implementation note: GNU touch uses the UTIME_NOW option of @@ -1278,8 +1308,6 @@ def mkdir(self, mode=0o777, parents=False, exist_ok=False): """ Create a new directory at this given path. """ - if self._closed: - self._raise_closed() try: self._accessor.mkdir(self, mode) except FileNotFoundError: @@ -1297,8 +1325,6 @@ def chmod(self, mode): """ Change the permissions of the path, like os.chmod(). """ - if self._closed: - self._raise_closed() self._accessor.chmod(self, mode) def lchmod(self, mode): @@ -1306,8 +1332,6 @@ def lchmod(self, mode): Like chmod(), except if the path points to a symlink, the symlink's permissions are changed, rather than its target's. """ - if self._closed: - self._raise_closed() self._accessor.lchmod(self, mode) def unlink(self, missing_ok=False): @@ -1315,8 +1339,6 @@ def unlink(self, missing_ok=False): Remove this file or link. If the path is a directory, use rmdir() instead. """ - if self._closed: - self._raise_closed() try: self._accessor.unlink(self) except FileNotFoundError: @@ -1327,8 +1349,6 @@ def rmdir(self): """ Remove this directory. The directory must be empty. """ - if self._closed: - self._raise_closed() self._accessor.rmdir(self) def lstat(self): @@ -1336,36 +1356,37 @@ def lstat(self): Like stat(), except if the path points to a symlink, the symlink's status information is returned, rather than its target's. """ - if self._closed: - self._raise_closed() return self._accessor.lstat(self) def link_to(self, target): """ Create a hard link pointing to a path named target. """ - if self._closed: - self._raise_closed() self._accessor.link_to(self, target) def rename(self, target): """ - Rename this path to the given path, - and return a new Path instance pointing to the given path. + Rename this path to the target path. + + The target path may be absolute or relative. Relative paths are + interpreted relative to the current working directory, *not* the + directory of the Path object. + + Returns the new Path instance pointing to the target path. """ - if self._closed: - self._raise_closed() self._accessor.rename(self, target) return self.__class__(target) def replace(self, target): """ - Rename this path to the given path, clobbering the existing - destination if it exists, and return a new Path instance - pointing to the given path. + Rename this path to the target path, overwriting if that path exists. + + The target path may be absolute or relative. Relative paths are + interpreted relative to the current working directory, *not* the + directory of the Path object. + + Returns the new Path instance pointing to the target path. """ - if self._closed: - self._raise_closed() self._accessor.replace(self, target) return self.__class__(target) @@ -1374,8 +1395,6 @@ def symlink_to(self, target, target_is_directory=False): Make this path a symlink pointing to the given path. Note the order of arguments (self, target) is the reverse of os.symlink's. """ - if self._closed: - self._raise_closed() self._accessor.symlink(target, self, target_is_directory) # Convenience functions for querying the stat results @@ -1436,9 +1455,8 @@ def is_mount(self): if not self.exists() or not self.is_dir(): return False - parent = Path(self.parent) try: - parent_dev = parent.stat().st_dev + parent_dev = self.parent.stat().st_dev except OSError: return False @@ -1446,7 +1464,7 @@ def is_mount(self): if dev != parent_dev: return True ino = self.stat().st_ino - parent_ino = parent.stat().st_ino + parent_ino = self.parent.stat().st_ino return ino == parent_ino def is_symlink(self): @@ -1554,11 +1572,5 @@ class WindowsPath(Path, PureWindowsPath): """ __slots__ = () - def owner(self): - raise NotImplementedError("Path.owner() is unsupported on this system") - - def group(self): - raise NotImplementedError("Path.group() is unsupported on this system") - def is_mount(self): raise NotImplementedError("Path.is_mount() is unsupported on this system") diff --git a/Lib/pdb.py b/Lib/pdb.py index 081023526c0ea0438bf9e91f498b5b78f0e17ad2..7a5192cbadc3adda0876f30fffae63965cca8d1a 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -1312,21 +1312,21 @@ def do_whatis(self, arg): # _getval() already printed the error return code = None - # Is it a function? + # Is it an instance method? try: - code = value.__code__ + code = value.__func__.__code__ except Exception: pass if code: - self.message('Function %s' % code.co_name) + self.message('Method %s' % code.co_name) return - # Is it an instance method? + # Is it a function? try: - code = value.__func__.__code__ + code = value.__code__ except Exception: pass if code: - self.message('Method %s' % code.co_name) + self.message('Function %s' % code.co_name) return # Is it a class? if value.__class__ is type: @@ -1686,8 +1686,9 @@ def main(): sys.argv[:] = args # Hide "pdb.py" and pdb options from argument list - # Replace pdb's dir with script's dir in front of module search path. if not run_as_module: + mainpyfile = os.path.realpath(mainpyfile) + # Replace pdb's dir with script's dir in front of module search path. sys.path[0] = os.path.dirname(mainpyfile) # Note on saving/restoring sys.argv: it's a good idea when sys.argv was diff --git a/Lib/pickle.py b/Lib/pickle.py index af50a9b0c06bb017c5fad4b17e7f9c169e0779c9..e63a8b6e4dbb7006cc1383f43b26e61b3c90db79 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -13,7 +13,7 @@ dump(object, file) dumps(object) -> string load(file) -> object - loads(string) -> object + loads(bytes) -> object Misc variables: @@ -340,7 +340,9 @@ def whichmodule(obj, name): # Protect the iteration by using a list copy of sys.modules against dynamic # modules that trigger imports of other modules upon calls to getattr. for module_name, module in sys.modules.copy().items(): - if module_name == '__main__' or module is None: + if (module_name == '__main__' + or module_name == '__mp_main__' # bpo-42406 + or module is None): continue try: if _getattribute(module, name)[0] is obj: @@ -1604,17 +1606,29 @@ def load_dup(self): def load_get(self): i = int(self.readline()[:-1]) - self.append(self.memo[i]) + try: + self.append(self.memo[i]) + except KeyError: + msg = f'Memo value not found at index {i}' + raise UnpicklingError(msg) from None dispatch[GET[0]] = load_get def load_binget(self): i = self.read(1)[0] - self.append(self.memo[i]) + try: + self.append(self.memo[i]) + except KeyError as exc: + msg = f'Memo value not found at index {i}' + raise UnpicklingError(msg) from None dispatch[BINGET[0]] = load_binget def load_long_binget(self): i, = unpack('{_DOTTED_WORDS})(?P:(?P{_DOTTED_WORDS})?)?$', re.U) +del _DOTTED_WORDS + +def resolve_name(name): + """ + Resolve a name to an object. + + It is expected that `name` will be a string in one of the following + formats, where W is shorthand for a valid Python identifier and dot stands + for a literal period in these pseudo-regexes: + + W(.W)* + W(.W)*:(W(.W)*)? + + The first form is intended for backward compatibility only. It assumes that + some part of the dotted name is a package, and the rest is an object + somewhere within that package, possibly nested inside other objects. + Because the place where the package stops and the object hierarchy starts + can't be inferred by inspection, repeated attempts to import must be done + with this form. + + In the second form, the caller makes the division point clear through the + provision of a single colon: the dotted name to the left of the colon is a + package to be imported, and the dotted name to the right is the object + hierarchy within that package. Only one import is needed in this form. If + it ends with the colon, then a module object is returned. + + The function will return an object (which might be a module), or raise one + of the following exceptions: + + ValueError - if `name` isn't in a recognised format + ImportError - if an import failed when it shouldn't have + AttributeError - if a failure occurred when traversing the object hierarchy + within the imported package to get to the desired object) + """ + m = _NAME_PATTERN.match(name) + if not m: + raise ValueError(f'invalid format: {name!r}') + gd = m.groupdict() + if gd.get('cln'): + # there is a colon - a one-step import is all that's needed + mod = importlib.import_module(gd['pkg']) + parts = gd.get('obj') + parts = parts.split('.') if parts else [] + else: + # no colon - have to iterate to find the package boundary + parts = name.split('.') + modname = parts.pop(0) + # first part *must* be a module/package. + mod = importlib.import_module(modname) + while parts: + p = parts[0] + s = f'{modname}.{p}' + try: + mod = importlib.import_module(s) + parts.pop(0) + modname = s + except ImportError: + break + # if we reach this point, mod is the module, already imported, and + # parts is the list of parts in the object hierarchy to be traversed, or + # an empty list if just the module is wanted. + result = mod + for p in parts: + result = getattr(result, p) + return result diff --git a/Lib/platform.py b/Lib/platform.py index 994d892c5e6166921b05e9aeaee4d95c0a579c7a..6258827d0e41f80cd7096f65598734a0b7dd1574 100755 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -116,6 +116,9 @@ import os import re import sys +import subprocess +import functools +import itertools ### Globals & Constants @@ -600,22 +603,6 @@ def _follow_symlinks(filepath): os.path.join(os.path.dirname(filepath), os.readlink(filepath))) return filepath -def _syscmd_uname(option, default=''): - - """ Interface to the system's uname command. - """ - if sys.platform in ('dos', 'win32', 'win16'): - # XXX Others too ? - return default - - import subprocess - try: - output = subprocess.check_output(('uname', option), - stderr=subprocess.DEVNULL, - text=True) - except (OSError, subprocess.CalledProcessError): - return default - return (output.strip() or default) def _syscmd_file(target, default=''): @@ -736,13 +723,103 @@ def architecture(executable=sys.executable, bits='', linkage=''): return bits, linkage + +def _get_machine_win32(): + # Try to use the PROCESSOR_* environment variables + # available on Win XP and later; see + # http://support.microsoft.com/kb/888731 and + # http://www.geocities.com/rick_lively/MANUALS/ENV/MSWIN/PROCESSI.HTM + + # WOW64 processes mask the native architecture + return ( + os.environ.get('PROCESSOR_ARCHITEW6432', '') or + os.environ.get('PROCESSOR_ARCHITECTURE', '') + ) + + +class _Processor: + @classmethod + def get(cls): + func = getattr(cls, f'get_{sys.platform}', cls.from_subprocess) + return func() or '' + + def get_win32(): + return os.environ.get('PROCESSOR_IDENTIFIER', _get_machine_win32()) + + def get_OpenVMS(): + try: + import vms_lib + except ImportError: + pass + else: + csid, cpu_number = vms_lib.getsyi('SYI$_CPU', 0) + return 'Alpha' if cpu_number >= 128 else 'VAX' + + def from_subprocess(): + """ + Fall back to `uname -p` + """ + try: + return subprocess.check_output( + ['uname', '-p'], + stderr=subprocess.DEVNULL, + text=True, + ).strip() + except (OSError, subprocess.CalledProcessError): + pass + + +def _unknown_as_blank(val): + return '' if val == 'unknown' else val + + ### Portable uname() interface -uname_result = collections.namedtuple("uname_result", - "system node release version machine processor") +class uname_result( + collections.namedtuple( + "uname_result_base", + "system node release version machine") + ): + """ + A uname_result that's largely compatible with a + simple namedtuple except that 'processor' is + resolved late and cached to avoid calling "uname" + except when needed. + """ + + @functools.cached_property + def processor(self): + return _unknown_as_blank(_Processor.get()) + + def __iter__(self): + return itertools.chain( + super().__iter__(), + (self.processor,) + ) + + @classmethod + def _make(cls, iterable): + # override factory to affect length check + num_fields = len(cls._fields) + result = cls.__new__(cls, *iterable) + if len(result) != num_fields + 1: + msg = f'Expected {num_fields} arguments, got {len(result)}' + raise TypeError(msg) + return result + + def __getitem__(self, key): + return tuple(self)[key] + + def __len__(self): + return len(tuple(iter(self))) + + def __reduce__(self): + return uname_result, tuple(self)[:len(self._fields)] + _uname_cache = None + def uname(): """ Fairly portable uname interface. Returns a tuple @@ -756,52 +833,30 @@ def uname(): """ global _uname_cache - no_os_uname = 0 if _uname_cache is not None: return _uname_cache - processor = '' - # Get some infos from the builtin os.uname API... try: - system, node, release, version, machine = os.uname() + system, node, release, version, machine = infos = os.uname() except AttributeError: - no_os_uname = 1 - - if no_os_uname or not list(filter(None, (system, node, release, version, machine))): - # Hmm, no there is either no uname or uname has returned - #'unknowns'... we'll have to poke around the system then. - if no_os_uname: - system = sys.platform - release = '' - version = '' - node = _node() - machine = '' + system = sys.platform + node = _node() + release = version = machine = '' + infos = () - use_syscmd_ver = 1 + if not any(infos): + # uname is not available # Try win32_ver() on win32 platforms if system == 'win32': release, version, csd, ptype = win32_ver() - if release and version: - use_syscmd_ver = 0 - # Try to use the PROCESSOR_* environment variables - # available on Win XP and later; see - # http://support.microsoft.com/kb/888731 and - # http://www.geocities.com/rick_lively/MANUALS/ENV/MSWIN/PROCESSI.HTM - if not machine: - # WOW64 processes mask the native architecture - if "PROCESSOR_ARCHITEW6432" in os.environ: - machine = os.environ.get("PROCESSOR_ARCHITEW6432", '') - else: - machine = os.environ.get('PROCESSOR_ARCHITECTURE', '') - if not processor: - processor = os.environ.get('PROCESSOR_IDENTIFIER', machine) + machine = machine or _get_machine_win32() # Try the 'ver' system command available on some # platforms - if use_syscmd_ver: + if not (release and version): system, release, version = _syscmd_ver(system) # Normalize system to what win32_ver() normally returns # (_syscmd_ver() tends to return the vendor name as well) @@ -841,42 +896,15 @@ def uname(): if not release or release == '0': release = version version = '' - # Get processor information - try: - import vms_lib - except ImportError: - pass - else: - csid, cpu_number = vms_lib.getsyi('SYI$_CPU', 0) - if (cpu_number >= 128): - processor = 'Alpha' - else: - processor = 'VAX' - if not processor: - # Get processor information from the uname system command - processor = _syscmd_uname('-p', '') - - #If any unknowns still exist, replace them with ''s, which are more portable - if system == 'unknown': - system = '' - if node == 'unknown': - node = '' - if release == 'unknown': - release = '' - if version == 'unknown': - version = '' - if machine == 'unknown': - machine = '' - if processor == 'unknown': - processor = '' # normalize name if system == 'Microsoft' and release == 'Windows': system = 'Windows' release = 'Vista' - _uname_cache = uname_result(system, node, release, version, - machine, processor) + vals = system, node, release, version, machine + # Replace 'unknown' values with the more portable '' + _uname_cache = uname_result(*map(_unknown_as_blank, vals)) return _uname_cache ### Direct interfaces to some of the uname() return values @@ -1202,7 +1230,7 @@ def platform(aliased=0, terse=0): elif system in ('Linux',): # check for libc vs. glibc - libcname, libcversion = libc_ver(sys.executable) + libcname, libcversion = libc_ver() platform = _platform(system, release, machine, processor, 'with', libcname+libcversion) diff --git a/Lib/plistlib.py b/Lib/plistlib.py index 04f8a87634d354904f182dd6afc8e41d0d32cca3..2eeebe4c9a4244bc30dd411fa6f428afd37cc5e7 100644 --- a/Lib/plistlib.py +++ b/Lib/plistlib.py @@ -46,14 +46,11 @@ print(pl["aKey"]) """ __all__ = [ - "readPlist", "writePlist", "readPlistFromBytes", "writePlistToBytes", - "Data", "InvalidFileException", "FMT_XML", "FMT_BINARY", - "load", "dump", "loads", "dumps", "UID" + "InvalidFileException", "FMT_XML", "FMT_BINARY", "load", "dump", "loads", "dumps", "UID" ] import binascii import codecs -import contextlib import datetime import enum from io import BytesIO @@ -61,7 +58,6 @@ import os import re import struct -from warnings import warn from xml.parsers.expat import ParserCreate @@ -69,112 +65,6 @@ globals().update(PlistFormat.__members__) -# -# -# Deprecated functionality -# -# - - -@contextlib.contextmanager -def _maybe_open(pathOrFile, mode): - if isinstance(pathOrFile, str): - with open(pathOrFile, mode) as fp: - yield fp - - else: - yield pathOrFile - - -def readPlist(pathOrFile): - """ - Read a .plist from a path or file. pathOrFile should either - be a file name, or a readable binary file object. - - This function is deprecated, use load instead. - """ - warn("The readPlist function is deprecated, use load() instead", - DeprecationWarning, 2) - - with _maybe_open(pathOrFile, 'rb') as fp: - return load(fp, fmt=None, use_builtin_types=False) - -def writePlist(value, pathOrFile): - """ - Write 'value' to a .plist file. 'pathOrFile' may either be a - file name or a (writable) file object. - - This function is deprecated, use dump instead. - """ - warn("The writePlist function is deprecated, use dump() instead", - DeprecationWarning, 2) - with _maybe_open(pathOrFile, 'wb') as fp: - dump(value, fp, fmt=FMT_XML, sort_keys=True, skipkeys=False) - - -def readPlistFromBytes(data): - """ - Read a plist data from a bytes object. Return the root object. - - This function is deprecated, use loads instead. - """ - warn("The readPlistFromBytes function is deprecated, use loads() instead", - DeprecationWarning, 2) - return load(BytesIO(data), fmt=None, use_builtin_types=False) - - -def writePlistToBytes(value): - """ - Return 'value' as a plist-formatted bytes object. - - This function is deprecated, use dumps instead. - """ - warn("The writePlistToBytes function is deprecated, use dumps() instead", - DeprecationWarning, 2) - f = BytesIO() - dump(value, f, fmt=FMT_XML, sort_keys=True, skipkeys=False) - return f.getvalue() - - -class Data: - """ - Wrapper for binary data. - - This class is deprecated, use a bytes object instead. - """ - - def __init__(self, data): - if not isinstance(data, bytes): - raise TypeError("data must be as bytes") - self.data = data - - @classmethod - def fromBase64(cls, data): - # base64.decodebytes just calls binascii.a2b_base64; - # it seems overkill to use both base64 and binascii. - return cls(_decode_base64(data)) - - def asBase64(self, maxlinelength=76): - return _encode_base64(self.data, maxlinelength) - - def __eq__(self, other): - if isinstance(other, self.__class__): - return self.data == other.data - elif isinstance(other, bytes): - return self.data == other - else: - return NotImplemented - - def __repr__(self): - return "%s(%s)" % (self.__class__.__name__, repr(self.data)) - -# -# -# End of deprecated functionality -# -# - - class UID: def __init__(self, data): if not isinstance(data, int): @@ -202,7 +92,6 @@ def __eq__(self, other): def __hash__(self): return hash(self.data) - # # XML support # @@ -273,11 +162,10 @@ def _escape(text): return text class _PlistParser: - def __init__(self, use_builtin_types, dict_type): + def __init__(self, dict_type): self.stack = [] self.current_key = None self.root = None - self._use_builtin_types = use_builtin_types self._dict_type = dict_type def parse(self, fileobj): @@ -285,9 +173,16 @@ def parse(self, fileobj): self.parser.StartElementHandler = self.handle_begin_element self.parser.EndElementHandler = self.handle_end_element self.parser.CharacterDataHandler = self.handle_data + self.parser.EntityDeclHandler = self.handle_entity_decl self.parser.ParseFile(fileobj) return self.root + def handle_entity_decl(self, entity_name, is_parameter_entity, value, base, system_id, public_id, notation_name): + # Reject plist files with entity declarations to avoid XML vulnerabilies in expat. + # Regular plist files don't contain those declerations, and Apple's plutil tool does not + # accept them either. + raise InvalidFileException("XML entity declarations are not supported in plist files") + def handle_begin_element(self, element, attrs): self.data = [] handler = getattr(self, "begin_" + element, None) @@ -357,7 +252,11 @@ def end_false(self): self.add_object(False) def end_integer(self): - self.add_object(int(self.get_data())) + raw = self.get_data() + if raw.startswith('0x') or raw.startswith('0X'): + self.add_object(int(raw, 16)) + else: + self.add_object(int(raw)) def end_real(self): self.add_object(float(self.get_data())) @@ -366,11 +265,7 @@ def end_string(self): self.add_object(self.get_data()) def end_data(self): - if self._use_builtin_types: - self.add_object(_decode_base64(self.get_data())) - - else: - self.add_object(Data.fromBase64(self.get_data())) + self.add_object(_decode_base64(self.get_data())) def end_date(self): self.add_object(_date_from_string(self.get_data())) @@ -452,9 +347,6 @@ def write_value(self, value): elif isinstance(value, dict): self.write_dict(value) - elif isinstance(value, Data): - self.write_data(value) - elif isinstance(value, (bytes, bytearray)): self.write_bytes(value) @@ -467,9 +359,6 @@ def write_value(self, value): else: raise TypeError("unsupported type: %s" % type(value)) - def write_data(self, data): - self.write_bytes(data.data) - def write_bytes(self, data): self.begin_element("data") self._indent_level -= 1 @@ -563,8 +452,7 @@ class _BinaryPlistParser: see also: http://opensource.apple.com/source/CF/CF-744.18/CFBinaryPList.c """ - def __init__(self, use_builtin_types, dict_type): - self._use_builtin_types = use_builtin_types + def __init__(self, dict_type): self._dict_type = dict_type def parse(self, fp): @@ -589,7 +477,7 @@ def parse(self, fp): return self._read_object(top_object) except (OSError, IndexError, struct.error, OverflowError, - UnicodeDecodeError): + ValueError): raise InvalidFileException() def _get_size(self, tokenL): @@ -605,7 +493,7 @@ def _get_size(self, tokenL): def _read_ints(self, n, size): data = self._fp.read(size * n) if size in _BINARY_FORMAT: - return struct.unpack('>' + _BINARY_FORMAT[size] * n, data) + return struct.unpack(f'>{n}{_BINARY_FORMAT[size]}', data) else: if not size or len(data) != size * n: raise InvalidFileException() @@ -664,18 +552,23 @@ def _read_object(self, ref): elif tokenH == 0x40: # data s = self._get_size(tokenL) - if self._use_builtin_types: - result = self._fp.read(s) - else: - result = Data(self._fp.read(s)) + result = self._fp.read(s) + if len(result) != s: + raise InvalidFileException() elif tokenH == 0x50: # ascii string s = self._get_size(tokenL) - result = self._fp.read(s).decode('ascii') + data = self._fp.read(s) + if len(data) != s: + raise InvalidFileException() + result = data.decode('ascii') elif tokenH == 0x60: # unicode string - s = self._get_size(tokenL) - result = self._fp.read(s * 2).decode('utf-16be') + s = self._get_size(tokenL) * 2 + data = self._fp.read(s) + if len(data) != s: + raise InvalidFileException() + result = data.decode('utf-16be') elif tokenH == 0x80: # UID # used by Key-Archiver plist files @@ -700,9 +593,11 @@ def _read_object(self, ref): obj_refs = self._read_refs(s) result = self._dict_type() self._objects[ref] = result - for k, o in zip(key_refs, obj_refs): - result[self._read_object(k)] = self._read_object(o) - + try: + for k, o in zip(key_refs, obj_refs): + result[self._read_object(k)] = self._read_object(o) + except TypeError: + raise InvalidFileException() else: raise InvalidFileException() @@ -716,7 +611,7 @@ def _count_to_size(count): elif count < 1 << 16: return 2 - elif count << 1 << 32: + elif count < 1 << 32: return 4 else: @@ -783,10 +678,6 @@ def _flatten(self, value): if (type(value), value) in self._objtable: return - elif isinstance(value, Data): - if (type(value.data), value.data) in self._objtable: - return - elif id(value) in self._objidtable: return @@ -795,8 +686,6 @@ def _flatten(self, value): self._objlist.append(value) if isinstance(value, _scalars): self._objtable[(type(value), value)] = refnum - elif isinstance(value, Data): - self._objtable[(type(value.data), value.data)] = refnum else: self._objidtable[id(value)] = refnum @@ -826,8 +715,6 @@ def _flatten(self, value): def _getrefnum(self, value): if isinstance(value, _scalars): return self._objtable[(type(value), value)] - elif isinstance(value, Data): - return self._objtable[(type(value.data), value.data)] else: return self._objidtable[id(value)] @@ -885,10 +772,6 @@ def _write_object(self, value): f = (value - datetime.datetime(2001, 1, 1)).total_seconds() self._fp.write(struct.pack('>Bd', 0x33, f)) - elif isinstance(value, Data): - self._write_size(0x40, len(value.data)) - self._fp.write(value.data) - elif isinstance(value, (bytes, bytearray)): self._write_size(0x40, len(value)) self._fp.write(value) @@ -970,7 +853,7 @@ def _is_fmt_binary(header): } -def load(fp, *, fmt=None, use_builtin_types=True, dict_type=dict): +def load(fp, *, fmt=None, dict_type=dict): """Read a .plist file. 'fp' should be a readable and binary file object. Return the unpacked root object (which usually is a dictionary). """ @@ -988,17 +871,16 @@ def load(fp, *, fmt=None, use_builtin_types=True, dict_type=dict): else: P = _FORMATS[fmt]['parser'] - p = P(use_builtin_types=use_builtin_types, dict_type=dict_type) + p = P(dict_type=dict_type) return p.parse(fp) -def loads(value, *, fmt=None, use_builtin_types=True, dict_type=dict): +def loads(value, *, fmt=None, dict_type=dict): """Read a .plist file from a bytes object. Return the unpacked root object (which usually is a dictionary). """ fp = BytesIO(value) - return load( - fp, fmt=fmt, use_builtin_types=use_builtin_types, dict_type=dict_type) + return load(fp, fmt=fmt, dict_type=dict_type) def dump(value, fp, *, fmt=FMT_XML, sort_keys=True, skipkeys=False): diff --git a/Lib/poplib.py b/Lib/poplib.py index e3bd2ab1ebc8bd2b08da1631993d344d3e8b5cc1..0f8587317c2bbc4c37c79b9112ffc281c67bcebd 100644 --- a/Lib/poplib.py +++ b/Lib/poplib.py @@ -107,6 +107,8 @@ def __init__(self, host, port=POP3_PORT, self.welcome = self._getresp() def _create_socket(self, timeout): + if timeout is not None and not timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') return socket.create_connection((self.host, self.port), timeout) def _putline(self, line): @@ -385,7 +387,7 @@ def _parsecap(line): for capline in rawcaps: capnm, capargs = _parsecap(capline) caps[capnm] = capargs - except error_proto as _err: + except error_proto: raise error_proto('-ERR CAPA not supported by server') return caps diff --git a/Lib/pprint.py b/Lib/pprint.py index 4bfcc31b25ea8e830f4675ae5aef43ad641f2bfa..7c1118a484b268fee26760fc0ca1ec76a533f52a 100644 --- a/Lib/pprint.py +++ b/Lib/pprint.py @@ -342,6 +342,33 @@ def _pprint_mappingproxy(self, object, stream, indent, allowance, context, level _dispatch[_types.MappingProxyType.__repr__] = _pprint_mappingproxy + def _pprint_simplenamespace(self, object, stream, indent, allowance, context, level): + if type(object) is _types.SimpleNamespace: + # The SimpleNamespace repr is "namespace" instead of the class + # name, so we do the same here. For subclasses; use the class name. + cls_name = 'namespace' + else: + cls_name = object.__class__.__name__ + indent += len(cls_name) + 1 + delimnl = ',\n' + ' ' * indent + items = object.__dict__.items() + last_index = len(items) - 1 + + stream.write(cls_name + '(') + for i, (key, ent) in enumerate(items): + stream.write(key) + stream.write('=') + + last = i == last_index + self._format(ent, stream, indent + len(key) + 1, + allowance if last else 1, + context, level) + if not last: + stream.write(delimnl) + stream.write(')') + + _dispatch[_types.SimpleNamespace.__repr__] = _pprint_simplenamespace + def _format_dict_items(self, items, stream, indent, allowance, context, level): write = stream.write diff --git a/Lib/profile.py b/Lib/profile.py index 1346297c04a5931d133fe305b48ca7dfde89b51d..d8599fb4eebd66f2e15020b7b0a637b5140dc5f8 100755 --- a/Lib/profile.py +++ b/Lib/profile.py @@ -425,29 +425,13 @@ def runctx(self, cmd, globals, locals): return self # This method is more useful to profile a single function call. - def runcall(*args, **kw): - if len(args) >= 2: - self, func, *args = args - elif not args: - raise TypeError("descriptor 'runcall' of 'Profile' object " - "needs an argument") - elif 'func' in kw: - func = kw.pop('func') - self, *args = args - import warnings - warnings.warn("Passing 'func' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('runcall expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - + def runcall(self, func, /, *args, **kw): self.set_cmd(repr(func)) sys.setprofile(self.dispatcher) try: return func(*args, **kw) finally: sys.setprofile(None) - runcall.__text_signature__ = '($self, func, /, *args, **kw)' #****************************************************************** @@ -587,6 +571,11 @@ def main(): (options, args) = parser.parse_args() sys.argv[:] = args + # The script that we're profiling may chdir, so capture the absolute path + # to the output file at startup. + if options.outfile is not None: + options.outfile = os.path.abspath(options.outfile) + if len(args) > 0: if options.module: import runpy @@ -606,7 +595,12 @@ def main(): '__package__': None, '__cached__': None, } - runctx(code, globs, None, options.outfile, options.sort) + try: + runctx(code, globs, None, options.outfile, options.sort) + except BrokenPipeError as exc: + # Prevent "Exception ignored" during interpreter shutdown. + sys.stdout = None + sys.exit(exc.errno) else: parser.print_usage() return parser diff --git a/Lib/pstats.py b/Lib/pstats.py index 4b419a8ecdb6c785fb630d4e2ef208e60ab27a1c..0f93ae02c95074dfd6bddff780474d11c28a654c 100644 --- a/Lib/pstats.py +++ b/Lib/pstats.py @@ -25,11 +25,13 @@ import time import marshal import re + from enum import Enum from functools import cmp_to_key +from dataclasses import dataclass +from typing import Dict -__all__ = ["Stats", "SortKey"] - +__all__ = ["Stats", "SortKey", "FunctionProfile", "StatsProfile"] class SortKey(str, Enum): CALLS = 'calls', 'ncalls' @@ -43,15 +45,31 @@ class SortKey(str, Enum): TIME = 'time', 'tottime' def __new__(cls, *values): - obj = str.__new__(cls) - - obj._value_ = values[0] + value = values[0] + obj = str.__new__(cls, value) + obj._value_ = value for other_value in values[1:]: cls._value2member_map_[other_value] = obj obj._all_values = values return obj +@dataclass(unsafe_hash=True) +class FunctionProfile: + ncalls: int + tottime: float + percall_tottime: float + cumtime: float + percall_cumtime: float + file_name: str + line_number: int + +@dataclass(unsafe_hash=True) +class StatsProfile: + '''Class for keeping track of an item in inventory.''' + total_tt: float + func_profiles: Dict[str, FunctionProfile] + class Stats: """This class is used for creating reports from data generated by the Profile class. It is a "friend" of that class, and imports data either @@ -333,6 +351,41 @@ def eval_print_amount(self, sel, list, msg): return new_list, msg + def get_stats_profile(self): + """This method returns an instance of StatsProfile, which contains a mapping + of function names to instances of FunctionProfile. Each FunctionProfile + instance holds information related to the function's profile such as how + long the function took to run, how many times it was called, etc... + """ + func_list = self.fcn_list[:] if self.fcn_list else list(self.stats.keys()) + if not func_list: + return StatsProfile(0, {}) + + total_tt = float(f8(self.total_tt)) + func_profiles = {} + stats_profile = StatsProfile(total_tt, func_profiles) + + for func in func_list: + cc, nc, tt, ct, callers = self.stats[func] + file_name, line_number, func_name = func + ncalls = str(nc) if nc == cc else (str(nc) + '/' + str(cc)) + tottime = float(f8(tt)) + percall_tottime = -1 if nc == 0 else float(f8(tt/nc)) + cumtime = float(f8(ct)) + percall_cumtime = -1 if cc == 0 else float(f8(ct/cc)) + func_profile = FunctionProfile( + ncalls, + tottime, # time spent in this function alone + percall_tottime, + cumtime, # time spent in the function plus all functions that this function called, + percall_cumtime, + file_name, + line_number + ) + func_profiles[func_name] = func_profile + + return stats_profile + def get_print_list(self, sel_list): width = self.max_name_len if self.fcn_list: diff --git a/Lib/py_compile.py b/Lib/py_compile.py index 21736896afc21bfd0d36cf23df7bcf21718829e3..a81f4937310bf81b7e9da68dd7c669dad85b9019 100644 --- a/Lib/py_compile.py +++ b/Lib/py_compile.py @@ -197,12 +197,10 @@ def main(args=None): compile(filename, doraise=True) except PyCompileError as error: rv = 1 - if quiet < 2: - sys.stderr.write("%s\n" % error.msg) + sys.stderr.write("%s\n" % error.msg) except OSError as error: rv = 1 - if quiet < 2: - sys.stderr.write("%s\n" % error) + sys.stderr.write("%s\n" % error) else: for filename in args: try: @@ -210,8 +208,7 @@ def main(args=None): except PyCompileError as error: # return value to indicate at least one failure rv = 1 - if quiet < 2: - sys.stderr.write("%s\n" % error.msg) + sys.stderr.write("%s\n" % error.msg) return rv if __name__ == "__main__": diff --git a/Lib/pydoc.py b/Lib/pydoc.py index dc3377d68f8caa4e6ddb31c77465791e0fe891b4..35ef3ebdc688e61277125a587aeafb7c347a6756 100644 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -90,9 +90,101 @@ def pathdirs(): normdirs.append(normdir) return dirs +def _findclass(func): + cls = sys.modules.get(func.__module__) + if cls is None: + return None + for name in func.__qualname__.split('.')[:-1]: + cls = getattr(cls, name) + if not inspect.isclass(cls): + return None + return cls + +def _finddoc(obj): + if inspect.ismethod(obj): + name = obj.__func__.__name__ + self = obj.__self__ + if (inspect.isclass(self) and + getattr(getattr(self, name, None), '__func__') is obj.__func__): + # classmethod + cls = self + else: + cls = self.__class__ + elif inspect.isfunction(obj): + name = obj.__name__ + cls = _findclass(obj) + if cls is None or getattr(cls, name) is not obj: + return None + elif inspect.isbuiltin(obj): + name = obj.__name__ + self = obj.__self__ + if (inspect.isclass(self) and + self.__qualname__ + '.' + name == obj.__qualname__): + # classmethod + cls = self + else: + cls = self.__class__ + # Should be tested before isdatadescriptor(). + elif isinstance(obj, property): + func = obj.fget + name = func.__name__ + cls = _findclass(func) + if cls is None or getattr(cls, name) is not obj: + return None + elif inspect.ismethoddescriptor(obj) or inspect.isdatadescriptor(obj): + name = obj.__name__ + cls = obj.__objclass__ + if getattr(cls, name) is not obj: + return None + if inspect.ismemberdescriptor(obj): + slots = getattr(cls, '__slots__', None) + if isinstance(slots, dict) and name in slots: + return slots[name] + else: + return None + for base in cls.__mro__: + try: + doc = _getowndoc(getattr(base, name)) + except AttributeError: + continue + if doc is not None: + return doc + return None + +def _getowndoc(obj): + """Get the documentation string for an object if it is not + inherited from its class.""" + try: + doc = object.__getattribute__(obj, '__doc__') + if doc is None: + return None + if obj is not type: + typedoc = type(obj).__doc__ + if isinstance(typedoc, str) and typedoc == doc: + return None + return doc + except AttributeError: + return None + +def _getdoc(object): + """Get the documentation string for an object. + + All tabs are expanded to spaces. To clean up docstrings that are + indented to line up with blocks of code, any whitespace than can be + uniformly removed from the second line onwards is removed.""" + doc = _getowndoc(object) + if doc is None: + try: + doc = _finddoc(object) + except (AttributeError, TypeError): + return None + if not isinstance(doc, str): + return None + return inspect.cleandoc(doc) + def getdoc(object): """Get the doc string or comments for an object.""" - result = inspect.getdoc(object) or inspect.getcomments(object) + result = _getdoc(object) or inspect.getcomments(object) return result and re.sub('^ *\n', '', result.rstrip()) or '' def splitdoc(doc): @@ -584,7 +676,7 @@ def markup(self, text, escape=None, funcs={}, classes={}, methods={}): escape = escape or self.escape results = [] here = 0 - pattern = re.compile(r'\b((http|ftp)://\S+[\w/]|' + pattern = re.compile(r'\b((http|https|ftp)://\S+[\w/]|' r'RFC[- ]?(\d+)|' r'PEP[- ]?(\d+)|' r'(self\.)?(\w+))') @@ -825,11 +917,8 @@ def spilldata(msg, attrs, predicate): push(msg) for name, kind, homecls, value in ok: base = self.docother(getattr(object, name), name, mod) - if callable(value) or inspect.isdatadescriptor(value): - doc = getattr(value, "__doc__", None) - else: - doc = None - if doc is None: + doc = getdoc(value) + if not doc: push('
    %s
    \n' % base) else: doc = self.markup(getdoc(value), self.preformat, @@ -1309,10 +1398,7 @@ def spilldata(msg, attrs, predicate): hr.maybe() push(msg) for name, kind, homecls, value in ok: - if callable(value) or inspect.isdatadescriptor(value): - doc = getdoc(value) - else: - doc = None + doc = getdoc(value) try: obj = getattr(object, name) except AttributeError: @@ -1448,8 +1534,10 @@ def docother(self, object, name=None, mod=None, parent=None, maxlen=None, doc=No chop = maxlen - len(line) if chop < 0: repr = repr[:chop] + '...' line = (name and self.bold(name) + ' = ' or '') + repr - if doc is not None: - line += '\n' + self.indent(str(doc)) + if not doc: + doc = getdoc(object) + if doc: + line += '\n' + self.indent(str(doc)) + '\n' return line class _PlainTextDoc(TextDoc): @@ -1672,11 +1760,15 @@ def render_doc(thing, title='Python Library Documentation: %s', forceload=0, if not (inspect.ismodule(object) or inspect.isclass(object) or inspect.isroutine(object) or - inspect.isdatadescriptor(object)): + inspect.isdatadescriptor(object) or + _getdoc(object)): # If the passed object is a piece of data or an instance, # document its available methods instead of its value. - object = type(object) - desc += ' object' + if hasattr(object, '__origin__'): + object = object.__origin__ + else: + object = type(object) + desc += ' object' return title % desc + '\n\n' + renderer.document(object, name) def doc(thing, title='Python Library Documentation: %s', forceload=0, @@ -1725,6 +1817,7 @@ class Helper: 'False': '', 'None': '', 'True': '', + '__peg_parser__': '', 'and': 'BOOLEAN', 'as': 'with', 'assert': ('assert', ''), diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py index 68346572bc3ee0aa49fe4b4a519a1e493690ac1d..ae896c2e5afd6e2d71eda1580310825a7cab06c3 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Mon Jul 20 14:14:54 2020 +# Autogenerated by Sphinx on Fri Feb 19 13:29:38 2021 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -99,27 +99,26 @@ 'assigned,\n' ' from left to right, to the corresponding targets.\n' '\n' - ' * If the target list contains one target prefixed with an\n' - ' asterisk, called a “starred” target: The object must be ' - 'an\n' - ' iterable with at least as many items as there are targets ' - 'in the\n' - ' target list, minus one. The first items of the iterable ' - 'are\n' - ' assigned, from left to right, to the targets before the ' + ' * If the target list contains one target prefixed with an ' + 'asterisk,\n' + ' called a “starred” target: The object must be an iterable ' + 'with at\n' + ' least as many items as there are targets in the target ' + 'list, minus\n' + ' one. The first items of the iterable are assigned, from ' + 'left to\n' + ' right, to the targets before the starred target. The ' + 'final items\n' + ' of the iterable are assigned to the targets after the ' 'starred\n' - ' target. The final items of the iterable are assigned to ' - 'the\n' - ' targets after the starred target. A list of the remaining ' - 'items\n' - ' in the iterable is then assigned to the starred target ' - '(the list\n' - ' can be empty).\n' + ' target. A list of the remaining items in the iterable is ' + 'then\n' + ' assigned to the starred target (the list can be empty).\n' '\n' ' * Else: The object must be an iterable with the same number ' - 'of\n' - ' items as there are targets in the target list, and the ' - 'items are\n' + 'of items\n' + ' as there are targets in the target list, and the items ' + 'are\n' ' assigned, from left to right, to the corresponding ' 'targets.\n' '\n' @@ -135,10 +134,10 @@ 'in the\n' ' current local namespace.\n' '\n' - ' * Otherwise: the name is bound to the object in the global\n' - ' namespace or the outer namespace determined by ' - '"nonlocal",\n' - ' respectively.\n' + ' * Otherwise: the name is bound to the object in the global ' + 'namespace\n' + ' or the outer namespace determined by "nonlocal", ' + 'respectively.\n' '\n' ' The name is rebound if it was already bound. This may cause ' 'the\n' @@ -225,26 +224,27 @@ 'called with\n' ' appropriate arguments.\n' '\n' - '* If the target is a slicing: The primary expression in the\n' - ' reference is evaluated. It should yield a mutable sequence ' - 'object\n' - ' (such as a list). The assigned object should be a sequence ' - 'object\n' - ' of the same type. Next, the lower and upper bound ' - 'expressions are\n' - ' evaluated, insofar they are present; defaults are zero and ' - 'the\n' - ' sequence’s length. The bounds should evaluate to integers. ' - 'If\n' - ' either bound is negative, the sequence’s length is added to ' - 'it. The\n' - ' resulting bounds are clipped to lie between zero and the ' + '* If the target is a slicing: The primary expression in the ' + 'reference\n' + ' is evaluated. It should yield a mutable sequence object ' + '(such as a\n' + ' list). The assigned object should be a sequence object of ' + 'the same\n' + ' type. Next, the lower and upper bound expressions are ' + 'evaluated,\n' + ' insofar they are present; defaults are zero and the ' 'sequence’s\n' - ' length, inclusive. Finally, the sequence object is asked to ' - 'replace\n' - ' the slice with the items of the assigned sequence. The ' - 'length of\n' - ' the slice may be different from the length of the assigned ' + ' length. The bounds should evaluate to integers. If either ' + 'bound is\n' + ' negative, the sequence’s length is added to it. The ' + 'resulting\n' + ' bounds are clipped to lie between zero and the sequence’s ' + 'length,\n' + ' inclusive. Finally, the sequence object is asked to replace ' + 'the\n' + ' slice with the items of the assigned sequence. The length ' + 'of the\n' + ' slice may be different from the length of the assigned ' 'sequence,\n' ' thus changing the length of the target sequence, if the ' 'target\n' @@ -459,13 +459,12 @@ '\n' ' async_for_stmt ::= "async" for_stmt\n' '\n' - 'An *asynchronous iterable* is able to call asynchronous code in ' - 'its\n' - '*iter* implementation, and *asynchronous iterator* can call\n' - 'asynchronous code in its *next* method.\n' + 'An *asynchronous iterable* provides an "__aiter__" method that\n' + 'directly returns an *asynchronous iterator*, which can call\n' + 'asynchronous code in its "__anext__" method.\n' '\n' 'The "async for" statement allows convenient iteration over\n' - 'asynchronous iterators.\n' + 'asynchronous iterables.\n' '\n' 'The following code:\n' '\n' @@ -514,8 +513,8 @@ 'is semantically equivalent to:\n' '\n' ' manager = (EXPRESSION)\n' - ' aexit = type(manager).__aexit__\n' ' aenter = type(manager).__aenter__\n' + ' aexit = type(manager).__aexit__\n' ' value = await aenter(manager)\n' ' hit_except = False\n' '\n' @@ -544,13 +543,17 @@ '\n' '-[ Footnotes ]-\n' '\n' - '[1] The exception is propagated to the invocation stack unless\n' - ' there is a "finally" clause which happens to raise another\n' - ' exception. That new exception causes the old one to be lost.\n' + '[1] The exception is propagated to the invocation stack unless ' + 'there\n' + ' is a "finally" clause which happens to raise another ' + 'exception.\n' + ' That new exception causes the old one to be lost.\n' '\n' - '[2] A string literal appearing as the first statement in the\n' - ' function body is transformed into the function’s "__doc__"\n' - ' attribute and therefore the function’s *docstring*.\n' + '[2] A string literal appearing as the first statement in the ' + 'function\n' + ' body is transformed into the function’s "__doc__" attribute ' + 'and\n' + ' therefore the function’s *docstring*.\n' '\n' '[3] A string literal appearing as the first statement in the class\n' ' body is transformed into the namespace’s "__doc__" item and\n' @@ -688,11 +691,18 @@ 'needs, for\n' ' example, "object.__getattribute__(self, name)".\n' '\n' - ' Note: This method may still be bypassed when looking ' - 'up special\n' - ' methods as the result of implicit invocation via ' - 'language syntax\n' - ' or built-in functions. See Special method lookup.\n' + ' Note:\n' + '\n' + ' This method may still be bypassed when looking up ' + 'special methods\n' + ' as the result of implicit invocation via language ' + 'syntax or\n' + ' built-in functions. See Special method lookup.\n' + '\n' + ' For certain sensitive attribute accesses, raises an ' + 'auditing event\n' + ' "object.__getattr__" with arguments "obj" and ' + '"name".\n' '\n' 'object.__setattr__(self, name, value)\n' '\n' @@ -710,6 +720,11 @@ 'for example,\n' ' "object.__setattr__(self, name, value)".\n' '\n' + ' For certain sensitive attribute assignments, raises ' + 'an auditing\n' + ' event "object.__setattr__" with arguments "obj", ' + '"name", "value".\n' + '\n' 'object.__delattr__(self, name)\n' '\n' ' Like "__setattr__()" but for attribute deletion ' @@ -718,6 +733,11 @@ 'obj.name" is\n' ' meaningful for the object.\n' '\n' + ' For certain sensitive attribute deletions, raises an ' + 'auditing event\n' + ' "object.__delattr__" with arguments "obj" and ' + '"name".\n' + '\n' 'object.__dir__(self)\n' '\n' ' Called when "dir()" is called on the object. A ' @@ -776,15 +796,16 @@ '\n' ' sys.modules[__name__].__class__ = VerboseModule\n' '\n' - 'Note: Defining module "__getattr__" and setting module ' - '"__class__"\n' - ' only affect lookups made using the attribute access ' - 'syntax –\n' - ' directly accessing the module globals (whether by code ' - 'within the\n' - ' module, or via a reference to the module’s globals ' - 'dictionary) is\n' - ' unaffected.\n' + 'Note:\n' + '\n' + ' Defining module "__getattr__" and setting module ' + '"__class__" only\n' + ' affect lookups made using the attribute access syntax ' + '– directly\n' + ' accessing the module globals (whether by code within ' + 'the module, or\n' + ' via a reference to the module’s globals dictionary) is ' + 'unaffected.\n' '\n' 'Changed in version 3.5: "__class__" module attribute is ' 'now writable.\n' @@ -867,12 +888,14 @@ 'created. The\n' ' descriptor has been assigned to *name*.\n' '\n' - ' Note: "__set_name__()" is only called implicitly as ' - 'part of the\n' - ' "type" constructor, so it will need to be called ' - 'explicitly with\n' - ' the appropriate parameters when a descriptor is ' - 'added to a class\n' + ' Note:\n' + '\n' + ' "__set_name__()" is only called implicitly as part ' + 'of the "type"\n' + ' constructor, so it will need to be called ' + 'explicitly with the\n' + ' appropriate parameters when a descriptor is added ' + 'to a class\n' ' after initial creation:\n' '\n' ' class A:\n' @@ -979,12 +1002,13 @@ 'define both\n' '"__get__()" and "__set__()", while non-data descriptors ' 'have just the\n' - '"__get__()" method. Data descriptors with "__set__()" ' - 'and "__get__()"\n' - 'defined always override a redefinition in an instance ' - 'dictionary. In\n' - 'contrast, non-data descriptors can be overridden by ' - 'instances.\n' + '"__get__()" method. Data descriptors with "__get__()" ' + 'and "__set__()"\n' + '(and/or "__delete__()") defined always override a ' + 'redefinition in an\n' + 'instance dictionary. In contrast, non-data descriptors ' + 'can be\n' + 'overridden by instances.\n' '\n' 'Python methods (including "staticmethod()" and ' '"classmethod()") are\n' @@ -1032,10 +1056,9 @@ '--------------------------\n' '\n' '* When inheriting from a class without *__slots__*, the ' - '*__dict__*\n' - ' and *__weakref__* attribute of the instances will ' - 'always be\n' - ' accessible.\n' + '*__dict__* and\n' + ' *__weakref__* attribute of the instances will always ' + 'be accessible.\n' '\n' '* Without a *__dict__* variable, instances cannot be ' 'assigned new\n' @@ -1050,14 +1073,12 @@ ' declaration.\n' '\n' '* Without a *__weakref__* variable for each instance, ' - 'classes\n' - ' defining *__slots__* do not support weak references to ' - 'its\n' - ' instances. If weak reference support is needed, then ' - 'add\n' - ' "\'__weakref__\'" to the sequence of strings in the ' - '*__slots__*\n' - ' declaration.\n' + 'classes defining\n' + ' *__slots__* do not support weak references to its ' + 'instances. If weak\n' + ' reference support is needed, then add ' + '"\'__weakref__\'" to the\n' + ' sequence of strings in the *__slots__* declaration.\n' '\n' '* *__slots__* are implemented at the class level by ' 'creating\n' @@ -1070,24 +1091,23 @@ ' attribute would overwrite the descriptor assignment.\n' '\n' '* The action of a *__slots__* declaration is not limited ' - 'to the\n' - ' class where it is defined. *__slots__* declared in ' - 'parents are\n' - ' available in child classes. However, child subclasses ' - 'will get a\n' - ' *__dict__* and *__weakref__* unless they also define ' - '*__slots__*\n' - ' (which should only contain names of any *additional* ' - 'slots).\n' + 'to the class\n' + ' where it is defined. *__slots__* declared in parents ' + 'are available\n' + ' in child classes. However, child subclasses will get a ' + '*__dict__*\n' + ' and *__weakref__* unless they also define *__slots__* ' + '(which should\n' + ' only contain names of any *additional* slots).\n' '\n' '* If a class defines a slot also defined in a base ' - 'class, the\n' - ' instance variable defined by the base class slot is ' - 'inaccessible\n' - ' (except by retrieving its descriptor directly from the ' - 'base class).\n' - ' This renders the meaning of the program undefined. In ' - 'the future, a\n' + 'class, the instance\n' + ' variable defined by the base class slot is ' + 'inaccessible (except by\n' + ' retrieving its descriptor directly from the base ' + 'class). This\n' + ' renders the meaning of the program undefined. In the ' + 'future, a\n' ' check may be added to prevent this.\n' '\n' '* Nonempty *__slots__* does not work for classes derived ' @@ -1096,9 +1116,9 @@ '"bytes" and "tuple".\n' '\n' '* Any non-string iterable may be assigned to ' - '*__slots__*. Mappings\n' - ' may also be used; however, in the future, special ' - 'meaning may be\n' + '*__slots__*. Mappings may\n' + ' also be used; however, in the future, special meaning ' + 'may be\n' ' assigned to the values corresponding to each key.\n' '\n' '* *__class__* assignment works only if both classes have ' @@ -1114,9 +1134,9 @@ ' raise "TypeError".\n' '\n' '* If an iterator is used for *__slots__* then a ' - 'descriptor is\n' - ' created for each of the iterator’s values. However, ' - 'the *__slots__*\n' + 'descriptor is created\n' + ' for each of the iterator’s values. However, the ' + '*__slots__*\n' ' attribute will be an empty iterator.\n', 'attribute-references': 'Attribute references\n' '********************\n' @@ -1458,8 +1478,8 @@ '\n' ' Called when the instance is “called” as a function; if ' 'this method\n' - ' is defined, "x(arg1, arg2, ...)" is a shorthand for\n' - ' "x.__call__(arg1, arg2, ...)".\n', + ' is defined, "x(arg1, arg2, ...)" roughly translates to\n' + ' "type(x).__call__(x, arg1, ...)".\n', 'calls': 'Calls\n' '*****\n' '\n' @@ -1716,6 +1736,10 @@ 'for\n' 'function decorators. The result is then bound to the class name.\n' '\n' + 'Changed in version 3.9: Classes may be decorated with any valid\n' + '"assignment_expression". Previously, the grammar was much more\n' + 'restrictive; see **PEP 614** for details.\n' + '\n' '**Programmer’s note:** Variables defined in the class definition ' 'are\n' 'class attributes; they are shared by instances. Instance ' @@ -1877,10 +1901,10 @@ ' != x" is true. This behavior is compliant with IEEE 754.\n' '\n' '* "None" and "NotImplemented" are singletons. **PEP 8** ' - 'advises\n' - ' that comparisons for singletons should always be done with ' - '"is" or\n' - ' "is not", never the equality operators.\n' + 'advises that\n' + ' comparisons for singletons should always be done with "is" ' + 'or "is\n' + ' not", never the equality operators.\n' '\n' '* Binary sequences (instances of "bytes" or "bytearray") can ' 'be\n' @@ -1896,15 +1920,15 @@ '\n' ' Strings and binary sequences cannot be directly compared.\n' '\n' - '* Sequences (instances of "tuple", "list", or "range") can ' - 'be\n' - ' compared only within each of their types, with the ' - 'restriction that\n' - ' ranges do not support order comparison. Equality ' - 'comparison across\n' - ' these types results in inequality, and ordering comparison ' - 'across\n' - ' these types raises "TypeError".\n' + '* Sequences (instances of "tuple", "list", or "range") can be ' + 'compared\n' + ' only within each of their types, with the restriction that ' + 'ranges do\n' + ' not support order comparison. Equality comparison across ' + 'these\n' + ' types results in inequality, and ordering comparison across ' + 'these\n' + ' types raises "TypeError".\n' '\n' ' Sequences compare lexicographically using comparison of\n' ' corresponding elements. The built-in containers typically ' @@ -1928,8 +1952,8 @@ ' false because the type is not the same).\n' '\n' ' * Collections that support order comparison are ordered the ' - 'same\n' - ' as their first unequal elements (for example, "[1,2,x] <= ' + 'same as\n' + ' their first unequal elements (for example, "[1,2,x] <= ' '[1,2,y]"\n' ' has the same value as "x <= y"). If a corresponding ' 'element does\n' @@ -1947,8 +1971,8 @@ '"TypeError".\n' '\n' '* Sets (instances of "set" or "frozenset") can be compared ' - 'within\n' - ' and across their types.\n' + 'within and\n' + ' across their types.\n' '\n' ' They define order comparison operators to mean subset and ' 'superset\n' @@ -1967,8 +1991,8 @@ ' Comparison of sets enforces reflexivity of its elements.\n' '\n' '* Most other built-in types have no comparison methods ' - 'implemented,\n' - ' so they inherit the default comparison behavior.\n' + 'implemented, so\n' + ' they inherit the default comparison behavior.\n' '\n' 'User-defined classes that customize their comparison behavior ' 'should\n' @@ -2017,10 +2041,10 @@ ' "total_ordering()" decorator.\n' '\n' '* The "hash()" result should be consistent with equality. ' - 'Objects\n' - ' that are equal should either have the same hash value, or ' - 'be marked\n' - ' as unhashable.\n' + 'Objects that\n' + ' are equal should either have the same hash value, or be ' + 'marked as\n' + ' unhashable.\n' '\n' 'Python does not enforce these consistency rules. In fact, ' 'the\n' @@ -2294,10 +2318,11 @@ ':= a to b do"; e.g., "list(range(3))" returns the list "[0, 1, ' '2]".\n' '\n' - 'Note: There is a subtlety when the sequence is being modified by ' - 'the\n' - ' loop (this can only occur for mutable sequences, e.g. lists). ' - 'An\n' + 'Note:\n' + '\n' + ' There is a subtlety when the sequence is being modified by the ' + 'loop\n' + ' (this can only occur for mutable sequences, e.g. lists). An\n' ' internal counter is used to keep track of which item is used ' 'next,\n' ' and this is incremented on each iteration. When this counter ' @@ -2355,8 +2380,9 @@ 'compatible\n' 'with an exception if it is the class or a base class of the ' 'exception\n' - 'object or a tuple containing an item compatible with the ' - 'exception.\n' + 'object, or a tuple containing an item that is the class or a ' + 'base\n' + 'class of the exception object.\n' '\n' 'If no except clause matches the exception, the search for an ' 'exception\n' @@ -2520,8 +2546,8 @@ 'follows:\n' '\n' '1. The context expression (the expression given in the ' - '"with_item")\n' - ' is evaluated to obtain a context manager.\n' + '"with_item") is\n' + ' evaluated to obtain a context manager.\n' '\n' '2. The context manager’s "__enter__()" is loaded for later use.\n' '\n' @@ -2529,13 +2555,15 @@ '\n' '4. The context manager’s "__enter__()" method is invoked.\n' '\n' - '5. If a target was included in the "with" statement, the return\n' - ' value from "__enter__()" is assigned to it.\n' + '5. If a target was included in the "with" statement, the return ' + 'value\n' + ' from "__enter__()" is assigned to it.\n' + '\n' + ' Note:\n' '\n' - ' Note: The "with" statement guarantees that if the ' - '"__enter__()"\n' - ' method returns without an error, then "__exit__()" will ' - 'always be\n' + ' The "with" statement guarantees that if the "__enter__()" ' + 'method\n' + ' returns without an error, then "__exit__()" will always be\n' ' called. Thus, if an error occurs during the assignment to ' 'the\n' ' target list, it will be treated the same as an error ' @@ -2625,8 +2653,8 @@ '[parameter_list] ")"\n' ' ["->" expression] ":" suite\n' ' decorators ::= decorator+\n' - ' decorator ::= "@" dotted_name ["(" ' - '[argument_list [","]] ")"] NEWLINE\n' + ' decorator ::= "@" assignment_expression ' + 'NEWLINE\n' ' dotted_name ::= identifier ("." identifier)*\n' ' parameter_list ::= defparameter ("," ' 'defparameter)* "," "/" ["," [parameter_list_no_posonly]]\n' @@ -2680,6 +2708,11 @@ 'the name\n' '"func".\n' '\n' + 'Changed in version 3.9: Functions may be decorated with any ' + 'valid\n' + '"assignment_expression". Previously, the grammar was much more\n' + 'restrictive; see **PEP 614** for details.\n' + '\n' 'When one or more *parameters* have the form *parameter* "="\n' '*expression*, the function is said to have “default parameter ' 'values.”\n' @@ -2881,6 +2914,10 @@ 'function decorators. The result is then bound to the class ' 'name.\n' '\n' + 'Changed in version 3.9: Classes may be decorated with any valid\n' + '"assignment_expression". Previously, the grammar was much more\n' + 'restrictive; see **PEP 614** for details.\n' + '\n' '**Programmer’s note:** Variables defined in the class definition ' 'are\n' 'class attributes; they are shared by instances. Instance ' @@ -2954,13 +2991,12 @@ '\n' ' async_for_stmt ::= "async" for_stmt\n' '\n' - 'An *asynchronous iterable* is able to call asynchronous code in ' - 'its\n' - '*iter* implementation, and *asynchronous iterator* can call\n' - 'asynchronous code in its *next* method.\n' + 'An *asynchronous iterable* provides an "__aiter__" method that\n' + 'directly returns an *asynchronous iterator*, which can call\n' + 'asynchronous code in its "__anext__" method.\n' '\n' 'The "async for" statement allows convenient iteration over\n' - 'asynchronous iterators.\n' + 'asynchronous iterables.\n' '\n' 'The following code:\n' '\n' @@ -3009,8 +3045,8 @@ 'is semantically equivalent to:\n' '\n' ' manager = (EXPRESSION)\n' - ' aexit = type(manager).__aexit__\n' ' aenter = type(manager).__aenter__\n' + ' aexit = type(manager).__aexit__\n' ' value = await aenter(manager)\n' ' hit_except = False\n' '\n' @@ -3040,14 +3076,17 @@ '\n' '-[ Footnotes ]-\n' '\n' - '[1] The exception is propagated to the invocation stack unless\n' - ' there is a "finally" clause which happens to raise another\n' - ' exception. That new exception causes the old one to be ' - 'lost.\n' + '[1] The exception is propagated to the invocation stack unless ' + 'there\n' + ' is a "finally" clause which happens to raise another ' + 'exception.\n' + ' That new exception causes the old one to be lost.\n' '\n' - '[2] A string literal appearing as the first statement in the\n' - ' function body is transformed into the function’s "__doc__"\n' - ' attribute and therefore the function’s *docstring*.\n' + '[2] A string literal appearing as the first statement in the ' + 'function\n' + ' body is transformed into the function’s "__doc__" attribute ' + 'and\n' + ' therefore the function’s *docstring*.\n' '\n' '[3] A string literal appearing as the first statement in the ' 'class\n' @@ -3146,8 +3185,8 @@ ' complex;\n' '\n' '* otherwise, if either argument is a floating point number, ' - 'the\n' - ' other is converted to floating point;\n' + 'the other\n' + ' is converted to floating point;\n' '\n' '* otherwise, both must be integers and no conversion is ' 'necessary.\n' @@ -3257,7 +3296,9 @@ 'for\n' ' objects that still exist when the interpreter exits.\n' '\n' - ' Note: "del x" doesn’t directly call "x.__del__()" — the ' + ' Note:\n' + '\n' + ' "del x" doesn’t directly call "x.__del__()" — the ' 'former\n' ' decrements the reference count for "x" by one, and the ' 'latter is\n' @@ -3281,13 +3322,15 @@ '\n' ' See also: Documentation for the "gc" module.\n' '\n' - ' Warning: Due to the precarious circumstances under ' - 'which\n' - ' "__del__()" methods are invoked, exceptions that occur ' - 'during\n' - ' their execution are ignored, and a warning is printed ' - 'to\n' - ' "sys.stderr" instead. In particular:\n' + ' Warning:\n' + '\n' + ' Due to the precarious circumstances under which ' + '"__del__()"\n' + ' methods are invoked, exceptions that occur during ' + 'their execution\n' + ' are ignored, and a warning is printed to "sys.stderr" ' + 'instead.\n' + ' In particular:\n' '\n' ' * "__del__()" can be invoked when arbitrary code is ' 'being\n' @@ -3300,22 +3343,20 @@ ' that gets interrupted to execute "__del__()".\n' '\n' ' * "__del__()" can be executed during interpreter ' - 'shutdown. As\n' - ' a consequence, the global variables it needs to ' - 'access\n' - ' (including other modules) may already have been ' - 'deleted or set\n' - ' to "None". Python guarantees that globals whose name ' - 'begins\n' - ' with a single underscore are deleted from their ' - 'module before\n' - ' other globals are deleted; if no other references to ' - 'such\n' - ' globals exist, this may help in assuring that ' - 'imported modules\n' - ' are still available at the time when the "__del__()" ' - 'method is\n' - ' called.\n' + 'shutdown. As a\n' + ' consequence, the global variables it needs to access ' + '(including\n' + ' other modules) may already have been deleted or set ' + 'to "None".\n' + ' Python guarantees that globals whose name begins ' + 'with a single\n' + ' underscore are deleted from their module before ' + 'other globals\n' + ' are deleted; if no other references to such globals ' + 'exist, this\n' + ' may help in assuring that imported modules are still ' + 'available\n' + ' at the time when the "__del__()" method is called.\n' '\n' 'object.__repr__(self)\n' '\n' @@ -3400,7 +3441,7 @@ '\n' ' Changed in version 3.7: "object.__format__(x, \'\')" is ' 'now\n' - ' equivalent to "str(x)" rather than "format(str(self), ' + ' equivalent to "str(x)" rather than "format(str(x), ' '\'\')".\n' '\n' 'object.__lt__(self, other)\n' @@ -3434,16 +3475,21 @@ ' on the value to determine if the result is true or ' 'false.\n' '\n' - ' By default, "__ne__()" delegates to "__eq__()" and ' - 'inverts the\n' - ' result unless it is "NotImplemented". There are no ' - 'other implied\n' - ' relationships among the comparison operators, for ' - 'example, the\n' - ' truth of "(x" expression] ":" suite\n' ' decorators ::= decorator+\n' - ' decorator ::= "@" dotted_name ["(" ' - '[argument_list [","]] ")"] NEWLINE\n' + ' decorator ::= "@" assignment_expression ' + 'NEWLINE\n' ' dotted_name ::= identifier ("." identifier)*\n' ' parameter_list ::= defparameter ("," ' 'defparameter)* "," "/" ["," [parameter_list_no_posonly]]\n' @@ -5744,6 +5846,11 @@ 'the name\n' '"func".\n' '\n' + 'Changed in version 3.9: Functions may be decorated with any ' + 'valid\n' + '"assignment_expression". Previously, the grammar was much more\n' + 'restrictive; see **PEP 614** for details.\n' + '\n' 'When one or more *parameters* have the form *parameter* "="\n' '*expression*, the function is said to have “default parameter ' 'values.”\n' @@ -5934,7 +6041,9 @@ 'defined.\n' ' See section The import statement.\n' '\n' - ' Note: The name "_" is often used in conjunction with\n' + ' Note:\n' + '\n' + ' The name "_" is often used in conjunction with\n' ' internationalization; refer to the documentation for the\n' ' "gettext" module for more information on this ' 'convention.\n' @@ -6080,7 +6189,9 @@ 'defined.\n' ' See section The import statement.\n' '\n' - ' Note: The name "_" is often used in conjunction with\n' + ' Note:\n' + '\n' + ' The name "_" is often used in conjunction with\n' ' internationalization; refer to the documentation for ' 'the\n' ' "gettext" module for more information on this ' @@ -6165,8 +6276,9 @@ '\n' '1. find a module, loading and initializing it if necessary\n' '\n' - '2. define a name or names in the local namespace for the scope\n' - ' where the "import" statement occurs.\n' + '2. define a name or names in the local namespace for the scope ' + 'where\n' + ' the "import" statement occurs.\n' '\n' 'When the statement contains multiple clauses (separated by commas) ' 'the\n' @@ -6192,8 +6304,9 @@ 'made\n' 'available in the local namespace in one of three ways:\n' '\n' - '* If the module name is followed by "as", then the name following\n' - ' "as" is bound directly to the imported module.\n' + '* If the module name is followed by "as", then the name following ' + '"as"\n' + ' is bound directly to the imported module.\n' '\n' '* If no other name is specified, and the module being imported is ' 'a\n' @@ -6342,8 +6455,8 @@ '\n' '* other future statements.\n' '\n' - 'The only feature in Python 3.7 that requires using the future\n' - 'statement is "annotations".\n' + 'The only feature that requires using the future statement is\n' + '"annotations" (see **PEP 563**).\n' '\n' 'All historical features enabled by the future statement are still\n' 'recognized by Python 3. The list includes "absolute_import",\n' @@ -6871,15 +6984,18 @@ '"__rpow__()" (the\n' ' coercion rules would become too complicated).\n' '\n' - ' Note: If the right operand’s type is a subclass of the ' - 'left\n' - ' operand’s type and that subclass provides the ' - 'reflected method\n' - ' for the operation, this method will be called before ' - 'the left\n' - ' operand’s non-reflected method. This behavior allows ' - 'subclasses\n' - ' to override their ancestors’ operations.\n' + ' Note:\n' + '\n' + ' If the right operand’s type is a subclass of the left ' + 'operand’s\n' + ' type and that subclass provides a different ' + 'implementation of the\n' + ' reflected method for the operation, this method will ' + 'be called\n' + ' before the left operand’s non-reflected method. This ' + 'behavior\n' + ' allows subclasses to override their ancestors’ ' + 'operations.\n' '\n' 'object.__iadd__(self, other)\n' 'object.__isub__(self, other)\n' @@ -6923,6 +7039,16 @@ 'the data\n' ' model.\n' '\n' + ' Note:\n' + '\n' + ' Due to a bug in the dispatching mechanism for "**=", a ' + 'class that\n' + ' defines "__ipow__()" but returns "NotImplemented" ' + 'would fail to\n' + ' fall back to "x.__pow__(y)" and "y.__rpow__(x)". This ' + 'bug is\n' + ' fixed in Python 3.10.\n' + '\n' 'object.__neg__(self)\n' 'object.__pos__(self)\n' 'object.__abs__(self)\n' @@ -7199,8 +7325,8 @@ '-[ Footnotes ]-\n' '\n' '[1] While "abs(x%y) < abs(y)" is true mathematically, ' - 'for floats\n' - ' it may not be true numerically due to roundoff. For ' + 'for floats it\n' + ' may not be true numerically due to roundoff. For ' 'example, and\n' ' assuming a platform on which a Python float is an ' 'IEEE 754 double-\n' @@ -7265,22 +7391,22 @@ '"unicodedata.normalize()".\n' '\n' '[4] Due to automatic garbage-collection, free lists, and ' - 'the\n' - ' dynamic nature of descriptors, you may notice ' - 'seemingly unusual\n' - ' behaviour in certain uses of the "is" operator, like ' - 'those\n' - ' involving comparisons between instance methods, or ' - 'constants.\n' - ' Check their documentation for more info.\n' + 'the dynamic\n' + ' nature of descriptors, you may notice seemingly ' + 'unusual behaviour\n' + ' in certain uses of the "is" operator, like those ' + 'involving\n' + ' comparisons between instance methods, or constants. ' + 'Check their\n' + ' documentation for more info.\n' '\n' '[5] The "%" operator is also used for string formatting; ' 'the same\n' ' precedence applies.\n' '\n' '[6] The power operator "**" binds less tightly than an ' - 'arithmetic\n' - ' or bitwise unary operator on its right, that is, ' + 'arithmetic or\n' + ' bitwise unary operator on its right, that is, ' '"2**-1" is "0.5".\n', 'pass': 'The "pass" statement\n' '********************\n' @@ -7570,9 +7696,11 @@ '\n' ' New in version 3.4.\n' '\n' - 'Note: Slicing is done exclusively with the following three ' - 'methods.\n' - ' A call like\n' + 'Note:\n' + '\n' + ' Slicing is done exclusively with the following three ' + 'methods. A\n' + ' call like\n' '\n' ' a[1:2] = b\n' '\n' @@ -7603,7 +7731,9 @@ 'the\n' ' container), "KeyError" should be raised.\n' '\n' - ' Note: "for" loops expect that an "IndexError" will be ' + ' Note:\n' + '\n' + ' "for" loops expect that an "IndexError" will be ' 'raised for\n' ' illegal indexes to allow proper detection of the end ' 'of the\n' @@ -7831,7 +7961,7 @@ 'immediate\n' ' subclasses. This method returns a list of all those ' 'references\n' - ' still alive. Example:\n' + ' still alive. The list is in definition order. Example:\n' '\n' ' >>> int.__subclasses__()\n' " []\n" @@ -7839,26 +7969,26 @@ '-[ Footnotes ]-\n' '\n' '[1] Additional information on these special methods may be ' - 'found\n' - ' in the Python Reference Manual (Basic customization).\n' + 'found in\n' + ' the Python Reference Manual (Basic customization).\n' '\n' '[2] As a consequence, the list "[1, 2]" is considered equal ' - 'to\n' - ' "[1.0, 2.0]", and similarly for tuples.\n' + 'to "[1.0,\n' + ' 2.0]", and similarly for tuples.\n' '\n' '[3] They must have since the parser can’t tell the type of ' 'the\n' ' operands.\n' '\n' '[4] Cased characters are those with general category ' - 'property\n' - ' being one of “Lu” (Letter, uppercase), “Ll” (Letter, ' - 'lowercase),\n' - ' or “Lt” (Letter, titlecase).\n' - '\n' - '[5] To format only a tuple you should therefore provide a\n' - ' singleton tuple whose only element is the tuple to be ' - 'formatted.\n', + 'property being\n' + ' one of “Lu” (Letter, uppercase), “Ll” (Letter, ' + 'lowercase), or “Lt”\n' + ' (Letter, titlecase).\n' + '\n' + '[5] To format only a tuple you should therefore provide a ' + 'singleton\n' + ' tuple whose only element is the tuple to be formatted.\n', 'specialnames': 'Special method names\n' '********************\n' '\n' @@ -8003,7 +8133,9 @@ 'for\n' ' objects that still exist when the interpreter exits.\n' '\n' - ' Note: "del x" doesn’t directly call "x.__del__()" — the ' + ' Note:\n' + '\n' + ' "del x" doesn’t directly call "x.__del__()" — the ' 'former\n' ' decrements the reference count for "x" by one, and the ' 'latter is\n' @@ -8027,12 +8159,15 @@ '\n' ' See also: Documentation for the "gc" module.\n' '\n' - ' Warning: Due to the precarious circumstances under which\n' - ' "__del__()" methods are invoked, exceptions that occur ' - 'during\n' - ' their execution are ignored, and a warning is printed ' - 'to\n' - ' "sys.stderr" instead. In particular:\n' + ' Warning:\n' + '\n' + ' Due to the precarious circumstances under which ' + '"__del__()"\n' + ' methods are invoked, exceptions that occur during their ' + 'execution\n' + ' are ignored, and a warning is printed to "sys.stderr" ' + 'instead.\n' + ' In particular:\n' '\n' ' * "__del__()" can be invoked when arbitrary code is ' 'being\n' @@ -8045,22 +8180,20 @@ ' that gets interrupted to execute "__del__()".\n' '\n' ' * "__del__()" can be executed during interpreter ' - 'shutdown. As\n' - ' a consequence, the global variables it needs to ' - 'access\n' - ' (including other modules) may already have been ' - 'deleted or set\n' - ' to "None". Python guarantees that globals whose name ' - 'begins\n' - ' with a single underscore are deleted from their ' - 'module before\n' - ' other globals are deleted; if no other references to ' - 'such\n' - ' globals exist, this may help in assuring that ' - 'imported modules\n' - ' are still available at the time when the "__del__()" ' - 'method is\n' - ' called.\n' + 'shutdown. As a\n' + ' consequence, the global variables it needs to access ' + '(including\n' + ' other modules) may already have been deleted or set ' + 'to "None".\n' + ' Python guarantees that globals whose name begins with ' + 'a single\n' + ' underscore are deleted from their module before other ' + 'globals\n' + ' are deleted; if no other references to such globals ' + 'exist, this\n' + ' may help in assuring that imported modules are still ' + 'available\n' + ' at the time when the "__del__()" method is called.\n' '\n' 'object.__repr__(self)\n' '\n' @@ -8145,7 +8278,7 @@ '\n' ' Changed in version 3.7: "object.__format__(x, \'\')" is ' 'now\n' - ' equivalent to "str(x)" rather than "format(str(self), ' + ' equivalent to "str(x)" rather than "format(str(x), ' '\'\')".\n' '\n' 'object.__lt__(self, other)\n' @@ -8179,16 +8312,21 @@ ' on the value to determine if the result is true or ' 'false.\n' '\n' - ' By default, "__ne__()" delegates to "__eq__()" and ' - 'inverts the\n' - ' result unless it is "NotImplemented". There are no other ' - 'implied\n' - ' relationships among the comparison operators, for ' - 'example, the\n' - ' truth of "(x>> 'Py' in 'Python'\n" ' True\n' @@ -9999,8 +10190,9 @@ ' formatting options that can be specified in format ' 'strings.\n' '\n' - ' Note: When formatting a number ("int", "float", ' - '"complex",\n' + ' Note:\n' + '\n' + ' When formatting a number ("int", "float", "complex",\n' ' "decimal.Decimal" and subclasses) with the "n" type ' '(ex:\n' ' "\'{:n}\'.format(1234)"), the function temporarily ' @@ -10205,6 +10397,15 @@ '"False"\n' ' otherwise.\n' '\n' + " >>> 'BANANA'.isupper()\n" + ' True\n' + " >>> 'banana'.isupper()\n" + ' False\n' + " >>> 'baNana'.isupper()\n" + ' False\n' + " >>> ' '.isupper()\n" + ' False\n' + '\n' 'str.join(iterable)\n' '\n' ' Return a string which is the concatenation of the ' @@ -10253,6 +10454,16 @@ " >>> 'www.example.com'.lstrip('cmowz.')\n" " 'example.com'\n" '\n' + ' See "str.removeprefix()" for a method that will remove ' + 'a single\n' + ' prefix string rather than all of a set of characters. ' + 'For example:\n' + '\n' + " >>> 'Arthur: three!'.lstrip('Arthur: ')\n" + " 'ee!'\n" + " >>> 'Arthur: three!'.removeprefix('Arthur: ')\n" + " 'three!'\n" + '\n' 'static str.maketrans(x[, y[, z]])\n' '\n' ' This static method returns a translation table usable ' @@ -10289,6 +10500,35 @@ 'followed by\n' ' two empty strings.\n' '\n' + 'str.removeprefix(prefix, /)\n' + '\n' + ' If the string starts with the *prefix* string, return\n' + ' "string[len(prefix):]". Otherwise, return a copy of the ' + 'original\n' + ' string:\n' + '\n' + " >>> 'TestHook'.removeprefix('Test')\n" + " 'Hook'\n" + " >>> 'BaseTestCase'.removeprefix('Test')\n" + " 'BaseTestCase'\n" + '\n' + ' New in version 3.9.\n' + '\n' + 'str.removesuffix(suffix, /)\n' + '\n' + ' If the string ends with the *suffix* string and that ' + '*suffix* is\n' + ' not empty, return "string[:-len(suffix)]". Otherwise, ' + 'return a copy\n' + ' of the original string:\n' + '\n' + " >>> 'MiscTests'.removesuffix('Tests')\n" + " 'Misc'\n" + " >>> 'TmpDirMixin'.removesuffix('Tests')\n" + " 'TmpDirMixin'\n" + '\n' + ' New in version 3.9.\n' + '\n' 'str.replace(old, new[, count])\n' '\n' ' Return a copy of the string with all occurrences of ' @@ -10366,6 +10606,16 @@ " >>> 'mississippi'.rstrip('ipz')\n" " 'mississ'\n" '\n' + ' See "str.removesuffix()" for a method that will remove ' + 'a single\n' + ' suffix string rather than all of a set of characters. ' + 'For example:\n' + '\n' + " >>> 'Monty Python'.rstrip(' Python')\n" + " 'M'\n" + " >>> 'Monty Python'.removesuffix(' Python')\n" + " 'Monty'\n" + '\n' 'str.split(sep=None, maxsplit=-1)\n' '\n' ' Return a list of the words in the string, using *sep* ' @@ -10847,17 +11097,20 @@ '\n' '2. Unlike in Standard C, exactly two hex digits are required.\n' '\n' - '3. In a bytes literal, hexadecimal and octal escapes denote the\n' - ' byte with the given value. In a string literal, these escapes\n' - ' denote a Unicode character with the given value.\n' + '3. In a bytes literal, hexadecimal and octal escapes denote the ' + 'byte\n' + ' with the given value. In a string literal, these escapes ' + 'denote a\n' + ' Unicode character with the given value.\n' '\n' '4. Changed in version 3.3: Support for name aliases [1] has been\n' ' added.\n' '\n' '5. Exactly four hex digits are required.\n' '\n' - '6. Any Unicode character can be encoded this way. Exactly eight\n' - ' hex digits are required.\n' + '6. Any Unicode character can be encoded this way. Exactly eight ' + 'hex\n' + ' digits are required.\n' '\n' 'Unlike Standard C, all unrecognized escape sequences are left in ' 'the\n' @@ -10899,9 +11152,10 @@ 'subscriptions': 'Subscriptions\n' '*************\n' '\n' - 'A subscription selects an item of a sequence (string, tuple ' - 'or list)\n' - 'or mapping (dictionary) object:\n' + 'Subscription of a sequence (string, tuple or list) or ' + 'mapping\n' + '(dictionary) object usually selects an item from the ' + 'collection:\n' '\n' ' subscription ::= primary "[" expression_list "]"\n' '\n' @@ -10952,7 +11206,13 @@ '\n' 'A string’s items are characters. A character is not a ' 'separate data\n' - 'type but a string of exactly one character.\n', + 'type but a string of exactly one character.\n' + '\n' + 'Subscription of certain *classes* or *types* creates a ' + 'generic alias.\n' + 'In this case, user-defined classes can support subscription ' + 'by\n' + 'providing a "__class_getitem__()" classmethod.\n', 'truth': 'Truth Value Testing\n' '*******************\n' '\n' @@ -11010,7 +11270,8 @@ 'object is “compatible” with the exception. An object is compatible\n' 'with an exception if it is the class or a base class of the ' 'exception\n' - 'object or a tuple containing an item compatible with the exception.\n' + 'object, or a tuple containing an item that is the class or a base\n' + 'class of the exception object.\n' '\n' 'If no except clause matches the exception, the search for an ' 'exception\n' @@ -11170,10 +11431,17 @@ 'for\n' ' the operands provided. (The interpreter will then try the\n' ' reflected operation, or some other fallback, depending on the\n' - ' operator.) Its truth value is true.\n' + ' operator.) It should not be evaluated in a boolean context.\n' '\n' ' See Implementing the arithmetic operations for more details.\n' '\n' + ' Changed in version 3.9: Evaluating "NotImplemented" in a ' + 'boolean\n' + ' context is deprecated. While it currently evaluates as true, it\n' + ' will emit a "DeprecationWarning". It will raise a "TypeError" in ' + 'a\n' + ' future version of Python.\n' + '\n' 'Ellipsis\n' ' This type has a single value. There is a single object with ' 'this\n' @@ -11191,6 +11459,27 @@ 'representation\n' ' in computers.\n' '\n' + ' The string representations of the numeric classes, computed by\n' + ' "__repr__()" and "__str__()", have the following properties:\n' + '\n' + ' * They are valid numeric literals which, when passed to their ' + 'class\n' + ' constructor, produce an object having the value of the ' + 'original\n' + ' numeric.\n' + '\n' + ' * The representation is in base 10, when possible.\n' + '\n' + ' * Leading zeros, possibly excepting a single zero before a ' + 'decimal\n' + ' point, are not shown.\n' + '\n' + ' * Trailing zeros, possibly excepting a single zero after a ' + 'decimal\n' + ' point, are not shown.\n' + '\n' + ' * A sign is shown only when the number is negative.\n' + '\n' ' Python distinguishes between integers, floating point numbers, ' 'and\n' ' complex numbers:\n' @@ -11203,7 +11492,6 @@ ' There are two types of integers:\n' '\n' ' Integers ("int")\n' - '\n' ' These represent numbers in an unlimited range, subject to\n' ' available (virtual) memory only. For the purpose of ' 'shift\n' @@ -12242,6 +12530,21 @@ 'positional\n' ' argument and a possibly empty set of keyword arguments.\n' '\n' + ' Dictionaries can be created by several means:\n' + '\n' + ' * Use a comma-separated list of "key: value" pairs within ' + 'braces:\n' + ' "{\'jack\': 4098, \'sjoerd\': 4127}" or "{4098: ' + "'jack', 4127:\n" + ' \'sjoerd\'}"\n' + '\n' + ' * Use a dict comprehension: "{}", "{x: x ** 2 for x in ' + 'range(10)}"\n' + '\n' + ' * Use the type constructor: "dict()", "dict([(\'foo\', ' + "100), ('bar',\n" + ' 200)])", "dict(foo=100, bar=200)"\n' + '\n' ' If no positional argument is given, an empty dictionary ' 'is created.\n' ' If a positional argument is given and it is a mapping ' @@ -12279,7 +12582,8 @@ " >>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))\n" " >>> d = dict([('two', 2), ('one', 1), ('three', 3)])\n" " >>> e = dict({'three': 3, 'one': 1, 'two': 2})\n" - ' >>> a == b == c == d == e\n' + " >>> f = dict({'one': 1, 'three': 3}, two=2)\n" + ' >>> a == b == c == d == e == f\n' ' True\n' '\n' ' Providing keyword arguments as in the first example only ' @@ -12477,6 +12781,29 @@ ' >>> d.values() == d.values()\n' ' False\n' '\n' + ' d | other\n' + '\n' + ' Create a new dictionary with the merged keys and ' + 'values of *d*\n' + ' and *other*, which must both be dictionaries. The ' + 'values of\n' + ' *other* take priority when *d* and *other* share ' + 'keys.\n' + '\n' + ' New in version 3.9.\n' + '\n' + ' d |= other\n' + '\n' + ' Update the dictionary *d* with keys and values from ' + '*other*,\n' + ' which may be either a *mapping* or an *iterable* of ' + 'key/value\n' + ' pairs. The values of *other* take priority when *d* ' + 'and *other*\n' + ' share keys.\n' + '\n' + ' New in version 3.9.\n' + '\n' ' Dictionaries compare equal if and only if they have the ' 'same "(key,\n' ' value)" pairs (regardless of ordering). Order comparisons ' @@ -12524,9 +12851,11 @@ '\n' ' Changed in version 3.8: Dictionaries are now reversible.\n' '\n' - 'See also: "types.MappingProxyType" can be used to create a ' - 'read-only\n' - ' view of a "dict".\n' + 'See also:\n' + '\n' + ' "types.MappingProxyType" can be used to create a read-only ' + 'view of a\n' + ' "dict".\n' '\n' '\n' 'Dictionary view objects\n' @@ -12910,13 +13239,14 @@ '"None", it\n' ' is treated like "1".\n' '\n' - '6. Concatenating immutable sequences always results in a new\n' - ' object. This means that building up a sequence by repeated\n' - ' concatenation will have a quadratic runtime cost in the ' - 'total\n' - ' sequence length. To get a linear runtime cost, you must ' - 'switch to\n' - ' one of the alternatives below:\n' + '6. Concatenating immutable sequences always results in a new ' + 'object.\n' + ' This means that building up a sequence by repeated ' + 'concatenation\n' + ' will have a quadratic runtime cost in the total sequence ' + 'length.\n' + ' To get a linear runtime cost, you must switch to one of the\n' + ' alternatives below:\n' '\n' ' * if concatenating "str" objects, you can build a list and ' 'use\n' @@ -12934,24 +13264,25 @@ ' * for other types, investigate the relevant class ' 'documentation\n' '\n' - '7. Some sequence types (such as "range") only support item\n' - ' sequences that follow specific patterns, and hence don’t ' - 'support\n' - ' sequence concatenation or repetition.\n' - '\n' - '8. "index" raises "ValueError" when *x* is not found in *s*. ' - 'Not\n' - ' all implementations support passing the additional arguments ' - '*i*\n' - ' and *j*. These arguments allow efficient searching of ' - 'subsections\n' - ' of the sequence. Passing the extra arguments is roughly ' - 'equivalent\n' - ' to using "s[i:j].index(x)", only without copying any data and ' - 'with\n' - ' the returned index being relative to the start of the ' + '7. Some sequence types (such as "range") only support item ' + 'sequences\n' + ' that follow specific patterns, and hence don’t support ' 'sequence\n' - ' rather than the start of the slice.\n' + ' concatenation or repetition.\n' + '\n' + '8. "index" raises "ValueError" when *x* is not found in *s*. Not ' + 'all\n' + ' implementations support passing the additional arguments *i* ' + 'and\n' + ' *j*. These arguments allow efficient searching of subsections ' + 'of\n' + ' the sequence. Passing the extra arguments is roughly ' + 'equivalent to\n' + ' using "s[i:j].index(x)", only without copying any data and ' + 'with the\n' + ' returned index being relative to the start of the sequence ' + 'rather\n' + ' than the start of the slice.\n' '\n' '\n' 'Immutable Sequence Types\n' @@ -13079,17 +13410,17 @@ '1. *t* must have the same length as the slice it is replacing.\n' '\n' '2. The optional argument *i* defaults to "-1", so that by ' - 'default\n' - ' the last item is removed and returned.\n' + 'default the\n' + ' last item is removed and returned.\n' '\n' '3. "remove()" raises "ValueError" when *x* is not found in *s*.\n' '\n' - '4. The "reverse()" method modifies the sequence in place for\n' - ' economy of space when reversing a large sequence. To remind ' - 'users\n' - ' that it operates by side effect, it does not return the ' - 'reversed\n' - ' sequence.\n' + '4. The "reverse()" method modifies the sequence in place for ' + 'economy\n' + ' of space when reversing a large sequence. To remind users ' + 'that it\n' + ' operates by side effect, it does not return the reversed ' + 'sequence.\n' '\n' '5. "clear()" and "copy()" are included for consistency with the\n' ' interfaces of mutable containers that don’t support slicing\n' @@ -13126,9 +13457,9 @@ ' * Using a pair of square brackets to denote the empty list: ' '"[]"\n' '\n' - ' * Using square brackets, separating items with commas: ' - '"[a]",\n' - ' "[a, b, c]"\n' + ' * Using square brackets, separating items with commas: "[a]", ' + '"[a,\n' + ' b, c]"\n' '\n' ' * Using a list comprehension: "[x for x in iterable]"\n' '\n' @@ -13431,9 +13762,9 @@ '\n' 'See also:\n' '\n' - ' * The linspace recipe shows how to implement a lazy version ' - 'of\n' - ' range suitable for floating point applications.\n', + ' * The linspace recipe shows how to implement a lazy version of ' + 'range\n' + ' suitable for floating point applications.\n', 'typesseq-mutable': 'Mutable Sequence Types\n' '**********************\n' '\n' @@ -13544,19 +13875,18 @@ 'replacing.\n' '\n' '2. The optional argument *i* defaults to "-1", so that ' - 'by default\n' - ' the last item is removed and returned.\n' + 'by default the\n' + ' last item is removed and returned.\n' '\n' '3. "remove()" raises "ValueError" when *x* is not found ' 'in *s*.\n' '\n' '4. The "reverse()" method modifies the sequence in place ' - 'for\n' - ' economy of space when reversing a large sequence. To ' - 'remind users\n' - ' that it operates by side effect, it does not return ' - 'the reversed\n' - ' sequence.\n' + 'for economy\n' + ' of space when reversing a large sequence. To remind ' + 'users that it\n' + ' operates by side effect, it does not return the ' + 'reversed sequence.\n' '\n' '5. "clear()" and "copy()" are included for consistency ' 'with the\n' @@ -13639,8 +13969,9 @@ 'The execution of the "with" statement with one “item” proceeds as\n' 'follows:\n' '\n' - '1. The context expression (the expression given in the "with_item")\n' - ' is evaluated to obtain a context manager.\n' + '1. The context expression (the expression given in the "with_item") ' + 'is\n' + ' evaluated to obtain a context manager.\n' '\n' '2. The context manager’s "__enter__()" is loaded for later use.\n' '\n' @@ -13648,12 +13979,15 @@ '\n' '4. The context manager’s "__enter__()" method is invoked.\n' '\n' - '5. If a target was included in the "with" statement, the return\n' - ' value from "__enter__()" is assigned to it.\n' + '5. If a target was included in the "with" statement, the return ' + 'value\n' + ' from "__enter__()" is assigned to it.\n' + '\n' + ' Note:\n' '\n' - ' Note: The "with" statement guarantees that if the "__enter__()"\n' - ' method returns without an error, then "__exit__()" will always ' - 'be\n' + ' The "with" statement guarantees that if the "__enter__()" ' + 'method\n' + ' returns without an error, then "__exit__()" will always be\n' ' called. Thus, if an error occurs during the assignment to the\n' ' target list, it will be treated the same as an error occurring\n' ' within the suite would be. See step 6 below.\n' diff --git a/Lib/queue.py b/Lib/queue.py index 5bb0431e9494617ede7d87d153bde2e1bbe27315..10dbcbc18ece8556037ec1d360a7548fc8445c3e 100644 --- a/Lib/queue.py +++ b/Lib/queue.py @@ -1,6 +1,7 @@ '''A multi-producer, multi-consumer queue.''' import threading +import types from collections import deque from heapq import heappush, heappop from time import monotonic as time @@ -216,6 +217,8 @@ def _put(self, item): def _get(self): return self.queue.popleft() + __class_getitem__ = classmethod(types.GenericAlias) + class PriorityQueue(Queue): '''Variant of Queue that retrieves open entries in priority order (lowest first). @@ -316,6 +319,8 @@ def qsize(self): '''Return the approximate size of the queue (not reliable!).''' return len(self._queue) + __class_getitem__ = classmethod(types.GenericAlias) + if SimpleQueue is None: SimpleQueue = _PySimpleQueue diff --git a/Lib/quopri.py b/Lib/quopri.py index cbd979abdffc89a02fadb1f62f8a761572559ec8..08899c5cb73a300d340ba2f84e25e82b249d3f55 100755 --- a/Lib/quopri.py +++ b/Lib/quopri.py @@ -204,11 +204,11 @@ def main(): print("-t: quote tabs") print("-d: decode; default encode") sys.exit(2) - deco = 0 - tabs = 0 + deco = False + tabs = False for o, a in opts: - if o == '-t': tabs = 1 - if o == '-d': deco = 1 + if o == '-t': tabs = True + if o == '-d': deco = True if tabs and deco: sys.stdout = sys.stderr print("-t and -d are mutually exclusive") diff --git a/Lib/random.py b/Lib/random.py index 365a01957203f275d72b439702cc445841366529..36e16a9063b5346dede2fedbb30db2bdbbbbcf17 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -1,5 +1,9 @@ """Random variable generators. + bytes + ----- + uniform bytes (values between 0 and 255) + integers -------- uniform within range @@ -37,14 +41,20 @@ """ +# Translated by Guido van Rossum from C source provided by +# Adrian Baddeley. Adapted by Raymond Hettinger for use with +# the Mersenne Twister and os.urandom() core generators. + from warnings import warn as _warn from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin +from math import tau as TWOPI, floor as _floor from os import urandom as _urandom from _collections_abc import Set as _Set, Sequence as _Sequence from itertools import accumulate as _accumulate, repeat as _repeat from bisect import bisect as _bisect import os as _os +import _random try: # hashlib is pretty heavy to load, try lean internal module first @@ -53,28 +63,41 @@ # fallback to official implementation from hashlib import sha512 as _sha512 - -__all__ = ["Random","seed","random","uniform","randint","choice","sample", - "randrange","shuffle","normalvariate","lognormvariate", - "expovariate","vonmisesvariate","gammavariate","triangular", - "gauss","betavariate","paretovariate","weibullvariate", - "getstate","setstate", "getrandbits", "choices", - "SystemRandom"] - -NV_MAGICCONST = 4 * _exp(-0.5)/_sqrt(2.0) -TWOPI = 2.0*_pi +__all__ = [ + "Random", + "SystemRandom", + "betavariate", + "choice", + "choices", + "expovariate", + "gammavariate", + "gauss", + "getrandbits", + "getstate", + "lognormvariate", + "normalvariate", + "paretovariate", + "randbytes", + "randint", + "random", + "randrange", + "sample", + "seed", + "setstate", + "shuffle", + "triangular", + "uniform", + "vonmisesvariate", + "weibullvariate", +] + +NV_MAGICCONST = 4 * _exp(-0.5) / _sqrt(2.0) LOG4 = _log(4.0) SG_MAGICCONST = 1.0 + _log(4.5) BPF = 53 # Number of bits in a float -RECIP_BPF = 2**-BPF +RECIP_BPF = 2 ** -BPF -# Translated by Guido van Rossum from C source provided by -# Adrian Baddeley. Adapted by Raymond Hettinger for use with -# the Mersenne Twister and os.urandom() core generators. - -import _random - class Random(_random.Random): """Random number generator base class used by bound module functions. @@ -100,28 +123,11 @@ def __init__(self, x=None): self.seed(x) self.gauss_next = None - def __init_subclass__(cls, /, **kwargs): - """Control how subclasses generate random integers. - - The algorithm a subclass can use depends on the random() and/or - getrandbits() implementation available to it and determines - whether it can generate random integers from arbitrarily large - ranges. - """ - - for c in cls.__mro__: - if '_randbelow' in c.__dict__: - # just inherit it - break - if 'getrandbits' in c.__dict__: - cls._randbelow = cls._randbelow_with_getrandbits - break - if 'random' in c.__dict__: - cls._randbelow = cls._randbelow_without_getrandbits - break - def seed(self, a=None, version=2): - """Initialize internal state from hashable object. + """Initialize internal state from a seed. + + The only supported seed types are None, int, float, + str, bytes, and bytearray. None or no argument seeds from current time or from an operating system specific randomness source if available. @@ -143,12 +149,20 @@ def seed(self, a=None, version=2): x ^= len(a) a = -2 if x == -1 else x - if version == 2 and isinstance(a, (str, bytes, bytearray)): + elif version == 2 and isinstance(a, (str, bytes, bytearray)): if isinstance(a, str): a = a.encode() a += _sha512(a).digest() a = int.from_bytes(a, 'big') + elif not isinstance(a, (type(None), int, float, str, bytes, bytearray)): + _warn('Seeding based on hashing is deprecated\n' + 'since Python 3.9 and will be removed in a subsequent ' + 'version. The only \n' + 'supported seed types are: None, ' + 'int, float, str, bytes, and bytearray.', + DeprecationWarning, 2) + super().seed(a) self.gauss_next = None @@ -169,7 +183,7 @@ def setstate(self, state): # really unsigned 32-bit ints, so we convert negative ints from # version 2 to positive longs for version 3. try: - internalstate = tuple(x % (2**32) for x in internalstate) + internalstate = tuple(x % (2 ** 32) for x in internalstate) except ValueError as e: raise TypeError from e super().setstate(internalstate) @@ -178,15 +192,18 @@ def setstate(self, state): "Random.setstate() of version %s" % (version, self.VERSION)) -## ---- Methods below this point do not need to be overridden when -## ---- subclassing for the purpose of using a different core generator. -## -------------------- pickle support ------------------- + ## ------------------------------------------------------- + ## ---- Methods below this point do not need to be overridden or extended + ## ---- when subclassing for the purpose of using a different core generator. + + + ## -------------------- pickle support ------------------- # Issue 17489: Since __reduce__ was defined to fix #759889 this is no # longer called; we leave it here because it has been here since random was # rewritten back in 2001 and why risk breaking something. - def __getstate__(self): # for pickle + def __getstate__(self): # for pickle return self.getstate() def __setstate__(self, state): # for pickle @@ -195,9 +212,83 @@ def __setstate__(self, state): # for pickle def __reduce__(self): return self.__class__, (), self.getstate() -## -------------------- integer methods ------------------- - def randrange(self, start, stop=None, step=1, _int=int): + ## ---- internal support method for evenly distributed integers ---- + + def __init_subclass__(cls, /, **kwargs): + """Control how subclasses generate random integers. + + The algorithm a subclass can use depends on the random() and/or + getrandbits() implementation available to it and determines + whether it can generate random integers from arbitrarily large + ranges. + """ + + for c in cls.__mro__: + if '_randbelow' in c.__dict__: + # just inherit it + break + if 'getrandbits' in c.__dict__: + cls._randbelow = cls._randbelow_with_getrandbits + break + if 'random' in c.__dict__: + cls._randbelow = cls._randbelow_without_getrandbits + break + + def _randbelow_with_getrandbits(self, n): + "Return a random int in the range [0,n). Returns 0 if n==0." + + if not n: + return 0 + getrandbits = self.getrandbits + k = n.bit_length() # don't use (n-1) here because n can be 1 + r = getrandbits(k) # 0 <= r < 2**k + while r >= n: + r = getrandbits(k) + return r + + def _randbelow_without_getrandbits(self, n, maxsize=1<= maxsize: + _warn("Underlying random() generator does not supply \n" + "enough bits to choose from a population range this large.\n" + "To remove the range limitation, add a getrandbits() method.") + return _floor(random() * n) + if n == 0: + return 0 + rem = maxsize % n + limit = (maxsize - rem) / maxsize # int(limit * maxsize) % n == 0 + r = random() + while r >= limit: + r = random() + return _floor(r * maxsize) % n + + _randbelow = _randbelow_with_getrandbits + + + ## -------------------------------------------------------- + ## ---- Methods below this point generate custom distributions + ## ---- based on the methods defined above. They do not + ## ---- directly touch the underlying generator and only + ## ---- access randomness through the methods: random(), + ## ---- getrandbits(), or _randbelow(). + + + ## -------------------- bytes methods --------------------- + + def randbytes(self, n): + """Generate n random bytes.""" + return self.getrandbits(n * 8).to_bytes(n, 'little') + + + ## -------------------- integer methods ------------------- + + def randrange(self, start, stop=None, step=1): """Choose a random item from range(start, stop[, step]). This fixes the problem with randint() which includes the @@ -207,7 +298,7 @@ def randrange(self, start, stop=None, step=1, _int=int): # This code is a bit messy to make it fast for the # common case while still doing adequate error checking. - istart = _int(start) + istart = int(start) if istart != start: raise ValueError("non-integer arg 1 for randrange()") if stop is None: @@ -216,7 +307,7 @@ def randrange(self, start, stop=None, step=1, _int=int): raise ValueError("empty range for randrange()") # stop argument supplied. - istop = _int(stop) + istop = int(stop) if istop != stop: raise ValueError("non-integer stop for randrange()") width = istop - istart @@ -226,7 +317,7 @@ def randrange(self, start, stop=None, step=1, _int=int): raise ValueError("empty range for randrange() (%d, %d, %d)" % (istart, istop, width)) # Non-unit step argument supplied. - istep = _int(step) + istep = int(step) if istep != step: raise ValueError("non-integer step for randrange()") if istep > 0: @@ -239,7 +330,7 @@ def randrange(self, start, stop=None, step=1, _int=int): if n <= 0: raise ValueError("empty range for randrange()") - return istart + istep*self._randbelow(n) + return istart + istep * self._randbelow(n) def randint(self, a, b): """Return random integer in range [a, b], including both end points. @@ -247,48 +338,13 @@ def randint(self, a, b): return self.randrange(a, b+1) - def _randbelow_with_getrandbits(self, n): - "Return a random int in the range [0,n). Raises ValueError if n==0." - getrandbits = self.getrandbits - k = n.bit_length() # don't use (n-1) here because n can be 1 - r = getrandbits(k) # 0 <= r < 2**k - while r >= n: - r = getrandbits(k) - return r - - def _randbelow_without_getrandbits(self, n, int=int, maxsize=1<= maxsize: - _warn("Underlying random() generator does not supply \n" - "enough bits to choose from a population range this large.\n" - "To remove the range limitation, add a getrandbits() method.") - return int(random() * n) - if n == 0: - raise ValueError("Boundary cannot be zero") - rem = maxsize % n - limit = (maxsize - rem) / maxsize # int(limit * maxsize) % n == 0 - r = random() - while r >= limit: - r = random() - return int(r*maxsize) % n - - _randbelow = _randbelow_with_getrandbits - -## -------------------- sequence methods ------------------- + ## -------------------- sequence methods ------------------- def choice(self, seq): """Choose a random element from a non-empty sequence.""" - try: - i = self._randbelow(len(seq)) - except ValueError: - raise IndexError('Cannot choose from an empty sequence') from None - return seq[i] + # raises IndexError if seq is empty + return seq[self._randbelow(len(seq))] def shuffle(self, x, random=None): """Shuffle list x in place, and return None. @@ -303,16 +359,20 @@ def shuffle(self, x, random=None): randbelow = self._randbelow for i in reversed(range(1, len(x))): # pick an element in x[:i+1] with which to exchange x[i] - j = randbelow(i+1) + j = randbelow(i + 1) x[i], x[j] = x[j], x[i] else: - _int = int + _warn('The *random* parameter to shuffle() has been deprecated\n' + 'since Python 3.9 and will be removed in a subsequent ' + 'version.', + DeprecationWarning, 2) + floor = _floor for i in reversed(range(1, len(x))): # pick an element in x[:i+1] with which to exchange x[i] - j = _int(random() * (i+1)) + j = floor(random() * (i + 1)) x[i], x[j] = x[j], x[i] - def sample(self, population, k): + def sample(self, population, k, *, counts=None): """Chooses k unique random elements from a population sequence or set. Returns a new list containing elements from the population while @@ -325,9 +385,21 @@ def sample(self, population, k): population contains repeats, then each occurrence is a possible selection in the sample. - To choose a sample in a range of integers, use range as an argument. - This is especially fast and space efficient for sampling from a - large population: sample(range(10000000), 60) + Repeated elements can be specified one at a time or with the optional + counts parameter. For example: + + sample(['red', 'blue'], counts=[4, 2], k=5) + + is equivalent to: + + sample(['red', 'red', 'red', 'red', 'blue', 'blue'], k=5) + + To choose a sample from a range of integers, use range() for the + population argument. This is especially fast and space efficient + for sampling from a large population: + + sample(range(10000000), 60) + """ # Sampling without replacement entails tracking either potential @@ -354,24 +426,40 @@ def sample(self, population, k): # causing them to eat more entropy than necessary. if isinstance(population, _Set): + _warn('Sampling from a set deprecated\n' + 'since Python 3.9 and will be removed in a subsequent version.', + DeprecationWarning, 2) population = tuple(population) if not isinstance(population, _Sequence): - raise TypeError("Population must be a sequence or set. For dicts, use list(d).") - randbelow = self._randbelow + raise TypeError("Population must be a sequence. For dicts or sets, use sorted(d).") n = len(population) + if counts is not None: + cum_counts = list(_accumulate(counts)) + if len(cum_counts) != n: + raise ValueError('The number of counts does not match the population') + total = cum_counts.pop() + if not isinstance(total, int): + raise TypeError('Counts must be integers') + if total <= 0: + raise ValueError('Total of counts must be greater than zero') + selections = self.sample(range(total), k=k) + bisect = _bisect + return [population[bisect(cum_counts, s)] for s in selections] + randbelow = self._randbelow if not 0 <= k <= n: raise ValueError("Sample larger than population or is negative") result = [None] * k setsize = 21 # size of a small set minus size of an empty list if k > 5: - setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets + setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets if n <= setsize: - # An n-length list is smaller than a k-length set + # An n-length list is smaller than a k-length set. + # Invariant: non-selected at pool[0 : n-i] pool = list(population) - for i in range(k): # invariant: non-selected at [0,n-i) - j = randbelow(n-i) + for i in range(k): + j = randbelow(n - i) result[i] = pool[j] - pool[j] = pool[n-i-1] # move non-selected item into vacancy + pool[j] = pool[n - i - 1] # move non-selected item into vacancy else: selected = set() selected_add = selected.add @@ -394,29 +482,28 @@ def choices(self, population, weights=None, *, cum_weights=None, k=1): n = len(population) if cum_weights is None: if weights is None: - _int = int + floor = _floor n += 0.0 # convert to float for a small speed improvement - return [population[_int(random() * n)] for i in _repeat(None, k)] + return [population[floor(random() * n)] for i in _repeat(None, k)] cum_weights = list(_accumulate(weights)) elif weights is not None: raise TypeError('Cannot specify both weights and cumulative weights') if len(cum_weights) != n: raise ValueError('The number of weights does not match the population') - bisect = _bisect total = cum_weights[-1] + 0.0 # convert to float + if total <= 0.0: + raise ValueError('Total of weights must be greater than zero') + bisect = _bisect hi = n - 1 return [population[bisect(cum_weights, random() * total, 0, hi)] for i in _repeat(None, k)] -## -------------------- real-valued distributions ------------------- -## -------------------- uniform distribution ------------------- + ## -------------------- real-valued distributions ------------------- def uniform(self, a, b): "Get a random number in the range [a, b) or [a, b] depending on rounding." - return a + (b-a) * self.random() - -## -------------------- triangular -------------------- + return a + (b - a) * self.random() def triangular(self, low=0.0, high=1.0, mode=None): """Triangular distribution. @@ -438,32 +525,64 @@ def triangular(self, low=0.0, high=1.0, mode=None): low, high = high, low return low + (high - low) * _sqrt(u * c) -## -------------------- normal distribution -------------------- - def normalvariate(self, mu, sigma): """Normal distribution. mu is the mean, and sigma is the standard deviation. """ - # mu = mean, sigma = standard deviation - # Uses Kinderman and Monahan method. Reference: Kinderman, # A.J. and Monahan, J.F., "Computer generation of random # variables using the ratio of uniform deviates", ACM Trans # Math Software, 3, (1977), pp257-260. random = self.random - while 1: + while True: u1 = random() u2 = 1.0 - random() - z = NV_MAGICCONST*(u1-0.5)/u2 - zz = z*z/4.0 + z = NV_MAGICCONST * (u1 - 0.5) / u2 + zz = z * z / 4.0 if zz <= -_log(u2): break - return mu + z*sigma + return mu + z * sigma + + def gauss(self, mu, sigma): + """Gaussian distribution. -## -------------------- lognormal distribution -------------------- + mu is the mean, and sigma is the standard deviation. This is + slightly faster than the normalvariate() function. + + Not thread-safe without a lock around calls. + + """ + # When x and y are two variables from [0, 1), uniformly + # distributed, then + # + # cos(2*pi*x)*sqrt(-2*log(1-y)) + # sin(2*pi*x)*sqrt(-2*log(1-y)) + # + # are two *independent* variables with normal distribution + # (mu = 0, sigma = 1). + # (Lambert Meertens) + # (corrected version; bug discovered by Mike Miller, fixed by LM) + + # Multithreading note: When two threads call this function + # simultaneously, it is possible that they will receive the + # same return value. The window is very small though. To + # avoid this, you have to use a lock around all calls. (I + # didn't want to slow this down in the serial case by using a + # lock here.) + + random = self.random + z = self.gauss_next + self.gauss_next = None + if z is None: + x2pi = random() * TWOPI + g2rad = _sqrt(-2.0 * _log(1.0 - random())) + z = _cos(x2pi) * g2rad + self.gauss_next = _sin(x2pi) * g2rad + + return mu + z * sigma def lognormvariate(self, mu, sigma): """Log normal distribution. @@ -475,8 +594,6 @@ def lognormvariate(self, mu, sigma): """ return _exp(self.normalvariate(mu, sigma)) -## -------------------- exponential distribution -------------------- - def expovariate(self, lambd): """Exponential distribution. @@ -492,9 +609,7 @@ def expovariate(self, lambd): # we use 1-random() instead of random() to preclude the # possibility of taking the log of zero. - return -_log(1.0 - self.random())/lambd - -## -------------------- von Mises distribution -------------------- + return -_log(1.0 - self.random()) / lambd def vonmisesvariate(self, mu, kappa): """Circular data distribution. @@ -505,10 +620,6 @@ def vonmisesvariate(self, mu, kappa): to a uniform random angle over the range 0 to 2*pi. """ - # mu: mean angle (in radians between 0 and 2*pi) - # kappa: concentration parameter kappa (>= 0) - # if kappa = 0 generate uniform random angle - # Based upon an algorithm published in: Fisher, N.I., # "Statistical Analysis of Circular Data", Cambridge # University Press, 1993. @@ -523,7 +634,7 @@ def vonmisesvariate(self, mu, kappa): s = 0.5 / kappa r = s + _sqrt(1.0 + s * s) - while 1: + while True: u1 = random() z = _cos(_pi * u1) @@ -542,8 +653,6 @@ def vonmisesvariate(self, mu, kappa): return theta -## -------------------- gamma distribution -------------------- - def gammavariate(self, alpha, beta): """Gamma distribution. Not the gamma function! @@ -556,7 +665,6 @@ def gammavariate(self, alpha, beta): math.gamma(alpha) * beta ** alpha """ - # alpha > 0, beta > 0, mean is alpha*beta, variance is alpha*beta**2 # Warning: a few older sources define the gamma distribution in terms @@ -577,32 +685,31 @@ def gammavariate(self, alpha, beta): while 1: u1 = random() - if not 1e-7 < u1 < .9999999: + if not 1e-7 < u1 < 0.9999999: continue u2 = 1.0 - random() - v = _log(u1/(1.0-u1))/ainv - x = alpha*_exp(v) - z = u1*u1*u2 - r = bbb+ccc*v-x - if r + SG_MAGICCONST - 4.5*z >= 0.0 or r >= _log(z): + v = _log(u1 / (1.0 - u1)) / ainv + x = alpha * _exp(v) + z = u1 * u1 * u2 + r = bbb + ccc * v - x + if r + SG_MAGICCONST - 4.5 * z >= 0.0 or r >= _log(z): return x * beta elif alpha == 1.0: # expovariate(1/beta) return -_log(1.0 - random()) * beta - else: # alpha is between 0 and 1 (exclusive) - + else: + # alpha is between 0 and 1 (exclusive) # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle - - while 1: + while True: u = random() - b = (_e + alpha)/_e - p = b*u + b = (_e + alpha) / _e + p = b * u if p <= 1.0: - x = p ** (1.0/alpha) + x = p ** (1.0 / alpha) else: - x = -_log((b-p)/alpha) + x = -_log((b - p) / alpha) u1 = random() if p > 1.0: if u1 <= x ** (alpha - 1.0): @@ -611,61 +718,6 @@ def gammavariate(self, alpha, beta): break return x * beta -## -------------------- Gauss (faster alternative) -------------------- - - def gauss(self, mu, sigma): - """Gaussian distribution. - - mu is the mean, and sigma is the standard deviation. This is - slightly faster than the normalvariate() function. - - Not thread-safe without a lock around calls. - - """ - - # When x and y are two variables from [0, 1), uniformly - # distributed, then - # - # cos(2*pi*x)*sqrt(-2*log(1-y)) - # sin(2*pi*x)*sqrt(-2*log(1-y)) - # - # are two *independent* variables with normal distribution - # (mu = 0, sigma = 1). - # (Lambert Meertens) - # (corrected version; bug discovered by Mike Miller, fixed by LM) - - # Multithreading note: When two threads call this function - # simultaneously, it is possible that they will receive the - # same return value. The window is very small though. To - # avoid this, you have to use a lock around all calls. (I - # didn't want to slow this down in the serial case by using a - # lock here.) - - random = self.random - z = self.gauss_next - self.gauss_next = None - if z is None: - x2pi = random() * TWOPI - g2rad = _sqrt(-2.0 * _log(1.0 - random())) - z = _cos(x2pi) * g2rad - self.gauss_next = _sin(x2pi) * g2rad - - return mu + z*sigma - -## -------------------- beta -------------------- -## See -## http://mail.python.org/pipermail/python-bugs-list/2001-January/003752.html -## for Ivan Frohne's insightful analysis of why the original implementation: -## -## def betavariate(self, alpha, beta): -## # Discrete Event Simulation in C, pp 87-88. -## -## y = self.expovariate(alpha) -## z = self.expovariate(1.0/beta) -## return z/(y+z) -## -## was dead wrong, and how it probably got that way. - def betavariate(self, alpha, beta): """Beta distribution. @@ -673,25 +725,32 @@ def betavariate(self, alpha, beta): Returned values range between 0 and 1. """ + ## See + ## http://mail.python.org/pipermail/python-bugs-list/2001-January/003752.html + ## for Ivan Frohne's insightful analysis of why the original implementation: + ## + ## def betavariate(self, alpha, beta): + ## # Discrete Event Simulation in C, pp 87-88. + ## + ## y = self.expovariate(alpha) + ## z = self.expovariate(1.0/beta) + ## return z/(y+z) + ## + ## was dead wrong, and how it probably got that way. # This version due to Janne Sinkkonen, and matches all the std # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution"). y = self.gammavariate(alpha, 1.0) - if y == 0: - return 0.0 - else: + if y: return y / (y + self.gammavariate(beta, 1.0)) - -## -------------------- Pareto -------------------- + return 0.0 def paretovariate(self, alpha): """Pareto distribution. alpha is the shape parameter.""" # Jain, pg. 495 u = 1.0 - self.random() - return 1.0 / u ** (1.0/alpha) - -## -------------------- Weibull -------------------- + return 1.0 / u ** (1.0 / alpha) def weibullvariate(self, alpha, beta): """Weibull distribution. @@ -702,16 +761,20 @@ def weibullvariate(self, alpha, beta): # Jain, pg. 499; bug fix courtesy Bill Arms u = 1.0 - self.random() - return alpha * (-_log(u)) ** (1.0/beta) + return alpha * (-_log(u)) ** (1.0 / beta) + +## ------------------------------------------------------------------ ## --------------- Operating System Random Source ------------------ + class SystemRandom(Random): """Alternate random number generator using sources provided by the operating system (such as /dev/urandom on Unix or CryptGenRandom on Windows). Not available on all systems (see os.urandom() for details). + """ def random(self): @@ -720,12 +783,18 @@ def random(self): def getrandbits(self, k): """getrandbits(k) -> x. Generates an int with k random bits.""" - if k <= 0: - raise ValueError('number of bits must be greater than zero') + if k < 0: + raise ValueError('number of bits must be non-negative') numbytes = (k + 7) // 8 # bits / 8 and rounded up x = int.from_bytes(_urandom(numbytes), 'big') return x >> (numbytes * 8 - k) # trim excess bits + def randbytes(self, n): + """Generate n random bytes.""" + # os.urandom(n) fails with ValueError for n < 0 + # and returns an empty bytes string for n == 0. + return _urandom(n) + def seed(self, *args, **kwds): "Stub method. Not used for a system random number generator." return None @@ -735,51 +804,11 @@ def _notimplemented(self, *args, **kwds): raise NotImplementedError('System entropy source does not have state.') getstate = setstate = _notimplemented -## -------------------- test program -------------------- - -def _test_generator(n, func, args): - import time - print(n, 'times', func.__name__) - total = 0.0 - sqsum = 0.0 - smallest = 1e10 - largest = -1e10 - t0 = time.perf_counter() - for i in range(n): - x = func(*args) - total += x - sqsum = sqsum + x*x - smallest = min(x, smallest) - largest = max(x, largest) - t1 = time.perf_counter() - print(round(t1-t0, 3), 'sec,', end=' ') - avg = total/n - stddev = _sqrt(sqsum/n - avg*avg) - print('avg %g, stddev %g, min %g, max %g\n' % \ - (avg, stddev, smallest, largest)) - - -def _test(N=2000): - _test_generator(N, random, ()) - _test_generator(N, normalvariate, (0.0, 1.0)) - _test_generator(N, lognormvariate, (0.0, 1.0)) - _test_generator(N, vonmisesvariate, (0.0, 1.0)) - _test_generator(N, gammavariate, (0.01, 1.0)) - _test_generator(N, gammavariate, (0.1, 1.0)) - _test_generator(N, gammavariate, (0.1, 2.0)) - _test_generator(N, gammavariate, (0.5, 1.0)) - _test_generator(N, gammavariate, (0.9, 1.0)) - _test_generator(N, gammavariate, (1.0, 1.0)) - _test_generator(N, gammavariate, (2.0, 1.0)) - _test_generator(N, gammavariate, (20.0, 1.0)) - _test_generator(N, gammavariate, (200.0, 1.0)) - _test_generator(N, gauss, (0.0, 1.0)) - _test_generator(N, betavariate, (3.0, 3.0)) - _test_generator(N, triangular, (0.0, 1.0, 1.0/3.0)) +# ---------------------------------------------------------------------- # Create one instance, seeded from current time, and export its methods # as module-level functions. The functions share state across all uses -#(both in the user's code and in the Python libraries), but that's fine +# (both in the user's code and in the Python libraries), but that's fine # for most programs and is easier for the casual user than making them # instantiate their own Random() instance. @@ -806,6 +835,50 @@ def _test(N=2000): getstate = _inst.getstate setstate = _inst.setstate getrandbits = _inst.getrandbits +randbytes = _inst.randbytes + + +## ------------------------------------------------------ +## ----------------- test program ----------------------- + +def _test_generator(n, func, args): + from statistics import stdev, fmean as mean + from time import perf_counter + + t0 = perf_counter() + data = [func(*args) for i in range(n)] + t1 = perf_counter() + + xbar = mean(data) + sigma = stdev(data, xbar) + low = min(data) + high = max(data) + + print(f'{t1 - t0:.3f} sec, {n} times {func.__name__}') + print('avg %g, stddev %g, min %g, max %g\n' % (xbar, sigma, low, high)) + + +def _test(N=2000): + _test_generator(N, random, ()) + _test_generator(N, normalvariate, (0.0, 1.0)) + _test_generator(N, lognormvariate, (0.0, 1.0)) + _test_generator(N, vonmisesvariate, (0.0, 1.0)) + _test_generator(N, gammavariate, (0.01, 1.0)) + _test_generator(N, gammavariate, (0.1, 1.0)) + _test_generator(N, gammavariate, (0.1, 2.0)) + _test_generator(N, gammavariate, (0.5, 1.0)) + _test_generator(N, gammavariate, (0.9, 1.0)) + _test_generator(N, gammavariate, (1.0, 1.0)) + _test_generator(N, gammavariate, (2.0, 1.0)) + _test_generator(N, gammavariate, (20.0, 1.0)) + _test_generator(N, gammavariate, (200.0, 1.0)) + _test_generator(N, gauss, (0.0, 1.0)) + _test_generator(N, betavariate, (3.0, 3.0)) + _test_generator(N, triangular, (0.0, 1.0, 1.0 / 3.0)) + + +## ------------------------------------------------------ +## ------------------ fork support --------------------- if hasattr(_os, "fork"): _os.register_at_fork(after_in_child=_inst.seed) diff --git a/Lib/runpy.py b/Lib/runpy.py index 0f54f3e71b6fe8ba9922e6d77dab607fd08073a1..7e1e1ac5dde2dfe6b906c53f54b9854aeeed90ab 100644 --- a/Lib/runpy.py +++ b/Lib/runpy.py @@ -133,6 +133,9 @@ def _get_module_details(mod_name, error=ImportError): # importlib, where the latter raises other errors for cases where # pkgutil previously raised ImportError msg = "Error while finding module specification for {!r} ({}: {})" + if mod_name.endswith(".py"): + msg += (f". Try using '{mod_name[:-3]}' instead of " + f"'{mod_name}' as the module name.") raise error(msg.format(mod_name, type(ex).__name__, ex)) from ex if spec is None: raise error("No module named %s" % mod_name) diff --git a/Lib/secrets.py b/Lib/secrets.py index 130434229e96a96dfacf1fc8b90dc98ef80d9bec..a546efbdd4204c81d0a8d8917dc539380fa77070 100644 --- a/Lib/secrets.py +++ b/Lib/secrets.py @@ -14,7 +14,6 @@ import base64 import binascii -import os from hmac import compare_digest from random import SystemRandom @@ -44,7 +43,7 @@ def token_bytes(nbytes=None): """ if nbytes is None: nbytes = DEFAULT_ENTROPY - return os.urandom(nbytes) + return _sysrand.randbytes(nbytes) def token_hex(nbytes=None): """Return a random text string, in hexadecimal. diff --git a/Lib/selectors.py b/Lib/selectors.py index a9a0801ef0713bc92eea7d165e87c5595caf9696..bb15a1cb1bada1ae70ad4fb2a0863017215754a0 100644 --- a/Lib/selectors.py +++ b/Lib/selectors.py @@ -57,6 +57,7 @@ def _fileobj_to_fd(fileobj): SelectorKey.data.__doc__ = ('''Optional opaque data associated to this file object. For example, this could be used to store a per-client session ID.''') + class _SelectorMapping(Mapping): """Mapping of file objects to selector keys.""" @@ -552,7 +553,10 @@ def unregister(self, fileobj): def select(self, timeout=None): timeout = None if timeout is None else max(timeout, 0) - max_ev = len(self._fd_to_key) + # If max_ev is 0, kqueue will ignore the timeout. For consistent + # behavior with the other selector classes, we prevent that here + # (using max). See https://bugs.python.org/issue29255 + max_ev = max(len(self._fd_to_key), 1) ready = [] try: kev_list = self._selector.control(None, max_ev, timeout) @@ -577,16 +581,39 @@ def close(self): super().close() +def _can_use(method): + """Check if we can use the selector depending upon the + operating system. """ + # Implementation based upon https://github.com/sethmlarson/selectors2/blob/master/selectors2.py + selector = getattr(select, method, None) + if selector is None: + # select module does not implement method + return False + # check if the OS and Kernel actually support the method. Call may fail with + # OSError: [Errno 38] Function not implemented + try: + selector_obj = selector() + if method == 'poll': + # check that poll actually works + selector_obj.poll(0) + else: + # close epoll, kqueue, and devpoll fd + selector_obj.close() + return True + except OSError: + return False + + # Choose the best implementation, roughly: # epoll|kqueue|devpoll > poll > select. # select() also can't accept a FD > FD_SETSIZE (usually around 1024) -if 'KqueueSelector' in globals(): +if _can_use('kqueue'): DefaultSelector = KqueueSelector -elif 'EpollSelector' in globals(): +elif _can_use('epoll'): DefaultSelector = EpollSelector -elif 'DevpollSelector' in globals(): +elif _can_use('devpoll'): DefaultSelector = DevpollSelector -elif 'PollSelector' in globals(): +elif _can_use('poll'): DefaultSelector = PollSelector else: DefaultSelector = SelectSelector diff --git a/Lib/shlex.py b/Lib/shlex.py index c817274583135a3a64711cd38801276fe395a2c7..4801a6c1d47bd9e0a8ada16089221c8237b777d5 100644 --- a/Lib/shlex.py +++ b/Lib/shlex.py @@ -304,6 +304,10 @@ def __next__(self): def split(s, comments=False, posix=True): """Split the string *s* using shell-like syntax.""" + if s is None: + import warnings + warnings.warn("Passing None for 's' to shlex.split() is deprecated.", + DeprecationWarning, stacklevel=2) lex = shlex(s, posix=posix) lex.whitespace_split = True if not comments: diff --git a/Lib/shutil.py b/Lib/shutil.py index 1f05d80f32a8fcb8a3895d4cb8f27c1c8dafa3b6..f0e833dc979b79b2094559c21f27260f62913c92 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -53,6 +53,9 @@ _USE_CP_SENDFILE = hasattr(os, "sendfile") and sys.platform.startswith("linux") _HAS_FCOPYFILE = posix and hasattr(posix, "_fcopyfile") # macOS +# CMD defaults in Windows 10 +_WIN_DEFAULT_PATHEXT = ".COM;.EXE;.BAT;.CMD;.VBS;.JS;.WS;.MSC" + __all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2", "copytree", "move", "rmtree", "Error", "SpecialFileError", "ExecError", "make_archive", "get_archive_formats", @@ -708,7 +711,7 @@ def onerror(*args): try: fd = os.open(path, os.O_RDONLY) except Exception: - onerror(os.lstat, path, sys.exc_info()) + onerror(os.open, path, sys.exc_info()) return try: if os.path.samestat(orig_st, os.fstat(fd)): @@ -741,8 +744,20 @@ def onerror(*args): rmtree.avoids_symlink_attacks = _use_fd_functions def _basename(path): - # A basename() variant which first strips the trailing slash, if present. - # Thus we always get the last component of the path, even for directories. + """A basename() variant which first strips the trailing slash, if present. + Thus we always get the last component of the path, even for directories. + + path: Union[PathLike, str] + + e.g. + >>> os.path.basename('/bar/foo') + 'foo' + >>> os.path.basename('/bar/foo/') + '' + >>> _basename('/bar/foo/') + 'foo' + """ + path = os.fspath(path) sep = os.path.sep + (os.path.altsep or '') return os.path.basename(path.rstrip(sep)) @@ -781,7 +796,10 @@ def move(src, dst, copy_function=copy2): os.rename(src, dst) return + # Using _basename instead of os.path.basename is important, as we must + # ignore any trailing slash to avoid the basename returning '' real_dst = os.path.join(dst, _basename(src)) + if os.path.exists(real_dst): raise Error("Destination path '%s' already exists" % real_dst) try: @@ -1400,7 +1418,9 @@ def which(cmd, mode=os.F_OK | os.X_OK, path=None): path.insert(0, curdir) # PATHEXT is necessary to check on Windows. - pathext = os.environ.get("PATHEXT", "").split(os.pathsep) + pathext_source = os.getenv("PATHEXT") or _WIN_DEFAULT_PATHEXT + pathext = [ext for ext in pathext_source.split(os.pathsep) if ext] + if use_bytes: pathext = [os.fsencode(ext) for ext in pathext] # See if the given file matches any of the expected path extensions. diff --git a/Lib/site.py b/Lib/site.py index 9fa21cca3866747ab3e074777e90e497c35a348d..9e617afb00f1e423e40c25197ae87f0681670cfb 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -334,13 +334,22 @@ def getsitepackages(prefixes=None): continue seen.add(prefix) + libdirs = [sys.platlibdir] + if sys.platlibdir != "lib": + libdirs.append("lib") + if os.sep == '/': - sitepackages.append(os.path.join(prefix, "lib", - "python%d.%d" % sys.version_info[:2], - "site-packages")) + for libdir in libdirs: + path = os.path.join(prefix, libdir, + "python%d.%d" % sys.version_info[:2], + "site-packages") + sitepackages.append(path) else: sitepackages.append(prefix) - sitepackages.append(os.path.join(prefix, "lib", "site-packages")) + + for libdir in libdirs: + path = os.path.join(prefix, libdir, "site-packages") + sitepackages.append(path) return sitepackages def addsitepackages(known_paths, prefixes=None): @@ -590,7 +599,7 @@ def _script(): Exit codes with --user-base or --user-site: 0 - user site directory is enabled 1 - user site directory is disabled by user - 2 - uses site directory is disabled by super user + 2 - user site directory is disabled by super user or for security reasons >2 - unknown error """ diff --git a/Lib/smtpd.py b/Lib/smtpd.py index 8103ca9af0d7b3f2fb20a02b34182d97ef30a8e3..8f1a22e937871d691dbe6b6182a4d9e032cd3630 100755 --- a/Lib/smtpd.py +++ b/Lib/smtpd.py @@ -779,6 +779,8 @@ def _deliver(self, mailfrom, rcpttos, data): class MailmanProxy(PureProxy): def __init__(self, *args, **kwargs): + warn('MailmanProxy is deprecated and will be removed ' + 'in future', DeprecationWarning, 2) if 'enable_SMTPUTF8' in kwargs and kwargs['enable_SMTPUTF8']: raise ValueError("MailmanProxy does not support SMTPUTF8.") super(PureProxy, self).__init__(*args, **kwargs) diff --git a/Lib/smtplib.py b/Lib/smtplib.py index 8e3d4bf0ccf3ae793f28253cda1d4a29f933a0ef..f0472317de9190b50476b2564a6da16933c77f0a 100755 --- a/Lib/smtplib.py +++ b/Lib/smtplib.py @@ -303,6 +303,8 @@ def _print_debug(self, *args): def _get_socket(self, host, port, timeout): # This makes it simpler for SMTP_SSL to use the SMTP connect code # and just alter the socket connection bit. + if timeout is not None and not timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') if self.debuglevel > 0: self._print_debug('connect: to', (host, port), self.source_address) return socket.create_connection((host, port), timeout, @@ -333,8 +335,6 @@ def connect(self, host='localhost', port=0, source_address=None): raise OSError("nonnumeric port") if not port: port = self.default_port - if self.debuglevel > 0: - self._print_debug('connect:', (host, port)) sys.audit("smtplib.connect", self, host, port) self.sock = self._get_socket(host, port, self.timeout) self.file = None @@ -1032,13 +1032,12 @@ def __init__(self, host='', port=0, local_hostname=None, keyfile=keyfile) self.context = context SMTP.__init__(self, host, port, local_hostname, timeout, - source_address) + source_address) def _get_socket(self, host, port, timeout): if self.debuglevel > 0: self._print_debug('connect:', (host, port)) - new_socket = socket.create_connection((host, port), timeout, - self.source_address) + new_socket = super()._get_socket(host, port, timeout) new_socket = self.context.wrap_socket(new_socket, server_hostname=self._host) return new_socket @@ -1067,19 +1066,24 @@ class LMTP(SMTP): ehlo_msg = "lhlo" def __init__(self, host='', port=LMTP_PORT, local_hostname=None, - source_address=None): + source_address=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT): """Initialize a new instance.""" - SMTP.__init__(self, host, port, local_hostname=local_hostname, - source_address=source_address) + super().__init__(host, port, local_hostname=local_hostname, + source_address=source_address, timeout=timeout) def connect(self, host='localhost', port=0, source_address=None): """Connect to the LMTP daemon, on either a Unix or a TCP socket.""" if host[0] != '/': - return SMTP.connect(self, host, port, source_address=source_address) + return super().connect(host, port, source_address=source_address) + + if self.timeout is not None and not self.timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') # Handle Unix-domain sockets. try: self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + if self.timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: + self.sock.settimeout(self.timeout) self.file = None self.sock.connect(host) except OSError: diff --git a/Lib/socket.py b/Lib/socket.py index f83f36d0ada55c71dc9397709153c06298b7c0cf..cafa573a30c0525522cf0377c35cbd83cba0fed1 100644 --- a/Lib/socket.py +++ b/Lib/socket.py @@ -12,6 +12,8 @@ socket() -- create a new socket object socketpair() -- create a pair of new socket objects [*] fromfd() -- create a socket object from an open file descriptor [*] +send_fds() -- Send file descriptor to the socket. +recv_fds() -- Recieve file descriptors from the socket. fromshare() -- create a socket object from data received from socket.share() [*] gethostname() -- return the current hostname gethostbyname() -- map a hostname to its IP number @@ -104,7 +106,6 @@ def _intenum_converter(value, enum_klass): except ValueError: return value -_realsocket = socket # WSA error codes if sys.platform.lower().startswith("win"): @@ -543,6 +544,40 @@ def fromfd(fd, family, type, proto=0): nfd = dup(fd) return socket(family, type, proto, nfd) +if hasattr(_socket.socket, "sendmsg"): + import array + + def send_fds(sock, buffers, fds, flags=0, address=None): + """ send_fds(sock, buffers, fds[, flags[, address]]) -> integer + + Send the list of file descriptors fds over an AF_UNIX socket. + """ + return sock.sendmsg(buffers, [(_socket.SOL_SOCKET, + _socket.SCM_RIGHTS, array.array("i", fds))]) + __all__.append("send_fds") + +if hasattr(_socket.socket, "recvmsg"): + import array + + def recv_fds(sock, bufsize, maxfds, flags=0): + """ recv_fds(sock, bufsize, maxfds[, flags]) -> (data, list of file + descriptors, msg_flags, address) + + Receive up to maxfds file descriptors returning the message + data and a list containing the descriptors. + """ + # Array of ints + fds = array.array("i") + msg, ancdata, flags, addr = sock.recvmsg(bufsize, + _socket.CMSG_LEN(maxfds * fds.itemsize)) + for cmsg_level, cmsg_type, cmsg_data in ancdata: + if (cmsg_level == _socket.SOL_SOCKET and cmsg_type == _socket.SCM_RIGHTS): + fds.frombytes(cmsg_data[: + len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) + + return msg, list(fds), flags, addr + __all__.append("recv_fds") + if hasattr(_socket.socket, "share"): def fromshare(info): """ fromshare(info) -> socket object diff --git a/Lib/socketserver.py b/Lib/socketserver.py index 1ad028fa4d08ca338e0b66bc5e6c116957bacec5..57c1ae6e9e8be187f6ed31aea8236761bb3d600f 100644 --- a/Lib/socketserver.py +++ b/Lib/socketserver.py @@ -374,7 +374,7 @@ def handle_error(self, request, client_address): """ print('-'*40, file=sys.stderr) - print('Exception happened during processing of request from', + print('Exception occurred during processing of request from', client_address, file=sys.stderr) import traceback traceback.print_exc() diff --git a/Lib/sqlite3/test/backup.py b/Lib/sqlite3/test/backup.py index 903bacf490301cbb9de1cbf7cf213797e3599fb6..ad1da9721527c2be86057b072194fc90a4774e84 100644 --- a/Lib/sqlite3/test/backup.py +++ b/Lib/sqlite3/test/backup.py @@ -36,6 +36,13 @@ def test_bad_target_closed_connection(self): with self.assertRaises(sqlite.ProgrammingError): self.cx.backup(bck) + def test_bad_source_closed_connection(self): + bck = sqlite.connect(':memory:') + source = sqlite.connect(":memory:") + source.close() + with self.assertRaises(sqlite.ProgrammingError): + source.backup(bck) + def test_bad_target_in_transaction(self): bck = sqlite.connect(':memory:') bck.execute('CREATE TABLE bar (key INTEGER)') diff --git a/Lib/sqlite3/test/dbapi.py b/Lib/sqlite3/test/dbapi.py index 7c259d2af418febcf8293723990cec38d077cca0..ad9c9f02a79a312d8f1d9ece993c45445cac6db2 100644 --- a/Lib/sqlite3/test/dbapi.py +++ b/Lib/sqlite3/test/dbapi.py @@ -230,7 +230,7 @@ def CheckExecuteTooMuchSql3(self): """) def CheckExecuteWrongSqlArg(self): - with self.assertRaises(ValueError): + with self.assertRaises(TypeError): self.cu.execute(42) def CheckExecuteArgInt(self): @@ -276,7 +276,7 @@ def CheckExecuteParamList(self): self.assertEqual(row[0], "foo") def CheckExecuteParamSequence(self): - class L(object): + class L: def __len__(self): return 1 def __getitem__(self, x): @@ -288,6 +288,18 @@ def __getitem__(self, x): row = self.cu.fetchone() self.assertEqual(row[0], "foo") + def CheckExecuteParamSequenceBadLen(self): + # Issue41662: Error in __len__() was overridden with ProgrammingError. + class L: + def __len__(self): + 1/0 + def __getitem__(slf, x): + raise AssertionError + + self.cu.execute("insert into test(name) values ('foo')") + with self.assertRaises(ZeroDivisionError): + self.cu.execute("select name from test where name=?", L()) + def CheckExecuteDictMapping(self): self.cu.execute("insert into test(name) values ('foo')") self.cu.execute("select name from test where name=:name", {"name": "foo"}) @@ -377,7 +389,7 @@ def mygen(): self.cu.executemany("insert into test(income) values (?)", mygen()) def CheckExecuteManyWrongSqlArg(self): - with self.assertRaises(ValueError): + with self.assertRaises(TypeError): self.cu.executemany(42, [(3,)]) def CheckExecuteManySelect(self): diff --git a/Lib/sqlite3/test/hooks.py b/Lib/sqlite3/test/hooks.py index d74e74bf2722754256cf82b55d9a90f174115072..214205c1167a411acc058c5b246168148bcd2fc4 100644 --- a/Lib/sqlite3/test/hooks.py +++ b/Lib/sqlite3/test/hooks.py @@ -265,6 +265,14 @@ def trace(statement): cur.execute(queries[0]) con2.execute("create table bar(x)") cur.execute(queries[1]) + + # Extract from SQLite 3.7.15 changelog: + # Avoid invoking the sqlite3_trace() callback multiple times when a + # statement is automatically reprepared due to SQLITE_SCHEMA errors. + # + # See bpo-40810 + if sqlite.sqlite_version_info < (3, 7, 15): + queries.append(queries[-1]) self.assertEqual(traced_statements, queries) diff --git a/Lib/sqlite3/test/regression.py b/Lib/sqlite3/test/regression.py index ce97655c66be8754c65b64e34358b15175650254..6aa86d5766e56843a836d5e6a1edaa6ad11ee9aa 100644 --- a/Lib/sqlite3/test/regression.py +++ b/Lib/sqlite3/test/regression.py @@ -133,6 +133,19 @@ def CheckTypeMapUsage(self): con.execute("insert into foo(bar) values (5)") con.execute(SELECT) + def CheckBindMutatingList(self): + # Issue41662: Crash when mutate a list of parameters during iteration. + class X: + def __conform__(self, protocol): + parameters.clear() + return "..." + parameters = [X(), 0] + con = sqlite.connect(":memory:",detect_types=sqlite.PARSE_DECLTYPES) + con.execute("create table foo(bar X, baz integer)") + # Should not crash + with self.assertRaises(IndexError): + con.execute("insert into foo(bar, baz) values (?, ?)", parameters) + def CheckErrorMsgDecodeError(self): # When porting the module to Python 3.0, the error message about # decoding errors disappeared. This verifies they're back again. @@ -262,7 +275,7 @@ def CheckConnectionCall(self): Call a connection with a non-string SQL request: check error handling of the statement constructor. """ - self.assertRaises(sqlite.Warning, self.con, 1) + self.assertRaises(TypeError, self.con, 1) def CheckCollation(self): def collation_cb(a, b): diff --git a/Lib/ssl.py b/Lib/ssl.py index 0726caee49aa579d5eb6d05c01f8aa0b04b17cb5..30f4e5934febf9c89493a43300134a6b3b6fa16b 100644 --- a/Lib/ssl.py +++ b/Lib/ssl.py @@ -252,7 +252,7 @@ class _TLSMessageType(_IntEnum): if sys.platform == "win32": from _ssl import enum_certificates, enum_crls -from socket import socket, AF_INET, SOCK_STREAM, create_connection +from socket import socket, SOCK_STREAM, create_connection from socket import SOL_SOCKET, SO_TYPE import socket as _socket import base64 # for DER-to-PEM translation diff --git a/Lib/statistics.py b/Lib/statistics.py index c5c6e47fb3f3eb3fb10a37e52d46f9f43fc7eea8..f9d3802ec5f83e2d777fbbad2a2dd4ed28ccd35d 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -163,7 +163,7 @@ def _sum(data, start=0): T = _coerce(int, type(start)) for typ, values in groupby(data, type): T = _coerce(T, typ) # or raise TypeError - for n,d in map(_exact_ratio, values): + for n, d in map(_exact_ratio, values): count += 1 partials[d] = partials_get(d, 0) + n if None in partials: @@ -261,7 +261,7 @@ def _convert(value, T): return T(value) except TypeError: if issubclass(T, Decimal): - return T(value.numerator)/T(value.denominator) + return T(value.numerator) / T(value.denominator) else: raise @@ -277,8 +277,8 @@ def _find_lteq(a, x): def _find_rteq(a, l, x): 'Locate the rightmost value exactly equal to x' i = bisect_right(a, x, lo=l) - if i != (len(a)+1) and a[i-1] == x: - return i-1 + if i != (len(a) + 1) and a[i - 1] == x: + return i - 1 raise ValueError @@ -315,7 +315,7 @@ def mean(data): raise StatisticsError('mean requires at least one data point') T, total, count = _sum(data) assert count == n - return _convert(total/n, T) + return _convert(total / n, T) def fmean(data): @@ -403,11 +403,11 @@ def harmonic_mean(data): else: raise TypeError('unsupported type') try: - T, total, count = _sum(1/x for x in _fail_neg(data, errmsg)) + T, total, count = _sum(1 / x for x in _fail_neg(data, errmsg)) except ZeroDivisionError: return 0 assert count == n - return _convert(n/total, T) + return _convert(n / total, T) # FIXME: investigate ways to calculate medians without sorting? Quickselect? @@ -428,11 +428,11 @@ def median(data): n = len(data) if n == 0: raise StatisticsError("no median for empty data") - if n%2 == 1: - return data[n//2] + if n % 2 == 1: + return data[n // 2] else: - i = n//2 - return (data[i - 1] + data[i])/2 + i = n // 2 + return (data[i - 1] + data[i]) / 2 def median_low(data): @@ -451,10 +451,10 @@ def median_low(data): n = len(data) if n == 0: raise StatisticsError("no median for empty data") - if n%2 == 1: - return data[n//2] + if n % 2 == 1: + return data[n // 2] else: - return data[n//2 - 1] + return data[n // 2 - 1] def median_high(data): @@ -473,7 +473,7 @@ def median_high(data): n = len(data) if n == 0: raise StatisticsError("no median for empty data") - return data[n//2] + return data[n // 2] def median_grouped(data, interval=1): @@ -510,15 +510,15 @@ class 3.5-4.5, and interpolation is used to estimate it. return data[0] # Find the value at the midpoint. Remember this corresponds to the # centre of the class interval. - x = data[n//2] + x = data[n // 2] for obj in (x, interval): if isinstance(obj, (str, bytes)): raise TypeError('expected number but got %r' % obj) try: - L = x - interval/2 # The lower limit of the median interval. + L = x - interval / 2 # The lower limit of the median interval. except TypeError: # Mixed type. For now we just coerce to float. - L = float(x) - float(interval)/2 + L = float(x) - float(interval) / 2 # Uses bisection search to search for x in data with log(n) time complexity # Find the position of leftmost occurrence of x in data @@ -528,7 +528,7 @@ class 3.5-4.5, and interpolation is used to estimate it. l2 = _find_rteq(data, l1, x) cf = l1 f = l2 - l1 + 1 - return L + interval*(n/2 - cf)/f + return L + interval * (n / 2 - cf) / f def mode(data): @@ -554,8 +554,7 @@ def mode(data): If *data* is empty, ``mode``, raises StatisticsError. """ - data = iter(data) - pairs = Counter(data).most_common(1) + pairs = Counter(iter(data)).most_common(1) try: return pairs[0][0] except IndexError: @@ -597,7 +596,7 @@ def multimode(data): # For sample data where there is a positive probability for values # beyond the range of the data, the R6 exclusive method is a # reasonable choice. Consider a random sample of nine values from a -# population with a uniform distribution from 0.0 to 100.0. The +# population with a uniform distribution from 0.0 to 1.0. The # distribution of the third ranked sample point is described by # betavariate(alpha=3, beta=7) which has mode=0.250, median=0.286, and # mean=0.300. Only the latter (which corresponds with R6) gives the @@ -643,9 +642,8 @@ def quantiles(data, *, n=4, method='exclusive'): m = ld - 1 result = [] for i in range(1, n): - j = i * m // n - delta = i*m - j*n - interpolated = (data[j] * (n - delta) + data[j+1] * delta) / n + j, delta = divmod(i * m, n) + interpolated = (data[j] * (n - delta) + data[j + 1] * delta) / n result.append(interpolated) return result if method == 'exclusive': @@ -655,7 +653,7 @@ def quantiles(data, *, n=4, method='exclusive'): j = i * m // n # rescale i to m/n j = 1 if j < 1 else ld-1 if j > ld-1 else j # clamp to 1 .. ld-1 delta = i*m - j*n # exact integer math - interpolated = (data[j-1] * (n - delta) + data[j] * delta) / n + interpolated = (data[j - 1] * (n - delta) + data[j] * delta) / n result.append(interpolated) return result raise ValueError(f'Unknown method: {method!r}') @@ -689,9 +687,9 @@ def _ss(data, c=None): T, total, count = _sum((x-c)**2 for x in data) # The following sum should mathematically equal zero, but due to rounding # error may not. - U, total2, count2 = _sum((x-c) for x in data) + U, total2, count2 = _sum((x - c) for x in data) assert T == U and count == count2 - total -= total2**2/len(data) + total -= total2 ** 2 / len(data) assert not total < 0, 'negative sum of square deviations: %f' % total return (T, total) @@ -740,7 +738,7 @@ def variance(data, xbar=None): if n < 2: raise StatisticsError('variance requires at least two data points') T, ss = _ss(data, xbar) - return _convert(ss/(n-1), T) + return _convert(ss / (n - 1), T) def pvariance(data, mu=None): @@ -784,7 +782,7 @@ def pvariance(data, mu=None): if n < 1: raise StatisticsError('pvariance requires at least one data point') T, ss = _ss(data, mu) - return _convert(ss/n, T) + return _convert(ss / n, T) def stdev(data, xbar=None): @@ -896,6 +894,13 @@ def _normal_dist_inv_cdf(p, mu, sigma): return mu + (x * sigma) +# If available, use C implementation +try: + from _statistics import _normal_dist_inv_cdf +except ImportError: + pass + + class NormalDist: "Normal distribution of a random variable" # https://en.wikipedia.org/wiki/Normal_distribution @@ -986,7 +991,7 @@ def overlap(self, other): if not isinstance(other, NormalDist): raise TypeError('Expected another NormalDist instance') X, Y = self, other - if (Y._sigma, Y._mu) < (X._sigma, X._mu): # sort to assure commutativity + if (Y._sigma, Y._mu) < (X._sigma, X._mu): # sort to assure commutativity X, Y = Y, X X_var, Y_var = X.variance, Y.variance if not X_var or not Y_var: @@ -1001,6 +1006,17 @@ def overlap(self, other): x2 = (a - b) / dv return 1.0 - (fabs(Y.cdf(x1) - X.cdf(x1)) + fabs(Y.cdf(x2) - X.cdf(x2))) + def zscore(self, x): + """Compute the Standard Score. (x - mean) / stdev + + Describes *x* in terms of the number of standard deviations + above or below the mean of the normal distribution. + """ + # https://www.statisticshowto.com/probability-and-statistics/z-score/ + if not self._sigma: + raise StatisticsError('zscore() not defined when sigma is zero') + return (x - self._mu) / self._sigma + @property def mean(self): "Arithmetic mean of the normal distribution." @@ -1102,79 +1118,3 @@ def __hash__(self): def __repr__(self): return f'{type(self).__name__}(mu={self._mu!r}, sigma={self._sigma!r})' - -# If available, use C implementation -try: - from _statistics import _normal_dist_inv_cdf -except ImportError: - pass - - -if __name__ == '__main__': - - # Show math operations computed analytically in comparsion - # to a monte carlo simulation of the same operations - - from math import isclose - from operator import add, sub, mul, truediv - from itertools import repeat - import doctest - - g1 = NormalDist(10, 20) - g2 = NormalDist(-5, 25) - - # Test scaling by a constant - assert (g1 * 5 / 5).mean == g1.mean - assert (g1 * 5 / 5).stdev == g1.stdev - - n = 100_000 - G1 = g1.samples(n) - G2 = g2.samples(n) - - for func in (add, sub): - print(f'\nTest {func.__name__} with another NormalDist:') - print(func(g1, g2)) - print(NormalDist.from_samples(map(func, G1, G2))) - - const = 11 - for func in (add, sub, mul, truediv): - print(f'\nTest {func.__name__} with a constant:') - print(func(g1, const)) - print(NormalDist.from_samples(map(func, G1, repeat(const)))) - - const = 19 - for func in (add, sub, mul): - print(f'\nTest constant with {func.__name__}:') - print(func(const, g1)) - print(NormalDist.from_samples(map(func, repeat(const), G1))) - - def assert_close(G1, G2): - assert isclose(G1.mean, G1.mean, rel_tol=0.01), (G1, G2) - assert isclose(G1.stdev, G2.stdev, rel_tol=0.01), (G1, G2) - - X = NormalDist(-105, 73) - Y = NormalDist(31, 47) - s = 32.75 - n = 100_000 - - S = NormalDist.from_samples([x + s for x in X.samples(n)]) - assert_close(X + s, S) - - S = NormalDist.from_samples([x - s for x in X.samples(n)]) - assert_close(X - s, S) - - S = NormalDist.from_samples([x * s for x in X.samples(n)]) - assert_close(X * s, S) - - S = NormalDist.from_samples([x / s for x in X.samples(n)]) - assert_close(X / s, S) - - S = NormalDist.from_samples([x + y for x, y in zip(X.samples(n), - Y.samples(n))]) - assert_close(X + Y, S) - - S = NormalDist.from_samples([x - y for x, y in zip(X.samples(n), - Y.samples(n))]) - assert_close(X - Y, S) - - print(doctest.testmod()) diff --git a/Lib/string.py b/Lib/string.py index b423ff5dc6f69f022fa153d2c1459639f7ae250a..489777b10c25df7ea1c53444f0df800022af56b4 100644 --- a/Lib/string.py +++ b/Lib/string.py @@ -54,30 +54,7 @@ def capwords(s, sep=None): _sentinel_dict = {} -class _TemplateMetaclass(type): - pattern = r""" - %(delim)s(?: - (?P%(delim)s) | # Escape sequence of two delimiters - (?P%(id)s) | # delimiter and a Python identifier - {(?P%(bid)s)} | # delimiter and a braced identifier - (?P) # Other ill-formed delimiter exprs - ) - """ - - def __init__(cls, name, bases, dct): - super(_TemplateMetaclass, cls).__init__(name, bases, dct) - if 'pattern' in dct: - pattern = cls.pattern - else: - pattern = _TemplateMetaclass.pattern % { - 'delim' : _re.escape(cls.delimiter), - 'id' : cls.idpattern, - 'bid' : cls.braceidpattern or cls.idpattern, - } - cls.pattern = _re.compile(pattern, cls.flags | _re.VERBOSE) - - -class Template(metaclass=_TemplateMetaclass): +class Template: """A string class for supporting $-substitutions.""" delimiter = '$' @@ -89,6 +66,24 @@ class Template(metaclass=_TemplateMetaclass): braceidpattern = None flags = _re.IGNORECASE + def __init_subclass__(cls): + super().__init_subclass__() + if 'pattern' in cls.__dict__: + pattern = cls.pattern + else: + delim = _re.escape(cls.delimiter) + id = cls.idpattern + bid = cls.braceidpattern or cls.idpattern + pattern = fr""" + {delim}(?: + (?P{delim}) | # Escape sequence of two delimiters + (?P{id}) | # delimiter and a Python identifier + {{(?P{bid})}} | # delimiter and a braced identifier + (?P) # Other ill-formed delimiter exprs + ) + """ + cls.pattern = _re.compile(pattern, cls.flags | _re.VERBOSE) + def __init__(self, template): self.template = template @@ -146,6 +141,9 @@ def convert(mo): self.pattern) return self.pattern.sub(convert, self.template) +# Initialize Template.pattern. __init_subclass__() is automatically called +# only for subclasses, not for the Template class itself. +Template.__init_subclass__() ######################################################################## diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 5c2c2f05093f7e3a71aa1f6cde8abd2f336dbac5..ddf1128fdd1c78ec32690e78502d3afc405fb378 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -52,7 +52,16 @@ import warnings import contextlib from time import monotonic as _time +import types +try: + import pwd +except ImportError: + pwd = None +try: + import grp +except ImportError: + grp = None __all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "getstatusoutput", "getoutput", "check_output", "run", "CalledProcessError", "DEVNULL", @@ -317,7 +326,7 @@ def _args_from_interpreter_flags(): if dev_mode: args.extend(('-X', 'dev')) for opt in ('faulthandler', 'tracemalloc', 'importtime', - 'showalloccount', 'showrefcount', 'utf8'): + 'showrefcount', 'utf8', 'oldparser'): if opt in xoptions: value = xoptions[opt] if value is True: @@ -406,7 +415,11 @@ def check_output(*popenargs, timeout=None, **kwargs): if 'input' in kwargs and kwargs['input'] is None: # Explicitly passing input=None was previously equivalent to passing an # empty string. That is maintained here for backwards compatibility. - kwargs['input'] = '' if kwargs.get('universal_newlines', False) else b'' + if kwargs.get('universal_newlines') or kwargs.get('text'): + empty = '' + else: + empty = b'' + kwargs['input'] = empty return run(*popenargs, stdout=PIPE, timeout=timeout, check=True, **kwargs).stdout @@ -438,6 +451,9 @@ def __repr__(self): args.append('stderr={!r}'.format(self.stderr)) return "{}({})".format(type(self).__name__, ', '.join(args)) + __class_getitem__ = classmethod(types.GenericAlias) + + def check_returncode(self): """Raise CalledProcessError if the exit code is non-zero.""" if self.returncode: @@ -719,6 +735,14 @@ class Popen(object): start_new_session (POSIX only) + group (POSIX only) + + extra_groups (POSIX only) + + user (POSIX only) + + umask (POSIX only) + pass_fds (POSIX only) encoding and errors: Text mode encoding and error handling to use for @@ -735,7 +759,8 @@ def __init__(self, args, bufsize=-1, executable=None, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, - pass_fds=(), *, encoding=None, errors=None, text=None): + pass_fds=(), *, user=None, group=None, extra_groups=None, + encoding=None, errors=None, text=None, umask=-1): """Create new Popen instance.""" _cleanup() # Held while anything is calling waitpid before returncode has been @@ -833,6 +858,78 @@ def __init__(self, args, bufsize=-1, executable=None, else: line_buffering = False + gid = None + if group is not None: + if not hasattr(os, 'setregid'): + raise ValueError("The 'group' parameter is not supported on the " + "current platform") + + elif isinstance(group, str): + if grp is None: + raise ValueError("The group parameter cannot be a string " + "on systems without the grp module") + + gid = grp.getgrnam(group).gr_gid + elif isinstance(group, int): + gid = group + else: + raise TypeError("Group must be a string or an integer, not {}" + .format(type(group))) + + if gid < 0: + raise ValueError(f"Group ID cannot be negative, got {gid}") + + gids = None + if extra_groups is not None: + if not hasattr(os, 'setgroups'): + raise ValueError("The 'extra_groups' parameter is not " + "supported on the current platform") + + elif isinstance(extra_groups, str): + raise ValueError("Groups must be a list, not a string") + + gids = [] + for extra_group in extra_groups: + if isinstance(extra_group, str): + if grp is None: + raise ValueError("Items in extra_groups cannot be " + "strings on systems without the " + "grp module") + + gids.append(grp.getgrnam(extra_group).gr_gid) + elif isinstance(extra_group, int): + gids.append(extra_group) + else: + raise TypeError("Items in extra_groups must be a string " + "or integer, not {}" + .format(type(extra_group))) + + # make sure that the gids are all positive here so we can do less + # checking in the C code + for gid_check in gids: + if gid_check < 0: + raise ValueError(f"Group ID cannot be negative, got {gid_check}") + + uid = None + if user is not None: + if not hasattr(os, 'setreuid'): + raise ValueError("The 'user' parameter is not supported on " + "the current platform") + + elif isinstance(user, str): + if pwd is None: + raise ValueError("The user parameter cannot be a string " + "on systems without the pwd module") + + uid = pwd.getpwnam(user).pw_uid + elif isinstance(user, int): + uid = user + else: + raise TypeError("User must be a string or an integer") + + if uid < 0: + raise ValueError(f"User ID cannot be negative, got {uid}") + try: if p2cwrite != -1: self.stdin = io.open(p2cwrite, 'wb', bufsize) @@ -857,7 +954,9 @@ def __init__(self, args, bufsize=-1, executable=None, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, - restore_signals, start_new_session) + restore_signals, + gid, gids, uid, umask, + start_new_session) except: # Cleanup if the child failed starting. for f in filter(None, (self.stdin, self.stdout, self.stderr)): @@ -887,6 +986,17 @@ def __init__(self, args, bufsize=-1, executable=None, raise + def __repr__(self): + obj_repr = ( + f"<{self.__class__.__name__}: " + f"returncode: {self.returncode} args: {list(self.args)!r}>" + ) + if len(obj_repr) > 80: + obj_repr = obj_repr[:76] + "...>" + return obj_repr + + __class_getitem__ = classmethod(types.GenericAlias) + @property def universal_newlines(self): # universal_newlines as retained as an alias of text_mode for API @@ -1227,7 +1337,10 @@ def _execute_child(self, args, executable, preexec_fn, close_fds, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, - unused_restore_signals, unused_start_new_session): + unused_restore_signals, + unused_gid, unused_gids, unused_uid, + unused_umask, + unused_start_new_session): """Execute program (MS Windows version)""" assert not pass_fds, "pass_fds not supported on Windows." @@ -1553,7 +1666,9 @@ def _execute_child(self, args, executable, preexec_fn, close_fds, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, - restore_signals, start_new_session): + restore_signals, + gid, gids, uid, umask, + start_new_session): """Execute program (POSIX version)""" if isinstance(args, (str, bytes)): @@ -1588,7 +1703,11 @@ def _execute_child(self, args, executable, preexec_fn, close_fds, and (p2cread == -1 or p2cread > 2) and (c2pwrite == -1 or c2pwrite > 2) and (errwrite == -1 or errwrite > 2) - and not start_new_session): + and not start_new_session + and gid is None + and gids is None + and uid is None + and umask < 0): self._posix_spawn(args, executable, env, restore_signals, p2cread, p2cwrite, c2pread, c2pwrite, @@ -1641,7 +1760,9 @@ def _execute_child(self, args, executable, preexec_fn, close_fds, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, - restore_signals, start_new_session, preexec_fn) + restore_signals, start_new_session, + gid, gids, uid, umask, + preexec_fn) self._child_created = True finally: # be sure the FD is closed no matter what @@ -1703,23 +1824,17 @@ def _execute_child(self, args, executable, preexec_fn, close_fds, raise child_exception_type(err_msg) - def _handle_exitstatus(self, sts, _WIFSIGNALED=os.WIFSIGNALED, - _WTERMSIG=os.WTERMSIG, _WIFEXITED=os.WIFEXITED, - _WEXITSTATUS=os.WEXITSTATUS, _WIFSTOPPED=os.WIFSTOPPED, - _WSTOPSIG=os.WSTOPSIG): + def _handle_exitstatus(self, sts, + waitstatus_to_exitcode=os.waitstatus_to_exitcode, + _WIFSTOPPED=os.WIFSTOPPED, + _WSTOPSIG=os.WSTOPSIG): """All callers to this function MUST hold self._waitpid_lock.""" # This method is called (indirectly) by __del__, so it cannot # refer to anything outside of its local scope. - if _WIFSIGNALED(sts): - self.returncode = -_WTERMSIG(sts) - elif _WIFEXITED(sts): - self.returncode = _WEXITSTATUS(sts) - elif _WIFSTOPPED(sts): + if _WIFSTOPPED(sts): self.returncode = -_WSTOPSIG(sts) else: - # Should never happen - raise SubprocessError("Unknown child exit status!") - + self.returncode = waitstatus_to_exitcode(sts) def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid, _WNOHANG=os.WNOHANG, _ECHILD=errno.ECHILD): @@ -1926,9 +2041,35 @@ def _save_input(self, input): def send_signal(self, sig): """Send a signal to the process.""" - # Skip signalling a process that we know has already died. - if self.returncode is None: + # bpo-38630: Polling reduces the risk of sending a signal to the + # wrong process if the process completed, the Popen.returncode + # attribute is still None, and the pid has been reassigned + # (recycled) to a new different process. This race condition can + # happens in two cases. + # + # Case 1. Thread A calls Popen.poll(), thread B calls + # Popen.send_signal(). In thread A, waitpid() succeed and returns + # the exit status. Thread B calls kill() because poll() in thread A + # did not set returncode yet. Calling poll() in thread B prevents + # the race condition thanks to Popen._waitpid_lock. + # + # Case 2. waitpid(pid, 0) has been called directly, without + # using Popen methods: returncode is still None is this case. + # Calling Popen.poll() will set returncode to a default value, + # since waitpid() fails with ProcessLookupError. + self.poll() + if self.returncode is not None: + # Skip signalling a process that we know has already died. + return + + # The race condition can still happen if the race condition + # described above happens between the returncode test + # and the kill() call. + try: os.kill(self.pid, sig) + except ProcessLookupError: + # Supress the race condition error; bpo-40550. + pass def terminate(self): """Terminate the process with SIGTERM diff --git a/Lib/sunau.py b/Lib/sunau.py index 129502b0b4177ad42f4555004819adb5dd82be3d..79750a9d23ebde13ac82e01be647fd151266b79c 100644 --- a/Lib/sunau.py +++ b/Lib/sunau.py @@ -104,7 +104,7 @@ """ from collections import namedtuple -import warnings + _sunau_params = namedtuple('_sunau_params', 'nchannels sampwidth framerate nframes comptype compname') @@ -524,8 +524,3 @@ def open(f, mode=None): return Au_write(f) else: raise Error("mode must be 'r', 'rb', 'w', or 'wb'") - -def openfp(f, mode=None): - warnings.warn("sunau.openfp is deprecated since Python 3.7. " - "Use sunau.open instead.", DeprecationWarning, stacklevel=2) - return open(f, mode=mode) diff --git a/Lib/symbol.py b/Lib/symbol.py index 36e0eec7ac1f5df02a51a69c67357df2d9509243..aaac8c914431bb80242adcf65dd92a6c37af55f3 100644 --- a/Lib/symbol.py +++ b/Lib/symbol.py @@ -11,6 +11,15 @@ # # make regen-symbol +import warnings + +warnings.warn( + "The symbol module is deprecated and will be removed " + "in future versions of Python", + DeprecationWarning, + stacklevel=2, +) + #--start constants-- single_input = 256 file_input = 257 diff --git a/Lib/symtable.py b/Lib/symtable.py index ac0a64ff58f795ad1a50aa750f2703136e01bf64..521540fe9eeec6849252221e729e5e6d671b398a 100644 --- a/Lib/symtable.py +++ b/Lib/symtable.py @@ -34,7 +34,7 @@ def __call__(self, table, filename): _newSymbolTable = SymbolTableFactory() -class SymbolTable(object): +class SymbolTable: def __init__(self, raw_table, filename): self._table = raw_table @@ -47,7 +47,7 @@ def __repr__(self): else: kind = "%s " % self.__class__.__name__ - if self._table.name == "global": + if self._table.name == "top": return "<{0}SymbolTable for module {1}>".format(kind, self._filename) else: return "<{0}SymbolTable for {1} in {2}>".format(kind, @@ -82,10 +82,6 @@ def is_nested(self): def has_children(self): return bool(self._table.children) - def has_exec(self): - """Return true if the scope uses exec. Deprecated method.""" - return False - def get_identifiers(self): return self._table.symbols.keys() @@ -94,7 +90,9 @@ def lookup(self, name): if sym is None: flags = self._table.symbols[name] namespaces = self.__check_children(name) - sym = self._symbols[name] = Symbol(name, flags, namespaces) + module_scope = (self._table.name == "top") + sym = self._symbols[name] = Symbol(name, flags, namespaces, + module_scope=module_scope) return sym def get_symbols(self): @@ -167,13 +165,14 @@ def get_methods(self): return self.__methods -class Symbol(object): +class Symbol: - def __init__(self, name, flags, namespaces=None): + def __init__(self, name, flags, namespaces=None, *, module_scope=False): self.__name = name self.__flags = flags self.__scope = (flags >> SCOPE_OFF) & SCOPE_MASK # like PyST_GetScope() self.__namespaces = namespaces or () + self.__module_scope = module_scope def __repr__(self): return "".format(self.__name) @@ -188,7 +187,10 @@ def is_parameter(self): return bool(self.__flags & DEF_PARAM) def is_global(self): - return bool(self.__scope in (GLOBAL_IMPLICIT, GLOBAL_EXPLICIT)) + """Return *True* if the sysmbol is global. + """ + return bool(self.__scope in (GLOBAL_IMPLICIT, GLOBAL_EXPLICIT) + or (self.__module_scope and self.__flags & DEF_BOUND)) def is_nonlocal(self): return bool(self.__flags & DEF_NONLOCAL) @@ -197,7 +199,10 @@ def is_declared_global(self): return bool(self.__scope == GLOBAL_EXPLICIT) def is_local(self): - return bool(self.__scope in (LOCAL, CELL)) + """Return *True* if the symbol is local. + """ + return bool(self.__scope in (LOCAL, CELL) + or (self.__module_scope and self.__flags & DEF_BOUND)) def is_annotated(self): return bool(self.__flags & DEF_ANNOT) diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index b9e2fafbc084a6bb79cda951d72c885047ecfb14..e3f79bfde52948d4b49d11e732a90e2a06c0f1cf 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -18,12 +18,17 @@ 'parse_config_h', ] +# Keys for get_config_var() that are never converted to Python integers. +_ALWAYS_STR = { + 'MACOSX_DEPLOYMENT_TARGET', +} + _INSTALL_SCHEMES = { 'posix_prefix': { - 'stdlib': '{installed_base}/lib/python{py_version_short}', - 'platstdlib': '{platbase}/lib/python{py_version_short}', + 'stdlib': '{installed_base}/{platlibdir}/python{py_version_short}', + 'platstdlib': '{platbase}/{platlibdir}/python{py_version_short}', 'purelib': '{base}/lib/python{py_version_short}/site-packages', - 'platlib': '{platbase}/lib/python{py_version_short}/site-packages', + 'platlib': '{platbase}/{platlibdir}/python{py_version_short}/site-packages', 'include': '{installed_base}/include/python{py_version_short}{abiflags}', 'platinclude': @@ -62,10 +67,10 @@ 'data': '{userbase}', }, 'posix_user': { - 'stdlib': '{userbase}/lib/python{py_version_short}', - 'platstdlib': '{userbase}/lib/python{py_version_short}', + 'stdlib': '{userbase}/{platlibdir}/python{py_version_short}', + 'platstdlib': '{userbase}/{platlibdir}/python{py_version_short}', 'purelib': '{userbase}/lib/python{py_version_short}/site-packages', - 'platlib': '{userbase}/lib/python{py_version_short}/site-packages', + 'platlib': '{userbase}/{platlibdir}/python{py_version_short}/site-packages', 'include': '{userbase}/include/python{py_version_short}', 'scripts': '{userbase}/bin', 'data': '{userbase}', @@ -84,8 +89,6 @@ _SCHEME_KEYS = ('stdlib', 'platstdlib', 'purelib', 'platlib', 'include', 'scripts', 'data') - # FIXME don't rely on sys.version here, its format is an implementation detail - # of CPython, use sys.version_info or sys.hexversion _PY_VERSION = sys.version.split()[0] _PY_VERSION_SHORT = '%d.%d' % sys.version_info[:2] _PY_VERSION_SHORT_NO_DOT = '%d%d' % sys.version_info[:2] @@ -242,6 +245,9 @@ def _parse_makefile(filename, vars=None): notdone[n] = v else: try: + if n in _ALWAYS_STR: + raise ValueError + v = int(v) except ValueError: # insert literal `$' @@ -300,6 +306,8 @@ def _parse_makefile(filename, vars=None): notdone[name] = value else: try: + if name in _ALWAYS_STR: + raise ValueError value = int(value) except ValueError: done[name] = value.strip() @@ -426,10 +434,11 @@ def _init_posix(vars): def _init_non_posix(vars): """Initialize the module as appropriate for NT""" # set basic install directories + import _imp vars['LIBDEST'] = get_path('stdlib') vars['BINLIBDEST'] = get_path('platstdlib') vars['INCLUDEPY'] = get_path('include') - vars['EXT_SUFFIX'] = '.pyd' + vars['EXT_SUFFIX'] = _imp.extension_suffixes()[0] vars['EXE'] = '.exe' vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) @@ -460,6 +469,8 @@ def parse_config_h(fp, vars=None): if m: n, v = m.group(1, 2) try: + if n in _ALWAYS_STR: + raise ValueError v = int(v) except ValueError: pass @@ -539,6 +550,7 @@ def get_config_vars(*args): _CONFIG_VARS['installed_platbase'] = _BASE_EXEC_PREFIX _CONFIG_VARS['platbase'] = _EXEC_PREFIX _CONFIG_VARS['projectbase'] = _PROJECT_BASE + _CONFIG_VARS['platlibdir'] = sys.platlibdir try: _CONFIG_VARS['abiflags'] = sys.abiflags except AttributeError: @@ -547,6 +559,7 @@ def get_config_vars(*args): if os.name == 'nt': _init_non_posix(_CONFIG_VARS) + _CONFIG_VARS['TZPATH'] = '' if os.name == 'posix': _init_posix(_CONFIG_VARS) # For backward compatibility, see issue19555 @@ -665,7 +678,8 @@ def get_platform(): machine += ".%s" % bitness[sys.maxsize] # fall through to standard osname-release-machine representation elif osname[:3] == "aix": - return "%s-%s.%s" % (osname, version, release) + from _aix_support import aix_platform + return aix_platform() elif osname[:6] == "cygwin": osname = "cygwin" import re diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 7a69e1b1aa54404ebb309073a950398926cf393f..1d15612616f1d8ca7ec3d21c028b8495bbe87302 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -420,6 +420,8 @@ def _init_write_gz(self): self.__write(b"\037\213\010\010" + timestamp + b"\002\377") if self.name.endswith(".gz"): self.name = self.name[:-3] + # Honor "directory components removed" from RFC1952 + self.name = os.path.basename(self.name) # RFC1952 says we must use ISO-8859-1 for the FNAME field. self.__write(self.name.encode("iso-8859-1", "replace") + NUL) @@ -930,6 +932,14 @@ def _create_header(info, format, encoding, errors): """Return a header block. info is a dictionary with file information, format must be one of the *_FORMAT constants. """ + has_device_fields = info.get("type") in (CHRTYPE, BLKTYPE) + if has_device_fields: + devmajor = itn(info.get("devmajor", 0), 8, format) + devminor = itn(info.get("devminor", 0), 8, format) + else: + devmajor = stn("", 8, encoding, errors) + devminor = stn("", 8, encoding, errors) + parts = [ stn(info.get("name", ""), 100, encoding, errors), itn(info.get("mode", 0) & 0o7777, 8, format), @@ -943,8 +953,8 @@ def _create_header(info, format, encoding, errors): info.get("magic", POSIX_MAGIC), stn(info.get("uname", ""), 32, encoding, errors), stn(info.get("gname", ""), 32, encoding, errors), - itn(info.get("devmajor", 0), 8, format), - itn(info.get("devminor", 0), 8, format), + devmajor, + devminor, stn(info.get("prefix", ""), 155, encoding, errors) ] @@ -2083,9 +2093,10 @@ def extract(self, member, path="", set_attrs=True, *, numeric_owner=False): def extractfile(self, member): """Extract a member from the archive as a file object. `member' may be - a filename or a TarInfo object. If `member' is a regular file or a - link, an io.BufferedReader object is returned. Otherwise, None is - returned. + a filename or a TarInfo object. If `member' is a regular file or + a link, an io.BufferedReader object is returned. For all other + existing members, None is returned. If `member' does not appear + in the archive, KeyError is raised. """ self._check("r") @@ -2226,6 +2237,9 @@ def makelink(self, tarinfo, targetpath): try: # For systems that support symbolic and hard links. if tarinfo.issym(): + if os.path.lexists(targetpath): + # Avoid FileExistsError on following os.symlink. + os.unlink(targetpath) os.symlink(tarinfo.linkname, targetpath) else: # See extract(). @@ -2461,9 +2475,14 @@ def __exit__(self, type, value, traceback): def is_tarfile(name): """Return True if name points to a tar archive that we are able to handle, else return False. + + 'name' should be a string, file, or file-like object. """ try: - t = open(name) + if hasattr(name, "read"): + t = open(fileobj=name) + else: + t = open(name) t.close() return True except TarError: diff --git a/Lib/tempfile.py b/Lib/tempfile.py index 5b990e067f23a540827fd20dbb8c9c51f18fa0bb..770f72c25295cbe756ef32b618682090e6b09b1b 100644 --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -44,6 +44,7 @@ import errno as _errno from random import Random as _Random import sys as _sys +import types as _types import weakref as _weakref import _thread _allocate_lock = _thread.allocate_lock @@ -307,8 +308,7 @@ def mkstemp(suffix=None, prefix=None, dir=None, text=False): otherwise a default directory is used. If 'text' is specified and true, the file is opened in text - mode. Else (the default) the file is opened in binary mode. On - some operating systems, this makes no difference. + mode. Else (the default) the file is opened in binary mode. If any of 'suffix', 'prefix' and 'dir' are not None, they must be the same type. If they are bytes, the returned name will be bytes; str @@ -643,6 +643,8 @@ def __init__(self, max_size=0, mode='w+b', buffering=-1, 'encoding': encoding, 'newline': newline, 'dir': dir, 'errors': errors} + __class_getitem__ = classmethod(_types.GenericAlias) + def _check(self, file): if self._rolled: return max_size = self._max_size @@ -737,10 +739,6 @@ def readlines(self, *args): def seek(self, *args): return self._file.seek(*args) - @property - def softspace(self): - return self._file.softspace - def tell(self): return self._file.tell() @@ -830,3 +828,5 @@ def __exit__(self, exc, value, tb): def cleanup(self): if self._finalizer.detach(): self._rmtree(self.name) + + __class_getitem__ = classmethod(_types.GenericAlias) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 8626aa37c186e9e41b322204726420f9b3448fb6..e47905c863bafa68e06d5d02dddad8da2df8a3f0 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -26,6 +26,8 @@ import test.support import test.support.script_helper from test import support +from test.support import hashlib_helper +from test.support import socket_helper # Skip tests if _multiprocessing wasn't built. @@ -66,12 +68,6 @@ except ImportError: msvcrt = None -# -# -# - -# Timeout to wait until a process completes -TIMEOUT = 60.0 # seconds def latin(s): return s.encode('latin') @@ -86,7 +82,7 @@ def close_queue(queue): def join_process(process): # Since multiprocessing.Process has the same API than threading.Thread # (join() and is_alive(), the support function can be reused - support.join_thread(process, timeout=TIMEOUT) + support.join_thread(process) if os.name == "posix": @@ -301,7 +297,7 @@ def test_parent_process(self): target=self._test_create_grandchild_process, args=(wconn, )) p.start() - if not rconn.poll(timeout=60): + if not rconn.poll(timeout=support.LONG_TIMEOUT): raise AssertionError("Could not communicate with child process") parent_process_status = rconn.recv() self.assertEqual(parent_process_status, "alive") @@ -309,7 +305,7 @@ def test_parent_process(self): p.terminate() p.join() - if not rconn.poll(timeout=60): + if not rconn.poll(timeout=support.LONG_TIMEOUT): raise AssertionError("Could not communicate with child process") parent_process_status = rconn.recv() self.assertEqual(parent_process_status, "not alive") @@ -324,7 +320,7 @@ def _test_create_grandchild_process(cls, wconn): def _test_report_parent_status(cls, wconn): from multiprocessing.process import parent_process wconn.send("alive" if parent_process().is_alive() else "not alive") - parent_process().join(timeout=5) + parent_process().join(timeout=support.SHORT_TIMEOUT) wconn.send("alive" if parent_process().is_alive() else "not alive") def test_process(self): @@ -870,12 +866,21 @@ def test_sys_exit(self): os.unlink(testfn) - for reason in (True, False, 8): - p = self.Process(target=sys.exit, args=(reason,)) - p.daemon = True - p.start() - join_process(p) - self.assertEqual(p.exitcode, reason) + cases = [ + ((True,), 1), + ((False,), 0), + ((8,), 8), + ((None,), 0), + ((), 0), + ] + + for args, expected in cases: + with self.subTest(args=args): + p = self.Process(target=sys.exit, args=args) + p.daemon = True + p.start() + join_process(p) + self.assertEqual(p.exitcode, expected) # # @@ -1150,7 +1155,7 @@ def __reduce__(self): q = self.Queue() q.put(NotSerializable()) q.put(True) - self.assertTrue(q.get(timeout=TIMEOUT)) + self.assertTrue(q.get(timeout=support.SHORT_TIMEOUT)) close_queue(q) with test.support.captured_stderr(): @@ -1165,8 +1170,7 @@ def __reduce__(self): # qsize is not available on all platform as it # relies on sem_getvalue pass - # bpo-30595: use a timeout of 1 second for slow buildbots - self.assertTrue(q.get(timeout=1.0)) + self.assertTrue(q.get(timeout=support.SHORT_TIMEOUT)) # Check that the size of the queue is correct self.assertTrue(q.empty()) close_queue(q) @@ -1203,7 +1207,7 @@ def _on_queue_feeder_error(e, obj): # Verify that q is still functioning correctly q.put(True) - self.assertTrue(q.get(timeout=1.0)) + self.assertTrue(q.get(timeout=support.SHORT_TIMEOUT)) # Assert that the serialization and the hook have been called correctly self.assertTrue(not_serializable_obj.reduce_was_called) @@ -1553,7 +1557,7 @@ def test_waitfor_timeout(self): args=(cond, state, success, sem)) p.daemon = True p.start() - self.assertTrue(sem.acquire(timeout=TIMEOUT)) + self.assertTrue(sem.acquire(timeout=support.LONG_TIMEOUT)) # Only increment 3 times, so state == 4 is never reached. for i in range(3): @@ -2926,7 +2930,7 @@ def test_remote(self): authkey = os.urandom(32) manager = QueueManager( - address=(test.support.HOST, 0), authkey=authkey, serializer=SERIALIZER + address=(socket_helper.HOST, 0), authkey=authkey, serializer=SERIALIZER ) manager.start() self.addCleanup(manager.shutdown) @@ -2950,6 +2954,8 @@ def test_remote(self): # Make queue finalizer run before the server is stopped del queue + +@hashlib_helper.requires_hashdigest('md5') class _TestManagerRestart(BaseTestCase): @classmethod @@ -2963,7 +2969,7 @@ def _putter(cls, address, authkey): def test_rapid_restart(self): authkey = os.urandom(32) manager = QueueManager( - address=(test.support.HOST, 0), authkey=authkey, serializer=SERIALIZER) + address=(socket_helper.HOST, 0), authkey=authkey, serializer=SERIALIZER) try: srvr = manager.get_server() addr = srvr.address @@ -3434,6 +3440,7 @@ def test_dont_merge(self): # @unittest.skipUnless(HAS_REDUCTION, "test needs multiprocessing.reduction") +@hashlib_helper.requires_hashdigest('md5') class _TestPicklingConnections(BaseTestCase): ALLOWED_TYPES = ('processes',) @@ -3441,7 +3448,7 @@ class _TestPicklingConnections(BaseTestCase): @classmethod def tearDownClass(cls): from multiprocessing import resource_sharer - resource_sharer.stop(timeout=TIMEOUT) + resource_sharer.stop(timeout=support.LONG_TIMEOUT) @classmethod def _listener(cls, conn, families): @@ -3453,7 +3460,7 @@ def _listener(cls, conn, families): new_conn.close() l.close() - l = socket.create_server((test.support.HOST, 0)) + l = socket.create_server((socket_helper.HOST, 0)) conn.send(l.getsockname()) new_conn, addr = l.accept() conn.send(new_conn) @@ -3736,6 +3743,7 @@ def test_copy(self): @unittest.skipUnless(HAS_SHMEM, "requires multiprocessing.shared_memory") +@hashlib_helper.requires_hashdigest('md5') class _TestSharedMemory(BaseTestCase): ALLOWED_TYPES = ('processes',) @@ -3772,6 +3780,35 @@ def test_shared_memory_basics(self): self.assertLess(same_sms.size, 20*sms.size) # Size was ignored. same_sms.close() + # Creating Shared Memory Segment with -ve size + with self.assertRaises(ValueError): + shared_memory.SharedMemory(create=True, size=-2) + + # Attaching Shared Memory Segment without a name + with self.assertRaises(ValueError): + shared_memory.SharedMemory(create=False) + + # Test if shared memory segment is created properly, + # when _make_filename returns an existing shared memory segment name + with unittest.mock.patch( + 'multiprocessing.shared_memory._make_filename') as mock_make_filename: + + NAME_PREFIX = shared_memory._SHM_NAME_PREFIX + names = ['test01_fn', 'test02_fn'] + # Prepend NAME_PREFIX which can be '/psm_' or 'wnsm_', necessary + # because some POSIX compliant systems require name to start with / + names = [NAME_PREFIX + name for name in names] + + mock_make_filename.side_effect = names + shm1 = shared_memory.SharedMemory(create=True, size=1) + self.addCleanup(shm1.unlink) + self.assertEqual(shm1._name, names[0]) + + mock_make_filename.side_effect = names + shm2 = shared_memory.SharedMemory(create=True, size=1) + self.addCleanup(shm2.unlink) + self.assertEqual(shm2._name, names[1]) + if shared_memory._USE_POSIX: # Posix Shared Memory can only be unlinked once. Here we # test an implementation detail that is not observed across @@ -3827,6 +3864,18 @@ class OptionalAttachSharedMemory(shared_memory.SharedMemory): sms.close() + # Test creating a shared memory segment with negative size + with self.assertRaises(ValueError): + sms_invalid = shared_memory.SharedMemory(create=True, size=-1) + + # Test creating a shared memory segment with size 0 + with self.assertRaises(ValueError): + sms_invalid = shared_memory.SharedMemory(create=True, size=0) + + # Test creating a shared memory segment without size argument + with self.assertRaises(ValueError): + sms_invalid = shared_memory.SharedMemory(create=True) + def test_shared_memory_across_processes(self): # bpo-40135: don't define shared memory block's name in case of # the failure when we run multiprocessing tests in parallel. @@ -4071,7 +4120,7 @@ def test_shared_memory_cleaned_after_process_termination(self): p.terminate() p.wait() - deadline = time.monotonic() + 60 + deadline = time.monotonic() + support.LONG_TIMEOUT t = 0.1 while time.monotonic() < deadline: time.sleep(t) @@ -4382,6 +4431,7 @@ def test_invalid_handles(self): +@hashlib_helper.requires_hashdigest('md5') class OtherTest(unittest.TestCase): # TODO: add more tests for deliver/answer challenge. def test_deliver_challenge_auth_failure(self): @@ -4418,6 +4468,7 @@ def send_bytes(self, data): def initializer(ns): ns.test += 1 +@hashlib_helper.requires_hashdigest('md5') class TestInitializers(unittest.TestCase): def setUp(self): self.mgr = multiprocessing.Manager() @@ -4564,7 +4615,7 @@ def _child_test_wait_socket(cls, address, slow): def test_wait_socket(self, slow=False): from multiprocessing.connection import wait - l = socket.create_server((test.support.HOST, 0)) + l = socket.create_server((socket_helper.HOST, 0)) addr = l.getsockname() readers = [] procs = [] @@ -5080,7 +5131,7 @@ def create_and_register_resource(rtype): p.terminate() p.wait() - deadline = time.monotonic() + 60 + deadline = time.monotonic() + support.LONG_TIMEOUT while time.monotonic() < deadline: time.sleep(.5) try: @@ -5109,7 +5160,7 @@ def check_resource_tracker_death(self, signum, should_die): pid = _resource_tracker._pid if pid is not None: os.kill(pid, signal.SIGKILL) - os.waitpid(pid, 0) + support.wait_process(pid, exitcode=-signal.SIGKILL) with warnings.catch_warnings(): warnings.simplefilter("ignore") _resource_tracker.ensure_running() @@ -5216,6 +5267,20 @@ def test_empty(self): proc.join() + def test_close(self): + queue = multiprocessing.SimpleQueue() + queue.close() + # closing a queue twice should not fail + queue.close() + + # Test specific to CPython since it tests private attributes + @test.support.cpython_only + def test_closed(self): + queue = multiprocessing.SimpleQueue() + queue.close() + self.assertTrue(queue._reader.closed) + self.assertTrue(queue._writer.closed) + class TestPoolNotLeakOnFailure(unittest.TestCase): @@ -5258,6 +5323,7 @@ def is_alive(self): any(process.is_alive() for process in forked_processes)) +@hashlib_helper.requires_hashdigest('md5') class TestSyncManagerTypes(unittest.TestCase): """Test all the types which can be shared between a parent and a child process by using a manager which acts as an intermediary @@ -5652,6 +5718,8 @@ def install_tests_in_module_dict(remote_globs, start_method): Mixin = local_globs[type_.capitalize() + 'Mixin'] class Temp(base, Mixin, unittest.TestCase): pass + if type_ == 'manager': + Temp = hashlib_helper.requires_hashdigest('md5')(Temp) Temp.__name__ = Temp.__qualname__ = newname Temp.__module__ = __module__ remote_globs[newname] = Temp diff --git a/Lib/test/audiotests.py b/Lib/test/audiotests.py index 0dad01722922a9a8f5a82dd1e1bda9e8487c0a42..d3e8e9ee44a13467f57d56cbffb1c1295fc28c64 100644 --- a/Lib/test/audiotests.py +++ b/Lib/test/audiotests.py @@ -1,7 +1,6 @@ from test.support import findfile, TESTFN, unlink import array import io -from unittest import mock import pickle @@ -50,17 +49,6 @@ def check_params(self, f, nchannels, sampwidth, framerate, nframes, self.assertEqual(pickle.loads(dump), params) -class AudioMiscTests(AudioTests): - - def test_openfp_deprecated(self): - arg = "arg" - mode = "mode" - with mock.patch(f"{self.module.__name__}.open") as mock_open, \ - self.assertWarns(DeprecationWarning): - self.module.openfp(arg, mode=mode) - mock_open.assert_called_with(arg, mode=mode) - - class AudioWriteTests(AudioTests): def create_file(self, testfile): diff --git a/Lib/test/bisect_cmd.py b/Lib/test/bisect_cmd.py index cb06480e7c91fad0855c750ae5771b549952cafb..0bdd7a43c03f7bf818d4356460a92d7c7cdb5be9 100755 --- a/Lib/test/bisect_cmd.py +++ b/Lib/test/bisect_cmd.py @@ -47,8 +47,16 @@ def format_shell_args(args): return ' '.join(args) +def python_cmd(): + cmd = [sys.executable] + cmd.extend(subprocess._args_from_interpreter_flags()) + cmd.extend(subprocess._optim_args_from_interpreter_flags()) + return cmd + + def list_cases(args): - cmd = [sys.executable, '-m', 'test', '--list-cases'] + cmd = python_cmd() + cmd.extend(['-m', 'test', '--list-cases']) cmd.extend(args.test_args) proc = subprocess.run(cmd, stdout=subprocess.PIPE, @@ -68,7 +76,8 @@ def run_tests(args, tests, huntrleaks=None): try: write_tests(tmp, tests) - cmd = [sys.executable, '-m', 'test', '--matchfile', tmp] + cmd = python_cmd() + cmd.extend(['-m', 'test', '--matchfile', tmp]) cmd.extend(args.test_args) print("+ %s" % format_shell_args(cmd)) proc = subprocess.run(cmd) @@ -100,6 +109,9 @@ def parse_args(): def main(): args = parse_args() + if '-w' in args.test_args or '--verbose2' in args.test_args: + print("WARNING: -w/--verbose2 option should not be used to bisect!") + print() if args.input: with open(args.input) as fp: diff --git a/Lib/test/clinic.test b/Lib/test/clinic.test index 845b165a9ed3c1c6bb6d015c6bc35b153504773d..cb76c3746c307b8d01dc71f277fb27260f666f8c 100644 --- a/Lib/test/clinic.test +++ b/Lib/test/clinic.test @@ -1269,7 +1269,7 @@ test_long_long_converter(PyObject *module, PyObject *const *args, Py_ssize_t nar goto exit; } a = PyLong_AsLongLong(args[0]); - if (a == (PY_LONG_LONG)-1 && PyErr_Occurred()) { + if (a == -1 && PyErr_Occurred()) { goto exit; } skip_optional: @@ -1281,7 +1281,7 @@ exit: static PyObject * test_long_long_converter_impl(PyObject *module, long long a) -/*[clinic end generated code: output=3e8083f3aee4f18a input=d5fc81577ff4dd02]*/ +/*[clinic end generated code: output=7143b585d7e433e8 input=d5fc81577ff4dd02]*/ /*[clinic input] diff --git a/Lib/test/crashers/bogus_code_obj.py b/Lib/test/crashers/bogus_code_obj.py index 198d229491b143548a5b244bac80ac9ba59b21ad..e71b3582cf2d7611801945efd7f9b8bbaa25dda4 100644 --- a/Lib/test/crashers/bogus_code_obj.py +++ b/Lib/test/crashers/bogus_code_obj.py @@ -14,6 +14,6 @@ import types -co = types.CodeType(0, 0, 0, 0, 0, b'\x04\x71\x00\x00', +co = types.CodeType(0, 0, 0, 0, 0, 0, b'\x04\x00\x71\x00', (), (), (), '', '', 1, b'') exec(co) diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index d1a3c2ff9abc21766c701b8e179a82ff219044a8..b37ef9170787237f64fa67f6df4c54aa1af32818 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -2,6 +2,7 @@ See http://www.zope.org/Members/fdrake/DateTimeWiki/TestCases """ +import io import itertools import bisect import copy @@ -62,6 +63,12 @@ def test_constants(self): self.assertEqual(datetime.MINYEAR, 1) self.assertEqual(datetime.MAXYEAR, 9999) + def test_all(self): + """Test that __all__ only points to valid attributes.""" + all_attrs = dir(datetime_module) + for attr in datetime_module.__all__: + self.assertIn(attr, all_attrs) + def test_name_cleanup(self): if '_Pure' in self.__class__.__name__: self.skipTest('Only run for Fast C implementation') @@ -1349,19 +1356,43 @@ def test_weekday(self): def test_isocalendar(self): # Check examples from # http://www.phys.uu.nl/~vgent/calendar/isocalendar.htm - for i in range(7): - d = self.theclass(2003, 12, 22+i) - self.assertEqual(d.isocalendar(), (2003, 52, i+1)) - d = self.theclass(2003, 12, 29) + timedelta(i) - self.assertEqual(d.isocalendar(), (2004, 1, i+1)) - d = self.theclass(2004, 1, 5+i) - self.assertEqual(d.isocalendar(), (2004, 2, i+1)) - d = self.theclass(2009, 12, 21+i) - self.assertEqual(d.isocalendar(), (2009, 52, i+1)) - d = self.theclass(2009, 12, 28) + timedelta(i) - self.assertEqual(d.isocalendar(), (2009, 53, i+1)) - d = self.theclass(2010, 1, 4+i) - self.assertEqual(d.isocalendar(), (2010, 1, i+1)) + week_mondays = [ + ((2003, 12, 22), (2003, 52, 1)), + ((2003, 12, 29), (2004, 1, 1)), + ((2004, 1, 5), (2004, 2, 1)), + ((2009, 12, 21), (2009, 52, 1)), + ((2009, 12, 28), (2009, 53, 1)), + ((2010, 1, 4), (2010, 1, 1)), + ] + + test_cases = [] + for cal_date, iso_date in week_mondays: + base_date = self.theclass(*cal_date) + # Adds one test case for every day of the specified weeks + for i in range(7): + new_date = base_date + timedelta(i) + new_iso = iso_date[0:2] + (iso_date[2] + i,) + test_cases.append((new_date, new_iso)) + + for d, exp_iso in test_cases: + with self.subTest(d=d, comparison="tuple"): + self.assertEqual(d.isocalendar(), exp_iso) + + # Check that the tuple contents are accessible by field name + with self.subTest(d=d, comparison="fields"): + t = d.isocalendar() + self.assertEqual((t.year, t.week, t.weekday), exp_iso) + + def test_isocalendar_pickling(self): + """Test that the result of datetime.isocalendar() can be pickled. + + The result of a round trip should be a plain tuple. + """ + d = self.theclass(2019, 1, 1) + p = pickle.dumps(d.isocalendar()) + res = pickle.loads(p) + self.assertEqual(type(res), tuple) + self.assertEqual(res, (2019, 1, 2)) def test_iso_long_years(self): # Calculate long ISO years and compare to table from @@ -1750,6 +1781,7 @@ def test_pickling_subclass_date(self): green = pickler.dumps(orig, proto) derived = unpickler.loads(green) self.assertEqual(orig, derived) + self.assertTrue(isinstance(derived, SubclassDate)) def test_backdoor_resistance(self): # For fast unpickling, the constructor accepts a pickle byte string. @@ -2277,6 +2309,7 @@ def test_pickling_subclass_datetime(self): green = pickler.dumps(orig, proto) derived = unpickler.loads(green) self.assertEqual(orig, derived) + self.assertTrue(isinstance(derived, SubclassDatetime)) def test_compat_unpickle(self): tests = [ @@ -3326,6 +3359,7 @@ def test_pickling_subclass_time(self): green = pickler.dumps(orig, proto) derived = unpickler.loads(green) self.assertEqual(orig, derived) + self.assertTrue(isinstance(derived, SubclassTime)) def test_compat_unpickle(self): tests = [ @@ -5785,6 +5819,8 @@ class ZoneInfoTest(unittest.TestCase): zonename = 'America/New_York' def setUp(self): + if sys.platform == "vxworks": + self.skipTest("Skipping zoneinfo tests on VxWorks") if sys.platform == "win32": self.skipTest("Skipping zoneinfo tests on Windows") try: @@ -5946,6 +5982,65 @@ def test_timezones_capi(self): self.assertEqual(dt1.astimezone(timezone.utc), dt_utc) + def test_PyDateTime_DELTA_GET(self): + class TimeDeltaSubclass(timedelta): + pass + + for klass in [timedelta, TimeDeltaSubclass]: + for args in [(26, 55, 99999), (26, 55, 99999)]: + d = klass(*args) + with self.subTest(cls=klass, date=args): + days, seconds, microseconds = _testcapi.PyDateTime_DELTA_GET(d) + + self.assertEqual(days, d.days) + self.assertEqual(seconds, d.seconds) + self.assertEqual(microseconds, d.microseconds) + + def test_PyDateTime_GET(self): + class DateSubclass(date): + pass + + for klass in [date, DateSubclass]: + for args in [(2000, 1, 2), (2012, 2, 29)]: + d = klass(*args) + with self.subTest(cls=klass, date=args): + year, month, day = _testcapi.PyDateTime_GET(d) + + self.assertEqual(year, d.year) + self.assertEqual(month, d.month) + self.assertEqual(day, d.day) + + def test_PyDateTime_DATE_GET(self): + class DateTimeSubclass(datetime): + pass + + for klass in [datetime, DateTimeSubclass]: + for args in [(1993, 8, 26, 22, 12, 55, 99999), + (1993, 8, 26, 22, 12, 55, 99999)]: + d = klass(*args) + with self.subTest(cls=klass, date=args): + hour, minute, second, microsecond = _testcapi.PyDateTime_DATE_GET(d) + + self.assertEqual(hour, d.hour) + self.assertEqual(minute, d.minute) + self.assertEqual(second, d.second) + self.assertEqual(microsecond, d.microsecond) + + def test_PyDateTime_TIME_GET(self): + class TimeSubclass(time): + pass + + for klass in [time, TimeSubclass]: + for args in [(12, 30, 20, 10), (12, 30, 20, 10)]: + d = klass(*args) + with self.subTest(cls=klass, date=args): + hour, minute, second, microsecond = _testcapi.PyDateTime_TIME_GET(d) + + self.assertEqual(hour, d.hour) + self.assertEqual(minute, d.minute) + self.assertEqual(second, d.second) + self.assertEqual(microsecond, d.microsecond) + def test_timezones_offset_zero(self): utc0, utc1, non_utc = _testcapi.get_timezones_offset_zero() @@ -6106,7 +6201,7 @@ class TZInfoSubclass(tzinfo): def test_date_from_date(self): exp_date = date(1993, 8, 26) - for macro in [0, 1]: + for macro in False, True: with self.subTest(macro=macro): c_api_date = _testcapi.get_date_fromdate( macro, @@ -6119,7 +6214,7 @@ def test_date_from_date(self): def test_datetime_from_dateandtime(self): exp_date = datetime(1993, 8, 26, 22, 12, 55, 99999) - for macro in [0, 1]: + for macro in False, True: with self.subTest(macro=macro): c_api_date = _testcapi.get_datetime_fromdateandtime( macro, @@ -6137,7 +6232,7 @@ def test_datetime_from_dateandtimeandfold(self): exp_date = datetime(1993, 8, 26, 22, 12, 55, 99999) for fold in [0, 1]: - for macro in [0, 1]: + for macro in False, True: with self.subTest(macro=macro, fold=fold): c_api_date = _testcapi.get_datetime_fromdateandtimeandfold( macro, @@ -6156,7 +6251,7 @@ def test_datetime_from_dateandtimeandfold(self): def test_time_from_time(self): exp_time = time(22, 12, 55, 99999) - for macro in [0, 1]: + for macro in False, True: with self.subTest(macro=macro): c_api_time = _testcapi.get_time_fromtime( macro, @@ -6171,7 +6266,7 @@ def test_time_from_timeandfold(self): exp_time = time(22, 12, 55, 99999) for fold in [0, 1]: - for macro in [0, 1]: + for macro in False, True: with self.subTest(macro=macro, fold=fold): c_api_time = _testcapi.get_time_fromtimeandfold( macro, @@ -6187,7 +6282,7 @@ def test_time_from_timeandfold(self): def test_delta_from_dsu(self): exp_delta = timedelta(26, 55, 99999) - for macro in [0, 1]: + for macro in False, True: with self.subTest(macro=macro): c_api_delta = _testcapi.get_delta_fromdsu( macro, @@ -6200,7 +6295,7 @@ def test_delta_from_dsu(self): def test_date_from_timestamp(self): ts = datetime(1995, 4, 12).timestamp() - for macro in [0, 1]: + for macro in False, True: with self.subTest(macro=macro): d = _testcapi.get_date_fromtimestamp(int(ts), macro) @@ -6218,7 +6313,7 @@ def test_datetime_from_timestamp(self): from_timestamp = _testcapi.get_datetime_fromtimestamp for case in cases: - for macro in [0, 1]: + for macro in False, True: with self.subTest(case=case, macro=macro): dtup, tzinfo, usetz = case dt_orig = datetime(*dtup, tzinfo=tzinfo) diff --git a/Lib/test/eintrdata/eintr_tester.py b/Lib/test/eintrdata/eintr_tester.py index 404934ce97a2bfdc08f9ec78ab77ae5366d9aca1..606f31b091096183e7c6b18337dfed1c97e0db27 100644 --- a/Lib/test/eintrdata/eintr_tester.py +++ b/Lib/test/eintrdata/eintr_tester.py @@ -22,6 +22,7 @@ import unittest from test import support +from test.support import socket_helper @contextlib.contextmanager def kill_on_error(proc): @@ -57,9 +58,8 @@ def setUp(self): # Use faulthandler as watchdog to debug when a test hangs # (timeout of 10 minutes) - if hasattr(faulthandler, 'dump_traceback_later'): - faulthandler.dump_traceback_later(10 * 60, exit=True, - file=sys.__stderr__) + faulthandler.dump_traceback_later(10 * 60, exit=True, + file=sys.__stderr__) @staticmethod def stop_alarm(): @@ -68,8 +68,7 @@ def stop_alarm(): def tearDown(self): self.stop_alarm() signal.signal(signal.SIGALRM, self.orig_handler) - if hasattr(faulthandler, 'cancel_dump_traceback_later'): - faulthandler.cancel_dump_traceback_later() + faulthandler.cancel_dump_traceback_later() def subprocess(self, *args, **kw): cmd_args = (sys.executable, '-c') + args @@ -285,14 +284,14 @@ def test_sendmsg(self): self._test_send(lambda sock, data: sock.sendmsg([data])) def test_accept(self): - sock = socket.create_server((support.HOST, 0)) + sock = socket.create_server((socket_helper.HOST, 0)) self.addCleanup(sock.close) port = sock.getsockname()[1] code = '\n'.join(( 'import socket, time', '', - 'host = %r' % support.HOST, + 'host = %r' % socket_helper.HOST, 'port = %s' % port, 'sleep_time = %r' % self.sleep_time, '', diff --git a/Lib/test/fork_wait.py b/Lib/test/fork_wait.py index 9850b06a318eeb18014e24488e578c9e8819f7a7..249b5e96073297d9d92a12a93bc4f6c9eb76d32b 100644 --- a/Lib/test/fork_wait.py +++ b/Lib/test/fork_wait.py @@ -11,7 +11,7 @@ import os, sys, time, unittest import threading -import test.support as support +from test import support LONGSLEEP = 2 @@ -43,17 +43,8 @@ def f(self, id): except OSError: pass - def wait_impl(self, cpid): - for i in range(10): - # waitpid() shouldn't hang, but some of the buildbots seem to hang - # in the forking tests. This is an attempt to fix the problem. - spid, status = os.waitpid(cpid, os.WNOHANG) - if spid == cpid: - break - time.sleep(2 * SHORTSLEEP) - - self.assertEqual(spid, cpid) - self.assertEqual(status, 0, "cause = %d, exit = %d" % (status&0xff, status>>8)) + def wait_impl(self, cpid, *, exitcode): + support.wait_process(cpid, exitcode=exitcode) def test_wait(self): for i in range(NUM_THREADS): @@ -62,7 +53,7 @@ def test_wait(self): self.threads.append(thread) # busy-loop to wait for threads - deadline = time.monotonic() + 10.0 + deadline = time.monotonic() + support.SHORT_TIMEOUT while len(self.alive) < NUM_THREADS: time.sleep(0.1) if deadline < time.monotonic(): @@ -88,4 +79,4 @@ def test_wait(self): os._exit(n) else: # Parent - self.wait_impl(cpid) + self.wait_impl(cpid, exitcode=0) diff --git a/Lib/test/inspect_fodder.py b/Lib/test/inspect_fodder.py index 96a0257bfdf03e2371a28178e7bd71b1d278aa9b..e1287a315901cf6b0249b452393eab32281dd97b 100644 --- a/Lib/test/inspect_fodder.py +++ b/Lib/test/inspect_fodder.py @@ -91,3 +91,25 @@ def as_method_of(self, obj): custom_method = Callable().as_method_of(42) del Callable + +# line 95 +class WhichComments: + # line 97 + # before f + def f(self): + # line 100 + # start f + return 1 + # line 103 + # end f + # line 105 + # after f + + # before asyncf - line 108 + async def asyncf(self): + # start asyncf + return 2 + # end asyncf + # after asyncf - line 113 + # end of WhichComments - line 114 + # after WhichComments - line 115 diff --git a/Lib/test/inspect_fodder2.py b/Lib/test/inspect_fodder2.py index 5a7b559d07d7628dcf4ff42fb27c434623d8a9a8..e7d4b53ebefcc6f782f4a1e720ec7dcf6db7428d 100644 --- a/Lib/test/inspect_fodder2.py +++ b/Lib/test/inspect_fodder2.py @@ -138,18 +138,124 @@ def func137(): never_reached1 never_reached2 -#line 141 +# line 141 +class cls142: + a = """ +class cls149: + ... +""" + +# line 148 +class cls149: + + def func151(self): + pass + +''' +class cls160: + pass +''' + +# line 159 +class cls160: + + def func162(self): + pass + +# line 165 +class cls166: + a = ''' + class cls175: + ... + ''' + +# line 172 +class cls173: + + class cls175: + pass + +# line 178 +class cls179: + pass + +# line 182 +class cls183: + + class cls185: + + def func186(self): + pass + +def class_decorator(cls): + return cls + +# line 193 +@class_decorator +@class_decorator +class cls196: + + @class_decorator + @class_decorator + class cls200: + pass + +class cls203: + class cls204: + class cls205: + pass + class cls207: + class cls205: + pass + +# line 211 +def func212(): + class cls213: + pass + return cls213 + +# line 217 +class cls213: + def func219(self): + class cls220: + pass + return cls220 + +# line 224 +async def func225(): + class cls226: + pass + return cls226 + +# line 230 +class cls226: + async def func232(self): + class cls233: + pass + return cls233 + +if True: + class cls238: + class cls239: + '''if clause cls239''' +else: + class cls238: + class cls239: + '''else clause 239''' + pass + +#line 247 def positional_only_arg(a, /): pass -#line 145 +#line 251 def all_markers(a, b, /, c, d, *, e, f): pass -# line 149 +# line 255 def all_markers_with_args_and_kwargs(a, b, /, c, d, *args, e, f, **kwargs): pass -#line 153 +#line 259 def all_markers_with_defaults(a, b=1, /, c=2, d=3, *, e=4, f=5): pass diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index adf31cc94940d1c106ad18757f62d5cd7f510ece..e20bf9a30c708743d02a9f246c5c60bdf52f771e 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -596,6 +596,7 @@ def create_temp_dir(self): test_cwd = 'test_python_worker_{}'.format(pid) else: test_cwd = 'test_python_{}'.format(pid) + test_cwd += support.FS_NONASCII test_cwd = os.path.join(self.tmp_dir, test_cwd) return test_cwd diff --git a/Lib/test/libregrtest/save_env.py b/Lib/test/libregrtest/save_env.py index 31931f2192f92b0945630d006490adf2b39c0233..e7c27a698b06a00a83c7d66179dd6fc75e9fa3d3 100644 --- a/Lib/test/libregrtest/save_env.py +++ b/Lib/test/libregrtest/save_env.py @@ -7,6 +7,7 @@ import sys import sysconfig import threading +import urllib.request import warnings from test import support from test.libregrtest.utils import print_warning @@ -68,8 +69,20 @@ def __init__(self, testname, verbose=0, quiet=False, *, pgo=False): 'files', 'locale', 'warnings.showwarning', 'shutil_archive_formats', 'shutil_unpack_formats', 'asyncio.events._event_loop_policy', + 'urllib.requests._url_tempfiles', 'urllib.requests._opener', ) + def get_urllib_requests__url_tempfiles(self): + return list(urllib.request._url_tempfiles) + def restore_urllib_requests__url_tempfiles(self, tempfiles): + for filename in tempfiles: + support.unlink(filename) + + def get_urllib_requests__opener(self): + return urllib.request._opener + def restore_urllib_requests__opener(self, opener): + urllib.request._opener = opener + def get_asyncio_events__event_loop_policy(self): return support.maybe_get_event_loop_policy() def restore_asyncio_events__event_loop_policy(self, policy): diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py index 2b0bdf9997d95825b6944b9b15874ed6b601ed7d..1f264c1be49fe0d3f7a313a74df433611c3e167a 100644 --- a/Lib/test/libregrtest/setup.py +++ b/Lib/test/libregrtest/setup.py @@ -10,6 +10,8 @@ except ImportError: gc = None +from test.libregrtest.utils import setup_unraisable_hook + def setup_tests(ns): try: @@ -77,6 +79,19 @@ def _test_audit_hook(name, args): pass sys.addaudithook(_test_audit_hook) + setup_unraisable_hook() + + if ns.timeout is not None: + # For a slow buildbot worker, increase SHORT_TIMEOUT and LONG_TIMEOUT + support.SHORT_TIMEOUT = max(support.SHORT_TIMEOUT, ns.timeout / 40) + support.LONG_TIMEOUT = max(support.LONG_TIMEOUT, ns.timeout / 4) + + # If --timeout is short: reduce timeouts + support.LOOPBACK_TIMEOUT = min(support.LOOPBACK_TIMEOUT, ns.timeout) + support.INTERNET_TIMEOUT = min(support.INTERNET_TIMEOUT, ns.timeout) + support.SHORT_TIMEOUT = min(support.SHORT_TIMEOUT, ns.timeout) + support.LONG_TIMEOUT = min(support.LONG_TIMEOUT, ns.timeout) + def replace_stdout(): """Set stdout encoder error handler to backslashreplace (as stderr error diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index 0467c8f8f56b6a1f40bdf7bef3a2f928b0f6ef1b..71f538f0c453385d35b7af6335645130ce1bbb42 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -63,3 +63,24 @@ def printlist(x, width=70, indent=4, file=None): def print_warning(msg): support.print_warning(msg) + + +orig_unraisablehook = None + + +def regrtest_unraisable_hook(unraisable): + global orig_unraisablehook + support.environment_altered = True + print_warning("Unraisable exception") + old_stderr = sys.stderr + try: + sys.stderr = sys.__stderr__ + orig_unraisablehook(unraisable) + finally: + sys.stderr = old_stderr + + +def setup_unraisable_hook(): + global orig_unraisablehook + orig_unraisablehook = sys.unraisablehook + sys.unraisablehook = regrtest_unraisable_hook diff --git a/Lib/test/list_tests.py b/Lib/test/list_tests.py index 40316de220fac2ca2e976f2f60fa686a440c8d6b..44bc2ae6573c1a15f340e1087a13acc3fb83069b 100644 --- a/Lib/test/list_tests.py +++ b/Lib/test/list_tests.py @@ -7,6 +7,7 @@ from functools import cmp_to_key from test import support, seq_tests +from test.support import ALWAYS_EQ, NEVER_EQ class CommonTest(seq_tests.CommonTest): @@ -329,6 +330,20 @@ def test_remove(self): self.assertRaises(TypeError, a.remove) + a = self.type2test([1, 2]) + self.assertRaises(ValueError, a.remove, NEVER_EQ) + self.assertEqual(a, [1, 2]) + a.remove(ALWAYS_EQ) + self.assertEqual(a, [2]) + a = self.type2test([ALWAYS_EQ]) + a.remove(1) + self.assertEqual(a, []) + a = self.type2test([ALWAYS_EQ]) + a.remove(NEVER_EQ) + self.assertEqual(a, []) + a = self.type2test([NEVER_EQ]) + self.assertRaises(ValueError, a.remove, ALWAYS_EQ) + class BadExc(Exception): pass diff --git a/Lib/test/lock_tests.py b/Lib/test/lock_tests.py index 7b1ad8eb6de8606735f99cfe43dd720b3172182e..b3975254c79b57df835904f1a535012d968c5bfc 100644 --- a/Lib/test/lock_tests.py +++ b/Lib/test/lock_tests.py @@ -2,6 +2,7 @@ Various tests for synchronization primitives. """ +import os import sys import time from _thread import start_new_thread, TIMEOUT_MAX @@ -12,6 +13,11 @@ from test import support +requires_fork = unittest.skipUnless(hasattr(os, 'fork'), + "platform doesn't support fork " + "(no _at_fork_reinit method)") + + def _wait(): # A crude wait/yield function not relying on synchronization primitives. time.sleep(0.01) @@ -182,7 +188,7 @@ def f(): def test_timeout(self): lock = self.locktype() # Can't set timeout if not blocking - self.assertRaises(ValueError, lock.acquire, 0, 1) + self.assertRaises(ValueError, lock.acquire, False, 1) # Invalid timeout values self.assertRaises(ValueError, lock.acquire, timeout=-100) self.assertRaises(OverflowError, lock.acquire, timeout=1e100) @@ -265,6 +271,25 @@ def test_state_after_timeout(self): self.assertFalse(lock.locked()) self.assertTrue(lock.acquire(blocking=False)) + @requires_fork + def test_at_fork_reinit(self): + def use_lock(lock): + # make sure that the lock still works normally + # after _at_fork_reinit() + lock.acquire() + lock.release() + + # unlocked + lock = self.locktype() + lock._at_fork_reinit() + use_lock(lock) + + # locked: _at_fork_reinit() resets the lock to the unlocked state + lock2 = self.locktype() + lock2.acquire() + lock2._at_fork_reinit() + use_lock(lock2) + class RLockTests(BaseLockTests): """ @@ -417,12 +442,13 @@ def f(): b.wait_for_finished() self.assertEqual(results, [True] * N) - def test_reset_internal_locks(self): + @requires_fork + def test_at_fork_reinit(self): # ensure that condition is still using a Lock after reset evt = self.eventtype() with evt._cond: self.assertFalse(evt._cond.acquire(False)) - evt._reset_internal_locks() + evt._at_fork_reinit() with evt._cond: self.assertFalse(evt._cond.acquire(False)) @@ -663,6 +689,38 @@ def f(): b.wait_for_finished() self.assertEqual(sem_results, [True] * (6 + 7 + 6 + 1)) + def test_multirelease(self): + sem = self.semtype(7) + sem.acquire() + results1 = [] + results2 = [] + phase_num = 0 + def f(): + sem.acquire() + results1.append(phase_num) + sem.acquire() + results2.append(phase_num) + b = Bunch(f, 10) + b.wait_for_started() + while len(results1) + len(results2) < 6: + _wait() + self.assertEqual(results1 + results2, [0] * 6) + phase_num = 1 + sem.release(7) + while len(results1) + len(results2) < 13: + _wait() + self.assertEqual(sorted(results1 + results2), [0] * 6 + [1] * 7) + phase_num = 2 + sem.release(6) + while len(results1) + len(results2) < 19: + _wait() + self.assertEqual(sorted(results1 + results2), [0] * 6 + [1] * 7 + [2] * 6) + # The semaphore is still locked + self.assertFalse(sem.acquire(False)) + # Final release, to let the last thread finish + sem.release() + b.wait_for_finished() + def test_try_acquire(self): sem = self.semtype(2) self.assertTrue(sem.acquire(False)) diff --git a/Lib/test/mapping_tests.py b/Lib/test/mapping_tests.py index 53f29f605386ba575cf96d6925ad77e5a46e9372..613206a0855aea858819afc51becb874f558a4bc 100644 --- a/Lib/test/mapping_tests.py +++ b/Lib/test/mapping_tests.py @@ -448,7 +448,7 @@ def __new__(cls): class Exc(Exception): pass class baddict1(self.type2test): - def __init__(self): + def __init__(self, *args, **kwargs): raise Exc() self.assertRaises(Exc, baddict1.fromkeys, [1]) @@ -595,12 +595,14 @@ def test_mutatingiteration(self): d = self._empty_mapping() d[1] = 1 try: + count = 0 for i in d: d[i+1] = 1 + if count >= 1: + self.fail("changing dict size during iteration doesn't raise Error") + count += 1 except RuntimeError: pass - else: - self.fail("changing dict size during iteration doesn't raise Error") def test_repr(self): d = self._empty_mapping() diff --git a/Lib/test/mock_socket.py b/Lib/test/mock_socket.py index b28c4732cc3c2a64bcbdbeec167d3157e5f46db2..c7abddcf5fafd34c209e35ea692192fe5a93d002 100644 --- a/Lib/test/mock_socket.py +++ b/Lib/test/mock_socket.py @@ -91,7 +91,7 @@ def makefile(self, mode='r', bufsize=-1): handle = MockFile(self.lines) return handle - def sendall(self, buffer, flags=None): + def sendall(self, data, flags=None): self.last = data self.output.append(data) return len(data) @@ -107,6 +107,9 @@ def getpeername(self): def close(self): pass + def connect(self, host): + pass + def socket(family=None, type=None, proto=None): return MockSocket(family) @@ -152,8 +155,12 @@ def getaddrinfo(*args, **kw): # Constants +_GLOBAL_DEFAULT_TIMEOUT = socket_module._GLOBAL_DEFAULT_TIMEOUT AF_INET = socket_module.AF_INET AF_INET6 = socket_module.AF_INET6 SOCK_STREAM = socket_module.SOCK_STREAM SOL_SOCKET = None SO_REUSEADDR = None + +if hasattr(socket_module, 'AF_UNIX'): + AF_UNIX = socket_module.AF_UNIX diff --git a/Lib/test/multibytecodec_support.py b/Lib/test/multibytecodec_support.py index cca8af67d6d1d6cc65f586517981b3a04aaf865d..f76c0153f5ecf7295c2536586f87cc72d5e12342 100644 --- a/Lib/test/multibytecodec_support.py +++ b/Lib/test/multibytecodec_support.py @@ -305,29 +305,23 @@ def test_mapping_file(self): self._test_mapping_file_plain() def _test_mapping_file_plain(self): - unichrs = lambda s: ''.join(map(chr, map(eval, s.split('+')))) + def unichrs(s): + return ''.join(chr(int(x, 16)) for x in s.split('+')) + urt_wa = {} with self.open_mapping_file() as f: for line in f: if not line: break - data = line.split('#')[0].strip().split() + data = line.split('#')[0].split() if len(data) != 2: continue - csetval = eval(data[0]) - if csetval <= 0x7F: - csetch = bytes([csetval & 0xff]) - elif csetval >= 0x1000000: - csetch = bytes([(csetval >> 24), ((csetval >> 16) & 0xff), - ((csetval >> 8) & 0xff), (csetval & 0xff)]) - elif csetval >= 0x10000: - csetch = bytes([(csetval >> 16), ((csetval >> 8) & 0xff), - (csetval & 0xff)]) - elif csetval >= 0x100: - csetch = bytes([(csetval >> 8), (csetval & 0xff)]) - else: + if data[0][:2] != '0x': + self.fail(f"Invalid line: {line!r}") + csetch = bytes.fromhex(data[0][2:]) + if len(csetch) == 1 and 0x80 <= csetch[0]: continue unich = unichrs(data[1]) diff --git a/Lib/test/outstanding_bugs.py b/Lib/test/outstanding_bugs.py deleted file mode 100644 index 7e527a6706436160946b77a06ab3edd5b011ee8b..0000000000000000000000000000000000000000 --- a/Lib/test/outstanding_bugs.py +++ /dev/null @@ -1,18 +0,0 @@ -# -# This file is for everybody to add tests for bugs that aren't -# fixed yet. Please add a test case and appropriate bug description. -# -# When you fix one of the bugs, please move the test to the correct -# test_ module. -# - -import unittest -from test import support - -# -# No test cases for outstanding bugs at the moment. -# - - -if __name__ == "__main__": - unittest.main() diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index ff7bbb0c8a9bff0eeac14400acef60004b76584f..7e279cc736a23669d88a5aa6a1c739d0c4aaa46a 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -65,6 +65,10 @@ def count_opcode(code, pickle): return n +def identity(x): + return x + + class UnseekableIO(io.BytesIO): def peek(self, *args): raise NotImplementedError @@ -134,11 +138,12 @@ class E(C): def __getinitargs__(self): return () -class H(object): +# Simple mutable object. +class Object: pass -# Hashable mutable key -class K(object): +# Hashable immutable key object containing unheshable mutable data. +class K: def __init__(self, value): self.value = value @@ -153,10 +158,6 @@ def __reduce__(self): D.__module__ = "__main__" __main__.E = E E.__module__ = "__main__" -__main__.H = H -H.__module__ = "__main__" -__main__.K = K -K.__module__ = "__main__" class myint(int): def __init__(self, x): @@ -1037,7 +1038,9 @@ def test_short_binunicode(self): self.assertEqual(self.loads(dumped), '\u20ac\x00') def test_misc_get(self): - self.check_unpickling_error(KeyError, b'g0\np0') + self.check_unpickling_error(pickle.UnpicklingError, b'g0\np0') + self.check_unpickling_error(pickle.UnpicklingError, b'jens:') + self.check_unpickling_error(pickle.UnpicklingError, b'hens:') self.assert_is_copy([(100,), (100,)], self.loads(b'((Kdtp0\nh\x00l.))')) @@ -1490,54 +1493,182 @@ def dont_test_disassembly(self): got = filelike.getvalue() self.assertEqual(expected, got) - def test_recursive_list(self): - l = [] + def _test_recursive_list(self, cls, aslist=identity, minprotocol=0): + # List containing itself. + l = cls() l.append(l) - for proto in protocols: + for proto in range(minprotocol, pickle.HIGHEST_PROTOCOL + 1): s = self.dumps(l, proto) x = self.loads(s) - self.assertIsInstance(x, list) - self.assertEqual(len(x), 1) - self.assertIs(x[0], x) + self.assertIsInstance(x, cls) + y = aslist(x) + self.assertEqual(len(y), 1) + self.assertIs(y[0], x) - def test_recursive_tuple_and_list(self): - t = ([],) + def test_recursive_list(self): + self._test_recursive_list(list) + + def test_recursive_list_subclass(self): + self._test_recursive_list(MyList, minprotocol=2) + + def test_recursive_list_like(self): + self._test_recursive_list(REX_six, aslist=lambda x: x.items) + + def _test_recursive_tuple_and_list(self, cls, aslist=identity, minprotocol=0): + # Tuple containing a list containing the original tuple. + t = (cls(),) t[0].append(t) - for proto in protocols: + for proto in range(minprotocol, pickle.HIGHEST_PROTOCOL + 1): s = self.dumps(t, proto) x = self.loads(s) self.assertIsInstance(x, tuple) self.assertEqual(len(x), 1) - self.assertIsInstance(x[0], list) - self.assertEqual(len(x[0]), 1) - self.assertIs(x[0][0], x) + self.assertIsInstance(x[0], cls) + y = aslist(x[0]) + self.assertEqual(len(y), 1) + self.assertIs(y[0], x) + + # List containing a tuple containing the original list. + t, = t + for proto in range(minprotocol, pickle.HIGHEST_PROTOCOL + 1): + s = self.dumps(t, proto) + x = self.loads(s) + self.assertIsInstance(x, cls) + y = aslist(x) + self.assertEqual(len(y), 1) + self.assertIsInstance(y[0], tuple) + self.assertEqual(len(y[0]), 1) + self.assertIs(y[0][0], x) - def test_recursive_dict(self): - d = {} + def test_recursive_tuple_and_list(self): + self._test_recursive_tuple_and_list(list) + + def test_recursive_tuple_and_list_subclass(self): + self._test_recursive_tuple_and_list(MyList, minprotocol=2) + + def test_recursive_tuple_and_list_like(self): + self._test_recursive_tuple_and_list(REX_six, aslist=lambda x: x.items) + + def _test_recursive_dict(self, cls, asdict=identity, minprotocol=0): + # Dict containing itself. + d = cls() d[1] = d - for proto in protocols: + for proto in range(minprotocol, pickle.HIGHEST_PROTOCOL + 1): s = self.dumps(d, proto) x = self.loads(s) - self.assertIsInstance(x, dict) - self.assertEqual(list(x.keys()), [1]) - self.assertIs(x[1], x) + self.assertIsInstance(x, cls) + y = asdict(x) + self.assertEqual(list(y.keys()), [1]) + self.assertIs(y[1], x) - def test_recursive_dict_key(self): - d = {} - k = K(d) - d[k] = 1 - for proto in protocols: + def test_recursive_dict(self): + self._test_recursive_dict(dict) + + def test_recursive_dict_subclass(self): + self._test_recursive_dict(MyDict, minprotocol=2) + + def test_recursive_dict_like(self): + self._test_recursive_dict(REX_seven, asdict=lambda x: x.table) + + def _test_recursive_tuple_and_dict(self, cls, asdict=identity, minprotocol=0): + # Tuple containing a dict containing the original tuple. + t = (cls(),) + t[0][1] = t + for proto in range(minprotocol, pickle.HIGHEST_PROTOCOL + 1): + s = self.dumps(t, proto) + x = self.loads(s) + self.assertIsInstance(x, tuple) + self.assertEqual(len(x), 1) + self.assertIsInstance(x[0], cls) + y = asdict(x[0]) + self.assertEqual(list(y), [1]) + self.assertIs(y[1], x) + + # Dict containing a tuple containing the original dict. + t, = t + for proto in range(minprotocol, pickle.HIGHEST_PROTOCOL + 1): + s = self.dumps(t, proto) + x = self.loads(s) + self.assertIsInstance(x, cls) + y = asdict(x) + self.assertEqual(list(y), [1]) + self.assertIsInstance(y[1], tuple) + self.assertEqual(len(y[1]), 1) + self.assertIs(y[1][0], x) + + def test_recursive_tuple_and_dict(self): + self._test_recursive_tuple_and_dict(dict) + + def test_recursive_tuple_and_dict_subclass(self): + self._test_recursive_tuple_and_dict(MyDict, minprotocol=2) + + def test_recursive_tuple_and_dict_like(self): + self._test_recursive_tuple_and_dict(REX_seven, asdict=lambda x: x.table) + + def _test_recursive_dict_key(self, cls, asdict=identity, minprotocol=0): + # Dict containing an immutable object (as key) containing the original + # dict. + d = cls() + d[K(d)] = 1 + for proto in range(minprotocol, pickle.HIGHEST_PROTOCOL + 1): s = self.dumps(d, proto) x = self.loads(s) - self.assertIsInstance(x, dict) - self.assertEqual(len(x.keys()), 1) - self.assertIsInstance(list(x.keys())[0], K) - self.assertIs(list(x.keys())[0].value, x) + self.assertIsInstance(x, cls) + y = asdict(x) + self.assertEqual(len(y.keys()), 1) + self.assertIsInstance(list(y.keys())[0], K) + self.assertIs(list(y.keys())[0].value, x) + + def test_recursive_dict_key(self): + self._test_recursive_dict_key(dict) + + def test_recursive_dict_subclass_key(self): + self._test_recursive_dict_key(MyDict, minprotocol=2) + + def test_recursive_dict_like_key(self): + self._test_recursive_dict_key(REX_seven, asdict=lambda x: x.table) + + def _test_recursive_tuple_and_dict_key(self, cls, asdict=identity, minprotocol=0): + # Tuple containing a dict containing an immutable object (as key) + # containing the original tuple. + t = (cls(),) + t[0][K(t)] = 1 + for proto in range(minprotocol, pickle.HIGHEST_PROTOCOL + 1): + s = self.dumps(t, proto) + x = self.loads(s) + self.assertIsInstance(x, tuple) + self.assertEqual(len(x), 1) + self.assertIsInstance(x[0], cls) + y = asdict(x[0]) + self.assertEqual(len(y), 1) + self.assertIsInstance(list(y.keys())[0], K) + self.assertIs(list(y.keys())[0].value, x) + + # Dict containing an immutable object (as key) containing a tuple + # containing the original dict. + t, = t + for proto in range(minprotocol, pickle.HIGHEST_PROTOCOL + 1): + s = self.dumps(t, proto) + x = self.loads(s) + self.assertIsInstance(x, cls) + y = asdict(x) + self.assertEqual(len(y), 1) + self.assertIsInstance(list(y.keys())[0], K) + self.assertIs(list(y.keys())[0].value[0], x) + + def test_recursive_tuple_and_dict_key(self): + self._test_recursive_tuple_and_dict_key(dict) + + def test_recursive_tuple_and_dict_subclass_key(self): + self._test_recursive_tuple_and_dict_key(MyDict, minprotocol=2) + + def test_recursive_tuple_and_dict_like_key(self): + self._test_recursive_tuple_and_dict_key(REX_seven, asdict=lambda x: x.table) def test_recursive_set(self): + # Set containing an immutable object containing the original set. y = set() - k = K(y) - y.add(k) + y.add(K(y)) for proto in range(4, pickle.HIGHEST_PROTOCOL + 1): s = self.dumps(y, proto) x = self.loads(s) @@ -1546,52 +1677,31 @@ def test_recursive_set(self): self.assertIsInstance(list(x)[0], K) self.assertIs(list(x)[0].value, x) - def test_recursive_list_subclass(self): - y = MyList() - y.append(y) - for proto in range(2, pickle.HIGHEST_PROTOCOL + 1): + # Immutable object containing a set containing the original object. + y, = y + for proto in range(4, pickle.HIGHEST_PROTOCOL + 1): s = self.dumps(y, proto) x = self.loads(s) - self.assertIsInstance(x, MyList) - self.assertEqual(len(x), 1) - self.assertIs(x[0], x) - - def test_recursive_dict_subclass(self): - d = MyDict() - d[1] = d - for proto in range(2, pickle.HIGHEST_PROTOCOL + 1): - s = self.dumps(d, proto) - x = self.loads(s) - self.assertIsInstance(x, MyDict) - self.assertEqual(list(x.keys()), [1]) - self.assertIs(x[1], x) - - def test_recursive_dict_subclass_key(self): - d = MyDict() - k = K(d) - d[k] = 1 - for proto in range(2, pickle.HIGHEST_PROTOCOL + 1): - s = self.dumps(d, proto) - x = self.loads(s) - self.assertIsInstance(x, MyDict) - self.assertEqual(len(list(x.keys())), 1) - self.assertIsInstance(list(x.keys())[0], K) - self.assertIs(list(x.keys())[0].value, x) + self.assertIsInstance(x, K) + self.assertIsInstance(x.value, set) + self.assertEqual(len(x.value), 1) + self.assertIs(list(x.value)[0], x) def test_recursive_inst(self): - i = C() + # Mutable object containing itself. + i = Object() i.attr = i for proto in protocols: s = self.dumps(i, proto) x = self.loads(s) - self.assertIsInstance(x, C) + self.assertIsInstance(x, Object) self.assertEqual(dir(x), dir(i)) self.assertIs(x.attr, x) def test_recursive_multi(self): l = [] d = {1:l} - i = C() + i = Object() i.attr = d l.append(i) for proto in protocols: @@ -1601,49 +1711,94 @@ def test_recursive_multi(self): self.assertEqual(len(x), 1) self.assertEqual(dir(x[0]), dir(i)) self.assertEqual(list(x[0].attr.keys()), [1]) - self.assertTrue(x[0].attr[1] is x) - - def check_recursive_collection_and_inst(self, factory): - h = H() - y = factory([h]) - h.attr = y + self.assertIs(x[0].attr[1], x) + + def _test_recursive_collection_and_inst(self, factory): + # Mutable object containing a collection containing the original + # object. + o = Object() + o.attr = factory([o]) + t = type(o.attr) for proto in protocols: - s = self.dumps(y, proto) + s = self.dumps(o, proto) x = self.loads(s) - self.assertIsInstance(x, type(y)) + self.assertIsInstance(x.attr, t) + self.assertEqual(len(x.attr), 1) + self.assertIsInstance(list(x.attr)[0], Object) + self.assertIs(list(x.attr)[0], x) + + # Collection containing a mutable object containing the original + # collection. + o = o.attr + for proto in protocols: + s = self.dumps(o, proto) + x = self.loads(s) + self.assertIsInstance(x, t) self.assertEqual(len(x), 1) - self.assertIsInstance(list(x)[0], H) + self.assertIsInstance(list(x)[0], Object) self.assertIs(list(x)[0].attr, x) def test_recursive_list_and_inst(self): - self.check_recursive_collection_and_inst(list) + self._test_recursive_collection_and_inst(list) def test_recursive_tuple_and_inst(self): - self.check_recursive_collection_and_inst(tuple) + self._test_recursive_collection_and_inst(tuple) def test_recursive_dict_and_inst(self): - self.check_recursive_collection_and_inst(dict.fromkeys) + self._test_recursive_collection_and_inst(dict.fromkeys) def test_recursive_set_and_inst(self): - self.check_recursive_collection_and_inst(set) + self._test_recursive_collection_and_inst(set) def test_recursive_frozenset_and_inst(self): - self.check_recursive_collection_and_inst(frozenset) + self._test_recursive_collection_and_inst(frozenset) def test_recursive_list_subclass_and_inst(self): - self.check_recursive_collection_and_inst(MyList) + self._test_recursive_collection_and_inst(MyList) def test_recursive_tuple_subclass_and_inst(self): - self.check_recursive_collection_and_inst(MyTuple) + self._test_recursive_collection_and_inst(MyTuple) def test_recursive_dict_subclass_and_inst(self): - self.check_recursive_collection_and_inst(MyDict.fromkeys) + self._test_recursive_collection_and_inst(MyDict.fromkeys) def test_recursive_set_subclass_and_inst(self): - self.check_recursive_collection_and_inst(MySet) + self._test_recursive_collection_and_inst(MySet) def test_recursive_frozenset_subclass_and_inst(self): - self.check_recursive_collection_and_inst(MyFrozenSet) + self._test_recursive_collection_and_inst(MyFrozenSet) + + def test_recursive_inst_state(self): + # Mutable object containing itself. + y = REX_state() + y.state = y + for proto in protocols: + s = self.dumps(y, proto) + x = self.loads(s) + self.assertIsInstance(x, REX_state) + self.assertIs(x.state, x) + + def test_recursive_tuple_and_inst_state(self): + # Tuple containing a mutable object containing the original tuple. + t = (REX_state(),) + t[0].state = t + for proto in protocols: + s = self.dumps(t, proto) + x = self.loads(s) + self.assertIsInstance(x, tuple) + self.assertEqual(len(x), 1) + self.assertIsInstance(x[0], REX_state) + self.assertIs(x[0].state, x) + + # Mutable object containing a tuple containing the object. + t, = t + for proto in protocols: + s = self.dumps(t, proto) + x = self.loads(s) + self.assertIsInstance(x, REX_state) + self.assertIsInstance(x.state, tuple) + self.assertEqual(len(x.state), 1) + self.assertIs(x.state[0], x) def test_unicode(self): endcases = ['', '<\\u>', '<\\\u1234>', '<\n>', @@ -1963,6 +2118,17 @@ def test_newobj_proxies(self): self.assertEqual(B(x), B(y), detail) self.assertEqual(x.__dict__, y.__dict__, detail) + def test_newobj_overridden_new(self): + # Test that Python class with C implemented __new__ is pickleable + for proto in protocols: + x = MyIntWithNew2(1) + x.foo = 42 + s = self.dumps(x, proto) + y = self.loads(s) + self.assertIs(type(y), MyIntWithNew2) + self.assertEqual(int(y), 1) + self.assertEqual(y.foo, 42) + def test_newobj_not_class(self): # Issue 24552 global SimpleNewObj @@ -3045,6 +3211,19 @@ def __setitem__(self, key, value): def __reduce__(self): return type(self), (), None, None, iter(self.table.items()) +class REX_state(object): + """This class is used to check the 3th argument (state) of + the reduce protocol. + """ + def __init__(self, state=None): + self.state = state + def __eq__(self, other): + return type(self) is type(other) and self.state == other.state + def __setstate__(self, state): + self.state = state + def __reduce__(self): + return type(self), (), self.state + # Test classes for newobj @@ -3083,6 +3262,13 @@ class MyFrozenSet(frozenset): MyStr, MyUnicode, MyTuple, MyList, MyDict, MySet, MyFrozenSet] +class MyIntWithNew(int): + def __new__(cls, value): + raise AssertionError + +class MyIntWithNew2(MyIntWithNew): + __new__ = int.__new__ + class SlotList(MyList): __slots__ = ["foo"] diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index 9f3e79fb784db25009f50a387bd65b0f6cf483f0..cc228fb3b54c9449fcb0a86b8ae12b882d68d09e 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -199,11 +199,19 @@ def format_attr(attr, value): ) copy_attributes(info_add, os, 'os.%s', attributes, formatter=format_attr) - call_func(info_add, 'os.getcwd', os, 'getcwd') - - call_func(info_add, 'os.getuid', os, 'getuid') - call_func(info_add, 'os.getgid', os, 'getgid') - call_func(info_add, 'os.uname', os, 'uname') + for func in ( + 'cpu_count', + 'getcwd', + 'getegid', + 'geteuid', + 'getgid', + 'getloadavg', + 'getresgid', + 'getresuid', + 'getuid', + 'uname', + ): + call_func(info_add, 'os.%s' % func, os, func) def format_groups(groups): return ', '.join(map(str, groups)) @@ -220,9 +228,6 @@ def format_groups(groups): else: info_add("os.login", login) - call_func(info_add, 'os.cpu_count', os, 'cpu_count') - call_func(info_add, 'os.getloadavg', os, 'getloadavg') - # Environment variables used by the stdlib and tests. Don't log the full # environment: filter to list to not leak sensitive information. # @@ -303,7 +308,7 @@ def format_groups(groups): if hasattr(os, 'umask'): mask = os.umask(0) os.umask(mask) - info_add("os.umask", '%03o' % mask) + info_add("os.umask", '0o%03o' % mask) def collect_pwd(info_add): @@ -715,6 +720,25 @@ def collect_windows(info_add): pass +def collect_fips(info_add): + try: + import _hashlib + except ImportError: + _hashlib = None + + if _hashlib is not None: + call_func(info_add, 'fips.openssl_fips_mode', _hashlib, 'get_fips_mode') + + try: + with open("/proc/sys/crypto/fips_enabled", encoding="utf-8") as fp: + line = fp.readline().rstrip() + + if line: + info_add('fips.linux_crypto_fips_enabled', line) + except OSError: + pass + + def collect_info(info): error = False info_add = info.add @@ -730,6 +754,7 @@ def collect_info(info): collect_datetime, collect_decimal, collect_expat, + collect_fips, collect_gdb, collect_gdbm, collect_get_config, @@ -757,7 +782,7 @@ def collect_info(info): ): try: collect_func(info_add) - except Exception as exc: + except Exception: error = True print("ERROR: %s() failed" % (collect_func.__name__), file=sys.stderr) diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py index 21b0edfd073d6e3c3e218d2ef7629c0359e2089a..0ffb3ed454eda07eb1ac32e94ad33d213e661d31 100755 --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -6,9 +6,6 @@ Run this script with -h or --help for documentation. """ -# We import importlib *ASAP* in order to test #15386 -import importlib - import os import sys from test.libregrtest import main diff --git a/Lib/test/seq_tests.py b/Lib/test/seq_tests.py index 65b110ef7818dac652ad6414628b94fd941269ea..1d9ad588987f9769bd98048558164fbdbe834027 100644 --- a/Lib/test/seq_tests.py +++ b/Lib/test/seq_tests.py @@ -6,6 +6,7 @@ import sys import pickle from test import support +from test.support import ALWAYS_EQ, NEVER_EQ # Various iterables # This is used for checking the constructor (here and in test_deque.py) @@ -221,15 +222,15 @@ def test_contains(self): self.assertRaises(TypeError, u.__contains__) def test_contains_fake(self): - class AllEq: - # Sequences must use rich comparison against each item - # (unless "is" is true, or an earlier item answered) - # So instances of AllEq must be found in all non-empty sequences. - def __eq__(self, other): - return True - __hash__ = None # Can't meet hash invariant requirements - self.assertNotIn(AllEq(), self.type2test([])) - self.assertIn(AllEq(), self.type2test([1])) + # Sequences must use rich comparison against each item + # (unless "is" is true, or an earlier item answered) + # So ALWAYS_EQ must be found in all non-empty sequences. + self.assertNotIn(ALWAYS_EQ, self.type2test([])) + self.assertIn(ALWAYS_EQ, self.type2test([1])) + self.assertIn(1, self.type2test([ALWAYS_EQ])) + self.assertNotIn(NEVER_EQ, self.type2test([])) + self.assertNotIn(ALWAYS_EQ, self.type2test([NEVER_EQ])) + self.assertIn(NEVER_EQ, self.type2test([ALWAYS_EQ])) def test_contains_order(self): # Sequences must test in-order. If a rich comparison has side @@ -350,6 +351,11 @@ def test_count(self): self.assertEqual(a.count(1), 3) self.assertEqual(a.count(3), 0) + self.assertEqual(a.count(ALWAYS_EQ), 9) + self.assertEqual(self.type2test([ALWAYS_EQ, ALWAYS_EQ]).count(1), 2) + self.assertEqual(self.type2test([ALWAYS_EQ, ALWAYS_EQ]).count(NEVER_EQ), 2) + self.assertEqual(self.type2test([NEVER_EQ, NEVER_EQ]).count(ALWAYS_EQ), 0) + self.assertRaises(TypeError, a.count) class BadExc(Exception): @@ -378,6 +384,11 @@ def test_index(self): self.assertEqual(u.index(0, 3, 4), 3) self.assertRaises(ValueError, u.index, 2, 0, -10) + self.assertEqual(u.index(ALWAYS_EQ), 0) + self.assertEqual(self.type2test([ALWAYS_EQ, ALWAYS_EQ]).index(1), 0) + self.assertEqual(self.type2test([ALWAYS_EQ, ALWAYS_EQ]).index(NEVER_EQ), 0) + self.assertRaises(ValueError, self.type2test([NEVER_EQ, NEVER_EQ]).index, ALWAYS_EQ) + self.assertRaises(TypeError, u.index) class BadExc(Exception): diff --git a/Lib/test/signalinterproctester.py b/Lib/test/signalinterproctester.py index 168b5da0f2c0f9e57235a2113e94a89d002c8a43..bc60b747f71680ee9105b585a78eeb661dcf8922 100644 --- a/Lib/test/signalinterproctester.py +++ b/Lib/test/signalinterproctester.py @@ -4,6 +4,7 @@ import sys import time import unittest +from test import support class SIGUSR1Exception(Exception): @@ -27,7 +28,7 @@ def wait_signal(self, child, signame): # (if set) child.wait() - timeout = 10.0 + timeout = support.SHORT_TIMEOUT deadline = time.monotonic() + timeout while time.monotonic() < deadline: diff --git a/Lib/test/ssl_servers.py b/Lib/test/ssl_servers.py index bfe533c48011ddb6a2dcbe007b09cc0bba9af59e..a4bd7455d47e76dab1b692dc1e3c491ac2409d89 100644 --- a/Lib/test/ssl_servers.py +++ b/Lib/test/ssl_servers.py @@ -9,10 +9,11 @@ SimpleHTTPRequestHandler, BaseHTTPRequestHandler) from test import support +from test.support import socket_helper here = os.path.dirname(__file__) -HOST = support.HOST +HOST = socket_helper.HOST CERTFILE = os.path.join(here, 'keycert.pem') # This one's based on HTTPServer, which is based on socketserver @@ -49,7 +50,7 @@ class RootedHTTPRequestHandler(SimpleHTTPRequestHandler): server_version = "TestHTTPS/1.0" root = here # Avoid hanging when a request gets interrupted by the client - timeout = 5 + timeout = support.LOOPBACK_TIMEOUT def translate_path(self, path): """Translate a /-separated PATH to the local filename syntax. diff --git a/Lib/test/string_tests.py b/Lib/test/string_tests.py index 38da941f7f50e19f4e2e33f83553a8a37d4d6f49..527f505c0169b3484f07c4e8595aa16f4efb452a 100644 --- a/Lib/test/string_tests.py +++ b/Lib/test/string_tests.py @@ -505,6 +505,7 @@ def test_replace(self): EQ("", "", "replace", "A", "") EQ("", "", "replace", "A", "A") EQ("", "", "replace", "", "", 100) + EQ("A", "", "replace", "", "A", 100) EQ("", "", "replace", "", "", sys.maxsize) # interleave (from=="", 'to' gets inserted everywhere) @@ -681,6 +682,42 @@ def test_replace_overflow(self): self.checkraises(OverflowError, A2_16, "replace", "A", A2_16) self.checkraises(OverflowError, A2_16, "replace", "AA", A2_16+A2_16) + def test_removeprefix(self): + self.checkequal('am', 'spam', 'removeprefix', 'sp') + self.checkequal('spamspam', 'spamspamspam', 'removeprefix', 'spam') + self.checkequal('spam', 'spam', 'removeprefix', 'python') + self.checkequal('spam', 'spam', 'removeprefix', 'spider') + self.checkequal('spam', 'spam', 'removeprefix', 'spam and eggs') + + self.checkequal('', '', 'removeprefix', '') + self.checkequal('', '', 'removeprefix', 'abcde') + self.checkequal('abcde', 'abcde', 'removeprefix', '') + self.checkequal('', 'abcde', 'removeprefix', 'abcde') + + self.checkraises(TypeError, 'hello', 'removeprefix') + self.checkraises(TypeError, 'hello', 'removeprefix', 42) + self.checkraises(TypeError, 'hello', 'removeprefix', 42, 'h') + self.checkraises(TypeError, 'hello', 'removeprefix', 'h', 42) + self.checkraises(TypeError, 'hello', 'removeprefix', ("he", "l")) + + def test_removesuffix(self): + self.checkequal('sp', 'spam', 'removesuffix', 'am') + self.checkequal('spamspam', 'spamspamspam', 'removesuffix', 'spam') + self.checkequal('spam', 'spam', 'removesuffix', 'python') + self.checkequal('spam', 'spam', 'removesuffix', 'blam') + self.checkequal('spam', 'spam', 'removesuffix', 'eggs and spam') + + self.checkequal('', '', 'removesuffix', '') + self.checkequal('', '', 'removesuffix', 'abcde') + self.checkequal('abcde', 'abcde', 'removesuffix', '') + self.checkequal('', 'abcde', 'removesuffix', 'abcde') + + self.checkraises(TypeError, 'hello', 'removesuffix') + self.checkraises(TypeError, 'hello', 'removesuffix', 42) + self.checkraises(TypeError, 'hello', 'removesuffix', 42, 'h') + self.checkraises(TypeError, 'hello', 'removesuffix', 'h', 42) + self.checkraises(TypeError, 'hello', 'removesuffix', ("lo", "l")) + def test_capitalize(self): self.checkequal(' hello ', ' hello ', 'capitalize') self.checkequal('Hello ', 'Hello ','capitalize') diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index fb09e0623e5902794b91e0fb70af84da99182923..aee3737ffc4097884ea38e77ef54f5d7228a6583 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -3,77 +3,31 @@ if __name__ != 'test.support': raise ImportError('support must be imported from the test package') -import asyncio.events import collections.abc import contextlib import errno -import faulthandler import fnmatch import functools -import gc import glob -import hashlib import importlib import importlib.util -import locale -import logging.handlers -import nntplib import os import platform import re -import shutil -import socket import stat import struct import subprocess import sys import sysconfig -import tempfile import _thread import threading import time import types import unittest -import urllib.error import warnings from .testresult import get_test_runner -try: - import multiprocessing.process -except ImportError: - multiprocessing = None - -try: - import zlib -except ImportError: - zlib = None - -try: - import gzip -except ImportError: - gzip = None - -try: - import bz2 -except ImportError: - bz2 = None - -try: - import lzma -except ImportError: - lzma = None - -try: - import resource -except ImportError: - resource = None - -try: - import _hashlib -except ImportError: - _hashlib = None - __all__ = [ # globals "PIPE_MAX_SIZE", "verbose", "max_memuse", "use_resources", "failfast", @@ -91,26 +45,23 @@ "create_empty_file", "can_symlink", "fs_is_case_insensitive", # unittest "is_resource_enabled", "requires", "requires_freebsd_version", - "requires_linux_version", "requires_mac_ver", "requires_hashdigest", + "requires_linux_version", "requires_mac_ver", "check_syntax_error", "check_syntax_warning", "TransientResource", "time_out", "socket_peer_reset", "ioerror_peer_reset", - "transient_internet", "BasicTestRunner", "run_unittest", "run_doctest", + "BasicTestRunner", "run_unittest", "run_doctest", "skip_unless_symlink", "requires_gzip", "requires_bz2", "requires_lzma", "bigmemtest", "bigaddrspacetest", "cpython_only", "get_attribute", "requires_IEEE_754", "skip_unless_xattr", "requires_zlib", "anticipate_failure", "load_package_tests", "detect_api_mismatch", - "check__all__", "skip_unless_bind_unix_socket", "skip_if_buggy_ucrt_strfptime", + "check__all__", "skip_if_buggy_ucrt_strfptime", "ignore_warnings", # sys "is_jython", "is_android", "check_impl_detail", "unix_shell", "setswitchinterval", # network - "HOST", "IPV6_ENABLED", "find_unused_port", "bind_port", "open_urlresource", - "bind_unix_socket", + "open_urlresource", # processes 'temp_umask', "reap_children", - # logging - "TestHandler", # threads "threading_setup", "threading_cleanup", "reap_threads", "start_threads", # miscellaneous @@ -119,9 +70,51 @@ "run_with_locale", "swap_item", "swap_attr", "Matcher", "set_memlimit", "SuppressCrashReport", "sortdict", "run_with_tz", "PGO", "missing_compiler_executable", "fd_count", - "ALWAYS_EQ", "LARGEST", "SMALLEST" + "ALWAYS_EQ", "NEVER_EQ", "LARGEST", "SMALLEST", + "LOOPBACK_TIMEOUT", "INTERNET_TIMEOUT", "SHORT_TIMEOUT", "LONG_TIMEOUT", ] + +# Timeout in seconds for tests using a network server listening on the network +# local loopback interface like 127.0.0.1. +# +# The timeout is long enough to prevent test failure: it takes into account +# that the client and the server can run in different threads or even different +# processes. +# +# The timeout should be long enough for connect(), recv() and send() methods +# of socket.socket. +LOOPBACK_TIMEOUT = 5.0 +if sys.platform == 'win32' and platform.machine() == 'ARM': + # bpo-37553: test_socket.SendfileUsingSendTest is taking longer than 2 + # seconds on Windows ARM32 buildbot + LOOPBACK_TIMEOUT = 10 + +# Timeout in seconds for network requests going to the Internet. The timeout is +# short enough to prevent a test to wait for too long if the Internet request +# is blocked for whatever reason. +# +# Usually, a timeout using INTERNET_TIMEOUT should not mark a test as failed, +# but skip the test instead: see transient_internet(). +INTERNET_TIMEOUT = 60.0 + +# Timeout in seconds to mark a test as failed if the test takes "too long". +# +# The timeout value depends on the regrtest --timeout command line option. +# +# If a test using SHORT_TIMEOUT starts to fail randomly on slow buildbots, use +# LONG_TIMEOUT instead. +SHORT_TIMEOUT = 30.0 + +# Timeout in seconds to detect when a test hangs. +# +# It is long enough to reduce the risk of test failure on the slowest Python +# buildbots. It should not be used to mark a test as failed if the test takes +# "too long". The timeout value depends on the regrtest --timeout command line +# option. +LONG_TIMEOUT = 5 * 60.0 + + class Error(Exception): """Base class for regression test exceptions.""" @@ -417,6 +410,7 @@ def _longpath(path): _rmdir = os.rmdir def _rmtree(path): + import shutil try: shutil.rmtree(path) return @@ -492,7 +486,9 @@ def _is_gui_available(): if hasattr(_is_gui_available, 'result'): return _is_gui_available.result reason = None - if sys.platform.startswith('win'): + if sys.platform.startswith('win') and platform.win32_is_iot(): + reason = "gui is not available on Windows IoT Core" + elif sys.platform.startswith('win'): # if Python is running as a service (such as the buildbot service), # gui interaction may be disallowed import ctypes @@ -652,165 +648,6 @@ def wrapper(*args, **kw): return decorator -def requires_hashdigest(digestname, openssl=None): - """Decorator raising SkipTest if a hashing algorithm is not available - - The hashing algorithm could be missing or blocked by a strict crypto - policy. - - If 'openssl' is True, then the decorator checks that OpenSSL provides - the algorithm. Otherwise the check falls back to built-in - implementations. - - ValueError: [digital envelope routines: EVP_DigestInit_ex] disabled for FIPS - ValueError: unsupported hash type md4 - """ - def decorator(func): - @functools.wraps(func) - def wrapper(*args, **kwargs): - try: - if openssl and _hashlib is not None: - _hashlib.new(digestname) - else: - hashlib.new(digestname) - except ValueError: - raise unittest.SkipTest( - f"hash digest '{digestname}' is not available." - ) - return func(*args, **kwargs) - return wrapper - return decorator - - -HOST = "localhost" -HOSTv4 = "127.0.0.1" -HOSTv6 = "::1" - - -def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM): - """Returns an unused port that should be suitable for binding. This is - achieved by creating a temporary socket with the same family and type as - the 'sock' parameter (default is AF_INET, SOCK_STREAM), and binding it to - the specified host address (defaults to 0.0.0.0) with the port set to 0, - eliciting an unused ephemeral port from the OS. The temporary socket is - then closed and deleted, and the ephemeral port is returned. - - Either this method or bind_port() should be used for any tests where a - server socket needs to be bound to a particular port for the duration of - the test. Which one to use depends on whether the calling code is creating - a python socket, or if an unused port needs to be provided in a constructor - or passed to an external program (i.e. the -accept argument to openssl's - s_server mode). Always prefer bind_port() over find_unused_port() where - possible. Hard coded ports should *NEVER* be used. As soon as a server - socket is bound to a hard coded port, the ability to run multiple instances - of the test simultaneously on the same host is compromised, which makes the - test a ticking time bomb in a buildbot environment. On Unix buildbots, this - may simply manifest as a failed test, which can be recovered from without - intervention in most cases, but on Windows, the entire python process can - completely and utterly wedge, requiring someone to log in to the buildbot - and manually kill the affected process. - - (This is easy to reproduce on Windows, unfortunately, and can be traced to - the SO_REUSEADDR socket option having different semantics on Windows versus - Unix/Linux. On Unix, you can't have two AF_INET SOCK_STREAM sockets bind, - listen and then accept connections on identical host/ports. An EADDRINUSE - OSError will be raised at some point (depending on the platform and - the order bind and listen were called on each socket). - - However, on Windows, if SO_REUSEADDR is set on the sockets, no EADDRINUSE - will ever be raised when attempting to bind two identical host/ports. When - accept() is called on each socket, the second caller's process will steal - the port from the first caller, leaving them both in an awkwardly wedged - state where they'll no longer respond to any signals or graceful kills, and - must be forcibly killed via OpenProcess()/TerminateProcess(). - - The solution on Windows is to use the SO_EXCLUSIVEADDRUSE socket option - instead of SO_REUSEADDR, which effectively affords the same semantics as - SO_REUSEADDR on Unix. Given the propensity of Unix developers in the Open - Source world compared to Windows ones, this is a common mistake. A quick - look over OpenSSL's 0.9.8g source shows that they use SO_REUSEADDR when - openssl.exe is called with the 's_server' option, for example. See - http://bugs.python.org/issue2550 for more info. The following site also - has a very thorough description about the implications of both REUSEADDR - and EXCLUSIVEADDRUSE on Windows: - http://msdn2.microsoft.com/en-us/library/ms740621(VS.85).aspx) - - XXX: although this approach is a vast improvement on previous attempts to - elicit unused ports, it rests heavily on the assumption that the ephemeral - port returned to us by the OS won't immediately be dished back out to some - other process when we close and delete our temporary socket but before our - calling code has a chance to bind the returned port. We can deal with this - issue if/when we come across it. - """ - - with socket.socket(family, socktype) as tempsock: - port = bind_port(tempsock) - del tempsock - return port - -def bind_port(sock, host=HOST): - """Bind the socket to a free port and return the port number. Relies on - ephemeral ports in order to ensure we are using an unbound port. This is - important as many tests may be running simultaneously, especially in a - buildbot environment. This method raises an exception if the sock.family - is AF_INET and sock.type is SOCK_STREAM, *and* the socket has SO_REUSEADDR - or SO_REUSEPORT set on it. Tests should *never* set these socket options - for TCP/IP sockets. The only case for setting these options is testing - multicasting via multiple UDP sockets. - - Additionally, if the SO_EXCLUSIVEADDRUSE socket option is available (i.e. - on Windows), it will be set on the socket. This will prevent anyone else - from bind()'ing to our host/port for the duration of the test. - """ - - if sock.family == socket.AF_INET and sock.type == socket.SOCK_STREAM: - if hasattr(socket, 'SO_REUSEADDR'): - if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1: - raise TestFailed("tests should never set the SO_REUSEADDR " \ - "socket option on TCP/IP sockets!") - if hasattr(socket, 'SO_REUSEPORT'): - try: - if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1: - raise TestFailed("tests should never set the SO_REUSEPORT " \ - "socket option on TCP/IP sockets!") - except OSError: - # Python's socket module was compiled using modern headers - # thus defining SO_REUSEPORT but this process is running - # under an older kernel that does not support SO_REUSEPORT. - pass - if hasattr(socket, 'SO_EXCLUSIVEADDRUSE'): - sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1) - - sock.bind((host, 0)) - port = sock.getsockname()[1] - return port - -def bind_unix_socket(sock, addr): - """Bind a unix socket, raising SkipTest if PermissionError is raised.""" - assert sock.family == socket.AF_UNIX - try: - sock.bind(addr) - except PermissionError: - sock.close() - raise unittest.SkipTest('cannot bind AF_UNIX sockets') - -def _is_ipv6_enabled(): - """Check whether IPv6 is enabled on this host.""" - if socket.has_ipv6: - sock = None - try: - sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) - sock.bind((HOSTv6, 0)) - return True - except OSError: - pass - finally: - if sock: - sock.close() - return False - -IPV6_ENABLED = _is_ipv6_enabled() - def system_must_validate_cert(f): """Skip the test on TLS certificate validation failures.""" @functools.wraps(f) @@ -843,13 +680,33 @@ def dec(*args, **kwargs): float.__getformat__("double").startswith("IEEE"), "test requires IEEE 754 doubles") -requires_zlib = unittest.skipUnless(zlib, 'requires zlib') +def requires_zlib(reason='requires zlib'): + try: + import zlib + except ImportError: + zlib = None + return unittest.skipUnless(zlib, reason) -requires_gzip = unittest.skipUnless(gzip, 'requires gzip') +def requires_gzip(reason='requires gzip'): + try: + import gzip + except ImportError: + gzip = None + return unittest.skipUnless(gzip, reason) -requires_bz2 = unittest.skipUnless(bz2, 'requires bz2') +def requires_bz2(reason='requires bz2'): + try: + import bz2 + except ImportError: + bz2 = None + return unittest.skipUnless(bz2, reason) -requires_lzma = unittest.skipUnless(lzma, 'requires lzma') +def requires_lzma(reason='requires lzma'): + try: + import lzma + except ImportError: + lzma = None + return unittest.skipUnless(lzma, reason) is_jython = sys.platform.startswith('java') @@ -863,21 +720,21 @@ def dec(*args, **kwargs): # Filename used for testing if os.name == 'java': # Jython disallows @ in module names - TESTFN = '$test' + TESTFN_ASCII = '$test' else: - TESTFN = '@test' + TESTFN_ASCII = '@test' # Disambiguate TESTFN for parallel testing, while letting it remain a valid # module name. -TESTFN = "{}_{}_tmp".format(TESTFN, os.getpid()) +TESTFN_ASCII = "{}_{}_tmp".format(TESTFN_ASCII, os.getpid()) # Define the URL of a dedicated HTTP server for the network tests. # The URL must use clear-text HTTP: no redirection to encrypted HTTPS. TEST_HTTP_URL = "http://www.pythontest.net" # FS_NONASCII: non-ASCII character encodable by os.fsencode(), -# or None if there is no such character. -FS_NONASCII = None +# or an empty string if there is no such character. +FS_NONASCII = '' for character in ( # First try printable and common characters to have a readable filename. # For each character, the encoding list are just example of encodings able @@ -924,7 +781,7 @@ def dec(*args, **kwargs): break # TESTFN_UNICODE is a non-ascii filename -TESTFN_UNICODE = TESTFN + "-\xe0\xf2\u0258\u0141\u011f" +TESTFN_UNICODE = TESTFN_ASCII + "-\xe0\xf2\u0258\u0141\u011f" if sys.platform == 'darwin': # In Mac OS X's VFS API file names are, by definition, canonically # decomposed Unicode, encoded using UTF-8. See QA1173: @@ -942,7 +799,7 @@ def dec(*args, **kwargs): if sys.getwindowsversion().platform >= 2: # Different kinds of characters from various languages to minimize the # probability that the whole name is encodable to MBCS (issue #9819) - TESTFN_UNENCODABLE = TESTFN + "-\u5171\u0141\u2661\u0363\uDC80" + TESTFN_UNENCODABLE = TESTFN_ASCII + "-\u5171\u0141\u2661\u0363\uDC80" try: TESTFN_UNENCODABLE.encode(TESTFN_ENCODING) except UnicodeEncodeError: @@ -959,7 +816,7 @@ def dec(*args, **kwargs): b'\xff'.decode(TESTFN_ENCODING) except UnicodeDecodeError: # 0xff will be encoded using the surrogate character u+DCFF - TESTFN_UNENCODABLE = TESTFN \ + TESTFN_UNENCODABLE = TESTFN_ASCII \ + b'-\xff'.decode(TESTFN_ENCODING, 'surrogateescape') else: # File system encoding (eg. ISO-8859-* encodings) can encode @@ -993,13 +850,14 @@ def dec(*args, **kwargs): try: name.decode(TESTFN_ENCODING) except UnicodeDecodeError: - TESTFN_UNDECODABLE = os.fsencode(TESTFN) + name + TESTFN_UNDECODABLE = os.fsencode(TESTFN_ASCII) + name break if FS_NONASCII: - TESTFN_NONASCII = TESTFN + '-' + FS_NONASCII + TESTFN_NONASCII = TESTFN_ASCII + FS_NONASCII else: TESTFN_NONASCII = None +TESTFN = TESTFN_NONASCII or TESTFN_ASCII # Save the initial cwd SAVEDCWD = os.getcwd() @@ -1026,6 +884,7 @@ def temp_dir(path=None, quiet=False): created, only a warning is issued. """ + import tempfile dir_created = False if path is None: path = tempfile.mkdtemp() @@ -1199,6 +1058,10 @@ def check_syntax_warning(testcase, statement, errtext='', *, lineno=1, offset=No def open_urlresource(url, *args, **kw): import urllib.request, urllib.parse + try: + import gzip + except ImportError: + gzip = None check = kw.pop('check', None) @@ -1229,7 +1092,7 @@ def check_valid_file(fn): opener = urllib.request.build_opener() if gzip: opener.addheaders.append(('Accept-Encoding', 'gzip')) - f = opener.open(url, timeout=15) + f = opener.open(url, timeout=INTERNET_TIMEOUT) if gzip and f.headers.get('Content-Encoding') == 'gzip': f = gzip.GzipFile(fileobj=f) try: @@ -1518,105 +1381,6 @@ def __exit__(self, type_=None, value=None, traceback=None): ioerror_peer_reset = TransientResource(OSError, errno=errno.ECONNRESET) -def get_socket_conn_refused_errs(): - """ - Get the different socket error numbers ('errno') which can be received - when a connection is refused. - """ - errors = [errno.ECONNREFUSED] - if hasattr(errno, 'ENETUNREACH'): - # On Solaris, ENETUNREACH is returned sometimes instead of ECONNREFUSED - errors.append(errno.ENETUNREACH) - if hasattr(errno, 'EADDRNOTAVAIL'): - # bpo-31910: socket.create_connection() fails randomly - # with EADDRNOTAVAIL on Travis CI - errors.append(errno.EADDRNOTAVAIL) - if hasattr(errno, 'EHOSTUNREACH'): - # bpo-37583: The destination host cannot be reached - errors.append(errno.EHOSTUNREACH) - if not IPV6_ENABLED: - errors.append(errno.EAFNOSUPPORT) - return errors - - -@contextlib.contextmanager -def transient_internet(resource_name, *, timeout=30.0, errnos=()): - """Return a context manager that raises ResourceDenied when various issues - with the Internet connection manifest themselves as exceptions.""" - default_errnos = [ - ('ECONNREFUSED', 111), - ('ECONNRESET', 104), - ('EHOSTUNREACH', 113), - ('ENETUNREACH', 101), - ('ETIMEDOUT', 110), - # socket.create_connection() fails randomly with - # EADDRNOTAVAIL on Travis CI. - ('EADDRNOTAVAIL', 99), - ] - default_gai_errnos = [ - ('EAI_AGAIN', -3), - ('EAI_FAIL', -4), - ('EAI_NONAME', -2), - ('EAI_NODATA', -5), - # Encountered when trying to resolve IPv6-only hostnames - ('WSANO_DATA', 11004), - ] - - denied = ResourceDenied("Resource %r is not available" % resource_name) - captured_errnos = errnos - gai_errnos = [] - if not captured_errnos: - captured_errnos = [getattr(errno, name, num) - for (name, num) in default_errnos] - gai_errnos = [getattr(socket, name, num) - for (name, num) in default_gai_errnos] - - def filter_error(err): - n = getattr(err, 'errno', None) - if (isinstance(err, socket.timeout) or - (isinstance(err, socket.gaierror) and n in gai_errnos) or - (isinstance(err, urllib.error.HTTPError) and - 500 <= err.code <= 599) or - (isinstance(err, urllib.error.URLError) and - (("ConnectionRefusedError" in err.reason) or - ("TimeoutError" in err.reason) or - ("EOFError" in err.reason))) or - n in captured_errnos): - if not verbose: - sys.stderr.write(denied.args[0] + "\n") - raise denied from err - - old_timeout = socket.getdefaulttimeout() - try: - if timeout is not None: - socket.setdefaulttimeout(timeout) - yield - except nntplib.NNTPTemporaryError as err: - if verbose: - sys.stderr.write(denied.args[0] + "\n") - raise denied from err - except OSError as err: - # urllib can wrap original socket errors multiple times (!), we must - # unwrap to get at the original error. - while True: - a = err.args - if len(a) >= 1 and isinstance(a[0], OSError): - err = a[0] - # The error can also be wrapped as args[1]: - # except socket.error as msg: - # raise OSError('socket error', msg).with_traceback(sys.exc_info()[2]) - elif len(a) >= 2 and isinstance(a[1], OSError): - err = a[1] - else: - break - filter_error(err) - raise - # XXX should we catch generic exceptions and look for their - # __cause__ or __context__? - finally: - socket.setdefaulttimeout(old_timeout) - - @contextlib.contextmanager def captured_output(stream_name): """Return a context manager used by captured_stdout/stdin/stderr @@ -1670,6 +1434,7 @@ def gc_collect(): longer than expected. This function tries its best to force all garbage objects to disappear. """ + import gc gc.collect() if is_jython: time.sleep(0.1) @@ -1678,6 +1443,7 @@ def gc_collect(): @contextlib.contextmanager def disable_gc(): + import gc have_gc = gc.isenabled() gc.disable() try: @@ -1715,12 +1481,12 @@ def calcvobjsize(fmt): _TPFLAGS_HEAPTYPE = 1<<9 def check_sizeof(test, o, size): - import _testcapi + import _testinternalcapi result = sys.getsizeof(o) # add GC header size if ((type(o) == type) and (o.__flags__ & _TPFLAGS_HEAPTYPE) or\ ((type(o) != type) and (type(o).__flags__ & _TPFLAGS_HAVE_GC))): - size += _testcapi.SIZEOF_PYGC_HEAD + size += _testinternalcapi.SIZEOF_PYGC_HEAD msg = 'wrong size for %s: got %d, expected %d' \ % (type(o), result, size) test.assertEqual(result, size, msg) @@ -2292,7 +2058,7 @@ def decorator(*args): @contextlib.contextmanager -def wait_threads_exit(timeout=60.0): +def wait_threads_exit(timeout=None): """ bpo-31234: Context manager to wait until all threads created in the with statement exit. @@ -2306,6 +2072,8 @@ def wait_threads_exit(timeout=60.0): which doesn't allow to wait for thread exit, whereas thread.Thread has a join() method. """ + if timeout is None: + timeout = SHORT_TIMEOUT old_count = _thread._count() try: yield @@ -2326,10 +2094,12 @@ def wait_threads_exit(timeout=60.0): gc_collect() -def join_thread(thread, timeout=30.0): +def join_thread(thread, timeout=None): """Join a thread. Raise an AssertionError if the thread is still alive after timeout seconds. """ + if timeout is None: + timeout = SHORT_TIMEOUT thread.join(timeout) if thread.is_alive(): msg = f"failed to join the thread in {timeout:.1f} seconds" @@ -2366,6 +2136,7 @@ def reap_children(): @contextlib.contextmanager def start_threads(threads, unlock=None): + import faulthandler threads = list(threads) started = [] try: @@ -2462,19 +2233,6 @@ def swap_item(obj, item, new_val): if item in obj: del obj[item] -def strip_python_stderr(stderr): - """Strip the stderr of a Python process from potential debug output - emitted by the interpreter. - - This will typically be run on the result of the communicate() method - of a subprocess.Popen object. - """ - stderr = re.sub(br"\[\d+ refs, \d+ blocks\]\r?\n?", b"", stderr).strip() - return stderr - -requires_type_collecting = unittest.skipIf(hasattr(sys, 'getcounts'), - 'types are immortal if COUNT_ALLOCS is defined') - def args_from_interpreter_flags(): """Return a list of command-line arguments reproducing the current settings in sys.flags and sys.warnoptions.""" @@ -2485,37 +2243,6 @@ def optim_args_from_interpreter_flags(): optimization settings in sys.flags.""" return subprocess._optim_args_from_interpreter_flags() -#============================================================ -# Support for assertions about logging. -#============================================================ - -class TestHandler(logging.handlers.BufferingHandler): - def __init__(self, matcher): - # BufferingHandler takes a "capacity" argument - # so as to know when to flush. As we're overriding - # shouldFlush anyway, we can set a capacity of zero. - # You can call flush() manually to clear out the - # buffer. - logging.handlers.BufferingHandler.__init__(self, 0) - self.matcher = matcher - - def shouldFlush(self): - return False - - def emit(self, record): - self.format(record) - self.buffer.append(record.__dict__) - - def matches(self, **kwargs): - """ - Look for a saved dict whose keys/values match the supplied arguments. - """ - result = False - for d in self.buffer: - if self.matcher.matches(d, **kwargs): - result = True - break - return result class Matcher(object): @@ -2584,6 +2311,7 @@ def skip_if_buggy_ucrt_strfptime(test): See bpo-37552 [Windows] strptime/strftime return invalid results with UCRT version 17763.615 """ + import locale global _buggy_ucrt if _buggy_ucrt is None: if(sys.platform == 'win32' and @@ -2674,6 +2402,7 @@ def call_link(self, *args, returncode=0): _can_xattr = None def can_xattr(): + import tempfile global _can_xattr if _can_xattr is not None: return _can_xattr @@ -2715,31 +2444,10 @@ def skip_if_pgo_task(test): msg = "Not run for (non-extended) PGO task" return test if ok else unittest.skip(msg)(test) -_bind_nix_socket_error = None -def skip_unless_bind_unix_socket(test): - """Decorator for tests requiring a functional bind() for unix sockets.""" - if not hasattr(socket, 'AF_UNIX'): - return unittest.skip('No UNIX Sockets')(test) - global _bind_nix_socket_error - if _bind_nix_socket_error is None: - path = TESTFN + "can_bind_unix_socket" - with socket.socket(socket.AF_UNIX) as sock: - try: - sock.bind(path) - _bind_nix_socket_error = False - except OSError as e: - _bind_nix_socket_error = e - finally: - unlink(path) - if _bind_nix_socket_error: - msg = 'Requires a functional unix bind(): %s' % _bind_nix_socket_error - return unittest.skip(msg)(test) - else: - return test - def fs_is_case_insensitive(directory): """Detects if the file system for the specified directory is case-insensitive.""" + import tempfile with tempfile.NamedTemporaryFile(dir=directory) as base: base_path = base.name case_path = base_path.upper() @@ -2889,11 +2597,16 @@ def __enter__(self): self.old_modes[report_type] = old_mode, old_file else: - if resource is not None: + try: + import resource + self.resource = resource + except ImportError: + self.resource = None + if self.resource is not None: try: - self.old_value = resource.getrlimit(resource.RLIMIT_CORE) - resource.setrlimit(resource.RLIMIT_CORE, - (0, self.old_value[1])) + self.old_value = self.resource.getrlimit(self.resource.RLIMIT_CORE) + self.resource.setrlimit(self.resource.RLIMIT_CORE, + (0, self.old_value[1])) except (ValueError, OSError): pass @@ -2931,9 +2644,9 @@ def __exit__(self, *ignore_exc): msvcrt.CrtSetReportMode(report_type, old_mode) msvcrt.CrtSetReportFile(report_type, old_file) else: - if resource is not None: + if self.resource is not None: try: - resource.setrlimit(resource.RLIMIT_CORE, self.old_value) + self.resource.setrlimit(self.resource.RLIMIT_CORE, self.old_value) except (ValueError, OSError): pass @@ -3020,9 +2733,15 @@ def missing_compiler_executable(cmd_names=[]): missing. """ - from distutils import ccompiler, sysconfig, spawn + from distutils import ccompiler, sysconfig, spawn, errors compiler = ccompiler.new_compiler() sysconfig.customize_compiler(compiler) + if compiler.compiler_type == "msvc": + # MSVC has no executables, so check whether initialization succeeds + try: + compiler.initialize() + except errors.DistutilsPlatformError: + return "msvc" for name in compiler.executables: if cmd_names and name not in cmd_names: continue @@ -3053,6 +2772,8 @@ def setswitchinterval(interval): @contextlib.contextmanager def disable_faulthandler(): + import faulthandler + # use sys.__stderr__ instead of sys.stderr, since regrtest replaces # sys.stderr with a StringIO which has no file descriptor when a test # is run with -W/--verbose3. @@ -3199,6 +2920,19 @@ def __ne__(self, other): ALWAYS_EQ = _ALWAYS_EQ() +class _NEVER_EQ: + """ + Object that is not equal to anything. + """ + def __eq__(self, other): + return False + def __ne__(self, other): + return True + def __hash__(self): + return 1 + +NEVER_EQ = _NEVER_EQ() + @functools.total_ordering class _LARGEST: """ @@ -3225,6 +2959,7 @@ def __gt__(self, other): def maybe_get_event_loop_policy(): """Return the global event loop policy if one is set, else return None.""" + import asyncio.events return asyncio.events._event_loop_policy # Helpers for testing hashing. @@ -3370,6 +3105,69 @@ def __exit__(self, *exc_info): del self.thread +def wait_process(pid, *, exitcode, timeout=None): + """ + Wait until process pid completes and check that the process exit code is + exitcode. + + Raise an AssertionError if the process exit code is not equal to exitcode. + + If the process runs longer than timeout seconds (SHORT_TIMEOUT by default), + kill the process (if signal.SIGKILL is available) and raise an + AssertionError. The timeout feature is not available on Windows. + """ + if os.name != "nt": + import signal + + if timeout is None: + timeout = SHORT_TIMEOUT + t0 = time.monotonic() + sleep = 0.001 + max_sleep = 0.1 + while True: + pid2, status = os.waitpid(pid, os.WNOHANG) + if pid2 != 0: + break + # process is still running + + dt = time.monotonic() - t0 + if dt > SHORT_TIMEOUT: + try: + os.kill(pid, signal.SIGKILL) + os.waitpid(pid, 0) + except OSError: + # Ignore errors like ChildProcessError or PermissionError + pass + + raise AssertionError(f"process {pid} is still running " + f"after {dt:.1f} seconds") + + sleep = min(sleep * 2, max_sleep) + time.sleep(sleep) + else: + # Windows implementation + pid2, status = os.waitpid(pid, 0) + + exitcode2 = os.waitstatus_to_exitcode(status) + if exitcode2 != exitcode: + raise AssertionError(f"process {pid} exited with code {exitcode2}, " + f"but exit code {exitcode} is expected") + + # sanity check: it should not fail in practice + if pid2 != pid: + raise AssertionError(f"pid {pid2} != pid {pid}") + + +def use_old_parser(): + import _testinternalcapi + config = _testinternalcapi.get_configs() + return (config['config']['_use_peg_parser'] == 0) + + +def skip_if_new_parser(msg): + return unittest.skipIf(not use_old_parser(), msg) + + @contextlib.contextmanager def save_restore_warnings_filters(): old_filters = warnings.filters[:] diff --git a/Lib/test/bytecode_helper.py b/Lib/test/support/bytecode_helper.py similarity index 91% rename from Lib/test/bytecode_helper.py rename to Lib/test/support/bytecode_helper.py index 347d60337d763b5fe1da073eef269a52d5f55b6e..348e277c1658823bb55ed94cbbdd716f6c200a1f 100644 --- a/Lib/test/bytecode_helper.py +++ b/Lib/test/support/bytecode_helper.py @@ -15,7 +15,7 @@ def get_disassembly_as_string(self, co): return s.getvalue() def assertInBytecode(self, x, opname, argval=_UNSPECIFIED): - """Returns instr if op is found, otherwise throws AssertionError""" + """Returns instr if opname is found, otherwise throws AssertionError""" for instr in dis.get_instructions(x): if instr.opname == opname: if argval is _UNSPECIFIED or instr.argval == argval: @@ -29,7 +29,7 @@ def assertInBytecode(self, x, opname, argval=_UNSPECIFIED): self.fail(msg) def assertNotInBytecode(self, x, opname, argval=_UNSPECIFIED): - """Throws AssertionError if op is found""" + """Throws AssertionError if opname is found""" for instr in dis.get_instructions(x): if instr.opname == opname: disassembly = self.get_disassembly_as_string(x) diff --git a/Lib/test/support/hashlib_helper.py b/Lib/test/support/hashlib_helper.py new file mode 100644 index 0000000000000000000000000000000000000000..a28132a565a0b5a3f831f0c22938122c1b120eb7 --- /dev/null +++ b/Lib/test/support/hashlib_helper.py @@ -0,0 +1,38 @@ +import functools +import hashlib +import unittest + +try: + import _hashlib +except ImportError: + _hashlib = None + + +def requires_hashdigest(digestname, openssl=None, usedforsecurity=True): + """Decorator raising SkipTest if a hashing algorithm is not available + + The hashing algorithm could be missing or blocked by a strict crypto + policy. + + If 'openssl' is True, then the decorator checks that OpenSSL provides + the algorithm. Otherwise the check falls back to built-in + implementations. The usedforsecurity flag is passed to the constructor. + + ValueError: [digital envelope routines: EVP_DigestInit_ex] disabled for FIPS + ValueError: unsupported hash type md4 + """ + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + try: + if openssl and _hashlib is not None: + _hashlib.new(digestname, usedforsecurity=usedforsecurity) + else: + hashlib.new(digestname, usedforsecurity=usedforsecurity) + except ValueError: + raise unittest.SkipTest( + f"hash digest '{digestname}' is not available." + ) + return func(*args, **kwargs) + return wrapper + return decorator diff --git a/Lib/test/support/logging_helper.py b/Lib/test/support/logging_helper.py new file mode 100644 index 0000000000000000000000000000000000000000..12fcca4f0f08d9b445ac84f6a1920c8bcb3badf4 --- /dev/null +++ b/Lib/test/support/logging_helper.py @@ -0,0 +1,29 @@ +import logging.handlers + +class TestHandler(logging.handlers.BufferingHandler): + def __init__(self, matcher): + # BufferingHandler takes a "capacity" argument + # so as to know when to flush. As we're overriding + # shouldFlush anyway, we can set a capacity of zero. + # You can call flush() manually to clear out the + # buffer. + logging.handlers.BufferingHandler.__init__(self, 0) + self.matcher = matcher + + def shouldFlush(self): + return False + + def emit(self, record): + self.format(record) + self.buffer.append(record.__dict__) + + def matches(self, **kwargs): + """ + Look for a saved dict whose keys/values match the supplied arguments. + """ + result = False + for d in self.buffer: + if self.matcher.matches(d, **kwargs): + result = True + break + return result diff --git a/Lib/test/support/script_helper.py b/Lib/test/support/script_helper.py index 83519988e39478cc777d35c7a92b628478a2409a..37e576d4a770e0eec2487ae5ba2193c9870be48e 100644 --- a/Lib/test/support/script_helper.py +++ b/Lib/test/support/script_helper.py @@ -11,7 +11,7 @@ import zipfile from importlib.util import source_from_cache -from test.support import make_legacy_pyc, strip_python_stderr +from test.support import make_legacy_pyc # Cached result of the expensive test performed in the function below. @@ -134,7 +134,6 @@ def run_python_until_end(*args, **env_vars): proc.kill() subprocess._cleanup() rc = proc.returncode - err = strip_python_stderr(err) return _PythonRunResult(rc, out, err), cmd_line def _assert_python(expected_success, /, *args, **env_vars): diff --git a/Lib/test/support/socket_helper.py b/Lib/test/support/socket_helper.py new file mode 100644 index 0000000000000000000000000000000000000000..f709ffd40dd8a38cba8ea8ba1325e17e8c739d17 --- /dev/null +++ b/Lib/test/support/socket_helper.py @@ -0,0 +1,269 @@ +import contextlib +import errno +import socket +import unittest +import sys + +from .. import support + + +HOST = "localhost" +HOSTv4 = "127.0.0.1" +HOSTv6 = "::1" + + +def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM): + """Returns an unused port that should be suitable for binding. This is + achieved by creating a temporary socket with the same family and type as + the 'sock' parameter (default is AF_INET, SOCK_STREAM), and binding it to + the specified host address (defaults to 0.0.0.0) with the port set to 0, + eliciting an unused ephemeral port from the OS. The temporary socket is + then closed and deleted, and the ephemeral port is returned. + + Either this method or bind_port() should be used for any tests where a + server socket needs to be bound to a particular port for the duration of + the test. Which one to use depends on whether the calling code is creating + a python socket, or if an unused port needs to be provided in a constructor + or passed to an external program (i.e. the -accept argument to openssl's + s_server mode). Always prefer bind_port() over find_unused_port() where + possible. Hard coded ports should *NEVER* be used. As soon as a server + socket is bound to a hard coded port, the ability to run multiple instances + of the test simultaneously on the same host is compromised, which makes the + test a ticking time bomb in a buildbot environment. On Unix buildbots, this + may simply manifest as a failed test, which can be recovered from without + intervention in most cases, but on Windows, the entire python process can + completely and utterly wedge, requiring someone to log in to the buildbot + and manually kill the affected process. + + (This is easy to reproduce on Windows, unfortunately, and can be traced to + the SO_REUSEADDR socket option having different semantics on Windows versus + Unix/Linux. On Unix, you can't have two AF_INET SOCK_STREAM sockets bind, + listen and then accept connections on identical host/ports. An EADDRINUSE + OSError will be raised at some point (depending on the platform and + the order bind and listen were called on each socket). + + However, on Windows, if SO_REUSEADDR is set on the sockets, no EADDRINUSE + will ever be raised when attempting to bind two identical host/ports. When + accept() is called on each socket, the second caller's process will steal + the port from the first caller, leaving them both in an awkwardly wedged + state where they'll no longer respond to any signals or graceful kills, and + must be forcibly killed via OpenProcess()/TerminateProcess(). + + The solution on Windows is to use the SO_EXCLUSIVEADDRUSE socket option + instead of SO_REUSEADDR, which effectively affords the same semantics as + SO_REUSEADDR on Unix. Given the propensity of Unix developers in the Open + Source world compared to Windows ones, this is a common mistake. A quick + look over OpenSSL's 0.9.8g source shows that they use SO_REUSEADDR when + openssl.exe is called with the 's_server' option, for example. See + http://bugs.python.org/issue2550 for more info. The following site also + has a very thorough description about the implications of both REUSEADDR + and EXCLUSIVEADDRUSE on Windows: + http://msdn2.microsoft.com/en-us/library/ms740621(VS.85).aspx) + + XXX: although this approach is a vast improvement on previous attempts to + elicit unused ports, it rests heavily on the assumption that the ephemeral + port returned to us by the OS won't immediately be dished back out to some + other process when we close and delete our temporary socket but before our + calling code has a chance to bind the returned port. We can deal with this + issue if/when we come across it. + """ + + with socket.socket(family, socktype) as tempsock: + port = bind_port(tempsock) + del tempsock + return port + +def bind_port(sock, host=HOST): + """Bind the socket to a free port and return the port number. Relies on + ephemeral ports in order to ensure we are using an unbound port. This is + important as many tests may be running simultaneously, especially in a + buildbot environment. This method raises an exception if the sock.family + is AF_INET and sock.type is SOCK_STREAM, *and* the socket has SO_REUSEADDR + or SO_REUSEPORT set on it. Tests should *never* set these socket options + for TCP/IP sockets. The only case for setting these options is testing + multicasting via multiple UDP sockets. + + Additionally, if the SO_EXCLUSIVEADDRUSE socket option is available (i.e. + on Windows), it will be set on the socket. This will prevent anyone else + from bind()'ing to our host/port for the duration of the test. + """ + + if sock.family == socket.AF_INET and sock.type == socket.SOCK_STREAM: + if hasattr(socket, 'SO_REUSEADDR'): + if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) == 1: + raise support.TestFailed("tests should never set the " + "SO_REUSEADDR socket option on " + "TCP/IP sockets!") + if hasattr(socket, 'SO_REUSEPORT'): + try: + if sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT) == 1: + raise support.TestFailed("tests should never set the " + "SO_REUSEPORT socket option on " + "TCP/IP sockets!") + except OSError: + # Python's socket module was compiled using modern headers + # thus defining SO_REUSEPORT but this process is running + # under an older kernel that does not support SO_REUSEPORT. + pass + if hasattr(socket, 'SO_EXCLUSIVEADDRUSE'): + sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1) + + sock.bind((host, 0)) + port = sock.getsockname()[1] + return port + +def bind_unix_socket(sock, addr): + """Bind a unix socket, raising SkipTest if PermissionError is raised.""" + assert sock.family == socket.AF_UNIX + try: + sock.bind(addr) + except PermissionError: + sock.close() + raise unittest.SkipTest('cannot bind AF_UNIX sockets') + +def _is_ipv6_enabled(): + """Check whether IPv6 is enabled on this host.""" + if socket.has_ipv6: + sock = None + try: + sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) + sock.bind((HOSTv6, 0)) + return True + except OSError: + pass + finally: + if sock: + sock.close() + return False + +IPV6_ENABLED = _is_ipv6_enabled() + + +_bind_nix_socket_error = None +def skip_unless_bind_unix_socket(test): + """Decorator for tests requiring a functional bind() for unix sockets.""" + if not hasattr(socket, 'AF_UNIX'): + return unittest.skip('No UNIX Sockets')(test) + global _bind_nix_socket_error + if _bind_nix_socket_error is None: + from test.support import TESTFN, unlink + path = TESTFN + "can_bind_unix_socket" + with socket.socket(socket.AF_UNIX) as sock: + try: + sock.bind(path) + _bind_nix_socket_error = False + except OSError as e: + _bind_nix_socket_error = e + finally: + unlink(path) + if _bind_nix_socket_error: + msg = 'Requires a functional unix bind(): %s' % _bind_nix_socket_error + return unittest.skip(msg)(test) + else: + return test + + +def get_socket_conn_refused_errs(): + """ + Get the different socket error numbers ('errno') which can be received + when a connection is refused. + """ + errors = [errno.ECONNREFUSED] + if hasattr(errno, 'ENETUNREACH'): + # On Solaris, ENETUNREACH is returned sometimes instead of ECONNREFUSED + errors.append(errno.ENETUNREACH) + if hasattr(errno, 'EADDRNOTAVAIL'): + # bpo-31910: socket.create_connection() fails randomly + # with EADDRNOTAVAIL on Travis CI + errors.append(errno.EADDRNOTAVAIL) + if hasattr(errno, 'EHOSTUNREACH'): + # bpo-37583: The destination host cannot be reached + errors.append(errno.EHOSTUNREACH) + if not IPV6_ENABLED: + errors.append(errno.EAFNOSUPPORT) + return errors + + +_NOT_SET = object() + +@contextlib.contextmanager +def transient_internet(resource_name, *, timeout=_NOT_SET, errnos=()): + """Return a context manager that raises ResourceDenied when various issues + with the Internet connection manifest themselves as exceptions.""" + import nntplib + import urllib.error + if timeout is _NOT_SET: + timeout = support.INTERNET_TIMEOUT + + default_errnos = [ + ('ECONNREFUSED', 111), + ('ECONNRESET', 104), + ('EHOSTUNREACH', 113), + ('ENETUNREACH', 101), + ('ETIMEDOUT', 110), + # socket.create_connection() fails randomly with + # EADDRNOTAVAIL on Travis CI. + ('EADDRNOTAVAIL', 99), + ] + default_gai_errnos = [ + ('EAI_AGAIN', -3), + ('EAI_FAIL', -4), + ('EAI_NONAME', -2), + ('EAI_NODATA', -5), + # Encountered when trying to resolve IPv6-only hostnames + ('WSANO_DATA', 11004), + ] + + denied = support.ResourceDenied("Resource %r is not available" % resource_name) + captured_errnos = errnos + gai_errnos = [] + if not captured_errnos: + captured_errnos = [getattr(errno, name, num) + for (name, num) in default_errnos] + gai_errnos = [getattr(socket, name, num) + for (name, num) in default_gai_errnos] + + def filter_error(err): + n = getattr(err, 'errno', None) + if (isinstance(err, socket.timeout) or + (isinstance(err, socket.gaierror) and n in gai_errnos) or + (isinstance(err, urllib.error.HTTPError) and + 500 <= err.code <= 599) or + (isinstance(err, urllib.error.URLError) and + (("ConnectionRefusedError" in err.reason) or + ("TimeoutError" in err.reason) or + ("EOFError" in err.reason))) or + n in captured_errnos): + if not support.verbose: + sys.stderr.write(denied.args[0] + "\n") + raise denied from err + + old_timeout = socket.getdefaulttimeout() + try: + if timeout is not None: + socket.setdefaulttimeout(timeout) + yield + except nntplib.NNTPTemporaryError as err: + if support.verbose: + sys.stderr.write(denied.args[0] + "\n") + raise denied from err + except OSError as err: + # urllib can wrap original socket errors multiple times (!), we must + # unwrap to get at the original error. + while True: + a = err.args + if len(a) >= 1 and isinstance(a[0], OSError): + err = a[0] + # The error can also be wrapped as args[1]: + # except socket.error as msg: + # raise OSError('socket error', msg).with_traceback(sys.exc_info()[2]) + elif len(a) >= 2 and isinstance(a[1], OSError): + err = a[1] + else: + break + filter_error(err) + raise + # XXX should we catch generic exceptions and look for their + # __cause__ or __context__? + finally: + socket.setdefaulttimeout(old_timeout) diff --git a/Lib/test/test___all__.py b/Lib/test/test___all__.py index c077881511b8ce3b5128f5d7774fd294d11d1be6..0ba243ee4e74e45c53121555db0018762940c915 100644 --- a/Lib/test/test___all__.py +++ b/Lib/test/test___all__.py @@ -17,6 +17,7 @@ def check_all(self, modname): names = {} with support.check_warnings( (".* (module|package)", DeprecationWarning), + (".* (module|package)", PendingDeprecationWarning), ("", ResourceWarning), quiet=True): try: diff --git a/Lib/test/test__locale.py b/Lib/test/test__locale.py index ab4e24796188c8d29b034126f77854f9e05cb127..59a00bad7d98a3d9fce6188d59c6f7684110b901 100644 --- a/Lib/test/test__locale.py +++ b/Lib/test/test__locale.py @@ -30,7 +30,7 @@ def setUpModule(): global candidate_locales # Issue #13441: Skip some locales (e.g. cs_CZ and hu_HU) on Solaris to # workaround a mbstowcs() bug. For example, on Solaris, the hu_HU locale uses - # the locale encoding ISO-8859-2, the thousauds separator is b'\xA0' and it is + # the locale encoding ISO-8859-2, the thousands separator is b'\xA0' and it is # decoded as U+30000020 (an invalid character) by mbstowcs(). if sys.platform == 'sunos5': old_locale = locale.setlocale(locale.LC_ALL) @@ -72,6 +72,10 @@ def accept(loc): 'ps_AF': ('\u066b', '\u066c'), } +if sys.platform == 'win32': + # ps_AF doesn't work on Windows: see bpo-38324 (msg361830) + del known_numerics['ps_AF'] + class _LocaleTests(unittest.TestCase): def setUp(self): diff --git a/Lib/test/test__xxsubinterpreters.py b/Lib/test/test__xxsubinterpreters.py index f14868ad8cb35f0735aafb9cb817b72aabb4af37..7aec021fb19a5e6707c129a5cb9c6aad8a0ce441 100644 --- a/Lib/test/test__xxsubinterpreters.py +++ b/Lib/test/test__xxsubinterpreters.py @@ -19,12 +19,6 @@ ################################## # helpers -def powerset(*sets): - return itertools.chain.from_iterable( - combinations(sets, r) - for r in range(len(sets)+1)) - - def _captured_script(script): r, w = os.pipe() indented = script.replace('\n', '\n ') @@ -90,14 +84,6 @@ def _run_interp(id, source, shared, _mainns={}): interpreters.run_string(id, source, shared) -def run_interp_threaded(id, source, **shared): - def run(): - _run(id, source, shared) - t = threading.Thread(target=run) - t.start() - t.join() - - class Interpreter(namedtuple('Interpreter', 'name id')): @classmethod @@ -789,12 +775,6 @@ def tearDown(self): self._fs.close() super().tearDown() - @property - def fs(self): - if self._fs is None: - self._fs = FSFixture(self) - return self._fs - def test_success(self): script, file = _captured_script('print("it worked!", end="")') with file: @@ -817,6 +797,7 @@ def f(): self.assertEqual(out, 'it worked!') def test_create_thread(self): + subinterp = interpreters.create(isolated=False) script, file = _captured_script(""" import threading def f(): @@ -827,7 +808,7 @@ def f(): t.join() """) with file: - interpreters.run_string(self.id, script) + interpreters.run_string(subinterp, script) out = file.read() self.assertEqual(out, 'it worked!') @@ -1210,6 +1191,185 @@ def test_ids_global(self): self.assertEqual(cid2, int(cid1) + 1) + def test_channel_list_interpreters_none(self): + """Test listing interpreters for a channel with no associations.""" + # Test for channel with no associated interpreters. + cid = interpreters.channel_create() + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(send_interps, []) + self.assertEqual(recv_interps, []) + + def test_channel_list_interpreters_basic(self): + """Test basic listing channel interpreters.""" + interp0 = interpreters.get_main() + cid = interpreters.channel_create() + interpreters.channel_send(cid, "send") + # Test for a channel that has one end associated to an interpreter. + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(send_interps, [interp0]) + self.assertEqual(recv_interps, []) + + interp1 = interpreters.create() + _run_output(interp1, dedent(f""" + import _xxsubinterpreters as _interpreters + obj = _interpreters.channel_recv({cid}) + """)) + # Test for channel that has boths ends associated to an interpreter. + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(send_interps, [interp0]) + self.assertEqual(recv_interps, [interp1]) + + def test_channel_list_interpreters_multiple(self): + """Test listing interpreters for a channel with many associations.""" + interp0 = interpreters.get_main() + interp1 = interpreters.create() + interp2 = interpreters.create() + interp3 = interpreters.create() + cid = interpreters.channel_create() + + interpreters.channel_send(cid, "send") + _run_output(interp1, dedent(f""" + import _xxsubinterpreters as _interpreters + _interpreters.channel_send({cid}, "send") + """)) + _run_output(interp2, dedent(f""" + import _xxsubinterpreters as _interpreters + obj = _interpreters.channel_recv({cid}) + """)) + _run_output(interp3, dedent(f""" + import _xxsubinterpreters as _interpreters + obj = _interpreters.channel_recv({cid}) + """)) + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(set(send_interps), {interp0, interp1}) + self.assertEqual(set(recv_interps), {interp2, interp3}) + + def test_channel_list_interpreters_destroyed(self): + """Test listing channel interpreters with a destroyed interpreter.""" + interp0 = interpreters.get_main() + interp1 = interpreters.create() + cid = interpreters.channel_create() + interpreters.channel_send(cid, "send") + _run_output(interp1, dedent(f""" + import _xxsubinterpreters as _interpreters + obj = _interpreters.channel_recv({cid}) + """)) + # Should be one interpreter associated with each end. + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(send_interps, [interp0]) + self.assertEqual(recv_interps, [interp1]) + + interpreters.destroy(interp1) + # Destroyed interpreter should not be listed. + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(send_interps, [interp0]) + self.assertEqual(recv_interps, []) + + def test_channel_list_interpreters_released(self): + """Test listing channel interpreters with a released channel.""" + # Set up one channel with main interpreter on the send end and two + # subinterpreters on the receive end. + interp0 = interpreters.get_main() + interp1 = interpreters.create() + interp2 = interpreters.create() + cid = interpreters.channel_create() + interpreters.channel_send(cid, "data") + _run_output(interp1, dedent(f""" + import _xxsubinterpreters as _interpreters + obj = _interpreters.channel_recv({cid}) + """)) + interpreters.channel_send(cid, "data") + _run_output(interp2, dedent(f""" + import _xxsubinterpreters as _interpreters + obj = _interpreters.channel_recv({cid}) + """)) + # Check the setup. + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(len(send_interps), 1) + self.assertEqual(len(recv_interps), 2) + + # Release the main interpreter from the send end. + interpreters.channel_release(cid, send=True) + # Send end should have no associated interpreters. + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(len(send_interps), 0) + self.assertEqual(len(recv_interps), 2) + + # Release one of the subinterpreters from the receive end. + _run_output(interp2, dedent(f""" + import _xxsubinterpreters as _interpreters + _interpreters.channel_release({cid}) + """)) + # Receive end should have the released interpreter removed. + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(len(send_interps), 0) + self.assertEqual(recv_interps, [interp1]) + + def test_channel_list_interpreters_closed(self): + """Test listing channel interpreters with a closed channel.""" + interp0 = interpreters.get_main() + interp1 = interpreters.create() + cid = interpreters.channel_create() + # Put something in the channel so that it's not empty. + interpreters.channel_send(cid, "send") + + # Check initial state. + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(len(send_interps), 1) + self.assertEqual(len(recv_interps), 0) + + # Force close the channel. + interpreters.channel_close(cid, force=True) + # Both ends should raise an error. + with self.assertRaises(interpreters.ChannelClosedError): + interpreters.channel_list_interpreters(cid, send=True) + with self.assertRaises(interpreters.ChannelClosedError): + interpreters.channel_list_interpreters(cid, send=False) + + def test_channel_list_interpreters_closed_send_end(self): + """Test listing channel interpreters with a channel's send end closed.""" + interp0 = interpreters.get_main() + interp1 = interpreters.create() + cid = interpreters.channel_create() + # Put something in the channel so that it's not empty. + interpreters.channel_send(cid, "send") + + # Check initial state. + send_interps = interpreters.channel_list_interpreters(cid, send=True) + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(len(send_interps), 1) + self.assertEqual(len(recv_interps), 0) + + # Close the send end of the channel. + interpreters.channel_close(cid, send=True) + # Send end should raise an error. + with self.assertRaises(interpreters.ChannelClosedError): + interpreters.channel_list_interpreters(cid, send=True) + # Receive end should not be closed (since channel is not empty). + recv_interps = interpreters.channel_list_interpreters(cid, send=False) + self.assertEqual(len(recv_interps), 0) + + # Close the receive end of the channel from a subinterpreter. + _run_output(interp1, dedent(f""" + import _xxsubinterpreters as _interpreters + _interpreters.channel_close({cid}, force=True) + """)) + # Both ends should raise an error. + with self.assertRaises(interpreters.ChannelClosedError): + interpreters.channel_list_interpreters(cid, send=True) + with self.assertRaises(interpreters.ChannelClosedError): + interpreters.channel_list_interpreters(cid, send=False) + #################### def test_send_recv_main(self): @@ -1305,6 +1465,27 @@ def test_recv_empty(self): with self.assertRaises(interpreters.ChannelEmptyError): interpreters.channel_recv(cid) + def test_recv_default(self): + default = object() + cid = interpreters.channel_create() + obj1 = interpreters.channel_recv(cid, default) + interpreters.channel_send(cid, None) + interpreters.channel_send(cid, 1) + interpreters.channel_send(cid, b'spam') + interpreters.channel_send(cid, b'eggs') + obj2 = interpreters.channel_recv(cid, default) + obj3 = interpreters.channel_recv(cid, default) + obj4 = interpreters.channel_recv(cid) + obj5 = interpreters.channel_recv(cid, default) + obj6 = interpreters.channel_recv(cid, default) + + self.assertIs(obj1, default) + self.assertIs(obj2, None) + self.assertEqual(obj3, 1) + self.assertEqual(obj4, b'spam') + self.assertEqual(obj5, b'eggs') + self.assertIs(obj6, default) + def test_run_string_arg_unresolved(self): cid = interpreters.channel_create() interp = interpreters.create() @@ -1522,6 +1703,23 @@ def test_close_used_multiple_times_by_single_user(self): with self.assertRaises(interpreters.ChannelClosedError): interpreters.channel_recv(cid) + def test_channel_list_interpreters_invalid_channel(self): + cid = interpreters.channel_create() + # Test for invalid channel ID. + with self.assertRaises(interpreters.ChannelNotFoundError): + interpreters.channel_list_interpreters(1000, send=True) + + interpreters.channel_close(cid) + # Test for a channel that has been closed. + with self.assertRaises(interpreters.ChannelClosedError): + interpreters.channel_list_interpreters(cid, send=True) + + def test_channel_list_interpreters_invalid_args(self): + # Tests for invalid arguments passed to the API. + cid = interpreters.channel_create() + with self.assertRaises(TypeError): + interpreters.channel_list_interpreters(cid) + class ChannelReleaseTests(TestBase): diff --git a/Lib/test/test_abc.py b/Lib/test/test_abc.py index 9f5afb241aea3a16d6bf3acb4f75b929ce0acf3b..7e9c47b3cacb96978da60c935ac86eed724503c4 100644 --- a/Lib/test/test_abc.py +++ b/Lib/test/test_abc.py @@ -149,6 +149,25 @@ def foo(): return 4 self.assertEqual(D.foo(), 4) self.assertEqual(D().foo(), 4) + def test_object_new_with_one_abstractmethod(self): + class C(metaclass=abc_ABCMeta): + @abc.abstractmethod + def method_one(self): + pass + msg = r"class C with abstract method method_one" + self.assertRaisesRegex(TypeError, msg, C) + + def test_object_new_with_many_abstractmethods(self): + class C(metaclass=abc_ABCMeta): + @abc.abstractmethod + def method_one(self): + pass + @abc.abstractmethod + def method_two(self): + pass + msg = r"class C with abstract methods method_one, method_two" + self.assertRaisesRegex(TypeError, msg, C) + def test_abstractmethod_integration(self): for abstractthing in [abc.abstractmethod, abc.abstractproperty, abc.abstractclassmethod, @@ -307,7 +326,7 @@ class B: token_old = abc_get_cache_token() A.register(B) token_new = abc_get_cache_token() - self.assertNotEqual(token_old, token_new) + self.assertGreater(token_new, token_old) self.assertTrue(isinstance(b, A)) self.assertTrue(isinstance(b, (A,))) diff --git a/Lib/test/test_aifc.py b/Lib/test/test_aifc.py index c74758413d6ce1f3068f10790195208578e0822f..5a95099cc5cdfe838c618cf0c40a690c5a2b1830 100644 --- a/Lib/test/test_aifc.py +++ b/Lib/test/test_aifc.py @@ -143,13 +143,12 @@ class AifcALAWTest(AifcTest, unittest.TestCase): frames = byteswap(frames, 2) -class AifcMiscTest(audiotests.AudioMiscTests, unittest.TestCase): - module = aifc - +class AifcMiscTest(unittest.TestCase): def test_skipunknown(self): #Issue 2245 #This file contains chunk types aifc doesn't recognize. - self.f = aifc.open(findfile('Sine-1000Hz-300ms.aif')) + f = aifc.open(findfile('Sine-1000Hz-300ms.aif')) + f.close() def test_close_opened_files_on_error(self): non_aifc_file = findfile('pluck-pcm8.wav', subdir='audiodata') @@ -172,7 +171,8 @@ def test_params_added(self): f.setparams((1, 1, 1, 1, b'NONE', b'')) f.close() - f = self.f = aifc.open(TESTFN, 'rb') + f = aifc.open(TESTFN, 'rb') + self.addCleanup(f.close) params = f.getparams() self.assertEqual(params.nchannels, f.getnchannels()) self.assertEqual(params.sampwidth, f.getsampwidth()) @@ -208,7 +208,8 @@ def test_read_markers(self): fout.setmark(2, 0, b'even') fout.writeframes(b'\x00') fout.close() - f = self.f = aifc.open(TESTFN, 'rb') + f = aifc.open(TESTFN, 'rb') + self.addCleanup(f.close) self.assertEqual(f.getmarkers(), [(1, 0, b'odd'), (2, 0, b'even')]) self.assertEqual(f.getmark(1), (1, 0, b'odd')) self.assertEqual(f.getmark(2), (2, 0, b'even')) diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 0753a4b59652dd339e2546f473249db1359e4dbe..22cae626ccc2973cf31ce76b72852d6f73a16e94 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -105,7 +105,8 @@ def stderr_to_parser_error(parse_args, *args, **kwargs): code = sys.exc_info()[1].code stdout = sys.stdout.getvalue() stderr = sys.stderr.getvalue() - raise ArgumentParserError("SystemExit", stdout, stderr, code) + raise ArgumentParserError( + "SystemExit", stdout, stderr, code) from None finally: sys.stdout = old_stdout sys.stderr = old_stderr @@ -686,6 +687,38 @@ class TestOptionalsActionStoreTrue(ParserTestCase): ('--apple', NS(apple=True)), ] +class TestBooleanOptionalAction(ParserTestCase): + """Tests BooleanOptionalAction""" + + argument_signatures = [Sig('--foo', action=argparse.BooleanOptionalAction)] + failures = ['--foo bar', '--foo=bar'] + successes = [ + ('', NS(foo=None)), + ('--foo', NS(foo=True)), + ('--no-foo', NS(foo=False)), + ('--foo --no-foo', NS(foo=False)), # useful for aliases + ('--no-foo --foo', NS(foo=True)), + ] + + def test_const(self): + # See bpo-40862 + parser = argparse.ArgumentParser() + with self.assertRaises(TypeError) as cm: + parser.add_argument('--foo', const=True, action=argparse.BooleanOptionalAction) + + self.assertIn("got an unexpected keyword argument 'const'", str(cm.exception)) + +class TestBooleanOptionalActionRequired(ParserTestCase): + """Tests BooleanOptionalAction required""" + + argument_signatures = [ + Sig('--foo', required=True, action=argparse.BooleanOptionalAction) + ] + failures = [''] + successes = [ + ('--foo', NS(foo=True)), + ('--no-foo', NS(foo=False)), + ] class TestOptionalsActionAppend(ParserTestCase): """Tests the append action for an Optional""" @@ -2176,7 +2209,7 @@ def test_subparser1_help(self): def test_subparser2_help(self): self._test_subparser_help('5.0 2 -h', textwrap.dedent('''\ - usage: PROG bar 2 [-h] [-y {1,2,3}] [z [z ...]] + usage: PROG bar 2 [-h] [-y {1,2,3}] [z ...] 2 description @@ -2710,10 +2743,10 @@ def get_parser(self, required): ] usage_when_not_required = '''\ - usage: PROG [-h] [--foo | --spam SPAM | badger [badger ...]] + usage: PROG [-h] [--foo | --spam SPAM | badger ...] ''' usage_when_required = '''\ - usage: PROG [-h] (--foo | --spam SPAM | badger [badger ...]) + usage: PROG [-h] (--foo | --spam SPAM | badger ...) ''' help = '''\ @@ -3493,6 +3526,10 @@ class TestHelpUsage(HelpTestCase): Sig('a', help='a'), Sig('b', help='b', nargs=2), Sig('c', help='c', nargs='?'), + Sig('--foo', help='Whether to foo', action=argparse.BooleanOptionalAction), + Sig('--bar', help='Whether to bar', default=True, + action=argparse.BooleanOptionalAction), + Sig('-f', '--foobar', '--barfoo', action=argparse.BooleanOptionalAction), ] argument_group_signatures = [ (Sig('group'), [ @@ -3503,26 +3540,32 @@ class TestHelpUsage(HelpTestCase): ]) ] usage = '''\ - usage: PROG [-h] [-w W [W ...]] [-x [X [X ...]]] [-y [Y]] [-z Z Z Z] - a b b [c] [d [d ...]] e [e ...] + usage: PROG [-h] [-w W [W ...]] [-x [X ...]] [--foo | --no-foo] + [--bar | --no-bar] + [-f | --foobar | --no-foobar | --barfoo | --no-barfoo] [-y [Y]] + [-z Z Z Z] + a b b [c] [d ...] e [e ...] ''' help = usage + '''\ positional arguments: - a a - b b - c c + a a + b b + c c optional arguments: - -h, --help show this help message and exit - -w W [W ...] w - -x [X [X ...]] x + -h, --help show this help message and exit + -w W [W ...] w + -x [X ...] x + --foo, --no-foo Whether to foo + --bar, --no-bar Whether to bar (default: True) + -f, --foobar, --no-foobar, --barfoo, --no-barfoo group: - -y [Y] y - -z Z Z Z z - d d - e e + -y [Y] y + -z Z Z Z z + d d + e e ''' version = '' @@ -4690,7 +4733,7 @@ def test_argument(self): def test_namespace(self): ns = argparse.Namespace(foo=42, bar='spam') - string = "Namespace(bar='spam', foo=42)" + string = "Namespace(foo=42, bar='spam')" self.assertStringEqual(ns, string) def test_namespace_starkwargs_notidentifier(self): @@ -5116,7 +5159,7 @@ def test_nargs_zeroormore_metavar_length0(self): self.do_test_exception(nargs="*", metavar=tuple()) def test_nargs_zeroormore_metavar_length1(self): - self.do_test_exception(nargs="*", metavar=("1",)) + self.do_test_no_exception(nargs="*", metavar=("1",)) def test_nargs_zeroormore_metavar_length2(self): self.do_test_no_exception(nargs="*", metavar=("1", "2")) @@ -5299,6 +5342,21 @@ def test_help_with_metavar(self): ''')) +class TestExitOnError(TestCase): + + def setUp(self): + self.parser = argparse.ArgumentParser(exit_on_error=False) + self.parser.add_argument('--integers', metavar='N', type=int) + + def test_exit_on_error_with_good_args(self): + ns = self.parser.parse_args('--integers 4'.split()) + self.assertEqual(ns, argparse.Namespace(integers=4)) + + def test_exit_on_error_with_bad_args(self): + with self.assertRaises(argparse.ArgumentError): + self.parser.parse_args('--integers a'.split()) + + def test_main(): support.run_unittest(__name__) # Remove global references to avoid looking like we have refleaks. diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py index c2439579e8ee5b456cd13b628e330b2d56749a90..f731b70415e7f66bf51834ee97e333db6e5dc6c6 100644 --- a/Lib/test/test_array.py +++ b/Lib/test/test_array.py @@ -10,7 +10,6 @@ import operator import struct import sys -import warnings import array from array import _array_reconstructor as array_reconstructor @@ -426,26 +425,6 @@ def test_tofromlist(self): b.fromlist(a.tolist()) self.assertEqual(a, b) - def test_tofromstring(self): - # Warnings not raised when arguments are incorrect as Argument Clinic - # handles that before the warning can be raised. - nb_warnings = 2 - with warnings.catch_warnings(record=True) as r: - warnings.filterwarnings("always", - message=r"(to|from)string\(\) is deprecated", - category=DeprecationWarning) - a = array.array(self.typecode, 2*self.example) - b = array.array(self.typecode) - self.assertRaises(TypeError, a.tostring, 42) - self.assertRaises(TypeError, b.fromstring) - self.assertRaises(TypeError, b.fromstring, 42) - b.fromstring(a.tostring()) - self.assertEqual(a, b) - if a.itemsize>1: - self.assertRaises(ValueError, b.fromstring, "x") - nb_warnings += 1 - self.assertEqual(len(r), nb_warnings) - def test_tofrombytes(self): a = array.array(self.typecode, 2*self.example) b = array.array(self.typecode) diff --git a/Lib/test/test_asdl_parser.py b/Lib/test/test_asdl_parser.py index 9eaceecd50dbc0a7bd995215d137aca78b9ecad0..2c14817aae915797aaa22206a61a6d80329d88fe 100644 --- a/Lib/test/test_asdl_parser.py +++ b/Lib/test/test_asdl_parser.py @@ -63,10 +63,10 @@ def test_product(self): def test_attributes(self): stmt = self.types['stmt'] self.assertEqual(len(stmt.attributes), 4) - self.assertEqual(str(stmt.attributes[0]), 'Field(int, lineno)') - self.assertEqual(str(stmt.attributes[1]), 'Field(int, col_offset)') - self.assertEqual(str(stmt.attributes[2]), 'Field(int, end_lineno, opt=True)') - self.assertEqual(str(stmt.attributes[3]), 'Field(int, end_col_offset, opt=True)') + self.assertEqual(repr(stmt.attributes[0]), 'Field(int, lineno)') + self.assertEqual(repr(stmt.attributes[1]), 'Field(int, col_offset)') + self.assertEqual(repr(stmt.attributes[2]), 'Field(int, end_lineno, opt=True)') + self.assertEqual(repr(stmt.attributes[3]), 'Field(int, end_col_offset, opt=True)') def test_constructor_fields(self): ehandler = self.types['excepthandler'] @@ -118,7 +118,7 @@ def visitConstructor(self, cons): v = CustomVisitor() v.visit(self.types['mod']) self.assertEqual(v.names_with_seq, - ['Module', 'Module', 'Interactive', 'FunctionType', 'Suite']) + ['Module', 'Module', 'Interactive', 'FunctionType']) if __name__ == '__main__': diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index b921f4a5d6826905ab8dfcea0fc214cc39547a66..5f57ce8724482af4fcc0611805ded5bf3482e4e9 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -1,7 +1,9 @@ import ast +import builtins import dis import os import sys +import types import unittest import warnings import weakref @@ -17,6 +19,8 @@ def to_tuple(t): result = [t.__class__.__name__] if hasattr(t, 'lineno') and hasattr(t, 'col_offset'): result.append((t.lineno, t.col_offset)) + if hasattr(t, 'end_lineno') and hasattr(t, 'end_col_offset'): + result[-1] += (t.end_lineno, t.end_col_offset) if t._fields is None: return tuple(result) for f in t._fields: @@ -245,6 +249,13 @@ def to_tuple(t): class AST_Tests(unittest.TestCase): + def _is_ast_node(self, name, node): + if not isinstance(node, type): + return False + if "ast" not in node.__module__: + return False + return name != 'AST' and name[0].isupper() + def _assertTrueorder(self, ast_node, parent_pos): if not isinstance(ast_node, ast.AST) or ast_node._fields is None: return @@ -274,7 +285,7 @@ def test_AST_objects(self): x.vararg with self.assertRaises(TypeError): - # "_ast.AST constructor takes 0 positional arguments" + # "ast.AST constructor takes 0 positional arguments" ast.AST(2) def test_AST_garbage_collection(self): @@ -333,7 +344,11 @@ def test_base_classes(self): def test_field_attr_existence(self): for name, item in ast.__dict__.items(): - if isinstance(item, type) and name != 'AST' and name[0].isupper(): + if self._is_ast_node(name, item): + if name == 'Index': + # Index(value) just returns value now. + # The argument is required. + continue x = item() if isinstance(x, ast.AST): self.assertEqual(type(x._fields), tuple) @@ -344,9 +359,11 @@ def test_arguments(self): 'kw_defaults', 'kwarg', 'defaults')) with self.assertRaises(AttributeError): - x.vararg + x.args + self.assertIsNone(x.vararg) x = ast.arguments(*range(1, 8)) + self.assertEqual(x.args, 2) self.assertEqual(x.vararg, 3) def test_field_attr_writable(self): @@ -567,22 +584,31 @@ def test_invalid_sum(self): m = ast.Module([ast.Expr(ast.expr(**pos), **pos)], []) with self.assertRaises(TypeError) as cm: compile(m, "", "exec") - self.assertIn("but got <_ast.expr", str(cm.exception)) + self.assertIn("but got ", "exec") self.assertIn("identifier must be of type str", str(cm.exception)) + def test_invalid_constant(self): + for invalid_constant in int, (1, 2, int), frozenset((1, 2, int)): + e = ast.Expression(body=ast.Constant(invalid_constant)) + ast.fix_missing_locations(e) + with self.assertRaisesRegex( + TypeError, "invalid type in Constant: type" + ): + compile(e, "", "eval") + def test_empty_yield_from(self): # Issue 16546: yield from value is not optional. empty_yield_from = ast.parse("def f():\n yield from g()") empty_yield_from.body[0].body[0].value.value = None with self.assertRaises(ValueError) as cm: compile(empty_yield_from, "", "exec") - self.assertIn("field value is required", str(cm.exception)) + self.assertIn("field 'value' is required", str(cm.exception)) @support.cpython_only def test_issue31592(self): @@ -630,6 +656,15 @@ def test_issue39579_dotted_name_end_col_offset(self): attr_b = tree.body[0].decorator_list[0].value self.assertEqual(attr_b.end_col_offset, 4) + def test_ast_asdl_signature(self): + self.assertEqual(ast.withitem.__doc__, "withitem(expr context_expr, expr? optional_vars)") + self.assertEqual(ast.GtE.__doc__, "GtE") + self.assertEqual(ast.Name.__doc__, "Name(identifier id, expr_context ctx)") + self.assertEqual(ast.cmpop.__doc__, "cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn") + expressions = [f" | {node.__doc__}" for node in ast.expr.__subclasses__()] + expressions[0] = f"expr = {ast.expr.__subclasses__()[0].__doc__}" + self.assertCountEqual(ast.expr.__doc__.split("\n"), expressions) + def test_issue40614_feature_version(self): ast.parse('f"{x=}"', feature_version=(3, 8)) with self.assertRaises(SyntaxError): @@ -663,23 +698,84 @@ def test_dump(self): node = ast.parse('spam(eggs, "and cheese")') self.assertEqual(ast.dump(node), "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), " - "args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese', kind=None)], " + "args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese')], " "keywords=[]))], type_ignores=[])" ) self.assertEqual(ast.dump(node, annotate_fields=False), "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), " - "Constant('and cheese', None)], []))], [])" + "Constant('and cheese')], []))], [])" ) self.assertEqual(ast.dump(node, include_attributes=True), "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), " "lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), " "args=[Name(id='eggs', ctx=Load(), lineno=1, col_offset=5, " - "end_lineno=1, end_col_offset=9), Constant(value='and cheese', kind=None, " + "end_lineno=1, end_col_offset=9), Constant(value='and cheese', " "lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], keywords=[], " "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), " "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)], type_ignores=[])" ) + def test_dump_indent(self): + node = ast.parse('spam(eggs, "and cheese")') + self.assertEqual(ast.dump(node, indent=3), """\ +Module( + body=[ + Expr( + value=Call( + func=Name(id='spam', ctx=Load()), + args=[ + Name(id='eggs', ctx=Load()), + Constant(value='and cheese')], + keywords=[]))], + type_ignores=[])""") + self.assertEqual(ast.dump(node, annotate_fields=False, indent='\t'), """\ +Module( +\t[ +\t\tExpr( +\t\t\tCall( +\t\t\t\tName('spam', Load()), +\t\t\t\t[ +\t\t\t\t\tName('eggs', Load()), +\t\t\t\t\tConstant('and cheese')], +\t\t\t\t[]))], +\t[])""") + self.assertEqual(ast.dump(node, include_attributes=True, indent=3), """\ +Module( + body=[ + Expr( + value=Call( + func=Name( + id='spam', + ctx=Load(), + lineno=1, + col_offset=0, + end_lineno=1, + end_col_offset=4), + args=[ + Name( + id='eggs', + ctx=Load(), + lineno=1, + col_offset=5, + end_lineno=1, + end_col_offset=9), + Constant( + value='and cheese', + lineno=1, + col_offset=11, + end_lineno=1, + end_col_offset=23)], + keywords=[], + lineno=1, + col_offset=0, + end_lineno=1, + end_col_offset=24), + lineno=1, + col_offset=0, + end_lineno=1, + end_col_offset=24)], + type_ignores=[])""") + def test_dump_incomplete(self): node = ast.Raise(lineno=3, col_offset=4) self.assertEqual(ast.dump(node), @@ -713,11 +809,17 @@ def test_copy_location(self): src = ast.parse('1 + 1', mode='eval') src.body.right = ast.copy_location(ast.Num(2), src.body.right) self.assertEqual(ast.dump(src, include_attributes=True), - 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=1, col_offset=0, ' + 'Expression(body=BinOp(left=Constant(value=1, lineno=1, col_offset=0, ' 'end_lineno=1, end_col_offset=1), op=Add(), right=Constant(value=2, ' 'lineno=1, col_offset=4, end_lineno=1, end_col_offset=5), lineno=1, ' 'col_offset=0, end_lineno=1, end_col_offset=5))' ) + src = ast.Call(col_offset=1, lineno=1, end_lineno=1, end_col_offset=1) + new = ast.copy_location(src, ast.Call(col_offset=None, lineno=None)) + self.assertIsNone(new.end_lineno) + self.assertIsNone(new.end_col_offset) + self.assertEqual(new.lineno, 1) + self.assertEqual(new.col_offset, 1) def test_fix_missing_locations(self): src = ast.parse('write("spam")') @@ -728,7 +830,7 @@ def test_fix_missing_locations(self): self.assertEqual(ast.dump(src, include_attributes=True), "Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), " "lineno=1, col_offset=0, end_lineno=1, end_col_offset=5), " - "args=[Constant(value='spam', kind=None, lineno=1, col_offset=6, end_lineno=1, " + "args=[Constant(value='spam', lineno=1, col_offset=6, end_lineno=1, " "end_col_offset=12)], keywords=[], lineno=1, col_offset=0, end_lineno=1, " "end_col_offset=13), lineno=1, col_offset=0, end_lineno=1, " "end_col_offset=13), Expr(value=Call(func=Name(id='spam', ctx=Load(), " @@ -743,8 +845,8 @@ def test_increment_lineno(self): src = ast.parse('1 + 1', mode='eval') self.assertEqual(ast.increment_lineno(src, n=3), src) self.assertEqual(ast.dump(src, include_attributes=True), - 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, ' - 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, ' + 'Expression(body=BinOp(left=Constant(value=1, lineno=4, col_offset=0, ' + 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, ' 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, ' 'col_offset=0, end_lineno=4, end_col_offset=5))' ) @@ -752,11 +854,16 @@ def test_increment_lineno(self): src = ast.parse('1 + 1', mode='eval') self.assertEqual(ast.increment_lineno(src.body, n=3), src.body) self.assertEqual(ast.dump(src, include_attributes=True), - 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, ' - 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, ' + 'Expression(body=BinOp(left=Constant(value=1, lineno=4, col_offset=0, ' + 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, ' 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, ' 'col_offset=0, end_lineno=4, end_col_offset=5))' ) + src = ast.Call( + func=ast.Name("test", ast.Load()), args=[], keywords=[], lineno=1 + ) + self.assertEqual(ast.increment_lineno(src).lineno, 2) + self.assertIsNone(ast.increment_lineno(src).end_lineno) def test_iter_fields(self): node = ast.parse('foo()', mode='eval') @@ -772,7 +879,7 @@ def test_iter_child_nodes(self): self.assertEqual(next(iterator).value, 23) self.assertEqual(next(iterator).value, 42) self.assertEqual(ast.dump(next(iterator)), - "keyword(arg='eggs', value=Constant(value='leek', kind=None))" + "keyword(arg='eggs', value=Constant(value='leek'))" ) def test_get_docstring(self): @@ -858,6 +965,7 @@ def test_literal_eval(self): self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None)) self.assertEqual(ast.literal_eval('{1, 2, 3}'), {1, 2, 3}) self.assertEqual(ast.literal_eval('b"hi"'), b"hi") + self.assertEqual(ast.literal_eval('set()'), set()) self.assertRaises(ValueError, ast.literal_eval, 'foo()') self.assertEqual(ast.literal_eval('6'), 6) self.assertEqual(ast.literal_eval('+6'), 6) @@ -1263,11 +1371,11 @@ def test_attribute(self): self.expr(attr, "must have Load context") def test_subscript(self): - sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Index(ast.Num(3)), + sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Num(3), ast.Load()) self.expr(sub, "must have Load context") x = ast.Name("x", ast.Load()) - sub = ast.Subscript(x, ast.Index(ast.Name("y", ast.Store())), + sub = ast.Subscript(x, ast.Name("y", ast.Store()), ast.Load()) self.expr(sub, "must have Load context") s = ast.Name("x", ast.Store()) @@ -1275,9 +1383,9 @@ def test_subscript(self): sl = ast.Slice(*args) self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context") - sl = ast.ExtSlice([]) - self.expr(ast.Subscript(x, sl, ast.Load()), "empty dims on ExtSlice") - sl = ast.ExtSlice([ast.Index(s)]) + sl = ast.Tuple([], ast.Load()) + self.expr(ast.Subscript(x, sl, ast.Load())) + sl = ast.Tuple([s], ast.Load()) self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context") def test_starred(self): @@ -1619,11 +1727,11 @@ def test_slices(self): ''').strip() i1, i2, im = map(self._parse_value, (s1, s2, sm)) self._check_content(s1, i1.value, 'f()[1, 2]') - self._check_content(s1, i1.value.slice.value, '1, 2') + self._check_content(s1, i1.value.slice, '1, 2') self._check_content(s2, i2.slice.lower, 'a.b') self._check_content(s2, i2.slice.upper, 'c.d') - self._check_content(sm, im.slice.dims[0].upper, 'f ()') - self._check_content(sm, im.slice.dims[1].lower, 'g ()') + self._check_content(sm, im.slice.elts[0].upper, 'f ()') + self._check_content(sm, im.slice.elts[1].lower, 'g ()') self._check_end_pos(im, 3, 3) def test_binop(self): @@ -1777,6 +1885,17 @@ class C: cdef = ast.parse(s).body[0] self.assertEqual(ast.get_source_segment(s, cdef.body[0], padded=True), s_method) + def test_source_segment_missing_info(self): + s = 'v = 1\r\nw = 1\nx = 1\n\ry = 1\r\n' + v, w, x, y = ast.parse(s).body + del v.lineno + del w.end_lineno + del x.col_offset + del y.end_col_offset + self.assertIsNone(ast.get_source_segment(s, v)) + self.assertIsNone(ast.get_source_segment(s, w)) + self.assertIsNone(ast.get_source_segment(s, x)) + self.assertIsNone(ast.get_source_segment(s, y)) class NodeVisitorTests(unittest.TestCase): def test_old_constant_nodes(self): @@ -1804,7 +1923,7 @@ def visit_Ellipsis(self, node): visitor = Visitor() log = [] with warnings.catch_warnings(record=True) as wlog: - warnings.filterwarnings('always', '', PendingDeprecationWarning) + warnings.filterwarnings('always', '', DeprecationWarning) visitor.visit(mod) self.assertEqual(log, [ (1, 'Num', 42), @@ -1828,6 +1947,88 @@ def visit_Ellipsis(self, node): ]) +@support.cpython_only +class ModuleStateTests(unittest.TestCase): + # bpo-41194, bpo-41261, bpo-41631: The _ast module uses a global state. + + def check_ast_module(self): + # Check that the _ast module still works as expected + code = 'x + 1' + filename = '' + mode = 'eval' + + # Create _ast.AST subclasses instances + ast_tree = compile(code, filename, mode, flags=ast.PyCF_ONLY_AST) + + # Call PyAST_Check() + code = compile(ast_tree, filename, mode) + self.assertIsInstance(code, types.CodeType) + + def test_reload_module(self): + # bpo-41194: Importing the _ast module twice must not crash. + with support.swap_item(sys.modules, '_ast', None): + del sys.modules['_ast'] + import _ast as ast1 + + del sys.modules['_ast'] + import _ast as ast2 + + self.check_ast_module() + + # Unloading the two _ast module instances must not crash. + del ast1 + del ast2 + support.gc_collect() + + self.check_ast_module() + + def test_sys_modules(self): + # bpo-41631: Test reproducing a Mercurial crash when PyAST_Check() + # imported the _ast module internally. + lazy_mod = object() + + def my_import(name, *args, **kw): + sys.modules[name] = lazy_mod + return lazy_mod + + with support.swap_item(sys.modules, '_ast', None): + del sys.modules['_ast'] + + with support.swap_attr(builtins, '__import__', my_import): + # Test that compile() does not import the _ast module + self.check_ast_module() + self.assertNotIn('_ast', sys.modules) + + # Sanity check of the test itself + import _ast + self.assertIs(_ast, lazy_mod) + + def test_subinterpreter(self): + # bpo-41631: Importing and using the _ast module in a subinterpreter + # must not crash. + code = dedent(''' + import _ast + import ast + import gc + import sys + import types + + # Create _ast.AST subclasses instances and call PyAST_Check() + ast_tree = compile('x+1', '', 'eval', + flags=ast.PyCF_ONLY_AST) + code = compile(ast_tree, 'string', 'eval') + if not isinstance(code, types.CodeType): + raise AssertionError + + # Unloading the _ast module must not crash. + del ast, _ast + del sys.modules['ast'], sys.modules['_ast'] + gc.collect() + ''') + res = support.run_in_subinterp(code) + self.assertEqual(res, 0) + + def main(): if __name__ != '__main__': return @@ -1845,112 +2046,112 @@ def main(): #### EVERYTHING BELOW IS GENERATED BY python Lib/test/test_ast.py -g ##### exec_results = [ -('Module', [('Expr', (1, 0), ('Constant', (1, 0), None, None))], []), -('Module', [('Expr', (1, 0), ('Constant', (1, 0), 'module docstring', None))], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 9))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (1, 9), ('Constant', (1, 9), 'function docstring', None))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None)], None, [], [], None, [('Constant', (1, 8), 0, None)]), [('Pass', (1, 12))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], ('arg', (1, 7), 'args', None, None), [], [], None, []), [('Pass', (1, 14))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], ('arg', (1, 8), 'kwargs', None, None), []), [('Pass', (1, 17))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None), ('arg', (1, 9), 'b', None, None), ('arg', (1, 14), 'c', None, None), ('arg', (1, 22), 'd', None, None), ('arg', (1, 28), 'e', None, None)], ('arg', (1, 35), 'args', None, None), [('arg', (1, 41), 'f', None, None)], [('Constant', (1, 43), 42, None)], ('arg', (1, 49), 'kwargs', None, None), [('Constant', (1, 11), 1, None), ('Constant', (1, 16), None, None), ('List', (1, 24), [], ('Load',)), ('Dict', (1, 30), [], [])]), [('Expr', (1, 58), ('Constant', (1, 58), 'doc for f()', None))], [], None, None)], []), -('Module', [('ClassDef', (1, 0), 'C', [], [], [('Pass', (1, 8))], [])], []), -('Module', [('ClassDef', (1, 0), 'C', [], [], [('Expr', (1, 9), ('Constant', (1, 9), 'docstring for class C', None))], [])], []), -('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [], [('Pass', (1, 17))], [])], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Return', (1, 8), ('Constant', (1, 15), 1, None))], [], None, None)], []), -('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])], []), -('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Constant', (1, 4), 1, None), None)], []), -('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 0), 'a', ('Store',)), ('Name', (1, 2), 'b', ('Store',))], ('Store',))], ('Name', (1, 6), 'c', ('Load',)), None)], []), -('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []), -('Module', [('Assign', (1, 0), [('List', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []), -('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Constant', (1, 5), 1, None))], []), -('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [], None)], []), -('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])], []), -('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])], []), -('Module', [('If', (1, 0), ('Name', (1, 3), 'a', ('Load',)), [('Pass', (2, 2))], [('If', (3, 0), ('Name', (3, 5), 'b', ('Load',)), [('Pass', (4, 2))], [])])], []), -('Module', [('If', (1, 0), ('Name', (1, 3), 'a', ('Load',)), [('Pass', (2, 2))], [('If', (3, 0), ('Name', (3, 5), 'b', ('Load',)), [('Pass', (4, 2))], [('Pass', (6, 2))])])], []), -('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',)))], [('Pass', (1, 13))], None)], []), -('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',))), ('withitem', ('Name', (1, 13), 'z', ('Load',)), ('Name', (1, 18), 'q', ('Store',)))], [('Pass', (1, 21))], None)], []), -('Module', [('Raise', (1, 0), ('Call', (1, 6), ('Name', (1, 6), 'Exception', ('Load',)), [('Constant', (1, 16), 'string', None)], []), None)], []), -('Module', [('Try', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [], [])], []), -('Module', [('Try', (1, 0), [('Pass', (2, 2))], [], [], [('Pass', (4, 2))])], []), -('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)], []), -('Module', [('Import', (1, 0), [('alias', 'sys', None)])], []), -('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)], []), -('Module', [('Global', (1, 0), ['v'])], []), -('Module', [('Expr', (1, 0), ('Constant', (1, 0), 1, None))], []), -('Module', [('Pass', (1, 0))], []), -('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Break', (1, 11))], [], None)], []), -('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Continue', (1, 11))], [], None)], []), -('Module', [('For', (1, 0), ('Tuple', (1, 4), [('Name', (1, 4), 'a', ('Store',)), ('Name', (1, 6), 'b', ('Store',))], ('Store',)), ('Name', (1, 11), 'c', ('Load',)), [('Pass', (1, 14))], [], None)], []), -('Module', [('For', (1, 0), ('Tuple', (1, 4), [('Name', (1, 5), 'a', ('Store',)), ('Name', (1, 7), 'b', ('Store',))], ('Store',)), ('Name', (1, 13), 'c', ('Load',)), [('Pass', (1, 16))], [], None)], []), -('Module', [('For', (1, 0), ('List', (1, 4), [('Name', (1, 5), 'a', ('Store',)), ('Name', (1, 7), 'b', ('Store',))], ('Store',)), ('Name', (1, 13), 'c', ('Load',)), [('Pass', (1, 16))], [], None)], []), -('Module', [('Expr', (1, 0), ('GeneratorExp', (1, 0), ('Tuple', (2, 4), [('Name', (3, 4), 'Aa', ('Load',)), ('Name', (5, 7), 'Bb', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (8, 4), [('Name', (8, 4), 'Aa', ('Store',)), ('Name', (10, 4), 'Bb', ('Store',))], ('Store',)), ('Name', (10, 10), 'Cc', ('Load',)), [], 0)]))], []), -('Module', [('Expr', (1, 0), ('DictComp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), ('Name', (1, 5), 'b', ('Load',)), [('comprehension', ('Name', (1, 11), 'w', ('Store',)), ('Name', (1, 16), 'x', ('Load',)), [], 0), ('comprehension', ('Name', (1, 22), 'm', ('Store',)), ('Name', (1, 27), 'p', ('Load',)), [('Name', (1, 32), 'g', ('Load',))], 0)]))], []), -('Module', [('Expr', (1, 0), ('DictComp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), ('Name', (1, 5), 'b', ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'v', ('Store',)), ('Name', (1, 13), 'w', ('Store',))], ('Store',)), ('Name', (1, 18), 'x', ('Load',)), [], 0)]))], []), -('Module', [('Expr', (1, 0), ('SetComp', (1, 0), ('Name', (1, 1), 'r', ('Load',)), [('comprehension', ('Name', (1, 7), 'l', ('Store',)), ('Name', (1, 12), 'x', ('Load',)), [('Name', (1, 17), 'g', ('Load',))], 0)]))], []), -('Module', [('Expr', (1, 0), ('SetComp', (1, 0), ('Name', (1, 1), 'r', ('Load',)), [('comprehension', ('Tuple', (1, 7), [('Name', (1, 7), 'l', ('Store',)), ('Name', (1, 9), 'm', ('Store',))], ('Store',)), ('Name', (1, 14), 'x', ('Load',)), [], 0)]))], []), -('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1), ('Constant', (2, 1), 'async function', None)), ('Expr', (3, 1), ('Await', (3, 1), ('Call', (3, 7), ('Name', (3, 7), 'something', ('Load',)), [], [])))], [], None, None)], []), -('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncFor', (2, 1), ('Name', (2, 11), 'e', ('Store',)), ('Name', (2, 16), 'i', ('Load',)), [('Expr', (2, 19), ('Constant', (2, 19), 1, None))], [('Expr', (3, 7), ('Constant', (3, 7), 2, None))], None)], [], None, None)], []), -('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncWith', (2, 1), [('withitem', ('Name', (2, 12), 'a', ('Load',)), ('Name', (2, 17), 'b', ('Store',)))], [('Expr', (2, 20), ('Constant', (2, 20), 1, None))], None)], [], None, None)], []), -('Module', [('Expr', (1, 0), ('Dict', (1, 0), [None, ('Constant', (1, 10), 2, None)], [('Dict', (1, 3), [('Constant', (1, 4), 1, None)], [('Constant', (1, 6), 2, None)]), ('Constant', (1, 12), 3, None)]))], []), -('Module', [('Expr', (1, 0), ('Set', (1, 0), [('Starred', (1, 1), ('Set', (1, 2), [('Constant', (1, 3), 1, None), ('Constant', (1, 6), 2, None)]), ('Load',)), ('Constant', (1, 10), 3, None)]))], []), -('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1), ('ListComp', (2, 1), ('Name', (2, 2), 'i', ('Load',)), [('comprehension', ('Name', (2, 14), 'b', ('Store',)), ('Name', (2, 19), 'c', ('Load',)), [], 1)]))], [], None, None)], []), -('Module', [('FunctionDef', (4, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 1), ('Name', (2, 1), 'deco2', ('Load',)), [], []), ('Call', (3, 1), ('Name', (3, 1), 'deco3', ('Load',)), [('Constant', (3, 7), 1, None)], [])], None, None)], []), -('Module', [('AsyncFunctionDef', (4, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 15))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 1), ('Name', (2, 1), 'deco2', ('Load',)), [], []), ('Call', (3, 1), ('Name', (3, 1), 'deco3', ('Load',)), [('Constant', (3, 7), 1, None)], [])], None, None)], []), -('Module', [('ClassDef', (4, 0), 'C', [], [], [('Pass', (4, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 1), ('Name', (2, 1), 'deco2', ('Load',)), [], []), ('Call', (3, 1), ('Name', (3, 1), 'deco3', ('Load',)), [('Constant', (3, 7), 1, None)], [])])], []), -('Module', [('FunctionDef', (2, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9))], [('Call', (1, 1), ('Name', (1, 1), 'deco', ('Load',)), [('GeneratorExp', (1, 5), ('Name', (1, 6), 'a', ('Load',)), [('comprehension', ('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 17), 'b', ('Load',)), [], 0)])], [])], None, None)], []), -('Module', [('FunctionDef', (2, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9))], [('Attribute', (1, 1), ('Attribute', (1, 1), ('Name', (1, 1), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',))], None, None)], []), -('Module', [('Expr', (1, 0), ('NamedExpr', (1, 1), ('Name', (1, 1), 'a', ('Store',)), ('Constant', (1, 6), 1, None)))], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, []), [('Pass', (1, 14))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 12), 'c', None, None), ('arg', (1, 15), 'd', None, None), ('arg', (1, 18), 'e', None, None)], None, [], [], None, []), [('Pass', (1, 22))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 12), 'c', None, None)], None, [('arg', (1, 18), 'd', None, None), ('arg', (1, 21), 'e', None, None)], [None, None], None, []), [('Pass', (1, 25))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 12), 'c', None, None)], None, [('arg', (1, 18), 'd', None, None), ('arg', (1, 21), 'e', None, None)], [None, None], ('arg', (1, 26), 'kwargs', None, None), []), [('Pass', (1, 35))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, [('Constant', (1, 8), 1, None)]), [('Pass', (1, 16))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None), ('arg', (1, 19), 'c', None, None)], None, [], [], None, [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None), ('Constant', (1, 21), 4, None)]), [('Pass', (1, 25))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [('Constant', (1, 24), 4, None)], None, [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 28))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [None], None, [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 26))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [('Constant', (1, 24), 4, None)], ('arg', (1, 29), 'kwargs', None, None), [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 38))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [None], ('arg', (1, 27), 'kwargs', None, None), [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 36))], [], None, None)], []), +('Module', [('Expr', (1, 0, 1, 4), ('Constant', (1, 0, 1, 4), None, None))], []), +('Module', [('Expr', (1, 0, 1, 18), ('Constant', (1, 0, 1, 18), 'module docstring', None))], []), +('Module', [('FunctionDef', (1, 0, 1, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 9, 1, 13))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 29), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (1, 9, 1, 29), ('Constant', (1, 9, 1, 29), 'function docstring', None))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 14), 'f', ('arguments', [], [('arg', (1, 6, 1, 7), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10, 1, 14))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 16), 'f', ('arguments', [], [('arg', (1, 6, 1, 7), 'a', None, None)], None, [], [], None, [('Constant', (1, 8, 1, 9), 0, None)]), [('Pass', (1, 12, 1, 16))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 18), 'f', ('arguments', [], [], ('arg', (1, 7, 1, 11), 'args', None, None), [], [], None, []), [('Pass', (1, 14, 1, 18))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 21), 'f', ('arguments', [], [], None, [], [], ('arg', (1, 8, 1, 14), 'kwargs', None, None), []), [('Pass', (1, 17, 1, 21))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 71), 'f', ('arguments', [], [('arg', (1, 6, 1, 7), 'a', None, None), ('arg', (1, 9, 1, 10), 'b', None, None), ('arg', (1, 14, 1, 15), 'c', None, None), ('arg', (1, 22, 1, 23), 'd', None, None), ('arg', (1, 28, 1, 29), 'e', None, None)], ('arg', (1, 35, 1, 39), 'args', None, None), [('arg', (1, 41, 1, 42), 'f', None, None)], [('Constant', (1, 43, 1, 45), 42, None)], ('arg', (1, 49, 1, 55), 'kwargs', None, None), [('Constant', (1, 11, 1, 12), 1, None), ('Constant', (1, 16, 1, 20), None, None), ('List', (1, 24, 1, 26), [], ('Load',)), ('Dict', (1, 30, 1, 32), [], [])]), [('Expr', (1, 58, 1, 71), ('Constant', (1, 58, 1, 71), 'doc for f()', None))], [], None, None)], []), +('Module', [('ClassDef', (1, 0, 1, 12), 'C', [], [], [('Pass', (1, 8, 1, 12))], [])], []), +('Module', [('ClassDef', (1, 0, 1, 32), 'C', [], [], [('Expr', (1, 9, 1, 32), ('Constant', (1, 9, 1, 32), 'docstring for class C', None))], [])], []), +('Module', [('ClassDef', (1, 0, 1, 21), 'C', [('Name', (1, 8, 1, 14), 'object', ('Load',))], [], [('Pass', (1, 17, 1, 21))], [])], []), +('Module', [('FunctionDef', (1, 0, 1, 16), 'f', ('arguments', [], [], None, [], [], None, []), [('Return', (1, 8, 1, 16), ('Constant', (1, 15, 1, 16), 1, None))], [], None, None)], []), +('Module', [('Delete', (1, 0, 1, 5), [('Name', (1, 4, 1, 5), 'v', ('Del',))])], []), +('Module', [('Assign', (1, 0, 1, 5), [('Name', (1, 0, 1, 1), 'v', ('Store',))], ('Constant', (1, 4, 1, 5), 1, None), None)], []), +('Module', [('Assign', (1, 0, 1, 7), [('Tuple', (1, 0, 1, 3), [('Name', (1, 0, 1, 1), 'a', ('Store',)), ('Name', (1, 2, 1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 6, 1, 7), 'c', ('Load',)), None)], []), +('Module', [('Assign', (1, 0, 1, 9), [('Tuple', (1, 0, 1, 5), [('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Name', (1, 3, 1, 4), 'b', ('Store',))], ('Store',))], ('Name', (1, 8, 1, 9), 'c', ('Load',)), None)], []), +('Module', [('Assign', (1, 0, 1, 9), [('List', (1, 0, 1, 5), [('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Name', (1, 3, 1, 4), 'b', ('Store',))], ('Store',))], ('Name', (1, 8, 1, 9), 'c', ('Load',)), None)], []), +('Module', [('AugAssign', (1, 0, 1, 6), ('Name', (1, 0, 1, 1), 'v', ('Store',)), ('Add',), ('Constant', (1, 5, 1, 6), 1, None))], []), +('Module', [('For', (1, 0, 1, 15), ('Name', (1, 4, 1, 5), 'v', ('Store',)), ('Name', (1, 9, 1, 10), 'v', ('Load',)), [('Pass', (1, 11, 1, 15))], [], None)], []), +('Module', [('While', (1, 0, 1, 12), ('Name', (1, 6, 1, 7), 'v', ('Load',)), [('Pass', (1, 8, 1, 12))], [])], []), +('Module', [('If', (1, 0, 1, 9), ('Name', (1, 3, 1, 4), 'v', ('Load',)), [('Pass', (1, 5, 1, 9))], [])], []), +('Module', [('If', (1, 0, 4, 6), ('Name', (1, 3, 1, 4), 'a', ('Load',)), [('Pass', (2, 2, 2, 6))], [('If', (3, 0, 4, 6), ('Name', (3, 5, 3, 6), 'b', ('Load',)), [('Pass', (4, 2, 4, 6))], [])])], []), +('Module', [('If', (1, 0, 6, 6), ('Name', (1, 3, 1, 4), 'a', ('Load',)), [('Pass', (2, 2, 2, 6))], [('If', (3, 0, 6, 6), ('Name', (3, 5, 3, 6), 'b', ('Load',)), [('Pass', (4, 2, 4, 6))], [('Pass', (6, 2, 6, 6))])])], []), +('Module', [('With', (1, 0, 1, 17), [('withitem', ('Name', (1, 5, 1, 6), 'x', ('Load',)), ('Name', (1, 10, 1, 11), 'y', ('Store',)))], [('Pass', (1, 13, 1, 17))], None)], []), +('Module', [('With', (1, 0, 1, 25), [('withitem', ('Name', (1, 5, 1, 6), 'x', ('Load',)), ('Name', (1, 10, 1, 11), 'y', ('Store',))), ('withitem', ('Name', (1, 13, 1, 14), 'z', ('Load',)), ('Name', (1, 18, 1, 19), 'q', ('Store',)))], [('Pass', (1, 21, 1, 25))], None)], []), +('Module', [('Raise', (1, 0, 1, 25), ('Call', (1, 6, 1, 25), ('Name', (1, 6, 1, 15), 'Exception', ('Load',)), [('Constant', (1, 16, 1, 24), 'string', None)], []), None)], []), +('Module', [('Try', (1, 0, 4, 6), [('Pass', (2, 2, 2, 6))], [('ExceptHandler', (3, 0, 4, 6), ('Name', (3, 7, 3, 16), 'Exception', ('Load',)), None, [('Pass', (4, 2, 4, 6))])], [], [])], []), +('Module', [('Try', (1, 0, 4, 6), [('Pass', (2, 2, 2, 6))], [], [], [('Pass', (4, 2, 4, 6))])], []), +('Module', [('Assert', (1, 0, 1, 8), ('Name', (1, 7, 1, 8), 'v', ('Load',)), None)], []), +('Module', [('Import', (1, 0, 1, 10), [('alias', 'sys', None)])], []), +('Module', [('ImportFrom', (1, 0, 1, 17), 'sys', [('alias', 'v', None)], 0)], []), +('Module', [('Global', (1, 0, 1, 8), ['v'])], []), +('Module', [('Expr', (1, 0, 1, 1), ('Constant', (1, 0, 1, 1), 1, None))], []), +('Module', [('Pass', (1, 0, 1, 4))], []), +('Module', [('For', (1, 0, 1, 16), ('Name', (1, 4, 1, 5), 'v', ('Store',)), ('Name', (1, 9, 1, 10), 'v', ('Load',)), [('Break', (1, 11, 1, 16))], [], None)], []), +('Module', [('For', (1, 0, 1, 19), ('Name', (1, 4, 1, 5), 'v', ('Store',)), ('Name', (1, 9, 1, 10), 'v', ('Load',)), [('Continue', (1, 11, 1, 19))], [], None)], []), +('Module', [('For', (1, 0, 1, 18), ('Tuple', (1, 4, 1, 7), [('Name', (1, 4, 1, 5), 'a', ('Store',)), ('Name', (1, 6, 1, 7), 'b', ('Store',))], ('Store',)), ('Name', (1, 11, 1, 12), 'c', ('Load',)), [('Pass', (1, 14, 1, 18))], [], None)], []), +('Module', [('For', (1, 0, 1, 20), ('Tuple', (1, 4, 1, 9), [('Name', (1, 5, 1, 6), 'a', ('Store',)), ('Name', (1, 7, 1, 8), 'b', ('Store',))], ('Store',)), ('Name', (1, 13, 1, 14), 'c', ('Load',)), [('Pass', (1, 16, 1, 20))], [], None)], []), +('Module', [('For', (1, 0, 1, 20), ('List', (1, 4, 1, 9), [('Name', (1, 5, 1, 6), 'a', ('Store',)), ('Name', (1, 7, 1, 8), 'b', ('Store',))], ('Store',)), ('Name', (1, 13, 1, 14), 'c', ('Load',)), [('Pass', (1, 16, 1, 20))], [], None)], []), +('Module', [('Expr', (1, 0, 11, 5), ('GeneratorExp', (1, 0, 11, 5), ('Tuple', (2, 4, 6, 5), [('Name', (3, 4, 3, 6), 'Aa', ('Load',)), ('Name', (5, 7, 5, 9), 'Bb', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (8, 4, 10, 6), [('Name', (8, 4, 8, 6), 'Aa', ('Store',)), ('Name', (10, 4, 10, 6), 'Bb', ('Store',))], ('Store',)), ('Name', (10, 10, 10, 12), 'Cc', ('Load',)), [], 0)]))], []), +('Module', [('Expr', (1, 0, 1, 34), ('DictComp', (1, 0, 1, 34), ('Name', (1, 1, 1, 2), 'a', ('Load',)), ('Name', (1, 5, 1, 6), 'b', ('Load',)), [('comprehension', ('Name', (1, 11, 1, 12), 'w', ('Store',)), ('Name', (1, 16, 1, 17), 'x', ('Load',)), [], 0), ('comprehension', ('Name', (1, 22, 1, 23), 'm', ('Store',)), ('Name', (1, 27, 1, 28), 'p', ('Load',)), [('Name', (1, 32, 1, 33), 'g', ('Load',))], 0)]))], []), +('Module', [('Expr', (1, 0, 1, 20), ('DictComp', (1, 0, 1, 20), ('Name', (1, 1, 1, 2), 'a', ('Load',)), ('Name', (1, 5, 1, 6), 'b', ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'v', ('Store',)), ('Name', (1, 13, 1, 14), 'w', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'x', ('Load',)), [], 0)]))], []), +('Module', [('Expr', (1, 0, 1, 19), ('SetComp', (1, 0, 1, 19), ('Name', (1, 1, 1, 2), 'r', ('Load',)), [('comprehension', ('Name', (1, 7, 1, 8), 'l', ('Store',)), ('Name', (1, 12, 1, 13), 'x', ('Load',)), [('Name', (1, 17, 1, 18), 'g', ('Load',))], 0)]))], []), +('Module', [('Expr', (1, 0, 1, 16), ('SetComp', (1, 0, 1, 16), ('Name', (1, 1, 1, 2), 'r', ('Load',)), [('comprehension', ('Tuple', (1, 7, 1, 10), [('Name', (1, 7, 1, 8), 'l', ('Store',)), ('Name', (1, 9, 1, 10), 'm', ('Store',))], ('Store',)), ('Name', (1, 14, 1, 15), 'x', ('Load',)), [], 0)]))], []), +('Module', [('AsyncFunctionDef', (1, 0, 3, 18), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1, 2, 17), ('Constant', (2, 1, 2, 17), 'async function', None)), ('Expr', (3, 1, 3, 18), ('Await', (3, 1, 3, 18), ('Call', (3, 7, 3, 18), ('Name', (3, 7, 3, 16), 'something', ('Load',)), [], [])))], [], None, None)], []), +('Module', [('AsyncFunctionDef', (1, 0, 3, 8), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncFor', (2, 1, 3, 8), ('Name', (2, 11, 2, 12), 'e', ('Store',)), ('Name', (2, 16, 2, 17), 'i', ('Load',)), [('Expr', (2, 19, 2, 20), ('Constant', (2, 19, 2, 20), 1, None))], [('Expr', (3, 7, 3, 8), ('Constant', (3, 7, 3, 8), 2, None))], None)], [], None, None)], []), +('Module', [('AsyncFunctionDef', (1, 0, 2, 21), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncWith', (2, 1, 2, 21), [('withitem', ('Name', (2, 12, 2, 13), 'a', ('Load',)), ('Name', (2, 17, 2, 18), 'b', ('Store',)))], [('Expr', (2, 20, 2, 21), ('Constant', (2, 20, 2, 21), 1, None))], None)], [], None, None)], []), +('Module', [('Expr', (1, 0, 1, 14), ('Dict', (1, 0, 1, 14), [None, ('Constant', (1, 10, 1, 11), 2, None)], [('Dict', (1, 3, 1, 8), [('Constant', (1, 4, 1, 5), 1, None)], [('Constant', (1, 6, 1, 7), 2, None)]), ('Constant', (1, 12, 1, 13), 3, None)]))], []), +('Module', [('Expr', (1, 0, 1, 12), ('Set', (1, 0, 1, 12), [('Starred', (1, 1, 1, 8), ('Set', (1, 2, 1, 8), [('Constant', (1, 3, 1, 4), 1, None), ('Constant', (1, 6, 1, 7), 2, None)]), ('Load',)), ('Constant', (1, 10, 1, 11), 3, None)]))], []), +('Module', [('AsyncFunctionDef', (1, 0, 2, 21), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1, 2, 21), ('ListComp', (2, 1, 2, 21), ('Name', (2, 2, 2, 3), 'i', ('Load',)), [('comprehension', ('Name', (2, 14, 2, 15), 'b', ('Store',)), ('Name', (2, 19, 2, 20), 'c', ('Load',)), [], 1)]))], [], None, None)], []), +('Module', [('FunctionDef', (4, 0, 4, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 9, 4, 13))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])], None, None)], []), +('Module', [('AsyncFunctionDef', (4, 0, 4, 19), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 15, 4, 19))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])], None, None)], []), +('Module', [('ClassDef', (4, 0, 4, 13), 'C', [], [], [('Pass', (4, 9, 4, 13))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])])], []), +('Module', [('FunctionDef', (2, 0, 2, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9, 2, 13))], [('Call', (1, 1, 1, 19), ('Name', (1, 1, 1, 5), 'deco', ('Load',)), [('GeneratorExp', (1, 5, 1, 19), ('Name', (1, 6, 1, 7), 'a', ('Load',)), [('comprehension', ('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 17, 1, 18), 'b', ('Load',)), [], 0)])], [])], None, None)], []), +('Module', [('FunctionDef', (2, 0, 2, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9, 2, 13))], [('Attribute', (1, 1, 1, 6), ('Attribute', (1, 1, 1, 4), ('Name', (1, 1, 1, 2), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',))], None, None)], []), +('Module', [('Expr', (1, 0, 1, 8), ('NamedExpr', (1, 1, 1, 7), ('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Constant', (1, 6, 1, 7), 1, None)))], []), +('Module', [('FunctionDef', (1, 0, 1, 18), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [], None, [], [], None, []), [('Pass', (1, 14, 1, 18))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 26), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None), ('arg', (1, 15, 1, 16), 'd', None, None), ('arg', (1, 18, 1, 19), 'e', None, None)], None, [], [], None, []), [('Pass', (1, 22, 1, 26))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 29), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None)], None, [('arg', (1, 18, 1, 19), 'd', None, None), ('arg', (1, 21, 1, 22), 'e', None, None)], [None, None], None, []), [('Pass', (1, 25, 1, 29))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 39), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None)], None, [('arg', (1, 18, 1, 19), 'd', None, None), ('arg', (1, 21, 1, 22), 'e', None, None)], [None, None], ('arg', (1, 26, 1, 32), 'kwargs', None, None), []), [('Pass', (1, 35, 1, 39))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 20), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [], None, [], [], None, [('Constant', (1, 8, 1, 9), 1, None)]), [('Pass', (1, 16, 1, 20))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 29), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None), ('arg', (1, 19, 1, 20), 'c', None, None)], None, [], [], None, [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None), ('Constant', (1, 21, 1, 22), 4, None)]), [('Pass', (1, 25, 1, 29))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 32), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [('Constant', (1, 24, 1, 25), 4, None)], None, [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 28, 1, 32))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 30), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [None], None, [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 26, 1, 30))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 42), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [('Constant', (1, 24, 1, 25), 4, None)], ('arg', (1, 29, 1, 35), 'kwargs', None, None), [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 38, 1, 42))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 40), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [None], ('arg', (1, 27, 1, 33), 'kwargs', None, None), [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 36, 1, 40))], [], None, None)], []), ] single_results = [ -('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Constant', (1, 0), 1, None), ('Add',), ('Constant', (1, 2), 2, None)))]), +('Interactive', [('Expr', (1, 0, 1, 3), ('BinOp', (1, 0, 1, 3), ('Constant', (1, 0, 1, 1), 1, None), ('Add',), ('Constant', (1, 2, 1, 3), 2, None)))]), ] eval_results = [ -('Expression', ('Constant', (1, 0), None, None)), -('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])), -('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))), -('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))), -('Expression', ('Lambda', (1, 0), ('arguments', [], [], None, [], [], None, []), ('Constant', (1, 7), None, None))), -('Expression', ('Dict', (1, 0), [('Constant', (1, 2), 1, None)], [('Constant', (1, 4), 2, None)])), -('Expression', ('Dict', (1, 0), [], [])), -('Expression', ('Set', (1, 0), [('Constant', (1, 1), None, None)])), -('Expression', ('Dict', (1, 0), [('Constant', (2, 6), 1, None)], [('Constant', (4, 10), 2, None)])), -('Expression', ('ListComp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), [('comprehension', ('Name', (1, 7), 'b', ('Store',)), ('Name', (1, 12), 'c', ('Load',)), [('Name', (1, 17), 'd', ('Load',))], 0)])), -('Expression', ('GeneratorExp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), [('comprehension', ('Name', (1, 7), 'b', ('Store',)), ('Name', (1, 12), 'c', ('Load',)), [('Name', (1, 17), 'd', ('Load',))], 0)])), -('Expression', ('ListComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [], 0)])), -('Expression', ('ListComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('ListComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('SetComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [], 0)])), -('Expression', ('SetComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('SetComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('GeneratorExp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [], 0)])), -('Expression', ('GeneratorExp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('GeneratorExp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('Compare', (1, 0), ('Constant', (1, 0), 1, None), [('Lt',), ('Lt',)], [('Constant', (1, 4), 2, None), ('Constant', (1, 8), 3, None)])), -('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Constant', (1, 2), 1, None), ('Constant', (1, 4), 2, None), ('Starred', (1, 10), ('Name', (1, 11), 'd', ('Load',)), ('Load',))], [('keyword', 'c', ('Constant', (1, 8), 3, None)), ('keyword', None, ('Name', (1, 15), 'e', ('Load',)))])), -('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Starred', (1, 2), ('List', (1, 3), [('Constant', (1, 4), 0, None), ('Constant', (1, 7), 1, None)], ('Load',)), ('Load',))], [])), -('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('GeneratorExp', (1, 1), ('Name', (1, 2), 'a', ('Load',)), [('comprehension', ('Name', (1, 8), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Load',)), [], 0)])], [])), -('Expression', ('Constant', (1, 0), 10, None)), -('Expression', ('Constant', (1, 0), 'string', None)), -('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))), -('Expression', ('Subscript', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Slice', ('Name', (1, 2), 'b', ('Load',)), ('Name', (1, 4), 'c', ('Load',)), None), ('Load',))), -('Expression', ('Name', (1, 0), 'v', ('Load',))), -('Expression', ('List', (1, 0), [('Constant', (1, 1), 1, None), ('Constant', (1, 3), 2, None), ('Constant', (1, 5), 3, None)], ('Load',))), -('Expression', ('List', (1, 0), [], ('Load',))), -('Expression', ('Tuple', (1, 0), [('Constant', (1, 0), 1, None), ('Constant', (1, 2), 2, None), ('Constant', (1, 4), 3, None)], ('Load',))), -('Expression', ('Tuple', (1, 0), [('Constant', (1, 1), 1, None), ('Constant', (1, 3), 2, None), ('Constant', (1, 5), 3, None)], ('Load',))), -('Expression', ('Tuple', (1, 0), [], ('Load',))), -('Expression', ('Call', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',)), 'd', ('Load',)), [('Subscript', (1, 8), ('Attribute', (1, 8), ('Name', (1, 8), 'a', ('Load',)), 'b', ('Load',)), ('Slice', ('Constant', (1, 12), 1, None), ('Constant', (1, 14), 2, None), None), ('Load',))], [])), +('Expression', ('Constant', (1, 0, 1, 4), None, None)), +('Expression', ('BoolOp', (1, 0, 1, 7), ('And',), [('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Name', (1, 6, 1, 7), 'b', ('Load',))])), +('Expression', ('BinOp', (1, 0, 1, 5), ('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Add',), ('Name', (1, 4, 1, 5), 'b', ('Load',)))), +('Expression', ('UnaryOp', (1, 0, 1, 5), ('Not',), ('Name', (1, 4, 1, 5), 'v', ('Load',)))), +('Expression', ('Lambda', (1, 0, 1, 11), ('arguments', [], [], None, [], [], None, []), ('Constant', (1, 7, 1, 11), None, None))), +('Expression', ('Dict', (1, 0, 1, 7), [('Constant', (1, 2, 1, 3), 1, None)], [('Constant', (1, 4, 1, 5), 2, None)])), +('Expression', ('Dict', (1, 0, 1, 2), [], [])), +('Expression', ('Set', (1, 0, 1, 7), [('Constant', (1, 1, 1, 5), None, None)])), +('Expression', ('Dict', (1, 0, 5, 6), [('Constant', (2, 6, 2, 7), 1, None)], [('Constant', (4, 10, 4, 11), 2, None)])), +('Expression', ('ListComp', (1, 0, 1, 19), ('Name', (1, 1, 1, 2), 'a', ('Load',)), [('comprehension', ('Name', (1, 7, 1, 8), 'b', ('Store',)), ('Name', (1, 12, 1, 13), 'c', ('Load',)), [('Name', (1, 17, 1, 18), 'd', ('Load',))], 0)])), +('Expression', ('GeneratorExp', (1, 0, 1, 19), ('Name', (1, 1, 1, 2), 'a', ('Load',)), [('comprehension', ('Name', (1, 7, 1, 8), 'b', ('Store',)), ('Name', (1, 12, 1, 13), 'c', ('Load',)), [('Name', (1, 17, 1, 18), 'd', ('Load',))], 0)])), +('Expression', ('ListComp', (1, 0, 1, 20), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'c', ('Load',)), [], 0)])), +('Expression', ('ListComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('ListComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('SetComp', (1, 0, 1, 20), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'c', ('Load',)), [], 0)])), +('Expression', ('SetComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('SetComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('GeneratorExp', (1, 0, 1, 20), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'c', ('Load',)), [], 0)])), +('Expression', ('GeneratorExp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('GeneratorExp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('Compare', (1, 0, 1, 9), ('Constant', (1, 0, 1, 1), 1, None), [('Lt',), ('Lt',)], [('Constant', (1, 4, 1, 5), 2, None), ('Constant', (1, 8, 1, 9), 3, None)])), +('Expression', ('Call', (1, 0, 1, 17), ('Name', (1, 0, 1, 1), 'f', ('Load',)), [('Constant', (1, 2, 1, 3), 1, None), ('Constant', (1, 4, 1, 5), 2, None), ('Starred', (1, 10, 1, 12), ('Name', (1, 11, 1, 12), 'd', ('Load',)), ('Load',))], [('keyword', (1, 6, 1, 9), 'c', ('Constant', (1, 8, 1, 9), 3, None)), ('keyword', (1, 13, 1, 16), None, ('Name', (1, 15, 1, 16), 'e', ('Load',)))])), +('Expression', ('Call', (1, 0, 1, 10), ('Name', (1, 0, 1, 1), 'f', ('Load',)), [('Starred', (1, 2, 1, 9), ('List', (1, 3, 1, 9), [('Constant', (1, 4, 1, 5), 0, None), ('Constant', (1, 7, 1, 8), 1, None)], ('Load',)), ('Load',))], [])), +('Expression', ('Call', (1, 0, 1, 15), ('Name', (1, 0, 1, 1), 'f', ('Load',)), [('GeneratorExp', (1, 1, 1, 15), ('Name', (1, 2, 1, 3), 'a', ('Load',)), [('comprehension', ('Name', (1, 8, 1, 9), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Load',)), [], 0)])], [])), +('Expression', ('Constant', (1, 0, 1, 2), 10, None)), +('Expression', ('Constant', (1, 0, 1, 8), 'string', None)), +('Expression', ('Attribute', (1, 0, 1, 3), ('Name', (1, 0, 1, 1), 'a', ('Load',)), 'b', ('Load',))), +('Expression', ('Subscript', (1, 0, 1, 6), ('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Slice', (1, 2, 1, 5), ('Name', (1, 2, 1, 3), 'b', ('Load',)), ('Name', (1, 4, 1, 5), 'c', ('Load',)), None), ('Load',))), +('Expression', ('Name', (1, 0, 1, 1), 'v', ('Load',))), +('Expression', ('List', (1, 0, 1, 7), [('Constant', (1, 1, 1, 2), 1, None), ('Constant', (1, 3, 1, 4), 2, None), ('Constant', (1, 5, 1, 6), 3, None)], ('Load',))), +('Expression', ('List', (1, 0, 1, 2), [], ('Load',))), +('Expression', ('Tuple', (1, 0, 1, 5), [('Constant', (1, 0, 1, 1), 1, None), ('Constant', (1, 2, 1, 3), 2, None), ('Constant', (1, 4, 1, 5), 3, None)], ('Load',))), +('Expression', ('Tuple', (1, 0, 1, 7), [('Constant', (1, 1, 1, 2), 1, None), ('Constant', (1, 3, 1, 4), 2, None), ('Constant', (1, 5, 1, 6), 3, None)], ('Load',))), +('Expression', ('Tuple', (1, 0, 1, 2), [], ('Load',))), +('Expression', ('Call', (1, 0, 1, 17), ('Attribute', (1, 0, 1, 7), ('Attribute', (1, 0, 1, 5), ('Attribute', (1, 0, 1, 3), ('Name', (1, 0, 1, 1), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',)), 'd', ('Load',)), [('Subscript', (1, 8, 1, 16), ('Attribute', (1, 8, 1, 11), ('Name', (1, 8, 1, 9), 'a', ('Load',)), 'b', ('Load',)), ('Slice', (1, 12, 1, 15), ('Constant', (1, 12, 1, 13), 1, None), ('Constant', (1, 14, 1, 15), 2, None), None), ('Load',))], [])), ] main() diff --git a/Lib/test/test_asynchat.py b/Lib/test/test_asynchat.py index 14c0ec43d422ea5e4c3cedec79ccfb7f63d01344..004d368d76312bd26bcb397ee99b68440042e37e 100644 --- a/Lib/test/test_asynchat.py +++ b/Lib/test/test_asynchat.py @@ -1,6 +1,7 @@ # test asynchat from test import support +from test.support import socket_helper import asynchat import asyncore @@ -12,9 +13,8 @@ import unittest import unittest.mock -HOST = support.HOST +HOST = socket_helper.HOST SERVER_QUIT = b'QUIT\n' -TIMEOUT = 3.0 class echo_server(threading.Thread): @@ -26,7 +26,7 @@ def __init__(self, event): threading.Thread.__init__(self) self.event = event self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.port = support.bind_port(self.sock) + self.port = socket_helper.bind_port(self.sock) # This will be set if the client wants us to wait before echoing # data back. self.start_resend_event = None @@ -73,14 +73,14 @@ def __init__(self, terminator, server_port): self.set_terminator(terminator) self.buffer = b"" - def handle_connect(self): - pass + def handle_connect(self): + pass - if sys.platform == 'darwin': - # select.poll returns a select.POLLHUP at the end of the tests - # on darwin, so just ignore it - def handle_expt(self): - pass + if sys.platform == 'darwin': + # select.poll returns a select.POLLHUP at the end of the tests + # on darwin, so just ignore it + def handle_expt(self): + pass def collect_incoming_data(self, data): self.buffer += data @@ -122,7 +122,7 @@ def line_terminator_check(self, term, server_chunk): c.push(b"I'm not dead yet!" + term) c.push(SERVER_QUIT) asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01) - support.join_thread(s, timeout=TIMEOUT) + support.join_thread(s) self.assertEqual(c.contents, [b"hello world", b"I'm not dead yet!"]) @@ -153,7 +153,7 @@ def numeric_terminator_check(self, termlen): c.push(data) c.push(SERVER_QUIT) asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01) - support.join_thread(s, timeout=TIMEOUT) + support.join_thread(s) self.assertEqual(c.contents, [data[:termlen]]) @@ -173,7 +173,7 @@ def test_none_terminator(self): c.push(data) c.push(SERVER_QUIT) asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01) - support.join_thread(s, timeout=TIMEOUT) + support.join_thread(s) self.assertEqual(c.contents, []) self.assertEqual(c.buffer, data) @@ -185,7 +185,7 @@ def test_simple_producer(self): p = asynchat.simple_producer(data+SERVER_QUIT, buffer_size=8) c.push_with_producer(p) asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01) - support.join_thread(s, timeout=TIMEOUT) + support.join_thread(s) self.assertEqual(c.contents, [b"hello world", b"I'm not dead yet!"]) @@ -195,7 +195,7 @@ def test_string_producer(self): data = b"hello world\nI'm not dead yet!\n" c.push_with_producer(data+SERVER_QUIT) asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01) - support.join_thread(s, timeout=TIMEOUT) + support.join_thread(s) self.assertEqual(c.contents, [b"hello world", b"I'm not dead yet!"]) @@ -206,7 +206,7 @@ def test_empty_line(self): c.push(b"hello world\n\nI'm not dead yet!\n") c.push(SERVER_QUIT) asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01) - support.join_thread(s, timeout=TIMEOUT) + support.join_thread(s) self.assertEqual(c.contents, [b"hello world", b"", b"I'm not dead yet!"]) @@ -225,7 +225,7 @@ def test_close_when_done(self): # where the server echoes all of its data before we can check that it # got any down below. s.start_resend_event.set() - support.join_thread(s, timeout=TIMEOUT) + support.join_thread(s) self.assertEqual(c.contents, []) # the server might have been able to send a byte or two back, but this @@ -246,7 +246,7 @@ def test_push(self): self.assertRaises(TypeError, c.push, 'unicode') c.push(SERVER_QUIT) asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01) - support.join_thread(s, timeout=TIMEOUT) + support.join_thread(s) self.assertEqual(c.contents, [b'bytes', b'bytes', b'bytes']) diff --git a/Lib/test/test_asyncio/functional.py b/Lib/test/test_asyncio/functional.py index 70cd140f479669c69fc4c413b896b6a97d40377b..5cd0659387d843ba50fcb93c43dc1a33b9aea424 100644 --- a/Lib/test/test_asyncio/functional.py +++ b/Lib/test/test_asyncio/functional.py @@ -7,6 +7,7 @@ import socket import tempfile import threading +from test import support class FunctionalTestCaseMixin: @@ -49,7 +50,7 @@ def tearDown(self): def tcp_server(self, server_prog, *, family=socket.AF_INET, addr=None, - timeout=5, + timeout=support.LOOPBACK_TIMEOUT, backlog=1, max_clients=10): @@ -72,7 +73,7 @@ def tcp_server(self, server_prog, *, def tcp_client(self, client_prog, family=socket.AF_INET, - timeout=10): + timeout=support.LOOPBACK_TIMEOUT): sock = socket.socket(family, socket.SOCK_STREAM) @@ -225,7 +226,7 @@ def stop(self): def run(self): try: with self._sock: - self._sock.setblocking(0) + self._sock.setblocking(False) self._run() finally: self._s1.close() diff --git a/Lib/test/test_asyncio/test_asyncio_waitfor.py b/Lib/test/test_asyncio/test_asyncio_waitfor.py new file mode 100644 index 0000000000000000000000000000000000000000..2ca64abbeb527c2a8e6cdf41c95ce22e5620044a --- /dev/null +++ b/Lib/test/test_asyncio/test_asyncio_waitfor.py @@ -0,0 +1,61 @@ +import asyncio +import unittest +import time + +def tearDownModule(): + asyncio.set_event_loop_policy(None) + + +class SlowTask: + """ Task will run for this defined time, ignoring cancel requests """ + TASK_TIMEOUT = 0.2 + + def __init__(self): + self.exited = False + + async def run(self): + exitat = time.monotonic() + self.TASK_TIMEOUT + + while True: + tosleep = exitat - time.monotonic() + if tosleep <= 0: + break + + try: + await asyncio.sleep(tosleep) + except asyncio.CancelledError: + pass + + self.exited = True + +class AsyncioWaitForTest(unittest.TestCase): + + async def atest_asyncio_wait_for_cancelled(self): + t = SlowTask() + + waitfortask = asyncio.create_task(asyncio.wait_for(t.run(), t.TASK_TIMEOUT * 2)) + await asyncio.sleep(0) + waitfortask.cancel() + await asyncio.wait({waitfortask}) + + self.assertTrue(t.exited) + + def test_asyncio_wait_for_cancelled(self): + asyncio.run(self.atest_asyncio_wait_for_cancelled()) + + async def atest_asyncio_wait_for_timeout(self): + t = SlowTask() + + try: + await asyncio.wait_for(t.run(), t.TASK_TIMEOUT / 2) + except asyncio.TimeoutError: + pass + + self.assertTrue(t.exited) + + def test_asyncio_wait_for_timeout(self): + asyncio.run(self.atest_asyncio_wait_for_timeout()) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index 0f9e3d04d78eb85401950cd6455556e14504d27c..533d5cc7f503827b970dbc8412b0431b127f2c19 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -3,7 +3,6 @@ import concurrent.futures import errno import math -import os import socket import sys import threading @@ -17,6 +16,7 @@ from test.test_asyncio import utils as test_utils from test import support from test.support.script_helper import assert_python_ok +from test.support import socket_helper MOCK_ANY = mock.ANY @@ -91,7 +91,7 @@ def test_ipaddr_info(self): self.assertIsNone( base_events._ipaddr_info('1.2.3.4', 1, UNSPEC, 0, 0)) - if support.IPV6_ENABLED: + if socket_helper.IPV6_ENABLED: # IPv4 address with family IPv6. self.assertIsNone( base_events._ipaddr_info('1.2.3.4', 1, INET6, STREAM, TCP)) @@ -216,6 +216,9 @@ def submit(self, fn, *args, **kwargs): raise NotImplementedError( 'cannot submit into a dummy executor') + self.loop._process_events = mock.Mock() + self.loop._write_to_self = mock.Mock() + executor = DummyExecutor() self.loop.set_default_executor(executor) self.assertIs(executor, self.loop._default_executor) @@ -226,6 +229,9 @@ def test_set_default_executor_deprecation_warnings(self): with self.assertWarns(DeprecationWarning): self.loop.set_default_executor(executor) + # Avoid cleaning up the executor mock + self.loop._default_executor = None + def test_call_soon(self): def cb(): pass @@ -1150,7 +1156,7 @@ def test_create_server_stream_bittype(self): srv.close() self.loop.run_until_complete(srv.wait_closed()) - @unittest.skipUnless(support.IPV6_ENABLED, 'no IPv6 support') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'no IPv6 support') def test_create_server_ipv6(self): async def main(): with self.assertWarns(DeprecationWarning): @@ -1282,7 +1288,7 @@ def _test_create_connection_ip_addr(self, m_socket, allow_inet_pton): t.close() test_utils.run_briefly(self.loop) # allow transport to close - if support.IPV6_ENABLED: + if socket_helper.IPV6_ENABLED: sock.family = socket.AF_INET6 coro = self.loop.create_connection(asyncio.Protocol, '::1', 80) t, p = self.loop.run_until_complete(coro) @@ -1301,7 +1307,7 @@ def _test_create_connection_ip_addr(self, m_socket, allow_inet_pton): t.close() test_utils.run_briefly(self.loop) # allow transport to close - @unittest.skipUnless(support.IPV6_ENABLED, 'no IPv6 support') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'no IPv6 support') @unittest.skipIf(sys.platform.startswith('aix'), "bpo-25545: IPv6 scope id and getaddrinfo() behave differently on AIX") @patch_socket @@ -1633,7 +1639,7 @@ def test_create_datagram_endpoint_socket_err(self, m_socket): self.assertRaises( OSError, self.loop.run_until_complete, coro) - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 not supported or enabled') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 not supported or enabled') def test_create_datagram_endpoint_no_matching_family(self): coro = self.loop.create_datagram_endpoint( asyncio.DatagramProtocol, @@ -1694,7 +1700,7 @@ def test_create_datagram_endpoint_sock_unix(self): self.loop.run_until_complete(protocol.done) self.assertEqual('CLOSED', protocol.state) - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_create_datagram_endpoint_existing_sock_unix(self): with test_utils.unix_socket_path() as path: sock = socket.socket(socket.AF_UNIX, type=socket.SOCK_DGRAM) @@ -2009,7 +2015,7 @@ def prepare(self): sock = self.make_socket() proto = self.MyProto(self.loop) server = self.run_loop(self.loop.create_server( - lambda: proto, support.HOST, 0, family=socket.AF_INET)) + lambda: proto, socket_helper.HOST, 0, family=socket.AF_INET)) addr = server.sockets[0].getsockname() for _ in range(10): diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index 85838f17678af16d7b044c2722116b19bb09fecf..fa6c49d89da5cdae36fe6d5745978dd60584127d 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -32,6 +32,8 @@ from asyncio import selector_events from test.test_asyncio import utils as test_utils from test import support +from test.support import socket_helper +from test.support import ALWAYS_EQ, LARGEST, SMALLEST def tearDownModule(): @@ -291,11 +293,8 @@ def callback(arg): self.loop.stop() self.loop.call_later(0.1, callback, 'hello world') - t0 = time.monotonic() self.loop.run_forever() - t1 = time.monotonic() self.assertEqual(results, ['hello world']) - self.assertTrue(0.08 <= t1-t0 <= 0.8, t1-t0) def test_call_soon(self): results = [] @@ -364,6 +363,8 @@ def run(): f2 = self.loop.run_in_executor(None, run) f2.cancel() + self.loop.run_until_complete( + self.loop.shutdown_default_executor()) self.loop.close() self.loop.call_soon = patched_call_soon self.loop.call_soon_threadsafe = patched_call_soon @@ -514,7 +515,7 @@ def test_create_connection(self): lambda: MyProto(loop=self.loop), *httpd.address) self._basetest_create_connection(conn_fut) - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_create_unix_connection(self): # Issue #20682: On Mac OS X Tiger, getsockname() returns a # zero-length address for UNIX socket. @@ -616,7 +617,7 @@ def test_create_ssl_connection(self): self._test_create_ssl_connection(httpd, create_connection, peername=httpd.address) - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket @unittest.skipIf(ssl is None, 'No ssl module') def test_create_ssl_unix_connection(self): # Issue #20682: On Mac OS X Tiger, getsockname() returns a @@ -635,7 +636,7 @@ def test_create_ssl_unix_connection(self): def test_create_connection_local_addr(self): with test_utils.run_test_server() as httpd: - port = support.find_unused_port() + port = socket_helper.find_unused_port() f = self.loop.create_connection( lambda: MyProto(loop=self.loop), *httpd.address, local_addr=(httpd.address[0], port)) @@ -702,7 +703,7 @@ def client(): proto.transport.close() lsock.close() - support.join_thread(thread, timeout=1) + support.join_thread(thread) self.assertFalse(thread.is_alive()) self.assertEqual(proto.state, 'CLOSED') self.assertEqual(proto.nbytes, len(message)) @@ -727,7 +728,7 @@ def test_connect_accepted_socket_ssl_timeout_for_plain_socket(self): sock = socket.socket() self.addCleanup(sock.close) coro = self.loop.connect_accepted_socket( - MyProto, sock, ssl_handshake_timeout=1) + MyProto, sock, ssl_handshake_timeout=support.LOOPBACK_TIMEOUT) with self.assertRaisesRegex( ValueError, 'ssl_handshake_timeout is only meaningful with ssl'): @@ -840,7 +841,7 @@ def _make_unix_server(self, factory, **kwargs): return server, path - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_create_unix_server(self): proto = MyProto(loop=self.loop) server, path = self._make_unix_server(lambda: proto) @@ -932,7 +933,7 @@ def test_create_server_ssl(self): # stop serving server.close() - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket @unittest.skipIf(ssl is None, 'No ssl module') def test_create_unix_server_ssl(self): proto = MyProto(loop=self.loop) @@ -992,7 +993,7 @@ def test_create_server_ssl_verify_failed(self): self.assertIsNone(proto.transport) server.close() - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket @unittest.skipIf(ssl is None, 'No ssl module') def test_create_unix_server_ssl_verify_failed(self): proto = MyProto(loop=self.loop) @@ -1052,7 +1053,7 @@ def test_create_server_ssl_match_failed(self): self.assertIsNone(proto.transport) server.close() - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket @unittest.skipIf(ssl is None, 'No ssl module') def test_create_unix_server_ssl_verified(self): proto = MyProto(loop=self.loop) @@ -1071,6 +1072,7 @@ def test_create_unix_server_ssl_verified(self): ssl=sslcontext_client, server_hostname='localhost') client, pr = self.loop.run_until_complete(f_c) + self.loop.run_until_complete(proto.connected) # close connection proto.transport.close() @@ -1096,6 +1098,7 @@ def test_create_server_ssl_verified(self): ssl=sslcontext_client, server_hostname='localhost') client, pr = self.loop.run_until_complete(f_c) + self.loop.run_until_complete(proto.connected) # extra info is available self.check_ssl_extra_info(client, peername=(host, port), @@ -1145,7 +1148,7 @@ def test_create_server_addr_in_use(self): server.close() - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 not supported or enabled') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 not supported or enabled') def test_create_server_dual_stack(self): f_proto = self.loop.create_future() @@ -1157,7 +1160,7 @@ def connection_made(self, transport): try_count = 0 while True: try: - port = support.find_unused_port() + port = socket_helper.find_unused_port() f = self.loop.create_server(TestMyProto, host=None, port=port) server = self.loop.run_until_complete(f) except OSError as ex: @@ -1255,7 +1258,7 @@ def datagram_received(self, data, addr): def test_create_datagram_endpoint(self): self._test_create_datagram_endpoint(('127.0.0.1', 0), socket.AF_INET) - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 not supported or enabled') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 not supported or enabled') def test_create_datagram_endpoint_ipv6(self): self._test_create_datagram_endpoint(('::1', 0), socket.AF_INET6) @@ -1487,12 +1490,12 @@ def reader(data): return len(data) test_utils.run_until(self.loop, lambda: reader(data) >= 1, - timeout=10) + timeout=support.SHORT_TIMEOUT) self.assertEqual(b'1', data) transport.write(b'2345') test_utils.run_until(self.loop, lambda: reader(data) >= 5, - timeout=10) + timeout=support.SHORT_TIMEOUT) self.assertEqual(b'12345', data) self.assertEqual('CONNECTED', proto.state) @@ -1543,27 +1546,29 @@ def reader(data): return len(data) write_transport.write(b'1') - test_utils.run_until(self.loop, lambda: reader(data) >= 1, timeout=10) + test_utils.run_until(self.loop, lambda: reader(data) >= 1, + timeout=support.SHORT_TIMEOUT) self.assertEqual(b'1', data) self.assertEqual(['INITIAL', 'CONNECTED'], read_proto.state) self.assertEqual('CONNECTED', write_proto.state) os.write(master, b'a') test_utils.run_until(self.loop, lambda: read_proto.nbytes >= 1, - timeout=10) + timeout=support.SHORT_TIMEOUT) self.assertEqual(['INITIAL', 'CONNECTED'], read_proto.state) self.assertEqual(1, read_proto.nbytes) self.assertEqual('CONNECTED', write_proto.state) write_transport.write(b'2345') - test_utils.run_until(self.loop, lambda: reader(data) >= 5, timeout=10) + test_utils.run_until(self.loop, lambda: reader(data) >= 5, + timeout=support.SHORT_TIMEOUT) self.assertEqual(b'12345', data) self.assertEqual(['INITIAL', 'CONNECTED'], read_proto.state) self.assertEqual('CONNECTED', write_proto.state) os.write(master, b'bcde') test_utils.run_until(self.loop, lambda: read_proto.nbytes >= 5, - timeout=10) + timeout=support.SHORT_TIMEOUT) self.assertEqual(['INITIAL', 'CONNECTED'], read_proto.state) self.assertEqual(5, read_proto.nbytes) self.assertEqual('CONNECTED', write_proto.state) @@ -2394,6 +2399,28 @@ def callback(*args): self.assertIs(NotImplemented, h1.__eq__(h3)) self.assertIs(NotImplemented, h1.__ne__(h3)) + with self.assertRaises(TypeError): + h1 < () + with self.assertRaises(TypeError): + h1 > () + with self.assertRaises(TypeError): + h1 <= () + with self.assertRaises(TypeError): + h1 >= () + self.assertFalse(h1 == ()) + self.assertTrue(h1 != ()) + + self.assertTrue(h1 == ALWAYS_EQ) + self.assertFalse(h1 != ALWAYS_EQ) + self.assertTrue(h1 < LARGEST) + self.assertFalse(h1 > LARGEST) + self.assertTrue(h1 <= LARGEST) + self.assertFalse(h1 >= LARGEST) + self.assertFalse(h1 < SMALLEST) + self.assertTrue(h1 > SMALLEST) + self.assertFalse(h1 <= SMALLEST) + self.assertTrue(h1 >= SMALLEST) + class AbstractEventLoopTests(unittest.TestCase): diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py index ee5edd5bd311fbb495321631b9f47831ebee61fa..ec00896cc620b3ff07e182d6fa8ee3fe06bfc885 100644 --- a/Lib/test/test_asyncio/test_futures.py +++ b/Lib/test/test_asyncio/test_futures.py @@ -201,6 +201,27 @@ def test_uninitialized(self): self.assertFalse(fut.cancelled()) self.assertFalse(fut.done()) + def test_future_cancel_message_getter(self): + f = self._new_future(loop=self.loop) + self.assertTrue(hasattr(f, '_cancel_message')) + self.assertEqual(f._cancel_message, None) + + f.cancel('my message') + with self.assertRaises(asyncio.CancelledError): + self.loop.run_until_complete(f) + self.assertEqual(f._cancel_message, 'my message') + + def test_future_cancel_message_setter(self): + f = self._new_future(loop=self.loop) + f.cancel('my message') + f._cancel_message = 'my new message' + self.assertEqual(f._cancel_message, 'my new message') + + # Also check that the value is used for cancel(). + with self.assertRaises(asyncio.CancelledError): + self.loop.run_until_complete(f) + self.assertEqual(f._cancel_message, 'my new message') + def test_cancel(self): f = self._new_future(loop=self.loop) self.assertTrue(f.cancel()) diff --git a/Lib/test/test_asyncio/test_futures2.py b/Lib/test/test_asyncio/test_futures2.py new file mode 100644 index 0000000000000000000000000000000000000000..13dbc703277c814f1336b95184581c8f3bac4aec --- /dev/null +++ b/Lib/test/test_asyncio/test_futures2.py @@ -0,0 +1,18 @@ +# IsolatedAsyncioTestCase based tests +import asyncio +import unittest + + +class FutureTests(unittest.IsolatedAsyncioTestCase): + async def test_recursive_repr_for_pending_tasks(self): + # The call crashes if the guard for recursive call + # in base_futures:_future_repr_info is absent + # See Also: https://bugs.python.org/issue42183 + + async def func(): + return asyncio.all_tasks() + + # The repr() call should not raise RecursiveError at first. + # The check for returned string is not very reliable but + # exact comparison for the whole string is even weaker. + self.assertIn('...', repr(await asyncio.wait_for(func(), timeout=10))) diff --git a/Lib/test/test_asyncio/test_locks.py b/Lib/test/test_asyncio/test_locks.py index 9468e740b3c1deabfac32be24d9490c37f3b2628..8c93fae2b51c6c84ffe782af47cc80cf31ecaca2 100644 --- a/Lib/test/test_asyncio/test_locks.py +++ b/Lib/test/test_asyncio/test_locks.py @@ -47,13 +47,7 @@ def test_repr(self): self.assertTrue(repr(lock).endswith('[unlocked]>')) self.assertTrue(RGX_REPR.match(repr(lock))) - with self.assertWarns(DeprecationWarning): - @asyncio.coroutine - def acquire_lock(): - with self.assertWarns(DeprecationWarning): - yield from lock - - self.loop.run_until_complete(acquire_lock()) + self.loop.run_until_complete(lock.acquire()) self.assertTrue(repr(lock).endswith('[locked]>')) self.assertTrue(RGX_REPR.match(repr(lock))) @@ -61,18 +55,16 @@ def test_lock(self): with self.assertWarns(DeprecationWarning): lock = asyncio.Lock(loop=self.loop) - @asyncio.coroutine def acquire_lock(): - with self.assertWarns(DeprecationWarning): - return (yield from lock) - - res = self.loop.run_until_complete(acquire_lock()) + return (yield from lock) - self.assertTrue(res) - self.assertTrue(lock.locked()) + with self.assertRaisesRegex( + TypeError, + "object is not iterable" + ): + self.loop.run_until_complete(acquire_lock()) - lock.release() self.assertFalse(lock.locked()) def test_lock_by_with_statement(self): @@ -90,13 +82,13 @@ def test_lock_by_with_statement(self): def test(lock): yield from asyncio.sleep(0.01) self.assertFalse(lock.locked()) - with self.assertWarns(DeprecationWarning): - with (yield from lock) as _lock: - self.assertIs(_lock, None) - self.assertTrue(lock.locked()) - yield from asyncio.sleep(0.01) - self.assertTrue(lock.locked()) - self.assertFalse(lock.locked()) + with self.assertRaisesRegex( + TypeError, + "object is not iterable" + ): + with (yield from lock): + pass + self.assertFalse(lock.locked()) for primitive in primitives: loop.run_until_complete(test(primitive)) @@ -302,52 +294,16 @@ def test_release_no_waiters(self): self.assertFalse(lock.locked()) def test_context_manager(self): - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=self.loop) + async def f(): + lock = asyncio.Lock() + self.assertFalse(lock.locked()) - @asyncio.coroutine - def acquire_lock(): - with self.assertWarns(DeprecationWarning): - return (yield from lock) + async with lock: + self.assertTrue(lock.locked()) - with self.loop.run_until_complete(acquire_lock()): - self.assertTrue(lock.locked()) + self.assertFalse(lock.locked()) - self.assertFalse(lock.locked()) - - def test_context_manager_cant_reuse(self): - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=self.loop) - - @asyncio.coroutine - def acquire_lock(): - with self.assertWarns(DeprecationWarning): - return (yield from lock) - - # This spells "yield from lock" outside a generator. - cm = self.loop.run_until_complete(acquire_lock()) - with cm: - self.assertTrue(lock.locked()) - - self.assertFalse(lock.locked()) - - with self.assertRaises(AttributeError): - with cm: - pass - - def test_context_manager_no_yield(self): - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=self.loop) - - try: - with lock: - self.fail('RuntimeError is not raised in with expression') - except RuntimeError as err: - self.assertEqual( - str(err), - '"yield from" should be used as context manager expression') - - self.assertFalse(lock.locked()) + self.loop.run_until_complete(f()) class EventTests(test_utils.TestCase): @@ -809,33 +765,14 @@ def test_repr(self): self.assertTrue(RGX_REPR.match(repr(cond))) def test_context_manager(self): - with self.assertWarns(DeprecationWarning): - cond = asyncio.Condition(loop=self.loop) - - with self.assertWarns(DeprecationWarning): - @asyncio.coroutine - def acquire_cond(): - with self.assertWarns(DeprecationWarning): - return (yield from cond) - - with self.loop.run_until_complete(acquire_cond()): - self.assertTrue(cond.locked()) - - self.assertFalse(cond.locked()) - - def test_context_manager_no_yield(self): - with self.assertWarns(DeprecationWarning): - cond = asyncio.Condition(loop=self.loop) - - try: - with cond: - self.fail('RuntimeError is not raised in with expression') - except RuntimeError as err: - self.assertEqual( - str(err), - '"yield from" should be used as context manager expression') + async def f(): + cond = asyncio.Condition() + self.assertFalse(cond.locked()) + async with cond: + self.assertTrue(cond.locked()) + self.assertFalse(cond.locked()) - self.assertFalse(cond.locked()) + self.loop.run_until_complete(f()) def test_explicit_lock(self): with self.assertWarns(DeprecationWarning): @@ -920,16 +857,14 @@ def test_semaphore(self): with self.assertWarns(DeprecationWarning): @asyncio.coroutine def acquire_lock(): - with self.assertWarns(DeprecationWarning): - return (yield from sem) + return (yield from sem) - res = self.loop.run_until_complete(acquire_lock()) - - self.assertTrue(res) - self.assertTrue(sem.locked()) - self.assertEqual(0, sem._value) + with self.assertRaisesRegex( + TypeError, + "'Semaphore' object is not iterable", + ): + self.loop.run_until_complete(acquire_lock()) - sem.release() self.assertFalse(sem.locked()) self.assertEqual(1, sem._value) @@ -1064,38 +999,6 @@ def test_release_no_waiters(self): sem.release() self.assertFalse(sem.locked()) - def test_context_manager(self): - with self.assertWarns(DeprecationWarning): - sem = asyncio.Semaphore(2, loop=self.loop) - - @asyncio.coroutine - def acquire_lock(): - with self.assertWarns(DeprecationWarning): - return (yield from sem) - - with self.loop.run_until_complete(acquire_lock()): - self.assertFalse(sem.locked()) - self.assertEqual(1, sem._value) - - with self.loop.run_until_complete(acquire_lock()): - self.assertTrue(sem.locked()) - - self.assertEqual(2, sem._value) - - def test_context_manager_no_yield(self): - with self.assertWarns(DeprecationWarning): - sem = asyncio.Semaphore(2, loop=self.loop) - - try: - with sem: - self.fail('RuntimeError is not raised in with expression') - except RuntimeError as err: - self.assertEqual( - str(err), - '"yield from" should be used as context manager expression') - - self.assertEqual(2, sem._value) - if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_asyncio/test_pep492.py b/Lib/test/test_asyncio/test_pep492.py index a1f27dd5721c832086a0f2242bb27ec0229443cc..c5e3a5c1483573875d61bf22c26dfe2246434bca 100644 --- a/Lib/test/test_asyncio/test_pep492.py +++ b/Lib/test/test_asyncio/test_pep492.py @@ -77,13 +77,12 @@ def test_context_manager_with_await(self): async def test(lock): await asyncio.sleep(0.01) self.assertFalse(lock.locked()) - with self.assertWarns(DeprecationWarning): - with await lock as _lock: - self.assertIs(_lock, None) - self.assertTrue(lock.locked()) - await asyncio.sleep(0.01) - self.assertTrue(lock.locked()) - self.assertFalse(lock.locked()) + with self.assertRaisesRegex( + TypeError, + "can't be used in 'await' expression" + ): + with await lock: + pass for primitive in primitives: self.loop.run_until_complete(test(primitive)) diff --git a/Lib/test/test_asyncio/test_proactor_events.py b/Lib/test/test_asyncio/test_proactor_events.py index 007039a7cdf5d6bae94bcde4b68bc214539dcb0c..451f86ae0274fd6a10059c98addacae88a1431da 100644 --- a/Lib/test/test_asyncio/test_proactor_events.py +++ b/Lib/test/test_asyncio/test_proactor_events.py @@ -13,6 +13,7 @@ from asyncio.proactor_events import _ProactorDuplexPipeTransport from asyncio.proactor_events import _ProactorDatagramTransport from test import support +from test.support import socket_helper from test.test_asyncio import utils as test_utils @@ -736,6 +737,7 @@ def test_loop_self_reading(self): def test_loop_self_reading_fut(self): fut = mock.Mock() + self.loop._self_reading_future = fut self.loop._loop_self_reading(fut) self.assertTrue(fut.result.called) self.proactor.recv.assert_called_with(self.ssock, 4096) @@ -950,7 +952,7 @@ def run_loop(self, coro): def prepare(self): sock = self.make_socket() proto = self.MyProto(self.loop) - port = support.find_unused_port() + port = socket_helper.find_unused_port() srv_sock = self.make_socket(cleanup=False) srv_sock.bind(('127.0.0.1', port)) server = self.run_loop(self.loop.create_server( diff --git a/Lib/test/test_asyncio/test_runners.py b/Lib/test/test_asyncio/test_runners.py index 3b58ddee443adf68c1faeb9c839bd165b1f5bd7c..b9ae02dc3c04e096f17f90a7ba741b8714b7793d 100644 --- a/Lib/test/test_asyncio/test_runners.py +++ b/Lib/test/test_asyncio/test_runners.py @@ -87,6 +87,9 @@ async def main(expected): asyncio.run(main(False)) asyncio.run(main(True), debug=True) + with mock.patch('asyncio.coroutines._is_debug_mode', lambda: True): + asyncio.run(main(True)) + asyncio.run(main(False), debug=False) def test_asyncio_run_from_running_loop(self): async def main(): diff --git a/Lib/test/test_asyncio/test_sendfile.py b/Lib/test/test_asyncio/test_sendfile.py index 3b7f784c5ee3a01e4886eb27a437487bc317a6b9..1b1af08db0a139ff11a1aa678dadda2c27c5f839 100644 --- a/Lib/test/test_asyncio/test_sendfile.py +++ b/Lib/test/test_asyncio/test_sendfile.py @@ -10,6 +10,7 @@ from asyncio import constants from unittest import mock from test import support +from test.support import socket_helper from test.test_asyncio import utils as test_utils try: @@ -163,9 +164,9 @@ def reduce_send_buffer_size(self, sock, transport=None): def prepare_socksendfile(self): proto = MyProto(self.loop) - port = support.find_unused_port() + port = socket_helper.find_unused_port() srv_sock = self.make_socket(cleanup=False) - srv_sock.bind((support.HOST, port)) + srv_sock.bind((socket_helper.HOST, port)) server = self.run_loop(self.loop.create_server( lambda: proto, sock=srv_sock)) self.reduce_receive_buffer_size(srv_sock) @@ -240,7 +241,7 @@ class SendfileMixin(SendfileBase): # Note: sendfile via SSL transport is equal to sendfile fallback def prepare_sendfile(self, *, is_ssl=False, close_after=0): - port = support.find_unused_port() + port = socket_helper.find_unused_port() srv_proto = MySendfileProto(loop=self.loop, close_after=close_after) if is_ssl: @@ -252,17 +253,17 @@ def prepare_sendfile(self, *, is_ssl=False, close_after=0): srv_ctx = None cli_ctx = None srv_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - srv_sock.bind((support.HOST, port)) + srv_sock.bind((socket_helper.HOST, port)) server = self.run_loop(self.loop.create_server( lambda: srv_proto, sock=srv_sock, ssl=srv_ctx)) self.reduce_receive_buffer_size(srv_sock) if is_ssl: - server_hostname = support.HOST + server_hostname = socket_helper.HOST else: server_hostname = None cli_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - cli_sock.connect((support.HOST, port)) + cli_sock.connect((socket_helper.HOST, port)) cli_proto = MySendfileProto(loop=self.loop) tr, pr = self.run_loop(self.loop.create_connection( @@ -444,6 +445,12 @@ def test_sendfile_ssl_close_peer_after_receiving(self): self.assertEqual(srv_proto.data, self.DATA) self.assertEqual(self.file.tell(), len(self.DATA)) + # On Solaris, lowering SO_RCVBUF on a TCP connection after it has been + # established has no effect. Due to its age, this bug affects both Oracle + # Solaris as well as all other OpenSolaris forks (unless they fixed it + # themselves). + @unittest.skipIf(sys.platform.startswith('sunos'), + "Doesn't work on Solaris") def test_sendfile_close_peer_in_the_middle_of_receiving(self): srv_proto, cli_proto = self.prepare_sendfile(close_after=1024) with self.assertRaises(ConnectionError): diff --git a/Lib/test/test_asyncio/test_server.py b/Lib/test/test_asyncio/test_server.py index d47ccc027677bda89049c0eb6414729ac1c664cd..2de4dcad17c8ed51895773790837dd6e2db8f9f9 100644 --- a/Lib/test/test_asyncio/test_server.py +++ b/Lib/test/test_asyncio/test_server.py @@ -3,7 +3,7 @@ import threading import unittest -from test import support +from test.support import socket_helper from test.test_asyncio import utils as test_utils from test.test_asyncio import functional as func_tests @@ -47,7 +47,7 @@ async def main(srv): with self.assertWarns(DeprecationWarning): srv = self.loop.run_until_complete(asyncio.start_server( - serve, support.HOSTv4, 0, loop=self.loop, start_serving=False)) + serve, socket_helper.HOSTv4, 0, loop=self.loop, start_serving=False)) self.assertFalse(srv.is_serving()) @@ -73,7 +73,7 @@ class SelectorStartServerTests(BaseStartServer, unittest.TestCase): def new_loop(self): return asyncio.SelectorEventLoop() - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_start_unix_server_1(self): HELLO_MSG = b'1' * 1024 * 5 + b'\n' started = threading.Event() diff --git a/Lib/test/test_asyncio/test_sock_lowlevel.py b/Lib/test/test_asyncio/test_sock_lowlevel.py index 89c2af9f5ec08ace601021495ee16b3bb52b6b5d..d8a5df8ede1f844a3fb53259378107950bffa886 100644 --- a/Lib/test/test_asyncio/test_sock_lowlevel.py +++ b/Lib/test/test_asyncio/test_sock_lowlevel.py @@ -1,10 +1,14 @@ import socket +import time import asyncio import sys +import unittest + from asyncio import proactor_events from itertools import cycle, islice from test.test_asyncio import utils as test_utils from test import support +from test.support import socket_helper class MyProto(asyncio.Protocol): @@ -121,6 +125,150 @@ def test_sock_client_ops(self): sock = socket.socket() self._basetest_sock_recv_into(httpd, sock) + async def _basetest_sock_recv_racing(self, httpd, sock): + sock.setblocking(False) + await self.loop.sock_connect(sock, httpd.address) + + task = asyncio.create_task(self.loop.sock_recv(sock, 1024)) + await asyncio.sleep(0) + task.cancel() + + asyncio.create_task( + self.loop.sock_sendall(sock, b'GET / HTTP/1.0\r\n\r\n')) + data = await self.loop.sock_recv(sock, 1024) + # consume data + await self.loop.sock_recv(sock, 1024) + + self.assertTrue(data.startswith(b'HTTP/1.0 200 OK')) + + async def _basetest_sock_recv_into_racing(self, httpd, sock): + sock.setblocking(False) + await self.loop.sock_connect(sock, httpd.address) + + data = bytearray(1024) + with memoryview(data) as buf: + task = asyncio.create_task( + self.loop.sock_recv_into(sock, buf[:1024])) + await asyncio.sleep(0) + task.cancel() + + task = asyncio.create_task( + self.loop.sock_sendall(sock, b'GET / HTTP/1.0\r\n\r\n')) + nbytes = await self.loop.sock_recv_into(sock, buf[:1024]) + # consume data + await self.loop.sock_recv_into(sock, buf[nbytes:]) + self.assertTrue(data.startswith(b'HTTP/1.0 200 OK')) + + await task + + async def _basetest_sock_send_racing(self, listener, sock): + listener.bind(('127.0.0.1', 0)) + listener.listen(1) + + # make connection + sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1024) + sock.setblocking(False) + task = asyncio.create_task( + self.loop.sock_connect(sock, listener.getsockname())) + await asyncio.sleep(0) + server = listener.accept()[0] + server.setblocking(False) + + with server: + await task + + # fill the buffer until sending 5 chars would block + size = 8192 + while size >= 4: + with self.assertRaises(BlockingIOError): + while True: + sock.send(b' ' * size) + size = int(size / 2) + + # cancel a blocked sock_sendall + task = asyncio.create_task( + self.loop.sock_sendall(sock, b'hello')) + await asyncio.sleep(0) + task.cancel() + + # receive everything that is not a space + async def recv_all(): + rv = b'' + while True: + buf = await self.loop.sock_recv(server, 8192) + if not buf: + return rv + rv += buf.strip() + task = asyncio.create_task(recv_all()) + + # immediately make another sock_sendall call + await self.loop.sock_sendall(sock, b'world') + sock.shutdown(socket.SHUT_WR) + data = await task + # ProactorEventLoop could deliver hello, so endswith is necessary + self.assertTrue(data.endswith(b'world')) + + # After the first connect attempt before the listener is ready, + # the socket needs time to "recover" to make the next connect call. + # On Linux, a second retry will do. On Windows, the waiting time is + # unpredictable; and on FreeBSD the socket may never come back + # because it's a loopback address. Here we'll just retry for a few + # times, and have to skip the test if it's not working. See also: + # https://stackoverflow.com/a/54437602/3316267 + # https://lists.freebsd.org/pipermail/freebsd-current/2005-May/049876.html + async def _basetest_sock_connect_racing(self, listener, sock): + listener.bind(('127.0.0.1', 0)) + addr = listener.getsockname() + sock.setblocking(False) + + task = asyncio.create_task(self.loop.sock_connect(sock, addr)) + await asyncio.sleep(0) + task.cancel() + + listener.listen(1) + + skip_reason = "Max retries reached" + for i in range(128): + try: + await self.loop.sock_connect(sock, addr) + except ConnectionRefusedError as e: + skip_reason = e + except OSError as e: + skip_reason = e + + # Retry only for this error: + # [WinError 10022] An invalid argument was supplied + if getattr(e, 'winerror', 0) != 10022: + break + else: + # success + return + + self.skipTest(skip_reason) + + def test_sock_client_racing(self): + with test_utils.run_test_server() as httpd: + sock = socket.socket() + with sock: + self.loop.run_until_complete(asyncio.wait_for( + self._basetest_sock_recv_racing(httpd, sock), 10)) + sock = socket.socket() + with sock: + self.loop.run_until_complete(asyncio.wait_for( + self._basetest_sock_recv_into_racing(httpd, sock), 10)) + listener = socket.socket() + sock = socket.socket() + with listener, sock: + self.loop.run_until_complete(asyncio.wait_for( + self._basetest_sock_send_racing(listener, sock), 10)) + + def test_sock_client_connect_racing(self): + listener = socket.socket() + sock = socket.socket() + with listener, sock: + self.loop.run_until_complete(asyncio.wait_for( + self._basetest_sock_connect_racing(listener, sock), 10)) + async def _basetest_huge_content(self, address): sock = socket.socket() sock.setblocking(False) @@ -225,7 +373,7 @@ def test_huge_content_recvinto(self): self.loop.run_until_complete( self._basetest_huge_content_recvinto(httpd.address)) - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_unix_sock_client_ops(self): with test_utils.run_test_unix_server() as httpd: sock = socket.socket(socket.AF_UNIX) @@ -267,6 +415,25 @@ def test_sock_accept(self): conn.close() listener.close() + def test_cancel_sock_accept(self): + listener = socket.socket() + listener.setblocking(False) + listener.bind(('127.0.0.1', 0)) + listener.listen(1) + sockaddr = listener.getsockname() + f = asyncio.wait_for(self.loop.sock_accept(listener), 0.1) + with self.assertRaises(asyncio.TimeoutError): + self.loop.run_until_complete(f) + + listener.close() + client = socket.socket() + client.setblocking(False) + f = self.loop.sock_connect(client, sockaddr) + with self.assertRaises(ConnectionRefusedError): + self.loop.run_until_complete(f) + + client.close() + def test_create_connection_sock(self): with test_utils.run_test_server() as httpd: sock = None diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index a7c089018ab438afdce05f97cf19ad6ee86fe413..948820c82f3bfb6c27dfff2814c66776c69422cd 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -2,7 +2,7 @@ import logging import socket -import sys +from test import support import unittest import weakref from unittest import mock @@ -15,6 +15,7 @@ from asyncio import log from asyncio import protocols from asyncio import sslproto +from test import support from test.test_asyncio import utils as test_utils from test.test_asyncio import functional as func_tests @@ -162,7 +163,7 @@ def test_write_after_closing(self): class BaseStartTLS(func_tests.FunctionalTestCaseMixin): PAYLOAD_SIZE = 1024 * 100 - TIMEOUT = 60 + TIMEOUT = support.LONG_TIMEOUT def new_loop(self): raise NotImplementedError @@ -272,7 +273,8 @@ async def client(addr): with self.tcp_server(serve, timeout=self.TIMEOUT) as srv: self.loop.run_until_complete( - asyncio.wait_for(client(srv.addr), timeout=10)) + asyncio.wait_for(client(srv.addr), + timeout=support.SHORT_TIMEOUT)) # No garbage is left if SSL is closed uncleanly client_context = weakref.ref(client_context) @@ -333,7 +335,8 @@ async def client(addr): with self.tcp_server(serve, timeout=self.TIMEOUT) as srv: self.loop.run_until_complete( - asyncio.wait_for(client(srv.addr), timeout=10)) + asyncio.wait_for(client(srv.addr), + timeout=support.SHORT_TIMEOUT)) # No garbage is left for SSL client from loop.create_connection, even # if user stores the SSLTransport in corresponding protocol instance @@ -489,7 +492,8 @@ async def client(addr): with self.tcp_server(serve, timeout=self.TIMEOUT) as srv: self.loop.run_until_complete( - asyncio.wait_for(client(srv.addr), timeout=10)) + asyncio.wait_for(client(srv.addr), + timeout=support.SHORT_TIMEOUT)) def test_start_tls_server_1(self): HELLO_MSG = b'1' * self.PAYLOAD_SIZE @@ -617,7 +621,7 @@ async def client(addr): *addr, ssl=client_sslctx, server_hostname='', - ssl_handshake_timeout=10.0), + ssl_handshake_timeout=support.SHORT_TIMEOUT), 0.5) with self.tcp_server(server, @@ -699,7 +703,7 @@ async def client(addr): ssl=client_sslctx, server_hostname='', loop=self.loop, - ssl_handshake_timeout=1.0) + ssl_handshake_timeout=support.LOOPBACK_TIMEOUT) with self.tcp_server(server, max_clients=1, diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index 12bd536911dbb2bd83458e0032032e967ba9a338..71de82dfc7ebba27cb33de4a4428548c570e8189 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -9,7 +9,7 @@ import threading import unittest from unittest import mock -from test import support +from test.support import socket_helper try: import ssl except ImportError: @@ -66,7 +66,7 @@ def test_open_connection(self): loop=self.loop) self._basetest_open_connection(conn_fut) - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_open_unix_connection(self): with test_utils.run_test_unix_server() as httpd: conn_fut = asyncio.open_unix_connection(httpd.address, @@ -99,7 +99,7 @@ def test_open_connection_no_loop_ssl(self): self._basetest_open_connection_no_loop_ssl(conn_fut) - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket @unittest.skipIf(ssl is None, 'No ssl module') def test_open_unix_connection_no_loop_ssl(self): with test_utils.run_test_unix_server(use_ssl=True) as httpd: @@ -130,7 +130,7 @@ def test_open_connection_error(self): loop=self.loop) self._basetest_open_connection_error(conn_fut) - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_open_unix_connection_error(self): with test_utils.run_test_unix_server() as httpd: conn_fut = asyncio.open_unix_connection(httpd.address, @@ -452,12 +452,14 @@ def test_readuntil_multi_chunks_1(self): def test_readuntil_eof(self): stream = asyncio.StreamReader(loop=self.loop) - stream.feed_data(b'some dataAA') + data = b'some dataAA' + stream.feed_data(data) stream.feed_eof() - with self.assertRaises(asyncio.IncompleteReadError) as cm: + with self.assertRaisesRegex(asyncio.IncompleteReadError, + 'undefined expected bytes') as cm: self.loop.run_until_complete(stream.readuntil(b'AAA')) - self.assertEqual(cm.exception.partial, b'some dataAA') + self.assertEqual(cm.exception.partial, data) self.assertIsNone(cm.exception.expected) self.assertEqual(b'', stream._buffer) @@ -653,7 +655,7 @@ async def client(addr): self.assertEqual(messages, []) - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_start_unix_server(self): class MyServer: diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py index fe8cfa61b1b2d58328b762259ef30775e6783488..6657a88e657c256133bb75cf70baafd4fa426c9a 100644 --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -1,3 +1,4 @@ +import os import signal import sys import unittest @@ -143,7 +144,7 @@ async def run(data): return proc.returncode, stdout task = run(b'some data') - task = asyncio.wait_for(task, 60.0) + task = asyncio.wait_for(task, support.LONG_TIMEOUT) exitcode, stdout = self.loop.run_until_complete(task) self.assertEqual(exitcode, 0) self.assertEqual(stdout, b'some data') @@ -476,12 +477,19 @@ def kill(): proc.kill = kill returncode = transport.get_returncode() transport.close() - await transport._wait() + await asyncio.wait_for(transport._wait(), 5) return (returncode, kill_called) # Ignore "Close running child process: kill ..." log with test_utils.disable_logger(): - returncode, killed = self.loop.run_until_complete(kill_running()) + try: + returncode, killed = self.loop.run_until_complete( + kill_running() + ) + except asyncio.TimeoutError: + self.skipTest( + "Timeout failure on waiting for subprocess stopping" + ) self.assertIsNone(returncode) # transport.close() must kill the process if it is still running @@ -691,6 +699,23 @@ class SubprocessFastWatcherTests(SubprocessWatcherMixin, Watcher = unix_events.FastChildWatcher + def has_pidfd_support(): + if not hasattr(os, 'pidfd_open'): + return False + try: + os.close(os.pidfd_open(os.getpid())) + except OSError: + return False + return True + + @unittest.skipUnless( + has_pidfd_support(), + "operating system does not support pidfds", + ) + class SubprocessPidfdWatcherTests(SubprocessWatcherMixin, + test_utils.TestCase): + Watcher = unix_events.PidfdChildWatcher + else: # Windows class SubprocessProactorTests(SubprocessMixin, test_utils.TestCase): diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index c21b06938fe3f5c568f465607607f50e6b84efe2..01f62b7f408726435ce538b5cd4ecab8e741a696 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -10,6 +10,7 @@ import re import sys import textwrap +import traceback import types import unittest import weakref @@ -57,6 +58,22 @@ def format_coroutine(qualname, state, src, source_traceback, generator=False): return 'coro=<%s() %s at %s>' % (qualname, state, src) +def get_innermost_context(exc): + """ + Return information about the innermost exception context in the chain. + """ + depth = 0 + while True: + context = exc.__context__ + if context is None: + break + + exc = context + depth += 1 + + return (type(exc), exc.args, depth) + + class Dummy: def __repr__(self): @@ -80,6 +97,12 @@ def __await__(self): return self +# The following value can be used as a very small timeout: +# it passes check "timeout > 0", but has almost +# no effect on the test performance +_EPSILON = 0.0001 + + class BaseTaskTests: Task = None @@ -97,6 +120,30 @@ def setUp(self): self.loop.set_task_factory(self.new_task) self.loop.create_future = lambda: self.new_future(self.loop) + def test_task_cancel_message_getter(self): + async def coro(): + pass + t = self.new_task(self.loop, coro()) + self.assertTrue(hasattr(t, '_cancel_message')) + self.assertEqual(t._cancel_message, None) + + t.cancel('my message') + self.assertEqual(t._cancel_message, 'my message') + + with self.assertRaises(asyncio.CancelledError): + self.loop.run_until_complete(t) + + def test_task_cancel_message_setter(self): + async def coro(): + pass + t = self.new_task(self.loop, coro()) + t.cancel('my message') + t._cancel_message = 'my new message' + self.assertEqual(t._cancel_message, 'my new message') + + with self.assertRaises(asyncio.CancelledError): + self.loop.run_until_complete(t) + def test_task_del_collect(self): class Evil: def __del__(self): @@ -466,6 +513,66 @@ async def inner2(): t = outer() self.assertEqual(self.loop.run_until_complete(t), 1042) + def test_exception_chaining_after_await(self): + # Test that when awaiting on a task when an exception is already + # active, if the task raises an exception it will be chained + # with the original. + loop = asyncio.new_event_loop() + self.set_event_loop(loop) + + async def raise_error(): + raise ValueError + + async def run(): + try: + raise KeyError(3) + except Exception as exc: + task = self.new_task(loop, raise_error()) + try: + await task + except Exception as exc: + self.assertEqual(type(exc), ValueError) + chained = exc.__context__ + self.assertEqual((type(chained), chained.args), + (KeyError, (3,))) + + try: + task = self.new_task(loop, run()) + loop.run_until_complete(task) + finally: + loop.close() + + def test_exception_chaining_after_await_with_context_cycle(self): + # Check trying to create an exception context cycle: + # https://bugs.python.org/issue40696 + has_cycle = None + loop = asyncio.new_event_loop() + self.set_event_loop(loop) + + async def process_exc(exc): + raise exc + + async def run(): + nonlocal has_cycle + try: + raise KeyError('a') + except Exception as exc: + task = self.new_task(loop, process_exc(exc)) + try: + await task + except BaseException as exc: + has_cycle = (exc is exc.__context__) + # Prevent a hang if has_cycle is True. + exc.__context__ = None + + try: + task = self.new_task(loop, run()) + loop.run_until_complete(task) + finally: + loop.close() + # This also distinguishes from the initial has_cycle=None. + self.assertEqual(has_cycle, False) + def test_cancel(self): def gen(): @@ -487,6 +594,98 @@ async def task(): self.assertTrue(t.cancelled()) self.assertFalse(t.cancel()) + def test_cancel_with_message_then_future_result(self): + # Test Future.result() after calling cancel() with a message. + cases = [ + ((), ()), + ((None,), ()), + (('my message',), ('my message',)), + # Non-string values should roundtrip. + ((5,), (5,)), + ] + for cancel_args, expected_args in cases: + with self.subTest(cancel_args=cancel_args): + loop = asyncio.new_event_loop() + self.set_event_loop(loop) + + async def sleep(): + await asyncio.sleep(10) + + async def coro(): + task = self.new_task(loop, sleep()) + await asyncio.sleep(0) + task.cancel(*cancel_args) + done, pending = await asyncio.wait([task]) + task.result() + + task = self.new_task(loop, coro()) + with self.assertRaises(asyncio.CancelledError) as cm: + loop.run_until_complete(task) + exc = cm.exception + self.assertEqual(exc.args, ()) + + actual = get_innermost_context(exc) + self.assertEqual(actual, + (asyncio.CancelledError, expected_args, 2)) + + def test_cancel_with_message_then_future_exception(self): + # Test Future.exception() after calling cancel() with a message. + cases = [ + ((), ()), + ((None,), ()), + (('my message',), ('my message',)), + # Non-string values should roundtrip. + ((5,), (5,)), + ] + for cancel_args, expected_args in cases: + with self.subTest(cancel_args=cancel_args): + loop = asyncio.new_event_loop() + self.set_event_loop(loop) + + async def sleep(): + await asyncio.sleep(10) + + async def coro(): + task = self.new_task(loop, sleep()) + await asyncio.sleep(0) + task.cancel(*cancel_args) + done, pending = await asyncio.wait([task]) + task.exception() + + task = self.new_task(loop, coro()) + with self.assertRaises(asyncio.CancelledError) as cm: + loop.run_until_complete(task) + exc = cm.exception + self.assertEqual(exc.args, ()) + + actual = get_innermost_context(exc) + self.assertEqual(actual, + (asyncio.CancelledError, expected_args, 2)) + + def test_cancel_with_message_before_starting_task(self): + loop = asyncio.new_event_loop() + self.set_event_loop(loop) + + async def sleep(): + await asyncio.sleep(10) + + async def coro(): + task = self.new_task(loop, sleep()) + # We deliberately leave out the sleep here. + task.cancel('my message') + done, pending = await asyncio.wait([task]) + task.exception() + + task = self.new_task(loop, coro()) + with self.assertRaises(asyncio.CancelledError) as cm: + loop.run_until_complete(task) + exc = cm.exception + self.assertEqual(exc.args, ()) + + actual = get_innermost_context(exc) + self.assertEqual(actual, + (asyncio.CancelledError, ('my message',), 2)) + def test_cancel_yield(self): with self.assertWarns(DeprecationWarning): @asyncio.coroutine @@ -667,6 +866,66 @@ async def coro(): self.assertTrue(nested_task.cancelled()) self.assertTrue(fut.cancelled()) + def assert_text_contains(self, text, substr): + if substr not in text: + raise RuntimeError(f'text {substr!r} not found in:\n>>>{text}<<<') + + def test_cancel_traceback_for_future_result(self): + # When calling Future.result() on a cancelled task, check that the + # line of code that was interrupted is included in the traceback. + loop = asyncio.new_event_loop() + self.set_event_loop(loop) + + async def nested(): + # This will get cancelled immediately. + await asyncio.sleep(10) + + async def coro(): + task = self.new_task(loop, nested()) + await asyncio.sleep(0) + task.cancel() + await task # search target + + task = self.new_task(loop, coro()) + try: + loop.run_until_complete(task) + except asyncio.CancelledError: + tb = traceback.format_exc() + self.assert_text_contains(tb, "await asyncio.sleep(10)") + # The intermediate await should also be included. + self.assert_text_contains(tb, "await task # search target") + else: + self.fail('CancelledError did not occur') + + def test_cancel_traceback_for_future_exception(self): + # When calling Future.exception() on a cancelled task, check that the + # line of code that was interrupted is included in the traceback. + loop = asyncio.new_event_loop() + self.set_event_loop(loop) + + async def nested(): + # This will get cancelled immediately. + await asyncio.sleep(10) + + async def coro(): + task = self.new_task(loop, nested()) + await asyncio.sleep(0) + task.cancel() + done, pending = await asyncio.wait([task]) + task.exception() # search target + + task = self.new_task(loop, coro()) + try: + loop.run_until_complete(task) + except asyncio.CancelledError: + tb = traceback.format_exc() + self.assert_text_contains(tb, "await asyncio.sleep(10)") + # The intermediate await should also be included. + self.assert_text_contains(tb, + "task.exception() # search target") + else: + self.fail('CancelledError did not occur') + def test_stop_while_run_in_complete(self): def gen(): @@ -861,6 +1120,22 @@ def gen(): res = loop.run_until_complete(task) self.assertEqual(res, "ok") + def test_wait_for_cancellation_race_condition(self): + def gen(): + yield 0.1 + yield 0.1 + yield 0.1 + yield 0.1 + + loop = self.new_test_loop(gen) + + fut = self.new_future(loop) + loop.call_later(0.1, fut.set_result, "ok") + task = loop.create_task(asyncio.wait_for(fut, timeout=1)) + loop.call_later(0.1, task.cancel) + res = loop.run_until_complete(task) + self.assertEqual(res, "ok") + def test_wait_for_waits_for_task_cancellation(self): loop = asyncio.new_event_loop() self.addCleanup(loop.close) @@ -872,17 +1147,89 @@ async def inner(): nonlocal task_done try: await asyncio.sleep(0.2) + except asyncio.CancelledError: + await asyncio.sleep(_EPSILON) + raise finally: task_done = True inner_task = self.new_task(loop, inner()) - with self.assertRaises(asyncio.TimeoutError): - await asyncio.wait_for(inner_task, timeout=0.1) + await asyncio.wait_for(inner_task, timeout=_EPSILON) - self.assertTrue(task_done) + with self.assertRaises(asyncio.TimeoutError) as cm: + loop.run_until_complete(foo()) - loop.run_until_complete(foo()) + self.assertTrue(task_done) + chained = cm.exception.__context__ + self.assertEqual(type(chained), asyncio.CancelledError) + + def test_wait_for_waits_for_task_cancellation_w_timeout_0(self): + loop = asyncio.new_event_loop() + self.addCleanup(loop.close) + + task_done = False + + async def foo(): + async def inner(): + nonlocal task_done + try: + await asyncio.sleep(10) + except asyncio.CancelledError: + await asyncio.sleep(_EPSILON) + raise + finally: + task_done = True + + inner_task = self.new_task(loop, inner()) + await asyncio.sleep(_EPSILON) + await asyncio.wait_for(inner_task, timeout=0) + + with self.assertRaises(asyncio.TimeoutError) as cm: + loop.run_until_complete(foo()) + + self.assertTrue(task_done) + chained = cm.exception.__context__ + self.assertEqual(type(chained), asyncio.CancelledError) + + def test_wait_for_reraises_exception_during_cancellation(self): + loop = asyncio.new_event_loop() + self.addCleanup(loop.close) + + class FooException(Exception): + pass + + async def foo(): + async def inner(): + try: + await asyncio.sleep(0.2) + finally: + raise FooException + + inner_task = self.new_task(loop, inner()) + + await asyncio.wait_for(inner_task, timeout=_EPSILON) + + with self.assertRaises(FooException): + loop.run_until_complete(foo()) + + def test_wait_for_raises_timeout_error_if_returned_during_cancellation(self): + loop = asyncio.new_event_loop() + self.addCleanup(loop.close) + + async def foo(): + async def inner(): + try: + await asyncio.sleep(0.2) + except asyncio.CancelledError: + return 42 + + inner_task = self.new_task(loop, inner()) + + await asyncio.wait_for(inner_task, timeout=_EPSILON) + + with self.assertRaises(asyncio.TimeoutError): + loop.run_until_complete(foo()) def test_wait_for_self_cancellation(self): loop = asyncio.new_event_loop() @@ -979,12 +1326,12 @@ def test_wait_duplicate_coroutines(self): def coro(s): return s c = coro('test') - - task =self.new_task( + task = self.new_task( self.loop, asyncio.wait([c, c, coro('spam')])) - done, pending = self.loop.run_until_complete(task) + with self.assertWarns(DeprecationWarning): + done, pending = self.loop.run_until_complete(task) self.assertFalse(pending) self.assertEqual(set(f.result() for f in done), {'test', 'spam'}) @@ -1201,6 +1548,30 @@ def gen(): loop.advance_time(10) loop.run_until_complete(asyncio.wait([a, b])) + def test_wait_with_iterator_of_tasks(self): + + def gen(): + when = yield + self.assertAlmostEqual(0.1, when) + when = yield 0 + self.assertAlmostEqual(0.15, when) + yield 0.15 + + loop = self.new_test_loop(gen) + + a = self.new_task(loop, asyncio.sleep(0.1)) + b = self.new_task(loop, asyncio.sleep(0.15)) + + async def foo(): + done, pending = await asyncio.wait(iter([b, a])) + self.assertEqual(done, set([a, b])) + self.assertEqual(pending, set()) + return 42 + + res = loop.run_until_complete(self.new_task(loop, foo())) + self.assertEqual(res, 42) + self.assertAlmostEqual(0.15, loop.time()) + def test_as_completed(self): def gen(): @@ -1346,7 +1717,9 @@ def gen(): futs = list(asyncio.as_completed(fs, loop=loop)) self.assertEqual(len(futs), 2) waiter = asyncio.wait(futs) - done, pending = loop.run_until_complete(waiter) + # Deprecation from passing coros in futs to asyncio.wait() + with self.assertWarns(DeprecationWarning): + done, pending = loop.run_until_complete(waiter) self.assertEqual(set(f.result() for f in done), {'a', 'b'}) def test_as_completed_duplicate_coroutines(self): @@ -1641,32 +2014,6 @@ async def coro(): self.assertEqual(res, 'test') self.assertIsNone(t2.result()) - - def test_current_task_deprecated(self): - Task = self.__class__.Task - - with self.assertWarns(DeprecationWarning): - self.assertIsNone(Task.current_task(loop=self.loop)) - - async def coro(loop): - with self.assertWarns(DeprecationWarning): - self.assertIs(Task.current_task(loop=loop), task) - - # See http://bugs.python.org/issue29271 for details: - asyncio.set_event_loop(loop) - try: - with self.assertWarns(DeprecationWarning): - self.assertIs(Task.current_task(None), task) - with self.assertWarns(DeprecationWarning): - self.assertIs(Task.current_task(), task) - finally: - asyncio.set_event_loop(None) - - task = self.new_task(self.loop, coro(self.loop)) - self.loop.run_until_complete(task) - with self.assertWarns(DeprecationWarning): - self.assertIsNone(Task.current_task(loop=self.loop)) - def test_current_task(self): self.assertIsNone(asyncio.current_task(loop=self.loop)) @@ -1751,7 +2098,8 @@ async def inner(): async def outer(): nonlocal proof - d, p = await asyncio.wait([inner()]) + with self.assertWarns(DeprecationWarning): + d, p = await asyncio.wait([inner()]) proof += 100 f = asyncio.ensure_future(outer(), loop=self.loop) @@ -2002,16 +2350,6 @@ def foo(): self.assertIsInstance(exception, Exception) self.assertEqual(exception.args, ("foo", )) - def test_all_tasks_deprecated(self): - Task = self.__class__.Task - - async def coro(): - with self.assertWarns(DeprecationWarning): - assert Task.all_tasks(self.loop) == {t} - - t = self.new_task(self.loop, coro()) - self.loop.run_until_complete(t) - def test_log_destroyed_pending_task(self): Task = self.__class__.Task @@ -2034,15 +2372,7 @@ def kill_me(loop): self.assertEqual(asyncio.all_tasks(loop=self.loop), {task}) - # See http://bugs.python.org/issue29271 for details: - asyncio.set_event_loop(self.loop) - try: - with self.assertWarns(DeprecationWarning): - self.assertEqual(Task.all_tasks(), {task}) - with self.assertWarns(DeprecationWarning): - self.assertEqual(Task.all_tasks(None), {task}) - finally: - asyncio.set_event_loop(None) + asyncio.set_event_loop(None) # execute the task so it waits for future self.loop._run_once() @@ -2208,31 +2538,46 @@ def cancelling_callback(_): self.assertEqual(gather_task.result(), [42]) def test_cancel_gather_2(self): - loop = asyncio.new_event_loop() - self.addCleanup(loop.close) - - async def test(): - time = 0 - while True: - time += 0.05 - await asyncio.gather(asyncio.sleep(0.05), - return_exceptions=True, - loop=loop) - if time > 1: - return - - async def main(): - qwe = self.new_task(loop, test()) - await asyncio.sleep(0.2) - qwe.cancel() - try: - await qwe - except asyncio.CancelledError: - pass - else: - self.fail('gather did not propagate the cancellation request') + cases = [ + ((), ()), + ((None,), ()), + (('my message',), ('my message',)), + # Non-string values should roundtrip. + ((5,), (5,)), + ] + for cancel_args, expected_args in cases: + with self.subTest(cancel_args=cancel_args): + loop = asyncio.new_event_loop() + self.addCleanup(loop.close) + + async def test(): + time = 0 + while True: + time += 0.05 + await asyncio.gather(asyncio.sleep(0.05), + return_exceptions=True, + loop=loop) + if time > 1: + return + + async def main(): + qwe = self.new_task(loop, test()) + await asyncio.sleep(0.2) + qwe.cancel(*cancel_args) + await qwe - loop.run_until_complete(main()) + try: + loop.run_until_complete(main()) + except asyncio.CancelledError as exc: + self.assertEqual(exc.args, ()) + exc_type, exc_args, depth = get_innermost_context(exc) + self.assertEqual((exc_type, exc_args), + (asyncio.CancelledError, expected_args)) + # The exact traceback seems to vary in CI. + self.assertIn(depth, (2, 3)) + else: + self.fail('gather did not propagate the cancellation ' + 'request') def test_exception_traceback(self): # See http://bugs.python.org/issue28843 @@ -2725,8 +3070,6 @@ def done(self): self.assertEqual(asyncio.all_tasks(loop), set()) self._register_task(task) self.assertEqual(asyncio.all_tasks(loop), set()) - with self.assertWarns(DeprecationWarning): - self.assertEqual(asyncio.Task.all_tasks(loop), {task}) self._unregister_task(task) def test__enter_task(self): @@ -3236,6 +3579,8 @@ def task_factory(loop, coro): self.loop.set_exception_handler(callback) # Set corrupted task factory + self.addCleanup(self.loop.set_task_factory, + self.loop.get_task_factory()) self.loop.set_task_factory(task_factory) # Run event loop @@ -3305,6 +3650,17 @@ def test_loop_argument_is_deprecated_in_wait_for(self): self.loop.run_until_complete( asyncio.wait_for(coroutine_function(), 0.01, loop=self.loop)) + def test_coro_is_deprecated_in_wait(self): + # Remove test when passing coros to asyncio.wait() is removed in 3.11 + with self.assertWarns(DeprecationWarning): + self.loop.run_until_complete( + asyncio.wait([coroutine_function()])) + + task = self.loop.create_task(coroutine_function()) + with self.assertWarns(DeprecationWarning): + self.loop.run_until_complete( + asyncio.wait([task, coroutine_function()])) + class CompatibilityTests(test_utils.TestCase): # Tests for checking a bridge between old-styled coroutines diff --git a/Lib/test/test_asyncio/test_threads.py b/Lib/test/test_asyncio/test_threads.py new file mode 100644 index 0000000000000000000000000000000000000000..2af322421dacfac9a552c72ed3c0a20ad6a77d42 --- /dev/null +++ b/Lib/test/test_asyncio/test_threads.py @@ -0,0 +1,93 @@ +"""Tests for asyncio/threads.py""" + +import asyncio +import unittest + +from contextvars import ContextVar +from unittest import mock +from test.test_asyncio import utils as test_utils + + +def tearDownModule(): + asyncio.set_event_loop_policy(None) + + +class ToThreadTests(test_utils.TestCase): + def setUp(self): + super().setUp() + self.loop = asyncio.new_event_loop() + asyncio.set_event_loop(self.loop) + + def tearDown(self): + self.loop.run_until_complete( + self.loop.shutdown_default_executor()) + self.loop.close() + asyncio.set_event_loop(None) + self.loop = None + super().tearDown() + + def test_to_thread(self): + async def main(): + return await asyncio.to_thread(sum, [40, 2]) + + result = self.loop.run_until_complete(main()) + self.assertEqual(result, 42) + + def test_to_thread_exception(self): + def raise_runtime(): + raise RuntimeError("test") + + async def main(): + await asyncio.to_thread(raise_runtime) + + with self.assertRaisesRegex(RuntimeError, "test"): + self.loop.run_until_complete(main()) + + def test_to_thread_once(self): + func = mock.Mock() + + async def main(): + await asyncio.to_thread(func) + + self.loop.run_until_complete(main()) + func.assert_called_once() + + def test_to_thread_concurrent(self): + func = mock.Mock() + + async def main(): + futs = [] + for _ in range(10): + fut = asyncio.to_thread(func) + futs.append(fut) + await asyncio.gather(*futs) + + self.loop.run_until_complete(main()) + self.assertEqual(func.call_count, 10) + + def test_to_thread_args_kwargs(self): + # Unlike run_in_executor(), to_thread() should directly accept kwargs. + func = mock.Mock() + + async def main(): + await asyncio.to_thread(func, 'test', something=True) + + self.loop.run_until_complete(main()) + func.assert_called_once_with('test', something=True) + + def test_to_thread_contextvars(self): + test_ctx = ContextVar('test_ctx') + + def get_ctx(): + return test_ctx.get() + + async def main(): + test_ctx.set('parrot') + return await asyncio.to_thread(get_ctx) + + result = self.loop.run_until_complete(main()) + self.assertEqual(result, 'parrot') + + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py index 5487b7afef832644737e07bde3606d1d93564c49..10bd46dea1991d9b8310a691c39a39945ba4eaf6 100644 --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -15,6 +15,7 @@ import unittest from unittest import mock from test import support +from test.support import socket_helper if sys.platform == 'win32': raise unittest.SkipTest('UNIX only') @@ -273,7 +274,7 @@ def setUp(self): self.loop = asyncio.SelectorEventLoop() self.set_event_loop(self.loop) - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_create_unix_server_existing_path_sock(self): with test_utils.unix_socket_path() as path: sock = socket.socket(socket.AF_UNIX) @@ -286,7 +287,7 @@ def test_create_unix_server_existing_path_sock(self): srv.close() self.loop.run_until_complete(srv.wait_closed()) - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_create_unix_server_pathlib(self): with test_utils.unix_socket_path() as path: path = pathlib.Path(path) @@ -344,7 +345,7 @@ def test_create_unix_server_path_dgram(self): @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'), 'no socket.SOCK_NONBLOCK (linux only)') - @support.skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_create_unix_server_path_stream_bittype(self): sock = socket.socket( socket.AF_UNIX, socket.SOCK_STREAM | socket.SOCK_NONBLOCK) @@ -497,12 +498,12 @@ def run_loop(self, coro): def prepare(self): sock = self.make_socket() proto = self.MyProto(self.loop) - port = support.find_unused_port() + port = socket_helper.find_unused_port() srv_sock = self.make_socket(cleanup=False) - srv_sock.bind((support.HOST, port)) + srv_sock.bind((socket_helper.HOST, port)) server = self.run_loop(self.loop.create_server( lambda: proto, sock=srv_sock)) - self.run_loop(self.loop.sock_connect(sock, (support.HOST, port))) + self.run_loop(self.loop.sock_connect(sock, (socket_helper.HOST, port))) self.run_loop(proto._ready) def cleanup(): diff --git a/Lib/test/test_asyncio/test_windows_events.py b/Lib/test/test_asyncio/test_windows_events.py index 6b005702c9be73465283d56fa9d9eadc36e954d3..f276cd205a2f8e9de5fb2b69522f200b31214044 100644 --- a/Lib/test/test_asyncio/test_windows_events.py +++ b/Lib/test/test_asyncio/test_windows_events.py @@ -211,6 +211,34 @@ def test_wait_for_handle_cancel(self): fut.cancel() fut.cancel() + def test_read_self_pipe_restart(self): + # Regression test for https://bugs.python.org/issue39010 + # Previously, restarting a proactor event loop in certain states + # would lead to spurious ConnectionResetErrors being logged. + self.loop.call_exception_handler = mock.Mock() + # Start an operation in another thread so that the self-pipe is used. + # This is theoretically timing-dependent (the task in the executor + # must complete before our start/stop cycles), but in practice it + # seems to work every time. + f = self.loop.run_in_executor(None, lambda: None) + self.loop.stop() + self.loop.run_forever() + self.loop.stop() + self.loop.run_forever() + + # Shut everything down cleanly. This is an important part of the + # test - in issue 39010, the error occurred during loop.close(), + # so we want to close the loop during the test instead of leaving + # it for tearDown. + # + # First wait for f to complete to avoid a "future's result was never + # retrieved" error. + self.loop.run_until_complete(f) + # Now shut down the loop itself (self.close_loop also shuts down the + # loop's default executor). + self.close_loop(self.loop) + self.assertFalse(self.loop.call_exception_handler.called) + class WinPolicyTests(test_utils.TestCase): diff --git a/Lib/test/test_asyncio/utils.py b/Lib/test/test_asyncio/utils.py index 5b4bb123a9ec45e6d99ea9722b3a42ebd218cf3c..804db9166fe7f8568f871341e32da09b0a5342de 100644 --- a/Lib/test/test_asyncio/utils.py +++ b/Lib/test/test_asyncio/utils.py @@ -107,7 +107,7 @@ async def once(): gen.close() -def run_until(loop, pred, timeout=30): +def run_until(loop, pred, timeout=support.SHORT_TIMEOUT): deadline = time.monotonic() + timeout while not pred(): if timeout is not None: @@ -139,7 +139,7 @@ def log_message(self, format, *args): class SilentWSGIServer(WSGIServer): - request_timeout = 2 + request_timeout = support.LOOPBACK_TIMEOUT def get_request(self): request, client_addr = super().get_request() @@ -220,7 +220,7 @@ def server_bind(self): class UnixWSGIServer(UnixHTTPServer, WSGIServer): - request_timeout = 2 + request_timeout = support.LOOPBACK_TIMEOUT def server_bind(self): UnixHTTPServer.server_bind(self) @@ -509,9 +509,11 @@ def get_function_source(func): class TestCase(unittest.TestCase): @staticmethod def close_loop(loop): - executor = loop._default_executor - if executor is not None: - executor.shutdown(wait=True) + if loop._default_executor is not None: + if not loop.is_closed(): + loop.run_until_complete(loop.shutdown_default_executor()) + else: + loop._default_executor.shutdown(wait=True) loop.close() policy = support.maybe_get_event_loop_policy() if policy is not None: diff --git a/Lib/test/test_asyncore.py b/Lib/test/test_asyncore.py index 3fcedb58ec18a62ba3b97cc1768e87cb668135bd..3c3abe4191788d946dd750ed2c61d9f96c88f4dd 100644 --- a/Lib/test/test_asyncore.py +++ b/Lib/test/test_asyncore.py @@ -10,13 +10,13 @@ import threading from test import support +from test.support import socket_helper from io import BytesIO if support.PGO: raise unittest.SkipTest("test is not helpful for PGO") -TIMEOUT = 3 HAS_UNIX_SOCKETS = hasattr(socket, 'AF_UNIX') class dummysocket: @@ -92,7 +92,7 @@ def bind_af_aware(sock, addr): if HAS_UNIX_SOCKETS and sock.family == socket.AF_UNIX: # Make sure the path doesn't exist. support.unlink(addr) - support.bind_unix_socket(sock, addr) + socket_helper.bind_unix_socket(sock, addr) else: sock.bind(addr) @@ -328,7 +328,7 @@ def test_send(self): evt = threading.Event() sock = socket.socket() sock.settimeout(3) - port = support.bind_port(sock) + port = socket_helper.bind_port(sock) cap = BytesIO() args = (evt, cap, sock) @@ -342,7 +342,7 @@ def test_send(self): data = b"Suppose there isn't a 16-ton weight?" d = dispatcherwithsend_noread() d.create_socket() - d.connect((support.HOST, port)) + d.connect((socket_helper.HOST, port)) # give time for socket to connect time.sleep(0.1) @@ -360,7 +360,7 @@ def test_send(self): self.assertEqual(cap.getvalue(), data*2) finally: - support.join_thread(t, timeout=TIMEOUT) + support.join_thread(t) @unittest.skipUnless(hasattr(asyncore, 'file_wrapper'), @@ -788,16 +788,16 @@ def test_quick_connect(self): except OSError: pass finally: - support.join_thread(t, timeout=TIMEOUT) + support.join_thread(t) class TestAPI_UseIPv4Sockets(BaseTestAPI): family = socket.AF_INET - addr = (support.HOST, 0) + addr = (socket_helper.HOST, 0) -@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 support required') +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 support required') class TestAPI_UseIPv6Sockets(BaseTestAPI): family = socket.AF_INET6 - addr = (support.HOSTv6, 0) + addr = (socket_helper.HOSTv6, 0) @unittest.skipUnless(HAS_UNIX_SOCKETS, 'Unix sockets required') class TestAPI_UseUnixSockets(BaseTestAPI): diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py index 7dba6635d4eae7bffa79d41c66d96298b0d837bf..1dbeac41dc0dd19caf695d9addcc4d438379ae71 100644 --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -18,14 +18,6 @@ def check_type_errors(self, f): int_data = memoryview(b"1234").cast('I') self.assertRaises(TypeError, f, int_data) - def test_encodestring_warns(self): - with self.assertWarns(DeprecationWarning): - base64.encodestring(b"www.python.org") - - def test_decodestring_warns(self): - with self.assertWarns(DeprecationWarning): - base64.decodestring(b"d3d3LnB5dGhvbi5vcmc=\n") - def test_encodebytes(self): eq = self.assertEqual eq(base64.encodebytes(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=\n") diff --git a/Lib/test/test_bigaddrspace.py b/Lib/test/test_bigaddrspace.py index b639f68c2347bf72f0e7dff814e2d5b14843c2db..aa1f8ca75a98110b7b8adce36e05188513094fdc 100644 --- a/Lib/test/test_bigaddrspace.py +++ b/Lib/test/test_bigaddrspace.py @@ -55,7 +55,7 @@ def test_repeat(self): class StrTest(unittest.TestCase): - unicodesize = 2 if sys.maxunicode < 65536 else 4 + unicodesize = 4 @bigaddrspacetest def test_concat(self): diff --git a/Lib/test/test_binascii.py b/Lib/test/test_binascii.py index 08de5c9fc7cc39935498574daf20b95a171cc8e2..45327953a7701ad1741f54a7cd54b62527528d0f 100644 --- a/Lib/test/test_binascii.py +++ b/Lib/test/test_binascii.py @@ -4,6 +4,7 @@ import binascii import array import re +from test import support # Note: "*_hex" functions are aliases for "(un)hexlify" b2a_functions = ['b2a_base64', 'b2a_hex', 'b2a_hqx', 'b2a_qp', 'b2a_uu', @@ -36,6 +37,7 @@ def test_functions(self): self.assertTrue(hasattr(getattr(binascii, name), '__call__')) self.assertRaises(TypeError, getattr(binascii, name)) + @support.ignore_warnings(category=DeprecationWarning) def test_returned_value(self): # Limit to the minimum of all limits (b2a_uu) MAX_ALL = 45 @@ -179,6 +181,7 @@ def test_uu(self): with self.assertRaises(TypeError): binascii.b2a_uu(b"", True) + @support.ignore_warnings(category=DeprecationWarning) def test_crc_hqx(self): crc = binascii.crc_hqx(self.type2test(b"Test the CRC-32 of"), 0) crc = binascii.crc_hqx(self.type2test(b" this string."), crc) @@ -198,6 +201,7 @@ def test_crc32(self): self.assertRaises(TypeError, binascii.crc32) + @support.ignore_warnings(category=DeprecationWarning) def test_hqx(self): # Perform binhex4 style RLE-compression # Then calculate the hexbin4 binary-to-ASCII translation @@ -208,6 +212,7 @@ def test_hqx(self): res = binascii.rledecode_hqx(b) self.assertEqual(res, self.rawdata) + @support.ignore_warnings(category=DeprecationWarning) def test_rle(self): # test repetition with a repetition longer than the limit of 255 data = (b'a' * 100 + b'b' + b'c' * 300) @@ -354,6 +359,7 @@ def test_qp(self): self.assertEqual(b2a_qp(type2test(b'a.\n')), b'a.\n') self.assertEqual(b2a_qp(type2test(b'.a')[:-1]), b'=2E') + @support.ignore_warnings(category=DeprecationWarning) def test_empty_string(self): # A test for SF bug #1022953. Make sure SystemError is not raised. empty = self.type2test(b'') @@ -378,6 +384,7 @@ def test_unicode_b2a(self): # crc_hqx needs 2 arguments self.assertRaises(TypeError, binascii.crc_hqx, "test", 0) + @support.ignore_warnings(category=DeprecationWarning) def test_unicode_a2b(self): # Unicode strings are accepted by a2b_* functions. MAX_ALL = 45 @@ -416,6 +423,18 @@ def test_b2a_base64_newline(self): self.assertEqual(binascii.b2a_base64(b, newline=False), b'aGVsbG8=') + def test_deprecated_warnings(self): + with self.assertWarns(DeprecationWarning): + self.assertEqual(binascii.b2a_hqx(b'abc'), b'B@*M') + with self.assertWarns(DeprecationWarning): + self.assertEqual(binascii.a2b_hqx(b'B@*M'), (b'abc', 0)) + + with self.assertWarns(DeprecationWarning): + self.assertEqual(binascii.rlecode_hqx(b'a' * 10), b'a\x90\n') + + with self.assertWarns(DeprecationWarning): + self.assertEqual(binascii.rledecode_hqx(b'a\x90\n'), b'a' * 10) + class ArrayBinASCIITest(BinASCIITest): def type2test(self, s): diff --git a/Lib/test/test_binhex.py b/Lib/test/test_binhex.py index 2f3d53afbd1321345e6c26dfe4acd0fd3c890c89..9c9486e142a902e636d97eccd3fec3f1e4486e29 100644 --- a/Lib/test/test_binhex.py +++ b/Lib/test/test_binhex.py @@ -3,17 +3,20 @@ Uses the mechanism of the python binhex module Based on an original test by Roger E. Masse. """ -import binhex import unittest from test import support +with support.check_warnings(('', DeprecationWarning)): + binhex = support.import_fresh_module('binhex') + class BinHexTestCase(unittest.TestCase): def setUp(self): - self.fname1 = support.TESTFN + "1" - self.fname2 = support.TESTFN + "2" - self.fname3 = support.TESTFN + "very_long_filename__very_long_filename__very_long_filename__very_long_filename__" + # binhex supports only file names encodable to Latin1 + self.fname1 = support.TESTFN_ASCII + "1" + self.fname2 = support.TESTFN_ASCII + "2" + self.fname3 = support.TESTFN_ASCII + "very_long_filename__very_long_filename__very_long_filename__very_long_filename__" def tearDown(self): support.unlink(self.fname1) @@ -45,6 +48,18 @@ def test_binhex_error_on_long_filename(self): self.assertRaises(binhex.Error, binhex.binhex, self.fname3, self.fname2) + def test_binhex_line_endings(self): + # bpo-29566: Ensure the line endings are those for macOS 9 + with open(self.fname1, 'wb') as f: + f.write(self.DATA) + + binhex.binhex(self.fname1, self.fname2) + + with open(self.fname2, 'rb') as fp: + contents = fp.read() + + self.assertNotIn(b'\n', contents) + def test_main(): support.run_unittest(BinHexTestCase) diff --git a/Lib/test/test_buffer.py b/Lib/test/test_buffer.py index dcea2063215040445a80549ef89675553c559ff6..d440bcf7e0faa1faf7b00e9763d6a9f02d06a239 100644 --- a/Lib/test/test_buffer.py +++ b/Lib/test/test_buffer.py @@ -45,6 +45,11 @@ except ImportError: numpy_array = None +try: + import _testcapi +except ImportError: + _testcapi = None + SHORT_TEST = True @@ -966,8 +971,6 @@ def check_memoryview(m, expected_readonly=readonly): m.tobytes() # Releasing mm didn't release m def verify_getbuf(self, orig_ex, ex, req, sliced=False): - def simple_fmt(ex): - return ex.format == '' or ex.format == 'B' def match(req, flag): return ((req&flag) == flag) @@ -2525,7 +2528,7 @@ def f(): return 7 values = [INT(9), IDX(9), 2.2+3j, Decimal("-21.1"), 12.2, Fraction(5, 2), [1,2,3], {4,5,6}, {7:8}, (), (9,), - True, False, None, NotImplemented, + True, False, None, Ellipsis, b'a', b'abc', bytearray(b'a'), bytearray(b'abc'), 'a', 'abc', r'a', r'abc', f, lambda x: x] @@ -4418,6 +4421,13 @@ def test_issue_7385(self): x = ndarray([1,2,3], shape=[3], flags=ND_GETBUF_FAIL) self.assertRaises(BufferError, memoryview, x) + @support.cpython_only + def test_pybuffer_size_from_format(self): + # basic tests + for format in ('', 'ii', '3s'): + self.assertEqual(_testcapi.PyBuffer_SizeFromFormat(format), + struct.calcsize(format)) + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index 4a498262ba637952bcd549454613ccafdeef0406..d009f57e47e05a36f05800f66d09672d8292fb91 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -6,6 +6,7 @@ import collections import decimal import fractions +import gc import io import locale import os @@ -25,6 +26,7 @@ from textwrap import dedent from types import AsyncGeneratorType, FunctionType from operator import neg +from test import support from test.support import ( EnvironmentVarGuard, TESTFN, check_warnings, swap_attr, unlink, maybe_get_event_loop_policy) @@ -326,8 +328,8 @@ def test_compile(self): bom = b'\xef\xbb\xbf' compile(bom + b'print(1)\n', '', 'exec') compile(source='pass', filename='?', mode='exec') - compile(dont_inherit=0, filename='tmp', source='0', mode='eval') - compile('pass', '?', dont_inherit=1, mode='exec') + compile(dont_inherit=False, filename='tmp', source='0', mode='eval') + compile('pass', '?', dont_inherit=True, mode='exec') compile(memoryview(b"text"), "name", "exec") self.assertRaises(TypeError, compile) self.assertRaises(ValueError, compile, 'print(42)\n', '', 'badmode') @@ -831,6 +833,7 @@ def test_hash(self): self.assertEqual(hash('spam'), hash(b'spam')) hash((0,1,2,3)) def f(): pass + hash(f) self.assertRaises(TypeError, hash, []) self.assertRaises(TypeError, hash, {}) # Bug 1536021: Allow hash to return long objects @@ -1014,7 +1017,12 @@ def test_max(self): self.assertEqual(max(1, 2.0, 3), 3) self.assertEqual(max(1.0, 2, 3), 3) - self.assertRaises(TypeError, max) + with self.assertRaisesRegex( + TypeError, + 'max expected at least 1 argument, got 0' + ): + max() + self.assertRaises(TypeError, max, 42) self.assertRaises(ValueError, max, ()) class BadSeq: @@ -1068,7 +1076,12 @@ def test_min(self): self.assertEqual(min(1, 2.0, 3), 1) self.assertEqual(min(1.0, 2, 3), 1.0) - self.assertRaises(TypeError, min) + with self.assertRaisesRegex( + TypeError, + 'min expected at least 1 argument, got 0' + ): + min() + self.assertRaises(TypeError, min, 42) self.assertRaises(ValueError, min, ()) class BadSeq: @@ -1457,6 +1470,24 @@ def test_sum(self): self.assertEqual(sum(range(10), 1000), 1045) self.assertEqual(sum(range(10), start=1000), 1045) + self.assertEqual(sum(range(10), 2**31-5), 2**31+40) + self.assertEqual(sum(range(10), 2**63-5), 2**63+40) + + self.assertEqual(sum(i % 2 != 0 for i in range(10)), 5) + self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**31-3), + 2**31+2) + self.assertEqual(sum((i % 2 != 0 for i in range(10)), 2**63-3), + 2**63+2) + self.assertIs(sum([], False), False) + + self.assertEqual(sum(i / 2 for i in range(10)), 22.5) + self.assertEqual(sum((i / 2 for i in range(10)), 1000), 1022.5) + self.assertEqual(sum((i / 2 for i in range(10)), 1000.25), 1022.75) + self.assertEqual(sum([0.5, 1]), 1.5) + self.assertEqual(sum([1, 0.5]), 1.5) + self.assertEqual(repr(sum([-0.0])), '0.0') + self.assertEqual(repr(sum([-0.0], -0.0)), '-0.0') + self.assertEqual(repr(sum([], -0.0)), '-0.0') self.assertRaises(TypeError, sum) self.assertRaises(TypeError, sum, 42) @@ -1468,6 +1499,9 @@ def test_sum(self): self.assertRaises(TypeError, sum, [[1], [2], [3]]) self.assertRaises(TypeError, sum, [{2:3}]) self.assertRaises(TypeError, sum, [{2:3}]*2, {2:3}) + self.assertRaises(TypeError, sum, [], '') + self.assertRaises(TypeError, sum, [], b'') + self.assertRaises(TypeError, sum, [], bytearray()) class BadSeq: def __getitem__(self, index): @@ -1573,6 +1607,18 @@ def __iter__(self): self.assertIs(cm.exception, exception) + @support.cpython_only + def test_zip_result_gc(self): + # bpo-42536: zip's tuple-reuse speed trick breaks the GC's assumptions + # about what can be untracked. Make sure we re-track result tuples + # whenever we reuse them. + it = zip([[]]) + gc.collect() + # That GC collection probably untracked the recycled internal result + # tuple, which is initialized to (None,). Make sure it's re-tracked when + # it's mutated and returned from __next__: + self.assertTrue(gc.is_tracked(next(it))) + def test_format(self): # Test the basic machinery of the format() builtin. Don't test # the specifics of the various formatters @@ -1700,6 +1746,20 @@ def test_construct_singletons(self): self.assertRaises(TypeError, tp, 1, 2) self.assertRaises(TypeError, tp, a=1, b=2) + def test_warning_notimplemented(self): + # Issue #35712: NotImplemented is a sentinel value that should never + # be evaluated in a boolean context (virtually all such use cases + # are a result of accidental misuse implementing rich comparison + # operations in terms of one another). + # For the time being, it will continue to evaluate as truthy, but + # issue a deprecation warning (with the eventual intent to make it + # a TypeError). + self.assertWarns(DeprecationWarning, bool, NotImplemented) + with self.assertWarns(DeprecationWarning): + self.assertTrue(NotImplemented) + with self.assertWarns(DeprecationWarning): + self.assertFalse(not NotImplemented) + class TestBreakpoint(unittest.TestCase): def setUp(self): @@ -1834,6 +1894,7 @@ def _run_child(self, child, terminal_input): os.close(w) self.skipTest("pty.fork() raised {}".format(e)) raise + if pid == 0: # Child try: @@ -1847,9 +1908,11 @@ def _run_child(self, child, terminal_input): finally: # We don't want to return to unittest... os._exit(0) + # Parent os.close(w) os.write(fd, terminal_input) + # Get results from the pipe with open(r, "r") as rpipe: lines = [] @@ -1859,6 +1922,7 @@ def _run_child(self, child, terminal_input): # The other end was closed => the child exited break lines.append(line) + # Check the result was got and corresponds to the user's terminal input if len(lines) != 2: # Something went wrong, try to get at stderr @@ -1881,8 +1945,7 @@ def _run_child(self, child, terminal_input): # completion, otherwise the child process hangs on AIX. os.close(fd) - # Wait until the child process completes - os.waitpid(pid, 0) + support.wait_process(pid, exitcode=0) return lines @@ -1954,7 +2017,7 @@ def test_basic(self): self.assertEqual(data, sorted(copy, key=lambda x: -x)) self.assertNotEqual(data, copy) random.shuffle(copy) - self.assertEqual(data, sorted(copy, reverse=1)) + self.assertEqual(data, sorted(copy, reverse=True)) self.assertNotEqual(data, copy) def test_bad_arguments(self): diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index bbd45c75298e72ac0427a4a284673ae21c38a520..05568f2c6797193d642563ec90e2a7250c1297c5 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -12,12 +12,14 @@ import functools import pickle import tempfile +import textwrap import unittest import test.support import test.string_tests import test.list_tests from test.support import bigaddrspacetest, MAX_Py_ssize_t +from test.support.script_helper import assert_python_failure if sys.flags.bytes_warning: @@ -315,6 +317,62 @@ def test_decode(self): # Default encoding is utf-8 self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603') + def test_check_encoding_errors(self): + # bpo-37388: bytes(str) and bytes.encode() must check encoding + # and errors arguments in dev mode + invalid = 'Boom, Shaka Laka, Boom!' + encodings = ('ascii', 'utf8', 'latin1') + code = textwrap.dedent(f''' + import sys + type2test = {self.type2test.__name__} + encodings = {encodings!r} + + for data in ('', 'short string'): + try: + type2test(data, encoding={invalid!r}) + except LookupError: + pass + else: + sys.exit(21) + + for encoding in encodings: + try: + type2test(data, encoding=encoding, errors={invalid!r}) + except LookupError: + pass + else: + sys.exit(22) + + for data in (b'', b'short string'): + data = type2test(data) + print(repr(data)) + try: + data.decode(encoding={invalid!r}) + except LookupError: + sys.exit(10) + else: + sys.exit(23) + + try: + data.decode(errors={invalid!r}) + except LookupError: + pass + else: + sys.exit(24) + + for encoding in encodings: + try: + data.decode(encoding=encoding, errors={invalid!r}) + except LookupError: + pass + else: + sys.exit(25) + + sys.exit(10) + ''') + proc = assert_python_failure('-X', 'dev', '-c', code) + self.assertEqual(proc.rc, 10, proc) + def test_from_int(self): b = self.type2test(0) self.assertEqual(b, self.type2test()) @@ -489,9 +547,13 @@ def test_join(self): self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd") self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd") # Stress it with many items - seq = [b"abc"] * 1000 - expected = b"abc" + b".:abc" * 999 + seq = [b"abc"] * 100000 + expected = b"abc" + b".:abc" * 99999 self.assertEqual(dot_join(seq), expected) + # Stress test with empty separator + seq = [b"abc"] * 100000 + expected = b"abc" * 100000 + self.assertEqual(self.type2test(b"").join(seq), expected) self.assertRaises(TypeError, self.type2test(b" ").join, None) # Error handling and cleanup when some item in the middle of the # sequence has the wrong type. @@ -904,6 +966,15 @@ def test_translate(self): c = b.translate(None, delete=b'e') self.assertEqual(c, b'hllo') + def test_sq_item(self): + _testcapi = test.support.import_module('_testcapi') + obj = self.type2test((42,)) + with self.assertRaises(IndexError): + _testcapi.sequence_getitem(obj, -2) + with self.assertRaises(IndexError): + _testcapi.sequence_getitem(obj, 1) + self.assertEqual(_testcapi.sequence_getitem(obj, 0), 42) + class BytesTest(BaseBytesTest, unittest.TestCase): type2test = bytes @@ -963,6 +1034,7 @@ def test_from_format(self): c_char_p) PyBytes_FromFormat = pythonapi.PyBytes_FromFormat + PyBytes_FromFormat.argtypes = (c_char_p,) PyBytes_FromFormat.restype = py_object # basic tests diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py index 2591f0a6ac40e1c35b8b7c88dc473a03a74410e3..1fce9d82d25d6a2933a66ef6c26bae23795cdbaa 100644 --- a/Lib/test/test_bz2.py +++ b/Lib/test/test_bz2.py @@ -100,6 +100,9 @@ def testBadArgs(self): self.assertRaises(ValueError, BZ2File, os.devnull, compresslevel=0) self.assertRaises(ValueError, BZ2File, os.devnull, compresslevel=10) + # compresslevel is keyword-only + self.assertRaises(TypeError, BZ2File, os.devnull, "r", 3) + def testRead(self): self.createTempFile() with BZ2File(self.filename) as bz2f: @@ -707,7 +710,7 @@ def testEOFError(self): def testDecompress4G(self, size): # "Test BZ2Decompressor.decompress() with >4GiB input" blocksize = 10 * 1024 * 1024 - block = random.getrandbits(blocksize * 8).to_bytes(blocksize, 'little') + block = random.randbytes(blocksize) try: data = block * (size // blocksize + 1) compressed = bz2.compress(data) diff --git a/Lib/test/test_c_locale_coercion.py b/Lib/test/test_c_locale_coercion.py index fb599b0fcb7a58e3a229b2d2b3380b9248b68238..fcc85992345dbc80abef7783887c923af896be98 100644 --- a/Lib/test/test_c_locale_coercion.py +++ b/Lib/test/test_c_locale_coercion.py @@ -49,6 +49,10 @@ # TODO: Work out a robust dynamic test for this that doesn't rely on # CPython's own locale handling machinery EXPECT_COERCION_IN_DEFAULT_LOCALE = False +elif sys.platform == "vxworks": + # VxWorks defaults to using UTF-8 for all system interfaces + EXPECTED_C_LOCALE_STREAM_ENCODING = "utf-8" + EXPECTED_C_LOCALE_FS_ENCODING = "utf-8" # Note that the above expectations are still wrong in some cases, such as: # * Windows when PYTHONLEGACYWINDOWSFSENCODING is set @@ -403,7 +407,10 @@ def test_PYTHONCOERCECLOCALE_set_to_one(self): # skip the test if the LC_CTYPE locale is C or coerced old_loc = locale.setlocale(locale.LC_CTYPE, None) self.addCleanup(locale.setlocale, locale.LC_CTYPE, old_loc) - loc = locale.setlocale(locale.LC_CTYPE, "") + try: + loc = locale.setlocale(locale.LC_CTYPE, "") + except locale.Error as e: + self.skipTest(str(e)) if loc == "C": self.skipTest("test requires LC_CTYPE locale different than C") if loc in TARGET_LOCALES : diff --git a/Lib/test/test_call.py b/Lib/test/test_call.py index 0bff7ded4670f1c79b1690285f5ad28c0b20bbc1..451a7170c304dec91f45983b51991051453e2dbc 100644 --- a/Lib/test/test_call.py +++ b/Lib/test/test_call.py @@ -1,4 +1,3 @@ -import datetime import unittest from test.support import cpython_only try: @@ -27,125 +26,6 @@ def fn(**kw): self.assertEqual(list(res.items()), expected) -# The test cases here cover several paths through the function calling -# code. They depend on the METH_XXX flag that is used to define a C -# function, which can't be verified from Python. If the METH_XXX decl -# for a C function changes, these tests may not cover the right paths. - -class CFunctionCalls(unittest.TestCase): - - def test_varargs0(self): - self.assertRaises(TypeError, {}.__contains__) - - def test_varargs1(self): - {}.__contains__(0) - - def test_varargs2(self): - self.assertRaises(TypeError, {}.__contains__, 0, 1) - - def test_varargs0_ext(self): - try: - {}.__contains__(*()) - except TypeError: - pass - - def test_varargs1_ext(self): - {}.__contains__(*(0,)) - - def test_varargs2_ext(self): - try: - {}.__contains__(*(1, 2)) - except TypeError: - pass - else: - raise RuntimeError - - def test_varargs1_kw(self): - self.assertRaises(TypeError, {}.__contains__, x=2) - - def test_varargs2_kw(self): - self.assertRaises(TypeError, {}.__contains__, x=2, y=2) - - def test_oldargs0_0(self): - {}.keys() - - def test_oldargs0_1(self): - self.assertRaises(TypeError, {}.keys, 0) - - def test_oldargs0_2(self): - self.assertRaises(TypeError, {}.keys, 0, 1) - - def test_oldargs0_0_ext(self): - {}.keys(*()) - - def test_oldargs0_1_ext(self): - try: - {}.keys(*(0,)) - except TypeError: - pass - else: - raise RuntimeError - - def test_oldargs0_2_ext(self): - try: - {}.keys(*(1, 2)) - except TypeError: - pass - else: - raise RuntimeError - - def test_oldargs0_0_kw(self): - try: - {}.keys(x=2) - except TypeError: - pass - else: - raise RuntimeError - - def test_oldargs0_1_kw(self): - self.assertRaises(TypeError, {}.keys, x=2) - - def test_oldargs0_2_kw(self): - self.assertRaises(TypeError, {}.keys, x=2, y=2) - - def test_oldargs1_0(self): - self.assertRaises(TypeError, [].count) - - def test_oldargs1_1(self): - [].count(1) - - def test_oldargs1_2(self): - self.assertRaises(TypeError, [].count, 1, 2) - - def test_oldargs1_0_ext(self): - try: - [].count(*()) - except TypeError: - pass - else: - raise RuntimeError - - def test_oldargs1_1_ext(self): - [].count(*(1,)) - - def test_oldargs1_2_ext(self): - try: - [].count(*(1, 2)) - except TypeError: - pass - else: - raise RuntimeError - - def test_oldargs1_0_kw(self): - self.assertRaises(TypeError, [].count, x=2) - - def test_oldargs1_1_kw(self): - self.assertRaises(TypeError, [].count, {}, x=2) - - def test_oldargs1_2_kw(self): - self.assertRaises(TypeError, [].count, x=2, y=2) - - @cpython_only class CFunctionCallsErrorMessages(unittest.TestCase): @@ -193,7 +73,7 @@ def test_varargs3_kw(self): self.assertRaisesRegex(TypeError, msg, bool, x=2) def test_varargs4_kw(self): - msg = r"^index\(\) takes no keyword arguments$" + msg = r"^list[.]index\(\) takes no keyword arguments$" self.assertRaisesRegex(TypeError, msg, [].index, x=2) def test_varargs5_kw(self): @@ -209,19 +89,19 @@ def test_varargs7_kw(self): self.assertRaisesRegex(TypeError, msg, next, x=2) def test_varargs8_kw(self): - msg = r"^pack\(\) takes no keyword arguments$" + msg = r"^_struct[.]pack\(\) takes no keyword arguments$" self.assertRaisesRegex(TypeError, msg, struct.pack, x=2) def test_varargs9_kw(self): - msg = r"^pack_into\(\) takes no keyword arguments$" + msg = r"^_struct[.]pack_into\(\) takes no keyword arguments$" self.assertRaisesRegex(TypeError, msg, struct.pack_into, x=2) def test_varargs10_kw(self): - msg = r"^index\(\) takes no keyword arguments$" + msg = r"^deque[.]index\(\) takes no keyword arguments$" self.assertRaisesRegex(TypeError, msg, collections.deque().index, x=2) def test_varargs11_kw(self): - msg = r"^pack\(\) takes no keyword arguments$" + msg = r"^Struct[.]pack\(\) takes no keyword arguments$" self.assertRaisesRegex(TypeError, msg, struct.Struct.pack, struct.Struct(""), x=2) def test_varargs12_kw(self): @@ -289,6 +169,176 @@ def test_oldargs1_2_kw(self): self.assertRaisesRegex(TypeError, msg, [].count, x=2, y=2) + +class TestCallingConventions(unittest.TestCase): + """Test calling using various C calling conventions (METH_*) from Python + + Subclasses test several kinds of functions (module-level, methods, + class methods static methods) using these attributes: + obj: the object that contains tested functions (as attributes) + expected_self: expected "self" argument to the C function + + The base class tests module-level functions. + """ + + def setUp(self): + self.obj = self.expected_self = _testcapi + + def test_varargs(self): + self.assertEqual( + self.obj.meth_varargs(1, 2, 3), + (self.expected_self, (1, 2, 3)), + ) + + def test_varargs_ext(self): + self.assertEqual( + self.obj.meth_varargs(*(1, 2, 3)), + (self.expected_self, (1, 2, 3)), + ) + + def test_varargs_error_kw(self): + msg = r"meth_varargs\(\) takes no keyword arguments" + self.assertRaisesRegex( + TypeError, msg, lambda: self.obj.meth_varargs(k=1), + ) + + def test_varargs_keywords(self): + self.assertEqual( + self.obj.meth_varargs_keywords(1, 2, a=3, b=4), + (self.expected_self, (1, 2), {'a': 3, 'b': 4}) + ) + + def test_varargs_keywords_ext(self): + self.assertEqual( + self.obj.meth_varargs_keywords(*[1, 2], **{'a': 3, 'b': 4}), + (self.expected_self, (1, 2), {'a': 3, 'b': 4}) + ) + + def test_o(self): + self.assertEqual(self.obj.meth_o(1), (self.expected_self, 1)) + + def test_o_ext(self): + self.assertEqual(self.obj.meth_o(*[1]), (self.expected_self, 1)) + + def test_o_error_no_arg(self): + msg = r"meth_o\(\) takes exactly one argument \(0 given\)" + self.assertRaisesRegex(TypeError, msg, self.obj.meth_o) + + def test_o_error_two_args(self): + msg = r"meth_o\(\) takes exactly one argument \(2 given\)" + self.assertRaisesRegex( + TypeError, msg, lambda: self.obj.meth_o(1, 2), + ) + + def test_o_error_ext(self): + msg = r"meth_o\(\) takes exactly one argument \(3 given\)" + self.assertRaisesRegex( + TypeError, msg, lambda: self.obj.meth_o(*(1, 2, 3)), + ) + + def test_o_error_kw(self): + msg = r"meth_o\(\) takes no keyword arguments" + self.assertRaisesRegex( + TypeError, msg, lambda: self.obj.meth_o(k=1), + ) + + def test_o_error_arg_kw(self): + msg = r"meth_o\(\) takes no keyword arguments" + self.assertRaisesRegex( + TypeError, msg, lambda: self.obj.meth_o(k=1), + ) + + def test_noargs(self): + self.assertEqual(self.obj.meth_noargs(), self.expected_self) + + def test_noargs_ext(self): + self.assertEqual(self.obj.meth_noargs(*[]), self.expected_self) + + def test_noargs_error_arg(self): + msg = r"meth_noargs\(\) takes no arguments \(1 given\)" + self.assertRaisesRegex( + TypeError, msg, lambda: self.obj.meth_noargs(1), + ) + + def test_noargs_error_arg2(self): + msg = r"meth_noargs\(\) takes no arguments \(2 given\)" + self.assertRaisesRegex( + TypeError, msg, lambda: self.obj.meth_noargs(1, 2), + ) + + def test_noargs_error_ext(self): + msg = r"meth_noargs\(\) takes no arguments \(3 given\)" + self.assertRaisesRegex( + TypeError, msg, lambda: self.obj.meth_noargs(*(1, 2, 3)), + ) + + def test_noargs_error_kw(self): + msg = r"meth_noargs\(\) takes no keyword arguments" + self.assertRaisesRegex( + TypeError, msg, lambda: self.obj.meth_noargs(k=1), + ) + + def test_fastcall(self): + self.assertEqual( + self.obj.meth_fastcall(1, 2, 3), + (self.expected_self, (1, 2, 3)), + ) + + def test_fastcall_ext(self): + self.assertEqual( + self.obj.meth_fastcall(*(1, 2, 3)), + (self.expected_self, (1, 2, 3)), + ) + + def test_fastcall_error_kw(self): + msg = r"meth_fastcall\(\) takes no keyword arguments" + self.assertRaisesRegex( + TypeError, msg, lambda: self.obj.meth_fastcall(k=1), + ) + + def test_fastcall_keywords(self): + self.assertEqual( + self.obj.meth_fastcall_keywords(1, 2, a=3, b=4), + (self.expected_self, (1, 2), {'a': 3, 'b': 4}) + ) + + def test_fastcall_keywords_ext(self): + self.assertEqual( + self.obj.meth_fastcall_keywords(*(1, 2), **{'a': 3, 'b': 4}), + (self.expected_self, (1, 2), {'a': 3, 'b': 4}) + ) + + +class TestCallingConventionsInstance(TestCallingConventions): + """Test calling instance methods using various calling conventions""" + + def setUp(self): + self.obj = self.expected_self = _testcapi.MethInstance() + + +class TestCallingConventionsClass(TestCallingConventions): + """Test calling class methods using various calling conventions""" + + def setUp(self): + self.obj = self.expected_self = _testcapi.MethClass + + +class TestCallingConventionsClassInstance(TestCallingConventions): + """Test calling class methods on instance""" + + def setUp(self): + self.obj = _testcapi.MethClass() + self.expected_self = _testcapi.MethClass + + +class TestCallingConventionsStatic(TestCallingConventions): + """Test calling static methods using various calling conventions""" + + def setUp(self): + self.obj = _testcapi.MethStatic() + self.expected_self = None + + def pyfunc(arg1, arg2): return [arg1, arg2] @@ -315,14 +365,14 @@ def static_method(): PYTHON_INSTANCE = PythonClass() +NULL_OR_EMPTY = object() -IGNORE_RESULT = object() - - -@cpython_only class FastCallTests(unittest.TestCase): + """Test calling using various callables from C + """ + # Test calls with positional arguments - CALLS_POSARGS = ( + CALLS_POSARGS = [ # (func, args: tuple, result) # Python function with 2 arguments @@ -341,31 +391,11 @@ class FastCallTests(unittest.TestCase): (PYTHON_INSTANCE.class_method, (), "classmethod"), (PYTHON_INSTANCE.static_method, (), "staticmethod"), - # C function: METH_NOARGS - (globals, (), IGNORE_RESULT), - - # C function: METH_O - (id, ("hello",), IGNORE_RESULT), - - # C function: METH_VARARGS - (dir, (1,), IGNORE_RESULT), - - # C function: METH_VARARGS | METH_KEYWORDS - (min, (5, 9), 5), - - # C function: METH_FASTCALL - (divmod, (1000, 33), (30, 10)), - - # C type static method: METH_FASTCALL | METH_CLASS - (int.from_bytes, (b'\x01\x00', 'little'), 1), - - # bpo-30524: Test that calling a C type static method with no argument - # doesn't crash (ignore the result): METH_FASTCALL | METH_CLASS - (datetime.datetime.now, (), IGNORE_RESULT), - ) + # C callables are added later + ] # Test calls with positional and keyword arguments - CALLS_KWARGS = ( + CALLS_KWARGS = [ # (func, args: tuple, kwargs: dict, result) # Python function with 2 arguments @@ -376,17 +406,51 @@ class FastCallTests(unittest.TestCase): (PYTHON_INSTANCE.method, (1,), {'arg2': 2}, [1, 2]), (PYTHON_INSTANCE.method, (), {'arg1': 1, 'arg2': 2}, [1, 2]), - # C function: METH_VARARGS | METH_KEYWORDS - (max, ([],), {'default': 9}, 9), - - # C type static method: METH_FASTCALL | METH_CLASS - (int.from_bytes, (b'\x01\x00',), {'byteorder': 'little'}, 1), - (int.from_bytes, (), {'bytes': b'\x01\x00', 'byteorder': 'little'}, 1), - ) + # C callables are added later + ] + + # Add all the calling conventions and variants of C callables + _instance = _testcapi.MethInstance() + for obj, expected_self in ( + (_testcapi, _testcapi), # module-level function + (_instance, _instance), # bound method + (_testcapi.MethClass, _testcapi.MethClass), # class method on class + (_testcapi.MethClass(), _testcapi.MethClass), # class method on inst. + (_testcapi.MethStatic, None), # static method + ): + CALLS_POSARGS.extend([ + (obj.meth_varargs, (1, 2), (expected_self, (1, 2))), + (obj.meth_varargs_keywords, + (1, 2), (expected_self, (1, 2), NULL_OR_EMPTY)), + (obj.meth_fastcall, (1, 2), (expected_self, (1, 2))), + (obj.meth_fastcall, (), (expected_self, ())), + (obj.meth_fastcall_keywords, + (1, 2), (expected_self, (1, 2), NULL_OR_EMPTY)), + (obj.meth_fastcall_keywords, + (), (expected_self, (), NULL_OR_EMPTY)), + (obj.meth_noargs, (), expected_self), + (obj.meth_o, (123, ), (expected_self, 123)), + ]) + + CALLS_KWARGS.extend([ + (obj.meth_varargs_keywords, + (1, 2), {'x': 'y'}, (expected_self, (1, 2), {'x': 'y'})), + (obj.meth_varargs_keywords, + (), {'x': 'y'}, (expected_self, (), {'x': 'y'})), + (obj.meth_varargs_keywords, + (1, 2), {}, (expected_self, (1, 2), NULL_OR_EMPTY)), + (obj.meth_fastcall_keywords, + (1, 2), {'x': 'y'}, (expected_self, (1, 2), {'x': 'y'})), + (obj.meth_fastcall_keywords, + (), {'x': 'y'}, (expected_self, (), {'x': 'y'})), + (obj.meth_fastcall_keywords, + (1, 2), {}, (expected_self, (1, 2), NULL_OR_EMPTY)), + ]) def check_result(self, result, expected): - if expected is IGNORE_RESULT: - return + if isinstance(expected, tuple) and expected[-1] is NULL_OR_EMPTY: + if result[-1] in ({}, None): + expected = (*expected[:-1], result[-1]) self.assertEqual(result, expected) def test_fastcall(self): @@ -403,7 +467,7 @@ def test_fastcall(self): self.check_result(result, expected) def test_vectorcall_dict(self): - # Test _PyObject_FastCallDict() + # Test PyObject_VectorcallDict() for func, args, expected in self.CALLS_POSARGS: with self.subTest(func=func, args=args): @@ -411,26 +475,18 @@ def test_vectorcall_dict(self): result = _testcapi.pyobject_fastcalldict(func, args, None) self.check_result(result, expected) - # kwargs={} - result = _testcapi.pyobject_fastcalldict(func, args, {}) - self.check_result(result, expected) - if not args: # args=NULL, nargs=0, kwargs=NULL result = _testcapi.pyobject_fastcalldict(func, None, None) self.check_result(result, expected) - # args=NULL, nargs=0, kwargs={} - result = _testcapi.pyobject_fastcalldict(func, None, {}) - self.check_result(result, expected) - for func, args, kwargs, expected in self.CALLS_KWARGS: with self.subTest(func=func, args=args, kwargs=kwargs): result = _testcapi.pyobject_fastcalldict(func, args, kwargs) self.check_result(result, expected) def test_vectorcall(self): - # Test _PyObject_Vectorcall() + # Test PyObject_Vectorcall() for func, args, expected in self.CALLS_POSARGS: with self.subTest(func=func, args=args): @@ -537,7 +593,7 @@ def test_vectorcall(self): # 1. vectorcall using PyVectorcall_Call() # (only for objects that support vectorcall directly) # 2. normal call - # 3. vectorcall using _PyObject_Vectorcall() + # 3. vectorcall using PyObject_Vectorcall() # 4. call as bound method # 5. call using functools.partial diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 754712701874d873522279c2cfa0a3dcc2b8ad56..5150d5770f6644cbd16a1b1305cbf978c422a0be 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -12,6 +12,9 @@ import threading import time import unittest +import weakref +import importlib.machinery +import importlib.util from test import support from test.support import MISSING_C_DOCSTRINGS from test.support.script_helper import assert_python_failure, assert_python_ok @@ -23,6 +26,8 @@ # Skip this test if the _testcapi module isn't available. _testcapi = support.import_module('_testcapi') +import _testinternalcapi + # Were we compiled --with-pydebug or with #define Py_DEBUG? Py_DEBUG = hasattr(sys, 'gettotalrefcount') @@ -60,8 +65,12 @@ def test_no_FatalError_infinite_loop(self): self.assertEqual(out, b'') # This used to cause an infinite loop. self.assertTrue(err.rstrip().startswith( - b'Fatal Python error:' - b' PyThreadState_Get: no current thread')) + b'Fatal Python error: ' + b'PyThreadState_Get: ' + b'the function must be called with the GIL held, ' + b'but the GIL is released ' + b'(the current Python thread state is NULL)'), + err) def test_memoryview_from_NULL_pointer(self): self.assertRaises(ValueError, _testcapi.make_memoryview_from_NULL_pointer) @@ -96,7 +105,7 @@ class Z(object): def __len__(self): return 1 self.assertRaises(TypeError, _posixsubprocess.fork_exec, - 1,Z(),3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17) + 1,Z(),3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21) # Issue #15736: overflow in _PySequence_BytesToCharpArray() class Z(object): def __len__(self): @@ -104,7 +113,7 @@ def __len__(self): def __getitem__(self, i): return b'x' self.assertRaises(MemoryError, _posixsubprocess.fork_exec, - 1,Z(),3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17) + 1,Z(),3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21) @unittest.skipUnless(_posixsubprocess, '_posixsubprocess required for this test.') def test_subprocess_fork_exec(self): @@ -114,7 +123,7 @@ def __len__(self): # Issue #15738: crash in subprocess_fork_exec() self.assertRaises(TypeError, _posixsubprocess.fork_exec, - Z(),[b'1'],3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17) + Z(),[b'1'],3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21) @unittest.skipIf(MISSING_C_DOCSTRINGS, "Signature information for builtins requires docstrings") @@ -196,7 +205,8 @@ def test_return_null_without_error(self): """) rc, out, err = assert_python_failure('-c', code) self.assertRegex(err.replace(b'\r', b''), - br'Fatal Python error: a function returned NULL ' + br'Fatal Python error: _Py_CheckFunctionResult: ' + br'a function returned NULL ' br'without setting an error\n' br'Python runtime state: initialized\n' br'SystemError: 1: + self.assertEqual(fs.getvalue(key), expect_val) + else: + self.assertEqual(fs.getvalue(key), expect_val[0]) + def test_log(self): cgi.log("Testing") diff --git a/Lib/test/test_cgitb.py b/Lib/test/test_cgitb.py index e299ec3ec6ceb59331703412ff62f9f4ceea5a3a..bab152d8554563d05bef5da6fb326d62680ecb1f 100644 --- a/Lib/test/test_cgitb.py +++ b/Lib/test/test_cgitb.py @@ -31,7 +31,7 @@ def test_html(self): def test_text(self): try: raise ValueError("Hello World") - except ValueError as err: + except ValueError: text = cgitb.text(sys.exc_info()) self.assertIn("ValueError", text) self.assertIn("Hello World", text) @@ -41,8 +41,9 @@ def test_syshook_no_logdir_default_format(self): rc, out, err = assert_python_failure( '-c', ('import cgitb; cgitb.enable(logdir=%s); ' - 'raise ValueError("Hello World")') % repr(tracedir)) - out = out.decode(sys.getfilesystemencoding()) + 'raise ValueError("Hello World")') % repr(tracedir), + PYTHONIOENCODING='utf-8') + out = out.decode() self.assertIn("ValueError", out) self.assertIn("Hello World", out) self.assertIn("<module>", out) @@ -56,8 +57,9 @@ def test_syshook_no_logdir_text_format(self): rc, out, err = assert_python_failure( '-c', ('import cgitb; cgitb.enable(format="text", logdir=%s); ' - 'raise ValueError("Hello World")') % repr(tracedir)) - out = out.decode(sys.getfilesystemencoding()) + 'raise ValueError("Hello World")') % repr(tracedir), + PYTHONIOENCODING='utf-8') + out = out.decode() self.assertIn("ValueError", out) self.assertIn("Hello World", out) self.assertNotIn('

    ', out) diff --git a/Lib/test/test_check_c_globals.py b/Lib/test/test_check_c_globals.py new file mode 100644 index 0000000000000000000000000000000000000000..030debc452e40924c3640d218f4e6121f116e3f0 --- /dev/null +++ b/Lib/test/test_check_c_globals.py @@ -0,0 +1,24 @@ +import unittest +import test.test_tools + +test.test_tools.skip_if_missing('c-analyzer') +with test.test_tools.imports_under_tool('c-analyzer'): + from cpython.__main__ import main + + +class ActualChecks(unittest.TestCase): + + # XXX Also run the check in "make check". + #@unittest.expectedFailure + # Failing on one of the buildbots (see https://bugs.python.org/issue36876). + @unittest.skip('activate this once all the globals have been resolved') + def test_check_c_globals(self): + try: + main('check', {}) + except NotImplementedError: + raise unittest.SkipTest('not supported on this host') + + +if __name__ == '__main__': + # Test needs to be a package, so we can do relative imports. + unittest.main() diff --git a/Lib/test/test_class.py b/Lib/test/test_class.py index 456f1be30be04628409163fe7057744294bec7c4..7524f58a3ce732a789f513947fea65837477475a 100644 --- a/Lib/test/test_class.py +++ b/Lib/test/test_class.py @@ -529,7 +529,7 @@ class I: # In debug mode, printed XXX undetected error and # raises AttributeError I() - except AttributeError as x: + except AttributeError: pass else: self.fail("attribute error for I.__init__ got masked") diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py index 244c5fecd3491562e723b653e772660df62b6eff..9989b148afbd75fba4596a212a724e2931a384ac 100644 --- a/Lib/test/test_clinic.py +++ b/Lib/test/test_clinic.py @@ -2,7 +2,7 @@ # Copyright 2012-2013 by Larry Hastings. # Licensed to the PSF under a contributor agreement. -from test import support +from test import support, test_tools from unittest import TestCase import collections import inspect @@ -10,17 +10,10 @@ import sys import unittest - -clinic_path = os.path.join(os.path.dirname(__file__), '..', '..', 'Tools', 'clinic') -clinic_path = os.path.normpath(clinic_path) -if not os.path.exists(clinic_path): - raise unittest.SkipTest(f'{clinic_path!r} path does not exist') -sys.path.append(clinic_path) -try: +test_tools.skip_if_missing('clinic') +with test_tools.imports_under_tool('clinic'): import clinic from clinic import DSLParser -finally: - del sys.path[-1] class FakeConverter: @@ -801,17 +794,29 @@ class ClinicExternalTest(TestCase): maxDiff = None def test_external(self): + # bpo-42398: Test that the destination file is left unchanged if the + # content does not change. Moreover, check also that the file + # modification time does not change in this case. source = support.findfile('clinic.test') with open(source, 'r', encoding='utf-8') as f: - original = f.read() - with support.temp_dir() as testdir: - testfile = os.path.join(testdir, 'clinic.test.c') + orig_contents = f.read() + + with support.temp_dir() as tmp_dir: + testfile = os.path.join(tmp_dir, 'clinic.test.c') with open(testfile, 'w', encoding='utf-8') as f: - f.write(original) - clinic.parse_file(testfile, force=True) + f.write(orig_contents) + old_mtime_ns = os.stat(testfile).st_mtime_ns + + clinic.parse_file(testfile) + with open(testfile, 'r', encoding='utf-8') as f: - result = f.read() - self.assertEqual(result, original) + new_contents = f.read() + new_mtime_ns = os.stat(testfile).st_mtime_ns + + self.assertEqual(new_contents, orig_contents) + # Don't change the file modification time + # if the content does not change + self.assertEqual(new_mtime_ns, old_mtime_ns) if __name__ == "__main__": diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index 5fc5bff6603e22e757b0d0eb9816ed7da286a21c..051c092eb6c3984076f8e889309e1130cf71c7bf 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -6,6 +6,7 @@ import subprocess import sys import tempfile +import textwrap import unittest from test import support from test.support.script_helper import ( @@ -44,7 +45,11 @@ def test_site_flag(self): def test_usage(self): rc, out, err = assert_python_ok('-h') - self.assertIn(b'usage', out) + lines = out.splitlines() + self.assertIn(b'usage', lines[0]) + # The first line contains the program name, + # but the rest should be ASCII-only + b''.join(lines[1:]).decode('ascii') def test_version(self): version = ('Python %d.%d' % sys.version_info[:2]).encode("ascii") @@ -219,6 +224,21 @@ def check_output(text): ) check_output(text) + def test_non_interactive_output_buffering(self): + code = textwrap.dedent(""" + import sys + out = sys.stdout + print(out.isatty(), out.write_through, out.line_buffering) + err = sys.stderr + print(err.isatty(), err.write_through, err.line_buffering) + """) + args = [sys.executable, '-c', code] + proc = subprocess.run(args, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, text=True, check=True) + self.assertEqual(proc.stdout, + 'False False False\n' + 'False False True\n') + def test_unbuffered_output(self): # Test expected operation of the '-u' switch for stream in ('stdout', 'stderr'): @@ -332,10 +352,10 @@ def test_output_newline(self): if sys.platform == 'win32': self.assertEqual(b'1\r\n2\r\n', out) - self.assertEqual(b'3\r\n4', err) + self.assertEqual(b'3\r\n4\r\n', err) else: self.assertEqual(b'1\n2\n', out) - self.assertEqual(b'3\n4', err) + self.assertEqual(b'3\n4\n', err) def test_unmached_quote(self): # Issue #10206: python program starting with unmatched quote @@ -391,7 +411,7 @@ def preexec(): stderr=subprocess.PIPE, preexec_fn=preexec) out, err = p.communicate() - self.assertEqual(support.strip_python_stderr(err), b'') + self.assertEqual(err, b'') self.assertEqual(p.returncode, 42) def test_no_stdin(self): diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py index f0bd013e55367240e117a30872bcb7ca0e0ecae0..7a3707d0f112fabfa6a1cbff3d3f71f03da1778b 100644 --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -143,7 +143,7 @@ def _check_import_error(self, script_exec_args, expected_msg, *run_args, __isolated=False, __cwd=cwd, **env_vars ) if verbose > 1: - print('Output from test script %r:' % script_exec_args) + print(f'Output from test script {script_exec_args!r:}') print(repr(err)) print('Expected output: %r' % expected_msg) self.assertIn(expected_msg.encode('utf-8'), err) @@ -217,6 +217,19 @@ def test_basic_script(self): with support.temp_dir() as script_dir: script_name = _make_test_script(script_dir, 'script') self._check_script(script_name, script_name, script_name, + script_dir, None, + importlib.machinery.SourceFileLoader, + expected_cwd=script_dir) + + def test_script_abspath(self): + # pass the script using the relative path, expect the absolute path + # in __file__ + with support.temp_cwd() as script_dir: + self.assertTrue(os.path.isabs(script_dir), script_dir) + + script_name = _make_test_script(script_dir, 'script') + relative_name = os.path.basename(script_name) + self._check_script(relative_name, script_name, relative_name, script_dir, None, importlib.machinery.SourceFileLoader) @@ -486,6 +499,16 @@ def test_dash_m_bad_pyc(self): self.assertNotIn(b'is a package', err) self.assertNotIn(b'Traceback', err) + def test_hint_when_triying_to_import_a_py_file(self): + with support.temp_dir() as script_dir, \ + support.change_cwd(path=script_dir): + # Create invalid *.pyc as empty file + with open('asyncio.py', 'wb'): + pass + err = self.check_dash_m_failure('asyncio.py') + self.assertIn(b"Try using 'asyncio' instead " + b"of 'asyncio.py' as the module name", err) + def test_dash_m_init_traceback(self): # These were wrapped in an ImportError and tracebacks were # suppressed; see Issue 14285 @@ -523,7 +546,7 @@ def test_pep_409_verbiage(self): script_name = _make_test_script(script_dir, 'script', script) exitcode, stdout, stderr = assert_python_failure(script_name) text = stderr.decode('ascii').split('\n') - self.assertEqual(len(text), 4) + self.assertEqual(len(text), 5) self.assertTrue(text[0].startswith('Traceback')) self.assertTrue(text[1].startswith(' File ')) self.assertTrue(text[3].startswith('NameError')) @@ -542,7 +565,7 @@ def test_non_ascii(self): # Issue #16218 source = 'print(ascii(__file__))\n' - script_name = _make_test_script(os.curdir, name, source) + script_name = _make_test_script(os.getcwd(), name, source) self.addCleanup(support.unlink, script_name) rc, stdout, stderr = assert_python_ok(script_name) self.assertEqual( @@ -567,7 +590,7 @@ def test_issue20500_exit_with_exception_value(self): script_name = _make_test_script(script_dir, 'script', script) exitcode, stdout, stderr = assert_python_failure(script_name) text = stderr.decode('ascii') - self.assertEqual(text, "some text") + self.assertEqual(text.rstrip(), "some text") def test_syntaxerror_unindented_caret_position(self): script = "1 + 1 = 2\n" @@ -609,14 +632,14 @@ def test_syntaxerror_multi_line_fstring(self): self.assertEqual( stderr.splitlines()[-3:], [ - b' foo = f"""{}', + b' foo"""', b' ^', b'SyntaxError: f-string: empty expression not allowed', ], ) def test_syntaxerror_invalid_escape_sequence_multi_line(self): - script = 'foo = """\\q\n"""\n' + script = 'foo = """\\q"""\n' with support.temp_dir() as script_dir: script_name = _make_test_script(script_dir, 'script', script) exitcode, stdout, stderr = assert_python_failure( @@ -624,10 +647,9 @@ def test_syntaxerror_invalid_escape_sequence_multi_line(self): ) self.assertEqual( stderr.splitlines()[-3:], - [ - b' foo = """\\q', + [ b' foo = """\\q"""', b' ^', - b'SyntaxError: invalid escape sequence \\q', + b'SyntaxError: invalid escape sequence \\q' ], ) @@ -702,7 +724,7 @@ def test_consistent_sys_path_for_module_execution(self): def test_nonexisting_script(self): # bpo-34783: "./python script.py" must not crash # if the script file doesn't exist. - # (Skip test for macOS framework builds because sys.excutable name + # (Skip test for macOS framework builds because sys.executable name # is not the actual Python executable file name. script = 'nonexistingscript.py' self.assertFalse(os.path.exists(script)) diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index 0d80af44d9f1ffb6b8af1bed54b1c797b4ca919d..ac3dde745603db733501fcc1ad27e0b44e28d427 100644 --- a/Lib/test/test_code.py +++ b/Lib/test/test_code.py @@ -130,7 +130,6 @@ import threading import unittest import weakref -import opcode try: import ctypes except ImportError: @@ -241,7 +240,7 @@ def func(): def func2(): y = 2 return y - code2 = func.__code__ + code2 = func2.__code__ for attr, value in ( ("co_argcount", 0), @@ -434,42 +433,6 @@ def run(self): tt.join() self.assertEqual(LAST_FREED, 500) - @cpython_only - def test_clean_stack_on_return(self): - - def f(x): - return x - - code = f.__code__ - ct = type(f.__code__) - - # Insert an extra LOAD_FAST, this duplicates the value of - # 'x' in the stack, leaking it if the frame is not properly - # cleaned up upon exit. - - bytecode = list(code.co_code) - bytecode.insert(-2, opcode.opmap['LOAD_FAST']) - bytecode.insert(-2, 0) - - c = ct(code.co_argcount, code.co_posonlyargcount, - code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize+1, - code.co_flags, bytes(bytecode), - code.co_consts, code.co_names, code.co_varnames, - code.co_filename, code.co_name, code.co_firstlineno, - code.co_lnotab, code.co_freevars, code.co_cellvars) - new_function = type(f)(c, f.__globals__, 'nf', f.__defaults__, f.__closure__) - - class Var: - pass - the_object = Var() - var = weakref.ref(the_object) - - new_function(the_object) - - # Check if the_object is leaked - del the_object - assert var() is None - def test_main(verbose=None): from test import test_code diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 0fd258ca8abf6fe20afd6984c4d2cb5e34deeeee..8d112a171d7c4ef5f2138ff398d2b5270b3cccee 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -11,7 +11,7 @@ try: import _testcapi -except ImportError as exc: +except ImportError: _testcapi = None try: @@ -2183,6 +2183,18 @@ def test_decode_with_int2str_map(self): ("", len(allbytes)) ) + self.assertRaisesRegex(TypeError, + "character mapping must be in range\\(0x110000\\)", + codecs.charmap_decode, + b"\x00\x01\x02", "strict", {0: "A", 1: 'Bb', 2: -2} + ) + + self.assertRaisesRegex(TypeError, + "character mapping must be in range\\(0x110000\\)", + codecs.charmap_decode, + b"\x00\x01\x02", "strict", {0: "A", 1: 'Bb', 2: 999999999} + ) + def test_decode_with_int2int_map(self): a = ord('a') b = ord('b') diff --git a/Lib/test/test_codeop.py b/Lib/test/test_codeop.py index 1e57ab9d51e2c4026c4c1c45ded15baf2e661e0e..66caf5aaae32b978beaf4f820bc648406bfc8786 100644 --- a/Lib/test/test_codeop.py +++ b/Lib/test/test_codeop.py @@ -2,14 +2,15 @@ Test cases for codeop.py Nick Mathewson """ +import sys import unittest +import warnings from test import support from codeop import compile_command, PyCF_DONT_IMPLY_DEDENT import io if support.is_jython: - import sys def unify_callables(d): for n,v in d.items(): @@ -288,6 +289,15 @@ def test_invalid(self): ai("[i for i in range(10)] = (1, 2, 3)") + def test_invalid_exec(self): + ai = self.assertInvalid + ai("raise = 4", symbol="exec") + ai('def a-b', symbol='exec') + ai('await?', symbol='exec') + ai('=!=', symbol='exec') + ai('a await raise b', symbol='exec') + ai('a await raise b?+1', symbol='exec') + def test_filename(self): self.assertEqual(compile_command("a = 1\n", "abc").co_filename, compile("a = 1\n", "abc", 'single').co_filename) @@ -296,9 +306,18 @@ def test_filename(self): def test_warning(self): # Test that the warning is only returned once. - with support.check_warnings((".*literal", SyntaxWarning)) as w: - compile_command("0 is 0") - self.assertEqual(len(w.warnings), 1) + with support.check_warnings( + (".*literal", SyntaxWarning), + (".*invalid", DeprecationWarning), + ) as w: + compile_command(r"'\e' is 0") + self.assertEqual(len(w.warnings), 2) + + # bpo-41520: check SyntaxWarning treated as an SyntaxError + with warnings.catch_warnings(), self.assertRaises(SyntaxError): + warnings.simplefilter('error', SyntaxWarning) + compile_command('1 is 1', symbol='exec') + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 58f65f3e266c67256de9fd22922754452bc89e22..3ff660cf7a37be31c19790a47f9311de7cab6827 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -195,6 +195,22 @@ def test_order_preservation(self): ('e', 55), ('f', 666), ('g', 777), ('h', 88888), ('i', 9999), ('j', 0)]) + def test_iter_not_calling_getitem_on_maps(self): + class DictWithGetItem(UserDict): + def __init__(self, *args, **kwds): + self.called = False + UserDict.__init__(self, *args, **kwds) + def __getitem__(self, item): + self.called = True + UserDict.__getitem__(self, item) + + d = DictWithGetItem(a=1) + c = ChainMap(d) + d.called = False + + set(c) # iterate over chain map + self.assertFalse(d.called, '__getitem__ was called') + def test_dict_coercion(self): d = ChainMap(dict(a=1, b=2), dict(b=20, c=30)) self.assertEqual(dict(d), dict(a=1, b=2, c=30)) @@ -232,6 +248,52 @@ def __contains__(self, key): for k, v in dict(a=1, B=20, C=30, z=100).items(): # check get self.assertEqual(d.get(k, 100), v) + def test_union_operators(self): + cm1 = ChainMap(dict(a=1, b=2), dict(c=3, d=4)) + cm2 = ChainMap(dict(a=10, e=5), dict(b=20, d=4)) + cm3 = cm1.copy() + d = dict(a=10, c=30) + pairs = [('c', 3), ('p',0)] + + tmp = cm1 | cm2 # testing between chainmaps + self.assertEqual(tmp.maps, [cm1.maps[0] | dict(cm2), *cm1.maps[1:]]) + cm1 |= cm2 + self.assertEqual(tmp, cm1) + + tmp = cm2 | d # testing between chainmap and mapping + self.assertEqual(tmp.maps, [cm2.maps[0] | d, *cm2.maps[1:]]) + self.assertEqual((d | cm2).maps, [d | dict(cm2)]) + cm2 |= d + self.assertEqual(tmp, cm2) + + # testing behavior between chainmap and iterable key-value pairs + with self.assertRaises(TypeError): + cm3 | pairs + tmp = cm3.copy() + cm3 |= pairs + self.assertEqual(cm3.maps, [tmp.maps[0] | dict(pairs), *tmp.maps[1:]]) + + # testing proper return types for ChainMap and it's subclasses + class Subclass(ChainMap): + pass + + class SubclassRor(ChainMap): + def __ror__(self, other): + return super().__ror__(other) + + tmp = ChainMap() | ChainMap() + self.assertIs(type(tmp), ChainMap) + self.assertIs(type(tmp.maps[0]), dict) + tmp = ChainMap() | Subclass() + self.assertIs(type(tmp), ChainMap) + self.assertIs(type(tmp.maps[0]), dict) + tmp = Subclass() | ChainMap() + self.assertIs(type(tmp), Subclass) + self.assertIs(type(tmp.maps[0]), dict) + tmp = ChainMap() | SubclassRor() + self.assertIs(type(tmp), SubclassRor) + self.assertIs(type(tmp.maps[0]), dict) + ################################################################################ ### Named Tuples @@ -365,6 +427,18 @@ def test_field_doc_reuse(self): self.assertIs(P.m.__doc__, Q.o.__doc__) self.assertIs(P.n.__doc__, Q.p.__doc__) + @support.cpython_only + def test_field_repr(self): + Point = namedtuple('Point', 'x y') + self.assertEqual(repr(Point.x), "_tuplegetter(0, 'Alias for field number 0')") + self.assertEqual(repr(Point.y), "_tuplegetter(1, 'Alias for field number 1')") + + Point.x.__doc__ = 'The x-coordinate' + Point.y.__doc__ = 'The y-coordinate' + + self.assertEqual(repr(Point.x), "_tuplegetter(0, 'The x-coordinate')") + self.assertEqual(repr(Point.y), "_tuplegetter(1, 'The y-coordinate')") + def test_name_fixer(self): for spec, renamed in [ [('efg', 'g%hi'), ('efg', '_1')], # field with non-alpha char @@ -424,8 +498,8 @@ def test_tupleness(self): self.assertIsInstance(p, tuple) self.assertEqual(p, (11, 22)) # matches a real tuple - self.assertEqual(tuple(p), (11, 22)) # coercable to a real tuple - self.assertEqual(list(p), [11, 22]) # coercable to a list + self.assertEqual(tuple(p), (11, 22)) # coercible to a real tuple + self.assertEqual(list(p), [11, 22]) # coercible to a list self.assertEqual(max(p), 22) # iterable self.assertEqual(max(*p), 22) # star-able x, y = p @@ -606,6 +680,11 @@ class NewPoint(tuple): self.assertEqual(np.x, 1) self.assertEqual(np.y, 2) + def test_new_builtins_issue_43102(self): + self.assertEqual( + namedtuple('C', ()).__new__.__globals__['__builtins__'], + {}) + ################################################################################ ### Abstract Base Classes @@ -1472,9 +1551,6 @@ def __lt__(self, x): def test_issue26915(self): # Container membership test should check identity first - class CustomEqualObject: - def __eq__(self, other): - return False class CustomSequence(Sequence): def __init__(self, seq): self._seq = seq @@ -1484,7 +1560,7 @@ def __len__(self): return len(self._seq) nan = float('nan') - obj = CustomEqualObject() + obj = support.NEVER_EQ seq = CustomSequence([nan, obj, nan]) containers = [ seq, @@ -1503,6 +1579,62 @@ def assertSameSet(self, s1, s2): # coerce both to a real set then check equality self.assertSetEqual(set(s1), set(s2)) + def test_Set_from_iterable(self): + """Verify _from_iterable overriden to an instance method works.""" + class SetUsingInstanceFromIterable(MutableSet): + def __init__(self, values, created_by): + if not created_by: + raise ValueError(f'created_by must be specified') + self.created_by = created_by + self._values = set(values) + + def _from_iterable(self, values): + return type(self)(values, 'from_iterable') + + def __contains__(self, value): + return value in self._values + + def __iter__(self): + yield from self._values + + def __len__(self): + return len(self._values) + + def add(self, value): + self._values.add(value) + + def discard(self, value): + self._values.discard(value) + + impl = SetUsingInstanceFromIterable([1, 2, 3], 'test') + + actual = impl - {1} + self.assertIsInstance(actual, SetUsingInstanceFromIterable) + self.assertEqual('from_iterable', actual.created_by) + self.assertEqual({2, 3}, actual) + + actual = impl | {4} + self.assertIsInstance(actual, SetUsingInstanceFromIterable) + self.assertEqual('from_iterable', actual.created_by) + self.assertEqual({1, 2, 3, 4}, actual) + + actual = impl & {2} + self.assertIsInstance(actual, SetUsingInstanceFromIterable) + self.assertEqual('from_iterable', actual.created_by) + self.assertEqual({2}, actual) + + actual = impl ^ {3, 4} + self.assertIsInstance(actual, SetUsingInstanceFromIterable) + self.assertEqual('from_iterable', actual.created_by) + self.assertEqual({1, 2, 4}, actual) + + # NOTE: ixor'ing with a list is important here: internally, __ixor__ + # only calls _from_iterable if the other value isn't already a Set. + impl ^= [3, 4] + self.assertIsInstance(impl, SetUsingInstanceFromIterable) + self.assertEqual('test', impl.created_by) + self.assertEqual({1, 2, 4}, impl) + def test_Set_interoperability_with_real_sets(self): # Issue: 8743 class ListSet(Set): @@ -2067,6 +2199,29 @@ def test_multiset_operations(self): set_result = setop(set(p.elements()), set(q.elements())) self.assertEqual(counter_result, dict.fromkeys(set_result, 1)) + def test_subset_superset_not_implemented(self): + # Verify that multiset comparison operations are not implemented. + + # These operations were intentionally omitted because multiset + # comparison semantics conflict with existing dict equality semantics. + + # For multisets, we would expect that if p<=q and p>=q are both true, + # then p==q. However, dict equality semantics require that p!=q when + # one of sets contains an element with a zero count and the other + # doesn't. + + p = Counter(a=1, b=0) + q = Counter(a=1, c=0) + self.assertNotEqual(p, q) + with self.assertRaises(TypeError): + p < q + with self.assertRaises(TypeError): + p <= q + with self.assertRaises(TypeError): + p > q + with self.assertRaises(TypeError): + p >= q + def test_inplace_operations(self): elements = 'abcd' for i in range(1000): diff --git a/Lib/test/test_compare.py b/Lib/test/test_compare.py index 471c8dae767a5c7e4df74f06840d750b62383ac0..2b3faed7965bc1a23805df530fcd85e761a789d4 100644 --- a/Lib/test/test_compare.py +++ b/Lib/test/test_compare.py @@ -1,4 +1,5 @@ import unittest +from test.support import ALWAYS_EQ class Empty: def __repr__(self): @@ -14,13 +15,6 @@ def __repr__(self): def __eq__(self, other): return self.arg == other -class Anything: - def __eq__(self, other): - return True - - def __ne__(self, other): - return False - class ComparisonTest(unittest.TestCase): set1 = [2, 2.0, 2, 2+0j, Cmp(2.0)] set2 = [[1], (3,), None, Empty()] @@ -113,11 +107,11 @@ class C: def test_issue_1393(self): x = lambda: None - self.assertEqual(x, Anything()) - self.assertEqual(Anything(), x) + self.assertEqual(x, ALWAYS_EQ) + self.assertEqual(ALWAYS_EQ, x) y = object() - self.assertEqual(y, Anything()) - self.assertEqual(Anything(), y) + self.assertEqual(y, ALWAYS_EQ) + self.assertEqual(ALWAYS_EQ, y) if __name__ == '__main__': diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 566ca27fca893da74b8f678479b9a8ca0a98ccb5..55716fd4b96c3cfe01466619a6e18ef36c8ed280 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -750,6 +750,16 @@ def continue_in_while(): self.assertEqual(None, opcodes[0].argval) self.assertEqual('RETURN_VALUE', opcodes[1].opname) + def test_big_dict_literal(self): + # The compiler has a flushing point in "compiler_dict" that calls compiles + # a portion of the dictionary literal when the loop that iterates over the items + # reaches 0xFFFF elements but the code was not including the boundary element, + # dropping the key at position 0xFFFF. See bpo-41531 for more information + + dict_size = 0xFFFF + 1 + the_dict = "{" + ",".join(f"{x}:{x}" for x in range(dict_size)) + "}" + self.assertEqual(len(eval(the_dict)), dict_size) + class TestExpressionStackSize(unittest.TestCase): # These tests check that the computed stack size for a code object # stays within reasonable bounds (see issue #21523 for an example diff --git a/Lib/test/test_compileall.py b/Lib/test/test_compileall.py index 64f092b53b5000808a537fea99696c04c4a59fa4..3bbc6817f8d56e011775dc0e3d7f291b57de083f 100644 --- a/Lib/test/test_compileall.py +++ b/Lib/test/test_compileall.py @@ -1,16 +1,19 @@ -import sys import compileall +import contextlib +import filecmp import importlib.util -import test.test_importlib.util +import io +import itertools import os import pathlib import py_compile import shutil import struct +import sys import tempfile +import test.test_importlib.util import time import unittest -import io from unittest import mock, skipUnless try: @@ -26,6 +29,24 @@ from .test_py_compile import SourceDateEpochTestMeta +def get_pyc(script, opt): + if not opt: + # Replace None and 0 with '' + opt = '' + return importlib.util.cache_from_source(script, optimization=opt) + + +def get_pycs(script): + return [get_pyc(script, opt) for opt in (0, 1, 2)] + + +def is_hardlink(filename1, filename2): + """Returns True if two files have the same inode (hardlink)""" + inode1 = os.stat(filename1).st_ino + inode2 = os.stat(filename2).st_ino + return inode1 == inode2 + + class CompileallTestsBase: def setUp(self): @@ -194,6 +215,172 @@ def test_compile_missing_multiprocessing(self, compile_file_mock): compileall.compile_dir(self.directory, quiet=True, workers=5) self.assertTrue(compile_file_mock.called) + def test_compile_dir_maxlevels(self): + # Test the actual impact of maxlevels parameter + depth = 3 + path = self.directory + for i in range(1, depth + 1): + path = os.path.join(path, f"dir_{i}") + source = os.path.join(path, 'script.py') + os.mkdir(path) + shutil.copyfile(self.source_path, source) + pyc_filename = importlib.util.cache_from_source(source) + + compileall.compile_dir(self.directory, quiet=True, maxlevels=depth - 1) + self.assertFalse(os.path.isfile(pyc_filename)) + + compileall.compile_dir(self.directory, quiet=True, maxlevels=depth) + self.assertTrue(os.path.isfile(pyc_filename)) + + def _test_ddir_only(self, *, ddir, parallel=True): + """Recursive compile_dir ddir must contain package paths; bpo39769.""" + fullpath = ["test", "foo"] + path = self.directory + mods = [] + for subdir in fullpath: + path = os.path.join(path, subdir) + os.mkdir(path) + script_helper.make_script(path, "__init__", "") + mods.append(script_helper.make_script(path, "mod", + "def fn(): 1/0\nfn()\n")) + compileall.compile_dir( + self.directory, quiet=True, ddir=ddir, + workers=2 if parallel else 1) + self.assertTrue(mods) + for mod in mods: + self.assertTrue(mod.startswith(self.directory), mod) + modcode = importlib.util.cache_from_source(mod) + modpath = mod[len(self.directory+os.sep):] + _, _, err = script_helper.assert_python_failure(modcode) + expected_in = os.path.join(ddir, modpath) + mod_code_obj = test.test_importlib.util.get_code_from_pyc(modcode) + self.assertEqual(mod_code_obj.co_filename, expected_in) + self.assertIn(f'"{expected_in}"', os.fsdecode(err)) + + def test_ddir_only_one_worker(self): + """Recursive compile_dir ddir= contains package paths; bpo39769.""" + return self._test_ddir_only(ddir="", parallel=False) + + def test_ddir_multiple_workers(self): + """Recursive compile_dir ddir= contains package paths; bpo39769.""" + return self._test_ddir_only(ddir="", parallel=True) + + def test_ddir_empty_only_one_worker(self): + """Recursive compile_dir ddir='' contains package paths; bpo39769.""" + return self._test_ddir_only(ddir="", parallel=False) + + def test_ddir_empty_multiple_workers(self): + """Recursive compile_dir ddir='' contains package paths; bpo39769.""" + return self._test_ddir_only(ddir="", parallel=True) + + def test_strip_only(self): + fullpath = ["test", "build", "real", "path"] + path = os.path.join(self.directory, *fullpath) + os.makedirs(path) + script = script_helper.make_script(path, "test", "1 / 0") + bc = importlib.util.cache_from_source(script) + stripdir = os.path.join(self.directory, *fullpath[:2]) + compileall.compile_dir(path, quiet=True, stripdir=stripdir) + rc, out, err = script_helper.assert_python_failure(bc) + expected_in = os.path.join(*fullpath[2:]) + self.assertIn( + expected_in, + str(err, encoding=sys.getdefaultencoding()) + ) + self.assertNotIn( + stripdir, + str(err, encoding=sys.getdefaultencoding()) + ) + + def test_prepend_only(self): + fullpath = ["test", "build", "real", "path"] + path = os.path.join(self.directory, *fullpath) + os.makedirs(path) + script = script_helper.make_script(path, "test", "1 / 0") + bc = importlib.util.cache_from_source(script) + prependdir = "/foo" + compileall.compile_dir(path, quiet=True, prependdir=prependdir) + rc, out, err = script_helper.assert_python_failure(bc) + expected_in = os.path.join(prependdir, self.directory, *fullpath) + self.assertIn( + expected_in, + str(err, encoding=sys.getdefaultencoding()) + ) + + def test_strip_and_prepend(self): + fullpath = ["test", "build", "real", "path"] + path = os.path.join(self.directory, *fullpath) + os.makedirs(path) + script = script_helper.make_script(path, "test", "1 / 0") + bc = importlib.util.cache_from_source(script) + stripdir = os.path.join(self.directory, *fullpath[:2]) + prependdir = "/foo" + compileall.compile_dir(path, quiet=True, + stripdir=stripdir, prependdir=prependdir) + rc, out, err = script_helper.assert_python_failure(bc) + expected_in = os.path.join(prependdir, *fullpath[2:]) + self.assertIn( + expected_in, + str(err, encoding=sys.getdefaultencoding()) + ) + self.assertNotIn( + stripdir, + str(err, encoding=sys.getdefaultencoding()) + ) + + def test_strip_prepend_and_ddir(self): + fullpath = ["test", "build", "real", "path", "ddir"] + path = os.path.join(self.directory, *fullpath) + os.makedirs(path) + script_helper.make_script(path, "test", "1 / 0") + with self.assertRaises(ValueError): + compileall.compile_dir(path, quiet=True, ddir="/bar", + stripdir="/foo", prependdir="/bar") + + def test_multiple_optimization_levels(self): + script = script_helper.make_script(self.directory, + "test_optimization", + "a = 0") + bc = [] + for opt_level in "", 1, 2, 3: + bc.append(importlib.util.cache_from_source(script, + optimization=opt_level)) + test_combinations = [[0, 1], [1, 2], [0, 2], [0, 1, 2]] + for opt_combination in test_combinations: + compileall.compile_file(script, quiet=True, + optimize=opt_combination) + for opt_level in opt_combination: + self.assertTrue(os.path.isfile(bc[opt_level])) + try: + os.unlink(bc[opt_level]) + except Exception: + pass + + @support.skip_unless_symlink + def test_ignore_symlink_destination(self): + # Create folders for allowed files, symlinks and prohibited area + allowed_path = os.path.join(self.directory, "test", "dir", "allowed") + symlinks_path = os.path.join(self.directory, "test", "dir", "symlinks") + prohibited_path = os.path.join(self.directory, "test", "dir", "prohibited") + os.makedirs(allowed_path) + os.makedirs(symlinks_path) + os.makedirs(prohibited_path) + + # Create scripts and symlinks and remember their byte-compiled versions + allowed_script = script_helper.make_script(allowed_path, "test_allowed", "a = 0") + prohibited_script = script_helper.make_script(prohibited_path, "test_prohibited", "a = 0") + allowed_symlink = os.path.join(symlinks_path, "test_allowed.py") + prohibited_symlink = os.path.join(symlinks_path, "test_prohibited.py") + os.symlink(allowed_script, allowed_symlink) + os.symlink(prohibited_script, prohibited_symlink) + allowed_bc = importlib.util.cache_from_source(allowed_symlink) + prohibited_bc = importlib.util.cache_from_source(prohibited_symlink) + + compileall.compile_dir(symlinks_path, quiet=True, limit_sl_dest=allowed_path) + + self.assertTrue(os.path.isfile(allowed_bc)) + self.assertFalse(os.path.isfile(prohibited_bc)) + class CompileallTestsWithSourceEpoch(CompileallTestsBase, unittest.TestCase, @@ -269,13 +456,15 @@ def _get_run_args(self, args): def assertRunOK(self, *args, **env_vars): rc, out, err = script_helper.assert_python_ok( - *self._get_run_args(args), **env_vars) + *self._get_run_args(args), **env_vars, + PYTHONIOENCODING='utf-8') self.assertEqual(b'', err) return out def assertRunNotOK(self, *args, **env_vars): rc, out, err = script_helper.assert_python_failure( - *self._get_run_args(args), **env_vars) + *self._get_run_args(args), **env_vars, + PYTHONIOENCODING='utf-8') return rc, out, err def assertCompiled(self, fn): @@ -436,6 +625,20 @@ def test_recursion_limit(self): self.assertCompiled(spamfn) self.assertCompiled(eggfn) + @support.skip_unless_symlink + def test_symlink_loop(self): + # Currently, compileall ignores symlinks to directories. + # If that limitation is ever lifted, it should protect against + # recursion in symlink loops. + pkg = os.path.join(self.pkgdir, 'spam') + script_helper.make_pkg(pkg) + os.symlink('.', os.path.join(pkg, 'evil')) + os.symlink('.', os.path.join(pkg, 'evil2')) + self.assertRunOK('-q', self.pkgdir) + self.assertCompiled(os.path.join( + self.pkgdir, 'spam', 'evil', 'evil2', '__init__.py' + )) + def test_quiet(self): noisy = self.assertRunOK(self.pkgdir) quiet = self.assertRunOK('-q', self.pkgdir) @@ -577,56 +780,109 @@ def test_workers_available_cores(self, compile_dir): self.assertTrue(compile_dir.called) self.assertEqual(compile_dir.call_args[-1]['workers'], 0) - def _test_ddir_only(self, *, ddir, parallel=True): - """Recursive compile_dir ddir must contain package paths; bpo39769.""" - fullpath = ["test", "foo"] - path = self.directory - mods = [] - for subdir in fullpath: - path = os.path.join(path, subdir) - os.mkdir(path) - script_helper.make_script(path, "__init__", "") - mods.append(script_helper.make_script(path, "mod", - "def fn(): 1/0\nfn()\n")) - compileall.compile_dir( - self.directory, quiet=True, ddir=ddir, - workers=2 if parallel else 1) - self.assertTrue(mods) - for mod in mods: - self.assertTrue(mod.startswith(self.directory), mod) - modcode = importlib.util.cache_from_source(mod) - modpath = mod[len(self.directory+os.sep):] - _, _, err = script_helper.assert_python_failure(modcode) - expected_in = os.path.join(ddir, modpath) - mod_code_obj = test.test_importlib.util._get_code_from_pyc(modcode) - self.assertEqual(mod_code_obj.co_filename, expected_in) - self.assertIn(f'"{expected_in}"', os.fsdecode(err)) - - def test_ddir_only_one_worker(self): - """Recursive compile_dir ddir= contains package paths; bpo39769.""" - return self._test_ddir_only(ddir="", parallel=False) - - def test_ddir_multiple_workers(self): - """Recursive compile_dir ddir= contains package paths; bpo39769.""" - return self._test_ddir_only(ddir="", parallel=True) - - def test_ddir_empty_only_one_worker(self): - """Recursive compile_dir ddir='' contains package paths; bpo39769.""" - return self._test_ddir_only(ddir="", parallel=False) - - def test_ddir_empty_multiple_workers(self): - """Recursive compile_dir ddir='' contains package paths; bpo39769.""" - return self._test_ddir_only(ddir="", parallel=True) - - -class CommmandLineTestsWithSourceEpoch(CommandLineTestsBase, + def test_strip_and_prepend(self): + fullpath = ["test", "build", "real", "path"] + path = os.path.join(self.directory, *fullpath) + os.makedirs(path) + script = script_helper.make_script(path, "test", "1 / 0") + bc = importlib.util.cache_from_source(script) + stripdir = os.path.join(self.directory, *fullpath[:2]) + prependdir = "/foo" + self.assertRunOK("-s", stripdir, "-p", prependdir, path) + rc, out, err = script_helper.assert_python_failure(bc) + expected_in = os.path.join(prependdir, *fullpath[2:]) + self.assertIn( + expected_in, + str(err, encoding=sys.getdefaultencoding()) + ) + self.assertNotIn( + stripdir, + str(err, encoding=sys.getdefaultencoding()) + ) + + def test_multiple_optimization_levels(self): + path = os.path.join(self.directory, "optimizations") + os.makedirs(path) + script = script_helper.make_script(path, + "test_optimization", + "a = 0") + bc = [] + for opt_level in "", 1, 2, 3: + bc.append(importlib.util.cache_from_source(script, + optimization=opt_level)) + test_combinations = [["0", "1"], + ["1", "2"], + ["0", "2"], + ["0", "1", "2"]] + for opt_combination in test_combinations: + self.assertRunOK(path, *("-o" + str(n) for n in opt_combination)) + for opt_level in opt_combination: + self.assertTrue(os.path.isfile(bc[int(opt_level)])) + try: + os.unlink(bc[opt_level]) + except Exception: + pass + + @support.skip_unless_symlink + def test_ignore_symlink_destination(self): + # Create folders for allowed files, symlinks and prohibited area + allowed_path = os.path.join(self.directory, "test", "dir", "allowed") + symlinks_path = os.path.join(self.directory, "test", "dir", "symlinks") + prohibited_path = os.path.join(self.directory, "test", "dir", "prohibited") + os.makedirs(allowed_path) + os.makedirs(symlinks_path) + os.makedirs(prohibited_path) + + # Create scripts and symlinks and remember their byte-compiled versions + allowed_script = script_helper.make_script(allowed_path, "test_allowed", "a = 0") + prohibited_script = script_helper.make_script(prohibited_path, "test_prohibited", "a = 0") + allowed_symlink = os.path.join(symlinks_path, "test_allowed.py") + prohibited_symlink = os.path.join(symlinks_path, "test_prohibited.py") + os.symlink(allowed_script, allowed_symlink) + os.symlink(prohibited_script, prohibited_symlink) + allowed_bc = importlib.util.cache_from_source(allowed_symlink) + prohibited_bc = importlib.util.cache_from_source(prohibited_symlink) + + self.assertRunOK(symlinks_path, "-e", allowed_path) + + self.assertTrue(os.path.isfile(allowed_bc)) + self.assertFalse(os.path.isfile(prohibited_bc)) + + def test_hardlink_bad_args(self): + # Bad arguments combination, hardlink deduplication make sense + # only for more than one optimization level + self.assertRunNotOK(self.directory, "-o 1", "--hardlink-dupes") + + def test_hardlink(self): + # 'a = 0' code produces the same bytecode for the 3 optimization + # levels. All three .pyc files must have the same inode (hardlinks). + # + # If deduplication is disabled, all pyc files must have different + # inodes. + for dedup in (True, False): + with tempfile.TemporaryDirectory() as path: + with self.subTest(dedup=dedup): + script = script_helper.make_script(path, "script", "a = 0") + pycs = get_pycs(script) + + args = ["-q", "-o 0", "-o 1", "-o 2"] + if dedup: + args.append("--hardlink-dupes") + self.assertRunOK(path, *args) + + self.assertEqual(is_hardlink(pycs[0], pycs[1]), dedup) + self.assertEqual(is_hardlink(pycs[1], pycs[2]), dedup) + self.assertEqual(is_hardlink(pycs[0], pycs[2]), dedup) + + +class CommandLineTestsWithSourceEpoch(CommandLineTestsBase, unittest.TestCase, metaclass=SourceDateEpochTestMeta, source_date_epoch=True): pass -class CommmandLineTestsNoSourceEpoch(CommandLineTestsBase, +class CommandLineTestsNoSourceEpoch(CommandLineTestsBase, unittest.TestCase, metaclass=SourceDateEpochTestMeta, source_date_epoch=False): @@ -634,5 +890,176 @@ class CommmandLineTestsNoSourceEpoch(CommandLineTestsBase, +class HardlinkDedupTestsBase: + # Test hardlink_dupes parameter of compileall.compile_dir() + + def setUp(self): + self.path = None + + @contextlib.contextmanager + def temporary_directory(self): + with tempfile.TemporaryDirectory() as path: + self.path = path + yield path + self.path = None + + def make_script(self, code, name="script"): + return script_helper.make_script(self.path, name, code) + + def compile_dir(self, *, dedup=True, optimize=(0, 1, 2), force=False): + compileall.compile_dir(self.path, quiet=True, optimize=optimize, + hardlink_dupes=dedup, force=force) + + def test_bad_args(self): + # Bad arguments combination, hardlink deduplication make sense + # only for more than one optimization level + with self.temporary_directory(): + self.make_script("pass") + with self.assertRaises(ValueError): + compileall.compile_dir(self.path, quiet=True, optimize=0, + hardlink_dupes=True) + with self.assertRaises(ValueError): + # same optimization level specified twice: + # compile_dir() removes duplicates + compileall.compile_dir(self.path, quiet=True, optimize=[0, 0], + hardlink_dupes=True) + + def create_code(self, docstring=False, assertion=False): + lines = [] + if docstring: + lines.append("'module docstring'") + lines.append('x = 1') + if assertion: + lines.append("assert x == 1") + return '\n'.join(lines) + + def iter_codes(self): + for docstring in (False, True): + for assertion in (False, True): + code = self.create_code(docstring=docstring, assertion=assertion) + yield (code, docstring, assertion) + + def test_disabled(self): + # Deduplication disabled, no hardlinks + for code, docstring, assertion in self.iter_codes(): + with self.subTest(docstring=docstring, assertion=assertion): + with self.temporary_directory(): + script = self.make_script(code) + pycs = get_pycs(script) + self.compile_dir(dedup=False) + self.assertFalse(is_hardlink(pycs[0], pycs[1])) + self.assertFalse(is_hardlink(pycs[0], pycs[2])) + self.assertFalse(is_hardlink(pycs[1], pycs[2])) + + def check_hardlinks(self, script, docstring=False, assertion=False): + pycs = get_pycs(script) + self.assertEqual(is_hardlink(pycs[0], pycs[1]), + not assertion) + self.assertEqual(is_hardlink(pycs[0], pycs[2]), + not assertion and not docstring) + self.assertEqual(is_hardlink(pycs[1], pycs[2]), + not docstring) + + def test_hardlink(self): + # Test deduplication on all combinations + for code, docstring, assertion in self.iter_codes(): + with self.subTest(docstring=docstring, assertion=assertion): + with self.temporary_directory(): + script = self.make_script(code) + self.compile_dir() + self.check_hardlinks(script, docstring, assertion) + + def test_only_two_levels(self): + # Don't build the 3 optimization levels, but only 2 + for opts in ((0, 1), (1, 2), (0, 2)): + with self.subTest(opts=opts): + with self.temporary_directory(): + # code with no dostring and no assertion: + # same bytecode for all optimization levels + script = self.make_script(self.create_code()) + self.compile_dir(optimize=opts) + pyc1 = get_pyc(script, opts[0]) + pyc2 = get_pyc(script, opts[1]) + self.assertTrue(is_hardlink(pyc1, pyc2)) + + def test_duplicated_levels(self): + # compile_dir() must not fail if optimize contains duplicated + # optimization levels and/or if optimization levels are not sorted. + with self.temporary_directory(): + # code with no dostring and no assertion: + # same bytecode for all optimization levels + script = self.make_script(self.create_code()) + self.compile_dir(optimize=[1, 0, 1, 0]) + pyc1 = get_pyc(script, 0) + pyc2 = get_pyc(script, 1) + self.assertTrue(is_hardlink(pyc1, pyc2)) + + def test_recompilation(self): + # Test compile_dir() when pyc files already exists and the script + # content changed + with self.temporary_directory(): + script = self.make_script("a = 0") + self.compile_dir() + # All three levels have the same inode + self.check_hardlinks(script) + + pycs = get_pycs(script) + inode = os.stat(pycs[0]).st_ino + + # Change of the module content + script = self.make_script("print(0)") + + # Recompilation without -o 1 + self.compile_dir(optimize=[0, 2], force=True) + + # opt-1.pyc should have the same inode as before and others should not + self.assertEqual(inode, os.stat(pycs[1]).st_ino) + self.assertTrue(is_hardlink(pycs[0], pycs[2])) + self.assertNotEqual(inode, os.stat(pycs[2]).st_ino) + # opt-1.pyc and opt-2.pyc have different content + self.assertFalse(filecmp.cmp(pycs[1], pycs[2], shallow=True)) + + def test_import(self): + # Test that import updates a single pyc file when pyc files already + # exists and the script content changed + with self.temporary_directory(): + script = self.make_script(self.create_code(), name="module") + self.compile_dir() + # All three levels have the same inode + self.check_hardlinks(script) + + pycs = get_pycs(script) + inode = os.stat(pycs[0]).st_ino + + # Change of the module content + script = self.make_script("print(0)", name="module") + + # Import the module in Python with -O (optimization level 1) + script_helper.assert_python_ok( + "-O", "-c", "import module", __isolated=False, PYTHONPATH=self.path + ) + + # Only opt-1.pyc is changed + self.assertEqual(inode, os.stat(pycs[0]).st_ino) + self.assertEqual(inode, os.stat(pycs[2]).st_ino) + self.assertFalse(is_hardlink(pycs[1], pycs[2])) + # opt-1.pyc and opt-2.pyc have different content + self.assertFalse(filecmp.cmp(pycs[1], pycs[2], shallow=True)) + + +class HardlinkDedupTestsWithSourceEpoch(HardlinkDedupTestsBase, + unittest.TestCase, + metaclass=SourceDateEpochTestMeta, + source_date_epoch=True): + pass + + +class HardlinkDedupTestsNoSourceEpoch(HardlinkDedupTestsBase, + unittest.TestCase, + metaclass=SourceDateEpochTestMeta, + source_date_epoch=False): + pass + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index a5a746eb3898fedc6368fe8bad71d28673d8dd4b..4fe4bf792710f065086b9bb5544187ca5f4df518 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -1,10 +1,11 @@ -import test.support +from test import support # Skip tests if _multiprocessing wasn't built. -test.support.import_module('_multiprocessing') +support.import_module('_multiprocessing') # Skip tests if sem_open implementation is broken. -test.support.skip_if_broken_multiprocessing_synchronize() +support.skip_if_broken_multiprocessing_synchronize() +from test.support import hashlib_helper from test.support.script_helper import assert_python_ok import contextlib @@ -100,11 +101,11 @@ def make_dummy_object(_): class BaseTestCase(unittest.TestCase): def setUp(self): - self._thread_key = test.support.threading_setup() + self._thread_key = support.threading_setup() def tearDown(self): - test.support.reap_children() - test.support.threading_cleanup(*self._thread_key) + support.reap_children() + support.threading_cleanup(*self._thread_key) class ExecutorMixin: @@ -131,7 +132,7 @@ def tearDown(self): self.executor = None dt = time.monotonic() - self.t1 - if test.support.verbose: + if support.verbose: print("%.2fs" % dt, end=' ') self.assertLess(dt, 300, "synchronization issue: test lasted too long") @@ -342,6 +343,49 @@ def test_hang_issue12364(self): for f in fs: f.result() + def test_cancel_futures(self): + executor = self.executor_type(max_workers=3) + fs = [executor.submit(time.sleep, .1) for _ in range(50)] + executor.shutdown(cancel_futures=True) + # We can't guarantee the exact number of cancellations, but we can + # guarantee that *some* were cancelled. With setting max_workers to 3, + # most of the submitted futures should have been cancelled. + cancelled = [fut for fut in fs if fut.cancelled()] + self.assertTrue(len(cancelled) >= 35, msg=f"{len(cancelled)=}") + + # Ensure the other futures were able to finish. + # Use "not fut.cancelled()" instead of "fut.done()" to include futures + # that may have been left in a pending state. + others = [fut for fut in fs if not fut.cancelled()] + for fut in others: + self.assertTrue(fut.done(), msg=f"{fut._state=}") + self.assertIsNone(fut.exception()) + + # Similar to the number of cancelled futures, we can't guarantee the + # exact number that completed. But, we can guarantee that at least + # one finished. + self.assertTrue(len(others) > 0, msg=f"{len(others)=}") + + def test_hang_issue39205(self): + """shutdown(wait=False) doesn't hang at exit with running futures. + + See https://bugs.python.org/issue39205. + """ + if self.executor_type == futures.ProcessPoolExecutor: + raise unittest.SkipTest( + "Hangs due to https://bugs.python.org/issue39205") + + rc, out, err = assert_python_ok('-c', """if True: + from concurrent.futures import {executor_type} + from test.test_concurrent_futures import sleep_and_print + if __name__ == "__main__": + t = {executor_type}(max_workers=3) + t.submit(sleep_and_print, 1.0, "apple") + t.shutdown(wait=False) + """.format(executor_type=self.executor_type.__name__)) + self.assertFalse(err) + self.assertEqual(out.strip(), b"apple") + class ThreadPoolShutdownTest(ThreadPoolMixin, ExecutorShutdownTest, BaseTestCase): def _prime_executor(self): @@ -372,13 +416,32 @@ def test_context_manager_shutdown(self): def test_del_shutdown(self): executor = futures.ThreadPoolExecutor(max_workers=5) - executor.map(abs, range(-5, 5)) + res = executor.map(abs, range(-5, 5)) threads = executor._threads del executor for t in threads: t.join() + # Make sure the results were all computed before the + # executor got shutdown. + assert all([r == abs(v) for r, v in zip(res, range(-5, 5))]) + + def test_shutdown_no_wait(self): + # Ensure that the executor cleans up the threads when calling + # shutdown with wait=False + executor = futures.ThreadPoolExecutor(max_workers=5) + res = executor.map(abs, range(-5, 5)) + threads = executor._threads + executor.shutdown(wait=False) + for t in threads: + t.join() + + # Make sure the results were all computed before the + # executor got shutdown. + assert all([r == abs(v) for r, v in zip(res, range(-5, 5))]) + + def test_thread_names_assigned(self): executor = futures.ThreadPoolExecutor( max_workers=5, thread_name_prefix='SpecialPool') @@ -402,16 +465,38 @@ def test_thread_names_default(self): self.assertRegex(t.name, r'ThreadPoolExecutor-\d+_[0-4]$') t.join() + def test_cancel_futures_wait_false(self): + # Can only be reliably tested for TPE, since PPE often hangs with + # `wait=False` (even without *cancel_futures*). + rc, out, err = assert_python_ok('-c', """if True: + from concurrent.futures import ThreadPoolExecutor + from test.test_concurrent_futures import sleep_and_print + if __name__ == "__main__": + t = ThreadPoolExecutor() + t.submit(sleep_and_print, .1, "apple") + t.shutdown(wait=False, cancel_futures=True) + """.format(executor_type=self.executor_type.__name__)) + # Errors in atexit hooks don't change the process exit code, check + # stderr manually. + self.assertFalse(err) + self.assertEqual(out.strip(), b"apple") + class ProcessPoolShutdownTest(ExecutorShutdownTest): def _prime_executor(self): pass def test_processes_terminate(self): - self.executor.submit(mul, 21, 2) - self.executor.submit(mul, 6, 7) - self.executor.submit(mul, 3, 14) - self.assertEqual(len(self.executor._processes), 5) + def acquire_lock(lock): + lock.acquire() + + mp_context = get_context() + sem = mp_context.Semaphore(0) + for _ in range(3): + self.executor.submit(acquire_lock, sem) + self.assertEqual(len(self.executor._processes), 3) + for _ in range(3): + sem.release() processes = self.executor._processes self.executor.shutdown() @@ -429,20 +514,45 @@ def test_context_manager_shutdown(self): def test_del_shutdown(self): executor = futures.ProcessPoolExecutor(max_workers=5) - list(executor.map(abs, range(-5, 5))) - queue_management_thread = executor._queue_management_thread + res = executor.map(abs, range(-5, 5)) + executor_manager_thread = executor._executor_manager_thread processes = executor._processes call_queue = executor._call_queue - queue_management_thread = executor._queue_management_thread + executor_manager_thread = executor._executor_manager_thread del executor # Make sure that all the executor resources were properly cleaned by # the shutdown process - queue_management_thread.join() + executor_manager_thread.join() + for p in processes.values(): + p.join() + call_queue.join_thread() + + # Make sure the results were all computed before the + # executor got shutdown. + assert all([r == abs(v) for r, v in zip(res, range(-5, 5))]) + + def test_shutdown_no_wait(self): + # Ensure that the executor cleans up the processes when calling + # shutdown with wait=False + executor = futures.ProcessPoolExecutor(max_workers=5) + res = executor.map(abs, range(-5, 5)) + processes = executor._processes + call_queue = executor._call_queue + executor_manager_thread = executor._executor_manager_thread + executor.shutdown(wait=False) + + # Make sure that all the executor resources were properly cleaned by + # the shutdown process + executor_manager_thread.join() for p in processes.values(): p.join() call_queue.join_thread() + # Make sure the results were all computed before the executor got + # shutdown. + assert all([r == abs(v) for r, v in zip(res, range(-5, 5))]) + create_executor_tests(ProcessPoolShutdownTest, executor_mixins=(ProcessPoolForkMixin, @@ -670,9 +780,8 @@ def test_submit_keyword(self): self.assertEqual(16, future.result()) future = self.executor.submit(capture, 1, self=2, fn=3) self.assertEqual(future.result(), ((1,), {'self': 2, 'fn': 3})) - with self.assertWarns(DeprecationWarning): - future = self.executor.submit(fn=capture, arg=1) - self.assertEqual(future.result(), ((), {'arg': 1})) + with self.assertRaises(TypeError): + self.executor.submit(fn=capture, arg=1) with self.assertRaises(TypeError): self.executor.submit(arg=1) @@ -712,7 +821,7 @@ def test_shutdown_race_issue12456(self): self.executor.map(str, [2] * (self.worker_count + 1)) self.executor.shutdown() - @test.support.cpython_only + @support.cpython_only def test_no_stale_references(self): # Issue #16284: check that the executors don't unnecessarily hang onto # references. @@ -724,7 +833,7 @@ def test_no_stale_references(self): self.executor.submit(my_object.my_method) del my_object - collected = my_object_collected.wait(timeout=5.0) + collected = my_object_collected.wait(timeout=support.SHORT_TIMEOUT) self.assertTrue(collected, "Stale reference not collected within timeout.") @@ -836,7 +945,7 @@ def test_traceback(self): self.assertIs(type(cause), futures.process._RemoteTraceback) self.assertIn('raise RuntimeError(123) # some comment', cause.tb) - with test.support.captured_stderr() as f1: + with support.captured_stderr() as f1: try: raise exc except RuntimeError: @@ -844,6 +953,7 @@ def test_traceback(self): self.assertIn('raise RuntimeError(123) # some comment', f1.getvalue()) + @hashlib_helper.requires_hashdigest('md5') def test_ressources_gced_in_workers(self): # Ensure that argument for a job are correctly gc-ed after the job # is finished @@ -857,22 +967,47 @@ def test_ressources_gced_in_workers(self): # explicitly destroy the object to ensure that EventfulGCObj.__del__() # is called while manager is still running. obj = None - test.support.gc_collect() + support.gc_collect() mgr.shutdown() mgr.join() + def test_saturation(self): + executor = self.executor_type(4) + mp_context = get_context() + sem = mp_context.Semaphore(0) + job_count = 15 * executor._max_workers + try: + for _ in range(job_count): + executor.submit(sem.acquire) + self.assertEqual(len(executor._processes), executor._max_workers) + for _ in range(job_count): + sem.release() + finally: + executor.shutdown() + + def test_idle_process_reuse_one(self): + executor = self.executor_type(4) + executor.submit(mul, 21, 2).result() + executor.submit(mul, 6, 7).result() + executor.submit(mul, 3, 14).result() + self.assertEqual(len(executor._processes), 1) + executor.shutdown() + + def test_idle_process_reuse_multiple(self): + executor = self.executor_type(4) + executor.submit(mul, 12, 7).result() + executor.submit(mul, 33, 25) + executor.submit(mul, 25, 26).result() + executor.submit(mul, 18, 29) + self.assertLessEqual(len(executor._processes), 2) + executor.shutdown() create_executor_tests(ProcessPoolExecutorTest, executor_mixins=(ProcessPoolForkMixin, ProcessPoolForkserverMixin, ProcessPoolSpawnMixin)) -def hide_process_stderr(): - import io - sys.stderr = io.StringIO() - - def _crash(delay=None): """Induces a segfault.""" if delay: @@ -889,13 +1024,18 @@ def _exit(): def _raise_error(Err): """Function that raises an Exception in process.""" - hide_process_stderr() + raise Err() + + +def _raise_error_ignore_stderr(Err): + """Function that raises an Exception in process and ignores stderr.""" + import io + sys.stderr = io.StringIO() raise Err() def _return_instance(cls): """Function that returns a instance of cls.""" - hide_process_stderr() return cls() @@ -934,16 +1074,11 @@ class ErrorAtUnpickle(object): """Bad object that triggers an error at unpickling time.""" def __reduce__(self): from pickle import UnpicklingError - return _raise_error, (UnpicklingError, ) + return _raise_error_ignore_stderr, (UnpicklingError, ) class ExecutorDeadlockTest: - TIMEOUT = 15 - - @classmethod - def _sleep_id(cls, x, delay): - time.sleep(delay) - return x + TIMEOUT = support.SHORT_TIMEOUT def _fail_on_deadlock(self, executor): # If we did not recover before TIMEOUT seconds, consider that the @@ -964,57 +1099,84 @@ def _fail_on_deadlock(self, executor): self.fail(f"Executor deadlock:\n\n{tb}") - def test_crash(self): - # extensive testing for deadlock caused by crashes in a pool. + def _check_crash(self, error, func, *args, ignore_stderr=False): + # test for deadlock caused by crashes in a pool self.executor.shutdown(wait=True) - crash_cases = [ - # Check problem occurring while pickling a task in - # the task_handler thread - (id, (ErrorAtPickle(),), PicklingError, "error at task pickle"), - # Check problem occurring while unpickling a task on workers - (id, (ExitAtUnpickle(),), BrokenProcessPool, - "exit at task unpickle"), - (id, (ErrorAtUnpickle(),), BrokenProcessPool, - "error at task unpickle"), - (id, (CrashAtUnpickle(),), BrokenProcessPool, - "crash at task unpickle"), - # Check problem occurring during func execution on workers - (_crash, (), BrokenProcessPool, - "crash during func execution on worker"), - (_exit, (), SystemExit, - "exit during func execution on worker"), - (_raise_error, (RuntimeError, ), RuntimeError, - "error during func execution on worker"), - # Check problem occurring while pickling a task result - # on workers - (_return_instance, (CrashAtPickle,), BrokenProcessPool, - "crash during result pickle on worker"), - (_return_instance, (ExitAtPickle,), SystemExit, - "exit during result pickle on worker"), - (_return_instance, (ErrorAtPickle,), PicklingError, - "error during result pickle on worker"), - # Check problem occurring while unpickling a task in - # the result_handler thread - (_return_instance, (ErrorAtUnpickle,), BrokenProcessPool, - "error during result unpickle in result_handler"), - (_return_instance, (ExitAtUnpickle,), BrokenProcessPool, - "exit during result unpickle in result_handler") - ] - for func, args, error, name in crash_cases: - with self.subTest(name): - # The captured_stderr reduces the noise in the test report - with test.support.captured_stderr(): - executor = self.executor_type( - max_workers=2, mp_context=get_context(self.ctx)) - res = executor.submit(func, *args) - with self.assertRaises(error): - try: - res.result(timeout=self.TIMEOUT) - except futures.TimeoutError: - # If we did not recover before TIMEOUT seconds, - # consider that the executor is in a deadlock state - self._fail_on_deadlock(executor) - executor.shutdown(wait=True) + + executor = self.executor_type( + max_workers=2, mp_context=get_context(self.ctx)) + res = executor.submit(func, *args) + + if ignore_stderr: + cm = support.captured_stderr() + else: + cm = contextlib.nullcontext() + + try: + with self.assertRaises(error): + with cm: + res.result(timeout=self.TIMEOUT) + except futures.TimeoutError: + # If we did not recover before TIMEOUT seconds, + # consider that the executor is in a deadlock state + self._fail_on_deadlock(executor) + executor.shutdown(wait=True) + + def test_error_at_task_pickle(self): + # Check problem occurring while pickling a task in + # the task_handler thread + self._check_crash(PicklingError, id, ErrorAtPickle()) + + def test_exit_at_task_unpickle(self): + # Check problem occurring while unpickling a task on workers + self._check_crash(BrokenProcessPool, id, ExitAtUnpickle()) + + def test_error_at_task_unpickle(self): + # Check problem occurring while unpickling a task on workers + self._check_crash(BrokenProcessPool, id, ErrorAtUnpickle()) + + def test_crash_at_task_unpickle(self): + # Check problem occurring while unpickling a task on workers + self._check_crash(BrokenProcessPool, id, CrashAtUnpickle()) + + def test_crash_during_func_exec_on_worker(self): + # Check problem occurring during func execution on workers + self._check_crash(BrokenProcessPool, _crash) + + def test_exit_during_func_exec_on_worker(self): + # Check problem occurring during func execution on workers + self._check_crash(SystemExit, _exit) + + def test_error_during_func_exec_on_worker(self): + # Check problem occurring during func execution on workers + self._check_crash(RuntimeError, _raise_error, RuntimeError) + + def test_crash_during_result_pickle_on_worker(self): + # Check problem occurring while pickling a task result + # on workers + self._check_crash(BrokenProcessPool, _return_instance, CrashAtPickle) + + def test_exit_during_result_pickle_on_worker(self): + # Check problem occurring while pickling a task result + # on workers + self._check_crash(SystemExit, _return_instance, ExitAtPickle) + + def test_error_during_result_pickle_on_worker(self): + # Check problem occurring while pickling a task result + # on workers + self._check_crash(PicklingError, _return_instance, ErrorAtPickle) + + def test_error_during_result_unpickle_in_result_handler(self): + # Check problem occurring while unpickling a task in + # the result_handler thread + self._check_crash(BrokenProcessPool, + _return_instance, ErrorAtUnpickle, + ignore_stderr=True) + + def test_exit_during_result_unpickle_in_result_handler(self): + # Check problem occurring while unpickling a task in + # the result_handler thread + self._check_crash(BrokenProcessPool, _return_instance, ExitAtUnpickle) def test_shutdown_deadlock(self): # Test that the pool calling shutdown do not cause deadlock @@ -1028,6 +1190,32 @@ def test_shutdown_deadlock(self): with self.assertRaises(BrokenProcessPool): f.result() + def test_shutdown_deadlock_pickle(self): + # Test that the pool calling shutdown with wait=False does not cause + # a deadlock if a task fails at pickle after the shutdown call. + # Reported in bpo-39104. + self.executor.shutdown(wait=True) + with self.executor_type(max_workers=2, + mp_context=get_context(self.ctx)) as executor: + self.executor = executor # Allow clean up in fail_on_deadlock + + # Start the executor and get the executor_manager_thread to collect + # the threads and avoid dangling thread that should be cleaned up + # asynchronously. + executor.submit(id, 42).result() + executor_manager = executor._executor_manager_thread + + # Submit a task that fails at pickle and shutdown the executor + # without waiting + f = executor.submit(id, ErrorAtPickle()) + executor.shutdown(wait=False) + with self.assertRaises(PicklingError): + f.result() + + # Make sure the executor is eventually shutdown and do not leave + # dangling threads + executor_manager.join() + create_executor_tests(ExecutorDeadlockTest, executor_mixins=(ProcessPoolForkMixin, @@ -1070,7 +1258,7 @@ def fn(callback_future): self.assertTrue(was_cancelled) def test_done_callback_raises(self): - with test.support.captured_stderr() as stderr: + with support.captured_stderr() as stderr: raising_was_called = False fn_was_called = False @@ -1125,7 +1313,7 @@ def fn(callback_future): self.assertTrue(was_cancelled) def test_done_callback_raises_already_succeeded(self): - with test.support.captured_stderr() as stderr: + with support.captured_stderr() as stderr: def raising_fn(callback_future): raise Exception('doh!') @@ -1244,7 +1432,8 @@ def notification(): t = threading.Thread(target=notification) t.start() - self.assertRaises(futures.CancelledError, f1.result, timeout=5) + self.assertRaises(futures.CancelledError, + f1.result, timeout=support.SHORT_TIMEOUT) t.join() def test_exception_with_timeout(self): @@ -1273,7 +1462,7 @@ def notification(): t = threading.Thread(target=notification) t.start() - self.assertTrue(isinstance(f1.exception(timeout=5), OSError)) + self.assertTrue(isinstance(f1.exception(timeout=support.SHORT_TIMEOUT), OSError)) t.join() def test_multiple_set_result(self): @@ -1309,11 +1498,11 @@ def test_multiple_set_exception(self): def setUpModule(): global _threads_key - _threads_key = test.support.threading_setup() + _threads_key = support.threading_setup() def tearDownModule(): - test.support.threading_cleanup(*_threads_key) + support.threading_cleanup(*_threads_key) multiprocessing.util._cleanup_tests() diff --git a/Lib/test/test_contains.py b/Lib/test/test_contains.py index 036a1d012dbd9f037e6a00cafb70f7ab821a5901..471d04a76ca4e42f0db8c8189374cfa5bc6ce571 100644 --- a/Lib/test/test_contains.py +++ b/Lib/test/test_contains.py @@ -1,5 +1,6 @@ from collections import deque import unittest +from test.support import NEVER_EQ class base_set: @@ -69,13 +70,7 @@ def test_nonreflexive(self): # containment and equality tests involving elements that are # not necessarily equal to themselves - class MyNonReflexive(object): - def __eq__(self, other): - return False - def __hash__(self): - return 28 - - values = float('nan'), 1, None, 'abc', MyNonReflexive() + values = float('nan'), 1, None, 'abc', NEVER_EQ constructors = list, tuple, dict.fromkeys, set, frozenset, deque for constructor in constructors: container = constructor(values) diff --git a/Lib/test/test_context.py b/Lib/test/test_context.py index b9e991a400092915695ef23e971bf0a5c187f4f6..2d8b63a1f59581e1c471ca82dc8c13fb8fda3e71 100644 --- a/Lib/test/test_context.py +++ b/Lib/test/test_context.py @@ -358,10 +358,6 @@ def sub(num): tp.shutdown() self.assertEqual(results, list(range(10))) - def test_contextvar_getitem(self): - clss = contextvars.ContextVar - self.assertEqual(clss[str], clss) - # HAMT Tests diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py index 188a29d9f9fd77ec5c79d1064828b81431b70910..024f912647295a78de292f07e969cc1e47fad40a 100644 --- a/Lib/test/test_contextlib.py +++ b/Lib/test/test_contextlib.py @@ -603,9 +603,9 @@ def _exit(*args, **kwds): stack.callback(arg=1) with self.assertRaises(TypeError): self.exit_stack.callback(arg=2) - with self.assertWarns(DeprecationWarning): + with self.assertRaises(TypeError): stack.callback(callback=_exit, arg=3) - self.assertEqual(result, [((), {'arg': 3})]) + self.assertEqual(result, []) def test_push(self): exc_raised = ZeroDivisionError diff --git a/Lib/test/test_contextlib_async.py b/Lib/test/test_contextlib_async.py index 492b226a0d549b5ca323ae97f7c40d43eb620781..43fb7fced1bfdb0b35bf3f231f11b40361efbf5d 100644 --- a/Lib/test/test_contextlib_async.py +++ b/Lib/test/test_contextlib_async.py @@ -358,9 +358,9 @@ async def _exit(*args, **kwds): stack.push_async_callback(arg=1) with self.assertRaises(TypeError): self.exit_stack.push_async_callback(arg=2) - with self.assertWarns(DeprecationWarning): + with self.assertRaises(TypeError): stack.push_async_callback(callback=_exit, arg=3) - self.assertEqual(result, [((), {'arg': 3})]) + self.assertEqual(result, []) @_async_test async def test_async_push(self): diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index 208b5c2ccf5cd26167c3c21c892236cc989d8ede..8d1e0692a24221bf024b061cebfff9fe9144ecfd 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -1203,39 +1203,41 @@ class CM: def __aenter__(self): pass + body_executed = False async def foo(): async with CM(): - pass + body_executed = True with self.assertRaisesRegex(AttributeError, '__aexit__'): run_async(foo()) + self.assertFalse(body_executed) def test_with_3(self): class CM: def __aexit__(self): pass + body_executed = False async def foo(): async with CM(): - pass + body_executed = True with self.assertRaisesRegex(AttributeError, '__aenter__'): run_async(foo()) + self.assertFalse(body_executed) def test_with_4(self): class CM: - def __enter__(self): - pass - - def __exit__(self): - pass + pass + body_executed = False async def foo(): async with CM(): - pass + body_executed = True - with self.assertRaisesRegex(AttributeError, '__aexit__'): + with self.assertRaisesRegex(AttributeError, '__aenter__'): run_async(foo()) + self.assertFalse(body_executed) def test_with_5(self): # While this test doesn't make a lot of sense, diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py index a16d14019f341f6bd0a6afba037d2fb6f6deb6b4..d421be075ca27fb01fa31cc83a784f4bf5e10631 100644 --- a/Lib/test/test_csv.py +++ b/Lib/test/test_csv.py @@ -14,6 +14,12 @@ from textwrap import dedent from collections import OrderedDict + +class BadIterable: + def __iter__(self): + raise OSError + + class Test_Csv(unittest.TestCase): """ Test the underlying C csv parser in ways that are not appropriate @@ -40,9 +46,15 @@ def _test_arg_valid(self, ctor, arg): def test_reader_arg_valid(self): self._test_arg_valid(csv.reader, []) + self.assertRaises(OSError, csv.reader, BadIterable()) def test_writer_arg_valid(self): self._test_arg_valid(csv.writer, StringIO()) + class BadWriter: + @property + def write(self): + raise OSError + self.assertRaises(OSError, csv.writer, BadWriter()) def _test_default_attrs(self, ctor, *args): obj = ctor(*args) @@ -141,6 +153,7 @@ def test_write_arg_valid(self): self._write_test([None], '""') self._write_error_test(csv.Error, [None], quoting = csv.QUOTE_NONE) # Check that exceptions are passed up the chain + self._write_error_test(OSError, BadIterable()) class BadList: def __len__(self): return 10; @@ -230,6 +243,12 @@ def test_writerows_with_none(self): fileobj.seek(0) self.assertEqual(fileobj.read(), 'a\r\n""\r\n') + def test_writerows_errors(self): + with TemporaryFile("w+", newline='') as fileobj: + writer = csv.writer(fileobj) + self.assertRaises(TypeError, writer.writerows, None) + self.assertRaises(OSError, writer.writerows, BadIterable()) + @support.cpython_only def test_writerows_legacy_strings(self): import _testcapi @@ -334,7 +353,6 @@ def test_read_linenum(self): def test_roundtrip_quoteed_newlines(self): with TemporaryFile("w+", newline='') as fileobj: writer = csv.writer(fileobj) - self.assertRaises(TypeError, writer.writerows, None) rows = [['a\nb','b'],['c','x\r\nd']] writer.writerows(rows) fileobj.seek(0) diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index 09738c8a41c942746ea8e77079fe1c34487f8907..c1ad23b456e2068793fa675cbfed3b1114d479b3 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -1,14 +1,5 @@ -# -# Test script for the curses module -# -# This script doesn't actually display anything very coherent. but it -# does call (nearly) every method and function. -# -# Functions not tested: {def,reset}_{shell,prog}_mode, getch(), getstr(), -# init_color() -# Only called, not tested: getmouse(), ungetmouse() -# - +import functools +import inspect import os import string import sys @@ -20,7 +11,6 @@ # Optionally test curses module. This currently requires that the # 'curses' resource be given on the regrtest command line using the -u # option. If not available, nothing after this line will be executed. -import inspect requires('curses') # If either of these don't exist, skip the tests. @@ -36,7 +26,28 @@ def requires_curses_func(name): return unittest.skipUnless(hasattr(curses, name), 'requires curses.%s' % name) +def requires_curses_window_meth(name): + def deco(test): + @functools.wraps(test) + def wrapped(self, *args, **kwargs): + if not hasattr(self.stdscr, name): + raise unittest.SkipTest('requires curses.window.%s' % name) + test(self, *args, **kwargs) + return wrapped + return deco + + +def requires_colors(test): + @functools.wraps(test) + def wrapped(self, *args, **kwargs): + if not curses.has_colors(): + self.skipTest('requires colors support') + curses.start_color() + test(self, *args, **kwargs) + return wrapped + term = os.environ.get('TERM') +SHORT_MAX = 0x7fff # If newterm was supported we could use it instead of initscr and not exit @unittest.skipIf(not term or term == 'unknown', @@ -47,250 +58,941 @@ class TestCurses(unittest.TestCase): @classmethod def setUpClass(cls): - if not sys.__stdout__.isatty(): - # Temporary skip tests on non-tty - raise unittest.SkipTest('sys.__stdout__ is not a tty') - cls.tmp = tempfile.TemporaryFile() - fd = cls.tmp.fileno() - else: - cls.tmp = None - fd = sys.__stdout__.fileno() + if verbose: + print(f'TERM={term}', file=sys.stderr, flush=True) # testing setupterm() inside initscr/endwin # causes terminal breakage - curses.setupterm(fd=fd) - - @classmethod - def tearDownClass(cls): - if cls.tmp: - cls.tmp.close() - del cls.tmp + stdout_fd = sys.__stdout__.fileno() + curses.setupterm(fd=stdout_fd) def setUp(self): + self.isatty = True + self.output = sys.__stdout__ + stdout_fd = sys.__stdout__.fileno() + if not sys.__stdout__.isatty(): + # initstr() unconditionally uses C stdout. + # If it is redirected to file or pipe, try to attach it + # to terminal. + # First, save a copy of the file descriptor of stdout, so it + # can be restored after finishing the test. + dup_fd = os.dup(stdout_fd) + self.addCleanup(os.close, dup_fd) + self.addCleanup(os.dup2, dup_fd, stdout_fd) + + if sys.__stderr__.isatty(): + # If stderr is connected to terminal, use it. + tmp = sys.__stderr__ + self.output = sys.__stderr__ + else: + try: + # Try to open the terminal device. + tmp = open('/dev/tty', 'wb', buffering=0) + except OSError: + # As a fallback, use regular file to write control codes. + # Some functions (like savetty) will not work, but at + # least the garbage control sequences will not be mixed + # with the testing report. + tmp = tempfile.TemporaryFile(mode='wb', buffering=0) + self.isatty = False + self.addCleanup(tmp.close) + self.output = None + os.dup2(tmp.fileno(), stdout_fd) + self.save_signals = SaveSignals() self.save_signals.save() - if verbose: + self.addCleanup(self.save_signals.restore) + if verbose and self.output is not None: # just to make the test output a little more readable - print() + sys.stderr.flush() + sys.stdout.flush() + print(file=self.output, flush=True) self.stdscr = curses.initscr() - curses.savetty() + if self.isatty: + curses.savetty() + self.addCleanup(curses.endwin) + self.addCleanup(curses.resetty) + self.stdscr.erase() + + @requires_curses_func('filter') + def test_filter(self): + # TODO: Should be called before initscr() or newterm() are called. + # TODO: nofilter() + curses.filter() + + @requires_curses_func('use_env') + def test_use_env(self): + # TODO: Should be called before initscr() or newterm() are called. + # TODO: use_tioctl() + curses.use_env(False) + curses.use_env(True) + + def test_create_windows(self): + win = curses.newwin(5, 10) + self.assertEqual(win.getbegyx(), (0, 0)) + self.assertEqual(win.getparyx(), (-1, -1)) + self.assertEqual(win.getmaxyx(), (5, 10)) + + win = curses.newwin(10, 15, 2, 5) + self.assertEqual(win.getbegyx(), (2, 5)) + self.assertEqual(win.getparyx(), (-1, -1)) + self.assertEqual(win.getmaxyx(), (10, 15)) + + win2 = win.subwin(3, 7) + self.assertEqual(win2.getbegyx(), (3, 7)) + self.assertEqual(win2.getparyx(), (1, 2)) + self.assertEqual(win2.getmaxyx(), (9, 13)) + + win2 = win.subwin(5, 10, 3, 7) + self.assertEqual(win2.getbegyx(), (3, 7)) + self.assertEqual(win2.getparyx(), (1, 2)) + self.assertEqual(win2.getmaxyx(), (5, 10)) + + win3 = win.derwin(2, 3) + self.assertEqual(win3.getbegyx(), (4, 8)) + self.assertEqual(win3.getparyx(), (2, 3)) + self.assertEqual(win3.getmaxyx(), (8, 12)) + + win3 = win.derwin(6, 11, 2, 3) + self.assertEqual(win3.getbegyx(), (4, 8)) + self.assertEqual(win3.getparyx(), (2, 3)) + self.assertEqual(win3.getmaxyx(), (6, 11)) + + win.mvwin(0, 1) + self.assertEqual(win.getbegyx(), (0, 1)) + self.assertEqual(win.getparyx(), (-1, -1)) + self.assertEqual(win.getmaxyx(), (10, 15)) + self.assertEqual(win2.getbegyx(), (3, 7)) + self.assertEqual(win2.getparyx(), (1, 2)) + self.assertEqual(win2.getmaxyx(), (5, 10)) + self.assertEqual(win3.getbegyx(), (4, 8)) + self.assertEqual(win3.getparyx(), (2, 3)) + self.assertEqual(win3.getmaxyx(), (6, 11)) + + win2.mvderwin(2, 1) + self.assertEqual(win2.getbegyx(), (3, 7)) + self.assertEqual(win2.getparyx(), (2, 1)) + self.assertEqual(win2.getmaxyx(), (5, 10)) + + win3.mvderwin(2, 1) + self.assertEqual(win3.getbegyx(), (4, 8)) + self.assertEqual(win3.getparyx(), (2, 1)) + self.assertEqual(win3.getmaxyx(), (6, 11)) + + def test_move_cursor(self): + stdscr = self.stdscr + win = stdscr.subwin(10, 15, 2, 5) + stdscr.move(1, 2) + win.move(2, 4) + self.assertEqual(stdscr.getyx(), (1, 2)) + self.assertEqual(win.getyx(), (2, 4)) - def tearDown(self): - curses.resetty() - curses.endwin() - self.save_signals.restore() + win.cursyncup() + self.assertEqual(stdscr.getyx(), (4, 9)) - def test_window_funcs(self): - "Test the methods of windows" + def test_refresh_control(self): stdscr = self.stdscr - win = curses.newwin(10,10) - win = curses.newwin(5,5, 5,5) - win2 = curses.newwin(15,15, 5,5) - - for meth in [stdscr.addch, stdscr.addstr]: - for args in [('a',), ('a', curses.A_BOLD), - (4,4, 'a'), (5,5, 'a', curses.A_BOLD)]: - with self.subTest(meth=meth.__qualname__, args=args): - meth(*args) - - for meth in [stdscr.clear, stdscr.clrtobot, - stdscr.clrtoeol, stdscr.cursyncup, stdscr.delch, - stdscr.deleteln, stdscr.erase, stdscr.getbegyx, - stdscr.getbkgd, stdscr.getkey, stdscr.getmaxyx, - stdscr.getparyx, stdscr.getyx, stdscr.inch, - stdscr.insertln, stdscr.instr, stdscr.is_wintouched, - win.noutrefresh, stdscr.redrawwin, stdscr.refresh, - stdscr.standout, stdscr.standend, stdscr.syncdown, - stdscr.syncup, stdscr.touchwin, stdscr.untouchwin]: - with self.subTest(meth=meth.__qualname__): - meth() - - stdscr.addnstr('1234', 3) - stdscr.addnstr('1234', 3, curses.A_BOLD) - stdscr.addnstr(4,4, '1234', 3) - stdscr.addnstr(5,5, '1234', 3, curses.A_BOLD) - - stdscr.attron(curses.A_BOLD) - stdscr.attroff(curses.A_BOLD) - stdscr.attrset(curses.A_BOLD) - stdscr.bkgd(' ') - stdscr.bkgd(' ', curses.A_REVERSE) - stdscr.bkgdset(' ') - stdscr.bkgdset(' ', curses.A_REVERSE) + # touchwin()/untouchwin()/is_wintouched() + stdscr.refresh() + self.assertIs(stdscr.is_wintouched(), False) + stdscr.touchwin() + self.assertIs(stdscr.is_wintouched(), True) + stdscr.refresh() + self.assertIs(stdscr.is_wintouched(), False) + stdscr.touchwin() + self.assertIs(stdscr.is_wintouched(), True) + stdscr.untouchwin() + self.assertIs(stdscr.is_wintouched(), False) + + # touchline()/untouchline()/is_linetouched() + stdscr.touchline(5, 2) + self.assertIs(stdscr.is_linetouched(5), True) + self.assertIs(stdscr.is_linetouched(6), True) + self.assertIs(stdscr.is_wintouched(), True) + stdscr.touchline(5, 1, False) + self.assertIs(stdscr.is_linetouched(5), False) + + # syncup() + win = stdscr.subwin(10, 15, 2, 5) + win2 = win.subwin(5, 10, 3, 7) + win2.touchwin() + stdscr.untouchwin() + win2.syncup() + self.assertIs(win.is_wintouched(), True) + self.assertIs(stdscr.is_wintouched(), True) + + # syncdown() + stdscr.touchwin() + win.untouchwin() + win2.untouchwin() + win2.syncdown() + self.assertIs(win2.is_wintouched(), True) + + # syncok() + if hasattr(stdscr, 'syncok') and not sys.platform.startswith("sunos"): + win.untouchwin() + stdscr.untouchwin() + for syncok in [False, True]: + win2.syncok(syncok) + win2.addch('a') + self.assertIs(win.is_wintouched(), syncok) + self.assertIs(stdscr.is_wintouched(), syncok) + + def test_output_character(self): + stdscr = self.stdscr + encoding = stdscr.encoding + # addch() + stdscr.refresh() + stdscr.move(0, 0) + stdscr.addch('A') + stdscr.addch(b'A') + stdscr.addch(65) + c = '\u20ac' + try: + stdscr.addch(c) + except UnicodeEncodeError: + self.assertRaises(UnicodeEncodeError, c.encode, encoding) + except OverflowError: + encoded = c.encode(encoding) + self.assertNotEqual(len(encoded), 1, repr(encoded)) + stdscr.addch('A', curses.A_BOLD) + stdscr.addch(1, 2, 'A') + stdscr.addch(2, 3, 'A', curses.A_BOLD) + self.assertIs(stdscr.is_wintouched(), True) + + # echochar() + stdscr.refresh() + stdscr.move(0, 0) + stdscr.echochar('A') + stdscr.echochar(b'A') + stdscr.echochar(65) + with self.assertRaises((UnicodeEncodeError, OverflowError)): + stdscr.echochar('\u20ac') + stdscr.echochar('A', curses.A_BOLD) + self.assertIs(stdscr.is_wintouched(), False) + + def test_output_string(self): + stdscr = self.stdscr + encoding = stdscr.encoding + # addstr()/insstr() + for func in [stdscr.addstr, stdscr.insstr]: + with self.subTest(func.__qualname__): + stdscr.move(0, 0) + func('abcd') + func(b'abcd') + s = 'àßçđ' + try: + func(s) + except UnicodeEncodeError: + self.assertRaises(UnicodeEncodeError, s.encode, encoding) + func('abcd', curses.A_BOLD) + func(1, 2, 'abcd') + func(2, 3, 'abcd', curses.A_BOLD) + + # addnstr()/insnstr() + for func in [stdscr.addnstr, stdscr.insnstr]: + with self.subTest(func.__qualname__): + stdscr.move(0, 0) + func('1234', 3) + func(b'1234', 3) + s = '\u0661\u0662\u0663\u0664' + try: + func(s, 3) + except UnicodeEncodeError: + self.assertRaises(UnicodeEncodeError, s.encode, encoding) + func('1234', 5) + func('1234', 3, curses.A_BOLD) + func(1, 2, '1234', 3) + func(2, 3, '1234', 3, curses.A_BOLD) + + def test_output_string_embedded_null_chars(self): + # reject embedded null bytes and characters + stdscr = self.stdscr + for arg in ['a\0', b'a\0']: + with self.subTest(arg=arg): + self.assertRaises(ValueError, stdscr.addstr, arg) + self.assertRaises(ValueError, stdscr.addnstr, arg, 1) + self.assertRaises(ValueError, stdscr.insstr, arg) + self.assertRaises(ValueError, stdscr.insnstr, arg, 1) - win.border(65, 66, 67, 68, - 69, 70, 71, 72) + def test_read_from_window(self): + stdscr = self.stdscr + stdscr.addstr(0, 1, 'ABCD', curses.A_BOLD) + # inch() + stdscr.move(0, 1) + self.assertEqual(stdscr.inch(), 65 | curses.A_BOLD) + self.assertEqual(stdscr.inch(0, 3), 67 | curses.A_BOLD) + stdscr.move(0, 0) + # instr() + self.assertEqual(stdscr.instr()[:6], b' ABCD ') + self.assertEqual(stdscr.instr(3)[:6], b' AB') + self.assertEqual(stdscr.instr(0, 2)[:4], b'BCD ') + self.assertEqual(stdscr.instr(0, 2, 4), b'BCD ') + self.assertRaises(ValueError, stdscr.instr, -2) + self.assertRaises(ValueError, stdscr.instr, 0, 2, -2) + + def test_getch(self): + win = curses.newwin(5, 12, 5, 2) + + # TODO: Test with real input by writing to master fd. + for c in 'spam\n'[::-1]: + curses.ungetch(c) + self.assertEqual(win.getch(3, 1), b's'[0]) + self.assertEqual(win.getyx(), (3, 1)) + self.assertEqual(win.getch(3, 4), b'p'[0]) + self.assertEqual(win.getyx(), (3, 4)) + self.assertEqual(win.getch(), b'a'[0]) + self.assertEqual(win.getyx(), (3, 4)) + self.assertEqual(win.getch(), b'm'[0]) + self.assertEqual(win.getch(), b'\n'[0]) + + def test_getstr(self): + win = curses.newwin(5, 12, 5, 2) + curses.echo() + self.addCleanup(curses.noecho) + + self.assertRaises(ValueError, win.getstr, -400) + self.assertRaises(ValueError, win.getstr, 2, 3, -400) + + # TODO: Test with real input by writing to master fd. + for c in 'Lorem\nipsum\ndolor\nsit\namet\n'[::-1]: + curses.ungetch(c) + self.assertEqual(win.getstr(3, 1, 2), b'Lo') + self.assertEqual(win.instr(3, 0), b' Lo ') + self.assertEqual(win.getstr(3, 5, 10), b'ipsum') + self.assertEqual(win.instr(3, 0), b' Lo ipsum ') + self.assertEqual(win.getstr(1, 5), b'dolor') + self.assertEqual(win.instr(1, 0), b' dolor ') + self.assertEqual(win.getstr(2), b'si') + self.assertEqual(win.instr(1, 0), b'si dolor ') + self.assertEqual(win.getstr(), b'amet') + self.assertEqual(win.instr(1, 0), b'amet dolor ') + + def test_clear(self): + win = curses.newwin(5, 15, 5, 2) + lorem_ipsum(win) + + win.move(0, 8) + win.clrtoeol() + self.assertEqual(win.instr(0, 0).rstrip(), b'Lorem ip') + self.assertEqual(win.instr(1, 0).rstrip(), b'dolor sit amet,') + + win.move(0, 3) + win.clrtobot() + self.assertEqual(win.instr(0, 0).rstrip(), b'Lor') + self.assertEqual(win.instr(1, 0).rstrip(), b'') + + for func in [win.erase, win.clear]: + lorem_ipsum(win) + func() + self.assertEqual(win.instr(0, 0).rstrip(), b'') + self.assertEqual(win.instr(1, 0).rstrip(), b'') + + def test_insert_delete(self): + win = curses.newwin(5, 15, 5, 2) + lorem_ipsum(win) + + win.move(0, 2) + win.delch() + self.assertEqual(win.instr(0, 0), b'Loem ipsum ') + win.delch(0, 7) + self.assertEqual(win.instr(0, 0), b'Loem ipum ') + + win.move(1, 5) + win.deleteln() + self.assertEqual(win.instr(0, 0), b'Loem ipum ') + self.assertEqual(win.instr(1, 0), b'consectetur ') + self.assertEqual(win.instr(2, 0), b'adipiscing elit') + self.assertEqual(win.instr(3, 0), b'sed do eiusmod ') + self.assertEqual(win.instr(4, 0), b' ') + + win.move(1, 5) + win.insertln() + self.assertEqual(win.instr(0, 0), b'Loem ipum ') + self.assertEqual(win.instr(1, 0), b' ') + self.assertEqual(win.instr(2, 0), b'consectetur ') + + win.clear() + lorem_ipsum(win) + win.move(1, 5) + win.insdelln(2) + self.assertEqual(win.instr(0, 0), b'Lorem ipsum ') + self.assertEqual(win.instr(1, 0), b' ') + self.assertEqual(win.instr(2, 0), b' ') + self.assertEqual(win.instr(3, 0), b'dolor sit amet,') + + win.clear() + lorem_ipsum(win) + win.move(1, 5) + win.insdelln(-2) + self.assertEqual(win.instr(0, 0), b'Lorem ipsum ') + self.assertEqual(win.instr(1, 0), b'adipiscing elit') + self.assertEqual(win.instr(2, 0), b'sed do eiusmod ') + self.assertEqual(win.instr(3, 0), b' ') + + def test_scroll(self): + win = curses.newwin(5, 15, 5, 2) + lorem_ipsum(win) + win.scrollok(True) + win.scroll() + self.assertEqual(win.instr(0, 0), b'dolor sit amet,') + win.scroll(2) + self.assertEqual(win.instr(0, 0), b'adipiscing elit') + win.scroll(-3) + self.assertEqual(win.instr(0, 0), b' ') + self.assertEqual(win.instr(2, 0), b' ') + self.assertEqual(win.instr(3, 0), b'adipiscing elit') + win.scrollok(False) + + def test_attributes(self): + # TODO: attr_get(), attr_set(), ... + win = curses.newwin(5, 15, 5, 2) + win.attron(curses.A_BOLD) + win.attroff(curses.A_BOLD) + win.attrset(curses.A_BOLD) + + win.standout() + win.standend() + + @requires_curses_window_meth('chgat') + def test_chgat(self): + win = curses.newwin(5, 15, 5, 2) + win.addstr(2, 0, 'Lorem ipsum') + win.addstr(3, 0, 'dolor sit amet') + + win.move(2, 8) + win.chgat(curses.A_BLINK) + self.assertEqual(win.inch(2, 7), b'p'[0]) + self.assertEqual(win.inch(2, 8), b's'[0] | curses.A_BLINK) + self.assertEqual(win.inch(2, 14), b' '[0] | curses.A_BLINK) + + win.move(2, 1) + win.chgat(3, curses.A_BOLD) + self.assertEqual(win.inch(2, 0), b'L'[0]) + self.assertEqual(win.inch(2, 1), b'o'[0] | curses.A_BOLD) + self.assertEqual(win.inch(2, 3), b'e'[0] | curses.A_BOLD) + self.assertEqual(win.inch(2, 4), b'm'[0]) + + win.chgat(3, 2, curses.A_UNDERLINE) + self.assertEqual(win.inch(3, 1), b'o'[0]) + self.assertEqual(win.inch(3, 2), b'l'[0] | curses.A_UNDERLINE) + self.assertEqual(win.inch(3, 14), b' '[0] | curses.A_UNDERLINE) + + win.chgat(3, 4, 7, curses.A_BLINK) + self.assertEqual(win.inch(3, 3), b'o'[0] | curses.A_UNDERLINE) + self.assertEqual(win.inch(3, 4), b'r'[0] | curses.A_BLINK) + self.assertEqual(win.inch(3, 10), b'a'[0] | curses.A_BLINK) + self.assertEqual(win.inch(3, 11), b'm'[0] | curses.A_UNDERLINE) + self.assertEqual(win.inch(3, 14), b' '[0] | curses.A_UNDERLINE) + + def test_background(self): + win = curses.newwin(5, 15, 5, 2) + win.addstr(0, 0, 'Lorem ipsum') + + self.assertIn(win.getbkgd(), (0, 32)) + + # bkgdset() + win.bkgdset('_') + self.assertEqual(win.getbkgd(), b'_'[0]) + win.bkgdset(b'#') + self.assertEqual(win.getbkgd(), b'#'[0]) + win.bkgdset(65) + self.assertEqual(win.getbkgd(), 65) + win.bkgdset(0) + self.assertEqual(win.getbkgd(), 32) + + win.bkgdset('#', curses.A_REVERSE) + self.assertEqual(win.getbkgd(), b'#'[0] | curses.A_REVERSE) + self.assertEqual(win.inch(0, 0), b'L'[0]) + self.assertEqual(win.inch(0, 5), b' '[0]) + win.bkgdset(0) + + # bkgd() + win.bkgd('_') + self.assertEqual(win.getbkgd(), b'_'[0]) + self.assertEqual(win.inch(0, 0), b'L'[0]) + self.assertEqual(win.inch(0, 5), b'_'[0]) + + win.bkgd('#', curses.A_REVERSE) + self.assertEqual(win.getbkgd(), b'#'[0] | curses.A_REVERSE) + self.assertEqual(win.inch(0, 0), b'L'[0] | curses.A_REVERSE) + self.assertEqual(win.inch(0, 5), b'#'[0] | curses.A_REVERSE) + + def test_overlay(self): + srcwin = curses.newwin(5, 18, 3, 4) + lorem_ipsum(srcwin) + dstwin = curses.newwin(7, 17, 5, 7) + for i in range(6): + dstwin.addstr(i, 0, '_'*17) + + srcwin.overlay(dstwin) + self.assertEqual(dstwin.instr(0, 0), b'sectetur_________') + self.assertEqual(dstwin.instr(1, 0), b'piscing_elit,____') + self.assertEqual(dstwin.instr(2, 0), b'_do_eiusmod______') + self.assertEqual(dstwin.instr(3, 0), b'_________________') + + srcwin.overwrite(dstwin) + self.assertEqual(dstwin.instr(0, 0), b'sectetur __') + self.assertEqual(dstwin.instr(1, 0), b'piscing elit, __') + self.assertEqual(dstwin.instr(2, 0), b' do eiusmod __') + self.assertEqual(dstwin.instr(3, 0), b'_________________') + + srcwin.overlay(dstwin, 1, 4, 3, 2, 4, 11) + self.assertEqual(dstwin.instr(3, 0), b'__r_sit_amet_____') + self.assertEqual(dstwin.instr(4, 0), b'__ectetur________') + self.assertEqual(dstwin.instr(5, 0), b'_________________') + + srcwin.overwrite(dstwin, 1, 4, 3, 2, 4, 11) + self.assertEqual(dstwin.instr(3, 0), b'__r sit amet_____') + self.assertEqual(dstwin.instr(4, 0), b'__ectetur _____') + self.assertEqual(dstwin.instr(5, 0), b'_________________') + + def test_refresh(self): + win = curses.newwin(5, 15, 2, 5) + win.noutrefresh() + win.redrawln(1, 2) + win.redrawwin() + win.refresh() + curses.doupdate() + + @requires_curses_window_meth('resize') + def test_resize(self): + win = curses.newwin(5, 15, 2, 5) + win.resize(4, 20) + self.assertEqual(win.getmaxyx(), (4, 20)) + win.resize(5, 15) + self.assertEqual(win.getmaxyx(), (5, 15)) + + @requires_curses_window_meth('enclose') + def test_enclose(self): + win = curses.newwin(5, 15, 2, 5) + # TODO: Return bool instead of 1/0 + self.assertTrue(win.enclose(2, 5)) + self.assertFalse(win.enclose(1, 5)) + self.assertFalse(win.enclose(2, 4)) + self.assertTrue(win.enclose(6, 19)) + self.assertFalse(win.enclose(7, 19)) + self.assertFalse(win.enclose(6, 20)) + + def test_putwin(self): + win = curses.newwin(5, 12, 1, 2) + win.addstr(2, 1, 'Lorem ipsum') + with tempfile.TemporaryFile() as f: + win.putwin(f) + del win + f.seek(0) + win = curses.getwin(f) + self.assertEqual(win.getbegyx(), (1, 2)) + self.assertEqual(win.getmaxyx(), (5, 12)) + self.assertEqual(win.instr(2, 0), b' Lorem ipsum') + + def test_borders_and_lines(self): + win = curses.newwin(5, 10, 5, 2) win.border('|', '!', '-', '_', '+', '\\', '#', '/') - with self.assertRaises(TypeError, - msg="Expected win.border() to raise TypeError"): - win.border(65, 66, 67, 68, - 69, [], 71, 72) - - win.box(65, 67) - win.box('!', '_') + self.assertEqual(win.instr(0, 0), b'+--------\\') + self.assertEqual(win.instr(1, 0), b'| !') + self.assertEqual(win.instr(4, 0), b'#________/') + win.border(b'|', b'!', b'-', b'_', + b'+', b'\\', b'#', b'/') + win.border(65, 66, 67, 68, + 69, 70, 71, 72) + self.assertRaises(TypeError, win.border, + 65, 66, 67, 68, 69, [], 71, 72) + self.assertRaises(TypeError, win.border, + 65, 66, 67, 68, 69, 70, 71, 72, 73) + self.assertRaises(TypeError, win.border, + 65, 66, 67, 68, 69, 70, 71, 72, 73) + win.border(65, 66, 67, 68, 69, 70, 71) + win.border(65, 66, 67, 68, 69, 70) + win.border(65, 66, 67, 68, 69) + win.border(65, 66, 67, 68) + win.border(65, 66, 67) + win.border(65, 66) + win.border(65) + win.border() + + win.box(':', '~') + self.assertEqual(win.instr(0, 1, 8), b'~~~~~~~~') + self.assertEqual(win.instr(1, 0), b': :') + self.assertEqual(win.instr(4, 1, 8), b'~~~~~~~~') win.box(b':', b'~') + win.box(65, 67) self.assertRaises(TypeError, win.box, 65, 66, 67) self.assertRaises(TypeError, win.box, 65) win.box() - stdscr.clearok(1) + win.move(1, 2) + win.hline('-', 5) + self.assertEqual(win.instr(1, 1, 7), b' ----- ') + win.hline(b'-', 5) + win.hline(45, 5) + win.hline('-', 5, curses.A_BOLD) + win.hline(1, 1, '-', 5) + win.hline(1, 1, '-', 5, curses.A_BOLD) + + win.move(1, 2) + win.vline('a', 3) + win.vline(b'a', 3) + win.vline(97, 3) + win.vline('a', 3, curses.A_STANDOUT) + win.vline(1, 1, 'a', 3) + win.vline(1, 1, ';', 2, curses.A_STANDOUT) + self.assertEqual(win.inch(1, 1), b';'[0] | curses.A_STANDOUT) + self.assertEqual(win.inch(2, 1), b';'[0] | curses.A_STANDOUT) + self.assertEqual(win.inch(3, 1), b'a'[0]) + + def test_unctrl(self): + # TODO: wunctrl() + self.assertEqual(curses.unctrl(b'A'), b'A') + self.assertEqual(curses.unctrl('A'), b'A') + self.assertEqual(curses.unctrl(65), b'A') + self.assertEqual(curses.unctrl(b'\n'), b'^J') + self.assertEqual(curses.unctrl('\n'), b'^J') + self.assertEqual(curses.unctrl(10), b'^J') + self.assertRaises(TypeError, curses.unctrl, b'') + self.assertRaises(TypeError, curses.unctrl, b'AB') + self.assertRaises(TypeError, curses.unctrl, '') + self.assertRaises(TypeError, curses.unctrl, 'AB') + self.assertRaises(OverflowError, curses.unctrl, 2**64) + + def test_endwin(self): + if not self.isatty: + self.skipTest('requires terminal') + self.assertIs(curses.isendwin(), False) + curses.endwin() + self.assertIs(curses.isendwin(), True) + curses.doupdate() + self.assertIs(curses.isendwin(), False) + + def test_terminfo(self): + self.assertIsInstance(curses.tigetflag('hc'), int) + self.assertEqual(curses.tigetflag('cols'), -1) + self.assertEqual(curses.tigetflag('cr'), -1) + + self.assertIsInstance(curses.tigetnum('cols'), int) + self.assertEqual(curses.tigetnum('hc'), -2) + self.assertEqual(curses.tigetnum('cr'), -2) + + self.assertIsInstance(curses.tigetstr('cr'), (bytes, type(None))) + self.assertIsNone(curses.tigetstr('hc')) + self.assertIsNone(curses.tigetstr('cols')) + + cud = curses.tigetstr('cud') + if cud is not None: + # See issue10570. + self.assertIsInstance(cud, bytes) + curses.tparm(cud, 2) + cud_2 = curses.tparm(cud, 2) + self.assertIsInstance(cud_2, bytes) + curses.putp(cud_2) + + curses.putp(b'abc\n') + + def test_misc_module_funcs(self): + curses.delay_output(1) + curses.flushinp() + + curses.doupdate() + self.assertIs(curses.isendwin(), False) + + curses.napms(100) + + curses.newpad(50, 50) + + def test_env_queries(self): + # TODO: term_attrs(), erasewchar(), killwchar() + self.assertIsInstance(curses.termname(), bytes) + self.assertIsInstance(curses.longname(), bytes) + self.assertIsInstance(curses.baudrate(), int) + self.assertIsInstance(curses.has_ic(), bool) + self.assertIsInstance(curses.has_il(), bool) + self.assertIsInstance(curses.termattrs(), int) + + c = curses.killchar() + self.assertIsInstance(c, bytes) + self.assertEqual(len(c), 1) + c = curses.erasechar() + self.assertIsInstance(c, bytes) + self.assertEqual(len(c), 1) + + def test_output_options(self): + stdscr = self.stdscr - win4 = stdscr.derwin(2,2) - win4 = stdscr.derwin(1,1, 5,5) - win4.mvderwin(9,9) + stdscr.clearok(True) + stdscr.clearok(False) - stdscr.echochar('a') - stdscr.echochar('a', curses.A_BOLD) - stdscr.hline('-', 5) - stdscr.hline('-', 5, curses.A_BOLD) - stdscr.hline(1,1,'-', 5) - stdscr.hline(1,1,'-', 5, curses.A_BOLD) + stdscr.idcok(True) + stdscr.idcok(False) + + stdscr.idlok(False) + stdscr.idlok(True) - stdscr.idcok(1) - stdscr.idlok(1) if hasattr(stdscr, 'immedok'): - stdscr.immedok(1) - stdscr.immedok(0) - stdscr.insch('c') - stdscr.insdelln(1) - stdscr.insnstr('abc', 3) - stdscr.insnstr('abc', 3, curses.A_BOLD) - stdscr.insnstr(5, 5, 'abc', 3) - stdscr.insnstr(5, 5, 'abc', 3, curses.A_BOLD) - - stdscr.insstr('def') - stdscr.insstr('def', curses.A_BOLD) - stdscr.insstr(5, 5, 'def') - stdscr.insstr(5, 5, 'def', curses.A_BOLD) - stdscr.is_linetouched(0) - stdscr.keypad(1) - stdscr.leaveok(1) - stdscr.move(3,3) - win.mvwin(2,2) - stdscr.nodelay(1) - stdscr.notimeout(1) - win2.overlay(win) - win2.overwrite(win) - win2.overlay(win, 1, 2, 2, 1, 3, 3) - win2.overwrite(win, 1, 2, 2, 1, 3, 3) - stdscr.redrawln(1,2) - - stdscr.scrollok(1) - stdscr.scroll() - stdscr.scroll(2) - stdscr.scroll(-3) - - stdscr.move(12, 2) - stdscr.setscrreg(10,15) - win3 = stdscr.subwin(10,10) - win3 = stdscr.subwin(10,10, 5,5) - if hasattr(stdscr, 'syncok') and not sys.platform.startswith("sunos"): - stdscr.syncok(1) - stdscr.timeout(5) - stdscr.touchline(5,5) - stdscr.touchline(5,5,0) - stdscr.vline('a', 3) - stdscr.vline('a', 3, curses.A_STANDOUT) - if hasattr(stdscr, 'chgat'): - stdscr.chgat(5, 2, 3, curses.A_BLINK) - stdscr.chgat(3, curses.A_BOLD) - stdscr.chgat(5, 8, curses.A_UNDERLINE) - stdscr.chgat(curses.A_BLINK) - stdscr.refresh() + stdscr.immedok(True) + stdscr.immedok(False) - stdscr.vline(1,1, 'a', 3) - stdscr.vline(1,1, 'a', 3, curses.A_STANDOUT) + stdscr.leaveok(True) + stdscr.leaveok(False) - if hasattr(stdscr, 'resize'): - stdscr.resize(25, 80) - if hasattr(stdscr, 'enclose'): - stdscr.enclose(10, 10) + stdscr.scrollok(True) + stdscr.scrollok(False) - self.assertRaises(ValueError, stdscr.getstr, -400) - self.assertRaises(ValueError, stdscr.getstr, 2, 3, -400) - self.assertRaises(ValueError, stdscr.instr, -2) - self.assertRaises(ValueError, stdscr.instr, 2, 3, -2) + stdscr.setscrreg(5, 10) - def test_embedded_null_chars(self): - # reject embedded null bytes and characters + curses.nonl() + curses.nl(True) + curses.nl(False) + curses.nl() + + + def test_input_options(self): stdscr = self.stdscr - for arg in ['a', b'a']: - with self.subTest(arg=arg): - self.assertRaises(ValueError, stdscr.addstr, 'a\0') - self.assertRaises(ValueError, stdscr.addnstr, 'a\0', 1) - self.assertRaises(ValueError, stdscr.insstr, 'a\0') - self.assertRaises(ValueError, stdscr.insnstr, 'a\0', 1) - - def test_module_funcs(self): - "Test module-level functions" - for func in [curses.baudrate, curses.beep, curses.can_change_color, - curses.cbreak, curses.def_prog_mode, curses.doupdate, - curses.flash, curses.flushinp, - curses.has_colors, curses.has_ic, curses.has_il, - curses.isendwin, curses.killchar, curses.longname, - curses.nocbreak, curses.noecho, curses.nonl, - curses.noqiflush, curses.noraw, - curses.reset_prog_mode, curses.termattrs, - curses.termname, curses.erasechar]: - with self.subTest(func=func.__qualname__): - func() - if hasattr(curses, 'filter'): - curses.filter() - if hasattr(curses, 'getsyx'): - curses.getsyx() - - # Functions that actually need arguments - if curses.tigetstr("cnorm"): - curses.curs_set(1) - curses.delay_output(1) - curses.echo() ; curses.echo(1) - with tempfile.TemporaryFile() as f: - self.stdscr.putwin(f) - f.seek(0) - curses.getwin(f) + if self.isatty: + curses.nocbreak() + curses.cbreak() + curses.cbreak(False) + curses.cbreak(True) + + curses.intrflush(True) + curses.intrflush(False) + curses.raw() + curses.raw(False) + curses.raw(True) + curses.noraw() + + curses.noecho() + curses.echo() + curses.echo(False) + curses.echo(True) + + curses.halfdelay(255) curses.halfdelay(1) - curses.intrflush(1) - curses.meta(1) - curses.napms(100) - curses.newpad(50,50) - win = curses.newwin(5,5) - win = curses.newwin(5,5, 1,1) - curses.nl() ; curses.nl(1) - curses.putp(b'abc') + + stdscr.keypad(True) + stdscr.keypad(False) + + curses.meta(True) + curses.meta(False) + + stdscr.nodelay(True) + stdscr.nodelay(False) + + curses.noqiflush() + curses.qiflush(True) + curses.qiflush(False) curses.qiflush() - curses.raw() ; curses.raw(1) - if hasattr(curses, 'setsyx'): - curses.setsyx(5,5) - curses.tigetflag('hc') - curses.tigetnum('co') - curses.tigetstr('cr') - curses.tparm(b'cr') - if hasattr(curses, 'typeahead'): - curses.typeahead(sys.__stdin__.fileno()) - curses.unctrl('a') - curses.ungetch('a') - if hasattr(curses, 'use_env'): - curses.use_env(1) - - # Functions only available on a few platforms - def test_colors_funcs(self): + + stdscr.notimeout(True) + stdscr.notimeout(False) + + stdscr.timeout(-1) + stdscr.timeout(0) + stdscr.timeout(5) + + @requires_curses_func('typeahead') + def test_typeahead(self): + curses.typeahead(sys.__stdin__.fileno()) + curses.typeahead(-1) + + def test_prog_mode(self): + if not self.isatty: + self.skipTest('requires terminal') + curses.def_prog_mode() + curses.reset_prog_mode() + + def test_beep(self): + if (curses.tigetstr("bel") is not None + or curses.tigetstr("flash") is not None): + curses.beep() + else: + try: + curses.beep() + except curses.error: + self.skipTest('beep() failed') + + def test_flash(self): + if (curses.tigetstr("bel") is not None + or curses.tigetstr("flash") is not None): + curses.flash() + else: + try: + curses.flash() + except curses.error: + self.skipTest('flash() failed') + + def test_curs_set(self): + for vis, cap in [(0, 'civis'), (2, 'cvvis'), (1, 'cnorm')]: + if curses.tigetstr(cap) is not None: + curses.curs_set(vis) + else: + try: + curses.curs_set(vis) + except curses.error: + pass + + @requires_curses_func('get_escdelay') + def test_escdelay(self): + escdelay = curses.get_escdelay() + self.assertIsInstance(escdelay, int) + curses.set_escdelay(25) + self.assertEqual(curses.get_escdelay(), 25) + curses.set_escdelay(escdelay) + + @requires_curses_func('get_tabsize') + def test_tabsize(self): + tabsize = curses.get_tabsize() + self.assertIsInstance(tabsize, int) + curses.set_tabsize(4) + self.assertEqual(curses.get_tabsize(), 4) + curses.set_tabsize(tabsize) + + @requires_curses_func('getsyx') + def test_getsyx(self): + y, x = curses.getsyx() + self.assertIsInstance(y, int) + self.assertIsInstance(x, int) + curses.setsyx(4, 5) + self.assertEqual(curses.getsyx(), (4, 5)) + + def bad_colors(self): + return (-2**31 - 1, 2**31, -2**63 - 1, 2**63, 2**64) + + def bad_pairs(self): + return (-2**31 - 1, 2**31, -2**63 - 1, 2**63, 2**64) + + def test_has_colors(self): + self.assertIsInstance(curses.has_colors(), bool) + self.assertIsInstance(curses.can_change_color(), bool) + + def test_start_color(self): if not curses.has_colors(): self.skipTest('requires colors support') curses.start_color() - curses.init_pair(2, 1,1) - curses.color_content(1) - curses.color_pair(2) - curses.pair_content(curses.COLOR_PAIRS - 1) - curses.pair_number(0) - - if hasattr(curses, 'use_default_colors'): + if verbose: + print(f'COLORS = {curses.COLORS}', file=sys.stderr) + print(f'COLOR_PAIRS = {curses.COLOR_PAIRS}', file=sys.stderr) + + @requires_colors + def test_color_content(self): + self.assertEqual(curses.color_content(curses.COLOR_BLACK), (0, 0, 0)) + curses.color_content(0) + maxcolor = min(curses.COLORS - 1, SHORT_MAX) + curses.color_content(maxcolor) + + for color in self.bad_colors(): + self.assertRaises(OverflowError, curses.color_content, color) + if curses.COLORS <= SHORT_MAX: + self.assertRaises(curses.error, curses.color_content, curses.COLORS) + self.assertRaises(curses.error, curses.color_content, -1) + + @requires_colors + def test_init_color(self): + if not curses.can_change_color(): + self.skipTest('cannot change color') + + old = curses.color_content(0) + try: + curses.init_color(0, *old) + except curses.error: + self.skipTest('cannot change color (init_color() failed)') + self.addCleanup(curses.init_color, 0, *old) + curses.init_color(0, 0, 0, 0) + self.assertEqual(curses.color_content(0), (0, 0, 0)) + curses.init_color(0, 1000, 1000, 1000) + self.assertEqual(curses.color_content(0), (1000, 1000, 1000)) + + maxcolor = min(curses.COLORS - 1, SHORT_MAX) + old = curses.color_content(maxcolor) + curses.init_color(maxcolor, *old) + self.addCleanup(curses.init_color, maxcolor, *old) + curses.init_color(maxcolor, 0, 500, 1000) + self.assertEqual(curses.color_content(maxcolor), (0, 500, 1000)) + + for color in self.bad_colors(): + self.assertRaises(OverflowError, curses.init_color, color, 0, 0, 0) + if curses.COLORS <= SHORT_MAX: + self.assertRaises(curses.error, curses.init_color, curses.COLORS, 0, 0, 0) + self.assertRaises(curses.error, curses.init_color, -1, 0, 0, 0) + for comp in (-1, 1001): + self.assertRaises(curses.error, curses.init_color, 0, comp, 0, 0) + self.assertRaises(curses.error, curses.init_color, 0, 0, comp, 0) + self.assertRaises(curses.error, curses.init_color, 0, 0, 0, comp) + + def get_pair_limit(self): + return min(curses.COLOR_PAIRS, SHORT_MAX) + + @requires_colors + def test_pair_content(self): + if not hasattr(curses, 'use_default_colors'): + self.assertEqual(curses.pair_content(0), + (curses.COLOR_WHITE, curses.COLOR_BLACK)) + curses.pair_content(0) + maxpair = self.get_pair_limit() - 1 + if maxpair > 0: + curses.pair_content(maxpair) + + for pair in self.bad_pairs(): + self.assertRaises(OverflowError, curses.pair_content, pair) + self.assertRaises(curses.error, curses.pair_content, -1) + + @requires_colors + def test_init_pair(self): + old = curses.pair_content(1) + curses.init_pair(1, *old) + self.addCleanup(curses.init_pair, 1, *old) + + curses.init_pair(1, 0, 0) + self.assertEqual(curses.pair_content(1), (0, 0)) + maxcolor = min(curses.COLORS - 1, SHORT_MAX) + curses.init_pair(1, maxcolor, 0) + self.assertEqual(curses.pair_content(1), (maxcolor, 0)) + curses.init_pair(1, 0, maxcolor) + self.assertEqual(curses.pair_content(1), (0, maxcolor)) + maxpair = self.get_pair_limit() - 1 + if maxpair > 1: + curses.init_pair(maxpair, 0, 0) + self.assertEqual(curses.pair_content(maxpair), (0, 0)) + + for pair in self.bad_pairs(): + self.assertRaises(OverflowError, curses.init_pair, pair, 0, 0) + self.assertRaises(curses.error, curses.init_pair, -1, 0, 0) + for color in self.bad_colors(): + self.assertRaises(OverflowError, curses.init_pair, 1, color, 0) + self.assertRaises(OverflowError, curses.init_pair, 1, 0, color) + if curses.COLORS <= SHORT_MAX: + self.assertRaises(curses.error, curses.init_pair, 1, curses.COLORS, 0) + self.assertRaises(curses.error, curses.init_pair, 1, 0, curses.COLORS) + + @requires_colors + def test_color_attrs(self): + for pair in 0, 1, 255: + attr = curses.color_pair(pair) + self.assertEqual(curses.pair_number(attr), pair, attr) + self.assertEqual(curses.pair_number(attr | curses.A_BOLD), pair) + self.assertEqual(curses.color_pair(0), 0) + self.assertEqual(curses.pair_number(0), 0) + + @requires_curses_func('use_default_colors') + @requires_colors + def test_use_default_colors(self): + old = curses.pair_content(0) + try: curses.use_default_colors() + except curses.error: + self.skipTest('cannot change color (use_default_colors() failed)') + self.assertEqual(curses.pair_content(0), (-1, -1)) + self.assertIn(old, [(curses.COLOR_WHITE, curses.COLOR_BLACK), (-1, -1), (0, 0)]) - @requires_curses_func('keyname') def test_keyname(self): - curses.keyname(13) + # TODO: key_name() + self.assertEqual(curses.keyname(65), b'A') + self.assertEqual(curses.keyname(13), b'^M') + self.assertEqual(curses.keyname(127), b'^?') + self.assertEqual(curses.keyname(0), b'^@') + self.assertRaises(ValueError, curses.keyname, -1) + self.assertIsInstance(curses.keyname(256), bytes) @requires_curses_func('has_key') def test_has_key(self): @@ -346,23 +1048,46 @@ def test_new_curses_panel(self): @requires_curses_func('is_term_resized') def test_is_term_resized(self): - curses.is_term_resized(*self.stdscr.getmaxyx()) + lines, cols = curses.LINES, curses.COLS + self.assertIs(curses.is_term_resized(lines, cols), False) + self.assertIs(curses.is_term_resized(lines-1, cols-1), True) @requires_curses_func('resize_term') def test_resize_term(self): - curses.resize_term(*self.stdscr.getmaxyx()) + curses.update_lines_cols() + lines, cols = curses.LINES, curses.COLS + new_lines = lines - 1 + new_cols = cols + 1 + curses.resize_term(new_lines, new_cols) + self.assertEqual(curses.LINES, new_lines) + self.assertEqual(curses.COLS, new_cols) + + curses.resize_term(lines, cols) + self.assertEqual(curses.LINES, lines) + self.assertEqual(curses.COLS, cols) @requires_curses_func('resizeterm') def test_resizeterm(self): - stdscr = self.stdscr + curses.update_lines_cols() lines, cols = curses.LINES, curses.COLS new_lines = lines - 1 new_cols = cols + 1 curses.resizeterm(new_lines, new_cols) - self.assertEqual(curses.LINES, new_lines) self.assertEqual(curses.COLS, new_cols) + curses.resizeterm(lines, cols) + self.assertEqual(curses.LINES, lines) + self.assertEqual(curses.COLS, cols) + + def test_ungetch(self): + curses.ungetch(b'A') + self.assertEqual(self.stdscr.getkey(), 'A') + curses.ungetch('B') + self.assertEqual(self.stdscr.getkey(), 'B') + curses.ungetch(67) + self.assertEqual(self.stdscr.getkey(), 'C') + def test_issue6243(self): curses.ungetch(1025) self.stdscr.getkey() @@ -391,10 +1116,6 @@ def test_unget_wch(self): read = stdscr.get_wch() self.assertEqual(read, ch) - def test_issue10570(self): - b = curses.tparm(curses.tigetstr("cup"), 5, 3) - self.assertIs(type(b), bytes) - def test_encoding(self): stdscr = self.stdscr import codecs @@ -434,30 +1155,31 @@ def test_issue21088(self): human_readable_signature = stdscr.addch.__doc__.split("\n")[0] self.assertIn("[y, x,]", human_readable_signature) + @requires_curses_window_meth('resize') def test_issue13051(self): - stdscr = self.stdscr - if not hasattr(stdscr, 'resize'): - raise unittest.SkipTest('requires curses.window.resize') - box = curses.textpad.Textbox(stdscr, insert_mode=True) - lines, cols = stdscr.getmaxyx() - stdscr.resize(lines-2, cols-2) + win = curses.newwin(5, 15, 2, 5) + box = curses.textpad.Textbox(win, insert_mode=True) + lines, cols = win.getmaxyx() + win.resize(lines-2, cols-2) # this may cause infinite recursion, leading to a RuntimeError box._insert_printable_char('a') class MiscTests(unittest.TestCase): - @requires_curses_func('update_lines_cols') def test_update_lines_cols(self): - # this doesn't actually test that LINES and COLS are updated, - # because we can't automate changing them. See Issue #4254 for - # a manual test script. We can only test that the function - # can be called. curses.update_lines_cols() + lines, cols = curses.LINES, curses.COLS + curses.LINES = curses.COLS = 0 + curses.update_lines_cols() + self.assertEqual(curses.LINES, lines) + self.assertEqual(curses.COLS, cols) @requires_curses_func('ncurses_version') def test_ncurses_version(self): v = curses.ncurses_version + if verbose: + print(f'ncurses_version = {curses.ncurses_version}', flush=True) self.assertIsInstance(v[:], tuple) self.assertEqual(len(v), 3) self.assertIsInstance(v[0], int) @@ -473,6 +1195,7 @@ def test_ncurses_version(self): self.assertGreaterEqual(v.minor, 0) self.assertGreaterEqual(v.patch, 0) + class TestAscii(unittest.TestCase): def test_controlnames(self): @@ -561,5 +1284,21 @@ def test_unctrl(self): self.assertEqual(unctrl(ord('\xc1')), '!A') +def lorem_ipsum(win): + text = [ + 'Lorem ipsum', + 'dolor sit amet,', + 'consectetur', + 'adipiscing elit,', + 'sed do eiusmod', + 'tempor incididunt', + 'ut labore et', + 'dolore magna', + 'aliqua.', + ] + maxy, maxx = win.getmaxyx() + for y, line in enumerate(text[:maxy]): + win.addstr(y, 0, line[:maxx - (y == maxy - 1)]) + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py index 21a7d7ec3fe3912debd585a17465f519eb3ca100..b20103bdce51cb78d904a97007ee98b8a6853a00 100755 --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses.py @@ -2028,7 +2028,7 @@ def test_docstring_one_field_with_default_none(self): class C: x: Union[int, type(None)] = None - self.assertDocStrEqual(C.__doc__, "C(x:Union[int, NoneType]=None)") + self.assertDocStrEqual(C.__doc__, "C(x:Optional[int]=None)") def test_docstring_list_field(self): @dataclass @@ -3134,13 +3134,6 @@ class C: self.assertEqual(c1.x, 3) self.assertEqual(c1.y, 2) - self.assertRaises(TypeError, replace) - self.assertRaises(TypeError, replace, c, c) - with self.assertWarns(DeprecationWarning): - c1 = replace(obj=c, x=3) - self.assertEqual(c1.x, 3) - self.assertEqual(c1.y, 2) - def test_frozen(self): @dataclass(frozen=True) class C: diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py index 1f37b5372a3e7e2be9e2a92309e22a96dbdd082f..fd62f37de18736b019e6fad9f33c831d2e4ca266 100644 --- a/Lib/test/test_decimal.py +++ b/Lib/test/test_decimal.py @@ -5201,6 +5201,7 @@ def test_c_signal_dict(self): DefaultContext = C.DefaultContext InvalidOperation = C.InvalidOperation + FloatOperation = C.FloatOperation DivisionByZero = C.DivisionByZero Overflow = C.Overflow Subnormal = C.Subnormal @@ -5274,6 +5275,7 @@ def assertIsExclusivelySet(signal, signal_dict): Underflow: C.DecUnderflow, Overflow: C.DecOverflow, DivisionByZero: C.DecDivisionByZero, + FloatOperation: C.DecFloatOperation, InvalidOperation: C.DecIEEEInvalidOperation } IntCond = [ @@ -5476,6 +5478,44 @@ def __abs__(self): self.assertEqual(Decimal.from_float(cls(101.1)), Decimal.from_float(101.1)) + # Issue 41540: + @unittest.skipIf(sys.platform.startswith("aix"), + "AIX: default ulimit: test is flaky because of extreme over-allocation") + def test_maxcontext_exact_arith(self): + + # Make sure that exact operations do not raise MemoryError due + # to huge intermediate values when the context precision is very + # large. + + # The following functions fill the available precision and are + # therefore not suitable for large precisions (by design of the + # specification). + MaxContextSkip = ['logical_invert', 'next_minus', 'next_plus', + 'logical_and', 'logical_or', 'logical_xor', + 'next_toward', 'rotate', 'shift'] + + Decimal = C.Decimal + Context = C.Context + localcontext = C.localcontext + + # Here only some functions that are likely candidates for triggering a + # MemoryError are tested. deccheck.py has an exhaustive test. + maxcontext = Context(prec=C.MAX_PREC, Emin=C.MIN_EMIN, Emax=C.MAX_EMAX) + with localcontext(maxcontext): + self.assertEqual(Decimal(0).exp(), 1) + self.assertEqual(Decimal(1).ln(), 0) + self.assertEqual(Decimal(1).log10(), 0) + self.assertEqual(Decimal(10**2).log10(), 2) + self.assertEqual(Decimal(10**223).log10(), 223) + self.assertEqual(Decimal(10**19).logb(), 19) + self.assertEqual(Decimal(4).sqrt(), 2) + self.assertEqual(Decimal("40E9").sqrt(), Decimal('2.0E+5')) + self.assertEqual(divmod(Decimal(10), 3), (3, 1)) + self.assertEqual(Decimal(10) // 3, 3) + self.assertEqual(Decimal(4) / 2, 2) + self.assertEqual(Decimal(400) ** -1, Decimal('0.0025')) + + @requires_docstrings @unittest.skipUnless(C, "test requires C version") class SignatureTest(unittest.TestCase): @@ -5600,13 +5640,13 @@ def doit(ty): args, kwds = mkargs(C, c_sig) try: getattr(c_type(9), attr)(*args, **kwds) - except Exception as err: + except Exception: raise TestFailed("invalid signature for %s: %s %s" % (c_func, args, kwds)) args, kwds = mkargs(P, p_sig) try: getattr(p_type(9), attr)(*args, **kwds) - except Exception as err: + except Exception: raise TestFailed("invalid signature for %s: %s %s" % (p_func, args, kwds)) doit('Decimal') diff --git a/Lib/test/test_decorators.py b/Lib/test/test_decorators.py index d0a2ec9fddb866d28e5ad1e17537d7ab9c776964..298979e509f8d8d445144a7e737b731f0716f4f6 100644 --- a/Lib/test/test_decorators.py +++ b/Lib/test/test_decorators.py @@ -151,21 +151,18 @@ def double(x): self.assertEqual(counts['double'], 4) def test_errors(self): - # Test syntax restrictions - these are all compile-time errors: - # - for expr in [ "1+2", "x[3]", "(1, 2)" ]: - # Sanity check: is expr is a valid expression by itself? - compile(expr, "testexpr", "exec") - - codestr = "@%s\ndef f(): pass" % expr - self.assertRaises(SyntaxError, compile, codestr, "test", "exec") - # You can't put multiple decorators on a single line: - # - self.assertRaises(SyntaxError, compile, - "@f1 @f2\ndef f(): pass", "test", "exec") + # Test SyntaxErrors: + for stmt in ("x,", "x, y", "x = y", "pass", "import sys"): + compile(stmt, "test", "exec") # Sanity check. + with self.assertRaises(SyntaxError): + compile(f"@{stmt}\ndef f(): pass", "test", "exec") - # Test runtime errors + # Test TypeErrors that used to be SyntaxErrors: + for expr in ("1.+2j", "[1, 2][-1]", "(1, 2)", "True", "...", "None"): + compile(expr, "test", "eval") # Sanity check. + with self.assertRaises(TypeError): + exec(f"@{expr}\ndef f(): pass") def unimp(func): raise NotImplementedError @@ -179,6 +176,13 @@ def unimp(func): code = compile(codestr, "test", "exec") self.assertRaises(exc, eval, code, context) + def test_expressions(self): + for expr in ( + "(x,)", "(x, y)", "x := y", "(x := y)", "x @y", "(x @ y)", "x[0]", + "w[x].y.z", "w + x - (y + z)", "x(y)()(z)", "[w, x, y][z]", "x.y", + ): + compile(f"@{expr}\ndef f(): pass", "test", "exec") + def test_double(self): class C(object): @funcattrs(abc=1, xyz="haha") @@ -265,6 +269,45 @@ def bar(): return 42 self.assertEqual(bar(), 42) self.assertEqual(actions, expected_actions) + def test_wrapped_descriptor_inside_classmethod(self): + class BoundWrapper: + def __init__(self, wrapped): + self.__wrapped__ = wrapped + + def __call__(self, *args, **kwargs): + return self.__wrapped__(*args, **kwargs) + + class Wrapper: + def __init__(self, wrapped): + self.__wrapped__ = wrapped + + def __get__(self, instance, owner): + bound_function = self.__wrapped__.__get__(instance, owner) + return BoundWrapper(bound_function) + + def decorator(wrapped): + return Wrapper(wrapped) + + class Class: + @decorator + @classmethod + def inner(cls): + # This should already work. + return 'spam' + + @classmethod + @decorator + def outer(cls): + # Raised TypeError with a message saying that the 'Wrapper' + # object is not callable. + return 'eggs' + + self.assertEqual(Class.inner(), 'spam') + self.assertEqual(Class.outer(), 'eggs') + self.assertEqual(Class().inner(), 'spam') + self.assertEqual(Class().outer(), 'eggs') + + class TestClassDecorators(unittest.TestCase): def test_simple(self): diff --git a/Lib/test/test_defaultdict.py b/Lib/test/test_defaultdict.py index b9f1fb9f23d39d27b92e88df16c3ab439ca60db0..b48c649fce6ba1cb5e4df20d48cd3b39de459c86 100644 --- a/Lib/test/test_defaultdict.py +++ b/Lib/test/test_defaultdict.py @@ -183,5 +183,43 @@ def test_pickling(self): o = pickle.loads(s) self.assertEqual(d, o) + def test_union(self): + i = defaultdict(int, {1: 1, 2: 2}) + s = defaultdict(str, {0: "zero", 1: "one"}) + + i_s = i | s + self.assertIs(i_s.default_factory, int) + self.assertDictEqual(i_s, {1: "one", 2: 2, 0: "zero"}) + self.assertEqual(list(i_s), [1, 2, 0]) + + s_i = s | i + self.assertIs(s_i.default_factory, str) + self.assertDictEqual(s_i, {0: "zero", 1: 1, 2: 2}) + self.assertEqual(list(s_i), [0, 1, 2]) + + i_ds = i | dict(s) + self.assertIs(i_ds.default_factory, int) + self.assertDictEqual(i_ds, {1: "one", 2: 2, 0: "zero"}) + self.assertEqual(list(i_ds), [1, 2, 0]) + + ds_i = dict(s) | i + self.assertIs(ds_i.default_factory, int) + self.assertDictEqual(ds_i, {0: "zero", 1: 1, 2: 2}) + self.assertEqual(list(ds_i), [0, 1, 2]) + + with self.assertRaises(TypeError): + i | list(s.items()) + with self.assertRaises(TypeError): + list(s.items()) | i + + # We inherit a fine |= from dict, so just a few sanity checks here: + i |= list(s.items()) + self.assertIs(i.default_factory, int) + self.assertDictEqual(i, {1: "one", 2: 2, 0: "zero"}) + self.assertEqual(list(i), [1, 2, 0]) + + with self.assertRaises(TypeError): + i |= None + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 18397a86b14c5e57a5e392ff7f5351e41e46d65c..c7a191bccd69c40256dd88dfd3681bd5a4cda979 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4,6 +4,8 @@ import itertools import math import pickle +import random +import string import sys import types import unittest @@ -845,6 +847,14 @@ class Module(types.ModuleType, str): self.fail("inheriting from ModuleType and str at the same time " "should fail") + # Issue 34805: Verify that definition order is retained + def random_name(): + return ''.join(random.choices(string.ascii_letters, k=10)) + class A: + pass + subclasses = [type(random_name(), (A,), {}) for i in range(100)] + self.assertEqual(A.__subclasses__(), subclasses) + def test_multiple_inheritance(self): # Testing multiple inheritance... class C(object): @@ -1613,8 +1623,8 @@ class SubSpam(spam.spamlist): pass spam_cm(spam.spamlist()) self.assertEqual( str(cm.exception), - "descriptor 'classmeth' requires a type " - "but received a 'xxsubtype.spamlist' instance") + "descriptor 'classmeth' for type 'xxsubtype.spamlist' " + "needs a type, not a 'xxsubtype.spamlist' as arg 2") with self.assertRaises(TypeError) as cm: spam_cm(list) @@ -1967,7 +1977,7 @@ def test_methods_in_c(self): # different error messages. set_add = set.add - expected_errmsg = "descriptor 'add' of 'set' object needs an argument" + expected_errmsg = "unbound method set.add() needs an argument" with self.assertRaises(TypeError) as cm: set_add() @@ -2526,9 +2536,9 @@ def getdict(self): except TypeError: pass - # Two essentially featureless objects, just inheriting stuff from - # object. - self.assertEqual(dir(NotImplemented), dir(Ellipsis)) + # Two essentially featureless objects, (Ellipsis just inherits stuff + # from object. + self.assertEqual(dir(object()), dir(Ellipsis)) # Nasty test case for proxied objects class Wrapper(object): diff --git a/Lib/test/test_descrtut.py b/Lib/test/test_descrtut.py index b84d6447850a069435e508f2177826449375a342..8e25f58d7aa20ef76509d3605bc95a98ab6788e4 100644 --- a/Lib/test/test_descrtut.py +++ b/Lib/test/test_descrtut.py @@ -167,6 +167,7 @@ def merge(self, other): >>> pprint.pprint(dir(list)) # like list.__dict__.keys(), but sorted ['__add__', '__class__', + '__class_getitem__', '__contains__', '__delattr__', '__delitem__', diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py index de483ab552155a53c34b200cddd6529f9023d36b..b10c07534ddb21a6a803536030a699aeaf979df8 100644 --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -37,6 +37,38 @@ def test_literal_constructor(self): dictliteral = '{' + ', '.join(formatted_items) + '}' self.assertEqual(eval(dictliteral), dict(items)) + def test_merge_operator(self): + + a = {0: 0, 1: 1, 2: 1} + b = {1: 1, 2: 2, 3: 3} + + c = a.copy() + c |= b + + self.assertEqual(a | b, {0: 0, 1: 1, 2: 2, 3: 3}) + self.assertEqual(c, {0: 0, 1: 1, 2: 2, 3: 3}) + + c = b.copy() + c |= a + + self.assertEqual(b | a, {1: 1, 2: 1, 3: 3, 0: 0}) + self.assertEqual(c, {1: 1, 2: 1, 3: 3, 0: 0}) + + c = a.copy() + c |= [(1, 1), (2, 2), (3, 3)] + + self.assertEqual(c, {0: 0, 1: 1, 2: 2, 3: 3}) + + self.assertIs(a.__or__(None), NotImplemented) + self.assertIs(a.__or__(()), NotImplemented) + self.assertIs(a.__or__("BAD"), NotImplemented) + self.assertIs(a.__or__(""), NotImplemented) + + self.assertRaises(TypeError, a.__ior__, None) + self.assertEqual(a.__ior__(()), {0: 0, 1: 1, 2: 1}) + self.assertRaises(ValueError, a.__ior__, "BAD") + self.assertEqual(a.__ior__(""), {0: 0, 1: 1, 2: 1}) + def test_bool(self): self.assertIs(not {}, True) self.assertTrue({1: 2}) @@ -1292,6 +1324,19 @@ def __eq__(self, other): d = {0: set()} (0, X()) in d.items() + def test_dict_contain_use_after_free(self): + # bpo-40489 + class S(str): + def __eq__(self, other): + d.clear() + return NotImplemented + + def __hash__(self): + return hash('test') + + d = {S(): 'value'} + self.assertFalse('test' in d) + def test_init_use_after_free(self): class X: def __hash__(self): @@ -1377,6 +1422,25 @@ def items(self): d = CustomReversedDict(pairs) self.assertEqual(pairs[::-1], list(dict(d).items())) + @support.cpython_only + def test_dict_items_result_gc(self): + # bpo-42536: dict.items's tuple-reuse speed trick breaks the GC's + # assumptions about what can be untracked. Make sure we re-track result + # tuples whenever we reuse them. + it = iter({None: []}.items()) + gc.collect() + # That GC collection probably untracked the recycled internal result + # tuple, which is initialized to (None, None). Make sure it's re-tracked + # when it's mutated and returned from __next__: + self.assertTrue(gc.is_tracked(next(it))) + + @support.cpython_only + def test_dict_items_result_gc(self): + # Same as test_dict_items_result_gc above, but reversed. + it = reversed({None: []}.items()) + gc.collect() + self.assertTrue(gc.is_tracked(next(it))) + class CAPITest(unittest.TestCase): diff --git a/Lib/test/test_dict_version.py b/Lib/test/test_dict_version.py index cb79e7434c29d4f17858e00a655bd198b6b9e7e5..b23786514f82e9cf1d07e3548ec98f6b137aa31c 100644 --- a/Lib/test/test_dict_version.py +++ b/Lib/test/test_dict_version.py @@ -98,20 +98,25 @@ def __eq__(self, other): value2 = AlwaysEqual() self.assertTrue(value1 == value2) self.assertFalse(value1 != value2) + self.assertIsNot(value1, value2) d = self.new_dict() self.check_version_changed(d, d.__setitem__, 'key', value1) + self.assertIs(d['key'], value1) # setting a key to a value equal to the current value # with dict.__setitem__() must change the version self.check_version_changed(d, d.__setitem__, 'key', value2) + self.assertIs(d['key'], value2) # setting a key to a value equal to the current value # with dict.update() must change the version self.check_version_changed(d, d.update, key=value1) + self.assertIs(d['key'], value1) d2 = self.new_dict(key=value2) self.check_version_changed(d, d.update, d2) + self.assertIs(d['key'], value2) def test_setdefault(self): d = self.new_dict() diff --git a/Lib/test/test_dictcomps.py b/Lib/test/test_dictcomps.py index 927e3103e664b0a677794b2d653c913231ae1d7b..472e3dfa0d8a0a61dd1162783b89fd4f3d9f6f5a 100644 --- a/Lib/test/test_dictcomps.py +++ b/Lib/test/test_dictcomps.py @@ -77,7 +77,7 @@ def test_illegal_assignment(self): compile("{x: y for y, x in ((1, 2), (3, 4))} = 5", "", "exec") - with self.assertRaisesRegex(SyntaxError, "cannot assign"): + with self.assertRaisesRegex(SyntaxError, "illegal expression"): compile("{x: y for y, x in ((1, 2), (3, 4))} += 5", "", "exec") @@ -111,5 +111,22 @@ def add_call(pos, value): self.assertEqual(actual, expected) self.assertEqual(actual_calls, expected_calls) + def test_assignment_idiom_in_comprehensions(self): + expected = {1: 1, 2: 4, 3: 9, 4: 16} + actual = {j: j*j for i in range(4) for j in [i+1]} + self.assertEqual(actual, expected) + expected = {3: 2, 5: 6, 7: 12, 9: 20} + actual = {j+k: j*k for i in range(4) for j in [i+1] for k in [j+1]} + self.assertEqual(actual, expected) + expected = {3: 2, 5: 6, 7: 12, 9: 20} + actual = {j+k: j*k for i in range(4) for j, k in [(i+1, i+2)]} + self.assertEqual(actual, expected) + + def test_star_expression(self): + expected = {0: 0, 1: 1, 2: 4, 3: 9} + self.assertEqual({i: i*i for i in [*range(4)]}, expected) + self.assertEqual({i: i*i for i in (*range(4),)}, expected) + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_dictviews.py b/Lib/test/test_dictviews.py index 2763cbfb4bbc64f12d19cc28092901c08dea4b95..be271bebaaf1fffe1d955f4cfa817b2af650c795 100644 --- a/Lib/test/test_dictviews.py +++ b/Lib/test/test_dictviews.py @@ -92,6 +92,12 @@ def test_keys_set_operations(self): d1 = {'a': 1, 'b': 2} d2 = {'b': 3, 'c': 2} d3 = {'d': 4, 'e': 5} + d4 = {'d': 4} + + class CustomSet(set): + def intersection(self, other): + return CustomSet(super().intersection(other)) + self.assertEqual(d1.keys() & d1.keys(), {'a', 'b'}) self.assertEqual(d1.keys() & d2.keys(), {'b'}) self.assertEqual(d1.keys() & d3.keys(), set()) @@ -99,6 +105,14 @@ def test_keys_set_operations(self): self.assertEqual(d1.keys() & set(d2.keys()), {'b'}) self.assertEqual(d1.keys() & set(d3.keys()), set()) self.assertEqual(d1.keys() & tuple(d1.keys()), {'a', 'b'}) + self.assertEqual(d3.keys() & d4.keys(), {'d'}) + self.assertEqual(d4.keys() & d3.keys(), {'d'}) + self.assertEqual(d4.keys() & set(d3.keys()), {'d'}) + self.assertIsInstance(d4.keys() & frozenset(d3.keys()), set) + self.assertIsInstance(frozenset(d3.keys()) & d4.keys(), set) + self.assertIs(type(d4.keys() & CustomSet(d3.keys())), set) + self.assertIs(type(d1.keys() & []), set) + self.assertIs(type([] & d1.keys()), set) self.assertEqual(d1.keys() | d1.keys(), {'a', 'b'}) self.assertEqual(d1.keys() | d2.keys(), {'a', 'b', 'c'}) @@ -200,6 +214,38 @@ def test_items_set_operations(self): self.assertTrue(de.items().isdisjoint(de.items())) self.assertTrue(de.items().isdisjoint([1])) + def test_set_operations_with_iterator(self): + origin = {1: 2, 3: 4} + self.assertEqual(origin.keys() & iter([1, 2]), {1}) + self.assertEqual(origin.keys() | iter([1, 2]), {1, 2, 3}) + self.assertEqual(origin.keys() ^ iter([1, 2]), {2, 3}) + self.assertEqual(origin.keys() - iter([1, 2]), {3}) + + items = origin.items() + self.assertEqual(items & iter([(1, 2)]), {(1, 2)}) + self.assertEqual(items ^ iter([(1, 2)]), {(3, 4)}) + self.assertEqual(items | iter([(1, 2)]), {(1, 2), (3, 4)}) + self.assertEqual(items - iter([(1, 2)]), {(3, 4)}) + + def test_set_operations_with_noniterable(self): + with self.assertRaises(TypeError): + {}.keys() & 1 + with self.assertRaises(TypeError): + {}.keys() | 1 + with self.assertRaises(TypeError): + {}.keys() ^ 1 + with self.assertRaises(TypeError): + {}.keys() - 1 + + with self.assertRaises(TypeError): + {}.items() & 1 + with self.assertRaises(TypeError): + {}.items() | 1 + with self.assertRaises(TypeError): + {}.items() ^ 1 + with self.assertRaises(TypeError): + {}.items() - 1 + def test_recursive_repr(self): d = {} d[42] = d.values() diff --git a/Lib/test/test_difflib.py b/Lib/test/test_difflib.py index 5e2ca1a23b928ba41e467896da341c83993a9906..42ac1fdcd81cdce81623f59521493bc77b4decb0 100644 --- a/Lib/test/test_difflib.py +++ b/Lib/test/test_difflib.py @@ -501,12 +501,58 @@ def test_is_character_junk_false(self): for char in ['a', '#', '\n', '\f', '\r', '\v']: self.assertFalse(difflib.IS_CHARACTER_JUNK(char), repr(char)) +class TestFindLongest(unittest.TestCase): + def longer_match_exists(self, a, b, n): + return any(b_part in a for b_part in + [b[i:i + n + 1] for i in range(0, len(b) - n - 1)]) + + def test_default_args(self): + a = 'foo bar' + b = 'foo baz bar' + sm = difflib.SequenceMatcher(a=a, b=b) + match = sm.find_longest_match() + self.assertEqual(match.a, 0) + self.assertEqual(match.b, 0) + self.assertEqual(match.size, 6) + self.assertEqual(a[match.a: match.a + match.size], + b[match.b: match.b + match.size]) + self.assertFalse(self.longer_match_exists(a, b, match.size)) + + match = sm.find_longest_match(alo=2, blo=4) + self.assertEqual(match.a, 3) + self.assertEqual(match.b, 7) + self.assertEqual(match.size, 4) + self.assertEqual(a[match.a: match.a + match.size], + b[match.b: match.b + match.size]) + self.assertFalse(self.longer_match_exists(a[2:], b[4:], match.size)) + + match = sm.find_longest_match(bhi=5, blo=1) + self.assertEqual(match.a, 1) + self.assertEqual(match.b, 1) + self.assertEqual(match.size, 4) + self.assertEqual(a[match.a: match.a + match.size], + b[match.b: match.b + match.size]) + self.assertFalse(self.longer_match_exists(a, b[1:5], match.size)) + + def test_longest_match_with_popular_chars(self): + a = 'dabcd' + b = 'd'*100 + 'abc' + 'd'*100 # length over 200 so popular used + sm = difflib.SequenceMatcher(a=a, b=b) + match = sm.find_longest_match(0, len(a), 0, len(b)) + self.assertEqual(match.a, 0) + self.assertEqual(match.b, 99) + self.assertEqual(match.size, 5) + self.assertEqual(a[match.a: match.a + match.size], + b[match.b: match.b + match.size]) + self.assertFalse(self.longer_match_exists(a, b, match.size)) + + def test_main(): difflib.HtmlDiff._default_prefix = 0 Doctests = doctest.DocTestSuite(difflib) run_unittest( TestWithAscii, TestAutojunk, TestSFpatches, TestSFbugs, - TestOutputFormat, TestBytes, TestJunkAPIs, Doctests) + TestOutputFormat, TestBytes, TestJunkAPIs, TestFindLongest, Doctests) if __name__ == '__main__': test_main() diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 03b2860166322d021f5268945f1d3f962f0f76a9..ac5836d288978ceed69fad68e4537ca11c062ed9 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -1,7 +1,7 @@ # Minimal tests for dis module from test.support import captured_stdout -from test.bytecode_helper import BytecodeTestCase +from test.support.bytecode_helper import BytecodeTestCase import unittest import sys import dis @@ -147,7 +147,7 @@ def bug1333982(x=[]): dis_bug1333982 = """\ %3d 0 LOAD_CONST 1 (0) 2 POP_JUMP_IF_TRUE 26 - 4 LOAD_GLOBAL 0 (AssertionError) + 4 LOAD_ASSERTION_ERROR 6 LOAD_CONST 2 ( at 0x..., file "%s", line %d>) 8 LOAD_CONST 3 ('bug1333982..') 10 MAKE_FUNCTION 0 @@ -278,32 +278,33 @@ def bug1333982(x=[]): --> 6 BINARY_TRUE_DIVIDE 8 POP_TOP 10 POP_BLOCK - 12 JUMP_FORWARD 40 (to 54) + 12 JUMP_FORWARD 42 (to 56) %3d >> 14 DUP_TOP 16 LOAD_GLOBAL 0 (Exception) - 18 COMPARE_OP 10 (exception match) - 20 POP_JUMP_IF_FALSE 52 - 22 POP_TOP - 24 STORE_FAST 0 (e) - 26 POP_TOP - 28 SETUP_FINALLY 10 (to 40) - -%3d 30 LOAD_FAST 0 (e) - 32 LOAD_ATTR 1 (__traceback__) - 34 STORE_FAST 1 (tb) - 36 POP_BLOCK - 38 BEGIN_FINALLY - >> 40 LOAD_CONST 0 (None) - 42 STORE_FAST 0 (e) - 44 DELETE_FAST 0 (e) - 46 END_FINALLY - 48 POP_EXCEPT - 50 JUMP_FORWARD 2 (to 54) - >> 52 END_FINALLY - -%3d >> 54 LOAD_FAST 1 (tb) - 56 RETURN_VALUE + 18 JUMP_IF_NOT_EXC_MATCH 54 + 20 POP_TOP + 22 STORE_FAST 0 (e) + 24 POP_TOP + 26 SETUP_FINALLY 18 (to 46) + +%3d 28 LOAD_FAST 0 (e) + 30 LOAD_ATTR 1 (__traceback__) + 32 STORE_FAST 1 (tb) + 34 POP_BLOCK + 36 POP_EXCEPT + 38 LOAD_CONST 0 (None) + 40 STORE_FAST 0 (e) + 42 DELETE_FAST 0 (e) + 44 JUMP_FORWARD 10 (to 56) + >> 46 LOAD_CONST 0 (None) + 48 STORE_FAST 0 (e) + 50 DELETE_FAST 0 (e) + 52 RERAISE + >> 54 RERAISE + +%3d >> 56 LOAD_FAST 1 (tb) + 58 RETURN_VALUE """ % (TRACEBACK_CODE.co_firstlineno + 1, TRACEBACK_CODE.co_firstlineno + 2, TRACEBACK_CODE.co_firstlineno + 3, @@ -331,6 +332,68 @@ def _fstring(a, b, c, d): 28 RETURN_VALUE """ % (_fstring.__code__.co_firstlineno + 1,) +def _tryfinally(a, b): + try: + return a + finally: + b() + +def _tryfinallyconst(b): + try: + return 1 + finally: + b() + +dis_tryfinally = """\ +%3d 0 SETUP_FINALLY 12 (to 14) + +%3d 2 LOAD_FAST 0 (a) + 4 POP_BLOCK + +%3d 6 LOAD_FAST 1 (b) + 8 CALL_FUNCTION 0 + 10 POP_TOP + +%3d 12 RETURN_VALUE + +%3d >> 14 LOAD_FAST 1 (b) + 16 CALL_FUNCTION 0 + 18 POP_TOP + 20 RERAISE + 22 LOAD_CONST 0 (None) + 24 RETURN_VALUE +""" % (_tryfinally.__code__.co_firstlineno + 1, + _tryfinally.__code__.co_firstlineno + 2, + _tryfinally.__code__.co_firstlineno + 4, + _tryfinally.__code__.co_firstlineno + 2, + _tryfinally.__code__.co_firstlineno + 4, + ) + +dis_tryfinallyconst = """\ +%3d 0 SETUP_FINALLY 12 (to 14) + +%3d 2 POP_BLOCK + +%3d 4 LOAD_FAST 0 (b) + 6 CALL_FUNCTION 0 + 8 POP_TOP + +%3d 10 LOAD_CONST 1 (1) + 12 RETURN_VALUE + +%3d >> 14 LOAD_FAST 0 (b) + 16 CALL_FUNCTION 0 + 18 POP_TOP + 20 RERAISE + 22 LOAD_CONST 0 (None) + 24 RETURN_VALUE +""" % (_tryfinallyconst.__code__.co_firstlineno + 1, + _tryfinallyconst.__code__.co_firstlineno + 2, + _tryfinallyconst.__code__.co_firstlineno + 4, + _tryfinallyconst.__code__.co_firstlineno + 2, + _tryfinallyconst.__code__.co_firstlineno + 4, + ) + def _g(x): yield x @@ -442,7 +505,8 @@ def test_boundaries(self): def test_widths(self): for opcode, opname in enumerate(dis.opname): if opname in ('BUILD_MAP_UNPACK_WITH_CALL', - 'BUILD_TUPLE_UNPACK_WITH_CALL'): + 'BUILD_TUPLE_UNPACK_WITH_CALL', + 'JUMP_IF_NOT_EXC_MATCH'): continue with self.subTest(opname=opname): width = dis._OPNAME_WIDTH @@ -561,6 +625,10 @@ def test_disassemble_coroutine(self): def test_disassemble_fstring(self): self.do_disassembly_test(_fstring, dis_fstring) + def test_disassemble_try_finally(self): + self.do_disassembly_test(_tryfinally, dis_tryfinally) + self.do_disassembly_test(_tryfinallyconst, dis_tryfinallyconst) + def test_dis_none(self): try: del sys.last_traceback @@ -752,7 +820,7 @@ async def async_def(): Positional-only arguments: 0 Kw-only arguments: 0 Number of locals: 2 -Stack size: 10 +Stack size: 9 Flags: OPTIMIZED, NEWLOCALS, NOFREE, COROUTINE Constants: 0: None @@ -977,49 +1045,62 @@ def jumpy(): Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=96, starts_line=None, is_jump_target=False), Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=98, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=100, starts_line=None, is_jump_target=False), - Instruction(opname='SETUP_FINALLY', opcode=122, arg=70, argval=174, argrepr='to 174', offset=102, starts_line=20, is_jump_target=True), + Instruction(opname='SETUP_FINALLY', opcode=122, arg=96, argval=200, argrepr='to 200', offset=102, starts_line=20, is_jump_target=True), Instruction(opname='SETUP_FINALLY', opcode=122, arg=12, argval=118, argrepr='to 118', offset=104, starts_line=None, is_jump_target=False), Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=106, starts_line=21, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval=0, argrepr='0', offset=108, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=108, starts_line=None, is_jump_target=False), Instruction(opname='BINARY_TRUE_DIVIDE', opcode=27, arg=None, argval=None, argrepr='', offset=110, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=112, starts_line=None, is_jump_target=False), Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=114, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=28, argval=146, argrepr='to 146', offset=116, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=26, argval=144, argrepr='to 144', offset=116, starts_line=None, is_jump_target=False), Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=118, starts_line=22, is_jump_target=True), Instruction(opname='LOAD_GLOBAL', opcode=116, arg=2, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=120, starts_line=None, is_jump_target=False), - Instruction(opname='COMPARE_OP', opcode=107, arg=10, argval='exception match', argrepr='exception match', offset=122, starts_line=None, is_jump_target=False), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=144, argval=144, argrepr='', offset=124, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_IF_NOT_EXC_MATCH', opcode=121, arg=142, argval=142, argrepr='', offset=122, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=124, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=126, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=128, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=130, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=132, starts_line=23, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=134, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=136, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=138, starts_line=None, is_jump_target=False), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=140, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=26, argval=170, argrepr='to 170', offset=142, starts_line=None, is_jump_target=False), - Instruction(opname='END_FINALLY', opcode=88, arg=None, argval=None, argrepr='', offset=144, starts_line=None, is_jump_target=True), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=146, starts_line=25, is_jump_target=True), - Instruction(opname='SETUP_WITH', opcode=143, arg=14, argval=164, argrepr='to 164', offset=148, starts_line=None, is_jump_target=False), - Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=150, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=152, starts_line=26, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval='Never reach this', argrepr="'Never reach this'", offset=154, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=156, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=158, starts_line=None, is_jump_target=False), - Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=160, starts_line=None, is_jump_target=False), - Instruction(opname='BEGIN_FINALLY', opcode=53, arg=None, argval=None, argrepr='', offset=162, starts_line=None, is_jump_target=False), - Instruction(opname='WITH_CLEANUP_START', opcode=81, arg=None, argval=None, argrepr='', offset=164, starts_line=None, is_jump_target=True), - Instruction(opname='WITH_CLEANUP_FINISH', opcode=82, arg=None, argval=None, argrepr='', offset=166, starts_line=None, is_jump_target=False), - Instruction(opname='END_FINALLY', opcode=88, arg=None, argval=None, argrepr='', offset=168, starts_line=None, is_jump_target=False), - Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=170, starts_line=None, is_jump_target=True), - Instruction(opname='BEGIN_FINALLY', opcode=53, arg=None, argval=None, argrepr='', offset=172, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=174, starts_line=28, is_jump_target=True), - Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=176, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=178, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=130, starts_line=23, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=132, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=134, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=136, starts_line=None, is_jump_target=False), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=138, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=46, argval=188, argrepr='to 188', offset=140, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=142, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=144, starts_line=25, is_jump_target=True), + Instruction(opname='SETUP_WITH', opcode=143, arg=24, argval=172, argrepr='to 172', offset=146, starts_line=None, is_jump_target=False), + Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=148, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=150, starts_line=26, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Never reach this', argrepr="'Never reach this'", offset=152, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=154, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=156, starts_line=None, is_jump_target=False), + Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=158, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=160, starts_line=None, is_jump_target=False), + Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=162, starts_line=None, is_jump_target=False), + Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=164, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=3, argval=3, argrepr='', offset=166, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=168, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=16, argval=188, argrepr='to 188', offset=170, starts_line=None, is_jump_target=False), + Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=172, starts_line=None, is_jump_target=True), + Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=178, argval=178, argrepr='', offset=174, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=176, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=178, starts_line=None, is_jump_target=True), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=180, starts_line=None, is_jump_target=False), - Instruction(opname='END_FINALLY', opcode=88, arg=None, argval=None, argrepr='', offset=182, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=184, starts_line=None, is_jump_target=False), - Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=186, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=182, starts_line=None, is_jump_target=False), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=184, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=186, starts_line=None, is_jump_target=False), + Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=188, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=190, starts_line=28, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=192, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=194, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=196, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=10, argval=210, argrepr='to 210', offset=198, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=200, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=202, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=204, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=206, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=208, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=210, starts_line=None, is_jump_target=True), + Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=212, starts_line=None, is_jump_target=False), ] # One last piece of inspect fodder to check the default line number handling @@ -1032,6 +1113,10 @@ def simple(): pass class InstructionTests(BytecodeTestCase): + def __init__(self, *args): + super().__init__(*args) + self.maxDiff = None + def test_default_first_line(self): actual = dis.get_instructions(simple) self.assertEqual(list(actual), expected_opinfo_simple) @@ -1063,6 +1148,7 @@ def test_jumpy(self): # get_instructions has its own tests above, so can rely on it to validate # the object oriented API class BytecodeTests(unittest.TestCase): + def test_instantiation(self): # Test with function, method, code string and code object for obj in [_f, _C(1).__init__, "a=1", _f.__code__]: diff --git a/Lib/test/test_distutils.py b/Lib/test/test_distutils.py index d613abe453b56dde4f4e5b73db40f45638017757..a37f11791754d2645a127d26d9db8940465bd088 100644 --- a/Lib/test/test_distutils.py +++ b/Lib/test/test_distutils.py @@ -10,9 +10,15 @@ def test_main(): + # used by regrtest test.support.run_unittest(distutils.tests.test_suite()) test.support.reap_children() +def load_tests(*_): + # used by unittest + return distutils.tests.test_suite() + + if __name__ == "__main__": test_main() diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py index ad30a051b59c6ba2373415e2e0d6fdda33c963a5..3efe5dafc20ad14da32bbf5be11bc5d461005d44 100644 --- a/Lib/test/test_doctest.py +++ b/Lib/test/test_doctest.py @@ -665,7 +665,7 @@ def non_Python_modules(): r""" >>> import builtins >>> tests = doctest.DocTestFinder().find(builtins) - >>> 800 < len(tests) < 820 # approximate number of objects with docstrings + >>> 816 < len(tests) < 836 # approximate number of objects with docstrings True >>> real_tests = [t for t in tests if len(t.examples) > 0] >>> len(real_tests) # objects that actually have doctests @@ -2494,7 +2494,7 @@ def test_unittest_reportflags(): def test_testfile(): r""" Tests for the `testfile()` function. This function runs all the -doctest examples in a given file. In its simple invokation, it is +doctest examples in a given file. In its simple invocation, it is called with the name of a file, which is taken to be relative to the calling module. The return value is (#failures, #tests). diff --git a/Lib/test/test_dummy_thread.py b/Lib/test/test_dummy_thread.py deleted file mode 100644 index 0f56fcf9733638b5c480456926c478ef31421b77..0000000000000000000000000000000000000000 --- a/Lib/test/test_dummy_thread.py +++ /dev/null @@ -1,276 +0,0 @@ -import _dummy_thread as _thread -import time -import queue -import random -import unittest -from test import support -from unittest import mock - -DELAY = 0 - - -class LockTests(unittest.TestCase): - """Test lock objects.""" - - def setUp(self): - # Create a lock - self.lock = _thread.allocate_lock() - - def test_initlock(self): - #Make sure locks start locked - self.assertFalse(self.lock.locked(), - "Lock object is not initialized unlocked.") - - def test_release(self): - # Test self.lock.release() - self.lock.acquire() - self.lock.release() - self.assertFalse(self.lock.locked(), - "Lock object did not release properly.") - - def test_LockType_context_manager(self): - with _thread.LockType(): - pass - self.assertFalse(self.lock.locked(), - "Acquired Lock was not released") - - def test_improper_release(self): - #Make sure release of an unlocked thread raises RuntimeError - self.assertRaises(RuntimeError, self.lock.release) - - def test_cond_acquire_success(self): - #Make sure the conditional acquiring of the lock works. - self.assertTrue(self.lock.acquire(0), - "Conditional acquiring of the lock failed.") - - def test_cond_acquire_fail(self): - #Test acquiring locked lock returns False - self.lock.acquire(0) - self.assertFalse(self.lock.acquire(0), - "Conditional acquiring of a locked lock incorrectly " - "succeeded.") - - def test_uncond_acquire_success(self): - #Make sure unconditional acquiring of a lock works. - self.lock.acquire() - self.assertTrue(self.lock.locked(), - "Uncondional locking failed.") - - def test_uncond_acquire_return_val(self): - #Make sure that an unconditional locking returns True. - self.assertIs(self.lock.acquire(1), True, - "Unconditional locking did not return True.") - self.assertIs(self.lock.acquire(), True) - - def test_uncond_acquire_blocking(self): - #Make sure that unconditional acquiring of a locked lock blocks. - def delay_unlock(to_unlock, delay): - """Hold on to lock for a set amount of time before unlocking.""" - time.sleep(delay) - to_unlock.release() - - self.lock.acquire() - start_time = int(time.monotonic()) - _thread.start_new_thread(delay_unlock,(self.lock, DELAY)) - if support.verbose: - print() - print("*** Waiting for thread to release the lock "\ - "(approx. %s sec.) ***" % DELAY) - self.lock.acquire() - end_time = int(time.monotonic()) - if support.verbose: - print("done") - self.assertGreaterEqual(end_time - start_time, DELAY, - "Blocking by unconditional acquiring failed.") - - @mock.patch('time.sleep') - def test_acquire_timeout(self, mock_sleep): - """Test invoking acquire() with a positive timeout when the lock is - already acquired. Ensure that time.sleep() is invoked with the given - timeout and that False is returned.""" - - self.lock.acquire() - retval = self.lock.acquire(waitflag=0, timeout=1) - self.assertTrue(mock_sleep.called) - mock_sleep.assert_called_once_with(1) - self.assertEqual(retval, False) - - def test_lock_representation(self): - self.lock.acquire() - self.assertIn("locked", repr(self.lock)) - self.lock.release() - self.assertIn("unlocked", repr(self.lock)) - - -class RLockTests(unittest.TestCase): - """Test dummy RLock objects.""" - - def setUp(self): - self.rlock = _thread.RLock() - - def test_multiple_acquire(self): - self.assertIn("unlocked", repr(self.rlock)) - self.rlock.acquire() - self.rlock.acquire() - self.assertIn("locked", repr(self.rlock)) - self.rlock.release() - self.assertIn("locked", repr(self.rlock)) - self.rlock.release() - self.assertIn("unlocked", repr(self.rlock)) - self.assertRaises(RuntimeError, self.rlock.release) - - -class MiscTests(unittest.TestCase): - """Miscellaneous tests.""" - - def test_exit(self): - self.assertRaises(SystemExit, _thread.exit) - - def test_ident(self): - self.assertIsInstance(_thread.get_ident(), int, - "_thread.get_ident() returned a non-integer") - self.assertGreater(_thread.get_ident(), 0) - - def test_LockType(self): - self.assertIsInstance(_thread.allocate_lock(), _thread.LockType, - "_thread.LockType is not an instance of what " - "is returned by _thread.allocate_lock()") - - def test_set_sentinel(self): - self.assertIsInstance(_thread._set_sentinel(), _thread.LockType, - "_thread._set_sentinel() did not return a " - "LockType instance.") - - def test_interrupt_main(self): - #Calling start_new_thread with a function that executes interrupt_main - # should raise KeyboardInterrupt upon completion. - def call_interrupt(): - _thread.interrupt_main() - - self.assertRaises(KeyboardInterrupt, - _thread.start_new_thread, - call_interrupt, - tuple()) - - def test_interrupt_in_main(self): - self.assertRaises(KeyboardInterrupt, _thread.interrupt_main) - - def test_stack_size_None(self): - retval = _thread.stack_size(None) - self.assertEqual(retval, 0) - - def test_stack_size_not_None(self): - with self.assertRaises(_thread.error) as cm: - _thread.stack_size("") - self.assertEqual(cm.exception.args[0], - "setting thread stack size not supported") - - -class ThreadTests(unittest.TestCase): - """Test thread creation.""" - - def test_arg_passing(self): - #Make sure that parameter passing works. - def arg_tester(queue, arg1=False, arg2=False): - """Use to test _thread.start_new_thread() passes args properly.""" - queue.put((arg1, arg2)) - - testing_queue = queue.Queue(1) - _thread.start_new_thread(arg_tester, (testing_queue, True, True)) - result = testing_queue.get() - self.assertTrue(result[0] and result[1], - "Argument passing for thread creation " - "using tuple failed") - - _thread.start_new_thread( - arg_tester, - tuple(), - {'queue':testing_queue, 'arg1':True, 'arg2':True}) - - result = testing_queue.get() - self.assertTrue(result[0] and result[1], - "Argument passing for thread creation " - "using kwargs failed") - - _thread.start_new_thread( - arg_tester, - (testing_queue, True), - {'arg2':True}) - - result = testing_queue.get() - self.assertTrue(result[0] and result[1], - "Argument passing for thread creation using both tuple" - " and kwargs failed") - - def test_multi_thread_creation(self): - def queue_mark(queue, delay): - time.sleep(delay) - queue.put(_thread.get_ident()) - - thread_count = 5 - testing_queue = queue.Queue(thread_count) - - if support.verbose: - print() - print("*** Testing multiple thread creation " - "(will take approx. %s to %s sec.) ***" % ( - DELAY, thread_count)) - - for count in range(thread_count): - if DELAY: - local_delay = round(random.random(), 1) - else: - local_delay = 0 - _thread.start_new_thread(queue_mark, - (testing_queue, local_delay)) - time.sleep(DELAY) - if support.verbose: - print('done') - self.assertEqual(testing_queue.qsize(), thread_count, - "Not all %s threads executed properly " - "after %s sec." % (thread_count, DELAY)) - - def test_args_not_tuple(self): - """ - Test invoking start_new_thread() with a non-tuple value for "args". - Expect TypeError with a meaningful error message to be raised. - """ - with self.assertRaises(TypeError) as cm: - _thread.start_new_thread(mock.Mock(), []) - self.assertEqual(cm.exception.args[0], "2nd arg must be a tuple") - - def test_kwargs_not_dict(self): - """ - Test invoking start_new_thread() with a non-dict value for "kwargs". - Expect TypeError with a meaningful error message to be raised. - """ - with self.assertRaises(TypeError) as cm: - _thread.start_new_thread(mock.Mock(), tuple(), kwargs=[]) - self.assertEqual(cm.exception.args[0], "3rd arg must be a dict") - - def test_SystemExit(self): - """ - Test invoking start_new_thread() with a function that raises - SystemExit. - The exception should be discarded. - """ - func = mock.Mock(side_effect=SystemExit()) - try: - _thread.start_new_thread(func, tuple()) - except SystemExit: - self.fail("start_new_thread raised SystemExit.") - - @mock.patch('traceback.print_exc') - def test_RaiseException(self, mock_print_exc): - """ - Test invoking start_new_thread() with a function that raises exception. - - The exception should be discarded and the traceback should be printed - via traceback.print_exc() - """ - func = mock.Mock(side_effect=Exception) - _thread.start_new_thread(func, tuple()) - self.assertTrue(mock_print_exc.called) - -if __name__ == '__main__': - unittest.main() diff --git a/Lib/test/test_dummy_threading.py b/Lib/test/test_dummy_threading.py deleted file mode 100644 index a0c2972a60e931286e28670aaaa874c4021051a0..0000000000000000000000000000000000000000 --- a/Lib/test/test_dummy_threading.py +++ /dev/null @@ -1,60 +0,0 @@ -from test import support -import unittest -import dummy_threading as _threading -import time - -class DummyThreadingTestCase(unittest.TestCase): - - class TestThread(_threading.Thread): - - def run(self): - global running - global sema - global mutex - # Uncomment if testing another module, such as the real 'threading' - # module. - #delay = random.random() * 2 - delay = 0 - if support.verbose: - print('task', self.name, 'will run for', delay, 'sec') - sema.acquire() - mutex.acquire() - running += 1 - if support.verbose: - print(running, 'tasks are running') - mutex.release() - time.sleep(delay) - if support.verbose: - print('task', self.name, 'done') - mutex.acquire() - running -= 1 - if support.verbose: - print(self.name, 'is finished.', running, 'tasks are running') - mutex.release() - sema.release() - - def setUp(self): - self.numtasks = 10 - global sema - sema = _threading.BoundedSemaphore(value=3) - global mutex - mutex = _threading.RLock() - global running - running = 0 - self.threads = [] - - def test_tasks(self): - for i in range(self.numtasks): - t = self.TestThread(name=""%i) - self.threads.append(t) - t.start() - - if support.verbose: - print('waiting for all tasks to complete') - for t in self.threads: - t.join() - if support.verbose: - print('all tasks done') - -if __name__ == '__main__': - unittest.main() diff --git a/Lib/test/test_email/test__header_value_parser.py b/Lib/test/test_email/test__header_value_parser.py index 4b5b44258b228ff3edce83b52e01b3ca2aa9dc17..1bdcfa129b4c8717d05bee9118db5e6ea792a005 100644 --- a/Lib/test/test_email/test__header_value_parser.py +++ b/Lib/test/test_email/test__header_value_parser.py @@ -301,7 +301,7 @@ def test_get_unstructured_ew_with_internal_leading_ws(self): [], '') - def test_get_unstructured_invaild_ew(self): + def test_get_unstructured_invalid_ew(self): self._test_get_x(self._get_unst, '=?test val', '=?test val', diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py index 9e5c6adca835d947eb577b1c949a8c38da6e0e72..ab68cdd8b5aed19ade09d347ad03565191ff40ed 100644 --- a/Lib/test/test_email/test_email.py +++ b/Lib/test/test_email/test_email.py @@ -311,6 +311,41 @@ def test_as_string_policy(self): g.flatten(msg) self.assertEqual(fullrepr, s.getvalue()) + def test_nonascii_as_string_without_cte(self): + m = textwrap.dedent("""\ + MIME-Version: 1.0 + Content-type: text/plain; charset="iso-8859-1" + + Test if non-ascii messages with no Content-Transfer-Encoding set + can be as_string'd: + Föö bär + """) + source = m.encode('iso-8859-1') + expected = textwrap.dedent("""\ + MIME-Version: 1.0 + Content-type: text/plain; charset="iso-8859-1" + Content-Transfer-Encoding: quoted-printable + + Test if non-ascii messages with no Content-Transfer-Encoding set + can be as_string'd: + F=F6=F6 b=E4r + """) + msg = email.message_from_bytes(source) + self.assertEqual(msg.as_string(), expected) + + def test_nonascii_as_string_without_content_type_and_cte(self): + m = textwrap.dedent("""\ + MIME-Version: 1.0 + + Test if non-ascii messages with no Content-Type nor + Content-Transfer-Encoding set can be as_string'd: + Föö bär + """) + source = m.encode('iso-8859-1') + expected = source.decode('ascii', 'replace') + msg = email.message_from_bytes(source) + self.assertEqual(msg.as_string(), expected) + def test_as_bytes(self): msg = self._msgobj('msg_01.txt') with openfile('msg_01.txt') as fp: @@ -1008,7 +1043,7 @@ def test_last_split_chunk_does_not_fit(self): Subject: the first part of this is short, but_the_second_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itself""") - def test_splittable_leading_char_followed_by_overlong_unsplitable(self): + def test_splittable_leading_char_followed_by_overlong_unsplittable(self): eq = self.ndiffAssertEqual h = Header(', but_the_second' '_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line' @@ -1017,7 +1052,7 @@ def test_splittable_leading_char_followed_by_overlong_unsplitable(self): , but_the_second_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itself""") - def test_multiple_splittable_leading_char_followed_by_overlong_unsplitable(self): + def test_multiple_splittable_leading_char_followed_by_overlong_unsplittable(self): eq = self.ndiffAssertEqual h = Header(', , but_the_second' '_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line' @@ -1026,14 +1061,14 @@ def test_multiple_splittable_leading_char_followed_by_overlong_unsplitable(self) , , but_the_second_part_does_not_fit_within_maxlinelen_and_thus_should_be_on_a_line_all_by_itself""") - def test_trailing_splitable_on_overlong_unsplitable(self): + def test_trailing_splittable_on_overlong_unsplittable(self): eq = self.ndiffAssertEqual h = Header('this_part_does_not_fit_within_maxlinelen_and_thus_should_' 'be_on_a_line_all_by_itself;') eq(h.encode(), "this_part_does_not_fit_within_maxlinelen_and_thus_should_" "be_on_a_line_all_by_itself;") - def test_trailing_splitable_on_overlong_unsplitable_with_leading_splitable(self): + def test_trailing_splittable_on_overlong_unsplittable_with_leading_splittable(self): eq = self.ndiffAssertEqual h = Header('; ' 'this_part_does_not_fit_within_maxlinelen_and_thus_should_' @@ -1466,7 +1501,7 @@ def test_mangled_from_with_bad_bytes(self): g.flatten(msg) self.assertEqual(b.getvalue(), source + b'>From R\xc3\xb6lli\n') - def test_mutltipart_with_bad_bytes_in_cte(self): + def test_multipart_with_bad_bytes_in_cte(self): # bpo30835 source = textwrap.dedent("""\ From: aperson@example.com diff --git a/Lib/test/test_email/test_headerregistry.py b/Lib/test/test_email/test_headerregistry.py index 7ade9684465d50bbed2dc454a874a11fb1751935..68bbc9561c4aff1f238b362df0f2ef1a1a30952e 100644 --- a/Lib/test/test_email/test_headerregistry.py +++ b/Lib/test/test_email/test_headerregistry.py @@ -7,6 +7,7 @@ from test.test_email import TestEmailBase, parameterize from email import headerregistry from email.headerregistry import Address, Group +from test.support import ALWAYS_EQ DITTO = object() @@ -1563,6 +1564,24 @@ def test_set_message_header_from_group(self): self.assertEqual(m['to'], 'foo bar:;') self.assertEqual(m['to'].addresses, g.addresses) + def test_address_comparison(self): + a = Address('foo', 'bar', 'example.com') + self.assertEqual(Address('foo', 'bar', 'example.com'), a) + self.assertNotEqual(Address('baz', 'bar', 'example.com'), a) + self.assertNotEqual(Address('foo', 'baz', 'example.com'), a) + self.assertNotEqual(Address('foo', 'bar', 'baz'), a) + self.assertFalse(a == object()) + self.assertTrue(a == ALWAYS_EQ) + + def test_group_comparison(self): + a = Address('foo', 'bar', 'example.com') + g = Group('foo bar', [a]) + self.assertEqual(Group('foo bar', (a,)), g) + self.assertNotEqual(Group('baz', [a]), g) + self.assertNotEqual(Group('foo bar', []), g) + self.assertFalse(g == object()) + self.assertTrue(g == ALWAYS_EQ) + class TestFolding(TestHeaderBase): diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 64a26b9ffff071e4aee203f738c29cc43cc6c417..aeb44d78c2bb9320589c68740e66a10336fa9597 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -267,9 +267,8 @@ def test_pre_initialization_sys_options(self): def test_bpo20891(self): """ - bpo-20891: Calling PyGILState_Ensure in a non-Python thread before - calling PyEval_InitThreads() must not crash. PyGILState_Ensure() must - call PyEval_InitThreads() for us in this case. + bpo-20891: Calling PyGILState_Ensure in a non-Python thread must not + crash. """ out, err = self.run_embedded_interpreter("test_bpo20891") self.assertEqual(out, '') @@ -348,6 +347,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'isolated': 0, 'use_environment': 1, 'dev_mode': 0, + '_use_peg_parser': 1, 'install_signal_handlers': 1, 'use_hash_seed': 0, @@ -356,7 +356,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'tracemalloc': 0, 'import_time': 0, 'show_ref_count': 0, - 'show_alloc_count': 0, 'dump_refs': 0, 'malloc_stats': 0, @@ -367,6 +366,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'program_name': GET_DEFAULT_CONFIG, 'parse_argv': 0, 'argv': [""], + '_orig_argv': [], 'xoptions': [], 'warnoptions': [], @@ -381,6 +381,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'exec_prefix': GET_DEFAULT_CONFIG, 'base_exec_prefix': GET_DEFAULT_CONFIG, 'module_search_paths': GET_DEFAULT_CONFIG, + 'platlibdir': sys.platlibdir, 'site_import': 1, 'bytes_warning': 0, @@ -407,6 +408,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'check_hash_pycs_mode': 'default', 'pathconfig_warnings': 1, '_init_main': 1, + '_isolated_interpreter': 0, } if MS_WINDOWS: CONFIG_COMPAT.update({ @@ -585,13 +587,14 @@ def get_expected_config(self, expected_preconfig, expected, env, api, if value is self.GET_DEFAULT_CONFIG: expected[key] = config[key] - pythonpath_env = expected['pythonpath_env'] - if pythonpath_env is not None: - paths = pythonpath_env.split(os.path.pathsep) - expected['module_search_paths'] = [*paths, *expected['module_search_paths']] - if modify_path_cb is not None: - expected['module_search_paths'] = expected['module_search_paths'].copy() - modify_path_cb(expected['module_search_paths']) + if expected['module_search_paths'] is not self.IGNORE_CONFIG: + pythonpath_env = expected['pythonpath_env'] + if pythonpath_env is not None: + paths = pythonpath_env.split(os.path.pathsep) + expected['module_search_paths'] = [*paths, *expected['module_search_paths']] + if modify_path_cb is not None: + expected['module_search_paths'] = expected['module_search_paths'].copy() + modify_path_cb(expected['module_search_paths']) for key in self.COPY_PRE_CONFIG: if key not in expected_preconfig: @@ -730,15 +733,20 @@ def test_init_from_config(self): 'tracemalloc': 2, 'import_time': 1, 'show_ref_count': 1, - 'show_alloc_count': 1, 'malloc_stats': 1, + '_use_peg_parser': 0, 'stdio_encoding': 'iso8859-1', 'stdio_errors': 'replace', 'pycache_prefix': 'conf_pycache_prefix', 'program_name': './conf_program_name', - 'argv': ['-c', 'arg2', ], + 'argv': ['-c', 'arg2'], + '_orig_argv': ['python3', + '-W', 'cmdline_warnoption', + '-X', 'cmdline_xoption', + '-c', 'pass', + 'arg2'], 'parse_argv': 1, 'xoptions': [ 'config_xoption1=3', @@ -765,9 +773,13 @@ def test_init_from_config(self): 'buffered_stdio': 0, 'user_site_directory': 0, 'faulthandler': 1, + 'platlibdir': 'my_platlibdir', + 'module_search_paths': self.IGNORE_CONFIG, 'check_hash_pycs_mode': 'always', 'pathconfig_warnings': 0, + + '_isolated_interpreter': 1, } self.check_all_configs("test_init_from_config", config, preconfig, api=API_COMPAT) @@ -794,6 +806,9 @@ def test_init_compat_env(self): 'user_site_directory': 0, 'faulthandler': 1, 'warnoptions': ['EnvVar'], + 'platlibdir': 'env_platlibdir', + 'module_search_paths': self.IGNORE_CONFIG, + '_use_peg_parser': 0, } self.check_all_configs("test_init_compat_env", config, preconfig, api=API_COMPAT) @@ -821,6 +836,9 @@ def test_init_python_env(self): 'user_site_directory': 0, 'faulthandler': 1, 'warnoptions': ['EnvVar'], + 'platlibdir': 'env_platlibdir', + 'module_search_paths': self.IGNORE_CONFIG, + '_use_peg_parser': 0, } self.check_all_configs("test_init_python_env", config, preconfig, api=API_PYTHON) @@ -861,7 +879,8 @@ def test_preinit_parse_argv(self): } config = { 'argv': ['script.py'], - 'run_filename': 'script.py', + '_orig_argv': ['python3', '-X', 'dev', 'script.py'], + 'run_filename': os.path.abspath('script.py'), 'dev_mode': 1, 'faulthandler': 1, 'warnoptions': ['default'], @@ -875,9 +894,14 @@ def test_preinit_dont_parse_argv(self): preconfig = { 'isolated': 0, } + argv = ["python3", + "-E", "-I", + "-X", "dev", + "-X", "utf8", + "script.py"] config = { - 'argv': ["python3", "-E", "-I", - "-X", "dev", "-X", "utf8", "script.py"], + 'argv': argv, + '_orig_argv': argv, 'isolated': 0, } self.check_all_configs("test_preinit_dont_parse_argv", config, preconfig, @@ -956,6 +980,9 @@ def test_init_sys_add(self): 'ignore:::sysadd_warnoption', 'ignore:::config_warnoption', ], + '_orig_argv': ['python3', + '-W', 'ignore:::cmdline_warnoption', + '-X', 'cmdline_xoption'], } self.check_all_configs("test_init_sys_add", config, api=API_PYTHON) @@ -964,6 +991,7 @@ def test_init_run_main(self): 'print(json.dumps(_testinternalcapi.get_configs()))') config = { 'argv': ['-c', 'arg2'], + '_orig_argv': ['python3', '-c', code, 'arg2'], 'program_name': './python3', 'run_command': code + '\n', 'parse_argv': 1, @@ -975,6 +1003,9 @@ def test_init_main(self): 'print(json.dumps(_testinternalcapi.get_configs()))') config = { 'argv': ['-c', 'arg2'], + '_orig_argv': ['python3', + '-c', code, + 'arg2'], 'program_name': './python3', 'run_command': code + '\n', 'parse_argv': 1, @@ -988,6 +1019,7 @@ def test_init_parse_argv(self): config = { 'parse_argv': 1, 'argv': ['-c', 'arg1', '-v', 'arg3'], + '_orig_argv': ['./argv0', '-E', '-c', 'pass', 'arg1', '-v', 'arg3'], 'program_name': './argv0', 'run_command': 'pass\n', 'use_environment': 0, @@ -1001,6 +1033,7 @@ def test_init_dont_parse_argv(self): config = { 'parse_argv': 0, 'argv': ['./argv0', '-E', '-c', 'pass', 'arg1', '-v', 'arg3'], + '_orig_argv': ['./argv0', '-E', '-c', 'pass', 'arg1', '-v', 'arg3'], 'program_name': './argv0', } self.check_all_configs("test_init_dont_parse_argv", config, pre_config, @@ -1073,11 +1106,11 @@ def module_search_paths(self, prefix=None, exec_prefix=None): else: ver = sys.version_info return [ - os.path.join(prefix, 'lib', + os.path.join(prefix, sys.platlibdir, f'python{ver.major}{ver.minor}.zip'), - os.path.join(prefix, 'lib', + os.path.join(prefix, sys.platlibdir, f'python{ver.major}.{ver.minor}'), - os.path.join(exec_prefix, 'lib', + os.path.join(exec_prefix, sys.platlibdir, f'python{ver.major}.{ver.minor}', 'lib-dynload'), ] @@ -1194,7 +1227,7 @@ def test_init_pyvenv_cfg(self): if not MS_WINDOWS: lib_dynload = os.path.join(pyvenv_home, - 'lib', + sys.platlibdir, f'python{ver.major}.{ver.minor}', 'lib-dynload') os.makedirs(lib_dynload) @@ -1304,10 +1337,17 @@ def test_init_warnoptions(self): 'faulthandler': 1, 'bytes_warning': 1, 'warnoptions': warnoptions, + '_orig_argv': ['python3', + '-Wignore:::cmdline1', + '-Wignore:::cmdline2'], } self.check_all_configs("test_init_warnoptions", config, preconfig, api=API_PYTHON) + def test_get_argc_argv(self): + self.run_embedded_interpreter("test_get_argc_argv") + # ignore output + class AuditingTests(EmbeddingTestsMixin, unittest.TestCase): def test_open_code_hook(self): @@ -1320,36 +1360,44 @@ def test_audit_subinterpreter(self): self.run_embedded_interpreter("test_audit_subinterpreter") def test_audit_run_command(self): - self.run_embedded_interpreter("test_audit_run_command", timeout=3, returncode=1) + self.run_embedded_interpreter("test_audit_run_command", + timeout=support.SHORT_TIMEOUT, + returncode=1) def test_audit_run_file(self): - self.run_embedded_interpreter("test_audit_run_file", timeout=3, returncode=1) + self.run_embedded_interpreter("test_audit_run_file", + timeout=support.SHORT_TIMEOUT, + returncode=1) def test_audit_run_interactivehook(self): - startup = os.path.join(self.oldcwd, support.TESTFN) + (support.FS_NONASCII or '') + ".py" + startup = os.path.join(self.oldcwd, support.TESTFN) + ".py" with open(startup, "w", encoding="utf-8") as f: print("import sys", file=f) print("sys.__interactivehook__ = lambda: None", file=f) try: env = {**remove_python_envvars(), "PYTHONSTARTUP": startup} - self.run_embedded_interpreter("test_audit_run_interactivehook", timeout=5, + self.run_embedded_interpreter("test_audit_run_interactivehook", + timeout=support.SHORT_TIMEOUT, returncode=10, env=env) finally: os.unlink(startup) def test_audit_run_startup(self): - startup = os.path.join(self.oldcwd, support.TESTFN) + (support.FS_NONASCII or '') + ".py" + startup = os.path.join(self.oldcwd, support.TESTFN) + ".py" with open(startup, "w", encoding="utf-8") as f: print("pass", file=f) try: env = {**remove_python_envvars(), "PYTHONSTARTUP": startup} - self.run_embedded_interpreter("test_audit_run_startup", timeout=5, + self.run_embedded_interpreter("test_audit_run_startup", + timeout=support.SHORT_TIMEOUT, returncode=10, env=env) finally: os.unlink(startup) def test_audit_run_stdin(self): - self.run_embedded_interpreter("test_audit_run_stdin", timeout=3, returncode=1) + self.run_embedded_interpreter("test_audit_run_stdin", + timeout=support.SHORT_TIMEOUT, + returncode=1) if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index a2a3c567349011fe66c864726c6dabd811bfc2c0..4e22986325521173d2cf18dee585f2bed9390352 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -9,6 +9,7 @@ from io import StringIO from pickle import dumps, loads, PicklingError, HIGHEST_PROTOCOL from test import support +from test.support import ALWAYS_EQ from datetime import timedelta @@ -214,6 +215,18 @@ class SubEnum(SuperEnum): set(['__class__', '__doc__', '__module__', 'name', 'value', 'invisible']), ) + def test_dir_on_sub_with_behavior_including_instance_dict_on_super(self): + # see issue40084 + class SuperEnum(IntEnum): + def __new__(cls, value, description=""): + obj = int.__new__(cls, value) + obj._value_ = value + obj.description = description + return obj + class SubEnum(SuperEnum): + sample = 5 + self.assertTrue({'description'} <= set(dir(SubEnum.sample))) + def test_enum_in_enum_out(self): Season = self.Season self.assertIs(Season(Season.WINTER), Season.WINTER) @@ -445,12 +458,63 @@ def test_format_enum(self): self.assertEqual('{:<20}'.format(Season.SPRING), '{:<20}'.format(str(Season.SPRING))) - def test_format_enum_custom(self): + def test_str_override_enum(self): + class EnumWithStrOverrides(Enum): + one = auto() + two = auto() + + def __str__(self): + return 'Str!' + self.assertEqual(str(EnumWithStrOverrides.one), 'Str!') + self.assertEqual('{}'.format(EnumWithStrOverrides.one), 'Str!') + + def test_format_override_enum(self): + class EnumWithFormatOverride(Enum): + one = 1.0 + two = 2.0 + def __format__(self, spec): + return 'Format!!' + self.assertEqual(str(EnumWithFormatOverride.one), 'EnumWithFormatOverride.one') + self.assertEqual('{}'.format(EnumWithFormatOverride.one), 'Format!!') + + def test_str_and_format_override_enum(self): + class EnumWithStrFormatOverrides(Enum): + one = auto() + two = auto() + def __str__(self): + return 'Str!' + def __format__(self, spec): + return 'Format!' + self.assertEqual(str(EnumWithStrFormatOverrides.one), 'Str!') + self.assertEqual('{}'.format(EnumWithStrFormatOverrides.one), 'Format!') + + def test_str_override_mixin(self): + class MixinEnumWithStrOverride(float, Enum): + one = 1.0 + two = 2.0 + def __str__(self): + return 'Overridden!' + self.assertEqual(str(MixinEnumWithStrOverride.one), 'Overridden!') + self.assertEqual('{}'.format(MixinEnumWithStrOverride.one), 'Overridden!') + + def test_str_and_format_override_mixin(self): + class MixinWithStrFormatOverrides(float, Enum): + one = 1.0 + two = 2.0 + def __str__(self): + return 'Str!' + def __format__(self, spec): + return 'Format!' + self.assertEqual(str(MixinWithStrFormatOverrides.one), 'Str!') + self.assertEqual('{}'.format(MixinWithStrFormatOverrides.one), 'Format!') + + def test_format_override_mixin(self): class TestFloat(float, Enum): one = 1.0 two = 2.0 def __format__(self, spec): return 'TestFloat success!' + self.assertEqual(str(TestFloat.one), 'TestFloat.one') self.assertEqual('{}'.format(TestFloat.one), 'TestFloat success!') def assertFormatIsValue(self, spec, member): @@ -500,6 +564,59 @@ def test_format_enum_str(self): self.assertFormatIsValue('{:>20}', Directional.WEST) self.assertFormatIsValue('{:<20}', Directional.WEST) + def test_object_str_override(self): + class Colors(Enum): + RED, GREEN, BLUE = 1, 2, 3 + def __repr__(self): + return "test.%s" % (self._name_, ) + __str__ = object.__str__ + self.assertEqual(str(Colors.RED), 'test.RED') + + def test_enum_str_override(self): + class MyStrEnum(Enum): + def __str__(self): + return 'MyStr' + class MyMethodEnum(Enum): + def hello(self): + return 'Hello! My name is %s' % self.name + class Test1Enum(MyMethodEnum, int, MyStrEnum): + One = 1 + Two = 2 + self.assertTrue(Test1Enum._member_type_ is int) + self.assertEqual(str(Test1Enum.One), 'MyStr') + self.assertEqual(format(Test1Enum.One, ''), 'MyStr') + # + class Test2Enum(MyStrEnum, MyMethodEnum): + One = 1 + Two = 2 + self.assertEqual(str(Test2Enum.One), 'MyStr') + self.assertEqual(format(Test1Enum.One, ''), 'MyStr') + + def test_inherited_data_type(self): + class HexInt(int): + def __repr__(self): + return hex(self) + class MyEnum(HexInt, enum.Enum): + A = 1 + B = 2 + C = 3 + self.assertEqual(repr(MyEnum.A), '') + + def test_too_many_data_types(self): + with self.assertRaisesRegex(TypeError, 'too many data types'): + class Huh(str, int, Enum): + One = 1 + + class MyStr(str): + def hello(self): + return 'hello, %s' % self + class MyInt(int): + def repr(self): + return hex(self) + with self.assertRaisesRegex(TypeError, 'too many data types'): + class Huh(MyStr, MyInt, Enum): + One = 1 + def test_hash(self): Season = self.Season dates = {} @@ -899,6 +1016,9 @@ class MoreColor(Color): cyan = 4 magenta = 5 yellow = 6 + with self.assertRaisesRegex(TypeError, "EvenMoreColor: cannot extend enumeration 'Color'"): + class EvenMoreColor(Color, IntEnum): + chartruese = 7 def test_exclude_methods(self): class whatever(Enum): @@ -1027,6 +1147,7 @@ def test_multiple_mixin_mro(self): class auto_enum(type(Enum)): def __new__(metacls, cls, bases, classdict): temp = type(classdict)() + temp._cls_name = cls names = set(classdict._member_names) i = 0 for k in classdict._member_names: @@ -1458,13 +1579,10 @@ class Color(AutoNumber): self.assertEqual(list(map(int, Color)), [1, 2, 3]) def test_equality(self): - class AlwaysEqual: - def __eq__(self, other): - return True class OrdinaryEnum(Enum): a = 1 - self.assertEqual(AlwaysEqual(), OrdinaryEnum.a) - self.assertEqual(OrdinaryEnum.a, AlwaysEqual()) + self.assertEqual(ALWAYS_EQ, OrdinaryEnum.a) + self.assertEqual(OrdinaryEnum.a, ALWAYS_EQ) def test_ordered_mixin(self): class OrderedEnum(Enum): @@ -1711,6 +1829,17 @@ class Color(Enum): def _generate_next_value_(name, start, count, last): return name + def test_auto_order_wierd(self): + weird_auto = auto() + weird_auto.value = 'pathological case' + class Color(Enum): + red = weird_auto + def _generate_next_value_(name, start, count, last): + return name + blue = auto() + self.assertEqual(list(Color), [Color.red, Color.blue]) + self.assertEqual(Color.red.value, 'pathological case') + self.assertEqual(Color.blue.value, 'blue') def test_duplicate_auto(self): class Dupes(Enum): @@ -1719,6 +1848,18 @@ class Dupes(Enum): third = auto() self.assertEqual([Dupes.first, Dupes.second, Dupes.third], list(Dupes)) + def test_default_missing(self): + class Color(Enum): + RED = 1 + GREEN = 2 + BLUE = 3 + try: + Color(7) + except ValueError as exc: + self.assertTrue(exc.__context__ is None) + else: + raise Exception('Exception not raised.') + def test_missing(self): class Color(Enum): red = 1 @@ -1737,7 +1878,12 @@ def _missing_(cls, item): # trigger not found return None self.assertIs(Color('three'), Color.blue) - self.assertRaises(ValueError, Color, 7) + try: + Color(7) + except ValueError as exc: + self.assertTrue(exc.__context__ is None) + else: + raise Exception('Exception not raised.') try: Color('bad return') except TypeError as exc: @@ -1868,6 +2014,32 @@ class Decision2(MyEnum): REVERT_ALL = "REVERT_ALL" RETRY = "RETRY" + def test_multiple_mixin_inherited(self): + class MyInt(int): + def __new__(cls, value): + return super().__new__(cls, value) + + class HexMixin: + def __repr__(self): + return hex(self) + + class MyIntEnum(HexMixin, MyInt, enum.Enum): + pass + + class Foo(MyIntEnum): + TEST = 1 + self.assertTrue(isinstance(Foo.TEST, MyInt)) + self.assertEqual(repr(Foo.TEST), "0x1") + + class Fee(MyIntEnum): + TEST = 1 + def __new__(cls, value): + value += 1 + member = int.__new__(cls, value) + member._value_ = value + return member + self.assertEqual(Fee.TEST, 2) + def test_empty_globals(self): # bpo-35717: sys._getframe(2).f_globals['__name__'] fails with KeyError # when using compile and exec because f_globals is empty @@ -1877,6 +2049,22 @@ def test_empty_globals(self): local_ls = {} exec(code, global_ns, local_ls) + @unittest.skipUnless( + sys.version_info[:2] == (3, 9), + 'private variables are now normal attributes', + ) + def test_warning_for_private_variables(self): + with self.assertWarns(DeprecationWarning): + class Private(Enum): + __corporal = 'Radar' + self.assertEqual(Private._Private__corporal.value, 'Radar') + try: + with self.assertWarns(DeprecationWarning): + class Private(Enum): + __major_ = 'Hoolihan' + except ValueError: + pass + class TestOrder(unittest.TestCase): @@ -2014,6 +2202,11 @@ def test_repr(self): self.assertEqual(repr(~(Open.RO | Open.CE)), '') self.assertEqual(repr(~(Open.WO | Open.CE)), '') + def test_format(self): + Perm = self.Perm + self.assertEqual(format(Perm.R, ''), 'Perm.R') + self.assertEqual(format(Perm.R | Perm.X, ''), 'Perm.R|X') + def test_or(self): Perm = self.Perm for i in Perm: @@ -2219,12 +2412,13 @@ class Bizarre(Flag): d = 4 f = 6 # Bizarre.c | Bizarre.d - self.assertRaisesRegex(ValueError, "5 is not a valid Bizarre", Bizarre, 5) - self.assertRaisesRegex(ValueError, "5 is not a valid Bizarre", Bizarre, 5) - self.assertRaisesRegex(ValueError, "2 is not a valid Bizarre", Bizarre, 2) - self.assertRaisesRegex(ValueError, "2 is not a valid Bizarre", Bizarre, 2) - self.assertRaisesRegex(ValueError, "1 is not a valid Bizarre", Bizarre, 1) - self.assertRaisesRegex(ValueError, "1 is not a valid Bizarre", Bizarre, 1) + name = "TestFlag.test_cascading_failure..Bizarre" + self.assertRaisesRegex(ValueError, "5 is not a valid " + name, Bizarre, 5) + self.assertRaisesRegex(ValueError, "5 is not a valid " + name, Bizarre, 5) + self.assertRaisesRegex(ValueError, "2 is not a valid " + name, Bizarre, 2) + self.assertRaisesRegex(ValueError, "2 is not a valid " + name, Bizarre, 2) + self.assertRaisesRegex(ValueError, "1 is not a valid " + name, Bizarre, 1) + self.assertRaisesRegex(ValueError, "1 is not a valid " + name, Bizarre, 1) def test_duplicate_auto(self): class Dupes(Enum): @@ -2321,6 +2515,42 @@ def cycle_enum(): 'at least one thread failed while creating composite members') self.assertEqual(256, len(seen), 'too many composite members created') + def test_init_subclass(self): + class MyEnum(Flag): + def __init_subclass__(cls, **kwds): + super().__init_subclass__(**kwds) + self.assertFalse(cls.__dict__.get('_test', False)) + cls._test1 = 'MyEnum' + # + class TheirEnum(MyEnum): + def __init_subclass__(cls, **kwds): + super(TheirEnum, cls).__init_subclass__(**kwds) + cls._test2 = 'TheirEnum' + class WhoseEnum(TheirEnum): + def __init_subclass__(cls, **kwds): + pass + class NoEnum(WhoseEnum): + ONE = 1 + self.assertEqual(TheirEnum.__dict__['_test1'], 'MyEnum') + self.assertEqual(WhoseEnum.__dict__['_test1'], 'MyEnum') + self.assertEqual(WhoseEnum.__dict__['_test2'], 'TheirEnum') + self.assertFalse(NoEnum.__dict__.get('_test1', False)) + self.assertFalse(NoEnum.__dict__.get('_test2', False)) + # + class OurEnum(MyEnum): + def __init_subclass__(cls, **kwds): + cls._test2 = 'OurEnum' + class WhereEnum(OurEnum): + def __init_subclass__(cls, **kwds): + pass + class NeverEnum(WhereEnum): + ONE = 1 + self.assertEqual(OurEnum.__dict__['_test1'], 'MyEnum') + self.assertFalse(WhereEnum.__dict__.get('_test1', False)) + self.assertEqual(WhereEnum.__dict__['_test2'], 'OurEnum') + self.assertFalse(NeverEnum.__dict__.get('_test1', False)) + self.assertFalse(NeverEnum.__dict__.get('_test2', False)) + class TestIntFlag(unittest.TestCase): """Tests of the IntFlags.""" @@ -2346,6 +2576,7 @@ class Color(IntFlag): def test_type(self): Perm = self.Perm + self.assertTrue(Perm._member_type_ is int) Open = self.Open for f in Perm: self.assertTrue(isinstance(f, Perm)) @@ -2425,6 +2656,11 @@ def test_repr(self): self.assertEqual(repr(~(Open.WO | Open.CE)), '') self.assertEqual(repr(Open(~4)), '') + def test_format(self): + Perm = self.Perm + self.assertEqual(format(Perm.R, ''), '4') + self.assertEqual(format(Perm.R | Perm.X, ''), '5') + def test_or(self): Perm = self.Perm for i in Perm: diff --git a/Lib/test/test_enumerate.py b/Lib/test/test_enumerate.py index 5785cb46492ef7c65a7281f24065ccae0454ae6e..906bfc21a26aede0a6a9d9014e95c385b43c53b2 100644 --- a/Lib/test/test_enumerate.py +++ b/Lib/test/test_enumerate.py @@ -2,6 +2,7 @@ import operator import sys import pickle +import gc from test import support @@ -134,6 +135,18 @@ def test_tuple_reuse(self): self.assertEqual(len(set(map(id, list(enumerate(self.seq))))), len(self.seq)) self.assertEqual(len(set(map(id, enumerate(self.seq)))), min(1,len(self.seq))) + @support.cpython_only + def test_enumerate_result_gc(self): + # bpo-42536: enumerate's tuple-reuse speed trick breaks the GC's + # assumptions about what can be untracked. Make sure we re-track result + # tuples whenever we reuse them. + it = self.enum([[]]) + gc.collect() + # That GC collection probably untracked the recycled internal result + # tuple, which is initialized to (None, None). Make sure it's re-tracked + # when it's mutated and returned from __next__: + self.assertTrue(gc.is_tracked(next(it))) + class MyEnum(enumerate): pass diff --git a/Lib/test/test_eof.py b/Lib/test/test_eof.py index 9ef8eb1187486f34905c0210ac8756a85460f3f8..51cbbd8eed664fa22b0f526c603f6adea3755e3b 100644 --- a/Lib/test/test_eof.py +++ b/Lib/test/test_eof.py @@ -26,6 +26,15 @@ def test_EOFS(self): else: raise support.TestFailed + def test_eof_with_line_continuation(self): + expect = "unexpected EOF while parsing (, line 1)" + try: + compile('"\\xhh" \\', '', 'exec', dont_inherit=True) + except SyntaxError as msg: + self.assertEqual(str(msg), expect) + else: + raise support.TestFailed + def test_line_continuation_EOF(self): """A continuation at the end of input must be an error; bpo2180.""" expect = 'unexpected EOF while parsing (, line 1)' @@ -43,10 +52,14 @@ def test_line_continuation_EOF_from_file_bpo2180(self): file_name = script_helper.make_script(temp_dir, 'foo', '\\') rc, out, err = script_helper.assert_python_failure(file_name) self.assertIn(b'unexpected EOF while parsing', err) + self.assertIn(b'line 2', err) + self.assertIn(b'\\', err) file_name = script_helper.make_script(temp_dir, 'foo', 'y = 6\\') rc, out, err = script_helper.assert_python_failure(file_name) self.assertIn(b'unexpected EOF while parsing', err) + self.assertIn(b'line 2', err) + self.assertIn(b'y = 6\\', err) if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_epoll.py b/Lib/test/test_epoll.py index 8ac0f31d8051c673e15b4b581c802172cd4ed887..b623852f9eb4ee6adb3d8bbc0ccd0e609443f56d 100644 --- a/Lib/test/test_epoll.py +++ b/Lib/test/test_epoll.py @@ -160,44 +160,42 @@ def test_fromfd(self): self.fail("epoll on closed fd didn't raise EBADF") def test_control_and_wait(self): + # create the epoll object client, server = self._connected_pair() - ep = select.epoll(16) ep.register(server.fileno(), select.EPOLLIN | select.EPOLLOUT | select.EPOLLET) ep.register(client.fileno(), select.EPOLLIN | select.EPOLLOUT | select.EPOLLET) + # EPOLLOUT now = time.monotonic() events = ep.poll(1, 4) then = time.monotonic() self.assertFalse(then - now > 0.1, then - now) - events.sort() expected = [(client.fileno(), select.EPOLLOUT), (server.fileno(), select.EPOLLOUT)] - expected.sort() - - self.assertEqual(events, expected) + self.assertEqual(sorted(events), sorted(expected)) - events = ep.poll(timeout=2.1, maxevents=4) + # no event + events = ep.poll(timeout=0.1, maxevents=4) self.assertFalse(events) - client.send(b"Hello!") - server.send(b"world!!!") + # send: EPOLLIN and EPOLLOUT + client.sendall(b"Hello!") + server.sendall(b"world!!!") now = time.monotonic() - events = ep.poll(1, 4) + events = ep.poll(1.0, 4) then = time.monotonic() self.assertFalse(then - now > 0.01) - events.sort() expected = [(client.fileno(), select.EPOLLIN | select.EPOLLOUT), (server.fileno(), select.EPOLLIN | select.EPOLLOUT)] - expected.sort() - - self.assertEqual(events, expected) + self.assertEqual(sorted(events), sorted(expected)) + # unregister, modify ep.unregister(client.fileno()) ep.modify(server.fileno(), select.EPOLLOUT) now = time.monotonic() @@ -225,7 +223,10 @@ def test_unregister_closed(self): self.assertFalse(then - now > 0.01) server.close() - ep.unregister(fd) + + with self.assertRaises(OSError) as cm: + ep.unregister(fd) + self.assertEqual(cm.exception.errno, errno.EBADF) def test_close(self): open_file = open(__file__, "rb") diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 3a32253157369365ed8a1acf5d1ef494831483e0..8d125b57ad6d5a8b98f82e4f0b274f611b2bc9fc 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -1,6 +1,7 @@ # Python test set -- part 5, built-in exceptions import copy +import gc import os import sys import unittest @@ -33,16 +34,17 @@ def __str__(self): class ExceptionTests(unittest.TestCase): def raise_catch(self, exc, excname): - try: - raise exc("spam") - except exc as err: - buf1 = str(err) - try: - raise exc("spam") - except exc as err: - buf2 = str(err) - self.assertEqual(buf1, buf2) - self.assertEqual(exc.__name__, excname) + with self.subTest(exc=exc, excname=excname): + try: + raise exc("spam") + except exc as err: + buf1 = str(err) + try: + raise exc("spam") + except exc as err: + buf2 = str(err) + self.assertEqual(buf1, buf2) + self.assertEqual(exc.__name__, excname) def testRaising(self): self.raise_catch(AttributeError, "AttributeError") @@ -133,13 +135,14 @@ def testSyntaxErrorMessage(self): # these code fragments def ckmsg(src, msg): - try: - compile(src, '', 'exec') - except SyntaxError as e: - if e.msg != msg: - self.fail("expected %s, got %s" % (msg, e.msg)) - else: - self.fail("failed to get expected SyntaxError") + with self.subTest(src=src, msg=msg): + try: + compile(src, '', 'exec') + except SyntaxError as e: + if e.msg != msg: + self.fail("expected %s, got %s" % (msg, e.msg)) + else: + self.fail("failed to get expected SyntaxError") s = '''if 1: try: @@ -178,8 +181,8 @@ def ckmsg(src, msg, exception=SyntaxError): s = '''if True:\n print()\n\texec "mixed tabs and spaces"''' ckmsg(s, "inconsistent use of tabs and spaces in indentation", TabError) - def testSyntaxErrorOffset(self): - def check(src, lineno, offset, encoding='utf-8'): + def check(self, src, lineno, offset, encoding='utf-8'): + with self.subTest(source=src, lineno=lineno, offset=offset): with self.assertRaises(SyntaxError) as cm: compile(src, '', 'exec') self.assertEqual(cm.exception.lineno, lineno) @@ -188,8 +191,10 @@ def check(src, lineno, offset, encoding='utf-8'): if not isinstance(src, str): src = src.decode(encoding, 'replace') line = src.split('\n')[lineno-1] - self.assertEqual(cm.exception.text.rstrip('\n'), line) + self.assertIn(line, cm.exception.text) + def testSyntaxErrorOffset(self): + check = self.check check('def fact(x):\n\treturn x!\n', 2, 10) check('1 +\n', 1, 4) check('def spam():\n print(1)\n print(2)', 3, 10) @@ -200,6 +205,7 @@ def check(src, lineno, offset, encoding='utf-8'): check(b'Python = "\xcf\xb3\xf2\xee\xed" +', 1, 18) check('x = "a', 1, 7) check('lambda x: x = 2', 1, 1) + check('f{a + b + c}', 1, 2) # Errors thrown by compile.c check('class foo:return 1', 1, 11) @@ -217,6 +223,18 @@ def check(src, lineno, offset, encoding='utf-8'): check(b'\xce\xb1 = 0xI', 1, 6) check(b'# -*- coding: iso8859-7 -*-\n\xe1 = 0xI', 2, 6, encoding='iso8859-7') + check(b"""if 1: + def foo(): + ''' + + def bar(): + pass + + def baz(): + '''quux''' + """, 9, 20) + check("pass\npass\npass\n(1+)\npass\npass\npass", 4, 4) + check("(1+)", 1, 4) # Errors thrown by symtable.c check('x = [(yield i) for i in range(3)]', 1, 5) @@ -227,20 +245,17 @@ def check(src, lineno, offset, encoding='utf-8'): check('nonlocal x', 1, 1) check('def f():\n global x\n nonlocal x', 2, 3) - # Errors thrown by ast.c - check('for 1 in []: pass', 1, 5) - check('def f(*):\n pass', 1, 7) - check('[*x for x in xs]', 1, 2) - check('def f():\n x, y: int', 2, 3) - check('(yield i) = 2', 1, 1) - check('foo(x for x in range(10), 100)', 1, 5) - check('foo(1=2)', 1, 5) - # Errors thrown by future.c check('from __future__ import doesnt_exist', 1, 1) check('from __future__ import braces', 1, 1) check('x=1\nfrom __future__ import division', 2, 1) - + check('foo(1=2)', 1, 5) + check('def f():\n x, y: int', 2, 3) + check('[*x for x in xs]', 1, 2) + check('foo(x for x in range(10), 100)', 1, 5) + check('(yield i) = 2', 1, 1 if support.use_old_parser() else 2) + check('def f(*):\n pass', 1, 7 if support.use_old_parser() else 8) + check('for 1 in []: pass', 1, 5) @cpython_only def testSettingException(self): @@ -994,7 +1009,7 @@ def test_recursion_normalizing_exception(self): # finalization of these locals. code = """if 1: import sys - from _testcapi import get_recursion_depth + from _testinternalcapi import get_recursion_depth class MyException(Exception): pass @@ -1078,8 +1093,9 @@ def recurse(cnt): """ with SuppressCrashReport(): rc, out, err = script_helper.assert_python_failure("-c", code) - self.assertIn(b'Fatal Python error: Cannot recover from ' - b'MemoryErrors while normalizing exceptions.', err) + self.assertIn(b'Fatal Python error: _PyErr_NormalizeException: ' + b'Cannot recover from MemoryErrors while ' + b'normalizing exceptions.', err) @cpython_only def test_MemoryError(self): @@ -1297,6 +1313,52 @@ def g(): next(i) next(i) + @unittest.skipUnless(__debug__, "Won't work if __debug__ is False") + def test_assert_shadowing(self): + # Shadowing AssertionError would cause the assert statement to + # misbehave. + global AssertionError + AssertionError = TypeError + try: + assert False, 'hello' + except BaseException as e: + del AssertionError + self.assertIsInstance(e, AssertionError) + self.assertEqual(str(e), 'hello') + else: + del AssertionError + self.fail('Expected exception') + + def test_memory_error_subclasses(self): + # bpo-41654: MemoryError instances use a freelist of objects that are + # linked using the 'dict' attribute when they are inactive/dead. + # Subclasses of MemoryError should not participate in the freelist + # schema. This test creates a MemoryError object and keeps it alive + # (therefore advancing the freelist) and then it creates and destroys a + # subclass object. Finally, it checks that creating a new MemoryError + # succeeds, proving that the freelist is not corrupted. + + class TestException(MemoryError): + pass + + try: + raise MemoryError + except MemoryError as exc: + inst = exc + + try: + raise TestException + except Exception: + pass + + for _ in range(10): + try: + raise MemoryError + except MemoryError as exc: + pass + + gc_collect() + class ImportErrorTests(unittest.TestCase): diff --git a/Lib/test/test_extcall.py b/Lib/test/test_extcall.py index 3cac3bda4253b47b1bdbf302864195a37c93bb12..4205ca82222f274c5238217fa30aab2204c28e88 100644 --- a/Lib/test/test_extcall.py +++ b/Lib/test/test_extcall.py @@ -52,15 +52,15 @@ >>> f(1, 2, **{'a': -1, 'b': 5}, **{'a': 4, 'c': 6}) Traceback (most recent call last): ... - TypeError: f() got multiple values for keyword argument 'a' + TypeError: test.test_extcall.f() got multiple values for keyword argument 'a' >>> f(1, 2, **{'a': -1, 'b': 5}, a=4, c=6) Traceback (most recent call last): ... - TypeError: f() got multiple values for keyword argument 'a' + TypeError: test.test_extcall.f() got multiple values for keyword argument 'a' >>> f(1, 2, a=3, **{'a': 4}, **{'a': 5}) Traceback (most recent call last): ... - TypeError: f() got multiple values for keyword argument 'a' + TypeError: test.test_extcall.f() got multiple values for keyword argument 'a' >>> f(1, 2, 3, *[4, 5], **{'a':6, 'b':7}) (1, 2, 3, 4, 5) {'a': 6, 'b': 7} >>> f(1, 2, 3, x=4, y=5, *(6, 7), **{'a':8, 'b': 9}) @@ -79,6 +79,24 @@ >>> f(1, 2, 3, *(4, 5), x=6, y=7, **UserDict(a=8, b=9)) (1, 2, 3, 4, 5) {'a': 8, 'b': 9, 'x': 6, 'y': 7} +Mix keyword arguments and dict unpacking + + >>> d1 = {'a':1} + + >>> d2 = {'c':3} + + >>> f(b=2, **d1, **d2) + () {'a': 1, 'b': 2, 'c': 3} + + >>> f(**d1, b=2, **d2) + () {'a': 1, 'b': 2, 'c': 3} + + >>> f(**d1, **d2, b=2) + () {'a': 1, 'b': 2, 'c': 3} + + >>> f(**d1, b=2, **d2, d=4) + () {'a': 1, 'b': 2, 'c': 3, 'd': 4} + Examples with invalid arguments (TypeErrors). We're also testing the function names in the exception messages. @@ -118,7 +136,7 @@ >>> g(*Nothing()) Traceback (most recent call last): ... - TypeError: g() argument after * must be an iterable, not Nothing + TypeError: test.test_extcall.g() argument after * must be an iterable, not Nothing >>> class Nothing: ... def __len__(self): return 5 @@ -127,7 +145,7 @@ >>> g(*Nothing()) Traceback (most recent call last): ... - TypeError: g() argument after * must be an iterable, not Nothing + TypeError: test.test_extcall.g() argument after * must be an iterable, not Nothing >>> class Nothing(): ... def __len__(self): return 5 @@ -237,7 +255,7 @@ >>> f(**{1:2}) Traceback (most recent call last): ... - TypeError: f() keywords must be strings + TypeError: keywords must be strings >>> h(**{'e': 2}) Traceback (most recent call last): @@ -247,17 +265,17 @@ >>> h(*h) Traceback (most recent call last): ... - TypeError: h() argument after * must be an iterable, not function + TypeError: test.test_extcall.h() argument after * must be an iterable, not function >>> h(1, *h) Traceback (most recent call last): ... - TypeError: h() argument after * must be an iterable, not function + TypeError: Value after * must be an iterable, not function >>> h(*[1], *h) Traceback (most recent call last): ... - TypeError: h() argument after * must be an iterable, not function + TypeError: Value after * must be an iterable, not function >>> dir(*h) Traceback (most recent call last): @@ -268,38 +286,38 @@ >>> nothing(*h) Traceback (most recent call last): ... - TypeError: NoneType object argument after * must be an iterable, \ + TypeError: None argument after * must be an iterable, \ not function >>> h(**h) Traceback (most recent call last): ... - TypeError: h() argument after ** must be a mapping, not function + TypeError: test.test_extcall.h() argument after ** must be a mapping, not function >>> h(**[]) Traceback (most recent call last): ... - TypeError: h() argument after ** must be a mapping, not list + TypeError: test.test_extcall.h() argument after ** must be a mapping, not list >>> h(a=1, **h) Traceback (most recent call last): ... - TypeError: h() argument after ** must be a mapping, not function + TypeError: test.test_extcall.h() argument after ** must be a mapping, not function >>> h(a=1, **[]) Traceback (most recent call last): ... - TypeError: h() argument after ** must be a mapping, not list + TypeError: test.test_extcall.h() argument after ** must be a mapping, not list >>> h(**{'a': 1}, **h) Traceback (most recent call last): ... - TypeError: h() argument after ** must be a mapping, not function + TypeError: test.test_extcall.h() argument after ** must be a mapping, not function >>> h(**{'a': 1}, **[]) Traceback (most recent call last): ... - TypeError: h() argument after ** must be a mapping, not list + TypeError: test.test_extcall.h() argument after ** must be a mapping, not list >>> dir(**h) Traceback (most recent call last): @@ -309,7 +327,7 @@ >>> nothing(**h) Traceback (most recent call last): ... - TypeError: NoneType object argument after ** must be a mapping, \ + TypeError: None argument after ** must be a mapping, \ not function >>> dir(b=1, **{'b': 1}) @@ -351,17 +369,17 @@ >>> g(**MultiDict([('x', 1), ('x', 2)])) Traceback (most recent call last): ... - TypeError: g() got multiple values for keyword argument 'x' + TypeError: test.test_extcall.g() got multiple values for keyword argument 'x' >>> g(a=3, **MultiDict([('x', 1), ('x', 2)])) Traceback (most recent call last): ... - TypeError: g() got multiple values for keyword argument 'x' + TypeError: test.test_extcall.g() got multiple values for keyword argument 'x' >>> g(**MultiDict([('a', 3)]), **MultiDict([('x', 1), ('x', 2)])) Traceback (most recent call last): ... - TypeError: g() got multiple values for keyword argument 'x' + TypeError: test.test_extcall.g() got multiple values for keyword argument 'x' Another helper function diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py index d8751039348280f7e34040622c996da7b679046d..c64afe88c25d6c0c7453fa939128f3be5216fc41 100644 --- a/Lib/test/test_faulthandler.py +++ b/Lib/test/test_faulthandler.py @@ -71,9 +71,8 @@ def get_output(self, code, filename=None, fd=None): with support.SuppressCrashReport(): process = script_helper.spawn_python('-c', code, pass_fds=pass_fds) with process: - stdout, stderr = process.communicate() + output, stderr = process.communicate() exitcode = process.wait() - output = support.strip_python_stderr(stdout) output = output.decode('ascii', 'backslashreplace') if filename: self.assertEqual(output, '') @@ -124,7 +123,9 @@ def check_error(self, code, line_number, fatal_error, *, self.assertRegex(output, regex) self.assertNotEqual(exitcode, 0) - def check_fatal_error(self, code, line_number, name_regex, **kw): + def check_fatal_error(self, code, line_number, name_regex, func=None, **kw): + if func: + name_regex = '%s: %s' % (func, name_regex) fatal_error = 'Fatal Python error: %s' % name_regex self.check_error(code, line_number, fatal_error, **kw) @@ -174,6 +175,7 @@ def test_fatal_error_c_thread(self): 3, 'in new thread', know_current_thread=False, + func='faulthandler_fatal_error_thread', py_fatal_error=True) def test_sigabrt(self): @@ -231,6 +233,7 @@ def test_fatal_error(self): """, 2, 'xyz', + func='faulthandler_fatal_error_py', py_fatal_error=True) def test_fatal_error_without_gil(self): @@ -240,6 +243,7 @@ def test_fatal_error_without_gil(self): """, 2, 'xyz', + func='faulthandler_fatal_error_py', py_fatal_error=True) @unittest.skipIf(sys.platform.startswith('openbsd'), @@ -535,8 +539,6 @@ def test_dump_traceback_threads_file(self): with temporary_filename() as filename: self.check_dump_traceback_threads(filename) - @unittest.skipIf(not hasattr(faulthandler, 'dump_traceback_later'), - 'need faulthandler.dump_traceback_later()') def check_dump_traceback_later(self, repeat=False, cancel=False, loops=1, *, filename=None, fd=None): """ @@ -744,9 +746,8 @@ def test_stderr_None(self): faulthandler.enable() with self.check_stderr_none(): faulthandler.dump_traceback() - if hasattr(faulthandler, 'dump_traceback_later'): - with self.check_stderr_none(): - faulthandler.dump_traceback_later(1e-3) + with self.check_stderr_none(): + faulthandler.dump_traceback_later(1e-3) if hasattr(faulthandler, "register"): with self.check_stderr_none(): faulthandler.register(signal.SIGUSR1) @@ -823,6 +824,17 @@ def test_disable_windows_exc_handler(self): self.assertEqual(output, []) self.assertEqual(exitcode, 0xC0000005) + def test_cancel_later_without_dump_traceback_later(self): + # bpo-37933: Calling cancel_dump_traceback_later() + # without dump_traceback_later() must not segfault. + code = dedent(""" + import faulthandler + faulthandler.cancel_dump_traceback_later() + """) + output, exitcode = self.get_output(code) + self.assertEqual(output, []) + self.assertEqual(exitcode, 0) + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_fcntl.py b/Lib/test/test_fcntl.py index c394f6945a8d27fda0bba8e05c8bfd8d010428e9..9ab68c67241f464e0cf115389407ea48e616b378 100644 --- a/Lib/test/test_fcntl.py +++ b/Lib/test/test_fcntl.py @@ -181,6 +181,12 @@ def test_flock_overflow(self): self.assertRaises(OverflowError, fcntl.flock, _testcapi.INT_MAX+1, fcntl.LOCK_SH) + @unittest.skipIf(sys.platform != 'darwin', "F_GETPATH is only available on macos") + def test_fcntl_f_getpath(self): + self.f = open(TESTFN, 'wb') + expected = os.path.abspath(TESTFN).encode('utf-8') + res = fcntl.fcntl(self.f.fileno(), fcntl.F_GETPATH, bytes(len(expected))) + self.assertEqual(expected, res) def test_main(): run_unittest(TestFcntl) diff --git a/Lib/test/test_finalization.py b/Lib/test/test_finalization.py index 35d7913e5b89b52d90494da41bdee6fc92de4607..1d134430909d8487b5beb939515bce61e82a6093 100644 --- a/Lib/test/test_finalization.py +++ b/Lib/test/test_finalization.py @@ -16,6 +16,15 @@ def __new__(cls, *args, **kwargs): raise TypeError('requires _testcapi.with_tp_del') return C +try: + from _testcapi import without_gc +except ImportError: + def without_gc(cls): + class C: + def __new__(cls, *args, **kwargs): + raise TypeError('requires _testcapi.without_gc') + return C + from test import support @@ -94,9 +103,11 @@ def check_sanity(self): assert self.id_ == id(self) +@without_gc class NonGC(NonGCSimpleBase): __slots__ = () +@without_gc class NonGCResurrector(NonGCSimpleBase): __slots__ = () @@ -109,8 +120,14 @@ def side_effect(self): class Simple(SimpleBase): pass -class SimpleResurrector(NonGCResurrector, SimpleBase): - pass +# Can't inherit from NonGCResurrector, in case importing without_gc fails. +class SimpleResurrector(SimpleBase): + + def side_effect(self): + """ + Resurrect self by storing self in a class-wide list. + """ + self.survivors.append(self) class TestBase: @@ -178,6 +195,7 @@ def test_simple_resurrect(self): self.assert_survivors([]) self.assertIs(wr(), None) + @support.cpython_only def test_non_gc(self): with SimpleBase.test(): s = NonGC() @@ -191,6 +209,7 @@ def test_non_gc(self): self.assert_del_calls(ids) self.assert_survivors([]) + @support.cpython_only def test_non_gc_resurrect(self): with SimpleBase.test(): s = NonGCResurrector() diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py index b656582538e8754b328ea2186d740eeaedfe4e87..9651281e24edbe7a6dd6d0f6cffc4b04c5f36a7e 100644 --- a/Lib/test/test_float.py +++ b/Lib/test/test_float.py @@ -312,6 +312,34 @@ def assertEqualAndEqualSign(self, a, b): # distinguishes -0.0 and 0.0. self.assertEqual((a, copysign(1.0, a)), (b, copysign(1.0, b))) + def test_float_floor(self): + self.assertIsInstance(float(0.5).__floor__(), int) + self.assertEqual(float(0.5).__floor__(), 0) + self.assertEqual(float(1.0).__floor__(), 1) + self.assertEqual(float(1.5).__floor__(), 1) + self.assertEqual(float(-0.5).__floor__(), -1) + self.assertEqual(float(-1.0).__floor__(), -1) + self.assertEqual(float(-1.5).__floor__(), -2) + self.assertEqual(float(1.23e167).__floor__(), 1.23e167) + self.assertEqual(float(-1.23e167).__floor__(), -1.23e167) + self.assertRaises(ValueError, float("nan").__floor__) + self.assertRaises(OverflowError, float("inf").__floor__) + self.assertRaises(OverflowError, float("-inf").__floor__) + + def test_float_ceil(self): + self.assertIsInstance(float(0.5).__ceil__(), int) + self.assertEqual(float(0.5).__ceil__(), 1) + self.assertEqual(float(1.0).__ceil__(), 1) + self.assertEqual(float(1.5).__ceil__(), 2) + self.assertEqual(float(-0.5).__ceil__(), 0) + self.assertEqual(float(-1.0).__ceil__(), -1) + self.assertEqual(float(-1.5).__ceil__(), -1) + self.assertEqual(float(1.23e167).__ceil__(), 1.23e167) + self.assertEqual(float(-1.23e167).__ceil__(), -1.23e167) + self.assertRaises(ValueError, float("nan").__ceil__) + self.assertRaises(OverflowError, float("inf").__ceil__) + self.assertRaises(OverflowError, float("-inf").__ceil__) + @support.requires_IEEE_754 def test_float_mod(self): # Check behaviour of % operator for IEEE 754 special cases. diff --git a/Lib/test/test_flufl.py b/Lib/test/test_flufl.py index 33e52e609a761a6bacf6499bb82802c304590a42..22285859a92bb1eaec2da376a31e16d7ac706514 100644 --- a/Lib/test/test_flufl.py +++ b/Lib/test/test_flufl.py @@ -1,5 +1,7 @@ import __future__ import unittest +from test import support + class FLUFLTests(unittest.TestCase): @@ -12,10 +14,13 @@ def test_barry_as_bdfl(self): __future__.CO_FUTURE_BARRY_AS_BDFL) self.assertRegex(str(cm.exception), "with Barry as BDFL, use '<>' instead of '!='") - self.assertEqual(cm.exception.text, '2 != 3\n') + self.assertIn('2 != 3', cm.exception.text) self.assertEqual(cm.exception.filename, '') - self.assertEqual(cm.exception.lineno, 2) - self.assertEqual(cm.exception.offset, 4) + + self.assertTrue(cm.exception.lineno, 2) + # The old parser reports the end of the token and the new + # parser reports the start of the token + self.assertEqual(cm.exception.offset, 4 if support.use_old_parser() else 3) def test_guido_as_bdfl(self): code = '2 {0} 3' @@ -23,10 +28,12 @@ def test_guido_as_bdfl(self): with self.assertRaises(SyntaxError) as cm: compile(code.format('<>'), '', 'exec') self.assertRegex(str(cm.exception), "invalid syntax") - self.assertEqual(cm.exception.text, '2 <> 3\n') + self.assertIn('2 <> 3', cm.exception.text) self.assertEqual(cm.exception.filename, '') self.assertEqual(cm.exception.lineno, 1) - self.assertEqual(cm.exception.offset, 4) + # The old parser reports the end of the token and the new + # parser reports the start of the token + self.assertEqual(cm.exception.offset, 4 if support.use_old_parser() else 3) if __name__ == '__main__': diff --git a/Lib/test/test_fnmatch.py b/Lib/test/test_fnmatch.py index 55f9f0d3a5425af1080587ac3d549e2653dd9031..10668e4f6103aa0e7e06e221dafee9050d735b5d 100644 --- a/Lib/test/test_fnmatch.py +++ b/Lib/test/test_fnmatch.py @@ -45,6 +45,13 @@ def test_fnmatch(self): check('\nfoo', 'foo*', False) check('\n', '*') + def test_slow_fnmatch(self): + check = self.check_match + check('a' * 50, '*a*a*a*a*a*a*a*a*a*a') + # The next "takes forever" if the regexp translation is + # straightforward. See bpo-40480. + check('a' * 50 + 'b', '*a*a*a*a*a*a*a*a*a*a', False) + def test_mix_bytes_str(self): self.assertRaises(TypeError, fnmatch, 'test', b'*') self.assertRaises(TypeError, fnmatch, b'test', '*') @@ -99,6 +106,7 @@ def test_warnings(self): class TranslateTestCase(unittest.TestCase): def test_translate(self): + import re self.assertEqual(translate('*'), r'(?s:.*)\Z') self.assertEqual(translate('?'), r'(?s:.)\Z') self.assertEqual(translate('a?b*'), r'(?s:a.b.*)\Z') @@ -107,7 +115,34 @@ def test_translate(self): self.assertEqual(translate('[!x]'), r'(?s:[^x])\Z') self.assertEqual(translate('[^x]'), r'(?s:[\^x])\Z') self.assertEqual(translate('[x'), r'(?s:\[x)\Z') - + # from the docs + self.assertEqual(translate('*.txt'), r'(?s:.*\.txt)\Z') + # squash consecutive stars + self.assertEqual(translate('*********'), r'(?s:.*)\Z') + self.assertEqual(translate('A*********'), r'(?s:A.*)\Z') + self.assertEqual(translate('*********A'), r'(?s:.*A)\Z') + self.assertEqual(translate('A*********?[?]?'), r'(?s:A.*.[?].)\Z') + # fancy translation to prevent exponential-time match failure + t = translate('**a*a****a') + digits = re.findall(r'\d+', t) + self.assertEqual(len(digits), 4) + self.assertEqual(digits[0], digits[1]) + self.assertEqual(digits[2], digits[3]) + g1 = f"g{digits[0]}" # e.g., group name "g4" + g2 = f"g{digits[2]}" # e.g., group name "g5" + self.assertEqual(t, + fr'(?s:(?=(?P<{g1}>.*?a))(?P={g1})(?=(?P<{g2}>.*?a))(?P={g2}).*a)\Z') + # and try pasting multiple translate results - it's an undocumented + # feature that this works; all the pain of generating unique group + # names across calls exists to support this + r1 = translate('**a**a**a*') + r2 = translate('**b**b**b*') + r3 = translate('*c*c*c*') + fatre = "|".join([r1, r2, r3]) + self.assertTrue(re.match(fatre, 'abaccad')) + self.assertTrue(re.match(fatre, 'abxbcab')) + self.assertTrue(re.match(fatre, 'cbabcaxc')) + self.assertFalse(re.match(fatre, 'dabccbad')) class FilterTestCase(unittest.TestCase): diff --git a/Lib/test/test_fork1.py b/Lib/test/test_fork1.py index 2ab856ff56904052f5fc77b7b161f7e6e9d1fd81..a2f7cfee9cf699bd91426cfbf72e9f9912649b68 100644 --- a/Lib/test/test_fork1.py +++ b/Lib/test/test_fork1.py @@ -10,26 +10,13 @@ import unittest from test.fork_wait import ForkWait -from test.support import reap_children, get_attribute, verbose +from test import support # Skip test if fork does not exist. -get_attribute(os, 'fork') +support.get_attribute(os, 'fork') class ForkTest(ForkWait): - def wait_impl(self, cpid): - deadline = time.monotonic() + 10.0 - while time.monotonic() <= deadline: - # waitpid() shouldn't hang, but some of the buildbots seem to hang - # in the forking tests. This is an attempt to fix the problem. - spid, status = os.waitpid(cpid, os.WNOHANG) - if spid == cpid: - break - time.sleep(0.1) - - self.assertEqual(spid, cpid) - self.assertEqual(status, 0, "cause = %d, exit = %d" % (status&0xff, status>>8)) - def test_threaded_import_lock_fork(self): """Check fork() in main thread works while a subthread is doing an import""" import_started = threading.Event() @@ -46,6 +33,7 @@ def importer(): t = threading.Thread(target=importer) t.start() import_started.wait() + exitcode = 42 pid = os.fork() try: # PyOS_BeforeFork should have waited for the import to complete @@ -54,9 +42,9 @@ def importer(): if not pid: m = __import__(fake_module_name) if m == complete_module: - os._exit(0) + os._exit(exitcode) else: - if verbose > 1: + if support.verbose > 1: print("Child encountered partial module") os._exit(1) else: @@ -64,7 +52,7 @@ def importer(): # Exitcode 1 means the child got a partial module (bad.) No # exitcode (but a hang, which manifests as 'got pid 0') # means the child deadlocked (also bad.) - self.wait_impl(pid) + self.wait_impl(pid, exitcode=exitcode) finally: try: os.kill(pid, signal.SIGKILL) @@ -74,6 +62,7 @@ def importer(): def test_nested_import_lock_fork(self): """Check fork() in main thread works while the main thread is doing an import""" + exitcode = 42 # Issue 9573: this used to trigger RuntimeError in the child process def fork_with_import_lock(level): release = 0 @@ -90,13 +79,13 @@ def fork_with_import_lock(level): imp.release_lock() except RuntimeError: if in_child: - if verbose > 1: + if support.verbose > 1: print("RuntimeError in child") os._exit(1) raise if in_child: - os._exit(0) - self.wait_impl(pid) + os._exit(exitcode) + self.wait_impl(pid, exitcode=exitcode) # Check this works with various levels of nested # import in the main thread @@ -105,7 +94,7 @@ def fork_with_import_lock(level): def tearDownModule(): - reap_children() + support.reap_children() if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py index 4559cd5623efe9ffc2f6ab3bd10e3b6c56a3b424..9653e46ecc52d8960cfd5cc861cb161293cabb6c 100644 --- a/Lib/test/test_format.py +++ b/Lib/test/test_format.py @@ -1,6 +1,7 @@ from test.support import verbose, TestFailed import locale import sys +import re import test.support as support import unittest @@ -427,13 +428,16 @@ def test_locale(self): localeconv = locale.localeconv() sep = localeconv['thousands_sep'] point = localeconv['decimal_point'] + grouping = localeconv['grouping'] text = format(123456789, "n") - self.assertIn(sep, text) + if grouping: + self.assertIn(sep, text) self.assertEqual(text.replace(sep, ''), '123456789') text = format(1234.5, "n") - self.assertIn(sep, text) + if grouping: + self.assertIn(sep, text) self.assertIn(point, text) self.assertEqual(text.replace(sep, ''), '1234' + point + '5') finally: @@ -484,6 +488,36 @@ def test_precision_c_limits(self): with self.assertRaises(ValueError) as cm: format(c, ".%sf" % (INT_MAX + 1)) + def test_g_format_has_no_trailing_zeros(self): + # regression test for bugs.python.org/issue40780 + self.assertEqual("%.3g" % 1505.0, "1.5e+03") + self.assertEqual("%#.3g" % 1505.0, "1.50e+03") + + self.assertEqual(format(1505.0, ".3g"), "1.5e+03") + self.assertEqual(format(1505.0, "#.3g"), "1.50e+03") + + self.assertEqual(format(12300050.0, ".6g"), "1.23e+07") + self.assertEqual(format(12300050.0, "#.6g"), "1.23000e+07") + + def test_with_two_commas_in_format_specifier(self): + error_msg = re.escape("Cannot specify ',' with ','.") + with self.assertRaisesRegex(ValueError, error_msg): + '{:,,}'.format(1) + + def test_with_two_underscore_in_format_specifier(self): + error_msg = re.escape("Cannot specify '_' with '_'.") + with self.assertRaisesRegex(ValueError, error_msg): + '{:__}'.format(1) + + def test_with_a_commas_and_an_underscore_in_format_specifier(self): + error_msg = re.escape("Cannot specify both ',' and '_'.") + with self.assertRaisesRegex(ValueError, error_msg): + '{:,_}'.format(1) + + def test_with_an_underscore_and_a_comma_in_format_specifier(self): + error_msg = re.escape("Cannot specify both ',' and '_'.") + with self.assertRaisesRegex(ValueError, error_msg): + '{:_,}'.format(1) if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py index 86b49f30f549fb6a3ea1c7ce27fc31f685faf205..0845f7921c39ec7f7c0f090e0f471668b75388f6 100644 --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -9,11 +9,10 @@ import functools import sys import unittest -import warnings from copy import copy, deepcopy from pickle import dumps, loads F = fractions.Fraction -gcd = fractions.gcd + class DummyFloat(object): """Dummy float class for testing comparisons with Fractions""" @@ -82,30 +81,6 @@ def __float__(self): class DummyFraction(fractions.Fraction): """Dummy Fraction subclass for copy and deepcopy testing.""" -class GcdTest(unittest.TestCase): - - def testMisc(self): - # fractions.gcd() is deprecated - with self.assertWarnsRegex(DeprecationWarning, r'fractions\.gcd'): - gcd(1, 1) - with warnings.catch_warnings(): - warnings.filterwarnings('ignore', r'fractions\.gcd', - DeprecationWarning) - self.assertEqual(0, gcd(0, 0)) - self.assertEqual(1, gcd(1, 0)) - self.assertEqual(-1, gcd(-1, 0)) - self.assertEqual(1, gcd(0, 1)) - self.assertEqual(-1, gcd(0, -1)) - self.assertEqual(1, gcd(7, 1)) - self.assertEqual(-1, gcd(7, -1)) - self.assertEqual(1, gcd(-23, 15)) - self.assertEqual(12, gcd(120, 84)) - self.assertEqual(-12, gcd(84, -120)) - self.assertEqual(gcd(120.0, 84), 12.0) - self.assertEqual(gcd(120, 84.0), 12.0) - self.assertEqual(gcd(F(120), F(84)), F(12)) - self.assertEqual(gcd(F(120, 77), F(84, 55)), F(12, 385)) - def _components(r): return (r.numerator, r.denominator) @@ -727,5 +702,28 @@ def test_slots(self): r = F(13, 7) self.assertRaises(AttributeError, setattr, r, 'a', 10) + def test_int_subclass(self): + class myint(int): + def __mul__(self, other): + return type(self)(int(self) * int(other)) + def __floordiv__(self, other): + return type(self)(int(self) // int(other)) + def __mod__(self, other): + x = type(self)(int(self) % int(other)) + return x + @property + def numerator(self): + return type(self)(int(self)) + @property + def denominator(self): + return type(self)(1) + + f = fractions.Fraction(myint(1 * 3), myint(2 * 3)) + self.assertEqual(f.numerator, 1) + self.assertEqual(f.denominator, 2) + self.assertEqual(type(f.numerator), myint) + self.assertEqual(type(f.denominator), myint) + + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_frame.py b/Lib/test/test_frame.py index d6aa2834cbc28b749b32f7daa412be296d5f68ca..a8696f011f9453d8991373495aa4f6093d2c634b 100644 --- a/Lib/test/test_frame.py +++ b/Lib/test/test_frame.py @@ -50,7 +50,7 @@ def g(): nonlocal endly try: yield - inner() + self.inner() finally: endly = True gen = g() diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index 49663923e7f5aa2e52c04a4e01514d4bc0d05459..2f08d35f26dc3bb6cd9fb0440479b7dceb41d99f 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -8,9 +8,13 @@ # Unicode identifiers in tests is allowed by PEP 3131. import ast +import os +import re import types import decimal import unittest +from test.support import temp_cwd, use_old_parser +from test.support.script_helper import assert_python_failure a_global = 'global variable' @@ -328,6 +332,59 @@ def test_ast_line_numbers_multiline_fstring(self): self.assertEqual(binop.left.col_offset, 4) self.assertEqual(binop.right.col_offset, 7) + def test_ast_line_numbers_with_parentheses(self): + expr = """ +x = ( + f" {test(t)}" +)""" + t = ast.parse(expr) + self.assertEqual(type(t), ast.Module) + self.assertEqual(len(t.body), 1) + # check the test(t) location + call = t.body[0].value.values[1].value + self.assertEqual(type(call), ast.Call) + self.assertEqual(call.lineno, 3) + self.assertEqual(call.end_lineno, 3) + self.assertEqual(call.col_offset, 8) + self.assertEqual(call.end_col_offset, 15) + + expr = """ +x = ( + 'PERL_MM_OPT', ( + f'wat' + f'some_string={f(x)} ' + f'wat' + ), +) +""" + t = ast.parse(expr) + self.assertEqual(type(t), ast.Module) + self.assertEqual(len(t.body), 1) + # check the fstring + fstring = t.body[0].value.elts[1] + self.assertEqual(type(fstring), ast.JoinedStr) + self.assertEqual(len(fstring.values), 3) + wat1, middle, wat2 = fstring.values + # check the first wat + self.assertEqual(type(wat1), ast.Constant) + self.assertEqual(wat1.lineno, 4) + self.assertEqual(wat1.end_lineno, 6) + self.assertEqual(wat1.col_offset, 12) + self.assertEqual(wat1.end_col_offset, 18) + # check the call + call = middle.value + self.assertEqual(type(call), ast.Call) + self.assertEqual(call.lineno, 5) + self.assertEqual(call.end_lineno, 5) + self.assertEqual(call.col_offset, 27) + self.assertEqual(call.end_col_offset, 31) + # check the second wat + self.assertEqual(type(wat2), ast.Constant) + self.assertEqual(wat2.lineno, 4) + self.assertEqual(wat2.end_lineno, 6) + self.assertEqual(wat2.col_offset, 12) + self.assertEqual(wat2.end_col_offset, 18) + def test_docstring(self): def f(): f'''Not a docstring''' @@ -521,7 +578,8 @@ def test_format_specifier_expressions(self): # This looks like a nested format spec. ]) - self.assertAllRaise(SyntaxError, "invalid syntax", + err_msg = "invalid syntax" if use_old_parser() else "f-string: invalid syntax" + self.assertAllRaise(SyntaxError, err_msg, [# Invalid syntax inside a nested spec. "f'{4:{/5}}'", ]) @@ -583,7 +641,7 @@ def test_missing_expression(self): ]) # Different error message is raised for other whitespace characters. - self.assertAllRaise(SyntaxError, 'invalid character in identifier', + self.assertAllRaise(SyntaxError, r"invalid non-printable character U\+00A0", ["f'''{\xa0}'''", "\xa0", ]) @@ -595,7 +653,8 @@ def test_parens_in_expressions(self): # are added around it. But we shouldn't go from an invalid # expression to a valid one. The added parens are just # supposed to allow whitespace (including newlines). - self.assertAllRaise(SyntaxError, 'invalid syntax', + err_msg = "invalid syntax" if use_old_parser() else "f-string: invalid syntax" + self.assertAllRaise(SyntaxError, err_msg, ["f'{,}'", "f'{,}'", # this is (,), which is an error ]) @@ -713,7 +772,8 @@ def test_lambda(self): # lambda doesn't work without parens, because the colon # makes the parser think it's a format_spec - self.assertAllRaise(SyntaxError, 'unexpected EOF while parsing', + err_msg = "invalid syntax" if use_old_parser() else "f-string: invalid syntax" + self.assertAllRaise(SyntaxError, err_msg, ["f'{lambda x:x}'", ]) @@ -722,9 +782,11 @@ def test_yield(self): # a function into a generator def fn(y): f'y:{yield y*2}' + f'{yield}' g = fn(4) self.assertEqual(next(g), 8) + self.assertEqual(next(g), None) def test_yield_send(self): def fn(x): @@ -841,8 +903,7 @@ def test_nested_fstrings(self): self.assertEqual(f'{f"{y}"*3}', '555') def test_invalid_string_prefixes(self): - self.assertAllRaise(SyntaxError, 'unexpected EOF while parsing', - ["fu''", + single_quote_cases = ["fu''", "uf''", "Fu''", "fU''", @@ -863,8 +924,15 @@ def test_invalid_string_prefixes(self): "bf''", "bF''", "Bf''", - "BF''", - ]) + "BF''",] + double_quote_cases = [case.replace("'", '"') for case in single_quote_cases] + error_msg = ( + 'invalid syntax' + if use_old_parser() + else 'unexpected EOF while parsing' + ) + self.assertAllRaise(SyntaxError, error_msg, + single_quote_cases + double_quote_cases) def test_leading_trailing_spaces(self): self.assertEqual(f'{ 3}', '3') @@ -1043,6 +1111,17 @@ def test_errors(self): r"f'{1000:j}'", ]) + @unittest.skipIf(use_old_parser(), "The old parser only supports as the filename") + def test_filename_in_syntaxerror(self): + # see issue 38964 + with temp_cwd() as cwd: + file_path = os.path.join(cwd, 't.py') + with open(file_path, 'w') as f: + f.write('f"{a b}"') # This generates a SyntaxError + _, _, stderr = assert_python_failure(file_path, + PYTHONIOENCODING='ascii') + self.assertIn(file_path.encode('ascii', 'backslashreplace'), stderr) + def test_loop(self): for i in range(1000): self.assertEqual(f'i:{i}', 'i:' + str(i)) @@ -1178,6 +1257,30 @@ def test_walrus(self): self.assertEqual(f'{(x:=10)}', '10') self.assertEqual(x, 10) + def test_invalid_syntax_error_message(self): + err_msg = "invalid syntax" if use_old_parser() else "f-string: invalid syntax" + with self.assertRaisesRegex(SyntaxError, err_msg): + compile("f'{a $ b}'", "?", "exec") + + def test_with_two_commas_in_format_specifier(self): + error_msg = re.escape("Cannot specify ',' with ','.") + with self.assertRaisesRegex(ValueError, error_msg): + f'{1:,,}' + + def test_with_two_underscore_in_format_specifier(self): + error_msg = re.escape("Cannot specify '_' with '_'.") + with self.assertRaisesRegex(ValueError, error_msg): + f'{1:__}' + + def test_with_a_commas_and_an_underscore_in_format_specifier(self): + error_msg = re.escape("Cannot specify both ',' and '_'.") + with self.assertRaisesRegex(ValueError, error_msg): + f'{1:,_}' + + def test_with_an_underscore_and_a_comma_in_format_specifier(self): + error_msg = re.escape("Cannot specify both ',' and '_'.") + with self.assertRaisesRegex(ValueError, error_msg): + f'{1:_,}' if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py index b0e46411a2e2bf4100dbd7029639986a8507f6f6..e424076d7d317c6b40a6a5aaf2d8f4b179a6f859 100644 --- a/Lib/test/test_ftplib.py +++ b/Lib/test/test_ftplib.py @@ -19,14 +19,16 @@ from unittest import TestCase, skipUnless from test import support -from test.support import HOST, HOSTv6 +from test.support import socket_helper +from test.support.socket_helper import HOST, HOSTv6 -TIMEOUT = 3 +TIMEOUT = support.LOOPBACK_TIMEOUT +DEFAULT_ENCODING = 'utf-8' # the dummy data returned by server over the data channel when # RETR, LIST, NLST, MLSD commands are issued -RETR_DATA = 'abcde12345\r\n' * 1000 -LIST_DATA = 'foo\r\nbar\r\n' -NLST_DATA = 'foo\r\nbar\r\n' +RETR_DATA = 'abcde12345\r\n' * 1000 + 'non-ascii char \xAE\r\n' +LIST_DATA = 'foo\r\nbar\r\n non-ascii char \xAE\r\n' +NLST_DATA = 'foo\r\nbar\r\n non-ascii char \xAE\r\n' MLSD_DATA = ("type=cdir;perm=el;unique==keVO1+ZF4; test\r\n" "type=pdir;perm=e;unique==keVO1+d?3; ..\r\n" "type=OS.unix=slink:/foobar;perm=;unique==keVO1+4G4; foobar\r\n" @@ -41,7 +43,9 @@ "type=dir;perm=cpmel;unique==keVO1+7G4; incoming\r\n" "type=file;perm=r;unique==keVO1+1G4; file2\r\n" "type=file;perm=r;unique==keVO1+1G4; file3\r\n" - "type=file;perm=r;unique==keVO1+1G4; file4\r\n") + "type=file;perm=r;unique==keVO1+1G4; file4\r\n" + "type=dir;perm=cpmel;unique==SGP1; dir \xAE non-ascii char\r\n" + "type=file;perm=r;unique==SGP2; file \xAE non-ascii char\r\n") class DummyDTPHandler(asynchat.async_chat): @@ -51,9 +55,11 @@ def __init__(self, conn, baseclass): asynchat.async_chat.__init__(self, conn) self.baseclass = baseclass self.baseclass.last_received_data = '' + self.encoding = baseclass.encoding def handle_read(self): - self.baseclass.last_received_data += self.recv(1024).decode('ascii') + new_data = self.recv(1024).decode(self.encoding, 'replace') + self.baseclass.last_received_data += new_data def handle_close(self): # XXX: this method can be called many times in a row for a single @@ -70,7 +76,7 @@ def push(self, what): self.baseclass.next_data = None if not what: return self.close_when_done() - super(DummyDTPHandler, self).push(what.encode('ascii')) + super(DummyDTPHandler, self).push(what.encode(self.encoding)) def handle_error(self): raise Exception @@ -80,7 +86,7 @@ class DummyFTPHandler(asynchat.async_chat): dtp_handler = DummyDTPHandler - def __init__(self, conn): + def __init__(self, conn, encoding=DEFAULT_ENCODING): asynchat.async_chat.__init__(self, conn) # tells the socket to handle urgent data inline (ABOR command) self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_OOBINLINE, 1) @@ -94,12 +100,13 @@ def __init__(self, conn): self.rest = None self.next_retr_data = RETR_DATA self.push('220 welcome') + self.encoding = encoding def collect_incoming_data(self, data): self.in_buffer.append(data) def found_terminator(self): - line = b''.join(self.in_buffer).decode('ascii') + line = b''.join(self.in_buffer).decode(self.encoding) self.in_buffer = [] if self.next_response: self.push(self.next_response) @@ -121,7 +128,7 @@ def handle_error(self): raise Exception def push(self, data): - asynchat.async_chat.push(self, data.encode('ascii') + b'\r\n') + asynchat.async_chat.push(self, data.encode(self.encoding) + b'\r\n') def cmd_port(self, arg): addr = list(map(int, arg.split(','))) @@ -251,7 +258,7 @@ class DummyFTPServer(asyncore.dispatcher, threading.Thread): handler = DummyFTPHandler - def __init__(self, address, af=socket.AF_INET): + def __init__(self, address, af=socket.AF_INET, encoding=DEFAULT_ENCODING): threading.Thread.__init__(self) asyncore.dispatcher.__init__(self) self.daemon = True @@ -262,6 +269,7 @@ def __init__(self, address, af=socket.AF_INET): self.active_lock = threading.Lock() self.host, self.port = self.socket.getsockname()[:2] self.handler_instance = None + self.encoding = encoding def start(self): assert not self.active @@ -284,7 +292,7 @@ def stop(self): self.join() def handle_accepted(self, conn, addr): - self.handler_instance = self.handler(conn) + self.handler_instance = self.handler(conn, encoding=self.encoding) def handle_connect(self): self.close() @@ -346,7 +354,7 @@ def _do_ssl_shutdown(self): if err.args[0] in (ssl.SSL_ERROR_WANT_READ, ssl.SSL_ERROR_WANT_WRITE): return - except OSError as err: + except OSError: # Any "socket error" corresponds to a SSL_ERROR_SYSCALL return # from OpenSSL's SSL_shutdown(), corresponding to a # closed socket condition. See also: @@ -421,8 +429,8 @@ class DummyTLS_FTPHandler(SSLConnection, DummyFTPHandler): dtp_handler = DummyTLS_DTPHandler - def __init__(self, conn): - DummyFTPHandler.__init__(self, conn) + def __init__(self, conn, encoding=DEFAULT_ENCODING): + DummyFTPHandler.__init__(self, conn, encoding=encoding) self.secure_data_channel = False self._ccc = False @@ -462,10 +470,10 @@ class DummyTLS_FTPServer(DummyFTPServer): class TestFTPClass(TestCase): - def setUp(self): - self.server = DummyFTPServer((HOST, 0)) + def setUp(self, encoding=DEFAULT_ENCODING): + self.server = DummyFTPServer((HOST, 0), encoding=encoding) self.server.start() - self.client = ftplib.FTP(timeout=TIMEOUT) + self.client = ftplib.FTP(timeout=TIMEOUT, encoding=encoding) self.client.connect(self.server.host, self.server.port) def tearDown(self): @@ -565,14 +573,14 @@ def test_abort(self): def test_retrbinary(self): def callback(data): - received.append(data.decode('ascii')) + received.append(data.decode(self.client.encoding)) received = [] self.client.retrbinary('retr', callback) self.check_data(''.join(received), RETR_DATA) def test_retrbinary_rest(self): def callback(data): - received.append(data.decode('ascii')) + received.append(data.decode(self.client.encoding)) for rest in (0, 10, 20): received = [] self.client.retrbinary('retr', callback, rest=rest) @@ -584,7 +592,7 @@ def test_retrlines(self): self.check_data(''.join(received), RETR_DATA.replace('\r\n', '')) def test_storbinary(self): - f = io.BytesIO(RETR_DATA.encode('ascii')) + f = io.BytesIO(RETR_DATA.encode(self.client.encoding)) self.client.storbinary('stor', f) self.check_data(self.server.handler_instance.last_received_data, RETR_DATA) # test new callback arg @@ -594,14 +602,16 @@ def test_storbinary(self): self.assertTrue(flag) def test_storbinary_rest(self): - f = io.BytesIO(RETR_DATA.replace('\r\n', '\n').encode('ascii')) + data = RETR_DATA.replace('\r\n', '\n').encode(self.client.encoding) + f = io.BytesIO(data) for r in (30, '30'): f.seek(0) self.client.storbinary('stor', f, rest=r) self.assertEqual(self.server.handler_instance.rest, str(r)) def test_storlines(self): - f = io.BytesIO(RETR_DATA.replace('\r\n', '\n').encode('ascii')) + data = RETR_DATA.replace('\r\n', '\n').encode(self.client.encoding) + f = io.BytesIO(data) self.client.storlines('stor', f) self.check_data(self.server.handler_instance.last_received_data, RETR_DATA) # test new callback arg @@ -742,7 +752,7 @@ def is_client_connected(): def test_source_address(self): self.client.quit() - port = support.find_unused_port() + port = socket_helper.find_unused_port() try: self.client.connect(self.server.host, self.server.port, source_address=(HOST, port)) @@ -754,7 +764,7 @@ def test_source_address(self): raise def test_source_address_passive_connection(self): - port = support.find_unused_port() + port = socket_helper.find_unused_port() self.client.source_address = (HOST, port) try: with self.client.transfercmd('list') as sock: @@ -790,14 +800,32 @@ def test_storlines_too_long(self): f = io.BytesIO(b'x' * self.client.maxline * 2) self.assertRaises(ftplib.Error, self.client.storlines, 'stor', f) - -@skipUnless(support.IPV6_ENABLED, "IPv6 not enabled") + def test_encoding_param(self): + encodings = ['latin-1', 'utf-8'] + for encoding in encodings: + with self.subTest(encoding=encoding): + self.tearDown() + self.setUp(encoding=encoding) + self.assertEqual(encoding, self.client.encoding) + self.test_retrbinary() + self.test_storbinary() + self.test_retrlines() + new_dir = self.client.mkd('/non-ascii dir \xAE') + self.check_data(new_dir, '/non-ascii dir \xAE') + # Check default encoding + client = ftplib.FTP(timeout=TIMEOUT) + self.assertEqual(DEFAULT_ENCODING, client.encoding) + + +@skipUnless(socket_helper.IPV6_ENABLED, "IPv6 not enabled") class TestIPv6Environment(TestCase): def setUp(self): - self.server = DummyFTPServer((HOSTv6, 0), af=socket.AF_INET6) + self.server = DummyFTPServer((HOSTv6, 0), + af=socket.AF_INET6, + encoding=DEFAULT_ENCODING) self.server.start() - self.client = ftplib.FTP(timeout=TIMEOUT) + self.client = ftplib.FTP(timeout=TIMEOUT, encoding=DEFAULT_ENCODING) self.client.connect(self.server.host, self.server.port) def tearDown(self): @@ -824,7 +852,7 @@ def test_makepasv(self): def test_transfer(self): def retr(): def callback(data): - received.append(data.decode('ascii')) + received.append(data.decode(self.client.encoding)) received = [] self.client.retrbinary('retr', callback) self.assertEqual(len(''.join(received)), len(RETR_DATA)) @@ -841,10 +869,10 @@ class TestTLS_FTPClassMixin(TestFTPClass): and data connections first. """ - def setUp(self): - self.server = DummyTLS_FTPServer((HOST, 0)) + def setUp(self, encoding=DEFAULT_ENCODING): + self.server = DummyTLS_FTPServer((HOST, 0), encoding=encoding) self.server.start() - self.client = ftplib.FTP_TLS(timeout=TIMEOUT) + self.client = ftplib.FTP_TLS(timeout=TIMEOUT, encoding=encoding) self.client.connect(self.server.host, self.server.port) # enable TLS self.client.auth() @@ -855,8 +883,8 @@ def setUp(self): class TestTLS_FTPClass(TestCase): """Specific TLS_FTP class tests.""" - def setUp(self): - self.server = DummyTLS_FTPServer((HOST, 0)) + def setUp(self, encoding=DEFAULT_ENCODING): + self.server = DummyTLS_FTPServer((HOST, 0), encoding=encoding) self.server.start() self.client = ftplib.FTP_TLS(timeout=TIMEOUT) self.client.connect(self.server.host, self.server.port) @@ -877,7 +905,8 @@ def test_data_connection(self): # clear text with self.client.transfercmd('list') as sock: self.assertNotIsInstance(sock, ssl.SSLSocket) - self.assertEqual(sock.recv(1024), LIST_DATA.encode('ascii')) + self.assertEqual(sock.recv(1024), + LIST_DATA.encode(self.client.encoding)) self.assertEqual(self.client.voidresp(), "226 transfer complete") # secured, after PROT P @@ -886,14 +915,16 @@ def test_data_connection(self): self.assertIsInstance(sock, ssl.SSLSocket) # consume from SSL socket to finalize handshake and avoid # "SSLError [SSL] shutdown while in init" - self.assertEqual(sock.recv(1024), LIST_DATA.encode('ascii')) + self.assertEqual(sock.recv(1024), + LIST_DATA.encode(self.client.encoding)) self.assertEqual(self.client.voidresp(), "226 transfer complete") # PROT C is issued, the connection must be in cleartext again self.client.prot_c() with self.client.transfercmd('list') as sock: self.assertNotIsInstance(sock, ssl.SSLSocket) - self.assertEqual(sock.recv(1024), LIST_DATA.encode('ascii')) + self.assertEqual(sock.recv(1024), + LIST_DATA.encode(self.client.encoding)) self.assertEqual(self.client.voidresp(), "226 transfer complete") def test_login(self): @@ -977,7 +1008,7 @@ def setUp(self): self.evt = threading.Event() self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.settimeout(20) - self.port = support.bind_port(self.sock) + self.port = socket_helper.bind_port(self.sock) self.server_thread = threading.Thread(target=self.server) self.server_thread.daemon = True self.server_thread.start() @@ -1045,6 +1076,10 @@ def testTimeoutValue(self): self.evt.wait() ftp.close() + # bpo-39259 + with self.assertRaises(ValueError): + ftplib.FTP(HOST, timeout=0) + def testTimeoutConnect(self): ftp = ftplib.FTP() ftp.connect(HOST, timeout=30) diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index 8fee1c6afdd450e48c613f5cafbc4e2853695359..11e8aa356d333179ca195eedc3157d2f77aefabd 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -13,9 +13,14 @@ import typing import unittest import unittest.mock +import os +import weakref +import gc from weakref import proxy import contextlib +from test.support.script_helper import assert_python_ok + import functools py_functools = support.import_fresh_module('functools', blocked=['_functools']) @@ -556,11 +561,9 @@ class B(object): with self.assertRaises(TypeError): class B: method = functools.partialmethod() - with self.assertWarns(DeprecationWarning): + with self.assertRaises(TypeError): class B: method = functools.partialmethod(func=capture, a=1) - b = B() - self.assertEqual(b.method(2, x=3), ((b, 2), {'a': 1, 'x': 3})) def test_repr(self): self.assertEqual(repr(vars(self.A)['both']), @@ -1160,6 +1163,25 @@ def __eq__(self, other): return self.value == other.value +class TestCache: + # This tests that the pass-through is working as designed. + # The underlying functionality is tested in TestLRU. + + def test_cache(self): + @self.module.cache + def fib(n): + if n < 2: + return n + return fib(n-1) + fib(n-2) + self.assertEqual([fib(n) for n in range(16)], + [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]) + self.assertEqual(fib.cache_info(), + self.module._CacheInfo(hits=28, misses=16, maxsize=None, currsize=16)) + fib.cache_clear() + self.assertEqual(fib.cache_info(), + self.module._CacheInfo(hits=0, misses=0, maxsize=None, currsize=0)) + + class TestLRU: def test_lru(self): @@ -1657,6 +1679,46 @@ def orig(x, y): f_copy = copy.deepcopy(f) self.assertIs(f_copy, f) + def test_lru_cache_parameters(self): + @self.module.lru_cache(maxsize=2) + def f(): + return 1 + self.assertEqual(f.cache_parameters(), {'maxsize': 2, "typed": False}) + + @self.module.lru_cache(maxsize=1000, typed=True) + def f(): + return 1 + self.assertEqual(f.cache_parameters(), {'maxsize': 1000, "typed": True}) + + def test_lru_cache_weakrefable(self): + @self.module.lru_cache + def test_function(x): + return x + + class A: + @self.module.lru_cache + def test_method(self, x): + return (self, x) + + @staticmethod + @self.module.lru_cache + def test_staticmethod(x): + return (self, x) + + refs = [weakref.ref(test_function), + weakref.ref(A.test_method), + weakref.ref(A.test_staticmethod)] + + for ref in refs: + self.assertIsNotNone(ref()) + + del A + del test_function + gc.collect() + + for ref in refs: + self.assertIsNone(ref()) + @py_functools.lru_cache() def py_cached_func(x, y): diff --git a/Lib/test/test_future.py b/Lib/test/test_future.py index 57946467d6816473e7de821786657e315815fcd3..0f40357b3a7310aec2eff565ed4bce058595fb8a 100644 --- a/Lib/test/test_future.py +++ b/Lib/test/test_future.py @@ -7,6 +7,7 @@ from textwrap import dedent import os import re +import sys rx = re.compile(r'\((\S+).py, line (\d+)') @@ -85,10 +86,10 @@ def test_ensure_flags_dont_clash(self): for future in __future__.all_feature_names } # obtain some of the exported compiler flags (PyCF_***) from the ast module - flags.update({ + flags |= { flag: getattr(ast, flag) for flag in dir(ast) if flag.startswith("PyCF_") - }) + } self.assertCountEqual(set(flags.values()), flags.values()) def test_parserhack(self): @@ -128,6 +129,10 @@ def f() -> {ann}: ... def g(arg: {ann}) -> None: ... + async def f2() -> {ann}: + ... + async def g2(arg: {ann}) -> None: + ... var: {ann} var2: {ann} = None """ @@ -138,9 +143,13 @@ def getActual(self, annotation): exec(self.template.format(ann=annotation), {}, scope) func_ret_ann = scope['f'].__annotations__['return'] func_arg_ann = scope['g'].__annotations__['arg'] + async_func_ret_ann = scope['f2'].__annotations__['return'] + async_func_arg_ann = scope['g2'].__annotations__['arg'] var_ann1 = scope['__annotations__']['var'] var_ann2 = scope['__annotations__']['var2'] self.assertEqual(func_ret_ann, func_arg_ann) + self.assertEqual(func_ret_ann, async_func_ret_ann) + self.assertEqual(func_ret_ann, async_func_arg_ann) self.assertEqual(func_ret_ann, var_ann1) self.assertEqual(func_ret_ann, var_ann2) return func_ret_ann @@ -161,6 +170,7 @@ def test_annotations(self): eq = self.assertAnnotationEqual eq('...') eq("'some_string'") + eq("u'some_string'") eq("b'\\xa3'") eq('Name') eq('None') @@ -266,7 +276,6 @@ def test_annotations(self): eq("set[str,]") eq("tuple[str, ...]") eq("tuple[(str, *types)]") - eq("tuple[xx:yy, (*types,)]") eq("tuple[str, int, (str, int)]") eq("tuple[(*int, str, str, (str, int))]") eq("tuple[str, int, float, dict[str, int]]") @@ -307,8 +316,9 @@ def test_annotations(self): eq('f((x for x in a), 2)') eq('(((a)))', 'a') eq('(((a, b)))', '(a, b)') - eq("(x:=10)") - eq("f'{(x:=10):=10}'") + eq("(x := 10)") + eq("f'{(x := 10):=10}'") + eq("1 + 2 + 3") def test_fstring_debug_annotations(self): # f-strings with '=' don't round trip very well, so set the expected @@ -320,6 +330,18 @@ def test_fstring_debug_annotations(self): self.assertAnnotationEqual("f'{x=!a}'", expected="f'x={x!a}'") self.assertAnnotationEqual("f'{x=!s:*^20}'", expected="f'x={x!s:*^20}'") + def test_infinity_numbers(self): + inf = "1e" + repr(sys.float_info.max_10_exp + 1) + infj = f"{inf}j" + self.assertAnnotationEqual("1e1000", expected=inf) + self.assertAnnotationEqual("1e1000j", expected=infj) + self.assertAnnotationEqual("-1e1000", expected=f"-{inf}") + self.assertAnnotationEqual("3+1e1000j", expected=f"3 + {infj}") + self.assertAnnotationEqual("(1e1000, 1e1000j)", expected=f"({inf}, {infj})") + self.assertAnnotationEqual("'inf'") + self.assertAnnotationEqual("('inf', 1e1000, 'infxxx', 1e1000j)", expected=f"('inf', {inf}, 'infxxx', {infj})") + self.assertAnnotationEqual("(1e1000, (1e1000j,))", expected=f"({inf}, ({infj},))") + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py index f52db1eab169cd20a79d448e284709e06737d2b6..38c9cb7123311b618a85921a72a12c61a22cc078 100644 --- a/Lib/test/test_gc.py +++ b/Lib/test/test_gc.py @@ -1,7 +1,8 @@ import unittest +import unittest.mock from test.support import (verbose, refcount_test, run_unittest, - strip_python_stderr, cpython_only, start_threads, - temp_dir, requires_type_collecting, TESTFN, unlink, + cpython_only, start_threads, + temp_dir, TESTFN, unlink, import_module) from test.support.script_helper import assert_python_ok, make_script @@ -22,6 +23,11 @@ def __new__(cls, *args, **kwargs): raise TypeError('requires _testcapi.with_tp_del') return C +try: + from _testcapi import ContainerNoGC +except ImportError: + ContainerNoGC = None + ### Support code ############################################################################### @@ -125,7 +131,6 @@ class A: del a self.assertNotEqual(gc.collect(), 0) - @requires_type_collecting def test_newinstance(self): class A(object): pass @@ -576,9 +581,27 @@ class UserIntSlots(int): self.assertTrue(gc.is_tracked(UserInt())) self.assertTrue(gc.is_tracked([])) self.assertTrue(gc.is_tracked(set())) - self.assertFalse(gc.is_tracked(UserClassSlots())) - self.assertFalse(gc.is_tracked(UserFloatSlots())) - self.assertFalse(gc.is_tracked(UserIntSlots())) + self.assertTrue(gc.is_tracked(UserClassSlots())) + self.assertTrue(gc.is_tracked(UserFloatSlots())) + self.assertTrue(gc.is_tracked(UserIntSlots())) + + def test_is_finalized(self): + # Objects not tracked by the always gc return false + self.assertFalse(gc.is_finalized(3)) + + storage = [] + class Lazarus: + def __del__(self): + storage.append(self) + + lazarus = Lazarus() + self.assertFalse(gc.is_finalized(lazarus)) + + del lazarus + gc.collect() + + lazarus = storage.pop() + self.assertTrue(gc.is_finalized(lazarus)) def test_bug1055820b(self): # Corresponds to temp2b.py in the bug report. @@ -665,8 +688,8 @@ def run_command(code): p.stdout.close() p.stderr.close() self.assertEqual(p.returncode, 0) - self.assertEqual(stdout.strip(), b"") - return strip_python_stderr(stderr) + self.assertEqual(stdout, b"") + return stderr stderr = run_command(code % "0") self.assertIn(b"ResourceWarning: gc: 2 uncollectable objects at " @@ -685,7 +708,6 @@ def run_command(code): stderr = run_command(code % "gc.DEBUG_SAVEALL") self.assertNotIn(b"uncollectable objects at shutdown", stderr) - @requires_type_collecting def test_gc_main_module_at_shutdown(self): # Create a reference cycle through the __main__ module and check # it gets collected at interpreter shutdown. @@ -699,7 +721,6 @@ def __del__(self): rc, out, err = assert_python_ok('-c', code) self.assertEqual(out.strip(), b'__del__ called') - @requires_type_collecting def test_gc_ordinary_module_at_shutdown(self): # Same as above, but with a non-__main__ module. with temp_dir() as script_dir: @@ -719,7 +740,6 @@ def __del__(self): rc, out, err = assert_python_ok('-c', code) self.assertEqual(out.strip(), b'__del__ called') - @requires_type_collecting def test_global_del_SystemExit(self): code = """if 1: class ClassWithDel: @@ -822,7 +842,78 @@ def test_get_objects_arguments(self): self.assertRaises(TypeError, gc.get_objects, "1") self.assertRaises(TypeError, gc.get_objects, 1.234) - def test_38379(self): + def test_resurrection_only_happens_once_per_object(self): + class A: # simple self-loop + def __init__(self): + self.me = self + + class Lazarus(A): + resurrected = 0 + resurrected_instances = [] + + def __del__(self): + Lazarus.resurrected += 1 + Lazarus.resurrected_instances.append(self) + + gc.collect() + gc.disable() + + # We start with 0 resurrections + laz = Lazarus() + self.assertEqual(Lazarus.resurrected, 0) + + # Deleting the instance and triggering a collection + # resurrects the object + del laz + gc.collect() + self.assertEqual(Lazarus.resurrected, 1) + self.assertEqual(len(Lazarus.resurrected_instances), 1) + + # Clearing the references and forcing a collection + # should not resurrect the object again. + Lazarus.resurrected_instances.clear() + self.assertEqual(Lazarus.resurrected, 1) + gc.collect() + self.assertEqual(Lazarus.resurrected, 1) + + gc.enable() + + def test_resurrection_is_transitive(self): + class Cargo: + def __init__(self): + self.me = self + + class Lazarus: + resurrected_instances = [] + + def __del__(self): + Lazarus.resurrected_instances.append(self) + + gc.collect() + gc.disable() + + laz = Lazarus() + cargo = Cargo() + cargo_id = id(cargo) + + # Create a cycle between cargo and laz + laz.cargo = cargo + cargo.laz = laz + + # Drop the references, force a collection and check that + # everything was resurrected. + del laz, cargo + gc.collect() + self.assertEqual(len(Lazarus.resurrected_instances), 1) + instance = Lazarus.resurrected_instances.pop() + self.assertTrue(hasattr(instance, "cargo")) + self.assertEqual(id(instance.cargo), cargo_id) + + gc.collect() + gc.enable() + + def test_resurrection_does_not_block_cleanup_of_other_objects(self): + # When a finalizer resurrects objects, stats were reporting them as # having been collected. This affected both collect()'s return # value and the dicts returned by get_stats(). @@ -861,38 +952,93 @@ def getstats(): # Nothing is collected - Z() is merely resurrected. t = gc.collect() c, nc = getstats() - #self.assertEqual(t, 2) # before - self.assertEqual(t, 0) # after - #self.assertEqual(c - oldc, 2) # before - self.assertEqual(c - oldc, 0) # after + self.assertEqual(t, 0) + self.assertEqual(c - oldc, 0) self.assertEqual(nc - oldnc, 0) - # Unfortunately, a Z() prevents _anything_ from being collected. - # It should be possible to collect the A instances anyway, but - # that will require non-trivial code changes. + # Z() should not prevent anything else from being collected. oldc, oldnc = c, nc for i in range(N): A() Z() - # Z() prevents anything from being collected. t = gc.collect() c, nc = getstats() - #self.assertEqual(t, 2*N + 2) # before - self.assertEqual(t, 0) # after - #self.assertEqual(c - oldc, 2*N + 2) # before - self.assertEqual(c - oldc, 0) # after + self.assertEqual(t, 2*N) + self.assertEqual(c - oldc, 2*N) self.assertEqual(nc - oldnc, 0) - # But the A() trash is reclaimed on the next run. + # The A() trash should have been reclaimed already but the + # 2 copies of Z are still in zs (and the associated dicts). oldc, oldnc = c, nc + zs.clear() t = gc.collect() c, nc = getstats() - self.assertEqual(t, 2*N) - self.assertEqual(c - oldc, 2*N) + self.assertEqual(t, 4) + self.assertEqual(c - oldc, 4) self.assertEqual(nc - oldnc, 0) gc.enable() + @unittest.skipIf(ContainerNoGC is None, + 'requires ContainerNoGC extension type') + def test_trash_weakref_clear(self): + # Test that trash weakrefs are properly cleared (bpo-38006). + # + # Structure we are creating: + # + # Z <- Y <- A--+--> WZ -> C + # ^ | + # +--+ + # where: + # WZ is a weakref to Z with callback C + # Y doesn't implement tp_traverse + # A contains a reference to itself, Y and WZ + # + # A, Y, Z, WZ are all trash. The GC doesn't know that Z is trash + # because Y does not implement tp_traverse. To show the bug, WZ needs + # to live long enough so that Z is deallocated before it. Then, if + # gcmodule is buggy, when Z is being deallocated, C will run. + # + # To ensure WZ lives long enough, we put it in a second reference + # cycle. That trick only works due to the ordering of the GC prev/next + # linked lists. So, this test is a bit fragile. + # + # The bug reported in bpo-38006 is caused because the GC did not + # clear WZ before starting the process of calling tp_clear on the + # trash. Normally, handle_weakrefs() would find the weakref via Z and + # clear it. However, since the GC cannot find Z, WR is not cleared and + # it can execute during delete_garbage(). That can lead to disaster + # since the callback might tinker with objects that have already had + # tp_clear called on them (leaving them in possibly invalid states). + + callback = unittest.mock.Mock() + + class A: + __slots__ = ['a', 'y', 'wz'] + + class Z: + pass + + # setup required object graph, as described above + a = A() + a.a = a + a.y = ContainerNoGC(Z()) + a.wz = weakref.ref(a.y.value, callback) + # create second cycle to keep WZ alive longer + wr_cycle = [a.wz] + wr_cycle.append(wr_cycle) + # ensure trash unrelated to this test is gone + gc.collect() + gc.disable() + # release references and create trash + del a, wr_cycle + gc.collect() + # if called, it means there is a bug in the GC. The weakref should be + # cleared before Z dies. + callback.assert_not_called() + gc.enable() + + class GCCallbackTests(unittest.TestCase): def setUp(self): # Save gc state and disable it. diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py index d90ca5a51ae1be1d77e372f64ec9bb3fa753014f..22c75bae987219d954a989764067dcbed94bd4e9 100644 --- a/Lib/test/test_gdb.py +++ b/Lib/test/test_gdb.py @@ -13,7 +13,7 @@ import unittest from test import support -from test.support import run_unittest, findfile, python_is_optimized +from test.support import findfile, python_is_optimized def get_gdb_version(): try: @@ -371,7 +371,6 @@ def test_strings(self): def check_repr(text): try: text.encode(encoding) - printable = True except UnicodeEncodeError: self.assertGdbRepr(text, ascii(text)) else: @@ -862,47 +861,66 @@ def test_gc(self): ) self.assertIn('Garbage-collecting', gdb_output) + @unittest.skipIf(python_is_optimized(), "Python was compiled with optimizations") # Some older versions of gdb will fail with # "Cannot find new threads: generic error" # unless we add LD_PRELOAD=PATH-TO-libpthread.so.1 as a workaround + # + # gdb will also generate many erroneous errors such as: + # Function "meth_varargs" not defined. + # This is because we are calling functions from an "external" module + # (_testcapimodule) rather than compiled-in functions. It seems difficult + # to suppress these. See also the comment in DebuggerTests.get_stack_trace def test_pycfunction(self): 'Verify that "py-bt" displays invocations of PyCFunction instances' # Various optimizations multiply the code paths by which these are # called, so test a variety of calling conventions. - for py_name, py_args, c_name, expected_frame_number in ( - ('gmtime', '', 'time_gmtime', 1), # METH_VARARGS - ('len', '[]', 'builtin_len', 1), # METH_O - ('locals', '', 'builtin_locals', 1), # METH_NOARGS - ('iter', '[]', 'builtin_iter', 1), # METH_FASTCALL - ('sorted', '[]', 'builtin_sorted', 1), # METH_FASTCALL|METH_KEYWORDS + for func_name, args, expected_frame in ( + ('meth_varargs', '', 1), + ('meth_varargs_keywords', '', 1), + ('meth_o', '[]', 1), + ('meth_noargs', '', 1), + ('meth_fastcall', '', 1), + ('meth_fastcall_keywords', '', 1), ): - with self.subTest(c_name): - cmd = ('from time import gmtime\n' # (not always needed) - 'def foo():\n' - f' {py_name}({py_args})\n' - 'def bar():\n' - ' foo()\n' - 'bar()\n') - # Verify with "py-bt": - gdb_output = self.get_stack_trace( - cmd, - breakpoint=c_name, - cmds_after_breakpoint=['bt', 'py-bt'], - ) - self.assertIn(f'>> def f(): x = yield = y -Traceback (most recent call last): - ... -SyntaxError: assignment to yield expression not possible +# Pegen does not produce this error message yet +# >>> def f(): x = yield = y +# Traceback (most recent call last): +# ... +# SyntaxError: assignment to yield expression not possible >>> def f(): (yield bar) = y Traceback (most recent call last): @@ -1869,7 +2018,7 @@ def printsolution(self, x): >>> def f(): (yield bar) += y Traceback (most recent call last): ... -SyntaxError: cannot assign to yield expression +SyntaxError: 'yield expression' is an illegal expression for augmented assignment Now check some throw() conditions: diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py new file mode 100644 index 0000000000000000000000000000000000000000..ccf40b13d3a94c00eaf4c87cf5cbcce94646d7a0 --- /dev/null +++ b/Lib/test/test_genericalias.py @@ -0,0 +1,374 @@ +"""Tests for C-implemented GenericAlias.""" + +import unittest +import pickle +from collections import ( + defaultdict, deque, OrderedDict, Counter, UserDict, UserList +) +from collections.abc import * +from concurrent.futures import Future +from concurrent.futures.thread import _WorkItem +from contextlib import AbstractContextManager, AbstractAsyncContextManager +from contextvars import ContextVar, Token +from dataclasses import Field +from functools import partial, partialmethod, cached_property +from mailbox import Mailbox, _PartialFile +try: + import ctypes +except ImportError: + ctypes = None +from difflib import SequenceMatcher +from filecmp import dircmp +from fileinput import FileInput +from itertools import chain +from http.cookies import Morsel +from multiprocessing.managers import ValueProxy +from multiprocessing.pool import ApplyResult +try: + from multiprocessing.shared_memory import ShareableList +except ImportError: + # multiprocessing.shared_memory is not available on e.g. Android + ShareableList = None +from multiprocessing.queues import SimpleQueue as MPSimpleQueue +from os import DirEntry +from re import Pattern, Match +from types import GenericAlias, MappingProxyType, AsyncGeneratorType +from tempfile import TemporaryDirectory, SpooledTemporaryFile +from urllib.parse import SplitResult, ParseResult +from unittest.case import _AssertRaisesContext +from queue import Queue, SimpleQueue +from weakref import WeakSet, ReferenceType, ref +import typing + +from typing import TypeVar +T = TypeVar('T') +K = TypeVar('K') +V = TypeVar('V') + +class BaseTest(unittest.TestCase): + """Test basics.""" + generic_types = [type, tuple, list, dict, set, frozenset, enumerate, + defaultdict, deque, + SequenceMatcher, + dircmp, + FileInput, + OrderedDict, Counter, UserDict, UserList, + Pattern, Match, + partial, partialmethod, cached_property, + AbstractContextManager, AbstractAsyncContextManager, + Awaitable, Coroutine, + AsyncIterable, AsyncIterator, + AsyncGenerator, Generator, + Iterable, Iterator, + Reversible, + Container, Collection, + Mailbox, _PartialFile, + ContextVar, Token, + Field, + Set, MutableSet, + Mapping, MutableMapping, MappingView, + KeysView, ItemsView, ValuesView, + Sequence, MutableSequence, + MappingProxyType, AsyncGeneratorType, + DirEntry, + chain, + TemporaryDirectory, SpooledTemporaryFile, + Queue, SimpleQueue, + _AssertRaisesContext, + SplitResult, ParseResult, + ValueProxy, ApplyResult, + WeakSet, ReferenceType, ref, + ShareableList, MPSimpleQueue, + Future, _WorkItem, + Morsel] + if ctypes is not None: + generic_types.extend((ctypes.Array, ctypes.LibraryLoader)) + + def test_subscriptable(self): + for t in self.generic_types: + if t is None: + continue + tname = t.__name__ + with self.subTest(f"Testing {tname}"): + alias = t[int] + self.assertIs(alias.__origin__, t) + self.assertEqual(alias.__args__, (int,)) + self.assertEqual(alias.__parameters__, ()) + + def test_unsubscriptable(self): + for t in int, str, float, Sized, Hashable: + tname = t.__name__ + with self.subTest(f"Testing {tname}"): + with self.assertRaises(TypeError): + t[int] + + def test_instantiate(self): + for t in tuple, list, dict, set, frozenset, defaultdict, deque: + tname = t.__name__ + with self.subTest(f"Testing {tname}"): + alias = t[int] + self.assertEqual(alias(), t()) + if t is dict: + self.assertEqual(alias(iter([('a', 1), ('b', 2)])), dict(a=1, b=2)) + self.assertEqual(alias(a=1, b=2), dict(a=1, b=2)) + elif t is defaultdict: + def default(): + return 'value' + a = alias(default) + d = defaultdict(default) + self.assertEqual(a['test'], d['test']) + else: + self.assertEqual(alias(iter((1, 2, 3))), t((1, 2, 3))) + + def test_unbound_methods(self): + t = list[int] + a = t() + t.append(a, 'foo') + self.assertEqual(a, ['foo']) + x = t.__getitem__(a, 0) + self.assertEqual(x, 'foo') + self.assertEqual(t.__len__(a), 1) + + def test_subclassing(self): + class C(list[int]): + pass + self.assertEqual(C.__bases__, (list,)) + self.assertEqual(C.__class__, type) + + def test_class_methods(self): + t = dict[int, None] + self.assertEqual(dict.fromkeys(range(2)), {0: None, 1: None}) # This works + self.assertEqual(t.fromkeys(range(2)), {0: None, 1: None}) # Should be equivalent + + def test_no_chaining(self): + t = list[int] + with self.assertRaises(TypeError): + t[int] + + def test_generic_subclass(self): + class MyList(list): + pass + t = MyList[int] + self.assertIs(t.__origin__, MyList) + self.assertEqual(t.__args__, (int,)) + self.assertEqual(t.__parameters__, ()) + + def test_repr(self): + class MyList(list): + pass + self.assertEqual(repr(list[str]), 'list[str]') + self.assertEqual(repr(list[()]), 'list[()]') + self.assertEqual(repr(tuple[int, ...]), 'tuple[int, ...]') + self.assertTrue(repr(MyList[int]).endswith('.BaseTest.test_repr..MyList[int]')) + self.assertEqual(repr(list[str]()), '[]') # instances should keep their normal repr + + def test_exposed_type(self): + import types + a = types.GenericAlias(list, int) + self.assertEqual(str(a), 'list[int]') + self.assertIs(a.__origin__, list) + self.assertEqual(a.__args__, (int,)) + self.assertEqual(a.__parameters__, ()) + + def test_parameters(self): + from typing import List, Dict, Callable + D0 = dict[str, int] + self.assertEqual(D0.__args__, (str, int)) + self.assertEqual(D0.__parameters__, ()) + D1a = dict[str, V] + self.assertEqual(D1a.__args__, (str, V)) + self.assertEqual(D1a.__parameters__, (V,)) + D1b = dict[K, int] + self.assertEqual(D1b.__args__, (K, int)) + self.assertEqual(D1b.__parameters__, (K,)) + D2a = dict[K, V] + self.assertEqual(D2a.__args__, (K, V)) + self.assertEqual(D2a.__parameters__, (K, V)) + D2b = dict[T, T] + self.assertEqual(D2b.__args__, (T, T)) + self.assertEqual(D2b.__parameters__, (T,)) + L0 = list[str] + self.assertEqual(L0.__args__, (str,)) + self.assertEqual(L0.__parameters__, ()) + L1 = list[T] + self.assertEqual(L1.__args__, (T,)) + self.assertEqual(L1.__parameters__, (T,)) + L2 = list[list[T]] + self.assertEqual(L2.__args__, (list[T],)) + self.assertEqual(L2.__parameters__, (T,)) + L3 = list[List[T]] + self.assertEqual(L3.__args__, (List[T],)) + self.assertEqual(L3.__parameters__, (T,)) + L4a = list[Dict[K, V]] + self.assertEqual(L4a.__args__, (Dict[K, V],)) + self.assertEqual(L4a.__parameters__, (K, V)) + L4b = list[Dict[T, int]] + self.assertEqual(L4b.__args__, (Dict[T, int],)) + self.assertEqual(L4b.__parameters__, (T,)) + L5 = list[Callable[[K, V], K]] + self.assertEqual(L5.__args__, (Callable[[K, V], K],)) + self.assertEqual(L5.__parameters__, (K, V)) + + def test_parameter_chaining(self): + from typing import List, Dict, Union, Callable + self.assertEqual(list[T][int], list[int]) + self.assertEqual(dict[str, T][int], dict[str, int]) + self.assertEqual(dict[T, int][str], dict[str, int]) + self.assertEqual(dict[K, V][str, int], dict[str, int]) + self.assertEqual(dict[T, T][int], dict[int, int]) + + self.assertEqual(list[list[T]][int], list[list[int]]) + self.assertEqual(list[dict[T, int]][str], list[dict[str, int]]) + self.assertEqual(list[dict[str, T]][int], list[dict[str, int]]) + self.assertEqual(list[dict[K, V]][str, int], list[dict[str, int]]) + self.assertEqual(dict[T, list[int]][str], dict[str, list[int]]) + + self.assertEqual(list[List[T]][int], list[List[int]]) + self.assertEqual(list[Dict[K, V]][str, int], list[Dict[str, int]]) + self.assertEqual(list[Union[K, V]][str, int], list[Union[str, int]]) + self.assertEqual(list[Callable[[K, V], K]][str, int], + list[Callable[[str, int], str]]) + self.assertEqual(dict[T, List[int]][str], dict[str, List[int]]) + + with self.assertRaises(TypeError): + list[int][int] + dict[T, int][str, int] + dict[str, T][str, int] + dict[T, T][str, int] + + def test_equality(self): + self.assertEqual(list[int], list[int]) + self.assertEqual(dict[str, int], dict[str, int]) + self.assertNotEqual(dict[str, int], dict[str, str]) + self.assertNotEqual(list, list[int]) + self.assertNotEqual(list[int], list) + + def test_isinstance(self): + self.assertTrue(isinstance([], list)) + with self.assertRaises(TypeError): + isinstance([], list[str]) + + def test_issubclass(self): + class L(list): ... + self.assertTrue(issubclass(L, list)) + with self.assertRaises(TypeError): + issubclass(L, list[str]) + + def test_type_generic(self): + t = type[int] + Test = t('Test', (), {}) + self.assertTrue(isinstance(Test, type)) + test = Test() + self.assertEqual(t(test), Test) + self.assertEqual(t(0), int) + + def test_type_subclass_generic(self): + class MyType(type): + pass + with self.assertRaises(TypeError): + MyType[int] + + def test_pickle(self): + alias = GenericAlias(list, T) + s = pickle.dumps(alias) + loaded = pickle.loads(s) + self.assertEqual(alias.__origin__, loaded.__origin__) + self.assertEqual(alias.__args__, loaded.__args__) + self.assertEqual(alias.__parameters__, loaded.__parameters__) + + def test_union(self): + a = typing.Union[list[int], list[str]] + self.assertEqual(a.__args__, (list[int], list[str])) + self.assertEqual(a.__parameters__, ()) + + def test_union_generic(self): + a = typing.Union[list[T], tuple[T, ...]] + self.assertEqual(a.__args__, (list[T], tuple[T, ...])) + self.assertEqual(a.__parameters__, (T,)) + + def test_dir(self): + dir_of_gen_alias = set(dir(list[int])) + self.assertTrue(dir_of_gen_alias.issuperset(dir(list))) + for generic_alias_property in ("__origin__", "__args__", "__parameters__"): + self.assertIn(generic_alias_property, dir_of_gen_alias) + + def test_weakref(self): + for t in self.generic_types: + if t is None: + continue + tname = t.__name__ + with self.subTest(f"Testing {tname}"): + alias = t[int] + self.assertEqual(ref(alias)(), alias) + + def test_no_kwargs(self): + # bpo-42576 + with self.assertRaises(TypeError): + GenericAlias(bad=float) + + def test_subclassing_types_genericalias(self): + class SubClass(GenericAlias): ... + alias = SubClass(list, int) + class Bad(GenericAlias): + def __new__(cls, *args, **kwargs): + super().__new__(cls, *args, **kwargs) + + self.assertEqual(alias, list[int]) + with self.assertRaises(TypeError): + Bad(list, int, bad=int) + + def test_abc_callable(self): + # A separate test is needed for Callable since it uses a subclass of + # GenericAlias. + alias = Callable[[int, str], float] + with self.subTest("Testing subscription"): + self.assertIs(alias.__origin__, Callable) + self.assertEqual(alias.__args__, (int, str, float)) + self.assertEqual(alias.__parameters__, ()) + + with self.subTest("Testing instance checks"): + self.assertIsInstance(alias, GenericAlias) + + with self.subTest("Testing weakref"): + self.assertEqual(ref(alias)(), alias) + + with self.subTest("Testing pickling"): + s = pickle.dumps(alias) + loaded = pickle.loads(s) + self.assertEqual(alias.__origin__, loaded.__origin__) + self.assertEqual(alias.__args__, loaded.__args__) + self.assertEqual(alias.__parameters__, loaded.__parameters__) + + with self.subTest("Testing TypeVar substitution"): + C1 = Callable[[int, T], T] + C2 = Callable[[K, T], V] + C3 = Callable[..., T] + self.assertEqual(C1[str], Callable[[int, str], str]) + self.assertEqual(C2[int, float, str], Callable[[int, float], str]) + self.assertEqual(C3[int], Callable[..., int]) + + # multi chaining + C4 = C2[int, V, str] + self.assertEqual(repr(C4).split(".")[-1], "Callable[[int, ~V], str]") + self.assertEqual(repr(C4[dict]).split(".")[-1], "Callable[[int, dict], str]") + self.assertEqual(C4[dict], Callable[[int, dict], str]) + + with self.subTest("Testing type erasure"): + class C1(Callable): + def __call__(self): + return None + a = C1[[int], T] + self.assertIs(a().__class__, C1) + self.assertEqual(a().__orig_class__, C1[[int], T]) + + # bpo-42195 + with self.subTest("Testing collections.abc.Callable's consistency " + "with typing.Callable"): + c1 = typing.Callable[[int, str], dict] + c2 = Callable[[int, str], dict] + self.assertEqual(c1.__args__, c2.__args__) + self.assertEqual(hash(c1.__args__), hash(c2.__args__)) + + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_genericpath.py b/Lib/test/test_genericpath.py index 9d5ac44b6d06a7f0cbb14644e3adfe7c312e7754..e7acbcd29088b39f6998b168d8504d868c7f2969 100644 --- a/Lib/test/test_genericpath.py +++ b/Lib/test/test_genericpath.py @@ -534,7 +534,7 @@ def test_import(self): class PathLikeTests(unittest.TestCase): def setUp(self): - self.file_name = support.TESTFN.lower() + self.file_name = support.TESTFN self.file_path = FakePath(support.TESTFN) self.addCleanup(support.unlink, self.file_name) create_file(self.file_name, b"test_genericpath.PathLikeTests") diff --git a/Lib/test/test_genexps.py b/Lib/test/test_genexps.py index fd712bb172d5df708a8e515c838d604cbbaf848e..5c1a209b0e99086e0d55478a17ac6571bcf4c0be 100644 --- a/Lib/test/test_genexps.py +++ b/Lib/test/test_genexps.py @@ -15,6 +15,22 @@ >>> list((i,j) for i in range(4) for j in range(i) ) [(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2)] +Test the idiom for temporary variable assignment in comprehensions. + + >>> list((j*j for i in range(4) for j in [i+1])) + [1, 4, 9, 16] + >>> list((j*k for i in range(4) for j in [i+1] for k in [j+1])) + [2, 6, 12, 20] + >>> list((j*k for i in range(4) for j, k in [(i+1, i+2)])) + [2, 6, 12, 20] + +Not assignment + + >>> list((i*i for i in [*range(4)])) + [0, 1, 4, 9] + >>> list((i*i for i in (*range(4),))) + [0, 1, 4, 9] + Make sure the induction variable is not exposed >>> i = 20 @@ -142,7 +158,7 @@ >>> (y for y in (1,2)) += 10 Traceback (most recent call last): ... - SyntaxError: cannot assign to generator expression + SyntaxError: 'generator expression' is an illegal expression for augmented assignment ########### Tests borrowed from or inspired by test_generators.py ############ diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py index 2ed73e3ae81484202d348a2707e60985a158a7e9..e1a402e2b463b131eb532a17740b2079fab671a6 100644 --- a/Lib/test/test_grammar.py +++ b/Lib/test/test_grammar.py @@ -1,7 +1,7 @@ # Python test set -- part 1, grammar. # This just tests whether the parser accepts them all. -from test.support import check_syntax_error, check_syntax_warning +from test.support import check_syntax_error, check_syntax_warning, use_old_parser import inspect import unittest import sys @@ -460,7 +460,7 @@ def test_var_annot_rhs(self): def test_funcdef(self): ### [decorators] 'def' NAME parameters ['->' test] ':' suite - ### decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE + ### decorator: '@' namedexpr_test NEWLINE ### decorators: decorator+ ### parameters: '(' [typedargslist] ')' ### typedargslist: ((tfpdef ['=' test] ',')* @@ -666,6 +666,20 @@ def null(x): return x def f(x) -> list: pass self.assertEqual(f.__annotations__, {'return': list}) + # Test expressions as decorators (PEP 614): + @False or null + def f(x): pass + @d := null + def f(x): pass + @lambda f: null(f) + def f(x): pass + @[..., null, ...][1] + def f(x): pass + @null(null)(null) + def f(x): pass + @[null][0].__call__.__call__ + def f(x): pass + # test closures with a variety of opargs closure = 1 def f(): return closure @@ -787,6 +801,23 @@ def test_del_stmt(self): del abc del x, y, (z, xyz) + x, y, z = "xyz" + del x + del y, + del (z) + del () + + a, b, c, d, e, f, g = "abcdefg" + del a, (b, c), (d, (e, f)) + + a, b, c, d, e, f, g = "abcdefg" + del a, [b, c], (d, [e, f]) + + abcd = list("abcd") + del abcd[1:2] + + compile("del a, (b[0].c, (d.e, f.g[1:2])), [h.i.j], ()", "", "exec") + def test_pass_stmt(self): # 'pass' pass @@ -1248,7 +1279,7 @@ def __getitem__(self, i): def test_try(self): ### try_stmt: 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite] ### | 'try' ':' suite 'finally' ':' suite - ### except_clause: 'except' [expr ['as' expr]] + ### except_clause: 'except' [expr ['as' NAME]] try: 1/0 except ZeroDivisionError: @@ -1266,6 +1297,9 @@ def test_try(self): except (EOFError, TypeError, ZeroDivisionError) as msg: pass try: pass finally: pass + with self.assertRaises(SyntaxError): + compile("try:\n pass\nexcept Exception as a.b:\n pass", "?", "exec") + compile("try:\n pass\nexcept Exception as a[b]:\n pass", "?", "exec") def test_suite(self): # simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT @@ -1515,13 +1549,27 @@ def meth1(self): pass def meth2(self, arg): pass def meth3(self, a1, a2): pass - # decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE + # decorator: '@' namedexpr_test NEWLINE # decorators: decorator+ # decorated: decorators (classdef | funcdef) def class_decorator(x): return x @class_decorator class G: pass + # Test expressions as decorators (PEP 614): + @False or class_decorator + class H: pass + @d := class_decorator + class I: pass + @lambda c: class_decorator(c) + class J: pass + @[..., class_decorator, ...][1] + class K: pass + @class_decorator(class_decorator)(class_decorator) + class L: pass + @[class_decorator][0].__call__.__call__ + class M: pass + def test_dictcomps(self): # dictorsetmaker: ( (test ':' test (comp_for | # (',' test ':' test)* [','])) | @@ -1666,6 +1714,70 @@ def __exit__(self, *args): with manager() as x, manager(): pass + if not use_old_parser(): + test_cases = [ + """if 1: + with ( + manager() + ): + pass + """, + """if 1: + with ( + manager() as x + ): + pass + """, + """if 1: + with ( + manager() as (x, y), + manager() as z, + ): + pass + """, + """if 1: + with ( + manager(), + manager() + ): + pass + """, + """if 1: + with ( + manager() as x, + manager() as y + ): + pass + """, + """if 1: + with ( + manager() as x, + manager() + ): + pass + """, + """if 1: + with ( + manager() as x, + manager() as y, + manager() as z, + ): + pass + """, + """if 1: + with ( + manager() as x, + manager() as y, + manager(), + ): + pass + """, + ] + for case in test_cases: + with self.subTest(case=case): + compile(case, "", "exec") + + def test_if_else_expr(self): # Test ifelse expressions in various cases def _checkeval(msg, ret): diff --git a/Lib/test/test_graphlib.py b/Lib/test/test_graphlib.py new file mode 100644 index 0000000000000000000000000000000000000000..00432537f22d006d5a0855933e5341270aa2cd91 --- /dev/null +++ b/Lib/test/test_graphlib.py @@ -0,0 +1,244 @@ +from itertools import chain +import graphlib +import os +import unittest + +from test.support.script_helper import assert_python_ok + +class TestTopologicalSort(unittest.TestCase): + def _test_graph(self, graph, expected): + def static_order_with_groups(ts): + ts.prepare() + while ts.is_active(): + nodes = ts.get_ready() + for node in nodes: + ts.done(node) + yield nodes + + ts = graphlib.TopologicalSorter(graph) + self.assertEqual(list(static_order_with_groups(ts)), list(expected)) + + ts = graphlib.TopologicalSorter(graph) + self.assertEqual(list(ts.static_order()), list(chain(*expected))) + + def _assert_cycle(self, graph, cycle): + ts = graphlib.TopologicalSorter() + for node, dependson in graph.items(): + ts.add(node, *dependson) + try: + ts.prepare() + except graphlib.CycleError as e: + msg, seq = e.args + self.assertIn(" ".join(map(str, cycle)), " ".join(map(str, seq * 2))) + else: + raise + + def test_simple_cases(self): + self._test_graph( + {2: {11}, 9: {11, 8}, 10: {11, 3}, 11: {7, 5}, 8: {7, 3}}, + [(3, 5, 7), (11, 8), (2, 10, 9)], + ) + + self._test_graph({1: {}}, [(1,)]) + + self._test_graph( + {x: {x + 1} for x in range(10)}, [(x,) for x in range(10, -1, -1)] + ) + + self._test_graph( + {2: {3}, 3: {4}, 4: {5}, 5: {1}, 11: {12}, 12: {13}, 13: {14}, 14: {15}}, + [(1, 15), (5, 14), (4, 13), (3, 12), (2, 11)], + ) + + self._test_graph( + { + 0: [1, 2], + 1: [3], + 2: [5, 6], + 3: [4], + 4: [9], + 5: [3], + 6: [7], + 7: [8], + 8: [4], + 9: [], + }, + [(9,), (4,), (3, 8), (1, 5, 7), (6,), (2,), (0,)], + ) + + self._test_graph({0: [1, 2], 1: [], 2: [3], 3: []}, [(1, 3), (2,), (0,)]) + + self._test_graph( + {0: [1, 2], 1: [], 2: [3], 3: [], 4: [5], 5: [6], 6: []}, + [(1, 3, 6), (2, 5), (0, 4)], + ) + + def test_no_dependencies(self): + self._test_graph({1: {2}, 3: {4}, 5: {6}}, [(2, 4, 6), (1, 3, 5)]) + + self._test_graph({1: set(), 3: set(), 5: set()}, [(1, 3, 5)]) + + def test_the_node_multiple_times(self): + # Test same node multiple times in dependencies + self._test_graph({1: {2}, 3: {4}, 0: [2, 4, 4, 4, 4, 4]}, [(2, 4), (1, 3, 0)]) + + # Test adding the same dependency multiple times + ts = graphlib.TopologicalSorter() + ts.add(1, 2) + ts.add(1, 2) + ts.add(1, 2) + self.assertEqual([*ts.static_order()], [2, 1]) + + def test_graph_with_iterables(self): + dependson = (2 * x + 1 for x in range(5)) + ts = graphlib.TopologicalSorter({0: dependson}) + self.assertEqual(list(ts.static_order()), [1, 3, 5, 7, 9, 0]) + + def test_add_dependencies_for_same_node_incrementally(self): + # Test same node multiple times + ts = graphlib.TopologicalSorter() + ts.add(1, 2) + ts.add(1, 3) + ts.add(1, 4) + ts.add(1, 5) + + ts2 = graphlib.TopologicalSorter({1: {2, 3, 4, 5}}) + self.assertEqual([*ts.static_order()], [*ts2.static_order()]) + + def test_empty(self): + self._test_graph({}, []) + + def test_cycle(self): + # Self cycle + self._assert_cycle({1: {1}}, [1, 1]) + # Simple cycle + self._assert_cycle({1: {2}, 2: {1}}, [1, 2, 1]) + # Indirect cycle + self._assert_cycle({1: {2}, 2: {3}, 3: {1}}, [1, 3, 2, 1]) + # not all elements involved in a cycle + self._assert_cycle({1: {2}, 2: {3}, 3: {1}, 5: {4}, 4: {6}}, [1, 3, 2, 1]) + # Multiple cycles + self._assert_cycle({1: {2}, 2: {1}, 3: {4}, 4: {5}, 6: {7}, 7: {6}}, [1, 2, 1]) + # Cycle in the middle of the graph + self._assert_cycle({1: {2}, 2: {3}, 3: {2, 4}, 4: {5}}, [3, 2]) + + def test_calls_before_prepare(self): + ts = graphlib.TopologicalSorter() + + with self.assertRaisesRegex(ValueError, r"prepare\(\) must be called first"): + ts.get_ready() + with self.assertRaisesRegex(ValueError, r"prepare\(\) must be called first"): + ts.done(3) + with self.assertRaisesRegex(ValueError, r"prepare\(\) must be called first"): + ts.is_active() + + def test_prepare_multiple_times(self): + ts = graphlib.TopologicalSorter() + ts.prepare() + with self.assertRaisesRegex(ValueError, r"cannot prepare\(\) more than once"): + ts.prepare() + + def test_invalid_nodes_in_done(self): + ts = graphlib.TopologicalSorter() + ts.add(1, 2, 3, 4) + ts.add(2, 3, 4) + ts.prepare() + ts.get_ready() + + with self.assertRaisesRegex(ValueError, "node 2 was not passed out"): + ts.done(2) + with self.assertRaisesRegex(ValueError, r"node 24 was not added using add\(\)"): + ts.done(24) + + def test_done(self): + ts = graphlib.TopologicalSorter() + ts.add(1, 2, 3, 4) + ts.add(2, 3) + ts.prepare() + + self.assertEqual(ts.get_ready(), (3, 4)) + # If we don't mark anything as done, get_ready() returns nothing + self.assertEqual(ts.get_ready(), ()) + ts.done(3) + # Now 2 becomes available as 3 is done + self.assertEqual(ts.get_ready(), (2,)) + self.assertEqual(ts.get_ready(), ()) + ts.done(4) + ts.done(2) + # Only 1 is missing + self.assertEqual(ts.get_ready(), (1,)) + self.assertEqual(ts.get_ready(), ()) + ts.done(1) + self.assertEqual(ts.get_ready(), ()) + self.assertFalse(ts.is_active()) + + def test_is_active(self): + ts = graphlib.TopologicalSorter() + ts.add(1, 2) + ts.prepare() + + self.assertTrue(ts.is_active()) + self.assertEqual(ts.get_ready(), (2,)) + self.assertTrue(ts.is_active()) + ts.done(2) + self.assertTrue(ts.is_active()) + self.assertEqual(ts.get_ready(), (1,)) + self.assertTrue(ts.is_active()) + ts.done(1) + self.assertFalse(ts.is_active()) + + def test_not_hashable_nodes(self): + ts = graphlib.TopologicalSorter() + self.assertRaises(TypeError, ts.add, dict(), 1) + self.assertRaises(TypeError, ts.add, 1, dict()) + self.assertRaises(TypeError, ts.add, dict(), dict()) + + def test_order_of_insertion_does_not_matter_between_groups(self): + def get_groups(ts): + ts.prepare() + while ts.is_active(): + nodes = ts.get_ready() + ts.done(*nodes) + yield set(nodes) + + ts = graphlib.TopologicalSorter() + ts.add(3, 2, 1) + ts.add(1, 0) + ts.add(4, 5) + ts.add(6, 7) + ts.add(4, 7) + + ts2 = graphlib.TopologicalSorter() + ts2.add(1, 0) + ts2.add(3, 2, 1) + ts2.add(4, 7) + ts2.add(6, 7) + ts2.add(4, 5) + + self.assertEqual(list(get_groups(ts)), list(get_groups(ts2))) + + def test_static_order_does_not_change_with_the_hash_seed(self): + def check_order_with_hash_seed(seed): + code = """if 1: + import graphlib + ts = graphlib.TopologicalSorter() + ts.add('blech', 'bluch', 'hola') + ts.add('abcd', 'blech', 'bluch', 'a', 'b') + ts.add('a', 'a string', 'something', 'b') + ts.add('bluch', 'hola', 'abcde', 'a', 'b') + print(list(ts.static_order())) + """ + env = os.environ.copy() + # signal to assert_python not to do a copy + # of os.environ on its own + env["__cleanenv"] = True + env["PYTHONHASHSEED"] = str(seed) + out = assert_python_ok("-c", code, **env) + return out + + run1 = check_order_with_hash_seed(1234) + run2 = check_order_with_hash_seed(31415) + + self.assertNotEqual(run1, "") + self.assertNotEqual(run2, "") + self.assertEqual(run1, run2) diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py index 646828621a53c871c12fc94df65bb712646328af..0f235d1805e0d3a1df9763460f78675ace9af6de 100644 --- a/Lib/test/test_gzip.py +++ b/Lib/test/test_gzip.py @@ -328,8 +328,15 @@ def test_metadata(self): cmByte = fRead.read(1) self.assertEqual(cmByte, b'\x08') # deflate + try: + expectedname = self.filename.encode('Latin-1') + b'\x00' + expectedflags = b'\x08' # only the FNAME flag is set + except UnicodeEncodeError: + expectedname = b'' + expectedflags = b'\x00' + flagsByte = fRead.read(1) - self.assertEqual(flagsByte, b'\x08') # only the FNAME flag is set + self.assertEqual(flagsByte, expectedflags) mtimeBytes = fRead.read(4) self.assertEqual(mtimeBytes, struct.pack(' 1.0') def test_pbkdf2_hmac_c(self): - self._test_pbkdf2_hmac(c_hashlib.pbkdf2_hmac) - + self._test_pbkdf2_hmac(openssl_hashlib.pbkdf2_hmac, openssl_md_meth_names) - @unittest.skipUnless(hasattr(c_hashlib, 'scrypt'), + @unittest.skipUnless(hasattr(hashlib, 'scrypt'), ' test requires OpenSSL > 1.1') def test_scrypt(self): for password, salt, n, r, p, expected in self.scrypt_test_vectors: diff --git a/Lib/test/test_hmac.py b/Lib/test/test_hmac.py index 23c108f6e3c27c5c5d388e305b13ece7aeb500b6..6daf22ca06fb80ad2b3d99fd36dbd3e33a89e643 100644 --- a/Lib/test/test_hmac.py +++ b/Lib/test/test_hmac.py @@ -6,7 +6,18 @@ import unittest.mock import warnings -from test.support import requires_hashdigest +from test.support import hashlib_helper + +from _operator import _compare_digest as operator_compare_digest + +try: + from _hashlib import HMAC as C_HMAC + from _hashlib import hmac_new as c_hmac_new + from _hashlib import compare_digest as openssl_compare_digest +except ImportError: + C_HMAC = None + c_hmac_new = None + openssl_compare_digest = None def ignore_warning(func): @@ -21,34 +32,91 @@ def wrapper(*args, **kwargs): class TestVectorsTestCase(unittest.TestCase): - @requires_hashdigest('md5', openssl=True) - def test_md5_vectors(self): - # Test the HMAC module against test vectors from the RFC. + def asssert_hmac( + self, key, data, digest, hashfunc, hashname, digest_size, block_size + ): + h = hmac.HMAC(key, data, digestmod=hashfunc) + self.assertEqual(h.hexdigest().upper(), digest.upper()) + self.assertEqual(h.digest(), binascii.unhexlify(digest)) + self.assertEqual(h.name, f"hmac-{hashname}") + self.assertEqual(h.digest_size, digest_size) + self.assertEqual(h.block_size, block_size) + + h = hmac.HMAC(key, data, digestmod=hashname) + self.assertEqual(h.hexdigest().upper(), digest.upper()) + self.assertEqual(h.digest(), binascii.unhexlify(digest)) + self.assertEqual(h.name, f"hmac-{hashname}") + self.assertEqual(h.digest_size, digest_size) + self.assertEqual(h.block_size, block_size) + + h = hmac.HMAC(key, digestmod=hashname) + h2 = h.copy() + h2.update(b"test update") + h.update(data) + self.assertEqual(h.hexdigest().upper(), digest.upper()) + + h = hmac.new(key, data, digestmod=hashname) + self.assertEqual(h.hexdigest().upper(), digest.upper()) + self.assertEqual(h.digest(), binascii.unhexlify(digest)) + self.assertEqual(h.name, f"hmac-{hashname}") + self.assertEqual(h.digest_size, digest_size) + self.assertEqual(h.block_size, block_size) + + h = hmac.new(key, None, digestmod=hashname) + h.update(data) + self.assertEqual(h.hexdigest().upper(), digest.upper()) + + h = hmac.new(key, digestmod=hashname) + h.update(data) + self.assertEqual(h.hexdigest().upper(), digest.upper()) + + h = hmac.new(key, data, digestmod=hashfunc) + self.assertEqual(h.hexdigest().upper(), digest.upper()) + + self.assertEqual( + hmac.digest(key, data, digest=hashname), + binascii.unhexlify(digest) + ) + self.assertEqual( + hmac.digest(key, data, digest=hashfunc), + binascii.unhexlify(digest) + ) + with unittest.mock.patch('hmac._openssl_md_meths', {}): + self.assertEqual( + hmac.digest(key, data, digest=hashname), + binascii.unhexlify(digest) + ) + self.assertEqual( + hmac.digest(key, data, digest=hashfunc), + binascii.unhexlify(digest) + ) - def md5test(key, data, digest): - h = hmac.HMAC(key, data, digestmod=hashlib.md5) + if c_hmac_new is not None: + h = c_hmac_new(key, data, digestmod=hashname) self.assertEqual(h.hexdigest().upper(), digest.upper()) self.assertEqual(h.digest(), binascii.unhexlify(digest)) - self.assertEqual(h.name, "hmac-md5") - self.assertEqual(h.digest_size, 16) - self.assertEqual(h.block_size, 64) + self.assertEqual(h.name, f"hmac-{hashname}") + self.assertEqual(h.digest_size, digest_size) + self.assertEqual(h.block_size, block_size) - h = hmac.HMAC(key, data, digestmod='md5') + h = c_hmac_new(key, digestmod=hashname) + h2 = h.copy() + h2.update(b"test update") + h.update(data) self.assertEqual(h.hexdigest().upper(), digest.upper()) - self.assertEqual(h.digest(), binascii.unhexlify(digest)) - self.assertEqual(h.name, "hmac-md5") - self.assertEqual(h.digest_size, 16) - self.assertEqual(h.block_size, 64) - self.assertEqual( - hmac.digest(key, data, digest='md5'), - binascii.unhexlify(digest) + @hashlib_helper.requires_hashdigest('md5', openssl=True) + def test_md5_vectors(self): + # Test the HMAC module against test vectors from the RFC. + + def md5test(key, data, digest): + self.asssert_hmac( + key, data, digest, + hashfunc=hashlib.md5, + hashname="md5", + digest_size=16, + block_size=64 ) - with unittest.mock.patch('hmac._openssl_md_meths', {}): - self.assertEqual( - hmac.digest(key, data, digest='md5'), - binascii.unhexlify(digest) - ) md5test(b"\x0b" * 16, b"Hi There", @@ -79,29 +147,17 @@ def md5test(key, data, digest): b"and Larger Than One Block-Size Data"), "6f630fad67cda0ee1fb1f562db3aa53e") - @requires_hashdigest('sha1', openssl=True) + @hashlib_helper.requires_hashdigest('sha1', openssl=True) def test_sha_vectors(self): def shatest(key, data, digest): - h = hmac.HMAC(key, data, digestmod=hashlib.sha1) - self.assertEqual(h.hexdigest().upper(), digest.upper()) - self.assertEqual(h.digest(), binascii.unhexlify(digest)) - self.assertEqual(h.name, "hmac-sha1") - self.assertEqual(h.digest_size, 20) - self.assertEqual(h.block_size, 64) - - h = hmac.HMAC(key, data, digestmod='sha1') - self.assertEqual(h.hexdigest().upper(), digest.upper()) - self.assertEqual(h.digest(), binascii.unhexlify(digest)) - self.assertEqual(h.name, "hmac-sha1") - self.assertEqual(h.digest_size, 20) - self.assertEqual(h.block_size, 64) - - self.assertEqual( - hmac.digest(key, data, digest='sha1'), - binascii.unhexlify(digest) + self.asssert_hmac( + key, data, digest, + hashfunc=hashlib.sha1, + hashname="sha1", + digest_size=20, + block_size=64 ) - shatest(b"\x0b" * 20, b"Hi There", "b617318655057264e28bc0b6fb378c8ef146be00") @@ -133,37 +189,15 @@ def shatest(key, data, digest): def _rfc4231_test_cases(self, hashfunc, hash_name, digest_size, block_size): def hmactest(key, data, hexdigests): - hmac_name = "hmac-" + hash_name - h = hmac.HMAC(key, data, digestmod=hashfunc) - self.assertEqual(h.hexdigest().lower(), hexdigests[hashfunc]) - self.assertEqual(h.name, hmac_name) - self.assertEqual(h.digest_size, digest_size) - self.assertEqual(h.block_size, block_size) - - h = hmac.HMAC(key, data, digestmod=hash_name) - self.assertEqual(h.hexdigest().lower(), hexdigests[hashfunc]) - self.assertEqual(h.name, hmac_name) - self.assertEqual(h.digest_size, digest_size) - self.assertEqual(h.block_size, block_size) - - self.assertEqual( - hmac.digest(key, data, digest=hashfunc), - binascii.unhexlify(hexdigests[hashfunc]) + digest = hexdigests[hashfunc] + + self.asssert_hmac( + key, data, digest, + hashfunc=hashfunc, + hashname=hash_name, + digest_size=digest_size, + block_size=block_size ) - self.assertEqual( - hmac.digest(key, data, digest=hash_name), - binascii.unhexlify(hexdigests[hashfunc]) - ) - - with unittest.mock.patch('hmac._openssl_md_meths', {}): - self.assertEqual( - hmac.digest(key, data, digest=hashfunc), - binascii.unhexlify(hexdigests[hashfunc]) - ) - self.assertEqual( - hmac.digest(key, data, digest=hash_name), - binascii.unhexlify(hexdigests[hashfunc]) - ) # 4.2. Test Case 1 hmactest(key = b'\x0b'*20, @@ -272,23 +306,23 @@ def hmactest(key, data, hexdigests): '134676fb6de0446065c97440fa8c6a58', }) - @requires_hashdigest('sha224', openssl=True) + @hashlib_helper.requires_hashdigest('sha224', openssl=True) def test_sha224_rfc4231(self): self._rfc4231_test_cases(hashlib.sha224, 'sha224', 28, 64) - @requires_hashdigest('sha256', openssl=True) + @hashlib_helper.requires_hashdigest('sha256', openssl=True) def test_sha256_rfc4231(self): self._rfc4231_test_cases(hashlib.sha256, 'sha256', 32, 64) - @requires_hashdigest('sha384', openssl=True) + @hashlib_helper.requires_hashdigest('sha384', openssl=True) def test_sha384_rfc4231(self): self._rfc4231_test_cases(hashlib.sha384, 'sha384', 48, 128) - @requires_hashdigest('sha512', openssl=True) + @hashlib_helper.requires_hashdigest('sha512', openssl=True) def test_sha512_rfc4231(self): self._rfc4231_test_cases(hashlib.sha512, 'sha512', 64, 128) - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_legacy_block_size_warnings(self): class MockCrazyHash(object): """Ain't no block_size attribute here.""" @@ -329,7 +363,7 @@ class ConstructorTestCase(unittest.TestCase): "6c845b47f52b3b47f6590c502db7825aad757bf4fadc8fa972f7cd2e76a5bdeb" ) - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_normal(self): # Standard constructor call. try: @@ -337,21 +371,21 @@ def test_normal(self): except Exception: self.fail("Standard constructor call raised exception.") - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_with_str_key(self): # Pass a key of type str, which is an error, because it expects a key # of type bytes with self.assertRaises(TypeError): h = hmac.HMAC("key", digestmod='sha256') - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_dot_new_with_str_key(self): # Pass a key of type str, which is an error, because it expects a key # of type bytes with self.assertRaises(TypeError): h = hmac.new("key", digestmod='sha256') - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_withtext(self): # Constructor call with text. try: @@ -360,7 +394,7 @@ def test_withtext(self): self.fail("Constructor call with text argument raised exception.") self.assertEqual(h.hexdigest(), self.expected) - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_with_bytearray(self): try: h = hmac.HMAC(bytearray(b"key"), bytearray(b"hash this!"), @@ -369,7 +403,7 @@ def test_with_bytearray(self): self.fail("Constructor call with bytearray arguments raised exception.") self.assertEqual(h.hexdigest(), self.expected) - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_with_memoryview_msg(self): try: h = hmac.HMAC(b"key", memoryview(b"hash this!"), digestmod="sha256") @@ -377,7 +411,7 @@ def test_with_memoryview_msg(self): self.fail("Constructor call with memoryview msg raised exception.") self.assertEqual(h.hexdigest(), self.expected) - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_withmodule(self): # Constructor call with text and digest module. try: @@ -385,50 +419,69 @@ def test_withmodule(self): except Exception: self.fail("Constructor call with hashlib.sha256 raised exception.") + @unittest.skipUnless(C_HMAC is not None, 'need _hashlib') + def test_internal_types(self): + # internal types like _hashlib.C_HMAC are not constructable + with self.assertRaisesRegex( + TypeError, "cannot create 'HMAC' instance" + ): + C_HMAC() + class SanityTestCase(unittest.TestCase): - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_exercise_all_methods(self): # Exercising all methods once. # This must not raise any exceptions try: h = hmac.HMAC(b"my secret key", digestmod="sha256") h.update(b"compute the hash of this text!") - dig = h.digest() - dig = h.hexdigest() - h2 = h.copy() + h.digest() + h.hexdigest() + h.copy() except Exception: self.fail("Exception raised during normal usage of HMAC class.") class CopyTestCase(unittest.TestCase): - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_attributes(self): # Testing if attributes are of same type. h1 = hmac.HMAC(b"key", digestmod="sha256") h2 = h1.copy() - self.assertTrue(h1.digest_cons == h2.digest_cons, + self.assertTrue(h1._digest_cons == h2._digest_cons, "digest constructors don't match.") - self.assertEqual(type(h1.inner), type(h2.inner), + self.assertEqual(type(h1._inner), type(h2._inner), "Types of inner don't match.") - self.assertEqual(type(h1.outer), type(h2.outer), + self.assertEqual(type(h1._outer), type(h2._outer), "Types of outer don't match.") - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_realcopy(self): # Testing if the copy method created a real copy. h1 = hmac.HMAC(b"key", digestmod="sha256") h2 = h1.copy() # Using id() in case somebody has overridden __eq__/__ne__. self.assertTrue(id(h1) != id(h2), "No real copy of the HMAC instance.") - self.assertTrue(id(h1.inner) != id(h2.inner), + self.assertTrue(id(h1._inner) != id(h2._inner), "No real copy of the attribute 'inner'.") - self.assertTrue(id(h1.outer) != id(h2.outer), + self.assertTrue(id(h1._outer) != id(h2._outer), "No real copy of the attribute 'outer'.") + self.assertEqual(h1._inner, h1.inner) + self.assertEqual(h1._outer, h1.outer) + self.assertEqual(h1._digest_cons, h1.digest_cons) + + @hashlib_helper.requires_hashdigest('sha256') + def test_properties(self): + # deprecated properties + h1 = hmac.HMAC(b"key", digestmod="sha256") + self.assertEqual(h1._inner, h1.inner) + self.assertEqual(h1._outer, h1.outer) + self.assertEqual(h1._digest_cons, h1.digest_cons) - @requires_hashdigest('sha256') + @hashlib_helper.requires_hashdigest('sha256') def test_equality(self): # Testing if the copy has the same digests. h1 = hmac.HMAC(b"key", digestmod="sha256") @@ -439,89 +492,118 @@ def test_equality(self): self.assertEqual(h1.hexdigest(), h2.hexdigest(), "Hexdigest of copy doesn't match original hexdigest.") + @hashlib_helper.requires_hashdigest('sha256') + def test_equality_new(self): + # Testing if the copy has the same digests with hmac.new(). + h1 = hmac.new(b"key", digestmod="sha256") + h1.update(b"some random text") + h2 = h1.copy() + self.assertTrue( + id(h1) != id(h2), "No real copy of the HMAC instance." + ) + self.assertEqual(h1.digest(), h2.digest(), + "Digest of copy doesn't match original digest.") + self.assertEqual(h1.hexdigest(), h2.hexdigest(), + "Hexdigest of copy doesn't match original hexdigest.") + + class CompareDigestTestCase(unittest.TestCase): - def test_compare_digest(self): + def test_hmac_compare_digest(self): + self._test_compare_digest(hmac.compare_digest) + if openssl_compare_digest is not None: + self.assertIs(hmac.compare_digest, openssl_compare_digest) + else: + self.assertIs(hmac.compare_digest, operator_compare_digest) + + def test_operator_compare_digest(self): + self._test_compare_digest(operator_compare_digest) + + @unittest.skipIf(openssl_compare_digest is None, "test requires _hashlib") + def test_openssl_compare_digest(self): + self._test_compare_digest(openssl_compare_digest) + + def _test_compare_digest(self, compare_digest): # Testing input type exception handling a, b = 100, 200 - self.assertRaises(TypeError, hmac.compare_digest, a, b) + self.assertRaises(TypeError, compare_digest, a, b) a, b = 100, b"foobar" - self.assertRaises(TypeError, hmac.compare_digest, a, b) + self.assertRaises(TypeError, compare_digest, a, b) a, b = b"foobar", 200 - self.assertRaises(TypeError, hmac.compare_digest, a, b) + self.assertRaises(TypeError, compare_digest, a, b) a, b = "foobar", b"foobar" - self.assertRaises(TypeError, hmac.compare_digest, a, b) + self.assertRaises(TypeError, compare_digest, a, b) a, b = b"foobar", "foobar" - self.assertRaises(TypeError, hmac.compare_digest, a, b) + self.assertRaises(TypeError, compare_digest, a, b) # Testing bytes of different lengths a, b = b"foobar", b"foo" - self.assertFalse(hmac.compare_digest(a, b)) + self.assertFalse(compare_digest(a, b)) a, b = b"\xde\xad\xbe\xef", b"\xde\xad" - self.assertFalse(hmac.compare_digest(a, b)) + self.assertFalse(compare_digest(a, b)) # Testing bytes of same lengths, different values a, b = b"foobar", b"foobaz" - self.assertFalse(hmac.compare_digest(a, b)) + self.assertFalse(compare_digest(a, b)) a, b = b"\xde\xad\xbe\xef", b"\xab\xad\x1d\xea" - self.assertFalse(hmac.compare_digest(a, b)) + self.assertFalse(compare_digest(a, b)) # Testing bytes of same lengths, same values a, b = b"foobar", b"foobar" - self.assertTrue(hmac.compare_digest(a, b)) + self.assertTrue(compare_digest(a, b)) a, b = b"\xde\xad\xbe\xef", b"\xde\xad\xbe\xef" - self.assertTrue(hmac.compare_digest(a, b)) + self.assertTrue(compare_digest(a, b)) # Testing bytearrays of same lengths, same values a, b = bytearray(b"foobar"), bytearray(b"foobar") - self.assertTrue(hmac.compare_digest(a, b)) + self.assertTrue(compare_digest(a, b)) # Testing bytearrays of different lengths a, b = bytearray(b"foobar"), bytearray(b"foo") - self.assertFalse(hmac.compare_digest(a, b)) + self.assertFalse(compare_digest(a, b)) # Testing bytearrays of same lengths, different values a, b = bytearray(b"foobar"), bytearray(b"foobaz") - self.assertFalse(hmac.compare_digest(a, b)) + self.assertFalse(compare_digest(a, b)) # Testing byte and bytearray of same lengths, same values a, b = bytearray(b"foobar"), b"foobar" - self.assertTrue(hmac.compare_digest(a, b)) - self.assertTrue(hmac.compare_digest(b, a)) + self.assertTrue(compare_digest(a, b)) + self.assertTrue(compare_digest(b, a)) # Testing byte bytearray of different lengths a, b = bytearray(b"foobar"), b"foo" - self.assertFalse(hmac.compare_digest(a, b)) - self.assertFalse(hmac.compare_digest(b, a)) + self.assertFalse(compare_digest(a, b)) + self.assertFalse(compare_digest(b, a)) # Testing byte and bytearray of same lengths, different values a, b = bytearray(b"foobar"), b"foobaz" - self.assertFalse(hmac.compare_digest(a, b)) - self.assertFalse(hmac.compare_digest(b, a)) + self.assertFalse(compare_digest(a, b)) + self.assertFalse(compare_digest(b, a)) # Testing str of same lengths a, b = "foobar", "foobar" - self.assertTrue(hmac.compare_digest(a, b)) + self.assertTrue(compare_digest(a, b)) # Testing str of different lengths a, b = "foo", "foobar" - self.assertFalse(hmac.compare_digest(a, b)) + self.assertFalse(compare_digest(a, b)) # Testing bytes of same lengths, different values a, b = "foobar", "foobaz" - self.assertFalse(hmac.compare_digest(a, b)) + self.assertFalse(compare_digest(a, b)) # Testing error cases a, b = "foobar", b"foobar" - self.assertRaises(TypeError, hmac.compare_digest, a, b) + self.assertRaises(TypeError, compare_digest, a, b) a, b = b"foobar", "foobar" - self.assertRaises(TypeError, hmac.compare_digest, a, b) + self.assertRaises(TypeError, compare_digest, a, b) a, b = b"foobar", 1 - self.assertRaises(TypeError, hmac.compare_digest, a, b) + self.assertRaises(TypeError, compare_digest, a, b) a, b = 100, 200 - self.assertRaises(TypeError, hmac.compare_digest, a, b) + self.assertRaises(TypeError, compare_digest, a, b) a, b = "fooä", "fooä" - self.assertRaises(TypeError, hmac.compare_digest, a, b) + self.assertRaises(TypeError, compare_digest, a, b) # subclasses are supported by ignore __eq__ class mystr(str): @@ -529,22 +611,22 @@ def __eq__(self, other): return False a, b = mystr("foobar"), mystr("foobar") - self.assertTrue(hmac.compare_digest(a, b)) + self.assertTrue(compare_digest(a, b)) a, b = mystr("foobar"), "foobar" - self.assertTrue(hmac.compare_digest(a, b)) + self.assertTrue(compare_digest(a, b)) a, b = mystr("foobar"), mystr("foobaz") - self.assertFalse(hmac.compare_digest(a, b)) + self.assertFalse(compare_digest(a, b)) class mybytes(bytes): def __eq__(self, other): return False a, b = mybytes(b"foobar"), mybytes(b"foobar") - self.assertTrue(hmac.compare_digest(a, b)) + self.assertTrue(compare_digest(a, b)) a, b = mybytes(b"foobar"), b"foobar" - self.assertTrue(hmac.compare_digest(a, b)) + self.assertTrue(compare_digest(a, b)) a, b = mybytes(b"foobar"), mybytes(b"foobaz") - self.assertFalse(hmac.compare_digest(a, b)) + self.assertFalse(compare_digest(a, b)) if __name__ == "__main__": diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py index 326e34290ff13b8efef6d02cd2301c1c4f262833..12917755a56017e31e6a5ba2c241bd01673e823a 100644 --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -452,42 +452,6 @@ def test_illegal_declarations(self): self._run_check('', [('comment', 'spacer type="block" height="25"')]) - def test_with_unquoted_attributes(self): - # see #12008 - html = ("" - "" - "
    " - "- software-and-i" - "- library
    ") - expected = [ - ('starttag', 'html', []), - ('starttag', 'body', [('bgcolor', 'd0ca90'), ('text', '181008')]), - ('starttag', 'table', - [('cellspacing', '0'), ('cellpadding', '1'), ('width', '100%')]), - ('starttag', 'tr', []), - ('starttag', 'td', [('align', 'left')]), - ('starttag', 'font', [('size', '-1')]), - ('data', '- '), ('starttag', 'a', [('href', '/rabota/')]), - ('starttag', 'span', [('class', 'en')]), ('data', ' software-and-i'), - ('endtag', 'span'), ('endtag', 'a'), - ('data', '- '), ('starttag', 'a', [('href', '/1/')]), - ('starttag', 'span', [('class', 'en')]), ('data', ' library'), - ('endtag', 'span'), ('endtag', 'a'), ('endtag', 'table') - ] - self._run_check(html, expected) - - def test_comma_between_attributes(self): - self._run_check('

    ', [ - ('starttag', 'form', - [('action', '/xxx.php?a=1&b=2&'), - (',', None), ('method', 'post')])]) - - def test_weird_chars_in_unquoted_attribute_values(self): - self._run_check('', [ - ('starttag', 'form', - [('action', 'bogus|&#()value')])]) - def test_invalid_end_tags(self): # A collection of broken end tags.
    is used as separator. # see http://www.w3.org/TR/html5/tokenization.html#end-tag-open-state @@ -573,13 +537,6 @@ def test_EOF_in_charref(self): for html, expected in data: self._run_check(html, expected) - def test_unescape_method(self): - from html import unescape - p = self.get_collector() - with self.assertWarns(DeprecationWarning): - s = '""""""&#bad;' - self.assertEqual(p.unescape(s), unescape(s)) - def test_broken_comments(self): html = ('' '' @@ -773,6 +730,62 @@ def test_end_tag_in_attribute_value(self): [("href", "http://www.example.org/\">;")]), ("data", "spam"), ("endtag", "a")]) + def test_with_unquoted_attributes(self): + # see #12008 + html = ("" + "" + "
    " + "- software-and-i" + "- library
    ") + expected = [ + ('starttag', 'html', []), + ('starttag', 'body', [('bgcolor', 'd0ca90'), ('text', '181008')]), + ('starttag', 'table', + [('cellspacing', '0'), ('cellpadding', '1'), ('width', '100%')]), + ('starttag', 'tr', []), + ('starttag', 'td', [('align', 'left')]), + ('starttag', 'font', [('size', '-1')]), + ('data', '- '), ('starttag', 'a', [('href', '/rabota/')]), + ('starttag', 'span', [('class', 'en')]), ('data', ' software-and-i'), + ('endtag', 'span'), ('endtag', 'a'), + ('data', '- '), ('starttag', 'a', [('href', '/1/')]), + ('starttag', 'span', [('class', 'en')]), ('data', ' library'), + ('endtag', 'span'), ('endtag', 'a'), ('endtag', 'table') + ] + self._run_check(html, expected) + + def test_comma_between_attributes(self): + # see bpo 41478 + # HTMLParser preserves duplicate attributes, leaving the task of + # removing duplicate attributes to a conformant html tree builder + html = ('
    ' # between attrs (unquoted) + '
    ' # between attrs (quoted) + '
    ' # after values (unquoted) + '
    ' # after values (quoted) + '
    ' # one comma values (quoted) + '
    ' # before values (unquoted) + '
    ' # before values (quoted) + '
    ' # before names + '
    ' # after names + ) + expected = [ + ('starttag', 'div', [('class', 'bar,baz=asd'),]), + ('starttag', 'div', [('class', 'bar'), (',baz', 'asd')]), + ('starttag', 'div', [('class', 'bar,'), ('baz', 'asd,')]), + ('starttag', 'div', [('class', 'bar'), (',', None), + ('baz', 'asd'), (',', None)]), + ('starttag', 'div', [('class', 'bar'), (',', None)]), + ('starttag', 'div', [('class', ',bar'), ('baz', ',asd')]), + ('starttag', 'div', [('class', ',"bar"'), ('baz', ',"asd"')]), + ('starttag', 'div', [(',class', 'bar'), (',baz', 'asd')]), + ('starttag', 'div', [('class,', 'bar'), ('baz,', 'asd')]), + ] + self._run_check(html, expected) + + def test_weird_chars_in_unquoted_attribute_values(self): + self._run_check('', [ + ('starttag', 'form', + [('action', 'bogus|&#()value')])]) if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py index 5a5fcecbc9c15d967363c58fbf33f51d2c6c8560..28943f02564fb0e66b3df4d55b656ab9fdcbde2c 100644 --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -1,5 +1,5 @@ import errno -from http import client +from http import client, HTTPStatus import io import itertools import os @@ -13,6 +13,7 @@ TestCase = unittest.TestCase from test import support +from test.support import socket_helper here = os.path.dirname(__file__) # Self-signed cert file for 'localhost' @@ -42,7 +43,7 @@ trailers = "X-Dummy: foo\r\nX-Dumm2: bar\r\n" chunked_end = "\r\n" -HOST = support.HOST +HOST = socket_helper.HOST class FakeSocket: def __init__(self, text, fileclass=io.BytesIO, host=None, port=None): @@ -515,6 +516,10 @@ def _parse_chunked(self, data): class BasicTest(TestCase): + def test_dir_with_added_behavior_on_status(self): + # see issue40084 + self.assertTrue({'description', 'name', 'phrase', 'value'} <= set(dir(HTTPStatus(404)))) + def test_status_lines(self): # Test HTTP status lines @@ -1455,6 +1460,7 @@ def test_client_constants(self): 'UNSUPPORTED_MEDIA_TYPE', 'REQUESTED_RANGE_NOT_SATISFIABLE', 'EXPECTATION_FAILED', + 'IM_A_TEAPOT', 'MISDIRECTED_REQUEST', 'UNPROCESSABLE_ENTITY', 'LOCKED', @@ -1473,6 +1479,8 @@ def test_client_constants(self): 'INSUFFICIENT_STORAGE', 'NOT_EXTENDED', 'NETWORK_AUTHENTICATION_REQUIRED', + 'EARLY_HINTS', + 'TOO_EARLY' ] for const in expected: with self.subTest(constant=const): @@ -1482,8 +1490,8 @@ def test_client_constants(self): class SourceAddressTest(TestCase): def setUp(self): self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.port = support.bind_port(self.serv) - self.source_port = support.find_unused_port() + self.port = socket_helper.bind_port(self.serv) + self.source_port = socket_helper.find_unused_port() self.serv.listen() self.conn = None @@ -1515,7 +1523,7 @@ class TimeoutTest(TestCase): def setUp(self): self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - TimeoutTest.PORT = support.bind_port(self.serv) + TimeoutTest.PORT = socket_helper.bind_port(self.serv) self.serv.listen() def tearDown(self): @@ -1647,7 +1655,7 @@ def test_networked(self): # Default settings: requires a valid cert from a trusted CA import ssl support.requires('network') - with support.transient_internet('self-signed.pythontest.net'): + with socket_helper.transient_internet('self-signed.pythontest.net'): h = client.HTTPSConnection('self-signed.pythontest.net', 443) with self.assertRaises(ssl.SSLError) as exc_info: h.request('GET', '/') @@ -1657,7 +1665,7 @@ def test_networked_noverification(self): # Switch off cert verification import ssl support.requires('network') - with support.transient_internet('self-signed.pythontest.net'): + with socket_helper.transient_internet('self-signed.pythontest.net'): context = ssl._create_unverified_context() h = client.HTTPSConnection('self-signed.pythontest.net', 443, context=context) @@ -1671,7 +1679,7 @@ def test_networked_noverification(self): def test_networked_trusted_by_default_cert(self): # Default settings: requires a valid cert from a trusted CA support.requires('network') - with support.transient_internet('www.python.org'): + with socket_helper.transient_internet('www.python.org'): h = client.HTTPSConnection('www.python.org', 443) h.request('GET', '/') resp = h.getresponse() @@ -1685,7 +1693,7 @@ def test_networked_good_cert(self): import ssl support.requires('network') selfsigned_pythontestdotnet = 'self-signed.pythontest.net' - with support.transient_internet(selfsigned_pythontestdotnet): + with socket_helper.transient_internet(selfsigned_pythontestdotnet): context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) self.assertEqual(context.verify_mode, ssl.CERT_REQUIRED) self.assertEqual(context.check_hostname, True) @@ -1717,7 +1725,7 @@ def test_networked_bad_cert(self): # We feed a "CA" cert that is unrelated to the server's cert import ssl support.requires('network') - with support.transient_internet('self-signed.pythontest.net'): + with socket_helper.transient_internet('self-signed.pythontest.net'): context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) context.load_verify_locations(CERT_localhost) h = client.HTTPSConnection('self-signed.pythontest.net', 443, context=context) diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 87d4924a34b365e6a4154eb020bdf4a642b5751c..8df0b5251f1ae3b6601d3a0d9ba2c7a4ac45c535 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -3,7 +3,7 @@ Written by Cody A.W. Somerville , Josip Dzolonga, and Michael Otteneder for the 2007/08 GHOP contest. """ - +from collections import OrderedDict from http.server import BaseHTTPRequestHandler, HTTPServer, \ SimpleHTTPRequestHandler, CGIHTTPRequestHandler from http import server, HTTPStatus @@ -14,11 +14,12 @@ import re import base64 import ntpath +import pathlib import shutil import email.message import email.utils import html -import http.client +import http, http.client import urllib.parse import tempfile import time @@ -585,6 +586,15 @@ def test_html_escape_filename(self): print(os.environ["%s"]) """ +cgi_file6 = """\ +#!%s +import os + +print("Content-type: text/plain") +print() +print(repr(os.environ)) +""" + @unittest.skipIf(hasattr(os, 'geteuid') and os.geteuid() == 0, "This test can't be run reliably as root (issue #13308).") @@ -600,13 +610,20 @@ def setUp(self): self.parent_dir = tempfile.mkdtemp() self.cgi_dir = os.path.join(self.parent_dir, 'cgi-bin') self.cgi_child_dir = os.path.join(self.cgi_dir, 'child-dir') + self.sub_dir_1 = os.path.join(self.parent_dir, 'sub') + self.sub_dir_2 = os.path.join(self.sub_dir_1, 'dir') + self.cgi_dir_in_sub_dir = os.path.join(self.sub_dir_2, 'cgi-bin') os.mkdir(self.cgi_dir) os.mkdir(self.cgi_child_dir) + os.mkdir(self.sub_dir_1) + os.mkdir(self.sub_dir_2) + os.mkdir(self.cgi_dir_in_sub_dir) self.nocgi_path = None self.file1_path = None self.file2_path = None self.file3_path = None self.file4_path = None + self.file5_path = None # The shebang line should be pure ASCII: use symlink if possible. # See issue #7668. @@ -651,6 +668,16 @@ def setUp(self): file4.write(cgi_file4 % (self.pythonexe, 'QUERY_STRING')) os.chmod(self.file4_path, 0o777) + self.file5_path = os.path.join(self.cgi_dir_in_sub_dir, 'file5.py') + with open(self.file5_path, 'w', encoding='utf-8') as file5: + file5.write(cgi_file1 % self.pythonexe) + os.chmod(self.file5_path, 0o777) + + self.file6_path = os.path.join(self.cgi_dir, 'file6.py') + with open(self.file6_path, 'w', encoding='utf-8') as file6: + file6.write(cgi_file6 % self.pythonexe) + os.chmod(self.file6_path, 0o777) + os.chdir(self.parent_dir) def tearDown(self): @@ -668,8 +695,15 @@ def tearDown(self): os.remove(self.file3_path) if self.file4_path: os.remove(self.file4_path) + if self.file5_path: + os.remove(self.file5_path) + if self.file6_path: + os.remove(self.file6_path) os.rmdir(self.cgi_child_dir) os.rmdir(self.cgi_dir) + os.rmdir(self.cgi_dir_in_sub_dir) + os.rmdir(self.sub_dir_2) + os.rmdir(self.sub_dir_1) os.rmdir(self.parent_dir) finally: BaseTestCase.tearDown(self) @@ -788,12 +822,40 @@ def test_query_with_continuous_slashes(self): 'text/html', HTTPStatus.OK), (res.read(), res.getheader('Content-type'), res.status)) + def test_cgi_path_in_sub_directories(self): + try: + CGIHTTPRequestHandler.cgi_directories.append('/sub/dir/cgi-bin') + res = self.request('/sub/dir/cgi-bin/file5.py') + self.assertEqual( + (b'Hello World' + self.linesep, 'text/html', HTTPStatus.OK), + (res.read(), res.getheader('Content-type'), res.status)) + finally: + CGIHTTPRequestHandler.cgi_directories.remove('/sub/dir/cgi-bin') + + def test_accept(self): + browser_accept = \ + 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' + tests = ( + ((('Accept', browser_accept),), browser_accept), + ((), ''), + # Hack case to get two values for the one header + ((('Accept', 'text/html'), ('ACCEPT', 'text/plain')), + 'text/html,text/plain'), + ) + for headers, expected in tests: + headers = OrderedDict(headers) + with self.subTest(headers): + res = self.request('/cgi-bin/file6.py', 'GET', headers=headers) + self.assertEqual(http.HTTPStatus.OK, res.status) + expected = f"'HTTP_ACCEPT': {expected!r}" + self.assertIn(expected.encode('ascii'), res.read()) + class SocketlessRequestHandler(SimpleHTTPRequestHandler): - def __init__(self, *args, **kwargs): + def __init__(self, directory=None): request = mock.Mock() request.makefile.return_value = BytesIO() - super().__init__(request, None, None) + super().__init__(request, None, None, directory=directory) self.get_called = False self.protocol_version = "HTTP/1.1" @@ -1068,41 +1130,91 @@ def test_date_time_string(self): class SimpleHTTPRequestHandlerTestCase(unittest.TestCase): """ Test url parsing """ def setUp(self): - self.translated = os.getcwd() - self.translated = os.path.join(self.translated, 'filename') - self.handler = SocketlessRequestHandler() + self.translated_1 = os.path.join(os.getcwd(), 'filename') + self.translated_2 = os.path.join('foo', 'filename') + self.translated_3 = os.path.join('bar', 'filename') + self.handler_1 = SocketlessRequestHandler() + self.handler_2 = SocketlessRequestHandler(directory='foo') + self.handler_3 = SocketlessRequestHandler(directory=pathlib.PurePath('bar')) def test_query_arguments(self): - path = self.handler.translate_path('/filename') - self.assertEqual(path, self.translated) - path = self.handler.translate_path('/filename?foo=bar') - self.assertEqual(path, self.translated) - path = self.handler.translate_path('/filename?a=b&spam=eggs#zot') - self.assertEqual(path, self.translated) + path = self.handler_1.translate_path('/filename') + self.assertEqual(path, self.translated_1) + path = self.handler_2.translate_path('/filename') + self.assertEqual(path, self.translated_2) + path = self.handler_3.translate_path('/filename') + self.assertEqual(path, self.translated_3) + + path = self.handler_1.translate_path('/filename?foo=bar') + self.assertEqual(path, self.translated_1) + path = self.handler_2.translate_path('/filename?foo=bar') + self.assertEqual(path, self.translated_2) + path = self.handler_3.translate_path('/filename?foo=bar') + self.assertEqual(path, self.translated_3) + + path = self.handler_1.translate_path('/filename?a=b&spam=eggs#zot') + self.assertEqual(path, self.translated_1) + path = self.handler_2.translate_path('/filename?a=b&spam=eggs#zot') + self.assertEqual(path, self.translated_2) + path = self.handler_3.translate_path('/filename?a=b&spam=eggs#zot') + self.assertEqual(path, self.translated_3) def test_start_with_double_slash(self): - path = self.handler.translate_path('//filename') - self.assertEqual(path, self.translated) - path = self.handler.translate_path('//filename?foo=bar') - self.assertEqual(path, self.translated) + path = self.handler_1.translate_path('//filename') + self.assertEqual(path, self.translated_1) + path = self.handler_2.translate_path('//filename') + self.assertEqual(path, self.translated_2) + path = self.handler_3.translate_path('//filename') + self.assertEqual(path, self.translated_3) + + path = self.handler_1.translate_path('//filename?foo=bar') + self.assertEqual(path, self.translated_1) + path = self.handler_2.translate_path('//filename?foo=bar') + self.assertEqual(path, self.translated_2) + path = self.handler_3.translate_path('//filename?foo=bar') + self.assertEqual(path, self.translated_3) def test_windows_colon(self): with support.swap_attr(server.os, 'path', ntpath): - path = self.handler.translate_path('c:c:c:foo/filename') + path = self.handler_1.translate_path('c:c:c:foo/filename') path = path.replace(ntpath.sep, os.sep) - self.assertEqual(path, self.translated) + self.assertEqual(path, self.translated_1) + path = self.handler_2.translate_path('c:c:c:foo/filename') + path = path.replace(ntpath.sep, os.sep) + self.assertEqual(path, self.translated_2) + path = self.handler_3.translate_path('c:c:c:foo/filename') + path = path.replace(ntpath.sep, os.sep) + self.assertEqual(path, self.translated_3) - path = self.handler.translate_path('\\c:../filename') + path = self.handler_1.translate_path('\\c:../filename') + path = path.replace(ntpath.sep, os.sep) + self.assertEqual(path, self.translated_1) + path = self.handler_2.translate_path('\\c:../filename') path = path.replace(ntpath.sep, os.sep) - self.assertEqual(path, self.translated) + self.assertEqual(path, self.translated_2) + path = self.handler_3.translate_path('\\c:../filename') + path = path.replace(ntpath.sep, os.sep) + self.assertEqual(path, self.translated_3) - path = self.handler.translate_path('c:\\c:..\\foo/filename') + path = self.handler_1.translate_path('c:\\c:..\\foo/filename') + path = path.replace(ntpath.sep, os.sep) + self.assertEqual(path, self.translated_1) + path = self.handler_2.translate_path('c:\\c:..\\foo/filename') + path = path.replace(ntpath.sep, os.sep) + self.assertEqual(path, self.translated_2) + path = self.handler_3.translate_path('c:\\c:..\\foo/filename') path = path.replace(ntpath.sep, os.sep) - self.assertEqual(path, self.translated) + self.assertEqual(path, self.translated_3) - path = self.handler.translate_path('c:c:foo\\c:c:bar/filename') + path = self.handler_1.translate_path('c:c:foo\\c:c:bar/filename') + path = path.replace(ntpath.sep, os.sep) + self.assertEqual(path, self.translated_1) + path = self.handler_2.translate_path('c:c:foo\\c:c:bar/filename') + path = path.replace(ntpath.sep, os.sep) + self.assertEqual(path, self.translated_2) + path = self.handler_3.translate_path('c:c:foo\\c:c:bar/filename') path = path.replace(ntpath.sep, os.sep) - self.assertEqual(path, self.translated) + self.assertEqual(path, self.translated_3) class MiscTestCase(unittest.TestCase): diff --git a/Lib/test/test_idle.py b/Lib/test/test_idle.py index 8bc01deaa33841322d7edc651bc35a2b07af3912..310b72c1d72e74cda637ac9fea6216e0e71781c8 100644 --- a/Lib/test/test_idle.py +++ b/Lib/test/test_idle.py @@ -20,5 +20,5 @@ if __name__ == '__main__': tk.NoDefaultRoot() unittest.main(exit=False) - tk._support_default_root = 1 + tk._support_default_root = True tk._default_root = None diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py index 06ea86b59c4821f66d73459f559c46166d7732bb..914a75a6adabf46cdea436aa811041876b6baf35 100644 --- a/Lib/test/test_imaplib.py +++ b/Lib/test/test_imaplib.py @@ -1,4 +1,5 @@ from test import support +from test.support import socket_helper from contextlib import contextmanager import imaplib @@ -9,9 +10,9 @@ import threading import socket -from test.support import (reap_threads, verbose, transient_internet, - run_with_tz, run_with_locale, cpython_only, - requires_hashdigest) +from test.support import (reap_threads, verbose, + run_with_tz, run_with_locale, cpython_only) +from test.support import hashlib_helper import unittest from unittest import mock from datetime import datetime, timezone, timedelta @@ -82,7 +83,7 @@ def test_imap4_host_default_value(self): pass # This is the exception that should be raised. - expected_errnos = support.get_socket_conn_refused_errs() + expected_errnos = socket_helper.get_socket_conn_refused_errs() with self.assertRaises(OSError) as cm: imaplib.IMAP4() self.assertIn(cm.exception.errno, expected_errnos) @@ -109,12 +110,13 @@ class SecureTCPServer: class SimpleIMAPHandler(socketserver.StreamRequestHandler): - timeout = 1 + timeout = support.LOOPBACK_TIMEOUT continuation = None capabilities = '' def setup(self): super().setup() + self.server.is_selected = False self.server.logged = None def _send(self, message): @@ -189,6 +191,18 @@ def cmd_LOGIN(self, tag, args): self.server.logged = args[0] self._send_tagged(tag, 'OK', 'LOGIN completed') + def cmd_SELECT(self, tag, args): + self.server.is_selected = True + self._send_line(b'* 2 EXISTS') + self._send_tagged(tag, 'OK', '[READ-WRITE] SELECT completed.') + + def cmd_UNSELECT(self, tag, args): + if self.server.is_selected: + self.server.is_selected = False + self._send_tagged(tag, 'OK', 'Returned to authenticated state. (Success)') + else: + self._send_tagged(tag, 'BAD', 'No mailbox selected') + class NewIMAPTestsMixin(): client = None @@ -210,7 +224,7 @@ def handle_error(self, request, client_address): raise self.addCleanup(self._cleanup) - self.server = self.server_class((support.HOST, 0), imap_handler) + self.server = self.server_class((socket_helper.HOST, 0), imap_handler) self.thread = threading.Thread( name=self._testMethodName+'-server', target=self.server.serve_forever, @@ -238,7 +252,7 @@ def _cleanup(self): # cleanup the server self.server.shutdown() self.server.server_close() - support.join_thread(self.thread, 3.0) + support.join_thread(self.thread) # Explicitly clear the attribute to prevent dangling thread self.thread = None @@ -371,7 +385,7 @@ def cmd_AUTHENTICATE(self, tag, args): self.assertEqual(code, 'OK') self.assertEqual(server.response, b'ZmFrZQ==\r\n') # b64 encoded 'fake' - @requires_hashdigest('md5') + @hashlib_helper.requires_hashdigest('md5') def test_login_cram_md5_bytes(self): class AuthHandler(SimpleIMAPHandler): capabilities = 'LOGINDISABLED AUTH=CRAM-MD5' @@ -389,7 +403,7 @@ def cmd_AUTHENTICATE(self, tag, args): ret, _ = client.login_cram_md5("tim", b"tanstaaftanstaaf") self.assertEqual(ret, "OK") - @requires_hashdigest('md5') + @hashlib_helper.requires_hashdigest('md5') def test_login_cram_md5_plain_text(self): class AuthHandler(SimpleIMAPHandler): capabilities = 'LOGINDISABLED AUTH=CRAM-MD5' @@ -440,6 +454,29 @@ def test_simple_with_statement(self): with self.imap_class(*server.server_address): pass + def test_imaplib_timeout_test(self): + _, server = self._setup(SimpleIMAPHandler) + addr = server.server_address[1] + client = self.imap_class("localhost", addr, timeout=None) + self.assertEqual(client.sock.timeout, None) + client.shutdown() + client = self.imap_class("localhost", addr, timeout=support.LOOPBACK_TIMEOUT) + self.assertEqual(client.sock.timeout, support.LOOPBACK_TIMEOUT) + client.shutdown() + with self.assertRaises(ValueError): + client = self.imap_class("localhost", addr, timeout=0) + + def test_imaplib_timeout_functionality_test(self): + class TimeoutHandler(SimpleIMAPHandler): + def handle(self): + time.sleep(1) + SimpleIMAPHandler.handle(self) + + _, server = self._setup(TimeoutHandler) + addr = server.server_address[1] + with self.assertRaises(socket.timeout): + client = self.imap_class("localhost", addr, timeout=0.001) + def test_with_statement(self): _, server = self._setup(SimpleIMAPHandler, connect=False) with self.imap_class(*server.server_address) as imap: @@ -487,6 +524,18 @@ def cmd_LSUB(self, tag, args): self.assertEqual(typ, 'OK') self.assertEqual(data[0], b'() "." directoryA') + def test_unselect(self): + client, _ = self._setup(SimpleIMAPHandler) + client.login('user', 'pass') + typ, data = client.select() + self.assertEqual(typ, 'OK') + self.assertEqual(data[0], b'2') + + typ, data = client.unselect() + self.assertEqual(typ, 'OK') + self.assertEqual(data[0], b'Returned to authenticated state. (Success)') + self.assertEqual(client.state, 'AUTH') + class NewIMAPTests(NewIMAPTestsMixin, unittest.TestCase): imap_class = imaplib.IMAP4 @@ -577,7 +626,7 @@ def reap_server(self, server, thread): @contextmanager def reaped_server(self, hdlr): - server, thread = self.make_server((support.HOST, 0), hdlr) + server, thread = self.make_server((socket_helper.HOST, 0), hdlr) try: yield server finally: @@ -800,7 +849,7 @@ def cmd_AUTHENTICATE(self, tag, args): b'ZmFrZQ==\r\n') # b64 encoded 'fake' @reap_threads - @requires_hashdigest('md5') + @hashlib_helper.requires_hashdigest('md5') def test_login_cram_md5(self): class AuthHandler(SimpleIMAPHandler): @@ -920,16 +969,16 @@ class RemoteIMAPTest(unittest.TestCase): imap_class = imaplib.IMAP4 def setUp(self): - with transient_internet(self.host): + with socket_helper.transient_internet(self.host): self.server = self.imap_class(self.host, self.port) def tearDown(self): if self.server is not None: - with transient_internet(self.host): + with socket_helper.transient_internet(self.host): self.server.logout() def test_logincapa(self): - with transient_internet(self.host): + with socket_helper.transient_internet(self.host): for cap in self.server.capabilities: self.assertIsInstance(cap, str) self.assertIn('LOGINDISABLED', self.server.capabilities) @@ -938,7 +987,7 @@ def test_logincapa(self): self.assertEqual(rs[0], 'OK') def test_logout(self): - with transient_internet(self.host): + with socket_helper.transient_internet(self.host): rs = self.server.logout() self.server = None self.assertEqual(rs[0], 'BYE', rs) @@ -952,7 +1001,7 @@ class RemoteIMAP_STARTTLSTest(RemoteIMAPTest): def setUp(self): super().setUp() - with transient_internet(self.host): + with socket_helper.transient_internet(self.host): rs = self.server.starttls() self.assertEqual(rs[0], 'OK') @@ -993,24 +1042,24 @@ def check_logincapa(self, server): server.logout() def test_logincapa(self): - with transient_internet(self.host): + with socket_helper.transient_internet(self.host): _server = self.imap_class(self.host, self.port) self.check_logincapa(_server) def test_logout(self): - with transient_internet(self.host): + with socket_helper.transient_internet(self.host): _server = self.imap_class(self.host, self.port) rs = _server.logout() self.assertEqual(rs[0], 'BYE', rs) def test_ssl_context_certfile_exclusive(self): - with transient_internet(self.host): + with socket_helper.transient_internet(self.host): self.assertRaises( ValueError, self.imap_class, self.host, self.port, certfile=CERTFILE, ssl_context=self.create_ssl_context()) def test_ssl_context_keyfile_exclusive(self): - with transient_internet(self.host): + with socket_helper.transient_internet(self.host): self.assertRaises( ValueError, self.imap_class, self.host, self.port, keyfile=CERTFILE, ssl_context=self.create_ssl_context()) diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index 52f0491679f354f26440cee0e4b12d0ad644f63e..d1dafbe0bfd4b562f565050e37be5f4bb61c8d9a 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -1,24 +1,22 @@ -# We import importlib *ASAP* in order to test #15386 -import importlib +import builtins +import contextlib +import errno +import glob import importlib.util from importlib._bootstrap_external import _get_sourcefile -import builtins import marshal import os import py_compile import random import shutil -import subprocess import stat +import subprocess import sys +import textwrap import threading import time import unittest -import unittest.mock as mock -import textwrap -import errno -import contextlib -import glob +from unittest import mock import test.support from test.support import ( @@ -28,6 +26,7 @@ temp_dir, DirsOnSysPath) from test.support import script_helper from test.test_importlib.util import uncache +from types import ModuleType skip_if_dont_write_bytecode = unittest.skipIf( @@ -437,16 +436,24 @@ def test_issue31492(self): os.does_not_exist def test_concurrency(self): + # bpo 38091: this is a hack to slow down the code that calls + # has_deadlock(); the logic was itself sometimes deadlocking. + def delay_has_deadlock(frame, event, arg): + if event == 'call' and frame.f_code.co_name == 'has_deadlock': + time.sleep(0.1) + sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'data')) try: exc = None def run(): + sys.settrace(delay_has_deadlock) event.wait() try: import package except BaseException as e: nonlocal exc exc = e + sys.settrace(None) for i in range(10): event = threading.Event() @@ -1341,6 +1348,19 @@ def test_circular_from_import(self): str(cm.exception), ) + def test_unwritable_module(self): + self.addCleanup(unload, "test.test_import.data.unwritable") + self.addCleanup(unload, "test.test_import.data.unwritable.x") + + import test.test_import.data.unwritable as unwritable + with self.assertWarns(ImportWarning): + from test.test_import.data.unwritable import x + + self.assertNotEqual(type(unwritable), ModuleType) + self.assertEqual(type(x), ModuleType) + with self.assertRaises(AttributeError): + unwritable.x = 42 + if __name__ == '__main__': # Test needs to be a package, so we can do relative imports. diff --git a/Lib/test/test_import/data/unwritable/__init__.py b/Lib/test/test_import/data/unwritable/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..da4ddb3d027c34a6caf800cc2bedd2aeaa218a5b --- /dev/null +++ b/Lib/test/test_import/data/unwritable/__init__.py @@ -0,0 +1,12 @@ +import sys + +class MyMod(object): + __slots__ = ['__builtins__', '__cached__', '__doc__', + '__file__', '__loader__', '__name__', + '__package__', '__path__', '__spec__'] + def __init__(self): + for attr in self.__slots__: + setattr(self, attr, globals()[attr]) + + +sys.modules[__name__] = MyMod() diff --git a/Lib/test/test_import/data/unwritable/x.py b/Lib/test/test_import/data/unwritable/x.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Lib/test/test_importlib/extension/test_case_sensitivity.py b/Lib/test/test_importlib/extension/test_case_sensitivity.py index 0dd9c8615f5182aaa6b717d2d8f96dbd03b020db..3a857847381a9a53529b2d4995b302cd8e7e5626 100644 --- a/Lib/test/test_importlib/extension/test_case_sensitivity.py +++ b/Lib/test/test_importlib/extension/test_case_sensitivity.py @@ -1,7 +1,7 @@ from importlib import _bootstrap_external from test import support import unittest - +import sys from .. import util importlib = util.import_importlib('importlib') @@ -21,6 +21,7 @@ def find_module(self): self.machinery.EXTENSION_SUFFIXES)) return finder.find_module(bad_name) + @unittest.skipIf(sys.flags.ignore_environment, 'ignore_environment flag was set') def test_case_sensitive(self): with support.EnvironmentVarGuard() as env: env.unset('PYTHONCASEOK') @@ -28,6 +29,7 @@ def test_case_sensitive(self): loader = self.find_module() self.assertIsNone(loader) + @unittest.skipIf(sys.flags.ignore_environment, 'ignore_environment flag was set') def test_case_insensitivity(self): with support.EnvironmentVarGuard() as env: env.set('PYTHONCASEOK', '1') diff --git a/Lib/test/test_importlib/extension/test_loader.py b/Lib/test/test_importlib/extension/test_loader.py index 9ad05fadef29112e56d68095f516a969d2e22e1d..abd612fcd9bec15ff71e6320657b6a4e61b23ca1 100644 --- a/Lib/test/test_importlib/extension/test_loader.py +++ b/Lib/test/test_importlib/extension/test_loader.py @@ -267,29 +267,6 @@ def test_nonascii(self): self.assertEqual(module.__name__, name) self.assertEqual(module.__doc__, "Module named in %s" % lang) - @unittest.skipIf(not hasattr(sys, 'gettotalrefcount'), - '--with-pydebug has to be enabled for this test') - def test_bad_traverse(self): - ''' Issue #32374: Test that traverse fails when accessing per-module - state before Py_mod_exec was executed. - (Multiphase initialization modules only) - ''' - script = """if True: - try: - from test import support - import importlib.util as util - spec = util.find_spec('_testmultiphase') - spec.name = '_testmultiphase_with_bad_traverse' - - with support.SuppressCrashReport(): - m = spec.loader.create_module(spec) - except: - # Prevent Python-level exceptions from - # ending the process with non-zero status - # (We are testing for a crash in C-code) - pass""" - assert_python_failure("-c", script) - (Frozen_MultiPhaseExtensionModuleTests, Source_MultiPhaseExtensionModuleTests diff --git a/Lib/test/test_importlib/fixtures.py b/Lib/test/test_importlib/fixtures.py index d923cec26ea8f5f6ca90c7e59fa0bace473222de..2e55d14b9aab9713147497c7de32a58e3c663577 100644 --- a/Lib/test/test_importlib/fixtures.py +++ b/Lib/test/test_importlib/fixtures.py @@ -161,6 +161,21 @@ def setUp(self): build_files(EggInfoFile.files, prefix=self.site_dir) +class LocalPackage: + files = { + "setup.py": """ + import setuptools + setuptools.setup(name="local-pkg", version="2.0.1") + """, + } + + def setUp(self): + self.fixtures = contextlib.ExitStack() + self.addCleanup(self.fixtures.close) + self.fixtures.enter_context(tempdir_as_cwd()) + build_files(self.files) + + def build_files(file_defs, prefix=pathlib.Path()): """Build a set of files/directories, as described by the @@ -195,6 +210,17 @@ def build_files(file_defs, prefix=pathlib.Path()): f.write(DALS(contents)) +class FileBuilder: + def unicode_filename(self): + try: + import test.support + except ImportError: + # outside CPython, hard-code a unicode snowman + return '☃' + return test.support.FS_NONASCII or \ + self.skip("File system does not support non-ascii.") + + def DALS(str): "Dedent and left-strip" return textwrap.dedent(str).lstrip() diff --git a/Lib/test/test_importlib/import_/test_relative_imports.py b/Lib/test/test_importlib/import_/test_relative_imports.py index 8a95a32109d239799b543a5dcb6ef75db9a28ff5..41aa18269952fae958f4f498783dee996a1ad3b0 100644 --- a/Lib/test/test_importlib/import_/test_relative_imports.py +++ b/Lib/test/test_importlib/import_/test_relative_imports.py @@ -133,6 +133,7 @@ def callback(global_): self.assertEqual(module.__name__, 'pkg') self.assertTrue(hasattr(module, 'subpkg2')) self.assertEqual(module.subpkg2.attr, 'pkg.subpkg2.__init__') + self.relative_import_test(create, globals_, callback) def test_deep_import(self): # [deep import] @@ -156,7 +157,7 @@ def test_too_high_from_package(self): {'__name__': 'pkg', '__path__': ['blah']}) def callback(global_): self.__import__('pkg') - with self.assertRaises(ValueError): + with self.assertRaises(ImportError): self.__import__('', global_, fromlist=['top_level'], level=2) self.relative_import_test(create, globals_, callback) @@ -167,7 +168,7 @@ def test_too_high_from_module(self): globals_ = {'__package__': 'pkg'}, {'__name__': 'pkg.module'} def callback(global_): self.__import__('pkg') - with self.assertRaises(ValueError): + with self.assertRaises(ImportError): self.__import__('', global_, fromlist=['top_level'], level=2) self.relative_import_test(create, globals_, callback) diff --git a/Lib/test/test_importlib/source/test_case_sensitivity.py b/Lib/test/test_importlib/source/test_case_sensitivity.py index 12ce0cb9348963000231c2af993b88a532565c06..ad1cfdb7e5cc1a68cdc11ca008683d69ba8eff39 100644 --- a/Lib/test/test_importlib/source/test_case_sensitivity.py +++ b/Lib/test/test_importlib/source/test_case_sensitivity.py @@ -1,4 +1,6 @@ """Test case-sensitivity (PEP 235).""" +import sys + from .. import util importlib = util.import_importlib('importlib') @@ -38,6 +40,7 @@ def sensitivity_test(self): insensitive_finder = self.finder(insensitive_path) return self.find(sensitive_finder), self.find(insensitive_finder) + @unittest.skipIf(sys.flags.ignore_environment, 'ignore_environment flag was set') def test_sensitive(self): with test_support.EnvironmentVarGuard() as env: env.unset('PYTHONCASEOK') @@ -47,6 +50,7 @@ def test_sensitive(self): self.assertIn(self.name, sensitive.get_filename(self.name)) self.assertIsNone(insensitive) + @unittest.skipIf(sys.flags.ignore_environment, 'ignore_environment flag was set') def test_insensitive(self): with test_support.EnvironmentVarGuard() as env: env.set('PYTHONCASEOK', '1') diff --git a/Lib/test/test_importlib/test_abc.py b/Lib/test/test_importlib/test_abc.py index 05608bbb8b9dda8730fdec94cac1585598feec4a..9816b35ef829a72232bee761543bed7db7c821dd 100644 --- a/Lib/test/test_importlib/test_abc.py +++ b/Lib/test/test_importlib/test_abc.py @@ -357,13 +357,27 @@ def find_spec(self, fullname, path, target=None): return MetaPathSpecFinder() - def test_no_spec(self): + def test_find_module(self): finder = self.finder(None) path = ['a', 'b', 'c'] name = 'blah' with self.assertWarns(DeprecationWarning): found = finder.find_module(name, path) self.assertIsNone(found) + + def test_find_spec_with_explicit_target(self): + loader = object() + spec = self.util.spec_from_loader('blah', loader) + finder = self.finder(spec) + found = finder.find_spec('blah', 'blah', None) + self.assertEqual(found, spec) + + def test_no_spec(self): + finder = self.finder(None) + path = ['a', 'b', 'c'] + name = 'blah' + found = finder.find_spec(name, path, None) + self.assertIsNone(found) self.assertEqual(name, finder.called_for[0]) self.assertEqual(path, finder.called_for[1]) @@ -371,9 +385,8 @@ def test_spec(self): loader = object() spec = self.util.spec_from_loader('blah', loader) finder = self.finder(spec) - with self.assertWarns(DeprecationWarning): - found = finder.find_module('blah', None) - self.assertIs(found, spec.loader) + found = finder.find_spec('blah', None) + self.assertIs(found, spec) (Frozen_MPFFindModuleTests, diff --git a/Lib/test/test_importlib/test_files.py b/Lib/test/test_importlib/test_files.py new file mode 100644 index 0000000000000000000000000000000000000000..fa7af82bf0c28b108a2f46d9424534fb9bfdb2f9 --- /dev/null +++ b/Lib/test/test_importlib/test_files.py @@ -0,0 +1,39 @@ +import typing +import unittest + +from importlib import resources +from importlib.abc import Traversable +from . import data01 +from . import util + + +class FilesTests: + def test_read_bytes(self): + files = resources.files(self.data) + actual = files.joinpath('utf-8.file').read_bytes() + assert actual == b'Hello, UTF-8 world!\n' + + def test_read_text(self): + files = resources.files(self.data) + actual = files.joinpath('utf-8.file').read_text() + assert actual == 'Hello, UTF-8 world!\n' + + @unittest.skipUnless( + hasattr(typing, 'runtime_checkable'), + "Only suitable when typing supports runtime_checkable", + ) + def test_traversable(self): + assert isinstance(resources.files(self.data), Traversable) + + +class OpenDiskTests(FilesTests, unittest.TestCase): + def setUp(self): + self.data = data01 + + +class OpenZipTests(FilesTests, util.ZipSetup, unittest.TestCase): + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_importlib/test_main.py b/Lib/test/test_importlib/test_main.py index 42a79992ecc8c08179ab8d2326f4969c713c9655..91e501a2eb7cdc4889ca9a67a073086e57bbfb75 100644 --- a/Lib/test/test_importlib/test_main.py +++ b/Lib/test/test_importlib/test_main.py @@ -246,3 +246,24 @@ def test_json_dump(self): """ with self.assertRaises(Exception): json.dumps(self.ep) + + def test_module(self): + assert self.ep.module == 'value' + + def test_attr(self): + assert self.ep.attr is None + + +class FileSystem( + fixtures.OnSysPath, fixtures.SiteDir, fixtures.FileBuilder, + unittest.TestCase): + def test_unicode_dir_on_sys_path(self): + """ + Ensure a Unicode subdirectory of a directory on sys.path + does not crash. + """ + fixtures.build_files( + {self.unicode_filename(): {}}, + prefix=self.site_dir, + ) + list(distributions()) diff --git a/Lib/test/test_importlib/test_path.py b/Lib/test/test_importlib/test_path.py index 2d3dcda7ed2e7998381846a92ff62794e7c6dfb2..c4e7285411322c8e284e2d5d99bbaa3ef8b7101d 100644 --- a/Lib/test/test_importlib/test_path.py +++ b/Lib/test/test_importlib/test_path.py @@ -17,6 +17,7 @@ def test_reading(self): # Test also implicitly verifies the returned object is a pathlib.Path # instance. with resources.path(self.data, 'utf-8.file') as path: + self.assertTrue(path.name.endswith("utf-8.file"), repr(path)) # pathlib.Path.read_text() was introduced in Python 3.5. with path.open('r', encoding='utf-8') as file: text = file.read() diff --git a/Lib/test/test_pkgimport.py b/Lib/test/test_importlib/test_pkg_import.py similarity index 95% rename from Lib/test/test_pkgimport.py rename to Lib/test/test_importlib/test_pkg_import.py index 5d9a45111972f6e2bfa3aed491a01082cef0ea37..6181dcfab280cf57dd11fefc652126b2d0388e5f 100644 --- a/Lib/test/test_pkgimport.py +++ b/Lib/test/test_importlib/test_pkg_import.py @@ -14,7 +14,7 @@ class TestImport(unittest.TestCase): def __init__(self, *args, **kw): self.package_name = 'PACKAGE_' while self.package_name in sys.modules: - self.package_name += random.choose(string.ascii_letters) + self.package_name += random.choice(string.ascii_letters) self.module_name = self.package_name + '.foo' unittest.TestCase.__init__(self, *args, **kw) @@ -60,7 +60,7 @@ def test_package_import__semantics(self): # ...make up a variable name that isn't bound in __builtins__ var = 'a' while var in dir(__builtins__): - var += random.choose(string.ascii_letters) + var += random.choice(string.ascii_letters) # ...make a module that just contains that self.rewrite_file(var) diff --git a/Lib/test/test_importlib/test_resource.py b/Lib/test/test_importlib/test_resource.py index f88d92d154672958227b739ba2218e731f151cf1..e132c57282b37f01f2a349e8a3871254586aa198 100644 --- a/Lib/test/test_importlib/test_resource.py +++ b/Lib/test/test_importlib/test_resource.py @@ -1,10 +1,13 @@ import sys import unittest +import uuid from . import data01 from . import zipdata01, zipdata02 from . import util from importlib import resources, import_module +from pathlib import Path +from test import support class ResourceTests: @@ -162,5 +165,71 @@ def test_namespaces_cannot_have_resources(self): 'test.test_importlib.data03.namespace', 'resource1.txt') +class DeletingZipsTest(unittest.TestCase): + """Having accessed resources in a zip file should not keep an open + reference to the zip. + """ + ZIP_MODULE = zipdata01 + + def setUp(self): + modules = support.modules_setup() + self.addCleanup(support.modules_cleanup, *modules) + + data_path = Path(self.ZIP_MODULE.__file__) + data_dir = data_path.parent + self.source_zip_path = data_dir / 'ziptestdata.zip' + self.zip_path = Path.cwd() / '{}.zip'.format(uuid.uuid4()) + self.zip_path.write_bytes(self.source_zip_path.read_bytes()) + sys.path.append(str(self.zip_path)) + self.data = import_module('ziptestdata') + + def tearDown(self): + try: + sys.path.remove(str(self.zip_path)) + except ValueError: + pass + + try: + del sys.path_importer_cache[str(self.zip_path)] + del sys.modules[self.data.__name__] + except KeyError: + pass + + try: + support.unlink(self.zip_path) + except OSError: + # If the test fails, this will probably fail too + pass + + def test_contents_does_not_keep_open(self): + c = resources.contents('ziptestdata') + self.zip_path.unlink() + + def test_is_resource_does_not_keep_open(self): + c = resources.is_resource('ziptestdata', 'binary.file') + self.zip_path.unlink() + + def test_is_resource_failure_does_not_keep_open(self): + c = resources.is_resource('ziptestdata', 'not-present') + self.zip_path.unlink() + + def test_path_does_not_keep_open(self): + c = resources.path('ziptestdata', 'binary.file') + self.zip_path.unlink() + + def test_entered_path_does_not_keep_open(self): + # This is what certifi does on import to make its bundle + # available for the process duration. + c = resources.path('ziptestdata', 'binary.file').__enter__() + self.zip_path.unlink() + + def test_read_binary_does_not_keep_open(self): + c = resources.read_binary('ziptestdata', 'binary.file') + self.zip_path.unlink() + + def test_read_text_does_not_keep_open(self): + c = resources.read_text('ziptestdata', 'utf-8.file', encoding='utf-8') + self.zip_path.unlink() + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_threaded_import.py b/Lib/test/test_importlib/test_threaded_import.py similarity index 97% rename from Lib/test/test_threaded_import.py rename to Lib/test/test_importlib/test_threaded_import.py index 8607f363db21c0334330d2d431650a0f1fae7f68..d1f64c70fac80fe36870644c3ab601159aed69b5 100644 --- a/Lib/test/test_threaded_import.py +++ b/Lib/test/test_importlib/test_threaded_import.py @@ -178,11 +178,11 @@ def test_import_hangers(self): # In case this test is run again, make sure the helper module # gets loaded from scratch again. try: - del sys.modules['test.threaded_import_hangers'] + del sys.modules['test.test_importlib.threaded_import_hangers'] except KeyError: pass - import test.threaded_import_hangers - self.assertFalse(test.threaded_import_hangers.errors) + import test.test_importlib.threaded_import_hangers + self.assertFalse(test.test_importlib.threaded_import_hangers.errors) def test_circular_imports(self): # The goal of this test is to exercise implementations of the import diff --git a/Lib/test/test_importlib/test_util.py b/Lib/test/test_importlib/test_util.py index 58faab46f62cc3f83f17e2b74852bb0a4863e0ab..d6c10ed3d8c5c470bb80fef3dd7bc0f659915b53 100644 --- a/Lib/test/test_importlib/test_util.py +++ b/Lib/test/test_importlib/test_util.py @@ -375,7 +375,7 @@ def test_absolute_within_package(self): def test_no_package(self): # .bacon in '' - with self.assertRaises(ValueError): + with self.assertRaises(ImportError): self.util.resolve_name('.bacon', '') def test_in_package(self): @@ -390,7 +390,7 @@ def test_other_package(self): def test_escape(self): # ..bacon in spam - with self.assertRaises(ValueError): + with self.assertRaises(ImportError): self.util.resolve_name('..bacon', 'spam') @@ -518,7 +518,7 @@ def test_find_relative_module_missing_package(self): with util.temp_module(name, pkg=True) as pkg_dir: fullname, _ = util.submodule(name, subname, pkg_dir) relname = '.' + subname - with self.assertRaises(ValueError): + with self.assertRaises(ImportError): self.util.find_spec(relname) self.assertNotIn(name, sorted(sys.modules)) self.assertNotIn(fullname, sorted(sys.modules)) @@ -861,7 +861,7 @@ def test_magic_number(self): in advance. Such exceptional releases will then require an adjustment to this test case. """ - EXPECTED_MAGIC_NUMBER = 3413 + EXPECTED_MAGIC_NUMBER = 3425 actual = int.from_bytes(importlib.util.MAGIC_NUMBER[:2], 'little') msg = ( diff --git a/Lib/test/test_importlib/test_zip.py b/Lib/test/test_importlib/test_zip.py index 9568c226af033d08d10d77ccd036eb6863dfa6e5..a5399c16682fbef109e045617365a3a6b13e87b4 100644 --- a/Lib/test/test_importlib/test_zip.py +++ b/Lib/test/test_importlib/test_zip.py @@ -3,23 +3,31 @@ from contextlib import ExitStack from importlib.metadata import ( - distribution, entry_points, files, PackageNotFoundError, version, + distribution, entry_points, files, PackageNotFoundError, + version, distributions, ) -from importlib.resources import path +from importlib import resources +from test.support import requires_zlib + +@requires_zlib() class TestZip(unittest.TestCase): root = 'test.test_importlib.data' + def _fixture_on_path(self, filename): + pkg_file = resources.files(self.root).joinpath(filename) + file = self.resources.enter_context(resources.as_file(pkg_file)) + assert file.name.startswith('example-'), file.name + sys.path.insert(0, str(file)) + self.resources.callback(sys.path.pop, 0) + def setUp(self): # Find the path to the example-*.whl so we can add it to the front of # sys.path, where we'll then try to find the metadata thereof. self.resources = ExitStack() self.addCleanup(self.resources.close) - wheel = self.resources.enter_context( - path(self.root, 'example-21.12-py3-none-any.whl')) - sys.path.insert(0, str(wheel)) - self.resources.callback(sys.path.pop, 0) + self._fixture_on_path('example-21.12-py3-none-any.whl') def test_zip_version(self): self.assertEqual(version('example'), '21.12') @@ -46,17 +54,19 @@ def test_files(self): path = str(file.dist.locate_file(file)) assert '.whl/' in path, path + def test_one_distribution(self): + dists = list(distributions(path=sys.path[:1])) + assert len(dists) == 1 + +@requires_zlib() class TestEgg(TestZip): def setUp(self): # Find the path to the example-*.egg so we can add it to the front of # sys.path, where we'll then try to find the metadata thereof. self.resources = ExitStack() self.addCleanup(self.resources.close) - egg = self.resources.enter_context( - path(self.root, 'example-21.12-py3.6.egg')) - sys.path.insert(0, str(egg)) - self.resources.callback(sys.path.pop, 0) + self._fixture_on_path('example-21.12-py3.6.egg') def test_files(self): for file in files('example'): diff --git a/Lib/test/threaded_import_hangers.py b/Lib/test/test_importlib/threaded_import_hangers.py similarity index 100% rename from Lib/test/threaded_import_hangers.py rename to Lib/test/test_importlib/threaded_import_hangers.py diff --git a/Lib/test/test_importlib/util.py b/Lib/test/test_importlib/util.py index e6a1476875b5e31725005aab765f031fd9a82ee3..de6e0b025601843c159b316f956c6cc7631cd17a 100644 --- a/Lib/test/test_importlib/util.py +++ b/Lib/test/test_importlib/util.py @@ -119,7 +119,7 @@ def submodule(parent, name, pkg_dir, content=''): return '{}.{}'.format(parent, name), path -def _get_code_from_pyc(pyc_path): +def get_code_from_pyc(pyc_path): """Reads a pyc file and returns the unmarshalled code object within. No header validation is performed. @@ -499,7 +499,7 @@ def test_absolute_path(self): self.execute(data01, full_path) def test_relative_path(self): - # A reative path is a ValueError. + # A relative path is a ValueError. with self.assertRaises(ValueError): self.execute(data01, '../data01/utf-8.file') diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index ad93f304827fbaf1aec2006652f459bc4f71375d..d9e26a303366767ba3094ea3564040fd4e9aee16 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -25,7 +25,7 @@ ThreadPoolExecutor = None from test.support import run_unittest, TESTFN, DirsOnSysPath, cpython_only -from test.support import MISSING_C_DOCSTRINGS, cpython_only +from test.support import MISSING_C_DOCSTRINGS, ALWAYS_EQ from test.support.script_helper import assert_python_ok, assert_python_failure from test import inspect_fodder as mod from test import inspect_fodder2 as mod2 @@ -118,10 +118,6 @@ def gen_coroutine_function_example(self): yield return 'spam' -class EqualsToAll: - def __eq__(self, other): - return True - class TestPredicates(IsTestBase): def test_excluding_predicates(self): @@ -392,6 +388,7 @@ def test_getclasses(self): ('ParrotDroppings', mod.ParrotDroppings), ('StupidGit', mod.StupidGit), ('Tit', mod.MalodorousPervert), + ('WhichComments', mod.WhichComments), ]) tree = inspect.getclasstree([cls[1] for cls in classes]) self.assertEqual(tree, @@ -405,7 +402,8 @@ def test_getclasses(self): [(mod.FesteringGob, (mod.MalodorousPervert, mod.ParrotDroppings)) ] - ] + ], + (mod.WhichComments, (object,),) ] ]) tree = inspect.getclasstree([cls[1] for cls in classes], True) @@ -417,7 +415,8 @@ def test_getclasses(self): [(mod.FesteringGob, (mod.MalodorousPervert, mod.ParrotDroppings)) ] - ] + ], + (mod.WhichComments, (object,),) ] ]) @@ -468,6 +467,7 @@ def test_cleandoc(self): def test_getcomments(self): self.assertEqual(inspect.getcomments(mod), '# line 1\n') self.assertEqual(inspect.getcomments(mod.StupidGit), '# line 20\n') + self.assertEqual(inspect.getcomments(mod2.cls160), '# line 159\n') # If the object source file is not available, return None. co = compile('x=1', '_non_existing_filename.py', 'exec') self.assertIsNone(inspect.getcomments(co)) @@ -647,6 +647,18 @@ def test_anonymous(self): # as argument to another function. self.assertSourceEqual(mod2.anonymous, 55, 55) +class TestBlockComments(GetSourceBase): + fodderModule = mod + + def test_toplevel_class(self): + self.assertSourceEqual(mod.WhichComments, 96, 114) + + def test_class_method(self): + self.assertSourceEqual(mod.WhichComments.f, 99, 104) + + def test_class_async_method(self): + self.assertSourceEqual(mod.WhichComments.asyncf, 109, 112) + class TestBuggyCases(GetSourceBase): fodderModule = mod2 @@ -698,12 +710,62 @@ def test_findsource_without_filename(self): self.assertRaises(IOError, inspect.findsource, co) self.assertRaises(IOError, inspect.getsource, co) + def test_findsource_with_out_of_bounds_lineno(self): + mod_len = len(inspect.getsource(mod)) + src = '\n' * 2* mod_len + "def f(): pass" + co = compile(src, mod.__file__, "exec") + g, l = {}, {} + eval(co, g, l) + func = l['f'] + self.assertEqual(func.__code__.co_firstlineno, 1+2*mod_len) + with self.assertRaisesRegex(IOError, "lineno is out of bounds"): + inspect.findsource(func) + def test_getsource_on_method(self): self.assertSourceEqual(mod2.ClassWithMethod.method, 118, 119) def test_nested_func(self): self.assertSourceEqual(mod2.cls135.func136, 136, 139) + def test_class_definition_in_multiline_string_definition(self): + self.assertSourceEqual(mod2.cls149, 149, 152) + + def test_class_definition_in_multiline_comment(self): + self.assertSourceEqual(mod2.cls160, 160, 163) + + def test_nested_class_definition_indented_string(self): + self.assertSourceEqual(mod2.cls173.cls175, 175, 176) + + def test_nested_class_definition(self): + self.assertSourceEqual(mod2.cls183, 183, 188) + self.assertSourceEqual(mod2.cls183.cls185, 185, 188) + + def test_class_decorator(self): + self.assertSourceEqual(mod2.cls196, 194, 201) + self.assertSourceEqual(mod2.cls196.cls200, 198, 201) + + def test_class_inside_conditional(self): + self.assertSourceEqual(mod2.cls238, 238, 240) + self.assertSourceEqual(mod2.cls238.cls239, 239, 240) + + def test_multiple_children_classes(self): + self.assertSourceEqual(mod2.cls203, 203, 209) + self.assertSourceEqual(mod2.cls203.cls204, 204, 206) + self.assertSourceEqual(mod2.cls203.cls204.cls205, 205, 206) + self.assertSourceEqual(mod2.cls203.cls207, 207, 209) + self.assertSourceEqual(mod2.cls203.cls207.cls205, 208, 209) + + def test_nested_class_definition_inside_function(self): + self.assertSourceEqual(mod2.func212(), 213, 214) + self.assertSourceEqual(mod2.cls213, 218, 222) + self.assertSourceEqual(mod2.cls213().func219(), 220, 221) + + def test_nested_class_definition_inside_async_function(self): + import asyncio + self.addCleanup(asyncio.set_event_loop_policy, None) + self.assertSourceEqual(asyncio.run(mod2.func225()), 226, 227) + self.assertSourceEqual(mod2.cls226, 231, 235) + self.assertSourceEqual(asyncio.run(mod2.cls226().func232()), 233, 234) class TestNoEOL(GetSourceBase): def setUp(self): @@ -2081,6 +2143,7 @@ def test_signature_object(self): P = inspect.Parameter self.assertEqual(str(S()), '()') + self.assertEqual(repr(S().parameters), 'mappingproxy(OrderedDict())') def test(po, pk, pod=42, pkd=100, *args, ko, **kwargs): pass @@ -2978,8 +3041,8 @@ def test_signature_equality(self): def foo(a, *, b:int) -> float: pass self.assertFalse(inspect.signature(foo) == 42) self.assertTrue(inspect.signature(foo) != 42) - self.assertTrue(inspect.signature(foo) == EqualsToAll()) - self.assertFalse(inspect.signature(foo) != EqualsToAll()) + self.assertTrue(inspect.signature(foo) == ALWAYS_EQ) + self.assertFalse(inspect.signature(foo) != ALWAYS_EQ) def bar(a, *, b:int) -> float: pass self.assertTrue(inspect.signature(foo) == inspect.signature(bar)) @@ -3184,6 +3247,11 @@ def test_signature_definition_order_preserved_on_kwonly(self): l = list(signature.parameters) self.assertEqual(l, unsorted_keyword_only_parameters) + def test_signater_parameters_is_ordered(self): + p1 = inspect.signature(lambda x, y: None).parameters + p2 = inspect.signature(lambda y, x: None).parameters + self.assertNotEqual(p1, p2) + class TestParameterObject(unittest.TestCase): def test_signature_parameter_kinds(self): @@ -3253,8 +3321,8 @@ def test_signature_parameter_equality(self): self.assertFalse(p != p) self.assertFalse(p == 42) self.assertTrue(p != 42) - self.assertTrue(p == EqualsToAll()) - self.assertFalse(p != EqualsToAll()) + self.assertTrue(p == ALWAYS_EQ) + self.assertFalse(p != ALWAYS_EQ) self.assertTrue(p == P('foo', default=42, kind=inspect.Parameter.KEYWORD_ONLY)) @@ -3601,8 +3669,8 @@ def foo(a): pass ba = inspect.signature(foo).bind(1) self.assertTrue(ba == ba) self.assertFalse(ba != ba) - self.assertTrue(ba == EqualsToAll()) - self.assertFalse(ba != EqualsToAll()) + self.assertTrue(ba == ALWAYS_EQ) + self.assertFalse(ba != ALWAYS_EQ) ba2 = inspect.signature(foo).bind(1) self.assertTrue(ba == ba2) @@ -3685,6 +3753,10 @@ def foo(a='spam'): pass ba.apply_defaults() self.assertEqual(list(ba.arguments.items()), [('a', 'spam')]) + def test_signature_bound_arguments_arguments_type(self): + def foo(a): pass + ba = inspect.signature(foo).bind(1) + self.assertIs(type(ba.arguments), dict) class TestSignaturePrivateHelpers(unittest.TestCase): def test_signature_get_bound_param(self): @@ -3970,8 +4042,8 @@ def test_getsource_reload(self): def test_main(): run_unittest( - TestDecorators, TestRetrievingSourceCode, TestOneliners, TestBuggyCases, - TestInterpreterStack, TestClassesAndFunctions, TestPredicates, + TestDecorators, TestRetrievingSourceCode, TestOneliners, TestBlockComments, + TestBuggyCases, TestInterpreterStack, TestClassesAndFunctions, TestPredicates, TestGetcallargsFunctions, TestGetcallargsMethods, TestGetcallargsUnboundMethods, TestGetattrStatic, TestGetGeneratorState, TestNoEOL, TestSignatureObject, TestSignatureBind, TestParameterObject, diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index bea4342e7f0f9eb7be957e0d6eba503631981e1c..d2e387728bd5f53192f3926fc5e0d2efec646bfa 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -29,6 +29,7 @@ import signal import sys import sysconfig +import textwrap import threading import time import unittest @@ -37,7 +38,8 @@ from collections import deque, UserList from itertools import cycle, count from test import support -from test.support.script_helper import assert_python_ok, run_python_until_end +from test.support.script_helper import ( + assert_python_ok, assert_python_failure, run_python_until_end) from test.support import FakePath import codecs @@ -922,7 +924,7 @@ def check_path_succeeds(path): self.assertEqual(f.read(), "egg\n") check_path_succeeds(FakePath(support.TESTFN)) - check_path_succeeds(FakePath(support.TESTFN.encode('utf-8'))) + check_path_succeeds(FakePath(os.fsencode(support.TESTFN))) with self.open(support.TESTFN, "w") as f: bad_path = FakePath(f.fileno()) @@ -1526,6 +1528,13 @@ def test_read_on_closed(self): self.assertRaises(ValueError, b.peek) self.assertRaises(ValueError, b.read1, 1) + def test_truncate_on_read_only(self): + rawio = self.MockFileIO(b"abc") + bufio = self.tp(rawio) + self.assertFalse(bufio.writable()) + self.assertRaises(self.UnsupportedOperation, bufio.truncate) + self.assertRaises(self.UnsupportedOperation, bufio.truncate, 0) + class CBufferedReaderTest(BufferedReaderTest, SizeofTest): tp = io.BufferedReader @@ -2370,6 +2379,10 @@ def test_interleaved_readline_write(self): # You can't construct a BufferedRandom over a non-seekable stream. test_unseekable = None + # writable() returns True, so there's no point to test it over + # a writable stream. + test_truncate_on_read_only = None + class CBufferedRandomTest(BufferedRandomTest, SizeofTest): tp = io.BufferedRandom @@ -3495,7 +3508,6 @@ def __del__(self): """.format(iomod=iomod, kwargs=kwargs) return assert_python_ok("-c", code) - @support.requires_type_collecting def test_create_at_shutdown_without_encoding(self): rc, out, err = self._check_create_at_shutdown() if err: @@ -3505,7 +3517,6 @@ def test_create_at_shutdown_without_encoding(self): else: self.assertEqual("ok", out.decode().strip()) - @support.requires_type_collecting def test_create_at_shutdown_with_encoding(self): rc, out, err = self._check_create_at_shutdown(encoding='utf-8', errors='strict') @@ -3688,7 +3699,7 @@ def _to_memoryview(buf): class CTextIOWrapperTest(TextIOWrapperTest): io = io - shutdown_error = "RuntimeError: could not find io module state" + shutdown_error = "LookupError: unknown encoding: ascii" def test_initialization(self): r = self.BytesIO(b"\xc3\xa9\n\n") @@ -4146,6 +4157,51 @@ def test_open_allargs(self): # there used to be a buffer overflow in the parser for rawmode self.assertRaises(ValueError, self.open, support.TESTFN, 'rwax+') + def test_check_encoding_errors(self): + # bpo-37388: open() and TextIOWrapper must check encoding and errors + # arguments in dev mode + mod = self.io.__name__ + filename = __file__ + invalid = 'Boom, Shaka Laka, Boom!' + code = textwrap.dedent(f''' + import sys + from {mod} import open, TextIOWrapper + + try: + open({filename!r}, encoding={invalid!r}) + except LookupError: + pass + else: + sys.exit(21) + + try: + open({filename!r}, errors={invalid!r}) + except LookupError: + pass + else: + sys.exit(22) + + fp = open({filename!r}, "rb") + with fp: + try: + TextIOWrapper(fp, encoding={invalid!r}) + except LookupError: + pass + else: + sys.exit(23) + + try: + TextIOWrapper(fp, errors={invalid!r}) + except LookupError: + pass + else: + sys.exit(24) + + sys.exit(10) + ''') + proc = assert_python_failure('-X', 'dev', '-c', code) + self.assertEqual(proc.rc, 10, proc) + class CMiscIOTest(MiscIOTest): io = io @@ -4191,7 +4247,8 @@ def run(): err = res.err.decode() if res.rc != 0: # Failure: should be a fatal error - pattern = (r"Fatal Python error: could not acquire lock " + pattern = (r"Fatal Python error: _enter_buffered_busy: " + r"could not acquire lock " r"for <(_io\.)?BufferedWriter name='<{stream_name}>'> " r"at interpreter shutdown, possibly due to " r"daemon threads".format_map(locals())) diff --git a/Lib/test/test_ioctl.py b/Lib/test/test_ioctl.py index d1a5db90810d82ae1883a7e13eabe246d22f366b..a2873582cf9827c81f6f2721a10068bea2f778b4 100644 --- a/Lib/test/test_ioctl.py +++ b/Lib/test/test_ioctl.py @@ -48,7 +48,7 @@ def _check_ioctl_mutate_len(self, nbytes=None): else: buf.append(fill) with open("/dev/tty", "rb") as tty: - r = fcntl.ioctl(tty, termios.TIOCGPGRP, buf, 1) + r = fcntl.ioctl(tty, termios.TIOCGPGRP, buf, True) rpgrp = buf[0] self.assertEqual(r, 0) self.assertIn(rpgrp, ids) diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py index 2eba740e5e7a4857465ca6cef19a671a5089096c..3c070080a6aaeba326e7f1ff0fe5ad2f99418dae 100644 --- a/Lib/test/test_ipaddress.py +++ b/Lib/test/test_ipaddress.py @@ -7,7 +7,6 @@ import unittest import re import contextlib -import functools import operator import pickle import ipaddress @@ -170,10 +169,44 @@ def assertBadLength(length): assertBadLength(15) assertBadLength(17) + def test_blank_scope_id(self): + address = ('::1%') + with self.assertAddressError('Invalid IPv6 address: "%r"', address): + self.factory(address) + + def test_invalid_scope_id_with_percent(self): + address = ('::1%scope%') + with self.assertAddressError('Invalid IPv6 address: "%r"', address): + self.factory(address) class AddressTestCase_v4(BaseTestCase, CommonTestMixin_v4): factory = ipaddress.IPv4Address + def test_format(self): + v4 = ipaddress.IPv4Address("1.2.3.42") + v4_pairs = [ + ("b" ,"00000001000000100000001100101010"), + ("n" ,"00000001000000100000001100101010"), + ("x" ,"0102032a"), + ("X" ,"0102032A"), + ("_b" ,"0000_0001_0000_0010_0000_0011_0010_1010"), + ("_n" ,"0000_0001_0000_0010_0000_0011_0010_1010"), + ("_x" ,"0102_032a"), + ("_X" ,"0102_032A"), + ("#b" ,"0b00000001000000100000001100101010"), + ("#n" ,"0b00000001000000100000001100101010"), + ("#x" ,"0x0102032a"), + ("#X" ,"0X0102032A"), + ("#_b" ,"0b0000_0001_0000_0010_0000_0011_0010_1010"), + ("#_n" ,"0b0000_0001_0000_0010_0000_0011_0010_1010"), + ("#_x" ,"0x0102_032a"), + ("#_X" ,"0X0102_032A"), + ("s" ,"1.2.3.42"), + ("" ,"1.2.3.42"), + ] + for (fmt, txt) in v4_pairs: + self.assertEqual(txt, format(v4, fmt)) + def test_network_passed_as_address(self): addr = "127.0.0.1/24" with self.assertAddressError("Unexpected '/' in %r", addr): @@ -261,25 +294,72 @@ def test_weakref(self): class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6): factory = ipaddress.IPv6Address + def test_format(self): + + v6 = ipaddress.IPv6Address("::1.2.3.42") + v6_pairs = [ + ("b", + "000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000010000" + "00100000001100101010"), + ("n", "0000000000000000000000000102032a"), + ("x", "0000000000000000000000000102032a"), + ("X", "0000000000000000000000000102032A"), + ("_b", + "0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000" + "_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000" + "_0000_0000_0000_0000_0001_0000_0010_0000_0011_0010" + "_1010"), + ("_n", "0000_0000_0000_0000_0000_0000_0102_032a"), + ("_x", "0000_0000_0000_0000_0000_0000_0102_032a"), + ("_X", "0000_0000_0000_0000_0000_0000_0102_032A"), + ("#b", + "0b0000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000100" + "0000100000001100101010"), + ("#n", "0x0000000000000000000000000102032a"), + ("#x", "0x0000000000000000000000000102032a"), + ("#X", "0X0000000000000000000000000102032A"), + ("#_b", + "0b0000_0000_0000_0000_0000_0000_0000_0000_0000_0000" + "_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000" + "_0000_0000_0000_0000_0000_0001_0000_0010_0000_0011" + "_0010_1010"), + ("#_n", "0x0000_0000_0000_0000_0000_0000_0102_032a"), + ("#_x", "0x0000_0000_0000_0000_0000_0000_0102_032a"), + ("#_X", "0X0000_0000_0000_0000_0000_0000_0102_032A"), + ("s", "::102:32a"), + ("", "::102:32a"), + ] + + for (fmt, txt) in v6_pairs: + self.assertEqual(txt, format(v6, fmt)) + def test_network_passed_as_address(self): - addr = "::1/24" - with self.assertAddressError("Unexpected '/' in %r", addr): - ipaddress.IPv6Address(addr) + def assertBadSplit(addr): + msg = "Unexpected '/' in %r" + with self.assertAddressError(msg, addr): + ipaddress.IPv6Address(addr) + assertBadSplit("::1/24") + assertBadSplit("::1%scope_id/24") def test_bad_address_split_v6_not_enough_parts(self): def assertBadSplit(addr): msg = "At least 3 parts expected in %r" - with self.assertAddressError(msg, addr): + with self.assertAddressError(msg, addr.split('%')[0]): ipaddress.IPv6Address(addr) assertBadSplit(":") assertBadSplit(":1") assertBadSplit("FEDC:9878") + assertBadSplit(":%scope") + assertBadSplit(":1%scope") + assertBadSplit("FEDC:9878%scope") def test_bad_address_split_v6_too_many_colons(self): def assertBadSplit(addr): msg = "At most 8 colons permitted in %r" - with self.assertAddressError(msg, addr): + with self.assertAddressError(msg, addr.split('%')[0]): ipaddress.IPv6Address(addr) assertBadSplit("9:8:7:6:5:4:3::2:1") @@ -289,10 +369,17 @@ def assertBadSplit(addr): # A trailing IPv4 address is two parts assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42") + assertBadSplit("9:8:7:6:5:4:3::2:1%scope") + assertBadSplit("10:9:8:7:6:5:4:3:2:1%scope") + assertBadSplit("::8:7:6:5:4:3:2:1%scope") + assertBadSplit("8:7:6:5:4:3:2:1::%scope") + # A trailing IPv4 address is two parts + assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42%scope") + def test_bad_address_split_v6_too_many_parts(self): def assertBadSplit(addr): msg = "Exactly 8 parts expected without '::' in %r" - with self.assertAddressError(msg, addr): + with self.assertAddressError(msg, addr.split('%')[0]): ipaddress.IPv6Address(addr) assertBadSplit("3ffe:0:0:0:0:0:0:0:1") @@ -302,18 +389,26 @@ def assertBadSplit(addr): assertBadSplit("9:8:7:6:5:4:3:42.42.42.42") assertBadSplit("7:6:5:4:3:42.42.42.42") + assertBadSplit("3ffe:0:0:0:0:0:0:0:1%scope") + assertBadSplit("9:8:7:6:5:4:3:2:1%scope") + assertBadSplit("7:6:5:4:3:2:1%scope") + # A trailing IPv4 address is two parts + assertBadSplit("9:8:7:6:5:4:3:42.42.42.42%scope") + assertBadSplit("7:6:5:4:3:42.42.42.42%scope") + def test_bad_address_split_v6_too_many_parts_with_double_colon(self): def assertBadSplit(addr): msg = "Expected at most 7 other parts with '::' in %r" - with self.assertAddressError(msg, addr): + with self.assertAddressError(msg, addr.split('%')[0]): ipaddress.IPv6Address(addr) assertBadSplit("1:2:3:4::5:6:7:8") + assertBadSplit("1:2:3:4::5:6:7:8%scope") def test_bad_address_split_v6_repeated_double_colon(self): def assertBadSplit(addr): msg = "At most one '::' permitted in %r" - with self.assertAddressError(msg, addr): + with self.assertAddressError(msg, addr.split('%')[0]): ipaddress.IPv6Address(addr) assertBadSplit("3ffe::1::1") @@ -327,10 +422,21 @@ def assertBadSplit(addr): assertBadSplit(":::") assertBadSplit('2001:db8:::1') + assertBadSplit("3ffe::1::1%scope") + assertBadSplit("1::2::3::4:5%scope") + assertBadSplit("2001::db:::1%scope") + assertBadSplit("3ffe::1::%scope") + assertBadSplit("::3ffe::1%scope") + assertBadSplit(":3ffe::1::1%scope") + assertBadSplit("3ffe::1::1:%scope") + assertBadSplit(":3ffe::1::1:%scope") + assertBadSplit(":::%scope") + assertBadSplit('2001:db8:::1%scope') + def test_bad_address_split_v6_leading_colon(self): def assertBadSplit(addr): msg = "Leading ':' only permitted as part of '::' in %r" - with self.assertAddressError(msg, addr): + with self.assertAddressError(msg, addr.split('%')[0]): ipaddress.IPv6Address(addr) assertBadSplit(":2001:db8::1") @@ -338,10 +444,15 @@ def assertBadSplit(addr): assertBadSplit(":1:2:3:4:5:6:") assertBadSplit(":6:5:4:3:2:1::") + assertBadSplit(":2001:db8::1%scope") + assertBadSplit(":1:2:3:4:5:6:7%scope") + assertBadSplit(":1:2:3:4:5:6:%scope") + assertBadSplit(":6:5:4:3:2:1::%scope") + def test_bad_address_split_v6_trailing_colon(self): def assertBadSplit(addr): msg = "Trailing ':' only permitted as part of '::' in %r" - with self.assertAddressError(msg, addr): + with self.assertAddressError(msg, addr.split('%')[0]): ipaddress.IPv6Address(addr) assertBadSplit("2001:db8::1:") @@ -349,9 +460,14 @@ def assertBadSplit(addr): assertBadSplit("::1.2.3.4:") assertBadSplit("::7:6:5:4:3:2:") + assertBadSplit("2001:db8::1:%scope") + assertBadSplit("1:2:3:4:5:6:7:%scope") + assertBadSplit("::1.2.3.4:%scope") + assertBadSplit("::7:6:5:4:3:2:%scope") + def test_bad_v4_part_in(self): def assertBadAddressPart(addr, v4_error): - with self.assertAddressError("%s in %r", v4_error, addr): + with self.assertAddressError("%s in %r", v4_error, addr.split('%')[0]): ipaddress.IPv6Address(addr) assertBadAddressPart("3ffe::1.net", "Expected 4 octets in '1.net'") @@ -365,9 +481,20 @@ def assertBadAddressPart(addr, v4_error): "Only decimal digits permitted in 'net' " "in '1.1.1.net'") + assertBadAddressPart("3ffe::1.net%scope", "Expected 4 octets in '1.net'") + assertBadAddressPart("3ffe::127.0.1%scope", + "Expected 4 octets in '127.0.1'") + assertBadAddressPart("::1.2.3%scope", + "Expected 4 octets in '1.2.3'") + assertBadAddressPart("::1.2.3.4.5%scope", + "Expected 4 octets in '1.2.3.4.5'") + assertBadAddressPart("3ffe::1.1.1.net%scope", + "Only decimal digits permitted in 'net' " + "in '1.1.1.net'") + def test_invalid_characters(self): def assertBadPart(addr, part): - msg = "Only hex digits permitted in %r in %r" % (part, addr) + msg = "Only hex digits permitted in %r in %r" % (part, addr.split('%')[0]) with self.assertAddressError(re.escape(msg)): ipaddress.IPv6Address(addr) @@ -378,10 +505,17 @@ def assertBadPart(addr, part): assertBadPart("1.2.3.4::", "1.2.3.4") assertBadPart('1234:axy::b', "axy") + assertBadPart("3ffe::goog%scope", "goog") + assertBadPart("3ffe::-0%scope", "-0") + assertBadPart("3ffe::+0%scope", "+0") + assertBadPart("3ffe::-1%scope", "-1") + assertBadPart("1.2.3.4::%scope", "1.2.3.4") + assertBadPart('1234:axy::b%scope', "axy") + def test_part_length(self): def assertBadPart(addr, part): msg = "At most 4 characters permitted in %r in %r" - with self.assertAddressError(msg, part, addr): + with self.assertAddressError(msg, part, addr.split('%')[0]): ipaddress.IPv6Address(addr) assertBadPart("::00000", "00000") @@ -389,11 +523,17 @@ def assertBadPart(addr, part): assertBadPart("02001:db8::", "02001") assertBadPart('2001:888888::1', "888888") + assertBadPart("::00000%scope", "00000") + assertBadPart("3ffe::10000%scope", "10000") + assertBadPart("02001:db8::%scope", "02001") + assertBadPart('2001:888888::1%scope', "888888") + def test_pickle(self): self.pickle_test('2001:db8::') def test_weakref(self): weakref.ref(self.factory('2001:db8::')) + weakref.ref(self.factory('2001:db8::%scope')) class NetmaskTestMixin_v4(CommonTestMixin_v4): @@ -551,11 +691,20 @@ def test_no_mask(self): # IPv6Network has prefixlen, but IPv6Interface doesn't. # Should we add it to IPv4Interface too? (bpo-36392) + scoped_net = self.factory('::1%scope') + self.assertEqual(str(scoped_net), '::1%scope/128') + self.assertEqual(str(scoped_net.netmask), 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff') + self.assertEqual(str(scoped_net.hostmask), '::') + def test_split_netmask(self): addr = "cafe:cafe::/128/190" with self.assertAddressError("Only one '/' permitted in %r" % addr): self.factory(addr) + scoped_addr = "cafe:cafe::%scope/128/190" + with self.assertAddressError("Only one '/' permitted in %r" % scoped_addr): + self.factory(scoped_addr) + def test_address_errors(self): def assertBadAddress(addr, details): with self.assertAddressError(details): @@ -568,6 +717,13 @@ def assertBadAddress(addr, details): assertBadAddress("10/8", "At least 3 parts") assertBadAddress("1234:axy::b", "Only hex digits") + assertBadAddress("/%scope", "Address cannot be empty") + assertBadAddress("/%scope8", "Address cannot be empty") + assertBadAddress("google.com%scope", "At least 3 parts") + assertBadAddress("1.2.3.4%scope", "At least 3 parts") + assertBadAddress("10%scope/8", "At least 3 parts") + assertBadAddress("1234:axy::b%scope", "Only hex digits") + def test_valid_netmask(self): # We only support CIDR for IPv6, because expanded netmasks are not # standard notation. @@ -579,6 +735,14 @@ def test_valid_netmask(self): # Zero prefix is treated as decimal. self.assertEqual(str(self.factory('::/0%d' % i)), net_str) + self.assertEqual(str(self.factory('2001:db8::%scope/32')), '2001:db8::%scope/32') + for i in range(0, 129): + # Generate and re-parse the CIDR format (trivial). + net_str = '::/%d' % i + self.assertEqual(str(self.factory(net_str)), net_str) + # Zero prefix is treated as decimal. + self.assertEqual(str(self.factory('::/0%d' % i)), net_str) + def test_netmask_errors(self): def assertBadNetmask(addr, netmask): msg = "%r is not a valid netmask" % netmask @@ -597,6 +761,8 @@ def assertBadNetmask(addr, netmask): assertBadNetmask("::1", "pudding") assertBadNetmask("::", "::") + assertBadNetmask("::1%scope", "pudding") + def test_netmask_in_tuple_errors(self): def assertBadNetmask(addr, netmask): msg = "%r is not a valid netmask" % netmask @@ -604,12 +770,15 @@ def assertBadNetmask(addr, netmask): self.factory((addr, netmask)) assertBadNetmask("::1", -1) assertBadNetmask("::1", 129) + assertBadNetmask("::1%scope", 129) def test_pickle(self): self.pickle_test('2001:db8::1000/124') self.pickle_test('2001:db8::1000/127') # IPV6LENGTH - 1 self.pickle_test('2001:db8::1000') # IPV6LENGTH + self.pickle_test('2001:db8::1000%scope') # IPV6LENGTH + class InterfaceTestCase_v6(BaseTestCase, NetmaskTestMixin_v6): factory = ipaddress.IPv6Interface @@ -636,6 +805,13 @@ def test_subnet_of(self): self.factory('2000:aaa::/48').subnet_of( self.factory('2000:aaa::/56'))) + self.assertFalse( + self.factory('2000:999::%scope/56').subnet_of( + self.factory('2000:aaa::%scope/48'))) + self.assertTrue( + self.factory('2000:aaa::%scope/56').subnet_of( + self.factory('2000:aaa::%scope/48'))) + def test_supernet_of(self): # containee left of container self.assertFalse( @@ -682,13 +858,19 @@ class ComparisonTests(unittest.TestCase): v6addr = ipaddress.IPv6Address(1) v6net = ipaddress.IPv6Network(1) v6intf = ipaddress.IPv6Interface(1) + v6addr_scoped = ipaddress.IPv6Address('::1%scope') + v6net_scoped= ipaddress.IPv6Network('::1%scope') + v6intf_scoped= ipaddress.IPv6Interface('::1%scope') v4_addresses = [v4addr, v4intf] v4_objects = v4_addresses + [v4net] v6_addresses = [v6addr, v6intf] v6_objects = v6_addresses + [v6net] + v6_scoped_addresses = [v6addr_scoped, v6intf_scoped] + v6_scoped_objects = v6_scoped_addresses + [v6net_scoped] objects = v4_objects + v6_objects + objects_with_scoped = objects + v6_scoped_objects v4addr2 = ipaddress.IPv4Address(2) v4net2 = ipaddress.IPv4Network(2) @@ -696,11 +878,14 @@ class ComparisonTests(unittest.TestCase): v6addr2 = ipaddress.IPv6Address(2) v6net2 = ipaddress.IPv6Network(2) v6intf2 = ipaddress.IPv6Interface(2) + v6addr2_scoped = ipaddress.IPv6Address('::2%scope') + v6net2_scoped = ipaddress.IPv6Network('::2%scope') + v6intf2_scoped = ipaddress.IPv6Interface('::2%scope') def test_foreign_type_equality(self): # __eq__ should never raise TypeError directly other = object() - for obj in self.objects: + for obj in self.objects_with_scoped: self.assertNotEqual(obj, other) self.assertFalse(obj == other) self.assertEqual(obj.__eq__(other), NotImplemented) @@ -715,8 +900,17 @@ def test_mixed_type_equality(self): continue self.assertNotEqual(lhs, rhs) + def test_scoped_ipv6_equality(self): + for lhs, rhs in zip(self.v6_objects, self.v6_scoped_objects): + self.assertNotEqual(lhs, rhs) + + def test_v4_with_v6_scoped_equality(self): + for lhs in self.v4_objects: + for rhs in self.v6_scoped_objects: + self.assertNotEqual(lhs, rhs) + def test_same_type_equality(self): - for obj in self.objects: + for obj in self.objects_with_scoped: self.assertEqual(obj, obj) self.assertLessEqual(obj, obj) self.assertGreaterEqual(obj, obj) @@ -729,6 +923,9 @@ def test_same_type_ordering(self): (self.v6addr, self.v6addr2), (self.v6net, self.v6net2), (self.v6intf, self.v6intf2), + (self.v6addr_scoped, self.v6addr2_scoped), + (self.v6net_scoped, self.v6net2_scoped), + (self.v6intf_scoped, self.v6intf2_scoped), ): self.assertNotEqual(lhs, rhs) self.assertLess(lhs, rhs) @@ -743,16 +940,21 @@ def test_same_type_ordering(self): def test_containment(self): for obj in self.v4_addresses: self.assertIn(obj, self.v4net) - for obj in self.v6_addresses: + for obj in self.v6_addresses + self.v6_scoped_addresses: self.assertIn(obj, self.v6net) - for obj in self.v4_objects + [self.v6net]: + for obj in self.v6_addresses + self.v6_scoped_addresses: + self.assertIn(obj, self.v6net_scoped) + + for obj in self.v4_objects + [self.v6net, self.v6net_scoped]: self.assertNotIn(obj, self.v6net) - for obj in self.v6_objects + [self.v4net]: + for obj in self.v4_objects + [self.v6net, self.v6net_scoped]: + self.assertNotIn(obj, self.v6net_scoped) + for obj in self.v6_objects + self.v6_scoped_objects + [self.v4net]: self.assertNotIn(obj, self.v4net) def test_mixed_type_ordering(self): - for lhs in self.objects: - for rhs in self.objects: + for lhs in self.objects_with_scoped: + for rhs in self.objects_with_scoped: if isinstance(lhs, type(rhs)) or isinstance(rhs, type(lhs)): continue self.assertRaises(TypeError, lambda: lhs < rhs) @@ -762,7 +964,7 @@ def test_mixed_type_ordering(self): def test_foreign_type_ordering(self): other = object() - for obj in self.objects: + for obj in self.objects_with_scoped: with self.assertRaises(TypeError): obj < other with self.assertRaises(TypeError): @@ -784,14 +986,18 @@ def test_mixed_type_key(self): # with get_mixed_type_key, you can sort addresses and network. v4_ordered = [self.v4addr, self.v4net, self.v4intf] v6_ordered = [self.v6addr, self.v6net, self.v6intf] + v6_scoped_ordered = [self.v6addr_scoped, self.v6net_scoped, self.v6intf_scoped] self.assertEqual(v4_ordered, sorted(self.v4_objects, key=ipaddress.get_mixed_type_key)) self.assertEqual(v6_ordered, sorted(self.v6_objects, key=ipaddress.get_mixed_type_key)) - self.assertEqual(v4_ordered + v6_ordered, - sorted(self.objects, + self.assertEqual(v6_scoped_ordered, + sorted(self.v6_scoped_objects, + key=ipaddress.get_mixed_type_key)) + self.assertEqual(v4_ordered + v6_scoped_ordered, + sorted(self.v4_objects + self.v6_scoped_objects, key=ipaddress.get_mixed_type_key)) self.assertEqual(NotImplemented, ipaddress.get_mixed_type_key(object)) @@ -801,6 +1007,8 @@ def test_incompatible_versions(self): v4net = ipaddress.ip_network('1.1.1.1') v6addr = ipaddress.ip_address('::1') v6net = ipaddress.ip_network('::1') + v6addr_scoped = ipaddress.ip_address('::1%scope') + v6net_scoped = ipaddress.ip_network('::1%scope') self.assertRaises(TypeError, v4addr.__lt__, v6addr) self.assertRaises(TypeError, v4addr.__gt__, v6addr) @@ -812,6 +1020,16 @@ def test_incompatible_versions(self): self.assertRaises(TypeError, v6net.__lt__, v4net) self.assertRaises(TypeError, v6net.__gt__, v4net) + self.assertRaises(TypeError, v4addr.__lt__, v6addr_scoped) + self.assertRaises(TypeError, v4addr.__gt__, v6addr_scoped) + self.assertRaises(TypeError, v4net.__lt__, v6net_scoped) + self.assertRaises(TypeError, v4net.__gt__, v6net_scoped) + + self.assertRaises(TypeError, v6addr_scoped.__lt__, v4addr) + self.assertRaises(TypeError, v6addr_scoped.__gt__, v4addr) + self.assertRaises(TypeError, v6net_scoped.__lt__, v4net) + self.assertRaises(TypeError, v6net_scoped.__gt__, v4net) + class IpaddrUnitTest(unittest.TestCase): @@ -825,12 +1043,19 @@ def setUp(self): self.ipv6_interface = ipaddress.IPv6Interface( '2001:658:22a:cafe:200:0:0:1/64') self.ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/64') + self.ipv6_scoped_address = ipaddress.IPv6Interface( + '2001:658:22a:cafe:200:0:0:1%scope') + self.ipv6_scoped_interface = ipaddress.IPv6Interface( + '2001:658:22a:cafe:200:0:0:1%scope/64') + self.ipv6_scoped_network = ipaddress.IPv6Network('2001:658:22a:cafe::%scope/64') def testRepr(self): self.assertEqual("IPv4Interface('1.2.3.4/32')", repr(ipaddress.IPv4Interface('1.2.3.4'))) self.assertEqual("IPv6Interface('::1/128')", repr(ipaddress.IPv6Interface('::1'))) + self.assertEqual("IPv6Interface('::1%scope/128')", + repr(ipaddress.IPv6Interface('::1%scope'))) # issue #16531: constructing IPv4Network from an (address, mask) tuple def testIPv4Tuple(self): @@ -917,6 +1142,8 @@ def testIPv6Tuple(self): self.assertEqual(ipaddress.IPv6Network((ip, '96')), net) + ip_scoped = ipaddress.IPv6Address('2001:db8::%scope') + # strict=True and host bits set ip = ipaddress.IPv6Address('2001:db8::1') with self.assertRaises(ValueError): @@ -945,6 +1172,13 @@ def testIPv6Tuple(self): (42540766411282592856903984951653826561, '96')), ipaddress.IPv6Interface('2001:db8::1/96')) + ip_scoped = ipaddress.IPv6Address('2001:db8::1%scope') + with self.assertRaises(ValueError): + ipaddress.IPv6Network(('2001:db8::1%scope', 96)) + with self.assertRaises(ValueError): + ipaddress.IPv6Network((ip_scoped, 96)) + # strict=False and host bits set + # issue57 def testAddressIntMath(self): self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255, @@ -955,6 +1189,10 @@ def testAddressIntMath(self): ipaddress.IPv6Address('::ffff')) self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2), ipaddress.IPv6Address('::1')) + self.assertNotEqual(ipaddress.IPv6Address('::1%scope') + (2**16 - 2), + ipaddress.IPv6Address('::ffff%scope')) + self.assertNotEqual(ipaddress.IPv6Address('::ffff%scope') - (2**16 - 2), + ipaddress.IPv6Address('::1%scope')) def testInvalidIntToBytes(self): self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1) @@ -987,6 +1225,12 @@ def testGetNetwork(self): '2001:658:22a:cafe::') self.assertEqual(str(self.ipv6_network.hostmask), '::ffff:ffff:ffff:ffff') + self.assertEqual(int(self.ipv6_scoped_network.network_address), + 42540616829182469433403647294022090752) + self.assertEqual(str(self.ipv6_scoped_network.network_address), + '2001:658:22a:cafe::%scope') + self.assertEqual(str(self.ipv6_scoped_network.hostmask), + '::ffff:ffff:ffff:ffff') def testIpFromInt(self): self.assertEqual(self.ipv4_interface._ip, @@ -994,17 +1238,23 @@ def testIpFromInt(self): ipv4 = ipaddress.ip_network('1.2.3.4') ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1') + ipv6_scoped = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1%scope') self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4.network_address))) self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6.network_address))) + self.assertNotEqual(ipv6_scoped, ipaddress.ip_network(int(ipv6_scoped.network_address))) v6_int = 42540616829182469433547762482097946625 self.assertEqual(self.ipv6_interface._ip, ipaddress.IPv6Interface(v6_int)._ip) + self.assertEqual(self.ipv6_scoped_interface._ip, + ipaddress.IPv6Interface(v6_int)._ip) self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version, 4) self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version, 6) + self.assertEqual(ipaddress.ip_network(self.ipv6_scoped_address._ip).version, + 6) def testIpFromPacked(self): address = ipaddress.ip_address @@ -1030,6 +1280,24 @@ def testGetIp(self): 42540616829182469433547762482097946625) self.assertEqual(str(self.ipv6_interface.ip), '2001:658:22a:cafe:200::1') + self.assertEqual(int(self.ipv6_scoped_interface.ip), + 42540616829182469433547762482097946625) + self.assertEqual(str(self.ipv6_scoped_interface.ip), + '2001:658:22a:cafe:200::1') + + def testGetScopeId(self): + self.assertEqual(self.ipv6_address.scope_id, + None) + self.assertEqual(str(self.ipv6_scoped_address.scope_id), + 'scope') + self.assertEqual(self.ipv6_interface.scope_id, + None) + self.assertEqual(str(self.ipv6_scoped_interface.scope_id), + 'scope') + self.assertEqual(self.ipv6_network.network_address.scope_id, + None) + self.assertEqual(str(self.ipv6_scoped_network.network_address.scope_id), + 'scope') def testGetNetmask(self): self.assertEqual(int(self.ipv4_network.netmask), 4294967040) @@ -1037,6 +1305,9 @@ def testGetNetmask(self): self.assertEqual(int(self.ipv6_network.netmask), 340282366920938463444927863358058659840) self.assertEqual(self.ipv6_network.prefixlen, 64) + self.assertEqual(int(self.ipv6_scoped_network.netmask), + 340282366920938463444927863358058659840) + self.assertEqual(self.ipv6_scoped_network.prefixlen, 64) def testZeroNetmask(self): ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0') @@ -1047,6 +1318,10 @@ def testZeroNetmask(self): self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0) self.assertEqual(ipv6_zero_netmask._prefix_from_prefix_string('0'), 0) + ipv6_scoped_zero_netmask = ipaddress.IPv6Interface('::1%scope/0') + self.assertEqual(int(ipv6_scoped_zero_netmask.network.netmask), 0) + self.assertEqual(ipv6_scoped_zero_netmask._prefix_from_prefix_string('0'), 0) + def testIPv4Net(self): net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255') self.assertEqual(net.prefixlen, 24) @@ -1060,9 +1335,15 @@ def testGetBroadcast(self): self.assertEqual(str(self.ipv6_network.broadcast_address), '2001:658:22a:cafe:ffff:ffff:ffff:ffff') + self.assertEqual(int(self.ipv6_scoped_network.broadcast_address), + 42540616829182469451850391367731642367) + self.assertEqual(str(self.ipv6_scoped_network.broadcast_address), + '2001:658:22a:cafe:ffff:ffff:ffff:ffff') + def testGetPrefixlen(self): self.assertEqual(self.ipv4_interface.network.prefixlen, 24) self.assertEqual(self.ipv6_interface.network.prefixlen, 64) + self.assertEqual(self.ipv6_scoped_interface.network.prefixlen, 64) def testGetSupernet(self): self.assertEqual(self.ipv4_network.supernet().prefixlen, 23) @@ -1077,6 +1358,9 @@ def testGetSupernet(self): '2001:658:22a:cafe::') self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(), ipaddress.IPv6Network('::0/0')) + self.assertEqual(self.ipv6_scoped_network.supernet().prefixlen, 63) + self.assertEqual(str(self.ipv6_scoped_network.supernet().network_address), + '2001:658:22a:cafe::') def testGetSupernet3(self): self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21) @@ -1086,6 +1370,9 @@ def testGetSupernet3(self): self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61) self.assertEqual(str(self.ipv6_network.supernet(3).network_address), '2001:658:22a:caf8::') + self.assertEqual(self.ipv6_scoped_network.supernet(3).prefixlen, 61) + self.assertEqual(str(self.ipv6_scoped_network.supernet(3).network_address), + '2001:658:22a:caf8::') def testGetSupernet4(self): self.assertRaises(ValueError, self.ipv4_network.supernet, @@ -1101,6 +1388,12 @@ def testGetSupernet4(self): new_prefix=65) self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2), self.ipv6_network.supernet(new_prefix=62)) + self.assertRaises(ValueError, self.ipv6_scoped_network.supernet, + prefixlen_diff=2, new_prefix=1) + self.assertRaises(ValueError, self.ipv6_scoped_network.supernet, + new_prefix=65) + self.assertEqual(self.ipv6_scoped_network.supernet(prefixlen_diff=2), + self.ipv6_scoped_network.supernet(new_prefix=62)) def testHosts(self): hosts = list(self.ipv4_network.hosts()) @@ -1114,6 +1407,12 @@ def testHosts(self): self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::1'), hosts[0]) self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::ff'), hosts[-1]) + ipv6_scoped_network = ipaddress.IPv6Network('2001:658:22a:cafe::%scope/120') + hosts = list(ipv6_scoped_network.hosts()) + self.assertEqual(255, len(hosts)) + self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::1'), hosts[0]) + self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::ff'), hosts[-1]) + # special case where only 1 bit is left for address addrs = [ipaddress.IPv4Address('2.0.0.0'), ipaddress.IPv4Address('2.0.0.1')] @@ -1124,6 +1423,15 @@ def testHosts(self): self.assertEqual(list(ipaddress.ip_network(str_args).hosts()), list(ipaddress.ip_network(tpl_args).hosts())) + # special case where the network is a /32 + addrs = [ipaddress.IPv4Address('1.2.3.4')] + str_args = '1.2.3.4/32' + tpl_args = ('1.2.3.4', 32) + self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts())) + self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts())) + self.assertEqual(list(ipaddress.ip_network(str_args).hosts()), + list(ipaddress.ip_network(tpl_args).hosts())) + addrs = [ipaddress.IPv6Address('2001:658:22a:cafe::'), ipaddress.IPv6Address('2001:658:22a:cafe::1')] str_args = '2001:658:22a:cafe::/127' @@ -1133,6 +1441,14 @@ def testHosts(self): self.assertEqual(list(ipaddress.ip_network(str_args).hosts()), list(ipaddress.ip_network(tpl_args).hosts())) + addrs = [ipaddress.IPv6Address('2001:658:22a:cafe::1'), ] + str_args = '2001:658:22a:cafe::1/128' + tpl_args = ('2001:658:22a:cafe::1', 128) + self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts())) + self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts())) + self.assertEqual(list(ipaddress.ip_network(str_args).hosts()), + list(ipaddress.ip_network(tpl_args).hosts())) + def testFancySubnetting(self): self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)), sorted(self.ipv4_network.subnets(new_prefix=27))) @@ -1148,6 +1464,13 @@ def testFancySubnetting(self): self.assertRaises(ValueError, list, self.ipv6_network.subnets(prefixlen_diff=4, new_prefix=68)) + self.assertEqual(sorted(self.ipv6_scoped_network.subnets(prefixlen_diff=4)), + sorted(self.ipv6_scoped_network.subnets(new_prefix=68))) + self.assertRaises(ValueError, list, + self.ipv6_scoped_network.subnets(new_prefix=63)) + self.assertRaises(ValueError, list, + self.ipv6_scoped_network.subnets(prefixlen_diff=4, + new_prefix=68)) def testGetSubnets(self): self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25) @@ -1159,6 +1482,7 @@ def testGetSubnets(self): '1.2.3.128') self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65) + self.assertEqual(list(self.ipv6_scoped_network.subnets())[0].prefixlen, 65) def testGetSubnetForSingle32(self): ip = ipaddress.IPv4Network('1.2.3.4/32') @@ -1174,6 +1498,12 @@ def testGetSubnetForSingle128(self): self.assertEqual(subnets1, ['::1/128']) self.assertEqual(subnets1, subnets2) + ip_scoped = ipaddress.IPv6Network('::1%scope/128') + subnets1 = [str(x) for x in ip_scoped.subnets()] + subnets2 = [str(x) for x in ip_scoped.subnets(2)] + self.assertEqual(subnets1, ['::1%scope/128']) + self.assertEqual(subnets1, subnets2) + def testSubnet2(self): ips = [str(x) for x in self.ipv4_network.subnets(2)] self.assertEqual( @@ -1217,12 +1547,18 @@ def testSubnetFailsForLargeCidrDiff(self): self.ipv6_interface.network.subnets(65)) self.assertRaises(ValueError, list, self.ipv6_network.subnets(65)) + self.assertRaises(ValueError, list, + self.ipv6_scoped_interface.network.subnets(65)) + self.assertRaises(ValueError, list, + self.ipv6_scoped_network.subnets(65)) def testSupernetFailsForLargeCidrDiff(self): self.assertRaises(ValueError, self.ipv4_interface.network.supernet, 25) self.assertRaises(ValueError, self.ipv6_interface.network.supernet, 65) + self.assertRaises(ValueError, + self.ipv6_scoped_interface.network.supernet, 65) def testSubnetFailsForNegativeCidrDiff(self): self.assertRaises(ValueError, list, @@ -1233,6 +1569,10 @@ def testSubnetFailsForNegativeCidrDiff(self): self.ipv6_interface.network.subnets(-1)) self.assertRaises(ValueError, list, self.ipv6_network.subnets(-1)) + self.assertRaises(ValueError, list, + self.ipv6_scoped_interface.network.subnets(-1)) + self.assertRaises(ValueError, list, + self.ipv6_scoped_network.subnets(-1)) def testGetNum_Addresses(self): self.assertEqual(self.ipv4_network.num_addresses, 256) @@ -1245,6 +1585,11 @@ def testGetNum_Addresses(self): 9223372036854775808) self.assertEqual(self.ipv6_network.supernet().num_addresses, 36893488147419103232) + self.assertEqual(self.ipv6_scoped_network.num_addresses, 18446744073709551616) + self.assertEqual(list(self.ipv6_scoped_network.subnets())[0].num_addresses, + 9223372036854775808) + self.assertEqual(self.ipv6_scoped_network.supernet().num_addresses, + 36893488147419103232) def testContains(self): self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'), @@ -1266,6 +1611,9 @@ def testNth(self): self.assertEqual(str(self.ipv6_network[5]), '2001:658:22a:cafe::5') self.assertRaises(IndexError, self.ipv6_network.__getitem__, 1 << 64) + self.assertEqual(str(self.ipv6_scoped_network[5]), + '2001:658:22a:cafe::5') + self.assertRaises(IndexError, self.ipv6_scoped_network.__getitem__, 1 << 64) def testGetitem(self): # http://code.google.com/p/ipaddr-py/issues/detail?id=15 @@ -1285,6 +1633,8 @@ def testEqual(self): ipaddress.IPv4Interface('1.2.3.4/23')) self.assertFalse(self.ipv4_interface == ipaddress.IPv6Interface('::1.2.3.4/24')) + self.assertFalse(self.ipv4_interface == + ipaddress.IPv6Interface('::1.2.3.4%scope/24')) self.assertFalse(self.ipv4_interface == '') self.assertFalse(self.ipv4_interface == []) self.assertFalse(self.ipv4_interface == 2) @@ -1299,6 +1649,20 @@ def testEqual(self): self.assertFalse(self.ipv6_interface == []) self.assertFalse(self.ipv6_interface == 2) + self.assertTrue(self.ipv6_scoped_interface == + ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/64')) + self.assertFalse(self.ipv6_scoped_interface == + ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/63')) + self.assertFalse(self.ipv6_scoped_interface == + ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64')) + self.assertFalse(self.ipv6_scoped_interface == + ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63')) + self.assertFalse(self.ipv6_scoped_interface == + ipaddress.IPv4Interface('1.2.3.4/23')) + self.assertFalse(self.ipv6_scoped_interface == '') + self.assertFalse(self.ipv6_scoped_interface == []) + self.assertFalse(self.ipv6_scoped_interface == 2) + def testNotEqual(self): self.assertFalse(self.ipv4_interface != ipaddress.IPv4Interface('1.2.3.4/24')) @@ -1306,6 +1670,8 @@ def testNotEqual(self): ipaddress.IPv4Interface('1.2.3.4/23')) self.assertTrue(self.ipv4_interface != ipaddress.IPv6Interface('::1.2.3.4/24')) + self.assertTrue(self.ipv4_interface != + ipaddress.IPv6Interface('::1.2.3.4%scope/24')) self.assertTrue(self.ipv4_interface != '') self.assertTrue(self.ipv4_interface != []) self.assertTrue(self.ipv4_interface != 2) @@ -1332,6 +1698,26 @@ def testNotEqual(self): self.assertTrue(self.ipv6_address != []) self.assertTrue(self.ipv6_address != 2) + self.assertFalse(self.ipv6_scoped_interface != + ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/64')) + self.assertTrue(self.ipv6_scoped_interface != + ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/63')) + self.assertTrue(self.ipv6_scoped_interface != + ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64')) + self.assertTrue(self.ipv6_scoped_interface != + ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63')) + self.assertTrue(self.ipv6_scoped_interface != + ipaddress.IPv4Interface('1.2.3.4/23')) + self.assertTrue(self.ipv6_scoped_interface != '') + self.assertTrue(self.ipv6_scoped_interface != []) + self.assertTrue(self.ipv6_scoped_interface != 2) + + self.assertTrue(self.ipv6_scoped_address != + ipaddress.IPv4Address('1.2.3.4')) + self.assertTrue(self.ipv6_scoped_address != '') + self.assertTrue(self.ipv6_scoped_address != []) + self.assertTrue(self.ipv6_scoped_address != 2) + def testSlash32Constructor(self): self.assertEqual(str(ipaddress.IPv4Interface( '1.2.3.4/255.255.255.255')), '1.2.3.4/32') @@ -1339,6 +1725,8 @@ def testSlash32Constructor(self): def testSlash128Constructor(self): self.assertEqual(str(ipaddress.IPv6Interface('::1/128')), '::1/128') + self.assertEqual(str(ipaddress.IPv6Interface('::1%scope/128')), + '::1%scope/128') def testSlash0Constructor(self): self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')), @@ -1410,6 +1798,13 @@ def testCollapsing(self): collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3]) self.assertEqual(list(collapsed), [ip3]) + ip1 = ipaddress.IPv6Network('2001::%scope/100') + ip2 = ipaddress.IPv6Network('2001::%scope/120') + ip3 = ipaddress.IPv6Network('2001::%scope/96') + # test that ipv6 addresses are subsumed properly. + collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3]) + self.assertEqual(list(collapsed), [ip3]) + # the toejam test addr_tuples = [ (ipaddress.ip_address('1.1.1.1'), @@ -1423,6 +1818,18 @@ def testCollapsing(self): self.assertRaises(TypeError, ipaddress.collapse_addresses, [ip1, ip2]) + addr_tuples = [ + (ipaddress.ip_address('1.1.1.1'), + ipaddress.ip_address('::1%scope')), + (ipaddress.IPv4Network('1.1.0.0/24'), + ipaddress.IPv6Network('2001::%scope/120')), + (ipaddress.IPv4Network('1.1.0.0/32'), + ipaddress.IPv6Network('2001::%scope/128')), + ] + for ip1, ip2 in addr_tuples: + self.assertRaises(TypeError, ipaddress.collapse_addresses, + [ip1, ip2]) + def testSummarizing(self): #ip = ipaddress.ip_address #ipnet = ipaddress.ip_network @@ -1442,6 +1849,8 @@ def version(self): # test that a summary over ip4 & ip6 fails self.assertRaises(TypeError, list, summarize(ip1, ipaddress.IPv6Address('::1'))) + self.assertRaises(TypeError, list, + summarize(ip1, ipaddress.IPv6Address('::1%scope'))) # test a /24 is summarized properly self.assertEqual(list(summarize(ip1, ip2))[0], ipaddress.ip_network('1.1.1.0/24')) @@ -1467,6 +1876,17 @@ def version(self): [ipaddress.ip_network('1::/16'), ipaddress.ip_network('2::/128')]) + ip1 = ipaddress.ip_address('1::%scope') + ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff%scope') + # test an IPv6 is summarized properly + self.assertEqual(list(summarize(ip1, ip2))[0], + ipaddress.ip_network('1::/16')) + # test an IPv6 range that isn't on a network byte boundary + ip2 = ipaddress.ip_address('2::%scope') + self.assertEqual(list(summarize(ip1, ip2)), + [ipaddress.ip_network('1::/16'), + ipaddress.ip_network('2::/128')]) + # test exception raised when first is greater than last self.assertRaises(ValueError, list, summarize(ipaddress.ip_address('1.1.1.0'), @@ -1492,6 +1912,10 @@ def testAddressComparison(self): ipaddress.ip_address('::1')) self.assertTrue(ipaddress.ip_address('::1') <= ipaddress.ip_address('::2')) + self.assertTrue(ipaddress.ip_address('::1%scope') <= + ipaddress.ip_address('::1%scope')) + self.assertTrue(ipaddress.ip_address('::1%scope') <= + ipaddress.ip_address('::2%scope')) def testInterfaceComparison(self): self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') == @@ -1524,6 +1948,52 @@ def testInterfaceComparison(self): self.assertTrue(ipaddress.ip_interface('::1/64') > ipaddress.ip_interface('::2/48')) + self.assertTrue(ipaddress.ip_interface('::1%scope/64') == + ipaddress.ip_interface('::1%scope/64')) + self.assertTrue(ipaddress.ip_interface('::1%scope/64') < + ipaddress.ip_interface('::1%scope/80')) + self.assertTrue(ipaddress.ip_interface('::1%scope/64') < + ipaddress.ip_interface('::2%scope/64')) + self.assertTrue(ipaddress.ip_interface('::2%scope/48') < + ipaddress.ip_interface('::1%scope/64')) + self.assertTrue(ipaddress.ip_interface('::1%scope/80') > + ipaddress.ip_interface('::1%scope/64')) + self.assertTrue(ipaddress.ip_interface('::2%scope/64') > + ipaddress.ip_interface('::1%scope/64')) + self.assertTrue(ipaddress.ip_interface('::1%scope/64') > + ipaddress.ip_interface('::2%scope/48')) + + + self.assertFalse(ipaddress.ip_interface('::1%scope/64') == + ipaddress.ip_interface('::1/64')) + self.assertTrue(ipaddress.ip_interface('::1%scope/64') < + ipaddress.ip_interface('::1/80')) + self.assertTrue(ipaddress.ip_interface('::1%scope/64') < + ipaddress.ip_interface('::2/64')) + self.assertTrue(ipaddress.ip_interface('::2%scope/48') < + ipaddress.ip_interface('::1/64')) + self.assertTrue(ipaddress.ip_interface('::1%scope/80') > + ipaddress.ip_interface('::1/64')) + self.assertTrue(ipaddress.ip_interface('::2%scope/64') > + ipaddress.ip_interface('::1/64')) + self.assertTrue(ipaddress.ip_interface('::1%scope/64') > + ipaddress.ip_interface('::2/48')) + + self.assertFalse(ipaddress.ip_interface('::1/64') == + ipaddress.ip_interface('::1%scope/64')) + self.assertTrue(ipaddress.ip_interface('::1/64') < + ipaddress.ip_interface('::1%scope/80')) + self.assertTrue(ipaddress.ip_interface('::1/64') < + ipaddress.ip_interface('::2%scope/64')) + self.assertTrue(ipaddress.ip_interface('::2/48') < + ipaddress.ip_interface('::1%scope/64')) + self.assertTrue(ipaddress.ip_interface('::1/80') > + ipaddress.ip_interface('::1%scope/64')) + self.assertTrue(ipaddress.ip_interface('::2/64') > + ipaddress.ip_interface('::1%scope/64')) + self.assertTrue(ipaddress.ip_interface('::1/64') > + ipaddress.ip_interface('::2%scope/48')) + def testNetworkComparison(self): # ip1 and ip2 have the same network address ip1 = ipaddress.IPv4Network('1.1.1.0/24') @@ -1603,6 +2073,7 @@ def testNetworkComparison(self): ipaddress.ip_network('1.1.1.2')) self.assertFalse(ipaddress.ip_network('1.1.1.2') <= ipaddress.ip_network('1.1.1.1')) + self.assertTrue(ipaddress.ip_network('::1') <= ipaddress.ip_network('::1')) self.assertTrue(ipaddress.ip_network('::1') <= @@ -1613,6 +2084,7 @@ def testNetworkComparison(self): def testStrictNetworks(self): self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24') self.assertRaises(ValueError, ipaddress.ip_network, '::1/120') + self.assertRaises(ValueError, ipaddress.ip_network, '::1%scope/120') def testOverlaps(self): other = ipaddress.IPv4Network('1.2.3.0/30') @@ -1641,13 +2113,28 @@ def testIPv6AddressTooLarge(self): self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'), ipaddress.ip_address('FFFF::c000:201')) + self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1%scope'), + ipaddress.ip_address('::FFFF:c000:201%scope')) + self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1%scope'), + ipaddress.ip_address('FFFF::c000:201%scope')) + self.assertNotEqual(ipaddress.ip_address('::FFFF:192.0.2.1%scope'), + ipaddress.ip_address('::FFFF:c000:201')) + self.assertNotEqual(ipaddress.ip_address('FFFF::192.0.2.1%scope'), + ipaddress.ip_address('FFFF::c000:201')) + self.assertNotEqual(ipaddress.ip_address('::FFFF:192.0.2.1'), + ipaddress.ip_address('::FFFF:c000:201%scope')) + self.assertNotEqual(ipaddress.ip_address('FFFF::192.0.2.1'), + ipaddress.ip_address('FFFF::c000:201%scope')) + def testIPVersion(self): self.assertEqual(self.ipv4_address.version, 4) self.assertEqual(self.ipv6_address.version, 6) + self.assertEqual(self.ipv6_scoped_address.version, 6) def testMaxPrefixLength(self): self.assertEqual(self.ipv4_interface.max_prefixlen, 32) self.assertEqual(self.ipv6_interface.max_prefixlen, 128) + self.assertEqual(self.ipv6_scoped_interface.max_prefixlen, 128) def testPacked(self): self.assertEqual(self.ipv4_address.packed, @@ -1662,6 +2149,14 @@ def testPacked(self): + b'\x00' * 6) self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed, b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8) + self.assertEqual(self.ipv6_scoped_address.packed, + b'\x20\x01\x06\x58\x02\x2a\xca\xfe' + b'\x02\x00\x00\x00\x00\x00\x00\x01') + self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::%scope').packed, + b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff' + + b'\x00' * 6) + self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0%scope').packed, + b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8) def testIpType(self): ipv4net = ipaddress.ip_network('1.2.3.4') diff --git a/Lib/test/test_isinstance.py b/Lib/test/test_isinstance.py index 53639e984e48a784cff38339c725ee1b9711be4e..31b38996930cc4e5d45f5ff5d39ee802fea4594f 100644 --- a/Lib/test/test_isinstance.py +++ b/Lib/test/test_isinstance.py @@ -271,6 +271,16 @@ def __bases__(self): self.assertEqual(True, issubclass(B(), int)) + def test_infinite_recursion_in_bases(self): + class X: + @property + def __bases__(self): + return self.__bases__ + + self.assertRaises(RecursionError, issubclass, X(), int) + self.assertRaises(RecursionError, issubclass, int, X()) + self.assertRaises(RecursionError, isinstance, 1, X()) + def blowstack(fxn, arg, compare_to): # Make sure that calling isinstance with a deeply nested tuple for its diff --git a/Lib/test/test_iter.py b/Lib/test/test_iter.py index 22553d5d2881e00a462ea9e0ecfc107710427942..524346939886db5c2711bcebe9c3bd816158a593 100644 --- a/Lib/test/test_iter.py +++ b/Lib/test/test_iter.py @@ -3,7 +3,7 @@ import sys import unittest from test.support import run_unittest, TESTFN, unlink, cpython_only -from test.support import check_free_after_iterating +from test.support import check_free_after_iterating, ALWAYS_EQ, NEVER_EQ import pickle import collections.abc @@ -41,6 +41,14 @@ def __init__(self, n): def __iter__(self): return BasicIterClass(self.n) +class IteratorProxyClass: + def __init__(self, i): + self.i = i + def __next__(self): + return next(self.i) + def __iter__(self): + return self + class SequenceClass: def __init__(self, n): self.n = n @@ -50,6 +58,12 @@ def __getitem__(self, i): else: raise IndexError +class SequenceProxyClass: + def __init__(self, s): + self.s = s + def __getitem__(self, i): + return self.s[i] + class UnlimitedSequenceClass: def __getitem__(self, i): return i @@ -639,6 +653,13 @@ def test_in_and_not_in(self): for i in "abc", -1, 5, 42.42, (3, 4), [], {1: 1}, 3-12j, sc5: self.assertNotIn(i, sc5) + self.assertIn(ALWAYS_EQ, IteratorProxyClass(iter([1]))) + self.assertIn(ALWAYS_EQ, SequenceProxyClass([1])) + self.assertNotIn(ALWAYS_EQ, IteratorProxyClass(iter([NEVER_EQ]))) + self.assertNotIn(ALWAYS_EQ, SequenceProxyClass([NEVER_EQ])) + self.assertIn(NEVER_EQ, IteratorProxyClass(iter([ALWAYS_EQ]))) + self.assertIn(NEVER_EQ, SequenceProxyClass([ALWAYS_EQ])) + self.assertRaises(TypeError, lambda: 3 in 12) self.assertRaises(TypeError, lambda: 3 not in map) self.assertRaises(ZeroDivisionError, lambda: 3 in BadIterableClass()) diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py index eaa6197bec395c654cd3f407c783d22db2493e8e..71012642849198542133f6238487dff06c4a3034 100644 --- a/Lib/test/test_itertools.py +++ b/Lib/test/test_itertools.py @@ -12,6 +12,8 @@ import sys import struct import threading +import gc + maxsize = support.MAX_Py_ssize_t minsize = -maxsize-1 @@ -1554,6 +1556,51 @@ def test_StopIteration(self): self.assertRaises(StopIteration, next, f(lambda x:x, [])) self.assertRaises(StopIteration, next, f(lambda x:x, StopNow())) + @support.cpython_only + def test_combinations_result_gc(self): + # bpo-42536: combinations's tuple-reuse speed trick breaks the GC's + # assumptions about what can be untracked. Make sure we re-track result + # tuples whenever we reuse them. + it = combinations([None, []], 1) + next(it) + gc.collect() + # That GC collection probably untracked the recycled internal result + # tuple, which has the value (None,). Make sure it's re-tracked when + # it's mutated and returned from __next__: + self.assertTrue(gc.is_tracked(next(it))) + + @support.cpython_only + def test_combinations_with_replacement_result_gc(self): + # Ditto for combinations_with_replacement. + it = combinations_with_replacement([None, []], 1) + next(it) + gc.collect() + self.assertTrue(gc.is_tracked(next(it))) + + @support.cpython_only + def test_permutations_result_gc(self): + # Ditto for permutations. + it = permutations([None, []], 1) + next(it) + gc.collect() + self.assertTrue(gc.is_tracked(next(it))) + + @support.cpython_only + def test_product_result_gc(self): + # Ditto for product. + it = product([None, []]) + next(it) + gc.collect() + self.assertTrue(gc.is_tracked(next(it))) + + @support.cpython_only + def test_zip_longest_result_gc(self): + # Ditto for zip_longest. + it = zip_longest([[]]) + gc.collect() + self.assertTrue(gc.is_tracked(next(it))) + + class TestExamples(unittest.TestCase): def test_accumulate(self): @@ -2290,7 +2337,7 @@ def test_permutations_sizeof(self): ... "Count how many times the predicate is true" ... return sum(map(pred, iterable)) ->>> def padnone(iterable): +>>> def pad_none(iterable): ... "Returns the sequence elements and then returns None indefinitely" ... return chain(iterable, repeat(None)) @@ -2460,7 +2507,7 @@ def test_permutations_sizeof(self): >>> list(pairwise('a')) [] ->>> list(islice(padnone('abc'), 0, 6)) +>>> list(islice(pad_none('abc'), 0, 6)) ['a', 'b', 'c', None, None, None] >>> list(ncycles('abc', 3)) diff --git a/Lib/test/test_json/test_decode.py b/Lib/test/test_json/test_decode.py index 895c95b54c3b6556dcd01536a5197270fb9e771f..fdb9e62124ece1f3c0446088d0b8fc7f130ae9bb 100644 --- a/Lib/test/test_json/test_decode.py +++ b/Lib/test/test_json/test_decode.py @@ -95,9 +95,5 @@ def test_negative_index(self): d = self.json.JSONDecoder() self.assertRaises(ValueError, d.raw_decode, 'a'*42, -50000) - def test_deprecated_encode(self): - with self.assertWarns(DeprecationWarning): - self.loads('{}', encoding='fake') - class TestPyDecode(TestDecode, PyTest): pass class TestCDecode(TestDecode, CTest): pass diff --git a/Lib/test/test_json/test_recursion.py b/Lib/test/test_json/test_recursion.py index 877dc448b14c1539c7d668ab7e39fccf04e1bb94..543c62839b2cdd98bc1bdc3b8e3fa788099aa1e2 100644 --- a/Lib/test/test_json/test_recursion.py +++ b/Lib/test/test_json/test_recursion.py @@ -52,7 +52,7 @@ def default(self, o): return [JSONTestObject] else: return 'JSONTestObject' - return pyjson.JSONEncoder.default(o) + return self.json.JSONEncoder.default(o) enc = RecursiveJSONEncoder() self.assertEqual(enc.encode(JSONTestObject), '"JSONTestObject"') diff --git a/Lib/test/test_json/test_tool.py b/Lib/test/test_json/test_tool.py index a62a5d4084a23cb0329a9bb219e3ed42bd9a4f89..fc2a7a4fca3c5a3f4769ed86e961a364f43b6368 100644 --- a/Lib/test/test_json/test_tool.py +++ b/Lib/test/test_json/test_tool.py @@ -3,8 +3,8 @@ import sys import textwrap import unittest +import subprocess -from subprocess import Popen, PIPE from test import support from test.support.script_helper import assert_python_ok @@ -86,10 +86,9 @@ class TestTool(unittest.TestCase): def test_stdin_stdout(self): args = sys.executable, '-m', 'json.tool' - with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: - out, err = proc.communicate(self.data.encode()) - self.assertEqual(out.splitlines(), self.expect.encode().splitlines()) - self.assertEqual(err, b'') + process = subprocess.run(args, input=self.data, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, self.expect) + self.assertEqual(process.stderr, '') def _create_infile(self, data=None): infile = support.TESTFN @@ -133,10 +132,9 @@ def test_infile_outfile(self): def test_jsonlines(self): args = sys.executable, '-m', 'json.tool', '--json-lines' - with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: - out, err = proc.communicate(self.jsonlines_raw.encode()) - self.assertEqual(out.splitlines(), self.jsonlines_expect.encode().splitlines()) - self.assertEqual(err, b'') + process = subprocess.run(args, input=self.jsonlines_raw, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, self.jsonlines_expect) + self.assertEqual(process.stderr, '') def test_help_flag(self): rc, out, err = assert_python_ok('-m', 'json.tool', '-h') @@ -152,10 +150,71 @@ def test_sort_keys_flag(self): self.expect_without_sort_keys.encode().splitlines()) self.assertEqual(err, b'') + def test_indent(self): + input_ = '[1, 2]' + expect = textwrap.dedent('''\ + [ + 1, + 2 + ] + ''') + args = sys.executable, '-m', 'json.tool', '--indent', '2' + process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, expect) + self.assertEqual(process.stderr, '') + + def test_no_indent(self): + input_ = '[1,\n2]' + expect = '[1, 2]\n' + args = sys.executable, '-m', 'json.tool', '--no-indent' + process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, expect) + self.assertEqual(process.stderr, '') + + def test_tab(self): + input_ = '[1, 2]' + expect = '[\n\t1,\n\t2\n]\n' + args = sys.executable, '-m', 'json.tool', '--tab' + process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, expect) + self.assertEqual(process.stderr, '') + + def test_compact(self): + input_ = '[ 1 ,\n 2]' + expect = '[1,2]\n' + args = sys.executable, '-m', 'json.tool', '--compact' + process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, expect) + self.assertEqual(process.stderr, '') + + def test_no_ensure_ascii_flag(self): + infile = self._create_infile('{"key":"💩"}') + outfile = support.TESTFN + '.out' + self.addCleanup(os.remove, outfile) + assert_python_ok('-m', 'json.tool', '--no-ensure-ascii', infile, outfile) + with open(outfile, "rb") as f: + lines = f.read().splitlines() + # asserting utf-8 encoded output file + expected = [b'{', b' "key": "\xf0\x9f\x92\xa9"', b"}"] + self.assertEqual(lines, expected) + + def test_ensure_ascii_default(self): + infile = self._create_infile('{"key":"💩"}') + outfile = support.TESTFN + '.out' + self.addCleanup(os.remove, outfile) + assert_python_ok('-m', 'json.tool', infile, outfile) + with open(outfile, "rb") as f: + lines = f.read().splitlines() + # asserting an ascii encoded output file + expected = [b'{', rb' "key": "\ud83d\udca9"', b"}"] + self.assertEqual(lines, expected) + @unittest.skipIf(sys.platform =="win32", "The test is failed with ValueError on Windows") def test_broken_pipe_error(self): cmd = [sys.executable, '-m', 'json.tool'] - proc = Popen(cmd, stdout=PIPE, stdin=PIPE) + proc = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stdin=subprocess.PIPE) # bpo-39828: Closing before json.tool attempts to write into stdout. proc.stdout.close() proc.communicate(b'"{}"') diff --git a/Lib/test/test_keyword.py b/Lib/test/test_keyword.py index 3e2a8b3fb7f4c3bfd1948f5278593545e81226c4..e1042cf18217c3bb91dc7a27981f0c6ffc3bc0e8 100644 --- a/Lib/test/test_keyword.py +++ b/Lib/test/test_keyword.py @@ -1,5 +1,6 @@ import keyword import unittest +from test.support import use_old_parser class Test_iskeyword(unittest.TestCase): @@ -21,7 +22,10 @@ def test_changing_the_kwlist_does_not_affect_iskeyword(self): self.assertFalse(keyword.iskeyword('eggs')) def test_all_keywords_fail_to_be_used_as_names(self): - for key in keyword.kwlist: + all_keywords = set(keyword.kwlist) + if use_old_parser(): + all_keywords.discard('__peg_parser__') + for key in all_keywords: with self.assertRaises(SyntaxError): exec(f"{key} = 42") diff --git a/Lib/test/test_largefile.py b/Lib/test/test_largefile.py index 8870c721ab0efb815009399673600da7ddc441cf..a99b4ba89acbf1e566274d8fb4464bf1027157f4 100644 --- a/Lib/test/test_largefile.py +++ b/Lib/test/test_largefile.py @@ -5,17 +5,21 @@ import stat import sys import unittest +import socket +import shutil +import threading from test.support import TESTFN, requires, unlink, bigmemtest +from test.support import SHORT_TIMEOUT +from test.support import socket_helper import io # C implementation of io import _pyio as pyio # Python implementation of io # size of file to create (>2 GiB; 2 GiB == 2,147,483,648 bytes) size = 2_500_000_000 +TESTFN2 = TESTFN + '2' + class LargeFileTest: - """Test that each file function works as expected for large - (i.e. > 2 GiB) files. - """ def setUp(self): if os.path.exists(TESTFN): @@ -44,6 +48,13 @@ def tearDownClass(cls): if not os.stat(TESTFN)[stat.ST_SIZE] == 0: raise cls.failureException('File was not truncated by opening ' 'with mode "wb"') + unlink(TESTFN2) + + +class TestFileMethods(LargeFileTest): + """Test that each file function works as expected for large + (i.e. > 2 GiB) files. + """ # _pyio.FileIO.readall() uses a temporary bytearray then casted to bytes, # so memuse=2 is needed @@ -140,6 +151,91 @@ def test_seekable(self): f.seek(pos) self.assertTrue(f.seekable()) + +def skip_no_disk_space(path, required): + def decorator(fun): + def wrapper(*args, **kwargs): + if shutil.disk_usage(os.path.realpath(path)).free < required: + hsize = int(required / 1024 / 1024) + raise unittest.SkipTest( + f"required {hsize} MiB of free disk space") + return fun(*args, **kwargs) + return wrapper + return decorator + + +class TestCopyfile(LargeFileTest, unittest.TestCase): + open = staticmethod(io.open) + + # Exact required disk space would be (size * 2), but let's give it a + # bit more tolerance. + @skip_no_disk_space(TESTFN, size * 2.5) + def test_it(self): + # Internally shutil.copyfile() can use "fast copy" methods like + # os.sendfile(). + size = os.path.getsize(TESTFN) + shutil.copyfile(TESTFN, TESTFN2) + self.assertEqual(os.path.getsize(TESTFN2), size) + with open(TESTFN2, 'rb') as f: + self.assertEqual(f.read(5), b'z\x00\x00\x00\x00') + f.seek(size - 5) + self.assertEqual(f.read(), b'\x00\x00\x00\x00a') + + +@unittest.skipIf(not hasattr(os, 'sendfile'), 'sendfile not supported') +class TestSocketSendfile(LargeFileTest, unittest.TestCase): + open = staticmethod(io.open) + timeout = SHORT_TIMEOUT + + def setUp(self): + super().setUp() + self.thread = None + + def tearDown(self): + super().tearDown() + if self.thread is not None: + self.thread.join(self.timeout) + self.thread = None + + def tcp_server(self, sock): + def run(sock): + with sock: + conn, _ = sock.accept() + conn.settimeout(self.timeout) + with conn, open(TESTFN2, 'wb') as f: + event.wait(self.timeout) + while True: + chunk = conn.recv(65536) + if not chunk: + return + f.write(chunk) + + event = threading.Event() + sock.settimeout(self.timeout) + self.thread = threading.Thread(target=run, args=(sock, )) + self.thread.start() + event.set() + + # Exact required disk space would be (size * 2), but let's give it a + # bit more tolerance. + @skip_no_disk_space(TESTFN, size * 2.5) + def test_it(self): + port = socket_helper.find_unused_port() + with socket.create_server(("", port)) as sock: + self.tcp_server(sock) + with socket.create_connection(("127.0.0.1", port)) as client: + with open(TESTFN, 'rb') as f: + client.sendfile(f) + self.tearDown() + + size = os.path.getsize(TESTFN) + self.assertEqual(os.path.getsize(TESTFN2), size) + with open(TESTFN2, 'rb') as f: + self.assertEqual(f.read(5), b'z\x00\x00\x00\x00') + f.seek(size - 5) + self.assertEqual(f.read(), b'\x00\x00\x00\x00a') + + def setUpModule(): try: import signal @@ -176,14 +272,18 @@ def setUpModule(): unlink(TESTFN) -class CLargeFileTest(LargeFileTest, unittest.TestCase): +class CLargeFileTest(TestFileMethods, unittest.TestCase): open = staticmethod(io.open) -class PyLargeFileTest(LargeFileTest, unittest.TestCase): + +class PyLargeFileTest(TestFileMethods, unittest.TestCase): open = staticmethod(pyio.open) + def tearDownModule(): unlink(TESTFN) + unlink(TESTFN2) + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_lib2to3.py b/Lib/test/test_lib2to3.py index 5eaa5164d490a7b0c9f3d3e8d0e3a48da21a8f50..e939d47336e365739faa942061ead06a7eaa67a9 100644 --- a/Lib/test/test_lib2to3.py +++ b/Lib/test/test_lib2to3.py @@ -1,5 +1,8 @@ -from lib2to3.tests import load_tests import unittest +from test.support import check_warnings, import_fresh_module + +with check_warnings(("", PendingDeprecationWarning)): + load_tests = import_fresh_module('lib2to3.tests', fresh=['lib2to3']).load_tests if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_list.py b/Lib/test/test_list.py index 105ef650eee99e9d2686b4372298963b8fdb59c3..3c8d82958fd7c88c00acbbb961f2bdad77b1483e 100644 --- a/Lib/test/test_list.py +++ b/Lib/test/test_list.py @@ -150,6 +150,11 @@ def test_reversed_pickle(self): a[:] = data self.assertEqual(list(it), []) + def test_step_overflow(self): + a = [0, 1, 2, 3, 4] + a[1::sys.maxsize] = [0] + self.assertEqual(a[3::sys.maxsize], [3]) + def test_no_comdat_folding(self): # Issue 8847: In the PGO build, the MSVC linker's COMDAT folding # optimization causes failures in code that relies on distinct diff --git a/Lib/test/test_listcomps.py b/Lib/test/test_listcomps.py index ddb169fe58957c22e38593ee69acc8663024838d..62b3319ad936d7127cc970da61f73d208e5de7e5 100644 --- a/Lib/test/test_listcomps.py +++ b/Lib/test/test_listcomps.py @@ -16,6 +16,22 @@ >>> [(i,j) for i in range(4) for j in range(i)] [(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2)] +Test the idiom for temporary variable assignment in comprehensions. + + >>> [j*j for i in range(4) for j in [i+1]] + [1, 4, 9, 16] + >>> [j*k for i in range(4) for j in [i+1] for k in [j+1]] + [2, 6, 12, 20] + >>> [j*k for i in range(4) for j, k in [(i+1, i+2)]] + [2, 6, 12, 20] + +Not assignment + + >>> [i*i for i in [*range(4)]] + [0, 1, 4, 9] + >>> [i*i for i in (*range(4),)] + [0, 1, 4, 9] + Make sure the induction variable is not exposed >>> i = 20 diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py index c5d8e269d631834d67e54189269ee2d1c2e7af2e..2863d200e25c2eb97407f462f79790bbc356e0ae 100644 --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -334,8 +334,7 @@ def test_currency(self): euro = '\u20ac' self._test_currency(50000, "50000,00 " + euro) self._test_currency(50000, "50 000,00 " + euro, grouping=True) - # XXX is the trailing space a bug? - self._test_currency(50000, "50 000,00 EUR ", + self._test_currency(50000, "50 000,00 EUR", grouping=True, international=True) diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 09b273bf1fb2ddc836a5a4ae3fa862a80ac55b22..a6cd291c9a553647b2175416884130d48e596c7f 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -1,4 +1,4 @@ -# Copyright 2001-2017 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2019 by Vinay Sajip. All Rights Reserved. # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, @@ -16,7 +16,7 @@ """Test harness for the logging module. Run all tests. -Copyright (C) 2001-2017 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2019 Vinay Sajip. All Rights Reserved. """ import logging @@ -36,13 +36,14 @@ import queue import random import re -import signal import socket import struct import sys import tempfile from test.support.script_helper import assert_python_ok, assert_python_failure from test import support +from test.support import socket_helper +from test.support.logging_helper import TestHandler import textwrap import threading import time @@ -727,30 +728,19 @@ def lock_holder_thread_fn(): locks_held__ready_to_fork.wait() pid = os.fork() - if pid == 0: # Child. + if pid == 0: + # Child process try: test_logger.info(r'Child process did not deadlock. \o/') finally: os._exit(0) - else: # Parent. + else: + # Parent process test_logger.info(r'Parent process returned from fork. \o/') fork_happened__release_locks_and_end_thread.set() lock_holder_thread.join() - start_time = time.monotonic() - while True: - test_logger.debug('Waiting for child process.') - waited_pid, status = os.waitpid(pid, os.WNOHANG) - if waited_pid == pid: - break # child process exited. - if time.monotonic() - start_time > 7: - break # so long? implies child deadlock. - time.sleep(0.05) - test_logger.debug('Done waiting.') - if waited_pid != pid: - os.kill(pid, signal.SIGKILL) - waited_pid, status = os.waitpid(pid, 0) - self.fail("child process deadlocked.") - self.assertEqual(status, 0, msg="child process error") + + support.wait_process(pid, exitcode=0) class BadStream(object): @@ -869,16 +859,13 @@ def serve_forever(self, poll_interval): """ asyncore.loop(poll_interval, map=self._map) - def stop(self, timeout=None): + def stop(self): """ Stop the thread by closing the server instance. Wait for the server thread to terminate. - - :param timeout: How long to wait for the server thread - to terminate. """ self.close() - support.join_thread(self._thread, timeout) + support.join_thread(self._thread) self._thread = None asyncore.close_all(map=self._map, ignore_all=True) @@ -922,16 +909,13 @@ def serve_forever(self, poll_interval): self.ready.set() super(ControlMixin, self).serve_forever(poll_interval) - def stop(self, timeout=None): + def stop(self): """ Tell the server thread to stop, and wait for it to do so. - - :param timeout: How long to wait for the server thread - to terminate. """ self.shutdown() if self._thread is not None: - support.join_thread(self._thread, timeout) + support.join_thread(self._thread) self._thread = None self.server_close() self.ready.clear() @@ -1065,15 +1049,15 @@ class TestUnixDatagramServer(TestUDPServer): # - end of server_helper section class SMTPHandlerTest(BaseTest): - # bpo-14314, bpo-19665, bpo-34092: don't wait forever, timeout of 1 minute - TIMEOUT = 60.0 + # bpo-14314, bpo-19665, bpo-34092: don't wait forever + TIMEOUT = support.LONG_TIMEOUT def test_basic(self): sockmap = {} - server = TestSMTPServer((support.HOST, 0), self.process_message, 0.001, + server = TestSMTPServer((socket_helper.HOST, 0), self.process_message, 0.001, sockmap) server.start() - addr = (support.HOST, server.port) + addr = (socket_helper.HOST, server.port) h = logging.handlers.SMTPHandler(addr, 'me', 'you', 'Log', timeout=self.TIMEOUT) self.assertEqual(h.toaddrs, ['you']) @@ -1173,6 +1157,32 @@ def test_flush_on_close(self): # assert that no new lines have been added self.assert_log_lines(lines) # no change + def test_race_between_set_target_and_flush(self): + class MockRaceConditionHandler: + def __init__(self, mem_hdlr): + self.mem_hdlr = mem_hdlr + self.threads = [] + + def removeTarget(self): + self.mem_hdlr.setTarget(None) + + def handle(self, msg): + thread = threading.Thread(target=self.removeTarget) + self.threads.append(thread) + thread.start() + + target = MockRaceConditionHandler(self.mem_hdlr) + try: + self.mem_hdlr.setTarget(target) + + for _ in range(10): + time.sleep(0.005) + self.mem_logger.info("not flushed") + self.mem_logger.warning("flushed") + finally: + for thread in target.threads: + support.join_thread(thread) + class ExceptionFormatter(logging.Formatter): """A special exception formatter.""" @@ -1591,6 +1601,30 @@ def test_logger_disabling(self): self.apply_config(self.disable_test, disable_existing_loggers=False) self.assertFalse(logger.disabled) + def test_config_set_handler_names(self): + test_config = """ + [loggers] + keys=root + + [handlers] + keys=hand1 + + [formatters] + keys=form1 + + [logger_root] + handlers=hand1 + + [handler_hand1] + class=StreamHandler + formatter=form1 + + [formatter_form1] + format=%(levelname)s ++ %(message)s + """ + self.apply_config(test_config) + self.assertEqual(logging.getLogger().handlers[0].name, 'hand1') + def test_defaults_do_no_interpolation(self): """bpo-33802 defaults should not get interpolated""" ini = textwrap.dedent(""" @@ -1675,7 +1709,7 @@ def tearDown(self): self.root_logger.removeHandler(self.sock_hdlr) self.sock_hdlr.close() if self.server: - self.server.stop(2.0) + self.server.stop() finally: BaseTest.tearDown(self) @@ -1712,7 +1746,7 @@ def test_noserver(self): # one-second timeout on socket.create_connection() (issue #16264). self.sock_hdlr.retryStart = 2.5 # Kill the server - self.server.stop(2.0) + self.server.stop() # The logging call should try to connect, which should fail try: raise RuntimeError('Deliberate mistake') @@ -1786,7 +1820,7 @@ def tearDown(self): """Shutdown the UDP server.""" try: if self.server: - self.server.stop(2.0) + self.server.stop() if self.sock_hdlr: self.root_logger.removeHandler(self.sock_hdlr) self.sock_hdlr.close() @@ -1867,7 +1901,7 @@ def tearDown(self): """Shutdown the server.""" try: if self.server: - self.server.stop(2.0) + self.server.stop() if self.sl_hdlr: self.root_logger.removeHandler(self.sl_hdlr) self.sl_hdlr.close() @@ -1914,7 +1948,7 @@ def tearDown(self): SysLogHandlerTest.tearDown(self) support.unlink(self.address) -@unittest.skipUnless(support.IPV6_ENABLED, +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 support required for this test.') class IPv6SysLogHandlerTest(SysLogHandlerTest): @@ -2004,7 +2038,7 @@ def test_output(self): self.assertEqual(d['funcName'], ['test_output']) self.assertEqual(d['msg'], [msg]) - self.server.stop(2.0) + self.server.stop() self.root_logger.removeHandler(self.h_hdlr) self.h_hdlr.close() @@ -3204,7 +3238,7 @@ def setup_via_listener(self, text, verify=None): finally: t.ready.wait(2.0) logging.config.stopListening() - support.join_thread(t, 2.0) + support.join_thread(t) def test_listen_config_10_ok(self): with support.captured_stdout() as output: @@ -3516,7 +3550,7 @@ def test_formatting(self): @unittest.skipUnless(hasattr(logging.handlers, 'QueueListener'), 'logging.handlers.QueueListener required for this test') def test_queue_listener(self): - handler = support.TestHandler(support.Matcher()) + handler = TestHandler(support.Matcher()) listener = logging.handlers.QueueListener(self.queue, handler) listener.start() try: @@ -3532,7 +3566,7 @@ def test_queue_listener(self): # Now test with respect_handler_level set - handler = support.TestHandler(support.Matcher()) + handler = TestHandler(support.Matcher()) handler.setLevel(logging.CRITICAL) listener = logging.handlers.QueueListener(self.queue, handler, respect_handler_level=True) @@ -3934,6 +3968,19 @@ def test_time(self): f.format(r) self.assertEqual(r.asctime, '1993-04-21 08:03:00,123') + def test_default_msec_format_none(self): + class NoMsecFormatter(logging.Formatter): + default_msec_format = None + default_time_format = '%d/%m/%Y %H:%M:%S' + + r = self.get_record() + dt = datetime.datetime(1993, 4, 21, 8, 3, 0, 123, utc) + r.created = time.mktime(dt.astimezone(None).timetuple()) + f = NoMsecFormatter() + f.converter = time.gmtime + self.assertEqual(f.formatTime(r), '21/04/1993 08:03:00') + + class TestBufferingFormatter(logging.BufferingFormatter): def formatHeader(self, records): return '[(%d)' % len(records) @@ -4144,6 +4191,15 @@ def test_disable(self): logging.disable(83) self.assertEqual(logging.root.manager.disable, 83) + self.assertRaises(ValueError, logging.disable, "doesnotexists") + + class _NotAnIntOrString: + pass + + self.assertRaises(TypeError, logging.disable, _NotAnIntOrString()) + + logging.disable("WARN") + # test the default value introduced in 3.7 # (Issue #28524) logging.disable() @@ -4234,7 +4290,6 @@ def __init__(self, name='MyLogger', level=logging.NOTSET): h.close() logging.setLoggerClass(logging.Logger) - @support.requires_type_collecting def test_logging_at_shutdown(self): # Issue #20037 code = """if 1: @@ -4507,6 +4562,99 @@ def test_force(self): self.assertEqual(new_string_io.getvalue().strip(), 'WARNING:root:warn\nINFO:root:info') + def test_encoding(self): + try: + encoding = 'utf-8' + logging.basicConfig(filename='test.log', encoding=encoding, + errors='strict', + format='%(message)s', level=logging.DEBUG) + + self.assertEqual(len(logging.root.handlers), 1) + handler = logging.root.handlers[0] + self.assertIsInstance(handler, logging.FileHandler) + self.assertEqual(handler.encoding, encoding) + logging.debug('The Øresund Bridge joins Copenhagen to Malmö') + finally: + handler.close() + with open('test.log', encoding='utf-8') as f: + data = f.read().strip() + os.remove('test.log') + self.assertEqual(data, + 'The Øresund Bridge joins Copenhagen to Malmö') + + def test_encoding_errors(self): + try: + encoding = 'ascii' + logging.basicConfig(filename='test.log', encoding=encoding, + errors='ignore', + format='%(message)s', level=logging.DEBUG) + + self.assertEqual(len(logging.root.handlers), 1) + handler = logging.root.handlers[0] + self.assertIsInstance(handler, logging.FileHandler) + self.assertEqual(handler.encoding, encoding) + logging.debug('The Øresund Bridge joins Copenhagen to Malmö') + finally: + handler.close() + with open('test.log', encoding='utf-8') as f: + data = f.read().strip() + os.remove('test.log') + self.assertEqual(data, 'The resund Bridge joins Copenhagen to Malm') + + def test_encoding_errors_default(self): + try: + encoding = 'ascii' + logging.basicConfig(filename='test.log', encoding=encoding, + format='%(message)s', level=logging.DEBUG) + + self.assertEqual(len(logging.root.handlers), 1) + handler = logging.root.handlers[0] + self.assertIsInstance(handler, logging.FileHandler) + self.assertEqual(handler.encoding, encoding) + self.assertEqual(handler.errors, 'backslashreplace') + logging.debug('😂: ☃️: The Øresund Bridge joins Copenhagen to Malmö') + finally: + handler.close() + with open('test.log', encoding='utf-8') as f: + data = f.read().strip() + os.remove('test.log') + self.assertEqual(data, r'\U0001f602: \u2603\ufe0f: The \xd8resund ' + r'Bridge joins Copenhagen to Malm\xf6') + + def test_encoding_errors_none(self): + # Specifying None should behave as 'strict' + try: + encoding = 'ascii' + logging.basicConfig(filename='test.log', encoding=encoding, + errors=None, + format='%(message)s', level=logging.DEBUG) + + self.assertEqual(len(logging.root.handlers), 1) + handler = logging.root.handlers[0] + self.assertIsInstance(handler, logging.FileHandler) + self.assertEqual(handler.encoding, encoding) + self.assertIsNone(handler.errors) + + message = [] + + def dummy_handle_error(record): + _, v, _ = sys.exc_info() + message.append(str(v)) + + handler.handleError = dummy_handle_error + logging.debug('The Øresund Bridge joins Copenhagen to Malmö') + self.assertTrue(message) + self.assertIn("'ascii' codec can't encode " + "character '\\xd8' in position 4:", message[0]) + finally: + handler.close() + with open('test.log', encoding='utf-8') as f: + data = f.read().strip() + os.remove('test.log') + # didn't write anything due to the encoding error + self.assertEqual(data, r'') + + def _test_log(self, method, level=None): # logging.root has no handlers so basicConfig should be called called = [] @@ -4794,6 +4942,7 @@ def test_root_logger_aliases(self): self.assertIs(root, logging.root) self.assertIs(root, logging.getLogger(None)) self.assertIs(root, logging.getLogger('')) + self.assertIs(root, logging.getLogger('root')) self.assertIs(root, logging.getLogger('foo').root) self.assertIs(root, logging.getLogger('foo.bar').root) self.assertIs(root, logging.getLogger('foo').parent) @@ -4943,7 +5092,26 @@ def namer(name): self.assertFalse(os.path.exists(namer(self.fn + ".3"))) rh.close() - @support.requires_zlib + def test_namer_rotator_inheritance(self): + class HandlerWithNamerAndRotator(logging.handlers.RotatingFileHandler): + def namer(self, name): + return name + ".test" + + def rotator(self, source, dest): + if os.path.exists(source): + os.rename(source, dest + ".rotated") + + rh = HandlerWithNamerAndRotator( + self.fn, backupCount=2, maxBytes=1) + self.assertEqual(rh.namer(self.fn), self.fn + ".test") + rh.emit(self.next_rec()) + self.assertLogFile(self.fn) + rh.emit(self.next_rec()) + self.assertLogFile(rh.namer(self.fn + ".1") + ".rotated") + self.assertFalse(os.path.exists(rh.namer(self.fn + ".1"))) + rh.close() + + @support.requires_zlib() def test_rotator(self): def namer(name): return name + ".gz" diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py index 53101b3badb36d682db79d90bf7aaa1eec2951ce..7ce37e8dbd6c7ee4feb2fdf4bf776ae7fa9cf28f 100644 --- a/Lib/test/test_long.py +++ b/Lib/test/test_long.py @@ -956,6 +956,14 @@ def test_huge_rshift_of_huge(self, size): self.assertEqual(huge >> (sys.maxsize + 1), (1 << 499) + 5) self.assertEqual(huge >> (sys.maxsize + 1000), 0) + @support.cpython_only + def test_small_ints_in_huge_calculation(self): + a = 2 ** 100 + b = -a + 1 + c = a + 1 + self.assertIs(a + b, 1) + self.assertIs(c - a, 1) + def test_small_ints(self): for i in range(-5, 257): self.assertIs(i, i + 0) diff --git a/Lib/test/test_lzma.py b/Lib/test/test_lzma.py index f24ed3ca3d439014ca84fecce0606400a1ce03f9..0f3af27efa909cd746bcc5a2e2377ddb0ad3bcd0 100644 --- a/Lib/test/test_lzma.py +++ b/Lib/test/test_lzma.py @@ -350,7 +350,7 @@ def test_compressor_bigmem(self, size): def test_decompressor_bigmem(self, size): lzd = LZMADecompressor() blocksize = 10 * 1024 * 1024 - block = random.getrandbits(blocksize * 8).to_bytes(blocksize, "little") + block = random.randbytes(blocksize) try: input = block * (size // blocksize + 1) cdata = lzma.compress(input) diff --git a/Lib/test/test_mailbox.py b/Lib/test/test_mailbox.py index effac97d8f9a9bfcaf3d6fa18048d1ffc9d9bf03..6f891d413cd8f1533ba719cf27d268e0d323b45c 100644 --- a/Lib/test/test_mailbox.py +++ b/Lib/test/test_mailbox.py @@ -1092,7 +1092,7 @@ def test_lock_conflict(self): # Signal the child it can now release the lock and exit. p.send(b'p') # Wait for child to exit. Locking should now succeed. - exited_pid, status = os.waitpid(pid, 0) + support.wait_process(pid, exitcode=0) self._box.lock() self._box.unlock() @@ -1420,7 +1420,7 @@ def test_initialize_incorrectly(self): # Initialize with invalid argument self.assertRaises(TypeError, lambda: self._factory(object())) - def test_all_eMM_attribues_exist(self): + def test_all_eMM_attributes_exist(self): # Issue 12537 eMM = email.message_from_string(_sample_message) msg = self._factory(_sample_message) diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 4a1ba830c98d6428367b858c1f35638a26e76c1e..4b848a5e7e5f85107c9a42c2415182475407b7e9 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -53,30 +53,6 @@ def to_ulps(x): return n -def ulp(x): - """Return the value of the least significant bit of a - float x, such that the first float bigger than x is x+ulp(x). - Then, given an expected result x and a tolerance of n ulps, - the result y should be such that abs(y-x) <= n * ulp(x). - The results from this function will only make sense on platforms - where native doubles are represented in IEEE 754 binary64 format. - """ - x = abs(float(x)) - if math.isnan(x) or math.isinf(x): - return x - - # Find next float up from x. - n = struct.unpack('>> Another way. diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py index 70965854ed1b1ccfb87ea6e6a3baf04395268be1..1663b1f1143ddcb8776193962f551c5a4b2f1236 100644 --- a/Lib/test/test_minidom.py +++ b/Lib/test/test_minidom.py @@ -1152,6 +1152,22 @@ def testEncodings(self): doc.unlink() + def testStandalone(self): + doc = parseString('') + self.assertEqual(doc.toxml(), + '\u20ac') + self.assertEqual(doc.toxml(standalone=None), + '\u20ac') + self.assertEqual(doc.toxml(standalone=True), + '\u20ac') + self.assertEqual(doc.toxml(standalone=False), + '\u20ac') + self.assertEqual(doc.toxml('utf-8', True), + b'' + b'\xe2\x82\xac') + + doc.unlink() + class UserDataHandler: called = 0 def handle(self, operation, key, data, src, dst): diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py index 88c501d81a07f9a21df86965d98be72db62efad6..5400f25f50800b672d1ef8e215539b866a1126da 100644 --- a/Lib/test/test_mmap.py +++ b/Lib/test/test_mmap.py @@ -740,6 +740,42 @@ def test_flush_return_value(self): # See bpo-34754 for details. self.assertRaises(OSError, mm.flush, 1, len(b'python')) + def test_repr(self): + open_mmap_repr_pat = re.compile( + r"\S+), " + r"length=(?P\d+), " + r"pos=(?P\d+), " + r"offset=(?P\d+)>") + closed_mmap_repr_pat = re.compile(r"") + mapsizes = (50, 100, 1_000, 1_000_000, 10_000_000) + offsets = tuple((mapsize // 2 // mmap.ALLOCATIONGRANULARITY) + * mmap.ALLOCATIONGRANULARITY for mapsize in mapsizes) + for offset, mapsize in zip(offsets, mapsizes): + data = b'a' * mapsize + length = mapsize - offset + accesses = ('ACCESS_DEFAULT', 'ACCESS_READ', + 'ACCESS_COPY', 'ACCESS_WRITE') + positions = (0, length//10, length//5, length//4) + with open(TESTFN, "wb+") as fp: + fp.write(data) + fp.flush() + for access, pos in itertools.product(accesses, positions): + accint = getattr(mmap, access) + with mmap.mmap(fp.fileno(), + length, + access=accint, + offset=offset) as mm: + mm.seek(pos) + match = open_mmap_repr_pat.match(repr(mm)) + self.assertIsNotNone(match) + self.assertEqual(match.group('access'), access) + self.assertEqual(match.group('length'), str(length)) + self.assertEqual(match.group('pos'), str(pos)) + self.assertEqual(match.group('offset'), str(offset)) + match = closed_mmap_repr_pat.match(repr(mm)) + self.assertIsNotNone(match) + @unittest.skipUnless(hasattr(mmap.mmap, 'madvise'), 'needs madvise') def test_madvise(self): size = 2 * PAGESIZE diff --git a/Lib/test/test_module.py b/Lib/test/test_module.py index efe9a8ed5e57170c5fc3afeeb610df2192995faa..1d44563579fd2f31a2771eca18e481d9d440ef83 100644 --- a/Lib/test/test_module.py +++ b/Lib/test/test_module.py @@ -1,7 +1,7 @@ # Test the module type import unittest import weakref -from test.support import gc_collect, requires_type_collecting +from test.support import gc_collect from test.support.script_helper import assert_python_ok import sys @@ -101,7 +101,6 @@ def f(): gc_collect() self.assertEqual(f().__dict__["bar"], 4) - @requires_type_collecting def test_clear_dict_in_ref_cycle(self): destroyed = [] m = ModuleType("foo") @@ -266,7 +265,6 @@ def test_module_repr_source(self): self.assertEqual(r[-len(ends_with):], ends_with, '{!r} does not end with {!r}'.format(r, ends_with)) - @requires_type_collecting def test_module_finalization_at_shutdown(self): # Module globals and builtins should still be available during shutdown rc, out, err = assert_python_ok("-c", "from test import final_a") diff --git a/Lib/test/test_msilib.py b/Lib/test/test_msilib.py index 153a8ac05e5609460ae0ae05019bfb27b6cb4982..4a233c3784e51473706f5deef0f4ed3f7530cc6b 100644 --- a/Lib/test/test_msilib.py +++ b/Lib/test/test_msilib.py @@ -1,13 +1,13 @@ """ Test suite for the code in msilib """ import os import unittest -from test.support import TESTFN, FS_NONASCII, import_module, unlink +from test.support import TESTFN, import_module, unlink msilib = import_module('msilib') import msilib.schema def init_database(): - path = TESTFN + (FS_NONASCII or '') + '.msi' + path = TESTFN + '.msi' db = msilib.init_database( path, msilib.schema, diff --git a/Lib/test/test_named_expressions.py b/Lib/test/test_named_expressions.py index 3ae557f78d273a31ab03dffc05d53a8e4f24eee4..2adcd4b5d64666189a596492a01c7cb8a1c84c30 100644 --- a/Lib/test/test_named_expressions.py +++ b/Lib/test/test_named_expressions.py @@ -1,4 +1,3 @@ -import os import unittest GLOBAL_VAR = None @@ -114,7 +113,7 @@ def test_named_expression_invalid_in_class_body(self): "assignment expression within a comprehension cannot be used in a class body"): exec(code, {}, {}) - def test_named_expression_invalid_rebinding_comprehension_iteration_variable(self): + def test_named_expression_invalid_rebinding_list_comprehension_iteration_variable(self): cases = [ ("Local reuse", 'i', "[i := 0 for i in range(5)]"), ("Nested reuse", 'j', "[[(j := 0) for i in range(5)] for j in range(5)]"), @@ -131,7 +130,7 @@ def test_named_expression_invalid_rebinding_comprehension_iteration_variable(sel with self.assertRaisesRegex(SyntaxError, msg): exec(code, {}, {}) - def test_named_expression_invalid_rebinding_comprehension_inner_loop(self): + def test_named_expression_invalid_rebinding_list_comprehension_inner_loop(self): cases = [ ("Inner reuse", 'j', "[i for i in range(5) if (j := 0) for j in range(5)]"), ("Inner unpacking reuse", 'j', "[i for i in range(5) if (j := 0) for j, k in [(0, 1)]]"), @@ -146,7 +145,7 @@ def test_named_expression_invalid_rebinding_comprehension_inner_loop(self): with self.assertRaisesRegex(SyntaxError, msg): exec(f"lambda: {code}", {}) # Function scope - def test_named_expression_invalid_comprehension_iterable_expression(self): + def test_named_expression_invalid_list_comprehension_iterable_expression(self): cases = [ ("Top level", "[i for i in (i := range(5))]"), ("Inside tuple", "[i for i in (2, 3, i := range(5))]"), @@ -168,6 +167,60 @@ def test_named_expression_invalid_comprehension_iterable_expression(self): with self.assertRaisesRegex(SyntaxError, msg): exec(f"lambda: {code}", {}) # Function scope + def test_named_expression_invalid_rebinding_set_comprehension_iteration_variable(self): + cases = [ + ("Local reuse", 'i', "{i := 0 for i in range(5)}"), + ("Nested reuse", 'j', "{{(j := 0) for i in range(5)} for j in range(5)}"), + ("Reuse inner loop target", 'j', "{(j := 0) for i in range(5) for j in range(5)}"), + ("Unpacking reuse", 'i', "{i := 0 for i, j in {(0, 1)}}"), + ("Reuse in loop condition", 'i', "{i+1 for i in range(5) if (i := 0)}"), + ("Unreachable reuse", 'i', "{False or (i:=0) for i in range(5)}"), + ("Unreachable nested reuse", 'i', + "{(i, j) for i in range(5) for j in range(5) if True or (i:=10)}"), + ] + for case, target, code in cases: + msg = f"assignment expression cannot rebind comprehension iteration variable '{target}'" + with self.subTest(case=case): + with self.assertRaisesRegex(SyntaxError, msg): + exec(code, {}, {}) + + def test_named_expression_invalid_rebinding_set_comprehension_inner_loop(self): + cases = [ + ("Inner reuse", 'j', "{i for i in range(5) if (j := 0) for j in range(5)}"), + ("Inner unpacking reuse", 'j', "{i for i in range(5) if (j := 0) for j, k in {(0, 1)}}"), + ] + for case, target, code in cases: + msg = f"comprehension inner loop cannot rebind assignment expression target '{target}'" + with self.subTest(case=case): + with self.assertRaisesRegex(SyntaxError, msg): + exec(code, {}) # Module scope + with self.assertRaisesRegex(SyntaxError, msg): + exec(code, {}, {}) # Class scope + with self.assertRaisesRegex(SyntaxError, msg): + exec(f"lambda: {code}", {}) # Function scope + + def test_named_expression_invalid_set_comprehension_iterable_expression(self): + cases = [ + ("Top level", "{i for i in (i := range(5))}"), + ("Inside tuple", "{i for i in (2, 3, i := range(5))}"), + ("Inside list", "{i for i in {2, 3, i := range(5)}}"), + ("Different name", "{i for i in (j := range(5))}"), + ("Lambda expression", "{i for i in (lambda:(j := range(5)))()}"), + ("Inner loop", "{i for i in range(5) for j in (i := range(5))}"), + ("Nested comprehension", "{i for i in {j for j in (k := range(5))}}"), + ("Nested comprehension condition", "{i for i in {j for j in range(5) if (j := True)}}"), + ("Nested comprehension body", "{i for i in {(j := True) for j in range(5)}}"), + ] + msg = "assignment expression cannot be used in a comprehension iterable expression" + for case, code in cases: + with self.subTest(case=case): + with self.assertRaisesRegex(SyntaxError, msg): + exec(code, {}) # Module scope + with self.assertRaisesRegex(SyntaxError, msg): + exec(code, {}, {}) # Class scope + with self.assertRaisesRegex(SyntaxError, msg): + exec(f"lambda: {code}", {}) # Function scope + class NamedExpressionAssignmentTest(unittest.TestCase): @@ -514,6 +567,15 @@ def g(): self.assertEqual(nonlocal_var, None) f() + def test_named_expression_scope_in_genexp(self): + a = 1 + b = [1, 2, 3, 4] + genexp = (c := i + a for i in b) + + self.assertNotIn("c", locals()) + for idx, elem in enumerate(genexp): + self.assertEqual(elem, b[idx] + a) + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py index fbd7db03defb1dee59ebbd935ee0138996bd7fa5..99386ddbaedfa9e88728e3d42cc34a0d46bf8d7f 100644 --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -5,13 +5,14 @@ import unittest import functools import contextlib +import nntplib import os.path import re import threading from test import support +from test.support import socket_helper from nntplib import NNTP, GroupInfo -import nntplib from unittest.mock import patch try: import ssl @@ -19,7 +20,6 @@ ssl = None -TIMEOUT = 30 certfile = os.path.join(os.path.dirname(__file__), 'keycert3.pem') if ssl is not None: @@ -82,7 +82,7 @@ def _check_desc(desc): desc = self.server.description(self.GROUP_NAME) _check_desc(desc) # Another sanity check - self.assertIn("Python", desc) + self.assertIn(self.DESC, desc) # With a pattern desc = self.server.description(self.GROUP_PAT) _check_desc(desc) @@ -246,7 +246,7 @@ def wrap_methods(cls): def wrap_meth(meth): @functools.wraps(meth) def wrapped(self): - with support.transient_internet(self.NNTP_HOST): + with socket_helper.transient_internet(self.NNTP_HOST): meth(self) return wrapped for name in dir(cls): @@ -259,6 +259,10 @@ def wrapped(self): # value setattr(cls, name, wrap_meth(meth)) + def test_timeout(self): + with self.assertRaises(ValueError): + self.NNTP_CLASS(self.NNTP_HOST, timeout=0, usenetrc=False) + def test_with_statement(self): def is_connected(): if not hasattr(server, 'file'): @@ -270,12 +274,18 @@ def is_connected(): return True try: - with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server: + server = self.NNTP_CLASS(self.NNTP_HOST, + timeout=support.INTERNET_TIMEOUT, + usenetrc=False) + with server: self.assertTrue(is_connected()) self.assertTrue(server.help()) self.assertFalse(is_connected()) - with self.NNTP_CLASS(self.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) as server: + server = self.NNTP_CLASS(self.NNTP_HOST, + timeout=support.INTERNET_TIMEOUT, + usenetrc=False) + with server: server.quit() self.assertFalse(is_connected()) except SSLError as ssl_err: @@ -299,15 +309,17 @@ class NetworkedNNTPTests(NetworkedNNTPTestsMixin, unittest.TestCase): NNTP_HOST = 'news.trigofacile.com' GROUP_NAME = 'fr.comp.lang.python' GROUP_PAT = 'fr.comp.lang.*' + DESC = 'Python' NNTP_CLASS = NNTP @classmethod def setUpClass(cls): support.requires("network") - with support.transient_internet(cls.NNTP_HOST): + with socket_helper.transient_internet(cls.NNTP_HOST): try: - cls.server = cls.NNTP_CLASS(cls.NNTP_HOST, timeout=TIMEOUT, + cls.server = cls.NNTP_CLASS(cls.NNTP_HOST, + timeout=support.INTERNET_TIMEOUT, usenetrc=False) except SSLError as ssl_err: # matches "[SSL: DH_KEY_TOO_SMALL] dh key too small" @@ -332,8 +344,11 @@ class NetworkedNNTP_SSLTests(NetworkedNNTPTests): # 400 connections per day are accepted from each IP address." NNTP_HOST = 'nntp.aioe.org' - GROUP_NAME = 'comp.lang.python' - GROUP_PAT = 'comp.lang.*' + # bpo-42794: aioe.test is one of the official groups on this server + # used for testing: https://news.aioe.org/manual/aioe-hierarchy/ + GROUP_NAME = 'aioe.test' + GROUP_PAT = 'aioe.*' + DESC = 'test' NNTP_CLASS = getattr(nntplib, 'NNTP_SSL', None) @@ -400,6 +415,18 @@ def make_mock_file(handler): return (sio, file) +class NNTPServer(nntplib.NNTP): + + def __init__(self, f, host, readermode=None): + self.file = f + self.host = host + self._base_init(readermode) + + def _close(self): + self.file.close() + del self.file + + class MockedNNTPTestsMixin: # Override in derived classes handler_class = None @@ -415,7 +442,7 @@ def tearDown(self): def make_server(self, *args, **kwargs): self.handler = self.handler_class() self.sio, file = make_mock_file(self.handler) - self.server = nntplib._NNTPBase(file, 'test.server', *args, **kwargs) + self.server = NNTPServer(file, 'test.server', *args, **kwargs) return self.server @@ -1545,14 +1572,14 @@ def nntp_class(*pos, **kw): class LocalServerTests(unittest.TestCase): def setUp(self): sock = socket.socket() - port = support.bind_port(sock) + port = socket_helper.bind_port(sock) sock.listen() self.background = threading.Thread( target=self.run_server, args=(sock,)) self.background.start() self.addCleanup(self.background.join) - self.nntp = NNTP(support.HOST, port, usenetrc=False).__enter__() + self.nntp = NNTP(socket_helper.HOST, port, usenetrc=False).__enter__() self.addCleanup(self.nntp.__exit__, None, None, None) def run_server(self, sock): diff --git a/Lib/test/test_normalization.py b/Lib/test/test_normalization.py deleted file mode 100644 index ba877e73f7d9e6a233e61f0b9355dd84887670da..0000000000000000000000000000000000000000 --- a/Lib/test/test_normalization.py +++ /dev/null @@ -1,117 +0,0 @@ -from test.support import open_urlresource -import unittest - -from http.client import HTTPException -import sys -from unicodedata import normalize, is_normalized, unidata_version - -TESTDATAFILE = "NormalizationTest.txt" -TESTDATAURL = "http://www.pythontest.net/unicode/" + unidata_version + "/" + TESTDATAFILE - -def check_version(testfile): - hdr = testfile.readline() - return unidata_version in hdr - -class RangeError(Exception): - pass - -def NFC(str): - return normalize("NFC", str) - -def NFKC(str): - return normalize("NFKC", str) - -def NFD(str): - return normalize("NFD", str) - -def NFKD(str): - return normalize("NFKD", str) - -def unistr(data): - data = [int(x, 16) for x in data.split(" ")] - for x in data: - if x > sys.maxunicode: - raise RangeError - return "".join([chr(x) for x in data]) - -class NormalizationTest(unittest.TestCase): - def test_main(self): - # Hit the exception early - try: - testdata = open_urlresource(TESTDATAURL, encoding="utf-8", - check=check_version) - except PermissionError: - self.skipTest(f"Permission error when downloading {TESTDATAURL} " - f"into the test data directory") - except (OSError, HTTPException): - self.fail(f"Could not retrieve {TESTDATAURL}") - - with testdata: - self.run_normalization_tests(testdata) - - def run_normalization_tests(self, testdata): - part = None - part1_data = {} - - for line in testdata: - if '#' in line: - line = line.split('#')[0] - line = line.strip() - if not line: - continue - if line.startswith("@Part"): - part = line.split()[0] - continue - try: - c1,c2,c3,c4,c5 = [unistr(x) for x in line.split(';')[:-1]] - except RangeError: - # Skip unsupported characters; - # try at least adding c1 if we are in part1 - if part == "@Part1": - try: - c1 = unistr(line.split(';')[0]) - except RangeError: - pass - else: - part1_data[c1] = 1 - continue - - # Perform tests - self.assertTrue(c2 == NFC(c1) == NFC(c2) == NFC(c3), line) - self.assertTrue(c4 == NFC(c4) == NFC(c5), line) - self.assertTrue(c3 == NFD(c1) == NFD(c2) == NFD(c3), line) - self.assertTrue(c5 == NFD(c4) == NFD(c5), line) - self.assertTrue(c4 == NFKC(c1) == NFKC(c2) == \ - NFKC(c3) == NFKC(c4) == NFKC(c5), - line) - self.assertTrue(c5 == NFKD(c1) == NFKD(c2) == \ - NFKD(c3) == NFKD(c4) == NFKD(c5), - line) - - self.assertTrue(is_normalized("NFC", c2)) - self.assertTrue(is_normalized("NFC", c4)) - - self.assertTrue(is_normalized("NFD", c3)) - self.assertTrue(is_normalized("NFD", c5)) - - self.assertTrue(is_normalized("NFKC", c4)) - self.assertTrue(is_normalized("NFKD", c5)) - - # Record part 1 data - if part == "@Part1": - part1_data[c1] = 1 - - # Perform tests for all other data - for c in range(sys.maxunicode+1): - X = chr(c) - if X in part1_data: - continue - self.assertTrue(X == NFC(X) == NFD(X) == NFKC(X) == NFKD(X), c) - - def test_bug_834676(self): - # Check for bug 834676 - normalize('NFC', '\ud55c\uae00') - - -if __name__ == "__main__": - unittest.main() diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py index 4a02db281724ed2678e84d7601f0a9c83eb3a40c..6f881f197c4f54d081124181489f383adfa337b0 100644 --- a/Lib/test/test_ntpath.py +++ b/Lib/test/test_ntpath.py @@ -725,7 +725,7 @@ class PathLikeTests(NtpathTestCase): path = ntpath def setUp(self): - self.file_name = support.TESTFN.lower() + self.file_name = support.TESTFN self.file_path = FakePath(support.TESTFN) self.addCleanup(support.unlink, self.file_name) with open(self.file_name, 'xb', 0) as file: diff --git a/Lib/test/test_ordered_dict.py b/Lib/test/test_ordered_dict.py index 085e5f60ed93b6e50b423f822f13a4d7e1a5dad9..9df4efbfffa22dce27f2a451fb64fc9bb8a68f9d 100644 --- a/Lib/test/test_ordered_dict.py +++ b/Lib/test/test_ordered_dict.py @@ -407,9 +407,9 @@ def test_move_to_end(self): self.assertEqual(list(od), list('abcde')) od.move_to_end('c') self.assertEqual(list(od), list('abdec')) - od.move_to_end('c', 0) + od.move_to_end('c', False) self.assertEqual(list(od), list('cabde')) - od.move_to_end('c', 0) + od.move_to_end('c', False) self.assertEqual(list(od), list('cabde')) od.move_to_end('e') self.assertEqual(list(od), list('cabde')) @@ -418,7 +418,7 @@ def test_move_to_end(self): with self.assertRaises(KeyError): od.move_to_end('x') with self.assertRaises(KeyError): - od.move_to_end('x', 0) + od.move_to_end('x', False) def test_move_to_end_issue25406(self): OrderedDict = self.OrderedDict @@ -654,6 +654,60 @@ def test_free_after_iterating(self): support.check_free_after_iterating(self, lambda d: iter(d.values()), self.OrderedDict) support.check_free_after_iterating(self, lambda d: iter(d.items()), self.OrderedDict) + def test_merge_operator(self): + OrderedDict = self.OrderedDict + + a = OrderedDict({0: 0, 1: 1, 2: 1}) + b = OrderedDict({1: 1, 2: 2, 3: 3}) + + c = a.copy() + d = a.copy() + c |= b + d |= list(b.items()) + expected = OrderedDict({0: 0, 1: 1, 2: 2, 3: 3}) + self.assertEqual(a | dict(b), expected) + self.assertEqual(a | b, expected) + self.assertEqual(c, expected) + self.assertEqual(d, expected) + + c = b.copy() + c |= a + expected = OrderedDict({1: 1, 2: 1, 3: 3, 0: 0}) + self.assertEqual(dict(b) | a, expected) + self.assertEqual(b | a, expected) + self.assertEqual(c, expected) + + self.assertIs(type(a | b), OrderedDict) + self.assertIs(type(dict(a) | b), OrderedDict) + self.assertIs(type(a | dict(b)), OrderedDict) + + expected = a.copy() + a |= () + a |= "" + self.assertEqual(a, expected) + + with self.assertRaises(TypeError): + a | None + with self.assertRaises(TypeError): + a | () + with self.assertRaises(TypeError): + a | "BAD" + with self.assertRaises(TypeError): + a | "" + with self.assertRaises(ValueError): + a |= "BAD" + + @support.cpython_only + def test_ordered_dict_items_result_gc(self): + # bpo-42536: OrderedDict.items's tuple-reuse speed trick breaks the GC's + # assumptions about what can be untracked. Make sure we re-track result + # tuples whenever we reuse them. + it = iter(self.OrderedDict({None: []}).items()) + gc.collect() + # That GC collection probably untracked the recycled internal result + # tuple, which is initialized to (None, None). Make sure it's re-tracked + # when it's mutated and returned from __next__: + self.assertTrue(gc.is_tracked(next(it))) class PurePythonOrderedDictTests(OrderedDictTests, unittest.TestCase): diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 2a4ae1573ef59927c64b751ca8d9cf4685d4b147..35933e9c8c3a971f7ef2a23497331ffb09a8c1b9 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -25,10 +25,12 @@ import tempfile import threading import time +import types import unittest import uuid import warnings from test import support +from test.support import socket_helper from platform import win32_is_iot try: @@ -953,17 +955,40 @@ def test_environb(self): value_str = value.decode(sys.getfilesystemencoding(), 'surrogateescape') self.assertEqual(os.environ['bytes'], value_str) + def test_putenv_unsetenv(self): + name = "PYTHONTESTVAR" + value = "testvalue" + code = f'import os; print(repr(os.environ.get({name!r})))' + + with support.EnvironmentVarGuard() as env: + env.pop(name, None) + + os.putenv(name, value) + proc = subprocess.run([sys.executable, '-c', code], check=True, + stdout=subprocess.PIPE, text=True) + self.assertEqual(proc.stdout.rstrip(), repr(value)) + + os.unsetenv(name) + proc = subprocess.run([sys.executable, '-c', code], check=True, + stdout=subprocess.PIPE, text=True) + self.assertEqual(proc.stdout.rstrip(), repr(None)) + # On OS X < 10.6, unsetenv() doesn't return a value (bpo-13415). @support.requires_mac_ver(10, 6) - def test_unset_error(self): + def test_putenv_unsetenv_error(self): + # Empty variable name is invalid. + # "=" and null character are not allowed in a variable name. + for name in ('', '=name', 'na=me', 'name=', 'name\0', 'na\0me'): + self.assertRaises((OSError, ValueError), os.putenv, name, "value") + self.assertRaises((OSError, ValueError), os.unsetenv, name) + if sys.platform == "win32": - # an environment variable is limited to 32,767 characters - key = 'x' * 50000 - self.assertRaises(ValueError, os.environ.__delitem__, key) - else: - # "=" is not allowed in a variable name - key = 'key=' - self.assertRaises(OSError, os.environ.__delitem__, key) + # On Windows, an environment variable string ("name=value" string) + # is limited to 32,767 characters + longstr = 'x' * 32_768 + self.assertRaises(ValueError, os.putenv, longstr, "1") + self.assertRaises(ValueError, os.putenv, "X", longstr) + self.assertRaises(ValueError, os.unsetenv, longstr) def test_key_type(self): missing = 'missingkey' @@ -1003,6 +1028,96 @@ def test_iter_error_when_changing_os_environ_items(self): def test_iter_error_when_changing_os_environ_values(self): self._test_environ_iteration(os.environ.values()) + def _test_underlying_process_env(self, var, expected): + if not (unix_shell and os.path.exists(unix_shell)): + return + + with os.popen(f"{unix_shell} -c 'echo ${var}'") as popen: + value = popen.read().strip() + + self.assertEqual(expected, value) + + def test_or_operator(self): + overridden_key = '_TEST_VAR_' + original_value = 'original_value' + os.environ[overridden_key] = original_value + + new_vars_dict = {'_A_': '1', '_B_': '2', overridden_key: '3'} + expected = dict(os.environ) + expected.update(new_vars_dict) + + actual = os.environ | new_vars_dict + self.assertDictEqual(expected, actual) + self.assertEqual('3', actual[overridden_key]) + + new_vars_items = new_vars_dict.items() + self.assertIs(NotImplemented, os.environ.__or__(new_vars_items)) + + self._test_underlying_process_env('_A_', '') + self._test_underlying_process_env(overridden_key, original_value) + + def test_ior_operator(self): + overridden_key = '_TEST_VAR_' + os.environ[overridden_key] = 'original_value' + + new_vars_dict = {'_A_': '1', '_B_': '2', overridden_key: '3'} + expected = dict(os.environ) + expected.update(new_vars_dict) + + os.environ |= new_vars_dict + self.assertEqual(expected, os.environ) + self.assertEqual('3', os.environ[overridden_key]) + + self._test_underlying_process_env('_A_', '1') + self._test_underlying_process_env(overridden_key, '3') + + def test_ior_operator_invalid_dicts(self): + os_environ_copy = os.environ.copy() + with self.assertRaises(TypeError): + dict_with_bad_key = {1: '_A_'} + os.environ |= dict_with_bad_key + + with self.assertRaises(TypeError): + dict_with_bad_val = {'_A_': 1} + os.environ |= dict_with_bad_val + + # Check nothing was added. + self.assertEqual(os_environ_copy, os.environ) + + def test_ior_operator_key_value_iterable(self): + overridden_key = '_TEST_VAR_' + os.environ[overridden_key] = 'original_value' + + new_vars_items = (('_A_', '1'), ('_B_', '2'), (overridden_key, '3')) + expected = dict(os.environ) + expected.update(new_vars_items) + + os.environ |= new_vars_items + self.assertEqual(expected, os.environ) + self.assertEqual('3', os.environ[overridden_key]) + + self._test_underlying_process_env('_A_', '1') + self._test_underlying_process_env(overridden_key, '3') + + def test_ror_operator(self): + overridden_key = '_TEST_VAR_' + original_value = 'original_value' + os.environ[overridden_key] = original_value + + new_vars_dict = {'_A_': '1', '_B_': '2', overridden_key: '3'} + expected = dict(new_vars_dict) + expected.update(os.environ) + + actual = new_vars_dict | os.environ + self.assertDictEqual(expected, actual) + self.assertEqual(original_value, actual[overridden_key]) + + new_vars_items = new_vars_dict.items() + self.assertIs(NotImplemented, os.environ.__ror__(new_vars_items)) + + self._test_underlying_process_env('_A_', '') + self._test_underlying_process_env(overridden_key, original_value) + class WalkTests(unittest.TestCase): """Tests for os.walk().""" @@ -1058,7 +1173,7 @@ def setUp(self): os.makedirs(t2_path) for path in tmp1_path, tmp2_path, tmp3_path, tmp4_path, tmp5_path: - with open(path, "x") as f: + with open(path, "x", encoding='utf-8') as f: f.write("I'm " + path + " and proud of it. Blame test_os.\n") if support.can_symlink(): @@ -2244,7 +2359,7 @@ def setUp(self): file_name = 'FILE%d' % i file_path = os.path.join(support.TESTFN, file_name) os.makedirs(dir_path) - with open(file_path, 'w') as f: + with open(file_path, 'w', encoding='utf-8') as f: f.write("I'm %s and proud of it. Blame test_os.\n" % file_path) self.created_paths.extend([dir_name, file_name]) self.created_paths.sort() @@ -2675,7 +2790,7 @@ def test_getppid(self): # We are the parent of our subprocess self.assertEqual(int(stdout), os.getpid()) - def check_waitpid(self, code, exitcode): + def check_waitpid(self, code, exitcode, callback=None): if sys.platform == 'win32': # On Windows, os.spawnv() simply joins arguments with spaces: # arguments need to be quoted @@ -2684,29 +2799,58 @@ def check_waitpid(self, code, exitcode): args = [sys.executable, '-c', code] pid = os.spawnv(os.P_NOWAIT, sys.executable, args) + if callback is not None: + callback(pid) + + # don't use support.wait_process() to test directly os.waitpid() + # and os.waitstatus_to_exitcode() pid2, status = os.waitpid(pid, 0) - if sys.platform == 'win32': - self.assertEqual(status, exitcode << 8) - else: - self.assertTrue(os.WIFEXITED(status), status) - self.assertEqual(os.WEXITSTATUS(status), exitcode) + self.assertEqual(os.waitstatus_to_exitcode(status), exitcode) self.assertEqual(pid2, pid) def test_waitpid(self): self.check_waitpid(code='pass', exitcode=0) - def test_waitpid_exitcode(self): + def test_waitstatus_to_exitcode(self): exitcode = 23 code = f'import sys; sys.exit({exitcode})' self.check_waitpid(code, exitcode=exitcode) + with self.assertRaises(TypeError): + os.waitstatus_to_exitcode(0.0) + @unittest.skipUnless(sys.platform == 'win32', 'win32-specific test') def test_waitpid_windows(self): - # bpo-40138: test os.waitpid() with exit code larger than INT_MAX. + # bpo-40138: test os.waitpid() and os.waitstatus_to_exitcode() + # with exit code larger than INT_MAX. STATUS_CONTROL_C_EXIT = 0xC000013A code = f'import _winapi; _winapi.ExitProcess({STATUS_CONTROL_C_EXIT})' self.check_waitpid(code, exitcode=STATUS_CONTROL_C_EXIT) + @unittest.skipUnless(sys.platform == 'win32', 'win32-specific test') + def test_waitstatus_to_exitcode_windows(self): + max_exitcode = 2 ** 32 - 1 + for exitcode in (0, 1, 5, max_exitcode): + self.assertEqual(os.waitstatus_to_exitcode(exitcode << 8), + exitcode) + + # invalid values + with self.assertRaises(ValueError): + os.waitstatus_to_exitcode((max_exitcode + 1) << 8) + with self.assertRaises(OverflowError): + os.waitstatus_to_exitcode(-1) + + # Skip the test on Windows + @unittest.skipUnless(hasattr(signal, 'SIGKILL'), 'need signal.SIGKILL') + def test_waitstatus_to_exitcode_kill(self): + code = f'import time; time.sleep({support.LONG_TIMEOUT})' + signum = signal.SIGKILL + + def kill_process(pid): + os.kill(pid, signum) + + self.check_waitpid(code, exitcode=-signum, callback=kill_process) + class SpawnTests(unittest.TestCase): def create_args(self, *, with_env=False, use_bytes=False): @@ -2767,6 +2911,10 @@ def test_spawnv(self): exitcode = os.spawnv(os.P_WAIT, args[0], args) self.assertEqual(exitcode, self.exitcode) + # Test for PyUnicode_FSConverter() + exitcode = os.spawnv(os.P_WAIT, FakePath(args[0]), args) + self.assertEqual(exitcode, self.exitcode) + @requires_os_func('spawnve') def test_spawnve(self): args = self.create_args(with_env=True) @@ -2789,14 +2937,7 @@ def test_spawnvpe(self): def test_nowait(self): args = self.create_args() pid = os.spawnv(os.P_NOWAIT, args[0], args) - result = os.waitpid(pid, 0) - self.assertEqual(result[0], pid) - status = result[1] - if hasattr(os, 'WIFEXITED'): - self.assertTrue(os.WIFEXITED(status)) - self.assertEqual(os.WEXITSTATUS(status), self.exitcode) - else: - self.assertEqual(status, self.exitcode << 8) + support.wait_process(pid, exitcode=self.exitcode) @requires_os_func('spawnve') def test_spawnve_bytes(self): @@ -3031,7 +3172,7 @@ def tearDownClass(cls): support.unlink(support.TESTFN) def setUp(self): - self.server = SendfileTestServer((support.HOST, 0)) + self.server = SendfileTestServer((socket_helper.HOST, 0)) self.server.start() self.client = socket.socket() self.client.connect((self.server.host, self.server.port)) @@ -3135,11 +3276,12 @@ def test_invalid_offset(self): def test_keywords(self): # Keyword arguments should be supported - os.sendfile(out=self.sockno, offset=0, count=4096, - **{'in': self.fileno}) + os.sendfile(out_fd=self.sockno, in_fd=self.fileno, + offset=0, count=4096) if self.SUPPORT_HEADERS_TRAILERS: - os.sendfile(self.sockno, self.fileno, offset=0, count=4096, - headers=(), trailers=(), flags=0) + os.sendfile(out_fd=self.sockno, in_fd=self.fileno, + offset=0, count=4096, + headers=(), trailers=(), flags=0) # --- headers / trailers tests @@ -3343,7 +3485,11 @@ def test_stty_match(self): should work too. """ try: - size = subprocess.check_output(['stty', 'size']).decode().split() + size = ( + subprocess.check_output( + ["stty", "size"], stderr=subprocess.DEVNULL, text=True + ).split() + ) except (FileNotFoundError, subprocess.CalledProcessError, PermissionError): self.skipTest("stty invocation failed") @@ -3513,6 +3659,33 @@ def test_set_inheritable_cloexec(self): self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC, 0) + @unittest.skipUnless(hasattr(os, 'O_PATH'), "need os.O_PATH") + def test_get_set_inheritable_o_path(self): + fd = os.open(__file__, os.O_PATH) + self.addCleanup(os.close, fd) + self.assertEqual(os.get_inheritable(fd), False) + + os.set_inheritable(fd, True) + self.assertEqual(os.get_inheritable(fd), True) + + os.set_inheritable(fd, False) + self.assertEqual(os.get_inheritable(fd), False) + + def test_get_set_inheritable_badf(self): + fd = support.make_bad_fd() + + with self.assertRaises(OSError) as ctx: + os.get_inheritable(fd) + self.assertEqual(ctx.exception.errno, errno.EBADF) + + with self.assertRaises(OSError) as ctx: + os.set_inheritable(fd, True) + self.assertEqual(ctx.exception.errno, errno.EBADF) + + with self.assertRaises(OSError) as ctx: + os.set_inheritable(fd, False) + self.assertEqual(ctx.exception.errno, errno.EBADF) + def test_open(self): fd = os.open(__file__, os.O_RDONLY) self.addCleanup(os.close, fd) @@ -3591,7 +3764,7 @@ def test_path_t_converter(self): if os.name == 'nt': bytes_fspath = bytes_filename = None else: - bytes_filename = support.TESTFN.encode('ascii') + bytes_filename = os.fsencode(support.TESTFN) bytes_fspath = FakePath(bytes_filename) fd = os.open(FakePath(str_filename), os.O_WRONLY|os.O_CREAT) self.addCleanup(support.unlink, support.TESTFN) @@ -3662,6 +3835,24 @@ def test_os_all(self): self.assertIn('walk', os.__all__) +class TestDirEntry(unittest.TestCase): + def setUp(self): + self.path = os.path.realpath(support.TESTFN) + self.addCleanup(support.rmtree, self.path) + os.mkdir(self.path) + + def test_uninstantiable(self): + self.assertRaises(TypeError, os.DirEntry) + + def test_unpickable(self): + filename = create_file(os.path.join(self.path, "file.txt"), b'python') + entry = [entry for entry in os.scandir(self.path)].pop() + self.assertIsInstance(entry, os.DirEntry) + self.assertEqual(entry.name, "file.txt") + import pickle + self.assertRaises(TypeError, pickle.dumps, entry, filename) + + class TestScandir(unittest.TestCase): check_no_resource_warning = support.check_no_resource_warning @@ -3696,6 +3887,18 @@ def assert_stat_equal(self, stat1, stat2, skip_fields): else: self.assertEqual(stat1, stat2) + def test_uninstantiable(self): + scandir_iter = os.scandir(self.path) + self.assertRaises(TypeError, type(scandir_iter)) + scandir_iter.close() + + def test_unpickable(self): + filename = self.create_file("file.txt") + scandir_iter = os.scandir(self.path) + import pickle + self.assertRaises(TypeError, pickle.dumps, scandir_iter, filename) + scandir_iter.close() + def check_entry(self, entry, name, is_dir, is_file, is_symlink): self.assertIsInstance(entry, os.DirEntry) self.assertEqual(entry.name, name) @@ -4050,6 +4253,9 @@ class A(os.PathLike): self.assertFalse(issubclass(FakePath, A)) self.assertTrue(issubclass(FakePath, os.PathLike)) + def test_pathlike_class_getitem(self): + self.assertIsInstance(os.PathLike[bytes], types.GenericAlias) + class TimesTests(unittest.TestCase): def test_times(self): diff --git a/Lib/test/test_parser.py b/Lib/test/test_parser.py index e5285c6360229d7434460e99c85edc2d037bcf61..a4d2cdc090aa21d1c20ca9ca32706dd45f55544f 100644 --- a/Lib/test/test_parser.py +++ b/Lib/test/test_parser.py @@ -1,11 +1,16 @@ import copy -import parser +import warnings +with warnings.catch_warnings(): + warnings.filterwarnings('ignore', 'The parser module is deprecated', + DeprecationWarning) + import parser import pickle import unittest import operator import struct from test import support from test.support.script_helper import assert_python_failure +from test.support.script_helper import assert_python_ok # # First, we test that we can generate trees from valid source fragments, @@ -221,6 +226,27 @@ def test_function_defs(self): self.check_suite("@funcattrs()\n" "def f(): pass") + self.check_suite("@False or x\n" + "def f(): pass") + self.check_suite("@d := x\n" + "def f(): pass") + self.check_suite("@lambda f: x(f)\n" + "def f(): pass") + self.check_suite("@[..., x, ...][1]\n" + "def f(): pass") + self.check_suite("@x(x)(x)\n" + "def f(): pass") + self.check_suite("@(x, x)\n" + "def f(): pass") + self.check_suite("@...\n" + "def f(): pass") + self.check_suite("@None\n" + "def f(): pass") + self.check_suite("@w @(x @y) @(z)\n" + "def f(): pass") + self.check_suite("@w[x].y.z\n" + "def f(): pass") + # keyword-only arguments self.check_suite("def f(*, a): pass") self.check_suite("def f(*, a = 5): pass") @@ -265,6 +291,27 @@ def test_class_defs(self): "@decorator2\n" "class foo():pass") + self.check_suite("@False or x\n" + "class C: pass") + self.check_suite("@d := x\n" + "class C: pass") + self.check_suite("@lambda f: x(f)\n" + "class C: pass") + self.check_suite("@[..., x, ...][1]\n" + "class C: pass") + self.check_suite("@x(x)(x)\n" + "class C: pass") + self.check_suite("@(x, x)\n" + "class C: pass") + self.check_suite("@...\n" + "class C: pass") + self.check_suite("@None\n" + "class C: pass") + self.check_suite("@w @(x @y) @(z)\n" + "class C: pass") + self.check_suite("@w[x].y.z\n" + "class C: pass") + def test_import_from_statement(self): self.check_suite("from sys.path import *") self.check_suite("from sys.path import dirname") @@ -854,7 +901,7 @@ def test_deeply_nested_list(self): def test_trigger_memory_error(self): e = self._nested_expression(100) - rc, out, err = assert_python_failure('-c', e) + rc, out, err = assert_python_failure('-Xoldparser', '-c', e) # parsing the expression will result in an error message # followed by a MemoryError (see #11963) self.assertIn(b's_push: parser stack overflow', err) @@ -987,5 +1034,13 @@ def test_two_args_to_expr(self): with self.assertRaises(TypeError): parser.expr("a", "b") + +class TestDeprecation(unittest.TestCase): + def test_deprecation_message(self): + code = "def f():\n import parser\n\nf()" + rc, out, err = assert_python_ok('-c', code) + self.assertIn(b':2: DeprecationWarning', err) + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 36226948222d642b1cdbcb20ba88ac757ba62c2e..3da35710b9de431e72755611fb3d4c50992d37d5 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -559,6 +559,23 @@ def test_with_name_common(self): self.assertRaises(ValueError, P('a/b').with_name, 'c/') self.assertRaises(ValueError, P('a/b').with_name, 'c/d') + def test_with_stem_common(self): + P = self.cls + self.assertEqual(P('a/b').with_stem('d'), P('a/d')) + self.assertEqual(P('/a/b').with_stem('d'), P('/a/d')) + self.assertEqual(P('a/b.py').with_stem('d'), P('a/d.py')) + self.assertEqual(P('/a/b.py').with_stem('d'), P('/a/d.py')) + self.assertEqual(P('/a/b.tar.gz').with_stem('d'), P('/a/d.gz')) + self.assertEqual(P('a/Dot ending.').with_stem('d'), P('a/d')) + self.assertEqual(P('/a/Dot ending.').with_stem('d'), P('/a/d')) + self.assertRaises(ValueError, P('').with_stem, 'd') + self.assertRaises(ValueError, P('.').with_stem, 'd') + self.assertRaises(ValueError, P('/').with_stem, 'd') + self.assertRaises(ValueError, P('a/b').with_stem, '') + self.assertRaises(ValueError, P('a/b').with_stem, '/c') + self.assertRaises(ValueError, P('a/b').with_stem, 'c/') + self.assertRaises(ValueError, P('a/b').with_stem, 'c/d') + def test_with_suffix_common(self): P = self.cls self.assertEqual(P('a/b').with_suffix('.gz'), P('a/b.gz')) @@ -619,6 +636,40 @@ def test_relative_to_common(self): self.assertRaises(ValueError, p.relative_to, '') self.assertRaises(ValueError, p.relative_to, P('a')) + def test_is_relative_to_common(self): + P = self.cls + p = P('a/b') + self.assertRaises(TypeError, p.is_relative_to) + self.assertRaises(TypeError, p.is_relative_to, b'a') + self.assertTrue(p.is_relative_to(P())) + self.assertTrue(p.is_relative_to('')) + self.assertTrue(p.is_relative_to(P('a'))) + self.assertTrue(p.is_relative_to('a/')) + self.assertTrue(p.is_relative_to(P('a/b'))) + self.assertTrue(p.is_relative_to('a/b')) + # With several args. + self.assertTrue(p.is_relative_to('a', 'b')) + # Unrelated paths. + self.assertFalse(p.is_relative_to(P('c'))) + self.assertFalse(p.is_relative_to(P('a/b/c'))) + self.assertFalse(p.is_relative_to(P('a/c'))) + self.assertFalse(p.is_relative_to(P('/a'))) + p = P('/a/b') + self.assertTrue(p.is_relative_to(P('/'))) + self.assertTrue(p.is_relative_to('/')) + self.assertTrue(p.is_relative_to(P('/a'))) + self.assertTrue(p.is_relative_to('/a')) + self.assertTrue(p.is_relative_to('/a/')) + self.assertTrue(p.is_relative_to(P('/a/b'))) + self.assertTrue(p.is_relative_to('/a/b')) + # Unrelated paths. + self.assertFalse(p.is_relative_to(P('/c'))) + self.assertFalse(p.is_relative_to(P('/a/b/c'))) + self.assertFalse(p.is_relative_to(P('/a/c'))) + self.assertFalse(p.is_relative_to(P())) + self.assertFalse(p.is_relative_to('')) + self.assertFalse(p.is_relative_to(P('a'))) + def test_pickling_common(self): P = self.cls p = P('/a/b') @@ -980,6 +1031,20 @@ def test_with_name(self): self.assertRaises(ValueError, P('c:a/b').with_name, 'd:/e') self.assertRaises(ValueError, P('c:a/b').with_name, '//My/Share') + def test_with_stem(self): + P = self.cls + self.assertEqual(P('c:a/b').with_stem('d'), P('c:a/d')) + self.assertEqual(P('c:/a/b').with_stem('d'), P('c:/a/d')) + self.assertEqual(P('c:a/Dot ending.').with_stem('d'), P('c:a/d')) + self.assertEqual(P('c:/a/Dot ending.').with_stem('d'), P('c:/a/d')) + self.assertRaises(ValueError, P('c:').with_stem, 'd') + self.assertRaises(ValueError, P('c:/').with_stem, 'd') + self.assertRaises(ValueError, P('//My/Share').with_stem, 'd') + self.assertRaises(ValueError, P('c:a/b').with_stem, 'd:') + self.assertRaises(ValueError, P('c:a/b').with_stem, 'd:e') + self.assertRaises(ValueError, P('c:a/b').with_stem, 'd:/e') + self.assertRaises(ValueError, P('c:a/b').with_stem, '//My/Share') + def test_with_suffix(self): P = self.cls self.assertEqual(P('c:a/b').with_suffix('.gz'), P('c:a/b.gz')) @@ -1062,6 +1127,59 @@ def test_relative_to(self): self.assertRaises(ValueError, p.relative_to, P('//z/Share/Foo')) self.assertRaises(ValueError, p.relative_to, P('//Server/z/Foo')) + def test_is_relative_to(self): + P = self.cls + p = P('C:Foo/Bar') + self.assertTrue(p.is_relative_to(P('c:'))) + self.assertTrue(p.is_relative_to('c:')) + self.assertTrue(p.is_relative_to(P('c:foO'))) + self.assertTrue(p.is_relative_to('c:foO')) + self.assertTrue(p.is_relative_to('c:foO/')) + self.assertTrue(p.is_relative_to(P('c:foO/baR'))) + self.assertTrue(p.is_relative_to('c:foO/baR')) + # Unrelated paths. + self.assertFalse(p.is_relative_to(P())) + self.assertFalse(p.is_relative_to('')) + self.assertFalse(p.is_relative_to(P('d:'))) + self.assertFalse(p.is_relative_to(P('/'))) + self.assertFalse(p.is_relative_to(P('Foo'))) + self.assertFalse(p.is_relative_to(P('/Foo'))) + self.assertFalse(p.is_relative_to(P('C:/Foo'))) + self.assertFalse(p.is_relative_to(P('C:Foo/Bar/Baz'))) + self.assertFalse(p.is_relative_to(P('C:Foo/Baz'))) + p = P('C:/Foo/Bar') + self.assertTrue(p.is_relative_to('c:')) + self.assertTrue(p.is_relative_to(P('c:/'))) + self.assertTrue(p.is_relative_to(P('c:/foO'))) + self.assertTrue(p.is_relative_to('c:/foO/')) + self.assertTrue(p.is_relative_to(P('c:/foO/baR'))) + self.assertTrue(p.is_relative_to('c:/foO/baR')) + # Unrelated paths. + self.assertFalse(p.is_relative_to(P('C:/Baz'))) + self.assertFalse(p.is_relative_to(P('C:/Foo/Bar/Baz'))) + self.assertFalse(p.is_relative_to(P('C:/Foo/Baz'))) + self.assertFalse(p.is_relative_to(P('C:Foo'))) + self.assertFalse(p.is_relative_to(P('d:'))) + self.assertFalse(p.is_relative_to(P('d:/'))) + self.assertFalse(p.is_relative_to(P('/'))) + self.assertFalse(p.is_relative_to(P('/Foo'))) + self.assertFalse(p.is_relative_to(P('//C/Foo'))) + # UNC paths. + p = P('//Server/Share/Foo/Bar') + self.assertTrue(p.is_relative_to(P('//sErver/sHare'))) + self.assertTrue(p.is_relative_to('//sErver/sHare')) + self.assertTrue(p.is_relative_to('//sErver/sHare/')) + self.assertTrue(p.is_relative_to(P('//sErver/sHare/Foo'))) + self.assertTrue(p.is_relative_to('//sErver/sHare/Foo')) + self.assertTrue(p.is_relative_to('//sErver/sHare/Foo/')) + self.assertTrue(p.is_relative_to(P('//sErver/sHare/Foo/Bar'))) + self.assertTrue(p.is_relative_to('//sErver/sHare/Foo/Bar')) + # Unrelated paths. + self.assertFalse(p.is_relative_to(P('/Server/Share/Foo'))) + self.assertFalse(p.is_relative_to(P('c:/Server/Share/Foo'))) + self.assertFalse(p.is_relative_to(P('//z/Share/Foo'))) + self.assertFalse(p.is_relative_to(P('//Server/z/Foo'))) + def test_is_absolute(self): P = self.cls # Under NT, only paths with both a drive and a root are absolute. @@ -1633,13 +1751,15 @@ def test_with(self): next(it2) with p: pass - # I/O operation on closed path. - self.assertRaises(ValueError, next, it) - self.assertRaises(ValueError, next, it2) - self.assertRaises(ValueError, p.open) - self.assertRaises(ValueError, p.resolve) - self.assertRaises(ValueError, p.absolute) - self.assertRaises(ValueError, p.__enter__) + # Using a path as a context manager is a no-op, thus the following + # operations should still succeed after the context manage exits. + next(it) + next(it2) + p.exists() + p.resolve() + p.absolute() + with p: + pass def test_chmod(self): p = self.cls(BASE) / 'fileA' @@ -1779,6 +1899,16 @@ def test_replace(self): self.assertEqual(os.stat(r).st_size, size) self.assertFileNotFound(q.stat) + @support.skip_unless_symlink + def test_readlink(self): + P = self.cls(BASE) + self.assertEqual((P / 'linkA').readlink(), self.cls('fileA')) + self.assertEqual((P / 'brokenLink').readlink(), + self.cls('non-existing')) + self.assertEqual((P / 'linkB').readlink(), self.cls('dirB')) + with self.assertRaises(OSError): + (P / 'fileA').readlink() + def test_touch_common(self): P = self.cls(BASE) p = P / 'newfileA' @@ -2174,6 +2304,9 @@ def test_complex_symlinks_relative_dot_dot(self): class PathTest(_BasePathTest, unittest.TestCase): cls = pathlib.Path + def test_class_getitem(self): + self.assertIs(self.cls[str], self.cls) + def test_concrete_class(self): p = self.cls('a') self.assertIs(type(p), @@ -2214,6 +2347,15 @@ def test_open_mode(self): st = os.stat(join('other_new_file')) self.assertEqual(stat.S_IMODE(st.st_mode), 0o644) + def test_resolve_root(self): + current_directory = os.getcwd() + try: + os.chdir('/') + p = self.cls('spam') + self.assertEqual(str(p.resolve()), '/spam') + finally: + os.chdir(current_directory) + def test_touch_mode(self): old_mask = os.umask(0) self.addCleanup(os.umask, old_mask) diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 0e7ae1d86ed80895f9194ccc674146d7ce71d884..6c4eaf318e448005e7c65c173e9dfb56f29f9e1f 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -425,6 +425,47 @@ def test_list_commands(): (Pdb) continue """ +def test_pdb_whatis_command(): + """Test the whatis command + + >>> myvar = (1,2) + >>> def myfunc(): + ... pass + + >>> class MyClass: + ... def mymethod(self): + ... pass + + >>> def test_function(): + ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() + + >>> with PdbTestInput([ # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE + ... 'whatis myvar', + ... 'whatis myfunc', + ... 'whatis MyClass', + ... 'whatis MyClass()', + ... 'whatis MyClass.mymethod', + ... 'whatis MyClass().mymethod', + ... 'continue', + ... ]): + ... test_function() + --Return-- + > (2)test_function()->None + -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() + (Pdb) whatis myvar + + (Pdb) whatis myfunc + Function myfunc + (Pdb) whatis MyClass + Class test.test_pdb.MyClass + (Pdb) whatis MyClass() + + (Pdb) whatis MyClass.mymethod + Function mymethod + (Pdb) whatis MyClass().mymethod + Method mymethod + (Pdb) continue + """ def test_post_mortem(): """Test post mortem traceback debugging. @@ -984,7 +1025,7 @@ def test_pdb_return_command_for_coroutine(): def test_pdb_until_command_for_generator(): """Testing no unwindng stack on yield for generators - for "until" command if target breakpoing is not reached + for "until" command if target breakpoint is not reached >>> def test_gen(): ... yield 0 @@ -1028,7 +1069,7 @@ def test_pdb_until_command_for_generator(): def test_pdb_until_command_for_coroutine(): """Testing no unwindng stack for coroutines - for "until" command if target breakpoing is not reached + for "until" command if target breakpoint is not reached >>> import asyncio @@ -1198,6 +1239,7 @@ def _run_pdb(self, pdb_args, commands): stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, + env = {**os.environ, 'PYTHONIOENCODING': 'utf-8'} ) as proc: stdout, stderr = proc.communicate(str.encode(commands)) stdout = stdout and bytes.decode(stdout) @@ -1353,10 +1395,11 @@ def start_pdb(): stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, + env={**os.environ, 'PYTHONIOENCODING': 'utf-8'} ) self.addCleanup(proc.stdout.close) stdout, stderr = proc.communicate(b'cont\n') - self.assertNotIn('Error', stdout.decode(), + self.assertNotIn(b'Error', stdout, "Got an error running test script under PDB") def test_issue36250(self): @@ -1382,10 +1425,11 @@ def start_pdb(): stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, + env = {**os.environ, 'PYTHONIOENCODING': 'utf-8'} ) self.addCleanup(proc.stdout.close) stdout, stderr = proc.communicate(b'cont\ncont\n') - self.assertNotIn('Error', stdout.decode(), + self.assertNotIn(b'Error', stdout, "Got an error running test script under PDB") def test_issue16180(self): @@ -1425,8 +1469,8 @@ def test_readrc_kwarg(self): ) with proc: stdout, stderr = proc.communicate(b'q\n') - self.assertNotIn("NameError: name 'invalid' is not defined", - stdout.decode()) + self.assertNotIn(b"NameError: name 'invalid' is not defined", + stdout) finally: if save_home is not None: @@ -1617,6 +1661,71 @@ def test_errors_in_command(self): '(Pdb) ', ]) + + def test_issue42384(self): + '''When running `python foo.py` sys.path[0] is an absolute path. `python -m pdb foo.py` should behave the same''' + script = textwrap.dedent(""" + import sys + print('sys.path[0] is', sys.path[0]) + """) + commands = 'c\nq' + + with support.temp_cwd() as cwd: + expected = f'(Pdb) sys.path[0] is {os.path.realpath(cwd)}' + + stdout, stderr = self.run_pdb_script(script, commands) + + self.assertEqual(stdout.split('\n')[2].rstrip('\r'), expected) + + @support.skip_unless_symlink + def test_issue42384_symlink(self): + '''When running `python foo.py` sys.path[0] resolves symlinks. `python -m pdb foo.py` should behave the same''' + script = textwrap.dedent(""" + import sys + print('sys.path[0] is', sys.path[0]) + """) + commands = 'c\nq' + + with support.temp_cwd() as cwd: + cwd = os.path.realpath(cwd) + dir_one = os.path.join(cwd, 'dir_one') + dir_two = os.path.join(cwd, 'dir_two') + expected = f'(Pdb) sys.path[0] is {dir_one}' + + os.mkdir(dir_one) + with open(os.path.join(dir_one, 'foo.py'), 'w') as f: + f.write(script) + os.mkdir(dir_two) + os.symlink(os.path.join(dir_one, 'foo.py'), os.path.join(dir_two, 'foo.py')) + + stdout, stderr = self._run_pdb([os.path.join('dir_two', 'foo.py')], commands) + + self.assertEqual(stdout.split('\n')[2].rstrip('\r'), expected) + + def test_issue42383(self): + with support.temp_cwd() as cwd: + with open('foo.py', 'w') as f: + s = textwrap.dedent(""" + print('The correct file was executed') + + import os + os.chdir("subdir") + """) + f.write(s) + + subdir = os.path.join(cwd, 'subdir') + os.mkdir(subdir) + os.mkdir(os.path.join(subdir, 'subdir')) + wrong_file = os.path.join(subdir, 'foo.py') + + with open(wrong_file, 'w') as f: + f.write('print("The wrong file was executed")') + + stdout, stderr = self._run_pdb(['foo.py'], 'c\nc\nq') + expected = '(Pdb) The correct file was executed' + self.assertEqual(stdout.split('\n')[6].rstrip('\r'), expected) + + def load_tests(*args): from test import test_pdb suites = [ diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py index 01c00369156b0f17a7f4e2c509e9fa212d601a99..55543de61971829d21ad4d57698c7f0f6801d278 100644 --- a/Lib/test/test_peepholer.py +++ b/Lib/test/test_peepholer.py @@ -1,7 +1,7 @@ import dis import unittest -from test.bytecode_helper import BytecodeTestCase +from test.support.bytecode_helper import BytecodeTestCase def count_instr_recursively(f, opname): @@ -65,14 +65,14 @@ def unot(x): self.check_lnotab(unot) def test_elim_inversion_of_is_or_in(self): - for line, cmp_op in ( - ('not a is b', 'is not',), - ('not a in b', 'not in',), - ('not a is not b', 'is',), - ('not a not in b', 'in',), + for line, cmp_op, invert in ( + ('not a is b', 'IS_OP', 1,), + ('not a is not b', 'IS_OP', 0,), + ('not a in b', 'CONTAINS_OP', 1,), + ('not a not in b', 'CONTAINS_OP', 0,), ): code = compile(line, '', 'single') - self.assertInBytecode(code, 'COMPARE_OP', cmp_op) + self.assertInBytecode(code, cmp_op, invert) self.check_lnotab(code) def test_global_as_constant(self): @@ -474,7 +474,7 @@ def f(): self.assertEqual(f(), 1) self.check_lnotab(f) - def test_if_with_if_expression(self): # XXX does this belong in 3.8? + def test_if_with_if_expression(self): # Check bpo-37289 def f(x): if (True if x else False): @@ -495,6 +495,20 @@ def f(x): return 6 self.check_lnotab(f) + def test_assignment_idiom_in_comprehensions(self): + def listcomp(): + return [y for x in a for y in [f(x)]] + self.assertEqual(count_instr_recursively(listcomp, 'FOR_ITER'), 1) + def setcomp(): + return {y for x in a for y in [f(x)]} + self.assertEqual(count_instr_recursively(setcomp, 'FOR_ITER'), 1) + def dictcomp(): + return {y: y for x in a for y in [f(x)]} + self.assertEqual(count_instr_recursively(dictcomp, 'FOR_ITER'), 1) + def genexpr(): + return (y for x in a for y in [f(x)]) + self.assertEqual(count_instr_recursively(genexpr, 'FOR_ITER'), 1) + class TestBuglets(unittest.TestCase): @@ -508,6 +522,13 @@ def f(): with self.assertRaises(ValueError): f() + def test_bpo_42057(self): + for i in range(10): + try: + raise Exception + except Exception or Exception: + pass + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_peg_generator/__init__.py b/Lib/test/test_peg_generator/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..fa855f2104c586e77b35a66635113387499ac818 --- /dev/null +++ b/Lib/test/test_peg_generator/__init__.py @@ -0,0 +1,7 @@ +import os + +from test.support import load_package_tests + +# Load all tests in package +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_peg_generator/__main__.py b/Lib/test/test_peg_generator/__main__.py new file mode 100644 index 0000000000000000000000000000000000000000..1fab1fddb5744543af12fca32dd8cc345174f747 --- /dev/null +++ b/Lib/test/test_peg_generator/__main__.py @@ -0,0 +1,4 @@ +import unittest +from . import load_tests + +unittest.main() diff --git a/Lib/test/test_peg_generator/test_c_parser.py b/Lib/test/test_peg_generator/test_c_parser.py new file mode 100644 index 0000000000000000000000000000000000000000..9701d4f9feb16b18d2a41971a40888fe1c1a1206 --- /dev/null +++ b/Lib/test/test_peg_generator/test_c_parser.py @@ -0,0 +1,452 @@ +import sysconfig +import textwrap +import unittest +from distutils.tests.support import TempdirManager +from pathlib import Path + +from test import test_tools +from test import support +from test.support.script_helper import assert_python_ok + +_py_cflags_nodist = sysconfig.get_config_var('PY_CFLAGS_NODIST') +_pgo_flag = sysconfig.get_config_var('PGO_PROF_USE_FLAG') +if _pgo_flag and _py_cflags_nodist and _pgo_flag in _py_cflags_nodist: + raise unittest.SkipTest("peg_generator test disabled under PGO build") + +test_tools.skip_if_missing("peg_generator") +with test_tools.imports_under_tool("peg_generator"): + from pegen.grammar_parser import GeneratedParser as GrammarParser + from pegen.testutil import ( + parse_string, + generate_parser_c_extension, + generate_c_parser_source, + ) + from pegen.ast_dump import ast_dump + + +TEST_TEMPLATE = """ +tmp_dir = {extension_path!r} + +import ast +import traceback +import sys +import unittest + +from test import test_tools +with test_tools.imports_under_tool("peg_generator"): + from pegen.ast_dump import ast_dump + +sys.path.insert(0, tmp_dir) +import parse + +class Tests(unittest.TestCase): + + def check_input_strings_for_grammar( + self, + valid_cases = (), + invalid_cases = (), + ): + if valid_cases: + for case in valid_cases: + parse.parse_string(case, mode=0) + + if invalid_cases: + for case in invalid_cases: + with self.assertRaises(SyntaxError): + parse.parse_string(case, mode=0) + + def verify_ast_generation(self, stmt): + expected_ast = ast.parse(stmt) + actual_ast = parse.parse_string(stmt, mode=1) + self.assertEqual(ast_dump(expected_ast), ast_dump(actual_ast)) + + def test_parse(self): + {test_source} + +unittest.main() +""" + + +class TestCParser(TempdirManager, unittest.TestCase): + def setUp(self): + cmd = support.missing_compiler_executable() + if cmd is not None: + self.skipTest("The %r command is not found" % cmd) + super(TestCParser, self).setUp() + self.tmp_path = self.mkdtemp() + change_cwd = support.change_cwd(self.tmp_path) + change_cwd.__enter__() + self.addCleanup(change_cwd.__exit__, None, None, None) + + def tearDown(self): + super(TestCParser, self).tearDown() + + def build_extension(self, grammar_source): + grammar = parse_string(grammar_source, GrammarParser) + generate_parser_c_extension(grammar, Path(self.tmp_path)) + + def run_test(self, grammar_source, test_source): + self.build_extension(grammar_source) + test_source = textwrap.indent(textwrap.dedent(test_source), 8 * " ") + assert_python_ok( + "-c", + TEST_TEMPLATE.format(extension_path=self.tmp_path, test_source=test_source), + ) + + def test_c_parser(self) -> None: + grammar_source = """ + start[mod_ty]: a=stmt* $ { Module(a, NULL, p->arena) } + stmt[stmt_ty]: a=expr_stmt { a } + expr_stmt[stmt_ty]: a=expression NEWLINE { _Py_Expr(a, EXTRA) } + expression[expr_ty]: ( l=expression '+' r=term { _Py_BinOp(l, Add, r, EXTRA) } + | l=expression '-' r=term { _Py_BinOp(l, Sub, r, EXTRA) } + | t=term { t } + ) + term[expr_ty]: ( l=term '*' r=factor { _Py_BinOp(l, Mult, r, EXTRA) } + | l=term '/' r=factor { _Py_BinOp(l, Div, r, EXTRA) } + | f=factor { f } + ) + factor[expr_ty]: ('(' e=expression ')' { e } + | a=atom { a } + ) + atom[expr_ty]: ( n=NAME { n } + | n=NUMBER { n } + | s=STRING { s } + ) + """ + test_source = """ + expressions = [ + "4+5", + "4-5", + "4*5", + "1+4*5", + "1+4/5", + "(1+1) + (1+1)", + "(1+1) - (1+1)", + "(1+1) * (1+1)", + "(1+1) / (1+1)", + ] + + for expr in expressions: + the_ast = parse.parse_string(expr, mode=1) + expected_ast = ast.parse(expr) + self.assertEqual(ast_dump(the_ast), ast_dump(expected_ast)) + """ + self.run_test(grammar_source, test_source) + + def test_lookahead(self) -> None: + grammar_source = """ + start: NAME &NAME expr NEWLINE? ENDMARKER + expr: NAME | NUMBER + """ + test_source = """ + valid_cases = ["foo bar"] + invalid_cases = ["foo 34"] + self.check_input_strings_for_grammar(valid_cases, invalid_cases) + """ + self.run_test(grammar_source, test_source) + + def test_negative_lookahead(self) -> None: + grammar_source = """ + start: NAME !NAME expr NEWLINE? ENDMARKER + expr: NAME | NUMBER + """ + test_source = """ + valid_cases = ["foo 34"] + invalid_cases = ["foo bar"] + self.check_input_strings_for_grammar(valid_cases, invalid_cases) + """ + self.run_test(grammar_source, test_source) + + def test_cut(self) -> None: + grammar_source = """ + start: X ~ Y Z | X Q S + X: 'x' + Y: 'y' + Z: 'z' + Q: 'q' + S: 's' + """ + test_source = """ + valid_cases = ["x y z"] + invalid_cases = ["x q s"] + self.check_input_strings_for_grammar(valid_cases, invalid_cases) + """ + self.run_test(grammar_source, test_source) + + def test_gather(self) -> None: + grammar_source = """ + start: ';'.pass_stmt+ NEWLINE + pass_stmt: 'pass' + """ + test_source = """ + valid_cases = ["pass", "pass; pass"] + invalid_cases = ["pass;", "pass; pass;"] + self.check_input_strings_for_grammar(valid_cases, invalid_cases) + """ + self.run_test(grammar_source, test_source) + + def test_left_recursion(self) -> None: + grammar_source = """ + start: expr NEWLINE + expr: ('-' term | expr '+' term | term) + term: NUMBER + """ + test_source = """ + valid_cases = ["-34", "34", "34 + 12", "1 + 1 + 2 + 3"] + self.check_input_strings_for_grammar(valid_cases) + """ + self.run_test(grammar_source, test_source) + + def test_advanced_left_recursive(self) -> None: + grammar_source = """ + start: NUMBER | sign start + sign: ['-'] + """ + test_source = """ + valid_cases = ["23", "-34"] + self.check_input_strings_for_grammar(valid_cases) + """ + self.run_test(grammar_source, test_source) + + def test_mutually_left_recursive(self) -> None: + grammar_source = """ + start: foo 'E' + foo: bar 'A' | 'B' + bar: foo 'C' | 'D' + """ + test_source = """ + valid_cases = ["B E", "D A C A E"] + self.check_input_strings_for_grammar(valid_cases) + """ + self.run_test(grammar_source, test_source) + + def test_nasty_mutually_left_recursive(self) -> None: + grammar_source = """ + start: target '=' + target: maybe '+' | NAME + maybe: maybe '-' | target + """ + test_source = """ + valid_cases = ["x ="] + invalid_cases = ["x - + ="] + self.check_input_strings_for_grammar(valid_cases, invalid_cases) + """ + self.run_test(grammar_source, test_source) + + def test_return_stmt_noexpr_action(self) -> None: + grammar_source = """ + start[mod_ty]: a=[statements] ENDMARKER { Module(a, NULL, p->arena) } + statements[asdl_seq*]: a=statement+ { a } + statement[stmt_ty]: simple_stmt + simple_stmt[stmt_ty]: small_stmt + small_stmt[stmt_ty]: return_stmt + return_stmt[stmt_ty]: a='return' NEWLINE { _Py_Return(NULL, EXTRA) } + """ + test_source = """ + stmt = "return" + self.verify_ast_generation(stmt) + """ + self.run_test(grammar_source, test_source) + + def test_gather_action_ast(self) -> None: + grammar_source = """ + start[mod_ty]: a=';'.pass_stmt+ NEWLINE ENDMARKER { Module(a, NULL, p->arena) } + pass_stmt[stmt_ty]: a='pass' { _Py_Pass(EXTRA)} + """ + test_source = """ + stmt = "pass; pass" + self.verify_ast_generation(stmt) + """ + self.run_test(grammar_source, test_source) + + def test_pass_stmt_action(self) -> None: + grammar_source = """ + start[mod_ty]: a=[statements] ENDMARKER { Module(a, NULL, p->arena) } + statements[asdl_seq*]: a=statement+ { a } + statement[stmt_ty]: simple_stmt + simple_stmt[stmt_ty]: small_stmt + small_stmt[stmt_ty]: pass_stmt + pass_stmt[stmt_ty]: a='pass' NEWLINE { _Py_Pass(EXTRA) } + """ + test_source = """ + stmt = "pass" + self.verify_ast_generation(stmt) + """ + self.run_test(grammar_source, test_source) + + def test_if_stmt_action(self) -> None: + grammar_source = """ + start[mod_ty]: a=[statements] ENDMARKER { Module(a, NULL, p->arena) } + statements[asdl_seq*]: a=statement+ { _PyPegen_seq_flatten(p, a) } + statement[asdl_seq*]: a=compound_stmt { _PyPegen_singleton_seq(p, a) } | simple_stmt + + simple_stmt[asdl_seq*]: a=small_stmt b=further_small_stmt* [';'] NEWLINE { _PyPegen_seq_insert_in_front(p, a, b) } + further_small_stmt[stmt_ty]: ';' a=small_stmt { a } + + block: simple_stmt | NEWLINE INDENT a=statements DEDENT { a } + + compound_stmt: if_stmt + + if_stmt: 'if' a=full_expression ':' b=block { _Py_If(a, b, NULL, EXTRA) } + + small_stmt[stmt_ty]: pass_stmt + + pass_stmt[stmt_ty]: a='pass' { _Py_Pass(EXTRA) } + + full_expression: NAME + """ + test_source = """ + stmt = "pass" + self.verify_ast_generation(stmt) + """ + self.run_test(grammar_source, test_source) + + def test_same_name_different_types(self) -> None: + grammar_source = """ + start[mod_ty]: a=import_from+ NEWLINE ENDMARKER { Module(a, NULL, p->arena)} + import_from[stmt_ty]: ( a='from' !'import' c=simple_name 'import' d=import_as_names_from { + _Py_ImportFrom(c->v.Name.id, d, 0, EXTRA) } + | a='from' '.' 'import' c=import_as_names_from { + _Py_ImportFrom(NULL, c, 1, EXTRA) } + ) + simple_name[expr_ty]: NAME + import_as_names_from[asdl_seq*]: a=','.import_as_name_from+ { a } + import_as_name_from[alias_ty]: a=NAME 'as' b=NAME { _Py_alias(((expr_ty) a)->v.Name.id, ((expr_ty) b)->v.Name.id, p->arena) } + """ + test_source = """ + for stmt in ("from a import b as c", "from . import a as b"): + expected_ast = ast.parse(stmt) + actual_ast = parse.parse_string(stmt, mode=1) + self.assertEqual(ast_dump(expected_ast), ast_dump(actual_ast)) + """ + self.run_test(grammar_source, test_source) + + def test_with_stmt_with_paren(self) -> None: + grammar_source = """ + start[mod_ty]: a=[statements] ENDMARKER { Module(a, NULL, p->arena) } + statements[asdl_seq*]: a=statement+ { _PyPegen_seq_flatten(p, a) } + statement[asdl_seq*]: a=compound_stmt { _PyPegen_singleton_seq(p, a) } + compound_stmt[stmt_ty]: with_stmt + with_stmt[stmt_ty]: ( + a='with' '(' b=','.with_item+ ')' ':' c=block { + _Py_With(b, _PyPegen_singleton_seq(p, c), NULL, EXTRA) } + ) + with_item[withitem_ty]: ( + e=NAME o=['as' t=NAME { t }] { _Py_withitem(e, _PyPegen_set_expr_context(p, o, Store), p->arena) } + ) + block[stmt_ty]: a=pass_stmt NEWLINE { a } | NEWLINE INDENT a=pass_stmt DEDENT { a } + pass_stmt[stmt_ty]: a='pass' { _Py_Pass(EXTRA) } + """ + test_source = """ + stmt = "with (\\n a as b,\\n c as d\\n): pass" + the_ast = parse.parse_string(stmt, mode=1) + self.assertTrue(ast_dump(the_ast).startswith( + "Module(body=[With(items=[withitem(context_expr=Name(id='a', ctx=Load()), optional_vars=Name(id='b', ctx=Store())), " + "withitem(context_expr=Name(id='c', ctx=Load()), optional_vars=Name(id='d', ctx=Store()))]" + )) + """ + self.run_test(grammar_source, test_source) + + def test_ternary_operator(self) -> None: + grammar_source = """ + start[mod_ty]: a=expr ENDMARKER { Module(a, NULL, p->arena) } + expr[asdl_seq*]: a=listcomp NEWLINE { _PyPegen_singleton_seq(p, _Py_Expr(a, EXTRA)) } + listcomp[expr_ty]: ( + a='[' b=NAME c=for_if_clauses d=']' { _Py_ListComp(b, c, EXTRA) } + ) + for_if_clauses[asdl_seq*]: ( + a=(y=[ASYNC] 'for' a=NAME 'in' b=NAME c=('if' z=NAME { z })* + { _Py_comprehension(_Py_Name(((expr_ty) a)->v.Name.id, Store, EXTRA), b, c, (y == NULL) ? 0 : 1, p->arena) })+ { a } + ) + """ + test_source = """ + stmt = "[i for i in a if b]" + self.verify_ast_generation(stmt) + """ + self.run_test(grammar_source, test_source) + + def test_syntax_error_for_string(self) -> None: + grammar_source = """ + start: expr+ NEWLINE? ENDMARKER + expr: NAME + """ + test_source = r""" + for text in ("a b 42 b a", "\u540d \u540d 42 \u540d \u540d"): + try: + parse.parse_string(text, mode=0) + except SyntaxError as e: + tb = traceback.format_exc() + self.assertTrue('File "", line 1' in tb) + self.assertTrue(f"SyntaxError: invalid syntax" in tb) + """ + self.run_test(grammar_source, test_source) + + def test_headers_and_trailer(self) -> None: + grammar_source = """ + @header 'SOME HEADER' + @subheader 'SOME SUBHEADER' + @trailer 'SOME TRAILER' + start: expr+ NEWLINE? ENDMARKER + expr: x=NAME + """ + grammar = parse_string(grammar_source, GrammarParser) + parser_source = generate_c_parser_source(grammar) + + self.assertTrue("SOME HEADER" in parser_source) + self.assertTrue("SOME SUBHEADER" in parser_source) + self.assertTrue("SOME TRAILER" in parser_source) + + def test_error_in_rules(self) -> None: + grammar_source = """ + start: expr+ NEWLINE? ENDMARKER + expr: NAME {PyTuple_New(-1)} + """ + # PyTuple_New raises SystemError if an invalid argument was passed. + test_source = """ + with self.assertRaises(SystemError): + parse.parse_string("a", mode=0) + """ + self.run_test(grammar_source, test_source) + + def test_no_soft_keywords(self) -> None: + grammar_source = """ + start: expr+ NEWLINE? ENDMARKER + expr: 'foo' + """ + grammar = parse_string(grammar_source, GrammarParser) + parser_source = generate_c_parser_source(grammar) + assert "expect_soft_keyword" not in parser_source + + def test_soft_keywords(self) -> None: + grammar_source = """ + start: expr+ NEWLINE? ENDMARKER + expr: "foo" + """ + grammar = parse_string(grammar_source, GrammarParser) + parser_source = generate_c_parser_source(grammar) + assert "expect_soft_keyword" in parser_source + + def test_soft_keywords_parse(self) -> None: + grammar_source = """ + start: "if" expr '+' expr NEWLINE + expr: NAME + """ + test_source = """ + valid_cases = ["if if + if"] + invalid_cases = ["if if"] + self.check_input_strings_for_grammar(valid_cases, invalid_cases) + """ + self.run_test(grammar_source, test_source) + + def test_soft_keywords_lookahead(self) -> None: + grammar_source = """ + start: &"if" "if" expr '+' expr NEWLINE + expr: NAME + """ + test_source = """ + valid_cases = ["if if + if"] + invalid_cases = ["if if"] + self.check_input_strings_for_grammar(valid_cases, invalid_cases) + """ + self.run_test(grammar_source, test_source) diff --git a/Lib/test/test_peg_generator/test_first_sets.py b/Lib/test/test_peg_generator/test_first_sets.py new file mode 100644 index 0000000000000000000000000000000000000000..425ee23aa1ab5db9936d63367ae62a794b3bd2be --- /dev/null +++ b/Lib/test/test_peg_generator/test_first_sets.py @@ -0,0 +1,225 @@ +import unittest + +from test import test_tools +from typing import Dict, Set + +test_tools.skip_if_missing('peg_generator') +with test_tools.imports_under_tool('peg_generator'): + from pegen.grammar_parser import GeneratedParser as GrammarParser + from pegen.testutil import parse_string + from pegen.first_sets import FirstSetCalculator + from pegen.grammar import Grammar + + +class TestFirstSets(unittest.TestCase): + def calculate_first_sets(self, grammar_source: str) -> Dict[str, Set[str]]: + grammar: Grammar = parse_string(grammar_source, GrammarParser) + return FirstSetCalculator(grammar.rules).calculate() + + def test_alternatives(self) -> None: + grammar = """ + start: expr NEWLINE? ENDMARKER + expr: A | B + A: 'a' | '-' + B: 'b' | '+' + """ + self.assertEqual(self.calculate_first_sets(grammar), { + "A": {"'a'", "'-'"}, + "B": {"'+'", "'b'"}, + "expr": {"'+'", "'a'", "'b'", "'-'"}, + "start": {"'+'", "'a'", "'b'", "'-'"}, + }) + + def test_optionals(self) -> None: + grammar = """ + start: expr NEWLINE + expr: ['a'] ['b'] 'c' + """ + self.assertEqual(self.calculate_first_sets(grammar), { + "expr": {"'c'", "'a'", "'b'"}, + "start": {"'c'", "'a'", "'b'"}, + }) + + def test_repeat_with_separator(self) -> None: + grammar = """ + start: ','.thing+ NEWLINE + thing: NUMBER + """ + self.assertEqual(self.calculate_first_sets(grammar), {"thing": {"NUMBER"}, "start": {"NUMBER"}}) + + def test_optional_operator(self) -> None: + grammar = """ + start: sum NEWLINE + sum: (term)? 'b' + term: NUMBER + """ + self.assertEqual(self.calculate_first_sets(grammar), { + "term": {"NUMBER"}, + "sum": {"NUMBER", "'b'"}, + "start": {"'b'", "NUMBER"}, + }) + + def test_optional_literal(self) -> None: + grammar = """ + start: sum NEWLINE + sum: '+' ? term + term: NUMBER + """ + self.assertEqual(self.calculate_first_sets(grammar), { + "term": {"NUMBER"}, + "sum": {"'+'", "NUMBER"}, + "start": {"'+'", "NUMBER"}, + }) + + def test_optional_after(self) -> None: + grammar = """ + start: term NEWLINE + term: NUMBER ['+'] + """ + self.assertEqual(self.calculate_first_sets(grammar), {"term": {"NUMBER"}, "start": {"NUMBER"}}) + + def test_optional_before(self) -> None: + grammar = """ + start: term NEWLINE + term: ['+'] NUMBER + """ + self.assertEqual(self.calculate_first_sets(grammar), {"term": {"NUMBER", "'+'"}, "start": {"NUMBER", "'+'"}}) + + def test_repeat_0(self) -> None: + grammar = """ + start: thing* "+" NEWLINE + thing: NUMBER + """ + self.assertEqual(self.calculate_first_sets(grammar), {"thing": {"NUMBER"}, "start": {'"+"', "NUMBER"}}) + + def test_repeat_0_with_group(self) -> None: + grammar = """ + start: ('+' '-')* term NEWLINE + term: NUMBER + """ + self.assertEqual(self.calculate_first_sets(grammar), {"term": {"NUMBER"}, "start": {"'+'", "NUMBER"}}) + + def test_repeat_1(self) -> None: + grammar = """ + start: thing+ '-' NEWLINE + thing: NUMBER + """ + self.assertEqual(self.calculate_first_sets(grammar), {"thing": {"NUMBER"}, "start": {"NUMBER"}}) + + def test_repeat_1_with_group(self) -> None: + grammar = """ + start: ('+' term)+ term NEWLINE + term: NUMBER + """ + self.assertEqual(self.calculate_first_sets(grammar), {"term": {"NUMBER"}, "start": {"'+'"}}) + + def test_gather(self) -> None: + grammar = """ + start: ','.thing+ NEWLINE + thing: NUMBER + """ + self.assertEqual(self.calculate_first_sets(grammar), {"thing": {"NUMBER"}, "start": {"NUMBER"}}) + + def test_positive_lookahead(self) -> None: + grammar = """ + start: expr NEWLINE + expr: &'a' opt + opt: 'a' | 'b' | 'c' + """ + self.assertEqual(self.calculate_first_sets(grammar), { + "expr": {"'a'"}, + "start": {"'a'"}, + "opt": {"'b'", "'c'", "'a'"}, + }) + + def test_negative_lookahead(self) -> None: + grammar = """ + start: expr NEWLINE + expr: !'a' opt + opt: 'a' | 'b' | 'c' + """ + self.assertEqual(self.calculate_first_sets(grammar), { + "opt": {"'b'", "'a'", "'c'"}, + "expr": {"'b'", "'c'"}, + "start": {"'b'", "'c'"}, + }) + + def test_left_recursion(self) -> None: + grammar = """ + start: expr NEWLINE + expr: ('-' term | expr '+' term | term) + term: NUMBER + foo: 'foo' + bar: 'bar' + baz: 'baz' + """ + self.assertEqual(self.calculate_first_sets(grammar), { + "expr": {"NUMBER", "'-'"}, + "term": {"NUMBER"}, + "start": {"NUMBER", "'-'"}, + "foo": {"'foo'"}, + "bar": {"'bar'"}, + "baz": {"'baz'"}, + }) + + def test_advance_left_recursion(self) -> None: + grammar = """ + start: NUMBER | sign start + sign: ['-'] + """ + self.assertEqual(self.calculate_first_sets(grammar), {"sign": {"'-'", ""}, "start": {"'-'", "NUMBER"}}) + + def test_mutual_left_recursion(self) -> None: + grammar = """ + start: foo 'E' + foo: bar 'A' | 'B' + bar: foo 'C' | 'D' + """ + self.assertEqual(self.calculate_first_sets(grammar), { + "foo": {"'D'", "'B'"}, + "bar": {"'D'"}, + "start": {"'D'", "'B'"}, + }) + + def test_nasty_left_recursion(self) -> None: + # TODO: Validate this + grammar = """ + start: target '=' + target: maybe '+' | NAME + maybe: maybe '-' | target + """ + self.assertEqual(self.calculate_first_sets(grammar), {"maybe": set(), "target": {"NAME"}, "start": {"NAME"}}) + + def test_nullable_rule(self) -> None: + grammar = """ + start: sign thing $ + sign: ['-'] + thing: NUMBER + """ + self.assertEqual(self.calculate_first_sets(grammar), { + "sign": {"", "'-'"}, + "thing": {"NUMBER"}, + "start": {"NUMBER", "'-'"}, + }) + + def test_epsilon_production_in_start_rule(self) -> None: + grammar = """ + start: ['-'] $ + """ + self.assertEqual(self.calculate_first_sets(grammar), {"start": {"ENDMARKER", "'-'"}}) + + def test_multiple_nullable_rules(self) -> None: + grammar = """ + start: sign thing other another $ + sign: ['-'] + thing: ['+'] + other: '*' + another: '/' + """ + self.assertEqual(self.calculate_first_sets(grammar), { + "sign": {"", "'-'"}, + "thing": {"'+'", ""}, + "start": {"'+'", "'-'", "'*'"}, + "other": {"'*'"}, + "another": {"'/'"}, + }) diff --git a/Lib/test/test_peg_generator/test_pegen.py b/Lib/test/test_peg_generator/test_pegen.py new file mode 100644 index 0000000000000000000000000000000000000000..bcfee3f2c5f8c318067b36f22aaf3c414ecce08b --- /dev/null +++ b/Lib/test/test_peg_generator/test_pegen.py @@ -0,0 +1,774 @@ +import io +import textwrap +import unittest + +from test import test_tools +from typing import Dict, Any +from tokenize import TokenInfo, NAME, NEWLINE, NUMBER, OP + +test_tools.skip_if_missing('peg_generator') +with test_tools.imports_under_tool('peg_generator'): + from pegen.grammar_parser import GeneratedParser as GrammarParser + from pegen.testutil import ( + parse_string, + generate_parser, + make_parser + ) + from pegen.grammar import GrammarVisitor, GrammarError, Grammar + from pegen.grammar_visualizer import ASTGrammarPrinter + from pegen.parser import Parser + from pegen.python_generator import PythonParserGenerator + + +class TestPegen(unittest.TestCase): + def test_parse_grammar(self) -> None: + grammar_source = """ + start: sum NEWLINE + sum: t1=term '+' t2=term { action } | term + term: NUMBER + """ + expected = """ + start: sum NEWLINE + sum: term '+' term | term + term: NUMBER + """ + grammar: Grammar = parse_string(grammar_source, GrammarParser) + rules = grammar.rules + self.assertEqual(str(grammar), textwrap.dedent(expected).strip()) + # Check the str() and repr() of a few rules; AST nodes don't support ==. + self.assertEqual(str(rules["start"]), "start: sum NEWLINE") + self.assertEqual(str(rules["sum"]), "sum: term '+' term | term") + expected_repr = "Rule('term', None, Rhs([Alt([NamedItem(None, NameLeaf('NUMBER'))])]))" + self.assertEqual(repr(rules["term"]), expected_repr) + + def test_long_rule_str(self) -> None: + grammar_source = """ + start: zero | one | one zero | one one | one zero zero | one zero one | one one zero | one one one + """ + expected = """ + start: + | zero + | one + | one zero + | one one + | one zero zero + | one zero one + | one one zero + | one one one + """ + grammar: Grammar = parse_string(grammar_source, GrammarParser) + self.assertEqual(str(grammar.rules["start"]), textwrap.dedent(expected).strip()) + + def test_typed_rules(self) -> None: + grammar = """ + start[int]: sum NEWLINE + sum[int]: t1=term '+' t2=term { action } | term + term[int]: NUMBER + """ + rules = parse_string(grammar, GrammarParser).rules + # Check the str() and repr() of a few rules; AST nodes don't support ==. + self.assertEqual(str(rules["start"]), "start: sum NEWLINE") + self.assertEqual(str(rules["sum"]), "sum: term '+' term | term") + self.assertEqual( + repr(rules["term"]), + "Rule('term', 'int', Rhs([Alt([NamedItem(None, NameLeaf('NUMBER'))])]))" + ) + + def test_gather(self) -> None: + grammar = """ + start: ','.thing+ NEWLINE + thing: NUMBER + """ + rules = parse_string(grammar, GrammarParser).rules + self.assertEqual(str(rules["start"]), "start: ','.thing+ NEWLINE") + self.assertTrue(repr(rules["start"]).startswith( + "Rule('start', None, Rhs([Alt([NamedItem(None, Gather(StringLeaf(\"','\"), NameLeaf('thing'" + )) + self.assertEqual(str(rules["thing"]), "thing: NUMBER") + parser_class = make_parser(grammar) + node = parse_string("42\n", parser_class) + assert node == [ + [[TokenInfo(NUMBER, string="42", start=(1, 0), end=(1, 2), line="42\n")]], + TokenInfo(NEWLINE, string="\n", start=(1, 2), end=(1, 3), line="42\n"), + ] + node = parse_string("1, 2\n", parser_class) + assert node == [ + [ + [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1, 2\n")], + [TokenInfo(NUMBER, string="2", start=(1, 3), end=(1, 4), line="1, 2\n")], + ], + TokenInfo(NEWLINE, string="\n", start=(1, 4), end=(1, 5), line="1, 2\n"), + ] + + def test_expr_grammar(self) -> None: + grammar = """ + start: sum NEWLINE + sum: term '+' term | term + term: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("42\n", parser_class) + self.assertEqual(node, [ + [[TokenInfo(NUMBER, string="42", start=(1, 0), end=(1, 2), line="42\n")]], + TokenInfo(NEWLINE, string="\n", start=(1, 2), end=(1, 3), line="42\n"), + ]) + + def test_optional_operator(self) -> None: + grammar = """ + start: sum NEWLINE + sum: term ('+' term)? + term: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("1+2\n", parser_class) + self.assertEqual(node, [ + [ + [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1+2\n")], + [ + TokenInfo(OP, string="+", start=(1, 1), end=(1, 2), line="1+2\n"), + [TokenInfo(NUMBER, string="2", start=(1, 2), end=(1, 3), line="1+2\n")], + ], + ], + TokenInfo(NEWLINE, string="\n", start=(1, 3), end=(1, 4), line="1+2\n"), + ]) + node = parse_string("1\n", parser_class) + self.assertEqual(node, [ + [[TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1\n")], None], + TokenInfo(NEWLINE, string="\n", start=(1, 1), end=(1, 2), line="1\n"), + ]) + + def test_optional_literal(self) -> None: + grammar = """ + start: sum NEWLINE + sum: term '+' ? + term: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("1+\n", parser_class) + self.assertEqual(node, [ + [ + [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1+\n")], + TokenInfo(OP, string="+", start=(1, 1), end=(1, 2), line="1+\n"), + ], + TokenInfo(NEWLINE, string="\n", start=(1, 2), end=(1, 3), line="1+\n"), + ]) + node = parse_string("1\n", parser_class) + self.assertEqual(node, [ + [[TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1\n")], None], + TokenInfo(NEWLINE, string="\n", start=(1, 1), end=(1, 2), line="1\n"), + ]) + + def test_alt_optional_operator(self) -> None: + grammar = """ + start: sum NEWLINE + sum: term ['+' term] + term: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("1 + 2\n", parser_class) + self.assertEqual(node, [ + [ + [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1 + 2\n")], + [ + TokenInfo(OP, string="+", start=(1, 2), end=(1, 3), line="1 + 2\n"), + [TokenInfo(NUMBER, string="2", start=(1, 4), end=(1, 5), line="1 + 2\n")], + ], + ], + TokenInfo(NEWLINE, string="\n", start=(1, 5), end=(1, 6), line="1 + 2\n"), + ]) + node = parse_string("1\n", parser_class) + self.assertEqual(node, [ + [[TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1\n")], None], + TokenInfo(NEWLINE, string="\n", start=(1, 1), end=(1, 2), line="1\n"), + ]) + + def test_repeat_0_simple(self) -> None: + grammar = """ + start: thing thing* NEWLINE + thing: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("1 2 3\n", parser_class) + self.assertEqual(node, [ + [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1 2 3\n")], + [ + [[TokenInfo(NUMBER, string="2", start=(1, 2), end=(1, 3), line="1 2 3\n")]], + [[TokenInfo(NUMBER, string="3", start=(1, 4), end=(1, 5), line="1 2 3\n")]], + ], + TokenInfo(NEWLINE, string="\n", start=(1, 5), end=(1, 6), line="1 2 3\n"), + ]) + node = parse_string("1\n", parser_class) + self.assertEqual(node, [ + [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1\n")], + [], + TokenInfo(NEWLINE, string="\n", start=(1, 1), end=(1, 2), line="1\n"), + ]) + + def test_repeat_0_complex(self) -> None: + grammar = """ + start: term ('+' term)* NEWLINE + term: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("1 + 2 + 3\n", parser_class) + self.assertEqual(node, [ + [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1 + 2 + 3\n")], + [ + [ + [ + TokenInfo(OP, string="+", start=(1, 2), end=(1, 3), line="1 + 2 + 3\n"), + [TokenInfo(NUMBER, string="2", start=(1, 4), end=(1, 5), line="1 + 2 + 3\n")], + ] + ], + [ + [ + TokenInfo(OP, string="+", start=(1, 6), end=(1, 7), line="1 + 2 + 3\n"), + [TokenInfo(NUMBER, string="3", start=(1, 8), end=(1, 9), line="1 + 2 + 3\n")], + ] + ], + ], + TokenInfo(NEWLINE, string="\n", start=(1, 9), end=(1, 10), line="1 + 2 + 3\n"), + ]) + + def test_repeat_1_simple(self) -> None: + grammar = """ + start: thing thing+ NEWLINE + thing: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("1 2 3\n", parser_class) + self.assertEqual(node, [ + [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1 2 3\n")], + [ + [[TokenInfo(NUMBER, string="2", start=(1, 2), end=(1, 3), line="1 2 3\n")]], + [[TokenInfo(NUMBER, string="3", start=(1, 4), end=(1, 5), line="1 2 3\n")]], + ], + TokenInfo(NEWLINE, string="\n", start=(1, 5), end=(1, 6), line="1 2 3\n"), + ]) + with self.assertRaises(SyntaxError): + parse_string("1\n", parser_class) + + def test_repeat_1_complex(self) -> None: + grammar = """ + start: term ('+' term)+ NEWLINE + term: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("1 + 2 + 3\n", parser_class) + self.assertEqual(node, [ + [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1 + 2 + 3\n")], + [ + [ + [ + TokenInfo(OP, string="+", start=(1, 2), end=(1, 3), line="1 + 2 + 3\n"), + [TokenInfo(NUMBER, string="2", start=(1, 4), end=(1, 5), line="1 + 2 + 3\n")], + ] + ], + [ + [ + TokenInfo(OP, string="+", start=(1, 6), end=(1, 7), line="1 + 2 + 3\n"), + [TokenInfo(NUMBER, string="3", start=(1, 8), end=(1, 9), line="1 + 2 + 3\n")], + ] + ], + ], + TokenInfo(NEWLINE, string="\n", start=(1, 9), end=(1, 10), line="1 + 2 + 3\n"), + ]) + with self.assertRaises(SyntaxError): + parse_string("1\n", parser_class) + + def test_repeat_with_sep_simple(self) -> None: + grammar = """ + start: ','.thing+ NEWLINE + thing: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("1, 2, 3\n", parser_class) + self.assertEqual(node, [ + [ + [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1, 2, 3\n")], + [TokenInfo(NUMBER, string="2", start=(1, 3), end=(1, 4), line="1, 2, 3\n")], + [TokenInfo(NUMBER, string="3", start=(1, 6), end=(1, 7), line="1, 2, 3\n")], + ], + TokenInfo(NEWLINE, string="\n", start=(1, 7), end=(1, 8), line="1, 2, 3\n"), + ]) + + def test_left_recursive(self) -> None: + grammar_source = """ + start: expr NEWLINE + expr: ('-' term | expr '+' term | term) + term: NUMBER + foo: NAME+ + bar: NAME* + baz: NAME? + """ + grammar: Grammar = parse_string(grammar_source, GrammarParser) + parser_class = generate_parser(grammar) + rules = grammar.rules + self.assertFalse(rules["start"].left_recursive) + self.assertTrue(rules["expr"].left_recursive) + self.assertFalse(rules["term"].left_recursive) + self.assertFalse(rules["foo"].left_recursive) + self.assertFalse(rules["bar"].left_recursive) + self.assertFalse(rules["baz"].left_recursive) + node = parse_string("1 + 2 + 3\n", parser_class) + self.assertEqual(node, [ + [ + [ + [[TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1 + 2 + 3\n")]], + TokenInfo(OP, string="+", start=(1, 2), end=(1, 3), line="1 + 2 + 3\n"), + [TokenInfo(NUMBER, string="2", start=(1, 4), end=(1, 5), line="1 + 2 + 3\n")], + ], + TokenInfo(OP, string="+", start=(1, 6), end=(1, 7), line="1 + 2 + 3\n"), + [TokenInfo(NUMBER, string="3", start=(1, 8), end=(1, 9), line="1 + 2 + 3\n")], + ], + TokenInfo(NEWLINE, string="\n", start=(1, 9), end=(1, 10), line="1 + 2 + 3\n"), + ]) + + def test_python_expr(self) -> None: + grammar = """ + start: expr NEWLINE? $ { ast.Expression(expr, lineno=1, col_offset=0) } + expr: ( expr '+' term { ast.BinOp(expr, ast.Add(), term, lineno=expr.lineno, col_offset=expr.col_offset, end_lineno=term.end_lineno, end_col_offset=term.end_col_offset) } + | expr '-' term { ast.BinOp(expr, ast.Sub(), term, lineno=expr.lineno, col_offset=expr.col_offset, end_lineno=term.end_lineno, end_col_offset=term.end_col_offset) } + | term { term } + ) + term: ( l=term '*' r=factor { ast.BinOp(l, ast.Mult(), r, lineno=l.lineno, col_offset=l.col_offset, end_lineno=r.end_lineno, end_col_offset=r.end_col_offset) } + | l=term '/' r=factor { ast.BinOp(l, ast.Div(), r, lineno=l.lineno, col_offset=l.col_offset, end_lineno=r.end_lineno, end_col_offset=r.end_col_offset) } + | factor { factor } + ) + factor: ( '(' expr ')' { expr } + | atom { atom } + ) + atom: ( n=NAME { ast.Name(id=n.string, ctx=ast.Load(), lineno=n.start[0], col_offset=n.start[1], end_lineno=n.end[0], end_col_offset=n.end[1]) } + | n=NUMBER { ast.Constant(value=ast.literal_eval(n.string), lineno=n.start[0], col_offset=n.start[1], end_lineno=n.end[0], end_col_offset=n.end[1]) } + ) + """ + parser_class = make_parser(grammar) + node = parse_string("(1 + 2*3 + 5)/(6 - 2)\n", parser_class) + code = compile(node, "", "eval") + val = eval(code) + self.assertEqual(val, 3.0) + + def test_nullable(self) -> None: + grammar_source = """ + start: sign NUMBER + sign: ['-' | '+'] + """ + grammar: Grammar = parse_string(grammar_source, GrammarParser) + out = io.StringIO() + genr = PythonParserGenerator(grammar, out) + rules = grammar.rules + self.assertFalse(rules["start"].nullable) # Not None! + self.assertTrue(rules["sign"].nullable) + + def test_advanced_left_recursive(self) -> None: + grammar_source = """ + start: NUMBER | sign start + sign: ['-'] + """ + grammar: Grammar = parse_string(grammar_source, GrammarParser) + out = io.StringIO() + genr = PythonParserGenerator(grammar, out) + rules = grammar.rules + self.assertFalse(rules["start"].nullable) # Not None! + self.assertTrue(rules["sign"].nullable) + self.assertTrue(rules["start"].left_recursive) + self.assertFalse(rules["sign"].left_recursive) + + def test_mutually_left_recursive(self) -> None: + grammar_source = """ + start: foo 'E' + foo: bar 'A' | 'B' + bar: foo 'C' | 'D' + """ + grammar: Grammar = parse_string(grammar_source, GrammarParser) + out = io.StringIO() + genr = PythonParserGenerator(grammar, out) + rules = grammar.rules + self.assertFalse(rules["start"].left_recursive) + self.assertTrue(rules["foo"].left_recursive) + self.assertTrue(rules["bar"].left_recursive) + genr.generate("") + ns: Dict[str, Any] = {} + exec(out.getvalue(), ns) + parser_class: Type[Parser] = ns["GeneratedParser"] + node = parse_string("D A C A E", parser_class) + self.assertEqual(node, [ + [ + [ + [ + [TokenInfo(type=NAME, string="D", start=(1, 0), end=(1, 1), line="D A C A E")], + TokenInfo(type=NAME, string="A", start=(1, 2), end=(1, 3), line="D A C A E"), + ], + TokenInfo(type=NAME, string="C", start=(1, 4), end=(1, 5), line="D A C A E"), + ], + TokenInfo(type=NAME, string="A", start=(1, 6), end=(1, 7), line="D A C A E"), + ], + TokenInfo(type=NAME, string="E", start=(1, 8), end=(1, 9), line="D A C A E"), + ]) + node = parse_string("B C A E", parser_class) + self.assertIsNotNone(node) + self.assertEqual(node, [ + [ + [ + [TokenInfo(type=NAME, string="B", start=(1, 0), end=(1, 1), line="B C A E")], + TokenInfo(type=NAME, string="C", start=(1, 2), end=(1, 3), line="B C A E"), + ], + TokenInfo(type=NAME, string="A", start=(1, 4), end=(1, 5), line="B C A E"), + ], + TokenInfo(type=NAME, string="E", start=(1, 6), end=(1, 7), line="B C A E"), + ]) + + def test_nasty_mutually_left_recursive(self) -> None: + # This grammar does not recognize 'x - + =', much to my chagrin. + # But that's the way PEG works. + # [Breathlessly] + # The problem is that the toplevel target call + # recurses into maybe, which recognizes 'x - +', + # and then the toplevel target looks for another '+', + # which fails, so it retreats to NAME, + # which succeeds, so we end up just recognizing 'x', + # and then start fails because there's no '=' after that. + grammar_source = """ + start: target '=' + target: maybe '+' | NAME + maybe: maybe '-' | target + """ + grammar: Grammar = parse_string(grammar_source, GrammarParser) + out = io.StringIO() + genr = PythonParserGenerator(grammar, out) + genr.generate("") + ns: Dict[str, Any] = {} + exec(out.getvalue(), ns) + parser_class = ns["GeneratedParser"] + with self.assertRaises(SyntaxError): + parse_string("x - + =", parser_class) + + def test_lookahead(self) -> None: + grammar = """ + start: (expr_stmt | assign_stmt) &'.' + expr_stmt: !(target '=') expr + assign_stmt: target '=' expr + expr: term ('+' term)* + target: NAME + term: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("foo = 12 + 12 .", parser_class) + self.assertEqual(node, [ + [ + [ + [TokenInfo(NAME, string="foo", start=(1, 0), end=(1, 3), line="foo = 12 + 12 .")], + TokenInfo(OP, string="=", start=(1, 4), end=(1, 5), line="foo = 12 + 12 ."), + [ + [ + TokenInfo( + NUMBER, string="12", start=(1, 6), end=(1, 8), line="foo = 12 + 12 ." + ) + ], + [ + [ + [ + TokenInfo( + OP, + string="+", + start=(1, 9), + end=(1, 10), + line="foo = 12 + 12 .", + ), + [ + TokenInfo( + NUMBER, + string="12", + start=(1, 11), + end=(1, 13), + line="foo = 12 + 12 .", + ) + ], + ] + ] + ], + ], + ] + ] + ]) + + def test_named_lookahead_error(self) -> None: + grammar = """ + start: foo=!'x' NAME + """ + with self.assertRaises(SyntaxError): + make_parser(grammar) + + def test_start_leader(self) -> None: + grammar = """ + start: attr | NAME + attr: start '.' NAME + """ + # Would assert False without a special case in compute_left_recursives(). + make_parser(grammar) + + def test_opt_sequence(self) -> None: + grammar = """ + start: [NAME*] + """ + # This case was failing because of a double trailing comma at the end + # of a line in the generated source. See bpo-41044 + make_parser(grammar) + + def test_left_recursion_too_complex(self) -> None: + grammar = """ + start: foo + foo: bar '+' | baz '+' | '+' + bar: baz '-' | foo '-' | '-' + baz: foo '*' | bar '*' | '*' + """ + with self.assertRaises(ValueError) as errinfo: + make_parser(grammar) + self.assertTrue("no leader" in str(errinfo.exception.value)) + + def test_cut(self) -> None: + grammar = """ + start: '(' ~ expr ')' + expr: NUMBER + """ + parser_class = make_parser(grammar) + node = parse_string("(1)", parser_class) + self.assertEqual(node, [ + TokenInfo(OP, string="(", start=(1, 0), end=(1, 1), line="(1)"), + [TokenInfo(NUMBER, string="1", start=(1, 1), end=(1, 2), line="(1)")], + TokenInfo(OP, string=")", start=(1, 2), end=(1, 3), line="(1)"), + ]) + + def test_dangling_reference(self) -> None: + grammar = """ + start: foo ENDMARKER + foo: bar NAME + """ + with self.assertRaises(GrammarError): + parser_class = make_parser(grammar) + + def test_bad_token_reference(self) -> None: + grammar = """ + start: foo + foo: NAMEE + """ + with self.assertRaises(GrammarError): + parser_class = make_parser(grammar) + + def test_missing_start(self) -> None: + grammar = """ + foo: NAME + """ + with self.assertRaises(GrammarError): + parser_class = make_parser(grammar) + + def test_invalid_rule_name(self) -> None: + grammar = """ + start: _a b + _a: 'a' + b: 'b' + """ + with self.assertRaisesRegex(GrammarError, "cannot start with underscore: '_a'"): + parser_class = make_parser(grammar) + + def test_invalid_variable_name(self) -> None: + grammar = """ + start: a b + a: _x='a' + b: 'b' + """ + with self.assertRaisesRegex(GrammarError, "cannot start with underscore: '_x'"): + parser_class = make_parser(grammar) + + def test_invalid_variable_name_in_temporal_rule(self) -> None: + grammar = """ + start: a b + a: (_x='a' | 'b') | 'c' + b: 'b' + """ + with self.assertRaisesRegex(GrammarError, "cannot start with underscore: '_x'"): + parser_class = make_parser(grammar) + + +class TestGrammarVisitor: + class Visitor(GrammarVisitor): + def __init__(self) -> None: + self.n_nodes = 0 + + def visit(self, node: Any, *args: Any, **kwargs: Any) -> None: + self.n_nodes += 1 + super().visit(node, *args, **kwargs) + + def test_parse_trivial_grammar(self) -> None: + grammar = """ + start: 'a' + """ + rules = parse_string(grammar, GrammarParser) + visitor = self.Visitor() + + visitor.visit(rules) + + self.assertEqual(visitor.n_nodes, 6) + + def test_parse_or_grammar(self) -> None: + grammar = """ + start: rule + rule: 'a' | 'b' + """ + rules = parse_string(grammar, GrammarParser) + visitor = self.Visitor() + + visitor.visit(rules) + + # Grammar/Rule/Rhs/Alt/NamedItem/NameLeaf -> 6 + # Rule/Rhs/ -> 2 + # Alt/NamedItem/StringLeaf -> 3 + # Alt/NamedItem/StringLeaf -> 3 + + self.assertEqual(visitor.n_nodes, 14) + + def test_parse_repeat1_grammar(self) -> None: + grammar = """ + start: 'a'+ + """ + rules = parse_string(grammar, GrammarParser) + visitor = self.Visitor() + + visitor.visit(rules) + + # Grammar/Rule/Rhs/Alt/NamedItem/Repeat1/StringLeaf -> 6 + self.assertEqual(visitor.n_nodes, 7) + + def test_parse_repeat0_grammar(self) -> None: + grammar = """ + start: 'a'* + """ + rules = parse_string(grammar, GrammarParser) + visitor = self.Visitor() + + visitor.visit(rules) + + # Grammar/Rule/Rhs/Alt/NamedItem/Repeat0/StringLeaf -> 6 + + self.assertEqual(visitor.n_nodes, 7) + + def test_parse_optional_grammar(self) -> None: + grammar = """ + start: 'a' ['b'] + """ + rules = parse_string(grammar, GrammarParser) + visitor = self.Visitor() + + visitor.visit(rules) + + # Grammar/Rule/Rhs/Alt/NamedItem/StringLeaf -> 6 + # NamedItem/Opt/Rhs/Alt/NamedItem/Stringleaf -> 6 + + self.assertEqual(visitor.n_nodes, 12) + + +class TestGrammarVisualizer(unittest.TestCase): + def test_simple_rule(self) -> None: + grammar = """ + start: 'a' 'b' + """ + rules = parse_string(grammar, GrammarParser) + + printer = ASTGrammarPrinter() + lines: List[str] = [] + printer.print_grammar_ast(rules, printer=lines.append) + + output = "\n".join(lines) + expected_output = textwrap.dedent( + """\ + └──Rule + └──Rhs + └──Alt + ├──NamedItem + │ └──StringLeaf("'a'") + └──NamedItem + └──StringLeaf("'b'") + """ + ) + + self.assertEqual(output, expected_output) + + def test_multiple_rules(self) -> None: + grammar = """ + start: a b + a: 'a' + b: 'b' + """ + rules = parse_string(grammar, GrammarParser) + + printer = ASTGrammarPrinter() + lines: List[str] = [] + printer.print_grammar_ast(rules, printer=lines.append) + + output = "\n".join(lines) + expected_output = textwrap.dedent( + """\ + └──Rule + └──Rhs + └──Alt + ├──NamedItem + │ └──NameLeaf('a') + └──NamedItem + └──NameLeaf('b') + + └──Rule + └──Rhs + └──Alt + └──NamedItem + └──StringLeaf("'a'") + + └──Rule + └──Rhs + └──Alt + └──NamedItem + └──StringLeaf("'b'") + """ + ) + + self.assertEqual(output, expected_output) + + def test_deep_nested_rule(self) -> None: + grammar = """ + start: 'a' ['b'['c'['d']]] + """ + rules = parse_string(grammar, GrammarParser) + + printer = ASTGrammarPrinter() + lines: List[str] = [] + printer.print_grammar_ast(rules, printer=lines.append) + + output = "\n".join(lines) + expected_output = textwrap.dedent( + """\ + └──Rule + └──Rhs + └──Alt + ├──NamedItem + │ └──StringLeaf("'a'") + └──NamedItem + └──Opt + └──Rhs + └──Alt + ├──NamedItem + │ └──StringLeaf("'b'") + └──NamedItem + └──Opt + └──Rhs + └──Alt + ├──NamedItem + │ └──StringLeaf("'c'") + └──NamedItem + └──Opt + └──Rhs + └──Alt + └──NamedItem + └──StringLeaf("'d'") + """ + ) + + self.assertEqual(output, expected_output) diff --git a/Lib/test/test_peg_parser.py b/Lib/test/test_peg_parser.py new file mode 100644 index 0000000000000000000000000000000000000000..f4aaef848d54fe20714aa8a4aa7b4961869c51c1 --- /dev/null +++ b/Lib/test/test_peg_parser.py @@ -0,0 +1,803 @@ +import ast +import _peg_parser as peg_parser +import unittest +from typing import Any, Union, Iterable, Tuple +from textwrap import dedent +from test import support + + +TEST_CASES = [ + ('annotated_assignment', 'x: int = 42'), + ('annotated_assignment_with_tuple', 'x: tuple = 1, 2'), + ('annotated_assignment_with_parens', '(paren): int = 3+2'), + ('annotated_assignment_with_yield', 'x: int = yield 42'), + ('annotated_no_assignment', 'x: int'), + ('annotation_with_multiple_parens', '((parens)): int'), + ('annotation_with_parens', '(parens): int'), + ('annotated_assignment_with_attr', 'a.b: int'), + ('annotated_assignment_with_subscript', 'a[b]: int'), + ('annotated_assignment_with_attr_and_parens', '(a.b): int'), + ('annotated_assignment_with_subscript_and_parens', '(a[b]): int'), + ('assert', 'assert a'), + ('assert_message', 'assert a, b'), + ('assignment_false', 'a = False'), + ('assignment_none', 'a = None'), + ('assignment_true', 'a = True'), + ('assignment_paren', '(a) = 42'), + ('assignment_paren_multiple', '(a, b) = (0, 1)'), + ('asyncfor', + ''' + async for i in a: + pass + '''), + ('attribute_call', 'a.b()'), + ('attribute_multiple_names', 'abcd.efg.hij'), + ('attribute_simple', 'a.b'), + ('attributes_subscript', 'a.b[0]'), + ('augmented_assignment', 'x += 42'), + ('augmented_assignment_attribute', 'a.b.c += 42'), + ('augmented_assignment_paren', '(x) += 42'), + ('augmented_assignment_paren_subscript', '(x[0]) -= 42'), + ('binop_add', '1 + 1'), + ('binop_add_multiple', '1 + 1 + 1 + 1'), + ('binop_all', '1 + 2 * 5 + 3 ** 2 - -3'), + ('binop_boolop_comp', '1 + 1 == 2 or 1 + 1 == 3 and not b'), + ('boolop_or', 'a or b'), + ('boolop_or_multiple', 'a or b or c'), + ('class_def_bases', + ''' + class C(A, B): + pass + '''), + ('class_def_decorators', + ''' + @a + class C: + pass + '''), + ('class_def_decorator_with_expression', + ''' + @lambda x: 42 + class C: + pass + '''), + ('class_def_decorator_with_expression_and_walrus', + ''' + @x:=lambda x: 42 + class C: + pass + '''), + + ('class_def_keywords', + ''' + class C(keyword=a+b, **c): + pass + '''), + ('class_def_mixed', + ''' + class C(A, B, keyword=0, **a): + pass + '''), + ('class_def_simple', + ''' + class C: + pass + '''), + ('class_def_starred_and_kwarg', + ''' + class C(A, B, *x, **y): + pass + '''), + ('class_def_starred_in_kwargs', + ''' + class C(A, x=2, *[B, C], y=3): + pass + '''), + ('call_attribute', 'f().b'), + ('call_genexp', 'f(i for i in a)'), + ('call_mixed_args', 'f(a, b, *c, **d)'), + ('call_mixed_args_named', 'f(a, b, *c, d=4, **v)'), + ('call_one_arg', 'f(a)'), + ('call_posarg_genexp', 'f(a, (i for i in a))'), + ('call_simple', 'f()'), + ('call_subscript', 'f()[0]'), + ('comp', 'a == b'), + ('comp_multiple', 'a == b == c'), + ('comp_paren_end', 'a == (b-1)'), + ('comp_paren_start', '(a-1) == b'), + ('decorator', + ''' + @a + def f(): + pass + '''), + ('decorator_async', + ''' + @a + async def d(): + pass + '''), + ('decorator_with_expression', + ''' + @lambda x: 42 + def f(): + pass + '''), + ('decorator_with_expression_and_walrus', + ''' + @x:=lambda x: 42 + def f(): + pass + '''), + ('del_attribute', 'del a.b'), + ('del_call_attribute', 'del a().c'), + ('del_call_genexp_attribute', 'del a(i for i in b).c'), + ('del_empty', 'del()'), + ('del_list', 'del a, [b, c]'), + ('del_mixed', 'del a[0].b().c'), + ('del_multiple', 'del a, b'), + ('del_multiple_calls_attribute', 'del a()().b'), + ('del_paren', 'del(a,b)'), + ('del_paren_single_target', 'del(a)'), + ('del_subscript_attribute', 'del a[0].b'), + ('del_tuple', 'del a, (b, c)'), + ('delete', 'del a'), + ('dict', + ''' + { + a: 1, + b: 2, + c: 3 + } + '''), + ('dict_comp', '{x:1 for x in a}'), + ('dict_comp_if', '{x:1+2 for x in a if b}'), + ('dict_empty', '{}'), + ('empty_line_after_linecont', + r''' + pass + \ + + pass + '''), + ('for', + ''' + for i in a: + pass + '''), + ('for_else', + ''' + for i in a: + pass + else: + pass + '''), + ('for_star_target_in_paren', 'for (a) in b: pass'), + ('for_star_targets_attribute', 'for a.b in c: pass'), + ('for_star_targets_call_attribute', 'for a().c in b: pass'), + ('for_star_targets_empty', 'for () in a: pass'), + ('for_star_targets_mixed', 'for a[0].b().c in d: pass'), + ('for_star_targets_mixed_starred', + ''' + for a, *b, (c, d) in e: + pass + '''), + ('for_star_targets_multiple', 'for a, b in c: pass'), + ('for_star_targets_nested_starred', 'for *[*a] in b: pass'), + ('for_star_targets_starred', 'for *a in b: pass'), + ('for_star_targets_subscript_attribute', 'for a[0].b in c: pass'), + ('for_star_targets_trailing_comma', + ''' + for a, (b, c), in d: + pass + '''), + ('for_star_targets_tuple', 'for a, (b, c) in d: pass'), + ('for_underscore', + ''' + for _ in a: + pass + '''), + ('function_return_type', + ''' + def f() -> Any: + pass + '''), + ('f-string_slice', "f'{x[2]}'"), + ('f-string_slice_upper', "f'{x[2:3]}'"), + ('f-string_slice_step', "f'{x[2:3:-2]}'"), + ('f-string_constant', "f'{42}'"), + ('f-string_boolop', "f'{x and y}'"), + ('f-string_named_expr', "f'{(x:=42)}'"), + ('f-string_binop', "f'{x+y}'"), + ('f-string_unaryop', "f'{not x}'"), + ('f-string_lambda', "f'{(lambda x, /, y, y2=42 , *z, k1, k2=34, **k3: 42)}'"), + ('f-string_lambda_call', "f'{(lambda: 2)(2)}'"), + ('f-string_ifexpr', "f'{x if y else z}'"), + ('f-string_dict', "f'{ {2:34, 3:34} }'"), + ('f-string_set', "f'{ {2,-45} }'"), + ('f-string_list', "f'{ [2,-45] }'"), + ('f-string_tuple', "f'{ (2,-45) }'"), + ('f-string_listcomp', "f'{[x for x in y if z]}'"), + ('f-string_setcomp', "f'{ {x for x in y if z} }'"), + ('f-string_dictcomp', "f'{ {x:x for x in y if z} }'"), + ('f-string_genexpr', "f'{ (x for x in y if z) }'"), + ('f-string_yield', "f'{ (yield x) }'"), + ('f-string_yieldfrom', "f'{ (yield from x) }'"), + ('f-string_await', "f'{ await x }'"), + ('f-string_compare', "f'{ x == y }'"), + ('f-string_call', "f'{ f(x,y,z) }'"), + ('f-string_attribute', "f'{ f.x.y.z }'"), + ('f-string_starred', "f'{ *x, }'"), + ('f-string_doublestarred', "f'{ {**x} }'"), + ('f-string_escape_brace', "f'{{Escape'"), + ('f-string_escape_closing_brace', "f'Escape}}'"), + ('f-string_repr', "f'{a!r}'"), + ('f-string_str', "f'{a!s}'"), + ('f-string_ascii', "f'{a!a}'"), + ('f-string_debug', "f'{a=}'"), + ('f-string_padding', "f'{a:03d}'"), + ('f-string_multiline', + """ + f''' + {hello} + ''' + """), + ('f-string_multiline_in_expr', + """ + f''' + { + hello + } + ''' + """), + ('f-string_multiline_in_call', + """ + f''' + {f( + a, b, c + )} + ''' + """), + ('global', 'global a, b'), + ('group', '(yield a)'), + ('if_elif', + ''' + if a: + pass + elif b: + pass + '''), + ('if_elif_elif', + ''' + if a: + pass + elif b: + pass + elif c: + pass + '''), + ('if_elif_else', + ''' + if a: + pass + elif b: + pass + else: + pass + '''), + ('if_else', + ''' + if a: + pass + else: + pass + '''), + ('if_simple', 'if a: pass'), + ('import', 'import a'), + ('import_alias', 'import a as b'), + ('import_dotted', 'import a.b'), + ('import_dotted_alias', 'import a.b as c'), + ('import_dotted_multichar', 'import ab.cd'), + ('import_from', 'from a import b'), + ('import_from_alias', 'from a import b as c'), + ('import_from_dotted', 'from a.b import c'), + ('import_from_dotted_alias', 'from a.b import c as d'), + ('import_from_multiple_aliases', 'from a import b as c, d as e'), + ('import_from_one_dot', 'from .a import b'), + ('import_from_one_dot_alias', 'from .a import b as c'), + ('import_from_star', 'from a import *'), + ('import_from_three_dots', 'from ...a import b'), + ('import_from_trailing_comma', 'from a import (b,)'), + ('kwarg', + ''' + def f(**a): + pass + '''), + ('kwonly_args', + ''' + def f(*, a, b): + pass + '''), + ('kwonly_args_with_default', + ''' + def f(*, a=2, b): + pass + '''), + ('lambda_kwarg', 'lambda **a: 42'), + ('lambda_kwonly_args', 'lambda *, a, b: 42'), + ('lambda_kwonly_args_with_default', 'lambda *, a=2, b: 42'), + ('lambda_mixed_args', 'lambda a, /, b, *, c: 42'), + ('lambda_mixed_args_with_default', 'lambda a, b=2, /, c=3, *e, f, **g: 42'), + ('lambda_no_args', 'lambda: 42'), + ('lambda_pos_args', 'lambda a,b: 42'), + ('lambda_pos_args_with_default', 'lambda a, b=2: 42'), + ('lambda_pos_only_args', 'lambda a, /: 42'), + ('lambda_pos_only_args_with_default', 'lambda a=0, /: 42'), + ('lambda_pos_posonly_args', 'lambda a, b, /, c, d: 42'), + ('lambda_pos_posonly_args_with_default', 'lambda a, b=0, /, c=2: 42'), + ('lambda_vararg', 'lambda *a: 42'), + ('lambda_vararg_kwonly_args', 'lambda *a, b: 42'), + ('list', '[1, 2, a]'), + ('list_comp', '[i for i in a]'), + ('list_comp_if', '[i for i in a if b]'), + ('list_trailing_comma', '[1+2, a, 3+4,]'), + ('mixed_args', + ''' + def f(a, /, b, *, c): + pass + '''), + ('mixed_args_with_default', + ''' + def f(a, b=2, /, c=3, *e, f, **g): + pass + '''), + ('multipart_string_bytes', 'b"Hola" b"Hello" b"Bye"'), + ('multipart_string_triple', '"""Something here""" "and now"'), + ('multipart_string_different_prefixes', 'u"Something" "Other thing" r"last thing"'), + ('multiple_assignments', 'x = y = z = 42'), + ('multiple_assignments_with_yield', 'x = y = z = yield 42'), + ('multiple_pass', + ''' + pass; pass + pass + '''), + ('namedexpr', '(x := [1, 2, 3])'), + ('namedexpr_false', '(x := False)'), + ('namedexpr_none', '(x := None)'), + ('namedexpr_true', '(x := True)'), + ('nonlocal', 'nonlocal a, b'), + ('number_complex', '-2.234+1j'), + ('number_float', '-34.2333'), + ('number_imaginary_literal', '1.1234j'), + ('number_integer', '-234'), + ('number_underscores', '1_234_567'), + ('pass', 'pass'), + ('pos_args', + ''' + def f(a, b): + pass + '''), + ('pos_args_with_default', + ''' + def f(a, b=2): + pass + '''), + ('pos_only_args', + ''' + def f(a, /): + pass + '''), + ('pos_only_args_with_default', + ''' + def f(a=0, /): + pass + '''), + ('pos_posonly_args', + ''' + def f(a, b, /, c, d): + pass + '''), + ('pos_posonly_args_with_default', + ''' + def f(a, b=0, /, c=2): + pass + '''), + ('primary_mixed', 'a.b.c().d[0]'), + ('raise', 'raise'), + ('raise_ellipsis', 'raise ...'), + ('raise_expr', 'raise a'), + ('raise_from', 'raise a from b'), + ('return', 'return'), + ('return_expr', 'return a'), + ('set', '{1, 2+4, 3+5}'), + ('set_comp', '{i for i in a}'), + ('set_trailing_comma', '{1, 2, 3,}'), + ('simple_assignment', 'x = 42'), + ('simple_assignment_with_yield', 'x = yield 42'), + ('string_bytes', 'b"hello"'), + ('string_concatenation_bytes', 'b"hello" b"world"'), + ('string_concatenation_simple', '"abcd" "efgh"'), + ('string_format_simple', 'f"hello"'), + ('string_format_with_formatted_value', 'f"hello {world}"'), + ('string_simple', '"hello"'), + ('string_unicode', 'u"hello"'), + ('subscript_attribute', 'a[0].b'), + ('subscript_call', 'a[b]()'), + ('subscript_multiple_slices', 'a[0:a:2, 1]'), + ('subscript_simple', 'a[0]'), + ('subscript_single_element_tuple', 'a[0,]'), + ('subscript_trailing_comma', 'a[0, 1, 2,]'), + ('subscript_tuple', 'a[0, 1, 2]'), + ('subscript_whole_slice', 'a[0+1:b:c]'), + ('try_except', + ''' + try: + pass + except: + pass + '''), + ('try_except_else', + ''' + try: + pass + except: + pass + else: + pass + '''), + ('try_except_else_finally', + ''' + try: + pass + except: + pass + else: + pass + finally: + pass + '''), + ('try_except_expr', + ''' + try: + pass + except a: + pass + '''), + ('try_except_expr_target', + ''' + try: + pass + except a as b: + pass + '''), + ('try_except_finally', + ''' + try: + pass + except: + pass + finally: + pass + '''), + ('try_finally', + ''' + try: + pass + finally: + pass + '''), + ('unpacking_binop', '[*([1, 2, 3] + [3, 4, 5])]'), + ('unpacking_call', '[*b()]'), + ('unpacking_compare', '[*(x < y)]'), + ('unpacking_constant', '[*3]'), + ('unpacking_dict', '[*{1: 2, 3: 4}]'), + ('unpacking_dict_comprehension', '[*{x:y for x,y in z}]'), + ('unpacking_ifexpr', '[*([1, 2, 3] if x else y)]'), + ('unpacking_list', '[*[1,2,3]]'), + ('unpacking_list_comprehension', '[*[x for x in y]]'), + ('unpacking_namedexpr', '[*(x:=[1, 2, 3])]'), + ('unpacking_set', '[*{1,2,3}]'), + ('unpacking_set_comprehension', '[*{x for x in y}]'), + ('unpacking_string', '[*"myvalue"]'), + ('unpacking_tuple', '[*(1,2,3)]'), + ('unpacking_unaryop', '[*(not [1, 2, 3])]'), + ('unpacking_yield', '[*(yield 42)]'), + ('unpacking_yieldfrom', '[*(yield from x)]'), + ('tuple', '(1, 2, 3)'), + ('vararg', + ''' + def f(*a): + pass + '''), + ('vararg_kwonly_args', + ''' + def f(*a, b): + pass + '''), + ('while', + ''' + while a: + pass + '''), + ('while_else', + ''' + while a: + pass + else: + pass + '''), + ('with', + ''' + with a: + pass + '''), + ('with_as', + ''' + with a as b: + pass + '''), + ('with_as_paren', + ''' + with a as (b): + pass + '''), + ('with_as_empty', 'with a as (): pass'), + ('with_list_recursive', + ''' + with a as [x, [y, z]]: + pass + '''), + ('with_tuple_recursive', + ''' + with a as ((x, y), z): + pass + '''), + ('with_tuple_target', + ''' + with a as (x, y): + pass + '''), + ('with_list_target', + ''' + with a as [x, y]: + pass + '''), + ('yield', 'yield'), + ('yield_expr', 'yield a'), + ('yield_from', 'yield from a'), +] + +FAIL_TEST_CASES = [ + ("annotation_multiple_targets", "(a, b): int = 42"), + ("annotation_nested_tuple", "((a, b)): int"), + ("annotation_list", "[a]: int"), + ("annotation_lambda", "lambda: int = 42"), + ("annotation_tuple", "(a,): int"), + ("annotation_tuple_without_paren", "a,: int"), + ("assignment_keyword", "a = if"), + ("augmented_assignment_list", "[a, b] += 1"), + ("augmented_assignment_tuple", "a, b += 1"), + ("augmented_assignment_tuple_paren", "(a, b) += (1, 2)"), + ("comprehension_lambda", "(a for a in lambda: b)"), + ("comprehension_else", "(a for a in b if c else d"), + ("del_call", "del a()"), + ("del_call_genexp", "del a(i for i in b)"), + ("del_subscript_call", "del a[b]()"), + ("del_attribute_call", "del a.b()"), + ("del_mixed_call", "del a[0].b().c.d()"), + ("for_star_targets_call", "for a() in b: pass"), + ("for_star_targets_subscript_call", "for a[b]() in c: pass"), + ("for_star_targets_attribute_call", "for a.b() in c: pass"), + ("for_star_targets_mixed_call", "for a[0].b().c.d() in e: pass"), + ("for_star_targets_in", "for a, in in b: pass"), + ("f-string_assignment", "f'{x = 42}'"), + ("f-string_empty", "f'{}'"), + ("f-string_function_def", "f'{def f(): pass}'"), + ("f-string_lambda", "f'{lambda x: 42}'"), + ("f-string_singe_brace", "f'{'"), + ("f-string_single_closing_brace", "f'}'"), + ("from_import_invalid", "from import import a"), + ("from_import_trailing_comma", "from a import b,"), + ("import_non_ascii_syntax_error", "import ä £"), + # This test case checks error paths involving tokens with uninitialized + # values of col_offset and end_col_offset. + ("invalid indentation", + """ + def f(): + a + a + """), + ("not_terminated_string", "a = 'example"), + ("try_except_attribute_target", + """ + try: + pass + except Exception as a.b: + pass + """), + ("try_except_subscript_target", + """ + try: + pass + except Exception as a[0]: + pass + """), +] + +FAIL_SPECIALIZED_MESSAGE_CASES = [ + ("f(x, y, z=1, **b, *a", "iterable argument unpacking follows keyword argument unpacking"), + ("f(x, y=1, *z, **a, b", "positional argument follows keyword argument unpacking"), + ("f(x, y, z=1, a=2, b", "positional argument follows keyword argument"), + ("True = 1", "cannot assign to True"), + ("a() = 1", "cannot assign to function call"), + ("(a, b): int", "only single target (not tuple) can be annotated"), + ("[a, b]: int", "only single target (not list) can be annotated"), + ("a(): int", "illegal target for annotation"), + ("1 += 1", "'literal' is an illegal expression for augmented assignment"), + ("pass\n pass", "unexpected indent"), + ("def f():\npass", "expected an indented block"), + ("def f(*): pass", "named arguments must follow bare *"), + ("def f(*,): pass", "named arguments must follow bare *"), + ("def f(*, **a): pass", "named arguments must follow bare *"), + ("lambda *: pass", "named arguments must follow bare *"), + ("lambda *,: pass", "named arguments must follow bare *"), + ("lambda *, **a: pass", "named arguments must follow bare *"), + ("f(g()=2", "expression cannot contain assignment, perhaps you meant \"==\"?"), + ("f(a, b, *c, d.e=2", "expression cannot contain assignment, perhaps you meant \"==\"?"), + ("f(*a, **b, c=0, d[1]=3)", "expression cannot contain assignment, perhaps you meant \"==\"?"), +] + +GOOD_BUT_FAIL_TEST_CASES = [ + ('string_concatenation_format', 'f"{hello} world" f"again {and_again}"'), + ('string_concatenation_multiple', + ''' + f"hello" f"{world} again" f"and_again" + '''), + ('f-string_multiline_comp', + """ + f''' + {(i for i in a + if b)} + ''' + """), +] + +FSTRINGS_TRACEBACKS = { + 'multiline_fstrings_same_line_with_brace': ( + """ + f''' + {a$b} + ''' + """, + '(a$b)\n', + ), + 'multiline_fstring_brace_on_next_line': ( + """ + f''' + {a$b + }''' + """, + '(a$b\n', + ), + 'multiline_fstring_brace_on_previous_line': ( + """ + f''' + { + a$b}''' + """, + 'a$b)\n', + ), +} + +EXPRESSIONS_TEST_CASES = [ + ("expression_add", "1+1"), + ("expression_add_2", "a+b"), + ("expression_call", "f(a, b=2, **kw)"), + ("expression_tuple", "1, 2, 3"), + ("expression_tuple_one_value", "1,") +] + + +def cleanup_source(source: Any) -> str: + if isinstance(source, str): + result = dedent(source) + elif not isinstance(source, (list, tuple)): + result = "\n".join(source) + else: + raise TypeError(f"Invalid type for test source: {source}") + return result + + +def prepare_test_cases( + test_cases: Iterable[Tuple[str, Union[str, Iterable[str]]]] +) -> Tuple[Iterable[str], Iterable[str]]: + + test_ids, _test_sources = zip(*test_cases) + test_sources = list(_test_sources) + for index, source in enumerate(test_sources): + result = cleanup_source(source) + test_sources[index] = result + return test_ids, test_sources + + +TEST_IDS, TEST_SOURCES = prepare_test_cases(TEST_CASES) + +GOOD_BUT_FAIL_TEST_IDS, GOOD_BUT_FAIL_SOURCES = prepare_test_cases( + GOOD_BUT_FAIL_TEST_CASES +) + +FAIL_TEST_IDS, FAIL_SOURCES = prepare_test_cases(FAIL_TEST_CASES) + +EXPRESSIONS_TEST_IDS, EXPRESSIONS_TEST_SOURCES = prepare_test_cases( + EXPRESSIONS_TEST_CASES +) + + +class ASTGenerationTest(unittest.TestCase): + def test_correct_ast_generation_on_source_files(self) -> None: + self.maxDiff = None + for source in TEST_SOURCES: + actual_ast = peg_parser.parse_string(source) + expected_ast = peg_parser.parse_string(source, oldparser=True) + self.assertEqual( + ast.dump(actual_ast, include_attributes=True), + ast.dump(expected_ast, include_attributes=True), + f"Wrong AST generation for source: {source}", + ) + + def test_incorrect_ast_generation_on_source_files(self) -> None: + for source in FAIL_SOURCES: + with self.assertRaises(SyntaxError, msg=f"Parsing {source} did not raise an exception"): + peg_parser.parse_string(source) + + def test_incorrect_ast_generation_with_specialized_errors(self) -> None: + for source, error_text in FAIL_SPECIALIZED_MESSAGE_CASES: + exc = IndentationError if "indent" in error_text else SyntaxError + with self.assertRaises(exc) as se: + peg_parser.parse_string(source) + self.assertTrue( + error_text in se.exception.msg, + f"Actual error message does not match expexted for {source}" + ) + + @unittest.expectedFailure + def test_correct_but_known_to_fail_ast_generation_on_source_files(self) -> None: + for source in GOOD_BUT_FAIL_SOURCES: + actual_ast = peg_parser.parse_string(source) + expected_ast = peg_parser.parse_string(source, oldparser=True) + self.assertEqual( + ast.dump(actual_ast, include_attributes=True), + ast.dump(expected_ast, include_attributes=True), + f"Wrong AST generation for source: {source}", + ) + + def test_correct_ast_generation_without_pos_info(self) -> None: + for source in GOOD_BUT_FAIL_SOURCES: + actual_ast = peg_parser.parse_string(source) + expected_ast = peg_parser.parse_string(source, oldparser=True) + self.assertEqual( + ast.dump(actual_ast), + ast.dump(expected_ast), + f"Wrong AST generation for source: {source}", + ) + + def test_fstring_parse_error_tracebacks(self) -> None: + for source, error_text in FSTRINGS_TRACEBACKS.values(): + with self.assertRaises(SyntaxError) as se: + peg_parser.parse_string(dedent(source)) + self.assertEqual(error_text, se.exception.text) + + def test_correct_ast_generatrion_eval(self) -> None: + for source in EXPRESSIONS_TEST_SOURCES: + actual_ast = peg_parser.parse_string(source, mode='eval') + expected_ast = peg_parser.parse_string(source, mode='eval', oldparser=True) + self.assertEqual( + ast.dump(actual_ast, include_attributes=True), + ast.dump(expected_ast, include_attributes=True), + f"Wrong AST generation for source: {source}", + ) + + def test_tokenizer_errors_are_propagated(self) -> None: + n=201 + with self.assertRaisesRegex(SyntaxError, "too many nested parentheses"): + peg_parser.parse_string(n*'(' + ')'*n) diff --git a/Lib/test/test_pkgutil.py b/Lib/test/test_pkgutil.py index 2887ce6cc055dab5cf19e7f2b96d29bc15155f61..b162f9949ff6971ccefffeb64200ba08abf6c30d 100644 --- a/Lib/test/test_pkgutil.py +++ b/Lib/test/test_pkgutil.py @@ -186,6 +186,97 @@ def test_walk_packages_raises_on_string_or_bytes_input(self): with self.assertRaises((TypeError, ValueError)): list(pkgutil.walk_packages(bytes_input)) + def test_name_resolution(self): + import logging + import logging.handlers + + success_cases = ( + ('os', os), + ('os.path', os.path), + ('os.path:pathsep', os.path.pathsep), + ('logging', logging), + ('logging:', logging), + ('logging.handlers', logging.handlers), + ('logging.handlers:', logging.handlers), + ('logging.handlers:SysLogHandler', logging.handlers.SysLogHandler), + ('logging.handlers.SysLogHandler', logging.handlers.SysLogHandler), + ('logging.handlers:SysLogHandler.LOG_ALERT', + logging.handlers.SysLogHandler.LOG_ALERT), + ('logging.handlers.SysLogHandler.LOG_ALERT', + logging.handlers.SysLogHandler.LOG_ALERT), + ('builtins.int', int), + ('builtins:int', int), + ('builtins.int.from_bytes', int.from_bytes), + ('builtins:int.from_bytes', int.from_bytes), + ('builtins.ZeroDivisionError', ZeroDivisionError), + ('builtins:ZeroDivisionError', ZeroDivisionError), + ('os:path', os.path), + ) + + failure_cases = ( + (None, TypeError), + (1, TypeError), + (2.0, TypeError), + (True, TypeError), + ('', ValueError), + ('?abc', ValueError), + ('abc/foo', ValueError), + ('foo', ImportError), + ('os.foo', AttributeError), + ('os.foo:', ImportError), + ('os.pth:pathsep', ImportError), + ('logging.handlers:NoSuchHandler', AttributeError), + ('logging.handlers:SysLogHandler.NO_SUCH_VALUE', AttributeError), + ('logging.handlers.SysLogHandler.NO_SUCH_VALUE', AttributeError), + ('ZeroDivisionError', ImportError), + ('os.path.9abc', ValueError), + ('9abc', ValueError), + ) + + # add some Unicode package names to the mix. + + unicode_words = ('\u0935\u092e\u0938', + '\xe9', '\xc8', + '\uc548\ub155\ud558\uc138\uc694', + '\u3055\u3088\u306a\u3089', + '\u3042\u308a\u304c\u3068\u3046', + '\u0425\u043e\u0440\u043e\u0448\u043e', + '\u0441\u043f\u0430\u0441\u0438\u0431\u043e', + '\u73b0\u4ee3\u6c49\u8bed\u5e38\u7528\u5b57\u8868') + + for uw in unicode_words: + d = os.path.join(self.dirname, uw) + try: + os.makedirs(d, exist_ok=True) + except UnicodeEncodeError: + # When filesystem encoding cannot encode uw: skip this test + continue + # make an empty __init__.py file + f = os.path.join(d, '__init__.py') + with open(f, 'w') as f: + f.write('') + f.flush() + # now import the package we just created; clearing the caches is + # needed, otherwise the newly created package isn't found + importlib.invalidate_caches() + mod = importlib.import_module(uw) + success_cases += (uw, mod), + if len(uw) > 1: + failure_cases += (uw[:-1], ImportError), + + # add an example with a Unicode digit at the start + failure_cases += ('\u0966\u0935\u092e\u0938', ValueError), + + for s, expected in success_cases: + with self.subTest(s=s): + o = pkgutil.resolve_name(s) + self.assertEqual(o, expected) + + for s, exc in failure_cases: + with self.subTest(s=s): + with self.assertRaises(exc): + pkgutil.resolve_name(s) + class PkgutilPEP302Tests(unittest.TestCase): diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py index 3084663a8fadd577e5ca40c83b604ab53a7412b9..9f04c79e09ba462fc36136470f4819f501bfb2bc 100644 --- a/Lib/test/test_platform.py +++ b/Lib/test/test_platform.py @@ -1,4 +1,6 @@ import os +import copy +import pickle import platform import subprocess import sys @@ -154,11 +156,71 @@ def test_uname(self): res = platform.uname() self.assertTrue(any(res)) self.assertEqual(res[0], res.system) + self.assertEqual(res[-6], res.system) self.assertEqual(res[1], res.node) + self.assertEqual(res[-5], res.node) self.assertEqual(res[2], res.release) + self.assertEqual(res[-4], res.release) self.assertEqual(res[3], res.version) + self.assertEqual(res[-3], res.version) self.assertEqual(res[4], res.machine) + self.assertEqual(res[-2], res.machine) self.assertEqual(res[5], res.processor) + self.assertEqual(res[-1], res.processor) + self.assertEqual(len(res), 6) + + def test_uname_cast_to_tuple(self): + res = platform.uname() + expected = ( + res.system, res.node, res.release, res.version, res.machine, + res.processor, + ) + self.assertEqual(tuple(res), expected) + + def test_uname_replace(self): + res = platform.uname() + new = res._replace( + system='system', node='node', release='release', + version='version', machine='machine') + self.assertEqual(new.system, 'system') + self.assertEqual(new.node, 'node') + self.assertEqual(new.release, 'release') + self.assertEqual(new.version, 'version') + self.assertEqual(new.machine, 'machine') + # processor cannot be replaced + self.assertEqual(new.processor, res.processor) + + def test_uname_copy(self): + uname = platform.uname() + self.assertEqual(copy.copy(uname), uname) + self.assertEqual(copy.deepcopy(uname), uname) + + def test_uname_pickle(self): + orig = platform.uname() + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(protocol=proto): + pickled = pickle.dumps(orig, proto) + restored = pickle.loads(pickled) + self.assertEqual(restored, orig) + + def test_uname_slices(self): + res = platform.uname() + expected = tuple(res) + self.assertEqual(res[:], expected) + self.assertEqual(res[:5], expected[:5]) + + @unittest.skipIf(sys.platform in ['win32', 'OpenVMS'], "uname -p not used") + def test_uname_processor(self): + """ + On some systems, the processor must match the output + of 'uname -p'. See Issue 35967 for rationale. + """ + try: + proc_res = subprocess.check_output(['uname', '-p'], text=True).strip() + expect = platform._unknown_as_blank(proc_res) + except (OSError, subprocess.CalledProcessError): + expect = '' + self.assertEqual(platform.uname().processor, expect) @unittest.skipUnless(sys.platform.startswith('win'), "windows only test") def test_uname_win32_ARCHITEW6432(self): @@ -209,7 +271,10 @@ def test_mac_ver(self): # On Snow Leopard, sw_vers reports 10.6.0 as 10.6 if len_diff > 0: expect_list.extend(['0'] * len_diff) - self.assertEqual(result_list, expect_list) + # For compatibility with older binaries, macOS 11.x may report + # itself as '10.16' rather than '11.x.y'. + if result_list != ['10', '16']: + self.assertEqual(result_list, expect_list) # res[1] claims to contain # (version, dev_stage, non_release_version) @@ -217,7 +282,7 @@ def test_mac_ver(self): self.assertEqual(res[1], ('', '', '')) if sys.byteorder == 'little': - self.assertIn(res[2], ('i386', 'x86_64')) + self.assertIn(res[2], ('i386', 'x86_64', 'arm64')) else: self.assertEqual(res[2], 'PowerPC') @@ -236,9 +301,7 @@ def test_mac_ver_with_fork(self): else: # parent - cpid, sts = os.waitpid(pid, 0) - self.assertEqual(cpid, pid) - self.assertEqual(sts, 0) + support.wait_process(pid, exitcode=0) def test_libc_ver(self): # check that libc_ver(executable) doesn't raise an exception diff --git a/Lib/test/test_plistlib.py b/Lib/test/test_plistlib.py index 0d887e210dde5020354d31b3d20db0c37ce3d6f8..9e53305b8ecef150541b0cbc2af91fe4c3a60924 100644 --- a/Lib/test/test_plistlib.py +++ b/Lib/test/test_plistlib.py @@ -2,6 +2,7 @@ import copy import operator import pickle +import struct import unittest import plistlib import os @@ -105,6 +106,298 @@ AAABOQ=='''), } +XML_PLIST_WITH_ENTITY=b'''\ + + + ]> + + + A + &entity; + + +''' + +INVALID_BINARY_PLISTS = [ + ('too short data', + b'' + ), + ('too large offset_table_offset and offset_size = 1', + b'\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x2a' + ), + ('too large offset_table_offset and nonstandard offset_size', + b'\x00\x00\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x03\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x2c' + ), + ('integer overflow in offset_table_offset', + b'\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\xff\xff\xff\xff\xff\xff\xff\xff' + ), + ('too large top_object', + b'\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x09' + ), + ('integer overflow in top_object', + b'\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\xff\xff\xff\xff\xff\xff\xff\xff' + b'\x00\x00\x00\x00\x00\x00\x00\x09' + ), + ('too large num_objects and offset_size = 1', + b'\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\xff' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x09' + ), + ('too large num_objects and nonstandard offset_size', + b'\x00\x00\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x03\x01' + b'\x00\x00\x00\x00\x00\x00\x00\xff' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x09' + ), + ('extremally large num_objects (32 bit)', + b'\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x7f\xff\xff\xff' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x09' + ), + ('extremally large num_objects (64 bit)', + b'\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\xff\xff\xff\xff\xff' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x09' + ), + ('integer overflow in num_objects', + b'\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\xff\xff\xff\xff\xff\xff\xff\xff' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x09' + ), + ('offset_size = 0', + b'\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x09' + ), + ('ref_size = 0', + b'\xa1\x01\x00\x08\x0a' + b'\x00\x00\x00\x00\x00\x00\x01\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x02' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0b' + ), + ('too large offset', + b'\x00\x2a' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x09' + ), + ('integer overflow in offset', + b'\x00\xff\xff\xff\xff\xff\xff\xff\xff' + b'\x00\x00\x00\x00\x00\x00\x08\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x09' + ), + ('too large array size', + b'\xaf\x00\x01\xff\x00\x08\x0c' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x02' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0d' + ), + ('extremally large array size (32-bit)', + b'\xaf\x02\x7f\xff\xff\xff\x01\x00\x08\x0f' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x02' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x10' + ), + ('extremally large array size (64-bit)', + b'\xaf\x03\x00\x00\x00\xff\xff\xff\xff\xff\x01\x00\x08\x13' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x02' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x14' + ), + ('integer overflow in array size', + b'\xaf\x03\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x08\x13' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x02' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x14' + ), + ('too large reference index', + b'\xa1\x02\x00\x08\x0a' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x02' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0b' + ), + ('integer overflow in reference index', + b'\xa1\xff\xff\xff\xff\xff\xff\xff\xff\x00\x08\x11' + b'\x00\x00\x00\x00\x00\x00\x01\x08' + b'\x00\x00\x00\x00\x00\x00\x00\x02' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x12' + ), + ('too large bytes size', + b'\x4f\x00\x23\x41\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0c' + ), + ('extremally large bytes size (32-bit)', + b'\x4f\x02\x7f\xff\xff\xff\x41\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0f' + ), + ('extremally large bytes size (64-bit)', + b'\x4f\x03\x00\x00\x00\xff\xff\xff\xff\xff\x41\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x13' + ), + ('integer overflow in bytes size', + b'\x4f\x03\xff\xff\xff\xff\xff\xff\xff\xff\x41\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x13' + ), + ('too large ASCII size', + b'\x5f\x00\x23\x41\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0c' + ), + ('extremally large ASCII size (32-bit)', + b'\x5f\x02\x7f\xff\xff\xff\x41\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0f' + ), + ('extremally large ASCII size (64-bit)', + b'\x5f\x03\x00\x00\x00\xff\xff\xff\xff\xff\x41\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x13' + ), + ('integer overflow in ASCII size', + b'\x5f\x03\xff\xff\xff\xff\xff\xff\xff\xff\x41\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x13' + ), + ('invalid ASCII', + b'\x51\xff\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0a' + ), + ('too large UTF-16 size', + b'\x6f\x00\x13\x20\xac\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0e' + ), + ('extremally large UTF-16 size (32-bit)', + b'\x6f\x02\x4f\xff\xff\xff\x20\xac\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x11' + ), + ('extremally large UTF-16 size (64-bit)', + b'\x6f\x03\x00\x00\x00\xff\xff\xff\xff\xff\x20\xac\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x15' + ), + ('integer overflow in UTF-16 size', + b'\x6f\x03\xff\xff\xff\xff\xff\xff\xff\xff\x20\xac\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x15' + ), + ('invalid UTF-16', + b'\x61\xd8\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0b' + ), + ('non-hashable key', + b'\xd1\x01\x01\xa0\x08\x0b' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x02' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x0c' + ), + ('too large datetime (datetime overflow)', + b'\x33\x42\x50\x00\x00\x00\x00\x00\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x11' + ), + ('too large datetime (timedelta overflow)', + b'\x33\x42\xe0\x00\x00\x00\x00\x00\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x11' + ), + ('invalid datetime (Infinity)', + b'\x33\x7f\xf0\x00\x00\x00\x00\x00\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x11' + ), + ('invalid datetime (NaN)', + b'\x33\x7f\xf8\x00\x00\x00\x00\x00\x00\x08' + b'\x00\x00\x00\x00\x00\x00\x01\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x11' + ), +] + class TestPlistlib(unittest.TestCase): @@ -263,14 +556,12 @@ def test_uid_copy(self): self.assertEqual(copy.deepcopy(UID(1)), UID(1)) def test_appleformatting(self): - for use_builtin_types in (True, False): - for fmt in ALL_FORMATS: - with self.subTest(fmt=fmt, use_builtin_types=use_builtin_types): - pl = plistlib.loads(TESTDATA[fmt], - use_builtin_types=use_builtin_types) - data = plistlib.dumps(pl, fmt=fmt) - self.assertEqual(data, TESTDATA[fmt], - "generated data was not identical to Apple's output") + for fmt in ALL_FORMATS: + with self.subTest(fmt=fmt): + pl = plistlib.loads(TESTDATA[fmt]) + data = plistlib.dumps(pl, fmt=fmt) + self.assertEqual(data, TESTDATA[fmt], + "generated data was not identical to Apple's output") def test_appleformattingfromliteral(self): @@ -486,6 +777,19 @@ def test_invalidreal(self): self.assertRaises(ValueError, plistlib.loads, b"not real") + def test_integer_notations(self): + pl = b"456" + value = plistlib.loads(pl) + self.assertEqual(value, 456) + + pl = b"0xa" + value = plistlib.loads(pl) + self.assertEqual(value, 10) + + pl = b"0123" + value = plistlib.loads(pl) + self.assertEqual(value, 123) + def test_xml_encodings(self): base = TESTDATA[plistlib.FMT_XML] @@ -525,9 +829,29 @@ def test_modified_uid_huge(self): with self.assertRaises(OverflowError): plistlib.dumps(huge_uid, fmt=plistlib.FMT_BINARY) + def test_xml_plist_with_entity_decl(self): + with self.assertRaisesRegex(plistlib.InvalidFileException, + "XML entity declarations are not supported"): + plistlib.loads(XML_PLIST_WITH_ENTITY, fmt=plistlib.FMT_XML) + class TestBinaryPlistlib(unittest.TestCase): + @staticmethod + def decode(*objects, offset_size=1, ref_size=1): + data = [b'bplist00'] + offset = 8 + offsets = [] + for x in objects: + offsets.append(offset.to_bytes(offset_size, 'big')) + data.append(x) + offset += len(x) + tail = struct.pack('>6xBBQQQ', offset_size, ref_size, + len(objects), 0, offset) + data.extend(offsets) + data.append(tail) + return plistlib.loads(b''.join(data), fmt=plistlib.FMT_BINARY) + def test_nonstandard_refs_size(self): # Issue #21538: Refs and offsets are 24-bit integers data = (b'bplist00' @@ -542,10 +866,9 @@ def test_nonstandard_refs_size(self): def test_dump_duplicates(self): # Test effectiveness of saving duplicated objects - for x in (None, False, True, 12345, 123.45, 'abcde', b'abcde', + for x in (None, False, True, 12345, 123.45, 'abcde', 'абвгд', b'abcde', datetime.datetime(2004, 10, 26, 10, 33, 33), - plistlib.Data(b'abcde'), bytearray(b'abcde'), - [12, 345], (12, 345), {'12': 345}): + bytearray(b'abcde'), [12, 345], (12, 345), {'12': 345}): with self.subTest(x=x): data = plistlib.dumps([x]*1000, fmt=plistlib.FMT_BINARY) self.assertLess(len(data), 1100, repr(data)) @@ -553,8 +876,7 @@ def test_dump_duplicates(self): def test_identity(self): for x in (None, False, True, 12345, 123.45, 'abcde', b'abcde', datetime.datetime(2004, 10, 26, 10, 33, 33), - plistlib.Data(b'abcde'), bytearray(b'abcde'), - [12, 345], (12, 345), {'12': 345}): + bytearray(b'abcde'), [12, 345], (12, 345), {'12': 345}): with self.subTest(x=x): data = plistlib.dumps([x]*2, fmt=plistlib.FMT_BINARY) a, b = plistlib.loads(data) @@ -581,6 +903,20 @@ def test_cycles(self): b = plistlib.loads(plistlib.dumps(a, fmt=plistlib.FMT_BINARY)) self.assertIs(b['x'], b) + def test_deep_nesting(self): + for N in [300, 100000]: + chunks = [b'\xa1' + (i + 1).to_bytes(4, 'big') for i in range(N)] + try: + result = self.decode(*chunks, b'\x54seed', offset_size=4, ref_size=4) + except RecursionError: + pass + else: + for i in range(N): + self.assertIsInstance(result, list) + self.assertEqual(len(result), 1) + result = result[0] + self.assertEqual(result, 'seed') + def test_large_timestamp(self): # Issue #26709: 32-bit timestamp out of range for ts in -2**31-1, 2**31: @@ -590,144 +926,37 @@ def test_large_timestamp(self): data = plistlib.dumps(d, fmt=plistlib.FMT_BINARY) self.assertEqual(plistlib.loads(data), d) - def test_invalid_binary(self): - for data in [ - # too short data - b'', - # too large offset_table_offset and nonstandard offset_size - b'\x00\x08' - b'\x00\x00\x00\x00\x00\x00\x03\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x2a', - # integer overflow in offset_table_offset - b'\x00\x08' - b'\x00\x00\x00\x00\x00\x00\x01\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x00' - b'\xff\xff\xff\xff\xff\xff\xff\xff', - # offset_size = 0 - b'\x00\x08' - b'\x00\x00\x00\x00\x00\x00\x00\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x09', - # ref_size = 0 - b'\xa1\x01\x00\x08\x0a' - b'\x00\x00\x00\x00\x00\x00\x01\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x02' - b'\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x0b', - # integer overflow in offset - b'\x00\xff\xff\xff\xff\xff\xff\xff\xff' - b'\x00\x00\x00\x00\x00\x00\x08\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x09', - # invalid ASCII - b'\x51\xff\x08' - b'\x00\x00\x00\x00\x00\x00\x01\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x0a', - # invalid UTF-16 - b'\x61\xd8\x00\x08' - b'\x00\x00\x00\x00\x00\x00\x01\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x0b', - ]: - with self.assertRaises(plistlib.InvalidFileException): - plistlib.loads(b'bplist00' + data, fmt=plistlib.FMT_BINARY) - - -class TestPlistlibDeprecated(unittest.TestCase): - def test_io_deprecated(self): - pl_in = { - 'key': 42, - 'sub': { - 'key': 9, - 'alt': 'value', - 'data': b'buffer', - } - } - pl_out = { - 'key': 42, - 'sub': { - 'key': 9, - 'alt': 'value', - 'data': plistlib.Data(b'buffer'), - } - } - - self.addCleanup(support.unlink, support.TESTFN) - with self.assertWarns(DeprecationWarning): - plistlib.writePlist(pl_in, support.TESTFN) - - with self.assertWarns(DeprecationWarning): - pl2 = plistlib.readPlist(support.TESTFN) - - self.assertEqual(pl_out, pl2) - - os.unlink(support.TESTFN) - - with open(support.TESTFN, 'wb') as fp: - with self.assertWarns(DeprecationWarning): - plistlib.writePlist(pl_in, fp) - - with open(support.TESTFN, 'rb') as fp: - with self.assertWarns(DeprecationWarning): - pl2 = plistlib.readPlist(fp) + def test_load_singletons(self): + self.assertIs(self.decode(b'\x00'), None) + self.assertIs(self.decode(b'\x08'), False) + self.assertIs(self.decode(b'\x09'), True) + self.assertEqual(self.decode(b'\x0f'), b'') + + def test_load_int(self): + self.assertEqual(self.decode(b'\x10\x00'), 0) + self.assertEqual(self.decode(b'\x10\xfe'), 0xfe) + self.assertEqual(self.decode(b'\x11\xfe\xdc'), 0xfedc) + self.assertEqual(self.decode(b'\x12\xfe\xdc\xba\x98'), 0xfedcba98) + self.assertEqual(self.decode(b'\x13\x01\x23\x45\x67\x89\xab\xcd\xef'), + 0x0123456789abcdef) + self.assertEqual(self.decode(b'\x13\xfe\xdc\xba\x98\x76\x54\x32\x10'), + -0x123456789abcdf0) + + def test_unsupported(self): + unsupported = [*range(1, 8), *range(10, 15), + 0x20, 0x21, *range(0x24, 0x33), *range(0x34, 0x40)] + for i in [0x70, 0x90, 0xb0, 0xc0, 0xe0, 0xf0]: + unsupported.extend(i + j for j in range(16)) + for token in unsupported: + with self.subTest(f'token {token:02x}'): + with self.assertRaises(plistlib.InvalidFileException): + self.decode(bytes([token]) + b'\x00'*16) - self.assertEqual(pl_out, pl2) - - def test_bytes_deprecated(self): - pl = { - 'key': 42, - 'sub': { - 'key': 9, - 'alt': 'value', - 'data': b'buffer', - } - } - with self.assertWarns(DeprecationWarning): - data = plistlib.writePlistToBytes(pl) - - with self.assertWarns(DeprecationWarning): - pl2 = plistlib.readPlistFromBytes(data) - - self.assertIsInstance(pl2, dict) - self.assertEqual(pl2, dict( - key=42, - sub=dict( - key=9, - alt='value', - data=plistlib.Data(b'buffer'), - ) - )) - - with self.assertWarns(DeprecationWarning): - data2 = plistlib.writePlistToBytes(pl2) - self.assertEqual(data, data2) - - def test_dataobject_deprecated(self): - in_data = { 'key': plistlib.Data(b'hello') } - out_data = { 'key': b'hello' } - - buf = plistlib.dumps(in_data) - - cur = plistlib.loads(buf) - self.assertEqual(cur, out_data) - self.assertEqual(cur, in_data) - - cur = plistlib.loads(buf, use_builtin_types=False) - self.assertEqual(cur, out_data) - self.assertEqual(cur, in_data) - - with self.assertWarns(DeprecationWarning): - cur = plistlib.readPlistFromBytes(buf) - self.assertEqual(cur, out_data) - self.assertEqual(cur, in_data) + def test_invalid_binary(self): + for name, data in INVALID_BINARY_PLISTS: + with self.subTest(name): + with self.assertRaises(plistlib.InvalidFileException): + plistlib.loads(b'bplist00' + data, fmt=plistlib.FMT_BINARY) class TestKeyedArchive(unittest.TestCase): diff --git a/Lib/test/test_popen.py b/Lib/test/test_popen.py index da01a878fa0a5ae7348d10a6c72d8962ba81853f..ab1bc776552ca95094bee6a1beb239ef5b816110 100644 --- a/Lib/test/test_popen.py +++ b/Lib/test/test_popen.py @@ -44,10 +44,11 @@ def test_popen(self): def test_return_code(self): self.assertEqual(os.popen("exit 0").close(), None) + status = os.popen("exit 42").close() if os.name == 'nt': - self.assertEqual(os.popen("exit 42").close(), 42) + self.assertEqual(status, 42) else: - self.assertEqual(os.popen("exit 42").close(), 42 << 8) + self.assertEqual(os.waitstatus_to_exitcode(status), 42) def test_contextmanager(self): with os.popen("echo hello") as f: diff --git a/Lib/test/test_poplib.py b/Lib/test/test_poplib.py index 7b1d854d1c08666c0bdbcbe4040380f12e6fe8ab..b670afcf4e62eeb626164ef45925cb6d14d268e2 100644 --- a/Lib/test/test_poplib.py +++ b/Lib/test/test_poplib.py @@ -13,8 +13,10 @@ from unittest import TestCase, skipUnless from test import support as test_support +from test.support import hashlib_helper +from test.support import socket_helper -HOST = test_support.HOST +HOST = socket_helper.HOST PORT = 0 SUPPORTS_SSL = False @@ -255,7 +257,8 @@ def assertOK(self, resp): def setUp(self): self.server = DummyPOP3Server((HOST, PORT)) self.server.start() - self.client = poplib.POP3(self.server.host, self.server.port, timeout=3) + self.client = poplib.POP3(self.server.host, self.server.port, + timeout=test_support.LOOPBACK_TIMEOUT) def tearDown(self): self.client.close() @@ -309,11 +312,11 @@ def test_noop(self): def test_rpop(self): self.assertOK(self.client.rpop('foo')) - @test_support.requires_hashdigest('md5') + @hashlib_helper.requires_hashdigest('md5') def test_apop_normal(self): self.assertOK(self.client.apop('foo', 'dummypassword')) - @test_support.requires_hashdigest('md5') + @hashlib_helper.requires_hashdigest('md5') def test_apop_REDOS(self): # Replace welcome with very long evil welcome. # NB The upper bound on welcome length is currently 2048. @@ -376,7 +379,8 @@ def test_stls_context(self): self.assertEqual(ctx.check_hostname, True) with self.assertRaises(ssl.CertificateError): resp = self.client.stls(context=ctx) - self.client = poplib.POP3("localhost", self.server.port, timeout=3) + self.client = poplib.POP3("localhost", self.server.port, + timeout=test_support.LOOPBACK_TIMEOUT) resp = self.client.stls(context=ctx) self.assertEqual(resp, expected) @@ -445,7 +449,8 @@ class TestPOP3_TLSClass(TestPOP3Class): def setUp(self): self.server = DummyPOP3Server((HOST, PORT)) self.server.start() - self.client = poplib.POP3(self.server.host, self.server.port, timeout=3) + self.client = poplib.POP3(self.server.host, self.server.port, + timeout=test_support.LOOPBACK_TIMEOUT) self.client.stls() def tearDown(self): @@ -477,8 +482,8 @@ def setUp(self): self.evt = threading.Event() self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.settimeout(60) # Safety net. Look issue 11812 - self.port = test_support.bind_port(self.sock) - self.thread = threading.Thread(target=self.server, args=(self.evt,self.sock)) + self.port = socket_helper.bind_port(self.sock) + self.thread = threading.Thread(target=self.server, args=(self.evt, self.sock)) self.thread.daemon = True self.thread.start() self.evt.wait() @@ -502,12 +507,12 @@ def server(self, evt, serv): def testTimeoutDefault(self): self.assertIsNone(socket.getdefaulttimeout()) - socket.setdefaulttimeout(30) + socket.setdefaulttimeout(test_support.LOOPBACK_TIMEOUT) try: pop = poplib.POP3(HOST, self.port) finally: socket.setdefaulttimeout(None) - self.assertEqual(pop.sock.gettimeout(), 30) + self.assertEqual(pop.sock.gettimeout(), test_support.LOOPBACK_TIMEOUT) pop.close() def testTimeoutNone(self): @@ -521,9 +526,11 @@ def testTimeoutNone(self): pop.close() def testTimeoutValue(self): - pop = poplib.POP3(HOST, self.port, timeout=30) - self.assertEqual(pop.sock.gettimeout(), 30) + pop = poplib.POP3(HOST, self.port, timeout=test_support.LOOPBACK_TIMEOUT) + self.assertEqual(pop.sock.gettimeout(), test_support.LOOPBACK_TIMEOUT) pop.close() + with self.assertRaises(ValueError): + poplib.POP3(HOST, self.port, timeout=0) def test_main(): diff --git a/Lib/test/test_positional_only_arg.py b/Lib/test/test_positional_only_arg.py index 2ef40e3a5a1138d7df1fbc9c596a64f5ef563582..0a9503e2025d6b4c94c4e6a81bdc41b16340d9e8 100644 --- a/Lib/test/test_positional_only_arg.py +++ b/Lib/test/test_positional_only_arg.py @@ -16,11 +16,6 @@ def global_pos_only_and_normal(a, /, b): def global_pos_only_defaults(a=1, /, b=2): return a, b -def global_inner_has_pos_only(): - def f(x: int, /): ... - return f - - class PositionalOnlyTestCase(unittest.TestCase): def assertRaisesSyntaxError(self, codestr, regex="invalid syntax"): @@ -266,12 +261,6 @@ def f(self, a, b, /): with self.assertRaisesRegex(TypeError, expected): Example().f(1, b=2) - def test_mangling(self): - class X: - def f(self, *, __a=42): - return __a - self.assertEqual(X().f(), 42) - def test_module_function(self): with self.assertRaisesRegex(TypeError, r"f\(\) missing 2 required positional arguments: 'a' and 'b'"): global_pos_only_f() @@ -307,6 +296,29 @@ def g(x2,/,y2): with self.assertRaisesRegex(TypeError, r"g\(\) takes 2 positional arguments but 3 were given"): f(1,2)(3,4,5) + def test_annotations_in_closures(self): + + def inner_has_pos_only(): + def f(x: int, /): ... + return f + + assert inner_has_pos_only().__annotations__ == {'x': int} + + class Something: + def method(self): + def f(x: int, /): ... + return f + + assert Something().method().__annotations__ == {'x': int} + + def multiple_levels(): + def inner_has_pos_only(): + def f(x: int, /): ... + return f + return inner_has_pos_only() + + assert multiple_levels().__annotations__ == {'x': int} + def test_same_keyword_as_positional_with_kwargs(self): def f(something,/,**kwargs): return (something, kwargs) @@ -417,19 +429,16 @@ def method(self, /): self.assertEqual(C().method(), sentinel) - def test_annotations(self): - assert global_inner_has_pos_only().__annotations__ == {'x': int} - def test_annotations_constant_fold(self): def g(): def f(x: not (int is int), /): ... # without constant folding we end up with - # COMPARE_OP(is), UNARY_NOT - # with constant folding we should expect a COMPARE_OP(is not) + # COMPARE_OP(is), IS_OP (0) + # with constant folding we should expect a IS_OP (1) codes = [(i.opname, i.argval) for i in dis.get_instructions(g)] self.assertNotIn(('UNARY_NOT', None), codes) - self.assertIn(('COMPARE_OP', 'is not'), codes) + self.assertIn(('IS_OP', 1), codes) if __name__ == "__main__": diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 9bdd2848afc81b87ed2e11e64b67931ef96bfb69..f4edb8bd9575f4d7c96cef9f1ebb9a8664a05793 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -37,6 +37,7 @@ def _supports_sched(): requires_sched = unittest.skipUnless(_supports_sched(), 'requires POSIX scheduler API') + class PosixTester(unittest.TestCase): def setUp(self): @@ -180,7 +181,6 @@ def test_truncate(self): @unittest.skipUnless(getattr(os, 'execve', None) in os.supports_fd, "test needs execve() to support the fd parameter") @unittest.skipUnless(hasattr(os, 'fork'), "test needs os.fork()") - @unittest.skipUnless(hasattr(os, 'waitpid'), "test needs os.waitpid()") def test_fexecve(self): fp = os.open(sys.executable, os.O_RDONLY) try: @@ -189,7 +189,7 @@ def test_fexecve(self): os.chdir(os.path.split(sys.executable)[0]) posix.execve(fp, [sys.executable, '-c', 'pass'], os.environ) else: - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) finally: os.close(fp) @@ -969,7 +969,6 @@ def test_environ(self): self.assertEqual(type(k), item_type) self.assertEqual(type(v), item_type) - @unittest.skipUnless(hasattr(os, "putenv"), "requires os.putenv()") def test_putenv(self): with self.assertRaises(ValueError): os.putenv('FRUIT\0VEGETABLE', 'cabbage') @@ -1226,6 +1225,16 @@ def test_rename_dir_fd(self): finally: posix.close(f) + @unittest.skipUnless(hasattr(signal, 'SIGCHLD'), 'CLD_XXXX be placed in si_code for a SIGCHLD signal') + @unittest.skipUnless(hasattr(os, 'waitid_result'), "test needs os.waitid_result") + def test_cld_xxxx_constants(self): + os.CLD_EXITED + os.CLD_KILLED + os.CLD_DUMPED + os.CLD_TRAPPED + os.CLD_STOPPED + os.CLD_CONTINUED + @unittest.skipUnless(os.symlink in os.supports_dir_fd, "test needs dir_fd support in os.symlink()") def test_symlink_dir_fd(self): f = posix.open(posix.getcwd(), posix.O_RDONLY) @@ -1460,6 +1469,17 @@ def test_path_with_null_byte(self): open(fn, 'wb').close() self.assertRaises(ValueError, os.stat, fn_with_NUL) + @unittest.skipUnless(hasattr(os, "pidfd_open"), "pidfd_open unavailable") + def test_pidfd_open(self): + with self.assertRaises(OSError) as cm: + os.pidfd_open(-1) + if cm.exception.errno == errno.ENOSYS: + self.skipTest("system does not support pidfd_open") + if isinstance(cm.exception, PermissionError): + self.skipTest(f"pidfd_open syscall blocked: {cm.exception!r}") + self.assertEqual(cm.exception.errno, errno.EINVAL) + os.close(os.pidfd_open(os.getpid(), 0)) + class PosixGroupsTester(unittest.TestCase): def setUp(self): @@ -1519,7 +1539,7 @@ def test_returns_pid(self): """ args = self.python_args('-c', script) pid = self.spawn_func(args[0], args, os.environ) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) with open(pidfile) as f: self.assertEqual(f.read(), str(pid)) @@ -1549,7 +1569,7 @@ def test_specify_environment(self): args = self.python_args('-c', script) pid = self.spawn_func(args[0], args, {**os.environ, 'foo': 'bar'}) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) with open(envfile) as f: self.assertEqual(f.read(), 'bar') @@ -1560,7 +1580,7 @@ def test_none_file_actions(self): os.environ, file_actions=None ) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) def test_empty_file_actions(self): pid = self.spawn_func( @@ -1569,7 +1589,7 @@ def test_empty_file_actions(self): os.environ, file_actions=[] ) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) def test_resetids_explicit_default(self): pid = self.spawn_func( @@ -1578,7 +1598,7 @@ def test_resetids_explicit_default(self): os.environ, resetids=False ) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) def test_resetids(self): pid = self.spawn_func( @@ -1587,7 +1607,7 @@ def test_resetids(self): os.environ, resetids=True ) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) def test_resetids_wrong_type(self): with self.assertRaises(TypeError): @@ -1602,7 +1622,7 @@ def test_setpgroup(self): os.environ, setpgroup=os.getpgrp() ) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) def test_setpgroup_wrong_type(self): with self.assertRaises(TypeError): @@ -1623,7 +1643,7 @@ def test_setsigmask(self): os.environ, setsigmask=[signal.SIGUSR1] ) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) def test_setsigmask_wrong_type(self): with self.assertRaises(TypeError): @@ -1664,7 +1684,8 @@ def test_setsid(self): finally: os.close(wfd) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) + output = os.read(rfd, 100) child_sid = int(output) parent_sid = os.getsid(os.getpid()) @@ -1687,10 +1708,7 @@ def test_setsigdef(self): finally: signal.signal(signal.SIGUSR1, original_handler) - pid2, status = os.waitpid(pid, 0) - self.assertEqual(pid2, pid) - self.assertTrue(os.WIFSIGNALED(status), status) - self.assertEqual(os.WTERMSIG(status), signal.SIGUSR1) + support.wait_process(pid, exitcode=-signal.SIGUSR1) def test_setsigdef_wrong_type(self): with self.assertRaises(TypeError): @@ -1724,7 +1742,7 @@ def test_setscheduler_only_param(self): os.environ, scheduler=(None, os.sched_param(priority)) ) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) @requires_sched @unittest.skipIf(sys.platform.startswith(('freebsd', 'netbsd')), @@ -1744,7 +1762,7 @@ def test_setscheduler_with_policy(self): os.environ, scheduler=(policy, os.sched_param(priority)) ) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) def test_multiple_file_actions(self): file_actions = [ @@ -1756,7 +1774,7 @@ def test_multiple_file_actions(self): self.NOOP_PROGRAM, os.environ, file_actions=file_actions) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) def test_bad_file_actions(self): args = self.NOOP_PROGRAM @@ -1802,7 +1820,8 @@ def test_open_file(self): args = self.python_args('-c', script) pid = self.spawn_func(args[0], args, os.environ, file_actions=file_actions) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + + support.wait_process(pid, exitcode=0) with open(outfile) as f: self.assertEqual(f.read(), 'hello') @@ -1820,7 +1839,8 @@ def test_close_file(self): args = self.python_args('-c', script) pid = self.spawn_func(args[0], args, os.environ, file_actions=[(os.POSIX_SPAWN_CLOSE, 0)]) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + + support.wait_process(pid, exitcode=0) with open(closefile) as f: self.assertEqual(f.read(), 'is closed %d' % errno.EBADF) @@ -1838,7 +1858,7 @@ def test_dup2(self): args = self.python_args('-c', script) pid = self.spawn_func(args[0], args, os.environ, file_actions=file_actions) - self.assertEqual(os.waitpid(pid, 0), (pid, 0)) + support.wait_process(pid, exitcode=0) with open(dupfile) as f: self.assertEqual(f.read(), 'hello') @@ -1870,13 +1890,12 @@ def test_posix_spawnp(self): spawn_args = (program, '-I', '-S', '-c', 'pass') code = textwrap.dedent(""" import os + from test import support + args = %a pid = os.posix_spawnp(args[0], args, os.environ) - pid2, status = os.waitpid(pid, 0) - if pid2 != pid: - raise Exception(f"pid {pid2} != {pid}") - if status != 0: - raise Exception(f"status {status} != 0") + + support.wait_process(pid, exitcode=0) """ % (spawn_args,)) # Use a subprocess to test os.posix_spawnp() with a modified PATH @@ -1886,6 +1905,233 @@ def test_posix_spawnp(self): assert_python_ok(*args, PATH=path) +@unittest.skipUnless(sys.platform == "darwin", "test weak linking on macOS") +class TestPosixWeaklinking(unittest.TestCase): + # These test cases verify that weak linking support on macOS works + # as expected. These cases only test new behaviour introduced by weak linking, + # regular behaviour is tested by the normal test cases. + # + # See the section on Weak Linking in Mac/README.txt for more information. + def setUp(self): + import sysconfig + import platform + + config_vars = sysconfig.get_config_vars() + self.available = { nm for nm in config_vars if nm.startswith("HAVE_") and config_vars[nm] } + self.mac_ver = tuple(int(part) for part in platform.mac_ver()[0].split(".")) + + def _verify_available(self, name): + if name not in self.available: + raise unittest.SkipTest(f"{name} not weak-linked") + + def test_pwritev(self): + self._verify_available("HAVE_PWRITEV") + if self.mac_ver >= (10, 16): + self.assertTrue(hasattr(os, "pwritev"), "os.pwritev is not available") + self.assertTrue(hasattr(os, "preadv"), "os.readv is not available") + + else: + self.assertFalse(hasattr(os, "pwritev"), "os.pwritev is available") + self.assertFalse(hasattr(os, "preadv"), "os.readv is available") + + def test_stat(self): + self._verify_available("HAVE_FSTATAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_FSTATAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_FSTATAT", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.stat("file", dir_fd=0) + + def test_access(self): + self._verify_available("HAVE_FACCESSAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_FACCESSAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_FACCESSAT", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.access("file", os.R_OK, dir_fd=0) + + with self.assertRaisesRegex(NotImplementedError, "follow_symlinks unavailable"): + os.access("file", os.R_OK, follow_symlinks=False) + + with self.assertRaisesRegex(NotImplementedError, "effective_ids unavailable"): + os.access("file", os.R_OK, effective_ids=True) + + def test_chmod(self): + self._verify_available("HAVE_FCHMODAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_FCHMODAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_FCHMODAT", posix._have_functions) + self.assertIn("HAVE_LCHMOD", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.chmod("file", 0o644, dir_fd=0) + + def test_chown(self): + self._verify_available("HAVE_FCHOWNAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_FCHOWNAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_FCHOWNAT", posix._have_functions) + self.assertIn("HAVE_LCHOWN", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.chown("file", 0, 0, dir_fd=0) + + def test_link(self): + self._verify_available("HAVE_LINKAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_LINKAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_LINKAT", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "src_dir_fd unavailable"): + os.link("source", "target", src_dir_fd=0) + + with self.assertRaisesRegex(NotImplementedError, "dst_dir_fd unavailable"): + os.link("source", "target", dst_dir_fd=0) + + with self.assertRaisesRegex(NotImplementedError, "src_dir_fd unavailable"): + os.link("source", "target", src_dir_fd=0, dst_dir_fd=0) + + # issue 41355: !HAVE_LINKAT code path ignores the follow_symlinks flag + with support.temp_dir() as base_path: + link_path = os.path.join(base_path, "link") + target_path = os.path.join(base_path, "target") + source_path = os.path.join(base_path, "source") + + with open(source_path, "w") as fp: + fp.write("data") + + os.symlink("target", link_path) + + # Calling os.link should fail in the link(2) call, and + # should not reject *follow_symlinks* (to match the + # behaviour you'd get when building on a platform without + # linkat) + with self.assertRaises(FileExistsError): + os.link(source_path, link_path, follow_symlinks=True) + + with self.assertRaises(FileExistsError): + os.link(source_path, link_path, follow_symlinks=False) + + + def test_listdir_scandir(self): + self._verify_available("HAVE_FDOPENDIR") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_FDOPENDIR", posix._have_functions) + + else: + self.assertNotIn("HAVE_FDOPENDIR", posix._have_functions) + + with self.assertRaisesRegex(TypeError, "listdir: path should be string, bytes, os.PathLike or None, not int"): + os.listdir(0) + + with self.assertRaisesRegex(TypeError, "scandir: path should be string, bytes, os.PathLike or None, not int"): + os.scandir(0) + + def test_mkdir(self): + self._verify_available("HAVE_MKDIRAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_MKDIRAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_MKDIRAT", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.mkdir("dir", dir_fd=0) + + def test_rename_replace(self): + self._verify_available("HAVE_RENAMEAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_RENAMEAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_RENAMEAT", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "src_dir_fd and dst_dir_fd unavailable"): + os.rename("a", "b", src_dir_fd=0) + + with self.assertRaisesRegex(NotImplementedError, "src_dir_fd and dst_dir_fd unavailable"): + os.rename("a", "b", dst_dir_fd=0) + + with self.assertRaisesRegex(NotImplementedError, "src_dir_fd and dst_dir_fd unavailable"): + os.replace("a", "b", src_dir_fd=0) + + with self.assertRaisesRegex(NotImplementedError, "src_dir_fd and dst_dir_fd unavailable"): + os.replace("a", "b", dst_dir_fd=0) + + def test_unlink_rmdir(self): + self._verify_available("HAVE_UNLINKAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_UNLINKAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_UNLINKAT", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.unlink("path", dir_fd=0) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.rmdir("path", dir_fd=0) + + def test_open(self): + self._verify_available("HAVE_OPENAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_OPENAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_OPENAT", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.open("path", os.O_RDONLY, dir_fd=0) + + def test_readlink(self): + self._verify_available("HAVE_READLINKAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_READLINKAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_READLINKAT", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.readlink("path", dir_fd=0) + + def test_symlink(self): + self._verify_available("HAVE_SYMLINKAT") + if self.mac_ver >= (10, 10): + self.assertIn("HAVE_SYMLINKAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_SYMLINKAT", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.symlink("a", "b", dir_fd=0) + + def test_utime(self): + self._verify_available("HAVE_FUTIMENS") + self._verify_available("HAVE_UTIMENSAT") + if self.mac_ver >= (10, 13): + self.assertIn("HAVE_FUTIMENS", posix._have_functions) + self.assertIn("HAVE_UTIMENSAT", posix._have_functions) + + else: + self.assertNotIn("HAVE_FUTIMENS", posix._have_functions) + self.assertNotIn("HAVE_UTIMENSAT", posix._have_functions) + + with self.assertRaisesRegex(NotImplementedError, "dir_fd unavailable"): + os.utime("path", dir_fd=0) + + def test_main(): try: support.run_unittest( @@ -1893,6 +2139,7 @@ def test_main(): PosixGroupsTester, TestPosixSpawn, TestPosixSpawnP, + TestPosixWeaklinking ) finally: support.reap_children() diff --git a/Lib/test/test_posixpath.py b/Lib/test/test_posixpath.py index 4d3d8976d6046892b511cce6475448513b66659e..18819a5dc1cfee2197d85789fa2abb1dc43b8b19 100644 --- a/Lib/test/test_posixpath.py +++ b/Lib/test/test_posixpath.py @@ -627,7 +627,7 @@ class PathLikeTests(unittest.TestCase): path = posixpath def setUp(self): - self.file_name = support.TESTFN.lower() + self.file_name = support.TESTFN self.file_path = FakePath(support.TESTFN) self.addCleanup(support.unlink, self.file_name) with open(self.file_name, 'xb', 0) as file: diff --git a/Lib/test/test_pprint.py b/Lib/test/test_pprint.py index 269ac0624eeb8b377064789ef5d51cf3601e7f2d..cf3e4f093b16eeaec2e9d29e7482434fc0246b6d 100644 --- a/Lib/test/test_pprint.py +++ b/Lib/test/test_pprint.py @@ -346,6 +346,65 @@ def test_mapping_proxy(self): ('lazy', 7), ('dog', 8)]))""") + def test_empty_simple_namespace(self): + ns = types.SimpleNamespace() + formatted = pprint.pformat(ns) + self.assertEqual(formatted, "namespace()") + + def test_small_simple_namespace(self): + ns = types.SimpleNamespace(a=1, b=2) + formatted = pprint.pformat(ns) + self.assertEqual(formatted, "namespace(a=1, b=2)") + + def test_simple_namespace(self): + ns = types.SimpleNamespace( + the=0, + quick=1, + brown=2, + fox=3, + jumped=4, + over=5, + a=6, + lazy=7, + dog=8, + ) + formatted = pprint.pformat(ns, width=60) + self.assertEqual(formatted, """\ +namespace(the=0, + quick=1, + brown=2, + fox=3, + jumped=4, + over=5, + a=6, + lazy=7, + dog=8)""") + + def test_simple_namespace_subclass(self): + class AdvancedNamespace(types.SimpleNamespace): pass + ns = AdvancedNamespace( + the=0, + quick=1, + brown=2, + fox=3, + jumped=4, + over=5, + a=6, + lazy=7, + dog=8, + ) + formatted = pprint.pformat(ns, width=60) + self.assertEqual(formatted, """\ +AdvancedNamespace(the=0, + quick=1, + brown=2, + fox=3, + jumped=4, + over=5, + a=6, + lazy=7, + dog=8)""") + def test_subclassing(self): o = {'names with spaces': 'should be presented using repr()', 'others.should.not.be': 'like.this'} @@ -422,7 +481,7 @@ def test_set_of_sets_reprs(self): # Consequently, this test is fragile and # implementation-dependent. Small changes to Python's sort # algorithm cause the test to fail when it should pass. - # XXX Or changes to the dictionary implmentation... + # XXX Or changes to the dictionary implementation... cube_repr_tgt = """\ {frozenset(): frozenset({frozenset({2}), frozenset({0}), frozenset({1})}), diff --git a/Lib/test/test_profile.py b/Lib/test/test_profile.py index 01a8a6eaf5a23cc9e95e821b1cc044d0dbbfa290..233649899ec20c0cf1a25fc4d4b1c9eff6d9f86e 100644 --- a/Lib/test/test_profile.py +++ b/Lib/test/test_profile.py @@ -6,7 +6,7 @@ import os from difflib import unified_diff from io import StringIO -from test.support import TESTFN, run_unittest, unlink +from test.support import TESTFN, run_unittest, unlink, temp_dir, change_cwd from contextlib import contextmanager import profile @@ -111,6 +111,20 @@ def test_run_profile_as_module(self): assert_python_ok('-m', self.profilermodule.__name__, '-m', 'timeit', '-n', '1') + def test_output_file_when_changing_directory(self): + with temp_dir() as tmpdir, change_cwd(tmpdir): + os.mkdir('dest') + with open('demo.py', 'w') as f: + f.write('import os; os.chdir("dest")') + + assert_python_ok( + '-m', self.profilermodule.__name__, + '-o', 'out.pstats', + 'demo.py', + ) + + self.assertTrue(os.path.exists('out.pstats')) + def regenerate_expected_output(filename, cls): filename = filename.rstrip('co') diff --git a/Lib/test/test_property.py b/Lib/test/test_property.py index f6f8f5ed0e45ee604ec517dc211e5cc4172f6cc2..172737ade143fa642a5a71f37865d66f243bfd8e 100644 --- a/Lib/test/test_property.py +++ b/Lib/test/test_property.py @@ -183,6 +183,27 @@ def test_refleaks_in___init__(self): fake_prop.__init__('fget', 'fset', 'fdel', 'doc') self.assertAlmostEqual(gettotalrefcount() - refs_before, 0, delta=10) + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + def test_class_property(self): + class A: + @classmethod + @property + def __doc__(cls): + return 'A doc for %r' % cls.__name__ + self.assertEqual(A.__doc__, "A doc for 'A'") + + @unittest.skipIf(sys.flags.optimize >= 2, + "Docstrings are omitted with -O2 and above") + def test_class_property_override(self): + class A: + """First""" + @classmethod + @property + def __doc__(cls): + return 'Second' + self.assertEqual(A.__doc__, 'Second') + # Issue 5890: subclasses of property do not preserve method __doc__ strings class PropertySub(property): diff --git a/Lib/test/test_pstats.py b/Lib/test/test_pstats.py index f835ce309a60e1130f1d43c35049f4be38cf98e5..4f78b99fd1cae79a3fa5c9b37de0a71a25c09abd 100644 --- a/Lib/test/test_pstats.py +++ b/Lib/test/test_pstats.py @@ -1,10 +1,11 @@ import unittest + from test import support from io import StringIO -import pstats from pstats import SortKey - +import pstats +import cProfile class AddCallersTestCase(unittest.TestCase): """Tests for pstats.add_callers helper.""" @@ -75,6 +76,28 @@ def test_sort_starts_mix(self): SortKey.TIME, 'calls') + def test_get_stats_profile(self): + def pass1(): pass + def pass2(): pass + def pass3(): pass + + pr = cProfile.Profile() + pr.enable() + pass1() + pass2() + pass3() + pr.create_stats() + ps = pstats.Stats(pr) + + stats_profile = ps.get_stats_profile() + funcs_called = set(stats_profile.func_profiles.keys()) + self.assertIn('pass1', funcs_called) + self.assertIn('pass2', funcs_called) + self.assertIn('pass3', funcs_called) + + def test_SortKey_enum(self): + self.assertEqual(SortKey.FILENAME, 'filename') + self.assertNotEqual(SortKey.FILENAME, SortKey.CALLS) if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py index dfb3a3fc32644a5aa9cc2eb26cf326e084919a59..9c32467cbbd64b0d2ea145c49a5c2367736055c9 100644 --- a/Lib/test/test_pty.py +++ b/Lib/test/test_pty.py @@ -200,8 +200,8 @@ def test_fork(self): ## raise TestFailed("Unexpected output from child: %r" % line) (pid, status) = os.waitpid(pid, 0) - res = status >> 8 - debug("Child (%d) exited with status %d (%d)." % (pid, res, status)) + res = os.waitstatus_to_exitcode(status) + debug("Child (%d) exited with code %d (status %d)." % (pid, res, status)) if res == 1: self.fail("Child raised an unexpected exception in os.setsid()") elif res == 2: diff --git a/Lib/test/test_py_compile.py b/Lib/test/test_py_compile.py index d4a68c9320d04f1bece7bab80630592d2bad0b6c..e6791c6916ea7fcabaf8873c5ad0620fa9564877 100644 --- a/Lib/test/test_py_compile.py +++ b/Lib/test/test_py_compile.py @@ -4,11 +4,13 @@ import py_compile import shutil import stat +import subprocess import sys import tempfile import unittest from test import support +from test.support import script_helper def without_source_date_epoch(fxn): @@ -216,5 +218,59 @@ class PyCompileTestsWithoutSourceEpoch(PyCompileTestsBase, pass +class PyCompileCLITestCase(unittest.TestCase): + + def setUp(self): + self.directory = tempfile.mkdtemp() + self.source_path = os.path.join(self.directory, '_test.py') + self.cache_path = importlib.util.cache_from_source(self.source_path) + with open(self.source_path, 'w') as file: + file.write('x = 123\n') + + def tearDown(self): + support.rmtree(self.directory) + + def pycompilecmd(self, *args, **kwargs): + # assert_python_* helpers don't return proc object. We'll just use + # subprocess.run() instead of spawn_python() and its friends to test + # stdin support of the CLI. + if args and args[0] == '-' and 'input' in kwargs: + return subprocess.run([sys.executable, '-m', 'py_compile', '-'], + input=kwargs['input'].encode(), + capture_output=True) + return script_helper.assert_python_ok('-m', 'py_compile', *args, **kwargs) + + def pycompilecmd_failure(self, *args): + return script_helper.assert_python_failure('-m', 'py_compile', *args) + + def test_stdin(self): + result = self.pycompilecmd('-', input=self.source_path) + self.assertEqual(result.returncode, 0) + self.assertEqual(result.stdout, b'') + self.assertEqual(result.stderr, b'') + self.assertTrue(os.path.exists(self.cache_path)) + + def test_with_files(self): + rc, stdout, stderr = self.pycompilecmd(self.source_path, self.source_path) + self.assertEqual(rc, 0) + self.assertEqual(stdout, b'') + self.assertEqual(stderr, b'') + self.assertTrue(os.path.exists(self.cache_path)) + + def test_bad_syntax(self): + bad_syntax = os.path.join(os.path.dirname(__file__), 'badsyntax_3131.py') + rc, stdout, stderr = self.pycompilecmd_failure(bad_syntax) + self.assertEqual(rc, 1) + self.assertEqual(stdout, b'') + self.assertIn(b'SyntaxError', stderr) + + def test_file_not_exists(self): + should_not_exists = os.path.join(os.path.dirname(__file__), 'should_not_exists.py') + rc, stdout, stderr = self.pycompilecmd_failure(self.source_path, should_not_exists) + self.assertEqual(rc, 1) + self.assertEqual(stdout, b'') + self.assertIn(b'No such file or directory', stderr) + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_pyclbr.py b/Lib/test/test_pyclbr.py index fafe17ce5f1b308996120b55fb89b1395ff69fba..869799cfa9a66bc9fe695a0bda6d191b9bba660d 100644 --- a/Lib/test/test_pyclbr.py +++ b/Lib/test/test_pyclbr.py @@ -223,9 +223,7 @@ def test_others(self): cm('random', ignore=('Random',)) # from _random import Random as CoreGenerator cm('cgi', ignore=('log',)) # set with = in module cm('pickle', ignore=('partial', 'PickleBuffer')) - # TODO(briancurtin): openfp is deprecated as of 3.7. - # Update this once it has been removed. - cm('aifc', ignore=('openfp', '_aifc_params')) # set with = in module + cm('aifc', ignore=('_aifc_params',)) # set with = in module cm('sre_parse', ignore=('dump', 'groups', 'pos')) # from sre_constants import *; property cm('pdb') cm('pydoc', ignore=('input', 'output',)) # properties @@ -249,7 +247,7 @@ def test_dotted_name_not_a_package(self): # not a package. # # Issue #14798. - self.assertRaises(ImportError, pyclbr.readmodule_ex, 'asyncore.foo') + self.assertRaises(ImportError, pyclbr.readmodule_ex, 'asyncio.foo') def test_module_has_no_spec(self): module_name = "doesnotexist" diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py index c80477c50f0980e3168475a10cb49a1f28ab0911..ffabb7f1b9407263457d04922f1962636d232cab 100644 --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -476,6 +476,7 @@ def test_getpager_with_stdin_none(self): def test_non_str_name(self): # issue14638 # Treat illegal (non-str) name like no name + class A: __name__ = 42 class B: @@ -1254,7 +1255,9 @@ class X: X.attr.__doc__ = 'Custom descriptor' self.assertEqual(self._get_summary_lines(X.attr), """\ -.Descr object>""") +.Descr object> + Custom descriptor +""") X.attr.__name__ = 'foo' self.assertEqual(self._get_summary_lines(X.attr), """\ @@ -1311,6 +1314,17 @@ async def an_async_generator(): 'async an_async_generator', html) + def test_html_for_https_links(self): + def a_fn_with_https_link(): + """a link https://localhost/""" + pass + + html = pydoc.HTMLDoc().document(a_fn_with_https_link) + self.assertIn( + 'https://localhost/', + html + ) + class PydocServerTest(unittest.TestCase): """Tests for pydoc._start_server""" @@ -1325,7 +1339,7 @@ def my_url_handler(url, content_type): self.assertIn('0.0.0.0', serverthread.docserver.address) starttime = time.monotonic() - timeout = 1 #seconds + timeout = test.support.SHORT_TIMEOUT while serverthread.serving: time.sleep(.01) diff --git a/Lib/test/test_pyexpat.py b/Lib/test/test_pyexpat.py index 2b6c2d20e74612e7e0f83b49551195baa863eb7b..b2b4dea060532d8cad2db4a0f29b154a8688c41c 100644 --- a/Lib/test/test_pyexpat.py +++ b/Lib/test/test_pyexpat.py @@ -3,6 +3,7 @@ from io import BytesIO import os +import platform import sys import sysconfig import unittest @@ -230,7 +231,7 @@ def test_parse_bytes(self): parser = expat.ParserCreate(namespace_separator='!') self._hookup_callbacks(parser, out) - parser.Parse(data, 1) + parser.Parse(data, True) operations = out.out self._verify_parse_output(operations) @@ -242,7 +243,7 @@ def test_parse_str(self): parser = expat.ParserCreate(namespace_separator='!') self._hookup_callbacks(parser, out) - parser.Parse(data.decode('iso-8859-1'), 1) + parser.Parse(data.decode('iso-8859-1'), True) operations = out.out self._verify_parse_output(operations) @@ -315,7 +316,7 @@ def collector(name, *args): L.append(name) p.StartElementHandler = collector p.EndElementHandler = collector - p.Parse(b" ", 1) + p.Parse(b" ", True) tag = L[0] self.assertEqual(len(L), 6) for entry in L: @@ -331,14 +332,14 @@ def __init__(self, parser): def ExternalEntityRefHandler(self, context, base, sysId, pubId): external_parser = self.parser.ExternalEntityParserCreate("") - self.parser_result = external_parser.Parse(b"", 1) + self.parser_result = external_parser.Parse(b"", True) return 1 parser = expat.ParserCreate(namespace_separator='!') parser.buffer_text = 1 out = ExternalOutputter(parser) parser.ExternalEntityRefHandler = out.ExternalEntityRefHandler - parser.Parse(data, 1) + parser.Parse(data, True) self.assertEqual(out.parser_result, 1) @@ -382,7 +383,7 @@ def test_default_to_disabled(self): def test_buffering_enabled(self): # Make sure buffering is turned on self.assertTrue(self.parser.buffer_text) - self.parser.Parse(b"123", 1) + self.parser.Parse(b"123", True) self.assertEqual(self.stuff, ['123'], "buffered text not properly collapsed") @@ -390,39 +391,39 @@ def test1(self): # XXX This test exposes more detail of Expat's text chunking than we # XXX like, but it tests what we need to concisely. self.setHandlers(["StartElementHandler"]) - self.parser.Parse(b"12\n34\n5", 1) + self.parser.Parse(b"12\n34\n5", True) self.assertEqual(self.stuff, ["", "1", "", "2", "\n", "3", "", "4\n5"], "buffering control not reacting as expected") def test2(self): - self.parser.Parse(b"1<2> \n 3", 1) + self.parser.Parse(b"1<2> \n 3", True) self.assertEqual(self.stuff, ["1<2> \n 3"], "buffered text not properly collapsed") def test3(self): self.setHandlers(["StartElementHandler"]) - self.parser.Parse(b"123", 1) + self.parser.Parse(b"123", True) self.assertEqual(self.stuff, ["", "1", "", "2", "", "3"], "buffered text not properly split") def test4(self): self.setHandlers(["StartElementHandler", "EndElementHandler"]) self.parser.CharacterDataHandler = None - self.parser.Parse(b"123", 1) + self.parser.Parse(b"123", True) self.assertEqual(self.stuff, ["", "", "", "", "", ""]) def test5(self): self.setHandlers(["StartElementHandler", "EndElementHandler"]) - self.parser.Parse(b"123", 1) + self.parser.Parse(b"123", True) self.assertEqual(self.stuff, ["", "1", "", "", "2", "", "", "3", ""]) def test6(self): self.setHandlers(["CommentHandler", "EndElementHandler", "StartElementHandler"]) - self.parser.Parse(b"12345 ", 1) + self.parser.Parse(b"12345 ", True) self.assertEqual(self.stuff, ["", "1", "", "", "2", "", "", "345", ""], "buffered text not properly split") @@ -430,7 +431,7 @@ def test6(self): def test7(self): self.setHandlers(["CommentHandler", "EndElementHandler", "StartElementHandler"]) - self.parser.Parse(b"12345 ", 1) + self.parser.Parse(b"12345 ", True) self.assertEqual(self.stuff, ["", "1", "", "", "2", "", "", "3", "", "4", "", "5", ""], @@ -450,7 +451,7 @@ def test_exception(self): parser = expat.ParserCreate() parser.StartElementHandler = self.StartElementHandler try: - parser.Parse(b"", 1) + parser.Parse(b"", True) self.fail() except RuntimeError as e: self.assertEqual(e.args[0], 'a', @@ -465,7 +466,7 @@ def test_exception(self): "pyexpat.c", "StartElement") self.check_traceback_entry(entries[2], "test_pyexpat.py", "StartElementHandler") - if sysconfig.is_python_build(): + if sysconfig.is_python_build() and not (sys.platform == 'win32' and platform.machine() == 'ARM'): self.assertIn('call_with_frame("StartElement"', entries[1][3]) @@ -498,7 +499,7 @@ def test(self): ('e', 15, 3, 6), ('e', 17, 4, 1), ('e', 22, 5, 0)] xml = b'\n \n \n \n' - self.parser.Parse(xml, 1) + self.parser.Parse(xml, True) class sf1296433Test(unittest.TestCase): @@ -578,7 +579,7 @@ def test_disabling_buffer(self): # Parse one chunk of XML self.n = 0 - parser.Parse(xml1, 0) + parser.Parse(xml1, False) self.assertEqual(parser.buffer_size, 1024) self.assertEqual(self.n, 1) @@ -587,13 +588,13 @@ def test_disabling_buffer(self): self.assertFalse(parser.buffer_text) self.assertEqual(parser.buffer_size, 1024) for i in range(10): - parser.Parse(xml2, 0) + parser.Parse(xml2, False) self.assertEqual(self.n, 11) parser.buffer_text = 1 self.assertTrue(parser.buffer_text) self.assertEqual(parser.buffer_size, 1024) - parser.Parse(xml3, 1) + parser.Parse(xml3, True) self.assertEqual(self.n, 12) def counting_handler(self, text): @@ -620,10 +621,10 @@ def test_change_size_1(self): self.assertEqual(parser.buffer_size, 1024) self.n = 0 - parser.Parse(xml1, 0) + parser.Parse(xml1, False) parser.buffer_size *= 2 self.assertEqual(parser.buffer_size, 2048) - parser.Parse(xml2, 1) + parser.Parse(xml2, True) self.assertEqual(self.n, 2) def test_change_size_2(self): @@ -636,10 +637,10 @@ def test_change_size_2(self): self.assertEqual(parser.buffer_size, 2048) self.n=0 - parser.Parse(xml1, 0) + parser.Parse(xml1, False) parser.buffer_size = parser.buffer_size // 2 self.assertEqual(parser.buffer_size, 1024) - parser.Parse(xml2, 1) + parser.Parse(xml2, True) self.assertEqual(self.n, 4) class MalformedInputTest(unittest.TestCase): diff --git a/Lib/test/test_queue.py b/Lib/test/test_queue.py index 46e2a8c540a72dcfc00768a54dcd854ddafa2e65..d88e28a9146ef033da584e7708349c0e11787d6c 100644 --- a/Lib/test/test_queue.py +++ b/Lib/test/test_queue.py @@ -63,7 +63,7 @@ def do_blocking_test(self, block_func, block_args, trigger_func, trigger_args): block_func) return self.result finally: - support.join_thread(thread, 10) # make sure the thread terminates + support.join_thread(thread) # make sure the thread terminates # Call this instead if block_func is supposed to raise an exception. def do_exceptional_blocking_test(self,block_func, block_args, trigger_func, @@ -79,7 +79,7 @@ def do_exceptional_blocking_test(self,block_func, block_args, trigger_func, self.fail("expected exception of kind %r" % expected_exception_class) finally: - support.join_thread(thread, 10) # make sure the thread terminates + support.join_thread(thread) # make sure the thread terminates if not thread.startedEvent.is_set(): self.fail("trigger thread ended but event never set") diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index 899ca108c65d985613c5c6be1431738017079dc4..15a68418bdd86a3aadead7ec4f696161d307518e 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -5,11 +5,13 @@ import time import pickle import warnings +import test.support + from functools import partial from math import log, exp, pi, fsum, sin, factorial from test import support from fractions import Fraction - +from collections import Counter class TestBasicOps: # Superclass with tests common to all generators. @@ -41,11 +43,17 @@ def test_seedargs(self): class MySeed(object): def __hash__(self): return -1729 - for arg in [None, 0, 0, 1, 1, -1, -1, 10**20, -(10**20), - 3.14, 1+2j, 'a', tuple('abc'), MySeed()]: + for arg in [None, 0, 1, -1, 10**20, -(10**20), + False, True, 3.14, 'a']: self.gen.seed(arg) + + for arg in [1+2j, tuple('abc'), MySeed()]: + with self.assertWarns(DeprecationWarning): + self.gen.seed(arg) + for arg in [list(range(3)), dict(one=1)]: - self.assertRaises(TypeError, self.gen.seed, arg) + with self.assertWarns(DeprecationWarning): + self.assertRaises(TypeError, self.gen.seed, arg) self.assertRaises(TypeError, self.gen.seed, 1, 2, 3, 4) self.assertRaises(TypeError, type(self.gen), []) @@ -97,7 +105,8 @@ def test_shuffle_random_argument(self): shuffle = self.gen.shuffle mock_random = unittest.mock.Mock(return_value=0.5) seq = bytearray(b'abcdefghijk') - shuffle(seq, mock_random) + with self.assertWarns(DeprecationWarning): + shuffle(seq, mock_random) mock_random.assert_called_with() def test_choice(self): @@ -141,7 +150,6 @@ def test_sample_distribution(self): def test_sample_inputs(self): # SF bug #801342 -- population can be any iterable defining __len__() - self.gen.sample(set(range(20)), 2) self.gen.sample(range(20), 2) self.gen.sample(range(20), 2) self.gen.sample(str('abcdefghijklmnopqrst'), 2) @@ -150,6 +158,55 @@ def test_sample_inputs(self): def test_sample_on_dicts(self): self.assertRaises(TypeError, self.gen.sample, dict.fromkeys('abcdef'), 2) + def test_sample_on_sets(self): + with self.assertWarns(DeprecationWarning): + population = {10, 20, 30, 40, 50, 60, 70} + self.gen.sample(population, k=5) + + def test_sample_with_counts(self): + sample = self.gen.sample + + # General case + colors = ['red', 'green', 'blue', 'orange', 'black', 'brown', 'amber'] + counts = [500, 200, 20, 10, 5, 0, 1 ] + k = 700 + summary = Counter(sample(colors, counts=counts, k=k)) + self.assertEqual(sum(summary.values()), k) + for color, weight in zip(colors, counts): + self.assertLessEqual(summary[color], weight) + self.assertNotIn('brown', summary) + + # Case that exhausts the population + k = sum(counts) + summary = Counter(sample(colors, counts=counts, k=k)) + self.assertEqual(sum(summary.values()), k) + for color, weight in zip(colors, counts): + self.assertLessEqual(summary[color], weight) + self.assertNotIn('brown', summary) + + # Case with population size of 1 + summary = Counter(sample(['x'], counts=[10], k=8)) + self.assertEqual(summary, Counter(x=8)) + + # Case with all counts equal. + nc = len(colors) + summary = Counter(sample(colors, counts=[10]*nc, k=10*nc)) + self.assertEqual(summary, Counter(10*colors)) + + # Test error handling + with self.assertRaises(TypeError): + sample(['red', 'green', 'blue'], counts=10, k=10) # counts not iterable + with self.assertRaises(ValueError): + sample(['red', 'green', 'blue'], counts=[-3, -7, -8], k=2) # counts are negative + with self.assertRaises(ValueError): + sample(['red', 'green', 'blue'], counts=[0, 0, 0], k=2) # counts are zero + with self.assertRaises(ValueError): + sample(['red', 'green'], counts=[10, 10], k=21) # population too small + with self.assertRaises(ValueError): + sample(['red', 'green', 'blue'], counts=[1, 2], k=2) # too few counts + with self.assertRaises(ValueError): + sample(['red', 'green', 'blue'], counts=[1, 2, 3, 4], k=2) # too many counts + def test_choices(self): choices = self.gen.choices data = ['red', 'green', 'blue', 'yellow'] @@ -235,6 +292,11 @@ def test_choices_subnormal(self): choices = self.gen.choices choices(population=[1, 2], weights=[1e-323, 1e-323], k=5000) + def test_choices_with_all_zero_weights(self): + # See issue #38881 + with self.assertRaises(ValueError): + self.gen.choices('AB', [0.0, 0.0]) + def test_gauss(self): # Ensure that the seed() method initializes all the hidden state. In # particular, through 2.2.1 it failed to reset a piece of state used @@ -252,6 +314,31 @@ def test_gauss(self): self.assertEqual(x1, x2) self.assertEqual(y1, y2) + def test_getrandbits(self): + # Verify ranges + for k in range(1, 1000): + self.assertTrue(0 <= self.gen.getrandbits(k) < 2**k) + self.assertEqual(self.gen.getrandbits(0), 0) + + # Verify all bits active + getbits = self.gen.getrandbits + for span in [1, 2, 3, 4, 31, 32, 32, 52, 53, 54, 119, 127, 128, 129]: + all_bits = 2**span-1 + cum = 0 + cpl_cum = 0 + for i in range(100): + v = getbits(span) + cum |= v + cpl_cum |= all_bits ^ v + self.assertEqual(cum, all_bits) + self.assertEqual(cpl_cum, all_bits) + + # Verify argument checking + self.assertRaises(TypeError, self.gen.getrandbits) + self.assertRaises(TypeError, self.gen.getrandbits, 1, 2) + self.assertRaises(ValueError, self.gen.getrandbits, -1) + self.assertRaises(TypeError, self.gen.getrandbits, 10.1) + def test_pickling(self): for proto in range(pickle.HIGHEST_PROTOCOL + 1): state = pickle.dumps(self.gen, proto) @@ -260,6 +347,14 @@ def test_pickling(self): restoredseq = [newgen.random() for i in range(10)] self.assertEqual(origseq, restoredseq) + @test.support.cpython_only + def test_bug_41052(self): + # _random.Random should not be allowed to serialization + import _random + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + r = _random.Random() + self.assertRaises(TypeError, pickle.dumps, r, proto) + def test_bug_1727780(self): # verify that version-2-pickles can be loaded # fine, whether they are created on 32-bit or 64-bit @@ -280,6 +375,22 @@ def test_bug_9025(self): k = sum(randrange(6755399441055744) % 3 == 2 for i in range(n)) self.assertTrue(0.30 < k/n < .37, (k/n)) + def test_randbytes(self): + # Verify ranges + for n in range(1, 10): + data = self.gen.randbytes(n) + self.assertEqual(type(data), bytes) + self.assertEqual(len(data), n) + + self.assertEqual(self.gen.randbytes(0), b'') + + # Verify argument checking + self.assertRaises(TypeError, self.gen.randbytes) + self.assertRaises(TypeError, self.gen.randbytes, 1, 2) + self.assertRaises(ValueError, self.gen.randbytes, -1) + self.assertRaises(TypeError, self.gen.randbytes, 1.0) + + try: random.SystemRandom().random() except NotImplementedError: @@ -363,26 +474,6 @@ def test_randrange_errors(self): raises(0, 42, 0) raises(0, 42, 3.14159) - def test_genrandbits(self): - # Verify ranges - for k in range(1, 1000): - self.assertTrue(0 <= self.gen.getrandbits(k) < 2**k) - - # Verify all bits active - getbits = self.gen.getrandbits - for span in [1, 2, 3, 4, 31, 32, 32, 52, 53, 54, 119, 127, 128, 129]: - cum = 0 - for i in range(100): - cum |= getbits(span) - self.assertEqual(cum, 2**span-1) - - # Verify argument checking - self.assertRaises(TypeError, self.gen.getrandbits) - self.assertRaises(TypeError, self.gen.getrandbits, 1, 2) - self.assertRaises(ValueError, self.gen.getrandbits, 0) - self.assertRaises(ValueError, self.gen.getrandbits, -1) - self.assertRaises(TypeError, self.gen.getrandbits, 10.1) - def test_randbelow_logic(self, _log=log, int=int): # check bitcount transition points: 2**i and 2**(i+1)-1 # show that: k = int(1.001 + _log(n, 2)) @@ -602,34 +693,18 @@ def test_rangelimits(self): self.assertEqual(set(range(start,stop)), set([self.gen.randrange(start,stop) for i in range(100)])) - def test_genrandbits(self): + def test_getrandbits(self): + super().test_getrandbits() + # Verify cross-platform repeatability self.gen.seed(1234567) self.assertEqual(self.gen.getrandbits(100), 97904845777343510404718956115) - # Verify ranges - for k in range(1, 1000): - self.assertTrue(0 <= self.gen.getrandbits(k) < 2**k) - - # Verify all bits active - getbits = self.gen.getrandbits - for span in [1, 2, 3, 4, 31, 32, 32, 52, 53, 54, 119, 127, 128, 129]: - cum = 0 - for i in range(100): - cum |= getbits(span) - self.assertEqual(cum, 2**span-1) - - # Verify argument checking - self.assertRaises(TypeError, self.gen.getrandbits) - self.assertRaises(TypeError, self.gen.getrandbits, 'a') - self.assertRaises(TypeError, self.gen.getrandbits, 1, 2) - self.assertRaises(ValueError, self.gen.getrandbits, 0) - self.assertRaises(ValueError, self.gen.getrandbits, -1) def test_randrange_uses_getrandbits(self): # Verify use of getrandbits by randrange # Use same seed as in the cross-platform repeatability test - # in test_genrandbits above. + # in test_getrandbits above. self.gen.seed(1234567) # If randrange uses getrandbits, it should pick getrandbits(100) # when called with a 100-bits stop argument. @@ -668,10 +743,10 @@ def test_randbelow_without_getrandbits(self): maxsize+1, maxsize=maxsize ) self.gen._randbelow_without_getrandbits(5640, maxsize=maxsize) - # issue 33203: test that _randbelow raises ValueError on + # issue 33203: test that _randbelow returns zero on # n == 0 also in its getrandbits-independent branch. - with self.assertRaises(ValueError): - self.gen._randbelow_without_getrandbits(0, maxsize=maxsize) + x = self.gen._randbelow_without_getrandbits(0, maxsize=maxsize) + self.assertEqual(x, 0) # This might be going too far to test a single line, but because of our # noble aim of achieving 100% test coverage we need to write a case in @@ -736,6 +811,84 @@ def test_choices_algorithms(self): c = self.gen.choices(population, cum_weights=cum_weights, k=10000) self.assertEqual(a, c) + def test_randbytes(self): + super().test_randbytes() + + # Mersenne Twister randbytes() is deterministic + # and does not depend on the endian and bitness. + seed = 8675309 + expected = b'3\xa8\xf9f\xf4\xa4\xd06\x19\x8f\x9f\x82\x02oe\xf0' + + self.gen.seed(seed) + self.assertEqual(self.gen.randbytes(16), expected) + + # randbytes(0) must not consume any entropy + self.gen.seed(seed) + self.assertEqual(self.gen.randbytes(0), b'') + self.assertEqual(self.gen.randbytes(16), expected) + + # Four randbytes(4) calls give the same output than randbytes(16) + self.gen.seed(seed) + self.assertEqual(b''.join([self.gen.randbytes(4) for _ in range(4)]), + expected) + + # Each randbytes(1), randbytes(2) or randbytes(3) call consumes + # 4 bytes of entropy + self.gen.seed(seed) + expected1 = expected[3::4] + self.assertEqual(b''.join(self.gen.randbytes(1) for _ in range(4)), + expected1) + + self.gen.seed(seed) + expected2 = b''.join(expected[i + 2: i + 4] + for i in range(0, len(expected), 4)) + self.assertEqual(b''.join(self.gen.randbytes(2) for _ in range(4)), + expected2) + + self.gen.seed(seed) + expected3 = b''.join(expected[i + 1: i + 4] + for i in range(0, len(expected), 4)) + self.assertEqual(b''.join(self.gen.randbytes(3) for _ in range(4)), + expected3) + + def test_randbytes_getrandbits(self): + # There is a simple relation between randbytes() and getrandbits() + seed = 2849427419 + gen2 = random.Random() + self.gen.seed(seed) + gen2.seed(seed) + for n in range(9): + self.assertEqual(self.gen.randbytes(n), + gen2.getrandbits(n * 8).to_bytes(n, 'little')) + + def test_sample_counts_equivalence(self): + # Test the documented strong equivalence to a sample with repeated elements. + # We run this test on random.Random() which makes deterministic selections + # for a given seed value. + sample = self.gen.sample + seed = self.gen.seed + + colors = ['red', 'green', 'blue', 'orange', 'black', 'amber'] + counts = [500, 200, 20, 10, 5, 1 ] + k = 700 + seed(8675309) + s1 = sample(colors, counts=counts, k=k) + seed(8675309) + expanded = [color for (color, count) in zip(colors, counts) for i in range(count)] + self.assertEqual(len(expanded), sum(counts)) + s2 = sample(expanded, k=k) + self.assertEqual(s1, s2) + + pop = 'abcdefghi' + counts = [10, 9, 8, 7, 6, 5, 4, 3, 2] + seed(8675309) + s1 = ''.join(sample(pop, counts=counts, k=30)) + expanded = ''.join([letter for (letter, count) in zip(pop, counts) for i in range(count)]) + seed(8675309) + s2 = ''.join(sample(expanded, k=30)) + self.assertEqual(s1, s2) + + def gamma(z, sqrt2pi=(2.0*pi)**0.5): # Reflection to right half of complex plane if z < 0.5: @@ -1092,8 +1245,7 @@ def test_after_fork(self): child_val = eval(f.read()) self.assertNotEqual(val, child_val) - pid, status = os.waitpid(pid, 0) - self.assertEqual(status, 0) + support.wait_process(pid, exitcode=0) if __name__ == "__main__": diff --git a/Lib/test/test_range.py b/Lib/test/test_range.py index 94c96a941b120f0193813f88518b284cbe3246d8..30fa129b50ecba53dbf0bef744f22554ebf960bb 100644 --- a/Lib/test/test_range.py +++ b/Lib/test/test_range.py @@ -4,6 +4,7 @@ import sys import pickle import itertools +from test.support import ALWAYS_EQ # pure Python implementations (3 args only), for comparison def pyrange(start, stop, step): @@ -90,6 +91,19 @@ def test_range(self): r = range(-sys.maxsize, sys.maxsize, 2) self.assertEqual(len(r), sys.maxsize) + def test_range_constructor_error_messages(self): + with self.assertRaisesRegex( + TypeError, + "range expected at least 1 argument, got 0" + ): + range() + + with self.assertRaisesRegex( + TypeError, + "range expected at most 3 arguments, got 6" + ): + range(1, 2, 3, 4, 5, 6) + def test_large_operands(self): x = range(10**20, 10**20+10, 3) self.assertEqual(len(x), 4) @@ -289,11 +303,7 @@ def __eq__(self, other): self.assertRaises(ValueError, range(1, 2**100, 2).index, 2**87) self.assertEqual(range(1, 2**100, 2).index(2**87+1), 2**86) - class AlwaysEqual(object): - def __eq__(self, other): - return True - always_equal = AlwaysEqual() - self.assertEqual(range(10).index(always_equal), 0) + self.assertEqual(range(10).index(ALWAYS_EQ), 0) def test_user_index_method(self): bignum = 2*sys.maxsize @@ -344,11 +354,7 @@ def test_count(self): self.assertEqual(range(1, 2**100, 2).count(2**87), 0) self.assertEqual(range(1, 2**100, 2).count(2**87+1), 1) - class AlwaysEqual(object): - def __eq__(self, other): - return True - always_equal = AlwaysEqual() - self.assertEqual(range(10).count(always_equal), 10) + self.assertEqual(range(10).count(ALWAYS_EQ), 10) self.assertEqual(len(range(sys.maxsize, sys.maxsize+10)), 10) @@ -429,9 +435,7 @@ def test_types(self): self.assertIn(True, range(3)) self.assertIn(1+0j, range(3)) - class C1: - def __eq__(self, other): return True - self.assertIn(C1(), range(3)) + self.assertIn(ALWAYS_EQ, range(3)) # Objects are never coerced into other types for comparison. class C2: diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index 4817d761a22df91c1fdf4cc53a11ac7d1ba3938c..1bfbcb853c4ed1a8b79fc963ffed4e375c52faa9 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -2217,7 +2217,7 @@ def test_re_benchmarks(self): def test_re_tests(self): 're_tests test suite' - from test.re_tests import tests, SUCCEED, FAIL, SYNTAX_ERROR + from test.re_tests import tests, FAIL, SYNTAX_ERROR for t in tests: pattern = s = outcome = repl = expected = None if len(t) == 5: diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index f89b1af7743fbd203762cadd041014819740281a..a77638b10afd5f2f469a026554befbcb426daeac 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -5,7 +5,6 @@ """ import contextlib -import faulthandler import glob import io import os.path @@ -55,8 +54,6 @@ def test_help(self): libregrtest._parse_args([opt]) self.assertIn('Run Python regression tests.', out.getvalue()) - @unittest.skipUnless(hasattr(faulthandler, 'dump_traceback_later'), - "faulthandler.dump_traceback_later() required") def test_timeout(self): ns = libregrtest._parse_args(['--timeout', '4.2']) self.assertEqual(ns.timeout, 4.2) @@ -520,7 +517,7 @@ def run_command(self, args, input=None, exitcode=0, **kw): if not input: input = '' if 'stderr' not in kw: - kw['stderr'] = subprocess.PIPE + kw['stderr'] = subprocess.STDOUT proc = subprocess.run(args, universal_newlines=True, input=input, @@ -592,8 +589,7 @@ def setUp(self): self.python_args = ['-Wd', '-E', '-bb'] self.regrtest_args = ['-uall', '-rwW', '--testdir=%s' % self.tmptestdir] - if hasattr(faulthandler, 'dump_traceback_later'): - self.regrtest_args.extend(('--timeout', '3600', '-j4')) + self.regrtest_args.extend(('--timeout', '3600', '-j4')) if sys.platform == 'win32': self.regrtest_args.append('-n') @@ -664,6 +660,8 @@ def test_tools_buildbot_test(self): test_args = ['--testdir=%s' % self.tmptestdir] if platform.machine() == 'ARM64': test_args.append('-arm64') # ARM 64-bit build + elif platform.machine() == 'ARM': + test_args.append('-arm32') # 32-bit ARM build elif platform.architecture()[0] == '64bit': test_args.append('-x64') # 64-bit build if not Py_DEBUG: @@ -679,6 +677,8 @@ def test_pcbuild_rt(self): rt_args = ["-q"] # Quick, don't run tests twice if platform.machine() == 'ARM64': rt_args.append('-arm64') # ARM 64-bit build + elif platform.machine() == 'ARM': + rt_args.append('-arm32') # 32-bit ARM build elif platform.architecture()[0] == '64bit': rt_args.append('-x64') # 64-bit build if Py_DEBUG: @@ -1233,6 +1233,39 @@ def test_sleep(self): self.assertRegex(output, re.compile('%s timed out' % testname, re.MULTILINE)) + def test_unraisable_exc(self): + # --fail-env-changed must catch unraisable exception. + # The exceptioin must be displayed even if sys.stderr is redirected. + code = textwrap.dedent(r""" + import unittest + import weakref + from test.support import captured_stderr + + class MyObject: + pass + + def weakref_callback(obj): + raise Exception("weakref callback bug") + + class Tests(unittest.TestCase): + def test_unraisable_exc(self): + obj = MyObject() + ref = weakref.ref(obj, weakref_callback) + with captured_stderr() as stderr: + # call weakref_callback() which logs + # an unraisable exception + obj = None + self.assertEqual(stderr.getvalue(), '') + """) + testname = self.create_test(code=code) + + output = self.run_tests("--fail-env-changed", "-v", testname, exitcode=3) + self.check_executed_tests(output, [testname], + env_changed=[testname], + fail_env_changed=True) + self.assertIn("Warning -- Unraisable exception", output) + self.assertIn("Exception: weakref callback bug", output) + def test_cleanup(self): dirname = os.path.join(self.tmptestdir, "test_python_123") os.mkdir(dirname) diff --git a/Lib/test/test_robotparser.py b/Lib/test/test_robotparser.py index 77cd7c4d29dfe6f5f12ee3bc0578967db759a12d..a3112b8fdf473535d4ffbc5e0f27ffb58b182fc4 100644 --- a/Lib/test/test_robotparser.py +++ b/Lib/test/test_robotparser.py @@ -4,6 +4,7 @@ import unittest import urllib.robotparser from test import support +from test.support import socket_helper from http.server import BaseHTTPRequestHandler, HTTPServer @@ -309,7 +310,10 @@ def log_message(self, format, *args): class PasswordProtectedSiteTestCase(unittest.TestCase): def setUp(self): - self.server = HTTPServer((support.HOST, 0), RobotHandler) + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + + self.server = HTTPServer((socket_helper.HOST, 0), RobotHandler) self.t = threading.Thread( name='HTTPServer serving', @@ -329,7 +333,7 @@ def tearDown(self): @support.reap_threads def testPasswordProtectedSite(self): addr = self.server.server_address - url = 'http://' + support.HOST + ':' + str(addr[1]) + url = 'http://' + socket_helper.HOST + ':' + str(addr[1]) robots_url = url + "/robots.txt" parser = urllib.robotparser.RobotFileParser() parser.set_url(url) @@ -345,7 +349,7 @@ class NetworkTestCase(unittest.TestCase): @classmethod def setUpClass(cls): support.requires('network') - with support.transient_internet(cls.base_url): + with socket_helper.transient_internet(cls.base_url): cls.parser = urllib.robotparser.RobotFileParser(cls.robots_txt) cls.parser.read() diff --git a/Lib/test/test_runpy.py b/Lib/test/test_runpy.py index 84834d39b1c216e821bf54cf4d2c0e847489e6c9..4aaf75b1bceb68734915450b2598ce7eb11d88a4 100644 --- a/Lib/test/test_runpy.py +++ b/Lib/test/test_runpy.py @@ -1,14 +1,17 @@ # Test the runpy module -import unittest -import os +import contextlib +import importlib.machinery, importlib.util import os.path -import sys +import pathlib +import py_compile import re +import signal +import subprocess +import sys import tempfile -import importlib, importlib.machinery, importlib.util -import py_compile +import textwrap +import unittest import warnings -import pathlib from test.support import ( forget, make_legacy_pyc, unload, verbose, no_tracing, create_empty_file, temp_dir) @@ -752,5 +755,82 @@ def test_encoding(self): self.assertEqual(result['s'], "non-ASCII: h\xe9") +class TestExit(unittest.TestCase): + STATUS_CONTROL_C_EXIT = 0xC000013A + EXPECTED_CODE = ( + STATUS_CONTROL_C_EXIT + if sys.platform == "win32" + else -signal.SIGINT + ) + @staticmethod + @contextlib.contextmanager + def tmp_path(*args, **kwargs): + with temp_dir() as tmp_fn: + yield pathlib.Path(tmp_fn) + + + def run(self, *args, **kwargs): + with self.tmp_path() as tmp: + self.ham = ham = tmp / "ham.py" + ham.write_text( + textwrap.dedent( + """\ + raise KeyboardInterrupt + """ + ) + ) + super().run(*args, **kwargs) + + def assertSigInt(self, *args, **kwargs): + proc = subprocess.run(*args, **kwargs, text=True, stderr=subprocess.PIPE) + self.assertTrue(proc.stderr.endswith("\nKeyboardInterrupt\n")) + self.assertEqual(proc.returncode, self.EXPECTED_CODE) + + def test_pymain_run_file(self): + self.assertSigInt([sys.executable, self.ham]) + + def test_pymain_run_file_runpy_run_module(self): + tmp = self.ham.parent + run_module = tmp / "run_module.py" + run_module.write_text( + textwrap.dedent( + """\ + import runpy + runpy.run_module("ham") + """ + ) + ) + self.assertSigInt([sys.executable, run_module], cwd=tmp) + + def test_pymain_run_file_runpy_run_module_as_main(self): + tmp = self.ham.parent + run_module_as_main = tmp / "run_module_as_main.py" + run_module_as_main.write_text( + textwrap.dedent( + """\ + import runpy + runpy._run_module_as_main("ham") + """ + ) + ) + self.assertSigInt([sys.executable, run_module_as_main], cwd=tmp) + + def test_pymain_run_command_run_module(self): + self.assertSigInt( + [sys.executable, "-c", "import runpy; runpy.run_module('ham')"], + cwd=self.ham.parent, + ) + + def test_pymain_run_command(self): + self.assertSigInt([sys.executable, "-c", "import ham"], cwd=self.ham.parent) + + def test_pymain_run_stdin(self): + self.assertSigInt([sys.executable], input="import ham", cwd=self.ham.parent) + + def test_pymain_run_module(self): + ham = self.ham + self.assertSigInt([sys.executable, "-m", ham.stem], cwd=ham.parent) + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_sax.py b/Lib/test/test_sax.py index da4eb1da3c6ada53918912cd1763af4313ce80ff..ce3a422b502a06dd9df1a872b6c12a7601ac9b90 100644 --- a/Lib/test/test_sax.py +++ b/Lib/test/test_sax.py @@ -20,6 +20,7 @@ import os.path import shutil from urllib.error import URLError +import urllib.request from test import support from test.support import findfile, run_unittest, FakePath, TESTFN @@ -979,6 +980,9 @@ def test_expat_dtdhandler(self): self.assertEqual(handler._entities, [("img", None, "expat.gif", "GIF")]) def test_expat_external_dtd_enabled(self): + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + parser = create_parser() parser.setFeature(feature_external_ges, True) resolver = self.TestEntityRecorder() diff --git a/Lib/test/test_sched.py b/Lib/test/test_sched.py index 3f84af2a4c2a9e7f0e3b8cd53bbba1d5919e47bf..26cb4be81e5e436cefe2db61b7e13d4e4bc81531 100644 --- a/Lib/test/test_sched.py +++ b/Lib/test/test_sched.py @@ -6,7 +6,7 @@ from test import support -TIMEOUT = 10 +TIMEOUT = support.SHORT_TIMEOUT class Timer: @@ -82,7 +82,7 @@ def test_enter_concurrent(self): self.assertEqual(q.get(timeout=TIMEOUT), 5) self.assertTrue(q.empty()) timer.advance(1000) - support.join_thread(t, timeout=TIMEOUT) + support.join_thread(t) self.assertTrue(q.empty()) self.assertEqual(timer.time(), 5) @@ -137,7 +137,7 @@ def test_cancel_concurrent(self): self.assertEqual(q.get(timeout=TIMEOUT), 4) self.assertTrue(q.empty()) timer.advance(1000) - support.join_thread(t, timeout=TIMEOUT) + support.join_thread(t) self.assertTrue(q.empty()) self.assertEqual(timer.time(), 4) diff --git a/Lib/test/test_selectors.py b/Lib/test/test_selectors.py index 31611224dc71e1f61c59d6ff058f0d0fc915a98d..2274c39a79a5327106032ef5ad381fb86bf02a7d 100644 --- a/Lib/test/test_selectors.py +++ b/Lib/test/test_selectors.py @@ -6,6 +6,7 @@ import socket import sys from test import support +from test.support import socket_helper from time import sleep import unittest import unittest.mock @@ -22,7 +23,7 @@ else: def socketpair(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0): with socket.socket(family, type, proto) as l: - l.bind((support.HOST, 0)) + l.bind((socket_helper.HOST, 0)) l.listen() c = socket.socket(family, type, proto) try: @@ -543,6 +544,19 @@ def test_register_bad_fd(self): with self.assertRaises(KeyError): s.get_key(bad_f) + def test_empty_select_timeout(self): + # Issues #23009, #29255: Make sure timeout is applied when no fds + # are registered. + s = self.SELECTOR() + self.addCleanup(s.close) + + t0 = time() + self.assertEqual(s.select(1), []) + t1 = time() + dt = t1 - t0 + # Tolerate 2.0 seconds for very slow buildbots + self.assertTrue(0.8 <= dt <= 2.0, dt) + @unittest.skipUnless(hasattr(selectors, 'DevpollSelector'), "Test needs selectors.DevpollSelector") diff --git a/Lib/test/test_setcomps.py b/Lib/test/test_setcomps.py index fb7cde03d782364ea368efa8232820815a1c7f2d..ecc4fffec0d8492272342dde19fd0de764eeecfb 100644 --- a/Lib/test/test_setcomps.py +++ b/Lib/test/test_setcomps.py @@ -21,6 +21,22 @@ >>> list(sorted({(i,j) for i in range(4) for j in range(i)})) [(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2)] +Test the idiom for temporary variable assignment in comprehensions. + + >>> sorted({j*j for i in range(4) for j in [i+1]}) + [1, 4, 9, 16] + >>> sorted({j*k for i in range(4) for j in [i+1] for k in [j+1]}) + [2, 6, 12, 20] + >>> sorted({j*k for i in range(4) for j, k in [(i+1, i+2)]}) + [2, 6, 12, 20] + +Not assignment + + >>> sorted({i*i for i in [*range(4)]}) + [0, 1, 4, 9] + >>> sorted({i*i for i in (*range(4),)}) + [0, 1, 4, 9] + Make sure the induction variable is not exposed >>> i = 20 diff --git a/Lib/test/test_shlex.py b/Lib/test/test_shlex.py index a21ccd2fdf44a71b9c5643f678f6ca76952ae2b9..3081a785204edc6ade5803ea484813095a12b914 100644 --- a/Lib/test/test_shlex.py +++ b/Lib/test/test_shlex.py @@ -3,7 +3,7 @@ import shlex import string import unittest - +from unittest import mock # The original test data set was from shellwords, by Hartmut Goebel. @@ -162,6 +162,11 @@ def oldSplit(self, s): tok = lex.get_token() return ret + @mock.patch('sys.stdin', io.StringIO()) + def testSplitNoneDeprecation(self): + with self.assertWarns(DeprecationWarning): + shlex.split(None) + def testSplitPosix(self): """Test data splitting with posix parser""" self.splitTest(self.posix_data, comments=True) diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py index bcb7e498e198e25479cec743624cf34bba2c8033..e19af64be0e1a227ff539b5624c64d7d52f1ffb5 100644 --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -123,12 +123,12 @@ def supports_file2file_sendfile(): srcname = None dstname = None try: - with tempfile.NamedTemporaryFile("wb", delete=False) as f: + with tempfile.NamedTemporaryFile("wb", dir=os.getcwd(), delete=False) as f: srcname = f.name f.write(b"0123456789") with open(srcname, "rb") as src: - with tempfile.NamedTemporaryFile("wb", delete=False) as dst: + with tempfile.NamedTemporaryFile("wb", dir=os.getcwd(), delete=False) as dst: dstname = dst.name infd = src.fileno() outfd = dst.fileno() @@ -159,31 +159,21 @@ def _maxdataOK(): else: return True -class TestShutil(unittest.TestCase): - - def setUp(self): - super(TestShutil, self).setUp() - self.tempdirs = [] - - def tearDown(self): - super(TestShutil, self).tearDown() - while self.tempdirs: - d = self.tempdirs.pop() - shutil.rmtree(d, os.name in ('nt', 'cygwin')) +class BaseTest: - def mkdtemp(self): + def mkdtemp(self, prefix=None): """Create a temporary directory that will be cleaned up. Returns the path of the directory. """ - basedir = None - if sys.platform == "win32": - basedir = os.path.realpath(os.getcwd()) - d = tempfile.mkdtemp(dir=basedir) - self.tempdirs.append(d) + d = tempfile.mkdtemp(prefix=prefix, dir=os.getcwd()) + self.addCleanup(support.rmtree, d) return d + +class TestRmTree(BaseTest, unittest.TestCase): + def test_rmtree_works_on_bytes(self): tmp = self.mkdtemp() victim = os.path.join(tmp, 'killme') @@ -241,6 +231,7 @@ def test_rmtree_fails_on_junctions(self): os.mkdir(dir_) link = os.path.join(tmp, 'link') _winapi.CreateJunction(dir_, link) + self.addCleanup(support.unlink, link) self.assertRaises(OSError, shutil.rmtree, link) self.assertTrue(os.path.exists(dir_)) self.assertTrue(os.path.lexists(link)) @@ -277,7 +268,7 @@ def test_rmtree_works_on_junctions(self): def test_rmtree_errors(self): # filename is guaranteed not to exist - filename = tempfile.mktemp() + filename = tempfile.mktemp(dir=self.mkdtemp()) self.assertRaises(FileNotFoundError, shutil.rmtree, filename) # test that ignore_errors option is honored shutil.rmtree(filename, ignore_errors=True) @@ -385,601 +376,792 @@ def raiser(fn, *args, **kwargs): finally: os.lstat = orig_lstat - @support.skip_unless_symlink - def test_copymode_follow_symlinks(self): - tmp_dir = self.mkdtemp() - src = os.path.join(tmp_dir, 'foo') - dst = os.path.join(tmp_dir, 'bar') - src_link = os.path.join(tmp_dir, 'baz') - dst_link = os.path.join(tmp_dir, 'quux') - write_file(src, 'foo') - write_file(dst, 'foo') - os.symlink(src, src_link) - os.symlink(dst, dst_link) - os.chmod(src, stat.S_IRWXU|stat.S_IRWXG) - # file to file - os.chmod(dst, stat.S_IRWXO) - self.assertNotEqual(os.stat(src).st_mode, os.stat(dst).st_mode) - shutil.copymode(src, dst) - self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) - # On Windows, os.chmod does not follow symlinks (issue #15411) - if os.name != 'nt': - # follow src link - os.chmod(dst, stat.S_IRWXO) - shutil.copymode(src_link, dst) - self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) - # follow dst link - os.chmod(dst, stat.S_IRWXO) - shutil.copymode(src, dst_link) - self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) - # follow both links - os.chmod(dst, stat.S_IRWXO) - shutil.copymode(src_link, dst_link) - self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) + def test_rmtree_uses_safe_fd_version_if_available(self): + _use_fd_functions = ({os.open, os.stat, os.unlink, os.rmdir} <= + os.supports_dir_fd and + os.listdir in os.supports_fd and + os.stat in os.supports_follow_symlinks) + if _use_fd_functions: + self.assertTrue(shutil._use_fd_functions) + self.assertTrue(shutil.rmtree.avoids_symlink_attacks) + tmp_dir = self.mkdtemp() + d = os.path.join(tmp_dir, 'a') + os.mkdir(d) + try: + real_rmtree = shutil._rmtree_safe_fd + class Called(Exception): pass + def _raiser(*args, **kwargs): + raise Called + shutil._rmtree_safe_fd = _raiser + self.assertRaises(Called, shutil.rmtree, d) + finally: + shutil._rmtree_safe_fd = real_rmtree + else: + self.assertFalse(shutil._use_fd_functions) + self.assertFalse(shutil.rmtree.avoids_symlink_attacks) - @unittest.skipUnless(hasattr(os, 'lchmod'), 'requires os.lchmod') - @support.skip_unless_symlink - def test_copymode_symlink_to_symlink(self): - tmp_dir = self.mkdtemp() - src = os.path.join(tmp_dir, 'foo') - dst = os.path.join(tmp_dir, 'bar') - src_link = os.path.join(tmp_dir, 'baz') - dst_link = os.path.join(tmp_dir, 'quux') - write_file(src, 'foo') - write_file(dst, 'foo') - os.symlink(src, src_link) - os.symlink(dst, dst_link) - os.chmod(src, stat.S_IRWXU|stat.S_IRWXG) - os.chmod(dst, stat.S_IRWXU) - os.lchmod(src_link, stat.S_IRWXO|stat.S_IRWXG) - # link to link - os.lchmod(dst_link, stat.S_IRWXO) - shutil.copymode(src_link, dst_link, follow_symlinks=False) - self.assertEqual(os.lstat(src_link).st_mode, - os.lstat(dst_link).st_mode) - self.assertNotEqual(os.stat(src).st_mode, os.stat(dst).st_mode) - # src link - use chmod - os.lchmod(dst_link, stat.S_IRWXO) - shutil.copymode(src_link, dst, follow_symlinks=False) - self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) - # dst link - use chmod - os.lchmod(dst_link, stat.S_IRWXO) - shutil.copymode(src, dst_link, follow_symlinks=False) - self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) + def test_rmtree_dont_delete_file(self): + # When called on a file instead of a directory, don't delete it. + handle, path = tempfile.mkstemp(dir=self.mkdtemp()) + os.close(handle) + self.assertRaises(NotADirectoryError, shutil.rmtree, path) + os.remove(path) - @unittest.skipIf(hasattr(os, 'lchmod'), 'requires os.lchmod to be missing') @support.skip_unless_symlink - def test_copymode_symlink_to_symlink_wo_lchmod(self): - tmp_dir = self.mkdtemp() - src = os.path.join(tmp_dir, 'foo') - dst = os.path.join(tmp_dir, 'bar') - src_link = os.path.join(tmp_dir, 'baz') - dst_link = os.path.join(tmp_dir, 'quux') - write_file(src, 'foo') - write_file(dst, 'foo') - os.symlink(src, src_link) - os.symlink(dst, dst_link) - shutil.copymode(src_link, dst_link, follow_symlinks=False) # silent fail + def test_rmtree_on_symlink(self): + # bug 1669. + os.mkdir(TESTFN) + try: + src = os.path.join(TESTFN, 'cheese') + dst = os.path.join(TESTFN, 'shop') + os.mkdir(src) + os.symlink(src, dst) + self.assertRaises(OSError, shutil.rmtree, dst) + shutil.rmtree(dst, ignore_errors=True) + finally: + shutil.rmtree(TESTFN, ignore_errors=True) + + @unittest.skipUnless(_winapi, 'only relevant on Windows') + def test_rmtree_on_junction(self): + os.mkdir(TESTFN) + try: + src = os.path.join(TESTFN, 'cheese') + dst = os.path.join(TESTFN, 'shop') + os.mkdir(src) + open(os.path.join(src, 'spam'), 'wb').close() + _winapi.CreateJunction(src, dst) + self.assertRaises(OSError, shutil.rmtree, dst) + shutil.rmtree(dst, ignore_errors=True) + finally: + shutil.rmtree(TESTFN, ignore_errors=True) + + +class TestCopyTree(BaseTest, unittest.TestCase): + + def test_copytree_simple(self): + src_dir = self.mkdtemp() + dst_dir = os.path.join(self.mkdtemp(), 'destination') + self.addCleanup(shutil.rmtree, src_dir) + self.addCleanup(shutil.rmtree, os.path.dirname(dst_dir)) + write_file((src_dir, 'test.txt'), '123') + os.mkdir(os.path.join(src_dir, 'test_dir')) + write_file((src_dir, 'test_dir', 'test.txt'), '456') + + shutil.copytree(src_dir, dst_dir) + self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'test.txt'))) + self.assertTrue(os.path.isdir(os.path.join(dst_dir, 'test_dir'))) + self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'test_dir', + 'test.txt'))) + actual = read_file((dst_dir, 'test.txt')) + self.assertEqual(actual, '123') + actual = read_file((dst_dir, 'test_dir', 'test.txt')) + self.assertEqual(actual, '456') + + def test_copytree_dirs_exist_ok(self): + src_dir = self.mkdtemp() + dst_dir = self.mkdtemp() + self.addCleanup(shutil.rmtree, src_dir) + self.addCleanup(shutil.rmtree, dst_dir) + + write_file((src_dir, 'nonexisting.txt'), '123') + os.mkdir(os.path.join(src_dir, 'existing_dir')) + os.mkdir(os.path.join(dst_dir, 'existing_dir')) + write_file((dst_dir, 'existing_dir', 'existing.txt'), 'will be replaced') + write_file((src_dir, 'existing_dir', 'existing.txt'), 'has been replaced') + + shutil.copytree(src_dir, dst_dir, dirs_exist_ok=True) + self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'nonexisting.txt'))) + self.assertTrue(os.path.isdir(os.path.join(dst_dir, 'existing_dir'))) + self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'existing_dir', + 'existing.txt'))) + actual = read_file((dst_dir, 'nonexisting.txt')) + self.assertEqual(actual, '123') + actual = read_file((dst_dir, 'existing_dir', 'existing.txt')) + self.assertEqual(actual, 'has been replaced') + + with self.assertRaises(FileExistsError): + shutil.copytree(src_dir, dst_dir, dirs_exist_ok=False) @support.skip_unless_symlink - def test_copystat_symlinks(self): + def test_copytree_symlinks(self): tmp_dir = self.mkdtemp() - src = os.path.join(tmp_dir, 'foo') - dst = os.path.join(tmp_dir, 'bar') - src_link = os.path.join(tmp_dir, 'baz') - dst_link = os.path.join(tmp_dir, 'qux') - write_file(src, 'foo') - src_stat = os.stat(src) - os.utime(src, (src_stat.st_atime, - src_stat.st_mtime - 42.0)) # ensure different mtimes - write_file(dst, 'bar') - self.assertNotEqual(os.stat(src).st_mtime, os.stat(dst).st_mtime) - os.symlink(src, src_link) - os.symlink(dst, dst_link) + src_dir = os.path.join(tmp_dir, 'src') + dst_dir = os.path.join(tmp_dir, 'dst') + sub_dir = os.path.join(src_dir, 'sub') + os.mkdir(src_dir) + os.mkdir(sub_dir) + write_file((src_dir, 'file.txt'), 'foo') + src_link = os.path.join(sub_dir, 'link') + dst_link = os.path.join(dst_dir, 'sub/link') + os.symlink(os.path.join(src_dir, 'file.txt'), + src_link) if hasattr(os, 'lchmod'): - os.lchmod(src_link, stat.S_IRWXO) + os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO) if hasattr(os, 'lchflags') and hasattr(stat, 'UF_NODUMP'): os.lchflags(src_link, stat.UF_NODUMP) - src_link_stat = os.lstat(src_link) - # follow - if hasattr(os, 'lchmod'): - shutil.copystat(src_link, dst_link, follow_symlinks=True) - self.assertNotEqual(src_link_stat.st_mode, os.stat(dst).st_mode) - # don't follow - shutil.copystat(src_link, dst_link, follow_symlinks=False) - dst_link_stat = os.lstat(dst_link) - if os.utime in os.supports_follow_symlinks: - for attr in 'st_atime', 'st_mtime': - # The modification times may be truncated in the new file. - self.assertLessEqual(getattr(src_link_stat, attr), - getattr(dst_link_stat, attr) + 1) + src_stat = os.lstat(src_link) + shutil.copytree(src_dir, dst_dir, symlinks=True) + self.assertTrue(os.path.islink(os.path.join(dst_dir, 'sub', 'link'))) + actual = os.readlink(os.path.join(dst_dir, 'sub', 'link')) + # Bad practice to blindly strip the prefix as it may be required to + # correctly refer to the file, but we're only comparing paths here. + if os.name == 'nt' and actual.startswith('\\\\?\\'): + actual = actual[4:] + self.assertEqual(actual, os.path.join(src_dir, 'file.txt')) + dst_stat = os.lstat(dst_link) if hasattr(os, 'lchmod'): - self.assertEqual(src_link_stat.st_mode, dst_link_stat.st_mode) - if hasattr(os, 'lchflags') and hasattr(src_link_stat, 'st_flags'): - self.assertEqual(src_link_stat.st_flags, dst_link_stat.st_flags) - # tell to follow but dst is not a link - shutil.copystat(src_link, dst, follow_symlinks=False) - self.assertTrue(abs(os.stat(src).st_mtime - os.stat(dst).st_mtime) < - 00000.1) - - @unittest.skipUnless(hasattr(os, 'chflags') and - hasattr(errno, 'EOPNOTSUPP') and - hasattr(errno, 'ENOTSUP'), - "requires os.chflags, EOPNOTSUPP & ENOTSUP") - def test_copystat_handles_harmless_chflags_errors(self): - tmpdir = self.mkdtemp() - file1 = os.path.join(tmpdir, 'file1') - file2 = os.path.join(tmpdir, 'file2') - write_file(file1, 'xxx') - write_file(file2, 'xxx') - - def make_chflags_raiser(err): - ex = OSError() + self.assertEqual(dst_stat.st_mode, src_stat.st_mode) + if hasattr(os, 'lchflags'): + self.assertEqual(dst_stat.st_flags, src_stat.st_flags) - def _chflags_raiser(path, flags, *, follow_symlinks=True): - ex.errno = err - raise ex - return _chflags_raiser - old_chflags = os.chflags + def test_copytree_with_exclude(self): + # creating data + join = os.path.join + exists = os.path.exists + src_dir = self.mkdtemp() try: - for err in errno.EOPNOTSUPP, errno.ENOTSUP: - os.chflags = make_chflags_raiser(err) - shutil.copystat(file1, file2) - # assert others errors break it - os.chflags = make_chflags_raiser(errno.EOPNOTSUPP + errno.ENOTSUP) - self.assertRaises(OSError, shutil.copystat, file1, file2) + dst_dir = join(self.mkdtemp(), 'destination') + write_file((src_dir, 'test.txt'), '123') + write_file((src_dir, 'test.tmp'), '123') + os.mkdir(join(src_dir, 'test_dir')) + write_file((src_dir, 'test_dir', 'test.txt'), '456') + os.mkdir(join(src_dir, 'test_dir2')) + write_file((src_dir, 'test_dir2', 'test.txt'), '456') + os.mkdir(join(src_dir, 'test_dir2', 'subdir')) + os.mkdir(join(src_dir, 'test_dir2', 'subdir2')) + write_file((src_dir, 'test_dir2', 'subdir', 'test.txt'), '456') + write_file((src_dir, 'test_dir2', 'subdir2', 'test.py'), '456') + + # testing glob-like patterns + try: + patterns = shutil.ignore_patterns('*.tmp', 'test_dir2') + shutil.copytree(src_dir, dst_dir, ignore=patterns) + # checking the result: some elements should not be copied + self.assertTrue(exists(join(dst_dir, 'test.txt'))) + self.assertFalse(exists(join(dst_dir, 'test.tmp'))) + self.assertFalse(exists(join(dst_dir, 'test_dir2'))) + finally: + shutil.rmtree(dst_dir) + try: + patterns = shutil.ignore_patterns('*.tmp', 'subdir*') + shutil.copytree(src_dir, dst_dir, ignore=patterns) + # checking the result: some elements should not be copied + self.assertFalse(exists(join(dst_dir, 'test.tmp'))) + self.assertFalse(exists(join(dst_dir, 'test_dir2', 'subdir2'))) + self.assertFalse(exists(join(dst_dir, 'test_dir2', 'subdir'))) + finally: + shutil.rmtree(dst_dir) + + # testing callable-style + try: + def _filter(src, names): + res = [] + for name in names: + path = os.path.join(src, name) + + if (os.path.isdir(path) and + path.split()[-1] == 'subdir'): + res.append(name) + elif os.path.splitext(path)[-1] in ('.py'): + res.append(name) + return res + + shutil.copytree(src_dir, dst_dir, ignore=_filter) + + # checking the result: some elements should not be copied + self.assertFalse(exists(join(dst_dir, 'test_dir2', 'subdir2', + 'test.py'))) + self.assertFalse(exists(join(dst_dir, 'test_dir2', 'subdir'))) + + finally: + shutil.rmtree(dst_dir) finally: - os.chflags = old_chflags + shutil.rmtree(src_dir) + shutil.rmtree(os.path.dirname(dst_dir)) + + def test_copytree_arg_types_of_ignore(self): + join = os.path.join + exists = os.path.exists - @support.skip_unless_xattr - def test_copyxattr(self): tmp_dir = self.mkdtemp() - src = os.path.join(tmp_dir, 'foo') + src_dir = join(tmp_dir, "source") + + os.mkdir(join(src_dir)) + os.mkdir(join(src_dir, 'test_dir')) + os.mkdir(os.path.join(src_dir, 'test_dir', 'subdir')) + write_file((src_dir, 'test_dir', 'subdir', 'test.txt'), '456') + + invokations = [] + + def _ignore(src, names): + invokations.append(src) + self.assertIsInstance(src, str) + self.assertIsInstance(names, list) + self.assertEqual(len(names), len(set(names))) + for name in names: + self.assertIsInstance(name, str) + return [] + + dst_dir = join(self.mkdtemp(), 'destination') + shutil.copytree(src_dir, dst_dir, ignore=_ignore) + self.assertTrue(exists(join(dst_dir, 'test_dir', 'subdir', + 'test.txt'))) + + dst_dir = join(self.mkdtemp(), 'destination') + shutil.copytree(pathlib.Path(src_dir), dst_dir, ignore=_ignore) + self.assertTrue(exists(join(dst_dir, 'test_dir', 'subdir', + 'test.txt'))) + + dst_dir = join(self.mkdtemp(), 'destination') + src_dir_entry = list(os.scandir(tmp_dir))[0] + self.assertIsInstance(src_dir_entry, os.DirEntry) + shutil.copytree(src_dir_entry, dst_dir, ignore=_ignore) + self.assertTrue(exists(join(dst_dir, 'test_dir', 'subdir', + 'test.txt'))) + + self.assertEqual(len(invokations), 9) + + def test_copytree_retains_permissions(self): + tmp_dir = self.mkdtemp() + src_dir = os.path.join(tmp_dir, 'source') + os.mkdir(src_dir) + dst_dir = os.path.join(tmp_dir, 'destination') + self.addCleanup(shutil.rmtree, tmp_dir) + + os.chmod(src_dir, 0o777) + write_file((src_dir, 'permissive.txt'), '123') + os.chmod(os.path.join(src_dir, 'permissive.txt'), 0o777) + write_file((src_dir, 'restrictive.txt'), '456') + os.chmod(os.path.join(src_dir, 'restrictive.txt'), 0o600) + restrictive_subdir = tempfile.mkdtemp(dir=src_dir) + self.addCleanup(support.rmtree, restrictive_subdir) + os.chmod(restrictive_subdir, 0o600) + + shutil.copytree(src_dir, dst_dir) + self.assertEqual(os.stat(src_dir).st_mode, os.stat(dst_dir).st_mode) + self.assertEqual(os.stat(os.path.join(src_dir, 'permissive.txt')).st_mode, + os.stat(os.path.join(dst_dir, 'permissive.txt')).st_mode) + self.assertEqual(os.stat(os.path.join(src_dir, 'restrictive.txt')).st_mode, + os.stat(os.path.join(dst_dir, 'restrictive.txt')).st_mode) + restrictive_subdir_dst = os.path.join(dst_dir, + os.path.split(restrictive_subdir)[1]) + self.assertEqual(os.stat(restrictive_subdir).st_mode, + os.stat(restrictive_subdir_dst).st_mode) + + @unittest.mock.patch('os.chmod') + def test_copytree_winerror(self, mock_patch): + # When copying to VFAT, copystat() raises OSError. On Windows, the + # exception object has a meaningful 'winerror' attribute, but not + # on other operating systems. Do not assume 'winerror' is set. + src_dir = self.mkdtemp() + dst_dir = os.path.join(self.mkdtemp(), 'destination') + self.addCleanup(shutil.rmtree, src_dir) + self.addCleanup(shutil.rmtree, os.path.dirname(dst_dir)) + + mock_patch.side_effect = PermissionError('ka-boom') + with self.assertRaises(shutil.Error): + shutil.copytree(src_dir, dst_dir) + + def test_copytree_custom_copy_function(self): + # See: https://bugs.python.org/issue35648 + def custom_cpfun(a, b): + flag.append(None) + self.assertIsInstance(a, str) + self.assertIsInstance(b, str) + self.assertEqual(a, os.path.join(src, 'foo')) + self.assertEqual(b, os.path.join(dst, 'foo')) + + flag = [] + src = self.mkdtemp() + dst = tempfile.mktemp(dir=self.mkdtemp()) + with open(os.path.join(src, 'foo'), 'w') as f: + f.close() + shutil.copytree(src, dst, copy_function=custom_cpfun) + self.assertEqual(len(flag), 1) + + # Issue #3002: copyfile and copytree block indefinitely on named pipes + @unittest.skipUnless(hasattr(os, "mkfifo"), 'requires os.mkfifo()') + @support.skip_unless_symlink + def test_copytree_named_pipe(self): + os.mkdir(TESTFN) + try: + subdir = os.path.join(TESTFN, "subdir") + os.mkdir(subdir) + pipe = os.path.join(subdir, "mypipe") + try: + os.mkfifo(pipe) + except PermissionError as e: + self.skipTest('os.mkfifo(): %s' % e) + try: + shutil.copytree(TESTFN, TESTFN2) + except shutil.Error as e: + errors = e.args[0] + self.assertEqual(len(errors), 1) + src, dst, error_msg = errors[0] + self.assertEqual("`%s` is a named pipe" % pipe, error_msg) + else: + self.fail("shutil.Error should have been raised") + finally: + shutil.rmtree(TESTFN, ignore_errors=True) + shutil.rmtree(TESTFN2, ignore_errors=True) + + def test_copytree_special_func(self): + src_dir = self.mkdtemp() + dst_dir = os.path.join(self.mkdtemp(), 'destination') + write_file((src_dir, 'test.txt'), '123') + os.mkdir(os.path.join(src_dir, 'test_dir')) + write_file((src_dir, 'test_dir', 'test.txt'), '456') + + copied = [] + def _copy(src, dst): + copied.append((src, dst)) + + shutil.copytree(src_dir, dst_dir, copy_function=_copy) + self.assertEqual(len(copied), 2) + + @support.skip_unless_symlink + def test_copytree_dangling_symlinks(self): + # a dangling symlink raises an error at the end + src_dir = self.mkdtemp() + dst_dir = os.path.join(self.mkdtemp(), 'destination') + os.symlink('IDONTEXIST', os.path.join(src_dir, 'test.txt')) + os.mkdir(os.path.join(src_dir, 'test_dir')) + write_file((src_dir, 'test_dir', 'test.txt'), '456') + self.assertRaises(Error, shutil.copytree, src_dir, dst_dir) + + # a dangling symlink is ignored with the proper flag + dst_dir = os.path.join(self.mkdtemp(), 'destination2') + shutil.copytree(src_dir, dst_dir, ignore_dangling_symlinks=True) + self.assertNotIn('test.txt', os.listdir(dst_dir)) + + # a dangling symlink is copied if symlinks=True + dst_dir = os.path.join(self.mkdtemp(), 'destination3') + shutil.copytree(src_dir, dst_dir, symlinks=True) + self.assertIn('test.txt', os.listdir(dst_dir)) + + @support.skip_unless_symlink + def test_copytree_symlink_dir(self): + src_dir = self.mkdtemp() + dst_dir = os.path.join(self.mkdtemp(), 'destination') + os.mkdir(os.path.join(src_dir, 'real_dir')) + with open(os.path.join(src_dir, 'real_dir', 'test.txt'), 'w'): + pass + os.symlink(os.path.join(src_dir, 'real_dir'), + os.path.join(src_dir, 'link_to_dir'), + target_is_directory=True) + + shutil.copytree(src_dir, dst_dir, symlinks=False) + self.assertFalse(os.path.islink(os.path.join(dst_dir, 'link_to_dir'))) + self.assertIn('test.txt', os.listdir(os.path.join(dst_dir, 'link_to_dir'))) + + dst_dir = os.path.join(self.mkdtemp(), 'destination2') + shutil.copytree(src_dir, dst_dir, symlinks=True) + self.assertTrue(os.path.islink(os.path.join(dst_dir, 'link_to_dir'))) + self.assertIn('test.txt', os.listdir(os.path.join(dst_dir, 'link_to_dir'))) + + def test_copytree_return_value(self): + # copytree returns its destination path. + src_dir = self.mkdtemp() + dst_dir = src_dir + "dest" + self.addCleanup(shutil.rmtree, dst_dir, True) + src = os.path.join(src_dir, 'foo') write_file(src, 'foo') - dst = os.path.join(tmp_dir, 'bar') - write_file(dst, 'bar') + rv = shutil.copytree(src_dir, dst_dir) + self.assertEqual(['foo'], os.listdir(rv)) - # no xattr == no problem - shutil._copyxattr(src, dst) - # common case - os.setxattr(src, 'user.foo', b'42') - os.setxattr(src, 'user.bar', b'43') - shutil._copyxattr(src, dst) - self.assertEqual(sorted(os.listxattr(src)), sorted(os.listxattr(dst))) - self.assertEqual( - os.getxattr(src, 'user.foo'), - os.getxattr(dst, 'user.foo')) - # check errors don't affect other attrs - os.remove(dst) - write_file(dst, 'bar') - os_error = OSError(errno.EPERM, 'EPERM') + def test_copytree_subdirectory(self): + # copytree where dst is a subdirectory of src, see Issue 38688 + base_dir = self.mkdtemp() + self.addCleanup(shutil.rmtree, base_dir, ignore_errors=True) + src_dir = os.path.join(base_dir, "t", "pg") + dst_dir = os.path.join(src_dir, "somevendor", "1.0") + os.makedirs(src_dir) + src = os.path.join(src_dir, 'pol') + write_file(src, 'pol') + rv = shutil.copytree(src_dir, dst_dir) + self.assertEqual(['pol'], os.listdir(rv)) - def _raise_on_user_foo(fname, attr, val, **kwargs): - if attr == 'user.foo': - raise os_error - else: - orig_setxattr(fname, attr, val, **kwargs) - try: - orig_setxattr = os.setxattr - os.setxattr = _raise_on_user_foo - shutil._copyxattr(src, dst) - self.assertIn('user.bar', os.listxattr(dst)) - finally: - os.setxattr = orig_setxattr - # the source filesystem not supporting xattrs should be ok, too. - def _raise_on_src(fname, *, follow_symlinks=True): - if fname == src: - raise OSError(errno.ENOTSUP, 'Operation not supported') - return orig_listxattr(fname, follow_symlinks=follow_symlinks) - try: - orig_listxattr = os.listxattr - os.listxattr = _raise_on_src - shutil._copyxattr(src, dst) - finally: - os.listxattr = orig_listxattr +class TestCopy(BaseTest, unittest.TestCase): - # test that shutil.copystat copies xattrs - src = os.path.join(tmp_dir, 'the_original') - srcro = os.path.join(tmp_dir, 'the_original_ro') - write_file(src, src) - write_file(srcro, srcro) - os.setxattr(src, 'user.the_value', b'fiddly') - os.setxattr(srcro, 'user.the_value', b'fiddly') - os.chmod(srcro, 0o444) - dst = os.path.join(tmp_dir, 'the_copy') - dstro = os.path.join(tmp_dir, 'the_copy_ro') - write_file(dst, dst) - write_file(dstro, dstro) - shutil.copystat(src, dst) - shutil.copystat(srcro, dstro) - self.assertEqual(os.getxattr(dst, 'user.the_value'), b'fiddly') - self.assertEqual(os.getxattr(dstro, 'user.the_value'), b'fiddly') + ### shutil.copymode @support.skip_unless_symlink - @support.skip_unless_xattr - @unittest.skipUnless(hasattr(os, 'geteuid') and os.geteuid() == 0, - 'root privileges required') - def test_copyxattr_symlinks(self): - # On Linux, it's only possible to access non-user xattr for symlinks; - # which in turn require root privileges. This test should be expanded - # as soon as other platforms gain support for extended attributes. + def test_copymode_follow_symlinks(self): tmp_dir = self.mkdtemp() src = os.path.join(tmp_dir, 'foo') + dst = os.path.join(tmp_dir, 'bar') src_link = os.path.join(tmp_dir, 'baz') + dst_link = os.path.join(tmp_dir, 'quux') write_file(src, 'foo') + write_file(dst, 'foo') os.symlink(src, src_link) - os.setxattr(src, 'trusted.foo', b'42') - os.setxattr(src_link, 'trusted.foo', b'43', follow_symlinks=False) - dst = os.path.join(tmp_dir, 'bar') - dst_link = os.path.join(tmp_dir, 'qux') - write_file(dst, 'bar') os.symlink(dst, dst_link) - shutil._copyxattr(src_link, dst_link, follow_symlinks=False) - self.assertEqual(os.getxattr(dst_link, 'trusted.foo', follow_symlinks=False), b'43') - self.assertRaises(OSError, os.getxattr, dst, 'trusted.foo') - shutil._copyxattr(src_link, dst, follow_symlinks=False) - self.assertEqual(os.getxattr(dst, 'trusted.foo'), b'43') + os.chmod(src, stat.S_IRWXU|stat.S_IRWXG) + # file to file + os.chmod(dst, stat.S_IRWXO) + self.assertNotEqual(os.stat(src).st_mode, os.stat(dst).st_mode) + shutil.copymode(src, dst) + self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) + # On Windows, os.chmod does not follow symlinks (issue #15411) + if os.name != 'nt': + # follow src link + os.chmod(dst, stat.S_IRWXO) + shutil.copymode(src_link, dst) + self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) + # follow dst link + os.chmod(dst, stat.S_IRWXO) + shutil.copymode(src, dst_link) + self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) + # follow both links + os.chmod(dst, stat.S_IRWXO) + shutil.copymode(src_link, dst_link) + self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) + @unittest.skipUnless(hasattr(os, 'lchmod'), 'requires os.lchmod') @support.skip_unless_symlink - def test_copy_symlinks(self): + def test_copymode_symlink_to_symlink(self): tmp_dir = self.mkdtemp() src = os.path.join(tmp_dir, 'foo') dst = os.path.join(tmp_dir, 'bar') src_link = os.path.join(tmp_dir, 'baz') + dst_link = os.path.join(tmp_dir, 'quux') write_file(src, 'foo') + write_file(dst, 'foo') os.symlink(src, src_link) - if hasattr(os, 'lchmod'): - os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO) - # don't follow - shutil.copy(src_link, dst, follow_symlinks=True) - self.assertFalse(os.path.islink(dst)) - self.assertEqual(read_file(src), read_file(dst)) - os.remove(dst) - # follow - shutil.copy(src_link, dst, follow_symlinks=False) - self.assertTrue(os.path.islink(dst)) - self.assertEqual(os.readlink(dst), os.readlink(src_link)) - if hasattr(os, 'lchmod'): - self.assertEqual(os.lstat(src_link).st_mode, - os.lstat(dst).st_mode) + os.symlink(dst, dst_link) + os.chmod(src, stat.S_IRWXU|stat.S_IRWXG) + os.chmod(dst, stat.S_IRWXU) + os.lchmod(src_link, stat.S_IRWXO|stat.S_IRWXG) + # link to link + os.lchmod(dst_link, stat.S_IRWXO) + shutil.copymode(src_link, dst_link, follow_symlinks=False) + self.assertEqual(os.lstat(src_link).st_mode, + os.lstat(dst_link).st_mode) + self.assertNotEqual(os.stat(src).st_mode, os.stat(dst).st_mode) + # src link - use chmod + os.lchmod(dst_link, stat.S_IRWXO) + shutil.copymode(src_link, dst, follow_symlinks=False) + self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) + # dst link - use chmod + os.lchmod(dst_link, stat.S_IRWXO) + shutil.copymode(src, dst_link, follow_symlinks=False) + self.assertEqual(os.stat(src).st_mode, os.stat(dst).st_mode) + @unittest.skipIf(hasattr(os, 'lchmod'), 'requires os.lchmod to be missing') @support.skip_unless_symlink - def test_copy2_symlinks(self): + def test_copymode_symlink_to_symlink_wo_lchmod(self): tmp_dir = self.mkdtemp() src = os.path.join(tmp_dir, 'foo') dst = os.path.join(tmp_dir, 'bar') src_link = os.path.join(tmp_dir, 'baz') + dst_link = os.path.join(tmp_dir, 'quux') write_file(src, 'foo') - os.symlink(src, src_link) - if hasattr(os, 'lchmod'): - os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO) - if hasattr(os, 'lchflags') and hasattr(stat, 'UF_NODUMP'): - os.lchflags(src_link, stat.UF_NODUMP) - src_stat = os.stat(src) - src_link_stat = os.lstat(src_link) - # follow - shutil.copy2(src_link, dst, follow_symlinks=True) - self.assertFalse(os.path.islink(dst)) - self.assertEqual(read_file(src), read_file(dst)) - os.remove(dst) - # don't follow - shutil.copy2(src_link, dst, follow_symlinks=False) - self.assertTrue(os.path.islink(dst)) - self.assertEqual(os.readlink(dst), os.readlink(src_link)) - dst_stat = os.lstat(dst) - if os.utime in os.supports_follow_symlinks: - for attr in 'st_atime', 'st_mtime': - # The modification times may be truncated in the new file. - self.assertLessEqual(getattr(src_link_stat, attr), - getattr(dst_stat, attr) + 1) - if hasattr(os, 'lchmod'): - self.assertEqual(src_link_stat.st_mode, dst_stat.st_mode) - self.assertNotEqual(src_stat.st_mode, dst_stat.st_mode) - if hasattr(os, 'lchflags') and hasattr(src_link_stat, 'st_flags'): - self.assertEqual(src_link_stat.st_flags, dst_stat.st_flags) - - @support.skip_unless_xattr - def test_copy2_xattr(self): - tmp_dir = self.mkdtemp() - src = os.path.join(tmp_dir, 'foo') - dst = os.path.join(tmp_dir, 'bar') - write_file(src, 'foo') - os.setxattr(src, 'user.foo', b'42') - shutil.copy2(src, dst) - self.assertEqual( - os.getxattr(src, 'user.foo'), - os.getxattr(dst, 'user.foo')) - os.remove(dst) - - @support.skip_unless_symlink - def test_copyfile_symlinks(self): - tmp_dir = self.mkdtemp() - src = os.path.join(tmp_dir, 'src') - dst = os.path.join(tmp_dir, 'dst') - dst_link = os.path.join(tmp_dir, 'dst_link') - link = os.path.join(tmp_dir, 'link') - write_file(src, 'foo') - os.symlink(src, link) - # don't follow - shutil.copyfile(link, dst_link, follow_symlinks=False) - self.assertTrue(os.path.islink(dst_link)) - self.assertEqual(os.readlink(link), os.readlink(dst_link)) - # follow - shutil.copyfile(link, dst) - self.assertFalse(os.path.islink(dst)) - - def test_rmtree_uses_safe_fd_version_if_available(self): - _use_fd_functions = ({os.open, os.stat, os.unlink, os.rmdir} <= - os.supports_dir_fd and - os.listdir in os.supports_fd and - os.stat in os.supports_follow_symlinks) - if _use_fd_functions: - self.assertTrue(shutil._use_fd_functions) - self.assertTrue(shutil.rmtree.avoids_symlink_attacks) - tmp_dir = self.mkdtemp() - d = os.path.join(tmp_dir, 'a') - os.mkdir(d) - try: - real_rmtree = shutil._rmtree_safe_fd - class Called(Exception): pass - def _raiser(*args, **kwargs): - raise Called - shutil._rmtree_safe_fd = _raiser - self.assertRaises(Called, shutil.rmtree, d) - finally: - shutil._rmtree_safe_fd = real_rmtree - else: - self.assertFalse(shutil._use_fd_functions) - self.assertFalse(shutil.rmtree.avoids_symlink_attacks) - - def test_rmtree_dont_delete_file(self): - # When called on a file instead of a directory, don't delete it. - handle, path = tempfile.mkstemp() - os.close(handle) - self.assertRaises(NotADirectoryError, shutil.rmtree, path) - os.remove(path) - - def test_copytree_simple(self): - src_dir = tempfile.mkdtemp() - dst_dir = os.path.join(tempfile.mkdtemp(), 'destination') - self.addCleanup(shutil.rmtree, src_dir) - self.addCleanup(shutil.rmtree, os.path.dirname(dst_dir)) - write_file((src_dir, 'test.txt'), '123') - os.mkdir(os.path.join(src_dir, 'test_dir')) - write_file((src_dir, 'test_dir', 'test.txt'), '456') - - shutil.copytree(src_dir, dst_dir) - self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'test.txt'))) - self.assertTrue(os.path.isdir(os.path.join(dst_dir, 'test_dir'))) - self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'test_dir', - 'test.txt'))) - actual = read_file((dst_dir, 'test.txt')) - self.assertEqual(actual, '123') - actual = read_file((dst_dir, 'test_dir', 'test.txt')) - self.assertEqual(actual, '456') - - def test_copytree_dirs_exist_ok(self): - src_dir = tempfile.mkdtemp() - dst_dir = tempfile.mkdtemp() - self.addCleanup(shutil.rmtree, src_dir) - self.addCleanup(shutil.rmtree, dst_dir) - - write_file((src_dir, 'nonexisting.txt'), '123') - os.mkdir(os.path.join(src_dir, 'existing_dir')) - os.mkdir(os.path.join(dst_dir, 'existing_dir')) - write_file((dst_dir, 'existing_dir', 'existing.txt'), 'will be replaced') - write_file((src_dir, 'existing_dir', 'existing.txt'), 'has been replaced') - - shutil.copytree(src_dir, dst_dir, dirs_exist_ok=True) - self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'nonexisting.txt'))) - self.assertTrue(os.path.isdir(os.path.join(dst_dir, 'existing_dir'))) - self.assertTrue(os.path.isfile(os.path.join(dst_dir, 'existing_dir', - 'existing.txt'))) - actual = read_file((dst_dir, 'nonexisting.txt')) - self.assertEqual(actual, '123') - actual = read_file((dst_dir, 'existing_dir', 'existing.txt')) - self.assertEqual(actual, 'has been replaced') + write_file(dst, 'foo') + os.symlink(src, src_link) + os.symlink(dst, dst_link) + shutil.copymode(src_link, dst_link, follow_symlinks=False) # silent fail - with self.assertRaises(FileExistsError): - shutil.copytree(src_dir, dst_dir, dirs_exist_ok=False) + ### shutil.copystat @support.skip_unless_symlink - def test_copytree_symlinks(self): + def test_copystat_symlinks(self): tmp_dir = self.mkdtemp() - src_dir = os.path.join(tmp_dir, 'src') - dst_dir = os.path.join(tmp_dir, 'dst') - sub_dir = os.path.join(src_dir, 'sub') - os.mkdir(src_dir) - os.mkdir(sub_dir) - write_file((src_dir, 'file.txt'), 'foo') - src_link = os.path.join(sub_dir, 'link') - dst_link = os.path.join(dst_dir, 'sub/link') - os.symlink(os.path.join(src_dir, 'file.txt'), - src_link) + src = os.path.join(tmp_dir, 'foo') + dst = os.path.join(tmp_dir, 'bar') + src_link = os.path.join(tmp_dir, 'baz') + dst_link = os.path.join(tmp_dir, 'qux') + write_file(src, 'foo') + src_stat = os.stat(src) + os.utime(src, (src_stat.st_atime, + src_stat.st_mtime - 42.0)) # ensure different mtimes + write_file(dst, 'bar') + self.assertNotEqual(os.stat(src).st_mtime, os.stat(dst).st_mtime) + os.symlink(src, src_link) + os.symlink(dst, dst_link) if hasattr(os, 'lchmod'): - os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO) + os.lchmod(src_link, stat.S_IRWXO) if hasattr(os, 'lchflags') and hasattr(stat, 'UF_NODUMP'): os.lchflags(src_link, stat.UF_NODUMP) - src_stat = os.lstat(src_link) - shutil.copytree(src_dir, dst_dir, symlinks=True) - self.assertTrue(os.path.islink(os.path.join(dst_dir, 'sub', 'link'))) - actual = os.readlink(os.path.join(dst_dir, 'sub', 'link')) - # Bad practice to blindly strip the prefix as it may be required to - # correctly refer to the file, but we're only comparing paths here. - if os.name == 'nt' and actual.startswith('\\\\?\\'): - actual = actual[4:] - self.assertEqual(actual, os.path.join(src_dir, 'file.txt')) - dst_stat = os.lstat(dst_link) + src_link_stat = os.lstat(src_link) + # follow if hasattr(os, 'lchmod'): - self.assertEqual(dst_stat.st_mode, src_stat.st_mode) - if hasattr(os, 'lchflags'): - self.assertEqual(dst_stat.st_flags, src_stat.st_flags) - - def test_copytree_with_exclude(self): - # creating data - join = os.path.join - exists = os.path.exists - src_dir = tempfile.mkdtemp() - try: - dst_dir = join(tempfile.mkdtemp(), 'destination') - write_file((src_dir, 'test.txt'), '123') - write_file((src_dir, 'test.tmp'), '123') - os.mkdir(join(src_dir, 'test_dir')) - write_file((src_dir, 'test_dir', 'test.txt'), '456') - os.mkdir(join(src_dir, 'test_dir2')) - write_file((src_dir, 'test_dir2', 'test.txt'), '456') - os.mkdir(join(src_dir, 'test_dir2', 'subdir')) - os.mkdir(join(src_dir, 'test_dir2', 'subdir2')) - write_file((src_dir, 'test_dir2', 'subdir', 'test.txt'), '456') - write_file((src_dir, 'test_dir2', 'subdir2', 'test.py'), '456') - - # testing glob-like patterns - try: - patterns = shutil.ignore_patterns('*.tmp', 'test_dir2') - shutil.copytree(src_dir, dst_dir, ignore=patterns) - # checking the result: some elements should not be copied - self.assertTrue(exists(join(dst_dir, 'test.txt'))) - self.assertFalse(exists(join(dst_dir, 'test.tmp'))) - self.assertFalse(exists(join(dst_dir, 'test_dir2'))) - finally: - shutil.rmtree(dst_dir) - try: - patterns = shutil.ignore_patterns('*.tmp', 'subdir*') - shutil.copytree(src_dir, dst_dir, ignore=patterns) - # checking the result: some elements should not be copied - self.assertFalse(exists(join(dst_dir, 'test.tmp'))) - self.assertFalse(exists(join(dst_dir, 'test_dir2', 'subdir2'))) - self.assertFalse(exists(join(dst_dir, 'test_dir2', 'subdir'))) - finally: - shutil.rmtree(dst_dir) - - # testing callable-style - try: - def _filter(src, names): - res = [] - for name in names: - path = os.path.join(src, name) - - if (os.path.isdir(path) and - path.split()[-1] == 'subdir'): - res.append(name) - elif os.path.splitext(path)[-1] in ('.py'): - res.append(name) - return res + shutil.copystat(src_link, dst_link, follow_symlinks=True) + self.assertNotEqual(src_link_stat.st_mode, os.stat(dst).st_mode) + # don't follow + shutil.copystat(src_link, dst_link, follow_symlinks=False) + dst_link_stat = os.lstat(dst_link) + if os.utime in os.supports_follow_symlinks: + for attr in 'st_atime', 'st_mtime': + # The modification times may be truncated in the new file. + self.assertLessEqual(getattr(src_link_stat, attr), + getattr(dst_link_stat, attr) + 1) + if hasattr(os, 'lchmod'): + self.assertEqual(src_link_stat.st_mode, dst_link_stat.st_mode) + if hasattr(os, 'lchflags') and hasattr(src_link_stat, 'st_flags'): + self.assertEqual(src_link_stat.st_flags, dst_link_stat.st_flags) + # tell to follow but dst is not a link + shutil.copystat(src_link, dst, follow_symlinks=False) + self.assertTrue(abs(os.stat(src).st_mtime - os.stat(dst).st_mtime) < + 00000.1) - shutil.copytree(src_dir, dst_dir, ignore=_filter) + @unittest.skipUnless(hasattr(os, 'chflags') and + hasattr(errno, 'EOPNOTSUPP') and + hasattr(errno, 'ENOTSUP'), + "requires os.chflags, EOPNOTSUPP & ENOTSUP") + def test_copystat_handles_harmless_chflags_errors(self): + tmpdir = self.mkdtemp() + file1 = os.path.join(tmpdir, 'file1') + file2 = os.path.join(tmpdir, 'file2') + write_file(file1, 'xxx') + write_file(file2, 'xxx') - # checking the result: some elements should not be copied - self.assertFalse(exists(join(dst_dir, 'test_dir2', 'subdir2', - 'test.py'))) - self.assertFalse(exists(join(dst_dir, 'test_dir2', 'subdir'))) + def make_chflags_raiser(err): + ex = OSError() - finally: - shutil.rmtree(dst_dir) + def _chflags_raiser(path, flags, *, follow_symlinks=True): + ex.errno = err + raise ex + return _chflags_raiser + old_chflags = os.chflags + try: + for err in errno.EOPNOTSUPP, errno.ENOTSUP: + os.chflags = make_chflags_raiser(err) + shutil.copystat(file1, file2) + # assert others errors break it + os.chflags = make_chflags_raiser(errno.EOPNOTSUPP + errno.ENOTSUP) + self.assertRaises(OSError, shutil.copystat, file1, file2) finally: - shutil.rmtree(src_dir) - shutil.rmtree(os.path.dirname(dst_dir)) + os.chflags = old_chflags - def test_copytree_arg_types_of_ignore(self): - join = os.path.join - exists = os.path.exists + ### shutil.copyxattr + @support.skip_unless_xattr + def test_copyxattr(self): tmp_dir = self.mkdtemp() - src_dir = join(tmp_dir, "source") - - os.mkdir(join(src_dir)) - os.mkdir(join(src_dir, 'test_dir')) - os.mkdir(os.path.join(src_dir, 'test_dir', 'subdir')) - write_file((src_dir, 'test_dir', 'subdir', 'test.txt'), '456') + src = os.path.join(tmp_dir, 'foo') + write_file(src, 'foo') + dst = os.path.join(tmp_dir, 'bar') + write_file(dst, 'bar') - invokations = [] + # no xattr == no problem + shutil._copyxattr(src, dst) + # common case + os.setxattr(src, 'user.foo', b'42') + os.setxattr(src, 'user.bar', b'43') + shutil._copyxattr(src, dst) + self.assertEqual(sorted(os.listxattr(src)), sorted(os.listxattr(dst))) + self.assertEqual( + os.getxattr(src, 'user.foo'), + os.getxattr(dst, 'user.foo')) + # check errors don't affect other attrs + os.remove(dst) + write_file(dst, 'bar') + os_error = OSError(errno.EPERM, 'EPERM') - def _ignore(src, names): - invokations.append(src) - self.assertIsInstance(src, str) - self.assertIsInstance(names, list) - self.assertEqual(len(names), len(set(names))) - for name in names: - self.assertIsInstance(name, str) - return [] + def _raise_on_user_foo(fname, attr, val, **kwargs): + if attr == 'user.foo': + raise os_error + else: + orig_setxattr(fname, attr, val, **kwargs) + try: + orig_setxattr = os.setxattr + os.setxattr = _raise_on_user_foo + shutil._copyxattr(src, dst) + self.assertIn('user.bar', os.listxattr(dst)) + finally: + os.setxattr = orig_setxattr + # the source filesystem not supporting xattrs should be ok, too. + def _raise_on_src(fname, *, follow_symlinks=True): + if fname == src: + raise OSError(errno.ENOTSUP, 'Operation not supported') + return orig_listxattr(fname, follow_symlinks=follow_symlinks) + try: + orig_listxattr = os.listxattr + os.listxattr = _raise_on_src + shutil._copyxattr(src, dst) + finally: + os.listxattr = orig_listxattr - dst_dir = join(self.mkdtemp(), 'destination') - shutil.copytree(src_dir, dst_dir, ignore=_ignore) - self.assertTrue(exists(join(dst_dir, 'test_dir', 'subdir', - 'test.txt'))) + # test that shutil.copystat copies xattrs + src = os.path.join(tmp_dir, 'the_original') + srcro = os.path.join(tmp_dir, 'the_original_ro') + write_file(src, src) + write_file(srcro, srcro) + os.setxattr(src, 'user.the_value', b'fiddly') + os.setxattr(srcro, 'user.the_value', b'fiddly') + os.chmod(srcro, 0o444) + dst = os.path.join(tmp_dir, 'the_copy') + dstro = os.path.join(tmp_dir, 'the_copy_ro') + write_file(dst, dst) + write_file(dstro, dstro) + shutil.copystat(src, dst) + shutil.copystat(srcro, dstro) + self.assertEqual(os.getxattr(dst, 'user.the_value'), b'fiddly') + self.assertEqual(os.getxattr(dstro, 'user.the_value'), b'fiddly') - dst_dir = join(self.mkdtemp(), 'destination') - shutil.copytree(pathlib.Path(src_dir), dst_dir, ignore=_ignore) - self.assertTrue(exists(join(dst_dir, 'test_dir', 'subdir', - 'test.txt'))) + @support.skip_unless_symlink + @support.skip_unless_xattr + @unittest.skipUnless(hasattr(os, 'geteuid') and os.geteuid() == 0, + 'root privileges required') + def test_copyxattr_symlinks(self): + # On Linux, it's only possible to access non-user xattr for symlinks; + # which in turn require root privileges. This test should be expanded + # as soon as other platforms gain support for extended attributes. + tmp_dir = self.mkdtemp() + src = os.path.join(tmp_dir, 'foo') + src_link = os.path.join(tmp_dir, 'baz') + write_file(src, 'foo') + os.symlink(src, src_link) + os.setxattr(src, 'trusted.foo', b'42') + os.setxattr(src_link, 'trusted.foo', b'43', follow_symlinks=False) + dst = os.path.join(tmp_dir, 'bar') + dst_link = os.path.join(tmp_dir, 'qux') + write_file(dst, 'bar') + os.symlink(dst, dst_link) + shutil._copyxattr(src_link, dst_link, follow_symlinks=False) + self.assertEqual(os.getxattr(dst_link, 'trusted.foo', follow_symlinks=False), b'43') + self.assertRaises(OSError, os.getxattr, dst, 'trusted.foo') + shutil._copyxattr(src_link, dst, follow_symlinks=False) + self.assertEqual(os.getxattr(dst, 'trusted.foo'), b'43') - dst_dir = join(self.mkdtemp(), 'destination') - src_dir_entry = list(os.scandir(tmp_dir))[0] - self.assertIsInstance(src_dir_entry, os.DirEntry) - shutil.copytree(src_dir_entry, dst_dir, ignore=_ignore) - self.assertTrue(exists(join(dst_dir, 'test_dir', 'subdir', - 'test.txt'))) + ### shutil.copy - self.assertEqual(len(invokations), 9) + def _copy_file(self, method): + fname = 'test.txt' + tmpdir = self.mkdtemp() + write_file((tmpdir, fname), 'xxx') + file1 = os.path.join(tmpdir, fname) + tmpdir2 = self.mkdtemp() + method(file1, tmpdir2) + file2 = os.path.join(tmpdir2, fname) + return (file1, file2) - def test_copytree_retains_permissions(self): - tmp_dir = tempfile.mkdtemp() - src_dir = os.path.join(tmp_dir, 'source') - os.mkdir(src_dir) - dst_dir = os.path.join(tmp_dir, 'destination') - self.addCleanup(shutil.rmtree, tmp_dir) + def test_copy(self): + # Ensure that the copied file exists and has the same mode bits. + file1, file2 = self._copy_file(shutil.copy) + self.assertTrue(os.path.exists(file2)) + self.assertEqual(os.stat(file1).st_mode, os.stat(file2).st_mode) - os.chmod(src_dir, 0o777) - write_file((src_dir, 'permissive.txt'), '123') - os.chmod(os.path.join(src_dir, 'permissive.txt'), 0o777) - write_file((src_dir, 'restrictive.txt'), '456') - os.chmod(os.path.join(src_dir, 'restrictive.txt'), 0o600) - restrictive_subdir = tempfile.mkdtemp(dir=src_dir) - os.chmod(restrictive_subdir, 0o600) + @support.skip_unless_symlink + def test_copy_symlinks(self): + tmp_dir = self.mkdtemp() + src = os.path.join(tmp_dir, 'foo') + dst = os.path.join(tmp_dir, 'bar') + src_link = os.path.join(tmp_dir, 'baz') + write_file(src, 'foo') + os.symlink(src, src_link) + if hasattr(os, 'lchmod'): + os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO) + # don't follow + shutil.copy(src_link, dst, follow_symlinks=True) + self.assertFalse(os.path.islink(dst)) + self.assertEqual(read_file(src), read_file(dst)) + os.remove(dst) + # follow + shutil.copy(src_link, dst, follow_symlinks=False) + self.assertTrue(os.path.islink(dst)) + self.assertEqual(os.readlink(dst), os.readlink(src_link)) + if hasattr(os, 'lchmod'): + self.assertEqual(os.lstat(src_link).st_mode, + os.lstat(dst).st_mode) - shutil.copytree(src_dir, dst_dir) - self.assertEqual(os.stat(src_dir).st_mode, os.stat(dst_dir).st_mode) - self.assertEqual(os.stat(os.path.join(src_dir, 'permissive.txt')).st_mode, - os.stat(os.path.join(dst_dir, 'permissive.txt')).st_mode) - self.assertEqual(os.stat(os.path.join(src_dir, 'restrictive.txt')).st_mode, - os.stat(os.path.join(dst_dir, 'restrictive.txt')).st_mode) - restrictive_subdir_dst = os.path.join(dst_dir, - os.path.split(restrictive_subdir)[1]) - self.assertEqual(os.stat(restrictive_subdir).st_mode, - os.stat(restrictive_subdir_dst).st_mode) + ### shutil.copy2 - @unittest.mock.patch('os.chmod') - def test_copytree_winerror(self, mock_patch): - # When copying to VFAT, copystat() raises OSError. On Windows, the - # exception object has a meaningful 'winerror' attribute, but not - # on other operating systems. Do not assume 'winerror' is set. - src_dir = tempfile.mkdtemp() - dst_dir = os.path.join(tempfile.mkdtemp(), 'destination') - self.addCleanup(shutil.rmtree, src_dir) - self.addCleanup(shutil.rmtree, os.path.dirname(dst_dir)) + @unittest.skipUnless(hasattr(os, 'utime'), 'requires os.utime') + def test_copy2(self): + # Ensure that the copied file exists and has the same mode and + # modification time bits. + file1, file2 = self._copy_file(shutil.copy2) + self.assertTrue(os.path.exists(file2)) + file1_stat = os.stat(file1) + file2_stat = os.stat(file2) + self.assertEqual(file1_stat.st_mode, file2_stat.st_mode) + for attr in 'st_atime', 'st_mtime': + # The modification times may be truncated in the new file. + self.assertLessEqual(getattr(file1_stat, attr), + getattr(file2_stat, attr) + 1) + if hasattr(os, 'chflags') and hasattr(file1_stat, 'st_flags'): + self.assertEqual(getattr(file1_stat, 'st_flags'), + getattr(file2_stat, 'st_flags')) - mock_patch.side_effect = PermissionError('ka-boom') - with self.assertRaises(shutil.Error): - shutil.copytree(src_dir, dst_dir) + @support.skip_unless_symlink + def test_copy2_symlinks(self): + tmp_dir = self.mkdtemp() + src = os.path.join(tmp_dir, 'foo') + dst = os.path.join(tmp_dir, 'bar') + src_link = os.path.join(tmp_dir, 'baz') + write_file(src, 'foo') + os.symlink(src, src_link) + if hasattr(os, 'lchmod'): + os.lchmod(src_link, stat.S_IRWXU | stat.S_IRWXO) + if hasattr(os, 'lchflags') and hasattr(stat, 'UF_NODUMP'): + os.lchflags(src_link, stat.UF_NODUMP) + src_stat = os.stat(src) + src_link_stat = os.lstat(src_link) + # follow + shutil.copy2(src_link, dst, follow_symlinks=True) + self.assertFalse(os.path.islink(dst)) + self.assertEqual(read_file(src), read_file(dst)) + os.remove(dst) + # don't follow + shutil.copy2(src_link, dst, follow_symlinks=False) + self.assertTrue(os.path.islink(dst)) + self.assertEqual(os.readlink(dst), os.readlink(src_link)) + dst_stat = os.lstat(dst) + if os.utime in os.supports_follow_symlinks: + for attr in 'st_atime', 'st_mtime': + # The modification times may be truncated in the new file. + self.assertLessEqual(getattr(src_link_stat, attr), + getattr(dst_stat, attr) + 1) + if hasattr(os, 'lchmod'): + self.assertEqual(src_link_stat.st_mode, dst_stat.st_mode) + self.assertNotEqual(src_stat.st_mode, dst_stat.st_mode) + if hasattr(os, 'lchflags') and hasattr(src_link_stat, 'st_flags'): + self.assertEqual(src_link_stat.st_flags, dst_stat.st_flags) - def test_copytree_custom_copy_function(self): - # See: https://bugs.python.org/issue35648 - def custom_cpfun(a, b): - flag.append(None) - self.assertIsInstance(a, str) - self.assertIsInstance(b, str) - self.assertEqual(a, os.path.join(src, 'foo')) - self.assertEqual(b, os.path.join(dst, 'foo')) + @support.skip_unless_xattr + def test_copy2_xattr(self): + tmp_dir = self.mkdtemp() + src = os.path.join(tmp_dir, 'foo') + dst = os.path.join(tmp_dir, 'bar') + write_file(src, 'foo') + os.setxattr(src, 'user.foo', b'42') + shutil.copy2(src, dst) + self.assertEqual( + os.getxattr(src, 'user.foo'), + os.getxattr(dst, 'user.foo')) + os.remove(dst) - flag = [] - src = tempfile.mkdtemp() - self.addCleanup(support.rmtree, src) - dst = tempfile.mktemp() - self.addCleanup(support.rmtree, dst) - with open(os.path.join(src, 'foo'), 'w') as f: - f.close() - shutil.copytree(src, dst, copy_function=custom_cpfun) - self.assertEqual(len(flag), 1) + def test_copy_return_value(self): + # copy and copy2 both return their destination path. + for fn in (shutil.copy, shutil.copy2): + src_dir = self.mkdtemp() + dst_dir = self.mkdtemp() + src = os.path.join(src_dir, 'foo') + write_file(src, 'foo') + rv = fn(src, dst_dir) + self.assertEqual(rv, os.path.join(dst_dir, 'foo')) + rv = fn(src, os.path.join(dst_dir, 'bar')) + self.assertEqual(rv, os.path.join(dst_dir, 'bar')) + + ### shutil.copyfile + + @support.skip_unless_symlink + def test_copyfile_symlinks(self): + tmp_dir = self.mkdtemp() + src = os.path.join(tmp_dir, 'src') + dst = os.path.join(tmp_dir, 'dst') + dst_link = os.path.join(tmp_dir, 'dst_link') + link = os.path.join(tmp_dir, 'link') + write_file(src, 'foo') + os.symlink(src, link) + # don't follow + shutil.copyfile(link, dst_link, follow_symlinks=False) + self.assertTrue(os.path.islink(dst_link)) + self.assertEqual(os.readlink(link), os.readlink(dst_link)) + # follow + shutil.copyfile(link, dst) + self.assertFalse(os.path.islink(dst)) @unittest.skipUnless(hasattr(os, 'link'), 'requires os.link') def test_dont_copy_file_onto_link_to_itself(self): @@ -1009,176 +1191,62 @@ def test_dont_copy_file_onto_symlink_to_itself(self): dst = os.path.join(TESTFN, 'shop') try: with open(src, 'w') as f: - f.write('cheddar') - # Using `src` here would mean we end up with a symlink pointing - # to TESTFN/TESTFN/cheese, while it should point at - # TESTFN/cheese. - os.symlink('cheese', dst) - self.assertRaises(shutil.SameFileError, shutil.copyfile, src, dst) - with open(src, 'r') as f: - self.assertEqual(f.read(), 'cheddar') - os.remove(dst) - finally: - shutil.rmtree(TESTFN, ignore_errors=True) - - @support.skip_unless_symlink - def test_rmtree_on_symlink(self): - # bug 1669. - os.mkdir(TESTFN) - try: - src = os.path.join(TESTFN, 'cheese') - dst = os.path.join(TESTFN, 'shop') - os.mkdir(src) - os.symlink(src, dst) - self.assertRaises(OSError, shutil.rmtree, dst) - shutil.rmtree(dst, ignore_errors=True) - finally: - shutil.rmtree(TESTFN, ignore_errors=True) - - @unittest.skipUnless(_winapi, 'only relevant on Windows') - def test_rmtree_on_junction(self): - os.mkdir(TESTFN) - try: - src = os.path.join(TESTFN, 'cheese') - dst = os.path.join(TESTFN, 'shop') - os.mkdir(src) - open(os.path.join(src, 'spam'), 'wb').close() - _winapi.CreateJunction(src, dst) - self.assertRaises(OSError, shutil.rmtree, dst) - shutil.rmtree(dst, ignore_errors=True) - finally: - shutil.rmtree(TESTFN, ignore_errors=True) - - # Issue #3002: copyfile and copytree block indefinitely on named pipes - @unittest.skipUnless(hasattr(os, "mkfifo"), 'requires os.mkfifo()') - def test_copyfile_named_pipe(self): - try: - os.mkfifo(TESTFN) - except PermissionError as e: - self.skipTest('os.mkfifo(): %s' % e) - try: - self.assertRaises(shutil.SpecialFileError, - shutil.copyfile, TESTFN, TESTFN2) - self.assertRaises(shutil.SpecialFileError, - shutil.copyfile, __file__, TESTFN) - finally: - os.remove(TESTFN) - - @unittest.skipUnless(hasattr(os, "mkfifo"), 'requires os.mkfifo()') - @support.skip_unless_symlink - def test_copytree_named_pipe(self): - os.mkdir(TESTFN) - try: - subdir = os.path.join(TESTFN, "subdir") - os.mkdir(subdir) - pipe = os.path.join(subdir, "mypipe") - try: - os.mkfifo(pipe) - except PermissionError as e: - self.skipTest('os.mkfifo(): %s' % e) - try: - shutil.copytree(TESTFN, TESTFN2) - except shutil.Error as e: - errors = e.args[0] - self.assertEqual(len(errors), 1) - src, dst, error_msg = errors[0] - self.assertEqual("`%s` is a named pipe" % pipe, error_msg) - else: - self.fail("shutil.Error should have been raised") + f.write('cheddar') + # Using `src` here would mean we end up with a symlink pointing + # to TESTFN/TESTFN/cheese, while it should point at + # TESTFN/cheese. + os.symlink('cheese', dst) + self.assertRaises(shutil.SameFileError, shutil.copyfile, src, dst) + with open(src, 'r') as f: + self.assertEqual(f.read(), 'cheddar') + os.remove(dst) finally: shutil.rmtree(TESTFN, ignore_errors=True) - shutil.rmtree(TESTFN2, ignore_errors=True) - - def test_copytree_special_func(self): - - src_dir = self.mkdtemp() - dst_dir = os.path.join(self.mkdtemp(), 'destination') - write_file((src_dir, 'test.txt'), '123') - os.mkdir(os.path.join(src_dir, 'test_dir')) - write_file((src_dir, 'test_dir', 'test.txt'), '456') - - copied = [] - def _copy(src, dst): - copied.append((src, dst)) - - shutil.copytree(src_dir, dst_dir, copy_function=_copy) - self.assertEqual(len(copied), 2) - @support.skip_unless_symlink - def test_copytree_dangling_symlinks(self): + # Issue #3002: copyfile and copytree block indefinitely on named pipes + @unittest.skipUnless(hasattr(os, "mkfifo"), 'requires os.mkfifo()') + def test_copyfile_named_pipe(self): + try: + os.mkfifo(TESTFN) + except PermissionError as e: + self.skipTest('os.mkfifo(): %s' % e) + try: + self.assertRaises(shutil.SpecialFileError, + shutil.copyfile, TESTFN, TESTFN2) + self.assertRaises(shutil.SpecialFileError, + shutil.copyfile, __file__, TESTFN) + finally: + os.remove(TESTFN) - # a dangling symlink raises an error at the end + def test_copyfile_return_value(self): + # copytree returns its destination path. src_dir = self.mkdtemp() - dst_dir = os.path.join(self.mkdtemp(), 'destination') - os.symlink('IDONTEXIST', os.path.join(src_dir, 'test.txt')) - os.mkdir(os.path.join(src_dir, 'test_dir')) - write_file((src_dir, 'test_dir', 'test.txt'), '456') - self.assertRaises(Error, shutil.copytree, src_dir, dst_dir) - - # a dangling symlink is ignored with the proper flag - dst_dir = os.path.join(self.mkdtemp(), 'destination2') - shutil.copytree(src_dir, dst_dir, ignore_dangling_symlinks=True) - self.assertNotIn('test.txt', os.listdir(dst_dir)) - - # a dangling symlink is copied if symlinks=True - dst_dir = os.path.join(self.mkdtemp(), 'destination3') - shutil.copytree(src_dir, dst_dir, symlinks=True) - self.assertIn('test.txt', os.listdir(dst_dir)) + dst_dir = self.mkdtemp() + dst_file = os.path.join(dst_dir, 'bar') + src_file = os.path.join(src_dir, 'foo') + write_file(src_file, 'foo') + rv = shutil.copyfile(src_file, dst_file) + self.assertTrue(os.path.exists(rv)) + self.assertEqual(read_file(src_file), read_file(dst_file)) - @support.skip_unless_symlink - def test_copytree_symlink_dir(self): + def test_copyfile_same_file(self): + # copyfile() should raise SameFileError if the source and destination + # are the same. src_dir = self.mkdtemp() - dst_dir = os.path.join(self.mkdtemp(), 'destination') - os.mkdir(os.path.join(src_dir, 'real_dir')) - with open(os.path.join(src_dir, 'real_dir', 'test.txt'), 'w'): - pass - os.symlink(os.path.join(src_dir, 'real_dir'), - os.path.join(src_dir, 'link_to_dir'), - target_is_directory=True) - - shutil.copytree(src_dir, dst_dir, symlinks=False) - self.assertFalse(os.path.islink(os.path.join(dst_dir, 'link_to_dir'))) - self.assertIn('test.txt', os.listdir(os.path.join(dst_dir, 'link_to_dir'))) - - dst_dir = os.path.join(self.mkdtemp(), 'destination2') - shutil.copytree(src_dir, dst_dir, symlinks=True) - self.assertTrue(os.path.islink(os.path.join(dst_dir, 'link_to_dir'))) - self.assertIn('test.txt', os.listdir(os.path.join(dst_dir, 'link_to_dir'))) + src_file = os.path.join(src_dir, 'foo') + write_file(src_file, 'foo') + self.assertRaises(SameFileError, shutil.copyfile, src_file, src_file) + # But Error should work too, to stay backward compatible. + self.assertRaises(Error, shutil.copyfile, src_file, src_file) + # Make sure file is not corrupted. + self.assertEqual(read_file(src_file), 'foo') - def _copy_file(self, method): - fname = 'test.txt' - tmpdir = self.mkdtemp() - write_file((tmpdir, fname), 'xxx') - file1 = os.path.join(tmpdir, fname) - tmpdir2 = self.mkdtemp() - method(file1, tmpdir2) - file2 = os.path.join(tmpdir2, fname) - return (file1, file2) - def test_copy(self): - # Ensure that the copied file exists and has the same mode bits. - file1, file2 = self._copy_file(shutil.copy) - self.assertTrue(os.path.exists(file2)) - self.assertEqual(os.stat(file1).st_mode, os.stat(file2).st_mode) +class TestArchives(BaseTest, unittest.TestCase): - @unittest.skipUnless(hasattr(os, 'utime'), 'requires os.utime') - def test_copy2(self): - # Ensure that the copied file exists and has the same mode and - # modification time bits. - file1, file2 = self._copy_file(shutil.copy2) - self.assertTrue(os.path.exists(file2)) - file1_stat = os.stat(file1) - file2_stat = os.stat(file2) - self.assertEqual(file1_stat.st_mode, file2_stat.st_mode) - for attr in 'st_atime', 'st_mtime': - # The modification times may be truncated in the new file. - self.assertLessEqual(getattr(file1_stat, attr), - getattr(file2_stat, attr) + 1) - if hasattr(os, 'chflags') and hasattr(file1_stat, 'st_flags'): - self.assertEqual(getattr(file1_stat, 'st_flags'), - getattr(file2_stat, 'st_flags')) + ### shutil.make_archive - @support.requires_zlib + @support.requires_zlib() def test_make_tarball(self): # creating something to tar root_dir, base_dir = self._create_files('') @@ -1234,7 +1302,7 @@ def _create_files(self, base_dir='dist'): write_file((root_dir, 'outer'), 'xxx') return root_dir, base_dir - @support.requires_zlib + @support.requires_zlib() @unittest.skipUnless(shutil.which('tar'), 'Need the tar command to run') def test_tarfile_vs_tar(self): @@ -1267,7 +1335,7 @@ def test_tarfile_vs_tar(self): self.assertEqual(tarball, base_name + '.tar') self.assertTrue(os.path.isfile(tarball)) - @support.requires_zlib + @support.requires_zlib() def test_make_zipfile(self): # creating something to zip root_dir, base_dir = self._create_files() @@ -1304,7 +1372,7 @@ def test_make_zipfile(self): ['dist/', 'dist/sub/', 'dist/sub2/', 'dist/file1', 'dist/file2', 'dist/sub/file3']) - @support.requires_zlib + @support.requires_zlib() @unittest.skipUnless(shutil.which('zip'), 'Need the zip command to run') def test_zipfile_vs_zip(self): @@ -1330,7 +1398,7 @@ def test_zipfile_vs_zip(self): names2 = zf.namelist() self.assertEqual(sorted(names), sorted(names2)) - @support.requires_zlib + @support.requires_zlib() @unittest.skipUnless(shutil.which('unzip'), 'Need the unzip command to run') def test_unzip_zipfile(self): @@ -1359,7 +1427,7 @@ def test_make_archive(self): base_name = os.path.join(tmpdir, 'archive') self.assertRaises(ValueError, make_archive, base_name, 'xxx') - @support.requires_zlib + @support.requires_zlib() def test_make_archive_owner_group(self): # testing make_archive with owner and group, with various combinations # this works even if there's not gid/uid support @@ -1387,7 +1455,7 @@ def test_make_archive_owner_group(self): self.assertTrue(os.path.isfile(res)) - @support.requires_zlib + @support.requires_zlib() @unittest.skipUnless(UID_GID_SUPPORT, "Requires grp and pwd support") def test_tarfile_root_owner(self): root_dir, base_dir = self._create_files() @@ -1432,7 +1500,7 @@ def test_make_tarfile_in_curdir(self): self.assertEqual(make_archive('test', 'tar'), 'test.tar') self.assertTrue(os.path.isfile('test.tar')) - @support.requires_zlib + @support.requires_zlib() def test_make_zipfile_in_curdir(self): # Issue #21280 root_dir = self.mkdtemp() @@ -1456,6 +1524,8 @@ def test_register_archive_format(self): formats = [name for name, params in get_archive_formats()] self.assertNotIn('xxx', formats) + ### shutil.unpack_archive + def check_unpack_archive(self, format): self.check_unpack_archive_with_converter(format, lambda path: path) self.check_unpack_archive_with_converter(format, pathlib.Path) @@ -1485,20 +1555,20 @@ def check_unpack_archive_with_converter(self, format, converter): def test_unpack_archive_tar(self): self.check_unpack_archive('tar') - @support.requires_zlib + @support.requires_zlib() def test_unpack_archive_gztar(self): self.check_unpack_archive('gztar') - @support.requires_bz2 + @support.requires_bz2() def test_unpack_archive_bztar(self): self.check_unpack_archive('bztar') - @support.requires_lzma + @support.requires_lzma() @unittest.skipIf(AIX and not _maxdataOK(), "AIX MAXDATA must be 0x20000000 or larger") def test_unpack_archive_xztar(self): self.check_unpack_archive('xztar') - @support.requires_zlib + @support.requires_zlib() def test_unpack_archive_zip(self): self.check_unpack_archive('zip') @@ -1528,6 +1598,9 @@ def _boo(filename, extract_dir, extra): unregister_unpack_format('Boo2') self.assertEqual(get_unpack_formats(), formats) + +class TestMisc(BaseTest, unittest.TestCase): + @unittest.skipUnless(hasattr(shutil, 'disk_usage'), "disk_usage not available on this platform") def test_disk_usage(self): @@ -1546,8 +1619,6 @@ def test_disk_usage(self): @unittest.skipUnless(UID_GID_SUPPORT, "Requires grp and pwd support") @unittest.skipUnless(hasattr(os, 'chown'), 'requires os.chown') def test_chown(self): - - # cleaned-up automatically by TestShutil.tearDown method dirname = self.mkdtemp() filename = tempfile.mktemp(dir=dirname) write_file(filename, 'testing chown function') @@ -1595,76 +1666,23 @@ def check_chown(path, uid=None, gid=None): shutil.chown(dirname, group=gid) check_chown(dirname, gid=gid) - user = pwd.getpwuid(uid)[0] - group = grp.getgrgid(gid)[0] - shutil.chown(filename, user, group) - check_chown(filename, uid, gid) - shutil.chown(dirname, user, group) - check_chown(dirname, uid, gid) - - def test_copy_return_value(self): - # copy and copy2 both return their destination path. - for fn in (shutil.copy, shutil.copy2): - src_dir = self.mkdtemp() - dst_dir = self.mkdtemp() - src = os.path.join(src_dir, 'foo') - write_file(src, 'foo') - rv = fn(src, dst_dir) - self.assertEqual(rv, os.path.join(dst_dir, 'foo')) - rv = fn(src, os.path.join(dst_dir, 'bar')) - self.assertEqual(rv, os.path.join(dst_dir, 'bar')) - - def test_copyfile_return_value(self): - # copytree returns its destination path. - src_dir = self.mkdtemp() - dst_dir = self.mkdtemp() - dst_file = os.path.join(dst_dir, 'bar') - src_file = os.path.join(src_dir, 'foo') - write_file(src_file, 'foo') - rv = shutil.copyfile(src_file, dst_file) - self.assertTrue(os.path.exists(rv)) - self.assertEqual(read_file(src_file), read_file(dst_file)) - - def test_copyfile_same_file(self): - # copyfile() should raise SameFileError if the source and destination - # are the same. - src_dir = self.mkdtemp() - src_file = os.path.join(src_dir, 'foo') - write_file(src_file, 'foo') - self.assertRaises(SameFileError, shutil.copyfile, src_file, src_file) - # But Error should work too, to stay backward compatible. - self.assertRaises(Error, shutil.copyfile, src_file, src_file) - # Make sure file is not corrupted. - self.assertEqual(read_file(src_file), 'foo') - - def test_copytree_return_value(self): - # copytree returns its destination path. - src_dir = self.mkdtemp() - dst_dir = src_dir + "dest" - self.addCleanup(shutil.rmtree, dst_dir, True) - src = os.path.join(src_dir, 'foo') - write_file(src, 'foo') - rv = shutil.copytree(src_dir, dst_dir) - self.assertEqual(['foo'], os.listdir(rv)) - - def test_copytree_subdirectory(self): - # copytree where dst is a subdirectory of src, see Issue 38688 - base_dir = self.mkdtemp() - self.addCleanup(shutil.rmtree, base_dir, ignore_errors=True) - src_dir = os.path.join(base_dir, "t", "pg") - dst_dir = os.path.join(src_dir, "somevendor", "1.0") - os.makedirs(src_dir) - src = os.path.join(src_dir, 'pol') - write_file(src, 'pol') - rv = shutil.copytree(src_dir, dst_dir) - self.assertEqual(['pol'], os.listdir(rv)) + try: + user = pwd.getpwuid(uid)[0] + group = grp.getgrgid(gid)[0] + except KeyError: + # On some systems uid/gid cannot be resolved. + pass + else: + shutil.chown(filename, user, group) + check_chown(filename, uid, gid) + shutil.chown(dirname, user, group) + check_chown(dirname, uid, gid) -class TestWhich(unittest.TestCase): +class TestWhich(BaseTest, unittest.TestCase): def setUp(self): - self.temp_dir = tempfile.mkdtemp(prefix="Tmp") - self.addCleanup(shutil.rmtree, self.temp_dir, True) + self.temp_dir = self.mkdtemp(prefix="Tmp") # Give the temp_file an ".exe" suffix for all. # It's needed on Windows and not harmful on other platforms. self.temp_file = tempfile.NamedTemporaryFile(dir=self.temp_dir, @@ -1830,6 +1848,23 @@ def test_pathext(self): rv = shutil.which(program, path=self.temp_dir) self.assertEqual(rv, temp_filexyz.name) + # Issue 40592: See https://bugs.python.org/issue40592 + @unittest.skipUnless(sys.platform == "win32", 'test specific to Windows') + def test_pathext_with_empty_str(self): + ext = ".xyz" + temp_filexyz = tempfile.NamedTemporaryFile(dir=self.temp_dir, + prefix="Tmp2", suffix=ext) + self.addCleanup(temp_filexyz.close) + + # strip path and extension + program = os.path.basename(temp_filexyz.name) + program = os.path.splitext(program)[0] + + with support.EnvironmentVarGuard() as env: + env['PATHEXT'] = f"{ext};" # note the ; + rv = shutil.which(program, path=self.temp_dir) + self.assertEqual(rv, temp_filexyz.name) + class TestWhichBytes(TestWhich): def setUp(self): @@ -1841,28 +1876,17 @@ def setUp(self): self.ext = os.fsencode(self.ext) -class TestMove(unittest.TestCase): +class TestMove(BaseTest, unittest.TestCase): def setUp(self): filename = "foo" - basedir = None - if sys.platform == "win32": - basedir = os.path.realpath(os.getcwd()) - self.src_dir = tempfile.mkdtemp(dir=basedir) - self.dst_dir = tempfile.mkdtemp(dir=basedir) + self.src_dir = self.mkdtemp() + self.dst_dir = self.mkdtemp() self.src_file = os.path.join(self.src_dir, filename) self.dst_file = os.path.join(self.dst_dir, filename) with open(self.src_file, "wb") as f: f.write(b"spam") - def tearDown(self): - for d in (self.src_dir, self.dst_dir): - try: - if d: - shutil.rmtree(d) - except: - pass - def _check_move_file(self, src, dst, real_dst): with open(src, "rb") as f: contents = f.read() @@ -1885,6 +1909,16 @@ def test_move_file_to_dir(self): # Move a file inside an existing dir on the same filesystem. self._check_move_file(self.src_file, self.dst_dir, self.dst_file) + def test_move_file_to_dir_pathlike_src(self): + # Move a pathlike file to another location on the same filesystem. + src = pathlib.Path(self.src_file) + self._check_move_file(src, self.dst_dir, self.dst_file) + + def test_move_file_to_dir_pathlike_dst(self): + # Move a file to another pathlike location on the same filesystem. + dst = pathlib.Path(self.dst_dir) + self._check_move_file(self.src_file, dst, self.dst_file) + @mock_rename def test_move_file_other_fs(self): # Move a file to an existing dir on another filesystem. @@ -1897,14 +1931,11 @@ def test_move_file_to_dir_other_fs(self): def test_move_dir(self): # Move a dir to another location on the same filesystem. - dst_dir = tempfile.mktemp() + dst_dir = tempfile.mktemp(dir=self.mkdtemp()) try: self._check_move_dir(self.src_dir, dst_dir, dst_dir) finally: - try: - shutil.rmtree(dst_dir) - except: - pass + support.rmtree(dst_dir) @mock_rename def test_move_dir_other_fs(self): @@ -1951,7 +1982,7 @@ def test_destinsrc_false_negative(self): msg='_destinsrc() wrongly concluded that ' 'dst (%s) is not in src (%s)' % (dst, src)) finally: - shutil.rmtree(TESTFN, ignore_errors=True) + support.rmtree(TESTFN) def test_destinsrc_false_positive(self): os.mkdir(TESTFN) @@ -1963,7 +1994,7 @@ def test_destinsrc_false_positive(self): msg='_destinsrc() wrongly concluded that ' 'dst (%s) is in src (%s)' % (dst, src)) finally: - shutil.rmtree(TESTFN, ignore_errors=True) + support.rmtree(TESTFN) @support.skip_unless_symlink @mock_rename @@ -2035,10 +2066,24 @@ def _copy(src, dst): shutil.move(self.src_dir, self.dst_dir, copy_function=_copy) self.assertEqual(len(moved), 3) + def test_move_dir_caseinsensitive(self): + # Renames a folder to the same name + # but a different case. -class TestCopyFile(unittest.TestCase): + self.src_dir = self.mkdtemp() + dst_dir = os.path.join( + os.path.dirname(self.src_dir), + os.path.basename(self.src_dir).upper()) + self.assertNotEqual(self.src_dir, dst_dir) - _delete = False + try: + shutil.move(self.src_dir, dst_dir) + self.assertTrue(os.path.isdir(dst_dir)) + finally: + os.rmdir(dst_dir) + + +class TestCopyFile(unittest.TestCase): class Faux(object): _entered = False @@ -2058,27 +2103,18 @@ def __exit__(self, exc_type, exc_val, exc_tb): raise OSError("Cannot close") return self._suppress_at_exit - def tearDown(self): - if self._delete: - del shutil.open - - def _set_shutil_open(self, func): - shutil.open = func - self._delete = True - def test_w_source_open_fails(self): def _open(filename, mode='r'): if filename == 'srcfile': raise OSError('Cannot open "srcfile"') assert 0 # shouldn't reach here. - self._set_shutil_open(_open) - - self.assertRaises(OSError, shutil.copyfile, 'srcfile', 'destfile') + with support.swap_attr(shutil, 'open', _open): + with self.assertRaises(OSError): + shutil.copyfile('srcfile', 'destfile') @unittest.skipIf(MACOS, "skipped on macOS") def test_w_dest_open_fails(self): - srcfile = self.Faux() def _open(filename, mode='r'): @@ -2088,9 +2124,8 @@ def _open(filename, mode='r'): raise OSError('Cannot open "destfile"') assert 0 # shouldn't reach here. - self._set_shutil_open(_open) - - shutil.copyfile('srcfile', 'destfile') + with support.swap_attr(shutil, 'open', _open): + shutil.copyfile('srcfile', 'destfile') self.assertTrue(srcfile._entered) self.assertTrue(srcfile._exited_with[0] is OSError) self.assertEqual(srcfile._exited_with[1].args, @@ -2098,7 +2133,6 @@ def _open(filename, mode='r'): @unittest.skipIf(MACOS, "skipped on macOS") def test_w_dest_close_fails(self): - srcfile = self.Faux() destfile = self.Faux(True) @@ -2109,9 +2143,8 @@ def _open(filename, mode='r'): return destfile assert 0 # shouldn't reach here. - self._set_shutil_open(_open) - - shutil.copyfile('srcfile', 'destfile') + with support.swap_attr(shutil, 'open', _open): + shutil.copyfile('srcfile', 'destfile') self.assertTrue(srcfile._entered) self.assertTrue(destfile._entered) self.assertTrue(destfile._raised) @@ -2132,33 +2165,15 @@ def _open(filename, mode='r'): return destfile assert 0 # shouldn't reach here. - self._set_shutil_open(_open) - - self.assertRaises(OSError, - shutil.copyfile, 'srcfile', 'destfile') + with support.swap_attr(shutil, 'open', _open): + with self.assertRaises(OSError): + shutil.copyfile('srcfile', 'destfile') self.assertTrue(srcfile._entered) self.assertTrue(destfile._entered) self.assertFalse(destfile._raised) self.assertTrue(srcfile._exited_with[0] is None) self.assertTrue(srcfile._raised) - def test_move_dir_caseinsensitive(self): - # Renames a folder to the same name - # but a different case. - - self.src_dir = tempfile.mkdtemp() - self.addCleanup(shutil.rmtree, self.src_dir, True) - dst_dir = os.path.join( - os.path.dirname(self.src_dir), - os.path.basename(self.src_dir).upper()) - self.assertNotEqual(self.src_dir, dst_dir) - - try: - shutil.move(self.src_dir, dst_dir) - self.assertTrue(os.path.isdir(dst_dir)) - finally: - os.rmdir(dst_dir) - class TestCopyFileObj(unittest.TestCase): FILESIZE = 2 * 1024 * 1024 @@ -2215,7 +2230,7 @@ def test_win_impl(self): # If file size < 1 MiB memoryview() length must be equal to # the actual file size. - with tempfile.NamedTemporaryFile(delete=False) as f: + with tempfile.NamedTemporaryFile(dir=os.getcwd(), delete=False) as f: f.write(b'foo') fname = f.name self.addCleanup(support.unlink, fname) @@ -2224,7 +2239,7 @@ def test_win_impl(self): self.assertEqual(m.call_args[0][2], 3) # Empty files should not rely on readinto() variant. - with tempfile.NamedTemporaryFile(delete=False) as f: + with tempfile.NamedTemporaryFile(dir=os.getcwd(), delete=False) as f: pass fname = f.name self.addCleanup(support.unlink, fname) @@ -2290,7 +2305,7 @@ def test_same_file(self): self.assertEqual(read_file(TESTFN, binary=True), self.FILEDATA) def test_non_existent_src(self): - name = tempfile.mktemp() + name = tempfile.mktemp(dir=os.getcwd()) with self.assertRaises(FileNotFoundError) as cm: shutil.copyfile(name, "new") self.assertEqual(cm.exception.filename, name) @@ -2461,7 +2476,7 @@ def zerocopy_fun(self, src, dst): return shutil._fastcopy_fcopyfile(src, dst, posix._COPYFILE_DATA) -class TermsizeTests(unittest.TestCase): +class TestGetTerminalSize(unittest.TestCase): def test_does_not_crash(self): """Check if get_terminal_size() returns a meaningful value. diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py index d41e94b07f4309ea30a7316e6eb30dbb37153c03..45553a6a42de7921397a8b81095453a707e98113 100644 --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -644,7 +644,7 @@ def handler(signum, frame): # wait until the child process is loaded and has started first_line = process.stdout.readline() - stdout, stderr = process.communicate(timeout=5.0) + stdout, stderr = process.communicate(timeout=support.SHORT_TIMEOUT) except subprocess.TimeoutExpired: process.kill() return False @@ -1192,7 +1192,7 @@ def second_handler(signum=None, frame=None): self.setsig(signal.SIGALRM, second_handler) # for ITIMER_REAL expected_sigs = 0 - deadline = time.monotonic() + 15.0 + deadline = time.monotonic() + support.SHORT_TIMEOUT while expected_sigs < N: os.kill(os.getpid(), signal.SIGPROF) @@ -1226,7 +1226,7 @@ def handler(signum, frame): self.setsig(signal.SIGALRM, handler) # for ITIMER_REAL expected_sigs = 0 - deadline = time.monotonic() + 15.0 + deadline = time.monotonic() + support.SHORT_TIMEOUT while expected_sigs < N: # Hopefully the SIGALRM will be received somewhere during @@ -1273,6 +1273,27 @@ def handler(a, b): self.assertTrue(is_ok) +class PidfdSignalTest(unittest.TestCase): + + @unittest.skipUnless( + hasattr(signal, "pidfd_send_signal"), + "pidfd support not built in", + ) + def test_pidfd_send_signal(self): + with self.assertRaises(OSError) as cm: + signal.pidfd_send_signal(0, signal.SIGINT) + if cm.exception.errno == errno.ENOSYS: + self.skipTest("kernel does not support pidfds") + elif cm.exception.errno == errno.EPERM: + self.skipTest("Not enough privileges to use pidfs") + self.assertEqual(cm.exception.errno, errno.EBADF) + my_pidfd = os.open(f'/proc/{os.getpid()}', os.O_DIRECTORY) + self.addCleanup(os.close, my_pidfd) + with self.assertRaisesRegex(TypeError, "^siginfo must be None$"): + signal.pidfd_send_signal(my_pidfd, signal.SIGINT, object(), 0) + with self.assertRaises(KeyboardInterrupt): + signal.pidfd_send_signal(my_pidfd, signal.SIGINT) + def tearDownModule(): support.reap_children() diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index 01008656bdd759246627182ccbe33fea9b048c24..ffba139dbeade3443d069335e8895c580dd9cf43 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -7,20 +7,21 @@ import unittest import test.support from test import support +from test.support import socket_helper from test.support import (captured_stderr, TESTFN, EnvironmentVarGuard, change_cwd) import builtins +import encodings import glob import os -import sys import re -import encodings -import urllib.request -import urllib.error import shutil import subprocess +import sys import sysconfig import tempfile +import urllib.error +import urllib.request from unittest import mock from copy import copy @@ -267,11 +268,18 @@ def test_getsitepackages(self): dirs = site.getsitepackages() if os.sep == '/': # OS X, Linux, FreeBSD, etc - self.assertEqual(len(dirs), 1) + if sys.platlibdir != "lib": + self.assertEqual(len(dirs), 2) + wanted = os.path.join('xoxo', sys.platlibdir, + 'python%d.%d' % sys.version_info[:2], + 'site-packages') + self.assertEqual(dirs[0], wanted) + else: + self.assertEqual(len(dirs), 1) wanted = os.path.join('xoxo', 'lib', 'python%d.%d' % sys.version_info[:2], 'site-packages') - self.assertEqual(dirs[0], wanted) + self.assertEqual(dirs[-1], wanted) else: # other platforms self.assertEqual(len(dirs), 2) @@ -492,8 +500,6 @@ def test_sitecustomize_executed(self): @test.support.requires_resource('network') @test.support.system_must_validate_cert - @unittest.skipUnless(sys.version_info[3] == 'final', - 'only for released versions') @unittest.skipUnless(hasattr(urllib.request, "HTTPSHandler"), 'need SSL support to download license') def test_license_exists_at_url(self): @@ -501,8 +507,10 @@ def test_license_exists_at_url(self): # string displayed by license in the absence of a LICENSE file. url = license._Printer__data.split()[1] req = urllib.request.Request(url, method='HEAD') + # Reset global urllib.request._opener + self.addCleanup(urllib.request.urlcleanup) try: - with test.support.transient_internet(url): + with socket_helper.transient_internet(url): with urllib.request.urlopen(req) as data: code = data.getcode() except urllib.error.HTTPError as e: diff --git a/Lib/test/test_smtpd.py b/Lib/test/test_smtpd.py index a9f7d5a3b8bc19aec90d94cc51d3a441aafc7db9..3be7739743940ef95163bdf44c8b1b3005e491dc 100644 --- a/Lib/test/test_smtpd.py +++ b/Lib/test/test_smtpd.py @@ -1,6 +1,7 @@ import unittest import textwrap from test import support, mock_socket +from test.support import socket_helper import socket import io import smtpd @@ -38,7 +39,7 @@ def setUp(self): smtpd.socket = asyncore.socket = mock_socket def test_process_message_unimplemented(self): - server = smtpd.SMTPServer((support.HOST, 0), ('b', 0), + server = smtpd.SMTPServer((socket_helper.HOST, 0), ('b', 0), decode_data=True) conn, addr = server.accept() channel = smtpd.SMTPChannel(server, conn, addr, decode_data=True) @@ -57,7 +58,7 @@ def test_decode_data_and_enable_SMTPUTF8_raises(self): self.assertRaises( ValueError, smtpd.SMTPServer, - (support.HOST, 0), + (socket_helper.HOST, 0), ('b', 0), enable_SMTPUTF8=True, decode_data=True) @@ -87,7 +88,7 @@ def write_line(line): write_line(b'.') def test_process_message_with_decode_data_true(self): - server = smtpd.DebuggingServer((support.HOST, 0), ('b', 0), + server = smtpd.DebuggingServer((socket_helper.HOST, 0), ('b', 0), decode_data=True) conn, addr = server.accept() channel = smtpd.SMTPChannel(server, conn, addr, decode_data=True) @@ -104,7 +105,7 @@ def test_process_message_with_decode_data_true(self): """)) def test_process_message_with_decode_data_false(self): - server = smtpd.DebuggingServer((support.HOST, 0), ('b', 0)) + server = smtpd.DebuggingServer((socket_helper.HOST, 0), ('b', 0)) conn, addr = server.accept() channel = smtpd.SMTPChannel(server, conn, addr) with support.captured_stdout() as s: @@ -120,7 +121,7 @@ def test_process_message_with_decode_data_false(self): """)) def test_process_message_with_enable_SMTPUTF8_true(self): - server = smtpd.DebuggingServer((support.HOST, 0), ('b', 0), + server = smtpd.DebuggingServer((socket_helper.HOST, 0), ('b', 0), enable_SMTPUTF8=True) conn, addr = server.accept() channel = smtpd.SMTPChannel(server, conn, addr, enable_SMTPUTF8=True) @@ -137,7 +138,7 @@ def test_process_message_with_enable_SMTPUTF8_true(self): """)) def test_process_SMTPUTF8_message_with_enable_SMTPUTF8_true(self): - server = smtpd.DebuggingServer((support.HOST, 0), ('b', 0), + server = smtpd.DebuggingServer((socket_helper.HOST, 0), ('b', 0), enable_SMTPUTF8=True) conn, addr = server.accept() channel = smtpd.SMTPChannel(server, conn, addr, enable_SMTPUTF8=True) @@ -168,13 +169,13 @@ def tearDown(self): asyncore.close_all() asyncore.socket = smtpd.socket = socket - @unittest.skipUnless(support.IPV6_ENABLED, "IPv6 not enabled") + @unittest.skipUnless(socket_helper.IPV6_ENABLED, "IPv6 not enabled") def test_socket_uses_IPv6(self): - server = smtpd.SMTPServer((support.HOSTv6, 0), (support.HOSTv4, 0)) + server = smtpd.SMTPServer((socket_helper.HOSTv6, 0), (socket_helper.HOSTv4, 0)) self.assertEqual(server.socket.family, socket.AF_INET6) def test_socket_uses_IPv4(self): - server = smtpd.SMTPServer((support.HOSTv4, 0), (support.HOSTv6, 0)) + server = smtpd.SMTPServer((socket_helper.HOSTv4, 0), (socket_helper.HOSTv6, 0)) self.assertEqual(server.socket.family, socket.AF_INET) @@ -197,7 +198,7 @@ def write_line(self, channel, line): channel.handle_read() def test_params_rejected(self): - server = DummyServer((support.HOST, 0), ('b', 0)) + server = DummyServer((socket_helper.HOST, 0), ('b', 0)) conn, addr = server.accept() channel = smtpd.SMTPChannel(server, conn, addr) self.write_line(channel, b'EHLO example') @@ -206,7 +207,7 @@ def test_params_rejected(self): self.assertEqual(channel.socket.last, self.error_response) def test_nothing_accepted(self): - server = DummyServer((support.HOST, 0), ('b', 0)) + server = DummyServer((socket_helper.HOST, 0), ('b', 0)) conn, addr = server.accept() channel = smtpd.SMTPChannel(server, conn, addr) self.write_line(channel, b'EHLO example') @@ -234,7 +235,7 @@ def write_line(self, channel, line): channel.handle_read() def test_with_decode_data_true(self): - server = DummyServer((support.HOST, 0), ('b', 0), decode_data=True) + server = DummyServer((socket_helper.HOST, 0), ('b', 0), decode_data=True) conn, addr = server.accept() channel = smtpd.SMTPChannel(server, conn, addr, decode_data=True) self.write_line(channel, b'EHLO example') @@ -250,7 +251,7 @@ def test_with_decode_data_true(self): self.assertEqual(channel.socket.last, b'250 OK\r\n') def test_with_decode_data_false(self): - server = DummyServer((support.HOST, 0), ('b', 0)) + server = DummyServer((socket_helper.HOST, 0), ('b', 0)) conn, addr = server.accept() channel = smtpd.SMTPChannel(server, conn, addr) self.write_line(channel, b'EHLO example') @@ -271,7 +272,7 @@ def test_with_decode_data_false(self): self.assertEqual(channel.socket.last, b'250 OK\r\n') def test_with_enable_smtputf8_true(self): - server = DummyServer((support.HOST, 0), ('b', 0), enable_SMTPUTF8=True) + server = DummyServer((socket_helper.HOST, 0), ('b', 0), enable_SMTPUTF8=True) conn, addr = server.accept() channel = smtpd.SMTPChannel(server, conn, addr, enable_SMTPUTF8=True) self.write_line(channel, b'EHLO example') @@ -286,7 +287,7 @@ def setUp(self): smtpd.socket = asyncore.socket = mock_socket self.old_debugstream = smtpd.DEBUGSTREAM self.debug = smtpd.DEBUGSTREAM = io.StringIO() - self.server = DummyServer((support.HOST, 0), ('b', 0), + self.server = DummyServer((socket_helper.HOST, 0), ('b', 0), decode_data=True) conn, addr = self.server.accept() self.channel = smtpd.SMTPChannel(self.server, conn, addr, @@ -304,7 +305,7 @@ def write_line(self, line): def test_broken_connect(self): self.assertRaises( DummyDispatcherBroken, BrokenDummyServer, - (support.HOST, 0), ('b', 0), decode_data=True) + (socket_helper.HOST, 0), ('b', 0), decode_data=True) def test_decode_data_and_enable_SMTPUTF8_raises(self): self.assertRaises( @@ -758,13 +759,13 @@ def test_attribute_deprecations(self): with support.check_warnings(('', DeprecationWarning)): self.channel._SMTPChannel__addr = 'spam' -@unittest.skipUnless(support.IPV6_ENABLED, "IPv6 not enabled") +@unittest.skipUnless(socket_helper.IPV6_ENABLED, "IPv6 not enabled") class SMTPDChannelIPv6Test(SMTPDChannelTest): def setUp(self): smtpd.socket = asyncore.socket = mock_socket self.old_debugstream = smtpd.DEBUGSTREAM self.debug = smtpd.DEBUGSTREAM = io.StringIO() - self.server = DummyServer((support.HOSTv6, 0), ('b', 0), + self.server = DummyServer((socket_helper.HOSTv6, 0), ('b', 0), decode_data=True) conn, addr = self.server.accept() self.channel = smtpd.SMTPChannel(self.server, conn, addr, @@ -776,7 +777,7 @@ def setUp(self): smtpd.socket = asyncore.socket = mock_socket self.old_debugstream = smtpd.DEBUGSTREAM self.debug = smtpd.DEBUGSTREAM = io.StringIO() - self.server = DummyServer((support.HOST, 0), ('b', 0), + self.server = DummyServer((socket_helper.HOST, 0), ('b', 0), decode_data=True) conn, addr = self.server.accept() # Set DATA size limit to 32 bytes for easy testing @@ -831,7 +832,7 @@ def setUp(self): smtpd.socket = asyncore.socket = mock_socket self.old_debugstream = smtpd.DEBUGSTREAM self.debug = smtpd.DEBUGSTREAM = io.StringIO() - self.server = DummyServer((support.HOST, 0), ('b', 0)) + self.server = DummyServer((socket_helper.HOST, 0), ('b', 0)) conn, addr = self.server.accept() self.channel = smtpd.SMTPChannel(self.server, conn, addr) @@ -873,7 +874,7 @@ def setUp(self): smtpd.socket = asyncore.socket = mock_socket self.old_debugstream = smtpd.DEBUGSTREAM self.debug = smtpd.DEBUGSTREAM = io.StringIO() - self.server = DummyServer((support.HOST, 0), ('b', 0), + self.server = DummyServer((socket_helper.HOST, 0), ('b', 0), decode_data=True) conn, addr = self.server.accept() # Set decode_data to True @@ -916,7 +917,7 @@ def setUp(self): smtpd.socket = asyncore.socket = mock_socket self.old_debugstream = smtpd.DEBUGSTREAM self.debug = smtpd.DEBUGSTREAM = io.StringIO() - self.server = DummyServer((support.HOST, 0), ('b', 0), + self.server = DummyServer((socket_helper.HOST, 0), ('b', 0), enable_SMTPUTF8=True) conn, addr = self.server.accept() self.channel = smtpd.SMTPChannel(self.server, conn, addr, diff --git a/Lib/test/test_smtplib.py b/Lib/test/test_smtplib.py index d0c9862edea93ffad364cd3648872fe094410cb8..3451f3a411e9a5d9c80d66b53116fdd31ded5747 100644 --- a/Lib/test/test_smtplib.py +++ b/Lib/test/test_smtplib.py @@ -20,11 +20,12 @@ import unittest from test import support, mock_socket -from test.support import HOST +from test.support import hashlib_helper +from test.support import socket_helper from test.support import threading_setup, threading_cleanup, join_thread -from test.support import requires_hashdigest from unittest.mock import Mock +HOST = socket_helper.HOST if sys.platform == 'darwin': # select.poll returns a select.POLLHUP at the end of the tests @@ -56,7 +57,7 @@ def server(evt, buf, serv): serv.close() evt.set() -class GeneralTests(unittest.TestCase): +class GeneralTests: def setUp(self): smtplib.socket = mock_socket @@ -75,29 +76,29 @@ def testQuoteData(self): def testBasic1(self): mock_socket.reply_with(b"220 Hola mundo") # connects - smtp = smtplib.SMTP(HOST, self.port) - smtp.close() + client = self.client(HOST, self.port) + client.close() def testSourceAddress(self): mock_socket.reply_with(b"220 Hola mundo") # connects - smtp = smtplib.SMTP(HOST, self.port, - source_address=('127.0.0.1',19876)) - self.assertEqual(smtp.source_address, ('127.0.0.1', 19876)) - smtp.close() + client = self.client(HOST, self.port, + source_address=('127.0.0.1',19876)) + self.assertEqual(client.source_address, ('127.0.0.1', 19876)) + client.close() def testBasic2(self): mock_socket.reply_with(b"220 Hola mundo") # connects, include port in host name - smtp = smtplib.SMTP("%s:%s" % (HOST, self.port)) - smtp.close() + client = self.client("%s:%s" % (HOST, self.port)) + client.close() def testLocalHostName(self): mock_socket.reply_with(b"220 Hola mundo") # check that supplied local_hostname is used - smtp = smtplib.SMTP(HOST, self.port, local_hostname="testhost") - self.assertEqual(smtp.local_hostname, "testhost") - smtp.close() + client = self.client(HOST, self.port, local_hostname="testhost") + self.assertEqual(client.local_hostname, "testhost") + client.close() def testTimeoutDefault(self): mock_socket.reply_with(b"220 Hola mundo") @@ -105,51 +106,82 @@ def testTimeoutDefault(self): mock_socket.setdefaulttimeout(30) self.assertEqual(mock_socket.getdefaulttimeout(), 30) try: - smtp = smtplib.SMTP(HOST, self.port) + client = self.client(HOST, self.port) finally: mock_socket.setdefaulttimeout(None) - self.assertEqual(smtp.sock.gettimeout(), 30) - smtp.close() + self.assertEqual(client.sock.gettimeout(), 30) + client.close() def testTimeoutNone(self): mock_socket.reply_with(b"220 Hola mundo") self.assertIsNone(socket.getdefaulttimeout()) socket.setdefaulttimeout(30) try: - smtp = smtplib.SMTP(HOST, self.port, timeout=None) + client = self.client(HOST, self.port, timeout=None) finally: socket.setdefaulttimeout(None) - self.assertIsNone(smtp.sock.gettimeout()) - smtp.close() + self.assertIsNone(client.sock.gettimeout()) + client.close() + + def testTimeoutZero(self): + mock_socket.reply_with(b"220 Hola mundo") + with self.assertRaises(ValueError): + self.client(HOST, self.port, timeout=0) def testTimeoutValue(self): mock_socket.reply_with(b"220 Hola mundo") - smtp = smtplib.SMTP(HOST, self.port, timeout=30) - self.assertEqual(smtp.sock.gettimeout(), 30) - smtp.close() + client = self.client(HOST, self.port, timeout=30) + self.assertEqual(client.sock.gettimeout(), 30) + client.close() def test_debuglevel(self): mock_socket.reply_with(b"220 Hello world") - smtp = smtplib.SMTP() - smtp.set_debuglevel(1) + client = self.client() + client.set_debuglevel(1) with support.captured_stderr() as stderr: - smtp.connect(HOST, self.port) - smtp.close() + client.connect(HOST, self.port) + client.close() expected = re.compile(r"^connect:", re.MULTILINE) self.assertRegex(stderr.getvalue(), expected) def test_debuglevel_2(self): mock_socket.reply_with(b"220 Hello world") - smtp = smtplib.SMTP() - smtp.set_debuglevel(2) + client = self.client() + client.set_debuglevel(2) with support.captured_stderr() as stderr: - smtp.connect(HOST, self.port) - smtp.close() + client.connect(HOST, self.port) + client.close() expected = re.compile(r"^\d{2}:\d{2}:\d{2}\.\d{6} connect: ", re.MULTILINE) self.assertRegex(stderr.getvalue(), expected) +class SMTPGeneralTests(GeneralTests, unittest.TestCase): + + client = smtplib.SMTP + + +class LMTPGeneralTests(GeneralTests, unittest.TestCase): + + client = smtplib.LMTP + + @unittest.skipUnless(hasattr(socket, 'AF_UNIX'), "test requires Unix domain socket") + def testUnixDomainSocketTimeoutDefault(self): + local_host = '/some/local/lmtp/delivery/program' + mock_socket.reply_with(b"220 Hello world") + try: + client = self.client(local_host, self.port) + finally: + mock_socket.setdefaulttimeout(None) + self.assertIsNone(client.sock.gettimeout()) + client.close() + + def testTimeoutZero(self): + super().testTimeoutZero() + local_host = '/some/local/lmtp/delivery/program' + with self.assertRaises(ValueError): + self.client(local_host, timeout=0) + # Test server thread using the specified SMTP server class def debugging_server(serv, serv_evt, client_evt): serv_evt.set() @@ -245,15 +277,17 @@ def get_output_without_xpeer(self): def testBasic(self): # connect - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) smtp.quit() def testSourceAddress(self): # connect - src_port = support.find_unused_port() + src_port = socket_helper.find_unused_port() try: smtp = smtplib.SMTP(self.host, self.port, local_hostname='localhost', - timeout=3, source_address=(self.host, src_port)) + timeout=support.LOOPBACK_TIMEOUT, + source_address=(self.host, src_port)) self.addCleanup(smtp.close) self.assertEqual(smtp.source_address, (self.host, src_port)) self.assertEqual(smtp.local_hostname, 'localhost') @@ -264,14 +298,16 @@ def testSourceAddress(self): raise def testNOOP(self): - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) expected = (250, b'OK') self.assertEqual(smtp.noop(), expected) smtp.quit() def testRSET(self): - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) expected = (250, b'OK') self.assertEqual(smtp.rset(), expected) @@ -279,7 +315,8 @@ def testRSET(self): def testELHO(self): # EHLO isn't implemented in DebuggingServer - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) expected = (250, b'\nSIZE 33554432\nHELP') self.assertEqual(smtp.ehlo(), expected) @@ -287,7 +324,8 @@ def testELHO(self): def testEXPNNotImplemented(self): # EXPN isn't implemented in DebuggingServer - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) expected = (502, b'EXPN not implemented') smtp.putcmd('EXPN') @@ -295,7 +333,8 @@ def testEXPNNotImplemented(self): smtp.quit() def testVRFY(self): - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) expected = (252, b'Cannot VRFY user, but will accept message ' + \ b'and attempt delivery') @@ -306,7 +345,8 @@ def testVRFY(self): def testSecondHELO(self): # check that a second HELO returns a message that it's a duplicate # (this behavior is specific to smtpd.SMTPChannel) - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.helo() expected = (503, b'Duplicate HELO/EHLO') @@ -314,7 +354,8 @@ def testSecondHELO(self): smtp.quit() def testHELP(self): - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) self.assertEqual(smtp.help(), b'Supported commands: EHLO HELO MAIL ' + \ b'RCPT DATA RSET NOOP QUIT VRFY') @@ -323,7 +364,8 @@ def testHELP(self): def testSend(self): # connect and send mail m = 'A test message' - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.sendmail('John', 'Sally', m) # XXX(nnorwitz): this test is flaky and dies with a bad file descriptor @@ -340,7 +382,8 @@ def testSend(self): def testSendBinary(self): m = b'A test message' - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.sendmail('John', 'Sally', m) # XXX (see comment in testSend) @@ -356,7 +399,8 @@ def testSendBinary(self): def testSendNeedingDotQuote(self): # Issue 12283 m = '.A test\n.mes.sage.' - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.sendmail('John', 'Sally', m) # XXX (see comment in testSend) @@ -371,7 +415,8 @@ def testSendNeedingDotQuote(self): def testSendNullSender(self): m = 'A test message' - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.sendmail('<>', 'Sally', m) # XXX (see comment in testSend) @@ -389,7 +434,8 @@ def testSendNullSender(self): def testSendMessage(self): m = email.mime.text.MIMEText('A test message') - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.send_message(m, from_addr='John', to_addrs='Sally') # XXX (see comment in testSend) @@ -414,7 +460,8 @@ def testSendMessageWithAddresses(self): m['To'] = 'John' m['CC'] = 'Sally, Fred' m['Bcc'] = 'John Root , "Dinsdale" ' - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.send_message(m) # XXX (see comment in testSend) @@ -448,7 +495,8 @@ def testSendMessageWithSomeAddresses(self): m = email.mime.text.MIMEText('A test message') m['From'] = 'foo@bar.com' m['To'] = 'John, Dinsdale' - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.send_message(m) # XXX (see comment in testSend) @@ -476,7 +524,8 @@ def testSendMessageWithSpecifiedAddresses(self): m = email.mime.text.MIMEText('A test message') m['From'] = 'foo@bar.com' m['To'] = 'John, Dinsdale' - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.send_message(m, from_addr='joe@example.com', to_addrs='foo@example.net') # XXX (see comment in testSend) @@ -507,7 +556,8 @@ def testSendMessageWithMultipleFrom(self): m['From'] = 'Bernard, Bianca' m['Sender'] = 'the_rescuers@Rescue-Aid-Society.com' m['To'] = 'John, Dinsdale' - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.send_message(m) # XXX (see comment in testSend) @@ -540,7 +590,8 @@ def testSendMessageResent(self): m['Resent-From'] = 'holy@grail.net' m['Resent-To'] = 'Martha , Jeff' m['Resent-Bcc'] = 'doe@losthope.net' - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.send_message(m) # XXX (see comment in testSend) @@ -579,7 +630,8 @@ def testSendMessageMultipleResentRaises(self): m['Resent-Date'] = 'Thu, 2 Jan 1970 17:42:00 +0000' m['Resent-To'] = 'holy@grail.net' m['Resent-From'] = 'Martha , Jeff' - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=3) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) with self.assertRaises(ValueError): smtp.send_message(m) @@ -671,7 +723,7 @@ def setUp(self): self.evt = threading.Event() self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.settimeout(15) - self.port = support.bind_port(self.sock) + self.port = socket_helper.bind_port(self.sock) servargs = (self.evt, self.respdata, self.sock) self.thread = threading.Thread(target=server, args=servargs) self.thread.start() @@ -944,11 +996,13 @@ def tearDown(self): def testBasic(self): # smoke test - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) smtp.quit() def testEHLO(self): - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) # no features should be present before the EHLO self.assertEqual(smtp.esmtp_features, {}) @@ -969,7 +1023,8 @@ def testEHLO(self): smtp.quit() def testVRFY(self): - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) for addr_spec, name in sim_users.items(): expected_known = (250, bytes('%s %s' % @@ -983,7 +1038,8 @@ def testVRFY(self): smtp.quit() def testEXPN(self): - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) for listname, members in sim_lists.items(): users = [] @@ -999,30 +1055,35 @@ def testEXPN(self): def testAUTH_PLAIN(self): self.serv.add_feature("AUTH PLAIN") - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) resp = smtp.login(sim_auth[0], sim_auth[1]) self.assertEqual(resp, (235, b'Authentication Succeeded')) smtp.close() def testAUTH_LOGIN(self): self.serv.add_feature("AUTH LOGIN") - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) resp = smtp.login(sim_auth[0], sim_auth[1]) self.assertEqual(resp, (235, b'Authentication Succeeded')) smtp.close() - @requires_hashdigest('md5') + @hashlib_helper.requires_hashdigest('md5') def testAUTH_CRAM_MD5(self): self.serv.add_feature("AUTH CRAM-MD5") - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) resp = smtp.login(sim_auth[0], sim_auth[1]) self.assertEqual(resp, (235, b'Authentication Succeeded')) smtp.close() + @hashlib_helper.requires_hashdigest('md5') def testAUTH_multiple(self): # Test that multiple authentication methods are tried. self.serv.add_feature("AUTH BOGUS PLAIN LOGIN CRAM-MD5") - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) resp = smtp.login(sim_auth[0], sim_auth[1]) self.assertEqual(resp, (235, b'Authentication Succeeded')) smtp.close() @@ -1040,7 +1101,8 @@ def test_auth_function(self): for mechanism in supported: with self.subTest(mechanism=mechanism): smtp = smtplib.SMTP(HOST, self.port, - local_hostname='localhost', timeout=15) + local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) smtp.ehlo('foo') smtp.user, smtp.password = sim_auth[0], sim_auth[1] method = 'auth_' + mechanism.lower().replace('-', '_') @@ -1051,7 +1113,7 @@ def test_auth_function(self): def test_quit_resets_greeting(self): smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', - timeout=15) + timeout=support.LOOPBACK_TIMEOUT) code, message = smtp.ehlo() self.assertEqual(code, 250) self.assertIn('size', smtp.esmtp_features) @@ -1085,7 +1147,8 @@ def test_with_statement_QUIT_failure(self): # Issue 17498: make sure _rset does not raise SMTPServerDisconnected exception def test__rest_from_mail_cmd(self): - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) smtp.noop() self.serv._SMTPchannel.mail_response = '451 Requested action aborted' self.serv._SMTPchannel.disconnect = True @@ -1095,7 +1158,8 @@ def test__rest_from_mail_cmd(self): # Issue 5713: make sure close, not rset, is called if we get a 421 error def test_421_from_mail_cmd(self): - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) smtp.noop() self.serv._SMTPchannel.mail_response = '421 closing connection' with self.assertRaises(smtplib.SMTPSenderRefused): @@ -1104,7 +1168,8 @@ def test_421_from_mail_cmd(self): self.assertEqual(self.serv._SMTPchannel.rset_count, 0) def test_421_from_rcpt_cmd(self): - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) smtp.noop() self.serv._SMTPchannel.rcpt_response = ['250 accepted', '421 closing'] with self.assertRaises(smtplib.SMTPRecipientsRefused) as r: @@ -1121,7 +1186,8 @@ def found_terminator(self): else: super().found_terminator() self.serv.channel_class = MySimSMTPChannel - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) smtp.noop() with self.assertRaises(smtplib.SMTPDataError): smtp.sendmail('John@foo.org', ['Sally@foo.org'], 'test message') @@ -1130,7 +1196,8 @@ def found_terminator(self): def test_smtputf8_NotSupportedError_if_no_server_support(self): smtp = smtplib.SMTP( - HOST, self.port, local_hostname='localhost', timeout=3) + HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.ehlo() self.assertTrue(smtp.does_esmtp) @@ -1145,7 +1212,8 @@ def test_smtputf8_NotSupportedError_if_no_server_support(self): def test_send_unicode_without_SMTPUTF8(self): smtp = smtplib.SMTP( - HOST, self.port, local_hostname='localhost', timeout=3) + HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) self.assertRaises(UnicodeEncodeError, smtp.sendmail, 'Alice', 'Böb', '') self.assertRaises(UnicodeEncodeError, smtp.mail, 'Älice') @@ -1158,15 +1226,16 @@ def test_send_message_error_on_non_ascii_addrs_if_no_smtputf8(self): msg['To'] = 'Dinsdale' msg['Subject'] = 'Nudge nudge, wink, wink \u1F609' smtp = smtplib.SMTP( - HOST, self.port, local_hostname='localhost', timeout=3) + HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) with self.assertRaises(smtplib.SMTPNotSupportedError): smtp.send_message(msg) def test_name_field_not_included_in_envelop_addresses(self): smtp = smtplib.SMTP( - HOST, self.port, local_hostname='localhost', timeout=3 - ) + HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) message = EmailMessage() @@ -1242,7 +1311,8 @@ def tearDown(self): def test_test_server_supports_extensions(self): smtp = smtplib.SMTP( - HOST, self.port, local_hostname='localhost', timeout=3) + HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.ehlo() self.assertTrue(smtp.does_esmtp) @@ -1251,7 +1321,8 @@ def test_test_server_supports_extensions(self): def test_send_unicode_with_SMTPUTF8_via_sendmail(self): m = '¡a test message containing unicode!'.encode('utf-8') smtp = smtplib.SMTP( - HOST, self.port, local_hostname='localhost', timeout=3) + HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.sendmail('Jőhn', 'Sálly', m, mail_options=['BODY=8BITMIME', 'SMTPUTF8']) @@ -1265,7 +1336,8 @@ def test_send_unicode_with_SMTPUTF8_via_sendmail(self): def test_send_unicode_with_SMTPUTF8_via_low_level_API(self): m = '¡a test message containing unicode!'.encode('utf-8') smtp = smtplib.SMTP( - HOST, self.port, local_hostname='localhost', timeout=3) + HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) smtp.ehlo() self.assertEqual( @@ -1301,7 +1373,8 @@ def test_send_message_uses_smtputf8_if_addrs_non_ascii(self): oh là là, know what I mean, know what I mean? """) smtp = smtplib.SMTP( - HOST, self.port, local_hostname='localhost', timeout=3) + HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(smtp.close) self.assertEqual(smtp.send_message(msg), {}) self.assertEqual(self.serv.last_mailfrom, 'főo@bar.com') @@ -1366,15 +1439,15 @@ def tearDown(self): def testAUTH_PLAIN_initial_response_login(self): self.serv.add_feature('AUTH PLAIN') - smtp = smtplib.SMTP(HOST, self.port, - local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) smtp.login('psu', 'doesnotexist') smtp.close() def testAUTH_PLAIN_initial_response_auth(self): self.serv.add_feature('AUTH PLAIN') - smtp = smtplib.SMTP(HOST, self.port, - local_hostname='localhost', timeout=15) + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', + timeout=support.LOOPBACK_TIMEOUT) smtp.user = 'psu' smtp.password = 'doesnotexist' code, response = smtp.auth('plain', smtp.auth_plain) diff --git a/Lib/test/test_smtpnet.py b/Lib/test/test_smtpnet.py index b69cd9de62724aed1b4457a1f48c605af9c659d6..74a00a9d7cc58395d68195a611e46d8d8e75cb3d 100644 --- a/Lib/test/test_smtpnet.py +++ b/Lib/test/test_smtpnet.py @@ -1,5 +1,6 @@ import unittest from test import support +from test.support import socket_helper import smtplib import socket @@ -28,7 +29,7 @@ def test_connect_starttls(self): context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) context.check_hostname = False context.verify_mode = ssl.CERT_NONE - with support.transient_internet(self.testServer): + with socket_helper.transient_internet(self.testServer): server = smtplib.SMTP(self.testServer, self.remotePort) try: server.starttls(context=context) @@ -47,14 +48,14 @@ class SmtpSSLTest(unittest.TestCase): def test_connect(self): support.get_attribute(smtplib, 'SMTP_SSL') - with support.transient_internet(self.testServer): + with socket_helper.transient_internet(self.testServer): server = smtplib.SMTP_SSL(self.testServer, self.remotePort) server.ehlo() server.quit() def test_connect_default_port(self): support.get_attribute(smtplib, 'SMTP_SSL') - with support.transient_internet(self.testServer): + with socket_helper.transient_internet(self.testServer): server = smtplib.SMTP_SSL(self.testServer) server.ehlo() server.quit() @@ -64,20 +65,20 @@ def test_connect_using_sslcontext(self): context.check_hostname = False context.verify_mode = ssl.CERT_NONE support.get_attribute(smtplib, 'SMTP_SSL') - with support.transient_internet(self.testServer): + with socket_helper.transient_internet(self.testServer): server = smtplib.SMTP_SSL(self.testServer, self.remotePort, context=context) server.ehlo() server.quit() def test_connect_using_sslcontext_verified(self): - with support.transient_internet(self.testServer): + with socket_helper.transient_internet(self.testServer): can_verify = check_ssl_verifiy(self.testServer, self.remotePort) if not can_verify: self.skipTest("SSL certificate can't be verified") support.get_attribute(smtplib, 'SMTP_SSL') context = ssl.create_default_context() - with support.transient_internet(self.testServer): + with socket_helper.transient_internet(self.testServer): server = smtplib.SMTP_SSL(self.testServer, self.remotePort, context=context) server.ehlo() server.quit() diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index f9370d8e52dca17faa1b275f6e24e855c3ff581d..aefba4f397b10675ef6867858c88fc04035ce973 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -1,5 +1,6 @@ import unittest from test import support +from test.support import socket_helper import errno import io @@ -34,10 +35,9 @@ except ImportError: fcntl = None -HOST = support.HOST +HOST = socket_helper.HOST # test unicode string and carriage return MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') -MAIN_TIMEOUT = 60.0 VSOCKPORT = 1234 AIX = platform.system() == "AIX" @@ -80,6 +80,16 @@ def _have_socket_can_isotp(): s.close() return True +def _have_socket_can_j1939(): + """Check whether CAN J1939 sockets are supported on this host.""" + try: + s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) + except (AttributeError, OSError): + return False + else: + s.close() + return True + def _have_socket_rds(): """Check whether RDS sockets are supported on this host.""" try: @@ -116,6 +126,19 @@ def _have_socket_vsock(): return ret +def _have_socket_bluetooth(): + """Check whether AF_BLUETOOTH sockets are supported on this host.""" + try: + # RFCOMM is supported by all platforms with bluetooth support. Windows + # does not support omitting the protocol. + s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) + except (AttributeError, OSError): + return False + else: + s.close() + return True + + @contextlib.contextmanager def socket_setdefaulttimeout(timeout): old_timeout = socket.getdefaulttimeout() @@ -130,6 +153,8 @@ def socket_setdefaulttimeout(timeout): HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp() +HAVE_SOCKET_CAN_J1939 = _have_socket_can_j1939() + HAVE_SOCKET_RDS = _have_socket_rds() HAVE_SOCKET_ALG = _have_socket_alg() @@ -138,6 +163,10 @@ def socket_setdefaulttimeout(timeout): HAVE_SOCKET_VSOCK = _have_socket_vsock() +HAVE_SOCKET_UDPLITE = hasattr(socket, "IPPROTO_UDPLITE") + +HAVE_SOCKET_BLUETOOTH = _have_socket_bluetooth() + # Size in bytes of the int type SIZEOF_INT = array.array("i").itemsize @@ -145,7 +174,7 @@ class SocketTCPTest(unittest.TestCase): def setUp(self): self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.port = support.bind_port(self.serv) + self.port = socket_helper.bind_port(self.serv) self.serv.listen() def tearDown(self): @@ -156,12 +185,18 @@ class SocketUDPTest(unittest.TestCase): def setUp(self): self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - self.port = support.bind_port(self.serv) + self.port = socket_helper.bind_port(self.serv) def tearDown(self): self.serv.close() self.serv = None +class SocketUDPLITETest(SocketUDPTest): + + def setUp(self): + self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE) + self.port = socket_helper.bind_port(self.serv) + class ThreadSafeCleanupTestCase(unittest.TestCase): """Subclass of unittest.TestCase with thread-safe cleanup methods. @@ -243,7 +278,7 @@ def setUp(self): self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) self.addCleanup(self.serv.close) try: - self.port = support.bind_port(self.serv) + self.port = socket_helper.bind_port(self.serv) except OSError: self.skipTest('unable to bind RDS socket') @@ -393,6 +428,22 @@ def clientTearDown(self): self.cli = None ThreadableTest.clientTearDown(self) +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +class ThreadedUDPLITESocketTest(SocketUDPLITETest, ThreadableTest): + + def __init__(self, methodName='runTest'): + SocketUDPLITETest.__init__(self, methodName=methodName) + ThreadableTest.__init__(self) + + def clientSetUp(self): + self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE) + + def clientTearDown(self): + self.cli.close() + self.cli = None + ThreadableTest.clientTearDown(self) + class ThreadedCANSocketTest(SocketCANTest, ThreadableTest): def __init__(self, methodName='runTest'): @@ -644,7 +695,7 @@ def setUp(self): def bindSock(self, sock): path = tempfile.mktemp(dir=self.dir_path) - support.bind_unix_socket(sock, path) + socket_helper.bind_unix_socket(sock, path) self.addCleanup(support.unlink, path) class UnixStreamBase(UnixSocketTestBase): @@ -664,7 +715,7 @@ def setUp(self): self.port = self.serv_addr[1] def bindSock(self, sock): - support.bind_port(sock, host=self.host) + socket_helper.bind_port(sock, host=self.host) class TCPTestBase(InetTestBase): """Base class for TCP-over-IPv4 tests.""" @@ -678,6 +729,12 @@ class UDPTestBase(InetTestBase): def newSocket(self): return socket.socket(socket.AF_INET, socket.SOCK_DGRAM) +class UDPLITETestBase(InetTestBase): + """Base class for UDPLITE-over-IPv4 tests.""" + + def newSocket(self): + return socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE) + class SCTPStreamBase(InetTestBase): """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode.""" @@ -689,7 +746,7 @@ def newSocket(self): class Inet6TestBase(InetTestBase): """Base class for IPv6 socket tests.""" - host = support.HOSTv6 + host = socket_helper.HOSTv6 class UDP6TestBase(Inet6TestBase): """Base class for UDP-over-IPv6 tests.""" @@ -697,6 +754,12 @@ class UDP6TestBase(Inet6TestBase): def newSocket(self): return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) +class UDPLITE6TestBase(Inet6TestBase): + """Base class for UDPLITE-over-IPv6 tests.""" + + def newSocket(self): + return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE) + # Test-skipping decorators for use with ThreadableTest. @@ -896,6 +959,37 @@ def testWindowsSpecificConstants(self): socket.IPPROTO_L2TP socket.IPPROTO_SCTP + @unittest.skipUnless(sys.platform == 'darwin', 'macOS specific test') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test') + def test3542SocketOptions(self): + # Ref. issue #35569 and https://tools.ietf.org/html/rfc3542 + opts = { + 'IPV6_CHECKSUM', + 'IPV6_DONTFRAG', + 'IPV6_DSTOPTS', + 'IPV6_HOPLIMIT', + 'IPV6_HOPOPTS', + 'IPV6_NEXTHOP', + 'IPV6_PATHMTU', + 'IPV6_PKTINFO', + 'IPV6_RECVDSTOPTS', + 'IPV6_RECVHOPLIMIT', + 'IPV6_RECVHOPOPTS', + 'IPV6_RECVPATHMTU', + 'IPV6_RECVPKTINFO', + 'IPV6_RECVRTHDR', + 'IPV6_RECVTCLASS', + 'IPV6_RTHDR', + 'IPV6_RTHDRDSTOPTS', + 'IPV6_RTHDR_TYPE_0', + 'IPV6_TCLASS', + 'IPV6_USE_MIN_MTU', + } + for opt in opts: + self.assertTrue( + hasattr(socket, opt), f"Missing RFC3542 socket option '{opt}'" + ) + def testHostnameRes(self): # Testing hostname resolution mechanisms hostname = socket.gethostname() @@ -916,12 +1010,12 @@ def testHostnameRes(self): self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names))) def test_host_resolution(self): - for addr in [support.HOSTv4, '10.0.0.1', '255.255.255.255']: + for addr in [socket_helper.HOSTv4, '10.0.0.1', '255.255.255.255']: self.assertEqual(socket.gethostbyname(addr), addr) - # we don't test support.HOSTv6 because there's a chance it doesn't have + # we don't test socket_helper.HOSTv6 because there's a chance it doesn't have # a matching name entry (e.g. 'ip6-localhost') - for host in [support.HOSTv4]: + for host in [socket_helper.HOSTv4]: self.assertIn(host, socket.gethostbyaddr(host)[2]) def test_host_resolution_bad_address(self): @@ -1284,7 +1378,7 @@ def testStringToIPv6(self): def testSockName(self): # Testing getsockname() - port = support.find_unused_port() + port = socket_helper.find_unused_port() sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.addCleanup(sock.close) sock.bind(("0.0.0.0", port)) @@ -1350,7 +1444,7 @@ def testNewAttributes(self): def test_getsockaddrarg(self): sock = socket.socket() self.addCleanup(sock.close) - port = support.find_unused_port() + port = socket_helper.find_unused_port() big_port = port + 65536 neg_port = port - 65536 self.assertRaises(OverflowError, sock.bind, (HOST, big_port)) @@ -1358,7 +1452,7 @@ def test_getsockaddrarg(self): # Since find_unused_port() is inherently subject to race conditions, we # call it a couple times if necessary. for i in itertools.count(): - port = support.find_unused_port() + port = socket_helper.find_unused_port() try: sock.bind((HOST, port)) except OSError as e: @@ -1411,7 +1505,7 @@ def testGetaddrinfo(self): socket.getaddrinfo('localhost', 80) socket.getaddrinfo('127.0.0.1', 80) socket.getaddrinfo(None, 80) - if support.IPV6_ENABLED: + if socket_helper.IPV6_ENABLED: socket.getaddrinfo('::1', 80) # port can be a string service name such as "http", a numeric # port number or None @@ -1482,7 +1576,7 @@ def test_getnameinfo(self): def test_idna(self): # Check for internet access before running test # (issue #12804, issue #25138). - with support.transient_internet('python.org'): + with socket_helper.transient_internet('python.org'): socket.gethostbyname('python.org') # these should all be successful @@ -1624,14 +1718,14 @@ def test_listen_backlog_overflow(self): srv.bind((HOST, 0)) self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1) - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') def test_flowinfo(self): self.assertRaises(OverflowError, socket.getnameinfo, - (support.HOSTv6, 0, 0xffffffff), 0) + (socket_helper.HOSTv6, 0, 0xffffffff), 0) with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s: - self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10)) + self.assertRaises(OverflowError, s.bind, (socket_helper.HOSTv6, 0, -10)) - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') def test_getaddrinfo_ipv6_basic(self): ((*_, sockaddr),) = socket.getaddrinfo( 'ff02::1de:c0:face:8D', # Note capital letter `D`. @@ -1641,7 +1735,7 @@ def test_getaddrinfo_ipv6_basic(self): ) self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0)) - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows') @unittest.skipIf(AIX, 'Symbolic scope id does not work') def test_getaddrinfo_ipv6_scopeid_symbolic(self): @@ -1656,7 +1750,7 @@ def test_getaddrinfo_ipv6_scopeid_symbolic(self): # Note missing interface name part in IPv6 address self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex)) - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') @unittest.skipUnless( sys.platform == 'win32', 'Numeric scope id does not work or undocumented') @@ -1673,7 +1767,7 @@ def test_getaddrinfo_ipv6_scopeid_numeric(self): # Note missing interface name part in IPv6 address self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex)) - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows') @unittest.skipIf(AIX, 'Symbolic scope id does not work') def test_getnameinfo_ipv6_scopeid_symbolic(self): @@ -1683,7 +1777,7 @@ def test_getnameinfo_ipv6_scopeid_symbolic(self): nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV) self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234')) - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') @unittest.skipUnless( sys.platform == 'win32', 'Numeric scope id does not work or undocumented') def test_getnameinfo_ipv6_scopeid_numeric(self): @@ -1776,19 +1870,19 @@ def _test_socket_fileno(self, s, family, stype): def test_socket_fileno(self): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.addCleanup(s.close) - s.bind((support.HOST, 0)) + s.bind((socket_helper.HOST, 0)) self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM) if hasattr(socket, "SOCK_DGRAM"): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.addCleanup(s.close) - s.bind((support.HOST, 0)) + s.bind((socket_helper.HOST, 0)) self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM) - if support.IPV6_ENABLED: + if socket_helper.IPV6_ENABLED: s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) self.addCleanup(s.close) - s.bind((support.HOSTv6, 0, 0, 0)) + s.bind((socket_helper.HOSTv6, 0, 0, 0)) self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM) if hasattr(socket, "AF_UNIX"): @@ -2066,6 +2160,68 @@ def testBind(self): raise +@unittest.skipUnless(HAVE_SOCKET_CAN_J1939, 'CAN J1939 required for this test.') +class J1939Test(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.interface = "vcan0" + + @unittest.skipUnless(hasattr(socket, "CAN_J1939"), + 'socket.CAN_J1939 required for this test.') + def testJ1939Constants(self): + socket.CAN_J1939 + + socket.J1939_MAX_UNICAST_ADDR + socket.J1939_IDLE_ADDR + socket.J1939_NO_ADDR + socket.J1939_NO_NAME + socket.J1939_PGN_REQUEST + socket.J1939_PGN_ADDRESS_CLAIMED + socket.J1939_PGN_ADDRESS_COMMANDED + socket.J1939_PGN_PDU1_MAX + socket.J1939_PGN_MAX + socket.J1939_NO_PGN + + # J1939 socket options + socket.SO_J1939_FILTER + socket.SO_J1939_PROMISC + socket.SO_J1939_SEND_PRIO + socket.SO_J1939_ERRQUEUE + + socket.SCM_J1939_DEST_ADDR + socket.SCM_J1939_DEST_NAME + socket.SCM_J1939_PRIO + socket.SCM_J1939_ERRQUEUE + + socket.J1939_NLA_PAD + socket.J1939_NLA_BYTES_ACKED + + socket.J1939_EE_INFO_NONE + socket.J1939_EE_INFO_TX_ABORT + + socket.J1939_FILTER_MAX + + @unittest.skipUnless(hasattr(socket, "CAN_J1939"), + 'socket.CAN_J1939 required for this test.') + def testCreateJ1939Socket(self): + with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s: + pass + + def testBind(self): + try: + with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s: + addr = self.interface, socket.J1939_NO_NAME, socket.J1939_NO_PGN, socket.J1939_NO_ADDR + s.bind(addr) + self.assertEqual(s.getsockname(), addr) + except OSError as e: + if e.errno == errno.ENODEV: + self.skipTest('network interface `%s` does not exist' % + self.interface) + else: + raise + + @unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.') class BasicRDSTest(unittest.TestCase): @@ -2164,12 +2320,12 @@ def testUnbound(self): def testBindSock(self): with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s: - support.bind_port(s, host=s.getsockname()[0]) + socket_helper.bind_port(s, host=s.getsockname()[0]) self.assertNotEqual(s.getsockname()[1], 0) def testInvalidBindSock(self): with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s: - self.assertRaises(OSError, support.bind_port, s, host=-2) + self.assertRaises(OSError, socket_helper.bind_port, s, host=-2) def testAutoBindSock(self): with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s: @@ -2225,6 +2381,45 @@ def testSocketBufferSize(self): socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)) +@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH, + 'Bluetooth sockets required for this test.') +class BasicBluetoothTest(unittest.TestCase): + + def testBluetoothConstants(self): + socket.BDADDR_ANY + socket.BDADDR_LOCAL + socket.AF_BLUETOOTH + socket.BTPROTO_RFCOMM + + if sys.platform != "win32": + socket.BTPROTO_HCI + socket.SOL_HCI + socket.BTPROTO_L2CAP + + if not sys.platform.startswith("freebsd"): + socket.BTPROTO_SCO + + def testCreateRfcommSocket(self): + with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) as s: + pass + + @unittest.skipIf(sys.platform == "win32", "windows does not support L2CAP sockets") + def testCreateL2capSocket(self): + with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as s: + pass + + @unittest.skipIf(sys.platform == "win32", "windows does not support HCI sockets") + def testCreateHciSocket(self): + with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI) as s: + pass + + @unittest.skipIf(sys.platform == "win32" or sys.platform.startswith("freebsd"), + "windows and freebsd do not support SCO sockets") + def testCreateScoSocket(self): + with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_SCO) as s: + pass + + class BasicTCPTest(SocketConnectedTest): def __init__(self, methodName='runTest'): @@ -2376,6 +2571,37 @@ def testRecvFromNegative(self): def _testRecvFromNegative(self): self.cli.sendto(MSG, 0, (HOST, self.port)) + +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +class BasicUDPLITETest(ThreadedUDPLITESocketTest): + + def __init__(self, methodName='runTest'): + ThreadedUDPLITESocketTest.__init__(self, methodName=methodName) + + def testSendtoAndRecv(self): + # Testing sendto() and Recv() over UDPLITE + msg = self.serv.recv(len(MSG)) + self.assertEqual(msg, MSG) + + def _testSendtoAndRecv(self): + self.cli.sendto(MSG, 0, (HOST, self.port)) + + def testRecvFrom(self): + # Testing recvfrom() over UDPLITE + msg, addr = self.serv.recvfrom(len(MSG)) + self.assertEqual(msg, MSG) + + def _testRecvFrom(self): + self.cli.sendto(MSG, 0, (HOST, self.port)) + + def testRecvFromNegative(self): + # Negative lengths passed to recvfrom should give ValueError. + self.assertRaises(ValueError, self.serv.recvfrom, -1) + + def _testRecvFromNegative(self): + self.cli.sendto(MSG, 0, (HOST, self.port)) + # Tests for the sendmsg()/recvmsg() interface. Where possible, the # same test code is used with different families and types of socket # (e.g. stream, datagram), and tests using recvmsg() are repeated @@ -2408,7 +2634,7 @@ class SendrecvmsgBase(ThreadSafeCleanupTestCase): # Time in seconds to wait before considering a test failed, or # None for no timeout. Not all tests actually set a timeout. - fail_timeout = 3.0 + fail_timeout = support.LOOPBACK_TIMEOUT def setUp(self): self.misc_event = threading.Event() @@ -3974,25 +4200,25 @@ def checkRecvmsgAddress(self, addr1, addr2): self.assertEqual(addr1[:-1], addr2[:-1]) @requireAttrs(socket.socket, "sendmsg") -@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') @requireSocket("AF_INET6", "SOCK_DGRAM") class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase): pass @requireAttrs(socket.socket, "recvmsg") -@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') @requireSocket("AF_INET6", "SOCK_DGRAM") class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase): pass @requireAttrs(socket.socket, "recvmsg_into") -@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') @requireSocket("AF_INET6", "SOCK_DGRAM") class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase): pass @requireAttrs(socket.socket, "recvmsg") -@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') @requireAttrs(socket, "IPPROTO_IPV6") @requireSocket("AF_INET6", "SOCK_DGRAM") class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest, @@ -4000,7 +4226,7 @@ class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest, pass @requireAttrs(socket.socket, "recvmsg_into") -@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.') +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') @requireAttrs(socket, "IPPROTO_IPV6") @requireSocket("AF_INET6", "SOCK_DGRAM") class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin, @@ -4009,6 +4235,89 @@ class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin, pass +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +class SendrecvmsgUDPLITETestBase(SendrecvmsgDgramFlagsBase, + SendrecvmsgConnectionlessBase, + ThreadedSocketTestMixin, UDPLITETestBase): + pass + +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +@requireAttrs(socket.socket, "sendmsg") +class SendmsgUDPLITETest(SendmsgConnectionlessTests, SendrecvmsgUDPLITETestBase): + pass + +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +@requireAttrs(socket.socket, "recvmsg") +class RecvmsgUDPLITETest(RecvmsgTests, SendrecvmsgUDPLITETestBase): + pass + +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +@requireAttrs(socket.socket, "recvmsg_into") +class RecvmsgIntoUDPLITETest(RecvmsgIntoTests, SendrecvmsgUDPLITETestBase): + pass + + +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +class SendrecvmsgUDPLITE6TestBase(SendrecvmsgDgramFlagsBase, + SendrecvmsgConnectionlessBase, + ThreadedSocketTestMixin, UDPLITE6TestBase): + + def checkRecvmsgAddress(self, addr1, addr2): + # Called to compare the received address with the address of + # the peer, ignoring scope ID + self.assertEqual(addr1[:-1], addr2[:-1]) + +@requireAttrs(socket.socket, "sendmsg") +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +@requireSocket("AF_INET6", "SOCK_DGRAM") +class SendmsgUDPLITE6Test(SendmsgConnectionlessTests, SendrecvmsgUDPLITE6TestBase): + pass + +@requireAttrs(socket.socket, "recvmsg") +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +@requireSocket("AF_INET6", "SOCK_DGRAM") +class RecvmsgUDPLITE6Test(RecvmsgTests, SendrecvmsgUDPLITE6TestBase): + pass + +@requireAttrs(socket.socket, "recvmsg_into") +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +@requireSocket("AF_INET6", "SOCK_DGRAM") +class RecvmsgIntoUDPLITE6Test(RecvmsgIntoTests, SendrecvmsgUDPLITE6TestBase): + pass + +@requireAttrs(socket.socket, "recvmsg") +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +@requireAttrs(socket, "IPPROTO_IPV6") +@requireSocket("AF_INET6", "SOCK_DGRAM") +class RecvmsgRFC3542AncillaryUDPLITE6Test(RFC3542AncillaryTest, + SendrecvmsgUDPLITE6TestBase): + pass + +@requireAttrs(socket.socket, "recvmsg_into") +@unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.') +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +@requireAttrs(socket, "IPPROTO_IPV6") +@requireSocket("AF_INET6", "SOCK_DGRAM") +class RecvmsgIntoRFC3542AncillaryUDPLITE6Test(RecvmsgIntoMixin, + RFC3542AncillaryTest, + SendrecvmsgUDPLITE6TestBase): + pass + + class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase, ConnectedStreamTestMixin, TCPTestBase): pass @@ -4118,7 +4427,7 @@ def setUp(self): self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler) # Timeout for socket operations - timeout = 4.0 + timeout = support.LOOPBACK_TIMEOUT # Provide setAlarm() method to schedule delivery of SIGALRM after # given number of seconds, or cancel it if zero, and an @@ -4397,7 +4706,7 @@ def _testInheritFlagsTimeout(self): def testAccept(self): # Testing non-blocking accept - self.serv.setblocking(0) + self.serv.setblocking(False) # connect() didn't start: non-blocking accept() fails start_time = time.monotonic() @@ -4408,7 +4717,7 @@ def testAccept(self): self.event.set() - read, write, err = select.select([self.serv], [], [], MAIN_TIMEOUT) + read, write, err = select.select([self.serv], [], [], support.LONG_TIMEOUT) if self.serv not in read: self.fail("Error trying to do accept after select.") @@ -4428,7 +4737,7 @@ def testRecv(self): # Testing non-blocking recv conn, addr = self.serv.accept() self.addCleanup(conn.close) - conn.setblocking(0) + conn.setblocking(False) # the server didn't send data yet: non-blocking recv() fails with self.assertRaises(BlockingIOError): @@ -4436,7 +4745,7 @@ def testRecv(self): self.event.set() - read, write, err = select.select([conn], [], [], MAIN_TIMEOUT) + read, write, err = select.select([conn], [], [], support.LONG_TIMEOUT) if conn not in read: self.fail("Error during select call to non-blocking socket.") @@ -4796,7 +5105,7 @@ def mocked_socket_module(self): socket.socket = old_socket def test_connect(self): - port = support.find_unused_port() + port = socket_helper.find_unused_port() cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.addCleanup(cli.close) with self.assertRaises(OSError) as cm: @@ -4806,7 +5115,7 @@ def test_connect(self): def test_create_connection(self): # Issue #9792: errors raised by create_connection() should have # a proper errno attribute. - port = support.find_unused_port() + port = socket_helper.find_unused_port() with self.assertRaises(OSError) as cm: socket.create_connection((HOST, port)) @@ -4824,7 +5133,7 @@ def test_create_connection(self): # On Solaris, ENETUNREACH is returned in this circumstance instead # of ECONNREFUSED. So, if that errno exists, add it to our list of # expected errnos. - expected_errnos = support.get_socket_conn_refused_errs() + expected_errnos = socket_helper.get_socket_conn_refused_errs() self.assertIn(cm.exception.errno, expected_errnos) def test_create_connection_timeout(self): @@ -4836,7 +5145,7 @@ def test_create_connection_timeout(self): except socket.timeout: pass except OSError as exc: - if support.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT: + if socket_helper.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT: raise else: self.fail('socket.timeout not raised') @@ -4849,7 +5158,7 @@ def __init__(self, methodName='runTest'): ThreadableTest.__init__(self) def clientSetUp(self): - self.source_port = support.find_unused_port() + self.source_port = socket_helper.find_unused_port() def clientTearDown(self): self.cli.close() @@ -4862,14 +5171,16 @@ def _justAccept(self): testFamily = _justAccept def _testFamily(self): - self.cli = socket.create_connection((HOST, self.port), timeout=30) + self.cli = socket.create_connection((HOST, self.port), + timeout=support.LOOPBACK_TIMEOUT) self.addCleanup(self.cli.close) self.assertEqual(self.cli.family, 2) testSourceAddress = _justAccept def _testSourceAddress(self): - self.cli = socket.create_connection((HOST, self.port), timeout=30, - source_address=('', self.source_port)) + self.cli = socket.create_connection((HOST, self.port), + timeout=support.LOOPBACK_TIMEOUT, + source_address=('', self.source_port)) self.addCleanup(self.cli.close) self.assertEqual(self.cli.getsockname()[1], self.source_port) # The port number being used is sufficient to show that the bind() @@ -5022,6 +5333,31 @@ def testTimeoutZero(self): if not ok: self.fail("recv() returned success when we did not expect it") +@unittest.skipUnless(HAVE_SOCKET_UDPLITE, + 'UDPLITE sockets required for this test.') +class UDPLITETimeoutTest(SocketUDPLITETest): + + def testUDPLITETimeout(self): + def raise_timeout(*args, **kwargs): + self.serv.settimeout(1.0) + self.serv.recv(1024) + self.assertRaises(socket.timeout, raise_timeout, + "Error generating a timeout exception (UDPLITE)") + + def testTimeoutZero(self): + ok = False + try: + self.serv.settimeout(0.0) + foo = self.serv.recv(1024) + except socket.timeout: + self.fail("caught timeout instead of error (UDPLITE)") + except OSError: + ok = True + except: + self.fail("caught unexpected exception (UDPLITE)") + if not ok: + self.fail("recv() returned success when we did not expect it") + class TestExceptions(unittest.TestCase): def testExceptionTree(self): @@ -5108,7 +5444,7 @@ def encoded(self, path): def bind(self, sock, path): # Bind the socket try: - support.bind_unix_socket(sock, path) + socket_helper.bind_unix_socket(sock, path) except OSError as e: if str(e) == "AF_UNIX path too long": self.skipTest( @@ -5473,15 +5809,15 @@ def test_SOCK_NONBLOCK(self): with socket.socket(socket.AF_INET, socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s: self.checkNonblock(s) - s.setblocking(1) + s.setblocking(True) self.checkNonblock(s, nonblock=False) - s.setblocking(0) + s.setblocking(False) self.checkNonblock(s) s.settimeout(None) self.checkNonblock(s, nonblock=False) s.settimeout(2.0) self.checkNonblock(s, timeout=2.0) - s.setblocking(1) + s.setblocking(True) self.checkNonblock(s, nonblock=False) # defaulttimeout t = socket.getdefaulttimeout() @@ -5611,7 +5947,7 @@ class SendfileUsingSendTest(ThreadedTCPSocketTest): FILESIZE = (10 * 1024 * 1024) # 10 MiB BUFSIZE = 8192 FILEDATA = b"" - TIMEOUT = 2 + TIMEOUT = support.LOOPBACK_TIMEOUT @classmethod def setUpClass(cls): @@ -5637,7 +5973,7 @@ def tearDownClass(cls): support.unlink(support.TESTFN) def accept_conn(self): - self.serv.settimeout(MAIN_TIMEOUT) + self.serv.settimeout(support.LONG_TIMEOUT) conn, addr = self.serv.accept() conn.settimeout(self.TIMEOUT) self.addCleanup(conn.close) @@ -5733,7 +6069,9 @@ def testOffset(self): def _testCount(self): address = self.serv.getsockname() file = open(support.TESTFN, 'rb') - with socket.create_connection(address, timeout=2) as sock, file as file: + sock = socket.create_connection(address, + timeout=support.LOOPBACK_TIMEOUT) + with sock, file: count = 5000007 meth = self.meth_from_sock(sock) sent = meth(file, count=count) @@ -5752,7 +6090,9 @@ def testCount(self): def _testCountSmall(self): address = self.serv.getsockname() file = open(support.TESTFN, 'rb') - with socket.create_connection(address, timeout=2) as sock, file as file: + sock = socket.create_connection(address, + timeout=support.LOOPBACK_TIMEOUT) + with sock, file: count = 1 meth = self.meth_from_sock(sock) sent = meth(file, count=count) @@ -5806,7 +6146,9 @@ def testNonBlocking(self): def _testWithTimeout(self): address = self.serv.getsockname() file = open(support.TESTFN, 'rb') - with socket.create_connection(address, timeout=2) as sock, file as file: + sock = socket.create_connection(address, + timeout=support.LOOPBACK_TIMEOUT) + with sock, file: meth = self.meth_from_sock(sock) sent = meth(file) self.assertEqual(sent, self.FILESIZE) @@ -6092,11 +6434,11 @@ def test_new_tcp_flags(self): class CreateServerTest(unittest.TestCase): def test_address(self): - port = support.find_unused_port() + port = socket_helper.find_unused_port() with socket.create_server(("127.0.0.1", port)) as sock: self.assertEqual(sock.getsockname()[0], "127.0.0.1") self.assertEqual(sock.getsockname()[1], port) - if support.IPV6_ENABLED: + if socket_helper.IPV6_ENABLED: with socket.create_server(("::1", port), family=socket.AF_INET6) as sock: self.assertEqual(sock.getsockname()[0], "::1") @@ -6106,7 +6448,7 @@ def test_family_and_type(self): with socket.create_server(("127.0.0.1", 0)) as sock: self.assertEqual(sock.family, socket.AF_INET) self.assertEqual(sock.type, socket.SOCK_STREAM) - if support.IPV6_ENABLED: + if socket_helper.IPV6_ENABLED: with socket.create_server(("::1", 0), family=socket.AF_INET6) as s: self.assertEqual(s.family, socket.AF_INET6) self.assertEqual(sock.type, socket.SOCK_STREAM) @@ -6126,14 +6468,14 @@ def test_reuse_port(self): @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or not hasattr(_socket, 'IPV6_V6ONLY'), "IPV6_V6ONLY option not supported") - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test') def test_ipv6_only_default(self): with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock: assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY) @unittest.skipIf(not socket.has_dualstack_ipv6(), "dualstack_ipv6 not supported") - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test') def test_dualstack_ipv6_family(self): with socket.create_server(("::1", 0), family=socket.AF_INET6, dualstack_ipv6=True) as sock: @@ -6141,7 +6483,7 @@ def test_dualstack_ipv6_family(self): class CreateServerFunctionalTest(unittest.TestCase): - timeout = 3 + timeout = support.LOOPBACK_TIMEOUT def setUp(self): self.thread = None @@ -6175,14 +6517,14 @@ def echo_client(self, addr, family): self.assertEqual(sock.recv(1024), b'foo') def test_tcp4(self): - port = support.find_unused_port() + port = socket_helper.find_unused_port() with socket.create_server(("", port)) as sock: self.echo_server(sock) self.echo_client(("127.0.0.1", port), socket.AF_INET) - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test') def test_tcp6(self): - port = support.find_unused_port() + port = socket_helper.find_unused_port() with socket.create_server(("", port), family=socket.AF_INET6) as sock: self.echo_server(sock) @@ -6192,9 +6534,9 @@ def test_tcp6(self): @unittest.skipIf(not socket.has_dualstack_ipv6(), "dualstack_ipv6 not supported") - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test') def test_dual_stack_client_v4(self): - port = support.find_unused_port() + port = socket_helper.find_unused_port() with socket.create_server(("", port), family=socket.AF_INET6, dualstack_ipv6=True) as sock: self.echo_server(sock) @@ -6202,19 +6544,61 @@ def test_dual_stack_client_v4(self): @unittest.skipIf(not socket.has_dualstack_ipv6(), "dualstack_ipv6 not supported") - @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test') def test_dual_stack_client_v6(self): - port = support.find_unused_port() + port = socket_helper.find_unused_port() with socket.create_server(("", port), family=socket.AF_INET6, dualstack_ipv6=True) as sock: self.echo_server(sock) self.echo_client(("::1", port), socket.AF_INET6) +@requireAttrs(socket, "send_fds") +@requireAttrs(socket, "recv_fds") +@requireAttrs(socket, "AF_UNIX") +class SendRecvFdsTests(unittest.TestCase): + def testSendAndRecvFds(self): + def close_pipes(pipes): + for fd1, fd2 in pipes: + os.close(fd1) + os.close(fd2) + + def close_fds(fds): + for fd in fds: + os.close(fd) + + # send 10 file descriptors + pipes = [os.pipe() for _ in range(10)] + self.addCleanup(close_pipes, pipes) + fds = [rfd for rfd, wfd in pipes] + + # use a UNIX socket pair to exchange file descriptors locally + sock1, sock2 = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM) + with sock1, sock2: + socket.send_fds(sock1, [MSG], fds) + # request more data and file descriptors than expected + msg, fds2, flags, addr = socket.recv_fds(sock2, len(MSG) * 2, len(fds) * 2) + self.addCleanup(close_fds, fds2) + + self.assertEqual(msg, MSG) + self.assertEqual(len(fds2), len(fds)) + self.assertEqual(flags, 0) + # don't test addr + + # test that file descriptors are connected + for index, fds in enumerate(pipes): + rfd, wfd = fds + os.write(wfd, str(index).encode()) + + for index, rfd in enumerate(fds2): + data = os.read(rfd, 100) + self.assertEqual(data, str(index).encode()) + def test_main(): tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest, TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, - UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest] + UDPTimeoutTest, CreateServerTest, CreateServerFunctionalTest, + SendRecvFdsTests] tests.extend([ NonBlockingTCPTests, @@ -6244,6 +6628,7 @@ def test_main(): BasicVSOCKTest, ThreadedVSOCKSocketStreamTest, ]) + tests.append(BasicBluetoothTest) tests.extend([ CmsgMacroTests, SendmsgUDPTest, @@ -6254,6 +6639,14 @@ def test_main(): RecvmsgRFC3542AncillaryUDP6Test, RecvmsgIntoRFC3542AncillaryUDP6Test, RecvmsgIntoUDP6Test, + SendmsgUDPLITETest, + RecvmsgUDPLITETest, + RecvmsgIntoUDPLITETest, + SendmsgUDPLITE6Test, + RecvmsgUDPLITE6Test, + RecvmsgRFC3542AncillaryUDPLITE6Test, + RecvmsgIntoRFC3542AncillaryUDPLITE6Test, + RecvmsgIntoUDPLITE6Test, SendmsgTCPTest, RecvmsgTCPTest, RecvmsgIntoTCPTest, @@ -6278,5 +6671,6 @@ def test_main(): support.run_unittest(*tests) support.threading_cleanup(*thread_info) + if __name__ == "__main__": test_main() diff --git a/Lib/test/test_socketserver.py b/Lib/test/test_socketserver.py index 8aed4b61a23744aec176c9aa37781cc86bdd2a52..c663cc95889c9c6dcae15c3d50f6fab7f7892816 100644 --- a/Lib/test/test_socketserver.py +++ b/Lib/test/test_socketserver.py @@ -15,12 +15,13 @@ import test.support from test.support import reap_children, reap_threads, verbose +from test.support import socket_helper test.support.requires("network") TEST_STR = b"hello world\n" -HOST = test.support.HOST +HOST = socket_helper.HOST HAVE_UNIX_SOCKETS = hasattr(socket, "AF_UNIX") requires_unix_sockets = unittest.skipUnless(HAVE_UNIX_SOCKETS, @@ -36,7 +37,7 @@ def signal_alarm(n): # Remember real select() to avoid interferences with mocking _real_select = select.select -def receive(sock, n, timeout=20): +def receive(sock, n, timeout=test.support.SHORT_TIMEOUT): r, w, x = _real_select([sock], [], [], timeout) if sock in r: return sock.recv(n) @@ -65,9 +66,7 @@ def simple_subprocess(testcase): except: raise finally: - pid2, status = os.waitpid(pid, 0) - testcase.assertEqual(pid2, pid) - testcase.assertEqual(72 << 8, status) + test.support.wait_process(pid, exitcode=72) class SocketServerTest(unittest.TestCase): diff --git a/Lib/test/test_source_encoding.py b/Lib/test/test_source_encoding.py index a0bd741c36ac296453300929a47472b025bb2b8b..5ca43461d9940da3e2af71a534a4b6f61535d0bf 100644 --- a/Lib/test/test_source_encoding.py +++ b/Lib/test/test_source_encoding.py @@ -57,6 +57,9 @@ def test_issue7820(self): # one byte in common with the UTF-16-LE BOM self.assertRaises(SyntaxError, eval, b'\xff\x20') + # one byte in common with the UTF-8 BOM + self.assertRaises(SyntaxError, eval, b'\xef\x20') + # two bytes in common with the UTF-8 BOM self.assertRaises(SyntaxError, eval, b'\xef\xbb\x20') diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 0bc0a8c4522d5249341a14933e18437e626296d7..27cb884e072e050fc08454396b0dd4b075a4d745 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -4,6 +4,7 @@ import unittest import unittest.mock from test import support +from test.support import socket_helper import socket import select import time @@ -29,8 +30,11 @@ from ssl import TLSVersion, _TLSContentType, _TLSMessageType +Py_DEBUG = hasattr(sys, 'gettotalrefcount') +Py_DEBUG_WIN32 = Py_DEBUG and sys.platform == 'win32' + PROTOCOLS = sorted(ssl._PROTOCOL_NAMES) -HOST = support.HOST +HOST = socket_helper.HOST IS_LIBRESSL = ssl.OPENSSL_VERSION.startswith('LibreSSL') IS_OPENSSL_1_1_0 = not IS_LIBRESSL and ssl.OPENSSL_VERSION_INFO >= (1, 1, 0) IS_OPENSSL_1_1_1 = not IS_LIBRESSL and ssl.OPENSSL_VERSION_INFO >= (1, 1, 1) @@ -405,8 +409,7 @@ def test_random_fork(self): else: os.close(wfd) self.addCleanup(os.close, rfd) - _, status = os.waitpid(pid, 0) - self.assertEqual(status, 0) + support.wait_process(pid, exitcode=0) child_random = os.read(rfd, 16) self.assertEqual(len(child_random), 16) @@ -760,7 +763,7 @@ def fail(cert, hostname): fail(cert, 'example.net') # -- IPv6 matching -- - if support.IPV6_ENABLED: + if socket_helper.IPV6_ENABLED: cert = {'subject': ((('commonName', 'example.com'),),), 'subjectAltName': ( ('DNS', 'example.com'), @@ -843,7 +846,7 @@ def fail(cert, hostname): ssl._inet_paton(invalid) for ipaddr in ['127.0.0.1', '192.168.0.1']: self.assertTrue(ssl._inet_paton(ipaddr)) - if support.IPV6_ENABLED: + if socket_helper.IPV6_ENABLED: for ipaddr in ['::1', '2001:db8:85a3::8a2e:370:7334']: self.assertTrue(ssl._inet_paton(ipaddr)) @@ -1071,7 +1074,7 @@ def local_february_name(): def test_connect_ex_error(self): server = socket.socket(socket.AF_INET) self.addCleanup(server.close) - port = support.bind_port(server) # Reserve port but don't listen + port = socket_helper.bind_port(server) # Reserve port but don't listen s = test_wrap_socket(socket.socket(socket.AF_INET), cert_reqs=ssl.CERT_REQUIRED) self.addCleanup(s.close) @@ -1446,6 +1449,7 @@ def test_load_verify_cadata(self): ctx.load_verify_locations(cadata=b"broken") + @unittest.skipIf(Py_DEBUG_WIN32, "Avoid mixing debug/release CRT on Windows") def test_load_dh_params(self): ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ctx.load_dh_params(DHFILE) @@ -1764,6 +1768,7 @@ def test_str(self): self.assertEqual(str(e), "foo") self.assertEqual(e.errno, 1) + @unittest.skipIf(Py_DEBUG_WIN32, "Avoid mixing debug/release CRT on Windows") def test_lib_reason(self): # Test the library and reason attributes ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) @@ -2151,7 +2156,7 @@ def test_context_setget(self): def ssl_io_loop(self, sock, incoming, outgoing, func, *args, **kwargs): # A simple IO loop. Call func(*args) depending on the error we get # (WANT_READ or WANT_WRITE) move data between the socket and the BIOs. - timeout = kwargs.get('timeout', 10) + timeout = kwargs.get('timeout', support.SHORT_TIMEOUT) deadline = time.monotonic() + timeout count = 0 while True: @@ -2241,7 +2246,7 @@ class NetworkedTests(unittest.TestCase): def test_timeout_connect_ex(self): # Issue #12065: on a timeout, connect_ex() should return the original # errno (mimicking the behaviour of non-SSL sockets). - with support.transient_internet(REMOTE_HOST): + with socket_helper.transient_internet(REMOTE_HOST): s = test_wrap_socket(socket.socket(socket.AF_INET), cert_reqs=ssl.CERT_REQUIRED, do_handshake_on_connect=False) @@ -2252,9 +2257,9 @@ def test_timeout_connect_ex(self): self.skipTest("REMOTE_HOST responded too quickly") self.assertIn(rc, (errno.EAGAIN, errno.EWOULDBLOCK)) - @unittest.skipUnless(support.IPV6_ENABLED, 'Needs IPv6') + @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'Needs IPv6') def test_get_server_certificate_ipv6(self): - with support.transient_internet('ipv6.google.com'): + with socket_helper.transient_internet('ipv6.google.com'): _test_get_server_certificate(self, 'ipv6.google.com', 443) _test_get_server_certificate_fail(self, 'ipv6.google.com', 443) @@ -2296,7 +2301,7 @@ def __init__(self, server, connsock, addr): self.running = False self.sock = connsock self.addr = addr - self.sock.setblocking(1) + self.sock.setblocking(True) self.sslconn = None threading.Thread.__init__(self) self.daemon = True @@ -2507,7 +2512,7 @@ def __init__(self, certificate=None, ssl_version=None, self.connectionchatty = connectionchatty self.starttls_server = starttls_server self.sock = socket.socket() - self.port = support.bind_port(self.sock) + self.port = socket_helper.bind_port(self.sock) self.flag = None self.active = False self.selected_npn_protocols = [] @@ -2620,7 +2625,7 @@ def handle_error(self): def __init__(self, certfile): self.certfile = certfile sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.port = support.bind_port(sock, '') + self.port = socket_helper.bind_port(sock, '') asyncore.dispatcher.__init__(self, sock) self.listen(5) @@ -3140,7 +3145,7 @@ def test_rude_shutdown(self): listener_gone = threading.Event() s = socket.socket() - port = support.bind_port(s, HOST) + port = socket_helper.bind_port(s, HOST) # `listener` runs in a thread. It sits in an accept() until # the main thread connects. Then it rudely closes the socket, @@ -3344,7 +3349,7 @@ def test_starttls(self): wrapped = False with server: s = socket.socket() - s.setblocking(1) + s.setblocking(True) s.connect((HOST, server.port)) if support.verbose: sys.stdout.write("\n") @@ -3636,7 +3641,7 @@ def test_handshake_timeout(self): # Issue #5103: SSL handshake must respect the socket timeout server = socket.socket(socket.AF_INET) host = "127.0.0.1" - port = support.bind_port(server) + port = socket_helper.bind_port(server) started = threading.Event() finish = False @@ -3690,7 +3695,7 @@ def test_server_accept(self): context.load_cert_chain(SIGNED_CERTFILE) server = socket.socket(socket.AF_INET) host = "127.0.0.1" - port = support.bind_port(server) + port = socket_helper.bind_port(server) server = context.wrap_socket(server, server_side=True) self.assertTrue(server.server_side) @@ -3826,6 +3831,7 @@ def test_min_max_version_tlsv1_1(self): @requires_minimum_version @requires_tls_version('TLSv1_2') + @requires_tls_version('TLSv1') def test_min_max_version_mismatch(self): client_context, server_context, hostname = testing_context() # client 1.0, server 1.2 (mismatch) @@ -3953,6 +3959,7 @@ def test_compression_disabled(self): sni_name=hostname) self.assertIs(stats['compression'], None) + @unittest.skipIf(Py_DEBUG_WIN32, "Avoid mixing debug/release CRT on Windows") def test_dh_params(self): # Check we can get a connection with ephemeral Diffie-Hellman client_context, server_context, hostname = testing_context() @@ -4582,6 +4589,7 @@ def keylog_lines(self, fname=support.TESTFN): return len(list(f)) @requires_keylog + @unittest.skipIf(Py_DEBUG_WIN32, "Avoid mixing debug/release CRT on Windows") def test_keylog_defaults(self): self.addCleanup(support.unlink, support.TESTFN) ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) @@ -4605,6 +4613,7 @@ def test_keylog_defaults(self): ctx.keylog_filename = 1 @requires_keylog + @unittest.skipIf(Py_DEBUG_WIN32, "Avoid mixing debug/release CRT on Windows") def test_keylog_filename(self): self.addCleanup(support.unlink, support.TESTFN) client_context, server_context, hostname = testing_context() @@ -4642,6 +4651,7 @@ def test_keylog_filename(self): @requires_keylog @unittest.skipIf(sys.flags.ignore_environment, "test is not compatible with ignore_environment") + @unittest.skipIf(Py_DEBUG_WIN32, "Avoid mixing debug/release CRT on Windows") def test_keylog_env(self): self.addCleanup(support.unlink, support.TESTFN) with unittest.mock.patch.dict(os.environ): diff --git a/Lib/test/test_stat.py b/Lib/test/test_stat.py index be01db2ed55746d99121255a4cbf152bc541bb46..d9e4ffde658dbd0764c1fc5234e1ee8ea8b471da 100644 --- a/Lib/test/test_stat.py +++ b/Lib/test/test_stat.py @@ -2,8 +2,8 @@ import os import socket import sys -from test.support import (TESTFN, import_fresh_module, - skip_unless_bind_unix_socket) +from test.support import socket_helper +from test.support import TESTFN, import_fresh_module c_stat = import_fresh_module('stat', fresh=['_stat']) py_stat = import_fresh_module('stat', blocked=['_stat']) @@ -193,7 +193,7 @@ def test_devices(self): self.assertS_IS("BLK", st_mode) break - @skip_unless_bind_unix_socket + @socket_helper.skip_unless_bind_unix_socket def test_socket(self): with socket.socket(socket.AF_UNIX) as s: s.bind(TESTFN) diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index 5b8ad874a909080df5eac2bf58eaabf2692db384..bf415dda557e60c7d8efb0853375b868213e87f4 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -1004,6 +1004,10 @@ def test_nan(self): x = statistics._convert(nan, type(nan)) self.assertTrue(_nan_equal(x, nan)) + def test_invalid_input_type(self): + with self.assertRaises(TypeError): + statistics._convert(None, float) + class FailNegTest(unittest.TestCase): """Test _fail_neg private function.""" @@ -1033,6 +1037,50 @@ def test_error_msg(self): self.assertEqual(errmsg, msg) +class FindLteqTest(unittest.TestCase): + # Test _find_lteq private function. + + def test_invalid_input_values(self): + for a, x in [ + ([], 1), + ([1, 2], 3), + ([1, 3], 2) + ]: + with self.subTest(a=a, x=x): + with self.assertRaises(ValueError): + statistics._find_lteq(a, x) + + def test_locate_successfully(self): + for a, x, expected_i in [ + ([1, 1, 1, 2, 3], 1, 0), + ([0, 1, 1, 1, 2, 3], 1, 1), + ([1, 2, 3, 3, 3], 3, 2) + ]: + with self.subTest(a=a, x=x): + self.assertEqual(expected_i, statistics._find_lteq(a, x)) + + +class FindRteqTest(unittest.TestCase): + # Test _find_rteq private function. + + def test_invalid_input_values(self): + for a, l, x in [ + ([1], 2, 1), + ([1, 3], 0, 2) + ]: + with self.assertRaises(ValueError): + statistics._find_rteq(a, l, x) + + def test_locate_successfully(self): + for a, l, x, expected_i in [ + ([1, 1, 1, 2, 3], 0, 1, 2), + ([0, 1, 1, 1, 2, 3], 0, 1, 3), + ([1, 2, 3, 3, 3], 0, 3, 4) + ]: + with self.subTest(a=a, l=l, x=x): + self.assertEqual(expected_i, statistics._find_rteq(a, l, x)) + + # === Tests for public functions === class UnivariateCommonMixin: @@ -1476,6 +1524,18 @@ def test_negative_error(self): with self.subTest(values=values): self.assertRaises(exc, self.func, values) + def test_invalid_type_error(self): + # Test error is raised when input contains invalid type(s) + for data in [ + ['3.14'], # single string + ['1', '2', '3'], # multiple strings + [1, '2', 3, '4', 5], # mixed strings and valid integers + [2.3, 3.4, 4.5, '5.6'] # only one string and valid floats + ]: + with self.subTest(data=data): + with self.assertRaises(TypeError): + self.func(data) + def test_ints(self): # Test harmonic mean with ints. data = [2, 4, 4, 8, 16, 16] @@ -2614,6 +2674,21 @@ def overlap_numeric(X, Y, *, steps=8_192, z=5): with self.assertRaises(self.module.StatisticsError): NormalDist(1, 0).overlap(X) # left operand sigma is zero + def test_zscore(self): + NormalDist = self.module.NormalDist + X = NormalDist(100, 15) + self.assertEqual(X.zscore(142), 2.8) + self.assertEqual(X.zscore(58), -2.8) + self.assertEqual(X.zscore(100), 0.0) + with self.assertRaises(TypeError): + X.zscore() # too few arguments + with self.assertRaises(TypeError): + X.zscore(1, 1) # too may arguments + with self.assertRaises(TypeError): + X.zscore(None) # non-numeric type + with self.assertRaises(self.module.StatisticsError): + NormalDist(1, 0).zscore(100) # sigma is zero + def test_properties(self): X = self.module.NormalDist(100, 15) self.assertEqual(X.mean, 100) diff --git a/Lib/test/test_string_literals.py b/Lib/test/test_string_literals.py index 0cea2edc32afa29eaceff983903830b9a3bc8da8..9565ee2485afd10f1179e79911eff2b8c160552a 100644 --- a/Lib/test/test_string_literals.py +++ b/Lib/test/test_string_literals.py @@ -33,6 +33,7 @@ import tempfile import unittest import warnings +from test.support import use_old_parser TEMPLATE = r"""# coding: %s @@ -63,8 +64,6 @@ def byte(i): class TestLiterals(unittest.TestCase): - from test.support import check_syntax_warning - def setUp(self): self.save_path = sys.path[:] self.tmpdir = tempfile.mkdtemp() @@ -129,6 +128,7 @@ def test_eval_str_invalid_escape(self): self.assertEqual(w, []) self.assertEqual(exc.filename, '') self.assertEqual(exc.lineno, 1) + self.assertEqual(exc.offset, 1) def test_eval_str_raw(self): self.assertEqual(eval(""" r'x' """), 'x') @@ -168,7 +168,8 @@ def test_eval_bytes_invalid_escape(self): eval("b'''\n\\z'''") self.assertEqual(len(w), 1) self.assertEqual(w[0].filename, '') - self.assertEqual(w[0].lineno, 1) + if use_old_parser(): + self.assertEqual(w[0].lineno, 1) with warnings.catch_warnings(record=True) as w: warnings.simplefilter('error', category=DeprecationWarning) @@ -177,7 +178,8 @@ def test_eval_bytes_invalid_escape(self): exc = cm.exception self.assertEqual(w, []) self.assertEqual(exc.filename, '') - self.assertEqual(exc.lineno, 1) + if use_old_parser(): + self.assertEqual(exc.lineno, 1) def test_eval_bytes_raw(self): self.assertEqual(eval(""" br'x' """), b'x') diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py index 67e7c559d9f1d25f00c91162e7a01d08ea5129ee..b3f21ea7db49ef3d2aed55489cba5c985e3a2db9 100644 --- a/Lib/test/test_struct.py +++ b/Lib/test/test_struct.py @@ -7,6 +7,7 @@ import sys from test import support +from test.support.script_helper import assert_python_ok ISBIGENDIAN = sys.byteorder == "big" @@ -652,6 +653,24 @@ def test_format_attr(self): s2 = struct.Struct(s.format.encode()) self.assertEqual(s2.format, s.format) + def test_struct_cleans_up_at_runtime_shutdown(self): + code = """if 1: + import struct + + class C: + def __init__(self): + self.pack = struct.pack + def __del__(self): + self.pack('I', -42) + + struct.x = C() + """ + rc, stdout, stderr = assert_python_ok("-c", code) + self.assertEqual(rc, 0) + self.assertEqual(stdout.rstrip(), b"") + self.assertIn(b"Exception ignored in:", stderr) + self.assertIn(b"C.__del__", stderr) + def test_issue35714(self): # Embedded null characters should not be allowed in format strings. for s in '\0', '2\0i', b'\0': @@ -686,6 +705,10 @@ def _check_iterator(it): with self.assertRaises(struct.error): s.iter_unpack(b"12") + def test_uninstantiable(self): + iter_unpack_type = type(struct.Struct(">ibcp").iter_unpack(b"")) + self.assertRaises(TypeError, iter_unpack_type) + def test_iterate(self): s = struct.Struct('>IB') b = bytes(range(1, 16)) diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index f8fee3687136f20141c21f4b5116bdf960d03a06..e8f9699ef763504703f1e40c86bb94e27c2345ca 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -11,6 +11,7 @@ import tempfile import time import traceback +import types import selectors import sysconfig import select @@ -18,6 +19,7 @@ import threading import gc import textwrap +import json from test.support import FakePath try: @@ -25,6 +27,14 @@ except ImportError: _testcapi = None +try: + import pwd +except ImportError: + pwd = None +try: + import grp +except ImportError: + grp = None if support.PGO: raise unittest.SkipTest("test is not helpful for PGO") @@ -76,15 +86,6 @@ def tearDown(self): self.doCleanups() support.reap_children() - def assertStderrEqual(self, stderr, expected, msg=None): - # In a debug build, stuff like "[6580 refs]" is printed to stderr at - # shutdown time. That frustrates tests trying to check stderr produced - # from a spawned Python process. - actual = support.strip_python_stderr(stderr) - # strip_python_stderr also strips whitespace, so we do too. - expected = expected.strip() - self.assertEqual(actual, expected, msg) - class PopenTestException(Exception): pass @@ -195,6 +196,28 @@ def test_check_output_input_arg(self): input=b'pear') self.assertIn(b'PEAR', output) + def test_check_output_input_none(self): + """input=None has a legacy meaning of input='' on check_output.""" + output = subprocess.check_output( + [sys.executable, "-c", + "import sys; print('XX' if sys.stdin.read() else '')"], + input=None) + self.assertNotIn(b'XX', output) + + def test_check_output_input_none_text(self): + output = subprocess.check_output( + [sys.executable, "-c", + "import sys; print('XX' if sys.stdin.read() else '')"], + input=None, text=True) + self.assertNotIn('XX', output) + + def test_check_output_input_none_universal_newlines(self): + output = subprocess.check_output( + [sys.executable, "-c", + "import sys; print('XX' if sys.stdin.read() else '')"], + input=None, universal_newlines=True) + self.assertNotIn('XX', output) + def test_check_output_stdout_arg(self): # check_output() refuses to accept 'stdout' argument with self.assertRaises(ValueError) as c: @@ -372,7 +395,9 @@ def _assert_cwd(self, expected_cwd, python_arg, **kwargs): # matches *expected_cwd*. p = subprocess.Popen([python_arg, "-c", "import os, sys; " - "sys.stdout.write(os.getcwd()); " + "buf = sys.stdout.buffer; " + "buf.write(os.getcwd().encode()); " + "buf.flush(); " "sys.exit(47)"], stdout=subprocess.PIPE, **kwargs) @@ -381,7 +406,7 @@ def _assert_cwd(self, expected_cwd, python_arg, **kwargs): self.assertEqual(47, p.returncode) normcase = os.path.normcase self.assertEqual(normcase(expected_cwd), - normcase(p.stdout.read().decode("utf-8"))) + normcase(p.stdout.read().decode())) def test_cwd(self): # Check that cwd changes the cwd for the child process. @@ -538,7 +563,7 @@ def test_stderr_pipe(self): 'import sys; sys.stderr.write("strawberry")'], stderr=subprocess.PIPE) with p: - self.assertStderrEqual(p.stderr.read(), b"strawberry") + self.assertEqual(p.stderr.read(), b"strawberry") def test_stderr_filedes(self): # stderr is set to open file descriptor @@ -550,7 +575,7 @@ def test_stderr_filedes(self): stderr=d) p.wait() os.lseek(d, 0, 0) - self.assertStderrEqual(os.read(d, 1024), b"strawberry") + self.assertEqual(os.read(d, 1024), b"strawberry") def test_stderr_fileobj(self): # stderr is set to open file object @@ -561,7 +586,7 @@ def test_stderr_fileobj(self): stderr=tf) p.wait() tf.seek(0) - self.assertStderrEqual(tf.read(), b"strawberry") + self.assertEqual(tf.read(), b"strawberry") def test_stderr_redirect_with_no_stdout_redirect(self): # test stderr=STDOUT while stdout=None (not set) @@ -580,8 +605,8 @@ def test_stderr_redirect_with_no_stdout_redirect(self): stderr=subprocess.PIPE) stdout, stderr = p.communicate() #NOTE: stdout should get stderr from grandchild - self.assertStderrEqual(stdout, b'42') - self.assertStderrEqual(stderr, b'') # should be empty + self.assertEqual(stdout, b'42') + self.assertEqual(stderr, b'') # should be empty self.assertEqual(p.returncode, 0) def test_stdout_stderr_pipe(self): @@ -594,7 +619,7 @@ def test_stdout_stderr_pipe(self): stdout=subprocess.PIPE, stderr=subprocess.STDOUT) with p: - self.assertStderrEqual(p.stdout.read(), b"appleorange") + self.assertEqual(p.stdout.read(), b"appleorange") def test_stdout_stderr_file(self): # capture stdout and stderr to the same open file @@ -609,7 +634,7 @@ def test_stdout_stderr_file(self): stderr=tf) p.wait() tf.seek(0) - self.assertStderrEqual(tf.read(), b"appleorange") + self.assertEqual(tf.read(), b"appleorange") def test_stdout_filedes_of_stdout(self): # stdout is set to 1 (#1531862). @@ -757,7 +782,7 @@ def test_communicate_stderr(self): stderr=subprocess.PIPE) (stdout, stderr) = p.communicate() self.assertEqual(stdout, None) - self.assertStderrEqual(stderr, b"pineapple") + self.assertEqual(stderr, b"pineapple") def test_communicate(self): p = subprocess.Popen([sys.executable, "-c", @@ -772,7 +797,7 @@ def test_communicate(self): self.addCleanup(p.stdin.close) (stdout, stderr) = p.communicate(b"banana") self.assertEqual(stdout, b"banana") - self.assertStderrEqual(stderr, b"pineapple") + self.assertEqual(stderr, b"pineapple") def test_communicate_timeout(self): p = subprocess.Popen([sys.executable, "-c", @@ -791,7 +816,7 @@ def test_communicate_timeout(self): # after it completes. (stdout, stderr) = p.communicate() self.assertEqual(stdout, "banana") - self.assertStderrEqual(stderr.encode(), b"pineapple\npear\n") + self.assertEqual(stderr.encode(), b"pineapple\npear\n") def test_communicate_timeout_large_output(self): # Test an expiring timeout while the child is outputting lots of data. @@ -877,7 +902,7 @@ def test_writes_before_communicate(self): p.stdin.write(b"banana") (stdout, stderr) = p.communicate(b"split") self.assertEqual(stdout, b"bananasplit") - self.assertStderrEqual(stderr, b"") + self.assertEqual(stderr, b"") def test_universal_newlines_and_text(self): args = [ @@ -995,7 +1020,6 @@ def test_universal_newlines_communicate_stdin_stdout_stderr(self): self.assertEqual("line1\nline2\nline3\nline4\nline5\n", stdout) # Python debug build push something like "[42442 refs]\n" # to stderr at exit of subprocess. - # Don't use assertStderrEqual because it strips CR and LF from output. self.assertTrue(stderr.startswith("eline2\neline6\neline7\n")) def test_universal_newlines_communicate_encodings(self): @@ -1121,9 +1145,7 @@ def test_wait_timeout(self): with self.assertRaises(subprocess.TimeoutExpired) as c: p.wait(timeout=0.0001) self.assertIn("0.0001", str(c.exception)) # For coverage of __str__. - # Some heavily loaded buildbots (sparc Debian 3.x) require this much - # time to start. - self.assertEqual(p.wait(timeout=3), 0) + self.assertEqual(p.wait(timeout=support.SHORT_TIMEOUT), 0) def test_invalid_bufsize(self): # an invalid type of the bufsize argument should raise @@ -1289,7 +1311,7 @@ def kill_proc_timer_thread(): # Wait for the process to finish; the thread should kill it # long before it finishes on its own. Supplying a timeout # triggers a different code path for better coverage. - proc.wait(timeout=20) + proc.wait(timeout=support.SHORT_TIMEOUT) self.assertEqual(proc.returncode, expected_errorcode, msg="unexpected result in wait from main thread") @@ -1350,6 +1372,30 @@ def test_communicate_epipe(self): self.addCleanup(p.stdin.close) p.communicate(b"x" * 2**20) + def test_repr(self): + # Run a command that waits for user input, to check the repr() of + # a Proc object while and after the sub-process runs. + code = 'import sys; input(); sys.exit(57)' + cmd = [sys.executable, '-c', code] + result = "') + ) + + proc.communicate(input='exit...\n') + proc.wait() + + self.assertIsNotNone(proc.returncode) + self.assertTrue( + repr(proc).startswith(result.format(proc.returncode)) and + repr(proc).endswith('>') + ) + def test_communicate_epipe_only_stdin(self): # Issue 10963: communicate() should hide EPIPE p = subprocess.Popen(ZERO_RETURN_CMD, @@ -1413,6 +1459,9 @@ def test_file_not_found_with_bad_cwd(self): subprocess.Popen(['exit', '0'], cwd='/some/nonexistent/directory') self.assertEqual(c.exception.filename, '/some/nonexistent/directory') + def test_class_getitems(self): + self.assertIsInstance(subprocess.Popen[bytes], types.GenericAlias) + self.assertIsInstance(subprocess.CompletedProcess[str], types.GenericAlias) class RunFuncTestCase(BaseTestCase): def run_python(self, code, **kwargs): @@ -1511,7 +1560,7 @@ def test_run_kwargs(self): def test_run_with_pathlike_path(self): # bpo-31961: test run(pathlike_object) # the name of a command that can be run without - # any argumenets that exit fast + # any arguments that exit fast prog = 'tree.com' if mswindows else 'ls' path = shutil.which(prog) if path is None: @@ -1589,6 +1638,18 @@ def test_run_with_shell_timeout_and_capture_output(self): f"{stacks}```") +def _get_test_grp_name(): + for name_group in ('staff', 'nogroup', 'grp', 'nobody', 'nfsnobody'): + if grp: + try: + grp.getgrnam(name_group) + except KeyError: + continue + return name_group + else: + raise unittest.SkipTest('No identified group name to use for this test on this platform.') + + @unittest.skipIf(mswindows, "POSIX specific tests") class POSIXProcessTestCase(BaseTestCase): @@ -1743,6 +1804,186 @@ def test_start_new_session(self): child_sid = int(output) self.assertNotEqual(parent_sid, child_sid) + @unittest.skipUnless(hasattr(os, 'setreuid'), 'no setreuid on platform') + def test_user(self): + # For code coverage of the user parameter. We don't care if we get an + # EPERM error from it depending on the test execution environment, that + # still indicates that it was called. + + uid = os.geteuid() + test_users = [65534 if uid != 65534 else 65533, uid] + name_uid = "nobody" if sys.platform != 'darwin' else "unknown" + + if pwd is not None: + try: + pwd.getpwnam(name_uid) + test_users.append(name_uid) + except KeyError: + # unknown user name + name_uid = None + + for user in test_users: + # posix_spawn() may be used with close_fds=False + for close_fds in (False, True): + with self.subTest(user=user, close_fds=close_fds): + try: + output = subprocess.check_output( + [sys.executable, "-c", + "import os; print(os.getuid())"], + user=user, + close_fds=close_fds) + except PermissionError: # (EACCES, EPERM) + pass + except OSError as e: + if e.errno not in (errno.EACCES, errno.EPERM): + raise + else: + if isinstance(user, str): + user_uid = pwd.getpwnam(user).pw_uid + else: + user_uid = user + child_user = int(output) + self.assertEqual(child_user, user_uid) + + with self.assertRaises(ValueError): + subprocess.check_call(ZERO_RETURN_CMD, user=-1) + + with self.assertRaises(OverflowError): + subprocess.check_call(ZERO_RETURN_CMD, + cwd=os.curdir, env=os.environ, user=2**64) + + if pwd is None and name_uid is not None: + with self.assertRaises(ValueError): + subprocess.check_call(ZERO_RETURN_CMD, user=name_uid) + + @unittest.skipIf(hasattr(os, 'setreuid'), 'setreuid() available on platform') + def test_user_error(self): + with self.assertRaises(ValueError): + subprocess.check_call(ZERO_RETURN_CMD, user=65535) + + @unittest.skipUnless(hasattr(os, 'setregid'), 'no setregid() on platform') + def test_group(self): + gid = os.getegid() + group_list = [65534 if gid != 65534 else 65533] + name_group = _get_test_grp_name() + + if grp is not None: + group_list.append(name_group) + + for group in group_list + [gid]: + # posix_spawn() may be used with close_fds=False + for close_fds in (False, True): + with self.subTest(group=group, close_fds=close_fds): + try: + output = subprocess.check_output( + [sys.executable, "-c", + "import os; print(os.getgid())"], + group=group, + close_fds=close_fds) + except PermissionError: # (EACCES, EPERM) + pass + else: + if isinstance(group, str): + group_gid = grp.getgrnam(group).gr_gid + else: + group_gid = group + + child_group = int(output) + self.assertEqual(child_group, group_gid) + + # make sure we bomb on negative values + with self.assertRaises(ValueError): + subprocess.check_call(ZERO_RETURN_CMD, group=-1) + + with self.assertRaises(OverflowError): + subprocess.check_call(ZERO_RETURN_CMD, + cwd=os.curdir, env=os.environ, group=2**64) + + if grp is None: + with self.assertRaises(ValueError): + subprocess.check_call(ZERO_RETURN_CMD, group=name_group) + + @unittest.skipIf(hasattr(os, 'setregid'), 'setregid() available on platform') + def test_group_error(self): + with self.assertRaises(ValueError): + subprocess.check_call(ZERO_RETURN_CMD, group=65535) + + @unittest.skipUnless(hasattr(os, 'setgroups'), 'no setgroups() on platform') + def test_extra_groups(self): + gid = os.getegid() + group_list = [65534 if gid != 65534 else 65533] + name_group = _get_test_grp_name() + perm_error = False + + if grp is not None: + group_list.append(name_group) + + try: + output = subprocess.check_output( + [sys.executable, "-c", + "import os, sys, json; json.dump(os.getgroups(), sys.stdout)"], + extra_groups=group_list) + except OSError as ex: + if ex.errno != errno.EPERM: + raise + perm_error = True + + else: + parent_groups = os.getgroups() + child_groups = json.loads(output) + + if grp is not None: + desired_gids = [grp.getgrnam(g).gr_gid if isinstance(g, str) else g + for g in group_list] + else: + desired_gids = group_list + + if perm_error: + self.assertEqual(set(child_groups), set(parent_groups)) + else: + self.assertEqual(set(desired_gids), set(child_groups)) + + # make sure we bomb on negative values + with self.assertRaises(ValueError): + subprocess.check_call(ZERO_RETURN_CMD, extra_groups=[-1]) + + with self.assertRaises(ValueError): + subprocess.check_call(ZERO_RETURN_CMD, + cwd=os.curdir, env=os.environ, + extra_groups=[2**64]) + + if grp is None: + with self.assertRaises(ValueError): + subprocess.check_call(ZERO_RETURN_CMD, + extra_groups=[name_group]) + + @unittest.skipIf(hasattr(os, 'setgroups'), 'setgroups() available on platform') + def test_extra_groups_error(self): + with self.assertRaises(ValueError): + subprocess.check_call(ZERO_RETURN_CMD, extra_groups=[]) + + @unittest.skipIf(mswindows or not hasattr(os, 'umask'), + 'POSIX umask() is not available.') + def test_umask(self): + tmpdir = None + try: + tmpdir = tempfile.mkdtemp() + name = os.path.join(tmpdir, "beans") + # We set an unusual umask in the child so as a unique mode + # for us to test the child's touched file for. + subprocess.check_call( + [sys.executable, "-c", f"open({name!r}, 'w').close()"], + umask=0o053) + # Ignore execute permissions entirely in our test, + # filesystems could be mounted to ignore or force that. + st_mode = os.stat(name).st_mode & 0o666 + expected_mode = 0o624 + self.assertEqual(expected_mode, st_mode, + msg=f'{oct(expected_mode)} != {oct(st_mode)}') + finally: + if tmpdir is not None: + shutil.rmtree(tmpdir) + def test_run_abort(self): # returncode handles signal termination with support.SuppressCrashReport(): @@ -2032,13 +2273,13 @@ def test_send_signal(self): def test_kill(self): p = self._kill_process('kill') _, stderr = p.communicate() - self.assertStderrEqual(stderr, b'') + self.assertEqual(stderr, b'') self.assertEqual(p.wait(), -signal.SIGKILL) def test_terminate(self): p = self._kill_process('terminate') _, stderr = p.communicate() - self.assertStderrEqual(stderr, b'') + self.assertEqual(stderr, b'') self.assertEqual(p.wait(), -signal.SIGTERM) def test_send_signal_dead(self): @@ -2086,8 +2327,8 @@ def check_close_std_fds(self, fds): stdin=stdin, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() - err = support.strip_python_stderr(err) - self.assertEqual((out, err), (b'apple', b'orange')) + self.assertEqual(out, b'apple') + self.assertEqual(err, b'orange') finally: self._restore_fds(saved_fds) @@ -2172,7 +2413,7 @@ def test_remapping_std_fds(self): os.lseek(fd, 0, 0) out = os.read(temp_fds[2], 1024) - err = support.strip_python_stderr(os.read(temp_fds[0], 1024)) + err = os.read(temp_fds[0], 1024).strip() self.assertEqual(out, b"got STDIN") self.assertEqual(err, b"err") @@ -2214,7 +2455,7 @@ def check_swap_fds(self, stdin_no, stdout_no, stderr_no): os.lseek(fd, 0, 0) out = os.read(stdout_no, 1024) - err = support.strip_python_stderr(os.read(stderr_no, 1024)) + err = os.read(stderr_no, 1024).strip() finally: self._restore_fds(saved_fds) @@ -2793,13 +3034,23 @@ def test_fork_exec(self): ([b"arg"], [b"exe"], 123, [b"env"]), ([b"arg"], [b"exe"], None, 123), ): - with self.assertRaises(TypeError): + with self.assertRaises(TypeError) as err: _posixsubprocess.fork_exec( args, exe_list, True, (), cwd, env_list, -1, -1, -1, -1, 1, 2, 3, 4, - True, True, func) + True, True, + False, [], 0, -1, + func) + # Attempt to prevent + # "TypeError: fork_exec() takes exactly N arguments (M given)" + # from passing the test. More refactoring to have us start + # with a valid *args list, confirm a good call with that works + # before mutating it in various ways to ensure that bad calls + # with individual arg type errors raise a typeerror would be + # ideal. Saving that for a future PR... + self.assertNotIn('takes exactly', str(err.exception)) finally: if not gc_enabled: gc.disable() @@ -2838,7 +3089,9 @@ def __int__(self): True, fds_to_keep, None, [b"env"], -1, -1, -1, -1, 1, 2, 3, 4, - True, True, None) + True, True, + None, None, None, -1, + None) self.assertIn('fds_to_keep', str(c.exception)) finally: if not gc_enabled: @@ -2899,16 +3152,49 @@ def test_stopped(self): proc = subprocess.Popen(args) # Wait until the real process completes to avoid zombie process - pid = proc.pid - pid, status = os.waitpid(pid, 0) - self.assertEqual(status, 0) + support.wait_process(proc.pid, exitcode=0) status = _testcapi.W_STOPCODE(3) - with mock.patch('subprocess.os.waitpid', return_value=(pid, status)): + with mock.patch('subprocess.os.waitpid', return_value=(proc.pid, status)): returncode = proc.wait() self.assertEqual(returncode, -3) + def test_send_signal_race(self): + # bpo-38630: send_signal() must poll the process exit status to reduce + # the risk of sending the signal to the wrong process. + proc = subprocess.Popen(ZERO_RETURN_CMD) + + # wait until the process completes without using the Popen APIs. + support.wait_process(proc.pid, exitcode=0) + + # returncode is still None but the process completed. + self.assertIsNone(proc.returncode) + + with mock.patch("os.kill") as mock_kill: + proc.send_signal(signal.SIGTERM) + + # send_signal() didn't call os.kill() since the process already + # completed. + mock_kill.assert_not_called() + + # Don't check the returncode value: the test reads the exit status, + # so Popen failed to read it and uses a default returncode instead. + self.assertIsNotNone(proc.returncode) + + def test_send_signal_race2(self): + # bpo-40550: the process might exist between the returncode check and + # the kill operation + p = subprocess.Popen([sys.executable, '-c', 'exit(1)']) + + # wait for process to exit + while not p.returncode: + p.poll() + + with mock.patch.object(p, 'poll', new=lambda: None): + p.returncode = None + p.send_signal(signal.SIGTERM) + def test_communicate_repeated_call_after_stdout_close(self): proc = subprocess.Popen([sys.executable, '-c', 'import os, time; os.close(1), time.sleep(2)'], @@ -3129,7 +3415,7 @@ def _kill_process(self, method, *args): p.stdout.read(1) getattr(p, method)(*args) _, stderr = p.communicate() - self.assertStderrEqual(stderr, b'') + self.assertEqual(stderr, b'') returncode = p.wait() self.assertNotEqual(returncode, 0) @@ -3152,7 +3438,7 @@ def _kill_dead_process(self, method, *args): # This shouldn't raise even though the child is now dead getattr(p, method)(*args) _, stderr = p.communicate() - self.assertStderrEqual(stderr, b'') + self.assertEqual(stderr, b'') rc = p.wait() self.assertEqual(rc, 42) @@ -3261,7 +3547,7 @@ def test_getoutput(self): def test__all__(self): """Ensure that __all__ is populated properly.""" - intentionally_excluded = {"list2cmdline", "Handle"} + intentionally_excluded = {"list2cmdline", "Handle", "pwd", "grp"} exported = set(subprocess.__all__) possible_exports = set() import types @@ -3341,7 +3627,7 @@ def test_pipe(self): stdout=subprocess.PIPE, stderr=subprocess.PIPE) as proc: self.assertEqual(proc.stdout.read(), b"stdout") - self.assertStderrEqual(proc.stderr.read(), b"stderr") + self.assertEqual(proc.stderr.read(), b"stderr") self.assertTrue(proc.stdout.closed) self.assertTrue(proc.stderr.closed) diff --git a/Lib/test/test_sunau.py b/Lib/test/test_sunau.py index 470a1007b4d48f84c7fd93e90fc25fa91c79f89a..7f1c0a5cbdeda95419cd80b994b970d03bd6f723 100644 --- a/Lib/test/test_sunau.py +++ b/Lib/test/test_sunau.py @@ -119,10 +119,6 @@ class SunauULAWTest(SunauTest, unittest.TestCase): frames = byteswap(frames, 2) -class SunauMiscTests(audiotests.AudioMiscTests, unittest.TestCase): - module = sunau - - class SunauLowLevelTest(unittest.TestCase): def test_read_bad_magic_number(self): diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index 80e652d7005fc6135861cdbf887e52a992312081..b5a16f9cb602727192ae9676c8daf44e7f6b6936 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -1,4 +1,3 @@ -import contextlib import errno import importlib import io @@ -14,6 +13,7 @@ import unittest from test import support from test.support import script_helper +from test.support import socket_helper TESTFN = support.TESTFN @@ -91,17 +91,17 @@ def test_forget(self): support.rmtree('__pycache__') def test_HOST(self): - s = socket.create_server((support.HOST, 0)) + s = socket.create_server((socket_helper.HOST, 0)) s.close() def test_find_unused_port(self): - port = support.find_unused_port() - s = socket.create_server((support.HOST, port)) + port = socket_helper.find_unused_port() + s = socket.create_server((socket_helper.HOST, port)) s.close() def test_bind_port(self): s = socket.socket() - support.bind_port(s) + socket_helper.bind_port(s) s.listen() s.close() @@ -176,13 +176,10 @@ def test_temp_dir__forked_child(self): with support.temp_cwd() as temp_path: pid = os.fork() if pid != 0: - # parent process (child has pid == 0) + # parent process # wait for the child to terminate - (pid, status) = os.waitpid(pid, 0) - if status != 0: - raise AssertionError(f"Child process failed with exit " - f"status indication 0x{status:x}.") + support.wait_process(pid, exitcode=0) # Make sure that temp_path is still present. When the child # process leaves the 'temp_cwd'-context, the __exit__()- @@ -422,7 +419,7 @@ def test_reap_children(self): os._exit(0) t0 = time.monotonic() - deadline = time.monotonic() + 60.0 + deadline = time.monotonic() + support.SHORT_TIMEOUT was_altered = support.environment_altered try: @@ -497,7 +494,6 @@ def test_args_from_interpreter_flags(self): ['-Wignore', '-X', 'dev'], ['-X', 'faulthandler'], ['-X', 'importtime'], - ['-X', 'showalloccount'], ['-X', 'showrefcount'], ['-X', 'tracemalloc'], ['-X', 'tracemalloc=3'], @@ -675,7 +671,6 @@ def test_print_warning(self): # run_doctest # threading_cleanup # reap_threads - # strip_python_stderr # can_symlink # skip_unless_symlink # SuppressCrashReport diff --git a/Lib/test/test_symtable.py b/Lib/test/test_symtable.py index 98d718c8ab1b1efe9471639a432b7c55ca6ec8c6..6585071912a0d0bca4ddb14f6af4b1c839eb97d1 100644 --- a/Lib/test/test_symtable.py +++ b/Lib/test/test_symtable.py @@ -11,6 +11,8 @@ glob = 42 some_var = 12 +some_non_assigned_global_var = 11 +some_assigned_global_var = 11 class Mine: instance_var = 24 @@ -19,6 +21,8 @@ def a_method(p1, p2): def spam(a, b, *var, **kw): global bar + global some_assigned_global_var + some_assigned_global_var = 12 bar = 47 some_var = 10 x = 23 @@ -65,7 +69,6 @@ def test_type(self): def test_optimized(self): self.assertFalse(self.top.is_optimized()) - self.assertFalse(self.top.has_exec()) self.assertTrue(self.spam.is_optimized()) @@ -82,14 +85,14 @@ def test_children(self): def test_lineno(self): self.assertEqual(self.top.get_lineno(), 0) - self.assertEqual(self.spam.get_lineno(), 12) + self.assertEqual(self.spam.get_lineno(), 14) def test_function_info(self): func = self.spam self.assertEqual(sorted(func.get_parameters()), ["a", "b", "kw", "var"]) expected = ['a', 'b', 'internal', 'kw', 'other_internal', 'some_var', 'var', 'x'] self.assertEqual(sorted(func.get_locals()), expected) - self.assertEqual(sorted(func.get_globals()), ["bar", "glob"]) + self.assertEqual(sorted(func.get_globals()), ["bar", "glob", "some_assigned_global_var"]) self.assertEqual(self.internal.get_frees(), ("x",)) def test_globals(self): @@ -100,6 +103,9 @@ def test_globals(self): self.assertFalse(self.internal.lookup("x").is_global()) self.assertFalse(self.Mine.lookup("instance_var").is_global()) self.assertTrue(self.spam.lookup("bar").is_global()) + # Module-scope globals are both global and local + self.assertTrue(self.top.lookup("some_non_assigned_global_var").is_global()) + self.assertTrue(self.top.lookup("some_assigned_global_var").is_global()) def test_nonlocal(self): self.assertFalse(self.spam.lookup("some_var").is_nonlocal()) @@ -110,6 +116,9 @@ def test_nonlocal(self): def test_local(self): self.assertTrue(self.spam.lookup("x").is_local()) self.assertFalse(self.spam.lookup("bar").is_local()) + # Module-scope globals are both global and local + self.assertTrue(self.top.lookup("some_non_assigned_global_var").is_local()) + self.assertTrue(self.top.lookup("some_assigned_global_var").is_local()) def test_free(self): self.assertTrue(self.internal.lookup("x").is_free()) @@ -228,6 +237,10 @@ def test_bytes(self): top = symtable.symtable(code, "?", "exec") self.assertIsNotNone(find_block(top, "\u017d")) + def test_symtable_repr(self): + self.assertEqual(str(self.top), "") + self.assertEqual(str(self.spam), "") + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index 128c4da14384143f8d133705e6b2807ab7864a89..f0c9c988e2441787c7247662867e54c1a5ac015d 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -124,10 +124,109 @@ Traceback (most recent call last): SyntaxError: cannot assign to operator +>>> [a, b[1], c + 1] = [1, 2, 3] +Traceback (most recent call last): +SyntaxError: cannot assign to operator + +>>> [a, b.c.d, c + 1] = [1, 2, 3] +Traceback (most recent call last): +SyntaxError: cannot assign to operator + >>> a if 1 else b = 1 Traceback (most recent call last): SyntaxError: cannot assign to conditional expression +>>> True = True = 3 +Traceback (most recent call last): +SyntaxError: cannot assign to True + +>>> x = y = True = z = 3 +Traceback (most recent call last): +SyntaxError: cannot assign to True + +>>> x = y = yield = 1 +Traceback (most recent call last): +SyntaxError: assignment to yield expression not possible + +>>> a, b += 1, 2 +Traceback (most recent call last): +SyntaxError: 'tuple' is an illegal expression for augmented assignment + +>>> (a, b) += 1, 2 +Traceback (most recent call last): +SyntaxError: 'tuple' is an illegal expression for augmented assignment + +>>> [a, b] += 1, 2 +Traceback (most recent call last): +SyntaxError: 'list' is an illegal expression for augmented assignment + +Invalid targets in `for` loops and `with` statements should also +produce a specialized error message + +>>> for a() in b: pass +Traceback (most recent call last): +SyntaxError: cannot assign to function call + +>>> for (a, b()) in b: pass +Traceback (most recent call last): +SyntaxError: cannot assign to function call + +>>> for [a, b()] in b: pass +Traceback (most recent call last): +SyntaxError: cannot assign to function call + +>>> for (*a, b, c+1) in b: pass +Traceback (most recent call last): +SyntaxError: cannot assign to operator + +>>> for (x, *(y, z.d())) in b: pass +Traceback (most recent call last): +SyntaxError: cannot assign to function call + +>>> for a, b() in c: pass +Traceback (most recent call last): +SyntaxError: cannot assign to function call + +>>> for i < (): pass +Traceback (most recent call last): +SyntaxError: invalid syntax + +>>> for a, b +Traceback (most recent call last): +SyntaxError: invalid syntax + +>>> with a as b(): pass +Traceback (most recent call last): +SyntaxError: cannot assign to function call + +>>> with a as (b, c()): pass +Traceback (most recent call last): +SyntaxError: cannot assign to function call + +>>> with a as [b, c()]: pass +Traceback (most recent call last): +SyntaxError: cannot assign to function call + +>>> with a as (*b, c, d+1): pass +Traceback (most recent call last): +SyntaxError: cannot assign to operator + +>>> with a as (x, *(y, z.d())): pass +Traceback (most recent call last): +SyntaxError: cannot assign to function call + +>>> with a as b, c as d(): pass +Traceback (most recent call last): +SyntaxError: cannot assign to function call + +>>> with a as b +Traceback (most recent call last): +SyntaxError: invalid syntax + +>>> p = p = +Traceback (most recent call last): +SyntaxError: invalid syntax + From compiler_complex_args(): >>> def f(None=1): @@ -135,7 +234,6 @@ Traceback (most recent call last): SyntaxError: invalid syntax - From ast_for_arguments(): >>> def f(x, y=1, z): @@ -158,6 +256,16 @@ Traceback (most recent call last): SyntaxError: invalid syntax +>>> import ast; ast.parse(''' +... def f( +... *, # type: int +... a, # type: int +... ): +... pass +... ''', type_comments=True) +Traceback (most recent call last): +SyntaxError: bare * has associated type comment + From ast_for_funcdef(): @@ -297,47 +405,50 @@ ... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299) ->>> f(lambda x: x[0] = 3) -Traceback (most recent call last): -SyntaxError: expression cannot contain assignment, perhaps you meant "=="? +# >>> f(lambda x: x[0] = 3) +# Traceback (most recent call last): +# SyntaxError: expression cannot contain assignment, perhaps you meant "=="? The grammar accepts any test (basically, any expression) in the keyword slot of a call site. Test a few different options. ->>> f(x()=2) -Traceback (most recent call last): -SyntaxError: expression cannot contain assignment, perhaps you meant "=="? ->>> f(a or b=1) -Traceback (most recent call last): -SyntaxError: expression cannot contain assignment, perhaps you meant "=="? ->>> f(x.y=1) -Traceback (most recent call last): -SyntaxError: expression cannot contain assignment, perhaps you meant "=="? ->>> f((x)=2) -Traceback (most recent call last): -SyntaxError: expression cannot contain assignment, perhaps you meant "=="? ->>> f(True=2) -Traceback (most recent call last): -SyntaxError: cannot assign to True +# >>> f(x()=2) +# Traceback (most recent call last): +# SyntaxError: expression cannot contain assignment, perhaps you meant "=="? +# >>> f(a or b=1) +# Traceback (most recent call last): +# SyntaxError: expression cannot contain assignment, perhaps you meant "=="? +# >>> f(x.y=1) +# Traceback (most recent call last): +# SyntaxError: expression cannot contain assignment, perhaps you meant "=="? +# >>> f((x)=2) +# Traceback (most recent call last): +# SyntaxError: expression cannot contain assignment, perhaps you meant "=="? +# >>> f(True=2) +# Traceback (most recent call last): +# SyntaxError: cannot assign to True >>> f(__debug__=1) Traceback (most recent call last): SyntaxError: cannot assign to __debug__ +>>> __debug__: int +Traceback (most recent call last): +SyntaxError: cannot assign to __debug__ More set_context(): >>> (x for x in x) += 1 Traceback (most recent call last): -SyntaxError: cannot assign to generator expression +SyntaxError: 'generator expression' is an illegal expression for augmented assignment >>> None += 1 Traceback (most recent call last): -SyntaxError: cannot assign to None +SyntaxError: 'None' is an illegal expression for augmented assignment >>> __debug__ += 1 Traceback (most recent call last): SyntaxError: cannot assign to __debug__ >>> f() += 1 Traceback (most recent call last): -SyntaxError: cannot assign to function call +SyntaxError: 'function call' is an illegal expression for augmented assignment Test continue in finally in weird combinations. @@ -588,7 +699,7 @@ >>> f(a=23, a=234) Traceback (most recent call last): ... -SyntaxError: keyword argument repeated +SyntaxError: keyword argument repeated: a >>> {1, 2, 3} = 42 Traceback (most recent call last): @@ -606,6 +717,27 @@ Traceback (most recent call last): SyntaxError: cannot assign to f-string expression +>>> from t import x, +Traceback (most recent call last): +SyntaxError: trailing comma not allowed without surrounding parentheses + +>>> from t import x,y, +Traceback (most recent call last): +SyntaxError: trailing comma not allowed without surrounding parentheses + +>>> (): int +Traceback (most recent call last): +SyntaxError: only single target (not tuple) can be annotated +>>> []: int +Traceback (most recent call last): +SyntaxError: only single target (not list) can be annotated +>>> (()): int +Traceback (most recent call last): +SyntaxError: only single target (not tuple) can be annotated +>>> ([]): int +Traceback (most recent call last): +SyntaxError: only single target (not list) can be annotated + Corner-cases that used to fail to raise the correct error: >>> def f(*, x=lambda __debug__:0): pass @@ -634,6 +766,9 @@ Traceback (most recent call last): SyntaxError: cannot assign to __debug__ + >>> import ä £ + Traceback (most recent call last): + SyntaxError: invalid character '£' (U+00A3) """ import re @@ -658,7 +793,7 @@ def _check_error(self, code, errtext, self.fail("SyntaxError is not a %s" % subclass.__name__) mo = re.search(errtext, str(err)) if mo is None: - self.fail("SyntaxError did not contain '%r'" % (errtext,)) + self.fail("SyntaxError did not contain %r" % (errtext,)) self.assertEqual(err.filename, filename) if lineno is not None: self.assertEqual(err.lineno, lineno) @@ -667,11 +802,43 @@ def _check_error(self, code, errtext, else: self.fail("compile() did not raise SyntaxError") + def test_curly_brace_after_primary_raises_immediately(self): + self._check_error("f{", "invalid syntax", mode="single") + def test_assign_call(self): self._check_error("f() = 1", "assign") + @unittest.skipIf(support.use_old_parser(), "The old parser cannot generate these error messages") def test_assign_del(self): - self._check_error("del f()", "delete") + self._check_error("del (,)", "invalid syntax") + self._check_error("del 1", "delete literal") + self._check_error("del (1, 2)", "delete literal") + self._check_error("del None", "delete None") + self._check_error("del *x", "delete starred") + self._check_error("del (*x)", "use starred expression") + self._check_error("del (*x,)", "delete starred") + self._check_error("del [*x,]", "delete starred") + self._check_error("del f()", "delete function call") + self._check_error("del f(a, b)", "delete function call") + self._check_error("del o.f()", "delete function call") + self._check_error("del a[0]()", "delete function call") + self._check_error("del x, f()", "delete function call") + self._check_error("del f(), x", "delete function call") + self._check_error("del [a, b, ((c), (d,), e.f())]", "delete function call") + self._check_error("del (a if True else b)", "delete conditional") + self._check_error("del +a", "delete operator") + self._check_error("del a, +b", "delete operator") + self._check_error("del a + b", "delete operator") + self._check_error("del (a + b, c)", "delete operator") + self._check_error("del (c[0], a + b)", "delete operator") + self._check_error("del a.b.c + 2", "delete operator") + self._check_error("del a.b.c[0] + 2", "delete operator") + self._check_error("del (a, b, (c, d.e.f + 2))", "delete operator") + self._check_error("del [a, b, (c, d.e.f[0] + 2)]", "delete operator") + self._check_error("del (a := 5)", "delete named expression") + # We don't have a special message for this, but make sure we don't + # report "cannot delete name" + self._check_error("del a += b", "invalid syntax") def test_global_param_err_first(self): source = """if 1: @@ -766,6 +933,54 @@ def test_kwargs_last3(self): "iterable argument unpacking follows " "keyword argument unpacking") + def test_empty_line_after_linecont(self): + # See issue-40847 + s = r"""\ +pass + \ + +pass +""" + try: + compile(s, '', 'exec') + except SyntaxError: + self.fail("Empty line after a line continuation character is valid.") + + @support.cpython_only + def test_nested_named_except_blocks(self): + code = "" + for i in range(12): + code += f"{' '*i}try:\n" + code += f"{' '*(i+1)}raise Exception\n" + code += f"{' '*i}except Exception as e:\n" + code += f"{' '*4*12}pass" + self._check_error(code, "too many statically nested blocks") + + def test_barry_as_flufl_with_syntax_errors(self): + # The "barry_as_flufl" rule can produce some "bugs-at-a-distance" if + # is reading the wrong token in the presence of syntax errors later + # in the file. See bpo-42214 for more information. + code = """ +def func1(): + if a != b: + raise ValueError + +def func2(): + try + return 1 + finally: + pass +""" + self._check_error(code, "invalid syntax") + + def test_invalid_line_continuation_left_recursive(self): + # Check bpo-42218: SyntaxErrors following left-recursive rules + # (t_primary_raw in this case) need to be tested explicitly + self._check_error("A.\u018a\\ ", + "unexpected character after line continuation character") + self._check_error("A.\u03bc\\\n", + "unexpected EOF while parsing") + def test_main(): support.run_unittest(SyntaxTestCase) from test import test_syntax diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index af0e54bd0e2386396d4e08e377085a1ec94318af..d79151355eab1d3a9d397bacfa8975fd03dd6b58 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -187,15 +187,6 @@ def test_getdefaultencoding(self): # testing sys.settrace() is done in test_sys_settrace.py # testing sys.setprofile() is done in test_sys_setprofile.py - def test_setcheckinterval(self): - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - self.assertRaises(TypeError, sys.setcheckinterval) - orig = sys.getcheckinterval() - for n in 0, 100, 120, orig: # orig last to restore starting state - sys.setcheckinterval(n) - self.assertEqual(sys.getcheckinterval(), n) - def test_switchinterval(self): self.assertRaises(TypeError, sys.setswitchinterval) self.assertRaises(TypeError, sys.setswitchinterval, "a") @@ -250,7 +241,7 @@ def test_setrecursionlimit_recursion_depth(self): # mark". Otherwise, it may not be possible anymore to # reset the overflowed flag to 0. - from _testcapi import get_recursion_depth + from _testinternalcapi import get_recursion_depth def set_recursion_limit_at_depth(depth, limit): recursion_depth = get_recursion_depth() @@ -278,6 +269,8 @@ def set_recursion_limit_at_depth(depth, limit): finally: sys.setrecursionlimit(oldlimit) + # The error message is specific to CPython + @test.support.cpython_only def test_recursionlimit_fatalerror(self): # A fatal error occurs if a second recursion limit is hit when recovering # from a first one. @@ -299,7 +292,8 @@ def f(): err = sub.communicate()[1] self.assertTrue(sub.returncode, sub.returncode) self.assertIn( - b"Fatal Python error: Cannot recover from stack overflow", + b"Fatal Python error: _Py_CheckRecursiveCall: " + b"Cannot recover from stack overflow", err) def test_getwindowsversion(self): @@ -492,6 +486,7 @@ def test_attributes(self): self.assertIsInstance(sys.platform, str) self.assertIsInstance(sys.prefix, str) self.assertIsInstance(sys.base_prefix, str) + self.assertIsInstance(sys.platlibdir, str) self.assertIsInstance(sys.version, str) vi = sys.version_info self.assertIsInstance(vi[:], tuple) @@ -551,10 +546,10 @@ def __hash__(self): def test_sys_flags(self): self.assertTrue(sys.flags) attrs = ("debug", - "inspect", "interactive", "optimize", "dont_write_bytecode", - "no_user_site", "no_site", "ignore_environment", "verbose", - "bytes_warning", "quiet", "hash_randomization", "isolated", - "dev_mode", "utf8_mode") + "inspect", "interactive", "optimize", + "dont_write_bytecode", "no_user_site", "no_site", + "ignore_environment", "verbose", "bytes_warning", "quiet", + "hash_randomization", "isolated", "dev_mode", "utf8_mode") for attr in attrs: self.assertTrue(hasattr(sys.flags, attr), attr) attr_type = bool if attr == "dev_mode" else int @@ -828,7 +823,6 @@ def test_getallocatedblocks(self): c = sys.getallocatedblocks() self.assertIn(c, range(b - 50, b + 50)) - @test.support.requires_type_collecting def test_is_finalizing(self): self.assertIs(sys.is_finalizing(), False) # Don't use the atexit module because _Py_Finalizing is only set @@ -850,7 +844,6 @@ def __del__(self): rc, stdout, stderr = assert_python_ok('-c', code) self.assertEqual(stdout.rstrip(), b'True') - @test.support.requires_type_collecting def test_issue20602(self): # sys.flags and sys.float_info were wiped during shutdown. code = """if 1: @@ -866,6 +859,23 @@ def __del__(self, sys=sys): self.assertIn(b'sys.flags', out[0]) self.assertIn(b'sys.float_info', out[1]) + def test_sys_ignores_cleaning_up_user_data(self): + code = """if 1: + import struct, sys + + class C: + def __init__(self): + self.pack = struct.pack + def __del__(self): + self.pack('I', -42) + + sys.x = C() + """ + rc, stdout, stderr = assert_python_ok('-c', code) + self.assertEqual(rc, 0) + self.assertEqual(stdout.rstrip(), b"") + self.assertEqual(stderr.rstrip(), b"") + @unittest.skipUnless(hasattr(sys, 'getandroidapilevel'), 'need sys.getandroidapilevel()') def test_getandroidapilevel(self): @@ -1047,8 +1057,8 @@ class SizeofTest(unittest.TestCase): def setUp(self): self.P = struct.calcsize('P') self.longdigit = sys.int_info.sizeof_digit - import _testcapi - self.gc_headsize = _testcapi.SIZEOF_PYGC_HEAD + import _testinternalcapi + self.gc_headsize = _testinternalcapi.SIZEOF_PYGC_HEAD check_sizeof = test.support.check_sizeof @@ -1231,7 +1241,7 @@ def get_gen(): yield 1 # list samples = [[], [1,2,3], ['1', '2', '3']] for sample in samples: - check(sample, vsize('Pn') + len(sample)*self.P) + check(list(sample), vsize('Pn') + len(sample)*self.P) # sortwrapper (list) # XXX # cmpwrapper (list) @@ -1303,9 +1313,7 @@ def delx(self): del self.__x check((1,2,3), vsize('') + 3*self.P) # type # static type: PyTypeObject - fmt = 'P2nPI13Pl4Pn9Pn11PIPPP' - if hasattr(sys, 'getcounts'): - fmt += '3n2P' + fmt = 'P2nPI13Pl4Pn9Pn11PIPP' s = vsize(fmt) check(int, s) # class @@ -1315,7 +1323,7 @@ def delx(self): del self.__x '3P' # PyMappingMethods '10P' # PySequenceMethods '2P' # PyBufferProcs - '4P') + '5P') class newstyleclass(object): pass # Separate block for PyDictKeysObject with 8 keys and 5 entries check(newstyleclass, s + calcsize("2nP2n0P") + 8 + 5*calcsize("n2P")) diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index fdd789475d04dc4ea2e584886e03062cb199ecc0..482e918acac574a54df23ae90a89ee2ec74b3601 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -161,8 +161,8 @@ def raises(): def test_raise(): try: raises() - except Exception as exc: - x = 1 + except Exception: + pass test_raise.events = [(0, 'call'), (1, 'line'), @@ -191,7 +191,7 @@ def _settrace_and_raise(tracefunc): def settrace_and_raise(tracefunc): try: _settrace_and_raise(tracefunc) - except RuntimeError as exc: + except RuntimeError: pass settrace_and_raise.events = [(2, 'exception'), @@ -481,6 +481,127 @@ def func(): [(0, 'call'), (1, 'line')]) + def test_18_except_with_name(self): + def func(): + try: + try: + raise Exception + except Exception as e: + raise + x = "Something" + y = "Something" + except Exception: + pass + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (2, 'line'), + (3, 'line'), + (3, 'exception'), + (4, 'line'), + (5, 'line'), + (8, 'line'), + (9, 'line'), + (9, 'return')]) + + def test_19_except_with_finally(self): + def func(): + try: + try: + raise Exception + finally: + y = "Something" + except Exception: + b = 23 + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (2, 'line'), + (3, 'line'), + (3, 'exception'), + (5, 'line'), + (6, 'line'), + (7, 'line'), + (7, 'return')]) + + def test_20_async_for_loop(self): + class AsyncIteratorWrapper: + def __init__(self, obj): + self._it = iter(obj) + + def __aiter__(self): + return self + + async def __anext__(self): + try: + return next(self._it) + except StopIteration: + raise StopAsyncIteration + + async def doit_async(): + async for letter in AsyncIteratorWrapper("abc"): + x = letter + y = 42 + + def run(tracer): + x = doit_async() + try: + sys.settrace(tracer) + x.send(None) + finally: + sys.settrace(None) + + tracer = self.make_tracer() + events = [ + (0, 'call'), + (1, 'line'), + (-12, 'call'), + (-11, 'line'), + (-11, 'return'), + (-9, 'call'), + (-8, 'line'), + (-8, 'return'), + (-6, 'call'), + (-5, 'line'), + (-4, 'line'), + (-4, 'return'), + (1, 'exception'), + (2, 'line'), + (1, 'line'), + (-6, 'call'), + (-5, 'line'), + (-4, 'line'), + (-4, 'return'), + (1, 'exception'), + (2, 'line'), + (1, 'line'), + (-6, 'call'), + (-5, 'line'), + (-4, 'line'), + (-4, 'return'), + (1, 'exception'), + (2, 'line'), + (1, 'line'), + (-6, 'call'), + (-5, 'line'), + (-4, 'line'), + (-4, 'exception'), + (-3, 'line'), + (-2, 'line'), + (-2, 'exception'), + (-2, 'return'), + (1, 'exception'), + (3, 'line'), + (3, 'return')] + try: + run(tracer.trace) + except Exception: + pass + self.compare_events(doit_async.__code__.co_firstlineno, + tracer.events, events) + class SkipLineEventsTraceTestCase(TraceTestCase): """Repeat the trace tests, but with per-line events skipped""" @@ -827,8 +948,8 @@ def test_jump_in_nested_finally_3(output): output.append(11) output.append(12) - @jump_test(5, 11, [2, 4, 12]) - def test_jump_over_return_try_finally_in_finally_block(output): + @jump_test(5, 11, [2, 4], (ValueError, 'unreachable')) + def test_no_jump_over_return_try_finally_in_finally_block(output): try: output.append(2) finally: @@ -842,8 +963,8 @@ def test_jump_over_return_try_finally_in_finally_block(output): pass output.append(12) - @jump_test(3, 4, [1, 4]) - def test_jump_infinite_while_loop(output): + @jump_test(3, 4, [1], (ValueError, 'unreachable')) + def test_no_jump_infinite_while_loop(output): output.append(1) while True: output.append(3) @@ -1236,16 +1357,16 @@ def test_no_jump_between_except_blocks_2(output): output.append(7) output.append(8) - @jump_test(1, 5, [], (ValueError, "into a 'finally'")) - def test_no_jump_into_finally_block(output): + @jump_test(1, 5, [5]) + def test_jump_into_finally_block(output): output.append(1) try: output.append(3) finally: output.append(5) - @jump_test(3, 6, [2, 5, 6], (ValueError, "into a 'finally'")) - def test_no_jump_into_finally_block_from_try_block(output): + @jump_test(3, 6, [2, 6, 7]) + def test_jump_into_finally_block_from_try_block(output): try: output.append(2) output.append(3) @@ -1254,8 +1375,8 @@ def test_no_jump_into_finally_block_from_try_block(output): output.append(6) output.append(7) - @jump_test(5, 1, [1, 3], (ValueError, "out of a 'finally'")) - def test_no_jump_out_of_finally_block(output): + @jump_test(5, 1, [1, 3, 1, 3, 5]) + def test_jump_out_of_finally_block(output): output.append(1) try: output.append(3) @@ -1320,23 +1441,23 @@ def test_no_jump_out_of_qualified_except_block(output): output.append(6) output.append(7) - @jump_test(3, 5, [1, 2, -2], (ValueError, 'into')) - def test_no_jump_between_with_blocks(output): + @jump_test(3, 5, [1, 2, 5, -2]) + def test_jump_between_with_blocks(output): output.append(1) with tracecontext(output, 2): output.append(3) with tracecontext(output, 4): output.append(5) - @async_jump_test(3, 5, [1, 2, -2], (ValueError, 'into')) - async def test_no_jump_between_async_with_blocks(output): + @async_jump_test(3, 5, [1, 2, 5, -2]) + async def test_jump_between_async_with_blocks(output): output.append(1) async with asynctracecontext(output, 2): output.append(3) async with asynctracecontext(output, 4): output.append(5) - @jump_test(5, 7, [2, 4], (ValueError, 'finally')) + @jump_test(5, 7, [2, 4], (ValueError, "unreachable")) def test_no_jump_over_return_out_of_finally_block(output): try: output.append(2) @@ -1430,9 +1551,8 @@ def test_no_jump_from_exception_event(output): output.append(1) 1 / 0 - @jump_test(3, 2, [2], event='return', error=(ValueError, - "can't jump from a yield statement")) - def test_no_jump_from_yield(output): + @jump_test(3, 2, [2, 5], event='return') + def test_jump_from_yield(output): def gen(): output.append(2) yield 3 diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py index 44e44bf5ea995f0c601e21a96a3780cd44ee08c6..0ca5c9390dbb9a1aec47dce9ee5bbd5992e23d29 100644 --- a/Lib/test/test_sysconfig.py +++ b/Lib/test/test_sysconfig.py @@ -358,10 +358,12 @@ def test_SO_value(self): @unittest.skipIf(sysconfig.get_config_var('EXT_SUFFIX') is None, 'EXT_SUFFIX required for this test') - def test_SO_in_vars(self): + def test_EXT_SUFFIX_in_vars(self): + import _imp vars = sysconfig.get_config_vars() self.assertIsNotNone(vars['SO']) self.assertEqual(vars['SO'], vars['EXT_SUFFIX']) + self.assertEqual(vars['EXT_SUFFIX'], _imp.extension_suffixes()[0]) @unittest.skipUnless(sys.platform == 'linux' and hasattr(sys.implementation, '_multiarch'), diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index b512168d6ea87017d1acd602f281d25b681d4054..29cde91bf7fc130e26ea893313fac849936109cf 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -11,7 +11,7 @@ import tarfile from test import support -from test.support import script_helper, requires_hashdigest +from test.support import script_helper # Check for our compression modules. try: @@ -57,21 +57,21 @@ class TarTest: def mode(self): return self.prefix + self.suffix -@support.requires_gzip +@support.requires_gzip() class GzipTest: tarname = gzipname suffix = 'gz' open = gzip.GzipFile if gzip else None taropen = tarfile.TarFile.gzopen -@support.requires_bz2 +@support.requires_bz2() class Bz2Test: tarname = bz2name suffix = 'bz2' open = bz2.BZ2File if bz2 else None taropen = tarfile.TarFile.bz2open -@support.requires_lzma +@support.requires_lzma() class LzmaTest: tarname = xzname suffix = 'xz' @@ -319,6 +319,38 @@ class LzmaListTest(LzmaTest, ListTest): class CommonReadTest(ReadTest): + def test_is_tarfile_erroneous(self): + with open(tmpname, "wb"): + pass + + # is_tarfile works on filenames + self.assertFalse(tarfile.is_tarfile(tmpname)) + + # is_tarfile works on path-like objects + self.assertFalse(tarfile.is_tarfile(pathlib.Path(tmpname))) + + # is_tarfile works on file objects + with open(tmpname, "rb") as fobj: + self.assertFalse(tarfile.is_tarfile(fobj)) + + # is_tarfile works on file-like objects + self.assertFalse(tarfile.is_tarfile(io.BytesIO(b"invalid"))) + + def test_is_tarfile_valid(self): + # is_tarfile works on filenames + self.assertTrue(tarfile.is_tarfile(self.tarname)) + + # is_tarfile works on path-like objects + self.assertTrue(tarfile.is_tarfile(pathlib.Path(self.tarname))) + + # is_tarfile works on file objects + with open(self.tarname, "rb") as fobj: + self.assertTrue(tarfile.is_tarfile(fobj)) + + # is_tarfile works on file-like objects + with open(self.tarname, "rb") as fobj: + self.assertTrue(tarfile.is_tarfile(io.BytesIO(fobj.read()))) + def test_empty_tarfile(self): # Test for issue6123: Allow opening empty archives. # This test checks if tarfile.open() is able to open an empty tar @@ -354,7 +386,7 @@ def test_null_tarfile(self): def test_ignore_zeros(self): # Test TarFile's ignore_zeros option. # generate 512 pseudorandom bytes - data = Random(0).getrandbits(512*8).to_bytes(512, 'big') + data = Random(0).randbytes(512) for char in (b'\0', b'a'): # Test if EOFHeaderError ('\0') and InvalidHeaderError ('a') # are ignored correctly. @@ -1314,10 +1346,10 @@ def test_extractall_symlinks(self): f.write('something\n') os.symlink(source_file, target_file) with tarfile.open(temparchive, 'w') as tar: - tar.add(source_file) - tar.add(target_file) + tar.add(source_file, arcname="source") + tar.add(target_file, arcname="symlink") # Let's extract it to the location which contains the symlink - with tarfile.open(temparchive) as tar: + with tarfile.open(temparchive, errorlevel=2) as tar: # this should not raise OSError: [Errno 17] File exists try: tar.extractall(path=tempdir) @@ -1384,12 +1416,15 @@ def write(self, data): pax_headers={'non': 'empty'}) self.assertFalse(f.closed) + class GzipWriteTest(GzipTest, WriteTest): pass + class Bz2WriteTest(Bz2Test, WriteTest): pass + class LzmaWriteTest(LzmaTest, WriteTest): pass @@ -1432,8 +1467,17 @@ def test_file_mode(self): finally: os.umask(original_umask) + class GzipStreamWriteTest(GzipTest, StreamWriteTest): - pass + def test_source_directory_not_leaked(self): + """ + Ensure the source directory is not included in the tar header + per bpo-41316. + """ + tarfile.open(tmpname, self.mode).close() + payload = pathlib.Path(tmpname).read_text(encoding='latin-1') + assert os.path.dirname(tmpname) not in payload + class Bz2StreamWriteTest(Bz2Test, StreamWriteTest): decompressor = bz2.BZ2Decompressor if bz2 else None @@ -1524,6 +1568,52 @@ def test_longnamelink_1025(self): ("longlnk/" * 127) + "longlink_") +class DeviceHeaderTest(WriteTestBase, unittest.TestCase): + + prefix = "w:" + + def test_headers_written_only_for_device_files(self): + # Regression test for bpo-18819. + tempdir = os.path.join(TEMPDIR, "device_header_test") + os.mkdir(tempdir) + try: + tar = tarfile.open(tmpname, self.mode) + try: + input_blk = tarfile.TarInfo(name="my_block_device") + input_reg = tarfile.TarInfo(name="my_regular_file") + input_blk.type = tarfile.BLKTYPE + input_reg.type = tarfile.REGTYPE + tar.addfile(input_blk) + tar.addfile(input_reg) + finally: + tar.close() + + # devmajor and devminor should be *interpreted* as 0 in both... + tar = tarfile.open(tmpname, "r") + try: + output_blk = tar.getmember("my_block_device") + output_reg = tar.getmember("my_regular_file") + finally: + tar.close() + self.assertEqual(output_blk.devmajor, 0) + self.assertEqual(output_blk.devminor, 0) + self.assertEqual(output_reg.devmajor, 0) + self.assertEqual(output_reg.devminor, 0) + + # ...but the fields should not actually be set on regular files: + with open(tmpname, "rb") as infile: + buf = infile.read() + buf_blk = buf[output_blk.offset:output_blk.offset_data] + buf_reg = buf[output_reg.offset:output_reg.offset_data] + # See `struct posixheader` in GNU docs for byte offsets: + # + device_headers = slice(329, 329 + 16) + self.assertEqual(buf_blk[device_headers], b"0000000\0" * 2) + self.assertEqual(buf_reg[device_headers], b"\0" * 16) + finally: + support.rmtree(tempdir) + + class CreateTest(WriteTestBase, unittest.TestCase): prefix = "x:" @@ -2234,7 +2324,8 @@ def test_test_command(self): def test_test_command_verbose(self): for tar_name in testtarnames: for opt in '-v', '--verbose': - out = self.tarfilecmd(opt, '-t', tar_name) + out = self.tarfilecmd(opt, '-t', tar_name, + PYTHONIOENCODING='utf-8') self.assertIn(b'is a tar archive.\n', out) def test_test_command_invalid_file(self): @@ -2305,7 +2396,8 @@ def test_create_command_verbose(self): 'and-utf8-bom-sig-only.txt')] for opt in '-v', '--verbose': try: - out = self.tarfilecmd(opt, '-c', tmpname, *files) + out = self.tarfilecmd(opt, '-c', tmpname, *files, + PYTHONIOENCODING='utf-8') self.assertIn(b' file created.', out) with tarfile.open(tmpname) as tar: tar.getmembers() @@ -2363,7 +2455,8 @@ def test_extract_command_verbose(self): for opt in '-v', '--verbose': try: with support.temp_cwd(tarextdir): - out = self.tarfilecmd(opt, '-e', tmpname) + out = self.tarfilecmd(opt, '-e', tmpname, + PYTHONIOENCODING='utf-8') self.assertIn(b' file is extracted.', out) finally: support.rmtree(tarextdir) diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py index 3183ea850f73b77c2b9ed20eeac547a5d90185bf..0bbb39b147ea1e543afec9cb29dbd2bab97a0dd9 100644 --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -1,8 +1,10 @@ import unittest +import locale import re import subprocess import sys import os +import warnings from test import support # Skip this test if the _tkinter module wasn't built. @@ -58,6 +60,10 @@ def test_eval_null_in_result(self): tcl = self.interp self.assertEqual(tcl.eval('set a "a\\0b"'), 'a\x00b') + def test_eval_surrogates_in_result(self): + tcl = self.interp + self.assertIn(tcl.eval(r'set a "<\ud83d\udcbb>"'), '<\U0001f4bb>') + def testEvalException(self): tcl = self.interp self.assertRaises(TclError,tcl.eval,'set a') @@ -130,10 +136,14 @@ def testUnsetVarException(self): def get_integers(self): integers = (0, 1, -1, 2**31-1, -2**31, 2**31, -2**31-1, 2**63-1, -2**63) - # bignum was added in Tcl 8.5, but its support is able only since 8.5.8 - if (get_tk_patchlevel() >= (8, 6, 0, 'final') or - (8, 5, 8) <= get_tk_patchlevel() < (8, 6)): - integers += (2**63, -2**63-1, 2**1000, -2**1000) + # bignum was added in Tcl 8.5, but its support is able only since 8.5.8. + # Actually it is determined at compile time, so using get_tk_patchlevel() + # is not reliable. + # TODO: expose full static version. + if tcl_version >= (8, 5): + v = get_tk_patchlevel() + if v >= (8, 6, 0, 'final') or (8, 5, 8) <= v < (8, 6): + integers += (2**63, -2**63-1, 2**1000, -2**1000) return integers def test_getint(self): @@ -190,29 +200,48 @@ def test_getboolean(self): def testEvalFile(self): tcl = self.interp - with open(support.TESTFN, 'w') as f: - self.addCleanup(support.unlink, support.TESTFN) + filename = support.TESTFN_ASCII + self.addCleanup(support.unlink, filename) + with open(filename, 'w') as f: f.write("""set a 1 set b 2 set c [ expr $a + $b ] """) - tcl.evalfile(support.TESTFN) + tcl.evalfile(filename) self.assertEqual(tcl.eval('set a'),'1') self.assertEqual(tcl.eval('set b'),'2') self.assertEqual(tcl.eval('set c'),'3') def test_evalfile_null_in_result(self): tcl = self.interp - with open(support.TESTFN, 'w') as f: - self.addCleanup(support.unlink, support.TESTFN) + filename = support.TESTFN_ASCII + self.addCleanup(support.unlink, filename) + with open(filename, 'w') as f: f.write(""" set a "a\0b" set b "a\\0b" """) - tcl.evalfile(support.TESTFN) + tcl.evalfile(filename) self.assertEqual(tcl.eval('set a'), 'a\x00b') self.assertEqual(tcl.eval('set b'), 'a\x00b') + def test_evalfile_surrogates_in_result(self): + tcl = self.interp + encoding = tcl.call('encoding', 'system') + self.addCleanup(tcl.call, 'encoding', 'system', encoding) + tcl.call('encoding', 'system', 'utf-8') + + filename = support.TESTFN_ASCII + self.addCleanup(support.unlink, filename) + with open(filename, 'wb') as f: + f.write(b""" + set a "<\xed\xa0\xbd\xed\xb2\xbb>" + set b "<\\ud83d\\udcbb>" + """) + tcl.evalfile(filename) + self.assertEqual(tcl.eval('set a'), '<\U0001f4bb>') + self.assertEqual(tcl.eval('set b'), '<\U0001f4bb>') + def testEvalFileException(self): tcl = self.interp filename = "doesnotexists" @@ -418,7 +447,7 @@ def test_expr_bignum(self): else: self.assertEqual(result, str(i)) self.assertIsInstance(result, str) - if tcl_version < (8, 5): # bignum was added in Tcl 8.5 + if get_tk_patchlevel() < (8, 5): # bignum was added in Tcl 8.5 self.assertRaises(TclError, tcl.call, 'expr', str(2**1000)) def test_passing_values(self): @@ -435,6 +464,11 @@ def passValue(value): self.assertEqual(passValue('str\x00ing\u20ac'), 'str\x00ing\u20ac') self.assertEqual(passValue('str\x00ing\U0001f4bb'), 'str\x00ing\U0001f4bb') + if sys.platform != 'win32': + self.assertEqual(passValue('<\udce2\udc82\udcac>'), + '<\u20ac>') + self.assertEqual(passValue('<\udced\udca0\udcbd\udced\udcb2\udcbb>'), + '<\U0001f4bb>') self.assertEqual(passValue(b'str\x00ing'), b'str\x00ing' if self.wantobjects else 'str\x00ing') self.assertEqual(passValue(b'str\xc0\x80ing'), @@ -494,6 +528,9 @@ def float_eq(actual, expected): check('string\xbd') check('string\u20ac') check('string\U0001f4bb') + if sys.platform != 'win32': + check('<\udce2\udc82\udcac>', '<\u20ac>') + check('<\udced\udca0\udcbd\udced\udcb2\udcbb>', '<\U0001f4bb>') check('') check(b'string', 'string') check(b'string\xe2\x82\xac', 'string\xe2\x82\xac') @@ -537,6 +574,8 @@ def test_splitlist(self): ('a \u20ac', ('a', '\u20ac')), ('a \U0001f4bb', ('a', '\U0001f4bb')), (b'a \xe2\x82\xac', ('a', '\u20ac')), + (b'a \xf0\x9f\x92\xbb', ('a', '\U0001f4bb')), + (b'a \xed\xa0\xbd\xed\xb2\xbb', ('a', '\U0001f4bb')), (b'a\xc0\x80b c\xc0\x80d', ('a\x00b', 'c\x00d')), ('a {b c}', ('a', 'b c')), (r'a b\ c', ('a', 'b c')), @@ -573,9 +612,12 @@ def test_splitlist(self): def test_split(self): split = self.interp.tk.split call = self.interp.tk.call - self.assertRaises(TypeError, split) - self.assertRaises(TypeError, split, 'a', 'b') - self.assertRaises(TypeError, split, 2) + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', r'\bsplit\b.*\bsplitlist\b', + DeprecationWarning) + self.assertRaises(TypeError, split) + self.assertRaises(TypeError, split, 'a', 'b') + self.assertRaises(TypeError, split, 2) testcases = [ ('2', '2'), ('', ''), @@ -617,7 +659,8 @@ def test_split(self): expected), ] for arg, res in testcases: - self.assertEqual(split(arg), res, msg=arg) + with self.assertWarns(DeprecationWarning): + self.assertEqual(split(arg), res, msg=arg) def test_splitdict(self): splitdict = tkinter._splitdict diff --git a/Lib/test/test_telnetlib.py b/Lib/test/test_telnetlib.py index 414c328b79f9500f6acef97e5c6b2c9a8b96707c..7633901c96c84e863bb4c52f905828278d869289 100644 --- a/Lib/test/test_telnetlib.py +++ b/Lib/test/test_telnetlib.py @@ -5,9 +5,10 @@ import contextlib from test import support +from test.support import socket_helper import unittest -HOST = support.HOST +HOST = socket_helper.HOST def server(evt, serv): serv.listen() @@ -26,7 +27,7 @@ def setUp(self): self.evt = threading.Event() self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.settimeout(60) # Safety net. Look issue 11812 - self.port = support.bind_port(self.sock) + self.port = socket_helper.bind_port(self.sock) self.thread = threading.Thread(target=server, args=(self.evt,self.sock)) self.thread.setDaemon(True) self.thread.start() diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index f129454f4c33eea3d26df07234b75ab133f4ce9e..fcc706ede5aaa2861d62c428ef15744f7562ee5b 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -4,12 +4,12 @@ import io import os import pathlib -import signal import sys import re import warnings import contextlib import stat +import types import weakref from unittest import mock @@ -200,15 +200,7 @@ def test_process_awareness(self): child_value = os.read(read_fd, len(parent_value)).decode("ascii") finally: if pid: - # best effort to ensure the process can't bleed out - # via any bugs above - try: - os.kill(pid, signal.SIGKILL) - except OSError: - pass - - # Read the process exit status to avoid zombie process - os.waitpid(pid, 0) + support.wait_process(pid, exitcode=0) os.close(read_fd) os.close(write_fd) @@ -1231,6 +1223,9 @@ def test_truncate_with_size_parameter(self): self.assertTrue(f._rolled) self.assertEqual(os.fstat(f.fileno()).st_size, 20) + def test_class_getitem(self): + self.assertIsInstance(tempfile.SpooledTemporaryFile[bytes], + types.GenericAlias) if tempfile.NamedTemporaryFile is not tempfile.TemporaryFile: diff --git a/Lib/test/test_thread.py b/Lib/test/test_thread.py index 9f4801f47e3aaa456c87a713d71e8021dd7932e4..77e46f2c2f15a0021f6487ce14f01c164d2d592b 100644 --- a/Lib/test/test_thread.py +++ b/Lib/test/test_thread.py @@ -225,30 +225,31 @@ def setUp(self): @unittest.skipUnless(hasattr(os, 'fork'), 'need os.fork') @support.reap_threads def test_forkinthread(self): - status = "not set" + pid = None - def thread1(): - nonlocal status + def fork_thread(read_fd, write_fd): + nonlocal pid # fork in a thread pid = os.fork() - if pid == 0: - # child - try: - os.close(self.read_fd) - os.write(self.write_fd, b"OK") - finally: - os._exit(0) - else: - # parent - os.close(self.write_fd) - pid, status = os.waitpid(pid, 0) + if pid: + # parent process + return + + # child process + try: + os.close(read_fd) + os.write(write_fd, b"OK") + finally: + os._exit(0) with support.wait_threads_exit(): - thread.start_new_thread(thread1, ()) - self.assertEqual(os.read(self.read_fd, 2), b"OK", - "Unable to fork() in thread") - self.assertEqual(status, 0) + thread.start_new_thread(fork_thread, (self.read_fd, self.write_fd)) + self.assertEqual(os.read(self.read_fd, 2), b"OK") + os.close(self.write_fd) + + self.assertIsNotNone(pid) + support.wait_process(pid, exitcode=0) def tearDown(self): try: diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index ac4e7a7e0f53b3eefa9b08864444cfe626555114..c21cdf8eb7be9ca7913e186ee84eef52b569d6f6 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -3,8 +3,7 @@ """ import test.support -from test.support import (verbose, import_module, cpython_only, - requires_type_collecting) +from test.support import verbose, import_module, cpython_only from test.support.script_helper import assert_python_ok, assert_python_failure import random @@ -17,6 +16,7 @@ import os import subprocess import signal +import textwrap from test import lock_tests from test import support @@ -264,7 +264,7 @@ def run(self): self.assertEqual(result, 1) # one thread state modified if verbose: print(" waiting for worker to say it caught the exception") - worker_saw_exception.wait(timeout=10) + worker_saw_exception.wait(timeout=support.SHORT_TIMEOUT) self.assertTrue(t.finished) if verbose: print(" all OK -- joining worker") @@ -287,7 +287,7 @@ def fail_new_thread(*args): finally: threading._start_new_thread = _start_new_thread - def test_finalize_runnning_thread(self): + def test_finalize_running_thread(self): # Issue 1402: the PyGILState_Ensure / _Release functions may be called # very late on python exit: on deallocation of a running thread for # example. @@ -421,8 +421,6 @@ def test_old_threading_api(self): t.setDaemon(True) t.getName() t.setName("name") - with self.assertWarnsRegex(DeprecationWarning, 'use is_alive()'): - t.isAlive() e = threading.Event() e.isSet() threading.activeCount() @@ -441,6 +439,35 @@ def test_daemon_param(self): t = threading.Thread(daemon=True) self.assertTrue(t.daemon) + @unittest.skipUnless(hasattr(os, 'fork'), 'needs os.fork()') + def test_fork_at_exit(self): + # bpo-42350: Calling os.fork() after threading._shutdown() must + # not log an error. + code = textwrap.dedent(""" + import atexit + import os + import sys + from test.support import wait_process + + # Import the threading module to register its "at fork" callback + import threading + + def exit_handler(): + pid = os.fork() + if not pid: + print("child process ok", file=sys.stderr, flush=True) + # child process + sys.exit() + else: + wait_process(pid, exitcode=0) + + # exit_handler() will be called after threading._shutdown() + atexit.register(exit_handler) + """) + _, out, err = assert_python_ok("-c", code) + self.assertEqual(out, b'') + self.assertEqual(err.rstrip(), b'child process ok') + @unittest.skipUnless(hasattr(os, 'fork'), 'test needs fork()') def test_dummy_thread_after_fork(self): # Issue #14308: a dummy thread in the active list doesn't mess up @@ -487,9 +514,7 @@ def test_is_alive_after_fork(self): else: t.join() - pid, status = os.waitpid(pid, 0) - self.assertTrue(os.WIFEXITED(status)) - self.assertEqual(10, os.WEXITSTATUS(status)) + support.wait_process(pid, exitcode=10) def test_main_thread(self): main = threading.main_thread() @@ -509,6 +534,7 @@ def f(): def test_main_thread_after_fork(self): code = """if 1: import os, threading + from test import support pid = os.fork() if pid == 0: @@ -517,7 +543,7 @@ def test_main_thread_after_fork(self): print(main.ident == threading.current_thread().ident) print(main.ident == threading.get_ident()) else: - os.waitpid(pid, 0) + support.wait_process(pid, exitcode=0) """ _, out, err = assert_python_ok("-c", code) data = out.decode().replace('\r', '') @@ -530,6 +556,7 @@ def test_main_thread_after_fork(self): def test_main_thread_after_fork_from_nonmain_thread(self): code = """if 1: import os, threading, sys + from test import support def f(): pid = os.fork() @@ -542,7 +569,7 @@ def f(): # we have to flush before exit. sys.stdout.flush() else: - os.waitpid(pid, 0) + support.wait_process(pid, exitcode=0) th = threading.Thread(target=f) th.start() @@ -553,7 +580,6 @@ def f(): self.assertEqual(err, b"") self.assertEqual(data, "Thread-1\nTrue\nTrue\n") - @requires_type_collecting def test_main_thread_during_shutdown(self): # bpo-31516: current_thread() should still point to the main thread # at shutdown @@ -641,7 +667,7 @@ def f(): finish.release() # When the thread ends, the state_lock can be successfully # acquired. - self.assertTrue(tstate_lock.acquire(timeout=5), False) + self.assertTrue(tstate_lock.acquire(timeout=support.SHORT_TIMEOUT), False) # But is_alive() is still True: we hold _tstate_lock now, which # prevents is_alive() from knowing the thread's end-of-life C code # is done. @@ -762,6 +788,23 @@ def test_shutdown_locks(self): # Daemon threads must never add it to _shutdown_locks. self.assertNotIn(tstate_lock, threading._shutdown_locks) + def test_locals_at_exit(self): + # bpo-19466: thread locals must not be deleted before destructors + # are called + rc, out, err = assert_python_ok("-c", """if 1: + import threading + + class Atexit: + def __del__(self): + print("thread_dict.atexit = %r" % thread_dict.atexit) + + thread_dict = threading.local() + thread_dict.atexit = "value" + + atexit = Atexit() + """) + self.assertEqual(out.rstrip(), b"thread_dict.atexit = 'value'") + class ThreadJoinOnShutdown(BaseTestCase): @@ -799,11 +842,15 @@ def test_1_join_on_shutdown(self): def test_2_join_in_forked_process(self): # Like the test above, but from a forked interpreter script = """if 1: + from test import support + childpid = os.fork() if childpid != 0: - os.waitpid(childpid, 0) + # parent process + support.wait_process(childpid, exitcode=0) sys.exit(0) + # child process t = threading.Thread(target=joiningfunc, args=(threading.current_thread(),)) t.start() @@ -818,13 +865,17 @@ def test_3_join_in_forked_from_thread(self): # In the forked process, the main Thread object must be marked as stopped. script = """if 1: + from test import support + main_thread = threading.current_thread() def worker(): childpid = os.fork() if childpid != 0: - os.waitpid(childpid, 0) + # parent process + support.wait_process(childpid, exitcode=0) sys.exit(0) + # child process t = threading.Thread(target=joiningfunc, args=(main_thread,)) print('end of main') @@ -887,9 +938,9 @@ def do_fork_and_wait(): # just fork a child process and wait it pid = os.fork() if pid > 0: - os.waitpid(pid, 0) + support.wait_process(pid, exitcode=50) else: - os._exit(0) + os._exit(50) # start a bunch of threads that will fork() child processes threads = [] @@ -916,26 +967,30 @@ def test_clear_threads_states_after_fork(self): if pid == 0: # check that threads states have been cleared if len(sys._current_frames()) == 1: - os._exit(0) + os._exit(51) else: - os._exit(1) + os._exit(52) else: - _, status = os.waitpid(pid, 0) - self.assertEqual(0, status) + support.wait_process(pid, exitcode=51) for t in threads: t.join() class SubinterpThreadingTests(BaseTestCase): + def pipe(self): + r, w = os.pipe() + self.addCleanup(os.close, r) + self.addCleanup(os.close, w) + if hasattr(os, 'set_blocking'): + os.set_blocking(r, False) + return (r, w) def test_threads_join(self): # Non-daemon threads should be joined at subinterpreter shutdown # (issue #18808) - r, w = os.pipe() - self.addCleanup(os.close, r) - self.addCleanup(os.close, w) - code = r"""if 1: + r, w = self.pipe() + code = textwrap.dedent(r""" import os import random import threading @@ -953,7 +1008,7 @@ def f(): threading.Thread(target=f).start() random_sleep() - """ % (w,) + """ % (w,)) ret = test.support.run_in_subinterp(code) self.assertEqual(ret, 0) # The thread was joined properly. @@ -964,10 +1019,8 @@ def test_threads_join_2(self): # Python code returned but before the thread state is deleted. # To achieve this, we register a thread-local object which sleeps # a bit when deallocated. - r, w = os.pipe() - self.addCleanup(os.close, r) - self.addCleanup(os.close, w) - code = r"""if 1: + r, w = self.pipe() + code = textwrap.dedent(r""" import os import random import threading @@ -992,7 +1045,7 @@ def f(): threading.Thread(target=f).start() random_sleep() - """ % (w,) + """ % (w,)) ret = test.support.run_in_subinterp(code) self.assertEqual(ret, 0) # The thread was joined properly. @@ -1000,7 +1053,7 @@ def f(): @cpython_only def test_daemon_threads_fatal_error(self): - subinterp_code = r"""if 1: + subinterp_code = f"""if 1: import os import threading import time @@ -1008,7 +1061,7 @@ def test_daemon_threads_fatal_error(self): def f(): # Make sure the daemon thread is still running when # Py_EndInterpreter is called. - time.sleep(10) + time.sleep({test.support.SHORT_TIMEOUT}) threading.Thread(target=f, daemon=True).start() """ script = r"""if 1: @@ -1107,7 +1160,6 @@ def run(): self.assertIn("ZeroDivisionError", err) self.assertNotIn("Unhandled exception", err) - @requires_type_collecting def test_print_exception_stderr_is_none_1(self): script = r"""if True: import sys @@ -1377,5 +1429,55 @@ def test_interrupt_main_noerror(self): signal.signal(signal.SIGINT, handler) +class AtexitTests(unittest.TestCase): + + def test_atexit_output(self): + rc, out, err = assert_python_ok("-c", """if True: + import threading + + def run_last(): + print('parrot') + + threading._register_atexit(run_last) + """) + + self.assertFalse(err) + self.assertEqual(out.strip(), b'parrot') + + def test_atexit_called_once(self): + rc, out, err = assert_python_ok("-c", """if True: + import threading + from unittest.mock import Mock + + mock = Mock() + threading._register_atexit(mock) + mock.assert_not_called() + # force early shutdown to ensure it was called once + threading._shutdown() + mock.assert_called_once() + """) + + self.assertFalse(err) + + def test_atexit_after_shutdown(self): + # The only way to do this is by registering an atexit within + # an atexit, which is intended to raise an exception. + rc, out, err = assert_python_ok("-c", """if True: + import threading + + def func(): + pass + + def run_last(): + threading._register_atexit(func) + + threading._register_atexit(run_last) + """) + + self.assertTrue(err) + self.assertIn("RuntimeError: can't register atexit after shutdown", + err.decode()) + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py index 8d8d31e7825e687e78b6921fe55c2d4ad5e6ac50..6674edc21e9dfaceece2b5e5320ceb49a6c9ace2 100644 --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -825,7 +825,7 @@ def convert_values(ns_timestamps): try: result = pytime_converter(value, time_rnd) expected = expected_func(value) - except Exception as exc: + except Exception: self.fail("Error on timestamp conversion: %s" % debug_info) self.assertEqual(result, expected, @@ -1040,6 +1040,36 @@ def test_object_to_timespec(self): with self.assertRaises(ValueError): pytime_object_to_timespec(float('nan'), time_rnd) +@unittest.skipUnless(sys.platform == "darwin", "test weak linking on macOS") +class TestTimeWeaklinking(unittest.TestCase): + # These test cases verify that weak linking support on macOS works + # as expected. These cases only test new behaviour introduced by weak linking, + # regular behaviour is tested by the normal test cases. + # + # See the section on Weak Linking in Mac/README.txt for more information. + def test_clock_functions(self): + import sysconfig + import platform + + config_vars = sysconfig.get_config_vars() + var_name = "HAVE_CLOCK_GETTIME" + if var_name not in config_vars or not config_vars[var_name]: + raise unittest.SkipTest(f"{var_name} is not available") + + mac_ver = tuple(int(x) for x in platform.mac_ver()[0].split(".")) + + clock_names = [ + "CLOCK_MONOTONIC", "clock_gettime", "clock_gettime_ns", "clock_settime", + "clock_settime_ns", "clock_getres"] + + if mac_ver >= (10, 12): + for name in clock_names: + self.assertTrue(hasattr(time, name), f"time.{name} is not available") + + else: + for name in clock_names: + self.assertFalse(hasattr(time, name), f"time.{name} is available") + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_timeout.py b/Lib/test/test_timeout.py index b07c07cbfc4df6c1bc6521855852f4517ef3a123..ac803f5d63823773ed848c990cb7ba41673e0fd0 100644 --- a/Lib/test/test_timeout.py +++ b/Lib/test/test_timeout.py @@ -3,6 +3,7 @@ import functools import unittest from test import support +from test.support import socket_helper # This requires the 'network' resource as given on the regrtest command line. skip_expected = not support.is_resource_enabled('network') @@ -19,7 +20,7 @@ def resolve_address(host, port): We must perform name resolution before timeout tests, otherwise it will be performed by connect(). """ - with support.transient_internet(host): + with socket_helper.transient_internet(host): return socket.getaddrinfo(host, port, socket.AF_INET, socket.SOCK_STREAM)[0][4] @@ -79,24 +80,24 @@ def testRangeCheck(self): def testTimeoutThenBlocking(self): # Test settimeout() followed by setblocking() self.sock.settimeout(10) - self.sock.setblocking(1) + self.sock.setblocking(True) self.assertEqual(self.sock.gettimeout(), None) - self.sock.setblocking(0) + self.sock.setblocking(False) self.assertEqual(self.sock.gettimeout(), 0.0) self.sock.settimeout(10) - self.sock.setblocking(0) + self.sock.setblocking(False) self.assertEqual(self.sock.gettimeout(), 0.0) - self.sock.setblocking(1) + self.sock.setblocking(True) self.assertEqual(self.sock.gettimeout(), None) def testBlockingThenTimeout(self): # Test setblocking() followed by settimeout() - self.sock.setblocking(0) + self.sock.setblocking(False) self.sock.settimeout(1) self.assertEqual(self.sock.gettimeout(), 1) - self.sock.setblocking(1) + self.sock.setblocking(True) self.sock.settimeout(1) self.assertEqual(self.sock.gettimeout(), 1) @@ -110,7 +111,7 @@ class TimeoutTestCase(unittest.TestCase): # solution. fuzz = 2.0 - localhost = support.HOST + localhost = socket_helper.HOST def setUp(self): raise NotImplementedError() @@ -199,10 +200,7 @@ def testConnectTimeout(self): skip = True sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - # Use a timeout of 3 seconds. Why 3? Because it's more than 1, and - # less than 5. i.e. no particular reason. Feel free to tweak it if - # you feel a different value would be more appropriate. - timeout = 3 + timeout = support.LOOPBACK_TIMEOUT sock.settimeout(timeout) try: sock.connect((whitehole)) @@ -232,25 +230,25 @@ def testConnectTimeout(self): # All that hard work just to test if connect times out in 0.001s ;-) self.addr_remote = blackhole - with support.transient_internet(self.addr_remote[0]): + with socket_helper.transient_internet(self.addr_remote[0]): self._sock_operation(1, 0.001, 'connect', self.addr_remote) def testRecvTimeout(self): # Test recv() timeout - with support.transient_internet(self.addr_remote[0]): + with socket_helper.transient_internet(self.addr_remote[0]): self.sock.connect(self.addr_remote) self._sock_operation(1, 1.5, 'recv', 1024) def testAcceptTimeout(self): # Test accept() timeout - support.bind_port(self.sock, self.localhost) + socket_helper.bind_port(self.sock, self.localhost) self.sock.listen() self._sock_operation(1, 1.5, 'accept') def testSend(self): # Test send() timeout with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as serv: - support.bind_port(serv, self.localhost) + socket_helper.bind_port(serv, self.localhost) serv.listen() self.sock.connect(serv.getsockname()) # Send a lot of data in order to bypass buffering in the TCP stack. @@ -259,7 +257,7 @@ def testSend(self): def testSendto(self): # Test sendto() timeout with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as serv: - support.bind_port(serv, self.localhost) + socket_helper.bind_port(serv, self.localhost) serv.listen() self.sock.connect(serv.getsockname()) # The address argument is ignored since we already connected. @@ -269,7 +267,7 @@ def testSendto(self): def testSendall(self): # Test sendall() timeout with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as serv: - support.bind_port(serv, self.localhost) + socket_helper.bind_port(serv, self.localhost) serv.listen() self.sock.connect(serv.getsockname()) # Send a lot of data in order to bypass buffering in the TCP stack. @@ -288,7 +286,7 @@ def tearDown(self): def testRecvfromTimeout(self): # Test recvfrom() timeout # Prevent "Address already in use" socket exceptions - support.bind_port(self.sock, self.localhost) + socket_helper.bind_port(self.sock, self.localhost) self._sock_operation(1, 1.5, 'recvfrom', 1024) diff --git a/Lib/test/test_tools/__init__.py b/Lib/test/test_tools/__init__.py index 4d0fca330a1146243f7ed2631ca63d1a4be0e7f7..eb9acad677d58a3d03476f87a81c0e24faebddf0 100644 --- a/Lib/test/test_tools/__init__.py +++ b/Lib/test/test_tools/__init__.py @@ -1,20 +1,33 @@ """Support functions for testing scripts in the Tools directory.""" -import os -import unittest +import contextlib import importlib +import os.path +import unittest from test import support -basepath = os.path.dirname( # - os.path.dirname( # Lib - os.path.dirname( # test - os.path.dirname(__file__)))) # test_tools +basepath = os.path.normpath( + os.path.dirname( # + os.path.dirname( # Lib + os.path.dirname( # test + os.path.dirname(__file__))))) # test_tools toolsdir = os.path.join(basepath, 'Tools') scriptsdir = os.path.join(toolsdir, 'scripts') -def skip_if_missing(): - if not os.path.isdir(scriptsdir): - raise unittest.SkipTest('scripts directory could not be found') +def skip_if_missing(tool=None): + if tool: + tooldir = os.path.join(toolsdir, tool) + else: + tool = 'scripts' + tooldir = scriptsdir + if not os.path.isdir(tooldir): + raise unittest.SkipTest(f'{tool} directory could not be found') + +@contextlib.contextmanager +def imports_under_tool(name, *subdirs): + tooldir = os.path.join(toolsdir, name, *subdirs) + with support.DirsOnSysPath(tooldir) as cm: + yield cm def import_tool(toolname): with support.DirsOnSysPath(scriptsdir): diff --git a/Lib/test/test_tools/test_c_analyzer/__init__.py b/Lib/test/test_tools/test_c_analyzer/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..d0b4c045104d768f1aed8647fd9ad849e5064aa2 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/__init__.py @@ -0,0 +1,15 @@ +import contextlib +import os.path +import test.test_tools +from test.support import load_package_tests + + +@contextlib.contextmanager +def tool_imports_for_tests(): + test.test_tools.skip_if_missing('c-analyzer') + with test.test_tools.imports_under_tool('c-analyzer'): + yield + + +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_tools/test_c_analyzer/__main__.py b/Lib/test/test_tools/test_c_analyzer/__main__.py new file mode 100644 index 0000000000000000000000000000000000000000..b5b017de8a8a41b9c3686d82d93ffb882f192b81 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/__main__.py @@ -0,0 +1,5 @@ +from . import load_tests +import unittest + + +unittest.main() diff --git a/Lib/test/test_tools/test_c_analyzer/test_common/__init__.py b/Lib/test/test_tools/test_c_analyzer/test_common/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..bc502ef32d2916feda5f77cfa61faeb28577c058 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_common/__init__.py @@ -0,0 +1,6 @@ +import os.path +from test.support import load_package_tests + + +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_tools/test_c_analyzer/test_common/test_files.py b/Lib/test/test_tools/test_c_analyzer/test_common/test_files.py new file mode 100644 index 0000000000000000000000000000000000000000..0c97d2a0bbf9adee72bb80d8b5522a0404976fa2 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_common/test_files.py @@ -0,0 +1,470 @@ +import os.path +import unittest + +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.common.files import ( + iter_files, _walk_tree, glob_tree, + ) + + +def fixpath(filename): + return filename.replace('/', os.path.sep) + + +class IterFilesTests(unittest.TestCase): + + maxDiff = None + + _return_walk = None + + @property + def calls(self): + try: + return self._calls + except AttributeError: + self._calls = [] + return self._calls + + def set_files(self, *filesperroot): + roots = [] + result = [] + for root, files in filesperroot: + root = fixpath(root) + roots.append(root) + result.append([os.path.join(root, fixpath(f)) + for f in files]) + self._return_walk = result + return roots + + def _walk(self, root, *, suffix=None, walk=None): + self.calls.append(('_walk', (root, suffix, walk))) + return iter(self._return_walk.pop(0)) + + def _glob(self, root, *, suffix=None): + self.calls.append(('_glob', (root, suffix))) + return iter(self._return_walk.pop(0)) + + def test_typical(self): + dirnames = self.set_files( + ('spam', ['file1.c', 'file2.c']), + ('eggs', ['ham/file3.h']), + ) + suffixes = ('.c', '.h') + + files = list(iter_files(dirnames, suffixes, + _glob=self._glob, + _walk=self._walk)) + + self.assertEqual(files, [ + fixpath('spam/file1.c'), + fixpath('spam/file2.c'), + fixpath('eggs/ham/file3.h'), + ]) + self.assertEqual(self.calls, [ + ('_walk', ('spam', None, _walk_tree)), + ('_walk', ('eggs', None, _walk_tree)), + ]) + + def test_single_root(self): + self._return_walk = [ + [fixpath('spam/file1.c'), fixpath('spam/file2.c')], + ] + + files = list(iter_files('spam', '.c', + _glob=self._glob, + _walk=self._walk)) + + self.assertEqual(files, [ + fixpath('spam/file1.c'), + fixpath('spam/file2.c'), + ]) + self.assertEqual(self.calls, [ + ('_walk', ('spam', '.c', _walk_tree)), + ]) + + def test_one_root(self): + self._return_walk = [ + [fixpath('spam/file1.c'), fixpath('spam/file2.c')], + ] + + files = list(iter_files(['spam'], '.c', + _glob=self._glob, + _walk=self._walk)) + + self.assertEqual(files, [ + fixpath('spam/file1.c'), + fixpath('spam/file2.c'), + ]) + self.assertEqual(self.calls, [ + ('_walk', ('spam', '.c', _walk_tree)), + ]) + + def test_multiple_roots(self): + dirnames = self.set_files( + ('spam', ['file1.c', 'file2.c']), + ('eggs', ['ham/file3.c']), + ) + + files = list(iter_files(dirnames, '.c', + _glob=self._glob, + _walk=self._walk)) + + self.assertEqual(files, [ + fixpath('spam/file1.c'), + fixpath('spam/file2.c'), + fixpath('eggs/ham/file3.c'), + ]) + self.assertEqual(self.calls, [ + ('_walk', ('spam', '.c', _walk_tree)), + ('_walk', ('eggs', '.c', _walk_tree)), + ]) + + def test_no_roots(self): + files = list(iter_files([], '.c', + _glob=self._glob, + _walk=self._walk)) + + self.assertEqual(files, []) + self.assertEqual(self.calls, []) + + def test_single_suffix(self): + self._return_walk = [ + [fixpath('spam/file1.c'), + fixpath('spam/eggs/file3.c'), + ], + ] + + files = list(iter_files('spam', '.c', + _glob=self._glob, + _walk=self._walk)) + + self.assertEqual(files, [ + fixpath('spam/file1.c'), + fixpath('spam/eggs/file3.c'), + ]) + self.assertEqual(self.calls, [ + ('_walk', ('spam', '.c', _walk_tree)), + ]) + + def test_one_suffix(self): + self._return_walk = [ + [fixpath('spam/file1.c'), + fixpath('spam/file1.h'), + fixpath('spam/file1.o'), + fixpath('spam/eggs/file3.c'), + ], + ] + + files = list(iter_files('spam', ['.c'], + _glob=self._glob, + _walk=self._walk)) + + self.assertEqual(files, [ + fixpath('spam/file1.c'), + fixpath('spam/eggs/file3.c'), + ]) + self.assertEqual(self.calls, [ + ('_walk', ('spam', None, _walk_tree)), + ]) + + def test_multiple_suffixes(self): + self._return_walk = [ + [fixpath('spam/file1.c'), + fixpath('spam/file1.h'), + fixpath('spam/file1.o'), + fixpath('spam/eggs/file3.c'), + ], + ] + + files = list(iter_files('spam', ('.c', '.h'), + _glob=self._glob, + _walk=self._walk)) + + self.assertEqual(files, [ + fixpath('spam/file1.c'), + fixpath('spam/file1.h'), + fixpath('spam/eggs/file3.c'), + ]) + self.assertEqual(self.calls, [ + ('_walk', ('spam', None, _walk_tree)), + ]) + + def test_no_suffix(self): + expected = [fixpath('spam/file1.c'), + fixpath('spam/file1.h'), + fixpath('spam/file1.o'), + fixpath('spam/eggs/file3.c'), + ] + for suffix in (None, '', ()): + with self.subTest(suffix): + self.calls.clear() + self._return_walk = [list(expected)] + + files = list(iter_files('spam', suffix, + _glob=self._glob, + _walk=self._walk)) + + self.assertEqual(files, expected) + self.assertEqual(self.calls, [ + ('_walk', ('spam', suffix, _walk_tree)), + ]) + + def test_relparent(self): + dirnames = self.set_files( + ('/x/y/z/spam', ['file1.c', 'file2.c']), + ('/x/y/z/eggs', ['ham/file3.c']), + ) + + files = list(iter_files(dirnames, '.c', fixpath('/x/y'), + _glob=self._glob, + _walk=self._walk)) + + self.assertEqual(files, [ + fixpath('z/spam/file1.c'), + fixpath('z/spam/file2.c'), + fixpath('z/eggs/ham/file3.c'), + ]) + self.assertEqual(self.calls, [ + ('_walk', (fixpath('/x/y/z/spam'), '.c', _walk_tree)), + ('_walk', (fixpath('/x/y/z/eggs'), '.c', _walk_tree)), + ]) + + def test_glob(self): + dirnames = self.set_files( + ('spam', ['file1.c', 'file2.c']), + ('eggs', ['ham/file3.c']), + ) + + files = list(iter_files(dirnames, '.c', + get_files=glob_tree, + _walk=self._walk, + _glob=self._glob)) + + self.assertEqual(files, [ + fixpath('spam/file1.c'), + fixpath('spam/file2.c'), + fixpath('eggs/ham/file3.c'), + ]) + self.assertEqual(self.calls, [ + ('_glob', ('spam', '.c')), + ('_glob', ('eggs', '.c')), + ]) + + + def test_alt_walk_func(self): + dirnames = self.set_files( + ('spam', ['file1.c', 'file2.c']), + ('eggs', ['ham/file3.c']), + ) + def get_files(root): + return None + + files = list(iter_files(dirnames, '.c', + get_files=get_files, + _walk=self._walk, + _glob=self._glob)) + + self.assertEqual(files, [ + fixpath('spam/file1.c'), + fixpath('spam/file2.c'), + fixpath('eggs/ham/file3.c'), + ]) + self.assertEqual(self.calls, [ + ('_walk', ('spam', '.c', get_files)), + ('_walk', ('eggs', '.c', get_files)), + ]) + + + + + + +# def test_no_dirnames(self): +# dirnames = [] +# filter_by_name = None +# +# files = list(iter_files(dirnames, filter_by_name, +# _walk=self._walk)) +# +# self.assertEqual(files, []) +# self.assertEqual(self.calls, []) +# +# def test_no_filter(self): +# self._return_walk = [ +# [('spam', (), ('file1', 'file2.c', 'file3.h', 'file4.o')), +# ], +# ] +# dirnames = [ +# 'spam', +# ] +# filter_by_name = None +# +# files = list(iter_files(dirnames, filter_by_name, +# _walk=self._walk)) +# +# self.assertEqual(files, [ +# fixpath('spam/file1'), +# fixpath('spam/file2.c'), +# fixpath('spam/file3.h'), +# fixpath('spam/file4.o'), +# ]) +# self.assertEqual(self.calls, [ +# ('_walk', ('spam',)), +# ]) +# +# def test_no_files(self): +# self._return_walk = [ +# [('spam', (), ()), +# ], +# [(fixpath('eggs/ham'), (), ()), +# ], +# ] +# dirnames = [ +# 'spam', +# fixpath('eggs/ham'), +# ] +# filter_by_name = None +# +# files = list(iter_files(dirnames, filter_by_name, +# _walk=self._walk)) +# +# self.assertEqual(files, []) +# self.assertEqual(self.calls, [ +# ('_walk', ('spam',)), +# ('_walk', (fixpath('eggs/ham'),)), +# ]) +# +# def test_tree(self): +# self._return_walk = [ +# [('spam', ('sub1', 'sub2', 'sub3'), ('file1',)), +# (fixpath('spam/sub1'), ('sub1sub1',), ('file2', 'file3')), +# (fixpath('spam/sub1/sub1sub1'), (), ('file4',)), +# (fixpath('spam/sub2'), (), ()), +# (fixpath('spam/sub3'), (), ('file5',)), +# ], +# [(fixpath('eggs/ham'), (), ('file6',)), +# ], +# ] +# dirnames = [ +# 'spam', +# fixpath('eggs/ham'), +# ] +# filter_by_name = None +# +# files = list(iter_files(dirnames, filter_by_name, +# _walk=self._walk)) +# +# self.assertEqual(files, [ +# fixpath('spam/file1'), +# fixpath('spam/sub1/file2'), +# fixpath('spam/sub1/file3'), +# fixpath('spam/sub1/sub1sub1/file4'), +# fixpath('spam/sub3/file5'), +# fixpath('eggs/ham/file6'), +# ]) +# self.assertEqual(self.calls, [ +# ('_walk', ('spam',)), +# ('_walk', (fixpath('eggs/ham'),)), +# ]) +# +# def test_filter_suffixes(self): +# self._return_walk = [ +# [('spam', (), ('file1', 'file2.c', 'file3.h', 'file4.o')), +# ], +# ] +# dirnames = [ +# 'spam', +# ] +# filter_by_name = ('.c', '.h') +# +# files = list(iter_files(dirnames, filter_by_name, +# _walk=self._walk)) +# +# self.assertEqual(files, [ +# fixpath('spam/file2.c'), +# fixpath('spam/file3.h'), +# ]) +# self.assertEqual(self.calls, [ +# ('_walk', ('spam',)), +# ]) +# +# def test_some_filtered(self): +# self._return_walk = [ +# [('spam', (), ('file1', 'file2', 'file3', 'file4')), +# ], +# ] +# dirnames = [ +# 'spam', +# ] +# def filter_by_name(filename, results=[False, True, False, True]): +# self.calls.append(('filter_by_name', (filename,))) +# return results.pop(0) +# +# files = list(iter_files(dirnames, filter_by_name, +# _walk=self._walk)) +# +# self.assertEqual(files, [ +# fixpath('spam/file2'), +# fixpath('spam/file4'), +# ]) +# self.assertEqual(self.calls, [ +# ('_walk', ('spam',)), +# ('filter_by_name', ('file1',)), +# ('filter_by_name', ('file2',)), +# ('filter_by_name', ('file3',)), +# ('filter_by_name', ('file4',)), +# ]) +# +# def test_none_filtered(self): +# self._return_walk = [ +# [('spam', (), ('file1', 'file2', 'file3', 'file4')), +# ], +# ] +# dirnames = [ +# 'spam', +# ] +# def filter_by_name(filename, results=[True, True, True, True]): +# self.calls.append(('filter_by_name', (filename,))) +# return results.pop(0) +# +# files = list(iter_files(dirnames, filter_by_name, +# _walk=self._walk)) +# +# self.assertEqual(files, [ +# fixpath('spam/file1'), +# fixpath('spam/file2'), +# fixpath('spam/file3'), +# fixpath('spam/file4'), +# ]) +# self.assertEqual(self.calls, [ +# ('_walk', ('spam',)), +# ('filter_by_name', ('file1',)), +# ('filter_by_name', ('file2',)), +# ('filter_by_name', ('file3',)), +# ('filter_by_name', ('file4',)), +# ]) +# +# def test_all_filtered(self): +# self._return_walk = [ +# [('spam', (), ('file1', 'file2', 'file3', 'file4')), +# ], +# ] +# dirnames = [ +# 'spam', +# ] +# def filter_by_name(filename, results=[False, False, False, False]): +# self.calls.append(('filter_by_name', (filename,))) +# return results.pop(0) +# +# files = list(iter_files(dirnames, filter_by_name, +# _walk=self._walk)) +# +# self.assertEqual(files, []) +# self.assertEqual(self.calls, [ +# ('_walk', ('spam',)), +# ('filter_by_name', ('file1',)), +# ('filter_by_name', ('file2',)), +# ('filter_by_name', ('file3',)), +# ('filter_by_name', ('file4',)), +# ]) diff --git a/Lib/test/test_tools/test_c_analyzer/test_common/test_info.py b/Lib/test/test_tools/test_c_analyzer/test_common/test_info.py new file mode 100644 index 0000000000000000000000000000000000000000..69dbb582c6b684d27e66aa809e478dcb1ef5018c --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_common/test_info.py @@ -0,0 +1,197 @@ +import string +import unittest + +from ..util import PseudoStr, StrProxy, Object +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.common.info import ( + UNKNOWN, + ID, + ) + + +class IDTests(unittest.TestCase): + + VALID_ARGS = ( + 'x/y/z/spam.c', + 'func', + 'eggs', + ) + VALID_KWARGS = dict(zip(ID._fields, VALID_ARGS)) + VALID_EXPECTED = VALID_ARGS + + def test_from_raw(self): + tests = [ + ('', None), + (None, None), + ('spam', (None, None, 'spam')), + (('spam',), (None, None, 'spam')), + (('x/y/z/spam.c', 'spam'), ('x/y/z/spam.c', None, 'spam')), + (self.VALID_ARGS, self.VALID_EXPECTED), + (self.VALID_KWARGS, self.VALID_EXPECTED), + ] + for raw, expected in tests: + with self.subTest(raw): + id = ID.from_raw(raw) + + self.assertEqual(id, expected) + + def test_minimal(self): + id = ID( + filename=None, + funcname=None, + name='eggs', + ) + + self.assertEqual(id, ( + None, + None, + 'eggs', + )) + + def test_init_typical_global(self): + id = ID( + filename='x/y/z/spam.c', + funcname=None, + name='eggs', + ) + + self.assertEqual(id, ( + 'x/y/z/spam.c', + None, + 'eggs', + )) + + def test_init_typical_local(self): + id = ID( + filename='x/y/z/spam.c', + funcname='func', + name='eggs', + ) + + self.assertEqual(id, ( + 'x/y/z/spam.c', + 'func', + 'eggs', + )) + + def test_init_all_missing(self): + for value in ('', None): + with self.subTest(repr(value)): + id = ID( + filename=value, + funcname=value, + name=value, + ) + + self.assertEqual(id, ( + None, + None, + None, + )) + + def test_init_all_coerced(self): + tests = [ + ('str subclass', + dict( + filename=PseudoStr('x/y/z/spam.c'), + funcname=PseudoStr('func'), + name=PseudoStr('eggs'), + ), + ('x/y/z/spam.c', + 'func', + 'eggs', + )), + ('non-str', + dict( + filename=StrProxy('x/y/z/spam.c'), + funcname=Object(), + name=('a', 'b', 'c'), + ), + ('x/y/z/spam.c', + '', + "('a', 'b', 'c')", + )), + ] + for summary, kwargs, expected in tests: + with self.subTest(summary): + id = ID(**kwargs) + + for field in ID._fields: + value = getattr(id, field) + self.assertIs(type(value), str) + self.assertEqual(tuple(id), expected) + + def test_iterable(self): + id = ID(**self.VALID_KWARGS) + + filename, funcname, name = id + + values = (filename, funcname, name) + for value, expected in zip(values, self.VALID_EXPECTED): + self.assertEqual(value, expected) + + def test_fields(self): + id = ID('a', 'b', 'z') + + self.assertEqual(id.filename, 'a') + self.assertEqual(id.funcname, 'b') + self.assertEqual(id.name, 'z') + + def test_validate_typical(self): + id = ID( + filename='x/y/z/spam.c', + funcname='func', + name='eggs', + ) + + id.validate() # This does not fail. + + def test_validate_missing_field(self): + for field in ID._fields: + with self.subTest(field): + id = ID(**self.VALID_KWARGS) + id = id._replace(**{field: None}) + + if field == 'funcname': + id.validate() # The field can be missing (not set). + id = id._replace(filename=None) + id.validate() # Both fields can be missing (not set). + continue + + with self.assertRaises(TypeError): + id.validate() + + def test_validate_bad_field(self): + badch = tuple(c for c in string.punctuation + string.digits) + notnames = ( + '1a', + 'a.b', + 'a-b', + '&a', + 'a++', + ) + badch + tests = [ + ('filename', ()), # Any non-empty str is okay. + ('funcname', notnames), + ('name', notnames), + ] + seen = set() + for field, invalid in tests: + for value in invalid: + seen.add(value) + with self.subTest(f'{field}={value!r}'): + id = ID(**self.VALID_KWARGS) + id = id._replace(**{field: value}) + + with self.assertRaises(ValueError): + id.validate() + + for field, invalid in tests: + valid = seen - set(invalid) + for value in valid: + with self.subTest(f'{field}={value!r}'): + id = ID(**self.VALID_KWARGS) + id = id._replace(**{field: value}) + + id.validate() # This does not fail. diff --git a/Lib/test/test_tools/test_c_analyzer/test_common/test_show.py b/Lib/test/test_tools/test_c_analyzer/test_common/test_show.py new file mode 100644 index 0000000000000000000000000000000000000000..91ca2f3b344dd39d81f72b536e6bab1ded4a4527 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_common/test_show.py @@ -0,0 +1,54 @@ +import unittest + +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.variables import info + from c_analyzer.common.show import ( + basic, + ) + + +TYPICAL = [ + info.Variable.from_parts('src1/spam.c', None, 'var1', 'static const char *'), + info.Variable.from_parts('src1/spam.c', 'ham', 'initialized', 'static int'), + info.Variable.from_parts('src1/spam.c', None, 'var2', 'static PyObject *'), + info.Variable.from_parts('src1/eggs.c', 'tofu', 'ready', 'static int'), + info.Variable.from_parts('src1/spam.c', None, 'freelist', 'static (PyTupleObject *)[10]'), + info.Variable.from_parts('src1/sub/ham.c', None, 'var1', 'static const char const *'), + info.Variable.from_parts('src2/jam.c', None, 'var1', 'static int'), + info.Variable.from_parts('src2/jam.c', None, 'var2', 'static MyObject *'), + info.Variable.from_parts('Include/spam.h', None, 'data', 'static const int'), + ] + + +class BasicTests(unittest.TestCase): + + maxDiff = None + + def setUp(self): + self.lines = [] + + def print(self, line): + self.lines.append(line) + + def test_typical(self): + basic(TYPICAL, + _print=self.print) + + self.assertEqual(self.lines, [ + 'src1/spam.c:var1 static const char *', + 'src1/spam.c:ham():initialized static int', + 'src1/spam.c:var2 static PyObject *', + 'src1/eggs.c:tofu():ready static int', + 'src1/spam.c:freelist static (PyTupleObject *)[10]', + 'src1/sub/ham.c:var1 static const char const *', + 'src2/jam.c:var1 static int', + 'src2/jam.c:var2 static MyObject *', + 'Include/spam.h:data static const int', + ]) + + def test_no_rows(self): + basic([], + _print=self.print) + + self.assertEqual(self.lines, []) diff --git a/Lib/test/test_tools/test_c_analyzer/test_cpython/__init__.py b/Lib/test/test_tools/test_c_analyzer/test_cpython/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..bc502ef32d2916feda5f77cfa61faeb28577c058 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_cpython/__init__.py @@ -0,0 +1,6 @@ +import os.path +from test.support import load_package_tests + + +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_tools/test_c_analyzer/test_cpython/test___main__.py b/Lib/test/test_tools/test_c_analyzer/test_cpython/test___main__.py new file mode 100644 index 0000000000000000000000000000000000000000..6d69ed7525b595d9fee59f1198ad349f091d1e69 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_cpython/test___main__.py @@ -0,0 +1,296 @@ +import sys +import unittest + +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.variables import info + from cpython import SOURCE_DIRS + from cpython.supported import IGNORED_FILE + from cpython.known import DATA_FILE as KNOWN_FILE + from cpython.__main__ import ( + cmd_check, cmd_show, parse_args, main, + ) + + +TYPICAL = [ + (info.Variable.from_parts('src1/spam.c', None, 'var1', 'const char *'), + True, + ), + (info.Variable.from_parts('src1/spam.c', 'ham', 'initialized', 'int'), + True, + ), + (info.Variable.from_parts('src1/spam.c', None, 'var2', 'PyObject *'), + False, + ), + (info.Variable.from_parts('src1/eggs.c', 'tofu', 'ready', 'int'), + True, + ), + (info.Variable.from_parts('src1/spam.c', None, 'freelist', '(PyTupleObject *)[10]'), + False, + ), + (info.Variable.from_parts('src1/sub/ham.c', None, 'var1', 'const char const *'), + True, + ), + (info.Variable.from_parts('src2/jam.c', None, 'var1', 'int'), + True, + ), + (info.Variable.from_parts('src2/jam.c', None, 'var2', 'MyObject *'), + False, + ), + (info.Variable.from_parts('Include/spam.h', None, 'data', 'const int'), + True, + ), + ] + + +class CMDBase(unittest.TestCase): + + maxDiff = None + +# _return_known_from_file = None +# _return_ignored_from_file = None + _return_find = () + + @property + def calls(self): + try: + return self._calls + except AttributeError: + self._calls = [] + return self._calls + +# def _known_from_file(self, *args): +# self.calls.append(('_known_from_file', args)) +# return self._return_known_from_file or {} +# +# def _ignored_from_file(self, *args): +# self.calls.append(('_ignored_from_file', args)) +# return self._return_ignored_from_file or {} + + def _find(self, known, ignored, skip_objects=False): + self.calls.append(('_find', (known, ignored, skip_objects))) + return self._return_find + + def _show(self, *args): + self.calls.append(('_show', args)) + + def _print(self, *args): + self.calls.append(('_print', args)) + + +class CheckTests(CMDBase): + + def test_defaults(self): + self._return_find = [] + + cmd_check('check', + _find=self._find, + _show=self._show, + _print=self._print, + ) + + self.assertEqual( + self.calls[0], + ('_find', (KNOWN_FILE, IGNORED_FILE, False)), + ) + + def test_all_supported(self): + self._return_find = [(v, s) for v, s in TYPICAL if s] + dirs = ['src1', 'src2', 'Include'] + + cmd_check('check', + known='known.tsv', + ignored='ignored.tsv', + _find=self._find, + _show=self._show, + _print=self._print, + ) + + self.assertEqual(self.calls, [ + ('_find', ('known.tsv', 'ignored.tsv', False)), + #('_print', ('okay',)), + ]) + + def test_some_unsupported(self): + self._return_find = TYPICAL + + with self.assertRaises(SystemExit) as cm: + cmd_check('check', + known='known.tsv', + ignored='ignored.tsv', + _find=self._find, + _show=self._show, + _print=self._print, + ) + + unsupported = [v for v, s in TYPICAL if not s] + self.assertEqual(self.calls, [ + ('_find', ('known.tsv', 'ignored.tsv', False)), + ('_print', ('ERROR: found unsupported global variables',)), + ('_print', ()), + ('_show', (sorted(unsupported),)), + ('_print', (' (3 total)',)), + ]) + self.assertEqual(cm.exception.code, 1) + + +class ShowTests(CMDBase): + + def test_defaults(self): + self._return_find = [] + + cmd_show('show', + _find=self._find, + _show=self._show, + _print=self._print, + ) + + self.assertEqual( + self.calls[0], + ('_find', (KNOWN_FILE, IGNORED_FILE, False)), + ) + + def test_typical(self): + self._return_find = TYPICAL + + cmd_show('show', + known='known.tsv', + ignored='ignored.tsv', + _find=self._find, + _show=self._show, + _print=self._print, + ) + + supported = [v for v, s in TYPICAL if s] + unsupported = [v for v, s in TYPICAL if not s] + self.assertEqual(self.calls, [ + ('_find', ('known.tsv', 'ignored.tsv', False)), + ('_print', ('supported:',)), + ('_print', ('----------',)), + ('_show', (sorted(supported),)), + ('_print', (' (6 total)',)), + ('_print', ()), + ('_print', ('unsupported:',)), + ('_print', ('------------',)), + ('_show', (sorted(unsupported),)), + ('_print', (' (3 total)',)), + ]) + + +class ParseArgsTests(unittest.TestCase): + + maxDiff = None + + def test_no_args(self): + self.errmsg = None + def fail(msg): + self.errmsg = msg + sys.exit(msg) + + with self.assertRaises(SystemExit): + parse_args('cg', [], _fail=fail) + + self.assertEqual(self.errmsg, 'missing command') + + def test_check_no_args(self): + cmd, cmdkwargs = parse_args('cg', [ + 'check', + ]) + + self.assertEqual(cmd, 'check') + self.assertEqual(cmdkwargs, { + 'ignored': IGNORED_FILE, + 'known': KNOWN_FILE, + #'dirs': SOURCE_DIRS, + }) + + def test_check_full_args(self): + cmd, cmdkwargs = parse_args('cg', [ + 'check', + '--ignored', 'spam.tsv', + '--known', 'eggs.tsv', + #'dir1', + #'dir2', + #'dir3', + ]) + + self.assertEqual(cmd, 'check') + self.assertEqual(cmdkwargs, { + 'ignored': 'spam.tsv', + 'known': 'eggs.tsv', + #'dirs': ['dir1', 'dir2', 'dir3'] + }) + + def test_show_no_args(self): + cmd, cmdkwargs = parse_args('cg', [ + 'show', + ]) + + self.assertEqual(cmd, 'show') + self.assertEqual(cmdkwargs, { + 'ignored': IGNORED_FILE, + 'known': KNOWN_FILE, + #'dirs': SOURCE_DIRS, + 'skip_objects': False, + }) + + def test_show_full_args(self): + cmd, cmdkwargs = parse_args('cg', [ + 'show', + '--ignored', 'spam.tsv', + '--known', 'eggs.tsv', + #'dir1', + #'dir2', + #'dir3', + ]) + + self.assertEqual(cmd, 'show') + self.assertEqual(cmdkwargs, { + 'ignored': 'spam.tsv', + 'known': 'eggs.tsv', + #'dirs': ['dir1', 'dir2', 'dir3'], + 'skip_objects': False, + }) + + +def new_stub_commands(*names): + calls = [] + def cmdfunc(cmd, **kwargs): + calls.append((cmd, kwargs)) + commands = {name: cmdfunc for name in names} + return commands, calls + + +class MainTests(unittest.TestCase): + + def test_no_command(self): + with self.assertRaises(ValueError): + main(None, {}) + + def test_check(self): + commands, calls = new_stub_commands('check', 'show') + + cmdkwargs = { + 'ignored': 'spam.tsv', + 'known': 'eggs.tsv', + 'dirs': ['dir1', 'dir2', 'dir3'], + } + main('check', cmdkwargs, _COMMANDS=commands) + + self.assertEqual(calls, [ + ('check', cmdkwargs), + ]) + + def test_show(self): + commands, calls = new_stub_commands('check', 'show') + + cmdkwargs = { + 'ignored': 'spam.tsv', + 'known': 'eggs.tsv', + 'dirs': ['dir1', 'dir2', 'dir3'], + } + main('show', cmdkwargs, _COMMANDS=commands) + + self.assertEqual(calls, [ + ('show', cmdkwargs), + ]) diff --git a/Lib/test/test_tools/test_c_analyzer/test_cpython/test_functional.py b/Lib/test/test_tools/test_c_analyzer/test_cpython/test_functional.py new file mode 100644 index 0000000000000000000000000000000000000000..927979048448fa6962f3eac251bc6e570a2ddf5c --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_cpython/test_functional.py @@ -0,0 +1,34 @@ +import unittest + +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + pass + + +class SelfCheckTests(unittest.TestCase): + + @unittest.expectedFailure + def test_known(self): + # Make sure known macros & vartypes aren't hiding unknown local types. + # XXX finish! + raise NotImplementedError + + @unittest.expectedFailure + def test_compare_nm_results(self): + # Make sure the "show" results match the statics found by "nm" command. + # XXX Skip if "nm" is not available. + # XXX finish! + raise NotImplementedError + + +class DummySourceTests(unittest.TestCase): + + @unittest.expectedFailure + def test_check(self): + # XXX finish! + raise NotImplementedError + + @unittest.expectedFailure + def test_show(self): + # XXX finish! + raise NotImplementedError diff --git a/Lib/test/test_tools/test_c_analyzer/test_cpython/test_supported.py b/Lib/test/test_tools/test_c_analyzer/test_cpython/test_supported.py new file mode 100644 index 0000000000000000000000000000000000000000..a244b97e1fc7c7ba272be312c3e94da4f2d01c1f --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_cpython/test_supported.py @@ -0,0 +1,98 @@ +import re +import textwrap +import unittest + +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.common.info import ID + from c_analyzer.variables.info import Variable + from cpython.supported import ( + is_supported, ignored_from_file, + ) + + +class IsSupportedTests(unittest.TestCase): + + @unittest.expectedFailure + def test_supported(self): + statics = [ + Variable('src1/spam.c', None, 'var1', 'const char *'), + Variable('src1/spam.c', None, 'var1', 'int'), + ] + for static in statics: + with self.subTest(static): + result = is_supported(static) + + self.assertTrue(result) + + @unittest.expectedFailure + def test_not_supported(self): + statics = [ + Variable('src1/spam.c', None, 'var1', 'PyObject *'), + Variable('src1/spam.c', None, 'var1', 'PyObject[10]'), + ] + for static in statics: + with self.subTest(static): + result = is_supported(static) + + self.assertFalse(result) + + +class IgnoredFromFileTests(unittest.TestCase): + + maxDiff = None + + _return_read_tsv = () + + @property + def calls(self): + try: + return self._calls + except AttributeError: + self._calls = [] + return self._calls + + def _read_tsv(self, *args): + self.calls.append(('_read_tsv', args)) + return self._return_read_tsv + + def test_typical(self): + lines = textwrap.dedent(''' + filename funcname name kind reason + file1.c - var1 variable ... + file1.c func1 local1 variable | + file1.c - var2 variable ??? + file1.c func2 local2 variable | + file2.c - var1 variable reasons + ''').strip().splitlines() + lines = [re.sub(r'\s{1,8}', '\t', line, 4).replace('|', '') + for line in lines] + self._return_read_tsv = [tuple(v.strip() for v in line.split('\t')) + for line in lines[1:]] + + ignored = ignored_from_file('spam.c', _read_tsv=self._read_tsv) + + self.assertEqual(ignored, { + 'variables': { + ID('file1.c', '', 'var1'): '...', + ID('file1.c', 'func1', 'local1'): '', + ID('file1.c', '', 'var2'): '???', + ID('file1.c', 'func2', 'local2'): '', + ID('file2.c', '', 'var1'): 'reasons', + }, + }) + self.assertEqual(self.calls, [ + ('_read_tsv', ('spam.c', 'filename\tfuncname\tname\tkind\treason')), + ]) + + def test_empty(self): + self._return_read_tsv = [] + + ignored = ignored_from_file('spam.c', _read_tsv=self._read_tsv) + + self.assertEqual(ignored, { + 'variables': {}, + }) + self.assertEqual(self.calls, [ + ('_read_tsv', ('spam.c', 'filename\tfuncname\tname\tkind\treason')), + ]) diff --git a/Lib/test/test_tools/test_c_analyzer/test_parser/__init__.py b/Lib/test/test_tools/test_c_analyzer/test_parser/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..bc502ef32d2916feda5f77cfa61faeb28577c058 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_parser/__init__.py @@ -0,0 +1,6 @@ +import os.path +from test.support import load_package_tests + + +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_tools/test_c_analyzer/test_parser/test_declarations.py b/Lib/test/test_tools/test_c_analyzer/test_parser/test_declarations.py new file mode 100644 index 0000000000000000000000000000000000000000..674fcb1af1c7adf924f646bd8f4dba62abe1713f --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_parser/test_declarations.py @@ -0,0 +1,795 @@ +import textwrap +import unittest + +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.parser.declarations import ( + iter_global_declarations, iter_local_statements, + parse_func, _parse_var, parse_compound, + iter_variables, + ) + + +class TestCaseBase(unittest.TestCase): + + maxDiff = None + + @property + def calls(self): + try: + return self._calls + except AttributeError: + self._calls = [] + return self._calls + + +class IterGlobalDeclarationsTests(TestCaseBase): + + def test_functions(self): + tests = [ + (textwrap.dedent(''' + void func1() { + return; + } + '''), + textwrap.dedent(''' + void func1() { + return; + } + ''').strip(), + ), + (textwrap.dedent(''' + static unsigned int * _func1( + const char *arg1, + int *arg2 + long long arg3 + ) + { + return _do_something(arg1, arg2, arg3); + } + '''), + textwrap.dedent(''' + static unsigned int * _func1( const char *arg1, int *arg2 long long arg3 ) { + return _do_something(arg1, arg2, arg3); + } + ''').strip(), + ), + (textwrap.dedent(''' + static PyObject * + _func1(const char *arg1, PyObject *arg2) + { + static int initialized = 0; + if (!initialized) { + initialized = 1; + _init(arg1); + } + + PyObject *result = _do_something(arg1, arg2); + Py_INCREF(result); + return result; + } + '''), + textwrap.dedent(''' + static PyObject * _func1(const char *arg1, PyObject *arg2) { + static int initialized = 0; + if (!initialized) { + initialized = 1; + _init(arg1); + } + PyObject *result = _do_something(arg1, arg2); + Py_INCREF(result); + return result; + } + ''').strip(), + ), + ] + for lines, expected in tests: + body = textwrap.dedent( + expected.partition('{')[2].rpartition('}')[0] + ).strip() + expected = (expected, body) + with self.subTest(lines): + lines = lines.splitlines() + + stmts = list(iter_global_declarations(lines)) + + self.assertEqual(stmts, [expected]) + + @unittest.expectedFailure + def test_declarations(self): + tests = [ + 'int spam;', + 'long long spam;', + 'static const int const *spam;', + 'int spam;', + 'typedef int myint;', + 'typedef PyObject * (*unaryfunc)(PyObject *);', + # typedef struct + # inline struct + # enum + # inline enum + ] + for text in tests: + expected = (text, + ' '.join(l.strip() for l in text.splitlines())) + with self.subTest(lines): + lines = lines.splitlines() + + stmts = list(iter_global_declarations(lines)) + + self.assertEqual(stmts, [expected]) + + @unittest.expectedFailure + def test_declaration_multiple_vars(self): + lines = ['static const int const *spam, *ham=NULL, eggs = 3;'] + + stmts = list(iter_global_declarations(lines)) + + self.assertEqual(stmts, [ + ('static const int const *spam;', None), + ('static const int *ham=NULL;', None), + ('static const int eggs = 3;', None), + ]) + + def test_mixed(self): + lines = textwrap.dedent(''' + int spam; + static const char const *eggs; + + PyObject * start(void) { + static int initialized = 0; + if (initialized) { + initialized = 1; + init(); + } + return _start(); + } + + char* ham; + + static int stop(char *reason) { + ham = reason; + return _stop(); + } + ''').splitlines() + expected = [ + (textwrap.dedent(''' + PyObject * start(void) { + static int initialized = 0; + if (initialized) { + initialized = 1; + init(); + } + return _start(); + } + ''').strip(), + textwrap.dedent(''' + static int initialized = 0; + if (initialized) { + initialized = 1; + init(); + } + return _start(); + ''').strip(), + ), + (textwrap.dedent(''' + static int stop(char *reason) { + ham = reason; + return _stop(); + } + ''').strip(), + textwrap.dedent(''' + ham = reason; + return _stop(); + ''').strip(), + ), + ] + + stmts = list(iter_global_declarations(lines)) + + self.assertEqual(stmts, expected) + #self.assertEqual([stmt for stmt, _ in stmts], + # [stmt for stmt, _ in expected]) + #self.assertEqual([body for _, body in stmts], + # [body for _, body in expected]) + + def test_no_statements(self): + lines = [] + + stmts = list(iter_global_declarations(lines)) + + self.assertEqual(stmts, []) + + def test_bogus(self): + tests = [ + (textwrap.dedent(''' + int spam; + static const char const *eggs; + + PyObject * start(void) { + static int initialized = 0; + if (initialized) { + initialized = 1; + init(); + } + return _start(); + } + + char* ham; + + static int _stop(void) { + // missing closing bracket + + static int stop(char *reason) { + ham = reason; + return _stop(); + } + '''), + [(textwrap.dedent(''' + PyObject * start(void) { + static int initialized = 0; + if (initialized) { + initialized = 1; + init(); + } + return _start(); + } + ''').strip(), + textwrap.dedent(''' + static int initialized = 0; + if (initialized) { + initialized = 1; + init(); + } + return _start(); + ''').strip(), + ), + # Neither "stop()" nor "_stop()" are here. + ], + ), + ] + for lines, expected in tests: + with self.subTest(lines): + lines = lines.splitlines() + + stmts = list(iter_global_declarations(lines)) + + self.assertEqual(stmts, expected) + #self.assertEqual([stmt for stmt, _ in stmts], + # [stmt for stmt, _ in expected]) + #self.assertEqual([body for _, body in stmts], + # [body for _, body in expected]) + + def test_ignore_comments(self): + tests = [ + ('// msg', None), + ('// int stmt;', None), + (' // ... ', None), + ('// /*', None), + ('/* int stmt; */', None), + (""" + /** + * ... + * int stmt; + */ + """, None), + ] + for lines, expected in tests: + with self.subTest(lines): + lines = lines.splitlines() + + stmts = list(iter_global_declarations(lines)) + + self.assertEqual(stmts, [expected] if expected else []) + + +class IterLocalStatementsTests(TestCaseBase): + + def test_vars(self): + tests = [ + # POTS + 'int spam;', + 'unsigned int spam;', + 'char spam;', + 'float spam;', + + # typedefs + 'uint spam;', + 'MyType spam;', + + # complex + 'struct myspam spam;', + 'union choice spam;', + # inline struct + # inline union + # enum? + ] + # pointers + tests.extend([ + # POTS + 'int * spam;', + 'unsigned int * spam;', + 'char *spam;', + 'char const *spam = "spamspamspam...";', + # typedefs + 'MyType *spam;', + # complex + 'struct myspam *spam;', + 'union choice *spam;', + # packed with details + 'const char const *spam;', + # void pointer + 'void *data = NULL;', + # function pointers + 'int (* func)(char *arg1);', + 'char * (* func)(void);', + ]) + # storage class + tests.extend([ + 'static int spam;', + 'extern int spam;', + 'static unsigned int spam;', + 'static struct myspam spam;', + ]) + # type qualifier + tests.extend([ + 'const int spam;', + 'const unsigned int spam;', + 'const struct myspam spam;', + ]) + # combined + tests.extend([ + 'const char *spam = eggs;', + 'static const char const *spam = "spamspamspam...";', + 'extern const char const *spam;', + 'static void *data = NULL;', + 'static int (const * func)(char *arg1) = func1;', + 'static char * (* func)(void);', + ]) + for line in tests: + expected = line + with self.subTest(line): + stmts = list(iter_local_statements([line])) + + self.assertEqual(stmts, [(expected, None)]) + + @unittest.expectedFailure + def test_vars_multiline_var(self): + lines = textwrap.dedent(''' + PyObject * + spam + = NULL; + ''').splitlines() + expected = 'PyObject * spam = NULL;' + + stmts = list(iter_local_statements(lines)) + + self.assertEqual(stmts, [(expected, None)]) + + @unittest.expectedFailure + def test_declaration_multiple_vars(self): + lines = ['static const int const *spam, *ham=NULL, ham2[]={1, 2, 3}, ham3[2]={1, 2}, eggs = 3;'] + + stmts = list(iter_global_declarations(lines)) + + self.assertEqual(stmts, [ + ('static const int const *spam;', None), + ('static const int *ham=NULL;', None), + ('static const int ham[]={1, 2, 3};', None), + ('static const int ham[2]={1, 2};', None), + ('static const int eggs = 3;', None), + ]) + + @unittest.expectedFailure + def test_other_simple(self): + raise NotImplementedError + + @unittest.expectedFailure + def test_compound(self): + raise NotImplementedError + + @unittest.expectedFailure + def test_mixed(self): + raise NotImplementedError + + def test_no_statements(self): + lines = [] + + stmts = list(iter_local_statements(lines)) + + self.assertEqual(stmts, []) + + @unittest.expectedFailure + def test_bogus(self): + raise NotImplementedError + + def test_ignore_comments(self): + tests = [ + ('// msg', None), + ('// int stmt;', None), + (' // ... ', None), + ('// /*', None), + ('/* int stmt; */', None), + (""" + /** + * ... + * int stmt; + */ + """, None), + # mixed with statements + ('int stmt; // ...', ('int stmt;', None)), + ( 'int stmt; /* ... */', ('int stmt;', None)), + ( '/* ... */ int stmt;', ('int stmt;', None)), + ] + for lines, expected in tests: + with self.subTest(lines): + lines = lines.splitlines() + + stmts = list(iter_local_statements(lines)) + + self.assertEqual(stmts, [expected] if expected else []) + + +class ParseFuncTests(TestCaseBase): + + def test_typical(self): + tests = [ + ('PyObject *\nspam(char *a)\n{\nreturn _spam(a);\n}', + 'return _spam(a);', + ('spam', 'PyObject * spam(char *a)'), + ), + ] + for stmt, body, expected in tests: + with self.subTest(stmt): + name, signature = parse_func(stmt, body) + + self.assertEqual((name, signature), expected) + + +class ParseVarTests(TestCaseBase): + + def test_typical(self): + tests = [ + # POTS + ('int spam;', ('spam', 'int')), + ('unsigned int spam;', ('spam', 'unsigned int')), + ('char spam;', ('spam', 'char')), + ('float spam;', ('spam', 'float')), + + # typedefs + ('uint spam;', ('spam', 'uint')), + ('MyType spam;', ('spam', 'MyType')), + + # complex + ('struct myspam spam;', ('spam', 'struct myspam')), + ('union choice spam;', ('spam', 'union choice')), + # inline struct + # inline union + # enum? + ] + # pointers + tests.extend([ + # POTS + ('int * spam;', ('spam', 'int *')), + ('unsigned int * spam;', ('spam', 'unsigned int *')), + ('char *spam;', ('spam', 'char *')), + ('char const *spam = "spamspamspam...";', ('spam', 'char const *')), + # typedefs + ('MyType *spam;', ('spam', 'MyType *')), + # complex + ('struct myspam *spam;', ('spam', 'struct myspam *')), + ('union choice *spam;', ('spam', 'union choice *')), + # packed with details + ('const char const *spam;', ('spam', 'const char const *')), + # void pointer + ('void *data = NULL;', ('data', 'void *')), + # function pointers + ('int (* func)(char *);', ('func', 'int (*)(char *)')), + ('char * (* func)(void);', ('func', 'char * (*)(void)')), + ]) + # storage class + tests.extend([ + ('static int spam;', ('spam', 'static int')), + ('extern int spam;', ('spam', 'extern int')), + ('static unsigned int spam;', ('spam', 'static unsigned int')), + ('static struct myspam spam;', ('spam', 'static struct myspam')), + ]) + # type qualifier + tests.extend([ + ('const int spam;', ('spam', 'const int')), + ('const unsigned int spam;', ('spam', 'const unsigned int')), + ('const struct myspam spam;', ('spam', 'const struct myspam')), + ]) + # combined + tests.extend([ + ('const char *spam = eggs;', ('spam', 'const char *')), + ('static const char const *spam = "spamspamspam...";', + ('spam', 'static const char const *')), + ('extern const char const *spam;', + ('spam', 'extern const char const *')), + ('static void *data = NULL;', ('data', 'static void *')), + ('static int (const * func)(char *) = func1;', + ('func', 'static int (const *)(char *)')), + ('static char * (* func)(void);', + ('func', 'static char * (*)(void)')), + ]) + for stmt, expected in tests: + with self.subTest(stmt): + name, vartype = _parse_var(stmt) + + self.assertEqual((name, vartype), expected) + + +@unittest.skip('not finished') +class ParseCompoundTests(TestCaseBase): + + def test_typical(self): + headers, bodies = parse_compound(stmt, blocks) + ... + + +class IterVariablesTests(TestCaseBase): + + _return_iter_source_lines = None + _return_iter_global = None + _return_iter_local = None + _return_parse_func = None + _return_parse_var = None + _return_parse_compound = None + + def _iter_source_lines(self, filename): + self.calls.append( + ('_iter_source_lines', (filename,))) + return self._return_iter_source_lines.splitlines() + + def _iter_global(self, lines): + self.calls.append( + ('_iter_global', (lines,))) + try: + return self._return_iter_global.pop(0) + except IndexError: + return ('???', None) + + def _iter_local(self, lines): + self.calls.append( + ('_iter_local', (lines,))) + try: + return self._return_iter_local.pop(0) + except IndexError: + return ('???', None) + + def _parse_func(self, stmt, body): + self.calls.append( + ('_parse_func', (stmt, body))) + try: + return self._return_parse_func.pop(0) + except IndexError: + return ('???', '???') + + def _parse_var(self, lines): + self.calls.append( + ('_parse_var', (lines,))) + try: + return self._return_parse_var.pop(0) + except IndexError: + return ('???', '???') + + def _parse_compound(self, stmt, blocks): + self.calls.append( + ('_parse_compound', (stmt, blocks))) + try: + return self._return_parse_compound.pop(0) + except IndexError: + return (['???'], ['???']) + + def test_empty_file(self): + self._return_iter_source_lines = '' + self._return_iter_global = [ + [], + ] + self._return_parse_func = None + self._return_parse_var = None + self._return_parse_compound = None + + srcvars = list(iter_variables('spam.c', + _iter_source_lines=self._iter_source_lines, + _iter_global=self._iter_global, + _iter_local=self._iter_local, + _parse_func=self._parse_func, + _parse_var=self._parse_var, + _parse_compound=self._parse_compound, + )) + + self.assertEqual(srcvars, []) + self.assertEqual(self.calls, [ + ('_iter_source_lines', ('spam.c',)), + ('_iter_global', ([],)), + ]) + + def test_no_statements(self): + content = textwrap.dedent(''' + ... + ''') + self._return_iter_source_lines = content + self._return_iter_global = [ + [], + ] + self._return_parse_func = None + self._return_parse_var = None + self._return_parse_compound = None + + srcvars = list(iter_variables('spam.c', + _iter_source_lines=self._iter_source_lines, + _iter_global=self._iter_global, + _iter_local=self._iter_local, + _parse_func=self._parse_func, + _parse_var=self._parse_var, + _parse_compound=self._parse_compound, + )) + + self.assertEqual(srcvars, []) + self.assertEqual(self.calls, [ + ('_iter_source_lines', ('spam.c',)), + ('_iter_global', (content.splitlines(),)), + ]) + + def test_typical(self): + content = textwrap.dedent(''' + ... + ''') + self._return_iter_source_lines = content + self._return_iter_global = [ + [('', None), # var1 + ('', None), # non-var + ('', None), # var2 + ('', ''), # func1 + ('', None), # var4 + ], + ] + self._return_iter_local = [ + # func1 + [('', None), # var3 + ('', [('
    ', '')]), # if + ('', None), # non-var + ], + # if + [('', None), # var2 ("collision" with global var) + ], + ] + self._return_parse_func = [ + ('func1', ''), + ] + self._return_parse_var = [ + ('var1', ''), + (None, None), + ('var2', ''), + ('var3', ''), + ('var2', ''), + ('var4', ''), + (None, None), + (None, None), + (None, None), + ('var5', ''), + ] + self._return_parse_compound = [ + ([[ + 'if (', + '', + ')', + ], + ], + ['']), + ] + + srcvars = list(iter_variables('spam.c', + _iter_source_lines=self._iter_source_lines, + _iter_global=self._iter_global, + _iter_local=self._iter_local, + _parse_func=self._parse_func, + _parse_var=self._parse_var, + _parse_compound=self._parse_compound, + )) + + self.assertEqual(srcvars, [ + (None, 'var1', ''), + (None, 'var2', ''), + ('func1', 'var3', ''), + ('func1', 'var2', ''), + ('func1', 'var4', ''), + (None, 'var5', ''), + ]) + self.assertEqual(self.calls, [ + ('_iter_source_lines', ('spam.c',)), + ('_iter_global', (content.splitlines(),)), + ('_parse_var', ('',)), + ('_parse_var', ('',)), + ('_parse_var', ('',)), + ('_parse_func', ('', '')), + ('_iter_local', ([''],)), + ('_parse_var', ('',)), + ('_parse_compound', ('', [('
    ', '')])), + ('_parse_var', ('if (',)), + ('_parse_var', ('',)), + ('_parse_var', (')',)), + ('_parse_var', ('',)), + ('_iter_local', ([''],)), + ('_parse_var', ('',)), + ('_parse_var', ('',)), + ]) + + def test_no_locals(self): + content = textwrap.dedent(''' + ... + ''') + self._return_iter_source_lines = content + self._return_iter_global = [ + [('', None), # var1 + ('', None), # non-var + ('', None), # var2 + ('', ''), # func1 + ], + ] + self._return_iter_local = [ + # func1 + [('', None), # non-var + ('', [('
    ', '')]), # if + ('', None), # non-var + ], + # if + [('', None), # non-var + ], + ] + self._return_parse_func = [ + ('func1', ''), + ] + self._return_parse_var = [ + ('var1', ''), + (None, None), + ('var2', ''), + (None, None), + (None, None), + (None, None), + (None, None), + (None, None), + (None, None), + ] + self._return_parse_compound = [ + ([[ + 'if (', + '', + ')', + ], + ], + ['']), + ] + + srcvars = list(iter_variables('spam.c', + _iter_source_lines=self._iter_source_lines, + _iter_global=self._iter_global, + _iter_local=self._iter_local, + _parse_func=self._parse_func, + _parse_var=self._parse_var, + _parse_compound=self._parse_compound, + )) + + self.assertEqual(srcvars, [ + (None, 'var1', ''), + (None, 'var2', ''), + ]) + self.assertEqual(self.calls, [ + ('_iter_source_lines', ('spam.c',)), + ('_iter_global', (content.splitlines(),)), + ('_parse_var', ('',)), + ('_parse_var', ('',)), + ('_parse_var', ('',)), + ('_parse_func', ('', '')), + ('_iter_local', ([''],)), + ('_parse_var', ('',)), + ('_parse_compound', ('', [('
    ', '')])), + ('_parse_var', ('if (',)), + ('_parse_var', ('',)), + ('_parse_var', (')',)), + ('_parse_var', ('',)), + ('_iter_local', ([''],)), + ('_parse_var', ('',)), + ]) diff --git a/Lib/test/test_tools/test_c_analyzer/test_parser/test_preprocessor.py b/Lib/test/test_tools/test_c_analyzer/test_parser/test_preprocessor.py new file mode 100644 index 0000000000000000000000000000000000000000..b7f950f813976370ee8b5dde8637196aeb9d5c25 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_parser/test_preprocessor.py @@ -0,0 +1,1561 @@ +import textwrap +import unittest +import sys + +from ..util import wrapped_arg_combos, StrProxy +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.parser.preprocessor import ( + iter_lines, + # directives + parse_directive, PreprocessorDirective, + Constant, Macro, IfDirective, Include, OtherDirective, + ) + + +class TestCaseBase(unittest.TestCase): + + maxDiff = None + + def reset(self): + self._calls = [] + self.errors = None + + @property + def calls(self): + try: + return self._calls + except AttributeError: + self._calls = [] + return self._calls + + errors = None + + def try_next_exc(self): + if not self.errors: + return + if exc := self.errors.pop(0): + raise exc + + def check_calls(self, *expected): + self.assertEqual(self.calls, list(expected)) + self.assertEqual(self.errors or [], []) + + +class IterLinesTests(TestCaseBase): + + parsed = None + + def check_calls(self, *expected): + super().check_calls(*expected) + self.assertEqual(self.parsed or [], []) + + def _parse_directive(self, line): + self.calls.append( + ('_parse_directive', line)) + self.try_next_exc() + return self.parsed.pop(0) + + def test_no_lines(self): + lines = [] + + results = list( + iter_lines(lines, _parse_directive=self._parse_directive)) + + self.assertEqual(results, []) + self.check_calls() + + def test_no_directives(self): + lines = textwrap.dedent(''' + + // xyz + typedef enum { + SPAM + EGGS + } kind; + + struct info { + kind kind; + int status; + }; + + typedef struct spam { + struct info info; + } myspam; + + static int spam = 0; + + /** + * ... + */ + static char * + get_name(int arg, + char *default, + ) + { + return default + } + + int check(void) { + return 0; + } + + ''')[1:-1].splitlines() + expected = [(lno, line, None, ()) + for lno, line in enumerate(lines, 1)] + expected[1] = (2, ' ', None, ()) + expected[20] = (21, ' ', None, ()) + del expected[19] + del expected[18] + + results = list( + iter_lines(lines, _parse_directive=self._parse_directive)) + + self.assertEqual(results, expected) + self.check_calls() + + def test_single_directives(self): + tests = [ + ('#include ', Include('')), + ('#define SPAM 1', Constant('SPAM', '1')), + ('#define SPAM() 1', Macro('SPAM', (), '1')), + ('#define SPAM(a, b) a = b;', Macro('SPAM', ('a', 'b'), 'a = b;')), + ('#if defined(SPAM)', IfDirective('if', 'defined(SPAM)')), + ('#ifdef SPAM', IfDirective('ifdef', 'SPAM')), + ('#ifndef SPAM', IfDirective('ifndef', 'SPAM')), + ('#elseif defined(SPAM)', IfDirective('elseif', 'defined(SPAM)')), + ('#else', OtherDirective('else', None)), + ('#endif', OtherDirective('endif', None)), + ('#error ...', OtherDirective('error', '...')), + ('#warning ...', OtherDirective('warning', '...')), + ('#__FILE__ ...', OtherDirective('__FILE__', '...')), + ('#__LINE__ ...', OtherDirective('__LINE__', '...')), + ('#__DATE__ ...', OtherDirective('__DATE__', '...')), + ('#__TIME__ ...', OtherDirective('__TIME__', '...')), + ('#__TIMESTAMP__ ...', OtherDirective('__TIMESTAMP__', '...')), + ] + for line, directive in tests: + with self.subTest(line): + self.reset() + self.parsed = [ + directive, + ] + text = textwrap.dedent(''' + static int spam = 0; + {} + static char buffer[256]; + ''').strip().format(line) + lines = text.strip().splitlines() + + results = list( + iter_lines(lines, _parse_directive=self._parse_directive)) + + self.assertEqual(results, [ + (1, 'static int spam = 0;', None, ()), + (2, line, directive, ()), + ((3, 'static char buffer[256];', None, ('defined(SPAM)',)) + if directive.kind in ('if', 'ifdef', 'elseif') + else (3, 'static char buffer[256];', None, ('! defined(SPAM)',)) + if directive.kind == 'ifndef' + else (3, 'static char buffer[256];', None, ())), + ]) + self.check_calls( + ('_parse_directive', line), + ) + + def test_directive_whitespace(self): + line = ' # define eggs ( a , b ) { a = b ; } ' + directive = Macro('eggs', ('a', 'b'), '{ a = b; }') + self.parsed = [ + directive, + ] + lines = [line] + + results = list( + iter_lines(lines, _parse_directive=self._parse_directive)) + + self.assertEqual(results, [ + (1, line, directive, ()), + ]) + self.check_calls( + ('_parse_directive', '#define eggs ( a , b ) { a = b ; }'), + ) + + @unittest.skipIf(sys.platform == 'win32', 'needs fix under Windows') + def test_split_lines(self): + directive = Macro('eggs', ('a', 'b'), '{ a = b; }') + self.parsed = [ + directive, + ] + text = textwrap.dedent(r''' + static int spam = 0; + #define eggs(a, b) \ + { \ + a = b; \ + } + static char buffer[256]; + ''').strip() + lines = [line + '\n' for line in text.splitlines()] + lines[-1] = lines[-1][:-1] + + results = list( + iter_lines(lines, _parse_directive=self._parse_directive)) + + self.assertEqual(results, [ + (1, 'static int spam = 0;\n', None, ()), + (5, '#define eggs(a, b) { a = b; }\n', directive, ()), + (6, 'static char buffer[256];', None, ()), + ]) + self.check_calls( + ('_parse_directive', '#define eggs(a, b) { a = b; }'), + ) + + def test_nested_conditions(self): + directives = [ + IfDirective('ifdef', 'SPAM'), + IfDirective('if', 'SPAM == 1'), + IfDirective('elseif', 'SPAM == 2'), + OtherDirective('else', None), + OtherDirective('endif', None), + OtherDirective('endif', None), + ] + self.parsed = list(directives) + text = textwrap.dedent(r''' + static int spam = 0; + + #ifdef SPAM + static int start = 0; + # if SPAM == 1 + static char buffer[10]; + # elif SPAM == 2 + static char buffer[100]; + # else + static char buffer[256]; + # endif + static int end = 0; + #endif + + static int eggs = 0; + ''').strip() + lines = [line for line in text.splitlines() if line.strip()] + + results = list( + iter_lines(lines, _parse_directive=self._parse_directive)) + + self.assertEqual(results, [ + (1, 'static int spam = 0;', None, ()), + (2, '#ifdef SPAM', directives[0], ()), + (3, 'static int start = 0;', None, ('defined(SPAM)',)), + (4, '# if SPAM == 1', directives[1], ('defined(SPAM)',)), + (5, 'static char buffer[10];', None, ('defined(SPAM)', 'SPAM == 1')), + (6, '# elif SPAM == 2', directives[2], ('defined(SPAM)', 'SPAM == 1')), + (7, 'static char buffer[100];', None, ('defined(SPAM)', '! (SPAM == 1)', 'SPAM == 2')), + (8, '# else', directives[3], ('defined(SPAM)', '! (SPAM == 1)', 'SPAM == 2')), + (9, 'static char buffer[256];', None, ('defined(SPAM)', '! (SPAM == 1)', '! (SPAM == 2)')), + (10, '# endif', directives[4], ('defined(SPAM)', '! (SPAM == 1)', '! (SPAM == 2)')), + (11, 'static int end = 0;', None, ('defined(SPAM)',)), + (12, '#endif', directives[5], ('defined(SPAM)',)), + (13, 'static int eggs = 0;', None, ()), + ]) + self.check_calls( + ('_parse_directive', '#ifdef SPAM'), + ('_parse_directive', '#if SPAM == 1'), + ('_parse_directive', '#elif SPAM == 2'), + ('_parse_directive', '#else'), + ('_parse_directive', '#endif'), + ('_parse_directive', '#endif'), + ) + + def test_split_blocks(self): + directives = [ + IfDirective('ifdef', 'SPAM'), + OtherDirective('else', None), + OtherDirective('endif', None), + ] + self.parsed = list(directives) + text = textwrap.dedent(r''' + void str_copy(char *buffer, *orig); + + int init(char *name) { + static int initialized = 0; + if (initialized) { + return 0; + } + #ifdef SPAM + static char buffer[10]; + str_copy(buffer, char); + } + + void copy(char *buffer, *orig) { + strncpy(buffer, orig, 9); + buffer[9] = 0; + } + + #else + static char buffer[256]; + str_copy(buffer, char); + } + + void copy(char *buffer, *orig) { + strcpy(buffer, orig); + } + + #endif + ''').strip() + lines = [line for line in text.splitlines() if line.strip()] + + results = list( + iter_lines(lines, _parse_directive=self._parse_directive)) + + self.assertEqual(results, [ + (1, 'void str_copy(char *buffer, *orig);', None, ()), + (2, 'int init(char *name) {', None, ()), + (3, ' static int initialized = 0;', None, ()), + (4, ' if (initialized) {', None, ()), + (5, ' return 0;', None, ()), + (6, ' }', None, ()), + + (7, '#ifdef SPAM', directives[0], ()), + + (8, ' static char buffer[10];', None, ('defined(SPAM)',)), + (9, ' str_copy(buffer, char);', None, ('defined(SPAM)',)), + (10, '}', None, ('defined(SPAM)',)), + (11, 'void copy(char *buffer, *orig) {', None, ('defined(SPAM)',)), + (12, ' strncpy(buffer, orig, 9);', None, ('defined(SPAM)',)), + (13, ' buffer[9] = 0;', None, ('defined(SPAM)',)), + (14, '}', None, ('defined(SPAM)',)), + + (15, '#else', directives[1], ('defined(SPAM)',)), + + (16, ' static char buffer[256];', None, ('! (defined(SPAM))',)), + (17, ' str_copy(buffer, char);', None, ('! (defined(SPAM))',)), + (18, '}', None, ('! (defined(SPAM))',)), + (19, 'void copy(char *buffer, *orig) {', None, ('! (defined(SPAM))',)), + (20, ' strcpy(buffer, orig);', None, ('! (defined(SPAM))',)), + (21, '}', None, ('! (defined(SPAM))',)), + + (22, '#endif', directives[2], ('! (defined(SPAM))',)), + ]) + self.check_calls( + ('_parse_directive', '#ifdef SPAM'), + ('_parse_directive', '#else'), + ('_parse_directive', '#endif'), + ) + + @unittest.skipIf(sys.platform == 'win32', 'needs fix under Windows') + def test_basic(self): + directives = [ + Include(''), + IfDirective('ifdef', 'SPAM'), + IfDirective('if', '! defined(HAM) || !HAM'), + Constant('HAM', '0'), + IfDirective('elseif', 'HAM < 0'), + Constant('HAM', '-1'), + OtherDirective('else', None), + OtherDirective('endif', None), + OtherDirective('endif', None), + IfDirective('if', 'defined(HAM) && (HAM < 0 || ! HAM)'), + OtherDirective('undef', 'HAM'), + OtherDirective('endif', None), + IfDirective('ifndef', 'HAM'), + OtherDirective('endif', None), + ] + self.parsed = list(directives) + text = textwrap.dedent(r''' + #include + print("begin"); + #ifdef SPAM + print("spam"); + #if ! defined(HAM) || !HAM + # DEFINE HAM 0 + #elseif HAM < 0 + # DEFINE HAM -1 + #else + print("ham HAM"); + #endif + #endif + + #if defined(HAM) && \ + (HAM < 0 || ! HAM) + print("ham?"); + #undef HAM + # endif + + #ifndef HAM + print("no ham"); + #endif + print("end"); + ''')[1:-1] + lines = [line + '\n' for line in text.splitlines()] + lines[-1] = lines[-1][:-1] + + results = list( + iter_lines(lines, _parse_directive=self._parse_directive)) + + self.assertEqual(results, [ + (1, '#include \n', Include(''), ()), + (2, 'print("begin");\n', None, ()), + # + (3, '#ifdef SPAM\n', + IfDirective('ifdef', 'SPAM'), + ()), + (4, ' print("spam");\n', + None, + ('defined(SPAM)',)), + (5, ' #if ! defined(HAM) || !HAM\n', + IfDirective('if', '! defined(HAM) || !HAM'), + ('defined(SPAM)',)), + (6, '# DEFINE HAM 0\n', + Constant('HAM', '0'), + ('defined(SPAM)', '! defined(HAM) || !HAM')), + (7, ' #elseif HAM < 0\n', + IfDirective('elseif', 'HAM < 0'), + ('defined(SPAM)', '! defined(HAM) || !HAM')), + (8, '# DEFINE HAM -1\n', + Constant('HAM', '-1'), + ('defined(SPAM)', '! (! defined(HAM) || !HAM)', 'HAM < 0')), + (9, ' #else\n', + OtherDirective('else', None), + ('defined(SPAM)', '! (! defined(HAM) || !HAM)', 'HAM < 0')), + (10, ' print("ham HAM");\n', + None, + ('defined(SPAM)', '! (! defined(HAM) || !HAM)', '! (HAM < 0)')), + (11, ' #endif\n', + OtherDirective('endif', None), + ('defined(SPAM)', '! (! defined(HAM) || !HAM)', '! (HAM < 0)')), + (12, '#endif\n', + OtherDirective('endif', None), + ('defined(SPAM)',)), + # + (13, '\n', None, ()), + # + (15, '#if defined(HAM) && (HAM < 0 || ! HAM)\n', + IfDirective('if', 'defined(HAM) && (HAM < 0 || ! HAM)'), + ()), + (16, ' print("ham?");\n', + None, + ('defined(HAM) && (HAM < 0 || ! HAM)',)), + (17, ' #undef HAM\n', + OtherDirective('undef', 'HAM'), + ('defined(HAM) && (HAM < 0 || ! HAM)',)), + (18, '# endif\n', + OtherDirective('endif', None), + ('defined(HAM) && (HAM < 0 || ! HAM)',)), + # + (19, '\n', None, ()), + # + (20, '#ifndef HAM\n', + IfDirective('ifndef', 'HAM'), + ()), + (21, ' print("no ham");\n', + None, + ('! defined(HAM)',)), + (22, '#endif\n', + OtherDirective('endif', None), + ('! defined(HAM)',)), + # + (23, 'print("end");', None, ()), + ]) + + @unittest.skipIf(sys.platform == 'win32', 'needs fix under Windows') + def test_typical(self): + # We use Include/compile.h from commit 66c4f3f38b86. It has + # a good enough mix of code without being too large. + directives = [ + IfDirective('ifndef', 'Py_COMPILE_H'), + Constant('Py_COMPILE_H', None), + + IfDirective('ifndef', 'Py_LIMITED_API'), + + Include('"code.h"'), + + IfDirective('ifdef', '__cplusplus'), + OtherDirective('endif', None), + + Constant('PyCF_MASK', '(CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | CO_FUTURE_GENERATOR_STOP | CO_FUTURE_ANNOTATIONS)'), + Constant('PyCF_MASK_OBSOLETE', '(CO_NESTED)'), + Constant('PyCF_SOURCE_IS_UTF8', ' 0x0100'), + Constant('PyCF_DONT_IMPLY_DEDENT', '0x0200'), + Constant('PyCF_ONLY_AST', '0x0400'), + Constant('PyCF_IGNORE_COOKIE', '0x0800'), + Constant('PyCF_TYPE_COMMENTS', '0x1000'), + Constant('PyCF_ALLOW_TOP_LEVEL_AWAIT', '0x2000'), + + IfDirective('ifndef', 'Py_LIMITED_API'), + OtherDirective('endif', None), + + Constant('FUTURE_NESTED_SCOPES', '"nested_scopes"'), + Constant('FUTURE_GENERATORS', '"generators"'), + Constant('FUTURE_DIVISION', '"division"'), + Constant('FUTURE_ABSOLUTE_IMPORT', '"absolute_import"'), + Constant('FUTURE_WITH_STATEMENT', '"with_statement"'), + Constant('FUTURE_PRINT_FUNCTION', '"print_function"'), + Constant('FUTURE_UNICODE_LITERALS', '"unicode_literals"'), + Constant('FUTURE_BARRY_AS_BDFL', '"barry_as_FLUFL"'), + Constant('FUTURE_GENERATOR_STOP', '"generator_stop"'), + Constant('FUTURE_ANNOTATIONS', '"annotations"'), + + Macro('PyAST_Compile', ('mod', 's', 'f', 'ar'), 'PyAST_CompileEx(mod, s, f, -1, ar)'), + + Constant('PY_INVALID_STACK_EFFECT', 'INT_MAX'), + + IfDirective('ifdef', '__cplusplus'), + OtherDirective('endif', None), + + OtherDirective('endif', None), # ifndef Py_LIMITED_API + + Constant('Py_single_input', '256'), + Constant('Py_file_input', '257'), + Constant('Py_eval_input', '258'), + Constant('Py_func_type_input', '345'), + + OtherDirective('endif', None), # ifndef Py_COMPILE_H + ] + self.parsed = list(directives) + text = textwrap.dedent(r''' + #ifndef Py_COMPILE_H + #define Py_COMPILE_H + + #ifndef Py_LIMITED_API + #include "code.h" + + #ifdef __cplusplus + extern "C" { + #endif + + /* Public interface */ + struct _node; /* Declare the existence of this type */ + PyAPI_FUNC(PyCodeObject *) PyNode_Compile(struct _node *, const char *); + /* XXX (ncoghlan): Unprefixed type name in a public API! */ + + #define PyCF_MASK (CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | \ + CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | \ + CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | \ + CO_FUTURE_GENERATOR_STOP | CO_FUTURE_ANNOTATIONS) + #define PyCF_MASK_OBSOLETE (CO_NESTED) + #define PyCF_SOURCE_IS_UTF8 0x0100 + #define PyCF_DONT_IMPLY_DEDENT 0x0200 + #define PyCF_ONLY_AST 0x0400 + #define PyCF_IGNORE_COOKIE 0x0800 + #define PyCF_TYPE_COMMENTS 0x1000 + #define PyCF_ALLOW_TOP_LEVEL_AWAIT 0x2000 + + #ifndef Py_LIMITED_API + typedef struct { + int cf_flags; /* bitmask of CO_xxx flags relevant to future */ + int cf_feature_version; /* minor Python version (PyCF_ONLY_AST) */ + } PyCompilerFlags; + #endif + + /* Future feature support */ + + typedef struct { + int ff_features; /* flags set by future statements */ + int ff_lineno; /* line number of last future statement */ + } PyFutureFeatures; + + #define FUTURE_NESTED_SCOPES "nested_scopes" + #define FUTURE_GENERATORS "generators" + #define FUTURE_DIVISION "division" + #define FUTURE_ABSOLUTE_IMPORT "absolute_import" + #define FUTURE_WITH_STATEMENT "with_statement" + #define FUTURE_PRINT_FUNCTION "print_function" + #define FUTURE_UNICODE_LITERALS "unicode_literals" + #define FUTURE_BARRY_AS_BDFL "barry_as_FLUFL" + #define FUTURE_GENERATOR_STOP "generator_stop" + #define FUTURE_ANNOTATIONS "annotations" + + struct _mod; /* Declare the existence of this type */ + #define PyAST_Compile(mod, s, f, ar) PyAST_CompileEx(mod, s, f, -1, ar) + PyAPI_FUNC(PyCodeObject *) PyAST_CompileEx( + struct _mod *mod, + const char *filename, /* decoded from the filesystem encoding */ + PyCompilerFlags *flags, + int optimize, + PyArena *arena); + PyAPI_FUNC(PyCodeObject *) PyAST_CompileObject( + struct _mod *mod, + PyObject *filename, + PyCompilerFlags *flags, + int optimize, + PyArena *arena); + PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST( + struct _mod * mod, + const char *filename /* decoded from the filesystem encoding */ + ); + PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromASTObject( + struct _mod * mod, + PyObject *filename + ); + + /* _Py_Mangle is defined in compile.c */ + PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name); + + #define PY_INVALID_STACK_EFFECT INT_MAX + PyAPI_FUNC(int) PyCompile_OpcodeStackEffect(int opcode, int oparg); + PyAPI_FUNC(int) PyCompile_OpcodeStackEffectWithJump(int opcode, int oparg, int jump); + + PyAPI_FUNC(int) _PyAST_Optimize(struct _mod *, PyArena *arena, int optimize); + + #ifdef __cplusplus + } + #endif + + #endif /* !Py_LIMITED_API */ + + /* These definitions must match corresponding definitions in graminit.h. */ + #define Py_single_input 256 + #define Py_file_input 257 + #define Py_eval_input 258 + #define Py_func_type_input 345 + + #endif /* !Py_COMPILE_H */ + ''').strip() + lines = [line + '\n' for line in text.splitlines()] + lines[-1] = lines[-1][:-1] + + results = list( + iter_lines(lines, _parse_directive=self._parse_directive)) + + self.assertEqual(results, [ + (1, '#ifndef Py_COMPILE_H\n', + IfDirective('ifndef', 'Py_COMPILE_H'), + ()), + (2, '#define Py_COMPILE_H\n', + Constant('Py_COMPILE_H', None), + ('! defined(Py_COMPILE_H)',)), + (3, '\n', + None, + ('! defined(Py_COMPILE_H)',)), + (4, '#ifndef Py_LIMITED_API\n', + IfDirective('ifndef', 'Py_LIMITED_API'), + ('! defined(Py_COMPILE_H)',)), + (5, '#include "code.h"\n', + Include('"code.h"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (6, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (7, '#ifdef __cplusplus\n', + IfDirective('ifdef', '__cplusplus'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (8, 'extern "C" {\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', 'defined(__cplusplus)')), + (9, '#endif\n', + OtherDirective('endif', None), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', 'defined(__cplusplus)')), + (10, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (11, ' \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (12, 'struct _node; \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (13, 'PyAPI_FUNC(PyCodeObject *) PyNode_Compile(struct _node *, const char *);\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (14, ' \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (15, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (19, '#define PyCF_MASK (CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | CO_FUTURE_GENERATOR_STOP | CO_FUTURE_ANNOTATIONS)\n', + Constant('PyCF_MASK', '(CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | CO_FUTURE_GENERATOR_STOP | CO_FUTURE_ANNOTATIONS)'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (20, '#define PyCF_MASK_OBSOLETE (CO_NESTED)\n', + Constant('PyCF_MASK_OBSOLETE', '(CO_NESTED)'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (21, '#define PyCF_SOURCE_IS_UTF8 0x0100\n', + Constant('PyCF_SOURCE_IS_UTF8', ' 0x0100'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (22, '#define PyCF_DONT_IMPLY_DEDENT 0x0200\n', + Constant('PyCF_DONT_IMPLY_DEDENT', '0x0200'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (23, '#define PyCF_ONLY_AST 0x0400\n', + Constant('PyCF_ONLY_AST', '0x0400'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (24, '#define PyCF_IGNORE_COOKIE 0x0800\n', + Constant('PyCF_IGNORE_COOKIE', '0x0800'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (25, '#define PyCF_TYPE_COMMENTS 0x1000\n', + Constant('PyCF_TYPE_COMMENTS', '0x1000'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (26, '#define PyCF_ALLOW_TOP_LEVEL_AWAIT 0x2000\n', + Constant('PyCF_ALLOW_TOP_LEVEL_AWAIT', '0x2000'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (27, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (28, '#ifndef Py_LIMITED_API\n', + IfDirective('ifndef', 'Py_LIMITED_API'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (29, 'typedef struct {\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', '! defined(Py_LIMITED_API)')), + (30, ' int cf_flags; \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', '! defined(Py_LIMITED_API)')), + (31, ' int cf_feature_version; \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', '! defined(Py_LIMITED_API)')), + (32, '} PyCompilerFlags;\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', '! defined(Py_LIMITED_API)')), + (33, '#endif\n', + OtherDirective('endif', None), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', '! defined(Py_LIMITED_API)')), + (34, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (35, ' \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (36, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (37, 'typedef struct {\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (38, ' int ff_features; \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (39, ' int ff_lineno; \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (40, '} PyFutureFeatures;\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (41, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (42, '#define FUTURE_NESTED_SCOPES "nested_scopes"\n', + Constant('FUTURE_NESTED_SCOPES', '"nested_scopes"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (43, '#define FUTURE_GENERATORS "generators"\n', + Constant('FUTURE_GENERATORS', '"generators"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (44, '#define FUTURE_DIVISION "division"\n', + Constant('FUTURE_DIVISION', '"division"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (45, '#define FUTURE_ABSOLUTE_IMPORT "absolute_import"\n', + Constant('FUTURE_ABSOLUTE_IMPORT', '"absolute_import"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (46, '#define FUTURE_WITH_STATEMENT "with_statement"\n', + Constant('FUTURE_WITH_STATEMENT', '"with_statement"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (47, '#define FUTURE_PRINT_FUNCTION "print_function"\n', + Constant('FUTURE_PRINT_FUNCTION', '"print_function"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (48, '#define FUTURE_UNICODE_LITERALS "unicode_literals"\n', + Constant('FUTURE_UNICODE_LITERALS', '"unicode_literals"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (49, '#define FUTURE_BARRY_AS_BDFL "barry_as_FLUFL"\n', + Constant('FUTURE_BARRY_AS_BDFL', '"barry_as_FLUFL"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (50, '#define FUTURE_GENERATOR_STOP "generator_stop"\n', + Constant('FUTURE_GENERATOR_STOP', '"generator_stop"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (51, '#define FUTURE_ANNOTATIONS "annotations"\n', + Constant('FUTURE_ANNOTATIONS', '"annotations"'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (52, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (53, 'struct _mod; \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (54, '#define PyAST_Compile(mod, s, f, ar) PyAST_CompileEx(mod, s, f, -1, ar)\n', + Macro('PyAST_Compile', ('mod', 's', 'f', 'ar'), 'PyAST_CompileEx(mod, s, f, -1, ar)'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (55, 'PyAPI_FUNC(PyCodeObject *) PyAST_CompileEx(\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (56, ' struct _mod *mod,\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (57, ' const char *filename, \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (58, ' PyCompilerFlags *flags,\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (59, ' int optimize,\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (60, ' PyArena *arena);\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (61, 'PyAPI_FUNC(PyCodeObject *) PyAST_CompileObject(\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (62, ' struct _mod *mod,\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (63, ' PyObject *filename,\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (64, ' PyCompilerFlags *flags,\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (65, ' int optimize,\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (66, ' PyArena *arena);\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (67, 'PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (68, ' struct _mod * mod,\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (69, ' const char *filename \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (70, ' );\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (71, 'PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromASTObject(\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (72, ' struct _mod * mod,\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (73, ' PyObject *filename\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (74, ' );\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (75, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (76, ' \n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (77, 'PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name);\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (78, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (79, '#define PY_INVALID_STACK_EFFECT INT_MAX\n', + Constant('PY_INVALID_STACK_EFFECT', 'INT_MAX'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (80, 'PyAPI_FUNC(int) PyCompile_OpcodeStackEffect(int opcode, int oparg);\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (81, 'PyAPI_FUNC(int) PyCompile_OpcodeStackEffectWithJump(int opcode, int oparg, int jump);\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (82, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (83, 'PyAPI_FUNC(int) _PyAST_Optimize(struct _mod *, PyArena *arena, int optimize);\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (84, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (85, '#ifdef __cplusplus\n', + IfDirective('ifdef', '__cplusplus'), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (86, '}\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', 'defined(__cplusplus)')), + (87, '#endif\n', + OtherDirective('endif', None), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)', 'defined(__cplusplus)')), + (88, '\n', + None, + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (89, '#endif \n', + OtherDirective('endif', None), + ('! defined(Py_COMPILE_H)', '! defined(Py_LIMITED_API)')), + (90, '\n', + None, + ('! defined(Py_COMPILE_H)',)), + (91, ' \n', + None, + ('! defined(Py_COMPILE_H)',)), + (92, '#define Py_single_input 256\n', + Constant('Py_single_input', '256'), + ('! defined(Py_COMPILE_H)',)), + (93, '#define Py_file_input 257\n', + Constant('Py_file_input', '257'), + ('! defined(Py_COMPILE_H)',)), + (94, '#define Py_eval_input 258\n', + Constant('Py_eval_input', '258'), + ('! defined(Py_COMPILE_H)',)), + (95, '#define Py_func_type_input 345\n', + Constant('Py_func_type_input', '345'), + ('! defined(Py_COMPILE_H)',)), + (96, '\n', + None, + ('! defined(Py_COMPILE_H)',)), + (97, '#endif ', + OtherDirective('endif', None), + ('! defined(Py_COMPILE_H)',)), + ]) + self.check_calls( + ('_parse_directive', '#ifndef Py_COMPILE_H'), + ('_parse_directive', '#define Py_COMPILE_H'), + ('_parse_directive', '#ifndef Py_LIMITED_API'), + ('_parse_directive', '#include "code.h"'), + ('_parse_directive', '#ifdef __cplusplus'), + ('_parse_directive', '#endif'), + ('_parse_directive', '#define PyCF_MASK (CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | CO_FUTURE_GENERATOR_STOP | CO_FUTURE_ANNOTATIONS)'), + ('_parse_directive', '#define PyCF_MASK_OBSOLETE (CO_NESTED)'), + ('_parse_directive', '#define PyCF_SOURCE_IS_UTF8 0x0100'), + ('_parse_directive', '#define PyCF_DONT_IMPLY_DEDENT 0x0200'), + ('_parse_directive', '#define PyCF_ONLY_AST 0x0400'), + ('_parse_directive', '#define PyCF_IGNORE_COOKIE 0x0800'), + ('_parse_directive', '#define PyCF_TYPE_COMMENTS 0x1000'), + ('_parse_directive', '#define PyCF_ALLOW_TOP_LEVEL_AWAIT 0x2000'), + ('_parse_directive', '#ifndef Py_LIMITED_API'), + ('_parse_directive', '#endif'), + ('_parse_directive', '#define FUTURE_NESTED_SCOPES "nested_scopes"'), + ('_parse_directive', '#define FUTURE_GENERATORS "generators"'), + ('_parse_directive', '#define FUTURE_DIVISION "division"'), + ('_parse_directive', '#define FUTURE_ABSOLUTE_IMPORT "absolute_import"'), + ('_parse_directive', '#define FUTURE_WITH_STATEMENT "with_statement"'), + ('_parse_directive', '#define FUTURE_PRINT_FUNCTION "print_function"'), + ('_parse_directive', '#define FUTURE_UNICODE_LITERALS "unicode_literals"'), + ('_parse_directive', '#define FUTURE_BARRY_AS_BDFL "barry_as_FLUFL"'), + ('_parse_directive', '#define FUTURE_GENERATOR_STOP "generator_stop"'), + ('_parse_directive', '#define FUTURE_ANNOTATIONS "annotations"'), + ('_parse_directive', '#define PyAST_Compile(mod, s, f, ar) PyAST_CompileEx(mod, s, f, -1, ar)'), + ('_parse_directive', '#define PY_INVALID_STACK_EFFECT INT_MAX'), + ('_parse_directive', '#ifdef __cplusplus'), + ('_parse_directive', '#endif'), + ('_parse_directive', '#endif'), + ('_parse_directive', '#define Py_single_input 256'), + ('_parse_directive', '#define Py_file_input 257'), + ('_parse_directive', '#define Py_eval_input 258'), + ('_parse_directive', '#define Py_func_type_input 345'), + ('_parse_directive', '#endif'), + ) + + +class ParseDirectiveTests(unittest.TestCase): + + def test_directives(self): + tests = [ + # includes + ('#include "internal/pycore_pystate.h"', Include('"internal/pycore_pystate.h"')), + ('#include ', Include('')), + + # defines + ('#define SPAM int', Constant('SPAM', 'int')), + ('#define SPAM', Constant('SPAM', '')), + ('#define SPAM(x, y) run(x, y)', Macro('SPAM', ('x', 'y'), 'run(x, y)')), + ('#undef SPAM', None), + + # conditionals + ('#if SPAM', IfDirective('if', 'SPAM')), + # XXX complex conditionls + ('#ifdef SPAM', IfDirective('ifdef', 'SPAM')), + ('#ifndef SPAM', IfDirective('ifndef', 'SPAM')), + ('#elseif SPAM', IfDirective('elseif', 'SPAM')), + # XXX complex conditionls + ('#else', OtherDirective('else', '')), + ('#endif', OtherDirective('endif', '')), + + # other + ('#error oops!', None), + ('#warning oops!', None), + ('#pragma ...', None), + ('#__FILE__ ...', None), + ('#__LINE__ ...', None), + ('#__DATE__ ...', None), + ('#__TIME__ ...', None), + ('#__TIMESTAMP__ ...', None), + + # extra whitespace + (' # include ', Include('')), + ('#else ', OtherDirective('else', '')), + ('#endif ', OtherDirective('endif', '')), + ('#define SPAM int ', Constant('SPAM', 'int')), + ('#define SPAM ', Constant('SPAM', '')), + ] + for line, expected in tests: + if expected is None: + kind, _, text = line[1:].partition(' ') + expected = OtherDirective(kind, text) + with self.subTest(line): + directive = parse_directive(line) + + self.assertEqual(directive, expected) + + def test_bad_directives(self): + tests = [ + # valid directives with bad text + '#define 123', + '#else spam', + '#endif spam', + ] + for kind in PreprocessorDirective.KINDS: + # missing leading "#" + tests.append(kind) + if kind in ('else', 'endif'): + continue + # valid directives with missing text + tests.append('#' + kind) + tests.append('#' + kind + ' ') + for line in tests: + with self.subTest(line): + with self.assertRaises(ValueError): + parse_directive(line) + + def test_not_directives(self): + tests = [ + '', + ' ', + 'directive', + 'directive?', + '???', + ] + for line in tests: + with self.subTest(line): + with self.assertRaises(ValueError): + parse_directive(line) + + +class ConstantTests(unittest.TestCase): + + def test_type(self): + directive = Constant('SPAM', '123') + + self.assertIs(type(directive), Constant) + self.assertIsInstance(directive, PreprocessorDirective) + + def test_attrs(self): + d = Constant('SPAM', '123') + kind, name, value = d.kind, d.name, d.value + + self.assertEqual(kind, 'define') + self.assertEqual(name, 'SPAM') + self.assertEqual(value, '123') + + def test_text(self): + tests = [ + (('SPAM', '123'), 'SPAM 123'), + (('SPAM',), 'SPAM'), + ] + for args, expected in tests: + with self.subTest(args): + d = Constant(*args) + text = d.text + + self.assertEqual(text, expected) + + def test_iter(self): + kind, name, value = Constant('SPAM', '123') + + self.assertEqual(kind, 'define') + self.assertEqual(name, 'SPAM') + self.assertEqual(value, '123') + + def test_defaults(self): + kind, name, value = Constant('SPAM') + + self.assertEqual(kind, 'define') + self.assertEqual(name, 'SPAM') + self.assertIs(value, None) + + def test_coerce(self): + tests = [] + # coerced name, value + for args in wrapped_arg_combos('SPAM', '123'): + tests.append((args, ('SPAM', '123'))) + # missing name, value + for name in ('', ' ', None, StrProxy(' '), ()): + for value in ('', ' ', None, StrProxy(' '), ()): + tests.append( + ((name, value), (None, None))) + # whitespace + tests.extend([ + ((' SPAM ', ' 123 '), ('SPAM', '123')), + ]) + + for args, expected in tests: + with self.subTest(args): + d = Constant(*args) + + self.assertEqual(d[1:], expected) + for i, exp in enumerate(expected, start=1): + if exp is not None: + self.assertIs(type(d[i]), str) + + def test_valid(self): + tests = [ + ('SPAM', '123'), + # unusual name + ('_SPAM_', '123'), + ('X_1', '123'), + # unusual value + ('SPAM', None), + ] + for args in tests: + with self.subTest(args): + directive = Constant(*args) + + directive.validate() + + def test_invalid(self): + tests = [ + # invalid name + ((None, '123'), TypeError), + (('_', '123'), ValueError), + (('1', '123'), ValueError), + (('_1_', '123'), ValueError), + # There is no invalid value (including None). + ] + for args, exctype in tests: + with self.subTest(args): + directive = Constant(*args) + + with self.assertRaises(exctype): + directive.validate() + + +class MacroTests(unittest.TestCase): + + def test_type(self): + directive = Macro('SPAM', ('x', 'y'), '123') + + self.assertIs(type(directive), Macro) + self.assertIsInstance(directive, PreprocessorDirective) + + def test_attrs(self): + d = Macro('SPAM', ('x', 'y'), '123') + kind, name, args, body = d.kind, d.name, d.args, d.body + + self.assertEqual(kind, 'define') + self.assertEqual(name, 'SPAM') + self.assertEqual(args, ('x', 'y')) + self.assertEqual(body, '123') + + def test_text(self): + tests = [ + (('SPAM', ('x', 'y'), '123'), 'SPAM(x, y) 123'), + (('SPAM', ('x', 'y'),), 'SPAM(x, y)'), + ] + for args, expected in tests: + with self.subTest(args): + d = Macro(*args) + text = d.text + + self.assertEqual(text, expected) + + def test_iter(self): + kind, name, args, body = Macro('SPAM', ('x', 'y'), '123') + + self.assertEqual(kind, 'define') + self.assertEqual(name, 'SPAM') + self.assertEqual(args, ('x', 'y')) + self.assertEqual(body, '123') + + def test_defaults(self): + kind, name, args, body = Macro('SPAM', ('x', 'y')) + + self.assertEqual(kind, 'define') + self.assertEqual(name, 'SPAM') + self.assertEqual(args, ('x', 'y')) + self.assertIs(body, None) + + def test_coerce(self): + tests = [] + # coerce name and body + for args in wrapped_arg_combos('SPAM', ('x', 'y'), '123'): + tests.append( + (args, ('SPAM', ('x', 'y'), '123'))) + # coerce args + tests.extend([ + (('SPAM', 'x', '123'), + ('SPAM', ('x',), '123')), + (('SPAM', 'x,y', '123'), + ('SPAM', ('x', 'y'), '123')), + ]) + # coerce arg names + for argnames in wrapped_arg_combos('x', 'y'): + tests.append( + (('SPAM', argnames, '123'), + ('SPAM', ('x', 'y'), '123'))) + # missing name, body + for name in ('', ' ', None, StrProxy(' '), ()): + for argnames in (None, ()): + for body in ('', ' ', None, StrProxy(' '), ()): + tests.append( + ((name, argnames, body), + (None, (), None))) + # missing args + tests.extend([ + (('SPAM', None, '123'), + ('SPAM', (), '123')), + (('SPAM', (), '123'), + ('SPAM', (), '123')), + ]) + # missing arg names + for arg in ('', ' ', None, StrProxy(' '), ()): + tests.append( + (('SPAM', (arg,), '123'), + ('SPAM', (None,), '123'))) + tests.extend([ + (('SPAM', ('x', '', 'z'), '123'), + ('SPAM', ('x', None, 'z'), '123')), + ]) + # whitespace + tests.extend([ + ((' SPAM ', (' x ', ' y '), ' 123 '), + ('SPAM', ('x', 'y'), '123')), + (('SPAM', 'x, y', '123'), + ('SPAM', ('x', 'y'), '123')), + ]) + + for args, expected in tests: + with self.subTest(args): + d = Macro(*args) + + self.assertEqual(d[1:], expected) + for i, exp in enumerate(expected, start=1): + if i == 2: + self.assertIs(type(d[i]), tuple) + elif exp is not None: + self.assertIs(type(d[i]), str) + + def test_init_bad_args(self): + tests = [ + ('SPAM', StrProxy('x'), '123'), + ('SPAM', object(), '123'), + ] + for args in tests: + with self.subTest(args): + with self.assertRaises(TypeError): + Macro(*args) + + def test_valid(self): + tests = [ + # unusual name + ('SPAM', ('x', 'y'), 'run(x, y)'), + ('_SPAM_', ('x', 'y'), 'run(x, y)'), + ('X_1', ('x', 'y'), 'run(x, y)'), + # unusual args + ('SPAM', (), 'run(x, y)'), + ('SPAM', ('_x_', 'y_1'), 'run(x, y)'), + ('SPAM', 'x', 'run(x, y)'), + ('SPAM', 'x, y', 'run(x, y)'), + # unusual body + ('SPAM', ('x', 'y'), None), + ] + for args in tests: + with self.subTest(args): + directive = Macro(*args) + + directive.validate() + + def test_invalid(self): + tests = [ + # invalid name + ((None, ('x', 'y'), '123'), TypeError), + (('_', ('x', 'y'), '123'), ValueError), + (('1', ('x', 'y'), '123'), ValueError), + (('_1', ('x', 'y'), '123'), ValueError), + # invalid args + (('SPAM', (None, 'y'), '123'), ValueError), + (('SPAM', ('x', '_'), '123'), ValueError), + (('SPAM', ('x', '1'), '123'), ValueError), + (('SPAM', ('x', '_1_'), '123'), ValueError), + # There is no invalid body (including None). + ] + for args, exctype in tests: + with self.subTest(args): + directive = Macro(*args) + + with self.assertRaises(exctype): + directive.validate() + + +class IfDirectiveTests(unittest.TestCase): + + def test_type(self): + directive = IfDirective('if', '1') + + self.assertIs(type(directive), IfDirective) + self.assertIsInstance(directive, PreprocessorDirective) + + def test_attrs(self): + d = IfDirective('if', '1') + kind, condition = d.kind, d.condition + + self.assertEqual(kind, 'if') + self.assertEqual(condition, '1') + #self.assertEqual(condition, (ArithmeticCondition('1'),)) + + def test_text(self): + tests = [ + (('if', 'defined(SPAM) && 1 || (EGGS > 3 && defined(HAM))'), + 'defined(SPAM) && 1 || (EGGS > 3 && defined(HAM))'), + ] + for kind in IfDirective.KINDS: + tests.append( + ((kind, 'SPAM'), 'SPAM')) + for args, expected in tests: + with self.subTest(args): + d = IfDirective(*args) + text = d.text + + self.assertEqual(text, expected) + + def test_iter(self): + kind, condition = IfDirective('if', '1') + + self.assertEqual(kind, 'if') + self.assertEqual(condition, '1') + #self.assertEqual(condition, (ArithmeticCondition('1'),)) + + #def test_complex_conditions(self): + # ... + + def test_coerce(self): + tests = [] + for kind in IfDirective.KINDS: + if kind == 'ifdef': + cond = 'defined(SPAM)' + elif kind == 'ifndef': + cond = '! defined(SPAM)' + else: + cond = 'SPAM' + for args in wrapped_arg_combos(kind, 'SPAM'): + tests.append((args, (kind, cond))) + tests.extend([ + ((' ' + kind + ' ', ' SPAM '), (kind, cond)), + ]) + for raw in ('', ' ', None, StrProxy(' '), ()): + tests.append(((kind, raw), (kind, None))) + for kind in ('', ' ', None, StrProxy(' '), ()): + tests.append(((kind, 'SPAM'), (None, 'SPAM'))) + for args, expected in tests: + with self.subTest(args): + d = IfDirective(*args) + + self.assertEqual(tuple(d), expected) + for i, exp in enumerate(expected): + if exp is not None: + self.assertIs(type(d[i]), str) + + def test_valid(self): + tests = [] + for kind in IfDirective.KINDS: + tests.extend([ + (kind, 'SPAM'), + (kind, '_SPAM_'), + (kind, 'X_1'), + (kind, '()'), + (kind, '--'), + (kind, '???'), + ]) + for args in tests: + with self.subTest(args): + directive = IfDirective(*args) + + directive.validate() + + def test_invalid(self): + tests = [] + # kind + tests.extend([ + ((None, 'SPAM'), TypeError), + (('_', 'SPAM'), ValueError), + (('-', 'SPAM'), ValueError), + (('spam', 'SPAM'), ValueError), + ]) + for kind in PreprocessorDirective.KINDS: + if kind in IfDirective.KINDS: + continue + tests.append( + ((kind, 'SPAM'), ValueError)) + # condition + for kind in IfDirective.KINDS: + tests.extend([ + ((kind, None), TypeError), + # Any other condition is valid. + ]) + for args, exctype in tests: + with self.subTest(args): + directive = IfDirective(*args) + + with self.assertRaises(exctype): + directive.validate() + + +class IncludeTests(unittest.TestCase): + + def test_type(self): + directive = Include('') + + self.assertIs(type(directive), Include) + self.assertIsInstance(directive, PreprocessorDirective) + + def test_attrs(self): + d = Include('') + kind, file, text = d.kind, d.file, d.text + + self.assertEqual(kind, 'include') + self.assertEqual(file, '') + self.assertEqual(text, '') + + def test_iter(self): + kind, file = Include('') + + self.assertEqual(kind, 'include') + self.assertEqual(file, '') + + def test_coerce(self): + tests = [] + for arg, in wrapped_arg_combos(''): + tests.append((arg, '')) + tests.extend([ + (' ', ''), + ]) + for arg in ('', ' ', None, StrProxy(' '), ()): + tests.append((arg, None )) + for arg, expected in tests: + with self.subTest(arg): + _, file = Include(arg) + + self.assertEqual(file, expected) + if expected is not None: + self.assertIs(type(file), str) + + def test_valid(self): + tests = [ + '', + '"spam.h"', + '"internal/pycore_pystate.h"', + ] + for arg in tests: + with self.subTest(arg): + directive = Include(arg) + + directive.validate() + + def test_invalid(self): + tests = [ + (None, TypeError), + # We currently don't check the file. + ] + for arg, exctype in tests: + with self.subTest(arg): + directive = Include(arg) + + with self.assertRaises(exctype): + directive.validate() + + +class OtherDirectiveTests(unittest.TestCase): + + def test_type(self): + directive = OtherDirective('undef', 'SPAM') + + self.assertIs(type(directive), OtherDirective) + self.assertIsInstance(directive, PreprocessorDirective) + + def test_attrs(self): + d = OtherDirective('undef', 'SPAM') + kind, text = d.kind, d.text + + self.assertEqual(kind, 'undef') + self.assertEqual(text, 'SPAM') + + def test_iter(self): + kind, text = OtherDirective('undef', 'SPAM') + + self.assertEqual(kind, 'undef') + self.assertEqual(text, 'SPAM') + + def test_coerce(self): + tests = [] + for kind in OtherDirective.KINDS: + if kind in ('else', 'endif'): + continue + for args in wrapped_arg_combos(kind, '...'): + tests.append((args, (kind, '...'))) + tests.extend([ + ((' ' + kind + ' ', ' ... '), (kind, '...')), + ]) + for raw in ('', ' ', None, StrProxy(' '), ()): + tests.append(((kind, raw), (kind, None))) + for kind in ('else', 'endif'): + for args in wrapped_arg_combos(kind, None): + tests.append((args, (kind, None))) + tests.extend([ + ((' ' + kind + ' ', None), (kind, None)), + ]) + for kind in ('', ' ', None, StrProxy(' '), ()): + tests.append(((kind, '...'), (None, '...'))) + for args, expected in tests: + with self.subTest(args): + d = OtherDirective(*args) + + self.assertEqual(tuple(d), expected) + for i, exp in enumerate(expected): + if exp is not None: + self.assertIs(type(d[i]), str) + + def test_valid(self): + tests = [] + for kind in OtherDirective.KINDS: + if kind in ('else', 'endif'): + continue + tests.extend([ + (kind, '...'), + (kind, '???'), + (kind, 'SPAM'), + (kind, '1 + 1'), + ]) + for kind in ('else', 'endif'): + tests.append((kind, None)) + for args in tests: + with self.subTest(args): + directive = OtherDirective(*args) + + directive.validate() + + def test_invalid(self): + tests = [] + # kind + tests.extend([ + ((None, '...'), TypeError), + (('_', '...'), ValueError), + (('-', '...'), ValueError), + (('spam', '...'), ValueError), + ]) + for kind in PreprocessorDirective.KINDS: + if kind in OtherDirective.KINDS: + continue + tests.append( + ((kind, None), ValueError)) + # text + for kind in OtherDirective.KINDS: + if kind in ('else', 'endif'): + tests.extend([ + # Any text is invalid. + ((kind, 'SPAM'), ValueError), + ((kind, '...'), ValueError), + ]) + else: + tests.extend([ + ((kind, None), TypeError), + # Any other text is valid. + ]) + for args, exctype in tests: + with self.subTest(args): + directive = OtherDirective(*args) + + with self.assertRaises(exctype): + directive.validate() diff --git a/Lib/test/test_tools/test_c_analyzer/test_symbols/__init__.py b/Lib/test/test_tools/test_c_analyzer/test_symbols/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..bc502ef32d2916feda5f77cfa61faeb28577c058 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_symbols/__init__.py @@ -0,0 +1,6 @@ +import os.path +from test.support import load_package_tests + + +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_tools/test_c_analyzer/test_symbols/test_info.py b/Lib/test/test_tools/test_c_analyzer/test_symbols/test_info.py new file mode 100644 index 0000000000000000000000000000000000000000..1282a89718c820045658728ccb96ba5e9b9a6958 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_symbols/test_info.py @@ -0,0 +1,192 @@ +import string +import unittest + +from ..util import PseudoStr, StrProxy, Object +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.common.info import ID + from c_analyzer.symbols.info import Symbol + + +class SymbolTests(unittest.TestCase): + + VALID_ARGS = ( + ID('x/y/z/spam.c', 'func', 'eggs'), + Symbol.KIND.VARIABLE, + False, + ) + VALID_KWARGS = dict(zip(Symbol._fields, VALID_ARGS)) + VALID_EXPECTED = VALID_ARGS + + def test_init_typical_binary_local(self): + id = ID(None, None, 'spam') + symbol = Symbol( + id=id, + kind=Symbol.KIND.VARIABLE, + external=False, + ) + + self.assertEqual(symbol, ( + id, + Symbol.KIND.VARIABLE, + False, + )) + + def test_init_typical_binary_global(self): + id = ID('Python/ceval.c', None, 'spam') + symbol = Symbol( + id=id, + kind=Symbol.KIND.VARIABLE, + external=False, + ) + + self.assertEqual(symbol, ( + id, + Symbol.KIND.VARIABLE, + False, + )) + + def test_init_coercion(self): + tests = [ + ('str subclass', + dict( + id=PseudoStr('eggs'), + kind=PseudoStr('variable'), + external=0, + ), + (ID(None, None, 'eggs'), + Symbol.KIND.VARIABLE, + False, + )), + ('with filename', + dict( + id=('x/y/z/spam.c', 'eggs'), + kind=PseudoStr('variable'), + external=0, + ), + (ID('x/y/z/spam.c', None, 'eggs'), + Symbol.KIND.VARIABLE, + False, + )), + ('non-str 1', + dict( + id=('a', 'b', 'c'), + kind=StrProxy('variable'), + external=0, + ), + (ID('a', 'b', 'c'), + Symbol.KIND.VARIABLE, + False, + )), + ('non-str 2', + dict( + id=('a', 'b', 'c'), + kind=Object(), + external=0, + ), + (ID('a', 'b', 'c'), + '', + False, + )), + ] + for summary, kwargs, expected in tests: + with self.subTest(summary): + symbol = Symbol(**kwargs) + + for field in Symbol._fields: + value = getattr(symbol, field) + if field == 'external': + self.assertIs(type(value), bool) + elif field == 'id': + self.assertIs(type(value), ID) + else: + self.assertIs(type(value), str) + self.assertEqual(tuple(symbol), expected) + + def test_init_all_missing(self): + id = ID(None, None, 'spam') + + symbol = Symbol(id) + + self.assertEqual(symbol, ( + id, + Symbol.KIND.VARIABLE, + None, + )) + + def test_fields(self): + id = ID('z', 'x', 'a') + + symbol = Symbol(id, 'b', False) + + self.assertEqual(symbol.id, id) + self.assertEqual(symbol.kind, 'b') + self.assertIs(symbol.external, False) + + def test___getattr__(self): + id = ID('z', 'x', 'a') + symbol = Symbol(id, 'b', False) + + filename = symbol.filename + funcname = symbol.funcname + name = symbol.name + + self.assertEqual(filename, 'z') + self.assertEqual(funcname, 'x') + self.assertEqual(name, 'a') + + def test_validate_typical(self): + id = ID('z', 'x', 'a') + + symbol = Symbol( + id=id, + kind=Symbol.KIND.VARIABLE, + external=False, + ) + + symbol.validate() # This does not fail. + + def test_validate_missing_field(self): + for field in Symbol._fields: + with self.subTest(field): + symbol = Symbol(**self.VALID_KWARGS) + symbol = symbol._replace(**{field: None}) + + with self.assertRaises(TypeError): + symbol.validate() + + def test_validate_bad_field(self): + badch = tuple(c for c in string.punctuation + string.digits) + notnames = ( + '1a', + 'a.b', + 'a-b', + '&a', + 'a++', + ) + badch + tests = [ + ('id', notnames), + ('kind', ('bogus',)), + ] + seen = set() + for field, invalid in tests: + for value in invalid: + if field != 'kind': + seen.add(value) + with self.subTest(f'{field}={value!r}'): + symbol = Symbol(**self.VALID_KWARGS) + symbol = symbol._replace(**{field: value}) + + with self.assertRaises(ValueError): + symbol.validate() + + for field, invalid in tests: + if field == 'kind': + continue + valid = seen - set(invalid) + for value in valid: + with self.subTest(f'{field}={value!r}'): + symbol = Symbol(**self.VALID_KWARGS) + symbol = symbol._replace(**{field: value}) + + symbol.validate() # This does not fail. diff --git a/Lib/test/test_tools/test_c_analyzer/test_variables/__init__.py b/Lib/test/test_tools/test_c_analyzer/test_variables/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..bc502ef32d2916feda5f77cfa61faeb28577c058 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_variables/__init__.py @@ -0,0 +1,6 @@ +import os.path +from test.support import load_package_tests + + +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_tools/test_c_analyzer/test_variables/test_find.py b/Lib/test/test_tools/test_c_analyzer/test_variables/test_find.py new file mode 100644 index 0000000000000000000000000000000000000000..7a13cf3f5bf56c49941c42f79ccfc09d8858c7cc --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_variables/test_find.py @@ -0,0 +1,124 @@ +import unittest + +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.variables import info + from c_analyzer.variables.find import ( + vars_from_binary, + ) + + +class _Base(unittest.TestCase): + + maxDiff = None + + @property + def calls(self): + try: + return self._calls + except AttributeError: + self._calls = [] + return self._calls + + +class VarsFromBinaryTests(_Base): + + _return_iter_vars = () + _return_get_symbol_resolver = None + + def setUp(self): + super().setUp() + + self.kwargs = dict( + _iter_vars=self._iter_vars, + _get_symbol_resolver=self._get_symbol_resolver, + ) + + def _iter_vars(self, binfile, resolve, handle_id): + self.calls.append(('_iter_vars', (binfile, resolve, handle_id))) + return [(v, v.id) for v in self._return_iter_vars] + + def _get_symbol_resolver(self, known=None, dirnames=(), *, + handle_var, + filenames=None, + check_filename=None, + perfilecache=None, + ): + self.calls.append(('_get_symbol_resolver', + (known, dirnames, handle_var, filenames, + check_filename, perfilecache))) + return self._return_get_symbol_resolver + + def test_typical(self): + resolver = self._return_get_symbol_resolver = object() + variables = self._return_iter_vars = [ + info.Variable.from_parts('dir1/spam.c', None, 'var1', 'int'), + info.Variable.from_parts('dir1/spam.c', None, 'var2', 'static int'), + info.Variable.from_parts('dir1/spam.c', None, 'var3', 'char *'), + info.Variable.from_parts('dir1/spam.c', 'func2', 'var4', 'const char *'), + info.Variable.from_parts('dir1/eggs.c', None, 'var1', 'static int'), + info.Variable.from_parts('dir1/eggs.c', 'func1', 'var2', 'static char *'), + ] + known = object() + filenames = object() + + found = list(vars_from_binary('python', + known=known, + filenames=filenames, + **self.kwargs)) + + self.assertEqual(found, [ + info.Variable.from_parts('dir1/spam.c', None, 'var1', 'int'), + info.Variable.from_parts('dir1/spam.c', None, 'var2', 'static int'), + info.Variable.from_parts('dir1/spam.c', None, 'var3', 'char *'), + info.Variable.from_parts('dir1/spam.c', 'func2', 'var4', 'const char *'), + info.Variable.from_parts('dir1/eggs.c', None, 'var1', 'static int'), + info.Variable.from_parts('dir1/eggs.c', 'func1', 'var2', 'static char *'), + ]) + self.assertEqual(self.calls, [ + ('_get_symbol_resolver', (filenames, known, info.Variable.from_id, None, None, {})), + ('_iter_vars', ('python', resolver, None)), + ]) + +# self._return_iter_symbols = [ +# s_info.Symbol(('dir1/spam.c', None, 'var1'), 'variable', False), +# s_info.Symbol(('dir1/spam.c', None, 'var2'), 'variable', False), +# s_info.Symbol(('dir1/spam.c', None, 'func1'), 'function', False), +# s_info.Symbol(('dir1/spam.c', None, 'func2'), 'function', True), +# s_info.Symbol(('dir1/spam.c', None, 'var3'), 'variable', False), +# s_info.Symbol(('dir1/spam.c', 'func2', 'var4'), 'variable', False), +# s_info.Symbol(('dir1/ham.c', None, 'var1'), 'variable', True), +# s_info.Symbol(('dir1/eggs.c', None, 'var1'), 'variable', False), +# s_info.Symbol(('dir1/eggs.c', None, 'xyz'), 'other', False), +# s_info.Symbol(('dir1/eggs.c', '???', 'var2'), 'variable', False), +# s_info.Symbol(('???', None, 'var_x'), 'variable', False), +# s_info.Symbol(('???', '???', 'var_y'), 'variable', False), +# s_info.Symbol((None, None, '???'), 'other', False), +# ] +# known = object() +# +# vars_from_binary('python', knownvars=known, **this.kwargs) +# found = list(globals_from_symbols(['dir1'], self.iter_symbols)) +# +# self.assertEqual(found, [ +# info.Variable.from_parts('dir1/spam.c', None, 'var1', '???'), +# info.Variable.from_parts('dir1/spam.c', None, 'var2', '???'), +# info.Variable.from_parts('dir1/spam.c', None, 'var3', '???'), +# info.Variable.from_parts('dir1/spam.c', 'func2', 'var4', '???'), +# info.Variable.from_parts('dir1/eggs.c', None, 'var1', '???'), +# ]) +# self.assertEqual(self.calls, [ +# ('iter_symbols', (['dir1'],)), +# ]) +# +# def test_no_symbols(self): +# self._return_iter_symbols = [] +# +# found = list(globals_from_symbols(['dir1'], self.iter_symbols)) +# +# self.assertEqual(found, []) +# self.assertEqual(self.calls, [ +# ('iter_symbols', (['dir1'],)), +# ]) + + # XXX need functional test diff --git a/Lib/test/test_tools/test_c_analyzer/test_variables/test_info.py b/Lib/test/test_tools/test_c_analyzer/test_variables/test_info.py new file mode 100644 index 0000000000000000000000000000000000000000..d424d8eebb811149354a464bc4e09afbb54b48f4 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_variables/test_info.py @@ -0,0 +1,244 @@ +import string +import unittest + +from ..util import PseudoStr, StrProxy, Object +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.common.info import UNKNOWN, ID + from c_analyzer.variables.info import ( + normalize_vartype, Variable + ) + + +class NormalizeVartypeTests(unittest.TestCase): + + def test_basic(self): + tests = [ + (None, None), + ('', ''), + ('int', 'int'), + (PseudoStr('int'), 'int'), + (StrProxy('int'), 'int'), + ] + for vartype, expected in tests: + with self.subTest(vartype): + normalized = normalize_vartype(vartype) + + self.assertEqual(normalized, expected) + + +class VariableTests(unittest.TestCase): + + VALID_ARGS = ( + ('x/y/z/spam.c', 'func', 'eggs'), + 'static', + 'int', + ) + VALID_KWARGS = dict(zip(Variable._fields, VALID_ARGS)) + VALID_EXPECTED = VALID_ARGS + + def test_init_typical_global(self): + for storage in ('static', 'extern', 'implicit'): + with self.subTest(storage): + static = Variable( + id=ID( + filename='x/y/z/spam.c', + funcname=None, + name='eggs', + ), + storage=storage, + vartype='int', + ) + + self.assertEqual(static, ( + ('x/y/z/spam.c', None, 'eggs'), + storage, + 'int', + )) + + def test_init_typical_local(self): + for storage in ('static', 'local'): + with self.subTest(storage): + static = Variable( + id=ID( + filename='x/y/z/spam.c', + funcname='func', + name='eggs', + ), + storage=storage, + vartype='int', + ) + + self.assertEqual(static, ( + ('x/y/z/spam.c', 'func', 'eggs'), + storage, + 'int', + )) + + def test_init_all_missing(self): + for value in ('', None): + with self.subTest(repr(value)): + static = Variable( + id=value, + storage=value, + vartype=value, + ) + + self.assertEqual(static, ( + None, + None, + None, + )) + + def test_init_all_coerced(self): + id = ID('x/y/z/spam.c', 'func', 'spam') + tests = [ + ('str subclass', + dict( + id=( + PseudoStr('x/y/z/spam.c'), + PseudoStr('func'), + PseudoStr('spam'), + ), + storage=PseudoStr('static'), + vartype=PseudoStr('int'), + ), + (id, + 'static', + 'int', + )), + ('non-str 1', + dict( + id=id, + storage=Object(), + vartype=Object(), + ), + (id, + '', + '', + )), + ('non-str 2', + dict( + id=id, + storage=StrProxy('static'), + vartype=StrProxy('variable'), + ), + (id, + 'static', + 'variable', + )), + ('non-str', + dict( + id=id, + storage=('a', 'b', 'c'), + vartype=('x', 'y', 'z'), + ), + (id, + "('a', 'b', 'c')", + "('x', 'y', 'z')", + )), + ] + for summary, kwargs, expected in tests: + with self.subTest(summary): + static = Variable(**kwargs) + + for field in Variable._fields: + value = getattr(static, field) + if field == 'id': + self.assertIs(type(value), ID) + else: + self.assertIs(type(value), str) + self.assertEqual(tuple(static), expected) + + def test_iterable(self): + static = Variable(**self.VALID_KWARGS) + + id, storage, vartype = static + + values = (id, storage, vartype) + for value, expected in zip(values, self.VALID_EXPECTED): + self.assertEqual(value, expected) + + def test_fields(self): + static = Variable(('a', 'b', 'z'), 'x', 'y') + + self.assertEqual(static.id, ('a', 'b', 'z')) + self.assertEqual(static.storage, 'x') + self.assertEqual(static.vartype, 'y') + + def test___getattr__(self): + static = Variable(('a', 'b', 'z'), 'x', 'y') + + self.assertEqual(static.filename, 'a') + self.assertEqual(static.funcname, 'b') + self.assertEqual(static.name, 'z') + + def test_validate_typical(self): + validstorage = ('static', 'extern', 'implicit', 'local') + self.assertEqual(set(validstorage), set(Variable.STORAGE)) + + for storage in validstorage: + with self.subTest(storage): + static = Variable( + id=ID( + filename='x/y/z/spam.c', + funcname='func', + name='eggs', + ), + storage=storage, + vartype='int', + ) + + static.validate() # This does not fail. + + def test_validate_missing_field(self): + for field in Variable._fields: + with self.subTest(field): + static = Variable(**self.VALID_KWARGS) + static = static._replace(**{field: None}) + + with self.assertRaises(TypeError): + static.validate() + for field in ('storage', 'vartype'): + with self.subTest(field): + static = Variable(**self.VALID_KWARGS) + static = static._replace(**{field: UNKNOWN}) + + with self.assertRaises(TypeError): + static.validate() + + def test_validate_bad_field(self): + badch = tuple(c for c in string.punctuation + string.digits) + notnames = ( + '1a', + 'a.b', + 'a-b', + '&a', + 'a++', + ) + badch + tests = [ + ('id', ()), # Any non-empty str is okay. + ('storage', ('external', 'global') + notnames), + ('vartype', ()), # Any non-empty str is okay. + ] + seen = set() + for field, invalid in tests: + for value in invalid: + seen.add(value) + with self.subTest(f'{field}={value!r}'): + static = Variable(**self.VALID_KWARGS) + static = static._replace(**{field: value}) + + with self.assertRaises(ValueError): + static.validate() + + for field, invalid in tests: + if field == 'id': + continue + valid = seen - set(invalid) + for value in valid: + with self.subTest(f'{field}={value!r}'): + static = Variable(**self.VALID_KWARGS) + static = static._replace(**{field: value}) + + static.validate() # This does not fail. diff --git a/Lib/test/test_tools/test_c_analyzer/test_variables/test_known.py b/Lib/test/test_tools/test_c_analyzer/test_variables/test_known.py new file mode 100644 index 0000000000000000000000000000000000000000..49ff45c6d1b2cf0e77c637380daed6e8b627c8c3 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/test_variables/test_known.py @@ -0,0 +1,139 @@ +import re +import textwrap +import unittest + +from .. import tool_imports_for_tests +with tool_imports_for_tests(): + from c_analyzer.common.info import ID + from c_analyzer.variables.info import Variable + from c_analyzer.variables.known import ( + read_file, + from_file, + ) + +class _BaseTests(unittest.TestCase): + + maxDiff = None + + @property + def calls(self): + try: + return self._calls + except AttributeError: + self._calls = [] + return self._calls + + +class ReadFileTests(_BaseTests): + + _return_read_tsv = () + + def _read_tsv(self, *args): + self.calls.append(('_read_tsv', args)) + return self._return_read_tsv + + def test_typical(self): + lines = textwrap.dedent(''' + filename funcname name kind declaration + file1.c - var1 variable static int + file1.c func1 local1 variable static int + file1.c - var2 variable int + file1.c func2 local2 variable char * + file2.c - var1 variable char * + ''').strip().splitlines() + lines = [re.sub(r'\s+', '\t', line, 4) for line in lines] + self._return_read_tsv = [tuple(v.strip() for v in line.split('\t')) + for line in lines[1:]] + + known = list(read_file('known.tsv', _read_tsv=self._read_tsv)) + + self.assertEqual(known, [ + ('variable', ID('file1.c', '', 'var1'), 'static int'), + ('variable', ID('file1.c', 'func1', 'local1'), 'static int'), + ('variable', ID('file1.c', '', 'var2'), 'int'), + ('variable', ID('file1.c', 'func2', 'local2'), 'char *'), + ('variable', ID('file2.c', '', 'var1'), 'char *'), + ]) + self.assertEqual(self.calls, [ + ('_read_tsv', + ('known.tsv', 'filename\tfuncname\tname\tkind\tdeclaration')), + ]) + + def test_empty(self): + self._return_read_tsv = [] + + known = list(read_file('known.tsv', _read_tsv=self._read_tsv)) + + self.assertEqual(known, []) + self.assertEqual(self.calls, [ + ('_read_tsv', ('known.tsv', 'filename\tfuncname\tname\tkind\tdeclaration')), + ]) + + +class FromFileTests(_BaseTests): + + _return_read_file = () + _return_handle_var = () + + def _read_file(self, infile): + self.calls.append(('_read_file', (infile,))) + return iter(self._return_read_file) + + def _handle_var(self, varid, decl): + self.calls.append(('_handle_var', (varid, decl))) + var = self._return_handle_var.pop(0) + return var + + def test_typical(self): + expected = [ + Variable.from_parts('file1.c', '', 'var1', 'static int'), + Variable.from_parts('file1.c', 'func1', 'local1', 'static int'), + Variable.from_parts('file1.c', '', 'var2', 'int'), + Variable.from_parts('file1.c', 'func2', 'local2', 'char *'), + Variable.from_parts('file2.c', '', 'var1', 'char *'), + ] + self._return_read_file = [('variable', v.id, v.vartype) + for v in expected] +# ('variable', ID('file1.c', '', 'var1'), 'static int'), +# ('variable', ID('file1.c', 'func1', 'local1'), 'static int'), +# ('variable', ID('file1.c', '', 'var2'), 'int'), +# ('variable', ID('file1.c', 'func2', 'local2'), 'char *'), +# ('variable', ID('file2.c', '', 'var1'), 'char *'), +# ] + self._return_handle_var = list(expected) # a copy + + known = from_file('known.tsv', + handle_var=self._handle_var, + _read_file=self._read_file, + ) + + self.assertEqual(known, { + 'variables': {v.id: v for v in expected}, + }) +# Variable.from_parts('file1.c', '', 'var1', 'static int'), +# Variable.from_parts('file1.c', 'func1', 'local1', 'static int'), +# Variable.from_parts('file1.c', '', 'var2', 'int'), +# Variable.from_parts('file1.c', 'func2', 'local2', 'char *'), +# Variable.from_parts('file2.c', '', 'var1', 'char *'), +# ]}, +# }) + self.assertEqual(self.calls, [ + ('_read_file', ('known.tsv',)), + *[('_handle_var', (v.id, v.vartype)) + for v in expected], + ]) + + def test_empty(self): + self._return_read_file = [] + + known = from_file('known.tsv', + handle_var=self._handle_var, + _read_file=self._read_file, + ) + + self.assertEqual(known, { + 'variables': {}, + }) + self.assertEqual(self.calls, [ + ('_read_file', ('known.tsv',)), + ]) diff --git a/Lib/test/test_tools/test_c_analyzer/util.py b/Lib/test/test_tools/test_c_analyzer/util.py new file mode 100644 index 0000000000000000000000000000000000000000..ba73b0a4b5fc6b1b13607e4f2f7bf52774ed4e05 --- /dev/null +++ b/Lib/test/test_tools/test_c_analyzer/util.py @@ -0,0 +1,60 @@ +import itertools + + +class PseudoStr(str): + pass + + +class StrProxy: + def __init__(self, value): + self.value = value + def __str__(self): + return self.value + def __bool__(self): + return bool(self.value) + + +class Object: + def __repr__(self): + return '' + + +def wrapped_arg_combos(*args, + wrappers=(PseudoStr, StrProxy), + skip=(lambda w, i, v: not isinstance(v, str)), + ): + """Yield every possible combination of wrapped items for the given args. + + Effectively, the wrappers are applied to the args according to the + powerset of the args indicies. So the result includes the args + completely unwrapped. + + If "skip" is supplied (default is to skip all non-str values) and + it returns True for a given arg index/value then that arg will + remain unwrapped, + + Only unique results are returned. If an arg was skipped for one + of the combinations then it could end up matching one of the other + combinations. In that case only one of them will be yielded. + """ + if not args: + return + indices = list(range(len(args))) + # The powerset (from recipe in the itertools docs). + combos = itertools.chain.from_iterable(itertools.combinations(indices, r) + for r in range(len(indices)+1)) + seen = set() + for combo in combos: + for wrap in wrappers: + indexes = [] + applied = list(args) + for i in combo: + arg = args[i] + if skip and skip(wrap, i, arg): + continue + indexes.append(i) + applied[i] = wrap(arg) + key = (wrap, tuple(indexes)) + if key not in seen: + yield tuple(applied) + seen.add(key) diff --git a/Lib/test/test_tools/test_lll.py b/Lib/test/test_tools/test_lll.py index b01e2188e1cf2021b27e7974075714acf6349314..568cbfb5e47460886ad1659574129a6c12555041 100644 --- a/Lib/test/test_tools/test_lll.py +++ b/Lib/test/test_tools/test_lll.py @@ -1,7 +1,6 @@ """Tests for the lll script in the Tools/script directory.""" import os -import sys import tempfile from test import support from test.test_tools import skip_if_missing, import_tool diff --git a/Lib/test/test_tools/test_md5sum.py b/Lib/test/test_tools/test_md5sum.py index fb565b73778f7485e9f33f807408c1a77439947b..321bc4bb3628261fe0474ae6d29d836b246cfcff 100644 --- a/Lib/test/test_tools/test_md5sum.py +++ b/Lib/test/test_tools/test_md5sum.py @@ -3,12 +3,14 @@ import os import unittest from test import support +from test.support import hashlib_helper from test.support.script_helper import assert_python_ok, assert_python_failure from test.test_tools import scriptsdir, skip_if_missing skip_if_missing() +@hashlib_helper.requires_hashdigest('md5') class MD5SumTests(unittest.TestCase): @classmethod def setUpClass(cls): diff --git a/Lib/test/test_tools/test_pathfix.py b/Lib/test/test_tools/test_pathfix.py index ec361178e6d81f485fa1764cf33d07d3014dd8a4..03ed29d3f974f23da3cdccfaa1835366de9ac005 100644 --- a/Lib/test/test_tools/test_pathfix.py +++ b/Lib/test/test_tools/test_pathfix.py @@ -3,7 +3,7 @@ import sys import unittest from test import support -from test.test_tools import import_tool, scriptsdir, skip_if_missing +from test.test_tools import scriptsdir, skip_if_missing # need Tools/script/ directory: skip if run on Python installed on the system @@ -30,16 +30,18 @@ def pathfix(self, shebang, pathfix_flags, exitcode=0, stdout='', stderr='', with open(filename, 'w', encoding='utf8') as f: f.write(f'{shebang}\n' + 'print("Hello world")\n') + encoding = sys.getfilesystemencoding() proc = subprocess.run( [sys.executable, self.script, *pathfix_flags, '-n', pathfix_arg], - capture_output=True, text=1) + env={**os.environ, 'PYTHONIOENCODING': encoding}, + capture_output=True) if stdout == '' and proc.returncode == 0: stdout = f'{filename}: updating\n' self.assertEqual(proc.returncode, exitcode, proc) - self.assertEqual(proc.stdout, stdout, proc) - self.assertEqual(proc.stderr, stderr, proc) + self.assertEqual(proc.stdout.decode(encoding), stdout.replace('\n', os.linesep), proc) + self.assertEqual(proc.stderr.decode(encoding), stderr.replace('\n', os.linesep), proc) with open(filename, 'r', encoding='utf8') as f: output = f.read() diff --git a/Lib/test/test_tools/test_sundry.py b/Lib/test/test_tools/test_sundry.py index f5fed01491e3f63e6af647ea6d2df683f41106e9..10eb6941b3be6f820c281225b3fed83d4f8b5a24 100644 --- a/Lib/test/test_tools/test_sundry.py +++ b/Lib/test/test_tools/test_sundry.py @@ -2,7 +2,7 @@ This file contains extremely basic regression tests for the scripts found in the Tools directory of a Python checkout or tarball which don't have separate -tests of their own, such as h2py.py. +tests of their own. """ import os diff --git a/Lib/test/test_tools/test_unparse.py b/Lib/test/test_tools/test_unparse.py deleted file mode 100644 index d89cb09776756bfa86c5a12498a9481bb02f6f7e..0000000000000000000000000000000000000000 --- a/Lib/test/test_tools/test_unparse.py +++ /dev/null @@ -1,332 +0,0 @@ -"""Tests for the unparse.py script in the Tools/parser directory.""" - -import unittest -import test.support -import io -import os -import random -import tokenize -import ast - -from test.test_tools import basepath, toolsdir, skip_if_missing - -skip_if_missing() - -parser_path = os.path.join(toolsdir, "parser") - -with test.support.DirsOnSysPath(parser_path): - import unparse - -def read_pyfile(filename): - """Read and return the contents of a Python source file (as a - string), taking into account the file encoding.""" - with open(filename, "rb") as pyfile: - encoding = tokenize.detect_encoding(pyfile.readline)[0] - with open(filename, "r", encoding=encoding) as pyfile: - source = pyfile.read() - return source - -for_else = """\ -def f(): - for x in range(10): - break - else: - y = 2 - z = 3 -""" - -while_else = """\ -def g(): - while True: - break - else: - y = 2 - z = 3 -""" - -relative_import = """\ -from . import fred -from .. import barney -from .australia import shrimp as prawns -""" - -nonlocal_ex = """\ -def f(): - x = 1 - def g(): - nonlocal x - x = 2 - y = 7 - def h(): - nonlocal x, y -""" - -# also acts as test for 'except ... as ...' -raise_from = """\ -try: - 1 / 0 -except ZeroDivisionError as e: - raise ArithmeticError from e -""" - -class_decorator = """\ -@f1(arg) -@f2 -class Foo: pass -""" - -elif1 = """\ -if cond1: - suite1 -elif cond2: - suite2 -else: - suite3 -""" - -elif2 = """\ -if cond1: - suite1 -elif cond2: - suite2 -""" - -try_except_finally = """\ -try: - suite1 -except ex1: - suite2 -except ex2: - suite3 -else: - suite4 -finally: - suite5 -""" - -with_simple = """\ -with f(): - suite1 -""" - -with_as = """\ -with f() as x: - suite1 -""" - -with_two_items = """\ -with f() as x, g() as y: - suite1 -""" - -class ASTTestCase(unittest.TestCase): - def assertASTEqual(self, ast1, ast2): - self.assertEqual(ast.dump(ast1), ast.dump(ast2)) - - def check_roundtrip(self, code1, filename="internal"): - ast1 = compile(code1, filename, "exec", ast.PyCF_ONLY_AST) - unparse_buffer = io.StringIO() - unparse.Unparser(ast1, unparse_buffer) - code2 = unparse_buffer.getvalue() - ast2 = compile(code2, filename, "exec", ast.PyCF_ONLY_AST) - self.assertASTEqual(ast1, ast2) - -class UnparseTestCase(ASTTestCase): - # Tests for specific bugs found in earlier versions of unparse - - def test_fstrings(self): - # See issue 25180 - self.check_roundtrip(r"""f'{f"{0}"*3}'""") - self.check_roundtrip(r"""f'{f"{y}"*3}'""") - - def test_strings(self): - self.check_roundtrip("u'foo'") - self.check_roundtrip("r'foo'") - self.check_roundtrip("b'foo'") - - def test_del_statement(self): - self.check_roundtrip("del x, y, z") - - def test_shifts(self): - self.check_roundtrip("45 << 2") - self.check_roundtrip("13 >> 7") - - def test_for_else(self): - self.check_roundtrip(for_else) - - def test_while_else(self): - self.check_roundtrip(while_else) - - def test_unary_parens(self): - self.check_roundtrip("(-1)**7") - self.check_roundtrip("(-1.)**8") - self.check_roundtrip("(-1j)**6") - self.check_roundtrip("not True or False") - self.check_roundtrip("True or not False") - - def test_integer_parens(self): - self.check_roundtrip("3 .__abs__()") - - def test_huge_float(self): - self.check_roundtrip("1e1000") - self.check_roundtrip("-1e1000") - self.check_roundtrip("1e1000j") - self.check_roundtrip("-1e1000j") - - def test_min_int(self): - self.check_roundtrip(str(-2**31)) - self.check_roundtrip(str(-2**63)) - - def test_imaginary_literals(self): - self.check_roundtrip("7j") - self.check_roundtrip("-7j") - self.check_roundtrip("0j") - self.check_roundtrip("-0j") - - def test_lambda_parentheses(self): - self.check_roundtrip("(lambda: int)()") - - def test_chained_comparisons(self): - self.check_roundtrip("1 < 4 <= 5") - self.check_roundtrip("a is b is c is not d") - - def test_function_arguments(self): - self.check_roundtrip("def f(): pass") - self.check_roundtrip("def f(a): pass") - self.check_roundtrip("def f(b = 2): pass") - self.check_roundtrip("def f(a, b): pass") - self.check_roundtrip("def f(a, b = 2): pass") - self.check_roundtrip("def f(a = 5, b = 2): pass") - self.check_roundtrip("def f(*, a = 1, b = 2): pass") - self.check_roundtrip("def f(*, a = 1, b): pass") - self.check_roundtrip("def f(*, a, b = 2): pass") - self.check_roundtrip("def f(a, b = None, *, c, **kwds): pass") - self.check_roundtrip("def f(a=2, *args, c=5, d, **kwds): pass") - self.check_roundtrip("def f(*args, **kwargs): pass") - - def test_relative_import(self): - self.check_roundtrip(relative_import) - - def test_nonlocal(self): - self.check_roundtrip(nonlocal_ex) - - def test_raise_from(self): - self.check_roundtrip(raise_from) - - def test_bytes(self): - self.check_roundtrip("b'123'") - - def test_annotations(self): - self.check_roundtrip("def f(a : int): pass") - self.check_roundtrip("def f(a: int = 5): pass") - self.check_roundtrip("def f(*args: [int]): pass") - self.check_roundtrip("def f(**kwargs: dict): pass") - self.check_roundtrip("def f() -> None: pass") - - def test_set_literal(self): - self.check_roundtrip("{'a', 'b', 'c'}") - - def test_set_comprehension(self): - self.check_roundtrip("{x for x in range(5)}") - - def test_dict_comprehension(self): - self.check_roundtrip("{x: x*x for x in range(10)}") - - def test_class_decorators(self): - self.check_roundtrip(class_decorator) - - def test_class_definition(self): - self.check_roundtrip("class A(metaclass=type, *[], **{}): pass") - - def test_elifs(self): - self.check_roundtrip(elif1) - self.check_roundtrip(elif2) - - def test_try_except_finally(self): - self.check_roundtrip(try_except_finally) - - def test_starred_assignment(self): - self.check_roundtrip("a, *b, c = seq") - self.check_roundtrip("a, (*b, c) = seq") - self.check_roundtrip("a, *b[0], c = seq") - self.check_roundtrip("a, *(b, c) = seq") - - def test_with_simple(self): - self.check_roundtrip(with_simple) - - def test_with_as(self): - self.check_roundtrip(with_as) - - def test_with_two_items(self): - self.check_roundtrip(with_two_items) - - def test_dict_unpacking_in_dict(self): - # See issue 26489 - self.check_roundtrip(r"""{**{'y': 2}, 'x': 1}""") - self.check_roundtrip(r"""{**{'y': 2}, **{'x': 1}}""") - - def test_subscript(self): - self.check_roundtrip("a[i]") - self.check_roundtrip("a[i,]") - self.check_roundtrip("a[i, j]") - self.check_roundtrip("a[()]") - self.check_roundtrip("a[i:j]") - self.check_roundtrip("a[:j]") - self.check_roundtrip("a[i:]") - self.check_roundtrip("a[i:j:k]") - self.check_roundtrip("a[:j:k]") - self.check_roundtrip("a[i::k]") - self.check_roundtrip("a[i:j,]") - self.check_roundtrip("a[i:j, k]") - - -class DirectoryTestCase(ASTTestCase): - """Test roundtrip behaviour on all files in Lib and Lib/test.""" - NAMES = None - - # test directories, relative to the root of the distribution - test_directories = 'Lib', os.path.join('Lib', 'test') - - @classmethod - def get_names(cls): - if cls.NAMES is not None: - return cls.NAMES - - names = [] - for d in cls.test_directories: - test_dir = os.path.join(basepath, d) - for n in os.listdir(test_dir): - if n.endswith('.py') and not n.startswith('bad'): - names.append(os.path.join(test_dir, n)) - - # Test limited subset of files unless the 'cpu' resource is specified. - if not test.support.is_resource_enabled("cpu"): - names = random.sample(names, 10) - # bpo-31174: Store the names sample to always test the same files. - # It prevents false alarms when hunting reference leaks. - cls.NAMES = names - return names - - def test_files(self): - # get names of files to test - names = self.get_names() - - for filename in names: - if test.support.verbose: - print('Testing %s' % filename) - - # Some f-strings are not correctly round-tripped by - # Tools/parser/unparse.py. See issue 28002 for details. - # We need to skip files that contain such f-strings. - if os.path.basename(filename) in ('test_fstring.py', ): - if test.support.verbose: - print(f'Skipping {filename}: see issue 28002') - continue - - with self.subTest(filename=filename): - source = read_pyfile(filename) - self.check_roundtrip(source) - - -if __name__ == '__main__': - unittest.main() diff --git a/Lib/test/test_trace.py b/Lib/test/test_trace.py index 8eacf99cbf46a7f1c018765e63c4b29c61d792dd..c03982ba72b3f1f6cb022fd3d01c9819e60766c3 100644 --- a/Lib/test/test_trace.py +++ b/Lib/test/test_trace.py @@ -180,7 +180,7 @@ def test_trace_list_comprehension(self): firstlineno_called = get_firstlineno(traced_doubler) expected = { (self.my_py_filename, firstlineno_calling + 1): 1, - # List compehentions work differently in 3.x, so the count + # List comprehensions work differently in 3.x, so the count # below changed compared to 2.x. (self.my_py_filename, firstlineno_calling + 2): 12, (self.my_py_filename, firstlineno_calling + 3): 1, @@ -276,9 +276,8 @@ def test_simple_caller(self): def test_arg_errors(self): res = self.tracer.runfunc(traced_capturer, 1, 2, self=3, func=4) self.assertEqual(res, ((1, 2), {'self': 3, 'func': 4})) - with self.assertWarns(DeprecationWarning): - res = self.tracer.runfunc(func=traced_capturer, arg=1) - self.assertEqual(res, ((), {'arg': 1})) + with self.assertRaises(TypeError): + self.tracer.runfunc(func=traced_capturer, arg=1) with self.assertRaises(TypeError): self.tracer.runfunc() @@ -507,7 +506,8 @@ def test_sys_argv_list(self): fd.write("print(type(sys.argv))\n") status, direct_stdout, stderr = assert_python_ok(TESTFN) - status, trace_stdout, stderr = assert_python_ok('-m', 'trace', '-l', TESTFN) + status, trace_stdout, stderr = assert_python_ok('-m', 'trace', '-l', TESTFN, + PYTHONIOENCODING='utf-8') self.assertIn(direct_stdout.strip(), trace_stdout) def test_count_and_summary(self): @@ -527,7 +527,8 @@ def f(): for i in range(10): f() """)) - status, stdout, _ = assert_python_ok('-m', 'trace', '-cs', filename) + status, stdout, _ = assert_python_ok('-m', 'trace', '-cs', filename, + PYTHONIOENCODING='utf-8') stdout = stdout.decode() self.assertEqual(status, 0) self.assertIn('lines cov% module (path)', stdout) diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index 96d85e2cb8a1c3f286fc4532e50779aca21de21c..5bb3a58b2a103bec529c72440ed69de099ea3fa4 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -7,7 +7,7 @@ import unittest import re from test import support -from test.support import TESTFN, Error, captured_output, unlink, cpython_only +from test.support import TESTFN, Error, captured_output, unlink, cpython_only, ALWAYS_EQ from test.support.script_helper import assert_python_ok import textwrap @@ -58,13 +58,13 @@ def test_caret(self): SyntaxError) self.assertIn("^", err[2]) # third line has caret self.assertEqual(err[2].count('\n'), 1) # and no additional newline - self.assertEqual(err[1].find("+"), err[2].find("^")) # in the right place + self.assertEqual(err[1].find("+") + 1, err[2].find("^")) # in the right place err = self.get_exception_format(self.syntax_error_with_caret_non_ascii, SyntaxError) self.assertIn("^", err[2]) # third line has caret self.assertEqual(err[2].count('\n'), 1) # and no additional newline - self.assertEqual(err[1].find("+"), err[2].find("^")) # in the right place + self.assertEqual(err[1].find("+") + 1, err[2].find("^")) # in the right place def test_nocaret(self): exc = SyntaxError("error", ("x.py", 23, None, "bad syntax")) @@ -78,14 +78,13 @@ def test_bad_indentation(self): self.assertEqual(len(err), 4) self.assertEqual(err[1].strip(), "print(2)") self.assertIn("^", err[2]) - self.assertEqual(err[1].find(")"), err[2].find("^")) + self.assertEqual(err[1].find(")") + 1, err[2].find("^")) + # No caret for "unexpected indent" err = self.get_exception_format(self.syntax_error_bad_indentation2, IndentationError) - self.assertEqual(len(err), 4) + self.assertEqual(len(err), 3) self.assertEqual(err[1].strip(), "print(2)") - self.assertIn("^", err[2]) - self.assertEqual(err[1].find("p"), err[2].find("^")) def test_base_exception(self): # Test that exceptions derived from BaseException are formatted right @@ -174,7 +173,6 @@ def do_test(firstlines, message, charset, lineno): # Issue #18960: coding spec should have no effect do_test("x=0\n# coding: GBK\n", "h\xe9 ho", 'utf-8', 5) - @support.requires_type_collecting def test_print_traceback_at_exit(self): # Issue #22599: Ensure that it is possible to use the traceback module # to display an exception at Python exit @@ -313,7 +311,7 @@ def f(): with captured_output("stderr") as stderr_f: try: f() - except RecursionError as exc: + except RecursionError: render_exc() else: self.fail("no recursion occurred") @@ -360,7 +358,7 @@ def g(count=10): with captured_output("stderr") as stderr_g: try: g() - except ValueError as exc: + except ValueError: render_exc() else: self.fail("no value error was raised") @@ -396,7 +394,7 @@ def h(count=10): with captured_output("stderr") as stderr_h: try: h() - except ValueError as exc: + except ValueError: render_exc() else: self.fail("no value error was raised") @@ -424,7 +422,7 @@ def h(count=10): with captured_output("stderr") as stderr_g: try: g(traceback._RECURSIVE_CUTOFF) - except ValueError as exc: + except ValueError: render_exc() else: self.fail("no error raised") @@ -452,7 +450,7 @@ def h(count=10): with captured_output("stderr") as stderr_g: try: g(traceback._RECURSIVE_CUTOFF + 1) - except ValueError as exc: + except ValueError: render_exc() else: self.fail("no error raised") @@ -657,6 +655,7 @@ def outer_raise(): self.assertIn('inner_raise() # Marker', blocks[2]) self.check_zero_div(blocks[2]) + @unittest.skipIf(support.use_old_parser(), "Pegen is arguably better here, so no need to fix this") def test_syntax_error_offset_at_eol(self): # See #10186. def e(): @@ -666,7 +665,32 @@ def e(): def e(): exec("x = 5 | 4 |") msg = self.get_report(e).splitlines() - self.assertEqual(msg[-2], ' ^') + self.assertEqual(msg[-2], ' ^') + + def test_syntax_error_no_lineno(self): + # See #34463. + + # Without filename + e = SyntaxError('bad syntax') + msg = self.get_report(e).splitlines() + self.assertEqual(msg, + ['SyntaxError: bad syntax']) + e.lineno = 100 + msg = self.get_report(e).splitlines() + self.assertEqual(msg, + [' File "", line 100', 'SyntaxError: bad syntax']) + + # With filename + e = SyntaxError('bad syntax') + e.filename = 'myfile.py' + + msg = self.get_report(e).splitlines() + self.assertEqual(msg, + ['SyntaxError: bad syntax (myfile.py)']) + e.lineno = 100 + msg = self.get_report(e).splitlines() + self.assertEqual(msg, + [' File "myfile.py", line 100', 'SyntaxError: bad syntax']) def test_message_none(self): # A message that looks like "None" should not be treated specially @@ -679,6 +703,25 @@ def test_message_none(self): err = self.get_report(Exception('')) self.assertIn('Exception\n', err) + def test_syntax_error_various_offsets(self): + for offset in range(-5, 10): + for add in [0, 2]: + text = " "*add + "text%d" % offset + expected = [' File "file.py", line 1'] + if offset < 1: + expected.append(" %s" % text.lstrip()) + elif offset <= 6: + expected.append(" %s" % text.lstrip()) + expected.append(" %s^" % (" "*(offset-1))) + else: + expected.append(" %s" % text.lstrip()) + expected.append(" %s^" % (" "*5)) + expected.append("SyntaxError: msg") + expected.append("") + err = self.get_report(SyntaxError("msg", ("file.py", 1, offset+add, text))) + exp = "\n".join(expected) + self.assertEqual(exp, err) + class PyExcReportingTests(BaseExceptionReportingTests, unittest.TestCase): # @@ -887,6 +930,8 @@ def test_basics(self): # operator fallbacks to FrameSummary.__eq__. self.assertEqual(tuple(f), f) self.assertIsNone(f.locals) + self.assertNotEqual(f, object()) + self.assertEqual(f, ALWAYS_EQ) def test_lazy_lines(self): linecache.clearcache() @@ -1083,6 +1128,77 @@ def test_context(self): self.assertEqual(exc_info[0], exc.exc_type) self.assertEqual(str(exc_info[1]), str(exc)) + def test_no_refs_to_exception_and_traceback_objects(self): + try: + 1/0 + except Exception: + exc_info = sys.exc_info() + + refcnt1 = sys.getrefcount(exc_info[1]) + refcnt2 = sys.getrefcount(exc_info[2]) + exc = traceback.TracebackException(*exc_info) + self.assertEqual(sys.getrefcount(exc_info[1]), refcnt1) + self.assertEqual(sys.getrefcount(exc_info[2]), refcnt2) + + def test_comparison_basic(self): + try: + 1/0 + except Exception: + exc_info = sys.exc_info() + exc = traceback.TracebackException(*exc_info) + exc2 = traceback.TracebackException(*exc_info) + self.assertIsNot(exc, exc2) + self.assertEqual(exc, exc2) + self.assertNotEqual(exc, object()) + self.assertEqual(exc, ALWAYS_EQ) + + def test_comparison_params_variations(self): + def raise_exc(): + try: + raise ValueError('bad value') + except: + raise + + def raise_with_locals(): + x, y = 1, 2 + raise_exc() + + try: + raise_with_locals() + except Exception: + exc_info = sys.exc_info() + + exc = traceback.TracebackException(*exc_info) + exc1 = traceback.TracebackException(*exc_info, limit=10) + exc2 = traceback.TracebackException(*exc_info, limit=2) + + self.assertEqual(exc, exc1) # limit=10 gets all frames + self.assertNotEqual(exc, exc2) # limit=2 truncates the output + + # locals change the output + exc3 = traceback.TracebackException(*exc_info, capture_locals=True) + self.assertNotEqual(exc, exc3) + + # there are no locals in the innermost frame + exc4 = traceback.TracebackException(*exc_info, limit=-1) + exc5 = traceback.TracebackException(*exc_info, limit=-1, capture_locals=True) + self.assertEqual(exc4, exc5) + + # there are locals in the next-to-innermost frame + exc6 = traceback.TracebackException(*exc_info, limit=-2) + exc7 = traceback.TracebackException(*exc_info, limit=-2, capture_locals=True) + self.assertNotEqual(exc6, exc7) + + def test_comparison_equivalent_exceptions_are_equal(self): + excs = [] + for _ in range(2): + try: + 1/0 + except: + excs.append(traceback.TracebackException(*sys.exc_info())) + self.assertEqual(excs[0], excs[1]) + self.assertEqual(list(excs[0].format()), list(excs[1].format())) + def test_unhashable(self): class UnhashableException(Exception): def __eq__(self, other): @@ -1124,7 +1240,7 @@ def test_lookup_lines(self): f = test_frame(c, None, None) tb = test_tb(f, 6, None) exc = traceback.TracebackException(Exception, e, tb, lookup_lines=False) - self.assertEqual({}, linecache.cache) + self.assertEqual(linecache.cache, {}) linecache.updatecache('/foo.py', globals()) self.assertEqual(exc.stack[0].line, "import sys") diff --git a/Lib/test/test_tracemalloc.py b/Lib/test/test_tracemalloc.py index 4b9bf4ed5da1dc78edb7e5d32960f8748ab7c362..b10d1798c29777ce284c5bea44c7e637a7d8f4d2 100644 --- a/Lib/test/test_tracemalloc.py +++ b/Lib/test/test_tracemalloc.py @@ -36,7 +36,7 @@ def allocate_bytes(size): bytes_len = (size - EMPTY_STRING_SIZE) frames = get_frames(nframe, 1) data = b'x' * bytes_len - return data, tracemalloc.Traceback(frames) + return data, tracemalloc.Traceback(frames, min(len(frames), nframe)) def create_snapshots(): traceback_limit = 2 @@ -45,27 +45,27 @@ def create_snapshots(): # traceback_frames) tuples. traceback_frames is a tuple of (filename, # line_number) tuples. raw_traces = [ - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), - (1, 2, (('a.py', 5), ('b.py', 4))), + (1, 2, (('a.py', 5), ('b.py', 4)), 3), - (2, 66, (('b.py', 1),)), + (2, 66, (('b.py', 1),), 1), - (3, 7, (('', 0),)), + (3, 7, (('', 0),), 1), ] snapshot = tracemalloc.Snapshot(raw_traces, traceback_limit) raw_traces2 = [ - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), - (2, 2, (('a.py', 5), ('b.py', 4))), - (2, 5000, (('a.py', 5), ('b.py', 4))), + (2, 2, (('a.py', 5), ('b.py', 4)), 3), + (2, 5000, (('a.py', 5), ('b.py', 4)), 3), - (4, 400, (('c.py', 578),)), + (4, 400, (('c.py', 578),), 1), ] snapshot2 = tracemalloc.Snapshot(raw_traces2, traceback_limit) @@ -84,6 +84,25 @@ def traceback_filename(filename): return traceback_lineno(filename, 0) +class TestTraceback(unittest.TestCase): + def test_repr(self): + def get_repr(*args) -> str: + return repr(tracemalloc.Traceback(*args)) + + self.assertEqual(get_repr(()), "") + self.assertEqual(get_repr((), 0), "") + + frames = (("f1", 1), ("f2", 2)) + exp_repr_frames = ( + "(," + " )" + ) + self.assertEqual(get_repr(frames), + f"") + self.assertEqual(get_repr(frames, 2), + f"") + + class TestTracemallocEnabled(unittest.TestCase): def setUp(self): if tracemalloc.is_tracing(): @@ -125,7 +144,7 @@ def test_new_reference(self): nframe = tracemalloc.get_traceback_limit() frames = get_frames(nframe, -3) - obj_traceback = tracemalloc.Traceback(frames) + obj_traceback = tracemalloc.Traceback(frames, min(len(frames), nframe)) traceback = tracemalloc.get_object_traceback(obj) self.assertIsNotNone(traceback) @@ -167,7 +186,7 @@ def test_get_traces(self): trace = self.find_trace(traces, obj_traceback) self.assertIsInstance(trace, tuple) - domain, size, traceback = trace + domain, size, traceback, length = trace self.assertEqual(size, obj_size) self.assertEqual(traceback, obj_traceback._frames) @@ -197,8 +216,8 @@ def allocate_bytes4(size): trace1 = self.find_trace(traces, obj1_traceback) trace2 = self.find_trace(traces, obj2_traceback) - domain1, size1, traceback1 = trace1 - domain2, size2, traceback2 = trace2 + domain1, size1, traceback1, length1 = trace1 + domain2, size2, traceback2, length2 = trace2 self.assertIs(traceback2, traceback1) def test_get_traced_memory(self): @@ -246,6 +265,30 @@ def test_clear_traces(self): traceback2 = tracemalloc.get_object_traceback(obj) self.assertIsNone(traceback2) + def test_reset_peak(self): + # Python allocates some internals objects, so the test must tolerate + # a small difference between the expected size and the real usage + tracemalloc.clear_traces() + + # Example: allocate a large piece of memory, temporarily + large_sum = sum(list(range(100000))) + size1, peak1 = tracemalloc.get_traced_memory() + + # reset_peak() resets peak to traced memory: peak2 < peak1 + tracemalloc.reset_peak() + size2, peak2 = tracemalloc.get_traced_memory() + self.assertGreaterEqual(peak2, size2) + self.assertLess(peak2, peak1) + + # check that peak continue to be updated if new memory is allocated: + # peak3 > peak2 + obj_size = 1024 * 1024 + obj, obj_traceback = allocate_bytes(obj_size) + size3, peak3 = tracemalloc.get_traced_memory() + self.assertGreaterEqual(peak3, size3) + self.assertGreater(peak3, peak2) + self.assertGreaterEqual(peak3 - peak2, obj_size) + def test_is_tracing(self): tracemalloc.stop() self.assertFalse(tracemalloc.is_tracing()) @@ -259,6 +302,9 @@ def test_snapshot(self): # take a snapshot snapshot = tracemalloc.take_snapshot() + # This can vary + self.assertGreater(snapshot.traces[1].traceback.total_nframe, 10) + # write on disk snapshot.dump(support.TESTFN) self.addCleanup(support.unlink, support.TESTFN) @@ -311,17 +357,14 @@ def test_fork(self): finally: os._exit(exitcode) else: - pid2, status = os.waitpid(pid, 0) - self.assertTrue(os.WIFEXITED(status)) - exitcode = os.WEXITSTATUS(status) - self.assertEqual(exitcode, 0) + support.wait_process(pid, exitcode=0) class TestSnapshot(unittest.TestCase): maxDiff = 4000 def test_create_snapshot(self): - raw_traces = [(0, 5, (('a.py', 2),))] + raw_traces = [(0, 5, (('a.py', 2),), 10)] with contextlib.ExitStack() as stack: stack.enter_context(patch.object(tracemalloc, 'is_tracing', @@ -336,6 +379,7 @@ def test_create_snapshot(self): self.assertEqual(len(snapshot.traces), 1) trace = snapshot.traces[0] self.assertEqual(trace.size, 5) + self.assertEqual(trace.traceback.total_nframe, 10) self.assertEqual(len(trace.traceback), 1) self.assertEqual(trace.traceback[0].filename, 'a.py') self.assertEqual(trace.traceback[0].lineno, 2) @@ -351,11 +395,11 @@ def test_filter_traces(self): # exclude b.py snapshot3 = snapshot.filter_traces((filter1,)) self.assertEqual(snapshot3.traces._traces, [ - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (1, 2, (('a.py', 5), ('b.py', 4))), - (3, 7, (('', 0),)), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (1, 2, (('a.py', 5), ('b.py', 4)), 3), + (3, 7, (('', 0),), 1), ]) # filter_traces() must not touch the original snapshot @@ -364,10 +408,10 @@ def test_filter_traces(self): # only include two lines of a.py snapshot4 = snapshot3.filter_traces((filter2, filter3)) self.assertEqual(snapshot4.traces._traces, [ - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (1, 2, (('a.py', 5), ('b.py', 4))), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (1, 2, (('a.py', 5), ('b.py', 4)), 3), ]) # No filter: just duplicate the snapshot @@ -388,21 +432,21 @@ def test_filter_traces_domain(self): # exclude a.py of domain 1 snapshot3 = snapshot.filter_traces((filter1,)) self.assertEqual(snapshot3.traces._traces, [ - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (2, 66, (('b.py', 1),)), - (3, 7, (('', 0),)), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (2, 66, (('b.py', 1),), 1), + (3, 7, (('', 0),), 1), ]) # include domain 1 snapshot3 = snapshot.filter_traces((filter1,)) self.assertEqual(snapshot3.traces._traces, [ - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (2, 66, (('b.py', 1),)), - (3, 7, (('', 0),)), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (2, 66, (('b.py', 1),), 1), + (3, 7, (('', 0),), 1), ]) def test_filter_traces_domain_filter(self): @@ -413,17 +457,17 @@ def test_filter_traces_domain_filter(self): # exclude domain 2 snapshot3 = snapshot.filter_traces((filter1,)) self.assertEqual(snapshot3.traces._traces, [ - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (0, 10, (('a.py', 2), ('b.py', 4))), - (1, 2, (('a.py', 5), ('b.py', 4))), - (2, 66, (('b.py', 1),)), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (0, 10, (('a.py', 2), ('b.py', 4)), 3), + (1, 2, (('a.py', 5), ('b.py', 4)), 3), + (2, 66, (('b.py', 1),), 1), ]) # include domain 2 snapshot3 = snapshot.filter_traces((filter2,)) self.assertEqual(snapshot3.traces._traces, [ - (3, 7, (('', 0),)), + (3, 7, (('', 0),), 1), ]) def test_snapshot_group_by_line(self): @@ -1039,6 +1083,7 @@ def test_stop_untrack(self): def test_main(): support.run_unittest( + TestTraceback, TestTracemallocEnabled, TestSnapshot, TestFilters, diff --git a/Lib/test/test_turtle.py b/Lib/test/test_turtle.py index 2fd10ccd505fe182c4a9293fdad54e73a691e904..5d5f0570aec3829a8dc7ed422b38b2247be6c311 100644 --- a/Lib/test/test_turtle.py +++ b/Lib/test/test_turtle.py @@ -85,7 +85,7 @@ def test_config_dict(self): self.assertEqual(parsed_cfg, expected) - def test_partial_config_dict_with_commments(self): + def test_partial_config_dict_with_comments(self): cfg_name = self.get_cfg_file(test_config_two) parsed_cfg = turtle.config_dict(cfg_name) @@ -127,6 +127,14 @@ def assertVectorsAlmostEqual(self, vec1, vec2): self.assertAlmostEqual( i, j, msg='values at index {} do not match'.format(idx)) +class Multiplier: + + def __mul__(self, other): + return f'M*{other}' + + def __rmul__(self, other): + return f'{other}*M' + class TestVec2D(VectorComparisonMixin, unittest.TestCase): @@ -208,9 +216,15 @@ def test_vector_multiply(self): self.assertAlmostEqual(answer, expected) vec = Vec2D(0.5, 3) - answer = vec * 10 expected = Vec2D(5, 30) - self.assertVectorsAlmostEqual(answer, expected) + self.assertVectorsAlmostEqual(vec * 10, expected) + self.assertVectorsAlmostEqual(10 * vec, expected) + self.assertVectorsAlmostEqual(vec * 10.0, expected) + self.assertVectorsAlmostEqual(10.0 * vec, expected) + + M = Multiplier() + self.assertEqual(vec * M, Vec2D(f"{vec[0]}*M", f"{vec[1]}*M")) + self.assertEqual(M * vec, f'M*{vec}') def test_vector_negative(self): vec = Vec2D(10, -10) diff --git a/Lib/test/test_type_comments.py b/Lib/test/test_type_comments.py index 43be54efdbd97404f6d6625b6f8a53869a15e298..71d1430dbc939dada0eeeaed9c5f8c46ab1bec84 100644 --- a/Lib/test/test_type_comments.py +++ b/Lib/test/test_type_comments.py @@ -1,6 +1,7 @@ import ast import sys import unittest +from test import support funcdef = """\ @@ -390,7 +391,7 @@ def parse_func_type_input(source): arg = tree.argtypes[0] self.assertEqual(arg.id, "int") self.assertEqual(tree.returns.value.id, "List") - self.assertEqual(tree.returns.slice.value.id, "str") + self.assertEqual(tree.returns.slice.id, "str") tree = parse_func_type_input("(int, *str, **Any) -> float") self.assertEqual(tree.argtypes[0].id, "int") @@ -398,6 +399,14 @@ def parse_func_type_input(source): self.assertEqual(tree.argtypes[2].id, "Any") self.assertEqual(tree.returns.id, "float") + tree = parse_func_type_input("(*int) -> None") + self.assertEqual(tree.argtypes[0].id, "int") + tree = parse_func_type_input("(**int) -> None") + self.assertEqual(tree.argtypes[0].id, "int") + tree = parse_func_type_input("(*int, **str) -> None") + self.assertEqual(tree.argtypes[0].id, "int") + self.assertEqual(tree.argtypes[1].id, "str") + with self.assertRaises(SyntaxError): tree = parse_func_type_input("(int, *str, *Any) -> float") diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index 56848c1bf87eb57fda71298cddb1f48862965052..49dc5bf40e3ed84d6ad35711c216f685aaa55b40 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -466,7 +466,7 @@ def test(f, format_spec, result): # No format code means use g, but must have a decimal # and a number after the decimal. This is tricky, because - # a totaly empty format specifier means something else. + # a totally empty format specifier means something else. # So, just use a sign flag test(1e200, '+g', '+1e+200') test(1e200, '+', '+1e+200') @@ -622,8 +622,13 @@ def test_methods(self): self.assertEqual(attrs, { '__contains__', '__getitem__', + '__class_getitem__', + '__ior__', '__iter__', '__len__', + '__or__', + '__reversed__', + '__ror__', 'copy', 'get', 'items', @@ -764,6 +769,14 @@ def test_iterators(self): self.assertEqual(set(view.values()), set(values)) self.assertEqual(set(view.items()), set(items)) + def test_reversed(self): + d = {'a': 1, 'b': 2, 'foo': 0, 'c': 3, 'd': 4} + mp = self.mappingproxy(d) + del d['foo'] + r = reversed(mp) + self.assertEqual(list(r), list('dcba')) + self.assertRaises(StopIteration, next, r) + def test_copy(self): original = {'key1': 27, 'key2': 51, 'key3': 93} view = self.mappingproxy(original) @@ -774,6 +787,22 @@ def test_copy(self): self.assertEqual(view['key1'], 70) self.assertEqual(copy['key1'], 27) + def test_union(self): + mapping = {'a': 0, 'b': 1, 'c': 2} + view = self.mappingproxy(mapping) + with self.assertRaises(TypeError): + view | [('r', 2), ('d', 2)] + with self.assertRaises(TypeError): + [('r', 2), ('d', 2)] | view + with self.assertRaises(TypeError): + view |= [('r', 2), ('d', 2)] + other = {'c': 3, 'p': 0} + self.assertDictEqual(view | other, {'a': 0, 'b': 1, 'c': 3, 'p': 0}) + self.assertDictEqual(other | view, {'c': 2, 'p': 0, 'a': 0, 'b': 1}) + self.assertEqual(view, {'a': 0, 'b': 1, 'c': 2}) + self.assertDictEqual(mapping, {'a': 0, 'b': 1, 'c': 2}) + self.assertDictEqual(other, {'c': 3, 'p': 0}) + class ClassCreationTests(unittest.TestCase): @@ -1233,8 +1262,8 @@ def test_repr(self): ns2._y = 5 name = "namespace" - self.assertEqual(repr(ns1), "{name}(w=3, x=1, y=2)".format(name=name)) - self.assertEqual(repr(ns2), "{name}(_y=5, x='spam')".format(name=name)) + self.assertEqual(repr(ns1), "{name}(x=1, y=2, w=3)".format(name=name)) + self.assertEqual(repr(ns2), "{name}(x='spam', _y=5)".format(name=name)) def test_equal(self): ns1 = types.SimpleNamespace(x=1) @@ -1283,7 +1312,7 @@ def test_recursive_repr(self): ns3.spam = ns2 name = "namespace" repr1 = "{name}(c='cookie', spam={name}(...))".format(name=name) - repr2 = "{name}(spam={name}(spam={name}(...), x=1))".format(name=name) + repr2 = "{name}(spam={name}(x=1, spam={name}(...)))".format(name=name) self.assertEqual(repr(ns1), repr1) self.assertEqual(repr(ns2), repr2) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 83bfef14dfb9663c9697ce96d55f1c95d5c884f3..4bdb2a0fad6c762199f43b2434338c216cd1dece 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -3,14 +3,14 @@ import pickle import re import sys -from unittest import TestCase, main, skipUnless, SkipTest, skip +from unittest import TestCase, main, skipUnless, skip from copy import copy, deepcopy from typing import Any, NoReturn from typing import TypeVar, AnyStr from typing import T, KT, VT # Not in __all__. from typing import Union, Optional, Literal -from typing import Tuple, List, MutableMapping +from typing import Tuple, List, Dict, MutableMapping from typing import Callable from typing import Generic, ClassVar, Final, final, Protocol from typing import cast, runtime_checkable @@ -22,6 +22,7 @@ from typing import NamedTuple, TypedDict from typing import IO, TextIO, BinaryIO from typing import Pattern, Match +from typing import Annotated, ForwardRef import abc import typing import weakref @@ -299,6 +300,8 @@ def test_repr(self): self.assertEqual(repr(u), repr(int)) u = Union[List[int], int] self.assertEqual(repr(u), 'typing.Union[typing.List[int], int]') + u = Union[list[int], dict[str, float]] + self.assertEqual(repr(u), 'typing.Union[list[int], dict[str, float]]') def test_cannot_subclass(self): with self.assertRaises(TypeError): @@ -367,10 +370,8 @@ def test_union_str_pattern(self): def test_etree(self): # See https://github.com/python/typing/issues/229 # (Only relevant for Python 2.) - try: - from xml.etree.cElementTree import Element - except ImportError: - raise SkipTest("cElementTree not found") + from xml.etree.ElementTree import Element + Union[Element, str] # Shouldn't crash def Elem(*args): @@ -412,6 +413,7 @@ def test_repr(self): self.assertEqual(repr(Tuple[()]), 'typing.Tuple[()]') self.assertEqual(repr(Tuple[int, float]), 'typing.Tuple[int, float]') self.assertEqual(repr(Tuple[int, ...]), 'typing.Tuple[int, ...]') + self.assertEqual(repr(Tuple[list[int]]), 'typing.Tuple[list[int]]') def test_errors(self): with self.assertRaises(TypeError): @@ -448,14 +450,6 @@ def test_cannot_instantiate(self): type(c)() def test_callable_wrong_forms(self): - with self.assertRaises(TypeError): - Callable[[...], int] - with self.assertRaises(TypeError): - Callable[(), int] - with self.assertRaises(TypeError): - Callable[[()], int] - with self.assertRaises(TypeError): - Callable[[int, 1], 2] with self.assertRaises(TypeError): Callable[int] @@ -484,6 +478,8 @@ def test_repr(self): self.assertEqual(repr(ct2), 'typing.Callable[[str, float], int]') ctv = Callable[..., str] self.assertEqual(repr(ctv), 'typing.Callable[..., str]') + ct3 = Callable[[str, float], list[int]] + self.assertEqual(repr(ct3), 'typing.Callable[[str, float], list[int]]') def test_callable_with_ellipsis(self): @@ -528,6 +524,7 @@ def test_repr(self): self.assertEqual(repr(Literal[int]), "typing.Literal[int]") self.assertEqual(repr(Literal), "typing.Literal") self.assertEqual(repr(Literal[None]), "typing.Literal[None]") + self.assertEqual(repr(Literal[1, 2, 3, 3]), "typing.Literal[1, 2, 3]") def test_cannot_init(self): with self.assertRaises(TypeError): @@ -559,6 +556,35 @@ def test_no_multiple_subscripts(self): with self.assertRaises(TypeError): Literal[1][1] + def test_equal(self): + self.assertNotEqual(Literal[0], Literal[False]) + self.assertNotEqual(Literal[True], Literal[1]) + self.assertNotEqual(Literal[1], Literal[2]) + self.assertNotEqual(Literal[1, True], Literal[1]) + self.assertEqual(Literal[1], Literal[1]) + self.assertEqual(Literal[1, 2], Literal[2, 1]) + self.assertEqual(Literal[1, 2, 3], Literal[1, 2, 3, 3]) + + def test_hash(self): + self.assertEqual(hash(Literal[1]), hash(Literal[1])) + self.assertEqual(hash(Literal[1, 2]), hash(Literal[2, 1])) + self.assertEqual(hash(Literal[1, 2, 3]), hash(Literal[1, 2, 3, 3])) + + def test_args(self): + self.assertEqual(Literal[1, 2, 3].__args__, (1, 2, 3)) + self.assertEqual(Literal[1, 2, 3, 3].__args__, (1, 2, 3)) + self.assertEqual(Literal[1, Literal[2], Literal[3, 4]].__args__, (1, 2, 3, 4)) + # Mutable arguments will not be deduplicated + self.assertEqual(Literal[[], []].__args__, ([], [])) + + def test_flatten(self): + l1 = Literal[Literal[1], Literal[2], Literal[3]] + l2 = Literal[Literal[1, 2], 3] + l3 = Literal[Literal[1, 2, 3]] + for l in l1, l2, l3: + self.assertEqual(l, Literal[1, 2, 3]) + self.assertEqual(l.__args__, (1, 2, 3)) + XK = TypeVar('XK', str, bytes) XV = TypeVar('XV') @@ -1418,8 +1444,6 @@ def test_basics(self): def test_generic_errors(self): T = TypeVar('T') S = TypeVar('S') - with self.assertRaises(TypeError): - Generic[T]() with self.assertRaises(TypeError): Generic[T][T] with self.assertRaises(TypeError): @@ -1751,17 +1775,23 @@ def test_extended_generic_rules_repr(self): self.assertEqual(repr(Union[Tuple, Tuple[int]]).replace('typing.', ''), 'Union[Tuple, Tuple[int]]') self.assertEqual(repr(Callable[..., Optional[T]][int]).replace('typing.', ''), - 'Callable[..., Union[int, NoneType]]') + 'Callable[..., Optional[int]]') self.assertEqual(repr(Callable[[], List[T]][int]).replace('typing.', ''), 'Callable[[], List[int]]') def test_generic_forward_ref(self): def foobar(x: List[List['CC']]): ... + def foobar2(x: list[list[ForwardRef('CC')]]): ... class CC: ... self.assertEqual( get_type_hints(foobar, globals(), locals()), {'x': List[List[CC]]} ) + self.assertEqual( + get_type_hints(foobar2, globals(), locals()), + {'x': list[list[CC]]} + ) + T = TypeVar('T') AT = Tuple[T, ...] def barfoo(x: AT): ... @@ -1783,10 +1813,11 @@ def __call__(self): self.assertEqual(T1[int, T].__origin__, T1) self.assertEqual(T2.__parameters__, (T,)) - with self.assertRaises(TypeError): - T1[int] - with self.assertRaises(TypeError): - T2[int, str] + # These don't work because of tuple.__class_item__ + ## with self.assertRaises(TypeError): + ## T1[int] + ## with self.assertRaises(TypeError): + ## T2[int, str] self.assertEqual(repr(C1[int]).split('.')[-1], 'C1[int]') self.assertEqual(C2.__parameters__, ()) @@ -1825,22 +1856,22 @@ def test_type_erasure_special(self): self.clear_caches() class MyTup(Tuple[T, T]): ... self.assertIs(MyTup[int]().__class__, MyTup) - self.assertIs(MyTup[int]().__orig_class__, MyTup[int]) + self.assertEqual(MyTup[int]().__orig_class__, MyTup[int]) class MyCall(Callable[..., T]): def __call__(self): return None self.assertIs(MyCall[T]().__class__, MyCall) - self.assertIs(MyCall[T]().__orig_class__, MyCall[T]) + self.assertEqual(MyCall[T]().__orig_class__, MyCall[T]) class MyDict(typing.Dict[T, T]): ... self.assertIs(MyDict[int]().__class__, MyDict) - self.assertIs(MyDict[int]().__orig_class__, MyDict[int]) + self.assertEqual(MyDict[int]().__orig_class__, MyDict[int]) class MyDef(typing.DefaultDict[str, T]): ... self.assertIs(MyDef[int]().__class__, MyDef) - self.assertIs(MyDef[int]().__orig_class__, MyDef[int]) + self.assertEqual(MyDef[int]().__orig_class__, MyDef[int]) # ChainMap was added in 3.3 if sys.version_info >= (3, 3): class MyChain(typing.ChainMap[str, T]): ... self.assertIs(MyChain[int]().__class__, MyChain) - self.assertIs(MyChain[int]().__orig_class__, MyChain[int]) + self.assertEqual(MyChain[int]().__orig_class__, MyChain[int]) def test_all_repr_eq_any(self): objs = (getattr(typing, el) for el in typing.__all__) @@ -2269,6 +2300,8 @@ def test_repr(self): self.assertEqual(repr(cv), 'typing.Final[int]') cv = Final[Employee] self.assertEqual(repr(cv), 'typing.Final[%s.Employee]' % __name__) + cv = Final[tuple[int]] + self.assertEqual(repr(cv), 'typing.Final[tuple[int]]') def test_cannot_subclass(self): with self.assertRaises(TypeError): @@ -2446,6 +2479,18 @@ def foo(a: Tuple['T']): self.assertEqual(get_type_hints(foo, globals(), locals()), {'a': Tuple[T]}) + def foo(a: tuple[ForwardRef('T')]): + pass + + self.assertEqual(get_type_hints(foo, globals(), locals()), + {'a': tuple[T]}) + + def test_double_forward(self): + def foo(a: 'List[\'int\']'): + pass + self.assertEqual(get_type_hints(foo, globals(), locals()), + {'a': List[int]}) + def test_forward_recursion_actually(self): def namespace1(): a = typing.ForwardRef('A') @@ -2898,6 +2943,86 @@ def test_get_type_hints_wrapped_decoratored_func(self): self.assertEqual(gth(ForRefExample.func), expects) self.assertEqual(gth(ForRefExample.nested), expects) + def test_get_type_hints_annotated(self): + def foobar(x: List['X']): ... + X = Annotated[int, (1, 10)] + self.assertEqual( + get_type_hints(foobar, globals(), locals()), + {'x': List[int]} + ) + self.assertEqual( + get_type_hints(foobar, globals(), locals(), include_extras=True), + {'x': List[Annotated[int, (1, 10)]]} + ) + + def foobar(x: list[ForwardRef('X')]): ... + X = Annotated[int, (1, 10)] + self.assertEqual( + get_type_hints(foobar, globals(), locals()), + {'x': list[int]} + ) + self.assertEqual( + get_type_hints(foobar, globals(), locals(), include_extras=True), + {'x': list[Annotated[int, (1, 10)]]} + ) + + BA = Tuple[Annotated[T, (1, 0)], ...] + def barfoo(x: BA): ... + self.assertEqual(get_type_hints(barfoo, globals(), locals())['x'], Tuple[T, ...]) + self.assertIs( + get_type_hints(barfoo, globals(), locals(), include_extras=True)['x'], + BA + ) + + BA = tuple[Annotated[T, (1, 0)], ...] + def barfoo(x: BA): ... + self.assertEqual(get_type_hints(barfoo, globals(), locals())['x'], tuple[T, ...]) + self.assertIs( + get_type_hints(barfoo, globals(), locals(), include_extras=True)['x'], + BA + ) + + def barfoo2(x: typing.Callable[..., Annotated[List[T], "const"]], + y: typing.Union[int, Annotated[T, "mutable"]]): ... + self.assertEqual( + get_type_hints(barfoo2, globals(), locals()), + {'x': typing.Callable[..., List[T]], 'y': typing.Union[int, T]} + ) + + BA2 = typing.Callable[..., List[T]] + def barfoo3(x: BA2): ... + self.assertIs( + get_type_hints(barfoo3, globals(), locals(), include_extras=True)["x"], + BA2 + ) + + def test_get_type_hints_annotated_refs(self): + + Const = Annotated[T, "Const"] + + class MySet(Generic[T]): + + def __ior__(self, other: "Const[MySet[T]]") -> "MySet[T]": + ... + + def __iand__(self, other: Const["MySet[T]"]) -> "MySet[T]": + ... + + self.assertEqual( + get_type_hints(MySet.__iand__, globals(), locals()), + {'other': MySet[T], 'return': MySet[T]} + ) + + self.assertEqual( + get_type_hints(MySet.__iand__, globals(), locals(), include_extras=True), + {'other': Const[MySet[T]], 'return': MySet[T]} + ) + + self.assertEqual( + get_type_hints(MySet.__ior__, globals(), locals()), + {'other': MySet[T], 'return': MySet[T]} + ) + class GetUtilitiesTestCase(TestCase): def test_get_origin(self): @@ -2913,9 +3038,12 @@ class C(Generic[T]): pass self.assertIs(get_origin(Generic), Generic) self.assertIs(get_origin(Generic[T]), Generic) self.assertIs(get_origin(List[Tuple[T, T]][int]), list) + self.assertIs(get_origin(Annotated[T, 'thing']), Annotated) self.assertIs(get_origin(List), list) self.assertIs(get_origin(Tuple), tuple) self.assertIs(get_origin(Callable), collections.abc.Callable) + self.assertIs(get_origin(list[int]), list) + self.assertIs(get_origin(list), None) def test_get_args(self): T = TypeVar('T') @@ -2937,9 +3065,17 @@ class C(Generic[T]): pass (int, Callable[[Tuple[T, ...]], str])) self.assertEqual(get_args(Tuple[int, ...]), (int, ...)) self.assertEqual(get_args(Tuple[()]), ((),)) + self.assertEqual(get_args(Annotated[T, 'one', 2, ['three']]), (T, 'one', 2, ['three'])) self.assertEqual(get_args(List), ()) self.assertEqual(get_args(Tuple), ()) self.assertEqual(get_args(Callable), ()) + self.assertEqual(get_args(list[int]), (int,)) + self.assertEqual(get_args(list), ()) + self.assertEqual(get_args(collections.abc.Callable[[int], str]), ([int], str)) + self.assertEqual(get_args(collections.abc.Callable[..., str]), (..., str)) + self.assertEqual(get_args(collections.abc.Callable[[], str]), ([], str)) + self.assertEqual(get_args(collections.abc.Callable[[int], str]), + get_args(Callable[[int], str])) class CollectionsAbcTests(BaseTestCase): @@ -3075,6 +3211,17 @@ def test_frozenset(self): def test_dict(self): self.assertIsSubclass(dict, typing.Dict) + def test_dict_subscribe(self): + K = TypeVar('K') + V = TypeVar('V') + self.assertEqual(Dict[K, V][str, int], Dict[str, int]) + self.assertEqual(Dict[K, int][str], Dict[str, int]) + self.assertEqual(Dict[str, V][int], Dict[str, int]) + self.assertEqual(Dict[K, List[V]][str, int], Dict[str, List[int]]) + self.assertEqual(Dict[K, List[int]][str], Dict[str, List[int]]) + self.assertEqual(Dict[K, list[V]][str, int], Dict[str, list[int]]) + self.assertEqual(Dict[K, list[int]][str], Dict[str, list[int]]) + def test_no_list_instantiation(self): with self.assertRaises(TypeError): typing.List() @@ -3516,7 +3663,6 @@ def test_basics(self): self.assertEqual(Emp._fields, ('name', 'id')) self.assertEqual(Emp.__annotations__, collections.OrderedDict([('name', str), ('id', int)])) - self.assertIs(Emp._field_types, Emp.__annotations__) def test_namedtuple_pyversion(self): if sys.version_info[:2] < (3, 6): @@ -3536,7 +3682,6 @@ def test_annotation_usage(self): self.assertEqual(CoolEmployee._fields, ('name', 'cool')) self.assertEqual(CoolEmployee.__annotations__, collections.OrderedDict(name=str, cool=int)) - self.assertIs(CoolEmployee._field_types, CoolEmployee.__annotations__) def test_annotation_usage_with_default(self): jelle = CoolEmployeeWithDefault('Jelle') @@ -3549,15 +3694,14 @@ def test_annotation_usage_with_default(self): self.assertEqual(CoolEmployeeWithDefault.__name__, 'CoolEmployeeWithDefault') self.assertEqual(CoolEmployeeWithDefault._fields, ('name', 'cool')) - self.assertEqual(CoolEmployeeWithDefault._field_types, dict(name=str, cool=int)) + self.assertEqual(CoolEmployeeWithDefault.__annotations__, + dict(name=str, cool=int)) self.assertEqual(CoolEmployeeWithDefault._field_defaults, dict(cool=0)) with self.assertRaises(TypeError): - exec(""" -class NonDefaultAfterDefault(NamedTuple): - x: int = 3 - y: int -""") + class NonDefaultAfterDefault(NamedTuple): + x: int = 3 + y: int def test_annotation_usage_with_methods(self): self.assertEqual(XMeth(1).double(), 2) @@ -3566,20 +3710,23 @@ def test_annotation_usage_with_methods(self): self.assertEqual(XRepr(1, 2) + XRepr(3), 0) with self.assertRaises(AttributeError): - exec(""" -class XMethBad(NamedTuple): - x: int - def _fields(self): - return 'no chance for this' -""") + class XMethBad(NamedTuple): + x: int + def _fields(self): + return 'no chance for this' with self.assertRaises(AttributeError): - exec(""" -class XMethBad2(NamedTuple): - x: int - def _source(self): - return 'no chance for this as well' -""") + class XMethBad2(NamedTuple): + x: int + def _source(self): + return 'no chance for this as well' + + def test_multiple_inheritance(self): + class A: + pass + with self.assertRaises(TypeError): + class X(NamedTuple, A): + x: int def test_namedtuple_keyword_usage(self): LocalEmployee = NamedTuple("LocalEmployee", name=str, age=int) @@ -3589,7 +3736,6 @@ def test_namedtuple_keyword_usage(self): self.assertEqual(LocalEmployee.__name__, 'LocalEmployee') self.assertEqual(LocalEmployee._fields, ('name', 'age')) self.assertEqual(LocalEmployee.__annotations__, dict(name=str, age=int)) - self.assertIs(LocalEmployee._field_types, LocalEmployee.__annotations__) with self.assertRaises(TypeError): NamedTuple('Name', [('x', int)], y=str) with self.assertRaises(TypeError): @@ -3614,16 +3760,10 @@ def test_namedtuple_errors(self): NamedTuple('Emp', [('name', str)], None) with self.assertRaises(ValueError): NamedTuple('Emp', [('_name', str)]) - - with self.assertWarns(DeprecationWarning): - Emp = NamedTuple(typename='Emp', name=str, id=int) - self.assertEqual(Emp.__name__, 'Emp') - self.assertEqual(Emp._fields, ('name', 'id')) - - with self.assertWarns(DeprecationWarning): - Emp = NamedTuple('Emp', fields=[('name', str), ('id', int)]) - self.assertEqual(Emp.__name__, 'Emp') - self.assertEqual(Emp._fields, ('name', 'id')) + with self.assertRaises(TypeError): + NamedTuple(typename='Emp', name=str, id=int) + with self.assertRaises(TypeError): + NamedTuple('Emp', fields=[('name', str), ('id', int)]) def test_copy_and_pickle(self): global Emp # pickle wants to reference the class by name @@ -3696,6 +3836,7 @@ def test_typeddict_create_errors(self): TypedDict() with self.assertRaises(TypeError): TypedDict('Emp', [('name', str)], None) + with self.assertRaises(TypeError): TypedDict(_typename='Emp', name=str, id=int) with self.assertRaises(TypeError): @@ -3755,10 +3896,53 @@ def test_total(self): self.assertEqual(D(), {}) self.assertEqual(D(x=1), {'x': 1}) self.assertEqual(D.__total__, False) + self.assertEqual(D.__required_keys__, frozenset()) + self.assertEqual(D.__optional_keys__, {'x'}) self.assertEqual(Options(), {}) self.assertEqual(Options(log_level=2), {'log_level': 2}) self.assertEqual(Options.__total__, False) + self.assertEqual(Options.__required_keys__, frozenset()) + self.assertEqual(Options.__optional_keys__, {'log_level', 'log_path'}) + + def test_optional_keys(self): + class Point2Dor3D(Point2D, total=False): + z: int + + assert Point2Dor3D.__required_keys__ == frozenset(['x', 'y']) + assert Point2Dor3D.__optional_keys__ == frozenset(['z']) + + def test_keys_inheritance(self): + class BaseAnimal(TypedDict): + name: str + + class Animal(BaseAnimal, total=False): + voice: str + tail: bool + + class Cat(Animal): + fur_color: str + + assert BaseAnimal.__required_keys__ == frozenset(['name']) + assert BaseAnimal.__optional_keys__ == frozenset([]) + assert BaseAnimal.__annotations__ == {'name': str} + + assert Animal.__required_keys__ == frozenset(['name']) + assert Animal.__optional_keys__ == frozenset(['tail', 'voice']) + assert Animal.__annotations__ == { + 'name': str, + 'tail': bool, + 'voice': str, + } + + assert Cat.__required_keys__ == frozenset(['name', 'fur_color']) + assert Cat.__optional_keys__ == frozenset(['tail', 'voice']) + assert Cat.__annotations__ == { + 'fur_color': str, + 'name': str, + 'tail': bool, + 'voice': str, + } class IOTests(BaseTestCase): @@ -3856,6 +4040,179 @@ class A(typing.Match): "type 're.Match' is not an acceptable base type") +class AnnotatedTests(BaseTestCase): + + def test_repr(self): + self.assertEqual( + repr(Annotated[int, 4, 5]), + "typing.Annotated[int, 4, 5]" + ) + self.assertEqual( + repr(Annotated[List[int], 4, 5]), + "typing.Annotated[typing.List[int], 4, 5]" + ) + + def test_flatten(self): + A = Annotated[Annotated[int, 4], 5] + self.assertEqual(A, Annotated[int, 4, 5]) + self.assertEqual(A.__metadata__, (4, 5)) + self.assertEqual(A.__origin__, int) + + def test_specialize(self): + L = Annotated[List[T], "my decoration"] + LI = Annotated[List[int], "my decoration"] + self.assertEqual(L[int], Annotated[List[int], "my decoration"]) + self.assertEqual(L[int].__metadata__, ("my decoration",)) + self.assertEqual(L[int].__origin__, List[int]) + with self.assertRaises(TypeError): + LI[int] + with self.assertRaises(TypeError): + L[int, float] + + def test_hash_eq(self): + self.assertEqual(len({Annotated[int, 4, 5], Annotated[int, 4, 5]}), 1) + self.assertNotEqual(Annotated[int, 4, 5], Annotated[int, 5, 4]) + self.assertNotEqual(Annotated[int, 4, 5], Annotated[str, 4, 5]) + self.assertNotEqual(Annotated[int, 4], Annotated[int, 4, 4]) + self.assertEqual( + {Annotated[int, 4, 5], Annotated[int, 4, 5], Annotated[T, 4, 5]}, + {Annotated[int, 4, 5], Annotated[T, 4, 5]} + ) + + def test_instantiate(self): + class C: + classvar = 4 + + def __init__(self, x): + self.x = x + + def __eq__(self, other): + if not isinstance(other, C): + return NotImplemented + return other.x == self.x + + A = Annotated[C, "a decoration"] + a = A(5) + c = C(5) + self.assertEqual(a, c) + self.assertEqual(a.x, c.x) + self.assertEqual(a.classvar, c.classvar) + + def test_instantiate_generic(self): + MyCount = Annotated[typing.Counter[T], "my decoration"] + self.assertEqual(MyCount([4, 4, 5]), {4: 2, 5: 1}) + self.assertEqual(MyCount[int]([4, 4, 5]), {4: 2, 5: 1}) + + def test_cannot_instantiate_forward(self): + A = Annotated["int", (5, 6)] + with self.assertRaises(TypeError): + A(5) + + def test_cannot_instantiate_type_var(self): + A = Annotated[T, (5, 6)] + with self.assertRaises(TypeError): + A(5) + + def test_cannot_getattr_typevar(self): + with self.assertRaises(AttributeError): + Annotated[T, (5, 7)].x + + def test_attr_passthrough(self): + class C: + classvar = 4 + + A = Annotated[C, "a decoration"] + self.assertEqual(A.classvar, 4) + A.x = 5 + self.assertEqual(C.x, 5) + + def test_hash_eq(self): + self.assertEqual(len({Annotated[int, 4, 5], Annotated[int, 4, 5]}), 1) + self.assertNotEqual(Annotated[int, 4, 5], Annotated[int, 5, 4]) + self.assertNotEqual(Annotated[int, 4, 5], Annotated[str, 4, 5]) + self.assertNotEqual(Annotated[int, 4], Annotated[int, 4, 4]) + self.assertEqual( + {Annotated[int, 4, 5], Annotated[int, 4, 5], Annotated[T, 4, 5]}, + {Annotated[int, 4, 5], Annotated[T, 4, 5]} + ) + + def test_cannot_subclass(self): + with self.assertRaisesRegex(TypeError, "Cannot subclass .*Annotated"): + class C(Annotated): + pass + + def test_cannot_check_instance(self): + with self.assertRaises(TypeError): + isinstance(5, Annotated[int, "positive"]) + + def test_cannot_check_subclass(self): + with self.assertRaises(TypeError): + issubclass(int, Annotated[int, "positive"]) + + def test_pickle(self): + samples = [typing.Any, typing.Union[int, str], + typing.Optional[str], Tuple[int, ...], + typing.Callable[[str], bytes]] + + for t in samples: + x = Annotated[t, "a"] + + for prot in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(protocol=prot, type=t): + pickled = pickle.dumps(x, prot) + restored = pickle.loads(pickled) + self.assertEqual(x, restored) + + global _Annotated_test_G + + class _Annotated_test_G(Generic[T]): + x = 1 + + G = Annotated[_Annotated_test_G[int], "A decoration"] + G.foo = 42 + G.bar = 'abc' + + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + z = pickle.dumps(G, proto) + x = pickle.loads(z) + self.assertEqual(x.foo, 42) + self.assertEqual(x.bar, 'abc') + self.assertEqual(x.x, 1) + + def test_subst(self): + dec = "a decoration" + dec2 = "another decoration" + + S = Annotated[T, dec2] + self.assertEqual(S[int], Annotated[int, dec2]) + + self.assertEqual(S[Annotated[int, dec]], Annotated[int, dec, dec2]) + L = Annotated[List[T], dec] + + self.assertEqual(L[int], Annotated[List[int], dec]) + with self.assertRaises(TypeError): + L[int, int] + + self.assertEqual(S[L[int]], Annotated[List[int], dec, dec2]) + + D = Annotated[typing.Dict[KT, VT], dec] + self.assertEqual(D[str, int], Annotated[typing.Dict[str, int], dec]) + with self.assertRaises(TypeError): + D[int] + + It = Annotated[int, dec] + with self.assertRaises(TypeError): + It[None] + + LI = L[int] + with self.assertRaises(TypeError): + LI[None] + + def test_annotated_in_other_types(self): + X = List[Annotated[T, 5]] + self.assertEqual(X[int], List[Annotated[int, 5]]) + + class AllTests(BaseTestCase): """Tests for __all__.""" diff --git a/Lib/test/test_ucn.py b/Lib/test/test_ucn.py index 8febf0af8627b41f6f752e4e791291da1f08d107..e95f911d8eedddd2d7be8bc5d7030375f1bf1f9e 100644 --- a/Lib/test/test_ucn.py +++ b/Lib/test/test_ucn.py @@ -12,7 +12,6 @@ from test import support from http.client import HTTPException -from test.test_normalization import check_version try: from _testcapi import INT_MAX, PY_SSIZE_T_MAX, UINT_MAX @@ -100,6 +99,7 @@ def test_cjk_unified_ideographs(self): self.checkletter("CJK UNIFIED IDEOGRAPH-2B734", "\U0002B734") self.checkletter("CJK UNIFIED IDEOGRAPH-2B740", "\U0002B740") self.checkletter("CJK UNIFIED IDEOGRAPH-2B81D", "\U0002B81D") + self.checkletter("CJK UNIFIED IDEOGRAPH-3134A", "\U0003134A") def test_bmp_characters(self): for code in range(0x10000): @@ -172,6 +172,9 @@ def test_named_sequences_sample(self): def test_named_sequences_full(self): # Check all the named sequences + def check_version(testfile): + hdr = testfile.readline() + return unicodedata.unidata_version in hdr url = ("http://www.pythontest.net/unicode/%s/NamedSequences.txt" % unicodedata.unidata_version) try: diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 1d6aabdbbcc940ec3292152ab902fb7d6070b359..23508c56e7ffef2715c0dfac17bb9ebc8a398b6d 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -11,10 +11,12 @@ import operator import struct import sys +import textwrap import unicodedata import unittest import warnings from test import support, string_tests +from test.support.script_helper import assert_python_failure # Error handling (bad decoder return) def search_function(encoding): @@ -718,6 +720,13 @@ def test_isidentifier(self): self.assertFalse("©".isidentifier()) self.assertFalse("0".isidentifier()) + @support.cpython_only + def test_isidentifier_legacy(self): + import _testcapi + u = '𝖀𝖓𝖎𝖈𝖔𝖉𝖊' + self.assertTrue(u.isidentifier()) + self.assertTrue(_testcapi.unicode_legacy_string(u).isidentifier()) + def test_isprintable(self): self.assertTrue("".isprintable()) self.assertTrue(" ".isprintable()) @@ -1750,7 +1759,7 @@ def test_issue8271(self): # Issue #8271: during the decoding of an invalid UTF-8 byte sequence, # only the start byte and the continuation byte(s) are now considered # invalid, instead of the number of bytes specified by the start byte. - # See http://www.unicode.org/versions/Unicode5.2.0/ch03.pdf (page 95, + # See https://www.unicode.org/versions/Unicode5.2.0/ch03.pdf (page 95, # table 3-8, Row 2) for more information about the algorithm used. FFFD = '\ufffd' sequences = [ @@ -2447,6 +2456,66 @@ def test_free_after_iterating(self): support.check_free_after_iterating(self, iter, str) support.check_free_after_iterating(self, reversed, str) + def test_check_encoding_errors(self): + # bpo-37388: str(bytes) and str.decode() must check encoding and errors + # arguments in dev mode + encodings = ('ascii', 'utf8', 'latin1') + invalid = 'Boom, Shaka Laka, Boom!' + code = textwrap.dedent(f''' + import sys + encodings = {encodings!r} + + for data in (b'', b'short string'): + try: + str(data, encoding={invalid!r}) + except LookupError: + pass + else: + sys.exit(21) + + try: + str(data, errors={invalid!r}) + except LookupError: + pass + else: + sys.exit(22) + + for encoding in encodings: + try: + str(data, encoding, errors={invalid!r}) + except LookupError: + pass + else: + sys.exit(22) + + for data in ('', 'short string'): + try: + data.encode(encoding={invalid!r}) + except LookupError: + pass + else: + sys.exit(23) + + try: + data.encode(errors={invalid!r}) + except LookupError: + pass + else: + sys.exit(24) + + for encoding in encodings: + try: + data.encode(encoding, errors={invalid!r}) + except LookupError: + pass + else: + sys.exit(24) + + sys.exit(10) + ''') + proc = assert_python_failure('-X', 'dev', '-c', code) + self.assertEqual(proc.rc, 10, proc) + class CAPITest(unittest.TestCase): @@ -2454,11 +2523,13 @@ class CAPITest(unittest.TestCase): def test_from_format(self): support.import_module('ctypes') from ctypes import ( + c_char_p, pythonapi, py_object, sizeof, c_int, c_long, c_longlong, c_ssize_t, c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p) name = "PyUnicode_FromFormat" _PyUnicode_FromFormat = getattr(pythonapi, name) + _PyUnicode_FromFormat.argtypes = (c_char_p,) _PyUnicode_FromFormat.restype = py_object def PyUnicode_FromFormat(format, *args): @@ -2758,15 +2829,43 @@ def test_asucs4(self): for s in ['abc', '\xa1\xa2', '\u4f60\u597d', 'a\U0001f600', 'a\ud800b\udfffc', '\ud834\udd1e']: l = len(s) - self.assertEqual(unicode_asucs4(s, l, 1), s+'\0') - self.assertEqual(unicode_asucs4(s, l, 0), s+'\uffff') - self.assertEqual(unicode_asucs4(s, l+1, 1), s+'\0\uffff') - self.assertEqual(unicode_asucs4(s, l+1, 0), s+'\0\uffff') - self.assertRaises(SystemError, unicode_asucs4, s, l-1, 1) - self.assertRaises(SystemError, unicode_asucs4, s, l-2, 0) + self.assertEqual(unicode_asucs4(s, l, True), s+'\0') + self.assertEqual(unicode_asucs4(s, l, False), s+'\uffff') + self.assertEqual(unicode_asucs4(s, l+1, True), s+'\0\uffff') + self.assertEqual(unicode_asucs4(s, l+1, False), s+'\0\uffff') + self.assertRaises(SystemError, unicode_asucs4, s, l-1, True) + self.assertRaises(SystemError, unicode_asucs4, s, l-2, False) s = '\0'.join([s, s]) - self.assertEqual(unicode_asucs4(s, len(s), 1), s+'\0') - self.assertEqual(unicode_asucs4(s, len(s), 0), s+'\uffff') + self.assertEqual(unicode_asucs4(s, len(s), True), s+'\0') + self.assertEqual(unicode_asucs4(s, len(s), False), s+'\uffff') + + # Test PyUnicode_AsUTF8() + @support.cpython_only + def test_asutf8(self): + from _testcapi import unicode_asutf8 + + bmp = '\u0100' + bmp2 = '\uffff' + nonbmp = chr(0x10ffff) + + self.assertEqual(unicode_asutf8(bmp), b'\xc4\x80') + self.assertEqual(unicode_asutf8(bmp2), b'\xef\xbf\xbf') + self.assertEqual(unicode_asutf8(nonbmp), b'\xf4\x8f\xbf\xbf') + self.assertRaises(UnicodeEncodeError, unicode_asutf8, 'a\ud800b\udfffc') + + # Test PyUnicode_AsUTF8AndSize() + @support.cpython_only + def test_asutf8andsize(self): + from _testcapi import unicode_asutf8andsize + + bmp = '\u0100' + bmp2 = '\uffff' + nonbmp = chr(0x10ffff) + + self.assertEqual(unicode_asutf8andsize(bmp), (b'\xc4\x80', 2)) + self.assertEqual(unicode_asutf8andsize(bmp2), (b'\xef\xbf\xbf', 3)) + self.assertEqual(unicode_asutf8andsize(nonbmp), (b'\xf4\x8f\xbf\xbf', 4)) + self.assertRaises(UnicodeEncodeError, unicode_asutf8andsize, 'a\ud800b\udfffc') # Test PyUnicode_FindChar() @support.cpython_only diff --git a/Lib/test/test_unicode_identifiers.py b/Lib/test/test_unicode_identifiers.py index 07332c4631903e582d2a4b13ee508442904518be..5b9ced5d1cb837f3f3874bb1b605f30373dadebc 100644 --- a/Lib/test/test_unicode_identifiers.py +++ b/Lib/test/test_unicode_identifiers.py @@ -20,9 +20,11 @@ def test_non_bmp_normalized(self): def test_invalid(self): try: from test import badsyntax_3131 - except SyntaxError as s: - self.assertEqual(str(s), - "invalid character in identifier (badsyntax_3131.py, line 2)") + except SyntaxError as err: + self.assertEqual(str(err), + "invalid character '€' (U+20AC) (badsyntax_3131.py, line 2)") + self.assertEqual(err.lineno, 2) + self.assertEqual(err.offset, 1) else: self.fail("expected exception didn't occur") diff --git a/Lib/test/test_unicodedata.py b/Lib/test/test_unicodedata.py index 07d717688b0c592b0f9884d05cf67cdc9af513ad..b552d2bd1754b333e407e8f9543d40a3d51bfd0c 100644 --- a/Lib/test/test_unicodedata.py +++ b/Lib/test/test_unicodedata.py @@ -1,4 +1,4 @@ -""" Test script for the unicodedata module. +""" Tests for the unicodedata module. Written by Marc-Andre Lemburg (mal@lemburg.com). @@ -6,25 +6,23 @@ """ +import hashlib +from http.client import HTTPException import sys +import unicodedata import unittest -import hashlib -from test.support import script_helper - -encoding = 'utf-8' -errors = 'surrogatepass' - +from test.support import open_urlresource, requires_resource, script_helper -### Run tests class UnicodeMethodsTest(unittest.TestCase): # update this, if the database changes - expectedchecksum = '9129d6f2bdf008a81c2476e5b5127014a62130c1' + expectedchecksum = 'fbdf8106a3c7c242086b0a9efa03ad4d30d5b85d' + @requires_resource('cpu') def test_method_checksum(self): h = hashlib.sha1() - for i in range(0x10000): + for i in range(sys.maxunicode + 1): char = chr(i) data = [ # Predicates (single char) @@ -61,31 +59,25 @@ def test_method_checksum(self): (char + 'ABC').title(), ] - h.update(''.join(data).encode(encoding, errors)) + h.update(''.join(data).encode('utf-8', 'surrogatepass')) result = h.hexdigest() self.assertEqual(result, self.expectedchecksum) class UnicodeDatabaseTest(unittest.TestCase): - - def setUp(self): - # In case unicodedata is not available, this will raise an ImportError, - # but the other test cases will still be run - import unicodedata - self.db = unicodedata - - def tearDown(self): - del self.db + db = unicodedata class UnicodeFunctionsTest(UnicodeDatabaseTest): # Update this if the database changes. Make sure to do a full rebuild # (e.g. 'make distclean && make') to get the correct checksum. - expectedchecksum = 'c44a49ca7c5cb6441640fe174ede604b45028652' + expectedchecksum = 'd1e37a2854df60ac607b47b51189b9bf1b54bfdb' + + @requires_resource('cpu') def test_function_checksum(self): data = [] h = hashlib.sha1() - for i in range(0x10000): + for i in range(sys.maxunicode + 1): char = chr(i) data = [ # Properties @@ -183,15 +175,8 @@ def test_combining(self): self.assertRaises(TypeError, self.db.combining) self.assertRaises(TypeError, self.db.combining, 'xx') - def test_normalize(self): - self.assertRaises(TypeError, self.db.normalize) - self.assertRaises(ValueError, self.db.normalize, 'unknown', 'xx') - self.assertEqual(self.db.normalize('NFKC', ''), '') - # The rest can be found in test_normalization.py - # which requires an external file. - def test_pr29(self): - # http://www.unicode.org/review/pr-29.html + # https://www.unicode.org/review/pr-29.html # See issues #1054943 and #10254. composed = ("\u0b47\u0300\u0b3e", "\u1100\u0300\u1161", 'Li\u030dt-s\u1e73\u0301', @@ -220,9 +205,6 @@ def test_issue29456(self): self.assertEqual(self.db.normalize('NFC', u11a7_str_a), u11a7_str_b) self.assertEqual(self.db.normalize('NFC', u11c3_str_a), u11c3_str_b) - # For tests of unicodedata.is_normalized / self.db.is_normalized , - # see test_normalization.py . - def test_east_asian_width(self): eaw = self.db.east_asian_width self.assertRaises(TypeError, eaw, b'a') @@ -327,5 +309,102 @@ def test_linebreak_7643(self): self.assertEqual(len(lines), 1, r"\u%.4x should not be a linebreak" % i) +class NormalizationTest(unittest.TestCase): + @staticmethod + def check_version(testfile): + hdr = testfile.readline() + return unicodedata.unidata_version in hdr + + @staticmethod + def unistr(data): + data = [int(x, 16) for x in data.split(" ")] + return "".join([chr(x) for x in data]) + + def test_normalization(self): + TESTDATAFILE = "NormalizationTest.txt" + TESTDATAURL = f"http://www.pythontest.net/unicode/{unicodedata.unidata_version}/{TESTDATAFILE}" + + # Hit the exception early + try: + testdata = open_urlresource(TESTDATAURL, encoding="utf-8", + check=self.check_version) + except PermissionError: + self.skipTest(f"Permission error when downloading {TESTDATAURL} " + f"into the test data directory") + except (OSError, HTTPException): + self.fail(f"Could not retrieve {TESTDATAURL}") + + with testdata: + self.run_normalization_tests(testdata) + + def run_normalization_tests(self, testdata): + part = None + part1_data = {} + + def NFC(str): + return unicodedata.normalize("NFC", str) + + def NFKC(str): + return unicodedata.normalize("NFKC", str) + + def NFD(str): + return unicodedata.normalize("NFD", str) + + def NFKD(str): + return unicodedata.normalize("NFKD", str) + + for line in testdata: + if '#' in line: + line = line.split('#')[0] + line = line.strip() + if not line: + continue + if line.startswith("@Part"): + part = line.split()[0] + continue + c1,c2,c3,c4,c5 = [self.unistr(x) for x in line.split(';')[:-1]] + + # Perform tests + self.assertTrue(c2 == NFC(c1) == NFC(c2) == NFC(c3), line) + self.assertTrue(c4 == NFC(c4) == NFC(c5), line) + self.assertTrue(c3 == NFD(c1) == NFD(c2) == NFD(c3), line) + self.assertTrue(c5 == NFD(c4) == NFD(c5), line) + self.assertTrue(c4 == NFKC(c1) == NFKC(c2) == \ + NFKC(c3) == NFKC(c4) == NFKC(c5), + line) + self.assertTrue(c5 == NFKD(c1) == NFKD(c2) == \ + NFKD(c3) == NFKD(c4) == NFKD(c5), + line) + + self.assertTrue(unicodedata.is_normalized("NFC", c2)) + self.assertTrue(unicodedata.is_normalized("NFC", c4)) + + self.assertTrue(unicodedata.is_normalized("NFD", c3)) + self.assertTrue(unicodedata.is_normalized("NFD", c5)) + + self.assertTrue(unicodedata.is_normalized("NFKC", c4)) + self.assertTrue(unicodedata.is_normalized("NFKD", c5)) + + # Record part 1 data + if part == "@Part1": + part1_data[c1] = 1 + + # Perform tests for all other data + for c in range(sys.maxunicode+1): + X = chr(c) + if X in part1_data: + continue + self.assertTrue(X == NFC(X) == NFD(X) == NFKC(X) == NFKD(X), c) + + def test_edge_cases(self): + self.assertRaises(TypeError, unicodedata.normalize) + self.assertRaises(ValueError, unicodedata.normalize, 'unknown', 'xx') + self.assertEqual(unicodedata.normalize('NFKC', ''), '') + + def test_bug_834676(self): + # Check for bug 834676 + unicodedata.normalize('NFC', '\ud55c\uae00') + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_unpack_ex.py b/Lib/test/test_unpack_ex.py index 45cf051f1ec1a9da8c673f398e1b841170657cb7..049e48b13fa1f90d9d14ec2439c272f0eea801b5 100644 --- a/Lib/test/test_unpack_ex.py +++ b/Lib/test/test_unpack_ex.py @@ -158,14 +158,20 @@ ... SyntaxError: iterable unpacking cannot be used in comprehension -Generator expression in function arguments - - >>> list(*x for x in (range(5) for i in range(3))) + >>> {**{} for a in [1]} Traceback (most recent call last): ... - list(*x for x in (range(5) for i in range(3))) - ^ - SyntaxError: invalid syntax + SyntaxError: dict unpacking cannot be used in dict comprehension + +# Pegen is better here. +# Generator expression in function arguments + +# >>> list(*x for x in (range(5) for i in range(3))) +# Traceback (most recent call last): +# ... +# list(*x for x in (range(5) for i in range(3))) +# ^ +# SyntaxError: invalid syntax >>> dict(**x for x in [{1:2}]) Traceback (most recent call last): @@ -236,27 +242,27 @@ >>> f(x=5, **{'x': 3}, y=2) Traceback (most recent call last): ... - TypeError: f() got multiple values for keyword argument 'x' + TypeError: test.test_unpack_ex.f() got multiple values for keyword argument 'x' >>> f(**{'x': 3}, x=5, y=2) Traceback (most recent call last): ... - TypeError: f() got multiple values for keyword argument 'x' + TypeError: test.test_unpack_ex.f() got multiple values for keyword argument 'x' >>> f(**{'x': 3}, **{'x': 5}, y=2) Traceback (most recent call last): ... - TypeError: f() got multiple values for keyword argument 'x' + TypeError: test.test_unpack_ex.f() got multiple values for keyword argument 'x' >>> f(x=5, **{'x': 3}, **{'x': 2}) Traceback (most recent call last): ... - TypeError: f() got multiple values for keyword argument 'x' + TypeError: test.test_unpack_ex.f() got multiple values for keyword argument 'x' >>> f(**{1: 3}, **{1: 5}) Traceback (most recent call last): ... - TypeError: f() keywords must be strings + TypeError: test.test_unpack_ex.f() got multiple values for keyword argument '1' Unpacking non-sequence @@ -308,12 +314,17 @@ >>> a, *b, c, *d, e = range(10) # doctest:+ELLIPSIS Traceback (most recent call last): ... - SyntaxError: two starred expressions in assignment + SyntaxError: multiple starred expressions in assignment >>> [*b, *c] = range(10) # doctest:+ELLIPSIS Traceback (most recent call last): ... - SyntaxError: two starred expressions in assignment + SyntaxError: multiple starred expressions in assignment + + >>> a,*b,*c,*d = range(4) # doctest:+ELLIPSIS + Traceback (most recent call last): + ... + SyntaxError: multiple starred expressions in assignment >>> *a = range(10) # doctest:+ELLIPSIS Traceback (most recent call last): @@ -335,6 +346,31 @@ ... SyntaxError: can't use starred expression here + >>> (*x),y = 1, 2 # doctest:+ELLIPSIS + Traceback (most recent call last): + ... + SyntaxError: can't use starred expression here + + >>> (((*x))),y = 1, 2 # doctest:+ELLIPSIS + Traceback (most recent call last): + ... + SyntaxError: can't use starred expression here + + >>> z,(*x),y = 1, 2, 4 # doctest:+ELLIPSIS + Traceback (most recent call last): + ... + SyntaxError: can't use starred expression here + + >>> z,(*x) = 1, 2 # doctest:+ELLIPSIS + Traceback (most recent call last): + ... + SyntaxError: can't use starred expression here + + >>> ((*x),y) = 1, 2 # doctest:+ELLIPSIS + Traceback (most recent call last): + ... + SyntaxError: can't use starred expression here + Some size constraints (all fail.) >>> s = ", ".join("a%d" % i for i in range(1<<8)) + ", *rest = range(1<<8 + 1)" diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py new file mode 100644 index 0000000000000000000000000000000000000000..c7c8613ea2793f00fce6a4de545389be654a5431 --- /dev/null +++ b/Lib/test/test_unparse.py @@ -0,0 +1,558 @@ +"""Tests for the unparse.py script in the Tools/parser directory.""" + +import unittest +import test.support +import pathlib +import random +import tokenize +import ast + + +def read_pyfile(filename): + """Read and return the contents of a Python source file (as a + string), taking into account the file encoding.""" + with tokenize.open(filename) as stream: + return stream.read() + + +for_else = """\ +def f(): + for x in range(10): + break + else: + y = 2 + z = 3 +""" + +while_else = """\ +def g(): + while True: + break + else: + y = 2 + z = 3 +""" + +relative_import = """\ +from . import fred +from .. import barney +from .australia import shrimp as prawns +""" + +nonlocal_ex = """\ +def f(): + x = 1 + def g(): + nonlocal x + x = 2 + y = 7 + def h(): + nonlocal x, y +""" + +# also acts as test for 'except ... as ...' +raise_from = """\ +try: + 1 / 0 +except ZeroDivisionError as e: + raise ArithmeticError from e +""" + +class_decorator = """\ +@f1(arg) +@f2 +class Foo: pass +""" + +elif1 = """\ +if cond1: + suite1 +elif cond2: + suite2 +else: + suite3 +""" + +elif2 = """\ +if cond1: + suite1 +elif cond2: + suite2 +""" + +try_except_finally = """\ +try: + suite1 +except ex1: + suite2 +except ex2: + suite3 +else: + suite4 +finally: + suite5 +""" + +with_simple = """\ +with f(): + suite1 +""" + +with_as = """\ +with f() as x: + suite1 +""" + +with_two_items = """\ +with f() as x, g() as y: + suite1 +""" + +docstring_prefixes = ( + "", + "class foo:\n ", + "def foo():\n ", + "async def foo():\n ", +) + +class ASTTestCase(unittest.TestCase): + def assertASTEqual(self, ast1, ast2): + self.assertEqual(ast.dump(ast1), ast.dump(ast2)) + + def check_ast_roundtrip(self, code1, **kwargs): + with self.subTest(code1=code1, ast_parse_kwargs=kwargs): + ast1 = ast.parse(code1, **kwargs) + code2 = ast.unparse(ast1) + ast2 = ast.parse(code2, **kwargs) + self.assertASTEqual(ast1, ast2) + + def check_invalid(self, node, raises=ValueError): + with self.subTest(node=node): + self.assertRaises(raises, ast.unparse, node) + + def get_source(self, code1, code2=None): + code2 = code2 or code1 + code1 = ast.unparse(ast.parse(code1)) + return code1, code2 + + def check_src_roundtrip(self, code1, code2=None): + code1, code2 = self.get_source(code1, code2) + with self.subTest(code1=code1, code2=code2): + self.assertEqual(code2, code1) + + def check_src_dont_roundtrip(self, code1, code2=None): + code1, code2 = self.get_source(code1, code2) + with self.subTest(code1=code1, code2=code2): + self.assertNotEqual(code2, code1) + +class UnparseTestCase(ASTTestCase): + # Tests for specific bugs found in earlier versions of unparse + + def test_fstrings(self): + # See issue 25180 + self.check_ast_roundtrip(r"""f'{f"{0}"*3}'""") + self.check_ast_roundtrip(r"""f'{f"{y}"*3}'""") + self.check_ast_roundtrip("""f''""") + self.check_ast_roundtrip('''f"""'end' "quote\\""""''') + + def test_fstrings_complicated(self): + # See issue 28002 + self.check_ast_roundtrip("""f'''{"'"}'''""") + self.check_ast_roundtrip('''f\'\'\'-{f"""*{f"+{f'.{x}.'}+"}*"""}-\'\'\'''') + self.check_ast_roundtrip('''f\'\'\'-{f"""*{f"+{f'.{x}.'}+"}*"""}-'single quote\\'\'\'\'''') + self.check_ast_roundtrip('f"""{\'\'\'\n\'\'\'}"""') + self.check_ast_roundtrip('f"""{g(\'\'\'\n\'\'\')}"""') + self.check_ast_roundtrip('''f"a\\r\\nb"''') + self.check_ast_roundtrip('''f"\\u2028{'x'}"''') + + def test_strings(self): + self.check_ast_roundtrip("u'foo'") + self.check_ast_roundtrip("r'foo'") + self.check_ast_roundtrip("b'foo'") + + def test_del_statement(self): + self.check_ast_roundtrip("del x, y, z") + + def test_shifts(self): + self.check_ast_roundtrip("45 << 2") + self.check_ast_roundtrip("13 >> 7") + + def test_for_else(self): + self.check_ast_roundtrip(for_else) + + def test_while_else(self): + self.check_ast_roundtrip(while_else) + + def test_unary_parens(self): + self.check_ast_roundtrip("(-1)**7") + self.check_ast_roundtrip("(-1.)**8") + self.check_ast_roundtrip("(-1j)**6") + self.check_ast_roundtrip("not True or False") + self.check_ast_roundtrip("True or not False") + + def test_integer_parens(self): + self.check_ast_roundtrip("3 .__abs__()") + + def test_huge_float(self): + self.check_ast_roundtrip("1e1000") + self.check_ast_roundtrip("-1e1000") + self.check_ast_roundtrip("1e1000j") + self.check_ast_roundtrip("-1e1000j") + + def test_min_int(self): + self.check_ast_roundtrip(str(-(2 ** 31))) + self.check_ast_roundtrip(str(-(2 ** 63))) + + def test_imaginary_literals(self): + self.check_ast_roundtrip("7j") + self.check_ast_roundtrip("-7j") + self.check_ast_roundtrip("0j") + self.check_ast_roundtrip("-0j") + + def test_lambda_parentheses(self): + self.check_ast_roundtrip("(lambda: int)()") + + def test_chained_comparisons(self): + self.check_ast_roundtrip("1 < 4 <= 5") + self.check_ast_roundtrip("a is b is c is not d") + + def test_function_arguments(self): + self.check_ast_roundtrip("def f(): pass") + self.check_ast_roundtrip("def f(a): pass") + self.check_ast_roundtrip("def f(b = 2): pass") + self.check_ast_roundtrip("def f(a, b): pass") + self.check_ast_roundtrip("def f(a, b = 2): pass") + self.check_ast_roundtrip("def f(a = 5, b = 2): pass") + self.check_ast_roundtrip("def f(*, a = 1, b = 2): pass") + self.check_ast_roundtrip("def f(*, a = 1, b): pass") + self.check_ast_roundtrip("def f(*, a, b = 2): pass") + self.check_ast_roundtrip("def f(a, b = None, *, c, **kwds): pass") + self.check_ast_roundtrip("def f(a=2, *args, c=5, d, **kwds): pass") + self.check_ast_roundtrip("def f(*args, **kwargs): pass") + + def test_relative_import(self): + self.check_ast_roundtrip(relative_import) + + def test_nonlocal(self): + self.check_ast_roundtrip(nonlocal_ex) + + def test_raise_from(self): + self.check_ast_roundtrip(raise_from) + + def test_bytes(self): + self.check_ast_roundtrip("b'123'") + + def test_annotations(self): + self.check_ast_roundtrip("def f(a : int): pass") + self.check_ast_roundtrip("def f(a: int = 5): pass") + self.check_ast_roundtrip("def f(*args: [int]): pass") + self.check_ast_roundtrip("def f(**kwargs: dict): pass") + self.check_ast_roundtrip("def f() -> None: pass") + + def test_set_literal(self): + self.check_ast_roundtrip("{'a', 'b', 'c'}") + + def test_set_comprehension(self): + self.check_ast_roundtrip("{x for x in range(5)}") + + def test_dict_comprehension(self): + self.check_ast_roundtrip("{x: x*x for x in range(10)}") + + def test_class_decorators(self): + self.check_ast_roundtrip(class_decorator) + + def test_class_definition(self): + self.check_ast_roundtrip("class A(metaclass=type, *[], **{}): pass") + + def test_elifs(self): + self.check_ast_roundtrip(elif1) + self.check_ast_roundtrip(elif2) + + def test_try_except_finally(self): + self.check_ast_roundtrip(try_except_finally) + + def test_starred_assignment(self): + self.check_ast_roundtrip("a, *b, c = seq") + self.check_ast_roundtrip("a, (*b, c) = seq") + self.check_ast_roundtrip("a, *b[0], c = seq") + self.check_ast_roundtrip("a, *(b, c) = seq") + + def test_with_simple(self): + self.check_ast_roundtrip(with_simple) + + def test_with_as(self): + self.check_ast_roundtrip(with_as) + + def test_with_two_items(self): + self.check_ast_roundtrip(with_two_items) + + def test_dict_unpacking_in_dict(self): + # See issue 26489 + self.check_ast_roundtrip(r"""{**{'y': 2}, 'x': 1}""") + self.check_ast_roundtrip(r"""{**{'y': 2}, **{'x': 1}}""") + + def test_slices(self): + self.check_ast_roundtrip("a[i]") + self.check_ast_roundtrip("a[i,]") + self.check_ast_roundtrip("a[i, j]") + self.check_ast_roundtrip("a[(*a,)]") + self.check_ast_roundtrip("a[(a:=b)]") + self.check_ast_roundtrip("a[(a:=b,c)]") + self.check_ast_roundtrip("a[()]") + self.check_ast_roundtrip("a[i:j]") + self.check_ast_roundtrip("a[:j]") + self.check_ast_roundtrip("a[i:]") + self.check_ast_roundtrip("a[i:j:k]") + self.check_ast_roundtrip("a[:j:k]") + self.check_ast_roundtrip("a[i::k]") + self.check_ast_roundtrip("a[i:j,]") + self.check_ast_roundtrip("a[i:j, k]") + + def test_invalid_raise(self): + self.check_invalid(ast.Raise(exc=None, cause=ast.Name(id="X"))) + + def test_invalid_fstring_constant(self): + self.check_invalid(ast.JoinedStr(values=[ast.Constant(value=100)])) + + def test_invalid_fstring_conversion(self): + self.check_invalid( + ast.FormattedValue( + value=ast.Constant(value="a", kind=None), + conversion=ord("Y"), # random character + format_spec=None, + ) + ) + + def test_invalid_fstring_backslash(self): + self.check_invalid(ast.FormattedValue(value=ast.Constant(value="\\\\"))) + + def test_invalid_set(self): + self.check_invalid(ast.Set(elts=[])) + + def test_invalid_yield_from(self): + self.check_invalid(ast.YieldFrom(value=None)) + + def test_docstrings(self): + docstrings = ( + 'this ends with double quote"', + 'this includes a """triple quote"""', + '\r', + '\\r', + '\t', + '\\t', + '\n', + '\\n', + '\r\\r\t\\t\n\\n', + '""">>> content = \"\"\"blabla\"\"\" <<<"""', + r'foo\n\x00', + "' \\'\\'\\'\"\"\" \"\"\\'\\' \\'", + '🐍⛎𩸽üéş^\\\\X\\\\BB\N{LONG RIGHTWARDS SQUIGGLE ARROW}' + ) + for docstring in docstrings: + # check as Module docstrings for easy testing + self.check_ast_roundtrip(f"'''{docstring}'''") + + def test_constant_tuples(self): + self.check_src_roundtrip(ast.Constant(value=(1,), kind=None), "(1,)") + self.check_src_roundtrip( + ast.Constant(value=(1, 2, 3), kind=None), "(1, 2, 3)" + ) + + def test_function_type(self): + for function_type in ( + "() -> int", + "(int, int) -> int", + "(Callable[complex], More[Complex(call.to_typevar())]) -> None" + ): + self.check_ast_roundtrip(function_type, mode="func_type") + + def test_type_comments(self): + for statement in ( + "a = 5 # type:", + "a = 5 # type: int", + "a = 5 # type: int and more", + "def x(): # type: () -> None\n\tpass", + "def x(y): # type: (int) -> None and more\n\tpass", + "async def x(): # type: () -> None\n\tpass", + "async def x(y): # type: (int) -> None and more\n\tpass", + "for x in y: # type: int\n\tpass", + "async for x in y: # type: int\n\tpass", + "with x(): # type: int\n\tpass", + "async with x(): # type: int\n\tpass" + ): + self.check_ast_roundtrip(statement, type_comments=True) + + def test_type_ignore(self): + for statement in ( + "a = 5 # type: ignore", + "a = 5 # type: ignore and more", + "def x(): # type: ignore\n\tpass", + "def x(y): # type: ignore and more\n\tpass", + "async def x(): # type: ignore\n\tpass", + "async def x(y): # type: ignore and more\n\tpass", + "for x in y: # type: ignore\n\tpass", + "async for x in y: # type: ignore\n\tpass", + "with x(): # type: ignore\n\tpass", + "async with x(): # type: ignore\n\tpass" + ): + self.check_ast_roundtrip(statement, type_comments=True) + + +class CosmeticTestCase(ASTTestCase): + """Test if there are cosmetic issues caused by unnecesary additions""" + + def test_simple_expressions_parens(self): + self.check_src_roundtrip("(a := b)") + self.check_src_roundtrip("await x") + self.check_src_roundtrip("x if x else y") + self.check_src_roundtrip("lambda x: x") + self.check_src_roundtrip("1 + 1") + self.check_src_roundtrip("1 + 2 / 3") + self.check_src_roundtrip("(1 + 2) / 3") + self.check_src_roundtrip("(1 + 2) * 3 + 4 * (5 + 2)") + self.check_src_roundtrip("(1 + 2) * 3 + 4 * (5 + 2) ** 2") + self.check_src_roundtrip("~x") + self.check_src_roundtrip("x and y") + self.check_src_roundtrip("x and y and z") + self.check_src_roundtrip("x and (y and x)") + self.check_src_roundtrip("(x and y) and z") + self.check_src_roundtrip("(x ** y) ** z ** q") + self.check_src_roundtrip("x >> y") + self.check_src_roundtrip("x << y") + self.check_src_roundtrip("x >> y and x >> z") + self.check_src_roundtrip("x + y - z * q ^ t ** k") + self.check_src_roundtrip("P * V if P and V else n * R * T") + self.check_src_roundtrip("lambda P, V, n: P * V == n * R * T") + self.check_src_roundtrip("flag & (other | foo)") + self.check_src_roundtrip("not x == y") + self.check_src_roundtrip("x == (not y)") + self.check_src_roundtrip("yield x") + self.check_src_roundtrip("yield from x") + self.check_src_roundtrip("call((yield x))") + self.check_src_roundtrip("return x + (yield x)") + + def test_class_bases_and_keywords(self): + self.check_src_roundtrip("class X:\n pass") + self.check_src_roundtrip("class X(A):\n pass") + self.check_src_roundtrip("class X(A, B, C, D):\n pass") + self.check_src_roundtrip("class X(x=y):\n pass") + self.check_src_roundtrip("class X(metaclass=z):\n pass") + self.check_src_roundtrip("class X(x=y, z=d):\n pass") + self.check_src_roundtrip("class X(A, x=y):\n pass") + self.check_src_roundtrip("class X(A, **kw):\n pass") + self.check_src_roundtrip("class X(*args):\n pass") + self.check_src_roundtrip("class X(*args, **kwargs):\n pass") + + def test_fstrings(self): + self.check_src_roundtrip('''f\'\'\'-{f"""*{f"+{f'.{x}.'}+"}*"""}-\'\'\'''') + self.check_src_roundtrip('''f"\\u2028{'x'}"''') + self.check_src_roundtrip(r"f'{x}\n'") + self.check_src_roundtrip('''f''\'{"""\n"""}\\n''\'''') + self.check_src_roundtrip('''f''\'{f"""{x}\n"""}\\n''\'''') + + def test_docstrings(self): + docstrings = ( + '"""simple doc string"""', + '''"""A more complex one + with some newlines"""''', + '''"""Foo bar baz + + empty newline"""''', + '"""With some \t"""', + '"""Foo "bar" baz """', + '"""\\r"""', + '""""""', + '"""\'\'\'"""', + '"""\'\'\'\'\'\'"""', + '"""🐍⛎𩸽üéş^\\\\X\\\\BB⟿"""', + '"""end in single \'quote\'"""', + "'''end in double \"quote\"'''", + '"""almost end in double "quote"."""', + ) + + for prefix in docstring_prefixes: + for docstring in docstrings: + self.check_src_roundtrip(f"{prefix}{docstring}") + + def test_docstrings_negative_cases(self): + # Test some cases that involve strings in the children of the + # first node but aren't docstrings to make sure we don't have + # False positives. + docstrings_negative = ( + 'a = """false"""', + '"""false""" + """unless its optimized"""', + '1 + 1\n"""false"""', + 'f"""no, top level but f-fstring"""' + ) + for prefix in docstring_prefixes: + for negative in docstrings_negative: + # this cases should be result with single quote + # rather then triple quoted docstring + src = f"{prefix}{negative}" + self.check_ast_roundtrip(src) + self.check_src_dont_roundtrip(src) + + def test_unary_op_factor(self): + for prefix in ("+", "-", "~"): + self.check_src_roundtrip(f"{prefix}1") + for prefix in ("not",): + self.check_src_roundtrip(f"{prefix} 1") + + def test_slices(self): + self.check_src_roundtrip("a[1]") + self.check_src_roundtrip("a[1, 2]") + self.check_src_roundtrip("a[(1, *a)]") + +class DirectoryTestCase(ASTTestCase): + """Test roundtrip behaviour on all files in Lib and Lib/test.""" + + lib_dir = pathlib.Path(__file__).parent / ".." + test_directories = (lib_dir, lib_dir / "test") + run_always_files = {"test_grammar.py", "test_syntax.py", "test_compile.py", + "test_ast.py", "test_asdl_parser.py", "test_fstring.py"} + + _files_to_test = None + + @classmethod + def files_to_test(cls): + + if cls._files_to_test is not None: + return cls._files_to_test + + items = [ + item.resolve() + for directory in cls.test_directories + for item in directory.glob("*.py") + if not item.name.startswith("bad") + ] + + # Test limited subset of files unless the 'cpu' resource is specified. + if not test.support.is_resource_enabled("cpu"): + + tests_to_run_always = {item for item in items if + item.name in cls.run_always_files} + + items = set(random.sample(items, 10)) + + # Make sure that at least tests that heavily use grammar features are + # always considered in order to reduce the chance of missing something. + items = list(items | tests_to_run_always) + + # bpo-31174: Store the names sample to always test the same files. + # It prevents false alarms when hunting reference leaks. + cls._files_to_test = items + + return items + + def test_files(self): + for item in self.files_to_test(): + if test.support.verbose: + print(f"Testing {item.absolute()}") + + with self.subTest(filename=item): + source = read_pyfile(item) + self.check_ast_roundtrip(source) + + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 1c247c5d1543a20cadb99235572b1d50b9e935a8..68bb49efb281070070ff80f818710a8547699da1 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -151,7 +151,8 @@ def setUp(self): finally: f.close() self.pathname = support.TESTFN - self.returned_obj = urlopen("file:%s" % self.pathname) + self.quoted_pathname = urllib.parse.quote(self.pathname) + self.returned_obj = urlopen("file:%s" % self.quoted_pathname) def tearDown(self): """Shut down the open object""" @@ -194,11 +195,20 @@ def test_close(self): # by the tearDown() method for the test self.returned_obj.close() + def test_headers(self): + self.assertIsInstance(self.returned_obj.headers, email.message.Message) + + def test_url(self): + self.assertEqual(self.returned_obj.url, self.quoted_pathname) + + def test_status(self): + self.assertIsNone(self.returned_obj.status) + def test_info(self): self.assertIsInstance(self.returned_obj.info(), email.message.Message) def test_geturl(self): - self.assertEqual(self.returned_obj.geturl(), self.pathname) + self.assertEqual(self.returned_obj.geturl(), self.quoted_pathname) def test_getcode(self): self.assertIsNone(self.returned_obj.getcode()) @@ -599,6 +609,9 @@ class urlopen_DataTests(unittest.TestCase): """Test urlopen() opening a data URL.""" def setUp(self): + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + # text containing URL special- and unicode-characters self.text = "test data URLs :;,%=& \u00f6 \u00c4 " # 2x1 pixel RGB PNG image with one black and one white pixel @@ -673,6 +686,9 @@ class urlretrieve_FileTests(unittest.TestCase): """Test urllib.urlretrieve() on local files""" def setUp(self): + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + # Create a list of temporary files. Each item in the list is a file # name (absolute path or relative to the current working directory). # All files in this list will be deleted in the tearDown method. Note, @@ -813,6 +829,8 @@ class urlretrieve_HttpTests(unittest.TestCase, FakeHTTPMixin): """Test urllib.urlretrieve() using fake http connections""" def test_short_content_raises_ContentTooShortError(self): + self.addCleanup(urllib.request.urlcleanup) + self.fakehttp(b'''HTTP/1.1 200 OK Date: Wed, 02 Jan 2008 03:03:54 GMT Server: Apache/1.3.33 (Debian GNU/Linux) mod_ssl/2.8.22 OpenSSL/0.9.7e @@ -834,6 +852,8 @@ def _reporthook(par1, par2, par3): self.unfakehttp() def test_short_content_raises_ContentTooShortError_without_reporthook(self): + self.addCleanup(urllib.request.urlcleanup) + self.fakehttp(b'''HTTP/1.1 200 OK Date: Wed, 02 Jan 2008 03:03:54 GMT Server: Apache/1.3.33 (Debian GNU/Linux) mod_ssl/2.8.22 OpenSSL/0.9.7e @@ -1084,8 +1104,6 @@ def test_unquoting(self): "%s" % result) self.assertRaises((TypeError, AttributeError), urllib.parse.unquote, None) self.assertRaises((TypeError, AttributeError), urllib.parse.unquote, ()) - with support.check_warnings(('', BytesWarning), quiet=True): - self.assertRaises((TypeError, AttributeError), urllib.parse.unquote, b'') def test_unquoting_badpercent(self): # Test unquoting on bad percent-escapes @@ -1245,6 +1263,29 @@ def test_unquote_with_unicode(self): self.assertEqual(expect, result, "using unquote(): %r != %r" % (expect, result)) + def test_unquoting_with_bytes_input(self): + # ASCII characters decoded to a string + given = b'blueberryjam' + expect = 'blueberryjam' + result = urllib.parse.unquote(given) + self.assertEqual(expect, result, + "using unquote(): %r != %r" % (expect, result)) + + # A mix of non-ASCII hex-encoded characters and ASCII characters + given = b'bl\xc3\xa5b\xc3\xa6rsyltet\xc3\xb8y' + expect = 'bl\u00e5b\u00e6rsyltet\u00f8y' + result = urllib.parse.unquote(given) + self.assertEqual(expect, result, + "using unquote(): %r != %r" % (expect, result)) + + # A mix of non-ASCII percent-encoded characters and ASCII characters + given = b'bl%c3%a5b%c3%a6rsyltet%c3%b8j' + expect = 'bl\u00e5b\u00e6rsyltet\u00f8j' + result = urllib.parse.unquote(given) + self.assertEqual(expect, result, + "using unquote(): %r != %r" % (expect, result)) + + class urlencode_Tests(unittest.TestCase): """Tests for urlencode()""" @@ -1558,85 +1599,6 @@ def open_local_file(self, url): self.assertRaises(OSError, DummyURLopener().retrieve, url) -# Just commented them out. -# Can't really tell why keep failing in windows and sparc. -# Everywhere else they work ok, but on those machines, sometimes -# fail in one of the tests, sometimes in other. I have a linux, and -# the tests go ok. -# If anybody has one of the problematic environments, please help! -# . Facundo -# -# def server(evt): -# import socket, time -# serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -# serv.settimeout(3) -# serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) -# serv.bind(("", 9093)) -# serv.listen() -# try: -# conn, addr = serv.accept() -# conn.send("1 Hola mundo\n") -# cantdata = 0 -# while cantdata < 13: -# data = conn.recv(13-cantdata) -# cantdata += len(data) -# time.sleep(.3) -# conn.send("2 No more lines\n") -# conn.close() -# except socket.timeout: -# pass -# finally: -# serv.close() -# evt.set() -# -# class FTPWrapperTests(unittest.TestCase): -# -# def setUp(self): -# import ftplib, time, threading -# ftplib.FTP.port = 9093 -# self.evt = threading.Event() -# threading.Thread(target=server, args=(self.evt,)).start() -# time.sleep(.1) -# -# def tearDown(self): -# self.evt.wait() -# -# def testBasic(self): -# # connects -# ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, []) -# ftp.close() -# -# def testTimeoutNone(self): -# # global default timeout is ignored -# import socket -# self.assertIsNone(socket.getdefaulttimeout()) -# socket.setdefaulttimeout(30) -# try: -# ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, []) -# finally: -# socket.setdefaulttimeout(None) -# self.assertEqual(ftp.ftp.sock.gettimeout(), 30) -# ftp.close() -# -# def testTimeoutDefault(self): -# # global default timeout is used -# import socket -# self.assertIsNone(socket.getdefaulttimeout()) -# socket.setdefaulttimeout(30) -# try: -# ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, []) -# finally: -# socket.setdefaulttimeout(None) -# self.assertEqual(ftp.ftp.sock.gettimeout(), 30) -# ftp.close() -# -# def testTimeoutValue(self): -# ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, [], -# timeout=30) -# self.assertEqual(ftp.ftp.sock.gettimeout(), 30) -# ftp.close() - - class RequestTests(unittest.TestCase): """Unit tests for urllib.request.Request.""" diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index 091b3979aa680c3a8cddf10b3ec3ba0fbd9cce5a..12c3f4dbd5bf087764e211523ff88f00ba46704c 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -1,5 +1,6 @@ import unittest from test import support +from test.support import socket_helper from test import test_urllib import os @@ -47,6 +48,9 @@ def test___all__(self): def test_trivial(self): # A couple trivial tests + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + self.assertRaises(ValueError, urllib.request.urlopen, 'bogus url') # XXX Name hacking to get this to work on Windows. @@ -631,17 +635,12 @@ def test_http_error(self): [("http_error_302")], ] handlers = add_ordered_mock_handlers(o, meth_spec) - - class Unknown: - def __eq__(self, other): - return True - req = Request("http://example.com/") o.open(req) assert len(o.calls) == 2 calls = [(handlers[0], "http_open", (req,)), (handlers[2], "http_error_302", - (req, Unknown(), 302, "", {}))] + (req, support.ALWAYS_EQ, 302, "", {}))] for expected, got in zip(calls, o.calls): handler, method_name, args = expected self.assertEqual((handler, method_name), got[:2]) @@ -1290,6 +1289,10 @@ def test_redirect_fragment(self): def test_redirect_no_path(self): # Issue 14132: Relative redirect strips original path + + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + real_class = http.client.HTTPConnection response1 = b"HTTP/1.1 302 Found\r\nLocation: ?query\r\n\r\n" http.client.HTTPConnection = test_urllib.fakehttp(response1) @@ -1444,6 +1447,18 @@ def test_osx_proxy_bypass(self): bypass = {'exclude_simple': True, 'exceptions': []} self.assertTrue(_proxy_bypass_macosx_sysconf('test', bypass)) + # Check that invalid prefix lengths are ignored + bypass = { + 'exclude_simple': False, + 'exceptions': [ '10.0.0.0/40', '172.19.10.0/24' ] + } + host = '172.19.10.5' + self.assertTrue(_proxy_bypass_macosx_sysconf(host, bypass), + 'expected bypass of %s to be True' % host) + host = '10.0.1.5' + self.assertFalse(_proxy_bypass_macosx_sysconf(host, bypass), + 'expected bypass of %s to be False' % host) + def check_basic_auth(self, headers, realm): with self.subTest(realm=realm, headers=headers): opener = OpenerDirector() @@ -1774,7 +1789,7 @@ class MyOtherHTTPHandler(urllib.request.HTTPHandler): @unittest.skipUnless(support.is_resource_enabled('network'), 'test requires network access') def test_issue16464(self): - with support.transient_internet("http://www.example.com/"): + with socket_helper.transient_internet("http://www.example.com/"): opener = urllib.request.build_opener() request = urllib.request.Request("http://www.example.com/") self.assertEqual(None, request.data) @@ -1834,9 +1849,17 @@ def test_parse_proxy(self): ('ftp', 'joe', 'password', 'proxy.example.com')), # Test for no trailing '/' case ('http://joe:password@proxy.example.com', - ('http', 'joe', 'password', 'proxy.example.com')) + ('http', 'joe', 'password', 'proxy.example.com')), + # Testcases with '/' character in username, password + ('http://user/name:password@localhost:22', + ('http', 'user/name', 'password', 'localhost:22')), + ('http://username:pass/word@localhost:22', + ('http', 'username', 'pass/word', 'localhost:22')), + ('http://user/name:pass/word@localhost:22', + ('http', 'user/name', 'pass/word', 'localhost:22')), ] + for tc, expected in parse_proxy_test_cases: self.assertEqual(_parse_proxy(tc), expected) diff --git a/Lib/test/test_urllib2_localnet.py b/Lib/test/test_urllib2_localnet.py index 1cb358f8ddc8dff7f73b84868cd5df2eb0dad744..ed426b05a71982c0da1e33ed378c13f83db5d5e4 100644 --- a/Lib/test/test_urllib2_localnet.py +++ b/Lib/test/test_urllib2_localnet.py @@ -9,6 +9,7 @@ import hashlib from test import support +from test.support import hashlib_helper try: import ssl @@ -315,6 +316,7 @@ def test_basic_auth_httperror(self): self.assertRaises(urllib.error.HTTPError, urllib.request.urlopen, self.server_url) +@hashlib_helper.requires_hashdigest("md5") class ProxyAuthTests(unittest.TestCase): URL = "http://localhost" @@ -322,7 +324,6 @@ class ProxyAuthTests(unittest.TestCase): PASSWD = "test123" REALM = "TestRealm" - @support.requires_hashdigest("md5") def setUp(self): super(ProxyAuthTests, self).setUp() # Ignore proxy bypass settings in the environment. @@ -448,6 +449,9 @@ class TestUrlopen(unittest.TestCase): def setUp(self): super(TestUrlopen, self).setUp() + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + # Ignore proxies for localhost tests. def restore_environ(old_environ): os.environ.clear() diff --git a/Lib/test/test_urllib2net.py b/Lib/test/test_urllib2net.py index 0f43d71ea67b55078a547db02f9424190f545acf..ba4c500e8ec3ef6cc2274d3fd9b78ff3d30a0ed7 100644 --- a/Lib/test/test_urllib2net.py +++ b/Lib/test/test_urllib2net.py @@ -1,5 +1,6 @@ import unittest from test import support +from test.support import socket_helper from test.test_urllib2 import sanepathname2url import os @@ -10,8 +11,6 @@ support.requires("network") -TIMEOUT = 60 # seconds - def _retry_thrice(func, exc, *args, **kwargs): for i in range(3): @@ -82,10 +81,13 @@ class AuthTests(unittest.TestCase): class CloseSocketTest(unittest.TestCase): def test_close(self): + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + # calling .close() on urllib2's response objects should close the # underlying socket url = support.TEST_HTTP_URL - with support.transient_internet(url): + with socket_helper.transient_internet(url): response = _urlopen_with_retry(url) sock = response.fp self.assertFalse(sock.closed) @@ -158,7 +160,7 @@ def test_file(self): def test_urlwithfrag(self): urlwith_frag = "http://www.pythontest.net/index.html#frag" - with support.transient_internet(urlwith_frag): + with socket_helper.transient_internet(urlwith_frag): req = urllib.request.Request(urlwith_frag) res = urllib.request.urlopen(req) self.assertEqual(res.geturl(), @@ -166,7 +168,7 @@ def test_urlwithfrag(self): def test_redirect_url_withfrag(self): redirect_url_with_frag = "http://www.pythontest.net/redir/with_frag/" - with support.transient_internet(redirect_url_with_frag): + with socket_helper.transient_internet(redirect_url_with_frag): req = urllib.request.Request(redirect_url_with_frag) res = urllib.request.urlopen(req) self.assertEqual(res.geturl(), @@ -174,7 +176,7 @@ def test_redirect_url_withfrag(self): def test_custom_headers(self): url = support.TEST_HTTP_URL - with support.transient_internet(url): + with socket_helper.transient_internet(url): opener = urllib.request.build_opener() request = urllib.request.Request(url) self.assertFalse(request.header_items()) @@ -192,11 +194,11 @@ def test_sites_no_connection_close(self): URL = 'http://www.imdb.com' # mangles Connection:close - with support.transient_internet(URL): + with socket_helper.transient_internet(URL): try: with urllib.request.urlopen(URL) as res: pass - except ValueError as e: + except ValueError: self.fail("urlopen failed for site not sending \ Connection:close") else: @@ -222,9 +224,9 @@ def _test_urls(self, urls, handlers, retry=True): else: req = expected_err = None - with support.transient_internet(url): + with socket_helper.transient_internet(url): try: - f = urlopen(url, req, TIMEOUT) + f = urlopen(url, req, support.INTERNET_TIMEOUT) # urllib.error.URLError is a subclass of OSError except OSError as err: if expected_err: @@ -257,10 +259,14 @@ def _extra_handlers(self): class TimeoutTest(unittest.TestCase): + def setUp(self): + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + def test_http_basic(self): self.assertIsNone(socket.getdefaulttimeout()) url = support.TEST_HTTP_URL - with support.transient_internet(url, timeout=None): + with socket_helper.transient_internet(url, timeout=None): u = _urlopen_with_retry(url) self.addCleanup(u.close) self.assertIsNone(u.fp.raw._sock.gettimeout()) @@ -268,7 +274,7 @@ def test_http_basic(self): def test_http_default_timeout(self): self.assertIsNone(socket.getdefaulttimeout()) url = support.TEST_HTTP_URL - with support.transient_internet(url): + with socket_helper.transient_internet(url): socket.setdefaulttimeout(60) try: u = _urlopen_with_retry(url) @@ -280,7 +286,7 @@ def test_http_default_timeout(self): def test_http_no_timeout(self): self.assertIsNone(socket.getdefaulttimeout()) url = support.TEST_HTTP_URL - with support.transient_internet(url): + with socket_helper.transient_internet(url): socket.setdefaulttimeout(60) try: u = _urlopen_with_retry(url, timeout=None) @@ -291,7 +297,7 @@ def test_http_no_timeout(self): def test_http_timeout(self): url = support.TEST_HTTP_URL - with support.transient_internet(url): + with socket_helper.transient_internet(url): u = _urlopen_with_retry(url, timeout=120) self.addCleanup(u.close) self.assertEqual(u.fp.raw._sock.gettimeout(), 120) @@ -301,7 +307,7 @@ def test_http_timeout(self): @skip_ftp_test_on_travis def test_ftp_basic(self): self.assertIsNone(socket.getdefaulttimeout()) - with support.transient_internet(self.FTP_HOST, timeout=None): + with socket_helper.transient_internet(self.FTP_HOST, timeout=None): u = _urlopen_with_retry(self.FTP_HOST) self.addCleanup(u.close) self.assertIsNone(u.fp.fp.raw._sock.gettimeout()) @@ -309,7 +315,7 @@ def test_ftp_basic(self): @skip_ftp_test_on_travis def test_ftp_default_timeout(self): self.assertIsNone(socket.getdefaulttimeout()) - with support.transient_internet(self.FTP_HOST): + with socket_helper.transient_internet(self.FTP_HOST): socket.setdefaulttimeout(60) try: u = _urlopen_with_retry(self.FTP_HOST) @@ -321,7 +327,7 @@ def test_ftp_default_timeout(self): @skip_ftp_test_on_travis def test_ftp_no_timeout(self): self.assertIsNone(socket.getdefaulttimeout()) - with support.transient_internet(self.FTP_HOST): + with socket_helper.transient_internet(self.FTP_HOST): socket.setdefaulttimeout(60) try: u = _urlopen_with_retry(self.FTP_HOST, timeout=None) @@ -332,7 +338,7 @@ def test_ftp_no_timeout(self): @skip_ftp_test_on_travis def test_ftp_timeout(self): - with support.transient_internet(self.FTP_HOST): + with socket_helper.transient_internet(self.FTP_HOST): u = _urlopen_with_retry(self.FTP_HOST, timeout=60) self.addCleanup(u.close) self.assertEqual(u.fp.fp.raw._sock.gettimeout(), 60) diff --git a/Lib/test/test_urllib_response.py b/Lib/test/test_urllib_response.py index 0eb59426ccb63080b3f292246d1b3b636f9a5930..73d2ef0424f4af86c1c050d3601476f81b15d84a 100644 --- a/Lib/test/test_urllib_response.py +++ b/Lib/test/test_urllib_response.py @@ -42,6 +42,7 @@ def closehook(): def test_addinfo(self): info = urllib.response.addinfo(self.fp, self.test_headers) self.assertEqual(info.info(), self.test_headers) + self.assertEqual(info.headers, self.test_headers) def test_addinfourl(self): url = "http://www.python.org" @@ -51,6 +52,9 @@ def test_addinfourl(self): self.assertEqual(infourl.info(), self.test_headers) self.assertEqual(infourl.geturl(), url) self.assertEqual(infourl.getcode(), code) + self.assertEqual(infourl.headers, self.test_headers) + self.assertEqual(infourl.url, url) + self.assertEqual(infourl.status, code) def tearDown(self): self.sock.close() diff --git a/Lib/test/test_urllibnet.py b/Lib/test/test_urllibnet.py index d394ceddd080e7d4ef696df397b3a5950fa1f644..28680aa6b2405d795cecdd3b2bcf6d6c2764d78f 100644 --- a/Lib/test/test_urllibnet.py +++ b/Lib/test/test_urllibnet.py @@ -1,5 +1,6 @@ import unittest from test import support +from test.support import socket_helper import contextlib import socket @@ -16,17 +17,18 @@ class URLTimeoutTest(unittest.TestCase): # XXX this test doesn't seem to test anything useful. - TIMEOUT = 30.0 - def setUp(self): - socket.setdefaulttimeout(self.TIMEOUT) + socket.setdefaulttimeout(support.INTERNET_TIMEOUT) def tearDown(self): socket.setdefaulttimeout(None) def testURLread(self): + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + domain = urllib.parse.urlparse(support.TEST_HTTP_URL).netloc - with support.transient_internet(domain): + with socket_helper.transient_internet(domain): f = urllib.request.urlopen(support.TEST_HTTP_URL) f.read() @@ -48,10 +50,14 @@ class urlopenNetworkTests(unittest.TestCase): url = 'http://www.pythontest.net/' + def setUp(self): + # clear _opener global variable + self.addCleanup(urllib.request.urlcleanup) + @contextlib.contextmanager def urlopen(self, *args, **kwargs): resource = args[0] - with support.transient_internet(resource): + with socket_helper.transient_internet(resource): r = urllib.request.urlopen(*args, **kwargs) try: yield r @@ -93,7 +99,7 @@ def test_geturl(self): def test_getcode(self): # test getcode() with the fancy opener to get 404 error codes URL = self.url + "XXXinvalidXXX" - with support.transient_internet(URL): + with socket_helper.transient_internet(URL): with self.assertWarns(DeprecationWarning): open_url = urllib.request.FancyURLopener().open(URL) try: @@ -144,10 +150,14 @@ def test_bad_address(self): class urlretrieveNetworkTests(unittest.TestCase): """Tests urllib.request.urlretrieve using the network.""" + def setUp(self): + # remove temporary files created by urlretrieve() + self.addCleanup(urllib.request.urlcleanup) + @contextlib.contextmanager def urlretrieve(self, *args, **kwargs): resource = args[0] - with support.transient_internet(resource): + with socket_helper.transient_internet(resource): file_location, info = urllib.request.urlretrieve(*args, **kwargs) try: yield file_location, info diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index 4ae6ed33858ce225bcf6c9d133e6de08859ec831..3b1c360625b5a63218d75f6bd2cbffaa546d517d 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -32,16 +32,10 @@ (b"&a=b", [(b'a', b'b')]), (b"a=a+b&b=b+c", [(b'a', b'a b'), (b'b', b'b c')]), (b"a=1&a=2", [(b'a', b'1'), (b'a', b'2')]), - (";", []), - (";;", []), - (";a=b", [('a', 'b')]), - ("a=a+b;b=b+c", [('a', 'a b'), ('b', 'b c')]), - ("a=1;a=2", [('a', '1'), ('a', '2')]), - (b";", []), - (b";;", []), - (b";a=b", [(b'a', b'b')]), - (b"a=a+b;b=b+c", [(b'a', b'a b'), (b'b', b'b c')]), - (b"a=1;a=2", [(b'a', b'1'), (b'a', b'2')]), + (";a=b", [(';a', 'b')]), + ("a=a+b;b=b+c", [('a', 'a b;b=b c')]), + (b";a=b", [(b';a', b'b')]), + (b"a=a+b;b=b+c", [(b'a', b'a b;b=b c')]), ] # Each parse_qs testcase is a two-tuple that contains @@ -68,16 +62,10 @@ (b"&a=b", {b'a': [b'b']}), (b"a=a+b&b=b+c", {b'a': [b'a b'], b'b': [b'b c']}), (b"a=1&a=2", {b'a': [b'1', b'2']}), - (";", {}), - (";;", {}), - (";a=b", {'a': ['b']}), - ("a=a+b;b=b+c", {'a': ['a b'], 'b': ['b c']}), - ("a=1;a=2", {'a': ['1', '2']}), - (b";", {}), - (b";;", {}), - (b";a=b", {b'a': [b'b']}), - (b"a=a+b;b=b+c", {b'a': [b'a b'], b'b': [b'b c']}), - (b"a=1;a=2", {b'a': [b'1', b'2']}), + (";a=b", {';a': ['b']}), + ("a=a+b;b=b+c", {'a': ['a b;b=b c']}), + (b";a=b", {b';a': [b'b']}), + (b"a=a+b;b=b+c", {b'a':[ b'a b;b=b c']}), ] class UrlParseTestCase(unittest.TestCase): @@ -709,15 +697,17 @@ def test_withoutscheme(self): def test_portseparator(self): # Issue 754016 makes changes for port separator ':' from scheme separator - self.assertEqual(urllib.parse.urlparse("path:80"), - ('','','path:80','','','')) + self.assertEqual(urllib.parse.urlparse("http:80"), ('http','','80','','','')) + self.assertEqual(urllib.parse.urlparse("https:80"), ('https','','80','','','')) + self.assertEqual(urllib.parse.urlparse("path:80"), ('path','','80','','','')) self.assertEqual(urllib.parse.urlparse("http:"),('http','','','','','')) self.assertEqual(urllib.parse.urlparse("https:"),('https','','','','','')) self.assertEqual(urllib.parse.urlparse("http://www.python.org:80"), ('http','www.python.org:80','','','','')) # As usual, need to check bytes input as well - self.assertEqual(urllib.parse.urlparse(b"path:80"), - (b'',b'',b'path:80',b'',b'',b'')) + self.assertEqual(urllib.parse.urlparse(b"http:80"), (b'http',b'',b'80',b'',b'',b'')) + self.assertEqual(urllib.parse.urlparse(b"https:80"), (b'https',b'',b'80',b'',b'',b'')) + self.assertEqual(urllib.parse.urlparse(b"path:80"), (b'path',b'',b'80',b'',b'',b'')) self.assertEqual(urllib.parse.urlparse(b"http:"),(b'http',b'',b'',b'',b'',b'')) self.assertEqual(urllib.parse.urlparse(b"https:"),(b'https',b'',b'',b'',b'',b'')) self.assertEqual(urllib.parse.urlparse(b"http://www.python.org:80"), @@ -884,10 +874,46 @@ def test_parse_qsl_encoding(self): def test_parse_qsl_max_num_fields(self): with self.assertRaises(ValueError): urllib.parse.parse_qs('&'.join(['a=a']*11), max_num_fields=10) - with self.assertRaises(ValueError): - urllib.parse.parse_qs(';'.join(['a=a']*11), max_num_fields=10) urllib.parse.parse_qs('&'.join(['a=a']*10), max_num_fields=10) + def test_parse_qs_separator(self): + parse_qs_semicolon_cases = [ + (";", {}), + (";;", {}), + (";a=b", {'a': ['b']}), + ("a=a+b;b=b+c", {'a': ['a b'], 'b': ['b c']}), + ("a=1;a=2", {'a': ['1', '2']}), + (b";", {}), + (b";;", {}), + (b";a=b", {b'a': [b'b']}), + (b"a=a+b;b=b+c", {b'a': [b'a b'], b'b': [b'b c']}), + (b"a=1;a=2", {b'a': [b'1', b'2']}), + ] + for orig, expect in parse_qs_semicolon_cases: + with self.subTest(f"Original: {orig!r}, Expected: {expect!r}"): + result = urllib.parse.parse_qs(orig, separator=';') + self.assertEqual(result, expect, "Error parsing %r" % orig) + + + def test_parse_qsl_separator(self): + parse_qsl_semicolon_cases = [ + (";", []), + (";;", []), + (";a=b", [('a', 'b')]), + ("a=a+b;b=b+c", [('a', 'a b'), ('b', 'b c')]), + ("a=1;a=2", [('a', '1'), ('a', '2')]), + (b";", []), + (b";;", []), + (b";a=b", [(b'a', b'b')]), + (b"a=a+b;b=b+c", [(b'a', b'a b'), (b'b', b'b c')]), + (b"a=1;a=2", [(b'a', b'1'), (b'a', b'2')]), + ] + for orig, expect in parse_qsl_semicolon_cases: + with self.subTest(f"Original: {orig!r}, Expected: {expect!r}"): + result = urllib.parse.parse_qsl(orig, separator=';') + self.assertEqual(result, expect, "Error parsing %r" % orig) + + def test_urlencode_sequences(self): # Other tests incidentally urlencode things; test non-covered cases: # Sequence and object values. diff --git a/Lib/test/test_userdict.py b/Lib/test/test_userdict.py index 662c7f641af228bd8706a6c3557151b573440a3c..483910aaa4620efecbd713c4f10f2d57159e1053 100644 --- a/Lib/test/test_userdict.py +++ b/Lib/test/test_userdict.py @@ -30,8 +30,8 @@ def test_all(self): self.assertEqual(collections.UserDict(one=1, two=2), d2) # item sequence constructor self.assertEqual(collections.UserDict([('one',1), ('two',2)]), d2) - with self.assertWarnsRegex(DeprecationWarning, "'dict'"): - self.assertEqual(collections.UserDict(dict=[('one',1), ('two',2)]), d2) + self.assertEqual(collections.UserDict(dict=[('one',1), ('two',2)]), + {'dict': [('one', 1), ('two', 2)]}) # both together self.assertEqual(collections.UserDict([('one',1), ('two',2)], two=3, three=5), d3) @@ -149,9 +149,8 @@ def test_init(self): [('dict', 42)]) self.assertEqual(list(collections.UserDict({}, dict=None).items()), [('dict', None)]) - with self.assertWarnsRegex(DeprecationWarning, "'dict'"): - self.assertEqual(list(collections.UserDict(dict={'a': 42}).items()), - [('a', 42)]) + self.assertEqual(list(collections.UserDict(dict={'a': 42}).items()), + [('dict', {'a': 42})]) self.assertRaises(TypeError, collections.UserDict, 42) self.assertRaises(TypeError, collections.UserDict, (), ()) self.assertRaises(TypeError, collections.UserDict.__init__) diff --git a/Lib/test/test_uu.py b/Lib/test/test_uu.py index c8709f7a0d6660fdfc412a52f33cd0793ab0ac67..4c639b7bd55a69dfc9597f10b7679169c57b1c2c 100644 --- a/Lib/test/test_uu.py +++ b/Lib/test/test_uu.py @@ -174,8 +174,8 @@ def test_decode(self): class UUFileTest(unittest.TestCase): def setUp(self): - self.tmpin = support.TESTFN + "i" - self.tmpout = support.TESTFN + "o" + self.tmpin = support.TESTFN_ASCII + "i" + self.tmpout = support.TESTFN_ASCII + "o" self.addCleanup(support.unlink, self.tmpin) self.addCleanup(support.unlink, self.tmpout) diff --git a/Lib/test/test_uuid.py b/Lib/test/test_uuid.py index 92642d239b92cd6fa98c98fe6bb50477476db918..b1c92427dd270b5ac2bc99a57f8025bb372ebbdb 100644 --- a/Lib/test/test_uuid.py +++ b/Lib/test/test_uuid.py @@ -1,4 +1,4 @@ -import unittest.mock +import unittest from test import support import builtins import contextlib @@ -6,8 +6,6 @@ import io import os import pickle -import shutil -import subprocess import sys import weakref from unittest import mock @@ -15,7 +13,6 @@ py_uuid = support.import_fresh_module('uuid', blocked=['_uuid']) c_uuid = support.import_fresh_module('uuid', fresh=['_uuid']) - def importable(name): try: __import__(name) @@ -24,6 +21,12 @@ def importable(name): return False +def mock_get_command_stdout(data): + def get_command_stdout(command, args): + return io.BytesIO(data.encode()) + return get_command_stdout + + class BaseTestUUID: uuid = None @@ -459,7 +462,7 @@ def test_uuid1_eui64(self): # uuid.getnode to fall back on uuid._random_getnode, which will # generate a valid value. too_large_getter = lambda: 1 << 48 - with unittest.mock.patch.multiple( + with mock.patch.multiple( self.uuid, _node=None, # Ignore any cached node value. _GETTERS=[too_large_getter], @@ -472,7 +475,7 @@ def test_uuid1_eui64(self): # the value from too_large_getter above. try: self.uuid.uuid1(node=node) - except ValueError as e: + except ValueError: self.fail('uuid1 was given an invalid node ID') def test_uuid1(self): @@ -538,8 +541,8 @@ def mock_generate_time_safe(self, safe_value): f = self.uuid._generate_time_safe if f is None: self.skipTest('need uuid._generate_time_safe') - with unittest.mock.patch.object(self.uuid, '_generate_time_safe', - lambda: (f()[0], safe_value)): + with mock.patch.object(self.uuid, '_generate_time_safe', + lambda: (f()[0], safe_value)): yield @unittest.skipUnless(os.name == 'posix', 'POSIX-only test') @@ -652,7 +655,7 @@ def testIssue8621(self): os.close(fds[1]) self.addCleanup(os.close, fds[0]) parent_value = self.uuid.uuid4().hex - os.waitpid(pid, 0) + support.wait_process(pid, exitcode=0) child_value = os.read(fds[0], 100).decode('latin-1') self.assertNotEqual(parent_value, child_value) @@ -674,27 +677,139 @@ class TestUUIDWithExtModule(BaseTestUUID, unittest.TestCase): class BaseTestInternals: _uuid = py_uuid - @unittest.skipUnless(os.name == 'posix', 'requires Posix') - def test_find_mac(self): + def check_parse_mac(self, aix): + if not aix: + patch = mock.patch.multiple(self.uuid, + _MAC_DELIM=b':', + _MAC_OMITS_LEADING_ZEROES=False) + else: + patch = mock.patch.multiple(self.uuid, + _MAC_DELIM=b'.', + _MAC_OMITS_LEADING_ZEROES=True) + + with patch: + # Valid MAC addresses + if not aix: + tests = ( + (b'52:54:00:9d:0e:67', 0x5254009d0e67), + (b'12:34:56:78:90:ab', 0x1234567890ab), + ) + else: + # AIX format + tests = ( + (b'fe.ad.c.1.23.4', 0xfead0c012304), + ) + for mac, expected in tests: + self.assertEqual(self.uuid._parse_mac(mac), expected) + + # Invalid MAC addresses + for mac in ( + b'', + # IPv6 addresses with same length than valid MAC address + # (17 characters) + b'fe80::5054:ff:fe9', + b'123:2:3:4:5:6:7:8', + # empty 5rd field + b'52:54:00:9d::67', + # only 5 fields instead of 6 + b'52:54:00:9d:0e' + # invalid character 'x' + b'52:54:00:9d:0e:6x' + # dash separator + b'52-54-00-9d-0e-67', + ): + if aix: + mac = mac.replace(b':', b'.') + with self.subTest(mac=mac): + self.assertIsNone(self.uuid._parse_mac(mac)) + + def test_parse_mac(self): + self.check_parse_mac(False) + + def test_parse_mac_aix(self): + self.check_parse_mac(True) + + def test_find_under_heading(self): + data = '''\ +Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll +en0 1500 link#2 fe.ad.c.1.23.4 1714807956 0 711348489 0 0 + 01:00:5e:00:00:01 +en0 1500 192.168.129 x071 1714807956 0 711348489 0 0 + 224.0.0.1 +en0 1500 192.168.90 x071 1714807956 0 711348489 0 0 + 224.0.0.1 +''' + + # The above data is from AIX - with '.' as _MAC_DELIM and strings + # shorter than 17 bytes (no leading 0). (_MAC_OMITS_LEADING_ZEROES=True) + with mock.patch.multiple(self.uuid, + _MAC_DELIM=b'.', + _MAC_OMITS_LEADING_ZEROES=True, + _get_command_stdout=mock_get_command_stdout(data)): + mac = self.uuid._find_mac_under_heading( + command='netstat', + args='-ian', + heading=b'Address', + ) + + self.assertEqual(mac, 0xfead0c012304) + + def test_find_under_heading_ipv6(self): + # bpo-39991: IPv6 address "fe80::5054:ff:fe9" looks like a MAC address + # (same string length) but must be skipped + data = '''\ +Name Mtu Network Address Ipkts Ierrs Idrop Opkts Oerrs Coll +vtnet 1500 52:54:00:9d:0e:67 10017 0 0 8174 0 0 +vtnet - fe80::%vtnet0 fe80::5054:ff:fe9 0 - - 4 - - +vtnet - 192.168.122.0 192.168.122.45 8844 - - 8171 - - +lo0 16384 lo0 260148 0 0 260148 0 0 +lo0 - ::1/128 ::1 193 - - 193 - - + ff01::1%lo0 + ff02::2:2eb7:74fa + ff02::2:ff2e:b774 + ff02::1%lo0 + ff02::1:ff00:1%lo +lo0 - fe80::%lo0/64 fe80::1%lo0 0 - - 0 - - + ff01::1%lo0 + ff02::2:2eb7:74fa + ff02::2:ff2e:b774 + ff02::1%lo0 + ff02::1:ff00:1%lo +lo0 - 127.0.0.0/8 127.0.0.1 259955 - - 259955 - - + 224.0.0.1 +''' + + with mock.patch.multiple(self.uuid, + _MAC_DELIM=b':', + _MAC_OMITS_LEADING_ZEROES=False, + _get_command_stdout=mock_get_command_stdout(data)): + mac = self.uuid._find_mac_under_heading( + command='netstat', + args='-ian', + heading=b'Address', + ) + + self.assertEqual(mac, 0x5254009d0e67) + + def test_find_mac_near_keyword(self): + # key and value are on the same line data = ''' -fake hwaddr +fake Link encap:UNSPEC hwaddr 00-00 cscotun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 eth0 Link encap:Ethernet HWaddr 12:34:56:78:90:ab ''' - popen = unittest.mock.MagicMock() - popen.stdout = io.BytesIO(data.encode()) - - with unittest.mock.patch.object(shutil, 'which', - return_value='/sbin/ifconfig'): - with unittest.mock.patch.object(subprocess, 'Popen', - return_value=popen): - mac = self.uuid._find_mac( - command='ifconfig', - args='', - hw_identifiers=[b'hwaddr'], - get_index=lambda x: x + 1, - ) + # The above data will only be parsed properly on non-AIX unixes. + with mock.patch.multiple(self.uuid, + _MAC_DELIM=b':', + _MAC_OMITS_LEADING_ZEROES=False, + _get_command_stdout=mock_get_command_stdout(data)): + mac = self.uuid._find_mac_near_keyword( + command='ifconfig', + args='', + keywords=[b'hwaddr'], + get_word_index=lambda x: x + 1, + ) self.assertEqual(mac, 0x1234567890ab) @@ -737,17 +852,6 @@ def test_netstat_getnode(self): node = self.uuid._netstat_getnode() self.check_node(node, 'netstat') - @unittest.skipUnless(os.name == 'nt', 'requires Windows') - def test_ipconfig_getnode(self): - node = self.uuid._ipconfig_getnode() - self.check_node(node, 'ipconfig') - - @unittest.skipUnless(importable('win32wnet'), 'requires win32wnet') - @unittest.skipUnless(importable('netbios'), 'requires netbios') - def test_netbios_getnode(self): - node = self.uuid._netbios_getnode() - self.check_node(node) - def test_random_getnode(self): node = self.uuid._random_getnode() # The multicast bit, i.e. the least significant bit of first octet, @@ -759,6 +863,13 @@ def test_random_getnode(self): node2 = self.uuid._random_getnode() self.assertNotEqual(node2, node, '%012x' % node) +class TestInternalsWithoutExtModule(BaseTestInternals, unittest.TestCase): + uuid = py_uuid + +@unittest.skipUnless(c_uuid, 'requires the C _uuid module') +class TestInternalsWithExtModule(BaseTestInternals, unittest.TestCase): + uuid = c_uuid + @unittest.skipUnless(os.name == 'posix', 'requires Posix') def test_unix_getnode(self): if not importable('_uuid') and not importable('ctypes'): @@ -770,19 +881,10 @@ def test_unix_getnode(self): self.check_node(node, 'unix') @unittest.skipUnless(os.name == 'nt', 'requires Windows') - @unittest.skipUnless(importable('ctypes'), 'requires ctypes') def test_windll_getnode(self): node = self.uuid._windll_getnode() self.check_node(node) -class TestInternalsWithoutExtModule(BaseTestInternals, unittest.TestCase): - uuid = py_uuid - -@unittest.skipUnless(c_uuid, 'requires the C _uuid module') -class TestInternalsWithExtModule(BaseTestInternals, unittest.TestCase): - uuid = c_uuid - - if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 28743f03ae2036d4d8109206ae53ed6dfed72ca4..ca003d55d7c8904257d7fd795354acca2da98376 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -18,9 +18,9 @@ can_symlink, EnvironmentVarGuard, rmtree, import_module, skip_if_broken_multiprocessing_synchronize) -import threading import unittest import venv +from unittest.mock import patch try: import ctypes @@ -80,8 +80,8 @@ def run_with_capture(self, func, *args, **kwargs): def get_env_file(self, *args): return os.path.join(self.env_dir, *args) - def get_text_file_contents(self, *args): - with open(self.get_env_file(*args), 'r') as f: + def get_text_file_contents(self, *args, encoding='utf-8'): + with open(self.get_env_file(*args), 'r', encoding=encoding) as f: result = f.read() return result @@ -139,6 +139,39 @@ def test_prompt(self): self.assertEqual(context.prompt, '(My prompt) ') self.assertIn("prompt = 'My prompt'\n", data) + rmtree(self.env_dir) + builder = venv.EnvBuilder(prompt='.') + cwd = os.path.basename(os.getcwd()) + self.run_with_capture(builder.create, self.env_dir) + context = builder.ensure_directories(self.env_dir) + data = self.get_text_file_contents('pyvenv.cfg') + self.assertEqual(context.prompt, '(%s) ' % cwd) + self.assertIn("prompt = '%s'\n" % cwd, data) + + def test_upgrade_dependencies(self): + builder = venv.EnvBuilder() + bin_path = 'Scripts' if sys.platform == 'win32' else 'bin' + python_exe = 'python.exe' if sys.platform == 'win32' else 'python' + with tempfile.TemporaryDirectory() as fake_env_dir: + + def pip_cmd_checker(cmd): + self.assertEqual( + cmd, + [ + os.path.join(fake_env_dir, bin_path, python_exe), + '-m', + 'pip', + 'install', + '--upgrade', + 'pip', + 'setuptools' + ] + ) + + fake_context = builder.ensure_directories(fake_env_dir) + with patch('venv.subprocess.check_call', pip_cmd_checker): + builder.upgrade_dependencies(fake_context) + @requireVenvCreate def test_prefixes(self): """ @@ -499,7 +532,7 @@ def do_test_with_pip(self, system_site_packages): # Issue #26610: pip/pep425tags.py requires ctypes @unittest.skipUnless(ctypes, 'pip requires ctypes') - @requires_zlib + @requires_zlib() def test_with_pip(self): self.do_test_with_pip(False) self.do_test_with_pip(True) diff --git a/Lib/test/test_wait3.py b/Lib/test/test_wait3.py index eb51b2c03b232d32037302bc7ba47829b30115ed..aa166baa400bc7c82fccd7d9127cf0b58ff6bba7 100644 --- a/Lib/test/test_wait3.py +++ b/Lib/test/test_wait3.py @@ -2,10 +2,12 @@ """ import os +import subprocess +import sys import time import unittest from test.fork_wait import ForkWait -from test.support import reap_children +from test import support if not hasattr(os, 'fork'): raise unittest.SkipTest("os.fork not defined") @@ -14,11 +16,11 @@ raise unittest.SkipTest("os.wait3 not defined") class Wait3Test(ForkWait): - def wait_impl(self, cpid): + def wait_impl(self, cpid, *, exitcode): # This many iterations can be required, since some previously run # tests (e.g. test_ctypes) could have spawned a lot of children # very quickly. - deadline = time.monotonic() + 10.0 + deadline = time.monotonic() + support.SHORT_TIMEOUT while time.monotonic() <= deadline: # wait3() shouldn't hang, but some of the buildbots seem to hang # in the forking tests. This is an attempt to fix the problem. @@ -28,11 +30,27 @@ def wait_impl(self, cpid): time.sleep(0.1) self.assertEqual(spid, cpid) - self.assertEqual(status, 0, "cause = %d, exit = %d" % (status&0xff, status>>8)) + self.assertEqual(os.waitstatus_to_exitcode(status), exitcode) self.assertTrue(rusage) + def test_wait3_rusage_initialized(self): + # Ensure a successful wait3() call where no child was ready to report + # its exit status does not return uninitialized memory in the rusage + # structure. See bpo-36279. + args = [sys.executable, '-c', 'import sys; sys.stdin.read()'] + proc = subprocess.Popen(args, stdin=subprocess.PIPE) + try: + pid, status, rusage = os.wait3(os.WNOHANG) + self.assertEqual(0, pid) + self.assertEqual(0, status) + self.assertEqual(0, sum(rusage)) + finally: + proc.stdin.close() + proc.wait() + + def tearDownModule(): - reap_children() + support.reap_children() if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_wait4.py b/Lib/test/test_wait4.py index 3e6a79df463cb47669fcc492eef8c9e49a0dca5d..f8d5e13014f0c13b050b540f63ee34f0b79df7b3 100644 --- a/Lib/test/test_wait4.py +++ b/Lib/test/test_wait4.py @@ -6,21 +6,21 @@ import sys import unittest from test.fork_wait import ForkWait -from test.support import reap_children, get_attribute +from test import support # If either of these do not exist, skip this test. -get_attribute(os, 'fork') -get_attribute(os, 'wait4') +support.get_attribute(os, 'fork') +support.get_attribute(os, 'wait4') class Wait4Test(ForkWait): - def wait_impl(self, cpid): + def wait_impl(self, cpid, *, exitcode): option = os.WNOHANG if sys.platform.startswith('aix'): # Issue #11185: wait4 is broken on AIX and will always return 0 # with WNOHANG. option = 0 - deadline = time.monotonic() + 10.0 + deadline = time.monotonic() + support.SHORT_TIMEOUT while time.monotonic() <= deadline: # wait4() shouldn't hang, but some of the buildbots seem to hang # in the forking tests. This is an attempt to fix the problem. @@ -29,11 +29,11 @@ def wait_impl(self, cpid): break time.sleep(0.1) self.assertEqual(spid, cpid) - self.assertEqual(status, 0, "cause = %d, exit = %d" % (status&0xff, status>>8)) + self.assertEqual(os.waitstatus_to_exitcode(status), exitcode) self.assertTrue(rusage) def tearDownModule(): - reap_children() + support.reap_children() if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py index 7b0d06b3201970fea42b2c62572dbce2a386e1ea..dcc0ea89b5a85cdb56a50fa5876a9b3f55003518 100644 --- a/Lib/test/test_warnings/__init__.py +++ b/Lib/test/test_warnings/__init__.py @@ -940,8 +940,8 @@ def func(): """)) def run(*args): - res = assert_python_ok(*args) - stderr = res.err.decode('ascii', 'replace') + res = assert_python_ok(*args, PYTHONIOENCODING='utf-8') + stderr = res.err.decode('utf-8', 'replace') stderr = '\n'.join(stderr.splitlines()) # normalize newlines @@ -949,27 +949,26 @@ def run(*args): return stderr # tracemalloc disabled + filename = os.path.abspath(support.TESTFN) stderr = run('-Wd', support.TESTFN) - expected = textwrap.dedent(''' - {fname}:5: ResourceWarning: unclosed file <...> + expected = textwrap.dedent(f''' + {filename}:5: ResourceWarning: unclosed file <...> f = None ResourceWarning: Enable tracemalloc to get the object allocation traceback - ''') - expected = expected.format(fname=support.TESTFN).strip() + ''').strip() self.assertEqual(stderr, expected) # tracemalloc enabled stderr = run('-Wd', '-X', 'tracemalloc=2', support.TESTFN) - expected = textwrap.dedent(''' - {fname}:5: ResourceWarning: unclosed file <...> + expected = textwrap.dedent(f''' + {filename}:5: ResourceWarning: unclosed file <...> f = None Object allocated at (most recent call last): - File "{fname}", lineno 7 + File "{filename}", lineno 7 func() - File "{fname}", lineno 3 + File "{filename}", lineno 3 f = open(__file__) - ''') - expected = expected.format(fname=support.TESTFN).strip() + ''').strip() self.assertEqual(stderr, expected) @@ -1199,7 +1198,7 @@ def test_default_filter_configuration(self): @unittest.skipUnless(sys.getfilesystemencoding() != 'ascii', 'requires non-ascii filesystemencoding') def test_nonascii(self): - PYTHONWARNINGS="ignore:DeprecationWarning" + (support.FS_NONASCII or '') + PYTHONWARNINGS="ignore:DeprecationWarning" + support.FS_NONASCII rc, stdout, stderr = assert_python_ok("-c", "import sys; sys.stdout.write(str(sys.warnoptions))", PYTHONIOENCODING="utf-8", @@ -1228,7 +1227,6 @@ def test_issue_8766(self): class FinalizationTest(unittest.TestCase): - @support.requires_type_collecting def test_finalization(self): # Issue #19421: warnings.warn() should not crash # during Python finalization @@ -1243,7 +1241,8 @@ def __del__(self): a=A() """ rc, out, err = assert_python_ok("-c", code) - self.assertEqual(err.decode(), ':7: UserWarning: test') + self.assertEqual(err.decode().rstrip(), + ':7: UserWarning: test') def test_late_resource_warning(self): # Issue #21925: Emitting a ResourceWarning late during the Python diff --git a/Lib/test/test_wave.py b/Lib/test/test_wave.py index 8a42f8e4710569684696b567008fa3445f805ea6..eb231cb19c6d0a841a071e7d99298c41b7ccb384 100644 --- a/Lib/test/test_wave.py +++ b/Lib/test/test_wave.py @@ -105,9 +105,7 @@ class WavePCM32Test(WaveTest, unittest.TestCase): frames = byteswap(frames, 4) -class MiscTestCase(audiotests.AudioMiscTests, unittest.TestCase): - module = wave - +class MiscTestCase(unittest.TestCase): def test__all__(self): blacklist = {'WAVE_FORMAT_PCM'} support.check__all__(self, wave, blacklist=blacklist) diff --git a/Lib/test/test_weakref.py b/Lib/test/test_weakref.py index 2dbf3f452c10e60470b5bca0aaf5e90ae7789bdf..56a42f055d0b5491337652a2825a93458549b893 100644 --- a/Lib/test/test_weakref.py +++ b/Lib/test/test_weakref.py @@ -11,7 +11,7 @@ import random from test import support -from test.support import script_helper +from test.support import script_helper, ALWAYS_EQ # Used in ReferencesTestCase.test_ref_created_during_del() . ref_from_del = None @@ -411,6 +411,26 @@ def __iter__(self): # can be killed in the middle of the call "blech" in p + def test_proxy_reversed(self): + class MyObj: + def __len__(self): + return 3 + def __reversed__(self): + return iter('cba') + + obj = MyObj() + self.assertEqual("".join(reversed(weakref.proxy(obj))), "cba") + + def test_proxy_hash(self): + cool_hash = 299_792_458 + + class MyObj: + def __hash__(self): + return cool_hash + + obj = MyObj() + self.assertEqual(hash(weakref.proxy(obj)), cool_hash) + def test_getweakrefcount(self): o = C() ref1 = weakref.ref(o) @@ -649,7 +669,6 @@ class D: del c1, c2, C, D gc.collect() - @support.requires_type_collecting def test_callback_in_cycle_resurrection(self): import gc @@ -814,6 +833,10 @@ def test_equality(self): self.assertTrue(a != c) self.assertTrue(a == d) self.assertFalse(a != d) + self.assertFalse(a == x) + self.assertTrue(a != x) + self.assertTrue(a == ALWAYS_EQ) + self.assertFalse(a != ALWAYS_EQ) del x, y, z gc.collect() for r in a, b, c: @@ -1122,6 +1145,9 @@ def _ne(a, b): _ne(a, f) _ne(b, e) _ne(b, f) + # Compare with different types + _ne(a, x.some_method) + _eq(a, ALWAYS_EQ) del x, y, z gc.collect() # Dead WeakMethods compare by identity @@ -1603,6 +1629,43 @@ def test_weak_valued_dict_update(self): self.assertEqual(list(d.keys()), [kw]) self.assertEqual(d[kw], o) + def test_weak_valued_union_operators(self): + a = C() + b = C() + c = C() + wvd1 = weakref.WeakValueDictionary({1: a}) + wvd2 = weakref.WeakValueDictionary({1: b, 2: a}) + wvd3 = wvd1.copy() + d1 = {1: c, 3: b} + pairs = [(5, c), (6, b)] + + tmp1 = wvd1 | wvd2 # Between two WeakValueDictionaries + self.assertEqual(dict(tmp1), dict(wvd1) | dict(wvd2)) + self.assertIs(type(tmp1), weakref.WeakValueDictionary) + wvd1 |= wvd2 + self.assertEqual(wvd1, tmp1) + + tmp2 = wvd2 | d1 # Between WeakValueDictionary and mapping + self.assertEqual(dict(tmp2), dict(wvd2) | d1) + self.assertIs(type(tmp2), weakref.WeakValueDictionary) + wvd2 |= d1 + self.assertEqual(wvd2, tmp2) + + tmp3 = wvd3.copy() # Between WeakValueDictionary and iterable key, value + tmp3 |= pairs + self.assertEqual(dict(tmp3), dict(wvd3) | dict(pairs)) + self.assertIs(type(tmp3), weakref.WeakValueDictionary) + + tmp4 = d1 | wvd3 # Testing .__ror__ + self.assertEqual(dict(tmp4), d1 | dict(wvd3)) + self.assertIs(type(tmp4), weakref.WeakValueDictionary) + + del a + self.assertNotIn(2, tmp1) + self.assertNotIn(2, tmp2) + self.assertNotIn(1, tmp3) + self.assertNotIn(1, tmp4) + def test_weak_keyed_dict_update(self): self.check_update(weakref.WeakKeyDictionary, {C(): 1, C(): 2, C(): 3}) @@ -1618,6 +1681,43 @@ def test_weak_keyed_delitem(self): self.assertEqual(len(d), 1) self.assertEqual(list(d.keys()), [o2]) + def test_weak_keyed_union_operators(self): + o1 = C() + o2 = C() + o3 = C() + wkd1 = weakref.WeakKeyDictionary({o1: 1, o2: 2}) + wkd2 = weakref.WeakKeyDictionary({o3: 3, o1: 4}) + wkd3 = wkd1.copy() + d1 = {o2: '5', o3: '6'} + pairs = [(o2, 7), (o3, 8)] + + tmp1 = wkd1 | wkd2 # Between two WeakKeyDictionaries + self.assertEqual(dict(tmp1), dict(wkd1) | dict(wkd2)) + self.assertIs(type(tmp1), weakref.WeakKeyDictionary) + wkd1 |= wkd2 + self.assertEqual(wkd1, tmp1) + + tmp2 = wkd2 | d1 # Between WeakKeyDictionary and mapping + self.assertEqual(dict(tmp2), dict(wkd2) | d1) + self.assertIs(type(tmp2), weakref.WeakKeyDictionary) + wkd2 |= d1 + self.assertEqual(wkd2, tmp2) + + tmp3 = wkd3.copy() # Between WeakKeyDictionary and iterable key, value + tmp3 |= pairs + self.assertEqual(dict(tmp3), dict(wkd3) | dict(pairs)) + self.assertIs(type(tmp3), weakref.WeakKeyDictionary) + + tmp4 = d1 | wkd3 # Testing .__ror__ + self.assertEqual(dict(tmp4), d1 | dict(wkd3)) + self.assertIs(type(tmp4), weakref.WeakKeyDictionary) + + del o1 + self.assertNotIn(4, tmp1.values()) + self.assertNotIn(4, tmp2.values()) + self.assertNotIn(1, tmp3.values()) + self.assertNotIn(1, tmp4.values()) + def test_weak_valued_delitem(self): d = weakref.WeakValueDictionary() o1 = Object('1') @@ -1891,20 +1991,10 @@ def fin(*args, **kwargs): f() self.assertEqual(res, [((1, 2), {'func': 3, 'obj': 4})]) - res = [] - with self.assertWarns(DeprecationWarning): - f = weakref.finalize(a, func=fin, arg=1) - self.assertEqual(f.peek(), (a, fin, (), {'arg': 1})) - f() - self.assertEqual(res, [((), {'arg': 1})]) - - res = [] - with self.assertWarns(DeprecationWarning): - f = weakref.finalize(obj=a, func=fin, arg=1) - self.assertEqual(f.peek(), (a, fin, (), {'arg': 1})) - f() - self.assertEqual(res, [((), {'arg': 1})]) - + with self.assertRaises(TypeError): + weakref.finalize(a, func=fin, arg=1) + with self.assertRaises(TypeError): + weakref.finalize(obj=a, func=fin, arg=1) self.assertRaises(TypeError, weakref.finalize, a) self.assertRaises(TypeError, weakref.finalize) diff --git a/Lib/test/test_weakset.py b/Lib/test/test_weakset.py index 569facdd30c11c716aa50067dbcec299fa3c258d..49a9b5c3c658a89afb1dc490ea61c147d197ccbc 100644 --- a/Lib/test/test_weakset.py +++ b/Lib/test/test_weakset.py @@ -2,6 +2,7 @@ from weakref import WeakSet import string from collections import UserString as ustr +from collections.abc import Set, MutableSet import gc import contextlib @@ -437,6 +438,10 @@ def test_len_race(self): def test_repr(self): assert repr(self.s) == repr(self.s.data) + def test_abc(self): + self.assertIsInstance(self.s, Set) + self.assertIsInstance(self.s, MutableSet) + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_winconsoleio.py b/Lib/test/test_winconsoleio.py index 9a61e48881d903ca0cf98bad049cc86b9c86674b..a44f7bbd27b700917699f25062f40dd082a80e1d 100644 --- a/Lib/test/test_winconsoleio.py +++ b/Lib/test/test_winconsoleio.py @@ -144,6 +144,10 @@ def test_input(self): self.assertStdinRoundTrip('ϼўТλФЙ') # Combining characters self.assertStdinRoundTrip('A͏B ﬖ̳AA̝') + + # bpo-38325 + @unittest.skipIf(True, "Handling Non-BMP characters is broken") + def test_input_nonbmp(self): # Non-BMP self.assertStdinRoundTrip('\U00100000\U0010ffff\U0010fffd') @@ -163,6 +167,8 @@ def test_partial_reads(self): self.assertEqual(actual, expected, 'stdin.read({})'.format(read_count)) + # bpo-38325 + @unittest.skipIf(True, "Handling Non-BMP characters is broken") def test_partial_surrogate_reads(self): # Test that reading less than 1 full character works when stdin # contains surrogate pairs that cannot be decoded to UTF-8 without diff --git a/Lib/test/test_with.py b/Lib/test/test_with.py index b1d7a15b5e4ee3ae9083d846fcbb57c6d1e9e999..f21bf65fed8499d52b523b2814ba4744bdbf924d 100644 --- a/Lib/test/test_with.py +++ b/Lib/test/test_with.py @@ -7,7 +7,7 @@ import sys import unittest from collections import deque -from contextlib import _GeneratorContextManager, contextmanager +from contextlib import _GeneratorContextManager, contextmanager, nullcontext class MockContextManager(_GeneratorContextManager): @@ -641,6 +641,12 @@ class B: pass self.assertEqual(blah.two, 2) self.assertEqual(blah.three, 3) + def testWithExtendedTargets(self): + with nullcontext(range(1, 5)) as (a, *b, c): + self.assertEqual(a, 1) + self.assertEqual(b, [2, 3]) + self.assertEqual(c, 4) + class ExitSwallowsExceptionTestCase(unittest.TestCase): diff --git a/Lib/test/test_wsgiref.py b/Lib/test/test_wsgiref.py index 6af45145a79279b96dc5debf2ebdbd11fcf44041..4bf5d39e619f647c3c66d84fb72b0e3ba4608fb6 100644 --- a/Lib/test/test_wsgiref.py +++ b/Lib/test/test_wsgiref.py @@ -1,5 +1,6 @@ from unittest import mock from test import support +from test.support import socket_helper from test.test_httpservers import NoLogRequestHandler from unittest import TestCase from wsgiref.util import setup_testing_defaults @@ -263,7 +264,7 @@ def app(environ, start_response): class WsgiHandler(NoLogRequestHandler, WSGIRequestHandler): pass - server = make_server(support.HOST, 0, app, handler_class=WsgiHandler) + server = make_server(socket_helper.HOST, 0, app, handler_class=WsgiHandler) self.addCleanup(server.server_close) interrupted = threading.Event() diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index b2492cda848f9e0ead7261938cbbf90c949d048a..5632b8b503cf3f9d92c80223da0362ff431a466a 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -242,7 +242,6 @@ def check_method(method): check_method(element.extend) check_method(element.insert) check_method(element.remove) - check_method(element.getchildren) check_method(element.find) check_method(element.iterfind) check_method(element.findall) @@ -254,7 +253,6 @@ def check_method(method): check_method(element.items) check_method(element.iter) check_method(element.itertext) - check_method(element.getiterator) # These methods return an iterable. See bug 6472. @@ -432,13 +430,14 @@ def test_attrib(self): self.assertEqual(ET.tostring(elem), b'aa') + # Test preserving white space chars in attributes elem = ET.Element('test') elem.set('a', '\r') elem.set('b', '\r\n') elem.set('c', '\t\n\r ') - elem.set('d', '\n\n') + elem.set('d', '\n\n\r\r\t\t ') self.assertEqual(ET.tostring(elem), - b'') + b'') def test_makeelement(self): # Test makeelement handling. @@ -741,24 +740,20 @@ def end_ns(self, prefix): ('end-ns', ''), ]) - # Element.getchildren() and ElementTree.getiterator() are deprecated. - @checkwarnings(("This method will be removed in future versions. " - "Use .+ instead.", - DeprecationWarning)) - def test_getchildren(self): - # Test Element.getchildren() + def test_children(self): + # Test Element children iteration with open(SIMPLE_XMLFILE, "rb") as f: tree = ET.parse(f) - self.assertEqual([summarize_list(elem.getchildren()) + self.assertEqual([summarize_list(elem) for elem in tree.getroot().iter()], [ ['element', 'element', 'empty-element'], [], [], [], ]) - self.assertEqual([summarize_list(elem.getchildren()) - for elem in tree.getiterator()], [ + self.assertEqual([summarize_list(elem) + for elem in tree.iter()], [ ['element', 'element', 'empty-element'], [], [], @@ -766,13 +761,13 @@ def test_getchildren(self): ]) elem = ET.XML(SAMPLE_XML) - self.assertEqual(len(elem.getchildren()), 3) - self.assertEqual(len(elem[2].getchildren()), 1) - self.assertEqual(elem[:], elem.getchildren()) + self.assertEqual(len(list(elem)), 3) + self.assertEqual(len(list(elem[2])), 1) + self.assertEqual(elem[:], list(elem)) child1 = elem[0] child2 = elem[2] del elem[1:2] - self.assertEqual(len(elem.getchildren()), 2) + self.assertEqual(len(list(elem)), 2) self.assertEqual(child1, elem[0]) self.assertEqual(child2, elem[1]) elem[0:2] = [child2, child1] @@ -780,7 +775,7 @@ def test_getchildren(self): self.assertEqual(child1, elem[1]) self.assertNotEqual(child1, elem[0]) elem.clear() - self.assertEqual(elem.getchildren(), []) + self.assertEqual(list(elem), []) def test_writestring(self): elem = ET.XML("text") @@ -788,6 +783,123 @@ def test_writestring(self): elem = ET.fromstring("text") self.assertEqual(ET.tostring(elem), b'text') + def test_indent(self): + elem = ET.XML("") + ET.indent(elem) + self.assertEqual(ET.tostring(elem), b'') + + elem = ET.XML("text") + ET.indent(elem) + self.assertEqual(ET.tostring(elem), b'\n text\n') + + elem = ET.XML(" text ") + ET.indent(elem) + self.assertEqual(ET.tostring(elem), b'\n text\n') + + elem = ET.XML("texttail") + ET.indent(elem) + self.assertEqual(ET.tostring(elem), b'\n texttail') + + elem = ET.XML("

    par

    \n

    text

    \t


    ") + ET.indent(elem) + self.assertEqual( + ET.tostring(elem), + b'\n' + b' \n' + b'

    par

    \n' + b'

    text

    \n' + b'

    \n' + b'
    \n' + b'

    \n' + b' \n' + b'' + ) + + elem = ET.XML("

    pre
    post

    text

    ") + ET.indent(elem) + self.assertEqual( + ET.tostring(elem), + b'\n' + b' \n' + b'

    pre
    post

    \n' + b'

    text

    \n' + b' \n' + b'' + ) + + def test_indent_space(self): + elem = ET.XML("

    pre
    post

    text

    ") + ET.indent(elem, space='\t') + self.assertEqual( + ET.tostring(elem), + b'\n' + b'\t\n' + b'\t\t

    pre
    post

    \n' + b'\t\t

    text

    \n' + b'\t\n' + b'' + ) + + elem = ET.XML("

    pre
    post

    text

    ") + ET.indent(elem, space='') + self.assertEqual( + ET.tostring(elem), + b'\n' + b'\n' + b'

    pre
    post

    \n' + b'

    text

    \n' + b'\n' + b'' + ) + + def test_indent_space_caching(self): + elem = ET.XML("

    par

    text


    ") + ET.indent(elem) + self.assertEqual( + {el.tail for el in elem.iter()}, + {None, "\n", "\n ", "\n "} + ) + self.assertEqual( + {el.text for el in elem.iter()}, + {None, "\n ", "\n ", "\n ", "par", "text"} + ) + self.assertEqual( + len({el.tail for el in elem.iter()}), + len({id(el.tail) for el in elem.iter()}), + ) + + def test_indent_level(self): + elem = ET.XML("

    pre
    post

    text

    ") + with self.assertRaises(ValueError): + ET.indent(elem, level=-1) + self.assertEqual( + ET.tostring(elem), + b"

    pre
    post

    text

    " + ) + + ET.indent(elem, level=2) + self.assertEqual( + ET.tostring(elem), + b'\n' + b' \n' + b'

    pre
    post

    \n' + b'

    text

    \n' + b' \n' + b' ' + ) + + elem = ET.XML("

    pre
    post

    text

    ") + ET.indent(elem, level=1, space=' ') + self.assertEqual( + ET.tostring(elem), + b'\n' + b' \n' + b'

    pre
    post

    \n' + b'

    text

    \n' + b' \n' + b' ' + ) + def test_tostring_default_namespace(self): elem = ET.XML('') self.assertEqual( @@ -1557,6 +1669,17 @@ def test_unknown_event(self): """.format(html.escape(SIMPLE_XMLFILE, True)) +XINCLUDE["include_c1_repeated.xml"] = """\ + + +

    The following is the source code of Recursive1.xml:

    + + + + +
    +""" + # # badly formatted xi:include tags @@ -1577,6 +1700,31 @@ def test_unknown_event(self): """ +XINCLUDE["Recursive1.xml"] = """\ + + +

    The following is the source code of Recursive2.xml:

    + +
    +""" + +XINCLUDE["Recursive2.xml"] = """\ + + +

    The following is the source code of Recursive3.xml:

    + +
    +""" + +XINCLUDE["Recursive3.xml"] = """\ + + +

    The following is the source code of Recursive1.xml:

    + +
    +""" + + class XIncludeTest(unittest.TestCase): def xinclude_loader(self, href, parse="xml", encoding=None): @@ -1678,6 +1826,13 @@ def test_xinclude(self): ' \n' '') # C5 + def test_xinclude_repeated(self): + from xml.etree import ElementInclude + + document = self.xinclude_loader("include_c1_repeated.xml") + ElementInclude.include(document, self.xinclude_loader) + self.assertEqual(1+4*2, len(document.findall(".//p"))) + def test_xinclude_failures(self): from xml.etree import ElementInclude @@ -1710,6 +1865,45 @@ def test_xinclude_failures(self): "xi:fallback tag must be child of xi:include " "('{http://www.w3.org/2001/XInclude}fallback')") + # Test infinitely recursive includes. + document = self.xinclude_loader("Recursive1.xml") + with self.assertRaises(ElementInclude.FatalIncludeError) as cm: + ElementInclude.include(document, self.xinclude_loader) + self.assertEqual(str(cm.exception), + "recursive include of Recursive2.xml") + + # Test 'max_depth' limitation. + document = self.xinclude_loader("Recursive1.xml") + with self.assertRaises(ElementInclude.FatalIncludeError) as cm: + ElementInclude.include(document, self.xinclude_loader, max_depth=None) + self.assertEqual(str(cm.exception), + "recursive include of Recursive2.xml") + + document = self.xinclude_loader("Recursive1.xml") + with self.assertRaises(ElementInclude.LimitedRecursiveIncludeError) as cm: + ElementInclude.include(document, self.xinclude_loader, max_depth=0) + self.assertEqual(str(cm.exception), + "maximum xinclude depth reached when including file Recursive2.xml") + + document = self.xinclude_loader("Recursive1.xml") + with self.assertRaises(ElementInclude.LimitedRecursiveIncludeError) as cm: + ElementInclude.include(document, self.xinclude_loader, max_depth=1) + self.assertEqual(str(cm.exception), + "maximum xinclude depth reached when including file Recursive3.xml") + + document = self.xinclude_loader("Recursive1.xml") + with self.assertRaises(ElementInclude.LimitedRecursiveIncludeError) as cm: + ElementInclude.include(document, self.xinclude_loader, max_depth=2) + self.assertEqual(str(cm.exception), + "maximum xinclude depth reached when including file Recursive1.xml") + + document = self.xinclude_loader("Recursive1.xml") + with self.assertRaises(ElementInclude.FatalIncludeError) as cm: + ElementInclude.include(document, self.xinclude_loader, max_depth=3) + self.assertEqual(str(cm.exception), + "recursive include of Recursive2.xml") + + # -------------------------------------------------------------------- # reported bugs @@ -2066,6 +2260,10 @@ def test_expat224_utf8_bug_file(self): text = text[6:-4] self.assertEqual(root.get('b'), text) + def test_39495_treebuilder_start(self): + self.assertRaises(TypeError, ET.TreeBuilder().start, "tag") + self.assertRaises(TypeError, ET.TreeBuilder().start, "tag", None) + # -------------------------------------------------------------------- @@ -2100,6 +2298,35 @@ def test___init__(self): self.assertIsNot(element_foo.attrib, attrib) self.assertNotEqual(element_foo.attrib, attrib) + def test_copy(self): + # Only run this test if Element.copy() is defined. + if "copy" not in dir(ET.Element): + raise unittest.SkipTest("Element.copy() not present") + + element_foo = ET.Element("foo", { "zix": "wyp" }) + element_foo.append(ET.Element("bar", { "baz": "qix" })) + + with self.assertWarns(DeprecationWarning): + element_foo2 = element_foo.copy() + + # elements are not the same + self.assertIsNot(element_foo2, element_foo) + + # string attributes are equal + self.assertEqual(element_foo2.tag, element_foo.tag) + self.assertEqual(element_foo2.text, element_foo.text) + self.assertEqual(element_foo2.tail, element_foo.tail) + + # number of children is the same + self.assertEqual(len(element_foo2), len(element_foo)) + + # children are the same + for (child1, child2) in itertools.zip_longest(element_foo, element_foo2): + self.assertIs(child1, child2) + + # attrib is a copy + self.assertEqual(element_foo2.attrib, element_foo.attrib) + def test___copy__(self): element_foo = ET.Element("foo", { "zix": "wyp" }) element_foo.append(ET.Element("bar", { "baz": "qix" })) @@ -2838,40 +3065,6 @@ def test_iter_by_tag(self): self.assertEqual(self._ilist(doc), all_tags) self.assertEqual(self._ilist(doc, '*'), all_tags) - # Element.getiterator() is deprecated. - @checkwarnings(("This method will be removed in future versions. " - "Use .+ instead.", DeprecationWarning)) - def test_getiterator(self): - doc = ET.XML(''' - - - bedroom1 - bedroom2 - - nothing here - - - bedroom8 - - ''') - - self.assertEqual(summarize_list(doc.getiterator('room')), - ['room'] * 3) - self.assertEqual(summarize_list(doc.getiterator('house')), - ['house'] * 2) - - # test that getiterator also accepts 'tag' as a keyword arg - self.assertEqual( - summarize_list(doc.getiterator(tag='room')), - ['room'] * 3) - - # make sure both tag=None and tag='*' return all tags - all_tags = ['document', 'house', 'room', 'room', - 'shed', 'house', 'room'] - self.assertEqual(summarize_list(doc.getiterator()), all_tags) - self.assertEqual(summarize_list(doc.getiterator(None)), all_tags) - self.assertEqual(summarize_list(doc.getiterator('*')), all_tags) - def test_copy(self): a = ET.Element('a') it = a.iter() @@ -3701,6 +3894,14 @@ def test_simple_roundtrip(self): #self.assertEqual(c14n_roundtrip(""), #'') + # Namespace issues + xml = '' + self.assertEqual(c14n_roundtrip(xml), xml) + xml = '' + self.assertEqual(c14n_roundtrip(xml), xml) + xml = '' + self.assertEqual(c14n_roundtrip(xml), xml) + def test_c14n_exclusion(self): xml = textwrap.dedent("""\ diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py index 52bacc1eafa7895d2d4757272040d2539a11b61e..f68af527eae8557c43c4dc4d320b94f1a3c92a7f 100644 --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -15,6 +15,8 @@ import io import contextlib from test import support +from test.support import socket_helper +from test.support import ALWAYS_EQ, LARGEST, SMALLEST try: import gzip @@ -333,7 +335,7 @@ def run_server(): server.handle_request() # First request and attempt at second server.handle_request() # Retried second request - server = http.server.HTTPServer((support.HOST, 0), RequestHandler) + server = http.server.HTTPServer((socket_helper.HOST, 0), RequestHandler) self.addCleanup(server.server_close) thread = threading.Thread(target=run_server) thread.start() @@ -530,14 +532,10 @@ def test_comparison(self): # some other types dbytes = dstr.encode('ascii') dtuple = now.timetuple() - with self.assertRaises(TypeError): - dtime == 1970 - with self.assertRaises(TypeError): - dtime != dbytes - with self.assertRaises(TypeError): - dtime == bytearray(dbytes) - with self.assertRaises(TypeError): - dtime != dtuple + self.assertFalse(dtime == 1970) + self.assertTrue(dtime != dbytes) + self.assertFalse(dtime == bytearray(dbytes)) + self.assertTrue(dtime != dtuple) with self.assertRaises(TypeError): dtime < float(1970) with self.assertRaises(TypeError): @@ -547,6 +545,18 @@ def test_comparison(self): with self.assertRaises(TypeError): dtime >= dtuple + self.assertTrue(dtime == ALWAYS_EQ) + self.assertFalse(dtime != ALWAYS_EQ) + self.assertTrue(dtime < LARGEST) + self.assertFalse(dtime > LARGEST) + self.assertTrue(dtime <= LARGEST) + self.assertFalse(dtime >= LARGEST) + self.assertFalse(dtime < SMALLEST) + self.assertTrue(dtime > SMALLEST) + self.assertFalse(dtime <= SMALLEST) + self.assertTrue(dtime >= SMALLEST) + + class BinaryTestCase(unittest.TestCase): # XXX What should str(Binary(b"\xff")) return? I'm chosing "\xff" diff --git a/Lib/test/test_zipapp.py b/Lib/test/test_zipapp.py index 73bddc79c17ab68df3123c5bf51aea148160a80b..69f2e55d5638400f41c83e574a4b1dd19e319592 100644 --- a/Lib/test/test_zipapp.py +++ b/Lib/test/test_zipapp.py @@ -101,7 +101,7 @@ def test_create_archive_default_target(self): expected_target = self.tmpdir / 'source.pyz' self.assertTrue(expected_target.is_file()) - @requires_zlib + @requires_zlib() def test_create_archive_with_compression(self): # Test packing a directory into a compressed archive. source = self.tmpdir / 'source' diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index e2e37a177041855671f67f46137f4333370ec727..999197a0e32dcc10770247a80f0dd0455f96912b 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -16,7 +16,7 @@ from tempfile import TemporaryFile -from random import randint, random, getrandbits +from random import randint, random, randbytes from test.support import script_helper from test.support import (TESTFN, findfile, unlink, rmtree, temp_dir, temp_cwd, @@ -33,9 +33,6 @@ ('ziptest2dir/ziptest3dir/_ziptest3', 'azsxdcfvgb'), ('ziptest2dir/ziptest3dir/ziptest4dir/_ziptest3', '6y7u8i9o0p')] -def getrandbytes(size): - return getrandbits(8 * size).to_bytes(size, 'little') - def get_files(test): yield TESTFN2 with TemporaryFile() as f: @@ -324,7 +321,7 @@ def test_read_return_size(self): # than requested. for test_size in (1, 4095, 4096, 4097, 16384): file_size = test_size + 1 - junk = getrandbytes(file_size) + junk = randbytes(file_size) with zipfile.ZipFile(io.BytesIO(), "w", self.compression) as zipf: zipf.writestr('foo', junk) with zipf.open('foo', 'r') as fp: @@ -572,6 +569,20 @@ def test_write_default_name(self): with open(TESTFN, "rb") as f: self.assertEqual(zipfp.read(TESTFN), f.read()) + def test_io_on_closed_zipextfile(self): + fname = "somefile.txt" + with zipfile.ZipFile(TESTFN2, mode="w") as zipfp: + zipfp.writestr(fname, "bogus") + + with zipfile.ZipFile(TESTFN2, mode="r") as zipfp: + with zipfp.open(fname) as fid: + fid.close() + self.assertRaises(ValueError, fid.read) + self.assertRaises(ValueError, fid.seek, 0) + self.assertRaises(ValueError, fid.tell) + self.assertRaises(ValueError, fid.readable) + self.assertRaises(ValueError, fid.seekable) + def test_write_to_readonly(self): """Check that trying to call write() on a readonly ZipFile object raises a ValueError.""" @@ -629,7 +640,7 @@ def test_add_file_after_2107(self): self.assertEqual(zinfo.date_time, (2107, 12, 31, 23, 59, 59)) -@requires_zlib +@requires_zlib() class DeflateTestsWithSourceFile(AbstractTestsWithSourceFile, unittest.TestCase): compression = zipfile.ZIP_DEFLATED @@ -645,12 +656,12 @@ def test_per_file_compression(self): self.assertEqual(sinfo.compress_type, zipfile.ZIP_STORED) self.assertEqual(dinfo.compress_type, zipfile.ZIP_DEFLATED) -@requires_bz2 +@requires_bz2() class Bzip2TestsWithSourceFile(AbstractTestsWithSourceFile, unittest.TestCase): compression = zipfile.ZIP_BZIP2 -@requires_lzma +@requires_lzma() class LzmaTestsWithSourceFile(AbstractTestsWithSourceFile, unittest.TestCase): compression = zipfile.ZIP_LZMA @@ -1064,17 +1075,17 @@ def test_generated_valid_zip64_extra(self): self.assertEqual(zf.read(zinfo), expected_content) -@requires_zlib +@requires_zlib() class DeflateTestZip64InSmallFiles(AbstractTestZip64InSmallFiles, unittest.TestCase): compression = zipfile.ZIP_DEFLATED -@requires_bz2 +@requires_bz2() class Bzip2TestZip64InSmallFiles(AbstractTestZip64InSmallFiles, unittest.TestCase): compression = zipfile.ZIP_BZIP2 -@requires_lzma +@requires_lzma() class LzmaTestZip64InSmallFiles(AbstractTestZip64InSmallFiles, unittest.TestCase): compression = zipfile.ZIP_LZMA @@ -1109,15 +1120,15 @@ def test_write_after_close(self): class StoredWriterTests(AbstractWriterTests, unittest.TestCase): compression = zipfile.ZIP_STORED -@requires_zlib +@requires_zlib() class DeflateWriterTests(AbstractWriterTests, unittest.TestCase): compression = zipfile.ZIP_DEFLATED -@requires_bz2 +@requires_bz2() class Bzip2WriterTests(AbstractWriterTests, unittest.TestCase): compression = zipfile.ZIP_BZIP2 -@requires_lzma +@requires_lzma() class LzmaWriterTests(AbstractWriterTests, unittest.TestCase): compression = zipfile.ZIP_LZMA @@ -1571,7 +1582,7 @@ def test_unsupported_version(self): self.assertRaises(NotImplementedError, zipfile.ZipFile, io.BytesIO(data), 'r') - @requires_zlib + @requires_zlib() def test_read_unicode_filenames(self): # bug #10801 fname = findfile('zip_cp437_header.zip') @@ -1844,11 +1855,14 @@ def test_comments(self): self.assertEqual(zipf.comment, b"an updated comment") # check that comments are correctly shortened in append mode + # and the file is indeed truncated with zipfile.ZipFile(TESTFN,mode="w") as zipf: zipf.comment = b"original comment that's longer" zipf.writestr("foo.txt", "O, for a Muse of Fire!") + original_zip_size = os.path.getsize(TESTFN) with zipfile.ZipFile(TESTFN,mode="a") as zipf: zipf.comment = b"shorter comment" + self.assertTrue(original_zip_size > os.path.getsize(TESTFN)) with zipfile.ZipFile(TESTFN,mode="r") as zipf: self.assertEqual(zipf.comment, b"shorter comment") @@ -1903,6 +1917,33 @@ def test_create_zipinfo_before_1980(self): self.assertRaises(ValueError, zipfile.ZipInfo, 'seventies', (1979, 1, 1, 0, 0, 0)) + def test_create_empty_zipinfo_repr(self): + """Before bpo-26185, repr() on empty ZipInfo object was failing.""" + zi = zipfile.ZipInfo(filename="empty") + self.assertEqual(repr(zi), "") + + def test_create_empty_zipinfo_default_attributes(self): + """Ensure all required attributes are set.""" + zi = zipfile.ZipInfo() + self.assertEqual(zi.orig_filename, "NoName") + self.assertEqual(zi.filename, "NoName") + self.assertEqual(zi.date_time, (1980, 1, 1, 0, 0, 0)) + self.assertEqual(zi.compress_type, zipfile.ZIP_STORED) + self.assertEqual(zi.comment, b"") + self.assertEqual(zi.extra, b"") + self.assertIn(zi.create_system, (0, 3)) + self.assertEqual(zi.create_version, zipfile.DEFAULT_VERSION) + self.assertEqual(zi.extract_version, zipfile.DEFAULT_VERSION) + self.assertEqual(zi.reserved, 0) + self.assertEqual(zi.flag_bits, 0) + self.assertEqual(zi.volume, 0) + self.assertEqual(zi.internal_attr, 0) + self.assertEqual(zi.external_attr, 0) + + # Before bpo-26185, both were missing + self.assertEqual(zi.file_size, 0) + self.assertEqual(zi.compress_size, 0) + def test_zipfile_with_short_extra_field(self): """If an extra field in the header is less than 4 bytes, skip it.""" zipdata = ( @@ -1985,7 +2026,7 @@ def test_seek_tell(self): fp.seek(0, os.SEEK_SET) self.assertEqual(fp.tell(), 0) - @requires_bz2 + @requires_bz2() def test_decompress_without_3rd_party_library(self): data = b'PK\x05\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' zip_file = io.BytesIO(data) @@ -2043,7 +2084,7 @@ class StoredBadCrcTests(AbstractBadCrcTests, unittest.TestCase): b'lePK\005\006\0\0\0\0\001\0\001\0003\000' b'\0\0/\0\0\0\0\0') -@requires_zlib +@requires_zlib() class DeflateBadCrcTests(AbstractBadCrcTests, unittest.TestCase): compression = zipfile.ZIP_DEFLATED zip_with_bad_crc = ( @@ -2056,7 +2097,7 @@ class DeflateBadCrcTests(AbstractBadCrcTests, unittest.TestCase): b'\x00afilePK\x05\x06\x00\x00\x00\x00\x01\x00' b'\x01\x003\x00\x00\x003\x00\x00\x00\x00\x00') -@requires_bz2 +@requires_bz2() class Bzip2BadCrcTests(AbstractBadCrcTests, unittest.TestCase): compression = zipfile.ZIP_BZIP2 zip_with_bad_crc = ( @@ -2072,7 +2113,7 @@ class Bzip2BadCrcTests(AbstractBadCrcTests, unittest.TestCase): b'\x05\x06\x00\x00\x00\x00\x01\x00\x01\x003\x00\x00\x00[\x00' b'\x00\x00\x00\x00') -@requires_lzma +@requires_lzma() class LzmaBadCrcTests(AbstractBadCrcTests, unittest.TestCase): compression = zipfile.ZIP_LZMA zip_with_bad_crc = ( @@ -2139,7 +2180,7 @@ def test_bad_password(self): self.zip2.setpassword(b"perl") self.assertRaises(RuntimeError, self.zip2.read, "zero") - @requires_zlib + @requires_zlib() def test_good_password(self): self.zip.setpassword(b"python") self.assertEqual(self.zip.read("test.txt"), self.plain) @@ -2285,17 +2326,17 @@ class StoredTestsWithRandomBinaryFiles(AbstractTestsWithRandomBinaryFiles, unittest.TestCase): compression = zipfile.ZIP_STORED -@requires_zlib +@requires_zlib() class DeflateTestsWithRandomBinaryFiles(AbstractTestsWithRandomBinaryFiles, unittest.TestCase): compression = zipfile.ZIP_DEFLATED -@requires_bz2 +@requires_bz2() class Bzip2TestsWithRandomBinaryFiles(AbstractTestsWithRandomBinaryFiles, unittest.TestCase): compression = zipfile.ZIP_BZIP2 -@requires_lzma +@requires_lzma() class LzmaTestsWithRandomBinaryFiles(AbstractTestsWithRandomBinaryFiles, unittest.TestCase): compression = zipfile.ZIP_LZMA @@ -2383,12 +2424,12 @@ def test_open_write(self): self.assertEqual(zipf.read('twos'), b'222') -@requires_zlib +@requires_zlib() class TestsWithMultipleOpens(unittest.TestCase): @classmethod def setUpClass(cls): - cls.data1 = b'111' + getrandbytes(10000) - cls.data2 = b'222' + getrandbytes(10000) + cls.data1 = b'111' + randbytes(10000) + cls.data2 = b'222' + randbytes(10000) def make_test_archive(self, f): # Create the ZIP archive @@ -2649,7 +2690,7 @@ def test_list_command(self): PYTHONIOENCODING='ascii:backslashreplace') self.assertEqual(out, expected) - @requires_zlib + @requires_zlib() def test_create_command(self): self.addCleanup(unlink, TESTFN) with open(TESTFN, 'w') as f: @@ -2845,7 +2886,7 @@ def test_open(self): a, b, g = root.iterdir() with a.open() as strm: data = strm.read() - assert data == b"content of a" + assert data == "content of a" def test_read(self): for alpharep in self.zipfile_alpharep(): diff --git a/Lib/test/test_zipfile64.py b/Lib/test/test_zipfile64.py index 56746bc08f63d878f4ef9242621d45f204051c78..3a788de221264da458acae23be75ad521c5df5f9 100644 --- a/Lib/test/test_zipfile64.py +++ b/Lib/test/test_zipfile64.py @@ -73,7 +73,7 @@ def testStored(self): self.assertFalse(f.closed) self.zipTest(TESTFN2, zipfile.ZIP_STORED) - @requires_zlib + @requires_zlib() def testDeflated(self): # Try the temp file first. If we do TESTFN2 first, then it hogs # gigabytes of disk space for the duration of the test. diff --git a/Lib/test/test_zipimport.py b/Lib/test/test_zipimport.py index 2af8689c1d2cb200df007654f8f81da0c33c3477..560286071c690295fccf55ab4eb2e5b3a05a9940 100644 --- a/Lib/test/test_zipimport.py +++ b/Lib/test/test_zipimport.py @@ -683,7 +683,7 @@ def testLargestPossibleComment(self): self.doTest(".py", files, TESTMOD, comment=b"c" * ((1 << 16) - 1)) -@support.requires_zlib +@support.requires_zlib() class CompressedZipImportTestCase(UncompressedZipImportTestCase): compression = ZIP_DEFLATED diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py index f828b4c737a5fcf7f14633076a601ab0b533e382..02509cdf5532c9ed5d234c0703d33a5b8dbbaa9a 100644 --- a/Lib/test/test_zlib.py +++ b/Lib/test/test_zlib.py @@ -134,8 +134,7 @@ def check_big_compress_buffer(self, size, compress_func): # Generate 10 MiB worth of random, and expand it by repeating it. # The assumption is that zlib's memory is not big enough to exploit # such spread out redundancy. - data = b''.join([random.getrandbits(8 * _1M).to_bytes(_1M, 'little') - for i in range(10)]) + data = random.randbytes(_1M * 10) data = data * (size // len(data) + 1) try: compress_func(data) @@ -488,7 +487,7 @@ def test_odd_flush(self): # others might simply have a single RNG gen = random gen.seed(1) - data = genblock(1, 17 * 1024, generator=gen) + data = gen.randbytes(17 * 1024) # compress, sync-flush, and decompress first = co.compress(data) @@ -825,20 +824,6 @@ def test_wbits(self): self.assertEqual(dco.decompress(gzip), HAMLET_SCENE) -def genblock(seed, length, step=1024, generator=random): - """length-byte stream of random data from a seed (in step-byte blocks).""" - if seed is not None: - generator.seed(seed) - randint = generator.randint - if length < step or step < 2: - step = length - blocks = bytes() - for i in range(0, length, step): - blocks += bytes(randint(0, 255) for x in range(step)) - return blocks - - - def choose_lines(source, number, seed=None, generator=random): """Return a list of number lines randomly chosen from the source""" if seed is not None: @@ -847,7 +832,6 @@ def choose_lines(source, number, seed=None, generator=random): return [generator.choice(sources) for n in range(number)] - HAMLET_SCENE = b""" LAERTES diff --git a/Lib/test/test_zoneinfo/__init__.py b/Lib/test/test_zoneinfo/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..98cc4412ae16c2ef554f226aebb7aaa061908c30 --- /dev/null +++ b/Lib/test/test_zoneinfo/__init__.py @@ -0,0 +1 @@ +from .test_zoneinfo import * diff --git a/Lib/test/test_zoneinfo/__main__.py b/Lib/test/test_zoneinfo/__main__.py new file mode 100644 index 0000000000000000000000000000000000000000..5cc4e055d5e6601fe60fa83aea99760ef98cc887 --- /dev/null +++ b/Lib/test/test_zoneinfo/__main__.py @@ -0,0 +1,3 @@ +import unittest + +unittest.main('test.test_zoneinfo') diff --git a/Lib/test/test_zoneinfo/_support.py b/Lib/test/test_zoneinfo/_support.py new file mode 100644 index 0000000000000000000000000000000000000000..0fe162c2583687682fdf3aa3df54972343586860 --- /dev/null +++ b/Lib/test/test_zoneinfo/_support.py @@ -0,0 +1,100 @@ +import contextlib +import functools +import sys +import threading +import unittest +from test.support import import_fresh_module + +OS_ENV_LOCK = threading.Lock() +TZPATH_LOCK = threading.Lock() +TZPATH_TEST_LOCK = threading.Lock() + + +def call_once(f): + """Decorator that ensures a function is only ever called once.""" + lock = threading.Lock() + cached = functools.lru_cache(None)(f) + + @functools.wraps(f) + def inner(): + with lock: + return cached() + + return inner + + +@call_once +def get_modules(): + """Retrieve two copies of zoneinfo: pure Python and C accelerated. + + Because this function manipulates the import system in a way that might + be fragile or do unexpected things if it is run many times, it uses a + `call_once` decorator to ensure that this is only ever called exactly + one time — in other words, when using this function you will only ever + get one copy of each module rather than a fresh import each time. + """ + import zoneinfo as c_module + + py_module = import_fresh_module("zoneinfo", blocked=["_zoneinfo"]) + + return py_module, c_module + + +@contextlib.contextmanager +def set_zoneinfo_module(module): + """Make sure sys.modules["zoneinfo"] refers to `module`. + + This is necessary because `pickle` will refuse to serialize + an type calling itself `zoneinfo.ZoneInfo` unless `zoneinfo.ZoneInfo` + refers to the same object. + """ + + NOT_PRESENT = object() + old_zoneinfo = sys.modules.get("zoneinfo", NOT_PRESENT) + sys.modules["zoneinfo"] = module + yield + if old_zoneinfo is not NOT_PRESENT: + sys.modules["zoneinfo"] = old_zoneinfo + else: # pragma: nocover + sys.modules.pop("zoneinfo") + + +class ZoneInfoTestBase(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.klass = cls.module.ZoneInfo + super().setUpClass() + + @contextlib.contextmanager + def tzpath_context(self, tzpath, block_tzdata=True, lock=TZPATH_LOCK): + def pop_tzdata_modules(): + tzdata_modules = {} + for modname in list(sys.modules): + if modname.split(".", 1)[0] != "tzdata": # pragma: nocover + continue + + tzdata_modules[modname] = sys.modules.pop(modname) + + return tzdata_modules + + with lock: + if block_tzdata: + # In order to fully exclude tzdata from the path, we need to + # clear the sys.modules cache of all its contents — setting the + # root package to None is not enough to block direct access of + # already-imported submodules (though it will prevent new + # imports of submodules). + tzdata_modules = pop_tzdata_modules() + sys.modules["tzdata"] = None + + old_path = self.module.TZPATH + try: + self.module.reset_tzpath(tzpath) + yield + finally: + if block_tzdata: + sys.modules.pop("tzdata") + for modname, module in tzdata_modules.items(): + sys.modules[modname] = module + + self.module.reset_tzpath(old_path) diff --git a/Lib/test/test_zoneinfo/data/update_test_data.py b/Lib/test/test_zoneinfo/data/update_test_data.py new file mode 100644 index 0000000000000000000000000000000000000000..f531ab316a1f2114ffe3f7505edd8ee6b85bbd40 --- /dev/null +++ b/Lib/test/test_zoneinfo/data/update_test_data.py @@ -0,0 +1,122 @@ +""" +Script to automatically generate a JSON file containing time zone information. + +This is done to allow "pinning" a small subset of the tzdata in the tests, +since we are testing properties of a file that may be subject to change. For +example, the behavior in the far future of any given zone is likely to change, +but "does this give the right answer for this file in 2040" is still an +important property to test. + +This must be run from a computer with zoneinfo data installed. +""" +from __future__ import annotations + +import base64 +import functools +import json +import lzma +import pathlib +import textwrap +import typing + +import zoneinfo + +KEYS = [ + "Africa/Abidjan", + "Africa/Casablanca", + "America/Los_Angeles", + "America/Santiago", + "Asia/Tokyo", + "Australia/Sydney", + "Europe/Dublin", + "Europe/Lisbon", + "Europe/London", + "Pacific/Kiritimati", + "UTC", +] + +TEST_DATA_LOC = pathlib.Path(__file__).parent + + +@functools.lru_cache(maxsize=None) +def get_zoneinfo_path() -> pathlib.Path: + """Get the first zoneinfo directory on TZPATH containing the "UTC" zone.""" + key = "UTC" + for path in map(pathlib.Path, zoneinfo.TZPATH): + if (path / key).exists(): + return path + else: + raise OSError("Cannot find time zone data.") + + +def get_zoneinfo_metadata() -> typing.Dict[str, str]: + path = get_zoneinfo_path() + + tzdata_zi = path / "tzdata.zi" + if not tzdata_zi.exists(): + # tzdata.zi is necessary to get the version information + raise OSError("Time zone data does not include tzdata.zi.") + + with open(tzdata_zi, "r") as f: + version_line = next(f) + + _, version = version_line.strip().rsplit(" ", 1) + + if ( + not version[0:4].isdigit() + or len(version) < 5 + or not version[4:].isalpha() + ): + raise ValueError( + "Version string should be YYYYx, " + + "where YYYY is the year and x is a letter; " + + f"found: {version}" + ) + + return {"version": version} + + +def get_zoneinfo(key: str) -> bytes: + path = get_zoneinfo_path() + + with open(path / key, "rb") as f: + return f.read() + + +def encode_compressed(data: bytes) -> typing.List[str]: + compressed_zone = lzma.compress(data) + raw = base64.b85encode(compressed_zone) + + raw_data_str = raw.decode("utf-8") + + data_str = textwrap.wrap(raw_data_str, width=70) + return data_str + + +def load_compressed_keys() -> typing.Dict[str, typing.List[str]]: + output = {key: encode_compressed(get_zoneinfo(key)) for key in KEYS} + + return output + + +def update_test_data(fname: str = "zoneinfo_data.json") -> None: + TEST_DATA_LOC.mkdir(exist_ok=True, parents=True) + + # Annotation required: https://github.com/python/mypy/issues/8772 + json_kwargs: typing.Dict[str, typing.Any] = dict( + indent=2, sort_keys=True, + ) + + compressed_keys = load_compressed_keys() + metadata = get_zoneinfo_metadata() + output = { + "metadata": metadata, + "data": compressed_keys, + } + + with open(TEST_DATA_LOC / fname, "w") as f: + json.dump(output, f, **json_kwargs) + + +if __name__ == "__main__": + update_test_data() diff --git a/Lib/test/test_zoneinfo/data/zoneinfo_data.json b/Lib/test/test_zoneinfo/data/zoneinfo_data.json new file mode 100644 index 0000000000000000000000000000000000000000..ec4414a0cdedbe35f2e08649dbb1bbd3aaa97937 --- /dev/null +++ b/Lib/test/test_zoneinfo/data/zoneinfo_data.json @@ -0,0 +1,190 @@ +{ + "data": { + "Africa/Abidjan": [ + "{Wp48S^xk9=GL@E0stWa761SMbT8$j-~f{VGF<>F7KxBg5R*{Ksocg8-YYVul=v7vZzaHN", + "uC=da5UI2rH18c!OnjV{y4u(+A!!VBKmY&$ORw>7UO^(500B;v0RR91bXh%WvBYQl0ssI2", + "00dcD" + ], + "Africa/Casablanca": [ + "{Wp48S^xk9=GL@E0stWa761SMbT8$j;0b&Kz+C_;7KxBg5R*{N&yjMUR~;C-fDaSOU;q-~", + "FqW+4{YBjbcw}`a!dW>b)R2-0a+uwf`P3{_Y@HuCz}S$J$ZJ>R_V<~|Fk>sgX4=%0vUrh-", + "lt@YP^Wrus;j?`Th#xRPzf<<~Hp4DH^gZX>d{+WOp~HNu8!{uWu}&XphAd{j1;rB4|9?R!", + "pqruAFUMt8#*WcrVS{;kLlY(cJRV$w?d2car%Rs>q9BgTU4", + "Ht-tQKZ7Z`9QqOb?R#b%z?rk>!CkH7jy3wja4NG2q)H}fNRKg8v{);Em;K3Cncf4C6&Oaj", + "V+DbX%o4+)CV3+e!Lm6dutu(0BQpH1T?W(~cQtKV*^_Pdx!LirjpTs?Bmt@vktjLq4;)O!", + "rrly=c*rwTwMJFd0I57`hgkc?=nyI4RZf9W$6DCWugmf&)wk^tWH17owj=#PGH7Xv-?9$j", + "njwDlkOE+BFNR9YXEmBpO;rqEw=e2IR-8^(W;8ma?M3JVd($2T>IW+0tk|Gm8>ftukRQ9J", + "8k3brzqMnVyjsLI-CKneFa)Lxvp_aq40f}0J3VVoWL5rox", + "`Kptivcp}o5xA^@>qNI%?zo=Yj4AMV?kbAA)j(1%)+Pp)bSn+7Yk`M{oE}L-Z!G6OMr5G+h", + "p)$3Lg{ono{4cN>Vr&>L4kXH;_VnBL5U!LgzqE%P7QQ*tue}O`3(TZ0`aKn&~8trOQ-rBXCp)f@P6RMO4l0+;b|5-pk9_ryNh}Zc*v%mvz_#", + "yd6fjB0g9{MmMnu8bG%#C~ugXK^S^k@?ab#", + "O|aE>dDTt4s4n69(~@t~!wniV%g7khFx~I*4>Y|V$4j5%KPF*-FyKIi@!Ho&", + "x8QQsksYt8)D+W)Ni!=G`ogSu^vLL-l#7A7=iIAKL2SuZk9F}NfNk86VI)9WZE?%2wC-ya", + "F~z#Qsq)LH0|_D8^5fU8X%GeQ4TB>R-dlziA&tZe&1ada208!$nk`7bOFO2S00G`Z@1A~t&lyL{p{eM{5)QGf7Mo5FW9==mlyXJt2", + "UwpntR7H0eSq!(aYq#aqUz&RM*tvuMI)AsM?K3-dV3-TT{t)!Iy#JTo=tXkzAM9~j2YbiO", + "ls3(H8Dc>Y|D1aqL51vjLbpYG;GvGTQB4bXuJ%mA;(B4eUpu$$@zv2vVcq-Y)VKbzp^tei", + "uzy}R{LuvDjpuVb`79O+CBmg{Wx!bvx$eu4zRE&", + "PehMb=&G<9$>iZ|bFE)0=4I?KLFGBC0I(0_svgw0%FiMsT%koo*!nEYc6GY@QnU}&4Isg;", + "l=|khi(!VaiSE2=Ny`&&tpi~~;{$uN}%f|7mBhAy;s3YT^sy!$eG~?`9mNJC9@4Bac_p^BZh)Yd_rWW5qh-?tKY(>5VHO", + "L*iT8P@wCavLj^yYbnDR+4ukhS+xPrpl)iqB?u)bj9a2aW==g6G3lCJd>(+Blfr)~^40F4f>cRZ^UF;RibfZ>0m73hR", + "C{$vTfC(STN`g7(B<=Z2556{}0`?p&|Akkst!4Xy4OT;A@c$XTUI3FRRjy*KA7uC56FD)z", + "^X{WV*sr(w!c$W357o!&eLO2wTDNOyw@gf(&R<t;=-Tu1TV{>%8ZVATC9tjD8|(&`$9YHvZ9bVe#>w", + "|8c;Tg|xE&)`*}LwM*E}q}q8^Qja%p`_U)*5DdLI9O@!e=3jFjOCrCq28b_bb;s>%D#iJB", + "CWJi{JH!Js;6nfayos$kq^OEX00HO-lokL0!mqm{vBYQl0ssI200dcD" + ], + "America/Santiago": [ + "{Wp48S^xk9=GL@E0stWa761SMbT8$j;0fRZ<6QtM7KxBg84(fsEAUJ$J{f-TXlPEUec5Ee", + "n+hsD4lC(QYax=JdSpoyje8%VM`GW}{bJ8@y$A8O&*$pw{(f~Os#}2w", + "eX6^Rgi$IT%n^V^85L>$_c7{cB^#ogV=rHBJGiz-RQNFGK?gdPi|q)j`&8)}KJ{qo6dixa", + "9@yYyVg+%lo0nO+Tw0-w2hJ%mafyWL)|", + ")?W6Bi%FWuGPA1Dru$XR4SZANsAthU2EoKHF6oEtKq`rwP", + "(VNegnI_NI%;ma$)wj{k!@KFB30Yo)IOrl>)$)D|+(5h&+%2vuwGuy^@S8FT^s21V5};>VA9Iu;?8bHz#r<;JtfZDI1(FT@edh0#", + "MYW$A1qkMGIwTZqqdYNE3gl#zp&NbL9Mp=voqN|;?gqR&4$)1`znddtEyuKS*^nMMD=0^>", + "7^z6-C4P67UWOXuMBubP>j6i~03aR@jD^-Y`JSYu#Yp0P8dLLJ0QOPE8=BoiuRX59YW7xg", + "WiexjHX%&0?`ZQCdxCdL^qd1v@kOjQKaWo2Y1++~LcA%FTq?5o%}fX1-RIvlB)1#iTNomGnUL=nM!>Ix|AGtON7!F1O?53kqlC2o-`ZGw*+s", + "NM$^9znsIJMwlgscE`|O3|;BRgsQMYm~`uv+nvuv`nigRa}X=BX=A5Sw$)WEklF7&c>_~$", + "zJ(m--bqXgiN^w-U=BJH9C0Qro(x90zo@rK;&TJ$nI@&k$ORgOb2s%gWbc}ok_27)Eoku~Fq|B-Ps+4J_", + "HPJMLJ2^_)cOU$p&3kNAlrV!)%~6r$BJ>OOi~=-<6byle{?zd4J{NG}o8tw|+#ZNLcpNwk", + "TuPE~sbJB8_RZb2DopStO+Wwux~F#S59zm%00I98;S&G=b(j+6vBYQl0ssI200dcD" + ], + "Asia/Tokyo": [ + "{Wp48S^xk9=GL@E0stWa761SMbT8$j-~luMgIxeB7KxBg5R*;y?l4Rl4neXH3cv!OtfK@h", + "KZzauI)S!FSDREPhhBS6Fb$&Vv#7%;?Te|>pF^0HBr&z_Tk<%vMW_QqjevRZOp8XVFgP<8", + "TkT#`9H&0Ua;gT1#rZLV0HqbAKK;_z@nO;6t0L}hOdk<>TdUa07R(LPI6@!GU$ty4=mwqHG-XVe*n(Yvgdlr+FqIU18!osi)48t~eWX8)&L", + "G)Ud^0zz@*AF+2r7E}Nf9Y72K~o-T%}D&z%}#7g2br?oH6ZiYH^%>J3D)TPKV(JY*bwjuw5=DsPB@~CrROZeN", + "x>A*H&CHrWt0`EP`m!F%waepl#|w#&`XgVc?~2M3uw$fGX~tf_Il!q#Aa<*8xlzQ2+7r6Z", + "^;Laa9F(WB_O&Dy2r>~@kSi16W{=6+i5GV=Uq~KX*~&HUN4oz7*O(gXIr}sDVcD`Ikgw#|", + "50ssal8s)Qy;?YGCf;*UKKKN!T4!Kqy_G;7PfQapugqvVBKy12v3TVH^L2", + "0?#5*VP~MOYfe$h`*L!7@tiW|_^X1N%<}`7YahiUYtMu5XwmOf3?dr+@zXHwW`z}ZDqZlT", + "<2Cs(<1%M!i6o&VK89BY0J7HPIo;O62s=|IbV^@y$N&#=>i^F00FcHoDl#3", + "Mdv&xvBYQl0ssI200dcD" + ], + "Europe/Dublin": [ + "{Wp48S^xk9=GL@E0stWa761SMbT8$j;0>b$_+0=h7KxBg5R*;&J77#T_U2R5sleVWFDmK~", + "Kzj5oh@`QKHvW^6V{jU-w>qg1tSt0c^vh;?qAqA0%t?;#S~6U8Qi", + "v&f1s9IH#g$m1k1a#3+lylw4mwT4QnEUUQdwg+xnEcBlgu31bAVabn41OMZVLGz6NDwG%X", + "uQar!b>GI{qSahE`AG}$kRWbuI~JCt;38)Xwbb~Qggs55t+MAHIxgDxzTJ;2xXx99+qCy4", + "45kC#v_l8fx|G&jlVvaciR<-wwf22l%4(t@S6tnX39#_K(4S0fu$FUs$isud9IKzCXB78NkARYq@9Dc0TGkhz);NtM_SSzEffN", + "l{2^*CKGdp52h!52A)6q9fUSltXF{T*Ehc9Q7u8!W7pE(Fv$D$cKUAt6wY=DA1mGgxC*VX", + "q_If3G#FY6-Voj`fIKk`0}Cc72_SD{v>468LV{pyBI33^p0E?}RwDA6Pkq--C~0jF&Z@Pv", + "!dx_1SN_)jwz@P$(oK%P!Tk9?fRjK88yxhxlcFtTjjZ$DYssSsa#ufYrR+}}nKS+r384o~", + "!Uw$nwTbF~qgRsgr0N#d@KIinx%hQB(SJyjJtDtIy(%mDm}ZBGN}dV6K~om|=U", + "VGkbciQ=^$_14|gT21!YQ)@y*Rd0i_lS6gtPBE9+ah%WIJPwzUTjIr+J1XckkmA!6WE16%", + "CVAl{Dn&-)=G$Bjh?bh0$Xt1UDcgXJjXzzojuw0>paV~?Sa`VN3FysqFxTzfKVAu*ucq#+m=|KSSMvp_#@-lwd+q*ue", + "FQ^5<|<0R-u4qYMbRqzSn&", + "Q7jSuvc%b+EZc%>nI(+&0Tl1Y>a6v4`uNFD-7$QrhHgS7Wnv~rDgfH;rQw3+m`LJxoM4v#", + "gK@?|B{RHJ*VxZgk#!p<_&-sjxOda0YaiJ1UnG41VPv(Et%ElzKRMcO$AfgU+Xnwg5p2_+", + "NrnZ1WfEj^fmHd^sx@%JWKkh#zaK0ox%rdP)zUmGZZnqmZ_9L=%6R8ibJH0bOT$AGhDo6{", + "fJ?;_U;D|^>5by2ul@i4Zf()InfFN}00EQ=q#FPL>RM>svBYQl0ssI200dcD" + ], + "Europe/Lisbon": [ + "{Wp48S^xk9=GL@E0stWa761SMbT8$j;0=rf*IfWA7KxBg5R*;*X|PN+G3LqthM?xgkNUN_", + ")gCt1Sc%YT6^TTomk4yVHXeyvQj8}l<;q&s7K}#Vnc8lII1?)AHh$*>OKUU4S;*h>v*ep0", + "xTi1cK2{aY*|2D*-~K<;-{_W+r@NvZ7-|NZv($ek_C%VfP0xjWeZP#CPXD`IKkakjh(kUd", + "&H)m;^Q(jGjIyiyrcUMtOP)u3A>sw6ux;Bmp3x$4QvQKMx5TrCx_!$srWQuXNs&`9=^IY1", + "yc&C31!sQh7P=Mk*#6x8Z@5^%ehR8UW$OWw0KMw}P1ycI^", + "4eh12oBUOV?S>n*d!+EM@>x#9PZD12iD=zaC;7`8dTfkU_6d}OZvSFSbGgXeKw}XyX@D=(", + ")D0!^DBGr8pXWBT$S-yhLP>Z3ys^VW3}RQ6{NGGVJG6vf*MH93vvNW6yLjie1;{4tVhg-KnSf|G`!", + "Z;j$7gJ1ows~RD=@n7I6aFd8rOR_7Y?E-$clI%1o5gA@O!KPa^(8^iFFeFykI-+z>E$mvp", + "E_h`vbHPjqkLs`Dn-0FV`R@z|h!S(Lb;M&|Exr!biY`%bfp$6`hK;GDhdP|^Q", + "*Ty*}1d41K>H2B{jrjE9aFK>yAQJBX9CD%-384S;0fw`PlprHGS`^b$oS-`I4VH7ji8ou-", + "g|060jfb1XcxiInT0oOoeR7#%e5Ug5#KW)nVSRvLHNe$SQHM@2)`S9L7>RL@Qx%fmm7?3u7P5TywFQ}C@S(pq}|", + "eLPT{C^{<0Q?uU&kSVd%!~8q3;Z0s3OqzF`$HRkePL5Ywgiwn{R(zi+jmOBFrVpW;)@UsU#%$8BcV#h@}m$#!Fglo&bwb78aYqOG_W7h{eb(+39&-mk4EIXq_", + "_`30=8sfA3=!3TO_TyS5X22~?6nKngZ|bq=grdq=9X)3xAkA42L!~rmS)n3w-~;lgz%Fhn", + "(?rXdp2ho~9?wmVs2JwVt~?@FVD%`tN69{(i3oQa;O0$E$lF&~Y#_H6bu6(BiwblJ>;-Fs", + "gA$Y$*?=X)n1pFkKn}F~`>=4)+LLQk?L*P!bhAm0;`N~z3QbUIyVrm%kOZ(n1JJsm0pyb8", + "!GV{d*C!9KXv;4vD4Q>-k#+x(!V5L@w5M>v2V5a`B>t(|B", + "|Fqr4^-{S*%Ep~ojUtx_CRbSQ(uFwu2=KH)Q@EBs@ZqRXn4mU;B!68;;IQs3Ub=n&UU%*m", + "k&zwD36&JSwsN(%k&x?H+tN^6)23c`I0=5^N_R0~1>tsFZ`^`3z~rXSXT&qcwa#n!%+Z#P", + "PG}(D^_CCILXnF|GKwabBh*xFS?4rwGo2vtJUwzrbv_$5PO+`?$l{H-jGB@X%S!OAhw;D4", + "XFycN3!XqQ&EorJOD3>~^U%Luw!jF<;6_q-f-S|6{cQDfZ2(4Xf1MMLr1=SA=MwVf2%Pp%VP;jn)|5Tf!-DbUGn%I-rkYaH7?$$O!t)wwClAisr3eUoeB^~T=U*_P~Y2*KdnO87>B!19sV=xZ5", + "yApq26RxgqA|*tmsvtL#OhcF(C<0EGWHP)BFl?h)_*7!{LoJiv%RsOs!q->n+DcV%9~B@RbC_1G_1g6`Yd~8|%-=2l~oGN!~TVv2Bnk>7wW8L@^?vX$f3AiT)(4nrCuTm9%(XC6Nai", + "E(;}7&=YZagjAN$O-cN;1u{dTkElmB0GT$|Wa)QMmKrx<|LCJ9qlUoFsUbD^H^6_8(w<0{", + "ftj&O1~p_%lh5z;zNV&sP+", + "NF2>iK{8KMUf+)<-)VxXbLxD(alL}N$AT-ogNbJSMMYeX+Z{jS)b8TK^PB=FxyBxzfmFto", + "eo0R`a(%NO?#aEH9|?Cv00000NIsFh6BW2800DjO0RR918Pu^`vBYQl0ssI200dcD" + ], + "UTC": [ + "{Wp48S^xk9=GL@E0stWa761SMbT8$j-~e#|9bEt_7KxBg5R*|3h1|xhHLji!C57qW6L*|H", + "pEErm00000ygu;I+>V)?00B92fhY-(AGY&-0RR9100dcD" + ] + }, + "metadata": { + "version": "2020a" + } +} \ No newline at end of file diff --git a/Lib/test/test_zoneinfo/test_zoneinfo.py b/Lib/test/test_zoneinfo/test_zoneinfo.py new file mode 100644 index 0000000000000000000000000000000000000000..d4704b75d389dfc92083a0d87630b9044f26c286 --- /dev/null +++ b/Lib/test/test_zoneinfo/test_zoneinfo.py @@ -0,0 +1,2100 @@ +from __future__ import annotations + +import base64 +import contextlib +import dataclasses +import importlib.metadata +import io +import json +import os +import pathlib +import pickle +import re +import shutil +import struct +import tempfile +import unittest +from datetime import date, datetime, time, timedelta, timezone +from functools import cached_property + +from . import _support as test_support +from ._support import OS_ENV_LOCK, TZPATH_TEST_LOCK, ZoneInfoTestBase +from test.support import import_module + +lzma = import_module('lzma') +py_zoneinfo, c_zoneinfo = test_support.get_modules() + +try: + importlib.metadata.metadata("tzdata") + HAS_TZDATA_PKG = True +except importlib.metadata.PackageNotFoundError: + HAS_TZDATA_PKG = False + +ZONEINFO_DATA = None +ZONEINFO_DATA_V1 = None +TEMP_DIR = None +DATA_DIR = pathlib.Path(__file__).parent / "data" +ZONEINFO_JSON = DATA_DIR / "zoneinfo_data.json" + +# Useful constants +ZERO = timedelta(0) +ONE_H = timedelta(hours=1) + + +def setUpModule(): + global TEMP_DIR + global ZONEINFO_DATA + global ZONEINFO_DATA_V1 + + TEMP_DIR = pathlib.Path(tempfile.mkdtemp(prefix="zoneinfo")) + ZONEINFO_DATA = ZoneInfoData(ZONEINFO_JSON, TEMP_DIR / "v2") + ZONEINFO_DATA_V1 = ZoneInfoData(ZONEINFO_JSON, TEMP_DIR / "v1", v1=True) + + +def tearDownModule(): + shutil.rmtree(TEMP_DIR) + + +class TzPathUserMixin: + """ + Adds a setUp() and tearDown() to make TZPATH manipulations thread-safe. + + Any tests that require manipulation of the TZPATH global are necessarily + thread unsafe, so we will acquire a lock and reset the TZPATH variable + to the default state before each test and release the lock after the test + is through. + """ + + @property + def tzpath(self): # pragma: nocover + return None + + @property + def block_tzdata(self): + return True + + def setUp(self): + with contextlib.ExitStack() as stack: + stack.enter_context( + self.tzpath_context( + self.tzpath, + block_tzdata=self.block_tzdata, + lock=TZPATH_TEST_LOCK, + ) + ) + self.addCleanup(stack.pop_all().close) + + super().setUp() + + +class DatetimeSubclassMixin: + """ + Replaces all ZoneTransition transition dates with a datetime subclass. + """ + + class DatetimeSubclass(datetime): + @classmethod + def from_datetime(cls, dt): + return cls( + dt.year, + dt.month, + dt.day, + dt.hour, + dt.minute, + dt.second, + dt.microsecond, + tzinfo=dt.tzinfo, + fold=dt.fold, + ) + + def load_transition_examples(self, key): + transition_examples = super().load_transition_examples(key) + for zt in transition_examples: + dt = zt.transition + new_dt = self.DatetimeSubclass.from_datetime(dt) + new_zt = dataclasses.replace(zt, transition=new_dt) + yield new_zt + + +class ZoneInfoTest(TzPathUserMixin, ZoneInfoTestBase): + module = py_zoneinfo + class_name = "ZoneInfo" + + def setUp(self): + super().setUp() + + # This is necessary because various subclasses pull from different + # data sources (e.g. tzdata, V1 files, etc). + self.klass.clear_cache() + + @property + def zoneinfo_data(self): + return ZONEINFO_DATA + + @property + def tzpath(self): + return [self.zoneinfo_data.tzpath] + + def zone_from_key(self, key): + return self.klass(key) + + def zones(self): + return ZoneDumpData.transition_keys() + + def fixed_offset_zones(self): + return ZoneDumpData.fixed_offset_zones() + + def load_transition_examples(self, key): + return ZoneDumpData.load_transition_examples(key) + + def test_str(self): + # Zones constructed with a key must have str(zone) == key + for key in self.zones(): + with self.subTest(key): + zi = self.zone_from_key(key) + + self.assertEqual(str(zi), key) + + # Zones with no key constructed should have str(zone) == repr(zone) + file_key = self.zoneinfo_data.keys[0] + file_path = self.zoneinfo_data.path_from_key(file_key) + + with open(file_path, "rb") as f: + with self.subTest(test_name="Repr test", path=file_path): + zi_ff = self.klass.from_file(f) + self.assertEqual(str(zi_ff), repr(zi_ff)) + + def test_repr(self): + # The repr is not guaranteed, but I think we can insist that it at + # least contain the name of the class. + key = next(iter(self.zones())) + + zi = self.klass(key) + class_name = self.class_name + with self.subTest(name="from key"): + self.assertRegex(repr(zi), class_name) + + file_key = self.zoneinfo_data.keys[0] + file_path = self.zoneinfo_data.path_from_key(file_key) + with open(file_path, "rb") as f: + zi_ff = self.klass.from_file(f, key=file_key) + + with self.subTest(name="from file with key"): + self.assertRegex(repr(zi_ff), class_name) + + with open(file_path, "rb") as f: + zi_ff_nk = self.klass.from_file(f) + + with self.subTest(name="from file without key"): + self.assertRegex(repr(zi_ff_nk), class_name) + + def test_key_attribute(self): + key = next(iter(self.zones())) + + def from_file_nokey(key): + with open(self.zoneinfo_data.path_from_key(key), "rb") as f: + return self.klass.from_file(f) + + constructors = ( + ("Primary constructor", self.klass, key), + ("no_cache", self.klass.no_cache, key), + ("from_file", from_file_nokey, None), + ) + + for msg, constructor, expected in constructors: + zi = constructor(key) + + # Ensure that the key attribute is set to the input to ``key`` + with self.subTest(msg): + self.assertEqual(zi.key, expected) + + # Ensure that the key attribute is read-only + with self.subTest(f"{msg}: readonly"): + with self.assertRaises(AttributeError): + zi.key = "Some/Value" + + def test_bad_keys(self): + bad_keys = [ + "Eurasia/Badzone", # Plausible but does not exist + "BZQ", + "America.Los_Angeles", + "🇨🇦", # Non-ascii + "America/New\ud800York", # Contains surrogate character + ] + + for bad_key in bad_keys: + with self.assertRaises(self.module.ZoneInfoNotFoundError): + self.klass(bad_key) + + def test_bad_keys_paths(self): + bad_keys = [ + "/America/Los_Angeles", # Absolute path + "America/Los_Angeles/", # Trailing slash - not normalized + "../zoneinfo/America/Los_Angeles", # Traverses above TZPATH + "America/../America/Los_Angeles", # Not normalized + "America/./Los_Angeles", + ] + + for bad_key in bad_keys: + with self.assertRaises(ValueError): + self.klass(bad_key) + + def test_bad_zones(self): + bad_zones = [ + b"", # Empty file + b"AAAA3" + b" " * 15, # Bad magic + ] + + for bad_zone in bad_zones: + fobj = io.BytesIO(bad_zone) + with self.assertRaises(ValueError): + self.klass.from_file(fobj) + + def test_fromutc_errors(self): + key = next(iter(self.zones())) + zone = self.zone_from_key(key) + + bad_values = [ + (datetime(2019, 1, 1, tzinfo=timezone.utc), ValueError), + (datetime(2019, 1, 1), ValueError), + (date(2019, 1, 1), TypeError), + (time(0), TypeError), + (0, TypeError), + ("2019-01-01", TypeError), + ] + + for val, exc_type in bad_values: + with self.subTest(val=val): + with self.assertRaises(exc_type): + zone.fromutc(val) + + def test_utc(self): + zi = self.klass("UTC") + dt = datetime(2020, 1, 1, tzinfo=zi) + + self.assertEqual(dt.utcoffset(), ZERO) + self.assertEqual(dt.dst(), ZERO) + self.assertEqual(dt.tzname(), "UTC") + + def test_unambiguous(self): + test_cases = [] + for key in self.zones(): + for zone_transition in self.load_transition_examples(key): + test_cases.append( + ( + key, + zone_transition.transition - timedelta(days=2), + zone_transition.offset_before, + ) + ) + + test_cases.append( + ( + key, + zone_transition.transition + timedelta(days=2), + zone_transition.offset_after, + ) + ) + + for key, dt, offset in test_cases: + with self.subTest(key=key, dt=dt, offset=offset): + tzi = self.zone_from_key(key) + dt = dt.replace(tzinfo=tzi) + + self.assertEqual(dt.tzname(), offset.tzname, dt) + self.assertEqual(dt.utcoffset(), offset.utcoffset, dt) + self.assertEqual(dt.dst(), offset.dst, dt) + + def test_folds_and_gaps(self): + test_cases = [] + for key in self.zones(): + tests = {"folds": [], "gaps": []} + for zt in self.load_transition_examples(key): + if zt.fold: + test_group = tests["folds"] + elif zt.gap: + test_group = tests["gaps"] + else: + # Assign a random variable here to disable the peephole + # optimizer so that coverage can see this line. + # See bpo-2506 for more information. + no_peephole_opt = None + continue + + # Cases are of the form key, dt, fold, offset + dt = zt.anomaly_start - timedelta(seconds=1) + test_group.append((dt, 0, zt.offset_before)) + test_group.append((dt, 1, zt.offset_before)) + + dt = zt.anomaly_start + test_group.append((dt, 0, zt.offset_before)) + test_group.append((dt, 1, zt.offset_after)) + + dt = zt.anomaly_start + timedelta(seconds=1) + test_group.append((dt, 0, zt.offset_before)) + test_group.append((dt, 1, zt.offset_after)) + + dt = zt.anomaly_end - timedelta(seconds=1) + test_group.append((dt, 0, zt.offset_before)) + test_group.append((dt, 1, zt.offset_after)) + + dt = zt.anomaly_end + test_group.append((dt, 0, zt.offset_after)) + test_group.append((dt, 1, zt.offset_after)) + + dt = zt.anomaly_end + timedelta(seconds=1) + test_group.append((dt, 0, zt.offset_after)) + test_group.append((dt, 1, zt.offset_after)) + + for grp, test_group in tests.items(): + test_cases.append(((key, grp), test_group)) + + for (key, grp), tests in test_cases: + with self.subTest(key=key, grp=grp): + tzi = self.zone_from_key(key) + + for dt, fold, offset in tests: + dt = dt.replace(fold=fold, tzinfo=tzi) + + self.assertEqual(dt.tzname(), offset.tzname, dt) + self.assertEqual(dt.utcoffset(), offset.utcoffset, dt) + self.assertEqual(dt.dst(), offset.dst, dt) + + def test_folds_from_utc(self): + for key in self.zones(): + zi = self.zone_from_key(key) + with self.subTest(key=key): + for zt in self.load_transition_examples(key): + if not zt.fold: + continue + + dt_utc = zt.transition_utc + dt_before_utc = dt_utc - timedelta(seconds=1) + dt_after_utc = dt_utc + timedelta(seconds=1) + + dt_before = dt_before_utc.astimezone(zi) + self.assertEqual(dt_before.fold, 0, (dt_before, dt_utc)) + + dt_after = dt_after_utc.astimezone(zi) + self.assertEqual(dt_after.fold, 1, (dt_after, dt_utc)) + + def test_time_variable_offset(self): + # self.zones() only ever returns variable-offset zones + for key in self.zones(): + zi = self.zone_from_key(key) + t = time(11, 15, 1, 34471, tzinfo=zi) + + with self.subTest(key=key): + self.assertIs(t.tzname(), None) + self.assertIs(t.utcoffset(), None) + self.assertIs(t.dst(), None) + + def test_time_fixed_offset(self): + for key, offset in self.fixed_offset_zones(): + zi = self.zone_from_key(key) + + t = time(11, 15, 1, 34471, tzinfo=zi) + + with self.subTest(key=key): + self.assertEqual(t.tzname(), offset.tzname) + self.assertEqual(t.utcoffset(), offset.utcoffset) + self.assertEqual(t.dst(), offset.dst) + + +class CZoneInfoTest(ZoneInfoTest): + module = c_zoneinfo + + def test_fold_mutate(self): + """Test that fold isn't mutated when no change is necessary. + + The underlying C API is capable of mutating datetime objects, and + may rely on the fact that addition of a datetime object returns a + new datetime; this test ensures that the input datetime to fromutc + is not mutated. + """ + + def to_subclass(dt): + class SameAddSubclass(type(dt)): + def __add__(self, other): + if other == timedelta(0): + return self + + return super().__add__(other) # pragma: nocover + + return SameAddSubclass( + dt.year, + dt.month, + dt.day, + dt.hour, + dt.minute, + dt.second, + dt.microsecond, + fold=dt.fold, + tzinfo=dt.tzinfo, + ) + + subclass = [False, True] + + key = "Europe/London" + zi = self.zone_from_key(key) + for zt in self.load_transition_examples(key): + if zt.fold and zt.offset_after.utcoffset == ZERO: + example = zt.transition_utc.replace(tzinfo=zi) + break + + for subclass in [False, True]: + if subclass: + dt = to_subclass(example) + else: + dt = example + + with self.subTest(subclass=subclass): + dt_fromutc = zi.fromutc(dt) + + self.assertEqual(dt_fromutc.fold, 1) + self.assertEqual(dt.fold, 0) + + +class ZoneInfoDatetimeSubclassTest(DatetimeSubclassMixin, ZoneInfoTest): + pass + + +class CZoneInfoDatetimeSubclassTest(DatetimeSubclassMixin, CZoneInfoTest): + pass + + +class ZoneInfoSubclassTest(ZoneInfoTest): + @classmethod + def setUpClass(cls): + super().setUpClass() + + class ZISubclass(cls.klass): + pass + + cls.class_name = "ZISubclass" + cls.parent_klass = cls.klass + cls.klass = ZISubclass + + def test_subclass_own_cache(self): + base_obj = self.parent_klass("Europe/London") + sub_obj = self.klass("Europe/London") + + self.assertIsNot(base_obj, sub_obj) + self.assertIsInstance(base_obj, self.parent_klass) + self.assertIsInstance(sub_obj, self.klass) + + +class CZoneInfoSubclassTest(ZoneInfoSubclassTest): + module = c_zoneinfo + + +class ZoneInfoV1Test(ZoneInfoTest): + @property + def zoneinfo_data(self): + return ZONEINFO_DATA_V1 + + def load_transition_examples(self, key): + # We will discard zdump examples outside the range epoch +/- 2**31, + # because they are not well-supported in Version 1 files. + epoch = datetime(1970, 1, 1) + max_offset_32 = timedelta(seconds=2 ** 31) + min_dt = epoch - max_offset_32 + max_dt = epoch + max_offset_32 + + for zt in ZoneDumpData.load_transition_examples(key): + if min_dt <= zt.transition <= max_dt: + yield zt + + +class CZoneInfoV1Test(ZoneInfoV1Test): + module = c_zoneinfo + + +@unittest.skipIf( + not HAS_TZDATA_PKG, "Skipping tzdata-specific tests: tzdata not installed" +) +class TZDataTests(ZoneInfoTest): + """ + Runs all the ZoneInfoTest tests, but against the tzdata package + + NOTE: The ZoneDumpData has frozen test data, but tzdata will update, so + some of the tests (particularly those related to the far future) may break + in the event that the time zone policies in the relevant time zones change. + """ + + @property + def tzpath(self): + return [] + + @property + def block_tzdata(self): + return False + + def zone_from_key(self, key): + return self.klass(key=key) + + +@unittest.skipIf( + not HAS_TZDATA_PKG, "Skipping tzdata-specific tests: tzdata not installed" +) +class CTZDataTests(TZDataTests): + module = c_zoneinfo + + +class WeirdZoneTest(ZoneInfoTestBase): + module = py_zoneinfo + + def test_one_transition(self): + LMT = ZoneOffset("LMT", -timedelta(hours=6, minutes=31, seconds=2)) + STD = ZoneOffset("STD", -timedelta(hours=6)) + + transitions = [ + ZoneTransition(datetime(1883, 6, 9, 14), LMT, STD), + ] + + after = "STD6" + + zf = self.construct_zone(transitions, after) + zi = self.klass.from_file(zf) + + dt0 = datetime(1883, 6, 9, 1, tzinfo=zi) + dt1 = datetime(1883, 6, 10, 1, tzinfo=zi) + + for dt, offset in [(dt0, LMT), (dt1, STD)]: + with self.subTest(name="local", dt=dt): + self.assertEqual(dt.tzname(), offset.tzname) + self.assertEqual(dt.utcoffset(), offset.utcoffset) + self.assertEqual(dt.dst(), offset.dst) + + dts = [ + ( + datetime(1883, 6, 9, 1, tzinfo=zi), + datetime(1883, 6, 9, 7, 31, 2, tzinfo=timezone.utc), + ), + ( + datetime(2010, 4, 1, 12, tzinfo=zi), + datetime(2010, 4, 1, 18, tzinfo=timezone.utc), + ), + ] + + for dt_local, dt_utc in dts: + with self.subTest(name="fromutc", dt=dt_local): + dt_actual = dt_utc.astimezone(zi) + self.assertEqual(dt_actual, dt_local) + + dt_utc_actual = dt_local.astimezone(timezone.utc) + self.assertEqual(dt_utc_actual, dt_utc) + + def test_one_zone_dst(self): + DST = ZoneOffset("DST", ONE_H, ONE_H) + transitions = [ + ZoneTransition(datetime(1970, 1, 1), DST, DST), + ] + + after = "STD0DST-1,0/0,J365/25" + + zf = self.construct_zone(transitions, after) + zi = self.klass.from_file(zf) + + dts = [ + datetime(1900, 3, 1), + datetime(1965, 9, 12), + datetime(1970, 1, 1), + datetime(2010, 11, 3), + datetime(2040, 1, 1), + ] + + for dt in dts: + dt = dt.replace(tzinfo=zi) + with self.subTest(dt=dt): + self.assertEqual(dt.tzname(), DST.tzname) + self.assertEqual(dt.utcoffset(), DST.utcoffset) + self.assertEqual(dt.dst(), DST.dst) + + def test_no_tz_str(self): + STD = ZoneOffset("STD", ONE_H, ZERO) + DST = ZoneOffset("DST", 2 * ONE_H, ONE_H) + + transitions = [] + for year in range(1996, 2000): + transitions.append( + ZoneTransition(datetime(year, 3, 1, 2), STD, DST) + ) + transitions.append( + ZoneTransition(datetime(year, 11, 1, 2), DST, STD) + ) + + after = "" + + zf = self.construct_zone(transitions, after) + + # According to RFC 8536, local times after the last transition time + # with an empty TZ string are unspecified. We will go with "hold the + # last transition", but the most we should promise is "doesn't crash." + zi = self.klass.from_file(zf) + + cases = [ + (datetime(1995, 1, 1), STD), + (datetime(1996, 4, 1), DST), + (datetime(1996, 11, 2), STD), + (datetime(2001, 1, 1), STD), + ] + + for dt, offset in cases: + dt = dt.replace(tzinfo=zi) + with self.subTest(dt=dt): + self.assertEqual(dt.tzname(), offset.tzname) + self.assertEqual(dt.utcoffset(), offset.utcoffset) + self.assertEqual(dt.dst(), offset.dst) + + # Test that offsets return None when using a datetime.time + t = time(0, tzinfo=zi) + with self.subTest("Testing datetime.time"): + self.assertIs(t.tzname(), None) + self.assertIs(t.utcoffset(), None) + self.assertIs(t.dst(), None) + + def test_tz_before_only(self): + # From RFC 8536 Section 3.2: + # + # If there are no transitions, local time for all timestamps is + # specified by the TZ string in the footer if present and nonempty; + # otherwise, it is specified by time type 0. + + offsets = [ + ZoneOffset("STD", ZERO, ZERO), + ZoneOffset("DST", ONE_H, ONE_H), + ] + + for offset in offsets: + # Phantom transition to set time type 0. + transitions = [ + ZoneTransition(None, offset, offset), + ] + + after = "" + + zf = self.construct_zone(transitions, after) + zi = self.klass.from_file(zf) + + dts = [ + datetime(1900, 1, 1), + datetime(1970, 1, 1), + datetime(2000, 1, 1), + ] + + for dt in dts: + dt = dt.replace(tzinfo=zi) + with self.subTest(offset=offset, dt=dt): + self.assertEqual(dt.tzname(), offset.tzname) + self.assertEqual(dt.utcoffset(), offset.utcoffset) + self.assertEqual(dt.dst(), offset.dst) + + def test_empty_zone(self): + zf = self.construct_zone([], "") + + with self.assertRaises(ValueError): + self.klass.from_file(zf) + + def test_zone_very_large_timestamp(self): + """Test when a transition is in the far past or future. + + Particularly, this is a concern if something: + + 1. Attempts to call ``datetime.timestamp`` for a datetime outside + of ``[datetime.min, datetime.max]``. + 2. Attempts to construct a timedelta outside of + ``[timedelta.min, timedelta.max]``. + + This actually occurs "in the wild", as some time zones on Ubuntu (at + least as of 2020) have an initial transition added at ``-2**58``. + """ + + LMT = ZoneOffset("LMT", timedelta(seconds=-968)) + GMT = ZoneOffset("GMT", ZERO) + + transitions = [ + (-(1 << 62), LMT, LMT), + ZoneTransition(datetime(1912, 1, 1), LMT, GMT), + ((1 << 62), GMT, GMT), + ] + + after = "GMT0" + + zf = self.construct_zone(transitions, after) + zi = self.klass.from_file(zf, key="Africa/Abidjan") + + offset_cases = [ + (datetime.min, LMT), + (datetime.max, GMT), + (datetime(1911, 12, 31), LMT), + (datetime(1912, 1, 2), GMT), + ] + + for dt_naive, offset in offset_cases: + dt = dt_naive.replace(tzinfo=zi) + with self.subTest(name="offset", dt=dt, offset=offset): + self.assertEqual(dt.tzname(), offset.tzname) + self.assertEqual(dt.utcoffset(), offset.utcoffset) + self.assertEqual(dt.dst(), offset.dst) + + utc_cases = [ + (datetime.min, datetime.min + timedelta(seconds=968)), + (datetime(1898, 12, 31, 23, 43, 52), datetime(1899, 1, 1)), + ( + datetime(1911, 12, 31, 23, 59, 59, 999999), + datetime(1912, 1, 1, 0, 16, 7, 999999), + ), + (datetime(1912, 1, 1, 0, 16, 8), datetime(1912, 1, 1, 0, 16, 8)), + (datetime(1970, 1, 1), datetime(1970, 1, 1)), + (datetime.max, datetime.max), + ] + + for naive_dt, naive_dt_utc in utc_cases: + dt = naive_dt.replace(tzinfo=zi) + dt_utc = naive_dt_utc.replace(tzinfo=timezone.utc) + + self.assertEqual(dt_utc.astimezone(zi), dt) + self.assertEqual(dt, dt_utc) + + def test_fixed_offset_phantom_transition(self): + UTC = ZoneOffset("UTC", ZERO, ZERO) + + transitions = [ZoneTransition(datetime(1970, 1, 1), UTC, UTC)] + + after = "UTC0" + zf = self.construct_zone(transitions, after) + zi = self.klass.from_file(zf, key="UTC") + + dt = datetime(2020, 1, 1, tzinfo=zi) + with self.subTest("datetime.datetime"): + self.assertEqual(dt.tzname(), UTC.tzname) + self.assertEqual(dt.utcoffset(), UTC.utcoffset) + self.assertEqual(dt.dst(), UTC.dst) + + t = time(0, tzinfo=zi) + with self.subTest("datetime.time"): + self.assertEqual(t.tzname(), UTC.tzname) + self.assertEqual(t.utcoffset(), UTC.utcoffset) + self.assertEqual(t.dst(), UTC.dst) + + def construct_zone(self, transitions, after=None, version=3): + # These are not used for anything, so we're not going to include + # them for now. + isutc = [] + isstd = [] + leap_seconds = [] + + offset_lists = [[], []] + trans_times_lists = [[], []] + trans_idx_lists = [[], []] + + v1_range = (-(2 ** 31), 2 ** 31) + v2_range = (-(2 ** 63), 2 ** 63) + ranges = [v1_range, v2_range] + + def zt_as_tuple(zt): + # zt may be a tuple (timestamp, offset_before, offset_after) or + # a ZoneTransition object — this is to allow the timestamp to be + # values that are outside the valid range for datetimes but still + # valid 64-bit timestamps. + if isinstance(zt, tuple): + return zt + + if zt.transition: + trans_time = int(zt.transition_utc.timestamp()) + else: + trans_time = None + + return (trans_time, zt.offset_before, zt.offset_after) + + transitions = sorted(map(zt_as_tuple, transitions), key=lambda x: x[0]) + + for zt in transitions: + trans_time, offset_before, offset_after = zt + + for v, (dt_min, dt_max) in enumerate(ranges): + offsets = offset_lists[v] + trans_times = trans_times_lists[v] + trans_idx = trans_idx_lists[v] + + if trans_time is not None and not ( + dt_min <= trans_time <= dt_max + ): + continue + + if offset_before not in offsets: + offsets.append(offset_before) + + if offset_after not in offsets: + offsets.append(offset_after) + + if trans_time is not None: + trans_times.append(trans_time) + trans_idx.append(offsets.index(offset_after)) + + isutcnt = len(isutc) + isstdcnt = len(isstd) + leapcnt = len(leap_seconds) + + zonefile = io.BytesIO() + + time_types = ("l", "q") + for v in range(min((version, 2))): + offsets = offset_lists[v] + trans_times = trans_times_lists[v] + trans_idx = trans_idx_lists[v] + time_type = time_types[v] + + # Translate the offsets into something closer to the C values + abbrstr = bytearray() + ttinfos = [] + + for offset in offsets: + utcoff = int(offset.utcoffset.total_seconds()) + isdst = bool(offset.dst) + abbrind = len(abbrstr) + + ttinfos.append((utcoff, isdst, abbrind)) + abbrstr += offset.tzname.encode("ascii") + b"\x00" + abbrstr = bytes(abbrstr) + + typecnt = len(offsets) + timecnt = len(trans_times) + charcnt = len(abbrstr) + + # Write the header + zonefile.write(b"TZif") + zonefile.write(b"%d" % version) + zonefile.write(b" " * 15) + zonefile.write( + struct.pack( + ">6l", isutcnt, isstdcnt, leapcnt, timecnt, typecnt, charcnt + ) + ) + + # Now the transition data + zonefile.write(struct.pack(f">{timecnt}{time_type}", *trans_times)) + zonefile.write(struct.pack(f">{timecnt}B", *trans_idx)) + + for ttinfo in ttinfos: + zonefile.write(struct.pack(">lbb", *ttinfo)) + + zonefile.write(bytes(abbrstr)) + + # Now the metadata and leap seconds + zonefile.write(struct.pack(f"{isutcnt}b", *isutc)) + zonefile.write(struct.pack(f"{isstdcnt}b", *isstd)) + zonefile.write(struct.pack(f">{leapcnt}l", *leap_seconds)) + + # Finally we write the TZ string if we're writing a Version 2+ file + if v > 0: + zonefile.write(b"\x0A") + zonefile.write(after.encode("ascii")) + zonefile.write(b"\x0A") + + zonefile.seek(0) + return zonefile + + +class CWeirdZoneTest(WeirdZoneTest): + module = c_zoneinfo + + +class TZStrTest(ZoneInfoTestBase): + module = py_zoneinfo + + NORMAL = 0 + FOLD = 1 + GAP = 2 + + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls._populate_test_cases() + cls.populate_tzstr_header() + + @classmethod + def populate_tzstr_header(cls): + out = bytearray() + # The TZif format always starts with a Version 1 file followed by + # the Version 2+ file. In this case, we have no transitions, just + # the tzstr in the footer, so up to the footer, the files are + # identical and we can just write the same file twice in a row. + for _ in range(2): + out += b"TZif" # Magic value + out += b"3" # Version + out += b" " * 15 # Reserved + + # We will not write any of the manual transition parts + out += struct.pack(">6l", 0, 0, 0, 0, 0, 0) + + cls._tzif_header = bytes(out) + + def zone_from_tzstr(self, tzstr): + """Creates a zoneinfo file following a POSIX rule.""" + zonefile = io.BytesIO(self._tzif_header) + zonefile.seek(0, 2) + + # Write the footer + zonefile.write(b"\x0A") + zonefile.write(tzstr.encode("ascii")) + zonefile.write(b"\x0A") + + zonefile.seek(0) + + return self.klass.from_file(zonefile, key=tzstr) + + def test_tzstr_localized(self): + for tzstr, cases in self.test_cases.items(): + with self.subTest(tzstr=tzstr): + zi = self.zone_from_tzstr(tzstr) + + for dt_naive, offset, _ in cases: + dt = dt_naive.replace(tzinfo=zi) + + with self.subTest(tzstr=tzstr, dt=dt, offset=offset): + self.assertEqual(dt.tzname(), offset.tzname) + self.assertEqual(dt.utcoffset(), offset.utcoffset) + self.assertEqual(dt.dst(), offset.dst) + + def test_tzstr_from_utc(self): + for tzstr, cases in self.test_cases.items(): + with self.subTest(tzstr=tzstr): + zi = self.zone_from_tzstr(tzstr) + + for dt_naive, offset, dt_type in cases: + if dt_type == self.GAP: + continue # Cannot create a gap from UTC + + dt_utc = (dt_naive - offset.utcoffset).replace( + tzinfo=timezone.utc + ) + + # Check that we can go UTC -> Our zone + dt_act = dt_utc.astimezone(zi) + dt_exp = dt_naive.replace(tzinfo=zi) + + self.assertEqual(dt_act, dt_exp) + + if dt_type == self.FOLD: + self.assertEqual(dt_act.fold, dt_naive.fold, dt_naive) + else: + self.assertEqual(dt_act.fold, 0) + + # Now check that we can go our zone -> UTC + dt_act = dt_exp.astimezone(timezone.utc) + + self.assertEqual(dt_act, dt_utc) + + def test_invalid_tzstr(self): + invalid_tzstrs = [ + "PST8PDT", # DST but no transition specified + "+11", # Unquoted alphanumeric + "GMT,M3.2.0/2,M11.1.0/3", # Transition rule but no DST + "GMT0+11,M3.2.0/2,M11.1.0/3", # Unquoted alphanumeric in DST + "PST8PDT,M3.2.0/2", # Only one transition rule + # Invalid offsets + "STD+25", + "STD-25", + "STD+374", + "STD+374DST,M3.2.0/2,M11.1.0/3", + "STD+23DST+25,M3.2.0/2,M11.1.0/3", + "STD-23DST-25,M3.2.0/2,M11.1.0/3", + # Completely invalid dates + "AAA4BBB,M1443339,M11.1.0/3", + "AAA4BBB,M3.2.0/2,0349309483959c", + # Invalid months + "AAA4BBB,M13.1.1/2,M1.1.1/2", + "AAA4BBB,M1.1.1/2,M13.1.1/2", + "AAA4BBB,M0.1.1/2,M1.1.1/2", + "AAA4BBB,M1.1.1/2,M0.1.1/2", + # Invalid weeks + "AAA4BBB,M1.6.1/2,M1.1.1/2", + "AAA4BBB,M1.1.1/2,M1.6.1/2", + # Invalid weekday + "AAA4BBB,M1.1.7/2,M2.1.1/2", + "AAA4BBB,M1.1.1/2,M2.1.7/2", + # Invalid numeric offset + "AAA4BBB,-1/2,20/2", + "AAA4BBB,1/2,-1/2", + "AAA4BBB,367,20/2", + "AAA4BBB,1/2,367/2", + # Invalid julian offset + "AAA4BBB,J0/2,J20/2", + "AAA4BBB,J20/2,J366/2", + ] + + for invalid_tzstr in invalid_tzstrs: + with self.subTest(tzstr=invalid_tzstr): + # Not necessarily a guaranteed property, but we should show + # the problematic TZ string if that's the cause of failure. + tzstr_regex = re.escape(invalid_tzstr) + with self.assertRaisesRegex(ValueError, tzstr_regex): + self.zone_from_tzstr(invalid_tzstr) + + @classmethod + def _populate_test_cases(cls): + # This method uses a somewhat unusual style in that it populates the + # test cases for each tzstr by using a decorator to automatically call + # a function that mutates the current dictionary of test cases. + # + # The population of the test cases is done in individual functions to + # give each set of test cases its own namespace in which to define + # its offsets (this way we don't have to worry about variable reuse + # causing problems if someone makes a typo). + # + # The decorator for calling is used to make it more obvious that each + # function is actually called (if it's not decorated, it's not called). + def call(f): + """Decorator to call the addition methods. + + This will call a function which adds at least one new entry into + the `cases` dictionary. The decorator will also assert that + something was added to the dictionary. + """ + prev_len = len(cases) + f() + assert len(cases) > prev_len, "Function did not add a test case!" + + NORMAL = cls.NORMAL + FOLD = cls.FOLD + GAP = cls.GAP + + cases = {} + + @call + def _add(): + # Transition to EDT on the 2nd Sunday in March at 4 AM, and + # transition back on the first Sunday in November at 3AM + tzstr = "EST5EDT,M3.2.0/4:00,M11.1.0/3:00" + + EST = ZoneOffset("EST", timedelta(hours=-5), ZERO) + EDT = ZoneOffset("EDT", timedelta(hours=-4), ONE_H) + + cases[tzstr] = ( + (datetime(2019, 3, 9), EST, NORMAL), + (datetime(2019, 3, 10, 3, 59), EST, NORMAL), + (datetime(2019, 3, 10, 4, 0, fold=0), EST, GAP), + (datetime(2019, 3, 10, 4, 0, fold=1), EDT, GAP), + (datetime(2019, 3, 10, 4, 1, fold=0), EST, GAP), + (datetime(2019, 3, 10, 4, 1, fold=1), EDT, GAP), + (datetime(2019, 11, 2), EDT, NORMAL), + (datetime(2019, 11, 3, 1, 59, fold=1), EDT, NORMAL), + (datetime(2019, 11, 3, 2, 0, fold=0), EDT, FOLD), + (datetime(2019, 11, 3, 2, 0, fold=1), EST, FOLD), + (datetime(2020, 3, 8, 3, 59), EST, NORMAL), + (datetime(2020, 3, 8, 4, 0, fold=0), EST, GAP), + (datetime(2020, 3, 8, 4, 0, fold=1), EDT, GAP), + (datetime(2020, 11, 1, 1, 59, fold=1), EDT, NORMAL), + (datetime(2020, 11, 1, 2, 0, fold=0), EDT, FOLD), + (datetime(2020, 11, 1, 2, 0, fold=1), EST, FOLD), + ) + + @call + def _add(): + # Transition to BST happens on the last Sunday in March at 1 AM GMT + # and the transition back happens the last Sunday in October at 2AM BST + tzstr = "GMT0BST-1,M3.5.0/1:00,M10.5.0/2:00" + + GMT = ZoneOffset("GMT", ZERO, ZERO) + BST = ZoneOffset("BST", ONE_H, ONE_H) + + cases[tzstr] = ( + (datetime(2019, 3, 30), GMT, NORMAL), + (datetime(2019, 3, 31, 0, 59), GMT, NORMAL), + (datetime(2019, 3, 31, 2, 0), BST, NORMAL), + (datetime(2019, 10, 26), BST, NORMAL), + (datetime(2019, 10, 27, 0, 59, fold=1), BST, NORMAL), + (datetime(2019, 10, 27, 1, 0, fold=0), BST, GAP), + (datetime(2019, 10, 27, 2, 0, fold=1), GMT, GAP), + (datetime(2020, 3, 29, 0, 59), GMT, NORMAL), + (datetime(2020, 3, 29, 2, 0), BST, NORMAL), + (datetime(2020, 10, 25, 0, 59, fold=1), BST, NORMAL), + (datetime(2020, 10, 25, 1, 0, fold=0), BST, FOLD), + (datetime(2020, 10, 25, 2, 0, fold=1), GMT, NORMAL), + ) + + @call + def _add(): + # Austrialian time zone - DST start is chronologically first + tzstr = "AEST-10AEDT,M10.1.0/2,M4.1.0/3" + + AEST = ZoneOffset("AEST", timedelta(hours=10), ZERO) + AEDT = ZoneOffset("AEDT", timedelta(hours=11), ONE_H) + + cases[tzstr] = ( + (datetime(2019, 4, 6), AEDT, NORMAL), + (datetime(2019, 4, 7, 1, 59), AEDT, NORMAL), + (datetime(2019, 4, 7, 1, 59, fold=1), AEDT, NORMAL), + (datetime(2019, 4, 7, 2, 0, fold=0), AEDT, FOLD), + (datetime(2019, 4, 7, 2, 1, fold=0), AEDT, FOLD), + (datetime(2019, 4, 7, 2, 0, fold=1), AEST, FOLD), + (datetime(2019, 4, 7, 2, 1, fold=1), AEST, FOLD), + (datetime(2019, 4, 7, 3, 0, fold=0), AEST, NORMAL), + (datetime(2019, 4, 7, 3, 0, fold=1), AEST, NORMAL), + (datetime(2019, 10, 5, 0), AEST, NORMAL), + (datetime(2019, 10, 6, 1, 59), AEST, NORMAL), + (datetime(2019, 10, 6, 2, 0, fold=0), AEST, GAP), + (datetime(2019, 10, 6, 2, 0, fold=1), AEDT, GAP), + (datetime(2019, 10, 6, 3, 0), AEDT, NORMAL), + ) + + @call + def _add(): + # Irish time zone - negative DST + tzstr = "IST-1GMT0,M10.5.0,M3.5.0/1" + + GMT = ZoneOffset("GMT", ZERO, -ONE_H) + IST = ZoneOffset("IST", ONE_H, ZERO) + + cases[tzstr] = ( + (datetime(2019, 3, 30), GMT, NORMAL), + (datetime(2019, 3, 31, 0, 59), GMT, NORMAL), + (datetime(2019, 3, 31, 2, 0), IST, NORMAL), + (datetime(2019, 10, 26), IST, NORMAL), + (datetime(2019, 10, 27, 0, 59, fold=1), IST, NORMAL), + (datetime(2019, 10, 27, 1, 0, fold=0), IST, FOLD), + (datetime(2019, 10, 27, 1, 0, fold=1), GMT, FOLD), + (datetime(2019, 10, 27, 2, 0, fold=1), GMT, NORMAL), + (datetime(2020, 3, 29, 0, 59), GMT, NORMAL), + (datetime(2020, 3, 29, 2, 0), IST, NORMAL), + (datetime(2020, 10, 25, 0, 59, fold=1), IST, NORMAL), + (datetime(2020, 10, 25, 1, 0, fold=0), IST, FOLD), + (datetime(2020, 10, 25, 2, 0, fold=1), GMT, NORMAL), + ) + + @call + def _add(): + # Pacific/Kosrae: Fixed offset zone with a quoted numerical tzname + tzstr = "<+11>-11" + + cases[tzstr] = ( + ( + datetime(2020, 1, 1), + ZoneOffset("+11", timedelta(hours=11)), + NORMAL, + ), + ) + + @call + def _add(): + # Quoted STD and DST, transitions at 24:00 + tzstr = "<-04>4<-03>,M9.1.6/24,M4.1.6/24" + + M04 = ZoneOffset("-04", timedelta(hours=-4)) + M03 = ZoneOffset("-03", timedelta(hours=-3), ONE_H) + + cases[tzstr] = ( + (datetime(2020, 5, 1), M04, NORMAL), + (datetime(2020, 11, 1), M03, NORMAL), + ) + + @call + def _add(): + # Permanent daylight saving time is modeled with transitions at 0/0 + # and J365/25, as mentioned in RFC 8536 Section 3.3.1 + tzstr = "EST5EDT,0/0,J365/25" + + EDT = ZoneOffset("EDT", timedelta(hours=-4), ONE_H) + + cases[tzstr] = ( + (datetime(2019, 1, 1), EDT, NORMAL), + (datetime(2019, 6, 1), EDT, NORMAL), + (datetime(2019, 12, 31, 23, 59, 59, 999999), EDT, NORMAL), + (datetime(2020, 1, 1), EDT, NORMAL), + (datetime(2020, 3, 1), EDT, NORMAL), + (datetime(2020, 6, 1), EDT, NORMAL), + (datetime(2020, 12, 31, 23, 59, 59, 999999), EDT, NORMAL), + (datetime(2400, 1, 1), EDT, NORMAL), + (datetime(2400, 3, 1), EDT, NORMAL), + (datetime(2400, 12, 31, 23, 59, 59, 999999), EDT, NORMAL), + ) + + @call + def _add(): + # Transitions on March 1st and November 1st of each year + tzstr = "AAA3BBB,J60/12,J305/12" + + AAA = ZoneOffset("AAA", timedelta(hours=-3)) + BBB = ZoneOffset("BBB", timedelta(hours=-2), ONE_H) + + cases[tzstr] = ( + (datetime(2019, 1, 1), AAA, NORMAL), + (datetime(2019, 2, 28), AAA, NORMAL), + (datetime(2019, 3, 1, 11, 59), AAA, NORMAL), + (datetime(2019, 3, 1, 12, fold=0), AAA, GAP), + (datetime(2019, 3, 1, 12, fold=1), BBB, GAP), + (datetime(2019, 3, 1, 13), BBB, NORMAL), + (datetime(2019, 11, 1, 10, 59), BBB, NORMAL), + (datetime(2019, 11, 1, 11, fold=0), BBB, FOLD), + (datetime(2019, 11, 1, 11, fold=1), AAA, FOLD), + (datetime(2019, 11, 1, 12), AAA, NORMAL), + (datetime(2019, 12, 31, 23, 59, 59, 999999), AAA, NORMAL), + (datetime(2020, 1, 1), AAA, NORMAL), + (datetime(2020, 2, 29), AAA, NORMAL), + (datetime(2020, 3, 1, 11, 59), AAA, NORMAL), + (datetime(2020, 3, 1, 12, fold=0), AAA, GAP), + (datetime(2020, 3, 1, 12, fold=1), BBB, GAP), + (datetime(2020, 3, 1, 13), BBB, NORMAL), + (datetime(2020, 11, 1, 10, 59), BBB, NORMAL), + (datetime(2020, 11, 1, 11, fold=0), BBB, FOLD), + (datetime(2020, 11, 1, 11, fold=1), AAA, FOLD), + (datetime(2020, 11, 1, 12), AAA, NORMAL), + (datetime(2020, 12, 31, 23, 59, 59, 999999), AAA, NORMAL), + ) + + @call + def _add(): + # Taken from America/Godthab, this rule has a transition on the + # Saturday before the last Sunday of March and October, at 22:00 + # and 23:00, respectively. This is encoded with negative start + # and end transition times. + tzstr = "<-03>3<-02>,M3.5.0/-2,M10.5.0/-1" + + N03 = ZoneOffset("-03", timedelta(hours=-3)) + N02 = ZoneOffset("-02", timedelta(hours=-2), ONE_H) + + cases[tzstr] = ( + (datetime(2020, 3, 27), N03, NORMAL), + (datetime(2020, 3, 28, 21, 59, 59), N03, NORMAL), + (datetime(2020, 3, 28, 22, fold=0), N03, GAP), + (datetime(2020, 3, 28, 22, fold=1), N02, GAP), + (datetime(2020, 3, 28, 23), N02, NORMAL), + (datetime(2020, 10, 24, 21), N02, NORMAL), + (datetime(2020, 10, 24, 22, fold=0), N02, FOLD), + (datetime(2020, 10, 24, 22, fold=1), N03, FOLD), + (datetime(2020, 10, 24, 23), N03, NORMAL), + ) + + @call + def _add(): + # Transition times with minutes and seconds + tzstr = "AAA3BBB,M3.2.0/01:30,M11.1.0/02:15:45" + + AAA = ZoneOffset("AAA", timedelta(hours=-3)) + BBB = ZoneOffset("BBB", timedelta(hours=-2), ONE_H) + + cases[tzstr] = ( + (datetime(2012, 3, 11, 1, 0), AAA, NORMAL), + (datetime(2012, 3, 11, 1, 30, fold=0), AAA, GAP), + (datetime(2012, 3, 11, 1, 30, fold=1), BBB, GAP), + (datetime(2012, 3, 11, 2, 30), BBB, NORMAL), + (datetime(2012, 11, 4, 1, 15, 44, 999999), BBB, NORMAL), + (datetime(2012, 11, 4, 1, 15, 45, fold=0), BBB, FOLD), + (datetime(2012, 11, 4, 1, 15, 45, fold=1), AAA, FOLD), + (datetime(2012, 11, 4, 2, 15, 45), AAA, NORMAL), + ) + + cls.test_cases = cases + + +class CTZStrTest(TZStrTest): + module = c_zoneinfo + + +class ZoneInfoCacheTest(TzPathUserMixin, ZoneInfoTestBase): + module = py_zoneinfo + + def setUp(self): + self.klass.clear_cache() + super().setUp() + + @property + def zoneinfo_data(self): + return ZONEINFO_DATA + + @property + def tzpath(self): + return [self.zoneinfo_data.tzpath] + + def test_ephemeral_zones(self): + self.assertIs( + self.klass("America/Los_Angeles"), self.klass("America/Los_Angeles") + ) + + def test_strong_refs(self): + tz0 = self.klass("Australia/Sydney") + tz1 = self.klass("Australia/Sydney") + + self.assertIs(tz0, tz1) + + def test_no_cache(self): + + tz0 = self.klass("Europe/Lisbon") + tz1 = self.klass.no_cache("Europe/Lisbon") + + self.assertIsNot(tz0, tz1) + + def test_cache_reset_tzpath(self): + """Test that the cache persists when tzpath has been changed. + + The PEP specifies that as long as a reference exists to one zone + with a given key, the primary constructor must continue to return + the same object. + """ + zi0 = self.klass("America/Los_Angeles") + with self.tzpath_context([]): + zi1 = self.klass("America/Los_Angeles") + + self.assertIs(zi0, zi1) + + def test_clear_cache_explicit_none(self): + la0 = self.klass("America/Los_Angeles") + self.klass.clear_cache(only_keys=None) + la1 = self.klass("America/Los_Angeles") + + self.assertIsNot(la0, la1) + + def test_clear_cache_one_key(self): + """Tests that you can clear a single key from the cache.""" + la0 = self.klass("America/Los_Angeles") + dub0 = self.klass("Europe/Dublin") + + self.klass.clear_cache(only_keys=["America/Los_Angeles"]) + + la1 = self.klass("America/Los_Angeles") + dub1 = self.klass("Europe/Dublin") + + self.assertIsNot(la0, la1) + self.assertIs(dub0, dub1) + + def test_clear_cache_two_keys(self): + la0 = self.klass("America/Los_Angeles") + dub0 = self.klass("Europe/Dublin") + tok0 = self.klass("Asia/Tokyo") + + self.klass.clear_cache( + only_keys=["America/Los_Angeles", "Europe/Dublin"] + ) + + la1 = self.klass("America/Los_Angeles") + dub1 = self.klass("Europe/Dublin") + tok1 = self.klass("Asia/Tokyo") + + self.assertIsNot(la0, la1) + self.assertIsNot(dub0, dub1) + self.assertIs(tok0, tok1) + + +class CZoneInfoCacheTest(ZoneInfoCacheTest): + module = c_zoneinfo + + +class ZoneInfoPickleTest(TzPathUserMixin, ZoneInfoTestBase): + module = py_zoneinfo + + def setUp(self): + self.klass.clear_cache() + + with contextlib.ExitStack() as stack: + stack.enter_context(test_support.set_zoneinfo_module(self.module)) + self.addCleanup(stack.pop_all().close) + + super().setUp() + + @property + def zoneinfo_data(self): + return ZONEINFO_DATA + + @property + def tzpath(self): + return [self.zoneinfo_data.tzpath] + + def test_cache_hit(self): + zi_in = self.klass("Europe/Dublin") + pkl = pickle.dumps(zi_in) + zi_rt = pickle.loads(pkl) + + with self.subTest(test="Is non-pickled ZoneInfo"): + self.assertIs(zi_in, zi_rt) + + zi_rt2 = pickle.loads(pkl) + with self.subTest(test="Is unpickled ZoneInfo"): + self.assertIs(zi_rt, zi_rt2) + + def test_cache_miss(self): + zi_in = self.klass("Europe/Dublin") + pkl = pickle.dumps(zi_in) + + del zi_in + self.klass.clear_cache() # Induce a cache miss + zi_rt = pickle.loads(pkl) + zi_rt2 = pickle.loads(pkl) + + self.assertIs(zi_rt, zi_rt2) + + def test_no_cache(self): + zi_no_cache = self.klass.no_cache("Europe/Dublin") + + pkl = pickle.dumps(zi_no_cache) + zi_rt = pickle.loads(pkl) + + with self.subTest(test="Not the pickled object"): + self.assertIsNot(zi_rt, zi_no_cache) + + zi_rt2 = pickle.loads(pkl) + with self.subTest(test="Not a second unpickled object"): + self.assertIsNot(zi_rt, zi_rt2) + + zi_cache = self.klass("Europe/Dublin") + with self.subTest(test="Not a cached object"): + self.assertIsNot(zi_rt, zi_cache) + + def test_from_file(self): + key = "Europe/Dublin" + with open(self.zoneinfo_data.path_from_key(key), "rb") as f: + zi_nokey = self.klass.from_file(f) + + f.seek(0) + zi_key = self.klass.from_file(f, key=key) + + test_cases = [ + (zi_key, "ZoneInfo with key"), + (zi_nokey, "ZoneInfo without key"), + ] + + for zi, test_name in test_cases: + with self.subTest(test_name=test_name): + with self.assertRaises(pickle.PicklingError): + pickle.dumps(zi) + + def test_pickle_after_from_file(self): + # This may be a bit of paranoia, but this test is to ensure that no + # global state is maintained in order to handle the pickle cache and + # from_file behavior, and that it is possible to interweave the + # constructors of each of these and pickling/unpickling without issues. + key = "Europe/Dublin" + zi = self.klass(key) + + pkl_0 = pickle.dumps(zi) + zi_rt_0 = pickle.loads(pkl_0) + self.assertIs(zi, zi_rt_0) + + with open(self.zoneinfo_data.path_from_key(key), "rb") as f: + zi_ff = self.klass.from_file(f, key=key) + + pkl_1 = pickle.dumps(zi) + zi_rt_1 = pickle.loads(pkl_1) + self.assertIs(zi, zi_rt_1) + + with self.assertRaises(pickle.PicklingError): + pickle.dumps(zi_ff) + + pkl_2 = pickle.dumps(zi) + zi_rt_2 = pickle.loads(pkl_2) + self.assertIs(zi, zi_rt_2) + + +class CZoneInfoPickleTest(ZoneInfoPickleTest): + module = c_zoneinfo + + +class CallingConventionTest(ZoneInfoTestBase): + """Tests for functions with restricted calling conventions.""" + + module = py_zoneinfo + + @property + def zoneinfo_data(self): + return ZONEINFO_DATA + + def test_from_file(self): + with open(self.zoneinfo_data.path_from_key("UTC"), "rb") as f: + with self.assertRaises(TypeError): + self.klass.from_file(fobj=f) + + def test_clear_cache(self): + with self.assertRaises(TypeError): + self.klass.clear_cache(["UTC"]) + + +class CCallingConventionTest(CallingConventionTest): + module = c_zoneinfo + + +class TzPathTest(TzPathUserMixin, ZoneInfoTestBase): + module = py_zoneinfo + + @staticmethod + @contextlib.contextmanager + def python_tzpath_context(value): + path_var = "PYTHONTZPATH" + try: + with OS_ENV_LOCK: + old_env = os.environ.get(path_var, None) + os.environ[path_var] = value + yield + finally: + if old_env is None: + del os.environ[path_var] + else: + os.environ[path_var] = old_env # pragma: nocover + + def test_env_variable(self): + """Tests that the environment variable works with reset_tzpath.""" + new_paths = [ + ("", []), + ("/etc/zoneinfo", ["/etc/zoneinfo"]), + (f"/a/b/c{os.pathsep}/d/e/f", ["/a/b/c", "/d/e/f"]), + ] + + for new_path_var, expected_result in new_paths: + with self.python_tzpath_context(new_path_var): + with self.subTest(tzpath=new_path_var): + self.module.reset_tzpath() + tzpath = self.module.TZPATH + self.assertSequenceEqual(tzpath, expected_result) + + def test_env_variable_relative_paths(self): + test_cases = [ + [("path/to/somewhere",), ()], + [ + ("/usr/share/zoneinfo", "path/to/somewhere",), + ("/usr/share/zoneinfo",), + ], + [("../relative/path",), ()], + [ + ("/usr/share/zoneinfo", "../relative/path",), + ("/usr/share/zoneinfo",), + ], + [("path/to/somewhere", "../relative/path",), ()], + [ + ( + "/usr/share/zoneinfo", + "path/to/somewhere", + "../relative/path", + ), + ("/usr/share/zoneinfo",), + ], + ] + + for input_paths, expected_paths in test_cases: + path_var = os.pathsep.join(input_paths) + with self.python_tzpath_context(path_var): + with self.subTest("warning", path_var=path_var): + # Note: Per PEP 615 the warning is implementation-defined + # behavior, other implementations need not warn. + with self.assertWarns(self.module.InvalidTZPathWarning): + self.module.reset_tzpath() + + tzpath = self.module.TZPATH + with self.subTest("filtered", path_var=path_var): + self.assertSequenceEqual(tzpath, expected_paths) + + def test_reset_tzpath_kwarg(self): + self.module.reset_tzpath(to=["/a/b/c"]) + + self.assertSequenceEqual(self.module.TZPATH, ("/a/b/c",)) + + def test_reset_tzpath_relative_paths(self): + bad_values = [ + ("path/to/somewhere",), + ("/usr/share/zoneinfo", "path/to/somewhere",), + ("../relative/path",), + ("/usr/share/zoneinfo", "../relative/path",), + ("path/to/somewhere", "../relative/path",), + ("/usr/share/zoneinfo", "path/to/somewhere", "../relative/path",), + ] + for input_paths in bad_values: + with self.subTest(input_paths=input_paths): + with self.assertRaises(ValueError): + self.module.reset_tzpath(to=input_paths) + + def test_tzpath_type_error(self): + bad_values = [ + "/etc/zoneinfo:/usr/share/zoneinfo", + b"/etc/zoneinfo:/usr/share/zoneinfo", + 0, + ] + + for bad_value in bad_values: + with self.subTest(value=bad_value): + with self.assertRaises(TypeError): + self.module.reset_tzpath(bad_value) + + def test_tzpath_attribute(self): + tzpath_0 = ["/one", "/two"] + tzpath_1 = ["/three"] + + with self.tzpath_context(tzpath_0): + query_0 = self.module.TZPATH + + with self.tzpath_context(tzpath_1): + query_1 = self.module.TZPATH + + self.assertSequenceEqual(tzpath_0, query_0) + self.assertSequenceEqual(tzpath_1, query_1) + + +class CTzPathTest(TzPathTest): + module = c_zoneinfo + + +class TestModule(ZoneInfoTestBase): + module = py_zoneinfo + + @property + def zoneinfo_data(self): + return ZONEINFO_DATA + + @cached_property + def _UTC_bytes(self): + zone_file = self.zoneinfo_data.path_from_key("UTC") + with open(zone_file, "rb") as f: + return f.read() + + def touch_zone(self, key, tz_root): + """Creates a valid TZif file at key under the zoneinfo root tz_root. + + tz_root must exist, but all folders below that will be created. + """ + if not os.path.exists(tz_root): + raise FileNotFoundError(f"{tz_root} does not exist.") + + root_dir, *tail = key.rsplit("/", 1) + if tail: # If there's no tail, then the first component isn't a dir + os.makedirs(os.path.join(tz_root, root_dir), exist_ok=True) + + zonefile_path = os.path.join(tz_root, key) + with open(zonefile_path, "wb") as f: + f.write(self._UTC_bytes) + + def test_getattr_error(self): + with self.assertRaises(AttributeError): + self.module.NOATTRIBUTE + + def test_dir_contains_all(self): + """dir(self.module) should at least contain everything in __all__.""" + module_all_set = set(self.module.__all__) + module_dir_set = set(dir(self.module)) + + difference = module_all_set - module_dir_set + + self.assertFalse(difference) + + def test_dir_unique(self): + """Test that there are no duplicates in dir(self.module)""" + module_dir = dir(self.module) + module_unique = set(module_dir) + + self.assertCountEqual(module_dir, module_unique) + + def test_available_timezones(self): + with self.tzpath_context([self.zoneinfo_data.tzpath]): + self.assertTrue(self.zoneinfo_data.keys) # Sanity check + + available_keys = self.module.available_timezones() + zoneinfo_keys = set(self.zoneinfo_data.keys) + + # If tzdata is not present, zoneinfo_keys == available_keys, + # otherwise it should be a subset. + union = zoneinfo_keys & available_keys + self.assertEqual(zoneinfo_keys, union) + + def test_available_timezones_weirdzone(self): + with tempfile.TemporaryDirectory() as td: + # Make a fictional zone at "Mars/Olympus_Mons" + self.touch_zone("Mars/Olympus_Mons", td) + + with self.tzpath_context([td]): + available_keys = self.module.available_timezones() + self.assertIn("Mars/Olympus_Mons", available_keys) + + def test_folder_exclusions(self): + expected = { + "America/Los_Angeles", + "America/Santiago", + "America/Indiana/Indianapolis", + "UTC", + "Europe/Paris", + "Europe/London", + "Asia/Tokyo", + "Australia/Sydney", + } + + base_tree = list(expected) + posix_tree = [f"posix/{x}" for x in base_tree] + right_tree = [f"right/{x}" for x in base_tree] + + cases = [ + ("base_tree", base_tree), + ("base_and_posix", base_tree + posix_tree), + ("base_and_right", base_tree + right_tree), + ("all_trees", base_tree + right_tree + posix_tree), + ] + + with tempfile.TemporaryDirectory() as td: + for case_name, tree in cases: + tz_root = os.path.join(td, case_name) + os.mkdir(tz_root) + + for key in tree: + self.touch_zone(key, tz_root) + + with self.tzpath_context([tz_root]): + with self.subTest(case_name): + actual = self.module.available_timezones() + self.assertEqual(actual, expected) + + def test_exclude_posixrules(self): + expected = { + "America/New_York", + "Europe/London", + } + + tree = list(expected) + ["posixrules"] + + with tempfile.TemporaryDirectory() as td: + for key in tree: + self.touch_zone(key, td) + + with self.tzpath_context([td]): + actual = self.module.available_timezones() + self.assertEqual(actual, expected) + + +class CTestModule(TestModule): + module = c_zoneinfo + + +class ExtensionBuiltTest(unittest.TestCase): + """Smoke test to ensure that the C and Python extensions are both tested. + + Because the intention is for the Python and C versions of ZoneInfo to + behave identically, these tests necessarily rely on implementation details, + so the tests may need to be adjusted if the implementations change. Do not + rely on these tests as an indication of stable properties of these classes. + """ + + def test_cache_location(self): + # The pure Python version stores caches on attributes, but the C + # extension stores them in C globals (at least for now) + self.assertFalse(hasattr(c_zoneinfo.ZoneInfo, "_weak_cache")) + self.assertTrue(hasattr(py_zoneinfo.ZoneInfo, "_weak_cache")) + + def test_gc_tracked(self): + # The pure Python version is tracked by the GC but (for now) the C + # version is not. + import gc + + self.assertTrue(gc.is_tracked(py_zoneinfo.ZoneInfo)) + self.assertFalse(gc.is_tracked(c_zoneinfo.ZoneInfo)) + + +@dataclasses.dataclass(frozen=True) +class ZoneOffset: + tzname: str + utcoffset: timedelta + dst: timedelta = ZERO + + +@dataclasses.dataclass(frozen=True) +class ZoneTransition: + transition: datetime + offset_before: ZoneOffset + offset_after: ZoneOffset + + @property + def transition_utc(self): + return (self.transition - self.offset_before.utcoffset).replace( + tzinfo=timezone.utc + ) + + @property + def fold(self): + """Whether this introduces a fold""" + return self.offset_before.utcoffset > self.offset_after.utcoffset + + @property + def gap(self): + """Whether this introduces a gap""" + return self.offset_before.utcoffset < self.offset_after.utcoffset + + @property + def delta(self): + return self.offset_after.utcoffset - self.offset_before.utcoffset + + @property + def anomaly_start(self): + if self.fold: + return self.transition + self.delta + else: + return self.transition + + @property + def anomaly_end(self): + if not self.fold: + return self.transition + self.delta + else: + return self.transition + + +class ZoneInfoData: + def __init__(self, source_json, tzpath, v1=False): + self.tzpath = pathlib.Path(tzpath) + self.keys = [] + self.v1 = v1 + self._populate_tzpath(source_json) + + def path_from_key(self, key): + return self.tzpath / key + + def _populate_tzpath(self, source_json): + with open(source_json, "rb") as f: + zoneinfo_dict = json.load(f) + + zoneinfo_data = zoneinfo_dict["data"] + + for key, value in zoneinfo_data.items(): + self.keys.append(key) + raw_data = self._decode_text(value) + + if self.v1: + data = self._convert_to_v1(raw_data) + else: + data = raw_data + + destination = self.path_from_key(key) + destination.parent.mkdir(exist_ok=True, parents=True) + with open(destination, "wb") as f: + f.write(data) + + def _decode_text(self, contents): + raw_data = b"".join(map(str.encode, contents)) + decoded = base64.b85decode(raw_data) + + return lzma.decompress(decoded) + + def _convert_to_v1(self, contents): + assert contents[0:4] == b"TZif", "Invalid TZif data found!" + version = int(contents[4:5]) + + header_start = 4 + 16 + header_end = header_start + 24 # 6l == 24 bytes + assert version >= 2, "Version 1 file found: no conversion necessary" + isutcnt, isstdcnt, leapcnt, timecnt, typecnt, charcnt = struct.unpack( + ">6l", contents[header_start:header_end] + ) + + file_size = ( + timecnt * 5 + + typecnt * 6 + + charcnt + + leapcnt * 8 + + isstdcnt + + isutcnt + ) + file_size += header_end + out = b"TZif" + b"\x00" + contents[5:file_size] + + assert ( + contents[file_size : (file_size + 4)] == b"TZif" + ), "Version 2 file not truncated at Version 2 header" + + return out + + +class ZoneDumpData: + @classmethod + def transition_keys(cls): + return cls._get_zonedump().keys() + + @classmethod + def load_transition_examples(cls, key): + return cls._get_zonedump()[key] + + @classmethod + def fixed_offset_zones(cls): + if not cls._FIXED_OFFSET_ZONES: + cls._populate_fixed_offsets() + + return cls._FIXED_OFFSET_ZONES.items() + + @classmethod + def _get_zonedump(cls): + if not cls._ZONEDUMP_DATA: + cls._populate_zonedump_data() + return cls._ZONEDUMP_DATA + + @classmethod + def _populate_fixed_offsets(cls): + cls._FIXED_OFFSET_ZONES = { + "UTC": ZoneOffset("UTC", ZERO, ZERO), + } + + @classmethod + def _populate_zonedump_data(cls): + def _Africa_Abidjan(): + LMT = ZoneOffset("LMT", timedelta(seconds=-968)) + GMT = ZoneOffset("GMT", ZERO) + + return [ + ZoneTransition(datetime(1912, 1, 1), LMT, GMT), + ] + + def _Africa_Casablanca(): + P00_s = ZoneOffset("+00", ZERO, ZERO) + P01_d = ZoneOffset("+01", ONE_H, ONE_H) + P00_d = ZoneOffset("+00", ZERO, -ONE_H) + P01_s = ZoneOffset("+01", ONE_H, ZERO) + + return [ + # Morocco sometimes pauses DST during Ramadan + ZoneTransition(datetime(2018, 3, 25, 2), P00_s, P01_d), + ZoneTransition(datetime(2018, 5, 13, 3), P01_d, P00_s), + ZoneTransition(datetime(2018, 6, 17, 2), P00_s, P01_d), + # On October 28th Morocco set standard time to +01, + # with negative DST only during Ramadan + ZoneTransition(datetime(2018, 10, 28, 3), P01_d, P01_s), + ZoneTransition(datetime(2019, 5, 5, 3), P01_s, P00_d), + ZoneTransition(datetime(2019, 6, 9, 2), P00_d, P01_s), + ] + + def _America_Los_Angeles(): + LMT = ZoneOffset("LMT", timedelta(seconds=-28378), ZERO) + PST = ZoneOffset("PST", timedelta(hours=-8), ZERO) + PDT = ZoneOffset("PDT", timedelta(hours=-7), ONE_H) + PWT = ZoneOffset("PWT", timedelta(hours=-7), ONE_H) + PPT = ZoneOffset("PPT", timedelta(hours=-7), ONE_H) + + return [ + ZoneTransition(datetime(1883, 11, 18, 12, 7, 2), LMT, PST), + ZoneTransition(datetime(1918, 3, 31, 2), PST, PDT), + ZoneTransition(datetime(1918, 3, 31, 2), PST, PDT), + ZoneTransition(datetime(1918, 10, 27, 2), PDT, PST), + # Transition to Pacific War Time + ZoneTransition(datetime(1942, 2, 9, 2), PST, PWT), + # Transition from Pacific War Time to Pacific Peace Time + ZoneTransition(datetime(1945, 8, 14, 16), PWT, PPT), + ZoneTransition(datetime(1945, 9, 30, 2), PPT, PST), + ZoneTransition(datetime(2015, 3, 8, 2), PST, PDT), + ZoneTransition(datetime(2015, 11, 1, 2), PDT, PST), + # After 2038: Rules continue indefinitely + ZoneTransition(datetime(2450, 3, 13, 2), PST, PDT), + ZoneTransition(datetime(2450, 11, 6, 2), PDT, PST), + ] + + def _America_Santiago(): + LMT = ZoneOffset("LMT", timedelta(seconds=-16966), ZERO) + SMT = ZoneOffset("SMT", timedelta(seconds=-16966), ZERO) + N05 = ZoneOffset("-05", timedelta(seconds=-18000), ZERO) + N04 = ZoneOffset("-04", timedelta(seconds=-14400), ZERO) + N03 = ZoneOffset("-03", timedelta(seconds=-10800), ONE_H) + + return [ + ZoneTransition(datetime(1890, 1, 1), LMT, SMT), + ZoneTransition(datetime(1910, 1, 10), SMT, N05), + ZoneTransition(datetime(1916, 7, 1), N05, SMT), + ZoneTransition(datetime(2008, 3, 30), N03, N04), + ZoneTransition(datetime(2008, 10, 12), N04, N03), + ZoneTransition(datetime(2040, 4, 8), N03, N04), + ZoneTransition(datetime(2040, 9, 2), N04, N03), + ] + + def _Asia_Tokyo(): + JST = ZoneOffset("JST", timedelta(seconds=32400), ZERO) + JDT = ZoneOffset("JDT", timedelta(seconds=36000), ONE_H) + + # Japan had DST from 1948 to 1951, and it was unusual in that + # the transition from DST to STD occurred at 25:00, and is + # denominated as such in the time zone database + return [ + ZoneTransition(datetime(1948, 5, 2), JST, JDT), + ZoneTransition(datetime(1948, 9, 12, 1), JDT, JST), + ZoneTransition(datetime(1951, 9, 9, 1), JDT, JST), + ] + + def _Australia_Sydney(): + LMT = ZoneOffset("LMT", timedelta(seconds=36292), ZERO) + AEST = ZoneOffset("AEST", timedelta(seconds=36000), ZERO) + AEDT = ZoneOffset("AEDT", timedelta(seconds=39600), ONE_H) + + return [ + ZoneTransition(datetime(1895, 2, 1), LMT, AEST), + ZoneTransition(datetime(1917, 1, 1, 0, 1), AEST, AEDT), + ZoneTransition(datetime(1917, 3, 25, 2), AEDT, AEST), + ZoneTransition(datetime(2012, 4, 1, 3), AEDT, AEST), + ZoneTransition(datetime(2012, 10, 7, 2), AEST, AEDT), + ZoneTransition(datetime(2040, 4, 1, 3), AEDT, AEST), + ZoneTransition(datetime(2040, 10, 7, 2), AEST, AEDT), + ] + + def _Europe_Dublin(): + LMT = ZoneOffset("LMT", timedelta(seconds=-1500), ZERO) + DMT = ZoneOffset("DMT", timedelta(seconds=-1521), ZERO) + IST_0 = ZoneOffset("IST", timedelta(seconds=2079), ONE_H) + GMT_0 = ZoneOffset("GMT", ZERO, ZERO) + BST = ZoneOffset("BST", ONE_H, ONE_H) + GMT_1 = ZoneOffset("GMT", ZERO, -ONE_H) + IST_1 = ZoneOffset("IST", ONE_H, ZERO) + + return [ + ZoneTransition(datetime(1880, 8, 2, 0), LMT, DMT), + ZoneTransition(datetime(1916, 5, 21, 2), DMT, IST_0), + ZoneTransition(datetime(1916, 10, 1, 3), IST_0, GMT_0), + ZoneTransition(datetime(1917, 4, 8, 2), GMT_0, BST), + ZoneTransition(datetime(2016, 3, 27, 1), GMT_1, IST_1), + ZoneTransition(datetime(2016, 10, 30, 2), IST_1, GMT_1), + ZoneTransition(datetime(2487, 3, 30, 1), GMT_1, IST_1), + ZoneTransition(datetime(2487, 10, 26, 2), IST_1, GMT_1), + ] + + def _Europe_Lisbon(): + WET = ZoneOffset("WET", ZERO, ZERO) + WEST = ZoneOffset("WEST", ONE_H, ONE_H) + CET = ZoneOffset("CET", ONE_H, ZERO) + CEST = ZoneOffset("CEST", timedelta(seconds=7200), ONE_H) + + return [ + ZoneTransition(datetime(1992, 3, 29, 1), WET, WEST), + ZoneTransition(datetime(1992, 9, 27, 2), WEST, CET), + ZoneTransition(datetime(1993, 3, 28, 2), CET, CEST), + ZoneTransition(datetime(1993, 9, 26, 3), CEST, CET), + ZoneTransition(datetime(1996, 3, 31, 2), CET, WEST), + ZoneTransition(datetime(1996, 10, 27, 2), WEST, WET), + ] + + def _Europe_London(): + LMT = ZoneOffset("LMT", timedelta(seconds=-75), ZERO) + GMT = ZoneOffset("GMT", ZERO, ZERO) + BST = ZoneOffset("BST", ONE_H, ONE_H) + + return [ + ZoneTransition(datetime(1847, 12, 1), LMT, GMT), + ZoneTransition(datetime(2005, 3, 27, 1), GMT, BST), + ZoneTransition(datetime(2005, 10, 30, 2), BST, GMT), + ZoneTransition(datetime(2043, 3, 29, 1), GMT, BST), + ZoneTransition(datetime(2043, 10, 25, 2), BST, GMT), + ] + + def _Pacific_Kiritimati(): + LMT = ZoneOffset("LMT", timedelta(seconds=-37760), ZERO) + N1040 = ZoneOffset("-1040", timedelta(seconds=-38400), ZERO) + N10 = ZoneOffset("-10", timedelta(seconds=-36000), ZERO) + P14 = ZoneOffset("+14", timedelta(seconds=50400), ZERO) + + # This is literally every transition in Christmas Island history + return [ + ZoneTransition(datetime(1901, 1, 1), LMT, N1040), + ZoneTransition(datetime(1979, 10, 1), N1040, N10), + # They skipped December 31, 1994 + ZoneTransition(datetime(1994, 12, 31), N10, P14), + ] + + cls._ZONEDUMP_DATA = { + "Africa/Abidjan": _Africa_Abidjan(), + "Africa/Casablanca": _Africa_Casablanca(), + "America/Los_Angeles": _America_Los_Angeles(), + "America/Santiago": _America_Santiago(), + "Australia/Sydney": _Australia_Sydney(), + "Asia/Tokyo": _Asia_Tokyo(), + "Europe/Dublin": _Europe_Dublin(), + "Europe/Lisbon": _Europe_Lisbon(), + "Europe/London": _Europe_London(), + "Pacific/Kiritimati": _Pacific_Kiritimati(), + } + + _ZONEDUMP_DATA = None + _FIXED_OFFSET_ZONES = None diff --git a/Lib/threading.py b/Lib/threading.py index 813dae2aa9f8e5d3b565482f033394ba3cbb9bc7..d96d99a713e90432155acdc1f9c8f08ff52e0f08 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -3,6 +3,7 @@ import os as _os import sys as _sys import _thread +import functools from time import monotonic as _time from _weakrefset import WeakSet @@ -121,6 +122,11 @@ def __repr__(self): hex(id(self)) ) + def _at_fork_reinit(self): + self._block._at_fork_reinit() + self._owner = None + self._count = 0 + def acquire(self, blocking=True, timeout=-1): """Acquire a lock, blocking or non-blocking. @@ -243,6 +249,10 @@ def __init__(self, lock=None): pass self._waiters = _deque() + def _at_fork_reinit(self): + self._lock._at_fork_reinit() + self._waiters.clear() + def __enter__(self): return self._lock.__enter__() @@ -261,7 +271,7 @@ def _acquire_restore(self, x): def _is_owned(self): # Return True if lock is owned by current_thread. # This method is called only if _lock doesn't have _is_owned(). - if self._lock.acquire(0): + if self._lock.acquire(False): self._lock.release() return False else: @@ -438,16 +448,19 @@ def acquire(self, blocking=True, timeout=None): __enter__ = acquire - def release(self): - """Release a semaphore, incrementing the internal counter by one. + def release(self, n=1): + """Release a semaphore, incrementing the internal counter by one or more. When the counter is zero on entry and another thread is waiting for it to become larger than zero again, wake up that thread. """ + if n < 1: + raise ValueError('n must be one or more') with self._cond: - self._value += 1 - self._cond.notify() + self._value += n + for i in range(n): + self._cond.notify() def __exit__(self, t, v, tb): self.release() @@ -474,8 +487,8 @@ def __init__(self, value=1): Semaphore.__init__(self, value) self._initial_value = value - def release(self): - """Release a semaphore, incrementing the internal counter by one. + def release(self, n=1): + """Release a semaphore, incrementing the internal counter by one or more. When the counter is zero on entry and another thread is waiting for it to become larger than zero again, wake up that thread. @@ -484,11 +497,14 @@ def release(self): raise a ValueError. """ + if n < 1: + raise ValueError('n must be one or more') with self._cond: - if self._value >= self._initial_value: + if self._value + n > self._initial_value: raise ValueError("Semaphore released too many times") - self._value += 1 - self._cond.notify() + self._value += n + for i in range(n): + self._cond.notify() class Event: @@ -506,9 +522,9 @@ def __init__(self): self._cond = Condition(Lock()) self._flag = False - def _reset_internal_locks(self): - # private! called by Thread._reset_internal_locks by _after_fork() - self._cond.__init__(Lock()) + def _at_fork_reinit(self): + # Private method called by Thread._reset_internal_locks() + self._cond._at_fork_reinit() def is_set(self): """Return true if and only if the internal flag is true.""" @@ -808,9 +824,14 @@ class is implemented. def _reset_internal_locks(self, is_alive): # private! Called by _after_fork() to reset our internal locks as # they may be in an invalid state leading to a deadlock or crash. - self._started._reset_internal_locks() + self._started._at_fork_reinit() if is_alive: - self._set_tstate_lock() + # bpo-42350: If the fork happens when the thread is already stopped + # (ex: after threading._shutdown() has been called), _tstate_lock + # is None. Do nothing in this case. + if self._tstate_lock is not None: + self._tstate_lock._at_fork_reinit() + self._tstate_lock.acquire() else: # The thread isn't alive after fork: it doesn't have a tstate # anymore. @@ -846,6 +867,7 @@ def start(self): if self._started.is_set(): raise RuntimeError("threads can only be started once") + with _active_limbo_lock: _limbo[self] = self try: @@ -1082,16 +1104,6 @@ def is_alive(self): self._wait_for_tstate_lock(False) return not self._is_stopped - def isAlive(self): - """Return whether the thread is alive. - - This method is deprecated, use is_alive() instead. - """ - import warnings - warnings.warn('isAlive() is deprecated, use is_alive() instead', - DeprecationWarning, stacklevel=2) - return self.is_alive() - @property def daemon(self): """A boolean value indicating whether this thread is a daemon thread. @@ -1344,6 +1356,27 @@ def enumerate(): with _active_limbo_lock: return list(_active.values()) + list(_limbo.values()) + +_threading_atexits = [] +_SHUTTING_DOWN = False + +def _register_atexit(func, *arg, **kwargs): + """CPython internal: register *func* to be called before joining threads. + + The registered *func* is called with its arguments just before all + non-daemon threads are joined in `_shutdown()`. It provides a similar + purpose to `atexit.register()`, but its functions are called prior to + threading shutdown instead of interpreter shutdown. + + For similarity to atexit, the registered functions are called in reverse. + """ + if _SHUTTING_DOWN: + raise RuntimeError("can't register atexit after shutdown") + + call = functools.partial(func, *arg, **kwargs) + _threading_atexits.append(call) + + from _thread import stack_size # Create the main thread object, @@ -1365,6 +1398,8 @@ def _shutdown(): # _shutdown() was already called return + global _SHUTTING_DOWN + _SHUTTING_DOWN = True # Main thread tlock = _main_thread._tstate_lock # The main thread isn't finished yet, so its thread state lock can't have @@ -1374,6 +1409,11 @@ def _shutdown(): tlock.release() _main_thread._stop() + # Call registered threading atexit functions before threads are joined. + # Order is reversed, similar to atexit. + for atexit_call in reversed(_threading_atexits): + atexit_call() + # Join all non-deamon threads while True: with _shutdown_locks_lock: diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py index 9f0e2e5e94e3af53a66f0790a9f5b167ee2d6937..f15f6c5e57a501ec6b1edaa3a055ba74ecfa822e 100644 --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -32,13 +32,13 @@ import enum import sys +import types import _tkinter # If this fails your Python may not be configured for Tk TclError = _tkinter.TclError from tkinter.constants import * import re - wantobjects = 1 TkVersion = float(_tkinter.TK_VERSION) @@ -146,10 +146,10 @@ def _splitdict(tk, v, cut_minus=True, conv=None): class EventType(str, enum.Enum): KeyPress = '2' - Key = KeyPress, + Key = KeyPress KeyRelease = '3' ButtonPress = '4' - Button = ButtonPress, + Button = ButtonPress ButtonRelease = '5' Motion = '6' Enter = '7' @@ -180,13 +180,12 @@ class EventType(str, enum.Enum): Colormap = '32' ClientMessage = '33' # undocumented Mapping = '34' # undocumented - VirtualEvent = '35', # undocumented - Activate = '36', - Deactivate = '37', - MouseWheel = '38', + VirtualEvent = '35' # undocumented + Activate = '36' + Deactivate = '37' + MouseWheel = '38' - def __str__(self): - return self.name + __str__ = str.__str__ class Event: @@ -266,12 +265,12 @@ def __repr__(self): 'num', 'delta', 'focus', 'x', 'y', 'width', 'height') return '<%s event%s>' % ( - self.type, + getattr(self.type, 'name', self.type), ''.join(' %s=%s' % (k, attrs[k]) for k in keys if k in attrs) ) -_support_default_root = 1 +_support_default_root = True _default_root = None @@ -281,13 +280,26 @@ def NoDefaultRoot(): Call this function to inhibit that the first instance of Tk is used for windows without an explicit parent window. """ - global _support_default_root - _support_default_root = 0 - global _default_root + global _support_default_root, _default_root + _support_default_root = False + # Delete, so any use of _default_root will immediately raise an exception. + # Rebind before deletion, so repeated calls will not fail. _default_root = None del _default_root +def _get_default_root(what=None): + if not _support_default_root: + raise RuntimeError("No master specified and tkinter is " + "configured to not support default root") + if not _default_root: + if what: + raise RuntimeError(f"Too early to {what}: no default root window") + root = Tk() + assert _default_root is root + return _default_root + + def _tkerror(err): """Internal function.""" pass @@ -331,7 +343,7 @@ def __init__(self, master=None, value=None, name=None): raise TypeError("name must be a string") global _varnum if not master: - master = _default_root + master = _get_default_root('create variable') self._root = master._root() self._tk = master.tk if name: @@ -479,13 +491,11 @@ def trace_vinfo(self): self._tk.call("trace", "vinfo", self._name))] def __eq__(self, other): - """Comparison for equality (==). - - Note: if the Variable's master matters to behavior - also compare self._master == other._master - """ - return self.__class__.__name__ == other.__class__.__name__ \ - and self._name == other._name + if not isinstance(other, Variable): + return NotImplemented + return (self._name == other._name + and self.__class__.__name__ == other.__class__.__name__ + and self._tk == other._tk) class StringVar(Variable): @@ -590,7 +600,7 @@ def get(self): def mainloop(n=0): """Run the main loop of Tcl.""" - _default_root.tk.mainloop(n) + _get_default_root('run the main loop').tk.mainloop(n) getint = int @@ -599,9 +609,9 @@ def mainloop(n=0): def getboolean(s): - """Convert true and false to integer values 1 and 0.""" + """Convert Tcl object to True or False.""" try: - return _default_root.tk.getboolean(s) + return _get_default_root('use getboolean()').tk.getboolean(s) except TclError: raise ValueError("invalid literal for getboolean()") @@ -1150,8 +1160,7 @@ def winfo_reqwidth(self): self.tk.call('winfo', 'reqwidth', self._w)) def winfo_rgb(self, color): - """Return tuple of decimal values for red, green, blue for - COLOR in this widget.""" + """Return a tuple of integer RGB values in range(65536) for color in this widget.""" return self._getints( self.tk.call('winfo', 'rgb', self._w, color)) @@ -2239,7 +2248,7 @@ class Tk(Misc, Wm): _w = '.' def __init__(self, screenName=None, baseName=None, className='Tk', - useTk=1, sync=0, use=None): + useTk=True, sync=False, use=None): """Return a new Toplevel widget on screen SCREENNAME. A new Tcl interpreter will be created. BASENAME will be used for the identification of the profile file (see readprofile). @@ -2247,7 +2256,7 @@ def __init__(self, screenName=None, baseName=None, className='Tk', is the name of the widget class.""" self.master = None self.children = {} - self._tkloaded = 0 + self._tkloaded = False # to avoid recursions in the getattr code in case of failure, we # ensure that self.tk is always _something_. self.tk = None @@ -2257,7 +2266,7 @@ def __init__(self, screenName=None, baseName=None, className='Tk', baseName, ext = os.path.splitext(baseName) if ext not in ('.py', '.pyc'): baseName = baseName + ext - interactive = 0 + interactive = False self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use) if useTk: self._loadtk() @@ -2271,7 +2280,7 @@ def loadtk(self): self._loadtk() def _loadtk(self): - self._tkloaded = 1 + self._tkloaded = True global _default_root # Version sanity checks tk_version = self.tk.getvar('tk_version') @@ -2359,7 +2368,7 @@ def __getattr__(self, attr): # copied into the Pack, Place or Grid class. -def Tcl(screenName=None, baseName=None, className='Tk', useTk=0): +def Tcl(screenName=None, baseName=None, className='Tk', useTk=False): return Tk(screenName, baseName, className, useTk) @@ -2520,12 +2529,8 @@ class BaseWidget(Misc): def _setup(self, master, cnf): """Internal function. Sets up information about children.""" - if _support_default_root: - global _default_root - if not master: - if not _default_root: - _default_root = Tk() - master = _default_root + if not master: + master = _get_default_root() self.master = master self.tk = master.tk name = None @@ -3963,7 +3968,7 @@ def __init__(self, master, variable, value, *values, **kwargs): if 'command' in kwargs: del kwargs['command'] if kwargs: - raise TclError('unknown option -'+kwargs.keys()[0]) + raise TclError('unknown option -'+next(iter(kwargs))) menu.add_command(label=value, command=_setit(variable, value, callback)) for v in values: @@ -3989,9 +3994,7 @@ class Image: def __init__(self, imgtype, name=None, cnf={}, master=None, **kw): self.name = None if not master: - master = _default_root - if not master: - raise RuntimeError('Too early to create image') + master = _get_default_root('create image') self.tk = getattr(master, 'tk', master) if not name: Image._last_id += 1 @@ -4145,11 +4148,13 @@ def __init__(self, name=None, cnf={}, master=None, **kw): def image_names(): - return _default_root.tk.splitlist(_default_root.tk.call('image', 'names')) + tk = _get_default_root('use image_names()').tk + return tk.splitlist(tk.call('image', 'names')) def image_types(): - return _default_root.tk.splitlist(_default_root.tk.call('image', 'types')) + tk = _get_default_root('use image_types()').tk + return tk.splitlist(tk.call('image', 'types')) class Spinbox(Widget, XView): @@ -4569,5 +4574,9 @@ def _test(): root.mainloop() +__all__ = [name for name, obj in globals().items() + if not name.startswith('_') and not isinstance(obj, types.ModuleType) + and name not in {'wantobjects'}] + if __name__ == '__main__': _test() diff --git a/Lib/tkinter/colorchooser.py b/Lib/tkinter/colorchooser.py index 9dc96713364089366b9e799e75f7317a26277fdf..e2fb69dba927633e614d9438a20ecee6de6b7260 100644 --- a/Lib/tkinter/colorchooser.py +++ b/Lib/tkinter/colorchooser.py @@ -8,55 +8,69 @@ # fixed initialcolor handling in August 1998 # -# -# options (all have default values): -# -# - initialcolor: color to mark as selected when dialog is displayed -# (given as an RGB triplet or a Tk color string) -# -# - parent: which window to place the dialog on top of -# -# - title: dialog title -# from tkinter.commondialog import Dialog +__all__ = ["Chooser", "askcolor"] -# -# color chooser class class Chooser(Dialog): - "Ask for a color" + """Create a dialog for the tk_chooseColor command. + + Args: + master: The master widget for this dialog. If not provided, + defaults to options['parent'] (if defined). + options: Dictionary of options for the tk_chooseColor call. + initialcolor: Specifies the selected color when the + dialog is first displayed. This can be a tk color + string or a 3-tuple of ints in the range (0, 255) + for an RGB triplet. + parent: The parent window of the color dialog. The + color dialog is displayed on top of this. + title: A string for the title of the dialog box. + """ command = "tk_chooseColor" def _fixoptions(self): + """Ensure initialcolor is a tk color string. + + Convert initialcolor from a RGB triplet to a color string. + """ try: - # make sure initialcolor is a tk color string color = self.options["initialcolor"] if isinstance(color, tuple): - # assume an RGB triplet + # Assume an RGB triplet. self.options["initialcolor"] = "#%02x%02x%02x" % color except KeyError: pass def _fixresult(self, widget, result): - # result can be somethings: an empty tuple, an empty string or - # a Tcl_Obj, so this somewhat weird check handles that + """Adjust result returned from call to tk_chooseColor. + + Return both an RGB tuple of ints in the range (0, 255) and the + tk color string in the form #rrggbb. + """ + # Result can be many things: an empty tuple, an empty string, or + # a _tkinter.Tcl_Obj, so this somewhat weird check handles that. if not result or not str(result): - return None, None # canceled + return None, None # canceled - # to simplify application code, the color chooser returns - # an RGB tuple together with the Tk color string + # To simplify application code, the color chooser returns + # an RGB tuple together with the Tk color string. r, g, b = widget.winfo_rgb(result) - return (r/256, g/256, b/256), str(result) + return (r//256, g//256, b//256), str(result) # # convenience stuff -def askcolor(color = None, **options): - "Ask for a color" +def askcolor(color=None, **options): + """Display dialog window for selection of a color. + + Convenience wrapper for the Chooser class. Displays the color + chooser dialog with color as the initial value. + """ if color: options = options.copy() diff --git a/Lib/tkinter/commondialog.py b/Lib/tkinter/commondialog.py index c4ec010ee6b34e382728b15d195d9d186a0d51e7..cc3069842c3e46a0c39e5e837d7ee1a957559585 100644 --- a/Lib/tkinter/commondialog.py +++ b/Lib/tkinter/commondialog.py @@ -8,18 +8,20 @@ # written by Fredrik Lundh, May 1997 # -from tkinter import * +__all__ = ["Dialog"] + +from tkinter import Frame class Dialog: - command = None + command = None def __init__(self, master=None, **options): - self.master = master + if not master: + master = options.get('parent') + self.master = master self.options = options - if not master and options.get('parent'): - self.master = options['parent'] def _fixoptions(self): pass # hook diff --git a/Lib/tkinter/dialog.py b/Lib/tkinter/dialog.py index cb463f717c0e4c97d982fb6f899686b8fb3ea9f3..8ae214011727cc88775aecee5dbe925a7d4e0f7a 100644 --- a/Lib/tkinter/dialog.py +++ b/Lib/tkinter/dialog.py @@ -1,7 +1,8 @@ # dialog.py -- Tkinter interface to the tk_dialog script. -from tkinter import * -from tkinter import _cnfmerge +from tkinter import _cnfmerge, Widget, TclError, Button, Pack + +__all__ = ["Dialog"] DIALOG_ICON = 'questhead' diff --git a/Lib/tkinter/dnd.py b/Lib/tkinter/dnd.py index 4de2331c87626122ff05d8463e95c715501cc369..3120ff342f8c0e633760fddee569365647e6baae 100644 --- a/Lib/tkinter/dnd.py +++ b/Lib/tkinter/dnd.py @@ -99,9 +99,10 @@ """ - import tkinter +__all__ = ["dnd_start", "DndHandler"] + # The factory function diff --git a/Lib/tkinter/filedialog.py b/Lib/tkinter/filedialog.py index 88d23476fde2845481537843ad59c96813ee8796..3ed93eb8c163a4c5c18e52777dd72db68940b6bb 100644 --- a/Lib/tkinter/filedialog.py +++ b/Lib/tkinter/filedialog.py @@ -11,14 +11,20 @@ directory dialogue available in Tk 8.3 and newer. These interfaces were written by Fredrik Lundh, May 1997. """ +__all__ = ["FileDialog", "LoadFileDialog", "SaveFileDialog", + "Open", "SaveAs", "Directory", + "askopenfilename", "asksaveasfilename", "askopenfilenames", + "askopenfile", "askopenfiles", "asksaveasfile", "askdirectory"] -from tkinter import * +import fnmatch +import os +from tkinter import ( + Frame, LEFT, YES, BOTTOM, Entry, TOP, Button, Tk, X, + Toplevel, RIGHT, Y, END, Listbox, BOTH, Scrollbar, +) from tkinter.dialog import Dialog from tkinter import commondialog -import os -import fnmatch - dialogstates = {} diff --git a/Lib/tkinter/font.py b/Lib/tkinter/font.py index 136425726ab8ce14d2963b24d1f0f84e2e4f7659..78b660c54be314cded4f22e38c58e70a894eafe6 100644 --- a/Lib/tkinter/font.py +++ b/Lib/tkinter/font.py @@ -3,11 +3,12 @@ # written by Fredrik Lundh, February 1998 # -__version__ = "0.9" - import itertools import tkinter +__version__ = "0.9" +__all__ = ["NORMAL", "ROMAN", "BOLD", "ITALIC", + "nametofont", "Font", "families", "names"] # weight/slant NORMAL = "normal" @@ -68,7 +69,7 @@ def _mkdict(self, args): def __init__(self, root=None, font=None, name=None, exists=False, **options): if not root: - root = tkinter._default_root + root = tkinter._get_default_root('use font') tk = getattr(root, 'tk', root) if font: # get actual settings corresponding to the given font @@ -100,7 +101,9 @@ def __str__(self): return self.name def __eq__(self, other): - return isinstance(other, Font) and self.name == other.name + if not isinstance(other, Font): + return NotImplemented + return self.name == other.name and self._tk == other._tk def __getitem__(self, key): return self.cget(key) @@ -177,7 +180,7 @@ def metrics(self, *options, **kw): def families(root=None, displayof=None): "Get font families (as a tuple)" if not root: - root = tkinter._default_root + root = tkinter._get_default_root('use font.families()') args = () if displayof: args = ('-displayof', displayof) @@ -187,7 +190,7 @@ def families(root=None, displayof=None): def names(root=None): "Get names of defined fonts (as a tuple)" if not root: - root = tkinter._default_root + root = tkinter._get_default_root('use font.names()') return root.tk.splitlist(root.tk.call("font", "names")) diff --git a/Lib/tkinter/messagebox.py b/Lib/tkinter/messagebox.py index 4a711fa623b395eae6fcc7863d13e28c0def8d2c..5f0343b660c68c5a884f38ca78291caf14936231 100644 --- a/Lib/tkinter/messagebox.py +++ b/Lib/tkinter/messagebox.py @@ -24,6 +24,10 @@ from tkinter.commondialog import Dialog +__all__ = ["showinfo", "showwarning", "showerror", + "askquestion", "askokcancel", "askyesno", + "askyesnocancel", "askretrycancel"] + # # constants diff --git a/Lib/tkinter/scrolledtext.py b/Lib/tkinter/scrolledtext.py index 749a06a6f00fd2a7df658e3dd1d9fcca15ba8a51..4f9a8815b6184b2209305c91a1402267f78e81a6 100644 --- a/Lib/tkinter/scrolledtext.py +++ b/Lib/tkinter/scrolledtext.py @@ -11,11 +11,11 @@ Place methods are redirected to the Frame widget however. """ -__all__ = ['ScrolledText'] - from tkinter import Frame, Text, Scrollbar, Pack, Grid, Place from tkinter.constants import RIGHT, LEFT, Y, BOTH +__all__ = ['ScrolledText'] + class ScrolledText(Text): def __init__(self, master=None, **kw): diff --git a/Lib/tkinter/simpledialog.py b/Lib/tkinter/simpledialog.py index 85244171117b61e8a7ef4412064b63ba45782bef..b882d47c961bdbf889d67273e12b5969a86a639c 100644 --- a/Lib/tkinter/simpledialog.py +++ b/Lib/tkinter/simpledialog.py @@ -24,9 +24,7 @@ """ from tkinter import * -from tkinter import messagebox - -import tkinter # used at _QueryDialog for tkinter._default_root +from tkinter import messagebox, _get_default_root class SimpleDialog: @@ -128,13 +126,17 @@ def __init__(self, parent, title = None): title -- the dialog title ''' - Toplevel.__init__(self, parent) + master = parent + if not master: + master = _get_default_root('create dialog window') + + Toplevel.__init__(self, master) self.withdraw() # remain invisible for now - # If the master is not viewable, don't + # If the parent is not viewable, don't # make the child transient, or else it # would be opened withdrawn - if parent.winfo_viewable(): + if parent is not None and parent.winfo_viewable(): self.transient(parent) if title: @@ -155,7 +157,7 @@ def __init__(self, parent, title = None): self.protocol("WM_DELETE_WINDOW", self.cancel) - if self.parent is not None: + if parent is not None: self.geometry("+%d+%d" % (parent.winfo_rootx()+50, parent.winfo_rooty()+50)) @@ -259,9 +261,6 @@ def __init__(self, title, prompt, minvalue = None, maxvalue = None, parent = None): - if not parent: - parent = tkinter._default_root - self.prompt = prompt self.minvalue = minvalue self.maxvalue = maxvalue diff --git a/Lib/tkinter/test/support.py b/Lib/tkinter/test/support.py index 467a0b66c265c05f5631f544633151cd19e9b261..dbc47a81e6515730e2fb0947668e18fab2e0dbda 100644 --- a/Lib/tkinter/test/support.py +++ b/Lib/tkinter/test/support.py @@ -36,6 +36,33 @@ def tearDown(self): w.destroy() self.root.withdraw() + +class AbstractDefaultRootTest: + + def setUp(self): + self._old_support_default_root = tkinter._support_default_root + destroy_default_root() + tkinter._support_default_root = True + self.wantobjects = tkinter.wantobjects + + def tearDown(self): + destroy_default_root() + tkinter._default_root = None + tkinter._support_default_root = self._old_support_default_root + + def _test_widget(self, constructor): + # no master passing + x = constructor() + self.assertIsNotNone(tkinter._default_root) + self.assertIs(x.master, tkinter._default_root) + self.assertIs(x.tk, tkinter._default_root.tk) + x.destroy() + destroy_default_root() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, constructor) + self.assertFalse(hasattr(tkinter, '_default_root')) + + def destroy_default_root(): if getattr(tkinter, '_default_root', None): tkinter._default_root.update_idletasks() diff --git a/Lib/tkinter/test/test_tkinter/test_colorchooser.py b/Lib/tkinter/test/test_tkinter/test_colorchooser.py new file mode 100644 index 0000000000000000000000000000000000000000..4798bc9c26fc056223c85c1bd0d480545535978d --- /dev/null +++ b/Lib/tkinter/test/test_tkinter/test_colorchooser.py @@ -0,0 +1,43 @@ +import unittest +import tkinter +from test.support import requires, run_unittest, swap_attr +from tkinter.test.support import AbstractTkTest +from tkinter import colorchooser + +requires('gui') + + +class ChooserTest(AbstractTkTest, unittest.TestCase): + + @classmethod + def setUpClass(cls): + AbstractTkTest.setUpClass.__func__(cls) + cls.cc = colorchooser.Chooser(initialcolor='dark blue slate') + + def test_fixoptions(self): + cc = self.cc + cc._fixoptions() + self.assertEqual(cc.options['initialcolor'], 'dark blue slate') + + cc.options['initialcolor'] = '#D2D269691E1E' + cc._fixoptions() + self.assertEqual(cc.options['initialcolor'], '#D2D269691E1E') + + cc.options['initialcolor'] = (210, 105, 30) + cc._fixoptions() + self.assertEqual(cc.options['initialcolor'], '#d2691e') + + def test_fixresult(self): + cc = self.cc + self.assertEqual(cc._fixresult(self.root, ()), (None, None)) + self.assertEqual(cc._fixresult(self.root, ''), (None, None)) + self.assertEqual(cc._fixresult(self.root, 'chocolate'), + ((210, 105, 30), 'chocolate')) + self.assertEqual(cc._fixresult(self.root, '#4a3c8c'), + ((74, 60, 140), '#4a3c8c')) + + +tests_gui = (ChooserTest,) + +if __name__ == "__main__": + run_unittest(*tests_gui) diff --git a/Lib/tkinter/test/test_tkinter/test_font.py b/Lib/tkinter/test/test_tkinter/test_font.py index 97cd87ccdc81dd1da3bfc65acb9f63b070b49c97..0ea7924f5d5c9ece9ffcbaed6707e5937b529e24 100644 --- a/Lib/tkinter/test/test_tkinter/test_font.py +++ b/Lib/tkinter/test/test_tkinter/test_font.py @@ -1,8 +1,8 @@ import unittest import tkinter from tkinter import font -from test.support import requires, run_unittest, gc_collect -from tkinter.test.support import AbstractTkTest +from test.support import requires, run_unittest, gc_collect, ALWAYS_EQ +from tkinter.test.support import AbstractTkTest, AbstractDefaultRootTest requires('gui') @@ -63,13 +63,21 @@ def test_name(self): self.assertEqual(self.font.name, fontname) self.assertEqual(str(self.font), fontname) - def test_eq(self): + def test_equality(self): font1 = font.Font(root=self.root, name=fontname, exists=True) font2 = font.Font(root=self.root, name=fontname, exists=True) self.assertIsNot(font1, font2) self.assertEqual(font1, font2) self.assertNotEqual(font1, font1.copy()) + self.assertNotEqual(font1, 0) + self.assertEqual(font1, ALWAYS_EQ) + + root2 = tkinter.Tk() + self.addCleanup(root2.destroy) + font3 = font.Font(root=root2, name=fontname, exists=True) + self.assertEqual(str(font1), str(font3)) + self.assertNotEqual(font1, font3) def test_measure(self): self.assertIsInstance(self.font.measure('abc'), int) @@ -100,7 +108,38 @@ def test_names(self): self.assertTrue(name) self.assertIn(fontname, names) -tests_gui = (FontTest, ) + +class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase): + + def test_families(self): + self.assertRaises(RuntimeError, font.families) + root = tkinter.Tk() + families = font.families() + self.assertIsInstance(families, tuple) + self.assertTrue(families) + for family in families: + self.assertIsInstance(family, str) + self.assertTrue(family) + root.destroy() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, font.families) + + def test_names(self): + self.assertRaises(RuntimeError, font.names) + root = tkinter.Tk() + names = font.names() + self.assertIsInstance(names, tuple) + self.assertTrue(names) + for name in names: + self.assertIsInstance(name, str) + self.assertTrue(name) + self.assertIn(fontname, names) + root.destroy() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, font.names) + + +tests_gui = (FontTest, DefaultRootTest) if __name__ == "__main__": run_unittest(*tests_gui) diff --git a/Lib/tkinter/test/test_tkinter/test_images.py b/Lib/tkinter/test/test_tkinter/test_images.py index 2805d35a1f5b1bffde880cd179572c043827e05b..94bba8518fdaa6d9bbd7592867eb5fa25a327c7e 100644 --- a/Lib/tkinter/test/test_tkinter/test_images.py +++ b/Lib/tkinter/test/test_tkinter/test_images.py @@ -1,7 +1,7 @@ import unittest import tkinter from test import support -from tkinter.test.support import AbstractTkTest, requires_tcl +from tkinter.test.support import AbstractTkTest, AbstractDefaultRootTest, requires_tcl support.requires('gui') @@ -19,6 +19,47 @@ def test_image_names(self): self.assertIsInstance(image_names, tuple) +class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase): + + def test_image_types(self): + self.assertRaises(RuntimeError, tkinter.image_types) + root = tkinter.Tk() + image_types = tkinter.image_types() + self.assertIsInstance(image_types, tuple) + self.assertIn('photo', image_types) + self.assertIn('bitmap', image_types) + root.destroy() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, tkinter.image_types) + + def test_image_names(self): + self.assertRaises(RuntimeError, tkinter.image_names) + root = tkinter.Tk() + image_names = tkinter.image_names() + self.assertIsInstance(image_names, tuple) + root.destroy() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, tkinter.image_names) + + def test_image_create_bitmap(self): + self.assertRaises(RuntimeError, tkinter.BitmapImage) + root = tkinter.Tk() + image = tkinter.BitmapImage() + self.assertIn(image.name, tkinter.image_names()) + root.destroy() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, tkinter.BitmapImage) + + def test_image_create_photo(self): + self.assertRaises(RuntimeError, tkinter.PhotoImage) + root = tkinter.Tk() + image = tkinter.PhotoImage() + self.assertIn(image.name, tkinter.image_names()) + root.destroy() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, tkinter.PhotoImage) + + class BitmapImageTest(AbstractTkTest, unittest.TestCase): @classmethod @@ -330,7 +371,7 @@ def test_transparency(self): self.assertEqual(image.transparency_get(4, 6), False) -tests_gui = (MiscTest, BitmapImageTest, PhotoImageTest,) +tests_gui = (MiscTest, DefaultRootTest, BitmapImageTest, PhotoImageTest,) if __name__ == "__main__": support.run_unittest(*tests_gui) diff --git a/Lib/tkinter/test/test_tkinter/test_misc.py b/Lib/tkinter/test/test_tkinter/test_misc.py index 236cae0e9fac4e96d9bbc52e129a6db99d552589..f6e5b4db1ae1fbb006d76b75f6919e83e51b9e3a 100644 --- a/Lib/tkinter/test/test_tkinter/test_misc.py +++ b/Lib/tkinter/test/test_tkinter/test_misc.py @@ -1,12 +1,26 @@ import unittest import tkinter from test import support -from tkinter.test.support import AbstractTkTest +from tkinter.test.support import AbstractTkTest, AbstractDefaultRootTest support.requires('gui') class MiscTest(AbstractTkTest, unittest.TestCase): + def test_all(self): + self.assertIn("Widget", tkinter.__all__) + # Check that variables from tkinter.constants are also in tkinter.__all__ + self.assertIn("CASCADE", tkinter.__all__) + self.assertIsNotNone(tkinter.CASCADE) + # Check that sys, re, and constants are not in tkinter.__all__ + self.assertNotIn("re", tkinter.__all__) + self.assertNotIn("sys", tkinter.__all__) + self.assertNotIn("constants", tkinter.__all__) + # Check that an underscored functions is not in tkinter.__all__ + self.assertNotIn("_tkerror", tkinter.__all__) + # Check that wantobjects is not in tkinter.__all__ + self.assertNotIn("wantobjects", tkinter.__all__) + def test_repr(self): t = tkinter.Toplevel(self.root, name='top') f = tkinter.Frame(t, name='child') @@ -178,8 +192,154 @@ def test_clipboard_astral(self): with self.assertRaises(tkinter.TclError): root.clipboard_get() + def test_winfo_rgb(self): + root = self.root + rgb = root.winfo_rgb + + # Color name. + self.assertEqual(rgb('red'), (65535, 0, 0)) + self.assertEqual(rgb('dark slate blue'), (18504, 15677, 35723)) + # #RGB - extends each 4-bit hex value to be 16-bit. + self.assertEqual(rgb('#F0F'), (0xFFFF, 0x0000, 0xFFFF)) + # #RRGGBB - extends each 8-bit hex value to be 16-bit. + self.assertEqual(rgb('#4a3c8c'), (0x4a4a, 0x3c3c, 0x8c8c)) + # #RRRRGGGGBBBB + self.assertEqual(rgb('#dede14143939'), (0xdede, 0x1414, 0x3939)) + # Invalid string. + with self.assertRaises(tkinter.TclError): + rgb('#123456789a') + # RGB triplet is invalid input. + with self.assertRaises(tkinter.TclError): + rgb((111, 78, 55)) + + def test_event_repr_defaults(self): + e = tkinter.Event() + e.serial = 12345 + e.num = '??' + e.height = '??' + e.keycode = '??' + e.state = 0 + e.time = 123456789 + e.width = '??' + e.x = '??' + e.y = '??' + e.char = '' + e.keysym = '??' + e.keysym_num = '??' + e.type = '100' + e.widget = '??' + e.x_root = '??' + e.y_root = '??' + e.delta = 0 + self.assertEqual(repr(e), '<100 event>') + + def test_event_repr(self): + e = tkinter.Event() + e.serial = 12345 + e.num = 3 + e.focus = True + e.height = 200 + e.keycode = 65 + e.state = 0x30405 + e.time = 123456789 + e.width = 300 + e.x = 10 + e.y = 20 + e.char = 'A' + e.send_event = True + e.keysym = 'Key-A' + e.keysym_num = ord('A') + e.type = tkinter.EventType.Configure + e.widget = '.text' + e.x_root = 1010 + e.y_root = 1020 + e.delta = -1 + self.assertEqual(repr(e), + "") + + def test_getboolean(self): + for v in 'true', 'yes', 'on', '1', 't', 'y', 1, True: + self.assertIs(self.root.getboolean(v), True) + for v in 'false', 'no', 'off', '0', 'f', 'n', 0, False: + self.assertIs(self.root.getboolean(v), False) + self.assertRaises(ValueError, self.root.getboolean, 'yea') + self.assertRaises(ValueError, self.root.getboolean, '') + self.assertRaises(TypeError, self.root.getboolean, None) + self.assertRaises(TypeError, self.root.getboolean, ()) + + def test_mainloop(self): + log = [] + def callback(): + log.append(1) + self.root.after(100, self.root.quit) + self.root.after(100, callback) + self.root.mainloop(1) + self.assertEqual(log, []) + self.root.mainloop(0) + self.assertEqual(log, [1]) + self.assertTrue(self.root.winfo_exists()) + + +class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase): + + def test_default_root(self): + self.assertIs(tkinter._support_default_root, True) + self.assertIsNone(tkinter._default_root) + root = tkinter.Tk() + root2 = tkinter.Tk() + root3 = tkinter.Tk() + self.assertIs(tkinter._default_root, root) + root2.destroy() + self.assertIs(tkinter._default_root, root) + root.destroy() + self.assertIsNone(tkinter._default_root) + root3.destroy() + self.assertIsNone(tkinter._default_root) + + def test_no_default_root(self): + self.assertIs(tkinter._support_default_root, True) + self.assertIsNone(tkinter._default_root) + root = tkinter.Tk() + self.assertIs(tkinter._default_root, root) + tkinter.NoDefaultRoot() + self.assertIs(tkinter._support_default_root, False) + self.assertFalse(hasattr(tkinter, '_default_root')) + # repeated call is no-op + tkinter.NoDefaultRoot() + self.assertIs(tkinter._support_default_root, False) + self.assertFalse(hasattr(tkinter, '_default_root')) + root.destroy() + self.assertIs(tkinter._support_default_root, False) + self.assertFalse(hasattr(tkinter, '_default_root')) + root = tkinter.Tk() + self.assertIs(tkinter._support_default_root, False) + self.assertFalse(hasattr(tkinter, '_default_root')) + root.destroy() + + def test_getboolean(self): + self.assertRaises(RuntimeError, tkinter.getboolean, '1') + root = tkinter.Tk() + self.assertIs(tkinter.getboolean('1'), True) + self.assertRaises(ValueError, tkinter.getboolean, 'yea') + root.destroy() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, tkinter.getboolean, '1') + + def test_mainloop(self): + self.assertRaises(RuntimeError, tkinter.mainloop) + root = tkinter.Tk() + root.after_idle(root.quit) + tkinter.mainloop() + root.destroy() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, tkinter.mainloop) + -tests_gui = (MiscTest, ) +tests_gui = (MiscTest, DefaultRootTest) if __name__ == "__main__": support.run_unittest(*tests_gui) diff --git a/Lib/tkinter/test/test_tkinter/test_simpledialog.py b/Lib/tkinter/test/test_tkinter/test_simpledialog.py new file mode 100644 index 0000000000000000000000000000000000000000..911917258806d1320ca46f55db7b9fa9a1b15ae4 --- /dev/null +++ b/Lib/tkinter/test/test_tkinter/test_simpledialog.py @@ -0,0 +1,25 @@ +import unittest +import tkinter +from test.support import requires, run_unittest, swap_attr +from tkinter.test.support import AbstractDefaultRootTest +from tkinter.simpledialog import Dialog, askinteger + +requires('gui') + + +class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase): + + def test_askinteger(self): + self.assertRaises(RuntimeError, askinteger, "Go To Line", "Line number") + root = tkinter.Tk() + with swap_attr(Dialog, 'wait_window', lambda self, w: w.destroy()): + askinteger("Go To Line", "Line number") + root.destroy() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, askinteger, "Go To Line", "Line number") + + +tests_gui = (DefaultRootTest,) + +if __name__ == "__main__": + run_unittest(*tests_gui) diff --git a/Lib/tkinter/test/test_tkinter/test_variables.py b/Lib/tkinter/test/test_tkinter/test_variables.py index 2eb1e12671d22ed6b1f5aa2f9b2f0722fd24cd99..6aebe8d16d556b66ca243ddf3e9464572a46c742 100644 --- a/Lib/tkinter/test/test_tkinter/test_variables.py +++ b/Lib/tkinter/test/test_tkinter/test_variables.py @@ -1,7 +1,10 @@ import unittest import gc +import tkinter from tkinter import (Variable, StringVar, IntVar, DoubleVar, BooleanVar, Tcl, TclError) +from test.support import ALWAYS_EQ +from tkinter.test.support import AbstractDefaultRootTest class Var(Variable): @@ -55,15 +58,31 @@ def test_dont_unset_not_existing(self): del v2 self.assertFalse(self.info_exists("name")) - def test___eq__(self): + def test_equality(self): # values doesn't matter, only class and name are checked v1 = Variable(self.root, name="abc") v2 = Variable(self.root, name="abc") + self.assertIsNot(v1, v2) self.assertEqual(v1, v2) - v3 = Variable(self.root, name="abc") + v3 = Variable(self.root, name="cba") + self.assertNotEqual(v1, v3) + v4 = StringVar(self.root, name="abc") - self.assertNotEqual(v3, v4) + self.assertEqual(str(v1), str(v4)) + self.assertNotEqual(v1, v4) + + V = type('Variable', (), {}) + self.assertNotEqual(v1, V()) + + self.assertNotEqual(v1, object()) + self.assertEqual(v1, ALWAYS_EQ) + + root2 = tkinter.Tk() + self.addCleanup(root2.destroy) + v5 = Variable(root2, name="abc") + self.assertEqual(str(v1), str(v5)) + self.assertNotEqual(v1, v5) def test_invalid_name(self): with self.assertRaises(TypeError): @@ -301,8 +320,21 @@ def test_invalid_value_domain(self): v.get() +class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase): + + def test_variable(self): + self.assertRaises(RuntimeError, Variable) + root = tkinter.Tk() + v = Variable() + v.set("value") + self.assertEqual(v.get(), "value") + root.destroy() + tkinter.NoDefaultRoot() + self.assertRaises(RuntimeError, Variable) + + tests_gui = (TestVariable, TestStringVar, TestIntVar, - TestDoubleVar, TestBooleanVar) + TestDoubleVar, TestBooleanVar, DefaultRootTest) if __name__ == "__main__": diff --git a/Lib/tkinter/test/test_tkinter/test_widgets.py b/Lib/tkinter/test/test_tkinter/test_widgets.py index 16e9d93944c205db067f9a80704130149e925cb2..39334de8cf41c3caba0f1f0e0ba4267aeeb31e1d 100644 --- a/Lib/tkinter/test/test_tkinter/test_widgets.py +++ b/Lib/tkinter/test/test_tkinter/test_widgets.py @@ -2,11 +2,11 @@ import tkinter from tkinter import TclError import os -import sys from test.support import requires from tkinter.test.support import (tcl_version, requires_tcl, - get_tk_patchlevel, widget_eq) + get_tk_patchlevel, widget_eq, + AbstractDefaultRootTest) from tkinter.test.widget_tests import ( add_standard_options, noconv, pixels_round, AbstractWidgetTest, StandardOptionsTests, IntegerSizeTests, PixelSizeTests, @@ -22,7 +22,7 @@ def float_round(x): class AbstractToplevelTest(AbstractWidgetTest, PixelSizeTests): _conv_pad_pixels = noconv - def test_class(self): + def test_configure_class(self): widget = self.create() self.assertEqual(widget['class'], widget.__class__.__name__.title()) @@ -31,7 +31,7 @@ def test_class(self): widget2 = self.create(class_='Foo') self.assertEqual(widget2['class'], 'Foo') - def test_colormap(self): + def test_configure_colormap(self): widget = self.create() self.assertEqual(widget['colormap'], '') self.checkInvalidParam(widget, 'colormap', 'new', @@ -39,7 +39,7 @@ def test_colormap(self): widget2 = self.create(colormap='new') self.assertEqual(widget2['colormap'], 'new') - def test_container(self): + def test_configure_container(self): widget = self.create() self.assertEqual(widget['container'], 0 if self.wantobjects else '0') self.checkInvalidParam(widget, 'container', 1, @@ -47,7 +47,7 @@ def test_container(self): widget2 = self.create(container=True) self.assertEqual(widget2['container'], 1 if self.wantobjects else '1') - def test_visual(self): + def test_configure_visual(self): widget = self.create() self.assertEqual(widget['visual'], '') self.checkInvalidParam(widget, 'visual', 'default', @@ -69,13 +69,13 @@ class ToplevelTest(AbstractToplevelTest, unittest.TestCase): def create(self, **kwargs): return tkinter.Toplevel(self.root, **kwargs) - def test_menu(self): + def test_configure_menu(self): widget = self.create() menu = tkinter.Menu(self.root) self.checkParam(widget, 'menu', menu, eq=widget_eq) self.checkParam(widget, 'menu', '') - def test_screen(self): + def test_configure_screen(self): widget = self.create() self.assertEqual(widget['screen'], '') try: @@ -87,7 +87,7 @@ def test_screen(self): widget2 = self.create(screen=display) self.assertEqual(widget2['screen'], display) - def test_use(self): + def test_configure_use(self): widget = self.create() self.assertEqual(widget['use'], '') parent = self.create(container=True) @@ -124,14 +124,14 @@ class LabelFrameTest(AbstractToplevelTest, unittest.TestCase): def create(self, **kwargs): return tkinter.LabelFrame(self.root, **kwargs) - def test_labelanchor(self): + def test_configure_labelanchor(self): widget = self.create() self.checkEnumParam(widget, 'labelanchor', 'e', 'en', 'es', 'n', 'ne', 'nw', 's', 'se', 'sw', 'w', 'wn', 'ws') self.checkInvalidParam(widget, 'labelanchor', 'center') - def test_labelwidget(self): + def test_configure_labelwidget(self): widget = self.create() label = tkinter.Label(self.root, text='Mupp', name='foo') self.checkParam(widget, 'labelwidget', label, expected='.foo') @@ -141,7 +141,7 @@ def test_labelwidget(self): class AbstractLabelTest(AbstractWidgetTest, IntegerSizeTests): _conv_pixels = noconv - def test_highlightthickness(self): + def test_configure_highlightthickness(self): widget = self.create() self.checkPixelsParam(widget, 'highlightthickness', 0, 1.3, 2.6, 6, -2, '10p') @@ -179,7 +179,7 @@ class ButtonTest(AbstractLabelTest, unittest.TestCase): def create(self, **kwargs): return tkinter.Button(self.root, **kwargs) - def test_default(self): + def test_configure_default(self): widget = self.create() self.checkEnumParam(widget, 'default', 'active', 'disabled', 'normal') @@ -204,11 +204,11 @@ def create(self, **kwargs): return tkinter.Checkbutton(self.root, **kwargs) - def test_offvalue(self): + def test_configure_offvalue(self): widget = self.create() self.checkParams(widget, 'offvalue', 1, 2.3, '', 'any string') - def test_onvalue(self): + def test_configure_onvalue(self): widget = self.create() self.checkParams(widget, 'onvalue', 1, 2.3, '', 'any string') @@ -231,7 +231,7 @@ class RadiobuttonTest(AbstractLabelTest, unittest.TestCase): def create(self, **kwargs): return tkinter.Radiobutton(self.root, **kwargs) - def test_value(self): + def test_configure_value(self): widget = self.create() self.checkParams(widget, 'value', 1, 2.3, '', 'any string') @@ -254,20 +254,19 @@ class MenubuttonTest(AbstractLabelTest, unittest.TestCase): def create(self, **kwargs): return tkinter.Menubutton(self.root, **kwargs) - def test_direction(self): + def test_configure_direction(self): widget = self.create() self.checkEnumParam(widget, 'direction', 'above', 'below', 'flush', 'left', 'right') - def test_height(self): + def test_configure_height(self): widget = self.create() self.checkIntegerParam(widget, 'height', 100, -100, 0, conv=str) - test_highlightthickness = StandardOptionsTests.test_highlightthickness + test_configure_highlightthickness = \ + StandardOptionsTests.test_configure_highlightthickness - @unittest.skipIf(sys.platform == 'darwin', - 'crashes with Cocoa Tk (issue19733)') - def test_image(self): + def test_configure_image(self): widget = self.create() image = tkinter.PhotoImage(master=self.root, name='image1') self.checkParam(widget, 'image', image, conv=str) @@ -281,23 +280,23 @@ def test_image(self): if errmsg is not None: self.assertEqual(str(cm.exception), errmsg) - def test_menu(self): + def test_configure_menu(self): widget = self.create() menu = tkinter.Menu(widget, name='menu') self.checkParam(widget, 'menu', menu, eq=widget_eq) menu.destroy() - def test_padx(self): + def test_configure_padx(self): widget = self.create() self.checkPixelsParam(widget, 'padx', 3, 4.4, 5.6, '12m') self.checkParam(widget, 'padx', -2, expected=0) - def test_pady(self): + def test_configure_pady(self): widget = self.create() self.checkPixelsParam(widget, 'pady', 3, 4.4, 5.6, '12m') self.checkParam(widget, 'pady', -2, expected=0) - def test_width(self): + def test_configure_width(self): widget = self.create() self.checkIntegerParam(widget, 'width', 402, -402, 0, conv=str) @@ -307,6 +306,10 @@ class OptionMenuTest(MenubuttonTest, unittest.TestCase): def create(self, default='b', values=('a', 'b', 'c'), **kwargs): return tkinter.OptionMenu(self.root, None, default, *values, **kwargs) + def test_bad_kwarg(self): + with self.assertRaisesRegex(TclError, r"^unknown option -image$"): + tkinter.OptionMenu(self.root, None, 'b', image='') + @add_standard_options(IntegerSizeTests, StandardOptionsTests) class EntryTest(AbstractWidgetTest, unittest.TestCase): @@ -326,18 +329,18 @@ class EntryTest(AbstractWidgetTest, unittest.TestCase): def create(self, **kwargs): return tkinter.Entry(self.root, **kwargs) - def test_disabledbackground(self): + def test_configure_disabledbackground(self): widget = self.create() self.checkColorParam(widget, 'disabledbackground') - def test_insertborderwidth(self): + def test_configure_insertborderwidth(self): widget = self.create(insertwidth=100) self.checkPixelsParam(widget, 'insertborderwidth', 0, 1.3, 2.6, 6, -2, '10p') # insertborderwidth is bounded above by a half of insertwidth. self.checkParam(widget, 'insertborderwidth', 60, expected=100//2) - def test_insertwidth(self): + def test_configure_insertwidth(self): widget = self.create() self.checkPixelsParam(widget, 'insertwidth', 1.3, 3.6, '10p') self.checkParam(widget, 'insertwidth', 0.1, expected=2) @@ -347,32 +350,32 @@ def test_insertwidth(self): else: self.checkParam(widget, 'insertwidth', 0.9, expected=1) - def test_invalidcommand(self): + def test_configure_invalidcommand(self): widget = self.create() self.checkCommandParam(widget, 'invalidcommand') self.checkCommandParam(widget, 'invcmd') - def test_readonlybackground(self): + def test_configure_readonlybackground(self): widget = self.create() self.checkColorParam(widget, 'readonlybackground') - def test_show(self): + def test_configure_show(self): widget = self.create() self.checkParam(widget, 'show', '*') self.checkParam(widget, 'show', '') self.checkParam(widget, 'show', ' ') - def test_state(self): + def test_configure_state(self): widget = self.create() self.checkEnumParam(widget, 'state', 'disabled', 'normal', 'readonly') - def test_validate(self): + def test_configure_validate(self): widget = self.create() self.checkEnumParam(widget, 'validate', 'all', 'key', 'focus', 'focusin', 'focusout', 'none') - def test_validatecommand(self): + def test_configure_validatecommand(self): widget = self.create() self.checkCommandParam(widget, 'validatecommand') self.checkCommandParam(widget, 'vcmd') @@ -425,25 +428,25 @@ class SpinboxTest(EntryTest, unittest.TestCase): def create(self, **kwargs): return tkinter.Spinbox(self.root, **kwargs) - test_show = None + test_configure_show = None - def test_buttonbackground(self): + def test_configure_buttonbackground(self): widget = self.create() self.checkColorParam(widget, 'buttonbackground') - def test_buttoncursor(self): + def test_configure_buttoncursor(self): widget = self.create() self.checkCursorParam(widget, 'buttoncursor') - def test_buttondownrelief(self): + def test_configure_buttondownrelief(self): widget = self.create() self.checkReliefParam(widget, 'buttondownrelief') - def test_buttonuprelief(self): + def test_configure_buttonuprelief(self): widget = self.create() self.checkReliefParam(widget, 'buttonuprelief') - def test_format(self): + def test_configure_format(self): widget = self.create() self.checkParam(widget, 'format', '%2f') self.checkParam(widget, 'format', '%2.2f') @@ -458,25 +461,25 @@ def test_format(self): self.checkParam(widget, 'format', '%09.200f') self.checkInvalidParam(widget, 'format', '%d') - def test_from(self): + def test_configure_from(self): widget = self.create() self.checkParam(widget, 'to', 100.0) self.checkFloatParam(widget, 'from', -10, 10.2, 11.7) self.checkInvalidParam(widget, 'from', 200, errmsg='-to value must be greater than -from value') - def test_increment(self): + def test_configure_increment(self): widget = self.create() self.checkFloatParam(widget, 'increment', -1, 1, 10.2, 12.8, 0) - def test_to(self): + def test_configure_to(self): widget = self.create() self.checkParam(widget, 'from', -100.0) self.checkFloatParam(widget, 'to', -10, 10.2, 11.7) self.checkInvalidParam(widget, 'to', -200, errmsg='-to value must be greater than -from value') - def test_values(self): + def test_configure_values(self): # XXX widget = self.create() self.assertEqual(widget['values'], '') @@ -487,7 +490,7 @@ def test_values(self): expected='42 3.14 {} {any string}') self.checkParam(widget, 'values', '') - def test_wrap(self): + def test_configure_wrap(self): widget = self.create() self.checkBooleanParam(widget, 'wrap') @@ -553,17 +556,17 @@ class TextTest(AbstractWidgetTest, unittest.TestCase): def create(self, **kwargs): return tkinter.Text(self.root, **kwargs) - def test_autoseparators(self): + def test_configure_autoseparators(self): widget = self.create() self.checkBooleanParam(widget, 'autoseparators') @requires_tcl(8, 5) - def test_blockcursor(self): + def test_configure_blockcursor(self): widget = self.create() self.checkBooleanParam(widget, 'blockcursor') @requires_tcl(8, 5) - def test_endline(self): + def test_configure_endline(self): widget = self.create() text = '\n'.join('Line %d' for i in range(100)) widget.insert('end', text) @@ -576,50 +579,50 @@ def test_endline(self): self.checkInvalidParam(widget, 'endline', 10, errmsg='-startline must be less than or equal to -endline') - def test_height(self): + def test_configure_height(self): widget = self.create() self.checkPixelsParam(widget, 'height', 100, 101.2, 102.6, '3c') self.checkParam(widget, 'height', -100, expected=1) self.checkParam(widget, 'height', 0, expected=1) - def test_maxundo(self): + def test_configure_maxundo(self): widget = self.create() self.checkIntegerParam(widget, 'maxundo', 0, 5, -1) @requires_tcl(8, 5) - def test_inactiveselectbackground(self): + def test_configure_inactiveselectbackground(self): widget = self.create() self.checkColorParam(widget, 'inactiveselectbackground') @requires_tcl(8, 6) - def test_insertunfocussed(self): + def test_configure_insertunfocussed(self): widget = self.create() self.checkEnumParam(widget, 'insertunfocussed', 'hollow', 'none', 'solid') - def test_selectborderwidth(self): + def test_configure_selectborderwidth(self): widget = self.create() self.checkPixelsParam(widget, 'selectborderwidth', 1.3, 2.6, -2, '10p', conv=noconv, keep_orig=tcl_version >= (8, 5)) - def test_spacing1(self): + def test_configure_spacing1(self): widget = self.create() self.checkPixelsParam(widget, 'spacing1', 20, 21.4, 22.6, '0.5c') self.checkParam(widget, 'spacing1', -5, expected=0) - def test_spacing2(self): + def test_configure_spacing2(self): widget = self.create() self.checkPixelsParam(widget, 'spacing2', 5, 6.4, 7.6, '0.1c') self.checkParam(widget, 'spacing2', -1, expected=0) - def test_spacing3(self): + def test_configure_spacing3(self): widget = self.create() self.checkPixelsParam(widget, 'spacing3', 20, 21.4, 22.6, '0.5c') self.checkParam(widget, 'spacing3', -10, expected=0) @requires_tcl(8, 5) - def test_startline(self): + def test_configure_startline(self): widget = self.create() text = '\n'.join('Line %d' for i in range(100)) widget.insert('end', text) @@ -632,14 +635,14 @@ def test_startline(self): self.checkInvalidParam(widget, 'startline', 70, errmsg='-startline must be less than or equal to -endline') - def test_state(self): + def test_configure_state(self): widget = self.create() if tcl_version < (8, 5): self.checkParams(widget, 'state', 'disabled', 'normal') else: self.checkEnumParam(widget, 'state', 'disabled', 'normal') - def test_tabs(self): + def test_configure_tabs(self): widget = self.create() if get_tk_patchlevel() < (8, 5, 11): self.checkParam(widget, 'tabs', (10.2, 20.7, '1i', '2i'), @@ -655,21 +658,21 @@ def test_tabs(self): keep_orig=tcl_version >= (8, 5)) @requires_tcl(8, 5) - def test_tabstyle(self): + def test_configure_tabstyle(self): widget = self.create() self.checkEnumParam(widget, 'tabstyle', 'tabular', 'wordprocessor') - def test_undo(self): + def test_configure_undo(self): widget = self.create() self.checkBooleanParam(widget, 'undo') - def test_width(self): + def test_configure_width(self): widget = self.create() self.checkIntegerParam(widget, 'width', 402) self.checkParam(widget, 'width', -402, expected=1) self.checkParam(widget, 'width', 0, expected=1) - def test_wrap(self): + def test_configure_wrap(self): widget = self.create() if tcl_version < (8, 5): self.checkParams(widget, 'wrap', 'char', 'none', 'word') @@ -707,16 +710,16 @@ class CanvasTest(AbstractWidgetTest, unittest.TestCase): def create(self, **kwargs): return tkinter.Canvas(self.root, **kwargs) - def test_closeenough(self): + def test_configure_closeenough(self): widget = self.create() self.checkFloatParam(widget, 'closeenough', 24, 2.4, 3.6, -3, conv=float) - def test_confine(self): + def test_configure_confine(self): widget = self.create() self.checkBooleanParam(widget, 'confine') - def test_offset(self): + def test_configure_offset(self): widget = self.create() self.assertEqual(widget['offset'], '0,0') self.checkParams(widget, 'offset', @@ -725,7 +728,7 @@ def test_offset(self): self.checkParam(widget, 'offset', '#5,6') self.checkInvalidParam(widget, 'offset', 'spam') - def test_scrollregion(self): + def test_configure_scrollregion(self): widget = self.create() self.checkParam(widget, 'scrollregion', '0 0 200 150') self.checkParam(widget, 'scrollregion', (0, 0, 200, 150), @@ -737,17 +740,17 @@ def test_scrollregion(self): self.checkInvalidParam(widget, 'scrollregion', (0, 0, 200)) self.checkInvalidParam(widget, 'scrollregion', (0, 0, 200, 150, 0)) - def test_state(self): + def test_configure_state(self): widget = self.create() self.checkEnumParam(widget, 'state', 'disabled', 'normal', errmsg='bad state value "{}": must be normal or disabled') - def test_xscrollincrement(self): + def test_configure_xscrollincrement(self): widget = self.create() self.checkPixelsParam(widget, 'xscrollincrement', 40, 0, 41.2, 43.6, -40, '0.5i') - def test_yscrollincrement(self): + def test_configure_yscrollincrement(self): widget = self.create() self.checkPixelsParam(widget, 'yscrollincrement', 10, 0, 11.2, 13.6, -10, '0.1i') @@ -792,26 +795,26 @@ class ListboxTest(AbstractWidgetTest, unittest.TestCase): def create(self, **kwargs): return tkinter.Listbox(self.root, **kwargs) - def test_activestyle(self): + def test_configure_activestyle(self): widget = self.create() self.checkEnumParam(widget, 'activestyle', 'dotbox', 'none', 'underline') - test_justify = requires_tcl(8, 6, 5)(StandardOptionsTests.test_justify) + test_justify = requires_tcl(8, 6, 5)(StandardOptionsTests.test_configure_justify) - def test_listvariable(self): + def test_configure_listvariable(self): widget = self.create() var = tkinter.DoubleVar(self.root) self.checkVariableParam(widget, 'listvariable', var) - def test_selectmode(self): + def test_configure_selectmode(self): widget = self.create() self.checkParam(widget, 'selectmode', 'single') self.checkParam(widget, 'selectmode', 'browse') self.checkParam(widget, 'selectmode', 'multiple') self.checkParam(widget, 'selectmode', 'extended') - def test_state(self): + def test_configure_state(self): widget = self.create() self.checkEnumParam(widget, 'state', 'disabled', 'normal') @@ -926,52 +929,53 @@ class ScaleTest(AbstractWidgetTest, unittest.TestCase): def create(self, **kwargs): return tkinter.Scale(self.root, **kwargs) - def test_bigincrement(self): + def test_configure_bigincrement(self): widget = self.create() self.checkFloatParam(widget, 'bigincrement', 12.4, 23.6, -5) - def test_digits(self): + def test_configure_digits(self): widget = self.create() self.checkIntegerParam(widget, 'digits', 5, 0) - def test_from(self): + def test_configure_from(self): widget = self.create() - self.checkFloatParam(widget, 'from', 100, 14.9, 15.1, conv=float_round) + conv = False if get_tk_patchlevel() >= (8, 6, 10) else float_round + self.checkFloatParam(widget, 'from', 100, 14.9, 15.1, conv=conv) - def test_label(self): + def test_configure_label(self): widget = self.create() self.checkParam(widget, 'label', 'any string') self.checkParam(widget, 'label', '') - def test_length(self): + def test_configure_length(self): widget = self.create() self.checkPixelsParam(widget, 'length', 130, 131.2, 135.6, '5i') - def test_resolution(self): + def test_configure_resolution(self): widget = self.create() self.checkFloatParam(widget, 'resolution', 4.2, 0, 6.7, -2) - def test_showvalue(self): + def test_configure_showvalue(self): widget = self.create() self.checkBooleanParam(widget, 'showvalue') - def test_sliderlength(self): + def test_configure_sliderlength(self): widget = self.create() self.checkPixelsParam(widget, 'sliderlength', 10, 11.2, 15.6, -3, '3m') - def test_sliderrelief(self): + def test_configure_sliderrelief(self): widget = self.create() self.checkReliefParam(widget, 'sliderrelief') - def test_tickinterval(self): + def test_configure_tickinterval(self): widget = self.create() self.checkFloatParam(widget, 'tickinterval', 1, 4.3, 7.6, 0, conv=float_round) self.checkParam(widget, 'tickinterval', -2, expected=2, conv=float_round) - def test_to(self): + def test_configure_to(self): widget = self.create() self.checkFloatParam(widget, 'to', 300, 14.9, 15.1, -10, conv=float_round) @@ -995,15 +999,15 @@ class ScrollbarTest(AbstractWidgetTest, unittest.TestCase): def create(self, **kwargs): return tkinter.Scrollbar(self.root, **kwargs) - def test_activerelief(self): + def test_configure_activerelief(self): widget = self.create() self.checkReliefParam(widget, 'activerelief') - def test_elementborderwidth(self): + def test_configure_elementborderwidth(self): widget = self.create() self.checkPixelsParam(widget, 'elementborderwidth', 4.3, 5.6, -2, '1m') - def test_orient(self): + def test_configure_orient(self): widget = self.create() self.checkEnumParam(widget, 'orient', 'vertical', 'horizontal', errmsg='bad orientation "{}": must be vertical or horizontal') @@ -1044,63 +1048,63 @@ class PanedWindowTest(AbstractWidgetTest, unittest.TestCase): def create(self, **kwargs): return tkinter.PanedWindow(self.root, **kwargs) - def test_handlepad(self): + def test_configure_handlepad(self): widget = self.create() self.checkPixelsParam(widget, 'handlepad', 5, 6.4, 7.6, -3, '1m') - def test_handlesize(self): + def test_configure_handlesize(self): widget = self.create() self.checkPixelsParam(widget, 'handlesize', 8, 9.4, 10.6, -3, '2m', conv=noconv) - def test_height(self): + def test_configure_height(self): widget = self.create() self.checkPixelsParam(widget, 'height', 100, 101.2, 102.6, -100, 0, '1i', conv=noconv) - def test_opaqueresize(self): + def test_configure_opaqueresize(self): widget = self.create() self.checkBooleanParam(widget, 'opaqueresize') @requires_tcl(8, 6, 5) - def test_proxybackground(self): + def test_configure_proxybackground(self): widget = self.create() self.checkColorParam(widget, 'proxybackground') @requires_tcl(8, 6, 5) - def test_proxyborderwidth(self): + def test_configure_proxyborderwidth(self): widget = self.create() self.checkPixelsParam(widget, 'proxyborderwidth', 0, 1.3, 2.9, 6, -2, '10p', conv=noconv) @requires_tcl(8, 6, 5) - def test_proxyrelief(self): + def test_configure_proxyrelief(self): widget = self.create() self.checkReliefParam(widget, 'proxyrelief') - def test_sashcursor(self): + def test_configure_sashcursor(self): widget = self.create() self.checkCursorParam(widget, 'sashcursor') - def test_sashpad(self): + def test_configure_sashpad(self): widget = self.create() self.checkPixelsParam(widget, 'sashpad', 8, 1.3, 2.6, -2, '2m') - def test_sashrelief(self): + def test_configure_sashrelief(self): widget = self.create() self.checkReliefParam(widget, 'sashrelief') - def test_sashwidth(self): + def test_configure_sashwidth(self): widget = self.create() self.checkPixelsParam(widget, 'sashwidth', 10, 11.1, 15.6, -3, '1m', conv=noconv) - def test_showhandle(self): + def test_configure_showhandle(self): widget = self.create() self.checkBooleanParam(widget, 'showhandle') - def test_width(self): + def test_configure_width(self): widget = self.create() self.checkPixelsParam(widget, 'width', 402, 403.4, 404.6, -402, 0, '5i', conv=noconv) @@ -1219,23 +1223,23 @@ class MenuTest(AbstractWidgetTest, unittest.TestCase): def create(self, **kwargs): return tkinter.Menu(self.root, **kwargs) - def test_postcommand(self): + def test_configure_postcommand(self): widget = self.create() self.checkCommandParam(widget, 'postcommand') - def test_tearoff(self): + def test_configure_tearoff(self): widget = self.create() self.checkBooleanParam(widget, 'tearoff') - def test_tearoffcommand(self): + def test_configure_tearoffcommand(self): widget = self.create() self.checkCommandParam(widget, 'tearoffcommand') - def test_title(self): + def test_configure_title(self): widget = self.create() self.checkParam(widget, 'title', 'any string') - def test_type(self): + def test_configure_type(self): widget = self.create() self.checkEnumParam(widget, 'type', 'normal', 'tearoff', 'menubar') @@ -1288,17 +1292,26 @@ class MessageTest(AbstractWidgetTest, unittest.TestCase): def create(self, **kwargs): return tkinter.Message(self.root, **kwargs) - def test_aspect(self): + def test_configure_aspect(self): widget = self.create() self.checkIntegerParam(widget, 'aspect', 250, 0, -300) +class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase): + + def test_frame(self): + self._test_widget(tkinter.Frame) + + def test_label(self): + self._test_widget(tkinter.Label) + + tests_gui = ( ButtonTest, CanvasTest, CheckbuttonTest, EntryTest, FrameTest, LabelFrameTest,LabelTest, ListboxTest, MenubuttonTest, MenuTest, MessageTest, OptionMenuTest, PanedWindowTest, RadiobuttonTest, ScaleTest, ScrollbarTest, - SpinboxTest, TextTest, ToplevelTest, + SpinboxTest, TextTest, ToplevelTest, DefaultRootTest, ) if __name__ == '__main__': diff --git a/Lib/tkinter/test/test_ttk/test_extensions.py b/Lib/tkinter/test/test_ttk/test_extensions.py index a45f882bb00d48cc51e4d18921008f99856e798d..1a70e0befe6234b519989849b18620dbec19df6e 100644 --- a/Lib/tkinter/test/test_ttk/test_extensions.py +++ b/Lib/tkinter/test/test_ttk/test_extensions.py @@ -2,8 +2,8 @@ import unittest import tkinter from tkinter import ttk -from test.support import requires, run_unittest, swap_attr -from tkinter.test.support import AbstractTkTest, destroy_default_root +from test.support import requires, run_unittest +from tkinter.test.support import AbstractTkTest, AbstractDefaultRootTest requires('gui') @@ -46,20 +46,6 @@ def test_widget_destroy(self): if hasattr(sys, 'last_type'): self.assertNotEqual(sys.last_type, tkinter.TclError) - - def test_initialization_no_master(self): - # no master passing - with swap_attr(tkinter, '_default_root', None), \ - swap_attr(tkinter, '_support_default_root', True): - try: - x = ttk.LabeledScale() - self.assertIsNotNone(tkinter._default_root) - self.assertEqual(x.master, tkinter._default_root) - self.assertEqual(x.tk, tkinter._default_root.tk) - x.destroy() - finally: - destroy_default_root() - def test_initialization(self): # master passing master = tkinter.Frame(self.root) @@ -114,7 +100,6 @@ def check_positions(scale, scale_pos, label, label_pos): def test_horizontal_range(self): lscale = ttk.LabeledScale(self.root, from_=0, to=10) lscale.pack() - lscale.wait_visibility() lscale.update() linfo_1 = lscale.label.place_info() @@ -144,7 +129,6 @@ def test_horizontal_range(self): def test_variable_change(self): x = ttk.LabeledScale(self.root) x.pack() - x.wait_visibility() x.update() curr_xcoord = x.scale.coords()[0] @@ -187,7 +171,6 @@ def test_variable_change(self): def test_resize(self): x = ttk.LabeledScale(self.root) x.pack(expand=True, fill='both') - x.wait_visibility() x.update() width, height = x.master.winfo_width(), x.master.winfo_height() @@ -268,7 +251,6 @@ def test_menu(self): # check that variable is updated correctly optmenu.pack() - optmenu.wait_visibility() optmenu['menu'].invoke(0) self.assertEqual(optmenu._variable.get(), items[0]) @@ -299,9 +281,7 @@ def test_unique_radiobuttons(self): textvar2 = tkinter.StringVar(self.root) optmenu2 = ttk.OptionMenu(self.root, textvar2, default, *items) optmenu.pack() - optmenu.wait_visibility() optmenu2.pack() - optmenu2.wait_visibility() optmenu['menu'].invoke(1) optmenu2['menu'].invoke(2) optmenu_stringvar_name = optmenu['menu'].entrycget(0, 'variable') @@ -317,7 +297,13 @@ def test_unique_radiobuttons(self): optmenu2.destroy() -tests_gui = (LabeledScaleTest, OptionMenuTest) +class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase): + + def test_labeledscale(self): + self._test_widget(ttk.LabeledScale) + + +tests_gui = (LabeledScaleTest, OptionMenuTest, DefaultRootTest) if __name__ == "__main__": run_unittest(*tests_gui) diff --git a/Lib/tkinter/test/test_ttk/test_functions.py b/Lib/tkinter/test/test_ttk/test_functions.py index f8e69a9f4165d6beeaeefdba9509640bd5085fa7..5c23d6fecf8b42deffcdce93c24b98536054f3a0 100644 --- a/Lib/tkinter/test/test_ttk/test_functions.py +++ b/Lib/tkinter/test/test_ttk/test_functions.py @@ -137,6 +137,9 @@ def test_format_mapdict(self): result = ttk._format_mapdict(opts) self.assertEqual(result, ('-üñíćódè', 'á vãl')) + self.assertEqual(ttk._format_mapdict({'opt': [('value',)]}), + ('-opt', '{} value')) + # empty states valid = {'opt': [('', '', 'hi')]} self.assertEqual(ttk._format_mapdict(valid), ('-opt', '{ } hi')) @@ -159,10 +162,6 @@ def test_format_mapdict(self): opts = {'a': None} self.assertRaises(TypeError, ttk._format_mapdict, opts) - # items in the value must have size >= 2 - self.assertRaises(IndexError, ttk._format_mapdict, - {'a': [('invalid', )]}) - def test_format_elemcreate(self): self.assertTrue(ttk._format_elemcreate(None), (None, ())) diff --git a/Lib/tkinter/test/test_ttk/test_style.py b/Lib/tkinter/test/test_ttk/test_style.py index 3537536d81bc5647c5846229a763930214df071b..38d70d7a89077d80a11c8fd95424c706eed01605 100644 --- a/Lib/tkinter/test/test_ttk/test_style.py +++ b/Lib/tkinter/test/test_ttk/test_style.py @@ -1,11 +1,23 @@ import unittest +import sys import tkinter from tkinter import ttk +from test import support from test.support import requires, run_unittest from tkinter.test.support import AbstractTkTest requires('gui') +CLASS_NAMES = [ + '.', 'ComboboxPopdownFrame', 'Heading', + 'Horizontal.TProgressbar', 'Horizontal.TScale', 'Item', 'Sash', + 'TButton', 'TCheckbutton', 'TCombobox', 'TEntry', + 'TLabelframe', 'TLabelframe.Label', 'TMenubutton', + 'TNotebook', 'TNotebook.Tab', 'Toolbutton', 'TProgressbar', + 'TRadiobutton', 'Treeview', 'TScale', 'TScrollbar', 'TSpinbox', + 'Vertical.TProgressbar', 'Vertical.TScale' +] + class StyleTest(AbstractTkTest, unittest.TestCase): def setUp(self): @@ -23,11 +35,36 @@ def test_configure(self): def test_map(self): style = self.style - style.map('TButton', background=[('active', 'background', 'blue')]) - self.assertEqual(style.map('TButton', 'background'), - [('active', 'background', 'blue')] if self.wantobjects else - [('active background', 'blue')]) - self.assertIsInstance(style.map('TButton'), dict) + + # Single state + for states in ['active'], [('active',)]: + with self.subTest(states=states): + style.map('TButton', background=[(*states, 'white')]) + expected = [('active', 'white')] + self.assertEqual(style.map('TButton', 'background'), expected) + m = style.map('TButton') + self.assertIsInstance(m, dict) + self.assertEqual(m['background'], expected) + + # Multiple states + for states in ['pressed', '!disabled'], ['pressed !disabled'], [('pressed', '!disabled')]: + with self.subTest(states=states): + style.map('TButton', background=[(*states, 'black')]) + expected = [('pressed', '!disabled', 'black')] + self.assertEqual(style.map('TButton', 'background'), expected) + m = style.map('TButton') + self.assertIsInstance(m, dict) + self.assertEqual(m['background'], expected) + + # Default state + for states in [], [''], [()]: + with self.subTest(states=states): + style.map('TButton', background=[(*states, 'grey')]) + expected = [('grey',)] + self.assertEqual(style.map('TButton', 'background'), expected) + m = style.map('TButton') + self.assertIsInstance(m, dict) + self.assertEqual(m['background'], expected) def test_lookup(self): @@ -86,6 +123,58 @@ def test_theme_use(self): self.style.theme_use(curr_theme) + def test_configure_custom_copy(self): + style = self.style + + curr_theme = self.style.theme_use() + self.addCleanup(self.style.theme_use, curr_theme) + for theme in self.style.theme_names(): + self.style.theme_use(theme) + for name in CLASS_NAMES: + default = style.configure(name) + if not default: + continue + with self.subTest(theme=theme, name=name): + if support.verbose >= 2: + print('configure', theme, name, default) + if (theme in ('vista', 'xpnative') + and sys.getwindowsversion()[:2] == (6, 1)): + # Fails on the Windows 7 buildbot + continue + newname = f'C.{name}' + self.assertEqual(style.configure(newname), None) + style.configure(newname, **default) + self.assertEqual(style.configure(newname), default) + for key, value in default.items(): + self.assertEqual(style.configure(newname, key), value) + + + def test_map_custom_copy(self): + style = self.style + + curr_theme = self.style.theme_use() + self.addCleanup(self.style.theme_use, curr_theme) + for theme in self.style.theme_names(): + self.style.theme_use(theme) + for name in CLASS_NAMES: + default = style.map(name) + if not default: + continue + with self.subTest(theme=theme, name=name): + if support.verbose >= 2: + print('map', theme, name, default) + if (theme in ('vista', 'xpnative') + and sys.getwindowsversion()[:2] == (6, 1)): + # Fails on the Windows 7 buildbot + continue + newname = f'C.{name}' + self.assertEqual(style.map(newname), {}) + style.map(newname, **default) + self.assertEqual(style.map(newname), default) + for key, value in default.items(): + self.assertEqual(style.map(newname, key), value) + + tests_gui = (StyleTest, ) if __name__ == "__main__": diff --git a/Lib/tkinter/test/test_ttk/test_widgets.py b/Lib/tkinter/test/test_ttk/test_widgets.py index 2598bc676520755448378dc0b5ba76d4e9886e1c..1fac83a004a6d0e441c289dcec070120237bb5dd 100644 --- a/Lib/tkinter/test/test_ttk/test_widgets.py +++ b/Lib/tkinter/test/test_ttk/test_widgets.py @@ -6,7 +6,7 @@ from tkinter.test.test_ttk.test_functions import MockTclObj from tkinter.test.support import (AbstractTkTest, tcl_version, get_tk_patchlevel, - simulate_mouse_click) + simulate_mouse_click, AbstractDefaultRootTest) from tkinter.test.widget_tests import (add_standard_options, noconv, AbstractWidgetTest, StandardOptionsTests, IntegerSizeTests, PixelSizeTests, setUpModule) @@ -16,7 +16,7 @@ class StandardTtkOptionsTests(StandardOptionsTests): - def test_class(self): + def test_configure_class(self): widget = self.create() self.assertEqual(widget['class'], '') errmsg='attempt to change read-only option' @@ -26,7 +26,7 @@ def test_class(self): widget2 = self.create(class_='Foo') self.assertEqual(widget2['class'], 'Foo') - def test_padding(self): + def test_configure_padding(self): widget = self.create() self.checkParam(widget, 'padding', 0, expected=('0',)) self.checkParam(widget, 'padding', 5, expected=('5',)) @@ -38,7 +38,7 @@ def test_padding(self): self.checkParam(widget, 'padding', ('5p', '6p', '7p', '8p')) self.checkParam(widget, 'padding', (), expected='') - def test_style(self): + def test_configure_style(self): widget = self.create() self.assertEqual(widget['style'], '') errmsg = 'Layout Foo not found' @@ -60,11 +60,10 @@ def setUp(self): super().setUp() self.widget = ttk.Button(self.root, width=0, text="Text") self.widget.pack() - self.widget.wait_visibility() def test_identify(self): - self.widget.update_idletasks() + self.widget.update() self.assertEqual(self.widget.identify( int(self.widget.winfo_width() / 2), int(self.widget.winfo_height() / 2) @@ -140,14 +139,14 @@ class LabelFrameTest(AbstractToplevelTest, unittest.TestCase): def create(self, **kwargs): return ttk.LabelFrame(self.root, **kwargs) - def test_labelanchor(self): + def test_configure_labelanchor(self): widget = self.create() self.checkEnumParam(widget, 'labelanchor', 'e', 'en', 'es', 'n', 'ne', 'nw', 's', 'se', 'sw', 'w', 'wn', 'ws', errmsg='Bad label anchor specification {}') self.checkInvalidParam(widget, 'labelanchor', 'center') - def test_labelwidget(self): + def test_configure_labelwidget(self): widget = self.create() label = ttk.Label(self.root, text='Mupp', name='foo') self.checkParam(widget, 'labelwidget', label, expected='.foo') @@ -169,17 +168,17 @@ def checkImageParam(self, widget, name): self.checkInvalidParam(widget, name, 'spam', errmsg='image "spam" doesn\'t exist') - def test_compound(self): + def test_configure_compound(self): widget = self.create() self.checkEnumParam(widget, 'compound', 'none', 'text', 'image', 'center', 'top', 'bottom', 'left', 'right') - def test_state(self): + def test_configure_state(self): widget = self.create() self.checkParams(widget, 'state', 'active', 'disabled', 'normal') - def test_width(self): + def test_configure_width(self): widget = self.create() self.checkParams(widget, 'width', 402, -402, 0) @@ -198,7 +197,7 @@ class LabelTest(AbstractLabelTest, unittest.TestCase): def create(self, **kwargs): return ttk.Label(self.root, **kwargs) - def test_font(self): + def test_configure_font(self): widget = self.create() self.checkParam(widget, 'font', '-Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*') @@ -216,7 +215,7 @@ class ButtonTest(AbstractLabelTest, unittest.TestCase): def create(self, **kwargs): return ttk.Button(self.root, **kwargs) - def test_default(self): + def test_configure_default(self): widget = self.create() self.checkEnumParam(widget, 'default', 'normal', 'active', 'disabled') @@ -241,11 +240,11 @@ class CheckbuttonTest(AbstractLabelTest, unittest.TestCase): def create(self, **kwargs): return ttk.Checkbutton(self.root, **kwargs) - def test_offvalue(self): + def test_configure_offvalue(self): widget = self.create() self.checkParams(widget, 'offvalue', 1, 2.3, '', 'any string') - def test_onvalue(self): + def test_configure_onvalue(self): widget = self.create() self.checkParams(widget, 'onvalue', 1, 2.3, '', 'any string') @@ -293,27 +292,27 @@ def setUp(self): def create(self, **kwargs): return ttk.Entry(self.root, **kwargs) - def test_invalidcommand(self): + def test_configure_invalidcommand(self): widget = self.create() self.checkCommandParam(widget, 'invalidcommand') - def test_show(self): + def test_configure_show(self): widget = self.create() self.checkParam(widget, 'show', '*') self.checkParam(widget, 'show', '') self.checkParam(widget, 'show', ' ') - def test_state(self): + def test_configure_state(self): widget = self.create() self.checkParams(widget, 'state', 'disabled', 'normal', 'readonly') - def test_validate(self): + def test_configure_validate(self): widget = self.create() self.checkEnumParam(widget, 'validate', 'all', 'key', 'focus', 'focusin', 'focusout', 'none') - def test_validatecommand(self): + def test_configure_validatecommand(self): widget = self.create() self.checkCommandParam(widget, 'validatecommand') @@ -326,8 +325,7 @@ def test_bbox(self): def test_identify(self): self.entry.pack() - self.entry.wait_visibility() - self.entry.update_idletasks() + self.entry.update() # bpo-27313: macOS Cocoa widget differs from X, allow either if sys.platform == 'darwin': @@ -431,17 +429,18 @@ def setUp(self): def create(self, **kwargs): return ttk.Combobox(self.root, **kwargs) - def test_height(self): + def test_configure_height(self): widget = self.create() self.checkParams(widget, 'height', 100, 101.2, 102.6, -100, 0, '1i') def _show_drop_down_listbox(self): width = self.combo.winfo_width() - self.combo.event_generate('', x=width - 5, y=5) - self.combo.event_generate('', x=width - 5, y=5) + x, y = width - 5, 5 + self.assertRegex(self.combo.identify(x, y), r'.*downarrow\Z') + self.combo.event_generate('', x=x, y=y) + self.combo.event_generate('', x=x, y=y) self.combo.update_idletasks() - def test_virtual_event(self): success = [] @@ -449,7 +448,7 @@ def test_virtual_event(self): self.combo.bind('<>', lambda evt: success.append(True)) self.combo.pack() - self.combo.wait_visibility() + self.combo.update() height = self.combo.winfo_height() self._show_drop_down_listbox() @@ -460,12 +459,12 @@ def test_virtual_event(self): self.assertTrue(success) - def test_postcommand(self): + def test_configure_postcommand(self): success = [] self.combo['postcommand'] = lambda: success.append(True) self.combo.pack() - self.combo.wait_visibility() + self.combo.update() self._show_drop_down_listbox() self.assertTrue(success) @@ -476,7 +475,7 @@ def test_postcommand(self): self.assertEqual(len(success), 1) - def test_values(self): + def test_configure_values(self): def check_get_current(getval, currval): self.assertEqual(self.combo.get(), getval) self.assertEqual(self.combo.current(), currval) @@ -552,7 +551,7 @@ def setUp(self): def create(self, **kwargs): return ttk.PanedWindow(self.root, **kwargs) - def test_orient(self): + def test_configure_orient(self): widget = self.create() self.assertEqual(str(widget['orient']), 'vertical') errmsg='attempt to change read-only option' @@ -665,7 +664,6 @@ def test_sashpos(self): self.assertRaises(tkinter.TclError, self.paned.sashpos, 1) self.paned.pack(expand=True, fill='both') - self.paned.wait_visibility() curr_pos = self.paned.sashpos(0) self.paned.sashpos(0, 1000) @@ -686,11 +684,11 @@ class RadiobuttonTest(AbstractLabelTest, unittest.TestCase): def create(self, **kwargs): return ttk.Radiobutton(self.root, **kwargs) - def test_value(self): + def test_configure_value(self): widget = self.create() self.checkParams(widget, 'value', 1, 2.3, '', 'any string') - def test_invoke(self): + def test_configure_invoke(self): success = [] def cb_test(): success.append(1) @@ -741,7 +739,7 @@ def test_direction(self): self.checkEnumParam(widget, 'direction', 'above', 'below', 'left', 'right', 'flush') - def test_menu(self): + def test_configure_menu(self): widget = self.create() menu = tkinter.Menu(widget, name='menu') self.checkParam(widget, 'menu', menu, conv=str) @@ -766,19 +764,19 @@ def setUp(self): def create(self, **kwargs): return ttk.Scale(self.root, **kwargs) - def test_from(self): + def test_configure_from(self): widget = self.create() self.checkFloatParam(widget, 'from', 100, 14.9, 15.1, conv=False) - def test_length(self): + def test_configure_length(self): widget = self.create() self.checkPixelsParam(widget, 'length', 130, 131.2, 135.6, '5i') - def test_to(self): + def test_configure_to(self): widget = self.create() self.checkFloatParam(widget, 'to', 300, 14.9, 15.1, -10, conv=False) - def test_value(self): + def test_configure_value(self): widget = self.create() self.checkFloatParam(widget, 'value', 300, 14.9, 15.1, -10, conv=False) @@ -868,23 +866,23 @@ class ProgressbarTest(AbstractWidgetTest, unittest.TestCase): def create(self, **kwargs): return ttk.Progressbar(self.root, **kwargs) - def test_length(self): + def test_configure_length(self): widget = self.create() self.checkPixelsParam(widget, 'length', 100.1, 56.7, '2i') - def test_maximum(self): + def test_configure_maximum(self): widget = self.create() self.checkFloatParam(widget, 'maximum', 150.2, 77.7, 0, -10, conv=False) - def test_mode(self): + def test_configure_mode(self): widget = self.create() self.checkEnumParam(widget, 'mode', 'determinate', 'indeterminate') - def test_phase(self): + def test_configure_phase(self): # XXX pass - def test_value(self): + def test_configure_value(self): widget = self.create() self.checkFloatParam(widget, 'value', 150.2, 77.7, 0, -10, conv=False) @@ -933,7 +931,7 @@ def test_tab_identifiers(self): self.nb.add(self.child1, text='a') self.nb.pack() - self.nb.wait_visibility() + self.nb.update() if sys.platform == 'darwin': tb_idx = "@20,5" else: @@ -1041,7 +1039,7 @@ def test_insert(self): def test_select(self): self.nb.pack() - self.nb.wait_visibility() + self.nb.update() success = [] tab_changed = [] @@ -1073,7 +1071,7 @@ def test_tab(self): self.assertEqual(self.nb.tab(self.child1, 'text'), 'abc') - def test_tabs(self): + def test_configure_tabs(self): self.assertEqual(len(self.nb.tabs()), 2) self.nb.forget(self.child1) @@ -1084,10 +1082,11 @@ def test_tabs(self): def test_traversal(self): self.nb.pack() - self.nb.wait_visibility() + self.nb.update() self.nb.select(0) + self.assertEqual(self.nb.identify(5, 5), 'focus') simulate_mouse_click(self.nb, 5, 5) self.nb.focus_force() self.nb.event_generate('') @@ -1102,6 +1101,7 @@ def test_traversal(self): self.nb.tab(self.child1, text='a', underline=0) self.nb.enable_traversal() self.nb.focus_force() + self.assertEqual(self.nb.identify(5, 5), 'focus') simulate_mouse_click(self.nb, 5, 5) if sys.platform == 'darwin': self.nb.event_generate('') @@ -1132,6 +1132,7 @@ def _click_increment_arrow(self): height = self.spin.winfo_height() x = width - 5 y = height//2 - 5 + self.assertRegex(self.spin.identify(x, y), r'.*uparrow\Z') self.spin.event_generate('', x=x, y=y) self.spin.event_generate('', x=x, y=y) self.spin.update_idletasks() @@ -1141,11 +1142,12 @@ def _click_decrement_arrow(self): height = self.spin.winfo_height() x = width - 5 y = height//2 + 4 + self.assertRegex(self.spin.identify(x, y), r'.*downarrow\Z') self.spin.event_generate('', x=x, y=y) self.spin.event_generate('', x=x, y=y) self.spin.update_idletasks() - def test_command(self): + def test_configure_command(self): success = [] self.spin['command'] = lambda: success.append(True) @@ -1165,7 +1167,7 @@ def test_command(self): self.spin.update() self.assertEqual(len(success), 2) - def test_to(self): + def test_configure_to(self): self.spin['from'] = 0 self.spin['to'] = 5 self.spin.set(4) @@ -1177,7 +1179,7 @@ def test_to(self): self._click_increment_arrow() # 5 self.assertEqual(self.spin.get(), '5') - def test_from(self): + def test_configure_from(self): self.spin['from'] = 1 self.spin['to'] = 10 self.spin.set(2) @@ -1187,7 +1189,7 @@ def test_from(self): self._click_decrement_arrow() # 1 self.assertEqual(self.spin.get(), '1') - def test_increment(self): + def test_configure_increment(self): self.spin['from'] = 0 self.spin['to'] = 10 self.spin['increment'] = 4 @@ -1201,7 +1203,7 @@ def test_increment(self): self._click_decrement_arrow() # 3 self.assertEqual(self.spin.get(), '3') - def test_format(self): + def test_configure_format(self): self.spin.set(1) self.spin['format'] = '%10.3f' self.spin.update() @@ -1218,7 +1220,7 @@ def test_format(self): self.assertTrue('.' not in value) self.assertEqual(len(value), 1) - def test_wrap(self): + def test_configure_wrap(self): self.spin['to'] = 10 self.spin['from'] = 1 self.spin.set(1) @@ -1237,7 +1239,7 @@ def test_wrap(self): self._click_decrement_arrow() self.assertEqual(self.spin.get(), '1') - def test_values(self): + def test_configure_values(self): self.assertEqual(self.spin['values'], () if tcl_version < (8, 5) else '') self.checkParam(self.spin, 'values', 'mon tue wed thur', @@ -1297,14 +1299,14 @@ def setUp(self): def create(self, **kwargs): return ttk.Treeview(self.root, **kwargs) - def test_columns(self): + def test_configure_columns(self): widget = self.create() self.checkParam(widget, 'columns', 'a b c', expected=('a', 'b', 'c')) self.checkParam(widget, 'columns', ('a', 'b', 'c')) self.checkParam(widget, 'columns', '') - def test_displaycolumns(self): + def test_configure_displaycolumns(self): widget = self.create() widget['columns'] = ('a', 'b', 'c') self.checkParam(widget, 'displaycolumns', 'b a c', @@ -1320,17 +1322,17 @@ def test_displaycolumns(self): self.checkInvalidParam(widget, 'displaycolumns', (1, -2), errmsg='Column index -2 out of bounds') - def test_height(self): + def test_configure_height(self): widget = self.create() self.checkPixelsParam(widget, 'height', 100, -100, 0, '3c', conv=False) self.checkPixelsParam(widget, 'height', 101.2, 102.6, conv=noconv) - def test_selectmode(self): + def test_configure_selectmode(self): widget = self.create() self.checkEnumParam(widget, 'selectmode', 'none', 'browse', 'extended') - def test_show(self): + def test_configure_show(self): widget = self.create() self.checkParam(widget, 'show', 'tree headings', expected=('tree', 'headings')) @@ -1342,7 +1344,6 @@ def test_show(self): def test_bbox(self): self.tv.pack() self.assertEqual(self.tv.bbox(''), '') - self.tv.wait_visibility() self.tv.update() item_id = self.tv.insert('', 'end') @@ -1530,13 +1531,15 @@ def test_heading(self): def test_heading_callback(self): def simulate_heading_click(x, y): + if tcl_version >= (8, 6): + self.assertEqual(self.tv.identify_column(x), '#0') + self.assertEqual(self.tv.identify_region(x, y), 'heading') simulate_mouse_click(self.tv, x, y) self.tv.update() success = [] # no success for now self.tv.pack() - self.tv.wait_visibility() self.tv.heading('#0', command=lambda: success.append(True)) self.tv.column('#0', width=100) self.tv.update() @@ -1784,7 +1787,6 @@ def test_tag_bind(self): lambda evt: events.append(2)) self.tv.pack() - self.tv.wait_visibility() self.tv.update() pos_y = set() @@ -1858,12 +1860,22 @@ class SizegripTest(AbstractWidgetTest, unittest.TestCase): def create(self, **kwargs): return ttk.Sizegrip(self.root, **kwargs) + +class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase): + + def test_frame(self): + self._test_widget(ttk.Frame) + + def test_label(self): + self._test_widget(ttk.Label) + + tests_gui = ( ButtonTest, CheckbuttonTest, ComboboxTest, EntryTest, FrameTest, LabelFrameTest, LabelTest, MenubuttonTest, NotebookTest, PanedWindowTest, ProgressbarTest, RadiobuttonTest, ScaleTest, ScrollbarTest, SeparatorTest, - SizegripTest, SpinboxTest, TreeviewTest, WidgetTest, + SizegripTest, SpinboxTest, TreeviewTest, WidgetTest, DefaultRootTest, ) if __name__ == "__main__": diff --git a/Lib/tkinter/test/widget_tests.py b/Lib/tkinter/test/widget_tests.py index b42ff52178f29e7c585febcb916871dcc1b7574d..9702ff453002e9dcfecdc4308e8e44b06970602b 100644 --- a/Lib/tkinter/test/widget_tests.py +++ b/Lib/tkinter/test/widget_tests.py @@ -1,7 +1,6 @@ # Common tests for test_tkinter/test_widgets.py and test_ttk/test_widgets.py import unittest -import sys import tkinter from tkinter.test.support import (AbstractTkTest, tcl_version, requires_tcl, get_tk_patchlevel, pixels_conv, tcl_obj_eq) @@ -243,31 +242,31 @@ class StandardOptionsTests: 'underline', 'wraplength', 'xscrollcommand', 'yscrollcommand', ) - def test_activebackground(self): + def test_configure_activebackground(self): widget = self.create() self.checkColorParam(widget, 'activebackground') - def test_activeborderwidth(self): + def test_configure_activeborderwidth(self): widget = self.create() self.checkPixelsParam(widget, 'activeborderwidth', 0, 1.3, 2.9, 6, -2, '10p') - def test_activeforeground(self): + def test_configure_activeforeground(self): widget = self.create() self.checkColorParam(widget, 'activeforeground') - def test_anchor(self): + def test_configure_anchor(self): widget = self.create() self.checkEnumParam(widget, 'anchor', 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw', 'center') - def test_background(self): + def test_configure_background(self): widget = self.create() self.checkColorParam(widget, 'background') if 'bg' in self.OPTIONS: self.checkColorParam(widget, 'bg') - def test_bitmap(self): + def test_configure_bitmap(self): widget = self.create() self.checkParam(widget, 'bitmap', 'questhead') self.checkParam(widget, 'bitmap', 'gray50') @@ -280,90 +279,88 @@ def test_bitmap(self): self.checkInvalidParam(widget, 'bitmap', 'spam', errmsg='bitmap "spam" not defined') - def test_borderwidth(self): + def test_configure_borderwidth(self): widget = self.create() self.checkPixelsParam(widget, 'borderwidth', 0, 1.3, 2.6, 6, -2, '10p') if 'bd' in self.OPTIONS: self.checkPixelsParam(widget, 'bd', 0, 1.3, 2.6, 6, -2, '10p') - def test_compound(self): + def test_configure_compound(self): widget = self.create() self.checkEnumParam(widget, 'compound', 'bottom', 'center', 'left', 'none', 'right', 'top') - def test_cursor(self): + def test_configure_cursor(self): widget = self.create() self.checkCursorParam(widget, 'cursor') - def test_disabledforeground(self): + def test_configure_disabledforeground(self): widget = self.create() self.checkColorParam(widget, 'disabledforeground') - def test_exportselection(self): + def test_configure_exportselection(self): widget = self.create() self.checkBooleanParam(widget, 'exportselection') - def test_font(self): + def test_configure_font(self): widget = self.create() self.checkParam(widget, 'font', '-Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*') self.checkInvalidParam(widget, 'font', '', errmsg='font "" doesn\'t exist') - def test_foreground(self): + def test_configure_foreground(self): widget = self.create() self.checkColorParam(widget, 'foreground') if 'fg' in self.OPTIONS: self.checkColorParam(widget, 'fg') - def test_highlightbackground(self): + def test_configure_highlightbackground(self): widget = self.create() self.checkColorParam(widget, 'highlightbackground') - def test_highlightcolor(self): + def test_configure_highlightcolor(self): widget = self.create() self.checkColorParam(widget, 'highlightcolor') - def test_highlightthickness(self): + def test_configure_highlightthickness(self): widget = self.create() self.checkPixelsParam(widget, 'highlightthickness', 0, 1.3, 2.6, 6, '10p') self.checkParam(widget, 'highlightthickness', -2, expected=0, conv=self._conv_pixels) - @unittest.skipIf(sys.platform == 'darwin', - 'crashes with Cocoa Tk (issue19733)') - def test_image(self): + def test_configure_image(self): widget = self.create() self.checkImageParam(widget, 'image') - def test_insertbackground(self): + def test_configure_insertbackground(self): widget = self.create() self.checkColorParam(widget, 'insertbackground') - def test_insertborderwidth(self): + def test_configure_insertborderwidth(self): widget = self.create() self.checkPixelsParam(widget, 'insertborderwidth', 0, 1.3, 2.6, 6, -2, '10p') - def test_insertofftime(self): + def test_configure_insertofftime(self): widget = self.create() self.checkIntegerParam(widget, 'insertofftime', 100) - def test_insertontime(self): + def test_configure_insertontime(self): widget = self.create() self.checkIntegerParam(widget, 'insertontime', 100) - def test_insertwidth(self): + def test_configure_insertwidth(self): widget = self.create() self.checkPixelsParam(widget, 'insertwidth', 1.3, 2.6, -2, '10p') - def test_jump(self): + def test_configure_jump(self): widget = self.create() self.checkBooleanParam(widget, 'jump') - def test_justify(self): + def test_configure_justify(self): widget = self.create() self.checkEnumParam(widget, 'justify', 'left', 'right', 'center', errmsg='bad justification "{}": must be ' @@ -372,154 +369,155 @@ def test_justify(self): errmsg='ambiguous justification "": must be ' 'left, right, or center') - def test_orient(self): + def test_configure_orient(self): widget = self.create() self.assertEqual(str(widget['orient']), self.default_orient) self.checkEnumParam(widget, 'orient', 'horizontal', 'vertical') - def test_padx(self): + def test_configure_padx(self): widget = self.create() self.checkPixelsParam(widget, 'padx', 3, 4.4, 5.6, -2, '12m', conv=self._conv_pad_pixels) - def test_pady(self): + def test_configure_pady(self): widget = self.create() self.checkPixelsParam(widget, 'pady', 3, 4.4, 5.6, -2, '12m', conv=self._conv_pad_pixels) - def test_relief(self): + def test_configure_relief(self): widget = self.create() self.checkReliefParam(widget, 'relief') - def test_repeatdelay(self): + def test_configure_repeatdelay(self): widget = self.create() self.checkIntegerParam(widget, 'repeatdelay', -500, 500) - def test_repeatinterval(self): + def test_configure_repeatinterval(self): widget = self.create() self.checkIntegerParam(widget, 'repeatinterval', -500, 500) - def test_selectbackground(self): + def test_configure_selectbackground(self): widget = self.create() self.checkColorParam(widget, 'selectbackground') - def test_selectborderwidth(self): + def test_configure_selectborderwidth(self): widget = self.create() self.checkPixelsParam(widget, 'selectborderwidth', 1.3, 2.6, -2, '10p') - def test_selectforeground(self): + def test_configure_selectforeground(self): widget = self.create() self.checkColorParam(widget, 'selectforeground') - def test_setgrid(self): + def test_configure_setgrid(self): widget = self.create() self.checkBooleanParam(widget, 'setgrid') - def test_state(self): + def test_configure_state(self): widget = self.create() self.checkEnumParam(widget, 'state', 'active', 'disabled', 'normal') - def test_takefocus(self): + def test_configure_takefocus(self): widget = self.create() self.checkParams(widget, 'takefocus', '0', '1', '') - def test_text(self): + def test_configure_text(self): widget = self.create() self.checkParams(widget, 'text', '', 'any string') - def test_textvariable(self): + def test_configure_textvariable(self): widget = self.create() var = tkinter.StringVar(self.root) self.checkVariableParam(widget, 'textvariable', var) - def test_troughcolor(self): + def test_configure_troughcolor(self): widget = self.create() self.checkColorParam(widget, 'troughcolor') - def test_underline(self): + def test_configure_underline(self): widget = self.create() self.checkIntegerParam(widget, 'underline', 0, 1, 10) - def test_wraplength(self): + def test_configure_wraplength(self): widget = self.create() self.checkPixelsParam(widget, 'wraplength', 100) - def test_xscrollcommand(self): + def test_configure_xscrollcommand(self): widget = self.create() self.checkCommandParam(widget, 'xscrollcommand') - def test_yscrollcommand(self): + def test_configure_yscrollcommand(self): widget = self.create() self.checkCommandParam(widget, 'yscrollcommand') # non-standard but common options - def test_command(self): + def test_configure_command(self): widget = self.create() self.checkCommandParam(widget, 'command') - def test_indicatoron(self): + def test_configure_indicatoron(self): widget = self.create() self.checkBooleanParam(widget, 'indicatoron') - def test_offrelief(self): + def test_configure_offrelief(self): widget = self.create() self.checkReliefParam(widget, 'offrelief') - def test_overrelief(self): + def test_configure_overrelief(self): widget = self.create() self.checkReliefParam(widget, 'overrelief') - def test_selectcolor(self): + def test_configure_selectcolor(self): widget = self.create() self.checkColorParam(widget, 'selectcolor') - def test_selectimage(self): + def test_configure_selectimage(self): widget = self.create() self.checkImageParam(widget, 'selectimage') @requires_tcl(8, 5) - def test_tristateimage(self): + def test_configure_tristateimage(self): widget = self.create() self.checkImageParam(widget, 'tristateimage') @requires_tcl(8, 5) - def test_tristatevalue(self): + def test_configure_tristatevalue(self): widget = self.create() self.checkParam(widget, 'tristatevalue', 'unknowable') - def test_variable(self): + def test_configure_variable(self): widget = self.create() var = tkinter.DoubleVar(self.root) self.checkVariableParam(widget, 'variable', var) class IntegerSizeTests: - def test_height(self): + def test_configure_height(self): widget = self.create() self.checkIntegerParam(widget, 'height', 100, -100, 0) - def test_width(self): + def test_configure_width(self): widget = self.create() self.checkIntegerParam(widget, 'width', 402, -402, 0) class PixelSizeTests: - def test_height(self): + def test_configure_height(self): widget = self.create() self.checkPixelsParam(widget, 'height', 100, 101.2, 102.6, -100, 0, '3c') - def test_width(self): + def test_configure_width(self): widget = self.create() self.checkPixelsParam(widget, 'width', 402, 403.4, 404.6, -402, 0, '5i') def add_standard_options(*source_classes): - # This decorator adds test_xxx methods from source classes for every xxx - # option in the OPTIONS class attribute if they are not defined explicitly. + # This decorator adds test_configure_xxx methods from source classes for + # every xxx option in the OPTIONS class attribute if they are not defined + # explicitly. def decorator(cls): for option in cls.OPTIONS: - methodname = 'test_' + option + methodname = 'test_configure_' + option if not hasattr(cls, methodname): for source_class in source_classes: if hasattr(source_class, methodname): diff --git a/Lib/tkinter/tix.py b/Lib/tkinter/tix.py index ac545502e45c30b22395de366f2f18e0f8f614b5..ef1e7406bc1ae0c333c53604dd6d1aeea8360c16 100644 --- a/Lib/tkinter/tix.py +++ b/Lib/tkinter/tix.py @@ -387,9 +387,7 @@ def config_all(self, option, value): # These are missing from Tkinter def image_create(self, imgtype, cnf={}, master=None, **kw): if not master: - master = tkinter._default_root - if not master: - raise RuntimeError('Too early to create image') + master = self if kw and cnf: cnf = _cnfmerge((cnf, kw)) elif kw: cnf = kw options = () @@ -475,10 +473,7 @@ def __init__(self, itemtype, cnf={}, *, master=None, **kw): elif 'refwindow' in cnf: master = cnf['refwindow'] else: - master = tkinter._default_root - if not master: - raise RuntimeError("Too early to create display style: " - "no root window") + master = tkinter._get_default_root('create display style') self.tk = master.tk self.stylename = self.tk.call('tixDisplayStyle', itemtype, *self._options(cnf,kw) ) diff --git a/Lib/tkinter/ttk.py b/Lib/tkinter/ttk.py index c7c71cd5a559cf610c50bfac57457cfedac770c5..ab7aeb15e8ff222e3b99bc56badba70ea0f17098 100644 --- a/Lib/tkinter/ttk.py +++ b/Lib/tkinter/ttk.py @@ -81,8 +81,6 @@ def _mapdict_values(items): # ['active selected', 'grey', 'focus', [1, 2, 3, 4]] opt_val = [] for *state, val in items: - # hacks for backward compatibility - state[0] # raise IndexError if empty if len(state) == 1: # if it is empty (something that evaluates to False), then # format it to Tcl code to denote the "normal" state @@ -243,19 +241,22 @@ def _script_from_settings(settings): def _list_from_statespec(stuple): """Construct a list from the given statespec tuple according to the accepted statespec accepted by _format_mapdict.""" - nval = [] - for val in stuple: - typename = getattr(val, 'typename', None) - if typename is None: - nval.append(val) - else: # this is a Tcl object + if isinstance(stuple, str): + return stuple + result = [] + it = iter(stuple) + for state, val in zip(it, it): + if hasattr(state, 'typename'): # this is a Tcl object + state = str(state).split() + elif isinstance(state, str): + state = state.split() + elif not isinstance(state, (tuple, list)): + state = (state,) + if hasattr(val, 'typename'): val = str(val) - if typename == 'StateSpec': - val = val.split() - nval.append(val) + result.append((*state, val)) - it = iter(nval) - return [_flatten(spec) for spec in zip(it, it)] + return result def _list_from_layouttuple(tk, ltuple): """Construct a list from the tuple returned by ttk::layout, this is @@ -348,12 +349,7 @@ def setup_master(master=None): If it is not allowed to use the default root and master is None, RuntimeError is raised.""" if master is None: - if tkinter._support_default_root: - master = tkinter._default_root or tkinter.Tk() - else: - raise RuntimeError( - "No master specified and tkinter is " - "configured to not support default root") + master = tkinter._get_default_root() return master @@ -395,13 +391,12 @@ def map(self, style, query_opt=None, **kw): or something else of your preference. A statespec is compound of one or more states and then a value.""" if query_opt is not None: - return _list_from_statespec(self.tk.splitlist( - self.tk.call(self._name, "map", style, '-%s' % query_opt))) + result = self.tk.call(self._name, "map", style, '-%s' % query_opt) + return _list_from_statespec(self.tk.splitlist(result)) - return _splitdict( - self.tk, - self.tk.call(self._name, "map", style, *_format_mapdict(kw)), - conv=_tclobj_to_py) + result = self.tk.call(self._name, "map", style, *_format_mapdict(kw)) + return {k: _list_from_statespec(self.tk.splitlist(v)) + for k, v in _splitdict(self.tk, result).items()} def lookup(self, style, option, state=None, default=None): @@ -1538,7 +1533,10 @@ def __init__(self, master=None, variable=None, from_=0, to=10, **kw): scale_side = 'bottom' if self._label_top else 'top' label_side = 'top' if scale_side == 'bottom' else 'bottom' self.scale.pack(side=scale_side, fill='x') - tmp = Label(self).pack(side=label_side) # place holder + # Dummy required to make frame correct height + dummy = Label(self) + dummy.pack(side=label_side) + dummy.lower() self.label.place(anchor='n' if label_side == 'top' else 's') # update the label as scale or variable changes diff --git a/Lib/trace.py b/Lib/trace.py index 89f17d485f35e8291336250bfc8e0166c8d08353..c505d8bc72a98ca6fe7818392f70f29f89da8492 100755 --- a/Lib/trace.py +++ b/Lib/trace.py @@ -453,22 +453,7 @@ def runctx(self, cmd, globals=None, locals=None): sys.settrace(None) threading.settrace(None) - def runfunc(*args, **kw): - if len(args) >= 2: - self, func, *args = args - elif not args: - raise TypeError("descriptor 'runfunc' of 'Trace' object " - "needs an argument") - elif 'func' in kw: - func = kw.pop('func') - self, *args = args - import warnings - warnings.warn("Passing 'func' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('runfunc expected at least 1 positional argument, ' - 'got %d' % (len(args)-1)) - + def runfunc(self, func, /, *args, **kw): result = None if not self.donothing: sys.settrace(self.globaltrace) @@ -478,7 +463,6 @@ def runfunc(*args, **kw): if not self.donothing: sys.settrace(None) return result - runfunc.__text_signature__ = '($self, func, /, *args, **kw)' def file_module_function_of(self, frame): code = frame.f_code diff --git a/Lib/traceback.py b/Lib/traceback.py index 5ef3be74be74ab342dd9896056cab363f3fe803f..d7fbdae680be6242b7e7b8874d2671bc0f7945c2 100644 --- a/Lib/traceback.py +++ b/Lib/traceback.py @@ -500,7 +500,6 @@ def __init__(self, exc_type, exc_value, exc_traceback, *, limit=None, _seen=_seen) else: context = None - self.exc_traceback = exc_traceback self.__cause__ = cause self.__context__ = context self.__suppress_context__ = \ @@ -516,7 +515,8 @@ def __init__(self, exc_type, exc_value, exc_traceback, *, limit=None, if exc_type and issubclass(exc_type, SyntaxError): # Handle SyntaxError's specially self.filename = exc_value.filename - self.lineno = str(exc_value.lineno) + lno = exc_value.lineno + self.lineno = str(lno) if lno is not None else None self.text = exc_value.text self.offset = exc_value.offset self.msg = exc_value.msg @@ -538,7 +538,9 @@ def _load_lines(self): self.__cause__._load_lines() def __eq__(self, other): - return self.__dict__ == other.__dict__ + if isinstance(other, TracebackException): + return self.__dict__ == other.__dict__ + return NotImplemented def __str__(self): return self._str @@ -567,26 +569,36 @@ def format_exception_only(self): if not issubclass(self.exc_type, SyntaxError): yield _format_final_exc_line(stype, self._str) - return - - # It was a syntax error; show exactly where the problem was found. - filename = self.filename or "" - lineno = str(self.lineno) or '?' - yield ' File "{}", line {}\n'.format(filename, lineno) - - badline = self.text - offset = self.offset - if badline is not None: - yield ' {}\n'.format(badline.strip()) - if offset is not None: - caretspace = badline.rstrip('\n') - offset = min(len(caretspace), offset) - 1 - caretspace = caretspace[:offset].lstrip() + else: + yield from self._format_syntax_error(stype) + + def _format_syntax_error(self, stype): + """Format SyntaxError exceptions (internal helper).""" + # Show exactly where the problem was found. + filename_suffix = '' + if self.lineno is not None: + yield ' File "{}", line {}\n'.format( + self.filename or "", self.lineno) + elif self.filename is not None: + filename_suffix = ' ({})'.format(self.filename) + + text = self.text + if text is not None: + # text = " foo\n" + # rtext = " foo" + # ltext = "foo" + rtext = text.rstrip('\n') + ltext = rtext.lstrip(' \n\f') + spaces = len(rtext) - len(ltext) + yield ' {}\n'.format(ltext) + # Convert 1-based column offset to 0-based index into stripped text + caret = (self.offset or 0) - 1 - spaces + if caret >= 0: # non-space whitespace (likes tabs) must be kept for alignment - caretspace = ((c.isspace() and c or ' ') for c in caretspace) + caretspace = ((c if c.isspace() else ' ') for c in ltext[:caret]) yield ' {}^\n'.format(''.join(caretspace)) msg = self.msg or "" - yield "{}: {}\n".format(stype, msg) + yield "{}: {}{}\n".format(stype, msg, filename_suffix) def format(self, *, chain=True): """Format the exception. @@ -608,7 +620,7 @@ def format(self, *, chain=True): not self.__suppress_context__): yield from self.__context__.format(chain=chain) yield _context_message - if self.exc_traceback is not None: + if self.stack: yield 'Traceback (most recent call last):\n' - yield from self.stack.format() + yield from self.stack.format() yield from self.format_exception_only() diff --git a/Lib/tracemalloc.py b/Lib/tracemalloc.py index 2c1ac3b39b0784c1fc77572a91d38a76b3187a5d..cec99c59700fe05e457f3668d2b947cc6bfef9c6 100644 --- a/Lib/tracemalloc.py +++ b/Lib/tracemalloc.py @@ -43,6 +43,8 @@ def __hash__(self): return hash((self.traceback, self.size, self.count)) def __eq__(self, other): + if not isinstance(other, Statistic): + return NotImplemented return (self.traceback == other.traceback and self.size == other.size and self.count == other.count) @@ -84,6 +86,8 @@ def __hash__(self): self.count, self.count_diff)) def __eq__(self, other): + if not isinstance(other, StatisticDiff): + return NotImplemented return (self.traceback == other.traceback and self.size == other.size and self.size_diff == other.size_diff @@ -153,9 +157,13 @@ def lineno(self): return self._frame[1] def __eq__(self, other): + if not isinstance(other, Frame): + return NotImplemented return (self._frame == other._frame) def __lt__(self, other): + if not isinstance(other, Frame): + return NotImplemented return (self._frame < other._frame) def __hash__(self): @@ -174,15 +182,20 @@ class Traceback(Sequence): Sequence of Frame instances sorted from the oldest frame to the most recent frame. """ - __slots__ = ("_frames",) + __slots__ = ("_frames", '_total_nframe') - def __init__(self, frames): + def __init__(self, frames, total_nframe=None): Sequence.__init__(self) # frames is a tuple of frame tuples: see Frame constructor for the # format of a frame tuple; it is reversed, because _tracemalloc # returns frames sorted from most recent to oldest, but the # Python API expects oldest to most recent self._frames = tuple(reversed(frames)) + self._total_nframe = total_nframe + + @property + def total_nframe(self): + return self._total_nframe def __len__(self): return len(self._frames) @@ -200,16 +213,25 @@ def __hash__(self): return hash(self._frames) def __eq__(self, other): + if not isinstance(other, Traceback): + return NotImplemented return (self._frames == other._frames) def __lt__(self, other): + if not isinstance(other, Traceback): + return NotImplemented return (self._frames < other._frames) def __str__(self): return str(self[0]) def __repr__(self): - return "" % (tuple(self),) + s = f"" + return s def format(self, limit=None, most_recent_first=False): lines = [] @@ -268,9 +290,11 @@ def size(self): @property def traceback(self): - return Traceback(self._trace[2]) + return Traceback(*self._trace[2:]) def __eq__(self, other): + if not isinstance(other, Trace): + return NotImplemented return (self._trace == other._trace) def __hash__(self): @@ -303,6 +327,8 @@ def __contains__(self, trace): return trace._trace in self._traces def __eq__(self, other): + if not isinstance(other, _Traces): + return NotImplemented return (self._traces == other._traces) def __repr__(self): @@ -362,7 +388,7 @@ def _match_traceback(self, traceback): return self._match_frame(filename, lineno) def _match(self, trace): - domain, size, traceback = trace + domain, size, traceback, total_nframe = trace res = self._match_traceback(traceback) if self.domain is not None: if self.inclusive: @@ -382,7 +408,7 @@ def domain(self): return self._domain def _match(self, trace): - domain, size, traceback = trace + domain, size, traceback, total_nframe = trace return (domain == self.domain) ^ (not self.inclusive) @@ -459,7 +485,7 @@ def _group_by(self, key_type, cumulative): tracebacks = {} if not cumulative: for trace in self.traces._traces: - domain, size, trace_traceback = trace + domain, size, trace_traceback, total_nframe = trace try: traceback = tracebacks[trace_traceback] except KeyError: @@ -480,7 +506,7 @@ def _group_by(self, key_type, cumulative): else: # cumulative statistics for trace in self.traces._traces: - domain, size, trace_traceback = trace + domain, size, trace_traceback, total_nframe = trace for frame in trace_traceback: try: traceback = tracebacks[frame] diff --git a/Lib/turtle.py b/Lib/turtle.py index ee67a351b54f196f97111ff4dea5cd22c01479e5..ba8288daf83f2623dfdd69522da7d8b2d0f6f2ad 100644 --- a/Lib/turtle.py +++ b/Lib/turtle.py @@ -258,6 +258,7 @@ def __mul__(self, other): def __rmul__(self, other): if isinstance(other, int) or isinstance(other, float): return Vec2D(self[0]*other, self[1]*other) + return NotImplemented def __sub__(self, other): return Vec2D(self[0]-other[0], self[1]-other[1]) def __neg__(self): diff --git a/Lib/types.py b/Lib/types.py index ea3c0b29d5d4ddd9daf27fdb37ec7bb6ee8033c4..ad2020ec69b637fb3a85dc5c15b99e9c56dd87f4 100644 --- a/Lib/types.py +++ b/Lib/types.py @@ -293,4 +293,7 @@ def wrapped(*args, **kwargs): return wrapped +GenericAlias = type(list[int]) + + __all__ = [n for n in globals() if n[:1] != '_'] diff --git a/Lib/typing.py b/Lib/typing.py index 589eea98ad31c6ffd2affc179166069646172345..3556b8adb8190566f4bdc4cc2b515ae753ebf76e 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -26,11 +26,12 @@ import re as stdlib_re # Avoid confusion with the re we export. import sys import types -from types import WrapperDescriptorType, MethodWrapperType, MethodDescriptorType +from types import WrapperDescriptorType, MethodWrapperType, MethodDescriptorType, GenericAlias # Please keep __all__ alphabetized within each category. __all__ = [ # Super-special typing primitives. + 'Annotated', 'Any', 'Callable', 'ClassVar', @@ -117,6 +118,15 @@ # legitimate imports of those modules. +def _type_convert(arg): + """For converting None to type(None), and strings to ForwardRef.""" + if arg is None: + return type(None) + if isinstance(arg, str): + return ForwardRef(arg) + return arg + + def _type_check(arg, msg, is_argument=True): """Check that the argument is a type, and return it (internal helper). @@ -133,15 +143,13 @@ def _type_check(arg, msg, is_argument=True): if is_argument: invalid_generic_forms = invalid_generic_forms + (ClassVar, Final) - if arg is None: - return type(None) - if isinstance(arg, str): - return ForwardRef(arg) + arg = _type_convert(arg) if (isinstance(arg, _GenericAlias) and arg.__origin__ in invalid_generic_forms): raise TypeError(f"{arg} is not valid as type argument") - if (isinstance(arg, _SpecialForm) and arg not in (Any, NoReturn) or - arg in (Generic, Protocol)): + if arg in (Any, NoReturn): + return arg + if isinstance(arg, _SpecialForm) or arg in (Generic, Protocol): raise TypeError(f"Plain {arg} is not valid as type argument") if isinstance(arg, (type, TypeVar, ForwardRef)): return arg @@ -158,6 +166,8 @@ def _type_repr(obj): typically enough to uniquely identify a type. For everything else, we fall back on repr(obj). """ + if isinstance(obj, types.GenericAlias): + return repr(obj) if isinstance(obj, type): if obj.__module__ == 'builtins': return obj.__qualname__ @@ -179,43 +189,37 @@ def _collect_type_vars(types): for t in types: if isinstance(t, TypeVar) and t not in tvars: tvars.append(t) - if isinstance(t, _GenericAlias) and not t._special: + if isinstance(t, (_GenericAlias, GenericAlias)): tvars.extend([t for t in t.__parameters__ if t not in tvars]) return tuple(tvars) -def _subs_tvars(tp, tvars, subs): - """Substitute type variables 'tvars' with substitutions 'subs'. - These two must have the same length. - """ - if not isinstance(tp, _GenericAlias): - return tp - new_args = list(tp.__args__) - for a, arg in enumerate(tp.__args__): - if isinstance(arg, TypeVar): - for i, tvar in enumerate(tvars): - if arg == tvar: - new_args[a] = subs[i] - else: - new_args[a] = _subs_tvars(arg, tvars, subs) - if tp.__origin__ is Union: - return Union[tuple(new_args)] - return tp.copy_with(tuple(new_args)) - - -def _check_generic(cls, parameters): +def _check_generic(cls, parameters, elen): """Check correct count for parameters of a generic cls (internal helper). This gives a nice error message in case of count mismatch. """ - if not cls.__parameters__: + if not elen: raise TypeError(f"{cls} is not a generic class") alen = len(parameters) - elen = len(cls.__parameters__) if alen != elen: raise TypeError(f"Too {'many' if alen > elen else 'few'} parameters for {cls};" f" actual {alen}, expected {elen}") +def _deduplicate(params): + # Weed out strict duplicates, preserving the first of each occurrence. + all_params = set(params) + if len(all_params) < len(params): + new_params = [] + for t in params: + if t in all_params: + new_params.append(t) + all_params.remove(t) + params = new_params + assert not all_params, all_params + return params + + def _remove_dups_flatten(parameters): """An internal helper for Union creation and substitution: flatten Unions among parameters, then remove duplicates. @@ -223,58 +227,68 @@ def _remove_dups_flatten(parameters): # Flatten out Union[Union[...], ...]. params = [] for p in parameters: - if isinstance(p, _GenericAlias) and p.__origin__ is Union: + if isinstance(p, _UnionGenericAlias): params.extend(p.__args__) elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union: params.extend(p[1:]) else: params.append(p) - # Weed out strict duplicates, preserving the first of each occurrence. - all_params = set(params) - if len(all_params) < len(params): - new_params = [] - for t in params: - if t in all_params: - new_params.append(t) - all_params.remove(t) - params = new_params - assert not all_params, all_params + + return tuple(_deduplicate(params)) + + +def _flatten_literal_params(parameters): + """An internal helper for Literal creation: flatten Literals among parameters""" + params = [] + for p in parameters: + if isinstance(p, _LiteralGenericAlias): + params.extend(p.__args__) + else: + params.append(p) return tuple(params) _cleanups = [] -def _tp_cache(func): +def _tp_cache(func=None, /, *, typed=False): """Internal wrapper caching __getitem__ of generic types with a fallback to original function for non-hashable arguments. """ - cached = functools.lru_cache()(func) - _cleanups.append(cached.cache_clear) + def decorator(func): + cached = functools.lru_cache(typed=typed)(func) + _cleanups.append(cached.cache_clear) - @functools.wraps(func) - def inner(*args, **kwds): - try: - return cached(*args, **kwds) - except TypeError: - pass # All real errors (not unhashable args) are raised below. - return func(*args, **kwds) - return inner + @functools.wraps(func) + def inner(*args, **kwds): + try: + return cached(*args, **kwds) + except TypeError: + pass # All real errors (not unhashable args) are raised below. + return func(*args, **kwds) + return inner + + if func is not None: + return decorator(func) + return decorator -def _eval_type(t, globalns, localns): - """Evaluate all forward reverences in the given type t. +def _eval_type(t, globalns, localns, recursive_guard=frozenset()): + """Evaluate all forward references in the given type t. For use of globalns and localns see the docstring for get_type_hints(). + recursive_guard is used to prevent prevent infinite recursion + with recursive ForwardRef. """ if isinstance(t, ForwardRef): - return t._evaluate(globalns, localns) - if isinstance(t, _GenericAlias): - ev_args = tuple(_eval_type(a, globalns, localns) for a in t.__args__) + return t._evaluate(globalns, localns, recursive_guard) + if isinstance(t, (_GenericAlias, GenericAlias)): + ev_args = tuple(_eval_type(a, globalns, localns, recursive_guard) for a in t.__args__) if ev_args == t.__args__: return t - res = t.copy_with(ev_args) - res._special = t._special - return res + if isinstance(t, GenericAlias): + return GenericAlias(t.__origin__, ev_args) + else: + return t.copy_with(ev_args) return t @@ -289,6 +303,7 @@ def __init_subclass__(self, /, *args, **kwds): class _Immutable: """Mixin to indicate that object should not be copied.""" + __slots__ = () def __copy__(self): return self @@ -297,37 +312,18 @@ def __deepcopy__(self, memo): return self -class _SpecialForm(_Final, _Immutable, _root=True): - """Internal indicator of special typing constructs. - See _doc instance attribute for specific docs. - """ +# Internal indicator of special typing constructs. +# See __doc__ instance attribute for specific docs. +class _SpecialForm(_Final, _root=True): + __slots__ = ('_name', '__doc__', '_getitem') - __slots__ = ('_name', '_doc') + def __init__(self, getitem): + self._getitem = getitem + self._name = getitem.__name__ + self.__doc__ = getitem.__doc__ - def __new__(cls, *args, **kwds): - """Constructor. - - This only exists to give a better error message in case - someone tries to subclass a special typing object (not a good idea). - """ - if (len(args) == 3 and - isinstance(args[0], str) and - isinstance(args[1], tuple)): - # Close enough. - raise TypeError(f"Cannot subclass {cls!r}") - return super().__new__(cls) - - def __init__(self, name, doc): - self._name = name - self._doc = doc - - def __eq__(self, other): - if not isinstance(other, _SpecialForm): - return NotImplemented - return self._name == other._name - - def __hash__(self): - return hash((self._name,)) + def __mro_entries__(self, bases): + raise TypeError(f"Cannot subclass {self!r}") def __repr__(self): return 'typing.' + self._name @@ -346,31 +342,17 @@ def __subclasscheck__(self, cls): @_tp_cache def __getitem__(self, parameters): - if self._name in ('ClassVar', 'Final'): - item = _type_check(parameters, f'{self._name} accepts only single type.') - return _GenericAlias(self, (item,)) - if self._name == 'Union': - if parameters == (): - raise TypeError("Cannot take a Union of no types.") - if not isinstance(parameters, tuple): - parameters = (parameters,) - msg = "Union[arg, ...]: each arg must be a type." - parameters = tuple(_type_check(p, msg) for p in parameters) - parameters = _remove_dups_flatten(parameters) - if len(parameters) == 1: - return parameters[0] - return _GenericAlias(self, parameters) - if self._name == 'Optional': - arg = _type_check(parameters, "Optional[t] requires a single type.") - return Union[arg, type(None)] - if self._name == 'Literal': - # There is no '_type_check' call because arguments to Literal[...] are - # values, not types. - return _GenericAlias(self, parameters) - raise TypeError(f"{self} is not subscriptable") - - -Any = _SpecialForm('Any', doc= + return self._getitem(self, parameters) + + +class _LiteralSpecialForm(_SpecialForm, _root=True): + @_tp_cache(typed=True) + def __getitem__(self, parameters): + return self._getitem(self, parameters) + + +@_SpecialForm +def Any(self, parameters): """Special type indicating an unconstrained type. - Any is compatible with every type. @@ -380,9 +362,11 @@ def __getitem__(self, parameters): Note that all the above statements are true from the point of view of static type checkers. At runtime, Any should not be used with instance or class checks. - """) + """ + raise TypeError(f"{self} is not subscriptable") -NoReturn = _SpecialForm('NoReturn', doc= +@_SpecialForm +def NoReturn(self, parameters): """Special type indicating functions that never return. Example:: @@ -393,9 +377,11 @@ def stop() -> NoReturn: This type is invalid in other positions, e.g., ``List[NoReturn]`` will fail in static type checkers. - """) + """ + raise TypeError(f"{self} is not subscriptable") -ClassVar = _SpecialForm('ClassVar', doc= +@_SpecialForm +def ClassVar(self, parameters): """Special type construct to mark class variables. An annotation wrapped in ClassVar indicates that a given @@ -410,9 +396,12 @@ class Starship: Note that ClassVar is not a class itself, and should not be used with isinstance() or issubclass(). - """) + """ + item = _type_check(parameters, f'{self} accepts only single type.') + return _GenericAlias(self, (item,)) -Final = _SpecialForm('Final', doc= +@_SpecialForm +def Final(self, parameters): """Special typing construct to indicate final names to type checkers. A final name cannot be re-assigned or overridden in a subclass. @@ -428,9 +417,12 @@ class FastConnector(Connection): TIMEOUT = 1 # Error reported by type checker There is no runtime checking of these properties. - """) + """ + item = _type_check(parameters, f'{self} accepts only single type.') + return _GenericAlias(self, (item,)) -Union = _SpecialForm('Union', doc= +@_SpecialForm +def Union(self, parameters): """Union type; Union[X, Y] means either X or Y. To define a union, use e.g. Union[int, str]. Details: @@ -455,15 +447,29 @@ class FastConnector(Connection): - You cannot subclass or instantiate a union. - You can use Optional[X] as a shorthand for Union[X, None]. - """) - -Optional = _SpecialForm('Optional', doc= + """ + if parameters == (): + raise TypeError("Cannot take a Union of no types.") + if not isinstance(parameters, tuple): + parameters = (parameters,) + msg = "Union[arg, ...]: each arg must be a type." + parameters = tuple(_type_check(p, msg) for p in parameters) + parameters = _remove_dups_flatten(parameters) + if len(parameters) == 1: + return parameters[0] + return _UnionGenericAlias(self, parameters) + +@_SpecialForm +def Optional(self, parameters): """Optional type. Optional[X] is equivalent to Union[X, None]. - """) + """ + arg = _type_check(parameters, f"{self} requires a single type.") + return Union[arg, type(None)] -Literal = _SpecialForm('Literal', doc= +@_LiteralSpecialForm +def Literal(self, parameters): """Special typing form to define literal types (a.k.a. value types). This form can be used to indicate to type checkers that the corresponding @@ -480,10 +486,23 @@ def open_helper(file: str, mode: MODE) -> str: open_helper('/some/path', 'r') # Passes type check open_helper('/other/path', 'typo') # Error in type checker - Literal[...] cannot be subclassed. At runtime, an arbitrary value - is allowed as type argument to Literal[...], but type checkers may - impose restrictions. - """) + Literal[...] cannot be subclassed. At runtime, an arbitrary value + is allowed as type argument to Literal[...], but type checkers may + impose restrictions. + """ + # There is no '_type_check' call because arguments to Literal[...] are + # values, not types. + if not isinstance(parameters, tuple): + parameters = (parameters,) + + parameters = _flatten_literal_params(parameters) + + try: + parameters = tuple(p for p, _ in _deduplicate(list(_value_and_type_iter(parameters)))) + except TypeError: # unhashable parameters + pass + + return _LiteralGenericAlias(self, parameters) class ForwardRef(_Final, _root=True): @@ -506,7 +525,9 @@ def __init__(self, arg, is_argument=True): self.__forward_value__ = None self.__forward_is_argument__ = is_argument - def _evaluate(self, globalns, localns): + def _evaluate(self, globalns, localns, recursive_guard): + if self.__forward_arg__ in recursive_guard: + return self if not self.__forward_evaluated__ or localns is not globalns: if globalns is None and localns is None: globalns = localns = {} @@ -514,10 +535,14 @@ def _evaluate(self, globalns, localns): globalns = localns elif localns is None: localns = globalns - self.__forward_value__ = _type_check( + type_ =_type_check( eval(self.__forward_code__, globalns, localns), "Forward references must evaluate to types.", - is_argument=self.__forward_is_argument__) + is_argument=self.__forward_is_argument__, + ) + self.__forward_value__ = _eval_type( + type_, globalns, localns, recursive_guard | {self.__forward_arg__} + ) self.__forward_evaluated__ = True return self.__forward_value__ @@ -581,7 +606,7 @@ def longest(x: A, y: A) -> A: """ __slots__ = ('__name__', '__bound__', '__constraints__', - '__covariant__', '__contravariant__') + '__covariant__', '__contravariant__', '__dict__') def __init__(self, name, *constraints, bound=None, covariant=False, contravariant=False): @@ -620,34 +645,10 @@ def __reduce__(self): return self.__name__ -# Special typing constructs Union, Optional, Generic, Callable and Tuple -# use three special attributes for internal bookkeeping of generic types: -# * __parameters__ is a tuple of unique free type parameters of a generic -# type, for example, Dict[T, T].__parameters__ == (T,); -# * __origin__ keeps a reference to a type that was subscripted, -# e.g., Union[T, int].__origin__ == Union, or the non-generic version of -# the type. -# * __args__ is a tuple of all arguments used in subscripting, -# e.g., Dict[T, int].__args__ == (T, int). - - -# Mapping from non-generic type names that have a generic alias in typing -# but with a different name. -_normalize_alias = {'list': 'List', - 'tuple': 'Tuple', - 'dict': 'Dict', - 'set': 'Set', - 'frozenset': 'FrozenSet', - 'deque': 'Deque', - 'defaultdict': 'DefaultDict', - 'type': 'Type', - 'Set': 'AbstractSet'} - def _is_dunder(attr): return attr.startswith('__') and attr.endswith('__') - -class _GenericAlias(_Final, _root=True): +class _BaseGenericAlias(_Final, _root=True): """The central part of internal API. This represents a generic version of type 'origin' with type arguments 'params'. @@ -656,24 +657,88 @@ class _GenericAlias(_Final, _root=True): have 'name' always set. If 'inst' is False, then the alias can't be instantiated, this is used by e.g. typing.List and typing.Dict. """ - def __init__(self, origin, params, *, inst=True, special=False, name=None): + def __init__(self, origin, *, inst=True, name=None): self._inst = inst - self._special = special - if special and name is None: - orig_name = origin.__name__ - name = _normalize_alias.get(orig_name, orig_name) self._name = name + self.__origin__ = origin + self.__slots__ = None # This is not documented. + + def __call__(self, *args, **kwargs): + if not self._inst: + raise TypeError(f"Type {self._name} cannot be instantiated; " + f"use {self.__origin__.__name__}() instead") + result = self.__origin__(*args, **kwargs) + try: + result.__orig_class__ = self + except AttributeError: + pass + return result + + def __mro_entries__(self, bases): + res = [] + if self.__origin__ not in bases: + res.append(self.__origin__) + i = bases.index(self) + for b in bases[i+1:]: + if isinstance(b, _BaseGenericAlias) or issubclass(b, Generic): + break + else: + res.append(Generic) + return tuple(res) + + def __getattr__(self, attr): + # We are careful for copy and pickle. + # Also for simplicity we just don't relay all dunder names + if '__origin__' in self.__dict__ and not _is_dunder(attr): + return getattr(self.__origin__, attr) + raise AttributeError(attr) + + def __setattr__(self, attr, val): + if _is_dunder(attr) or attr in ('_name', '_inst', '_nparams'): + super().__setattr__(attr, val) + else: + setattr(self.__origin__, attr, val) + + def __instancecheck__(self, obj): + return self.__subclasscheck__(type(obj)) + + def __subclasscheck__(self, cls): + raise TypeError("Subscripted generics cannot be used with" + " class and instance checks") + + +# Special typing constructs Union, Optional, Generic, Callable and Tuple +# use three special attributes for internal bookkeeping of generic types: +# * __parameters__ is a tuple of unique free type parameters of a generic +# type, for example, Dict[T, T].__parameters__ == (T,); +# * __origin__ keeps a reference to a type that was subscripted, +# e.g., Union[T, int].__origin__ == Union, or the non-generic version of +# the type. +# * __args__ is a tuple of all arguments used in subscripting, +# e.g., Dict[T, int].__args__ == (T, int). + + +class _GenericAlias(_BaseGenericAlias, _root=True): + def __init__(self, origin, params, *, inst=True, name=None): + super().__init__(origin, inst=inst, name=name) if not isinstance(params, tuple): params = (params,) - self.__origin__ = origin self.__args__ = tuple(... if a is _TypingEllipsis else () if a is _TypingEmpty else a for a in params) self.__parameters__ = _collect_type_vars(params) - self.__slots__ = None # This is not documented. if not name: self.__module__ = origin.__module__ + def __eq__(self, other): + if not isinstance(other, _GenericAlias): + return NotImplemented + return (self.__origin__ == other.__origin__ + and self.__args__ == other.__args__) + + def __hash__(self): + return hash((self.__origin__, self.__args__)) + @_tp_cache def __getitem__(self, params): if self.__origin__ in (Generic, Protocol): @@ -683,163 +748,198 @@ def __getitem__(self, params): params = (params,) msg = "Parameters to generic types must be types." params = tuple(_type_check(p, msg) for p in params) - _check_generic(self, params) - return _subs_tvars(self, self.__parameters__, params) + _check_generic(self, params, len(self.__parameters__)) + + subst = dict(zip(self.__parameters__, params)) + new_args = [] + for arg in self.__args__: + if isinstance(arg, TypeVar): + arg = subst[arg] + elif isinstance(arg, (_GenericAlias, GenericAlias)): + subparams = arg.__parameters__ + if subparams: + subargs = tuple(subst[x] for x in subparams) + arg = arg[subargs] + new_args.append(arg) + return self.copy_with(tuple(new_args)) def copy_with(self, params): - # We don't copy self._special. - return _GenericAlias(self.__origin__, params, name=self._name, inst=self._inst) + return self.__class__(self.__origin__, params, name=self._name, inst=self._inst) def __repr__(self): - if (self._name != 'Callable' or - len(self.__args__) == 2 and self.__args__[0] is Ellipsis): - if self._name: - name = 'typing.' + self._name - else: - name = _type_repr(self.__origin__) - if not self._special: - args = f'[{", ".join([_type_repr(a) for a in self.__args__])}]' - else: - args = '' - return (f'{name}{args}') - if self._special: - return 'typing.Callable' - return (f'typing.Callable' - f'[[{", ".join([_type_repr(a) for a in self.__args__[:-1]])}], ' - f'{_type_repr(self.__args__[-1])}]') - - def __eq__(self, other): - if not isinstance(other, _GenericAlias): - return NotImplemented - if self.__origin__ != other.__origin__: - return False - if self.__origin__ is Union and other.__origin__ is Union: - return frozenset(self.__args__) == frozenset(other.__args__) - return self.__args__ == other.__args__ - - def __hash__(self): - if self.__origin__ is Union: - return hash((Union, frozenset(self.__args__))) - return hash((self.__origin__, self.__args__)) + if self._name: + name = 'typing.' + self._name + else: + name = _type_repr(self.__origin__) + args = ", ".join([_type_repr(a) for a in self.__args__]) + return f'{name}[{args}]' - def __call__(self, *args, **kwargs): - if not self._inst: - raise TypeError(f"Type {self._name} cannot be instantiated; " - f"use {self._name.lower()}() instead") - result = self.__origin__(*args, **kwargs) - try: - result.__orig_class__ = self - except AttributeError: - pass - return result + def __reduce__(self): + if self._name: + origin = globals()[self._name] + else: + origin = self.__origin__ + args = tuple(self.__args__) + if len(args) == 1 and not isinstance(args[0], tuple): + args, = args + return operator.getitem, (origin, args) def __mro_entries__(self, bases): if self._name: # generic version of an ABC or built-in class - res = [] - if self.__origin__ not in bases: - res.append(self.__origin__) - i = bases.index(self) - if not any(isinstance(b, _GenericAlias) or issubclass(b, Generic) - for b in bases[i+1:]): - res.append(Generic) - return tuple(res) + return super().__mro_entries__(bases) if self.__origin__ is Generic: if Protocol in bases: return () i = bases.index(self) for b in bases[i+1:]: - if isinstance(b, _GenericAlias) and b is not self: + if isinstance(b, _BaseGenericAlias) and b is not self: return () return (self.__origin__,) - def __getattr__(self, attr): - # We are careful for copy and pickle. - # Also for simplicity we just don't relay all dunder names - if '__origin__' in self.__dict__ and not _is_dunder(attr): - return getattr(self.__origin__, attr) - raise AttributeError(attr) - def __setattr__(self, attr, val): - if _is_dunder(attr) or attr in ('_name', '_inst', '_special'): - super().__setattr__(attr, val) +# _nparams is the number of accepted parameters, e.g. 0 for Hashable, +# 1 for List and 2 for Dict. It may be -1 if variable number of +# parameters are accepted (needs custom __getitem__). + +class _SpecialGenericAlias(_BaseGenericAlias, _root=True): + def __init__(self, origin, nparams, *, inst=True, name=None): + if name is None: + name = origin.__name__ + super().__init__(origin, inst=inst, name=name) + self._nparams = nparams + if origin.__module__ == 'builtins': + self.__doc__ = f'A generic version of {origin.__qualname__}.' else: - setattr(self.__origin__, attr, val) + self.__doc__ = f'A generic version of {origin.__module__}.{origin.__qualname__}.' - def __instancecheck__(self, obj): - return self.__subclasscheck__(type(obj)) + @_tp_cache + def __getitem__(self, params): + if not isinstance(params, tuple): + params = (params,) + msg = "Parameters to generic types must be types." + params = tuple(_type_check(p, msg) for p in params) + _check_generic(self, params, self._nparams) + return self.copy_with(params) + + def copy_with(self, params): + return _GenericAlias(self.__origin__, params, + name=self._name, inst=self._inst) + + def __repr__(self): + return 'typing.' + self._name def __subclasscheck__(self, cls): - if self._special: - if not isinstance(cls, _GenericAlias): - return issubclass(cls, self.__origin__) - if cls._special: - return issubclass(cls.__origin__, self.__origin__) - raise TypeError("Subscripted generics cannot be used with" - " class and instance checks") + if isinstance(cls, _SpecialGenericAlias): + return issubclass(cls.__origin__, self.__origin__) + if not isinstance(cls, _GenericAlias): + return issubclass(cls, self.__origin__) + return super().__subclasscheck__(cls) def __reduce__(self): - if self._special: - return self._name + return self._name - if self._name: - origin = globals()[self._name] - else: - origin = self.__origin__ - if (origin is Callable and - not (len(self.__args__) == 2 and self.__args__[0] is Ellipsis)): - args = list(self.__args__[:-1]), self.__args__[-1] - else: - args = tuple(self.__args__) - if len(args) == 1 and not isinstance(args[0], tuple): - args, = args - return operator.getitem, (origin, args) +class _CallableGenericAlias(_GenericAlias, _root=True): + def __repr__(self): + assert self._name == 'Callable' + if len(self.__args__) == 2 and self.__args__[0] is Ellipsis: + return super().__repr__() + return (f'typing.Callable' + f'[[{", ".join([_type_repr(a) for a in self.__args__[:-1]])}], ' + f'{_type_repr(self.__args__[-1])}]') + + def __reduce__(self): + args = self.__args__ + if not (len(args) == 2 and args[0] is ...): + args = list(args[:-1]), args[-1] + return operator.getitem, (Callable, args) + + +class _CallableType(_SpecialGenericAlias, _root=True): + def copy_with(self, params): + return _CallableGenericAlias(self.__origin__, params, + name=self._name, inst=self._inst) -class _VariadicGenericAlias(_GenericAlias, _root=True): - """Same as _GenericAlias above but for variadic aliases. Currently, - this is used only by special internal aliases: Tuple and Callable. - """ def __getitem__(self, params): - if self._name != 'Callable' or not self._special: - return self.__getitem_inner__(params) if not isinstance(params, tuple) or len(params) != 2: raise TypeError("Callable must be used as " "Callable[[arg, ...], result].") args, result = params - if args is Ellipsis: - params = (Ellipsis, result) - else: - if not isinstance(args, list): - raise TypeError(f"Callable[args, result]: args must be a list." - f" Got {args}") + # This relaxes what args can be on purpose to allow things like + # PEP 612 ParamSpec. Responsibility for whether a user is using + # Callable[...] properly is deferred to static type checkers. + if isinstance(args, list): params = (tuple(args), result) + else: + params = (args, result) return self.__getitem_inner__(params) @_tp_cache def __getitem_inner__(self, params): - if self.__origin__ is tuple and self._special: - if params == (): - return self.copy_with((_TypingEmpty,)) - if not isinstance(params, tuple): - params = (params,) - if len(params) == 2 and params[1] is ...: - msg = "Tuple[t, ...]: t must be a type." - p = _type_check(params[0], msg) - return self.copy_with((p, _TypingEllipsis)) - msg = "Tuple[t0, t1, ...]: each t must be a type." - params = tuple(_type_check(p, msg) for p in params) - return self.copy_with(params) - if self.__origin__ is collections.abc.Callable and self._special: - args, result = params - msg = "Callable[args, result]: result must be a type." - result = _type_check(result, msg) - if args is Ellipsis: - return self.copy_with((_TypingEllipsis, result)) - msg = "Callable[[arg, ...], result]: each arg must be a type." - args = tuple(_type_check(arg, msg) for arg in args) - params = args + (result,) - return self.copy_with(params) - return super().__getitem__(params) + args, result = params + msg = "Callable[args, result]: result must be a type." + result = _type_check(result, msg) + if args is Ellipsis: + return self.copy_with((_TypingEllipsis, result)) + if not isinstance(args, tuple): + args = (args,) + args = tuple(_type_convert(arg) for arg in args) + params = args + (result,) + return self.copy_with(params) + + +class _TupleType(_SpecialGenericAlias, _root=True): + @_tp_cache + def __getitem__(self, params): + if params == (): + return self.copy_with((_TypingEmpty,)) + if not isinstance(params, tuple): + params = (params,) + if len(params) == 2 and params[1] is ...: + msg = "Tuple[t, ...]: t must be a type." + p = _type_check(params[0], msg) + return self.copy_with((p, _TypingEllipsis)) + msg = "Tuple[t0, t1, ...]: each t must be a type." + params = tuple(_type_check(p, msg) for p in params) + return self.copy_with(params) + + +class _UnionGenericAlias(_GenericAlias, _root=True): + def copy_with(self, params): + return Union[params] + + def __eq__(self, other): + if not isinstance(other, _UnionGenericAlias): + return NotImplemented + return set(self.__args__) == set(other.__args__) + + def __hash__(self): + return hash(frozenset(self.__args__)) + + def __repr__(self): + args = self.__args__ + if len(args) == 2: + if args[0] is type(None): + return f'typing.Optional[{_type_repr(args[1])}]' + elif args[1] is type(None): + return f'typing.Optional[{_type_repr(args[0])}]' + return super().__repr__() + + +def _value_and_type_iter(parameters): + return ((p, type(p)) for p in parameters) + + +class _LiteralGenericAlias(_GenericAlias, _root=True): + + def __eq__(self, other): + if not isinstance(other, _LiteralGenericAlias): + return NotImplemented + + return set(_value_and_type_iter(self.__args__)) == set(_value_and_type_iter(other.__args__)) + + def __hash__(self): + return hash(frozenset(_value_and_type_iter(self.__args__))) class Generic: @@ -865,16 +965,6 @@ def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT: __slots__ = () _is_protocol = False - def __new__(cls, *args, **kwds): - if cls in (Generic, Protocol): - raise TypeError(f"Type {cls.__name__} cannot be instantiated; " - "it can be used only as a base class") - if super().__new__ is object.__new__ and cls.__init__ is not object.__init__: - obj = super().__new__(cls) - else: - obj = super().__new__(cls, *args, **kwds) - return obj - @_tp_cache def __class_getitem__(cls, params): if not isinstance(params, tuple): @@ -894,7 +984,7 @@ def __class_getitem__(cls, params): f"Parameters to {cls.__name__}[...] must all be unique") else: # Subscripting a regular Generic subclass. - _check_generic(cls, params) + _check_generic(cls, params, len(cls.__parameters__)) return _GenericAlias(cls, params) def __init_subclass__(cls, *args, **kwargs): @@ -949,7 +1039,7 @@ class _TypingEllipsis: _SPECIAL_NAMES = ['__abstractmethods__', '__annotations__', '__dict__', '__doc__', '__init__', '__module__', '__new__', '__slots__', - '__subclasshook__', '__weakref__'] + '__subclasshook__', '__weakref__', '__class_getitem__'] # These special attributes will be not collected as protocol members. EXCLUDED_ATTRIBUTES = _TYPING_INTERNALS + _SPECIAL_NAMES + ['_MutableMapping__marker'] @@ -983,7 +1073,7 @@ def _no_init(self, *args, **kwargs): def _allow_reckless_class_cheks(): - """Allow instnance and class checks for special stdlib modules. + """Allow instance and class checks for special stdlib modules. The abc and functools modules indiscriminately call isinstance() and issubclass() on the whole MRO of a user class, which may contain protocols. @@ -1121,6 +1211,100 @@ def _proto_hook(other): cls.__init__ = _no_init +class _AnnotatedAlias(_GenericAlias, _root=True): + """Runtime representation of an annotated type. + + At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't' + with extra annotations. The alias behaves like a normal typing alias, + instantiating is the same as instantiating the underlying type, binding + it to types is also the same. + """ + def __init__(self, origin, metadata): + if isinstance(origin, _AnnotatedAlias): + metadata = origin.__metadata__ + metadata + origin = origin.__origin__ + super().__init__(origin, origin) + self.__metadata__ = metadata + + def copy_with(self, params): + assert len(params) == 1 + new_type = params[0] + return _AnnotatedAlias(new_type, self.__metadata__) + + def __repr__(self): + return "typing.Annotated[{}, {}]".format( + _type_repr(self.__origin__), + ", ".join(repr(a) for a in self.__metadata__) + ) + + def __reduce__(self): + return operator.getitem, ( + Annotated, (self.__origin__,) + self.__metadata__ + ) + + def __eq__(self, other): + if not isinstance(other, _AnnotatedAlias): + return NotImplemented + return (self.__origin__ == other.__origin__ + and self.__metadata__ == other.__metadata__) + + def __hash__(self): + return hash((self.__origin__, self.__metadata__)) + + +class Annotated: + """Add context specific metadata to a type. + + Example: Annotated[int, runtime_check.Unsigned] indicates to the + hypothetical runtime_check module that this type is an unsigned int. + Every other consumer of this type can ignore this metadata and treat + this type as int. + + The first argument to Annotated must be a valid type. + + Details: + + - It's an error to call `Annotated` with less than two arguments. + - Nested Annotated are flattened:: + + Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3] + + - Instantiating an annotated type is equivalent to instantiating the + underlying type:: + + Annotated[C, Ann1](5) == C(5) + + - Annotated can be used as a generic type alias:: + + Optimized = Annotated[T, runtime.Optimize()] + Optimized[int] == Annotated[int, runtime.Optimize()] + + OptimizedList = Annotated[List[T], runtime.Optimize()] + OptimizedList[int] == Annotated[List[int], runtime.Optimize()] + """ + + __slots__ = () + + def __new__(cls, *args, **kwargs): + raise TypeError("Type Annotated cannot be instantiated.") + + @_tp_cache + def __class_getitem__(cls, params): + if not isinstance(params, tuple) or len(params) < 2: + raise TypeError("Annotated[...] should be used " + "with at least two arguments (a type and an " + "annotation).") + msg = "Annotated[t, ...]: t must be a type." + origin = _type_check(params[0], msg) + metadata = tuple(params[1:]) + return _AnnotatedAlias(origin, metadata) + + def __init_subclass__(cls, *args, **kwargs): + raise TypeError( + "Cannot subclass {}.Annotated".format(cls.__module__) + ) + + def runtime_checkable(cls): """Mark a protocol class as a runtime protocol. @@ -1182,12 +1366,13 @@ def _get_defaults(func): WrapperDescriptorType, MethodWrapperType, MethodDescriptorType) -def get_type_hints(obj, globalns=None, localns=None): +def get_type_hints(obj, globalns=None, localns=None, include_extras=False): """Return type hints for an object. This is often the same as obj.__annotations__, but it handles - forward references encoded as string literals, and if necessary - adds Optional[t] if a default value equal to None is set. + forward references encoded as string literals, adds Optional[t] if a + default value equal to None is set and recursively replaces all + 'Annotated[T, ...]' with 'T' (unless 'include_extras=True'). The argument may be a module, class, method, or function. The annotations are returned as a dictionary. For classes, annotations include also @@ -1231,7 +1416,7 @@ def get_type_hints(obj, globalns=None, localns=None): value = ForwardRef(value, is_argument=False) value = _eval_type(value, base_globals, localns) hints[name] = value - return hints + return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()} if globalns is None: if isinstance(obj, types.ModuleType): @@ -1265,14 +1450,32 @@ def get_type_hints(obj, globalns=None, localns=None): if name in defaults and defaults[name] is None: value = Optional[value] hints[name] = value - return hints + return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()} + + +def _strip_annotations(t): + """Strips the annotations from a given type. + """ + if isinstance(t, _AnnotatedAlias): + return _strip_annotations(t.__origin__) + if isinstance(t, _GenericAlias): + stripped_args = tuple(_strip_annotations(a) for a in t.__args__) + if stripped_args == t.__args__: + return t + return t.copy_with(stripped_args) + if isinstance(t, GenericAlias): + stripped_args = tuple(_strip_annotations(a) for a in t.__args__) + if stripped_args == t.__args__: + return t + return GenericAlias(t.__origin__, stripped_args) + return t def get_origin(tp): """Get the unsubscripted version of a type. - This supports generic types, Callable, Tuple, Union, Literal, Final and ClassVar. - Return None for unsupported types. Examples:: + This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar + and Annotated. Return None for unsupported types. Examples:: get_origin(Literal[42]) is Literal get_origin(int) is None @@ -1282,7 +1485,9 @@ def get_origin(tp): get_origin(Union[T, int]) is Union get_origin(List[Tuple[T, T]][int]) == list """ - if isinstance(tp, _GenericAlias): + if isinstance(tp, _AnnotatedAlias): + return Annotated + if isinstance(tp, (_BaseGenericAlias, GenericAlias)): return tp.__origin__ if tp is Generic: return Generic @@ -1300,9 +1505,11 @@ def get_args(tp): get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int]) get_args(Callable[[], T][int]) == ([], int) """ - if isinstance(tp, _GenericAlias) and not tp._special: + if isinstance(tp, _AnnotatedAlias): + return (tp.__origin__,) + tp.__metadata__ + if isinstance(tp, (_GenericAlias, GenericAlias)): res = tp.__args__ - if get_origin(tp) is collections.abc.Callable and res[0] is not Ellipsis: + if tp.__origin__ is collections.abc.Callable and res[0] is not Ellipsis: res = (list(res[:-1]), res[-1]) return res return () @@ -1432,21 +1639,20 @@ class Other(Leaf): # Error reported by type checker # Various ABCs mimicking those in collections.abc. -def _alias(origin, params, inst=True): - return _GenericAlias(origin, params, special=True, inst=inst) - -Hashable = _alias(collections.abc.Hashable, ()) # Not generic. -Awaitable = _alias(collections.abc.Awaitable, T_co) -Coroutine = _alias(collections.abc.Coroutine, (T_co, T_contra, V_co)) -AsyncIterable = _alias(collections.abc.AsyncIterable, T_co) -AsyncIterator = _alias(collections.abc.AsyncIterator, T_co) -Iterable = _alias(collections.abc.Iterable, T_co) -Iterator = _alias(collections.abc.Iterator, T_co) -Reversible = _alias(collections.abc.Reversible, T_co) -Sized = _alias(collections.abc.Sized, ()) # Not generic. -Container = _alias(collections.abc.Container, T_co) -Collection = _alias(collections.abc.Collection, T_co) -Callable = _VariadicGenericAlias(collections.abc.Callable, (), special=True) +_alias = _SpecialGenericAlias + +Hashable = _alias(collections.abc.Hashable, 0) # Not generic. +Awaitable = _alias(collections.abc.Awaitable, 1) +Coroutine = _alias(collections.abc.Coroutine, 3) +AsyncIterable = _alias(collections.abc.AsyncIterable, 1) +AsyncIterator = _alias(collections.abc.AsyncIterator, 1) +Iterable = _alias(collections.abc.Iterable, 1) +Iterator = _alias(collections.abc.Iterator, 1) +Reversible = _alias(collections.abc.Reversible, 1) +Sized = _alias(collections.abc.Sized, 0) # Not generic. +Container = _alias(collections.abc.Container, 1) +Collection = _alias(collections.abc.Collection, 1) +Callable = _CallableType(collections.abc.Callable, 2) Callable.__doc__ = \ """Callable type; Callable[[int], str] is a function of (int) -> str. @@ -1457,15 +1663,16 @@ def _alias(origin, params, inst=True): There is no syntax to indicate optional or keyword arguments, such function types are rarely used as callback types. """ -AbstractSet = _alias(collections.abc.Set, T_co) -MutableSet = _alias(collections.abc.MutableSet, T) +AbstractSet = _alias(collections.abc.Set, 1, name='AbstractSet') +MutableSet = _alias(collections.abc.MutableSet, 1) # NOTE: Mapping is only covariant in the value type. -Mapping = _alias(collections.abc.Mapping, (KT, VT_co)) -MutableMapping = _alias(collections.abc.MutableMapping, (KT, VT)) -Sequence = _alias(collections.abc.Sequence, T_co) -MutableSequence = _alias(collections.abc.MutableSequence, T) -ByteString = _alias(collections.abc.ByteString, ()) # Not generic -Tuple = _VariadicGenericAlias(tuple, (), inst=False, special=True) +Mapping = _alias(collections.abc.Mapping, 2) +MutableMapping = _alias(collections.abc.MutableMapping, 2) +Sequence = _alias(collections.abc.Sequence, 1) +MutableSequence = _alias(collections.abc.MutableSequence, 1) +ByteString = _alias(collections.abc.ByteString, 0) # Not generic +# Tuple accepts variable number of parameters. +Tuple = _TupleType(tuple, -1, inst=False, name='Tuple') Tuple.__doc__ = \ """Tuple type; Tuple[X, Y] is the cross-product type of X and Y. @@ -1475,24 +1682,24 @@ def _alias(origin, params, inst=True): To specify a variable-length tuple of homogeneous type, use Tuple[T, ...]. """ -List = _alias(list, T, inst=False) -Deque = _alias(collections.deque, T) -Set = _alias(set, T, inst=False) -FrozenSet = _alias(frozenset, T_co, inst=False) -MappingView = _alias(collections.abc.MappingView, T_co) -KeysView = _alias(collections.abc.KeysView, KT) -ItemsView = _alias(collections.abc.ItemsView, (KT, VT_co)) -ValuesView = _alias(collections.abc.ValuesView, VT_co) -ContextManager = _alias(contextlib.AbstractContextManager, T_co) -AsyncContextManager = _alias(contextlib.AbstractAsyncContextManager, T_co) -Dict = _alias(dict, (KT, VT), inst=False) -DefaultDict = _alias(collections.defaultdict, (KT, VT)) -OrderedDict = _alias(collections.OrderedDict, (KT, VT)) -Counter = _alias(collections.Counter, T) -ChainMap = _alias(collections.ChainMap, (KT, VT)) -Generator = _alias(collections.abc.Generator, (T_co, T_contra, V_co)) -AsyncGenerator = _alias(collections.abc.AsyncGenerator, (T_co, T_contra)) -Type = _alias(type, CT_co, inst=False) +List = _alias(list, 1, inst=False, name='List') +Deque = _alias(collections.deque, 1, name='Deque') +Set = _alias(set, 1, inst=False, name='Set') +FrozenSet = _alias(frozenset, 1, inst=False, name='FrozenSet') +MappingView = _alias(collections.abc.MappingView, 1) +KeysView = _alias(collections.abc.KeysView, 1) +ItemsView = _alias(collections.abc.ItemsView, 2) +ValuesView = _alias(collections.abc.ValuesView, 1) +ContextManager = _alias(contextlib.AbstractContextManager, 1, name='ContextManager') +AsyncContextManager = _alias(contextlib.AbstractAsyncContextManager, 1, name='AsyncContextManager') +Dict = _alias(dict, 2, inst=False, name='Dict') +DefaultDict = _alias(collections.defaultdict, 2, name='DefaultDict') +OrderedDict = _alias(collections.OrderedDict, 2) +Counter = _alias(collections.Counter, 1) +ChainMap = _alias(collections.ChainMap, 2) +Generator = _alias(collections.abc.Generator, 3) +AsyncGenerator = _alias(collections.abc.AsyncGenerator, 2) +Type = _alias(type, 1, inst=False, name='Type') Type.__doc__ = \ """A special construct usable to annotate class objects. @@ -1588,50 +1795,41 @@ def __round__(self, ndigits: int = 0) -> T_co: pass -def _make_nmtuple(name, types): - msg = "NamedTuple('Name', [(f0, t0), (f1, t1), ...]); each t must be a type" - types = [(n, _type_check(t, msg)) for n, t in types] - nm_tpl = collections.namedtuple(name, [n for n, t in types]) - # Prior to PEP 526, only _field_types attribute was assigned. - # Now __annotations__ are used and _field_types is deprecated (remove in 3.9) - nm_tpl.__annotations__ = nm_tpl._field_types = dict(types) - try: - nm_tpl.__module__ = sys._getframe(2).f_globals.get('__name__', '__main__') - except (AttributeError, ValueError): - pass +def _make_nmtuple(name, types, module, defaults = ()): + fields = [n for n, t in types] + types = {n: _type_check(t, f"field {n} annotation must be a type") + for n, t in types} + nm_tpl = collections.namedtuple(name, fields, + defaults=defaults, module=module) + nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = types return nm_tpl # attributes prohibited to set in NamedTuple class syntax -_prohibited = ('__new__', '__init__', '__slots__', '__getnewargs__', - '_fields', '_field_defaults', '_field_types', - '_make', '_replace', '_asdict', '_source') +_prohibited = frozenset({'__new__', '__init__', '__slots__', '__getnewargs__', + '_fields', '_field_defaults', + '_make', '_replace', '_asdict', '_source'}) -_special = ('__module__', '__name__', '__annotations__') +_special = frozenset({'__module__', '__name__', '__annotations__'}) class NamedTupleMeta(type): def __new__(cls, typename, bases, ns): - if ns.get('_root', False): - return super().__new__(cls, typename, bases, ns) + assert bases[0] is _NamedTuple types = ns.get('__annotations__', {}) - nm_tpl = _make_nmtuple(typename, types.items()) - defaults = [] - defaults_dict = {} + default_names = [] for field_name in types: if field_name in ns: - default_value = ns[field_name] - defaults.append(default_value) - defaults_dict[field_name] = default_value - elif defaults: - raise TypeError("Non-default namedtuple field {field_name} cannot " - "follow default field(s) {default_names}" - .format(field_name=field_name, - default_names=', '.join(defaults_dict.keys()))) - nm_tpl.__new__.__annotations__ = dict(types) - nm_tpl.__new__.__defaults__ = tuple(defaults) - nm_tpl._field_defaults = defaults_dict + default_names.append(field_name) + elif default_names: + raise TypeError(f"Non-default namedtuple field {field_name} " + f"cannot follow default field" + f"{'s' if len(default_names) > 1 else ''} " + f"{', '.join(default_names)}") + nm_tpl = _make_nmtuple(typename, types.items(), + defaults=[ns[n] for n in default_names], + module=ns['__module__']) # update from user namespace without overriding special namedtuple attributes for key in ns: if key in _prohibited: @@ -1641,7 +1839,7 @@ def __new__(cls, typename, bases, ns): return nm_tpl -class NamedTuple(metaclass=NamedTupleMeta): +def NamedTuple(typename, fields=None, /, **kwargs): """Typed version of namedtuple. Usage in Python versions >= 3.6:: @@ -1665,99 +1863,81 @@ class Employee(NamedTuple): Employee = NamedTuple('Employee', [('name', str), ('id', int)]) """ - _root = True - - def __new__(*args, **kwargs): - if not args: - raise TypeError('NamedTuple.__new__(): not enough arguments') - cls, *args = args # allow the "cls" keyword be passed - if args: - typename, *args = args # allow the "typename" keyword be passed - elif 'typename' in kwargs: - typename = kwargs.pop('typename') - import warnings - warnings.warn("Passing 'typename' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError("NamedTuple.__new__() missing 1 required positional " - "argument: 'typename'") - if args: - try: - fields, = args # allow the "fields" keyword be passed - except ValueError: - raise TypeError(f'NamedTuple.__new__() takes from 2 to 3 ' - f'positional arguments but {len(args) + 2} ' - f'were given') from None - elif 'fields' in kwargs and len(kwargs) == 1: - fields = kwargs.pop('fields') - import warnings - warnings.warn("Passing 'fields' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - fields = None - - if fields is None: - fields = kwargs.items() - elif kwargs: - raise TypeError("Either list of fields or keywords" - " can be provided to NamedTuple, not both") - return _make_nmtuple(typename, fields) - __new__.__text_signature__ = '($cls, typename, fields=None, /, **kwargs)' - - -def _dict_new(cls, /, *args, **kwargs): - return dict(*args, **kwargs) - - -def _typeddict_new(cls, typename, fields=None, /, *, total=True, **kwargs): if fields is None: - fields = kwargs + fields = kwargs.items() elif kwargs: - raise TypeError("TypedDict takes either a dict or keyword arguments," - " but not both") - - ns = {'__annotations__': dict(fields), '__total__': total} + raise TypeError("Either list of fields or keywords" + " can be provided to NamedTuple, not both") try: - # Setting correct module is necessary to make typed dict classes pickleable. - ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__') + module = sys._getframe(1).f_globals.get('__name__', '__main__') except (AttributeError, ValueError): - pass + module = None + return _make_nmtuple(typename, fields, module=module) - return _TypedDictMeta(typename, (), ns) +_NamedTuple = type.__new__(NamedTupleMeta, 'NamedTuple', (), {}) +def _namedtuple_mro_entries(bases): + if len(bases) > 1: + raise TypeError("Multiple inheritance with NamedTuple is not supported") + assert bases[0] is NamedTuple + return (_NamedTuple,) -def _check_fails(cls, other): - # Typed dicts are only for static structural subtyping. - raise TypeError('TypedDict does not support instance and class checks') +NamedTuple.__mro_entries__ = _namedtuple_mro_entries class _TypedDictMeta(type): def __new__(cls, name, bases, ns, total=True): """Create new typed dict class object. - This method is called directly when TypedDict is subclassed, - or via _typeddict_new when TypedDict is instantiated. This way + This method is called when TypedDict is subclassed, + or when TypedDict is instantiated. This way TypedDict supports all three syntax forms described in its docstring. - Subclasses and instances of TypedDict return actual dictionaries - via _dict_new. + Subclasses and instances of TypedDict return actual dictionaries. """ - ns['__new__'] = _typeddict_new if name == 'TypedDict' else _dict_new - tp_dict = super(_TypedDictMeta, cls).__new__(cls, name, (dict,), ns) - - anns = ns.get('__annotations__', {}) + for base in bases: + if type(base) is not _TypedDictMeta: + raise TypeError('cannot inherit from both a TypedDict type ' + 'and a non-TypedDict base class') + tp_dict = type.__new__(_TypedDictMeta, name, (dict,), ns) + + annotations = {} + own_annotations = ns.get('__annotations__', {}) + own_annotation_keys = set(own_annotations.keys()) msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type" - anns = {n: _type_check(tp, msg) for n, tp in anns.items()} + own_annotations = { + n: _type_check(tp, msg) for n, tp in own_annotations.items() + } + required_keys = set() + optional_keys = set() + for base in bases: - anns.update(base.__dict__.get('__annotations__', {})) - tp_dict.__annotations__ = anns + annotations.update(base.__dict__.get('__annotations__', {})) + required_keys.update(base.__dict__.get('__required_keys__', ())) + optional_keys.update(base.__dict__.get('__optional_keys__', ())) + + annotations.update(own_annotations) + if total: + required_keys.update(own_annotation_keys) + else: + optional_keys.update(own_annotation_keys) + + tp_dict.__annotations__ = annotations + tp_dict.__required_keys__ = frozenset(required_keys) + tp_dict.__optional_keys__ = frozenset(optional_keys) if not hasattr(tp_dict, '__total__'): tp_dict.__total__ = total return tp_dict - __instancecheck__ = __subclasscheck__ = _check_fails + __call__ = dict # static method + def __subclasscheck__(cls, other): + # Typed dicts are only for static structural subtyping. + raise TypeError('TypedDict does not support instance and class checks') -class TypedDict(dict, metaclass=_TypedDictMeta): + __instancecheck__ = __subclasscheck__ + + +def TypedDict(typename, fields=None, /, *, total=True, **kwargs): """A simple typed namespace. At runtime it is equivalent to a plain dict. TypedDict creates a dictionary type that expects all of its @@ -1776,8 +1956,9 @@ class Point2D(TypedDict): assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') - The type info can be accessed via Point2D.__annotations__. TypedDict - supports two additional equivalent forms:: + The type info can be accessed via the Point2D.__annotations__ dict, and + the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets. + TypedDict supports two additional equivalent forms:: Point2D = TypedDict('Point2D', x=int, y=int, label=str) Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) @@ -1798,6 +1979,23 @@ class body be required. The class syntax is only supported in Python 3.6+, while two other syntax forms work for Python 2.7 and 3.2+ """ + if fields is None: + fields = kwargs + elif kwargs: + raise TypeError("TypedDict takes either a dict or keyword arguments," + " but not both") + + ns = {'__annotations__': dict(fields)} + try: + # Setting correct module is necessary to make typed dict classes pickleable. + ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__') + except (AttributeError, ValueError): + pass + + return _TypedDictMeta(typename, (), ns, total=total) + +_TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {}) +TypedDict.__mro_entries__ = lambda bases: (_TypedDict,) def NewType(name, tp): @@ -1995,8 +2193,8 @@ class io: io.__name__ = __name__ + '.io' sys.modules[io.__name__] = io -Pattern = _alias(stdlib_re.Pattern, AnyStr) -Match = _alias(stdlib_re.Match, AnyStr) +Pattern = _alias(stdlib_re.Pattern, 1) +Match = _alias(stdlib_re.Match, 1) class re: """Wrapper namespace for re type aliases.""" diff --git a/Lib/unittest/__init__.py b/Lib/unittest/__init__.py index ace3a6fb1dd97199afcd831f3c11f0f08d20f30f..348dc471f4c3d44af8cd984fc5d08b1d2072f30b 100644 --- a/Lib/unittest/__init__.py +++ b/Lib/unittest/__init__.py @@ -57,7 +57,6 @@ def testMultiply(self): __unittest = True from .result import TestResult -from .async_case import IsolatedAsyncioTestCase from .case import (addModuleCleanup, TestCase, FunctionTestCase, SkipTest, skip, skipIf, skipUnless, expectedFailure) from .suite import BaseTestSuite, TestSuite @@ -66,6 +65,7 @@ def testMultiply(self): from .main import TestProgram, main from .runner import TextTestRunner, TextTestResult from .signals import installHandler, registerResult, removeResult, removeHandler +# IsolatedAsyncioTestCase will be imported lazily. # deprecated _TextTestResult = TextTestResult @@ -78,3 +78,18 @@ def load_tests(loader, tests, pattern): # top level directory cached on loader instance this_dir = os.path.dirname(__file__) return loader.discover(start_dir=this_dir, pattern=pattern) + + +# Lazy import of IsolatedAsyncioTestCase from .async_case +# It imports asyncio, which is relatively heavy, but most tests +# do not need it. + +def __dir__(): + return globals().keys() | {'IsolatedAsyncioTestCase'} + +def __getattr__(name): + if name == 'IsolatedAsyncioTestCase': + global IsolatedAsyncioTestCase + from .async_case import IsolatedAsyncioTestCase + return IsolatedAsyncioTestCase + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/Lib/unittest/_log.py b/Lib/unittest/_log.py new file mode 100644 index 0000000000000000000000000000000000000000..94e7e758bd9a077d036afcc2abc6b6ab40c3689c --- /dev/null +++ b/Lib/unittest/_log.py @@ -0,0 +1,69 @@ +import logging +import collections + +from .case import _BaseTestCaseContext + + +_LoggingWatcher = collections.namedtuple("_LoggingWatcher", + ["records", "output"]) + +class _CapturingHandler(logging.Handler): + """ + A logging handler capturing all (raw and formatted) logging output. + """ + + def __init__(self): + logging.Handler.__init__(self) + self.watcher = _LoggingWatcher([], []) + + def flush(self): + pass + + def emit(self, record): + self.watcher.records.append(record) + msg = self.format(record) + self.watcher.output.append(msg) + + +class _AssertLogsContext(_BaseTestCaseContext): + """A context manager used to implement TestCase.assertLogs().""" + + LOGGING_FORMAT = "%(levelname)s:%(name)s:%(message)s" + + def __init__(self, test_case, logger_name, level): + _BaseTestCaseContext.__init__(self, test_case) + self.logger_name = logger_name + if level: + self.level = logging._nameToLevel.get(level, level) + else: + self.level = logging.INFO + self.msg = None + + def __enter__(self): + if isinstance(self.logger_name, logging.Logger): + logger = self.logger = self.logger_name + else: + logger = self.logger = logging.getLogger(self.logger_name) + formatter = logging.Formatter(self.LOGGING_FORMAT) + handler = _CapturingHandler() + handler.setFormatter(formatter) + self.watcher = handler.watcher + self.old_handlers = logger.handlers[:] + self.old_level = logger.level + self.old_propagate = logger.propagate + logger.handlers = [handler] + logger.setLevel(self.level) + logger.propagate = False + return handler.watcher + + def __exit__(self, exc_type, exc_value, tb): + self.logger.handlers = self.old_handlers + self.logger.propagate = self.old_propagate + self.logger.setLevel(self.old_level) + if exc_type is not None: + # let unexpected exceptions pass through + return False + if len(self.watcher.records) == 0: + self._raiseFailure( + "no logs of level {} or higher triggered on {}" + .format(logging.getLevelName(self.level), self.logger.name)) diff --git a/Lib/unittest/async_case.py b/Lib/unittest/async_case.py index 1bc1312c8c2ee9cba2491d66a44b157a37c3ab9e..520213c37275555f29d37bf361202fb72d1af4ec 100644 --- a/Lib/unittest/async_case.py +++ b/Lib/unittest/async_case.py @@ -102,9 +102,9 @@ async def _asyncioLoopRunner(self, fut): ret = await awaitable if not fut.cancelled(): fut.set_result(ret) - except asyncio.CancelledError: + except (SystemExit, KeyboardInterrupt): raise - except Exception as ex: + except (BaseException, asyncio.CancelledError) as ex: if not fut.cancelled(): fut.set_exception(ex) diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index 3223c0bff6fa2195d201a33f2c954ea59728a952..f8bc865ee82039f70258ab2fd9e809649ca7896a 100644 --- a/Lib/unittest/case.py +++ b/Lib/unittest/case.py @@ -3,7 +3,6 @@ import sys import functools import difflib -import logging import pprint import re import warnings @@ -241,6 +240,8 @@ def __exit__(self, exc_type, exc_value, tb): expected_regex.pattern, str(exc_value))) return True + __class_getitem__ = classmethod(types.GenericAlias) + class _AssertWarnsContext(_AssertRaisesBaseContext): """A context manager used to implement TestCase.assertWarns* methods.""" @@ -251,7 +252,7 @@ class _AssertWarnsContext(_AssertRaisesBaseContext): def __enter__(self): # The __warningregistry__'s need to be in a pristine state for tests # to work properly. - for v in list(sys.modules.values()): + for v in sys.modules.values(): if getattr(v, '__warningregistry__', None): v.__warningregistry__ = {} self.warnings_manager = warnings.catch_warnings(record=True) @@ -295,73 +296,6 @@ def __exit__(self, exc_type, exc_value, tb): -_LoggingWatcher = collections.namedtuple("_LoggingWatcher", - ["records", "output"]) - - -class _CapturingHandler(logging.Handler): - """ - A logging handler capturing all (raw and formatted) logging output. - """ - - def __init__(self): - logging.Handler.__init__(self) - self.watcher = _LoggingWatcher([], []) - - def flush(self): - pass - - def emit(self, record): - self.watcher.records.append(record) - msg = self.format(record) - self.watcher.output.append(msg) - - - -class _AssertLogsContext(_BaseTestCaseContext): - """A context manager used to implement TestCase.assertLogs().""" - - LOGGING_FORMAT = "%(levelname)s:%(name)s:%(message)s" - - def __init__(self, test_case, logger_name, level): - _BaseTestCaseContext.__init__(self, test_case) - self.logger_name = logger_name - if level: - self.level = logging._nameToLevel.get(level, level) - else: - self.level = logging.INFO - self.msg = None - - def __enter__(self): - if isinstance(self.logger_name, logging.Logger): - logger = self.logger = self.logger_name - else: - logger = self.logger = logging.getLogger(self.logger_name) - formatter = logging.Formatter(self.LOGGING_FORMAT) - handler = _CapturingHandler() - handler.setFormatter(formatter) - self.watcher = handler.watcher - self.old_handlers = logger.handlers[:] - self.old_level = logger.level - self.old_propagate = logger.propagate - logger.handlers = [handler] - logger.setLevel(self.level) - logger.propagate = False - return handler.watcher - - def __exit__(self, exc_type, exc_value, tb): - self.logger.handlers = self.old_handlers - self.logger.propagate = self.old_propagate - self.logger.setLevel(self.old_level) - if exc_type is not None: - # let unexpected exceptions pass through - return False - if len(self.watcher.records) == 0: - self._raiseFailure( - "no logs of level {} or higher triggered on {}" - .format(logging.getLevelName(self.level), self.logger.name)) - - class _OrderedChainMap(collections.ChainMap): def __iter__(self): seen = set() @@ -468,30 +402,13 @@ def addTypeEqualityFunc(self, typeobj, function): """ self._type_equality_funcs[typeobj] = function - def addCleanup(*args, **kwargs): + def addCleanup(self, function, /, *args, **kwargs): """Add a function, with arguments, to be called when the test is completed. Functions added are called on a LIFO basis and are called after tearDown on test failure or success. Cleanup items are called even if setUp fails (unlike tearDown).""" - if len(args) >= 2: - self, function, *args = args - elif not args: - raise TypeError("descriptor 'addCleanup' of 'TestCase' object " - "needs an argument") - elif 'function' in kwargs: - function = kwargs.pop('function') - self, *args = args - import warnings - warnings.warn("Passing 'function' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - raise TypeError('addCleanup expected at least 1 positional ' - 'argument, got %d' % (len(args)-1)) - args = tuple(args) - self._cleanups.append((function, args, kwargs)) - addCleanup.__text_signature__ = '($self, function, /, *args, **kwargs)' @classmethod def addClassCleanup(cls, function, /, *args, **kwargs): @@ -729,7 +646,7 @@ def doClassCleanups(cls): function, args, kwargs = cls._class_cleanups.pop() try: function(*args, **kwargs) - except Exception as exc: + except Exception: cls.tearDown_exceptions.append(sys.exc_info()) def __call__(self, *args, **kwds): @@ -869,6 +786,8 @@ def assertLogs(self, logger=None, level=None): self.assertEqual(cm.output, ['INFO:foo:first message', 'ERROR:foo.bar:second message']) """ + # Lazy import to avoid importing logging if it is not needed. + from ._log import _AssertLogsContext return _AssertLogsContext(self, logger, level) def _getAssertEqualityFunc(self, first, second): diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 3629cf61098f63b7d8a22793325dd30c70d0c969..f03c88baca671baefd01b56c25c62ba1c8dbf83b 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -23,8 +23,6 @@ ) -__version__ = '1.0' - import asyncio import contextlib import io @@ -32,6 +30,7 @@ import pprint import sys import builtins +from asyncio import iscoroutinefunction from types import CodeType, ModuleType, MethodType from unittest.util import safe_repr from functools import wraps, partial @@ -50,12 +49,12 @@ def _is_async_obj(obj): return False if hasattr(obj, '__func__'): obj = getattr(obj, '__func__') - return asyncio.iscoroutinefunction(obj) or inspect.isawaitable(obj) + return iscoroutinefunction(obj) or inspect.isawaitable(obj) def _is_async_func(func): if getattr(func, '__code__', None): - return asyncio.iscoroutinefunction(func) + return iscoroutinefunction(func) else: return False @@ -403,18 +402,12 @@ def __new__(cls, /, *args, **kw): # so we can create magic methods on the # class without stomping on other mocks bases = (cls,) - if not issubclass(cls, AsyncMock): + if not issubclass(cls, AsyncMockMixin): # Check if spec is an async object or function - sig = inspect.signature(NonCallableMock.__init__) - bound_args = sig.bind_partial(cls, *args, **kw).arguments - spec_arg = [ - arg for arg in bound_args.keys() - if arg.startswith('spec') - ] - if spec_arg: - # what if spec_set is different than spec? - if _is_async_obj(bound_args[spec_arg[0]]): - bases = (AsyncMockMixin, cls,) + bound_args = _MOCK_SIG.bind_partial(cls, *args, **kw).arguments + spec_arg = bound_args.get('spec_set', bound_args.get('spec')) + if spec_arg is not None and _is_async_obj(spec_arg): + bases = (AsyncMockMixin, cls) new = type(cls.__name__, bases, {'__doc__': cls.__doc__}) instance = _safe_super(NonCallableMock, cls).__new__(new) return instance @@ -496,7 +489,7 @@ def _mock_add_spec(self, spec, spec_set, _spec_as_instance=False, _spec_asyncs = [] for attr in dir(spec): - if asyncio.iscoroutinefunction(getattr(spec, attr, None)): + if iscoroutinefunction(getattr(spec, attr, None)): _spec_asyncs.append(attr) if spec is not None and not _is_list(spec): @@ -600,7 +593,7 @@ def reset_mock(self, visited=None,*, return_value=False, side_effect=False): for child in self._mock_children.values(): if isinstance(child, _SpecState) or child is _deleted: continue - child.reset_mock(visited) + child.reset_mock(visited, return_value=return_value, side_effect=side_effect) ret = self._mock_return_value if _is_instance_mock(ret) and ret is not self: @@ -857,7 +850,8 @@ def _call_matcher(self, _call): else: name, args, kwargs = _call try: - return name, sig.bind(*args, **kwargs) + bound_call = sig.bind(*args, **kwargs) + return call(name, bound_call.args, bound_call.kwargs) except TypeError as e: return e.with_traceback(None) else: @@ -906,9 +900,9 @@ def assert_called_with(self, /, *args, **kwargs): def _error_message(): msg = self._format_mock_failure_message(args, kwargs) return msg - expected = self._call_matcher((args, kwargs)) + expected = self._call_matcher(_Call((args, kwargs), two=True)) actual = self._call_matcher(self.call_args) - if expected != actual: + if actual != expected: cause = expected if isinstance(expected, Exception) else None raise AssertionError(_error_message()) from cause @@ -976,10 +970,10 @@ def assert_any_call(self, /, *args, **kwargs): The assert passes if the mock has *ever* been called, unlike `assert_called_with` and `assert_called_once_with` that only pass if the call is the most recent one.""" - expected = self._call_matcher((args, kwargs)) + expected = self._call_matcher(_Call((args, kwargs), two=True)) + cause = expected if isinstance(expected, Exception) else None actual = [self._call_matcher(c) for c in self.call_args_list] - if expected not in actual: - cause = expected if isinstance(expected, Exception) else None + if cause or expected not in _AnyComparer(actual): expected_string = self._format_mock_call_signature(args, kwargs) raise AssertionError( '%s call not found' % expected_string @@ -1038,6 +1032,24 @@ def _calls_repr(self, prefix="Calls"): return f"\n{prefix}: {safe_repr(self.mock_calls)}." +_MOCK_SIG = inspect.signature(NonCallableMock.__init__) + + +class _AnyComparer(list): + """A list which checks if it contains a call which may have an + argument of ANY, flipping the components of item and self from + their traditional locations so that ANY is guaranteed to be on + the left.""" + def __contains__(self, item): + for _call in self: + assert len(item) == len(_call) + if all([ + expected == actual + for expected, actual in zip(item, _call) + ]): + return True + return False + def _try_iter(obj): if obj is None: @@ -1696,7 +1708,8 @@ def patch( "as"; very useful if `patch` is creating a mock object for you. `patch` takes arbitrary keyword arguments. These will be passed to - the `Mock` (or `new_callable`) on construction. + `AsyncMock` if the patched object is asynchronous, to `MagicMock` + otherwise or to `new_callable` if specified. `patch.dict(...)`, `patch.multiple(...)` and `patch.object(...)` are available for alternate use-cases. @@ -1820,11 +1833,27 @@ def _unpatch_dict(self): def __exit__(self, *args): """Unpatch the dict.""" - self._unpatch_dict() + if self._original is not None: + self._unpatch_dict() return False - start = __enter__ - stop = __exit__ + + def start(self): + """Activate a patch, returning any created mock.""" + result = self.__enter__() + _patch._active_patches.append(self) + return result + + + def stop(self): + """Stop an active patch.""" + try: + _patch._active_patches.remove(self) + except ValueError: + # If the patch hasn't been started this will fail + return None + + return self.__exit__(None, None, None) def _clear_dict(in_dict): @@ -2096,7 +2125,7 @@ class AsyncMockMixin(Base): def __init__(self, /, *args, **kwargs): super().__init__(*args, **kwargs) - # asyncio.iscoroutinefunction() checks _is_coroutine property to say if an + # iscoroutinefunction() checks _is_coroutine property to say if an # object is a coroutine. Without this check it looks to see if it is a # function/method, which in this case it is not (since it is an # AsyncMock). @@ -2111,7 +2140,7 @@ def __init__(self, /, *args, **kwargs): self.__dict__['__code__'] = code_mock async def _execute_mock_call(self, /, *args, **kwargs): - # This is nearly just like super(), except for sepcial handling + # This is nearly just like super(), except for special handling # of coroutines _call = _Call((args, kwargs), two=True) @@ -2132,7 +2161,7 @@ async def _execute_mock_call(self, /, *args, **kwargs): raise StopAsyncIteration if _is_exception(result): raise result - elif asyncio.iscoroutinefunction(effect): + elif iscoroutinefunction(effect): result = await effect(*args, **kwargs) else: result = effect(*args, **kwargs) @@ -2144,7 +2173,7 @@ async def _execute_mock_call(self, /, *args, **kwargs): return self.return_value if self._mock_wraps is not None: - if asyncio.iscoroutinefunction(self._mock_wraps): + if iscoroutinefunction(self._mock_wraps): return await self._mock_wraps(*args, **kwargs) return self._mock_wraps(*args, **kwargs) @@ -2179,9 +2208,9 @@ def _error_message(): msg = self._format_mock_failure_message(args, kwargs, action='await') return msg - expected = self._call_matcher((args, kwargs)) + expected = self._call_matcher(_Call((args, kwargs), two=True)) actual = self._call_matcher(self.await_args) - if expected != actual: + if actual != expected: cause = expected if isinstance(expected, Exception) else None raise AssertionError(_error_message()) from cause @@ -2200,10 +2229,10 @@ def assert_any_await(self, /, *args, **kwargs): """ Assert the mock has ever been awaited with the specified arguments. """ - expected = self._call_matcher((args, kwargs)) + expected = self._call_matcher(_Call((args, kwargs), two=True)) + cause = expected if isinstance(expected, Exception) else None actual = [self._call_matcher(c) for c in self.await_args_list] - if expected not in actual: - cause = expected if isinstance(expected, Exception) else None + if cause or expected not in _AnyComparer(actual): expected_string = self._format_mock_call_signature(args, kwargs) raise AssertionError( '%s await not found' % expected_string @@ -2281,7 +2310,7 @@ class AsyncMock(AsyncMockMixin, AsyncMagicMixin, Mock): recognized as an async function, and the result of a call is an awaitable: >>> mock = AsyncMock() - >>> asyncio.iscoroutinefunction(mock) + >>> iscoroutinefunction(mock) True >>> inspect.isawaitable(mock()) True @@ -2408,12 +2437,10 @@ def __init__(self, value=(), name=None, parent=None, two=False, def __eq__(self, other): - if other is ANY: - return True try: len_other = len(other) except TypeError: - return False + return NotImplemented self_name = '' if len(self) == 2: @@ -2486,12 +2513,6 @@ def __getattribute__(self, attr): return tuple.__getattribute__(self, attr) - def count(self, /, *args, **kwargs): - return self.__getattr__('count')(*args, **kwargs) - - def index(self, /, *args, **kwargs): - return self.__getattr__('index')(*args, **kwargs) - def _get_call_arguments(self): if len(self) == 2: args, kwargs = self @@ -2656,7 +2677,7 @@ def create_autospec(spec, spec_set=False, instance=False, _parent=None, skipfirst = _must_skip(spec, entry, is_type) kwargs['_eat_self'] = skipfirst - if asyncio.iscoroutinefunction(original): + if iscoroutinefunction(original): child_klass = AsyncMock else: child_klass = MagicMock @@ -2862,9 +2883,6 @@ def __init__(self, iterator): code_mock.co_flags = inspect.CO_ITERABLE_COROUTINE self.__dict__['__code__'] = code_mock - def __aiter__(self): - return self - async def __anext__(self): try: return next(self.iterator) diff --git a/Lib/unittest/result.py b/Lib/unittest/result.py index c7e3206d749bd3425f99f55cb8bb8962231bd87b..111317b329a8521b5482a68d5f8962ba5772b6d9 100644 --- a/Lib/unittest/result.py +++ b/Lib/unittest/result.py @@ -161,7 +161,7 @@ def wasSuccessful(self): """Tells whether or not this result was a success.""" # The hasattr check is for test_result's OldResult test. That # way this method works on objects that lack the attribute. - # (where would such result intances come from? old stored pickles?) + # (where would such result instances come from? old stored pickles?) return ((len(self.failures) == len(self.errors) == 0) and (not hasattr(self, 'unexpectedSuccesses') or len(self.unexpectedSuccesses) == 0)) diff --git a/Lib/unittest/test/test_async_case.py b/Lib/unittest/test/test_async_case.py index 2db441da202a0183d91381bb7c15eb9c345c6cad..d01864b6936ca8d2ec5d47e2c2b6bd7fb1ab092f 100644 --- a/Lib/unittest/test/test_async_case.py +++ b/Lib/unittest/test/test_async_case.py @@ -190,6 +190,33 @@ async def on_async_cleanup(self, val): 'async_cleanup 2', 'sync_cleanup 1']) + def test_base_exception_from_async_method(self): + events = [] + class Test(unittest.IsolatedAsyncioTestCase): + async def test_base(self): + events.append("test_base") + raise BaseException() + events.append("not it") + + async def test_no_err(self): + events.append("test_no_err") + + async def test_cancel(self): + raise asyncio.CancelledError() + + test = Test("test_base") + output = test.run() + self.assertFalse(output.wasSuccessful()) + + test = Test("test_no_err") + test.run() + self.assertEqual(events, ['test_base', 'test_no_err']) + + test = Test("test_cancel") + output = test.run() + self.assertFalse(output.wasSuccessful()) + + if __name__ == "__main__": unittest.main() diff --git a/Lib/unittest/test/test_case.py b/Lib/unittest/test/test_case.py index 3dedcbe6aad5fc7cfc50c23175663abf91b5d6de..f855c4dc00b316ee90b0d750e5f2a614fae6f5d4 100644 --- a/Lib/unittest/test/test_case.py +++ b/Lib/unittest/test/test_case.py @@ -8,7 +8,6 @@ import warnings import weakref import inspect -import types from copy import deepcopy from test import support @@ -1351,20 +1350,6 @@ class MyWarn(Warning): pass self.assertRaises(TypeError, self.assertWarnsRegex, MyWarn, lambda: True) - def testAssertWarnsModifySysModules(self): - # bpo-29620: handle modified sys.modules during iteration - class Foo(types.ModuleType): - @property - def __warningregistry__(self): - sys.modules['@bar@'] = 'bar' - - sys.modules['@foo@'] = Foo('foo') - try: - self.assertWarns(UserWarning, warnings.warn, 'expected') - finally: - del sys.modules['@foo@'] - del sys.modules['@bar@'] - def testAssertRaisesRegexMismatch(self): def Stub(): raise Exception('Unexpected') diff --git a/Lib/unittest/test/test_program.py b/Lib/unittest/test/test_program.py index 4a62ae1b11306ecc843f34add0ae265d147529c1..eef82ff937ab7c038ad01622fd996e02c6dbdd39 100644 --- a/Lib/unittest/test/test_program.py +++ b/Lib/unittest/test/test_program.py @@ -188,8 +188,6 @@ def testBufferCatchFailfast(self): program = self.program for arg, attr in (('buffer', 'buffer'), ('failfast', 'failfast'), ('catch', 'catchbreak')): - if attr == 'catch' and not hasInstallHandler: - continue setattr(program, attr, None) program.parseArgs([None]) diff --git a/Lib/unittest/test/test_runner.py b/Lib/unittest/test/test_runner.py index 7d36340741f463cad49c8c1ab417c7fe9ed73756..dd9a1b6d9aeddf296cb3e93e30d0c8a4e9817e03 100644 --- a/Lib/unittest/test/test_runner.py +++ b/Lib/unittest/test/test_runner.py @@ -592,7 +592,7 @@ def cleanup(*args, **kwargs): class TestableTest(unittest.TestCase): def setUp(self2): self2.addCleanup(cleanup, 1, 2, function=3, self=4) - with self.assertWarns(DeprecationWarning): + with self.assertRaises(TypeError): self2.addCleanup(function=cleanup, arg='hello') def testNothing(self): pass @@ -603,8 +603,7 @@ def testNothing(self): unittest.TestCase.addCleanup(self=TestableTest(), function=cleanup) runTests(TestableTest) self.assertEqual(cleanups, - [((), {'arg': 'hello'}), - ((1, 2), {'function': 3, 'self': 4})]) + [((1, 2), {'function': 3, 'self': 4})]) def test_with_errors_in_addClassCleanup(self): ordering = [] diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py index e84c66c0bdd05e5a00e446840fc4e50e173527c6..690ca4f55f9e3b59774693840b31d041a7b934c3 100644 --- a/Lib/unittest/test/testmock/testasync.py +++ b/Lib/unittest/test/testmock/testasync.py @@ -1,8 +1,12 @@ import asyncio +import gc import inspect import re import unittest +from contextlib import contextmanager +from asyncio import run, iscoroutinefunction +from unittest import IsolatedAsyncioTestCase from unittest.mock import (ANY, call, AsyncMock, patch, MagicMock, Mock, create_autospec, sentinel, _CallList) @@ -12,49 +16,48 @@ def tearDownModule(): class AsyncClass: - def __init__(self): - pass - async def async_method(self): - pass - def normal_method(self): - pass + def __init__(self): pass + async def async_method(self): pass + def normal_method(self): pass @classmethod - async def async_class_method(cls): - pass + async def async_class_method(cls): pass @staticmethod - async def async_static_method(): - pass + async def async_static_method(): pass class AwaitableClass: - def __await__(self): - yield + def __await__(self): yield -async def async_func(): - pass +async def async_func(): pass -async def async_func_args(a, b, *, c): - pass +async def async_func_args(a, b, *, c): pass -def normal_func(): - pass +def normal_func(): pass class NormalClass(object): - def a(self): - pass + def a(self): pass async_foo_name = f'{__name__}.AsyncClass' normal_foo_name = f'{__name__}.NormalClass' +@contextmanager +def assertNeverAwaited(test): + with test.assertWarnsRegex(RuntimeWarning, "was never awaited$"): + yield + # In non-CPython implementations of Python, this is needed because timely + # deallocation is not guaranteed by the garbage collector. + gc.collect() + + class AsyncPatchDecoratorTest(unittest.TestCase): def test_is_coroutine_function_patch(self): @patch.object(AsyncClass, 'async_method') def test_async(mock_method): - self.assertTrue(asyncio.iscoroutinefunction(mock_method)) + self.assertTrue(iscoroutinefunction(mock_method)) test_async() def test_is_async_patch(self): @@ -62,13 +65,13 @@ def test_is_async_patch(self): def test_async(mock_method): m = mock_method() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) @patch(f'{async_foo_name}.async_method') def test_no_parent_attribute(mock_method): m = mock_method() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) test_async() test_no_parent_attribute() @@ -107,7 +110,7 @@ async def test_async(func_args_mock, func_mock): self.assertEqual(await async_func(), 1) self.assertEqual(await async_func_args(1, 2, c=3), 2) - asyncio.run(test_async()) + run(test_async()) self.assertTrue(inspect.iscoroutinefunction(async_func)) @@ -115,7 +118,7 @@ class AsyncPatchCMTest(unittest.TestCase): def test_is_async_function_cm(self): def test_async(): with patch.object(AsyncClass, 'async_method') as mock_method: - self.assertTrue(asyncio.iscoroutinefunction(mock_method)) + self.assertTrue(iscoroutinefunction(mock_method)) test_async() @@ -124,7 +127,7 @@ def test_async(): with patch.object(AsyncClass, 'async_method') as mock_method: m = mock_method() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) test_async() @@ -141,31 +144,31 @@ async def test_async(): self.assertIsInstance(async_func, AsyncMock) self.assertTrue(inspect.iscoroutinefunction(async_func)) - asyncio.run(test_async()) + run(test_async()) class AsyncMockTest(unittest.TestCase): def test_iscoroutinefunction_default(self): mock = AsyncMock() - self.assertTrue(asyncio.iscoroutinefunction(mock)) + self.assertTrue(iscoroutinefunction(mock)) def test_iscoroutinefunction_function(self): async def foo(): pass mock = AsyncMock(foo) - self.assertTrue(asyncio.iscoroutinefunction(mock)) + self.assertTrue(iscoroutinefunction(mock)) self.assertTrue(inspect.iscoroutinefunction(mock)) def test_isawaitable(self): mock = AsyncMock() m = mock() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) self.assertIn('assert_awaited', dir(mock)) def test_iscoroutinefunction_normal_function(self): def foo(): pass mock = AsyncMock(foo) - self.assertTrue(asyncio.iscoroutinefunction(mock)) + self.assertTrue(iscoroutinefunction(mock)) self.assertTrue(inspect.iscoroutinefunction(mock)) def test_future_isfuture(self): @@ -211,9 +214,9 @@ async def main(): self.assertEqual(spec.await_args_list, []) spec.assert_not_awaited() - asyncio.run(main()) + run(main()) - self.assertTrue(asyncio.iscoroutinefunction(spec)) + self.assertTrue(iscoroutinefunction(spec)) self.assertTrue(asyncio.iscoroutine(awaitable)) self.assertEqual(spec.await_count, 1) self.assertEqual(spec.await_args, call(1, 2, c=3)) @@ -223,6 +226,10 @@ async def main(): spec.assert_awaited_with(1, 2, c=3) spec.assert_awaited() + with self.assertRaises(AssertionError): + spec.assert_any_await(e=1) + + def test_patch_with_autospec(self): async def test_async(): @@ -230,7 +237,7 @@ async def test_async(): awaitable = mock_method(1, 2, c=3) self.assertIsInstance(mock_method.mock, AsyncMock) - self.assertTrue(asyncio.iscoroutinefunction(mock_method)) + self.assertTrue(iscoroutinefunction(mock_method)) self.assertTrue(asyncio.iscoroutine(awaitable)) self.assertTrue(inspect.isawaitable(awaitable)) @@ -255,7 +262,7 @@ async def test_async(): self.assertIsNone(mock_method.await_args) self.assertEqual(mock_method.await_args_list, []) - asyncio.run(test_async()) + run(test_async()) class AsyncSpecTest(unittest.TestCase): @@ -278,8 +285,7 @@ def test_spec_mock_type_kw(self): def inner_test(mock_type): async_mock = mock_type(spec=async_func) self.assertIsInstance(async_mock, mock_type) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): self.assertTrue(inspect.isawaitable(async_mock())) sync_mock = mock_type(spec=normal_func) @@ -293,8 +299,7 @@ def test_spec_mock_type_positional(self): def inner_test(mock_type): async_mock = mock_type(async_func) self.assertIsInstance(async_mock, mock_type) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): self.assertTrue(inspect.isawaitable(async_mock())) sync_mock = mock_type(normal_func) @@ -309,14 +314,14 @@ def test_spec_as_normal_kw_AsyncMock(self): self.assertIsInstance(mock, AsyncMock) m = mock() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) def test_spec_as_normal_positional_AsyncMock(self): mock = AsyncMock(normal_func) self.assertIsInstance(mock, AsyncMock) m = mock() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) def test_spec_async_mock(self): @patch.object(AsyncClass, 'async_method', spec=True) @@ -362,16 +367,17 @@ def test_is_AsyncMock_patch(self): @patch.object(AsyncClass, 'async_method', spec_set=True) def test_async(async_method): self.assertIsInstance(async_method, AsyncMock) + test_async() def test_is_async_AsyncMock(self): mock = AsyncMock(spec_set=AsyncClass.async_method) - self.assertTrue(asyncio.iscoroutinefunction(mock)) + self.assertTrue(iscoroutinefunction(mock)) self.assertIsInstance(mock, AsyncMock) def test_is_child_AsyncMock(self): mock = MagicMock(spec_set=AsyncClass) - self.assertTrue(asyncio.iscoroutinefunction(mock.async_method)) - self.assertFalse(asyncio.iscoroutinefunction(mock.normal_method)) + self.assertTrue(iscoroutinefunction(mock.async_method)) + self.assertFalse(iscoroutinefunction(mock.normal_method)) self.assertIsInstance(mock.async_method, AsyncMock) self.assertIsInstance(mock.normal_method, MagicMock) self.assertIsInstance(mock, MagicMock) @@ -384,10 +390,9 @@ def test_magicmock_lambda_spec(self): self.assertIsInstance(cm, MagicMock) -class AsyncArguments(unittest.IsolatedAsyncioTestCase): +class AsyncArguments(IsolatedAsyncioTestCase): async def test_add_return_value(self): - async def addition(self, var): - return var + 1 + async def addition(self, var): pass mock = AsyncMock(addition, return_value=10) output = await mock(5) @@ -395,8 +400,7 @@ async def addition(self, var): self.assertEqual(output, 10) async def test_add_side_effect_exception(self): - async def addition(var): - return var + 1 + async def addition(var): pass mock = AsyncMock(addition, side_effect=Exception('err')) with self.assertRaises(Exception): await mock(5) @@ -542,24 +546,20 @@ def test_magic_methods_are_async_functions(self): self.assertIsInstance(m_mock.__aenter__, AsyncMock) self.assertIsInstance(m_mock.__aexit__, AsyncMock) # AsyncMocks are also coroutine functions - self.assertTrue(asyncio.iscoroutinefunction(m_mock.__aenter__)) - self.assertTrue(asyncio.iscoroutinefunction(m_mock.__aexit__)) + self.assertTrue(iscoroutinefunction(m_mock.__aenter__)) + self.assertTrue(iscoroutinefunction(m_mock.__aexit__)) class AsyncContextManagerTest(unittest.TestCase): + class WithAsyncContextManager: - async def __aenter__(self, *args, **kwargs): - self.entered = True - return self + async def __aenter__(self, *args, **kwargs): pass - async def __aexit__(self, *args, **kwargs): - self.exited = True + async def __aexit__(self, *args, **kwargs): pass class WithSyncContextManager: - def __enter__(self, *args, **kwargs): - return self + def __enter__(self, *args, **kwargs): pass - def __exit__(self, *args, **kwargs): - pass + def __exit__(self, *args, **kwargs): pass class ProductionCode: # Example real-world(ish) code @@ -580,7 +580,7 @@ def inner_test(mock_type): response.json = AsyncMock(return_value={'json': 123}) cm.__aenter__.return_value = response pc.session.post.return_value = cm - result = asyncio.run(pc.main()) + result = run(pc.main()) self.assertEqual(result, {'json': 123}) for mock_type in [AsyncMock, MagicMock]: @@ -599,7 +599,7 @@ async def use_context_manager(): called = True return result - cm_result = asyncio.run(use_context_manager()) + cm_result = run(use_context_manager()) self.assertTrue(called) self.assertTrue(cm_mock.__aenter__.called) self.assertTrue(cm_mock.__aexit__.called) @@ -612,6 +612,7 @@ async def use_context_manager(): with self.subTest(f"test context manager magics with {mock_type}"): inner_test(mock_type) + def test_mock_customize_async_context_manager(self): instance = self.WithAsyncContextManager() mock_instance = MagicMock(instance) @@ -623,7 +624,7 @@ async def use_context_manager(): async with mock_instance as result: return result - self.assertIs(asyncio.run(use_context_manager()), expected_result) + self.assertIs(run(use_context_manager()), expected_result) def test_mock_customize_async_context_manager_with_coroutine(self): enter_called = False @@ -647,7 +648,7 @@ async def use_context_manager(): async with mock_instance: pass - asyncio.run(use_context_manager()) + run(use_context_manager()) self.assertTrue(enter_called) self.assertTrue(exit_called) @@ -659,7 +660,7 @@ async def raise_in(context_manager): instance = self.WithAsyncContextManager() mock_instance = MagicMock(instance) with self.assertRaises(TypeError): - asyncio.run(raise_in(mock_instance)) + run(raise_in(mock_instance)) class AsyncIteratorTest(unittest.TestCase): @@ -667,23 +668,16 @@ class WithAsyncIterator(object): def __init__(self): self.items = ["foo", "NormalFoo", "baz"] - def __aiter__(self): - return self - - async def __anext__(self): - try: - return self.items.pop() - except IndexError: - pass + def __aiter__(self): pass - raise StopAsyncIteration + async def __anext__(self): pass def test_aiter_set_return_value(self): mock_iter = AsyncMock(name="tester") mock_iter.__aiter__.return_value = [1, 2, 3] async def main(): return [i async for i in mock_iter] - result = asyncio.run(main()) + result = run(main()) self.assertEqual(result, [1, 2, 3]) def test_mock_aiter_and_anext_asyncmock(self): @@ -692,11 +686,11 @@ def inner_test(mock_type): mock_instance = mock_type(instance) # Check that the mock and the real thing bahave the same # __aiter__ is not actually async, so not a coroutinefunction - self.assertFalse(asyncio.iscoroutinefunction(instance.__aiter__)) - self.assertFalse(asyncio.iscoroutinefunction(mock_instance.__aiter__)) + self.assertFalse(iscoroutinefunction(instance.__aiter__)) + self.assertFalse(iscoroutinefunction(mock_instance.__aiter__)) # __anext__ is async - self.assertTrue(asyncio.iscoroutinefunction(instance.__anext__)) - self.assertTrue(asyncio.iscoroutinefunction(mock_instance.__anext__)) + self.assertTrue(iscoroutinefunction(instance.__anext__)) + self.assertTrue(iscoroutinefunction(mock_instance.__anext__)) for mock_type in [AsyncMock, MagicMock]: with self.subTest(f"test aiter and anext corourtine with {mock_type}"): @@ -714,18 +708,18 @@ async def iterate(iterator): expected = ["FOO", "BAR", "BAZ"] def test_default(mock_type): mock_instance = mock_type(self.WithAsyncIterator()) - self.assertEqual(asyncio.run(iterate(mock_instance)), []) + self.assertEqual(run(iterate(mock_instance)), []) def test_set_return_value(mock_type): mock_instance = mock_type(self.WithAsyncIterator()) mock_instance.__aiter__.return_value = expected[:] - self.assertEqual(asyncio.run(iterate(mock_instance)), expected) + self.assertEqual(run(iterate(mock_instance)), expected) def test_set_return_value_iter(mock_type): mock_instance = mock_type(self.WithAsyncIterator()) mock_instance.__aiter__.return_value = iter(expected[:]) - self.assertEqual(asyncio.run(iterate(mock_instance)), expected) + self.assertEqual(run(iterate(mock_instance)), expected) for mock_type in [AsyncMock, MagicMock]: with self.subTest(f"default value with {mock_type}"): @@ -750,10 +744,9 @@ async def _await_coroutine(self, coroutine): def test_assert_called_but_not_awaited(self): mock = AsyncMock(AsyncClass) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): mock.async_method() - self.assertTrue(asyncio.iscoroutinefunction(mock.async_method)) + self.assertTrue(iscoroutinefunction(mock.async_method)) mock.async_method.assert_called() mock.async_method.assert_called_once() mock.async_method.assert_called_once_with() @@ -771,7 +764,7 @@ def test_assert_called_then_awaited(self): with self.assertRaises(AssertionError): mock.async_method.assert_awaited() - asyncio.run(self._await_coroutine(mock_coroutine)) + run(self._await_coroutine(mock_coroutine)) # Assert we haven't re-called the function mock.async_method.assert_called_once() mock.async_method.assert_awaited() @@ -785,21 +778,21 @@ def test_assert_called_and_awaited_at_same_time(self): with self.assertRaises(AssertionError): self.mock.assert_called() - asyncio.run(self._runnable_test()) + run(self._runnable_test()) self.mock.assert_called_once() self.mock.assert_awaited_once() def test_assert_called_twice_and_awaited_once(self): mock = AsyncMock(AsyncClass) coroutine = mock.async_method() - with self.assertWarns(RuntimeWarning): - # The first call will be awaited so no warning there - # But this call will never get awaited, so it will warn here + # The first call will be awaited so no warning there + # But this call will never get awaited, so it will warn here + with assertNeverAwaited(self): mock.async_method() with self.assertRaises(AssertionError): mock.async_method.assert_awaited() mock.async_method.assert_called() - asyncio.run(self._await_coroutine(coroutine)) + run(self._await_coroutine(coroutine)) mock.async_method.assert_awaited() mock.async_method.assert_awaited_once() @@ -807,10 +800,10 @@ def test_assert_called_once_and_awaited_twice(self): mock = AsyncMock(AsyncClass) coroutine = mock.async_method() mock.async_method.assert_called_once() - asyncio.run(self._await_coroutine(coroutine)) + run(self._await_coroutine(coroutine)) with self.assertRaises(RuntimeError): # Cannot reuse already awaited coroutine - asyncio.run(self._await_coroutine(coroutine)) + run(self._await_coroutine(coroutine)) mock.async_method.assert_awaited() def test_assert_awaited_but_not_called(self): @@ -820,7 +813,7 @@ def test_assert_awaited_but_not_called(self): self.mock.assert_called() with self.assertRaises(TypeError): # You cannot await an AsyncMock, it must be a coroutine - asyncio.run(self._await_coroutine(self.mock)) + run(self._await_coroutine(self.mock)) with self.assertRaises(AssertionError): self.mock.assert_awaited() @@ -829,38 +822,34 @@ def test_assert_awaited_but_not_called(self): def test_assert_has_calls_not_awaits(self): kalls = [call('foo')] - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): self.mock('foo') self.mock.assert_has_calls(kalls) with self.assertRaises(AssertionError): self.mock.assert_has_awaits(kalls) def test_assert_has_mock_calls_on_async_mock_no_spec(self): - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): self.mock() kalls_empty = [('', (), {})] self.assertEqual(self.mock.mock_calls, kalls_empty) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): self.mock('foo') + with assertNeverAwaited(self): self.mock('baz') mock_kalls = ([call(), call('foo'), call('baz')]) self.assertEqual(self.mock.mock_calls, mock_kalls) def test_assert_has_mock_calls_on_async_mock_with_spec(self): a_class_mock = AsyncMock(AsyncClass) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): a_class_mock.async_method() kalls_empty = [('', (), {})] self.assertEqual(a_class_mock.async_method.mock_calls, kalls_empty) self.assertEqual(a_class_mock.mock_calls, [call.async_method()]) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): a_class_mock.async_method(1, 2, 3, a=4, b=5) method_kalls = [call(), call(1, 2, 3, a=4, b=5)] mock_kalls = [call.async_method(), call.async_method(1, 2, 3, a=4, b=5)] @@ -868,9 +857,9 @@ def test_assert_has_mock_calls_on_async_mock_with_spec(self): self.assertEqual(a_class_mock.mock_calls, mock_kalls) def test_async_method_calls_recorded(self): - with self.assertWarns(RuntimeWarning): - # Will raise warnings because never awaited + with assertNeverAwaited(self): self.mock.something(3, fish=None) + with assertNeverAwaited(self): self.mock.something_else.something(6, cake=sentinel.Cake) self.assertEqual(self.mock.method_calls, [ @@ -892,19 +881,20 @@ def assert_attrs(mock): self.assertEqual(attr, []) assert_attrs(self.mock) - with self.assertWarns(RuntimeWarning): - # Will raise warnings because never awaited + with assertNeverAwaited(self): self.mock() + with assertNeverAwaited(self): self.mock(1, 2) + with assertNeverAwaited(self): self.mock(a=3) self.mock.reset_mock() assert_attrs(self.mock) a_mock = AsyncMock(AsyncClass) - with self.assertWarns(RuntimeWarning): - # Will raise warnings because never awaited + with assertNeverAwaited(self): a_mock.async_method() + with assertNeverAwaited(self): a_mock.async_method(1, a=3) a_mock.reset_mock() @@ -914,17 +904,17 @@ def test_assert_awaited(self): with self.assertRaises(AssertionError): self.mock.assert_awaited() - asyncio.run(self._runnable_test()) + run(self._runnable_test()) self.mock.assert_awaited() def test_assert_awaited_once(self): with self.assertRaises(AssertionError): self.mock.assert_awaited_once() - asyncio.run(self._runnable_test()) + run(self._runnable_test()) self.mock.assert_awaited_once() - asyncio.run(self._runnable_test()) + run(self._runnable_test()) with self.assertRaises(AssertionError): self.mock.assert_awaited_once() @@ -933,15 +923,15 @@ def test_assert_awaited_with(self): with self.assertRaisesRegex(AssertionError, msg): self.mock.assert_awaited_with('foo') - asyncio.run(self._runnable_test()) + run(self._runnable_test()) msg = 'expected await not found' with self.assertRaisesRegex(AssertionError, msg): self.mock.assert_awaited_with('foo') - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) self.mock.assert_awaited_with('foo') - asyncio.run(self._runnable_test('SomethingElse')) + run(self._runnable_test('SomethingElse')) with self.assertRaises(AssertionError): self.mock.assert_awaited_with('foo') @@ -949,10 +939,10 @@ def test_assert_awaited_once_with(self): with self.assertRaises(AssertionError): self.mock.assert_awaited_once_with('foo') - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) self.mock.assert_awaited_once_with('foo') - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) with self.assertRaises(AssertionError): self.mock.assert_awaited_once_with('foo') @@ -960,14 +950,14 @@ def test_assert_any_wait(self): with self.assertRaises(AssertionError): self.mock.assert_any_await('foo') - asyncio.run(self._runnable_test('baz')) + run(self._runnable_test('baz')) with self.assertRaises(AssertionError): self.mock.assert_any_await('foo') - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) self.mock.assert_any_await('foo') - asyncio.run(self._runnable_test('SomethingElse')) + run(self._runnable_test('SomethingElse')) self.mock.assert_any_await('foo') def test_assert_has_awaits_no_order(self): @@ -977,43 +967,67 @@ def test_assert_has_awaits_no_order(self): self.mock.assert_has_awaits(calls) self.assertEqual(len(cm.exception.args), 1) - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) with self.assertRaises(AssertionError): self.mock.assert_has_awaits(calls) - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) with self.assertRaises(AssertionError): self.mock.assert_has_awaits(calls) - asyncio.run(self._runnable_test('baz')) + run(self._runnable_test('baz')) self.mock.assert_has_awaits(calls) - asyncio.run(self._runnable_test('SomethingElse')) + run(self._runnable_test('SomethingElse')) self.mock.assert_has_awaits(calls) + def test_awaits_asserts_with_any(self): + class Foo: + def __eq__(self, other): pass + + run(self._runnable_test(Foo(), 1)) + + self.mock.assert_has_awaits([call(ANY, 1)]) + self.mock.assert_awaited_with(ANY, 1) + self.mock.assert_any_await(ANY, 1) + + def test_awaits_asserts_with_spec_and_any(self): + class Foo: + def __eq__(self, other): pass + + mock_with_spec = AsyncMock(spec=Foo) + + async def _custom_mock_runnable_test(*args): + await mock_with_spec(*args) + + run(_custom_mock_runnable_test(Foo(), 1)) + mock_with_spec.assert_has_awaits([call(ANY, 1)]) + mock_with_spec.assert_awaited_with(ANY, 1) + mock_with_spec.assert_any_await(ANY, 1) + def test_assert_has_awaits_ordered(self): calls = [call('foo'), call('baz')] with self.assertRaises(AssertionError): self.mock.assert_has_awaits(calls, any_order=True) - asyncio.run(self._runnable_test('baz')) + run(self._runnable_test('baz')) with self.assertRaises(AssertionError): self.mock.assert_has_awaits(calls, any_order=True) - asyncio.run(self._runnable_test('bamf')) + run(self._runnable_test('bamf')) with self.assertRaises(AssertionError): self.mock.assert_has_awaits(calls, any_order=True) - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) self.mock.assert_has_awaits(calls, any_order=True) - asyncio.run(self._runnable_test('qux')) + run(self._runnable_test('qux')) self.mock.assert_has_awaits(calls, any_order=True) def test_assert_not_awaited(self): self.mock.assert_not_awaited() - asyncio.run(self._runnable_test()) + run(self._runnable_test()) with self.assertRaises(AssertionError): self.mock.assert_not_awaited() @@ -1021,7 +1035,7 @@ def test_assert_has_awaits_not_matching_spec_error(self): async def f(x=None): pass self.mock = AsyncMock(spec=f) - asyncio.run(self._runnable_test(1)) + run(self._runnable_test(1)) with self.assertRaisesRegex( AssertionError, diff --git a/Lib/unittest/test/testmock/testhelpers.py b/Lib/unittest/test/testmock/testhelpers.py index f3c7acb98c21fae241d07b8625bec8bf3219f2fd..9e7ec5d62d5da2074dcb9f2397f8e721447069e5 100644 --- a/Lib/unittest/test/testmock/testhelpers.py +++ b/Lib/unittest/test/testmock/testhelpers.py @@ -64,7 +64,28 @@ def __ne__(self, other): pass self.assertEqual(expected, mock.mock_calls) self.assertEqual(mock.mock_calls, expected) + def test_any_no_spec(self): + # This is a regression test for bpo-37555 + class Foo: + def __eq__(self, other): pass + + mock = Mock() + mock(Foo(), 1) + mock.assert_has_calls([call(ANY, 1)]) + mock.assert_called_with(ANY, 1) + mock.assert_any_call(ANY, 1) + + def test_any_and_spec_set(self): + # This is a regression test for bpo-37555 + class Foo: + def __eq__(self, other): pass + + mock = Mock(spec=Foo) + mock(Foo(), 1) + mock.assert_has_calls([call(ANY, 1)]) + mock.assert_called_with(ANY, 1) + mock.assert_any_call(ANY, 1) class CallTest(unittest.TestCase): diff --git a/Lib/unittest/test/testmock/testmagicmethods.py b/Lib/unittest/test/testmock/testmagicmethods.py index 76b3a560de090ae8aefadd6222605a3ed6791b3a..a4feae7e9d3b73fbbec188f0cd6ec5df7f7066ee 100644 --- a/Lib/unittest/test/testmock/testmagicmethods.py +++ b/Lib/unittest/test/testmock/testmagicmethods.py @@ -1,8 +1,7 @@ -import asyncio import math import unittest import os -import sys +from asyncio import iscoroutinefunction from unittest.mock import AsyncMock, Mock, MagicMock, _magics @@ -286,8 +285,8 @@ def test_asyncmock_defaults(self): self.assertEqual(math.trunc(mock), mock.__trunc__()) self.assertEqual(math.floor(mock), mock.__floor__()) self.assertEqual(math.ceil(mock), mock.__ceil__()) - self.assertTrue(asyncio.iscoroutinefunction(mock.__aexit__)) - self.assertTrue(asyncio.iscoroutinefunction(mock.__aenter__)) + self.assertTrue(iscoroutinefunction(mock.__aexit__)) + self.assertTrue(iscoroutinefunction(mock.__aenter__)) self.assertIsInstance(mock.__aenter__, AsyncMock) self.assertIsInstance(mock.__aexit__, AsyncMock) @@ -312,8 +311,8 @@ def test_magicmock_defaults(self): self.assertEqual(math.trunc(mock), mock.__trunc__()) self.assertEqual(math.floor(mock), mock.__floor__()) self.assertEqual(math.ceil(mock), mock.__ceil__()) - self.assertTrue(asyncio.iscoroutinefunction(mock.__aexit__)) - self.assertTrue(asyncio.iscoroutinefunction(mock.__aenter__)) + self.assertTrue(iscoroutinefunction(mock.__aexit__)) + self.assertTrue(iscoroutinefunction(mock.__aenter__)) self.assertIsInstance(mock.__aenter__, AsyncMock) self.assertIsInstance(mock.__aexit__, AsyncMock) @@ -429,7 +428,6 @@ def _dir(self): self.assertEqual(dir(mock), ['foo']) - @unittest.skipIf('PyPy' in sys.version, "This fails differently on pypy") def test_bound_methods(self): m = Mock() diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 1cde45e9aea5550b42c2150306842552b902ef79..f9307245307b9b23cf1098db01da6c44ceeca1ba 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -3,6 +3,7 @@ import sys import tempfile +from test.support import ALWAYS_EQ import unittest from unittest.test.testmock.support import is_instance from unittest import mock @@ -262,7 +263,7 @@ def test_call(self): ret_val = mock(sentinel.Arg) self.assertTrue(mock.called, "called not set") - self.assertEqual(mock.call_count, 1, "call_count incoreect") + self.assertEqual(mock.call_count, 1, "call_count incorrect") self.assertEqual(mock.call_args, ((sentinel.Arg,), {}), "call_args not set") self.assertEqual(mock.call_args.args, (sentinel.Arg,), @@ -322,6 +323,8 @@ def test_calls_equal_with_any(self): self.assertFalse(mm != mock.ANY) self.assertTrue(mock.ANY == mm) self.assertFalse(mock.ANY != mm) + self.assertTrue(mm == ALWAYS_EQ) + self.assertFalse(mm != ALWAYS_EQ) call1 = mock.call(mock.MagicMock()) call2 = mock.call(mock.ANY) @@ -330,6 +333,11 @@ def test_calls_equal_with_any(self): self.assertTrue(call2 == call1) self.assertFalse(call2 != call1) + self.assertTrue(call1 == ALWAYS_EQ) + self.assertFalse(call1 != ALWAYS_EQ) + self.assertFalse(call1 == 1) + self.assertTrue(call1 != 1) + def test_assert_called_with(self): mock = Mock() @@ -707,6 +715,57 @@ def method(self): pass self.assertRaises(StopIteration, mock.method) + def test_magic_method_wraps_dict(self): + # bpo-25597: MagicMock with wrap doesn't call wrapped object's + # method for magic methods with default values. + data = {'foo': 'bar'} + + wrapped_dict = MagicMock(wraps=data) + self.assertEqual(wrapped_dict.get('foo'), 'bar') + # Accessing key gives a MagicMock + self.assertIsInstance(wrapped_dict['foo'], MagicMock) + # __contains__ method has a default value of False + self.assertFalse('foo' in wrapped_dict) + + # return_value is non-sentinel and takes precedence over wrapped value. + wrapped_dict.get.return_value = 'return_value' + self.assertEqual(wrapped_dict.get('foo'), 'return_value') + + # return_value is sentinel and hence wrapped value is returned. + wrapped_dict.get.return_value = sentinel.DEFAULT + self.assertEqual(wrapped_dict.get('foo'), 'bar') + + self.assertEqual(wrapped_dict.get('baz'), None) + self.assertIsInstance(wrapped_dict['baz'], MagicMock) + self.assertFalse('bar' in wrapped_dict) + + data['baz'] = 'spam' + self.assertEqual(wrapped_dict.get('baz'), 'spam') + self.assertIsInstance(wrapped_dict['baz'], MagicMock) + self.assertFalse('bar' in wrapped_dict) + + del data['baz'] + self.assertEqual(wrapped_dict.get('baz'), None) + + + def test_magic_method_wraps_class(self): + + class Foo: + + def __getitem__(self, index): + return index + + def __custom_method__(self): + return "foo" + + + klass = MagicMock(wraps=Foo) + obj = klass() + self.assertEqual(obj.__getitem__(2), 2) + self.assertEqual(obj[2], 2) + self.assertEqual(obj.__custom_method__(), "foo") + + def test_exceptional_side_effect(self): mock = Mock(side_effect=AttributeError) self.assertRaises(AttributeError, mock) @@ -1628,11 +1687,23 @@ def test_reset_return(self): self.assertNotEqual(m.side_effect, None) def test_reset_sideeffect(self): - m = Mock(return_value=10, side_effect=[2,3]) + m = Mock(return_value=10, side_effect=[2, 3]) m.reset_mock(side_effect=True) self.assertEqual(m.return_value, 10) self.assertEqual(m.side_effect, None) + def test_reset_return_with_children(self): + m = MagicMock(f=MagicMock(return_value=1)) + self.assertEqual(m.f(), 1) + m.reset_mock(return_value=True) + self.assertNotEqual(m.f(), 1) + + def test_reset_return_with_children_side_effect(self): + m = MagicMock(f=MagicMock(side_effect=[2, 3])) + self.assertNotEqual(m.f.side_effect, None) + m.reset_mock(side_effect=True) + self.assertEqual(m.f.side_effect, None) + def test_mock_add_spec(self): class _One(object): one = 1 @@ -1801,6 +1872,11 @@ def test_mock_open_using_next(self): with self.assertRaises(StopIteration): next(f1) + def test_mock_open_next_with_readline_with_return_value(self): + mopen = mock.mock_open(read_data='foo\nbarn') + mopen.return_value.readline.return_value = 'abc' + self.assertEqual('abc', next(mopen())) + def test_mock_open_write(self): # Test exception in file writing write() mock_namedtemp = mock.mock_open(mock.MagicMock(name='JLV')) @@ -2080,6 +2156,16 @@ def trace(frame, event, arg): # pragma: no cover obj = mock(spec=Something) self.assertIsInstance(obj, Something) + def test_bool_not_called_when_passing_spec_arg(self): + class Something: + def __init__(self): + self.obj_with_bool_func = unittest.mock.MagicMock() + + obj = Something() + with unittest.mock.patch.object(obj, 'obj_with_bool_func', autospec=True): pass + + self.assertEqual(obj.obj_with_bool_func.__bool__.call_count, 0) + if __name__ == '__main__': unittest.main() diff --git a/Lib/unittest/test/testmock/testpatch.py b/Lib/unittest/test/testmock/testpatch.py index e065a2c35fbeec54886ed0e4f92ba9d6894e0053..d8c1515f8346c33894e10d1591bd510215a5bbba 100644 --- a/Lib/unittest/test/testmock/testpatch.py +++ b/Lib/unittest/test/testmock/testpatch.py @@ -4,6 +4,7 @@ import os import sys +from collections import OrderedDict import unittest from unittest.test.testmock import support @@ -769,6 +770,14 @@ def test_patch_dict_start_stop(self): self.assertEqual(d, original) + def test_patch_dict_stop_without_start(self): + d = {'foo': 'bar'} + original = d.copy() + patcher = patch.dict(d, [('spam', 'eggs')], clear=True) + self.assertFalse(patcher.stop()) + self.assertEqual(d, original) + + def test_patch_dict_class_decorator(self): this = self d = {'spam': 'eggs'} @@ -1807,6 +1816,56 @@ def stop(self): self.assertEqual(stopped, ["three", "two", "one"]) + def test_patch_dict_stopall(self): + dic1 = {} + dic2 = {1: 'a'} + dic3 = {1: 'A', 2: 'B'} + origdic1 = dic1.copy() + origdic2 = dic2.copy() + origdic3 = dic3.copy() + patch.dict(dic1, {1: 'I', 2: 'II'}).start() + patch.dict(dic2, {2: 'b'}).start() + + @patch.dict(dic3) + def patched(): + del dic3[1] + + patched() + self.assertNotEqual(dic1, origdic1) + self.assertNotEqual(dic2, origdic2) + self.assertEqual(dic3, origdic3) + + patch.stopall() + + self.assertEqual(dic1, origdic1) + self.assertEqual(dic2, origdic2) + self.assertEqual(dic3, origdic3) + + + def test_patch_and_patch_dict_stopall(self): + original_unlink = os.unlink + original_chdir = os.chdir + dic1 = {} + dic2 = {1: 'A', 2: 'B'} + origdic1 = dic1.copy() + origdic2 = dic2.copy() + + patch('os.unlink', something).start() + patch('os.chdir', something_else).start() + patch.dict(dic1, {1: 'I', 2: 'II'}).start() + patch.dict(dic2).start() + del dic2[1] + + self.assertIsNot(os.unlink, original_unlink) + self.assertIsNot(os.chdir, original_chdir) + self.assertNotEqual(dic1, origdic1) + self.assertNotEqual(dic2, origdic2) + patch.stopall() + self.assertIs(os.unlink, original_unlink) + self.assertIs(os.chdir, original_chdir) + self.assertEqual(dic1, origdic1) + self.assertEqual(dic2, origdic2) + def test_special_attrs(self): def foo(x=0): @@ -1834,6 +1893,25 @@ def foo(*a, x=0): self.assertEqual(foo(), 1) self.assertEqual(foo(), 0) + def test_patch_orderdict(self): + foo = OrderedDict() + foo['a'] = object() + foo['b'] = 'python' + + original = foo.copy() + update_values = list(zip('cdefghijklmnopqrstuvwxyz', range(26))) + patched_values = list(foo.items()) + update_values + + with patch.dict(foo, OrderedDict(update_values)): + self.assertEqual(list(foo.items()), patched_values) + + self.assertEqual(foo, original) + + with patch.dict(foo, update_values): + self.assertEqual(list(foo.items()), patched_values) + + self.assertEqual(foo, original) + def test_dotted_but_module_not_loaded(self): # This exercises the AttributeError branch of _dot_lookup. diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index e2b6f133e1cd9c7478a28e71fa8630051eb4bae4..335e183498d8bd5ea1c29142b54c60c36c31c09a 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -29,6 +29,7 @@ import re import sys +import types import collections import warnings @@ -176,6 +177,8 @@ def port(self): raise ValueError("Port out of range 0-65535") return port + __class_getitem__ = classmethod(types.GenericAlias) + class _NetlocResultMixinStr(_NetlocResultMixinBase, _ResultMixinStr): __slots__ = () @@ -366,9 +369,23 @@ def _fix_result_transcoding(): def urlparse(url, scheme='', allow_fragments=True): """Parse a URL into 6 components: :///;?# - Return a 6-tuple: (scheme, netloc, path, params, query, fragment). - Note that we don't break the components up in smaller bits - (e.g. netloc is a single string) and we don't expand % escapes.""" + + The result is a named 6-tuple with fields corresponding to the + above. It is either a ParseResult or ParseResultBytes object, + depending on the type of the url parameter. + + The username, password, hostname, and port sub-components of netloc + can also be accessed as attributes of the returned object. + + The scheme argument provides the default value of the scheme + component when no scheme is found in url. + + If allow_fragments is False, no attempt is made to separate the + fragment component from the previous component, which can be either + path or query. + + Note that % escapes are not expanded. + """ url, scheme, _coerce_result = _coerce_args(url, scheme) splitresult = urlsplit(url, scheme, allow_fragments) scheme, netloc, url, query, fragment = splitresult @@ -417,9 +434,24 @@ def _checknetloc(netloc): def urlsplit(url, scheme='', allow_fragments=True): """Parse a URL into 5 components: :///?# - Return a 5-tuple: (scheme, netloc, path, query, fragment). - Note that we don't break the components up in smaller bits - (e.g. netloc is a single string) and we don't expand % escapes.""" + + The result is a named 5-tuple with fields corresponding to the + above. It is either a SplitResult or SplitResultBytes object, + depending on the type of the url parameter. + + The username, password, hostname, and port sub-components of netloc + can also be accessed as attributes of the returned object. + + The scheme argument provides the default value of the scheme + component when no scheme is found in url. + + If allow_fragments is False, no attempt is made to separate the + fragment component from the previous component, which can be either + path or query. + + Note that % escapes are not expanded. + """ + url, scheme, _coerce_result = _coerce_args(url, scheme) allow_fragments = bool(allow_fragments) key = url, scheme, allow_fragments, type(url), type(scheme) @@ -431,31 +463,11 @@ def urlsplit(url, scheme='', allow_fragments=True): netloc = query = fragment = '' i = url.find(':') if i > 0: - if url[:i] == 'http': # optimize the common case - url = url[i+1:] - if url[:2] == '//': - netloc, url = _splitnetloc(url, 2) - if (('[' in netloc and ']' not in netloc) or - (']' in netloc and '[' not in netloc)): - raise ValueError("Invalid IPv6 URL") - if allow_fragments and '#' in url: - url, fragment = url.split('#', 1) - if '?' in url: - url, query = url.split('?', 1) - _checknetloc(netloc) - v = SplitResult('http', netloc, url, query, fragment) - _parse_cache[key] = v - return _coerce_result(v) for c in url[:i]: if c not in scheme_chars: break else: - # make sure "url" is not actually a port number (in which case - # "scheme" is really part of the path) - rest = url[i+1:] - if not rest or any(c not in '0123456789' for c in rest): - # not a port number - scheme, url = url[:i].lower(), rest + scheme, url = url[:i].lower(), url[i+1:] if url[:2] == '//': netloc, url = _splitnetloc(url, 2) @@ -631,6 +643,8 @@ def unquote(string, encoding='utf-8', errors='replace'): unquote('abc%20def') -> 'abc def'. """ + if isinstance(string, bytes): + return unquote_to_bytes(string).decode(encoding, errors) if '%' not in string: string.split return string @@ -648,7 +662,7 @@ def unquote(string, encoding='utf-8', errors='replace'): def parse_qs(qs, keep_blank_values=False, strict_parsing=False, - encoding='utf-8', errors='replace', max_num_fields=None): + encoding='utf-8', errors='replace', max_num_fields=None, separator='&'): """Parse a query given as a string argument. Arguments: @@ -672,12 +686,15 @@ def parse_qs(qs, keep_blank_values=False, strict_parsing=False, max_num_fields: int. If set, then throws a ValueError if there are more than n fields read by parse_qsl(). + separator: str. The symbol to use for separating the query arguments. + Defaults to &. + Returns a dictionary. """ parsed_result = {} pairs = parse_qsl(qs, keep_blank_values, strict_parsing, encoding=encoding, errors=errors, - max_num_fields=max_num_fields) + max_num_fields=max_num_fields, separator=separator) for name, value in pairs: if name in parsed_result: parsed_result[name].append(value) @@ -687,7 +704,7 @@ def parse_qs(qs, keep_blank_values=False, strict_parsing=False, def parse_qsl(qs, keep_blank_values=False, strict_parsing=False, - encoding='utf-8', errors='replace', max_num_fields=None): + encoding='utf-8', errors='replace', max_num_fields=None, separator='&'): """Parse a query given as a string argument. Arguments: @@ -710,19 +727,25 @@ def parse_qsl(qs, keep_blank_values=False, strict_parsing=False, max_num_fields: int. If set, then throws a ValueError if there are more than n fields read by parse_qsl(). + separator: str. The symbol to use for separating the query arguments. + Defaults to &. + Returns a list, as G-d intended. """ qs, _coerce_result = _coerce_args(qs) + if not separator or (not isinstance(separator, (str, bytes))): + raise ValueError("Separator must be of type string or bytes.") + # If max_num_fields is defined then check that the number of fields # is less than max_num_fields. This prevents a memory exhaustion DOS # attack via post bodies with many fields. if max_num_fields is not None: - num_fields = 1 + qs.count('&') + qs.count(';') + num_fields = 1 + qs.count(separator) if max_num_fields < num_fields: raise ValueError('Max number of fields exceeded') - pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')] + pairs = [s1 for s1 in qs.split(separator)] r = [] for name_value in pairs: if not name_value and not strict_parsing: diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index e44073886a6cd94be262291b1c02f8504134a2ee..57d991465a5b0c128a9e885fac389ea3576e4d67 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -163,18 +163,10 @@ def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, The *cadefault* parameter is ignored. - This function always returns an object which can work as a context - manager and has methods such as - * geturl() - return the URL of the resource retrieved, commonly used to - determine if a redirect was followed - - * info() - return the meta-information of the page, such as headers, in the - form of an email.message_from_string() instance (see Quick Reference to - HTTP Headers) - - * getcode() - return the HTTP status code of the response. Raises URLError - on errors. + This function always returns an object which can work as a + context manager and has the properties url, headers, and status. + See urllib.response.addinfourl for more detail on these properties. For HTTP and HTTPS URLs, this function returns a http.client.HTTPResponse object slightly modified. In addition to the three new methods above, the @@ -779,7 +771,11 @@ def _parse_proxy(proxy): raise ValueError("proxy URL with no authority: %r" % proxy) # We have an authority, so for RFC 3986-compliant URLs (by ss 3. # and 3.3.), path is empty or starts with '/' - end = r_scheme.find("/", 2) + if '@' in r_scheme: + host_separator = r_scheme.find('@') + end = r_scheme.find("/", host_separator) + else: + end = r_scheme.find("/", 2) if end == -1: end = None authority = r_scheme[2:end] @@ -1819,7 +1815,7 @@ def retrieve(self, url, filename=None, reporthook=None, data=None): hdrs = fp.info() fp.close() return url2pathname(_splithost(url1)[1]), hdrs - except OSError as msg: + except OSError: pass fp = self.open(url, data) try: @@ -2604,6 +2600,11 @@ def ip2num(ipAddr): mask = 8 * (m.group(1).count('.') + 1) else: mask = int(mask[1:]) + + if mask < 0 or mask > 32: + # System libraries ignore invalid prefix lengths + continue + mask = 32 - mask if (hostIP >> mask) == (base >> mask): diff --git a/Lib/urllib/response.py b/Lib/urllib/response.py index 4778118dbb17681dd3b84f67cbe1687a48d39dc9..5a2c3cc78c395d57de3fbadf7d75b96035b785b6 100644 --- a/Lib/urllib/response.py +++ b/Lib/urllib/response.py @@ -73,6 +73,10 @@ def __init__(self, fp, headers, url, code=None): self.url = url self.code = code + @property + def status(self): + return self.code + def getcode(self): return self.code diff --git a/Lib/uuid.py b/Lib/uuid.py index 188e16ba14e3723062fa7106983a634f9eaa7cca..5ae0a3e5fa449d99bb5774f05fdde4817aea70c8 100644 --- a/Lib/uuid.py +++ b/Lib/uuid.py @@ -45,7 +45,6 @@ """ import os -import platform import sys from enum import Enum @@ -54,10 +53,19 @@ __author__ = 'Ka-Ping Yee ' # The recognized platforms - known behaviors -_AIX = platform.system() == 'AIX' -_DARWIN = platform.system() == 'Darwin' -_LINUX = platform.system() == 'Linux' -_WINDOWS = platform.system() == 'Windows' +if sys.platform in ('win32', 'darwin'): + _AIX = _LINUX = False +else: + import platform + _platform_system = platform.system() + _AIX = _platform_system == 'AIX' + _LINUX = _platform_system == 'Linux' + +_MAC_DELIM = b':' +_MAC_OMITS_LEADING_ZEROES = False +if _AIX: + _MAC_DELIM = b'.' + _MAC_OMITS_LEADING_ZEROES = True RESERVED_NCS, RFC_4122, RESERVED_MICROSOFT, RESERVED_FUTURE = [ 'reserved for NCS compatibility', 'specified in RFC 4122', @@ -347,24 +355,32 @@ def version(self): if self.variant == RFC_4122: return int((self.int >> 76) & 0xf) -def _popen(command, *args): - import os, shutil, subprocess - executable = shutil.which(command) - if executable is None: - path = os.pathsep.join(('/sbin', '/usr/sbin')) - executable = shutil.which(command, path=path) + +def _get_command_stdout(command, *args): + import io, os, shutil, subprocess + + try: + path_dirs = os.environ.get('PATH', os.defpath).split(os.pathsep) + path_dirs.extend(['/sbin', '/usr/sbin']) + executable = shutil.which(command, path=os.pathsep.join(path_dirs)) if executable is None: return None - # LC_ALL=C to ensure English output, stderr=DEVNULL to prevent output - # on stderr (Note: we don't have an example where the words we search - # for are actually localized, but in theory some system could do so.) - env = dict(os.environ) - env['LC_ALL'] = 'C' - proc = subprocess.Popen((executable,) + args, - stdout=subprocess.PIPE, - stderr=subprocess.DEVNULL, - env=env) - return proc + # LC_ALL=C to ensure English output, stderr=DEVNULL to prevent output + # on stderr (Note: we don't have an example where the words we search + # for are actually localized, but in theory some system could do so.) + env = dict(os.environ) + env['LC_ALL'] = 'C' + proc = subprocess.Popen((executable,) + args, + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL, + env=env) + if not proc: + return None + stdout, stderr = proc.communicate() + return io.BytesIO(stdout) + except (OSError, subprocess.SubprocessError): + return None + # For MAC (a.k.a. IEEE 802, or EUI-48) addresses, the second least significant # bit of the first octet signifies whether the MAC address is universally (0) @@ -384,40 +400,114 @@ def _popen(command, *args): def _is_universal(mac): return not (mac & (1 << 41)) -def _find_mac(command, args, hw_identifiers, get_index): + +def _find_mac_near_keyword(command, args, keywords, get_word_index): + """Searches a command's output for a MAC address near a keyword. + + Each line of words in the output is case-insensitively searched for + any of the given keywords. Upon a match, get_word_index is invoked + to pick a word from the line, given the index of the match. For + example, lambda i: 0 would get the first word on the line, while + lambda i: i - 1 would get the word preceding the keyword. + """ + stdout = _get_command_stdout(command, args) + if stdout is None: + return None + first_local_mac = None - try: - proc = _popen(command, *args.split()) - if not proc: - return None - with proc: - for line in proc.stdout: - words = line.lower().rstrip().split() - for i in range(len(words)): - if words[i] in hw_identifiers: - try: - word = words[get_index(i)] - mac = int(word.replace(b':', b''), 16) - if _is_universal(mac): - return mac - first_local_mac = first_local_mac or mac - except (ValueError, IndexError): - # Virtual interfaces, such as those provided by - # VPNs, do not have a colon-delimited MAC address - # as expected, but a 16-byte HWAddr separated by - # dashes. These should be ignored in favor of a - # real MAC address - pass - except OSError: - pass + for line in stdout: + words = line.lower().rstrip().split() + for i in range(len(words)): + if words[i] in keywords: + try: + word = words[get_word_index(i)] + mac = int(word.replace(_MAC_DELIM, b''), 16) + except (ValueError, IndexError): + # Virtual interfaces, such as those provided by + # VPNs, do not have a colon-delimited MAC address + # as expected, but a 16-byte HWAddr separated by + # dashes. These should be ignored in favor of a + # real MAC address + pass + else: + if _is_universal(mac): + return mac + first_local_mac = first_local_mac or mac return first_local_mac or None + +def _parse_mac(word): + # Accept 'HH:HH:HH:HH:HH:HH' MAC address (ex: '52:54:00:9d:0e:67'), + # but reject IPv6 address (ex: 'fe80::5054:ff:fe9' or '123:2:3:4:5:6:7:8'). + # + # Virtual interfaces, such as those provided by VPNs, do not have a + # colon-delimited MAC address as expected, but a 16-byte HWAddr separated + # by dashes. These should be ignored in favor of a real MAC address + parts = word.split(_MAC_DELIM) + if len(parts) != 6: + return + if _MAC_OMITS_LEADING_ZEROES: + # (Only) on AIX the macaddr value given is not prefixed by 0, e.g. + # en0 1500 link#2 fa.bc.de.f7.62.4 110854824 0 160133733 0 0 + # not + # en0 1500 link#2 fa.bc.de.f7.62.04 110854824 0 160133733 0 0 + if not all(1 <= len(part) <= 2 for part in parts): + return + hexstr = b''.join(part.rjust(2, b'0') for part in parts) + else: + if not all(len(part) == 2 for part in parts): + return + hexstr = b''.join(parts) + try: + return int(hexstr, 16) + except ValueError: + return + + +def _find_mac_under_heading(command, args, heading): + """Looks for a MAC address under a heading in a command's output. + + The first line of words in the output is searched for the given + heading. Words at the same word index as the heading in subsequent + lines are then examined to see if they look like MAC addresses. + """ + stdout = _get_command_stdout(command, args) + if stdout is None: + return None + + keywords = stdout.readline().rstrip().split() + try: + column_index = keywords.index(heading) + except ValueError: + return None + + first_local_mac = None + for line in stdout: + words = line.rstrip().split() + try: + word = words[column_index] + except IndexError: + continue + + mac = _parse_mac(word) + if mac is None: + continue + if _is_universal(mac): + return mac + if first_local_mac is None: + first_local_mac = mac + + return first_local_mac + + +# The following functions call external programs to 'get' a macaddr value to +# be used as basis for an uuid def _ifconfig_getnode(): """Get the hardware address on Unix by running ifconfig.""" # This works on Linux ('' or '-a'), Tru64 ('-av'), but not all Unixes. keywords = (b'hwaddr', b'ether', b'address:', b'lladdr') for args in ('', '-a', '-av'): - mac = _find_mac('ifconfig', args, keywords, lambda i: i+1) + mac = _find_mac_near_keyword('ifconfig', args, keywords, lambda i: i+1) if mac: return mac return None @@ -425,7 +515,7 @@ def _ifconfig_getnode(): def _ip_getnode(): """Get the hardware address on Unix by running ip.""" # This works on Linux with iproute2. - mac = _find_mac('ip', 'link', [b'link/ether'], lambda i: i+1) + mac = _find_mac_near_keyword('ip', 'link', [b'link/ether'], lambda i: i+1) if mac: return mac return None @@ -439,17 +529,17 @@ def _arp_getnode(): return None # Try getting the MAC addr from arp based on our IP address (Solaris). - mac = _find_mac('arp', '-an', [os.fsencode(ip_addr)], lambda i: -1) + mac = _find_mac_near_keyword('arp', '-an', [os.fsencode(ip_addr)], lambda i: -1) if mac: return mac # This works on OpenBSD - mac = _find_mac('arp', '-an', [os.fsencode(ip_addr)], lambda i: i+1) + mac = _find_mac_near_keyword('arp', '-an', [os.fsencode(ip_addr)], lambda i: i+1) if mac: return mac # This works on Linux, FreeBSD and NetBSD - mac = _find_mac('arp', '-an', [os.fsencode('(%s)' % ip_addr)], + mac = _find_mac_near_keyword('arp', '-an', [os.fsencode('(%s)' % ip_addr)], lambda i: i+2) # Return None instead of 0. if mac: @@ -459,210 +549,52 @@ def _arp_getnode(): def _lanscan_getnode(): """Get the hardware address on Unix by running lanscan.""" # This might work on HP-UX. - return _find_mac('lanscan', '-ai', [b'lan0'], lambda i: 0) + return _find_mac_near_keyword('lanscan', '-ai', [b'lan0'], lambda i: 0) def _netstat_getnode(): """Get the hardware address on Unix by running netstat.""" - # This might work on AIX, Tru64 UNIX. - first_local_mac = None - try: - proc = _popen('netstat', '-ia') - if not proc: - return None - with proc: - words = proc.stdout.readline().rstrip().split() - try: - i = words.index(b'Address') - except ValueError: - return None - for line in proc.stdout: - try: - words = line.rstrip().split() - word = words[i] - if len(word) == 17 and word.count(b':') == 5: - mac = int(word.replace(b':', b''), 16) - if _is_universal(mac): - return mac - first_local_mac = first_local_mac or mac - except (ValueError, IndexError): - pass - except OSError: - pass - return first_local_mac or None + # This works on AIX and might work on Tru64 UNIX. + return _find_mac_under_heading('netstat', '-ian', b'Address') def _ipconfig_getnode(): - """Get the hardware address on Windows by running ipconfig.exe.""" - import os, re, subprocess - first_local_mac = None - dirs = ['', r'c:\windows\system32', r'c:\winnt\system32'] - try: - import ctypes - buffer = ctypes.create_string_buffer(300) - ctypes.windll.kernel32.GetSystemDirectoryA(buffer, 300) - dirs.insert(0, buffer.value.decode('mbcs')) - except: - pass - for dir in dirs: - try: - proc = subprocess.Popen([os.path.join(dir, 'ipconfig'), '/all'], - stdout=subprocess.PIPE, - encoding="oem") - except OSError: - continue - with proc: - for line in proc.stdout: - value = line.split(':')[-1].strip().lower() - if re.fullmatch('(?:[0-9a-f][0-9a-f]-){5}[0-9a-f][0-9a-f]', value): - mac = int(value.replace('-', ''), 16) - if _is_universal(mac): - return mac - first_local_mac = first_local_mac or mac - return first_local_mac or None + """[DEPRECATED] Get the hardware address on Windows.""" + # bpo-40501: UuidCreateSequential() is now the only supported approach + return _windll_getnode() def _netbios_getnode(): - """Get the hardware address on Windows using NetBIOS calls. - See http://support.microsoft.com/kb/118623 for details.""" - import win32wnet, netbios - first_local_mac = None - ncb = netbios.NCB() - ncb.Command = netbios.NCBENUM - ncb.Buffer = adapters = netbios.LANA_ENUM() - adapters._pack() - if win32wnet.Netbios(ncb) != 0: - return None - adapters._unpack() - for i in range(adapters.length): - ncb.Reset() - ncb.Command = netbios.NCBRESET - ncb.Lana_num = ord(adapters.lana[i]) - if win32wnet.Netbios(ncb) != 0: - continue - ncb.Reset() - ncb.Command = netbios.NCBASTAT - ncb.Lana_num = ord(adapters.lana[i]) - ncb.Callname = '*'.ljust(16) - ncb.Buffer = status = netbios.ADAPTER_STATUS() - if win32wnet.Netbios(ncb) != 0: - continue - status._unpack() - bytes = status.adapter_address[:6] - if len(bytes) != 6: - continue - mac = int.from_bytes(bytes, 'big') - if _is_universal(mac): - return mac - first_local_mac = first_local_mac or mac - return first_local_mac or None + """[DEPRECATED] Get the hardware address on Windows.""" + # bpo-40501: UuidCreateSequential() is now the only supported approach + return _windll_getnode() -_generate_time_safe = _UuidCreate = None -_has_uuid_generate_time_safe = None - # Import optional C extension at toplevel, to help disabling it when testing try: import _uuid + _generate_time_safe = getattr(_uuid, "generate_time_safe", None) + _UuidCreate = getattr(_uuid, "UuidCreate", None) + _has_uuid_generate_time_safe = _uuid.has_uuid_generate_time_safe except ImportError: _uuid = None + _generate_time_safe = None + _UuidCreate = None + _has_uuid_generate_time_safe = None def _load_system_functions(): - """ - Try to load platform-specific functions for generating uuids. - """ - global _generate_time_safe, _UuidCreate, _has_uuid_generate_time_safe - - if _has_uuid_generate_time_safe is not None: - return - - _has_uuid_generate_time_safe = False - - if sys.platform == "darwin" and int(os.uname().release.split('.')[0]) < 9: - # The uuid_generate_* functions are broken on MacOS X 10.5, as noted - # in issue #8621 the function generates the same sequence of values - # in the parent process and all children created using fork (unless - # those children use exec as well). - # - # Assume that the uuid_generate functions are broken from 10.5 onward, - # the test can be adjusted when a later version is fixed. - pass - elif _uuid is not None: - _generate_time_safe = _uuid.generate_time_safe - _has_uuid_generate_time_safe = _uuid.has_uuid_generate_time_safe - return - - try: - # If we couldn't find an extension module, try ctypes to find - # system routines for UUID generation. - # Thanks to Thomas Heller for ctypes and for his help with its use here. - import ctypes - import ctypes.util - - # The uuid_generate_* routines are provided by libuuid on at least - # Linux and FreeBSD, and provided by libc on Mac OS X. - _libnames = ['uuid'] - if not sys.platform.startswith('win'): - _libnames.append('c') - for libname in _libnames: - try: - lib = ctypes.CDLL(ctypes.util.find_library(libname)) - except Exception: # pragma: nocover - continue - # Try to find the safe variety first. - if hasattr(lib, 'uuid_generate_time_safe'): - _uuid_generate_time_safe = lib.uuid_generate_time_safe - # int uuid_generate_time_safe(uuid_t out); - def _generate_time_safe(): - _buffer = ctypes.create_string_buffer(16) - res = _uuid_generate_time_safe(_buffer) - return bytes(_buffer.raw), res - _has_uuid_generate_time_safe = True - break - - elif hasattr(lib, 'uuid_generate_time'): # pragma: nocover - _uuid_generate_time = lib.uuid_generate_time - # void uuid_generate_time(uuid_t out); - _uuid_generate_time.restype = None - def _generate_time_safe(): - _buffer = ctypes.create_string_buffer(16) - _uuid_generate_time(_buffer) - return bytes(_buffer.raw), None - break - - # On Windows prior to 2000, UuidCreate gives a UUID containing the - # hardware address. On Windows 2000 and later, UuidCreate makes a - # random UUID and UuidCreateSequential gives a UUID containing the - # hardware address. These routines are provided by the RPC runtime. - # NOTE: at least on Tim's WinXP Pro SP2 desktop box, while the last - # 6 bytes returned by UuidCreateSequential are fixed, they don't appear - # to bear any relationship to the MAC address of any network device - # on the box. - try: - lib = ctypes.windll.rpcrt4 - except: - lib = None - _UuidCreate = getattr(lib, 'UuidCreateSequential', - getattr(lib, 'UuidCreate', None)) - - except Exception as exc: - import warnings - warnings.warn(f"Could not find fallback ctypes uuid functions: {exc}", - ImportWarning) + """[DEPRECATED] Platform-specific functions loaded at import time""" def _unix_getnode(): - """Get the hardware address on Unix using the _uuid extension module - or ctypes.""" - _load_system_functions() - uuid_time, _ = _generate_time_safe() - return UUID(bytes=uuid_time).node + """Get the hardware address on Unix using the _uuid extension module.""" + if _generate_time_safe: + uuid_time, _ = _generate_time_safe() + return UUID(bytes=uuid_time).node def _windll_getnode(): - """Get the hardware address on Windows using ctypes.""" - import ctypes - _load_system_functions() - _buffer = ctypes.create_string_buffer(16) - if _UuidCreate(_buffer) == 0: - return UUID(bytes=bytes_(_buffer.raw)).node + """Get the hardware address on Windows using the _uuid extension module.""" + if _UuidCreate: + uuid_bytes = _UuidCreate() + return UUID(bytes_le=uuid_bytes).node def _random_getnode(): """Get a random node ID.""" @@ -688,10 +620,11 @@ def _random_getnode(): # @unittest.skipUnless(_uuid._ifconfig_getnode in _uuid._GETTERS, ...) if _LINUX: _OS_GETTERS = [_ip_getnode, _ifconfig_getnode] -elif _DARWIN: +elif sys.platform == 'darwin': _OS_GETTERS = [_ifconfig_getnode, _arp_getnode, _netstat_getnode] -elif _WINDOWS: - _OS_GETTERS = [_netbios_getnode, _ipconfig_getnode] +elif sys.platform == 'win32': + # bpo-40201: _windll_getnode will always succeed, so these are not needed + _OS_GETTERS = [] elif _AIX: _OS_GETTERS = [_netstat_getnode] else: @@ -706,7 +639,7 @@ def _random_getnode(): _node = None -def getnode(*, getters=None): +def getnode(): """Get the hardware address as a 48-bit positive integer. The first time this runs, it may launch a separate program, which could @@ -738,7 +671,6 @@ def uuid1(node=None, clock_seq=None): # When the system provides a version-1 UUID generator, use it (but don't # use UuidCreate here because its UUIDs don't conform to RFC 4122). - _load_system_functions() if _generate_time_safe is not None and node is clock_seq is None: uuid_time, safely_generated = _generate_time_safe() try: @@ -772,8 +704,11 @@ def uuid1(node=None, clock_seq=None): def uuid3(namespace, name): """Generate a UUID from the MD5 hash of a namespace UUID and a name.""" from hashlib import md5 - hash = md5(namespace.bytes + bytes(name, "utf-8")).digest() - return UUID(bytes=hash[:16], version=3) + digest = md5( + namespace.bytes + bytes(name, "utf-8"), + usedforsecurity=False + ).digest() + return UUID(bytes=digest[:16], version=3) def uuid4(): """Generate a random UUID.""" diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index caa7285b8c8979098cd3703ec828d4e075fe8586..8009deb3ea700341bb65e1a84a7838bd80dad852 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -12,6 +12,8 @@ import sysconfig import types + +CORE_VENV_DEPS = ('pip', 'setuptools') logger = logging.getLogger(__name__) @@ -38,16 +40,21 @@ class EnvBuilder: :param with_pip: If True, ensure pip is installed in the virtual environment :param prompt: Alternative terminal prefix for the environment. + :param upgrade_deps: Update the base venv modules to the latest on PyPI """ def __init__(self, system_site_packages=False, clear=False, - symlinks=False, upgrade=False, with_pip=False, prompt=None): + symlinks=False, upgrade=False, with_pip=False, prompt=None, + upgrade_deps=False): self.system_site_packages = system_site_packages self.clear = clear self.symlinks = symlinks self.upgrade = upgrade self.with_pip = with_pip + if prompt == '.': # see bpo-38901 + prompt = os.path.basename(os.getcwd()) self.prompt = prompt + self.upgrade_deps = upgrade_deps def create(self, env_dir): """ @@ -74,6 +81,8 @@ def create(self, env_dir): # restore it and rewrite the configuration self.system_site_packages = True self.create_configuration(context) + if self.upgrade_deps: + self.upgrade_dependencies(context) def clear_directory(self, path): for fn in os.listdir(path): @@ -234,7 +243,7 @@ def setup_python(self, context): copier(context.executable, path) if not os.path.islink(path): os.chmod(path, 0o755) - for suffix in ('python', 'python3'): + for suffix in ('python', 'python3', f'python3.{sys.version_info[1]}'): path = os.path.join(binpath, suffix) if not os.path.exists(path): # Issue 18807: make copies if @@ -381,13 +390,25 @@ def install_scripts(self, context, path): f.write(data) shutil.copymode(srcfile, dstfile) + def upgrade_dependencies(self, context): + logger.debug( + f'Upgrading {CORE_VENV_DEPS} packages in {context.bin_path}' + ) + if sys.platform == 'win32': + python_exe = os.path.join(context.bin_path, 'python.exe') + else: + python_exe = os.path.join(context.bin_path, 'python') + cmd = [python_exe, '-m', 'pip', 'install', '--upgrade'] + cmd.extend(CORE_VENV_DEPS) + subprocess.check_call(cmd) + def create(env_dir, system_site_packages=False, clear=False, - symlinks=False, with_pip=False, prompt=None): + symlinks=False, with_pip=False, prompt=None, upgrade_deps=False): """Create a virtual environment in a directory.""" builder = EnvBuilder(system_site_packages=system_site_packages, clear=clear, symlinks=symlinks, with_pip=with_pip, - prompt=prompt) + prompt=prompt, upgrade_deps=upgrade_deps) builder.create(env_dir) def main(args=None): @@ -450,6 +471,11 @@ def main(args=None): parser.add_argument('--prompt', help='Provides an alternative prompt prefix for ' 'this environment.') + parser.add_argument('--upgrade-deps', default=False, action='store_true', + dest='upgrade_deps', + help='Upgrade core dependencies: {} to the latest ' + 'version in PyPI'.format( + ' '.join(CORE_VENV_DEPS))) options = parser.parse_args(args) if options.upgrade and options.clear: raise ValueError('you cannot supply --upgrade and --clear together.') @@ -458,7 +484,8 @@ def main(args=None): symlinks=options.symlinks, upgrade=options.upgrade, with_pip=options.with_pip, - prompt=options.prompt) + prompt=options.prompt, + upgrade_deps=options.upgrade_deps) for d in options.dirs: builder.create(d) diff --git a/Lib/venv/scripts/common/activate b/Lib/venv/scripts/common/activate index b9d498fb2ef04f7d4a0474d2392086ce4f754477..45af3536aa191d0abae0c775d1b66c2fcba13786 100644 --- a/Lib/venv/scripts/common/activate +++ b/Lib/venv/scripts/common/activate @@ -18,7 +18,7 @@ deactivate () { # be called to get it to forget past commands. Without forgetting # past commands the $PATH changes we made may not be respected if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r + hash -r 2> /dev/null fi if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then @@ -54,17 +54,7 @@ fi if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then _OLD_VIRTUAL_PS1="${PS1:-}" - if [ "x__VENV_PROMPT__" != x ] ; then - PS1="__VENV_PROMPT__${PS1:-}" - else - if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then - # special case for Aspen magic directories - # see http://www.zetadev.com/software/aspen/ - PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1" - else - PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1" - fi - fi + PS1="__VENV_PROMPT__${PS1:-}" export PS1 fi @@ -72,5 +62,5 @@ fi # be called to get it to forget past commands. Without forgetting # past commands the $PATH changes we made may not be respected if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r + hash -r 2> /dev/null fi diff --git a/Lib/venv/scripts/posix/activate.csh b/Lib/venv/scripts/posix/activate.csh index b0c7028a92955e811e5ae78802c8d7dc6aa98b22..68a0dc74e1a3c7a48bff0b4b871a4a087a3d2e68 100644 --- a/Lib/venv/scripts/posix/activate.csh +++ b/Lib/venv/scripts/posix/activate.csh @@ -17,19 +17,7 @@ setenv PATH "$VIRTUAL_ENV/__VENV_BIN_NAME__:$PATH" set _OLD_VIRTUAL_PROMPT="$prompt" if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then - if ("__VENV_NAME__" != "") then - set env_name = "__VENV_NAME__" - else - if (`basename "VIRTUAL_ENV"` == "__") then - # special case for Aspen magic directories - # see http://www.zetadev.com/software/aspen/ - set env_name = `basename \`dirname "$VIRTUAL_ENV"\`` - else - set env_name = `basename "$VIRTUAL_ENV"` - endif - endif - set prompt = "[$env_name] $prompt" - unset env_name + set prompt = "__VENV_PROMPT__$prompt" endif alias pydoc python -m pydoc diff --git a/Lib/venv/scripts/posix/activate.fish b/Lib/venv/scripts/posix/activate.fish index b40105825eadb4b8b2cff70b0cfbf7c696123218..54b9ea5676b66b46dd9ba75da71c20cb4f622433 100644 --- a/Lib/venv/scripts/posix/activate.fish +++ b/Lib/venv/scripts/posix/activate.fish @@ -1,7 +1,7 @@ -# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org) -# you cannot run it directly +# This file must be used with "source /bin/activate.fish" *from fish* +# (https://fishshell.com/); you cannot run it directly. -function deactivate -d "Exit virtualenv and return to normal shell environment" +function deactivate -d "Exit virtual environment and return to normal shell environment" # reset old environment variables if test -n "$_OLD_VIRTUAL_PATH" set -gx PATH $_OLD_VIRTUAL_PATH @@ -21,12 +21,12 @@ function deactivate -d "Exit virtualenv and return to normal shell environment" set -e VIRTUAL_ENV if test "$argv[1]" != "nondestructive" - # Self destruct! + # Self-destruct! functions -e deactivate end end -# unset irrelevant variables +# Unset irrelevant variables. deactivate nondestructive set -gx VIRTUAL_ENV "__VENV_DIR__" @@ -34,7 +34,7 @@ set -gx VIRTUAL_ENV "__VENV_DIR__" set -gx _OLD_VIRTUAL_PATH $PATH set -gx PATH "$VIRTUAL_ENV/__VENV_BIN_NAME__" $PATH -# unset PYTHONHOME if set +# Unset PYTHONHOME if set. if set -q PYTHONHOME set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME set -e PYTHONHOME @@ -43,31 +43,20 @@ end if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" # fish uses a function instead of an env var to generate the prompt. - # save the current fish_prompt function as the function _old_fish_prompt + # Save the current fish_prompt function as the function _old_fish_prompt. functions -c fish_prompt _old_fish_prompt - # with the original prompt function renamed, we can override with our own. + # With the original prompt function renamed, we can override with our own. function fish_prompt - # Save the return status of the last command + # Save the return status of the last command. set -l old_status $status - # Prompt override? - if test -n "__VENV_PROMPT__" - printf "%s%s" "__VENV_PROMPT__" (set_color normal) - else - # ...Otherwise, prepend env - set -l _checkbase (basename "$VIRTUAL_ENV") - if test $_checkbase = "__" - # special case for Aspen magic directories - # see http://www.zetadev.com/software/aspen/ - printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal) - else - printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal) - end - end + # Output the venv prompt; color taken from the blue of the Python logo. + printf "%s%s%s" (set_color 4B8BBE) "__VENV_PROMPT__" (set_color normal) # Restore the return status of the previous command. echo "exit $old_status" | . + # Output the original/"old" prompt. _old_fish_prompt end diff --git a/Lib/wave.py b/Lib/wave.py index 823f091deaaad9e1b7564014a79c12432fd41801..b7071198e6b8413cea89839a221f613779506714 100644 --- a/Lib/wave.py +++ b/Lib/wave.py @@ -71,9 +71,15 @@ is destroyed. """ +from chunk import Chunk +from collections import namedtuple +import audioop import builtins +import struct +import sys + -__all__ = ["open", "openfp", "Error", "Wave_read", "Wave_write"] +__all__ = ["open", "Error", "Wave_read", "Wave_write"] class Error(Exception): pass @@ -82,13 +88,6 @@ class Error(Exception): _array_fmts = None, 'b', 'h', None, 'i' -import audioop -import struct -import sys -from chunk import Chunk -from collections import namedtuple -import warnings - _wave_params = namedtuple('_wave_params', 'nchannels sampwidth framerate nframes comptype compname') @@ -512,8 +511,3 @@ def open(f, mode=None): return Wave_write(f) else: raise Error("mode must be 'r', 'rb', 'w', or 'wb'") - -def openfp(f, mode=None): - warnings.warn("wave.openfp is deprecated since Python 3.7. " - "Use wave.open instead.", DeprecationWarning, stacklevel=2) - return open(f, mode=mode) diff --git a/Lib/weakref.py b/Lib/weakref.py index 9d7008947f06d40b48a7d736f8231f41af3db409..5fa851dd6d771cded9eb7d1fac099e99d09c0ed9 100644 --- a/Lib/weakref.py +++ b/Lib/weakref.py @@ -33,6 +33,9 @@ "WeakSet", "WeakMethod", "finalize"] +_collections_abc.Set.register(WeakSet) +_collections_abc.MutableSet.register(WeakSet) + class WeakMethod(ref): """ A custom `weakref.ref` subclass which simulates a weak reference to @@ -75,14 +78,14 @@ def __eq__(self, other): if not self._alive or not other._alive: return self is other return ref.__eq__(self, other) and self._func_ref == other._func_ref - return False + return NotImplemented def __ne__(self, other): if isinstance(other, WeakMethod): if not self._alive or not other._alive: return self is not other return ref.__ne__(self, other) or self._func_ref != other._func_ref - return True + return NotImplemented __hash__ = ref.__hash__ @@ -307,6 +310,25 @@ def valuerefs(self): self._commit_removals() return list(self.data.values()) + def __ior__(self, other): + self.update(other) + return self + + def __or__(self, other): + if isinstance(other, _collections_abc.Mapping): + c = self.copy() + c.update(other) + return c + return NotImplemented + + def __ror__(self, other): + if isinstance(other, _collections_abc.Mapping): + c = self.__class__() + c.update(other) + c.update(self) + return c + return NotImplemented + class KeyedRef(ref): """Specialized reference that includes a key corresponding to the value. @@ -485,6 +507,25 @@ def update(self, dict=None, /, **kwargs): if len(kwargs): self.update(kwargs) + def __ior__(self, other): + self.update(other) + return self + + def __or__(self, other): + if isinstance(other, _collections_abc.Mapping): + c = self.copy() + c.update(other) + return c + return NotImplemented + + def __ror__(self, other): + if isinstance(other, _collections_abc.Mapping): + c = self.__class__() + c.update(other) + c.update(self) + return c + return NotImplemented + class finalize: """Class for finalization of weakrefable objects @@ -514,33 +555,7 @@ class finalize: class _Info: __slots__ = ("weakref", "func", "args", "kwargs", "atexit", "index") - def __init__(*args, **kwargs): - if len(args) >= 3: - self, obj, func, *args = args - elif not args: - raise TypeError("descriptor '__init__' of 'finalize' object " - "needs an argument") - else: - if 'func' not in kwargs: - raise TypeError('finalize expected at least 2 positional ' - 'arguments, got %d' % (len(args)-1)) - func = kwargs.pop('func') - if len(args) >= 2: - self, obj, *args = args - import warnings - warnings.warn("Passing 'func' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - else: - if 'obj' not in kwargs: - raise TypeError('finalize expected at least 2 positional ' - 'arguments, got %d' % (len(args)-1)) - obj = kwargs.pop('obj') - self, *args = args - import warnings - warnings.warn("Passing 'obj' as keyword argument is deprecated", - DeprecationWarning, stacklevel=2) - args = tuple(args) - + def __init__(self, obj, func, /, *args, **kwargs): if not self._registered_with_atexit: # We may register the exit function more than once because # of a thread race, but that is harmless @@ -556,7 +571,6 @@ def __init__(*args, **kwargs): info.index = next(self._index_iter) self._registry[self] = info finalize._dirty = True - __init__.__text_signature__ = '($self, obj, func, /, *args, **kwargs)' def __call__(self, _=None): """If alive then mark as dead and return func(*args, **kwargs); diff --git a/Lib/webbrowser.py b/Lib/webbrowser.py index cea91308ce1b30f324d3a71b921c81a3749e8f6e..6023c1e13841d2b21937bb285127df69ab2bd4c2 100755 --- a/Lib/webbrowser.py +++ b/Lib/webbrowser.py @@ -550,7 +550,7 @@ def register_standard_browsers(): cmd = "xdg-settings get default-web-browser".split() raw_result = subprocess.check_output(cmd, stderr=subprocess.DEVNULL) result = raw_result.decode().strip() - except (FileNotFoundError, subprocess.CalledProcessError, PermissionError) : + except (FileNotFoundError, subprocess.CalledProcessError, PermissionError, NotADirectoryError) : pass else: global _os_preferred_browser diff --git a/Lib/xml/dom/expatbuilder.py b/Lib/xml/dom/expatbuilder.py index 2bd835b035948d5e9b515c567b7cbdf323ecf97b..199c22d0af347e15bf53005f74b5359ce0f0e904 100644 --- a/Lib/xml/dom/expatbuilder.py +++ b/Lib/xml/dom/expatbuilder.py @@ -204,11 +204,11 @@ def parseFile(self, file): buffer = file.read(16*1024) if not buffer: break - parser.Parse(buffer, 0) + parser.Parse(buffer, False) if first_buffer and self.document.documentElement: self._setup_subset(buffer) first_buffer = False - parser.Parse("", True) + parser.Parse(b"", True) except ParseEscape: pass doc = self.document @@ -637,7 +637,7 @@ def parseString(self, string): nsattrs = self._getNSattrs() # get ns decls from node's ancestors document = _FRAGMENT_BUILDER_TEMPLATE % (ident, subset, nsattrs) try: - parser.Parse(document, 1) + parser.Parse(document, True) except: self.reset() raise @@ -697,7 +697,7 @@ def external_entity_ref_handler(self, context, base, systemId, publicId): self.fragment = self.document.createDocumentFragment() self.curNode = self.fragment try: - parser.Parse(self._source, 1) + parser.Parse(self._source, True) finally: self.curNode = old_cur_node self.document = old_document diff --git a/Lib/xml/dom/minidom.py b/Lib/xml/dom/minidom.py index 464420b76598e07ea38aabc9a22705c0650c7471..d09ef5e7d0371ae3e7c6d56fb89faf8bb401bc49 100644 --- a/Lib/xml/dom/minidom.py +++ b/Lib/xml/dom/minidom.py @@ -43,10 +43,11 @@ class Node(xml.dom.Node): def __bool__(self): return True - def toxml(self, encoding=None): - return self.toprettyxml("", "", encoding) + def toxml(self, encoding=None, standalone=None): + return self.toprettyxml("", "", encoding, standalone) - def toprettyxml(self, indent="\t", newl="\n", encoding=None): + def toprettyxml(self, indent="\t", newl="\n", encoding=None, + standalone=None): if encoding is None: writer = io.StringIO() else: @@ -56,7 +57,7 @@ def toprettyxml(self, indent="\t", newl="\n", encoding=None): newline='\n') if self.nodeType == Node.DOCUMENT_NODE: # Can pass encoding only to document, to put it into XML header - self.writexml(writer, "", indent, newl, encoding) + self.writexml(writer, "", indent, newl, encoding, standalone) else: self.writexml(writer, "", indent, newl) if encoding is None: @@ -718,6 +719,14 @@ def unlink(self): Node.unlink(self) def getAttribute(self, attname): + """Returns the value of the specified attribute. + + Returns the value of the element's attribute named attname as + a string. An empty string is returned if the element does not + have such an attribute. Note that an empty string may also be + returned as an explicitly given attribute value, use the + hasAttribute method to distinguish these two cases. + """ if self._attrs is None: return "" try: @@ -828,6 +837,11 @@ def removeAttributeNode(self, node): removeAttributeNodeNS = removeAttributeNode def hasAttribute(self, name): + """Checks whether the element has an attribute with the specified name. + + Returns True if the element has an attribute with the specified name. + Otherwise, returns False. + """ if self._attrs is None: return False return name in self._attrs @@ -838,6 +852,11 @@ def hasAttributeNS(self, namespaceURI, localName): return (namespaceURI, localName) in self._attrsNS def getElementsByTagName(self, name): + """Returns all descendant elements with the given tag name. + + Returns the list of all descendant elements (not direct children + only) with the specified tag name. + """ return _get_elements_by_tagName_helper(self, name, NodeList()) def getElementsByTagNameNS(self, namespaceURI, localName): @@ -848,6 +867,11 @@ def __repr__(self): return "" % (self.tagName, id(self)) def writexml(self, writer, indent="", addindent="", newl=""): + """Write an XML element to a file-like object + + Write the element to the writer object that must provide + a write method (e.g. a file or StringIO object). + """ # indent = current indentation # addindent = indentation to add to higher levels # newl = newline string @@ -1787,12 +1811,17 @@ def importNode(self, node, deep): raise xml.dom.NotSupportedErr("cannot import document type nodes") return _clone_node(node, deep, self) - def writexml(self, writer, indent="", addindent="", newl="", encoding=None): - if encoding is None: - writer.write(''+newl) - else: - writer.write('%s' % ( - encoding, newl)) + def writexml(self, writer, indent="", addindent="", newl="", encoding=None, + standalone=None): + declarations = [] + + if encoding: + declarations.append(f'encoding="{encoding}"') + if standalone is not None: + declarations.append(f'standalone="{"yes" if standalone else "no"}"') + + writer.write(f'{newl}') + for node in self.childNodes: node.writexml(writer, indent, addindent, newl) diff --git a/Lib/xml/dom/xmlbuilder.py b/Lib/xml/dom/xmlbuilder.py index 213ab14551c67ec11a08a98793c984eb6b732bfb..8a200263497b8927e7630ec5d8c14cfd8d8f5a19 100644 --- a/Lib/xml/dom/xmlbuilder.py +++ b/Lib/xml/dom/xmlbuilder.py @@ -1,7 +1,6 @@ """Implementation of the DOM Level 3 'LS-Load' feature.""" import copy -import warnings import xml.dom from xml.dom.NodeFilter import NodeFilter diff --git a/Lib/xml/etree/ElementInclude.py b/Lib/xml/etree/ElementInclude.py index 963470e3b15c71ff49265a3592900c4ebfbe261b..5303062716c47aa7739f78e2df2de799ab54ba37 100644 --- a/Lib/xml/etree/ElementInclude.py +++ b/Lib/xml/etree/ElementInclude.py @@ -50,18 +50,28 @@ import copy from . import ElementTree +from urllib.parse import urljoin XINCLUDE = "{http://www.w3.org/2001/XInclude}" XINCLUDE_INCLUDE = XINCLUDE + "include" XINCLUDE_FALLBACK = XINCLUDE + "fallback" +# For security reasons, the inclusion depth is limited to this read-only value by default. +DEFAULT_MAX_INCLUSION_DEPTH = 6 + + ## # Fatal include error. class FatalIncludeError(SyntaxError): pass + +class LimitedRecursiveIncludeError(FatalIncludeError): + pass + + ## # Default loader. This loader reads an included resource from disk. # @@ -92,13 +102,33 @@ def default_loader(href, parse, encoding=None): # @param loader Optional resource loader. If omitted, it defaults # to {@link default_loader}. If given, it should be a callable # that implements the same interface as default_loader. +# @param base_url The base URL of the original file, to resolve +# relative include file references. +# @param max_depth The maximum number of recursive inclusions. +# Limited to reduce the risk of malicious content explosion. +# Pass a negative value to disable the limitation. +# @throws LimitedRecursiveIncludeError If the {@link max_depth} was exceeded. # @throws FatalIncludeError If the function fails to include a given # resource, or if the tree contains malformed XInclude elements. -# @throws OSError If the function fails to load a given resource. +# @throws IOError If the function fails to load a given resource. +# @returns the node or its replacement if it was an XInclude node -def include(elem, loader=None): +def include(elem, loader=None, base_url=None, + max_depth=DEFAULT_MAX_INCLUSION_DEPTH): + if max_depth is None: + max_depth = -1 + elif max_depth < 0: + raise ValueError("expected non-negative depth or None for 'max_depth', got %r" % max_depth) + + if hasattr(elem, 'getroot'): + elem = elem.getroot() if loader is None: loader = default_loader + + _include(elem, loader, base_url, max_depth, set()) + + +def _include(elem, loader, base_url, max_depth, _parent_hrefs): # look for xinclude elements i = 0 while i < len(elem): @@ -106,14 +136,24 @@ def include(elem, loader=None): if e.tag == XINCLUDE_INCLUDE: # process xinclude directive href = e.get("href") + if base_url: + href = urljoin(base_url, href) parse = e.get("parse", "xml") if parse == "xml": + if href in _parent_hrefs: + raise FatalIncludeError("recursive include of %s" % href) + if max_depth == 0: + raise LimitedRecursiveIncludeError( + "maximum xinclude depth reached when including file %s" % href) + _parent_hrefs.add(href) node = loader(href, parse) if node is None: raise FatalIncludeError( "cannot load %r as %r" % (href, parse) ) - node = copy.copy(node) + node = copy.copy(node) # FIXME: this makes little sense with recursive includes + _include(node, loader, href, max_depth - 1, _parent_hrefs) + _parent_hrefs.remove(href) if e.tail: node.tail = (node.tail or "") + e.tail elem[i] = node @@ -123,11 +163,13 @@ def include(elem, loader=None): raise FatalIncludeError( "cannot load %r as %r" % (href, parse) ) + if e.tail: + text += e.tail if i: node = elem[i-1] - node.tail = (node.tail or "") + text + (e.tail or "") + node.tail = (node.tail or "") + text else: - elem.text = (elem.text or "") + text + (e.tail or "") + elem.text = (elem.text or "") + text del elem[i] continue else: @@ -139,5 +181,5 @@ def include(elem, loader=None): "xi:fallback tag must be child of xi:include (%r)" % e.tag ) else: - include(e, loader) - i = i + 1 + _include(e, loader, base_url, max_depth, _parent_hrefs) + i += 1 diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py index 645e999a0be6ca3c0bc4d59aa96411110a26b189..7a269001d6e18f60790f5565d69b301622139469 100644 --- a/Lib/xml/etree/ElementTree.py +++ b/Lib/xml/etree/ElementTree.py @@ -76,7 +76,7 @@ "dump", "Element", "ElementTree", "fromstring", "fromstringlist", - "iselement", "iterparse", + "indent", "iselement", "iterparse", "parse", "ParseError", "PI", "ProcessingInstruction", "QName", @@ -195,6 +195,13 @@ def copy(self): original tree. """ + warnings.warn( + "elem.copy() is deprecated. Use copy.copy(elem) instead.", + DeprecationWarning + ) + return self.__copy__() + + def __copy__(self): elem = self.makeelement(self.tag, self.attrib) elem.text = self.text elem.tail = self.tail @@ -273,19 +280,6 @@ def remove(self, subelement): # assert iselement(element) self._children.remove(subelement) - def getchildren(self): - """(Deprecated) Return all subelements. - - Elements are returned in document order. - - """ - warnings.warn( - "This method will be removed in future versions. " - "Use 'list(elem)' or iteration over elem instead.", - DeprecationWarning, stacklevel=2 - ) - return self._children - def find(self, path, namespaces=None): """Find first matching element by tag name or path. @@ -409,15 +403,6 @@ def iter(self, tag=None): for e in self._children: yield from e.iter(tag) - # compatibility - def getiterator(self, tag=None): - warnings.warn( - "This method will be removed in future versions. " - "Use 'elem.iter()' or 'list(elem.iter())' instead.", - DeprecationWarning, stacklevel=2 - ) - return list(self.iter(tag)) - def itertext(self): """Create text iterator. @@ -617,15 +602,6 @@ def iter(self, tag=None): # assert self._root is not None return self._root.iter(tag) - # compatibility - def getiterator(self, tag=None): - warnings.warn( - "This method will be removed in future versions. " - "Use 'tree.iter()' or 'list(tree.iter())' instead.", - DeprecationWarning, stacklevel=2 - ) - return list(self.iter(tag)) - def find(self, path, namespaces=None): """Find first matching element by tag name or path. @@ -1081,15 +1057,15 @@ def _escape_attrib(text): text = text.replace(">", ">") if "\"" in text: text = text.replace("\"", """) - # The following business with carriage returns is to satisfy - # Section 2.11 of the XML specification, stating that - # CR or CR LN should be replaced with just LN + # Although section 2.11 of the XML specification states that CR or + # CR LN should be replaced with just LN, it applies only to EOLNs + # which take part of organizing file into lines. Within attributes, + # we are replacing these with entity numbers, so they do not count. # http://www.w3.org/TR/REC-xml/#sec-line-ends - if "\r\n" in text: - text = text.replace("\r\n", "\n") + # The current solution, contained in following six lines, was + # discussed in issue 17582 and 39011. if "\r" in text: - text = text.replace("\r", "\n") - #The following four lines are issue 17582 + text = text.replace("\r", " ") if "\n" in text: text = text.replace("\n", " ") if "\t" in text: @@ -1185,6 +1161,57 @@ def dump(elem): if not tail or tail[-1] != "\n": sys.stdout.write("\n") + +def indent(tree, space=" ", level=0): + """Indent an XML document by inserting newlines and indentation space + after elements. + + *tree* is the ElementTree or Element to modify. The (root) element + itself will not be changed, but the tail text of all elements in its + subtree will be adapted. + + *space* is the whitespace to insert for each indentation level, two + space characters by default. + + *level* is the initial indentation level. Setting this to a higher + value than 0 can be used for indenting subtrees that are more deeply + nested inside of a document. + """ + if isinstance(tree, ElementTree): + tree = tree.getroot() + if level < 0: + raise ValueError(f"Initial indentation level must be >= 0, got {level}") + if not len(tree): + return + + # Reduce the memory consumption by reusing indentation strings. + indentations = ["\n" + level * space] + + def _indent_children(elem, level): + # Start a new indentation level for the first child. + child_level = level + 1 + try: + child_indentation = indentations[child_level] + except IndexError: + child_indentation = indentations[level] + space + indentations.append(child_indentation) + + if not elem.text or not elem.text.strip(): + elem.text = child_indentation + + for child in elem: + if len(child): + _indent_children(child, child_level) + if not child.tail or not child.tail.strip(): + child.tail = child_indentation + + # Dedent after the last child by overwriting the previous indentation. + if not child.tail.strip(): + child.tail = indentations[level] + + _indent_children(tree, 0) + + # -------------------------------------------------------------------- # parsing @@ -1690,14 +1717,14 @@ def _default(self, text): def feed(self, data): """Feed encoded data to parser.""" try: - self.parser.Parse(data, 0) + self.parser.Parse(data, False) except self._error as v: self._raiseerror(v) def close(self): """Finish feeding data to parser and return element structure.""" try: - self.parser.Parse("", 1) # end of data + self.parser.Parse(b"", True) # end of data except self._error as v: self._raiseerror(v) try: @@ -1849,6 +1876,11 @@ def _qname(self, qname, uri=None): self._declared_ns_stack[-1].append((uri, prefix)) return f'{prefix}:{tag}' if prefix else tag, tag, uri + if not uri: + # As soon as a default namespace is defined, + # anything that has no namespace (and thus, no prefix) goes there. + return tag, tag, uri + raise ValueError(f'Namespace "{uri}" is not declared in scope') def data(self, data): diff --git a/Lib/xml/sax/__init__.py b/Lib/xml/sax/__init__.py index a0f5d40b2000ce4089fd1654d304777fe5a81b01..17b75879ebaafad86c812bee53b4b24e01c18802 100644 --- a/Lib/xml/sax/__init__.py +++ b/Lib/xml/sax/__init__.py @@ -78,7 +78,7 @@ def make_parser(parser_list=()): for parser_name in list(parser_list) + default_parser_list: try: return _create_parser(parser_name) - except ImportError as e: + except ImportError: import sys if parser_name in sys.modules: # The parser module was found, but importing it diff --git a/Lib/xml/sax/expatreader.py b/Lib/xml/sax/expatreader.py index 5066ffc2fa51f029eb7147cd7becbd4e835f823d..e334ac9fea0d362ce2dbc494eecd2187d1dec88f 100644 --- a/Lib/xml/sax/expatreader.py +++ b/Lib/xml/sax/expatreader.py @@ -93,7 +93,7 @@ def __init__(self, namespaceHandling=0, bufsize=2**16-20): self._parser = None self._namespaces = namespaceHandling self._lex_handler_prop = None - self._parsing = 0 + self._parsing = False self._entity_stack = [] self._external_ges = 0 self._interning = None @@ -203,10 +203,10 @@ def setProperty(self, name, value): # IncrementalParser methods - def feed(self, data, isFinal = 0): + def feed(self, data, isFinal=False): if not self._parsing: self.reset() - self._parsing = 1 + self._parsing = True self._cont_handler.startDocument() try: @@ -237,13 +237,13 @@ def close(self): # If we are completing an external entity, do nothing here return try: - self.feed("", isFinal = 1) + self.feed(b"", isFinal=True) self._cont_handler.endDocument() - self._parsing = 0 + self._parsing = False # break cycle created by expat handlers pointing to our methods self._parser = None finally: - self._parsing = 0 + self._parsing = False if self._parser is not None: # Keep ErrorColumnNumber and ErrorLineNumber after closing. parser = _ClosedParser() @@ -307,7 +307,7 @@ def reset(self): self._parser.SetParamEntityParsing( expat.XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE) - self._parsing = 0 + self._parsing = False self._entity_stack = [] # Locator methods diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py index b9875745000febf35d53e0bb7ad198fa8effef0f..d15d60d2937a825fa505d3685a2c0171807c8af5 100644 --- a/Lib/xmlrpc/client.py +++ b/Lib/xmlrpc/client.py @@ -313,31 +313,38 @@ def make_comparable(self, other): s = self.timetuple() o = other.timetuple() else: - otype = (hasattr(other, "__class__") - and other.__class__.__name__ - or type(other)) - raise TypeError("Can't compare %s and %s" % - (self.__class__.__name__, otype)) + s = self + o = NotImplemented return s, o def __lt__(self, other): s, o = self.make_comparable(other) + if o is NotImplemented: + return NotImplemented return s < o def __le__(self, other): s, o = self.make_comparable(other) + if o is NotImplemented: + return NotImplemented return s <= o def __gt__(self, other): s, o = self.make_comparable(other) + if o is NotImplemented: + return NotImplemented return s > o def __ge__(self, other): s, o = self.make_comparable(other) + if o is NotImplemented: + return NotImplemented return s >= o def __eq__(self, other): s, o = self.make_comparable(other) + if o is NotImplemented: + return NotImplemented return s == o def timetuple(self): @@ -435,7 +442,7 @@ def __init__(self, target): target.xml(encoding, None) def feed(self, data): - self._parser.Parse(data, 0) + self._parser.Parse(data, False) def close(self): try: @@ -1414,15 +1421,14 @@ def __init__(self, uri, transport=None, encoding=None, verbose=False, # establish a "logical" server connection # get the url - type, uri = urllib.parse._splittype(uri) - if type not in ("http", "https"): + p = urllib.parse.urlparse(uri) + if p.scheme not in ("http", "https"): raise OSError("unsupported XML-RPC protocol") - self.__host, self.__handler = urllib.parse._splithost(uri) - if not self.__handler: - self.__handler = "/RPC2" + self.__host = p.netloc + self.__handler = p.path or "/RPC2" if transport is None: - if type == "https": + if p.scheme == "https": handler = SafeTransport extra_kwargs = {"context": context} else: diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py index 32aba4df4c7eb5edc473b0a5cba6068ca3f61ee0..287e3243b10cc59d4453285466d5deda67c51f30 100644 --- a/Lib/xmlrpc/server.py +++ b/Lib/xmlrpc/server.py @@ -732,7 +732,7 @@ def markup(self, text, escape=None, funcs={}, classes={}, methods={}): # hyperlinking of arbitrary strings being used as method # names. Only methods with names consisting of word characters # and '.'s are hyperlinked. - pattern = re.compile(r'\b((http|ftp)://\S+[\w/]|' + pattern = re.compile(r'\b((http|https|ftp)://\S+[\w/]|' r'RFC[- ]?(\d+)|' r'PEP[- ]?(\d+)|' r'(self\.)?((?:\w|\.)+))\b') diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 73e89666309ffec1cbbb9d8444dfde139b3c264e..816f8582bbf6d5949537f1e42e1173b67bc4c19a 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -4,7 +4,6 @@ XXX references to utf-8 need further investigation. """ import binascii -import functools import importlib.util import io import itertools @@ -378,11 +377,11 @@ def __init__(self, filename="NoName", date_time=(1980,1,1,0,0,0)): self.volume = 0 # Volume number of file header self.internal_attr = 0 # Internal attributes self.external_attr = 0 # External file attributes + self.compress_size = 0 # Size of the compressed file + self.file_size = 0 # Size of the uncompressed file # Other attributes are set by class ZipFile: # header_offset Byte offset to the file header # CRC CRC-32 of the uncompressed file - # compress_size Size of the compressed file - # file_size Size of the uncompressed file def __repr__(self): result = ['<%s filename=%r' % (self.__class__.__name__, self.filename)] @@ -467,44 +466,23 @@ def _decodeExtra(self): if ln+4 > len(extra): raise BadZipFile("Corrupt extra field %04x (size=%d)" % (tp, ln)) if tp == 0x0001: - if ln >= 24: - counts = unpack('{timecnt}{time_type}", fobj.read(timecnt * time_size) + ) + trans_idx = struct.unpack(f">{timecnt}B", fobj.read(timecnt)) + else: + trans_list_utc = () + trans_idx = () + + # Read the ttinfo struct, (utoff, isdst, abbrind) + if typecnt: + utcoff, isdst, abbrind = zip( + *(struct.unpack(">lbb", fobj.read(6)) for i in range(typecnt)) + ) + else: + utcoff = () + isdst = () + abbrind = () + + # Now read the abbreviations. They are null-terminated strings, indexed + # not by position in the array but by position in the unsplit + # abbreviation string. I suppose this makes more sense in C, which uses + # null to terminate the strings, but it's inconvenient here... + abbr_vals = {} + abbr_chars = fobj.read(charcnt) + + def get_abbr(idx): + # Gets a string starting at idx and running until the next \x00 + # + # We cannot pre-populate abbr_vals by splitting on \x00 because there + # are some zones that use subsets of longer abbreviations, like so: + # + # LMT\x00AHST\x00HDT\x00 + # + # Where the idx to abbr mapping should be: + # + # {0: "LMT", 4: "AHST", 5: "HST", 9: "HDT"} + if idx not in abbr_vals: + span_end = abbr_chars.find(b"\x00", idx) + abbr_vals[idx] = abbr_chars[idx:span_end].decode() + + return abbr_vals[idx] + + abbr = tuple(get_abbr(idx) for idx in abbrind) + + # The remainder of the file consists of leap seconds (currently unused) and + # the standard/wall and ut/local indicators, which are metadata we don't need. + # In version 2 files, we need to skip the unnecessary data to get at the TZ string: + if header.version >= 2: + # Each leap second record has size (time_size + 4) + skip_bytes = header.isutcnt + header.isstdcnt + header.leapcnt * 12 + fobj.seek(skip_bytes, 1) + + c = fobj.read(1) # Should be \n + assert c == b"\n", c + + tz_bytes = b"" + while (c := fobj.read(1)) != b"\n": + tz_bytes += c + + tz_str = tz_bytes + else: + tz_str = None + + return trans_idx, trans_list_utc, utcoff, isdst, abbr, tz_str + + +class _TZifHeader: + __slots__ = [ + "version", + "isutcnt", + "isstdcnt", + "leapcnt", + "timecnt", + "typecnt", + "charcnt", + ] + + def __init__(self, *args): + assert len(self.__slots__) == len(args) + for attr, val in zip(self.__slots__, args): + setattr(self, attr, val) + + @classmethod + def from_file(cls, stream): + # The header starts with a 4-byte "magic" value + if stream.read(4) != b"TZif": + raise ValueError("Invalid TZif file: magic not found") + + _version = stream.read(1) + if _version == b"\x00": + version = 1 + else: + version = int(_version) + stream.read(15) + + args = (version,) + + # Slots are defined in the order that the bytes are arranged + args = args + struct.unpack(">6l", stream.read(24)) + + return cls(*args) + + +class ZoneInfoNotFoundError(KeyError): + """Exception raised when a ZoneInfo key is not found.""" diff --git a/Lib/zoneinfo/_tzpath.py b/Lib/zoneinfo/_tzpath.py new file mode 100644 index 0000000000000000000000000000000000000000..9513611c17738e14c87260601c2632389566d05e --- /dev/null +++ b/Lib/zoneinfo/_tzpath.py @@ -0,0 +1,175 @@ +import os +import sysconfig + + +def reset_tzpath(to=None): + global TZPATH + + tzpaths = to + if tzpaths is not None: + if isinstance(tzpaths, (str, bytes)): + raise TypeError( + f"tzpaths must be a list or tuple, " + + f"not {type(tzpaths)}: {tzpaths!r}" + ) + + if not all(map(os.path.isabs, tzpaths)): + raise ValueError(_get_invalid_paths_message(tzpaths)) + base_tzpath = tzpaths + else: + env_var = os.environ.get("PYTHONTZPATH", None) + if env_var is not None: + base_tzpath = _parse_python_tzpath(env_var) + else: + base_tzpath = _parse_python_tzpath( + sysconfig.get_config_var("TZPATH") + ) + + TZPATH = tuple(base_tzpath) + + +def _parse_python_tzpath(env_var): + if not env_var: + return () + + raw_tzpath = env_var.split(os.pathsep) + new_tzpath = tuple(filter(os.path.isabs, raw_tzpath)) + + # If anything has been filtered out, we will warn about it + if len(new_tzpath) != len(raw_tzpath): + import warnings + + msg = _get_invalid_paths_message(raw_tzpath) + + warnings.warn( + "Invalid paths specified in PYTHONTZPATH environment variable." + + msg, + InvalidTZPathWarning, + ) + + return new_tzpath + + +def _get_invalid_paths_message(tzpaths): + invalid_paths = (path for path in tzpaths if not os.path.isabs(path)) + + prefix = "\n " + indented_str = prefix + prefix.join(invalid_paths) + + return ( + "Paths should be absolute but found the following relative paths:" + + indented_str + ) + + +def find_tzfile(key): + """Retrieve the path to a TZif file from a key.""" + _validate_tzfile_path(key) + for search_path in TZPATH: + filepath = os.path.join(search_path, key) + if os.path.isfile(filepath): + return filepath + + return None + + +_TEST_PATH = os.path.normpath(os.path.join("_", "_"))[:-1] + + +def _validate_tzfile_path(path, _base=_TEST_PATH): + if os.path.isabs(path): + raise ValueError( + f"ZoneInfo keys may not be absolute paths, got: {path}" + ) + + # We only care about the kinds of path normalizations that would change the + # length of the key - e.g. a/../b -> a/b, or a/b/ -> a/b. On Windows, + # normpath will also change from a/b to a\b, but that would still preserve + # the length. + new_path = os.path.normpath(path) + if len(new_path) != len(path): + raise ValueError( + f"ZoneInfo keys must be normalized relative paths, got: {path}" + ) + + resolved = os.path.normpath(os.path.join(_base, new_path)) + if not resolved.startswith(_base): + raise ValueError( + f"ZoneInfo keys must refer to subdirectories of TZPATH, got: {path}" + ) + + +del _TEST_PATH + + +def available_timezones(): + """Returns a set containing all available time zones. + + .. caution:: + + This may attempt to open a large number of files, since the best way to + determine if a given file on the time zone search path is to open it + and check for the "magic string" at the beginning. + """ + from importlib import resources + + valid_zones = set() + + # Start with loading from the tzdata package if it exists: this has a + # pre-assembled list of zones that only requires opening one file. + try: + with resources.open_text("tzdata", "zones") as f: + for zone in f: + zone = zone.strip() + if zone: + valid_zones.add(zone) + except (ImportError, FileNotFoundError): + pass + + def valid_key(fpath): + try: + with open(fpath, "rb") as f: + return f.read(4) == b"TZif" + except Exception: # pragma: nocover + return False + + for tz_root in TZPATH: + if not os.path.exists(tz_root): + continue + + for root, dirnames, files in os.walk(tz_root): + if root == tz_root: + # right/ and posix/ are special directories and shouldn't be + # included in the output of available zones + if "right" in dirnames: + dirnames.remove("right") + if "posix" in dirnames: + dirnames.remove("posix") + + for file in files: + fpath = os.path.join(root, file) + + key = os.path.relpath(fpath, start=tz_root) + if os.sep != "/": # pragma: nocover + key = key.replace(os.sep, "/") + + if not key or key in valid_zones: + continue + + if valid_key(fpath): + valid_zones.add(key) + + if "posixrules" in valid_zones: + # posixrules is a special symlink-only time zone where it exists, it + # should not be included in the output + valid_zones.remove("posixrules") + + return valid_zones + + +class InvalidTZPathWarning(RuntimeWarning): + """Warning raised if an invalid path is specified in PYTHONTZPATH.""" + + +TZPATH = () +reset_tzpath() diff --git a/Lib/zoneinfo/_zoneinfo.py b/Lib/zoneinfo/_zoneinfo.py new file mode 100644 index 0000000000000000000000000000000000000000..9810637d3ef65eecb617c8fc86526d8dcb9a5094 --- /dev/null +++ b/Lib/zoneinfo/_zoneinfo.py @@ -0,0 +1,752 @@ +import bisect +import calendar +import collections +import functools +import re +import weakref +from datetime import datetime, timedelta, tzinfo + +from . import _common, _tzpath + +EPOCH = datetime(1970, 1, 1) +EPOCHORDINAL = datetime(1970, 1, 1).toordinal() + +# It is relatively expensive to construct new timedelta objects, and in most +# cases we're looking at the same deltas, like integer numbers of hours, etc. +# To improve speed and memory use, we'll keep a dictionary with references +# to the ones we've already used so far. +# +# Loading every time zone in the 2020a version of the time zone database +# requires 447 timedeltas, which requires approximately the amount of space +# that ZoneInfo("America/New_York") with 236 transitions takes up, so we will +# set the cache size to 512 so that in the common case we always get cache +# hits, but specifically crafted ZoneInfo objects don't leak arbitrary amounts +# of memory. +@functools.lru_cache(maxsize=512) +def _load_timedelta(seconds): + return timedelta(seconds=seconds) + + +class ZoneInfo(tzinfo): + _strong_cache_size = 8 + _strong_cache = collections.OrderedDict() + _weak_cache = weakref.WeakValueDictionary() + __module__ = "zoneinfo" + + def __init_subclass__(cls): + cls._strong_cache = collections.OrderedDict() + cls._weak_cache = weakref.WeakValueDictionary() + + def __new__(cls, key): + instance = cls._weak_cache.get(key, None) + if instance is None: + instance = cls._weak_cache.setdefault(key, cls._new_instance(key)) + instance._from_cache = True + + # Update the "strong" cache + cls._strong_cache[key] = cls._strong_cache.pop(key, instance) + + if len(cls._strong_cache) > cls._strong_cache_size: + cls._strong_cache.popitem(last=False) + + return instance + + @classmethod + def no_cache(cls, key): + obj = cls._new_instance(key) + obj._from_cache = False + + return obj + + @classmethod + def _new_instance(cls, key): + obj = super().__new__(cls) + obj._key = key + obj._file_path = obj._find_tzfile(key) + + if obj._file_path is not None: + file_obj = open(obj._file_path, "rb") + else: + file_obj = _common.load_tzdata(key) + + with file_obj as f: + obj._load_file(f) + + return obj + + @classmethod + def from_file(cls, fobj, /, key=None): + obj = super().__new__(cls) + obj._key = key + obj._file_path = None + obj._load_file(fobj) + obj._file_repr = repr(fobj) + + # Disable pickling for objects created from files + obj.__reduce__ = obj._file_reduce + + return obj + + @classmethod + def clear_cache(cls, *, only_keys=None): + if only_keys is not None: + for key in only_keys: + cls._weak_cache.pop(key, None) + cls._strong_cache.pop(key, None) + + else: + cls._weak_cache.clear() + cls._strong_cache.clear() + + @property + def key(self): + return self._key + + def utcoffset(self, dt): + return self._find_trans(dt).utcoff + + def dst(self, dt): + return self._find_trans(dt).dstoff + + def tzname(self, dt): + return self._find_trans(dt).tzname + + def fromutc(self, dt): + """Convert from datetime in UTC to datetime in local time""" + + if not isinstance(dt, datetime): + raise TypeError("fromutc() requires a datetime argument") + if dt.tzinfo is not self: + raise ValueError("dt.tzinfo is not self") + + timestamp = self._get_local_timestamp(dt) + num_trans = len(self._trans_utc) + + if num_trans >= 1 and timestamp < self._trans_utc[0]: + tti = self._tti_before + fold = 0 + elif ( + num_trans == 0 or timestamp > self._trans_utc[-1] + ) and not isinstance(self._tz_after, _ttinfo): + tti, fold = self._tz_after.get_trans_info_fromutc( + timestamp, dt.year + ) + elif num_trans == 0: + tti = self._tz_after + fold = 0 + else: + idx = bisect.bisect_right(self._trans_utc, timestamp) + + if num_trans > 1 and timestamp >= self._trans_utc[1]: + tti_prev, tti = self._ttinfos[idx - 2 : idx] + elif timestamp > self._trans_utc[-1]: + tti_prev = self._ttinfos[-1] + tti = self._tz_after + else: + tti_prev = self._tti_before + tti = self._ttinfos[0] + + # Detect fold + shift = tti_prev.utcoff - tti.utcoff + fold = shift.total_seconds() > timestamp - self._trans_utc[idx - 1] + dt += tti.utcoff + if fold: + return dt.replace(fold=1) + else: + return dt + + def _find_trans(self, dt): + if dt is None: + if self._fixed_offset: + return self._tz_after + else: + return _NO_TTINFO + + ts = self._get_local_timestamp(dt) + + lt = self._trans_local[dt.fold] + + num_trans = len(lt) + + if num_trans and ts < lt[0]: + return self._tti_before + elif not num_trans or ts > lt[-1]: + if isinstance(self._tz_after, _TZStr): + return self._tz_after.get_trans_info(ts, dt.year, dt.fold) + else: + return self._tz_after + else: + # idx is the transition that occurs after this timestamp, so we + # subtract off 1 to get the current ttinfo + idx = bisect.bisect_right(lt, ts) - 1 + assert idx >= 0 + return self._ttinfos[idx] + + def _get_local_timestamp(self, dt): + return ( + (dt.toordinal() - EPOCHORDINAL) * 86400 + + dt.hour * 3600 + + dt.minute * 60 + + dt.second + ) + + def __str__(self): + if self._key is not None: + return f"{self._key}" + else: + return repr(self) + + def __repr__(self): + if self._key is not None: + return f"{self.__class__.__name__}(key={self._key!r})" + else: + return f"{self.__class__.__name__}.from_file({self._file_repr})" + + def __reduce__(self): + return (self.__class__._unpickle, (self._key, self._from_cache)) + + def _file_reduce(self): + import pickle + + raise pickle.PicklingError( + "Cannot pickle a ZoneInfo file created from a file stream." + ) + + @classmethod + def _unpickle(cls, key, from_cache, /): + if from_cache: + return cls(key) + else: + return cls.no_cache(key) + + def _find_tzfile(self, key): + return _tzpath.find_tzfile(key) + + def _load_file(self, fobj): + # Retrieve all the data as it exists in the zoneinfo file + trans_idx, trans_utc, utcoff, isdst, abbr, tz_str = _common.load_data( + fobj + ) + + # Infer the DST offsets (needed for .dst()) from the data + dstoff = self._utcoff_to_dstoff(trans_idx, utcoff, isdst) + + # Convert all the transition times (UTC) into "seconds since 1970-01-01 local time" + trans_local = self._ts_to_local(trans_idx, trans_utc, utcoff) + + # Construct `_ttinfo` objects for each transition in the file + _ttinfo_list = [ + _ttinfo( + _load_timedelta(utcoffset), _load_timedelta(dstoffset), tzname + ) + for utcoffset, dstoffset, tzname in zip(utcoff, dstoff, abbr) + ] + + self._trans_utc = trans_utc + self._trans_local = trans_local + self._ttinfos = [_ttinfo_list[idx] for idx in trans_idx] + + # Find the first non-DST transition + for i in range(len(isdst)): + if not isdst[i]: + self._tti_before = _ttinfo_list[i] + break + else: + if self._ttinfos: + self._tti_before = self._ttinfos[0] + else: + self._tti_before = None + + # Set the "fallback" time zone + if tz_str is not None and tz_str != b"": + self._tz_after = _parse_tz_str(tz_str.decode()) + else: + if not self._ttinfos and not _ttinfo_list: + raise ValueError("No time zone information found.") + + if self._ttinfos: + self._tz_after = self._ttinfos[-1] + else: + self._tz_after = _ttinfo_list[-1] + + # Determine if this is a "fixed offset" zone, meaning that the output + # of the utcoffset, dst and tzname functions does not depend on the + # specific datetime passed. + # + # We make three simplifying assumptions here: + # + # 1. If _tz_after is not a _ttinfo, it has transitions that might + # actually occur (it is possible to construct TZ strings that + # specify STD and DST but no transitions ever occur, such as + # AAA0BBB,0/0,J365/25). + # 2. If _ttinfo_list contains more than one _ttinfo object, the objects + # represent different offsets. + # 3. _ttinfo_list contains no unused _ttinfos (in which case an + # otherwise fixed-offset zone with extra _ttinfos defined may + # appear to *not* be a fixed offset zone). + # + # Violations to these assumptions would be fairly exotic, and exotic + # zones should almost certainly not be used with datetime.time (the + # only thing that would be affected by this). + if len(_ttinfo_list) > 1 or not isinstance(self._tz_after, _ttinfo): + self._fixed_offset = False + elif not _ttinfo_list: + self._fixed_offset = True + else: + self._fixed_offset = _ttinfo_list[0] == self._tz_after + + @staticmethod + def _utcoff_to_dstoff(trans_idx, utcoffsets, isdsts): + # Now we must transform our ttis and abbrs into `_ttinfo` objects, + # but there is an issue: .dst() must return a timedelta with the + # difference between utcoffset() and the "standard" offset, but + # the "base offset" and "DST offset" are not encoded in the file; + # we can infer what they are from the isdst flag, but it is not + # sufficient to to just look at the last standard offset, because + # occasionally countries will shift both DST offset and base offset. + + typecnt = len(isdsts) + dstoffs = [0] * typecnt # Provisionally assign all to 0. + dst_cnt = sum(isdsts) + dst_found = 0 + + for i in range(1, len(trans_idx)): + if dst_cnt == dst_found: + break + + idx = trans_idx[i] + + dst = isdsts[idx] + + # We're only going to look at daylight saving time + if not dst: + continue + + # Skip any offsets that have already been assigned + if dstoffs[idx] != 0: + continue + + dstoff = 0 + utcoff = utcoffsets[idx] + + comp_idx = trans_idx[i - 1] + + if not isdsts[comp_idx]: + dstoff = utcoff - utcoffsets[comp_idx] + + if not dstoff and idx < (typecnt - 1): + comp_idx = trans_idx[i + 1] + + # If the following transition is also DST and we couldn't + # find the DST offset by this point, we're going ot have to + # skip it and hope this transition gets assigned later + if isdsts[comp_idx]: + continue + + dstoff = utcoff - utcoffsets[comp_idx] + + if dstoff: + dst_found += 1 + dstoffs[idx] = dstoff + else: + # If we didn't find a valid value for a given index, we'll end up + # with dstoff = 0 for something where `isdst=1`. This is obviously + # wrong - one hour will be a much better guess than 0 + for idx in range(typecnt): + if not dstoffs[idx] and isdsts[idx]: + dstoffs[idx] = 3600 + + return dstoffs + + @staticmethod + def _ts_to_local(trans_idx, trans_list_utc, utcoffsets): + """Generate number of seconds since 1970 *in the local time*. + + This is necessary to easily find the transition times in local time""" + if not trans_list_utc: + return [[], []] + + # Start with the timestamps and modify in-place + trans_list_wall = [list(trans_list_utc), list(trans_list_utc)] + + if len(utcoffsets) > 1: + offset_0 = utcoffsets[0] + offset_1 = utcoffsets[trans_idx[0]] + if offset_1 > offset_0: + offset_1, offset_0 = offset_0, offset_1 + else: + offset_0 = offset_1 = utcoffsets[0] + + trans_list_wall[0][0] += offset_0 + trans_list_wall[1][0] += offset_1 + + for i in range(1, len(trans_idx)): + offset_0 = utcoffsets[trans_idx[i - 1]] + offset_1 = utcoffsets[trans_idx[i]] + + if offset_1 > offset_0: + offset_1, offset_0 = offset_0, offset_1 + + trans_list_wall[0][i] += offset_0 + trans_list_wall[1][i] += offset_1 + + return trans_list_wall + + +class _ttinfo: + __slots__ = ["utcoff", "dstoff", "tzname"] + + def __init__(self, utcoff, dstoff, tzname): + self.utcoff = utcoff + self.dstoff = dstoff + self.tzname = tzname + + def __eq__(self, other): + return ( + self.utcoff == other.utcoff + and self.dstoff == other.dstoff + and self.tzname == other.tzname + ) + + def __repr__(self): # pragma: nocover + return ( + f"{self.__class__.__name__}" + + f"({self.utcoff}, {self.dstoff}, {self.tzname})" + ) + + +_NO_TTINFO = _ttinfo(None, None, None) + + +class _TZStr: + __slots__ = ( + "std", + "dst", + "start", + "end", + "get_trans_info", + "get_trans_info_fromutc", + "dst_diff", + ) + + def __init__( + self, std_abbr, std_offset, dst_abbr, dst_offset, start=None, end=None + ): + self.dst_diff = dst_offset - std_offset + std_offset = _load_timedelta(std_offset) + self.std = _ttinfo( + utcoff=std_offset, dstoff=_load_timedelta(0), tzname=std_abbr + ) + + self.start = start + self.end = end + + dst_offset = _load_timedelta(dst_offset) + delta = _load_timedelta(self.dst_diff) + self.dst = _ttinfo(utcoff=dst_offset, dstoff=delta, tzname=dst_abbr) + + # These are assertions because the constructor should only be called + # by functions that would fail before passing start or end + assert start is not None, "No transition start specified" + assert end is not None, "No transition end specified" + + self.get_trans_info = self._get_trans_info + self.get_trans_info_fromutc = self._get_trans_info_fromutc + + def transitions(self, year): + start = self.start.year_to_epoch(year) + end = self.end.year_to_epoch(year) + return start, end + + def _get_trans_info(self, ts, year, fold): + """Get the information about the current transition - tti""" + start, end = self.transitions(year) + + # With fold = 0, the period (denominated in local time) with the + # smaller offset starts at the end of the gap and ends at the end of + # the fold; with fold = 1, it runs from the start of the gap to the + # beginning of the fold. + # + # So in order to determine the DST boundaries we need to know both + # the fold and whether DST is positive or negative (rare), and it + # turns out that this boils down to fold XOR is_positive. + if fold == (self.dst_diff >= 0): + end -= self.dst_diff + else: + start += self.dst_diff + + if start < end: + isdst = start <= ts < end + else: + isdst = not (end <= ts < start) + + return self.dst if isdst else self.std + + def _get_trans_info_fromutc(self, ts, year): + start, end = self.transitions(year) + start -= self.std.utcoff.total_seconds() + end -= self.dst.utcoff.total_seconds() + + if start < end: + isdst = start <= ts < end + else: + isdst = not (end <= ts < start) + + # For positive DST, the ambiguous period is one dst_diff after the end + # of DST; for negative DST, the ambiguous period is one dst_diff before + # the start of DST. + if self.dst_diff > 0: + ambig_start = end + ambig_end = end + self.dst_diff + else: + ambig_start = start + ambig_end = start - self.dst_diff + + fold = ambig_start <= ts < ambig_end + + return (self.dst if isdst else self.std, fold) + + +def _post_epoch_days_before_year(year): + """Get the number of days between 1970-01-01 and YEAR-01-01""" + y = year - 1 + return y * 365 + y // 4 - y // 100 + y // 400 - EPOCHORDINAL + + +class _DayOffset: + __slots__ = ["d", "julian", "hour", "minute", "second"] + + def __init__(self, d, julian, hour=2, minute=0, second=0): + if not (0 + julian) <= d <= 365: + min_day = 0 + julian + raise ValueError(f"d must be in [{min_day}, 365], not: {d}") + + self.d = d + self.julian = julian + self.hour = hour + self.minute = minute + self.second = second + + def year_to_epoch(self, year): + days_before_year = _post_epoch_days_before_year(year) + + d = self.d + if self.julian and d >= 59 and calendar.isleap(year): + d += 1 + + epoch = (days_before_year + d) * 86400 + epoch += self.hour * 3600 + self.minute * 60 + self.second + + return epoch + + +class _CalendarOffset: + __slots__ = ["m", "w", "d", "hour", "minute", "second"] + + _DAYS_BEFORE_MONTH = ( + -1, + 0, + 31, + 59, + 90, + 120, + 151, + 181, + 212, + 243, + 273, + 304, + 334, + ) + + def __init__(self, m, w, d, hour=2, minute=0, second=0): + if not 0 < m <= 12: + raise ValueError("m must be in (0, 12]") + + if not 0 < w <= 5: + raise ValueError("w must be in (0, 5]") + + if not 0 <= d <= 6: + raise ValueError("d must be in [0, 6]") + + self.m = m + self.w = w + self.d = d + self.hour = hour + self.minute = minute + self.second = second + + @classmethod + def _ymd2ord(cls, year, month, day): + return ( + _post_epoch_days_before_year(year) + + cls._DAYS_BEFORE_MONTH[month] + + (month > 2 and calendar.isleap(year)) + + day + ) + + # TODO: These are not actually epoch dates as they are expressed in local time + def year_to_epoch(self, year): + """Calculates the datetime of the occurrence from the year""" + # We know year and month, we need to convert w, d into day of month + # + # Week 1 is the first week in which day `d` (where 0 = Sunday) appears. + # Week 5 represents the last occurrence of day `d`, so we need to know + # the range of the month. + first_day, days_in_month = calendar.monthrange(year, self.m) + + # This equation seems magical, so I'll break it down: + # 1. calendar says 0 = Monday, POSIX says 0 = Sunday + # so we need first_day + 1 to get 1 = Monday -> 7 = Sunday, + # which is still equivalent because this math is mod 7 + # 2. Get first day - desired day mod 7: -1 % 7 = 6, so we don't need + # to do anything to adjust negative numbers. + # 3. Add 1 because month days are a 1-based index. + month_day = (self.d - (first_day + 1)) % 7 + 1 + + # Now use a 0-based index version of `w` to calculate the w-th + # occurrence of `d` + month_day += (self.w - 1) * 7 + + # month_day will only be > days_in_month if w was 5, and `w` means + # "last occurrence of `d`", so now we just check if we over-shot the + # end of the month and if so knock off 1 week. + if month_day > days_in_month: + month_day -= 7 + + ordinal = self._ymd2ord(year, self.m, month_day) + epoch = ordinal * 86400 + epoch += self.hour * 3600 + self.minute * 60 + self.second + return epoch + + +def _parse_tz_str(tz_str): + # The tz string has the format: + # + # std[offset[dst[offset],start[/time],end[/time]]] + # + # std and dst must be 3 or more characters long and must not contain + # a leading colon, embedded digits, commas, nor a plus or minus signs; + # The spaces between "std" and "offset" are only for display and are + # not actually present in the string. + # + # The format of the offset is ``[+|-]hh[:mm[:ss]]`` + + offset_str, *start_end_str = tz_str.split(",", 1) + + # fmt: off + parser_re = re.compile( + r"(?P[^<0-9:.+-]+|<[a-zA-Z0-9+\-]+>)" + + r"((?P[+-]?\d{1,2}(:\d{2}(:\d{2})?)?)" + + r"((?P[^0-9:.+-]+|<[a-zA-Z0-9+\-]+>)" + + r"((?P[+-]?\d{1,2}(:\d{2}(:\d{2})?)?))?" + + r")?" + # dst + r")?$" # stdoff + ) + # fmt: on + + m = parser_re.match(offset_str) + + if m is None: + raise ValueError(f"{tz_str} is not a valid TZ string") + + std_abbr = m.group("std") + dst_abbr = m.group("dst") + dst_offset = None + + std_abbr = std_abbr.strip("<>") + + if dst_abbr: + dst_abbr = dst_abbr.strip("<>") + + if std_offset := m.group("stdoff"): + try: + std_offset = _parse_tz_delta(std_offset) + except ValueError as e: + raise ValueError(f"Invalid STD offset in {tz_str}") from e + else: + std_offset = 0 + + if dst_abbr is not None: + if dst_offset := m.group("dstoff"): + try: + dst_offset = _parse_tz_delta(dst_offset) + except ValueError as e: + raise ValueError(f"Invalid DST offset in {tz_str}") from e + else: + dst_offset = std_offset + 3600 + + if not start_end_str: + raise ValueError(f"Missing transition rules: {tz_str}") + + start_end_strs = start_end_str[0].split(",", 1) + try: + start, end = (_parse_dst_start_end(x) for x in start_end_strs) + except ValueError as e: + raise ValueError(f"Invalid TZ string: {tz_str}") from e + + return _TZStr(std_abbr, std_offset, dst_abbr, dst_offset, start, end) + elif start_end_str: + raise ValueError(f"Transition rule present without DST: {tz_str}") + else: + # This is a static ttinfo, don't return _TZStr + return _ttinfo( + _load_timedelta(std_offset), _load_timedelta(0), std_abbr + ) + + +def _parse_dst_start_end(dststr): + date, *time = dststr.split("/") + if date[0] == "M": + n_is_julian = False + m = re.match(r"M(\d{1,2})\.(\d).(\d)$", date) + if m is None: + raise ValueError(f"Invalid dst start/end date: {dststr}") + date_offset = tuple(map(int, m.groups())) + offset = _CalendarOffset(*date_offset) + else: + if date[0] == "J": + n_is_julian = True + date = date[1:] + else: + n_is_julian = False + + doy = int(date) + offset = _DayOffset(doy, n_is_julian) + + if time: + time_components = list(map(int, time[0].split(":"))) + n_components = len(time_components) + if n_components < 3: + time_components.extend([0] * (3 - n_components)) + offset.hour, offset.minute, offset.second = time_components + + return offset + + +def _parse_tz_delta(tz_delta): + match = re.match( + r"(?P[+-])?(?P\d{1,2})(:(?P\d{2})(:(?P\d{2}))?)?", + tz_delta, + ) + # Anything passed to this function should already have hit an equivalent + # regular expression to find the section to parse. + assert match is not None, tz_delta + + h, m, s = ( + int(v) if v is not None else 0 + for v in map(match.group, ("h", "m", "s")) + ) + + total = h * 3600 + m * 60 + s + + if not -86400 < total < 86400: + raise ValueError( + f"Offset must be strictly between -24h and +24h: {tz_delta}" + ) + + # Yes, +5 maps to an offset of -5h + if match.group("sign") != "-": + total *= -1 + + return total diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index a58b922ce30b8363f208241ea6d1bb97d5f16112..ef64502ab780c790cbc34cdfaec40b5d20512921 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -116,7 +116,8 @@ def getFullVersion(): DEPSRC = os.path.join(WORKDIR, 'third-party') DEPSRC = os.path.expanduser('~/Universal/other-sources') -universal_opts_map = { '32-bit': ('i386', 'ppc',), +universal_opts_map = { 'universal2': ('arm64', 'x86_64'), + '32-bit': ('i386', 'ppc',), '64-bit': ('x86_64', 'ppc64',), 'intel': ('i386', 'x86_64'), 'intel-32': ('i386',), @@ -124,6 +125,7 @@ def getFullVersion(): '3-way': ('ppc', 'i386', 'x86_64'), 'all': ('i386', 'ppc', 'x86_64', 'ppc64',) } default_target_map = { + 'universal2': '10.9', '64-bit': '10.5', '3-way': '10.5', 'intel': '10.5', @@ -151,6 +153,9 @@ def getFullVersion(): def getDeptargetTuple(): return tuple([int(n) for n in DEPTARGET.split('.')[0:2]]) +def getBuildTuple(): + return tuple([int(n) for n in platform.mac_ver()[0].split('.')[0:2]]) + def getTargetCompilers(): target_cc_map = { '10.4': ('gcc-4.0', 'g++-4.0'), @@ -190,6 +195,34 @@ def getTargetCompilers(): def internalTk(): return getDeptargetTuple() >= (10, 6) +# Do we use 8.6.8 when building our own copy +# of Tcl/Tk or a modern version. +# We use the old version when buildin on +# old versions of macOS due to build issues. +def useOldTk(): + return getBuildTuple() < (10, 15) + + +def tweak_tcl_build(basedir, archList): + with open("Makefile", "r") as fp: + contents = fp.readlines() + + # For reasons I don't understand the tcl configure script + # decides that some stdlib symbols aren't present, before + # deciding that strtod is broken. + new_contents = [] + for line in contents: + if line.startswith("COMPAT_OBJS"): + # note: the space before strtod.o is intentional, + # the detection of a broken strtod results in + # "fixstrod.o" on this line. + for nm in ("strstr.o", "strtoul.o", " strtod.o"): + line = line.replace(nm, "") + new_contents.append(line) + + with open("Makefile", "w") as fp: + fp.writelines(new_contents) + # List of names of third party software built with this installer. # The names will be inserted into the rtf version of the License. THIRD_PARTY_LIBS = [] @@ -209,9 +242,9 @@ def library_recipes(): result.extend([ dict( - name="OpenSSL 1.1.1g", - url="https://www.openssl.org/source/openssl-1.1.1g.tar.gz", - checksum='76766e98997660138cdaf13a187bd234', + name="OpenSSL 1.1.1i", + url="https://www.openssl.org/source/openssl-1.1.1i.tar.gz", + checksum='08987c3cf125202e2b0840035efb392c', buildrecipe=build_universal_openssl, configure=None, install=None, @@ -219,11 +252,26 @@ def library_recipes(): ]) if internalTk(): + if useOldTk(): + tcl_tk_ver='8.6.8' + tcl_checksum='81656d3367af032e0ae6157eff134f89' + + tk_checksum='5e0faecba458ee1386078fb228d008ba' + tk_patches = ['tk868_on_10_8_10_9.patch'] + + else: + tcl_tk_ver='8.6.11' + tcl_checksum='8a4c004f48984a03a7747e9ba06e4da4' + + tk_checksum='c7ee71a2d05bba78dfffd76528dc17c6' + tk_patches = [ ] + + result.extend([ dict( - name="Tcl 8.6.8", - url="ftp://ftp.tcl.tk/pub/tcl//tcl8_6/tcl8.6.8-src.tar.gz", - checksum='81656d3367af032e0ae6157eff134f89', + name="Tcl %s"%(tcl_tk_ver,), + url="ftp://ftp.tcl.tk/pub/tcl//tcl8_6/tcl%s-src.tar.gz"%(tcl_tk_ver,), + checksum=tcl_checksum, buildDir="unix", configure_pre=[ '--enable-shared', @@ -231,18 +279,17 @@ def library_recipes(): '--libdir=/Library/Frameworks/Python.framework/Versions/%s/lib'%(getVersion(),), ], useLDFlags=False, + buildrecipe=tweak_tcl_build, install='make TCL_LIBRARY=%(TCL_LIBRARY)s && make install TCL_LIBRARY=%(TCL_LIBRARY)s DESTDIR=%(DESTDIR)s'%{ "DESTDIR": shellQuote(os.path.join(WORKDIR, 'libraries')), "TCL_LIBRARY": shellQuote('/Library/Frameworks/Python.framework/Versions/%s/lib/tcl8.6'%(getVersion())), }, ), dict( - name="Tk 8.6.8", - url="ftp://ftp.tcl.tk/pub/tcl//tcl8_6/tk8.6.8-src.tar.gz", - checksum='5e0faecba458ee1386078fb228d008ba', - patches=[ - "tk868_on_10_8_10_9.patch", - ], + name="Tk %s"%(tcl_tk_ver,), + url="ftp://ftp.tcl.tk/pub/tcl//tcl8_6/tk%s-src.tar.gz"%(tcl_tk_ver,), + checksum=tk_checksum, + patches=tk_patches, buildDir="unix", configure_pre=[ '--enable-aqua', @@ -307,9 +354,9 @@ def library_recipes(): ), ), dict( - name="SQLite 3.32.3", - url="https://sqlite.org/2020/sqlite-autoconf-3320300.tar.gz", - checksum='2e3911a3c15e85c2f2d040154bbe5ce3', + name="SQLite 3.34.0", + url="https://sqlite.org/2020/sqlite-autoconf-3340000.tar.gz", + checksum='7f33c9db7b713957fcb9271fe9049fef', extra_cflags=('-Os ' '-DSQLITE_ENABLE_FTS5 ' '-DSQLITE_ENABLE_FTS4 ' @@ -537,8 +584,8 @@ def checkEnvironment(): Check that we're running on a supported system. """ - if sys.version_info[0:2] < (2, 5): - fatal("This script must be run with Python 2.5 (or later)") + if sys.version_info[0:2] < (2, 7): + fatal("This script must be run with Python 2.7 (or later)") if platform.system() != 'Darwin': fatal("This script should be run on a macOS 10.5 (or later) system") @@ -606,9 +653,6 @@ def checkEnvironment(): base_path = base_path + ':' + OLD_DEVELOPER_TOOLS os.environ['PATH'] = base_path print("Setting default PATH: %s"%(os.environ['PATH'])) - # Ensure we have access to sphinx-build. - # You may have to create a link in /usr/bin for it. - runCommand('sphinx-build --version') def parseOptions(args=None): """ @@ -801,6 +845,7 @@ def build_openssl_arch(archbase, arch): arch_opts = { "i386": ["darwin-i386-cc"], "x86_64": ["darwin64-x86_64-cc", "enable-ec_nistp_64_gcc_128"], + "arm64": ["darwin64-arm64-cc"], "ppc": ["darwin-ppc-cc"], "ppc64": ["darwin64-ppc-cc"], } @@ -1090,7 +1135,6 @@ def buildPythonDocs(): if not os.path.exists(htmlDir): # Create virtual environment for docs builds with blurb and sphinx runCommand('make venv') - runCommand('venv/bin/python3 -m pip install -U Sphinx==2.3.1') runCommand('make html PYTHON=venv/bin/python') os.rename(htmlDir, docdir) os.chdir(curDir) @@ -1567,8 +1611,17 @@ def buildDMG(): if os.path.exists(outdir): shutil.rmtree(outdir) + # We used to use the deployment target as the last characters of the + # installer file name. With the introduction of weaklinked installer + # variants, we may have two variants with the same file name, i.e. + # both ending in '10.9'. To avoid this, we now use the major/minor + # version numbers of the macOS version we are building on, i.e. + # '10.9' as before for 10.9+ variant, '11.0' for universal2 11.0-. + # it's not ideal but should cause the least disruption to packaging + # workflows. + build_system_version = '.'.join(platform.mac_ver()[0].split('.')[0:2]) imagepath = os.path.join(outdir, - 'python-%s-macosx%s'%(getFullVersion(),DEPTARGET)) + 'python-%s-macosx%s'%(getFullVersion(),build_system_version)) if INCLUDE_TIMESTAMP: imagepath = imagepath + '-%04d-%02d-%02d'%(time.localtime()[:3]) imagepath = imagepath + '.dmg' diff --git a/Mac/BuildScript/resources/License.rtf b/Mac/BuildScript/resources/License.rtf index 25d53386da01a5671921a50604b7fbd464d73866..1dfdc1edc17fabe79de2a657d058638e26842908 100644 --- a/Mac/BuildScript/resources/License.rtf +++ b/Mac/BuildScript/resources/License.rtf @@ -1,9 +1,9 @@ -{\rtf1\ansi\ansicpg1252\cocoartf2511 +{\rtf1\ansi\ansicpg1252\cocoartf2513 \cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;\f2\fmodern\fcharset0 CourierNewPS-BoldMT; \f3\fmodern\fcharset0 CourierNewPSMT;} {\colortbl;\red255\green255\blue255;} {\*\expandedcolortbl;;} -\margl1440\margr1440\vieww14620\viewh13380\viewkind0 +\margl1440\margr1440\vieww18500\viewh13520\viewkind0 \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \f0\b\fs36 \cf0 \ul \ulc0 HISTORY AND LICENSE\ @@ -47,8 +47,17 @@ Thanks to the many outside volunteers who have worked under Guido's direction to \ \f0\b \ul TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON\ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 -\f1\b0 \ulnone \ +\f1\b0 \cf0 \ulnone Python software and documentation are licensed under the Python Software Foundation License Version 2.\ +\ +Starting with Python 3.8.6, examples, recipes, and other code in the documentation are dual licensed under the PSF License Version 2 and the Zero-Clause BSD license.\ +\ +Some software incorporated into Python is under different licenses. The licenses are listed with code falling under that license.\ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ \f0\b PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2\ @@ -125,6 +134,18 @@ Permission to use, copy, modify, and distribute this software and its documentat STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\ \ \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 + +\f0\b \cf0 ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 + +\f1\b0 \cf0 \ +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted.\ +\ +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 +\cf0 \ +\ \f0\b \ul LICENSES AND ACKNOWLEDGEMENTS FOR INCORPORATED SOFTWARE\ diff --git a/Mac/BuildScript/resources/ReadMe.rtf b/Mac/BuildScript/resources/ReadMe.rtf index b1e972eec2d6e26fd02bc813cc8ec8282068684f..2c0c3d5eb3a0962b317f504dc554ce6a6def64ea 100644 --- a/Mac/BuildScript/resources/ReadMe.rtf +++ b/Mac/BuildScript/resources/ReadMe.rtf @@ -3,7 +3,7 @@ \f3\fmodern\fcharset0 CourierNewPSMT;} {\colortbl;\red255\green255\blue255;} {\*\expandedcolortbl;;} -\margl1440\margr1440\vieww13380\viewh14600\viewkind0 +\margl1440\margr1440\vieww13380\viewh14580\viewkind0 \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 \f0\fs24 \cf0 This package will install Python $FULL_VERSION for macOS $MACOSX_DEPLOYMENT_TARGET for the following architecture(s): $ARCHITECTURES.\ @@ -20,7 +20,7 @@ This package includes its own private copy of OpenSSL 1.1.1. The trust certifi \f0\i0 command line utility are not used as defaults by the Python \f3 ssl \f0 module. A sample command script is included in -\f3 /Applications/Python 3.8 +\f3 /Applications/Python 3.9 \f0 to install a curated bundle of default root certificates from the third-party \f3 certifi \f0 package ({\field{\*\fldinst{HYPERLINK "https://pypi.org/project/certifi/"}}{\fldrslt https://pypi.org/project/certifi/}}). Double-click on @@ -48,30 +48,20 @@ Due to new security checks on macOS 10.15 Catalina, when launching IDLE macOS ma \f0\b0 file dialog windows. Click on the \f1\b OK \f0\b0 button to proceed.\ +\ -\f1\b \ul \ -macOS 10.15 (Catalina) Gatekeeper Requirements [changed in 3.8.2]\ +\f1\b \ul macOS 11.0 (Big Sur) and Apple Silicon Mac support [new in 3.9.1]\ \f0\b0 \ulnone \ -As of 2020-02-03, Apple has changed how third-party installer packages, like those provided by python.org, are notarized for verification by Gatekeeper and begun enforcing additional requirements such as code signing and use of the hardened runtime. As of 3.8.2, python.org installer packages now meet those additional notarization requirements. The necessary changes in packaging should be transparent to your use of Python but, in the unlikely event that you encounter changes in behavior between 3.8.1 and newer 3.8.x releases in areas like ctypes, importlib, or mmap, please check bugs.python.org for existing reports and, if necessary, open a new issue.\ - -\f1\b \ul \ -Python 2.7 end-of-life [changed in 3.8.4]\ +As of 2020-11, macOS 11.0 (Big Sur) is the latest release of macOS and one of its major features is the support of new Apple Silicon Macs that are based on the ARM64 CPU architecture specification rather than the Intel 64 (x86_64) architecture used previously. There are other changes in Big Sur that affect Python operation regardless of CPU architecture. As of 3.9.1, Python binaries from python.org fully support Big Sur. \ \ - -\f0\b0 \ulnone Python 2.7 has now reached end-of-life. As of Python 3.8.4, the -\f3 Python Launcher -\f0 app now has -\f3 python3 -\f0 factory defaults. Also, the -\f3 Current -\f0 link in the -\f3 /Library/Frameworks/Python.framework/Versions -\f0 directory is now updated to point to the Python 3 being installed; previously, only Python 2 installs updated -\f3 Current -\f0 . This change might affect developers using the framework to embed Python in their applications. If another version is desired for embedding, the -\f3 Current -\f0 symlink can be changed manually without affecting 3.8.x behavior.\ +python.org binaries for macOS have been provided via a downloadable installer that supports the Intel 64 architecture on macOS 10.9 and newer. This installer variant remains the default download for 3.9.1; it will install and run on all Macs that run macOS 10.9 or later, including 11.0 (Big Sur). This variant should run transparently on new Apple Silicon Macs using Apple's Rosetta 2 emulation. \ +\ +Beginning with 3.9.1, we also provide a new "universal2" installer variant that provides universal binaries for both ARM64 and Intel 64 architectures and is also supported on all Macs that support macOS 10.9 or later. Some of the advantages of the new installer variant: native ARM64 code on Apple Silicon Macs should run significantly faster than Rosetta2-emulated code; some operating system functions and options introduced in macOS releases since 10.9 are now exposed when available (primarily in the os module); binary wheels built for use with the current 10.9 variant *should* also work with the new variant; the new installer variant includes Tcl/Tk 8.6.10 rather than 8.6.8.\ +\ +Because of the scope of changes needed to fully support 11.0 and Apple Silicon Macs, the new "universal2" variant should be considered +\f2\i experimental +\f0\i0 in the 3.9.1 release. You may need to upgrade third-party components, like pip, to later versions once they are released. You may experience differences in behavior in IDLE and other Tk-based applications due to using the newer version of Tk. As always, if you encounter problems when using this installer variant, please check {\field{\*\fldinst{HYPERLINK "https://bugs.python.org"}}{\fldrslt https://bugs.python.org}} for existing reports and for opening new issues.\ \f1\b \ul \ Other changes\ diff --git a/Mac/BuildScript/resources/Welcome.rtf b/Mac/BuildScript/resources/Welcome.rtf index ce53bd78bbd46a3f0f2f598e459fc63e6184773c..407c22586b3f0fb67c8e97019be4ad5edaa19eea 100644 --- a/Mac/BuildScript/resources/Welcome.rtf +++ b/Mac/BuildScript/resources/Welcome.rtf @@ -1,5 +1,5 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf600 -\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fswiss\fcharset0 Helvetica-Bold;\f2\fmodern\fcharset0 CourierNewPSMT; +{\rtf1\ansi\ansicpg1252\cocoartf2513 +\cocoascreenfonts1\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fswiss\fcharset0 Helvetica-Bold;\f2\fmodern\fcharset0 CourierNewPSMT; } {\colortbl;\red255\green255\blue255;} {\*\expandedcolortbl;;} diff --git a/Mac/BuildScript/scripts/postflight.patch-profile b/Mac/BuildScript/scripts/postflight.patch-profile index 0a62e327f51b389aa0c27fdd96291bbe1fd14f24..68b8e4bb044e1008d53ad067524e0955abdb188b 100755 --- a/Mac/BuildScript/scripts/postflight.patch-profile +++ b/Mac/BuildScript/scripts/postflight.patch-profile @@ -20,7 +20,7 @@ fi # Make sure the directory ${PYTHON_ROOT}/bin is on the users PATH. BSH="`basename "${theShell}"`" case "${BSH}" in -bash|ksh|sh|*csh|zsh) +bash|ksh|sh|*csh|zsh|fish) if [ `id -ur` = 0 ]; then P=`su - ${USER} -c 'echo A-X-4-X@@$PATH@@X-4-X-A' | grep 'A-X-4-X@@.*@@X-4-X-A' | sed -e 's/^A-X-4-X@@//g' -e 's/@@X-4-X-A$//g'` else @@ -76,6 +76,22 @@ bash) PR="${HOME}/.bash_profile" fi ;; +fish) + CONFIG_DIR="${HOME}/.config/fish" + RC="${CONFIG_DIR}/config.fish" + mkdir -p "$CONFIG_DIR" + if [ -f "${RC}" ]; then + cp -fp "${RC}" "${RC}.pysave" + fi + echo "" >> "${RC}" + echo "# Setting PATH for Python ${PYVER}" >> "${RC}" + echo "# The original version is saved in ${RC}.pysave" >> "${RC}" + echo "set -x PATH \"${PYTHON_ROOT}/bin\" \"\$PATH\"" >> "${RC}" + if [ `id -ur` = 0 ]; then + chown "${USER}" "${RC}" + fi + exit 0 + ;; zsh) PR="${HOME}/.zprofile" ;; diff --git a/Mac/IDLE/IDLE.app/Contents/Info.plist b/Mac/IDLE/IDLE.app/Contents/Info.plist index dcc48abdd2a395aa7605170c0b3cf71c18af8635..f6b5cfe8d5451f7a7e2d60b8ee1706908494dc0c 100644 --- a/Mac/IDLE/IDLE.app/Contents/Info.plist +++ b/Mac/IDLE/IDLE.app/Contents/Info.plist @@ -36,7 +36,7 @@ CFBundleExecutable IDLE CFBundleGetInfoString - %version%, © 2001-2020 Python Software Foundation + %version%, © 2001-2021 Python Software Foundation CFBundleIconFile IDLE.icns CFBundleIdentifier diff --git a/Mac/PythonLauncher/Info.plist.in b/Mac/PythonLauncher/Info.plist.in index 21a051535fb92523a37a2cc92ebc52e79f28eb20..3d8bc3e4154ee28a3636d5b77c34c026b3a42476 100644 --- a/Mac/PythonLauncher/Info.plist.in +++ b/Mac/PythonLauncher/Info.plist.in @@ -40,7 +40,7 @@ CFBundleExecutable Python Launcher CFBundleGetInfoString - %VERSION%, © 2001-2020 Python Software Foundation + %VERSION%, © 2001-2021 Python Software Foundation CFBundleIconFile PythonLauncher.icns CFBundleIdentifier diff --git a/Mac/README.rst b/Mac/README.rst index ec7d873df277d7eadb6bff4a4d03359180e40fe8..f3638aa0019aaf0ce42eb11cd1d766516efca9a5 100644 --- a/Mac/README.rst +++ b/Mac/README.rst @@ -120,6 +120,8 @@ support ppc (Xcode 4 on 10.6 and later systems). The flavor can be specified using the configure option ``--with-universal-archs=VALUE``. The following values are available: + * ``universal2``: ``arm64``, ``x86_64`` + * ``intel``: ``i386``, ``x86_64`` * ``intel-32``: ``i386`` @@ -155,6 +157,8 @@ following combinations of SDKs and universal-archs flavors are available: * 10.15 and later SDKs support ``intel-64`` only + * 11.0 and later SDKs support ``universal2`` + The makefile for a framework build will also install ``python3.x-32`` binaries when the universal architecture includes at least one 32-bit architecture (that is, for all flavors but ``64-bit`` and ``intel-64``). @@ -352,6 +356,39 @@ A framework install also installs some applications in ``/Applications/Python X. And lastly a framework installation installs files in ``/usr/local/bin``, all of them symbolic links to files in ``/Library/Frameworks/Python.framework/Versions/X.Y/bin``. +Weak linking support +==================== + +The CPython sources support building with the latest SDK while targetting deployment +to macOS 10.9. This is done through weak linking of symbols introduced in macOS +10.10 or later and checking for their availability at runtime. + +This requires the use of Apple's compiler toolchain on macOS 10.13 or later. + +The basic implementation pattern is: + +* ``HAVE_`` is a macro defined (or not) by the configure script + +* ``HAVE__RUNTIME`` is a macro defined in the relevant source + files. This expands to a call to ``__builtin_available`` when using + a new enough Apple compiler, and to a true value otherwise. + +* Use ``HAVE__RUNTIME`` before calling ````. This macro + *must* be used a the sole expression in an if statement:: + + if (HAVE__RUNTIME) { + /* is available */ + } + + Or: + + if (HAVE__RUNTIME) {} else { + /* is not available */ + } + + Using other patterns (such as ``!HAVE__RUNTIME``) is not supported + by Apple's compilers. + Resources ========= diff --git a/Mac/Resources/app/Info.plist.in b/Mac/Resources/app/Info.plist.in index 1d624984a852038c4b40051ef4a7de83d608fe00..2c801332332b30fa2906a0de0cff5f9cb18e55a3 100644 --- a/Mac/Resources/app/Info.plist.in +++ b/Mac/Resources/app/Info.plist.in @@ -37,7 +37,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - %version%, (c) 2001-2020 Python Software Foundation. + %version%, (c) 2001-2021 Python Software Foundation. CFBundleName Python CFBundlePackageType diff --git a/Mac/Tools/pythonw.c b/Mac/Tools/pythonw.c index c8bd3ba8d68c1531310d2152a1e38efb7ce1aefb..78813e818e7dace8f744113f7a587e64b0454dfd 100644 --- a/Mac/Tools/pythonw.c +++ b/Mac/Tools/pythonw.c @@ -95,9 +95,6 @@ setup_spawnattr(posix_spawnattr_t* spawnattr) size_t count; cpu_type_t cpu_types[1]; short flags = 0; -#ifdef __LP64__ - int ch; -#endif if ((errno = posix_spawnattr_init(spawnattr)) != 0) { err(2, "posix_spawnattr_int"); @@ -119,10 +116,16 @@ setup_spawnattr(posix_spawnattr_t* spawnattr) #elif defined(__ppc__) cpu_types[0] = CPU_TYPE_POWERPC; + #elif defined(__i386__) cpu_types[0] = CPU_TYPE_X86; + +#elif defined(__arm64__) + cpu_types[0] = CPU_TYPE_ARM64; + #else # error "Unknown CPU" + #endif if (posix_spawnattr_setbinpref_np(spawnattr, count, @@ -220,7 +223,8 @@ main(int argc, char **argv) { /* We're weak-linking to posix-spawnv to ensure that * an executable build on 10.5 can work on 10.4. */ - if (posix_spawn != NULL) { + + if (&posix_spawn != NULL) { posix_spawnattr_t spawnattr = NULL; setup_spawnattr(&spawnattr); diff --git a/Makefile.pre.in b/Makefile.pre.in index a914a9c70f6794e21b24dd9ddd4abae8507f9bfe..f128444b98594e17d428a2eec56658bd337b3c3a 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -143,11 +143,12 @@ LIBDIR= @libdir@ MANDIR= @mandir@ INCLUDEDIR= @includedir@ CONFINCLUDEDIR= $(exec_prefix)/include -SCRIPTDIR= $(prefix)/lib +PLATLIBDIR= @PLATLIBDIR@ +SCRIPTDIR= $(prefix)/$(PLATLIBDIR) ABIFLAGS= @ABIFLAGS@ # Detailed destination directories -BINLIBDEST= $(LIBDIR)/python$(VERSION) +BINLIBDEST= @BINLIBDEST@ LIBDEST= $(SCRIPTDIR)/python$(VERSION) INCLUDEPY= $(INCLUDEDIR)/python$(LDVERSION) CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$(LDVERSION) @@ -160,6 +161,10 @@ BLDSHARED= @BLDSHARED@ $(PY_CORE_LDFLAGS) LDCXXSHARED= @LDCXXSHARED@ DESTSHARED= $(BINLIBDEST)/lib-dynload +# List of exported symbols for AIX +EXPORTSYMS= @EXPORTSYMS@ +EXPORTSFROM= @EXPORTSFROM@ + # Executable suffix (.exe on Windows and Mac OS X) EXE= @EXEEXT@ BUILDEXE= @BUILDEXEEXT@ @@ -196,6 +201,9 @@ OPENSSL_INCLUDES=@OPENSSL_INCLUDES@ OPENSSL_LIBS=@OPENSSL_LIBS@ OPENSSL_LDFLAGS=@OPENSSL_LDFLAGS@ +# Default zoneinfo.TZPATH. Added here to expose it in sysconfig.get_config_var +TZPATH=@TZPATH@ + # Modes for directories, executables and data files created by the # install process. Default to user-only-writable for all file types. DIRMODE= 755 @@ -243,7 +251,7 @@ LIBOBJS= @LIBOBJS@ PYTHON= python$(EXE) BUILDPYTHON= python$(BUILDEXE) -PYTHON_FOR_REGEN=@PYTHON_FOR_REGEN@ +PYTHON_FOR_REGEN?=@PYTHON_FOR_REGEN@ UPDATE_FILE=@PYTHON_FOR_REGEN@ $(srcdir)/Tools/scripts/update_file.py PYTHON_FOR_BUILD=@PYTHON_FOR_BUILD@ _PYTHON_HOST_PLATFORM=@_PYTHON_HOST_PLATFORM@ @@ -294,6 +302,19 @@ LIBFFI_INCLUDEDIR= @LIBFFI_INCLUDEDIR@ ########################################################################## # Parser + +PEGEN_OBJS= \ + Parser/pegen/pegen.o \ + Parser/pegen/parse.o \ + Parser/pegen/parse_string.o \ + Parser/pegen/peg_api.o + + +PEGEN_HEADERS= \ + $(srcdir)/Include/internal/pegen_interface.h \ + $(srcdir)/Parser/pegen/pegen.h \ + $(srcdir)/Parser/pegen/parse_string.h + POBJS= \ Parser/acceler.o \ Parser/grammar1.o \ @@ -302,9 +323,10 @@ POBJS= \ Parser/parser.o \ Parser/token.o \ -PARSER_OBJS= $(POBJS) Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o +PARSER_OBJS= $(POBJS) $(PEGEN_OBJS) Parser/myreadline.o Parser/parsetok.o Parser/tokenizer.o PARSER_HEADERS= \ + $(PEGEN_HEADERS) \ $(srcdir)/Include/grammar.h \ $(srcdir)/Include/parsetok.h \ $(srcdir)/Parser/parser.h \ @@ -336,6 +358,7 @@ PYTHON_OBJS= \ Python/getversion.o \ Python/graminit.o \ Python/hamt.o \ + Python/hashtable.o \ Python/import.o \ Python/importdl.o \ Python/initconfig.o \ @@ -392,6 +415,7 @@ OBJECT_OBJS= \ Objects/descrobject.o \ Objects/enumobject.o \ Objects/exceptions.o \ + Objects/genericaliasobject.o \ Objects/genobject.o \ Objects/fileobject.o \ Objects/floatobject.o \ @@ -461,7 +485,7 @@ check-clean-src: # Profile generation build must start from a clean tree. profile-clean-stamp: - $(MAKE) clean profile-removal + $(MAKE) clean touch $@ # Compile with profile generation enabled. @@ -485,7 +509,7 @@ profile-run-stamp: $(MAKE) run_profile_task $(MAKE) build_all_merge_profile # Remove profile generation binary since we are done with it. - $(MAKE) clean + $(MAKE) clean-retain-profile # This is an expensive target to build and it does not have proper # makefile dependency information. So, we create a "stamp" file # to record its completion and avoid re-running it. @@ -512,8 +536,8 @@ profile-opt: profile-run-stamp .PHONY=coverage coverage-lcov coverage-report coverage: @echo "Building with support for coverage checking:" - $(MAKE) clean profile-removal - $(MAKE) @DEF_MAKE_RULE@ CFLAGS="$(CFLAGS) -O0 -pg -fprofile-arcs -ftest-coverage" LIBS="$(LIBS) -lgcov" + $(MAKE) clean + $(MAKE) @DEF_MAKE_RULE@ CFLAGS="$(CFLAGS) -O0 -pg --coverage" LIBS="$(LIBS) --coverage" coverage-lcov: @echo "Creating Coverage HTML report with LCOV:" @@ -562,7 +586,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c $(PYTHON_FOR_REGEN) $(srcdir)/Tools/clinic/clinic.py --make --srcdir $(srcdir) # Build the interpreter -$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) +$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) $(EXPORTSYMS) $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) platform: $(BUILDPYTHON) pybuilddir.txt @@ -634,6 +658,10 @@ libpython$(LDVERSION).dylib: $(LIBRARY_OBJS) libpython$(VERSION).sl: $(LIBRARY_OBJS) $(LDSHARED) -o $@ $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) +# List of exported symbols for AIX +Modules/python.exp: $(LIBRARY) + $(srcdir)/Modules/makexp_aix $@ "$(EXPORTSFROM)" $? + # Copy up the gdb python hooks into a position where they can be automatically # loaded by gdb during Lib/test/test_gdb.py # @@ -693,7 +721,7 @@ Makefile Modules/config.c: Makefile.pre \ @echo "The Makefile was updated, you may need to re-run make." -Programs/_testembed: Programs/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) +Programs/_testembed: Programs/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) $(EXPORTSYMS) $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) ############################################################################ @@ -730,7 +758,8 @@ regen-importlib: Programs/_freeze_importlib # Regenerate all generated files regen-all: regen-opcode regen-opcode-targets regen-typeslots regen-grammar \ - regen-token regen-keyword regen-symbol regen-ast regen-importlib clinic + regen-token regen-keyword regen-symbol regen-ast regen-importlib clinic \ + regen-pegen-metaparser regen-pegen ############################################################################ # Special rules for object files @@ -788,6 +817,11 @@ Python/sysmodule.o: $(srcdir)/Python/sysmodule.c Makefile $(srcdir)/Include/pydt $(MULTIARCH_CPPFLAGS) \ -o $@ $(srcdir)/Python/sysmodule.c +Python/initconfig.o: $(srcdir)/Python/initconfig.c + $(CC) -c $(PY_CORE_CFLAGS) \ + -DPLATLIBDIR='"$(PLATLIBDIR)"' \ + -o $@ $(srcdir)/Python/initconfig.c + $(IO_OBJS): $(IO_H) .PHONY: regen-grammar @@ -802,19 +836,35 @@ regen-grammar: regen-token $(UPDATE_FILE) $(srcdir)/Include/graminit.h $(srcdir)/Include/graminit.h.new $(UPDATE_FILE) $(srcdir)/Python/graminit.c $(srcdir)/Python/graminit.c.new +.PHONY: regen-pegen-metaparser +regen-pegen-metaparser: + @$(MKDIR_P) $(srcdir)/Tools/peg_generator/pegen + PYTHONPATH=$(srcdir)/Tools/peg_generator $(PYTHON_FOR_REGEN) -m pegen -q python \ + $(srcdir)/Tools/peg_generator/pegen/metagrammar.gram \ + -o $(srcdir)/Tools/peg_generator/pegen/grammar_parser.py.new + $(UPDATE_FILE) $(srcdir)/Tools/peg_generator/pegen/grammar_parser.py \ + $(srcdir)/Tools/peg_generator/pegen/grammar_parser.py.new + +.PHONY: regen-pegen +regen-pegen: + @$(MKDIR_P) $(srcdir)/Parser/pegen + PYTHONPATH=$(srcdir)/Tools/peg_generator $(PYTHON_FOR_REGEN) -m pegen -q c \ + $(srcdir)/Grammar/python.gram \ + $(srcdir)/Grammar/Tokens \ + -o $(srcdir)/Parser/pegen/parse.new.c + $(UPDATE_FILE) $(srcdir)/Parser/pegen/parse.c $(srcdir)/Parser/pegen/parse.new.c + .PHONY=regen-ast regen-ast: - # Regenerate Include/Python-ast.h using Parser/asdl_c.py -h + # Regenerate Include/Python-ast.h and Python/Python-ast.c using Parser/asdl_c.py $(MKDIR_P) $(srcdir)/Include - $(PYTHON_FOR_REGEN) $(srcdir)/Parser/asdl_c.py \ - -h $(srcdir)/Include/Python-ast.h.new \ - $(srcdir)/Parser/Python.asdl - $(UPDATE_FILE) $(srcdir)/Include/Python-ast.h $(srcdir)/Include/Python-ast.h.new - # Regenerate Python/Python-ast.c using Parser/asdl_c.py -c $(MKDIR_P) $(srcdir)/Python $(PYTHON_FOR_REGEN) $(srcdir)/Parser/asdl_c.py \ - -c $(srcdir)/Python/Python-ast.c.new \ - $(srcdir)/Parser/Python.asdl + $(srcdir)/Parser/Python.asdl \ + -H $(srcdir)/Include/Python-ast.h.new \ + -C $(srcdir)/Python/Python-ast.c.new + + $(UPDATE_FILE) $(srcdir)/Include/Python-ast.h $(srcdir)/Include/Python-ast.h.new $(UPDATE_FILE) $(srcdir)/Python/Python-ast.c $(srcdir)/Python/Python-ast.c.new .PHONY: regen-opcode @@ -851,9 +901,10 @@ regen-token: .PHONY: regen-keyword regen-keyword: - # Regenerate Lib/keyword.py from Grammar/Grammar and Grammar/Tokens - # using Parser/pgen - PYTHONPATH=$(srcdir) $(PYTHON_FOR_REGEN) -m Parser.pgen.keywordgen $(srcdir)/Grammar/Grammar \ + # Regenerate Lib/keyword.py from Grammar/python.gram and Grammar/Tokens + # using Tools/peg_generator/pegen + PYTHONPATH=$(srcdir)/Tools/peg_generator $(PYTHON_FOR_REGEN) -m pegen.keywordgen \ + $(srcdir)/Grammar/python.gram \ $(srcdir)/Grammar/Tokens \ $(srcdir)/Lib/keyword.py.new $(UPDATE_FILE) $(srcdir)/Lib/keyword.py $(srcdir)/Lib/keyword.py.new @@ -970,7 +1021,6 @@ PYTHON_HEADERS= \ $(srcdir)/Include/bltinmodule.h \ $(srcdir)/Include/boolobject.h \ $(srcdir)/Include/bytearrayobject.h \ - $(srcdir)/Include/bytes_methods.h \ $(srcdir)/Include/bytesobject.h \ $(srcdir)/Include/cellobject.h \ $(srcdir)/Include/ceval.h \ @@ -982,7 +1032,6 @@ PYTHON_HEADERS= \ $(srcdir)/Include/context.h \ $(srcdir)/Include/descrobject.h \ $(srcdir)/Include/dictobject.h \ - $(srcdir)/Include/dtoa.h \ $(srcdir)/Include/dynamic_annotations.h \ $(srcdir)/Include/enumobject.h \ $(srcdir)/Include/errcode.h \ @@ -1022,6 +1071,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/pydtrace.h \ $(srcdir)/Include/pyerrors.h \ $(srcdir)/Include/pyfpe.h \ + $(srcdir)/Include/pyframe.h \ $(srcdir)/Include/pyhash.h \ $(srcdir)/Include/pylifecycle.h \ $(srcdir)/Include/pymacconfig.h \ @@ -1057,10 +1107,19 @@ PYTHON_HEADERS= \ $(srcdir)/Include/Python-ast.h \ \ $(srcdir)/Include/cpython/abstract.h \ + $(srcdir)/Include/cpython/bytearrayobject.h \ + $(srcdir)/Include/cpython/bytesobject.h \ + $(srcdir)/Include/cpython/ceval.h \ + $(srcdir)/Include/cpython/code.h \ $(srcdir)/Include/cpython/dictobject.h \ $(srcdir)/Include/cpython/fileobject.h \ + $(srcdir)/Include/cpython/fileutils.h \ + $(srcdir)/Include/cpython/frameobject.h \ + $(srcdir)/Include/cpython/import.h \ $(srcdir)/Include/cpython/initconfig.h \ $(srcdir)/Include/cpython/interpreteridobject.h \ + $(srcdir)/Include/cpython/listobject.h \ + $(srcdir)/Include/cpython/methodobject.h \ $(srcdir)/Include/cpython/object.h \ $(srcdir)/Include/cpython/objimpl.h \ $(srcdir)/Include/cpython/pyerrors.h \ @@ -1072,17 +1131,25 @@ PYTHON_HEADERS= \ $(srcdir)/Include/cpython/tupleobject.h \ $(srcdir)/Include/cpython/unicodeobject.h \ \ + $(srcdir)/Include/internal/pycore_abstract.h \ $(srcdir)/Include/internal/pycore_accu.h \ $(srcdir)/Include/internal/pycore_atomic.h \ + $(srcdir)/Include/internal/pycore_byteswap.h \ + $(srcdir)/Include/internal/pycore_bytes_methods.h \ + $(srcdir)/Include/internal/pycore_call.h \ $(srcdir)/Include/internal/pycore_ceval.h \ $(srcdir)/Include/internal/pycore_code.h \ $(srcdir)/Include/internal/pycore_condvar.h \ $(srcdir)/Include/internal/pycore_context.h \ + $(srcdir)/Include/internal/pycore_dtoa.h \ $(srcdir)/Include/internal/pycore_fileutils.h \ $(srcdir)/Include/internal/pycore_getopt.h \ $(srcdir)/Include/internal/pycore_gil.h \ $(srcdir)/Include/internal/pycore_hamt.h \ + $(srcdir)/Include/internal/pycore_hashtable.h \ + $(srcdir)/Include/internal/pycore_import.h \ $(srcdir)/Include/internal/pycore_initconfig.h \ + $(srcdir)/Include/internal/pycore_interp.h \ $(srcdir)/Include/internal/pycore_object.h \ $(srcdir)/Include/internal/pycore_pathconfig.h \ $(srcdir)/Include/internal/pycore_pyerrors.h \ @@ -1090,6 +1157,8 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_pylifecycle.h \ $(srcdir)/Include/internal/pycore_pymem.h \ $(srcdir)/Include/internal/pycore_pystate.h \ + $(srcdir)/Include/internal/pycore_runtime.h \ + $(srcdir)/Include/internal/pycore_sysmodule.h \ $(srcdir)/Include/internal/pycore_traceback.h \ $(srcdir)/Include/internal/pycore_tupleobject.h \ $(srcdir)/Include/internal/pycore_warnings.h \ @@ -1332,6 +1401,7 @@ LIBSUBDIRS= tkinter tkinter/test tkinter/test/test_tkinter \ test/test_import/data/circular_imports/subpkg \ test/test_import/data/package \ test/test_import/data/package2 \ + test/test_import/data/unwritable \ importlib \ importlib/metadata \ test/test_importlib \ @@ -1372,6 +1442,7 @@ LIBSUBDIRS= tkinter tkinter/test tkinter/test/test_tkinter \ test/test_importlib/source \ test/test_importlib/zipdata01 \ test/test_importlib/zipdata02 \ + test/test_zoneinfo test/test_zoneinfo/data \ test/ziptestdata \ asyncio \ test/test_asyncio \ @@ -1387,12 +1458,14 @@ LIBSUBDIRS= tkinter tkinter/test tkinter/test/test_tkinter \ ctypes ctypes/test ctypes/macholib \ idlelib idlelib/Icons idlelib/idle_test \ distutils distutils/command distutils/tests $(XMLLIBSUBDIRS) \ + test/test_peg_generator \ test/test_tools test/test_warnings test/test_warnings/data \ turtledemo \ multiprocessing multiprocessing/dummy \ unittest unittest/test unittest/test/testmock \ venv venv/scripts venv/scripts/common venv/scripts/posix \ - curses pydoc_data + curses pydoc_data \ + zoneinfo libinstall: build_all $(srcdir)/Modules/xxmodule.c @for i in $(SCRIPTDIR) $(LIBDEST); \ do \ @@ -1435,6 +1508,7 @@ libinstall: build_all $(srcdir)/Modules/xxmodule.c *CVS) ;; \ *.py[co]) ;; \ *.orig) ;; \ + *wininst-*.exe) ;; \ *~) ;; \ *) \ if test -d $$i; then continue; fi; \ @@ -1753,10 +1827,13 @@ docclean: -rm -rf Doc/build -rm -rf Doc/tools/sphinx Doc/tools/pygments Doc/tools/docutils -clean: pycremoval +# like the 'clean' target but retain the profile guided optimization (PGO) +# data. The PGO data is only valid if source code remains unchanged. +clean-retain-profile: pycremoval find . -name '*.[oa]' -exec rm -f {} ';' find . -name '*.s[ol]' -exec rm -f {} ';' find . -name '*.so.[0-9]*.[0-9]*' -exec rm -f {} ';' + find . -name '*.lst' -exec rm -f {} ';' find build -name 'fficonfig.h' -exec rm -f {} ';' || true find build -name '*.py' -exec rm -f {} ';' || true find build -name '*.py[co]' -exec rm -f {} ';' || true @@ -1775,14 +1852,19 @@ profile-removal: rm -rf $(COVERAGE_REPORT) rm -f profile-run-stamp -clobber: clean profile-removal +clean: clean-retain-profile + @if test @DEF_MAKE_ALL_RULE@ = profile-opt; then \ + rm -f profile-gen-stamp profile-clean-stamp; \ + $(MAKE) profile-removal; \ + fi + +clobber: clean -rm -f $(BUILDPYTHON) $(LIBRARY) $(LDLIBRARY) $(DLLLIBRARY) \ tags TAGS \ config.cache config.log pyconfig.h Modules/config.c -rm -rf build platform -rm -rf $(PYTHONFRAMEWORKDIR) -rm -f python-config.py python-config - -rm -f profile-gen-stamp profile-clean-stamp # Make things extra clean, before making a distribution: # remove all generated files, even Makefile[.pre] @@ -1856,6 +1938,8 @@ Python/thread.o: @THREADHEADERS@ $(srcdir)/Python/condvar.h .PHONY: frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools .PHONY: frameworkaltinstallunixtools recheck clean clobber distclean .PHONY: smelly funny patchcheck touch altmaninstall commoninstall +.PHONY: clean-retain-profile profile-removal run_profile_task +.PHONY: build_all_generate_profile build_all_merge_profile .PHONY: gdbhooks # IF YOU PUT ANYTHING HERE IT WILL GO AWAY diff --git a/Misc/ACKS b/Misc/ACKS index a08e917b30765a13846cbdeab60b83e798c6ae6e..73d35c2d86bdc01d1b110360ae536906ba6aeffe 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -12,6 +12,7 @@ PS: In the standard Python distribution, this file is encoded in UTF-8 and the list is in rough alphabetical order by last names. Aahz +Erlend Egeberg Aasland Edison Abahurire Michael Abbott Rajiv Abraham @@ -23,6 +24,7 @@ Eitan Adler Anton Afanasyev Ali Afshar Nitika Agarwal +Anjani Agrawal Pablo S. Blum de Aguiar Jim Ahlstrom Farhan Ahmad @@ -45,6 +47,7 @@ Rose Ames A. Amoroso Mark Anacker Shashwat Anand +Ananthakrishnan Anders Andersen Tycho Andersen John Anderson @@ -67,6 +70,7 @@ Alexandru Ardelean Emmanuel Arias Alicia Arlen Jeffrey Armstrong +Justin Turner Arthur Jason Asbahr David Ascher Ammar Askar @@ -84,8 +88,10 @@ Marcin Bachry Alfonso Baciero Dwayne Bailey Stig Bakken +Lumír Balhar Aleksandr Balezin Greg Ball +Lewis Ball Luigi Ballabio Thomas Ballinger Jeff Balogh @@ -186,6 +192,7 @@ Gawain Bolton Carl Friedrich Bolz-Tereick Forest Bond Gregory Bond +Angelin Booz Médéric Boquien Matias Bordese Jonas Borgström @@ -232,13 +239,16 @@ Floris Bruynooghe Matt Bryant Stan Bubrouski Brandt Bucher +Curtis Bucher Colm Buckley Erik de Bueger Jan-Hein Bührman Lars Buitinck +Artem Bulgakov Dick Bulterman Bill Bumgarner Jimmy Burgett +Charles Burkland Edmond Burnett Tommy Burnette Roger Burnham @@ -257,6 +267,7 @@ Ben Caller Arnaud Calmettes Daniel Calvelo Tony Campbell +Giovanni Cappellotto Brett Cannon Tristan Carel Mike Carlton @@ -285,6 +296,7 @@ Brad Chapman Greg Chapman Mitch Chapman Matt Chaput +William Chargin Yogesh Chaudhari David Chaum Nicolas Chauvat @@ -309,6 +321,7 @@ Gilles Civario Chris Clark Diana Clarke Laurie Clark-Michalek +Alexander Clarkson Mike Clarkson Andrew Clegg Brad Clements @@ -324,6 +337,7 @@ Benjamin Collar Jeffery Collins Robert Collins Paul Colomiets +Samuel Colvin Christophe Combelles Geremy Condra Denver Coneybeare @@ -363,8 +377,10 @@ Tom Culliton Raúl Cumplido Antonio Cuni Brian Curtin +Jason Curtis Hakan Celik Paul Dagnelie +Florian Dahlitz Lisandro Dalcin Darren Dale Andrew Dalke @@ -420,6 +436,7 @@ Marcos Donolo Dima Dorfman Yves Dorfsman Michael Dorman +Andrey Doroschenko Steve Dower Allen Downey Cesar Douady @@ -447,6 +464,7 @@ Rodolpho Eckhardt Ulrich Eckhardt David Edelsohn John Edmonds +Benjamin Edwards Grant Edwards Zvi Effron John Ehresman @@ -465,6 +483,7 @@ Tom Epperly Gökcen Eraslan Stoffel Erasmus Jürgen A. Erhard +Florian Ernst Michael Ernst Ben Escoto Andy Eskilsson @@ -506,6 +525,7 @@ Tomer Filiba Segev Finer Jeffrey Finkelstein Russell Finn +Neal Finne Dan Finnie Nils Fischbeck Frederik Fix @@ -553,11 +573,13 @@ Riccardo Attilio Galli Raymund Galvin Nitin Ganatra Fred Gansevles +Paul Ganssle Lars Marius Garshol Jake Garver Dan Gass Tim Gates Andrew Gaul +Lewis Gaul Matthieu Gautier Stephen M. Gava Xavier de Gaye @@ -641,6 +663,7 @@ Mark Hammond Harald Hanche-Olsen Manus Hand Milton L. Hankins +Carl Bordum Hansen Stephen Hansen Barry Hantman Lynda Hardman @@ -651,6 +674,7 @@ David Harrigan Brian Harring Jonathan Hartley Travis B. Hartwell +Henrik Harutyunyan Shane Harvey Larry Hastings Tim Hatch @@ -658,6 +682,7 @@ Zac Hatfield-Dodds Shane Hathaway Michael Haubenwallner Janko Hauser +Flavian Hautbois Rycharde Hawkes Ben Hayden Jochen Hayek @@ -719,6 +744,7 @@ Rob Hooft Michiel de Hoon Brian Hooper Randall Hopper +Tim Hopper Nadav Horesh Alon Horev Jan Hosang @@ -737,6 +763,7 @@ Lawrence Hudson Michael Hudson Jim Hugunin Greg Humphreys +Chris Hunt Eric Huss Nehal Hussain Taihyun Hwang @@ -745,6 +772,7 @@ Ludwig Hähne Gerhard Häring Fredrik Håård Florian Höch +Oleg Höfling Robert Hölzl Catalin Iacob Mihai Ibanescu @@ -757,6 +785,7 @@ Meador Inge Peter Ingebretson Tony Ingraldi John Interrante +Dean Inwood Bob Ippolito Roger Irwin Atsuo Ishimoto @@ -827,6 +856,7 @@ Jan Kanis Rafe Kaplan Jacob Kaplan-Moss Allison Kaptur +Yurii Karabas Janne Karila Per Øyvind Karlsen Anton Kasyanov @@ -837,6 +867,7 @@ Dmitry Kazakov Brian Kearns Sebastien Keim Ryan Kelly +Hugo van Kemenade Dan Kenigsberg Randall Kern Robert Kern @@ -849,6 +880,7 @@ Dhiru Kholia Artem Khramov Akshit Khurana Sanyam Khurana +Tyler Kieft Mads Kiilerich Jason Killen Jan Kim @@ -991,6 +1023,7 @@ Robert Li Xuanji Li Zekun Li Zheao Li +Dan Lidral-Porter Robert van Liere Ross Light Shawn Ligocki @@ -1099,6 +1132,7 @@ Ezio Melotti Doug Mennella Dimitri Merejkowsky Brian Merrell +Bruce Merry Alexis Métaireau Luke Mewburn Carl Meyer @@ -1213,10 +1247,12 @@ Elena Oat Jon Oberheide Milan Oberkirch Pascal Oberndoerfer +Géry Ogam Jeffrey Ollie Adam Olsen Bryan Olson Grant Olson +Furkan Onder Koray Oner Ethan Onstott Piet van Oostrum @@ -1408,6 +1444,7 @@ Mark Roddy Kevin Rodgers Sean Rodman Giampaolo Rodola +Dustin Rodrigues Mauro S. M. Rodrigues Elson Rodriguez Adi Roiban @@ -1417,6 +1454,7 @@ Mike Romberg Armin Ronacher Case Roole Timothy Roscoe +Joel Rosdahl Erik Rose Mark Roseman Josh Rosenberg @@ -1505,6 +1543,7 @@ Steven Scott Nick Seidenman Michael Seifert Žiga Seilnacht +Jendrik Seipp Michael Selik Yury Selivanov Fred Sells @@ -1553,6 +1592,7 @@ Kirill Simonov Nathan Paul Simons Guilherme Simões Adam Simpkins +Karthikeyan Singaravelan Mandeep Singh Ravi Sinha Janne Sinkkonen @@ -1563,6 +1603,7 @@ J. Sipprell Ngalim Siregar Kragen Sitaker Kaartic Sivaraam +Roman Skurikhin Ville Skyttä Michael Sloan Nick Sloan @@ -1600,6 +1641,8 @@ Tage Stabell-Kulo Quentin Stafford-Fraser Frank Stajano Joel Stanley +Kyle Stanley +Brandon Stansbury Anthony Starks David Steele Oliver Steele @@ -1636,6 +1679,7 @@ Hisao Suzuki Kalle Svensson Andrew Svetlov Paul Swartz +Dennis Sweeney Al Sweigart Sviatoslav Sydorenko Thenault Sylvain @@ -1658,6 +1702,7 @@ William Tanksley Christian Tanzer Steven Taschuk Batuhan Taskaya +Stefan Tatschner Amy Taylor Julian Taylor Monty Taylor @@ -1676,6 +1721,7 @@ Févry Thibault Lowe Thiderman Nicolas M. Thiéry James Thomas +Reuben Thomas Robin Thomas Brian Thorne Christopher Thorne @@ -1728,6 +1774,7 @@ Roger Upole Daniel Urban Michael Urman Hector Urtubia +Elizabeth Uselton Lukas Vacek Ville Vainio Yann Vaginay @@ -1784,6 +1831,7 @@ Zachary Ware Barry Warsaw Steve Waterbury Bob Watson +Colin Watson David Watson Aaron Watters Henrik Weber @@ -1792,6 +1840,7 @@ Steve Weber Corran Webster Glyn Webster Phil Webster +Antoine Wecxsteen Stefan Wehr Zack Weinberg Bob Weiner @@ -1803,6 +1852,7 @@ Jeff Wheeler Christopher White David White Mats Wichmann +Pete Wicken Marcel Widjaja Truida Wiedijk Felix Wiemann @@ -1826,6 +1876,7 @@ Alex Willmer David Wilson Geoff Wilson Greg V. Wilson +Huon Wilson J Derek Wilson Paul Winkler Jody Winston @@ -1846,6 +1897,7 @@ Klaus-Juergen Wolf Dan Wolfe Richard Wolff Adam Woodbeck +William Woodruff Steven Work Gordon Worley Darren Worrall @@ -1869,6 +1921,7 @@ EungJun Yi Bob Yodlowski Danny Yoo Wonsup Yoon +Andrew York Rory Yorke George Yoshida Kazuhiro Yoshida @@ -1894,5 +1947,7 @@ Jelle Zijlstra Gennadiy Zlobin Doug Zongker Peter Åstrand +Vlad Emelianov +Andrey Doroschenko (Entries should be added in rough alphabetical order by last names) diff --git a/Misc/HISTORY b/Misc/HISTORY index fa5a05fd40fd3ac68ed81b6da159aa667c848746..32b2a37866bc514da88d98039eb59cddca5c2ffd 100644 --- a/Misc/HISTORY +++ b/Misc/HISTORY @@ -2113,7 +2113,7 @@ Build - Issue #21285: Refactor and fix curses configure check to always search in a ncursesw directory. -- Issue #15234: For BerkelyDB and Sqlite, only add the found library and +- Issue #15234: For BerkeleyDB and Sqlite, only add the found library and include directories if they aren't already being searched. This avoids an explicit runtime library dependency. diff --git a/Misc/NEWS b/Misc/NEWS new file mode 100644 index 0000000000000000000000000000000000000000..c438e3f8e906702ef4134b28362c545458795c82 --- /dev/null +++ b/Misc/NEWS @@ -0,0 +1,26333 @@ ++++++++++++ +Python News ++++++++++++ + +What's New in Python 3.9.2 final? +================================= + +*Release date: 2021-02-19* + +Windows +------- + +- bpo-43155: :c:func:`PyCMethod_New` is now present in ``python3.lib``. + + +What's New in Python 3.9.2 release candidate 1? +=============================================== + +*Release date: 2021-02-16* + +Security +-------- + +- bpo-42967: Fix web cache poisoning vulnerability by defaulting the query + args separator to ``&``, and allowing the user to choose a custom + separator. + +- bpo-42938: Avoid static buffers when computing the repr of + :class:`ctypes.c_double` and :class:`ctypes.c_longdouble` values. + +Core and Builtins +----------------- + +- bpo-42819: :mod:`readline`: Explicitly disable bracketed paste in the + interactive interpreter, even if it's set in the inputrc, is enabled by + default (eg GNU Readline 8.1), or a user calls + ``readline.read_init_file()``. The Python REPL has not implemented + bracketed paste support. Also, bracketed mode writes the ``"\x1b[?2004h"`` + escape sequence into stdout which causes test failures in applications + that don't support it. It can still be explicitly enabled by calling + ``readline.parse_and_bind("set enable-bracketed-paste on")``. Patch by + Dustin Rodrigues. + +- bpo-42806: Fix the column offsets for f-strings :mod:`ast` nodes + surrounded by parentheses and for nodes that spawn multiple lines. Patch + by Pablo Galindo. + +- bpo-40631: Fix regression where a single parenthesized starred expression + was a valid assignment target. + +- bpo-32381: Fix encoding name when running a ``.pyc`` file on Windows: + :c:func:`PyRun_SimpleFileExFlags()` now uses the correct encoding to + decode the filename. + +- bpo-42536: Several built-in and standard library types now ensure that + their internal result tuples are always tracked by the :term:`garbage + collector `: + + - :meth:`collections.OrderedDict.items() ` + + - :meth:`dict.items` + + - :func:`enumerate` + + - :func:`functools.reduce` + + - :func:`itertools.combinations` + + - :func:`itertools.combinations_with_replacement` + + - :func:`itertools.permutations` + + - :func:`itertools.product` + + - :func:`itertools.zip_longest` + + - :func:`zip` + + Previously, they could have become untracked by a prior garbage + collection. Patch by Brandt Bucher. + +- bpo-42195: The ``__args__`` of the parameterized generics for + :data:`typing.Callable` and :class:`collections.abc.Callable` are now + consistent. The ``__args__`` for :class:`collections.abc.Callable` are + now flattened while :data:`typing.Callable`'s have not changed. To allow + this change, :class:`types.GenericAlias` can now be subclassed and + ``collections.abc.Callable``'s ``__class_getitem__`` will now return a + subclass of ``types.GenericAlias``. Tests for typing were also updated to + not subclass things like ``Callable[..., T]`` as that is not a valid base + class. Finally, both types no longer validate their ``argtypes``, in + ``Callable[[argtypes], resulttype]`` to prepare for :pep:`612`. Patch by + Ken Jin. + +Library +------- + +- bpo-43102: The namedtuple __new__ method had its __builtins__ set to None + instead of an actual dictionary. This created problems for introspection + tools. + +- bpo-43108: Fixed a reference leak in the :mod:`curses` module. Patch by + Pablo Galindo + +- bpo-42944: Fix ``random.Random.sample`` when ``counts`` argument is not + ``None``. + +- bpo-42931: Add :func:`randbytes` to ``random.__all__``. + +- bpo-42780: Fix os.set_inheritable() for O_PATH file descriptors on Linux. + +- bpo-42851: remove __init_subclass__ support for Enum members + +- bpo-41748: Fix HTMLParser parsing rules for element attributes containing + commas with spaces. Patch by Karl Dubost. + +- bpo-42759: Fixed equality comparison of :class:`tkinter.Variable` and + :class:`tkinter.font.Font`. Objects which belong to different Tcl + interpreters are now always different, even if they have the same name. + +- bpo-42756: Configure LMTP Unix-domain socket to use socket global default + timeout when a timeout is not explicitly provided. + +- bpo-23328: Allow / character in username, password fields on _PROXY + envars. + +- bpo-42655: :mod:`subprocess` *extra_groups* is now correctly passed into + setgroups() system call. + +- bpo-42727: ``EnumMeta.__prepare__`` now accepts ``**kwds`` to properly + support ``__init_subclass__`` + +- bpo-42681: Fixed range checks for color and pair numbers in :mod:`curses`. + +- bpo-37961: Fix crash in :func:`tracemalloc.Traceback.__repr__` (regressed + in Python 3.9). + +- bpo-42630: :mod:`tkinter` functions and constructors which need a default + root window raise now :exc:`RuntimeError` with descriptive message instead + of obscure :exc:`AttributeError` or :exc:`NameError` if it is not created + yet or cannot be created automatically. + +- bpo-42644: `logging.disable` will now validate the types and value of its + parameter. It also now accepts strings representing the levels (as does + `loging.setLevel`) instead of only the numerical values. + +- bpo-36541: Fixed lib2to3.pgen2 to be able to parse PEP-570 positional only + argument syntax. + +- bpo-42517: Enum: private names will raise a DeprecationWarning; in 3.10 + they will become normal attributes + +- bpo-42678: `Enum`: call `__init_subclass__` after members have been added + +- bpo-42532: Remove unexpected call of ``__bool__`` when passing a + ``spec_arg`` argument to a Mock. + +- bpo-42388: Fix subprocess.check_output(..., input=None) behavior when + text=True to be consistent with that of the documentation and + universal_newlines=True. + +- bpo-34463: Fixed discrepancy between :mod:`traceback` and the interpreter + in formatting of SyntaxError with lineno not set (:mod:`traceback` was + changed to match interpreter). + +- bpo-42375: subprocess module update for DragonFlyBSD support. + +- bpo-42384: Make pdb populate sys.path[0] exactly the same as regular + python execution. + +- bpo-42383: Fix pdb: previously pdb would fail to restart the debugging + target if it was specified using a relative path and the current directory + changed. + +- bpo-42318: Fixed support of non-BMP characters in :mod:`tkinter` on macOS. + +- bpo-42163: Restore compatibility for ``uname_result`` around deepcopy and + _replace. + +- bpo-39825: Windows: Change ``sysconfig.get_config_var('EXT_SUFFIX')`` to + the expected full ``platform_tag.extension`` format. Previously it was + hard-coded to ``.pyd``, now it is compatible with ``distutils.sysconfig`` + and will result in something like ``.cp38-win_amd64.pyd``. This brings + windows into conformance with the other platforms. + +- bpo-42059: :class:`typing.TypedDict` types created using the alternative + call-style syntax now correctly respect the ``total`` keyword argument + when setting their ``__required_keys__`` and ``__optional_keys__`` class + attributes. + +- bpo-39101: Fixed tests using IsolatedAsyncioTestCase from hanging on + BaseExceptions. + +- bpo-42005: Fix CLI of :mod:`cProfile` and :mod:`profile` to catch + :exc:`BrokenPipeError`. + +- bpo-41907: fix `format()` behavior for `IntFlag` + +- bpo-41889: Enum: fix regression involving inheriting a multiply-inherited + enum + +- bpo-41891: Ensure asyncio.wait_for waits for task completion + +- bpo-41604: Don't decrement the reference count of the previous user_ptr + when set_panel_userptr fails. + +- bpo-40219: Lowered :class:`tkinter.ttk.LabeledScale` dummy widget to + prevent hiding part of the content label. + +- bpo-40084: Fix ``Enum.__dir__``: dir(Enum.member) now includes attributes + as well as methods. + +- bpo-39068: Fix initialization race condition in :func:`a85encode` and + :func:`b85encode` in :mod:`base64`. Patch by Brandon Stansbury. + +- bpo-33289: Correct call to :mod:`tkinter.colorchooser` to return RGB + triplet of ints instead of floats. Patch by Cheryl Sabella. + +Documentation +------------- + +- bpo-40304: Fix doc for type(name, bases, dict). Patch by Boris + Verkhovskiy and Éric Araujo. + +- bpo-42811: Updated importlib.utils.resolve_name() doc to use + __spec__.parent instead of __package__. (Thanks Yair Frid.) + +- bpo-17140: Add documentation for the + :class:`multiprocessing.pool.ThreadPool` class. + +Tests +----- + +- bpo-42794: Update test_nntplib to use offical group name of news.aioe.org + for testing. Patch by Dong-hee Na. + +- bpo-40810: In :mod:`sqlite3`, fix ``CheckTraceCallbackContent`` for SQLite + pre 3.7.15. + +Build +----- + +- bpo-43174: Windows build now uses ``/utf-8`` compiler option. + +- bpo-42692: Fix __builtin_available check on older compilers. Patch by + Joshua Root. + +- bpo-42604: Now all platforms use a value for the "EXT_SUFFIX" build + variable derived from SOABI (for instance in freeBSD, "EXT_SUFFIX" is now + ".cpython-310d.so" instead of ".so"). Previosuly only Linux, Mac and + VxWorks were using a value for "EXT_SUFFIX" that included "SOABI". + +- bpo-42598: Fix implicit function declarations in configure which could + have resulted in incorrect configuration checks. Patch contributed by + Joshua Root. + +- bpo-29076: Add fish shell support to macOS installer. + +Windows +------- + +- bpo-41837: Updated Windows installer to include OpenSSL 1.1.1i + +- bpo-42584: Upgrade Windows installer to use SQLite 3.34.0. + +macOS +----- + +- bpo-42504: Ensure that the value of + sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') is always a string, + even in when the value is parsable as an integer. + +- bpo-42361: Update macOS installer build to use Tcl/Tk 8.6.11 (rc2, + expected to be final release). + +- bpo-41837: Update macOS installer build to use OpenSSL 1.1.1i. + +- bpo-42584: Update macOS installer to use SQLite 3.34.0. + +IDLE +---- + +- bpo-43008: Make IDLE invoke :func:`sys.excepthook` in normal, 2-process + mode. Patch by Ken Hilton. + +- bpo-33065: Fix problem debugging user classes with __repr__ method. + +- bpo-23544: Disable Debug=>Stack Viewer when user code is running or + Debugger is active, to prevent hang or crash. Patch by Zackery Spytz. + +- bpo-32631: Finish zzdummy example extension module: make menu entries + work; add docstrings and tests with 100% coverage. + +Tools/Demos +----------- + +- bpo-42726: Fixed Python 3 compatibility issue with gdb/libpython.py + handling of attribute dictionaries. + +- bpo-42613: Fix ``freeze.py`` tool to use the prope config and library + directories. Patch by Victor Stinner. + +C API +----- + +- bpo-43030: Fixed a compiler warning in :c:func:`Py_UNICODE_ISSPACE()` on + platforms with signed ``wchar_t``. + +- bpo-42591: Export the :c:func:`Py_FrozenMain` function: fix a Python 3.9.0 + regression. Python 3.9 uses ``-fvisibility=hidden`` and the function was + not exported explicitly and so not exported. + +- bpo-40052: Fix an alignment build warning/error in function + ``PyVectorcall_Function()``. Patch by Andreas Schneider, Antoine Pitrou + and Petr Viktorin. + + +What's New in Python 3.9.1 final? +================================= + +*Release date: 2020-12-07* + +Core and Builtins +----------------- + +- bpo-42576: ``types.GenericAlias`` will now raise a ``TypeError`` when + attempting to initialize with a keyword argument. Previously, this would + cause the interpreter to crash if the interpreter was compiled with debug + symbols. This does not affect interpreters compiled for release. Patch by + Ken Jin. + +Library +------- + +- bpo-5054: CGIHTTPRequestHandler.run_cgi() HTTP_ACCEPT improperly parsed. + Replace the special purpose getallmatchingheaders with generic get_all + method and add relevant tests. + + Original Patch by Martin Panter. Modified by Senthil Kumaran. + +- bpo-17735: :func:`inspect.findsource` now raises :exc:`OSError` instead of + :exc:`IndexError` when :attr:`co_lineno` of a code object is greater than + the file length. This can happen, for example, when a file is edited after + it was imported. PR by Irit Katriel. + +- bpo-42116: Fix handling of trailing comments by :func:`inspect.getsource`. + +- bpo-42487: ChainMap.__iter__ no longer calls __getitem__ on underlying + maps + +- bpo-42482: :class:`~traceback.TracebackException` no longer holds a + reference to the exception's traceback object. Consequently, instances of + TracebackException for equivalent but non-equal exceptions now compare as + equal. + +- bpo-42406: We fixed an issue in `pickle.whichmodule` in which importing + `multiprocessing` could change the how pickle identifies which module an + object belongs to, potentially breaking the unpickling of those objects. + +- bpo-34215: Clarify the error message for + :exc:`asyncio.IncompleteReadError` when ``expected`` is ``None``. + +- bpo-12800: Extracting a symlink from a tarball should succeed and + overwrite the symlink if it already exists. The fix is to remove the + existing file or symlink before extraction. Based on patch by Chris AtLee, + Jeffrey Kintscher, and Senthil Kumaran. + +Tests +----- + +- bpo-41473: Reenable test_gdb on gdb 9.2 and newer: + https://bugzilla.redhat.com/show_bug.cgi?id=1866884 bug is fixed in gdb + 10.1. + +- bpo-42553: Fix ``test_asyncio.test_call_later()`` race condition: don't + measure asyncio performance in the ``call_later()`` unit test. The test + failed randomly on the CI. + +macOS +----- + +- bpo-41116: If no explicit macOS SDK was specified, setup.py should check + for Tcl and TK frameworks in /Library/Frameworks; the previous commit + inadvertently broke that test. + +- bpo-42504: Fix build on macOS Big Sur when MACOSX_DEPLOYMENT_TARGET=11 + +IDLE +---- + +- bpo-42508: Keep IDLE running on macOS. Remove obsolete workaround that + prevented running files with shortcuts when using new universal2 + installers built on macOS 11. + + +What's New in Python 3.9.1 release candidate 1? +=============================================== + +*Release date: 2020-11-24* + +Security +-------- + +- bpo-42103: Prevented potential DoS attack via CPU and RAM exhaustion when + processing malformed Apple Property List files in binary format. + +- bpo-42051: The :mod:`plistlib` module no longer accepts entity + declarations in XML plist files to avoid XML vulnerabilities. This should + not affect users as entity declarations are not used in regular plist + files. + +- bpo-40791: Add ``volatile`` to the accumulator variable in + ``hmac.compare_digest``, making constant-time-defeating optimizations less + likely. + +Core and Builtins +----------------- + +- bpo-41686: On Windows, the ``SIGINT`` event, ``_PyOS_SigintEvent()``, is + now created even if Python is configured to not install signal handlers + (if :c:member:`PyConfig.install_signal_handlers` equals to 0, or + ``Py_InitializeEx(0)``). + +- bpo-42381: Allow assignment expressions in set literals and set + comprehensions as per PEP 572. Patch by Pablo Galindo. + +- bpo-42374: Fix a regression introduced by the new parser, where an + unparenthesized walrus operator was not allowed within generator + expressions. + +- bpo-42296: On Windows, fix a regression in signal handling which prevented + to interrupt a program using CTRL+C. The signal handler can be run in a + thread different than the Python thread, in which case the test deciding + if the thread can handle signals is wrong. + +- bpo-42332: :class:`types.GenericAlias` objects can now be the targets of + weakrefs. + +- bpo-42218: Fixed a bug in the PEG parser that was causing crashes in debug + mode. Now errors are checked in left-recursive rules to avoid cases where + such errors do not get handled in time and appear as long-distance crashes + in other places. + +- bpo-42214: Fixed a possible crash in the PEG parser when checking for the + '!=' token in the ``barry_as_flufl`` rule. Patch by Pablo Galindo. + +- bpo-42143: Fix handling of errors during creation of ``PyFunctionObject``, + which resulted in operations on uninitialized memory. Patch by Yonatan + Goldschmidt. + +- bpo-41659: Fix a bug in the parser, where a curly brace following a + `primary` didn't fail immediately. This led to invalid expressions like `a + {b}` to throw a :exc:`SyntaxError` with a wrong offset, or invalid + expressions ending with a curly brace like `a {` to not fail immediately + in the REPL. + +- bpo-42150: Fix possible buffer overflow in the new parser when checking + for continuation lines. Patch by Pablo Galindo. + +- bpo-42123: Run the parser two times. On the first run, disable all the + rules that only generate better error messages to gain performance. If + there's a parse failure, run the parser a second time with those enabled. + +- bpo-42057: Fix peephole optimizer misoptimize conditional jump + + JUMP_IF_NOT_EXC_MATCH pair. + +- bpo-41984: The garbage collector now tracks all user-defined classes. + Patch by Brandt Bucher. + +- bpo-41993: Fixed potential issues with removing not completely initialized + module from ``sys.modules`` when import fails. + +- bpo-41979: Star-unpacking is now allowed for with item's targets in the + PEG parser. + +- bpo-41909: Fixed stack overflow in :func:`issubclass` and + :func:`isinstance` when getting the ``__bases__`` attribute leads to + infinite recursion. + +- bpo-41894: When loading a native module and a load failure occurs, prevent + a possible UnicodeDecodeError when not running in a UTF-8 locale by + decoding the load error message using the current locale's encoding. + +- bpo-39934: Correctly count control blocks in 'except' in compiler. Ensures + that a syntax error, rather a fatal error, occurs for deeply nested, named + exception handlers. + +Library +------- + +- bpo-42328: Fixed :meth:`tkinter.ttk.Style.map`. The function accepts now + the representation of the default state as empty sequence (as returned by + ``Style.map()``). The structure of the result is now the same on all + platform and does not depend on the value of ``wantobjects``. + +- bpo-42345: Fix various issues with ``typing.Literal`` parameter handling + (flatten, deduplicate, use type to cache key). Patch provided by Yurii + Karabas. + +- bpo-42350: Fix the :class:`threading.Thread` class at fork: do nothing if + the thread is already stopped (ex: fork called at Python exit). + Previously, an error was logged in the child process. + +- bpo-42014: The ``onerror`` callback from ``shutil.rmtree`` now receives + correct function when ``os.open`` fails. + +- bpo-42237: Fix `os.sendfile()` on illumos. + +- bpo-42249: Fixed writing binary Plist files larger than 4 GiB. + +- bpo-35455: On Solaris, :func:`~time.thread_time` is now implemented with + ``gethrvtime()`` because ``clock_gettime(CLOCK_THREAD_CPUTIME_ID)`` is not + always available. Patch by Jakub Kulik. + +- bpo-42233: The :func:`repr` of :mod:`typing` types containing + :ref:`Generic Alias Types ` previously did not show + the parameterized types in the ``GenericAlias``. They have now been + changed to do so. + +- bpo-41754: webbrowser: Ignore *NotADirectoryError* when calling + ``xdg-settings``. + +- bpo-29566: ``binhex.binhex()`` consisently writes macOS 9 line endings. + +- bpo-42183: Fix a stack overflow error for asyncio Task or Future repr(). + + The overflow occurs under some circumstances when a Task or Future + recursively returns itself. + +- bpo-42146: Fix memory leak in :func:`subprocess.Popen` in case an uid + (gid) specified in `user` (`group`, `extra_groups`) overflows `uid_t` + (`gid_t`). + +- bpo-42140: Improve asyncio.wait function to create the futures set just + one time. + +- bpo-42103: :exc:`~plistlib.InvalidFileException` and :exc:`RecursionError` + are now the only errors caused by loading malformed binary Plist file + (previously ValueError and TypeError could be raised in some specific + cases). + +- bpo-41052: Pickling heap types implemented in C with protocols 0 and 1 + raises now an error instead of producing incorrect data. + +- bpo-41491: plistlib: fix parsing XML plists with hexadecimal integer + values + +- bpo-42065: Fix an incorrectly formatted error from + :meth:`_codecs.charmap_decode` when called with a mapped value outside the + range of valid Unicode code points. PR by Max Bernstein. + +- bpo-41966: Fix pickling pure Python :class:`datetime.time` subclasses. + Patch by Dean Inwood. + +- bpo-41976: Fixed a bug that was causing :func:`ctypes.util.find_library` + to return ``None`` when triying to locate a library in an environment when + gcc>=9 is available and ``ldconfig`` is not. Patch by Pablo Galindo + +- bpo-41900: C14N 2.0 serialisation in xml.etree.ElementTree failed for + unprefixed attributes when a default namespace was defined. + +- bpo-41840: Fix a bug in the :mod:`symtable` module that was causing + module-scope global variables to not be reported as both local and global. + Patch by Pablo Galindo. + +- bpo-41831: ``str()`` for the ``type`` attribute of the ``tkinter.Event`` + object always returns now the numeric code returned by Tk instead of the + name of the event type. + +- bpo-41817: fix `tkinter.EventType` Enum so all members are strings, and + none are tuples + +- bpo-41815: Fix SQLite3 segfault when backing up closed database. Patch + contributed by Peter David McCormick. + +- bpo-41316: Fix the :mod:`tarfile` module to write only basename of TAR + file to GZIP compression header. + +- bpo-16396: Allow ``ctypes.wintypes`` to be imported on non-Windows + systems. + +- bpo-40592: :func:`shutil.which` now ignores empty entries in + :envvar:`PATHEXT` instead of treating them as a match. + +- bpo-40550: Fix time-of-check/time-of-action issue in + subprocess.Popen.send_signal. + +- bpo-40492: Fix ``--outfile`` for :mod:`cProfile` / :mod:`profile` not + writing the output file in the original directory when the program being + profiled changes the working directory. PR by Anthony Sottile. + +- bpo-40105: ZipFile truncates files to avoid corruption when a shorter + comment is provided in append ("a") mode. Patch by Jan Mazur. + +- bpo-27321: Fixed KeyError exception when flattening an email to a string + attempts to replace a non-existent Content-Transfer-Encoding header. + +Documentation +------------- + +- bpo-42153: Fix the URL for the IMAP protocol documents. + +- bpo-42061: Document __format__ functionality for IP addresses. + +- bpo-41910: Document the default implementation of `object.__eq__`. + +- bpo-42010: Clarify that subscription expressions are also valid for + certain :term:`classes ` and :term:`types ` in the standard + library, and for user-defined classes and types if the classmethod + :meth:`__class_getitem__` is provided. + +- bpo-41805: Documented :ref:`generic alias type ` and + :data:`types.GenericAlias`. Also added an entry in glossary for + :term:`generic types `. + +- bpo-41774: In Programming FAQ "Sequences (Tuples/Lists)" section, add "How + do you remove multiple items from a list". + +- bpo-35293: Fix RemovedInSphinx40Warning when building the documentation. + Patch by Dong-hee Na. + +- bpo-41726: Update the refcounts info of ``PyType_FromModuleAndSpec``. + +- bpo-39693: Fix tarfile's extractfile documentation + +- bpo-39416: Document some restrictions on the default string + representations of numeric classes. + +Tests +----- + +- bpo-40754: Include ``_testinternalcapi`` module in Windows installer for + test suite + +- bpo-41739: Fix test_logging.test_race_between_set_target_and_flush(): the + test now waits until all threads complete to avoid leaking running + threads. + +- bpo-41970: Avoid a test failure in ``test_lib2to3`` if the module has + already imported at the time the test executes. Patch by Pablo Galindo. + +- bpo-41944: Tests for CJK codecs no longer call ``eval()`` on content + received via HTTP. + +- bpo-41939: Fix test_site.test_license_exists_at_url(): call + ``urllib.request.urlcleanup()`` to reset the global + ``urllib.request._opener``. Patch by Victor Stinner. + +- bpo-41561: test_ssl: skip test_min_max_version_mismatch when TLS 1.0 is + not available + +- bpo-41602: Add tests for SIGINT handling in the runpy module. + +- bpo-41306: Fixed a failure in ``test_tk.test_widgets.ScaleTest`` happening + when executing the test with Tk 8.6.10. + +Build +----- + +- bpo-42398: Fix a race condition in "make regen-all" when make -jN option + is used to run jobs in parallel. The clinic.py script now only use atomic + write to write files. Moveover, generated files are now left unchanged if + the content does not change, to not change the file modification time. + +- bpo-41617: Fix building ``pycore_bitutils.h`` internal header on old clang + version without ``__builtin_bswap16()`` (ex: Xcode 4.6.3 on Mac OS X + 10.7). Patch by Joshua Root and Victor Stinner. + +- bpo-38249: Update :c:macro:`Py_UNREACHABLE` to use __builtin_unreachable() + if only the compiler is able to use it. Patch by Dong-hee Na. + +- bpo-40998: Addressed three compiler warnings found by undefined behavior + sanitizer (ubsan). + +Windows +------- + +- bpo-42120: Remove macro definition of ``copysign`` (to ``_copysign``) in + headers. + +- bpo-38439: Updates the icons for IDLE in the Windows Store package. + +- bpo-41744: Fixes automatic import of props file when using the Nuget + package. + +- bpo-41557: Update Windows installer to use SQLite 3.33.0. + +- bpo-38324: Avoid Unicode errors when accessing certain locale data on + Windows. + +macOS +----- + +- bpo-41116: Ensure distutils.unixxcompiler.find_library_file can find + system provided libraries on macOS 11. + +- bpo-41100: Add support for macOS 11 and Apple Silicon systems. + + It is now possible to build "Universal 2" binaries using + "--enable-universalsdk --with-universal-archs=universal2". + + Binaries build on later macOS versions can be deployed back to older + versions (tested up to macOS 10.9), when using the correct deployment + target. This is tested using Xcode 11 and later. + +- bpo-38443: The ``--enable-universalsdk`` and ``--with-universal-archs`` + options for the configure script now check that the specified + architectures can be used. + +- bpo-41471: Ignore invalid prefix lengths in system proxy excludes. + +- bpo-41557: Update macOS installer to use SQLite 3.33.0. + +IDLE +---- + +- bpo-42426: Fix reporting offset of the RE error in searchengine. + +- bpo-42415: Get docstrings for IDLE calltips more often by using + inspect.getdoc. + +- bpo-33987: Mostly finish using ttk widgets, mainly for editor, settings, + and searches. Some patches by Mark Roseman. + +- bpo-41775: Use 'IDLE Shell' as shell title + +- bpo-35764: Rewrite the Calltips doc section. + +- bpo-40181: In calltips, stop reminding that '/' marks the end of + positional-only arguments. + +- bpo-40511: Typing opening and closing parentheses inside the parentheses + of a function call will no longer cause unnecessary "flashing" off and on + of an existing open call-tip, e.g. when typed in a string literal. + +- bpo-38439: Add a 256×256 pixel IDLE icon to the Windows .ico file. Created + by Andrew Clover. Remove the low-color gif variations from the .ico file. + +C API +----- + +- bpo-42015: Fix potential crash in deallocating method objects when + dynamically allocated `PyMethodDef`'s lifetime is managed through the + ``self`` argument of a `PyCFunction`. + +- bpo-41986: :c:data:`Py_FileSystemDefaultEncodeErrors` and + :c:data:`Py_UTF8Mode` are available again in limited API. + + +What's New in Python 3.9.0 final? +================================= + +*Release date: 2020-10-04* + +Library +------- + +- bpo-41815: Fix SQLite3 segfault when backing up closed database. Patch + contributed by Peter David McCormick. + +- bpo-41662: No longer override exceptions raised in ``__len__()`` of a + sequence of parameters in :mod:`sqlite3` with + :exc:`~sqlite3.ProgrammingError`. + +- bpo-41662: Fixed crash when mutate list of parameters during iteration in + :mod:`sqlite3`. + +- bpo-39728: fix default `_missing_` so a duplicate `ValueError` is not set + as the `__context__` of the original `ValueError` + +Tests +----- + +- bpo-41602: Add tests for SIGINT handling in the runpy module. + +Build +----- + +- bpo-38249: Update :c:macro:`Py_UNREACHABLE` to use __builtin_unreachable() + if only the compiler is able to use it. Patch by Dong-hee Na. + + +What's New in Python 3.9.0 release candidate 2? +=============================================== + +*Release date: 2020-09-16* + +Core and Builtins +----------------- + +- bpo-41780: Fix :meth:`__dir__` of :class:`types.GenericAlias`. Patch by + Batuhan Taskaya. + +- bpo-41690: Fix a possible stack overflow in the parser when parsing + functions and classes with a huge ammount of arguments. Patch by Pablo + Galindo. + +- bpo-41681: Fixes the wrong error description in the error raised by using + 2 `,` in format string in f-string and :meth:`str.format`. + +- bpo-41654: Fix a crash that occurred when destroying subclasses of + :class:`MemoryError`. Patch by Pablo Galindo. + +- bpo-41631: The ``_ast`` module uses again a global state. Using a module + state per module instance is causing subtle practical problems. For + example, the Mercurial project replaces the ``__import__()`` function to + implement lazy import, whereas Python expected that ``import _ast`` always + return a fully initialized ``_ast`` module. + +- bpo-41533: Free the stack allocated in ``va_build_stack`` if + ``do_mkstack`` fails and the stack is not a ``small_stack``. + +- bpo-41531: Fix a bug that was dropping keys when compiling dict literals + with more than 0xFFFF elements. Patch by Pablo Galindo. + +- bpo-41525: The output of ``python --help`` contains now only ASCII + characters. + +- bpo-29590: Make the stack trace correct after calling + :meth:`generator.throw` on a generator that has yielded from a ``yield + from``. + +Library +------- + +- bpo-41517: fix bug allowing Enums to be extended via multiple inheritance + +- bpo-39587: use the correct mix-in data type when constructing Enums + +- bpo-41789: Honor `object` overrides in `Enum` class creation + (specifically, `__str__`, `__repr__`, `__format__`, and `__reduce_ex__`). + +- bpo-39651: Fix a race condition in the ``call_soon_threadsafe()`` method + of ``asyncio.ProactorEventLoop``: do nothing if the self-pipe socket has + been closed. + +- bpo-41720: Fixed :meth:`turtle.Vec2D.__rmul__` for arguments which are not + int or float. + +- bpo-41696: Fix handling of debug mode in :func:`asyncio.run`. This allows + setting ``PYTHONASYNCIODEBUG`` or ``-X dev`` to enable asyncio debug mode + when using :func:`asyncio.run`. + +- bpo-41687: Fix implementation of sendfile to be compatible with Solaris. + +- bpo-39010: Restarting a ``ProactorEventLoop`` on Windows no longer logs + spurious ``ConnectionResetErrors``. + +- bpo-41609: The pdb whatis command correctly reports instance methods as + 'Method' rather than 'Function'. + +- bpo-32751: When cancelling the task due to a timeout, + :meth:`asyncio.wait_for` will now wait until the cancellation is complete + also in the case when *timeout* is <= 0, like it does with positive + timeouts. + +- bpo-37658: :meth:`asyncio.wait_for` now properly handles races between + cancellation of itself and the completion of the wrapped awaitable. + +- bpo-40782: Change the method asyncio.AbstractEventLoop.run_in_executor to + not be a coroutine. + +- bpo-41520: Fix :mod:`codeop` regression that prevented turning compile + warnings into errors. + +- bpo-41503: Fixed a race between setTarget and flush in + logging.handlers.MemoryHandler. + +- bpo-41344: Prevent creating :class:`shared_memory.SharedMemory` objects + with :code:`size=0`. + +- bpo-41025: Fixed an issue preventing the C implementation of + :class:`zoneinfo.ZoneInfo` from being subclassed. + +- bpo-31122: ssl.wrap_socket() now raises ssl.SSLEOFError rather than + OSError when peer closes connection during TLS negotiation + +- bpo-33660: Fix pathlib.PosixPath to resolve a relative path located on the + root directory properly. + +Documentation +------------- + +- bpo-37149: Change Shipman tkinter doc link from archive.org to TkDocs. + (The doc has been removed from the NMT server.) The new link responds + much faster and includes a short explanatory note. + +- bpo-41624: Fix the signature of :class:`typing.Coroutine`. + +- bpo-40204: Enable Sphinx 3.2 ``c_allow_pre_v3`` option and disable + ``c_warn_on_allowed_pre_v3`` option to make the documentation compatible + with Sphinx 2 and Sphinx 3. + +- bpo-40979: Refactored typing.rst, arranging more than 70 classes, + functions, and decorators into new sub-sections. + +- bpo-39883: Make code, examples, and recipes in the Python documentation be + licensed under the more permissive BSD0 license in addition to the + existing Python 2.0 license. + +Tests +----- + +- bpo-41731: Make test_cmd_line_script pass with option '-vv'. + +Build +----- + +- bpo-41617: Fix ``pycore_byteswap.h`` header file to support old clang + versions: ``__builtin_bswap16()`` is not available in LLVM clang 3.0. + +Windows +------- + +- bpo-41526: Fixed layout of final page of the installer by removing the + special thanks to Mark Hammond (with his permission). + +C API +----- + +- bpo-41524: Fix bug in PyOS_mystrnicmp and PyOS_mystricmp that incremented + pointers beyond the end of a string. + + +What's New in Python 3.9.0 release candidate 1? +=============================================== + +*Release date: 2020-08-11* + +Core and Builtins +----------------- + +- bpo-38156: Handle interrupts that come after EOF correctly in + ``PyOS_StdioReadline``. + +Library +------- + +- bpo-41497: Fix potential UnicodeDecodeError in dis module. + +- bpo-41490: Update :mod:`ensurepip` to install pip 20.2.1 and setuptools + 49.2.1. + +- bpo-41467: On Windows, fix asyncio ``recv_into()`` return value when the + socket/pipe is closed (:exc:`BrokenPipeError`): return ``0`` rather than + an empty byte string (``b''``). + +- bpo-41425: Make tkinter doc example runnable. + +- bpo-41384: Raise TclError instead of TypeError when an unknown option is + passed to tkinter.OptionMenu. + +- bpo-38731: Fix :exc:`NameError` in command-line interface of + :mod:`py_compile`. + +- bpo-41317: Use add_done_callback() in asyncio.loop.sock_accept() to + unsubscribe reader early on cancellation. + +- bpo-41364: Reduce import overhead of :mod:`uuid`. + +- bpo-41341: Recursive evaluation of `typing.ForwardRef` in + `get_type_hints`. + +- bpo-41182: selector: use DefaultSelector based upon implementation + +- bpo-40726: Handle cases where the ``end_lineno`` is ``None`` on + :func:`ast.increment_lineno`. + +Documentation +------------- + +- bpo-41045: Add documentation for debug feature of f-strings. + +- bpo-41314: Changed the release when ``from __future__ import annotations`` + becomes the default from ``4.0`` to ``3.10`` (following a change in PEP + 563). + +Windows +------- + +- bpo-41492: Fixes the description that appears in UAC prompts. + +- bpo-40948: Improve post-install message to direct people to the "py" + command. + +- bpo-41412: The installer will now fail to install on Windows 7 and Windows + 8. Further, the UCRT dependency is now always downloaded on demand. + +- bpo-40741: Update Windows release to include SQLite 3.32.3. + +IDLE +---- + +- bpo-41468: Improve IDLE run crash error message (which users should never + see). + +- bpo-41373: Save files loaded with no line ending, as when blank, or + different line endings, by setting its line ending to the system default. + Fix regression in 3.8.4 and 3.9.0b4. + + +What's New in Python 3.9.0 beta 5? +================================== + +*Release date: 2020-07-20* + +Security +-------- + +- bpo-41304: Fixes `python3x._pth` being ignored on Windows, caused by the + fix for :issue:`29778` (CVE-2020-15801). + +- bpo-41162: Audit hooks are now cleared later during finalization to avoid + missing events. + +- bpo-29778: Ensure :file:`python3.dll` is loaded from correct locations + when Python is embedded (CVE-2020-15523). + +- bpo-39603: Prevent http header injection by rejecting control characters + in http.client.putrequest(...). + +Core and Builtins +----------------- + +- bpo-41295: Resolve a regression in CPython 3.8.4 where defining + "__setattr__" in a multi-inheritance setup and calling up the hierarchy + chain could fail if builtins/extension types were involved in the base + types. + +- bpo-41247: Always cache the running loop holder when running + ``asyncio.set_running_loop``. + +- bpo-41252: Fix incorrect refcounting in _ssl.c's + ``_servername_callback()``. + +- bpo-41215: Use non-NULL default values in the PEG parser keyword list to + overcome a bug that was preventing Python from being properly compiled + when using the XLC compiler. Patch by Pablo Galindo. + +- bpo-41218: Python 3.8.3 had a regression where compiling with + ast.PyCF_ALLOW_TOP_LEVEL_AWAIT would aggressively mark list comprehension + with CO_COROUTINE. Now only list comprehension making use of async/await + will tagged as so. + +- bpo-41175: Guard against a NULL pointer dereference within bytearrayobject + triggered by the ``bytearray() + bytearray()`` operation. + +- bpo-39960: The "hackcheck" that prevents sneaking around a type's + __setattr__() by calling the superclass method was rewritten to allow C + implemented heap types. + +Library +------- + +- bpo-41288: Unpickling invalid NEWOBJ_EX opcode with the C implementation + raises now UnpicklingError instead of crashing. + +- bpo-39017: Avoid infinite loop when reading specially crafted TAR files + using the tarfile module (CVE-2019-20907). + +- bpo-41235: Fix the error handling in + :meth:`ssl.SSLContext.load_dh_params`. + +- bpo-41207: In distutils.spawn, restore expectation that DistutilsExecError + is raised when the command is not found. + +- bpo-39168: Remove the ``__new__`` method of :class:`typing.Generic`. + +- bpo-41194: Fix a crash in the ``_ast`` module: it can no longer be loaded + more than once. It now uses a global state rather than a module state. + +- bpo-39384: Fixed email.contentmanager to allow set_content() to set a null + string. + +Documentation +------------- + +- bpo-37703: Updated Documentation to comprehensively elaborate on the + behaviour of gather.cancel() + +macOS +----- + +- bpo-40741: Update macOS installer to use SQLite 3.32.3. + +IDLE +---- + +- bpo-41300: Save files with non-ascii chars. Fix regression released in + 3.9.0b4 and 3.8.4. + +- bpo-37765: Add keywords to module name completion list. Rewrite + Completions section of IDLE doc. + +C API +----- + +- bpo-40170: Revert :c:func:`PyType_HasFeature` change: it reads again + directly the :c:member:`PyTypeObject.tp_flags` member when the limited C + API is not used, rather than always calling :c:func:`PyType_GetFlags` + which hides implementation details. + + +What's New in Python 3.9.0 beta 4? +================================== + +*Release date: 2020-07-02* + +Security +-------- + +- bpo-41004: The __hash__() methods of ipaddress.IPv4Interface and + ipaddress.IPv6Interface incorrectly generated constant hash values of 32 + and 128 respectively. This resulted in always causing hash collisions. The + fix uses hash() to generate hash values for the tuple of (address, mask + length, network address). + +Core and Builtins +----------------- + +- bpo-41094: Fix decoding errors with audit when open files with non-ASCII + names on non-UTF-8 locale. + +- bpo-41084: Prefix the error message with 'f-string: ', when parsing an + f-string expression which throws a :exc:`SyntaxError`. + +- bpo-41076: Pre-feed the parser with the location of the f-string + expression, not the f-string itself, which allows us to skip the shifting + of the AST node locations after the parsing is completed. + +- bpo-40939: Deprecate :c:func:`PyNode_Compile`. + +- bpo-41056: Fixes a reference to deallocated stack space during startup + when constructing sys.path involving a relative symlink when code was + supplied via -c. (discovered via Coverity) + +- bpo-41061: Fix incorrect expressions and asserts in hashtable code and + tests. + +- bpo-41052: Opt out serialization/deserialization for _random.Random + +- bpo-40939: Deprecate :c:func:`PyParser_SimpleParseStringFlags`, + :c:func:`PyParser_SimpleParseStringFlagsFilename` and + :c:func:`PyParser_SimpleParseFileFlags`. + +- bpo-35975: Stefan Behnel reported that cf_feature_version is used even + when PyCF_ONLY_AST is not set. This is against the intention and against + the documented behavior, so it's been fixed. + +- bpo-40985: Fix a bug that caused the :exc:`SyntaxError` text to be empty + when a file ends with a line ending in a line continuation character (i.e. + backslash). The error text should contain the text of the last line. + +- bpo-40958: Fix a possible buffer overflow in the PEG parser when gathering + information for emitting syntax errors. Patch by Pablo Galindo. + +- bpo-40957: Fix refleak in _Py_fopen_obj() when PySys_Audit() fails + +- bpo-40947: The Python :ref:`Path Configuration ` now + takes :c:member:`PyConfig.platlibdir` in account. + +- bpo-40847: Fix a bug where a line with only a line continuation character + is not considered a blank line at tokenizer level. In such cases, more + than a single `NEWLINE` token was emitted. The old parser was working + around the issue, but the new parser threw a :exc:`SyntaxError` for valid + input due to this. For example, an empty line following a line + continuation character was interpreted as a :exc:`SyntaxError`. + +- bpo-40824: Unexpected errors in calling the ``__iter__`` method are no + longer masked by ``TypeError`` in the :keyword:`in` operator and functions + :func:`~operator.contains`, :func:`~operator.indexOf` and + :func:`~operator.countOf` of the :mod:`operator` module. + +- bpo-19569: Add the private macros ``_Py_COMP_DIAG_PUSH``, + ``_Py_COMP_DIAG_IGNORE_DEPR_DECLS``, and ``_Py_COMP_DIAG_POP``. + +Library +------- + +- bpo-41193: The ``write_history()`` atexit function of the readline + completer now ignores any :exc:`OSError` to ignore error if the filesystem + is read-only, instead of only ignoring :exc:`FileNotFoundError` and + :exc:`PermissionError`. + +- bpo-41161: The decimal module now requires libmpdec-2.5.0. Users of + --with-system-libmpdec should update their system library. + +- bpo-40874: The decimal module now requires libmpdec-2.5.0. + +- bpo-41138: Fixed the :mod:`trace` module CLI for Python source files with + non-UTF-8 encoding. + +- bpo-31938: Fix default-value signatures of several functions in the + :mod:`select` module - by Anthony Sottile. + +- bpo-41068: Fixed reading files with non-ASCII names from ZIP archive + directly after writing them. + +- bpo-41058: :func:`pdb.find_function` now correctly determines the source + file encoding. + +- bpo-41056: Fix a NULL pointer dereference within the ssl module during a + MemoryError in the keylog callback. (discovered by Coverity) + +- bpo-41056: Fixed an instance where a MemoryError within the zoneinfo + module might not be reported or not reported at its source. (found by + Coverity) + +- bpo-41048: :func:`mimetypes.read_mime_types` function reads the rule file + using UTF-8 encoding, not the locale encoding. Patch by Srinivas Reddy + Thatiparthy. + +- bpo-41043: Fixed the use of :func:`~glob.glob` in the stdlib: literal part + of the path is now always correctly escaped. + +- bpo-40448: :mod:`ensurepip` now disables the use of `pip` cache when + installing the bundled versions of `pip` and `setuptools`. Patch by + Krzysztof Konopko. + +- bpo-40967: Removed :meth:`asyncio.Task.current_task` and + :meth:`asyncio.Task.all_tasks`. Patch contributed by Rémi Lapeyre. + +- bpo-40955: Fix a minor memory leak in :mod:`subprocess` module when + extra_groups was specified. + +- bpo-40855: The standard deviation and variance functions in the statistics + module were ignoring their mu and xbar arguments. + +- bpo-40924: Removed support for loaders implementing .files and supplying + TraversableResources. + +- bpo-40939: Use the new PEG parser when generating the stdlib + :mod:`keyword` module. + +- bpo-40834: Fix truncate when sending str object + with_xxsubinterpreters.channel_send. + +- bpo-26407: Unexpected errors in calling the ``__iter__`` method are no + longer masked by ``TypeError`` in :func:`csv.reader`, + :func:`csv.writer.writerow` and :meth:`csv.writer.writerows`. + +- bpo-38488: Update ensurepip to install pip 20.1.1 and setuptools 47.1.0. + +- bpo-36543: Restored the deprecated :mod:`xml.etree.cElementTree` module. + +- bpo-34226: Fix `cgi.parse_multipart` without content_length. Patch by + Roger Duran + +Tests +----- + +- bpo-41085: Fix integer overflow in the :meth:`array.array.index` method on + 64-bit Windows for index larger than ``2**31``. + +- bpo-41069: :data:`test.support.TESTFN` and the current directory for tests + when run via ``test.regrtest`` contain now non-ascii characters if + possible. + +- bpo-38377: On Linux, skip tests using multiprocessing if the current user + cannot create a file in ``/dev/shm/`` directory. Add the + :func:`~test.support.skip_if_broken_multiprocessing_synchronize` function + to the :mod:`test.support` module. + +- bpo-41009: Fix use of ``support.require_{linux|mac|freebsd}_version()`` + decorators as class decorator. + +- bpo-41003: Fix ``test_copyreg`` when ``numpy`` is installed: + ``test.pickletester`` now saves/restores warnings filters when importing + ``numpy``, to ignore filters installed by ``numpy``. + +- bpo-40964: Disable remote :mod:`imaplib` tests, host cyrus.andrew.cmu.edu + is blocking incoming connections. + +- bpo-40927: Fix test_binhex when run twice: it now uses + import_fresh_module() to ensure that it raises DeprecationWarning each + time. + +- bpo-34401: Make test_gdb properly run on HP-UX. Patch by Michael Osipov. + +Build +----- + +- bpo-40204: Pin Sphinx version to 2.3.1 in ``Doc/Makefile``. + +Windows +------- + +- bpo-41074: Fixed support of non-ASCII names in functions + :func:`msilib.OpenDatabase` and :func:`msilib.init_database` and non-ASCII + SQL in method :meth:`msilib.Database.OpenView`. + +- bpo-40164: Updates Windows OpenSSL to 1.1.1g + +- bpo-37556: Extend py.exe help to mention overrides via venv, shebang, + environmental variables & ini files. + +macOS +----- + +- bpo-39580: Avoid opening Finder window if running installer from the + command line. Patch contributed by Rick Heil. + +- bpo-41100: Fix configure error when building on macOS 11. Note that the + current Python release was released shortly after the first developer + preview of macOS 11 (Big Sur); there are other known issues with building + and running on the developer preview. Big Sur is expected to be fully + supported in a future bugfix release of Python 3.8.x and with 3.9.0. + +- bpo-41005: fixed an XDG settings issue not allowing macos to open browser + in webbrowser.py + +IDLE +---- + +- bpo-41152: The encoding of ``stdin``, ``stdout`` and ``stderr`` in IDLE is + now always UTF-8. + +- bpo-41144: Make Open Module open a special module such as os.path. + +C API +----- + +- bpo-36346: Mark ``Py_UNICODE_COPY``, ``Py_UNICODE_FILL``, + ``PyUnicode_WSTR_LENGTH``, ``PyUnicode_FromUnicode``, + ``PyUnicode_AsUnicode``, ``_PyUnicode_AsUnicode``, and + ``PyUnicode_AsUnicodeAndSize`` as deprecated in C. Remove + ``Py_UNICODE_MATCH`` which was deprecated and broken since Python 3.3. + +- bpo-36020: On Windows, ``#include "pyerrors.h"`` no longer defines + ``snprintf`` and ``vsnprintf`` macros. + +- bpo-40703: The PyType_FromSpec*() functions no longer overwrite the type's + "__module__" attribute if it is set via "Py_tp_members" or "Py_tp_getset". + + +What's New in Python 3.9.0 beta 3? +================================== + +*Release date: 2020-06-09* + +Library +------- + +- bpo-40924: `importlib.resources`: Reverted ``TraversableResources`` + implementations from the built-in loaders (SourceFileLoader and + ZipImporter) as it was an incompatible change introduced in 3.9.0 beta 2 + causing through a chain of events for root TLS certificates to be missing. + +Build +----- + +- bpo-40684: ``make install`` now uses the ``PLATLIBDIR`` variable for the + destination ``lib-dynload/`` directory when ``./configure + --with-platlibdir`` is used. + + +What's New in Python 3.9.0 beta 2? +================================== + +*Release date: 2020-06-08* + +Core and Builtins +----------------- + +- bpo-40904: Fix possible segfault in the new PEG parser when parsing + f-string containing yield statements with no value (:code:`f"{yield}"`). + Patch by Pablo Galindo + +- bpo-40903: Fixed a possible segfault in the new PEG parser when producing + error messages for invalid assignments of the form :code:`p=p=`. Patch by + Pablo Galindo + +- bpo-40880: Fix invalid memory read in the new parser when checking + newlines in string literals. Patch by Pablo Galindo. + +- bpo-40883: Fix memory leak in when parsing f-strings in the new parser. + Patch by Pablo Galindo + +- bpo-40870: Raise :exc:`ValueError` when validating custom AST's where the + constants ``True``, ``False`` and ``None`` are used within a + :class:`ast.Name` node. + +- bpo-40854: Allow overriding :data:`sys.platlibdir` via a new + :envvar:`PYTHONPLATLIBDIR` environment variable. + +- bpo-40826: Fix GIL usage in :c:func:`PyOS_Readline`: lock the GIL to set + an exception and pass the Python thread state when checking if there is a + pending signal. + +- bpo-40780: Fix a corner case where g-style string formatting of a float + failed to remove trailing zeros. + +- bpo-38964: When there's a :exc:`SyntaxError` in the expression part of an + fstring, the filename attribute of the :exc:`SyntaxError` gets correctly + set to the name of the file the fstring resides in. + +- bpo-40750: Support the "-d" debug flag in the new PEG parser. Patch by + Pablo Galindo + +- bpo-40217: Instances of types created with + :c:func:`PyType_FromSpecWithBases` will no longer automatically visit + their class object when traversing references in the garbage collector. + The user is expected to manually visit the object's class. Patch by Pablo + Galindo. + +- bpo-40696: Fix a hang that can arise after :meth:`generator.throw` due to + a cycle in the exception context chain. + +Library +------- + +- bpo-39791: Refresh importlib.metadata from importlib_metadata 1.6.1. + +- bpo-40807: Stop codeop._maybe_compile, used by code.InteractiveInterpreter + (and IDLE). from from emitting each warning three times. + +- bpo-39791: Built-in loaders (SourceFileLoader and ZipImporter) now supply + ``TraversableResources`` implementations for ``ResourceReader``, and the + fallback function has been removed. + +- bpo-17005: The topological sort functionality that was introduced + initially in the :mod:`functools` module has been moved to a new + :mod:`graphlib` module to better accommodate the new tools and keep the + original scope of the :mod:`functools` module. Patch by Pablo Galindo + +- bpo-40777: Initialize PyDateTime_IsoCalendarDateType.tp_base at run-time + to avoid errors on some compilers. + +- bpo-40767: :mod:`webbrowser` now properly finds the default browser in + pure Wayland systems by checking the WAYLAND_DISPLAY environment variable. + Patch contributed by Jérémy Attali. + +- bpo-40791: :func:`hashlib.compare_digest` uses OpenSSL's + ``CRYPTO_memcmp()`` function when OpenSSL is available. + +- bpo-40795: :mod:`ctypes` module: If ctypes fails to convert the result of + a callback or if a ctypes callback function raises an exception, + sys.unraisablehook is now called with an exception set. Previously, the + error was logged into stderr by :c:func:`PyErr_Print`. + +- bpo-30008: Fix :mod:`ssl` code to be compatible with OpenSSL 1.1.x builds + that use ``no-deprecated`` and ``--api=1.1.0``. + +- bpo-30064: Fix asyncio ``loop.sock_*`` race condition issue + +- bpo-40759: Deprecate the :mod:`symbol` module. + +- bpo-40737: Fix possible reference leak for :mod:`sqlite3` initialization. + +- bpo-40698: :mod:`distutils` upload creates SHA2-256 and Blake2b-256 + digests. MD5 digests is skipped if platform blocks MD5. + +- bpo-40695: :mod:`hashlib` no longer falls back to builtin hash + implementations when OpenSSL provides a hash digest and the algorithm is + blocked by security policy. + +- bpo-9216: func:`hashlib.new` passed ``usedforsecurity`` to OpenSSL EVP + constructor ``_hashlib.new()``. test_hashlib and test_smtplib handle + strict security policy better. + +- bpo-40614: :func:`ast.parse` will not parse self documenting expressions + in f-strings when passed ``feature_version`` is less than ``(3, 8)``. + +- bpo-40671: Prepare ``_hashlib`` for :pep:`489` and use + :c:func:`PyModule_AddType`. + +- bpo-32309: Added a new :term:`coroutine` :func:`asyncio.to_thread`. It is + mainly used for running IO-bound functions in a separate thread to avoid + blocking the event loop, and essentially works as a high-level version of + :meth:`~asyncio.loop.run_in_executor` that can directly take keyword + arguments. + +- bpo-40630: Added :func:`tracemalloc.reset_peak` to set the peak size of + traced memory blocks to the current size, to measure the peak of specific + pieces of code. + +- bpo-13097: ``ctypes`` now raises an ``ArgumentError`` when a callback is + invoked with more than 1024 arguments. + +- bpo-23082: Updated the error message and docs of PurePath.relative_to() to + better reflect the function behaviour. + +- bpo-39244: Fixed :class:`multiprocessing.context.get_all_start_methods` to + properly return the default method first on macOS. + +- bpo-39040: Fix parsing of invalid mime headers parameters by collapsing + whitespace between encoded words in a bare-quote-string. + +- bpo-35714: :exc:`struct.error` is now raised if there is a null character + in a :mod:`struct` format string. + +- bpo-36290: AST nodes are now raising :exc:`TypeError` on conflicting + keyword arguments. Patch contributed by Rémi Lapeyre. + +Tests +----- + +- bpo-17258: Skip some :mod:`multiprocessing` tests when MD5 hash digest is + blocked. + +Build +----- + +- bpo-40514: Remove ``--with-experimental-isolated-subinterpreters`` + configure option in Python 3.9: the experiment continues in the master + branch, but it's no longer needed in 3.9. + +- bpo-40683: Fixed an issue where the :mod:`zoneinfo` module and its tests + were not included when Python is installed with ``make``. + +Windows +------- + +- bpo-39631: Changes the registered MIME type for ``.py`` files on Windows + to ``text/x-python`` instead of ``text/plain``. + +- bpo-40677: Manually define IO_REPARSE_TAG_APPEXECLINK in case some old + Windows SDK doesn't have it. + +macOS +----- + +- bpo-40741: Update macOS installer to use SQLite 3.32.2. + +IDLE +---- + +- bpo-39885: Make context menu Cut and Copy work again when right-clicking + within a selection. + +- bpo-40723: Make test_idle pass when run after import. + +C API +----- + +- bpo-40910: Export explicitly the :c:func:`Py_GetArgcArgv` function to the + C API and document the function. Previously, it was exported implicitly + which no longer works since Python is built with ``-fvisibility=hidden``. + +- bpo-40724: Allow defining buffer slots in type specs. + +- bpo-40826: :c:func:`PyOS_InterruptOccurred` now fails with a fatal error + if it is called with the GIL released. + + +What's New in Python 3.9.0 beta 1? +================================== + +*Release date: 2020-05-19* + +Security +-------- + +- bpo-40501: :mod:`uuid` no longer uses :mod:`ctypes` to load + :file:`libuuid` or :file:`rpcrt4.dll` at runtime. + +Core and Builtins +----------------- + +- bpo-40663: Correctly generate annotations where parentheses are omitted + but required (e.g: ``Type[(str, int, *other))]``. + +- bpo-40596: Fixed :meth:`str.isidentifier` for non-canonicalized strings + containing non-BMP characters on Windows. + +- bpo-40593: Improved syntax errors for invalid characters in source code. + +- bpo-40585: Fixed a bug when using :func:`codeop.compile_command` that was + causing exceptions to be swallowed with the new parser. Patch by Pablo + Galindo + +- bpo-40566: Apply :pep:`573` to :mod:`abc`. + +- bpo-40502: Initialize ``n->n_col_offset``. (Patch by Joannah Nanjekye) + +- bpo-40527: Fix command line argument parsing: no longer write errors + multiple times into stderr. + +- bpo-1635741: Port :mod:`errno` to multiphase initialization (:pep:`489`). + +- bpo-40523: Add pass-throughs for :func:`hash` and :func:`reversed` to + :class:`weakref.proxy` objects. Patch by Pablo Galindo. + +- bpo-1635741: Port :mod:`syslog` to multiphase initialization (:pep:`489`). + +- bpo-40246: Reporting a specialised error message for invalid string + prefixes, which was introduced in :issue:`40246`, is being reverted due to + backwards compatibility concerns for strings that immediately follow a + reserved keyword without whitespace between them. Constructs like + `bg="#d00" if clear else"#fca"` were failing to parse, which is not an + acceptable breakage on such short notice. + +- bpo-40417: Fix imp module deprecation warning when PyImport_ReloadModule + is called. Patch by Robert Rouhani. + +- bpo-40408: Fixed support of nested type variables in GenericAlias (e.g. + ``list[list[T]]``). + +- bpo-1635741: Port _stat module to multiphase initialization (:pep:`489`). + +- bpo-29587: Enable implicit exception chaining when calling + :meth:`generator.throw`. + +- bpo-40328: Add tools for generating mappings headers for CJKCodecs. + +- bpo-40228: Setting frame.f_lineno is now robust w.r.t. changes in the + source-to-bytecode compiler + +- bpo-38880: Added the ability to list interpreters associated with channel + ends in the internal subinterpreters module. + +- bpo-37986: Improve performance of :c:func:`PyLong_FromDouble` for values + that fit into :c:type:`long`. + +Library +------- + +- bpo-40662: Fixed :func:`ast.get_source_segment` for ast nodes that have + incomplete location information. Patch by Irit Katriel. + +- bpo-40665: Convert :mod:`bisect` to use Argument Clinic. + +- bpo-40536: Added the :func:`~zoneinfo.available_timezones` function to the + :mod:`zoneinfo` module. Patch by Paul Ganssle. + +- bpo-40645: The :class:`hmac.HMAC` exposes internal implementation details. + The attributes ``digest_cons``, ``inner``, and ``outer`` are deprecated + and will be removed in the future. + +- bpo-40645: The internal module ``_hashlib`` wraps and exposes OpenSSL's + HMAC API. The new code will be used in Python 3.10 after the internal + implementation details of the pure Python HMAC module are no longer part + of the public API. + +- bpo-40637: Builtin hash modules can now be disabled or selectively enabled + with ``configure --with-builtin-hashlib-hashes=sha3,blake1`` or + ``--without-builtin-hashlib-hashes``. + +- bpo-37630: The :mod:`hashlib` module can now use SHA3 hashes and SHAKE XOF + from OpenSSL when available. + +- bpo-40479: The :mod:`hashlib` now compiles with OpenSSL 3.0.0-alpha2. + +- bpo-40257: Revert changes to :func:`inspect.getdoc`. + +- bpo-40607: When cancelling a task due to timeout, :meth:`asyncio.wait_for` + will now propagate the exception if an error happens during cancellation. + Patch by Roman Skurikhin. + +- bpo-40612: Fix edge cases in SyntaxError formatting. If the offset is <= + 0, no caret is printed. If the offset is > line length, the caret is + printed pointing just after the last character. + +- bpo-40597: If text content lines are longer than policy.max_line_length, + always use a content-encoding to make sure they are wrapped. + +- bpo-40571: Added functools.cache() as a simpler, more discoverable way to + access the unbounded cache variant of lru_cache(maxsize=None). + +- bpo-40503: :pep:`615`, the :mod:`zoneinfo` module. Adds support for the + IANA time zone database. + +- bpo-40397: Removed attributes ``__args__`` and ``__parameters__`` from + special generic aliases like ``typing.List`` (not subscripted). + +- bpo-40549: Convert posixmodule.c ("posix" or "nt" module) to the + multiphase initialization (PEP 489). + +- bpo-31033: Add a ``msg`` argument to :meth:`Future.cancel` and + :meth:`Task.cancel`. + +- bpo-40541: Added an optional *counts* parameter to random.sample(). + +- bpo-40515: The :mod:`ssl` and :mod:`hashlib` modules now actively check + that OpenSSL is build with thread support. Python 3.7.0 made thread + support mandatory and no longer works safely with a no-thread builds. + +- bpo-31033: When a :class:`asyncio.Task` is cancelled, the exception + traceback now chains all the way back to where the task was first + interrupted. + +- bpo-40504: :func:`functools.lru_cache` objects can now be the targets of + weakrefs. + +- bpo-40559: Fix possible memory leak in the C implementation of + :class:`asyncio.Task`. + +- bpo-40480: ``fnmatch.fnmatch()`` could take exponential time in the + presence of multiple ``*`` pattern characters. This was repaired by + generating more elaborate regular expressions to avoid futile + backtracking. + +- bpo-40495: :mod:`compileall` is now able to use hardlinks to prevent + duplicates in a case when ``.pyc`` files for different optimization levels + have the same content. + +- bpo-40457: The ssl module now support OpenSSL builds without TLS 1.0 and + 1.1 methods. + +- bpo-40355: Improve error reporting in :func:`ast.literal_eval` in the + presence of malformed :class:`ast.Dict` nodes instead of silently ignoring + any non-conforming elements. Patch by Curtis Bucher. + +- bpo-40465: Deprecated the optional *random* argument to + *random.shuffle()*. + +- bpo-40459: :func:`platform.win32_ver` now produces correct *ptype* strings + instead of empty strings. + +- bpo-39435: The first argument of :func:`pickle.loads` is now + positional-only. + +- bpo-39305: Update :mod:`nntplib` to merge :class:`nntplib.NNTP` and + :class:`nntplib._NNTPBase`. Patch by Dong-hee Na. + +- bpo-32494: Update :mod:`dbm.gnu` to use gdbm_count if possible when + calling :func:`len`. Patch by Dong-hee Na. + +- bpo-40453: Add ``isolated=True`` keyword-only parameter to + ``_xxsubinterpreters.create()``. An isolated subinterpreter cannot spawn + threads, spawn a child process or call ``os.fork()``. + +- bpo-40286: Remove ``_random.Random.randbytes()``: the C implementation of + ``randbytes()``. Implement the method in Python to ease subclassing: + ``randbytes()`` now directly reuses ``getrandbits()``. + +- bpo-40394: Added default arguments to + :meth:`difflib.SequenceMatcher.find_longest_match()`. + +- bpo-39995: Fix a race condition in concurrent.futures._ThreadWakeup: + access to _ThreadWakeup is now protected with the shutdown lock. + +- bpo-30966: ``Process.shutdown(wait=True)`` of :mod:`concurrent.futures` + now closes explicitly the result queue. + +- bpo-30966: Add a new :meth:`~multiprocessing.SimpleQueue.close` method to + the :class:`~multiprocessing.SimpleQueue` class to explicitly close the + queue. + +- bpo-39966: Revert bpo-25597. :class:`unittest.mock.MagicMock` with wraps' + set uses default return values for magic methods. + +- bpo-39791: Added ``files()`` function to importlib.resources with support + for subdirectories in package data, matching backport in + importlib_resources 1.5. + +- bpo-40375: :meth:`imaplib.IMAP4.unselect` is added. Patch by Dong-hee Na. + +- bpo-40389: ``repr()`` now returns ``typing.Optional[T]`` when called for + ``typing.Union`` of two types, one of which is ``NoneType``. + +- bpo-40291: Add support for CAN_J1939 sockets (available on Linux 5.4+) + +- bpo-40273: :class:`types.MappingProxyType` is now reversible. + +- bpo-39075: The repr for :class:`types.SimpleNamespace` is now insertion + ordered rather than alphabetical. + +- bpo-40192: On AIX, :func:`~time.thread_time` is now implemented with + ``thread_cputime()`` which has nanosecond resolution, rather than + ``clock_gettime(CLOCK_THREAD_CPUTIME_ID)`` which has a resolution of 10 + ms. Patch by Batuhan Taskaya. + +- bpo-40025: Raise TypeError when _generate_next_value_ is defined after + members. Patch by Ethan Onstott. + +- bpo-39058: In the argparse module, the repr for Namespace() and other + argument holders now displayed in the order attributes were added. + Formerly, it displayed in alphabetical order even though argument order is + preserved the user visible parts of the module. + +- bpo-24416: The ``isocalendar()`` methods of :class:`datetime.date` and + :class:`datetime.datetime` now return a :term:`named tuple` instead of a + :class:`tuple`. + +Documentation +------------- + +- bpo-34790: Add version of removal for explicit passing of coros to + `asyncio.wait()`'s documentation + +- bpo-40561: Provide docstrings for webbrowser open functions. + +- bpo-40499: Mention that :func:`asyncio.wait` requires a non-empty set of + awaitables. + +- bpo-39705: Tutorial example for sorted() in the Loop Techniques section is + given a better explanation. Also a new example is included to explain + sorted()'s basic behavior. + +- bpo-39435: Fix an incorrect signature for :func:`pickle.loads` in the docs + +Tests +----- + +- bpo-40055: distutils.tests now saves/restores warnings filters to leave + them unchanged. Importing tests imports docutils which imports + pkg_resources which adds a warnings filter. + +- bpo-40436: test_gdb and test.pythoninfo now check gdb command exit code. + +Build +----- + +- bpo-40653: Move _dirnameW out of HAVE_SYMLINK to fix a potential compiling + issue. + +- bpo-40514: Add ``--with-experimental-isolated-subinterpreters`` build + option to ``configure``: better isolate subinterpreters, experimental + build mode. + +Windows +------- + +- bpo-40650: Include winsock2.h in pytime.c for timeval. + +- bpo-40458: Increase reserved stack space to prevent overflow crash on + Windows. + +- bpo-39148: Add IPv6 support to :mod:`asyncio` datagram endpoints in + ProactorEventLoop. Change the raised exception for unknown address + families to ValueError as it's not coming from Windows API. + +macOS +----- + +- bpo-34956: When building Python on macOS from source, ``_tkinter`` now + links with non-system Tcl and Tk frameworks if they are installed in + ``/Library/Frameworks``, as had been the case on older releases of macOS. + If a macOS SDK is explicitly configured, by using + ``--enable-universalsdk=`` or ``-isysroot``, only the SDK itself is + searched. The default behavior can still be overridden with + ``--with-tcltk-includes`` and ``--with-tcltk-libs``. + +- bpo-35569: Expose RFC 3542 IPv6 socket options. + +Tools/Demos +----------- + +- bpo-40479: Update multissltest helper to test with latest OpenSSL 1.0.2, + 1.1.0, 1.1.1, and 3.0.0-alpha. + +- bpo-40431: Fix a syntax typo in ``turtledemo`` that now raises a + ``SyntaxError``. + +- bpo-40163: Fix multissltest tool. OpenSSL has changed download URL for old + releases. The multissltest tool now tries to download from current and old + download URLs. + +C API +----- + +- bpo-39465: Remove the ``_PyUnicode_ClearStaticStrings()`` function from + the C API. + +- bpo-38787: Add PyCFunction_CheckExact() macro for exact type checks now + that we allow subtypes of PyCFunction, as well as PyCMethod_CheckExact() + and PyCMethod_Check() for the new PyCMethod subtype. + +- bpo-40545: Declare ``_PyErr_GetTopmostException()`` with ``PyAPI_FUNC()`` + to properly export the function in the C API. The function remains private + (``_Py``) prefix. + +- bpo-40412: Nullify inittab_copy during finalization, preventing future + interpreter initializations in an embedded situation from crashing. Patch + by Gregory Szorc. + +- bpo-40429: The :c:func:`PyThreadState_GetFrame` function now returns a + strong reference to the frame. + +- bpo-40428: Remove the following functions from the C API. Call + :c:func:`PyGC_Collect` explicitly to free all free lists. + + * ``PyAsyncGen_ClearFreeLists()`` + * ``PyContext_ClearFreeList()`` + * ``PyDict_ClearFreeList()`` + * ``PyFloat_ClearFreeList()`` + * ``PyFrame_ClearFreeList()`` + * ``PyList_ClearFreeList()`` + * ``PySet_ClearFreeList()`` + * ``PyTuple_ClearFreeList()`` + +- bpo-40421: New :c:func:`PyFrame_GetBack` function: get the frame next + outer frame. + +- bpo-40421: New :c:func:`PyFrame_GetCode` function: return a borrowed + reference to the frame code. + +- bpo-40217: Ensure that instances of types created with + :c:func:`PyType_FromSpecWithBases` will visit its class object when + traversing references in the garbage collector (implemented as an + extension of the provided :c:member:`~PyTypeObject.tp_traverse`). Patch by + Pablo Galindo. + +- bpo-38787: Module C state is now accessible from C-defined heap type + methods (:pep:`573`). Patch by Marcel Plch and Petr Viktorin. + + +What's New in Python 3.9.0 alpha 6? +=================================== + +*Release date: 2020-04-27* + +Security +-------- + +- bpo-40121: Fixes audit events raised on creating a new socket. + +- bpo-39073: Disallow CR or LF in email.headerregistry.Address arguments to + guard against header injection attacks. + +- bpo-39503: CVE-2020-8492: The + :class:`~urllib.request.AbstractBasicAuthHandler` class of the + :mod:`urllib.request` module uses an inefficient regular expression which + can be exploited by an attacker to cause a denial of service. Fix the + regex to prevent the catastrophic backtracking. Vulnerability reported by + Ben Caller and Matt Schwager. + +Core and Builtins +----------------- + +- bpo-40313: Improve the performance of bytes.hex(). + +- bpo-40334: Switch to a new parser, based on PEG. For more details see PEP + 617. To temporarily switch back to the old parser, use ``-X oldparser`` or + ``PYTHONOLDPARSER=1``. In Python 3.10 we will remove the old parser + completely, including the ``parser`` module (already deprecated) and + anything that depends on it. + +- bpo-40267: Fix the tokenizer to display the correct error message, when + there is a SyntaxError on the last input character and no newline follows. + It used to be `unexpected EOF while parsing`, while it should be `invalid + syntax`. + +- bpo-39522: Correctly unparse explicit ``u`` prefix for strings when + postponed evaluation for annotations activated. Patch by Batuhan Taskaya. + +- bpo-40246: Report a specialized error message, `invalid string prefix`, + when the tokenizer encounters a string with an invalid prefix. + +- bpo-40082: Fix the signal handler: it now always uses the main + interpreter, rather than trying to get the current Python thread state. + +- bpo-37388: str.encode() and str.decode() no longer check the encoding and + errors in development mode or in debug mode during Python finalization. + The codecs machinery can no longer work on very late calls to str.encode() + and str.decode(). + +- bpo-40077: Fix possible refleaks in :mod:`_json`, memo of PyScannerObject + should be traversed. + +- bpo-37207: Speed up calls to ``dict()`` by using the :pep:`590` + ``vectorcall`` calling convention. + +- bpo-40141: Add column and line information to ``ast.keyword`` nodes. Patch + by Pablo Galindo. + +- bpo-1635741: Port :mod:`resource` to multiphase initialization + (:pep:`489`). + +- bpo-1635741: Port :mod:`math` to multiphase initialization (:pep:`489`). + +- bpo-1635741: Port _uuid module to multiphase initialization (:pep:`489`). + +- bpo-40077: Convert json module to use :c:func:`PyType_FromSpec`. + +- bpo-40067: Improve the error message for multiple star expressions in an + assignment. Patch by Furkan Onder + +- bpo-1635741: Port _functools module to multiphase initialization (PEP + 489). Patch by Paulo Henrique Silva. + +- bpo-1635741: Port operator module to multiphase initialization (PEP 489). + Patch by Paulo Henrique Silva. + +- bpo-20526: Fix :c:func:`PyThreadState_Clear()`. ``PyThreadState.frame`` is + a borrowed reference, not a strong reference: ``PyThreadState_Clear()`` + must not call ``Py_CLEAR(tstate->frame)``. + +- bpo-1635741: Port time module to multiphase initialization (:pep:`489`). + Patch by Paulo Henrique Silva. + +- bpo-1635741: Port _weakref extension module to multiphase initialization + (:pep:`489`). + +- bpo-40020: Fix a leak and subsequent crash in parsetok.c caused by realloc + misuse on a rare codepath. + +- bpo-39939: Added str.removeprefix and str.removesuffix methods and + corresponding bytes, bytearray, and collections.UserString methods to + remove affixes from a string if present. See :pep:`616` for a full + description. Patch by Dennis Sweeney. + +- bpo-39481: Implement PEP 585. This supports list[int], tuple[str, ...] + etc. + +- bpo-32894: Support unparsing of infinity numbers in postponed annotations. + Patch by Batuhan Taşkaya. + +- bpo-37207: Speed up calls to ``list()`` by using the :pep:`590` + ``vectorcall`` calling convention. Patch by Mark Shannon. + +Library +------- + +- bpo-40398: :func:`typing.get_args` now always returns an empty tuple for + special generic aliases. + +- bpo-40396: Functions :func:`typing.get_origin`, :func:`typing.get_args` + and :func:`typing.get_type_hints` support now generic aliases like + ``list[int]``. + +- bpo-38061: Optimize the :mod:`subprocess` module on FreeBSD using + ``closefrom()``. A single ``close(fd)`` syscall is cheap, but when + ``sysconf(_SC_OPEN_MAX)`` is high, the loop calling ``close(fd)`` on each + file descriptor can take several milliseconds. + + The workaround on FreeBSD to improve performance was to load and mount the + fdescfs kernel module, but this is not enabled by default. + + Initial patch by Ed Maste (emaste), Conrad Meyer (cem), Kyle Evans + (kevans) and Kubilay Kocak (koobs): + https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=242274 + +- bpo-38061: On FreeBSD, ``os.closerange(fd_low, fd_high)`` now calls + ``closefrom(fd_low)`` if *fd_high* is greater than or equal to + ``sysconf(_SC_OPEN_MAX)``. + + Initial patch by Ed Maste (emaste), Conrad Meyer (cem), Kyle Evans + (kevans) and Kubilay Kocak (koobs): + https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=242274 + +- bpo-40360: The :mod:`lib2to3` module is pending deprecation due to + :pep:`617`. + +- bpo-40138: Fix the Windows implementation of :func:`os.waitpid` for exit + code larger than ``INT_MAX >> 8``. The exit status is now interpreted as + an unsigned number. + +- bpo-39942: Set "__main__" as the default module name when "__name__" is + missing in :class:`typing.TypeVar`. Patch by Weipeng Hong. + +- bpo-40275: The :mod:`logging` package is now imported lazily in + :mod:`unittest` only when the :meth:`~unittest.TestCase.assertLogs` + assertion is used. + +- bpo-40275: The :mod:`asyncio` package is now imported lazily in + :mod:`unittest` only when the :class:`~unittest.IsolatedAsyncioTestCase` + class is used. + +- bpo-40330: In :meth:`ShareableList.__setitem__`, check the size of a new + string item after encoding it to utf-8, not before. + +- bpo-40148: Added :meth:`pathlib.Path.with_stem()` to create a new Path + with the stem replaced. + +- bpo-40325: Deprecated support for set objects in random.sample(). + +- bpo-40257: Improved help for the :mod:`typing` module. Docstrings are now + shown for all special forms and special generic aliases (like ``Union`` + and ``List``). Using ``help()`` with generic alias like ``List[int]`` will + show the help for the correspondent concrete type (``list`` in this case). + +- bpo-40257: func:`inspect.getdoc` no longer returns docstring inherited + from the type of the object or from parent class if it is a class if it is + not defined in the object itself. In :mod:`pydoc` the documentation string + is now shown not only for class, function, method etc, but for any object + that has its own ``__doc__`` attribute. + +- bpo-40287: Fixed ``SpooledTemporaryFile.seek()`` to return the position. + +- bpo-40290: Added zscore() to statistics.NormalDist(). + +- bpo-40282: Allow ``random.getrandbits(0)`` to succeed and to return 0. + +- bpo-40286: Add :func:`random.randbytes` function and + :meth:`random.Random.randbytes` method to generate random bytes. + +- bpo-40277: :func:`collections.namedtuple` now provides a human-readable + repr for its field accessors. + +- bpo-40270: The included copy of sqlite3 on Windows is now compiled with + the json extension. This allows the use of functions such as + ``json_object``. + +- bpo-29255: Wait in `KqueueSelector.select` when no fds are registered + +- bpo-40260: Ensure :mod:`modulefinder` uses :func:`io.open_code` and + respects coding comments. + +- bpo-40234: Allow again to spawn daemon threads in subinterpreters (revert + change which denied them). + +- bpo-39207: Workers in :class:`~concurrent.futures.ProcessPoolExecutor` are + now spawned on demand, only when there are no available idle workers to + reuse. This optimizes startup overhead and reduces the amount of lost CPU + time to idle workers. Patch by Kyle Stanley. + +- bpo-40091: Fix a hang at fork in the logging module: the new private + _at_fork_reinit() method is now used to reinitialize locks at fork in the + child process. + +- bpo-40149: Implement traverse and clear slots in _abc._abc_data type. + +- bpo-40208: Remove deprecated :meth:`symtable.SymbolTable.has_exec`. + +- bpo-40196: Fix a bug in the :mod:`symtable` module that was causing + incorrectly report global variables as local. Patch by Pablo Galindo. + +- bpo-40190: Add support for ``_SC_AIX_REALMEM`` to :func:`posix.sysconf`. + +- bpo-40182: Removed the ``_field_types`` attribute of the + :class:`typing.NamedTuple` class. + +- bpo-36517: Multiple inheritance with :class:`typing.NamedTuple` now raises + an error instead of silently ignoring other types. + +- bpo-40126: Fixed reverting multiple patches in unittest.mock. Patcher's + ``__exit__()`` is now never called if its ``__enter__()`` is failed. + Returning true from ``__exit__()`` silences now the exception. + +- bpo-40094: CGIHTTPRequestHandler of http.server now logs the CGI script + exit code, rather than the CGI script exit status of os.waitpid(). For + example, if the script is killed by signal 11, it now logs: "CGI script + exit code -11." + +- bpo-40108: Improve the error message when triying to import a module using + :mod:`runpy` and incorrently use the ".py" extension at the end of the + module name. Patch by Pablo Galindo. + +- bpo-40094: Add :func:`os.waitstatus_to_exitcode` function: convert a wait + status to an exit code. + +- bpo-40089: Fix threading._after_fork(): if fork was not called by a thread + spawned by threading.Thread, threading._after_fork() now creates a + _MainThread instance for _main_thread, instead of a _DummyThread instance. + +- bpo-40089: Add a private ``_at_fork_reinit()`` method to + :class:`_thread.Lock`, :class:`_thread.RLock`, :class:`threading.RLock` + and :class:`threading.Condition` classes: reinitialize the lock at fork in + the child process, reset the lock to the unlocked state. Rename also the + private ``_reset_internal_locks()`` method of :class:`threading.Event` to + ``_at_fork_reinit()``. + +- bpo-25780: Expose :data:`~socket.CAN_RAW_JOIN_FILTERS` in the + :mod:`socket` module. + +- bpo-39503: :class:`~urllib.request.AbstractBasicAuthHandler` of + :mod:`urllib.request` now parses all WWW-Authenticate HTTP headers and + accepts multiple challenges per header: use the realm of the first Basic + challenge. + +- bpo-39812: Removed daemon threads from :mod:`concurrent.futures` by adding + an internal `threading._register_atexit()`, which calls registered + functions prior to joining all non-daemon threads. This allows for + compatibility with subinterpreters, which don't support daemon threads. + +- bpo-40050: Fix ``importlib._bootstrap_external``: avoid creating a new + ``winreg`` builtin module if it's already available in + :data:`sys.modules`, and remove redundant imports. + +- bpo-40014: Fix ``os.getgrouplist()``: if ``getgrouplist()`` function fails + because the group list is too small, retry with a larger group list. On + failure, the glibc implementation of ``getgrouplist()`` sets ``ngroups`` + to the total number of groups. For other implementations, double the group + list size. + +- bpo-40017: Add :data:`time.CLOCK_TAI` constant if the operating system + support it. + +- bpo-40016: In re docstring, clarify the relationship between inline and + argument compile flags. + +- bpo-39953: Update internal table of OpenSSL error codes in the ``ssl`` + module. + +- bpo-36144: Added :pep:`584` operators to + :class:`weakref.WeakValueDictionary`. + +- bpo-36144: Added :pep:`584` operators to + :class:`weakref.WeakKeyDictionary`. + +- bpo-38891: Fix linear runtime behaviour of the `__getitem__` and + `__setitem__` methods in + :class:`multiprocessing.shared_memory.ShareableList`. This avoids + quadratic performance when iterating a `ShareableList`. Patch by Thomas + Krennwallner. + +- bpo-39682: Remove undocumented support for *closing* a `pathlib.Path` + object via its context manager. The context manager magic methods remain, + but they are now a no-op, making `Path` objects immutable. + +- bpo-36144: Added :pep:`584` operators (``|`` and ``|=``) to + :class:`collections.ChainMap`. + +- bpo-39011: Normalization of line endings in ElementTree attributes was + removed, as line endings which were replaced by entity numbers should be + preserved in original form. + +- bpo-38410: Properly handle :func:`sys.audit` failures in + :func:`sys.set_asyncgen_hooks`. + +- bpo-36541: lib2to3 now recognizes named assignment expressions (the walrus + operator, ``:=``) + +- bpo-35967: In platform, delay the invocation of 'uname -p' until the + processor attribute is requested. + +- bpo-35113: :meth:`inspect.getsource` now returns correct source code for + inner class with same name as module level class. Decorators are also + returned as part of source of the class. Patch by Karthikeyan + Singaravelan. + +- bpo-33262: Deprecate passing None as an argument for + :func:`shlex.split()`'s ``s`` parameter. Patch by Zackery Spytz. + +- bpo-31758: Prevent crashes when using an uninitialized + ``_elementtree.XMLParser`` object. Patch by Oren Milman. + +Documentation +------------- + +- bpo-27635: The pickle documentation incorrectly claimed that ``__new__`` + isn't called by default when unpickling. + +- bpo-39879: Updated :ref:`datamodel` docs to include :func:`dict` insertion + order preservation. Patch by Furkan Onder and Samy Lahfa. + +- bpo-38387: Document :c:macro:`PyDoc_STRVAR` macro in the C-API reference. + +- bpo-13743: Some methods within xml.dom.minidom.Element class are now + better documented. + +Tests +----- + +- bpo-31904: Set expected default encoding in test_c_locale_coercion.py for + VxWorks RTOS. + +- bpo-40162: Update Travis CI configuration to OpenSSL 1.1.1f. + +- bpo-40146: Update OpenSSL to 1.1.1f in Azure Pipelines. + +- bpo-40094: Add :func:`test.support.wait_process` function. + +- bpo-40003: ``test.bisect_cmd`` now copies Python command line options like + ``-O`` or ``-W``. Moreover, emit a warning if ``test.bisect_cmd`` is used + with ``-w``/``--verbose2`` option. + +- bpo-39380: Add the encoding in :class:`ftplib.FTP` and + :class:`ftplib.FTP_TLS` to the constructor as keyword-only and change the + default from ``latin-1`` to ``utf-8`` to follow :rfc:`2640`. + +- bpo-39793: Use the same domain when testing ``make_msgid``. Patch by + Batuhan Taskaya. + +- bpo-1812: Fix newline handling in doctest.testfile when loading from a + package whose loader has a get_data method. Patch by Peter Donis. + +Build +----- + +- bpo-38360: Support single-argument form of macOS -isysroot flag. + +- bpo-40158: Fix CPython MSBuild Properties in NuGet Package + (build/native/python.props) + +- bpo-38527: Fix configure check on Solaris for "float word ordering": + sometimes, the correct "grep" command was not being used. Patch by Arnon + Yaari. + +Windows +------- + +- bpo-40164: Updates Windows to OpenSSL 1.1.1f + +- bpo-8901: Ignore the Windows registry when the ``-E`` option is used. + +macOS +----- + +- bpo-38329: python.org macOS installers now update the Current version + symlink of /Library/Frameworks/Python.framework/Versions for 3.9 installs. + Previously, Current was only updated for Python 2.x installs. This should + make it easier to embed Python 3 into other macOS applications. + +- bpo-40164: Update macOS installer builds to use OpenSSL 1.1.1g. + +IDLE +---- + +- bpo-38439: Add a 256×256 pixel IDLE icon to support more modern + environments. Created by Andrew Clover. Delete the unused macOS idle.icns + icon file. + +- bpo-38689: IDLE will no longer freeze when inspect.signature fails when + fetching a calltip. + +Tools/Demos +----------- + +- bpo-40385: Removed the checkpyc.py tool. Please see compileall without + force mode as a potential alternative. + +- bpo-40179: Fixed translation of ``#elif`` in Argument Clinic. + +- bpo-40094: Fix ``which.py`` script exit code: it now uses + :func:`os.waitstatus_to_exitcode` to convert :func:`os.system` exit status + into an exit code. + +C API +----- + +- bpo-40241: Move the :c:type:`PyGC_Head` structure to the internal C API. + +- bpo-40170: Convert :c:func:`PyObject_IS_GC` macro to a function to hide + implementation details. + +- bpo-40241: Add the functions :c:func:`PyObject_GC_IsTracked` and + :c:func:`PyObject_GC_IsFinalized` to the public API to allow to query if + Python objects are being currently tracked or have been already finalized + by the garbage collector respectively. Patch by Pablo Galindo. + +- bpo-40170: The :c:func:`PyObject_NEW` macro becomes an alias to the + :c:func:`PyObject_New` macro, and the :c:func:`PyObject_NEW_VAR` macro + becomes an alias to the :c:func:`PyObject_NewVar` macro, to hide + implementation details. They no longer access directly the + :c:member:`PyTypeObject.tp_basicsize` member. + +- bpo-40170: :c:func:`PyType_HasFeature` now always calls + :c:func:`PyType_GetFlags` to hide implementation details. Previously, it + accessed directly the :c:member:`PyTypeObject.tp_flags` member when the + limited C API was not used. + +- bpo-40170: Convert the :c:func:`PyObject_GET_WEAKREFS_LISTPTR` macro to a + function to hide implementation details: the macro accessed directly to + the :c:member:`PyTypeObject.tp_weaklistoffset` member. + +- bpo-40170: Convert :c:func:`PyObject_CheckBuffer` macro to a function to + hide implementation details: the macro accessed directly the + :c:member:`PyTypeObject.tp_as_buffer` member. + +- bpo-40170: Always declare :c:func:`PyIndex_Check` as an opaque function to + hide implementation details: remove ``PyIndex_Check()`` macro. The macro + accessed directly the :c:member:`PyTypeObject.tp_as_number` member. + +- bpo-39947: Add :c:func:`PyThreadState_GetID` function: get the unique + identifier of a Python thread state. + + +What's New in Python 3.9.0 alpha 5? +=================================== + +*Release date: 2020-03-23* + +Security +-------- + +- bpo-38576: Disallow control characters in hostnames in http.client, + addressing CVE-2019-18348. Such potentially malicious header injection + URLs now cause a InvalidURL to be raised. + +Core and Builtins +----------------- + +- bpo-40010: Optimize pending calls in multithreaded applications. If a + thread different than the main thread schedules a pending call + (:c:func:`Py_AddPendingCall`), the bytecode evaluation loop is no longer + interrupted at each bytecode instruction to check for pending calls which + cannot be executed. Only the main thread can execute pending calls. + + Previously, the bytecode evaluation loop was interrupted at each + instruction until the main thread executes pending calls. + +- bpo-1635741: Port _weakref extension module to multiphase initialization + (:pep:`489`). + +- bpo-1635741: Port _collections module to multiphase initialization + (:pep:`489`). + +- bpo-40010: Optimize signal handling in multithreaded applications. If a + thread different than the main thread gets a signal, the bytecode + evaluation loop is no longer interrupted at each bytecode instruction to + check for pending signals which cannot be handled. Only the main thread of + the main interpreter can handle signals. + + Previously, the bytecode evaluation loop was interrupted at each + instruction until the main thread handles signals. + +- bpo-39984: If :c:func:`Py_AddPendingCall` is called in a subinterpreter, + the function is now scheduled to be called from the subinterpreter, rather + than being called from the main interpreter. Each subinterpreter now has + its own list of scheduled calls. + +- bpo-1635741: Port _heapq module to multiphase initialization. + +- bpo-1635741: Port itertools module to multiphase initialization + (:pep:`489`). + +- bpo-37207: Speed up calls to ``frozenset()`` by using the :pep:`590` + ``vectorcall`` calling convention. Patch by Dong-hee Na. + +- bpo-39984: subinterpreters: Move + ``_PyRuntimeState.ceval.tracing_possible`` to + ``PyInterpreterState.ceval.tracing_possible``: each interpreter now has + its own variable. + +- bpo-37207: Speed up calls to ``set()`` by using the :pep:`590` + ``vectorcall`` calling convention. Patch by Dong-hee Na. + +- bpo-1635741: Port _statistics module to multiphase initialization + (:pep:`489`). + +- bpo-39968: Use inline function to replace extension modules' + get_module_state macros. + +- bpo-39965: Correctly raise ``SyntaxError`` if *await* is used inside + non-async functions and ``PyCF_ALLOW_TOP_LEVEL_AWAIT`` is set (like in the + asyncio REPL). Patch by Pablo Galindo. + +- bpo-39562: Allow executing asynchronous comprehensions on the top level + when the ``PyCF_ALLOW_TOP_LEVEL_AWAIT`` flag is given. Patch by Batuhan + Taskaya. + +- bpo-37207: Speed up calls to ``tuple()`` by using the :pep:`590` + ``vectorcall`` calling convention. Patch by Dong-hee Na. + +- bpo-38373: Chaged list overallocation strategy. It no longer overallocates + if the new size is closer to overalocated size than to the old size and + adds padding. + +- bpo-39926: Update Unicode database to Unicode version 13.0.0. + +- bpo-19466: Clear the frames of daemon threads earlier during the Python + shutdown to call objects destructors. So "unclosed file" resource warnings + are now emitted for daemon threads in a more reliable way. + +- bpo-38894: Fix a bug that was causing incomplete results when calling + ``pathlib.Path.glob`` in the presence of symlinks that point to files + where the user does not have read access. Patch by Pablo Galindo and Matt + Wozniski. + +- bpo-39877: Fix :c:func:`PyEval_RestoreThread` random crash at exit with + daemon threads. It now accesses the ``_PyRuntime`` variable directly + instead of using ``tstate->interp->runtime``, since ``tstate`` can be a + dangling pointer after :c:func:`Py_Finalize` has been called. Moreover, + the daemon thread now exits before trying to take the GIL. + +- bpo-39871: Fix a possible :exc:`SystemError` in + ``math.{atan2,copysign,remainder}()`` when the first argument cannot be + converted to a :class:`float`. Patch by Zackery Spytz. + +- bpo-39776: Fix race condition where threads created by PyGILState_Ensure() + could get a duplicate id. + + This affects consumers of tstate->id like the contextvar caching + machinery, which could return invalid cached objects under heavy thread + load (observed in embedded scenarios). + +- bpo-39778: Fixed a crash due to incorrect handling of weak references in + ``collections.OrderedDict`` classes. Patch by Pablo Galindo. + +- bpo-1635741: Port audioop extension module to multiphase initialization + (:pep:`489`). + +- bpo-39702: Relax :term:`decorator` grammar restrictions to allow any valid + expression (:pep:`614`). + +- bpo-38091: Tweak import deadlock detection code to not deadlock itself. + +- bpo-1635741: Port _locale extension module to multiphase initialization + (:pep:`489`). + +- bpo-39087: Optimize :c:func:`PyUnicode_AsUTF8` and + :c:func:`PyUnicode_AsUTF8AndSize` slightly when they need to create + internal UTF-8 cache. + +- bpo-39520: Fix unparsing of ext slices with no items (``foo[:,]``). Patch + by Batuhan Taskaya. + +- bpo-39220: Do not optimize annotations if 'from __future__ import + annotations' is used. Patch by Pablo Galindo. + +- bpo-35712: Using :data:`NotImplemented` in a boolean context has been + deprecated. Patch contributed by Josh Rosenberg. + +- bpo-22490: Don't leak environment variable ``__PYVENV_LAUNCHER__`` into + the interpreter session on macOS. + +Library +------- + +- bpo-39830: Add :class:`zipfile.Path` to ``__all__`` in the :mod:`zipfile` + module. + +- bpo-40000: Improved error messages for validation of ``ast.Constant`` + nodes. Patch by Batuhan Taskaya. + +- bpo-39999: ``__module__`` of the AST node classes is now set to "ast" + instead of "_ast". Added docstrings for dummy AST node classes and + deprecated attributes. + +- bpo-39991: :func:`uuid.getnode` now skips IPv6 addresses with the same + string length than a MAC address (17 characters): only use MAC addresses. + +- bpo-39988: Deprecated ``ast.AugLoad`` and ``ast.AugStore`` node classes + because they are no longer used. + +- bpo-39656: Ensure ``bin/python3.#`` is always present in virtual + environments on POSIX platforms - by Anthony Sottile. + +- bpo-39969: Deprecated ``ast.Param`` node class because it's no longer + used. Patch by Batuhan Taskaya. + +- bpo-39360: Ensure all workers exit when finalizing a + :class:`multiprocessing.Pool` implicitly via the module finalization + handlers of multiprocessing. This fixes a deadlock situation that can be + experienced when the Pool is not properly finalized via the context + manager or a call to ``multiprocessing.Pool.terminate``. Patch by Batuhan + Taskaya and Pablo Galindo. + +- bpo-35370: sys.settrace(), sys.setprofile() and _lsprof.Profiler.enable() + now properly report :c:func:`PySys_Audit` error if "sys.setprofile" or + "sys.settrace" audit event is denied. + +- bpo-39936: AIX: Fix _aix_support module when the subprocess is not + available, when building Python from scratch. It now uses new private + _bootsubprocess module, rather than having two implementations depending + if subprocess is available or not. So _aix_support.aix_platform() result + is now the same if subprocess is available or not. + +- bpo-36144: :class:`collections.OrderedDict` now implements ``|`` and + ``|=`` (:pep:`584`). + +- bpo-39652: The column name found in ``sqlite3.Cursor.description`` is now + truncated on the first '[' only if the PARSE_COLNAMES option is set. + +- bpo-39915: Ensure :attr:`unittest.mock.AsyncMock.await_args_list` has call + objects in the order of awaited arguments instead of using + :attr:`unittest.mock.Mock.call_args` which has the last value of the call. + Patch by Karthikeyan Singaravelan. + +- bpo-36144: Updated :data:`os.environ` and :data:`os.environb` to support + :pep:`584`'s merge (``|``) and update (``|=``) operators. + +- bpo-38662: The ``ensurepip`` module now invokes ``pip`` via the ``runpy`` + module. Hence it is no longer tightly coupled with the internal API of the + bundled ``pip`` version, allowing easier updates to a newer ``pip`` + version both internally and for distributors. + +- bpo-38075: Fix the :meth:`random.Random.seed` method when a :class:`bool` + is passed as the seed. + +- bpo-39916: More reliable use of ``os.scandir()`` in ``Path.glob()``. It no + longer emits a ResourceWarning when interrupted. + +- bpo-39850: :mod:`multiprocessing` now supports abstract socket addresses + (if abstract sockets are supported in the running platform). When creating + arbitrary addresses (like when default-constructing + :class:`multiprocessing.connection.Listener` objects) abstract sockets are + preferred to avoid the case when the temporary-file-generated address is + too large for an AF_UNIX socket address. Patch by Pablo Galindo. + +- bpo-36287: :func:`ast.dump()` no longer outputs optional fields and + attributes with default values. The default values for optional fields and + attributes of AST nodes are now set as class attributes (e.g. + ``Constant.kind`` is set to ``None``). + +- bpo-39889: Fixed :func:`ast.unparse` for extended slices containing a + single element (e.g. ``a[i:j,]``). Remove redundant tuples when index with + a tuple (e.g. ``a[i, j]``). + +- bpo-39828: Fix :mod:`json.tool` to catch :exc:`BrokenPipeError`. Patch by + Dong-hee Na. + +- bpo-13487: Avoid a possible *"RuntimeError: dictionary changed size during + iteration"* from :func:`inspect.getmodule` when it tried to loop through + :attr:`sys.modules`. + +- bpo-39674: Revert "bpo-37330: open() no longer accept 'U' in file mode". + The "U" mode of open() is kept in Python 3.9 to ease transition from + Python 2.7, but will be removed in Python 3.10. + +- bpo-28577: The hosts method on 32-bit prefix length IPv4Networks and + 128-bit prefix IPv6Networks now returns a list containing the single + Address instead of an empty list. + +- bpo-39826: Add getConnection method to logging HTTPHandler to enable + custom connections. + +- bpo-39763: Reimplement :func:`distutils.spawn.spawn` function with the + :mod:`subprocess` module. + +- bpo-39794: Add --without-decimal-contextvar build option. This enables a + thread-local rather than a coroutine local context. + +- bpo-36144: :class:`collections.defaultdict` now implements ``|`` + (:pep:`584`). + +- bpo-39517: Fix runpy.run_path() when using pathlike objects + +- bpo-39775: Change ``inspect.Signature.parameters`` back to + ``collections.OrderedDict``. This was changed to ``dict`` in Python + 3.9.0a4. + +- bpo-39678: Refactor queue_manager in + :class:`concurrent.futures.ProcessPoolExecutor` to make it easier to + maintain. + +- bpo-39764: Fix AttributeError when calling get_stack on a PyAsyncGenObject + Task + +- bpo-39769: The :func:`compileall.compile_dir` function's *ddir* parameter + and the compileall command line flag `-d` no longer write the wrong + pathname to the generated pyc file for submodules beneath the root of the + directory tree being compiled. This fixes a regression introduced with + Python 3.5. + +- bpo-36144: :class:`types.MappingProxyType` objects now support the merge + (``|``) operator from :pep:`584`. + +- bpo-38691: The :mod:`importlib` module now ignores the + :envvar:`PYTHONCASEOK` environment variable when the :option:`-E` or + :option:`-I` command line options are being used. + +- bpo-39719: Remove :meth:`tempfile.SpooledTemporaryFile.softspace` as files + no longer have the ``softspace`` attribute in Python 3. Patch by Shantanu. + +- bpo-39667: Improve pathlib.Path compatibility on zipfile.Path and correct + performance degradation as found in zipp 3.0. + +- bpo-39638: Keep ASDL signatures in the docstrings for ``AST`` nodes. Patch + by Batuhan Taskaya + +- bpo-39639: Deprecated ``ast.Suite`` node class because it's no longer + used. Patch by Batuhan Taskaya. + +- bpo-39609: Add thread_name_prefix to default asyncio executor + +- bpo-39548: Fix handling of header in + :class:`urllib.request.AbstractDigestAuthHandler` when the optional + ``qop`` parameter is not present. + +- bpo-39509: HTTP status codes ``103 EARLY_HINTS`` and ``425 TOO_EARLY`` are + added to :class:`http.HTTPStatus`. Patch by Dong-hee Na. + +- bpo-39507: Adding HTTP status 418 "I'm a Teapot" to HTTPStatus in http + library. Patch by Ross Rhodes. + +- bpo-39495: Remove default value from *attrs* parameter of + :meth:`xml.etree.ElementTree.TreeBuilder.start` for consistency between + Python and C implementations. + +- bpo-38971: Open issue in the BPO indicated a desire to make the + implementation of codecs.open() at parity with io.open(), which implements + a try/except to assure file stream gets closed before an exception is + raised. + +- bpo-38641: Added starred expressions support to ``return`` and ``yield`` + statements for ``lib2to3``. Patch by Vlad Emelianov. + +- bpo-37534: When using minidom module to generate XML documents the ability + to add Standalone Document Declaration is added. All the changes are made + to generate a document in compliance with Extensible Markup Language (XML) + 1.0 (Fifth Edition) W3C Recommendation (available here: + https://www.w3.org/TR/xml/#sec-prolog-dtd). + +- bpo-34788: Add support for scoped IPv6 addresses to :mod:`ipaddress`. + Patch by Oleksandr Pavliuk. + +- bpo-34822: Simplified AST for subscription. Simple indices are now + represented by their value, extended slices are represented as tuples. + :mod:`ast` classes ``Index`` and ``ExtSlice`` are considered deprecated + and will be removed in future Python versions. In the meantime, + ``Index(value)`` now returns a ``value`` itself, ``ExtSlice(slices)`` + returns ``Tuple(slices, Load())``. + +Documentation +------------- + +- bpo-39868: Updated the Language Reference for :pep:`572`. + +- bpo-13790: Change 'string' to 'specification' in format doc. + +- bpo-17422: The language reference no longer restricts default class + namespaces to dicts only. + +- bpo-39530: Fix misleading documentation about mixed-type numeric + comparisons. + +- bpo-39718: Update :mod:`token` documentation to reflect additions in + Python 3.8 + +- bpo-39677: Changed operand name of **MAKE_FUNCTION** from *argc* to + *flags* for module :mod:`dis` + +Tests +----- + +- bpo-40019: test_gdb now skips tests if it detects that gdb failed to read + debug information because the Python binary is optimized. + +- bpo-27807: ``test_site.test_startup_imports()`` is now skipped if a path + of :data:`sys.path` contains a ``.pth`` file. + +- bpo-26067: Do not fail test_shutil test_chown test when uid or gid of user + cannot be resolved to a name. + +- bpo-39855: test_subprocess.test_user() now skips the test on an user name + if the user name doesn't exist. For example, skip the test if the user + "nobody" doesn't exist on Linux. + +Build +----- + +- bpo-39761: Fix build with DTrace but without additional DFLAGS. + +- bpo-39763: setup.py now uses a basic implementation of the + :mod:`subprocess` module if the :mod:`subprocess` module is not available: + before required C extension modules are built. + +- bpo-1294959: Add ``--with-platlibdir`` option to the configure script: + name of the platform-specific library directory, stored in the new + :attr:`sys.platlibdir` attribute. It is used to build the path of + platform-specific extension modules and the path of the standard library. + It is equal to ``"lib"`` on most platforms. On Fedora and SuSE, it is + equal to ``"lib64"`` on 64-bit platforms. Patch by Jan Matějek, Matěj + Cepl, Charalampos Stratakis and Victor Stinner. + +Windows +------- + +- bpo-39930: Ensures the required :file:`vcruntime140.dll` is included in + install packages. + +- bpo-39847: Avoid hang when computer is hibernated whilst waiting for a + mutex (for lock-related objects from :mod:`threading`) around 49-day + uptime. + +- bpo-38597: :mod:`distutils` will no longer statically link + :file:`vcruntime140.dll` when a redistributable version is unavailable. + All future releases of CPython will include a copy of this DLL to ensure + distributed extensions can continue to load. + +- bpo-38380: Update Windows builds to use SQLite 3.31.1 + +- bpo-39789: Update Windows release build machines to Visual Studio 2019 + (MSVC 14.2). + +- bpo-34803: Package for nuget.org now includes repository reference and + bundled icon image. + +macOS +----- + +- bpo-38380: Update macOS builds to use SQLite 3.31.1 + +IDLE +---- + +- bpo-27115: For 'Go to Line', use a Query box subclass with IDLE standard + behavior and improved error checking. + +- bpo-39885: Since clicking to get an IDLE context menu moves the cursor, + any text selection should be and now is cleared. + +- bpo-39852: Edit "Go to line" now clears any selection, preventing + accidental deletion. It also updates Ln and Col on the status bar. + +- bpo-39781: Selecting code context lines no longer causes a jump. + +Tools/Demos +----------- + +- bpo-36184: Port python-gdb.py to FreeBSD. python-gdb.py now checks for + "take_gil" function name to check if a frame tries to acquire the GIL, + instead of checking for "pthread_cond_timedwait" which is specific to + Linux and can be a different condition than the GIL. + +- bpo-38080: Added support to fix ``getproxies`` in the + :mod:`lib2to3.fixes.fix_urllib` module. Patch by José Roberto Meza + Cabrera. + +C API +----- + +- bpo-40024: Add :c:func:`PyModule_AddType` helper function: add a type to a + module. Patch by Dong-hee Na. + +- bpo-39946: Remove ``_PyRuntime.getframe`` hook and remove + ``_PyThreadState_GetFrame`` macro which was an alias to + ``_PyRuntime.getframe``. They were only exposed by the internal C API. + Remove also ``PyThreadFrameGetter`` type. + +- bpo-39947: Add :c:func:`PyThreadState_GetFrame` function: get the current + frame of a Python thread state. + +- bpo-37207: Add _PyArg_NoKwnames helper function. Patch by Dong-hee Na. + +- bpo-39947: Add :c:func:`PyThreadState_GetInterpreter`: get the interpreter + of a Python thread state. + +- bpo-39947: Add :c:func:`PyInterpreterState_Get` function to the limited C + API. + +- bpo-35370: If :c:func:`PySys_Audit` fails in :c:func:`PyEval_SetProfile` + or :c:func:`PyEval_SetTrace`, log the error as an unraisable exception. + +- bpo-39947: Move the static inline function flavor of + Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() to the internal C API: + they access PyThreadState attributes. The limited C API provides regular + functions which hide implementation details. + +- bpo-39947: Py_TRASHCAN_BEGIN_CONDITION and Py_TRASHCAN_END macro no longer + access PyThreadState attributes, but call new private _PyTrash_begin() and + _PyTrash_end() functions which hide implementation details. + +- bpo-39884: :c:func:`PyDescr_NewMethod` and :c:func:`PyCFunction_NewEx` now + include the method name in the SystemError "bad call flags" error message + to ease debug. + +- bpo-39877: Deprecated :c:func:`PyEval_InitThreads` and + :c:func:`PyEval_ThreadsInitialized`. Calling :c:func:`PyEval_InitThreads` + now does nothing. + +- bpo-38249: :c:macro:`Py_UNREACHABLE` is now implemented with + ``__builtin_unreachable()`` and analogs in release mode. + +- bpo-38643: :c:func:`PyNumber_ToBase` now raises a :exc:`SystemError` + instead of crashing when called with invalid base. + +- bpo-39882: The :c:func:`Py_FatalError` function is replaced with a macro + which logs automatically the name of the current function, unless the + ``Py_LIMITED_API`` macro is defined. + +- bpo-39824: Extension modules: :c:member:`~PyModuleDef.m_traverse`, + :c:member:`~PyModuleDef.m_clear` and :c:member:`~PyModuleDef.m_free` + functions of :c:type:`PyModuleDef` are no longer called if the module + state was requested but is not allocated yet. This is the case immediately + after the module is created and before the module is executed + (:c:data:`Py_mod_exec` function). More precisely, these functions are not + called if :c:member:`~PyModuleDef.m_size` is greater than 0 and the module + state (as returned by :c:func:`PyModule_GetState`) is ``NULL``. + + Extension modules without module state (``m_size <= 0``) are not affected. + +- bpo-38913: Fixed segfault in ``Py_BuildValue()`` called with a format + containing "#" and undefined PY_SSIZE_T_CLEAN whwn an exception is set. + +- bpo-38500: Add a private API to get and set the frame evaluation function: + add :c:func:`_PyInterpreterState_GetEvalFrameFunc` and + :c:func:`_PyInterpreterState_SetEvalFrameFunc` C functions. The + :c:type:`_PyFrameEvalFunction` function type now takes a *tstate* + parameter. + + +What's New in Python 3.9.0 alpha 4? +=================================== + +*Release date: 2020-02-25* + +Security +-------- + +- bpo-39184: Add audit events to functions in `fcntl`, `msvcrt`, `os`, + `resource`, `shutil`, `signal` and `syslog`. + +- bpo-39401: Avoid unsafe DLL load at startup on Windows 7 and earlier. + +- bpo-39184: Add audit events to command execution functions in os and pty + modules. + +Core and Builtins +----------------- + +- bpo-39382: Fix a use-after-free in the single inheritance path of + ``issubclass()``, when the ``__bases__`` of an object has a single + reference, and so does its first item. Patch by Yonatan Goldschmidt. + +- bpo-39573: Update clinic tool to use :c:func:`Py_IS_TYPE`. Patch by + Dong-hee Na. + +- bpo-39619: Enable use of :func:`os.chroot` on HP-UX systems. + +- bpo-39573: Add :c:func:`Py_IS_TYPE` static inline function to check + whether the object *o* type is *type*. + +- bpo-39606: Fix regression caused by fix for bpo-39386, that prevented + calling ``aclose`` on an async generator that had already been closed or + exhausted. + +- bpo-39579: Change the ending column offset of `Attribute` nodes + constructed in `ast_for_dotted_name` to point at the end of the current + node and not at the end of the last `NAME` node. + +- bpo-1635741: Port _crypt extension module to multiphase initialization + (:pep:`489`). + +- bpo-1635741: Port _contextvars extension module to multiphase + initialization (:pep:`489`). + +- bpo-39510: Fix segfault in ``readinto()`` method on closed BufferedReader. + +- bpo-39502: Fix :func:`time.localtime` on 64-bit AIX to support years + before 1902 and after 2038. Patch by M Felt. + +- bpo-39492: Fix a reference cycle in the C Pickler that was preventing the + garbage collection of deleted, pickled objects. + +- bpo-39453: Fixed a possible crash in :meth:`list.__contains__` when a list + is changed during comparing items. Patch by Dong-hee Na. + +- bpo-39434: :term:`floor division` of float operation now has a better + performance. Also the message of :exc:`ZeroDivisionError` for this + operation is updated. Patch by Dong-hee Na. + +- bpo-1635741: Port _codecs extension module to multiphase initialization + (:pep:`489`). + +- bpo-1635741: Port _bz2 extension module to multiphase initialization + (:pep:`489`). + +- bpo-1635741: Port _abc extension module to multiphase initialization + (:pep:`489`). + +- bpo-39320: Replace two complex bytecodes for building dicts with two + simpler ones. The new bytecodes ``DICT_MERGE`` and ``DICT_UPDATE`` have + been added The old bytecodes ``BUILD_MAP_UNPACK`` and + ``BUILD_MAP_UNPACK_WITH_CALL`` have been removed. + +- bpo-39219: Syntax errors raised in the tokenizer now always set correct + "text" and "offset" attributes. + +- bpo-36051: Drop the GIL during large ``bytes.join`` operations. Patch by + Bruce Merry. + +- bpo-38960: Fix DTrace build issues on FreeBSD. Patch by David Carlier. + +- bpo-37207: Speed up calls to ``range()`` by about 30%, by using the PEP + 590 ``vectorcall`` calling convention. Patch by Mark Shannon. + +- bpo-36144: :class:`dict` (and :class:`collections.UserDict`) objects now + support PEP 584's merge (``|``) and update (``|=``) operators. Patch by + Brandt Bucher. + +- bpo-32856: Optimized the idiom for assignment a temporary variable in + comprehensions. Now ``for y in [expr]`` in comprehensions is as fast as a + simple assignment ``y = expr``. + +Library +------- + +- bpo-30566: Fix :exc:`IndexError` when trying to decode an invalid string + with punycode codec. + +- bpo-39649: Remove obsolete check for `__args__` in + bdb.Bdb.format_stack_entry. + +- bpo-39648: Expanded :func:`math.gcd` and :func:`math.lcm` to handle + multiple arguments. + +- bpo-39681: Fix a regression where the C pickle module wouldn't allow + unpickling from a file-like object that doesn't expose a readinto() + method. + +- bpo-35950: Raise :exc:`io.UnsupportedOperation` in + :meth:`io.BufferedReader.truncate` when it is called on a read-only + :class:`io.BufferedReader` instance. + +- bpo-39479: Add :func:`math.lcm` function: least common multiple. + +- bpo-39674: Revert "Do not expose abstract collection classes in the + collections module" change (bpo-25988). Aliases to ABC like + collections.Mapping are kept in Python 3.9 to ease transition from Python + 2.7, but will be removed in Python 3.10. + +- bpo-39104: Fix hanging ProcessPoolExcutor on ``shutdown(wait=False)`` when + a task has failed pickling. + +- bpo-39627: Fixed TypedDict totality check for inherited keys. + +- bpo-39474: Fixed starting position of AST for expressions like ``(a)(b)``, + ``(a)[b]`` and ``(a).b``. + +- bpo-21016: The :mod:`pydoc` and :mod:`trace` modules now use the + :mod:`sysconfig` module to get the path to the Python standard library, to + support uncommon installation path like ``/usr/lib64/python3.9/`` on + Fedora. Patch by Jan Matějek. + +- bpo-39590: Collections.deque now holds strong references during + deque.__contains__ and deque.count, fixing crashes. + +- bpo-39586: The distutils ``bdist_msi`` command is deprecated in Python + 3.9, use ``bdist_wheel`` (wheel packages) instead. + +- bpo-39595: Improved performance of zipfile.Path for files with a large + number of entries. Also improved performance and fixed minor issue as + published with `importlib_metadata 1.5 + `_. + +- bpo-39350: Fix regression in :class:`fractions.Fraction` if the numerator + and/or the denominator is an :class:`int` subclass. The :func:`math.gcd` + function is now used to normalize the *numerator* and *denominator*. + :func:`math.gcd` always return a :class:`int` type. Previously, the GCD + type depended on *numerator* and *denominator*. + +- bpo-39567: Added audit for :func:`os.walk`, :func:`os.fwalk`, + :meth:`pathlib.Path.glob` and :meth:`pathlib.Path.rglob`. + +- bpo-39559: Remove unused, undocumented argument ``getters`` from + :func:`uuid.getnode` + +- bpo-38149: :func:`sys.audit` is now called only once per call of + :func:`glob.glob` and :func:`glob.iglob`. + +- bpo-39546: Fix a regression in :class:`~argparse.ArgumentParser` where + ``allow_abbrev=False`` was ignored for long options that used a prefix + character other than "-". + +- bpo-39450: Striped whitespace from docstring before returning it from + :func:`unittest.case.shortDescription`. + +- bpo-12915: A new function ``resolve_name`` has been added to the + ``pkgutil`` module. This resolves a string of the form ``'a.b.c.d'`` or + ``'a.b:c.d'`` to an object. In the example, ``a.b`` is a package/module + and ``c.d`` is an object within that package/module reached via recursive + attribute access. + +- bpo-39353: The :func:`binascii.crc_hqx` function is no longer deprecated. + +- bpo-39493: Mark ``typing.IO.closed`` as a property + +- bpo-39491: Add :data:`typing.Annotated` and ``include_extras`` parameter + to :func:`typing.get_type_hints` as part of :pep:`593`. Patch by Till + Varoquaux, documentation by Till Varoquaux and Konstantin Kashin. + +- bpo-39485: Fix a bug in :func:`unittest.mock.create_autospec` that would + complain about the wrong number of arguments for custom descriptors + defined in an extension module returning functions. + +- bpo-38932: Mock fully resets child objects on reset_mock(). Patch by + Vegard Stikbakke + +- bpo-39082: Allow AsyncMock to correctly patch static/class methods + +- bpo-39432: Implement PEP-489 algorithm for non-ascii "PyInit\_..." symbol + names in distutils to make it export the correct init symbol also on + Windows. + +- bpo-18819: Omit ``devmajor`` and ``devminor`` fields for non-device files + in :mod:`tarfile` archives, enabling bit-for-bit compatibility with GNU + ``tar(1)``. + +- bpo-39349: Added a new *cancel_futures* parameter to + :meth:`concurrent.futures.Executor.shutdown` that cancels all pending + futures which have not started running, instead of waiting for them to + complete before shutting down the executor. + +- bpo-39274: ``bool(fraction.Fraction)`` now returns a boolean even if + (numerator != 0) does not return a boolean (ex: numpy number). + +- bpo-34793: Remove support for ``with (await asyncio.lock):`` and ``with + (yield from asyncio.lock):``. The same is correct for + ``asyncio.Condition`` and ``asyncio.Semaphore``. + +- bpo-25597: Ensure, if ``wraps`` is supplied to + :class:`unittest.mock.MagicMock`, it is used to calculate return values + for the magic methods instead of using the default return values. Patch by + Karthikeyan Singaravelan. + +- bpo-36350: `inspect.Signature.parameters` and + `inspect.BoundArguments.arguments` are now dicts instead of OrderedDicts. + Patch contributed by Rémi Lapeyre. + +- bpo-35727: Fix sys.exit() and sys.exit(None) exit code propagation when + used in multiprocessing.Process. + +- bpo-32173: * Add `lazycache` function to `__all__`. * Use `dict.clear` to + clear the cache. * Refactoring `getline` function and `checkcache` + function. + +Documentation +------------- + +- bpo-17422: The language reference now specifies restrictions on class + namespaces. Adapted from a patch by Ethan Furman. + +- bpo-39572: Updated documentation of ``total`` flag of TypeDict. + +- bpo-39654: In pyclbr doc, update 'class' to 'module' where appropriate and + add readmodule comment. Patch by Hakan Çelik. + +- bpo-39153: Clarify refcounting semantics for the following functions: - + PyObject_SetItem - PyMapping_SetItemString - PyDict_SetItem - + PyDict_SetItemString + +- bpo-39392: Explain that when filling with turtle, overlap regions may be + left unfilled. + +- bpo-39369: Update mmap readline method description. The fact that the + readline method does update the file position should not be ignored since + this might give the impression for the programmer that it doesn't update + it. + +- bpo-9056: Include subsection in TOC for PDF version of docs. + +Tests +----- + +- bpo-38325: Skip tests on non-BMP characters of test_winconsoleio. + +- bpo-39502: Skip test_zipfile.test_add_file_after_2107() if + :func:`time.localtime` fails with :exc:`OverflowError`. It is the case on + AIX 6.1 for example. + +Build +----- + +- bpo-39489: Remove ``COUNT_ALLOCS`` special build. + +Windows +------- + +- bpo-39553: Delete unused code related to SxS manifests. + +- bpo-39439: Honor the Python path when a virtualenv is active on Windows. + +- bpo-39393: Improve the error message when attempting to load a DLL with + unresolved dependencies. + +- bpo-38883: :meth:`~pathlib.Path.home()` and + :meth:`~pathlib.Path.expanduser()` on Windows now prefer + :envvar:`USERPROFILE` and no longer use :envvar:`HOME`, which is not + normally set for regular user accounts. This makes them again behave like + :func:`os.path.expanduser`, which was changed to ignore :envvar:`HOME` in + 3.8, see :issue:`36264`. + +- bpo-39185: The build.bat script has additional options for very-quiet + output (-q) and very-verbose output (-vv) + +IDLE +---- + +- bpo-39663: Add tests for pyparse find_good_parse_start(). + +- bpo-39600: In the font configuration window, remove duplicated font names. + +- bpo-30780: Add remaining configdialog tests for buttons and highlights and + keys tabs. + +- bpo-39388: IDLE Settings Cancel button now cancels pending changes + +- bpo-38792: Close an IDLE shell calltip if a :exc:`KeyboardInterrupt` or + shell restart occurs. Patch by Zackery Spytz. + +C API +----- + +- bpo-35081: Move the ``bytes_methods.h`` header file to the internal C API + as ``pycore_bytes_methods.h``: it only contains private symbols (prefixed + by ``_Py``), except of the ``PyDoc_STRVAR_shared()`` macro. + +- bpo-35081: Move the ``dtoa.h`` header file to the internal C API as + ``pycore_dtoa.h``: it only contains private functions (prefixed by + ``_Py``). The :mod:`math` and :mod:`cmath` modules must now be compiled + with the ``Py_BUILD_CORE`` macro defined. + +- bpo-39573: Add :c:func:`Py_SET_SIZE` function to set the size of an + object. + +- bpo-39500: :c:func:`PyUnicode_IsIdentifier` does not call + :c:func:`Py_FatalError` anymore if the string is not ready. + +- bpo-39573: Add :c:func:`Py_SET_TYPE` function to set the type of an + object. + +- bpo-39573: Add a :c:func:`Py_SET_REFCNT` function to set the reference + counter of an object. + +- bpo-39542: Convert :c:func:`PyType_HasFeature`, :c:func:`PyType_Check` and + :c:func:`PyType_CheckExact` macros to static inline functions. + +- bpo-39542: In the limited C API, ``PyObject_INIT()`` and + ``PyObject_INIT_VAR()`` are now defined as aliases to + :c:func:`PyObject_Init` and :c:func:`PyObject_InitVar` to make their + implementation opaque. It avoids to leak implementation details in the + limited C API. Exclude the following functions from the limited C API: + ``_Py_NewReference()``, ``_Py_ForgetReference()``, + ``_PyTraceMalloc_NewReference()`` and ``_Py_GetRefTotal()``. + +- bpo-39542: Exclude trashcan mechanism from the limited C API: it requires + access to PyTypeObject and PyThreadState structure fields, whereas these + structures are opaque in the limited C API. + +- bpo-39511: The :c:func:`PyThreadState_Clear` function now calls the + :c:member:`PyThreadState.on_delete` callback. Previously, that happened in + :c:func:`PyThreadState_Delete`. + +- bpo-38076: Fix to clear the interpreter state only after clearing module + globals to guarantee module state access from C Extensions during runtime + destruction + +- bpo-39245: The Vectorcall API (PEP 590) was made public, adding the + functions ``PyObject_Vectorcall``, ``PyObject_VectorcallMethod``, + ``PyVectorcall_Function``, ``PyObject_CallOneArg``, + ``PyObject_CallMethodNoArgs``, ``PyObject_CallMethodOneArg``, + ``PyObject_FastCallDict``, and the flag ``Py_TPFLAGS_HAVE_VECTORCALL``. + + +What's New in Python 3.9.0 alpha 3? +=================================== + +*Release date: 2020-01-24* + +Core and Builtins +----------------- + +- bpo-39427: Document all possibilities for the ``-X`` options in the + command line help section. Patch by Pablo Galindo. + +- bpo-39421: Fix possible crashes when operating with the functions in the + :mod:`heapq` module and custom comparison operators. + +- bpo-39386: Prevent double awaiting of async iterator. + +- bpo-17005: Add :class:`functools.TopologicalSorter` to the + :mod:`functools` module to offers functionality to perform topological + sorting of graphs. Patch by Pablo Galindo, Tim Peters and Larry Hastings. + +- bpo-39320: Replace four complex bytecodes for building sequences with + three simpler ones. + + The following four bytecodes have been removed: + + * BUILD_LIST_UNPACK + * BUILD_TUPLE_UNPACK + * BUILD_SET_UNPACK + * BUILD_TUPLE_UNPACK_WITH_CALL + + The following three bytecodes have been added: + + * LIST_TO_TUPLE + * LIST_EXTEND + * SET_UPDATE + +- bpo-39336: Import loaders which publish immutable module objects can now + publish immutable packages in addition to individual modules. + +- bpo-39322: Added a new function :func:`gc.is_finalized` to check if an + object has been finalized by the garbage collector. Patch by Pablo + Galindo. + +- bpo-39048: Improve the displayed error message when incorrect types are + passed to ``async with`` statements by looking up the :meth:`__aenter__` + special method before the :meth:`__aexit__` special method when entering + an asynchronous context manager. Patch by Géry Ogam. + +- bpo-39235: Fix AST end location for lone generator expression in function + call, e.g. f(i for i in a). + +- bpo-39209: Correctly handle multi-line tokens in interactive mode. Patch + by Pablo Galindo. + +- bpo-1635741: Port _json extension module to multiphase initialization + (:pep:`489`). + +- bpo-39216: Fix constant folding optimization for positional only arguments + - by Anthony Sottile. + +- bpo-39215: Fix ``SystemError`` when nested function has annotation on + positional-only argument - by Anthony Sottile. + +- bpo-39200: Correct the error message when calling the :func:`min` or + :func:`max` with no arguments. Patch by Dong-hee Na. + +- bpo-39200: Correct the error message when trying to construct + :class:`range` objects with no arguments. Patch by Pablo Galindo. + +- bpo-39166: Fix incorrect line execution reporting in trace functions when + tracing the last iteration of asynchronous for loops. Patch by Pablo + Galindo. + +- bpo-39114: Fix incorrent line execution reporting in trace functions when + tracing exception handlers with name binding. Patch by Pablo Galindo. + +- bpo-39156: Split the COMPARE_OP bytecode instruction into four distinct + instructions. + + * COMPARE_OP for rich comparisons + * IS_OP for 'is' and 'is not' tests + * CONTAINS_OP for 'in' and 'is not' tests + * JUMP_IF_NOT_EXC_MATCH for checking exceptions in 'try-except' statements. + + This improves the clarity of the interpreter and should provide a modest + speedup. + +- bpo-38588: Fix possible crashes in dict and list when calling + :c:func:`PyObject_RichCompareBool`. + +- bpo-13601: By default, ``sys.stderr`` is line-buffered now, even if + ``stderr`` is redirected to a file. You can still make ``sys.stderr`` + unbuffered by passing the :option:`-u` command-line option or setting the + :envvar:`PYTHONUNBUFFERED` environment variable. + + (Contributed by Jendrik Seipp in bpo-13601.) + +- bpo-38610: Fix possible crashes in several list methods by holding strong + references to list elements when calling + :c:func:`PyObject_RichCompareBool`. + +- bpo-32021: Include brotli .br encoding in mimetypes encodings_map + +Library +------- + +- bpo-39430: Fixed race condition in lazy imports in :mod:`tarfile`. + +- bpo-39413: The :func:`os.unsetenv` function is now also available on + Windows. + +- bpo-39390: Fixed a regression with the `ignore` callback of + :func:`shutil.copytree`. The argument types are now str and List[str] + again. + +- bpo-39395: The :func:`os.putenv` and :func:`os.unsetenv` functions are now + always available. + +- bpo-39406: If ``setenv()`` C function is available, :func:`os.putenv` is + now implemented with ``setenv()`` instead of ``putenv()``, so Python + doesn't have to handle the environment variable memory. + +- bpo-39396: Fix ``math.nextafter(-0.0, +0.0)`` on AIX 7.1. + +- bpo-29435: Allow :func:`tarfile.is_tarfile` to be used with file and + file-like objects, like :func:`zipfile.is_zipfile`. Patch by William + Woodruff. + +- bpo-39377: Removed ``encoding`` option from :func:`json.loads`. It has + been deprecated since Python 3.1. + +- bpo-39389: Write accurate compression level metadata in :mod:`gzip` + archives, rather than always signaling maximum compression. + +- bpo-39366: The previously deprecated ``xpath()`` and ``xgtitle()`` methods + of :class:`nntplib.NNTP` have been removed. + +- bpo-39357: Remove the *buffering* parameter of :class:`bz2.BZ2File`. Since + Python 3.0, it was ignored and using it was emitting + :exc:`DeprecationWarning`. Pass an open file object, to control how the + file is opened. The *compresslevel* parameter becomes keyword-only. + +- bpo-39353: Deprecate binhex4 and hexbin4 standards. Deprecate the + :mod:`binhex` module and the following :mod:`binascii` functions: + :func:`~binascii.b2a_hqx`, :func:`~binascii.a2b_hqx`, + :func:`~binascii.rlecode_hqx`, :func:`~binascii.rledecode_hqx`, + :func:`~binascii.crc_hqx`. + +- bpo-39351: Remove ``base64.encodestring()`` and ``base64.decodestring()``, + aliases deprecated since Python 3.1: use :func:`base64.encodebytes` and + :func:`base64.decodebytes` instead. + +- bpo-39350: Remove ``fractions.gcd()`` function, deprecated since Python + 3.5 (:issue:`22486`): use :func:`math.gcd` instead. + +- bpo-39329: :class:`~smtplib.LMTP` constructor now has an optional + *timeout* parameter. Patch by Dong-hee Na. + +- bpo-39313: Add a new ``exec_function`` option (*--exec-function* in the + CLI) to ``RefactoringTool`` for making ``exec`` a function. Patch by + Batuhan Taskaya. + +- bpo-39259: :class:`~ftplib.FTP_TLS` and :class:`~ftplib.FTP_TLS` now raise + a :class:`ValueError` if the given timeout for their constructor is zero + to prevent the creation of a non-blocking socket. Patch by Dong-hee Na. + +- bpo-39259: :class:`~smtplib.SMTP` and :class:`~smtplib.SMTP_SSL` now raise + a :class:`ValueError` if the given timeout for their constructor is zero + to prevent the creation of a non-blocking socket. Patch by Dong-hee Na. + +- bpo-39310: Add :func:`math.ulp`: return the value of the least significant + bit of a float. + +- bpo-39297: Improved performance of importlib.metadata distribution + discovery and resilients to inaccessible sys.path entries + (importlib_metadata v1.4.0). + +- bpo-39259: :class:`~nntplib.NNTP` and :class:`~nntplib.NNTP_SSL` now raise + a :class:`ValueError` if the given timeout for their constructor is zero + to prevent the creation of a non-blocking socket. Patch by Dong-hee Na. + +- bpo-38901: When you specify prompt='.' or equivalently python -m venv + --prompt . ... the basename of the current directory is used to set the + created venv's prompt when it's activated. + +- bpo-39288: Add :func:`math.nextafter`: return the next floating-point + value after *x* towards *y*. + +- bpo-39259: :class:`~poplib.POP3` and :class:`~poplib.POP3_SSL` now raise a + :class:`ValueError` if the given timeout for their constructor is zero to + prevent the creation of a non-blocking socket. Patch by Dong-hee Na. + +- bpo-39242: Updated the Gmane domain from news.gmane.org to news.gmane.io + which is used for examples of :class:`~nntplib.NNTP` news reader server + and nntplib tests. + +- bpo-35292: Proxy the `SimpleHTTPRequestHandler.guess_type` to + `mimetypes.guess_type` so the `mimetypes.init` is called lazily to avoid + unnecessary costs when :mod:`http.server` module is imported. + +- bpo-39239: The :meth:`select.epoll.unregister` method no longer ignores + the :data:`~errno.EBADF` error. + +- bpo-38907: In http.server script, restore binding to IPv4 on Windows. + +- bpo-39152: Fix ttk.Scale.configure([name]) to return configuration tuple + for name or all options. Giovanni Lombardo contributed part of the patch. + +- bpo-39198: If an exception were to be thrown in `Logger.isEnabledFor` + (say, by asyncio timeouts or stopit) , the `logging` global lock may not + be released appropriately, resulting in deadlock. This change wraps that + block of code with `try...finally` to ensure the lock is released. + +- bpo-39191: Perform a check for running loop before starting a new task in + ``loop.run_until_complete()`` to fail fast; it prevents the side effect of + new task spawning before exception raising. + +- bpo-38871: Correctly parenthesize filter-based statements that contain + lambda expressions in mod:`lib2to3`. Patch by Dong-hee Na. + +- bpo-39142: A change was made to logging.config.dictConfig to avoid + converting instances of named tuples to ConvertingTuple. It's assumed that + named tuples are too specialised to be treated like ordinary tuples; if a + user of named tuples requires ConvertingTuple functionality, they will + have to implement that themselves in their named tuple class. + +- bpo-39158: ast.literal_eval() now supports empty sets. + +- bpo-39129: Fix import path for ``asyncio.TimeoutError`` + +- bpo-39057: :func:`urllib.request.proxy_bypass_environment` now ignores + leading dots and no longer ignores a trailing newline. + +- bpo-39056: Fixed handling invalid warning category in the -W option. No + longer import the re module if it is not needed. + +- bpo-39055: :func:`base64.b64decode` with ``validate=True`` raises now a + binascii.Error if the input ends with a single ``\n``. + +- bpo-21600: Fix :func:`mock.patch.stopall` to stop active patches that were + created with :func:`mock.patch.dict`. + +- bpo-39019: Implement dummy ``__class_getitem__`` for + :class:`tempfile.SpooledTemporaryFile`. + +- bpo-39019: Implement dummy ``__class_getitem__`` for ``subprocess.Popen``, + ``subprocess.CompletedProcess`` + +- bpo-38914: Adjusted the wording of the warning issued by distutils' + ``check`` command when the ``author`` and ``maintainer`` fields are + supplied but no corresponding e-mail field (``author_email`` or + ``maintainer_email``) is found. The wording now reflects the fact that + these fields are suggested, but not required. Patch by Juergen Gmach. + +- bpo-38878: Fixed __subclasshook__ of :class:`os.PathLike` to return a + correct result upon inheritence. Patch by Bar Harel. + +- bpo-38615: :class:`~imaplib.IMAP4` and :class:`~imaplib.IMAP4_SSL` now + have an optional *timeout* parameter for their constructors. Also, the + :meth:`~imaplib.IMAP4.open` method now has an optional *timeout* parameter + with this change. The overridden methods of :class:`~imaplib.IMAP4_SSL` + and :class:`~imaplib.IMAP4_stream` were applied to this change. Patch by + Dong-hee Na. + +- bpo-35182: Fixed :func:`Popen.communicate` subsequent call crash when the + child process has already closed any piped standard stream, but still + continues to be running. Patch by Andriy Maletsky. + +- bpo-38630: On Unix, :meth:`subprocess.Popen.send_signal` now polls the + process status. Polling reduces the risk of sending a signal to the wrong + process if the process completed, the :attr:`subprocess.Popen.returncode` + attribute is still ``None``, and the pid has been reassigned (recycled) to + a new different process. + +- bpo-38536: Removes trailing space in formatted currency with + `international=True` and a locale with symbol following value. E.g. + `locale.currency(12.34, international=True)` returned `'12,34 EUR '` + instead of `'12,34 EUR'`. + +- bpo-38473: Use signature from inner mock for autospecced methods attached + with :func:`unittest.mock.attach_mock`. Patch by Karthikeyan Singaravelan. + +- bpo-38361: Fixed an issue where ``ident`` could include a leading path + separator when :func:`syslog.openlog` was called without arguments. + +- bpo-38293: Add :func:`copy.copy` and :func:`copy.deepcopy` support to + :func:`property` objects. + +- bpo-37958: Added the pstats.Stats.get_profile_dict() method to return the + profile data as a StatsProfile instance. + +- bpo-28367: Termios magic constants for the following baud rates: - + B500000 - B576000 - B921600 - B1000000 - B1152000 - B1500000 - + B2000000 - B2500000 - B3000000 - B3500000 - B4000000 Patch by + Andrey Smirnov + +Documentation +------------- + +- bpo-39381: Mention in docs that :func:`asyncio.get_event_loop` implicitly + creates new event loop only if called from the main thread. + +- bpo-38918: Add an entry for ``__module__`` in the "function" & "method" + sections of the `inspect docs types and members table + `_ + +- bpo-3530: In the :mod:`ast` module documentation, fix a misleading + ``NodeTransformer`` example and add advice on when to use the + ``fix_missing_locations`` function. + +Build +----- + +- bpo-39395: On non-Windows platforms, the :c:func:`setenv` and + :c:func:`unsetenv` functions are now required to build Python. + +- bpo-39160: Updated the documentation in `./configure --help` to show + default values, reference documentation where required and add additional + explanation where needed. + +- bpo-39144: The ctags and etags build targets both include Modules/_ctypes + and Python standard library source files. + +IDLE +---- + +- bpo-39050: Make IDLE Settings dialog Help button work again. + +- bpo-34118: Tag memoryview, range, and tuple as classes, the same as list, + etcetera, in the library manual built-in functions list. + +- bpo-32989: Add tests for editor newline_and_indent_event method. Remove + dead code from pyparse find_good_parse_start method. + +C API +----- + +- bpo-39372: Clean header files of interfaces defined but with no + implementation. The public API symbols being removed are: + ``_PyBytes_InsertThousandsGroupingLocale``, + ``_PyBytes_InsertThousandsGrouping``, ``_Py_InitializeFromArgs``, + ``_Py_InitializeFromWideArgs``, ``_PyFloat_Repr``, ``_PyFloat_Digits``, + ``_PyFloat_DigitsInit``, ``PyFrame_ExtendStack``, + ``_PyAIterWrapper_Type``, ``PyNullImporter_Type``, ``PyCmpWrapper_Type``, + ``PySortWrapper_Type``, ``PyNoArgsFunction``. + +- bpo-39164: Add a private ``_PyErr_GetExcInfo()`` function to retrieve + exception information of the specified Python thread state. + + +What's New in Python 3.9.0 alpha 2? +=================================== + +*Release date: 2019-12-18* + +Security +-------- + +- bpo-38945: Newline characters have been escaped when performing uu + encoding to prevent them from overflowing into to content section of the + encoded file. This prevents malicious or accidental modification of data + during the decoding process. + +- bpo-37228: Due to significant security concerns, the *reuse_address* + parameter of :meth:`asyncio.loop.create_datagram_endpoint` is no longer + supported. This is because of the behavior of ``SO_REUSEADDR`` in UDP. For + more details, see the documentation for + ``loop.create_datagram_endpoint()``. (Contributed by Kyle Stanley, Antoine + Pitrou, and Yury Selivanov in :issue:`37228`.) + +- bpo-38804: Fixes a ReDoS vulnerability in :mod:`http.cookiejar`. Patch by + Ben Caller. + +Core and Builtins +----------------- + +- bpo-39028: Slightly improve the speed of keyword argument parsing with + many kwargs by strengthening the assumption that kwargs are interned + strings. + +- bpo-39080: Fix the value of *end_col_offset* for Starred Expression AST + nodes when they are among the elements in the *args* attribute of Call AST + nodes. + +- bpo-39031: When parsing an "elif" node, lineno and col_offset of the node + now point to the "elif" keyword and not to its condition, making it + consistent with the "if" node. Patch by Lysandros Nikolaou. + +- bpo-20443: In Python 3.9.0a1, sys.argv[0] was made an absolute path if a + filename was specified on the command line. Revert this change, since most + users expect sys.argv to be unmodified. + +- bpo-39008: :c:func:`PySys_Audit` now requires ``Py_ssize_t`` to be used + for size arguments in the format string, regardless of whether + ``PY_SSIZE_T_CLEAN`` was defined at include time. + +- bpo-38673: In REPL mode, don't switch to PS2 if the line starts with + comment or whitespace. Based on work by Batuhan Taşkaya. + +- bpo-38922: Calling ``replace`` on a code object now raises the + ``code.__new__`` audit event. + +- bpo-38920: Add audit hooks for when :func:`sys.excepthook` and + :func:`sys.unraisablehook` are invoked. + +- bpo-38892: Improve documentation for audit events table and functions. + +- bpo-38852: Set the thread stack size to 8 Mb for debug builds on android + platforms. + +- bpo-38858: Each Python subinterpreter now has its own "small integer + singletons": numbers in [-5; 257] range. It is no longer possible to + change the number of small integers at build time by overriding + ``NSMALLNEGINTS`` and ``NSMALLPOSINTS`` macros: macros should now be + modified manually in ``pycore_pystate.h`` header file. + +- bpo-36854: The garbage collector state becomes per interpreter + (``PyInterpreterState.gc``), rather than being global + (``_PyRuntimeState.gc``). + +- bpo-38835: The ``PyFPE_START_PROTECT()`` and ``PyFPE_END_PROTECT()`` + macros are empty: they have been doing nothing for the last year, so stop + using them. + +- bpo-38328: Sped up the creation time of constant :class:`list` and + :class:`set` displays. Patch by Brandt Bucher. + +- bpo-38707: ``MainThread.native_id`` is now correctly reset in child + processes spawned using :class:`multiprocessing.Process`, instead of + retaining the parent's value. + +- bpo-38629: Added ``__floor__`` and ``__ceil__`` methods to float object. + Patch by Batuhan Taşkaya. + +- bpo-27145: int + int and int - int operators can now return small integer + singletons. Patch by hongweipeng. + +- bpo-38021: Provide a platform tag for AIX that is sufficient for PEP425 + binary distribution identification. Patch by Michael Felt. + +- bpo-35409: Ignore GeneratorExit exceptions when throwing an exception into + the aclose coroutine of an asynchronous generator. + +- bpo-33387: Removed WITH_CLEANUP_START, WITH_CLEANUP_FINISH, BEGIN_FINALLY, + END_FINALLY, CALL_FINALLY and POP_FINALLY bytecodes. Replaced with RERAISE + and WITH_EXCEPT_START bytecodes. The compiler now generates different code + for exceptional and non-exceptional branches for 'with' and 'try-except' + statements. For 'try-finally' statements the 'finally' block is replicated + for each exit from the 'try' body. + +Library +------- + +- bpo-39033: Fix :exc:`NameError` in :mod:`zipimport`. Patch by Karthikeyan + Singaravelan. + +- bpo-39022: Update importlib.metadata to include improvements from + importlib_metadata 1.3 including better serialization of EntryPoints and + improved documentation for custom finders. + +- bpo-39006: Fix asyncio when the ssl module is missing: only check for + ssl.SSLSocket instance if the ssl module is available. + +- bpo-38708: Fix a potential IndexError in email parser when parsing an + empty msg-id. + +- bpo-38698: Add a new ``InvalidMessageID`` token to email parser to + represent invalid Message-ID headers. Also, add defects when there is + remaining value after parsing the header. + +- bpo-38994: Implement ``__class_getitem__`` for ``os.PathLike``, + ``pathlib.Path``. + +- bpo-38979: Return class from ``ContextVar.__class_getitem__`` to simplify + subclassing. + +- bpo-38978: Implement ``__class_getitem__`` on asyncio objects (Future, + Task, Queue). Patch by Batuhan Taskaya. + +- bpo-38916: :class:`array.array`: Remove ``tostring()`` and + ``fromstring()`` methods. They were aliases to ``tobytes()`` and + ``frombytes()``, deprecated since Python 3.2. + +- bpo-38986: Make repr of C accelerated TaskWakeupMethWrapper the same as of + pure Python version. + +- bpo-38982: Fix asyncio ``PidfdChildWatcher``: handle ``waitpid()`` error. + If ``waitpid()`` is called elsewhere, ``waitpid()`` call fails with + :exc:`ChildProcessError`: use return code 255 in this case, and log a + warning. It ensures that the pidfd file descriptor is closed if this error + occurs. + +- bpo-38529: Drop too noisy asyncio warning about deletion of a stream + without explicit ``.close()`` call. + +- bpo-27413: Added ability to pass through ``ensure_ascii`` options to + json.dumps in the ``json.tool`` command-line interface. + +- bpo-38634: The :mod:`readline` module now detects if Python is linked to + libedit at runtime on all platforms. Previously, the check was only done + on macOS. + +- bpo-33684: Fix ``json.tool`` failed to read a JSON file with non-ASCII + characters when locale encoding is not UTF-8. + +- bpo-38698: Prevent UnboundLocalError to pop up in parse_message_id. + + parse_message_id() was improperly using a token defined inside an + exception handler, which was raising `UnboundLocalError` on parsing an + invalid value. Patch by Claudiu Popa. + +- bpo-38927: Use ``python -m pip`` instead of ``pip`` to upgrade + dependencies in venv. + +- bpo-26730: Fix ``SpooledTemporaryFile.rollover()`` might corrupt the file + when it is in text mode. Patch by Serhiy Storchaka. + +- bpo-38881: random.choices() now raises a ValueError when all the weights + are zero. + +- bpo-38876: Raise pickle.UnpicklingError when loading an item from memo for + invalid input. + + The previous code was raising a `KeyError` for both the Python and C + implementation. This was caused by the specified index of an invalid input + which did not exist in the memo structure, where the pickle stores what + objects it has seen. The malformed input would have caused either a + `BINGET` or `LONG_BINGET` load from the memo, leading to a `KeyError` as + the determined index was bogus. Patch by Claudiu Popa + +- bpo-38688: Calling func:`shutil.copytree` to copy a directory tree from + one directory to another subdirectory resulted in an endless loop and a + RecursionError. A fix was added to consume an iterator and create the list + of the entries to be copied, avoiding the recursion for newly created + directories. Patch by Bruno P. Kinoshita. + +- bpo-38863: Improve :func:`is_cgi` function in :mod:`http.server`, which + enables processing the case that cgi directory is a child of another + directory other than root. + +- bpo-37838: :meth:`typing.get_type_hints` properly handles functions + decorated with :meth:`functools.wraps`. + +- bpo-38870: Expose :func:`ast.unparse` as a function of the :mod:`ast` + module that can be used to unparse an :class:`ast.AST` object and produce + a string with code that would produce an equivalent :class:`ast.AST` + object when parsed. Patch by Pablo Galindo and Batuhan Taskaya. + +- bpo-38859: AsyncMock now returns StopAsyncIteration on the exhaustion of a + side_effects iterable. Since PEP-479 its Impossible to raise a + StopIteration exception from a coroutine. + +- bpo-38857: AsyncMock fix for return values that are awaitable types. This + also covers side_effect iterable values that happened to be awaitable, and + wraps callables that return an awaitable type. Before these awaitables + were being awaited instead of being returned as is. + +- bpo-38834: :class:`typing.TypedDict` subclasses now track which keys are + optional using the ``__required_keys__`` and ``__optional_keys__`` + attributes, to enable runtime validation by downstream projects. Patch by + Zac Hatfield-Dodds. + +- bpo-38821: Fix unhandled exceptions in :mod:`argparse` when + internationalizing error messages for arguments with ``nargs`` set to + special (non-integer) values. Patch by Federico Bond. + +- bpo-38820: Make Python compatible with OpenSSL 3.0.0. + :func:`ssl.SSLSocket.getpeercert` no longer returns IPv6 addresses with a + trailing new line. + +- bpo-38811: Fix an unhandled exception in :mod:`pathlib` when + :meth:`os.link` is missing. Patch by Toke Høiland-Jørgensen. + +- bpo-38686: Added support for multiple ``qop`` values in + :class:`urllib.request.AbstractDigestAuthHandler`. + +- bpo-38712: Add the Linux-specific :func:`signal.pidfd_send_signal` + function, which allows sending a signal to a process identified by a file + descriptor rather than a pid. + +- bpo-38348: Add ``-i`` and ``--indent`` (indentation level), and + ``--no-type-comments`` (type comments) command line options to ast parsing + tool. + +- bpo-37523: Change :class:`zipfile.ZipExtFile` to raise ``ValueError`` when + trying to access the underlying file object after it has been closed. This + new behavior is consistent with how accessing closed files is handled in + other parts of Python. + +- bpo-38045: Improve the performance of :func:`enum._decompose` in + :mod:`enum`. Patch by hongweipeng. + +- bpo-36820: Break cycle generated when saving an exception in socket.py, + codeop.py and dyld.py as they keep alive not only the exception but user + objects through the ``__traceback__`` attribute. Patch by Mario Corchero. + +- bpo-36406: Handle namespace packages in :mod:`doctest`. Patch by + Karthikeyan Singaravelan. + +- bpo-34776: Fix dataclasses to support forward references in type + annotations + +- bpo-20928: ElementTree supports recursive XInclude processing. Patch by + Stefan Behnel. + +- bpo-29636: Add whitespace options for formatting JSON with the + ``json.tool`` CLI. The following mutually exclusive options are now + supported: ``--indent`` for setting the indent level in spaces; ``--tab`` + for indenting with tabs; ``--no-indent`` for suppressing newlines; and + ``--compact`` for suppressing all whitespace. The default behavior remains + the same as ``--indent=4``. + +Documentation +------------- + +- bpo-38928: Correct when venv's ``upgrade_dependencies()`` and + ``--upgrade-deps`` are added. + +- bpo-38899: Update documentation to state that to activate virtual + environments under fish one should use `source`, not `.` as documented at + https://fishshell.com/docs/current/commands.html#source. + +- bpo-22377: Improves documentation of the values that + :meth:`datetime.datetime.strptime` accepts for ``%Z``. Patch by Karl + Dubost. + +Tests +----- + +- bpo-38546: Fix test_ressources_gced_in_workers() of + test_concurrent_futures: explicitly stop the manager to prevent leaking a + child process running in the background after the test completes. + +- bpo-38546: Multiprocessing and concurrent.futures tests now stop the + resource tracker process when tests complete. + +- bpo-38614: Replace hardcoded timeout constants in tests with new + :mod:`test.support` constants: :data:`~test.support.LOOPBACK_TIMEOUT`, + :data:`~test.support.INTERNET_TIMEOUT`, + :data:`~test.support.SHORT_TIMEOUT` and + :data:`~test.support.LONG_TIMEOUT`. It becomes easier to adjust these four + timeout constants for all tests at once, rather than having to adjust + every single test file. + +- bpo-38547: Fix test_pty: if the process is the session leader, closing the + master file descriptor raises a SIGHUP signal: simply ignore SIGHUP when + running the tests. + +- bpo-38992: Fix a test for :func:`math.fsum` that was failing due to + constant folding. + +- bpo-38991: :mod:`test.support`: + :func:`~test.support.run_python_until_end`, + :func:`~test.support.assert_python_ok` and + :func:`~test.support.assert_python_failure` functions no longer strip + whitespaces from stderr. Remove ``test.support.strip_python_stderr()`` + function. + +- bpo-38965: Fix test_faulthandler on GCC 10. Use the "volatile" keyword in + ``faulthandler._stack_overflow()`` to prevent tail call optimization on + any compiler, rather than relying on compiler specific pragma. + +- bpo-38875: test_capi: trashcan tests now require the test "cpu" resource. + +- bpo-38841: Skip asyncio test_create_datagram_endpoint_existing_sock_unix + on platforms lacking a functional bind() for named unix domain sockets. + +- bpo-38692: Skip the test_posix.test_pidfd_open() test if + ``os.pidfd_open()`` fails with a :exc:`PermissionError`. This situation + can happen in a Linux sandbox using a syscall whitelist which doesn't + allow the ``pidfd_open()`` syscall yet. + +- bpo-38839: Fix some unused functions in tests. Patch by Adam Johnson. + +- bpo-38669: Raise :exc:`TypeError` when passing target as a string with + :meth:`unittest.mock.patch.object`. + +- bpo-37957: test.regrtest now can receive a list of test patterns to ignore + (using the -i/--ignore argument) or a file with a list of patterns to + ignore (using the --ignore-file argument). Patch by Pablo Galindo. + +Build +----- + +- bpo-37404: :mod:`asyncio` now raises :exc:`TyperError` when calling + incompatible methods with an :class:`ssl.SSLSocket` socket. Patch by Ido + Michael. + +- bpo-36500: Added an optional "regen" project to the Visual Studio solution + that will regenerate all grammar, tokens, and opcodes. + +Windows +------- + +- bpo-39007: Add auditing events to functions in :mod:`winreg`. + +- bpo-33125: Add support for building and releasing Windows ARM64 packages. + +macOS +----- + +- bpo-37931: Fixed a crash on OSX dynamic builds that occurred when + re-initializing the posix module after a Py_Finalize if the environment + had changed since the previous `import posix`. Patch by Benoît Hudson. + +IDLE +---- + +- bpo-38944: Escape key now closes IDLE completion windows. Patch by Johnny + Najera. + +- bpo-38943: Fix IDLE autocomplete windows not always appearing on some + systems. Patch by Johnny Najera. + +- bpo-38862: 'Strip Trailing Whitespace' on the Format menu removes extra + newlines at the end of non-shell files. + +- bpo-38636: Fix IDLE Format menu tab toggle and file indent width. These + functions (default shortcuts Alt-T and Alt-U) were mistakenly disabled in + 3.7.5 and 3.8.0. + +C API +----- + +- bpo-38896: Remove ``PyUnicode_ClearFreeList()`` function: the Unicode free + list has been removed in Python 3.3. + +- bpo-37340: Remove ``PyMethod_ClearFreeList()`` and + ``PyCFunction_ClearFreeList()`` functions: the free lists of bound method + objects have been removed. + +- bpo-38835: Exclude ``PyFPE_START_PROTECT()`` and ``PyFPE_END_PROTECT()`` + macros of ``pyfpe.h`` from ``Py_LIMITED_API`` (stable API). + + +What's New in Python 3.9.0 alpha 1? +=================================== + +*Release date: 2019-11-19* + +Security +-------- + +- bpo-38722: :mod:`runpy` now uses :meth:`io.open_code` to open code files. + Patch by Jason Killen. + +- bpo-38622: Add additional audit events for the :mod:`ctypes` module. + +- bpo-38418: Fixes audit event for :func:`os.system` to be named + ``os.system``. + +- bpo-38243: Escape the server title of + :class:`xmlrpc.server.DocXMLRPCServer` when rendering the document page as + HTML. (Contributed by Dong-hee Na in :issue:`38243`.) + +- bpo-38174: Update vendorized expat library version to 2.2.8, which + resolves CVE-2019-15903. + +- bpo-37764: Fixes email._header_value_parser.get_unstructured going into an + infinite loop for a specific case in which the email header does not have + trailing whitespace, and the case in which it contains an invalid encoded + word. Patch by Ashwin Ramaswami. + +- bpo-37461: Fix an infinite loop when parsing specially crafted email + headers. Patch by Abhilash Raj. + +- bpo-37363: Adds audit events for the range of supported run commands (see + :ref:`using-on-general`). + +- bpo-37463: ssl.match_hostname() no longer accepts IPv4 addresses with + additional text after the address and only quad-dotted notation without + trailing whitespaces. Some inet_aton() implementations ignore whitespace + and all data after whitespace, e.g. '127.0.0.1 whatever'. + +- bpo-37363: Adds audit events for :mod:`ensurepip`, :mod:`ftplib`, + :mod:`glob`, :mod:`imaplib`, :mod:`nntplib`, :mod:`pdb`, :mod:`poplib`, + :mod:`shutil`, :mod:`smtplib`, :mod:`sqlite3`, :mod:`subprocess`, + :mod:`telnetlib`, :mod:`tempfile` and :mod:`webbrowser`, as well as + :func:`os.listdir`, :func:`os.scandir` and :func:`breakpoint`. + +- bpo-37364: :func:`io.open_code` is now used when reading :file:`.pth` + files. + +- bpo-34631: Updated OpenSSL to 1.1.1c in Windows installer + +- bpo-34155: Fix parsing of invalid email addresses with more than one ``@`` + (e.g. a@b@c.com.) to not return the part before 2nd ``@`` as valid email + address. Patch by maxking & jpic. + +Core and Builtins +----------------- + +- bpo-38631: Replace ``Py_FatalError()`` call with a regular + :exc:`RuntimeError` exception in :meth:`float.__getformat__`. + +- bpo-38639: Optimized :func:`math.floor()`, :func:`math.ceil()` and + :func:`math.trunc()` for floats. + +- bpo-38640: Fixed a bug in the compiler that was causing to raise in the + presence of break statements and continue statements inside always false + while loops. Patch by Pablo Galindo. + +- bpo-38613: Optimized some set operations (e.g. ``|``, ``^``, and ``-``) of + ``dict_keys``. ``d.keys() | other`` was slower than ``set(d) | other`` but + they are almost same performance for now. + +- bpo-28029: ``"".replace("", s, n)`` now returns ``s`` instead of an empty + string for all non-zero ``n``. There are similar changes for + :class:`bytes` and :class:`bytearray` objects. + +- bpo-38535: Fixed line numbers and column offsets for AST nodes for calls + without arguments in decorators. + +- bpo-38525: Fix a segmentation fault when using reverse iterators of empty + ``dict`` objects. Patch by Dong-hee Na and Inada Naoki. + +- bpo-38465: :class:`bytearray`, :class:`~array.array` and + :class:`~mmap.mmap` objects allow now to export more than 2**31 buffers at + a time. + +- bpo-38469: Fixed a bug where the scope of named expressions was not being + resolved correctly in the presence of the *global* keyword. Patch by Pablo + Galindo. + +- bpo-38437: Activate the ``GC_DEBUG`` macro for debug builds of the + interpreter (when ``Py_DEBUG`` is set). Patch by Pablo Galindo. + +- bpo-38379: When the garbage collector makes a collection in which some + objects resurrect (they are reachable from outside the isolated cycles + after the finalizers have been executed), do not block the collection of + all objects that are still unreachable. Patch by Pablo Galindo and Tim + Peters. + +- bpo-38379: When cyclic garbage collection (gc) runs finalizers that + resurrect unreachable objects, the current gc run ends, without collecting + any cyclic trash. However, the statistics reported by ``collect()`` and + ``get_stats()`` claimed that all cyclic trash found was collected, and + that the resurrected objects were collected. Changed the stats to report + that none were collected. + +- bpo-38392: In debug mode, :c:func:`PyObject_GC_Track` now calls + ``tp_traverse()`` of the object type to ensure that the object is valid: + test that objects visited by ``tp_traverse()`` are valid. + +- bpo-38210: Remove unecessary intersection and update set operation in + dictview with empty set. (Contributed by Dong-hee Na in :issue:`38210`.) + +- bpo-38402: Check the error from the system's underlying ``crypt`` or + ``crypt_r``. + +- bpo-37474: On FreeBSD, Python no longer calls ``fedisableexcept()`` at + startup to control the floating point control mode. The call became + useless since FreeBSD 6: it became the default mode. + +- bpo-38006: Fix a bug due to the interaction of weakrefs and the cyclic + garbage collector. We must clear any weakrefs in garbage in order to + prevent their callbacks from executing and causing a crash. + +- bpo-38317: Fix warnings options priority: ``PyConfig.warnoptions`` has the + highest priority, as stated in the :pep:`587`. + +- bpo-38310: Predict ``BUILD_MAP_UNPACK_WITH_CALL`` -> ``CALL_FUNCTION_EX`` + opcode pairs in the main interpreter loop. Patch by Brandt Bucher. + +- bpo-36871: Improve error handling for the assert_has_calls and + assert_has_awaits methods of mocks. Fixed a bug where any errors + encountered while binding the expected calls to the mock's spec were + silently swallowed, leading to misleading error output. + +- bpo-11410: Better control over symbol visibility is provided through use + of the visibility attributes available in gcc >= 4.0, provided in a + uniform way across POSIX and Windows. The POSIX build files have been + updated to compile with -fvisibility=hidden, minimising exported symbols. + +- bpo-38219: Optimized the :class:`dict` constructor and the + :meth:`~dict.update` method for the case when the argument is a dict. + +- bpo-38236: Python now dumps path configuration if it fails to import the + Python codecs of the filesystem and stdio encodings. + +- bpo-38013: Allow to call ``async_generator_athrow().throw(...)`` even for + non-started async generator helper. It fixes annoying warning at the end + of :func:`asyncio.run` call. + +- bpo-38124: Fix an off-by-one error in PyState_AddModule that could cause + out-of-bounds memory access. + +- bpo-38116: The select module is now PEP-384 compliant and no longer has + static state + +- bpo-38113: ast module updated to PEP-384 and all statics removed + +- bpo-38076: The struct module is now PEP-384 compatible + +- bpo-38075: The random module is now PEP-384 compatible + +- bpo-38074: zlib module made PEP-384 compatible + +- bpo-38073: Make pwd extension module PEP-384 compatible + +- bpo-38072: grp module made PEP-384 compatible + +- bpo-38069: Make _posixsubprocess PEP-384 compatible + +- bpo-38071: Make termios extension module PEP-384 compatible + +- bpo-38005: Fixed comparing and creating of InterpreterID and ChannelID. + +- bpo-36946: Fix possible signed integer overflow when handling slices. + Patch by hongweipeng. + +- bpo-37994: Fixed silencing arbitrary errors if an attribute lookup fails + in several sites. Only AttributeError should be silenced. + +- bpo-8425: Optimize set difference_update for the case when the other set + is much larger than the base set. (Suggested by Evgeny Kapun with code + contributed by Michele Orrù). + +- bpo-37966: The implementation of :func:`~unicodedata.is_normalized` has + been greatly sped up on strings that aren't normalized, by implementing + the full normalization-quick-check algorithm from the Unicode standard. + +- bpo-37947: Adjust correctly the recursion level in the symtable generation + for named expressions. Patch by Pablo Galindo. + +- bpo-37812: The ``CHECK_SMALL_INT`` macro used inside + :file:`Object/longobject.c` has been replaced with an explicit ``return`` + at each call site. + +- bpo-37751: Fix :func:`codecs.lookup` to normalize the encoding name the + same way than :func:`encodings.normalize_encoding`, except that + :func:`codecs.lookup` also converts the name to lower case. + +- bpo-37830: Fixed compilation of :keyword:`break` and :keyword:`continue` + in the :keyword:`finally` block when the corresponding :keyword:`try` + block contains :keyword:`return` with a non-constant value. + +- bpo-20490: Improve import error message for partially initialized module + on circular ``from`` imports - by Anthony Sottile. + +- bpo-37840: Fix handling of negative indices in + :c:member:`~PySequenceMethods.sq_item` of :class:`bytearray`. Patch by + Sergey Fedoseev. + +- bpo-37802: Slightly improve performance of + :c:func:`PyLong_FromUnsignedLong`, :c:func:`PyLong_FromUnsignedLongLong` + and :c:func:`PyLong_FromSize_t`. Patch by Sergey Fedoseev. + +- bpo-37409: Ensure explicit relative imports from interactive sessions and + scripts (having no parent package) always raise ImportError, rather than + treating the current module as the package. Patch by Ben Lewis. + +- bpo-32912: Reverted :issue:`32912`: emitting :exc:`SyntaxWarning` instead + of :exc:`DeprecationWarning` for invalid escape sequences in string and + bytes literals. + +- bpo-37757: :pep:`572`: As described in the PEP, assignment expressions now + raise :exc:`SyntaxError` when their interaction with comprehension scoping + results in an ambiguous target scope. + + The ``TargetScopeError`` subclass originally proposed by the PEP has been + removed in favour of just raising regular syntax errors for the disallowed + cases. + +- bpo-36279: Fix potential use of uninitialized memory in :func:`os.wait3`. + +- bpo-36311: Decoding bytes objects larger than 2GiB is faster and no longer + fails when a multibyte characters spans a chunk boundary. + +- bpo-34880: The :keyword:`assert` statement now works properly if the + :exc:`AssertionError` exception is being shadowed. Patch by Zackery Spytz. + +- bpo-37340: Removed object cache (``free_list``) for bound method objects. + Temporary bound method objects are less used than before thanks to the + ``LOAD_METHOD`` opcode and the ``_PyObject_VectorcallMethod`` C API. + +- bpo-37648: Fixed minor inconsistency in :meth:`list.__contains__`, + :meth:`tuple.__contains__` and a few other places. The collection's item + is now always at the left and the needle is on the right of ``==``. + +- bpo-37444: Update differing exception between :meth:`builtins.__import__` + and :meth:`importlib.__import__`. + +- bpo-37619: When adding a wrapper descriptor from one class to a different + class (for example, setting ``__add__ = str.__add__`` on an ``int`` + subclass), an exception is correctly raised when the operator is called. + +- bpo-37593: Swap the positions of the *posonlyargs* and *args* parameters + in the constructor of :class:`ast.parameters` nodes. + +- bpo-37543: Optimized pymalloc for non PGO build. + +- bpo-37537: Compute allocated pymalloc blocks inside + _Py_GetAllocatedBlocks(). This slows down _Py_GetAllocatedBlocks() but + gives a small speedup to _PyObject_Malloc() and _PyObject_Free(). + +- bpo-37467: Fix :func:`sys.excepthook` and :c:func:`PyErr_Display` if a + filename is a bytes string. For example, for a SyntaxError exception where + the filename attribute is a bytes string. + +- bpo-37433: Fix ``SyntaxError`` indicator printing too many spaces for + multi-line strings - by Anthony Sottile. + +- bpo-37417: :meth:`bytearray.extend` now correctly handles errors that + arise during iteration. Patch by Brandt Bucher. + +- bpo-37414: The undocumented ``sys.callstats()`` function has been removed. + Since Python 3.7, it was deprecated and always returned ``None``. It + required a special build option ``CALL_PROFILE`` which was already removed + in Python 3.7. + +- bpo-37392: Remove ``sys.getcheckinterval()`` and + ``sys.setcheckinterval()`` functions. They were deprecated since Python + 3.2. Use :func:`sys.getswitchinterval` and :func:`sys.setswitchinterval` + instead. Remove also ``check_interval`` field of the + ``PyInterpreterState`` structure. + +- bpo-37388: In development mode and in debug build, *encoding* and *errors* + arguments are now checked on string encoding and decoding operations. + Examples: :func:`open`, :meth:`str.encode` and :meth:`bytes.decode`. + + By default, for best performances, the *errors* argument is only checked + at the first encoding/decoding error, and the *encoding* argument is + sometimes ignored for empty strings. + +- bpo-37348: Optimized decoding short ASCII string with UTF-8 and ascii + codecs. ``b"foo".decode()`` is about 15% faster. Patch by Inada Naoki. + +- bpo-24214: Improved support of the surrogatepass error handler in the + UTF-8 and UTF-16 incremental decoders. + +- bpo-37330: :func:`open`, :func:`io.open`, :func:`codecs.open` and + :class:`fileinput.FileInput` no longer accept ``'U'`` ("universal + newline") in the file mode. This flag was deprecated since Python 3.3. + +- bpo-35224: Reverse evaluation order of key: value in dict comprehensions + as proposed in PEP 572. I.e. in ``{k: v for ...}``, ``k`` will be + evaluated before ``v``. + +- bpo-37316: Fix the :c:func:`PySys_Audit` call in :class:`mmap.mmap`. + +- bpo-37300: Remove an unnecssary Py_XINCREF in classobject.c. + +- bpo-37269: Fix a bug in the peephole optimizer that was not treating + correctly constant conditions with binary operators. Patch by Pablo + Galindo. + +- bpo-20443: Python now gets the absolute path of the script filename + specified on the command line (ex: "python3 script.py"): the __file__ + attribute of the __main__ module and sys.path[0] become an absolute path, + rather than a relative path. + +- bpo-37257: Python's small object allocator (``obmalloc.c``) now allows (no + more than) one empty arena to remain available for immediate reuse, + without returning it to the OS. This prevents thrashing in simple loops + where an arena could be created and destroyed anew on each iteration. + +- bpo-37231: The dispatching of type slots to special methods (for example + calling ``__mul__`` when doing ``x * y``) has been made faster. + +- bpo-36974: Implemented separate vectorcall functions for every calling + convention of builtin functions and methods. This improves performance for + calls. + +- bpo-37213: Handle correctly negative line offsets in the peephole + optimizer. Patch by Pablo Galindo. + +- bpo-37219: Remove erroneous optimization for empty set differences. + +- bpo-15913: Implement :c:func:`PyBuffer_SizeFromFormat()` function + (previously documented but not implemented): call :func:`struct.calcsize`. + Patch by Joannah Nanjekye. + +- bpo-36922: Slot functions optimize any callable with + ``Py_TPFLAGS_METHOD_DESCRIPTOR`` instead of only instances of + ``function``. + +- bpo-36974: The slot ``tp_vectorcall_offset`` is inherited unconditionally + to support ``super().__call__()`` when the base class uses vectorcall. + +- bpo-37160: :func:`threading.get_native_id` now also supports NetBSD. + +- bpo-37077: Add :func:`threading.get_native_id` support for AIX. Patch by + M. Felt + +- bpo-36781: :func:`sum` has been optimized for boolean values. + +- bpo-34556: Add ``--upgrade-deps`` to venv module. Patch by Cooper Ry Lees + +- bpo-20523: ``pdb.Pdb`` supports ~/.pdbrc in Windows 7. Patch by Tim Hopper + and Dan Lidral-Porter. + +- bpo-35551: Updated encodings: - Removed the "tis260" encoding, which was + an alias for the nonexistent "tactis" codec. - Added "mac_centeuro" as an + alias for the mac_latin2 encoding. + +- bpo-19072: The :class:`classmethod` decorator can now wrap other + descriptors such as property objects. Adapted from a patch written by + Graham Dumpleton. + +- bpo-27575: Improve speed of dictview intersection by directly using set + intersection logic. Patch by David Su. + +- bpo-30773: Prohibit parallel running of aclose() / asend() / athrow(). Fix + ag_running to reflect the actual running status of the AG. + +Library +------- + +- bpo-36589: The :func:`curses.update_lines_cols` function now returns + ``None`` instead of ``1`` on success. + +- bpo-38807: Update :exc:`TypeError` messages for :meth:`os.path.join` to + include :class:`os.PathLike` objects as acceptable input types. + +- bpo-38724: Add a repr for ``subprocess.Popen`` objects. Patch by Andrey + Doroschenko. + +- bpo-38786: pydoc now recognizes and parses HTTPS URLs. Patch by python273. + +- bpo-38785: Prevent asyncio from crashing if parent ``__init__`` is not + called from a constructor of object derived from ``asyncio.Future``. + +- bpo-38723: :mod:`pdb` now uses :meth:`io.open_code` to trigger auditing + events. + +- bpo-27805: Allow opening pipes and other non-seekable files in append mode + with :func:`open`. + +- bpo-38438: Simplify the :mod:`argparse` usage message for ``nargs="*"``. + +- bpo-38761: WeakSet is now registered as a collections.abc.MutableSet. + +- bpo-38716: logging: change RotatingHandler namer and rotator to + class-level attributes. This stops __init__ from setting them to None in + the case where a subclass defines them with eponymous methods. + +- bpo-38713: Add :data:`os.P_PIDFD` constant, which may be passed to + :func:`os.waitid` to wait on a Linux process file descriptor. + +- bpo-38692: Add :class:`asyncio.PidfdChildWatcher`, a Linux-specific child + watcher implementation that polls process file descriptors. + +- bpo-38692: Expose the Linux ``pidfd_open`` syscall as + :func:`os.pidfd_open`. + +- bpo-38602: Added constants :data:`~fcntl.F_OFD_GETLK`, + :data:`~fcntl.F_OFD_SETLK` and :data:`~fcntl.F_OFD_SETLKW` to the + :mod:`fcntl` module. Patch by Dong-hee Na. + +- bpo-38334: Fixed seeking backward on an encrypted + :class:`zipfile.ZipExtFile`. + +- bpo-38312: Add :func:`curses.get_escdelay`, :func:`curses.set_escdelay`, + :func:`curses.get_tabsize`, and :func:`curses.set_tabsize` functions - by + Anthony Sottile. + +- bpo-38586: Now :func:`~logging.config.fileConfig` correcty sets the .name + of handlers loaded. + +- bpo-38565: Add new cache_parameters() method for functools.lru_cache() to + better support pickling. + +- bpo-34679: asynci.ProactorEventLoop.close() now only calls + signal.set_wakeup_fd() in the main thread. + +- bpo-31202: The case the result of :func:`pathlib.WindowsPath.glob` matches + now the case of the pattern for literal parts. + +- bpo-36321: Remove misspelled attribute. The 3.8 changelog noted that this + would be removed in 3.9. + +- bpo-38521: Fixed erroneous equality comparison in statistics.NormalDist(). + +- bpo-38493: Added :data:`~os.CLD_KILLED` and :data:`~os.CLD_STOPPED` for + :attr:`si_code`. Patch by Dong-hee Na. + +- bpo-38478: Fixed a bug in :meth:`inspect.signature.bind` that was causing + it to fail when handling a keyword argument with same name as + positional-only parameter. Patch by Pablo Galindo. + +- bpo-33604: Fixed `hmac.new` and `hmac.HMAC` to raise TypeError instead of + ValueError when the digestmod parameter, now required in 3.8, is omitted. + Also clarified the hmac module documentation and docstrings. + +- bpo-38378: Parameters *out* and *in* of :func:`os.sendfile` was renamed to + *out_fd* and *in_fd*. + +- bpo-38417: Added support for setting the umask in the child process to the + subprocess module on POSIX systems. + +- bpo-38449: Revert GH-15522, which introduces a regression in + :meth:`mimetypes.guess_type` due to improper handling of filenames as + urls. + +- bpo-38431: Fix ``__repr__`` method for :class:`dataclasses.InitVar` to + support typing objects, patch by Samuel Colvin. + +- bpo-38109: Add missing :data:`stat.S_IFDOOR`, :data:`stat.S_IFPORT`, + :data:`stat.S_IFWHT`, :func:`stat.S_ISDOOR`, :func:`stat.S_ISPORT`, and + :func:`stat.S_ISWHT` values to the Python implementation of :mod:`stat`. + +- bpo-38422: Clarify docstrings of pathlib suffix(es) + +- bpo-38405: Nested subclasses of :class:`typing.NamedTuple` are now + pickleable. + +- bpo-38332: Prevent :exc:`KeyError` thrown by :func:`_encoded_words.decode` + when given an encoded-word with invalid content-type encoding from + propagating all the way to :func:`email.message.get`. + +- bpo-38371: Deprecated the ``split()`` method in + :class:`_tkinter.TkappType` in favour of the ``splitlist()`` method which + has more consistent and predicable behavior. + +- bpo-38341: Add :exc:`smtplib.SMTPNotSupportedError` to the :mod:`smtplib` + exported names. + +- bpo-38319: sendfile() used in socket and shutil modules was raising + OverflowError for files >= 2GiB on 32-bit architectures. (patch by + Giampaolo Rodola) + +- bpo-38242: Revert the new asyncio Streams API + +- bpo-13153: OS native encoding is now used for converting between Python + strings and Tcl objects. This allows to display, copy and paste to + clipboard emoji and other non-BMP characters. Converting strings from Tcl + to Python and back now never fails (except MemoryError). + +- bpo-38019: Correctly handle pause/resume reading of closed asyncio unix + pipe. + +- bpo-38163: Child mocks will now detect their type as either synchronous or + asynchronous, asynchronous child mocks will be AsyncMocks and synchronous + child mocks will be either MagicMock or Mock (depending on their parent + type). + +- bpo-38161: Removes _AwaitEvent from AsyncMock. + +- bpo-38216: Allow the rare code that wants to send invalid http requests + from the `http.client` library a way to do so. The fixes for bpo-30458 + led to breakage for some projects that were relying on this ability to + test their own behavior in the face of bad requests. + +- bpo-28286: Deprecate opening :class:`~gzip.GzipFile` for writing + implicitly. Always specify the *mode* argument for writing. + +- bpo-38108: Any synchronous magic methods on an AsyncMock now return a + MagicMock. Any asynchronous magic methods on a MagicMock now return an + AsyncMock. + +- bpo-38265: Update the *length* parameter of :func:`os.pread` to accept + :c:type:`Py_ssize_t` instead of :c:type:`int`. + +- bpo-38112: :mod:`compileall` has a higher default recursion limit and new + command-line arguments for path manipulation, symlinks handling, and + multiple optimization levels. + +- bpo-38248: asyncio: Fix inconsistent immediate Task cancellation + +- bpo-38237: The arguments for the builtin pow function are more + descriptive. They can now also be passed in as keywords. + +- bpo-34002: Improve efficiency in parts of email package by changing + while-pop to a for loop, using isdisjoint instead of set intersections. + +- bpo-38191: Constructors of :class:`~typing.NamedTuple` and + :class:`~typing.TypedDict` types now accept arbitrary keyword argument + names, including "cls", "self", "typename", "_typename", "fields" and + "_fields". + +- bpo-38155: Add ``__all__`` to :mod:`datetime`. Patch by Tahia Khan. + +- bpo-38185: Fixed case-insensitive string comparison in + :class:`sqlite3.Row` indexing. + +- bpo-38136: Changes AsyncMock call count and await count to be two + different counters. Now await count only counts when a coroutine has been + awaited, not when it has been called, and vice-versa. Update the + documentation around this. + +- bpo-37828: Fix default mock name in + :meth:`unittest.mock.Mock.assert_called` exceptions. Patch by Abraham + Toriz Cruz. + +- bpo-38175: Fix a memory leak in comparison of :class:`sqlite3.Row` + objects. + +- bpo-33936: _hashlib no longer calls obsolete OpenSSL initialization + function with OpenSSL 1.1.0+. + +- bpo-34706: Preserve subclassing in inspect.Signature.from_callable. + +- bpo-38153: Names of hashing algorithms frome OpenSSL are now normalized to + follow Python's naming conventions. For example OpenSSL uses sha3-512 + instead of sha3_512 or blake2b512 instead of blake2b. + +- bpo-38115: Fix a bug in dis.findlinestarts() where it would return invalid + bytecode offsets. Document that a code object's co_lnotab can contain + invalid bytecode offsets. + +- bpo-38148: Add slots to :mod:`asyncio` transport classes, which can reduce + memory usage. + +- bpo-38142: The _hashlib OpenSSL wrapper extension module is now PEP-384 + compliant. + +- bpo-9216: hashlib constructors now support usedforsecurity flag to signal + that a hashing algorithm is not used in a security context. + +- bpo-36991: Fixes a potential incorrect AttributeError exception escaping + ZipFile.extract() in some unsupported input error situations. + +- bpo-38134: Remove obsolete copy of PBKDF2_HMAC_fast. All supported OpenSSL + versions contain a fast implementation. + +- bpo-38132: The OpenSSL hashlib wrapper uses a simpler implementation. + Several Macros and pointless caches are gone. The hash name now comes from + OpenSSL's EVP. The algorithm name stays the same, except it is now always + lower case. + +- bpo-38008: Fix parent class check in protocols to correctly identify the + module that provides a builtin protocol, instead of assuming they all come + from the :mod:`collections.abc` module + +- bpo-34037: For :mod:`asyncio`, add a new coroutine + :meth:`loop.shutdown_default_executor`. The new coroutine provides an API + to schedule an executor shutdown that waits on the threadpool to finish + closing. Also, :func:`asyncio.run` has been updated to utilize the new + coroutine. Patch by Kyle Stanley. + +- bpo-37405: Fixed regression bug for socket.getsockname() for non-CAN_ISOTP + AF_CAN address family sockets by returning a 1-tuple instead of string. + +- bpo-38121: Update parameter names on functions in importlib.metadata + matching the changes in the 0.22 release of importlib_metadata. + +- bpo-38110: The os.closewalk() implementation now uses the libc fdwalk() + API on platforms where it is available. + +- bpo-38093: Fixes AsyncMock so it doesn't crash when used with + AsyncContextManagers or AsyncIterators. + +- bpo-37488: Add warning to :meth:`datetime.utctimetuple`, + :meth:`datetime.utcnow` and :meth:`datetime.utcfromtimestamp` . + +- bpo-35640: Allow passing a :term:`path-like object` as ``directory`` + argument to the :class:`http.server.SimpleHTTPRequestHandler` class. Patch + by Géry Ogam. + +- bpo-38086: Update importlib.metadata with changes from `importlib_metadata + 0.21 + `_. + +- bpo-37251: Remove `__code__` check in AsyncMock that incorrectly evaluated + function specs as async objects but failed to evaluate classes with + `__await__` but no `__code__` attribute defined as async objects. + +- bpo-38037: Fix reference counters in the :mod:`signal` module. + +- bpo-38066: Hide internal asyncio.Stream methods: feed_eof(), feed_data(), + set_exception() and set_transport(). + +- bpo-38059: inspect.py now uses sys.exit() instead of exit() + +- bpo-38049: Added command-line interface for the :mod:`ast` module. + +- bpo-37953: In :mod:`typing`, improved the ``__hash__`` and ``__eq__`` + methods for :class:`ForwardReferences`. + +- bpo-38026: Fixed :func:`inspect.getattr_static` used ``isinstance`` while + it should avoid dynamic lookup. + +- bpo-35923: Update :class:`importlib.machinery.BuiltinImporter` to use + ``loader._ORIGIN`` instead of a hardcoded value. Patch by Dong-hee Na. + +- bpo-38010: In ``importlib.metadata`` sync with ``importlib_metadata`` + 0.20, clarifying behavior of ``files()`` and fixing issue where only one + requirement was returned for ``requires()`` on ``dist-info`` packages. + +- bpo-38006: weakref.WeakValueDictionary defines a local remove() function + used as callback for weak references. This function was created with a + closure. Modify the implementation to avoid the closure. + +- bpo-37995: Added the *indent* option to :func:`ast.dump` which allows it + to produce a multiline indented output. + +- bpo-34410: Fixed a crash in the :func:`tee` iterator when re-enter it. + RuntimeError is now raised in this case. + +- bpo-37140: Fix a ctypes regression of Python 3.8. When a ctypes.Structure + is passed by copy to a function, ctypes internals created a temporary + object which had the side effect of calling the structure finalizer + (__del__) twice. The Python semantics requires a finalizer to be called + exactly once. Fix ctypes internals to no longer call the finalizer twice. + +- bpo-37587: ``_json.scanstring`` is now up to 3x faster when there are many + backslash escaped characters in the JSON string. + +- bpo-37834: Prevent shutil.rmtree exception when built on non-Windows + system without fd system call support, like older versions of macOS. + +- bpo-10978: Semaphores and BoundedSemaphores can now release more than one + waiting thread at a time. + +- bpo-37972: Subscripts to the `unittest.mock.call` objects now receive the + same chaining mechanism as any other custom attributes, so that the + following usage no longer raises a `TypeError`: + + call().foo().__getitem__('bar') + + Patch by blhsing + +- bpo-37965: Fix C compiler warning caused by + distutils.ccompiler.CCompiler.has_function. + +- bpo-37964: Add ``F_GETPATH`` command to :mod:`fcntl`. + +- bpo-37960: ``repr()`` of buffered and text streams now silences only + expected exceptions when get the value of "name" and "mode" attributes. + +- bpo-37961: Add a ``total_nframe`` field to the traces collected by the + tracemalloc module. This field indicates the original number of frames + before it was truncated. + +- bpo-37951: Most features of the subprocess module now work again in + subinterpreters. Only *preexec_fn* is restricted in subinterpreters. + +- bpo-36205: Fix the rusage implementation of time.process_time() to + correctly report the sum of the system and user CPU time. + +- bpo-37950: Fix :func:`ast.dump` when call with incompletely initialized + node. + +- bpo-34679: Restores instantiation of Windows IOCP event loops from the + non-main thread. + +- bpo-36917: Add default implementation of the + :meth:`ast.NodeVisitor.visit_Constant` method which emits a deprecation + warning and calls corresponding methody ``visit_Num()``, ``visit_Str()``, + etc. + +- bpo-37798: Update test_statistics.py to verify that the statistics module + works well for both C and Python implementations. Patch by Dong-hee Na + +- bpo-26589: Added a new status code to the http module: 451 + UNAVAILABLE_FOR_LEGAL_REASONS + +- bpo-37915: Fix a segmentation fault that appeared when comparing instances + of ``datetime.timezone`` and ``datetime.tzinfo`` objects. Patch by Pablo + Galindo. + +- bpo-32554: Deprecate having random.seed() call hash on arbitrary types. + +- bpo-9938: Add optional keyword argument ``exit_on_error`` for + :class:`ArgumentParser`. + +- bpo-37851: The :mod:`faulthandler` module no longer allocates its + alternative stack at Python startup. Now the stack is only allocated at + the first faulthandler usage. + +- bpo-32793: Fix a duplicated debug message when + :meth:`smtplib.SMTP.connect` is called. + +- bpo-37885: venv: Don't generate unset variable warning on deactivate. + +- bpo-37868: Fix dataclasses.is_dataclass when given an instance that never + raises AttributeError in __getattr__. That is, an object that returns + something for __dataclass_fields__ even if it's not a dataclass. + +- bpo-37811: Fix ``socket`` module's ``socket.connect(address)`` function + being unable to establish connection in case of interrupted system call. + The problem was observed on all OSes which ``poll(2)`` system call can + take only non-negative integers and -1 as a timeout value. + +- bpo-37863: Optimizations for Fraction.__hash__ suggested by Tim Peters. + +- bpo-21131: Fix ``faulthandler.register(chain=True)`` stack. faulthandler + now allocates a dedicated stack of ``SIGSTKSZ*2`` bytes, instead of just + ``SIGSTKSZ`` bytes. Calling the previous signal handler in faulthandler + signal handler uses more than ``SIGSTKSZ`` bytes of stack memory on some + platforms. + +- bpo-37798: Add C fastpath for statistics.NormalDist.inv_cdf() Patch by + Dong-hee Na + +- bpo-37804: Remove the deprecated method `threading.Thread.isAlive()`. + Patch by Dong-hee Na. + +- bpo-37819: Add Fraction.as_integer_ratio() to match the corresponding + methods in bool, int, float, and decimal. + +- bpo-14465: Add an xml.etree.ElementTree.indent() function for + pretty-printing XML trees. Contributed by Stefan Behnel. + +- bpo-37810: Fix :mod:`difflib` ``?`` hint in diff output when dealing with + tabs. Patch by Anthony Sottile. + +- bpo-37772: In ``zipfile.Path``, when adding implicit dirs, ensure that + ancestral directories are added and that duplicates are excluded. + +- bpo-18578: Renamed and documented `test.bytecode_helper` as + `test.support.bytecode_helper`. Patch by Joannah Nanjekye. + +- bpo-37785: Fix xgettext warnings in :mod:`argparse`. + +- bpo-34488: :meth:`writelines` method of :class:`io.BytesIO` is now + slightly faster when many small lines are passed. Patch by Sergey + Fedoseev. + +- bpo-37449: `ensurepip` now uses `importlib.resources.read_binary()` to + read data instead of `pkgutil.get_data()`. Patch by Joannah Nanjekye. + +- bpo-28292: Mark calendar.py helper functions as being private. The + follows PEP 8 guidance to maintain the style conventions in the module and + it addresses a known case of user confusion. + +- bpo-18049: Add definition of THREAD_STACK_SIZE for AIX in + Python/thread_pthread.h The default thread stacksize caused crashes with + the default recursion limit Patch by M Felt + +- bpo-37742: The logging.getLogger() API now returns the root logger when + passed the name 'root', whereas previously it returned a non-root logger + named 'root'. This could affect cases where user code explicitly wants a + non-root logger named 'root', or instantiates a logger using + logging.getLogger(__name__) in some top-level module called 'root.py'. + +- bpo-37738: Fix the implementation of curses ``addch(str, color_pair)``: + pass the color pair to ``setcchar()``, instead of always passing 0 as the + color pair. + +- bpo-37723: Fix performance regression on regular expression parsing with + huge character sets. Patch by Yann Vaginay. + +- bpo-35943: The function :c:func:`PyImport_GetModule` now ensures any + module it returns is fully initialized. Patch by Joannah Nanjekye. + +- bpo-32178: Fix IndexError in :mod:`email` package when trying to parse + invalid address fields starting with ``:``. + +- bpo-37268: The :mod:`parser` module is deprecated and will be removed in + future versions of Python. + +- bpo-11953: Completing WSA* error codes in :mod:`socket`. + +- bpo-37685: Fixed comparisons of :class:`datetime.timedelta` and + :class:`datetime.timezone`. + +- bpo-37697: Syncronize ``importlib.metadata`` with `importlib_metadata 0.19 + `_, + improving handling of EGG-INFO files and fixing a crash when entry point + names contained colons. + +- bpo-37695: Correct :func:`curses.unget_wch` error message. Patch by + Anthony Sottile. + +- bpo-37689: Add :meth:`is_relative_to` in :class:`PurePath` to determine + whether or not one path is relative to another. + +- bpo-29553: Fixed :meth:`argparse.ArgumentParser.format_usage` for mutually + exclusive groups. Patch by Andrew Nester. + +- bpo-37691: Let math.dist() accept coordinates as sequences (or iterables) + rather than just tuples. + +- bpo-37685: Fixed ``__eq__``, ``__lt__`` etc implementations in some + classes. They now return :data:`NotImplemented` for unsupported type of + the other operand. This allows the other operand to play role (for example + the equality comparison with :data:`~unittest.mock.ANY` will return + ``True``). + +- bpo-37354: Make Activate.ps1 Powershell script static to allow for signing + it. + +- bpo-37664: Update wheels bundled with ensurepip (pip 19.2.3 and setuptools + 41.2.0) + +- bpo-37663: Bring consistency to venv shell activation scripts by always + using __VENV_PROMPT__. + +- bpo-37642: Allowed the pure Python implementation of + :class:`datetime.timezone` to represent sub-minute offsets close to + minimum and maximum boundaries, specifically in the ranges (23:59, 24:00) + and (-23:59, 24:00). Patch by Ngalim Siregar + +- bpo-36161: In :mod:`posix`, use ``ttyname_r`` instead of ``ttyname`` for + thread safety. + +- bpo-36324: Make internal attributes for statistics.NormalDist() private. + +- bpo-37555: Fix `NonCallableMock._call_matcher` returning tuple instead of + `_Call` object when `self._spec_signature` exists. Patch by Elizabeth + Uselton + +- bpo-29446: Make `from tkinter import *` import only the expected objects. + +- bpo-16970: Adding a value error when an invalid value in passed to nargs + Patch by Robert Leenders + +- bpo-34443: Exceptions from :mod:`enum` now use the ``__qualname`` of the + enum class in the exception message instead of the ``__name__``. + +- bpo-37491: Fix ``IndexError`` when parsing email headers with unexpectedly + ending bare-quoted string value. Patch by Abhilash Raj. + +- bpo-37587: Make json.loads faster for long strings. (Patch by Marco + Paolini) + +- bpo-18378: Recognize "UTF-8" as a valid value for LC_CTYPE in + locale._parse_localename. + +- bpo-37579: Return :exc:`NotImplemented` in Python implementation of + ``__eq__`` for :class:`~datetime.timedelta` and :class:`~datetime.time` + when the other object being compared is not of the same type to match C + implementation. Patch by Karthikeyan Singaravelan. + +- bpo-21478: Record calls to parent when autospecced object is attached to a + mock using :func:`unittest.mock.attach_mock`. Patch by Karthikeyan + Singaravelan. + +- bpo-37531: "python3 -m test -jN --timeout=TIMEOUT" now kills a worker + process if it runs longer than *TIMEOUT* seconds. + +- bpo-37482: Fix serialization of display name in originator or destination + address fields with both encoded words and special chars. + +- bpo-36993: Improve error reporting for corrupt zip files with bad zip64 + extra data. Patch by Daniel Hillier. + +- bpo-37502: pickle.loads() no longer raises TypeError when the buffers + argument is set to None + +- bpo-37520: Correct behavior for zipfile.Path.parent when the path object + identifies a subdirectory. + +- bpo-18374: Fix the ``.col_offset`` attribute of nested :class:`ast.BinOp` + instances which had a too large value in some situations. + +- bpo-37424: Fixes a possible hang when using a timeout on + `subprocess.run()` while capturing output. If the child process spawned + its own children or otherwise connected its stdout or stderr handles with + another process, we could hang after the timeout was reached and our child + was killed when attempting to read final output from the pipes. + +- bpo-37421: Fix :func:`multiprocessing.util.get_temp_dir` finalizer: clear + also the 'tempdir' configuration of the current process, so next call to + ``get_temp_dir()`` will create a new temporary directory, rather than + reusing the removed temporary directory. + +- bpo-37481: The distutils ``bdist_wininst`` command is deprecated in Python + 3.8, use ``bdist_wheel`` (wheel packages) instead. + +- bpo-37479: When `Enum.__str__` is overridden in a derived class, the + override will be used by `Enum.__format__` regardless of whether mixin + classes are present. + +- bpo-37440: http.client now enables TLS 1.3 post-handshake authentication + for default context or if a cert_file is passed to HTTPSConnection. + +- bpo-37437: Update vendorized expat version to 2.2.7. + +- bpo-37428: SSLContext.post_handshake_auth = True no longer sets + SSL_VERIFY_POST_HANDSHAKE verify flag for client connections. Although the + option is documented as ignored for clients, OpenSSL implicitly enables + cert chain validation when the flag is set. + +- bpo-37420: :func:`os.sched_setaffinity` now correctly handles errors that + arise during iteration over its ``mask`` argument. Patch by Brandt Bucher. + +- bpo-37412: The :func:`os.getcwdb` function now uses the UTF-8 encoding on + Windows, rather than the ANSI code page: see :pep:`529` for the rationale. + The function is no longer deprecated on Windows. + +- bpo-37406: The sqlite3 module now raises TypeError, rather than + ValueError, if operation argument type is not str: execute(), + executemany() and calling a connection. + +- bpo-29412: Fix IndexError in parsing a header value ending unexpectedly. + Patch by Abhilash Raj. + +- bpo-36546: The *dist* argument for statistics.quantiles() is now + positional only. The current name doesn't reflect that the argument can be + either a dataset or a distribution. Marking the parameter as positional + avoids confusion and makes it possible to change the name later. + +- bpo-37394: Fix a bug that was causing the :mod:`queue` module to fail if + the accelerator module was not available. Patch by Pablo Galindo. + +- bpo-37376: :mod:`pprint` now has support for + :class:`types.SimpleNamespace`. Patch by Carl Bordum Hansen. + +- bpo-26967: An :class:`~argparse.ArgumentParser` with + ``allow_abbrev=False`` no longer disables grouping of short flags, such as + ``-vv``, but only disables abbreviation of long flags as documented. Patch + by Zac Hatfield-Dodds. + +- bpo-37212: :func:`unittest.mock.call` now preserves the order of keyword + arguments in repr output. Patch by Karthikeyan Singaravelan. + +- bpo-37372: Fix error unpickling datetime.time objects from Python 2 with + seconds>=24. Patch by Justin Blanchard. + +- bpo-37345: Add formal support for UDPLITE sockets. Support was present + before, but it is now easier to detect support with ``hasattr(socket, + 'IPPROTO_UDPLITE')`` and there are constants defined for each of the + values needed: :py:obj:`socket.IPPROTO_UDPLITE`, + :py:obj:`UDPLITE_SEND_CSCOV`, and :py:obj:`UDPLITE_RECV_CSCOV`. Patch by + Gabe Appleton. + +- bpo-37358: Optimized ``functools.partial`` by using vectorcall. + +- bpo-37347: :meth:`sqlite3.Connection.create_aggregate`, + :meth:`sqlite3.Connection.create_function`, + :meth:`sqlite3.Connection.set_authorizer`, + :meth:`sqlite3.Connection.set_progress_handler` + :meth:`sqlite3.Connection.set_trace_callback` methods lead to segfaults if + some of these methods are called twice with an equal object but not the + same. Now callbacks are stored more carefully. Patch by Aleksandr Balezin. + +- bpo-37163: The *obj* argument of :func:`dataclasses.replace` is + positional-only now. + +- bpo-37085: Add the optional Linux SocketCAN Broadcast Manager constants, + used as flags to configure the BCM behaviour, in the socket module. Patch + by Karl Ding. + +- bpo-37328: ``HTMLParser.unescape`` is removed. It was undocumented and + deprecated since Python 3.4. + +- bpo-37305: Add .webmanifest -> application/manifest+json to list of + recognized file types and content type headers + +- bpo-37320: ``aifc.openfp()`` alias to ``aifc.open()``, ``sunau.openfp()`` + alias to ``sunau.open()``, and ``wave.openfp()`` alias to ``wave.open()`` + have been removed. They were deprecated since Python 3.7. + +- bpo-37315: Deprecated accepting floats with integral value (like ``5.0``) + in :func:`math.factorial`. + +- bpo-37312: ``_dummy_thread`` and ``dummy_threading`` modules have been + removed. These modules were deprecated since Python 3.7 which requires + threading support. + +- bpo-33972: Email with single part but content-type set to ``multipart/*`` + doesn't raise AttributeError anymore. + +- bpo-37280: Use threadpool for reading from file for sendfile fallback + mode. + +- bpo-37279: Fix asyncio sendfile support when sendfile sends extra data in + fallback mode. + +- bpo-19865: :func:`ctypes.create_unicode_buffer()` now also supports + non-BMP characters on platforms with 16-bit :c:type:`wchar_t` (for + example, Windows and AIX). + +- bpo-37266: In a subinterpreter, spawning a daemon thread now raises an + exception. Daemon threads were never supported in subinterpreters. + Previously, the subinterpreter finalization crashed with a Pyton fatal + error if a daemon thread was still running. + +- bpo-37210: Allow pure Python implementation of :mod:`pickle` to work even + when the C :mod:`_pickle` module is unavailable. + +- bpo-21872: Fix :mod:`lzma`: module decompresses data incompletely. When + decompressing a FORMAT_ALONE format file, and it doesn't have the end + marker, sometimes the last one to dozens bytes can't be output. Patch by + Ma Lin. + +- bpo-35922: Fix :meth:`RobotFileParser.crawl_delay` and + :meth:`RobotFileParser.request_rate` to return ``None`` rather than raise + :exc:`AttributeError` when no relevant rule is defined in the robots.txt + file. Patch by Rémi Lapeyre. + +- bpo-35766: Change the format of feature_version to be a (major, minor) + tuple. + +- bpo-36607: Eliminate :exc:`RuntimeError` raised by + :func:`asyncio.all_tasks()` if internal tasks weak set is changed by + another thread during iteration. + +- bpo-18748: :class:`_pyio.IOBase` destructor now does nothing if getting + the ``closed`` attribute fails to better mimick :class:`_io.IOBase` + finalizer. + +- bpo-36402: Fix a race condition at Python shutdown when waiting for + threads. Wait until the Python thread state of all non-daemon threads get + deleted (join all non-daemon threads), rather than just wait until + non-daemon Python threads complete. + +- bpo-37206: Default values which cannot be represented as Python objects no + longer improperly represented as ``None`` in function signatures. + +- bpo-37111: Added ``encoding`` and ``errors`` keyword parameters to + ``logging.basicConfig``. + +- bpo-12144: Ensure cookies with ``expires`` attribute are handled in + :meth:`CookieJar.make_cookies`. + +- bpo-34886: Fix an unintended ValueError from :func:`subprocess.run` when + checking for conflicting `input` and `stdin` or `capture_output` and + `stdout` or `stderr` args when they were explicitly provided but with + `None` values within a passed in `**kwargs` dict rather than as passed + directly by name. Patch contributed by Rémi Lapeyre. + +- bpo-37173: The exception message for ``inspect.getfile()`` now correctly + reports the passed class rather than the builtins module. + +- bpo-37178: Give math.perm() a one argument form that means the same as + math.factorial(). + +- bpo-37178: For math.perm(n, k), let k default to n, giving the same result + as factorial. + +- bpo-37165: Converted _collections._count_elements to use the Argument + Clinic. + +- bpo-34767: Do not always create a :class:`collections.deque` in + :class:`asyncio.Lock`. + +- bpo-37158: Speed-up statistics.fmean() by switching from a function to a + generator. + +- bpo-34282: Remove ``Enum._convert`` method, deprecated in 3.8. + +- bpo-37150: `argparse._ActionsContainer.add_argument` now throws error, if + someone accidentally pass FileType class object instead of instance of + FileType as `type` argument + +- bpo-28724: The socket module now has the :func:`socket.send_fds` and + :func:`socket.recv.fds` methods. Contributed by Joannah Nanjekye, Shinya + Okano and Victor Stinner. + +- bpo-35621: Support running asyncio subprocesses when execution event loop + in a thread on UNIX. + +- bpo-36520: Lengthy email headers with UTF-8 characters are now properly + encoded when they are folded. Patch by Jeffrey Kintscher. + +- bpo-30835: Fixed a bug in email parsing where a message with invalid bytes + in content-transfer-encoding of a multipart message can cause an + AttributeError. Patch by Andrew Donnellan. + +- bpo-31163: pathlib.Path instance's rename and replace methods now return + the new Path instance. + +- bpo-25068: :class:`urllib.request.ProxyHandler` now lowercases the keys of + the passed dictionary. + +- bpo-26185: Fix :func:`repr` on empty :class:`ZipInfo` object. Patch by + Mickaël Schoentgen. + +- bpo-21315: Email headers containing RFC2047 encoded words are parsed + despite the missing whitespace, and a defect registered. Also missing + trailing whitespace after encoded words is now registered as a defect. + +- bpo-31904: Port test_datetime to VxWorks: skip zoneinfo tests on VxWorks + +- bpo-35805: Add parser for Message-ID header and add it to default + HeaderRegistry. This should prevent folding of Message-ID using RFC 2048 + encoded words. + +- bpo-36871: Ensure method signature is used instead of constructor + signature of a class while asserting mock object against method calls. + Patch by Karthikeyan Singaravelan. + +- bpo-35070: posix.getgrouplist() now works correctly when the user belongs + to NGROUPS_MAX supplemental groups. Patch by Jeffrey Kintscher. + +- bpo-31783: Fix race condition in ThreadPoolExecutor when worker threads + are created during interpreter shutdown. + +- bpo-36582: Fix ``UserString.encode()`` to correctly return ``bytes`` + rather than a ``UserString`` instance. + +- bpo-32424: Deprecate xml.etree.ElementTree.Element.copy() in favor of + copy.copy(). + + Patch by Gordon P. Hemsley + +- bpo-36564: Fix infinite loop in email header folding logic that would be + triggered when an email policy's max_line_length is not long enough to + include the required markup and any values in the message. Patch by Paul + Ganssle + +- bpo-36543: Removed methods Element.getchildren(), Element.getiterator() + and ElementTree.getiterator() and the xml.etree.cElementTree module. + +- bpo-36409: Remove the old plistlib API deprecated in Python 3.4 + +- bpo-36302: distutils sorts source file lists so that Extension .so files + build more reproducibly by default + +- bpo-36250: Ignore ``ValueError`` from ``signal`` with ``interaction`` in + non-main thread. + +- bpo-36046: Added ``user``, ``group`` and ``extra_groups`` parameters to + the subprocess.Popen constructor. Patch by Patrick McLean. + +- bpo-32627: Fix compile error when ``_uuid`` headers conflicting included. + +- bpo-35800: Deprecate ``smtpd.MailmanProxy`` ready for future removal. + +- bpo-35168: :attr:`shlex.shlex.punctuation_chars` is now a read-only + property. + +- bpo-8538: Add support for boolean actions like ``--foo`` and ``--no-foo`` + to argparse. Patch contributed by Rémi Lapeyre. + +- bpo-20504: Fixes a bug in :mod:`cgi` module when a multipart/form-data + request has no `Content-Length` header. + +- bpo-25988: The abstract base classes in :mod:`collections.abc` no longer + are exposed in the regular :mod:`collections` module. + +- bpo-11122: Distutils won't check for rpmbuild in specified paths only. + +- bpo-34775: Division handling of PurePath now returns NotImplemented + instead of raising a TypeError when passed something other than an + instance of str or PurePath. Patch by Roger Aiudi. + +- bpo-34749: :func:`binascii.a2b_base64` is now up to 2 times faster. Patch + by Sergey Fedoseev. + +- bpo-34519: Add additional aliases for HP Roman 8. Patch by Michael Osipov. + +- bpo-28009: Fix uuid.getnode() on platforms with '.' as MAC Addr delimiter + as well fix for MAC Addr format that omits a leading 0 in MAC Addr values. + Currently, AIX is the only know platform with these settings. Patch by + Michael Felt. + +- bpo-30618: Add :meth:`~pathlib.Path.readlink`. Patch by Girts Folkmanis. + +- bpo-32498: Made :func:`urllib.parse.unquote()` accept bytes in addition to + strings. Patch by Stein Karlsen. + +- bpo-33348: lib2to3 now recognizes expressions after ``*`` and `**` like in + ``f(*[] or [])``. + +- bpo-32689: Update :func:`shutil.move` function to allow for Path objects + to be used as source argument. Patch by Emily Morehouse and Maxwell + "5.13b" McKinnon. + +- bpo-32820: Added __format__ to IPv4 and IPv6 classes. Always outputs a + fully zero- padded string. Supports b/x/n modifiers (bin/hex/native + format). Native format for IPv4 is bin, native format for IPv6 is hex. + Also supports '#' and '_' modifiers. + +- bpo-27657: Fix urllib.parse.urlparse() with numeric paths. A string like + "path:80" is no longer parsed as a path but as a scheme ("path") and a + path ("80"). + +- bpo-4963: Fixed non-deterministic behavior related to mimetypes extension + mapping and module reinitialization. + +Documentation +------------- + +- bpo-21767: Explicitly mention abc support in functools.singledispatch + +- bpo-38816: Provides more details about the interaction between + :c:func:`fork` and CPython's runtime, focusing just on the C-API. This + includes cautions about where :c:func:`fork` should and shouldn't be + called. + +- bpo-38351: Modernize :mod:`email` examples from %-formatting to f-strings. + +- bpo-38778: Document the fact that :exc:`RuntimeError` is raised if + :meth:`os.fork` is called in a subinterpreter. + +- bpo-38592: Add Brazilian Portuguese to the language switcher at Python + Documentation website. + +- bpo-38294: Add list of no-longer-escaped chars to re.escape documentation + +- bpo-38053: Modernized the plistlib documentation + +- bpo-26868: Fix example usage of :c:func:`PyModule_AddObject` to properly + handle errors. + +- bpo-36797: Fix a dead link in the distutils API Reference. + +- bpo-37977: Warn more strongly and clearly about pickle insecurity + +- bpo-37979: Added a link to dateutil.parser.isoparse in the + datetime.fromisoformat documentation. Patch by Paul Ganssle + +- bpo-12707: Deprecate info(), geturl(), getcode() methods in favor of the + headers, url, and status properties, respectively, for HTTPResponse and + addinfourl. Also deprecate the code attribute of addinfourl in favor of + the status attribute. Patch by Ashwin Ramaswami + +- bpo-37937: Mention ``frame.f_trace`` in :func:`sys.settrace` docs. + +- bpo-37878: Make :c:func:`PyThreadState_DeleteCurrent` Internal. + +- bpo-37759: Beginning edits to Whatsnew 3.8 + +- bpo-37726: Stop recommending getopt in the tutorial for command line + argument parsing and promote argparse. + +- bpo-32910: Remove implementation-specific behaviour of how venv's + Deactivate works. + +- bpo-37256: Fix wording of arguments for :class:`Request` in + :mod:`urllib.request` + +- bpo-37284: Add a brief note to indicate that any new + ``sys.implementation`` required attributes must go through the PEP + process. + +- bpo-30088: Documented that :class:`mailbox.Maildir` constructor doesn't + attempt to verify the maildir folder layout correctness. Patch by + Sviatoslav Sydorenko. + +- bpo-37521: Fix `importlib` examples to insert any newly created modules + via importlib.util.module_from_spec() immediately into sys.modules instead + of after calling loader.exec_module(). + + Thanks to Benjamin Mintz for finding the bug. + +- bpo-37456: Slash ('/') is now part of syntax. + +- bpo-37487: Fix PyList_GetItem index description to include 0. + +- bpo-37149: Replace the dead link to the Tkinter 8.5 reference by John + Shipman, New Mexico Tech, with a link to the archive.org copy. + +- bpo-37478: Added possible exceptions to the description of os.chdir(). + +- bpo-34903: Documented that in :meth:`datetime.datetime.strptime()`, the + leading zero in some two-digit formats is optional. Patch by Mike Gleen. + +- bpo-36260: Add decompression pitfalls to zipfile module documentation. + +- bpo-37004: In the documentation for difflib, a note was added explicitly + warning that the results of SequenceMatcher's ratio method may depend on + the order of the input strings. + +- bpo-36960: Restructured the :mod:`datetime` docs in the interest of making + them more user-friendly and improving readability. Patch by Brad Solomon. + +- bpo-36487: Make C-API docs clear about what the "main" interpreter is. + +- bpo-23460: The documentation for decimal string formatting using the `:g` + specifier has been updated to reflect the correct exponential notation + cutoff point. Original patch contributed by Tuomas Suutari. + +- bpo-35803: Document and test that ``tempfile`` functions may accept a + :term:`path-like object` for the ``dir`` argument. Patch by Anthony + Sottile. + +- bpo-33944: Added a note about the intended use of code in .pth files. + +- bpo-34293: Fix the Doc/Makefile regarding PAPER environment variable and + PDF builds + +- bpo-25237: Add documentation for tkinter modules + +Tests +----- + +- bpo-38614: Fix test_communicate() of test_asyncio.test_subprocess: use + ``support.LONG_TIMEOUT`` (5 minutes), instead of just 1 minute. + +- bpo-38614: Add timeout constants to :mod:`test.support`: + :data:`~test.support.LOOPBACK_TIMEOUT`, + :data:`~test.support.INTERNET_TIMEOUT`, + :data:`~test.support.SHORT_TIMEOUT` and + :data:`~test.support.LONG_TIMEOUT`. + +- bpo-38502: test.regrtest now uses process groups in the multiprocessing + mode (-jN command line option) if process groups are available: if + :func:`os.setsid` and :func:`os.killpg` functions are available. + +- bpo-35998: Fix a race condition in test_asyncio.test_start_tls_server_1(). + Previously, there was a race condition between the test main() function + which replaces the protocol and the test ServerProto protocol which sends + ANSWER once it gets HELLO. Now, only the test main() function is + responsible to send data, ServerProto no longer sends data. + +- bpo-38470: Fix ``test_compileall.test_compile_dir_maxlevels()`` on Windows + without long path support: only create 3 subdirectories instead of between + 20 and 100 subdirectories. + +- bpo-37531: On timeout, regrtest no longer attempts to call + ``popen.communicate()`` again: it can hang until all child processes using + stdout and stderr pipes completes. Kill the worker process and ignores its + output. Change also the faulthandler timeout of the main process from 1 + minute to 5 minutes, for Python slowest buildbots. + +- bpo-38239: Fix test_gdb for Link Time Optimization (LTO) builds. + +- bpo-38275: test_ssl now handles disabled TLS/SSL versions better. + OpenSSL's crypto policy and run-time settings are recognized and tests for + disabled versions are skipped. Tests also accept more TLS minimum_versions + for platforms that override OpenSSL's default with strict settings. + +- bpo-38271: The private keys for test_ssl were encrypted with 3DES in + traditional PKCS#5 format. 3DES and the digest algorithm of PKCS#5 are + blocked by some strict crypto policies. Use PKCS#8 format with AES256 + encryption instead. + +- bpo-38270: test.support now has a helper function to check for + availibility of a hash digest function. Several tests are refactored avoid + MD5 and use SHA256 instead. Other tests are marked to use MD5 and skipped + when MD5 is disabled. + +- bpo-37123: Multiprocessing test test_mymanager() now also expects + -SIGTERM, not only exitcode 0. BaseManager._finalize_manager() sends + SIGTERM to the manager process if it takes longer than 1 second to stop, + which happens on slow buildbots. + +- bpo-38212: Multiprocessing tests: increase + test_queue_feeder_donot_stop_onexc() timeout from 1 to 60 seconds. + +- bpo-38117: Test with OpenSSL 1.1.1d + +- bpo-38018: Increase code coverage for multiprocessing.shared_memory. + +- bpo-37805: Add tests for json.dump(..., skipkeys=True). Patch by Dong-hee + Na. + +- bpo-37531: Enhance regrtest multiprocess timeout: write a message when + killing a worker process, catch popen.kill() and popen.wait() exceptions, + put a timeout on the second call to popen.communicate(). + +- bpo-37876: Add tests for ROT-13 codec. + +- bpo-36833: Added tests for PyDateTime_xxx_GET_xxx() macros of the C API of + the :mod:`datetime` module. Patch by Joannah Nanjekye. + +- bpo-37558: Fix test_shared_memory_cleaned_after_process_termination name + handling + +- bpo-37526: Add :func:`test.support.catch_threading_exception`: context + manager catching :class:`threading.Thread` exception using + :func:`threading.excepthook`. + +- bpo-37421: test_concurrent_futures now explicitly stops the ForkServer + instance if it's running. + +- bpo-37421: multiprocessing tests now stop the ForkServer instance if it's + running: close the "alive" file descriptor to ask the server to stop and + then remove its UNIX address. + +- bpo-37421: test_distutils.test_build_ext() is now able to remove the + temporary directory on Windows: don't import the newly built C extension + ("xx") in the current process, but test it in a separated process. + +- bpo-37421: test_concurrent_futures now cleans up multiprocessing to remove + immediately temporary directories created by + multiprocessing.util.get_temp_dir(). + +- bpo-37421: test_winconsoleio doesn't leak a temporary file anymore: use + tempfile.TemporaryFile() to remove it when the test completes. + +- bpo-37421: multiprocessing tests now explicitly call ``_run_finalizers()`` + to immediately remove temporary directories created by tests. + +- bpo-37421: urllib.request tests now call + :func:`~urllib.request.urlcleanup` to remove temporary files created by + ``urlretrieve()`` tests and to clear the ``_opener`` global variable set + by ``urlopen()`` and functions calling indirectly ``urlopen()``. + +- bpo-37472: Remove ``Lib/test/outstanding_bugs.py``. + +- bpo-37199: Fix test failures when IPv6 is unavailable or disabled. + +- bpo-19696: Replace deprecated method "random.choose" with "random.choice" + in "test_pkg_import.py". + +- bpo-37335: Remove no longer necessary code from c locale coercion tests + +- bpo-37421: Fix test_shutil to no longer leak temporary files. + +- bpo-37411: Fix test_wsgiref.testEnviron() to no longer depend on the + environment variables (don't fail if "X" variable is set). + +- bpo-37400: Fix test_os.test_chown(): use os.getgroups() rather than + grp.getgrall() to get groups. Rename also the test to test_chown_gid(). + +- bpo-37359: Add --cleanup option to python3 -m test to remove + ``test_python_*`` directories of previous failed jobs. Add "make + cleantest" to run ``python3 -m test --cleanup``. + +- bpo-37362: test_gdb no longer fails if it gets an "unexpected" message on + stderr: it now ignores stderr. The purpose of test_gdb is to test that + python-gdb.py commands work as expected, not to test gdb. + +- bpo-35998: Avoid TimeoutError in test_asyncio: test_start_tls_server_1() + +- bpo-37278: Fix test_asyncio ProactorLoopCtrlC: join the thread to prevent + leaking a running thread and leaking a reference. + +- bpo-37261: Fix :func:`test.support.catch_unraisable_exception`: its + __exit__() method now ignores unraisable exception raised when clearing + its ``unraisable`` attribute. + +- bpo-37069: regrtest now uses :func:`sys.unraisablehook` to mark a test as + "environment altered" (ENV_CHANGED) if it emits an "unraisable exception". + Moreover, regrtest logs a warning in this case. + + Use ``python3 -m test --fail-env-changed`` to catch unraisable exceptions + in tests. + +- bpo-37252: Fix assertions in ``test_close`` and + ``test_events_mask_overflow`` devpoll tests. + +- bpo-37169: Rewrite ``_PyObject_IsFreed()`` unit tests. + +- bpo-37153: ``test_venv.test_multiprocessing()`` now explicitly calls + ``pool.terminate()`` to wait until the pool completes. + +- bpo-34001: Make test_ssl pass with LibreSSL. LibreSSL handles minimum and + maximum TLS version differently than OpenSSL. + +- bpo-36919: Make ``test_source_encoding.test_issue2301`` implementation + independent. The test will work now for both CPython and IronPython. + +- bpo-30202: Update ``test.test_importlib.test_abc`` to test + ``find_spec()``. + +- bpo-28009: Modify the test_uuid logic to test when a program is available + AND can be used to obtain a MACADDR as basis for an UUID. Patch by M. Felt + +- bpo-34596: Fallback to a default reason when :func:`unittest.skip` is + uncalled. Patch by Naitree Zhu. + +Build +----- + +- bpo-38809: On Windows, build scripts will now recognize and use python.exe + from an active virtual env. + +- bpo-38684: Fix _hashlib build when Blake2 is disabled, but OpenSSL + supports it. + +- bpo-38468: Misc/python-config.in now uses `getvar()` for all still + existing `sysconfig.get_config_var()` calls. Patch by Joannah Nanjekye. + +- bpo-37415: Fix stdatomic.h header check for ICC compiler: the ICC + implementation lacks atomic_uintptr_t type which is needed by Python. + +- bpo-38301: In Solaris family, we must be sure to use ``-D_REENTRANT``. + Patch by Jesús Cea Avión. + +- bpo-36002: Locate ``llvm-profdata`` and ``llvm-ar`` binaries using + ``AC_PATH_TOOL`` rather than ``AC_PATH_TARGET_TOOL``. + +- bpo-37936: The :file:`.gitignore` file systematically keeps "rooted", with + a non-trailing slash, all the rules that are meant to apply to files in a + specific place in the repo. Previously, when the intended file to ignore + happened to be at the root of the repo, we'd most often accidentally also + ignore files and directories with the same name anywhere in the tree. + +- bpo-37760: The :file:`Tools/unicode/makeunicodedata.py` script, which is + used for converting information from the Unicode Character Database into + generated code and data used by the methods of :class:`str` and by the + :mod:`unicodedata` module, now handles each character's data as a + ``dataclass`` with named attributes, rather than a length-18 list of + different fields. + +- bpo-37936: The :file:`.gitignore` file no longer applies to any files that + are in fact tracked in the Git repository. Patch by Greg Price. + +- bpo-37725: Change "clean" makefile target to also clean the program guided + optimization (PGO) data. Previously you would have to use "make clean" + and "make profile-removal", or "make clobber". + +- bpo-37707: Mark some individual tests to skip when --pgo is used. The + tests marked increase the PGO task time significantly and likely don't + help improve optimization of the final executable. + +- bpo-36044: Reduce the number of unit tests run for the PGO generation + task. This speeds up the task by a factor of about 15x. Running the full + unit test suite is slow. This change may result in a slightly less + optimized build since not as many code branches will be executed. If you + are willing to wait for the much slower build, the old behavior can be + restored using './configure [..] PROFILE_TASK="-m test --pgo-extended"'. + We make no guarantees as to which PGO task set produces a faster build. + Users who care should run their own relevant benchmarks as results can + depend on the environment, workload, and compiler tool chain. + +- bpo-37468: ``make install`` no longer installs ``wininst-*.exe`` files + used by distutils bdist_wininst: bdist_wininst only works on Windows. + +- bpo-37189: Many ``PyRun_XXX()`` functions like :c:func:`PyRun_String` were + no longer exported in ``libpython38.dll`` by mistake. Export them again to + fix the ABI compatibility. + +- bpo-25361: Enables use of SSE2 instructions in Windows 32-bit build. + +- bpo-36210: Update optional extension module detection for AIX. ossaudiodev + and spwd are not applicable for AIX, and are no longer reported as + missing. 3rd-party packaging of ncurses (with ASIS support) conflicts with + officially supported AIX curses library, so configure AIX to use + libcurses.a. However, skip trying to build _curses_panel. + + patch by M Felt + +Windows +------- + +- bpo-38589: Fixes HTML Help shortcut when Windows is not installed to C + drive + +- bpo-38453: Ensure ntpath.realpath() correctly resolves relative paths. + +- bpo-38519: Restores the internal C headers that were missing from the + nuget.org and Microsoft Store packages. + +- bpo-38492: Remove ``pythonw.exe`` dependency on the Microsoft C++ runtime. + +- bpo-38344: Fix error message in activate.bat + +- bpo-38359: Ensures ``pyw.exe`` launcher reads correct registry key. + +- bpo-38355: Fixes ``ntpath.realpath`` failing on ``sys.executable``. + +- bpo-38117: Update bundled OpenSSL to 1.1.1d + +- bpo-38092: Reduce overhead when using multiprocessing in a Windows virtual + environment. + +- bpo-38133: Allow py.exe launcher to locate installations from the + Microsoft Store and improve display of active virtual environments. + +- bpo-38114: The ``pip.ini`` is no longer included in the Nuget package. + +- bpo-32592: Set Windows 8 as the minimum required version for API support + +- bpo-36634: :func:`os.cpu_count` now returns active processors rather than + maximum processors. + +- bpo-36634: venv activate.bat now works when the existing variables contain + double quote characters. + +- bpo-38081: Prevent error calling :func:`os.path.realpath` on ``'NUL'``. + +- bpo-38087: Fix case sensitivity in test_pathlib and test_ntpath. + +- bpo-38088: Fixes distutils not finding vcruntime140.dll with only the v142 + toolset installed. + +- bpo-37283: Ensure command-line and unattend.xml setting override + previously detected states in Windows installer. + +- bpo-38030: Fixes :func:`os.stat` failing for block devices on Windows + +- bpo-38020: Fixes potential crash when calling :func:`os.readlink` (or + indirectly through :func:`~os.path.realpath`) on a file that is not a + supported link. + +- bpo-37705: Improve the implementation of ``winerror_to_errno()``. + +- bpo-37549: :func:`os.dup` no longer fails for standard streams on Windows + 7. + +- bpo-1311: The ``nul`` file on Windows now returns True from + :func:`~os.path.exists` and a valid result from :func:`os.stat` with + ``S_IFCHR`` set. + +- bpo-9949: Enable support for following symlinks in :func:`os.realpath`. + +- bpo-37834: Treat all name surrogate reparse points on Windows in + :func:`os.lstat` and other reparse points as regular files in + :func:`os.stat`. + +- bpo-36266: Add the module name in the formatted error message when DLL + load fail happens during module import in + ``_PyImport_FindSharedFuncptrWindows()``. Patch by Srinivas Nyayapati. + +- bpo-25172: Trying to import the :mod:`crypt` module on Windows will result + in an :exc:`ImportError` with a message explaining that the module isn't + supported on Windows. On other platforms, if the underlying ``_crypt`` + module is not available, the ImportError will include a message explaining + the problem. + +- bpo-37778: Fixes the icons used for file associations to the Microsoft + Store package. + +- bpo-37734: Fix use of registry values to launch Python from Microsoft + Store app. + +- bpo-37702: Fix memory leak on Windows in creating an SSLContext object or + running urllib.request.urlopen('https://...'). + +- bpo-37672: Switch Windows Store package's pip to use bundled + :file:`pip.ini` instead of :envvar:`PIP_USER` variable. + +- bpo-10945: Officially drop support for creating bdist_wininst installers + on non-Windows systems. + +- bpo-37445: Include the ``FORMAT_MESSAGE_IGNORE_INSERTS`` flag in + ``FormatMessageW()`` calls. + +- bpo-37369: Fixes path for :data:`sys.executable` when running from the + Microsoft Store. + +- bpo-37380: Don't collect unfinished processes with ``subprocess._active`` + on Windows to cleanup later. Patch by Ruslan Kuprieiev. + +- bpo-37351: Removes libpython38.a from standard Windows distribution. + +- bpo-35360: Update Windows builds to use SQLite 3.28.0. + +- bpo-37267: On Windows, :func:`os.dup` no longer creates an inheritable fd + when handling a character file. + +- bpo-36779: Ensure ``time.tzname`` is correct on Windows when the active + code page is set to CP_UTF7 or CP_UTF8. + +- bpo-32587: Make :data:`winreg.REG_MULTI_SZ` support zero-length strings. + +- bpo-28269: Replace use of :c:func:`strcasecmp` for the system function + :c:func:`_stricmp`. Patch by Minmin Gong. + +- bpo-36590: Add native Bluetooth RFCOMM support to socket module. + +macOS +----- + +- bpo-38117: Updated OpenSSL to 1.1.1d in macOS installer. + +- bpo-38089: Move Azure Pipelines to latest VM versions and make macOS tests + optional + +- bpo-18049: Increase the default stack size of threads from 5MB to 16MB on + macOS, to match the stack size of the main thread. This avoids crashes on + deep recursion in threads. + +- bpo-34602: Avoid test suite failures on macOS by no longer calling + resource.setrlimit to increase the process stack size limit at runtime. + The runtime change is no longer needed since the interpreter is being + built with a larger default stack size. + +- bpo-35360: Update macOS installer to use SQLite 3.28.0. + +- bpo-34631: Updated OpenSSL to 1.1.1c in macOS installer. + +IDLE +---- + +- bpo-26353: Stop adding newline when saving an IDLE shell window. + +- bpo-4630: Add an option to toggle IDLE's cursor blink for shell, editor, + and output windows. See Settings, General, Window Preferences, Cursor + Blink. Patch by Zackery Spytz. + +- bpo-38598: Do not try to compile IDLE shell or output windows + +- bpo-36698: IDLE no longer fails when write non-encodable characters to + stderr. It now escapes them with a backslash, as the regular Python + interpreter. Added the ``errors`` field to the standard streams. + +- bpo-35379: When exiting IDLE, catch any AttributeError. One happens when + EditorWindow.close is called twice. Printing a traceback, when IDLE is + run from a terminal, is useless and annoying. + +- bpo-38183: To avoid problems, test_idle ignores the user config directory. + It no longer tries to create or access .idlerc or any files within. Users + must run IDLE to discover problems with saving settings. + +- bpo-38077: IDLE no longer adds 'argv' to the user namespace when + initializing it. This bug only affected 3.7.4 and 3.8.0b2 to 3.8.0b4. + +- bpo-38041: Shell restart lines now fill the window width, always start + with '=', and avoid wrapping unnecessarily. The line will still wrap if + the included file name is long relative to the width. + +- bpo-35771: To avoid occasional spurious test_idle failures on slower + machines, increase the ``hover_delay`` in test_tooltip. + +- bpo-37824: Properly handle user input warnings in IDLE shell. Cease + turning SyntaxWarnings into SyntaxErrors. + +- bpo-37929: IDLE Settings dialog now closes properly when there is no shell + window. + +- bpo-37902: Add mousewheel scrolling for IDLE module, path, and stack + browsers. Patch by George Zhang. + +- bpo-37849: Fixed completions list appearing too high or low when shown + above the current line. + +- bpo-36419: Refactor IDLE autocomplete and improve testing. + +- bpo-37748: Reorder the Run menu. Put the most common choice, Run Module, + at the top. + +- bpo-37692: Improve highlight config sample with example shell interaction + and better labels for shell elements. + +- bpo-37628: Settings dialog no longer expands with font size. + +- bpo-37627: Initialize the Customize Run dialog with the command line + arguments most recently entered before. The user can optionally edit + before submitting them. + +- bpo-33610: Fix code context not showing the correct context when first + toggled on. + +- bpo-37530: Optimize code context to reduce unneeded background activity. + Font and highlight changes now occur along with text changes instead of + after a random delay. + +- bpo-27452: Cleanup ``config.py`` by inlining ``RemoveFile`` and + simplifying the handling of ``file`` in ``CreateConfigHandlers``. + +- bpo-37325: Fix tab focus traversal order for help source and custom run + dialogs. + +- bpo-37321: Both subprocess connection error messages now refer to the + 'Startup failure' section of the IDLE doc. + +- bpo-17535: Add optional line numbers for IDLE editor windows. Windows + open without line numbers unless set otherwise in the General tab of the + configuration dialog. + +- bpo-26806: To compensate for stack frames added by IDLE and avoid possible + problems with low recursion limits, add 30 to limits in the user code + execution process. Subtract 30 when reporting recursion limits to make + this addition mostly transparent. + +- bpo-37177: Properly 'attach' search dialogs to their main window so that + they behave like other dialogs and do not get hidden behind their main + window. + +- bpo-37039: Adjust "Zoom Height" to individual screens by momentarily + maximizing the window on first use with a particular screen. Changing + screen settings may invalidate the saved height. While a window is + maximized, "Zoom Height" has no effect. + +- bpo-35763: Make calltip reminder about '/' meaning positional-only less + obtrusive by only adding it when there is room on the first line. + +- bpo-5680: Add 'Run... Customized' to the Run menu to run a module with + customized settings. Any 'command line arguments' entered are added to + sys.argv. One can suppress the normal Shell main module restart. + +- bpo-36390: Gather Format menu functions into format.py. Combine + paragraph.py, rstrip.py, and format methods from editor.py. + +Tools/Demos +----------- + +- bpo-38118: Update Valgrind suppression file to ignore a false alarm in + :c:func:`PyUnicode_Decode` when using GCC builtin strcmp(). + +- bpo-38347: pathfix.py: Assume all files that end on '.py' are Python + scripts when working recursively. + +- bpo-37803: pdb's ``--help`` and ``--version`` long options now work. + +- bpo-37942: Improve ArgumentClinic converter for floats. + +- bpo-37704: Remove ``Tools/scripts/h2py.py``: use cffi to access a C API in + Python. + +- bpo-37675: 2to3 now works when run from a zipped standard library. + +- bpo-37034: Argument Clinic now uses the argument name on errors with + keyword-only argument instead of their position. Patch contributed by Rémi + Lapeyre. + +- bpo-37064: Add option -k to pathscript.py script: preserve shebang flags. + Add option -a to pathscript.py script: add flags. + +C API +----- + +- bpo-37633: Re-export some function compatibility wrappers for macros in + ``pythonrun.h``. + +- bpo-38644: Provide :c:func:`Py_EnterRecursiveCall` and + :c:func:`Py_LeaveRecursiveCall` as regular functions for the limited API. + Previously, there were defined as macros, but these macros didn't work + with the limited API which cannot access ``PyThreadState.recursion_depth`` + field. Remove ``_Py_CheckRecursionLimit`` from the stable ABI. + +- bpo-38650: The global variable :c:data:`PyStructSequence_UnnamedField` is + now a constant and refers to a constant string. + +- bpo-38540: Fixed possible leak in :c:func:`PyArg_Parse` and similar + functions for format units ``"es#"`` and ``"et#"`` when the macro + :c:macro:`PY_SSIZE_T_CLEAN` is not defined. + +- bpo-38395: Fix a crash in :class:`weakref.proxy` objects due to incorrect + lifetime management when calling some associated methods that may delete + the last reference to object being referenced by the proxy. Patch by Pablo + Galindo. + +- bpo-36389: The ``_PyObject_CheckConsistency()`` function is now also + available in release mode. For example, it can be used to debug a crash in + the ``visit_decref()`` function of the GC. + +- bpo-38266: Revert the removal of PyThreadState_DeleteCurrent() with + documentation. + +- bpo-38303: Update audioop extension module to use the stable ABI + (PEP-384). Patch by Tyler Kieft. + +- bpo-38234: :c:func:`Py_SetPath` now sets :data:`sys.executable` to the + program full path (:c:func:`Py_GetProgramFullPath`) rather than to the + program name (:c:func:`Py_GetProgramName`). + +- bpo-38234: Python ignored arguments passed to :c:func:`Py_SetPath`, + :c:func:`Py_SetPythonHome` and :c:func:`Py_SetProgramName`: fix Python + initialization to use specified arguments. + +- bpo-38205: The :c:func:`Py_UNREACHABLE` macro now calls + :c:func:`Py_FatalError`. + +- bpo-38140: Make dict and weakref offsets opaque for C heap types by + passing the offsets through PyMemberDef + +- bpo-15088: The C function ``PyGen_NeedsFinalizing`` has been removed. It + was not documented, tested or used anywhere within CPython after the + implementation of :pep:`442`. Patch by Joannah Nanjekye. (Patch by Joannah + Nanjekye) + +- bpo-36763: Options added by ``PySys_AddXOption()`` are now handled the + same way than ``PyConfig.xoptions`` and command line ``-X`` options. + +- bpo-37926: Fix a crash in ``PySys_SetArgvEx(0, NULL, 0)``. + +- bpo-37879: Fix subtype_dealloc to suppress the type decref when the base + type is a C heap type + +- bpo-37645: Add :c:func:`_PyObject_FunctionStr` to get a user-friendly + string representation of a function-like object. Patch by Jeroen Demeyer. + +- bpo-29548: The functions ``PyEval_CallObject``, ``PyEval_CallFunction``, + ``PyEval_CallMethod`` and ``PyEval_CallObjectWithKeywords`` are + deprecated. Use :c:func:`PyObject_Call` and its variants instead. + +- bpo-37151: ``PyCFunction_Call`` is now a deprecated alias of + :c:func:`PyObject_Call`. + +- bpo-37540: The vectorcall protocol now requires that the caller passes + only strings as keyword names. + +- bpo-37207: The vectorcall protocol is now enabled for ``type`` objects: + set ``tp_vectorcall`` to a vectorcall function to be used instead of + ``tp_new`` and ``tp_init`` when calling the class itself. + +- bpo-21120: Exclude Python-ast.h, ast.h and asdl.h from the limited API. + +- bpo-37483: Add new function ``_PyObject_CallOneArg`` for calling an object + with one positional argument. + +- bpo-36763: Add :func:`PyConfig_SetWideStringList` function. + +- bpo-37337: Add fast functions for calling methods: + :c:func:`_PyObject_VectorcallMethod`, :c:func:`_PyObject_CallMethodNoArgs` + and :c:func:`_PyObject_CallMethodOneArg`. + +- bpo-28805: The :const:`METH_FASTCALL` calling convention has been + documented. + +- bpo-37221: The new function :c:func:`PyCode_NewWithPosOnlyArgs` allows to + create code objects like :c:func:`PyCode_New`, but with an extra + *posonlyargcount* parameter for indicating the number of positonal-only + arguments. + +- bpo-37215: Fix dtrace issue introduce by bpo-36842 + +- bpo-37194: Add a new public :c:func:`PyObject_CallNoArgs` function to the + C API: call a callable Python object without any arguments. It is the most + efficient way to call a callback without any argument. On x86-64, for + example, ``PyObject_CallFunctionObjArgs(func, NULL)`` allocates 960 bytes + on the stack per call, whereas ``PyObject_CallNoArgs(func)`` only + allocates 624 bytes per call. + +- bpo-37170: Fix the cast on error in + :c:func:`PyLong_AsUnsignedLongLongMask()`. + +- bpo-35381: Convert posixmodule.c statically allocated types + ``DirEntryType`` and ``ScandirIteratorType`` to heap-allocated types. + +- bpo-34331: Use singular/plural noun in error message when instantiating an + abstract class with non-overriden abstract method(s). + + +What's New in Python 3.8.0 beta 1? +================================== + +*Release date: 2019-06-04* + +Security +-------- + +- bpo-35907: CVE-2019-9948: Avoid file reading by disallowing + ``local-file://`` and ``local_file://`` URL schemes in + ``URLopener().open()`` and ``URLopener().retrieve()`` of + :mod:`urllib.request`. + +- bpo-33529: Prevent fold function used in email header encoding from + entering infinite loop when there are too many non-ASCII characters in a + header. + +- bpo-33164: Updated blake2 implementation which uses secure memset + implementation provided by platform. + +Core and Builtins +----------------- + +- bpo-35814: Allow unpacking in the right hand side of annotated + assignments. In particular, ``t: Tuple[int, ...] = x, y, *z`` is now + allowed. + +- bpo-37126: All structseq objects are now tracked by the garbage collector. + Patch by Pablo Galindo. + +- bpo-37122: Make the *co_argcount* attribute of code objects represent the + total number of positional arguments (including positional-only + arguments). The value of *co_posonlyargcount* can be used to distinguish + which arguments are positional only, and the difference (*co_argcount* - + *co_posonlyargcount*) is the number of positional-or-keyword arguments. + Patch by Pablo Galindo. + +- bpo-20092: Constructors of :class:`int`, :class:`float` and + :class:`complex` will now use the :meth:`~object.__index__` special + method, if available and the corresponding method :meth:`~object.__int__`, + :meth:`~object.__float__` or :meth:`~object.__complex__` is not available. + +- bpo-37087: Add native thread ID (TID) support to OpenBSD. + +- bpo-26219: Implemented per opcode cache mechanism and ``LOAD_GLOBAL`` + instruction use it. ``LOAD_GLOBAL`` is now about 40% faster. Contributed + by Yury Selivanov, and Inada Naoki. + +- bpo-37072: Fix crash in PyAST_FromNodeObject() when flags is NULL. + +- bpo-37029: Freeing a great many small objects could take time quadratic in + the number of arenas, due to using linear search to keep ``obmalloc.c``'s + list of usable arenas sorted by order of number of free memory pools. + This is accomplished without search now, leaving the worst-case time + linear in the number of arenas. For programs where this quite visibly + matters (typically with more than 100 thousand small objects alive + simultaneously), this can greatly reduce the time needed to release their + memory. + +- bpo-26423: Fix possible overflow in ``wrap_lenfunc()`` when ``sizeof(long) + < sizeof(Py_ssize_t)`` (e.g., 64-bit Windows). + +- bpo-37050: Improve the AST for "debug" f-strings, which use '=' to print + out the source of the expression being evaluated. Delete expr_text from + the FormattedValue node, and instead use a Constant string node (possibly + merged with adjacent constant expressions inside the f-string). + +- bpo-22385: The `bytes.hex`, `bytearray.hex`, and `memoryview.hex` methods + as well as the `binascii.hexlify` and `b2a_hex` functions now have the + ability to include an optional separator between hex bytes. This + functionality was inspired by MicroPython's hexlify implementation. + +- bpo-26836: Add :func:`os.memfd_create`. + +- bpo-37032: Added new ``replace()`` method to the code type + (:class:`types.CodeType`). + +- bpo-37007: Implement :func:`socket.if_nameindex()`, + :func:`socket.if_nametoindex()`, and :func:`socket.if_indextoname()` on + Windows. + +- bpo-36829: :c:func:`PyErr_WriteUnraisable` now creates a traceback object + if there is no current traceback. Moreover, call + :c:func:`PyErr_NormalizeException` and :c:func:`PyException_SetTraceback` + to normalize the exception value. Ignore any error. + +- bpo-36878: Only accept text after `# type: ignore` if the first character + is ASCII. This is to disallow things like `# type: ignoreé`. + +- bpo-36878: Store text appearing after a `# type: ignore` comment in the + AST. For example a type ignore like `# type: ignore[E1000]` will have the + string `"[E1000]"` stored in its AST node. + +- bpo-2180: Treat line continuation at EOF as a ``SyntaxError`` by Anthony + Sottile. + +- bpo-36907: Fix a crash when calling a C function with a keyword dict + (``f(**kwargs)``) and changing the dict ``kwargs`` while that function is + running. + +- bpo-36946: Fix possible signed integer overflow when handling slices. + +- bpo-36826: Add NamedExpression kind support to ast_unparse.c + +- bpo-1875: A :exc:`SyntaxError` is now raised if a code blocks that will be + optimized away (e.g. if conditions that are always false) contains syntax + errors. Patch by Pablo Galindo. + +- bpo-36027: Allow computation of modular inverses via three-argument + ``pow``: the second argument is now permitted to be negative in the case + where the first and third arguments are relatively prime. + +- bpo-36861: Update the Unicode database to version 12.1.0. + +- bpo-28866: Avoid caching attributes of classes which type defines mro() to + avoid a hard cache invalidation problem. + +- bpo-36851: The ``FrameType`` stack is now correctly cleaned up if the + execution ends with a return and the stack is not empty. + +- bpo-34616: The ``compile()`` builtin functions now support the + ``ast.PyCF_ALLOW_TOP_LEVEL_AWAIT`` flag, which allow to compile sources + that contains top-level ``await``, ``async with`` or ``async for``. This + is useful to evaluate async-code from with an already async functions; for + example in a custom REPL. + +- bpo-36842: Implement PEP 578, adding sys.audit, io.open_code and related + APIs. + +- bpo-27639: Correct return type for UserList slicing operations. Patch by + Michael Blahay, Erick Cervantes, and vaultah + +- bpo-36737: Move PyRuntimeState.warnings into per-interpreter state (via + "module state"). + +- bpo-36793: Removed ``__str__`` implementations from builtin types + :class:`bool`, :class:`int`, :class:`float`, :class:`complex` and few + classes from the standard library. They now inherit ``__str__()`` from + :class:`object`. + +- bpo-36817: Add a ``=`` feature f-strings for debugging. This can precede + ``!s``, ``!r``, or ``!a``. It produces the text of the expression, + followed by an equal sign, followed by the repr of the value of the + expression. So ``f'{3*9+15=}'`` would be equal to the string + ``'3*9+15=42'``. If ``=`` is specified, the default conversion is set to + ``!r``, unless a format spec is given, in which case the formatting + behavior is unchanged, and __format__ will be used. + +- bpo-24048: Save the live exception during import.c's ``remove_module()``. + +- bpo-27987: pymalloc returns memory blocks aligned by 16 bytes, instead of + 8 bytes, on 64-bit platforms to conform x86-64 ABI. Recent compilers + assume this alignment more often. Patch by Inada Naoki. + +- bpo-36601: A long-since-meaningless check for ``getpid() == main_pid`` was + removed from Python's internal C signal handler. + +- bpo-36594: Fix incorrect use of ``%p`` in format strings. Patch by Zackery + Spytz. + +- bpo-36045: builtins.help() now prefixes `async` for async functions + +- bpo-36084: Add native thread ID (TID) to threading.Thread objects + (supported platforms: Windows, FreeBSD, Linux, macOS) + +- bpo-36035: Added fix for broken symlinks in combination with pathlib + +- bpo-35983: Added new trashcan macros to deal with a double deallocation + that could occur when the `tp_dealloc` of a subclass calls the + `tp_dealloc` of a base class and that base class uses the trashcan + mechanism. Patch by Jeroen Demeyer. + +- bpo-20602: Do not clear :data:`sys.flags` and :data:`sys.float_info` + during shutdown. Patch by Zackery Spytz. + +- bpo-26826: Expose :func:`copy_file_range` as a low level API in the + :mod:`os` module. + +- bpo-32388: Remove cross-version binary compatibility requirement in + tp_flags. + +- bpo-31862: Port binascii to PEP 489 multiphase initialization. Patch by + Marcel Plch. + +Library +------- + +- bpo-37128: Added :func:`math.perm`. + +- bpo-37120: Add SSLContext.num_tickets to control the number of TLSv1.3 + session tickets. + +- bpo-12202: Fix the error handling in + :meth:`msilib.SummaryInformation.GetProperty`. Patch by Zackery Spytz. + +- bpo-26835: The fcntl module now contains file sealing constants for + sealing of memfds. + +- bpo-29262: Add ``get_origin()`` and ``get_args()`` introspection helpers + to ``typing`` module. + +- bpo-12639: :meth:`msilib.Directory.start_component()` no longer fails if + *keyfile* is not ``None``. + +- bpo-36999: Add the ``asyncio.Task.get_coro()`` method to publicly expose + the tasks's coroutine object. + +- bpo-35246: Make :func:`asyncio.create_subprocess_exec` accept path-like + arguments. + +- bpo-35279: Change default *max_workers* of ``ThreadPoolExecutor`` from + ``cpu_count() * 5`` to ``min(32, cpu_count() + 4))``. Previous value was + unreasonably large on many cores machines. + +- bpo-37076: :func:`_thread.start_new_thread` now logs uncaught exception + raised by the function using :func:`sys.unraisablehook`, rather than + :func:`sys.excepthook`, so the hook gets access to the function which + raised the exception. + +- bpo-33725: On macOS, the :mod:`multiprocessing` module now uses *spawn* + start method by default. + +- bpo-37054: Fix destructor :class:`_pyio.BytesIO` and + :class:`_pyio.TextIOWrapper`: initialize their ``_buffer`` attribute as + soon as possible (in the class body), because it's used by ``__del__()`` + which calls ``close()``. + +- bpo-37058: PEP 544: Add ``Protocol`` and ``@runtime_checkable`` to the + ``typing`` module. + +- bpo-36933: The functions ``sys.set_coroutine_wrapper`` and + ``sys.get_coroutine_wrapper`` that were deprecated and marked for removal + in 3.8 have been removed. + +- bpo-37047: Handle late binding and attribute access in + :class:`unittest.mock.AsyncMock` setup for autospeccing. Document newly + implemented async methods in :class:`unittest.mock.MagicMock`. + +- bpo-37049: PEP 589: Add ``TypedDict`` to the ``typing`` module. + +- bpo-37046: PEP 586: Add ``Literal`` to the ``typing`` module. + +- bpo-37045: PEP 591: Add ``Final`` qualifier and ``@final`` decorator to + the ``typing`` module. + +- bpo-37035: Don't log OSError based exceptions if a fatal error has + occurred in asyncio transport. Peer can generate almost any OSError, user + cannot avoid these exceptions by fixing own code. Errors are still + propagated to user code, it's just logging them is pointless and pollute + asyncio logs. + +- bpo-37001: :func:`symtable.symtable` now accepts the same input types for + source code as the built-in :func:`compile` function. Patch by Dino + Viehland. + +- bpo-37028: Implement asyncio REPL + +- bpo-37027: Return safe to use proxy socket object from + transport.get_extra_info('socket') + +- bpo-32528: Make asyncio.CancelledError a BaseException. + + This will address the common mistake many asyncio users make: an "except + Exception" clause breaking Tasks cancellation. + + In addition to this change, we stop inheriting asyncio.TimeoutError and + asyncio.InvalidStateError from their concurrent.futures.* counterparts. + There's no point for these exceptions to share the inheritance chain. + +- bpo-1230540: Add a new :func:`threading.excepthook` function which handles + uncaught :meth:`threading.Thread.run` exception. It can be overridden to + control how uncaught :meth:`threading.Thread.run` exceptions are handled. + +- bpo-36996: Handle :func:`unittest.mock.patch` used as a decorator on async + functions. + +- bpo-37008: Add support for calling :func:`next` with the mock resulting + from :func:`unittest.mock.mock_open` + +- bpo-27737: Allow whitespace only header encoding in ``email.header`` - by + Batuhan Taskaya + +- bpo-36969: PDB command `args` now display positional only arguments. + Patch contributed by Rémi Lapeyre. + +- bpo-36969: PDB command `args` now display keyword only arguments. Patch + contributed by Rémi Lapeyre. + +- bpo-36983: Add missing names to ``typing.__all__``: ``ChainMap``, + ``ForwardRef``, ``OrderedDict`` - by Anthony Sottile. + +- bpo-36972: Add SupportsIndex protocol to the typing module to allow type + checking to detect classes that can be passed to `hex()`, `oct()` and + `bin()`. + +- bpo-32972: Implement ``unittest.IsolatedAsyncioTestCase`` to help testing + asyncio-based code. + +- bpo-36952: :func:`fileinput.input` and :class:`fileinput.FileInput` + **bufsize** argument has been removed (was deprecated and ignored since + Python 3.6), and as a result the **mode** and **openhook** arguments have + been made keyword-only. + +- bpo-36952: Starting with Python 3.3, importing ABCs from + :mod:`collections` is deprecated, and import should be done from + :mod:`collections.abc`. Still being able to import from :mod:`collections` + was marked for removal in 3.8, but has been delayed to 3.9; documentation + and ``DeprecationWarning`` clarified. + +- bpo-36949: Implement __repr__ for WeakSet objects. + +- bpo-36948: Fix :exc:`NameError` in + :meth:`urllib.request.URLopener.retrieve`. Patch by Karthikeyan + Singaravelan. + +- bpo-33524: Fix the folding of email header when the max_line_length is 0 + or None and the header contains non-ascii characters. Contributed by + Licht Takeuchi (@Licht-T). + +- bpo-24564: :func:`shutil.copystat` now ignores :const:`errno.EINVAL` on + :func:`os.setxattr` which may occur when copying files on filesystems + without extended attributes support. + + Original patch by Giampaolo Rodola, updated by Ying Wang. + +- bpo-36888: Python child processes can now access the status of their + parent process using multiprocessing.process.parent_process + +- bpo-36921: Deprecate ``@coroutine`` for sake of ``async def``. + +- bpo-25652: Fix bug in ``__rmod__`` of ``UserString`` - by Batuhan Taskaya. + +- bpo-36916: Remove a message about an unhandled exception in a task when + writer.write() is used without await and writer.drain() fails with an + exception. + +- bpo-36889: Introduce :class:`asyncio.Stream` class that merges + :class:`asyncio.StreamReader` and :class:`asyncio.StreamWriter` + functionality. :class:`asyncio.Stream` can work in readonly, writeonly and + readwrite modes. Provide :func:`asyncio.connect`, + :func:`asyncio.connect_unix`, :func:`asyncio.connect_read_pipe` and + :func:`asyncio.connect_write_pipe` factories to open + :class:`asyncio.Stream` connections. Provide :class:`asyncio.StreamServer` + and :class:`UnixStreamServer` to serve servers with asyncio.Stream API. + Modify :func:`asyncio.create_subprocess_shell` and + :func:`asyncio.create_subprocess_exec` to use :class:`asyncio.Stream` + instead of deprecated :class:`StreamReader` and :class:`StreamWriter`. + Deprecate :class:`asyncio.StreamReader` and :class:`asyncio.StreamWriter`. + Deprecate usage of private classes, e.g. + :class:`asyncio.FlowControlMixing` and + :class:`asyncio.StreamReaderProtocol` outside of asyncio package. + +- bpo-36845: Added validation of integer prefixes to the construction of IP + networks and interfaces in the ipaddress module. + +- bpo-23378: Add an extend action to argparser. + +- bpo-36867: Fix a bug making a SharedMemoryManager instance and its parent + process use two separate resource_tracker processes. + +- bpo-23896: Adds a grammar to lib2to3.pygram that contains exec as a + function not as statement. + +- bpo-36895: The function ``time.clock()`` was deprecated in 3.3 in favor of + ``time.perf_counter()`` and marked for removal in 3.8, it has removed. + +- bpo-35545: Fix asyncio discarding IPv6 scopes when ensuring hostname + resolutions internally + +- bpo-36887: Add new function :func:`math.isqrt` to compute integer square + roots. + +- bpo-34632: Introduce the ``importlib.metadata`` module with (provisional) + support for reading metadata from third-party packages. + +- bpo-36878: When using `type_comments=True` in `ast.parse`, treat `# type: + ignore` followed by a non-alphanumeric character and then arbitrary text + as a type ignore, instead of requiring nothing but whitespace or another + comment. This is to permit formations such as `# type: ignore[E1000]`. + +- bpo-36778: ``cp65001`` encoding (Windows code page 65001) becomes an alias + to ``utf_8`` encoding. + +- bpo-36867: The multiprocessing.resource_tracker replaces the + multiprocessing.semaphore_tracker module. Other than semaphores, + resource_tracker also tracks shared_memory segments. + +- bpo-30262: The ``Cache`` and ``Statement`` objects of the :mod:`sqlite3` + module are not exposed to the user. Patch by Aviv Palivoda. + +- bpo-24538: In `shutil.copystat()`, first copy extended file attributes and + then file permissions, since extended attributes can only be set on the + destination while it is still writeable. + +- bpo-36829: Add new :func:`sys.unraisablehook` function which can be + overridden to control how "unraisable exceptions" are handled. It is + called when an exception has occurred but there is no way for Python to + handle it. For example, when a destructor raises an exception or during + garbage collection (:func:`gc.collect`). + +- bpo-36832: Introducing ``zipfile.Path``, a pathlib-compatible wrapper for + traversing zip files. + +- bpo-36814: Fix an issue where os.posix_spawnp() would incorrectly raise a + TypeError when file_actions is None. + +- bpo-33110: Handle exceptions raised by functions added by + concurrent.futures add_done_callback correctly when the Future has already + completed. + +- bpo-26903: Limit `max_workers` in `ProcessPoolExecutor` to 61 to work + around a WaitForMultipleObjects limitation. + +- bpo-36813: Fix :class:`~logging.handlers.QueueListener` to call + ``queue.task_done()`` upon stopping. Patch by Bar Harel. + +- bpo-36806: Forbid creation of asyncio stream objects like StreamReader, + StreamWriter, Process, and their protocols outside of asyncio package. + +- bpo-36802: Provide both sync and async calls for StreamWriter.write() and + StreamWriter.close() + +- bpo-36801: Properly handle SSL connection closing in asyncio + StreamWriter.drain() call. + +- bpo-36785: Implement PEP 574 (pickle protocol 5 with out-of-band buffers). + +- bpo-36772: functools.lru_cache() can now be used as a straight decorator + in addition to its existing usage as a function that returns a decorator. + +- bpo-6584: Add a :exc:`~gzip.BadGzipFile` exception to the :mod:`gzip` + module. + +- bpo-36748: Optimized write buffering in C implementation of + ``TextIOWrapper``. Writing ASCII string to ``TextIOWrapper`` with ascii, + latin1, or utf-8 encoding is about 20% faster. Patch by Inada Naoki. + +- bpo-8138: Don't mark ``wsgiref.simple_server.SimpleServer`` as + multi-threaded since ``wsgiref.simple_server.WSGIServer`` is + single-threaded. + +- bpo-22640: :func:`py_compile.compile` now supports silent mode. Patch by + Joannah Nanjekye + +- bpo-29183: Fix double exceptions in :class:`wsgiref.handlers.BaseHandler` + by calling its :meth:`~wsgiref.handlers.BaseHandler.close` method only + when no exception is raised. + +- bpo-36548: Improved the repr of regular expression flags. + +- bpo-36542: The signature of Python functions can now be overridden by + specifying the ``__text_signature__`` attribute. + +- bpo-36533: Reinitialize logging.Handler locks in forked child processes + instead of attempting to acquire them all in the parent before forking + only to be released in the child process. The acquire/release pattern was + leading to deadlocks in code that has implemented any form of chained + logging handlers that depend upon one another as the lock acquisition + order cannot be guaranteed. + +- bpo-35252: Throw a TypeError instead of an AssertionError when using an + invalid type annotation with singledispatch. + +- bpo-35900: Allow reduction methods to return a 6-item tuple where the 6th + item specifies a custom state-setting method that's called instead of the + regular ``__setstate__`` method. + +- bpo-35900: enable custom reduction callback registration for functions and + classes in _pickle.c, using the new Pickler's attribute + ``reducer_override`` + +- bpo-36368: Fix a bug crashing SharedMemoryManager instances in interactive + sessions after a ctrl-c (KeyboardInterrupt) was sent + +- bpo-31904: Fix mmap fail for VxWorks + +- bpo-27497: :meth:`csv.DictWriter.writeheader` now returns the return value + of the underlying :meth:`csv.Writer.writerow` method. Patch contributed by + Ashish Nitin Patil. + +- bpo-36239: Parsing .mo files now ignores comments starting and ending with + #-#-#-#-#. + +- bpo-26707: Enable plistlib to read and write binary plist files that were + created as a KeyedArchive file. Specifically, this allows the plistlib to + process 0x80 tokens as UID objects. + +- bpo-31904: Add posix module support for VxWorks. + +- bpo-35125: Asyncio: Remove inner callback on outer cancellation in shield + +- bpo-35721: Fix :meth:`asyncio.SelectorEventLoop.subprocess_exec()` leaks + file descriptors if ``Popen`` fails and called with + ``stdin=subprocess.PIPE``. Patch by Niklas Fiekas. + +- bpo-31855: :func:`unittest.mock.mock_open` results now respects the + argument of read([size]). Patch contributed by Rémi Lapeyre. + +- bpo-35431: Implement :func:`math.comb` that returns binomial coefficient, + that computes the number of ways to choose k items from n items without + repetition and without order. Patch by Yash Aggarwal and Keller Fuchs. + +- bpo-26660: Fixed permission errors in + :class:`~tempfile.TemporaryDirectory` clean up. Previously + ``TemporaryDirectory.cleanup()`` failed when non-writeable or + non-searchable files or directories were created inside a temporary + directory. + +- bpo-34271: Add debugging helpers to ssl module. It's now possible to dump + key material and to trace TLS protocol. The default and stdlib contexts + also support SSLKEYLOGFILE env var. + +- bpo-26467: Added AsyncMock to support using unittest to mock asyncio + coroutines. Patch by Lisa Roach. + +- bpo-33569: dataclasses.InitVar: Exposes the type used to create the init + var. + +- bpo-34424: Fix serialization of messages containing encoded strings when + the policy.linesep is set to a multi-character string. Patch by Jens + Troeger. + +- bpo-34303: Performance of :func:`functools.reduce` is slightly improved. + Patch by Sergey Fedoseev. + +- bpo-33361: Fix a bug in :class:`codecs.StreamRecoder` where seeking might + leave old data in a buffer and break subsequent read calls. Patch by Ammar + Askar. + +- bpo-22454: The :mod:`shlex` module now exposes :func:`shlex.join`, the + inverse of :func:`shlex.split`. Patch by Bo Bayles. + +- bpo-31922: :meth:`asyncio.AbstractEventLoop.create_datagram_endpoint`: Do + not connect UDP socket when broadcast is allowed. This allows to receive + replies after a UDP broadcast. + +- bpo-24882: Change ThreadPoolExecutor to use existing idle threads before + spinning up new ones. + +- bpo-31961: Added support for bytes and path-like objects in + :func:`subprocess.Popen` on Windows. The *args* parameter now accepts a + :term:`path-like object` if *shell* is ``False`` and a sequence containing + bytes and path-like objects. The *executable* parameter now accepts a + bytes and :term:`path-like object`. The *cwd* parameter now accepts a + bytes object. Based on patch by Anders Lorentsen. + +- bpo-33123: :class:`pathlib.Path.unlink` now accepts a *missing_ok* + parameter to avoid a :exc:`FileNotFoundError` from being raised. Patch by + Robert Buchholz. + +- bpo-32941: Allow :class:`mmap.mmap` objects to access the madvise() system + call (through :meth:`mmap.mmap.madvise`). + +- bpo-22102: Added support for ZIP files with disks set to 0. Such files are + commonly created by builtin tools on Windows when use ZIP64 extension. + Patch by Francisco Facioni. + +- bpo-32515: trace.py can now run modules via python3 -m trace -t --module + module_name + +- bpo-32299: Changed :func:`unittest.mock.patch.dict` to return the patched + dictionary when used as context manager. Patch by Vadim Tsander. + +- bpo-27141: Added a ``__copy__()`` to ``collections.UserList`` and + ``collections.UserDict`` in order to correctly implement shallow copying + of the objects. Patch by Bar Harel. + +- bpo-31829: ``\r``, ``\0`` and ``\x1a`` (end-of-file on Windows) are now + escaped in protocol 0 pickles of Unicode strings. This allows to load them + without loss from files open in text mode in Python 2. + +- bpo-23395: ``_thread.interrupt_main()`` now avoids setting the Python + error status if the ``SIGINT`` signal is ignored or not handled by Python. + +Documentation +------------- + +- bpo-36896: Clarify that some types have unstable constructor signature + between Python versions. + +- bpo-36686: Improve documentation of the stdin, stdout, and stderr + arguments of the ``asyncio.subprocess_exec`` function to specify which + values are supported. Also mention that decoding as text is not supported. + + Add a few tests to verify that the various values passed to the std* + arguments actually work. + +- bpo-36984: Improve version added references in ``typing`` module - by + Anthony Sottile. + +- bpo-36868: What's new now mentions SSLContext.hostname_checks_common_name + instead of SSLContext.host_flags. + +- bpo-35924: Add a note to the ``curses.addstr()`` documentation to warn + that multiline strings can cause segfaults because of an ncurses bug. + +- bpo-36783: Added C API Documentation for Time_FromTimeAndFold and + PyDateTime_FromDateAndTimeAndFold as per PEP 495. Patch by Edison + Abahurire. + +- bpo-36797: More of the legacy distutils documentation has been either + pruned, or else more clearly marked as being retained solely until the + setuptools documentation covers it independently. + +- bpo-22865: Add detail to the documentation on the `pty.spawn` function. + +- bpo-35397: Remove deprecation and document urllib.parse.unwrap(). Patch + contributed by Rémi Lapeyre. + +- bpo-32995: Added the context variable in glossary. + +- bpo-33519: Clarify that `copy()` is not part of the `MutableSequence` ABC. + +- bpo-33482: Make `codecs.StreamRecoder.writelines` take a list of bytes. + +- bpo-25735: Added documentation for func factorial to indicate that returns + integer values + +- bpo-20285: Expand object.__doc__ (docstring) to make it clearer. Modify + pydoc.py so that help(object) lists object methods (for other classes, + help omits methods of the object base class.) + +Tests +----- + +- bpo-37069: Modify test_coroutines, test_cprofile, test_generators, + test_raise, test_ssl and test_yield_from to use + :func:`test.support.catch_unraisable_exception` rather than + :func:`test.support.captured_stderr`. + +- bpo-37098: Fix test_memfd_create on older Linux Kernels. + +- bpo-37081: Test with OpenSSL 1.1.1c + +- bpo-36829: Add :func:`test.support.catch_unraisable_exception`: context + manager catching unraisable exception using :func:`sys.unraisablehook`. + +- bpo-36915: The main regrtest process now always removes all temporary + directories of worker processes even if they crash or if they are killed + on KeyboardInterrupt (CTRL+c). + +- bpo-36719: "python3 -m test -jN ..." now continues the execution of next + tests when a worker process crash (CHILD_ERROR state). Previously, the + test suite stopped immediately. Use --failfast to stop at the first error. + +- bpo-36816: Update Lib/test/selfsigned_pythontestdotnet.pem to match + self-signed.pythontest.net's new TLS certificate. + +- bpo-35925: Skip httplib and nntplib networking tests when they would + otherwise fail due to a modern OS or distro with a default OpenSSL policy + of rejecting connections to servers with weak certificates. + +- bpo-36782: Add tests for several C API functions in the :mod:`datetime` + module. Patch by Edison Abahurire. + +- bpo-36342: Fix test_multiprocessing in test_venv if platform lacks + functioning sem_open. + +Build +----- + +- bpo-36721: To embed Python into an application, a new ``--embed`` option + must be passed to ``python3-config --libs --embed`` to get ``-lpython3.8`` + (link the application to libpython). To support both 3.8 and older, try + ``python3-config --libs --embed`` first and fallback to ``python3-config + --libs`` (without ``--embed``) if the previous command fails. + + Add a pkg-config ``python-3.8-embed`` module to embed Python into an + application: ``pkg-config python-3.8-embed --libs`` includes + ``-lpython3.8``. To support both 3.8 and older, try ``pkg-config + python-X.Y-embed --libs`` first and fallback to ``pkg-config python-X.Y + --libs`` (without ``--embed``) if the previous command fails (replace + ``X.Y`` with the Python version). + + On the other hand, ``pkg-config python3.8 --libs`` no longer contains + ``-lpython3.8``. C extensions must not be linked to libpython (except on + Android, case handled by the script); this change is backward incompatible + on purpose. + +- bpo-36786: "make install" now runs compileall in parallel. + +Windows +------- + +- bpo-36965: include of STATUS_CONTROL_C_EXIT without depending on MSC + compiler + +- bpo-35926: Update to OpenSSL 1.1.1b for Windows. + +- bpo-29883: Add Windows support for UDP transports for the Proactor Event + Loop. Patch by Adam Meily. + +- bpo-33407: The :c:macro:`Py_DEPRECATED()` macro has been implemented for + MSVC. + +macOS +----- + +- bpo-36231: Support building Python on macOS without /usr/include + installed. As of macOS 10.14, system header files are only available + within an SDK provided by either the Command Line Tools or the Xcode app. + +IDLE +---- + +- bpo-35610: Replace now redundant .context_use_ps1 with .prompt_last_line. + This finishes change started in bpo-31858. + +- bpo-37038: Make idlelib.run runnable; add test clause. + +- bpo-36958: Print any argument other than None or int passed to SystemExit + or sys.exit(). + +- bpo-36807: When saving a file, call os.fsync() so bits are flushed to e.g. + USB drive. + +- bpo-32411: In browser.py, remove extraneous sorting by line number since + dictionary was created in line number order. + +Tools/Demos +----------- + +- bpo-37053: Handle strings like u"bar" correctly in + Tools/parser/unparse.py. Patch by Chih-Hsuan Yen. + +C API +----- + +- bpo-36763: Implement the :pep:`587` "Python Initialization Configuration". + +- bpo-36379: Fix crashes when attempting to use the *modulo* parameter when + ``__ipow__`` is implemented in C. + +- bpo-37107: Update :c:func:`PyObject_CallMethodObjArgs` and + ``_PyObject_CallMethodIdObjArgs`` to use ``_PyObject_GetMethod`` to avoid + creating a bound method object in many cases. Patch by Michael J. + Sullivan. + +- bpo-36974: Implement :pep:`590`: Vectorcall: a fast calling protocol for + CPython. This is a new protocol to optimize calls of custom callable + objects. + +- bpo-36763: ``Py_Main()`` now returns the exitcode rather than calling + ``Py_Exit(exitcode)`` when calling ``PyErr_Print()`` if the current + exception type is ``SystemExit``. + +- bpo-36922: Add new type flag ``Py_TPFLAGS_METHOD_DESCRIPTOR`` for objects + behaving like unbound methods. These are objects supporting the + optimization given by the ``LOAD_METHOD``/``CALL_METHOD`` opcodes. See PEP + 590. + +- bpo-36728: The :c:func:`PyEval_ReInitThreads` function has been removed + from the C API. It should not be called explicitly: use + :c:func:`PyOS_AfterFork_Child` instead. + + +What's New in Python 3.8.0 alpha 4? +=================================== + +*Release date: 2019-05-06* + +Security +-------- + +- bpo-36742: Fixes mishandling of pre-normalization characters in + urlsplit(). + +- bpo-30458: Address CVE-2019-9740 by disallowing URL paths with embedded + whitespace or control characters through into the underlying http client + request. Such potentially malicious header injection URLs now cause an + http.client.InvalidURL exception to be raised. + +- bpo-35755: :func:`shutil.which` now uses ``os.confstr("CS_PATH")`` if + available and if the :envvar:`PATH` environment variable is not set. + Remove also the current directory from :data:`posixpath.defpath`. On Unix, + :func:`shutil.which` and the :mod:`subprocess` module no longer search the + executable in the current directory if the :envvar:`PATH` environment + variable is not set. + +Core and Builtins +----------------- + +- bpo-36722: In debug build, import now also looks for C extensions compiled + in release mode and for C extensions compiled in the stable ABI. + +- bpo-32849: Fix Python Initialization code on FreeBSD to detect properly + when stdin file descriptor (fd 0) is invalid. + +- bpo-36623: Remove parser headers and related function declarations that + lack implementations after the removal of pgen. + +- bpo-20180: ``dict.pop()`` is now up to 33% faster thanks to Argument + Clinic. Patch by Inada Naoki. + +- bpo-36611: Debug memory allocators: disable serialno field by default from + debug hooks on Python memory allocators to reduce the memory footprint by + 5%. Enable :mod:`tracemalloc` to get the traceback where a memory block + has been allocated when a fatal memory error is logged to decide where to + put a breakpoint. Compile Python with ``PYMEM_DEBUG_SERIALNO`` defined to + get back the field. + +- bpo-36588: On AIX, :attr:`sys.platform` doesn't contain the major version + anymore. Always return ``'aix'``, instead of ``'aix3'`` .. ``'aix7'``. + Since older Python versions include the version number, it is recommended + to always use ``sys.platform.startswith('aix')``. Contributed by M. Felt. + +- bpo-36549: Change str.capitalize to use titlecase for the first character + instead of uppercase. + +- bpo-36540: Implement :pep:`570` (Python positional-only parameters). Patch + by Pablo Galindo. + +- bpo-36475: :c:func:`PyEval_AcquireLock` and :c:func:`PyEval_AcquireThread` + now terminate the current thread if called while the interpreter is + finalizing, making them consistent with :c:func:`PyEval_RestoreThread`, + :c:func:`Py_END_ALLOW_THREADS`, and :c:func:`PyGILState_Ensure`. + +- bpo-36504: Fix signed integer overflow in _ctypes.c's + ``PyCArrayType_new()``. + +- bpo-20844: Fix running script with encoding cookie and LF line ending may + fail on Windows. + +- bpo-24214: Fixed support of the surrogatepass error handler in the UTF-8 + incremental decoder. + +- bpo-36452: Changing ``dict`` keys during iteration of the dict itself, + ``keys()``, ``values()``, or ``items()`` will now be detected in certain + corner cases where keys are deleted/added so that the number of keys isn't + changed. A `RuntimeError` will be raised after ``len(dict)`` iterations. + Contributed by Thomas Perl. + +- bpo-36459: Fix a possible double ``PyMem_FREE()`` due to tokenizer.c's + ``tok_nextc()``. + +- bpo-36433: Fixed TypeError message in classmethoddescr_call. + +- bpo-36430: Fix a possible reference leak in :func:`itertools.count`. + +- bpo-36440: Include node names in ``ParserError`` messages, instead of + numeric IDs. Patch by A. Skrobov. + +- bpo-36143: Regenerate :mod:`keyword` from the Grammar and Tokens file + using pgen. Patch by Pablo Galindo. + +- bpo-18372: Add missing :c:func:`PyObject_GC_Track` calls in the + :mod:`pickle` module. Patch by Zackery Spytz. + +Library +------- + +- bpo-35952: Fix pythoninfo when the compiler is missing. + +- bpo-28238: The ``.find*()`` methods of xml.etree.ElementTree can now + search for wildcards like ``{*}tag`` and ``{ns}*`` that match a tag in any + namespace or all tags in a namespace. Patch by Stefan Behnel. + +- bpo-26978: `pathlib.path.link_to()` is now implemented. It creates a hard + link pointing to a path. + +- bpo-1613500: :class:`fileinput.FileInput` now uses the input file mode to + correctly set the output file mode (previously it was hardcoded to + ``'w'``) when ``inplace=True`` is passed to its constructor. + +- bpo-36734: Fix compilation of ``faulthandler.c`` on HP-UX. Initialize + ``stack_t current_stack`` to zero using ``memset()``. + +- bpo-13611: The xml.etree.ElementTree packages gained support for C14N 2.0 + serialisation. Patch by Stefan Behnel. + +- bpo-36669: Add missing matrix multiplication operator support to + weakref.proxy. + +- bpo-36676: The XMLParser() in xml.etree.ElementTree provides namespace + prefix context to the parser target if it defines the callback methods + "start_ns()" and/or "end_ns()". Patch by Stefan Behnel. + +- bpo-36673: The TreeBuilder and XMLPullParser in xml.etree.ElementTree + gained support for parsing comments and processing instructions. Patch by + Stefan Behnel. + +- bpo-36650: The C version of functools.lru_cache() was treating calls with + an empty ``**kwargs`` dictionary as being distinct from calls with no + keywords at all. This did not result in an incorrect answer, but it did + trigger an unexpected cache miss. + +- bpo-28552: Fix :mod:`distutils.sysconfig` if :data:`sys.executable` is + ``None`` or an empty string: use :func:`os.getcwd` to initialize + ``project_base``. Fix also the distutils build command: don't use + :data:`sys.executable` if it is ``None`` or an empty string. + +- bpo-35755: :func:`shutil.which` and + :func:`distutils.spawn.find_executable` now use ``os.confstr("CS_PATH")`` + if available instead of :data:`os.defpath`, if the ``PATH`` environment + variable is not set. Moreover, don't use ``os.confstr("CS_PATH")`` nor + :data:`os.defpath` if the ``PATH`` environment variable is set to an empty + string. + +- bpo-25430: improve performance of ``IPNetwork.__contains__()`` + +- bpo-30485: Path expressions in xml.etree.ElementTree can now avoid + explicit namespace prefixes for tags (or the "{namespace}tag" notation) by + passing a default namespace with an empty string prefix. + +- bpo-36613: Fix :mod:`asyncio` wait() not removing callback if exception + +- bpo-36598: Fix ``isinstance`` check for Mock objects with spec when the + code is executed under tracing. Patch by Karthikeyan Singaravelan. + +- bpo-18748: In development mode (:option:`-X` ``dev``) and in debug build, + the :class:`io.IOBase` destructor now logs ``close()`` exceptions. These + exceptions are silent by default in release mode. + +- bpo-36575: The ``_lsprof`` module now uses internal timer same to + ``time.perf_counter()`` by default. ``gettimeofday(2)`` was used on Unix. + New timer has better resolution on most Unix platforms and timings are no + longer impacted by system clock updates since ``perf_counter()`` is + monotonic. Patch by Inada Naoki. + +- bpo-33461: ``json.loads`` now emits ``DeprecationWarning`` when + ``encoding`` option is specified. Patch by Matthias Bussonnier. + +- bpo-36559: The random module now prefers the lean internal _sha512 module + over hashlib for seed(version=2) to optimize import time. + +- bpo-17561: Set backlog=None as the default for socket.create_server. + +- bpo-34373: Fix :func:`time.mktime` error handling on AIX for year before + 1970. + +- bpo-36232: Improve error message when trying to open existing DBM database + that actually doesn't exist. Patch by Marco Rougeth. + +- bpo-36546: Add statistics.quantiles() + +- bpo-36050: Optimized ``http.client.HTTPResponse.read()`` for large + response. Patch by Inada Naoki. + +- bpo-36522: If *debuglevel* is set to >0 in :mod:`http.client`, print all + values for headers with multiple values for the same header name. Patch by + Matt Houglum. + +- bpo-36492: Deprecated passing required arguments like *func* as keyword + arguments in functions which should accept arbitrary keyword arguments and + pass them to other function. Arbitrary keyword arguments (even with names + "self" and "func") can now be passed to these functions if the required + arguments are passed as positional arguments. + +- bpo-27181: Add statistics.geometric_mean(). + +- bpo-30427: ``os.path.normcase()`` relies on ``os.fspath()`` to check the + type of its argument. Redundant checks have been removed from its + ``posixpath.normcase()`` and ``ntpath.normcase()`` implementations. Patch + by Wolfgang Maier. + +- bpo-36385: Stop rejecting IPv4 octets for being ambiguously octal. Leading + zeros are ignored, and no longer are assumed to specify octal octets. + Octets are always decimal numbers. Octets must still be no more than three + digits, including leading zeroes. + +- bpo-36434: Errors during writing to a ZIP file no longer prevent to + properly close it. + +- bpo-36407: Fixed wrong indentation writing for CDATA section in + xml.dom.minidom. Patch by Vladimir Surjaninov. + +- bpo-36326: inspect.getdoc() can now find docstrings for member objects + when __slots__ is a dictionary. + +- bpo-36366: Calling ``stop()`` on an unstarted or stopped + :func:`unittest.mock.patch` object will now return `None` instead of + raising :exc:`RuntimeError`, making the method idempotent. Patch by + Karthikeyan Singaravelan. + +- bpo-36348: The :meth:`imap.IMAP4.logout` method no longer ignores silently + arbitrary exceptions. + +- bpo-31904: Add time module support and fix test_time faiures for VxWorks. + +- bpo-36227: Added support for keyword arguments `default_namespace` and + `xml_declaration` in functions ElementTree.tostring() and + ElementTree.tostringlist(). + +- bpo-36004: Added new alternate constructors + :meth:`datetime.date.fromisocalendar` and + :meth:`datetime.datetime.fromisocalendar`, which construct date objects + from ISO year, week number and weekday; these are the inverse of each + class's ``isocalendar`` method. Patch by Paul Ganssle. + +- bpo-35936: :mod:`modulefinder` no longer depends on the deprecated + :mod:`imp` module, and the initializer for + :class:`modulefinder.ModuleFinder` now has immutable default arguments. + Patch by Brandt Bucher. + +- bpo-35376: :mod:`modulefinder` correctly handles modules that have the + same name as a bad package. Patch by Brandt Bucher. + +- bpo-17396: :mod:`modulefinder` no longer crashes when encountering syntax + errors in followed imports. Patch by Brandt Bucher. + +- bpo-35934: Added :meth:`~socket.create_server()` and + :meth:`~socket.has_dualstack_ipv6()` convenience functions to automate the + necessary tasks usually involved when creating a server socket, including + accepting both IPv4 and IPv6 connections on the same socket. (Contributed + by Giampaolo Rodola in :issue:`17561`.) + +- bpo-23078: Add support for :func:`classmethod` and :func:`staticmethod` to + :func:`unittest.mock.create_autospec`. Initial patch by Felipe Ochoa. + +- bpo-35416: Fix potential resource warnings in distutils. Patch by Mickaël + Schoentgen. + +- bpo-25451: Add transparency methods to :class:`tkinter.PhotoImage`. Patch + by Zackery Spytz. + +- bpo-35082: Don't return deleted attributes when calling dir on a + :class:`unittest.mock.Mock`. + +- bpo-34547: :class:`wsgiref.handlers.BaseHandler` now handles abrupt client + connection terminations gracefully. Patch by Petter Strandmark. + +- bpo-31658: :func:`xml.sax.parse` now supports :term:`path-like `. Patch by Mickaël Schoentgen. + +- bpo-34139: Remove stale unix datagram socket before binding + +- bpo-33530: Implemented Happy Eyeballs in `asyncio.create_connection()`. + Added two new arguments, *happy_eyeballs_delay* and *interleave*, to + specify Happy Eyeballs behavior. + +- bpo-33291: Do not raise AttributeError when calling the inspect functions + isgeneratorfunction, iscoroutinefunction, isasyncgenfunction on a method + created from an arbitrary callable. Instead, return False. + +- bpo-31310: Fix the multiprocessing.semaphore_tracker so it is reused by + child processes + +- bpo-31292: Fix ``setup.py check --restructuredtext`` for files containing + ``include`` directives. + +Documentation +------------- + +- bpo-36625: Remove obsolete comments from docstrings in fractions.Fraction + +- bpo-30840: Document relative imports + +- bpo-36523: Add docstring for io.IOBase.writelines(). + +- bpo-36425: New documentation translation: `Simplified Chinese + `_. + +- bpo-36345: Avoid the duplication of code from ``Tools/scripts/serve.py`` + in using the :rst:dir:`literalinclude` directive for the basic + wsgiref-based web server in the documentation of :mod:`wsgiref`. + Contributed by Stéphane Wirtel. + +- bpo-36345: Using the code of the ``Tools/scripts/serve.py`` script as an + example in the :mod:`wsgiref` documentation. Contributed by Stéphane + Wirtel. + +- bpo-36157: Added Documention for PyInterpreterState_Main(). + +- bpo-33043: Updates the docs.python.org page with the addition of a + 'Contributing to Docs' link at the end of the page (between 'Reporting + Bugs' and 'About Documentation'). Updates the 'Found a Bug' page with + additional links and information in the Documentation Bugs section. + +- bpo-35581: @typing.type_check_only now allows type stubs to mark functions + and classes not available during runtime. + +- bpo-33832: Add glossary entry for 'magic method'. + +- bpo-32913: Added re.Match.groupdict example to regex HOWTO. + +Tests +----- + +- bpo-36719: regrtest now always detects uncollectable objects. Previously, + the check was only enabled by ``--findleaks``. The check now also works + with ``-jN/--multiprocess N``. ``--findleaks`` becomes a deprecated alias + to ``--fail-env-changed``. + +- bpo-36725: When using multiprocessing mode (-jN), regrtest now better + reports errors if a worker process fails, and it exits immediately on a + worker thread failure or when interrupted. + +- bpo-36454: Change test_time.test_monotonic() to test only the lower bound + of elapsed time after a sleep command rather than the upper bound. This + prevents unnecessary test failures on slow buildbots. Patch by Victor + Stinner. + +- bpo-32424: Improve test coverage for xml.etree.ElementTree. Patch by + Gordon P. Hemsley. + +- bpo-32424: Fix typo in test_cyclic_gc() test for xml.etree.ElementTree. + Patch by Gordon P. Hemsley. + +- bpo-36635: Add a new :mod:`_testinternalcapi` module to test the internal + C API. + +- bpo-36629: Fix ``test_imap4_host_default_value()`` of ``test_imaplib``: + catch also :data:`errno.ENETUNREACH` error. + +- bpo-36611: Fix ``test_sys.test_getallocatedblocks()`` when + :mod:`tracemalloc` is enabled. + +- bpo-36560: Fix reference leak hunting in regrtest: compute also deltas (of + reference count, allocated memory blocks, file descriptor count) during + warmup, to ensure that everything is initialized before starting to hunt + reference leaks. + +- bpo-36565: Fix reference hunting (``python3 -m test -R 3:3``) when Python + has no built-in abc module. + +- bpo-31904: Port test_resource to VxWorks: skip tests cases setting + RLIMIT_FSIZE and RLIMIT_CPU. + +- bpo-31904: Fix test_tabnanny on VxWorks: adjust ENOENT error message. + +- bpo-36436: Fix ``_testcapi.pymem_buffer_overflow()``: handle memory + allocation failure. + +- bpo-31904: Fix test_utf8_mode on VxWorks: Python always use UTF-8 on + VxWorks. + +- bpo-36341: Fix tests that may fail with PermissionError upon calling + bind() on AF_UNIX sockets. + +Build +----- + +- bpo-36747: Remove the stale scriptsinstall Makefile target. + +- bpo-21536: On Unix, C extensions are no longer linked to libpython except + on Android and Cygwin. + + It is now possible for a statically linked Python to load a C extension + built using a shared library Python. + + When Python is embedded, ``libpython`` must not be loaded with + ``RTLD_LOCAL``, but ``RTLD_GLOBAL`` instead. Previously, using + ``RTLD_LOCAL``, it was already not possible to load C extensions which + were not linked to ``libpython``, such as C extensions of the standard + library built by the ``*shared*`` section of ``Modules/Setup``. + + distutils, python-config and python-config.py have been modified. + +- bpo-36707: ``./configure --with-pymalloc`` no longer adds the ``m`` flag + to SOABI (sys.implementation.cache_tag). Enabling or disabling pymalloc + has no impact on the ABI. + +- bpo-36635: Change ``PyAPI_FUNC(type)``, ``PyAPI_DATA(type)`` and + ``PyMODINIT_FUNC`` macros of ``pyport.h`` when ``Py_BUILD_CORE_MODULE`` is + defined. The ``Py_BUILD_CORE_MODULE`` define must be now be used to build + a C extension as a dynamic library accessing Python internals: export the + PyInit_xxx() function in DLL exports on Windows. + +- bpo-31904: Don't build the ``_crypt`` extension on VxWorks. + +- bpo-36618: Add ``-fmax-type-align=8`` to CFLAGS when clang compiler is + detected. The pymalloc memory allocator aligns memory on 8 bytes. On + x86-64, clang expects alignment on 16 bytes by default and so uses MOVAPS + instruction which can lead to segmentation fault. Instruct clang that + Python is limited to alignment on 8 bytes to use MOVUPS instruction + instead: slower but don't trigger a SIGSEGV if the memory is not aligned + on 16 bytes. Sadly, the flag must be added to ``CFLAGS`` and not just + ``CFLAGS_NODIST``, since third party C extensions can have the same issue. + +- bpo-36605: ``make tags`` and ``make TAGS`` now also parse + ``Modules/_io/*.c`` and ``Modules/_io/*.h``. + +- bpo-36465: Release builds and debug builds are now ABI compatible: + defining the ``Py_DEBUG`` macro no longer implies the ``Py_TRACE_REFS`` + macro, which introduces the only ABI incompatibility. The + ``Py_TRACE_REFS`` macro, which adds the :func:`sys.getobjects` function + and the :envvar:`PYTHONDUMPREFS` environment variable, can be set using + the new ``./configure --with-trace-refs`` build option. + +- bpo-36577: setup.py now correctly reports missing OpenSSL headers and + libraries again. + +- bpo-36544: Fix regression introduced in bpo-36146 refactoring setup.py + +- bpo-36508: ``python-config --ldflags`` no longer includes flags of the + ``LINKFORSHARED`` variable. The ``LINKFORSHARED`` variable must only be + used to build executables. + +- bpo-36503: Remove references to "aix3" and "aix4". Patch by M. Felt. + +Windows +------- + +- bpo-35920: Added platform.win32_edition() and platform.win32_is_iot(). + Added support for cross-compiling packages for Windows ARM32. Skip tests + that are not expected to work on Windows IoT Core ARM32. + +- bpo-36649: Remove trailing spaces for registry keys when installed via the + Store. + +- bpo-34144: Fixed activate.bat to correctly update codepage when chcp.com + returns dots in output. Patch by Lorenz Mende. + +- bpo-36509: Added preset-iot layout for Windows IoT ARM containers. This + layout doesn't contain UI components like tkinter or IDLE. It also doesn't + contain files to support on-target builds since Windows ARM32 builds must + be cross-compiled when using MSVC. + +- bpo-35941: enum_certificates function of the ssl module now returns + certificates from all available certificate stores inside windows in a + query instead of returning only certificates from the system wide + certificate store. This includes certificates from these certificate + stores: local machine, local machine enterprise, local machine group + policy, current user, current user group policy, services, users. + ssl.enum_crls() function is changed in the same way to return all + certificate revocation lists inside the windows certificate revocation + list stores. + +- bpo-36441: Fixes creating a venv when debug binaries are installed. + +- bpo-36085: Enable better DLL resolution on Windows by using safe DLL + search paths and adding :func:`os.add_dll_directory`. + +- bpo-36010: Add the venv standard library module to the nuget distribution + for Windows. + +- bpo-29515: Add the following socket module constants on Windows: + IPPROTO_AH IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_ESP + IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_HOPOPTS IPPROTO_ICLFXBM + IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGMP IPPROTO_IGP IPPROTO_IPV4 + IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_ND IPPROTO_NONE IPPROTO_PGM + IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_SCTP + IPPROTO_ST + +- bpo-35947: Added current version of libffi to cpython-source-deps. Change + _ctypes to use current version of libffi on Windows. + +- bpo-34060: Report system load when running test suite on Windows. Patch by + Ammar Askar. Based on prior work by Jeremy Kloth. + +- bpo-31512: With the Windows 10 Creators Update, non-elevated users can now + create symlinks as long as the computer has Developer Mode enabled. + +macOS +----- + +- bpo-34602: Avoid failures setting macOS stack resource limit with + resource.setrlimit. This reverts an earlier fix for bpo-18075 which forced + a non-default stack size when building the interpreter executable on + macOS. + +IDLE +---- + +- bpo-36429: Fix starting IDLE with pyshell. Add idlelib.pyshell alias at + top; remove pyshell alias at bottom. Remove obsolete __name__=='__main__' + command. + +Tools/Demos +----------- + +- bpo-14546: Fix the argument handling in Tools/scripts/lll.py. + +C API +----- + +- bpo-36763: Fix memory leak in :c:func:`Py_SetStandardStreamEncoding`: + release memory if the function is called twice. + +- bpo-36641: :c:macro:`PyDoc_VAR(name)` and + :c:macro:`PyDoc_STRVAR(name,str)` now create ``static const char name[]`` + instead of ``static char name[]``. Patch by Inada Naoki. + +- bpo-36389: Change the value of ``CLEANBYTE``, ``DEADDYTE`` and + ``FORBIDDENBYTE`` internal constants used by debug hooks on Python memory + allocators (:c:func:`PyMem_SetupDebugHooks` function). Byte patterns + ``0xCB``, ``0xDB`` and ``0xFB`` have been replaced with ``0xCD``, ``0xDD`` + and ``0xFD`` to use the same values than Windows CRT debug ``malloc()`` + and ``free()``. + +- bpo-36443: Since Python 3.7.0, calling :c:func:`Py_DecodeLocale` before + :c:func:`Py_Initialize` produces mojibake if the ``LC_CTYPE`` locale is + coerced and/or if the UTF-8 Mode is enabled by the user configuration. The + LC_CTYPE coercion and UTF-8 Mode are now disabled by default to fix the + mojibake issue. They must now be enabled explicitly (opt-in) using the new + :c:func:`_Py_PreInitialize` API with ``_PyPreConfig``. + +- bpo-36025: Fixed an accidental change to the datetime C API where the + arguments to the :c:func:`PyDate_FromTimestamp` function were incorrectly + interpreted as a single timestamp rather than an arguments tuple, which + causes existing code to start raising :exc:`TypeError`. The + backwards-incompatible change was only present in alpha releases of Python + 3.8. Patch by Paul Ganssle. + +- bpo-35810: Modify ``PyObject_Init`` to correctly increase the refcount of + heap- allocated Type objects. Also fix the refcounts of the heap-allocated + types that were either doing this manually or not decreasing the type's + refcount in tp_dealloc + + +What's New in Python 3.8.0 alpha 3? +=================================== + +*Release date: 2019-03-25* + +Security +-------- + +- bpo-36216: Changes urlsplit() to raise ValueError when the URL contains + characters that decompose under IDNA encoding (NFKC-normalization) into + characters that affect how the URL is parsed. + +- bpo-35121: Don't send cookies of domain A without Domain attribute to + domain B when domain A is a suffix match of domain B while using a + cookiejar with :class:`http.cookiejar.DefaultCookiePolicy` policy. Patch + by Karthikeyan Singaravelan. + +Core and Builtins +----------------- + +- bpo-36421: Fix a possible double decref in _ctypes.c's + ``PyCArrayType_new()``. + +- bpo-36412: Fix a possible crash when creating a new dictionary. + +- bpo-36398: Fix a possible crash in ``structseq_repr()``. + +- bpo-36256: Fix bug in parsermodule when parsing a state in a DFA that has + two or more arcs with labels of the same type. Patch by Pablo Galindo. + +- bpo-36365: repr(structseq) is no longer limited to 512 bytes. + +- bpo-36374: Fix a possible null pointer dereference in + ``merge_consts_recursive()``. Patch by Zackery Spytz. + +- bpo-36236: At Python initialization, the current directory is no longer + prepended to :data:`sys.path` if it has been removed. + +- bpo-36352: Python initialization now fails with an error, rather than + silently truncating paths, if a path is too long. + +- bpo-36301: Python initialization now fails if decoding ``pybuilddir.txt`` + configuration file fails at startup. + +- bpo-36333: Fix leak in _PyRuntimeState_Fini. Contributed by Stéphane + Wirtel. + +- bpo-36332: The builtin :func:`compile` can now handle AST objects that + contain assignment expressions. Patch by Pablo Galindo. + +- bpo-36282: Improved error message for too much positional arguments in + some builtin functions. + +- bpo-30040: New empty dict uses fewer memory for now. It used more memory + than empty dict created by ``dict.clear()``. And empty dict creation and + deletion is about 2x faster. Patch by Inada Naoki. + +- bpo-36262: Fix an unlikely memory leak on conversion from string to float + in the function ``_Py_dg_strtod()`` used by ``float(str)``, + ``complex(str)``, :func:`pickle.load`, :func:`marshal.load`, etc. + +- bpo-36252: Update Unicode databases to version 12.0.0. + +- bpo-36218: Fix a segfault occurring when sorting a list of heterogeneous + values. Patch contributed by Rémi Lapeyre and Elliot Gorokhovsky. + +- bpo-36188: Cleaned up left-over vestiges of Python 2 unbound method + handling in method objects and documentation. Patch by Martijn Pieters + +- bpo-36124: Add a new interpreter-specific dict and expose it in the C-API + via PyInterpreterState_GetDict(). This parallels PyThreadState_GetDict(). + However, extension modules should continue using PyModule_GetState() for + their own internal per-interpreter state. + +- bpo-35975: Add a ``feature_version`` flag to ``ast.parse()`` (documented) + and ``compile()`` (hidden) that allows tweaking the parser to support + older versions of the grammar. In particular, if ``feature_version`` is 5 + or 6, the hacks for the ``async`` and ``await`` keyword from PEP 492 are + reinstated. (For 7 or higher, these are unconditionally treated as + keywords, but they are still special tokens rather than ``NAME`` tokens + that the parser driver recognizes.) + +- bpo-31904: Use UTF-8 as the system encoding on VxWorks. + +- bpo-36048: The :meth:`~object.__index__` special method will be used + instead of :meth:`~object.__int__` for implicit conversion of Python + numbers to C integers. Using the ``__int__()`` method in implicit + conversions has been deprecated. + +- bpo-35808: Retire pgen and use a modified version of pgen2 to generate the + parser. Patch by Pablo Galindo. + +Library +------- + +- bpo-36401: The class documentation created by pydoc now has a separate + section for readonly properties. + +- bpo-36320: The typing.NamedTuple() class has deprecated the _field_types + attribute in favor of the __annotations__ attribute which carried the same + information. Also, both attributes were converted from OrderedDict to a + regular dict. + +- bpo-34745: Fix :mod:`asyncio` ssl memory issues caused by circular + references + +- bpo-36324: Add method to statistics.NormalDist for computing the inverse + cumulative normal distribution. + +- bpo-36321: collections.namedtuple() misspelled the name of an attribute. + To be consistent with typing.NamedTuple, the attribute name should have + been "_field_defaults" instead of "_fields_defaults". For backwards + compatibility, both spellings are now created. The misspelled version may + be removed in the future. + +- bpo-36297: "unicode_internal" codec is removed. It was deprecated since + Python 3.3. Patch by Inada Naoki. + +- bpo-36298: Raise ModuleNotFoundError in pyclbr when a module can't be + found. Thanks to 'mental' for the bug report. + +- bpo-36268: Switch the default format used for writing tars with + mod:`tarfile` to the modern POSIX.1-2001 pax standard, from the + vendor-specific GNU. Contributed by C.A.M. Gerlach. + +- bpo-36285: Fix integer overflows in the array module. Patch by Stephan + Hohe. + +- bpo-31904: Add _signal module support for VxWorks. + +- bpo-36272: :mod:`logging` does not silently ignore RecursionError anymore. + Patch contributed by Rémi Lapeyre. + +- bpo-36280: Add a kind field to ast.Constant. It is 'u' if the literal has + a 'u' prefix (i.e. a Python 2 style unicode literal), else None. + +- bpo-35931: The :mod:`pdb` ``debug`` command now gracefully handles all + exceptions. + +- bpo-36251: Fix format strings used for stderrprinter and re.Match reprs. + Patch by Stephan Hohe. + +- bpo-36235: Fix ``CFLAGS`` in ``customize_compiler()`` of + ``distutils.sysconfig``: when the ``CFLAGS`` environment variable is + defined, don't override ``CFLAGS`` variable with the ``OPT`` variable + anymore. Initial patch written by David Malcolm. + +- bpo-35807: Update ensurepip to install pip 19.0.3 and setuptools 40.8.0. + +- bpo-36139: Release GIL when closing :class:`~mmap.mmap` objects. + +- bpo-36179: Fix two unlikely reference leaks in _hashopenssl. The leaks + only occur in out-of-memory cases. + +- bpo-36169: Add overlap() method to statistics.NormalDist. Computes the + overlapping coefficient for two normal distributions. + +- bpo-36103: Default buffer size used by ``shutil.copyfileobj()`` is changed + from 16 KiB to 64 KiB on non-Windows platform to reduce system call + overhead. Contributed by Inada Naoki. + +- bpo-36130: Fix ``pdb`` with ``skip=...`` when stepping into a frame + without a ``__name__`` global. Patch by Anthony Sottile. + +- bpo-35652: shutil.copytree(copy_function=...) erroneously pass DirEntry + instead of a path string. + +- bpo-35178: Ensure custom :func:`warnings.formatwarning` function can + receive `line` as positional argument. Based on patch by Tashrif Billah. + +- bpo-36106: Resolve potential name clash with libm's sinpi(). Patch by + Dmitrii Pasechnik. + +- bpo-36091: Clean up reference to async generator in Lib/types. Patch by + Henry Chen. + +- bpo-36043: :class:`FileCookieJar` supports :term:`path-like object`. + Contributed by Stéphane Wirtel + +- bpo-35899: Enum has been fixed to correctly handle empty strings and + strings with non-Latin characters (ie. 'α', 'א') without crashing. + Original patch contributed by Maxwell. Assisted by Stéphane Wirtel. + +- bpo-21269: Add ``args`` and ``kwargs`` properties to mock call objects. + Contributed by Kumar Akshay. + +- bpo-30670: `pprint.pp` has been added to pretty-print objects with + dictionary keys being sorted with their insertion order by default. + Parameter *sort_dicts* has been added to `pprint.pprint`, `pprint.pformat` + and `pprint.PrettyPrinter`. Contributed by Rémi Lapeyre. + +- bpo-35843: Implement ``__getitem__`` for ``_NamespacePath``. Patch by + Anthony Sottile. + +- bpo-35802: Clean up code which checked presence of ``os.stat`` / + ``os.lstat`` / ``os.chmod`` which are always present. Patch by Anthony + Sottile. + +- bpo-35715: Librates the return value of a ProcessPoolExecutor + _process_worker after it's no longer needed to free memory + +- bpo-35493: Use :func:`multiprocessing.connection.wait` instead of polling + each 0.2 seconds for worker updates in :class:`multiprocessing.Pool`. + Patch by Pablo Galindo. + +- bpo-35661: Store the venv prompt in pyvenv.cfg. + +- bpo-35121: Don't set cookie for a request when the request path is a + prefix match of the cookie's path attribute but doesn't end with "/". + Patch by Karthikeyan Singaravelan. + +- bpo-21478: Calls to a child function created with + :func:`unittest.mock.create_autospec` should propagate to the parent. + Patch by Karthikeyan Singaravelan. + +- bpo-35198: Fix C++ extension compilation on AIX + +Documentation +------------- + +- bpo-36329: Declare the path of the Python binary for the usage of + ``Tools/scripts/serve.py`` when executing ``make -C Doc/ serve``. + Contributed by Stéphane Wirtel + +- bpo-36138: Improve documentation about converting datetime.timedelta to + scalars. + +- bpo-21314: A new entry was added to the Core Language Section of the + Programming FAQ, which explaines the usage of slash(/) in the signature of + a function. Patch by Lysandros Nikolaou + +Tests +----- + +- bpo-36234: test_posix.PosixUidGidTests: add tests for invalid uid/gid type + (str). Initial patch written by David Malcolm. + +- bpo-29571: Fix ``test_re.test_locale_flag()``: use + ``locale.getpreferredencoding()`` rather than ``locale.getlocale()`` to + get the locale encoding. With some locales, ``locale.getlocale()`` returns + the wrong encoding. + +- bpo-36123: Fix race condition in test_socket. + +Build +----- + +- bpo-36356: Fix leaks that led to build failure when configured with + address sanitizer. + +- bpo-36146: Add ``TEST_EXTENSIONS`` constant to ``setup.py`` to allow to + not build test extensions like ``_testcapi``. + +- bpo-36146: Fix setup.py on macOS: only add ``/usr/include/ffi`` to include + directories of _ctypes, not for all extensions. + +- bpo-31904: Enable build system to cross-build for VxWorks RTOS. + +Windows +------- + +- bpo-36312: Fixed decoders for the following code pages: 50220, 50221, + 50222, 50225, 50227, 50229, 57002 through 57011, 65000 and 42. + +- bpo-36264: Don't honor POSIX ``HOME`` in ``os.path.expanduser`` on + windows. Patch by Anthony Sottile. + +- bpo-24643: Fix name collisions due to ``#define timezone _timezone`` in + PC/pyconfig.h. + +IDLE +---- + +- bpo-36405: Use dict unpacking in idlelib. + +- bpo-36396: Remove fgBg param of idlelib.config.GetHighlight(). This param + was only used twice and changed the return type. + +- bpo-36176: Fix IDLE autocomplete & calltip popup colors. Prevent conflicts + with Linux dark themes (and slightly darken calltip background). + +- bpo-23205: For the grep module, add tests for findfiles, refactor + findfiles to be a module-level function, and refactor findfiles to use + os.walk. + +- bpo-23216: Add docstrings to IDLE search modules. + +- bpo-36152: Remove colorizer.ColorDelegator.close_when_done and the + corresponding argument of .close(). In IDLE, both have always been None + or False since 2007. + +- bpo-32129: Avoid blurry IDLE application icon on macOS with Tk 8.6. Patch + by Kevin Walzer. + +- bpo-36096: Refactor class variables to instance variables in colorizer. + +- bpo-30348: Increase test coverage of idlelib.autocomplete by 30%. Patch by + Louie Lu + +Tools/Demos +----------- + +- bpo-35132: Fix py-list and py-bt commands of python-gdb.py on gdb7. + +- bpo-32217: Fix freeze script on Windows. + +C API +----- + +- bpo-36381: Raise ``DeprecationWarning`` when '#' formats are used for + building or parsing values without ``PY_SSIZE_T_CLEAN``. + +- bpo-36142: The whole coreconfig.h header is now excluded from + Py_LIMITED_API. Move functions definitions into a new internal + pycore_coreconfig.h header. + + +What's New in Python 3.8.0 alpha 2? +=================================== + +*Release date: 2019-02-25* + +Core and Builtins +----------------- + +- bpo-36052: Raise a :exc:`SyntaxError` when assigning a value to + `__debug__` with the Assignment Operator. Contributed by Stéphane Wirtel + and Pablo Galindo. + +- bpo-36012: Doubled the speed of class variable writes. When a non-dunder + attribute was updated, there was an unnecessary call to update slots. + +- bpo-35942: The error message emitted when returning invalid types from + ``__fspath__`` in interfaces that allow passing :class:`~os.PathLike` + objects has been improved and now it does explain the origin of the error. + +- bpo-36016: ``gc.get_objects`` can now receive an optional parameter + indicating a generation to get objects from. Patch by Pablo Galindo. + +- bpo-1054041: When the main interpreter exits due to an uncaught + KeyboardInterrupt, the process now exits in the appropriate manner for its + parent process to detect that a SIGINT or ^C terminated the process. This + allows shells and batch scripts to understand that the user has asked them + to stop. + +- bpo-35992: Fix ``__class_getitem__()`` not being called on a class with a + custom non-subscriptable metaclass. + +- bpo-35993: Fix a crash on fork when using subinterpreters. Contributed by + Stéphane Wirtel + +- bpo-35991: Fix a potential double free in Modules/_randommodule.c. + +- bpo-35961: Fix a crash in slice_richcompare(): use strong references + rather than stolen references for the two temporary internal tuples. + +- bpo-35911: Enable the creation of cell objects by adding a + ``cell.__new__`` method, and expose the type ``cell`` in ``Lib/types.py`` + under the name CellType. Patch by Pierre Glaser. + +- bpo-12822: Use monotonic clock for ``pthread_cond_timedwait`` when + ``pthread_condattr_setclock`` and ``CLOCK_MONOTONIC`` are available. + +- bpo-15248: The compiler emits now syntax warnings in the case when a comma + is likely missed before tuple or list. + +- bpo-35886: The implementation of PyInterpreterState has been moved into + the internal header files (guarded by Py_BUILD_CORE). + +- bpo-31506: Clarify the errors reported when ``object.__new__`` and + ``object.__init__`` receive more than one argument. Contributed by Sanyam + Khurana. + +- bpo-35724: Signal-handling is now guaranteed to happen relative to the + main interpreter. + +- bpo-33608: We added a new internal _Py_AddPendingCall() that operates + relative to the provided interpreter. This allows us to use the existing + implementation to ask another interpreter to do work that cannot be done + in the current interpreter, like decref an object the other interpreter + owns. The existing Py_AddPendingCall() only operates relative to the main + interpreter. + +- bpo-33989: Fix a possible crash in :meth:`list.sort` when sorting objects + with ``ob_type->tp_richcompare == NULL``. Patch by Zackery Spytz. + +Library +------- + +- bpo-35512: :func:`unittest.mock.patch.dict` used as a decorator with + string target resolves the target during function call instead of during + decorator construction. Patch by Karthikeyan Singaravelan. + +- bpo-36018: Add statistics.NormalDist, a tool for creating and manipulating + normal distributions of random variable. Features a composite class that + treats the mean and standard deviation of measurement data as single + entity. + +- bpo-35904: Added statistics.fmean() as a faster, floating point variant of + the existing mean() function. + +- bpo-35918: Removed broken ``has_key`` method from + multiprocessing.managers.SyncManager.dict. Contributed by Rémi Lapeyre. + +- bpo-18283: Add support for bytes to :func:`shutil.which`. + +- bpo-35960: Fix :func:`dataclasses.field` throwing away empty mapping + objects passed as metadata. + +- bpo-35500: Write expected and actual call parameters on separate lines in + :meth:`unittest.mock.Mock.assert_called_with` assertion errors. + Contributed by Susan Su. + +- bpo-35931: The :mod:`pdb` ``debug`` command now gracefully handles syntax + errors. + +- bpo-24209: In http.server script, rely on getaddrinfo to bind to preferred + address based on the bind parameter. Now default bind or binding to a name + may bind to IPv6 or dual-stack, depending on the environment. + +- bpo-35321: Set ``__spec__.origin`` of ``_frozen_importlib`` to frozen so + that it matches the behavior of ``_frozen_importlib_external``. Patch by + Nina Zakharenko. + +- bpo-35378: Fix a reference issue inside :class:`multiprocessing.Pool` that + caused the pool to remain alive if it was deleted without being closed or + terminated explicitly. A new strong reference is added to the pool + iterators to link the lifetime of the pool to the lifetime of its + iterators so the pool does not get destroyed if a pool iterator is still + alive. + +- bpo-34294: re module, fix wrong capturing groups in rare cases. + :func:`re.search`, :func:`re.findall`, :func:`re.sub` and other functions + that scan through string looking for a match, should reset capturing + groups between two match attempts. Patch by Ma Lin. + +- bpo-35615: :mod:`weakref`: Fix a RuntimeError when copying a + WeakKeyDictionary or a WeakValueDictionary, due to some keys or values + disappearing while iterating. + +- bpo-35606: Implement :func:`math.prod` as analogous function to + :func:`sum` that returns the product of a 'start' value (default: 1) times + an iterable of numbers. Patch by Pablo Galindo. + +- bpo-32417: Performing arithmetic between :class:`datetime.datetime` + subclasses and :class:`datetime.timedelta` now returns an object of the + same type as the :class:`datetime.datetime` subclass. As a result, + :meth:`datetime.datetime.astimezone` and alternate constructors like + :meth:`datetime.datetime.now` and :meth:`datetime.fromtimestamp` called + with a ``tz`` argument now *also* retain their subclass. + +- bpo-35153: Add *headers* optional keyword-only parameter to + :class:`xmlrpc.client.ServerProxy`, :class:`xmlrpc.client.Transport` and + :class:`xmlrpc.client.SafeTransport`. Patch by Cédric Krier. + +- bpo-34572: Fix C implementation of pickle.loads to use importlib's locking + mechanisms, and thereby avoid using partially-loaded modules. Patch by Tim + Burgess. + +Documentation +------------- + +- bpo-36083: Fix formatting of --check-hash-based-pycs options in the + manpage Synopsis. + +- bpo-36007: Bump minimum sphinx version to 1.8. Patch by Anthony Sottile. + +- bpo-22062: Update documentation and docstrings for pathlib. Original patch + by Mike Short. + +Tests +----- + +- bpo-27313: Avoid test_ttk_guionly ComboboxTest failure with macOS Cocoa + Tk. + +- bpo-36019: Add test.support.TEST_HTTP_URL and replace references of + http://www.example.com by this new constant. Contributed by Stéphane + Wirtel. + +- bpo-36037: Fix test_ssl for strict OpenSSL configuration like RHEL8 strict + crypto policy. Use older TLS version for minimum TLS version of the server + SSL context if needed, to test TLS version older than default minimum TLS + version. + +- bpo-35798: Added :func:`test.support.check_syntax_warning`. + +- bpo-35505: Make test_imap4_host_default_value independent on whether the + local IMAP server is running. + +- bpo-35917: multiprocessing: provide unit tests for SyncManager and + SharedMemoryManager classes + all the shareable types which are supposed + to be supported by them. (patch by Giampaolo Rodola) + +- bpo-35704: Skip ``test_shutil.test_unpack_archive_xztar`` to prevent a + MemoryError on 32-bit AIX when MAXDATA setting is less than 0x20000000. + + Patch by Michael Felt (aixtools) + +- bpo-34720: Assert m_state != NULL to mimic GC traversal functions that do + not correctly handle module creation when the module state has not been + created. + +Windows +------- + +- bpo-35976: Added ARM build support to Windows build files in PCBuild. + +- bpo-35692: ``pathlib`` no longer raises when checking file and directory + existence on drives that are not ready + +- bpo-35872: Uses the base Python executable when invoking venv in a virtual + environment + +- bpo-35873: Prevents venv paths being inherited by child processes + +- bpo-35299: Fix sysconfig detection of the source directory and distutils + handling of pyconfig.h during PGO profiling + +IDLE +---- + +- bpo-24310: IDLE -- Document settings dialog font tab sample. + +- bpo-35833: Revise IDLE doc for control codes sent to Shell. Add a code + example block. + +- bpo-35689: Add docstrings and unittests for colorizer.py. + + +What's New in Python 3.8.0 alpha 1? +=================================== + +*Release date: 2019-02-03* + +Security +-------- + +- bpo-35746: [CVE-2019-5010] Fix a NULL pointer deref in ssl module. The + cert parser did not handle CRL distribution points with empty DP or URI + correctly. A malicious or buggy certificate can result into segfault. + Vulnerability (TALOS-2018-0758) reported by Colin Read and Nicolas Edet of + Cisco. + +- bpo-34812: The :option:`-I` command line option (run Python in isolated + mode) is now also copied by the :mod:`multiprocessing` and + :mod:`distutils` modules when spawning child processes. Previously, only + :option:`-E` and :option:`-s` options (enabled by :option:`-I`) were + copied. + +- bpo-34791: The xml.sax and xml.dom.domreg no longer use environment + variables to override parser implementations when + sys.flags.ignore_environment is set by -E or -I arguments. + +- bpo-17239: The xml.sax and xml.dom.minidom parsers no longer processes + external entities by default. External DTD and ENTITY declarations no + longer load files or create network connections. + +- bpo-34623: CVE-2018-14647: The C accelerated _elementtree module now + initializes hash randomization salt from _Py_HashSecret instead of + libexpat's default CSPRNG. + +- bpo-34405: Updated to OpenSSL 1.1.0i for Windows builds. + +- bpo-33871: Fixed sending the part of the file in :func:`os.sendfile` on + macOS. Using the *trailers* argument could cause sending more bytes from + the input file than was specified. + +- bpo-32533: Fixed thread-safety of error handling in _ssl. + +- bpo-33136: Harden ssl module against LibreSSL CVE-2018-8970. + X509_VERIFY_PARAM_set1_host() is called with an explicit namelen. A new + test ensures that NULL bytes are not allowed. + +- bpo-33001: Minimal fix to prevent buffer overrun in os.symlink on Windows + +- bpo-32981: Regexes in difflib and poplib were vulnerable to catastrophic + backtracking. These regexes formed potential DOS vectors (REDOS). They + have been refactored. This resolves CVE-2018-1060 and CVE-2018-1061. Patch + by Jamie Davis. + +- bpo-28414: The ssl module now allows users to perform their own IDN + en/decoding when using SNI. + +Core and Builtins +----------------- + +- bpo-35877: Make parenthesis optional for named expressions in while + statement. Patch by Karthikeyan Singaravelan. + +- bpo-35814: Allow same right hand side expressions in annotated assignments + as in normal ones. In particular, ``x: Tuple[int, int] = 1, 2`` (without + parentheses on the right) is now allowed. + +- bpo-35766: Add the option to parse PEP 484 type comments in the ast + module. (Off by default.) This is merging the key functionality of the + third party fork thereof, + [typed_ast](https://github.com/python/typed_ast). + +- bpo-35713: Reorganize Python initialization to get working exceptions and + sys.stderr earlier. + +- bpo-33416: Add end line and end column position information to the Python + AST nodes. This is a C-level backwards incompatible change. + +- bpo-35720: Fixed a minor memory leak in pymain_parse_cmdline_impl function + in Modules/main.c + +- bpo-35634: ``func(**kwargs)`` will now raise an error when ``kwargs`` is a + mapping containing multiple entries with the same key. An error was + already raised when other keyword arguments are passed before ``**kwargs`` + since Python 3.6. + +- bpo-35623: Fix a crash when sorting very long lists. Patch by Stephan + Hohe. + +- bpo-35214: clang Memory Sanitizer build instrumentation was added to work + around false positives from posix, socket, time, test_io, and + test_faulthandler. + +- bpo-35560: Fix an assertion error in :func:`format` in debug build for + floating point formatting with "n" format, zero padding and small width. + Release build is not impacted. Patch by Karthikeyan Singaravelan. + +- bpo-35552: Format characters ``%s`` and ``%V`` in + :c:func:`PyUnicode_FromFormat` and ``%s`` in :c:func:`PyBytes_FromFormat` + no longer read memory past the limit if *precision* is specified. + +- bpo-35504: Fix segfaults and :exc:`SystemError`\ s when deleting certain + attributes. Patch by Zackery Spytz. + +- bpo-35504: Fixed a SystemError when delete the characters_written + attribute of an OSError. + +- bpo-35494: Improved syntax error messages for unbalanced parentheses in + f-string. + +- bpo-35444: Fixed error handling in pickling methods when fail to look up + builtin "getattr". Sped up pickling iterators. + +- bpo-35436: Fix various issues with memory allocation error handling. + Patch by Zackery Spytz. + +- bpo-35423: Separate the signal handling trigger in the eval loop from the + "pending calls" machinery. There is no semantic change and the difference + in performance is insignificant. + +- bpo-35357: Internal attributes' names of unittest.mock._Call and + unittest.mock.MagicProxy (name, parent & from_kall) are now prefixed with + _mock_ in order to prevent clashes with widely used object attributes. + Fixed minor typo in test function name. + +- bpo-35372: Fixed the code page decoder for input longer than 2 GiB + containing undecodable bytes. + +- bpo-35336: Fix PYTHONCOERCECLOCALE=1 environment variable: only coerce the + C locale if the LC_CTYPE locale is "C". + +- bpo-31241: The *lineno* and *col_offset* attributes of AST nodes for list + comprehensions, generator expressions and tuples are now point to the + opening parenthesis or square brace. For tuples without parenthesis they + point to the position of the first item. + +- bpo-33954: For :meth:`str.format`, :meth:`float.__format__` and + :meth:`complex.__format__` methods for non-ASCII decimal point when using + the "n" formatter. + +- bpo-35269: Fix a possible segfault involving a newly-created coroutine. + Patch by Zackery Spytz. + +- bpo-35224: Implement :pep:`572` (assignment expressions). Patch by Emily + Morehouse. + +- bpo-32492: Speed up :class:`namedtuple` attribute access by 1.6x using a C + fast-path for the name descriptors. Patch by Pablo Galindo. + +- bpo-35214: Fixed an out of bounds memory access when parsing a truncated + unicode escape sequence at the end of a string such as ``'\N'``. It would + read one byte beyond the end of the memory allocation. + +- bpo-35214: The interpreter and extension modules have had annotations + added so that they work properly under clang's Memory Sanitizer. A new + configure flag --with-memory-sanitizer has been added to make test builds + of this nature easier to perform. + +- bpo-35193: Fix an off by one error in the bytecode peephole optimizer + where it could read bytes beyond the end of bounds of an array when + removing unreachable code. This bug was present in every release of Python + 3.6 and 3.7 until now. + +- bpo-35169: Improved error messages for forbidden assignments. + +- bpo-34022: Fix handling of hash-based bytecode files in :mod:`zipimport`. + Patch by Elvis Pranskevichus. + +- bpo-28401: Debug builds will no longer to attempt to import extension + modules built for the ABI as they were never compatible to begin with. + Patch by Stefano Rivera. + +- bpo-29341: Clarify in the docstrings of :mod:`os` methods that path-like + objects are also accepted as input parameters. + +- bpo-35050: :mod:`socket`: Fix off-by-one bug in length check for + ``AF_ALG`` name and type. + +- bpo-29743: Raise :exc:`ValueError` instead of :exc:`OverflowError` in case + of a negative ``_length_`` in a :class:`ctypes.Array` subclass. Also + raise :exc:`TypeError` instead of :exc:`AttributeError` for non-integer + ``_length_``. Original patch by Oren Milman. + +- bpo-16806: Fix ``lineno`` and ``col_offset`` for multi-line string tokens. + +- bpo-35029: :exc:`SyntaxWarning` raised as an exception at code generation + time will be now replaced with a :exc:`SyntaxError` for better error + reporting. + +- bpo-34983: Expose :meth:`symtable.Symbol.is_nonlocal` in the symtable + module. Patch by Pablo Galindo. + +- bpo-34974: :class:`bytes` and :class:`bytearray` constructors no longer + convert unexpected exceptions (e.g. :exc:`MemoryError` and + :exc:`KeyboardInterrupt`) to :exc:`TypeError`. + +- bpo-34939: Allow annotated names in module namespace that are declared + global before the annotation happens. Patch by Pablo Galindo. + +- bpo-34973: Fixed crash in :func:`bytes` when the :class:`list` argument is + mutated while it is iterated. + +- bpo-34876: The *lineno* and *col_offset* attributes of the AST for + decorated function and class refer now to the position of the + corresponding ``def``, ``async def`` and ``class`` instead of the position + of the first decorator. This leads to more correct line reporting in + tracing. This is the only case when the position of child AST nodes can + precede the position of the parent AST node. + +- bpo-34879: Fix a possible null pointer dereference in bytesobject.c. + Patch by Zackery Spytz. + +- bpo-34784: Fix the implementation of PyStructSequence_NewType in order to + create heap allocated StructSequences. + +- bpo-32912: A :exc:`SyntaxWarning` is now emitted instead of a + :exc:`DeprecationWarning` for invalid escape sequences in string and bytes + literals. + +- bpo-34854: Fixed a crash in compiling string annotations containing a + lambda with a keyword-only argument that doesn't have a default value. + +- bpo-34850: The compiler now produces a :exc:`SyntaxWarning` when identity + checks (``is`` and ``is not``) are used with certain types of literals + (e.g. strings, ints). These can often work by accident in CPython, but + are not guaranteed by the language spec. The warning advises users to use + equality tests (``==`` and ``!=``) instead. + +- bpo-34824: Fix a possible null pointer dereference in Modules/_ssl.c. + Patch by Zackery Spytz. + +- bpo-30156: The C function ``property_descr_get()`` uses a "cached" tuple + to optimize function calls. But this tuple can be discovered in debug mode + with :func:`sys.getobjects()`. Remove the optimization, it's not really + worth it and it causes 3 different crashes last years. + +- bpo-34762: Fix contextvars C API to use PyObject* pointer types. + +- bpo-34751: The hash function for tuples is now based on xxHash which gives + better collision results on (formerly) pathological cases. Additionally, + on 64-bit systems it improves tuple hashes in general. Patch by Jeroen + Demeyer with substantial contributions by Tim Peters. + +- bpo-34735: Fix a memory leak in Modules/timemodule.c. Patch by Zackery + Spytz. + +- bpo-34683: Fixed a bug where some SyntaxError error pointed to locations + that were off-by-one. + +- bpo-34651: Only allow the main interpreter to fork. The avoids the + possibility of affecting the main interpreter, which is critical to + operation of the runtime. + +- bpo-34653: Remove unused function PyParser_SimpleParseStringFilename. + +- bpo-32236: Warn that line buffering is not supported if :func:`open` is + called with binary mode and ``buffering=1``. + +- bpo-34641: Further restrict the syntax of the left-hand side of keyword + arguments in function calls. In particular, ``f((keyword)=arg)`` is now + disallowed. + +- bpo-34637: Make the *start* argument to *sum()* visible as a keyword + argument. + +- bpo-1621: Do not assume signed integer overflow behavior (C undefined + behavior) when performing set hash table resizing. + +- bpo-34588: Fix an off-by-one in the recursive call pruning feature of + traceback formatting. + +- bpo-34485: On Windows, the LC_CTYPE is now set to the user preferred + locale at startup. Previously, the LC_CTYPE locale was "C" at startup, but + changed when calling setlocale(LC_CTYPE, "") or setlocale(LC_ALL, ""). + +- bpo-34485: Standard streams like sys.stdout now use the "surrogateescape" + error handler, instead of "strict", on the POSIX locale (when the C locale + is not coerced and the UTF-8 Mode is disabled). + +- bpo-34485: Fix the error handler of standard streams like sys.stdout: + PYTHONIOENCODING=":" is now ignored instead of setting the error handler + to "strict". + +- bpo-34485: Python now gets the locale encoding with C code to initialize + the encoding of standard streams like sys.stdout. Moreover, the encoding + is now initialized to the Python codec name to get a normalized encoding + name and to ensure that the codec is loaded. The change avoids importing + _bootlocale and _locale modules at startup by default. + +- bpo-34527: On FreeBSD, Py_DecodeLocale() and Py_EncodeLocale() now also + forces the ASCII encoding if the LC_CTYPE locale is "POSIX", not only if + the LC_CTYPE locale is "C". + +- bpo-34527: The UTF-8 Mode is now also enabled by the "POSIX" locale, not + only by the "C" locale. + +- bpo-34403: On HP-UX with C or POSIX locale, sys.getfilesystemencoding() + now returns "ascii" instead of "roman8" (when the UTF-8 Mode is disabled + and the C locale is not coerced). + +- bpo-34523: The Python filesystem encoding is now read earlier during the + Python initialization. + +- bpo-12458: Tracebacks show now correct line number for subexpressions in + multiline expressions. Tracebacks show now the line number of the first + line for multiline expressions instead of the line number of the last + subexpression. + +- bpo-34408: Prevent a null pointer dereference and resource leakage in + ``PyInterpreterState_New()``. + +- bpo-34400: Fix undefined behavior in parsetok.c. Patch by Zackery Spytz. + +- bpo-33073: Added as_integer_ratio to ints to make them more interoperable + with floats. + +- bpo-34377: Update valgrind suppression list to use + ``_PyObject_Free``/``_PyObject_Realloc`` instead of + ``PyObject_Free``/``PyObject_Realloc``. + +- bpo-34353: Added the "socket" option in the `stat.filemode()` Python + implementation to match the C implementation. + +- bpo-34320: Fix ``dict(od)`` didn't copy iteration order of OrderedDict. + +- bpo-34113: Fixed crash on debug builds when opcode stack was adjusted with + negative numbers. Patch by Constantin Petrisor. + +- bpo-34100: Compiler now merges constants in tuples and frozensets + recursively. Code attributes like ``co_names`` are merged too. + +- bpo-34151: Performance of list concatenation, repetition and slicing + operations is slightly improved. Patch by Sergey Fedoseev. + +- bpo-34170: -X dev: it is now possible to override the memory allocator + using PYTHONMALLOC even if the developer mode is enabled. + +- bpo-33237: Improved :exc:`AttributeError` message for partially + initialized module. + +- bpo-34149: Fix min and max functions to get default behavior when key is + None. + +- bpo-34125: Profiling of unbound built-in methods now works when + ``**kwargs`` is given. + +- bpo-34141: Optimized pickling atomic types (None, bool, int, float, bytes, + str). + +- bpo-34126: Fix crashes when profiling certain invalid calls of unbound + methods. Patch by Jeroen Demeyer. + +- bpo-24618: Fixed reading invalid memory when create the code object with + too small varnames tuple or too large argument counts. + +- bpo-34068: In :meth:`io.IOBase.close`, ensure that the + :attr:`~io.IOBase.closed` attribute is not set with a live exception. + Patch by Zackery Spytz and Serhiy Storchaka. + +- bpo-34087: Fix buffer overflow while converting unicode to numeric values. + +- bpo-34080: Fixed a memory leak in the compiler when it raised some + uncommon errors during tokenizing. + +- bpo-34066: Disabled interruption by Ctrl-C between calling ``open()`` and + entering a **with** block in ``with open()``. + +- bpo-34042: Fix dict.copy() to maintain correct total refcount (as reported + by sys.gettotalrefcount()). + +- bpo-33418: Fix potential memory leak in function object when it creates + reference cycle. + +- bpo-33985: Implement contextvars.ContextVar.name attribute. + +- bpo-33956: Update vendored Expat library copy to version 2.2.5. + +- bpo-24596: Decref the module object in :c:func:`PyRun_SimpleFileExFlags` + before calling :c:func:`PyErr_Print()`. Patch by Zackery Spytz. + +- bpo-33451: Close directly executed pyc files before calling + ``PyEval_EvalCode()``. + +- bpo-1617161: The hash of :class:`BuiltinMethodType` instances (methods of + built-in classes) now depends on the hash of the identity of *__self__* + instead of its value. The hash and equality of :class:`ModuleType` and + :class:`MethodWrapperType` instances (methods of user-defined classes and + some methods of built-in classes like ``str.__add__``) now depend on the + hash and equality of the identity of *__self__* instead of its value. + :class:`MethodWrapperType` instances no longer support ordering. + +- bpo-33824: Fix "LC_ALL=C python3.7 -V": reset properly the command line + parser when the encoding changes after reading the Python configuration. + +- bpo-33803: Fix a crash in hamt.c caused by enabling GC tracking for an + object that hadn't all of its fields set to NULL. + +- bpo-33738: Seven macro incompatibilities with the Limited API were fixed, + and the macros :c:func:`PyIter_Check`, :c:func:`PyIndex_Check` and + :c:func:`PyExceptionClass_Name` were added as functions. A script for + automatic macro checks was added. + +- bpo-33786: Fix asynchronous generators to handle GeneratorExit in athrow() + correctly + +- bpo-30167: ``PyRun_SimpleFileExFlags`` removes ``__cached__`` from module + in addition to ``__file__``. + +- bpo-33706: Fix a crash in Python initialization when parsing the command + line options. Thanks Christoph Gohlke for the bug report and the fix! + +- bpo-33597: Reduce ``PyGC_Head`` size from 3 words to 2 words. + +- bpo-30654: Fixed reset of the SIGINT handler to SIG_DFL on interpreter + shutdown even when there was a custom handler set previously. Patch by + Philipp Kerling. + +- bpo-33622: Fixed a leak when the garbage collector fails to add an object + with the ``__del__`` method or referenced by it into the + :data:`gc.garbage` list. :c:func:`PyGC_Collect` can now be called when an + exception is set and preserves it. + +- bpo-33462: Make dict and dict views reversible. Patch by Rémi Lapeyre. + +- bpo-23722: A :exc:`RuntimeError` is now raised when the custom metaclass + doesn't provide the ``__classcell__`` entry in the namespace passed to + ``type.__new__``. A :exc:`DeprecationWarning` was emitted in Python + 3.6--3.7. + +- bpo-33499: Add :envvar:`PYTHONPYCACHEPREFIX` environment variable and + :option:`-X` ``pycache_prefix`` command-line option to set an alternate + root directory for writing module bytecode cache files. + +- bpo-25711: The :mod:`zipimport` module has been rewritten in pure Python. + +- bpo-33509: Fix module_globals parameter of warnings.warn_explicit(): don't + crash if module_globals is not a dict. + +- bpo-31849: Fix signed/unsigned comparison warning in pyhash.c. + +- bpo-33475: Fixed miscellaneous bugs in converting annotations to strings + and optimized parentheses in the string representation. + +- bpo-20104: Added support for the `setpgroup`, `resetids`, `setsigmask`, + `setsigdef` and `scheduler` parameters of `posix_spawn`. Patch by Pablo + Galindo. + +- bpo-33391: Fix a leak in set_symmetric_difference(). + +- bpo-33363: Raise a SyntaxError for ``async with`` and ``async for`` + statements outside of async functions. + +- bpo-28055: Fix unaligned accesses in siphash24(). Patch by Rolf Eike Beer. + +- bpo-33128: Fix a bug that causes PathFinder to appear twice on + sys.meta_path. Patch by Pablo Galindo Salgado. + +- bpo-33331: Modules imported last are now cleared first at interpreter + shutdown. + +- bpo-33312: Fixed clang ubsan (undefined behavior sanitizer) warnings in + dictobject.c by adjusting how the internal struct _dictkeysobject shared + keys structure is declared. + +- bpo-33305: Improved syntax error messages for invalid numerical literals. + +- bpo-33306: Improved syntax error messages for unbalanced parentheses. + +- bpo-33234: The list constructor will pre-size and not over-allocate when + the input length is known. + +- bpo-33270: Intern the names for all anonymous code objects. Patch by + Zackery Spytz. + +- bpo-30455: The C and Python code and the documentation related to tokens + are now generated from a single source file :file:`Grammar/Tokens`. + +- bpo-33176: Add a ``toreadonly()`` method to memoryviews. + +- bpo-33231: Fix potential memory leak in ``normalizestring()``. + +- bpo-33205: Change dict growth function from + ``round_up_to_power_2(used*2+hashtable_size/2)`` to + ``round_up_to_power_2(used*3)``. Previously, dict is shrinked only when + ``used == 0``. Now dict has more chance to be shrinked. + +- bpo-29922: Improved error messages in 'async with' when ``__aenter__()`` + or ``__aexit__()`` return non-awaitable object. + +- bpo-33199: Fix ``ma_version_tag`` in dict implementation is uninitialized + when copying from key-sharing dict. + +- bpo-33053: When using the -m switch, sys.path[0] is now explicitly + expanded as the *starting* working directory, rather than being left as + the empty path (which allows imports from the current working directory at + the time of the import) + +- bpo-33138: Changed standard error message for non-pickleable and + non-copyable types. It now says "cannot pickle" instead of "can't pickle" + or "cannot serialize". + +- bpo-33018: Improve consistency of errors raised by ``issubclass()`` when + called with a non-class and an abstract base class as the first and second + arguments, respectively. Patch by Josh Bronson. + +- bpo-33083: ``math.factorial`` no longer accepts arguments that are not + int-like. Patch by Pablo Galindo. + +- bpo-33041: Added new opcode :opcode:`END_ASYNC_FOR` and fixes the + following issues: + + * Setting global :exc:`StopAsyncIteration` no longer breaks ``async for`` + loops. + * Jumping into an ``async for`` loop is now disabled. + * Jumping out of an ``async for`` loop no longer corrupts the stack. + +- bpo-25750: Fix rare Python crash due to bad refcounting in + ``type_getattro()`` if a descriptor deletes itself from the class. Patch + by Jeroen Demeyer. + +- bpo-33041: Fixed bytecode generation for "async for" with a complex + target. A StopAsyncIteration raised on assigning or unpacking will be now + propagated instead of stopping the iteration. + +- bpo-33026: Fixed jumping out of "with" block by setting f_lineno. + +- bpo-33005: Fix a crash on fork when using a custom memory allocator (ex: + using PYTHONMALLOC env var). _PyGILState_Reinit() and + _PyInterpreterState_Enable() now use the default RAW memory allocator to + allocate a new interpreters mutex on fork. + +- bpo-32911: Due to unexpected compatibility issues discovered during + downstream beta testing, reverted :issue:`29463`. ``docstring`` field is + removed from Module, ClassDef, FunctionDef, and AsyncFunctionDef ast nodes + which was added in 3.7a1. Docstring expression is restored as a first + statement in their body. Based on patch by Inada Naoki. + +- bpo-17288: Prevent jumps from 'return' and 'exception' trace events. + +- bpo-32946: Importing names from already imported module with "from ... + import ..." is now 30% faster if the module is not a package. + +- bpo-32932: Make error message more revealing when there are non-str + objects in ``__all__``. + +- bpo-32925: Optimized iterating and containing test for literal lists + consisting of non-constants: ``x in [a, b]`` and ``for x in [a, b]``. The + case of all constant elements already was optimized. + +- bpo-32889: Update Valgrind suppression list to account for the rename of + ``Py_ADDRESS_IN_RANG`` to ``address_in_range``. + +- bpo-32836: Don't use temporary variables in cases of list/dict/set + comprehensions + +- bpo-31356: Remove the new API added in bpo-31356 (gc.ensure_disabled() + context manager). + +- bpo-32305: For namespace packages, ensure that both ``__file__`` and + ``__spec__.origin`` are set to None. + +- bpo-32303: Make sure ``__spec__.loader`` matches ``__loader__`` for + namespace packages. + +- bpo-32711: Fix the warning messages for Python/ast_unparse.c. Patch by + Stéphane Wirtel + +- bpo-32583: Fix possible crashing in builtin Unicode decoders caused by + write out-of-bound errors when using customized decode error handlers. + +- bpo-32489: A :keyword:`continue` statement is now allowed in the + :keyword:`finally` clause. + +- bpo-17611: Simplified the interpreter loop by moving the logic of + unrolling the stack of blocks into the compiler. The compiler emits now + explicit instructions for adjusting the stack of values and calling the + cleaning up code for :keyword:`break`, :keyword:`continue` and + :keyword:`return`. + + Removed opcodes :opcode:`BREAK_LOOP`, :opcode:`CONTINUE_LOOP`, + :opcode:`SETUP_LOOP` and :opcode:`SETUP_EXCEPT`. Added new opcodes + :opcode:`ROT_FOUR`, :opcode:`BEGIN_FINALLY` and :opcode:`CALL_FINALLY` and + :opcode:`POP_FINALLY`. Changed the behavior of :opcode:`END_FINALLY` and + :opcode:`WITH_CLEANUP_START`. + +- bpo-32285: New function unicodedata.is_normalized, which can check whether + a string is in a specific normal form. + +- bpo-10544: Yield expressions are now disallowed in comprehensions and + generator expressions except the expression for the outermost iterable. + +- bpo-32117: Iterable unpacking is now allowed without parentheses in yield + and return statements, e.g. ``yield 1, 2, 3, *rest``. Thanks to David + Cuthbert for the change and Jordan Chapman for added tests. + +- bpo-31902: Fix the ``col_offset`` attribute for ast nodes + ``ast.AsyncFor``, ``ast.AsyncFunctionDef``, and ``ast.AsyncWith``. + Previously, ``col_offset`` pointed to the keyword after ``async``. + +- bpo-25862: Fix assertion failures in the ``tell()`` method of + ``io.TextIOWrapper``. Patch by Zackery Spytz. + +- bpo-21983: Fix a crash in `ctypes.cast()` in case the type argument is a + ctypes structured data type. Patch by Eryk Sun and Oren Milman. + +- bpo-31577: Fix a crash in `os.utime()` in case of a bad ns argument. Patch + by Oren Milman. + +- bpo-29832: Remove references to 'getsockaddrarg' from various socket error + messages. Patch by Oren Milman. + +Library +------- + +- bpo-35845: Add 'order' parameter to memoryview.tobytes(). + +- bpo-35864: The _asdict() method for collections.namedtuple now returns a + regular dict instead of an OrderedDict. + +- bpo-35537: An ExitStack is now used internally within subprocess.POpen to + clean up pipe file handles. No behavior change in normal operation. But if + closing one handle were ever to cause an exception, the others will now be + closed instead of leaked. (patch by Giampaolo Rodola) + +- bpo-35847: RISC-V needed the CTYPES_PASS_BY_REF_HACK. Fixes ctypes + Structure test_pass_by_value. + +- bpo-35813: Shared memory submodule added to multiprocessing to avoid need + for serialization between processes + +- bpo-35780: Fix lru_cache() errors arising in recursive, reentrant, or + multi-threaded code. These errors could result in orphan links and in the + cache being trapped in a state with fewer than the specified maximum + number of links. Fix handling of negative maxsize which should have been + treated as zero. Fix errors in toggling the "full" status flag. Fix + misordering of links when errors are encountered. Sync-up the C code and + pure Python code for the space saving path in functions with a single + positional argument. In this common case, the space overhead of an lru + cache entry is reduced by almost half. Fix counting of cache misses. In + error cases, the miss count was out of sync with the actual number of + times the underlying user function was called. + +- bpo-35537: :func:`os.posix_spawn` and :func:`os.posix_spawnp` now have a + *setsid* parameter. + +- bpo-23846: :class:`asyncio.ProactorEventLoop` now catches and logs send + errors when the self-pipe is full. + +- bpo-34323: :mod:`asyncio`: Enhance ``IocpProactor.close()`` log: wait 1 + second before the first log, then log every second. Log also the number of + seconds since ``close()`` was called. + +- bpo-35674: Add a new :func:`os.posix_spawnp` function. Patch by Joannah + Nanjekye. + +- bpo-35733: ``ast.Constant(boolean)`` no longer an instance of + :class:`ast.Num`. Patch by Anthony Sottile. + +- bpo-35726: QueueHandler.prepare() now makes a copy of the record before + modifying and enqueueing it, to avoid affecting other handlers in the + chain. + +- bpo-35719: Sped up multi-argument :mod:`math` functions atan2(), + copysign(), remainder() and hypot() by 1.3--2.5 times. + +- bpo-35717: Fix KeyError exception raised when using enums and compile. + Patch contributed by Rémi Lapeyre. + +- bpo-35699: Fixed detection of Visual Studio Build Tools 2017 in distutils + +- bpo-32710: Fix memory leaks in asyncio ProactorEventLoop on overlapped + operation failure. + +- bpo-35702: The :data:`time.CLOCK_UPTIME_RAW` constant is now available for + macOS 10.12. + +- bpo-32710: Fix a memory leak in asyncio in the ProactorEventLoop when + ``ReadFile()`` or ``WSASend()`` overlapped operation fail immediately: + release the internal buffer. + +- bpo-35682: Fix ``asyncio.ProactorEventLoop.sendfile()``: don't attempt to + set the result of an internal future if it's already done. + +- bpo-35283: Add a deprecated warning for the + :meth:`threading.Thread.isAlive` method. Patch by Dong-hee Na. + +- bpo-35664: Improve operator.itemgetter() performance by 33% with optimized + argument handling and with adding a fast path for the common case of a + single non-negative integer index into a tuple (which is the typical use + case in the standard library). + +- bpo-35643: Fixed a SyntaxWarning: invalid escape sequence in + Modules/_sha3/cleanup.py. Patch by Mickaël Schoentgen. + +- bpo-35619: Improved support of custom data descriptors in :func:`help` and + :mod:`pydoc`. + +- bpo-28503: The `crypt` module now internally uses the `crypt_r()` library + function instead of `crypt()` when available. + +- bpo-35614: Fixed help() on metaclasses. Patch by Sanyam Khurana. + +- bpo-35568: Expose ``raise(signum)`` as `raise_signal` + +- bpo-35588: The floor division and modulo operations and the :func:`divmod` + function on :class:`fractions.Fraction` types are 2--4x faster. Patch by + Stefan Behnel. + +- bpo-35585: Speed-up building enums by value, e.g. http.HTTPStatus(200). + +- bpo-30561: random.gammavariate(1.0, beta) now computes the same result as + random.expovariate(1.0 / beta). This synchronizes the two algorithms and + eliminates some idiosyncrasies in the old implementation. It does however + produce a difference stream of random variables than it used to. + +- bpo-35537: The :mod:`subprocess` module can now use the + :func:`os.posix_spawn` function in some cases for better performance. + +- bpo-35526: Delaying the 'joke' of barry_as_FLUFL.mandatory to Python + version 4.0 + +- bpo-35523: Remove :mod:`ctypes` callback workaround: no longer create a + callback at startup. Avoid SELinux alert on ``import ctypes`` and ``import + uuid``. + +- bpo-31784: :func:`uuid.uuid1` now calls :func:`time.time_ns` rather than + ``int(time.time() * 1e9)``. + +- bpo-35513: :class:`~unittest.runner.TextTestRunner` of + :mod:`unittest.runner` now uses :func:`time.perf_counter` rather than + :func:`time.time` to measure the execution time of a test: + :func:`time.time` can go backwards, whereas :func:`time.perf_counter` is + monotonic. + +- bpo-35502: Fixed reference leaks in + :class:`xml.etree.ElementTree.TreeBuilder` in case of unfinished building + of the tree (in particular when an error was raised during parsing XML). + +- bpo-35348: Make :func:`platform.architecture` parsing of ``file`` command + output more reliable: add the ``-b`` option to the ``file`` command to + omit the filename, force the usage of the C locale, and search also the + "shared object" pattern. + +- bpo-35491: :mod:`multiprocessing`: Add ``Pool.__repr__()`` and enhance + ``BaseProcess.__repr__()`` (add pid and parent pid) to ease debugging. + Pool state constant values are now strings instead of integers, for + example ``RUN`` value becomes ``'RUN'`` instead of ``0``. + +- bpo-35477: :meth:`multiprocessing.Pool.__enter__` now fails if the pool is + not running: ``with pool:`` fails if used more than once. + +- bpo-31446: Copy command line that was passed to CreateProcessW since this + function can change the content of the input buffer. + +- bpo-35471: Python 2.4 dropped MacOS 9 support. The macpath module was + deprecated in Python 3.7. The module is now removed. + +- bpo-23057: Unblock Proactor event loop when keyboard interrupt is received + on Windows + +- bpo-35052: Fix xml.dom.minidom cloneNode() on a document with an entity: + pass the correct arguments to the user data handler of an entity. + +- bpo-20239: Allow repeated assignment deletion of + :class:`unittest.mock.Mock` attributes. Patch by Pablo Galindo. + +- bpo-17185: Set ``__signature__`` on mock for :mod:`inspect` to get + signature. Patch by Karthikeyan Singaravelan. + +- bpo-35445: Memory errors during creating posix.environ no longer ignored. + +- bpo-35415: Validate fileno= argument to socket.socket(). + +- bpo-35424: :class:`multiprocessing.Pool` destructor now emits + :exc:`ResourceWarning` if the pool is still running. + +- bpo-35330: When a :class:`Mock` instance was used to wrap an object, if + `side_effect` is used in one of the mocks of it methods, don't call the + original implementation and return the result of using the side effect the + same way that it is done with return_value. + +- bpo-35346: Drop Mac OS 9 and Rhapsody support from the :mod:`platform` + module. Rhapsody last release was in 2000. Mac OS 9 last release was in + 2001. + +- bpo-10496: :func:`~distutils.utils.check_environ` of + :mod:`distutils.utils` now catches :exc:`KeyError` on calling + :func:`pwd.getpwuid`: don't create the ``HOME`` environment variable in + this case. + +- bpo-10496: :func:`posixpath.expanduser` now returns the input *path* + unchanged if the ``HOME`` environment variable is not set and the current + user has no home directory (if the current user identifier doesn't exist + in the password database). This change fix the :mod:`site` module if the + current user doesn't exist in the password database (if the user has no + home directory). + +- bpo-35389: :func:`platform.libc_ver` now uses + ``os.confstr('CS_GNU_LIBC_VERSION')`` if available and the *executable* + parameter is not set. + +- bpo-35394: Add empty slots to asyncio abstract protocols. + +- bpo-35310: Fix a bug in :func:`select.select` where, in some cases, the + file descriptor sequences were returned unmodified after a signal + interruption, even though the file descriptors might not be ready yet. + :func:`select.select` will now always return empty lists if a timeout has + occurred. Patch by Oran Avraham. + +- bpo-35380: Enable TCP_NODELAY on Windows for proactor asyncio event loop. + +- bpo-35341: Add generic version of ``collections.OrderedDict`` to the + ``typing`` module. Patch by Ismo Toijala. + +- bpo-35371: Fixed possible crash in ``os.utime()`` on Windows when pass + incorrect arguments. + +- bpo-35346: :func:`platform.uname` now redirects ``stderr`` to + :data:`os.devnull` when running external programs like ``cmd /c ver``. + +- bpo-35066: Previously, calling the strftime() method on a datetime object + with a trailing '%' in the format string would result in an exception. + However, this only occurred when the datetime C module was being used; the + python implementation did not match this behavior. Datetime is now PEP-399 + compliant, and will not throw an exception on a trailing '%'. + +- bpo-35345: The function `platform.popen` has been removed, it was + deprecated since Python 3.3: use :func:`os.popen` instead. + +- bpo-35344: On macOS, :func:`platform.platform` now uses + :func:`platform.mac_ver`, if it returns a non-empty release string, to get + the macOS version rather than the darwin version. + +- bpo-35312: Make ``lib2to3.pgen2.parse.ParseError`` round-trip pickle-able. + Patch by Anthony Sottile. + +- bpo-35308: Fix regression in ``webbrowser`` where default browsers may be + preferred over browsers in the ``BROWSER`` environment variable. + +- bpo-24746: Avoid stripping trailing whitespace in doctest fancy diff. + Original patch by R. David Murray & Jairo Trad. Enhanced by Sanyam + Khurana. + +- bpo-28604: :func:`locale.localeconv` now sets temporarily the ``LC_CTYPE`` + locale to the ``LC_MONETARY`` locale if the two locales are different and + monetary strings are non-ASCII. This temporary change affects other + threads. + +- bpo-35277: Update ensurepip to install pip 18.1 and setuptools 40.6.2. + +- bpo-24209: Adds IPv6 support when invoking http.server directly. + +- bpo-35226: Recursively check arguments when testing for equality of + :class:`unittest.mock.call` objects and add note that tracking of + parameters used to create ancestors of mocks in ``mock_calls`` is not + possible. + +- bpo-29564: The warnings module now suggests to enable tracemalloc if the + source is specified, the tracemalloc module is available, but tracemalloc + is not tracing memory allocations. + +- bpo-35189: Modify the following fnctl function to retry if interrupted by + a signal (EINTR): flock, lockf, fnctl + +- bpo-30064: Use add_done_callback() in sock_* asyncio API to unsubscribe + reader/writer early on calcellation. + +- bpo-35186: Removed the "built with" comment added when ``setup.py upload`` + is used with either ``bdist_rpm`` or ``bdist_dumb``. + +- bpo-35152: Allow sending more than 2 GB at once on a multiprocessing + connection on non-Windows systems. + +- bpo-35062: Fix incorrect parsing of + :class:`_io.IncrementalNewlineDecoder`'s *translate* argument. + +- bpo-35065: Remove `StreamReaderProtocol._untrack_reader`. The call to + `_untrack_reader` is currently performed too soon, causing the protocol to + forget about the reader before `connection_lost` can run and feed the EOF + to the reader. + +- bpo-34160: ElementTree and minidom now preserve the attribute order + specified by the user. + +- bpo-35079: Improve difflib.SequenceManager.get_matching_blocks doc by + adding 'non-overlapping' and changing '!=' to '<'. + +- bpo-33710: Deprecated ``l*gettext()`` functions and methods in the + :mod:`gettext` module. They return encoded bytes instead of Unicode + strings and are artifacts from Python 2 times. Also deprecated functions + and methods related to setting the charset for ``l*gettext()`` functions + and methods. + +- bpo-35017: :meth:`socketserver.BaseServer.serve_forever` now exits + immediately if it's :meth:`~socketserver.BaseServer.shutdown` method is + called while it is polling for new events. + +- bpo-35024: `importlib` no longer logs `wrote ` redundantly + after `(created|could not create) ` is already logged. + Patch by Quentin Agren. + +- bpo-35047: ``unittest.mock`` now includes mock calls in exception messages + if ``assert_not_called``, ``assert_called_once``, or + ``assert_called_once_with`` fails. Patch by Petter Strandmark. + +- bpo-31047: Fix ``ntpath.abspath`` regression where it didn't remove a + trailing separator on Windows. Patch by Tim Graham. + +- bpo-35053: tracemalloc now tries to update the traceback when an object is + reused from a "free list" (optimization for faster object creation, used + by the builtin list type for example). + +- bpo-31553: Add the --json-lines option to json.tool. Patch by hongweipeng. + +- bpo-34794: Fixed a leak in Tkinter when pass the Python wrapper around + Tcl_Obj back to Tcl/Tk. + +- bpo-34909: Enum: fix grandchildren subclassing when parent mixed with + concrete data types. + +- bpo-35022: :class:`unittest.mock.MagicMock` now supports the + ``__fspath__`` method (from :class:`os.PathLike`). + +- bpo-35008: Fixed references leaks when call the ``__setstate__()`` method + of :class:`xml.etree.ElementTree.Element` in the C implementation for + already initialized element. + +- bpo-23420: Verify the value for the parameter '-s' of the cProfile CLI. + Patch by Robert Kuska + +- bpo-33947: dataclasses now handle recursive reprs without raising + RecursionError. + +- bpo-34890: Make :func:`inspect.iscoroutinefunction`, + :func:`inspect.isgeneratorfunction` and :func:`inspect.isasyncgenfunction` + work with :func:`functools.partial`. Patch by Pablo Galindo. + +- bpo-34521: Use :func:`socket.CMSG_SPACE` to calculate ancillary data size + instead of :func:`socket.CMSG_LEN` in + :func:`multiprocessing.reduction.recvfds` as :rfc:`3542` requires the use + of the former for portable applications. + +- bpo-31522: The `mailbox.mbox.get_string` function *from_* parameter can + now successfully be set to a non-default value. + +- bpo-34970: Protect tasks weak set manipulation in ``asyncio.all_tasks()`` + +- bpo-34969: gzip: Add --fast, --best on the gzip CLI, these parameters will + be used for the fast compression method (quick) or the best method + compress (slower, but smaller file). Also, change the default compression + level to 6 (tradeoff). + +- bpo-16965: The :term:`2to3` :2to3fixer:`execfile` fixer now opens the file + with mode ``'rb'``. Patch by Zackery Spytz. + +- bpo-34966: :mod:`pydoc` now supports aliases not only to methods defined + in the end class, but also to inherited methods. The docstring is not + duplicated for aliases. + +- bpo-34926: :meth:`mimetypes.MimeTypes.guess_type` now accepts + :term:`path-like object` in addition to url strings. Patch by Mayank + Asthana. + +- bpo-23831: Add ``moveto()`` method to the ``tkinter.Canvas`` widget. Patch + by Juliette Monsel. + +- bpo-34941: Methods ``find()``, ``findtext()`` and ``findall()`` of the + ``Element`` class in the :mod:`xml.etree.ElementTree` module are now able + to find children which are instances of ``Element`` subclasses. + +- bpo-32680: :class:`smtplib.SMTP` objects now always have a `sock` + attribute present + +- bpo-34769: Fix for async generators not finalizing when event loop is in + debug mode and garbage collector runs in another thread. + +- bpo-34936: Fix ``TclError`` in ``tkinter.Spinbox.selection_element()``. + Patch by Juliette Monsel. + +- bpo-34829: Add methods ``selection_from``, ``selection_range``, + ``selection_present`` and ``selection_to`` to the ``tkinter.Spinbox`` for + consistency with the ``tkinter.Entry`` widget. Patch by Juliette Monsel. + +- bpo-34911: Added *secure_protocols* argument to + *http.cookiejar.DefaultCookiePolicy* to allow for tweaking of protocols + and also to add support by default for *wss*, the secure websocket + protocol. + +- bpo-34922: Fixed integer overflow in the :meth:`~hashlib.shake.digest()` + and :meth:`~hashlib.shake.hexdigest()` methods for the SHAKE algorithm in + the :mod:`hashlib` module. + +- bpo-34925: 25% speedup in argument parsing for the functions in the bisect + module. + +- bpo-34900: Fixed :meth:`unittest.TestCase.debug` when used to call test + methods with subtests. Patch by Bruno Oliveira. + +- bpo-34844: logging.Formatter enhancement - Ensure styles and fmt matches + in logging.Formatter - Added validate method in each format style class: + StrFormatStyle, PercentStyle, StringTemplateStyle. - This method is called + in the constructor of logging.Formatter class - Also re-raise the KeyError + in the format method of each style class, so it would a bit clear that + it's an error with the invalid format fields. + +- bpo-34897: Adjust test.support.missing_compiler_executable check so that a + nominal command name of "" is ignored. Patch by Michael Felt. + +- bpo-34871: Fix inspect module polluted ``sys.modules`` when parsing + ``__text_signature__`` of callable. + +- bpo-34898: Add `mtime` argument to `gzip.compress` for reproducible + output. Patch by Guo Ci Teo. + +- bpo-28441: On Cygwin and MinGW, ensure that ``sys.executable`` always + includes the full filename in the path, including the ``.exe`` suffix + (unless it is a symbolic link). + +- bpo-34866: Adding ``max_num_fields`` to ``cgi.FieldStorage`` to make DOS + attacks harder by limiting the number of ``MiniFieldStorage`` objects + created by ``FieldStorage``. + +- bpo-34711: http.server ensures it reports HTTPStatus.NOT_FOUND when the + local path ends with "/" and is not a directory, even if the underlying OS + (e.g. AIX) accepts such paths as a valid file reference. Patch by Michael + Felt. + +- bpo-34872: Fix self-cancellation in C implementation of asyncio.Task + +- bpo-34849: Don't log waiting for ``selector.select`` in asyncio loop + iteration. The waiting is pretty normal for any asyncio program, logging + its time just adds a noise to logs without any useful information + provided. + +- bpo-34022: The :envvar:`SOURCE_DATE_EPOCH` environment variable no longer + overrides the value of the *invalidation_mode* argument to + :func:`py_compile.compile`, and determines its default value instead. + +- bpo-34819: Use a monotonic clock to compute timeouts in + :meth:`Executor.map` and :func:`as_completed`, in order to prevent + timeouts from deviating when the system clock is adjusted. + +- bpo-34758: Add .wasm -> application/wasm to list of recognized file types + and content type headers + +- bpo-34789: :func:`xml.sax.make_parser` now accepts any iterable as its + *parser_list* argument. Patch by Andrés Delfino. + +- bpo-34334: In :class:`QueueHandler`, clear `exc_text` from + :class:`LogRecord` to prevent traceback from being written twice. + +- bpo-34687: On Windows, asyncio now uses ProactorEventLoop, instead of + SelectorEventLoop, by default. + +- bpo-5950: Support reading zip files with archive comments in + :mod:`zipimport`. + +- bpo-32892: The parser now represents all constants as + :class:`ast.Constant` instead of using specific constant AST types + (``Num``, ``Str``, ``Bytes``, ``NameConstant`` and ``Ellipsis``). These + classes are considered deprecated and will be removed in future Python + versions. + +- bpo-34728: Add deprecation warning when `loop` is used in methods: + `asyncio.sleep`, `asyncio.wait` and `asyncio.wait_for`. + +- bpo-34738: ZIP files created by :mod:`distutils` will now include entries + for directories. + +- bpo-34659: Add an optional *initial* argument to itertools.accumulate(). + +- bpo-29577: Support multiple mixin classes when creating Enums. + +- bpo-34670: Add SSLContext.post_handshake_auth and + SSLSocket.verify_client_post_handshake for TLS 1.3's post handshake + authentication feature. + +- bpo-32718: The Activate.ps1 script from venv works with PowerShell Core + 6.1 and is now available under all operating systems. + +- bpo-31177: Fix bug that prevented using :meth:`reset_mock + ` on mock instances with deleted attributes + +- bpo-34672: Add a workaround, so the ``'Z'`` :func:`time.strftime` + specifier on the musl C library can work in some cases. + +- bpo-34666: Implement ``asyncio.StreamWriter.awrite`` and + ``asyncio.StreamWriter.aclose()`` coroutines. Methods are needed for + providing a consistent stream API with control flow switched on by + default. + +- bpo-6721: Acquire the logging module's commonly used internal locks while + fork()ing to avoid deadlocks in the child process. + +- bpo-34658: Fix a rare interpreter unhandled exception state SystemError + only seen when using subprocess with a preexec_fn while an after_parent + handler has been registered with os.register_at_fork and the fork system + call fails. + +- bpo-34652: Ensure :func:`os.lchmod` is never defined on Linux. + +- bpo-34638: Store a weak reference to stream reader to break strong + references loop between reader and protocol. It allows to detect and + close the socket if the stream is deleted (garbage collected) without + ``close()`` call. + +- bpo-34536: `Enum._missing_`: raise `ValueError` if None returned and + `TypeError` if non-member is returned. + +- bpo-34636: Speed up re scanning of many non-matching characters for \s \w + and \d within bytes objects. (microoptimization) + +- bpo-24412: Add :func:`~unittest.addModuleCleanup()` and + :meth:`~unittest.TestCase.addClassCleanup()` to unittest to support + cleanups for :func:`~unittest.setUpModule()` and + :meth:`~unittest.TestCase.setUpClass()`. Patch by Lisa Roach. + +- bpo-34630: Don't log SSL certificate errors in asyncio code (connection + error logging is skipped already). + +- bpo-32490: Prevent filename duplication in :mod:`subprocess` exception + messages. Patch by Zackery Spytz. + +- bpo-34363: dataclasses.asdict() and .astuple() now handle namedtuples + correctly. + +- bpo-34625: Update vendorized expat library version to 2.2.6. + +- bpo-32270: The subprocess module no longer mistakenly closes redirected + fds even when they were in pass_fds when outside of the default {0, 1, 2} + set. + +- bpo-34622: Create a dedicated ``asyncio.CancelledError``, + ``asyncio.InvalidStateError`` and ``asyncio.TimeoutError`` exception + classes. Inherit them from corresponding exceptions from + ``concurrent.futures`` package. Extract ``asyncio`` exceptions into a + separate file. + +- bpo-34610: Fixed iterator of :class:`multiprocessing.managers.DictProxy`. + +- bpo-34421: Fix distutils logging for non-ASCII strings. This caused + installation issues on Windows. + +- bpo-34604: Fix possible mojibake in the error message of `pwd.getpwnam` + and `grp.getgrnam` using string representation because of invisible + characters or trailing whitespaces. Patch by William Grzybowski. + +- bpo-30977: Make uuid.UUID use ``__slots__`` to reduce its memory + footprint. Based on original patch by Wouter Bolsterlee. + +- bpo-34574: OrderedDict iterators are not exhausted during pickling + anymore. Patch by Sergey Fedoseev. + +- bpo-8110: Refactored :mod:`subprocess` to check for Windows-specific + modules rather than ``sys.platform == 'win32'``. + +- bpo-34530: ``distutils.spawn.find_executable()`` now falls back on + :data:`os.defpath` if the ``PATH`` environment variable is not set. + +- bpo-34563: On Windows, fix multiprocessing.Connection for very large read: + fix _winapi.PeekNamedPipe() and _winapi.ReadFile() for read larger than + INT_MAX (usually 2^31-1). + +- bpo-34558: Correct typo in Lib/ctypes/_aix.py + +- bpo-34282: Move ``Enum._convert`` to ``EnumMeta._convert_`` and fix enum + members getting shadowed by parent attributes. + +- bpo-22872: When the queue is closed, :exc:`ValueError` is now raised by + :meth:`multiprocessing.Queue.put` and :meth:`multiprocessing.Queue.get` + instead of :exc:`AssertionError` and :exc:`OSError`, respectively. Patch + by Zackery Spytz. + +- bpo-34515: Fix parsing non-ASCII identifiers in + :mod:`lib2to3.pgen2.tokenize` (PEP 3131). + +- bpo-13312: Avoids a possible integer underflow (undefined behavior) in the + time module's year handling code when passed a very low negative year + value. + +- bpo-34472: Improved compatibility for streamed files in :mod:`zipfile`. + Previously an optional signature was not being written and certain ZIP + applications were not supported. Patch by Silas Sewell. + +- bpo-34454: Fix the .fromisoformat() methods of datetime types crashing + when given unicode with non-UTF-8-encodable code points. Specifically, + datetime.fromisoformat() now accepts surrogate unicode code points used as + the separator. Report and tests by Alexey Izbyshev, patch by Paul Ganssle. + +- bpo-6700: Fix inspect.getsourcelines for module level frames/tracebacks. + Patch by Vladimir Matveev. + +- bpo-34171: Running the :mod:`trace` module no longer creates the + ``trace.cover`` file. + +- bpo-34441: Fix crash when an ``ABC``-derived class with invalid + ``__subclasses__`` is passed as the second argument to + :func:`issubclass()`. Patch by Alexey Izbyshev. + +- bpo-34427: Fix infinite loop in ``a.extend(a)`` for ``MutableSequence`` + subclasses. + +- bpo-34412: Make :func:`signal.strsignal` work on HP-UX. Patch by Michael + Osipov. + +- bpo-20849: shutil.copytree now accepts a new ``dirs_exist_ok`` keyword + argument. Patch by Josh Bronson. + +- bpo-31715: Associate ``.mjs`` file extension with + ``application/javascript`` MIME Type. + +- bpo-34384: :func:`os.readlink` now accepts :term:`path-like ` and :class:`bytes` objects on Windows. + +- bpo-22602: The UTF-7 decoder now raises :exc:`UnicodeDecodeError` for + ill-formed sequences starting with "+" (as specified in RFC 2152). Patch + by Zackery Spytz. + +- bpo-2122: The :meth:`mmap.flush() ` method now returns + ``None`` on success, raises an exception on error under all platforms. + +- bpo-34341: Appending to the ZIP archive with the ZIP64 extension no longer + grows the size of extra fields of existing entries. + +- bpo-34333: Fix %-formatting in :meth:`pathlib.PurePath.with_suffix` when + formatting an error message. + +- bpo-18540: The :class:`imaplib.IMAP4` and :class:`imaplib.IMAP4_SSL` + classes now resolve to the local host IP correctly when the default value + of *host* parameter (``''``) is used. + +- bpo-26502: Implement ``traceback.FrameSummary.__len__()`` method to + preserve compatibility with the old tuple API. + +- bpo-34318: :func:`~unittest.TestCase.assertRaises`, + :func:`~unittest.TestCase.assertRaisesRegex`, + :func:`~unittest.TestCase.assertWarns` and + :func:`~unittest.TestCase.assertWarnsRegex` no longer success if the + passed callable is None. They no longer ignore unknown keyword arguments + in the context manager mode. A DeprecationWarning was raised in these + cases since Python 3.5. + +- bpo-9372: Deprecate :meth:`__getitem__` methods of + :class:`xml.dom.pulldom.DOMEventStream`, :class:`wsgiref.util.FileWrapper` + and :class:`fileinput.FileInput`. + +- bpo-33613: Fix a race condition in ``multiprocessing.semaphore_tracker`` + when the tracker receives SIGINT before it can register signal handlers + for ignoring it. + +- bpo-34248: Report filename in the exception raised when the database file + cannot be opened by :func:`dbm.gnu.open` and :func:`dbm.ndbm.open` due to + OS-related error. Patch by Zsolt Cserna. + +- bpo-33089: Add math.dist() to compute the Euclidean distance between two + points. + +- bpo-34246: :meth:`smtplib.SMTP.send_message` no longer modifies the + content of the *mail_options* argument. Patch by Pablo S. Blum de Aguiar. + +- bpo-31047: Fix ``ntpath.abspath`` for invalid paths on windows. Patch by + Franz Woellert. + +- bpo-32321: Add pure Python fallback for functools.reduce. Patch by Robert + Wright. + +- bpo-34270: The default asyncio task class now always has a name which can + be get or set using two new methods (:meth:`~asyncio.Task.get_name()` and + :meth:`~asyncio.Task.set_name`) and is visible in the :func:`repr` output. + An initial name can also be set using the new ``name`` keyword argument to + :func:`asyncio.create_task` or the + :meth:`~asyncio.AbstractEventLoop.create_task` method of the event loop. + If no initial name is set, the default Task implementation generates a + name like ``Task-1`` using a monotonic counter. + +- bpo-34263: asyncio's event loop will not pass timeouts longer than one day + to epoll/select etc. + +- bpo-34035: Fix several AttributeError in zipfile seek() methods. Patch by + Mickaël Schoentgen. + +- bpo-32215: Fix performance regression in :mod:`sqlite3` when a DML + statement appeared in a different line than the rest of the SQL query. + +- bpo-34075: Deprecate passing non-ThreadPoolExecutor instances to + :meth:`AbstractEventLoop.set_default_executor`. + +- bpo-34251: Restore ``msilib.Win64`` to preserve backwards compatibility + since it's already used by :mod:`distutils`' ``bdist_msi`` command. + +- bpo-19891: Ignore errors caused by missing / non-writable homedir while + writing history during exit of an interactive session. Patch by Anthony + Sottile. + +- bpo-33089: Enhanced math.hypot() to support more than two dimensions. + +- bpo-34228: tracemalloc: PYTHONTRACEMALLOC=0 environment variable and -X + tracemalloc=0 command line option are now allowed to disable explicitly + tracemalloc at startup. + +- bpo-13041: Use :func:`shutil.get_terminal_size` to calculate the terminal + width correctly in the ``argparse.HelpFormatter`` class. Initial patch by + Zbyszek Jędrzejewski-Szmek. + +- bpo-34213: Allow frozen dataclasses to have a field named "object". + Previously this conflicted with an internal use of "object". + +- bpo-34052: :meth:`sqlite3.Connection.create_aggregate`, + :meth:`sqlite3.Connection.create_function`, + :meth:`sqlite3.Connection.set_authorizer`, + :meth:`sqlite3.Connection.set_progress_handler` methods raises TypeError + when unhashable objects are passed as callable. These methods now don't + pass such objects to SQLite API. Previous behavior could lead to + segfaults. Patch by Sergey Fedoseev. + +- bpo-34197: Attributes *skipinitialspace*, *doublequote* and *strict* of + the *dialect* attribute of the :mod:`csv` reader are now :class:`bool` + instances instead of integers 0 or 1. + +- bpo-32788: Errors other than :exc:`TypeError` raised in methods + ``__adapt__()`` and ``__conform__()`` in the :mod:`sqlite3` module are now + propagated to the user. + +- bpo-21446: The :2to3fixer:`reload` fixer now uses :func:`importlib.reload` + instead of deprecated :func:`imp.reload`. + +- bpo-940286: pydoc's ``Helper.showtopic()`` method now prints the cross + references of a topic correctly. + +- bpo-34164: :func:`base64.b32decode` could raise UnboundLocalError or + OverflowError for incorrect padding. Now it always raises + :exc:`base64.Error` in these cases. + +- bpo-33729: Fixed issues with arguments parsing in :mod:`hashlib`. + +- bpo-34097: ZipFile can zip files older than 1980-01-01 and newer than + 2107-12-31 using a new ``strict_timestamps`` parameter at the cost of + setting the timestamp to the limit. + +- bpo-34108: Remove extraneous CR in 2to3 refactor. + +- bpo-34070: Make sure to only check if the handle is a tty, when opening a + file with ``buffering=-1``. + +- bpo-27494: Reverted :issue:`27494`. 2to3 rejects now a trailing comma in + generator expressions. + +- bpo-33967: functools.singledispatch now raises TypeError instead of + IndexError when no positional arguments are passed. + +- bpo-34041: Add the parameter *deterministic* to the + :meth:`sqlite3.Connection.create_function` method. Patch by Sergey + Fedoseev. + +- bpo-34056: Ensure the loader shim created by ``imp.load_module`` always + returns bytes from its ``get_data()`` function. This fixes using + ``imp.load_module`` with :pep:`552` hash-based pycs. + +- bpo-34054: The multiprocessing module now uses the monotonic clock + :func:`time.monotonic` instead of the system clock :func:`time.time` to + implement timeout. + +- bpo-34043: Optimize tarfile uncompress performance about 15% when gzip is + used. + +- bpo-34044: ``subprocess.Popen`` now copies the *startupinfo* argument to + leave it unchanged: it will modify the copy, so that the same + ``STARTUPINFO`` object can be used multiple times. + +- bpo-34010: Fixed a performance regression for reading streams with + tarfile. The buffered read should use a list, instead of appending to a + bytes object. + +- bpo-34019: webbrowser: Correct the arguments passed to Opera Browser when + opening a new URL using the ``webbrowser`` module. Patch by Bumsik Kim. + +- bpo-34003: csv.DictReader now creates dicts instead of OrderedDicts. Patch + by Michael Selik. + +- bpo-33978: Closed existing logging handlers before reconfiguration via + fileConfig and dictConfig. Patch by Karthikeyan Singaravelan. + +- bpo-14117: Make minor tweaks to turtledemo. The 'wikipedia' example is now + 'rosette', describing what it draws. The 'penrose' print output is + reduced. The'1024' output of 'tree' is eliminated. + +- bpo-33974: Fixed passing lists and tuples of strings containing special + characters ``"``, ``\``, ``{``, ``}`` and ``\n`` as options to + :mod:`~tkinter.ttk` widgets. + +- bpo-27500: Fix getaddrinfo to resolve IPv6 addresses correctly. + +- bpo-24567: Improve random.choices() to handle subnormal input weights that + could occasionally trigger an IndexError. + +- bpo-33871: Fixed integer overflow in :func:`os.readv`, :func:`os.writev`, + :func:`os.preadv` and :func:`os.pwritev` and in :func:`os.sendfile` with + *headers* or *trailers* arguments (on BSD-based OSes and macOS). + +- bpo-25007: Add :func:`copy.copy` and :func:`copy.deepcopy` support to zlib + compressors and decompressors. Patch by Zackery Spytz. + +- bpo-33929: multiprocessing: Fix a race condition in Popen of + multiprocessing.popen_spawn_win32. The child process now duplicates the + read end of pipe instead of "stealing" it. Previously, the read end of + pipe was "stolen" by the child process, but it leaked a handle if the + child process had been terminated before it could steal the handle from + the parent process. + +- bpo-33899: Tokenize module now implicitly emits a NEWLINE when provided + with input that does not have a trailing new line. This behavior now + matches what the C tokenizer does internally. Contributed by Ammar Askar. + +- bpo-33897: Added a 'force' keyword argument to logging.basicConfig(). + +- bpo-33695: :func:`shutil.copytree` uses :func:`os.scandir` function and + all copy functions depending from it use cached :func:`os.stat` values. + The speedup for copying a directory with 8000 files is around +9% on + Linux, +20% on Windows and + 30% on a Windows SMB share. Also the number + of :func:`os.stat` syscalls is reduced by 38% making + :func:`shutil.copytree` especially faster on network filesystems. + (Contributed by Giampaolo Rodola' in :issue:`33695`.) + +- bpo-33916: bz2 and lzma: When Decompressor.__init__() is called twice, + free the old lock to not leak memory. + +- bpo-32568: Make select.epoll() and its documentation consistent regarding + *sizehint* and *flags*. + +- bpo-33833: Fixed bug in asyncio where ProactorSocketTransport logs + AssertionError if force closed during write. + +- bpo-33663: Convert content length to string before putting to header. + +- bpo-33721: :mod:`os.path` functions that return a boolean result like + :func:`~os.path.exists`, :func:`~os.path.lexists`, :func:`~os.path.isdir`, + :func:`~os.path.isfile`, :func:`~os.path.islink`, and + :func:`~os.path.ismount`, and :mod:`pathlib.Path` methods that return a + boolean result like :meth:`~pathlib.Path.exists()`, + :meth:`~pathlib.Path.is_dir()`, :meth:`~pathlib.Path.is_file()`, + :meth:`~pathlib.Path.is_mount()`, :meth:`~pathlib.Path.is_symlink()`, + :meth:`~pathlib.Path.is_block_device()`, + :meth:`~pathlib.Path.is_char_device()`, :meth:`~pathlib.Path.is_fifo()`, + :meth:`~pathlib.Path.is_socket()` now return ``False`` instead of raising + :exc:`ValueError` or its subclasses :exc:`UnicodeEncodeError` and + :exc:`UnicodeDecodeError` for paths that contain characters or bytes + unrepresentable at the OS level. + +- bpo-26544: Fixed implementation of :func:`platform.libc_ver`. It almost + always returned version '2.9' for glibc. + +- bpo-33843: Remove deprecated ``cgi.escape``, ``cgi.parse_qs`` and + ``cgi.parse_qsl``. + +- bpo-33842: Remove ``tarfile.filemode`` which is deprecated since Python + 3.3. + +- bpo-30167: Prevent site.main() exception if PYTHONSTARTUP is set. Patch by + Steve Weber. + +- bpo-33805: Improve error message of dataclasses.replace() when an InitVar + is not specified + +- bpo-33687: Fix the call to ``os.chmod()`` for ``uu.decode()`` if a mode is + given or decoded. Patch by Timo Furrer. + +- bpo-33812: Datetime instance d with non-None tzinfo, but with + d.tzinfo.utcoffset(d) returning None is now treated as naive by the + astimezone() method. + +- bpo-32108: In configparser, don't clear section when it is assigned to + itself. + +- bpo-27397: Make email module properly handle invalid-length base64 + strings. + +- bpo-33578: Implement multibyte encoder/decoder state methods + +- bpo-30805: Avoid race condition with debug logging + +- bpo-33476: Fix _header_value_parser.py when address group is missing final + ';'. Contributed by Enrique Perez-Terron + +- bpo-33694: asyncio: Fix a race condition causing data loss on + pause_reading()/resume_reading() when using the ProactorEventLoop. + +- bpo-32493: Correct test for ``uuid_enc_be`` availability in + ``configure.ac``. Patch by Michael Felt. + +- bpo-33792: Add asyncio.WindowsSelectorEventLoopPolicy and + asyncio.WindowsProactorEventLoopPolicy. + +- bpo-33274: W3C DOM Level 1 specifies return value of + Element.removeAttributeNode() as "The Attr node that was removed." + xml.dom.minidom now complies with this requirement. + +- bpo-33778: Update ``unicodedata``'s database to Unicode version 11.0.0. + +- bpo-33165: Added a stacklevel parameter to logging calls to allow use of + wrapper/helper functions for logging APIs. + +- bpo-33770: improve base64 exception message for encoded inputs of invalid + length + +- bpo-33769: asyncio/start_tls: Fix error message; cancel callbacks in case + of an unhandled error; mark SSLTransport as closed if it is aborted. + +- bpo-33767: The concatenation (``+``) and repetition (``*``) sequence + operations now raise :exc:`TypeError` instead of :exc:`SystemError` when + performed on :class:`mmap.mmap` objects. Patch by Zackery Spytz. + +- bpo-33734: asyncio/ssl: Fix AttributeError, increase default handshake + timeout + +- bpo-31014: Fixed creating a controller for :mod:`webbrowser` when a user + specifies a path to an entry in the BROWSER environment variable. Based + on patch by John Still. + +- bpo-2504: Add gettext.pgettext() and variants. + +- bpo-33197: Add description property for _ParameterKind + +- bpo-32751: When cancelling the task due to a timeout, + :meth:`asyncio.wait_for` will now wait until the cancellation is complete. + +- bpo-32684: Fix gather to propagate cancellation of itself even with + return_exceptions. + +- bpo-33654: Support protocol type switching in SSLTransport.set_protocol(). + +- bpo-33674: Pause the transport as early as possible to further reduce the + risk of data_received() being called before connection_made(). + +- bpo-33671: :func:`shutil.copyfile`, :func:`shutil.copy`, + :func:`shutil.copy2`, :func:`shutil.copytree` and :func:`shutil.move` use + platform-specific fast-copy syscalls on Linux and macOS in order to copy + the file more efficiently. On Windows :func:`shutil.copyfile` uses a + bigger default buffer size (1 MiB instead of 16 KiB) and a + :func:`memoryview`-based variant of :func:`shutil.copyfileobj` is used. + The speedup for copying a 512MiB file is about +26% on Linux, +50% on + macOS and +40% on Windows. Also, much less CPU cycles are consumed. + (Contributed by Giampaolo Rodola' in :issue:`25427`.) + +- bpo-33674: Fix a race condition in SSLProtocol.connection_made() of + asyncio.sslproto: start immediately the handshake instead of using + call_soon(). Previously, data_received() could be called before the + handshake started, causing the handshake to hang or fail. + +- bpo-31647: Fixed bug where calling write_eof() on a + _SelectorSocketTransport after it's already closed raises AttributeError. + +- bpo-32610: Make asyncio.all_tasks() return only pending tasks. + +- bpo-32410: Avoid blocking on file IO in sendfile fallback code + +- bpo-33469: Fix RuntimeError after closing loop that used run_in_executor + +- bpo-33672: Fix Task.__repr__ crash with Cython's bogus coroutines + +- bpo-33654: Fix transport.set_protocol() to support switching between + asyncio.Protocol and asyncio.BufferedProtocol. Fix loop.start_tls() to + work with asyncio.BufferedProtocols. + +- bpo-33652: Pickles of type variables and subscripted generics are now + future-proof and compatible with older Python versions. + +- bpo-32493: Fixed :func:`uuid.uuid1` on FreeBSD. + +- bpo-33238: Add ``InvalidStateError`` to :mod:`concurrent.futures`. + ``Future.set_result`` and ``Future.set_exception`` now raise + ``InvalidStateError`` if the futures are not pending or running. Patch by + Jason Haydaman. + +- bpo-33618: Finalize and document preliminary and experimental TLS 1.3 + support with OpenSSL 1.1.1 + +- bpo-33625: Release GIL on `grp.getgrnam`, `grp.getgrgid`, `pwd.getpwnam` + and `pwd.getpwuid` if reentrant variants of these functions are available. + Patch by William Grzybowski. + +- bpo-33623: Fix possible SIGSGV when asyncio.Future is created in __del__ + +- bpo-11874: Use a better regex when breaking usage into wrappable parts. + Avoids bogus assertion errors from custom metavar strings. + +- bpo-30877: Fixed a bug in the Python implementation of the JSON decoder + that prevented the cache of parsed strings from clearing after finishing + the decoding. Based on patch by c-fos. + +- bpo-33604: Remove HMAC default to md5 marked for removal in 3.8 (removal + originally planned in 3.6, bump to 3.8 in gh-7062). + +- bpo-33582: Emit a deprecation warning for inspect.formatargspec + +- bpo-21145: Add ``functools.cached_property`` decorator, for computed + properties cached for the life of the instance. + +- bpo-33570: Change TLS 1.3 cipher suite settings for compatibility with + OpenSSL 1.1.1-pre6 and newer. OpenSSL 1.1.1 will have TLS 1.3 ciphers + enabled by default. + +- bpo-28556: Do not simplify arguments to `typing.Union`. Now + `Union[Manager, Employee]` is not simplified to `Employee` at runtime. + Such simplification previously caused several bugs and limited + possibilities for introspection. + +- bpo-12486: :func:`tokenize.generate_tokens` is now documented as a public + API to tokenize unicode strings. It was previously present but + undocumented. + +- bpo-33540: Add a new ``block_on_close`` class attribute to + ``ForkingMixIn`` and ``ThreadingMixIn`` classes of :mod:`socketserver`. + +- bpo-33548: tempfile._candidate_tempdir_list should consider common TEMP + locations + +- bpo-33109: argparse subparsers are once again not required by default, + reverting the change in behavior introduced by bpo-26510 in 3.7.0a2. + +- bpo-33541: Remove unused private method ``_strptime.LocaleTime.__pad`` + (a.k.a. ``_LocaleTime__pad``). + +- bpo-33536: dataclasses.make_dataclass now checks for invalid field names + and duplicate fields. Also, added a check for invalid field + specifications. + +- bpo-33542: Prevent ``uuid.get_node`` from using a DUID instead of a MAC on + Windows. Patch by Zvi Effron + +- bpo-26819: Fix race condition with `ReadTransport.resume_reading` in + Windows proactor event loop. + +- Fix failure in `typing.get_type_hints()` when ClassVar was provided as a + string forward reference. + +- bpo-33516: :class:`unittest.mock.MagicMock` now supports the ``__round__`` + magic method. + +- bpo-28612: Added support for Site Maps to urllib's ``RobotFileParser`` as + :meth:`RobotFileParser.site_maps() + `. Patch by Lady Red, based + on patch by Peter Wirtz. + +- bpo-28167: Remove platform.linux_distribution, which was deprecated since + 3.5. + +- bpo-33504: Switch the default dictionary implementation for + :mod:`configparser` from :class:`collections.OrderedDict` to the standard + :class:`dict` type. + +- bpo-33505: Optimize asyncio.ensure_future() by reordering if checks: 1.17x + faster. + +- bpo-33497: Add errors param to cgi.parse_multipart and make an encoding in + FieldStorage use the given errors (needed for Twisted). Patch by Amber + Brown. + +- bpo-29235: The :class:`cProfile.Profile` class can now be used as a + context manager. Patch by Scott Sanderson. + +- bpo-33495: Change dataclasses.Fields repr to use the repr of each of its + members, instead of str. This makes it more clear what each field + actually represents. This is especially true for the 'type' member. + +- bpo-26103: Correct ``inspect.isdatadescriptor`` to look for ``__set__`` or + ``__delete__``. Patch by Aaron Hall. + +- bpo-29209: Removed the ``doctype()`` method and the *html* parameter of + the constructor of :class:`~xml.etree.ElementTree.XMLParser`. The + ``doctype()`` method defined in a subclass will no longer be called. + Deprecated methods ``getchildren()`` and ``getiterator()`` in the + :mod:`~xml.etree.ElementTree` module emit now a :exc:`DeprecationWarning` + instead of :exc:`PendingDeprecationWarning`. + +- bpo-33453: Fix dataclasses to work if using literal string type + annotations or if using PEP 563 "Postponed Evaluation of Annotations". + Only specific string prefixes are detected for both ClassVar ("ClassVar" + and "typing.ClassVar") and InitVar ("InitVar" and "dataclasses.InitVar"). + +- bpo-28556: Minor fixes in typing module: add annotations to + ``NamedTuple.__new__``, pass ``*args`` and ``**kwds`` in + ``Generic.__new__``. Original PRs by Paulius Šarka and Chad Dombrova. + +- bpo-33365: Print the header values besides the header keys instead just + the header keys if *debuglevel* is set to >0 in :mod:`http.client`. Patch + by Marco Strigl. + +- bpo-20087: Updated alias mapping with glibc 2.27 supported locales. + +- bpo-33422: Fix trailing quotation marks getting deleted when looking up + byte/string literals on pydoc. Patch by Andrés Delfino. + +- bpo-28167: The function ``platform.linux_distribution`` and + ``platform.dist`` now trigger a ``DeprecationWarning`` and have been + marked for removal in Python 3.8 + +- bpo-33281: Fix ctypes.util.find_library regression on macOS. + +- bpo-33311: Text and html output generated by cgitb does not display + parentheses if the current call is done directly in the module. Patch by + Stéphane Blondon. + +- bpo-27300: The file classes in *tempfile* now accept an *errors* parameter + that complements the already existing *encoding*. Patch by Stephan Hohe. + +- bpo-32933: :func:`unittest.mock.mock_open` now supports iteration over the + file contents. Patch by Tony Flury. + +- bpo-33217: Raise :exc:`TypeError` when looking up non-Enum objects in Enum + classes and Enum members. + +- bpo-33197: Update error message when constructing invalid + inspect.Parameters Patch by Dong-hee Na. + +- bpo-33383: Fixed crash in the get() method of the :mod:`dbm.ndbm` database + object when it is called with a single argument. + +- bpo-33375: The warnings module now finds the Python file associated with a + warning from the code object, rather than the frame's global namespace. + This is consistent with how tracebacks and pdb find filenames, and should + work better for dynamically executed code. + +- bpo-33336: ``imaplib`` now allows ``MOVE`` command in ``IMAP4.uid()`` (RFC + 6851: IMAP MOVE Extension) and potentially as a name of supported method + of ``IMAP4`` object. + +- bpo-32455: Added *jump* parameter to :func:`dis.stack_effect`. + +- bpo-27485: Rename and deprecate undocumented functions in + :func:`urllib.parse`. + +- bpo-33332: Add ``signal.valid_signals()`` to expose the POSIX sigfillset() + functionality. + +- bpo-33251: `ConfigParser.items()` was fixed so that key-value pairs passed + in via `vars` are not included in the resulting output. + +- bpo-33329: Fix multiprocessing regression on newer glibcs + +- bpo-33334: :func:`dis.stack_effect` now supports all defined opcodes + including NOP and EXTENDED_ARG. + +- bpo-991266: Fix quoting of the ``Comment`` attribute of + :class:`http.cookies.SimpleCookie`. + +- bpo-33131: Upgrade bundled version of pip to 10.0.1. + +- bpo-33308: Fixed a crash in the :mod:`parser` module when converting an ST + object to a tree of tuples or lists with ``line_info=False`` and + ``col_info=True``. + +- bpo-23403: lib2to3 now uses pickle protocol 4 for pre-computed grammars. + +- bpo-33266: lib2to3 now recognizes ``rf'...'`` strings. + +- bpo-11594: Ensure line-endings are respected when using lib2to3. + +- bpo-33254: Have :func:`importlib.resources.contents` and + :meth:`importlib.abc.ResourceReader.contents` return an :term:`iterable` + instead of an :term:`iterator`. + +- bpo-33265: ``contextlib.ExitStack`` and ``contextlib.AsyncExitStack`` now + use a method instead of a wrapper function for exit callbacks. + +- bpo-33263: Fix FD leak in `_SelectorSocketTransport` Patch by Vlad + Starostin. + +- bpo-33256: Fix display of ```` call in the html produced by + ``cgitb.html()``. Patch by Stéphane Blondon. + +- bpo-33144: ``random.Random()`` and its subclassing mechanism got optimized + to check only once at class/subclass instantiation time whether its + ``getrandbits()`` method can be relied on by other methods, including + ``randrange()``, for the generation of arbitrarily large random integers. + Patch by Wolfgang Maier. + +- bpo-33185: Fixed regression when running pydoc with the :option:`-m` + switch. (The regression was introduced in 3.7.0b3 by the resolution of + :issue:`33053`) + + This fix also changed pydoc to add ``os.getcwd()`` to :data:`sys.path` + when necessary, rather than adding ``"."``. + +- bpo-29613: Added support for the ``SameSite`` cookie flag to the + ``http.cookies`` module. + +- bpo-33169: Delete entries of ``None`` in :data:`sys.path_importer_cache` + when :meth:`importlib.machinery.invalidate_caches` is called. + +- bpo-33203: ``random.Random.choice()`` now raises ``IndexError`` for empty + sequences consistently even when called from subclasses without a + ``getrandbits()`` implementation. + +- bpo-33224: Update difflib.mdiff() for :pep:`479`. Convert an uncaught + StopIteration in a generator into a return-statement. + +- bpo-33209: End framing at the end of C implementation of + :func:`pickle.Pickler.dump`. + +- bpo-32861: The urllib.robotparser's ``__str__`` representation now + includes wildcard entries and the "Crawl-delay" and "Request-rate" fields. + Also removes extra newlines that were being appended to the end of the + string. Patch by Michael Lazar. + +- bpo-23403: ``DEFAULT_PROTOCOL`` in :mod:`pickle` was bumped to 4. Protocol + 4 is described in :pep:`3154` and available since Python 3.4. It offers + better performance and smaller size compared to protocol 3 introduced in + Python 3.0. + +- bpo-20104: Improved error handling and fixed a reference leak in + :func:`os.posix_spawn()`. + +- bpo-33106: Deleting a key from a read-only dbm database raises module + specific error instead of KeyError. + +- bpo-33175: In dataclasses, Field.__set_name__ now looks up the + __set_name__ special method on the class, not the instance, of the default + value. + +- bpo-32380: Create functools.singledispatchmethod to support generic single + dispatch on descriptors and methods. + +- bpo-33141: Have Field objects pass through __set_name__ to their default + values, if they have their own __set_name__. + +- bpo-33096: Allow ttk.Treeview.insert to insert iid that has a false + boolean value. Note iid=0 and iid=False would be same. Patch by Garvit + Khatri. + +- bpo-32873: Treat type variables and special typing forms as immutable by + copy and pickle. This fixes several minor issues and inconsistencies, and + improves backwards compatibility with Python 3.6. + +- bpo-33134: When computing dataclass's __hash__, use the lookup table to + contain the function which returns the __hash__ value. This is an + improvement over looking up a string, and then testing that string to see + what to do. + +- bpo-33127: The ssl module now compiles with LibreSSL 2.7.1. + +- bpo-32505: Raise TypeError if a member variable of a dataclass is of type + Field, but doesn't have a type annotation. + +- bpo-33078: Fix the failure on OSX caused by the tests relying on + sem_getvalue + +- bpo-33116: Add 'Field' to dataclasses.__all__. + +- bpo-32896: Fix an error where subclassing a dataclass with a field that + uses a default_factory would generate an incorrect class. + +- bpo-33100: Dataclasses: If a field has a default value that's a + MemberDescriptorType, then it's from that field being in __slots__, not an + actual default value. + +- bpo-32953: If a non-dataclass inherits from a frozen dataclass, allow + attributes to be added to the derived class. Only attributes from the + frozen dataclass cannot be assigned to. Require all dataclasses in a + hierarchy to be either all frozen or all non-frozen. + +- bpo-33097: Raise RuntimeError when ``executor.submit`` is called during + interpreter shutdown. + +- bpo-32968: Modulo and floor division involving Fraction and float should + return float. + +- bpo-33061: Add missing ``NoReturn`` to ``__all__`` in typing.py + +- bpo-33078: Fix the size handling in multiprocessing.Queue when a pickling + error occurs. + +- bpo-33064: lib2to3 now properly supports trailing commas after ``*args`` + and ``**kwargs`` in function signatures. + +- bpo-33056: FIX properly close leaking fds in + concurrent.futures.ProcessPoolExecutor. + +- bpo-33021: Release the GIL during fstat() calls, avoiding hang of all + threads when calling mmap.mmap(), os.urandom(), and random.seed(). Patch + by Nir Soffer. + +- bpo-31804: Avoid failing in multiprocessing.Process if the standard + streams are closed or None at exit. + +- bpo-33034: Providing an explicit error message when casting the port + property to anything that is not an integer value using ``urlparse()`` and + ``urlsplit()``. Patch by Matt Eaton. + +- bpo-30249: Improve struct.unpack_from() exception messages for problems + with the buffer size and offset. + +- bpo-33037: Skip sending/receiving data after SSL transport closing. + +- bpo-27683: Fix a regression in :mod:`ipaddress` that result of + :meth:`hosts` is empty when the network is constructed by a tuple + containing an integer mask and only 1 bit left for addresses. + +- bpo-22674: Add the strsignal() function in the signal module that returns + the system description of the given signal, as returned by strsignal(3). + +- bpo-32999: Fix C implementation of ``ABC.__subclasscheck__(cls, + subclass)`` crashed when ``subclass`` is not a type object. + +- bpo-33009: Fix inspect.signature() for single-parameter partialmethods. + +- bpo-32969: Expose several missing constants in zlib and fix corresponding + documentation. + +- bpo-32056: Improved exceptions raised for invalid number of channels and + sample width when read an audio file in modules :mod:`aifc`, :mod:`wave` + and :mod:`sunau`. + +- bpo-32970: Improved disassembly of the MAKE_FUNCTION instruction. + +- bpo-32844: Fix wrong redirection of a low descriptor (0 or 1) to stderr in + subprocess if another low descriptor is closed. + +- bpo-32960: For dataclasses, disallow inheriting frozen from non-frozen + classes, and also disallow inheriting non-frozen from frozen classes. This + restriction will be relaxed at a future date. + +- bpo-32713: Fixed tarfile.itn handling of out-of-bounds float values. Patch + by Joffrey Fuhrer. + +- bpo-32257: The ssl module now contains OP_NO_RENEGOTIATION constant, + available with OpenSSL 1.1.0h or 1.1.1. + +- bpo-32951: Direct instantiation of SSLSocket and SSLObject objects is now + prohibited. The constructors were never documented, tested, or designed as + public constructors. Users were suppose to use ssl.wrap_socket() or + SSLContext. + +- bpo-32929: Remove the tri-state parameter "hash", and add the boolean + "unsafe_hash". If unsafe_hash is True, add a __hash__ function, but if a + __hash__ exists, raise TypeError. If unsafe_hash is False, add a __hash__ + based on the values of eq= and frozen=. The unsafe_hash=False behavior is + the same as the old hash=None behavior. unsafe_hash=False is the default, + just as hash=None used to be. + +- bpo-32947: Add OP_ENABLE_MIDDLEBOX_COMPAT and test workaround for TLSv1.3 + for future compatibility with OpenSSL 1.1.1. + +- bpo-32146: Document the interaction between frozen executables and the + spawn and forkserver start methods in multiprocessing. + +- bpo-30622: The ssl module now detects missing NPN support in LibreSSL. + +- bpo-32922: dbm.open() now encodes filename with the filesystem encoding + rather than default encoding. + +- bpo-32759: Free unused arenas in multiprocessing.heap. + +- bpo-32859: In ``os.dup2``, don't check every call whether the ``dup3`` + syscall exists or not. + +- bpo-32556: nt._getfinalpathname, nt._getvolumepathname and + nt._getdiskusage now correctly convert from bytes. + +- bpo-21060: Rewrite confusing message from setup.py upload from "No dist + file created in earlier command" to the more helpful "Must create and + upload files in one command". + +- bpo-32857: In :mod:`tkinter`, ``after_cancel(None)`` now raises a + :exc:`ValueError` instead of canceling the first scheduled function. + Patch by Cheryl Sabella. + +- bpo-32852: Make sure sys.argv remains as a list when running trace. + +- bpo-31333: ``_abc`` module is added. It is a speedup module with C + implementations for various functions and methods in ``abc``. Creating an + ABC subclass and calling ``isinstance`` or ``issubclass`` with an ABC + subclass are up to 1.5x faster. In addition, this makes Python start-up up + to 10% faster. + + Note that the new implementation hides internal registry and caches, + previously accessible via private attributes ``_abc_registry``, + ``_abc_cache``, and ``_abc_negative_cache``. There are three debugging + helper methods that can be used instead ``_dump_registry``, + ``_abc_registry_clear``, and ``_abc_caches_clear``. + +- bpo-32841: Fixed `asyncio.Condition` issue which silently ignored + cancellation after notifying and cancelling a conditional lock. Patch by + Bar Harel. + +- bpo-32819: ssl.match_hostname() has been simplified and no longer depends + on re and ipaddress module for wildcard and IP addresses. Error reporting + for invalid wildcards has been improved. + +- bpo-19675: ``multiprocessing.Pool`` no longer leaks processes if its + initialization fails. + +- bpo-32394: socket: Remove + TCP_FASTOPEN,TCP_KEEPCNT,TCP_KEEPIDLE,TCP_KEEPINTVL flags on older version + Windows during run-time. + +- bpo-31787: Fixed refleaks of ``__init__()`` methods in various modules. + (Contributed by Oren Milman) + +- bpo-30157: Fixed guessing quote and delimiter in csv.Sniffer.sniff() when + only the last field is quoted. Patch by Jake Davis. + +- bpo-30688: Added support of ``\N{name}`` escapes in regular expressions. + Based on patch by Jonathan Eunice. + +- bpo-32792: collections.ChainMap() preserves the order of the underlying + mappings. + +- bpo-32775: :func:`fnmatch.translate()` no longer produces patterns which + contain set operations. Sets starting with '[' or containing '--', '&&', + '~~' or '||' will be interpreted differently in regular expressions in + future versions. Currently they emit warnings. fnmatch.translate() now + avoids producing patterns containing such sets by accident. + +- bpo-32622: Implement native fast sendfile for Windows proactor event loop. + +- bpo-32777: Fix a rare but potential pre-exec child process deadlock in + subprocess on POSIX systems when marking file descriptors inheritable on + exec in the child process. This bug appears to have been introduced in + 3.4. + +- bpo-32647: The ctypes module used to depend on indirect linking for + dlopen. The shared extension is now explicitly linked against libdl on + platforms with dl. + +- bpo-32749: A :mod:`dbm.dumb` database opened with flags 'r' is now + read-only. :func:`dbm.dumb.open` with flags 'r' and 'w' no longer creates + a database if it does not exist. + +- bpo-32741: Implement ``asyncio.TimerHandle.when()`` method. + +- bpo-32691: Use mod_spec.parent when running modules with pdb + +- bpo-32734: Fixed ``asyncio.Lock()`` safety issue which allowed acquiring + and locking the same lock multiple times, without it being free. Patch by + Bar Harel. + +- bpo-32727: Do not include name field in SMTP envelope from address. Patch + by Stéphane Wirtel + +- bpo-31453: Add TLSVersion constants and SSLContext.maximum_version / + minimum_version attributes. The new API wraps OpenSSL 1.1 + https://www.openssl.org/docs/man1.1.0/ssl/SSL_CTX_set_min_proto_version.html + feature. + +- bpo-24334: Internal implementation details of ssl module were cleaned up. + The SSLSocket has one less layer of indirection. Owner and session + information are now handled by the SSLSocket and SSLObject constructor. + Channel binding implementation has been simplified. + +- bpo-31848: Fix the error handling in Aifc_read.initfp() when the SSND + chunk is not found. Patch by Zackery Spytz. + +- bpo-32585: Add Ttk spinbox widget to :mod:`tkinter.ttk`. Patch by Alan D + Moore. + +- bpo-32512: :mod:`profile` CLI accepts `-m module_name` as an alternative + to script path. + +- bpo-8525: help() on a type now displays builtin subclasses. This is + intended primarily to help with notification of more specific exception + subclasses. + + Patch by Sanyam Khurana. + +- bpo-31639: http.server now exposes a ThreadingHTTPServer class and uses it + when the module is run with ``-m`` to cope with web browsers pre-opening + sockets. + +- bpo-29877: compileall: import ProcessPoolExecutor only when needed, + preventing hangs on low resource platforms + +- bpo-32221: Various functions returning tuple containing IPv6 addresses now + omit ``%scope`` part since the same information is already encoded in + *scopeid* tuple item. Especially this speeds up :func:`socket.recvfrom` + when it receives multicast packet since useless resolving of network + interface name is omitted. + +- bpo-32147: :func:`binascii.unhexlify` is now up to 2 times faster. Patch + by Sergey Fedoseev. + +- bpo-30693: The TarFile class now recurses directories in a reproducible + way. + +- bpo-30693: The ZipFile class now recurses directories in a reproducible + way. + +- bpo-31680: Added :data:`curses.ncurses_version`. + +- bpo-31908: Fix output of cover files for ``trace`` module command-line + tool. Previously emitted cover files only when ``--missing`` option was + used. Patch by Michael Selik. + +- bpo-31608: Raise a ``TypeError`` instead of crashing if a + ``collections.deque`` subclass returns a non-deque from ``__new__``. Patch + by Oren Milman. + +- bpo-31425: Add support for sockets of the AF_QIPCRTR address family, + supported by the Linux kernel. This is used to communicate with services, + such as GPS or radio, running on Qualcomm devices. Patch by Bjorn + Andersson. + +- bpo-22005: Implemented unpickling instances of + :class:`~datetime.datetime`, :class:`~datetime.date` and + :class:`~datetime.time` pickled by Python 2. ``encoding='latin1'`` should + be used for successful decoding. + +- bpo-27645: :class:`sqlite3.Connection` now exposes a + :class:`~sqlite3.Connection.backup` method, if the underlying SQLite + library is at version 3.6.11 or higher. Patch by Lele Gaifax. + +- bpo-16865: Support arrays >=2GiB in :mod:`ctypes`. Patch by Segev Finer. + +- bpo-31508: Removed support of arguments in + `tkinter.ttk.Treeview.selection`. It was deprecated in 3.6. Use + specialized methods like `selection_set` for changing the selection. + +- bpo-29456: Fix bugs in hangul normalization: u1176, u11a7 and u11c3 + +Documentation +------------- + +- bpo-21257: Document :func:`http.client.parse_headers`. + +- bpo-34764: Improve example of iter() with 2nd sentinel argument. + +- bpo-35564: Explicitly set master_doc variable in conf.py for compliance + with Sphinx 2.0 + +- bpo-35511: Specified that profile.Profile class doesn't not support enable + or disable methods. Also, elaborated that Profile object as a context + manager is only supported in cProfile module. + +- bpo-10536: Enhance the gettext docs. Patch by Éric Araujo + +- bpo-35089: Remove mention of ``typing.io`` and ``typing.re``. Their types + should be imported from ``typing`` directly. + +- bpo-35038: Fix the documentation about an unexisting `f_restricted` + attribute in the frame object. Patch by Stéphane Wirtel + +- bpo-35042: Replace PEP XYZ by the pep role and allow to use the direct + links to the PEPs. + +- bpo-35044: Fix the documentation with the role ``exc`` for the + appropriated exception. Patch by Stéphane Wirtel + +- bpo-35035: Rename documentation for :mod:`email.utils` to + ``email.utils.rst``. + +- bpo-34967: Use app.add_object_type() instead of the deprecated Sphinx + function app.description_unit() + +- bpo-34913: Add documentation about the new command line interface of the + gzip module. + +- bpo-32174: chm document displays non-ASCII charaters properly on some MBCS + Windows systems. + +- bpo-11233: Create availability directive for documentation. Original + patch by Georg Brandl. + +- bpo-34790: Document how passing coroutines to asyncio.wait() can be + confusing. + +- bpo-34552: Make clear that ``==`` operator sometimes is equivalent to + `is`. The ``<``, ``<=``, ``>`` and ``>=`` operators are only defined where + they make sense. + +- bpo-28617: Fixed info in the stdtypes docs concerning the types that + support membership tests. + +- bpo-20177: Migrate datetime.date.fromtimestamp to Argument Clinic. Patch + by Tim Hoffmann. + +- bpo-34065: Fix wrongly written basicConfig documentation markup syntax + +- bpo-33460: replaced ellipsis with correct error codes in tutorial chapter + 3. + +- bpo-33847: Add '@' operator entry to index. + +- bpo-33409: Clarified the relationship between :pep:`538`'s + PYTHONCOERCECLOCALE and PEP 540's PYTHONUTF8 mode. + +- bpo-33197: Add versionadded tag to the documentation of + ParameterKind.description + +- bpo-17045: Improve the C-API doc for PyTypeObject. This includes adding + several quick-reference tables and a lot of missing slot/typedef entries. + The existing entries were also cleaned up with a slightly more consistent + format. + +- bpo-33736: Improve the documentation of :func:`asyncio.open_connection`, + :func:`asyncio.start_server` and their UNIX socket counterparts. + +- bpo-23859: Document that `asyncio.wait()` does not cancel its futures on + timeout. + +- bpo-32436: Document :pep:`567` changes to asyncio. + +- bpo-33604: Update HMAC md5 default to a DeprecationWarning, bump removal + to 3.8. + +- bpo-33594: Document ``getargspec``, ``from_function`` and ``from_builtin`` + as deprecated in their respective docstring, and include version since + deprecation in DeprecationWarning message. + +- bpo-33503: Fix broken pypi link + +- bpo-33421: Add missing documentation for ``typing.AsyncContextManager``. + +- bpo-33487: BZ2file now emit a DeprecationWarning when buffering=None is + passed, the deprecation message and documentation also now explicitly + state it is deprecated since 3.0. + +- bpo-33378: Add Korean language switcher for https://docs.python.org/3/ + +- bpo-33276: Clarify that the ``__path__`` attribute on modules cannot be + just any value. + +- bpo-33201: Modernize documentation for writing C extension types. + +- bpo-33195: Deprecate ``Py_UNICODE`` usage in ``c-api/arg`` document. + ``Py_UNICODE`` related APIs are deprecated since Python 3.3, but it is + missed in the document. + +- bpo-33126: Document PyBuffer_ToContiguous(). + +- bpo-27212: Modify documentation for the :func:`islice` recipe to consume + initial values up to the start index. + +- bpo-28247: Update :mod:`zipapp` documentation to describe how to make + standalone applications. + +- bpo-18802: Documentation changes for ipaddress. Patch by Jon Foster and + Berker Peksag. + +- bpo-27428: Update documentation to clarify that ``WindowsRegistryFinder`` + implements ``MetaPathFinder``. (Patch by Himanshu Lakhara) + +- bpo-28124: The ssl module function ssl.wrap_socket() has been + de-emphasized and deprecated in favor of the more secure and efficient + SSLContext.wrap_socket() method. + +- bpo-17232: Clarify docs for -O and -OO. Patch by Terry Reedy. + +- bpo-32436: Add documentation for the contextvars module (PEP 567). + +- bpo-32800: Update link to w3c doc for xml default namespaces. + +- bpo-11015: Update :mod:`test.support` documentation. + +- bpo-32613: Update the faq/windows.html to use the py command from PEP 397 + instead of python. + +- bpo-8722: Document :meth:`__getattr__` behavior when property :meth:`get` + method raises :exc:`AttributeError`. + +- bpo-32614: Modify RE examples in documentation to use raw strings to + prevent :exc:`DeprecationWarning` and add text to REGEX HOWTO to highlight + the deprecation. + +- bpo-20709: Remove the paragraph where we explain that os.utime() does not + support a directory as path under Windows. Patch by Jan-Philip Gehrcke + +- bpo-32722: Remove the bad example in the tutorial of the Generator + Expression. Patch by Stéphane Wirtel + +- bpo-31972: Improve docstrings for `pathlib.PurePath` subclasses. + +- bpo-30607: Use the externalized ``python-docs-theme`` package when + building the documentation. + +- bpo-8243: Add a note about curses.addch and curses.addstr exception + behavior when writing outside a window, or pad. + +- bpo-32337: Update documentation related with ``dict`` order. + +- bpo-25041: Document ``AF_PACKET`` in the :mod:`socket` module. + +- bpo-31432: Clarify meaning of CERT_NONE, CERT_OPTIONAL, and CERT_REQUIRED + flags for ssl.SSLContext.verify_mode. + +Tests +----- + +- bpo-35772: Fix sparse file tests of test_tarfile on ppc64 with the tmpfs + filesystem. Fix the function testing if the filesystem supports sparse + files: create a file which contains data and "holes", instead of creating + a file which contains no data. tmpfs effective block size is a page size + (tmpfs lives in the page cache). RHEL uses 64 KiB pages on aarch64, ppc64, + ppc64le, only s390x and x86_64 use 4 KiB pages, whereas the test punch + holes of 4 KiB. + +- bpo-35045: Make ssl tests less strict and also accept TLSv1 as system + default. The changes unbreaks test_min_max_version on Fedora 29. + +- bpo-32710: ``test_asyncio/test_sendfile.py`` now resets the event loop + policy using :func:`tearDownModule` as done in other tests, to prevent a + warning when running tests on Windows. + +- bpo-33717: test.pythoninfo now logs information of all clocks, not only + time.time() and time.perf_counter(). + +- bpo-35488: Add a test to pathlib's Path.match() to verify it does not + support glob-style ** recursive pattern matching. + +- bpo-31731: Fix a race condition in ``check_interrupted_write()`` of + test_io: create directly the thread with SIGALRM signal blocked, rather + than blocking the signal later from the thread. Previously, it was + possible that the thread gets the signal before the signal is blocked. + +- bpo-35424: Fix test_multiprocessing_main_handling: use + :class:`multiprocessing.Pool` with a context manager and then explicitly + join the pool. + +- bpo-35519: Rename :mod:`test.bisect` module to :mod:`test.bisect_cmd` to + avoid conflict with :mod:`bisect` module when running directly a test like + ``./python Lib/test/test_xmlrpc.py``. + +- bpo-35513: Replace :func:`time.time` with :func:`time.monotonic` in tests + to measure time delta. + +- bpo-34279: :func:`test.support.run_unittest` no longer raise + :exc:`TestDidNotRun` if the test result contains skipped tests. The + exception is now only raised if no test have been run and no test have + been skipped. + +- bpo-35412: Add testcase to ``test_future4``: check unicode literal. + +- bpo-26704: Added test demonstrating double-patching of an instance method. + Patch by Anthony Sottile. + +- bpo-33725: test_multiprocessing_fork may crash on recent versions of + macOS. Until the issue is resolved, skip the test on macOS. + +- bpo-35352: Modify test_asyncio to use the certificate set from the test + directory. + +- bpo-35317: Fix ``mktime()`` overflow error in ``test_email``: run + ``test_localtime_daylight_true_dst_true()`` and + ``test_localtime_daylight_false_dst_true()`` with a specific timezone. + +- bpo-21263: After several reports that test_gdb does not work properly on + macOS and since gdb is not shipped by default anymore, test_gdb is now + skipped on macOS when LLVM Clang has been used to compile Python. Patch by + Lysandros Nikolaou + +- bpo-34279: regrtest issue a warning when no tests have been executed in a + particular test file. Also, a new final result state is issued if no test + have been executed across all test files. Patch by Pablo Galindo. + +- bpo-34962: make docstest in Doc now passes., and is enforced in CI + +- bpo-23596: Use argparse for the command line of the gzip module. Patch by + Antony Lee + +- bpo-34537: Fix ``test_gdb.test_strings()`` when ``LC_ALL=C`` and GDB was + compiled with Python 3.6 or earlier. + +- bpo-34587: test_socket: Remove RDSTest.testCongestion(). The test tries to + fill the receiver's socket buffer and expects an error. But the RDS + protocol doesn't require that. Moreover, the Linux implementation of RDS + expects that the producer of the messages reduces its rate, it's not the + role of the receiver to trigger an error. The test fails on Fedora 28 by + design, so just remove it. + +- bpo-34661: Fix test_shutil if unzip doesn't support -t. + +- bpo-34200: Fixed non-deterministic flakiness of test_pkg by not using the + scary test.support.module_cleanup() logic to save and restore sys.modules + contents between test cases. + +- bpo-34569: The experimental PEP 554 data channels now correctly pass + negative PyLong objects between subinterpreters on 32-bit systems. Patch + by Michael Felt. + +- bpo-34594: Fix usage of hardcoded ``errno`` values in the tests. + +- bpo-34579: Fix test_embed for AIX Patch by Michael Felt + +- bpo-34542: Use 3072 RSA keys and SHA-256 signature for test certs and + keys. + +- bpo-11193: Remove special condition for AIX in + `test_subprocess.test_undecodable_env` + +- bpo-34347: Fix `test_utf8_mode.test_cmd_line` for AIX + +- bpo-34490: On AIX with AF_UNIX family sockets getsockname() does not + provide 'sockname', so skip calls to transport.get_extra_info('sockname') + +- bpo-34391: Fix ftplib test for TLS 1.3 by reading from data socket. + +- bpo-11192: Fix `test_socket` on AIX 6.1 and later IPv6 zone id supports + only supported by inet_pton6_zone() Switch to runtime-based + platform.system() to establish current platform rather than build-time + based sys.platform() + +- bpo-34399: Update all RSA keys and DH params to use at least 2048 bits. + +- bpo-34373: Fix ``test_mktime`` and ``test_pthread_getcpuclickid`` tests + for AIX Add range checking for ``_PyTime_localtime`` for AIX Patch by + Michael Felt + +- bpo-11191: Skip the distutils test 'test_search_cpp' when using XLC as + compiler patch by aixtools (Michael Felt) + +- Improved an error message when mock assert_has_calls fails. + +- bpo-33746: Fix test_unittest when run in verbose mode. + +- bpo-33901: Fix test_dbm_gnu on macOS with gdbm 1.15: add a larger value to + make sure that the file size changes. + +- bpo-33873: Fix a bug in ``regrtest`` that caused an extra test to run if + --huntrleaks/-R was used. Exit with error in case that invalid parameters + are specified to --huntrleaks/-R (at least one warmup run and one + repetition must be used). + +- bpo-33562: Check that a global asyncio event loop policy is not left + behind by any tests. + +- bpo-33655: Ignore test_posix_fallocate failures on BSD platforms that + might be due to running on ZFS. + +- bpo-32962: Fixed test_gdb when Python is compiled with flags -mcet + -fcf-protection -O0. + +- bpo-33358: Fix ``test_embed.test_pre_initialization_sys_options()`` when + the interpreter is built with ``--enable-shared``. + +- bpo-32872: Avoid regrtest compatibility issue with namespace packages. + +- bpo-32517: Fix failing ``test_asyncio`` on macOS 10.12.2+ due to transport + of ``KqueueSelector`` loop was not being closed. + +- bpo-32663: Making sure the `SMTPUTF8SimTests` class of tests gets run in + test_smtplib.py. + +- bpo-27643: Test_C test case needs "signed short" bitfields, but the IBM + XLC compiler (on AIX) does not support this Skip the code and test when + AIX and XLC are used + + Applicable to Python2-2.7 and later + +- bpo-19417: Add test_bdb.py. + +- bpo-31809: Add tests to verify connection with secp ECDH curves. + +Build +----- + +- bpo-34691: The _contextvars module is now built into the core Python + library on Windows. + +- bpo-35683: Improved Azure Pipelines build steps and now verifying layouts + correctly + +- bpo-35642: Remove asynciomodule.c from pythoncore.vcxproj + +- bpo-35550: Fix incorrect Solaris #ifdef checks to look for __sun && __SVR4 + instead of sun when compiling. + +- bpo-35499: ``make profile-opt`` no longer replaces ``CFLAGS_NODIST`` with + ``CFLAGS``. It now adds profile-guided optimization (PGO) flags to + ``CFLAGS_NODIST``: existing ``CFLAGS_NODIST`` flags are kept. + +- bpo-35257: Avoid leaking the linker flags from Link Time Optimizations + (LTO) into distutils when compiling C extensions. + +- bpo-35351: When building Python with clang and LTO, LTO flags are no + longer passed into CFLAGS to build third-party C extensions through + distutils. + +- bpo-35139: Fix a compiler error when statically linking `pyexpat` in + `Modules/Setup`. + +- bpo-35059: PCbuild: Set InlineFunctionExpansion to OnlyExplicitInline + ("/Ob1" option) in pyproject.props in Debug mode to expand functions + marked as inline. This change should make Python compiled in Debug mode a + little bit faster on Windows. + +- bpo-35011: Restores the use of pyexpatns.h to isolate our embedded copy of + the expat C library so that its symbols do not conflict at link or dynamic + loading time with an embedding application or other extension modules with + their own version of libexpat. + +- bpo-28015: Have --with-lto works correctly with clang. + +- bpo-34765: Update the outdated install-sh file to the latest revision from + automake v1.16.1 + +- bpo-34585: Check for floating-point byte order in configure.ac using + compilation tests instead of executing code, so that these checks work in + cross-compiled builds. + +- bpo-34710: Fixed SSL module build with OpenSSL & pedantic CFLAGS. + +- bpo-34582: Add JUnit XML output for regression tests and update Azure + DevOps builds. + +- bpo-34081: Make Sphinx warnings as errors in the Docs Makefile. + +- bpo-34555: Fix for case where it was not possible to have both + ``HAVE_LINUX_VM_SOCKETS_H`` and ``HAVE_SOCKADDR_ALG`` be undefined. + +- bpo-33015: Fix an undefined behaviour in the pthread implementation of + :c:func:`PyThread_start_new_thread`: add a function wrapper to always + return ``NULL``. + +- bpo-34245: The Python shared library is now installed with write + permission (mode 0755), which is the standard way of installing such + libraries. + +- bpo-34121: Fix detection of C11 atomic support on clang. + +- bpo-32430: Rename Modules/Setup.dist to Modules/Setup, and remove the + necessity to copy the former manually to the latter when updating the + local source tree. + +- bpo-30345: Add -g to LDFLAGS when compiling with LTO to get debug symbols. + +- bpo-5755: Move ``-Wstrict-prototypes`` option to ``CFLAGS_NODIST`` from + ``OPT``. This option emitted annoying warnings when building extension + modules written in C++. + +- bpo-33614: Ensures module definition files for the stable ABI on Windows + are correctly regenerated. + +- bpo-33648: The --with-c-locale-warning configuration flag has been + removed. It has had no effect for about a year. + +- bpo-33522: Enable CI builds on Visual Studio Team Services at + https://python.visualstudio.com/cpython + +- bpo-33512: configure's check for "long double" has been simplified + +- bpo-33483: C compiler is now correctly detected from the standard + environment variables. --without-gcc and --with-icc options have been + removed. + +- bpo-33394: Enable the verbose build for extension modules, when GNU make + is passed macros on the command line. + +- bpo-33393: Update config.guess and config.sub files. + +- bpo-33377: Add new triplets for mips r6 and riscv variants (used in + extension suffixes). + +- bpo-32232: By default, modules configured in `Modules/Setup` are no longer + built with `-DPy_BUILD_CORE`. Instead, modules that specifically need that + preprocessor definition include it in their individual entries. + +- bpo-33182: The embedding tests can once again be built with clang 6.0 + +- bpo-33163: Upgrade pip to 9.0.3 and setuptools to v39.0.1. + +- bpo-33012: gcc 8 has added a new warning heuristic to detect invalid + function casts and a stock python build seems to hit that warning quite + often. The most common is the cast of a METH_NOARGS function (that uses + just one argument) to a PyCFunction. Fix this by adding a dummy argument + to all functions that implement METH_NOARGS. + +- bpo-32898: Fix the python debug build when using COUNT_ALLOCS. + +- bpo-29442: Replace optparse with argparse in setup.py + +Windows +------- + +- bpo-35890: Fix API calling consistency of GetVersionEx and wcstok. + +- bpo-32560: The ``py`` launcher now forwards its ``STARTUPINFO`` structure + to child processes. + +- bpo-35854: Fix EnvBuilder and --symlinks in venv on Windows + +- bpo-35811: Avoid propagating venv settings when launching via py.exe + +- bpo-35797: Fix default executable used by the multiprocessing module + +- bpo-35758: Allow building on ARM with MSVC. + +- bpo-29734: Fix handle leaks in os.stat on Windows. + +- bpo-35596: Use unchecked PYCs for the embeddable distro to avoid zipimport + restrictions. + +- bpo-35596: Fix vcruntime140.dll being added to embeddable distro multiple + times. + +- bpo-35402: Update Windows build to use Tcl and Tk 8.6.9 + +- bpo-35401: Updates Windows build to OpenSSL 1.1.0j + +- bpo-34977: venv on Windows will now use a python.exe redirector rather + than copying the actual binaries from the base environment. + +- bpo-34977: Adds support for building a Windows App Store package + +- bpo-35067: Remove _distutils_findvs module and use vswhere.exe instead. + +- bpo-32557: Allow shutil.disk_usage to take a file path on Windows + +- bpo-34770: Fix a possible null pointer dereference in pyshellext.cpp. + +- bpo-34603: Fix returning structs from functions produced by MSVC + +- bpo-34581: Guard MSVC-specific code in socketmodule.c with ``#ifdef + _MSC_VER``. + +- bpo-34532: Fixes exit code of list version arguments for py.exe. + +- bpo-34062: Fixed the '--list' and '--list-paths' arguments for the py.exe + launcher + +- bpo-34225: Ensure INCLUDE and LIB directories do not end with a backslash. + +- bpo-34011: A suite of code has been changed which copied across DLLs and + init.tcl from the running Python location into a venv being created. These + copies are needed only when running from a Python source build, and the + copying code is now only run when that is the case, rather than whenever a + venv is created. + +- bpo-34006: Revert line length limit for Windows help docs. The line-length + limit is not needed because the pages appear in a separate app rather than + on a browser tab. It can also interact badly with the DPI setting. + +- bpo-31546: Restore running PyOS_InputHook while waiting for user input at + the prompt. The restores integration of interactive GUI windows (such as + Matplotlib figures) with the prompt on Windows. + +- bpo-30237: Output error when ReadConsole is canceled by + CancelSynchronousIo instead of crashing. + +- bpo-33895: GIL is released while calling functions that acquire Windows + loader lock. + +- bpo-33720: Reduces maximum marshal recursion depth on release builds. + +- bpo-29097: Fix bug where :meth:`datetime.fromtimestamp` erroneously throws + an :exc:`OSError` on Windows for values between 0 and 86400. Patch by + Ammar Askar. + +- bpo-33316: PyThread_release_lock always fails + +- bpo-33184: Update Windows installer to use OpenSSL 1.1.0h. + +- bpo-32890: Fix usage of GetLastError() instead of errno in os.execve() and + os.truncate(). + +- bpo-33016: Fix potential use of uninitialized memory in + nt._getfinalpathname + +- bpo-32903: Fix a memory leak in os.chdir() on Windows if the current + directory is set to a UNC path. + +- bpo-32901: Update Tcl and Tk versions to 8.6.8 + +- bpo-31966: Fixed WindowsConsoleIO.write() for writing empty data. + +- bpo-32409: Ensures activate.bat can handle Unicode contents. + +- bpo-32457: Improves handling of denormalized executable path when + launching Python. + +- bpo-32370: Use the correct encoding for ipconfig output in the uuid + module. Patch by Segev Finer. + +- bpo-29248: Fix :func:`os.readlink` on Windows, which was mistakenly + treating the ``PrintNameOffset`` field of the reparse data buffer as a + number of characters instead of bytes. Patch by Craig Holmquist and SSE4. + +- bpo-1104: Correctly handle string length in + ``msilib.SummaryInfo.GetProperty()`` to prevent it from truncating the + last character. + +macOS +----- + +- bpo-35401: Update macOS installer to use OpenSSL 1.1.0j. + +- bpo-35025: Properly guard the use of the ``CLOCK_GETTIME`` et al. macros + in ``timemodule`` on macOS. + +- bpo-24658: On macOS, fix reading from and writing into a file with a size + larger than 2 GiB. + +- bpo-34405: Update to OpenSSL 1.1.0i for macOS installer builds. + +- bpo-33635: In macOS stat on some file descriptors (/dev/fd/3 f.e) will + result in bad file descriptor OSError. Guard against this exception was + added in is_dir, is_file and similar methods. DirEntry.is_dir can also + throw this exception so _RecursiveWildcardSelector._iterate_directories + was also extended with the same error ignoring pattern. + +- bpo-13631: The .editrc file in user's home directory is now processed + correctly during the readline initialization through editline emulation on + macOS. + +- bpo-33184: Update macOS installer build to use OpenSSL 1.1.0h. + +- bpo-32726: Build and link with private copy of Tcl/Tk 8.6 for the macOS + 10.6+ installer. The 10.9+ installer variant already does this. This + means that the Python 3.7 provided by the python.org macOS installers no + longer need or use any external versions of Tcl/Tk, either system-provided + or user-installed, such as ActiveTcl. + +- bpo-32901: Update macOS 10.9+ installer to Tcl/Tk 8.6.8. + +- bpo-31903: In :mod:`_scproxy`, drop the GIL when calling into + ``SystemConfiguration`` to avoid deadlocks. + +IDLE +---- + +- bpo-35770: IDLE macosx deletes Options => Configure IDLE. It previously + deleted Window => Zoom Height by mistake. (Zoom Height is now on the + Options menu). On Mac, the settings dialog is accessed via Preferences on + the IDLE menu. + +- bpo-35769: Change IDLE's new file name from 'Untitled' to 'untitled' + +- bpo-35660: Fix imports in idlelib.window. + +- bpo-35641: Proper format `calltip` when the function has no docstring. + +- bpo-33987: Use ttk Frame for ttk widgets. + +- bpo-34055: Fix erroneous 'smart' indents and newlines in IDLE Shell. + +- bpo-35591: Find Selection now works when selection not found. + +- bpo-35196: Speed up squeezer line counting. + +- bpo-35598: Update config_key: use PEP 8 names and ttk widgets, make some + objects global, and add tests. + +- bpo-28097: Add Previous/Next History entries to Shell menu. + +- bpo-35208: Squeezer now properly counts wrapped lines before newlines. + +- bpo-35555: Gray out Code Context menu entry when it's not applicable. + +- bpo-35521: Document the IDLE editor code context feature. Add some + internal references within the IDLE doc. + +- bpo-22703: The Code Context menu label now toggles between Show/Hide Code + Context. The Zoom Height menu now toggles between Zoom/Restore Height. + Zoom Height has moved from the Window menu to the Options menu. + +- bpo-35213: Where appropriate, use 'macOS' in idlelib. + +- bpo-34864: On macOS, warn if the system preference "Prefer tabs when + opening documents" is set to "Always". + +- bpo-34864: Document two IDLE on MacOS issues. The System Preferences Dock + "prefer tabs always" setting disables some IDLE features. Menus are a bit + different than as described for Windows and Linux. + +- bpo-35202: Remove unused imports from lib/idlelib + +- bpo-33000: Document that IDLE's shell has no line limit. A program that + runs indefinitely can overfill memory. + +- bpo-23220: Explain how IDLE's Shell displays output. + +- bpo-35099: Improve the doc about IDLE running user code. The section is + renamed from "IDLE -- console differences" is renamed "Running user code". + It mostly covers the implications of using custom sys.stdxxx objects. + +- bpo-35097: Add IDLE doc subsection explaining editor windows. Topics + include opening, title and status bar, .py* extension, and running. + +- bpo-35093: Document the IDLE document viewer in the IDLE doc. Add a + paragraph in "Help and preferences", "Help sources" subsection. + +- bpo-35088: Update idlelib.help.copy_string docstring. We now use git and + backporting instead of hg and forward merging. + +- bpo-35087: Update idlelib help files for the current doc build. The main + change is the elimination of chapter-section numbers. + +- bpo-34548: Use configured color theme for read-only text views. + +- bpo-1529353: Enable "squeezing" of long outputs in the shell, to avoid + performance degradation and to clean up the history without losing it. + Squeezed outputs may be copied, viewed in a separate window, and + "unsqueezed". + +- bpo-34047: Fixed mousewheel scrolling direction on macOS. + +- bpo-34275: Make IDLE calltips always visible on Mac. Some MacOS-tk + combinations need .update_idletasks(). Patch by Kevin Walzer. + +- bpo-34120: Fix unresponsiveness after closing certain windows and dialogs. + +- bpo-33975: Avoid small type when running htests. Since part of the purpose + of human-viewed tests is to determine that widgets look right, it is + important that they look the same for testing as when running IDLE. + +- bpo-33905: Add test for idlelib.stackview.StackBrowser. + +- bpo-33924: Change mainmenu.menudefs key 'windows' to 'window'. Every other + menudef key is lowercase version of main menu entry. + +- bpo-33906: Rename idlelib.windows as window Match Window on the main menu + and remove last plural module name. + +- bpo-33917: Fix and document idlelib/idle_test/template.py. The revised + file compiles, runs, and tests OK. idle_test/README.txt explains how to + use it to create new IDLE test files. + +- bpo-33904: IDLE: In rstrip, rename class RstripExtension as Rstrip + +- bpo-33907: For consistency and clarity, rename an IDLE module and classes. + Module calltips and its class CallTips are now calltip and Calltip. In + module calltip_w, class CallTip is now CalltipWindow. + +- bpo-33856: Add "help" in the welcome message of IDLE + +- bpo-33839: IDLE: refactor ToolTip and CallTip and add documentation and + tests + +- bpo-33855: Minimally test all IDLE modules. Add missing files, import + module, instantiate classes, and check coverage. Check existing files. + +- bpo-33656: On Windows, add API call saying that tk scales for DPI. On + Windows 8.1+ or 10, with DPI compatibility properties of the Python binary + unchanged, and a monitor resolution greater than 96 DPI, this should make + text and lines sharper. It should otherwise have no effect. + +- bpo-33768: Clicking on a context line moves that line to the top of the + editor window. + +- bpo-33763: IDLE: Use read-only text widget for code context instead of + label widget. + +- bpo-33664: Scroll IDLE editor text by lines. Previously, the mouse wheel + and scrollbar slider moved text by a fixed number of pixels, resulting in + partial lines at the top of the editor box. The change also applies to + the shell and grep output windows, but not to read-only text views. + +- bpo-33679: Enable theme-specific color configuration for Code Context. Use + the Highlights tab to see the setting for built-in themes or add settings + to custom themes. + +- bpo-33642: Display up to maxlines non-blank lines for Code Context. If + there is no current context, show a single blank line. + +- bpo-33628: IDLE: Cleanup codecontext.py and its test. + +- bpo-33564: IDLE's code context now recognizes async as a block opener. + +- bpo-21474: Update word/identifier definition from ascii to unicode. In + text and entry boxes, this affects selection by double-click, movement + left/right by control-left/right, and deletion left/right by + control-BACKSPACE/DEL. + +- bpo-33204: IDLE: consistently color invalid string prefixes. A 'u' string + prefix cannot be paired with either 'r' or 'f'. Consistently color as much + of the prefix, starting at the right, as is valid. Revise and extend + colorizer test. + +- bpo-32984: Set ``__file__`` while running a startup file. Like Python, + IDLE optionally runs one startup file in the Shell window before + presenting the first interactive input prompt. For IDLE, ``-s`` runs a + file named in environmental variable :envvar:`IDLESTARTUP` or + :envvar:`PYTHONSTARTUP`; ``-r file`` runs ``file``. Python sets + ``__file__`` to the startup file name before running the file and unsets + it before the first prompt. IDLE now does the same when run normally, + without the ``-n`` option. + +- bpo-32940: Simplify and rename StringTranslatePseudoMapping in pyparse. + +- bpo-32916: Change ``str`` to ``code`` in pyparse. + +- bpo-32905: Remove unused code in pyparse module. + +- bpo-32874: Add tests for pyparse. + +- bpo-32837: Using the system and place-dependent default encoding for + open() is a bad idea for IDLE's system and location-independent files. + +- bpo-32826: Add "encoding=utf-8" to open() in IDLE's test_help_about. GUI + test test_file_buttons() only looks at initial ascii-only lines, but + failed on systems where open() defaults to 'ascii' because readline() + internally reads and decodes far enough ahead to encounter a non-ascii + character in CREDITS.txt. + +- bpo-32831: Add docstrings and tests for codecontext. + +- bpo-32765: Update configdialog General tab docstring to add new widgets to + the widget list. + +Tools/Demos +----------- + +- bpo-35884: Add a benchmark script for timing various ways to access + variables: ``Tools/scripts/var_access_benchmark.py``. + +- bpo-34989: python-gdb.py now handles errors on computing the line number + of a Python frame. + +- bpo-20260: Argument Clinic now has non-bitwise unsigned int converters. + +- bpo-32962: python-gdb now catches ``UnicodeDecodeError`` exceptions when + calling ``string()``. + +- bpo-32962: python-gdb now catches ValueError on read_var(): when Python + has no debug symbols for example. + +- bpo-33189: :program:`pygettext.py` now recognizes only literal strings as + docstrings and translatable strings, and rejects bytes literals and + f-string expressions. + +- bpo-31920: Fixed handling directories as arguments in the ``pygettext`` + script. Based on patch by Oleg Krasnikov. + +- bpo-29673: Fix pystackv and pystack gdbinit macros. + +- bpo-25427: Remove the pyvenv script in favor of ``python3 -m venv`` in + order to lower confusion as to what Python interpreter a virtual + environment will be created for. + +- bpo-32885: Add an ``-n`` flag for ``Tools/scripts/pathfix.py`` to disable + automatic backup creation (files with ``~`` suffix). + +- bpo-32222: Fix pygettext not extracting docstrings for functions with type + annotated arguments. Patch by Toby Harradine. + +- bpo-31583: Fix 2to3 for using with --add-suffix option but without + --output-dir option for relative path to files in current directory. + +C API +----- + +- bpo-35713: The :c:func:`PyByteArray_Init` and :c:func:`PyByteArray_Fini` + functions have been removed. They did nothing since Python 2.7.4 and + Python 3.2.0, were excluded from the limited API (stable ABI), and were + not documented. + +- bpo-33817: Fixed :c:func:`_PyBytes_Resize` for empty bytes objects. + +- bpo-35322: Fix memory leak in :c:func:`PyUnicode_EncodeLocale` and + :c:func:`PyUnicode_EncodeFSDefault` on error handling. + +- bpo-35059: The following C macros have been converted to static inline + functions: :c:func:`Py_INCREF`, :c:func:`Py_DECREF`, :c:func:`Py_XINCREF`, + :c:func:`Py_XDECREF`, :c:func:`PyObject_INIT`, + :c:func:`PyObject_INIT_VAR`. + +- bpo-35296: ``make install`` now also installs the internal API: + ``Include/internal/*.h`` header files. + +- bpo-35081: Internal APIs surrounded by ``#ifdef Py_BUILD_CORE`` have been + moved from ``Include/*.h`` headers to new header files + ``Include/internal/pycore_*.h``. + +- bpo-35259: Conditionally declare :c:func:`Py_FinalizeEx()` (new in 3.6) + based on Py_LIMITED_API. Patch by Arthur Neufeld. + +- bpo-35081: The :c:func:`_PyObject_GC_TRACK` and + :c:func:`_PyObject_GC_UNTRACK` macros have been removed from the public C + API. + +- bpo-35134: Creation of a new ``Include/cpython/`` subdirectory. + +- bpo-34725: Adds _Py_SetProgramFullPath so embedders may override + sys.executable + +- bpo-34910: Ensure that :c:func:`PyObject_Print` always returns ``-1`` on + error. Patch by Zackery Spytz. + +- bpo-34523: Py_DecodeLocale() and Py_EncodeLocale() now use the UTF-8 + encoding on Windows if Py_LegacyWindowsFSEncodingFlag is zero. + +- bpo-34193: Fix pluralization in TypeError messages in getargs.c and + typeobject.c: '1 argument' instead of '1 arguments' and '1 element' + instead of '1 elements'. + +- bpo-34127: Return grammatically correct error message based on argument + count. Patch by Karthikeyan Singaravelan. + +- bpo-23927: Fixed :exc:`SystemError` in + :c:func:`PyArg_ParseTupleAndKeywords` when the ``w*`` format unit is used + for optional parameter. + +- bpo-32455: Added :c:func:`PyCompile_OpcodeStackEffectWithJump`. + +- bpo-34008: Py_Main() can again be called after Py_Initialize(), as in + Python 3.6. + +- bpo-32500: Fixed error messages for :c:func:`PySequence_Size`, + :c:func:`PySequence_GetItem`, :c:func:`PySequence_SetItem` and + :c:func:`PySequence_DelItem` called with a mapping and + :c:func:`PyMapping_Size` called with a sequence. + +- bpo-33818: :c:func:`PyExceptionClass_Name` will now return ``const char + *`` instead of ``char *``. + +- bpo-33042: Embedding applications may once again call + PySys_ResetWarnOptions, PySys_AddWarnOption, and PySys_AddXOption prior to + calling Py_Initialize. + +- bpo-32374: Document that m_traverse for multi-phase initialized modules + can be called with m_state=NULL, and add a sanity check + +- bpo-30863: :c:func:`PyUnicode_AsWideChar` and + :c:func:`PyUnicode_AsWideCharString` no longer cache the ``wchar_t*`` + representation of string objects. + + +What's New in Python 3.7.0 final? +================================= + +*Release date: 2018-06-27* + +Library +------- + +- bpo-33851: Fix :func:`ast.get_docstring` for a node that lacks a + docstring. + +C API +----- + +- bpo-33932: Calling Py_Initialize() twice does nothing, instead of failing + with a fatal error: restore the Python 3.6 behaviour. + + +What's New in Python 3.7.0 release candidate 1? +=============================================== + +*Release date: 2018-06-12* + +Core and Builtins +----------------- + +- bpo-33803: Fix a crash in hamt.c caused by enabling GC tracking for an + object that hadn't all of its fields set to NULL. + +- bpo-33706: Fix a crash in Python initialization when parsing the command + line options. Thanks Christoph Gohlke for the bug report and the fix! + +- bpo-30654: Fixed reset of the SIGINT handler to SIG_DFL on interpreter + shutdown even when there was a custom handler set previously. Patch by + Philipp Kerling. + +- bpo-31849: Fix signed/unsigned comparison warning in pyhash.c. + +Library +------- + +- bpo-30167: Prevent site.main() exception if PYTHONSTARTUP is set. Patch by + Steve Weber. + +- bpo-33812: Datetime instance d with non-None tzinfo, but with + d.tzinfo.utcoffset(d) returning None is now treated as naive by the + astimezone() method. + +- bpo-30805: Avoid race condition with debug logging + +- bpo-33694: asyncio: Fix a race condition causing data loss on + pause_reading()/resume_reading() when using the ProactorEventLoop. + +- bpo-32493: Correct test for ``uuid_enc_be`` availability in + ``configure.ac``. Patch by Michael Felt. + +- bpo-33792: Add asyncio.WindowsSelectorEventLoopPolicy and + asyncio.WindowsProactorEventLoopPolicy. + +- bpo-33778: Update ``unicodedata``'s database to Unicode version 11.0.0. + +- bpo-33770: improve base64 exception message for encoded inputs of invalid + length + +- bpo-33769: asyncio/start_tls: Fix error message; cancel callbacks in case + of an unhandled error; mark SSLTransport as closed if it is aborted. + +- bpo-33767: The concatenation (``+``) and repetition (``*``) sequence + operations now raise :exc:`TypeError` instead of :exc:`SystemError` when + performed on :class:`mmap.mmap` objects. Patch by Zackery Spytz. + +- bpo-33734: asyncio/ssl: Fix AttributeError, increase default handshake + timeout + +- bpo-11874: Use a better regex when breaking usage into wrappable parts. + Avoids bogus assertion errors from custom metavar strings. + +- bpo-33582: Emit a deprecation warning for inspect.formatargspec + +Documentation +------------- + +- bpo-33409: Clarified the relationship between :pep:`538`'s + PYTHONCOERCECLOCALE and PEP 540's PYTHONUTF8 mode. + +- bpo-33736: Improve the documentation of :func:`asyncio.open_connection`, + :func:`asyncio.start_server` and their UNIX socket counterparts. + +- bpo-31432: Clarify meaning of CERT_NONE, CERT_OPTIONAL, and CERT_REQUIRED + flags for ssl.SSLContext.verify_mode. + +Build +----- + +- bpo-5755: Move ``-Wstrict-prototypes`` option to ``CFLAGS_NODIST`` from + ``OPT``. This option emitted annoying warnings when building extension + modules written in C++. + +Windows +------- + +- bpo-33720: Reduces maximum marshal recursion depth on release builds. + +IDLE +---- + +- bpo-33656: On Windows, add API call saying that tk scales for DPI. On + Windows 8.1+ or 10, with DPI compatibility properties of the Python binary + unchanged, and a monitor resolution greater than 96 DPI, this should make + text and lines sharper. It should otherwise have no effect. + +- bpo-33768: Clicking on a context line moves that line to the top of the + editor window. + +- bpo-33763: IDLE: Use read-only text widget for code context instead of + label widget. + +- bpo-33664: Scroll IDLE editor text by lines. Previously, the mouse wheel + and scrollbar slider moved text by a fixed number of pixels, resulting in + partial lines at the top of the editor box. The change also applies to + the shell and grep output windows, but not to read-only text views. + +- bpo-33679: Enable theme-specific color configuration for Code Context. Use + the Highlights tab to see the setting for built-in themes or add settings + to custom themes. + +- bpo-33642: Display up to maxlines non-blank lines for Code Context. If + there is no current context, show a single blank line. + + +What's New in Python 3.7.0 beta 5? +================================== + +*Release date: 2018-05-30* + +Core and Builtins +----------------- + +- bpo-33622: Fixed a leak when the garbage collector fails to add an object + with the ``__del__`` method or referenced by it into the + :data:`gc.garbage` list. :c:func:`PyGC_Collect` can now be called when an + exception is set and preserves it. + +- bpo-33509: Fix module_globals parameter of warnings.warn_explicit(): don't + crash if module_globals is not a dict. + +- bpo-20104: The new `os.posix_spawn` added in 3.7.0b1 was removed as we are + still working on what the API should look like. Expect this in 3.8 + instead. + +- bpo-33475: Fixed miscellaneous bugs in converting annotations to strings + and optimized parentheses in the string representation. + +- bpo-33391: Fix a leak in set_symmetric_difference(). + +- bpo-28055: Fix unaligned accesses in siphash24(). Patch by Rolf Eike Beer. + +- bpo-32911: Due to unexpected compatibility issues discovered during + downstream beta testing, reverted :issue:`29463`. ``docstring`` field is + removed from Module, ClassDef, FunctionDef, and AsyncFunctionDef ast nodes + which was added in 3.7a1. Docstring expression is restored as a first + statement in their body. Based on patch by Inada Naoki. + +- bpo-21983: Fix a crash in `ctypes.cast()` in case the type argument is a + ctypes structured data type. Patch by Eryk Sun and Oren Milman. + +Library +------- + +- bpo-32751: When cancelling the task due to a timeout, + :meth:`asyncio.wait_for` will now wait until the cancellation is complete. + +- bpo-32684: Fix gather to propagate cancellation of itself even with + return_exceptions. + +- bpo-33654: Support protocol type switching in SSLTransport.set_protocol(). + +- bpo-33674: Pause the transport as early as possible to further reduce the + risk of data_received() being called before connection_made(). + +- bpo-33674: Fix a race condition in SSLProtocol.connection_made() of + asyncio.sslproto: start immediately the handshake instead of using + call_soon(). Previously, data_received() could be called before the + handshake started, causing the handshake to hang or fail. + +- bpo-31647: Fixed bug where calling write_eof() on a + _SelectorSocketTransport after it's already closed raises AttributeError. + +- bpo-32610: Make asyncio.all_tasks() return only pending tasks. + +- bpo-32410: Avoid blocking on file IO in sendfile fallback code + +- bpo-33469: Fix RuntimeError after closing loop that used run_in_executor + +- bpo-33672: Fix Task.__repr__ crash with Cython's bogus coroutines + +- bpo-33654: Fix transport.set_protocol() to support switching between + asyncio.Protocol and asyncio.BufferedProtocol. Fix loop.start_tls() to + work with asyncio.BufferedProtocols. + +- bpo-33652: Pickles of type variables and subscripted generics are now + future-proof and compatible with older Python versions. + +- bpo-32493: Fixed :func:`uuid.uuid1` on FreeBSD. + +- bpo-33618: Finalize and document preliminary and experimental TLS 1.3 + support with OpenSSL 1.1.1 + +- bpo-33623: Fix possible SIGSGV when asyncio.Future is created in __del__ + +- bpo-30877: Fixed a bug in the Python implementation of the JSON decoder + that prevented the cache of parsed strings from clearing after finishing + the decoding. Based on patch by c-fos. + +- bpo-33570: Change TLS 1.3 cipher suite settings for compatibility with + OpenSSL 1.1.1-pre6 and newer. OpenSSL 1.1.1 will have TLS 1.3 ciphers + enabled by default. + +- bpo-28556: Do not simplify arguments to `typing.Union`. Now + `Union[Manager, Employee]` is not simplified to `Employee` at runtime. + Such simplification previously caused several bugs and limited + possibilities for introspection. + +- bpo-33540: Add a new ``block_on_close`` class attribute to + ``ForkingMixIn`` and ``ThreadingMixIn`` classes of :mod:`socketserver`. + +- bpo-33548: tempfile._candidate_tempdir_list should consider common TEMP + locations + +- bpo-33109: argparse subparsers are once again not required by default, + reverting the change in behavior introduced by bpo-26510 in 3.7.0a2. + +- bpo-33536: dataclasses.make_dataclass now checks for invalid field names + and duplicate fields. Also, added a check for invalid field + specifications. + +- bpo-33542: Prevent ``uuid.get_node`` from using a DUID instead of a MAC on + Windows. Patch by Zvi Effron + +- bpo-26819: Fix race condition with `ReadTransport.resume_reading` in + Windows proactor event loop. + +- Fix failure in `typing.get_type_hints()` when ClassVar was provided as a + string forward reference. + +- bpo-33505: Optimize asyncio.ensure_future() by reordering if checks: 1.17x + faster. + +- bpo-33497: Add errors param to cgi.parse_multipart and make an encoding in + FieldStorage use the given errors (needed for Twisted). Patch by Amber + Brown. + +- bpo-33495: Change dataclasses.Fields repr to use the repr of each of its + members, instead of str. This makes it more clear what each field + actually represents. This is especially true for the 'type' member. + +- bpo-33453: Fix dataclasses to work if using literal string type + annotations or if using PEP 563 "Postponed Evaluation of Annotations". + Only specific string prefixes are detected for both ClassVar ("ClassVar" + and "typing.ClassVar") and InitVar ("InitVar" and "dataclasses.InitVar"). + +- bpo-28556: Minor fixes in typing module: add annotations to + ``NamedTuple.__new__``, pass ``*args`` and ``**kwds`` in + ``Generic.__new__``. Original PRs by Paulius Šarka and Chad Dombrova. + +- bpo-20087: Updated alias mapping with glibc 2.27 supported locales. + +- bpo-33422: Fix trailing quotation marks getting deleted when looking up + byte/string literals on pydoc. Patch by Andrés Delfino. + +- bpo-28167: The function ``platform.linux_distribution`` and + ``platform.dist`` now trigger a ``DeprecationWarning`` and have been + marked for removal in Python 3.8 + +- bpo-33197: Update error message when constructing invalid + inspect.Parameters Patch by Dong-hee Na. + +- bpo-33263: Fix FD leak in `_SelectorSocketTransport` Patch by Vlad + Starostin. + +- bpo-32861: The urllib.robotparser's ``__str__`` representation now + includes wildcard entries and the "Crawl-delay" and "Request-rate" fields. + Patch by Michael Lazar. + +- bpo-32257: The ssl module now contains OP_NO_RENEGOTIATION constant, + available with OpenSSL 1.1.0h or 1.1.1. + +- bpo-16865: Support arrays >=2GiB in :mod:`ctypes`. Patch by Segev Finer. + +Documentation +------------- + +- bpo-23859: Document that `asyncio.wait()` does not cancel its futures on + timeout. + +- bpo-32436: Document :pep:`567` changes to asyncio. + +- bpo-33604: Update HMAC md5 default to a DeprecationWarning, bump removal + to 3.8. + +- bpo-33503: Fix broken pypi link + +- bpo-33421: Add missing documentation for ``typing.AsyncContextManager``. + +Tests +----- + +- bpo-33655: Ignore test_posix_fallocate failures on BSD platforms that + might be due to running on ZFS. + +- bpo-32604: Remove the _xxsubinterpreters module (meant for testing) and + associated helpers. This module was originally added recently in 3.7b1. + +Build +----- + +- bpo-33614: Ensures module definition files for the stable ABI on Windows + are correctly regenerated. + +- bpo-33522: Enable CI builds on Visual Studio Team Services at + https://python.visualstudio.com/cpython + +- bpo-33012: Add ``-Wno-cast-function-type`` for gcc 8 for silencing + warnings about function casts like casting to PyCFunction in method + definition lists. + +macOS +----- + +- bpo-13631: The .editrc file in user's home directory is now processed + correctly during the readline initialization through editline emulation on + macOS. + +IDLE +---- + +- bpo-33628: IDLE: Cleanup codecontext.py and its test. + +- bpo-33564: IDLE's code context now recognizes async as a block opener. + +- bpo-32831: Add docstrings and tests for codecontext. + + +What's New in Python 3.7.0 beta 4? +================================== + +*Release date: 2018-05-02* + +Core and Builtins +----------------- + +- bpo-33363: Raise a SyntaxError for ``async with`` and ``async for`` + statements outside of async functions. + +- bpo-33128: Fix a bug that causes PathFinder to appear twice on + sys.meta_path. Patch by Pablo Galindo Salgado. + +- bpo-33312: Fixed clang ubsan (undefined behavior sanitizer) warnings in + dictobject.c by adjusting how the internal struct _dictkeysobject shared + keys structure is declared. + +- bpo-33231: Fix potential memory leak in ``normalizestring()``. + +- bpo-33205: Change dict growth function from + ``round_up_to_power_2(used*2+hashtable_size/2)`` to + ``round_up_to_power_2(used*3)``. Previously, dict is shrinked only when + ``used == 0``. Now dict has more chance to be shrinked. + +- bpo-29922: Improved error messages in 'async with' when ``__aenter__()`` + or ``__aexit__()`` return non-awaitable object. + +- bpo-33199: Fix ``ma_version_tag`` in dict implementation is uninitialized + when copying from key-sharing dict. + +Library +------- + +- bpo-33281: Fix ctypes.util.find_library regression on macOS. + +- bpo-33383: Fixed crash in the get() method of the :mod:`dbm.ndbm` database + object when it is called with a single argument. + +- bpo-33329: Fix multiprocessing regression on newer glibcs + +- bpo-991266: Fix quoting of the ``Comment`` attribute of + :class:`http.cookies.SimpleCookie`. + +- bpo-33131: Upgrade bundled version of pip to 10.0.1. + +- bpo-33308: Fixed a crash in the :mod:`parser` module when converting an ST + object to a tree of tuples or lists with ``line_info=False`` and + ``col_info=True``. + +- bpo-33266: lib2to3 now recognizes ``rf'...'`` strings. + +- bpo-11594: Ensure line-endings are respected when using lib2to3. + +- bpo-33254: Have :func:`importlib.resources.contents` and + :meth:`importlib.abc.ResourceReader.contents` return an :term:`iterable` + instead of an :term:`iterator`. + +- bpo-33256: Fix display of ```` call in the html produced by + ``cgitb.html()``. Patch by Stéphane Blondon. + +- bpo-33185: Fixed regression when running pydoc with the :option:`-m` + switch. (The regression was introduced in 3.7.0b3 by the resolution of + :issue:`33053`) This fix also changed pydoc to add ``os.getcwd()`` to + :data:`sys.path` when necessary, rather than adding ``"."``. + +- bpo-33169: Delete entries of ``None`` in :data:`sys.path_importer_cache` + when :meth:`importlib.machinery.invalidate_caches` is called. + +- bpo-33217: Deprecate looking up non-Enum objects in Enum classes and Enum + members (will raise :exc:`TypeError` in 3.8+). + +- bpo-33203: ``random.Random.choice()`` now raises ``IndexError`` for empty + sequences consistently even when called from subclasses without a + ``getrandbits()`` implementation. + +- bpo-33224: Update difflib.mdiff() for :pep:`479`. Convert an uncaught + StopIteration in a generator into a return-statement. + +- bpo-33209: End framing at the end of C implementation of + :func:`pickle.Pickler.dump`. + +- bpo-20104: Improved error handling and fixed a reference leak in + :func:`os.posix_spawn()`. + +- bpo-33175: In dataclasses, Field.__set_name__ now looks up the + __set_name__ special method on the class, not the instance, of the default + value. + +- bpo-33097: Raise RuntimeError when ``executor.submit`` is called during + interpreter shutdown. + +- bpo-31908: Fix output of cover files for ``trace`` module command-line + tool. Previously emitted cover files only when ``--missing`` option was + used. Patch by Michael Selik. + +Documentation +------------- + +- bpo-33378: Add Korean language switcher for https://docs.python.org/3/ + +- bpo-33276: Clarify that the ``__path__`` attribute on modules cannot be + just any value. + +- bpo-33201: Modernize documentation for writing C extension types. + +- bpo-33195: Deprecate ``Py_UNICODE`` usage in ``c-api/arg`` document. + ``Py_UNICODE`` related APIs are deprecated since Python 3.3, but it is + missed in the document. + +- bpo-8243: Add a note about curses.addch and curses.addstr exception + behavior when writing outside a window, or pad. + +- bpo-32337: Update documentation related with ``dict`` order. + +Tests +----- + +- bpo-33358: Fix ``test_embed.test_pre_initialization_sys_options()`` when + the interpreter is built with ``--enable-shared``. + +Build +----- + +- bpo-33394: Enable the verbose build for extension modules, when GNU make + is passed macros on the command line. + +- bpo-33393: Update config.guess and config.sub files. + +- bpo-33377: Add new triplets for mips r6 and riscv variants (used in + extension suffixes). + +- bpo-32232: By default, modules configured in `Modules/Setup` are no longer + built with `-DPy_BUILD_CORE`. Instead, modules that specifically need that + preprocessor definition include it in their individual entries. + +- bpo-33182: The embedding tests can once again be built with clang 6.0 + +Windows +------- + +- bpo-33184: Update Windows installer to use OpenSSL 1.1.0h. + +macOS +----- + +- bpo-33184: Update macOS installer build to use OpenSSL 1.1.0h. + +IDLE +---- + +- bpo-21474: Update word/identifier definition from ascii to unicode. In + text and entry boxes, this affects selection by double-click, movement + left/right by control-left/right, and deletion left/right by + control-BACKSPACE/DEL. + +- bpo-33204: IDLE: consistently color invalid string prefixes. A 'u' string + prefix cannot be paired with either 'r' or 'f'. Consistently color as much + of the prefix, starting at the right, as is valid. Revise and extend + colorizer test. + +Tools/Demos +----------- + +- bpo-33189: :program:`pygettext.py` now recognizes only literal strings as + docstrings and translatable strings, and rejects bytes literals and + f-string expressions. + +- bpo-31920: Fixed handling directories as arguments in the ``pygettext`` + script. Based on patch by Oleg Krasnikov. + +- bpo-29673: Fix pystackv and pystack gdbinit macros. + +- bpo-31583: Fix 2to3 for using with --add-suffix option but without + --output-dir option for relative path to files in current directory. + + +What's New in Python 3.7.0 beta 3? +================================== + +*Release date: 2018-03-29* + +Security +-------- + +- bpo-33136: Harden ssl module against LibreSSL CVE-2018-8970. + X509_VERIFY_PARAM_set1_host() is called with an explicit namelen. A new + test ensures that NULL bytes are not allowed. + +- bpo-33001: Minimal fix to prevent buffer overrun in os.symlink on Windows + +- bpo-32981: Regexes in difflib and poplib were vulnerable to catastrophic + backtracking. These regexes formed potential DOS vectors (REDOS). They + have been refactored. This resolves CVE-2018-1060 and CVE-2018-1061. Patch + by Jamie Davis. + +Core and Builtins +----------------- + +- bpo-33053: When using the -m switch, sys.path[0] is now explicitly + expanded as the *starting* working directory, rather than being left as + the empty path (which allows imports from the current working directory at + the time of the import) + +- bpo-33018: Improve consistency of errors raised by ``issubclass()`` when + called with a non-class and an abstract base class as the first and second + arguments, respectively. Patch by Josh Bronson. + +- bpo-33041: Fixed jumping when the function contains an ``async for`` loop. + +- bpo-33026: Fixed jumping out of "with" block by setting f_lineno. + +- bpo-33005: Fix a crash on fork when using a custom memory allocator (ex: + using PYTHONMALLOC env var). _PyGILState_Reinit() and + _PyInterpreterState_Enable() now use the default RAW memory allocator to + allocate a new interpreters mutex on fork. + +- bpo-17288: Prevent jumps from 'return' and 'exception' trace events. + +- bpo-32836: Don't use temporary variables in cases of list/dict/set + comprehensions + +Library +------- + +- bpo-33141: Have Field objects pass through __set_name__ to their default + values, if they have their own __set_name__. + +- bpo-33096: Allow ttk.Treeview.insert to insert iid that has a false + boolean value. Note iid=0 and iid=False would be same. Patch by Garvit + Khatri. + +- bpo-32873: Treat type variables and special typing forms as immutable by + copy and pickle. This fixes several minor issues and inconsistencies, and + improves backwards compatibility with Python 3.6. + +- bpo-33134: When computing dataclass's __hash__, use the lookup table to + contain the function which returns the __hash__ value. This is an + improvement over looking up a string, and then testing that string to see + what to do. + +- bpo-33127: The ssl module now compiles with LibreSSL 2.7.1. + +- bpo-32505: Raise TypeError if a member variable of a dataclass is of type + Field, but doesn't have a type annotation. + +- bpo-33078: Fix the failure on OSX caused by the tests relying on + sem_getvalue + +- bpo-33116: Add 'Field' to dataclasses.__all__. + +- bpo-32896: Fix an error where subclassing a dataclass with a field that + uses a default_factory would generate an incorrect class. + +- bpo-33100: Dataclasses: If a field has a default value that's a + MemberDescriptorType, then it's from that field being in __slots__, not an + actual default value. + +- bpo-32953: If a non-dataclass inherits from a frozen dataclass, allow + attributes to be added to the derived class. Only attributes from the + frozen dataclass cannot be assigned to. Require all dataclasses in a + hierarchy to be either all frozen or all non-frozen. + +- bpo-33061: Add missing ``NoReturn`` to ``__all__`` in typing.py + +- bpo-33078: Fix the size handling in multiprocessing.Queue when a pickling + error occurs. + +- bpo-33064: lib2to3 now properly supports trailing commas after ``*args`` + and ``**kwargs`` in function signatures. + +- bpo-33056: FIX properly close leaking fds in + concurrent.futures.ProcessPoolExecutor. + +- bpo-33021: Release the GIL during fstat() calls, avoiding hang of all + threads when calling mmap.mmap(), os.urandom(), and random.seed(). Patch + by Nir Soffer. + +- bpo-31804: Avoid failing in multiprocessing.Process if the standard + streams are closed or None at exit. + +- bpo-33037: Skip sending/receiving data after SSL transport closing. + +- bpo-27683: Fix a regression in :mod:`ipaddress` that result of + :meth:`hosts` is empty when the network is constructed by a tuple + containing an integer mask and only 1 bit left for addresses. + +- bpo-32999: Fix C implementation of ``ABC.__subclasscheck__(cls, + subclass)`` crashed when ``subclass`` is not a type object. + +- bpo-33009: Fix inspect.signature() for single-parameter partialmethods. + +- bpo-32969: Expose several missing constants in zlib and fix corresponding + documentation. + +- bpo-32056: Improved exceptions raised for invalid number of channels and + sample width when read an audio file in modules :mod:`aifc`, :mod:`wave` + and :mod:`sunau`. + +- bpo-32844: Fix wrong redirection of a low descriptor (0 or 1) to stderr in + subprocess if another low descriptor is closed. + +- bpo-32857: In :mod:`tkinter`, ``after_cancel(None)`` now raises a + :exc:`ValueError` instead of canceling the first scheduled function. + Patch by Cheryl Sabella. + +- bpo-31639: http.server now exposes a ThreadedHTTPServer class and uses it + when the module is run with ``-m`` to cope with web browsers pre-opening + sockets. + +- bpo-27645: :class:`sqlite3.Connection` now exposes a + :class:`~sqlite3.Connection.backup` method, if the underlying SQLite + library is at version 3.6.11 or higher. Patch by Lele Gaifax. + +Documentation +------------- + +- bpo-33126: Document PyBuffer_ToContiguous(). + +- bpo-27212: Modify documentation for the :func:`islice` recipe to consume + initial values up to the start index. + +- bpo-28247: Update :mod:`zipapp` documentation to describe how to make + standalone applications. + +- bpo-18802: Documentation changes for ipaddress. Patch by Jon Foster and + Berker Peksag. + +- bpo-27428: Update documentation to clarify that ``WindowsRegistryFinder`` + implements ``MetaPathFinder``. (Patch by Himanshu Lakhara) + +Tests +----- + +- bpo-32872: Avoid regrtest compatibility issue with namespace packages. + +- bpo-32517: Fix failing ``test_asyncio`` on macOS 10.12.2+ due to transport + of ``KqueueSelector`` loop was not being closed. + +- bpo-19417: Add test_bdb.py. + +Build +----- + +- bpo-33163: Upgrade pip to 9.0.3 and setuptools to v39.0.1. + +Windows +------- + +- bpo-33016: Fix potential use of uninitialized memory in + nt._getfinalpathname + +- bpo-32903: Fix a memory leak in os.chdir() on Windows if the current + directory is set to a UNC path. + +macOS +----- + +- bpo-32726: Build and link with private copy of Tcl/Tk 8.6 for the macOS + 10.6+ installer. The 10.9+ installer variant already does this. This + means that the Python 3.7 provided by the python.org macOS installers no + longer need or use any external versions of Tcl/Tk, either system-provided + or user-installed, such as ActiveTcl. + +IDLE +---- + +- bpo-32984: Set ``__file__`` while running a startup file. Like Python, + IDLE optionally runs one startup file in the Shell window before + presenting the first interactive input prompt. For IDLE, ``-s`` runs a + file named in environmental variable :envvar:`IDLESTARTUP` or + :envvar:`PYTHONSTARTUP`; ``-r file`` runs ``file``. Python sets + ``__file__`` to the startup file name before running the file and unsets + it before the first prompt. IDLE now does the same when run normally, + without the ``-n`` option. + +- bpo-32940: Simplify and rename StringTranslatePseudoMapping in pyparse. + +Tools/Demos +----------- + +- bpo-32885: Add an ``-n`` flag for ``Tools/scripts/pathfix.py`` to disable + automatic backup creation (files with ``~`` suffix). + +C API +----- + +- bpo-33042: Embedding applications may once again call + PySys_ResetWarnOptions, PySys_AddWarnOption, and PySys_AddXOption prior to + calling Py_Initialize. + +- bpo-32374: Document that m_traverse for multi-phase initialized modules + can be called with m_state=NULL, and add a sanity check + + +What's New in Python 3.7.0 beta 2? +================================== + +*Release date: 2018-02-27* + +Security +-------- + +- bpo-28414: The ssl module now allows users to perform their own IDN + en/decoding when using SNI. + +Core and Builtins +----------------- + +- bpo-32889: Update Valgrind suppression list to account for the rename of + ``Py_ADDRESS_IN_RANG`` to ``address_in_range``. + +- bpo-31356: Remove the new API added in bpo-31356 (gc.ensure_disabled() + context manager). + +- bpo-32305: For namespace packages, ensure that both ``__file__`` and + ``__spec__.origin`` are set to None. + +- bpo-32303: Make sure ``__spec__.loader`` matches ``__loader__`` for + namespace packages. + +- bpo-32711: Fix the warning messages for Python/ast_unparse.c. Patch by + Stéphane Wirtel + +- bpo-32583: Fix possible crashing in builtin Unicode decoders caused by + write out-of-bound errors when using customized decode error handlers. + +Library +------- + +- bpo-32960: For dataclasses, disallow inheriting frozen from non-frozen + classes, and also disallow inheriting non-frozen from frozen classes. This + restriction will be relaxed at a future date. + +- bpo-32713: Fixed tarfile.itn handling of out-of-bounds float values. Patch + by Joffrey Fuhrer. + +- bpo-32951: Direct instantiation of SSLSocket and SSLObject objects is now + prohibited. The constructors were never documented, tested, or designed as + public constructors. Users were suppose to use ssl.wrap_socket() or + SSLContext. + +- bpo-32929: Remove the tri-state parameter "hash", and add the boolean + "unsafe_hash". If unsafe_hash is True, add a __hash__ function, but if a + __hash__ exists, raise TypeError. If unsafe_hash is False, add a __hash__ + based on the values of eq= and frozen=. The unsafe_hash=False behavior is + the same as the old hash=None behavior. unsafe_hash=False is the default, + just as hash=None used to be. + +- bpo-32947: Add OP_ENABLE_MIDDLEBOX_COMPAT and test workaround for TLSv1.3 + for future compatibility with OpenSSL 1.1.1. + +- bpo-30622: The ssl module now detects missing NPN support in LibreSSL. + +- bpo-32922: dbm.open() now encodes filename with the filesystem encoding + rather than default encoding. + +- bpo-32859: In ``os.dup2``, don't check every call whether the ``dup3`` + syscall exists or not. + +- bpo-32556: nt._getfinalpathname, nt._getvolumepathname and + nt._getdiskusage now correctly convert from bytes. + +- bpo-25988: Emit a :exc:`DeprecationWarning` when using or importing an ABC + directly from :mod:`collections` rather than from :mod:`collections.abc`. + +- bpo-21060: Rewrite confusing message from setup.py upload from "No dist + file created in earlier command" to the more helpful "Must create and + upload files in one command". + +- bpo-32852: Make sure sys.argv remains as a list when running trace. + +- bpo-31333: ``_abc`` module is added. It is a speedup module with C + implementations for various functions and methods in ``abc``. Creating an + ABC subclass and calling ``isinstance`` or ``issubclass`` with an ABC + subclass are up to 1.5x faster. In addition, this makes Python start-up up + to 10% faster. Note that the new implementation hides internal registry + and caches, previously accessible via private attributes + ``_abc_registry``, ``_abc_cache``, and ``_abc_negative_cache``. There are + three debugging helper methods that can be used instead + ``_dump_registry``, ``_abc_registry_clear``, and ``_abc_caches_clear``. + +- bpo-32841: Fixed `asyncio.Condition` issue which silently ignored + cancellation after notifying and cancelling a conditional lock. Patch by + Bar Harel. + +- bpo-32819: ssl.match_hostname() has been simplified and no longer depends + on re and ipaddress module for wildcard and IP addresses. Error reporting + for invalid wildcards has been improved. + +- bpo-32394: socket: Remove + TCP_FASTOPEN,TCP_KEEPCNT,TCP_KEEPIDLE,TCP_KEEPINTVL flags on older version + Windows during run-time. + +- bpo-31787: Fixed refleaks of ``__init__()`` methods in various modules. + (Contributed by Oren Milman) + +- bpo-30157: Fixed guessing quote and delimiter in csv.Sniffer.sniff() when + only the last field is quoted. Patch by Jake Davis. + +- bpo-32792: collections.ChainMap() preserves the order of the underlying + mappings. + +- bpo-32775: :func:`fnmatch.translate()` no longer produces patterns which + contain set operations. Sets starting with '[' or containing '--', '&&', + '~~' or '||' will be interpreted differently in regular expressions in + future versions. Currently they emit warnings. fnmatch.translate() now + avoids producing patterns containing such sets by accident. + +- bpo-32622: Implement native fast sendfile for Windows proactor event loop. + +- bpo-32777: Fix a rare but potential pre-exec child process deadlock in + subprocess on POSIX systems when marking file descriptors inheritable on + exec in the child process. This bug appears to have been introduced in + 3.4. + +- bpo-32647: The ctypes module used to depend on indirect linking for + dlopen. The shared extension is now explicitly linked against libdl on + platforms with dl. + +- bpo-32741: Implement ``asyncio.TimerHandle.when()`` method. + +- bpo-32691: Use mod_spec.parent when running modules with pdb + +- bpo-32734: Fixed ``asyncio.Lock()`` safety issue which allowed acquiring + and locking the same lock multiple times, without it being free. Patch by + Bar Harel. + +- bpo-32727: Do not include name field in SMTP envelope from address. Patch + by Stéphane Wirtel + +- bpo-31453: Add TLSVersion constants and SSLContext.maximum_version / + minimum_version attributes. The new API wraps OpenSSL 1.1 + https://www.openssl.org/docs/man1.1.0/ssl/SSL_CTX_set_min_proto_version.html + feature. + +- bpo-24334: Internal implementation details of ssl module were cleaned up. + The SSLSocket has one less layer of indirection. Owner and session + information are now handled by the SSLSocket and SSLObject constructor. + Channel binding implementation has been simplified. + +- bpo-31848: Fix the error handling in Aifc_read.initfp() when the SSND + chunk is not found. Patch by Zackery Spytz. + +- bpo-32585: Add Ttk spinbox widget to :mod:`tkinter.ttk`. Patch by Alan D + Moore. + +- bpo-32221: Various functions returning tuple containing IPv6 addresses now + omit ``%scope`` part since the same information is already encoded in + *scopeid* tuple item. Especially this speeds up :func:`socket.recvfrom` + when it receives multicast packet since useless resolving of network + interface name is omitted. + +- bpo-30693: The TarFile class now recurses directories in a reproducible + way. + +- bpo-30693: The ZipFile class now recurses directories in a reproducible + way. + +Documentation +------------- + +- bpo-28124: The ssl module function ssl.wrap_socket() has been + de-emphasized and deprecated in favor of the more secure and efficient + SSLContext.wrap_socket() method. + +- bpo-17232: Clarify docs for -O and -OO. Patch by Terry Reedy. + +- bpo-32436: Add documentation for the contextvars module (PEP 567). + +- bpo-32800: Update link to w3c doc for xml default namespaces. + +- bpo-11015: Update :mod:`test.support` documentation. + +- bpo-8722: Document :meth:`__getattr__` behavior when property :meth:`get` + method raises :exc:`AttributeError`. + +- bpo-32614: Modify RE examples in documentation to use raw strings to + prevent :exc:`DeprecationWarning` and add text to REGEX HOWTO to highlight + the deprecation. + +- bpo-31972: Improve docstrings for `pathlib.PurePath` subclasses. + +Tests +----- + +- bpo-31809: Add tests to verify connection with secp ECDH curves. + +Build +----- + +- bpo-32898: Fix the python debug build when using COUNT_ALLOCS. + +Windows +------- + +- bpo-32901: Update Tcl and Tk versions to 8.6.8 + +- bpo-31966: Fixed WindowsConsoleIO.write() for writing empty data. + +- bpo-32409: Ensures activate.bat can handle Unicode contents. + +- bpo-32457: Improves handling of denormalized executable path when + launching Python. + +- bpo-32370: Use the correct encoding for ipconfig output in the uuid + module. Patch by Segev Finer. + +- bpo-29248: Fix :func:`os.readlink` on Windows, which was mistakenly + treating the ``PrintNameOffset`` field of the reparse data buffer as a + number of characters instead of bytes. Patch by Craig Holmquist and SSE4. + +macOS +----- + +- bpo-32901: Update macOS 10.9+ installer to Tcl/Tk 8.6.8. + +IDLE +---- + +- bpo-32916: Change ``str`` to ``code`` in pyparse. + +- bpo-32905: Remove unused code in pyparse module. + +- bpo-32874: Add tests for pyparse. + +- bpo-32837: Using the system and place-dependent default encoding for + open() is a bad idea for IDLE's system and location-independent files. + +- bpo-32826: Add "encoding=utf-8" to open() in IDLE's test_help_about. GUI + test test_file_buttons() only looks at initial ascii-only lines, but + failed on systems where open() defaults to 'ascii' because readline() + internally reads and decodes far enough ahead to encounter a non-ascii + character in CREDITS.txt. + +- bpo-32765: Update configdialog General tab docstring to add new widgets to + the widget list. + +Tools/Demos +----------- + +- bpo-32222: Fix pygettext not extracting docstrings for functions with type + annotated arguments. Patch by Toby Harradine. + + +What's New in Python 3.7.0 beta 1? +================================== + +*Release date: 2018-01-30* + +Core and Builtins +----------------- + +- bpo-32703: Fix coroutine's ResourceWarning when there's an active error + set when it's being finalized. + +- bpo-32650: Pdb and other debuggers dependent on bdb.py will correctly step + over (next command) native coroutines. Patch by Pablo Galindo. + +- bpo-28685: Optimize list.sort() and sorted() by using type specialized + comparisons when possible. + +- bpo-32685: Improve suggestion when the Python 2 form of print statement is + either present on the same line as the header of a compound statement or + else terminated by a semi-colon instead of a newline. Patch by Nitish + Chandra. + +- bpo-32697: Python now explicitly preserves the definition order of + keyword-only parameters. It's always preserved their order, but this + behavior was never guaranteed before; this behavior is now guaranteed and + tested. + +- bpo-32690: The locals() dictionary now displays in the lexical order that + variables were defined. Previously, the order was reversed. + +- bpo-32677: Add ``.isascii()`` method to ``str``, ``bytes`` and + ``bytearray``. It can be used to test that string contains only ASCII + characters. + +- bpo-32670: Enforce :pep:`479` for all code. This means that manually + raising a StopIteration exception from a generator is prohibited for all + code, regardless of whether 'from __future__ import generator_stop' was + used or not. + +- bpo-32591: Added built-in support for tracking the origin of coroutine + objects; see sys.set_coroutine_origin_tracking_depth and + CoroutineType.cr_origin. This replaces the asyncio debug mode's use of + coroutine wrapping for native coroutine objects. + +- bpo-31368: Expose preadv and pwritev system calls in the os module. Patch + by Pablo Galindo + +- bpo-32544: ``hasattr(obj, name)`` and ``getattr(obj, name, default)`` are + about 4 times faster than before when ``name`` is not found and ``obj`` + doesn't override ``__getattr__`` or ``__getattribute__``. + +- bpo-26163: Improved frozenset() hash to create more distinct hash values + when faced with datasets containing many similar values. + +- bpo-32550: Remove the STORE_ANNOTATION bytecode. + +- bpo-20104: Expose posix_spawn as a low level API in the os module. + (removed before 3.7.0rc1) + +- bpo-24340: Fixed estimation of the code stack size. + +- bpo-32436: Implement :pep:`567` Context Variables. + +- bpo-18533: ``repr()`` on a dict containing its own ``values()`` or + ``items()`` no longer raises ``RecursionError``; OrderedDict similarly. + Instead, use ``...``, as for other recursive structures. Patch by Ben + North. + +- bpo-20891: Py_Initialize() now creates the GIL. The GIL is no longer + created "on demand" to fix a race condition when PyGILState_Ensure() is + called in a non-Python thread. + +- bpo-32028: Leading whitespace is now correctly ignored when generating + suggestions for converting Py2 print statements to Py3 builtin print + function calls. Patch by Sanyam Khurana. + +- bpo-31179: Make dict.copy() up to 5.5 times faster. + +- bpo-31113: Get rid of recursion in the compiler for normal control flow. + +Library +------- + +- bpo-25988: Deprecate exposing the contents of collections.abc in the + regular collections module. + +- bpo-31429: The default cipher suite selection of the ssl module now uses a + blacklist approach rather than a hard-coded whitelist. Python no longer + re-enables ciphers that have been blocked by OpenSSL security update. + Default cipher suite selection can be configured on compile time. + +- bpo-30306: contextlib.contextmanager now releases the arguments passed to + the underlying generator as soon as the context manager is entered. + Previously it would keep them alive for as long as the context manager was + alive, even when not being used as a function decorator. Patch by Martin + Teichmann. + +- bpo-21417: Added support for setting the compression level for + zipfile.ZipFile. + +- bpo-32251: Implement asyncio.BufferedProtocol (provisional API). + +- bpo-32513: In dataclasses, allow easier overriding of dunder methods + without specifying decorator parameters. + +- bpo-32660: :mod:`termios` makes available ``FIONREAD``, ``FIONCLEX``, + ``FIOCLEX``, ``FIOASYNC`` and ``FIONBIO`` also under Solaris/derivatives. + +- bpo-27931: Fix email address header parsing error when the username is an + empty quoted string. Patch by Xiang Zhang. + +- bpo-32659: Under Solaris and derivatives, :class:`os.stat_result` provides + a st_fstype attribute. + +- bpo-32662: Implement Server.start_serving(), Server.serve_forever(), and + Server.is_serving() methods. Add 'start_serving' keyword parameter to + loop.create_server() and loop.create_unix_server(). + +- bpo-32391: Implement :meth:`asyncio.StreamWriter.wait_closed` and + :meth:`asyncio.StreamWriter.is_closing` methods + +- bpo-32643: Make Task._step, Task._wakeup and Future._schedule_callbacks + methods private. + +- bpo-32630: Refactor decimal module to use contextvars to store decimal + context. + +- bpo-32622: Add :meth:`asyncio.AbstractEventLoop.sendfile` method. + +- bpo-32304: distutils' upload command no longer corrupts tar files ending + with a CR byte, and no longer tries to convert CR to CRLF in any of the + upload text fields. + +- bpo-32502: uuid.uuid1 no longer raises an exception if a 64-bit hardware + address is encountered. + +- bpo-32596: ``concurrent.futures`` imports ``ThreadPoolExecutor`` and + ``ProcessPoolExecutor`` lazily (using :pep:`562`). It makes ``import + asyncio`` about 15% faster because asyncio uses only + ``ThreadPoolExecutor`` by default. + +- bpo-31801: Add ``_ignore_`` to ``Enum`` so temporary variables can be used + during class construction without being turned into members. + +- bpo-32576: Use queue.SimpleQueue() in places where it can be invoked from + a weakref callback. + +- bpo-32574: Fix memory leak in asyncio.Queue, when the queue has limited + size and it is full, the cancelation of queue.put() can cause a memory + leak. Patch by: José Melero. + +- bpo-32521: The nis module is now compatible with new libnsl and headers + location. + +- bpo-32467: collections.abc.ValuesView now inherits from + collections.abc.Collection. + +- bpo-32473: Improve ABCMeta._dump_registry() output readability + +- bpo-32102: New argument ``capture_output`` for subprocess.run + +- bpo-32521: glibc has removed Sun RPC. Use replacement libtirpc headers and + library in nis module. + +- bpo-32493: UUID module fixes build for FreeBSD/OpenBSD + +- bpo-32503: Pickling with protocol 4 no longer creates too small frames. + +- bpo-29237: Create enum for pstats sorting options + +- bpo-32454: Add close(fd) function to the socket module. + +- bpo-25942: The subprocess module is now more graceful when handling a + Ctrl-C KeyboardInterrupt during subprocess.call, subprocess.run, or a + Popen context manager. It now waits a short amount of time for the child + (presumed to have also gotten the SIGINT) to exit, before continuing the + KeyboardInterrupt exception handling. This still includes a SIGKILL in + the call() and run() APIs, but at least the child had a chance first. + +- bpo-32433: The hmac module now has hmac.digest(), which provides an + optimized HMAC digest. + +- bpo-28134: Sockets now auto-detect family, type and protocol from file + descriptor by default. + +- bpo-32404: Fix bug where :meth:`datetime.datetime.fromtimestamp` did not + call __new__ in :class:`datetime.datetime` subclasses. + +- bpo-32403: Improved speed of :class:`datetime.date` and + :class:`datetime.datetime` alternate constructors. + +- bpo-32228: Ensure that ``truncate()`` preserves the file position (as + reported by ``tell()``) after writes longer than the buffer size. + +- bpo-32410: Implement ``loop.sock_sendfile`` for asyncio event loop. + +- bpo-22908: Added seek and tell to the ZipExtFile class. This only works if + the file object used to open the zipfile is seekable. + +- bpo-32373: Add socket.getblocking() method. + +- bpo-32248: Add :mod:`importlib.resources` and + :class:`importlib.abc.ResourceReader` as the unified API for reading + resources contained within packages. Loaders wishing to support resource + reading must implement the :meth:`get_resource_reader()` method. + File-based and zipimport-based loaders both implement these APIs. + :class:`importlib.abc.ResourceLoader` is deprecated in favor of these new + APIs. + +- bpo-32320: collections.namedtuple() now supports default values. + +- bpo-29302: Add contextlib.AsyncExitStack. Patch by Alexander Mohr and Ilya + Kulakov. + +- bpo-31961: *Removed in Python 3.7.0b2.* The *args* argument of + subprocess.Popen can now be a :term:`path-like object`. If *args* is given + as a sequence, it's first element can now be a :term:`path-like object` as + well. + +- bpo-31900: The :func:`locale.localeconv` function now sets temporarily the + ``LC_CTYPE`` locale to the ``LC_NUMERIC`` locale to decode + ``decimal_point`` and ``thousands_sep`` byte strings if they are non-ASCII + or longer than 1 byte, and the ``LC_NUMERIC`` locale is different than the + ``LC_CTYPE`` locale. This temporary change affects other threads. Same + change for the :meth:`str.format` method when formatting a number + (:class:`int`, :class:`float`, :class:`float` and subclasses) with the + ``n`` type (ex: ``'{:n}'.format(1234)``). + +- bpo-31853: Use super().method instead of socket.method in SSLSocket. They + were there most likely for legacy reasons. + +- bpo-31399: The ssl module now uses OpenSSL's X509_VERIFY_PARAM_set1_host() + and X509_VERIFY_PARAM_set1_ip() API to verify hostname and IP addresses. + Subject common name fallback can be disabled with + SSLContext.hostname_checks_common_name. + +- bpo-14976: Add a queue.SimpleQueue class, an unbounded FIFO queue with a + reentrant C implementation of put(). + +Documentation +------------- + +- bpo-32724: Add references to some commands in the documentation of Pdb. + Patch by Stéphane Wirtel + +- bpo-32649: Complete the C API documentation, profiling and tracing part + with the newly added per-opcode events. + +- bpo-17799: Explain real behaviour of sys.settrace and sys.setprofile and + their C-API counterparts regarding which type of events are received in + each function. Patch by Pablo Galindo Salgado. + +Tests +----- + +- bpo-32721: Fix test_hashlib to not fail if the _md5 module is not built. + +- bpo-28414: Add test cases for IDNA 2003 and 2008 host names. IDNA 2003 + internationalized host names are working since bpo-31399 has landed. IDNA + 2008 are still broken. + +- bpo-32604: Add a new "_xxsubinterpreters" extension module that exposes + the existing subinterpreter C-API and a new cross-interpreter data sharing + mechanism. The module is primarily intended for more thorough testing of + the existing subinterpreter support. Note that the _xxsubinterpreters + module has been removed in 3.7.0rc1. + +- bpo-32602: Add test certs and test for ECDSA cert and EC/RSA dual mode. + +- bpo-32549: On Travis CI, Python now Compiles and uses a local copy of + OpenSSL 1.1.0g for testing. + +Build +----- + +- bpo-32635: Fix segfault of the crypt module when libxcrypt is provided + instead of libcrypt at the system. + +- bpo-32598: Use autoconf to detect OpenSSL libs, headers and supported + features. The ax_check_openssl M4 macro uses pkg-config to locate OpenSSL + and falls back to manual search. + +- bpo-32593: Drop support of FreeBSD 9 and older. + +- bpo-29708: If the :envvar:`SOURCE_DATE_EPOCH` environment variable is set, + :mod:`py_compile` will always create hash-based ``.pyc`` files. + +Windows +------- + +- bpo-32588: Create standalone _distutils_findvs module and add missing + _queue module to installer. + +- bpo-29911: Ensure separate Modify and Uninstall buttons are displayed. + +- bpo-32507: Use app-local UCRT install rather than the proper update for + old versions of Windows. + +macOS +----- + +- bpo-32726: Provide an additional, more modern macOS installer variant that + supports macOS 10.9+ systems in 64-bit mode only. Upgrade the supplied + third-party libraries to OpenSSL 1.1.0g and to SQLite 3.22.0. The 10.9+ + installer now links with and supplies its own copy of Tcl/Tk 8.6. + +- bpo-28440: No longer add /Library/Python/3.x/site-packages to sys.path for + macOS framework builds to avoid future conflicts. + +C API +----- + +- bpo-32681: Fix uninitialized variable 'res' in the C implementation of + os.dup2. Patch by Stéphane Wirtel + +- bpo-10381: Add C API access to the ``datetime.timezone`` constructor and + ``datetime.timzone.UTC`` singleton. + + +What's New in Python 3.7.0 alpha 4? +=================================== + +*Release date: 2018-01-08* + +Core and Builtins +----------------- + +- bpo-31975: The default warning filter list now starts with a + "default::DeprecationWarning:__main__" entry, so deprecation warnings are + once again shown by default in single-file scripts and at the interactive + prompt. + +- bpo-32226: ``__class_getitem__`` is now an automatic class method. + +- bpo-32399: Add AIX uuid library support for RFC4122 using uuid_create() in + libc.a + +- bpo-32390: Fix the compilation failure on AIX after the f_fsid field has + been added to the object returned by os.statvfs() (issue #32143). Original + patch by Michael Felt. + +- bpo-32379: Make MRO computation faster when a class inherits from a single + base. + +- bpo-32259: The error message of a TypeError raised when unpack + non-iterable is now more specific. + +- bpo-27169: The ``__debug__`` constant is now optimized out at compile + time. This fixes also bpo-22091. + +- bpo-32329: The :option:`-R` option now turns on hash randomization when + the :envvar:`PYTHONHASHSEED` environment variable is set to ``0``. + Previously, the option was ignored. Moreover, + ``sys.flags.hash_randomization`` is now properly set to 0 when hash + randomization is turned off by ``PYTHONHASHSEED=0``. + +- bpo-30416: The optimizer is now protected from spending much time doing + complex calculations and consuming much memory for creating large + constants in constant folding. Increased limits for constants that can be + produced in constant folding. + +- bpo-32282: Fix an unnecessary ifdef in the include of VersionHelpers.h in + socketmodule on Windows. + +- bpo-30579: Implement TracebackType.__new__ to allow Python-level creation + of traceback objects, and make TracebackType.tb_next mutable. + +- bpo-32260: Don't byte swap the input keys to the SipHash algorithm on + big-endian platforms. This should ensure siphash gives consistent results + across platforms. + +- bpo-31506: Improve the error message logic for object.__new__ and + object.__init__. Patch by Sanyam Khurana. + +- bpo-20361: ``-b`` and ``-bb`` now inject ``'default::BytesWarning'`` and + ``error::BytesWarning`` entries into ``sys.warnoptions``, ensuring that + they take precedence over any other warning filters configured via the + ``-W`` option or the ``PYTHONWARNINGS`` environment variable. + +- bpo-32230: `-X dev` now injects a ``'default'`` entry into + sys.warnoptions, ensuring that it behaves identically to actually passing + ``-Wdefault`` at the command line. + +- bpo-29240: Add a new UTF-8 mode: implementation of the :pep:`540`. + +- bpo-32226: :pep:`560`: Add support for ``__mro_entries__`` and + ``__class_getitem__``. Implemented by Ivan Levkivskyi. + +- bpo-32225: :pep:`562`: Add support for module ``__getattr__`` and + ``__dir__``. Implemented by Ivan Levkivskyi. + +- bpo-31901: The `atexit` module now has its callback stored per + interpreter. + +- bpo-31650: Implement :pep:`552` (Deterministic pycs). Python now supports + invalidating bytecode cache files bashed on a source content hash rather + than source last-modified time. + +- bpo-29469: Move constant folding from bytecode layer to AST layer. + Original patch by Eugene Toder. + +Library +------- + +- bpo-32506: Now that dict is defined as keeping insertion order, drop + OrderedDict and just use plain dict. + +- bpo-32279: Add params to dataclasses.make_dataclasses(): init, repr, eq, + order, hash, and frozen. Pass them through to dataclass(). + +- bpo-32278: Make type information optional on dataclasses.make_dataclass(). + If omitted, the string 'typing.Any' is used. + +- bpo-32499: Add dataclasses.is_dataclass(obj), which returns True if obj is + a dataclass or an instance of one. + +- bpo-32468: Improve frame repr() to mention filename, code name and current + line number. + +- bpo-23749: asyncio: Implement loop.start_tls() + +- bpo-32441: Return the new file descriptor (i.e., the second argument) from + ``os.dup2``. Previously, ``None`` was always returned. + +- bpo-32422: ``functools.lru_cache`` uses less memory (3 words for each + cached key) and takes about 1/3 time for cyclic GC. + +- bpo-31721: Prevent Python crash from happening when Future._log_traceback + is set to True manually. Now it can only be set to False, or a ValueError + is raised. + +- bpo-32415: asyncio: Add Task.get_loop() and Future.get_loop() + +- bpo-26133: Don't unsubscribe signals in asyncio UNIX event loop on + interpreter shutdown. + +- bpo-32363: Make asyncio.Task.set_exception() and set_result() raise + NotImplementedError. Task._step() and Future.__await__() raise proper + exceptions when they are in an invalid state, instead of raising an + AssertionError. + +- bpo-32357: Optimize asyncio.iscoroutine() and loop.create_task() for + non-native coroutines (e.g. async/await compiled with Cython). + 'loop.create_task(python_coroutine)' used to be 20% faster than + 'loop.create_task(cython_coroutine)'. Now, the latter is as fast. + +- bpo-32356: asyncio.transport.resume_reading() and pause_reading() are now + idempotent. New transport.is_reading() method is added. + +- bpo-32355: Optimize asyncio.gather(); now up to 15% faster. + +- bpo-32351: Use fastpath in asyncio.sleep if delay<0 (2x boost) + +- bpo-32348: Optimize asyncio.Future schedule/add/remove callback. The + optimization shows 3-6% performance improvements of async/await code. + +- bpo-32331: Fix socket.settimeout() and socket.setblocking() to keep + socket.type as is. Fix socket.socket() constructor to reset any bit flags + applied to socket's type. This change only affects OSes that have + SOCK_NONBLOCK and/or SOCK_CLOEXEC. + +- bpo-32248: Add :class:`importlib.abc.ResourceReader` as an ABC for loaders + to provide a unified API for reading resources contained within packages. + Also add :mod:`importlib.resources` as the port of + ``importlib_resources``. + +- bpo-32311: Implement asyncio.create_task(coro) shortcut + +- bpo-32327: Convert asyncio functions that were documented as coroutines to + coroutines. Affected functions: loop.sock_sendall, loop.sock_recv, + loop.sock_accept, loop.getaddrinfo, loop.getnameinfo. + +- bpo-32323: :func:`urllib.parse.urlsplit()` does not convert zone-id + (scope) to lower case for scoped IPv6 addresses in hostnames now. + +- bpo-32302: Fix bdist_wininst of distutils for CRT v142: it binary + compatible with CRT v140. + +- bpo-29711: Fix ``stop_serving`` in asyncio proactor loop kill all + listening servers + +- bpo-32308: :func:`re.sub()` now replaces empty matches adjacent to a + previous non-empty match. + +- bpo-29970: Abort asyncio SSLProtocol connection if handshake not complete + within 10s + +- bpo-32314: Implement asyncio.run(). + +- bpo-17852: Revert incorrect fix based on misunderstanding of + _Py_PyAtExit() semantics. + +- bpo-32296: Implement asyncio._get_running_loop() and get_event_loop() in + C. This makes them 4x faster. + +- bpo-32250: Implement ``asyncio.current_task()`` and + ``asyncio.all_tasks()``. Add helpers intended to be used by alternative + task implementations: ``asyncio._register_task``, ``asyncio._enter_task``, + ``asyncio._leave_task`` and ``asyncio._unregister_task``. Deprecate + ``asyncio.Task.current_task()`` and ``asyncio.Task.all_tasks()``. + +- bpo-32255: A single empty field is now always quoted when written into a + CSV file. This allows to distinguish an empty row from a row consisting of + a single empty field. Patch by Licht Takeuchi. + +- bpo-32277: Raise ``NotImplementedError`` instead of ``SystemError`` on + platforms where ``chmod(..., follow_symlinks=False)`` is not supported. + Patch by Anthony Sottile. + +- bpo-30050: New argument warn_on_full_buffer to signal.set_wakeup_fd lets + you control whether Python prints a warning on stderr when the wakeup fd + buffer overflows. + +- bpo-29137: The ``fpectl`` library has been removed. It was never enabled + by default, never worked correctly on x86-64, and it changed the Python + ABI in ways that caused unexpected breakage of C extensions. + +- bpo-32273: Move asyncio.test_utils to test.test_asyncio. + +- bpo-32272: Remove asyncio.async() function. + +- bpo-32269: Add asyncio.get_running_loop() function. + +- bpo-32265: All class and static methods of builtin types now are correctly + classified by inspect.classify_class_attrs() and grouped in pydoc ouput. + Added types.ClassMethodDescriptorType for unbound class methods of builtin + types. + +- bpo-32253: Deprecate ``yield from lock``, ``await lock``, ``with (yield + from lock)`` and ``with await lock`` for asyncio synchronization + primitives. + +- bpo-22589: Changed MIME type of .bmp from 'image/x-ms-bmp' to 'image/bmp' + +- bpo-32193: Convert asyncio to use *async/await* syntax. Old styled ``yield + from`` is still supported too. + +- bpo-32206: Add support to run modules with pdb + +- bpo-32227: ``functools.singledispatch`` now supports registering + implementations using type annotations. + +- bpo-15873: Added new alternate constructors + :meth:`datetime.datetime.fromisoformat`, + :meth:`datetime.time.fromisoformat` and + :meth:`datetime.date.fromisoformat` as the inverse operation of each + classes's respective ``isoformat`` methods. + +- bpo-32199: The getnode() ip getter now uses 'ip link' instead of 'ip link + list'. + +- bpo-32143: os.statvfs() includes the f_fsid field from statvfs(2) + +- bpo-26439: Fix ctypes.util.find_library() for AIX by implementing + ctypes._aix.find_library() Patch by: Michael Felt + +- bpo-31993: The pickler now uses less memory when serializing large bytes + and str objects into a file. Pickles created with protocol 4 will require + less memory for unpickling large bytes and str objects. + +- bpo-27456: Ensure TCP_NODELAY is set on Linux. Tests by Victor Stinner. + +- bpo-31778: ast.literal_eval() is now more strict. Addition and subtraction + of arbitrary numbers no longer allowed. + +- bpo-31802: Importing native path module (``posixpath``, ``ntpath``) now + works even if the ``os`` module still is not imported. + +- bpo-30241: Add contextlib.AbstractAsyncContextManager. Patch by Jelle + Zijlstra. + +- bpo-31699: Fix deadlocks in + :class:`concurrent.futures.ProcessPoolExecutor` when task arguments or + results cause pickling or unpickling errors. This should make sure that + calls to the :class:`ProcessPoolExecutor` API always eventually return. + +- bpo-15216: ``TextIOWrapper.reconfigure()`` supports changing *encoding*, + *errors*, and *newline*. + +Documentation +------------- + +- bpo-32418: Add get_loop() method to Server and AbstractServer classes. + +Tests +----- + +- bpo-32252: Fix faulthandler_suppress_crash_report() used to prevent core + dump files when testing crashes. getrlimit() returns zero on success. + +- bpo-32002: Adjust C locale coercion testing for the empty locale and POSIX + locale cases to more readily adjust to platform dependent behaviour. + +Windows +------- + +- bpo-19764: Implement support for `subprocess.Popen(close_fds=True)` on + Windows. Patch by Segev Finer. + +Tools/Demos +----------- + +- bpo-24960: 2to3 and lib2to3 can now read pickled grammar files using + pkgutil.get_data() rather than probing the filesystem. This lets 2to3 and + lib2to3 work when run from a zipfile. + +C API +----- + +- bpo-32030: Py_Initialize() doesn't reset the memory allocators to default + if the ``PYTHONMALLOC`` environment variable is not set. + +- bpo-29084: Undocumented C API for OrderedDict has been excluded from the + limited C API. It was added by mistake and actually never worked in the + limited C API. + +- bpo-32264: Moved the pygetopt.h header into internal/, since it has no + public APIs. + +- bpo-32241: :c:func:`Py_SetProgramName` and :c:func:`Py_SetPythonHome` now + take the ``const wchar *`` arguments instead of ``wchar *``. + + +What's New in Python 3.7.0 alpha 3? +=================================== + +*Release date: 2017-12-05* + +Core and Builtins +----------------- + +- bpo-32176: co_flags.CO_NOFREE is now always set correctly by the code + object constructor based on freevars and cellvars, rather than needing to + be set correctly by the caller. This ensures it will be cleared + automatically when additional cell references are injected into a modified + code object and function. + +- bpo-10544: Yield expressions are now deprecated in comprehensions and + generator expressions. They are still permitted in the definition of the + outermost iterable, as that is evaluated directly in the enclosing scope. + +- bpo-32137: The repr of deeply nested dict now raises a RecursionError + instead of crashing due to a stack overflow. + +- bpo-32096: Revert memory allocator changes in the C API: move structures + back from _PyRuntime to Objects/obmalloc.c. The memory allocators are once + again initialized statically, and so PyMem_RawMalloc() and + Py_DecodeLocale() can be called before _PyRuntime_Initialize(). + +- bpo-32043: Add a new "developer mode": new "-X dev" command line option to + enable debug checks at runtime. + +- bpo-32023: SyntaxError is now correctly raised when a generator expression + without parenthesis is used instead of an inheritance list in a class + definition. The duplication of the parentheses can be omitted only on + calls. + +- bpo-32012: SyntaxError is now correctly raised when a generator expression + without parenthesis is passed as an argument, but followed by a trailing + comma. A generator expression always needs to be directly inside a set of + parentheses and cannot have a comma on either side. + +- bpo-28180: A new internal ``_Py_SetLocaleFromEnv(category)`` helper + function has been added in order to improve the consistency of behaviour + across different ``libc`` implementations (e.g. Android doesn't support + setting the locale from the environment by default). + +- bpo-31949: Fixed several issues in printing tracebacks + (PyTraceBack_Print()). Setting sys.tracebacklimit to 0 or less now + suppresses printing tracebacks. Setting sys.tracebacklimit to None now + causes using the default limit. Setting sys.tracebacklimit to an integer + larger than LONG_MAX now means using the limit LONG_MAX rather than the + default limit. Fixed integer overflows in the case of more than 2**31 + traceback items on Windows. Fixed output errors handling. + +- bpo-30696: Fix the interactive interpreter looping endlessly when no + memory. + +- bpo-20047: Bytearray methods partition() and rpartition() now accept only + bytes-like objects as separator, as documented. In particular they now + raise TypeError rather of returning a bogus result when an integer is + passed as a separator. + +- bpo-21720: BytesWarning no longer emitted when the *fromlist* argument of + ``__import__()`` or the ``__all__`` attribute of the module contain bytes + instances. + +- bpo-31845: Environment variables are once more read correctly at + interpreter startup. + +- bpo-28936: Ensure that lexically first syntax error involving a parameter + and ``global`` or ``nonlocal`` is detected first at a given scope. Patch + by Ivan Levkivskyi. + +- bpo-31825: Fixed OverflowError in the 'unicode-escape' codec and in + codecs.escape_decode() when decode an escaped non-ascii byte. + +- bpo-31618: The per-frame tracing logic added in 3.7a1 has been altered so + that ``frame->f_lineno`` is updated before either ``"line"`` or + ``"opcode"`` events are emitted. Previously, opcode events were emitted + first, and therefore would occasionally see stale line numbers on the + frame. The behavior of this feature has changed slightly as a result: when + both ``f_trace_lines`` and ``f_trace_opcodes`` are enabled, line events + now occur first. + +- bpo-28603: Print the full context/cause chain of exceptions on interpreter + exit, even if an exception in the chain is unhashable or compares equal to + later ones. Patch by Zane Bitter. + +- bpo-31786: Fix timeout rounding in the select module to round correctly + negative timeouts between -1.0 and 0.0. The functions now block waiting + for events as expected. Previously, the call was incorrectly non-blocking. + Patch by Pablo Galindo. + +- bpo-31781: Prevent crashes when calling methods of an uninitialized + ``zipimport.zipimporter`` object. Patch by Oren Milman. + +- bpo-30399: Standard repr() of BaseException with a single argument no + longer contains redundant trailing comma. + +- bpo-31626: Fixed a bug in debug memory allocator. There was a write to + freed memory after shrinking a memory block. + +- bpo-30817: `PyErr_PrintEx()` clears now the ignored exception that may be + raised by `_PySys_SetObjectId()`, for example when no memory. + +Library +------- + +- bpo-28556: Two minor fixes for ``typing`` module: allow shallow copying + instances of generic classes, improve interaction of ``__init_subclass__`` + with generics. Original PRs by Ivan Levkivskyi. + +- bpo-32214: PEP 557, Data Classes. Provides a decorator which adds + boilerplate methods to classes which use type annotations so specify + fields. + +- bpo-27240: The header folding algorithm for the new email policies has + been rewritten, which also fixes bpo-30788, bpo-31831, and bpo-32182. In + particular, RFC2231 folding is now done correctly. + +- bpo-32186: io.FileIO.readall() and io.FileIO.read() now release the GIL + when getting the file size. Fixed hang of all threads with inaccessible + NFS server. Patch by Nir Soffer. + +- bpo-321010: Add :attr:`sys.flags.dev_mode` flag + +- bpo-32154: The ``asyncio.windows_utils.socketpair()`` function has been + removed: use directly :func:`socket.socketpair` which is available on all + platforms since Python 3.5 (before, it wasn't available on Windows). + ``asyncio.windows_utils.socketpair()`` was just an alias to + ``socket.socketpair`` on Python 3.5 and newer. + +- bpo-32089: warnings: In development (-X dev) and debug mode (pydebug + build), use the "default" action for ResourceWarning, rather than the + "always" action, in the default warnings filters. + +- bpo-32107: ``uuid.getnode()`` now preferentially returns universally + administered MAC addresses if available, over locally administered MAC + addresses. This makes a better guarantee for global uniqueness of UUIDs + returned from ``uuid.uuid1()``. If only locally administered MAC + addresses are available, the first such one found is returned. + +- bpo-23033: Wildcard is now supported in hostname when it is one and only + character in the left most segment of hostname in second argument of + :meth:`ssl.match_hostname`. Patch by Mandeep Singh. + +- bpo-12239: Make :meth:`msilib.SummaryInformation.GetProperty` return + ``None`` when the value of property is ``VT_EMPTY``. Initial patch by + Mark Mc Mahon. + +- bpo-28334: Use :func:`os.path.expanduser` to find the ``~/.netrc`` file in + :class:`netrc.netrc`. If it does not exist, :exc:`FileNotFoundError` is + raised. Patch by Dimitri Merejkowsky. + +- bpo-32121: Made ``tracemalloc.Traceback`` behave more like the traceback + module, sorting the frames from oldest to most recent. + ``Traceback.format()`` now accepts negative *limit*, truncating the result + to the ``abs(limit)`` oldest frames. To get the old behaviour, one can use + the new *most_recent_first* argument to ``Traceback.format()``. (Patch by + Jesse Bakker.) + +- bpo-31325: Fix wrong usage of :func:`collections.namedtuple` in the + :meth:`RobotFileParser.parse() ` + method. Initial patch by Robin Wellner. + +- bpo-12382: :func:`msilib.OpenDatabase` now raises a better exception + message when it couldn't open or create an MSI file. Initial patch by + William Tisäter. + +- bpo-19610: ``setup()`` now warns about invalid types for some fields. The + ``distutils.dist.Distribution`` class now warns when ``classifiers``, + ``keywords`` and ``platforms`` fields are not specified as a list or a + string. + +- bpo-32071: Added the ``-k`` command-line option to ``python -m unittest`` + to run only tests that match the given pattern(s). + +- bpo-10049: Added *nullcontext* no-op context manager to contextlib. This + provides a simpler and faster alternative to ExitStack() when handling + optional context managers. + +- bpo-28684: The new test.support.skip_unless_bind_unix_socket() decorator + is used here to skip asyncio tests that fail because the platform lacks a + functional bind() function for unix domain sockets (as it is the case for + non root users on the recent Android versions that run now SELinux in + enforcing mode). + +- bpo-32110: ``codecs.StreamReader.read(n)`` now returns not more than *n* + characters/bytes for non-negative *n*. This makes it compatible with + ``read()`` methods of other file-like objects. + +- bpo-27535: The warnings module doesn't leak memory anymore in the hidden + warnings registry for the "ignore" action of warnings filters. + warn_explicit() function doesn't add the warning key to the registry + anymore for the "ignore" action. + +- bpo-32088: warnings: When Python is build is debug mode (``Py_DEBUG``), + :exc:`DeprecationWarning`, :exc:`PendingDeprecationWarning` and + :exc:`ImportWarning` warnings are now displayed by default. + +- bpo-1647489: Fixed searching regular expression patterns that could match + an empty string. Non-empty string can now be correctly found after + matching an empty string. + +- bpo-25054: Added support of splitting on a pattern that could match an + empty string. + +- bpo-32072: Fixed issues with binary plists: Fixed saving bytearrays. + Identical objects will be saved only once. Equal references will be load + as identical objects. Added support for saving and loading recursive data + structures. + +- bpo-32069: Drop legacy SSL transport from asyncio, ssl.MemoryBIO is always + used anyway. + +- bpo-32066: asyncio: Support pathlib.Path in create_unix_connection; sock + arg should be optional + +- bpo-32046: Updates 2to3 to convert from operator.isCallable(obj) to + callable(obj). Patch by Dong-hee Na. + +- bpo-32018: inspect.signature should follow :pep:`8`, if the parameter has + an annotation and a default value. Patch by Dong-hee Na. + +- bpo-32025: Add time.thread_time() and time.thread_time_ns() + +- bpo-32037: Integers that fit in a signed 32-bit integer will be now + pickled with protocol 0 using the INT opcode. This will decrease the size + of a pickle, speed up pickling and unpickling, and make these integers be + unpickled as int instances in Python 2. + +- bpo-32034: Make asyncio.IncompleteReadError and LimitOverrunError + pickleable. + +- bpo-32015: Fixed the looping of asyncio in the case of reconnection the + socket during waiting async read/write from/to the socket. + +- bpo-32011: Restored support of loading marshal files with the TYPE_INT64 + code. These files can be produced in Python 2.7. + +- bpo-28369: Enhance add_reader/writer check that socket is not used by some + transport. Before, only cases when add_reader/writer were called with an + int FD were supported. Now the check is implemented correctly for all + file-like objects. + +- bpo-31976: Fix race condition when flushing a file is slow, which can + cause a segfault if closing the file from another thread. + +- bpo-31985: Formally deprecated aifc.openfp, sunau.openfp, and wave.openfp. + Since change 7bc817d5ba917528e8bd07ec461c635291e7b06a in 1993, openfp in + each of the three modules had been pointing to that module's open function + as a matter of backwards compatibility, though it had been both untested + and undocumented. + +- bpo-21862: cProfile command line now accepts `-m module_name` as an + alternative to script path. Patch by Sanyam Khurana. + +- bpo-31970: Reduce performance overhead of asyncio debug mode. + +- bpo-31843: *database* argument of sqlite3.connect() now accepts a + :term:`path-like object`, instead of just a string. + +- bpo-31945: Add Configurable *blocksize* to ``HTTPConnection`` and + ``HTTPSConnection`` for improved upload throughput. Patch by Nir Soffer. + +- bpo-31943: Add a ``cancelled()`` method to :class:`asyncio.Handle`. Patch + by Marat Sharafutdinov. + +- bpo-9678: Fixed determining the MAC address in the uuid module: Using + ifconfig on NetBSD and OpenBSD. Using arp on Linux, FreeBSD, NetBSD and + OpenBSD. Based on patch by Takayuki Shimizukawa. + +- bpo-30057: Fix potential missed signal in signal.signal(). + +- bpo-31933: Fix Blake2 params leaf_size and node_offset on big endian + platforms. Patch by Jack O'Connor. + +- bpo-21423: Add an initializer argument to {Process,Thread}PoolExecutor + +- bpo-31927: Fixed compilation of the socket module on NetBSD 8. Fixed + assertion failure or reading arbitrary data when parse a AF_BLUETOOTH + address on NetBSD and DragonFly BSD. + +- bpo-27666: Fixed stack corruption in curses.box() and curses.ungetmouse() + when the size of types chtype or mmask_t is less than the size of C long. + curses.box() now accepts characters as arguments. Based on patch by Steve + Fink. + +- bpo-31917: Add 3 new clock identifiers: :data:`time.CLOCK_BOOTTIME`, + :data:`time.CLOCK_PROF` and :data:`time.CLOCK_UPTIME`. + +- bpo-31897: plistlib now catches more errors when read binary plists and + raises InvalidFileException instead of unexpected exceptions. + +- bpo-25720: Fix the method for checking pad state of curses WINDOW. Patch + by Masayuki Yamamoto. + +- bpo-31893: Fixed the layout of the kqueue_event structure on OpenBSD and + NetBSD. Fixed the comparison of the kqueue_event objects. + +- bpo-31891: Fixed building the curses module on NetBSD. + +- bpo-31884: added required constants to subprocess module for setting + priority on windows + +- bpo-28281: Remove year (1-9999) limits on the Calendar.weekday() function. + Patch by Mark Gollahon. + +- bpo-31702: crypt.mksalt() now allows to specify the number of rounds for + SHA-256 and SHA-512 hashing. + +- bpo-30639: :func:`inspect.getfile` no longer computes the repr of unknown + objects to display in an error message, to protect against badly behaved + custom reprs. + +- bpo-30768: Fix the pthread+semaphore implementation of + PyThread_acquire_lock_timed() when called with timeout > 0 and + intr_flag=0: recompute the timeout if sem_timedwait() is interrupted by a + signal (EINTR). See also the :pep:`475`. + +- bpo-31854: Add ``mmap.ACCESS_DEFAULT`` constant. + +- bpo-31834: Use optimized code for BLAKE2 only with SSSE3+. The pure SSE2 + implementation is slower than the pure C reference implementation. + +- bpo-28292: Calendar.itermonthdates() will now consistently raise an + exception when a date falls outside of the 0001-01-01 through 9999-12-31 + range. To support applications that cannot tolerate such exceptions, the + new methods itermonthdays3() and itermonthdays4() are added. The new + methods return tuples and are not restricted by the range supported by + datetime.date. + +- bpo-28564: The shutil.rmtree() function has been sped up to 20--40%. This + was done using the os.scandir() function. + +- bpo-28416: Instances of pickle.Pickler subclass with the persistent_id() + method and pickle.Unpickler subclass with the persistent_load() method no + longer create reference cycles. + +- bpo-31653: Don't release the GIL if we can acquire a multiprocessing + semaphore immediately. + +- bpo-28326: Fix multiprocessing.Process when stdout and/or stderr is closed + or None. + +- bpo-20825: Add `subnet_of` and `superset_of` containment tests to + :class:`ipaddress.IPv6Network` and :class:`ipaddress.IPv4Network`. Patch + by Michel Albert and Cheryl Sabella. + +- bpo-31827: Remove the os.stat_float_times() function. It was introduced in + Python 2.3 for backward compatibility with Python 2.2, and was deprecated + since Python 3.1. + +- bpo-31756: Add a ``subprocess.Popen(text=False)`` keyword argument to + `subprocess` functions to be more explicit about when the library should + attempt to decode outputs into text. Patch by Andrew Clegg. + +- bpo-31819: Add AbstractEventLoop.sock_recv_into(). + +- bpo-31457: If nested log adapters are used, the inner ``process()`` + methods are no longer omitted. + +- bpo-31457: The ``manager`` property on LoggerAdapter objects is now + properly settable. + +- bpo-31806: Fix timeout rounding in time.sleep(), threading.Lock.acquire() + and socket.socket.settimeout() to round correctly negative timeouts + between -1.0 and 0.0. The functions now block waiting for events as + expected. Previously, the call was incorrectly non-blocking. Patch by + Pablo Galindo. + +- bpo-31803: time.clock() and time.get_clock_info('clock') now emit a + DeprecationWarning warning. + +- bpo-31800: Extended support for parsing UTC offsets. strptime '%z' can now + parse the output generated by datetime.isoformat, including seconds and + microseconds. + +- bpo-28603: traceback: Fix a TypeError that occurred during printing of + exception tracebacks when either the current exception or an exception in + its context/cause chain is unhashable. Patch by Zane Bitter. + +- bpo-30541: Add new function to seal a mock and prevent the automatically + creation of child mocks. Patch by Mario Corchero. + +- bpo-31784: Implement the :pep:`564`, add new 6 new functions with + nanosecond resolution to the :mod:`time` module: + :func:`~time.clock_gettime_ns`, :func:`~time.clock_settime_ns`, + :func:`~time.monotonic_ns`, :func:`~time.perf_counter_ns`, + :func:`~time.process_time_ns`, :func:`~time.time_ns`. + +- bpo-30143: 2to3 now generates a code that uses abstract collection classes + from collections.abc rather than collections. + +- bpo-31770: Prevent a crash when calling the ``__init__()`` method of a + ``sqlite3.Cursor`` object more than once. Patch by Oren Milman. + +- bpo-31764: Prevent a crash in ``sqlite3.Cursor.close()`` in case the + ``Cursor`` object is uninitialized. Patch by Oren Milman. + +- bpo-31752: Fix possible crash in timedelta constructor called with custom + integers. + +- bpo-31620: an empty asyncio.Queue now doesn't leak memory when queue.get + pollers timeout + +- bpo-31690: Allow the flags re.ASCII, re.LOCALE, and re.UNICODE to be used + as group flags for regular expressions. + +- bpo-30349: FutureWarning is now emitted if a regular expression contains + character set constructs that will change semantically in the future + (nested sets and set operations). + +- bpo-31664: Added support for the Blowfish hashing in the crypt module. + +- bpo-31632: Fix method set_protocol() of class _SSLProtocolTransport in + asyncio module. This method was previously modifying a wrong reference to + the protocol. + +- bpo-15037: Added a workaround for getkey() in curses for ncurses 5.7 and + earlier. + +- bpo-31307: Allow use of bytes objects for arguments to + :meth:`configparser.ConfigParser.read`. Patch by Vincent Michel. + +- bpo-31334: Fix ``poll.poll([timeout])`` in the ``select`` module for + arbitrary negative timeouts on all OSes where it can only be a + non-negative integer or -1. Patch by Riccardo Coccioli. + +- bpo-31310: multiprocessing's semaphore tracker should be launched again if + crashed. + +- bpo-31308: Make multiprocessing's forkserver process immune to Ctrl-C and + other user interruptions. If it crashes, restart it when necessary. + +- bpo-31245: Added support for AF_UNIX socket in asyncio + `create_datagram_endpoint`. + +- bpo-30553: Add HTTP/2 status code 421 (Misdirected Request) to + :class:`http.HTTPStatus`. Patch by Vitor Pereira. + +Documentation +------------- + +- bpo-32105: Added asyncio.BaseEventLoop.connect_accepted_socket + versionadded marker. + +Tests +----- + +- bpo-31380: Skip test_httpservers test_undecodable_file on macOS: fails on + APFS. + +- bpo-31705: Skip test_socket.test_sha256() on Linux kernel older than 4.5. + The test fails with ENOKEY on kernel 3.10 (on ppc64le). A fix was merged + into the kernel 4.5. + +- bpo-32138: Skip on Android test_faulthandler tests that raise SIGSEGV and + remove the test.support.requires_android_level decorator. + +- bpo-32136: The runtime embedding tests have been split out from + ``Lib/test/test_capi.py`` into a new ``Lib/test/test_embed.py`` file. + +- bpo-28668: test.support.requires_multiprocessing_queue is removed. Skip + tests with test.support.import_module('multiprocessing.synchronize') + instead when the semaphore implementation is broken or missing. + +- bpo-32126: Skip test_get_event_loop_new_process in + test.test_asyncio.test_events when sem_open() is not functional. + +- bpo-31174: Fix test_tools.test_unparse: DirectoryTestCase now stores the + names sample to always test the same files. It prevents false alarms when + hunting reference leaks. + +Build +----- + +- bpo-28538: Revert the previous changes, the if_nameindex structure is + defined by Unified Headers. + +- bpo-28762: Revert the last commit, the F_LOCK macro is defined by Android + Unified Headers. + +- bpo-29040: Support building Android with Unified Headers. The first NDK + release to support Unified Headers is android-ndk-r14. + +- bpo-32059: ``detect_modules()`` in ``setup.py`` now also searches the + sysroot paths when cross-compiling. + +- bpo-31957: Fixes Windows SDK version detection when building for Windows. + +- bpo-31609: Fixes quotes in PCbuild/clean.bat + +- bpo-31934: Abort the build when building out of a not clean source tree. + +- bpo-31926: Fixed Argument Clinic sometimes causing compilation errors when + there was more than one function and/or method in a .c file with the same + name. + +- bpo-28791: Update Windows builds to use SQLite 3.21.0. + +- bpo-28791: Update OS X installer to use SQLite 3.21.0. + +- bpo-28643: Record profile-opt build progress with stamp files. + +- bpo-31866: Finish removing support for AtheOS. + +Windows +------- + +- bpo-1102: Return ``None`` when ``View.Fetch()`` returns + ``ERROR_NO_MORE_ITEMS`` instead of raising ``MSIError``. Initial patch by + Anthony Tuininga. + +- bpo-31944: Fixes Modify button in Apps and Features dialog. + +- bpo-20486: Implement the ``Database.Close()`` method to help closing MSI + database objects. + +- bpo-31857: Make the behavior of USE_STACKCHECK deterministic in a + multi-threaded environment. + +macOS +----- + +- bpo-31392: Update macOS installer to use OpenSSL 1.0.2m + +IDLE +---- + +- bpo-32207: Improve tk event exception tracebacks in IDLE. When tk event + handling is driven by IDLE's run loop, a confusing and distracting + queue.EMPTY traceback context is no longer added to tk event exception + tracebacks. The traceback is now the same as when event handling is + driven by user code. Patch based on a suggestion by Serhiy Storchaka. + +- bpo-32164: Delete unused file idlelib/tabbedpages.py. Use of TabbedPageSet + in configdialog was replaced by ttk.Notebook. + +- bpo-32100: IDLE: Fix old and new bugs in pathbrowser; improve tests. Patch + mostly by Cheryl Sabella. + +- bpo-31858: IDLE -- Restrict shell prompt manipulation to the shell. Editor + and output windows only see an empty last prompt line. This simplifies + the code and fixes a minor bug when newline is inserted. Sys.ps1, if + present, is read on Shell start-up, but is not set or changed. + +- bpo-31860: The font sample in the IDLE configuration dialog is now + editable. Changes persist while IDLE remains open + +- bpo-31836: Test_code_module now passes if run after test_idle, which sets + ps1. The code module uses sys.ps1 if present or sets it to '>>> ' if not. + Test_code_module now properly tests both behaviors. Ditto for ps2. + +- bpo-28603: Fix a TypeError that caused a shell restart when printing a + traceback that includes an exception that is unhashable. Patch by Zane + Bitter. + +- bpo-13802: Use non-Latin characters in the IDLE's Font settings sample. + Even if one selects a font that defines a limited subset of the unicode + Basic Multilingual Plane, tcl/tk will use other fonts that define a + character. The expanded example give users of non-Latin characters a + better idea of what they might see in IDLE's shell and editors. To make + room for the expanded sample, frames on the Font tab are re-arranged. The + Font/Tabs help explains a bit about the additions. + +Tools/Demos +----------- + +- bpo-32159: Remove CVS and Subversion tools: remove svneol.py and + treesync.py scripts. CPython migrated from CVS to Subversion, to + Mercurial, and then to Git. CVS and Subversion are no longer used to + develop CPython. + +- bpo-30722: Make redemo work with Python 3.6 and newer versions. Also, + remove the ``LOCALE`` option since it doesn't work with string patterns in + Python 3. Patch by Christoph Sarnowski. + +C API +----- + +- bpo-20891: Fix PyGILState_Ensure(). When PyGILState_Ensure() is called in + a non-Python thread before PyEval_InitThreads(), only call + PyEval_InitThreads() after calling PyThreadState_New() to fix a crash. + +- bpo-32125: The ``Py_UseClassExceptionsFlag`` flag has been removed. It was + deprecated and wasn't used anymore since Python 2.0. + +- bpo-25612: Move the current exception state from the frame object to the + co-routine. This simplifies the interpreter and fixes a couple of obscure + bugs caused by having swap exception state when entering or exiting a + generator. + +- bpo-23699: Add Py_RETURN_RICHCOMPARE macro to reduce boilerplate code in + rich comparison functions. + +- bpo-30697: The `PyExc_RecursionErrorInst` singleton is removed and + `PyErr_NormalizeException()` does not use it anymore. This singleton is + persistent and its members being never cleared may cause a segfault during + finalization of the interpreter. See also issue #22898. + + +What's New in Python 3.7.0 alpha 2? +=================================== + +*Release date: 2017-10-16* + +Core and Builtins +----------------- + +- bpo-31558: ``gc.freeze()`` is a new API that allows for moving all objects + currently tracked by the garbage collector to a permanent generation, + effectively removing them from future collection events. This can be used + to protect those objects from having their PyGC_Head mutated. In effect, + this enables great copy-on-write stability at fork(). + +- bpo-31642: Restored blocking "from package import module" by setting + sys.modules["package.module"] to None. + +- bpo-31708: Allow use of asynchronous generator expressions in synchronous + functions. + +- bpo-31709: Drop support of asynchronous __aiter__. + +- bpo-30404: The -u option now makes the stdout and stderr streams + unbuffered rather than line-buffered. + +- bpo-31619: Fixed a ValueError when convert a string with large number of + underscores to integer with binary base. + +- bpo-31602: Fix an assertion failure in `zipimporter.get_source()` in case + of a bad `zlib.decompress()`. Patch by Oren Milman. + +- bpo-31592: Fixed an assertion failure in Python parser in case of a bad + `unicodedata.normalize()`. Patch by Oren Milman. + +- bpo-31588: Raise a `TypeError` with a helpful error message when class + creation fails due to a metaclass with a bad ``__prepare__()`` method. + Patch by Oren Milman. + +- bpo-31574: Importlib was instrumented with two dtrace probes to profile + import timing. + +- bpo-31566: Fix an assertion failure in `_warnings.warn()` in case of a bad + ``__name__`` global. Patch by Oren Milman. + +- bpo-31506: Improved the error message logic for object.__new__ and + object.__init__. + +- bpo-31505: Fix an assertion failure in `json`, in case + `_json.make_encoder()` received a bad `encoder()` argument. Patch by Oren + Milman. + +- bpo-31492: Fix assertion failures in case of failing to import from a + module with a bad ``__name__`` attribute, and in case of failing to access + an attribute of such a module. Patch by Oren Milman. + +- bpo-31478: Fix an assertion failure in `_random.Random.seed()` in case the + argument has a bad ``__abs__()`` method. Patch by Oren Milman. + +- bpo-31336: Speed up class creation by 10-20% by reducing the overhead in + the necessary special method lookups. Patch by Stefan Behnel. + +- bpo-31415: Add ``-X importtime`` option to show how long each import + takes. It can be used to optimize application's startup time. Support the + :envvar:`PYTHONPROFILEIMPORTTIME` as an equivalent way to enable this. + +- bpo-31410: Optimized calling wrapper and classmethod descriptors. + +- bpo-31353: :pep:`553` - Add a new built-in called ``breakpoint()`` which + calls ``sys.breakpointhook()``. By default this imports ``pdb`` and calls + ``pdb.set_trace()``, but users may override ``sys.breakpointhook()`` to + call whatever debugger they want. The original value of the hook is saved + in ``sys.__breakpointhook__``. + +- bpo-17852: Maintain a list of open buffered files, flush them before + exiting the interpreter. Based on a patch from Armin Rigo. + +- bpo-31315: Fix an assertion failure in imp.create_dynamic(), when + spec.name is not a string. Patch by Oren Milman. + +- bpo-31311: Fix a crash in the ``__setstate__()`` method of + `ctypes._CData`, in case of a bad ``__dict__``. Patch by Oren Milman. + +- bpo-31293: Fix crashes in true division and multiplication of a timedelta + object by a float with a bad as_integer_ratio() method. Patch by Oren + Milman. + +- bpo-31285: Fix an assertion failure in `warnings.warn_explicit`, when the + return value of the received loader's get_source() has a bad splitlines() + method. Patch by Oren Milman. + +- bpo-30406: Make ``async`` and ``await`` proper keywords, as specified in + :pep:`492`. + +Library +------- + +- bpo-30058: Fixed buffer overflow in select.kqueue.control(). + +- bpo-31672: ``idpattern`` in ``string.Template`` matched some non-ASCII + characters. Now it uses ``-i`` regular expression local flag to avoid + non-ASCII characters. + +- bpo-31701: On Windows, faulthandler.enable() now ignores MSC and COM + exceptions. + +- bpo-31728: Prevent crashes in `_elementtree` due to unsafe cleanup of + `Element.text` and `Element.tail`. Patch by Oren Milman. + +- bpo-31671: Now ``re.compile()`` converts passed RegexFlag to normal int + object before compiling. bm_regex_compile benchmark shows 14% performance + improvements. + +- bpo-30397: The types of compiled regular objects and match objects are now + exposed as `re.Pattern` and `re.Match`. This adds information in pydoc + output for the re module. + +- bpo-31675: Fixed memory leaks in Tkinter's methods splitlist() and split() + when pass a string larger than 2 GiB. + +- bpo-31673: Fixed typo in the name of Tkinter's method adderrorinfo(). + +- bpo-31648: Improvements to path predicates in ElementTree: Allow + whitespace around predicate parts, i.e. "[a = 'text']" instead of + requiring the less readable "[a='text']". Add support for text comparison + of the current node, like "[.='text']". Patch by Stefan Behnel. + +- bpo-30806: Fix the string representation of a netrc object. + +- bpo-31638: Add optional argument ``compressed`` to + ``zipapp.create_archive``, and add option ``--compress`` to the command + line interface of ``zipapp``. + +- bpo-25351: Avoid venv activate failures with undefined variables + +- bpo-20519: Avoid ctypes use (if possible) and improve import time for + uuid. + +- bpo-28293: The regular expression cache is no longer completely dumped + when it is full. + +- bpo-31596: Added pthread_getcpuclockid() to the time module + +- bpo-27494: Make 2to3 accept a trailing comma in generator expressions. For + example, ``set(x for x in [],)`` is now allowed. + +- bpo-30347: Stop crashes when concurrently iterate over itertools.groupby() + iterators. + +- bpo-30346: An iterator produced by itertools.groupby() iterator now + becomes exhausted after advancing the groupby iterator. + +- bpo-31556: Cancel asyncio.wait_for future faster if timeout <= 0 + +- bpo-31540: Allow passing a context object in + :class:`concurrent.futures.ProcessPoolExecutor` constructor. Also, free + job resources in :class:`concurrent.futures.ProcessPoolExecutor` earlier + to improve memory usage when a worker waits for new jobs. + +- bpo-31516: ``threading.current_thread()`` should not return a dummy thread + at shutdown. + +- bpo-31525: In the sqlite module, require the sqlite3_prepare_v2 API. Thus, + the sqlite module now requires sqlite version at least 3.3.9. + +- bpo-26510: argparse subparsers are now required by default. This matches + behaviour in Python 2. For optional subparsers, use the new parameter + ``add_subparsers(required=False)``. Patch by Anthony Sottile. (As of + 3.7.0rc1, the default was changed to not required as had been the case + since Python 3.3.) + +- bpo-27541: Reprs of subclasses of some collection and iterator classes + (`bytearray`, `array.array`, `collections.deque`, + `collections.defaultdict`, `itertools.count`, `itertools.repeat`) now + contain actual type name insteads of hardcoded name of the base class. + +- bpo-31351: python -m ensurepip now exits with non-zero exit code if pip + bootstrapping has failed. + +- bpo-31389: ``pdb.set_trace()`` now takes an optional keyword-only argument + ``header``. If given, this is printed to the console just before debugging + begins. + +Documentation +------------- + +- bpo-31537: Fix incorrect usage of ``get_history_length`` in readline + documentation example code. Patch by Brad Smith. + +- bpo-30085: The operator functions without double underscores are preferred + for clarity. The one with underscores are only kept for + back-compatibility. + +Build +----- + +- bpo-31696: Improve compiler version information in :data:`sys.version` + when Python is built with Clang. + +- bpo-31625: Stop using ranlib on static libraries. Instead, we assume ar + supports the 's' flag. + +- bpo-31624: Remove support for BSD/OS. + +- bpo-22140: Prevent double substitution of prefix in python-config.sh. + +- bpo-31569: Correct PCBuild/ case to PCbuild/ in build scripts and + documentation. + +- bpo-31536: Avoid wholesale rebuild after `make regen-all` if nothing + changed. + +IDLE +---- + +- bpo-31460: Simplify the API of IDLE's Module Browser. Passing a widget + instead of an flist with a root widget opens the option of creating a + browser frame that is only part of a window. Passing a full file name + instead of pieces assumed to come from a .py file opens the possibility of + browsing python files that do not end in .py. + +- bpo-31649: IDLE - Make _htest, _utest parameters keyword only. + +- bpo-31559: Remove test order dependence in idle_test.test_browser. + +- bpo-31459: Rename IDLE's module browser from Class Browser to Module + Browser. The original module-level class and method browser became a + module browser, with the addition of module-level functions, years ago. + Nested classes and functions were added yesterday. For + back-compatibility, the virtual event <>, which + appears on the Keys tab of the Settings dialog, is not changed. Patch by + Cheryl Sabella. + +- bpo-31500: Default fonts now are scaled on HiDPI displays. + +- bpo-1612262: IDLE module browser now shows nested classes and functions. + Original patches for code and tests by Guilherme Polo and Cheryl Sabella, + respectively. + +C API +----- + +- bpo-28280: Make `PyMapping_Keys()`, `PyMapping_Values()` and + `PyMapping_Items()` always return a `list` (rather than a `list` or a + `tuple`). Patch by Oren Milman. + +- bpo-31532: Fix memory corruption due to allocator mix in getpath.c between + Py_GetPath() and Py_SetPath() + +- bpo-25658: Implement :pep:`539` for Thread Specific Storage (TSS) API: it + is a new Thread Local Storage (TLS) API to CPython which would supersede + use of the existing TLS API within the CPython interpreter, while + deprecating the existing API. PEP written by Erik M. Bray, patch by + Masayuki Yamamoto. + + +What's New in Python 3.7.0 alpha 1? +=================================== + +*Release date: 2017-09-19* + +Security +-------- + +- bpo-29781: SSLObject.version() now correctly returns None when handshake + over BIO has not been performed yet. + +- bpo-29505: Add fuzz tests for float(str), int(str), unicode(str); for + oss-fuzz. + +- bpo-30947: Upgrade libexpat embedded copy from version 2.2.1 to 2.2.3 to + get security fixes. + +- bpo-30730: Prevent environment variables injection in subprocess on + Windows. Prevent passing other environment variables and command + arguments. + +- bpo-30694: Upgrade expat copy from 2.2.0 to 2.2.1 to get fixes of multiple + security vulnerabilities including: CVE-2017-9233 (External entity + infinite loop DoS), CVE-2016-9063 (Integer overflow, re-fix), + CVE-2016-0718 (Fix regression bugs from 2.2.0's fix to CVE-2016-0718) and + CVE-2012-0876 (Counter hash flooding with SipHash). Note: the + CVE-2016-5300 (Use os-specific entropy sources like getrandom) doesn't + impact Python, since Python already gets entropy from the OS to set the + expat secret using ``XML_SetHashSalt()``. + +- bpo-30500: Fix urllib.parse.splithost() to correctly parse fragments. For + example, ``splithost('//127.0.0.1#@evil.com/')`` now correctly returns the + ``127.0.0.1`` host, instead of treating ``@evil.com`` as the host in an + authentication (``login@host``). + +- bpo-29591: Update expat copy from 2.1.1 to 2.2.0 to get fixes of + CVE-2016-0718 and CVE-2016-4472. See + https://sourceforge.net/p/expat/bugs/537/ for more information. + +Core and Builtins +----------------- + +- bpo-31490: Fix an assertion failure in `ctypes` class definition, in case + the class has an attribute whose name is specified in ``_anonymous_`` but + not in ``_fields_``. Patch by Oren Milman. + +- bpo-31471: Fix an assertion failure in `subprocess.Popen()` on Windows, in + case the env argument has a bad keys() method. Patch by Oren Milman. + +- bpo-31418: Fix an assertion failure in `PyErr_WriteUnraisable()` in case + of an exception with a bad ``__module__`` attribute. Patch by Oren Milman. + +- bpo-31416: Fix assertion failures in case of a bad warnings.filters or + warnings.defaultaction. Patch by Oren Milman. + +- bpo-28411: Change direct usage of PyInterpreterState.modules to + PyImport_GetModuleDict(). Also introduce more uniformity in other code + that deals with sys.modules. This helps reduce complications when working + on sys.modules. + +- bpo-28411: Switch to the abstract API when dealing with + ``PyInterpreterState.modules``. This allows later support for all dict + subclasses and other Mapping implementations. Also add a + ``PyImport_GetModule()`` function to reduce a bunch of duplicated code. + +- bpo-31411: Raise a TypeError instead of SystemError in case + warnings.onceregistry is not a dictionary. Patch by Oren Milman. + +- bpo-31344: For finer control of tracing behaviour when testing the + interpreter, two new frame attributes have been added to control the + emission of particular trace events: ``f_trace_lines`` (``True`` by + default) to turn off per-line trace events; and ``f_trace_opcodes`` + (``False`` by default) to turn on per-opcode trace events. + +- bpo-31373: Fix several possible instances of undefined behavior due to + floating-point demotions. + +- bpo-30465: Location information (``lineno`` and ``col_offset``) in + f-strings is now (mostly) correct. This fixes tools like flake8 from + showing warnings on the wrong line (typically the first line of the file). + +- bpo-30860: Consolidate CPython's global runtime state under a single + struct. This improves discoverability of the runtime state. + +- bpo-31347: Fix possible undefined behavior in _PyObject_FastCall_Prepend. + +- bpo-31343: Include sys/sysmacros.h for major(), minor(), and makedev(). + GNU C libray plans to remove the functions from sys/types.h. + +- bpo-31291: Fix an assertion failure in `zipimport.zipimporter.get_data` on + Windows, when the return value of ``pathname.replace('/','\\')`` isn't a + string. Patch by Oren Milman. + +- bpo-31271: Fix an assertion failure in the write() method of + `io.TextIOWrapper`, when the encoder doesn't return a bytes object. Patch + by Oren Milman. + +- bpo-31243: Fix a crash in some methods of `io.TextIOWrapper`, when the + decoder's state is invalid. Patch by Oren Milman. + +- bpo-30721: ``print`` now shows correct usage hint for using Python 2 + redirection syntax. Patch by Sanyam Khurana. + +- bpo-31070: Fix a race condition in importlib _get_module_lock(). + +- bpo-30747: Add a non-dummy implementation of _Py_atomic_store and + _Py_atomic_load on MSVC. + +- bpo-31095: Fix potential crash during GC caused by ``tp_dealloc`` which + doesn't call ``PyObject_GC_UnTrack()``. + +- bpo-31071: Avoid masking original TypeError in call with * unpacking when + other arguments are passed. + +- bpo-30978: str.format_map() now passes key lookup exceptions through. + Previously any exception was replaced with a KeyError exception. + +- bpo-30808: Use _Py_atomic API for concurrency-sensitive signal state. + +- bpo-30876: Relative import from unloaded package now reimports the package + instead of failing with SystemError. Relative import from non-package now + fails with ImportError rather than SystemError. + +- bpo-30703: Improve signal delivery. Avoid using Py_AddPendingCall from + signal handler, to avoid calling signal-unsafe functions. The tests I'm + adding here fail without the rest of the patch, on Linux and OS X. This + means our signal delivery logic had defects (some signals could be lost). + +- bpo-30765: Avoid blocking in pthread_mutex_lock() when + PyThread_acquire_lock() is asked not to block. + +- bpo-31161: Make sure the 'Missing parentheses' syntax error message is + only applied to SyntaxError, not to subclasses. Patch by Martijn Pieters. + +- bpo-30814: Fixed a race condition when import a submodule from a package. + +- bpo-30736: The internal unicodedata database has been upgraded to Unicode + 10.0. + +- bpo-30604: Move co_extra_freefuncs from per-thread to per-interpreter to + avoid crashes. + +- bpo-30597: ``print`` now shows expected input in custom error message when + used as a Python 2 statement. Patch by Sanyam Khurana. + +- bpo-30682: Removed a too-strict assertion that failed for certain + f-strings, such as eval("f'\\\n'") and eval("f'\\\r'"). + +- bpo-30501: The compiler now produces more optimal code for complex + condition expressions in the "if", "while" and "assert" statement, the + "if" expression, and generator expressions and comprehensions. + +- bpo-28180: Implement :pep:`538` (legacy C locale coercion). This means + that when a suitable coercion target locale is available, both the core + interpreter and locale-aware C extensions will assume the use of UTF-8 as + the default text encoding, rather than ASCII. + +- bpo-30486: Allows setting cell values for __closure__. Patch by Lisa + Roach. + +- bpo-30537: itertools.islice now accepts integer-like objects (having an + __index__ method) as start, stop, and slice arguments + +- bpo-25324: Tokens needed for parsing in Python moved to C. ``COMMENT``, + ``NL`` and ``ENCODING``. This way the tokens and tok_names in the token + module don't get changed when you import the tokenize module. + +- bpo-29104: Fixed parsing backslashes in f-strings. + +- bpo-27945: Fixed various segfaults with dict when input collections are + mutated during searching, inserting or comparing. Based on patches by + Duane Griffin and Tim Mitchell. + +- bpo-25794: Fixed type.__setattr__() and type.__delattr__() for + non-interned attribute names. Based on patch by Eryk Sun. + +- bpo-30039: If a KeyboardInterrupt happens when the interpreter is in the + middle of resuming a chain of nested 'yield from' or 'await' calls, it's + now correctly delivered to the innermost frame. + +- bpo-28974: ``object.__format__(x, '')`` is now equivalent to ``str(x)`` + rather than ``format(str(self), '')``. + +- bpo-30024: Circular imports involving absolute imports with binding a + submodule to a name are now supported. + +- bpo-12414: sys.getsizeof() on a code object now returns the sizes which + includes the code struct and sizes of objects which it references. Patch + by Dong-hee Na. + +- bpo-29839: len() now raises ValueError rather than OverflowError if + __len__() returned a large negative integer. + +- bpo-11913: README.rst is now included in the list of distutils standard + READMEs and therefore included in source distributions. + +- bpo-29914: Fixed default implementations of __reduce__ and + __reduce_ex__(). object.__reduce__() no longer takes arguments, + object.__reduce_ex__() now requires one argument. + +- bpo-29949: Fix memory usage regression of set and frozenset object. + +- bpo-29935: Fixed error messages in the index() method of tuple, list and + deque when pass indices of wrong type. + +- bpo-29816: Shift operation now has less opportunity to raise + OverflowError. ValueError always is raised rather than OverflowError for + negative counts. Shifting zero with non-negative count always returns + zero. + +- bpo-24821: Fixed the slowing down to 25 times in the searching of some + unlucky Unicode characters. + +- bpo-29102: Add a unique ID to PyInterpreterState. This makes it easier to + identify each subinterpreter. + +- bpo-29894: The deprecation warning is emitted if __complex__ returns an + instance of a strict subclass of complex. In a future versions of Python + this can be an error. + +- bpo-29859: Show correct error messages when any of the pthread_* calls in + thread_pthread.h fails. + +- bpo-29849: Fix a memory leak when an ImportError is raised during from + import. + +- bpo-28856: Fix an oversight that %b format for bytes should support + objects follow the buffer protocol. + +- bpo-29723: The ``sys.path[0]`` initialization change for bpo-29139 caused + a regression by revealing an inconsistency in how sys.path is initialized + when executing ``__main__`` from a zipfile, directory, or other import + location. The interpreter now consistently avoids ever adding the import + location's parent directory to ``sys.path``, and ensures no other + ``sys.path`` entries are inadvertently modified when inserting the import + location named on the command line. + +- bpo-29568: Escaped percent "%%" in the format string for classic string + formatting no longer allows any characters between two percents. + +- bpo-29714: Fix a regression that bytes format may fail when containing + zero bytes inside. + +- bpo-29695: bool(), float(), list() and tuple() no longer take keyword + arguments. The first argument of int() can now be passes only as + positional argument. + +- bpo-28893: Set correct __cause__ for errors about invalid awaitables + returned from __aiter__ and __anext__. + +- bpo-28876: ``bool(range)`` works even if ``len(range)`` raises + :exc:`OverflowError`. + +- bpo-29683: Fixes to memory allocation in _PyCode_SetExtra. Patch by Brian + Coleman. + +- bpo-29684: Fix minor regression of PyEval_CallObjectWithKeywords. It + should raise TypeError when kwargs is not a dict. But it might cause segv + when args=NULL and kwargs is not a dict. + +- bpo-28598: Support __rmod__ for subclasses of str being called before + str.__mod__. Patch by Martijn Pieters. + +- bpo-29607: Fix stack_effect computation for CALL_FUNCTION_EX. Patch by + Matthieu Dartiailh. + +- bpo-29602: Fix incorrect handling of signed zeros in complex constructor + for complex subclasses and for inputs having a __complex__ method. Patch + by Serhiy Storchaka. + +- bpo-29347: Fixed possibly dereferencing undefined pointers when creating + weakref objects. + +- bpo-29463: Add ``docstring`` field to Module, ClassDef, FunctionDef, and + AsyncFunctionDef ast nodes. docstring is not first stmt in their body + anymore. It affects ``co_firstlineno`` and ``co_lnotab`` of code object + for module and class. (Reverted in :issue:`32911`.) + +- bpo-29438: Fixed use-after-free problem in key sharing dict. + +- bpo-29546: Set the 'path' and 'name' attribute on ImportError for ``from + ... import ...``. + +- bpo-29546: Improve from-import error message with location + +- bpo-29478: If max_line_length=None is specified while using the Compat32 + policy, it is no longer ignored. Patch by Mircea Cosbuc. + +- bpo-29319: Prevent RunMainFromImporter overwriting sys.path[0]. + +- bpo-29337: Fixed possible BytesWarning when compare the code objects. + Warnings could be emitted at compile time. + +- bpo-29327: Fixed a crash when pass the iterable keyword argument to + sorted(). + +- bpo-29034: Fix memory leak and use-after-free in os module + (path_converter). + +- bpo-29159: Fix regression in bytes(x) when x.__index__() raises Exception. + +- bpo-29049: Call _PyObject_GC_TRACK() lazily when calling Python function. + Calling function is up to 5% faster. + +- bpo-28927: bytes.fromhex() and bytearray.fromhex() now ignore all ASCII + whitespace, not only spaces. Patch by Robert Xiao. + +- bpo-28932: Do not include if it does not exist. + +- bpo-25677: Correct the positioning of the syntax error caret for indented + blocks. Based on patch by Michael Layzell. + +- bpo-29000: Fixed bytes formatting of octals with zero padding in alternate + form. + +- bpo-18896: Python function can now have more than 255 parameters. + collections.namedtuple() now supports tuples with more than 255 elements. + +- bpo-28596: The preferred encoding is UTF-8 on Android. Patch written by + Chi Hsuan Yen. + +- bpo-22257: Clean up interpreter startup (see :pep:`432`). + +- bpo-26919: On Android, operating system data is now always encoded/decoded + to/from UTF-8, instead of the locale encoding to avoid inconsistencies + with os.fsencode() and os.fsdecode() which are already using UTF-8. + +- bpo-28991: functools.lru_cache() was susceptible to an obscure reentrancy + bug triggerable by a monkey-patched len() function. + +- bpo-28147: Fix a memory leak in split-table dictionaries: setattr() must + not convert combined table into split table. Patch written by INADA Naoki. + +- bpo-28739: f-string expressions are no longer accepted as docstrings and + by ast.literal_eval() even if they do not include expressions. + +- bpo-28512: Fixed setting the offset attribute of SyntaxError by + PyErr_SyntaxLocationEx() and PyErr_SyntaxLocationObject(). + +- bpo-28918: Fix the cross compilation of xxlimited when Python has been + built with Py_DEBUG defined. + +- bpo-23722: Rather than silently producing a class that doesn't support + zero-argument ``super()`` in methods, failing to pass the new + ``__classcell__`` namespace entry up to ``type.__new__`` now results in a + ``DeprecationWarning`` and a class that supports zero-argument + ``super()``. + +- bpo-28797: Modifying the class __dict__ inside the __set_name__ method of + a descriptor that is used inside that class no longer prevents calling the + __set_name__ method of other descriptors. + +- bpo-28799: Remove the ``PyEval_GetCallStats()`` function and deprecate the + untested and undocumented ``sys.callstats()`` function. Remove the + ``CALL_PROFILE`` special build: use the :func:`sys.setprofile` function, + :mod:`cProfile` or :mod:`profile` to profile function calls. + +- bpo-12844: More than 255 arguments can now be passed to a function. + +- bpo-28782: Fix a bug in the implementation ``yield from`` when checking if + the next instruction is YIELD_FROM. Regression introduced by WORDCODE + (issue #26647). + +- bpo-28774: Fix error position of the unicode error in ASCII and Latin1 + encoders when a string returned by the error handler contains multiple + non-encodable characters (non-ASCII for the ASCII codec, characters out of + the U+0000-U+00FF range for Latin1). + +- bpo-28731: Optimize _PyDict_NewPresized() to create correct size dict. + Improve speed of dict literal with constant keys up to 30%. + +- bpo-28532: Show sys.version when -V option is supplied twice. + +- bpo-27100: The with-statement now checks for __enter__ before it checks + for __exit__. This gives less confusing error messages when both methods + are missing. Patch by Jonathan Ellington. + +- bpo-28746: Fix the set_inheritable() file descriptor method on platforms + that do not have the ioctl FIOCLEX and FIONCLEX commands. + +- bpo-26920: Fix not getting the locale's charset upon initializing the + interpreter, on platforms that do not have langinfo. + +- bpo-28648: Fixed crash in Py_DecodeLocale() in debug build on Mac OS X + when decode astral characters. Patch by Xiang Zhang. + +- bpo-28665: Improve speed of the STORE_DEREF opcode by 40%. + +- bpo-19398: Extra slash no longer added to sys.path components in case of + empty compile-time PYTHONPATH components. + +- bpo-28621: Sped up converting int to float by reusing faster bits counting + implementation. Patch by Adrian Wielgosik. + +- bpo-28580: Optimize iterating split table values. Patch by Xiang Zhang. + +- bpo-28583: PyDict_SetDefault didn't combine split table when needed. Patch + by Xiang Zhang. + +- bpo-28128: Deprecation warning for invalid str and byte escape sequences + now prints better information about where the error occurs. Patch by + Serhiy Storchaka and Eric Smith. + +- bpo-28509: dict.update() no longer allocate unnecessary large memory. + +- bpo-28426: Fixed potential crash in PyUnicode_AsDecodedObject() in debug + build. + +- bpo-28517: Fixed of-by-one error in the peephole optimizer that caused + keeping unreachable code. + +- bpo-28214: Improved exception reporting for problematic __set_name__ + attributes. + +- bpo-23782: Fixed possible memory leak in _PyTraceback_Add() and exception + loss in PyTraceBack_Here(). + +- bpo-28183: Optimize and cleanup dict iteration. + +- bpo-26081: Added C implementation of asyncio.Future. Original patch by + Yury Selivanov. + +- bpo-28379: Added sanity checks and tests for PyUnicode_CopyCharacters(). + Patch by Xiang Zhang. + +- bpo-28376: The type of long range iterator is now registered as Iterator. + Patch by Oren Milman. + +- bpo-28376: Creating instances of range_iterator by calling range_iterator + type now is disallowed. Calling iter() on range instance is the only way. + Patch by Oren Milman. + +- bpo-26906: Resolving special methods of uninitialized type now causes + implicit initialization of the type instead of a fail. + +- bpo-18287: PyType_Ready() now checks that tp_name is not NULL. Original + patch by Niklas Koep. + +- bpo-24098: Fixed possible crash when AST is changed in process of + compiling it. + +- bpo-28201: Dict reduces possibility of 2nd conflict in hash table when + hashes have same lower bits. + +- bpo-28350: String constants with null character no longer interned. + +- bpo-26617: Fix crash when GC runs during weakref callbacks. + +- bpo-27942: String constants now interned recursively in tuples and + frozensets. + +- bpo-28289: ImportError.__init__ now resets not specified attributes. + +- bpo-21578: Fixed misleading error message when ImportError called with + invalid keyword args. + +- bpo-28203: Fix incorrect type in complex(1.0, {2:3}) error message. Patch + by Soumya Sharma. + +- bpo-28086: Single var-positional argument of tuple subtype was passed + unscathed to the C-defined function. Now it is converted to exact tuple. + +- bpo-28214: Now __set_name__ is looked up on the class instead of the + instance. + +- bpo-27955: Fallback on reading /dev/urandom device when the getrandom() + syscall fails with EPERM, for example when blocked by SECCOMP. + +- bpo-28192: Don't import readline in isolated mode. + +- bpo-27441: Remove some redundant assignments to ob_size in longobject.c. + Thanks Oren Milman. + +- bpo-27222: Clean up redundant code in long_rshift function. Thanks Oren + Milman. + +- Upgrade internal unicode databases to Unicode version 9.0.0. + +- bpo-28131: Fix a regression in zipimport's compile_source(). zipimport + should use the same optimization level as the interpreter. + +- bpo-28126: Replace Py_MEMCPY with memcpy(). Visual Studio can properly + optimize memcpy(). + +- bpo-28120: Fix dict.pop() for splitted dictionary when trying to remove a + "pending key" (Not yet inserted in split-table). Patch by Xiang Zhang. + +- bpo-26182: Raise DeprecationWarning when async and await keywords are used + as variable/attribute/class/function name. + +- bpo-26182: Fix a refleak in code that raises DeprecationWarning. + +- bpo-28721: Fix asynchronous generators aclose() and athrow() to handle + StopAsyncIteration propagation properly. + +- bpo-26110: Speed-up method calls: add LOAD_METHOD and CALL_METHOD opcodes. + +Library +------- + +- bpo-31499: xml.etree: Fix a crash when a parser is part of a reference + cycle. + +- bpo-31482: ``random.seed()`` now works with bytes in version=1 + +- bpo-28556: typing.get_type_hints now finds the right globalns for classes + and modules by default (when no ``globalns`` was specified by the caller). + +- bpo-28556: Speed improvements to the ``typing`` module. Original PRs by + Ivan Levkivskyi and Mitar. + +- bpo-31544: The C accelerator module of ElementTree ignored exceptions + raised when looking up TreeBuilder target methods in XMLParser(). + +- bpo-31234: socket.create_connection() now fixes manually a reference + cycle: clear the variable storing the last exception on success. + +- bpo-31457: LoggerAdapter objects can now be nested. + +- bpo-31431: SSLContext.check_hostname now automatically sets + SSLContext.verify_mode to ssl.CERT_REQUIRED instead of failing with a + ValueError. + +- bpo-31233: socketserver.ThreadingMixIn now keeps a list of non-daemonic + threads to wait until all these threads complete in server_close(). + +- bpo-28638: Changed the implementation strategy for + collections.namedtuple() to substantially reduce the use of exec() in + favor of precomputed methods. As a result, the *verbose* parameter and + *_source* attribute are no longer supported. The benefits include 1) + having a smaller memory footprint for applications using multiple named + tuples, 2) faster creation of the named tuple class (approx 4x to 6x + depending on how it is measured), and 3) minor speed-ups for instance + creation using __new__, _make, and _replace. (The primary patch + contributor is Jelle Zijlstra with further improvements by INADA Naoki, + Serhiy Storchaka, and Raymond Hettinger.) + +- bpo-31400: Improves SSL error handling to avoid losing error numbers. + +- bpo-27629: Make return types of SSLContext.wrap_bio() and + SSLContext.wrap_socket() customizable. + +- bpo-28958: ssl.SSLContext() now uses OpenSSL error information when a + context cannot be instantiated. + +- bpo-28182: The SSL module now raises SSLCertVerificationError when OpenSSL + fails to verify the peer's certificate. The exception contains more + information about the error. + +- bpo-27340: SSLSocket.sendall() now uses memoryview to create slices of + data. This fixes support for all bytes-like object. It is also more + efficient and avoids costly copies. + +- bpo-14191: A new function + ``argparse.ArgumentParser.parse_intermixed_args`` provides the ability to + parse command lines where there user intermixes options and positional + arguments. + +- bpo-31178: Fix string concatenation bug in rare error path in the + subprocess module + +- bpo-31350: Micro-optimize :func:`asyncio._get_running_loop` to become up + to 10% faster. + +- bpo-31170: expat: Update libexpat from 2.2.3 to 2.2.4. Fix copying of + partial characters for UTF-8 input (libexpat bug 115): + https://github.com/libexpat/libexpat/issues/115 + +- bpo-29136: Add TLS 1.3 cipher suites and OP_NO_TLSv1_3. + +- bpo-1198569: ``string.Template`` subclasses can optionally define + ``braceidpattern`` if they want to specify different placeholder patterns + inside and outside the braces. If None (the default) it falls back to + ``idpattern``. + +- bpo-31326: concurrent.futures.ProcessPoolExecutor.shutdown() now + explicitly closes the call queue. Moreover, shutdown(wait=True) now also + join the call queue thread, to prevent leaking a dangling thread. + +- bpo-27144: The ``map()`` and ``as_completed()`` iterators in + ``concurrent.futures`` now avoid keeping a reference to yielded objects. + +- bpo-31281: Fix ``fileinput.FileInput(files, inplace=True)`` when ``files`` + contain ``pathlib.Path`` objects. + +- bpo-10746: Fix ctypes producing wrong :pep:`3118` type codes for integer + types. + +- bpo-27584: ``AF_VSOCK`` has been added to the socket interface which + allows communication between virtual machines and their host. + +- bpo-22536: The subprocess module now sets the filename when + FileNotFoundError is raised on POSIX systems due to the executable or cwd + not being found. + +- bpo-29741: Update some methods in the _pyio module to also accept integer + types. Patch by Oren Milman. + +- bpo-31249: concurrent.futures: WorkItem.run() used by ThreadPoolExecutor + now breaks a reference cycle between an exception object and the WorkItem + object. + +- bpo-31247: xmlrpc.server now explicitly breaks reference cycles when using + sys.exc_info() in code handling exceptions. + +- bpo-23835: configparser: reading defaults in the ``ConfigParser()`` + constructor is now using ``read_dict()``, making its behavior consistent + with the rest of the parser. Non-string keys and values in the defaults + dictionary are now being implicitly converted to strings. Patch by James + Tocknell. + +- bpo-31238: pydoc: the stop() method of the private ServerThread class now + waits until DocServer.serve_until_quit() completes and then explicitly + sets its docserver attribute to None to break a reference cycle. + +- bpo-5001: Many asserts in `multiprocessing` are now more informative, and + some error types have been changed to more specific ones. + +- bpo-31109: Convert zipimport to use Argument Clinic. + +- bpo-30102: The ssl and hashlib modules now call + OPENSSL_add_all_algorithms_noconf() on OpenSSL < 1.1.0. The function + detects CPU features and enables optimizations on some CPU architectures + such as POWER8. Patch is based on research from Gustavo Serra Scalet. + +- bpo-18966: Non-daemonic threads created by a multiprocessing.Process are + now joined on child exit. + +- bpo-31183: `dis` now works with asynchronous generator and coroutine + objects. Patch by George Collins based on diagnosis by Luciano Ramalho. + +- bpo-5001: There are a number of uninformative asserts in the + `multiprocessing` module, as noted in issue 5001. This change fixes two of + the most potentially problematic ones, since they are in error-reporting + code, in the `multiprocessing.managers.convert_to_error` function. (It + also makes more informative a ValueError message.) The only potentially + problematic change is that the AssertionError is now a TypeError; however, + this should also help distinguish it from an AssertionError being + *reported* by the function/its caller (such as in issue 31169). - Patch by + Allen W. Smith (drallensmith on github). + +- bpo-31185: Fixed miscellaneous errors in asyncio speedup module. + +- bpo-31151: socketserver.ForkingMixIn.server_close() now waits until all + child processes completed to prevent leaking zombie processes. + +- bpo-31072: Add an ``include_file`` parameter to + ``zipapp.create_archive()`` + +- bpo-24700: Optimize array.array comparison. It is now from 10x up to 70x + faster when comparing arrays holding values of the same integer type. + +- bpo-31135: ttk: fix the destroy() method of LabeledScale and OptionMenu + classes. Call the parent destroy() method even if the used attribute + doesn't exist. The LabeledScale.destroy() method now also explicitly + clears label and scale attributes to help the garbage collector to destroy + all widgets. + +- bpo-31107: Fix `copyreg._slotnames()` mangled attribute calculation for + classes whose name begins with an underscore. Patch by Shane Harvey. + +- bpo-31080: Allow `logging.config.fileConfig` to accept kwargs and/or args. + +- bpo-30897: ``pathlib.Path`` objects now include an ``is_mount()`` method + (only implemented on POSIX). This is similar to ``os.path.ismount(p)``. + Patch by Cooper Ry Lees. + +- bpo-31061: Fixed a crash when using asyncio and threads. + +- bpo-30987: Added support for CAN ISO-TP protocol in the socket module. + +- bpo-30522: Added a ``setStream`` method to ``logging.StreamHandler`` to + allow the stream to be set after creation. + +- bpo-30502: Fix handling of long oids in ssl. Based on patch by Christian + Heimes. + +- bpo-5288: Support tzinfo objects with sub-minute offsets. + +- bpo-30919: Fix shared memory performance regression in multiprocessing in + 3.x. Shared memory used anonymous memory mappings in 2.x, while 3.x mmaps + actual files. Try to be careful to do as little disk I/O as possible. + +- bpo-26732: Fix too many fds in processes started with the "forkserver" + method. A child process would inherit as many fds as the number of + still-running children. + +- bpo-29403: Fix ``unittest.mock``'s autospec to not fail on method-bound + builtin functions. Patch by Aaron Gallagher. + +- bpo-30961: Fix decrementing a borrowed reference in tracemalloc. + +- bpo-19896: Fix multiprocessing.sharedctypes to recognize typecodes ``'q'`` + and ``'Q'``. + +- bpo-30946: Remove obsolete code in readline module for platforms where GNU + readline is older than 2.1 or where select() is not available. + +- bpo-25684: Change ``ttk.OptionMenu`` radiobuttons to be unique across + instances of ``OptionMenu``. + +- bpo-30886: Fix multiprocessing.Queue.join_thread(): it now waits until the + thread completes, even if the thread was started by the same process which + created the queue. + +- bpo-29854: Fix segfault in readline when using readline's history-size + option. Patch by Nir Soffer. + +- bpo-30794: Added multiprocessing.Process.kill method to terminate using + the SIGKILL signal on Unix. + +- bpo-30319: socket.close() now ignores ECONNRESET error. + +- bpo-30828: Fix out of bounds write in + `asyncio.CFuture.remove_done_callback()`. + +- bpo-30302: Use keywords in the ``repr`` of ``datetime.timedelta``. + +- bpo-30807: signal.setitimer() may disable the timer when passed a tiny + value. Tiny values (such as 1e-6) are valid non-zero values for + setitimer(), which is specified as taking microsecond-resolution + intervals. However, on some platform, our conversion routine could convert + 1e-6 into a zero interval, therefore disabling the timer instead of + (re-)scheduling it. + +- bpo-30441: Fix bug when modifying os.environ while iterating over it + +- bpo-29585: Avoid importing ``sysconfig`` from ``site`` to improve startup + speed. Python startup is about 5% faster on Linux and 30% faster on macOS. + +- bpo-29293: Add missing parameter "n" on + multiprocessing.Condition.notify(). The doc claims + multiprocessing.Condition behaves like threading.Condition, but its + notify() method lacked the optional "n" argument (to specify the number of + sleepers to wake up) that threading.Condition.notify() accepts. + +- bpo-30532: Fix email header value parser dropping folding white space in + certain cases. + +- bpo-30596: Add a ``close()`` method to ``multiprocessing.Process``. + +- bpo-9146: Fix a segmentation fault in _hashopenssl when standard hash + functions such as md5 are not available in the linked OpenSSL library. As + in some special FIPS-140 build environments. + +- bpo-29169: Update zlib to 1.2.11. + +- bpo-30119: ftplib.FTP.putline() now throws ValueError on commands that + contains CR or LF. Patch by Dong-hee Na. + +- bpo-30879: os.listdir() and os.scandir() now emit bytes names when called + with bytes-like argument. + +- bpo-30746: Prohibited the '=' character in environment variable names in + ``os.putenv()`` and ``os.spawn*()``. + +- bpo-30664: The description of a unittest subtest now preserves the order + of keyword arguments of TestCase.subTest(). + +- bpo-21071: struct.Struct.format type is now :class:`str` instead of + :class:`bytes`. + +- bpo-29212: Fix concurrent.futures.thread.ThreadPoolExecutor threads to + have a non repr() based thread name by default when no thread_name_prefix + is supplied. They will now identify themselves as + "ThreadPoolExecutor-y_n". + +- bpo-29755: Fixed the lgettext() family of functions in the gettext module. + They now always return bytes. + +- bpo-30616: Functional API of enum allows to create empty enums. Patched by + Dong-hee Na + +- bpo-30038: Fix race condition between signal delivery and wakeup file + descriptor. Patch by Nathaniel Smith. + +- bpo-23894: lib2to3 now recognizes ``rb'...'`` and ``f'...'`` strings. + +- bpo-24744: pkgutil.walk_packages function now raises ValueError if *path* + is a string. Patch by Sanyam Khurana. + +- bpo-24484: Avoid race condition in multiprocessing cleanup. + +- bpo-30589: Fix multiprocessing.Process.exitcode to return the opposite of + the signal number when the process is killed by a signal (instead of 255) + when using the "forkserver" method. + +- bpo-28994: The traceback no longer displayed for SystemExit raised in a + callback registered by atexit. + +- bpo-30508: Don't log exceptions if Task/Future "cancel()" method was + called. + +- bpo-30645: Fix path calculation in `imp.load_package()`, fixing it for + cases when a package is only shipped with bytecodes. Patch by Alexandru + Ardelean. + +- bpo-11822: The dis.dis() function now is able to disassemble nested code + objects. + +- bpo-30624: selectors does not take KeyboardInterrupt and SystemExit into + account, leaving a fd in a bad state in case of error. Patch by Giampaolo + Rodola'. + +- bpo-30595: multiprocessing.Queue.get() with a timeout now polls its reader + in non-blocking mode if it succeeded to acquire the lock but the acquire + took longer than the timeout. + +- bpo-28556: Updates to typing module: Add generic AsyncContextManager, add + support for ContextManager on all versions. Original PRs by Jelle Zijlstra + and Ivan Levkivskyi + +- bpo-30605: re.compile() no longer raises a BytesWarning when compiling a + bytes instance with misplaced inline modifier. Patch by Roy Williams. + +- bpo-29870: Fix ssl sockets leaks when connection is aborted in asyncio/ssl + implementation. Patch by Michaël Sghaïer. + +- bpo-29743: Closing transport during handshake process leaks open socket. + Patch by Nikolay Kim + +- bpo-27585: Fix waiter cancellation in asyncio.Lock. Patch by Mathieu + Sornay. + +- bpo-30014: modify() method of poll(), epoll() and devpoll() based classes + of selectors module is around 10% faster. Patch by Giampaolo Rodola'. + +- bpo-30418: On Windows, subprocess.Popen.communicate() now also ignore + EINVAL on stdin.write() if the child process is still running but closed + the pipe. + +- bpo-30463: Addded empty __slots__ to abc.ABC. This allows subclassers to + deny __dict__ and __weakref__ creation. Patch by Aaron Hall. + +- bpo-30520: Loggers are now pickleable. + +- bpo-30557: faulthandler now correctly filters and displays exception codes + on Windows + +- bpo-30526: Add TextIOWrapper.reconfigure() and a + TextIOWrapper.write_through attribute. + +- bpo-30245: Fix possible overflow when organize struct.pack_into error + message. Patch by Yuan Liu. + +- bpo-30378: Fix the problem that logging.handlers.SysLogHandler cannot + handle IPv6 addresses. + +- bpo-16500: Allow registering at-fork handlers. + +- bpo-30470: Deprecate invalid ctypes call protection on Windows. Patch by + Mariatta Wijaya. + +- bpo-30414: multiprocessing.Queue._feed background running thread do not + break from main loop on exception. + +- bpo-30003: Fix handling escape characters in HZ codec. Based on patch by + Ma Lin. + +- bpo-30149: inspect.signature() now supports callables with + variable-argument parameters wrapped with partialmethod. Patch by Dong-hee + Na. + +- bpo-30436: importlib.find_spec() raises ModuleNotFoundError instead of + AttributeError if the specified parent module is not a package (i.e. lacks + a __path__ attribute). + +- bpo-30301: Fix AttributeError when using SimpleQueue.empty() under *spawn* + and *forkserver* start methods. + +- bpo-30375: Warnings emitted when compile a regular expression now always + point to the line in the user code. Previously they could point into + inners of the re module if emitted from inside of groups or conditionals. + +- bpo-30329: imaplib and poplib now catch the Windows socket WSAEINVAL error + (code 10022) on shutdown(SHUT_RDWR): An invalid operation was attempted. + This error occurs sometimes on SSL connections. + +- bpo-29196: Removed previously deprecated in Python 2.4 classes Plist, Dict + and _InternalDict in the plistlib module. Dict values in the result of + functions readPlist() and readPlistFromBytes() are now normal dicts. You + no longer can use attribute access to access items of these dictionaries. + +- bpo-9850: The :mod:`macpath` is now deprecated and will be removed in + Python 3.8. + +- bpo-30299: Compiling regular expression in debug mode on CPython now + displays the compiled bytecode in human readable form. + +- bpo-30048: Fixed ``Task.cancel()`` can be ignored when the task is running + coroutine and the coroutine returned without any more ``await``. + +- bpo-30266: contextlib.AbstractContextManager now supports + anti-registration by setting __enter__ = None or __exit__ = None, + following the pattern introduced in bpo-25958. Patch by Jelle Zijlstra. + +- bpo-30340: Enhanced regular expressions optimization. This increased the + performance of matching some patterns up to 25 times. + +- bpo-30298: Weaken the condition of deprecation warnings for inline + modifiers. Now allowed several subsequential inline modifiers at the start + of the pattern (e.g. ``'(?i)(?s)...'``). In verbose mode whitespaces and + comments now are allowed before and between inline modifiers (e.g. ``'(?x) + (?i) (?s)...'``). + +- bpo-30285: Optimized case-insensitive matching and searching of regular + expressions. + +- bpo-29990: Fix range checking in GB18030 decoder. Original patch by Ma + Lin. + +- bpo-29979: rewrite cgi.parse_multipart, reusing the FieldStorage class and + making its results consistent with those of FieldStorage for + multipart/form-data requests. Patch by Pierre Quentel. + +- bpo-30243: Removed the __init__ methods of _json's scanner and encoder. + Misusing them could cause memory leaks or crashes. Now scanner and + encoder objects are completely initialized in the __new__ methods. + +- bpo-30215: Compiled regular expression objects with the re.LOCALE flag no + longer depend on the locale at compile time. Only the locale at matching + time affects the result of matching. + +- bpo-30185: Avoid KeyboardInterrupt tracebacks in forkserver helper process + when Ctrl-C is received. + +- bpo-30103: binascii.b2a_uu() and uu.encode() now support using ``'`'`` as + zero instead of space. + +- bpo-28556: Various updates to typing module: add typing.NoReturn type, use + WrapperDescriptorType, minor bug-fixes. Original PRs by Jim + Fasarakis-Hilliard and Ivan Levkivskyi. + +- bpo-30205: Fix getsockname() for unbound AF_UNIX sockets on Linux. + +- bpo-30228: The seek() and tell() methods of io.FileIO now set the internal + seekable attribute to avoid one syscall on open() (in buffered or text + mode). + +- bpo-30190: unittest's assertAlmostEqual and assertNotAlmostEqual provide a + better message in case of failure which includes the difference between + left and right arguments. (patch by Giampaolo Rodola') + +- bpo-30101: Add support for curses.A_ITALIC. + +- bpo-29822: inspect.isabstract() now works during __init_subclass__. Patch + by Nate Soares. + +- bpo-29960: Preserve generator state when _random.Random.setstate() raises + an exception. Patch by Bryan Olson. + +- bpo-30070: Fixed leaks and crashes in errors handling in the parser + module. + +- bpo-22352: Column widths in the output of dis.dis() are now adjusted for + large line numbers and instruction offsets. + +- bpo-30061: Fixed crashes in IOBase methods __next__() and readlines() when + readline() or __next__() respectively return non-sizeable object. Fixed + possible other errors caused by not checking results of PyObject_Size(), + PySequence_Size(), or PyMapping_Size(). + +- bpo-30218: Fix PathLike support for shutil.unpack_archive. Patch by Jelle + Zijlstra. + +- bpo-10076: Compiled regular expression and match objects in the re module + now support copy.copy() and copy.deepcopy() (they are considered atomic). + +- bpo-30068: _io._IOBase.readlines will check if it's closed first when hint + is present. + +- bpo-29694: Fixed race condition in pathlib mkdir with flags parents=True. + Patch by Armin Rigo. + +- bpo-29692: Fixed arbitrary unchaining of RuntimeError exceptions in + contextlib.contextmanager. Patch by Siddharth Velankar. + +- bpo-26187: Test that sqlite3 trace callback is not called multiple times + when schema is changing. Indirectly fixed by switching to use + sqlite3_prepare_v2() in bpo-9303. Patch by Aviv Palivoda. + +- bpo-30017: Allowed calling the close() method of the zip entry writer + object multiple times. Writing to a closed writer now always produces a + ValueError. + +- bpo-29998: Pickling and copying ImportError now preserves name and path + attributes. + +- bpo-29995: re.escape() now escapes only regex special characters. + +- bpo-29962: Add math.remainder operation, implementing remainder as + specified in IEEE 754. + +- bpo-29649: Improve struct.pack_into() exception messages for problems with + the buffer size and offset. Patch by Andrew Nester. + +- bpo-29654: Support If-Modified-Since HTTP header (browser cache). Patch + by Pierre Quentel. + +- bpo-29931: Fixed comparison check for ipaddress.ip_interface objects. + Patch by Sanjay Sundaresan. + +- bpo-29953: Fixed memory leaks in the replace() method of datetime and time + objects when pass out of bound fold argument. + +- bpo-29942: Fix a crash in itertools.chain.from_iterable when encountering + long runs of empty iterables. + +- bpo-10030: Sped up reading encrypted ZIP files by 2 times. + +- bpo-29204: Element.getiterator() and the html parameter of XMLParser() + were deprecated only in the documentation (since Python 3.2 and 3.4 + correspondingly). Now using them emits a deprecation warning. + +- bpo-27863: Fixed multiple crashes in ElementTree caused by race conditions + and wrong types. + +- bpo-25996: Added support of file descriptors in os.scandir() on Unix. + os.fwalk() is sped up by 2 times by using os.scandir(). + +- bpo-28699: Fixed a bug in pools in multiprocessing.pool that raising an + exception at the very first of an iterable may swallow the exception or + make the program hang. Patch by Davin Potts and Xiang Zhang. + +- bpo-23890: unittest.TestCase.assertRaises() now manually breaks a + reference cycle to not keep objects alive longer than expected. + +- bpo-29901: The zipapp module now supports general path-like objects, not + just pathlib.Path. + +- bpo-25803: Avoid incorrect errors raised by Path.mkdir(exist_ok=True) when + the OS gives priority to errors such as EACCES over EEXIST. + +- bpo-29861: Release references to tasks, their arguments and their results + as soon as they are finished in multiprocessing.Pool. + +- bpo-19930: The mode argument of os.makedirs() no longer affects the file + permission bits of newly-created intermediate-level directories. + +- bpo-29884: faulthandler: Restore the old sigaltstack during teardown. + Patch by Christophe Zeitouny. + +- bpo-25455: Fixed crashes in repr of recursive buffered file-like objects. + +- bpo-29800: Fix crashes in partial.__repr__ if the keys of partial.keywords + are not strings. Patch by Michael Seifert. + +- bpo-8256: Fixed possible failing or crashing input() if attributes + "encoding" or "errors" of sys.stdin or sys.stdout are not set or are not + strings. + +- bpo-28692: Using non-integer value for selecting a plural form in gettext + is now deprecated. + +- bpo-26121: Use C library implementation for math functions erf() and + erfc(). + +- bpo-29619: os.stat() and os.DirEntry.inode() now convert inode (st_ino) + using unsigned integers. + +- bpo-28298: Fix a bug that prevented array 'Q', 'L' and 'I' from accepting + big intables (objects that have __int__) as elements. + +- bpo-29645: Speed up importing the webbrowser module. + webbrowser.register() is now thread-safe. + +- bpo-28231: The zipfile module now accepts path-like objects for external + paths. + +- bpo-26915: index() and count() methods of collections.abc.Sequence now + check identity before checking equality when do comparisons. + +- bpo-28682: Added support for bytes paths in os.fwalk(). + +- bpo-29728: Add new :data:`socket.TCP_NOTSENT_LOWAT` (Linux 3.12) constant. + Patch by Nathaniel J. Smith. + +- bpo-29623: Allow use of path-like object as a single argument in + ConfigParser.read(). Patch by David Ellis. + +- bpo-9303: Migrate sqlite3 module to _v2 API. Patch by Aviv Palivoda. + +- bpo-28963: Fix out of bound iteration in + asyncio.Future.remove_done_callback implemented in C. + +- bpo-29704: asyncio.subprocess.SubprocessStreamProtocol no longer closes + before all pipes are closed. + +- bpo-29271: Fix Task.current_task and Task.all_tasks implemented in C to + accept None argument as their pure Python implementation. + +- bpo-29703: Fix asyncio to support instantiation of new event loops in + child processes. + +- bpo-29615: SimpleXMLRPCDispatcher no longer chains KeyError (or any other + exception) to exception(s) raised in the dispatched methods. Patch by Petr + Motejlek. + +- bpo-7769: Method register_function() of + xmlrpc.server.SimpleXMLRPCDispatcher and its subclasses can now be used as + a decorator. + +- bpo-29376: Fix assertion error in threading._DummyThread.is_alive(). + +- bpo-28624: Add a test that checks that cwd parameter of Popen() accepts + PathLike objects. Patch by Sayan Chowdhury. + +- bpo-28518: Start a transaction implicitly before a DML statement. Patch by + Aviv Palivoda. + +- bpo-29742: get_extra_info() raises exception if get called on closed ssl + transport. Patch by Nikolay Kim. + +- bpo-16285: urllib.parse.quote is now based on RFC 3986 and hence includes + '~' in the set of characters that is not quoted by default. Patch by + Christian Theune and Ratnadeep Debnath. + +- bpo-29532: Altering a kwarg dictionary passed to functools.partial() no + longer affects a partial object after creation. + +- bpo-29110: Fix file object leak in aifc.open() when file is given as a + filesystem path and is not in valid AIFF format. Patch by Anthony Zhang. + +- bpo-22807: Add uuid.SafeUUID and uuid.UUID.is_safe to relay information + from the platform about whether generated UUIDs are generated with a + multiprocessing safe method. + +- bpo-29576: Improve some deprecations in importlib. Some deprecated methods + now emit DeprecationWarnings and have better descriptive messages. + +- bpo-29534: Fixed different behaviour of Decimal.from_float() for _decimal + and _pydecimal. Thanks Andrew Nester. + +- bpo-10379: locale.format_string now supports the 'monetary' keyword + argument, and locale.format is deprecated. + +- bpo-29851: importlib.reload() now raises ModuleNotFoundError if the module + lacks a spec. + +- bpo-28556: Various updates to typing module: typing.Counter, + typing.ChainMap, improved ABC caching, etc. Original PRs by Jelle + Zijlstra, Ivan Levkivskyi, Manuel Krebber, and Łukasz Langa. + +- bpo-29100: Fix datetime.fromtimestamp() regression introduced in Python + 3.6.0: check minimum and maximum years. + +- bpo-29416: Prevent infinite loop in pathlib.Path.mkdir + +- bpo-29444: Fixed out-of-bounds buffer access in the group() method of the + match object. Based on patch by WGH. + +- bpo-29377: Add WrapperDescriptorType, MethodWrapperType, and + MethodDescriptorType built-in types to types module. Original patch by + Manuel Krebber. + +- bpo-29218: Unused install_misc command is now removed. It has been + documented as unused since 2000. Patch by Eric N. Vander Weele. + +- bpo-29368: The extend() method is now called instead of the append() + method when unpickle collections.deque and other list-like objects. This + can speed up unpickling to 2 times. + +- bpo-29338: The help of a builtin or extension class now includes the + constructor signature if __text_signature__ is provided for the class. + +- bpo-29335: Fix subprocess.Popen.wait() when the child process has exited + to a stopped instead of terminated state (ex: when under ptrace). + +- bpo-29290: Fix a regression in argparse that help messages would wrap at + non-breaking spaces. + +- bpo-28735: Fixed the comparison of mock.MagickMock with mock.ANY. + +- bpo-29197: Removed deprecated function ntpath.splitunc(). + +- bpo-29210: Removed support of deprecated argument "exclude" in + tarfile.TarFile.add(). + +- bpo-29219: Fixed infinite recursion in the repr of uninitialized + ctypes.CDLL instances. + +- bpo-29192: Removed deprecated features in the http.cookies module. + +- bpo-29193: A format string argument for string.Formatter.format() is now + positional-only. + +- bpo-29195: Removed support of deprecated undocumented keyword arguments in + methods of regular expression objects. + +- bpo-28969: Fixed race condition in C implementation of + functools.lru_cache. KeyError could be raised when cached function with + full cache was simultaneously called from different threads with the same + uncached arguments. + +- bpo-20804: The unittest.mock.sentinel attributes now preserve their + identity when they are copied or pickled. + +- bpo-29142: In urllib.request, suffixes in no_proxy environment variable + with leading dots could match related hostnames again (e.g. .b.c matches + a.b.c). Patch by Milan Oberkirch. + +- bpo-28961: Fix unittest.mock._Call helper: don't ignore the name parameter + anymore. Patch written by Jiajun Huang. + +- bpo-15812: inspect.getframeinfo() now correctly shows the first line of a + context. Patch by Sam Breese. + +- bpo-28985: Update authorizer constants in sqlite3 module. Patch by + Dingyuan Wang. + +- bpo-29079: Prevent infinite loop in pathlib.resolve() on Windows + +- bpo-13051: Fixed recursion errors in large or resized + curses.textpad.Textbox. Based on patch by Tycho Andersen. + +- bpo-9770: curses.ascii predicates now work correctly with negative + integers. + +- bpo-28427: old keys should not remove new values from WeakValueDictionary + when collecting from another thread. + +- bpo-28923: Remove editor artifacts from Tix.py. + +- bpo-28871: Fixed a crash when deallocate deep ElementTree. + +- bpo-19542: Fix bugs in WeakValueDictionary.setdefault() and + WeakValueDictionary.pop() when a GC collection happens in another thread. + +- bpo-20191: Fixed a crash in resource.prlimit() when passing a sequence + that doesn't own its elements as limits. + +- bpo-16255: subprocess.Popen uses /system/bin/sh on Android as the shell, + instead of /bin/sh. + +- bpo-28779: multiprocessing.set_forkserver_preload() would crash the + forkserver process if a preloaded module instantiated some multiprocessing + objects such as locks. + +- bpo-26937: The chown() method of the tarfile.TarFile class does not fail + now when the grp module cannot be imported, as for example on Android + platforms. + +- bpo-28847: dbm.dumb now supports reading read-only files and no longer + writes the index file when it is not changed. A deprecation warning is + now emitted if the index file is missed and recreated in the 'r' and 'w' + modes (will be an error in future Python releases). + +- bpo-27030: Unknown escapes consisting of ``'\'`` and an ASCII letter in + re.sub() replacement templates regular expressions now are errors. + +- bpo-28835: Fix a regression introduced in warnings.catch_warnings(): call + warnings.showwarning() if it was overridden inside the context manager. + +- bpo-27172: To assist with upgrades from 2.7, the previously documented + deprecation of ``inspect.getfullargspec()`` has been reversed. This + decision may be revisited again after the Python 2.7 branch is no longer + officially supported. + +- bpo-28740: Add sys.getandroidapilevel(): return the build time API version + of Android as an integer. Function only available on Android. + +- bpo-26273: Add new :data:`socket.TCP_CONGESTION` (Linux 2.6.13) and + :data:`socket.TCP_USER_TIMEOUT` (Linux 2.6.37) constants. Patch written by + Omar Sandoval. + +- bpo-28752: Restored the __reduce__() methods of datetime objects. + +- bpo-28727: Regular expression patterns, _sre.SRE_Pattern objects created + by re.compile(), become comparable (only x==y and x!=y operators). This + change should fix the issue #18383: don't duplicate warning filters when + the warnings module is reloaded (thing usually only done in unit tests). + +- bpo-20572: Remove the subprocess.Popen.wait endtime parameter. It was + deprecated in 3.4 and undocumented prior to that. + +- bpo-25659: In ctypes, prevent a crash calling the from_buffer() and + from_buffer_copy() methods on abstract classes like Array. + +- bpo-28548: In the "http.server" module, parse the protocol version if + possible, to avoid using HTTP 0.9 in some error responses. + +- bpo-19717: Makes Path.resolve() succeed on paths that do not exist. Patch + by Vajrasky Kok + +- bpo-28563: Fixed possible DoS and arbitrary code execution when handle + plural form selections in the gettext module. The expression parser now + supports exact syntax supported by GNU gettext. + +- bpo-28387: Fixed possible crash in _io.TextIOWrapper deallocator when the + garbage collector is invoked in other thread. Based on patch by Sebastian + Cufre. + +- bpo-27517: LZMA compressor and decompressor no longer raise exceptions if + given empty data twice. Patch by Benjamin Fogle. + +- bpo-28549: Fixed segfault in curses's addch() with ncurses6. + +- bpo-28449: tarfile.open() with mode "r" or "r:" now tries to open a tar + file with compression before trying to open it without compression. + Otherwise it had 50% chance failed with ignore_zeros=True. + +- bpo-23262: The webbrowser module now supports Firefox 36+ and derived + browsers. Based on patch by Oleg Broytman. + +- bpo-24241: The webbrowser in an X environment now prefers using the + default browser directly. Also, the webbrowser register() function now has + a documented 'preferred' argument, to specify browsers to be returned by + get() with no arguments. Patch by David Steele + +- bpo-27939: Fixed bugs in tkinter.ttk.LabeledScale and tkinter.Scale caused + by representing the scale as float value internally in Tk. tkinter.IntVar + now works if float value is set to underlying Tk variable. + +- bpo-28255: calendar.TextCalendar.prweek() no longer prints a space after a + weeks's calendar. calendar.TextCalendar.pryear() no longer prints + redundant newline after a year's calendar. Based on patch by Xiang Zhang. + +- bpo-28255: calendar.TextCalendar.prmonth() no longer prints a space at the + start of new line after printing a month's calendar. Patch by Xiang + Zhang. + +- bpo-20491: The textwrap.TextWrapper class now honors non-breaking spaces. + Based on patch by Kaarle Ritvanen. + +- bpo-28353: os.fwalk() no longer fails on broken links. + +- bpo-28430: Fix iterator of C implemented asyncio.Future doesn't accept + non-None value is passed to it.send(val). + +- bpo-27025: Generated names for Tkinter widgets now start by the "!" prefix + for readability. + +- bpo-25464: Fixed HList.header_exists() in tkinter.tix module by addin a + workaround to Tix library bug. + +- bpo-28488: shutil.make_archive() no longer adds entry "./" to ZIP archive. + +- bpo-25953: re.sub() now raises an error for invalid numerical group + reference in replacement template even if the pattern is not found in the + string. Error message for invalid group reference now includes the group + index and the position of the reference. Based on patch by SilentGhost. + +- bpo-28469: timeit now uses the sequence 1, 2, 5, 10, 20, 50,... instead of + 1, 10, 100,... for autoranging. + +- bpo-28115: Command-line interface of the zipfile module now uses argparse. + Added support of long options. + +- bpo-18219: Optimize csv.DictWriter for large number of columns. Patch by + Mariatta Wijaya. + +- bpo-28448: Fix C implemented asyncio.Future didn't work on Windows. + +- bpo-23214: In the "io" module, the argument to BufferedReader and + BytesIO's read1() methods is now optional and can be -1, matching the + BufferedIOBase specification. + +- bpo-28480: Fix error building socket module when multithreading is + disabled. + +- bpo-28240: timeit: remove ``-c/--clock`` and ``-t/--time`` command line + options which were deprecated since Python 3.3. + +- bpo-28240: timeit now repeats the benchmarks 5 times instead of only 3 to + make benchmarks more reliable. + +- bpo-28240: timeit autorange now uses a single loop iteration if the + benchmark takes less than 10 seconds, instead of 10 iterations. "python3 + -m timeit -s 'import time' 'time.sleep(1)'" now takes 4 seconds instead of + 40 seconds. + +- Distutils.sdist now looks for README and setup.py files with case + sensitivity. This behavior matches that found in Setuptools 6.0 and later. + See `setuptools 100 `_ for + rationale. + +- bpo-24452: Make webbrowser support Chrome on Mac OS X. Patch by Ned + Batchelder. + +- bpo-20766: Fix references leaked by pdb in the handling of SIGINT + handlers. + +- bpo-27998: Fixed bytes path support in os.scandir() on Windows. Patch by + Eryk Sun. + +- bpo-28317: The disassembler now decodes FORMAT_VALUE argument. + +- bpo-28380: unittest.mock Mock autospec functions now properly support + assert_called, assert_not_called, and assert_called_once. + +- bpo-28229: lzma module now supports pathlib. + +- bpo-28321: Fixed writing non-BMP characters with binary format in + plistlib. + +- bpo-28225: bz2 module now supports pathlib. Initial patch by Ethan + Furman. + +- bpo-28227: gzip now supports pathlib. Patch by Ethan Furman. + +- bpo-28332: Deprecated silent truncations in socket.htons and socket.ntohs. + Original patch by Oren Milman. + +- bpo-27358: Optimized merging var-keyword arguments and improved error + message when passing a non-mapping as a var-keyword argument. + +- bpo-28257: Improved error message when passing a non-iterable as a + var-positional argument. Added opcode BUILD_TUPLE_UNPACK_WITH_CALL. + +- bpo-28322: Fixed possible crashes when unpickle itertools objects from + incorrect pickle data. Based on patch by John Leitch. + +- bpo-28228: imghdr now supports pathlib. + +- bpo-28226: compileall now supports pathlib. + +- bpo-28314: Fix function declaration (C flags) for the getiterator() method + of xml.etree.ElementTree.Element. + +- bpo-28148: Stop using localtime() and gmtime() in the time module. + Introduced platform independent _PyTime_localtime API that is similar to + POSIX localtime_r, but available on all platforms. Patch by Ed Schouten. + +- bpo-28253: Fixed calendar functions for extreme months: 0001-01 and + 9999-12. Methods itermonthdays() and itermonthdays2() are reimplemented so + that they don't call itermonthdates() which can cause datetime.date + under/overflow. + +- bpo-28275: Fixed possible use after free in the decompress() methods of + the LZMADecompressor and BZ2Decompressor classes. Original patch by John + Leitch. + +- bpo-27897: Fixed possible crash in sqlite3.Connection.create_collation() + if pass invalid string-like object as a name. Patch by Xiang Zhang. + +- bpo-18844: random.choices() now has k as a keyword-only argument to + improve the readability of common cases and come into line with the + signature used in other languages. + +- bpo-18893: Fix invalid exception handling in Lib/ctypes/macholib/dyld.py. + Patch by Madison May. + +- bpo-27611: Fixed support of default root window in the tkinter.tix module. + Added the master parameter in the DisplayStyle constructor. + +- bpo-27348: In the traceback module, restore the formatting of exception + messages like "Exception: None". This fixes a regression introduced in + 3.5a2. + +- bpo-25651: Allow falsy values to be used for msg parameter of subTest(). + +- bpo-27778: Fix a memory leak in os.getrandom() when the getrandom() is + interrupted by a signal and a signal handler raises a Python exception. + +- bpo-28200: Fix memory leak on Windows in the os module (fix + path_converter() function). + +- bpo-25400: RobotFileParser now correctly returns default values for + crawl_delay and request_rate. Initial patch by Peter Wirtz. + +- bpo-27932: Prevent memory leak in win32_ver(). + +- Fix UnboundLocalError in socket._sendfile_use_sendfile. + +- bpo-28075: Check for ERROR_ACCESS_DENIED in Windows implementation of + os.stat(). Patch by Eryk Sun. + +- bpo-22493: Warning message emitted by using inline flags in the middle of + regular expression now contains a (truncated) regex pattern. Patch by Tim + Graham. + +- bpo-25270: Prevent codecs.escape_encode() from raising SystemError when an + empty bytestring is passed. + +- bpo-28181: Get antigravity over HTTPS. Patch by Kaartic Sivaraam. + +- bpo-25895: Enable WebSocket URL schemes in urllib.parse.urljoin. Patch by + Gergely Imreh and Markus Holtermann. + +- bpo-28114: Fix a crash in parse_envlist() when env contains byte strings. + Patch by Eryk Sun. + +- bpo-27599: Fixed buffer overrun in binascii.b2a_qp() and + binascii.a2b_qp(). + +- bpo-27906: Fix socket accept exhaustion during high TCP traffic. Patch by + Kevin Conway. + +- bpo-28174: Handle when SO_REUSEPORT isn't properly supported. Patch by + Seth Michael Larson. + +- bpo-26654: Inspect functools.partial in asyncio.Handle.__repr__. Patch by + iceboy. + +- bpo-26909: Fix slow pipes IO in asyncio. Patch by INADA Naoki. + +- bpo-28176: Fix callbacks race in asyncio.SelectorLoop.sock_connect. + +- bpo-27759: Fix selectors incorrectly retain invalid file descriptors. + Patch by Mark Williams. + +- bpo-28325: Remove vestigial MacOS 9 macurl2path module and its tests. + +- bpo-28368: Refuse monitoring processes if the child watcher has no loop + attached. Patch by Vincent Michel. + +- bpo-28369: Raise RuntimeError when transport's FD is used with add_reader, + add_writer, etc. + +- bpo-28370: Speedup asyncio.StreamReader.readexactly. Patch by Коренберг + Марк. + +- bpo-28371: Deprecate passing asyncio.Handles to run_in_executor. + +- bpo-28372: Fix asyncio to support formatting of non-python coroutines. + +- bpo-28399: Remove UNIX socket from FS before binding. Patch by Коренберг + Марк. + +- bpo-27972: Prohibit Tasks to await on themselves. + +- bpo-24142: Reading a corrupt config file left configparser in an invalid + state. Original patch by Florian Höch. + +- bpo-29581: ABCMeta.__new__ now accepts ``**kwargs``, allowing abstract + base classes to use keyword parameters in __init_subclass__. Patch by Nate + Soares. + +- bpo-25532: inspect.unwrap() will now only try to unwrap an object + sys.getrecursionlimit() times, to protect against objects which create a + new object on every attribute access. + +- bpo-30177: path.resolve(strict=False) no longer cuts the path after the + first element not present in the filesystem. Patch by Antoine Pietri. + +Documentation +------------- + +- bpo-31294: Fix incomplete code snippet in the ZeroMQSocketListener and + ZeroMQSocketHandler examples and adapt them to Python 3. + +- bpo-21649: Add RFC 7525 and Mozilla server side TLS links to SSL + documentation. + +- bpo-31128: Allow the pydoc server to bind to arbitrary hostnames. + +- bpo-30803: Clarify doc on truth value testing. Original patch by Peter + Thomassen. + +- bpo-30176: Add missing attribute related constants in curses + documentation. + +- bpo-30052: the link targets for :func:`bytes` and :func:`bytearray` are + now their respective type definitions, rather than the corresponding + builtin function entries. Use :ref:`bytes ` and + :ref:`bytearray ` to reference the latter. In order to + ensure this and future cross-reference updates are applied automatically, + the daily documentation builds now disable the default output caching + features in Sphinx. + +- bpo-26985: Add missing info of code object in inspect documentation. + +- bpo-19824: Improve the documentation for, and links to, template strings + by emphasizing their utility for internationalization, and by clarifying + some usage constraints. (See also: bpo-20314, bpo-12518) + +- bpo-28929: Link the documentation to its source file on GitHub. + +- bpo-25008: Document smtpd.py as effectively deprecated and add a pointer + to aiosmtpd, a third-party asyncio-based replacement. + +- bpo-26355: Add canonical header link on each page to corresponding major + version of the documentation. Patch by Matthias Bussonnier. + +- bpo-29349: Fix Python 2 syntax in code for building the documentation. + +- bpo-23722: The data model reference and the porting section in the 3.6 + What's New guide now cover the additional ``__classcell__`` handling + needed for custom metaclasses to fully support :pep:`487` and + zero-argument ``super()``. + +- bpo-28513: Documented command-line interface of zipfile. + +Tests +----- + +- bpo-29639: test.support.HOST is now "localhost", a new HOSTv4 constant has + been added for your ``127.0.0.1`` needs, similar to the existing HOSTv6 + constant. + +- bpo-31320: Silence traceback in test_ssl + +- bpo-31346: Prefer PROTOCOL_TLS_CLIENT and PROTOCOL_TLS_SERVER protocols + for SSLContext. + +- bpo-25674: Remove sha256.tbs-internet.com ssl test + +- bpo-30715: Address ALPN callback changes for OpenSSL 1.1.0f. The latest + version behaves like OpenSSL 1.0.2 and no longer aborts handshake. + +- bpo-30822: regrtest: Exclude tzdata from regrtest --all. When running the + test suite using --use=all / -u all, exclude tzdata since it makes + test_datetime too slow (15-20 min on some buildbots) which then times out + on some buildbots. Fix also regrtest command line parser to allow passing + -u extralargefile to run test_zipfile64. + +- bpo-30695: Add the `set_nomemory(start, stop)` and `remove_mem_hooks()` + functions to the _testcapi module. + +- bpo-30357: test_thread: setUp() now uses support.threading_setup() and + support.threading_cleanup() to wait until threads complete to avoid random + side effects on following tests. Initial patch written by Grzegorz + Grzywacz. + +- bpo-30197: Enhanced functions swap_attr() and swap_item() in the + test.support module. They now work when delete replaced attribute or item + inside the with statement. The old value of the attribute or item (or + None if it doesn't exist) now will be assigned to the target of the "as" + clause, if there is one. + +- bpo-24932: Use proper command line parsing in _testembed + +- bpo-28950: Disallow -j0 to be combined with -T/-l in regrtest command line + arguments. + +- bpo-28683: Fix the tests that bind() a unix socket and raise + PermissionError on Android for a non-root user. + +- bpo-26936: Fix the test_socket failures on Android - getservbyname(), + getservbyport() and getaddrinfo() are broken on some Android API levels. + +- bpo-28666: Now test.support.rmtree is able to remove unwritable or + unreadable directories. + +- bpo-23839: Various caches now are cleared before running every test file. + +- bpo-26944: Fix test_posix for Android where 'id -G' is entirely wrong or + missing the effective gid. + +- bpo-28409: regrtest: fix the parser of command line arguments. + +- bpo-28217: Adds _testconsole module to test console input. + +- bpo-26939: Add the support.setswitchinterval() function to fix + test_functools hanging on the Android armv7 qemu emulator. + +Build +----- + +- bpo-31354: Allow --with-lto to be used on all builds, not just `make + profile-opt`. + +- bpo-31370: Remove support for building --without-threads. This option is + not really useful anymore in the 21st century. Removing lots of + conditional paths allows us to simplify the code base, including in + difficult to maintain low-level internal code. + +- bpo-31341: Per :pep:`11`, support for the IRIX operating system was + removed. + +- bpo-30854: Fix compile error when compiling --without-threads. Patch by + Masayuki Yamamoto. + +- bpo-30687: Locate msbuild.exe on Windows when building rather than + vcvarsall.bat + +- bpo-20210: Support the *disabled* marker in Setup files. Extension modules + listed after this marker are not built at all, neither by the Makefile nor + by setup.py. + +- bpo-29941: Add ``--with-assertions`` configure flag to explicitly enable C + ``assert()`` checks. Defaults to off. ``--with-pydebug`` implies + ``--with-assertions``. + +- bpo-28787: Fix out-of-tree builds of Python when configured with + ``--with--dtrace``. + +- bpo-29243: Prevent unnecessary rebuilding of Python during ``make test``, + ``make install`` and some other make targets when configured with + ``--enable-optimizations``. + +- bpo-23404: Don't regenerate generated files based on file modification + time anymore: the action is now explicit. Replace ``make touch`` with + ``make regen-all``. + +- bpo-29643: Fix ``--enable-optimization`` didn't work. + +- bpo-27593: sys.version and the platform module python_build(), + python_branch(), and python_revision() functions now use git information + rather than hg when building from a repo. + +- bpo-29572: Update Windows build and OS X installers to use OpenSSL 1.0.2k. + +- bpo-27659: Prohibit implicit C function declarations: use + ``-Werror=implicit-function-declaration`` when possible (GCC and Clang, + but it depends on the compiler version). Patch written by Chi Hsuan Yen. + +- bpo-29384: Remove old Be OS helper scripts. + +- bpo-26851: Set Android compilation and link flags. + +- bpo-28768: Fix implicit declaration of function _setmode. Patch by + Masayuki Yamamoto + +- bpo-29080: Removes hard dependency on hg.exe from PCBuild/build.bat + +- bpo-23903: Added missed names to PC/python3.def. + +- bpo-28762: lockf() is available on Android API level 24, but the F_LOCK + macro is not defined in android-ndk-r13. + +- bpo-28538: Fix the compilation error that occurs because if_nameindex() is + available on Android API level 24, but the if_nameindex structure is not + defined. + +- bpo-20211: Do not add the directory for installing C header files and the + directory for installing object code libraries to the cross compilation + search paths. Original patch by Thomas Petazzoni. + +- bpo-28849: Do not define sys.implementation._multiarch on Android. + +- bpo-10656: Fix out-of-tree building on AIX. Patch by Tristan Carel and + Michael Haubenwallner. + +- bpo-26359: Rename --with-optimiations to --enable-optimizations. + +- bpo-28444: Fix missing extensions modules when cross compiling. + +- bpo-28208: Update Windows build and OS X installers to use SQLite 3.14.2. + +- bpo-28248: Update Windows build and OS X installers to use OpenSSL 1.0.2j. + +- bpo-21124: Fix building the _struct module on Cygwin by passing ``NULL`` + instead of ``&PyType_Type`` to PyVarObject_HEAD_INIT. Patch by Masayuki + Yamamoto. + +- bpo-13756: Fix building extensions modules on Cygwin. Patch by Roumen + Petrov, based on original patch by Jason Tishler. + +- bpo-21085: Add configure check for siginfo_t.si_band, which Cygwin does + not provide. Patch by Masayuki Yamamoto with review and rebase by Erik + Bray. + +- bpo-28258: Fixed build with Estonian locale (python-config and distclean + targets in Makefile). Patch by Arfrever Frehtes Taifersar Arahesis. + +- bpo-26661: setup.py now detects system libffi with multiarch wrapper. + +- bpo-27979: A full copy of libffi is no longer bundled for use when + building _ctypes on non-OSX UNIX platforms. An installed copy of libffi + is now required when building _ctypes on such platforms. + +- bpo-15819: Remove redundant include search directory option for building + outside the source tree. + +- bpo-28676: Prevent missing 'getentropy' declaration warning on macOS. + Patch by Gareth Rees. + +Windows +------- + +- bpo-31392: Update Windows build to use OpenSSL 1.1.0f + +- bpo-30389: Adds detection of Visual Studio 2017 to distutils on Windows. + +- bpo-31358: zlib is no longer bundled in the CPython source, instead it is + downloaded on demand just like bz2, lzma, OpenSSL, Tcl/Tk, and SQLite. + +- bpo-31340: Change to building with MSVC v141 (included with Visual Studio + 2017) + +- bpo-30581: os.cpu_count() now returns the correct number of processors on + Windows when the number of logical processors is greater than 64. + +- bpo-30916: Pre-build OpenSSL, Tcl and Tk and include the binaries in the + build. + +- bpo-30731: Add a missing xmlns to python.manifest so that it matches the + schema. + +- bpo-30291: Allow requiring 64-bit interpreters from py.exe using -64 + suffix. Contributed by Steve (Gadget) Barnes. + +- bpo-30362: Adds list options (-0, -0p) to py.exe launcher. Contributed by + Steve Barnes. + +- bpo-23451: Fix socket deprecation warnings in socketmodule.c. Patch by + Segev Finer. + +- bpo-30450: The build process on Windows no longer depends on Subversion, + instead pulling external code from GitHub via a Python script. If Python + 3.6 is not found on the system (via ``py -3.6``), NuGet is used to + download a copy of 32-bit Python. + +- bpo-29579: Removes readme.txt from the installer. + +- bpo-25778: winreg does not truncate string correctly (Patch by Eryk Sun) + +- bpo-28896: Deprecate WindowsRegistryFinder and disable it by default + +- bpo-28522: Fixes mishandled buffer reallocation in getpathp.c + +- bpo-28402: Adds signed catalog files for stdlib on Windows. + +- bpo-28333: Enables Unicode for ps1/ps2 and input() prompts. (Patch by Eryk + Sun) + +- bpo-28251: Improvements to help manuals on Windows. + +- bpo-28110: launcher.msi has different product codes between 32-bit and + 64-bit + +- bpo-28161: Opening CON for write access fails + +- bpo-28162: WindowsConsoleIO readall() fails if first line starts with + Ctrl+Z + +- bpo-28163: WindowsConsoleIO fileno() passes wrong flags to _open_osfhandle + +- bpo-28164: _PyIO_get_console_type fails for various paths + +- bpo-28137: Renames Windows path file to ._pth + +- bpo-28138: Windows ._pth file should allow import site + +IDLE +---- + +- bpo-31493: IDLE code context -- fix code update and font update timers. + Canceling timers prevents a warning message when test_idle completes. + +- bpo-31488: IDLE - Update non-key options in former extension classes. When + applying configdialog changes, call .reload for each feature class. Change + ParenMatch so updated options affect existing instances attached to + existing editor windows. + +- bpo-31477: IDLE - Improve rstrip entry in doc. Strip trailing whitespace + strips more than blank spaces. Multiline string literals are not skipped. + +- bpo-31480: IDLE - make tests pass with zzdummy extension disabled by + default. + +- bpo-31421: Document how IDLE runs tkinter programs. IDLE calls tcl/tk + update in the background in order to make live interaction and + experimentation with tkinter applications much easier. + +- bpo-31414: IDLE -- fix tk entry box tests by deleting first. Adding to an + int entry is not the same as deleting and inserting because int('') will + fail. + +- bpo-31051: Rearrange IDLE configdialog GenPage into Window, Editor, and + Help sections. + +- bpo-30617: IDLE - Add docstrings and tests for outwin subclass of editor. + Move some data and functions from the class to module level. Patch by + Cheryl Sabella. + +- bpo-31287: IDLE - Do not modify tkinter.message in test_configdialog. + +- bpo-27099: Convert IDLE's built-in 'extensions' to regular features. About + 10 IDLE features were implemented as supposedly optional extensions. Their + different behavior could be confusing or worse for users and not good for + maintenance. Hence the conversion. The main difference for users is that + user configurable key bindings for builtin features are now handled + uniformly. Now, editing a binding in a keyset only affects its value in + the keyset. All bindings are defined together in the system-specific + default keysets in config-extensions.def. All custom keysets are saved as + a whole in config-extension.cfg. All take effect as soon as one clicks + Apply or Ok. The affected events are '<>', + '<>', '<>', '<>', + '<>', '<>', '<>', and + '<>'. Any (global) customizations made before 3.6.3 will not + affect their keyset-specific customization after 3.6.3. and vice versa. + Initial patch by Charles Wohlganger. + +- bpo-31206: IDLE: Factor HighPage(Frame) class from ConfigDialog. Patch by + Cheryl Sabella. + +- bpo-31001: Add tests for configdialog highlight tab. Patch by Cheryl + Sabella. + +- bpo-31205: IDLE: Factor KeysPage(Frame) class from ConfigDialog. The + slightly modified tests continue to pass. Patch by Cheryl Sabella. + +- bpo-31130: IDLE -- stop leaks in test_configdialog. Initial patch by + Victor Stinner. + +- bpo-31002: Add tests for configdialog keys tab. Patch by Cheryl Sabella. + +- bpo-19903: IDLE: Calltips use `inspect.signature` instead of + `inspect.getfullargspec`. This improves calltips for builtins converted to + use Argument Clinic. Patch by Louie Lu. + +- bpo-31083: IDLE - Add an outline of a TabPage class in configdialog. + Update existing classes to match outline. Initial patch by Cheryl Sabella. + +- bpo-31050: Factor GenPage(Frame) class from ConfigDialog. The slightly + modified tests continue to pass. Patch by Cheryl Sabella. + +- bpo-31004: IDLE - Factor FontPage(Frame) class from ConfigDialog. Slightly + modified tests continue to pass. Fix General tests. Patch mostly by Cheryl + Sabella. + +- bpo-30781: IDLE - Use ttk widgets in ConfigDialog. Patches by Terry Jan + Reedy and Cheryl Sabella. + +- bpo-31060: IDLE - Finish rearranging methods of ConfigDialog Grouping + methods pertaining to each tab and the buttons will aid writing tests and + improving the tabs and will enable splitting the groups into classes. + +- bpo-30853: IDLE -- Factor a VarTrace class out of ConfigDialog. Instance + tracers manages pairs consisting of a tk variable and a callback function. + When tracing is turned on, setting the variable calls the function. Test + coverage for the new class is 100%. + +- bpo-31003: IDLE: Add more tests for General tab. + +- bpo-30993: IDLE - Improve configdialog font page and tests. In + configdialog: Document causal pathways in create_font_tab docstring. + Simplify some attribute names. Move set_samples calls to var_changed_font + (idea from Cheryl Sabella). Move related functions to positions after the + create widgets function. In test_configdialog: Fix test_font_set so not + order dependent. Fix renamed test_indent_scale so it tests the widget. + Adjust tests for movement of set_samples call. Add tests for load + functions. Put all font tests in one class and tab indent tests in + another. Except for two lines, these tests completely cover the related + functions. + +- bpo-30981: IDLE -- Add more configdialog font page tests. + +- bpo-28523: IDLE: replace 'colour' with 'color' in configdialog. + +- bpo-30917: Add tests for idlelib.config.IdleConf. Increase coverage from + 46% to 96%. Patch by Louie Lu. + +- bpo-30934: Document coverage details for idlelib tests. Add section to + idlelib/idle-test/README.txt. Include check that branches are taken both + ways. Exclude IDLE-specific code that does not run during unit tests. + +- bpo-30913: IDLE: Document ConfigDialog tk Vars, methods, and widgets in + docstrings This will facilitate improving the dialog and splitting up the + class. Original patch by Cheryl Sabella. + +- bpo-30899: IDLE: Add tests for ConfigParser subclasses in config. Patch by + Louie Lu. + +- bpo-30881: IDLE: Add docstrings to browser.py. Patch by Cheryl Sabella. + +- bpo-30851: IDLE: Remove unused variables in configdialog. One is a + duplicate, one is set but cannot be altered by users. Patch by Cheryl + Sabella. + +- bpo-30870: IDLE: In Settings dialog, select font with Up, Down keys as + well as mouse. Initial patch by Louie Lu. + +- bpo-8231: IDLE: call config.IdleConf.GetUserCfgDir only once. + +- bpo-30779: IDLE: Factor ConfigChanges class from configdialog, put in + config; test. * In config, put dump test code in a function; run it and + unittest in 'if __name__ == '__main__'. * Add class config.ConfigChanges + based on changes_class_v4.py on bpo issue. * Add class + test_config.ChangesTest, partly using configdialog_tests_v1.py. * Revise + configdialog to use ConfigChanges; see tracker msg297804. * Revise + test_configdialog to match configdialog changes. * Remove configdialog + functions unused or moved to ConfigChanges. Cheryl Sabella contributed + parts of the patch. + +- bpo-30777: IDLE: configdialog - Add docstrings and fix comments. Patch by + Cheryl Sabella. + +- bpo-30495: IDLE: Improve textview with docstrings, PEP8 names, and more + tests. Patch by Cheryl Sabella. + +- bpo-30723: IDLE: Make several improvements to parenmatch. Add 'parens' + style to highlight both opener and closer. Make 'default' style, which is + not default, a synonym for 'opener'. Make time-delay work the same with + all styles. Add help for config dialog extensions tab, including help for + parenmatch. Add new tests. Original patch by Charles Wohlganger. + +- bpo-30674: IDLE: add docstrings to grep module. Patch by Cheryl Sabella + +- bpo-21519: IDLE's basic custom key entry dialog now detects duplicates + properly. Original patch by Saimadhav Heblikar. + +- bpo-29910: IDLE no longer deletes a character after commenting out a + region by a key shortcut. Add ``return 'break'`` for this and other + potential conflicts between IDLE and default key bindings. + +- bpo-30728: Review and change idlelib.configdialog names. Lowercase method + and attribute names. Replace 'colour' with 'color', expand overly cryptic + names, delete unneeded underscores. Replace ``import *`` with specific + imports. Patches by Cheryl Sabella. + +- bpo-6739: IDLE: Verify user-entered key sequences by trying to bind them + with tk. Add tests for all 3 validation functions. Original patch by G + Polo. Tests added by Cheryl Sabella. + +- bpo-15786: Fix several problems with IDLE's autocompletion box. The + following should now work: clicking on selection box items; using the + scrollbar; selecting an item by hitting Return. Hangs on MacOSX should no + longer happen. Patch by Louie Lu. + +- bpo-25514: Add doc subsubsection about IDLE failure to start. Popup + no-connection message directs users to this section. + +- bpo-30642: Fix reference leaks in IDLE tests. Patches by Louie Lu and + Terry Jan Reedy. + +- bpo-30495: Add docstrings for textview.py and use PEP8 names. Patches by + Cheryl Sabella and Terry Jan Reedy. + +- bpo-30290: Help-about: use pep8 names and add tests. Increase coverage to + 100%. Patches by Louie Lu, Cheryl Sabella, and Terry Jan Reedy. + +- bpo-30303: Add _utest option to textview; add new tests. Increase coverage + to 100%. Patches by Louie Lu and Terry Jan Reedy. + +- bpo-29071: IDLE colors f-string prefixes (but not invalid ur prefixes). + +- bpo-28572: Add 10% to coverage of IDLE's test_configdialog. Update and + augment description of the configuration system. + +Tools/Demos +----------- + +- bpo-30983: gdb integration commands (py-bt, etc.) work on optimized shared + builds now, too. :pep:`523` introduced _PyEval_EvalFrameDefault which + inlines PyEval_EvalFrameEx on non-debug shared builds. This broke the + ability to use py-bt, py-up, and a few other Python-specific gdb + integrations. The problem is fixed by only looking for + _PyEval_EvalFrameDefault frames in python-gdb.py. Original patch by Bruno + "Polaco" Penteado. + +- bpo-29748: Added the slice index converter in Argument Clinic. + +- bpo-24037: Argument Clinic now uses the converter `bool(accept={int})` + rather than `int` for semantical booleans. This avoids repeating the + default value for Python and C and will help in converting to `bool` in + future. + +- bpo-29367: python-gdb.py now supports also ``method-wrapper`` + (``wrapperobject``) objects. + +- bpo-28023: Fix python-gdb.py didn't support new dict implementation. + +- bpo-15369: The pybench and pystone microbenchmark have been removed from + Tools. Please use the new Python benchmark suite + https://github.com/python/performance which is more reliable and includes + a portable version of pybench working on Python 2 and Python 3. + +- bpo-28102: The zipfile module CLI now prints usage to stderr. Patch by + Stephen J. Turnbull. + +C API +----- + +- bpo-31338: Added the ``Py_UNREACHABLE()`` macro for code paths which are + never expected to be reached. This and a few other useful macros are now + documented in the C API manual. + +- bpo-30832: Remove own implementation for thread-local storage. CPython has + provided the own implementation for thread-local storage (TLS) on + Python/thread.c, it's used in the case which a platform has not supplied + native TLS. However, currently all supported platforms (Windows and + pthreads) have provided native TLS and defined the Py_HAVE_NATIVE_TLS + macro with unconditional in any case. + +- bpo-30708: PyUnicode_AsWideCharString() now raises a ValueError if the + second argument is NULL and the wchar_t\* string contains null characters. + +- bpo-16500: Deprecate PyOS_AfterFork() and add PyOS_BeforeFork(), + PyOS_AfterFork_Parent() and PyOS_AfterFork_Child(). + +- bpo-6532: The type of results of PyThread_start_new_thread() and + PyThread_get_thread_ident(), and the id parameter of + PyThreadState_SetAsyncExc() changed from "long" to "unsigned long". + +- bpo-27867: Function PySlice_GetIndicesEx() is deprecated and replaced with + a macro if Py_LIMITED_API is not set or set to the value between + 0x03050400 and 0x03060000 (not including) or 0x03060100 or higher. Added + functions PySlice_Unpack() and PySlice_AdjustIndices(). + +- bpo-29083: Fixed the declaration of some public API functions. + PyArg_VaParse() and PyArg_VaParseTupleAndKeywords() were not available in + limited API. PyArg_ValidateKeywordArguments(), PyArg_UnpackTuple() and + Py_BuildValue() were not available in limited API of version < 3.3 when + PY_SSIZE_T_CLEAN is defined. + +- bpo-28769: The result of PyUnicode_AsUTF8AndSize() and PyUnicode_AsUTF8() + is now of type ``const char *`` rather of ``char *``. + +- bpo-29058: All stable API extensions added after Python 3.2 are now + available only when Py_LIMITED_API is set to the PY_VERSION_HEX value of + the minimum Python version supporting this API. + +- bpo-28822: The index parameters *start* and *end* of PyUnicode_FindChar() + are now adjusted to behave like ``str[start:end]``. + +- bpo-28808: PyUnicode_CompareWithASCIIString() now never raises exceptions. + +- bpo-28761: The fields name and doc of structures PyMemberDef, PyGetSetDef, + PyStructSequence_Field, PyStructSequence_Desc, and wrapperbase are now of + type ``const char *`` rather of ``char *``. + +- bpo-28748: Private variable _Py_PackageContext is now of type ``const char + *`` rather of ``char *``. + +- bpo-19569: Compiler warnings are now emitted if use most of deprecated + functions. + +- bpo-28426: Deprecated undocumented functions PyUnicode_AsEncodedObject(), + PyUnicode_AsDecodedObject(), PyUnicode_AsDecodedUnicode() and + PyUnicode_AsEncodedUnicode(). + + +What's New in Python 3.6.6 final? +================================= + +*Release date: 2018-06-27* + +There were no new changes in version 3.6.6. + + + +What's New in Python 3.6.6 release candidate 1? +=============================================== + +*Release date: 2018-06-11* + +Core and Builtins +----------------- + +- bpo-33786: Fix asynchronous generators to handle GeneratorExit in athrow() + correctly + +- bpo-30654: Fixed reset of the SIGINT handler to SIG_DFL on interpreter + shutdown even when there was a custom handler set previously. Patch by + Philipp Kerling. + +- bpo-33622: Fixed a leak when the garbage collector fails to add an object + with the ``__del__`` method or referenced by it into the + :data:`gc.garbage` list. :c:func:`PyGC_Collect` can now be called when an + exception is set and preserves it. + +- bpo-31849: Fix signed/unsigned comparison warning in pyhash.c. + +- bpo-33391: Fix a leak in set_symmetric_difference(). + +- bpo-28055: Fix unaligned accesses in siphash24(). Patch by Rolf Eike Beer. + +- bpo-33231: Fix potential memory leak in ``normalizestring()``. + +- bpo-29922: Improved error messages in 'async with' when ``__aenter__()`` + or ``__aexit__()`` return non-awaitable object. + +- bpo-33199: Fix ``ma_version_tag`` in dict implementation is uninitialized + when copying from key-sharing dict. + +- bpo-33041: Fixed jumping when the function contains an ``async for`` loop. + +- bpo-32282: Fix an unnecessary ifdef in the include of VersionHelpers.h in + socketmodule on Windows. + +- bpo-21983: Fix a crash in `ctypes.cast()` in case the type argument is a + ctypes structured data type. Patch by Eryk Sun and Oren Milman. + +Library +------- + +- bpo-30167: Prevent site.main() exception if PYTHONSTARTUP is set. Patch by + Steve Weber. + +- bpo-33812: Datetime instance d with non-None tzinfo, but with + d.tzinfo.utcoffset(d) returning None is now treated as naive by the + astimezone() method. + +- bpo-30805: Avoid race condition with debug logging + +- bpo-33767: The concatenation (``+``) and repetition (``*``) sequence + operations now raise :exc:`TypeError` instead of :exc:`SystemError` when + performed on :class:`mmap.mmap` objects. Patch by Zackery Spytz. + +- bpo-32684: Fix gather to propagate cancellation of itself even with + return_exceptions. + +- bpo-33674: Fix a race condition in SSLProtocol.connection_made() of + asyncio.sslproto: start immediately the handshake instead of using + call_soon(). Previously, data_received() could be called before the + handshake started, causing the handshake to hang or fail. + +- bpo-31647: Fixed bug where calling write_eof() on a + _SelectorSocketTransport after it's already closed raises AttributeError. + +- bpo-33672: Fix Task.__repr__ crash with Cython's bogus coroutines + +- bpo-33469: Fix RuntimeError after closing loop that used run_in_executor + +- bpo-11874: Use a better regex when breaking usage into wrappable parts. + Avoids bogus assertion errors from custom metavar strings. + +- bpo-30877: Fixed a bug in the Python implementation of the JSON decoder + that prevented the cache of parsed strings from clearing after finishing + the decoding. Based on patch by c-fos. + +- bpo-33548: tempfile._candidate_tempdir_list should consider common TEMP + locations + +- bpo-33542: Prevent ``uuid.get_node`` from using a DUID instead of a MAC on + Windows. Patch by Zvi Effron + +- bpo-26819: Fix race condition with `ReadTransport.resume_reading` in + Windows proactor event loop. + +- bpo-28556: Minor fixes in typing module: add annotations to + ``NamedTuple.__new__``, pass ``*args`` and ``**kwds`` in + ``Generic.__new__``. Original PRs by Paulius Šarka and Chad Dombrova. + +- bpo-20087: Updated alias mapping with glibc 2.27 supported locales. + +- bpo-33422: Fix trailing quotation marks getting deleted when looking up + byte/string literals on pydoc. Patch by Andrés Delfino. + +- bpo-33197: Update error message when constructing invalid + inspect.Parameters Patch by Dong-hee Na. + +- bpo-33383: Fixed crash in the get() method of the :mod:`dbm.ndbm` database + object when it is called with a single argument. + +- bpo-33329: Fix multiprocessing regression on newer glibcs + +- bpo-991266: Fix quoting of the ``Comment`` attribute of + :class:`http.cookies.SimpleCookie`. + +- bpo-33131: Upgrade bundled version of pip to 10.0.1. + +- bpo-33308: Fixed a crash in the :mod:`parser` module when converting an ST + object to a tree of tuples or lists with ``line_info=False`` and + ``col_info=True``. + +- bpo-33263: Fix FD leak in `_SelectorSocketTransport` Patch by Vlad + Starostin. + +- bpo-33256: Fix display of ```` call in the html produced by + ``cgitb.html()``. Patch by Stéphane Blondon. + +- bpo-33203: ``random.Random.choice()`` now raises ``IndexError`` for empty + sequences consistently even when called from subclasses without a + ``getrandbits()`` implementation. + +- bpo-33224: Update difflib.mdiff() for :pep:`479`. Convert an uncaught + StopIteration in a generator into a return-statement. + +- bpo-33209: End framing at the end of C implementation of + :func:`pickle.Pickler.dump`. + +- bpo-32861: The urllib.robotparser's ``__str__`` representation now + includes wildcard entries and the "Crawl-delay" and "Request-rate" fields. + Patch by Michael Lazar. + +- bpo-33096: Allow ttk.Treeview.insert to insert iid that has a false + boolean value. Note iid=0 and iid=False would be same. Patch by Garvit + Khatri. + +- bpo-33127: The ssl module now compiles with LibreSSL 2.7.1. + +- bpo-33021: Release the GIL during fstat() calls, avoiding hang of all + threads when calling mmap.mmap(), os.urandom(), and random.seed(). Patch + by Nir Soffer. + +- bpo-27683: Fix a regression in :mod:`ipaddress` that result of + :meth:`hosts` is empty when the network is constructed by a tuple + containing an integer mask and only 1 bit left for addresses. + +- bpo-32844: Fix wrong redirection of a low descriptor (0 or 1) to stderr in + subprocess if another low descriptor is closed. + +- bpo-31908: Fix output of cover files for ``trace`` module command-line + tool. Previously emitted cover files only when ``--missing`` option was + used. Patch by Michael Selik. + +- bpo-31457: If nested log adapters are used, the inner ``process()`` + methods are no longer omitted. + +- bpo-16865: Support arrays >=2GiB in :mod:`ctypes`. Patch by Segev Finer. + +- bpo-31238: pydoc: the stop() method of the private ServerThread class now + waits until DocServer.serve_until_quit() completes and then explicitly + sets its docserver attribute to None to break a reference cycle. + +Documentation +------------- + +- bpo-33503: Fix broken pypi link + +- bpo-33421: Add missing documentation for ``typing.AsyncContextManager``. + +- bpo-33378: Add Korean language switcher for https://docs.python.org/3/ + +- bpo-33276: Clarify that the ``__path__`` attribute on modules cannot be + just any value. + +- bpo-33201: Modernize documentation for writing C extension types. + +- bpo-33195: Deprecate ``Py_UNICODE`` usage in ``c-api/arg`` document. + ``Py_UNICODE`` related APIs are deprecated since Python 3.3, but it is + missed in the document. + +- bpo-33126: Document PyBuffer_ToContiguous(). + +- bpo-27212: Modify documentation for the :func:`islice` recipe to consume + initial values up to the start index. + +- bpo-28247: Update :mod:`zipapp` documentation to describe how to make + standalone applications. + +- bpo-18802: Documentation changes for ipaddress. Patch by Jon Foster and + Berker Peksag. + +- bpo-27428: Update documentation to clarify that ``WindowsRegistryFinder`` + implements ``MetaPathFinder``. (Patch by Himanshu Lakhara) + +- bpo-8243: Add a note about curses.addch and curses.addstr exception + behavior when writing outside a window, or pad. + +- bpo-31432: Clarify meaning of CERT_NONE, CERT_OPTIONAL, and CERT_REQUIRED + flags for ssl.SSLContext.verify_mode. + +Tests +----- + +- bpo-33655: Ignore test_posix_fallocate failures on BSD platforms that + might be due to running on ZFS. + +- bpo-19417: Add test_bdb.py. + +Build +----- + +- bpo-5755: Move ``-Wstrict-prototypes`` option to ``CFLAGS_NODIST`` from + ``OPT``. This option emitted annoying warnings when building extension + modules written in C++. + +- bpo-33614: Ensures module definition files for the stable ABI on Windows + are correctly regenerated. + +- bpo-33522: Enable CI builds on Visual Studio Team Services at + https://python.visualstudio.com/cpython + +- bpo-33012: Add ``-Wno-cast-function-type`` for gcc 8 for silencing + warnings about function casts like casting to PyCFunction in method + definition lists. + +- bpo-33394: Enable the verbose build for extension modules, when GNU make + is passed macros on the command line. + +Windows +------- + +- bpo-33184: Update Windows installer to OpenSSL 1.0.2o. + +macOS +----- + +- bpo-33184: Update macOS installer build to use OpenSSL 1.0.2o. + +IDLE +---- + +- bpo-33656: On Windows, add API call saying that tk scales for DPI. On + Windows 8.1+ or 10, with DPI compatibility properties of the Python binary + unchanged, and a monitor resolution greater than 96 DPI, this should make + text and lines sharper. It should otherwise have no effect. + +- bpo-33768: Clicking on a context line moves that line to the top of the + editor window. + +- bpo-33763: IDLE: Use read-only text widget for code context instead of + label widget. + +- bpo-33664: Scroll IDLE editor text by lines. Previously, the mouse wheel + and scrollbar slider moved text by a fixed number of pixels, resulting in + partial lines at the top of the editor box. The change also applies to + the shell and grep output windows, but not to read-only text views. + +- bpo-33679: Enable theme-specific color configuration for Code Context. Use + the Highlights tab to see the setting for built-in themes or add settings + to custom themes. + +- bpo-33642: Display up to maxlines non-blank lines for Code Context. If + there is no current context, show a single blank line. + +- bpo-33628: IDLE: Cleanup codecontext.py and its test. + +- bpo-33564: IDLE's code context now recognizes async as a block opener. + +- bpo-29706: IDLE now colors async and await as keywords in 3.6. They become + full keywords in 3.7. + +- bpo-21474: Update word/identifier definition from ascii to unicode. In + text and entry boxes, this affects selection by double-click, movement + left/right by control-left/right, and deletion left/right by + control-BACKSPACE/DEL. + +- bpo-33204: IDLE: consistently color invalid string prefixes. A 'u' string + prefix cannot be paired with either 'r' or 'f'. Consistently color as much + of the prefix, starting at the right, as is valid. Revise and extend + colorizer test. + +- bpo-32831: Add docstrings and tests for codecontext. + +Tools/Demos +----------- + +- bpo-33189: :program:`pygettext.py` now recognizes only literal strings as + docstrings and translatable strings, and rejects bytes literals and + f-string expressions. + +- bpo-31920: Fixed handling directories as arguments in the ``pygettext`` + script. Based on patch by Oleg Krasnikov. + +- bpo-29673: Fix pystackv and pystack gdbinit macros. + +- bpo-32885: Add an ``-n`` flag for ``Tools/scripts/pathfix.py`` to disable + automatic backup creation (files with ``~`` suffix). + +- bpo-31583: Fix 2to3 for using with --add-suffix option but without + --output-dir option for relative path to files in current directory. + +C API +----- + +- bpo-32374: Document that m_traverse for multi-phase initialized modules + can be called with m_state=NULL, and add a sanity check + + +What's New in Python 3.6.5 final? +================================= + +*Release date: 2018-03-28* + +Tests +----- + +- bpo-32872: Avoid regrtest compatibility issue with namespace packages. + +Build +----- + +- bpo-33163: Upgrade pip to 9.0.3 and setuptools to v39.0.1. + + +What's New in Python 3.6.5 release candidate 1? +=============================================== + +*Release date: 2018-03-13* + +Security +-------- + +- bpo-33001: Minimal fix to prevent buffer overrun in os.symlink on Windows + +- bpo-32981: Regexes in difflib and poplib were vulnerable to catastrophic + backtracking. These regexes formed potential DOS vectors (REDOS). They + have been refactored. This resolves CVE-2018-1060 and CVE-2018-1061. Patch + by Jamie Davis. + +Core and Builtins +----------------- + +- bpo-33026: Fixed jumping out of "with" block by setting f_lineno. + +- bpo-17288: Prevent jumps from 'return' and 'exception' trace events. + +- bpo-32889: Update Valgrind suppression list to account for the rename of + ``Py_ADDRESS_IN_RANG`` to ``address_in_range``. + +- bpo-32650: Pdb and other debuggers dependent on bdb.py will correctly step + over (next command) native coroutines. Patch by Pablo Galindo. + +- bpo-32685: Improve suggestion when the Python 2 form of print statement is + either present on the same line as the header of a compound statement or + else terminated by a semi-colon instead of a newline. Patch by Nitish + Chandra. + +- bpo-32583: Fix possible crashing in builtin Unicode decoders caused by + write out-of-bound errors when using customized decode error handlers. + +- bpo-26163: Improved frozenset() hash to create more distinct hash values + when faced with datasets containing many similar values. + +- bpo-27169: The ``__debug__`` constant is now optimized out at compile + time. This fixes also bpo-22091. + +- bpo-32329: ``sys.flags.hash_randomization`` is now properly set to 0 when + hash randomization is turned off by ``PYTHONHASHSEED=0``. + +- bpo-30416: The optimizer is now protected from spending much time doing + complex calculations and consuming much memory for creating large + constants in constant folding. + +- bpo-18533: ``repr()`` on a dict containing its own ``values()`` or + ``items()`` no longer raises ``RecursionError``; OrderedDict similarly. + Instead, use ``...``, as for other recursive structures. Patch by Ben + North. + +- bpo-32028: Leading whitespace is now correctly ignored when generating + suggestions for converting Py2 print statements to Py3 builtin print + function calls. Patch by Sanyam Khurana. + +- bpo-32137: The repr of deeply nested dict now raises a RecursionError + instead of crashing due to a stack overflow. + +Library +------- + +- bpo-33064: lib2to3 now properly supports trailing commas after ``*args`` + and ``**kwargs`` in function signatures. + +- bpo-31804: Avoid failing in multiprocessing.Process if the standard + streams are closed or None at exit. + +- bpo-33037: Skip sending/receiving data after SSL transport closing. + +- bpo-30353: Fix ctypes pass-by-value for structs on 64-bit Cygwin/MinGW. + +- bpo-33009: Fix inspect.signature() for single-parameter partialmethods. + +- bpo-32969: Expose several missing constants in zlib and fix corresponding + documentation. + +- bpo-32713: Fixed tarfile.itn handling of out-of-bounds float values. Patch + by Joffrey Fuhrer. + +- bpo-30622: The ssl module now detects missing NPN support in LibreSSL. + +- bpo-32922: dbm.open() now encodes filename with the filesystem encoding + rather than default encoding. + +- bpo-32859: In ``os.dup2``, don't check every call whether the ``dup3`` + syscall exists or not. + +- bpo-21060: Rewrite confusing message from setup.py upload from "No dist + file created in earlier command" to the more helpful "Must create and + upload files in one command". + +- bpo-32857: In :mod:`tkinter`, ``after_cancel(None)`` now raises a + :exc:`ValueError` instead of canceling the first scheduled function. + Patch by Cheryl Sabella. + +- bpo-32852: Make sure sys.argv remains as a list when running trace. + +- bpo-32841: Fixed `asyncio.Condition` issue which silently ignored + cancellation after notifying and cancelling a conditional lock. Patch by + Bar Harel. + +- bpo-31787: Fixed refleaks of ``__init__()`` methods in various modules. + (Contributed by Oren Milman) + +- bpo-30157: Fixed guessing quote and delimiter in csv.Sniffer.sniff() when + only the last field is quoted. Patch by Jake Davis. + +- bpo-32394: socket: Remove TCP_FASTOPEN, TCP_KEEPCNT flags on older version + Windows during run-time. + +- bpo-32777: Fix a rare but potential pre-exec child process deadlock in + subprocess on POSIX systems when marking file descriptors inheritable on + exec in the child process. This bug appears to have been introduced in + 3.4. + +- bpo-32647: The ctypes module used to depend on indirect linking for + dlopen. The shared extension is now explicitly linked against libdl on + platforms with dl. + +- bpo-32734: Fixed ``asyncio.Lock()`` safety issue which allowed acquiring + and locking the same lock multiple times, without it being free. Patch by + Bar Harel. + +- bpo-32727: Do not include name field in SMTP envelope from address. Patch + by Stéphane Wirtel + +- bpo-27931: Fix email address header parsing error when the username is an + empty quoted string. Patch by Xiang Zhang. + +- bpo-32304: distutils' upload command no longer corrupts tar files ending + with a CR byte, and no longer tries to convert CR to CRLF in any of the + upload text fields. + +- bpo-32502: uuid.uuid1 no longer raises an exception if a 64-bit hardware + address is encountered. + +- bpo-31848: Fix the error handling in Aifc_read.initfp() when the SSND + chunk is not found. Patch by Zackery Spytz. + +- bpo-32555: On FreeBSD and Solaris, os.strerror() now always decode the + byte string from the current locale encoding, rather than using + ASCII/surrogateescape in some cases. + +- bpo-32521: The nis module is now compatible with new libnsl and headers + location. + +- bpo-32473: Improve ABCMeta._dump_registry() output readability + +- bpo-32521: glibc has removed Sun RPC. Use replacement libtirpc headers and + library in nis module. + +- bpo-32228: Ensure that ``truncate()`` preserves the file position (as + reported by ``tell()``) after writes longer than the buffer size. + +- bpo-26133: Don't unsubscribe signals in asyncio UNIX event loop on + interpreter shutdown. + +- bpo-32185: The SSL module no longer sends IP addresses in SNI TLS + extension on platforms with OpenSSL 1.0.2+ or inet_pton. + +- bpo-32323: :func:`urllib.parse.urlsplit()` does not convert zone-id + (scope) to lower case for scoped IPv6 addresses in hostnames now. + +- bpo-32302: Fix bdist_wininst of distutils for CRT v142: it binary + compatible with CRT v140. + +- bpo-32255: A single empty field is now always quoted when written into a + CSV file. This allows to distinguish an empty row from a row consisting of + a single empty field. Patch by Licht Takeuchi. + +- bpo-32277: Raise ``NotImplementedError`` instead of ``SystemError`` on + platforms where ``chmod(..., follow_symlinks=False)`` is not supported. + Patch by Anthony Sottile. + +- bpo-32199: The getnode() ip getter now uses 'ip link' instead of 'ip link + list'. + +- bpo-27456: Ensure TCP_NODELAY is set on Linux. Tests by Victor Stinner. + +- bpo-31900: The :func:`locale.localeconv` function now sets temporarily the + ``LC_CTYPE`` locale to the ``LC_NUMERIC`` locale to decode + ``decimal_point`` and ``thousands_sep`` byte strings if they are non-ASCII + or longer than 1 byte, and the ``LC_NUMERIC`` locale is different than the + ``LC_CTYPE`` locale. This temporary change affects other threads. Same + change for the :meth:`str.format` method when formatting a number + (:class:`int`, :class:`float`, :class:`float` and subclasses) with the + ``n`` type (ex: ``'{:n}'.format(1234)``). + +- bpo-31802: Importing native path module (``posixpath``, ``ntpath``) now + works even if the ``os`` module still is not imported. + +Documentation +------------- + +- bpo-17232: Clarify docs for -O and -OO. Patch by Terry Reedy. + +- bpo-32800: Update link to w3c doc for xml default namespaces. + +- bpo-8722: Document :meth:`__getattr__` behavior when property :meth:`get` + method raises :exc:`AttributeError`. + +- bpo-32614: Modify RE examples in documentation to use raw strings to + prevent :exc:`DeprecationWarning` and add text to REGEX HOWTO to highlight + the deprecation. + +- bpo-31972: Improve docstrings for `pathlib.PurePath` subclasses. + +- bpo-17799: Explain real behaviour of sys.settrace and sys.setprofile and + their C-API counterparts regarding which type of events are received in + each function. Patch by Pablo Galindo Salgado. + +Tests +----- + +- bpo-32517: Fix failing ``test_asyncio`` on macOS 10.12.2+ due to transport + of ``KqueueSelector`` loop was not being closed. + +- bpo-32721: Fix test_hashlib to not fail if the _md5 module is not built. + +- bpo-32252: Fix faulthandler_suppress_crash_report() used to prevent core + dump files when testing crashes. getrlimit() returns zero on success. + +- bpo-31518: Debian Unstable has disabled TLS 1.0 and 1.1 for + SSLv23_METHOD(). Change TLS/SSL protocol of some tests to PROTOCOL_TLS or + PROTOCOL_TLSv1_2 to make them pass on Debian. + +Build +----- + +- bpo-32635: Fix segfault of the crypt module when libxcrypt is provided + instead of libcrypt at the system. + +Windows +------- + +- bpo-33016: Fix potential use of uninitialized memory in + nt._getfinalpathname + +- bpo-32903: Fix a memory leak in os.chdir() on Windows if the current + directory is set to a UNC path. + +- bpo-31966: Fixed WindowsConsoleIO.write() for writing empty data. + +- bpo-32409: Ensures activate.bat can handle Unicode contents. + +- bpo-32457: Improves handling of denormalized executable path when + launching Python. + +- bpo-32370: Use the correct encoding for ipconfig output in the uuid + module. Patch by Segev Finer. + +- bpo-29248: Fix :func:`os.readlink` on Windows, which was mistakenly + treating the ``PrintNameOffset`` field of the reparse data buffer as a + number of characters instead of bytes. Patch by Craig Holmquist and SSE4. + +- bpo-32588: Create standalone _distutils_findvs module. + +macOS +----- + +- bpo-32726: Provide an additional, more modern macOS installer variant that + supports macOS 10.9+ systems in 64-bit mode only. Upgrade the supplied + third-party libraries to OpenSSL 1.0.2n, XZ 5.2.3, and SQLite 3.22.0. The + 10.9+ installer now links with and supplies its own copy of Tcl/Tk 8.6.8. + +IDLE +---- + +- bpo-32984: Set ``__file__`` while running a startup file. Like Python, + IDLE optionally runs one startup file in the Shell window before + presenting the first interactive input prompt. For IDLE, ``-s`` runs a + file named in environmental variable :envvar:`IDLESTARTUP` or + :envvar:`PYTHONSTARTUP`; ``-r file`` runs ``file``. Python sets + ``__file__`` to the startup file name before running the file and unsets + it before the first prompt. IDLE now does the same when run normally, + without the ``-n`` option. + +- bpo-32940: Simplify and rename StringTranslatePseudoMapping in pyparse. + +- bpo-32916: Change ``str`` to ``code`` in pyparse. + +- bpo-32905: Remove unused code in pyparse module. + +- bpo-32874: Add tests for pyparse. + +- bpo-32837: Using the system and place-dependent default encoding for + open() is a bad idea for IDLE's system and location-independent files. + +- bpo-32826: Add "encoding=utf-8" to open() in IDLE's test_help_about. GUI + test test_file_buttons() only looks at initial ascii-only lines, but + failed on systems where open() defaults to 'ascii' because readline() + internally reads and decodes far enough ahead to encounter a non-ascii + character in CREDITS.txt. + +- bpo-32765: Update configdialog General tab docstring to add new widgets to + the widget list. + +Tools/Demos +----------- + +- bpo-24960: 2to3 and lib2to3 can now read pickled grammar files using + pkgutil.get_data() rather than probing the filesystem. This lets 2to3 and + lib2to3 work when run from a zipfile. + +- bpo-32222: Fix pygettext not extracting docstrings for functions with type + annotated arguments. Patch by Toby Harradine. + +C API +----- + +- bpo-29084: Undocumented C API for OrderedDict has been excluded from the + limited C API. It was added by mistake and actually never worked in the + limited C API. + + +What's New in Python 3.6.4 final? +================================= + +*Release date: 2017-12-18* + +There were no new code changes in version 3.6.4 since v3.6.4rc1. + + + +What's New in Python 3.6.4 release candidate 1? +=============================================== + +*Release date: 2017-12-05* + +Core and Builtins +----------------- + +- bpo-32176: co_flags.CO_NOFREE is now always set correctly by the code + object constructor based on freevars and cellvars, rather than needing to + be set correctly by the caller. This ensures it will be cleared + automatically when additional cell references are injected into a modified + code object and function. + +- bpo-31949: Fixed several issues in printing tracebacks + (PyTraceBack_Print()). Setting sys.tracebacklimit to 0 or less now + suppresses printing tracebacks. Setting sys.tracebacklimit to None now + causes using the default limit. Setting sys.tracebacklimit to an integer + larger than LONG_MAX now means using the limit LONG_MAX rather than the + default limit. Fixed integer overflows in the case of more than 2**31 + traceback items on Windows. Fixed output errors handling. + +- bpo-30696: Fix the interactive interpreter looping endlessly when no + memory. + +- bpo-20047: Bytearray methods partition() and rpartition() now accept only + bytes-like objects as separator, as documented. In particular they now + raise TypeError rather of returning a bogus result when an integer is + passed as a separator. + +- bpo-31852: Fix a segmentation fault caused by a combination of the async + soft keyword and continuation lines. + +- bpo-21720: BytesWarning no longer emitted when the *fromlist* argument of + ``__import__()`` or the ``__all__`` attribute of the module contain bytes + instances. + +- bpo-31825: Fixed OverflowError in the 'unicode-escape' codec and in + codecs.escape_decode() when decode an escaped non-ascii byte. + +- bpo-28603: Print the full context/cause chain of exceptions on interpreter + exit, even if an exception in the chain is unhashable or compares equal to + later ones. Patch by Zane Bitter. + +- bpo-31786: Fix timeout rounding in the select module to round correctly + negative timeouts between -1.0 and 0.0. The functions now block waiting + for events as expected. Previously, the call was incorrectly non-blocking. + Patch by Pablo Galindo. + +- bpo-31642: Restored blocking "from package import module" by setting + sys.modules["package.module"] to None. + +- bpo-31626: Fixed a bug in debug memory allocator. There was a write to + freed memory after shrinking a memory block. + +- bpo-31619: Fixed a ValueError when convert a string with large number of + underscores to integer with binary base. + +- bpo-31592: Fixed an assertion failure in Python parser in case of a bad + `unicodedata.normalize()`. Patch by Oren Milman. + +- bpo-31588: Raise a `TypeError` with a helpful error message when class + creation fails due to a metaclass with a bad ``__prepare__()`` method. + Patch by Oren Milman. + +- bpo-31566: Fix an assertion failure in `_warnings.warn()` in case of a bad + ``__name__`` global. Patch by Oren Milman. + +- bpo-31505: Fix an assertion failure in `json`, in case + `_json.make_encoder()` received a bad `encoder()` argument. Patch by Oren + Milman. + +- bpo-31492: Fix assertion failures in case of failing to import from a + module with a bad ``__name__`` attribute, and in case of failing to access + an attribute of such a module. Patch by Oren Milman. + +- bpo-31490: Fix an assertion failure in `ctypes` class definition, in case + the class has an attribute whose name is specified in ``_anonymous_`` but + not in ``_fields_``. Patch by Oren Milman. + +- bpo-31478: Fix an assertion failure in `_random.Random.seed()` in case the + argument has a bad ``__abs__()`` method. Patch by Oren Milman. + +- bpo-31315: Fix an assertion failure in imp.create_dynamic(), when + spec.name is not a string. Patch by Oren Milman. + +- bpo-31311: Fix a crash in the ``__setstate__()`` method of + `ctypes._CData`, in case of a bad ``__dict__``. Patch by Oren Milman. + +- bpo-31293: Fix crashes in true division and multiplication of a timedelta + object by a float with a bad as_integer_ratio() method. Patch by Oren + Milman. + +- bpo-31285: Fix an assertion failure in `warnings.warn_explicit`, when the + return value of the received loader's get_source() has a bad splitlines() + method. Patch by Oren Milman. + +- bpo-30817: `PyErr_PrintEx()` clears now the ignored exception that may be + raised by `_PySys_SetObjectId()`, for example when no memory. + +Library +------- + +- bpo-28556: Two minor fixes for ``typing`` module: allow shallow copying + instances of generic classes, improve interaction of ``__init_subclass__`` + with generics. Original PRs by Ivan Levkivskyi. + +- bpo-27240: The header folding algorithm for the new email policies has + been rewritten, which also fixes bpo-30788, bpo-31831, and bpo-32182. In + particular, RFC2231 folding is now done correctly. + +- bpo-32186: io.FileIO.readall() and io.FileIO.read() now release the GIL + when getting the file size. Fixed hang of all threads with inaccessible + NFS server. Patch by Nir Soffer. + +- bpo-12239: Make :meth:`msilib.SummaryInformation.GetProperty` return + ``None`` when the value of property is ``VT_EMPTY``. Initial patch by + Mark Mc Mahon. + +- bpo-31325: Fix wrong usage of :func:`collections.namedtuple` in the + :meth:`RobotFileParser.parse() ` + method. Initial patch by Robin Wellner. + +- bpo-12382: :func:`msilib.OpenDatabase` now raises a better exception + message when it couldn't open or create an MSI file. Initial patch by + William Tisäter. + +- bpo-32110: ``codecs.StreamReader.read(n)`` now returns not more than *n* + characters/bytes for non-negative *n*. This makes it compatible with + ``read()`` methods of other file-like objects. + +- bpo-32072: Fixed issues with binary plists: Fixed saving bytearrays. + Identical objects will be saved only once. Equal references will be load + as identical objects. Added support for saving and loading recursive data + structures. + +- bpo-32034: Make asyncio.IncompleteReadError and LimitOverrunError + pickleable. + +- bpo-32015: Fixed the looping of asyncio in the case of reconnection the + socket during waiting async read/write from/to the socket. + +- bpo-32011: Restored support of loading marshal files with the TYPE_INT64 + code. These files can be produced in Python 2.7. + +- bpo-31970: Reduce performance overhead of asyncio debug mode. + +- bpo-9678: Fixed determining the MAC address in the uuid module: Using + ifconfig on NetBSD and OpenBSD. Using arp on Linux, FreeBSD, NetBSD and + OpenBSD. Based on patch by Takayuki Shimizukawa. + +- bpo-30057: Fix potential missed signal in signal.signal(). + +- bpo-31933: Fix Blake2 params leaf_size and node_offset on big endian + platforms. Patch by Jack O'Connor. + +- bpo-31927: Fixed compilation of the socket module on NetBSD 8. Fixed + assertion failure or reading arbitrary data when parse a AF_BLUETOOTH + address on NetBSD and DragonFly BSD. + +- bpo-27666: Fixed stack corruption in curses.box() and curses.ungetmouse() + when the size of types chtype or mmask_t is less than the size of C long. + curses.box() now accepts characters as arguments. Based on patch by Steve + Fink. + +- bpo-31897: plistlib now catches more errors when read binary plists and + raises InvalidFileException instead of unexpected exceptions. + +- bpo-25720: Fix the method for checking pad state of curses WINDOW. Patch + by Masayuki Yamamoto. + +- bpo-31893: Fixed the layout of the kqueue_event structure on OpenBSD and + NetBSD. Fixed the comparison of the kqueue_event objects. + +- bpo-31891: Fixed building the curses module on NetBSD. + +- bpo-28416: Instances of pickle.Pickler subclass with the persistent_id() + method and pickle.Unpickler subclass with the persistent_load() method no + longer create reference cycles. + +- bpo-28326: Fix multiprocessing.Process when stdout and/or stderr is closed + or None. + +- bpo-31457: If nested log adapters are used, the inner ``process()`` + methods are no longer omitted. + +- bpo-31457: The ``manager`` property on LoggerAdapter objects is now + properly settable. + +- bpo-31806: Fix timeout rounding in time.sleep(), threading.Lock.acquire() + and socket.socket.settimeout() to round correctly negative timeouts + between -1.0 and 0.0. The functions now block waiting for events as + expected. Previously, the call was incorrectly non-blocking. Patch by + Pablo Galindo. + +- bpo-28603: traceback: Fix a TypeError that occurred during printing of + exception tracebacks when either the current exception or an exception in + its context/cause chain is unhashable. Patch by Zane Bitter. + +- bpo-30058: Fixed buffer overflow in select.kqueue.control(). + +- bpo-31770: Prevent a crash when calling the ``__init__()`` method of a + ``sqlite3.Cursor`` object more than once. Patch by Oren Milman. + +- bpo-31672: ``idpattern`` in ``string.Template`` matched some non-ASCII + characters. Now it uses ``-i`` regular expression local flag to avoid + non-ASCII characters. + +- bpo-31764: Prevent a crash in ``sqlite3.Cursor.close()`` in case the + ``Cursor`` object is uninitialized. Patch by Oren Milman. + +- bpo-31752: Fix possible crash in timedelta constructor called with custom + integers. + +- bpo-31701: On Windows, faulthandler.enable() now ignores MSC and COM + exceptions. + +- bpo-31728: Prevent crashes in `_elementtree` due to unsafe cleanup of + `Element.text` and `Element.tail`. Patch by Oren Milman. + +- bpo-31620: an empty asyncio.Queue now doesn't leak memory when queue.get + pollers timeout + +- bpo-31632: Fix method set_protocol() of class _SSLProtocolTransport in + asyncio module. This method was previously modifying a wrong reference to + the protocol. + +- bpo-31675: Fixed memory leaks in Tkinter's methods splitlist() and split() + when pass a string larger than 2 GiB. + +- bpo-31673: Fixed typo in the name of Tkinter's method adderrorinfo(). + +- bpo-30806: Fix the string representation of a netrc object. + +- bpo-15037: Added a workaround for getkey() in curses for ncurses 5.7 and + earlier. + +- bpo-25351: Avoid venv activate failures with undefined variables + +- bpo-25532: inspect.unwrap() will now only try to unwrap an object + sys.getrecursionlimit() times, to protect against objects which create a + new object on every attribute access. + +- bpo-30347: Stop crashes when concurrently iterate over itertools.groupby() + iterators. + +- bpo-31516: ``threading.current_thread()`` should not return a dummy thread + at shutdown. + +- bpo-31351: python -m ensurepip now exits with non-zero exit code if pip + bootstrapping has failed. + +- bpo-31482: ``random.seed()`` now works with bytes in version=1 + +- bpo-31334: Fix ``poll.poll([timeout])`` in the ``select`` module for + arbitrary negative timeouts on all OSes where it can only be a + non-negative integer or -1. Patch by Riccardo Coccioli. + +- bpo-31310: multiprocessing's semaphore tracker should be launched again if + crashed. + +- bpo-31308: Make multiprocessing's forkserver process immune to Ctrl-C and + other user interruptions. If it crashes, restart it when necessary. + +Documentation +------------- + +- bpo-32105: Added asyncio.BaseEventLoop.connect_accepted_socket + versionadded marker. + +- bpo-31537: Fix incorrect usage of ``get_history_length`` in readline + documentation example code. Patch by Brad Smith. + +- bpo-30085: The operator functions without double underscores are preferred + for clarity. The one with underscores are only kept for + back-compatibility. + +Tests +----- + +- bpo-31380: Skip test_httpservers test_undecodable_file on macOS: fails on + APFS. + +- bpo-31705: Skip test_socket.test_sha256() on Linux kernel older than 4.5. + The test fails with ENOKEY on kernel 3.10 (on ppc64le). A fix was merged + into the kernel 4.5. + +- bpo-31174: Fix test_tools.test_unparse: DirectoryTestCase now stores the + names sample to always test the same files. It prevents false alarms when + hunting reference leaks. + +- bpo-30695: Add the `set_nomemory(start, stop)` and `remove_mem_hooks()` + functions to the _testcapi module. + +Build +----- + +- bpo-32059: ``detect_modules()`` in ``setup.py`` now also searches the + sysroot paths when cross-compiling. + +- bpo-31957: Fixes Windows SDK version detection when building for Windows. + +- bpo-31609: Fixes quotes in PCbuild/clean.bat + +- bpo-31934: Abort the build when building out of a not clean source tree. + +- bpo-31926: Fixed Argument Clinic sometimes causing compilation errors when + there was more than one function and/or method in a .c file with the same + name. + +- bpo-28791: Update Windows builds to use SQLite 3.21.0. + +- bpo-28791: Update OS X installer to use SQLite 3.21.0. + +- bpo-22140: Prevent double substitution of prefix in python-config.sh. + +- bpo-31536: Avoid wholesale rebuild after `make regen-all` if nothing + changed. + +Windows +------- + +- bpo-1102: Return ``None`` when ``View.Fetch()`` returns + ``ERROR_NO_MORE_ITEMS`` instead of raising ``MSIError``. Initial patch by + Anthony Tuininga. + +- bpo-31944: Fixes Modify button in Apps and Features dialog. + +macOS +----- + +- bpo-31392: Update macOS installer to use OpenSSL 1.0.2m + +IDLE +---- + +- bpo-32207: Improve tk event exception tracebacks in IDLE. When tk event + handling is driven by IDLE's run loop, a confusing and distracting + queue.EMPTY traceback context is no longer added to tk event exception + tracebacks. The traceback is now the same as when event handling is + driven by user code. Patch based on a suggestion by Serhiy Storchaka. + +- bpo-32164: Delete unused file idlelib/tabbedpages.py. Use of TabbedPageSet + in configdialog was replaced by ttk.Notebook. + +- bpo-32100: IDLE: Fix old and new bugs in pathbrowser; improve tests. Patch + mostly by Cheryl Sabella. + +- bpo-31858: IDLE -- Restrict shell prompt manipulation to the shell. Editor + and output windows only see an empty last prompt line. This simplifies + the code and fixes a minor bug when newline is inserted. Sys.ps1, if + present, is read on Shell start-up, but is not set or changed. + +- bpo-31860: The font sample in the IDLE configuration dialog is now + editable. Changes persist while IDLE remains open + +- bpo-31836: Test_code_module now passes if run after test_idle, which sets + ps1. The code module uses sys.ps1 if present or sets it to '>>> ' if not. + Test_code_module now properly tests both behaviors. Ditto for ps2. + +- bpo-28603: Fix a TypeError that caused a shell restart when printing a + traceback that includes an exception that is unhashable. Patch by Zane + Bitter. + +- bpo-13802: Use non-Latin characters in the IDLE's Font settings sample. + Even if one selects a font that defines a limited subset of the unicode + Basic Multilingual Plane, tcl/tk will use other fonts that define a + character. The expanded example give users of non-Latin characters a + better idea of what they might see in IDLE's shell and editors. To make + room for the expanded sample, frames on the Font tab are re-arranged. The + Font/Tabs help explains a bit about the additions. + +- bpo-31460: Simplify the API of IDLE's Module Browser. Passing a widget + instead of an flist with a root widget opens the option of creating a + browser frame that is only part of a window. Passing a full file name + instead of pieces assumed to come from a .py file opens the possibility of + browsing python files that do not end in .py. + +- bpo-31649: IDLE - Make _htest, _utest parameters keyword only. + +- bpo-31559: Remove test order dependence in idle_test.test_browser. + +- bpo-31459: Rename IDLE's module browser from Class Browser to Module + Browser. The original module-level class and method browser became a + module browser, with the addition of module-level functions, years ago. + Nested classes and functions were added yesterday. For + back-compatibility, the virtual event <>, which + appears on the Keys tab of the Settings dialog, is not changed. Patch by + Cheryl Sabella. + +- bpo-31500: Default fonts now are scaled on HiDPI displays. + +- bpo-1612262: IDLE module browser now shows nested classes and functions. + Original patches for code and tests by Guilherme Polo and Cheryl Sabella, + respectively. + +Tools/Demos +----------- + +- bpo-30722: Make redemo work with Python 3.6 and newer versions. Also, + remove the ``LOCALE`` option since it doesn't work with string patterns in + Python 3. Patch by Christoph Sarnowski. + +C API +----- + +- bpo-20891: Fix PyGILState_Ensure(). When PyGILState_Ensure() is called in + a non-Python thread before PyEval_InitThreads(), only call + PyEval_InitThreads() after calling PyThreadState_New() to fix a crash. + +- bpo-31532: Fix memory corruption due to allocator mix in getpath.c between + Py_GetPath() and Py_SetPath() + +- bpo-30697: The `PyExc_RecursionErrorInst` singleton is removed and + `PyErr_NormalizeException()` does not use it anymore. This singleton is + persistent and its members being never cleared may cause a segfault during + finalization of the interpreter. See also issue #22898. + + +What's New in Python 3.6.3 final? +================================= + +*Release date: 2017-10-03* + +Library +------- + +- bpo-31641: Re-allow arbitrary iterables in + `concurrent.futures.as_completed()`. Fixes regression in 3.6.3rc1. + +Build +----- + +- bpo-31662: Fix typos in Windows ``uploadrelease.bat`` script. Fix Windows + Doc build issues in ``Doc/make.bat``. + +- bpo-31423: Fix building the PDF documentation with newer versions of + Sphinx. + + +What's New in Python 3.6.3 release candidate 1? +=============================================== + +*Release date: 2017-09-18* + +Security +-------- + +- bpo-29781: SSLObject.version() now correctly returns None when handshake + over BIO has not been performed yet. + +- bpo-30947: Upgrade libexpat embedded copy from version 2.2.1 to 2.2.3 to + get security fixes. + +Core and Builtins +----------------- + +- bpo-31471: Fix an assertion failure in `subprocess.Popen()` on Windows, in + case the env argument has a bad keys() method. Patch by Oren Milman. + +- bpo-31418: Fix an assertion failure in `PyErr_WriteUnraisable()` in case + of an exception with a bad ``__module__`` attribute. Patch by Oren Milman. + +- bpo-31416: Fix assertion failures in case of a bad warnings.filters or + warnings.defaultaction. Patch by Oren Milman. + +- bpo-31411: Raise a TypeError instead of SystemError in case + warnings.onceregistry is not a dictionary. Patch by Oren Milman. + +- bpo-31373: Fix several possible instances of undefined behavior due to + floating-point demotions. + +- bpo-30465: Location information (``lineno`` and ``col_offset``) in + f-strings is now (mostly) correct. This fixes tools like flake8 from + showing warnings on the wrong line (typically the first line of the file). + +- bpo-31343: Include sys/sysmacros.h for major(), minor(), and makedev(). + GNU C libray plans to remove the functions from sys/types.h. + +- bpo-31291: Fix an assertion failure in `zipimport.zipimporter.get_data` on + Windows, when the return value of ``pathname.replace('/','\\')`` isn't a + string. Patch by Oren Milman. + +- bpo-31271: Fix an assertion failure in the write() method of + `io.TextIOWrapper`, when the encoder doesn't return a bytes object. Patch + by Oren Milman. + +- bpo-31243: Fix a crash in some methods of `io.TextIOWrapper`, when the + decoder's state is invalid. Patch by Oren Milman. + +- bpo-30721: ``print`` now shows correct usage hint for using Python 2 + redirection syntax. Patch by Sanyam Khurana. + +- bpo-31070: Fix a race condition in importlib _get_module_lock(). + +- bpo-31095: Fix potential crash during GC caused by ``tp_dealloc`` which + doesn't call ``PyObject_GC_UnTrack()``. + +- bpo-31071: Avoid masking original TypeError in call with * unpacking when + other arguments are passed. + +- bpo-30978: str.format_map() now passes key lookup exceptions through. + Previously any exception was replaced with a KeyError exception. + +- bpo-30808: Use _Py_atomic API for concurrency-sensitive signal state. + +- bpo-30876: Relative import from unloaded package now reimports the package + instead of failing with SystemError. Relative import from non-package now + fails with ImportError rather than SystemError. + +- bpo-30703: Improve signal delivery. Avoid using Py_AddPendingCall from + signal handler, to avoid calling signal-unsafe functions. The tests I'm + adding here fail without the rest of the patch, on Linux and OS X. This + means our signal delivery logic had defects (some signals could be lost). + +- bpo-30765: Avoid blocking in pthread_mutex_lock() when + PyThread_acquire_lock() is asked not to block. + +- bpo-31161: Make sure the 'Missing parentheses' syntax error message is + only applied to SyntaxError, not to subclasses. Patch by Martijn Pieters. + +- bpo-30814: Fixed a race condition when import a submodule from a package. + +- bpo-30597: ``print`` now shows expected input in custom error message when + used as a Python 2 statement. Patch by Sanyam Khurana. + +Library +------- + +- bpo-31499: xml.etree: Fix a crash when a parser is part of a reference + cycle. + +- bpo-28556: typing.get_type_hints now finds the right globalns for classes + and modules by default (when no ``globalns`` was specified by the caller). + +- bpo-28556: Speed improvements to the ``typing`` module. Original PRs by + Ivan Levkivskyi and Mitar. + +- bpo-31544: The C accelerator module of ElementTree ignored exceptions + raised when looking up TreeBuilder target methods in XMLParser(). + +- bpo-31234: socket.create_connection() now fixes manually a reference + cycle: clear the variable storing the last exception on success. + +- bpo-31457: LoggerAdapter objects can now be nested. + +- bpo-31400: Improves SSL error handling to avoid losing error numbers. + +- bpo-28958: ssl.SSLContext() now uses OpenSSL error information when a + context cannot be instantiated. + +- bpo-27340: SSLSocket.sendall() now uses memoryview to create slices of + data. This fixes support for all bytes-like object. It is also more + efficient and avoids costly copies. + +- bpo-31178: Fix string concatenation bug in rare error path in the + subprocess module + +- bpo-31350: Micro-optimize :func:`asyncio._get_running_loop` to become up + to 10% faster. + +- bpo-31170: expat: Update libexpat from 2.2.3 to 2.2.4. Fix copying of + partial characters for UTF-8 input (libexpat bug 115): + https://github.com/libexpat/libexpat/issues/115 + +- bpo-29136: Add TLS 1.3 cipher suites and OP_NO_TLSv1_3. + +- bpo-29212: Fix concurrent.futures.thread.ThreadPoolExecutor threads to + have a non repr() based thread name by default when no thread_name_prefix + is supplied. They will now identify themselves as + "ThreadPoolExecutor-y_n". + +- bpo-9146: Fix a segmentation fault in _hashopenssl when standard hash + functions such as md5 are not available in the linked OpenSSL library. As + in some special FIPS-140 build environments. + +- bpo-27144: The ``map()`` and ``as_completed()`` iterators in + ``concurrent.futures`` now avoid keeping a reference to yielded objects. + +- bpo-10746: Fix ctypes producing wrong :pep:`3118` type codes for integer + types. + +- bpo-22536: The subprocess module now sets the filename when + FileNotFoundError is raised on POSIX systems due to the executable or cwd + not being found. + +- bpo-31249: concurrent.futures: WorkItem.run() used by ThreadPoolExecutor + now breaks a reference cycle between an exception object and the WorkItem + object. + +- bpo-31247: xmlrpc.server now explicitly breaks reference cycles when using + sys.exc_info() in code handling exceptions. + +- bpo-30102: The ssl and hashlib modules now call + OPENSSL_add_all_algorithms_noconf() on OpenSSL < 1.1.0. The function + detects CPU features and enables optimizations on some CPU architectures + such as POWER8. Patch is based on research from Gustavo Serra Scalet. + +- bpo-31185: Fixed miscellaneous errors in asyncio speedup module. + +- bpo-31135: ttk: fix the destroy() method of LabeledScale and OptionMenu + classes. Call the parent destroy() method even if the used attribute + doesn't exist. The LabeledScale.destroy() method now also explicitly + clears label and scale attributes to help the garbage collector to destroy + all widgets. + +- bpo-31107: Fix `copyreg._slotnames()` mangled attribute calculation for + classes whose name begins with an underscore. Patch by Shane Harvey. + +- bpo-31061: Fixed a crash when using asyncio and threads. + +- bpo-30502: Fix handling of long oids in ssl. Based on patch by Christian + Heimes. + +- bpo-30119: ftplib.FTP.putline() now throws ValueError on commands that + contains CR or LF. Patch by Dong-hee Na. + +- bpo-30595: multiprocessing.Queue.get() with a timeout now polls its reader + in non-blocking mode if it succeeded to acquire the lock but the acquire + took longer than the timeout. + +- bpo-29403: Fix ``unittest.mock``'s autospec to not fail on method-bound + builtin functions. Patch by Aaron Gallagher. + +- bpo-30961: Fix decrementing a borrowed reference in tracemalloc. + +- bpo-25684: Change ``ttk.OptionMenu`` radiobuttons to be unique across + instances of ``OptionMenu``. + +- bpo-30886: Fix multiprocessing.Queue.join_thread(): it now waits until the + thread completes, even if the thread was started by the same process which + created the queue. + +- bpo-29854: Fix segfault in readline when using readline's history-size + option. Patch by Nir Soffer. + +- bpo-30319: socket.close() now ignores ECONNRESET error. + +- bpo-30828: Fix out of bounds write in + `asyncio.CFuture.remove_done_callback()`. + +- bpo-30807: signal.setitimer() may disable the timer when passed a tiny + value. Tiny values (such as 1e-6) are valid non-zero values for + setitimer(), which is specified as taking microsecond-resolution + intervals. However, on some platform, our conversion routine could convert + 1e-6 into a zero interval, therefore disabling the timer instead of + (re-)scheduling it. + +- bpo-30441: Fix bug when modifying os.environ while iterating over it + +- bpo-30532: Fix email header value parser dropping folding white space in + certain cases. + +- bpo-30879: os.listdir() and os.scandir() now emit bytes names when called + with bytes-like argument. + +- bpo-30746: Prohibited the '=' character in environment variable names in + ``os.putenv()`` and ``os.spawn*()``. + +- bpo-29755: Fixed the lgettext() family of functions in the gettext module. + They now always return bytes. + +Documentation +------------- + +- bpo-31294: Fix incomplete code snippet in the ZeroMQSocketListener and + ZeroMQSocketHandler examples and adapt them to Python 3. + +- bpo-21649: Add RFC 7525 and Mozilla server side TLS links to SSL + documentation. + +- bpo-30803: Clarify doc on truth value testing. Original patch by Peter + Thomassen. + +Tests +----- + +- bpo-31320: Silence traceback in test_ssl + +- bpo-25674: Remove sha256.tbs-internet.com ssl test + +- bpo-30715: Address ALPN callback changes for OpenSSL 1.1.0f. The latest + version behaves like OpenSSL 1.0.2 and no longer aborts handshake. + +- bpo-30822: regrtest: Exclude tzdata from regrtest --all. When running the + test suite using --use=all / -u all, exclude tzdata since it makes + test_datetime too slow (15-20 min on some buildbots) which then times out + on some buildbots. Fix also regrtest command line parser to allow passing + -u extralargefile to run test_zipfile64. + +Build +----- + +- bpo-30854: Fix compile error when compiling --without-threads. Patch by + Masayuki Yamamoto. + +Windows +------- + +- bpo-30389: Adds detection of Visual Studio 2017 to distutils on Windows. + +- bpo-31340: Change to building with MSVC v141 (included with Visual Studio + 2017) + +- bpo-30581: os.cpu_count() now returns the correct number of processors on + Windows when the number of logical processors is greater than 64. + +- bpo-30731: Add a missing xmlns to python.manifest so that it matches the + schema. + +IDLE +---- + +- bpo-31493: IDLE code context -- fix code update and font update timers. + Canceling timers prevents a warning message when test_idle completes. + +- bpo-31488: IDLE - Update non-key options in former extension classes. When + applying configdialog changes, call .reload for each feature class. Change + ParenMatch so updated options affect existing instances attached to + existing editor windows. + +- bpo-31477: IDLE - Improve rstrip entry in doc. Strip trailing whitespace + strips more than blank spaces. Multiline string literals are not skipped. + +- bpo-31480: IDLE - make tests pass with zzdummy extension disabled by + default. + +- bpo-31421: Document how IDLE runs tkinter programs. IDLE calls tcl/tk + update in the background in order to make live interaction and + experimentation with tkinter applications much easier. + +- bpo-31414: IDLE -- fix tk entry box tests by deleting first. Adding to an + int entry is not the same as deleting and inserting because int('') will + fail. + +- bpo-31051: Rearrange IDLE configdialog GenPage into Window, Editor, and + Help sections. + +- bpo-30617: IDLE - Add docstrings and tests for outwin subclass of editor. + Move some data and functions from the class to module level. Patch by + Cheryl Sabella. + +- bpo-31287: IDLE - Do not modify tkinter.message in test_configdialog. + +- bpo-27099: Convert IDLE's built-in 'extensions' to regular features. About + 10 IDLE features were implemented as supposedly optional extensions. Their + different behavior could be confusing or worse for users and not good for + maintenance. Hence the conversion. The main difference for users is that + user configurable key bindings for builtin features are now handled + uniformly. Now, editing a binding in a keyset only affects its value in + the keyset. All bindings are defined together in the system-specific + default keysets in config-extensions.def. All custom keysets are saved as + a whole in config-extension.cfg. All take effect as soon as one clicks + Apply or Ok. The affected events are '<>', + '<>', '<>', '<>', + '<>', '<>', '<>', and + '<>'. Any (global) customizations made before 3.6.3 will not + affect their keyset-specific customization after 3.6.3. and vice versa. + Initial patch by Charles Wohlganger. + +- bpo-31206: IDLE: Factor HighPage(Frame) class from ConfigDialog. Patch by + Cheryl Sabella. + +- bpo-31001: Add tests for configdialog highlight tab. Patch by Cheryl + Sabella. + +- bpo-31205: IDLE: Factor KeysPage(Frame) class from ConfigDialog. The + slightly modified tests continue to pass. Patch by Cheryl Sabella. + +- bpo-31130: IDLE -- stop leaks in test_configdialog. Initial patch by + Victor Stinner. + +- bpo-31002: Add tests for configdialog keys tab. Patch by Cheryl Sabella. + +- bpo-19903: IDLE: Calltips use `inspect.signature` instead of + `inspect.getfullargspec`. This improves calltips for builtins converted to + use Argument Clinic. Patch by Louie Lu. + +- bpo-31083: IDLE - Add an outline of a TabPage class in configdialog. + Update existing classes to match outline. Initial patch by Cheryl Sabella. + +- bpo-31050: Factor GenPage(Frame) class from ConfigDialog. The slightly + modified tests continue to pass. Patch by Cheryl Sabella. + +- bpo-31004: IDLE - Factor FontPage(Frame) class from ConfigDialog. Slightly + modified tests continue to pass. Fix General tests. Patch mostly by Cheryl + Sabella. + +- bpo-30781: IDLE - Use ttk widgets in ConfigDialog. Patches by Terry Jan + Reedy and Cheryl Sabella. + +- bpo-31060: IDLE - Finish rearranging methods of ConfigDialog Grouping + methods pertaining to each tab and the buttons will aid writing tests and + improving the tabs and will enable splitting the groups into classes. + +- bpo-30853: IDLE -- Factor a VarTrace class out of ConfigDialog. Instance + tracers manages pairs consisting of a tk variable and a callback function. + When tracing is turned on, setting the variable calls the function. Test + coverage for the new class is 100%. + +- bpo-31003: IDLE: Add more tests for General tab. + +- bpo-30993: IDLE - Improve configdialog font page and tests. In + configdialog: Document causal pathways in create_font_tab docstring. + Simplify some attribute names. Move set_samples calls to var_changed_font + (idea from Cheryl Sabella). Move related functions to positions after the + create widgets function. In test_configdialog: Fix test_font_set so not + order dependent. Fix renamed test_indent_scale so it tests the widget. + Adjust tests for movement of set_samples call. Add tests for load + functions. Put all font tests in one class and tab indent tests in + another. Except for two lines, these tests completely cover the related + functions. + +- bpo-30981: IDLE -- Add more configdialog font page tests. + +- bpo-28523: IDLE: replace 'colour' with 'color' in configdialog. + +- bpo-30917: Add tests for idlelib.config.IdleConf. Increase coverage from + 46% to 96%. Patch by Louie Lu. + +- bpo-30934: Document coverage details for idlelib tests. Add section to + idlelib/idle-test/README.txt. Include check that branches are taken both + ways. Exclude IDLE-specific code that does not run during unit tests. + +- bpo-30913: IDLE: Document ConfigDialog tk Vars, methods, and widgets in + docstrings This will facilitate improving the dialog and splitting up the + class. Original patch by Cheryl Sabella. + +- bpo-30899: IDLE: Add tests for ConfigParser subclasses in config. Patch by + Louie Lu. + +- bpo-30881: IDLE: Add docstrings to browser.py. Patch by Cheryl Sabella. + +- bpo-30851: IDLE: Remove unused variables in configdialog. One is a + duplicate, one is set but cannot be altered by users. Patch by Cheryl + Sabella. + +- bpo-30870: IDLE: In Settings dialog, select font with Up, Down keys as + well as mouse. Initial patch by Louie Lu. + +- bpo-8231: IDLE: call config.IdleConf.GetUserCfgDir only once. + +- bpo-30779: IDLE: Factor ConfigChanges class from configdialog, put in + config; test. * In config, put dump test code in a function; run it and + unittest in 'if __name__ == '__main__'. * Add class config.ConfigChanges + based on changes_class_v4.py on bpo issue. * Add class + test_config.ChangesTest, partly using configdialog_tests_v1.py. * Revise + configdialog to use ConfigChanges; see tracker msg297804. * Revise + test_configdialog to match configdialog changes. * Remove configdialog + functions unused or moved to ConfigChanges. Cheryl Sabella contributed + parts of the patch. + +- bpo-30777: IDLE: configdialog - Add docstrings and fix comments. Patch by + Cheryl Sabella. + +- bpo-30495: IDLE: Improve textview with docstrings, PEP8 names, and more + tests. Patch by Cheryl Sabella. + +- bpo-30723: IDLE: Make several improvements to parenmatch. Add 'parens' + style to highlight both opener and closer. Make 'default' style, which is + not default, a synonym for 'opener'. Make time-delay work the same with + all styles. Add help for config dialog extensions tab, including help for + parenmatch. Add new tests. Original patch by Charles Wohlganger. + +- bpo-30674: IDLE: add docstrings to grep module. Patch by Cheryl Sabella + +- bpo-21519: IDLE's basic custom key entry dialog now detects duplicates + properly. Original patch by Saimadhav Heblikar. + +- bpo-29910: IDLE no longer deletes a character after commenting out a + region by a key shortcut. Add ``return 'break'`` for this and other + potential conflicts between IDLE and default key bindings. + +- bpo-30728: Review and change idlelib.configdialog names. Lowercase method + and attribute names. Replace 'colour' with 'color', expand overly cryptic + names, delete unneeded underscores. Replace ``import *`` with specific + imports. Patches by Cheryl Sabella. + +- bpo-6739: IDLE: Verify user-entered key sequences by trying to bind them + with tk. Add tests for all 3 validation functions. Original patch by G + Polo. Tests added by Cheryl Sabella. + +Tools/Demos +----------- + +- bpo-30983: gdb integration commands (py-bt, etc.) work on optimized shared + builds now, too. :pep:`523` introduced _PyEval_EvalFrameDefault which + inlines PyEval_EvalFrameEx on non-debug shared builds. This broke the + ability to use py-bt, py-up, and a few other Python-specific gdb + integrations. The problem is fixed by only looking for + _PyEval_EvalFrameDefault frames in python-gdb.py. Original patch by Bruno + "Polaco" Penteado. + + +What's New in Python 3.6.2 final? +================================= + +*Release date: 2017-07-17* + +No changes since release candidate 2 + + + +What's New in Python 3.6.2 release candidate 2? +=============================================== + +*Release date: 2017-07-07* + +Security +-------- + +- bpo-30730: Prevent environment variables injection in subprocess on + Windows. Prevent passing other environment variables and command + arguments. + +- bpo-30694: Upgrade expat copy from 2.2.0 to 2.2.1 to get fixes of multiple + security vulnerabilities including: CVE-2017-9233 (External entity + infinite loop DoS), CVE-2016-9063 (Integer overflow, re-fix), + CVE-2016-0718 (Fix regression bugs from 2.2.0's fix to CVE-2016-0718) and + CVE-2012-0876 (Counter hash flooding with SipHash). Note: the + CVE-2016-5300 (Use os-specific entropy sources like getrandom) doesn't + impact Python, since Python already gets entropy from the OS to set the + expat secret using ``XML_SetHashSalt()``. + +- bpo-30500: Fix urllib.parse.splithost() to correctly parse fragments. For + example, ``splithost('//127.0.0.1#@evil.com/')`` now correctly returns the + ``127.0.0.1`` host, instead of treating ``@evil.com`` as the host in an + authentication (``login@host``). + + +What's New in Python 3.6.2 release candidate 1? +=============================================== + +*Release date: 2017-06-17* + +Core and Builtins +----------------- + +- bpo-30682: Removed a too-strict assertion that failed for certain + f-strings, such as eval("f'\\\n'") and eval("f'\\\r'"). + +- bpo-30604: Move co_extra_freefuncs to not be per-thread to avoid crashes + +- bpo-29104: Fixed parsing backslashes in f-strings. + +- bpo-27945: Fixed various segfaults with dict when input collections are + mutated during searching, inserting or comparing. Based on patches by + Duane Griffin and Tim Mitchell. + +- bpo-25794: Fixed type.__setattr__() and type.__delattr__() for + non-interned attribute names. Based on patch by Eryk Sun. + +- bpo-30039: If a KeyboardInterrupt happens when the interpreter is in the + middle of resuming a chain of nested 'yield from' or 'await' calls, it's + now correctly delivered to the innermost frame. + +- bpo-12414: sys.getsizeof() on a code object now returns the sizes which + includes the code struct and sizes of objects which it references. Patch + by Dong-hee Na. + +- bpo-29949: Fix memory usage regression of set and frozenset object. + +- bpo-29935: Fixed error messages in the index() method of tuple, list and + deque when pass indices of wrong type. + +- bpo-29859: Show correct error messages when any of the pthread_* calls in + thread_pthread.h fails. + +- bpo-28876: ``bool(range)`` works even if ``len(range)`` raises + :exc:`OverflowError`. + +- bpo-29600: Fix wrapping coroutine return values in StopIteration. + +- bpo-28856: Fix an oversight that %b format for bytes should support + objects follow the buffer protocol. + +- bpo-29714: Fix a regression that bytes format may fail when containing + zero bytes inside. + +- bpo-29478: If max_line_length=None is specified while using the Compat32 + policy, it is no longer ignored. Patch by Mircea Cosbuc. + +Library +------- + +- bpo-30616: Functional API of enum allows to create empty enums. Patched by + Dong-hee Na + +- bpo-30038: Fix race condition between signal delivery and wakeup file + descriptor. Patch by Nathaniel Smith. + +- bpo-23894: lib2to3 now recognizes ``rb'...'`` and ``f'...'`` strings. + +- bpo-23890: unittest.TestCase.assertRaises() now manually breaks a + reference cycle to not keep objects alive longer than expected. + +- bpo-30149: inspect.signature() now supports callables with + variable-argument parameters wrapped with partialmethod. Patch by Dong-hee + Na. + +- bpo-30645: Fix path calculation in imp.load_package(), fixing it for cases + when a package is only shipped with bytecodes. Patch by Alexandru + Ardelean. + +- bpo-29931: Fixed comparison check for ipaddress.ip_interface objects. + Patch by Sanjay Sundaresan. + +- bpo-30605: re.compile() no longer raises a BytesWarning when compiling a + bytes instance with misplaced inline modifier. Patch by Roy Williams. + +Security +-------- + +- bpo-29591: Update expat copy from 2.1.1 to 2.2.0 to get fixes of + CVE-2016-0718 and CVE-2016-4472. See + https://sourceforge.net/p/expat/bugs/537/ for more information. + +Library +------- + +- bpo-24484: Avoid race condition in multiprocessing cleanup (#2159) + +- bpo-28994: The traceback no longer displayed for SystemExit raised in a + callback registered by atexit. + +- bpo-30508: Don't log exceptions if Task/Future "cancel()" method was + called. + +- bpo-28556: Updates to typing module: Add generic AsyncContextManager, add + support for ContextManager on all versions. Original PRs by Jelle Zijlstra + and Ivan Levkivskyi + +- bpo-29870: Fix ssl sockets leaks when connection is aborted in asyncio/ssl + implementation. Patch by Michaël Sghaïer. + +- bpo-29743: Closing transport during handshake process leaks open socket. + Patch by Nikolay Kim + +- bpo-27585: Fix waiter cancellation in asyncio.Lock. Patch by Mathieu + Sornay. + +- bpo-30418: On Windows, subprocess.Popen.communicate() now also ignore + EINVAL on stdin.write() if the child process is still running but closed + the pipe. + +- bpo-29822: inspect.isabstract() now works during __init_subclass__. Patch + by Nate Soares. + +- bpo-29581: ABCMeta.__new__ now accepts ``**kwargs``, allowing abstract + base classes to use keyword parameters in __init_subclass__. Patch by Nate + Soares. + +- bpo-30557: faulthandler now correctly filters and displays exception codes + on Windows + +- bpo-30378: Fix the problem that logging.handlers.SysLogHandler cannot + handle IPv6 addresses. + +- bpo-29960: Preserve generator state when _random.Random.setstate() raises + an exception. Patch by Bryan Olson. + +- bpo-30414: multiprocessing.Queue._feed background running thread do not + break from main loop on exception. + +- bpo-30003: Fix handling escape characters in HZ codec. Based on patch by + Ma Lin. + +- bpo-30301: Fix AttributeError when using SimpleQueue.empty() under *spawn* + and *forkserver* start methods. + +- bpo-30329: imaplib and poplib now catch the Windows socket WSAEINVAL error + (code 10022) on shutdown(SHUT_RDWR): An invalid operation was attempted. + This error occurs sometimes on SSL connections. + +- bpo-30375: Warnings emitted when compile a regular expression now always + point to the line in the user code. Previously they could point into + inners of the re module if emitted from inside of groups or conditionals. + +- bpo-30048: Fixed ``Task.cancel()`` can be ignored when the task is running + coroutine and the coroutine returned without any more ``await``. + +- bpo-30266: contextlib.AbstractContextManager now supports + anti-registration by setting __enter__ = None or __exit__ = None, + following the pattern introduced in bpo-25958. Patch by Jelle Zijlstra. + +- bpo-30298: Weaken the condition of deprecation warnings for inline + modifiers. Now allowed several subsequential inline modifiers at the start + of the pattern (e.g. ``'(?i)(?s)...'``). In verbose mode whitespaces and + comments now are allowed before and between inline modifiers (e.g. ``'(?x) + (?i) (?s)...'``). + +- bpo-29990: Fix range checking in GB18030 decoder. Original patch by Ma + Lin. + +- bpo-26293: Change resulted because of zipfile breakage. (See also: + bpo-29094) + +- bpo-30243: Removed the __init__ methods of _json's scanner and encoder. + Misusing them could cause memory leaks or crashes. Now scanner and + encoder objects are completely initialized in the __new__ methods. + +- bpo-30185: Avoid KeyboardInterrupt tracebacks in forkserver helper process + when Ctrl-C is received. + +- bpo-28556: Various updates to typing module: add typing.NoReturn type, use + WrapperDescriptorType, minor bug-fixes. Original PRs by Jim + Fasarakis-Hilliard and Ivan Levkivskyi. + +- bpo-30205: Fix getsockname() for unbound AF_UNIX sockets on Linux. + +- bpo-30070: Fixed leaks and crashes in errors handling in the parser + module. + +- bpo-30061: Fixed crashes in IOBase methods __next__() and readlines() when + readline() or __next__() respectively return non-sizeable object. Fixed + possible other errors caused by not checking results of PyObject_Size(), + PySequence_Size(), or PyMapping_Size(). + +- bpo-30017: Allowed calling the close() method of the zip entry writer + object multiple times. Writing to a closed writer now always produces a + ValueError. + +- bpo-30068: _io._IOBase.readlines will check if it's closed first when hint + is present. + +- bpo-29694: Fixed race condition in pathlib mkdir with flags parents=True. + Patch by Armin Rigo. + +- bpo-29692: Fixed arbitrary unchaining of RuntimeError exceptions in + contextlib.contextmanager. Patch by Siddharth Velankar. + +- bpo-29998: Pickling and copying ImportError now preserves name and path + attributes. + +- bpo-29953: Fixed memory leaks in the replace() method of datetime and time + objects when pass out of bound fold argument. + +- bpo-29942: Fix a crash in itertools.chain.from_iterable when encountering + long runs of empty iterables. + +- bpo-27863: Fixed multiple crashes in ElementTree caused by race conditions + and wrong types. + +- bpo-28699: Fixed a bug in pools in multiprocessing.pool that raising an + exception at the very first of an iterable may swallow the exception or + make the program hang. Patch by Davin Potts and Xiang Zhang. + +- bpo-25803: Avoid incorrect errors raised by Path.mkdir(exist_ok=True) when + the OS gives priority to errors such as EACCES over EEXIST. + +- bpo-29861: Release references to tasks, their arguments and their results + as soon as they are finished in multiprocessing.Pool. + +- bpo-29884: faulthandler: Restore the old sigaltstack during teardown. + Patch by Christophe Zeitouny. + +- bpo-25455: Fixed crashes in repr of recursive buffered file-like objects. + +- bpo-29800: Fix crashes in partial.__repr__ if the keys of partial.keywords + are not strings. Patch by Michael Seifert. + +- bpo-29742: get_extra_info() raises exception if get called on closed ssl + transport. Patch by Nikolay Kim. + +- bpo-8256: Fixed possible failing or crashing input() if attributes + "encoding" or "errors" of sys.stdin or sys.stdout are not set or are not + strings. + +- bpo-28298: Fix a bug that prevented array 'Q', 'L' and 'I' from accepting + big intables (objects that have __int__) as elements. Patch by Oren + Milman. + +- bpo-28231: The zipfile module now accepts path-like objects for external + paths. + +- bpo-26915: index() and count() methods of collections.abc.Sequence now + check identity before checking equality when do comparisons. + +- bpo-29615: SimpleXMLRPCDispatcher no longer chains KeyError (or any other + exception) to exception(s) raised in the dispatched methods. Patch by Petr + Motejlek. + +- bpo-30177: path.resolve(strict=False) no longer cuts the path after the + first element not present in the filesystem. Patch by Antoine Pietri. + +IDLE +---- + +- bpo-15786: Fix several problems with IDLE's autocompletion box. The + following should now work: clicking on selection box items; using the + scrollbar; selecting an item by hitting Return. Hangs on MacOSX should no + longer happen. Patch by Louie Lu. + +- bpo-25514: Add doc subsubsection about IDLE failure to start. Popup + no-connection message directs users to this section. + +- bpo-30642: Fix reference leaks in IDLE tests. Patches by Louie Lu and + Terry Jan Reedy. + +- bpo-30495: Add docstrings for textview.py and use PEP8 names. Patches by + Cheryl Sabella and Terry Jan Reedy. + +- bpo-30290: Help-about: use pep8 names and add tests. Increase coverage to + 100%. Patches by Louie Lu, Cheryl Sabella, and Terry Jan Reedy. + +- bpo-30303: Add _utest option to textview; add new tests. Increase coverage + to 100%. Patches by Louie Lu and Terry Jan Reedy. + +C API +----- + +- bpo-27867: Function PySlice_GetIndicesEx() no longer replaced with a macro + if Py_LIMITED_API is not set. + +Build +----- + +- bpo-29941: Add ``--with-assertions`` configure flag to explicitly enable C + ``assert()`` checks. Defaults to off. ``--with-pydebug`` implies + ``--with-assertions``. + +- bpo-28787: Fix out-of-tree builds of Python when configured with + ``--with--dtrace``. + +- bpo-29243: Prevent unnecessary rebuilding of Python during ``make test``, + ``make install`` and some other make targets when configured with + ``--enable-optimizations``. + +- bpo-23404: Don't regenerate generated files based on file modification + time anymore: the action is now explicit. Replace ``make touch`` with + ``make regen-all``. + +- bpo-29643: Fix ``--enable-optimization`` didn't work. + +Documentation +------------- + +- bpo-30176: Add missing attribute related constants in curses + documentation. + +- bpo-30052: the link targets for :func:`bytes` and :func:`bytearray` are + now their respective type definitions, rather than the corresponding + builtin function entries. Use :ref:`bytes ` and + :ref:`bytearray ` to reference the latter. In order to + ensure this and future cross-reference updates are applied automatically, + the daily documentation builds now disable the default output caching + features in Sphinx. + +- bpo-26985: Add missing info of code object in inspect documentation. + +Tools/Demos +----------- + +- bpo-29367: python-gdb.py now supports also ``method-wrapper`` + (``wrapperobject``) objects. + +Tests +----- + +- bpo-30357: test_thread: setUp() now uses support.threading_setup() and + support.threading_cleanup() to wait until threads complete to avoid random + side effects on following tests. Initial patch written by Grzegorz + Grzywacz. + +- bpo-30197: Enhanced functions swap_attr() and swap_item() in the + test.support module. They now work when delete replaced attribute or item + inside the with statement. The old value of the attribute or item (or + None if it doesn't exist) now will be assigned to the target of the "as" + clause, if there is one. + +Windows +------- + +- bpo-30687: Locate msbuild.exe on Windows when building rather than + vcvarsall.bat + +- bpo-30450: The build process on Windows no longer depends on Subversion, + instead pulling external code from GitHub via a Python script. If Python + 3.6 is not found on the system (via ``py -3.6``), NuGet is used to + download a copy of 32-bit Python. + + +What's New in Python 3.6.1 final? +================================= + +*Release date: 2017-03-21* + +Core and Builtins +----------------- + +- bpo-29723: The ``sys.path[0]`` initialization change for bpo-29139 caused + a regression by revealing an inconsistency in how sys.path is initialized + when executing ``__main__`` from a zipfile, directory, or other import + location. The interpreter now consistently avoids ever adding the import + location's parent directory to ``sys.path``, and ensures no other + ``sys.path`` entries are inadvertently modified when inserting the import + location named on the command line. + +Build +----- + +- bpo-27593: fix format of git information used in sys.version + +- Fix incompatible comment in python.h + + +What's New in Python 3.6.1 release candidate 1? +=============================================== + +*Release date: 2017-03-04* + +Core and Builtins +----------------- + +- bpo-28893: Set correct __cause__ for errors about invalid awaitables + returned from __aiter__ and __anext__. + +- bpo-29683: Fixes to memory allocation in _PyCode_SetExtra. Patch by Brian + Coleman. + +- bpo-29684: Fix minor regression of PyEval_CallObjectWithKeywords. It + should raise TypeError when kwargs is not a dict. But it might cause segv + when args=NULL and kwargs is not a dict. + +- bpo-28598: Support __rmod__ for subclasses of str being called before + str.__mod__. Patch by Martijn Pieters. + +- bpo-29607: Fix stack_effect computation for CALL_FUNCTION_EX. Patch by + Matthieu Dartiailh. + +- bpo-29602: Fix incorrect handling of signed zeros in complex constructor + for complex subclasses and for inputs having a __complex__ method. Patch + by Serhiy Storchaka. + +- bpo-29347: Fixed possibly dereferencing undefined pointers when creating + weakref objects. + +- bpo-29438: Fixed use-after-free problem in key sharing dict. + +- bpo-29319: Prevent RunMainFromImporter overwriting sys.path[0]. + +- bpo-29337: Fixed possible BytesWarning when compare the code objects. + Warnings could be emitted at compile time. + +- bpo-29327: Fixed a crash when pass the iterable keyword argument to + sorted(). + +- bpo-29034: Fix memory leak and use-after-free in os module + (path_converter). + +- bpo-29159: Fix regression in bytes(x) when x.__index__() raises Exception. + +- bpo-28932: Do not include if it does not exist. + +- bpo-25677: Correct the positioning of the syntax error caret for indented + blocks. Based on patch by Michael Layzell. + +- bpo-29000: Fixed bytes formatting of octals with zero padding in alternate + form. + +- bpo-26919: On Android, operating system data is now always encoded/decoded + to/from UTF-8, instead of the locale encoding to avoid inconsistencies + with os.fsencode() and os.fsdecode() which are already using UTF-8. + +- bpo-28991: functools.lru_cache() was susceptible to an obscure reentrancy + bug triggerable by a monkey-patched len() function. + +- bpo-28739: f-string expressions are no longer accepted as docstrings and + by ast.literal_eval() even if they do not include expressions. + +- bpo-28512: Fixed setting the offset attribute of SyntaxError by + PyErr_SyntaxLocationEx() and PyErr_SyntaxLocationObject(). + +- bpo-28918: Fix the cross compilation of xxlimited when Python has been + built with Py_DEBUG defined. + +- bpo-28731: Optimize _PyDict_NewPresized() to create correct size dict. + Improve speed of dict literal with constant keys up to 30%. + +Library +------- + +- bpo-29169: Update zlib to 1.2.11. + +- bpo-29623: Allow use of path-like object as a single argument in + ConfigParser.read(). Patch by David Ellis. + +- bpo-28963: Fix out of bound iteration in + asyncio.Future.remove_done_callback implemented in C. + +- bpo-29704: asyncio.subprocess.SubprocessStreamProtocol no longer closes + before all pipes are closed. + +- bpo-29271: Fix Task.current_task and Task.all_tasks implemented in C to + accept None argument as their pure Python implementation. + +- bpo-29703: Fix asyncio to support instantiation of new event loops in + child processes. + +- bpo-29376: Fix assertion error in threading._DummyThread.is_alive(). + +- bpo-28624: Add a test that checks that cwd parameter of Popen() accepts + PathLike objects. Patch by Sayan Chowdhury. + +- bpo-28518: Start a transaction implicitly before a DML statement. Patch by + Aviv Palivoda. + +- bpo-29532: Altering a kwarg dictionary passed to functools.partial() no + longer affects a partial object after creation. + +- bpo-29110: Fix file object leak in aifc.open() when file is given as a + filesystem path and is not in valid AIFF format. Patch by Anthony Zhang. + +- bpo-28556: Various updates to typing module: typing.Counter, + typing.ChainMap, improved ABC caching, etc. Original PRs by Jelle + Zijlstra, Ivan Levkivskyi, Manuel Krebber, and Łukasz Langa. + +- bpo-29100: Fix datetime.fromtimestamp() regression introduced in Python + 3.6.0: check minimum and maximum years. + +- bpo-29519: Fix weakref spewing exceptions during interpreter shutdown when + used with a rare combination of multiprocessing and custom codecs. + +- bpo-29416: Prevent infinite loop in pathlib.Path.mkdir + +- bpo-29444: Fixed out-of-bounds buffer access in the group() method of the + match object. Based on patch by WGH. + +- bpo-29335: Fix subprocess.Popen.wait() when the child process has exited + to a stopped instead of terminated state (ex: when under ptrace). + +- bpo-29290: Fix a regression in argparse that help messages would wrap at + non-breaking spaces. + +- bpo-28735: Fixed the comparison of mock.MagickMock with mock.ANY. + +- bpo-29316: Restore the provisional status of typing module, add + corresponding note to documentation. Patch by Ivan L. + +- bpo-29219: Fixed infinite recursion in the repr of uninitialized + ctypes.CDLL instances. + +- bpo-29011: Fix an important omission by adding Deque to the typing module. + +- bpo-28969: Fixed race condition in C implementation of + functools.lru_cache. KeyError could be raised when cached function with + full cache was simultaneously called from different threads with the same + uncached arguments. + +- bpo-29142: In urllib.request, suffixes in no_proxy environment variable + with leading dots could match related hostnames again (e.g. .b.c matches + a.b.c). Patch by Milan Oberkirch. + +- bpo-28961: Fix unittest.mock._Call helper: don't ignore the name parameter + anymore. Patch written by Jiajun Huang. + +- bpo-29203: functools.lru_cache() now respects :pep:`468` and preserves the + order of keyword arguments. f(a=1, b=2) is now cached separately from + f(b=2, a=1) since both calls could potentially give different results. + +- bpo-15812: inspect.getframeinfo() now correctly shows the first line of a + context. Patch by Sam Breese. + +- bpo-29094: Offsets in a ZIP file created with extern file object and modes + "w" and "x" now are relative to the start of the file. + +- bpo-29085: Allow random.Random.seed() to use high quality OS randomness + rather than the pid and time. + +- bpo-29061: Fixed bug in secrets.randbelow() which would hang when given a + negative input. Patch by Brendan Donegan. + +- bpo-29079: Prevent infinite loop in pathlib.resolve() on Windows + +- bpo-13051: Fixed recursion errors in large or resized + curses.textpad.Textbox. Based on patch by Tycho Andersen. + +- bpo-29119: Fix weakrefs in the pure python version of + collections.OrderedDict move_to_end() method. Contributed by Andra + Bogildea. + +- bpo-9770: curses.ascii predicates now work correctly with negative + integers. + +- bpo-28427: old keys should not remove new values from WeakValueDictionary + when collecting from another thread. + +- bpo-28923: Remove editor artifacts from Tix.py. + +- bpo-29055: Neaten-up empty population error on random.choice() by + suppressing the upstream exception. + +- bpo-28871: Fixed a crash when deallocate deep ElementTree. + +- bpo-19542: Fix bugs in WeakValueDictionary.setdefault() and + WeakValueDictionary.pop() when a GC collection happens in another thread. + +- bpo-20191: Fixed a crash in resource.prlimit() when passing a sequence + that doesn't own its elements as limits. + +- bpo-28779: multiprocessing.set_forkserver_preload() would crash the + forkserver process if a preloaded module instantiated some multiprocessing + objects such as locks. + +- bpo-28847: dbm.dumb now supports reading read-only files and no longer + writes the index file when it is not changed. + +- bpo-26937: The chown() method of the tarfile.TarFile class does not fail + now when the grp module cannot be imported, as for example on Android + platforms. + +IDLE +---- + +- bpo-29071: IDLE colors f-string prefixes (but not invalid ur prefixes). + +- bpo-28572: Add 10% to coverage of IDLE's test_configdialog. Update and + augment description of the configuration system. + +Windows +------- + +- bpo-29579: Removes readme.txt from the installer + +- bpo-29326: Ignores blank lines in ._pth files (Patch by Alexey Izbyshev) + +- bpo-28164: Correctly handle special console filenames (patch by Eryk Sun) + +- bpo-29409: Implement :pep:`529` for io.FileIO (Patch by Eryk Sun) + +- bpo-29392: Prevent crash when passing invalid arguments into msvcrt + module. + +- bpo-25778: winreg does not truncate string correctly (Patch by Eryk Sun) + +- bpo-28896: Deprecate WindowsRegistryFinder and disable it by default. + +C API +----- + +- bpo-27867: Function PySlice_GetIndicesEx() is replaced with a macro if + Py_LIMITED_API is not set or set to the value between 0x03050400 and + 0x03060000 (not including) or 0x03060100 or higher. + +- bpo-29083: Fixed the declaration of some public API functions. + PyArg_VaParse() and PyArg_VaParseTupleAndKeywords() were not available in + limited API. PyArg_ValidateKeywordArguments(), PyArg_UnpackTuple() and + Py_BuildValue() were not available in limited API of version < 3.3 when + PY_SSIZE_T_CLEAN is defined. + +- bpo-29058: All stable API extensions added after Python 3.2 are now + available only when Py_LIMITED_API is set to the PY_VERSION_HEX value of + the minimum Python version supporting this API. + +Documentation +------------- + +- bpo-28929: Link the documentation to its source file on GitHub. + +- bpo-25008: Document smtpd.py as effectively deprecated and add a pointer + to aiosmtpd, a third-party asyncio-based replacement. + +- bpo-26355: Add canonical header link on each page to corresponding major + version of the documentation. Patch by Matthias Bussonnier. + +- bpo-29349: Fix Python 2 syntax in code for building the documentation. + +Tests +----- + +- bpo-28087: Skip test_asyncore and test_eintr poll failures on macOS. Skip + some tests of select.poll when running on macOS due to unresolved issues + with the underlying system poll function on some macOS versions. + +- bpo-29571: to match the behaviour of the ``re.LOCALE`` flag, + test_re.test_locale_flag now uses ``locale.getpreferredencoding(False)`` + to determine the candidate encoding for the test regex (allowing it to + correctly skip the test when the default locale encoding is a multi-byte + encoding) + +- bpo-28950: Disallow -j0 to be combined with -T/-l in regrtest command line + arguments. + +- bpo-28683: Fix the tests that bind() a unix socket and raise + PermissionError on Android for a non-root user. + +- bpo-26939: Add the support.setswitchinterval() function to fix + test_functools hanging on the Android armv7 qemu emulator. + +Build +----- + +- bpo-27593: sys.version and the platform module python_build(), + python_branch(), and python_revision() functions now use git information + rather than hg when building from a repo. + +- bpo-29572: Update Windows build and OS X installers to use OpenSSL 1.0.2k. + +- bpo-26851: Set Android compilation and link flags. + +- bpo-28768: Fix implicit declaration of function _setmode. Patch by + Masayuki Yamamoto + +- bpo-29080: Removes hard dependency on hg.exe from PCBuild/build.bat + +- bpo-23903: Added missed names to PC/python3.def. + +- bpo-28762: lockf() is available on Android API level 24, but the F_LOCK + macro is not defined in android-ndk-r13. + +- bpo-28538: Fix the compilation error that occurs because if_nameindex() is + available on Android API level 24, but the if_nameindex structure is not + defined. + +- bpo-20211: Do not add the directory for installing C header files and the + directory for installing object code libraries to the cross compilation + search paths. Original patch by Thomas Petazzoni. + +- bpo-28849: Do not define sys.implementation._multiarch on Android. + + +What's New in Python 3.6.0 final? +================================= + +*Release date: 2016-12-23* + +No changes since release candidate 2 + + + +What's New in Python 3.6.0 release candidate 2? +=============================================== + +*Release date: 2016-12-16* + +Core and Builtins +----------------- + +- bpo-28147: Fix a memory leak in split-table dictionaries: setattr() must + not convert combined table into split table. Patch written by INADA Naoki. + +- bpo-28990: Fix asyncio SSL hanging if connection is closed before + handshake is completed. (Patch by HoHo-Ho) + +Tools/Demos +----------- + +- bpo-28770: Fix python-gdb.py for fastcalls. + +Windows +------- + +- bpo-28896: Deprecate WindowsRegistryFinder. + +Build +----- + +- bpo-28898: Prevent gdb build errors due to HAVE_LONG_LONG redefinition. + + +What's New in Python 3.6.0 release candidate 1? +=============================================== + +*Release date: 2016-12-06* + +Core and Builtins +----------------- + +- bpo-23722: Rather than silently producing a class that doesn't support + zero-argument ``super()`` in methods, failing to pass the new + ``__classcell__`` namespace entry up to ``type.__new__`` now results in a + ``DeprecationWarning`` and a class that supports zero-argument + ``super()``. + +- bpo-28797: Modifying the class __dict__ inside the __set_name__ method of + a descriptor that is used inside that class no longer prevents calling the + __set_name__ method of other descriptors. + +- bpo-28782: Fix a bug in the implementation ``yield from`` when checking if + the next instruction is YIELD_FROM. Regression introduced by WORDCODE + (issue #26647). + +Library +------- + +- bpo-27030: Unknown escapes in re.sub() replacement template are allowed + again. But they still are deprecated and will be disabled in 3.7. + +- bpo-28835: Fix a regression introduced in warnings.catch_warnings(): call + warnings.showwarning() if it was overridden inside the context manager. + +- bpo-27172: To assist with upgrades from 2.7, the previously documented + deprecation of ``inspect.getfullargspec()`` has been reversed. This + decision may be revisited again after the Python 2.7 branch is no longer + officially supported. + +- bpo-26273: Add new :data:`socket.TCP_CONGESTION` (Linux 2.6.13) and + :data:`socket.TCP_USER_TIMEOUT` (Linux 2.6.37) constants. Patch written by + Omar Sandoval. + +- bpo-24142: Reading a corrupt config file left configparser in an invalid + state. Original patch by Florian Höch. + +- bpo-28843: Fix asyncio C Task to handle exceptions __traceback__. + +C API +----- + +- bpo-28808: PyUnicode_CompareWithASCIIString() now never raises exceptions. + +Documentation +------------- + +- bpo-23722: The data model reference and the porting section in the What's + New guide now cover the additional ``__classcell__`` handling needed for + custom metaclasses to fully support :pep:`487` and zero-argument + ``super()``. + +Tools/Demos +----------- + +- bpo-28023: Fix python-gdb.py didn't support new dict implementation. + + +What's New in Python 3.6.0 beta 4? +================================== + +*Release date: 2016-11-21* + +Core and Builtins +----------------- + +- bpo-28532: Show sys.version when -V option is supplied twice. + +- bpo-27100: The with-statement now checks for __enter__ before it checks + for __exit__. This gives less confusing error messages when both methods + are missing. Patch by Jonathan Ellington. + +- bpo-28746: Fix the set_inheritable() file descriptor method on platforms + that do not have the ioctl FIOCLEX and FIONCLEX commands. + +- bpo-26920: Fix not getting the locale's charset upon initializing the + interpreter, on platforms that do not have langinfo. + +- bpo-28648: Fixed crash in Py_DecodeLocale() in debug build on Mac OS X + when decode astral characters. Patch by Xiang Zhang. + +- bpo-19398: Extra slash no longer added to sys.path components in case of + empty compile-time PYTHONPATH components. + +- bpo-28665: Improve speed of the STORE_DEREF opcode by 40%. + +- bpo-28583: PyDict_SetDefault didn't combine split table when needed. Patch + by Xiang Zhang. + +- bpo-27243: Change PendingDeprecationWarning -> DeprecationWarning. As it + was agreed in the issue, __aiter__ returning an awaitable should result in + PendingDeprecationWarning in 3.5 and in DeprecationWarning in 3.6. + +- bpo-26182: Fix a refleak in code that raises DeprecationWarning. + +- bpo-28721: Fix asynchronous generators aclose() and athrow() to handle + StopAsyncIteration propagation properly. + +Library +------- + +- bpo-28752: Restored the __reduce__() methods of datetime objects. + +- bpo-28727: Regular expression patterns, _sre.SRE_Pattern objects created + by re.compile(), become comparable (only x==y and x!=y operators). This + change should fix the issue #18383: don't duplicate warning filters when + the warnings module is reloaded (thing usually only done in unit tests). + +- bpo-20572: The subprocess.Popen.wait method's undocumented endtime + parameter now raises a DeprecationWarning. + +- bpo-25659: In ctypes, prevent a crash calling the from_buffer() and + from_buffer_copy() methods on abstract classes like Array. + +- bpo-19717: Makes Path.resolve() succeed on paths that do not exist. Patch + by Vajrasky Kok + +- bpo-28563: Fixed possible DoS and arbitrary code execution when handle + plural form selections in the gettext module. The expression parser now + supports exact syntax supported by GNU gettext. + +- bpo-28387: Fixed possible crash in _io.TextIOWrapper deallocator when the + garbage collector is invoked in other thread. Based on patch by Sebastian + Cufre. + +- bpo-28600: Optimize loop.call_soon. + +- bpo-28613: Fix get_event_loop() return the current loop if called from + coroutines/callbacks. + +- bpo-28634: Fix asyncio.isfuture() to support unittest.Mock. + +- bpo-26081: Fix refleak in _asyncio.Future.__iter__().throw. + +- bpo-28639: Fix inspect.isawaitable to always return bool Patch by Justin + Mayfield. + +- bpo-28652: Make loop methods reject socket kinds they do not support. + +- bpo-28653: Fix a refleak in functools.lru_cache. + +- bpo-28703: Fix asyncio.iscoroutinefunction to handle Mock objects. + +- bpo-28704: Fix create_unix_server to support Path-like objects (PEP 519). + +- bpo-28720: Add collections.abc.AsyncGenerator. + +Documentation +------------- + +- bpo-28513: Documented command-line interface of zipfile. + +Tests +----- + +- bpo-28666: Now test.support.rmtree is able to remove unwritable or + unreadable directories. + +- bpo-23839: Various caches now are cleared before running every test file. + +Build +----- + +- bpo-10656: Fix out-of-tree building on AIX. Patch by Tristan Carel and + Michael Haubenwallner. + +- bpo-26359: Rename --with-optimiations to --enable-optimizations. + +- bpo-28676: Prevent missing 'getentropy' declaration warning on macOS. + Patch by Gareth Rees. + + +What's New in Python 3.6.0 beta 3? +================================== + +*Release date: 2016-10-31* + +Core and Builtins +----------------- + +- bpo-28128: Deprecation warning for invalid str and byte escape sequences + now prints better information about where the error occurs. Patch by + Serhiy Storchaka and Eric Smith. + +- bpo-28509: dict.update() no longer allocate unnecessary large memory. + +- bpo-28426: Fixed potential crash in PyUnicode_AsDecodedObject() in debug + build. + +- bpo-28517: Fixed of-by-one error in the peephole optimizer that caused + keeping unreachable code. + +- bpo-28214: Improved exception reporting for problematic __set_name__ + attributes. + +- bpo-23782: Fixed possible memory leak in _PyTraceback_Add() and exception + loss in PyTraceBack_Here(). + +- bpo-28471: Fix "Python memory allocator called without holding the GIL" + crash in socket.setblocking. + +Library +------- + +- bpo-27517: LZMA compressor and decompressor no longer raise exceptions if + given empty data twice. Patch by Benjamin Fogle. + +- bpo-28549: Fixed segfault in curses's addch() with ncurses6. + +- bpo-28449: tarfile.open() with mode "r" or "r:" now tries to open a tar + file with compression before trying to open it without compression. + Otherwise it had 50% chance failed with ignore_zeros=True. + +- bpo-23262: The webbrowser module now supports Firefox 36+ and derived + browsers. Based on patch by Oleg Broytman. + +- bpo-27939: Fixed bugs in tkinter.ttk.LabeledScale and tkinter.Scale caused + by representing the scale as float value internally in Tk. tkinter.IntVar + now works if float value is set to underlying Tk variable. + +- bpo-18844: The various ways of specifying weights for random.choices() now + produce the same result sequences. + +- bpo-28255: calendar.TextCalendar().prmonth() no longer prints a space at + the start of new line after printing a month's calendar. Patch by Xiang + Zhang. + +- bpo-20491: The textwrap.TextWrapper class now honors non-breaking spaces. + Based on patch by Kaarle Ritvanen. + +- bpo-28353: os.fwalk() no longer fails on broken links. + +- bpo-28430: Fix iterator of C implemented asyncio.Future doesn't accept + non-None value is passed to it.send(val). + +- bpo-27025: Generated names for Tkinter widgets now start by the "!" prefix + for readability. + +- bpo-25464: Fixed HList.header_exists() in tkinter.tix module by addin a + workaround to Tix library bug. + +- bpo-28488: shutil.make_archive() no longer adds entry "./" to ZIP archive. + +- bpo-25953: re.sub() now raises an error for invalid numerical group + reference in replacement template even if the pattern is not found in the + string. Error message for invalid group reference now includes the group + index and the position of the reference. Based on patch by SilentGhost. + +- bpo-18219: Optimize csv.DictWriter for large number of columns. Patch by + Mariatta Wijaya. + +- bpo-28448: Fix C implemented asyncio.Future didn't work on Windows. + +- bpo-28480: Fix error building socket module when multithreading is + disabled. + +- bpo-24452: Make webbrowser support Chrome on Mac OS X. + +- bpo-20766: Fix references leaked by pdb in the handling of SIGINT + handlers. + +- bpo-28492: Fix how StopIteration exception is raised in _asyncio.Future. + +- bpo-28500: Fix asyncio to handle async gens GC from another thread. + +- bpo-26923: Fix asyncio.Gather to refuse being cancelled once all children + are done. Patch by Johannes Ebke. + +- bpo-26796: Don't configure the number of workers for default threadpool + executor. Initial patch by Hans Lawrenz. + +- bpo-28544: Implement asyncio.Task in C. + +Windows +------- + +- bpo-28522: Fixes mishandled buffer reallocation in getpathp.c + +Build +----- + +- bpo-28444: Fix missing extensions modules when cross compiling. + +- bpo-28208: Update Windows build and OS X installers to use SQLite 3.14.2. + +- bpo-28248: Update Windows build and OS X installers to use OpenSSL 1.0.2j. + +Tests +----- + +- bpo-26944: Fix test_posix for Android where 'id -G' is entirely wrong or + missing the effective gid. + +- bpo-28409: regrtest: fix the parser of command line arguments. + + +What's New in Python 3.6.0 beta 2? +================================== + +*Release date: 2016-10-10* + +Core and Builtins +----------------- + +- bpo-28183: Optimize and cleanup dict iteration. + +- bpo-26081: Added C implementation of asyncio.Future. Original patch by + Yury Selivanov. + +- bpo-28379: Added sanity checks and tests for PyUnicode_CopyCharacters(). + Patch by Xiang Zhang. + +- bpo-28376: The type of long range iterator is now registered as Iterator. + Patch by Oren Milman. + +- bpo-28376: Creating instances of range_iterator by calling range_iterator + type now is deprecated. Patch by Oren Milman. + +- bpo-28376: The constructor of range_iterator now checks that step is not + 0. Patch by Oren Milman. + +- bpo-26906: Resolving special methods of uninitialized type now causes + implicit initialization of the type instead of a fail. + +- bpo-18287: PyType_Ready() now checks that tp_name is not NULL. Original + patch by Niklas Koep. + +- bpo-24098: Fixed possible crash when AST is changed in process of + compiling it. + +- bpo-28201: Dict reduces possibility of 2nd conflict in hash table when + hashes have same lower bits. + +- bpo-28350: String constants with null character no longer interned. + +- bpo-26617: Fix crash when GC runs during weakref callbacks. + +- bpo-27942: String constants now interned recursively in tuples and + frozensets. + +- bpo-21578: Fixed misleading error message when ImportError called with + invalid keyword args. + +- bpo-28203: Fix incorrect type in complex(1.0, {2:3}) error message. Patch + by Soumya Sharma. + +- bpo-28086: Single var-positional argument of tuple subtype was passed + unscathed to the C-defined function. Now it is converted to exact tuple. + +- bpo-28214: Now __set_name__ is looked up on the class instead of the + instance. + +- bpo-27955: Fallback on reading /dev/urandom device when the getrandom() + syscall fails with EPERM, for example when blocked by SECCOMP. + +- bpo-28192: Don't import readline in isolated mode. + +- Upgrade internal unicode databases to Unicode version 9.0.0. + +- bpo-28131: Fix a regression in zipimport's compile_source(). zipimport + should use the same optimization level as the interpreter. + +- bpo-28126: Replace Py_MEMCPY with memcpy(). Visual Studio can properly + optimize memcpy(). + +- bpo-28120: Fix dict.pop() for splitted dictionary when trying to remove a + "pending key" (Not yet inserted in split-table). Patch by Xiang Zhang. + +- bpo-26182: Raise DeprecationWarning when async and await keywords are used + as variable/attribute/class/function name. + +Library +------- + +- bpo-27998: Fixed bytes path support in os.scandir() on Windows. Patch by + Eryk Sun. + +- bpo-28317: The disassembler now decodes FORMAT_VALUE argument. + +- bpo-26293: Fixed writing ZIP files that starts not from the start of the + file. Offsets in ZIP file now are relative to the start of the archive in + conforming to the specification. + +- bpo-28380: unittest.mock Mock autospec functions now properly support + assert_called, assert_not_called, and assert_called_once. + +- bpo-27181: remove statistics.geometric_mean and defer until 3.7. + +- bpo-28229: lzma module now supports pathlib. + +- bpo-28321: Fixed writing non-BMP characters with binary format in + plistlib. + +- bpo-28225: bz2 module now supports pathlib. Initial patch by Ethan + Furman. + +- bpo-28227: gzip now supports pathlib. Patch by Ethan Furman. + +- bpo-27358: Optimized merging var-keyword arguments and improved error + message when passing a non-mapping as a var-keyword argument. + +- bpo-28257: Improved error message when passing a non-iterable as a + var-positional argument. Added opcode BUILD_TUPLE_UNPACK_WITH_CALL. + +- bpo-28322: Fixed possible crashes when unpickle itertools objects from + incorrect pickle data. Based on patch by John Leitch. + +- bpo-28228: imghdr now supports pathlib. + +- bpo-28226: compileall now supports pathlib. + +- bpo-28314: Fix function declaration (C flags) for the getiterator() method + of xml.etree.ElementTree.Element. + +- bpo-28148: Stop using localtime() and gmtime() in the time module. + Introduced platform independent _PyTime_localtime API that is similar to + POSIX localtime_r, but available on all platforms. Patch by Ed Schouten. + +- bpo-28253: Fixed calendar functions for extreme months: 0001-01 and + 9999-12. Methods itermonthdays() and itermonthdays2() are reimplemented so + that they don't call itermonthdates() which can cause datetime.date + under/overflow. + +- bpo-28275: Fixed possible use after free in the decompress() methods of + the LZMADecompressor and BZ2Decompressor classes. Original patch by John + Leitch. + +- bpo-27897: Fixed possible crash in sqlite3.Connection.create_collation() + if pass invalid string-like object as a name. Patch by Xiang Zhang. + +- bpo-18844: random.choices() now has k as a keyword-only argument to + improve the readability of common cases and come into line with the + signature used in other languages. + +- bpo-18893: Fix invalid exception handling in Lib/ctypes/macholib/dyld.py. + Patch by Madison May. + +- bpo-27611: Fixed support of default root window in the tkinter.tix module. + Added the master parameter in the DisplayStyle constructor. + +- bpo-27348: In the traceback module, restore the formatting of exception + messages like "Exception: None". This fixes a regression introduced in + 3.5a2. + +- bpo-25651: Allow falsy values to be used for msg parameter of subTest(). + +- bpo-27778: Fix a memory leak in os.getrandom() when the getrandom() is + interrupted by a signal and a signal handler raises a Python exception. + +- bpo-28200: Fix memory leak on Windows in the os module (fix + path_converter() function). + +- bpo-25400: RobotFileParser now correctly returns default values for + crawl_delay and request_rate. Initial patch by Peter Wirtz. + +- bpo-27932: Prevent memory leak in win32_ver(). + +- Fix UnboundLocalError in socket._sendfile_use_sendfile. + +- bpo-28075: Check for ERROR_ACCESS_DENIED in Windows implementation of + os.stat(). Patch by Eryk Sun. + +- bpo-22493: Warning message emitted by using inline flags in the middle of + regular expression now contains a (truncated) regex pattern. Patch by Tim + Graham. + +- bpo-25270: Prevent codecs.escape_encode() from raising SystemError when an + empty bytestring is passed. + +- bpo-28181: Get antigravity over HTTPS. Patch by Kaartic Sivaraam. + +- bpo-25895: Enable WebSocket URL schemes in urllib.parse.urljoin. Patch by + Gergely Imreh and Markus Holtermann. + +- bpo-28114: Fix a crash in parse_envlist() when env contains byte strings. + Patch by Eryk Sun. + +- bpo-27599: Fixed buffer overrun in binascii.b2a_qp() and + binascii.a2b_qp(). + +- bpo-27906: Fix socket accept exhaustion during high TCP traffic. Patch by + Kevin Conway. + +- bpo-28174: Handle when SO_REUSEPORT isn't properly supported. Patch by + Seth Michael Larson. + +- bpo-26654: Inspect functools.partial in asyncio.Handle.__repr__. Patch by + iceboy. + +- bpo-26909: Fix slow pipes IO in asyncio. Patch by INADA Naoki. + +- bpo-28176: Fix callbacks race in asyncio.SelectorLoop.sock_connect. + +- bpo-27759: Fix selectors incorrectly retain invalid file descriptors. + Patch by Mark Williams. + +- bpo-28368: Refuse monitoring processes if the child watcher has no loop + attached. Patch by Vincent Michel. + +- bpo-28369: Raise RuntimeError when transport's FD is used with add_reader, + add_writer, etc. + +- bpo-28370: Speedup asyncio.StreamReader.readexactly. Patch by Коренберг + Марк. + +- bpo-28371: Deprecate passing asyncio.Handles to run_in_executor. + +- bpo-28372: Fix asyncio to support formatting of non-python coroutines. + +- bpo-28399: Remove UNIX socket from FS before binding. Patch by Коренберг + Марк. + +- bpo-27972: Prohibit Tasks to await on themselves. + +Windows +------- + +- bpo-28402: Adds signed catalog files for stdlib on Windows. + +- bpo-28333: Enables Unicode for ps1/ps2 and input() prompts. (Patch by Eryk + Sun) + +- bpo-28251: Improvements to help manuals on Windows. + +- bpo-28110: launcher.msi has different product codes between 32-bit and + 64-bit + +- bpo-28161: Opening CON for write access fails + +- bpo-28162: WindowsConsoleIO readall() fails if first line starts with + Ctrl+Z + +- bpo-28163: WindowsConsoleIO fileno() passes wrong flags to _open_osfhandle + +- bpo-28164: _PyIO_get_console_type fails for various paths + +- bpo-28137: Renames Windows path file to ._pth + +- bpo-28138: Windows ._pth file should allow import site + +C API +----- + +- bpo-28426: Deprecated undocumented functions PyUnicode_AsEncodedObject(), + PyUnicode_AsDecodedObject(), PyUnicode_AsDecodedUnicode() and + PyUnicode_AsEncodedUnicode(). + +Build +----- + +- bpo-28258: Fixed build with Estonian locale (python-config and distclean + targets in Makefile). Patch by Arfrever Frehtes Taifersar Arahesis. + +- bpo-26661: setup.py now detects system libffi with multiarch wrapper. + +- bpo-15819: Remove redundant include search directory option for building + outside the source tree. + +Tests +----- + +- bpo-28217: Adds _testconsole module to test console input. + + +What's New in Python 3.6.0 beta 1? +================================== + +*Release date: 2016-09-12* + +Core and Builtins +----------------- + +- bpo-23722: The __class__ cell used by zero-argument super() is now + initialized from type.__new__ rather than __build_class__, so class + methods relying on that will now work correctly when called from metaclass + methods during class creation. Patch by Martin Teichmann. + +- bpo-25221: Fix corrupted result from PyLong_FromLong(0) when Python is + compiled with NSMALLPOSINTS = 0. + +- bpo-27080: Implement formatting support for :pep:`515`. Initial patch by + Chris Angelico. + +- bpo-27199: In tarfile, expose copyfileobj bufsize to improve throughput. + Patch by Jason Fried. + +- bpo-27948: In f-strings, only allow backslashes inside the braces (where + the expressions are). This is a breaking change from the 3.6 alpha + releases, where backslashes are allowed anywhere in an f-string. Also, + require that expressions inside f-strings be enclosed within literal + braces, and not escapes like ``f'\x7b"hi"\x7d'``. + +- bpo-28046: Remove platform-specific directories from sys.path. + +- bpo-28071: Add early-out for differencing from an empty set. + +- bpo-25758: Prevents zipimport from unnecessarily encoding a filename + (patch by Eryk Sun) + +- bpo-25856: The __module__ attribute of extension classes and functions now + is interned. This leads to more compact pickle data with protocol 4. + +- bpo-27213: Rework CALL_FUNCTION* opcodes to produce shorter and more + efficient bytecode. Patch by Demur Rumed, design by Serhiy Storchaka, + reviewed by Serhiy Storchaka and Victor Stinner. + +- bpo-26331: Implement tokenizing support for :pep:`515`. Patch by Georg + Brandl. + +- bpo-27999: Make "global after use" a SyntaxError, and ditto for nonlocal. + Patch by Ivan Levkivskyi. + +- bpo-28003: Implement :pep:`525` -- Asynchronous Generators. + +- bpo-27985: Implement :pep:`526` -- Syntax for Variable Annotations. Patch + by Ivan Levkivskyi. + +- bpo-26058: Add a new private version to the builtin dict type, incremented + at each dictionary creation and at each dictionary change. Implementation + of the PEP 509. + +- bpo-27364: A backslash-character pair that is not a valid escape sequence + now generates a DeprecationWarning. Patch by Emanuel Barry. + +- bpo-27350: `dict` implementation is changed like PyPy. It is more compact + and preserves insertion order. (Concept developed by Raymond Hettinger and + patch by Inada Naoki.) + +- bpo-27911: Remove unnecessary error checks in + ``exec_builtin_or_dynamic()``. + +- bpo-27078: Added BUILD_STRING opcode. Optimized f-strings evaluation. + +- bpo-17884: Python now requires systems with inttypes.h and stdint.h + +- bpo-27961: Require platforms to support ``long long``. Python hasn't + compiled without ``long long`` for years, so this is basically a + formality. + +- bpo-27355: Removed support for Windows CE. It was never finished, and + Windows CE is no longer a relevant platform for Python. + +- Implement :pep:`523`. + +- bpo-27870: A left shift of zero by a large integer no longer attempts to + allocate large amounts of memory. + +- bpo-25402: In int-to-decimal-string conversion, improve the estimate of + the intermediate memory required, and remove an unnecessarily strict + overflow check. Patch by Serhiy Storchaka. + +- bpo-27214: In long_invert, be more careful about modifying object returned + by long_add, and remove an unnecessary check for small longs. Thanks Oren + Milman for analysis and patch. + +- bpo-27506: Support passing the bytes/bytearray.translate() "delete" + argument by keyword. + +- bpo-27812: Properly clear out a generator's frame's backreference to the + generator to prevent crashes in frame.clear(). + +- bpo-27811: Fix a crash when a coroutine that has not been awaited is + finalized with warnings-as-errors enabled. + +- bpo-27587: Fix another issue found by PVS-Studio: Null pointer check after + use of 'def' in _PyState_AddModule(). Initial patch by Christian Heimes. + +- bpo-27792: The modulo operation applied to ``bool`` and other ``int`` + subclasses now always returns an ``int``. Previously the return type + depended on the input values. Patch by Xiang Zhang. + +- bpo-26984: int() now always returns an instance of exact int. + +- bpo-25604: Fix a minor bug in integer true division; this bug could + potentially have caused off-by-one-ulp results on platforms with + unreliable ldexp implementations. + +- bpo-24254: Make class definition namespace ordered by default. + +- bpo-27662: Fix an overflow check in ``List_New``: the original code was + checking against ``Py_SIZE_MAX`` instead of the correct upper bound of + ``Py_SSIZE_T_MAX``. Patch by Xiang Zhang. + +- bpo-27782: Multi-phase extension module import now correctly allows the + ``m_methods`` field to be used to add module level functions to instances + of non-module types returned from ``Py_create_mod``. Patch by Xiang Zhang. + +- bpo-27936: The round() function accepted a second None argument for some + types but not for others. Fixed the inconsistency by accepting None for + all numeric types. + +- bpo-27487: Warn if a submodule argument to "python -m" or + runpy.run_module() is found in sys.modules after parent packages are + imported, but before the submodule is executed. + +- bpo-27157: Make only type() itself accept the one-argument form. Patch by + Eryk Sun and Emanuel Barry. + +- bpo-27558: Fix a SystemError in the implementation of "raise" statement. + In a brand new thread, raise a RuntimeError since there is no active + exception to reraise. Patch written by Xiang Zhang. + +- bpo-28008: Implement :pep:`530` -- asynchronous comprehensions. + +- bpo-27942: Fix memory leak in codeobject.c + +Library +------- + +- bpo-28732: Fix crash in os.spawnv() with no elements in args + +- bpo-28485: Always raise ValueError for negative + compileall.compile_dir(workers=...) parameter, even when multithreading is + unavailable. + +- bpo-28037: Use sqlite3_get_autocommit() instead of setting + Connection->inTransaction manually. + +- bpo-25283: Attributes tm_gmtoff and tm_zone are now available on all + platforms in the return values of time.localtime() and time.gmtime(). + +- bpo-24454: Regular expression match object groups are now accessible using + __getitem__. "mo[x]" is equivalent to "mo.group(x)". + +- bpo-10740: sqlite3 no longer implicitly commit an open transaction before + DDL statements. + +- bpo-17941: Add a *module* parameter to collections.namedtuple(). + +- bpo-22493: Inline flags now should be used only at the start of the + regular expression. Deprecation warning is emitted if uses them in the + middle of the regular expression. + +- bpo-26885: xmlrpc now supports unmarshalling additional data types used by + Apache XML-RPC implementation for numerics and None. + +- bpo-28070: Fixed parsing inline verbose flag in regular expressions. + +- bpo-19500: Add client-side SSL session resumption to the ssl module. + +- bpo-28022: Deprecate ssl-related arguments in favor of SSLContext. The + deprecation include manual creation of SSLSocket and certfile/keyfile (or + similar) in ftplib, httplib, imaplib, smtplib, poplib and urllib. + +- bpo-28043: SSLContext has improved default settings: OP_NO_SSLv2, + OP_NO_SSLv3, OP_NO_COMPRESSION, OP_CIPHER_SERVER_PREFERENCE, + OP_SINGLE_DH_USE, OP_SINGLE_ECDH_USE and HIGH ciphers without MD5. + +- bpo-24693: Changed some RuntimeError's in the zipfile module to more + appropriate types. Improved some error messages and debugging output. + +- bpo-17909: ``json.load`` and ``json.loads`` now support binary input + encoded as UTF-8, UTF-16 or UTF-32. Patch by Serhiy Storchaka. + +- bpo-27137: the pure Python fallback implementation of + ``functools.partial`` now matches the behaviour of its accelerated C + counterpart for subclassing, pickling and text representation purposes. + Patch by Emanuel Barry and Serhiy Storchaka. + +- Fix possible integer overflows and crashes in the mmap module with unusual + usage patterns. + +- bpo-1703178: Fix the ability to pass the --link-objects option to the + distutils build_ext command. + +- bpo-28019: itertools.count() no longer rounds non-integer step in range + between 1.0 and 2.0 to 1. + +- bpo-18401: Pdb now supports the 'readrc' keyword argument to control + whether .pdbrc files should be read. Patch by Martin Matusiak and Sam + Kimbrel. + +- bpo-25969: Update the lib2to3 grammar to handle the unpacking + generalizations added in 3.5. + +- bpo-14977: mailcap now respects the order of the lines in the mailcap + files ("first match"), as required by RFC 1542. Patch by Michael Lazar. + +- bpo-28082: Convert re flag constants to IntFlag. + +- bpo-28025: Convert all ssl module constants to IntEnum and IntFlags. + SSLContext properties now return flags and enums. + +- bpo-23591: Add Flag, IntFlag, and auto() to enum module. + +- bpo-433028: Added support of modifier spans in regular expressions. + +- bpo-24594: Validates persist parameter when opening MSI database + +- bpo-17582: xml.etree.ElementTree nows preserves whitespaces in attributes + (Patch by Duane Griffin. Reviewed and approved by Stefan Behnel.) + +- bpo-28047: Fixed calculation of line length used for the base64 CTE in the + new email policies. + +- bpo-27576: Fix call order in OrderedDict.__init__(). + +- email.generator.DecodedGenerator now supports the policy keyword. + +- bpo-28027: Remove undocumented modules from ``Lib/plat-*``: IN, CDROM, + DLFCN, TYPES, CDIO, and STROPTS. + +- bpo-27445: Don't pass str(_charset) to MIMEText.set_payload(). Patch by + Claude Paroz. + +- bpo-24277: The new email API is no longer provisional, and the docs have + been reorganized and rewritten to emphasize the new API. + +- bpo-22450: urllib now includes an ``Accept: */*`` header among the default + headers. This makes the results of REST API requests more consistent and + predictable especially when proxy servers are involved. + +- lib2to3.pgen3.driver.load_grammar() now creates a stable cache file + between runs given the same Grammar.txt input regardless of the hash + randomization setting. + +- bpo-28005: Allow ImportErrors in encoding implementation to propagate. + +- bpo-26667: Support path-like objects in importlib.util. + +- bpo-27570: Avoid zero-length memcpy() etc calls with null source pointers + in the "ctypes" and "array" modules. + +- bpo-22233: Break email header lines *only* on the RFC specified CR and LF + characters, not on arbitrary unicode line breaks. This also fixes a bug + in HTTP header parsing. + +- bpo-27331: The email.mime classes now all accept an optional policy + keyword. + +- bpo-27988: Fix email iter_attachments incorrect mutation of payload list. + +- bpo-16113: Add SHA-3 and SHAKE support to hashlib module. + +- Eliminate a tautological-pointer-compare warning in _scproxy.c. + +- bpo-27776: The :func:`os.urandom` function does now block on Linux 3.17 + and newer until the system urandom entropy pool is initialized to increase + the security. This change is part of the :pep:`524`. + +- bpo-27778: Expose the Linux ``getrandom()`` syscall as a new + :func:`os.getrandom` function. This change is part of the :pep:`524`. + +- bpo-27691: Fix ssl module's parsing of GEN_RID subject alternative name + fields in X.509 certs. + +- bpo-18844: Add random.choices(). + +- bpo-25761: Improved error reporting about truncated pickle data in C + implementation of unpickler. UnpicklingError is now raised instead of + AttributeError and ValueError in some cases. + +- bpo-26798: Add BLAKE2 (blake2b and blake2s) to hashlib. + +- bpo-26032: Optimized globbing in pathlib by using os.scandir(); it is now + about 1.5--4 times faster. + +- bpo-25596: Optimized glob() and iglob() functions in the glob module; they + are now about 3--6 times faster. + +- bpo-27928: Add scrypt (password-based key derivation function) to hashlib + module (requires OpenSSL 1.1.0). + +- bpo-27850: Remove 3DES from ssl module's default cipher list to counter + measure sweet32 attack (CVE-2016-2183). + +- bpo-27766: Add ChaCha20 Poly1305 to ssl module's default cipher list. + (Required OpenSSL 1.1.0 or LibreSSL). + +- bpo-25387: Check return value of winsound.MessageBeep. + +- bpo-27866: Add SSLContext.get_ciphers() method to get a list of all + enabled ciphers. + +- bpo-27744: Add AF_ALG (Linux Kernel crypto) to socket module. + +- bpo-26470: Port ssl and hashlib module to OpenSSL 1.1.0. + +- bpo-11620: Fix support for SND_MEMORY in winsound.PlaySound. Based on a + patch by Tim Lesher. + +- bpo-11734: Add support for IEEE 754 half-precision floats to the struct + module. Based on a patch by Eli Stevens. + +- bpo-27919: Deprecated ``extra_path`` distribution option in distutils + packaging. + +- bpo-23229: Add new ``cmath`` constants: ``cmath.inf`` and ``cmath.nan`` to + match ``math.inf`` and ``math.nan``, and also ``cmath.infj`` and + ``cmath.nanj`` to match the format used by complex repr. + +- bpo-27842: The csv.DictReader now returns rows of type OrderedDict. + (Contributed by Steve Holden.) + +- Remove support for passing a file descriptor to os.access. It never worked + but previously didn't raise. + +- bpo-12885: Fix error when distutils encounters symlink. + +- bpo-27881: Fixed possible bugs when setting + sqlite3.Connection.isolation_level. Based on patch by Xiang Zhang. + +- bpo-27861: Fixed a crash in sqlite3.Connection.cursor() when a factory + creates not a cursor. Patch by Xiang Zhang. + +- bpo-19884: Avoid spurious output on OS X with Gnu Readline. + +- bpo-27706: Restore deterministic behavior of random.Random().seed() for + string seeds using seeding version 1. Allows sequences of calls to + random() to exactly match those obtained in Python 2. Patch by Nofar + Schnider. + +- bpo-10513: Fix a regression in Connection.commit(). Statements should not + be reset after a commit. + +- bpo-12319: Chunked transfer encoding support added to + http.client.HTTPConnection requests. The + urllib.request.AbstractHTTPHandler class does not enforce a Content-Length + header any more. If a HTTP request has a file or iterable body, but no + Content-Length header, the library now falls back to use chunked + transfer-encoding. + +- A new version of typing.py from https://github.com/python/typing: - + Collection (only for 3.6) (Issue #27598) - Add FrozenSet to __all__ + (upstream #261) - fix crash in _get_type_vars() (upstream #259) - Remove + the dict constraint in ForwardRef._eval_type (upstream #252) + +- bpo-27832: Make ``_normalize`` parameter to ``Fraction`` constructor + keyword-only, so that ``Fraction(2, 3, 4)`` now raises ``TypeError``. + +- bpo-27539: Fix unnormalised ``Fraction.__pow__`` result in the case of + negative exponent and negative base. + +- bpo-21718: cursor.description is now available for queries using CTEs. + +- bpo-27819: In distutils sdists, simply produce the "gztar" (gzipped tar + format) distributions on all platforms unless "formats" is supplied. + +- bpo-2466: posixpath.ismount now correctly recognizes mount points which + the user does not have permission to access. + +- bpo-9998: On Linux, ctypes.util.find_library now looks in LD_LIBRARY_PATH + for shared libraries. + +- bpo-27573: exit message for code.interact is now configurable. + +- bpo-27930: Improved behaviour of logging.handlers.QueueListener. Thanks to + Paulo Andrade and Petr Viktorin for the analysis and patch. + +- bpo-6766: Distributed reference counting added to multiprocessing to + support nesting of shared values / proxy objects. + +- bpo-21201: Improves readability of multiprocessing error message. Thanks + to Wojciech Walczak for patch. + +- asyncio: Add set_protocol / get_protocol to Transports. + +- bpo-27456: asyncio: Set TCP_NODELAY by default. + +IDLE +---- + +- bpo-15308: Add 'interrupt execution' (^C) to Shell menu. Patch by Roger + Serwy, updated by Bayard Randel. + +- bpo-27922: Stop IDLE tests from 'flashing' gui widgets on the screen. + +- bpo-27891: Consistently group and sort imports within idlelib modules. + +- bpo-17642: add larger font sizes for classroom projection. + +- Add version to title of IDLE help window. + +- bpo-25564: In section on IDLE -- console differences, mention that using + exec means that __builtins__ is defined for each statement. + +- bpo-27821: Fix 3.6.0a3 regression that prevented custom key sets from + being selected when no custom theme was defined. + +C API +----- + +- bpo-26900: Excluded underscored names and other private API from limited + API. + +- bpo-26027: Add support for path-like objects in PyUnicode_FSConverter() & + PyUnicode_FSDecoder(). + +Tests +----- + +- bpo-27427: Additional tests for the math module. Patch by Francisco Couzo. + +- bpo-27953: Skip math and cmath tests that fail on OS X 10.4 due to a poor + libm implementation of tan. + +- bpo-26040: Improve test_math and test_cmath coverage and rigour. Patch by + Jeff Allen. + +- bpo-27787: Call gc.collect() before checking each test for "dangling + threads", since the dangling threads are weak references. + +Build +----- + +- bpo-27566: Fix clean target in freeze makefile (patch by Lisa Roach) + +- bpo-27705: Update message in validate_ucrtbase.py + +- bpo-27976: Deprecate building _ctypes with the bundled copy of libffi on + non-OSX UNIX platforms. + +- bpo-27983: Cause lack of llvm-profdata tool when using clang as required + for PGO linking to be a configure time error rather than make time when + ``--with-optimizations`` is enabled. Also improve our ability to find the + llvm-profdata tool on MacOS and some Linuxes. + +- bpo-21590: Support for DTrace and SystemTap probes. + +- bpo-26307: The profile-opt build now applies PGO to the built-in modules. + +- bpo-26359: Add the --with-optimizations flag to turn on LTO and PGO build + support when available. + +- bpo-27917: Set platform triplets for Android builds. + +- bpo-25825: Update references to the $(LIBPL) installation path on AIX. + This path was changed in 3.2a4. + +- Update OS X installer to use SQLite 3.14.1 and XZ 5.2.2. + +- bpo-21122: Fix LTO builds on OS X. + +- bpo-17128: Build OS X installer with a private copy of OpenSSL. Also + provide a sample Install Certificates command script to install a set of + root certificates from the third-party certifi module. + +Tools/Demos +----------- + +- bpo-27952: Get Tools/scripts/fixcid.py working with Python 3 and the + current "re" module, avoid invalid Python backslash escapes, and fix a bug + parsing escaped C quote signs. + +Windows +------- + +- bpo-28065: Update xz dependency to 5.2.2 and build it from source. + +- bpo-25144: Ensures TargetDir is set before continuing with custom install. + +- bpo-1602: Windows console doesn't input or print Unicode (PEP 528) + +- bpo-27781: Change file system encoding on Windows to UTF-8 (PEP 529) + +- bpo-27731: Opt-out of MAX_PATH on Windows 10 + +- bpo-6135: Adds encoding and errors parameters to subprocess. + +- bpo-27959: Adds oem encoding, alias ansi to mbcs, move aliasmbcs to codec + lookup. + +- bpo-27982: The functions of the winsound module now accept keyword + arguments. + +- bpo-20366: Build full text search support into SQLite on Windows. + +- bpo-27756: Adds new icons for Python files and processes on Windows. + Designs by Cherry Wang. + +- bpo-27883: Update sqlite to 3.14.1.0 on Windows. + + +What's New in Python 3.6.0 alpha 4? +=================================== + +*Release date: 2016-08-15* + +Core and Builtins +----------------- + +- bpo-27704: Optimized creating bytes and bytearray from byte-like objects + and iterables. Speed up to 3 times for short objects. Original patch by + Naoki Inada. + +- bpo-26823: Large sections of repeated lines in tracebacks are now + abbreviated as "[Previous line repeated {count} more times]" by the + builtin traceback rendering. Patch by Emanuel Barry. + +- bpo-27574: Decreased an overhead of parsing keyword arguments in functions + implemented with using Argument Clinic. + +- bpo-22557: Now importing already imported modules is up to 2.5 times + faster. + +- bpo-17596: Include to help with Min GW building. + +- bpo-17599: On Windows, rename the privately defined REPARSE_DATA_BUFFER + structure to avoid conflicting with the definition from Min GW. + +- bpo-27507: Add integer overflow check in bytearray.extend(). Patch by + Xiang Zhang. + +- bpo-27581: Don't rely on wrapping for overflow check in + PySequence_Tuple(). Patch by Xiang Zhang. + +- bpo-1621: Avoid signed integer overflow in list and tuple operations. + Patch by Xiang Zhang. + +- bpo-27419: Standard __import__() no longer look up "__import__" in globals + or builtins for importing submodules or "from import". Fixed a crash if + raise a warning about unabling to resolve package from __spec__ or + __package__. + +- bpo-27083: Respect the PYTHONCASEOK environment variable under Windows. + +- bpo-27514: Make having too many statically nested blocks a SyntaxError + instead of SystemError. + +- bpo-27366: Implemented :pep:`487` (Simpler customization of class + creation). Upon subclassing, the __init_subclass__ classmethod is called + on the base class. Descriptors are initialized with __set_name__ after + class creation. + +Library +------- + +- bpo-26027: Add :pep:`519`/__fspath__() support to the os and os.path + modules. Includes code from Jelle Zijlstra. (See also: bpo-27524) + +- bpo-27598: Add Collections to collections.abc. Patch by Ivan Levkivskyi, + docs by Neil Girdhar. + +- bpo-25958: Support "anti-registration" of special methods from various + ABCs, like __hash__, __iter__ or __len__. All these (and several more) + can be set to None in an implementation class and the behavior will be as + if the method is not defined at all. (Previously, this mechanism existed + only for __hash__, to make mutable classes unhashable.) Code contributed + by Andrew Barnert and Ivan Levkivskyi. + +- bpo-16764: Support keyword arguments to zlib.decompress(). Patch by Xiang + Zhang. + +- bpo-27736: Prevent segfault after interpreter re-initialization due to ref + count problem introduced in code for Issue #27038 in 3.6.0a3. Patch by + Xiang Zhang. + +- bpo-25628: The *verbose* and *rename* parameters for + collections.namedtuple are now keyword-only. + +- bpo-12345: Add mathematical constant tau to math and cmath. See also + :pep:`628`. + +- bpo-26823: traceback.StackSummary.format now abbreviates large sections of + repeated lines as "[Previous line repeated {count} more times]" (this + change then further affects other traceback display operations in the + module). Patch by Emanuel Barry. + +- bpo-27664: Add to concurrent.futures.thread.ThreadPoolExecutor() the + ability to specify a thread name prefix. + +- bpo-27181: Add geometric_mean and harmonic_mean to statistics module. + +- bpo-27573: code.interact now prints an message when exiting. + +- bpo-6422: Add autorange method to timeit.Timer objects. + +- bpo-27773: Correct some memory management errors server_hostname in + _ssl.wrap_socket(). + +- bpo-26750: unittest.mock.create_autospec() now works properly for + subclasses of property() and other data descriptors. Removes the never + publicly used, never documented unittest.mock.DescriptorTypes tuple. + +- bpo-26754: Undocumented support of general bytes-like objects as path in + compile() and similar functions is now deprecated. + +- bpo-26800: Undocumented support of general bytes-like objects as paths in + os functions is now deprecated. + +- bpo-26981: Add _order_ compatibility shim to enum.Enum for Python 2/3 code + bases. + +- bpo-27661: Added tzinfo keyword argument to datetime.combine. + +- In the curses module, raise an error if window.getstr() or window.instr() + is passed a negative value. + +- bpo-27783: Fix possible usage of uninitialized memory in + operator.methodcaller. + +- bpo-27774: Fix possible Py_DECREF on unowned object in _sre. + +- bpo-27760: Fix possible integer overflow in binascii.b2a_qp. + +- bpo-27758: Fix possible integer overflow in the _csv module for large + record lengths. + +- bpo-27568: Prevent HTTPoxy attack (CVE-2016-1000110). Ignore the + HTTP_PROXY variable when REQUEST_METHOD environment is set, which + indicates that the script is in CGI mode. + +- bpo-7063: Remove dead code from the "array" module's slice handling. Patch + by Chuck. + +- bpo-27656: Do not assume sched.h defines any SCHED_* constants. + +- bpo-27130: In the "zlib" module, fix handling of large buffers (typically + 4 GiB) when compressing and decompressing. Previously, inputs were + limited to 4 GiB, and compression and decompression operations did not + properly handle results of 4 GiB. + +- bpo-24773: Implemented :pep:`495` (Local Time Disambiguation). + +- Expose the EPOLLEXCLUSIVE constant (when it is defined) in the select + module. + +- bpo-27567: Expose the EPOLLRDHUP and POLLRDHUP constants in the select + module. + +- bpo-1621: Avoid signed int negation overflow in the "audioop" module. + +- bpo-27533: Release GIL in nt._isdir + +- bpo-17711: Fixed unpickling by the persistent ID with protocol 0. Original + patch by Alexandre Vassalotti. + +- bpo-27522: Avoid an unintentional reference cycle in email.feedparser. + +- bpo-27512: Fix a segfault when os.fspath() called an __fspath__() method + that raised an exception. Patch by Xiang Zhang. + +IDLE +---- + +- bpo-27714: text_textview and test_autocomplete now pass when re-run in the + same process. This occurs when test_idle fails when run with the -w + option but without -jn. Fix warning from test_config. + +- bpo-27621: Put query response validation error messages in the query box + itself instead of in a separate messagebox. Redo tests to match. Add Mac + OSX refinements. Original patch by Mark Roseman. + +- bpo-27620: Escape key now closes Query box as cancelled. + +- bpo-27609: IDLE: tab after initial whitespace should tab, not + autocomplete. This fixes problem with writing docstrings at least twice + indented. + +- bpo-27609: Explicitly return None when there are also non-None returns. In + a few cases, reverse a condition and eliminate a return. + +- bpo-25507: IDLE no longer runs buggy code because of its tkinter imports. + Users must include the same imports required to run directly in Python. + +- bpo-27173: Add 'IDLE Modern Unix' to the built-in key sets. Make the + default key set depend on the platform. Add tests for the changes to the + config module. + +- bpo-27452: add line counter and crc to IDLE configHandler test dump. + +Tests +----- + +- bpo-25805: Skip a test in test_pkgutil as needed that doesn't work when + ``__name__ == __main__``. Patch by SilentGhost. + +- bpo-27472: Add test.support.unix_shell as the path to the default shell. + +- bpo-27369: In test_pyexpat, avoid testing an error message detail that + changed in Expat 2.2.0. + +- bpo-27594: Prevent assertion error when running test_ast with coverage + enabled: ensure code object has a valid first line number. Patch suggested + by Ivan Levkivskyi. + +Windows +------- + +- bpo-27647: Update bundled Tcl/Tk to 8.6.6. + +- bpo-27610: Adds :pep:`514` metadata to Windows installer + +- bpo-27469: Adds a shell extension to the launcher so that drag and drop + works correctly. + +- bpo-27309: Enables proper Windows styles in python[w].exe manifest. + +Build +----- + +- bpo-27713: Suppress spurious build warnings when updating importlib's + bootstrap files. Patch by Xiang Zhang + +- bpo-25825: Correct the references to Modules/python.exp, which is required + on AIX. The references were accidentally changed in 3.5.0a1. + +- bpo-27453: CPP invocation in configure must use CPPFLAGS. Patch by Chi + Hsuan Yen. + +- bpo-27641: The configure script now inserts comments into the makefile to + prevent the pgen and _freeze_importlib executables from being + cross-compiled. + +- bpo-26662: Set PYTHON_FOR_GEN in configure as the Python program to be + used for file generation during the build. + +- bpo-10910: Avoid C++ compilation errors on FreeBSD and OS X. Also update + FreedBSD version checks for the original ctype UTF-8 workaround. + + +What's New in Python 3.6.0 alpha 3? +=================================== + +*Release date: 2016-07-11* + +Core and Builtins +----------------- + +- bpo-27473: Fixed possible integer overflow in bytes and bytearray + concatenations. Patch by Xiang Zhang. + +- bpo-23034: The output of a special Python build with defined COUNT_ALLOCS, + SHOW_ALLOC_COUNT or SHOW_TRACK_COUNT macros is now off by default. It + can be re-enabled using the "-X showalloccount" option. It now outputs to + stderr instead of stdout. + +- bpo-27443: __length_hint__() of bytearray iterators no longer return a + negative integer for a resized bytearray. + +- bpo-27007: The fromhex() class methods of bytes and bytearray subclasses + now return an instance of corresponding subclass. + +Library +------- + +- bpo-26844: Fix error message for imp.find_module() to refer to 'path' + instead of 'name'. Patch by Lev Maximov. + +- bpo-23804: Fix SSL zero-length recv() calls to not block and not raise an + error about unclean EOF. + +- bpo-27466: Change time format returned by http.cookie.time2netscape, + confirming the netscape cookie format and making it consistent with + documentation. + +- bpo-21708: Deprecated dbm.dumb behavior that differs from common dbm + behavior: creating a database in 'r' and 'w' modes and modifying a + database in 'r' mode. + +- bpo-26721: Change the socketserver.StreamRequestHandler.wfile attribute to + implement BufferedIOBase. In particular, the write() method no longer does + partial writes. + +- bpo-22115: Added methods trace_add, trace_remove and trace_info in the + tkinter.Variable class. They replace old methods trace_variable, trace, + trace_vdelete and trace_vinfo that use obsolete Tcl commands and might not + work in future versions of Tcl. Fixed old tracing methods: + trace_vdelete() with wrong mode no longer break tracing, trace_vinfo() now + always returns a list of pairs of strings, tracing in the "u" mode now + works. + +- bpo-26243: Only the level argument to zlib.compress() is keyword argument + now. The first argument is positional-only. + +- bpo-27038: Expose the DirEntry type as os.DirEntry. Code patch by Jelle + Zijlstra. + +- bpo-27186: Update os.fspath()/PyOS_FSPath() to check the return value of + __fspath__() to be either str or bytes. + +- bpo-18726: All optional parameters of the dump(), dumps(), load() and + loads() functions and JSONEncoder and JSONDecoder class constructors in + the json module are now keyword-only. + +- bpo-27319: Methods selection_set(), selection_add(), selection_remove() + and selection_toggle() of ttk.TreeView now allow passing multiple items as + multiple arguments instead of passing them as a tuple. Deprecated + undocumented ability of calling the selection() method with arguments. + +- bpo-27079: Fixed curses.ascii functions isblank(), iscntrl() and + ispunct(). + +- bpo-27294: Numerical state in the repr for Tkinter event objects is now + represented as a combination of known flags. + +- bpo-27177: Match objects in the re module now support index-like objects + as group indices. Based on patches by Jeroen Demeyer and Xiang Zhang. + +- bpo-26754: Some functions (compile() etc) accepted a filename argument + encoded as an iterable of integers. Now only strings and byte-like objects + are accepted. + +- bpo-26536: socket.ioctl now supports SIO_LOOPBACK_FAST_PATH. Patch by + Daniel Stokes. + +- bpo-27048: Prevents distutils failing on Windows when environment + variables contain non-ASCII characters + +- bpo-27330: Fixed possible leaks in the ctypes module. + +- bpo-27238: Got rid of bare excepts in the turtle module. Original patch + by Jelle Zijlstra. + +- bpo-27122: When an exception is raised within the context being managed by + a contextlib.ExitStack() and one of the exit stack generators catches and + raises it in a chain, do not re-raise the original exception when exiting, + let the new chained one through. This avoids the :pep:`479` bug described + in issue25782. + +Security +-------- + +- bpo-27278: Fix os.urandom() implementation using getrandom() on Linux. + Truncate size to INT_MAX and loop until we collected enough random bytes, + instead of casting a directly Py_ssize_t to int. + +Library +------- + +- bpo-16864: sqlite3.Cursor.lastrowid now supports REPLACE statement. + Initial patch by Alex LordThorsen. + +- bpo-26386: Fixed ttk.TreeView selection operations with item id's + containing spaces. + +- bpo-8637: Honor a pager set by the env var MANPAGER (in preference to one + set by the env var PAGER). + +Security +-------- + +- bpo-22636: Avoid shell injection problems with ctypes.util.find_library(). + +Library +------- + +- bpo-16182: Fix various functions in the "readline" module to use the + locale encoding, and fix get_begidx() and get_endidx() to return code + point indexes. + +- bpo-27392: Add loop.connect_accepted_socket(). Patch by Jim Fulton. + +IDLE +---- + +- bpo-27477: IDLE search dialogs now use ttk widgets. + +- bpo-27173: Add 'IDLE Modern Unix' to the built-in key sets. Make the + default key set depend on the platform. Add tests for the changes to the + config module. + +- bpo-27452: make command line "idle-test> python test_help.py" work. + __file__ is relative when python is started in the file's directory. + +- bpo-27452: add line counter and crc to IDLE configHandler test dump. + +- bpo-27380: IDLE: add query.py with base Query dialog and ttk widgets. + Module had subclasses SectionName, ModuleName, and HelpSource, which are + used to get information from users by configdialog and file =>Load Module. + Each subclass has itw own validity checks. Using ModuleName allows users + to edit bad module names instead of starting over. Add tests and delete + the two files combined into the new one. + +- bpo-27372: Test_idle no longer changes the locale. + +- bpo-27365: Allow non-ascii chars in IDLE NEWS.txt, for contributor names. + +- bpo-27245: IDLE: Cleanly delete custom themes and key bindings. + Previously, when IDLE was started from a console or by import, a cascade + of warnings was emitted. Patch by Serhiy Storchaka. + +- bpo-24137: Run IDLE, test_idle, and htest with tkinter default root + disabled. Fix code and tests that fail with this restriction. Fix htests + to not create a second and redundant root and mainloop. + +- bpo-27310: Fix IDLE.app failure to launch on OS X due to vestigial import. + +C API +----- + +- bpo-26754: PyUnicode_FSDecoder() accepted a filename argument encoded as + an iterable of integers. Now only strings and byte-like objects are + accepted. + +Build +----- + +- bpo-28066: Fix the logic that searches build directories for generated + include files when building outside the source tree. + +- bpo-27442: Expose the Android API level that python was built against, in + sysconfig.get_config_vars() as 'ANDROID_API_LEVEL'. + +- bpo-27434: The interpreter that runs the cross-build, found in PATH, must + now be of the same feature version (e.g. 3.6) as the source being built. + +- bpo-26930: Update Windows builds to use OpenSSL 1.0.2h. + +- bpo-23968: Rename the platform directory from plat-$(MACHDEP) to + plat-$(PLATFORM_TRIPLET). Rename the config directory (LIBPL) from + config-$(LDVERSION) to config-$(LDVERSION)-$(PLATFORM_TRIPLET). Install + the platform specific _sysconfigdata module into the platform directory + and rename it to include the ABIFLAGS. + +- Don't use largefile support for GNU/Hurd. + +Tools/Demos +----------- + +- bpo-27332: Fixed the type of the first argument of module-level functions + generated by Argument Clinic. Patch by Petr Viktorin. + +- bpo-27418: Fixed Tools/importbench/importbench.py. + +Documentation +------------- + +- bpo-19489: Moved the search box from the sidebar to the header and footer + of each page. Patch by Ammar Askar. + +- bpo-27285: Update documentation to reflect the deprecation of ``pyvenv`` + and normalize on the term "virtual environment". Patch by Steve Piercy. + +Tests +----- + +- bpo-27027: Added test.support.is_android that is True when this is an + Android build. + + +What's New in Python 3.6.0 alpha 2? +=================================== + +*Release date: 2016-06-13* + +Core and Builtins +----------------- + +- bpo-27095: Simplified MAKE_FUNCTION and removed MAKE_CLOSURE opcodes. + Patch by Demur Rumed. + +- bpo-27190: Raise NotSupportedError if sqlite3 is older than 3.3.1. Patch + by Dave Sawyer. + +- bpo-27286: Fixed compiling BUILD_MAP_UNPACK_WITH_CALL opcode. Calling + function with generalized unpacking (PEP 448) and conflicting keyword + names could cause undefined behavior. + +- bpo-27140: Added BUILD_CONST_KEY_MAP opcode. + +- bpo-27186: Add support for os.PathLike objects to open() (part of + :pep:`519`). + +- bpo-27066: Fixed SystemError if a custom opener (for open()) returns a + negative number without setting an exception. + +- bpo-26983: float() now always return an instance of exact float. The + deprecation warning is emitted if __float__ returns an instance of a + strict subclass of float. In a future versions of Python this can be an + error. + +- bpo-27097: Python interpreter is now about 7% faster due to optimized + instruction decoding. Based on patch by Demur Rumed. + +- bpo-26647: Python interpreter now uses 16-bit wordcode instead of + bytecode. Patch by Demur Rumed. + +- bpo-23275: Allow assigning to an empty target list in round brackets: () = + iterable. + +- bpo-27243: Update the __aiter__ protocol: instead of returning an + awaitable that resolves to an asynchronous iterator, the asynchronous + iterator should be returned directly. Doing the former will trigger a + PendingDeprecationWarning. + +Library +------- + +- Comment out socket (SO_REUSEPORT) and posix (O_SHLOCK, O_EXLOCK) constants + exposed on the API which are not implemented on GNU/Hurd. They would not + work at runtime anyway. + +- bpo-27025: Generated names for Tkinter widgets are now more meaningful and + recognizable. + +- bpo-25455: Fixed crashes in repr of recursive ElementTree.Element and + functools.partial objects. + +- bpo-27294: Improved repr for Tkinter event objects. + +- bpo-20508: Improve exception message of IPv{4,6}Network.__getitem__. Patch + by Gareth Rees. + +Security +-------- + +- bpo-26556: Update expat to 2.1.1, fixes CVE-2015-1283. + +- Fix TLS stripping vulnerability in smtplib, CVE-2016-0772. Reported by + Team Oststrom. + +Library +------- + +- bpo-21386: Implement missing IPv4Address.is_global property. It was + documented since 07a5610bae9d. Initial patch by Roger Luethi. + +- bpo-27029: Removed deprecated support of universal newlines mode from + ZipFile.open(). + +- bpo-27030: Unknown escapes consisting of ``'\'`` and an ASCII letter in + regular expressions now are errors. The re.LOCALE flag now can be used + only with bytes patterns. + +- bpo-27186: Add os.PathLike support to DirEntry (part of :pep:`519`). + Initial patch by Jelle Zijlstra. + +- bpo-20900: distutils register command now decodes HTTP responses + correctly. Initial patch by ingrid. + +- bpo-27186: Add os.PathLike support to pathlib, removing its provisional + status (part of PEP 519). Initial patch by Dusty Phillips. + +- bpo-27186: Add support for os.PathLike objects to os.fsencode() and + os.fsdecode() (part of :pep:`519`). + +- bpo-27186: Introduce os.PathLike and os.fspath() (part of :pep:`519`). + +- A new version of typing.py provides several new classes and features: + @overload outside stubs, Reversible, DefaultDict, Text, ContextManager, + Type[], NewType(), TYPE_CHECKING, and numerous bug fixes (note that some + of the new features are not yet implemented in mypy or other static + analyzers). Also classes for :pep:`492` (Awaitable, AsyncIterable, + AsyncIterator) have been added (in fact they made it into 3.5.1 but were + never mentioned). + +- bpo-25738: Stop http.server.BaseHTTPRequestHandler.send_error() from + sending a message body for 205 Reset Content. Also, don't send Content + header fields in responses that don't have a body. Patch by Susumu + Koshiba. + +- bpo-21313: Fix the "platform" module to tolerate when sys.version contains + truncated build information. + +Security +-------- + +- bpo-26839: On Linux, :func:`os.urandom` now calls ``getrandom()`` with + ``GRND_NONBLOCK`` to fall back on reading ``/dev/urandom`` if the urandom + entropy pool is not initialized yet. Patch written by Colm Buckley. + +Library +------- + +- bpo-23883: Added missing APIs to __all__ to match the documented APIs for + the following modules: cgi, mailbox, mimetypes, plistlib and smtpd. + Patches by Jacek Kołodziej. + +- bpo-27164: In the zlib module, allow decompressing raw Deflate streams + with a predefined zdict. Based on patch by Xiang Zhang. + +- bpo-24291: Fix wsgiref.simple_server.WSGIRequestHandler to completely + write data to the client. Previously it could do partial writes and + truncate data. Also, wsgiref.handler.ServerHandler can now handle stdout + doing partial writes, but this is deprecated. + +- bpo-21272: Use _sysconfigdata.py to initialize distutils.sysconfig. + +- bpo-19611: :mod:`inspect` now reports the implicit ``.0`` parameters + generated by the compiler for comprehension and generator expression + scopes as if they were positional-only parameters called ``implicit0``. + Patch by Jelle Zijlstra. + +- bpo-26809: Add ``__all__`` to :mod:`string`. Patch by Emanuel Barry. + +- bpo-26373: subprocess.Popen.communicate now correctly ignores + BrokenPipeError when the child process dies before .communicate() is + called in more/all circumstances. + +- signal, socket, and ssl module IntEnum constant name lookups now return a + consistent name for values having multiple names. Ex: signal.Signals(6) + now refers to itself as signal.SIGALRM rather than flipping between that + and signal.SIGIOT based on the interpreter's hash randomization seed. + +- bpo-27167: Clarify the subprocess.CalledProcessError error message text + when the child process died due to a signal. + +- bpo-25931: Don't define socketserver.Forking* names on platforms such as + Windows that do not support os.fork(). + +- bpo-21776: distutils.upload now correctly handles HTTPError. Initial patch + by Claudiu Popa. + +- bpo-26526: Replace custom parse tree validation in the parser module with + a simple DFA validator. + +- bpo-27114: Fix SSLContext._load_windows_store_certs fails with + PermissionError + +- bpo-18383: Avoid creating duplicate filters when using filterwarnings and + simplefilter. Based on patch by Alex Shkop. + +- bpo-23026: winreg.QueryValueEx() now return an integer for REG_QWORD type. + +- bpo-26741: subprocess.Popen destructor now emits a ResourceWarning warning + if the child process is still running. + +- bpo-27056: Optimize pickle.load() and pickle.loads(), up to 10% faster to + deserialize a lot of small objects. + +- bpo-21271: New keyword only parameters in reset_mock call. + +IDLE +---- + +- bpo-5124: Paste with text selected now replaces the selection on X11. This + matches how paste works on Windows, Mac, most modern Linux apps, and ttk + widgets. Original patch by Serhiy Storchaka. + +- bpo-24750: Switch all scrollbars in IDLE to ttk versions. Where needed, + minimal tests are added to cover changes. + +- bpo-24759: IDLE requires tk 8.5 and availability ttk widgets. Delete now + unneeded tk version tests and code for older versions. Add test for IDLE + syntax colorizer. + +- bpo-27239: idlelib.macosx.isXyzTk functions initialize as needed. + +- bpo-27262: move Aqua unbinding code, which enable context menus, to + macosx. + +- bpo-24759: Make clear in idlelib.idle_test.__init__ that the directory is + a private implementation of test.test_idle and tool for maintainers. + +- bpo-27196: Stop 'ThemeChanged' warnings when running IDLE tests. These + persisted after other warnings were suppressed in #20567. Apply Serhiy + Storchaka's update_idletasks solution to four test files. Record this + additional advice in idle_test/README.txt + +- bpo-20567: Revise idle_test/README.txt with advice about avoiding tk + warning messages from tests. Apply advice to several IDLE tests. + +- bpo-24225: Update idlelib/README.txt with new file names and event + handlers. + +- bpo-27156: Remove obsolete code not used by IDLE. + +- bpo-27117: Make colorizer htest and turtledemo work with dark themes. Move + code for configuring text widget colors to a new function. + +- bpo-24225: Rename many `idlelib/*.py` and `idle_test/test_*.py` files. + Edit files to replace old names with new names when the old name referred + to the module rather than the class it contained. See the issue and IDLE + section in What's New in 3.6 for more. + +- bpo-26673: When tk reports font size as 0, change to size 10. Such fonts + on Linux prevented the configuration dialog from opening. + +- bpo-21939: Add test for IDLE's percolator. Original patch by Saimadhav + Heblikar. + +- bpo-21676: Add test for IDLE's replace dialog. Original patch by Saimadhav + Heblikar. + +- bpo-18410: Add test for IDLE's search dialog. Original patch by Westley + Martínez. + +- bpo-21703: Add test for undo delegator. Patch mostly by Saimadhav + Heblikar . + +- bpo-27044: Add ConfigDialog.remove_var_callbacks to stop memory leaks. + +- bpo-23977: Add more asserts to test_delegator. + +Documentation +------------- + +- bpo-16484: Change the default PYTHONDOCS URL to "https:", and fix the + resulting links to use lowercase. Patch by Sean Rodman, test by Kaushik + Nadikuditi. + +- bpo-24136: Document the new :pep:`448` unpacking syntax of 3.5. + +- bpo-22558: Add remaining doc links to source code for Python-coded + modules. Patch by Yoni Lavi. + +Tests +----- + +- bpo-25285: regrtest now uses subprocesses when the -j1 command line option + is used: each test file runs in a fresh child process. Before, the -j1 + option was ignored. + +- bpo-25285: Tools/buildbot/test.bat script now uses -j1 by default to run + each test file in fresh child process. + +Windows +------- + +- bpo-27064: The py.exe launcher now defaults to Python 3. The Windows + launcher ``py.exe`` no longer prefers an installed Python 2 version over + Python 3 by default when used interactively. + +Build +----- + +- bpo-27229: Fix the cross-compiling pgen rule for in-tree builds. Patch by + Xavier de Gaye. + +- bpo-26930: Update OS X 10.5+ 32-bit-only installer to build and link with + OpenSSL 1.0.2h. + +Windows +------- + +- bpo-17500: Remove unused and outdated icons. (See also: + https://github.com/python/pythondotorg/issues/945) + +C API +----- + +- bpo-27186: Add the PyOS_FSPath() function (part of :pep:`519`). + +- bpo-26282: PyArg_ParseTupleAndKeywords() now supports positional-only + parameters. + +Tools/Demos +----------- + +- bpo-26282: Argument Clinic now supports positional-only and keyword + parameters in the same function. + + +What's New in Python 3.6.0 alpha 1? +=================================== + +*Release date: 2016-05-16* + +Core and Builtins +----------------- + +- bpo-20041: Fixed TypeError when frame.f_trace is set to None. Patch by + Xavier de Gaye. + +- bpo-26168: Fixed possible refleaks in failing Py_BuildValue() with the "N" + format unit. + +- bpo-26991: Fix possible refleak when creating a function with annotations. + +- bpo-27039: Fixed bytearray.remove() for values greater than 127. Based on + patch by Joe Jevnik. + +- bpo-23640: int.from_bytes() no longer bypasses constructors for + subclasses. + +- bpo-27005: Optimized the float.fromhex() class method for exact float. It + is now 2 times faster. + +- bpo-18531: Single var-keyword argument of dict subtype was passed + unscathed to the C-defined function. Now it is converted to exact dict. + +- bpo-26811: gc.get_objects() no longer contains a broken tuple with NULL + pointer. + +- bpo-20120: Use RawConfigParser for .pypirc parsing, removing support for + interpolation unintentionally added with move to Python 3. Behavior no + longer does any interpolation in .pypirc files, matching behavior in + Python 2.7 and Setuptools 19.0. + +- bpo-26249: Memory functions of the :c:func:`PyMem_Malloc` domain + (:c:data:`PYMEM_DOMAIN_MEM`) now use the :ref:`pymalloc allocator + ` rather than system :c:func:`malloc`. Applications calling + :c:func:`PyMem_Malloc` without holding the GIL can now crash: use + ``PYTHONMALLOC=debug`` environment variable to validate the usage of + memory allocators in your application. + +- bpo-26802: Optimize function calls only using unpacking like + ``func(*tuple)`` (no other positional argument, no keyword): avoid copying + the tuple. Patch written by Joe Jevnik. + +- bpo-26659: Make the builtin slice type support cycle collection. + +- bpo-26718: super.__init__ no longer leaks memory if called multiple times. + NOTE: A direct call of super.__init__ is not endorsed! + +- bpo-27138: Fix the doc comment for FileFinder.find_spec(). + +- bpo-27147: Mention :pep:`420` in the importlib docs. + +- bpo-25339: PYTHONIOENCODING now has priority over locale in setting the + error handler for stdin and stdout. + +- bpo-26494: Fixed crash on iterating exhausting iterators. Affected classes + are generic sequence iterators, iterators of str, bytes, bytearray, list, + tuple, set, frozenset, dict, OrderedDict, corresponding views and + os.scandir() iterator. + +- bpo-26574: Optimize ``bytes.replace(b'', b'.')`` and + ``bytearray.replace(b'', b'.')``. Patch written by Josh Snider. + +- bpo-26581: If coding cookie is specified multiple times on a line in + Python source code file, only the first one is taken to account. + +- bpo-19711: Add tests for reloading namespace packages. + +- bpo-21099: Switch applicable importlib tests to use :pep:`451` API. + +- bpo-26563: Debug hooks on Python memory allocators now raise a fatal error + if functions of the :c:func:`PyMem_Malloc` family are called without + holding the GIL. + +- bpo-26564: On error, the debug hooks on Python memory allocators now use + the :mod:`tracemalloc` module to get the traceback where a memory block + was allocated. + +- bpo-26558: The debug hooks on Python memory allocator + :c:func:`PyObject_Malloc` now detect when functions are called without + holding the GIL. + +- bpo-26516: Add :envvar:`PYTHONMALLOC` environment variable to set the + Python memory allocators and/or install debug hooks. + +- bpo-26516: The :c:func:`PyMem_SetupDebugHooks` function can now also be + used on Python compiled in release mode. + +- bpo-26516: The :envvar:`PYTHONMALLOCSTATS` environment variable can now + also be used on Python compiled in release mode. It now has no effect if + set to an empty string. + +- bpo-26516: In debug mode, debug hooks are now also installed on Python + memory allocators when Python is configured without pymalloc. + +- bpo-26464: Fix str.translate() when string is ASCII and first replacements + removes character, but next replacement uses a non-ASCII character or a + string longer than 1 character. Regression introduced in Python 3.5.0. + +- bpo-22836: Ensure exception reports from PyErr_Display() and + PyErr_WriteUnraisable() are sensible even when formatting them produces + secondary errors. This affects the reports produced by + sys.__excepthook__() and when __del__() raises an exception. + +- bpo-26302: Correct behavior to reject comma as a legal character for + cookie names. + +- bpo-26136: Upgrade the warning when a generator raises StopIteration from + PendingDeprecationWarning to DeprecationWarning. Patch by Anish Shah. + +- bpo-26204: The compiler now ignores all constant statements: bytes, str, + int, float, complex, name constants (None, False, True), Ellipsis and + ast.Constant; not only str and int. For example, ``1.0`` is now ignored in + ``def f(): 1.0``. + +- bpo-4806: Avoid masking the original TypeError exception when using star + (``*``) unpacking in function calls. Based on patch by Hagen Fürstenau + and Daniel Urban. + +- bpo-26146: Add a new kind of AST node: ``ast.Constant``. It can be used by + external AST optimizers, but the compiler does not emit directly such + node. + +- bpo-23601: Sped-up allocation of dict key objects by using Python's small + object allocator. (Contributed by Julian Taylor.) + +- bpo-18018: Import raises ImportError instead of SystemError if a relative + import is attempted without a known parent package. + +- bpo-25843: When compiling code, don't merge constants if they are equal + but have a different types. For example, ``f1, f2 = lambda: 1, lambda: + 1.0`` is now correctly compiled to two different functions: ``f1()`` + returns ``1`` (``int``) and ``f2()`` returns ``1.0`` (``float``), even if + ``1`` and ``1.0`` are equal. + +- bpo-26107: The format of the ``co_lnotab`` attribute of code objects + changes to support negative line number delta. + +- bpo-26154: Add a new private _PyThreadState_UncheckedGet() function to get + the current Python thread state, but don't issue a fatal error if it is + NULL. This new function must be used instead of accessing directly the + _PyThreadState_Current variable. The variable is no more exposed since + Python 3.5.1 to hide the exact implementation of atomic C types, to avoid + compiler issues. + +- bpo-25791: If __package__ != __spec__.parent or if neither __package__ or + __spec__ are defined then ImportWarning is raised. + +- bpo-22995: [UPDATE] Comment out the one of the pickleability tests in + _PyObject_GetState() due to regressions observed in Cython-based projects. + +- bpo-25961: Disallowed null characters in the type name. + +- bpo-25973: Fix segfault when an invalid nonlocal statement binds a name + starting with two underscores. + +- bpo-22995: Instances of extension types with a state that aren't + subclasses of list or dict and haven't implemented any pickle-related + methods (__reduce__, __reduce_ex__, __getnewargs__, __getnewargs_ex__, or + __getstate__), can no longer be pickled. Including memoryview. + +- bpo-20440: Massive replacing unsafe attribute setting code with special + macro Py_SETREF. + +- bpo-25766: Special method __bytes__() now works in str subclasses. + +- bpo-25421: __sizeof__ methods of builtin types now use dynamic basic size. + This allows sys.getsize() to work correctly with their subclasses with + __slots__ defined. + +- bpo-25709: Fixed problem with in-place string concatenation and utf-8 + cache. + +- bpo-5319: New Py_FinalizeEx() API allowing Python to set an exit status of + 120 on failure to flush buffered streams. + +- bpo-25485: telnetlib.Telnet is now a context manager. + +- bpo-24097: Fixed crash in object.__reduce__() if slot name is freed inside + __getattr__. + +- bpo-24731: Fixed crash on converting objects with special methods + __bytes__, __trunc__, and __float__ returning instances of subclasses of + bytes, int, and float to subclasses of bytes, int, and float + correspondingly. + +- bpo-25630: Fix a possible segfault during argument parsing in functions + that accept filesystem paths. + +- bpo-23564: Fixed a partially broken sanity check in the _posixsubprocess + internals regarding how fds_to_pass were passed to the child. The bug had + no actual impact as subprocess.py already avoided it. + +- bpo-25388: Fixed tokenizer crash when processing undecodable source code + with a null byte. + +- bpo-25462: The hash of the key now is calculated only once in most + operations in C implementation of OrderedDict. + +- bpo-22995: Default implementation of __reduce__ and __reduce_ex__ now + rejects builtin types with not defined __new__. + +- bpo-24802: Avoid buffer overreads when int(), float(), compile(), exec() + and eval() are passed bytes-like objects. These objects are not + necessarily terminated by a null byte, but the functions assumed they + were. + +- bpo-25555: Fix parser and AST: fill lineno and col_offset of "arg" node + when compiling AST from Python objects. + +- bpo-24726: Fixed a crash and leaking NULL in repr() of OrderedDict that + was mutated by direct calls of dict methods. + +- bpo-25449: Iterating OrderedDict with keys with unstable hash now raises + KeyError in C implementations as well as in Python implementation. + +- bpo-25395: Fixed crash when highly nested OrderedDict structures were + garbage collected. + +- bpo-25401: Optimize bytes.fromhex() and bytearray.fromhex(): they are now + between 2x and 3.5x faster. + +- bpo-25399: Optimize bytearray % args using the new private _PyBytesWriter + API. Formatting is now between 2.5 and 5 times faster. + +- bpo-25274: sys.setrecursionlimit() now raises a RecursionError if the new + recursion limit is too low depending at the current recursion depth. + Modify also the "lower-water mark" formula to make it monotonic. This mark + is used to decide when the overflowed flag of the thread state is reset. + +- bpo-24402: Fix input() to prompt to the redirected stdout when + sys.stdout.fileno() fails. + +- bpo-25349: Optimize bytes % args using the new private _PyBytesWriter API. + Formatting is now up to 2 times faster. + +- bpo-24806: Prevent builtin types that are not allowed to be subclassed + from being subclassed through multiple inheritance. + +- bpo-25301: The UTF-8 decoder is now up to 15 times as fast for error + handlers: ``ignore``, ``replace`` and ``surrogateescape``. + +- bpo-24848: Fixed a number of bugs in UTF-7 decoding of misformed data. + +- bpo-25267: The UTF-8 encoder is now up to 75 times as fast for error + handlers: ``ignore``, ``replace``, ``surrogateescape``, ``surrogatepass``. + Patch co-written with Serhiy Storchaka. + +- bpo-25280: Import trace messages emitted in verbose (-v) mode are no + longer formatted twice. + +- bpo-25227: Optimize ASCII and latin1 encoders with the ``surrogateescape`` + error handler: the encoders are now up to 3 times as fast. Initial patch + written by Serhiy Storchaka. + +- bpo-25003: On Solaris 11.3 or newer, os.urandom() now uses the getrandom() + function instead of the getentropy() function. The getentropy() function + is blocking to generate very good quality entropy, os.urandom() doesn't + need such high-quality entropy. + +- bpo-9232: Modify Python's grammar to allow trailing commas in the argument + list of a function declaration. For example, "def f(\*, a = 3,): pass" is + now legal. Patch from Mark Dickinson. + +- bpo-24965: Implement :pep:`498` "Literal String Interpolation". This + allows you to embed expressions inside f-strings, which are converted to + normal strings at run time. Given x=3, then f'value={x}' == 'value=3'. + Patch by Eric V. Smith. + +- bpo-26478: Fix semantic bugs when using binary operators with dictionary + views and tuples. + +- bpo-26171: Fix possible integer overflow and heap corruption in + zipimporter.get_data(). + +- bpo-25660: Fix TAB key behaviour in REPL with readline. + +- bpo-26288: Optimize PyLong_AsDouble. + +- bpo-26289: Optimize floor and modulo division for single-digit longs. + Microbenchmarks show 2-2.5x improvement. Built-in 'divmod' function is + now also ~10% faster. (See also: bpo-26315) + +- bpo-25887: Raise a RuntimeError when a coroutine object is awaited more + than once. + +Library +------- + +- bpo-27057: Fix os.set_inheritable() on Android, ioctl() is blocked by + SELinux and fails with EACCESS. The function now falls back to fcntl(). + Patch written by Michał Bednarski. + +- bpo-27014: Fix infinite recursion using typing.py. Thanks to Kalle Tuure! + +- bpo-27031: Removed dummy methods in Tkinter widget classes: tk_menuBar() + and tk_bindForTraversal(). + +- bpo-14132: Fix urllib.request redirect handling when the target only has a + query string. Original fix by Ján Janech. + +- bpo-17214: The "urllib.request" module now percent-encodes non-ASCII bytes + found in redirect target URLs. Some servers send Location header fields + with non-ASCII bytes, but "http.client" requires the request target to be + ASCII-encodable, otherwise a UnicodeEncodeError is raised. Based on patch + by Christian Heimes. + +- bpo-27033: The default value of the decode_data parameter for + smtpd.SMTPChannel and smtpd.SMTPServer constructors is changed to False. + +- bpo-27034: Removed deprecated class asynchat.fifo. + +- bpo-26870: Added readline.set_auto_history(), which can stop entries being + automatically added to the history list. Based on patch by Tyler + Crompton. + +- bpo-26039: zipfile.ZipFile.open() can now be used to write data into a ZIP + file, as well as for extracting data. Patch by Thomas Kluyver. + +- bpo-26892: Honor debuglevel flag in urllib.request.HTTPHandler. Patch + contributed by Chi Hsuan Yen. + +- bpo-22274: In the subprocess module, allow stderr to be redirected to + stdout even when stdout is not redirected. Patch by Akira Li. + +- bpo-26807: mock_open 'files' no longer error on readline at end of file. + Patch from Yolanda Robla. + +- bpo-25745: Fixed leaking a userptr in curses panel destructor. + +- bpo-26977: Removed unnecessary, and ignored, call to sum of squares helper + in statistics.pvariance. + +- bpo-26002: Use bisect in statistics.median instead of a linear search. + Patch by Upendra Kuma. + +- bpo-25974: Make use of new Decimal.as_integer_ratio() method in statistics + module. Patch by Stefan Krah. + +- bpo-26996: Add secrets module as described in :pep:`506`. + +- bpo-26881: The modulefinder module now supports extended opcode arguments. + +- bpo-23815: Fixed crashes related to directly created instances of types in + _tkinter and curses.panel modules. + +- bpo-17765: weakref.ref() no longer silently ignores keyword arguments. + Patch by Georg Brandl. + +- bpo-26873: xmlrpc now raises ResponseError on unsupported type tags + instead of silently return incorrect result. + +- bpo-26915: The __contains__ methods in the collections ABCs now check for + identity before checking equality. This better matches the behavior of + the concrete classes, allows sensible handling of NaNs, and makes it + easier to reason about container invariants. + +- bpo-26711: Fixed the comparison of plistlib.Data with other types. + +- bpo-24114: Fix an uninitialized variable in `ctypes.util`. The bug only + occurs on SunOS when the ctypes implementation searches for the `crle` + program. Patch by Xiang Zhang. Tested on SunOS by Kees Bos. + +- bpo-26864: In urllib.request, change the proxy bypass host checking + against no_proxy to be case-insensitive, and to not match unrelated host + names that happen to have a bypassed hostname as a suffix. Patch by Xiang + Zhang. + +- bpo-24902: Print server URL on http.server startup. Initial patch by + Felix Kaiser. + +- bpo-25788: fileinput.hook_encoded() now supports an "errors" argument for + passing to open. Original patch by Joseph Hackman. + +- bpo-26634: recursive_repr() now sets __qualname__ of wrapper. Patch by + Xiang Zhang. + +- bpo-26804: urllib.request will prefer lower_case proxy environment + variables over UPPER_CASE or Mixed_Case ones. Patch contributed by + Hans-Peter Jansen. + +- bpo-26837: assertSequenceEqual() now correctly outputs non-stringified + differing items (like bytes in the -b mode). This affects + assertListEqual() and assertTupleEqual(). + +- bpo-26041: Remove "will be removed in Python 3.7" from deprecation + messages of platform.dist() and platform.linux_distribution(). Patch by + Kumaripaba Miyurusara Athukorala. + +- bpo-26822: itemgetter, attrgetter and methodcaller objects no longer + silently ignore keyword arguments. + +- bpo-26733: Disassembling a class now disassembles class and static + methods. Patch by Xiang Zhang. + +- bpo-26801: Fix error handling in :func:`shutil.get_terminal_size`, catch + :exc:`AttributeError` instead of :exc:`NameError`. Patch written by + Emanuel Barry. + +- bpo-24838: tarfile's ustar and gnu formats now correctly calculate name + and link field limits for multibyte character encodings like utf-8. + +Security +-------- + +- bpo-26657: Fix directory traversal vulnerability with http.server on + Windows. This fixes a regression that was introduced in 3.3.4rc1 and + 3.4.0rc1. Based on patch by Philipp Hagemeister. + +Library +------- + +- bpo-26717: Stop encoding Latin-1-ized WSGI paths with UTF-8. Patch by + Anthony Sottile. + +- bpo-26782: Add STARTUPINFO to subprocess.__all__ on Windows. + +- bpo-26404: Add context manager to socketserver. Patch by Aviv Palivoda. + +- bpo-26735: Fix :func:`os.urandom` on Solaris 11.3 and newer when reading + more than 1,024 bytes: call ``getrandom()`` multiple times with a limit of + 1024 bytes per call. + +- bpo-26585: Eliminate http.server._quote_html() and use + html.escape(quote=False). Patch by Xiang Zhang. + +- bpo-26685: Raise OSError if closing a socket fails. + +- bpo-16329: Add .webm to mimetypes.types_map. Patch by Giampaolo Rodola'. + +- bpo-13952: Add .csv to mimetypes.types_map. Patch by Geoff Wilson. + +- bpo-26587: the site module now allows .pth files to specify files to be + added to sys.path (e.g. zip files). + +- bpo-25609: Introduce contextlib.AbstractContextManager and + typing.ContextManager. + +- bpo-26709: Fixed Y2038 problem in loading binary PLists. + +- bpo-23735: Handle terminal resizing with Readline 6.3+ by installing our + own SIGWINCH handler. Patch by Eric Price. + +- bpo-25951: Change SSLSocket.sendall() to return None, as explicitly + documented for plain socket objects. Patch by Aviv Palivoda. + +- bpo-26586: In http.server, respond with "413 Request header fields too + large" if there are too many header fields to parse, rather than killing + the connection and raising an unhandled exception. Patch by Xiang Zhang. + +- bpo-26676: Added missing XMLPullParser to ElementTree.__all__. + +- bpo-22854: Change BufferedReader.writable() and BufferedWriter.readable() + to always return False. + +- bpo-26492: Exhausted iterator of array.array now conforms with the + behavior of iterators of other mutable sequences: it lefts exhausted even + if iterated array is extended. + +- bpo-26641: doctest.DocFileTest and doctest.testfile() now support packages + (module splitted into multiple directories) for the package parameter. + +- bpo-25195: Fix a regression in mock.MagicMock. _Call is a subclass of + tuple (changeset 3603bae63c13 only works for classes) so we need to + implement __ne__ ourselves. Patch by Andrew Plummer. + +- bpo-26644: Raise ValueError rather than SystemError when a negative length + is passed to SSLSocket.recv() or read(). + +- bpo-23804: Fix SSL recv(0) and read(0) methods to return zero bytes + instead of up to 1024. + +- bpo-26616: Fixed a bug in datetime.astimezone() method. + +- bpo-26637: The :mod:`importlib` module now emits an :exc:`ImportError` + rather than a :exc:`TypeError` if :func:`__import__` is tried during the + Python shutdown process but :data:`sys.path` is already cleared (set to + ``None``). + +- bpo-21925: :func:`warnings.formatwarning` now catches exceptions when + calling :func:`linecache.getline` and + :func:`tracemalloc.get_object_traceback` to be able to log + :exc:`ResourceWarning` emitted late during the Python shutdown process. + +- bpo-23848: On Windows, faulthandler.enable() now also installs an + exception handler to dump the traceback of all Python threads on any + Windows exception, not only on UNIX signals (SIGSEGV, SIGFPE, SIGABRT). + +- bpo-26530: Add C functions :c:func:`_PyTraceMalloc_Track` and + :c:func:`_PyTraceMalloc_Untrack` to track memory blocks using the + :mod:`tracemalloc` module. Add :c:func:`_PyTraceMalloc_GetTraceback` to + get the traceback of an object. + +- bpo-26588: The _tracemalloc now supports tracing memory allocations of + multiple address spaces (domains). + +- bpo-24266: Ctrl+C during Readline history search now cancels the search + mode when compiled with Readline 7. + +- bpo-26590: Implement a safe finalizer for the _socket.socket type. It now + releases the GIL to close the socket. + +- bpo-18787: spwd.getspnam() now raises a PermissionError if the user + doesn't have privileges. + +- bpo-26560: Avoid potential ValueError in BaseHandler.start_response. + Initial patch by Peter Inglesby. + +- bpo-26567: Add a new function :c:func:`PyErr_ResourceWarning` function to + pass the destroyed object. Add a *source* attribute to + :class:`warnings.WarningMessage`. Add warnings._showwarnmsg() which uses + tracemalloc to get the traceback where source object was allocated. + +Security +-------- + +- bpo-26313: ssl.py _load_windows_store_certs fails if windows cert store is + empty. Patch by Baji. + +Library +------- + +- bpo-26569: Fix :func:`pyclbr.readmodule` and :func:`pyclbr.readmodule_ex` + to support importing packages. + +- bpo-26499: Account for remaining Content-Length in HTTPResponse.readline() + and read1(). Based on patch by Silent Ghost. Also document that + HTTPResponse now supports these methods. + +- bpo-25320: Handle sockets in directories unittest discovery is scanning. + Patch from Victor van den Elzen. + +- bpo-16181: cookiejar.http2time() now returns None if year is higher than + datetime.MAXYEAR. + +- bpo-26513: Fixes platform module detection of Windows Server + +- bpo-23718: Fixed parsing time in week 0 before Jan 1. Original patch by + Tamás Bence Gedai. + +- bpo-26323: Add Mock.assert_called() and Mock.assert_called_once() methods + to unittest.mock. Patch written by Amit Saha. + +- bpo-20589: Invoking Path.owner() and Path.group() on Windows now raise + NotImplementedError instead of ImportError. + +- bpo-26177: Fixed the keys() method for Canvas and Scrollbar widgets. + +- bpo-15068: Got rid of excessive buffering in fileinput. The bufsize + parameter is now deprecated and ignored. + +- bpo-19475: Added an optional argument timespec to the datetime isoformat() + method to choose the precision of the time component. + +- bpo-2202: Fix UnboundLocalError in + AbstractDigestAuthHandler.get_algorithm_impls. Initial patch by Mathieu + Dupuy. + +- bpo-26167: Minimized overhead in copy.copy() and copy.deepcopy(). + Optimized copying and deepcopying bytearrays, NotImplemented, slices, + short lists, tuples, dicts, sets. + +- bpo-25718: Fixed pickling and copying the accumulate() iterator with total + is None. + +- bpo-26475: Fixed debugging output for regular expressions with the (?x) + flag. + +- bpo-26482: Allowed pickling recursive dequeues. + +- bpo-26335: Make mmap.write() return the number of bytes written like other + write methods. Patch by Jakub Stasiak. + +- bpo-26457: Fixed the subnets() methods in IP network classes for the case + when resulting prefix length is equal to maximal prefix length. Based on + patch by Xiang Zhang. + +- bpo-26385: Remove the file if the internal open() call in + NamedTemporaryFile() fails. Patch by Silent Ghost. + +- bpo-26402: Fix XML-RPC client to retry when the server shuts down a + persistent connection. This was a regression related to the new + http.client.RemoteDisconnected exception in 3.5.0a4. + +- bpo-25913: Leading ``<~`` is optional now in base64.a85decode() with + adobe=True. Patch by Swati Jaiswal. + +- bpo-26186: Remove an invalid type check in importlib.util.LazyLoader. + +- bpo-26367: importlib.__import__() raises ImportError like + builtins.__import__() when ``level`` is specified but without an + accompanying package specified. + +- bpo-26309: In the "socketserver" module, shut down the request (closing + the connected socket) when verify_request() returns false. Patch by Aviv + Palivoda. + +- bpo-23430: Change the socketserver module to only catch exceptions raised + from a request handler that are derived from Exception (instead of + BaseException). Therefore SystemExit and KeyboardInterrupt no longer + trigger the handle_error() method, and will now to stop a single-threaded + server. + +Security +-------- + +- bpo-25939: On Windows open the cert store readonly in + ssl.enum_certificates. + +Library +------- + +- bpo-25995: os.walk() no longer uses FDs proportional to the tree depth. + +- bpo-25994: Added the close() method and the support of the context manager + protocol for the os.scandir() iterator. + +- bpo-23992: multiprocessing: make MapResult not fail-fast upon exception. + +- bpo-26243: Support keyword arguments to zlib.compress(). Patch by Aviv + Palivoda. + +- bpo-26117: The os.scandir() iterator now closes file descriptor not only + when the iteration is finished, but when it was failed with error. + +- bpo-25949: __dict__ for an OrderedDict instance is now created only when + needed. + +- bpo-25911: Restored support of bytes paths in os.walk() on Windows. + +- bpo-26045: Add UTF-8 suggestion to error message when posting a + non-Latin-1 string with http.client. + +- bpo-26039: Added zipfile.ZipInfo.from_file() and zipinfo.ZipInfo.is_dir(). + Patch by Thomas Kluyver. + +- bpo-12923: Reset FancyURLopener's redirect counter even if there is an + exception. Based on patches by Brian Brazil and Daniel Rocco. + +- bpo-25945: Fixed a crash when unpickle the functools.partial object with + wrong state. Fixed a leak in failed functools.partial constructor. "args" + and "keywords" attributes of functools.partial have now always types tuple + and dict correspondingly. + +- bpo-26202: copy.deepcopy() now correctly copies range() objects with + non-atomic attributes. + +- bpo-23076: Path.glob() now raises a ValueError if it's called with an + invalid pattern. Patch by Thomas Nyberg. + +- bpo-19883: Fixed possible integer overflows in zipimport. + +- bpo-26227: On Windows, getnameinfo(), gethostbyaddr() and + gethostbyname_ex() functions of the socket module now decode the hostname + from the ANSI code page rather than UTF-8. + +- bpo-26099: The site module now writes an error into stderr if + sitecustomize module can be imported but executing the module raise an + ImportError. Same change for usercustomize. + +- bpo-26147: xmlrpc now works with strings not encodable with used non-UTF-8 + encoding. + +- bpo-25935: Garbage collector now breaks reference loops with OrderedDict. + +- bpo-16620: Fixed AttributeError in msilib.Directory.glob(). + +- bpo-26013: Added compatibility with broken protocol 2 pickles created in + old Python 3 versions (3.4.3 and lower). + +- bpo-26129: Deprecated accepting non-integers in grp.getgrgid(). + +- bpo-25850: Use cross-compilation by default for 64-bit Windows. + +- bpo-25822: Add docstrings to the fields of urllib.parse results. Patch + contributed by Swati Jaiswal. + +- bpo-22642: Convert trace module option parsing mechanism to argparse. + Patch contributed by SilentGhost. + +- bpo-24705: Fix sysconfig._parse_makefile not expanding ${} vars appearing + before $() vars. + +- bpo-26069: Remove the deprecated apis in the trace module. + +- bpo-22138: Fix mock.patch behavior when patching descriptors. Restore + original values after patching. Patch contributed by Sean McCully. + +- bpo-25672: In the ssl module, enable the SSL_MODE_RELEASE_BUFFERS mode + option if it is safe to do so. + +- bpo-26012: Don't traverse into symlinks for ``**`` pattern in + pathlib.Path.[r]glob(). + +- bpo-24120: Ignore PermissionError when traversing a tree with + pathlib.Path.[r]glob(). Patch by Ulrich Petri. + +- bpo-21815: Accept ] characters in the data portion of imap responses, in + order to handle the flags with square brackets accepted and produced by + servers such as gmail. + +- bpo-25447: fileinput now uses sys.stdin as-is if it does not have a buffer + attribute (restores backward compatibility). + +- bpo-25971: Optimized creating Fractions from floats by 2 times and from + Decimals by 3 times. + +- bpo-25802: Document as deprecated the remaining implementations of + importlib.abc.Loader.load_module(). + +- bpo-25928: Add Decimal.as_integer_ratio(). + +- bpo-25447: Copying the lru_cache() wrapper object now always works, + independently from the type of the wrapped object (by returning the + original object unchanged). + +- bpo-25768: Have the functions in compileall return booleans instead of + ints and add proper documentation and tests for the return values. + +- bpo-24103: Fixed possible use after free in ElementTree.XMLPullParser. + +- bpo-25860: os.fwalk() no longer skips remaining directories when error + occurs. Original patch by Samson Lee. + +- bpo-25914: Fixed and simplified OrderedDict.__sizeof__. + +- bpo-25869: Optimized deepcopying ElementTree; it is now 20 times faster. + +- bpo-25873: Optimized iterating ElementTree. Iterating elements + Element.iter() is now 40% faster, iterating text Element.itertext() is now + up to 2.5 times faster. + +- bpo-25902: Fixed various refcount issues in ElementTree iteration. + +- bpo-22227: The TarFile iterator is reimplemented using generator. This + implementation is simpler that using class. + +- bpo-25638: Optimized ElementTree.iterparse(); it is now 2x faster. + Optimized ElementTree parsing; it is now 10% faster. + +- bpo-25761: Improved detecting errors in broken pickle data. + +- bpo-25717: Restore the previous behaviour of tolerating most fstat() + errors when opening files. This was a regression in 3.5a1, and stopped + anonymous temporary files from working in special cases. + +- bpo-24903: Fix regression in number of arguments compileall accepts when + '-d' is specified. The check on the number of arguments has been dropped + completely as it never worked correctly anyway. + +- bpo-25764: In the subprocess module, preserve any exception caused by + fork() failure when preexec_fn is used. + +- bpo-25771: Tweak the exception message for importlib.util.resolve_name() + when 'package' isn't specified but necessary. + +- bpo-6478: _strptime's regexp cache now is reset after changing timezone + with time.tzset(). + +- bpo-14285: When executing a package with the "python -m package" option, + and package initialization fails, a proper traceback is now reported. The + "runpy" module now lets exceptions from package initialization pass back + to the caller, rather than raising ImportError. + +- bpo-19771: Also in runpy and the "-m" option, omit the irrelevant message + ". . . is a package and cannot be directly executed" if the package could + not even be initialized (e.g. due to a bad ``*.pyc`` file). + +- bpo-25177: Fixed problem with the mean of very small and very large + numbers. As a side effect, statistics.mean and statistics.variance should + be significantly faster. + +- bpo-25718: Fixed copying object with state with boolean value is false. + +- bpo-10131: Fixed deep copying of minidom documents. Based on patch by + Marian Ganisin. + +- bpo-7990: dir() on ElementTree.Element now lists properties: "tag", + "text", "tail" and "attrib". Original patch by Santoso Wijaya. + +- bpo-25725: Fixed a reference leak in pickle.loads() when unpickling + invalid data including tuple instructions. + +- bpo-25663: In the Readline completer, avoid listing duplicate global + names, and search the global namespace before searching builtins. + +- bpo-25688: Fixed file leak in ElementTree.iterparse() raising an error. + +- bpo-23914: Fixed SystemError raised by unpickler on broken pickle data. + +- bpo-25691: Fixed crash on deleting ElementTree.Element attributes. + +- bpo-25624: ZipFile now always writes a ZIP_STORED header for directory + entries. Patch by Dingyuan Wang. + +- bpo-25626: Change three zlib functions to accept sizes that fit in + Py_ssize_t, but internally cap those sizes to UINT_MAX. This resolves a + regression in 3.5 where GzipFile.read() failed to read chunks larger than + 2 or 4 GiB. The change affects the zlib.Decompress.decompress() + max_length parameter, the zlib.decompress() bufsize parameter, and the + zlib.Decompress.flush() length parameter. + +- bpo-25583: Avoid incorrect errors raised by os.makedirs(exist_ok=True) + when the OS gives priority to errors such as EACCES over EEXIST. + +- bpo-25593: Change semantics of EventLoop.stop() in asyncio. + +- bpo-6973: When we know a subprocess.Popen process has died, do not allow + the send_signal(), terminate(), or kill() methods to do anything as they + could potentially signal a different process. + +- bpo-23883: Added missing APIs to __all__ to match the documented APIs for + the following modules: calendar, csv, enum, fileinput, ftplib, logging, + optparse, tarfile, threading and wave. Also added a + test.support.check__all__() helper. Patches by Jacek Kołodziej, Mauro S. + M. Rodrigues and Joel Taddei. + +- bpo-25590: In the Readline completer, only call getattr() once per + attribute. Also complete names of attributes such as properties and slots + which are listed by dir() but not yet created on an instance. + +- bpo-25498: Fix a crash when garbage-collecting ctypes objects created by + wrapping a memoryview. This was a regression made in 3.5a1. Based on + patch by Eryksun. + +- bpo-25584: Added "escape" to the __all__ list in the glob module. + +- bpo-25584: Fixed recursive glob() with patterns starting with ``**``. + +- bpo-25446: Fix regression in smtplib's AUTH LOGIN support. + +- bpo-18010: Fix the pydoc web server's module search function to handle + exceptions from importing packages. + +- bpo-25554: Got rid of circular references in regular expression parsing. + +- bpo-18973: Command-line interface of the calendar module now uses argparse + instead of optparse. + +- bpo-25510: fileinput.FileInput.readline() now returns b'' instead of '' at + the end if the FileInput was opened with binary mode. Patch by Ryosuke + Ito. + +- bpo-25503: Fixed inspect.getdoc() for inherited docstrings of properties. + Original patch by John Mark Vandenberg. + +- bpo-25515: Always use os.urandom as a source of randomness in uuid.uuid4. + +- bpo-21827: Fixed textwrap.dedent() for the case when largest common + whitespace is a substring of smallest leading whitespace. Based on patch + by Robert Li. + +- bpo-25447: The lru_cache() wrapper objects now can be copied and pickled + (by returning the original object unchanged). + +- bpo-25390: typing: Don't crash on Union[str, Pattern]. + +- bpo-25441: asyncio: Raise error from drain() when socket is closed. + +- bpo-25410: Cleaned up and fixed minor bugs in C implementation of + OrderedDict. + +- bpo-25411: Improved Unicode support in SMTPHandler through better use of + the email package. Thanks to user simon04 for the patch. + +- Move the imp module from a PendingDeprecationWarning to + DeprecationWarning. + +- bpo-25407: Remove mentions of the formatter module being removed in Python + 3.6. + +- bpo-25406: Fixed a bug in C implementation of OrderedDict.move_to_end() + that caused segmentation fault or hang in iterating after moving several + items to the start of ordered dict. + +- bpo-25382: pickletools.dis() now outputs implicit memo index for the + MEMOIZE opcode. + +- bpo-25357: Add an optional newline parameter to binascii.b2a_base64(). + base64.b64encode() uses it to avoid a memory copy. + +- bpo-24164: Objects that need calling ``__new__`` with keyword arguments, + can now be pickled using pickle protocols older than protocol version 4. + +- bpo-25364: zipfile now works in threads disabled builds. + +- bpo-25328: smtpd's SMTPChannel now correctly raises a ValueError if both + decode_data and enable_SMTPUTF8 are set to true. + +- bpo-16099: RobotFileParser now supports Crawl-delay and Request-rate + extensions. Patch by Nikolay Bogoychev. + +- bpo-25316: distutils raises OSError instead of DistutilsPlatformError when + MSVC is not installed. + +- bpo-25380: Fixed protocol for the STACK_GLOBAL opcode in + pickletools.opcodes. + +- bpo-23972: Updates asyncio datagram create method allowing reuseport and + reuseaddr socket options to be set prior to binding the socket. Mirroring + the existing asyncio create_server method the reuseaddr option for + datagram sockets defaults to True if the O/S is 'posix' (except if the + platform is Cygwin). Patch by Chris Laws. + +- bpo-25304: Add asyncio.run_coroutine_threadsafe(). This lets you submit a + coroutine to a loop from another thread, returning a + concurrent.futures.Future. By Vincent Michel. + +- bpo-25232: Fix CGIRequestHandler to split the query from the URL at the + first question mark (?) rather than the last. Patch from Xiang Zhang. + +- bpo-24657: Prevent CGIRequestHandler from collapsing slashes in the query + part of the URL as if it were a path. Patch from Xiang Zhang. + +- bpo-25287: Don't add crypt.METHOD_CRYPT to crypt.methods if it's not + supported. Check if it is supported, it may not be supported on OpenBSD + for example. + +- bpo-23600: Default implementation of tzinfo.fromutc() was returning wrong + results in some cases. + +- bpo-25203: Failed readline.set_completer_delims() no longer left the + module in inconsistent state. + +- bpo-25011: rlcompleter now omits private and special attribute names + unless the prefix starts with underscores. + +- bpo-25209: rlcompleter now can add a space or a colon after completed + keyword. + +- bpo-22241: timezone.utc name is now plain 'UTC', not 'UTC-00:00'. + +- bpo-23517: fromtimestamp() and utcfromtimestamp() methods of + datetime.datetime now round microseconds to nearest with ties going to + nearest even integer (ROUND_HALF_EVEN), as round(float), instead of + rounding towards -Infinity (ROUND_FLOOR). + +- bpo-23552: Timeit now warns when there is substantial (4x) variance + between best and worst times. Patch from Serhiy Storchaka. + +- bpo-24633: site-packages/README -> README.txt. + +- bpo-24879: help() and pydoc can now list named tuple fields in the order + they were defined rather than alphabetically. The ordering is determined + by the _fields attribute if present. + +- bpo-24874: Improve speed of itertools.cycle() and make its pickle more + compact. + +- Fix crash in itertools.cycle.__setstate__() when the first argument wasn't + a list. + +- bpo-20059: urllib.parse raises ValueError on all invalid ports. Patch by + Martin Panter. + +- bpo-24360: Improve __repr__ of argparse.Namespace() for invalid + identifiers. Patch by Matthias Bussonnier. + +- bpo-23426: run_setup was broken in distutils. Patch from Alexander + Belopolsky. + +- bpo-13938: 2to3 converts StringTypes to a tuple. Patch from Mark Hammond. + +- bpo-2091: open() accepted a 'U' mode string containing '+', but 'U' can + only be used with 'r'. Patch from Jeff Balogh and John O'Connor. + +- bpo-8585: improved tests for zipimporter2. Patch from Mark Lawrence. + +- bpo-18622: unittest.mock.mock_open().reset_mock would recurse infinitely. + Patch from Nicola Palumbo and Laurent De Buyst. + +- bpo-24426: Fast searching optimization in regular expressions now works + for patterns that starts with capturing groups. Fast searching + optimization now can't be disabled at compile time. + +- bpo-23661: unittest.mock side_effects can now be exceptions again. This + was a regression vs Python 3.4. Patch from Ignacio Rossi + +- bpo-13248: Remove deprecated inspect.getmoduleinfo function. + +- bpo-25578: Fix (another) memory leak in SSLSocket.getpeercer(). + +- bpo-25530: Disable the vulnerable SSLv3 protocol by default when creating + ssl.SSLContext. + +- bpo-25569: Fix memory leak in SSLSocket.getpeercert(). + +- bpo-25471: Sockets returned from accept() shouldn't appear to be + nonblocking. + +- bpo-25319: When threading.Event is reinitialized, the underlying condition + should use a regular lock rather than a recursive lock. + +- Skip getaddrinfo if host is already resolved. Patch by A. Jesse Jiryu + Davis. + +- bpo-26050: Add asyncio.StreamReader.readuntil() method. Patch by Марк + Коренберг. + +- bpo-25924: Avoid unnecessary serialization of getaddrinfo(3) calls on OS X + versions 10.5 or higher. Original patch by A. Jesse Jiryu Davis. + +- bpo-26406: Avoid unnecessary serialization of getaddrinfo(3) calls on + current versions of OpenBSD and NetBSD. Patch by A. Jesse Jiryu Davis. + +- bpo-26848: Fix asyncio/subprocess.communicate() to handle empty input. + Patch by Jack O'Connor. + +- bpo-27040: Add loop.get_exception_handler method + +- bpo-27041: asyncio: Add loop.create_future method + +IDLE +---- + +- bpo-20640: Add tests for idlelib.configHelpSourceEdit. Patch by Saimadhav + Heblikar. + +- In the 'IDLE-console differences' section of the IDLE doc, clarify how + running with IDLE affects sys.modules and the standard streams. + +- bpo-25507: fix incorrect change in IOBinding that prevented printing. + Augment IOBinding htest to include all major IOBinding functions. + +- bpo-25905: Revert unwanted conversion of ' to ’ RIGHT SINGLE QUOTATION + MARK in README.txt and open this and NEWS.txt with 'ascii'. Re-encode + CREDITS.txt to utf-8 and open it with 'utf-8'. + +- bpo-15348: Stop the debugger engine (normally in a user process) before + closing the debugger window (running in the IDLE process). This prevents + the RuntimeErrors that were being caught and ignored. + +- bpo-24455: Prevent IDLE from hanging when a) closing the shell while the + debugger is active (15347); b) closing the debugger with the [X] button + (15348); and c) activating the debugger when already active (24455). The + patch by Mark Roseman does this by making two changes. 1. Suspend and + resume the gui.interaction method with the tcl vwait mechanism intended + for this purpose (instead of root.mainloop & .quit). 2. In gui.run, allow + any existing interaction to terminate first. + +- Change 'The program' to 'Your program' in an IDLE 'kill program?' message + to make it clearer that the program referred to is the currently running + user program, not IDLE itself. + +- bpo-24750: Improve the appearance of the IDLE editor window status bar. + Patch by Mark Roseman. + +- bpo-25313: Change the handling of new built-in text color themes to better + address the compatibility problem introduced by the addition of IDLE Dark. + Consistently use the revised idleConf.CurrentTheme everywhere in idlelib. + +- bpo-24782: Extension configuration is now a tab in the IDLE Preferences + dialog rather than a separate dialog. The former tabs are now a sorted + list. Patch by Mark Roseman. + +- bpo-22726: Re-activate the config dialog help button with some content + about the other buttons and the new IDLE Dark theme. + +- bpo-24820: IDLE now has an 'IDLE Dark' built-in text color theme. It is + more or less IDLE Classic inverted, with a cobalt blue background. + Strings, comments, keywords, ... are still green, red, orange, ... . To + use it with IDLEs released before November 2015, hit the 'Save as New + Custom Theme' button and enter a new name, such as 'Custom Dark'. The + custom theme will work with any IDLE release, and can be modified. + +- bpo-25224: README.txt is now an idlelib index for IDLE developers and + curious users. The previous user content is now in the IDLE doc chapter. + 'IDLE' now means 'Integrated Development and Learning Environment'. + +- bpo-24820: Users can now set breakpoint colors in Settings -> Custom + Highlighting. Original patch by Mark Roseman. + +- bpo-24972: Inactive selection background now matches active selection + background, as configured by users, on all systems. Found items are now + always highlighted on Windows. Initial patch by Mark Roseman. + +- bpo-24570: Idle: make calltip and completion boxes appear on Macs affected + by a tk regression. Initial patch by Mark Roseman. + +- bpo-24988: Idle ScrolledList context menus (used in debugger) now work on + Mac Aqua. Patch by Mark Roseman. + +- bpo-24801: Make right-click for context menu work on Mac Aqua. Patch by + Mark Roseman. + +- bpo-25173: Associate tkinter messageboxes with a specific widget. For Mac + OSX, make them a 'sheet'. Patch by Mark Roseman. + +- bpo-25198: Enhance the initial html viewer now used for Idle Help. + Properly indent fixed-pitch text (patch by Mark Roseman). Give code + snippet a very Sphinx-like light blueish-gray background. Re-use initial + width and height set by users for shell and editor. When the Table of + Contents (TOC) menu is used, put the section header at the top of the + screen. + +- bpo-25225: Condense and rewrite Idle doc section on text colors. + +- bpo-21995: Explain some differences between IDLE and console Python. + +- bpo-22820: Explain need for *print* when running file from Idle editor. + +- bpo-25224: Doc: augment Idle feature list and no-subprocess section. + +- bpo-25219: Update doc for Idle command line options. Some were missing and + notes were not correct. + +- bpo-24861: Most of idlelib is private and subject to change. Use + idleib.idle.* to start Idle. See idlelib.__init__.__doc__. + +- bpo-25199: Idle: add synchronization comments for future maintainers. + +- bpo-16893: Replace help.txt with help.html for Idle doc display. The new + idlelib/help.html is rstripped Doc/build/html/library/idle.html. It looks + better than help.txt and will better document Idle as released. The + tkinter html viewer that works for this file was written by Rose Roseman. + The now unused EditorWindow.HelpDialog class and helt.txt file are + deprecated. + +- bpo-24199: Deprecate unused idlelib.idlever with possible removal in 3.6. + +- bpo-24790: Remove extraneous code (which also create 2 & 3 conflicts). + +Documentation +------------- + +- bpo-26736: Used HTTPS for external links in the documentation if possible. + +- bpo-6953: Rework the Readline module documentation to group related + functions together, and add more details such as what underlying Readline + functions and variables are accessed. + +- bpo-23606: Adds note to ctypes documentation regarding cdll.msvcrt. + +- bpo-24952: Clarify the default size argument of stack_size() in the + "threading" and "_thread" modules. Patch from Mattip. + +- bpo-26014: Update 3.x packaging documentation: * "See also" links to the + new docs are now provided in the legacy pages * links to setuptools + documentation have been updated + +Tests +----- + +- bpo-21916: Added tests for the turtle module. Patch by ingrid, Gregory + Loyse and Jelle Zijlstra. + +- bpo-26295: When using "python3 -m test --testdir=TESTDIR", regrtest + doesn't add "test." prefix to test module names. + +- bpo-26523: The multiprocessing thread pool (multiprocessing.dummy.Pool) + was untested. + +- bpo-26015: Added new tests for pickling iterators of mutable sequences. + +- bpo-26325: Added test.support.check_no_resource_warning() to check that no + ResourceWarning is emitted. + +- bpo-25940: Changed test_ssl to use its internal local server more. This + avoids relying on svn.python.org, which recently changed root certificate. + +- bpo-25616: Tests for OrderedDict are extracted from test_collections into + separate file test_ordered_dict. + +- bpo-25449: Added tests for OrderedDict subclasses. + +- bpo-25188: Add -P/--pgo to test.regrtest to suppress error output when + running the test suite for the purposes of a PGO build. Initial patch by + Alecsandru Patrascu. + +- bpo-22806: Add ``python -m test --list-tests`` command to list tests. + +- bpo-18174: ``python -m test --huntrleaks ...`` now also checks for leak of + file descriptors. Patch written by Richard Oudkerk. + +- bpo-25260: Fix ``python -m test --coverage`` on Windows. Remove the list + of ignored directories. + +- ``PCbuild\rt.bat`` now accepts an unlimited number of arguments to pass + along to regrtest.py. Previously there was a limit of 9. + +- bpo-26583: Skip test_timestamp_overflow in test_import if bytecode files + cannot be written. + +Build +----- + +- bpo-21277: Don't try to link _ctypes with a ffi_convenience library. + +- bpo-26884: Fix linking extension modules for cross builds. Patch by Xavier + de Gaye. + +- bpo-26932: Fixed support of RTLD_* constants defined as enum values, not + via macros (in particular on Android). Patch by Chi Hsuan Yen. + +- bpo-22359: Disable the rules for running _freeze_importlib and pgen when + cross-compiling. The output of these programs is normally saved with the + source code anyway, and is still regenerated when doing a native build. + Patch by Xavier de Gaye. + +- bpo-21668: Link audioop, _datetime, _ctypes_test modules to libm, except + on Mac OS X. Patch written by Chi Hsuan Yen. + +- bpo-25702: A --with-lto configure option has been added that will enable + link time optimizations at build time during a make profile-opt. Some + compilers and toolchains are known to not produce stable code when using + LTO, be sure to test things thoroughly before relying on it. It can + provide a few % speed up over profile-opt alone. + +- bpo-26624: Adds validation of ucrtbase[d].dll version with warning for old + versions. + +- bpo-17603: Avoid error about nonexistent fileblocks.o file by using a + lower-level check for st_blocks in struct stat. + +- bpo-26079: Fixing the build output folder for tix-8.4.3.6. Patch by Bjoern + Thiel. + +- bpo-26465: Update Windows builds to use OpenSSL 1.0.2g. + +- bpo-25348: Added ``--pgo`` and ``--pgo-job`` arguments to + ``PCbuild\build.bat`` for building with Profile-Guided Optimization. The + old ``PCbuild\build_pgo.bat`` script is removed. + +- bpo-25827: Add support for building with ICC to ``configure``, including a + new ``--with-icc`` flag. + +- bpo-25696: Fix installation of Python on UNIX with make -j9. + +- bpo-24986: It is now possible to build Python on Windows without errors + when external libraries are not available. + +- bpo-24421: Compile Modules/_math.c once, before building extensions. + Previously it could fail to compile properly if the math and cmath builds + were concurrent. + +- bpo-26465: Update OS X 10.5+ 32-bit-only installer to build and link with + OpenSSL 1.0.2g. + +- bpo-26268: Update Windows builds to use OpenSSL 1.0.2f. + +- bpo-25136: Support Apple Xcode 7's new textual SDK stub libraries. + +- bpo-24324: Do not enable unreachable code warnings when using gcc as the + option does not work correctly in older versions of gcc and has been + silently removed as of gcc-4.5. + +Windows +------- + +- bpo-27053: Updates make_zip.py to correctly generate library ZIP file. + +- bpo-26268: Update the prepare_ssl.py script to handle OpenSSL releases + that don't include the contents of the include directory (that is, 1.0.2e + and later). + +- bpo-26071: bdist_wininst created binaries fail to start and find 32bit + Python + +- bpo-26073: Update the list of magic numbers in launcher + +- bpo-26065: Excludes venv from library when generating embeddable distro. + +- bpo-25022: Removed very outdated PC/example_nt/ directory. + +Tools/Demos +----------- + +- bpo-26799: Fix python-gdb.py: don't get C types once when the Python code + is loaded, but get C types on demand. The C types can change if + python-gdb.py is loaded before the Python executable. Patch written by + Thomas Ilsche. + +- bpo-26271: Fix the Freeze tool to properly use flags passed through + configure. Patch by Daniel Shaulov. + +- bpo-26489: Add dictionary unpacking support to Tools/parser/unparse.py. + Patch by Guo Ci Teo. + +- bpo-26316: Fix variable name typo in Argument Clinic. + +- bpo-25440: Fix output of python-config --extension-suffix. + +- bpo-25154: The pyvenv script has been deprecated in favour of `python3 -m + venv`. + +C API +----- + +- bpo-26312: SystemError is now raised in all programming bugs with using + PyArg_ParseTupleAndKeywords(). RuntimeError did raised before in some + programming bugs. + +- bpo-26198: ValueError is now raised instead of TypeError on buffer + overflow in parsing "es#" and "et#" format units. SystemError is now + raised instead of TypeError on programmatical error in parsing format + string. + + +What's New in Python 3.5.5 final? +================================= + +*Release date: 2018-02-04* + +There were no new changes in version 3.5.5. + + + +What's New in Python 3.5.5 release candidate 1? +=============================================== + +*Release date: 2018-01-23* + +Security +-------- + +- bpo-32551: The ``sys.path[0]`` initialization change for bpo-29139 caused + a regression by revealing an inconsistency in how sys.path is initialized + when executing ``__main__`` from a zipfile, directory, or other import + location. This is considered a potential security issue, as it may lead to + privileged processes unexpectedly loading code from user controlled + directories in situations where that was not previously the case. The + interpreter now consistently avoids ever adding the import location's + parent directory to ``sys.path``, and ensures no other ``sys.path`` + entries are inadvertently modified when inserting the import location + named on the command line. (Originally reported as bpo-29723 against + Python 3.6rc1, but it was missed at the time that the then upcoming Python + 3.5.4 release would also be affected) + +- bpo-30657: Fixed possible integer overflow in PyBytes_DecodeEscape, + CVE-2017-1000158. Original patch by Jay Bosamiya; rebased to Python 3 by + Miro Hrončok. + +- bpo-30947: Upgrade libexpat embedded copy from version 2.2.1 to 2.2.3 to + get security fixes. + +Core and Builtins +----------------- + +- bpo-31095: Fix potential crash during GC caused by ``tp_dealloc`` which + doesn't call ``PyObject_GC_UnTrack()``. + +Library +------- + +- bpo-32072: Fixed issues with binary plists: Fixed saving bytearrays. + Identical objects will be saved only once. Equal references will be load + as identical objects. Added support for saving and loading recursive data + structures. + +- bpo-31170: expat: Update libexpat from 2.2.3 to 2.2.4. Fix copying of + partial characters for UTF-8 input (libexpat bug 115): + https://github.com/libexpat/libexpat/issues/115 + + +What's New in Python 3.5.4 final? +================================= + +*Release date: 2017-08-07* + +Library +------- + +- bpo-30119: ftplib.FTP.putline() now throws ValueError on commands that + contains CR or LF. Patch by Dong-hee Na. + + +What's New in Python 3.5.4 release candidate 1? +=============================================== + +*Release date: 2017-07-23* + +Security +-------- + +- bpo-30730: Prevent environment variables injection in subprocess on + Windows. Prevent passing other environment variables and command + arguments. + +- bpo-30694: Upgrade expat copy from 2.2.0 to 2.2.1 to get fixes of multiple + security vulnerabilities including: CVE-2017-9233 (External entity + infinite loop DoS), CVE-2016-9063 (Integer overflow, re-fix), + CVE-2016-0718 (Fix regression bugs from 2.2.0's fix to CVE-2016-0718) and + CVE-2012-0876 (Counter hash flooding with SipHash). Note: the + CVE-2016-5300 (Use os-specific entropy sources like getrandom) doesn't + impact Python, since Python already gets entropy from the OS to set the + expat secret using ``XML_SetHashSalt()``. + +- bpo-30500: Fix urllib.parse.splithost() to correctly parse fragments. For + example, ``splithost('//127.0.0.1#@evil.com/')`` now correctly returns the + ``127.0.0.1`` host, instead of treating ``@evil.com`` as the host in an + authentication (``login@host``). + +- bpo-29591: Update expat copy from 2.1.1 to 2.2.0 to get fixes of + CVE-2016-0718 and CVE-2016-4472. See + https://sourceforge.net/p/expat/bugs/537/ for more information. + +Core and Builtins +----------------- + +- bpo-30876: Relative import from unloaded package now reimports the package + instead of failing with SystemError. Relative import from non-package now + fails with ImportError rather than SystemError. + +- bpo-30765: Avoid blocking in pthread_mutex_lock() when + PyThread_acquire_lock() is asked not to block. + +- bpo-27945: Fixed various segfaults with dict when input collections are + mutated during searching, inserting or comparing. Based on patches by + Duane Griffin and Tim Mitchell. + +- bpo-25794: Fixed type.__setattr__() and type.__delattr__() for + non-interned attribute names. Based on patch by Eryk Sun. + +- bpo-29935: Fixed error messages in the index() method of tuple, list and + deque when pass indices of wrong type. + +- bpo-28876: ``bool(range)`` works even if ``len(range)`` raises + :exc:`OverflowError`. + +- bpo-29600: Fix wrapping coroutine return values in StopIteration. + +- bpo-29537: Restore runtime compatibility with bytecode files generated by + CPython 3.5.0 to 3.5.2, and adjust the eval loop to avoid the problems + that could be caused by the malformed variant of the + BUILD_MAP_UNPACK_WITH_CALL opcode that they may contain. Patch by Petr + Viktorin, Serhiy Storchaka, and Nick Coghlan. + +- bpo-28598: Support __rmod__ for subclasses of str being called before + str.__mod__. Patch by Martijn Pieters. + +- bpo-29602: Fix incorrect handling of signed zeros in complex constructor + for complex subclasses and for inputs having a __complex__ method. Patch + by Serhiy Storchaka. + +- bpo-29347: Fixed possibly dereferencing undefined pointers when creating + weakref objects. + +- bpo-29438: Fixed use-after-free problem in key sharing dict. + +- bpo-29319: Prevent RunMainFromImporter overwriting sys.path[0]. + +- bpo-29337: Fixed possible BytesWarning when compare the code objects. + Warnings could be emitted at compile time. + +- bpo-29478: If max_line_length=None is specified while using the Compat32 + policy, it is no longer ignored. Patch by Mircea Cosbuc. + +Library +------- + +- bpo-29403: Fix ``unittest.mock``'s autospec to not fail on method-bound + builtin functions. Patch by Aaron Gallagher. + +- bpo-30961: Fix decrementing a borrowed reference in tracemalloc. + +- bpo-30886: Fix multiprocessing.Queue.join_thread(): it now waits until the + thread completes, even if the thread was started by the same process which + created the queue. + +- bpo-29854: Fix segfault in readline when using readline's history-size + option. Patch by Nir Soffer. + +- bpo-30807: signal.setitimer() may disable the timer when passed a tiny + value. Tiny values (such as 1e-6) are valid non-zero values for + setitimer(), which is specified as taking microsecond-resolution + intervals. However, on some platform, our conversion routine could convert + 1e-6 into a zero interval, therefore disabling the timer instead of + (re-)scheduling it. + +- bpo-30441: Fix bug when modifying os.environ while iterating over it + +- bpo-30532: Fix email header value parser dropping folding white space in + certain cases. + +- bpo-29169: Update zlib to 1.2.11. + +- bpo-30879: os.listdir() and os.scandir() now emit bytes names when called + with bytes-like argument. + +- bpo-30746: Prohibited the '=' character in environment variable names in + ``os.putenv()`` and ``os.spawn*()``. + +- bpo-29755: Fixed the lgettext() family of functions in the gettext module. + They now always return bytes. + +- bpo-30645: Fix path calculation in imp.load_package(), fixing it for cases + when a package is only shipped with bytecodes. Patch by Alexandru + Ardelean. + +- bpo-23890: unittest.TestCase.assertRaises() now manually breaks a + reference cycle to not keep objects alive longer than expected. + +- bpo-30149: inspect.signature() now supports callables with + variable-argument parameters wrapped with partialmethod. Patch by Dong-hee + Na. + +- bpo-29931: Fixed comparison check for ipaddress.ip_interface objects. + Patch by Sanjay Sundaresan. + +- bpo-24484: Avoid race condition in multiprocessing cleanup. + +- bpo-28994: The traceback no longer displayed for SystemExit raised in a + callback registered by atexit. + +- bpo-30508: Don't log exceptions if Task/Future "cancel()" method was + called. + +- bpo-28556: Updates to typing module: Add generic AsyncContextManager, add + support for ContextManager on all versions. Original PRs by Jelle Zijlstra + and Ivan Levkivskyi + +- bpo-29870: Fix ssl sockets leaks when connection is aborted in asyncio/ssl + implementation. Patch by Michaël Sghaïer. + +- bpo-29743: Closing transport during handshake process leaks open socket. + Patch by Nikolay Kim + +- bpo-27585: Fix waiter cancellation in asyncio.Lock. Patch by Mathieu + Sornay. + +- bpo-30418: On Windows, subprocess.Popen.communicate() now also ignore + EINVAL on stdin.write() if the child process is still running but closed + the pipe. + +- bpo-30378: Fix the problem that logging.handlers.SysLogHandler cannot + handle IPv6 addresses. + +- bpo-29960: Preserve generator state when _random.Random.setstate() raises + an exception. Patch by Bryan Olson. + +- bpo-30414: multiprocessing.Queue._feed background running thread do not + break from main loop on exception. + +- bpo-30003: Fix handling escape characters in HZ codec. Based on patch by + Ma Lin. + +- bpo-30301: Fix AttributeError when using SimpleQueue.empty() under *spawn* + and *forkserver* start methods. + +- bpo-30329: imaplib and poplib now catch the Windows socket WSAEINVAL error + (code 10022) on shutdown(SHUT_RDWR): An invalid operation was attempted. + This error occurs sometimes on SSL connections. + +- bpo-30375: Warnings emitted when compile a regular expression now always + point to the line in the user code. Previously they could point into + inners of the re module if emitted from inside of groups or conditionals. + +- bpo-30048: Fixed ``Task.cancel()`` can be ignored when the task is running + coroutine and the coroutine returned without any more ``await``. + +- bpo-29990: Fix range checking in GB18030 decoder. Original patch by Ma + Lin. + +- bpo-26293: Change resulted because of zipfile breakage. (See also: + bpo-29094) + +- bpo-30243: Removed the __init__ methods of _json's scanner and encoder. + Misusing them could cause memory leaks or crashes. Now scanner and + encoder objects are completely initialized in the __new__ methods. + +- bpo-30185: Avoid KeyboardInterrupt tracebacks in forkserver helper process + when Ctrl-C is received. + +- bpo-28556: Various updates to typing module: add typing.NoReturn type, use + WrapperDescriptorType, minor bug-fixes. Original PRs by Jim + Fasarakis-Hilliard and Ivan Levkivskyi. + +- bpo-30205: Fix getsockname() for unbound AF_UNIX sockets on Linux. + +- bpo-30070: Fixed leaks and crashes in errors handling in the parser + module. + +- bpo-30061: Fixed crashes in IOBase methods __next__() and readlines() when + readline() or __next__() respectively return non-sizeable object. Fixed + possible other errors caused by not checking results of PyObject_Size(), + PySequence_Size(), or PyMapping_Size(). + +- bpo-30068: _io._IOBase.readlines will check if it's closed first when hint + is present. + +- bpo-29694: Fixed race condition in pathlib mkdir with flags parents=True. + Patch by Armin Rigo. + +- bpo-29692: Fixed arbitrary unchaining of RuntimeError exceptions in + contextlib.contextmanager. Patch by Siddharth Velankar. + +- bpo-29998: Pickling and copying ImportError now preserves name and path + attributes. + +- bpo-29942: Fix a crash in itertools.chain.from_iterable when encountering + long runs of empty iterables. + +- bpo-27863: Fixed multiple crashes in ElementTree caused by race conditions + and wrong types. + +- bpo-28699: Fixed a bug in pools in multiprocessing.pool that raising an + exception at the very first of an iterable may swallow the exception or + make the program hang. Patch by Davin Potts and Xiang Zhang. + +- bpo-25803: Avoid incorrect errors raised by Path.mkdir(exist_ok=True) when + the OS gives priority to errors such as EACCES over EEXIST. + +- bpo-29861: Release references to tasks, their arguments and their results + as soon as they are finished in multiprocessing.Pool. + +- bpo-29884: faulthandler: Restore the old sigaltstack during teardown. + Patch by Christophe Zeitouny. + +- bpo-25455: Fixed crashes in repr of recursive buffered file-like objects. + +- bpo-29800: Fix crashes in partial.__repr__ if the keys of partial.keywords + are not strings. Patch by Michael Seifert. + +- bpo-29742: get_extra_info() raises exception if get called on closed ssl + transport. Patch by Nikolay Kim. + +- bpo-8256: Fixed possible failing or crashing input() if attributes + "encoding" or "errors" of sys.stdin or sys.stdout are not set or are not + strings. + +- bpo-28298: Fix a bug that prevented array 'Q', 'L' and 'I' from accepting + big intables (objects that have __int__) as elements. Patch by Oren + Milman. + +- bpo-29615: SimpleXMLRPCDispatcher no longer chains KeyError (or any other + exception) to exception(s) raised in the dispatched methods. Patch by Petr + Motejlek. + +- bpo-29704: asyncio.subprocess.SubprocessStreamProtocol no longer closes + before all pipes are closed. + +- bpo-29703: Fix asyncio to support instantiation of new event loops in + child processes. + +- bpo-29376: Fix assertion error in threading._DummyThread.is_alive(). + +- bpo-29110: Fix file object leak in aifc.open() when file is given as a + filesystem path and is not in valid AIFF format. Patch by Anthony Zhang. + +- bpo-28961: Fix unittest.mock._Call helper: don't ignore the name parameter + anymore. Patch written by Jiajun Huang. + +- bpo-29532: Altering a kwarg dictionary passed to functools.partial() no + longer affects a partial object after creation. + +- bpo-28556: Various updates to typing module: typing.Counter, + typing.ChainMap, improved ABC caching, etc. Original PRs by Jelle + Zijlstra, Ivan Levkivskyi, Manuel Krebber, and Łukasz Langa. + +- bpo-29100: Fix datetime.fromtimestamp() regression introduced in Python + 3.6.0: check minimum and maximum years. + +- bpo-29519: Fix weakref spewing exceptions during interpreter shutdown when + used with a rare combination of multiprocessing and custom codecs. + +- bpo-29416: Prevent infinite loop in pathlib.Path.mkdir + +- bpo-29444: Fixed out-of-bounds buffer access in the group() method of the + match object. Based on patch by WGH. + +- bpo-29335: Fix subprocess.Popen.wait() when the child process has exited + to a stopped instead of terminated state (ex: when under ptrace). + +- bpo-29290: Fix a regression in argparse that help messages would wrap at + non-breaking spaces. + +- bpo-28735: Fixed the comparison of mock.MagickMock with mock.ANY. + +- bpo-29011: Fix an important omission by adding Deque to the typing module. + +- bpo-29219: Fixed infinite recursion in the repr of uninitialized + ctypes.CDLL instances. + +- bpo-28969: Fixed race condition in C implementation of + functools.lru_cache. KeyError could be raised when cached function with + full cache was simultaneously called from different threads with the same + uncached arguments. + +- bpo-29142: In urllib.request, suffixes in no_proxy environment variable + with leading dots could match related hostnames again (e.g. .b.c matches + a.b.c). Patch by Milan Oberkirch. + +Documentation +------------- + +- bpo-30176: Add missing attribute related constants in curses + documentation. + +- bpo-26985: Add missing info of code object in inspect documentation. + +- bpo-28929: Link the documentation to its source file on GitHub. + +- bpo-25008: Document smtpd.py as effectively deprecated and add a pointer + to aiosmtpd, a third-party asyncio-based replacement. + +- bpo-26355: Add canonical header link on each page to corresponding major + version of the documentation. Patch by Matthias Bussonnier. + +- bpo-29349: Fix Python 2 syntax in code for building the documentation. + +Tests +----- + +- bpo-30822: Fix regrtest command line parser to allow passing -u + extralargefile to run test_zipfile64. + +- bpo-30383: regrtest: Enhance regrtest and backport features from the + master branch. Add options: --coverage, --testdir, --list-tests (list test + files, don't run them), --list-cases (list test identifiers, don't run + them, :issue:`30523`), --matchfile (load a list of test filters from a + text file, :issue:`30540`), --slowest (alias to --slow). Enhance output: + add timestamp, test result, currently running tests, "Tests result: xxx" + summary with total duration, etc. Fix reference leak hunting in regrtest, + --huntrleaks: regrtest now warms up caches, create explicitly all internal + singletons which are created on demand to prevent false positives when + checking for reference leaks. (:issue:`30675`). + +- bpo-30357: test_thread: setUp() now uses support.threading_setup() and + support.threading_cleanup() to wait until threads complete to avoid random + side effects on following tests. Initial patch written by Grzegorz + Grzywacz. + +- bpo-28087: Skip test_asyncore and test_eintr poll failures on macOS. Skip + some tests of select.poll when running on macOS due to unresolved issues + with the underlying system poll function on some macOS versions. + +- bpo-30197: Enhanced functions swap_attr() and swap_item() in the + test.support module. They now work when delete replaced attribute or item + inside the with statement. The old value of the attribute or item (or + None if it doesn't exist) now will be assigned to the target of the "as" + clause, if there is one. + +- bpo-29571: to match the behaviour of the ``re.LOCALE`` flag, + test_re.test_locale_flag now uses ``locale.getpreferredencoding(False)`` + to determine the candidate encoding for the test regex (allowing it to + correctly skip the test when the default locale encoding is a multi-byte + encoding) + +Build +----- + +- bpo-29243: Prevent unnecessary rebuilding of Python during ``make test``, + ``make install`` and some other make targets when configured with + ``--enable-optimizations``. + +- bpo-23404: Don't regenerate generated files based on file modification + time anymore: the action is now explicit. Replace ``make touch`` with + ``make regen-all``. + +- bpo-29643: Fix ``--enable-optimization`` didn't work. + +Windows +------- + +- bpo-30687: Locate msbuild.exe on Windows when building rather than + vcvarsall.bat + +- bpo-29392: Prevent crash when passing invalid arguments into msvcrt + module. + +C API +----- + +- bpo-27867: Function PySlice_GetIndicesEx() is replaced with a macro if + Py_LIMITED_API is set to the value between 0x03050400 and 0x03060000 (not + including) or 0x03060100 or higher. + +- bpo-29083: Fixed the declaration of some public API functions. + PyArg_VaParse() and PyArg_VaParseTupleAndKeywords() were not available in + limited API. PyArg_ValidateKeywordArguments(), PyArg_UnpackTuple() and + Py_BuildValue() were not available in limited API of version < 3.3 when + PY_SSIZE_T_CLEAN is defined. + + +What's New in Python 3.5.3 final? +================================= + +*Release date: 2017-01-17* + +There were no code changes between 3.5.3rc1 and 3.5.3 final. + + + +What's New in Python 3.5.3 release candidate 1? +=============================================== + +*Release date: 2017-01-02* + +Core and Builtins +----------------- + +- bpo-29073: bytearray formatting no longer truncates on first null byte. + +- bpo-28932: Do not include if it does not exist. + +- bpo-28147: Fix a memory leak in split-table dictionaries: setattr() must + not convert combined table into split table. + +- bpo-25677: Correct the positioning of the syntax error caret for indented + blocks. Based on patch by Michael Layzell. + +- bpo-29000: Fixed bytes formatting of octals with zero padding in alternate + form. + +- bpo-28512: Fixed setting the offset attribute of SyntaxError by + PyErr_SyntaxLocationEx() and PyErr_SyntaxLocationObject(). + +- bpo-28991: functools.lru_cache() was susceptible to an obscure reentrancy + bug caused by a monkey-patched len() function. + +- bpo-28648: Fixed crash in Py_DecodeLocale() in debug build on Mac OS X + when decode astral characters. Patch by Xiang Zhang. + +- bpo-19398: Extra slash no longer added to sys.path components in case of + empty compile-time PYTHONPATH components. + +- bpo-28426: Fixed potential crash in PyUnicode_AsDecodedObject() in debug + build. + +- bpo-23782: Fixed possible memory leak in _PyTraceback_Add() and exception + loss in PyTraceBack_Here(). + +- bpo-28379: Added sanity checks and tests for PyUnicode_CopyCharacters(). + Patch by Xiang Zhang. + +- bpo-28376: The type of long range iterator is now registered as Iterator. + Patch by Oren Milman. + +- bpo-28376: The constructor of range_iterator now checks that step is not + 0. Patch by Oren Milman. + +- bpo-26906: Resolving special methods of uninitialized type now causes + implicit initialization of the type instead of a fail. + +- bpo-18287: PyType_Ready() now checks that tp_name is not NULL. Original + patch by Niklas Koep. + +- bpo-24098: Fixed possible crash when AST is changed in process of + compiling it. + +- bpo-28350: String constants with null character no longer interned. + +- bpo-26617: Fix crash when GC runs during weakref callbacks. + +- bpo-27942: String constants now interned recursively in tuples and + frozensets. + +- bpo-21578: Fixed misleading error message when ImportError called with + invalid keyword args. + +- bpo-28203: Fix incorrect type in error message from ``complex(1.0, + {2:3})``. Patch by Soumya Sharma. + +- bpo-27955: Fallback on reading /dev/urandom device when the getrandom() + syscall fails with EPERM, for example when blocked by SECCOMP. + +- bpo-28131: Fix a regression in zipimport's compile_source(). zipimport + should use the same optimization level as the interpreter. + +- bpo-25221: Fix corrupted result from PyLong_FromLong(0) when Python is + compiled with NSMALLPOSINTS = 0. + +- bpo-25758: Prevents zipimport from unnecessarily encoding a filename + (patch by Eryk Sun) + +- bpo-28189: dictitems_contains no longer swallows compare errors. (Patch by + Xiang Zhang) + +- bpo-27812: Properly clear out a generator's frame's backreference to the + generator to prevent crashes in frame.clear(). + +- bpo-27811: Fix a crash when a coroutine that has not been awaited is + finalized with warnings-as-errors enabled. + +- bpo-27587: Fix another issue found by PVS-Studio: Null pointer check after + use of 'def' in _PyState_AddModule(). Initial patch by Christian Heimes. + +- bpo-26020: set literal evaluation order did not match documented + behaviour. + +- bpo-27782: Multi-phase extension module import now correctly allows the + ``m_methods`` field to be used to add module level functions to instances + of non-module types returned from ``Py_create_mod``. Patch by Xiang Zhang. + +- bpo-27936: The round() function accepted a second None argument for some + types but not for others. Fixed the inconsistency by accepting None for + all numeric types. + +- bpo-27487: Warn if a submodule argument to "python -m" or + runpy.run_module() is found in sys.modules after parent packages are + imported, but before the submodule is executed. + +- bpo-27558: Fix a SystemError in the implementation of "raise" statement. + In a brand new thread, raise a RuntimeError since there is no active + exception to reraise. Patch written by Xiang Zhang. + +- bpo-27419: Standard __import__() no longer look up "__import__" in globals + or builtins for importing submodules or "from import". Fixed handling an + error of non-string package name. + +- bpo-27083: Respect the PYTHONCASEOK environment variable under Windows. + +- bpo-27514: Make having too many statically nested blocks a SyntaxError + instead of SystemError. + +- bpo-27473: Fixed possible integer overflow in bytes and bytearray + concatenations. Patch by Xiang Zhang. + +- bpo-27507: Add integer overflow check in bytearray.extend(). Patch by + Xiang Zhang. + +- bpo-27581: Don't rely on wrapping for overflow check in + PySequence_Tuple(). Patch by Xiang Zhang. + +- bpo-27443: __length_hint__() of bytearray iterators no longer return a + negative integer for a resized bytearray. + +- bpo-27942: Fix memory leak in codeobject.c + +Library +------- + +- bpo-15812: inspect.getframeinfo() now correctly shows the first line of a + context. Patch by Sam Breese. + +- bpo-29094: Offsets in a ZIP file created with extern file object and modes + "w" and "x" now are relative to the start of the file. + +- bpo-13051: Fixed recursion errors in large or resized + curses.textpad.Textbox. Based on patch by Tycho Andersen. + +- bpo-29119: Fix weakrefs in the pure python version of + collections.OrderedDict move_to_end() method. Contributed by Andra + Bogildea. + +- bpo-9770: curses.ascii predicates now work correctly with negative + integers. + +- bpo-28427: old keys should not remove new values from WeakValueDictionary + when collecting from another thread. + +- bpo-28923: Remove editor artifacts from Tix.py. + +- bpo-28871: Fixed a crash when deallocate deep ElementTree. + +- bpo-19542: Fix bugs in WeakValueDictionary.setdefault() and + WeakValueDictionary.pop() when a GC collection happens in another thread. + +- bpo-20191: Fixed a crash in resource.prlimit() when pass a sequence that + doesn't own its elements as limits. + +- bpo-28779: multiprocessing.set_forkserver_preload() would crash the + forkserver process if a preloaded module instantiated some multiprocessing + objects such as locks. + +- bpo-28847: dbm.dumb now supports reading read-only files and no longer + writes the index file when it is not changed. + +- bpo-25659: In ctypes, prevent a crash calling the from_buffer() and + from_buffer_copy() methods on abstract classes like Array. + +- bpo-28732: Fix crash in os.spawnv() with no elements in args + +- bpo-28485: Always raise ValueError for negative + compileall.compile_dir(workers=...) parameter, even when multithreading is + unavailable. + +- bpo-28387: Fixed possible crash in _io.TextIOWrapper deallocator when the + garbage collector is invoked in other thread. Based on patch by Sebastian + Cufre. + +- bpo-27517: LZMA compressor and decompressor no longer raise exceptions if + given empty data twice. Patch by Benjamin Fogle. + +- bpo-28549: Fixed segfault in curses's addch() with ncurses6. + +- bpo-28449: tarfile.open() with mode "r" or "r:" now tries to open a tar + file with compression before trying to open it without compression. + Otherwise it had 50% chance failed with ignore_zeros=True. + +- bpo-23262: The webbrowser module now supports Firefox 36+ and derived + browsers. Based on patch by Oleg Broytman. + +- bpo-27939: Fixed bugs in tkinter.ttk.LabeledScale and tkinter.Scale caused + by representing the scale as float value internally in Tk. tkinter.IntVar + now works if float value is set to underlying Tk variable. + +- bpo-28255: calendar.TextCalendar().prmonth() no longer prints a space at + the start of new line after printing a month's calendar. Patch by Xiang + Zhang. + +- bpo-20491: The textwrap.TextWrapper class now honors non-breaking spaces. + Based on patch by Kaarle Ritvanen. + +- bpo-28353: os.fwalk() no longer fails on broken links. + +- bpo-25464: Fixed HList.header_exists() in tkinter.tix module by addin a + workaround to Tix library bug. + +- bpo-28488: shutil.make_archive() no longer add entry "./" to ZIP archive. + +- bpo-24452: Make webbrowser support Chrome on Mac OS X. + +- bpo-20766: Fix references leaked by pdb in the handling of SIGINT + handlers. + +- bpo-26293: Fixed writing ZIP files that starts not from the start of the + file. Offsets in ZIP file now are relative to the start of the archive in + conforming to the specification. + +- bpo-28321: Fixed writing non-BMP characters with binary format in + plistlib. + +- bpo-28322: Fixed possible crashes when unpickle itertools objects from + incorrect pickle data. Based on patch by John Leitch. + +- Fix possible integer overflows and crashes in the mmap module with unusual + usage patterns. + +- bpo-1703178: Fix the ability to pass the --link-objects option to the + distutils build_ext command. + +- bpo-28253: Fixed calendar functions for extreme months: 0001-01 and + 9999-12. Methods itermonthdays() and itermonthdays2() are reimplemented so + that they don't call itermonthdates() which can cause datetime.date + under/overflow. + +- bpo-28275: Fixed possible use after free in the decompress() methods of + the LZMADecompressor and BZ2Decompressor classes. Original patch by John + Leitch. + +- bpo-27897: Fixed possible crash in sqlite3.Connection.create_collation() + if pass invalid string-like object as a name. Patch by Xiang Zhang. + +- bpo-18893: Fix invalid exception handling in Lib/ctypes/macholib/dyld.py. + Patch by Madison May. + +- bpo-27611: Fixed support of default root window in the tkinter.tix module. + +- bpo-27348: In the traceback module, restore the formatting of exception + messages like "Exception: None". This fixes a regression introduced in + 3.5a2. + +- bpo-25651: Allow falsy values to be used for msg parameter of subTest(). + +- bpo-27932: Prevent memory leak in win32_ver(). + +- Fix UnboundLocalError in socket._sendfile_use_sendfile. + +- bpo-28075: Check for ERROR_ACCESS_DENIED in Windows implementation of + os.stat(). Patch by Eryk Sun. + +- bpo-25270: Prevent codecs.escape_encode() from raising SystemError when an + empty bytestring is passed. + +- bpo-28181: Get antigravity over HTTPS. Patch by Kaartic Sivaraam. + +- bpo-25895: Enable WebSocket URL schemes in urllib.parse.urljoin. Patch by + Gergely Imreh and Markus Holtermann. + +- bpo-27599: Fixed buffer overrun in binascii.b2a_qp() and + binascii.a2b_qp(). + +- bpo-19003: m email.generator now replaces only ``\r`` and/or ``\n`` line + endings, per the RFC, instead of all unicode line endings. + +- bpo-28019: itertools.count() no longer rounds non-integer step in range + between 1.0 and 2.0 to 1. + +- bpo-25969: Update the lib2to3 grammar to handle the unpacking + generalizations added in 3.5. + +- bpo-14977: mailcap now respects the order of the lines in the mailcap + files ("first match"), as required by RFC 1542. Patch by Michael Lazar. + +- bpo-24594: Validates persist parameter when opening MSI database + +- bpo-17582: xml.etree.ElementTree nows preserves whitespaces in attributes + (Patch by Duane Griffin. Reviewed and approved by Stefan Behnel.) + +- bpo-28047: Fixed calculation of line length used for the base64 CTE in the + new email policies. + +- bpo-27445: Don't pass str(_charset) to MIMEText.set_payload(). Patch by + Claude Paroz. + +- bpo-22450: urllib now includes an ``Accept: */*`` header among the default + headers. This makes the results of REST API requests more consistent and + predictable especially when proxy servers are involved. + +- lib2to3.pgen3.driver.load_grammar() now creates a stable cache file + between runs given the same Grammar.txt input regardless of the hash + randomization setting. + +- bpo-27570: Avoid zero-length memcpy() etc calls with null source pointers + in the "ctypes" and "array" modules. + +- bpo-22233: Break email header lines *only* on the RFC specified CR and LF + characters, not on arbitrary unicode line breaks. This also fixes a bug + in HTTP header parsing. + +- bpo-27988: Fix email iter_attachments incorrect mutation of payload list. + +- bpo-27691: Fix ssl module's parsing of GEN_RID subject alternative name + fields in X.509 certs. + +- bpo-27850: Remove 3DES from ssl module's default cipher list to counter + measure sweet32 attack (CVE-2016-2183). + +- bpo-27766: Add ChaCha20 Poly1305 to ssl module's default cipher list. + (Required OpenSSL 1.1.0 or LibreSSL). + +- bpo-26470: Port ssl and hashlib module to OpenSSL 1.1.0. + +- Remove support for passing a file descriptor to os.access. It never worked + but previously didn't raise. + +- bpo-12885: Fix error when distutils encounters symlink. + +- bpo-27881: Fixed possible bugs when setting + sqlite3.Connection.isolation_level. Based on patch by Xiang Zhang. + +- bpo-27861: Fixed a crash in sqlite3.Connection.cursor() when a factory + creates not a cursor. Patch by Xiang Zhang. + +- bpo-19884: Avoid spurious output on OS X with Gnu Readline. + +- bpo-27706: Restore deterministic behavior of random.Random().seed() for + string seeds using seeding version 1. Allows sequences of calls to + random() to exactly match those obtained in Python 2. Patch by Nofar + Schnider. + +- bpo-10513: Fix a regression in Connection.commit(). Statements should not + be reset after a commit. + +- A new version of typing.py from https://github.com/python/typing: + Collection (only for 3.6) (Issue #27598). Add FrozenSet to __all__ + (upstream #261). Fix crash in _get_type_vars() (upstream #259). Remove the + dict constraint in ForwardRef._eval_type (upstream #252). + +- bpo-27539: Fix unnormalised ``Fraction.__pow__`` result in the case of + negative exponent and negative base. + +- bpo-21718: cursor.description is now available for queries using CTEs. + +- bpo-2466: posixpath.ismount now correctly recognizes mount points which + the user does not have permission to access. + +- bpo-27773: Correct some memory management errors server_hostname in + _ssl.wrap_socket(). + +- bpo-26750: unittest.mock.create_autospec() now works properly for + subclasses of property() and other data descriptors. + +- In the curses module, raise an error if window.getstr() or window.instr() + is passed a negative value. + +- bpo-27783: Fix possible usage of uninitialized memory in + operator.methodcaller. + +- bpo-27774: Fix possible Py_DECREF on unowned object in _sre. + +- bpo-27760: Fix possible integer overflow in binascii.b2a_qp. + +- bpo-27758: Fix possible integer overflow in the _csv module for large + record lengths. + +- bpo-27568: Prevent HTTPoxy attack (CVE-2016-1000110). Ignore the + HTTP_PROXY variable when REQUEST_METHOD environment is set, which + indicates that the script is in CGI mode. + +- bpo-27656: Do not assume sched.h defines any SCHED_* constants. + +- bpo-27130: In the "zlib" module, fix handling of large buffers (typically + 4 GiB) when compressing and decompressing. Previously, inputs were + limited to 4 GiB, and compression and decompression operations did not + properly handle results of 4 GiB. + +- bpo-27533: Release GIL in nt._isdir + +- bpo-17711: Fixed unpickling by the persistent ID with protocol 0. Original + patch by Alexandre Vassalotti. + +- bpo-27522: Avoid an unintentional reference cycle in email.feedparser. + +- bpo-26844: Fix error message for imp.find_module() to refer to 'path' + instead of 'name'. Patch by Lev Maximov. + +- bpo-23804: Fix SSL zero-length recv() calls to not block and not raise an + error about unclean EOF. + +- bpo-27466: Change time format returned by http.cookie.time2netscape, + confirming the netscape cookie format and making it consistent with + documentation. + +- bpo-26664: Fix activate.fish by removing mis-use of ``$``. + +- bpo-22115: Fixed tracing Tkinter variables: trace_vdelete() with wrong + mode no longer break tracing, trace_vinfo() now always returns a list of + pairs of strings, tracing in the "u" mode now works. + +- Fix a scoping issue in importlib.util.LazyLoader which triggered an + UnboundLocalError when lazy-loading a module that was already put into + sys.modules. + +- bpo-27079: Fixed curses.ascii functions isblank(), iscntrl() and + ispunct(). + +- bpo-26754: Some functions (compile() etc) accepted a filename argument + encoded as an iterable of integers. Now only strings and byte-like objects + are accepted. + +- bpo-27048: Prevents distutils failing on Windows when environment + variables contain non-ASCII characters + +- bpo-27330: Fixed possible leaks in the ctypes module. + +- bpo-27238: Got rid of bare excepts in the turtle module. Original patch + by Jelle Zijlstra. + +- bpo-27122: When an exception is raised within the context being managed by + a contextlib.ExitStack() and one of the exit stack generators catches and + raises it in a chain, do not re-raise the original exception when exiting, + let the new chained one through. This avoids the :pep:`479` bug described + in issue25782. + +Security +-------- + +- bpo-27278: Fix os.urandom() implementation using getrandom() on Linux. + Truncate size to INT_MAX and loop until we collected enough random bytes, + instead of casting a directly Py_ssize_t to int. + +Library +------- + +- bpo-26386: Fixed ttk.TreeView selection operations with item id's + containing spaces. + +Security +-------- + +- bpo-22636: Avoid shell injection problems with ctypes.util.find_library(). + +Library +------- + +- bpo-16182: Fix various functions in the "readline" module to use the + locale encoding, and fix get_begidx() and get_endidx() to return code + point indexes. + +- bpo-27392: Add loop.connect_accepted_socket(). Patch by Jim Fulton. + +- bpo-27930: Improved behaviour of logging.handlers.QueueListener. Thanks to + Paulo Andrade and Petr Viktorin for the analysis and patch. + +- bpo-21201: Improves readability of multiprocessing error message. Thanks + to Wojciech Walczak for patch. + +- bpo-27456: asyncio: Set TCP_NODELAY by default. + +- bpo-27906: Fix socket accept exhaustion during high TCP traffic. Patch by + Kevin Conway. + +- bpo-28174: Handle when SO_REUSEPORT isn't properly supported. Patch by + Seth Michael Larson. + +- bpo-26654: Inspect functools.partial in asyncio.Handle.__repr__. Patch by + iceboy. + +- bpo-26909: Fix slow pipes IO in asyncio. Patch by INADA Naoki. + +- bpo-28176: Fix callbacks race in asyncio.SelectorLoop.sock_connect. + +- bpo-27759: Fix selectors incorrectly retain invalid file descriptors. + Patch by Mark Williams. + +- bpo-28368: Refuse monitoring processes if the child watcher has no loop + attached. Patch by Vincent Michel. + +- bpo-28369: Raise RuntimeError when transport's FD is used with add_reader, + add_writer, etc. + +- bpo-28370: Speedup asyncio.StreamReader.readexactly. Patch by Коренберг + Марк. + +- bpo-28371: Deprecate passing asyncio.Handles to run_in_executor. + +- bpo-28372: Fix asyncio to support formatting of non-python coroutines. + +- bpo-28399: Remove UNIX socket from FS before binding. Patch by Коренберг + Марк. + +- bpo-27972: Prohibit Tasks to await on themselves. + +- bpo-26923: Fix asyncio.Gather to refuse being cancelled once all children + are done. Patch by Johannes Ebke. + +- bpo-26796: Don't configure the number of workers for default threadpool + executor. Initial patch by Hans Lawrenz. + +- bpo-28600: Optimize loop.call_soon(). + +- bpo-28613: Fix get_event_loop() return the current loop if called from + coroutines/callbacks. + +- bpo-28639: Fix inspect.isawaitable to always return bool Patch by Justin + Mayfield. + +- bpo-28652: Make loop methods reject socket kinds they do not support. + +- bpo-28653: Fix a refleak in functools.lru_cache. + +- bpo-28703: Fix asyncio.iscoroutinefunction to handle Mock objects. + +- bpo-24142: Reading a corrupt config file left the parser in an invalid + state. Original patch by Florian Höch. + +- bpo-28990: Fix SSL hanging if connection is closed before handshake + completed. (Patch by HoHo-Ho) + +IDLE +---- + +- bpo-15308: Add 'interrupt execution' (^C) to Shell menu. Patch by Roger + Serwy, updated by Bayard Randel. + +- bpo-27922: Stop IDLE tests from 'flashing' gui widgets on the screen. + +- Add version to title of IDLE help window. + +- bpo-25564: In section on IDLE -- console differences, mention that using + exec means that __builtins__ is defined for each statement. + +- bpo-27714: text_textview and test_autocomplete now pass when re-run in the + same process. This occurs when test_idle fails when run with the -w + option but without -jn. Fix warning from test_config. + +- bpo-25507: IDLE no longer runs buggy code because of its tkinter imports. + Users must include the same imports required to run directly in Python. + +- bpo-27452: add line counter and crc to IDLE configHandler test dump. + +- bpo-27365: Allow non-ascii chars in IDLE NEWS.txt, for contributor names. + +- bpo-27245: IDLE: Cleanly delete custom themes and key bindings. + Previously, when IDLE was started from a console or by import, a cascade + of warnings was emitted. Patch by Serhiy Storchaka. + +C API +----- + +- bpo-28808: PyUnicode_CompareWithASCIIString() now never raises exceptions. + +- bpo-26754: PyUnicode_FSDecoder() accepted a filename argument encoded as + an iterable of integers. Now only strings and bytes-like objects are + accepted. + +Documentation +------------- + +- bpo-28513: Documented command-line interface of zipfile. + +Tests +----- + +- bpo-28950: Disallow -j0 to be combined with -T/-l/-M in regrtest command + line arguments. + +- bpo-28666: Now test.support.rmtree is able to remove unwritable or + unreadable directories. + +- bpo-23839: Various caches now are cleared before running every test file. + +- bpo-28409: regrtest: fix the parser of command line arguments. + +- bpo-27787: Call gc.collect() before checking each test for "dangling + threads", since the dangling threads are weak references. + +- bpo-27369: In test_pyexpat, avoid testing an error message detail that + changed in Expat 2.2.0. + +Tools/Demos +----------- + +- bpo-27952: Get Tools/scripts/fixcid.py working with Python 3 and the + current "re" module, avoid invalid Python backslash escapes, and fix a bug + parsing escaped C quote signs. + +- bpo-27332: Fixed the type of the first argument of module-level functions + generated by Argument Clinic. Patch by Petr Viktorin. + +- bpo-27418: Fixed Tools/importbench/importbench.py. + +Windows +------- + +- bpo-28251: Improvements to help manuals on Windows. + +- bpo-28110: launcher.msi has different product codes between 32-bit and + 64-bit + +- bpo-25144: Ensures TargetDir is set before continuing with custom install. + +- bpo-27469: Adds a shell extension to the launcher so that drag and drop + works correctly. + +- bpo-27309: Enabled proper Windows styles in python[w].exe manifest. + +Build +----- + +- bpo-29080: Removes hard dependency on hg.exe from PCBuild/build.bat + +- bpo-23903: Added missed names to PC/python3.def. + +- bpo-10656: Fix out-of-tree building on AIX. Patch by Tristan Carel and + Michael Haubenwallner. + +- bpo-26359: Rename --with-optimiations to --enable-optimizations. + +- bpo-28444: Fix missing extensions modules when cross compiling. + +- bpo-28248: Update Windows build and OS X installers to use OpenSSL 1.0.2j. + +- bpo-28258: Fixed build with Estonian locale (python-config and distclean + targets in Makefile). Patch by Arfrever Frehtes Taifersar Arahesis. + +- bpo-26661: setup.py now detects system libffi with multiarch wrapper. + +- bpo-28066: Fix the logic that searches build directories for generated + include files when building outside the source tree. + +- bpo-15819: Remove redundant include search directory option for building + outside the source tree. + +- bpo-27566: Fix clean target in freeze makefile (patch by Lisa Roach) + +- bpo-27705: Update message in validate_ucrtbase.py + +- bpo-27983: Cause lack of llvm-profdata tool when using clang as required + for PGO linking to be a configure time error rather than make time when + --with-optimizations is enabled. Also improve our ability to find the + llvm-profdata tool on MacOS and some Linuxes. + +- bpo-26307: The profile-opt build now applies PGO to the built-in modules. + +- bpo-26359: Add the --with-optimizations configure flag. + +- bpo-27713: Suppress spurious build warnings when updating importlib's + bootstrap files. Patch by Xiang Zhang + +- bpo-25825: Correct the references to Modules/python.exp and ld_so_aix, + which are required on AIX. This updates references to an installation + path that was changed in 3.2a4, and undoes changed references to the build + tree that were made in 3.5.0a1. + +- bpo-27453: CPP invocation in configure must use CPPFLAGS. Patch by Chi + Hsuan Yen. + +- bpo-27641: The configure script now inserts comments into the makefile to + prevent the pgen and _freeze_importlib executables from being + cross-compiled. + +- bpo-26662: Set PYTHON_FOR_GEN in configure as the Python program to be + used for file generation during the build. + +- bpo-10910: Avoid C++ compilation errors on FreeBSD and OS X. Also update + FreedBSD version checks for the original ctype UTF-8 workaround. + +- bpo-28676: Prevent missing 'getentropy' declaration warning on macOS. + Patch by Gareth Rees. + + +What's New in Python 3.5.2 final? +================================= + +*Release date: 2016-06-26* + +Core and Builtins +----------------- + +- bpo-26930: Update Windows builds to use OpenSSL 1.0.2h. + +Tests +----- + +- bpo-26867: Ubuntu's openssl OP_NO_SSLv3 is forced on by default; fix test. + +IDLE +---- + +- bpo-27365: Allow non-ascii in idlelib/NEWS.txt - minimal part for 3.5.2. + + +What's New in Python 3.5.2 release candidate 1? +=============================================== + +*Release date: 2016-06-12* + +Core and Builtins +----------------- + +- bpo-27066: Fixed SystemError if a custom opener (for open()) returns a + negative number without setting an exception. + +- bpo-20041: Fixed TypeError when frame.f_trace is set to None. Patch by + Xavier de Gaye. + +- bpo-26168: Fixed possible refleaks in failing Py_BuildValue() with the "N" + format unit. + +- bpo-26991: Fix possible refleak when creating a function with annotations. + +- bpo-27039: Fixed bytearray.remove() for values greater than 127. Patch by + Joe Jevnik. + +- bpo-23640: int.from_bytes() no longer bypasses constructors for + subclasses. + +- bpo-26811: gc.get_objects() no longer contains a broken tuple with NULL + pointer. + +- bpo-20120: Use RawConfigParser for .pypirc parsing, removing support for + interpolation unintentionally added with move to Python 3. Behavior no + longer does any interpolation in .pypirc files, matching behavior in + Python 2.7 and Setuptools 19.0. + +- bpo-26659: Make the builtin slice type support cycle collection. + +- bpo-26718: super.__init__ no longer leaks memory if called multiple times. + NOTE: A direct call of super.__init__ is not endorsed! + +- bpo-25339: PYTHONIOENCODING now has priority over locale in setting the + error handler for stdin and stdout. + +- bpo-26494: Fixed crash on iterating exhausting iterators. Affected classes + are generic sequence iterators, iterators of str, bytes, bytearray, list, + tuple, set, frozenset, dict, OrderedDict, corresponding views and + os.scandir() iterator. + +- bpo-26581: If coding cookie is specified multiple times on a line in + Python source code file, only the first one is taken to account. + +- bpo-26464: Fix str.translate() when string is ASCII and first replacements + removes character, but next replacement uses a non-ASCII character or a + string longer than 1 character. Regression introduced in Python 3.5.0. + +- bpo-22836: Ensure exception reports from PyErr_Display() and + PyErr_WriteUnraisable() are sensible even when formatting them produces + secondary errors. This affects the reports produced by + sys.__excepthook__() and when __del__() raises an exception. + +- bpo-26302: Correct behavior to reject comma as a legal character for + cookie names. + +- bpo-4806: Avoid masking the original TypeError exception when using star + (``*``) unpacking in function calls. Based on patch by Hagen Fürstenau + and Daniel Urban. + +- bpo-27138: Fix the doc comment for FileFinder.find_spec(). + +- bpo-26154: Add a new private _PyThreadState_UncheckedGet() function to get + the current Python thread state, but don't issue a fatal error if it is + NULL. This new function must be used instead of accessing directly the + _PyThreadState_Current variable. The variable is no more exposed since + Python 3.5.1 to hide the exact implementation of atomic C types, to avoid + compiler issues. + +- bpo-26194: Deque.insert() gave odd results for bounded deques that had + reached their maximum size. Now an IndexError will be raised when + attempting to insert into a full deque. + +- bpo-25843: When compiling code, don't merge constants if they are equal + but have a different types. For example, ``f1, f2 = lambda: 1, lambda: + 1.0`` is now correctly compiled to two different functions: ``f1()`` + returns ``1`` (``int``) and ``f2()`` returns ``1.0`` (``int``), even if + ``1`` and ``1.0`` are equal. + +- bpo-22995: [UPDATE] Comment out the one of the pickleability tests in + _PyObject_GetState() due to regressions observed in Cython-based projects. + +- bpo-25961: Disallowed null characters in the type name. + +- bpo-25973: Fix segfault when an invalid nonlocal statement binds a name + starting with two underscores. + +- bpo-22995: Instances of extension types with a state that aren't + subclasses of list or dict and haven't implemented any pickle-related + methods (__reduce__, __reduce_ex__, __getnewargs__, __getnewargs_ex__, or + __getstate__), can no longer be pickled. Including memoryview. + +- bpo-20440: Massive replacing unsafe attribute setting code with special + macro Py_SETREF. + +- bpo-25766: Special method __bytes__() now works in str subclasses. + +- bpo-25421: __sizeof__ methods of builtin types now use dynamic basic size. + This allows sys.getsize() to work correctly with their subclasses with + __slots__ defined. + +- bpo-25709: Fixed problem with in-place string concatenation and utf-8 + cache. + +- bpo-27147: Mention :pep:`420` in the importlib docs. + +- bpo-24097: Fixed crash in object.__reduce__() if slot name is freed inside + __getattr__. + +- bpo-24731: Fixed crash on converting objects with special methods + __bytes__, __trunc__, and __float__ returning instances of subclasses of + bytes, int, and float to subclasses of bytes, int, and float + correspondingly. + +- bpo-26478: Fix semantic bugs when using binary operators with dictionary + views and tuples. + +- bpo-26171: Fix possible integer overflow and heap corruption in + zipimporter.get_data(). + +- bpo-25660: Fix TAB key behaviour in REPL with readline. + +- bpo-25887: Raise a RuntimeError when a coroutine object is awaited more + than once. + +- bpo-27243: Update the __aiter__ protocol: instead of returning an + awaitable that resolves to an asynchronous iterator, the asynchronous + iterator should be returned directly. Doing the former will trigger a + PendingDeprecationWarning. + +Security +-------- + +- bpo-26556: Update expat to 2.1.1, fixes CVE-2015-1283. + +- Fix TLS stripping vulnerability in smtplib, CVE-2016-0772. Reported by + Team Oststrom + +Library +------- + +- bpo-21386: Implement missing IPv4Address.is_global property. It was + documented since 07a5610bae9d. Initial patch by Roger Luethi. + +- bpo-20900: distutils register command now decodes HTTP responses + correctly. Initial patch by ingrid. + +- A new version of typing.py provides several new classes and features: + @overload outside stubs, Reversible, DefaultDict, Text, ContextManager, + Type[], NewType(), TYPE_CHECKING, and numerous bug fixes (note that some + of the new features are not yet implemented in mypy or other static + analyzers). Also classes for :pep:`492` (Awaitable, AsyncIterable, + AsyncIterator) have been added (in fact they made it into 3.5.1 but were + never mentioned). + +- bpo-25738: Stop http.server.BaseHTTPRequestHandler.send_error() from + sending a message body for 205 Reset Content. Also, don't send Content + header fields in responses that don't have a body. Patch by Susumu + Koshiba. + +- bpo-21313: Fix the "platform" module to tolerate when sys.version contains + truncated build information. + +Security +-------- + +- bpo-26839: On Linux, :func:`os.urandom` now calls ``getrandom()`` with + ``GRND_NONBLOCK`` to fall back on reading ``/dev/urandom`` if the urandom + entropy pool is not initialized yet. Patch written by Colm Buckley. + +Library +------- + +- bpo-27164: In the zlib module, allow decompressing raw Deflate streams + with a predefined zdict. Based on patch by Xiang Zhang. + +- bpo-24291: Fix wsgiref.simple_server.WSGIRequestHandler to completely + write data to the client. Previously it could do partial writes and + truncate data. Also, wsgiref.handler.ServerHandler can now handle stdout + doing partial writes, but this is deprecated. + +- bpo-26809: Add ``__all__`` to :mod:`string`. Patch by Emanuel Barry. + +- bpo-26373: subprocess.Popen.communicate now correctly ignores + BrokenPipeError when the child process dies before .communicate() is + called in more/all circumstances. + +- bpo-21776: distutils.upload now correctly handles HTTPError. Initial patch + by Claudiu Popa. + +- bpo-27114: Fix SSLContext._load_windows_store_certs fails with + PermissionError + +- bpo-18383: Avoid creating duplicate filters when using filterwarnings and + simplefilter. Based on patch by Alex Shkop. + +- bpo-27057: Fix os.set_inheritable() on Android, ioctl() is blocked by + SELinux and fails with EACCESS. The function now falls back to fcntl(). + Patch written by Michał Bednarski. + +- bpo-27014: Fix infinite recursion using typing.py. Thanks to Kalle Tuure! + +- bpo-14132: Fix urllib.request redirect handling when the target only has a + query string. Original fix by Ján Janech. + +- bpo-17214: The "urllib.request" module now percent-encodes non-ASCII bytes + found in redirect target URLs. Some servers send Location header fields + with non-ASCII bytes, but "http.client" requires the request target to be + ASCII-encodable, otherwise a UnicodeEncodeError is raised. Based on patch + by Christian Heimes. + +- bpo-26892: Honor debuglevel flag in urllib.request.HTTPHandler. Patch + contributed by Chi Hsuan Yen. + +- bpo-22274: In the subprocess module, allow stderr to be redirected to + stdout even when stdout is not redirected. Patch by Akira Li. + +- bpo-26807: mock_open 'files' no longer error on readline at end of file. + Patch from Yolanda Robla. + +- bpo-25745: Fixed leaking a userptr in curses panel destructor. + +- bpo-26977: Removed unnecessary, and ignored, call to sum of squares helper + in statistics.pvariance. + +- bpo-26881: The modulefinder module now supports extended opcode arguments. + +- bpo-23815: Fixed crashes related to directly created instances of types in + _tkinter and curses.panel modules. + +- bpo-17765: weakref.ref() no longer silently ignores keyword arguments. + Patch by Georg Brandl. + +- bpo-26873: xmlrpc now raises ResponseError on unsupported type tags + instead of silently return incorrect result. + +- bpo-26711: Fixed the comparison of plistlib.Data with other types. + +- bpo-24114: Fix an uninitialized variable in `ctypes.util`. The bug only + occurs on SunOS when the ctypes implementation searches for the `crle` + program. Patch by Xiang Zhang. Tested on SunOS by Kees Bos. + +- bpo-26864: In urllib.request, change the proxy bypass host checking + against no_proxy to be case-insensitive, and to not match unrelated host + names that happen to have a bypassed hostname as a suffix. Patch by Xiang + Zhang. + +- bpo-26634: recursive_repr() now sets __qualname__ of wrapper. Patch by + Xiang Zhang. + +- bpo-26804: urllib.request will prefer lower_case proxy environment + variables over UPPER_CASE or Mixed_Case ones. Patch contributed by + Hans-Peter Jansen. + +- bpo-26837: assertSequenceEqual() now correctly outputs non-stringified + differing items (like bytes in the -b mode). This affects + assertListEqual() and assertTupleEqual(). + +- bpo-26041: Remove "will be removed in Python 3.7" from deprecation + messages of platform.dist() and platform.linux_distribution(). Patch by + Kumaripaba Miyurusara Athukorala. + +- bpo-26822: itemgetter, attrgetter and methodcaller objects no longer + silently ignore keyword arguments. + +- bpo-26733: Disassembling a class now disassembles class and static + methods. Patch by Xiang Zhang. + +- bpo-26801: Fix error handling in :func:`shutil.get_terminal_size`, catch + :exc:`AttributeError` instead of :exc:`NameError`. Patch written by + Emanuel Barry. + +- bpo-24838: tarfile's ustar and gnu formats now correctly calculate name + and link field limits for multibyte character encodings like utf-8. + +Security +-------- + +- bpo-26657: Fix directory traversal vulnerability with http.server on + Windows. This fixes a regression that was introduced in 3.3.4rc1 and + 3.4.0rc1. Based on patch by Philipp Hagemeister. + +Library +------- + +- bpo-26717: Stop encoding Latin-1-ized WSGI paths with UTF-8. Patch by + Anthony Sottile. + +- bpo-26735: Fix :func:`os.urandom` on Solaris 11.3 and newer when reading + more than 1,024 bytes: call ``getrandom()`` multiple times with a limit of + 1024 bytes per call. + +- bpo-16329: Add .webm to mimetypes.types_map. Patch by Giampaolo Rodola'. + +- bpo-13952: Add .csv to mimetypes.types_map. Patch by Geoff Wilson. + +- bpo-26709: Fixed Y2038 problem in loading binary PLists. + +- bpo-23735: Handle terminal resizing with Readline 6.3+ by installing our + own SIGWINCH handler. Patch by Eric Price. + +- bpo-26586: In http.server, respond with "413 Request header fields too + large" if there are too many header fields to parse, rather than killing + the connection and raising an unhandled exception. Patch by Xiang Zhang. + +- bpo-22854: Change BufferedReader.writable() and BufferedWriter.readable() + to always return False. + +- bpo-25195: Fix a regression in mock.MagicMock. _Call is a subclass of + tuple (changeset 3603bae63c13 only works for classes) so we need to + implement __ne__ ourselves. Patch by Andrew Plummer. + +- bpo-26644: Raise ValueError rather than SystemError when a negative length + is passed to SSLSocket.recv() or read(). + +- bpo-23804: Fix SSL recv(0) and read(0) methods to return zero bytes + instead of up to 1024. + +- bpo-26616: Fixed a bug in datetime.astimezone() method. + +- bpo-21925: :func:`warnings.formatwarning` now catches exceptions on + ``linecache.getline(...)`` to be able to log :exc:`ResourceWarning` + emitted late during the Python shutdown process. + +- bpo-24266: Ctrl+C during Readline history search now cancels the search + mode when compiled with Readline 7. + +- bpo-26560: Avoid potential ValueError in BaseHandler.start_response. + Initial patch by Peter Inglesby. + +Security +-------- + +- bpo-26313: ssl.py _load_windows_store_certs fails if windows cert store is + empty. Patch by Baji. + +Library +------- + +- bpo-26569: Fix :func:`pyclbr.readmodule` and :func:`pyclbr.readmodule_ex` + to support importing packages. + +- bpo-26499: Account for remaining Content-Length in HTTPResponse.readline() + and read1(). Based on patch by Silent Ghost. Also document that + HTTPResponse now supports these methods. + +- bpo-25320: Handle sockets in directories unittest discovery is scanning. + Patch from Victor van den Elzen. + +- bpo-16181: cookiejar.http2time() now returns None if year is higher than + datetime.MAXYEAR. + +- bpo-26513: Fixes platform module detection of Windows Server + +- bpo-23718: Fixed parsing time in week 0 before Jan 1. Original patch by + Tamás Bence Gedai. + +- bpo-20589: Invoking Path.owner() and Path.group() on Windows now raise + NotImplementedError instead of ImportError. + +- bpo-26177: Fixed the keys() method for Canvas and Scrollbar widgets. + +- bpo-15068: Got rid of excessive buffering in the fileinput module. The + bufsize parameter is no longer used. + +- bpo-2202: Fix UnboundLocalError in + AbstractDigestAuthHandler.get_algorithm_impls. Initial patch by Mathieu + Dupuy. + +- bpo-25718: Fixed pickling and copying the accumulate() iterator with total + is None. + +- bpo-26475: Fixed debugging output for regular expressions with the (?x) + flag. + +- bpo-26457: Fixed the subnets() methods in IP network classes for the case + when resulting prefix length is equal to maximal prefix length. Based on + patch by Xiang Zhang. + +- bpo-26385: Remove the file if the internal open() call in + NamedTemporaryFile() fails. Patch by Silent Ghost. + +- bpo-26402: Fix XML-RPC client to retry when the server shuts down a + persistent connection. This was a regression related to the new + http.client.RemoteDisconnected exception in 3.5.0a4. + +- bpo-25913: Leading ``<~`` is optional now in base64.a85decode() with + adobe=True. Patch by Swati Jaiswal. + +- bpo-26186: Remove an invalid type check in importlib.util.LazyLoader. + +- bpo-26367: importlib.__import__() raises SystemError like + builtins.__import__() when ``level`` is specified but without an + accompanying package specified. + +- bpo-26309: In the "socketserver" module, shut down the request (closing + the connected socket) when verify_request() returns false. Patch by Aviv + Palivoda. + +Security +-------- + +- bpo-25939: On Windows open the cert store readonly in + ssl.enum_certificates. + +Library +------- + +- bpo-25995: os.walk() no longer uses FDs proportional to the tree depth. + +- bpo-26117: The os.scandir() iterator now closes file descriptor not only + when the iteration is finished, but when it was failed with error. + +- bpo-25911: Restored support of bytes paths in os.walk() on Windows. + +- bpo-26045: Add UTF-8 suggestion to error message when posting a + non-Latin-1 string with http.client. + +- bpo-12923: Reset FancyURLopener's redirect counter even if there is an + exception. Based on patches by Brian Brazil and Daniel Rocco. + +- bpo-25945: Fixed a crash when unpickle the functools.partial object with + wrong state. Fixed a leak in failed functools.partial constructor. "args" + and "keywords" attributes of functools.partial have now always types tuple + and dict correspondingly. + +- bpo-26202: copy.deepcopy() now correctly copies range() objects with + non-atomic attributes. + +- bpo-23076: Path.glob() now raises a ValueError if it's called with an + invalid pattern. Patch by Thomas Nyberg. + +- bpo-19883: Fixed possible integer overflows in zipimport. + +- bpo-26227: On Windows, getnameinfo(), gethostbyaddr() and + gethostbyname_ex() functions of the socket module now decode the hostname + from the ANSI code page rather than UTF-8. + +- bpo-26147: xmlrpc now works with strings not encodable with used non-UTF-8 + encoding. + +- bpo-25935: Garbage collector now breaks reference loops with OrderedDict. + +- bpo-16620: Fixed AttributeError in msilib.Directory.glob(). + +- bpo-26013: Added compatibility with broken protocol 2 pickles created in + old Python 3 versions (3.4.3 and lower). + +- bpo-25850: Use cross-compilation by default for 64-bit Windows. + +- bpo-17633: Improve zipimport's support for namespace packages. + +- bpo-24705: Fix sysconfig._parse_makefile not expanding ${} vars appearing + before $() vars. + +- bpo-22138: Fix mock.patch behavior when patching descriptors. Restore + original values after patching. Patch contributed by Sean McCully. + +- bpo-25672: In the ssl module, enable the SSL_MODE_RELEASE_BUFFERS mode + option if it is safe to do so. + +- bpo-26012: Don't traverse into symlinks for ``**`` pattern in + pathlib.Path.[r]glob(). + +- bpo-24120: Ignore PermissionError when traversing a tree with + pathlib.Path.[r]glob(). Patch by Ulrich Petri. + +- bpo-25447: fileinput now uses sys.stdin as-is if it does not have a buffer + attribute (restores backward compatibility). + +- bpo-25447: Copying the lru_cache() wrapper object now always works, + independently from the type of the wrapped object (by returning the + original object unchanged). + +- bpo-24103: Fixed possible use after free in ElementTree.XMLPullParser. + +- bpo-25860: os.fwalk() no longer skips remaining directories when error + occurs. Original patch by Samson Lee. + +- bpo-25914: Fixed and simplified OrderedDict.__sizeof__. + +- bpo-25902: Fixed various refcount issues in ElementTree iteration. + +- bpo-25717: Restore the previous behaviour of tolerating most fstat() + errors when opening files. This was a regression in 3.5a1, and stopped + anonymous temporary files from working in special cases. + +- bpo-24903: Fix regression in number of arguments compileall accepts when + '-d' is specified. The check on the number of arguments has been dropped + completely as it never worked correctly anyway. + +- bpo-25764: In the subprocess module, preserve any exception caused by + fork() failure when preexec_fn is used. + +- bpo-6478: _strptime's regexp cache now is reset after changing timezone + with time.tzset(). + +- bpo-14285: When executing a package with the "python -m package" option, + and package initialization fails, a proper traceback is now reported. The + "runpy" module now lets exceptions from package initialization pass back + to the caller, rather than raising ImportError. + +- bpo-19771: Also in runpy and the "-m" option, omit the irrelevant message + ". . . is a package and cannot be directly executed" if the package could + not even be initialized (e.g. due to a bad ``*.pyc`` file). + +- bpo-25177: Fixed problem with the mean of very small and very large + numbers. As a side effect, statistics.mean and statistics.variance should + be significantly faster. + +- bpo-25718: Fixed copying object with state with boolean value is false. + +- bpo-10131: Fixed deep copying of minidom documents. Based on patch by + Marian Ganisin. + +- bpo-25725: Fixed a reference leak in pickle.loads() when unpickling + invalid data including tuple instructions. + +- bpo-25663: In the Readline completer, avoid listing duplicate global + names, and search the global namespace before searching builtins. + +- bpo-25688: Fixed file leak in ElementTree.iterparse() raising an error. + +- bpo-23914: Fixed SystemError raised by unpickler on broken pickle data. + +- bpo-25691: Fixed crash on deleting ElementTree.Element attributes. + +- bpo-25624: ZipFile now always writes a ZIP_STORED header for directory + entries. Patch by Dingyuan Wang. + +- Skip getaddrinfo if host is already resolved. Patch by A. Jesse Jiryu + Davis. + +- bpo-26050: Add asyncio.StreamReader.readuntil() method. Patch by Марк + Коренберг. + +- bpo-25924: Avoid unnecessary serialization of getaddrinfo(3) calls on OS X + versions 10.5 or higher. Original patch by A. Jesse Jiryu Davis. + +- bpo-26406: Avoid unnecessary serialization of getaddrinfo(3) calls on + current versions of OpenBSD and NetBSD. Patch by A. Jesse Jiryu Davis. + +- bpo-26848: Fix asyncio/subprocess.communicate() to handle empty input. + Patch by Jack O'Connor. + +- bpo-27040: Add loop.get_exception_handler method + +- bpo-27041: asyncio: Add loop.create_future method + +- bpo-27223: asyncio: Fix _read_ready and _write_ready to respect + _conn_lost. Patch by Łukasz Langa. + +- bpo-22970: asyncio: Fix inconsistency cancelling Condition.wait. Patch by + David Coles. + +IDLE +---- + +- bpo-5124: Paste with text selected now replaces the selection on X11. This + matches how paste works on Windows, Mac, most modern Linux apps, and ttk + widgets. Original patch by Serhiy Storchaka. + +- bpo-24759: Make clear in idlelib.idle_test.__init__ that the directory is + a private implementation of test.test_idle and tool for maintainers. + +- bpo-27196: Stop 'ThemeChanged' warnings when running IDLE tests. These + persisted after other warnings were suppressed in #20567. Apply Serhiy + Storchaka's update_idletasks solution to four test files. Record this + additional advice in idle_test/README.txt + +- bpo-20567: Revise idle_test/README.txt with advice about avoiding tk + warning messages from tests. Apply advice to several IDLE tests. + +- bpo-27117: Make colorizer htest and turtledemo work with dark themes. Move + code for configuring text widget colors to a new function. + +- bpo-26673: When tk reports font size as 0, change to size 10. Such fonts + on Linux prevented the configuration dialog from opening. + +- bpo-21939: Add test for IDLE's percolator. Original patch by Saimadhav + Heblikar. + +- bpo-21676: Add test for IDLE's replace dialog. Original patch by Saimadhav + Heblikar. + +- bpo-18410: Add test for IDLE's search dialog. Original patch by Westley + Martínez. + +- bpo-21703: Add test for IDLE's undo delegator. Original patch by Saimadhav + Heblikar . + +- bpo-27044: Add ConfigDialog.remove_var_callbacks to stop memory leaks. + +- bpo-23977: Add more asserts to test_delegator. + +- bpo-20640: Add tests for idlelib.configHelpSourceEdit. Patch by Saimadhav + Heblikar. + +- In the 'IDLE-console differences' section of the IDLE doc, clarify how + running with IDLE affects sys.modules and the standard streams. + +- bpo-25507: fix incorrect change in IOBinding that prevented printing. + Augment IOBinding htest to include all major IOBinding functions. + +- bpo-25905: Revert unwanted conversion of ' to ’ RIGHT SINGLE QUOTATION + MARK in README.txt and open this and NEWS.txt with 'ascii'. Re-encode + CREDITS.txt to utf-8 and open it with 'utf-8'. + +Documentation +------------- + +- bpo-19489: Moved the search box from the sidebar to the header and footer + of each page. Patch by Ammar Askar. + +- bpo-24136: Document the new :pep:`448` unpacking syntax of 3.5. + +- bpo-26736: Used HTTPS for external links in the documentation if possible. + +- bpo-6953: Rework the Readline module documentation to group related + functions together, and add more details such as what underlying Readline + functions and variables are accessed. + +- bpo-23606: Adds note to ctypes documentation regarding cdll.msvcrt. + +- bpo-25500: Fix documentation to not claim that __import__ is searched for + in the global scope. + +- bpo-26014: Update 3.x packaging documentation: * "See also" links to the + new docs are now provided in the legacy pages * links to setuptools + documentation have been updated + +Tests +----- + +- bpo-21916: Added tests for the turtle module. Patch by ingrid, Gregory + Loyse and Jelle Zijlstra. + +- bpo-26523: The multiprocessing thread pool (multiprocessing.dummy.Pool) + was untested. + +- bpo-26015: Added new tests for pickling iterators of mutable sequences. + +- bpo-26325: Added test.support.check_no_resource_warning() to check that no + ResourceWarning is emitted. + +- bpo-25940: Changed test_ssl to use self-signed.pythontest.net. This + avoids relying on svn.python.org, which recently changed root certificate. + +- bpo-25616: Tests for OrderedDict are extracted from test_collections into + separate file test_ordered_dict. + +- bpo-26583: Skip test_timestamp_overflow in test_import if bytecode files + cannot be written. + +Build +----- + +- bpo-26884: Fix linking extension modules for cross builds. Patch by Xavier + de Gaye. + +- bpo-22359: Disable the rules for running _freeze_importlib and pgen when + cross-compiling. The output of these programs is normally saved with the + source code anyway, and is still regenerated when doing a native build. + Patch by Xavier de Gaye. + +- bpo-27229: Fix the cross-compiling pgen rule for in-tree builds. Patch by + Xavier de Gaye. + +- bpo-21668: Link audioop, _datetime, _ctypes_test modules to libm, except + on Mac OS X. Patch written by Xavier de Gaye. + +- bpo-25702: A --with-lto configure option has been added that will enable + link time optimizations at build time during a make profile-opt. Some + compilers and toolchains are known to not produce stable code when using + LTO, be sure to test things thoroughly before relying on it. It can + provide a few % speed up over profile-opt alone. + +- bpo-26624: Adds validation of ucrtbase[d].dll version with warning for old + versions. + +- bpo-17603: Avoid error about nonexistent fileblocks.o file by using a + lower-level check for st_blocks in struct stat. + +- bpo-26079: Fixing the build output folder for tix-8.4.3.6. Patch by Bjoern + Thiel. + +- bpo-26465: Update Windows builds to use OpenSSL 1.0.2g. + +- bpo-24421: Compile Modules/_math.c once, before building extensions. + Previously it could fail to compile properly if the math and cmath builds + were concurrent. + +- bpo-25348: Added ``--pgo`` and ``--pgo-job`` arguments to + ``PCbuild\build.bat`` for building with Profile-Guided Optimization. The + old ``PCbuild\build_pgo.bat`` script is now deprecated, and simply calls + ``PCbuild\build.bat --pgo %*``. + +- bpo-25827: Add support for building with ICC to ``configure``, including a + new ``--with-icc`` flag. + +- bpo-25696: Fix installation of Python on UNIX with make -j9. + +- bpo-26930: Update OS X 10.5+ 32-bit-only installer to build and link with + OpenSSL 1.0.2h. + +- bpo-26268: Update Windows builds to use OpenSSL 1.0.2f. + +- bpo-25136: Support Apple Xcode 7's new textual SDK stub libraries. + +- bpo-24324: Do not enable unreachable code warnings when using gcc as the + option does not work correctly in older versions of gcc and has been + silently removed as of gcc-4.5. + +Windows +------- + +- bpo-27053: Updates make_zip.py to correctly generate library ZIP file. + +- bpo-26268: Update the prepare_ssl.py script to handle OpenSSL releases + that don't include the contents of the include directory (that is, 1.0.2e + and later). + +- bpo-26071: bdist_wininst created binaries fail to start and find 32bit + Python + +- bpo-26073: Update the list of magic numbers in launcher + +- bpo-26065: Excludes venv from library when generating embeddable distro. + +Tools/Demos +----------- + +- bpo-26799: Fix python-gdb.py: don't get C types once when the Python code + is loaded, but get C types on demand. The C types can change if + python-gdb.py is loaded before the Python executable. Patch written by + Thomas Ilsche. + +- bpo-26271: Fix the Freeze tool to properly use flags passed through + configure. Patch by Daniel Shaulov. + +- bpo-26489: Add dictionary unpacking support to Tools/parser/unparse.py. + Patch by Guo Ci Teo. + +- bpo-26316: Fix variable name typo in Argument Clinic. + +Windows +------- + +- bpo-17500: Remove unused and outdated icons. (See also: + https://github.com/python/pythondotorg/issues/945) + + +What's New in Python 3.5.1 final? +================================= + +*Release date: 2015-12-06* + +Core and Builtins +----------------- + +- bpo-25709: Fixed problem with in-place string concatenation and utf-8 + cache. + +Windows +------- + +- bpo-25715: Python 3.5.1 installer shows wrong upgrade path and incorrect + logic for launcher detection. + + +What's New in Python 3.5.1 release candidate 1? +=============================================== + +*Release date: 2015-11-22* + +Core and Builtins +----------------- + +- bpo-25630: Fix a possible segfault during argument parsing in functions + that accept filesystem paths. + +- bpo-23564: Fixed a partially broken sanity check in the _posixsubprocess + internals regarding how fds_to_pass were passed to the child. The bug had + no actual impact as subprocess.py already avoided it. + +- bpo-25388: Fixed tokenizer crash when processing undecodable source code + with a null byte. + +- bpo-25462: The hash of the key now is calculated only once in most + operations in C implementation of OrderedDict. + +- bpo-22995: Default implementation of __reduce__ and __reduce_ex__ now + rejects builtin types with not defined __new__. + +- bpo-25555: Fix parser and AST: fill lineno and col_offset of "arg" node + when compiling AST from Python objects. + +- bpo-24802: Avoid buffer overreads when int(), float(), compile(), exec() + and eval() are passed bytes-like objects. These objects are not + necessarily terminated by a null byte, but the functions assumed they + were. + +- bpo-24726: Fixed a crash and leaking NULL in repr() of OrderedDict that + was mutated by direct calls of dict methods. + +- bpo-25449: Iterating OrderedDict with keys with unstable hash now raises + KeyError in C implementations as well as in Python implementation. + +- bpo-25395: Fixed crash when highly nested OrderedDict structures were + garbage collected. + +- bpo-25274: sys.setrecursionlimit() now raises a RecursionError if the new + recursion limit is too low depending at the current recursion depth. + Modify also the "lower-water mark" formula to make it monotonic. This mark + is used to decide when the overflowed flag of the thread state is reset. + +- bpo-24402: Fix input() to prompt to the redirected stdout when + sys.stdout.fileno() fails. + +- bpo-24806: Prevent builtin types that are not allowed to be subclassed + from being subclassed through multiple inheritance. + +- bpo-24848: Fixed a number of bugs in UTF-7 decoding of misformed data. + +- bpo-25280: Import trace messages emitted in verbose (-v) mode are no + longer formatted twice. + +- bpo-25003: On Solaris 11.3 or newer, os.urandom() now uses the getrandom() + function instead of the getentropy() function. The getentropy() function + is blocking to generate very good quality entropy, os.urandom() doesn't + need such high-quality entropy. + +- bpo-25182: The stdprinter (used as sys.stderr before the io module is + imported at startup) now uses the backslashreplace error handler. + +- bpo-25131: Make the line number and column offset of set/dict literals and + comprehensions correspond to the opening brace. + +- bpo-25150: Hide the private _Py_atomic_xxx symbols from the public + Python.h header to fix a compilation error with OpenMP. + PyThreadState_GET() becomes an alias to PyThreadState_Get() to avoid ABI + incompatibilities. + +Library +------- + +- bpo-25626: Change three zlib functions to accept sizes that fit in + Py_ssize_t, but internally cap those sizes to UINT_MAX. This resolves a + regression in 3.5 where GzipFile.read() failed to read chunks larger than + 2 or 4 GiB. The change affects the zlib.Decompress.decompress() + max_length parameter, the zlib.decompress() bufsize parameter, and the + zlib.Decompress.flush() length parameter. + +- bpo-25583: Avoid incorrect errors raised by os.makedirs(exist_ok=True) + when the OS gives priority to errors such as EACCES over EEXIST. + +- bpo-25593: Change semantics of EventLoop.stop() in asyncio. + +- bpo-6973: When we know a subprocess.Popen process has died, do not allow + the send_signal(), terminate(), or kill() methods to do anything as they + could potentially signal a different process. + +- bpo-25590: In the Readline completer, only call getattr() once per + attribute. + +- bpo-25498: Fix a crash when garbage-collecting ctypes objects created by + wrapping a memoryview. This was a regression made in 3.5a1. Based on + patch by Eryksun. + +- bpo-25584: Added "escape" to the __all__ list in the glob module. + +- bpo-25584: Fixed recursive glob() with patterns starting with ``**``. + +- bpo-25446: Fix regression in smtplib's AUTH LOGIN support. + +- bpo-18010: Fix the pydoc web server's module search function to handle + exceptions from importing packages. + +- bpo-25554: Got rid of circular references in regular expression parsing. + +- bpo-25510: fileinput.FileInput.readline() now returns b'' instead of '' at + the end if the FileInput was opened with binary mode. Patch by Ryosuke + Ito. + +- bpo-25503: Fixed inspect.getdoc() for inherited docstrings of properties. + Original patch by John Mark Vandenberg. + +- bpo-25515: Always use os.urandom as a source of randomness in uuid.uuid4. + +- bpo-21827: Fixed textwrap.dedent() for the case when largest common + whitespace is a substring of smallest leading whitespace. Based on patch + by Robert Li. + +- bpo-25447: The lru_cache() wrapper objects now can be copied and pickled + (by returning the original object unchanged). + +- bpo-25390: typing: Don't crash on Union[str, Pattern]. + +- bpo-25441: asyncio: Raise error from drain() when socket is closed. + +- bpo-25410: Cleaned up and fixed minor bugs in C implementation of + OrderedDict. + +- bpo-25411: Improved Unicode support in SMTPHandler through better use of + the email package. Thanks to user simon04 for the patch. + +- bpo-25407: Remove mentions of the formatter module being removed in Python + 3.6. + +- bpo-25406: Fixed a bug in C implementation of OrderedDict.move_to_end() + that caused segmentation fault or hang in iterating after moving several + items to the start of ordered dict. + +- bpo-25364: zipfile now works in threads disabled builds. + +- bpo-25328: smtpd's SMTPChannel now correctly raises a ValueError if both + decode_data and enable_SMTPUTF8 are set to true. + +- bpo-25316: distutils raises OSError instead of DistutilsPlatformError when + MSVC is not installed. + +- bpo-25380: Fixed protocol for the STACK_GLOBAL opcode in + pickletools.opcodes. + +- bpo-23972: Updates asyncio datagram create method allowing reuseport and + reuseaddr socket options to be set prior to binding the socket. Mirroring + the existing asyncio create_server method the reuseaddr option for + datagram sockets defaults to True if the O/S is 'posix' (except if the + platform is Cygwin). Patch by Chris Laws. + +- bpo-25304: Add asyncio.run_coroutine_threadsafe(). This lets you submit a + coroutine to a loop from another thread, returning a + concurrent.futures.Future. By Vincent Michel. + +- bpo-25232: Fix CGIRequestHandler to split the query from the URL at the + first question mark (?) rather than the last. Patch from Xiang Zhang. + +- bpo-24657: Prevent CGIRequestHandler from collapsing slashes in the query + part of the URL as if it were a path. Patch from Xiang Zhang. + +- bpo-24483: C implementation of functools.lru_cache() now calculates key's + hash only once. + +- bpo-22958: Constructor and update method of weakref.WeakValueDictionary + now accept the self and the dict keyword arguments. + +- bpo-22609: Constructor of collections.UserDict now accepts the self + keyword argument. + +- bpo-25111: Fixed comparison of traceback.FrameSummary. + +- bpo-25262: Added support for BINBYTES8 opcode in Python implementation of + unpickler. Highest 32 bits of 64-bit size for BINUNICODE8 and BINBYTES8 + opcodes no longer silently ignored on 32-bit platforms in C + implementation. + +- bpo-25034: Fix string.Formatter problem with auto-numbering and nested + format_specs. Patch by Anthon van der Neut. + +- bpo-25233: Rewrite the guts of asyncio.Queue and asyncio.Semaphore to be + more understandable and correct. + +- bpo-25203: Failed readline.set_completer_delims() no longer left the + module in inconsistent state. + +- bpo-23600: Default implementation of tzinfo.fromutc() was returning wrong + results in some cases. + +- bpo-23329: Allow the ssl module to be built with older versions of + LibreSSL. + +- Prevent overflow in _Unpickler_Read. + +- bpo-25047: The XML encoding declaration written by Element Tree now + respects the letter case given by the user. This restores the ability to + write encoding names in uppercase like "UTF-8", which worked in Python 2. + +- bpo-25135: Make deque_clear() safer by emptying the deque before clearing. + This helps avoid possible reentrancy issues. + +- bpo-19143: platform module now reads Windows version from kernel32.dll to + avoid compatibility shims. + +- bpo-25092: Fix datetime.strftime() failure when errno was already set to + EINVAL. + +- bpo-23517: Fix rounding in fromtimestamp() and utcfromtimestamp() methods + of datetime.datetime: microseconds are now rounded to nearest with ties + going to nearest even integer (ROUND_HALF_EVEN), instead of being rounding + towards minus infinity (ROUND_FLOOR). It's important that these methods + use the same rounding mode than datetime.timedelta to keep the property: + (datetime(1970,1,1) + timedelta(seconds=t)) == + datetime.utcfromtimestamp(t). It also the rounding mode used by + round(float) for example. + +- bpo-25155: Fix datetime.datetime.now() and datetime.datetime.utcnow() on + Windows to support date after year 2038. It was a regression introduced in + Python 3.5.0. + +- bpo-25108: Omitted internal frames in traceback functions print_stack(), + format_stack(), and extract_stack() called without arguments. + +- bpo-25118: Fix a regression of Python 3.5.0 in os.waitpid() on Windows. + +- bpo-24684: socket.socket.getaddrinfo() now calls + PyUnicode_AsEncodedString() instead of calling the encode() method of the + host, to handle correctly custom string with an encode() method which + doesn't return a byte string. The encoder of the IDNA codec is now called + directly instead of calling the encode() method of the string. + +- bpo-25060: Correctly compute stack usage of the BUILD_MAP opcode. + +- bpo-24857: Comparing call_args to a long sequence now correctly returns a + boolean result instead of raising an exception. Patch by A Kaptur. + +- bpo-23144: Make sure that HTMLParser.feed() returns all the data, even + when convert_charrefs is True. + +- bpo-24982: shutil.make_archive() with the "zip" format now adds entries + for directories (including empty directories) in ZIP file. + +- bpo-25019: Fixed a crash caused by setting non-string key of expat parser. + Based on patch by John Leitch. + +- bpo-16180: Exit pdb if file has syntax error, instead of trapping user in + an infinite loop. Patch by Xavier de Gaye. + +- bpo-24891: Fix a race condition at Python startup if the file descriptor + of stdin (0), stdout (1) or stderr (2) is closed while Python is creating + sys.stdin, sys.stdout and sys.stderr objects. These attributes are now set + to None if the creation of the object failed, instead of raising an + OSError exception. Initial patch written by Marco Paolini. + +- bpo-24992: Fix error handling and a race condition (related to garbage + collection) in collections.OrderedDict constructor. + +- bpo-24881: Fixed setting binary mode in Python implementation of FileIO on + Windows and Cygwin. Patch from Akira Li. + +- bpo-25578: Fix (another) memory leak in SSLSocket.getpeercer(). + +- bpo-25530: Disable the vulnerable SSLv3 protocol by default when creating + ssl.SSLContext. + +- bpo-25569: Fix memory leak in SSLSocket.getpeercert(). + +- bpo-25471: Sockets returned from accept() shouldn't appear to be + nonblocking. + +- bpo-25319: When threading.Event is reinitialized, the underlying condition + should use a regular lock rather than a recursive lock. + +- bpo-21112: Fix regression in unittest.expectedFailure on subclasses. Patch + from Berker Peksag. + +- bpo-24764: cgi.FieldStorage.read_multi() now ignores the Content-Length + header in part headers. Patch written by Peter Landry and reviewed by + Pierre Quentel. + +- bpo-24913: Fix overrun error in deque.index(). Found by John Leitch and + Bryce Darling. + +- bpo-24774: Fix docstring in http.server.test. Patch from Chiu-Hsiang Hsu. + +- bpo-21159: Improve message in + configparser.InterpolationMissingOptionError. Patch from Łukasz Langa. + +- bpo-20362: Honour TestCase.longMessage correctly in assertRegex. Patch + from Ilia Kurenkov. + +- bpo-23572: Fixed functools.singledispatch on classes with falsy + metaclasses. Patch by Ethan Furman. + +- asyncio: ensure_future() now accepts awaitable objects. + +IDLE +---- + +- bpo-15348: Stop the debugger engine (normally in a user process) before + closing the debugger window (running in the IDLE process). This prevents + the RuntimeErrors that were being caught and ignored. + +- bpo-24455: Prevent IDLE from hanging when a) closing the shell while the + debugger is active (15347); b) closing the debugger with the [X] button + (15348); and c) activating the debugger when already active (24455). The + patch by Mark Roseman does this by making two changes. 1. Suspend and + resume the gui.interaction method with the tcl vwait mechanism intended + for this purpose (instead of root.mainloop & .quit). 2. In gui.run, allow + any existing interaction to terminate first. + +- Change 'The program' to 'Your program' in an IDLE 'kill program?' message + to make it clearer that the program referred to is the currently running + user program, not IDLE itself. + +- bpo-24750: Improve the appearance of the IDLE editor window status bar. + Patch by Mark Roseman. + +- bpo-25313: Change the handling of new built-in text color themes to better + address the compatibility problem introduced by the addition of IDLE Dark. + Consistently use the revised idleConf.CurrentTheme everywhere in idlelib. + +- bpo-24782: Extension configuration is now a tab in the IDLE Preferences + dialog rather than a separate dialog. The former tabs are now a sorted + list. Patch by Mark Roseman. + +- bpo-22726: Re-activate the config dialog help button with some content + about the other buttons and the new IDLE Dark theme. + +- bpo-24820: IDLE now has an 'IDLE Dark' built-in text color theme. It is + more or less IDLE Classic inverted, with a cobalt blue background. + Strings, comments, keywords, ... are still green, red, orange, ... . To + use it with IDLEs released before November 2015, hit the 'Save as New + Custom Theme' button and enter a new name, such as 'Custom Dark'. The + custom theme will work with any IDLE release, and can be modified. + +- bpo-25224: README.txt is now an idlelib index for IDLE developers and + curious users. The previous user content is now in the IDLE doc chapter. + 'IDLE' now means 'Integrated Development and Learning Environment'. + +- bpo-24820: Users can now set breakpoint colors in Settings -> Custom + Highlighting. Original patch by Mark Roseman. + +- bpo-24972: Inactive selection background now matches active selection + background, as configured by users, on all systems. Found items are now + always highlighted on Windows. Initial patch by Mark Roseman. + +- bpo-24570: Idle: make calltip and completion boxes appear on Macs affected + by a tk regression. Initial patch by Mark Roseman. + +- bpo-24988: Idle ScrolledList context menus (used in debugger) now work on + Mac Aqua. Patch by Mark Roseman. + +- bpo-24801: Make right-click for context menu work on Mac Aqua. Patch by + Mark Roseman. + +- bpo-25173: Associate tkinter messageboxes with a specific widget. For Mac + OSX, make them a 'sheet'. Patch by Mark Roseman. + +- bpo-25198: Enhance the initial html viewer now used for Idle Help. + Properly indent fixed-pitch text (patch by Mark Roseman). Give code + snippet a very Sphinx-like light blueish-gray background. Re-use initial + width and height set by users for shell and editor. When the Table of + Contents (TOC) menu is used, put the section header at the top of the + screen. + +- bpo-25225: Condense and rewrite Idle doc section on text colors. + +- bpo-21995: Explain some differences between IDLE and console Python. + +- bpo-22820: Explain need for *print* when running file from Idle editor. + +- bpo-25224: Doc: augment Idle feature list and no-subprocess section. + +- bpo-25219: Update doc for Idle command line options. Some were missing and + notes were not correct. + +- bpo-24861: Most of idlelib is private and subject to change. Use + idleib.idle.* to start Idle. See idlelib.__init__.__doc__. + +- bpo-25199: Idle: add synchronization comments for future maintainers. + +- bpo-16893: Replace help.txt with help.html for Idle doc display. The new + idlelib/help.html is rstripped Doc/build/html/library/idle.html. It looks + better than help.txt and will better document Idle as released. The + tkinter html viewer that works for this file was written by Mark Roseman. + The now unused EditorWindow.HelpDialog class and helt.txt file are + deprecated. + +- bpo-24199: Deprecate unused idlelib.idlever with possible removal in 3.6. + +- bpo-24790: Remove extraneous code (which also create 2 & 3 conflicts). + +Documentation +------------- + +- bpo-22558: Add remaining doc links to source code for Python-coded + modules. Patch by Yoni Lavi. + +- bpo-12067: Rewrite Comparisons section in the Expressions chapter of the + language reference. Some of the details of comparing mixed types were + incorrect or ambiguous. NotImplemented is only relevant at a lower level + than the Expressions chapter. Added details of comparing range() objects, + and default behaviour and consistency suggestions for user-defined + classes. Patch from Andy Maier. + +- bpo-24952: Clarify the default size argument of stack_size() in the + "threading" and "_thread" modules. Patch from Mattip. + +- bpo-23725: Overhaul tempfile docs. Note deprecated status of mktemp. Patch + from Zbigniew Jędrzejewski-Szmek. + +- bpo-24808: Update the types of some PyTypeObject fields. Patch by Joseph + Weston. + +- bpo-22812: Fix unittest discovery examples. Patch from Pam McA'Nulty. + +Tests +----- + +- bpo-25449: Added tests for OrderedDict subclasses. + +- bpo-25099: Make test_compileall not fail when an entry on sys.path cannot + be written to (commonly seen in administrative installs on Windows). + +- bpo-23919: Prevents assert dialogs appearing in the test suite. + +- ``PCbuild\rt.bat`` now accepts an unlimited number of arguments to pass + along to regrtest.py. Previously there was a limit of 9. + +Build +----- + +- bpo-24915: Add LLVM support for PGO builds and use the test suite to + generate the profile data. Initial patch by Alecsandru Patrascu of Intel. + +- bpo-24910: Windows MSIs now have unique display names. + +- bpo-24986: It is now possible to build Python on Windows without errors + when external libraries are not available. + +Windows +------- + +- bpo-25450: Updates shortcuts to start Python in installation directory. + +- bpo-25164: Changes default all-users install directory to match per-user + directory. + +- bpo-25143: Improves installer error messages for unsupported platforms. + +- bpo-25163: Display correct directory in installer when using non-default + settings. + +- bpo-25361: Disables use of SSE2 instructions in Windows 32-bit build + +- bpo-25089: Adds logging to installer for case where launcher is not + selected on upgrade. + +- bpo-25165: Windows uninstallation should not remove launcher if other + versions remain + +- bpo-25112: py.exe launcher is missing icons + +- bpo-25102: Windows installer does not precompile for -O or -OO. + +- bpo-25081: Makes Back button in installer go back to upgrade page when + upgrading. + +- bpo-25091: Increases font size of the installer. + +- bpo-25126: Clarifies that the non-web installer will download some + components. + +- bpo-25213: Restores requestedExecutionLevel to manifest to disable UAC + virtualization. + +- bpo-25022: Removed very outdated PC/example_nt/ directory. + +Tools/Demos +----------- + +- bpo-25440: Fix output of python-config --extension-suffix. + + +What's New in Python 3.5.0 final? +================================= + +*Release date: 2015-09-13* + +Build +----- + +- bpo-25071: Windows installer should not require TargetDir parameter when + installing quietly. + + +What's New in Python 3.5.0 release candidate 4? +=============================================== + +*Release date: 2015-09-09* + +Library +------- + +- bpo-25029: Fixes MemoryError in test_strptime. + +Build +----- + +- bpo-25027: Reverts partial-static build options and adds vcruntime140.dll + to Windows installation. + + +What's New in Python 3.5.0 release candidate 3? +=============================================== + +*Release date: 2015-09-07* + +Core and Builtins +----------------- + +- bpo-24305: Prevent import subsystem stack frames from being counted by the + warnings.warn(stacklevel=) parameter. + +- bpo-24912: Prevent __class__ assignment to immutable built-in objects. + +- bpo-24975: Fix AST compilation for :pep:`448` syntax. + +Library +------- + +- bpo-24917: time_strftime() buffer over-read. + +- bpo-24748: To resolve a compatibility problem found with py2exe and + pywin32, imp.load_dynamic() once again ignores previously loaded modules + to support Python modules replacing themselves with extension modules. + Patch by Petr Viktorin. + +- bpo-24635: Fixed a bug in typing.py where isinstance([], typing.Iterable) + would return True once, then False on subsequent calls. + +- bpo-24989: Fixed buffer overread in BytesIO.readline() if a position is + set beyond size. Based on patch by John Leitch. + +- bpo-24913: Fix overrun error in deque.index(). Found by John Leitch and + Bryce Darling. + + +What's New in Python 3.5.0 release candidate 2? +=============================================== + +*Release date: 2015-08-25* + +Core and Builtins +----------------- + +- bpo-24769: Interpreter now starts properly when dynamic loading is + disabled. Patch by Petr Viktorin. + +- bpo-21167: NAN operations are now handled correctly when python is + compiled with ICC even if -fp-model strict is not specified. + +- bpo-24492: A "package" lacking a __name__ attribute when trying to perform + a ``from .. import ...`` statement will trigger an ImportError instead of + an AttributeError. + +Library +------- + +- bpo-24847: Removes vcruntime140.dll dependency from Tcl/Tk. + +- bpo-24839: platform._syscmd_ver raises DeprecationWarning + +- bpo-24867: Fix Task.get_stack() for 'async def' coroutines + + +What's New in Python 3.5.0 release candidate 1? +=============================================== + +*Release date: 2015-08-09* + +Core and Builtins +----------------- + +- bpo-24667: Resize odict in all cases that the underlying dict resizes. + +Library +------- + +- bpo-24824: Signatures of codecs.encode() and codecs.decode() now are + compatible with pydoc. + +- bpo-24634: Importing uuid should not try to load libc on Windows + +- bpo-24798: _msvccompiler.py doesn't properly support manifests + +- bpo-4395: Better testing and documentation of binary operators. Patch by + Martin Panter. + +- bpo-23973: Update typing.py from GitHub repo. + +- bpo-23004: mock_open() now reads binary data correctly when the type of + read_data is bytes. Initial patch by Aaron Hill. + +- bpo-23888: Handle fractional time in cookie expiry. Patch by ssh. + +- bpo-23652: Make it possible to compile the select module against the libc + headers from the Linux Standard Base, which do not include some EPOLL + macros. Patch by Matt Frank. + +- bpo-22932: Fix timezones in email.utils.formatdate. Patch from Dmitry + Shachnev. + +- bpo-23779: imaplib raises TypeError if authenticator tries to abort. Patch + from Craig Holmquist. + +- bpo-23319: Fix ctypes.BigEndianStructure, swap correctly bytes. Patch + written by Matthieu Gautier. + +- bpo-23254: Document how to close the TCPServer listening socket. Patch + from Martin Panter. + +- bpo-19450: Update Windows and OS X installer builds to use SQLite 3.8.11. + +- bpo-17527: Add PATCH to wsgiref.validator. Patch from Luca Sbardella. + +- bpo-24791: Fix grammar regression for call syntax: 'g(\*a or b)'. + +IDLE +---- + +- bpo-23672: Allow Idle to edit and run files with astral chars in name. + Patch by Mohd Sanad Zaki Rizvi. + +- bpo-24745: Idle editor default font. Switch from Courier to + platform-sensitive TkFixedFont. This should not affect current customized + font selections. If there is a problem, edit + $HOME/.idlerc/config-main.cfg and remove 'fontxxx' entries from [Editor + Window]. Patch by Mark Roseman. + +- bpo-21192: Idle editor. When a file is run, put its name in the restart + bar. Do not print false prompts. Original patch by Adnan Umer. + +- bpo-13884: Idle menus. Remove tearoff lines. Patch by Roger Serwy. + +Documentation +------------- + +- bpo-24129: Clarify the reference documentation for name resolution. This + includes removing the assumption that readers will be familiar with the + name resolution scheme Python used prior to the introduction of lexical + scoping for function namespaces. Patch by Ivan Levkivskyi. + +- bpo-20769: Improve reload() docs. Patch by Dorian Pula. + +- bpo-23589: Remove duplicate sentence from the FAQ. Patch by Yongzhi Pan. + +- bpo-24729: Correct IO tutorial to match implementation regarding encoding + parameter to open function. + +Tests +----- + +- bpo-24751: When running regrtest with the ``-w`` command line option, a + test run is no longer marked as a failure if all tests succeed when + re-run. + + +What's New in Python 3.5.0 beta 4? +================================== + +*Release date: 2015-07-26* + +Core and Builtins +----------------- + +- bpo-23573: Restored optimization of bytes.rfind() and bytearray.rfind() + for single-byte argument on Linux. + +- bpo-24569: Make :pep:`448` dictionary evaluation more consistent. + +- bpo-24583: Fix crash when set is mutated while being updated. + +- bpo-24407: Fix crash when dict is mutated while being updated. + +- bpo-24619: New approach for tokenizing async/await. As a consequence, it + is now possible to have one-line 'async def foo(): await ..' functions. + +- bpo-24687: Plug refleak on SyntaxError in function parameters annotations. + +- bpo-15944: memoryview: Allow arbitrary formats when casting to bytes. + Patch by Martin Panter. + +Library +------- + +- bpo-23441: rcompleter now prints a tab character instead of displaying + possible completions for an empty word. Initial patch by Martin Sekera. + +- bpo-24683: Fixed crashes in _json functions called with arguments of + inappropriate type. + +- bpo-21697: shutil.copytree() now correctly handles symbolic links that + point to directories. Patch by Eduardo Seabra and Thomas Kluyver. + +- bpo-14373: Fixed segmentation fault when gc.collect() is called during + constructing lru_cache (C implementation). + +- bpo-24695: Fix a regression in traceback.print_exception(). If + exc_traceback is None we shouldn't print a traceback header like described + in the documentation. + +- bpo-24620: Random.setstate() now validates the value of state last + element. + +- bpo-22485: Fixed an issue that caused `inspect.getsource` to return + incorrect results on nested functions. + +- bpo-22153: Improve unittest docs. Patch from Martin Panter and evilzero. + +- bpo-24580: Symbolic group references to open group in re patterns now are + explicitly forbidden as well as numeric group references. + +- bpo-24206: Fixed __eq__ and __ne__ methods of inspect classes. + +- bpo-24631: Fixed regression in the timeit module with multiline setup. + +- bpo-18622: unittest.mock.mock_open().reset_mock would recurse infinitely. + Patch from Nicola Palumbo and Laurent De Buyst. + +- bpo-23661: unittest.mock side_effects can now be exceptions again. This + was a regression vs Python 3.4. Patch from Ignacio Rossi + +- bpo-24608: chunk.Chunk.read() now always returns bytes, not str. + +- bpo-18684: Fixed reading out of the buffer in the re module. + +- bpo-24259: tarfile now raises a ReadError if an archive is truncated + inside a data segment. + +- bpo-15014: SMTP.auth() and SMTP.login() now support RFC 4954's optional + initial-response argument to the SMTP AUTH command. + +- bpo-24669: Fix inspect.getsource() for 'async def' functions. Patch by Kai + Groner. + +- bpo-24688: ast.get_docstring() for 'async def' functions. + +Build +----- + +- bpo-24603: Update Windows builds and OS X 10.5 installer to use OpenSSL + 1.0.2d. + + +What's New in Python 3.5.0 beta 3? +================================== + +*Release date: 2015-07-05* + +Core and Builtins +----------------- + +- bpo-24467: Fixed possible buffer over-read in bytearray. The bytearray + object now always allocates place for trailing null byte and it's buffer + now is always null-terminated. + +- Upgrade to Unicode 8.0.0. + +- bpo-24345: Add Py_tp_finalize slot for the stable ABI. + +- bpo-24400: Introduce a distinct type for :pep:`492` coroutines; add + types.CoroutineType, inspect.getcoroutinestate, + inspect.getcoroutinelocals; coroutines no longer use CO_GENERATOR flag; + sys.set_coroutine_wrapper works only for 'async def' coroutines; + inspect.iscoroutine no longer uses collections.abc.Coroutine, it's + intended to test for pure 'async def' coroutines only; add new opcode: + GET_YIELD_FROM_ITER; fix generators wrapper used in types.coroutine to be + instance of collections.abc.Generator; collections.abc.Awaitable and + collections.abc.Coroutine can no longer be used to detect generator-based + coroutines--use inspect.isawaitable instead. + +- bpo-24450: Add gi_yieldfrom to generators and cr_await to coroutines. + Contributed by Benno Leslie and Yury Selivanov. + +- bpo-19235: Add new RecursionError exception. Patch by Georg Brandl. + +Library +------- + +- bpo-21750: mock_open.read_data can now be read from each instance, as it + could in Python 3.3. + +- bpo-24552: Fix use after free in an error case of the _pickle module. + +- bpo-24514: tarfile now tolerates number fields consisting of only + whitespace. + +- bpo-19176: Fixed doctype() related bugs in C implementation of + ElementTree. A deprecation warning no longer issued by XMLParser subclass + with default doctype() method. Direct call of doctype() now issues a + warning. Parser's doctype() now is not called if target's doctype() is + called. Based on patch by Martin Panter. + +- bpo-20387: Restore semantic round-trip correctness in tokenize/untokenize + for tab-indented blocks. + +- bpo-24456: Fixed possible buffer over-read in adpcm2lin() and lin2adpcm() + functions of the audioop module. + +- bpo-24336: The contextmanager decorator now works with functions with + keyword arguments called "func" and "self". Patch by Martin Panter. + +- bpo-24522: Fix possible integer overflow in json accelerator module. + +- bpo-24489: ensure a previously set C errno doesn't disturb cmath.polar(). + +- bpo-24408: Fixed AttributeError in measure() and metrics() methods of + tkinter.Font. + +- bpo-14373: C implementation of functools.lru_cache() now can be used with + methods. + +- bpo-24347: Set KeyError if PyDict_GetItemWithError returns NULL. + +- bpo-24348: Drop superfluous incref/decref. + +- bpo-24359: Check for changed OrderedDict size during iteration. + +- bpo-24368: Support keyword arguments in OrderedDict methods. + +- bpo-24362: Simplify the C OrderedDict fast nodes resize logic. + +- bpo-24377: Fix a ref leak in OrderedDict.__repr__. + +- bpo-24369: Defend against key-changes during iteration. + +Tests +----- + +- bpo-24373: _testmultiphase and xxlimited now use tp_traverse and + tp_finalize to avoid reference leaks encountered when combining tp_dealloc + with PyType_FromSpec (see issue #16690 for details) + +Documentation +------------- + +- bpo-24458: Update documentation to cover multi-phase initialization for + extension modules (PEP 489). Patch by Petr Viktorin. + +- bpo-24351: Clarify what is meant by "identifier" in the context of + string.Template instances. + +Build +----- + +- bpo-24432: Update Windows builds and OS X 10.5 installer to use OpenSSL + 1.0.2c. + + +What's New in Python 3.5.0 beta 2? +================================== + +*Release date: 2015-05-31* + +Core and Builtins +----------------- + +- bpo-24284: The startswith and endswith methods of the str class no longer + return True when finding the empty string and the indexes are completely + out of range. + +- bpo-24115: Update uses of PyObject_IsTrue(), PyObject_Not(), + PyObject_IsInstance(), PyObject_RichCompareBool() and _PyDict_Contains() + to check for and handle errors correctly. + +- bpo-24328: Fix importing one character extension modules. + +- bpo-11205: In dictionary displays, evaluate the key before the value. + +- bpo-24285: Fixed regression that prevented importing extension modules + from inside packages. Patch by Petr Viktorin. + +Library +------- + +- bpo-23247: Fix a crash in the StreamWriter.reset() of CJK codecs. + +- bpo-24270: Add math.isclose() and cmath.isclose() functions as per + :pep:`485`. Contributed by Chris Barker and Tal Einat. + +- bpo-5633: Fixed timeit when the statement is a string and the setup is + not. + +- bpo-24326: Fixed audioop.ratecv() with non-default weightB argument. + Original patch by David Moore. + +- bpo-16991: Add a C implementation of OrderedDict. + +- bpo-23934: Fix inspect.signature to fail correctly for builtin types + lacking signature information. Initial patch by James Powell. + + +What's New in Python 3.5.0 beta 1? +================================== + +*Release date: 2015-05-24* + +Core and Builtins +----------------- + +- bpo-24276: Fixed optimization of property descriptor getter. + +- bpo-24268: PEP 489: Multi-phase extension module initialization. Patch by + Petr Viktorin. + +- bpo-23955: Add pyvenv.cfg option to suppress registry/environment lookup + for generating sys.path on Windows. + +- bpo-24257: Fixed system error in the comparison of faked + types.SimpleNamespace. + +- bpo-22939: Fixed integer overflow in iterator object. Patch by Clement + Rouault. + +- bpo-23985: Fix a possible buffer overrun when deleting a slice from the + front of a bytearray and then appending some other bytes data. + +- bpo-24102: Fixed exception type checking in standard error handlers. + +- bpo-15027: The UTF-32 encoder is now 3x to 7x faster. + +- bpo-23290: Optimize set_merge() for cases where the target is empty. + (Contributed by Serhiy Storchaka.) + +- bpo-2292: PEP 448: Additional Unpacking Generalizations. + +- bpo-24096: Make warnings.warn_explicit more robust against mutation of the + warnings.filters list. + +- bpo-23996: Avoid a crash when a delegated generator raises an unnormalized + StopIteration exception. Patch by Stefan Behnel. + +- bpo-23910: Optimize property() getter calls. Patch by Joe Jevnik. + +- bpo-23911: Move path-based importlib bootstrap code to a separate frozen + module. + +- bpo-24192: Fix namespace package imports. + +- bpo-24022: Fix tokenizer crash when processing undecodable source code. + +- bpo-9951: Added a hex() method to bytes, bytearray, and memoryview. + +- bpo-22906: PEP 479: Change StopIteration handling inside generators. + +- bpo-24017: PEP 492: Coroutines with async and await syntax. + +Library +------- + +- bpo-14373: Added C implementation of functools.lru_cache(). Based on + patches by Matt Joiner and Alexey Kachayev. + +- bpo-24230: The tempfile module now accepts bytes for prefix, suffix and + dir parameters and returns bytes in such situations (matching the os + module APIs). + +- bpo-22189: collections.UserString now supports __getnewargs__(), + __rmod__(), casefold(), format_map(), isprintable(), and maketrans(). + Patch by Joe Jevnik. + +- bpo-24244: Prevents termination when an invalid format string is + encountered on Windows in strftime. + +- bpo-23973: PEP 484: Add the typing module. + +- bpo-23086: The collections.abc.Sequence() abstract base class added + *start* and *stop* parameters to the index() mixin. Patch by Devin + Jeanpierre. + +- bpo-20035: Replaced the ``tkinter._fix`` module used for setting up the + Tcl/Tk environment on Windows with a private function in the ``_tkinter`` + module that makes no permanent changes to the environment. + +- bpo-24257: Fixed segmentation fault in sqlite3.Row constructor with faked + cursor type. + +- bpo-15836: assertRaises(), assertRaisesRegex(), assertWarns() and + assertWarnsRegex() assertments now check the type of the first argument to + prevent possible user error. Based on patch by Daniel Wagner-Hall. + +- bpo-9858: Add missing method stubs to _io.RawIOBase. Patch by Laura + Rupprecht. + +- bpo-22955: attrgetter, itemgetter and methodcaller objects in the operator + module now support pickling. Added readable and evaluable repr for these + objects. Based on patch by Josh Rosenberg. + +- bpo-22107: tempfile.gettempdir() and tempfile.mkdtemp() now try again when + a directory with the chosen name already exists on Windows as well as on + Unix. tempfile.mkstemp() now fails early if parent directory is not valid + (not exists or is a file) on Windows. + +- bpo-23780: Improved error message in os.path.join() with single argument. + +- bpo-6598: Increased time precision and random number range in + email.utils.make_msgid() to strengthen the uniqueness of the message ID. + +- bpo-24091: Fixed various crashes in corner cases in C implementation of + ElementTree. + +- bpo-21931: msilib.FCICreate() now raises TypeError in the case of a bad + argument instead of a ValueError with a bogus FCI error number. Patch by + Jeffrey Armstrong. + +- bpo-13866: *quote_via* argument added to urllib.parse.urlencode. + +- bpo-20098: New mangle_from policy option for email, default True for + compat32, but False for all other policies. + +- bpo-24211: The email library now supports RFC 6532: it can generate + headers using utf-8 instead of encoded words. + +- bpo-16314: Added support for the LZMA compression in distutils. + +- bpo-21804: poplib now supports RFC 6856 (UTF8). + +- bpo-18682: Optimized pprint functions for builtin scalar types. + +- bpo-22027: smtplib now supports RFC 6531 (SMTPUTF8). + +- bpo-23488: Random generator objects now consume 2x less memory on 64-bit. + +- bpo-1322: platform.dist() and platform.linux_distribution() functions are + now deprecated. Initial patch by Vajrasky Kok. + +- bpo-22486: Added the math.gcd() function. The fractions.gcd() function + now is deprecated. Based on patch by Mark Dickinson. + +- bpo-24064: Property() docstrings are now writeable. (Patch by Berker + Peksag.) + +- bpo-22681: Added support for the koi8_t encoding. + +- bpo-22682: Added support for the kz1048 encoding. + +- bpo-23796: peek and read1 methods of BufferedReader now raise ValueError + if they called on a closed object. Patch by John Hergenroeder. + +- bpo-21795: smtpd now supports the 8BITMIME extension whenever the new + *decode_data* constructor argument is set to False. + +- bpo-24155: optimize heapq.heapify() for better cache performance when + heapifying large lists. + +- bpo-21800: imaplib now supports RFC 5161 (enable), RFC 6855 + (utf8/internationalized email) and automatically encodes non-ASCII + usernames and passwords to UTF8. + +- bpo-20274: When calling a _sqlite.Connection, it now complains if passed + any keyword arguments. Previously it silently ignored them. + +- bpo-20274: Remove ignored and erroneous "kwargs" parameters from three + METH_VARARGS methods on _sqlite.Connection. + +- bpo-24134: assertRaises(), assertRaisesRegex(), assertWarns() and + assertWarnsRegex() checks now emits a deprecation warning when callable is + None or keyword arguments except msg is passed in the context manager + mode. + +- bpo-24018: Add a collections.abc.Generator abstract base class. + Contributed by Stefan Behnel. + +- bpo-23880: Tkinter's getint() and getdouble() now support Tcl_Obj. + Tkinter's getdouble() now supports any numbers (in particular int). + +- bpo-22619: Added negative limit support in the traceback module. Based on + patch by Dmitry Kazakov. + +- bpo-24094: Fix possible crash in json.encode with poorly behaved dict + subclasses. + +- bpo-9246: On POSIX, os.getcwd() now supports paths longer than 1025 bytes. + Patch written by William Orr. + +- bpo-17445: add difflib.diff_bytes() to support comparison of byte strings + (fixes a regression from Python 2). + +- bpo-23917: Fall back to sequential compilation when ProcessPoolExecutor + doesn't exist. Patch by Claudiu Popa. + +- bpo-23008: Fixed resolving attributes with boolean value is False in + pydoc. + +- Fix asyncio issue 235: LifoQueue and PriorityQueue's put didn't increment + unfinished tasks (this bug was introduced when JoinableQueue was merged + with Queue). + +- bpo-23908: os functions now reject paths with embedded null character on + Windows instead of silently truncating them. + +- bpo-23728: binascii.crc_hqx() could return an integer outside of the range + 0-0xffff for empty data. + +- bpo-23887: urllib.error.HTTPError now has a proper repr() representation. + Patch by Berker Peksag. + +- asyncio: New event loop APIs: set_task_factory() and get_task_factory(). + +- asyncio: async() function is deprecated in favour of ensure_future(). + +- bpo-24178: asyncio.Lock, Condition, Semaphore, and BoundedSemaphore + support new 'async with' syntax. Contributed by Yury Selivanov. + +- bpo-24179: Support 'async for' for asyncio.StreamReader. Contributed by + Yury Selivanov. + +- bpo-24184: Add AsyncIterator and AsyncIterable ABCs to collections.abc. + Contributed by Yury Selivanov. + +- bpo-22547: Implement informative __repr__ for inspect.BoundArguments. + Contributed by Yury Selivanov. + +- bpo-24190: Implement inspect.BoundArgument.apply_defaults() method. + Contributed by Yury Selivanov. + +- bpo-20691: Add 'follow_wrapped' argument to + inspect.Signature.from_callable() and inspect.signature(). Contributed by + Yury Selivanov. + +- bpo-24248: Deprecate inspect.Signature.from_function() and + inspect.Signature.from_builtin(). + +- bpo-23898: Fix inspect.classify_class_attrs() to support attributes with + overloaded __eq__ and __bool__. Patch by Mike Bayer. + +- bpo-24298: Fix inspect.signature() to correctly unwrap wrappers around + bound methods. + +IDLE +---- + +- bpo-23184: remove unused names and imports in idlelib. Initial patch by Al + Sweigart. + +Tests +----- + +- bpo-21520: test_zipfile no longer fails if the word 'bad' appears anywhere + in the name of the current directory. + +- bpo-9517: Move script_helper into the support package. Patch by Christie + Wilson. + +Documentation +------------- + +- bpo-22155: Add File Handlers subsection with createfilehandler to tkinter + doc. Remove obsolete example from FAQ. Patch by Martin Panter. + +- bpo-24029: Document the name binding behavior for submodule imports. + +- bpo-24077: Fix typo in man page for -I command option: -s, not -S + +Tools/Demos +----------- + +- bpo-24000: Improved Argument Clinic's mapping of converters to legacy + "format units". Updated the documentation to match. + +- bpo-24001: Argument Clinic converters now use accept={type} instead of + types={'type'} to specify the types the converter accepts. + +- bpo-23330: h2py now supports arbitrary filenames in #include. + +- bpo-24031: make patchcheck now supports git checkouts, too. + + +What's New in Python 3.5.0 alpha 4? +=================================== + +*Release date: 2015-04-19* + +Core and Builtins +----------------- + +- bpo-22980: Under Linux, GNU/KFreeBSD and the Hurd, C extensions now + include the architecture triplet in the extension name, to make it easy to + test builds for different ABIs in the same working tree. Under OS X, the + extension name now includes :pep:`3149`-style information. + +- bpo-22631: Added Linux-specific socket constant CAN_RAW_FD_FRAMES. Patch + courtesy of Joe Jevnik. + +- bpo-23731: Implement :pep:`488`: removal of .pyo files. + +- bpo-23726: Don't enable GC for user subclasses of non-GC types that don't + add any new fields. Patch by Eugene Toder. + +- bpo-23309: Avoid a deadlock at shutdown if a daemon thread is aborted + while it is holding a lock to a buffered I/O object, and the main thread + tries to use the same I/O object (typically stdout or stderr). A fatal + error is emitted instead. + +- bpo-22977: Fixed formatting Windows error messages on Wine. Patch by + Martin Panter. + +- bpo-23466: %c, %o, %x, and %X in bytes formatting now raise TypeError on + non-integer input. + +- bpo-24044: Fix possible null pointer dereference in list.sort in out of + memory conditions. + +- bpo-21354: PyCFunction_New function is exposed by python DLL again. + +Library +------- + +- bpo-23840: tokenize.open() now closes the temporary binary file on error + to fix a resource warning. + +- bpo-16914: new debuglevel 2 in smtplib adds timestamps to debug output. + +- bpo-7159: urllib.request now supports sending auth credentials + automatically after the first 401. This enhancement is a superset of the + enhancement from issue #19494 and supersedes that change. + +- bpo-23703: Fix a regression in urljoin() introduced in 901e4e52b20a. Patch + by Demian Brecht. + +- bpo-4254: Adds _curses.update_lines_cols(). Patch by Arnon Yaari + +- bpo-19933: Provide default argument for ndigits in round. Patch by + Vajrasky Kok. + +- bpo-23193: Add a numeric_owner parameter to tarfile.TarFile.extract and + tarfile.TarFile.extractall. Patch by Michael Vogt and Eric Smith. + +- bpo-23342: Add a subprocess.run() function than returns a CalledProcess + instance for a more consistent API than the existing call* functions. + +- bpo-21217: inspect.getsourcelines() now tries to compute the start and end + lines from the code object, fixing an issue when a lambda function is used + as decorator argument. Patch by Thomas Ballinger and Allison Kaptur. + +- bpo-24521: Fix possible integer overflows in the pickle module. + +- bpo-22931: Allow '[' and ']' in cookie values. + +- The keywords attribute of functools.partial is now always a dictionary. + +- bpo-23811: Add missing newline to the PyCompileError error message. Patch + by Alex Shkop. + +- bpo-21116: Avoid blowing memory when allocating a multiprocessing shared + array that's larger than 50% of the available RAM. Patch by Médéric + Boquien. + +- bpo-22982: Improve BOM handling when seeking to multiple positions of a + writable text file. + +- bpo-23464: Removed deprecated asyncio JoinableQueue. + +- bpo-23529: Limit the size of decompressed data when reading from GzipFile, + BZ2File or LZMAFile. This defeats denial of service attacks using + compressed bombs (i.e. compressed payloads which decompress to a huge + size). Patch by Martin Panter and Nikolaus Rath. + +- bpo-21859: Added Python implementation of io.FileIO. + +- bpo-23865: close() methods in multiple modules now are idempotent and more + robust at shutdown. If they need to release multiple resources, all are + released even if errors occur. + +- bpo-23400: Raise same exception on both Python 2 and 3 if sem_open is not + available. Patch by Davin Potts. + +- bpo-10838: The subprocess now module includes SubprocessError and + TimeoutError in its list of exported names for the users wild enough to + use ``from subprocess import *``. + +- bpo-23411: Added DefragResult, ParseResult, SplitResult, + DefragResultBytes, ParseResultBytes, and SplitResultBytes to + urllib.parse.__all__. Patch by Martin Panter. + +- bpo-23881: urllib.request.ftpwrapper constructor now closes the socket if + the FTP connection failed to fix a ResourceWarning. + +- bpo-23853: :meth:`socket.socket.sendall` does no more reset the socket + timeout each time data is sent successfully. The socket timeout is now the + maximum total duration to send all data. + +- bpo-22721: An order of multiline pprint output of set or dict containing + orderable and non-orderable elements no longer depends on iteration order + of set or dict. + +- bpo-15133: _tkinter.tkapp.getboolean() now supports Tcl_Obj and always + returns bool. tkinter.BooleanVar now validates input values (accepted + bool, int, str, and Tcl_Obj). tkinter.BooleanVar.get() now always returns + bool. + +- bpo-10590: xml.sax.parseString() now supports string argument. + +- bpo-23338: Fixed formatting ctypes error messages on Cygwin. Patch by + Makoto Kato. + +- bpo-15582: inspect.getdoc() now follows inheritance chains. + +- bpo-2175: SAX parsers now support a character stream of InputSource + object. + +- bpo-16840: Tkinter now supports 64-bit integers added in Tcl 8.4 and + arbitrary precision integers added in Tcl 8.5. + +- bpo-23834: Fix socket.sendto(), use the C Py_ssize_t type to store the + result of sendto() instead of the C int type. + +- bpo-23618: :meth:`socket.socket.connect` now waits until the connection + completes instead of raising :exc:`InterruptedError` if the connection is + interrupted by signals, signal handlers don't raise an exception and the + socket is blocking or has a timeout. :meth:`socket.socket.connect` still + raise :exc:`InterruptedError` for non-blocking sockets. + +- bpo-21526: Tkinter now supports new boolean type in Tcl 8.5. + +- bpo-23836: Fix the faulthandler module to handle reentrant calls to its + signal handlers. + +- bpo-23838: linecache now clears the cache and returns an empty result on + MemoryError. + +- bpo-10395: Added os.path.commonpath(). Implemented in posixpath and + ntpath. Based on patch by Rafik Draoui. + +- bpo-23611: Serializing more "lookupable" objects (such as unbound methods + or nested classes) now are supported with pickle protocols < 4. + +- bpo-13583: sqlite3.Row now supports slice indexing. + +- bpo-18473: Fixed 2to3 and 3to2 compatible pickle mappings. Fixed + ambiguous reverse mappings. Added many new mappings. Import mapping is + no longer applied to modules already mapped with full name mapping. + +- bpo-23485: select.select() is now retried automatically with the + recomputed timeout when interrupted by a signal, except if the signal + handler raises an exception. This change is part of the :pep:`475`. + +- bpo-23752: When built from an existing file descriptor, io.FileIO() now + only calls fstat() once. Before fstat() was called twice, which was not + necessary. + +- bpo-23704: collections.deque() objects now support __add__, __mul__, and + __imul__(). + +- bpo-23171: csv.Writer.writerow() now supports arbitrary iterables. + +- bpo-23745: The new email header parser now handles duplicate MIME + parameter names without error, similar to how get_param behaves. + +- bpo-22117: Fix os.utime(), it now rounds the timestamp towards minus + infinity (-inf) instead of rounding towards zero. + +- bpo-23310: Fix MagicMock's initializer to work with __methods__, just like + configure_mock(). Patch by Kasia Jachim. + +Build +----- + +- bpo-23817: FreeBSD now uses "1.0" in the SOVERSION as other operating + systems, instead of just "1". + +- bpo-23501: Argument Clinic now generates code into separate files by + default. + +Tests +----- + +- bpo-23799: Added test.support.start_threads() for running and cleaning up + multiple threads. + +- bpo-22390: test.regrtest now emits a warning if temporary files or + directories are left after running a test. + +Tools/Demos +----------- + +- bpo-18128: pygettext now uses standard +NNNN format in the + POT-Creation-Date header. + +- bpo-23935: Argument Clinic's understanding of format units accepting + bytes, bytearrays, and buffers is now consistent with both the + documentation and the implementation. + +- bpo-23944: Argument Clinic now wraps long impl prototypes at column 78. + +- bpo-20586: Argument Clinic now ensures that functions without docstrings + have signatures. + +- bpo-23492: Argument Clinic now generates argument parsing code with + PyArg_Parse instead of PyArg_ParseTuple if possible. + +- bpo-23500: Argument Clinic is now smarter about generating the "#ifndef" + (empty) definition of the methoddef macro: it's only generated once, even + if Argument Clinic processes the same symbol multiple times, and it's + emitted at the end of all processing rather than immediately after the + first use. + +C API +----- + +- bpo-23998: PyImport_ReInitLock() now checks for lock allocation error + + +What's New in Python 3.5.0 alpha 3? +=================================== + +*Release date: 2015-03-28* + +Core and Builtins +----------------- + +- bpo-23573: Increased performance of string search operations (str.find, + str.index, str.count, the in operator, str.split, str.partition) with + arguments of different kinds (UCS1, UCS2, UCS4). + +- bpo-23753: Python doesn't support anymore platforms without stat() or + fstat(), these functions are always required. + +- bpo-23681: The -b option now affects comparisons of bytes with int. + +- bpo-23632: Memoryviews now allow tuple indexing (including for + multi-dimensional memoryviews). + +- bpo-23192: Fixed generator lambdas. Patch by Bruno Cauet. + +- bpo-23629: Fix the default __sizeof__ implementation for variable-sized + objects. + +Library +------- + +- bpo-14260: The groupindex attribute of regular expression pattern object + now is non-modifiable mapping. + +- bpo-23792: Ignore KeyboardInterrupt when the pydoc pager is active. This + mimics the behavior of the standard unix pagers, and prevents pipepager + from shutting down while the pager itself is still running. + +- bpo-23775: pprint() of OrderedDict now outputs the same representation as + repr(). + +- bpo-23765: Removed IsBadStringPtr calls in ctypes + +- bpo-22364: Improved some re error messages using regex for hints. + +- bpo-23742: ntpath.expandvars() no longer loses unbalanced single quotes. + +- bpo-21717: The zipfile.ZipFile.open function now supports 'x' (exclusive + creation) mode. + +- bpo-21802: The reader in BufferedRWPair now is closed even when closing + writer failed in BufferedRWPair.close(). + +- bpo-23622: Unknown escapes in regular expressions that consist of ``'\'`` + and ASCII letter now raise a deprecation warning and will be forbidden in + Python 3.6. + +- bpo-23671: string.Template now allows specifying the "self" parameter as a + keyword argument. string.Formatter now allows specifying the "self" and + the "format_string" parameters as keyword arguments. + +- bpo-23502: The pprint module now supports mapping proxies. + +- bpo-17530: pprint now wraps long bytes objects and bytearrays. + +- bpo-22687: Fixed some corner cases in breaking words in tetxtwrap. Got rid + of quadratic complexity in breaking long words. + +- bpo-4727: The copy module now uses pickle protocol 4 (PEP 3154) and + supports copying of instances of classes whose __new__ method takes + keyword-only arguments. + +- bpo-23491: Added a zipapp module to support creating executable zip file + archives of Python code. Registered ".pyz" and ".pyzw" extensions on + Windows for these archives (PEP 441). + +- bpo-23657: Avoid explicit checks for str in zipapp, adding support for + pathlib.Path objects as arguments. + +- bpo-23688: Added support of arbitrary bytes-like objects and avoided + unnecessary copying of memoryview in gzip.GzipFile.write(). Original patch + by Wolfgang Maier. + +- bpo-23252: Added support for writing ZIP files to unseekable streams. + +- bpo-23647: Increase imaplib's MAXLINE to accommodate modern mailbox sizes. + +- bpo-23539: If body is None, http.client.HTTPConnection.request now sets + Content-Length to 0 for PUT, POST, and PATCH headers to avoid 411 errors + from some web servers. + +- bpo-22351: The nntplib.NNTP constructor no longer leaves the connection + and socket open until the garbage collector cleans them up. Patch by + Martin Panter. + +- bpo-23704: collections.deque() objects now support methods for index(), + insert(), and copy(). This allows deques to be registered as a + MutableSequence and it improves their substitutability for lists. + +- bpo-23715: :func:`signal.sigwaitinfo` and :func:`signal.sigtimedwait` are + now retried when interrupted by a signal not in the *sigset* parameter, if + the signal handler does not raise an exception. signal.sigtimedwait() + recomputes the timeout with a monotonic clock when it is retried. + +- bpo-23001: Few functions in modules mmap, ossaudiodev, socket, ssl, and + codecs, that accepted only read-only bytes-like object now accept writable + bytes-like object too. + +- bpo-23646: If time.sleep() is interrupted by a signal, the sleep is now + retried with the recomputed delay, except if the signal handler raises an + exception (PEP 475). + +- bpo-23136: _strptime now uniformly handles all days in week 0, including + Dec 30 of previous year. Based on patch by Jim Carroll. + +- bpo-23700: Iterator of NamedTemporaryFile now keeps a reference to + NamedTemporaryFile instance. Patch by Bohuslav Kabrda. + +- bpo-22903: The fake test case created by unittest.loader when it fails + importing a test module is now picklable. + +- bpo-22181: On Linux, os.urandom() now uses the new getrandom() syscall if + available, syscall introduced in the Linux kernel 3.17. It is more + reliable and more secure, because it avoids the need of a file descriptor + and waits until the kernel has enough entropy. + +- bpo-2211: Updated the implementation of the http.cookies.Morsel class. + Setting attributes key, value and coded_value directly now is deprecated. + update() and setdefault() now transform and check keys. Comparing for + equality now takes into account attributes key, value and coded_value. + copy() now returns a Morsel, not a dict. repr() now contains all + attributes. Optimized checking keys and quoting values. Added new tests. + Original patch by Demian Brecht. + +- bpo-18983: Allow selection of output units in timeit. Patch by Julian + Gindi. + +- bpo-23631: Fix traceback.format_list when a traceback has been mutated. + +- bpo-23568: Add rdivmod support to MagicMock() objects. Patch by Håkan + Lövdahl. + +- bpo-2052: Add charset parameter to HtmlDiff.make_file(). + +- bpo-23668: Support os.truncate and os.ftruncate on Windows. + +- bpo-23138: Fixed parsing cookies with absent keys or values in cookiejar. + Patch by Demian Brecht. + +- bpo-23051: multiprocessing.Pool methods imap() and imap_unordered() now + handle exceptions raised by an iterator. Patch by Alon Diamant and Davin + Potts. + +- bpo-23581: Add matmul support to MagicMock. Patch by Håkan Lövdahl. + +- bpo-23566: enable(), register(), dump_traceback() and + dump_traceback_later() functions of faulthandler now accept file + descriptors. Patch by Wei Wu. + +- bpo-22928: Disabled HTTP header injections in http.client. Original patch + by Demian Brecht. + +- bpo-23615: Modules bz2, tarfile and tokenize now can be reloaded with + imp.reload(). Patch by Thomas Kluyver. + +- bpo-23605: os.walk() now calls os.scandir() instead of os.listdir(). The + usage of os.scandir() reduces the number of calls to os.stat(). Initial + patch written by Ben Hoyt. + +Build +----- + +- bpo-23585: make patchcheck will ensure the interpreter is built. + +Tests +----- + +- bpo-23583: Added tests for standard IO streams in IDLE. + +- bpo-22289: Prevent test_urllib2net failures due to ftp connection timeout. + +Tools/Demos +----------- + +- bpo-22826: The result of open() in Tools/freeze/bkfile.py is now better + compatible with regular files (in particular it now supports the context + management protocol). + + +What's New in Python 3.5.0 alpha 2? +=================================== + +*Release date: 2015-03-09* + +Core and Builtins +----------------- + +- bpo-23571: PyObject_Call() and PyCFunction_Call() now raise a SystemError + if a function returns a result and raises an exception. The SystemError is + chained to the previous exception. + +Library +------- + +- bpo-22524: New os.scandir() function, part of the :pep:`471`: + "os.scandir() function -- a better and faster directory iterator". Patch + written by Ben Hoyt. + +- bpo-23103: Reduced the memory consumption of IPv4Address and IPv6Address. + +- bpo-21793: BaseHTTPRequestHandler again logs response code as numeric, not + as stringified enum. Patch by Demian Brecht. + +- bpo-23476: In the ssl module, enable OpenSSL's X509_V_FLAG_TRUSTED_FIRST + flag on certificate stores when it is available. + +- bpo-23576: Avoid stalling in SSL reads when EOF has been reached in the + SSL layer but the underlying connection hasn't been closed. + +- bpo-23504: Added an __all__ to the types module. + +- bpo-23563: Optimized utility functions in urllib.parse. + +- bpo-7830: Flatten nested functools.partial. + +- bpo-20204: Added the __module__ attribute to _tkinter classes. + +- bpo-19980: Improved help() for non-recognized strings. help('') now shows + the help on str. help('help') now shows the help on help(). Original + patch by Mark Lawrence. + +- bpo-23521: Corrected pure python implementation of timedelta division. + Eliminated OverflowError from ``timedelta * float`` for some floats; + Corrected rounding in timedelta true division. + +- bpo-21619: Popen objects no longer leave a zombie after exit in the with + statement if the pipe was broken. Patch by Martin Panter. + +- bpo-22936: Make it possible to show local variables in tracebacks for both + the traceback module and unittest. + +- bpo-15955: Add an option to limit the output size in bz2.decompress(). + Patch by Nikolaus Rath. + +- bpo-6639: Module-level turtle functions no longer raise TclError after + closing the window. + +- bpo-814253: Group references and conditional group references now work in + lookbehind assertions in regular expressions. (See also: bpo-9179) + +- bpo-23215: Multibyte codecs with custom error handlers that ignores errors + consumed too much memory and raised SystemError or MemoryError. Original + patch by Aleksi Torhamo. + +- bpo-5700: io.FileIO() called flush() after closing the file. flush() was + not called in close() if closefd=False. + +- bpo-23374: Fixed pydoc failure with non-ASCII files when stdout encoding + differs from file system encoding (e.g. on Mac OS). + +- bpo-23481: Remove RC4 from the SSL module's default cipher list. + +- bpo-21548: Fix pydoc.synopsis() and pydoc.apropos() on modules with empty + docstrings. + +- bpo-22885: Fixed arbitrary code execution vulnerability in the dbm.dumb + module. Original patch by Claudiu Popa. + +- bpo-23239: ssl.match_hostname() now supports matching of IP addresses. + +- bpo-23146: Fix mishandling of absolute Windows paths with forward slashes + in pathlib. + +- bpo-23096: Pickle representation of floats with protocol 0 now is the same + for both Python and C implementations. + +- bpo-19105: pprint now more efficiently uses free space at the right. + +- bpo-14910: Add allow_abbrev parameter to argparse.ArgumentParser. Patch by + Jonathan Paugh, Steven Bethard, paul j3 and Daniel Eriksson. + +- bpo-21717: tarfile.open() now supports 'x' (exclusive creation) mode. + +- bpo-23344: marshal.dumps() is now 20-25% faster on average. + +- bpo-20416: marshal.dumps() with protocols 3 and 4 is now 40-50% faster on + average. + +- bpo-23421: Fixed compression in tarfile CLI. Patch by wdv4758h. + +- bpo-23367: Fix possible overflows in the unicodedata module. + +- bpo-23361: Fix possible overflow in Windows subprocess creation code. + +- logging.handlers.QueueListener now takes a respect_handler_level keyword + argument which, if set to True, will pass messages to handlers taking + handler levels into account. + +- bpo-19705: turtledemo now has a visual sorting algorithm demo. Original + patch from Jason Yeo. + +- bpo-23801: Fix issue where cgi.FieldStorage did not always ignore the + entire preamble to a multipart body. + +Build +----- + +- bpo-23445: pydebug builds now use "gcc -Og" where possible, to make the + resulting executable faster. + +- bpo-23686: Update OS X 10.5 installer build to use OpenSSL 1.0.2a. + +C API +----- + +- bpo-20204: Deprecation warning is now raised for builtin types without the + __module__ attribute. + +Windows +------- + +- bpo-23465: Implement :pep:`486` - Make the Python Launcher aware of + virtual environments. Patch by Paul Moore. + +- bpo-23437: Make user scripts directory versioned on Windows. Patch by Paul + Moore. + + +What's New in Python 3.5.0 alpha 1? +=================================== + +*Release date: 2015-02-08* + +Core and Builtins +----------------- + +- bpo-23285: PEP 475 - EINTR handling. + +- bpo-22735: Fix many edge cases (including crashes) involving custom mro() + implementations. + +- bpo-22896: Avoid using PyObject_AsCharBuffer(), PyObject_AsReadBuffer() + and PyObject_AsWriteBuffer(). + +- bpo-21295: Revert some changes (issue #16795) to AST line numbers and + column offsets that constituted a regression. + +- bpo-22986: Allow changing an object's __class__ between a dynamic type and + static type in some cases. + +- bpo-15859: PyUnicode_EncodeFSDefault(), PyUnicode_EncodeMBCS() and + PyUnicode_EncodeCodePage() now raise an exception if the object is not a + Unicode object. For PyUnicode_EncodeFSDefault(), it was already the case + on platforms other than Windows. Patch written by Campbell Barton. + +- bpo-21408: The default __ne__() now returns NotImplemented if __eq__() + returned NotImplemented. Original patch by Martin Panter. + +- bpo-23321: Fixed a crash in str.decode() when error handler returned + replacement string longer than malformed input data. + +- bpo-22286: The "backslashreplace" error handlers now works with decoding + and translating. + +- bpo-23253: Delay-load ShellExecute[AW] in os.startfile for reduced startup + overhead on Windows. + +- bpo-22038: pyatomic.h now uses stdatomic.h or GCC built-in functions for + atomic memory access if available. Patch written by Vitor de Lima and + Gustavo Temple. + +- bpo-20284: %-interpolation (aka printf) formatting added for bytes and + bytearray. + +- bpo-23048: Fix jumping out of an infinite while loop in the pdb. + +- bpo-20335: bytes constructor now raises TypeError when encoding or errors + is specified with non-string argument. Based on patch by Renaud Blanch. + +- bpo-22834: If the current working directory ends up being set to a + non-existent directory then import will no longer raise FileNotFoundError. + +- bpo-22869: Move the interpreter startup & shutdown code to a new dedicated + pylifecycle.c module + +- bpo-22847: Improve method cache efficiency. + +- bpo-22335: Fix crash when trying to enlarge a bytearray to 0x7fffffff + bytes on a 32-bit platform. + +- bpo-22653: Fix an assertion failure in debug mode when doing a reentrant + dict insertion in debug mode. + +- bpo-22643: Fix integer overflow in Unicode case operations (upper, lower, + title, swapcase, casefold). + +- bpo-17636: Circular imports involving relative imports are now supported. + +- bpo-22604: Fix assertion error in debug mode when dividing a complex + number by (nan+0j). + +- bpo-21052: Do not raise ImportWarning when sys.path_hooks or sys.meta_path + are set to None. + +- bpo-16518: Use 'bytes-like object required' in error messages that + previously used the far more cryptic "'x' does not support the buffer + protocol. + +- bpo-22470: Fixed integer overflow issues in "backslashreplace", + "xmlcharrefreplace", and "surrogatepass" error handlers. + +- bpo-22540: speed up `PyObject_IsInstance` and `PyObject_IsSubclass` in the + common case that the second argument has metaclass `type`. + +- bpo-18711: Add a new `PyErr_FormatV` function, similar to `PyErr_Format` + but accepting a `va_list` argument. + +- bpo-22520: Fix overflow checking when generating the repr of a unicode + object. + +- bpo-22519: Fix overflow checking in PyBytes_Repr. + +- bpo-22518: Fix integer overflow issues in latin-1 encoding. + +- bpo-16324: _charset parameter of MIMEText now also accepts + email.charset.Charset instances. Initial patch by Claude Paroz. + +- bpo-1764286: Fix inspect.getsource() to support decorated functions. Patch + by Claudiu Popa. + +- bpo-18554: os.__all__ includes posix functions. + +- bpo-21391: Use os.path.abspath in the shutil module. + +- bpo-11471: avoid generating a JUMP_FORWARD instruction at the end of an + if-block if there is no else-clause. Original patch by Eugene Toder. + +- bpo-22215: Now ValueError is raised instead of TypeError when str or bytes + argument contains not permitted null character or byte. + +- bpo-22258: Fix the internal function set_inheritable() on Illumos. This + platform exposes the function ``ioctl(FIOCLEX)``, but calling it fails + with errno is ENOTTY: "Inappropriate ioctl for device". set_inheritable() + now falls back to the slower ``fcntl()`` (``F_GETFD`` and then + ``F_SETFD``). + +- bpo-21389: Displaying the __qualname__ of the underlying function in the + repr of a bound method. + +- bpo-22206: Using pthread, PyThread_create_key() now sets errno to ENOMEM + and returns -1 (error) on integer overflow. + +- bpo-20184: Argument Clinic based signature introspection added for 30 of + the builtin functions. + +- bpo-22116: C functions and methods (of the 'builtin_function_or_method' + type) can now be weakref'ed. Patch by Wei Wu. + +- bpo-22077: Improve index error messages for bytearrays, bytes, lists, and + tuples by adding 'or slices'. Added ', not ' for bytearrays. + Original patch by Claudiu Popa. + +- bpo-20179: Apply Argument Clinic to bytes and bytearray. Patch by Tal + Einat. + +- bpo-22082: Clear interned strings in slotdefs. + +- Upgrade Unicode database to Unicode 7.0.0. + +- bpo-21897: Fix a crash with the f_locals attribute with closure variables + when frame.clear() has been called. + +- bpo-21205: Add a new ``__qualname__`` attribute to generator, the + qualified name, and use it in the representation of a generator + (``repr(gen)``). The default name of the generator (``__name__`` + attribute) is now get from the function instead of the code. Use + ``gen.gi_code.co_name`` to get the name of the code. + +- bpo-21669: With the aid of heuristics in SyntaxError.__init__, the parser + now attempts to generate more meaningful (or at least more search engine + friendly) error messages when "exec" and "print" are used as statements. + +- bpo-21642: In the conditional if-else expression, allow an integer written + with no space between itself and the ``else`` keyword (e.g. ``True if + 42else False``) to be valid syntax. + +- bpo-21523: Fix over-pessimistic computation of the stack effect of some + opcodes in the compiler. This also fixes a quadratic compilation time + issue noticeable when compiling code with a large number of "and" and "or" + operators. + +- bpo-21418: Fix a crash in the builtin function super() when called without + argument and without current frame (ex: embedded Python). + +- bpo-21425: Fix flushing of standard streams in the interactive + interpreter. + +- bpo-21435: In rare cases, when running finalizers on objects in cyclic + trash a bad pointer dereference could occur due to a subtle flaw in + internal iteration logic. + +- bpo-21377: PyBytes_Concat() now tries to concatenate in-place when the + first argument has a reference count of 1. Patch by Nikolaus Rath. + +- bpo-20355: -W command line options now have higher priority than the + PYTHONWARNINGS environment variable. Patch by Arfrever. + +- bpo-21274: Define PATH_MAX for GNU/Hurd in Python/pythonrun.c. + +- bpo-20904: Support setting FPU precision on m68k. + +- bpo-21209: Fix sending tuples to custom generator objects with the yield + from syntax. + +- bpo-21193: pow(a, b, c) now raises ValueError rather than TypeError when b + is negative. Patch by Josh Rosenberg. + +- bpo-21176: PEP 465: Add the '@' operator for matrix multiplication. + +- bpo-21134: Fix segfault when str is called on an uninitialized + UnicodeEncodeError, UnicodeDecodeError, or UnicodeTranslateError object. + +- bpo-19537: Fix PyUnicode_DATA() alignment under m68k. Patch by Andreas + Schwab. + +- bpo-20929: Add a type cast to avoid shifting a negative number. + +- bpo-20731: Properly position in source code files even if they are opened + in text mode. Patch by Serhiy Storchaka. + +- bpo-20637: Key-sharing now also works for instance dictionaries of + subclasses. Patch by Peter Ingebretson. + +- bpo-8297: Attributes missing from modules now include the module name in + the error text. Original patch by ysj.ray. + +- bpo-19995: %c, %o, %x, and %X now raise TypeError on non-integer input. + +- bpo-19655: The ASDL parser - used by the build process to generate code + for managing the Python AST in C - was rewritten. The new parser is self + contained and does not require to carry long the spark.py parser-generator + library; spark.py was removed from the source base. + +- bpo-12546: Allow ``\x00`` to be used as a fill character when using str, + int, float, and complex __format__ methods. + +- bpo-20480: Add ipaddress.reverse_pointer. Patch by Leon Weber. + +- bpo-13598: Modify string.Formatter to support auto-numbering of + replacement fields. It now matches the behavior of str.format() in this + regard. Patches by Phil Elson and Ramchandra Apte. + +- bpo-8931: Make alternate formatting ('#') for type 'c' raise an exception. + In versions prior to 3.5, '#' with 'c' had no effect. Now specifying it is + an error. Patch by Torsten Landschoff. + +- bpo-23165: Perform overflow checks before allocating memory in the + _Py_char2wchar function. + +Library +------- + +- bpo-23399: pyvenv creates relative symlinks where possible. + +- bpo-20289: cgi.FieldStorage() now supports the context management + protocol. + +- bpo-13128: Print response headers for CONNECT requests when debuglevel > + 0. Patch by Demian Brecht. + +- bpo-15381: Optimized io.BytesIO to make less allocations and copyings. + +- bpo-22818: Splitting on a pattern that could match an empty string now + raises a warning. Patterns that can only match empty strings are now + rejected. + +- bpo-23099: Closing io.BytesIO with exported buffer is rejected now to + prevent corrupting exported buffer. + +- bpo-23326: Removed __ne__ implementations. Since fixing default __ne__ + implementation in issue #21408 they are redundant. + +- bpo-23363: Fix possible overflow in itertools.permutations. + +- bpo-23364: Fix possible overflow in itertools.product. + +- bpo-23366: Fixed possible integer overflow in itertools.combinations. + +- bpo-23369: Fixed possible integer overflow in + _json.encode_basestring_ascii. + +- bpo-23353: Fix the exception handling of generators in + PyEval_EvalFrameEx(). At entry, save or swap the exception state even if + PyEval_EvalFrameEx() is called with throwflag=0. At exit, the exception + state is now always restored or swapped, not only if why is WHY_YIELD or + WHY_RETURN. Patch co-written with Antoine Pitrou. + +- bpo-14099: Restored support of writing ZIP files to tellable but + non-seekable streams. + +- bpo-14099: Writing to ZipFile and reading multiple ZipExtFiles is + threadsafe now. + +- bpo-19361: JSON decoder now raises JSONDecodeError instead of ValueError. + +- bpo-18518: timeit now rejects statements which can't be compiled outside a + function or a loop (e.g. "return" or "break"). + +- bpo-23094: Fixed readline with frames in Python implementation of pickle. + +- bpo-23268: Fixed bugs in the comparison of ipaddress classes. + +- bpo-21408: Removed incorrect implementations of __ne__() which didn't + returned NotImplemented if __eq__() returned NotImplemented. The default + __ne__() now works correctly. + +- bpo-19996: :class:`email.feedparser.FeedParser` now handles (malformed) + headers with no key rather than assuming the body has started. + +- bpo-20188: Support Application-Layer Protocol Negotiation (ALPN) in the + ssl module. + +- bpo-23133: Pickling of ipaddress objects now produces more compact and + portable representation. + +- bpo-23248: Update ssl error codes from latest OpenSSL git master. + +- bpo-23266: Much faster implementation of ipaddress.collapse_addresses() + when there are many non-consecutive addresses. + +- bpo-23098: 64-bit dev_t is now supported in the os module. + +- bpo-21817: When an exception is raised in a task submitted to a + ProcessPoolExecutor, the remote traceback is now displayed in the parent + process. Patch by Claudiu Popa. + +- bpo-15955: Add an option to limit output size when decompressing LZMA + data. Patch by Nikolaus Rath and Martin Panter. + +- bpo-23250: In the http.cookies module, capitalize "HttpOnly" and "Secure" + as they are written in the standard. + +- bpo-23063: In the distutils' check command, fix parsing of reST with code + or code-block directives. + +- bpo-23209: selectors.BaseSelector.get_key() now raises a RuntimeError if + the selector is closed. And selectors.BaseSelector.close() now clears its + internal reference to the selector mapping to break a reference cycle. + Initial patch written by Martin Richard. (See also: bpo-23225) + +- bpo-17911: Provide a way to seed the linecache for a PEP-302 module + without actually loading the code. + +- bpo-17911: Provide a new object API for traceback, including the ability + to not lookup lines at all until the traceback is actually rendered, + without any trace of the original objects being kept alive. + +- bpo-19777: Provide a home() classmethod on Path objects. Contributed by + Victor Salgado and Mayank Tripathi. + +- bpo-23206: Make ``json.dumps(..., ensure_ascii=False)`` as fast as the + default case of ``ensure_ascii=True``. Patch by Naoki Inada. + +- bpo-23185: Add math.inf and math.nan constants. + +- bpo-23186: Add ssl.SSLObject.shared_ciphers() and + ssl.SSLSocket.shared_ciphers() to fetch the client's list ciphers sent at + handshake. + +- bpo-23143: Remove compatibility with OpenSSLs older than 0.9.8. + +- bpo-23132: Improve performance and introspection support of comparison + methods created by functool.total_ordering. + +- bpo-19776: Add an expanduser() method on Path objects. + +- bpo-23112: Fix SimpleHTTPServer to correctly carry the query string and + fragment when it redirects to add a trailing slash. + +- bpo-21793: Added http.HTTPStatus enums (i.e. HTTPStatus.OK, + HTTPStatus.NOT_FOUND). Patch by Demian Brecht. + +- bpo-23093: In the io, module allow more operations to work on detached + streams. + +- bpo-23111: In the ftplib, make ssl.PROTOCOL_SSLv23 the default protocol + version. + +- bpo-22585: On OpenBSD 5.6 and newer, os.urandom() now calls getentropy(), + instead of reading /dev/urandom, to get pseudo-random bytes. + +- bpo-19104: pprint now produces evaluable output for wrapped strings. + +- bpo-23071: Added missing names to codecs.__all__. Patch by Martin Panter. + +- bpo-22783: Pickling now uses the NEWOBJ opcode instead of the NEWOBJ_EX + opcode if possible. + +- bpo-15513: Added a __sizeof__ implementation for pickle classes. + +- bpo-19858: pickletools.optimize() now aware of the MEMOIZE opcode, can + produce more compact result and no longer produces invalid output if input + data contains MEMOIZE opcodes together with PUT or BINPUT opcodes. + +- bpo-22095: Fixed HTTPConnection.set_tunnel with default port. The port + value in the host header was set to "None". Patch by Demian Brecht. + +- bpo-23016: A warning no longer produces an AttributeError when the program + is run with pythonw.exe. + +- bpo-21775: shutil.copytree(): fix crash when copying to VFAT. An exception + handler assumed that OSError objects always have a 'winerror' attribute. + That is not the case, so the exception handler itself raised + AttributeError when run on Linux (and, presumably, any other non-Windows + OS). Patch by Greg Ward. + +- bpo-1218234: Fix inspect.getsource() to load updated source of reloaded + module. Initial patch by Berker Peksag. + +- bpo-21740: Support wrapped callables in doctest. Patch by Claudiu Popa. + +- bpo-23009: Make sure selectors.EpollSelector.select() works when no FD is + registered. + +- bpo-22959: In the constructor of http.client.HTTPSConnection, prefer the + context's check_hostname attribute over the *check_hostname* parameter. + +- bpo-22696: Add function :func:`sys.is_finalizing` to know about + interpreter shutdown. + +- bpo-16043: Add a default limit for the amount of data + xmlrpclib.gzip_decode will return. This resolves CVE-2013-1753. + +- bpo-14099: ZipFile.open() no longer reopen the underlying file. Objects + returned by ZipFile.open() can now operate independently of the ZipFile + even if the ZipFile was created by passing in a file-like object as the + first argument to the constructor. + +- bpo-22966: Fix __pycache__ pyc file name clobber when pyc_compile is asked + to compile a source file containing multiple dots in the source file name. + +- bpo-21971: Update turtledemo doc and add module to the index. + +- bpo-21032: Fixed socket leak if HTTPConnection.getresponse() fails. + Original patch by Martin Panter. + +- bpo-22407: Deprecated the use of re.LOCALE flag with str patterns or + re.ASCII. It was newer worked. + +- bpo-22902: The "ip" command is now used on Linux to determine MAC address + in uuid.getnode(). Pach by Bruno Cauet. + +- bpo-22960: Add a context argument to xmlrpclib.ServerProxy constructor. + +- bpo-22389: Add contextlib.redirect_stderr(). + +- bpo-21356: Make ssl.RAND_egd() optional to support LibreSSL. The + availability of the function is checked during the compilation. Patch + written by Bernard Spil. + +- bpo-22915: SAX parser now supports files opened with file descriptor or + bytes path. + +- bpo-22609: Constructors and update methods of mapping classes in the + collections module now accept the self keyword argument. + +- bpo-22940: Add readline.append_history_file. + +- bpo-19676: Added the "namereplace" error handler. + +- bpo-22788: Add *context* parameter to logging.handlers.HTTPHandler. + +- bpo-22921: Allow SSLContext to take the *hostname* parameter even if + OpenSSL doesn't support SNI. + +- bpo-22894: TestCase.subTest() would cause the test suite to be stopped + when in failfast mode, even in the absence of failures. + +- bpo-22796: HTTP cookie parsing is now stricter, in order to protect + against potential injection attacks. + +- bpo-22370: Windows detection in pathlib is now more robust. + +- bpo-22841: Reject coroutines in asyncio add_signal_handler(). Patch by + Ludovic.Gasc. + +- bpo-19494: Added urllib.request.HTTPBasicPriorAuthHandler. Patch by Matej + Cepl. + +- bpo-22578: Added attributes to the re.error class. + +- bpo-22849: Fix possible double free in the io.TextIOWrapper constructor. + +- bpo-12728: Different Unicode characters having the same uppercase but + different lowercase are now matched in case-insensitive regular + expressions. + +- bpo-22821: Fixed fcntl() with integer argument on 64-bit big-endian + platforms. + +- bpo-21650: Add an `--sort-keys` option to json.tool CLI. + +- bpo-22824: Updated reprlib output format for sets to use set literals. + Patch contributed by Berker Peksag. + +- bpo-22824: Updated reprlib output format for arrays to display empty + arrays without an unnecessary empty list. Suggested by Serhiy Storchaka. + +- bpo-22406: Fixed the uu_codec codec incorrectly ported to 3.x. Based on + patch by Martin Panter. + +- bpo-17293: uuid.getnode() now determines MAC address on AIX using netstat. + Based on patch by Aivars Kalvāns. + +- bpo-22769: Fixed ttk.Treeview.tag_has() when called without arguments. + +- bpo-22417: Verify certificates by default in httplib (PEP 476). + +- bpo-22775: Fixed unpickling of http.cookies.SimpleCookie with protocol 2 + and above. Patch by Tim Graham. + +- bpo-22776: Brought excluded code into the scope of a try block in + SysLogHandler.emit(). + +- bpo-22665: Add missing get_terminal_size and SameFileError to + shutil.__all__. + +- bpo-6623: Remove deprecated Netrc class in the ftplib module. Patch by + Matt Chaput. + +- bpo-17381: Fixed handling of case-insensitive ranges in regular + expressions. + +- bpo-22410: Module level functions in the re module now cache compiled + locale-dependent regular expressions taking into account the locale. + +- bpo-22759: Query methods on pathlib.Path() (exists(), is_dir(), etc.) now + return False when the underlying stat call raises NotADirectoryError. + +- bpo-8876: distutils now falls back to copying files when hard linking + doesn't work. This allows use with special filesystems such as VirtualBox + shared folders. + +- bpo-22217: Implemented reprs of classes in the zipfile module. + +- bpo-22457: Honour load_tests in the start_dir of discovery. + +- bpo-18216: gettext now raises an error when a .mo file has an unsupported + major version number. Patch by Aaron Hill. + +- bpo-13918: Provide a locale.delocalize() function which can remove + locale-specific number formatting from a string representing a number, + without then converting it to a specific type. Patch by Cédric Krier. + +- bpo-22676: Make the pickling of global objects which don't have a + __module__ attribute less slow. + +- bpo-18853: Fixed ResourceWarning in shlex.__nain__. + +- bpo-9351: Defaults set with set_defaults on an argparse subparser are no + longer ignored when also set on the parent parser. + +- bpo-7559: unittest test loading ImportErrors are reported as import errors + with their import exception rather than as attribute errors after the + import has already failed. + +- bpo-19746: Make it possible to examine the errors from unittest discovery + without executing the test suite. The new `errors` attribute on TestLoader + exposes these non-fatal errors encountered during discovery. + +- bpo-21991: Make email.headerregistry's header 'params' attributes be + read-only (MappingProxyType). Previously the dictionary was modifiable + but a new one was created on each access of the attribute. + +- bpo-22638: SSLv3 is now disabled throughout the standard library. It can + still be enabled by instantiating a SSLContext manually. + +- bpo-22641: In asyncio, the default SSL context for client connections is + now created using ssl.create_default_context(), for stronger security. + +- bpo-17401: Include closefd in io.FileIO repr. + +- bpo-21338: Add silent mode for compileall. quiet parameters of + compile_{dir, file, path} functions now have a multilevel value. Also, -q + option of the CLI now have a multilevel value. Patch by Thomas Kluyver. + +- bpo-20152: Convert the array and cmath modules to Argument Clinic. + +- bpo-18643: Add socket.socketpair() on Windows. + +- bpo-22435: Fix a file descriptor leak when socketserver bind fails. + +- bpo-13096: Fixed segfault in CTypes POINTER handling of large values. + +- bpo-11694: Raise ConversionError in xdrlib as documented. Patch by Filip + Gruszczyński and Claudiu Popa. + +- bpo-19380: Optimized parsing of regular expressions. + +- bpo-1519638: Now unmatched groups are replaced with empty strings in + re.sub() and re.subn(). + +- bpo-18615: sndhdr.what/whathdr now return a namedtuple. + +- bpo-22462: Fix pyexpat's creation of a dummy frame to make it appear in + exception tracebacks. + +- bpo-21965: Add support for in-memory SSL to the ssl module. Patch by + Geert Jansen. + +- bpo-21173: Fix len() on a WeakKeyDictionary when .clear() was called with + an iterator alive. + +- bpo-11866: Eliminated race condition in the computation of names for new + threads. + +- bpo-21905: Avoid RuntimeError in pickle.whichmodule() when sys.modules is + mutated while iterating. Patch by Olivier Grisel. + +- bpo-11271: concurrent.futures.Executor.map() now takes a *chunksize* + argument to allow batching of tasks in child processes and improve + performance of ProcessPoolExecutor. Patch by Dan O'Reilly. + +- bpo-21883: os.path.join() and os.path.relpath() now raise a TypeError with + more helpful error message for unsupported or mismatched types of + arguments. + +- bpo-22219: The zipfile module CLI now adds entries for directories + (including empty directories) in ZIP file. + +- bpo-22449: In the ssl.SSLContext.load_default_certs, consult the + environmental variables SSL_CERT_DIR and SSL_CERT_FILE on Windows. + +- bpo-22508: The email.__version__ variable has been removed; the email code + is no longer shipped separately from the stdlib, and __version__ hasn't + been updated in several releases. + +- bpo-20076: Added non derived UTF-8 aliases to locale aliases table. + +- bpo-20079: Added locales supported in glibc 2.18 to locale alias table. + +- bpo-20218: Added convenience methods read_text/write_text and read_bytes/ + write_bytes to pathlib.Path objects. + +- bpo-22396: On 32-bit AIX platform, don't expose os.posix_fadvise() nor + os.posix_fallocate() because their prototypes in system headers are wrong. + +- bpo-22517: When an io.BufferedRWPair object is deallocated, clear its + weakrefs. + +- bpo-22437: Number of capturing groups in regular expression is no longer + limited by 100. + +- bpo-17442: InteractiveInterpreter now displays the full chained traceback + in its showtraceback method, to match the built in interactive + interpreter. + +- bpo-23392: Added tests for marshal C API that works with FILE*. + +- bpo-10510: distutils register and upload methods now use HTML standards + compliant CRLF line endings. + +- bpo-9850: Fixed macpath.join() for empty first component. Patch by Oleg + Oshmyan. + +- bpo-5309: distutils' build and build_ext commands now accept a ``-j`` + option to enable parallel building of extension modules. + +- bpo-22448: Improve canceled timer handles cleanup to prevent unbound + memory usage. Patch by Joshua Moore-Oliva. + +- bpo-22427: TemporaryDirectory no longer attempts to clean up twice when + used in the with statement in generator. + +- bpo-22362: Forbidden ambiguous octal escapes out of range 0-0o377 in + regular expressions. + +- bpo-20912: Now directories added to ZIP file have correct Unix and MS-DOS + directory attributes. + +- bpo-21866: ZipFile.close() no longer writes ZIP64 central directory + records if allowZip64 is false. + +- bpo-22278: Fix urljoin problem with relative urls, a regression observed + after changes to issue22118 were submitted. + +- bpo-22415: Fixed debugging output of the GROUPREF_EXISTS opcode in the re + module. Removed trailing spaces in debugging output. + +- bpo-22423: Unhandled exception in thread no longer causes unhandled + AttributeError when sys.stderr is None. + +- bpo-21332: Ensure that ``bufsize=1`` in subprocess.Popen() selects line + buffering, rather than block buffering. Patch by Akira Li. + +- bpo-21091: Fix API bug: email.message.EmailMessage.is_attachment is now a + method. + +- bpo-21079: Fix email.message.EmailMessage.is_attachment to return the + correct result when the header has parameters as well as a value. + +- bpo-22247: Add NNTPError to nntplib.__all__. + +- bpo-22366: urllib.request.urlopen will accept a context object + (SSLContext) as an argument which will then be used for HTTPS connection. + Patch by Alex Gaynor. + +- bpo-4180: The warnings registries are now reset when the filters are + modified. + +- bpo-22419: Limit the length of incoming HTTP request in wsgiref server to + 65536 bytes and send a 414 error code for higher lengths. Patch + contributed by Devin Cook. + +- Lax cookie parsing in http.cookies could be a security issue when combined + with non-standard cookie handling in some Web browsers. Reported by + Sergey Bobrov. + +- bpo-20537: logging methods now accept an exception instance as well as a + Boolean value or exception tuple. Thanks to Yury Selivanov for the patch. + +- bpo-22384: An exception in Tkinter callback no longer crashes the program + when it is run with pythonw.exe. + +- bpo-22168: Prevent turtle AttributeError with non-default Canvas on OS X. + +- bpo-21147: sqlite3 now raises an exception if the request contains a null + character instead of truncating it. Based on patch by Victor Stinner. + +- bpo-13968: The glob module now supports recursive search in subdirectories + using the ``**`` pattern. + +- bpo-21951: Fixed a crash in Tkinter on AIX when called Tcl command with + empty string or tuple argument. + +- bpo-21951: Tkinter now most likely raises MemoryError instead of crash if + the memory allocation fails. + +- bpo-22338: Fix a crash in the json module on memory allocation failure. + +- bpo-12410: imaplib.IMAP4 now supports the context management protocol. + Original patch by Tarek Ziadé. + +- bpo-21270: We now override tuple methods in mock.call objects so that they + can be used as normal call attributes. + +- bpo-16662: load_tests() is now unconditionally run when it is present in a + package's __init__.py. TestLoader.loadTestsFromModule() still accepts + use_load_tests, but it is deprecated and ignored. A new keyword-only + attribute `pattern` is added and documented. Patch given by Robert + Collins, tweaked by Barry Warsaw. + +- bpo-22226: First letter no longer is stripped from the "status" key in the + result of Treeview.heading(). + +- bpo-19524: Fixed resource leak in the HTTP connection when an invalid + response is received. Patch by Martin Panter. + +- bpo-20421: Add a .version() method to SSL sockets exposing the actual + protocol version in use. + +- bpo-19546: configparser exceptions no longer expose implementation + details. Chained KeyErrors are removed, which leads to cleaner tracebacks. + Patch by Claudiu Popa. + +- bpo-22051: turtledemo no longer reloads examples to re-run them. + Initialization of variables and gui setup should be done in main(), which + is called each time a demo is run, but not on import. + +- bpo-21933: Turtledemo users can change the code font size with a menu + selection or control(command) '-' or '+' or control-mousewheel. Original + patch by Lita Cho. + +- bpo-21597: The separator between the turtledemo text pane and the drawing + canvas can now be grabbed and dragged with a mouse. The code text pane + can be widened to easily view or copy the full width of the text. The + canvas can be widened on small screens. Original patches by Jan Kanis and + Lita Cho. + +- bpo-18132: Turtledemo buttons no longer disappear when the window is + shrunk. Original patches by Jan Kanis and Lita Cho. + +- bpo-22043: time.monotonic() is now always available. + ``threading.Lock.acquire()``, ``threading.RLock.acquire()`` and socket + operations now use a monotonic clock, instead of the system clock, when a + timeout is used. + +- bpo-21527: Add a default number of workers to ThreadPoolExecutor equal to + 5 times the number of CPUs. Patch by Claudiu Popa. + +- bpo-22216: smtplib now resets its state more completely after a quit. The + most obvious consequence of the previous behavior was a STARTTLS failure + during a connect/starttls/quit/connect/starttls sequence. + +- bpo-22098: ctypes' BigEndianStructure and LittleEndianStructure now define + an empty __slots__ so that subclasses don't always get an instance dict. + Patch by Claudiu Popa. + +- bpo-22185: Fix an occasional RuntimeError in threading.Condition.wait() + caused by mutation of the waiters queue without holding the lock. Patch + by Doug Zongker. + +- bpo-22287: On UNIX, _PyTime_gettimeofday() now uses + clock_gettime(CLOCK_REALTIME) if available. As a side effect, Python now + depends on the librt library on Solaris and on Linux (only with glibc + older than 2.17). + +- bpo-22182: Use e.args to unpack exceptions correctly in + distutils.file_util.move_file. Patch by Claudiu Popa. + +- The webbrowser module now uses subprocess's start_new_session=True rather + than a potentially risky preexec_fn=os.setsid call. + +- bpo-22042: signal.set_wakeup_fd(fd) now raises an exception if the file + descriptor is in blocking mode. + +- bpo-16808: inspect.stack() now returns a named tuple instead of a tuple. + Patch by Daniel Shahaf. + +- bpo-22236: Fixed Tkinter images copying operations in NoDefaultRoot mode. + +- bpo-2527: Add a *globals* argument to timeit functions, in order to + override the globals namespace in which the timed code is executed. Patch + by Ben Roberts. + +- bpo-22118: Switch urllib.parse to use RFC 3986 semantics for the + resolution of relative URLs, rather than RFCs 1808 and 2396. Patch by + Demian Brecht. + +- bpo-21549: Added the "members" parameter to TarFile.list(). + +- bpo-19628: Allow compileall recursion depth to be specified with a -r + option. + +- bpo-15696: Add a __sizeof__ implementation for mmap objects on Windows. + +- bpo-22068: Avoided reference loops with Variables and Fonts in Tkinter. + +- bpo-22165: SimpleHTTPRequestHandler now supports undecodable file names. + +- bpo-15381: Optimized line reading in io.BytesIO. + +- bpo-8797: Raise HTTPError on failed Basic Authentication immediately. + Initial patch by Sam Bull. + +- bpo-20729: Restored the use of lazy iterkeys()/itervalues()/iteritems() in + the mailbox module. + +- bpo-21448: Changed FeedParser feed() to avoid O(N**2) behavior when + parsing long line. Original patch by Raymond Hettinger. + +- bpo-22184: The functools LRU Cache decorator factory now gives an earlier + and clearer error message when the user forgets the required parameters. + +- bpo-17923: glob() patterns ending with a slash no longer match non-dirs on + AIX. Based on patch by Delhallt. + +- bpo-21725: Added support for RFC 6531 (SMTPUTF8) in smtpd. + +- bpo-22176: Update the ctypes module's libffi to v3.1. This release adds + support for the Linux AArch64 and POWERPC ELF ABIv2 little endian + architectures. + +- bpo-5411: Added support for the "xztar" format in the shutil module. + +- bpo-21121: Don't force 3rd party C extensions to be built with + -Werror=declaration-after-statement. + +- bpo-21975: Fixed crash when using uninitialized sqlite3.Row (in particular + when unpickling pickled sqlite3.Row). sqlite3.Row is now initialized in + the __new__() method. + +- bpo-20170: Convert posixmodule to use Argument Clinic. + +- bpo-21539: Add an *exists_ok* argument to `Pathlib.mkdir()` to mimic + `mkdir -p` and `os.makedirs()` functionality. When true, ignore + FileExistsErrors. Patch by Berker Peksag. + +- bpo-22127: Bypass IDNA for pure-ASCII host names in the socket module (in + particular for numeric IPs). + +- bpo-21047: set the default value for the *convert_charrefs* argument of + HTMLParser to True. Patch by Berker Peksag. + +- Add an __all__ to html.entities. + +- bpo-15114: the strict mode and argument of HTMLParser, HTMLParser.error, + and the HTMLParserError exception have been removed. + +- bpo-22085: Dropped support of Tk 8.3 in Tkinter. + +- bpo-21580: Now Tkinter correctly handles bytes arguments passed to Tk. In + particular this allows initializing images from binary data. + +- bpo-22003: When initialized from a bytes object, io.BytesIO() now defers + making a copy until it is mutated, improving performance and memory use on + some use cases. Patch by David Wilson. + +- bpo-22018: On Windows, signal.set_wakeup_fd() now also supports sockets. A + side effect is that Python depends to the WinSock library. + +- bpo-22054: Add os.get_blocking() and os.set_blocking() functions to get + and set the blocking mode of a file descriptor (False if the O_NONBLOCK + flag is set, True otherwise). These functions are not available on + Windows. + +- bpo-17172: Make turtledemo start as active on OS X even when run with + subprocess. Patch by Lita Cho. + +- bpo-21704: Fix build error for _multiprocessing when semaphores are not + available. Patch by Arfrever Frehtes Taifersar Arahesis. + +- bpo-20173: Convert sha1, sha256, sha512 and md5 to ArgumentClinic. Patch + by Vajrasky Kok. + +- Fix repr(_socket.socket) on Windows 64-bit: don't fail with OverflowError + on closed socket. repr(socket.socket) already works fine. + +- bpo-22033: Reprs of most Python implemented classes now contain actual + class name instead of hardcoded one. + +- bpo-21947: The dis module can now disassemble generator-iterator objects + based on their gi_code attribute. Patch by Clement Rouault. + +- bpo-16133: The asynchat.async_chat.handle_read() method now ignores + BlockingIOError exceptions. + +- bpo-22044: Fixed premature DECREF in call_tzinfo_method. Patch by Tom + Flanagan. + +- bpo-19884: readline: Disable the meta modifier key if stdout is not a + terminal to not write the ANSI sequence ``"\033[1034h"`` into stdout. This + sequence is used on some terminal (ex: TERM=xterm-256color") to enable + support of 8 bit characters. + +- bpo-4350: Removed a number of out-of-dated and non-working for a long time + Tkinter methods. + +- bpo-6167: Scrollbar.activate() now returns the name of active element if + the argument is not specified. Scrollbar.set() now always accepts only 2 + arguments. + +- bpo-15275: Clean up and speed up the ntpath module. + +- bpo-21888: plistlib's load() and loads() now work if the fmt parameter is + specified. + +- bpo-22032: __qualname__ instead of __name__ is now always used to format + fully qualified class names of Python implemented classes. + +- bpo-22031: Reprs now always use hexadecimal format with the "0x" prefix + when contain an id in form " at 0x...". + +- bpo-22018: signal.set_wakeup_fd() now raises an OSError instead of a + ValueError on ``fstat()`` failure. + +- bpo-21044: tarfile.open() now handles fileobj with an integer 'name' + attribute. Based on patch by Antoine Pietri. + +- bpo-21966: Respect -q command-line option when code module is ran. + +- bpo-19076: Don't pass the redundant 'file' argument to self.error(). + +- bpo-16382: Improve exception message of warnings.warn() for bad category. + Initial patch by Phil Elson. + +- bpo-21932: os.read() now uses a :c:func:`Py_ssize_t` type instead of + :c:type:`int` for the size to support reading more than 2 GB at once. On + Windows, the size is truncated to INT_MAX. As any call to os.read(), the + OS may read less bytes than the number of requested bytes. + +- bpo-21942: Fixed source file viewing in pydoc's server mode on Windows. + +- bpo-11259: asynchat.async_chat().set_terminator() now raises a ValueError + if the number of received bytes is negative. + +- bpo-12523: asynchat.async_chat.push() now raises a TypeError if it doesn't + get a bytes string + +- bpo-21707: Add missing kwonlyargcount argument to + ModuleFinder.replace_paths_in_code(). + +- bpo-20639: calling Path.with_suffix('') allows removing the suffix again. + Patch by July Tikhonov. + +- bpo-21714: Disallow the construction of invalid paths using + Path.with_name(). Original patch by Antony Lee. + +- bpo-15014: Added 'auth' method to smtplib to make implementing auth + mechanisms simpler, and used it internally in the login method. + +- bpo-21151: Fixed a segfault in the winreg module when ``None`` is passed + as a ``REG_BINARY`` value to SetValueEx. Patch by John Ehresman. + +- bpo-21090: io.FileIO.readall() does not ignore I/O errors anymore. Before, + it ignored I/O errors if at least the first C call read() succeed. + +- bpo-5800: headers parameter of wsgiref.headers.Headers is now optional. + Initial patch by Pablo Torres Navarrete and SilentGhost. + +- bpo-21781: ssl.RAND_add() now supports strings longer than 2 GB. + +- bpo-21679: Prevent extraneous fstat() calls during open(). Patch by + Bohuslav Kabrda. + +- bpo-21863: cProfile now displays the module name of C extension functions, + in addition to their own name. + +- bpo-11453: asyncore: emit a ResourceWarning when an unclosed file_wrapper + object is destroyed. The destructor now closes the file if needed. The + close() method can now be called twice: the second call does nothing. + +- bpo-21858: Better handling of Python exceptions in the sqlite3 module. + +- bpo-21476: Make sure the email.parser.BytesParser TextIOWrapper is + discarded after parsing, so the input file isn't unexpectedly closed. + +- bpo-20295: imghdr now recognizes OpenEXR format images. + +- bpo-21729: Used the "with" statement in the dbm.dumb module to ensure + files closing. Patch by Claudiu Popa. + +- bpo-21491: socketserver: Fix a race condition in child processes reaping. + +- bpo-21719: Added the ``st_file_attributes`` field to os.stat_result on + Windows. + +- bpo-21832: Require named tuple inputs to be exact strings. + +- bpo-21722: The distutils "upload" command now exits with a non-zero return + code when uploading fails. Patch by Martin Dengler. + +- bpo-21723: asyncio.Queue: support any type of number (ex: float) for the + maximum size. Patch written by Vajrasky Kok. + +- bpo-21711: support for "site-python" directories has now been removed from + the site module (it was deprecated in 3.4). + +- bpo-17552: new socket.sendfile() method allowing a file to be sent over a + socket by using high-performance os.sendfile() on UNIX. Patch by Giampaolo + Rodola'. + +- bpo-18039: dbm.dump.open() now always creates a new database when the flag + has the value 'n'. Patch by Claudiu Popa. + +- bpo-21326: Add a new is_closed() method to asyncio.BaseEventLoop. + run_forever() and run_until_complete() methods of asyncio.BaseEventLoop + now raise an exception if the event loop was closed. + +- bpo-21766: Prevent a security hole in CGIHTTPServer by URL unquoting paths + before checking for a CGI script at that path. + +- bpo-21310: Fixed possible resource leak in failed open(). + +- bpo-21256: Printout of keyword args should be in deterministic order in a + mock function call. This will help to write better doctests. + +- bpo-21677: Fixed chaining nonnormalized exceptions in io close() methods. + +- bpo-11709: Fix the pydoc.help function to not fail when sys.stdin is not a + valid file. + +- bpo-21515: tempfile.TemporaryFile now uses os.O_TMPFILE flag is available. + +- bpo-13223: Fix pydoc.writedoc so that the HTML documentation for methods + that use 'self' in the example code is generated correctly. + +- bpo-21463: In urllib.request, fix pruning of the FTP cache. + +- bpo-21618: The subprocess module could fail to close open fds that were + inherited by the calling process and already higher than POSIX resource + limits would otherwise allow. On systems with a functioning /proc/self/fd + or /dev/fd interface the max is now ignored and all fds are closed. + +- bpo-20383: Introduce importlib.util.module_from_spec() as the preferred + way to create a new module. + +- bpo-21552: Fixed possible integer overflow of too long string lengths in + the tkinter module on 64-bit platforms. + +- bpo-14315: The zipfile module now ignores extra fields in the central + directory that are too short to be parsed instead of letting a + struct.unpack error bubble up as this "bad data" appears in many real + world zip files in the wild and is ignored by other zip tools. + +- bpo-13742: Added "key" and "reverse" parameters to heapq.merge(). (First + draft of patch contributed by Simon Sapin.) + +- bpo-21402: tkinter.ttk now works when default root window is not set. + +- bpo-3015: _tkinter.create() now creates tkapp object with wantobject=1 by + default. + +- bpo-10203: sqlite3.Row now truly supports sequence protocol. In + particular it supports reverse() and negative indices. Original patch by + Claudiu Popa. + +- bpo-18807: If copying (no symlinks) specified for a venv, then the python + interpreter aliases (python, python3) are now created by copying rather + than symlinking. + +- bpo-20197: Added support for the WebP image type in the imghdr module. + Patch by Fabrice Aneche and Claudiu Popa. + +- bpo-21513: Speedup some properties of IP addresses (IPv4Address, + IPv6Address) such as .is_private or .is_multicast. + +- bpo-21137: Improve the repr for threading.Lock() and its variants by + showing the "locked" or "unlocked" status. Patch by Berker Peksag. + +- bpo-21538: The plistlib module now supports loading of binary plist files + when reference or offset size is not a power of two. + +- bpo-21455: Add a default backlog to socket.listen(). + +- bpo-21525: Most Tkinter methods which accepted tuples now accept lists + too. + +- bpo-22166: With the assistance of a new internal _codecs._forget_codec + helping function, test_codecs now clears the encoding caches to avoid the + appearance of a reference leak + +- bpo-22236: Tkinter tests now don't reuse default root window. New root + window is created for every test class. + +- bpo-10744: Fix :pep:`3118` format strings on ctypes objects with a + nontrivial shape. + +- bpo-20826: Optimize ipaddress.collapse_addresses(). + +- bpo-21487: Optimize ipaddress.summarize_address_range() and + ipaddress.{IPv4Network,IPv6Network}.subnets(). + +- bpo-21486: Optimize parsing of netmasks in ipaddress.IPv4Network and + ipaddress.IPv6Network. + +- bpo-13916: Disallowed the surrogatepass error handler for non UTF-\* + encodings. + +- bpo-20998: Fixed re.fullmatch() of repeated single character pattern with + ignore case. Original patch by Matthew Barnett. + +- bpo-21075: fileinput.FileInput now reads bytes from standard stream if + binary mode is specified. Patch by Sam Kimbrel. + +- bpo-19775: Add a samefile() method to pathlib Path objects. Initial patch + by Vajrasky Kok. + +- bpo-21226: Set up modules properly in PyImport_ExecCodeModuleObject (and + friends). + +- bpo-21398: Fix a unicode error in the pydoc pager when the documentation + contains characters not encodable to the stdout encoding. + +- bpo-16531: ipaddress.IPv4Network and ipaddress.IPv6Network now accept an + (address, netmask) tuple argument, so as to easily construct network + objects from existing addresses. + +- bpo-21156: importlib.abc.InspectLoader.source_to_code() is now a + staticmethod. + +- bpo-21424: Simplified and optimized heaqp.nlargest() and nmsmallest() to + make fewer tuple comparisons. + +- bpo-21396: Fix TextIOWrapper(..., write_through=True) to not force a + flush() on the underlying binary stream. Patch by akira. + +- bpo-18314: Unlink now removes junctions on Windows. Patch by Kim Gräsman + +- bpo-21088: Bugfix for curses.window.addch() regression in 3.4.0. In + porting to Argument Clinic, the first two arguments were reversed. + +- bpo-21407: _decimal: The module now supports function signatures. + +- bpo-10650: Remove the non-standard 'watchexp' parameter from the + Decimal.quantize() method in the Python version. It had never been + present in the C version. + +- bpo-21469: Reduced the risk of false positives in robotparser by checking + to make sure that robots.txt has been read or does not exist prior to + returning True in can_fetch(). + +- bpo-19414: Have the OrderedDict mark deleted links as unusable. This gives + an early failure if the link is deleted during iteration. + +- bpo-21421: Add __slots__ to the MappingViews ABC. Patch by Josh Rosenberg. + +- bpo-21101: Eliminate double hashing in the C speed-up code for + collections.Counter(). + +- bpo-21321: itertools.islice() now releases the reference to the source + iterator when the slice is exhausted. Patch by Anton Afanasyev. + +- bpo-21057: TextIOWrapper now allows the underlying binary stream's read() + or read1() method to return an arbitrary bytes-like object (such as a + memoryview). Patch by Nikolaus Rath. + +- bpo-20951: SSLSocket.send() now raises either SSLWantReadError or + SSLWantWriteError on a non-blocking socket if the operation would block. + Previously, it would return 0. Patch by Nikolaus Rath. + +- bpo-13248: removed previously deprecated asyncore.dispatcher __getattr__ + cheap inheritance hack. + +- bpo-9815: assertRaises now tries to clear references to local variables in + the exception's traceback. + +- bpo-19940: ssl.cert_time_to_seconds() now interprets the given time string + in the UTC timezone (as specified in RFC 5280), not the local timezone. + +- bpo-13204: Calling sys.flags.__new__ would crash the interpreter, now it + raises a TypeError. + +- bpo-19385: Make operations on a closed dbm.dumb database always raise the + same exception. + +- bpo-21207: Detect when the os.urandom cached fd has been closed or + replaced, and open it anew. + +- bpo-21291: subprocess's Popen.wait() is now thread safe so that multiple + threads may be calling wait() or poll() on a Popen instance at the same + time without losing the Popen.returncode value. + +- bpo-21127: Path objects can now be instantiated from str subclass + instances (such as ``numpy.str_``). + +- bpo-15002: urllib.response object to use _TemporaryFileWrapper (and + _TemporaryFileCloser) facility. Provides a better way to handle file + descriptor close. Patch contributed by Christian Theune. + +- bpo-12220: mindom now raises a custom ValueError indicating it doesn't + support spaces in URIs instead of letting a 'split' ValueError bubble up. + +- bpo-21068: The ssl.PROTOCOL* constants are now enum members. + +- bpo-21276: posixmodule: Don't define USE_XATTRS on KFreeBSD and the Hurd. + +- bpo-21262: New method assert_not_called for Mock. It raises AssertionError + if the mock has been called. + +- bpo-21238: New keyword argument `unsafe` to Mock. It raises + `AttributeError` incase of an attribute startswith assert or assret. + +- bpo-20896: ssl.get_server_certificate() now uses PROTOCOL_SSLv23, not + PROTOCOL_SSLv3, for maximum compatibility. + +- bpo-21239: patch.stopall() didn't work deterministically when the same + name was patched more than once. + +- bpo-21203: Updated fileConfig and dictConfig to remove inconsistencies. + Thanks to Jure Koren for the patch. + +- bpo-21222: Passing name keyword argument to mock.create_autospec now + works. + +- bpo-21197: Add lib64 -> lib symlink in venvs on 64-bit non-OS X POSIX. + +- bpo-17498: Some SMTP servers disconnect after certain errors, violating + strict RFC conformance. Instead of losing the error code when we issue + the subsequent RSET, smtplib now returns the error code and defers raising + the SMTPServerDisconnected error until the next command is issued. + +- bpo-17826: setting an iterable side_effect on a mock function created by + create_autospec now works. Patch by Kushal Das. + +- bpo-7776: Fix ``Host:`` header and reconnection when using + http.client.HTTPConnection.set_tunnel(). Patch by Nikolaus Rath. + +- bpo-20968: unittest.mock.MagicMock now supports division. Patch by + Johannes Baiter. + +- bpo-21529: Fix arbitrary memory access in JSONDecoder.raw_decode with a + negative second parameter. Bug reported by Guido Vranken. (See also: + CVE-2014-4616) + +- bpo-21169: getpass now handles non-ascii characters that the input stream + encoding cannot encode by re-encoding using the replace error handler. + +- bpo-21171: Fixed undocumented filter API of the rot13 codec. Patch by + Berker Peksag. + +- bpo-20539: Improved math.factorial error message for large positive inputs + and changed exception type (OverflowError -> ValueError) for large + negative inputs. + +- bpo-21172: isinstance check relaxed from dict to collections.Mapping. + +- bpo-21155: asyncio.EventLoop.create_unix_server() now raises a ValueError + if path and sock are specified at the same time. + +- bpo-21136: Avoid unnecessary normalization of Fractions resulting from + power and other operations. Patch by Raymond Hettinger. + +- bpo-17621: Introduce importlib.util.LazyLoader. + +- bpo-21076: signal module constants were turned into enums. Patch by + Giampaolo Rodola'. + +- bpo-20636: Improved the repr of Tkinter widgets. + +- bpo-19505: The items, keys, and values views of OrderedDict now support + reverse iteration using reversed(). + +- bpo-21149: Improved thread-safety in logging cleanup during interpreter + shutdown. Thanks to Devin Jeanpierre for the patch. + +- bpo-21058: Fix a leak of file descriptor in + :func:`tempfile.NamedTemporaryFile`, close the file descriptor if + :func:`io.open` fails + +- bpo-21200: Return None from pkgutil.get_loader() when __spec__ is missing. + +- bpo-21013: Enhance ssl.create_default_context() when used for server side + sockets to provide better security by default. + +- bpo-20145: `assertRaisesRegex` and `assertWarnsRegex` now raise a + TypeError if the second argument is not a string or compiled regex. + +- bpo-20633: Replace relative import by absolute import. + +- bpo-20980: Stop wrapping exception when using ThreadPool. + +- bpo-21082: In os.makedirs, do not set the process-wide umask. Note this + changes behavior of makedirs when exist_ok=True. + +- bpo-20990: Fix issues found by pyflakes for multiprocessing. + +- bpo-21015: SSL contexts will now automatically select an elliptic curve + for ECDH key exchange on OpenSSL 1.0.2 and later, and otherwise default to + "prime256v1". + +- bpo-21000: Improve the command-line interface of json.tool. + +- bpo-20995: Enhance default ciphers used by the ssl module to enable better + security and prioritize perfect forward secrecy. + +- bpo-20884: Don't assume that __file__ is defined on importlib.__init__. + +- bpo-21499: Ignore __builtins__ in several test_importlib.test_api tests. + +- bpo-20627: xmlrpc.client.ServerProxy is now a context manager. + +- bpo-19165: The formatter module now raises DeprecationWarning instead of + PendingDeprecationWarning. + +- bpo-13936: Remove the ability of datetime.time instances to be considered + false in boolean contexts. + +- bpo-18931: selectors module now supports /dev/poll on Solaris. Patch by + Giampaolo Rodola'. + +- bpo-19977: When the ``LC_TYPE`` locale is the POSIX locale (``C`` locale), + :py:data:`sys.stdin` and :py:data:`sys.stdout` are now using the + ``surrogateescape`` error handler, instead of the ``strict`` error + handler. + +- bpo-20574: Implement incremental decoder for cp65001 code (Windows code + page 65001, Microsoft UTF-8). + +- bpo-20879: Delay the initialization of encoding and decoding tables for + base32, ascii85 and base85 codecs in the base64 module, and delay the + initialization of the unquote_to_bytes() table of the urllib.parse module, + to not waste memory if these modules are not used. + +- bpo-19157: Include the broadcast address in the usuable hosts for IPv6 in + ipaddress. + +- bpo-11599: When an external command (e.g. compiler) fails, distutils now + prints out the whole command line (instead of just the command name) if + the environment variable DISTUTILS_DEBUG is set. + +- bpo-4931: distutils should not produce unhelpful "error: None" messages + anymore. distutils.util.grok_environment_error is kept but doc-deprecated. + +- bpo-20875: Prevent possible gzip "'read' is not defined" NameError. Patch + by Claudiu Popa. + +- bpo-11558: ``email.message.Message.attach`` now returns a more useful + error message if ``attach`` is called on a message for which + ``is_multipart`` is False. + +- bpo-20283: RE pattern methods now accept the string keyword parameters as + documented. The pattern and source keyword parameters are left as + deprecated aliases. + +- bpo-20778: Fix modulefinder to work with bytecode-only modules. + +- bpo-20791: copy.copy() now doesn't make a copy when the input is a bytes + object. Initial patch by Peter Otten. + +- bpo-19748: On AIX, time.mktime() now raises an OverflowError for year + outsize range [1902; 2037]. + +- bpo-19573: inspect.signature: Use enum for parameter kind constants. + +- bpo-20726: inspect.signature: Make Signature and Parameter picklable. + +- bpo-17373: Add inspect.Signature.from_callable method. + +- bpo-20378: Improve repr of inspect.Signature and inspect.Parameter. + +- bpo-20816: Fix inspect.getcallargs() to raise correct TypeError for + missing keyword-only arguments. Patch by Jeremiah Lowin. + +- bpo-20817: Fix inspect.getcallargs() to fail correctly if more than 3 + arguments are missing. Patch by Jeremiah Lowin. + +- bpo-6676: Ensure a meaningful exception is raised when attempting to parse + more than one XML document per pyexpat xmlparser instance. (Original + patches by Hirokazu Yamamoto and Amaury Forgeot d'Arc, with suggested + wording by David Gutteridge) + +- bpo-21117: Fix inspect.signature to better support functools.partial. Due + to the specifics of functools.partial implementation, + positional-or-keyword arguments passed as keyword arguments become + keyword-only. + +- bpo-20334: inspect.Signature and inspect.Parameter are now hashable. + Thanks to Antony Lee for bug reports and suggestions. + +- bpo-15916: doctest.DocTestSuite returns an empty unittest.TestSuite + instead of raising ValueError if it finds no tests + +- bpo-21209: Fix asyncio.tasks.CoroWrapper to workaround a bug in yield-from + implementation in CPythons prior to 3.4.1. + +- asyncio: Add gi_{frame,running,code} properties to CoroWrapper (upstream + issue #163). + +- bpo-21311: Avoid exception in _osx_support with non-standard compiler + configurations. Patch by John Szakmeister. + +- bpo-11571: Ensure that the turtle window becomes the topmost window when + launched on OS X. + +- bpo-21801: Validate that __signature__ is None or an instance of + Signature. + +- bpo-21923: Prevent AttributeError in + distutils.sysconfig.customize_compiler due to possible uninitialized + _config_vars. + +- bpo-21323: Fix http.server to again handle scripts in CGI subdirectories, + broken by the fix for security issue #19435. Patch by Zach Byrne. + +- bpo-22733: Fix ffi_prep_args not zero-extending argument values correctly + on 64-bit Windows. + +- bpo-23302: Default to TCP_NODELAY=1 upon establishing an HTTPConnection. + Removed use of hard-coded MSS as it's an optimization that's no longer + needed with Nagle disabled. + +IDLE +---- + +- bpo-20577: Configuration of the max line length for the FormatParagraph + extension has been moved from the General tab of the Idle preferences + dialog to the FormatParagraph tab of the Config Extensions dialog. Patch + by Tal Einat. + +- bpo-16893: Update Idle doc chapter to match current Idle and add new + information. + +- bpo-3068: Add Idle extension configuration dialog to Options menu. Changes + are written to HOME/.idlerc/config-extensions.cfg. Original patch by Tal + Einat. + +- bpo-16233: A module browser (File : Class Browser, Alt+C) requires an + editor window with a filename. When Class Browser is requested otherwise, + from a shell, output window, or 'Untitled' editor, Idle no longer displays + an error box. It now pops up an Open Module box (Alt+M). If a valid name + is entered and a module is opened, a corresponding browser is also opened. + +- bpo-4832: Save As to type Python files automatically adds .py to the name + you enter (even if your system does not display it). Some systems + automatically add .txt when type is Text files. + +- bpo-21986: Code objects are not normally pickled by the pickle module. To + match this, they are no longer pickled when running under Idle. + +- bpo-17390: Adjust Editor window title; remove 'Python', move version to + end. + +- bpo-14105: Idle debugger breakpoints no longer disappear when inserting or + deleting lines. + +- bpo-17172: Turtledemo can now be run from Idle. Currently, the entry is on + the Help menu, but it may move to Run. Patch by Ramchandra Apt and Lita + Cho. + +- bpo-21765: Add support for non-ascii identifiers to HyperParser. + +- bpo-21940: Add unittest for WidgetRedirector. Initial patch by Saimadhav + Heblikar. + +- bpo-18592: Add unittest for SearchDialogBase. Patch by Phil Webster. + +- bpo-21694: Add unittest for ParenMatch. Patch by Saimadhav Heblikar. + +- bpo-21686: add unittest for HyperParser. Original patch by Saimadhav + Heblikar. + +- bpo-12387: Add missing upper(lower)case versions of default Windows key + bindings for Idle so Caps Lock does not disable them. Patch by Roger + Serwy. + +- bpo-21695: Closing a Find-in-files output window while the search is still + in progress no longer closes Idle. + +- bpo-18910: Add unittest for textView. Patch by Phil Webster. + +- bpo-18292: Add unittest for AutoExpand. Patch by Saihadhav Heblikar. + +- bpo-18409: Add unittest for AutoComplete. Patch by Phil Webster. + +- bpo-21477: htest.py - Improve framework, complete set of tests. Patches by + Saimadhav Heblikar + +- bpo-18104: Add idlelib/idle_test/htest.py with a few sample tests to begin + consolidating and improving human-validated tests of Idle. Change other + files as needed to work with htest. Running the module as __main__ runs + all tests. + +- bpo-21139: Change default paragraph width to 72, the :pep:`8` + recommendation. + +- bpo-21284: Paragraph reformat test passes after user changes reformat + width. + +- bpo-17654: Ensure IDLE menus are customized properly on OS X for + non-framework builds and for all variants of Tk. + +- bpo-23180: Rename IDLE "Windows" menu item to "Window". Patch by Al + Sweigart. + +Build +----- + +- bpo-15506: Use standard PKG_PROG_PKG_CONFIG autoconf macro in the + configure script. + +- bpo-22935: Allow the ssl module to be compiled if openssl doesn't support + SSL 3. + +- bpo-22592: Drop support of the Borland C compiler to build Python. The + distutils module still supports it to build extensions. + +- bpo-22591: Drop support of MS-DOS, especially of the DJGPP compiler + (MS-DOS port of GCC). + +- bpo-16537: Check whether self.extensions is empty in setup.py. Patch by + Jonathan Hosmer. + +- bpo-22359: Remove incorrect uses of recursive make. Patch by Jonas + Wagner. + +- bpo-21958: Define HAVE_ROUND when building with Visual Studio 2013 and + above. Patch by Zachary Turner. + +- bpo-18093: the programs that embed the CPython runtime are now in a + separate "Programs" directory, rather than being kept in the Modules + directory. + +- bpo-15759: "make suspicious", "make linkcheck" and "make doctest" in Doc/ + now display special message when and only when there are failures. + +- bpo-21141: The Windows build process no longer attempts to find Perl, + instead relying on OpenSSL source being configured and ready to build. + The ``PCbuild\build_ssl.py`` script has been re-written and re-named to + ``PCbuild\prepare_ssl.py``, and takes care of configuring OpenSSL source + for both 32 and 64 bit platforms. OpenSSL sources obtained from + svn.python.org will always be pre-configured and ready to build. + +- bpo-21037: Add a build option to enable AddressSanitizer support. + +- bpo-19962: The Windows build process now creates "python.bat" in the root + of the source tree, which passes all arguments through to the most + recently built interpreter. + +- bpo-21285: Refactor and fix curses configure check to always search in a + ncursesw directory. + +- bpo-15234: For BerkeleyDB and Sqlite, only add the found library and + include directories if they aren't already being searched. This avoids an + explicit runtime library dependency. + +- bpo-17861: Tools/scripts/generate_opcode_h.py automatically regenerates + Include/opcode.h from Lib/opcode.py if the latter gets any change. + +- bpo-20644: OS X installer build support for documentation build changes in + 3.4.1: assume externally supplied sphinx-build is available in /usr/bin. + +- bpo-20022: Eliminate use of deprecated bundlebuilder in OS X builds. + +- bpo-15968: Incorporated Tcl, Tk, and Tix builds into the Windows build + solution. + +- bpo-17095: Fix Modules/Setup *shared* support. + +- bpo-21811: Anticipated fixes to support OS X versions > 10.9. + +- bpo-21166: Prevent possible segfaults and other random failures of python + --generate-posix-vars in pybuilddir.txt build target. + +- bpo-18096: Fix library order returned by python-config. + +- bpo-17219: Add library build dir for Python extension cross-builds. + +- bpo-22919: Windows build updated to support VC 14.0 (Visual Studio 2015), + which will be used for the official release. + +- bpo-21236: Build _msi.pyd with cabinet.lib instead of fci.lib + +- bpo-17128: Use private version of OpenSSL for OS X 10.5+ installer. + +C API +----- + +- bpo-14203: Remove obsolete support for view==NULL in PyBuffer_FillInfo(), + bytearray_getbuffer(), bytesiobuf_getbuffer() and array_buffer_getbuf(). + All functions now raise BufferError in that case. + +- bpo-22445: PyBuffer_IsContiguous() now implements precise contiguity + tests, compatible with NumPy's NPY_RELAXED_STRIDES_CHECKING compilation + flag. Previously the function reported false negatives for corner cases. + +- bpo-22079: PyType_Ready() now checks that statically allocated type has no + dynamically allocated bases. + +- bpo-22453: Removed non-documented macro PyObject_REPR(). + +- bpo-18395: Rename ``_Py_char2wchar()`` to :c:func:`Py_DecodeLocale`, + rename ``_Py_wchar2char()`` to :c:func:`Py_EncodeLocale`, and document + these functions. + +- bpo-21233: Add new C functions: PyMem_RawCalloc(), PyMem_Calloc(), + PyObject_Calloc(), _PyObject_GC_Calloc(). bytes(int) is now using + ``calloc()`` instead of ``malloc()`` for large objects which is faster and + use less memory. + +- bpo-20942: PyImport_ImportFrozenModuleObject() no longer sets __file__ to + match what importlib does; this affects _frozen_importlib as well as any + module loaded using imp.init_frozen(). + +Documentation +------------- + +- bpo-19548: Update the codecs module documentation to better cover the + distinction between text encodings and other codecs, together with other + clarifications. Patch by Martin Panter. + +- bpo-22394: Doc/Makefile now supports ``make venv PYTHON=../python`` to + create a venv for generating the documentation, e.g., ``make html + PYTHON=venv/bin/python3``. + +- bpo-21514: The documentation of the json module now refers to new JSON RFC + 7159 instead of obsoleted RFC 4627. + +- bpo-21777: The binary sequence methods on bytes and bytearray are now + documented explicitly, rather than assuming users will be able to derive + the expected behaviour from the behaviour of the corresponding str + methods. + +- bpo-6916: undocument deprecated asynchat.fifo class. + +- bpo-17386: Expanded functionality of the ``Doc/make.bat`` script to make + it much more comparable to ``Doc/Makefile``. + +- bpo-21312: Update the thread_foobar.h template file to include newer + threading APIs. Patch by Jack McCracken. + +- bpo-21043: Remove the recommendation for specific CA organizations and to + mention the ability to load the OS certificates. + +- bpo-20765: Add missing documentation for PurePath.with_name() and + PurePath.with_suffix(). + +- bpo-19407: New package installation and distribution guides based on the + Python Packaging Authority tools. Existing guides have been retained as + legacy links from the distutils docs, as they still contain some required + reference material for tool developers that isn't recorded anywhere else. + +- bpo-19697: Document cases where __main__.__spec__ is None. + +Tests +----- + +- bpo-18982: Add tests for CLI of the calendar module. + +- bpo-19548: Added some additional checks to test_codecs to ensure that + statements in the updated documentation remain accurate. Patch by Martin + Panter. + +- bpo-22838: All test_re tests now work with unittest test discovery. + +- bpo-22173: Update lib2to3 tests to use unittest test discovery. + +- bpo-16000: Convert test_curses to use unittest. + +- bpo-21456: Skip two tests in test_urllib2net.py if _ssl module not + present. Patch by Remi Pointel. + +- bpo-20746: Fix test_pdb to run in refleak mode (-R). Patch by Xavier de + Gaye. + +- bpo-22060: test_ctypes has been somewhat cleaned up and simplified; it now + uses unittest test discovery to find its tests. + +- bpo-22104: regrtest.py no longer holds a reference to the suite of tests + loaded from test modules that don't define test_main(). + +- bpo-22111: Assorted cleanups in test_imaplib. Patch by Milan Oberkirch. + +- bpo-22002: Added ``load_package_tests`` function to test.support and used + it to implement/augment test discovery in test_asyncio, test_email, + test_importlib, test_json, and test_tools. + +- bpo-21976: Fix test_ssl to accept LibreSSL version strings. Thanks to + William Orr. + +- bpo-21918: Converted test_tools from a module to a package containing + separate test files for each tested script. + +- bpo-9554: Use modern unittest features in test_argparse. Initial patch by + Denver Coneybeare and Radu Voicilas. + +- bpo-20155: Changed HTTP method names in failing tests in test_httpservers + so that packet filtering software (specifically Windows Base Filtering + Engine) does not interfere with the transaction semantics expected by the + tests. + +- bpo-19493: Refactored the ctypes test package to skip tests explicitly + rather than silently. + +- bpo-18492: All resources are now allowed when tests are not run by + regrtest.py. + +- bpo-21634: Fix pystone micro-benchmark: use floor division instead of true + division to benchmark integers instead of floating point numbers. Set + pystone version to 1.2. Patch written by Lennart Regebro. + +- bpo-21605: Added tests for Tkinter images. + +- bpo-21493: Added test for ntpath.expanduser(). Original patch by Claudiu + Popa. + +- bpo-19925: Added tests for the spwd module. Original patch by Vajrasky + Kok. + +- bpo-21522: Added Tkinter tests for Listbox.itemconfigure(), + PanedWindow.paneconfigure(), and Menu.entryconfigure(). + +- bpo-17756: Fix test_code test when run from the installed location. + +- bpo-17752: Fix distutils tests when run from the installed location. + +- bpo-18604: Consolidated checks for GUI availability. All platforms now at + least check whether Tk can be instantiated when the GUI resource is + requested. + +- bpo-21275: Fix a socket test on KFreeBSD. + +- bpo-21223: Pass test_site/test_startup_imports when some of the extensions + are built as builtins. + +- bpo-20635: Added tests for Tk geometry managers. + +- Add test case for freeze. + +- bpo-20743: Fix a reference leak in test_tcl. + +- bpo-21097: Move test_namespace_pkgs into test_importlib. + +- bpo-21503: Use test_both() consistently in test_importlib. + +- bpo-20939: Avoid various network test failures due to new redirect of + http://www.python.org/ to https://www.python.org: use + http://www.example.com instead. + +- bpo-20668: asyncio tests no longer rely on tests.txt file. (Patch by + Vajrasky Kok) + +- bpo-21093: Prevent failures of ctypes test_macholib on OS X if a copy of + libz exists in $HOME/lib or /usr/local/lib. + +- bpo-22770: Prevent some Tk segfaults on OS X when running gui tests. + +- bpo-23211: Workaround test_logging failure on some OS X 10.6 systems. + +- bpo-23345: Prevent test_ssl failures with large OpenSSL patch level values + (like 0.9.8zc). + +Tools/Demos +----------- + +- bpo-22314: pydoc now works when the LINES environment variable is set. + +- bpo-22615: Argument Clinic now supports the "type" argument for the int + converter. This permits using the int converter with enums and typedefs. + +- bpo-20076: The makelocalealias.py script no longer ignores UTF-8 mapping. + +- bpo-20079: The makelocalealias.py script now can parse the SUPPORTED file + from glibc sources and supports command line options for source paths. + +- bpo-22201: Command-line interface of the zipfile module now correctly + extracts ZIP files with directory entries. Patch by Ryan Wilson. + +- bpo-22120: For functions using an unsigned integer return converter, + Argument Clinic now generates a cast to that type for the comparison to -1 + in the generated code. (This suppresses a compilation warning.) + +- bpo-18974: Tools/scripts/diff.py now uses argparse instead of optparse. + +- bpo-21906: Make Tools/scripts/md5sum.py work in Python 3. Patch by Zachary + Ware. + +- bpo-21629: Fix Argument Clinic's "--converters" feature. + +- Add support for ``yield from`` to 2to3. + +- Add support for the :pep:`465` matrix multiplication operator to 2to3. + +- bpo-16047: Fix module exception list and __file__ handling in freeze. + Patch by Meador Inge. + +- bpo-11824: Consider ABI tags in freeze. Patch by Meador Inge. + +- bpo-20535: PYTHONWARNING no longer affects the run_tests.py script. Patch + by Arfrever Frehtes Taifersar Arahesis. + +Windows +------- + +- bpo-23260: Update Windows installer + +- The bundled version of Tcl/Tk has been updated to 8.6.3. The most visible + result of this change is the addition of new native file dialogs when + running on Windows Vista or newer. See Tcl/Tk's TIP 432 for more + information. Also, this version of Tcl/Tk includes support for Windows + 10. + +- bpo-17896: The Windows build scripts now expect external library sources + to be in ``PCbuild\..\externals`` rather than ``PCbuild\..\..``. + +- bpo-17717: The Windows build scripts now use a copy of NASM pulled from + svn.python.org to build OpenSSL. + +- bpo-21907: Improved the batch scripts provided for building Python. + +- bpo-22644: The bundled version of OpenSSL has been updated to 1.0.1j. + +- bpo-10747: Use versioned labels in the Windows start menu. Patch by Olive + Kilburn. + +- bpo-22980: .pyd files with a version and platform tag (for example, + ".cp35-win32.pyd") will now be loaded in preference to those without tags. + + +**(For information about older versions, consult the HISTORY file.)** diff --git a/Misc/NEWS.d/3.5.0.rst b/Misc/NEWS.d/3.5.0.rst deleted file mode 100644 index 949997422f2fa28e9f3d676e26e3b8a24f343cde..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.0.rst +++ /dev/null @@ -1,8 +0,0 @@ -.. bpo: 25071 -.. date: 9305 -.. nonce: EwjXl1 -.. release date: 2015-09-13 -.. section: Build - -Windows installer should not require TargetDir parameter when installing -quietly. diff --git a/Misc/NEWS.d/3.5.0a1.rst b/Misc/NEWS.d/3.5.0a1.rst deleted file mode 100644 index 376cb02ed4ba3db39dec833bb8f91398f9ebec29..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.0a1.rst +++ /dev/null @@ -1,5869 +0,0 @@ -.. bpo: 23285 -.. date: 8948 -.. nonce: bJJA8B -.. release date: 2015-02-08 -.. section: Core and Builtins - -PEP 475 - EINTR handling. - -.. - -.. bpo: 22735 -.. date: 8947 -.. nonce: mFEX9n -.. section: Core and Builtins - -Fix many edge cases (including crashes) involving custom mro() -implementations. - -.. - -.. bpo: 22896 -.. date: 8946 -.. nonce: xSDAHK -.. section: Core and Builtins - -Avoid using PyObject_AsCharBuffer(), PyObject_AsReadBuffer() and -PyObject_AsWriteBuffer(). - -.. - -.. bpo: 21295 -.. date: 8945 -.. nonce: LYq9nF -.. section: Core and Builtins - -Revert some changes (issue #16795) to AST line numbers and column offsets -that constituted a regression. - -.. - -.. bpo: 22986 -.. date: 8944 -.. nonce: yay2Lv -.. section: Core and Builtins - -Allow changing an object's __class__ between a dynamic type and static type -in some cases. - -.. - -.. bpo: 15859 -.. date: 8943 -.. nonce: Fs5mE2 -.. section: Core and Builtins - -PyUnicode_EncodeFSDefault(), PyUnicode_EncodeMBCS() and -PyUnicode_EncodeCodePage() now raise an exception if the object is not a -Unicode object. For PyUnicode_EncodeFSDefault(), it was already the case on -platforms other than Windows. Patch written by Campbell Barton. - -.. - -.. bpo: 21408 -.. date: 8942 -.. nonce: Lz6P3P -.. section: Core and Builtins - -The default __ne__() now returns NotImplemented if __eq__() returned -NotImplemented. Original patch by Martin Panter. - -.. - -.. bpo: 23321 -.. date: 8941 -.. nonce: HQelge -.. section: Core and Builtins - -Fixed a crash in str.decode() when error handler returned replacement string -longer than malformed input data. - -.. - -.. bpo: 22286 -.. date: 8940 -.. nonce: l6Qyy1 -.. section: Core and Builtins - -The "backslashreplace" error handlers now works with decoding and -translating. - -.. - -.. bpo: 23253 -.. date: 8939 -.. nonce: p4B1H- -.. section: Core and Builtins - -Delay-load ShellExecute[AW] in os.startfile for reduced startup overhead on -Windows. - -.. - -.. bpo: 22038 -.. date: 8938 -.. nonce: BMZUHx -.. section: Core and Builtins - -pyatomic.h now uses stdatomic.h or GCC built-in functions for atomic memory -access if available. Patch written by Vitor de Lima and Gustavo Temple. - -.. - -.. bpo: 20284 -.. date: 8937 -.. nonce: CH8wpD -.. section: Core and Builtins - -%-interpolation (aka printf) formatting added for bytes and bytearray. - -.. - -.. bpo: 23048 -.. date: 8936 -.. nonce: X5BUd3 -.. section: Core and Builtins - -Fix jumping out of an infinite while loop in the pdb. - -.. - -.. bpo: 20335 -.. date: 8935 -.. nonce: YcAPOs -.. section: Core and Builtins - -bytes constructor now raises TypeError when encoding or errors is specified -with non-string argument. Based on patch by Renaud Blanch. - -.. - -.. bpo: 22834 -.. date: 8934 -.. nonce: N1kAXN -.. section: Core and Builtins - -If the current working directory ends up being set to a non-existent -directory then import will no longer raise FileNotFoundError. - -.. - -.. bpo: 22869 -.. date: 8933 -.. nonce: rAWg-V -.. section: Core and Builtins - -Move the interpreter startup & shutdown code to a new dedicated -pylifecycle.c module - -.. - -.. bpo: 22847 -.. date: 8932 -.. nonce: 6baj9f -.. section: Core and Builtins - -Improve method cache efficiency. - -.. - -.. bpo: 22335 -.. date: 8931 -.. nonce: DWsXiy -.. section: Core and Builtins - -Fix crash when trying to enlarge a bytearray to 0x7fffffff bytes on a 32-bit -platform. - -.. - -.. bpo: 22653 -.. date: 8930 -.. nonce: pCNlpv -.. section: Core and Builtins - -Fix an assertion failure in debug mode when doing a reentrant dict insertion -in debug mode. - -.. - -.. bpo: 22643 -.. date: 8929 -.. nonce: xv8xev -.. section: Core and Builtins - -Fix integer overflow in Unicode case operations (upper, lower, title, -swapcase, casefold). - -.. - -.. bpo: 17636 -.. date: 8928 -.. nonce: wiqnhw -.. section: Core and Builtins - -Circular imports involving relative imports are now supported. - -.. - -.. bpo: 22604 -.. date: 8927 -.. nonce: yii-It -.. section: Core and Builtins - -Fix assertion error in debug mode when dividing a complex number by -(nan+0j). - -.. - -.. bpo: 21052 -.. date: 8926 -.. nonce: -sf3tp -.. section: Core and Builtins - -Do not raise ImportWarning when sys.path_hooks or sys.meta_path are set to -None. - -.. - -.. bpo: 16518 -.. date: 8925 -.. nonce: UADwcN -.. section: Core and Builtins - -Use 'bytes-like object required' in error messages that previously used the -far more cryptic "'x' does not support the buffer protocol. - -.. - -.. bpo: 22470 -.. date: 8924 -.. nonce: igrgN2 -.. section: Core and Builtins - -Fixed integer overflow issues in "backslashreplace", "xmlcharrefreplace", -and "surrogatepass" error handlers. - -.. - -.. bpo: 22540 -.. date: 8923 -.. nonce: FM72m- -.. section: Core and Builtins - -speed up `PyObject_IsInstance` and `PyObject_IsSubclass` in the common case -that the second argument has metaclass `type`. - -.. - -.. bpo: 18711 -.. date: 8922 -.. nonce: ds5wQa -.. section: Core and Builtins - -Add a new `PyErr_FormatV` function, similar to `PyErr_Format` but accepting -a `va_list` argument. - -.. - -.. bpo: 22520 -.. date: 8921 -.. nonce: ZPJXSq -.. section: Core and Builtins - -Fix overflow checking when generating the repr of a unicode object. - -.. - -.. bpo: 22519 -.. date: 8920 -.. nonce: xvJVg0 -.. section: Core and Builtins - -Fix overflow checking in PyBytes_Repr. - -.. - -.. bpo: 22518 -.. date: 8919 -.. nonce: C9T6ed -.. section: Core and Builtins - -Fix integer overflow issues in latin-1 encoding. - -.. - -.. bpo: 16324 -.. date: 8918 -.. nonce: YfrBNz -.. section: Core and Builtins - -_charset parameter of MIMEText now also accepts email.charset.Charset -instances. Initial patch by Claude Paroz. - -.. - -.. bpo: 1764286 -.. date: 8917 -.. nonce: L4seL2 -.. section: Core and Builtins - -Fix inspect.getsource() to support decorated functions. Patch by Claudiu -Popa. - -.. - -.. bpo: 18554 -.. date: 8916 -.. nonce: hxnaui -.. section: Core and Builtins - -os.__all__ includes posix functions. - -.. - -.. bpo: 21391 -.. date: 8915 -.. nonce: 3jntPd -.. section: Core and Builtins - -Use os.path.abspath in the shutil module. - -.. - -.. bpo: 11471 -.. date: 8914 -.. nonce: Uu752F -.. section: Core and Builtins - -avoid generating a JUMP_FORWARD instruction at the end of an if-block if -there is no else-clause. Original patch by Eugene Toder. - -.. - -.. bpo: 22215 -.. date: 8913 -.. nonce: IBFi6H -.. section: Core and Builtins - -Now ValueError is raised instead of TypeError when str or bytes argument -contains not permitted null character or byte. - -.. - -.. bpo: 22258 -.. date: 8912 -.. nonce: 4FszMt -.. section: Core and Builtins - -Fix the internal function set_inheritable() on Illumos. This platform -exposes the function ``ioctl(FIOCLEX)``, but calling it fails with errno is -ENOTTY: "Inappropriate ioctl for device". set_inheritable() now falls back -to the slower ``fcntl()`` (``F_GETFD`` and then ``F_SETFD``). - -.. - -.. bpo: 21389 -.. date: 8911 -.. nonce: dnWZBn -.. section: Core and Builtins - -Displaying the __qualname__ of the underlying function in the repr of a -bound method. - -.. - -.. bpo: 22206 -.. date: 8910 -.. nonce: 0i_ihB -.. section: Core and Builtins - -Using pthread, PyThread_create_key() now sets errno to ENOMEM and returns -1 -(error) on integer overflow. - -.. - -.. bpo: 20184 -.. date: 8909 -.. nonce: bb3uHY -.. section: Core and Builtins - -Argument Clinic based signature introspection added for 30 of the builtin -functions. - -.. - -.. bpo: 22116 -.. date: 8908 -.. nonce: auVmIt -.. section: Core and Builtins - -C functions and methods (of the 'builtin_function_or_method' type) can now -be weakref'ed. Patch by Wei Wu. - -.. - -.. bpo: 22077 -.. date: 8907 -.. nonce: KZUDR- -.. section: Core and Builtins - -Improve index error messages for bytearrays, bytes, lists, and tuples by -adding 'or slices'. Added ', not ' for bytearrays. Original patch -by Claudiu Popa. - -.. - -.. bpo: 20179 -.. date: 8906 -.. nonce: Nvhffc -.. section: Core and Builtins - -Apply Argument Clinic to bytes and bytearray. Patch by Tal Einat. - -.. - -.. bpo: 22082 -.. date: 8905 -.. nonce: 6X8Qmg -.. section: Core and Builtins - -Clear interned strings in slotdefs. - -.. - -.. bpo: 0 -.. date: 8904 -.. nonce: tuMnCc -.. section: Core and Builtins - -Upgrade Unicode database to Unicode 7.0.0. - -.. - -.. bpo: 21897 -.. date: 8903 -.. nonce: kiOGHe -.. section: Core and Builtins - -Fix a crash with the f_locals attribute with closure variables when -frame.clear() has been called. - -.. - -.. bpo: 21205 -.. date: 8902 -.. nonce: wZsx1K -.. section: Core and Builtins - -Add a new ``__qualname__`` attribute to generator, the qualified name, and -use it in the representation of a generator (``repr(gen)``). The default -name of the generator (``__name__`` attribute) is now get from the function -instead of the code. Use ``gen.gi_code.co_name`` to get the name of the -code. - -.. - -.. bpo: 21669 -.. date: 8901 -.. nonce: DFDrBA -.. section: Core and Builtins - -With the aid of heuristics in SyntaxError.__init__, the parser now attempts -to generate more meaningful (or at least more search engine friendly) error -messages when "exec" and "print" are used as statements. - -.. - -.. bpo: 21642 -.. date: 8900 -.. nonce: -lWoKz -.. section: Core and Builtins - -In the conditional if-else expression, allow an integer written with no -space between itself and the ``else`` keyword (e.g. ``True if 42else -False``) to be valid syntax. - -.. - -.. bpo: 21523 -.. date: 8899 -.. nonce: f_PPYO -.. section: Core and Builtins - -Fix over-pessimistic computation of the stack effect of some opcodes in the -compiler. This also fixes a quadratic compilation time issue noticeable -when compiling code with a large number of "and" and "or" operators. - -.. - -.. bpo: 21418 -.. date: 8898 -.. nonce: z9jp1_ -.. section: Core and Builtins - -Fix a crash in the builtin function super() when called without argument and -without current frame (ex: embedded Python). - -.. - -.. bpo: 21425 -.. date: 8897 -.. nonce: i3Teb8 -.. section: Core and Builtins - -Fix flushing of standard streams in the interactive interpreter. - -.. - -.. bpo: 21435 -.. date: 8896 -.. nonce: ZojVOT -.. section: Core and Builtins - -In rare cases, when running finalizers on objects in cyclic trash a bad -pointer dereference could occur due to a subtle flaw in internal iteration -logic. - -.. - -.. bpo: 21377 -.. date: 8895 -.. nonce: OawYfl -.. section: Core and Builtins - -PyBytes_Concat() now tries to concatenate in-place when the first argument -has a reference count of 1. Patch by Nikolaus Rath. - -.. - -.. bpo: 20355 -.. date: 8894 -.. nonce: OrCNkZ -.. section: Core and Builtins - --W command line options now have higher priority than the PYTHONWARNINGS -environment variable. Patch by Arfrever. - -.. - -.. bpo: 21274 -.. date: 8893 -.. nonce: fVGfwq -.. section: Core and Builtins - -Define PATH_MAX for GNU/Hurd in Python/pythonrun.c. - -.. - -.. bpo: 20904 -.. date: 8892 -.. nonce: fAGdj2 -.. section: Core and Builtins - -Support setting FPU precision on m68k. - -.. - -.. bpo: 21209 -.. date: 8891 -.. nonce: nMljFr -.. section: Core and Builtins - -Fix sending tuples to custom generator objects with the yield from syntax. - -.. - -.. bpo: 21193 -.. date: 8890 -.. nonce: Dg98Oo -.. section: Core and Builtins - -pow(a, b, c) now raises ValueError rather than TypeError when b is negative. -Patch by Josh Rosenberg. - -.. - -.. bpo: 21176 -.. date: 8889 -.. nonce: mitDhW -.. section: Core and Builtins - -PEP 465: Add the '@' operator for matrix multiplication. - -.. - -.. bpo: 21134 -.. date: 8888 -.. nonce: ZL4SKo -.. section: Core and Builtins - -Fix segfault when str is called on an uninitialized UnicodeEncodeError, -UnicodeDecodeError, or UnicodeTranslateError object. - -.. - -.. bpo: 19537 -.. date: 8887 -.. nonce: AkuC_J -.. section: Core and Builtins - -Fix PyUnicode_DATA() alignment under m68k. Patch by Andreas Schwab. - -.. - -.. bpo: 20929 -.. date: 8886 -.. nonce: 9NlUR7 -.. section: Core and Builtins - -Add a type cast to avoid shifting a negative number. - -.. - -.. bpo: 20731 -.. date: 8885 -.. nonce: _03SZg -.. section: Core and Builtins - -Properly position in source code files even if they are opened in text mode. -Patch by Serhiy Storchaka. - -.. - -.. bpo: 20637 -.. date: 8884 -.. nonce: ppYU0o -.. section: Core and Builtins - -Key-sharing now also works for instance dictionaries of subclasses. Patch -by Peter Ingebretson. - -.. - -.. bpo: 8297 -.. date: 8883 -.. nonce: _XdGON -.. section: Core and Builtins - -Attributes missing from modules now include the module name in the error -text. Original patch by ysj.ray. - -.. - -.. bpo: 19995 -.. date: 8882 -.. nonce: mnHEzX -.. section: Core and Builtins - -%c, %o, %x, and %X now raise TypeError on non-integer input. - -.. - -.. bpo: 19655 -.. date: 8881 -.. nonce: JgVdes -.. section: Core and Builtins - -The ASDL parser - used by the build process to generate code for managing -the Python AST in C - was rewritten. The new parser is self contained and -does not require to carry long the spark.py parser-generator library; -spark.py was removed from the source base. - -.. - -.. bpo: 12546 -.. date: 8880 -.. nonce: 09naZ9 -.. section: Core and Builtins - -Allow ``\x00`` to be used as a fill character when using str, int, float, -and complex __format__ methods. - -.. - -.. bpo: 20480 -.. date: 8879 -.. nonce: TIYPLo -.. section: Core and Builtins - -Add ipaddress.reverse_pointer. Patch by Leon Weber. - -.. - -.. bpo: 13598 -.. date: 8878 -.. nonce: GJelrw -.. section: Core and Builtins - -Modify string.Formatter to support auto-numbering of replacement fields. It -now matches the behavior of str.format() in this regard. Patches by Phil -Elson and Ramchandra Apte. - -.. - -.. bpo: 8931 -.. date: 8877 -.. nonce: M05x4f -.. section: Core and Builtins - -Make alternate formatting ('#') for type 'c' raise an exception. In versions -prior to 3.5, '#' with 'c' had no effect. Now specifying it is an error. -Patch by Torsten Landschoff. - -.. - -.. bpo: 23165 -.. date: 8876 -.. nonce: lk8uCE -.. section: Core and Builtins - -Perform overflow checks before allocating memory in the _Py_char2wchar -function. - -.. - -.. bpo: 23399 -.. date: 8875 -.. nonce: hXMYgA -.. section: Library - -pyvenv creates relative symlinks where possible. - -.. - -.. bpo: 20289 -.. date: 8874 -.. nonce: nio1N- -.. section: Library - -cgi.FieldStorage() now supports the context management protocol. - -.. - -.. bpo: 13128 -.. date: 8873 -.. nonce: vqEcsy -.. section: Library - -Print response headers for CONNECT requests when debuglevel > 0. Patch by -Demian Brecht. - -.. - -.. bpo: 15381 -.. date: 8872 -.. nonce: Xv-wu8 -.. section: Library - -Optimized io.BytesIO to make less allocations and copyings. - -.. - -.. bpo: 22818 -.. date: 8871 -.. nonce: NYdAc9 -.. section: Library - -Splitting on a pattern that could match an empty string now raises a -warning. Patterns that can only match empty strings are now rejected. - -.. - -.. bpo: 23099 -.. date: 8870 -.. nonce: ZASrUo -.. section: Library - -Closing io.BytesIO with exported buffer is rejected now to prevent -corrupting exported buffer. - -.. - -.. bpo: 23326 -.. date: 8869 -.. nonce: 8VzlZD -.. section: Library - -Removed __ne__ implementations. Since fixing default __ne__ implementation -in issue #21408 they are redundant. - -.. - -.. bpo: 23363 -.. date: 8868 -.. nonce: -koaol -.. section: Library - -Fix possible overflow in itertools.permutations. - -.. - -.. bpo: 23364 -.. date: 8867 -.. nonce: 3yBV-6 -.. section: Library - -Fix possible overflow in itertools.product. - -.. - -.. bpo: 23366 -.. date: 8866 -.. nonce: tyAfm8 -.. section: Library - -Fixed possible integer overflow in itertools.combinations. - -.. - -.. bpo: 23369 -.. date: 8865 -.. nonce: nqChyE -.. section: Library - -Fixed possible integer overflow in _json.encode_basestring_ascii. - -.. - -.. bpo: 23353 -.. date: 8864 -.. nonce: Iytkpc -.. section: Library - -Fix the exception handling of generators in PyEval_EvalFrameEx(). At entry, -save or swap the exception state even if PyEval_EvalFrameEx() is called with -throwflag=0. At exit, the exception state is now always restored or swapped, -not only if why is WHY_YIELD or WHY_RETURN. Patch co-written with Antoine -Pitrou. - -.. - -.. bpo: 14099 -.. date: 8863 -.. nonce: t9-HVE -.. section: Library - -Restored support of writing ZIP files to tellable but non-seekable streams. - -.. - -.. bpo: 14099 -.. date: 8862 -.. nonce: Myxxww -.. section: Library - -Writing to ZipFile and reading multiple ZipExtFiles is threadsafe now. - -.. - -.. bpo: 19361 -.. date: 8861 -.. nonce: 2mvrV3 -.. section: Library - -JSON decoder now raises JSONDecodeError instead of ValueError. - -.. - -.. bpo: 18518 -.. date: 8860 -.. nonce: JXgicC -.. section: Library - -timeit now rejects statements which can't be compiled outside a function or -a loop (e.g. "return" or "break"). - -.. - -.. bpo: 23094 -.. date: 8859 -.. nonce: -8AXSi -.. section: Library - -Fixed readline with frames in Python implementation of pickle. - -.. - -.. bpo: 23268 -.. date: 8858 -.. nonce: ATtRa5 -.. section: Library - -Fixed bugs in the comparison of ipaddress classes. - -.. - -.. bpo: 21408 -.. date: 8857 -.. nonce: 0rI6tx -.. section: Library - -Removed incorrect implementations of __ne__() which didn't returned -NotImplemented if __eq__() returned NotImplemented. The default __ne__() -now works correctly. - -.. - -.. bpo: 19996 -.. date: 8856 -.. nonce: 2-SiMf -.. section: Library - -:class:`email.feedparser.FeedParser` now handles (malformed) headers with no -key rather than assuming the body has started. - -.. - -.. bpo: 20188 -.. date: 8855 -.. nonce: xocY-2 -.. section: Library - -Support Application-Layer Protocol Negotiation (ALPN) in the ssl module. - -.. - -.. bpo: 23133 -.. date: 8854 -.. nonce: 8p2Wnl -.. section: Library - -Pickling of ipaddress objects now produces more compact and portable -representation. - -.. - -.. bpo: 23248 -.. date: 8853 -.. nonce: FjcyCP -.. section: Library - -Update ssl error codes from latest OpenSSL git master. - -.. - -.. bpo: 23266 -.. date: 8852 -.. nonce: Mo7alR -.. section: Library - -Much faster implementation of ipaddress.collapse_addresses() when there are -many non-consecutive addresses. - -.. - -.. bpo: 23098 -.. date: 8851 -.. nonce: 7VwF3K -.. section: Library - -64-bit dev_t is now supported in the os module. - -.. - -.. bpo: 21817 -.. date: 8850 -.. nonce: xYUW-9 -.. section: Library - -When an exception is raised in a task submitted to a ProcessPoolExecutor, -the remote traceback is now displayed in the parent process. Patch by -Claudiu Popa. - -.. - -.. bpo: 15955 -.. date: 8849 -.. nonce: uvpBL4 -.. section: Library - -Add an option to limit output size when decompressing LZMA data. Patch by -Nikolaus Rath and Martin Panter. - -.. - -.. bpo: 23250 -.. date: 8848 -.. nonce: qNGAUf -.. section: Library - -In the http.cookies module, capitalize "HttpOnly" and "Secure" as they are -written in the standard. - -.. - -.. bpo: 23063 -.. date: 8847 -.. nonce: 9-UJRs -.. section: Library - -In the distutils' check command, fix parsing of reST with code or code-block -directives. - -.. - -.. bpo: 23209 -.. date: 8846 -.. nonce: I0bCCH -.. section: Library - -selectors.BaseSelector.get_key() now raises a RuntimeError if the selector -is closed. And selectors.BaseSelector.close() now clears its internal -reference to the selector mapping to break a reference cycle. Initial patch -written by Martin Richard. (See also: bpo-23225) - -.. - -.. bpo: 17911 -.. date: 8845 -.. nonce: yg65Iu -.. section: Library - -Provide a way to seed the linecache for a PEP-302 module without actually -loading the code. - -.. - -.. bpo: 17911 -.. date: 8844 -.. nonce: qeTePa -.. section: Library - -Provide a new object API for traceback, including the ability to not lookup -lines at all until the traceback is actually rendered, without any trace of -the original objects being kept alive. - -.. - -.. bpo: 19777 -.. date: 8843 -.. nonce: H_NDIA -.. section: Library - -Provide a home() classmethod on Path objects. Contributed by Victor Salgado -and Mayank Tripathi. - -.. - -.. bpo: 23206 -.. date: 8842 -.. nonce: xSiYwq -.. section: Library - -Make ``json.dumps(..., ensure_ascii=False)`` as fast as the default case of -``ensure_ascii=True``. Patch by Naoki Inada. - -.. - -.. bpo: 23185 -.. date: 8841 -.. nonce: KHyoSO -.. section: Library - -Add math.inf and math.nan constants. - -.. - -.. bpo: 23186 -.. date: 8840 -.. nonce: KzWLP2 -.. section: Library - -Add ssl.SSLObject.shared_ciphers() and ssl.SSLSocket.shared_ciphers() to -fetch the client's list ciphers sent at handshake. - -.. - -.. bpo: 23143 -.. date: 8839 -.. nonce: AWxJXV -.. section: Library - -Remove compatibility with OpenSSLs older than 0.9.8. - -.. - -.. bpo: 23132 -.. date: 8838 -.. nonce: pbQcut -.. section: Library - -Improve performance and introspection support of comparison methods created -by functool.total_ordering. - -.. - -.. bpo: 19776 -.. date: 8837 -.. nonce: BxNgxd -.. section: Library - -Add an expanduser() method on Path objects. - -.. - -.. bpo: 23112 -.. date: 8836 -.. nonce: dZGf82 -.. section: Library - -Fix SimpleHTTPServer to correctly carry the query string and fragment when -it redirects to add a trailing slash. - -.. - -.. bpo: 21793 -.. date: 8835 -.. nonce: T1kQBL -.. section: Library - -Added http.HTTPStatus enums (i.e. HTTPStatus.OK, HTTPStatus.NOT_FOUND). -Patch by Demian Brecht. - -.. - -.. bpo: 23093 -.. date: 8834 -.. nonce: cP7OqD -.. section: Library - -In the io, module allow more operations to work on detached streams. - -.. - -.. bpo: 23111 -.. date: 8833 -.. nonce: A34IA4 -.. section: Library - -In the ftplib, make ssl.PROTOCOL_SSLv23 the default protocol version. - -.. - -.. bpo: 22585 -.. date: 8832 -.. nonce: F4BkNo -.. section: Library - -On OpenBSD 5.6 and newer, os.urandom() now calls getentropy(), instead of -reading /dev/urandom, to get pseudo-random bytes. - -.. - -.. bpo: 19104 -.. date: 8831 -.. nonce: _eIThy -.. section: Library - -pprint now produces evaluable output for wrapped strings. - -.. - -.. bpo: 23071 -.. date: 8830 -.. nonce: 3BSqF7 -.. section: Library - -Added missing names to codecs.__all__. Patch by Martin Panter. - -.. - -.. bpo: 22783 -.. date: 8829 -.. nonce: OfYxBd -.. section: Library - -Pickling now uses the NEWOBJ opcode instead of the NEWOBJ_EX opcode if -possible. - -.. - -.. bpo: 15513 -.. date: 8828 -.. nonce: 7yVnRE -.. section: Library - -Added a __sizeof__ implementation for pickle classes. - -.. - -.. bpo: 19858 -.. date: 8827 -.. nonce: cqOlIt -.. section: Library - -pickletools.optimize() now aware of the MEMOIZE opcode, can produce more -compact result and no longer produces invalid output if input data contains -MEMOIZE opcodes together with PUT or BINPUT opcodes. - -.. - -.. bpo: 22095 -.. date: 8826 -.. nonce: iISzxM -.. section: Library - -Fixed HTTPConnection.set_tunnel with default port. The port value in the -host header was set to "None". Patch by Demian Brecht. - -.. - -.. bpo: 23016 -.. date: 8825 -.. nonce: LyrPd_ -.. section: Library - -A warning no longer produces an AttributeError when the program is run with -pythonw.exe. - -.. - -.. bpo: 21775 -.. date: 8824 -.. nonce: ELR_Al -.. section: Library - -shutil.copytree(): fix crash when copying to VFAT. An exception handler -assumed that OSError objects always have a 'winerror' attribute. That is not -the case, so the exception handler itself raised AttributeError when run on -Linux (and, presumably, any other non-Windows OS). Patch by Greg Ward. - -.. - -.. bpo: 1218234 -.. date: 8823 -.. nonce: 4GcoQK -.. section: Library - -Fix inspect.getsource() to load updated source of reloaded module. Initial -patch by Berker Peksag. - -.. - -.. bpo: 21740 -.. date: 8822 -.. nonce: TtAApO -.. section: Library - -Support wrapped callables in doctest. Patch by Claudiu Popa. - -.. - -.. bpo: 23009 -.. date: 8821 -.. nonce: -sW7gk -.. section: Library - -Make sure selectors.EpollSelector.select() works when no FD is registered. - -.. - -.. bpo: 22959 -.. date: 8820 -.. nonce: Vxt3EP -.. section: Library - -In the constructor of http.client.HTTPSConnection, prefer the context's -check_hostname attribute over the *check_hostname* parameter. - -.. - -.. bpo: 22696 -.. date: 8819 -.. nonce: pvdcxs -.. section: Library - -Add function :func:`sys.is_finalizing` to know about interpreter shutdown. - -.. - -.. bpo: 16043 -.. date: 8818 -.. nonce: TGIC7t -.. section: Library - -Add a default limit for the amount of data xmlrpclib.gzip_decode will -return. This resolves CVE-2013-1753. - -.. - -.. bpo: 14099 -.. date: 8817 -.. nonce: GJ5meQ -.. section: Library - -ZipFile.open() no longer reopen the underlying file. Objects returned by -ZipFile.open() can now operate independently of the ZipFile even if the -ZipFile was created by passing in a file-like object as the first argument -to the constructor. - -.. - -.. bpo: 22966 -.. date: 8816 -.. nonce: zIxDrT -.. section: Library - -Fix __pycache__ pyc file name clobber when pyc_compile is asked to compile a -source file containing multiple dots in the source file name. - -.. - -.. bpo: 21971 -.. date: 8815 -.. nonce: XlTc22 -.. section: Library - -Update turtledemo doc and add module to the index. - -.. - -.. bpo: 21032 -.. date: 8814 -.. nonce: wxT_41 -.. section: Library - -Fixed socket leak if HTTPConnection.getresponse() fails. Original patch by -Martin Panter. - -.. - -.. bpo: 22407 -.. date: 8813 -.. nonce: CWi1wX -.. section: Library - -Deprecated the use of re.LOCALE flag with str patterns or re.ASCII. It was -newer worked. - -.. - -.. bpo: 22902 -.. date: 8812 -.. nonce: ZqXriA -.. section: Library - -The "ip" command is now used on Linux to determine MAC address in -uuid.getnode(). Pach by Bruno Cauet. - -.. - -.. bpo: 22960 -.. date: 8811 -.. nonce: 2VDILT -.. section: Library - -Add a context argument to xmlrpclib.ServerProxy constructor. - -.. - -.. bpo: 22389 -.. date: 8810 -.. nonce: 82DuwD -.. section: Library - -Add contextlib.redirect_stderr(). - -.. - -.. bpo: 21356 -.. date: 8809 -.. nonce: 8NY75J -.. section: Library - -Make ssl.RAND_egd() optional to support LibreSSL. The availability of the -function is checked during the compilation. Patch written by Bernard Spil. - -.. - -.. bpo: 22915 -.. date: 8808 -.. nonce: 709UAo -.. section: Library - -SAX parser now supports files opened with file descriptor or bytes path. - -.. - -.. bpo: 22609 -.. date: 8807 -.. nonce: mmLoeb -.. section: Library - -Constructors and update methods of mapping classes in the collections module -now accept the self keyword argument. - -.. - -.. bpo: 22940 -.. date: 8806 -.. nonce: SP99Nf -.. section: Library - -Add readline.append_history_file. - -.. - -.. bpo: 19676 -.. date: 8805 -.. nonce: Wijwr8 -.. section: Library - -Added the "namereplace" error handler. - -.. - -.. bpo: 22788 -.. date: 8804 -.. nonce: vofL9e -.. section: Library - -Add *context* parameter to logging.handlers.HTTPHandler. - -.. - -.. bpo: 22921 -.. date: 8803 -.. nonce: a4wx1C -.. section: Library - -Allow SSLContext to take the *hostname* parameter even if OpenSSL doesn't -support SNI. - -.. - -.. bpo: 22894 -.. date: 8802 -.. nonce: 4AkwPA -.. section: Library - -TestCase.subTest() would cause the test suite to be stopped when in failfast -mode, even in the absence of failures. - -.. - -.. bpo: 22796 -.. date: 8801 -.. nonce: _pFPFA -.. section: Library - -HTTP cookie parsing is now stricter, in order to protect against potential -injection attacks. - -.. - -.. bpo: 22370 -.. date: 8800 -.. nonce: j4y21u -.. section: Library - -Windows detection in pathlib is now more robust. - -.. - -.. bpo: 22841 -.. date: 8799 -.. nonce: 8wpk7T -.. section: Library - -Reject coroutines in asyncio add_signal_handler(). Patch by Ludovic.Gasc. - -.. - -.. bpo: 19494 -.. date: 8798 -.. nonce: 7O5O8k -.. section: Library - -Added urllib.request.HTTPBasicPriorAuthHandler. Patch by Matej Cepl. - -.. - -.. bpo: 22578 -.. date: 8797 -.. nonce: 6XZ0Jf -.. section: Library - -Added attributes to the re.error class. - -.. - -.. bpo: 22849 -.. date: 8796 -.. nonce: AqBPyj -.. section: Library - -Fix possible double free in the io.TextIOWrapper constructor. - -.. - -.. bpo: 12728 -.. date: 8795 -.. nonce: rHZmXO -.. section: Library - -Different Unicode characters having the same uppercase but different -lowercase are now matched in case-insensitive regular expressions. - -.. - -.. bpo: 22821 -.. date: 8794 -.. nonce: 30cQ-U -.. section: Library - -Fixed fcntl() with integer argument on 64-bit big-endian platforms. - -.. - -.. bpo: 21650 -.. date: 8793 -.. nonce: 62MLqr -.. section: Library - -Add an `--sort-keys` option to json.tool CLI. - -.. - -.. bpo: 22824 -.. date: 8792 -.. nonce: d5Txvr -.. section: Library - -Updated reprlib output format for sets to use set literals. Patch -contributed by Berker Peksag. - -.. - -.. bpo: 22824 -.. date: 8791 -.. nonce: H_r9uH -.. section: Library - -Updated reprlib output format for arrays to display empty arrays without an -unnecessary empty list. Suggested by Serhiy Storchaka. - -.. - -.. bpo: 22406 -.. date: 8790 -.. nonce: sPlVbI -.. section: Library - -Fixed the uu_codec codec incorrectly ported to 3.x. Based on patch by Martin -Panter. - -.. - -.. bpo: 17293 -.. date: 8789 -.. nonce: Hk06bO -.. section: Library - -uuid.getnode() now determines MAC address on AIX using netstat. Based on -patch by Aivars Kalvāns. - -.. - -.. bpo: 22769 -.. date: 8788 -.. nonce: PunnvQ -.. section: Library - -Fixed ttk.Treeview.tag_has() when called without arguments. - -.. - -.. bpo: 22417 -.. date: 8787 -.. nonce: To4b7U -.. section: Library - -Verify certificates by default in httplib (PEP 476). - -.. - -.. bpo: 22775 -.. date: 8786 -.. nonce: V5aCUz -.. section: Library - -Fixed unpickling of http.cookies.SimpleCookie with protocol 2 and above. -Patch by Tim Graham. - -.. - -.. bpo: 22776 -.. date: 8785 -.. nonce: xNcRse -.. section: Library - -Brought excluded code into the scope of a try block in SysLogHandler.emit(). - -.. - -.. bpo: 22665 -.. date: 8784 -.. nonce: j6Jlp8 -.. section: Library - -Add missing get_terminal_size and SameFileError to shutil.__all__. - -.. - -.. bpo: 6623 -.. date: 8783 -.. nonce: 6LOidS -.. section: Library - -Remove deprecated Netrc class in the ftplib module. Patch by Matt Chaput. - -.. - -.. bpo: 17381 -.. date: 8782 -.. nonce: 4J5yv7 -.. section: Library - -Fixed handling of case-insensitive ranges in regular expressions. - -.. - -.. bpo: 22410 -.. date: 8781 -.. nonce: 99YFdd -.. section: Library - -Module level functions in the re module now cache compiled locale-dependent -regular expressions taking into account the locale. - -.. - -.. bpo: 22759 -.. date: 8780 -.. nonce: BJPdiL -.. section: Library - -Query methods on pathlib.Path() (exists(), is_dir(), etc.) now return False -when the underlying stat call raises NotADirectoryError. - -.. - -.. bpo: 8876 -.. date: 8779 -.. nonce: A83Av4 -.. section: Library - -distutils now falls back to copying files when hard linking doesn't work. -This allows use with special filesystems such as VirtualBox shared folders. - -.. - -.. bpo: 22217 -.. date: 8778 -.. nonce: nXzGur -.. section: Library - -Implemented reprs of classes in the zipfile module. - -.. - -.. bpo: 22457 -.. date: 8777 -.. nonce: Xd2Mk- -.. section: Library - -Honour load_tests in the start_dir of discovery. - -.. - -.. bpo: 18216 -.. date: 8776 -.. nonce: trTZw4 -.. section: Library - -gettext now raises an error when a .mo file has an unsupported major version -number. Patch by Aaron Hill. - -.. - -.. bpo: 13918 -.. date: 8775 -.. nonce: -OnUhD -.. section: Library - -Provide a locale.delocalize() function which can remove locale-specific -number formatting from a string representing a number, without then -converting it to a specific type. Patch by Cédric Krier. - -.. - -.. bpo: 22676 -.. date: 8774 -.. nonce: d2v8QM -.. section: Library - -Make the pickling of global objects which don't have a __module__ attribute -less slow. - -.. - -.. bpo: 18853 -.. date: 8773 -.. nonce: 76DrPD -.. section: Library - -Fixed ResourceWarning in shlex.__nain__. - -.. - -.. bpo: 9351 -.. date: 8772 -.. nonce: u5UI-6 -.. section: Library - -Defaults set with set_defaults on an argparse subparser are no longer -ignored when also set on the parent parser. - -.. - -.. bpo: 7559 -.. date: 8771 -.. nonce: QG35ZP -.. section: Library - -unittest test loading ImportErrors are reported as import errors with their -import exception rather than as attribute errors after the import has -already failed. - -.. - -.. bpo: 19746 -.. date: 8770 -.. nonce: S1dg1K -.. section: Library - -Make it possible to examine the errors from unittest discovery without -executing the test suite. The new `errors` attribute on TestLoader exposes -these non-fatal errors encountered during discovery. - -.. - -.. bpo: 21991 -.. date: 8769 -.. nonce: Mkm0IN -.. section: Library - -Make email.headerregistry's header 'params' attributes be read-only -(MappingProxyType). Previously the dictionary was modifiable but a new one -was created on each access of the attribute. - -.. - -.. bpo: 22638 -.. date: 8768 -.. nonce: Ur73gJ -.. section: Library - -SSLv3 is now disabled throughout the standard library. It can still be -enabled by instantiating a SSLContext manually. - -.. - -.. bpo: 22641 -.. date: 8767 -.. nonce: m0ldtl -.. section: Library - -In asyncio, the default SSL context for client connections is now created -using ssl.create_default_context(), for stronger security. - -.. - -.. bpo: 17401 -.. date: 8766 -.. nonce: SZd19P -.. section: Library - -Include closefd in io.FileIO repr. - -.. - -.. bpo: 21338 -.. date: 8765 -.. nonce: evDyHD -.. section: Library - -Add silent mode for compileall. quiet parameters of compile_{dir, file, -path} functions now have a multilevel value. Also, -q option of the CLI now -have a multilevel value. Patch by Thomas Kluyver. - -.. - -.. bpo: 20152 -.. date: 8764 -.. nonce: 9_o92A -.. section: Library - -Convert the array and cmath modules to Argument Clinic. - -.. - -.. bpo: 18643 -.. date: 8763 -.. nonce: 6Qdc0J -.. section: Library - -Add socket.socketpair() on Windows. - -.. - -.. bpo: 22435 -.. date: 8762 -.. nonce: s2U7Zm -.. section: Library - -Fix a file descriptor leak when socketserver bind fails. - -.. - -.. bpo: 13096 -.. date: 8761 -.. nonce: rsailB -.. section: Library - -Fixed segfault in CTypes POINTER handling of large values. - -.. - -.. bpo: 11694 -.. date: 8760 -.. nonce: JuDrch -.. section: Library - -Raise ConversionError in xdrlib as documented. Patch by Filip Gruszczyński -and Claudiu Popa. - -.. - -.. bpo: 19380 -.. date: 8759 -.. nonce: nqgoRQ -.. section: Library - -Optimized parsing of regular expressions. - -.. - -.. bpo: 1519638 -.. date: 8758 -.. nonce: 2pbuog -.. section: Library - -Now unmatched groups are replaced with empty strings in re.sub() and -re.subn(). - -.. - -.. bpo: 18615 -.. date: 8757 -.. nonce: 65TxnY -.. section: Library - -sndhdr.what/whathdr now return a namedtuple. - -.. - -.. bpo: 22462 -.. date: 8756 -.. nonce: 1h4Kpr -.. section: Library - -Fix pyexpat's creation of a dummy frame to make it appear in exception -tracebacks. - -.. - -.. bpo: 21965 -.. date: 8755 -.. nonce: n_jnXs -.. section: Library - -Add support for in-memory SSL to the ssl module. Patch by Geert Jansen. - -.. - -.. bpo: 21173 -.. date: 8754 -.. nonce: egkbEx -.. section: Library - -Fix len() on a WeakKeyDictionary when .clear() was called with an iterator -alive. - -.. - -.. bpo: 11866 -.. date: 8753 -.. nonce: xrvbIC -.. section: Library - -Eliminated race condition in the computation of names for new threads. - -.. - -.. bpo: 21905 -.. date: 8752 -.. nonce: coKyRo -.. section: Library - -Avoid RuntimeError in pickle.whichmodule() when sys.modules is mutated while -iterating. Patch by Olivier Grisel. - -.. - -.. bpo: 11271 -.. date: 8751 -.. nonce: ZYiJru -.. section: Library - -concurrent.futures.Executor.map() now takes a *chunksize* argument to allow -batching of tasks in child processes and improve performance of -ProcessPoolExecutor. Patch by Dan O'Reilly. - -.. - -.. bpo: 21883 -.. date: 8750 -.. nonce: qpuQu6 -.. section: Library - -os.path.join() and os.path.relpath() now raise a TypeError with more helpful -error message for unsupported or mismatched types of arguments. - -.. - -.. bpo: 22219 -.. date: 8749 -.. nonce: l9Enh9 -.. section: Library - -The zipfile module CLI now adds entries for directories (including empty -directories) in ZIP file. - -.. - -.. bpo: 22449 -.. date: 8748 -.. nonce: nFW_Fl -.. section: Library - -In the ssl.SSLContext.load_default_certs, consult the environmental -variables SSL_CERT_DIR and SSL_CERT_FILE on Windows. - -.. - -.. bpo: 22508 -.. date: 8747 -.. nonce: 2LbnGQ -.. section: Library - -The email.__version__ variable has been removed; the email code is no longer -shipped separately from the stdlib, and __version__ hasn't been updated in -several releases. - -.. - -.. bpo: 20076 -.. date: 8746 -.. nonce: -7OIVB -.. section: Library - -Added non derived UTF-8 aliases to locale aliases table. - -.. - -.. bpo: 20079 -.. date: 8745 -.. nonce: qM949O -.. section: Library - -Added locales supported in glibc 2.18 to locale alias table. - -.. - -.. bpo: 20218 -.. date: 8744 -.. nonce: CMgOyE -.. section: Library - -Added convenience methods read_text/write_text and read_bytes/ write_bytes -to pathlib.Path objects. - -.. - -.. bpo: 22396 -.. date: 8743 -.. nonce: cQSizA -.. section: Library - -On 32-bit AIX platform, don't expose os.posix_fadvise() nor -os.posix_fallocate() because their prototypes in system headers are wrong. - -.. - -.. bpo: 22517 -.. date: 8742 -.. nonce: qT6-aB -.. section: Library - -When an io.BufferedRWPair object is deallocated, clear its weakrefs. - -.. - -.. bpo: 22437 -.. date: 8741 -.. nonce: MRVnmQ -.. section: Library - -Number of capturing groups in regular expression is no longer limited by -100. - -.. - -.. bpo: 17442 -.. date: 8740 -.. nonce: rnc87D -.. section: Library - -InteractiveInterpreter now displays the full chained traceback in its -showtraceback method, to match the built in interactive interpreter. - -.. - -.. bpo: 23392 -.. date: 8739 -.. nonce: Pe7_WK -.. section: Library - -Added tests for marshal C API that works with FILE*. - -.. - -.. bpo: 10510 -.. date: 8738 -.. nonce: N-ntcD -.. section: Library - -distutils register and upload methods now use HTML standards compliant CRLF -line endings. - -.. - -.. bpo: 9850 -.. date: 8737 -.. nonce: D-UnVi -.. section: Library - -Fixed macpath.join() for empty first component. Patch by Oleg Oshmyan. - -.. - -.. bpo: 5309 -.. date: 8736 -.. nonce: pVMmQ8 -.. section: Library - -distutils' build and build_ext commands now accept a ``-j`` option to enable -parallel building of extension modules. - -.. - -.. bpo: 22448 -.. date: 8735 -.. nonce: fAapvE -.. section: Library - -Improve canceled timer handles cleanup to prevent unbound memory usage. -Patch by Joshua Moore-Oliva. - -.. - -.. bpo: 22427 -.. date: 8734 -.. nonce: TZ5S_u -.. section: Library - -TemporaryDirectory no longer attempts to clean up twice when used in the -with statement in generator. - -.. - -.. bpo: 22362 -.. date: 8733 -.. nonce: xIBThN -.. section: Library - -Forbidden ambiguous octal escapes out of range 0-0o377 in regular -expressions. - -.. - -.. bpo: 20912 -.. date: 8732 -.. nonce: cAq3mZ -.. section: Library - -Now directories added to ZIP file have correct Unix and MS-DOS directory -attributes. - -.. - -.. bpo: 21866 -.. date: 8731 -.. nonce: hSc4wM -.. section: Library - -ZipFile.close() no longer writes ZIP64 central directory records if -allowZip64 is false. - -.. - -.. bpo: 22278 -.. date: 8730 -.. nonce: abqBXZ -.. section: Library - -Fix urljoin problem with relative urls, a regression observed after changes -to issue22118 were submitted. - -.. - -.. bpo: 22415 -.. date: 8729 -.. nonce: xJLAvI -.. section: Library - -Fixed debugging output of the GROUPREF_EXISTS opcode in the re module. -Removed trailing spaces in debugging output. - -.. - -.. bpo: 22423 -.. date: 8728 -.. nonce: Rtb4oT -.. section: Library - -Unhandled exception in thread no longer causes unhandled AttributeError when -sys.stderr is None. - -.. - -.. bpo: 21332 -.. date: 8727 -.. nonce: Gwxwlr -.. section: Library - -Ensure that ``bufsize=1`` in subprocess.Popen() selects line buffering, -rather than block buffering. Patch by Akira Li. - -.. - -.. bpo: 21091 -.. date: 8726 -.. nonce: M5hAtT -.. section: Library - -Fix API bug: email.message.EmailMessage.is_attachment is now a method. - -.. - -.. bpo: 21079 -.. date: 8725 -.. nonce: czVcL8 -.. section: Library - -Fix email.message.EmailMessage.is_attachment to return the correct result -when the header has parameters as well as a value. - -.. - -.. bpo: 22247 -.. date: 8724 -.. nonce: sGIpR3 -.. section: Library - -Add NNTPError to nntplib.__all__. - -.. - -.. bpo: 22366 -.. date: 8723 -.. nonce: Dd1eFj -.. section: Library - -urllib.request.urlopen will accept a context object (SSLContext) as an -argument which will then be used for HTTPS connection. Patch by Alex Gaynor. - -.. - -.. bpo: 4180 -.. date: 8722 -.. nonce: QBx0JK -.. section: Library - -The warnings registries are now reset when the filters are modified. - -.. - -.. bpo: 22419 -.. date: 8721 -.. nonce: FqH4aC -.. section: Library - -Limit the length of incoming HTTP request in wsgiref server to 65536 bytes -and send a 414 error code for higher lengths. Patch contributed by Devin -Cook. - -.. - -.. bpo: 0 -.. date: 8720 -.. nonce: y7r3O2 -.. section: Library - -Lax cookie parsing in http.cookies could be a security issue when combined -with non-standard cookie handling in some Web browsers. Reported by Sergey -Bobrov. - -.. - -.. bpo: 20537 -.. date: 8719 -.. nonce: E0CE54 -.. section: Library - -logging methods now accept an exception instance as well as a Boolean value -or exception tuple. Thanks to Yury Selivanov for the patch. - -.. - -.. bpo: 22384 -.. date: 8718 -.. nonce: -Nl4He -.. section: Library - -An exception in Tkinter callback no longer crashes the program when it is -run with pythonw.exe. - -.. - -.. bpo: 22168 -.. date: 8717 -.. nonce: vLeKWC -.. section: Library - -Prevent turtle AttributeError with non-default Canvas on OS X. - -.. - -.. bpo: 21147 -.. date: 8716 -.. nonce: w9DE17 -.. section: Library - -sqlite3 now raises an exception if the request contains a null character -instead of truncating it. Based on patch by Victor Stinner. - -.. - -.. bpo: 13968 -.. date: 8715 -.. nonce: 1okGqm -.. section: Library - -The glob module now supports recursive search in subdirectories using the -``**`` pattern. - -.. - -.. bpo: 21951 -.. date: 8714 -.. nonce: 3vS4LK -.. section: Library - -Fixed a crash in Tkinter on AIX when called Tcl command with empty string or -tuple argument. - -.. - -.. bpo: 21951 -.. date: 8713 -.. nonce: _CCC4v -.. section: Library - -Tkinter now most likely raises MemoryError instead of crash if the memory -allocation fails. - -.. - -.. bpo: 22338 -.. date: 8712 -.. nonce: rKlCMz -.. section: Library - -Fix a crash in the json module on memory allocation failure. - -.. - -.. bpo: 12410 -.. date: 8711 -.. nonce: oFf-cB -.. section: Library - -imaplib.IMAP4 now supports the context management protocol. Original patch -by Tarek Ziadé. - -.. - -.. bpo: 21270 -.. date: 8710 -.. nonce: qMBaY- -.. section: Library - -We now override tuple methods in mock.call objects so that they can be used -as normal call attributes. - -.. - -.. bpo: 16662 -.. date: 8709 -.. nonce: Nghn-Y -.. section: Library - -load_tests() is now unconditionally run when it is present in a package's -__init__.py. TestLoader.loadTestsFromModule() still accepts use_load_tests, -but it is deprecated and ignored. A new keyword-only attribute `pattern` is -added and documented. Patch given by Robert Collins, tweaked by Barry -Warsaw. - -.. - -.. bpo: 22226 -.. date: 8708 -.. nonce: T1ZMPY -.. section: Library - -First letter no longer is stripped from the "status" key in the result of -Treeview.heading(). - -.. - -.. bpo: 19524 -.. date: 8707 -.. nonce: EQJjlF -.. section: Library - -Fixed resource leak in the HTTP connection when an invalid response is -received. Patch by Martin Panter. - -.. - -.. bpo: 20421 -.. date: 8706 -.. nonce: iR0S1s -.. section: Library - -Add a .version() method to SSL sockets exposing the actual protocol version -in use. - -.. - -.. bpo: 19546 -.. date: 8705 -.. nonce: 8VdYBK -.. section: Library - -configparser exceptions no longer expose implementation details. Chained -KeyErrors are removed, which leads to cleaner tracebacks. Patch by Claudiu -Popa. - -.. - -.. bpo: 22051 -.. date: 8704 -.. nonce: cUjFqL -.. section: Library - -turtledemo no longer reloads examples to re-run them. Initialization of -variables and gui setup should be done in main(), which is called each time -a demo is run, but not on import. - -.. - -.. bpo: 21933 -.. date: 8703 -.. nonce: IhMjN1 -.. section: Library - -Turtledemo users can change the code font size with a menu selection or -control(command) '-' or '+' or control-mousewheel. Original patch by Lita -Cho. - -.. - -.. bpo: 21597 -.. date: 8702 -.. nonce: aPTCWJ -.. section: Library - -The separator between the turtledemo text pane and the drawing canvas can -now be grabbed and dragged with a mouse. The code text pane can be widened -to easily view or copy the full width of the text. The canvas can be -widened on small screens. Original patches by Jan Kanis and Lita Cho. - -.. - -.. bpo: 18132 -.. date: 8701 -.. nonce: 2R2nwM -.. section: Library - -Turtledemo buttons no longer disappear when the window is shrunk. Original -patches by Jan Kanis and Lita Cho. - -.. - -.. bpo: 22043 -.. date: 8700 -.. nonce: Q6RvGL -.. section: Library - -time.monotonic() is now always available. ``threading.Lock.acquire()``, -``threading.RLock.acquire()`` and socket operations now use a monotonic -clock, instead of the system clock, when a timeout is used. - -.. - -.. bpo: 21527 -.. date: 8699 -.. nonce: N5WPxr -.. section: Library - -Add a default number of workers to ThreadPoolExecutor equal to 5 times the -number of CPUs. Patch by Claudiu Popa. - -.. - -.. bpo: 22216 -.. date: 8698 -.. nonce: Cmalu6 -.. section: Library - -smtplib now resets its state more completely after a quit. The most obvious -consequence of the previous behavior was a STARTTLS failure during a -connect/starttls/quit/connect/starttls sequence. - -.. - -.. bpo: 22098 -.. date: 8697 -.. nonce: 5JYiQN -.. section: Library - -ctypes' BigEndianStructure and LittleEndianStructure now define an empty -__slots__ so that subclasses don't always get an instance dict. Patch by -Claudiu Popa. - -.. - -.. bpo: 22185 -.. date: 8696 -.. nonce: 1SCCIK -.. section: Library - -Fix an occasional RuntimeError in threading.Condition.wait() caused by -mutation of the waiters queue without holding the lock. Patch by Doug -Zongker. - -.. - -.. bpo: 22287 -.. date: 8695 -.. nonce: awH2AI -.. section: Library - -On UNIX, _PyTime_gettimeofday() now uses clock_gettime(CLOCK_REALTIME) if -available. As a side effect, Python now depends on the librt library on -Solaris and on Linux (only with glibc older than 2.17). - -.. - -.. bpo: 22182 -.. date: 8694 -.. nonce: 5EG1Bc -.. section: Library - -Use e.args to unpack exceptions correctly in distutils.file_util.move_file. -Patch by Claudiu Popa. - -.. - -.. bpo: 0 -.. date: 8693 -.. nonce: zBfe8J -.. section: Library - -The webbrowser module now uses subprocess's start_new_session=True rather -than a potentially risky preexec_fn=os.setsid call. - -.. - -.. bpo: 22042 -.. date: 8692 -.. nonce: WZvb8s -.. section: Library - -signal.set_wakeup_fd(fd) now raises an exception if the file descriptor is -in blocking mode. - -.. - -.. bpo: 16808 -.. date: 8691 -.. nonce: kPy_5U -.. section: Library - -inspect.stack() now returns a named tuple instead of a tuple. Patch by -Daniel Shahaf. - -.. - -.. bpo: 22236 -.. date: 8690 -.. nonce: 1utXkg -.. section: Library - -Fixed Tkinter images copying operations in NoDefaultRoot mode. - -.. - -.. bpo: 2527 -.. date: 8689 -.. nonce: fR2GS6 -.. section: Library - -Add a *globals* argument to timeit functions, in order to override the -globals namespace in which the timed code is executed. Patch by Ben Roberts. - -.. - -.. bpo: 22118 -.. date: 8688 -.. nonce: 3gdkOF -.. section: Library - -Switch urllib.parse to use RFC 3986 semantics for the resolution of relative -URLs, rather than RFCs 1808 and 2396. Patch by Demian Brecht. - -.. - -.. bpo: 21549 -.. date: 8687 -.. nonce: i1LVvg -.. section: Library - -Added the "members" parameter to TarFile.list(). - -.. - -.. bpo: 19628 -.. date: 8686 -.. nonce: ssQVP8 -.. section: Library - -Allow compileall recursion depth to be specified with a -r option. - -.. - -.. bpo: 15696 -.. date: 8685 -.. nonce: PTwXYJ -.. section: Library - -Add a __sizeof__ implementation for mmap objects on Windows. - -.. - -.. bpo: 22068 -.. date: 8684 -.. nonce: wCdaW0 -.. section: Library - -Avoided reference loops with Variables and Fonts in Tkinter. - -.. - -.. bpo: 22165 -.. date: 8683 -.. nonce: J1np4o -.. section: Library - -SimpleHTTPRequestHandler now supports undecodable file names. - -.. - -.. bpo: 15381 -.. date: 8682 -.. nonce: Ia8pf6 -.. section: Library - -Optimized line reading in io.BytesIO. - -.. - -.. bpo: 8797 -.. date: 8681 -.. nonce: aJcIPu -.. section: Library - -Raise HTTPError on failed Basic Authentication immediately. Initial patch by -Sam Bull. - -.. - -.. bpo: 20729 -.. date: 8680 -.. nonce: I-1Lap -.. section: Library - -Restored the use of lazy iterkeys()/itervalues()/iteritems() in the mailbox -module. - -.. - -.. bpo: 21448 -.. date: 8679 -.. nonce: THJSYB -.. section: Library - -Changed FeedParser feed() to avoid O(N**2) behavior when parsing long line. -Original patch by Raymond Hettinger. - -.. - -.. bpo: 22184 -.. date: 8678 -.. nonce: UCbSOt -.. section: Library - -The functools LRU Cache decorator factory now gives an earlier and clearer -error message when the user forgets the required parameters. - -.. - -.. bpo: 17923 -.. date: 8677 -.. nonce: YI_QjG -.. section: Library - -glob() patterns ending with a slash no longer match non-dirs on AIX. Based -on patch by Delhallt. - -.. - -.. bpo: 21725 -.. date: 8676 -.. nonce: eIu-2N -.. section: Library - -Added support for RFC 6531 (SMTPUTF8) in smtpd. - -.. - -.. bpo: 22176 -.. date: 8675 -.. nonce: rgbRyg -.. section: Library - -Update the ctypes module's libffi to v3.1. This release adds support for -the Linux AArch64 and POWERPC ELF ABIv2 little endian architectures. - -.. - -.. bpo: 5411 -.. date: 8674 -.. nonce: 5Utapn -.. section: Library - -Added support for the "xztar" format in the shutil module. - -.. - -.. bpo: 21121 -.. date: 8673 -.. nonce: ZLsRil -.. section: Library - -Don't force 3rd party C extensions to be built with --Werror=declaration-after-statement. - -.. - -.. bpo: 21975 -.. date: 8672 -.. nonce: MI8ntO -.. section: Library - -Fixed crash when using uninitialized sqlite3.Row (in particular when -unpickling pickled sqlite3.Row). sqlite3.Row is now initialized in the -__new__() method. - -.. - -.. bpo: 20170 -.. date: 8671 -.. nonce: 8QfhN7 -.. section: Library - -Convert posixmodule to use Argument Clinic. - -.. - -.. bpo: 21539 -.. date: 8670 -.. nonce: YccmZF -.. section: Library - -Add an *exists_ok* argument to `Pathlib.mkdir()` to mimic `mkdir -p` and -`os.makedirs()` functionality. When true, ignore FileExistsErrors. Patch -by Berker Peksag. - -.. - -.. bpo: 22127 -.. date: 8669 -.. nonce: 0l2OO5 -.. section: Library - -Bypass IDNA for pure-ASCII host names in the socket module (in particular -for numeric IPs). - -.. - -.. bpo: 21047 -.. date: 8668 -.. nonce: XfUQG3 -.. section: Library - -set the default value for the *convert_charrefs* argument of HTMLParser to -True. Patch by Berker Peksag. - -.. - -.. bpo: 0 -.. date: 8667 -.. nonce: 56bAnQ -.. section: Library - -Add an __all__ to html.entities. - -.. - -.. bpo: 15114 -.. date: 8666 -.. nonce: jXwseC -.. section: Library - -the strict mode and argument of HTMLParser, HTMLParser.error, and the -HTMLParserError exception have been removed. - -.. - -.. bpo: 22085 -.. date: 8665 -.. nonce: 3JM_Aw -.. section: Library - -Dropped support of Tk 8.3 in Tkinter. - -.. - -.. bpo: 21580 -.. date: 8664 -.. nonce: 3ssycS -.. section: Library - -Now Tkinter correctly handles bytes arguments passed to Tk. In particular -this allows initializing images from binary data. - -.. - -.. bpo: 22003 -.. date: 8663 -.. nonce: 4ZIDS1 -.. section: Library - -When initialized from a bytes object, io.BytesIO() now defers making a copy -until it is mutated, improving performance and memory use on some use cases. -Patch by David Wilson. - -.. - -.. bpo: 22018 -.. date: 8662 -.. nonce: 6ApxSH -.. section: Library - -On Windows, signal.set_wakeup_fd() now also supports sockets. A side effect -is that Python depends to the WinSock library. - -.. - -.. bpo: 22054 -.. date: 8661 -.. nonce: zp6Svw -.. section: Library - -Add os.get_blocking() and os.set_blocking() functions to get and set the -blocking mode of a file descriptor (False if the O_NONBLOCK flag is set, -True otherwise). These functions are not available on Windows. - -.. - -.. bpo: 17172 -.. date: 8660 -.. nonce: R_LI_2 -.. section: Library - -Make turtledemo start as active on OS X even when run with subprocess. -Patch by Lita Cho. - -.. - -.. bpo: 21704 -.. date: 8659 -.. nonce: gL3ikj -.. section: Library - -Fix build error for _multiprocessing when semaphores are not available. -Patch by Arfrever Frehtes Taifersar Arahesis. - -.. - -.. bpo: 20173 -.. date: 8658 -.. nonce: FAL-4L -.. section: Library - -Convert sha1, sha256, sha512 and md5 to ArgumentClinic. Patch by Vajrasky -Kok. - -.. - -.. bpo: 0 -.. date: 8657 -.. nonce: G25tq3 -.. section: Library - -Fix repr(_socket.socket) on Windows 64-bit: don't fail with OverflowError on -closed socket. repr(socket.socket) already works fine. - -.. - -.. bpo: 22033 -.. date: 8656 -.. nonce: nkBNci -.. section: Library - -Reprs of most Python implemented classes now contain actual class name -instead of hardcoded one. - -.. - -.. bpo: 21947 -.. date: 8655 -.. nonce: mlisu- -.. section: Library - -The dis module can now disassemble generator-iterator objects based on their -gi_code attribute. Patch by Clement Rouault. - -.. - -.. bpo: 16133 -.. date: 8654 -.. nonce: tYuYQF -.. section: Library - -The asynchat.async_chat.handle_read() method now ignores BlockingIOError -exceptions. - -.. - -.. bpo: 22044 -.. date: 8653 -.. nonce: t09GRU -.. section: Library - -Fixed premature DECREF in call_tzinfo_method. Patch by Tom Flanagan. - -.. - -.. bpo: 19884 -.. date: 8652 -.. nonce: v73gSn -.. section: Library - -readline: Disable the meta modifier key if stdout is not a terminal to not -write the ANSI sequence ``"\033[1034h"`` into stdout. This sequence is used -on some terminal (ex: TERM=xterm-256color") to enable support of 8 bit -characters. - -.. - -.. bpo: 4350 -.. date: 8651 -.. nonce: nrTzJn -.. section: Library - -Removed a number of out-of-dated and non-working for a long time Tkinter -methods. - -.. - -.. bpo: 6167 -.. date: 8650 -.. nonce: n9dV_D -.. section: Library - -Scrollbar.activate() now returns the name of active element if the argument -is not specified. Scrollbar.set() now always accepts only 2 arguments. - -.. - -.. bpo: 15275 -.. date: 8649 -.. nonce: jk0tTI -.. section: Library - -Clean up and speed up the ntpath module. - -.. - -.. bpo: 21888 -.. date: 8648 -.. nonce: danlpz -.. section: Library - -plistlib's load() and loads() now work if the fmt parameter is specified. - -.. - -.. bpo: 22032 -.. date: 8647 -.. nonce: UklzQW -.. section: Library - -__qualname__ instead of __name__ is now always used to format fully -qualified class names of Python implemented classes. - -.. - -.. bpo: 22031 -.. date: 8646 -.. nonce: 9aazp1 -.. section: Library - -Reprs now always use hexadecimal format with the "0x" prefix when contain an -id in form " at 0x...". - -.. - -.. bpo: 22018 -.. date: 8645 -.. nonce: b_JTHH -.. section: Library - -signal.set_wakeup_fd() now raises an OSError instead of a ValueError on -``fstat()`` failure. - -.. - -.. bpo: 21044 -.. date: 8644 -.. nonce: 16xo9u -.. section: Library - -tarfile.open() now handles fileobj with an integer 'name' attribute. Based -on patch by Antoine Pietri. - -.. - -.. bpo: 21966 -.. date: 8643 -.. nonce: hHD9MK -.. section: Library - -Respect -q command-line option when code module is ran. - -.. - -.. bpo: 19076 -.. date: 8642 -.. nonce: xCoIai -.. section: Library - -Don't pass the redundant 'file' argument to self.error(). - -.. - -.. bpo: 16382 -.. date: 8641 -.. nonce: -XBK7z -.. section: Library - -Improve exception message of warnings.warn() for bad category. Initial patch -by Phil Elson. - -.. - -.. bpo: 21932 -.. date: 8640 -.. nonce: LK_5S1 -.. section: Library - -os.read() now uses a :c:func:`Py_ssize_t` type instead of :c:type:`int` for -the size to support reading more than 2 GB at once. On Windows, the size is -truncated to INT_MAX. As any call to os.read(), the OS may read less bytes -than the number of requested bytes. - -.. - -.. bpo: 21942 -.. date: 8639 -.. nonce: TLOS41 -.. section: Library - -Fixed source file viewing in pydoc's server mode on Windows. - -.. - -.. bpo: 11259 -.. date: 8638 -.. nonce: GxfYnE -.. section: Library - -asynchat.async_chat().set_terminator() now raises a ValueError if the number -of received bytes is negative. - -.. - -.. bpo: 12523 -.. date: 8637 -.. nonce: XBdAky -.. section: Library - -asynchat.async_chat.push() now raises a TypeError if it doesn't get a bytes -string - -.. - -.. bpo: 21707 -.. date: 8636 -.. nonce: rrY_wd -.. section: Library - -Add missing kwonlyargcount argument to ModuleFinder.replace_paths_in_code(). - -.. - -.. bpo: 20639 -.. date: 8635 -.. nonce: YdvOpp -.. section: Library - -calling Path.with_suffix('') allows removing the suffix again. Patch by -July Tikhonov. - -.. - -.. bpo: 21714 -.. date: 8634 -.. nonce: HhkGXW -.. section: Library - -Disallow the construction of invalid paths using Path.with_name(). Original -patch by Antony Lee. - -.. - -.. bpo: 15014 -.. date: 8633 -.. nonce: dB50zb -.. section: Library - -Added 'auth' method to smtplib to make implementing auth mechanisms simpler, -and used it internally in the login method. - -.. - -.. bpo: 21151 -.. date: 8632 -.. nonce: o7IuiD -.. section: Library - -Fixed a segfault in the winreg module when ``None`` is passed as a -``REG_BINARY`` value to SetValueEx. Patch by John Ehresman. - -.. - -.. bpo: 21090 -.. date: 8631 -.. nonce: 20Ooif -.. section: Library - -io.FileIO.readall() does not ignore I/O errors anymore. Before, it ignored -I/O errors if at least the first C call read() succeed. - -.. - -.. bpo: 5800 -.. date: 8630 -.. nonce: ZJiLZP -.. section: Library - -headers parameter of wsgiref.headers.Headers is now optional. Initial patch -by Pablo Torres Navarrete and SilentGhost. - -.. - -.. bpo: 21781 -.. date: 8629 -.. nonce: u_oiv9 -.. section: Library - -ssl.RAND_add() now supports strings longer than 2 GB. - -.. - -.. bpo: 21679 -.. date: 8628 -.. nonce: CTVT9A -.. section: Library - -Prevent extraneous fstat() calls during open(). Patch by Bohuslav Kabrda. - -.. - -.. bpo: 21863 -.. date: 8627 -.. nonce: BzbwSL -.. section: Library - -cProfile now displays the module name of C extension functions, in addition -to their own name. - -.. - -.. bpo: 11453 -.. date: 8626 -.. nonce: 53Gr_R -.. section: Library - -asyncore: emit a ResourceWarning when an unclosed file_wrapper object is -destroyed. The destructor now closes the file if needed. The close() method -can now be called twice: the second call does nothing. - -.. - -.. bpo: 21858 -.. date: 8625 -.. nonce: 0hbFBG -.. section: Library - -Better handling of Python exceptions in the sqlite3 module. - -.. - -.. bpo: 21476 -.. date: 8624 -.. nonce: VN-5pW -.. section: Library - -Make sure the email.parser.BytesParser TextIOWrapper is discarded after -parsing, so the input file isn't unexpectedly closed. - -.. - -.. bpo: 20295 -.. date: 8623 -.. nonce: U1MPhw -.. section: Library - -imghdr now recognizes OpenEXR format images. - -.. - -.. bpo: 21729 -.. date: 8622 -.. nonce: dk7o_U -.. section: Library - -Used the "with" statement in the dbm.dumb module to ensure files closing. -Patch by Claudiu Popa. - -.. - -.. bpo: 21491 -.. date: 8621 -.. nonce: Zxmut- -.. section: Library - -socketserver: Fix a race condition in child processes reaping. - -.. - -.. bpo: 21719 -.. date: 8620 -.. nonce: DhQz3I -.. section: Library - -Added the ``st_file_attributes`` field to os.stat_result on Windows. - -.. - -.. bpo: 21832 -.. date: 8619 -.. nonce: PBA0Uu -.. section: Library - -Require named tuple inputs to be exact strings. - -.. - -.. bpo: 21722 -.. date: 8618 -.. nonce: WTHuRy -.. section: Library - -The distutils "upload" command now exits with a non-zero return code when -uploading fails. Patch by Martin Dengler. - -.. - -.. bpo: 21723 -.. date: 8617 -.. nonce: r86fwb -.. section: Library - -asyncio.Queue: support any type of number (ex: float) for the maximum size. -Patch written by Vajrasky Kok. - -.. - -.. bpo: 21711 -.. date: 8616 -.. nonce: JWPFQZ -.. section: Library - -support for "site-python" directories has now been removed from the site -module (it was deprecated in 3.4). - -.. - -.. bpo: 17552 -.. date: 8615 -.. nonce: NunErD -.. section: Library - -new socket.sendfile() method allowing a file to be sent over a socket by -using high-performance os.sendfile() on UNIX. Patch by Giampaolo Rodola'. - -.. - -.. bpo: 18039 -.. date: 8614 -.. nonce: vC9hNy -.. section: Library - -dbm.dump.open() now always creates a new database when the flag has the -value 'n'. Patch by Claudiu Popa. - -.. - -.. bpo: 21326 -.. date: 8613 -.. nonce: Y6iW3s -.. section: Library - -Add a new is_closed() method to asyncio.BaseEventLoop. run_forever() and -run_until_complete() methods of asyncio.BaseEventLoop now raise an exception -if the event loop was closed. - -.. - -.. bpo: 21766 -.. date: 8612 -.. nonce: 0xk_xC -.. section: Library - -Prevent a security hole in CGIHTTPServer by URL unquoting paths before -checking for a CGI script at that path. - -.. - -.. bpo: 21310 -.. date: 8611 -.. nonce: 2mjByJ -.. section: Library - -Fixed possible resource leak in failed open(). - -.. - -.. bpo: 21256 -.. date: 8610 -.. nonce: dGq6cw -.. section: Library - -Printout of keyword args should be in deterministic order in a mock function -call. This will help to write better doctests. - -.. - -.. bpo: 21677 -.. date: 8609 -.. nonce: 58CDDD -.. section: Library - -Fixed chaining nonnormalized exceptions in io close() methods. - -.. - -.. bpo: 11709 -.. date: 8608 -.. nonce: JdObvL -.. section: Library - -Fix the pydoc.help function to not fail when sys.stdin is not a valid file. - -.. - -.. bpo: 21515 -.. date: 8607 -.. nonce: D9TLJF -.. section: Library - -tempfile.TemporaryFile now uses os.O_TMPFILE flag is available. - -.. - -.. bpo: 13223 -.. date: 8606 -.. nonce: 9AzEbN -.. section: Library - -Fix pydoc.writedoc so that the HTML documentation for methods that use -'self' in the example code is generated correctly. - -.. - -.. bpo: 21463 -.. date: 8605 -.. nonce: 09PsgH -.. section: Library - -In urllib.request, fix pruning of the FTP cache. - -.. - -.. bpo: 21618 -.. date: 8604 -.. nonce: 3Z7WS3 -.. section: Library - -The subprocess module could fail to close open fds that were inherited by -the calling process and already higher than POSIX resource limits would -otherwise allow. On systems with a functioning /proc/self/fd or /dev/fd -interface the max is now ignored and all fds are closed. - -.. - -.. bpo: 20383 -.. date: 8603 -.. nonce: pSPFpW -.. section: Library - -Introduce importlib.util.module_from_spec() as the preferred way to create a -new module. - -.. - -.. bpo: 21552 -.. date: 8602 -.. nonce: uVy4tM -.. section: Library - -Fixed possible integer overflow of too long string lengths in the tkinter -module on 64-bit platforms. - -.. - -.. bpo: 14315 -.. date: 8601 -.. nonce: YzZzS8 -.. section: Library - -The zipfile module now ignores extra fields in the central directory that -are too short to be parsed instead of letting a struct.unpack error bubble -up as this "bad data" appears in many real world zip files in the wild and -is ignored by other zip tools. - -.. - -.. bpo: 13742 -.. date: 8600 -.. nonce: QJiVSC -.. section: Library - -Added "key" and "reverse" parameters to heapq.merge(). (First draft of patch -contributed by Simon Sapin.) - -.. - -.. bpo: 21402 -.. date: 8599 -.. nonce: 51vDXt -.. section: Library - -tkinter.ttk now works when default root window is not set. - -.. - -.. bpo: 3015 -.. date: 8598 -.. nonce: FE_PII -.. section: Library - -_tkinter.create() now creates tkapp object with wantobject=1 by default. - -.. - -.. bpo: 10203 -.. date: 8597 -.. nonce: zgr0hh -.. section: Library - -sqlite3.Row now truly supports sequence protocol. In particular it supports -reverse() and negative indices. Original patch by Claudiu Popa. - -.. - -.. bpo: 18807 -.. date: 8596 -.. nonce: XP7p8B -.. section: Library - -If copying (no symlinks) specified for a venv, then the python interpreter -aliases (python, python3) are now created by copying rather than symlinking. - -.. - -.. bpo: 20197 -.. date: 8595 -.. nonce: nYR9fq -.. section: Library - -Added support for the WebP image type in the imghdr module. Patch by Fabrice -Aneche and Claudiu Popa. - -.. - -.. bpo: 21513 -.. date: 8594 -.. nonce: ro4AOe -.. section: Library - -Speedup some properties of IP addresses (IPv4Address, IPv6Address) such as -.is_private or .is_multicast. - -.. - -.. bpo: 21137 -.. date: 8593 -.. nonce: wgHb_F -.. section: Library - -Improve the repr for threading.Lock() and its variants by showing the -"locked" or "unlocked" status. Patch by Berker Peksag. - -.. - -.. bpo: 21538 -.. date: 8592 -.. nonce: Q60FWA -.. section: Library - -The plistlib module now supports loading of binary plist files when -reference or offset size is not a power of two. - -.. - -.. bpo: 21455 -.. date: 8591 -.. nonce: 6-Uvv4 -.. section: Library - -Add a default backlog to socket.listen(). - -.. - -.. bpo: 21525 -.. date: 8590 -.. nonce: hAKOve -.. section: Library - -Most Tkinter methods which accepted tuples now accept lists too. - -.. - -.. bpo: 22166 -.. date: 8589 -.. nonce: sZYhmv -.. section: Library - -With the assistance of a new internal _codecs._forget_codec helping -function, test_codecs now clears the encoding caches to avoid the appearance -of a reference leak - -.. - -.. bpo: 22236 -.. date: 8588 -.. nonce: ginJSI -.. section: Library - -Tkinter tests now don't reuse default root window. New root window is -created for every test class. - -.. - -.. bpo: 10744 -.. date: 8587 -.. nonce: kfV0wm -.. section: Library - -Fix :pep:`3118` format strings on ctypes objects with a nontrivial shape. - -.. - -.. bpo: 20826 -.. date: 8586 -.. nonce: 3rXqMC -.. section: Library - -Optimize ipaddress.collapse_addresses(). - -.. - -.. bpo: 21487 -.. date: 8585 -.. nonce: sX8YmK -.. section: Library - -Optimize ipaddress.summarize_address_range() and -ipaddress.{IPv4Network,IPv6Network}.subnets(). - -.. - -.. bpo: 21486 -.. date: 8584 -.. nonce: CeFKRP -.. section: Library - -Optimize parsing of netmasks in ipaddress.IPv4Network and -ipaddress.IPv6Network. - -.. - -.. bpo: 13916 -.. date: 8583 -.. nonce: D77YVH -.. section: Library - -Disallowed the surrogatepass error handler for non UTF-\* encodings. - -.. - -.. bpo: 20998 -.. date: 8582 -.. nonce: fkxpXI -.. section: Library - -Fixed re.fullmatch() of repeated single character pattern with ignore case. -Original patch by Matthew Barnett. - -.. - -.. bpo: 21075 -.. date: 8581 -.. nonce: f_hmEh -.. section: Library - -fileinput.FileInput now reads bytes from standard stream if binary mode is -specified. Patch by Sam Kimbrel. - -.. - -.. bpo: 19775 -.. date: 8580 -.. nonce: yxxD_R -.. section: Library - -Add a samefile() method to pathlib Path objects. Initial patch by Vajrasky -Kok. - -.. - -.. bpo: 21226 -.. date: 8579 -.. nonce: pzGmG1 -.. section: Library - -Set up modules properly in PyImport_ExecCodeModuleObject (and friends). - -.. - -.. bpo: 21398 -.. date: 8578 -.. nonce: guSBXt -.. section: Library - -Fix a unicode error in the pydoc pager when the documentation contains -characters not encodable to the stdout encoding. - -.. - -.. bpo: 16531 -.. date: 8577 -.. nonce: AhrY_v -.. section: Library - -ipaddress.IPv4Network and ipaddress.IPv6Network now accept an (address, -netmask) tuple argument, so as to easily construct network objects from -existing addresses. - -.. - -.. bpo: 21156 -.. date: 8576 -.. nonce: 3dmBEp -.. section: Library - -importlib.abc.InspectLoader.source_to_code() is now a staticmethod. - -.. - -.. bpo: 21424 -.. date: 8575 -.. nonce: 8CJBqW -.. section: Library - -Simplified and optimized heaqp.nlargest() and nmsmallest() to make fewer -tuple comparisons. - -.. - -.. bpo: 21396 -.. date: 8574 -.. nonce: cqO6DN -.. section: Library - -Fix TextIOWrapper(..., write_through=True) to not force a flush() on the -underlying binary stream. Patch by akira. - -.. - -.. bpo: 18314 -.. date: 8573 -.. nonce: NCd_KF -.. section: Library - -Unlink now removes junctions on Windows. Patch by Kim Gräsman - -.. - -.. bpo: 21088 -.. date: 8572 -.. nonce: WOg7Xy -.. section: Library - -Bugfix for curses.window.addch() regression in 3.4.0. In porting to Argument -Clinic, the first two arguments were reversed. - -.. - -.. bpo: 21407 -.. date: 8571 -.. nonce: cZjFde -.. section: Library - -_decimal: The module now supports function signatures. - -.. - -.. bpo: 10650 -.. date: 8570 -.. nonce: HYT4Oe -.. section: Library - -Remove the non-standard 'watchexp' parameter from the Decimal.quantize() -method in the Python version. It had never been present in the C version. - -.. - -.. bpo: 21469 -.. date: 8569 -.. nonce: _fFGuq -.. section: Library - -Reduced the risk of false positives in robotparser by checking to make sure -that robots.txt has been read or does not exist prior to returning True in -can_fetch(). - -.. - -.. bpo: 19414 -.. date: 8568 -.. nonce: bAAw4D -.. section: Library - -Have the OrderedDict mark deleted links as unusable. This gives an early -failure if the link is deleted during iteration. - -.. - -.. bpo: 21421 -.. date: 8567 -.. nonce: 5AKAat -.. section: Library - -Add __slots__ to the MappingViews ABC. Patch by Josh Rosenberg. - -.. - -.. bpo: 21101 -.. date: 8566 -.. nonce: Lj-_P4 -.. section: Library - -Eliminate double hashing in the C speed-up code for collections.Counter(). - -.. - -.. bpo: 21321 -.. date: 8565 -.. nonce: wUkTON -.. section: Library - -itertools.islice() now releases the reference to the source iterator when -the slice is exhausted. Patch by Anton Afanasyev. - -.. - -.. bpo: 21057 -.. date: 8564 -.. nonce: 0TC4Xl -.. section: Library - -TextIOWrapper now allows the underlying binary stream's read() or read1() -method to return an arbitrary bytes-like object (such as a memoryview). -Patch by Nikolaus Rath. - -.. - -.. bpo: 20951 -.. date: 8563 -.. nonce: tF0dJi -.. section: Library - -SSLSocket.send() now raises either SSLWantReadError or SSLWantWriteError on -a non-blocking socket if the operation would block. Previously, it would -return 0. Patch by Nikolaus Rath. - -.. - -.. bpo: 13248 -.. date: 8562 -.. nonce: 7vtGj0 -.. section: Library - -removed previously deprecated asyncore.dispatcher __getattr__ cheap -inheritance hack. - -.. - -.. bpo: 9815 -.. date: 8561 -.. nonce: 52FPlI -.. section: Library - -assertRaises now tries to clear references to local variables in the -exception's traceback. - -.. - -.. bpo: 19940 -.. date: 8560 -.. nonce: 2qtBQ8 -.. section: Library - -ssl.cert_time_to_seconds() now interprets the given time string in the UTC -timezone (as specified in RFC 5280), not the local timezone. - -.. - -.. bpo: 13204 -.. date: 8559 -.. nonce: ZPKA5g -.. section: Library - -Calling sys.flags.__new__ would crash the interpreter, now it raises a -TypeError. - -.. - -.. bpo: 19385 -.. date: 8558 -.. nonce: PexO_g -.. section: Library - -Make operations on a closed dbm.dumb database always raise the same -exception. - -.. - -.. bpo: 21207 -.. date: 8557 -.. nonce: Hr72AB -.. section: Library - -Detect when the os.urandom cached fd has been closed or replaced, and open -it anew. - -.. - -.. bpo: 21291 -.. date: 8556 -.. nonce: 5sSLWN -.. section: Library - -subprocess's Popen.wait() is now thread safe so that multiple threads may be -calling wait() or poll() on a Popen instance at the same time without losing -the Popen.returncode value. - -.. - -.. bpo: 21127 -.. date: 8555 -.. nonce: A1aBjG -.. section: Library - -Path objects can now be instantiated from str subclass instances (such as -``numpy.str_``). - -.. - -.. bpo: 15002 -.. date: 8554 -.. nonce: qorYDe -.. section: Library - -urllib.response object to use _TemporaryFileWrapper (and -_TemporaryFileCloser) facility. Provides a better way to handle file -descriptor close. Patch contributed by Christian Theune. - -.. - -.. bpo: 12220 -.. date: 8553 -.. nonce: U25uE9 -.. section: Library - -mindom now raises a custom ValueError indicating it doesn't support spaces -in URIs instead of letting a 'split' ValueError bubble up. - -.. - -.. bpo: 21068 -.. date: 8552 -.. nonce: 9k6N9m -.. section: Library - -The ssl.PROTOCOL* constants are now enum members. - -.. - -.. bpo: 21276 -.. date: 8551 -.. nonce: JkfhvQ -.. section: Library - -posixmodule: Don't define USE_XATTRS on KFreeBSD and the Hurd. - -.. - -.. bpo: 21262 -.. date: 8550 -.. nonce: 1J5ylk -.. section: Library - -New method assert_not_called for Mock. It raises AssertionError if the mock -has been called. - -.. - -.. bpo: 21238 -.. date: 8549 -.. nonce: 5CDoox -.. section: Library - -New keyword argument `unsafe` to Mock. It raises `AttributeError` incase of -an attribute startswith assert or assret. - -.. - -.. bpo: 20896 -.. date: 8548 -.. nonce: oWwAb1 -.. section: Library - -ssl.get_server_certificate() now uses PROTOCOL_SSLv23, not PROTOCOL_SSLv3, -for maximum compatibility. - -.. - -.. bpo: 21239 -.. date: 8547 -.. nonce: EalCNt -.. section: Library - -patch.stopall() didn't work deterministically when the same name was patched -more than once. - -.. - -.. bpo: 21203 -.. date: 8546 -.. nonce: 1IMs-Z -.. section: Library - -Updated fileConfig and dictConfig to remove inconsistencies. Thanks to Jure -Koren for the patch. - -.. - -.. bpo: 21222 -.. date: 8545 -.. nonce: G6MQBP -.. section: Library - -Passing name keyword argument to mock.create_autospec now works. - -.. - -.. bpo: 21197 -.. date: 8544 -.. nonce: Gzfqdl -.. section: Library - -Add lib64 -> lib symlink in venvs on 64-bit non-OS X POSIX. - -.. - -.. bpo: 17498 -.. date: 8543 -.. nonce: LR9xyb -.. section: Library - -Some SMTP servers disconnect after certain errors, violating strict RFC -conformance. Instead of losing the error code when we issue the subsequent -RSET, smtplib now returns the error code and defers raising the -SMTPServerDisconnected error until the next command is issued. - -.. - -.. bpo: 17826 -.. date: 8542 -.. nonce: z0zMRV -.. section: Library - -setting an iterable side_effect on a mock function created by -create_autospec now works. Patch by Kushal Das. - -.. - -.. bpo: 7776 -.. date: 8541 -.. nonce: K5S2Pe -.. section: Library - -Fix ``Host:`` header and reconnection when using -http.client.HTTPConnection.set_tunnel(). Patch by Nikolaus Rath. - -.. - -.. bpo: 20968 -.. date: 8540 -.. nonce: 53Aagz -.. section: Library - -unittest.mock.MagicMock now supports division. Patch by Johannes Baiter. - -.. - -.. bpo: 21529 -.. date: 8539 -.. nonce: 57R_Fc -.. section: Library - -Fix arbitrary memory access in JSONDecoder.raw_decode with a negative second -parameter. Bug reported by Guido Vranken. (See also: CVE-2014-4616) - -.. - -.. bpo: 21169 -.. date: 8538 -.. nonce: KE7B0M -.. section: Library - -getpass now handles non-ascii characters that the input stream encoding -cannot encode by re-encoding using the replace error handler. - -.. - -.. bpo: 21171 -.. date: 8537 -.. nonce: iUbV9S -.. section: Library - -Fixed undocumented filter API of the rot13 codec. Patch by Berker Peksag. - -.. - -.. bpo: 20539 -.. date: 8536 -.. nonce: 62nbEb -.. section: Library - -Improved math.factorial error message for large positive inputs and changed -exception type (OverflowError -> ValueError) for large negative inputs. - -.. - -.. bpo: 21172 -.. date: 8535 -.. nonce: dQ7yY7 -.. section: Library - -isinstance check relaxed from dict to collections.Mapping. - -.. - -.. bpo: 21155 -.. date: 8534 -.. nonce: JSKEE7 -.. section: Library - -asyncio.EventLoop.create_unix_server() now raises a ValueError if path and -sock are specified at the same time. - -.. - -.. bpo: 21136 -.. date: 8533 -.. nonce: JZAKv3 -.. section: Library - -Avoid unnecessary normalization of Fractions resulting from power and other -operations. Patch by Raymond Hettinger. - -.. - -.. bpo: 17621 -.. date: 8532 -.. nonce: 1x0mvJ -.. section: Library - -Introduce importlib.util.LazyLoader. - -.. - -.. bpo: 21076 -.. date: 8531 -.. nonce: upxQc6 -.. section: Library - -signal module constants were turned into enums. Patch by Giampaolo Rodola'. - -.. - -.. bpo: 20636 -.. date: 8530 -.. nonce: KGh-BD -.. section: Library - -Improved the repr of Tkinter widgets. - -.. - -.. bpo: 19505 -.. date: 8529 -.. nonce: VEtIE6 -.. section: Library - -The items, keys, and values views of OrderedDict now support reverse -iteration using reversed(). - -.. - -.. bpo: 21149 -.. date: 8528 -.. nonce: cnjwMR -.. section: Library - -Improved thread-safety in logging cleanup during interpreter shutdown. -Thanks to Devin Jeanpierre for the patch. - -.. - -.. bpo: 21058 -.. date: 8527 -.. nonce: IhluPP -.. section: Library - -Fix a leak of file descriptor in :func:`tempfile.NamedTemporaryFile`, close -the file descriptor if :func:`io.open` fails - -.. - -.. bpo: 21200 -.. date: 8526 -.. nonce: Kht8yD -.. section: Library - -Return None from pkgutil.get_loader() when __spec__ is missing. - -.. - -.. bpo: 21013 -.. date: 8525 -.. nonce: 3s8Ic0 -.. section: Library - -Enhance ssl.create_default_context() when used for server side sockets to -provide better security by default. - -.. - -.. bpo: 20145 -.. date: 8524 -.. nonce: FP5FY0 -.. section: Library - -`assertRaisesRegex` and `assertWarnsRegex` now raise a TypeError if the -second argument is not a string or compiled regex. - -.. - -.. bpo: 20633 -.. date: 8523 -.. nonce: 6kaPjT -.. section: Library - -Replace relative import by absolute import. - -.. - -.. bpo: 20980 -.. date: 8522 -.. nonce: cYszHY -.. section: Library - -Stop wrapping exception when using ThreadPool. - -.. - -.. bpo: 21082 -.. date: 8521 -.. nonce: GLzGlV -.. section: Library - -In os.makedirs, do not set the process-wide umask. Note this changes -behavior of makedirs when exist_ok=True. - -.. - -.. bpo: 20990 -.. date: 8520 -.. nonce: PBfjW3 -.. section: Library - -Fix issues found by pyflakes for multiprocessing. - -.. - -.. bpo: 21015 -.. date: 8519 -.. nonce: xnwWAH -.. section: Library - -SSL contexts will now automatically select an elliptic curve for ECDH key -exchange on OpenSSL 1.0.2 and later, and otherwise default to "prime256v1". - -.. - -.. bpo: 21000 -.. date: 8518 -.. nonce: JUyyVV -.. section: Library - -Improve the command-line interface of json.tool. - -.. - -.. bpo: 20995 -.. date: 8517 -.. nonce: KSORJT -.. section: Library - -Enhance default ciphers used by the ssl module to enable better security and -prioritize perfect forward secrecy. - -.. - -.. bpo: 20884 -.. date: 8516 -.. nonce: qNmub_ -.. section: Library - -Don't assume that __file__ is defined on importlib.__init__. - -.. - -.. bpo: 21499 -.. date: 8515 -.. nonce: wU4OBi -.. section: Library - -Ignore __builtins__ in several test_importlib.test_api tests. - -.. - -.. bpo: 20627 -.. date: 8514 -.. nonce: fgfQ1x -.. section: Library - -xmlrpc.client.ServerProxy is now a context manager. - -.. - -.. bpo: 19165 -.. date: 8513 -.. nonce: sAkUjU -.. section: Library - -The formatter module now raises DeprecationWarning instead of -PendingDeprecationWarning. - -.. - -.. bpo: 13936 -.. date: 8512 -.. nonce: _Q0Yog -.. section: Library - -Remove the ability of datetime.time instances to be considered false in -boolean contexts. - -.. - -.. bpo: 18931 -.. date: 8511 -.. nonce: mq4Mud -.. section: Library - -selectors module now supports /dev/poll on Solaris. Patch by Giampaolo -Rodola'. - -.. - -.. bpo: 19977 -.. date: 8510 -.. nonce: A-sQ_V -.. section: Library - -When the ``LC_TYPE`` locale is the POSIX locale (``C`` locale), -:py:data:`sys.stdin` and :py:data:`sys.stdout` are now using the -``surrogateescape`` error handler, instead of the ``strict`` error handler. - -.. - -.. bpo: 20574 -.. date: 8509 -.. nonce: KaKqSs -.. section: Library - -Implement incremental decoder for cp65001 code (Windows code page 65001, -Microsoft UTF-8). - -.. - -.. bpo: 20879 -.. date: 8508 -.. nonce: myeYdq -.. section: Library - -Delay the initialization of encoding and decoding tables for base32, ascii85 -and base85 codecs in the base64 module, and delay the initialization of the -unquote_to_bytes() table of the urllib.parse module, to not waste memory if -these modules are not used. - -.. - -.. bpo: 19157 -.. date: 8507 -.. nonce: V1-XhC -.. section: Library - -Include the broadcast address in the usuable hosts for IPv6 in ipaddress. - -.. - -.. bpo: 11599 -.. date: 8506 -.. nonce: 9QOXf4 -.. section: Library - -When an external command (e.g. compiler) fails, distutils now prints out the -whole command line (instead of just the command name) if the environment -variable DISTUTILS_DEBUG is set. - -.. - -.. bpo: 4931 -.. date: 8505 -.. nonce: uF10hr -.. section: Library - -distutils should not produce unhelpful "error: None" messages anymore. -distutils.util.grok_environment_error is kept but doc-deprecated. - -.. - -.. bpo: 20875 -.. date: 8504 -.. nonce: IjfI5V -.. section: Library - -Prevent possible gzip "'read' is not defined" NameError. Patch by Claudiu -Popa. - -.. - -.. bpo: 11558 -.. date: 8503 -.. nonce: pxrsmq -.. section: Library - -``email.message.Message.attach`` now returns a more useful error message if -``attach`` is called on a message for which ``is_multipart`` is False. - -.. - -.. bpo: 20283 -.. date: 8502 -.. nonce: v0Vs9V -.. section: Library - -RE pattern methods now accept the string keyword parameters as documented. -The pattern and source keyword parameters are left as deprecated aliases. - -.. - -.. bpo: 20778 -.. date: 8501 -.. nonce: g_fAGI -.. section: Library - -Fix modulefinder to work with bytecode-only modules. - -.. - -.. bpo: 20791 -.. date: 8500 -.. nonce: n_zrkc -.. section: Library - -copy.copy() now doesn't make a copy when the input is a bytes object. -Initial patch by Peter Otten. - -.. - -.. bpo: 19748 -.. date: 8499 -.. nonce: kiA171 -.. section: Library - -On AIX, time.mktime() now raises an OverflowError for year outsize range -[1902; 2037]. - -.. - -.. bpo: 19573 -.. date: 8498 -.. nonce: QJvX_V -.. section: Library - -inspect.signature: Use enum for parameter kind constants. - -.. - -.. bpo: 20726 -.. date: 8497 -.. nonce: 0yfRDI -.. section: Library - -inspect.signature: Make Signature and Parameter picklable. - -.. - -.. bpo: 17373 -.. date: 8496 -.. nonce: ECwuJO -.. section: Library - -Add inspect.Signature.from_callable method. - -.. - -.. bpo: 20378 -.. date: 8495 -.. nonce: l9M3H- -.. section: Library - -Improve repr of inspect.Signature and inspect.Parameter. - -.. - -.. bpo: 20816 -.. date: 8494 -.. nonce: DFMEgN -.. section: Library - -Fix inspect.getcallargs() to raise correct TypeError for missing -keyword-only arguments. Patch by Jeremiah Lowin. - -.. - -.. bpo: 20817 -.. date: 8493 -.. nonce: O5XyZB -.. section: Library - -Fix inspect.getcallargs() to fail correctly if more than 3 arguments are -missing. Patch by Jeremiah Lowin. - -.. - -.. bpo: 6676 -.. date: 8492 -.. nonce: CJu5On -.. section: Library - -Ensure a meaningful exception is raised when attempting to parse more than -one XML document per pyexpat xmlparser instance. (Original patches by -Hirokazu Yamamoto and Amaury Forgeot d'Arc, with suggested wording by David -Gutteridge) - -.. - -.. bpo: 21117 -.. date: 8491 -.. nonce: hyH7EK -.. section: Library - -Fix inspect.signature to better support functools.partial. Due to the -specifics of functools.partial implementation, positional-or-keyword -arguments passed as keyword arguments become keyword-only. - -.. - -.. bpo: 20334 -.. date: 8490 -.. nonce: 0yFmfQ -.. section: Library - -inspect.Signature and inspect.Parameter are now hashable. Thanks to Antony -Lee for bug reports and suggestions. - -.. - -.. bpo: 15916 -.. date: 8489 -.. nonce: _vhKPn -.. section: Library - -doctest.DocTestSuite returns an empty unittest.TestSuite instead of raising -ValueError if it finds no tests - -.. - -.. bpo: 21209 -.. date: 8488 -.. nonce: wRE7Dn -.. section: Library - -Fix asyncio.tasks.CoroWrapper to workaround a bug in yield-from -implementation in CPythons prior to 3.4.1. - -.. - -.. bpo: 0 -.. date: 8487 -.. nonce: Q1I78Z -.. section: Library - -asyncio: Add gi_{frame,running,code} properties to CoroWrapper (upstream -issue #163). - -.. - -.. bpo: 21311 -.. date: 8486 -.. nonce: JsDF8H -.. section: Library - -Avoid exception in _osx_support with non-standard compiler configurations. -Patch by John Szakmeister. - -.. - -.. bpo: 11571 -.. date: 8485 -.. nonce: RPeGNo -.. section: Library - -Ensure that the turtle window becomes the topmost window when launched on OS -X. - -.. - -.. bpo: 21801 -.. date: 8484 -.. nonce: rzfhYl -.. section: Library - -Validate that __signature__ is None or an instance of Signature. - -.. - -.. bpo: 21923 -.. date: 8483 -.. nonce: hXnoZa -.. section: Library - -Prevent AttributeError in distutils.sysconfig.customize_compiler due to -possible uninitialized _config_vars. - -.. - -.. bpo: 21323 -.. date: 8482 -.. nonce: quiWfl -.. section: Library - -Fix http.server to again handle scripts in CGI subdirectories, broken by the -fix for security issue #19435. Patch by Zach Byrne. - -.. - -.. bpo: 22733 -.. date: 8481 -.. nonce: 21gJBp -.. section: Library - -Fix ffi_prep_args not zero-extending argument values correctly on 64-bit -Windows. - -.. - -.. bpo: 23302 -.. date: 8480 -.. nonce: X2dabK -.. section: Library - -Default to TCP_NODELAY=1 upon establishing an HTTPConnection. Removed use of -hard-coded MSS as it's an optimization that's no longer needed with Nagle -disabled. - -.. - -.. bpo: 20577 -.. date: 8479 -.. nonce: Y71IMj -.. section: IDLE - -Configuration of the max line length for the FormatParagraph extension has -been moved from the General tab of the Idle preferences dialog to the -FormatParagraph tab of the Config Extensions dialog. Patch by Tal Einat. - -.. - -.. bpo: 16893 -.. date: 8478 -.. nonce: JfHAA4 -.. section: IDLE - -Update Idle doc chapter to match current Idle and add new information. - -.. - -.. bpo: 3068 -.. date: 8477 -.. nonce: TYjXTA -.. section: IDLE - -Add Idle extension configuration dialog to Options menu. Changes are written -to HOME/.idlerc/config-extensions.cfg. Original patch by Tal Einat. - -.. - -.. bpo: 16233 -.. date: 8476 -.. nonce: sOadNo -.. section: IDLE - -A module browser (File : Class Browser, Alt+C) requires an editor window -with a filename. When Class Browser is requested otherwise, from a shell, -output window, or 'Untitled' editor, Idle no longer displays an error box. -It now pops up an Open Module box (Alt+M). If a valid name is entered and a -module is opened, a corresponding browser is also opened. - -.. - -.. bpo: 4832 -.. date: 8475 -.. nonce: GRKi9M -.. section: IDLE - -Save As to type Python files automatically adds .py to the name you enter -(even if your system does not display it). Some systems automatically add -.txt when type is Text files. - -.. - -.. bpo: 21986 -.. date: 8474 -.. nonce: 04GUv2 -.. section: IDLE - -Code objects are not normally pickled by the pickle module. To match this, -they are no longer pickled when running under Idle. - -.. - -.. bpo: 17390 -.. date: 8473 -.. nonce: I4vHFh -.. section: IDLE - -Adjust Editor window title; remove 'Python', move version to end. - -.. - -.. bpo: 14105 -.. date: 8472 -.. nonce: -FZwYH -.. section: IDLE - -Idle debugger breakpoints no longer disappear when inserting or deleting -lines. - -.. - -.. bpo: 17172 -.. date: 8471 -.. nonce: R8jkU1 -.. section: IDLE - -Turtledemo can now be run from Idle. Currently, the entry is on the Help -menu, but it may move to Run. Patch by Ramchandra Apt and Lita Cho. - -.. - -.. bpo: 21765 -.. date: 8470 -.. nonce: JyiDbd -.. section: IDLE - -Add support for non-ascii identifiers to HyperParser. - -.. - -.. bpo: 21940 -.. date: 8469 -.. nonce: VlIRz7 -.. section: IDLE - -Add unittest for WidgetRedirector. Initial patch by Saimadhav Heblikar. - -.. - -.. bpo: 18592 -.. date: 8468 -.. nonce: sMG-SZ -.. section: IDLE - -Add unittest for SearchDialogBase. Patch by Phil Webster. - -.. - -.. bpo: 21694 -.. date: 8467 -.. nonce: 1oLmRo -.. section: IDLE - -Add unittest for ParenMatch. Patch by Saimadhav Heblikar. - -.. - -.. bpo: 21686 -.. date: 8466 -.. nonce: TAkFB0 -.. section: IDLE - -add unittest for HyperParser. Original patch by Saimadhav Heblikar. - -.. - -.. bpo: 12387 -.. date: 8465 -.. nonce: XO7Ozk -.. section: IDLE - -Add missing upper(lower)case versions of default Windows key bindings for -Idle so Caps Lock does not disable them. Patch by Roger Serwy. - -.. - -.. bpo: 21695 -.. date: 8464 -.. nonce: g-t0Tm -.. section: IDLE - -Closing a Find-in-files output window while the search is still in progress -no longer closes Idle. - -.. - -.. bpo: 18910 -.. date: 8463 -.. nonce: ke8lMK -.. section: IDLE - -Add unittest for textView. Patch by Phil Webster. - -.. - -.. bpo: 18292 -.. date: 8462 -.. nonce: ks_3wm -.. section: IDLE - -Add unittest for AutoExpand. Patch by Saihadhav Heblikar. - -.. - -.. bpo: 18409 -.. date: 8461 -.. nonce: 7fe-aK -.. section: IDLE - -Add unittest for AutoComplete. Patch by Phil Webster. - -.. - -.. bpo: 21477 -.. date: 8460 -.. nonce: 33NOe0 -.. section: IDLE - -htest.py - Improve framework, complete set of tests. Patches by Saimadhav -Heblikar - -.. - -.. bpo: 18104 -.. date: 8459 -.. nonce: 8Fj9Pf -.. section: IDLE - -Add idlelib/idle_test/htest.py with a few sample tests to begin -consolidating and improving human-validated tests of Idle. Change other -files as needed to work with htest. Running the module as __main__ runs all -tests. - -.. - -.. bpo: 21139 -.. date: 8458 -.. nonce: kqetng -.. section: IDLE - -Change default paragraph width to 72, the :pep:`8` recommendation. - -.. - -.. bpo: 21284 -.. date: 8457 -.. nonce: KKJfmv -.. section: IDLE - -Paragraph reformat test passes after user changes reformat width. - -.. - -.. bpo: 17654 -.. date: 8456 -.. nonce: NbzhNS -.. section: IDLE - -Ensure IDLE menus are customized properly on OS X for non-framework builds -and for all variants of Tk. - -.. - -.. bpo: 23180 -.. date: 8455 -.. nonce: cE_89F -.. section: IDLE - -Rename IDLE "Windows" menu item to "Window". Patch by Al Sweigart. - -.. - -.. bpo: 15506 -.. date: 8454 -.. nonce: nh8KlR -.. section: Build - -Use standard PKG_PROG_PKG_CONFIG autoconf macro in the configure script. - -.. - -.. bpo: 22935 -.. date: 8453 -.. nonce: -vY3lc -.. section: Build - -Allow the ssl module to be compiled if openssl doesn't support SSL 3. - -.. - -.. bpo: 22592 -.. date: 8452 -.. nonce: O_IE9W -.. section: Build - -Drop support of the Borland C compiler to build Python. The distutils module -still supports it to build extensions. - -.. - -.. bpo: 22591 -.. date: 8451 -.. nonce: wwBlG8 -.. section: Build - -Drop support of MS-DOS, especially of the DJGPP compiler (MS-DOS port of -GCC). - -.. - -.. bpo: 16537 -.. date: 8450 -.. nonce: llFo71 -.. section: Build - -Check whether self.extensions is empty in setup.py. Patch by Jonathan -Hosmer. - -.. - -.. bpo: 22359 -.. date: 8449 -.. nonce: YYFOFG -.. section: Build - -Remove incorrect uses of recursive make. Patch by Jonas Wagner. - -.. - -.. bpo: 21958 -.. date: 8448 -.. nonce: 3rq4qR -.. section: Build - -Define HAVE_ROUND when building with Visual Studio 2013 and above. Patch by -Zachary Turner. - -.. - -.. bpo: 18093 -.. date: 8447 -.. nonce: gnZieo -.. section: Build - -the programs that embed the CPython runtime are now in a separate "Programs" -directory, rather than being kept in the Modules directory. - -.. - -.. bpo: 15759 -.. date: 8446 -.. nonce: iGLR6O -.. section: Build - -"make suspicious", "make linkcheck" and "make doctest" in Doc/ now display -special message when and only when there are failures. - -.. - -.. bpo: 21141 -.. date: 8445 -.. nonce: 669LzK -.. section: Build - -The Windows build process no longer attempts to find Perl, instead relying -on OpenSSL source being configured and ready to build. The -``PCbuild\build_ssl.py`` script has been re-written and re-named to -``PCbuild\prepare_ssl.py``, and takes care of configuring OpenSSL source for -both 32 and 64 bit platforms. OpenSSL sources obtained from svn.python.org -will always be pre-configured and ready to build. - -.. - -.. bpo: 21037 -.. date: 8444 -.. nonce: v1rZzo -.. section: Build - -Add a build option to enable AddressSanitizer support. - -.. - -.. bpo: 19962 -.. date: 8443 -.. nonce: HDlwsE -.. section: Build - -The Windows build process now creates "python.bat" in the root of the source -tree, which passes all arguments through to the most recently built -interpreter. - -.. - -.. bpo: 21285 -.. date: 8442 -.. nonce: cU9p2E -.. section: Build - -Refactor and fix curses configure check to always search in a ncursesw -directory. - -.. - -.. bpo: 15234 -.. date: 8441 -.. nonce: vlM720 -.. section: Build - -For BerkelyDB and Sqlite, only add the found library and include directories -if they aren't already being searched. This avoids an explicit runtime -library dependency. - -.. - -.. bpo: 17861 -.. date: 8440 -.. nonce: jCi44U -.. section: Build - -Tools/scripts/generate_opcode_h.py automatically regenerates -Include/opcode.h from Lib/opcode.py if the latter gets any change. - -.. - -.. bpo: 20644 -.. date: 8439 -.. nonce: aV0zq7 -.. section: Build - -OS X installer build support for documentation build changes in 3.4.1: -assume externally supplied sphinx-build is available in /usr/bin. - -.. - -.. bpo: 20022 -.. date: 8438 -.. nonce: EqSCTW -.. section: Build - -Eliminate use of deprecated bundlebuilder in OS X builds. - -.. - -.. bpo: 15968 -.. date: 8437 -.. nonce: vxUxHK -.. section: Build - -Incorporated Tcl, Tk, and Tix builds into the Windows build solution. - -.. - -.. bpo: 17095 -.. date: 8436 -.. nonce: -XEBIU -.. section: Build - -Fix Modules/Setup *shared* support. - -.. - -.. bpo: 21811 -.. date: 8435 -.. nonce: 3_Xyr- -.. section: Build - -Anticipated fixes to support OS X versions > 10.9. - -.. - -.. bpo: 21166 -.. date: 8434 -.. nonce: KAl7aO -.. section: Build - -Prevent possible segfaults and other random failures of python ---generate-posix-vars in pybuilddir.txt build target. - -.. - -.. bpo: 18096 -.. date: 8433 -.. nonce: ELyAUJ -.. section: Build - -Fix library order returned by python-config. - -.. - -.. bpo: 17219 -.. date: 8432 -.. nonce: q8ueQ0 -.. section: Build - -Add library build dir for Python extension cross-builds. - -.. - -.. bpo: 22919 -.. date: 8431 -.. nonce: 1XThL9 -.. section: Build - -Windows build updated to support VC 14.0 (Visual Studio 2015), which will be -used for the official release. - -.. - -.. bpo: 21236 -.. date: 8430 -.. nonce: 84LXxj -.. section: Build - -Build _msi.pyd with cabinet.lib instead of fci.lib - -.. - -.. bpo: 17128 -.. date: 8429 -.. nonce: U2biLA -.. section: Build - -Use private version of OpenSSL for OS X 10.5+ installer. - -.. - -.. bpo: 14203 -.. date: 8428 -.. nonce: 3hv0TX -.. section: C API - -Remove obsolete support for view==NULL in PyBuffer_FillInfo(), -bytearray_getbuffer(), bytesiobuf_getbuffer() and array_buffer_getbuf(). All -functions now raise BufferError in that case. - -.. - -.. bpo: 22445 -.. date: 8427 -.. nonce: s0AOAS -.. section: C API - -PyBuffer_IsContiguous() now implements precise contiguity tests, compatible -with NumPy's NPY_RELAXED_STRIDES_CHECKING compilation flag. Previously the -function reported false negatives for corner cases. - -.. - -.. bpo: 22079 -.. date: 8426 -.. nonce: zhs2qM -.. section: C API - -PyType_Ready() now checks that statically allocated type has no dynamically -allocated bases. - -.. - -.. bpo: 22453 -.. date: 8425 -.. nonce: XoO4ns -.. section: C API - -Removed non-documented macro PyObject_REPR(). - -.. - -.. bpo: 18395 -.. date: 8424 -.. nonce: YC9B06 -.. section: C API - -Rename ``_Py_char2wchar()`` to :c:func:`Py_DecodeLocale`, rename -``_Py_wchar2char()`` to :c:func:`Py_EncodeLocale`, and document these -functions. - -.. - -.. bpo: 21233 -.. date: 8423 -.. nonce: 98hZAt -.. section: C API - -Add new C functions: PyMem_RawCalloc(), PyMem_Calloc(), PyObject_Calloc(), -_PyObject_GC_Calloc(). bytes(int) is now using ``calloc()`` instead of -``malloc()`` for large objects which is faster and use less memory. - -.. - -.. bpo: 20942 -.. date: 8422 -.. nonce: qHLJ5- -.. section: C API - -PyImport_ImportFrozenModuleObject() no longer sets __file__ to match what -importlib does; this affects _frozen_importlib as well as any module loaded -using imp.init_frozen(). - -.. - -.. bpo: 19548 -.. date: 8421 -.. nonce: yOX8sS -.. section: Documentation - -Update the codecs module documentation to better cover the distinction -between text encodings and other codecs, together with other clarifications. -Patch by Martin Panter. - -.. - -.. bpo: 22394 -.. date: 8420 -.. nonce: 6bJywY -.. section: Documentation - -Doc/Makefile now supports ``make venv PYTHON=../python`` to create a venv -for generating the documentation, e.g., ``make html -PYTHON=venv/bin/python3``. - -.. - -.. bpo: 21514 -.. date: 8419 -.. nonce: 1H16T6 -.. section: Documentation - -The documentation of the json module now refers to new JSON RFC 7159 instead -of obsoleted RFC 4627. - -.. - -.. bpo: 21777 -.. date: 8418 -.. nonce: dtQCWV -.. section: Documentation - -The binary sequence methods on bytes and bytearray are now documented -explicitly, rather than assuming users will be able to derive the expected -behaviour from the behaviour of the corresponding str methods. - -.. - -.. bpo: 6916 -.. date: 8417 -.. nonce: 4sm3nE -.. section: Documentation - -undocument deprecated asynchat.fifo class. - -.. - -.. bpo: 17386 -.. date: 8416 -.. nonce: ivaGLb -.. section: Documentation - -Expanded functionality of the ``Doc/make.bat`` script to make it much more -comparable to ``Doc/Makefile``. - -.. - -.. bpo: 21312 -.. date: 8415 -.. nonce: 6IqcV4 -.. section: Documentation - -Update the thread_foobar.h template file to include newer threading APIs. -Patch by Jack McCracken. - -.. - -.. bpo: 21043 -.. date: 8414 -.. nonce: oEOC8O -.. section: Documentation - -Remove the recommendation for specific CA organizations and to mention the -ability to load the OS certificates. - -.. - -.. bpo: 20765 -.. date: 8413 -.. nonce: Rv3GgV -.. section: Documentation - -Add missing documentation for PurePath.with_name() and -PurePath.with_suffix(). - -.. - -.. bpo: 19407 -.. date: 8412 -.. nonce: mRyNnG -.. section: Documentation - -New package installation and distribution guides based on the Python -Packaging Authority tools. Existing guides have been retained as legacy -links from the distutils docs, as they still contain some required reference -material for tool developers that isn't recorded anywhere else. - -.. - -.. bpo: 19697 -.. date: 8411 -.. nonce: 2jMQBP -.. section: Documentation - -Document cases where __main__.__spec__ is None. - -.. - -.. bpo: 18982 -.. date: 8410 -.. nonce: TynSM6 -.. section: Tests - -Add tests for CLI of the calendar module. - -.. - -.. bpo: 19548 -.. date: 8409 -.. nonce: 25Kxq_ -.. section: Tests - -Added some additional checks to test_codecs to ensure that statements in the -updated documentation remain accurate. Patch by Martin Panter. - -.. - -.. bpo: 22838 -.. date: 8408 -.. nonce: VZBtZg -.. section: Tests - -All test_re tests now work with unittest test discovery. - -.. - -.. bpo: 22173 -.. date: 8407 -.. nonce: dxIIVx -.. section: Tests - -Update lib2to3 tests to use unittest test discovery. - -.. - -.. bpo: 16000 -.. date: 8406 -.. nonce: Y7O6TP -.. section: Tests - -Convert test_curses to use unittest. - -.. - -.. bpo: 21456 -.. date: 8405 -.. nonce: Axsw43 -.. section: Tests - -Skip two tests in test_urllib2net.py if _ssl module not present. Patch by -Remi Pointel. - -.. - -.. bpo: 20746 -.. date: 8404 -.. nonce: N2pzAY -.. section: Tests - -Fix test_pdb to run in refleak mode (-R). Patch by Xavier de Gaye. - -.. - -.. bpo: 22060 -.. date: 8403 -.. nonce: TduJNO -.. section: Tests - -test_ctypes has been somewhat cleaned up and simplified; it now uses -unittest test discovery to find its tests. - -.. - -.. bpo: 22104 -.. date: 8402 -.. nonce: -YYDup -.. section: Tests - -regrtest.py no longer holds a reference to the suite of tests loaded from -test modules that don't define test_main(). - -.. - -.. bpo: 22111 -.. date: 8401 -.. nonce: 0XlFAU -.. section: Tests - -Assorted cleanups in test_imaplib. Patch by Milan Oberkirch. - -.. - -.. bpo: 22002 -.. date: 8400 -.. nonce: jpiaA2 -.. section: Tests - -Added ``load_package_tests`` function to test.support and used it to -implement/augment test discovery in test_asyncio, test_email, -test_importlib, test_json, and test_tools. - -.. - -.. bpo: 21976 -.. date: 8399 -.. nonce: Slq6se -.. section: Tests - -Fix test_ssl to accept LibreSSL version strings. Thanks to William Orr. - -.. - -.. bpo: 21918 -.. date: 8398 -.. nonce: QTFFSj -.. section: Tests - -Converted test_tools from a module to a package containing separate test -files for each tested script. - -.. - -.. bpo: 9554 -.. date: 8397 -.. nonce: VsP0Ve -.. section: Tests - -Use modern unittest features in test_argparse. Initial patch by Denver -Coneybeare and Radu Voicilas. - -.. - -.. bpo: 20155 -.. date: 8396 -.. nonce: nphzS3 -.. section: Tests - -Changed HTTP method names in failing tests in test_httpservers so that -packet filtering software (specifically Windows Base Filtering Engine) does -not interfere with the transaction semantics expected by the tests. - -.. - -.. bpo: 19493 -.. date: 8395 -.. nonce: SwbzLQ -.. section: Tests - -Refactored the ctypes test package to skip tests explicitly rather than -silently. - -.. - -.. bpo: 18492 -.. date: 8394 -.. nonce: ylPRU7 -.. section: Tests - -All resources are now allowed when tests are not run by regrtest.py. - -.. - -.. bpo: 21634 -.. date: 8393 -.. nonce: Eng06F -.. section: Tests - -Fix pystone micro-benchmark: use floor division instead of true division to -benchmark integers instead of floating point numbers. Set pystone version to -1.2. Patch written by Lennart Regebro. - -.. - -.. bpo: 21605 -.. date: 8392 -.. nonce: qsLV8d -.. section: Tests - -Added tests for Tkinter images. - -.. - -.. bpo: 21493 -.. date: 8391 -.. nonce: NqhRsy -.. section: Tests - -Added test for ntpath.expanduser(). Original patch by Claudiu Popa. - -.. - -.. bpo: 19925 -.. date: 8390 -.. nonce: dhMx08 -.. section: Tests - -Added tests for the spwd module. Original patch by Vajrasky Kok. - -.. - -.. bpo: 21522 -.. date: 8389 -.. nonce: b-VwFW -.. section: Tests - -Added Tkinter tests for Listbox.itemconfigure(), -PanedWindow.paneconfigure(), and Menu.entryconfigure(). - -.. - -.. bpo: 17756 -.. date: 8388 -.. nonce: LLfbfU -.. section: Tests - -Fix test_code test when run from the installed location. - -.. - -.. bpo: 17752 -.. date: 8387 -.. nonce: P8iG44 -.. section: Tests - -Fix distutils tests when run from the installed location. - -.. - -.. bpo: 18604 -.. date: 8386 -.. nonce: Q00Xrj -.. section: Tests - -Consolidated checks for GUI availability. All platforms now at least check -whether Tk can be instantiated when the GUI resource is requested. - -.. - -.. bpo: 21275 -.. date: 8385 -.. nonce: lI5FkX -.. section: Tests - -Fix a socket test on KFreeBSD. - -.. - -.. bpo: 21223 -.. date: 8384 -.. nonce: lMY6ka -.. section: Tests - -Pass test_site/test_startup_imports when some of the extensions are built as -builtins. - -.. - -.. bpo: 20635 -.. date: 8383 -.. nonce: mzWmoS -.. section: Tests - -Added tests for Tk geometry managers. - -.. - -.. bpo: 0 -.. date: 8382 -.. nonce: E5XNqr -.. section: Tests - -Add test case for freeze. - -.. - -.. bpo: 20743 -.. date: 8381 -.. nonce: hxZQUf -.. section: Tests - -Fix a reference leak in test_tcl. - -.. - -.. bpo: 21097 -.. date: 8380 -.. nonce: gsUesm -.. section: Tests - -Move test_namespace_pkgs into test_importlib. - -.. - -.. bpo: 21503 -.. date: 8379 -.. nonce: H9TPCg -.. section: Tests - -Use test_both() consistently in test_importlib. - -.. - -.. bpo: 20939 -.. date: 8378 -.. nonce: x3KQ35 -.. section: Tests - -Avoid various network test failures due to new redirect of -http://www.python.org/ to https://www.python.org: use http://www.example.com -instead. - -.. - -.. bpo: 20668 -.. date: 8377 -.. nonce: IWjOSC -.. section: Tests - -asyncio tests no longer rely on tests.txt file. (Patch by Vajrasky Kok) - -.. - -.. bpo: 21093 -.. date: 8376 -.. nonce: CcpRim -.. section: Tests - -Prevent failures of ctypes test_macholib on OS X if a copy of libz exists in -$HOME/lib or /usr/local/lib. - -.. - -.. bpo: 22770 -.. date: 8375 -.. nonce: FxAh91 -.. section: Tests - -Prevent some Tk segfaults on OS X when running gui tests. - -.. - -.. bpo: 23211 -.. date: 8374 -.. nonce: Bc-QfJ -.. section: Tests - -Workaround test_logging failure on some OS X 10.6 systems. - -.. - -.. bpo: 23345 -.. date: 8373 -.. nonce: HIGBKx -.. section: Tests - -Prevent test_ssl failures with large OpenSSL patch level values (like -0.9.8zc). - -.. - -.. bpo: 22314 -.. date: 8372 -.. nonce: ws6xsH -.. section: Tools/Demos - -pydoc now works when the LINES environment variable is set. - -.. - -.. bpo: 22615 -.. date: 8371 -.. nonce: My3DWN -.. section: Tools/Demos - -Argument Clinic now supports the "type" argument for the int converter. -This permits using the int converter with enums and typedefs. - -.. - -.. bpo: 20076 -.. date: 8370 -.. nonce: ZNuBrC -.. section: Tools/Demos - -The makelocalealias.py script no longer ignores UTF-8 mapping. - -.. - -.. bpo: 20079 -.. date: 8369 -.. nonce: ogPXcK -.. section: Tools/Demos - -The makelocalealias.py script now can parse the SUPPORTED file from glibc -sources and supports command line options for source paths. - -.. - -.. bpo: 22201 -.. date: 8368 -.. nonce: k1Awbh -.. section: Tools/Demos - -Command-line interface of the zipfile module now correctly extracts ZIP -files with directory entries. Patch by Ryan Wilson. - -.. - -.. bpo: 22120 -.. date: 8367 -.. nonce: KmBUj- -.. section: Tools/Demos - -For functions using an unsigned integer return converter, Argument Clinic -now generates a cast to that type for the comparison to -1 in the generated -code. (This suppresses a compilation warning.) - -.. - -.. bpo: 18974 -.. date: 8366 -.. nonce: I3DdAo -.. section: Tools/Demos - -Tools/scripts/diff.py now uses argparse instead of optparse. - -.. - -.. bpo: 21906 -.. date: 8365 -.. nonce: ZsKy9v -.. section: Tools/Demos - -Make Tools/scripts/md5sum.py work in Python 3. Patch by Zachary Ware. - -.. - -.. bpo: 21629 -.. date: 8364 -.. nonce: 9kZmQl -.. section: Tools/Demos - -Fix Argument Clinic's "--converters" feature. - -.. - -.. bpo: 0 -.. date: 8363 -.. nonce: _-ge-g -.. section: Tools/Demos - -Add support for ``yield from`` to 2to3. - -.. - -.. bpo: 0 -.. date: 8362 -.. nonce: dpFbyZ -.. section: Tools/Demos - -Add support for the :pep:`465` matrix multiplication operator to 2to3. - -.. - -.. bpo: 16047 -.. date: 8361 -.. nonce: IsgTzm -.. section: Tools/Demos - -Fix module exception list and __file__ handling in freeze. Patch by Meador -Inge. - -.. - -.. bpo: 11824 -.. date: 8360 -.. nonce: OBWc3T -.. section: Tools/Demos - -Consider ABI tags in freeze. Patch by Meador Inge. - -.. - -.. bpo: 20535 -.. date: 8359 -.. nonce: 0qkvZZ -.. section: Tools/Demos - -PYTHONWARNING no longer affects the run_tests.py script. Patch by Arfrever -Frehtes Taifersar Arahesis. - -.. - -.. bpo: 23260 -.. date: 8358 -.. nonce: aZ5VLH -.. section: Windows - -Update Windows installer - -.. - -.. bpo: 0 -.. date: 8357 -.. nonce: _aEUNt -.. section: Windows - -The bundled version of Tcl/Tk has been updated to 8.6.3. The most visible -result of this change is the addition of new native file dialogs when -running on Windows Vista or newer. See Tcl/Tk's TIP 432 for more -information. Also, this version of Tcl/Tk includes support for Windows 10. - -.. - -.. bpo: 17896 -.. date: 8356 -.. nonce: o79rHM -.. section: Windows - -The Windows build scripts now expect external library sources to be in -``PCbuild\..\externals`` rather than ``PCbuild\..\..``. - -.. - -.. bpo: 17717 -.. date: 8355 -.. nonce: y1zoye -.. section: Windows - -The Windows build scripts now use a copy of NASM pulled from svn.python.org -to build OpenSSL. - -.. - -.. bpo: 21907 -.. date: 8354 -.. nonce: jm1smN -.. section: Windows - -Improved the batch scripts provided for building Python. - -.. - -.. bpo: 22644 -.. date: 8353 -.. nonce: gosBki -.. section: Windows - -The bundled version of OpenSSL has been updated to 1.0.1j. - -.. - -.. bpo: 10747 -.. date: 8352 -.. nonce: LTWhLn -.. section: Windows - -Use versioned labels in the Windows start menu. Patch by Olive Kilburn. - -.. - -.. bpo: 22980 -.. date: 8351 -.. nonce: -UypE5 -.. section: Windows - -.pyd files with a version and platform tag (for example, ".cp35-win32.pyd") -will now be loaded in preference to those without tags. diff --git a/Misc/NEWS.d/3.5.0a2.rst b/Misc/NEWS.d/3.5.0a2.rst deleted file mode 100644 index ebce66742ca62eb1d829d25a31924da06c418f13..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.0a2.rst +++ /dev/null @@ -1,405 +0,0 @@ -.. bpo: 23571 -.. date: 8990 -.. nonce: GTkAkq -.. release date: 2015-03-09 -.. section: Core and Builtins - -PyObject_Call() and PyCFunction_Call() now raise a SystemError if a function -returns a result and raises an exception. The SystemError is chained to the -previous exception. - -.. - -.. bpo: 22524 -.. date: 8989 -.. nonce: Ks6_2x -.. section: Library - -New os.scandir() function, part of the :pep:`471`: "os.scandir() function -- a -better and faster directory iterator". Patch written by Ben Hoyt. - -.. - -.. bpo: 23103 -.. date: 8988 -.. nonce: I3RLIV -.. section: Library - -Reduced the memory consumption of IPv4Address and IPv6Address. - -.. - -.. bpo: 21793 -.. date: 8987 -.. nonce: GQtYMM -.. section: Library - -BaseHTTPRequestHandler again logs response code as numeric, not as -stringified enum. Patch by Demian Brecht. - -.. - -.. bpo: 23476 -.. date: 8986 -.. nonce: 82QV9I -.. section: Library - -In the ssl module, enable OpenSSL's X509_V_FLAG_TRUSTED_FIRST flag on -certificate stores when it is available. - -.. - -.. bpo: 23576 -.. date: 8985 -.. nonce: 98F-PP -.. section: Library - -Avoid stalling in SSL reads when EOF has been reached in the SSL layer but -the underlying connection hasn't been closed. - -.. - -.. bpo: 23504 -.. date: 8984 -.. nonce: o31h5I -.. section: Library - -Added an __all__ to the types module. - -.. - -.. bpo: 23563 -.. date: 8983 -.. nonce: iQB-ba -.. section: Library - -Optimized utility functions in urllib.parse. - -.. - -.. bpo: 7830 -.. date: 8982 -.. nonce: irvPdC -.. section: Library - -Flatten nested functools.partial. - -.. - -.. bpo: 20204 -.. date: 8981 -.. nonce: DorA4b -.. section: Library - -Added the __module__ attribute to _tkinter classes. - -.. - -.. bpo: 19980 -.. date: 8980 -.. nonce: whwzL_ -.. section: Library - -Improved help() for non-recognized strings. help('') now shows the help on -str. help('help') now shows the help on help(). Original patch by Mark -Lawrence. - -.. - -.. bpo: 23521 -.. date: 8979 -.. nonce: HvwFfd -.. section: Library - -Corrected pure python implementation of timedelta division. -Eliminated OverflowError from ``timedelta * float`` for some floats; -Corrected rounding in timedelta true division. - -.. - -.. bpo: 21619 -.. date: 8978 -.. nonce: uL0SZh -.. section: Library - -Popen objects no longer leave a zombie after exit in the with statement if -the pipe was broken. Patch by Martin Panter. - -.. - -.. bpo: 22936 -.. date: 8977 -.. nonce: JrhGYd -.. section: Library - -Make it possible to show local variables in tracebacks for both the -traceback module and unittest. - -.. - -.. bpo: 15955 -.. date: 8976 -.. nonce: _8nYPy -.. section: Library - -Add an option to limit the output size in bz2.decompress(). Patch by -Nikolaus Rath. - -.. - -.. bpo: 6639 -.. date: 8975 -.. nonce: rmjUmG -.. section: Library - -Module-level turtle functions no longer raise TclError after closing the -window. - -.. - -.. bpo: 814253 -.. date: 8974 -.. nonce: icZb-I -.. section: Library - -Group references and conditional group references now work in lookbehind -assertions in regular expressions. (See also: bpo-9179) - -.. - -.. bpo: 23215 -.. date: 8973 -.. nonce: VHVSVX -.. section: Library - -Multibyte codecs with custom error handlers that ignores errors consumed too -much memory and raised SystemError or MemoryError. Original patch by Aleksi -Torhamo. - -.. - -.. bpo: 5700 -.. date: 8972 -.. nonce: iA5yzL -.. section: Library - -io.FileIO() called flush() after closing the file. flush() was not called in -close() if closefd=False. - -.. - -.. bpo: 23374 -.. date: 8971 -.. nonce: 8A9LuZ -.. section: Library - -Fixed pydoc failure with non-ASCII files when stdout encoding differs from -file system encoding (e.g. on Mac OS). - -.. - -.. bpo: 23481 -.. date: 8970 -.. nonce: ZWwliG -.. section: Library - -Remove RC4 from the SSL module's default cipher list. - -.. - -.. bpo: 21548 -.. date: 8969 -.. nonce: CmO_Yh -.. section: Library - -Fix pydoc.synopsis() and pydoc.apropos() on modules with empty docstrings. - -.. - -.. bpo: 22885 -.. date: 8968 -.. nonce: p8FnYk -.. section: Library - -Fixed arbitrary code execution vulnerability in the dbm.dumb module. -Original patch by Claudiu Popa. - -.. - -.. bpo: 23239 -.. date: 8967 -.. nonce: PGUq7T -.. section: Library - -ssl.match_hostname() now supports matching of IP addresses. - -.. - -.. bpo: 23146 -.. date: 8966 -.. nonce: PW-O3u -.. section: Library - -Fix mishandling of absolute Windows paths with forward slashes in pathlib. - -.. - -.. bpo: 23096 -.. date: 8965 -.. nonce: Ftrmf3 -.. section: Library - -Pickle representation of floats with protocol 0 now is the same for both -Python and C implementations. - -.. - -.. bpo: 19105 -.. date: 8964 -.. nonce: ZK07Ff -.. section: Library - -pprint now more efficiently uses free space at the right. - -.. - -.. bpo: 14910 -.. date: 8963 -.. nonce: zueIhP -.. section: Library - -Add allow_abbrev parameter to argparse.ArgumentParser. Patch by Jonathan -Paugh, Steven Bethard, paul j3 and Daniel Eriksson. - -.. - -.. bpo: 21717 -.. date: 8962 -.. nonce: Knut81 -.. section: Library - -tarfile.open() now supports 'x' (exclusive creation) mode. - -.. - -.. bpo: 23344 -.. date: 8961 -.. nonce: ieu8C1 -.. section: Library - -marshal.dumps() is now 20-25% faster on average. - -.. - -.. bpo: 20416 -.. date: 8960 -.. nonce: cwEgkL -.. section: Library - -marshal.dumps() with protocols 3 and 4 is now 40-50% faster on average. - -.. - -.. bpo: 23421 -.. date: 8959 -.. nonce: eckzoV -.. section: Library - -Fixed compression in tarfile CLI. Patch by wdv4758h. - -.. - -.. bpo: 23367 -.. date: 8958 -.. nonce: kHnFiz -.. section: Library - -Fix possible overflows in the unicodedata module. - -.. - -.. bpo: 23361 -.. date: 8957 -.. nonce: I_w0-z -.. section: Library - -Fix possible overflow in Windows subprocess creation code. - -.. - -.. bpo: 0 -.. date: 8956 -.. nonce: sfmjTs -.. section: Library - -logging.handlers.QueueListener now takes a respect_handler_level keyword -argument which, if set to True, will pass messages to handlers taking -handler levels into account. - -.. - -.. bpo: 19705 -.. date: 8955 -.. nonce: WLzTRV -.. section: Library - -turtledemo now has a visual sorting algorithm demo. Original patch from -Jason Yeo. - -.. - -.. bpo: 23801 -.. date: 8954 -.. nonce: jyJK3z -.. section: Library - -Fix issue where cgi.FieldStorage did not always ignore the entire preamble -to a multipart body. - -.. - -.. bpo: 23445 -.. date: 8953 -.. nonce: 7fmkYO -.. section: Build - -pydebug builds now use "gcc -Og" where possible, to make the resulting -executable faster. - -.. - -.. bpo: 23686 -.. date: 8952 -.. nonce: B7jDXY -.. section: Build - -Update OS X 10.5 installer build to use OpenSSL 1.0.2a. - -.. - -.. bpo: 20204 -.. date: 8951 -.. nonce: M_jcNK -.. section: C API - -Deprecation warning is now raised for builtin types without the __module__ -attribute. - -.. - -.. bpo: 23465 -.. date: 8950 -.. nonce: qBauCy -.. section: Windows - -Implement :pep:`486` - Make the Python Launcher aware of virtual environments. -Patch by Paul Moore. - -.. - -.. bpo: 23437 -.. date: 8949 -.. nonce: ro9X8r -.. section: Windows - -Make user scripts directory versioned on Windows. Patch by Paul Moore. diff --git a/Misc/NEWS.d/3.5.0a3.rst b/Misc/NEWS.d/3.5.0a3.rst deleted file mode 100644 index a81d67aea8663b088cb0d67def9641efdb63c124..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.0a3.rst +++ /dev/null @@ -1,518 +0,0 @@ -.. bpo: 23573 -.. date: 9042 -.. nonce: ZpM4D- -.. release date: 2015-03-28 -.. section: Core and Builtins - -Increased performance of string search operations (str.find, str.index, -str.count, the in operator, str.split, str.partition) with arguments of -different kinds (UCS1, UCS2, UCS4). - -.. - -.. bpo: 23753 -.. date: 9041 -.. nonce: CREjLC -.. section: Core and Builtins - -Python doesn't support anymore platforms without stat() or fstat(), these -functions are always required. - -.. - -.. bpo: 23681 -.. date: 9040 -.. nonce: kh02TF -.. section: Core and Builtins - -The -b option now affects comparisons of bytes with int. - -.. - -.. bpo: 23632 -.. date: 9039 -.. nonce: UVdIZY -.. section: Core and Builtins - -Memoryviews now allow tuple indexing (including for multi-dimensional -memoryviews). - -.. - -.. bpo: 23192 -.. date: 9038 -.. nonce: QKqdow -.. section: Core and Builtins - -Fixed generator lambdas. Patch by Bruno Cauet. - -.. - -.. bpo: 23629 -.. date: 9037 -.. nonce: r9Mt2C -.. section: Core and Builtins - -Fix the default __sizeof__ implementation for variable-sized objects. - -.. - -.. bpo: 14260 -.. date: 9036 -.. nonce: b5M04V -.. section: Library - -The groupindex attribute of regular expression pattern object now is -non-modifiable mapping. - -.. - -.. bpo: 23792 -.. date: 9035 -.. nonce: Kfm9-f -.. section: Library - -Ignore KeyboardInterrupt when the pydoc pager is active. This mimics the -behavior of the standard unix pagers, and prevents pipepager from shutting -down while the pager itself is still running. - -.. - -.. bpo: 23775 -.. date: 9034 -.. nonce: xKGrSQ -.. section: Library - -pprint() of OrderedDict now outputs the same representation as repr(). - -.. - -.. bpo: 23765 -.. date: 9033 -.. nonce: 2ta_C4 -.. section: Library - -Removed IsBadStringPtr calls in ctypes - -.. - -.. bpo: 22364 -.. date: 9032 -.. nonce: ejtoKl -.. section: Library - -Improved some re error messages using regex for hints. - -.. - -.. bpo: 23742 -.. date: 9031 -.. nonce: _EkAIa -.. section: Library - -ntpath.expandvars() no longer loses unbalanced single quotes. - -.. - -.. bpo: 21717 -.. date: 9030 -.. nonce: pKndpx -.. section: Library - -The zipfile.ZipFile.open function now supports 'x' (exclusive creation) -mode. - -.. - -.. bpo: 21802 -.. date: 9029 -.. nonce: ygSM2A -.. section: Library - -The reader in BufferedRWPair now is closed even when closing writer failed -in BufferedRWPair.close(). - -.. - -.. bpo: 23622 -.. date: 9028 -.. nonce: 9-ZRqj -.. section: Library - -Unknown escapes in regular expressions that consist of ``'\'`` and ASCII -letter now raise a deprecation warning and will be forbidden in Python 3.6. - -.. - -.. bpo: 23671 -.. date: 9027 -.. nonce: zWPm-a -.. section: Library - -string.Template now allows specifying the "self" parameter as a keyword -argument. string.Formatter now allows specifying the "self" and the -"format_string" parameters as keyword arguments. - -.. - -.. bpo: 23502 -.. date: 9026 -.. nonce: AH20IQ -.. section: Library - -The pprint module now supports mapping proxies. - -.. - -.. bpo: 17530 -.. date: 9025 -.. nonce: PUp8rL -.. section: Library - -pprint now wraps long bytes objects and bytearrays. - -.. - -.. bpo: 22687 -.. date: 9024 -.. nonce: zEJPd9 -.. section: Library - -Fixed some corner cases in breaking words in tetxtwrap. Got rid of quadratic -complexity in breaking long words. - -.. - -.. bpo: 4727 -.. date: 9023 -.. nonce: iDQSpi -.. section: Library - -The copy module now uses pickle protocol 4 (PEP 3154) and supports copying -of instances of classes whose __new__ method takes keyword-only arguments. - -.. - -.. bpo: 23491 -.. date: 9022 -.. nonce: P_WKrt -.. section: Library - -Added a zipapp module to support creating executable zip file archives of -Python code. Registered ".pyz" and ".pyzw" extensions on Windows for these -archives (PEP 441). - -.. - -.. bpo: 23657 -.. date: 9021 -.. nonce: y1OaV- -.. section: Library - -Avoid explicit checks for str in zipapp, adding support for pathlib.Path -objects as arguments. - -.. - -.. bpo: 23688 -.. date: 9020 -.. nonce: d6LVy3 -.. section: Library - -Added support of arbitrary bytes-like objects and avoided unnecessary -copying of memoryview in gzip.GzipFile.write(). Original patch by Wolfgang -Maier. - -.. - -.. bpo: 23252 -.. date: 9019 -.. nonce: Goi18g -.. section: Library - -Added support for writing ZIP files to unseekable streams. - -.. - -.. bpo: 23647 -.. date: 9018 -.. nonce: pX2qrx -.. section: Library - -Increase imaplib's MAXLINE to accommodate modern mailbox sizes. - -.. - -.. bpo: 23539 -.. date: 9017 -.. nonce: 5BVUim -.. section: Library - -If body is None, http.client.HTTPConnection.request now sets Content-Length -to 0 for PUT, POST, and PATCH headers to avoid 411 errors from some web -servers. - -.. - -.. bpo: 22351 -.. date: 9016 -.. nonce: agB8Y3 -.. section: Library - -The nntplib.NNTP constructor no longer leaves the connection and socket open -until the garbage collector cleans them up. Patch by Martin Panter. - -.. - -.. bpo: 23704 -.. date: 9015 -.. nonce: LTyyxL -.. section: Library - -collections.deque() objects now support methods for index(), insert(), and -copy(). This allows deques to be registered as a MutableSequence and it -improves their substitutability for lists. - -.. - -.. bpo: 23715 -.. date: 9014 -.. nonce: Yap3tU -.. section: Library - -:func:`signal.sigwaitinfo` and :func:`signal.sigtimedwait` are now retried -when interrupted by a signal not in the *sigset* parameter, if the signal -handler does not raise an exception. signal.sigtimedwait() recomputes the -timeout with a monotonic clock when it is retried. - -.. - -.. bpo: 23001 -.. date: 9013 -.. nonce: YSFnam -.. section: Library - -Few functions in modules mmap, ossaudiodev, socket, ssl, and codecs, that -accepted only read-only bytes-like object now accept writable bytes-like -object too. - -.. - -.. bpo: 23646 -.. date: 9012 -.. nonce: Tljc1S -.. section: Library - -If time.sleep() is interrupted by a signal, the sleep is now retried with -the recomputed delay, except if the signal handler raises an exception (PEP -475). - -.. - -.. bpo: 23136 -.. date: 9011 -.. nonce: 1bnpnb -.. section: Library - -_strptime now uniformly handles all days in week 0, including Dec 30 of -previous year. Based on patch by Jim Carroll. - -.. - -.. bpo: 23700 -.. date: 9010 -.. nonce: VfnWwi -.. section: Library - -Iterator of NamedTemporaryFile now keeps a reference to NamedTemporaryFile -instance. Patch by Bohuslav Kabrda. - -.. - -.. bpo: 22903 -.. date: 9009 -.. nonce: 2GjTHY -.. section: Library - -The fake test case created by unittest.loader when it fails importing a test -module is now picklable. - -.. - -.. bpo: 22181 -.. date: 9008 -.. nonce: 7mnxea -.. section: Library - -On Linux, os.urandom() now uses the new getrandom() syscall if available, -syscall introduced in the Linux kernel 3.17. It is more reliable and more -secure, because it avoids the need of a file descriptor and waits until the -kernel has enough entropy. - -.. - -.. bpo: 2211 -.. date: 9007 -.. nonce: 17Iz5U -.. section: Library - -Updated the implementation of the http.cookies.Morsel class. Setting -attributes key, value and coded_value directly now is deprecated. update() -and setdefault() now transform and check keys. Comparing for equality now -takes into account attributes key, value and coded_value. copy() now returns -a Morsel, not a dict. repr() now contains all attributes. Optimized -checking keys and quoting values. Added new tests. Original patch by Demian -Brecht. - -.. - -.. bpo: 18983 -.. date: 9006 -.. nonce: vF4i2S -.. section: Library - -Allow selection of output units in timeit. Patch by Julian Gindi. - -.. - -.. bpo: 23631 -.. date: 9005 -.. nonce: GfSqNI -.. section: Library - -Fix traceback.format_list when a traceback has been mutated. - -.. - -.. bpo: 23568 -.. date: 9004 -.. nonce: ffzJc7 -.. section: Library - -Add rdivmod support to MagicMock() objects. Patch by Håkan Lövdahl. - -.. - -.. bpo: 2052 -.. date: 9003 -.. nonce: ujNgna -.. section: Library - -Add charset parameter to HtmlDiff.make_file(). - -.. - -.. bpo: 23668 -.. date: 9002 -.. nonce: nF_jnN -.. section: Library - -Support os.truncate and os.ftruncate on Windows. - -.. - -.. bpo: 23138 -.. date: 9001 -.. nonce: 4vMoMZ -.. section: Library - -Fixed parsing cookies with absent keys or values in cookiejar. Patch by -Demian Brecht. - -.. - -.. bpo: 23051 -.. date: 9000 -.. nonce: Vi5tCZ -.. section: Library - -multiprocessing.Pool methods imap() and imap_unordered() now handle -exceptions raised by an iterator. Patch by Alon Diamant and Davin Potts. - -.. - -.. bpo: 23581 -.. date: 8999 -.. nonce: D4Lknl -.. section: Library - -Add matmul support to MagicMock. Patch by Håkan Lövdahl. - -.. - -.. bpo: 23566 -.. date: 8998 -.. nonce: F6LSyk -.. section: Library - -enable(), register(), dump_traceback() and dump_traceback_later() functions -of faulthandler now accept file descriptors. Patch by Wei Wu. - -.. - -.. bpo: 22928 -.. date: 8997 -.. nonce: q2TmY0 -.. section: Library - -Disabled HTTP header injections in http.client. Original patch by Demian -Brecht. - -.. - -.. bpo: 23615 -.. date: 8996 -.. nonce: 5Kx9k5 -.. section: Library - -Modules bz2, tarfile and tokenize now can be reloaded with imp.reload(). -Patch by Thomas Kluyver. - -.. - -.. bpo: 23605 -.. date: 8995 -.. nonce: JUOA_X -.. section: Library - -os.walk() now calls os.scandir() instead of os.listdir(). The usage of -os.scandir() reduces the number of calls to os.stat(). Initial patch written -by Ben Hoyt. - -.. - -.. bpo: 23585 -.. date: 8994 -.. nonce: DTIIoI -.. section: Build - -make patchcheck will ensure the interpreter is built. - -.. - -.. bpo: 23583 -.. date: 8993 -.. nonce: bY8AbM -.. section: Tests - -Added tests for standard IO streams in IDLE. - -.. - -.. bpo: 22289 -.. date: 8992 -.. nonce: ybGcC- -.. section: Tests - -Prevent test_urllib2net failures due to ftp connection timeout. - -.. - -.. bpo: 22826 -.. date: 8991 -.. nonce: 3bcoDL -.. section: Tools/Demos - -The result of open() in Tools/freeze/bkfile.py is now better compatible with -regular files (in particular it now supports the context management -protocol). diff --git a/Misc/NEWS.d/3.5.0a4.rst b/Misc/NEWS.d/3.5.0a4.rst deleted file mode 100644 index f60aa0a22d1979b84a7c522dfd23d4f03076faf3..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.0a4.rst +++ /dev/null @@ -1,665 +0,0 @@ -.. bpo: 22980 -.. date: 9109 -.. nonce: Lu_y6y -.. release date: 2015-04-19 -.. section: Core and Builtins - -Under Linux, GNU/KFreeBSD and the Hurd, C extensions now include the -architecture triplet in the extension name, to make it easy to test builds -for different ABIs in the same working tree. Under OS X, the extension name -now includes :pep:`3149`-style information. - -.. - -.. bpo: 22631 -.. date: 9108 -.. nonce: nTx_ZF -.. section: Core and Builtins - -Added Linux-specific socket constant CAN_RAW_FD_FRAMES. Patch courtesy of -Joe Jevnik. - -.. - -.. bpo: 23731 -.. date: 9107 -.. nonce: FOXb37 -.. section: Core and Builtins - -Implement :pep:`488`: removal of .pyo files. - -.. - -.. bpo: 23726 -.. date: 9106 -.. nonce: ZopTQ0 -.. section: Core and Builtins - -Don't enable GC for user subclasses of non-GC types that don't add any new -fields. Patch by Eugene Toder. - -.. - -.. bpo: 23309 -.. date: 9105 -.. nonce: Wfnsnz -.. section: Core and Builtins - -Avoid a deadlock at shutdown if a daemon thread is aborted while it is -holding a lock to a buffered I/O object, and the main thread tries to use -the same I/O object (typically stdout or stderr). A fatal error is emitted -instead. - -.. - -.. bpo: 22977 -.. date: 9104 -.. nonce: hutEse -.. section: Core and Builtins - -Fixed formatting Windows error messages on Wine. Patch by Martin Panter. - -.. - -.. bpo: 23466 -.. date: 9103 -.. nonce: KhMltK -.. section: Core and Builtins - -%c, %o, %x, and %X in bytes formatting now raise TypeError on non-integer -input. - -.. - -.. bpo: 24044 -.. date: 9102 -.. nonce: H7vb6- -.. section: Core and Builtins - -Fix possible null pointer dereference in list.sort in out of memory -conditions. - -.. - -.. bpo: 21354 -.. date: 9101 -.. nonce: ZZTe1E -.. section: Core and Builtins - -PyCFunction_New function is exposed by python DLL again. - -.. - -.. bpo: 23840 -.. date: 9100 -.. nonce: mtSbqO -.. section: Library - -tokenize.open() now closes the temporary binary file on error to fix a -resource warning. - -.. - -.. bpo: 16914 -.. date: 9099 -.. nonce: GrP2Jr -.. section: Library - -new debuglevel 2 in smtplib adds timestamps to debug output. - -.. - -.. bpo: 7159 -.. date: 9098 -.. nonce: KCgOUm -.. section: Library - -urllib.request now supports sending auth credentials automatically after the -first 401. This enhancement is a superset of the enhancement from issue -#19494 and supersedes that change. - -.. - -.. bpo: 23703 -.. date: 9097 -.. nonce: kYybxm -.. section: Library - -Fix a regression in urljoin() introduced in 901e4e52b20a. Patch by Demian -Brecht. - -.. - -.. bpo: 4254 -.. date: 9096 -.. nonce: eUC_2H -.. section: Library - -Adds _curses.update_lines_cols(). Patch by Arnon Yaari - -.. - -.. bpo: 19933 -.. date: 9095 -.. nonce: Qq8utk -.. section: Library - -Provide default argument for ndigits in round. Patch by Vajrasky Kok. - -.. - -.. bpo: 23193 -.. date: 9094 -.. nonce: n5ahcG -.. section: Library - -Add a numeric_owner parameter to tarfile.TarFile.extract and -tarfile.TarFile.extractall. Patch by Michael Vogt and Eric Smith. - -.. - -.. bpo: 23342 -.. date: 9093 -.. nonce: CbSzYI -.. section: Library - -Add a subprocess.run() function than returns a CalledProcess instance for a -more consistent API than the existing call* functions. - -.. - -.. bpo: 21217 -.. date: 9092 -.. nonce: TkFTlk -.. section: Library - -inspect.getsourcelines() now tries to compute the start and end lines from -the code object, fixing an issue when a lambda function is used as decorator -argument. Patch by Thomas Ballinger and Allison Kaptur. - -.. - -.. bpo: 24521 -.. date: 9091 -.. nonce: bn4U-y -.. section: Library - -Fix possible integer overflows in the pickle module. - -.. - -.. bpo: 22931 -.. date: 9090 -.. nonce: 4CuWYD -.. section: Library - -Allow '[' and ']' in cookie values. - -.. - -.. bpo: 0 -.. date: 9089 -.. nonce: fgX8Qe -.. section: Library - -The keywords attribute of functools.partial is now always a dictionary. - -.. - -.. bpo: 23811 -.. date: 9088 -.. nonce: B6tzf9 -.. section: Library - -Add missing newline to the PyCompileError error message. Patch by Alex -Shkop. - -.. - -.. bpo: 21116 -.. date: 9087 -.. nonce: Orft3K -.. section: Library - -Avoid blowing memory when allocating a multiprocessing shared array that's -larger than 50% of the available RAM. Patch by Médéric Boquien. - -.. - -.. bpo: 22982 -.. date: 9086 -.. nonce: xYmG62 -.. section: Library - -Improve BOM handling when seeking to multiple positions of a writable text -file. - -.. - -.. bpo: 23464 -.. date: 9085 -.. nonce: _XGkBk -.. section: Library - -Removed deprecated asyncio JoinableQueue. - -.. - -.. bpo: 23529 -.. date: 9084 -.. nonce: Hr7AHH -.. section: Library - -Limit the size of decompressed data when reading from GzipFile, BZ2File or -LZMAFile. This defeats denial of service attacks using compressed bombs -(i.e. compressed payloads which decompress to a huge size). Patch by Martin -Panter and Nikolaus Rath. - -.. - -.. bpo: 21859 -.. date: 9083 -.. nonce: GYrUNP -.. section: Library - -Added Python implementation of io.FileIO. - -.. - -.. bpo: 23865 -.. date: 9082 -.. nonce: PtSLgU -.. section: Library - -close() methods in multiple modules now are idempotent and more robust at -shutdown. If they need to release multiple resources, all are released even -if errors occur. - -.. - -.. bpo: 23400 -.. date: 9081 -.. nonce: JSh9Z3 -.. section: Library - -Raise same exception on both Python 2 and 3 if sem_open is not available. -Patch by Davin Potts. - -.. - -.. bpo: 10838 -.. date: 9080 -.. nonce: p9tSPC -.. section: Library - -The subprocess now module includes SubprocessError and TimeoutError in its -list of exported names for the users wild enough to use ``from subprocess -import *``. - -.. - -.. bpo: 23411 -.. date: 9079 -.. nonce: 0im3Qw -.. section: Library - -Added DefragResult, ParseResult, SplitResult, DefragResultBytes, -ParseResultBytes, and SplitResultBytes to urllib.parse.__all__. Patch by -Martin Panter. - -.. - -.. bpo: 23881 -.. date: 9078 -.. nonce: yZjl4b -.. section: Library - -urllib.request.ftpwrapper constructor now closes the socket if the FTP -connection failed to fix a ResourceWarning. - -.. - -.. bpo: 23853 -.. date: 9077 -.. nonce: mNY1eI -.. section: Library - -:meth:`socket.socket.sendall` does no more reset the socket timeout each -time data is sent successfully. The socket timeout is now the maximum total -duration to send all data. - -.. - -.. bpo: 22721 -.. date: 9076 -.. nonce: MVfBL9 -.. section: Library - -An order of multiline pprint output of set or dict containing orderable and -non-orderable elements no longer depends on iteration order of set or dict. - -.. - -.. bpo: 15133 -.. date: 9075 -.. nonce: C0QfV8 -.. section: Library - -_tkinter.tkapp.getboolean() now supports Tcl_Obj and always returns bool. -tkinter.BooleanVar now validates input values (accepted bool, int, str, and -Tcl_Obj). tkinter.BooleanVar.get() now always returns bool. - -.. - -.. bpo: 10590 -.. date: 9074 -.. nonce: nkxXfU -.. section: Library - -xml.sax.parseString() now supports string argument. - -.. - -.. bpo: 23338 -.. date: 9073 -.. nonce: ZYMGN1 -.. section: Library - -Fixed formatting ctypes error messages on Cygwin. Patch by Makoto Kato. - -.. - -.. bpo: 15582 -.. date: 9072 -.. nonce: 26wJNk -.. section: Library - -inspect.getdoc() now follows inheritance chains. - -.. - -.. bpo: 2175 -.. date: 9071 -.. nonce: cHiVOp -.. section: Library - -SAX parsers now support a character stream of InputSource object. - -.. - -.. bpo: 16840 -.. date: 9070 -.. nonce: kKIhPm -.. section: Library - -Tkinter now supports 64-bit integers added in Tcl 8.4 and arbitrary -precision integers added in Tcl 8.5. - -.. - -.. bpo: 23834 -.. date: 9069 -.. nonce: fX3TF4 -.. section: Library - -Fix socket.sendto(), use the C Py_ssize_t type to store the result of -sendto() instead of the C int type. - -.. - -.. bpo: 23618 -.. date: 9068 -.. nonce: Of_q5t -.. section: Library - -:meth:`socket.socket.connect` now waits until the connection completes -instead of raising :exc:`InterruptedError` if the connection is interrupted -by signals, signal handlers don't raise an exception and the socket is -blocking or has a timeout. :meth:`socket.socket.connect` still raise -:exc:`InterruptedError` for non-blocking sockets. - -.. - -.. bpo: 21526 -.. date: 9067 -.. nonce: QQEXrR -.. section: Library - -Tkinter now supports new boolean type in Tcl 8.5. - -.. - -.. bpo: 23836 -.. date: 9066 -.. nonce: zrEmlR -.. section: Library - -Fix the faulthandler module to handle reentrant calls to its signal -handlers. - -.. - -.. bpo: 23838 -.. date: 9065 -.. nonce: IX6FPX -.. section: Library - -linecache now clears the cache and returns an empty result on MemoryError. - -.. - -.. bpo: 10395 -.. date: 9064 -.. nonce: fi_lZp -.. section: Library - -Added os.path.commonpath(). Implemented in posixpath and ntpath. Based on -patch by Rafik Draoui. - -.. - -.. bpo: 23611 -.. date: 9063 -.. nonce: QkBJVB -.. section: Library - -Serializing more "lookupable" objects (such as unbound methods or nested -classes) now are supported with pickle protocols < 4. - -.. - -.. bpo: 13583 -.. date: 9062 -.. nonce: -MPBjZ -.. section: Library - -sqlite3.Row now supports slice indexing. - -.. - -.. bpo: 18473 -.. date: 9061 -.. nonce: 89RHm- -.. section: Library - -Fixed 2to3 and 3to2 compatible pickle mappings. Fixed ambiguous reverse -mappings. Added many new mappings. Import mapping is no longer applied to -modules already mapped with full name mapping. - -.. - -.. bpo: 23485 -.. date: 9060 -.. nonce: kQWN6L -.. section: Library - -select.select() is now retried automatically with the recomputed timeout -when interrupted by a signal, except if the signal handler raises an -exception. This change is part of the :pep:`475`. - -.. - -.. bpo: 23752 -.. date: 9059 -.. nonce: 5fbVNb -.. section: Library - -When built from an existing file descriptor, io.FileIO() now only calls -fstat() once. Before fstat() was called twice, which was not necessary. - -.. - -.. bpo: 23704 -.. date: 9058 -.. nonce: Ggjvm8 -.. section: Library - -collections.deque() objects now support __add__, __mul__, and __imul__(). - -.. - -.. bpo: 23171 -.. date: 9057 -.. nonce: b6PBzM -.. section: Library - -csv.Writer.writerow() now supports arbitrary iterables. - -.. - -.. bpo: 23745 -.. date: 9056 -.. nonce: E00Bml -.. section: Library - -The new email header parser now handles duplicate MIME parameter names -without error, similar to how get_param behaves. - -.. - -.. bpo: 22117 -.. date: 9055 -.. nonce: bTO0xx -.. section: Library - -Fix os.utime(), it now rounds the timestamp towards minus infinity (-inf) -instead of rounding towards zero. - -.. - -.. bpo: 23310 -.. date: 9054 -.. nonce: GXmFMR -.. section: Library - -Fix MagicMock's initializer to work with __methods__, just like -configure_mock(). Patch by Kasia Jachim. - -.. - -.. bpo: 23817 -.. date: 9053 -.. nonce: DTmVan -.. section: Build - -FreeBSD now uses "1.0" in the SOVERSION as other operating systems, instead -of just "1". - -.. - -.. bpo: 23501 -.. date: 9052 -.. nonce: iz10e6 -.. section: Build - -Argument Clinic now generates code into separate files by default. - -.. - -.. bpo: 23799 -.. date: 9051 -.. nonce: XU2xDw -.. section: Tests - -Added test.support.start_threads() for running and cleaning up multiple -threads. - -.. - -.. bpo: 22390 -.. date: 9050 -.. nonce: UPVFnq -.. section: Tests - -test.regrtest now emits a warning if temporary files or directories are left -after running a test. - -.. - -.. bpo: 18128 -.. date: 9049 -.. nonce: lx2V5a -.. section: Tools/Demos - -pygettext now uses standard +NNNN format in the POT-Creation-Date header. - -.. - -.. bpo: 23935 -.. date: 9048 -.. nonce: JSYowT -.. section: Tools/Demos - -Argument Clinic's understanding of format units accepting bytes, bytearrays, -and buffers is now consistent with both the documentation and the -implementation. - -.. - -.. bpo: 23944 -.. date: 9047 -.. nonce: Q8ZL2s -.. section: Tools/Demos - -Argument Clinic now wraps long impl prototypes at column 78. - -.. - -.. bpo: 20586 -.. date: 9046 -.. nonce: 7BiEkx -.. section: Tools/Demos - -Argument Clinic now ensures that functions without docstrings have -signatures. - -.. - -.. bpo: 23492 -.. date: 9045 -.. nonce: kjIcQW -.. section: Tools/Demos - -Argument Clinic now generates argument parsing code with PyArg_Parse instead -of PyArg_ParseTuple if possible. - -.. - -.. bpo: 23500 -.. date: 9044 -.. nonce: H6_dX_ -.. section: Tools/Demos - -Argument Clinic is now smarter about generating the "#ifndef" (empty) -definition of the methoddef macro: it's only generated once, even if -Argument Clinic processes the same symbol multiple times, and it's emitted -at the end of all processing rather than immediately after the first use. - -.. - -.. bpo: 23998 -.. date: 9043 -.. nonce: z7mlLW -.. section: C API - -PyImport_ReInitLock() now checks for lock allocation error diff --git a/Misc/NEWS.d/3.5.0b1.rst b/Misc/NEWS.d/3.5.0b1.rst deleted file mode 100644 index edecd79f15d4d3b399270f79ecce677774326a42..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.0b1.rst +++ /dev/null @@ -1,848 +0,0 @@ -.. bpo: 24276 -.. date: 9197 -.. nonce: awsxJJ -.. release date: 2015-05-24 -.. section: Core and Builtins - -Fixed optimization of property descriptor getter. - -.. - -.. bpo: 24268 -.. date: 9196 -.. nonce: nS7uea -.. section: Core and Builtins - -PEP 489: Multi-phase extension module initialization. Patch by Petr -Viktorin. - -.. - -.. bpo: 23955 -.. date: 9195 -.. nonce: hBHSaU -.. section: Core and Builtins - -Add pyvenv.cfg option to suppress registry/environment lookup for generating -sys.path on Windows. - -.. - -.. bpo: 24257 -.. date: 9194 -.. nonce: UBxshR -.. section: Core and Builtins - -Fixed system error in the comparison of faked types.SimpleNamespace. - -.. - -.. bpo: 22939 -.. date: 9193 -.. nonce: DWA9ls -.. section: Core and Builtins - -Fixed integer overflow in iterator object. Patch by Clement Rouault. - -.. - -.. bpo: 23985 -.. date: 9192 -.. nonce: eezPxO -.. section: Core and Builtins - -Fix a possible buffer overrun when deleting a slice from the front of a -bytearray and then appending some other bytes data. - -.. - -.. bpo: 24102 -.. date: 9191 -.. nonce: 9T6h3m -.. section: Core and Builtins - -Fixed exception type checking in standard error handlers. - -.. - -.. bpo: 15027 -.. date: 9190 -.. nonce: wi9sCd -.. section: Core and Builtins - -The UTF-32 encoder is now 3x to 7x faster. - -.. - -.. bpo: 23290 -.. date: 9189 -.. nonce: 57aqLU -.. section: Core and Builtins - -Optimize set_merge() for cases where the target is empty. (Contributed by -Serhiy Storchaka.) - -.. - -.. bpo: 2292 -.. date: 9188 -.. nonce: h4sibO -.. section: Core and Builtins - -PEP 448: Additional Unpacking Generalizations. - -.. - -.. bpo: 24096 -.. date: 9187 -.. nonce: a_Rap7 -.. section: Core and Builtins - -Make warnings.warn_explicit more robust against mutation of the -warnings.filters list. - -.. - -.. bpo: 23996 -.. date: 9186 -.. nonce: znqcT8 -.. section: Core and Builtins - -Avoid a crash when a delegated generator raises an unnormalized -StopIteration exception. Patch by Stefan Behnel. - -.. - -.. bpo: 23910 -.. date: 9185 -.. nonce: _gDzaj -.. section: Core and Builtins - -Optimize property() getter calls. Patch by Joe Jevnik. - -.. - -.. bpo: 23911 -.. date: 9184 -.. nonce: 0FnTHk -.. section: Core and Builtins - -Move path-based importlib bootstrap code to a separate frozen module. - -.. - -.. bpo: 24192 -.. date: 9183 -.. nonce: 6ZxJ_R -.. section: Core and Builtins - -Fix namespace package imports. - -.. - -.. bpo: 24022 -.. date: 9182 -.. nonce: 1l8YBm -.. section: Core and Builtins - -Fix tokenizer crash when processing undecodable source code. - -.. - -.. bpo: 9951 -.. date: 9181 -.. nonce: wGztNC -.. section: Core and Builtins - -Added a hex() method to bytes, bytearray, and memoryview. - -.. - -.. bpo: 22906 -.. date: 9180 -.. nonce: WN_kQ6 -.. section: Core and Builtins - -PEP 479: Change StopIteration handling inside generators. - -.. - -.. bpo: 24017 -.. date: 9179 -.. nonce: QJa1SC -.. section: Core and Builtins - -PEP 492: Coroutines with async and await syntax. - -.. - -.. bpo: 14373 -.. date: 9178 -.. nonce: 0sk6kE -.. section: Library - -Added C implementation of functools.lru_cache(). Based on patches by Matt -Joiner and Alexey Kachayev. - -.. - -.. bpo: 24230 -.. date: 9177 -.. nonce: b-kgme -.. section: Library - -The tempfile module now accepts bytes for prefix, suffix and dir parameters -and returns bytes in such situations (matching the os module APIs). - -.. - -.. bpo: 22189 -.. date: 9176 -.. nonce: 8epgat -.. section: Library - -collections.UserString now supports __getnewargs__(), __rmod__(), -casefold(), format_map(), isprintable(), and maketrans(). Patch by Joe -Jevnik. - -.. - -.. bpo: 24244 -.. date: 9175 -.. nonce: OKE_3R -.. section: Library - -Prevents termination when an invalid format string is encountered on Windows -in strftime. - -.. - -.. bpo: 23973 -.. date: 9174 -.. nonce: EK6awi -.. section: Library - -PEP 484: Add the typing module. - -.. - -.. bpo: 23086 -.. date: 9173 -.. nonce: Aix6Nv -.. section: Library - -The collections.abc.Sequence() abstract base class added *start* and *stop* -parameters to the index() mixin. Patch by Devin Jeanpierre. - -.. - -.. bpo: 20035 -.. date: 9172 -.. nonce: UNZzw6 -.. section: Library - -Replaced the ``tkinter._fix`` module used for setting up the Tcl/Tk -environment on Windows with a private function in the ``_tkinter`` module -that makes no permanent changes to the environment. - -.. - -.. bpo: 24257 -.. date: 9171 -.. nonce: L_efq0 -.. section: Library - -Fixed segmentation fault in sqlite3.Row constructor with faked cursor type. - -.. - -.. bpo: 15836 -.. date: 9170 -.. nonce: gU3Rmx -.. section: Library - -assertRaises(), assertRaisesRegex(), assertWarns() and assertWarnsRegex() -assertments now check the type of the first argument to prevent possible -user error. Based on patch by Daniel Wagner-Hall. - -.. - -.. bpo: 9858 -.. date: 9169 -.. nonce: uke9pa -.. section: Library - -Add missing method stubs to _io.RawIOBase. Patch by Laura Rupprecht. - -.. - -.. bpo: 22955 -.. date: 9168 -.. nonce: Jw_B9_ -.. section: Library - -attrgetter, itemgetter and methodcaller objects in the operator module now -support pickling. Added readable and evaluable repr for these objects. -Based on patch by Josh Rosenberg. - -.. - -.. bpo: 22107 -.. date: 9167 -.. nonce: 2F8k4W -.. section: Library - -tempfile.gettempdir() and tempfile.mkdtemp() now try again when a directory -with the chosen name already exists on Windows as well as on Unix. -tempfile.mkstemp() now fails early if parent directory is not valid (not -exists or is a file) on Windows. - -.. - -.. bpo: 23780 -.. date: 9166 -.. nonce: jFPVcN -.. section: Library - -Improved error message in os.path.join() with single argument. - -.. - -.. bpo: 6598 -.. date: 9165 -.. nonce: JdZNDt -.. section: Library - -Increased time precision and random number range in email.utils.make_msgid() -to strengthen the uniqueness of the message ID. - -.. - -.. bpo: 24091 -.. date: 9164 -.. nonce: Jw0-wj -.. section: Library - -Fixed various crashes in corner cases in C implementation of ElementTree. - -.. - -.. bpo: 21931 -.. date: 9163 -.. nonce: t6lGxY -.. section: Library - -msilib.FCICreate() now raises TypeError in the case of a bad argument -instead of a ValueError with a bogus FCI error number. Patch by Jeffrey -Armstrong. - -.. - -.. bpo: 13866 -.. date: 9162 -.. nonce: n5NAj0 -.. section: Library - -*quote_via* argument added to urllib.parse.urlencode. - -.. - -.. bpo: 20098 -.. date: 9161 -.. nonce: Y4otaf -.. section: Library - -New mangle_from policy option for email, default True for compat32, but -False for all other policies. - -.. - -.. bpo: 24211 -.. date: 9160 -.. nonce: j3Afpc -.. section: Library - -The email library now supports RFC 6532: it can generate headers using utf-8 -instead of encoded words. - -.. - -.. bpo: 16314 -.. date: 9159 -.. nonce: Xc4d1O -.. section: Library - -Added support for the LZMA compression in distutils. - -.. - -.. bpo: 21804 -.. date: 9158 -.. nonce: lEhTlc -.. section: Library - -poplib now supports RFC 6856 (UTF8). - -.. - -.. bpo: 18682 -.. date: 9157 -.. nonce: 6Pnfte -.. section: Library - -Optimized pprint functions for builtin scalar types. - -.. - -.. bpo: 22027 -.. date: 9156 -.. nonce: _aeUQS -.. section: Library - -smtplib now supports RFC 6531 (SMTPUTF8). - -.. - -.. bpo: 23488 -.. date: 9155 -.. nonce: 7gs3Cm -.. section: Library - -Random generator objects now consume 2x less memory on 64-bit. - -.. - -.. bpo: 1322 -.. date: 9154 -.. nonce: 495nFL -.. section: Library - -platform.dist() and platform.linux_distribution() functions are now -deprecated. Initial patch by Vajrasky Kok. - -.. - -.. bpo: 22486 -.. date: 9153 -.. nonce: Yxov5m -.. section: Library - -Added the math.gcd() function. The fractions.gcd() function now is -deprecated. Based on patch by Mark Dickinson. - -.. - -.. bpo: 24064 -.. date: 9152 -.. nonce: zXC7OL -.. section: Library - -Property() docstrings are now writeable. (Patch by Berker Peksag.) - -.. - -.. bpo: 22681 -.. date: 9151 -.. nonce: 2rIoA2 -.. section: Library - -Added support for the koi8_t encoding. - -.. - -.. bpo: 22682 -.. date: 9150 -.. nonce: cP4i3L -.. section: Library - -Added support for the kz1048 encoding. - -.. - -.. bpo: 23796 -.. date: 9149 -.. nonce: JJmUnc -.. section: Library - -peek and read1 methods of BufferedReader now raise ValueError if they called -on a closed object. Patch by John Hergenroeder. - -.. - -.. bpo: 21795 -.. date: 9148 -.. nonce: BDLMS4 -.. section: Library - -smtpd now supports the 8BITMIME extension whenever the new *decode_data* -constructor argument is set to False. - -.. - -.. bpo: 24155 -.. date: 9147 -.. nonce: FZx5c2 -.. section: Library - -optimize heapq.heapify() for better cache performance when heapifying large -lists. - -.. - -.. bpo: 21800 -.. date: 9146 -.. nonce: evGSKc -.. section: Library - -imaplib now supports RFC 5161 (enable), RFC 6855 (utf8/internationalized -email) and automatically encodes non-ASCII usernames and passwords to UTF8. - -.. - -.. bpo: 20274 -.. date: 9145 -.. nonce: uVHogg -.. section: Library - -When calling a _sqlite.Connection, it now complains if passed any keyword -arguments. Previously it silently ignored them. - -.. - -.. bpo: 20274 -.. date: 9144 -.. nonce: hBst4M -.. section: Library - -Remove ignored and erroneous "kwargs" parameters from three METH_VARARGS -methods on _sqlite.Connection. - -.. - -.. bpo: 24134 -.. date: 9143 -.. nonce: Ajw0S- -.. section: Library - -assertRaises(), assertRaisesRegex(), assertWarns() and assertWarnsRegex() -checks now emits a deprecation warning when callable is None or keyword -arguments except msg is passed in the context manager mode. - -.. - -.. bpo: 24018 -.. date: 9142 -.. nonce: hk7Rcn -.. section: Library - -Add a collections.abc.Generator abstract base class. Contributed by Stefan -Behnel. - -.. - -.. bpo: 23880 -.. date: 9141 -.. nonce: QtKupC -.. section: Library - -Tkinter's getint() and getdouble() now support Tcl_Obj. Tkinter's -getdouble() now supports any numbers (in particular int). - -.. - -.. bpo: 22619 -.. date: 9140 -.. nonce: 1gJEqV -.. section: Library - -Added negative limit support in the traceback module. Based on patch by -Dmitry Kazakov. - -.. - -.. bpo: 24094 -.. date: 9139 -.. nonce: 7T-u7k -.. section: Library - -Fix possible crash in json.encode with poorly behaved dict subclasses. - -.. - -.. bpo: 9246 -.. date: 9138 -.. nonce: oM-Ikk -.. section: Library - -On POSIX, os.getcwd() now supports paths longer than 1025 bytes. Patch -written by William Orr. - -.. - -.. bpo: 17445 -.. date: 9137 -.. nonce: Z-QYh5 -.. section: Library - -add difflib.diff_bytes() to support comparison of byte strings (fixes a -regression from Python 2). - -.. - -.. bpo: 23917 -.. date: 9136 -.. nonce: uMVPV7 -.. section: Library - -Fall back to sequential compilation when ProcessPoolExecutor doesn't exist. -Patch by Claudiu Popa. - -.. - -.. bpo: 23008 -.. date: 9135 -.. nonce: OZFCd- -.. section: Library - -Fixed resolving attributes with boolean value is False in pydoc. - -.. - -.. bpo: 0 -.. date: 9134 -.. nonce: 6tJNf2 -.. section: Library - -Fix asyncio issue 235: LifoQueue and PriorityQueue's put didn't increment -unfinished tasks (this bug was introduced when JoinableQueue was merged with -Queue). - -.. - -.. bpo: 23908 -.. date: 9133 -.. nonce: ATdNG- -.. section: Library - -os functions now reject paths with embedded null character on Windows -instead of silently truncating them. - -.. - -.. bpo: 23728 -.. date: 9132 -.. nonce: YBmQmV -.. section: Library - -binascii.crc_hqx() could return an integer outside of the range 0-0xffff for -empty data. - -.. - -.. bpo: 23887 -.. date: 9131 -.. nonce: _XpjPN -.. section: Library - -urllib.error.HTTPError now has a proper repr() representation. Patch by -Berker Peksag. - -.. - -.. bpo: 0 -.. date: 9130 -.. nonce: MjNdSC -.. section: Library - -asyncio: New event loop APIs: set_task_factory() and get_task_factory(). - -.. - -.. bpo: 0 -.. date: 9129 -.. nonce: rVcHXp -.. section: Library - -asyncio: async() function is deprecated in favour of ensure_future(). - -.. - -.. bpo: 24178 -.. date: 9128 -.. nonce: -enO4y -.. section: Library - -asyncio.Lock, Condition, Semaphore, and BoundedSemaphore support new 'async -with' syntax. Contributed by Yury Selivanov. - -.. - -.. bpo: 24179 -.. date: 9127 -.. nonce: wDy_WZ -.. section: Library - -Support 'async for' for asyncio.StreamReader. Contributed by Yury Selivanov. - -.. - -.. bpo: 24184 -.. date: 9126 -.. nonce: El74TU -.. section: Library - -Add AsyncIterator and AsyncIterable ABCs to collections.abc. Contributed by -Yury Selivanov. - -.. - -.. bpo: 22547 -.. date: 9125 -.. nonce: _ikCaj -.. section: Library - -Implement informative __repr__ for inspect.BoundArguments. Contributed by -Yury Selivanov. - -.. - -.. bpo: 24190 -.. date: 9124 -.. nonce: 1a3vWW -.. section: Library - -Implement inspect.BoundArgument.apply_defaults() method. Contributed by Yury -Selivanov. - -.. - -.. bpo: 20691 -.. date: 9123 -.. nonce: -raLyf -.. section: Library - -Add 'follow_wrapped' argument to inspect.Signature.from_callable() and -inspect.signature(). Contributed by Yury Selivanov. - -.. - -.. bpo: 24248 -.. date: 9122 -.. nonce: IxWooo -.. section: Library - -Deprecate inspect.Signature.from_function() and -inspect.Signature.from_builtin(). - -.. - -.. bpo: 23898 -.. date: 9121 -.. nonce: OSiZie -.. section: Library - -Fix inspect.classify_class_attrs() to support attributes with overloaded -__eq__ and __bool__. Patch by Mike Bayer. - -.. - -.. bpo: 24298 -.. date: 9120 -.. nonce: u_TaxI -.. section: Library - -Fix inspect.signature() to correctly unwrap wrappers around bound methods. - -.. - -.. bpo: 23184 -.. date: 9119 -.. nonce: G_Cp9v -.. section: IDLE - -remove unused names and imports in idlelib. Initial patch by Al Sweigart. - -.. - -.. bpo: 21520 -.. date: 9118 -.. nonce: FKtvmQ -.. section: Tests - -test_zipfile no longer fails if the word 'bad' appears anywhere in the name -of the current directory. - -.. - -.. bpo: 9517 -.. date: 9117 -.. nonce: W0Ag2V -.. section: Tests - -Move script_helper into the support package. Patch by Christie Wilson. - -.. - -.. bpo: 22155 -.. date: 9116 -.. nonce: 9EbOit -.. section: Documentation - -Add File Handlers subsection with createfilehandler to tkinter doc. Remove -obsolete example from FAQ. Patch by Martin Panter. - -.. - -.. bpo: 24029 -.. date: 9115 -.. nonce: M2Bnks -.. section: Documentation - -Document the name binding behavior for submodule imports. - -.. - -.. bpo: 24077 -.. date: 9114 -.. nonce: 2Og2j- -.. section: Documentation - -Fix typo in man page for -I command option: -s, not -S - -.. - -.. bpo: 24000 -.. date: 9113 -.. nonce: MJyXRr -.. section: Tools/Demos - -Improved Argument Clinic's mapping of converters to legacy "format units". -Updated the documentation to match. - -.. - -.. bpo: 24001 -.. date: 9112 -.. nonce: m74vst -.. section: Tools/Demos - -Argument Clinic converters now use accept={type} instead of types={'type'} -to specify the types the converter accepts. - -.. - -.. bpo: 23330 -.. date: 9111 -.. nonce: LTlKDp -.. section: Tools/Demos - -h2py now supports arbitrary filenames in #include. - -.. - -.. bpo: 24031 -.. date: 9110 -.. nonce: duGo88 -.. section: Tools/Demos - -make patchcheck now supports git checkouts, too. diff --git a/Misc/NEWS.d/3.5.0b2.rst b/Misc/NEWS.d/3.5.0b2.rst deleted file mode 100644 index 43bf4a8b1150be84a6aef746697d3f023423af4f..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.0b2.rst +++ /dev/null @@ -1,104 +0,0 @@ -.. bpo: 24284 -.. date: 9208 -.. nonce: NvtEnc -.. release date: 2015-05-31 -.. section: Core and Builtins - -The startswith and endswith methods of the str class no longer return True -when finding the empty string and the indexes are completely out of range. - -.. - -.. bpo: 24115 -.. date: 9207 -.. nonce: y9e_MO -.. section: Core and Builtins - -Update uses of PyObject_IsTrue(), PyObject_Not(), PyObject_IsInstance(), -PyObject_RichCompareBool() and _PyDict_Contains() to check for and handle -errors correctly. - -.. - -.. bpo: 24328 -.. date: 9206 -.. nonce: 5gL8or -.. section: Core and Builtins - -Fix importing one character extension modules. - -.. - -.. bpo: 11205 -.. date: 9205 -.. nonce: bikrRP -.. section: Core and Builtins - -In dictionary displays, evaluate the key before the value. - -.. - -.. bpo: 24285 -.. date: 9204 -.. nonce: wvJumr -.. section: Core and Builtins - -Fixed regression that prevented importing extension modules from inside -packages. Patch by Petr Viktorin. - -.. - -.. bpo: 23247 -.. date: 9203 -.. nonce: nN-K74 -.. section: Library - -Fix a crash in the StreamWriter.reset() of CJK codecs. - -.. - -.. bpo: 24270 -.. date: 9202 -.. nonce: M2rJNs -.. section: Library - -Add math.isclose() and cmath.isclose() functions as per :pep:`485`. Contributed -by Chris Barker and Tal Einat. - -.. - -.. bpo: 5633 -.. date: 9201 -.. nonce: JNzKZq -.. section: Library - -Fixed timeit when the statement is a string and the setup is not. - -.. - -.. bpo: 24326 -.. date: 9200 -.. nonce: 4t_6Gy -.. section: Library - -Fixed audioop.ratecv() with non-default weightB argument. Original patch by -David Moore. - -.. - -.. bpo: 16991 -.. date: 9199 -.. nonce: 19_Zmj -.. section: Library - -Add a C implementation of OrderedDict. - -.. - -.. bpo: 23934 -.. date: 9198 -.. nonce: esb-45 -.. section: Library - -Fix inspect.signature to fail correctly for builtin types lacking signature -information. Initial patch by James Powell. diff --git a/Misc/NEWS.d/3.5.0b3.rst b/Misc/NEWS.d/3.5.0b3.rst deleted file mode 100644 index 742814b75cf44931d6eab7bd873eacea916b9bc1..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.0b3.rst +++ /dev/null @@ -1,273 +0,0 @@ -.. bpo: 24467 -.. date: 9236 -.. nonce: BAJ80- -.. release date: 2015-07-05 -.. section: Core and Builtins - -Fixed possible buffer over-read in bytearray. The bytearray object now -always allocates place for trailing null byte and it's buffer now is always -null-terminated. - -.. - -.. bpo: 0 -.. date: 9235 -.. nonce: 944IUY -.. section: Core and Builtins - -Upgrade to Unicode 8.0.0. - -.. - -.. bpo: 24345 -.. date: 9234 -.. nonce: fVcTaB -.. section: Core and Builtins - -Add Py_tp_finalize slot for the stable ABI. - -.. - -.. bpo: 24400 -.. date: 9233 -.. nonce: 2mNeD8 -.. section: Core and Builtins - -Introduce a distinct type for :pep:`492` coroutines; add types.CoroutineType, -inspect.getcoroutinestate, inspect.getcoroutinelocals; coroutines no longer -use CO_GENERATOR flag; sys.set_coroutine_wrapper works only for 'async def' -coroutines; inspect.iscoroutine no longer uses collections.abc.Coroutine, -it's intended to test for pure 'async def' coroutines only; add new opcode: -GET_YIELD_FROM_ITER; fix generators wrapper used in types.coroutine to be -instance of collections.abc.Generator; collections.abc.Awaitable and -collections.abc.Coroutine can no longer be used to detect generator-based -coroutines--use inspect.isawaitable instead. - -.. - -.. bpo: 24450 -.. date: 9232 -.. nonce: lF0S5c -.. section: Core and Builtins - -Add gi_yieldfrom to generators and cr_await to coroutines. Contributed by -Benno Leslie and Yury Selivanov. - -.. - -.. bpo: 19235 -.. date: 9231 -.. nonce: 0kW4n5 -.. section: Core and Builtins - -Add new RecursionError exception. Patch by Georg Brandl. - -.. - -.. bpo: 21750 -.. date: 9230 -.. nonce: _Ycvgi -.. section: Library - -mock_open.read_data can now be read from each instance, as it could in -Python 3.3. - -.. - -.. bpo: 24552 -.. date: 9229 -.. nonce: VTO6sf -.. section: Library - -Fix use after free in an error case of the _pickle module. - -.. - -.. bpo: 24514 -.. date: 9228 -.. nonce: _xRb2r -.. section: Library - -tarfile now tolerates number fields consisting of only whitespace. - -.. - -.. bpo: 19176 -.. date: 9227 -.. nonce: 8V6nOK -.. section: Library - -Fixed doctype() related bugs in C implementation of ElementTree. A -deprecation warning no longer issued by XMLParser subclass with default -doctype() method. Direct call of doctype() now issues a warning. Parser's -doctype() now is not called if target's doctype() is called. Based on patch -by Martin Panter. - -.. - -.. bpo: 20387 -.. date: 9226 -.. nonce: aAbWbQ -.. section: Library - -Restore semantic round-trip correctness in tokenize/untokenize for -tab-indented blocks. - -.. - -.. bpo: 24456 -.. date: 9225 -.. nonce: yYSd2u -.. section: Library - -Fixed possible buffer over-read in adpcm2lin() and lin2adpcm() functions of -the audioop module. - -.. - -.. bpo: 24336 -.. date: 9224 -.. nonce: 4a5y1m -.. section: Library - -The contextmanager decorator now works with functions with keyword arguments -called "func" and "self". Patch by Martin Panter. - -.. - -.. bpo: 24522 -.. date: 9223 -.. nonce: PkcqCA -.. section: Library - -Fix possible integer overflow in json accelerator module. - -.. - -.. bpo: 24489 -.. date: 9222 -.. nonce: GJnMcW -.. section: Library - -ensure a previously set C errno doesn't disturb cmath.polar(). - -.. - -.. bpo: 24408 -.. date: 9221 -.. nonce: vPb5UK -.. section: Library - -Fixed AttributeError in measure() and metrics() methods of tkinter.Font. - -.. - -.. bpo: 14373 -.. date: 9220 -.. nonce: CTYZ4J -.. section: Library - -C implementation of functools.lru_cache() now can be used with methods. - -.. - -.. bpo: 24347 -.. date: 9219 -.. nonce: CPPDb8 -.. section: Library - -Set KeyError if PyDict_GetItemWithError returns NULL. - -.. - -.. bpo: 24348 -.. date: 9218 -.. nonce: U11rhr -.. section: Library - -Drop superfluous incref/decref. - -.. - -.. bpo: 24359 -.. date: 9217 -.. nonce: -IRNG9 -.. section: Library - -Check for changed OrderedDict size during iteration. - -.. - -.. bpo: 24368 -.. date: 9216 -.. nonce: 550kDT -.. section: Library - -Support keyword arguments in OrderedDict methods. - -.. - -.. bpo: 24362 -.. date: 9215 -.. nonce: cHYce5 -.. section: Library - -Simplify the C OrderedDict fast nodes resize logic. - -.. - -.. bpo: 24377 -.. date: 9214 -.. nonce: Gp1Bqr -.. section: Library - -Fix a ref leak in OrderedDict.__repr__. - -.. - -.. bpo: 24369 -.. date: 9213 -.. nonce: qFl7lZ -.. section: Library - -Defend against key-changes during iteration. - -.. - -.. bpo: 24373 -.. date: 9212 -.. nonce: 6TL2XG -.. section: Tests - -_testmultiphase and xxlimited now use tp_traverse and tp_finalize to avoid -reference leaks encountered when combining tp_dealloc with PyType_FromSpec -(see issue #16690 for details) - -.. - -.. bpo: 24458 -.. date: 9211 -.. nonce: 1egApX -.. section: Documentation - -Update documentation to cover multi-phase initialization for extension -modules (PEP 489). Patch by Petr Viktorin. - -.. - -.. bpo: 24351 -.. date: 9210 -.. nonce: XeSVl5 -.. section: Documentation - -Clarify what is meant by "identifier" in the context of string.Template -instances. - -.. - -.. bpo: 24432 -.. date: 9209 -.. nonce: IvUSiN -.. section: Build - -Update Windows builds and OS X 10.5 installer to use OpenSSL 1.0.2c. diff --git a/Misc/NEWS.d/3.5.0b4.rst b/Misc/NEWS.d/3.5.0b4.rst deleted file mode 100644 index 2b1b98a4316fc159c7314257212a2b90c24834d6..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.0b4.rst +++ /dev/null @@ -1,255 +0,0 @@ -.. bpo: 23573 -.. date: 9263 -.. nonce: HdJPs7 -.. release date: 2015-07-26 -.. section: Core and Builtins - -Restored optimization of bytes.rfind() and bytearray.rfind() for single-byte -argument on Linux. - -.. - -.. bpo: 24569 -.. date: 9262 -.. nonce: bqh6PQ -.. section: Core and Builtins - -Make :pep:`448` dictionary evaluation more consistent. - -.. - -.. bpo: 24583 -.. date: 9261 -.. nonce: Ooq0Tn -.. section: Core and Builtins - -Fix crash when set is mutated while being updated. - -.. - -.. bpo: 24407 -.. date: 9260 -.. nonce: GmCBB3 -.. section: Core and Builtins - -Fix crash when dict is mutated while being updated. - -.. - -.. bpo: 24619 -.. date: 9259 -.. nonce: cnfZGo -.. section: Core and Builtins - -New approach for tokenizing async/await. As a consequence, it is now -possible to have one-line 'async def foo(): await ..' functions. - -.. - -.. bpo: 24687 -.. date: 9258 -.. nonce: 0UaXFe -.. section: Core and Builtins - -Plug refleak on SyntaxError in function parameters annotations. - -.. - -.. bpo: 15944 -.. date: 9257 -.. nonce: 4GuwqX -.. section: Core and Builtins - -memoryview: Allow arbitrary formats when casting to bytes. Patch by Martin -Panter. - -.. - -.. bpo: 23441 -.. date: 9256 -.. nonce: JXt2Yt -.. section: Library - -rcompleter now prints a tab character instead of displaying possible -completions for an empty word. Initial patch by Martin Sekera. - -.. - -.. bpo: 24683 -.. date: 9255 -.. nonce: aJdWEv -.. section: Library - -Fixed crashes in _json functions called with arguments of inappropriate -type. - -.. - -.. bpo: 21697 -.. date: 9254 -.. nonce: jpATha -.. section: Library - -shutil.copytree() now correctly handles symbolic links that point to -directories. Patch by Eduardo Seabra and Thomas Kluyver. - -.. - -.. bpo: 14373 -.. date: 9253 -.. nonce: Je0yDg -.. section: Library - -Fixed segmentation fault when gc.collect() is called during constructing -lru_cache (C implementation). - -.. - -.. bpo: 24695 -.. date: 9252 -.. nonce: QjZzFb -.. section: Library - -Fix a regression in traceback.print_exception(). If exc_traceback is None -we shouldn't print a traceback header like described in the documentation. - -.. - -.. bpo: 24620 -.. date: 9251 -.. nonce: rrnxB- -.. section: Library - -Random.setstate() now validates the value of state last element. - -.. - -.. bpo: 22485 -.. date: 9250 -.. nonce: HvJf6T -.. section: Library - -Fixed an issue that caused `inspect.getsource` to return incorrect results -on nested functions. - -.. - -.. bpo: 22153 -.. date: 9249 -.. nonce: 6n6yld -.. section: Library - -Improve unittest docs. Patch from Martin Panter and evilzero. - -.. - -.. bpo: 24580 -.. date: 9248 -.. nonce: AGi4Gm -.. section: Library - -Symbolic group references to open group in re patterns now are explicitly -forbidden as well as numeric group references. - -.. - -.. bpo: 24206 -.. date: 9247 -.. nonce: ffkVHH -.. section: Library - -Fixed __eq__ and __ne__ methods of inspect classes. - -.. - -.. bpo: 24631 -.. date: 9246 -.. nonce: uljPxM -.. section: Library - -Fixed regression in the timeit module with multiline setup. - -.. - -.. bpo: 18622 -.. date: 9245 -.. nonce: i6nCCW -.. section: Library - -unittest.mock.mock_open().reset_mock would recurse infinitely. Patch from -Nicola Palumbo and Laurent De Buyst. - -.. - -.. bpo: 23661 -.. date: 9244 -.. nonce: 5VHJmh -.. section: Library - -unittest.mock side_effects can now be exceptions again. This was a -regression vs Python 3.4. Patch from Ignacio Rossi - -.. - -.. bpo: 24608 -.. date: 9243 -.. nonce: 0TndL0 -.. section: Library - -chunk.Chunk.read() now always returns bytes, not str. - -.. - -.. bpo: 18684 -.. date: 9242 -.. nonce: S2es0F -.. section: Library - -Fixed reading out of the buffer in the re module. - -.. - -.. bpo: 24259 -.. date: 9241 -.. nonce: vMAi1A -.. section: Library - -tarfile now raises a ReadError if an archive is truncated inside a data -segment. - -.. - -.. bpo: 15014 -.. date: 9240 -.. nonce: hwXwCH -.. section: Library - -SMTP.auth() and SMTP.login() now support RFC 4954's optional -initial-response argument to the SMTP AUTH command. - -.. - -.. bpo: 24669 -.. date: 9239 -.. nonce: kFThK0 -.. section: Library - -Fix inspect.getsource() for 'async def' functions. Patch by Kai Groner. - -.. - -.. bpo: 24688 -.. date: 9238 -.. nonce: -yWfcO -.. section: Library - -ast.get_docstring() for 'async def' functions. - -.. - -.. bpo: 24603 -.. date: 9237 -.. nonce: PyHyF5 -.. section: Build - -Update Windows builds and OS X 10.5 installer to use OpenSSL 1.0.2d. diff --git a/Misc/NEWS.d/3.5.0rc1.rst b/Misc/NEWS.d/3.5.0rc1.rst deleted file mode 100644 index 1fb9bc6c04da38f6b7b26ef17102e8b7113b3790..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.0rc1.rst +++ /dev/null @@ -1,241 +0,0 @@ -.. bpo: 24667 -.. date: 9288 -.. nonce: tdwszf -.. release date: 2015-08-09 -.. section: Core and Builtins - -Resize odict in all cases that the underlying dict resizes. - -.. - -.. bpo: 24824 -.. date: 9287 -.. nonce: Eoc4lq -.. section: Library - -Signatures of codecs.encode() and codecs.decode() now are compatible with -pydoc. - -.. - -.. bpo: 24634 -.. date: 9286 -.. nonce: 7bnVgr -.. section: Library - -Importing uuid should not try to load libc on Windows - -.. - -.. bpo: 24798 -.. date: 9285 -.. nonce: zDXL5R -.. section: Library - -_msvccompiler.py doesn't properly support manifests - -.. - -.. bpo: 4395 -.. date: 9284 -.. nonce: JpT0k7 -.. section: Library - -Better testing and documentation of binary operators. Patch by Martin -Panter. - -.. - -.. bpo: 23973 -.. date: 9283 -.. nonce: wT59Vh -.. section: Library - -Update typing.py from GitHub repo. - -.. - -.. bpo: 23004 -.. date: 9282 -.. nonce: xswcPm -.. section: Library - -mock_open() now reads binary data correctly when the type of read_data is -bytes. Initial patch by Aaron Hill. - -.. - -.. bpo: 23888 -.. date: 9281 -.. nonce: 7gw4oO -.. section: Library - -Handle fractional time in cookie expiry. Patch by ssh. - -.. - -.. bpo: 23652 -.. date: 9280 -.. nonce: DKQ_7t -.. section: Library - -Make it possible to compile the select module against the libc headers from -the Linux Standard Base, which do not include some EPOLL macros. Patch by -Matt Frank. - -.. - -.. bpo: 22932 -.. date: 9279 -.. nonce: mPclSJ -.. section: Library - -Fix timezones in email.utils.formatdate. Patch from Dmitry Shachnev. - -.. - -.. bpo: 23779 -.. date: 9278 -.. nonce: ET4JJP -.. section: Library - -imaplib raises TypeError if authenticator tries to abort. Patch from Craig -Holmquist. - -.. - -.. bpo: 23319 -.. date: 9277 -.. nonce: FXyUH- -.. section: Library - -Fix ctypes.BigEndianStructure, swap correctly bytes. Patch written by -Matthieu Gautier. - -.. - -.. bpo: 23254 -.. date: 9276 -.. nonce: zNiy1X -.. section: Library - -Document how to close the TCPServer listening socket. Patch from Martin -Panter. - -.. - -.. bpo: 19450 -.. date: 9275 -.. nonce: VG7T-L -.. section: Library - -Update Windows and OS X installer builds to use SQLite 3.8.11. - -.. - -.. bpo: 17527 -.. date: 9274 -.. nonce: ve9fyw -.. section: Library - -Add PATCH to wsgiref.validator. Patch from Luca Sbardella. - -.. - -.. bpo: 24791 -.. date: 9273 -.. nonce: Ok-3nA -.. section: Library - -Fix grammar regression for call syntax: 'g(\*a or b)'. - -.. - -.. bpo: 23672 -.. date: 9272 -.. nonce: 8td2se -.. section: IDLE - -Allow Idle to edit and run files with astral chars in name. Patch by Mohd -Sanad Zaki Rizvi. - -.. - -.. bpo: 24745 -.. date: 9271 -.. nonce: edbziT -.. section: IDLE - -Idle editor default font. Switch from Courier to platform-sensitive -TkFixedFont. This should not affect current customized font selections. If -there is a problem, edit $HOME/.idlerc/config-main.cfg and remove 'fontxxx' -entries from [Editor Window]. Patch by Mark Roseman. - -.. - -.. bpo: 21192 -.. date: 9270 -.. nonce: CdbipH -.. section: IDLE - -Idle editor. When a file is run, put its name in the restart bar. Do not -print false prompts. Original patch by Adnan Umer. - -.. - -.. bpo: 13884 -.. date: 9269 -.. nonce: vVcO1E -.. section: IDLE - -Idle menus. Remove tearoff lines. Patch by Roger Serwy. - -.. - -.. bpo: 24129 -.. date: 9268 -.. nonce: Imr54z -.. section: Documentation - -Clarify the reference documentation for name resolution. This includes -removing the assumption that readers will be familiar with the name -resolution scheme Python used prior to the introduction of lexical scoping -for function namespaces. Patch by Ivan Levkivskyi. - -.. - -.. bpo: 20769 -.. date: 9267 -.. nonce: ZUc9z9 -.. section: Documentation - -Improve reload() docs. Patch by Dorian Pula. - -.. - -.. bpo: 23589 -.. date: 9266 -.. nonce: rjU421 -.. section: Documentation - -Remove duplicate sentence from the FAQ. Patch by Yongzhi Pan. - -.. - -.. bpo: 24729 -.. date: 9265 -.. nonce: PH3A9p -.. section: Documentation - -Correct IO tutorial to match implementation regarding encoding parameter to -open function. - -.. - -.. bpo: 24751 -.. date: 9264 -.. nonce: pL2pbj -.. section: Tests - -When running regrtest with the ``-w`` command line option, a test run is no -longer marked as a failure if all tests succeed when re-run. diff --git a/Misc/NEWS.d/3.5.0rc2.rst b/Misc/NEWS.d/3.5.0rc2.rst deleted file mode 100644 index 2a8a52a13ce9e426c0eacd3f5a235d9f7a591818..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.0rc2.rst +++ /dev/null @@ -1,56 +0,0 @@ -.. bpo: 24769 -.. date: 9294 -.. nonce: XgRA0n -.. release date: 2015-08-25 -.. section: Core and Builtins - -Interpreter now starts properly when dynamic loading is disabled. Patch by -Petr Viktorin. - -.. - -.. bpo: 21167 -.. date: 9293 -.. nonce: uom-Dq -.. section: Core and Builtins - -NAN operations are now handled correctly when python is compiled with ICC -even if -fp-model strict is not specified. - -.. - -.. bpo: 24492 -.. date: 9292 -.. nonce: LKDAIu -.. section: Core and Builtins - -A "package" lacking a __name__ attribute when trying to perform a ``from .. -import ...`` statement will trigger an ImportError instead of an -AttributeError. - -.. - -.. bpo: 24847 -.. date: 9291 -.. nonce: SHiiO_ -.. section: Library - -Removes vcruntime140.dll dependency from Tcl/Tk. - -.. - -.. bpo: 24839 -.. date: 9290 -.. nonce: 7_iQZl -.. section: Library - -platform._syscmd_ver raises DeprecationWarning - -.. - -.. bpo: 24867 -.. date: 9289 -.. nonce: rxJIl7 -.. section: Library - -Fix Task.get_stack() for 'async def' coroutines diff --git a/Misc/NEWS.d/3.5.0rc3.rst b/Misc/NEWS.d/3.5.0rc3.rst deleted file mode 100644 index 2f770a01610e8806562ff13a6df0ea494344cca4..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.0rc3.rst +++ /dev/null @@ -1,76 +0,0 @@ -.. bpo: 24305 -.. date: 9302 -.. nonce: QeF4A8 -.. release date: 2015-09-07 -.. section: Core and Builtins - -Prevent import subsystem stack frames from being counted by the -warnings.warn(stacklevel=) parameter. - -.. - -.. bpo: 24912 -.. date: 9301 -.. nonce: ubSi5J -.. section: Core and Builtins - -Prevent __class__ assignment to immutable built-in objects. - -.. - -.. bpo: 24975 -.. date: 9300 -.. nonce: 2gLdfN -.. section: Core and Builtins - -Fix AST compilation for :pep:`448` syntax. - -.. - -.. bpo: 24917 -.. date: 9299 -.. nonce: xaQocz -.. section: Library - -time_strftime() buffer over-read. - -.. - -.. bpo: 24748 -.. date: 9298 -.. nonce: 83NuO8 -.. section: Library - -To resolve a compatibility problem found with py2exe and pywin32, -imp.load_dynamic() once again ignores previously loaded modules to support -Python modules replacing themselves with extension modules. Patch by Petr -Viktorin. - -.. - -.. bpo: 24635 -.. date: 9297 -.. nonce: EiJPPf -.. section: Library - -Fixed a bug in typing.py where isinstance([], typing.Iterable) would return -True once, then False on subsequent calls. - -.. - -.. bpo: 24989 -.. date: 9296 -.. nonce: 9BJLiy -.. section: Library - -Fixed buffer overread in BytesIO.readline() if a position is set beyond -size. Based on patch by John Leitch. - -.. - -.. bpo: 24913 -.. date: 9295 -.. nonce: p2ZAJ4 -.. section: Library - -Fix overrun error in deque.index(). Found by John Leitch and Bryce Darling. diff --git a/Misc/NEWS.d/3.5.0rc4.rst b/Misc/NEWS.d/3.5.0rc4.rst deleted file mode 100644 index a6d9454f198b00387d7fd8cb44a9ca9d011a9279..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.0rc4.rst +++ /dev/null @@ -1,17 +0,0 @@ -.. bpo: 25029 -.. date: 9304 -.. nonce: Zf97rk -.. release date: 2015-09-09 -.. section: Library - -Fixes MemoryError in test_strptime. - -.. - -.. bpo: 25027 -.. date: 9303 -.. nonce: Zaib78 -.. section: Build - -Reverts partial-static build options and adds vcruntime140.dll to Windows -installation. diff --git a/Misc/NEWS.d/3.5.1.rst b/Misc/NEWS.d/3.5.1.rst deleted file mode 100644 index 45df6f9bafd9225c3a90c7000fbf279407c1ee9f..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.1.rst +++ /dev/null @@ -1,17 +0,0 @@ -.. bpo: 25709 -.. date: 9452 -.. nonce: OPX2TS -.. release date: 2015-12-06 -.. section: Core and Builtins - -Fixed problem with in-place string concatenation and utf-8 cache. - -.. - -.. bpo: 25715 -.. date: 9451 -.. nonce: 3LLYLj -.. section: Windows - -Python 3.5.1 installer shows wrong upgrade path and incorrect logic for -launcher detection. diff --git a/Misc/NEWS.d/3.5.1rc1.rst b/Misc/NEWS.d/3.5.1rc1.rst deleted file mode 100644 index d06817ccb950ec179cf3840455688a55bfd9f740..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.1rc1.rst +++ /dev/null @@ -1,1451 +0,0 @@ -.. bpo: 25630 -.. date: 9450 -.. nonce: ZxzcoY -.. release date: 2015-11-22 -.. section: Core and Builtins - -Fix a possible segfault during argument parsing in functions that accept -filesystem paths. - -.. - -.. bpo: 23564 -.. date: 9449 -.. nonce: XHarGG -.. section: Core and Builtins - -Fixed a partially broken sanity check in the _posixsubprocess internals -regarding how fds_to_pass were passed to the child. The bug had no actual -impact as subprocess.py already avoided it. - -.. - -.. bpo: 25388 -.. date: 9448 -.. nonce: zm3uuQ -.. section: Core and Builtins - -Fixed tokenizer crash when processing undecodable source code with a null -byte. - -.. - -.. bpo: 25462 -.. date: 9447 -.. nonce: eXDzgO -.. section: Core and Builtins - -The hash of the key now is calculated only once in most operations in C -implementation of OrderedDict. - -.. - -.. bpo: 22995 -.. date: 9446 -.. nonce: 90kpuP -.. section: Core and Builtins - -Default implementation of __reduce__ and __reduce_ex__ now rejects builtin -types with not defined __new__. - -.. - -.. bpo: 25555 -.. date: 9445 -.. nonce: MUpG-j -.. section: Core and Builtins - -Fix parser and AST: fill lineno and col_offset of "arg" node when compiling -AST from Python objects. - -.. - -.. bpo: 24802 -.. date: 9444 -.. nonce: Qie066 -.. section: Core and Builtins - -Avoid buffer overreads when int(), float(), compile(), exec() and eval() are -passed bytes-like objects. These objects are not necessarily terminated by -a null byte, but the functions assumed they were. - -.. - -.. bpo: 24726 -.. date: 9443 -.. nonce: AHk4v2 -.. section: Core and Builtins - -Fixed a crash and leaking NULL in repr() of OrderedDict that was mutated by -direct calls of dict methods. - -.. - -.. bpo: 25449 -.. date: 9442 -.. nonce: VqTOFi -.. section: Core and Builtins - -Iterating OrderedDict with keys with unstable hash now raises KeyError in C -implementations as well as in Python implementation. - -.. - -.. bpo: 25395 -.. date: 9441 -.. nonce: htkE3W -.. section: Core and Builtins - -Fixed crash when highly nested OrderedDict structures were garbage -collected. - -.. - -.. bpo: 25274 -.. date: 9440 -.. nonce: QCGvAF -.. section: Core and Builtins - -sys.setrecursionlimit() now raises a RecursionError if the new recursion -limit is too low depending at the current recursion depth. Modify also the -"lower-water mark" formula to make it monotonic. This mark is used to decide -when the overflowed flag of the thread state is reset. - -.. - -.. bpo: 24402 -.. date: 9439 -.. nonce: MAgi3X -.. section: Core and Builtins - -Fix input() to prompt to the redirected stdout when sys.stdout.fileno() -fails. - -.. - -.. bpo: 24806 -.. date: 9438 -.. nonce: Nb0znT -.. section: Core and Builtins - -Prevent builtin types that are not allowed to be subclassed from being -subclassed through multiple inheritance. - -.. - -.. bpo: 24848 -.. date: 9437 -.. nonce: HlUSuy -.. section: Core and Builtins - -Fixed a number of bugs in UTF-7 decoding of misformed data. - -.. - -.. bpo: 25280 -.. date: 9436 -.. nonce: ivTMwd -.. section: Core and Builtins - -Import trace messages emitted in verbose (-v) mode are no longer formatted -twice. - -.. - -.. bpo: 25003 -.. date: 9435 -.. nonce: _ban92 -.. section: Core and Builtins - -On Solaris 11.3 or newer, os.urandom() now uses the getrandom() function -instead of the getentropy() function. The getentropy() function is blocking -to generate very good quality entropy, os.urandom() doesn't need such -high-quality entropy. - -.. - -.. bpo: 25182 -.. date: 9434 -.. nonce: gBDq-T -.. section: Core and Builtins - -The stdprinter (used as sys.stderr before the io module is imported at -startup) now uses the backslashreplace error handler. - -.. - -.. bpo: 25131 -.. date: 9433 -.. nonce: j5hH6a -.. section: Core and Builtins - -Make the line number and column offset of set/dict literals and -comprehensions correspond to the opening brace. - -.. - -.. bpo: 25150 -.. date: 9432 -.. nonce: 0Gh-Ty -.. section: Core and Builtins - -Hide the private _Py_atomic_xxx symbols from the public Python.h header to -fix a compilation error with OpenMP. PyThreadState_GET() becomes an alias to -PyThreadState_Get() to avoid ABI incompatibilities. - -.. - -.. bpo: 25626 -.. date: 9431 -.. nonce: TQ3fvb -.. section: Library - -Change three zlib functions to accept sizes that fit in Py_ssize_t, but -internally cap those sizes to UINT_MAX. This resolves a regression in 3.5 -where GzipFile.read() failed to read chunks larger than 2 or 4 GiB. The -change affects the zlib.Decompress.decompress() max_length parameter, the -zlib.decompress() bufsize parameter, and the zlib.Decompress.flush() length -parameter. - -.. - -.. bpo: 25583 -.. date: 9430 -.. nonce: Gk-cim -.. section: Library - -Avoid incorrect errors raised by os.makedirs(exist_ok=True) when the OS -gives priority to errors such as EACCES over EEXIST. - -.. - -.. bpo: 25593 -.. date: 9429 -.. nonce: 56uegI -.. section: Library - -Change semantics of EventLoop.stop() in asyncio. - -.. - -.. bpo: 6973 -.. date: 9428 -.. nonce: nl5cHt -.. section: Library - -When we know a subprocess.Popen process has died, do not allow the -send_signal(), terminate(), or kill() methods to do anything as they could -potentially signal a different process. - -.. - -.. bpo: 25590 -.. date: 9427 -.. nonce: aCt-yW -.. section: Library - -In the Readline completer, only call getattr() once per attribute. - -.. - -.. bpo: 25498 -.. date: 9426 -.. nonce: AvqEBl -.. section: Library - -Fix a crash when garbage-collecting ctypes objects created by wrapping a -memoryview. This was a regression made in 3.5a1. Based on patch by -Eryksun. - -.. - -.. bpo: 25584 -.. date: 9425 -.. nonce: 124mYw -.. section: Library - -Added "escape" to the __all__ list in the glob module. - -.. - -.. bpo: 25584 -.. date: 9424 -.. nonce: ZeWX0J -.. section: Library - -Fixed recursive glob() with patterns starting with ``**``. - -.. - -.. bpo: 25446 -.. date: 9423 -.. nonce: k1DByx -.. section: Library - -Fix regression in smtplib's AUTH LOGIN support. - -.. - -.. bpo: 18010 -.. date: 9422 -.. nonce: Azyf1C -.. section: Library - -Fix the pydoc web server's module search function to handle exceptions from -importing packages. - -.. - -.. bpo: 25554 -.. date: 9421 -.. nonce: UM9MlR -.. section: Library - -Got rid of circular references in regular expression parsing. - -.. - -.. bpo: 25510 -.. date: 9420 -.. nonce: 79g7LA -.. section: Library - -fileinput.FileInput.readline() now returns b'' instead of '' at the end if -the FileInput was opened with binary mode. Patch by Ryosuke Ito. - -.. - -.. bpo: 25503 -.. date: 9419 -.. nonce: Zea0Y7 -.. section: Library - -Fixed inspect.getdoc() for inherited docstrings of properties. Original -patch by John Mark Vandenberg. - -.. - -.. bpo: 25515 -.. date: 9418 -.. nonce: fQsyYG -.. section: Library - -Always use os.urandom as a source of randomness in uuid.uuid4. - -.. - -.. bpo: 21827 -.. date: 9417 -.. nonce: k2oreR -.. section: Library - -Fixed textwrap.dedent() for the case when largest common whitespace is a -substring of smallest leading whitespace. Based on patch by Robert Li. - -.. - -.. bpo: 25447 -.. date: 9416 -.. nonce: eDYc4t -.. section: Library - -The lru_cache() wrapper objects now can be copied and pickled (by returning -the original object unchanged). - -.. - -.. bpo: 25390 -.. date: 9415 -.. nonce: 6mSgRq -.. section: Library - -typing: Don't crash on Union[str, Pattern]. - -.. - -.. bpo: 25441 -.. date: 9414 -.. nonce: d7zph6 -.. section: Library - -asyncio: Raise error from drain() when socket is closed. - -.. - -.. bpo: 25410 -.. date: 9413 -.. nonce: QAs_3B -.. section: Library - -Cleaned up and fixed minor bugs in C implementation of OrderedDict. - -.. - -.. bpo: 25411 -.. date: 9412 -.. nonce: qsJTCb -.. section: Library - -Improved Unicode support in SMTPHandler through better use of the email -package. Thanks to user simon04 for the patch. - -.. - -.. bpo: 25407 -.. date: 9411 -.. nonce: ukNt1D -.. section: Library - -Remove mentions of the formatter module being removed in Python 3.6. - -.. - -.. bpo: 25406 -.. date: 9410 -.. nonce: 5MZKU_ -.. section: Library - -Fixed a bug in C implementation of OrderedDict.move_to_end() that caused -segmentation fault or hang in iterating after moving several items to the -start of ordered dict. - -.. - -.. bpo: 25364 -.. date: 9409 -.. nonce: u_1Wi6 -.. section: Library - -zipfile now works in threads disabled builds. - -.. - -.. bpo: 25328 -.. date: 9408 -.. nonce: Rja1Xg -.. section: Library - -smtpd's SMTPChannel now correctly raises a ValueError if both decode_data -and enable_SMTPUTF8 are set to true. - -.. - -.. bpo: 25316 -.. date: 9407 -.. nonce: dHQHWI -.. section: Library - -distutils raises OSError instead of DistutilsPlatformError when MSVC is not -installed. - -.. - -.. bpo: 25380 -.. date: 9406 -.. nonce: sKZ6-I -.. section: Library - -Fixed protocol for the STACK_GLOBAL opcode in pickletools.opcodes. - -.. - -.. bpo: 23972 -.. date: 9405 -.. nonce: s2g30g -.. section: Library - -Updates asyncio datagram create method allowing reuseport and reuseaddr -socket options to be set prior to binding the socket. Mirroring the existing -asyncio create_server method the reuseaddr option for datagram sockets -defaults to True if the O/S is 'posix' (except if the platform is Cygwin). -Patch by Chris Laws. - -.. - -.. bpo: 25304 -.. date: 9404 -.. nonce: CsmLyI -.. section: Library - -Add asyncio.run_coroutine_threadsafe(). This lets you submit a coroutine to -a loop from another thread, returning a concurrent.futures.Future. By -Vincent Michel. - -.. - -.. bpo: 25232 -.. date: 9403 -.. nonce: KhKjCE -.. section: Library - -Fix CGIRequestHandler to split the query from the URL at the first question -mark (?) rather than the last. Patch from Xiang Zhang. - -.. - -.. bpo: 24657 -.. date: 9402 -.. nonce: h2Ag7y -.. section: Library - -Prevent CGIRequestHandler from collapsing slashes in the query part of the -URL as if it were a path. Patch from Xiang Zhang. - -.. - -.. bpo: 24483 -.. date: 9401 -.. nonce: WPLGSJ -.. section: Library - -C implementation of functools.lru_cache() now calculates key's hash only -once. - -.. - -.. bpo: 22958 -.. date: 9400 -.. nonce: Ebu7Gl -.. section: Library - -Constructor and update method of weakref.WeakValueDictionary now accept the -self and the dict keyword arguments. - -.. - -.. bpo: 22609 -.. date: 9399 -.. nonce: fV7hdV -.. section: Library - -Constructor of collections.UserDict now accepts the self keyword argument. - -.. - -.. bpo: 25111 -.. date: 9398 -.. nonce: azL4qE -.. section: Library - -Fixed comparison of traceback.FrameSummary. - -.. - -.. bpo: 25262 -.. date: 9397 -.. nonce: pQS5cB -.. section: Library - -Added support for BINBYTES8 opcode in Python implementation of unpickler. -Highest 32 bits of 64-bit size for BINUNICODE8 and BINBYTES8 opcodes no -longer silently ignored on 32-bit platforms in C implementation. - -.. - -.. bpo: 25034 -.. date: 9396 -.. nonce: eGvOIb -.. section: Library - -Fix string.Formatter problem with auto-numbering and nested format_specs. -Patch by Anthon van der Neut. - -.. - -.. bpo: 25233 -.. date: 9395 -.. nonce: EdZV9x -.. section: Library - -Rewrite the guts of asyncio.Queue and asyncio.Semaphore to be more -understandable and correct. - -.. - -.. bpo: 25203 -.. date: 9394 -.. nonce: IgDEbt -.. section: Library - -Failed readline.set_completer_delims() no longer left the module in -inconsistent state. - -.. - -.. bpo: 23600 -.. date: 9393 -.. nonce: 7J_RD5 -.. section: Library - -Default implementation of tzinfo.fromutc() was returning wrong results in -some cases. - -.. - -.. bpo: 23329 -.. date: 9392 -.. nonce: yccJBE -.. section: Library - -Allow the ssl module to be built with older versions of LibreSSL. - -.. - -.. bpo: 0 -.. date: 9391 -.. nonce: ww9QSm -.. section: Library - -Prevent overflow in _Unpickler_Read. - -.. - -.. bpo: 25047 -.. date: 9390 -.. nonce: kc8tqx -.. section: Library - -The XML encoding declaration written by Element Tree now respects the letter -case given by the user. This restores the ability to write encoding names in -uppercase like "UTF-8", which worked in Python 2. - -.. - -.. bpo: 25135 -.. date: 9389 -.. nonce: gVHNy- -.. section: Library - -Make deque_clear() safer by emptying the deque before clearing. This helps -avoid possible reentrancy issues. - -.. - -.. bpo: 19143 -.. date: 9388 -.. nonce: 76SBSO -.. section: Library - -platform module now reads Windows version from kernel32.dll to avoid -compatibility shims. - -.. - -.. bpo: 25092 -.. date: 9387 -.. nonce: fQ37Ac -.. section: Library - -Fix datetime.strftime() failure when errno was already set to EINVAL. - -.. - -.. bpo: 23517 -.. date: 9386 -.. nonce: 3ABmf1 -.. section: Library - -Fix rounding in fromtimestamp() and utcfromtimestamp() methods of -datetime.datetime: microseconds are now rounded to nearest with ties going -to nearest even integer (ROUND_HALF_EVEN), instead of being rounding towards -minus infinity (ROUND_FLOOR). It's important that these methods use the same -rounding mode than datetime.timedelta to keep the property: -(datetime(1970,1,1) + timedelta(seconds=t)) == datetime.utcfromtimestamp(t). -It also the rounding mode used by round(float) for example. - -.. - -.. bpo: 25155 -.. date: 9385 -.. nonce: JiETzD -.. section: Library - -Fix datetime.datetime.now() and datetime.datetime.utcnow() on Windows to -support date after year 2038. It was a regression introduced in Python -3.5.0. - -.. - -.. bpo: 25108 -.. date: 9384 -.. nonce: zGPbgA -.. section: Library - -Omitted internal frames in traceback functions print_stack(), -format_stack(), and extract_stack() called without arguments. - -.. - -.. bpo: 25118 -.. date: 9383 -.. nonce: wGm1u6 -.. section: Library - -Fix a regression of Python 3.5.0 in os.waitpid() on Windows. - -.. - -.. bpo: 24684 -.. date: 9382 -.. nonce: t4T77O -.. section: Library - -socket.socket.getaddrinfo() now calls PyUnicode_AsEncodedString() instead of -calling the encode() method of the host, to handle correctly custom string -with an encode() method which doesn't return a byte string. The encoder of -the IDNA codec is now called directly instead of calling the encode() method -of the string. - -.. - -.. bpo: 25060 -.. date: 9381 -.. nonce: zLdvIk -.. section: Library - -Correctly compute stack usage of the BUILD_MAP opcode. - -.. - -.. bpo: 24857 -.. date: 9380 -.. nonce: PpJWZ9 -.. section: Library - -Comparing call_args to a long sequence now correctly returns a boolean -result instead of raising an exception. Patch by A Kaptur. - -.. - -.. bpo: 23144 -.. date: 9379 -.. nonce: cLf67X -.. section: Library - -Make sure that HTMLParser.feed() returns all the data, even when -convert_charrefs is True. - -.. - -.. bpo: 24982 -.. date: 9378 -.. nonce: sGMMAR -.. section: Library - -shutil.make_archive() with the "zip" format now adds entries for directories -(including empty directories) in ZIP file. - -.. - -.. bpo: 25019 -.. date: 9377 -.. nonce: JQJlOZ -.. section: Library - -Fixed a crash caused by setting non-string key of expat parser. Based on -patch by John Leitch. - -.. - -.. bpo: 16180 -.. date: 9376 -.. nonce: 6IUcNS -.. section: Library - -Exit pdb if file has syntax error, instead of trapping user in an infinite -loop. Patch by Xavier de Gaye. - -.. - -.. bpo: 24891 -.. date: 9375 -.. nonce: ddVmHS -.. section: Library - -Fix a race condition at Python startup if the file descriptor of stdin (0), -stdout (1) or stderr (2) is closed while Python is creating sys.stdin, -sys.stdout and sys.stderr objects. These attributes are now set to None if -the creation of the object failed, instead of raising an OSError exception. -Initial patch written by Marco Paolini. - -.. - -.. bpo: 24992 -.. date: 9374 -.. nonce: 5sqF74 -.. section: Library - -Fix error handling and a race condition (related to garbage collection) in -collections.OrderedDict constructor. - -.. - -.. bpo: 24881 -.. date: 9373 -.. nonce: ZoVZXu -.. section: Library - -Fixed setting binary mode in Python implementation of FileIO on Windows and -Cygwin. Patch from Akira Li. - -.. - -.. bpo: 25578 -.. date: 9372 -.. nonce: G6S-ft -.. section: Library - -Fix (another) memory leak in SSLSocket.getpeercer(). - -.. - -.. bpo: 25530 -.. date: 9371 -.. nonce: hDFkwu -.. section: Library - -Disable the vulnerable SSLv3 protocol by default when creating -ssl.SSLContext. - -.. - -.. bpo: 25569 -.. date: 9370 -.. nonce: CfvQjK -.. section: Library - -Fix memory leak in SSLSocket.getpeercert(). - -.. - -.. bpo: 25471 -.. date: 9369 -.. nonce: T0A02M -.. section: Library - -Sockets returned from accept() shouldn't appear to be nonblocking. - -.. - -.. bpo: 25319 -.. date: 9368 -.. nonce: iyuglv -.. section: Library - -When threading.Event is reinitialized, the underlying condition should use a -regular lock rather than a recursive lock. - -.. - -.. bpo: 21112 -.. date: 9367 -.. nonce: vSFU1r -.. section: Library - -Fix regression in unittest.expectedFailure on subclasses. Patch from Berker -Peksag. - -.. - -.. bpo: 24764 -.. date: 9366 -.. nonce: QwFZ2S -.. section: Library - -cgi.FieldStorage.read_multi() now ignores the Content-Length header in part -headers. Patch written by Peter Landry and reviewed by Pierre Quentel. - -.. - -.. bpo: 24913 -.. date: 9365 -.. nonce: p2ZAJ4 -.. section: Library - -Fix overrun error in deque.index(). Found by John Leitch and Bryce Darling. - -.. - -.. bpo: 24774 -.. date: 9364 -.. nonce: xLbskG -.. section: Library - -Fix docstring in http.server.test. Patch from Chiu-Hsiang Hsu. - -.. - -.. bpo: 21159 -.. date: 9363 -.. nonce: ochL5W -.. section: Library - -Improve message in configparser.InterpolationMissingOptionError. Patch from -Łukasz Langa. - -.. - -.. bpo: 20362 -.. date: 9362 -.. nonce: 5aP_Ri -.. section: Library - -Honour TestCase.longMessage correctly in assertRegex. Patch from Ilia -Kurenkov. - -.. - -.. bpo: 23572 -.. date: 9361 -.. nonce: QhQ9RD -.. section: Library - -Fixed functools.singledispatch on classes with falsy metaclasses. Patch by -Ethan Furman. - -.. - -.. bpo: 0 -.. date: 9360 -.. nonce: DO1sFa -.. section: Library - -asyncio: ensure_future() now accepts awaitable objects. - -.. - -.. bpo: 15348 -.. date: 9359 -.. nonce: d1Fg01 -.. section: IDLE - -Stop the debugger engine (normally in a user process) before closing the -debugger window (running in the IDLE process). This prevents the -RuntimeErrors that were being caught and ignored. - -.. - -.. bpo: 24455 -.. date: 9358 -.. nonce: x6YqtE -.. section: IDLE - -Prevent IDLE from hanging when a) closing the shell while the debugger is -active (15347); b) closing the debugger with the [X] button (15348); and c) -activating the debugger when already active (24455). The patch by Mark -Roseman does this by making two changes. 1. Suspend and resume the -gui.interaction method with the tcl vwait mechanism intended for this -purpose (instead of root.mainloop & .quit). 2. In gui.run, allow any -existing interaction to terminate first. - -.. - -.. bpo: 0 -.. date: 9357 -.. nonce: Yp9LRY -.. section: IDLE - -Change 'The program' to 'Your program' in an IDLE 'kill program?' message to -make it clearer that the program referred to is the currently running user -program, not IDLE itself. - -.. - -.. bpo: 24750 -.. date: 9356 -.. nonce: xgsi-K -.. section: IDLE - -Improve the appearance of the IDLE editor window status bar. Patch by Mark -Roseman. - -.. - -.. bpo: 25313 -.. date: 9355 -.. nonce: xMXHpO -.. section: IDLE - -Change the handling of new built-in text color themes to better address the -compatibility problem introduced by the addition of IDLE Dark. Consistently -use the revised idleConf.CurrentTheme everywhere in idlelib. - -.. - -.. bpo: 24782 -.. date: 9354 -.. nonce: RgIPYE -.. section: IDLE - -Extension configuration is now a tab in the IDLE Preferences dialog rather -than a separate dialog. The former tabs are now a sorted list. Patch by -Mark Roseman. - -.. - -.. bpo: 22726 -.. date: 9353 -.. nonce: x8T0dA -.. section: IDLE - -Re-activate the config dialog help button with some content about the other -buttons and the new IDLE Dark theme. - -.. - -.. bpo: 24820 -.. date: 9352 -.. nonce: TFPJhr -.. section: IDLE - -IDLE now has an 'IDLE Dark' built-in text color theme. It is more or less -IDLE Classic inverted, with a cobalt blue background. Strings, comments, -keywords, ... are still green, red, orange, ... . To use it with IDLEs -released before November 2015, hit the 'Save as New Custom Theme' button and -enter a new name, such as 'Custom Dark'. The custom theme will work with -any IDLE release, and can be modified. - -.. - -.. bpo: 25224 -.. date: 9351 -.. nonce: 5Llwo4 -.. section: IDLE - -README.txt is now an idlelib index for IDLE developers and curious users. -The previous user content is now in the IDLE doc chapter. 'IDLE' now means -'Integrated Development and Learning Environment'. - -.. - -.. bpo: 24820 -.. date: 9350 -.. nonce: ZUz9Fn -.. section: IDLE - -Users can now set breakpoint colors in Settings -> Custom Highlighting. -Original patch by Mark Roseman. - -.. - -.. bpo: 24972 -.. date: 9349 -.. nonce: uc0uNo -.. section: IDLE - -Inactive selection background now matches active selection background, as -configured by users, on all systems. Found items are now always highlighted -on Windows. Initial patch by Mark Roseman. - -.. - -.. bpo: 24570 -.. date: 9348 -.. nonce: s3EkNn -.. section: IDLE - -Idle: make calltip and completion boxes appear on Macs affected by a tk -regression. Initial patch by Mark Roseman. - -.. - -.. bpo: 24988 -.. date: 9347 -.. nonce: tXqq4T -.. section: IDLE - -Idle ScrolledList context menus (used in debugger) now work on Mac Aqua. -Patch by Mark Roseman. - -.. - -.. bpo: 24801 -.. date: 9346 -.. nonce: -bj_Ou -.. section: IDLE - -Make right-click for context menu work on Mac Aqua. Patch by Mark Roseman. - -.. - -.. bpo: 25173 -.. date: 9345 -.. nonce: EZzrPg -.. section: IDLE - -Associate tkinter messageboxes with a specific widget. For Mac OSX, make -them a 'sheet'. Patch by Mark Roseman. - -.. - -.. bpo: 25198 -.. date: 9344 -.. nonce: -j_BV7 -.. section: IDLE - -Enhance the initial html viewer now used for Idle Help. Properly indent -fixed-pitch text (patch by Mark Roseman). Give code snippet a very -Sphinx-like light blueish-gray background. Re-use initial width and height -set by users for shell and editor. When the Table of Contents (TOC) menu is -used, put the section header at the top of the screen. - -.. - -.. bpo: 25225 -.. date: 9343 -.. nonce: 9pvdq6 -.. section: IDLE - -Condense and rewrite Idle doc section on text colors. - -.. - -.. bpo: 21995 -.. date: 9342 -.. nonce: C5Rmzx -.. section: IDLE - -Explain some differences between IDLE and console Python. - -.. - -.. bpo: 22820 -.. date: 9341 -.. nonce: hix_8X -.. section: IDLE - -Explain need for *print* when running file from Idle editor. - -.. - -.. bpo: 25224 -.. date: 9340 -.. nonce: UVMYQq -.. section: IDLE - -Doc: augment Idle feature list and no-subprocess section. - -.. - -.. bpo: 25219 -.. date: 9339 -.. nonce: 8_9DYg -.. section: IDLE - -Update doc for Idle command line options. Some were missing and notes were -not correct. - -.. - -.. bpo: 24861 -.. date: 9338 -.. nonce: Ecg2yT -.. section: IDLE - -Most of idlelib is private and subject to change. Use idleib.idle.* to start -Idle. See idlelib.__init__.__doc__. - -.. - -.. bpo: 25199 -.. date: 9337 -.. nonce: ih7yY3 -.. section: IDLE - -Idle: add synchronization comments for future maintainers. - -.. - -.. bpo: 16893 -.. date: 9336 -.. nonce: bZtPgJ -.. section: IDLE - -Replace help.txt with help.html for Idle doc display. The new -idlelib/help.html is rstripped Doc/build/html/library/idle.html. It looks -better than help.txt and will better document Idle as released. The tkinter -html viewer that works for this file was written by Mark Roseman. The now -unused EditorWindow.HelpDialog class and helt.txt file are deprecated. - -.. - -.. bpo: 24199 -.. date: 9335 -.. nonce: VKnZEv -.. section: IDLE - -Deprecate unused idlelib.idlever with possible removal in 3.6. - -.. - -.. bpo: 24790 -.. date: 9334 -.. nonce: hD1hlj -.. section: IDLE - -Remove extraneous code (which also create 2 & 3 conflicts). - -.. - -.. bpo: 22558 -.. date: 9333 -.. nonce: Pk02YC -.. section: Documentation - -Add remaining doc links to source code for Python-coded modules. Patch by -Yoni Lavi. - -.. - -.. bpo: 12067 -.. date: 9332 -.. nonce: nLD2M- -.. section: Documentation - -Rewrite Comparisons section in the Expressions chapter of the language -reference. Some of the details of comparing mixed types were incorrect or -ambiguous. NotImplemented is only relevant at a lower level than the -Expressions chapter. Added details of comparing range() objects, and default -behaviour and consistency suggestions for user-defined classes. Patch from -Andy Maier. - -.. - -.. bpo: 24952 -.. date: 9331 -.. nonce: RHhFPE -.. section: Documentation - -Clarify the default size argument of stack_size() in the "threading" and -"_thread" modules. Patch from Mattip. - -.. - -.. bpo: 23725 -.. date: 9330 -.. nonce: 49TZ5f -.. section: Documentation - -Overhaul tempfile docs. Note deprecated status of mktemp. Patch from -Zbigniew Jędrzejewski-Szmek. - -.. - -.. bpo: 24808 -.. date: 9329 -.. nonce: MGjc3F -.. section: Documentation - -Update the types of some PyTypeObject fields. Patch by Joseph Weston. - -.. - -.. bpo: 22812 -.. date: 9328 -.. nonce: kLCF0G -.. section: Documentation - -Fix unittest discovery examples. Patch from Pam McA'Nulty. - -.. - -.. bpo: 25449 -.. date: 9327 -.. nonce: MP6KNs -.. section: Tests - -Added tests for OrderedDict subclasses. - -.. - -.. bpo: 25099 -.. date: 9326 -.. nonce: tJQOWx -.. section: Tests - -Make test_compileall not fail when an entry on sys.path cannot be written to -(commonly seen in administrative installs on Windows). - -.. - -.. bpo: 23919 -.. date: 9325 -.. nonce: vJnjaq -.. section: Tests - -Prevents assert dialogs appearing in the test suite. - -.. - -.. bpo: 0 -.. date: 9324 -.. nonce: X-Bk5l -.. section: Tests - -``PCbuild\rt.bat`` now accepts an unlimited number of arguments to pass -along to regrtest.py. Previously there was a limit of 9. - -.. - -.. bpo: 24915 -.. date: 9323 -.. nonce: PgD3Cx -.. section: Build - -Add LLVM support for PGO builds and use the test suite to generate the -profile data. Initial patch by Alecsandru Patrascu of Intel. - -.. - -.. bpo: 24910 -.. date: 9322 -.. nonce: ZZdfl0 -.. section: Build - -Windows MSIs now have unique display names. - -.. - -.. bpo: 24986 -.. date: 9321 -.. nonce: 1WyXeU -.. section: Build - -It is now possible to build Python on Windows without errors when external -libraries are not available. - -.. - -.. bpo: 25450 -.. date: 9320 -.. nonce: X4xlWf -.. section: Windows - -Updates shortcuts to start Python in installation directory. - -.. - -.. bpo: 25164 -.. date: 9319 -.. nonce: FHVOOA -.. section: Windows - -Changes default all-users install directory to match per-user directory. - -.. - -.. bpo: 25143 -.. date: 9318 -.. nonce: hmxsia -.. section: Windows - -Improves installer error messages for unsupported platforms. - -.. - -.. bpo: 25163 -.. date: 9317 -.. nonce: uCRe8H -.. section: Windows - -Display correct directory in installer when using non-default settings. - -.. - -.. bpo: 25361 -.. date: 9316 -.. nonce: GETaSY -.. section: Windows - -Disables use of SSE2 instructions in Windows 32-bit build - -.. - -.. bpo: 25089 -.. date: 9315 -.. nonce: n_YJgw -.. section: Windows - -Adds logging to installer for case where launcher is not selected on -upgrade. - -.. - -.. bpo: 25165 -.. date: 9314 -.. nonce: aUTN1e -.. section: Windows - -Windows uninstallation should not remove launcher if other versions remain - -.. - -.. bpo: 25112 -.. date: 9313 -.. nonce: frdKij -.. section: Windows - -py.exe launcher is missing icons - -.. - -.. bpo: 25102 -.. date: 9312 -.. nonce: 6y6Akl -.. section: Windows - -Windows installer does not precompile for -O or -OO. - -.. - -.. bpo: 25081 -.. date: 9311 -.. nonce: dcRCTO -.. section: Windows - -Makes Back button in installer go back to upgrade page when upgrading. - -.. - -.. bpo: 25091 -.. date: 9310 -.. nonce: 1u-VKy -.. section: Windows - -Increases font size of the installer. - -.. - -.. bpo: 25126 -.. date: 9309 -.. nonce: ANx3DW -.. section: Windows - -Clarifies that the non-web installer will download some components. - -.. - -.. bpo: 25213 -.. date: 9308 -.. nonce: KGmXoe -.. section: Windows - -Restores requestedExecutionLevel to manifest to disable UAC virtualization. - -.. - -.. bpo: 25022 -.. date: 9307 -.. nonce: vAt_zr -.. section: Windows - -Removed very outdated PC/example_nt/ directory. - -.. - -.. bpo: 25440 -.. date: 9306 -.. nonce: 5xhyGr -.. section: Tools/Demos - -Fix output of python-config --extension-suffix. diff --git a/Misc/NEWS.d/3.5.2.rst b/Misc/NEWS.d/3.5.2.rst deleted file mode 100644 index 982b227962de829c2e87619fda32ad89036937b0..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.2.rst +++ /dev/null @@ -1,25 +0,0 @@ -.. bpo: 26930 -.. date: 9676 -.. nonce: 9JUeSD -.. release date: 2016-06-26 -.. section: Core and Builtins - -Update Windows builds to use OpenSSL 1.0.2h. - -.. - -.. bpo: 26867 -.. date: 9675 -.. nonce: QPSyP5 -.. section: Tests - -Ubuntu's openssl OP_NO_SSLv3 is forced on by default; fix test. - -.. - -.. bpo: 27365 -.. date: 9674 -.. nonce: ipkJ_M -.. section: IDLE - -Allow non-ascii in idlelib/NEWS.txt - minimal part for 3.5.2. diff --git a/Misc/NEWS.d/3.5.2rc1.rst b/Misc/NEWS.d/3.5.2rc1.rst deleted file mode 100644 index d891fa0880dad1e8f98405e0d593ddd9aaaf980e..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.2rc1.rst +++ /dev/null @@ -1,2203 +0,0 @@ -.. bpo: 27066 -.. date: 9673 -.. nonce: SNExZi -.. release date: 2016-06-12 -.. section: Core and Builtins - -Fixed SystemError if a custom opener (for open()) returns a negative number -without setting an exception. - -.. - -.. bpo: 20041 -.. date: 9672 -.. nonce: TypyGp -.. section: Core and Builtins - -Fixed TypeError when frame.f_trace is set to None. Patch by Xavier de Gaye. - -.. - -.. bpo: 26168 -.. date: 9671 -.. nonce: -nPBL6 -.. section: Core and Builtins - -Fixed possible refleaks in failing Py_BuildValue() with the "N" format unit. - -.. - -.. bpo: 26991 -.. date: 9670 -.. nonce: yWGNhz -.. section: Core and Builtins - -Fix possible refleak when creating a function with annotations. - -.. - -.. bpo: 27039 -.. date: 9669 -.. nonce: Zj7tV7 -.. section: Core and Builtins - -Fixed bytearray.remove() for values greater than 127. Patch by Joe Jevnik. - -.. - -.. bpo: 23640 -.. date: 9668 -.. nonce: kvNC4c -.. section: Core and Builtins - -int.from_bytes() no longer bypasses constructors for subclasses. - -.. - -.. bpo: 26811 -.. date: 9667 -.. nonce: oNzUWt -.. section: Core and Builtins - -gc.get_objects() no longer contains a broken tuple with NULL pointer. - -.. - -.. bpo: 20120 -.. date: 9666 -.. nonce: c-FZZc -.. section: Core and Builtins - -Use RawConfigParser for .pypirc parsing, removing support for interpolation -unintentionally added with move to Python 3. Behavior no longer does any -interpolation in .pypirc files, matching behavior in Python 2.7 and -Setuptools 19.0. - -.. - -.. bpo: 26659 -.. date: 9665 -.. nonce: 5PRa83 -.. section: Core and Builtins - -Make the builtin slice type support cycle collection. - -.. - -.. bpo: 26718 -.. date: 9664 -.. nonce: K5PQ8j -.. section: Core and Builtins - -super.__init__ no longer leaks memory if called multiple times. NOTE: A -direct call of super.__init__ is not endorsed! - -.. - -.. bpo: 25339 -.. date: 9663 -.. nonce: ZcaC2E -.. section: Core and Builtins - -PYTHONIOENCODING now has priority over locale in setting the error handler -for stdin and stdout. - -.. - -.. bpo: 26494 -.. date: 9662 -.. nonce: G6eXIi -.. section: Core and Builtins - -Fixed crash on iterating exhausting iterators. Affected classes are generic -sequence iterators, iterators of str, bytes, bytearray, list, tuple, set, -frozenset, dict, OrderedDict, corresponding views and os.scandir() iterator. - -.. - -.. bpo: 26581 -.. date: 9661 -.. nonce: yNA7nm -.. section: Core and Builtins - -If coding cookie is specified multiple times on a line in Python source code -file, only the first one is taken to account. - -.. - -.. bpo: 26464 -.. date: 9660 -.. nonce: 7BreGz -.. section: Core and Builtins - -Fix str.translate() when string is ASCII and first replacements removes -character, but next replacement uses a non-ASCII character or a string -longer than 1 character. Regression introduced in Python 3.5.0. - -.. - -.. bpo: 22836 -.. date: 9659 -.. nonce: cimt1y -.. section: Core and Builtins - -Ensure exception reports from PyErr_Display() and PyErr_WriteUnraisable() -are sensible even when formatting them produces secondary errors. This -affects the reports produced by sys.__excepthook__() and when __del__() -raises an exception. - -.. - -.. bpo: 26302 -.. date: 9658 -.. nonce: UD9XQt -.. section: Core and Builtins - -Correct behavior to reject comma as a legal character for cookie names. - -.. - -.. bpo: 4806 -.. date: 9657 -.. nonce: i9m3hj -.. section: Core and Builtins - -Avoid masking the original TypeError exception when using star (``*``) -unpacking in function calls. Based on patch by Hagen Fürstenau and Daniel -Urban. - -.. - -.. bpo: 27138 -.. date: 9656 -.. nonce: ifYEro -.. section: Core and Builtins - -Fix the doc comment for FileFinder.find_spec(). - -.. - -.. bpo: 26154 -.. date: 9655 -.. nonce: MtnRAH -.. section: Core and Builtins - -Add a new private _PyThreadState_UncheckedGet() function to get the current -Python thread state, but don't issue a fatal error if it is NULL. This new -function must be used instead of accessing directly the -_PyThreadState_Current variable. The variable is no more exposed since -Python 3.5.1 to hide the exact implementation of atomic C types, to avoid -compiler issues. - -.. - -.. bpo: 26194 -.. date: 9654 -.. nonce: j9zand -.. section: Core and Builtins - -Deque.insert() gave odd results for bounded deques that had reached their -maximum size. Now an IndexError will be raised when attempting to insert -into a full deque. - -.. - -.. bpo: 25843 -.. date: 9653 -.. nonce: t2kGug -.. section: Core and Builtins - -When compiling code, don't merge constants if they are equal but have a -different types. For example, ``f1, f2 = lambda: 1, lambda: 1.0`` is now -correctly compiled to two different functions: ``f1()`` returns ``1`` -(``int``) and ``f2()`` returns ``1.0`` (``int``), even if ``1`` and ``1.0`` -are equal. - -.. - -.. bpo: 22995 -.. date: 9652 -.. nonce: KYNKvs -.. section: Core and Builtins - -[UPDATE] Comment out the one of the pickleability tests in -_PyObject_GetState() due to regressions observed in Cython-based projects. - -.. - -.. bpo: 25961 -.. date: 9651 -.. nonce: Hdjjw0 -.. section: Core and Builtins - -Disallowed null characters in the type name. - -.. - -.. bpo: 25973 -.. date: 9650 -.. nonce: Ud__ZP -.. section: Core and Builtins - -Fix segfault when an invalid nonlocal statement binds a name starting with -two underscores. - -.. - -.. bpo: 22995 -.. date: 9649 -.. nonce: Wq0E86 -.. section: Core and Builtins - -Instances of extension types with a state that aren't subclasses of list or -dict and haven't implemented any pickle-related methods (__reduce__, -__reduce_ex__, __getnewargs__, __getnewargs_ex__, or __getstate__), can no -longer be pickled. Including memoryview. - -.. - -.. bpo: 20440 -.. date: 9648 -.. nonce: GCwOfH -.. section: Core and Builtins - -Massive replacing unsafe attribute setting code with special macro -Py_SETREF. - -.. - -.. bpo: 25766 -.. date: 9647 -.. nonce: jn93Yu -.. section: Core and Builtins - -Special method __bytes__() now works in str subclasses. - -.. - -.. bpo: 25421 -.. date: 9646 -.. nonce: c47YEL -.. section: Core and Builtins - -__sizeof__ methods of builtin types now use dynamic basic size. This allows -sys.getsize() to work correctly with their subclasses with __slots__ -defined. - -.. - -.. bpo: 25709 -.. date: 9645 -.. nonce: WwGm2k -.. section: Core and Builtins - -Fixed problem with in-place string concatenation and utf-8 cache. - -.. - -.. bpo: 27147 -.. date: 9644 -.. nonce: tCCgmH -.. section: Core and Builtins - -Mention :pep:`420` in the importlib docs. - -.. - -.. bpo: 24097 -.. date: 9643 -.. nonce: Vt4E-i -.. section: Core and Builtins - -Fixed crash in object.__reduce__() if slot name is freed inside __getattr__. - -.. - -.. bpo: 24731 -.. date: 9642 -.. nonce: h9-hnz -.. section: Core and Builtins - -Fixed crash on converting objects with special methods __bytes__, __trunc__, -and __float__ returning instances of subclasses of bytes, int, and float to -subclasses of bytes, int, and float correspondingly. - -.. - -.. bpo: 26478 -.. date: 9641 -.. nonce: n0dB8e -.. section: Core and Builtins - -Fix semantic bugs when using binary operators with dictionary views and -tuples. - -.. - -.. bpo: 26171 -.. date: 9640 -.. nonce: 8SaQEa -.. section: Core and Builtins - -Fix possible integer overflow and heap corruption in zipimporter.get_data(). - -.. - -.. bpo: 25660 -.. date: 9639 -.. nonce: 93DzBo -.. section: Core and Builtins - -Fix TAB key behaviour in REPL with readline. - -.. - -.. bpo: 25887 -.. date: 9638 -.. nonce: PtVIX7 -.. section: Core and Builtins - -Raise a RuntimeError when a coroutine object is awaited more than once. - -.. - -.. bpo: 27243 -.. date: 9637 -.. nonce: U36M4E -.. section: Core and Builtins - -Update the __aiter__ protocol: instead of returning an awaitable that -resolves to an asynchronous iterator, the asynchronous iterator should be -returned directly. Doing the former will trigger a -PendingDeprecationWarning. - -.. - -.. bpo: 26556 -.. date: 9636 -.. nonce: v5j2uL -.. original section: Library -.. section: Security - -Update expat to 2.1.1, fixes CVE-2015-1283. - -.. - -.. bpo: 0 -.. date: 9635 -.. nonce: E4ochz -.. original section: Library -.. section: Security - -Fix TLS stripping vulnerability in smtplib, CVE-2016-0772. Reported by Team -Oststrom - -.. - -.. bpo: 21386 -.. date: 9634 -.. nonce: DjV72U -.. section: Library - -Implement missing IPv4Address.is_global property. It was documented since -07a5610bae9d. Initial patch by Roger Luethi. - -.. - -.. bpo: 20900 -.. date: 9633 -.. nonce: H5YQPR -.. section: Library - -distutils register command now decodes HTTP responses correctly. Initial -patch by ingrid. - -.. - -.. bpo: 0 -.. date: 9632 -.. nonce: iYIeng -.. section: Library - -A new version of typing.py provides several new classes and features: -@overload outside stubs, Reversible, DefaultDict, Text, ContextManager, -Type[], NewType(), TYPE_CHECKING, and numerous bug fixes (note that some of -the new features are not yet implemented in mypy or other static analyzers). -Also classes for :pep:`492` (Awaitable, AsyncIterable, AsyncIterator) have been -added (in fact they made it into 3.5.1 but were never mentioned). - -.. - -.. bpo: 25738 -.. date: 9631 -.. nonce: mED9w4 -.. section: Library - -Stop http.server.BaseHTTPRequestHandler.send_error() from sending a message -body for 205 Reset Content. Also, don't send Content header fields in -responses that don't have a body. Patch by Susumu Koshiba. - -.. - -.. bpo: 21313 -.. date: 9630 -.. nonce: W30MBr -.. section: Library - -Fix the "platform" module to tolerate when sys.version contains truncated -build information. - -.. - -.. bpo: 26839 -.. date: 9629 -.. nonce: yVvy7R -.. original section: Library -.. section: Security - -On Linux, :func:`os.urandom` now calls ``getrandom()`` with -``GRND_NONBLOCK`` to fall back on reading ``/dev/urandom`` if the urandom -entropy pool is not initialized yet. Patch written by Colm Buckley. - -.. - -.. bpo: 27164 -.. date: 9628 -.. nonce: 6wmjx2 -.. section: Library - -In the zlib module, allow decompressing raw Deflate streams with a -predefined zdict. Based on patch by Xiang Zhang. - -.. - -.. bpo: 24291 -.. date: 9627 -.. nonce: Ac6HvL -.. section: Library - -Fix wsgiref.simple_server.WSGIRequestHandler to completely write data to the -client. Previously it could do partial writes and truncate data. Also, -wsgiref.handler.ServerHandler can now handle stdout doing partial writes, -but this is deprecated. - -.. - -.. bpo: 26809 -.. date: 9626 -.. nonce: ya7JMb -.. section: Library - -Add ``__all__`` to :mod:`string`. Patch by Emanuel Barry. - -.. - -.. bpo: 26373 -.. date: 9625 -.. nonce: P6qz6o -.. section: Library - -subprocess.Popen.communicate now correctly ignores BrokenPipeError when the -child process dies before .communicate() is called in more/all -circumstances. - -.. - -.. bpo: 21776 -.. date: 9624 -.. nonce: 04eQfa -.. section: Library - -distutils.upload now correctly handles HTTPError. Initial patch by Claudiu -Popa. - -.. - -.. bpo: 27114 -.. date: 9623 -.. nonce: bGCuAM -.. section: Library - -Fix SSLContext._load_windows_store_certs fails with PermissionError - -.. - -.. bpo: 18383 -.. date: 9622 -.. nonce: jr-b0l -.. section: Library - -Avoid creating duplicate filters when using filterwarnings and simplefilter. -Based on patch by Alex Shkop. - -.. - -.. bpo: 27057 -.. date: 9621 -.. nonce: YzTA_Q -.. section: Library - -Fix os.set_inheritable() on Android, ioctl() is blocked by SELinux and fails -with EACCESS. The function now falls back to fcntl(). Patch written by -Michał Bednarski. - -.. - -.. bpo: 27014 -.. date: 9620 -.. nonce: ui7Khn -.. section: Library - -Fix infinite recursion using typing.py. Thanks to Kalle Tuure! - -.. - -.. bpo: 14132 -.. date: 9619 -.. nonce: 5wR9MN -.. section: Library - -Fix urllib.request redirect handling when the target only has a query -string. Original fix by Ján Janech. - -.. - -.. bpo: 17214 -.. date: 9618 -.. nonce: lUbZOV -.. section: Library - -The "urllib.request" module now percent-encodes non-ASCII bytes found in -redirect target URLs. Some servers send Location header fields with -non-ASCII bytes, but "http.client" requires the request target to be -ASCII-encodable, otherwise a UnicodeEncodeError is raised. Based on patch by -Christian Heimes. - -.. - -.. bpo: 26892 -.. date: 9617 -.. nonce: XIXb0h -.. section: Library - -Honor debuglevel flag in urllib.request.HTTPHandler. Patch contributed by -Chi Hsuan Yen. - -.. - -.. bpo: 22274 -.. date: 9616 -.. nonce: 0RHDMN -.. section: Library - -In the subprocess module, allow stderr to be redirected to stdout even when -stdout is not redirected. Patch by Akira Li. - -.. - -.. bpo: 26807 -.. date: 9615 -.. nonce: LXSPP6 -.. section: Library - -mock_open 'files' no longer error on readline at end of file. Patch from -Yolanda Robla. - -.. - -.. bpo: 25745 -.. date: 9614 -.. nonce: -n8acU -.. section: Library - -Fixed leaking a userptr in curses panel destructor. - -.. - -.. bpo: 26977 -.. date: 9613 -.. nonce: 5G4HtL -.. section: Library - -Removed unnecessary, and ignored, call to sum of squares helper in -statistics.pvariance. - -.. - -.. bpo: 26881 -.. date: 9612 -.. nonce: mdiq_L -.. section: Library - -The modulefinder module now supports extended opcode arguments. - -.. - -.. bpo: 23815 -.. date: 9611 -.. nonce: _krNe8 -.. section: Library - -Fixed crashes related to directly created instances of types in _tkinter and -curses.panel modules. - -.. - -.. bpo: 17765 -.. date: 9610 -.. nonce: hiSVS1 -.. section: Library - -weakref.ref() no longer silently ignores keyword arguments. Patch by Georg -Brandl. - -.. - -.. bpo: 26873 -.. date: 9609 -.. nonce: cYXRcH -.. section: Library - -xmlrpc now raises ResponseError on unsupported type tags instead of silently -return incorrect result. - -.. - -.. bpo: 26711 -.. date: 9608 -.. nonce: Eu85Qw -.. section: Library - -Fixed the comparison of plistlib.Data with other types. - -.. - -.. bpo: 24114 -.. date: 9607 -.. nonce: RMRMtM -.. section: Library - -Fix an uninitialized variable in `ctypes.util`. -The bug only occurs on SunOS when the ctypes implementation searches for the -`crle` program. Patch by Xiang Zhang. Tested on SunOS by Kees Bos. - -.. - -.. bpo: 26864 -.. date: 9606 -.. nonce: 1KgGds -.. section: Library - -In urllib.request, change the proxy bypass host checking against no_proxy to -be case-insensitive, and to not match unrelated host names that happen to -have a bypassed hostname as a suffix. Patch by Xiang Zhang. - -.. - -.. bpo: 26634 -.. date: 9605 -.. nonce: FZvsSb -.. section: Library - -recursive_repr() now sets __qualname__ of wrapper. Patch by Xiang Zhang. - -.. - -.. bpo: 26804 -.. date: 9604 -.. nonce: 9Orp-G -.. section: Library - -urllib.request will prefer lower_case proxy environment variables over -UPPER_CASE or Mixed_Case ones. Patch contributed by Hans-Peter Jansen. - -.. - -.. bpo: 26837 -.. date: 9603 -.. nonce: 2FXGsD -.. section: Library - -assertSequenceEqual() now correctly outputs non-stringified differing items -(like bytes in the -b mode). This affects assertListEqual() and -assertTupleEqual(). - -.. - -.. bpo: 26041 -.. date: 9602 -.. nonce: bVem-p -.. section: Library - -Remove "will be removed in Python 3.7" from deprecation messages of -platform.dist() and platform.linux_distribution(). Patch by Kumaripaba -Miyurusara Athukorala. - -.. - -.. bpo: 26822 -.. date: 9601 -.. nonce: rYSL4W -.. section: Library - -itemgetter, attrgetter and methodcaller objects no longer silently ignore -keyword arguments. - -.. - -.. bpo: 26733 -.. date: 9600 -.. nonce: YxaJmL -.. section: Library - -Disassembling a class now disassembles class and static methods. Patch by -Xiang Zhang. - -.. - -.. bpo: 26801 -.. date: 9599 -.. nonce: TQGY-7 -.. section: Library - -Fix error handling in :func:`shutil.get_terminal_size`, catch -:exc:`AttributeError` instead of :exc:`NameError`. Patch written by Emanuel -Barry. - -.. - -.. bpo: 24838 -.. date: 9598 -.. nonce: 3Pfx8T -.. section: Library - -tarfile's ustar and gnu formats now correctly calculate name and link field -limits for multibyte character encodings like utf-8. - -.. - -.. bpo: 26657 -.. date: 9597 -.. nonce: C_-XFg -.. original section: Library -.. section: Security - -Fix directory traversal vulnerability with http.server on Windows. This -fixes a regression that was introduced in 3.3.4rc1 and 3.4.0rc1. Based on -patch by Philipp Hagemeister. - -.. - -.. bpo: 26717 -.. date: 9596 -.. nonce: jngTdu -.. section: Library - -Stop encoding Latin-1-ized WSGI paths with UTF-8. Patch by Anthony Sottile. - -.. - -.. bpo: 26735 -.. date: 9595 -.. nonce: riSl3b -.. section: Library - -Fix :func:`os.urandom` on Solaris 11.3 and newer when reading more than -1,024 bytes: call ``getrandom()`` multiple times with a limit of 1024 bytes -per call. - -.. - -.. bpo: 16329 -.. date: 9594 -.. nonce: nuXD8W -.. section: Library - -Add .webm to mimetypes.types_map. Patch by Giampaolo Rodola'. - -.. - -.. bpo: 13952 -.. date: 9593 -.. nonce: SOoTVE -.. section: Library - -Add .csv to mimetypes.types_map. Patch by Geoff Wilson. - -.. - -.. bpo: 26709 -.. date: 9592 -.. nonce: luOPbP -.. section: Library - -Fixed Y2038 problem in loading binary PLists. - -.. - -.. bpo: 23735 -.. date: 9591 -.. nonce: Y5oQ9r -.. section: Library - -Handle terminal resizing with Readline 6.3+ by installing our own SIGWINCH -handler. Patch by Eric Price. - -.. - -.. bpo: 26586 -.. date: 9590 -.. nonce: V5pZNa -.. section: Library - -In http.server, respond with "413 Request header fields too large" if there -are too many header fields to parse, rather than killing the connection and -raising an unhandled exception. Patch by Xiang Zhang. - -.. - -.. bpo: 22854 -.. date: 9589 -.. nonce: K3rMEH -.. section: Library - -Change BufferedReader.writable() and BufferedWriter.readable() to always -return False. - -.. - -.. bpo: 25195 -.. date: 9588 -.. nonce: EOc4Po -.. section: Library - -Fix a regression in mock.MagicMock. _Call is a subclass of tuple (changeset -3603bae63c13 only works for classes) so we need to implement __ne__ -ourselves. Patch by Andrew Plummer. - -.. - -.. bpo: 26644 -.. date: 9587 -.. nonce: 7tt1tk -.. section: Library - -Raise ValueError rather than SystemError when a negative length is passed to -SSLSocket.recv() or read(). - -.. - -.. bpo: 23804 -.. date: 9586 -.. nonce: PP63Ff -.. section: Library - -Fix SSL recv(0) and read(0) methods to return zero bytes instead of up to -1024. - -.. - -.. bpo: 26616 -.. date: 9585 -.. nonce: v3QwdD -.. section: Library - -Fixed a bug in datetime.astimezone() method. - -.. - -.. bpo: 21925 -.. date: 9584 -.. nonce: _fr69L -.. section: Library - -:func:`warnings.formatwarning` now catches exceptions on -``linecache.getline(...)`` to be able to log :exc:`ResourceWarning` emitted -late during the Python shutdown process. - -.. - -.. bpo: 24266 -.. date: 9583 -.. nonce: YZgVyM -.. section: Library - -Ctrl+C during Readline history search now cancels the search mode when -compiled with Readline 7. - -.. - -.. bpo: 26560 -.. date: 9582 -.. nonce: A4WXNz -.. section: Library - -Avoid potential ValueError in BaseHandler.start_response. Initial patch by -Peter Inglesby. - -.. - -.. bpo: 26313 -.. date: 9581 -.. nonce: LjZAjy -.. original section: Library -.. section: Security - -ssl.py _load_windows_store_certs fails if windows cert store is empty. Patch -by Baji. - -.. - -.. bpo: 26569 -.. date: 9580 -.. nonce: EX8vF1 -.. section: Library - -Fix :func:`pyclbr.readmodule` and :func:`pyclbr.readmodule_ex` to support -importing packages. - -.. - -.. bpo: 26499 -.. date: 9579 -.. nonce: NP08PI -.. section: Library - -Account for remaining Content-Length in HTTPResponse.readline() and read1(). -Based on patch by Silent Ghost. Also document that HTTPResponse now supports -these methods. - -.. - -.. bpo: 25320 -.. date: 9578 -.. nonce: V96LIy -.. section: Library - -Handle sockets in directories unittest discovery is scanning. Patch from -Victor van den Elzen. - -.. - -.. bpo: 16181 -.. date: 9577 -.. nonce: P7lLvo -.. section: Library - -cookiejar.http2time() now returns None if year is higher than -datetime.MAXYEAR. - -.. - -.. bpo: 26513 -.. date: 9576 -.. nonce: HoPepy -.. section: Library - -Fixes platform module detection of Windows Server - -.. - -.. bpo: 23718 -.. date: 9575 -.. nonce: AMPC0o -.. section: Library - -Fixed parsing time in week 0 before Jan 1. Original patch by Tamás Bence -Gedai. - -.. - -.. bpo: 20589 -.. date: 9574 -.. nonce: NsQ_I1 -.. section: Library - -Invoking Path.owner() and Path.group() on Windows now raise -NotImplementedError instead of ImportError. - -.. - -.. bpo: 26177 -.. date: 9573 -.. nonce: HlSWer -.. section: Library - -Fixed the keys() method for Canvas and Scrollbar widgets. - -.. - -.. bpo: 15068 -.. date: 9572 -.. nonce: bcHtiw -.. section: Library - -Got rid of excessive buffering in the fileinput module. The bufsize -parameter is no longer used. - -.. - -.. bpo: 2202 -.. date: 9571 -.. nonce: dk9sd0 -.. section: Library - -Fix UnboundLocalError in AbstractDigestAuthHandler.get_algorithm_impls. -Initial patch by Mathieu Dupuy. - -.. - -.. bpo: 25718 -.. date: 9570 -.. nonce: 4EjZyv -.. section: Library - -Fixed pickling and copying the accumulate() iterator with total is None. - -.. - -.. bpo: 26475 -.. date: 9569 -.. nonce: JXVccY -.. section: Library - -Fixed debugging output for regular expressions with the (?x) flag. - -.. - -.. bpo: 26457 -.. date: 9568 -.. nonce: Xe6Clh -.. section: Library - -Fixed the subnets() methods in IP network classes for the case when -resulting prefix length is equal to maximal prefix length. Based on patch by -Xiang Zhang. - -.. - -.. bpo: 26385 -.. date: 9567 -.. nonce: 50bDXm -.. section: Library - -Remove the file if the internal open() call in NamedTemporaryFile() fails. -Patch by Silent Ghost. - -.. - -.. bpo: 26402 -.. date: 9566 -.. nonce: k7DVuU -.. section: Library - -Fix XML-RPC client to retry when the server shuts down a persistent -connection. This was a regression related to the new -http.client.RemoteDisconnected exception in 3.5.0a4. - -.. - -.. bpo: 25913 -.. date: 9565 -.. nonce: 5flb95 -.. section: Library - -Leading ``<~`` is optional now in base64.a85decode() with adobe=True. Patch -by Swati Jaiswal. - -.. - -.. bpo: 26186 -.. date: 9564 -.. nonce: R9rfiL -.. section: Library - -Remove an invalid type check in importlib.util.LazyLoader. - -.. - -.. bpo: 26367 -.. date: 9563 -.. nonce: ckpNeU -.. section: Library - -importlib.__import__() raises SystemError like builtins.__import__() when -``level`` is specified but without an accompanying package specified. - -.. - -.. bpo: 26309 -.. date: 9562 -.. nonce: ubEeiz -.. section: Library - -In the "socketserver" module, shut down the request (closing the connected -socket) when verify_request() returns false. Patch by Aviv Palivoda. - -.. - -.. bpo: 25939 -.. date: 9561 -.. nonce: X49Fqd -.. original section: Library -.. section: Security - -On Windows open the cert store readonly in ssl.enum_certificates. - -.. - -.. bpo: 25995 -.. date: 9560 -.. nonce: NfcimP -.. section: Library - -os.walk() no longer uses FDs proportional to the tree depth. - -.. - -.. bpo: 26117 -.. date: 9559 -.. nonce: ne6p11 -.. section: Library - -The os.scandir() iterator now closes file descriptor not only when the -iteration is finished, but when it was failed with error. - -.. - -.. bpo: 25911 -.. date: 9558 -.. nonce: d4Zadh -.. section: Library - -Restored support of bytes paths in os.walk() on Windows. - -.. - -.. bpo: 26045 -.. date: 9557 -.. nonce: WmzUrX -.. section: Library - -Add UTF-8 suggestion to error message when posting a non-Latin-1 string with -http.client. - -.. - -.. bpo: 12923 -.. date: 9556 -.. nonce: HPAu-B -.. section: Library - -Reset FancyURLopener's redirect counter even if there is an exception. -Based on patches by Brian Brazil and Daniel Rocco. - -.. - -.. bpo: 25945 -.. date: 9555 -.. nonce: guNgNM -.. section: Library - -Fixed a crash when unpickle the functools.partial object with wrong state. -Fixed a leak in failed functools.partial constructor. "args" and "keywords" -attributes of functools.partial have now always types tuple and dict -correspondingly. - -.. - -.. bpo: 26202 -.. date: 9554 -.. nonce: LPIXLg -.. section: Library - -copy.deepcopy() now correctly copies range() objects with non-atomic -attributes. - -.. - -.. bpo: 23076 -.. date: 9553 -.. nonce: 8rphoP -.. section: Library - -Path.glob() now raises a ValueError if it's called with an invalid pattern. -Patch by Thomas Nyberg. - -.. - -.. bpo: 19883 -.. date: 9552 -.. nonce: z9TsO6 -.. section: Library - -Fixed possible integer overflows in zipimport. - -.. - -.. bpo: 26227 -.. date: 9551 -.. nonce: Fe6oiB -.. section: Library - -On Windows, getnameinfo(), gethostbyaddr() and gethostbyname_ex() functions -of the socket module now decode the hostname from the ANSI code page rather -than UTF-8. - -.. - -.. bpo: 26147 -.. date: 9550 -.. nonce: i-Jc01 -.. section: Library - -xmlrpc now works with strings not encodable with used non-UTF-8 encoding. - -.. - -.. bpo: 25935 -.. date: 9549 -.. nonce: cyni91 -.. section: Library - -Garbage collector now breaks reference loops with OrderedDict. - -.. - -.. bpo: 16620 -.. date: 9548 -.. nonce: rxpn_Y -.. section: Library - -Fixed AttributeError in msilib.Directory.glob(). - -.. - -.. bpo: 26013 -.. date: 9547 -.. nonce: 93RKNz -.. section: Library - -Added compatibility with broken protocol 2 pickles created in old Python 3 -versions (3.4.3 and lower). - -.. - -.. bpo: 25850 -.. date: 9546 -.. nonce: jwFPxj -.. section: Library - -Use cross-compilation by default for 64-bit Windows. - -.. - -.. bpo: 17633 -.. date: 9545 -.. nonce: 9mpbUO -.. section: Library - -Improve zipimport's support for namespace packages. - -.. - -.. bpo: 24705 -.. date: 9544 -.. nonce: IZYwjR -.. section: Library - -Fix sysconfig._parse_makefile not expanding ${} vars appearing before $() -vars. - -.. - -.. bpo: 22138 -.. date: 9543 -.. nonce: nRNYkc -.. section: Library - -Fix mock.patch behavior when patching descriptors. Restore original values -after patching. Patch contributed by Sean McCully. - -.. - -.. bpo: 25672 -.. date: 9542 -.. nonce: fw9RJP -.. section: Library - -In the ssl module, enable the SSL_MODE_RELEASE_BUFFERS mode option if it is -safe to do so. - -.. - -.. bpo: 26012 -.. date: 9541 -.. nonce: IFSXNm -.. section: Library - -Don't traverse into symlinks for ``**`` pattern in pathlib.Path.[r]glob(). - -.. - -.. bpo: 24120 -.. date: 9540 -.. nonce: Yiwa0h -.. section: Library - -Ignore PermissionError when traversing a tree with pathlib.Path.[r]glob(). -Patch by Ulrich Petri. - -.. - -.. bpo: 25447 -.. date: 9539 -.. nonce: -4m4xO -.. section: Library - -fileinput now uses sys.stdin as-is if it does not have a buffer attribute -(restores backward compatibility). - -.. - -.. bpo: 25447 -.. date: 9538 -.. nonce: AtHkWA -.. section: Library - -Copying the lru_cache() wrapper object now always works, independently from -the type of the wrapped object (by returning the original object unchanged). - -.. - -.. bpo: 24103 -.. date: 9537 -.. nonce: WufqrQ -.. section: Library - -Fixed possible use after free in ElementTree.XMLPullParser. - -.. - -.. bpo: 25860 -.. date: 9536 -.. nonce: 0hActb -.. section: Library - -os.fwalk() no longer skips remaining directories when error occurs. -Original patch by Samson Lee. - -.. - -.. bpo: 25914 -.. date: 9535 -.. nonce: h0V61F -.. section: Library - -Fixed and simplified OrderedDict.__sizeof__. - -.. - -.. bpo: 25902 -.. date: 9534 -.. nonce: 6t2FmH -.. section: Library - -Fixed various refcount issues in ElementTree iteration. - -.. - -.. bpo: 25717 -.. date: 9533 -.. nonce: 0_xjaK -.. section: Library - -Restore the previous behaviour of tolerating most fstat() errors when -opening files. This was a regression in 3.5a1, and stopped anonymous -temporary files from working in special cases. - -.. - -.. bpo: 24903 -.. date: 9532 -.. nonce: 3LBdzb -.. section: Library - -Fix regression in number of arguments compileall accepts when '-d' is -specified. The check on the number of arguments has been dropped completely -as it never worked correctly anyway. - -.. - -.. bpo: 25764 -.. date: 9531 -.. nonce: 7WWG07 -.. section: Library - -In the subprocess module, preserve any exception caused by fork() failure -when preexec_fn is used. - -.. - -.. bpo: 6478 -.. date: 9530 -.. nonce: -Bi9Hb -.. section: Library - -_strptime's regexp cache now is reset after changing timezone with -time.tzset(). - -.. - -.. bpo: 14285 -.. date: 9529 -.. nonce: UyG8Hj -.. section: Library - -When executing a package with the "python -m package" option, and package -initialization fails, a proper traceback is now reported. The "runpy" -module now lets exceptions from package initialization pass back to the -caller, rather than raising ImportError. - -.. - -.. bpo: 19771 -.. date: 9528 -.. nonce: 5NG-bg -.. section: Library - -Also in runpy and the "-m" option, omit the irrelevant message ". . . is a -package and cannot be directly executed" if the package could not even be -initialized (e.g. due to a bad ``*.pyc`` file). - -.. - -.. bpo: 25177 -.. date: 9527 -.. nonce: aNR4Ha -.. section: Library - -Fixed problem with the mean of very small and very large numbers. As a side -effect, statistics.mean and statistics.variance should be significantly -faster. - -.. - -.. bpo: 25718 -.. date: 9526 -.. nonce: D9mHZF -.. section: Library - -Fixed copying object with state with boolean value is false. - -.. - -.. bpo: 10131 -.. date: 9525 -.. nonce: a7tptz -.. section: Library - -Fixed deep copying of minidom documents. Based on patch by Marian Ganisin. - -.. - -.. bpo: 25725 -.. date: 9524 -.. nonce: XIKv3R -.. section: Library - -Fixed a reference leak in pickle.loads() when unpickling invalid data -including tuple instructions. - -.. - -.. bpo: 25663 -.. date: 9523 -.. nonce: Ofwfqa -.. section: Library - -In the Readline completer, avoid listing duplicate global names, and search -the global namespace before searching builtins. - -.. - -.. bpo: 25688 -.. date: 9522 -.. nonce: 8P1HOv -.. section: Library - -Fixed file leak in ElementTree.iterparse() raising an error. - -.. - -.. bpo: 23914 -.. date: 9521 -.. nonce: 1sEz4J -.. section: Library - -Fixed SystemError raised by unpickler on broken pickle data. - -.. - -.. bpo: 25691 -.. date: 9520 -.. nonce: ZEaapY -.. section: Library - -Fixed crash on deleting ElementTree.Element attributes. - -.. - -.. bpo: 25624 -.. date: 9519 -.. nonce: ed-fM0 -.. section: Library - -ZipFile now always writes a ZIP_STORED header for directory entries. Patch -by Dingyuan Wang. - -.. - -.. bpo: 0 -.. date: 9518 -.. nonce: rtZyid -.. section: Library - -Skip getaddrinfo if host is already resolved. Patch by A. Jesse Jiryu Davis. - -.. - -.. bpo: 26050 -.. date: 9517 -.. nonce: sclyvk -.. section: Library - -Add asyncio.StreamReader.readuntil() method. Patch by Марк Коренберг. - -.. - -.. bpo: 25924 -.. date: 9516 -.. nonce: Uxr2vt -.. section: Library - -Avoid unnecessary serialization of getaddrinfo(3) calls on OS X versions -10.5 or higher. Original patch by A. Jesse Jiryu Davis. - -.. - -.. bpo: 26406 -.. date: 9515 -.. nonce: ihvhF4 -.. section: Library - -Avoid unnecessary serialization of getaddrinfo(3) calls on current versions -of OpenBSD and NetBSD. Patch by A. Jesse Jiryu Davis. - -.. - -.. bpo: 26848 -.. date: 9514 -.. nonce: ChBOpQ -.. section: Library - -Fix asyncio/subprocess.communicate() to handle empty input. Patch by Jack -O'Connor. - -.. - -.. bpo: 27040 -.. date: 9513 -.. nonce: UASyCC -.. section: Library - -Add loop.get_exception_handler method - -.. - -.. bpo: 27041 -.. date: 9512 -.. nonce: p3893U -.. section: Library - -asyncio: Add loop.create_future method - -.. - -.. bpo: 27223 -.. date: 9511 -.. nonce: PRf4I6 -.. section: Library - -asyncio: Fix _read_ready and _write_ready to respect _conn_lost. Patch by -Łukasz Langa. - -.. - -.. bpo: 22970 -.. date: 9510 -.. nonce: WhdhyM -.. section: Library - -asyncio: Fix inconsistency cancelling Condition.wait. Patch by David Coles. - -.. - -.. bpo: 5124 -.. date: 9509 -.. nonce: 4kwBvM -.. section: IDLE - -Paste with text selected now replaces the selection on X11. This matches how -paste works on Windows, Mac, most modern Linux apps, and ttk widgets. -Original patch by Serhiy Storchaka. - -.. - -.. bpo: 24759 -.. date: 9508 -.. nonce: ccmySu -.. section: IDLE - -Make clear in idlelib.idle_test.__init__ that the directory is a private -implementation of test.test_idle and tool for maintainers. - -.. - -.. bpo: 27196 -.. date: 9507 -.. nonce: 3yp8TF -.. section: IDLE - -Stop 'ThemeChanged' warnings when running IDLE tests. These persisted after -other warnings were suppressed in #20567. Apply Serhiy Storchaka's -update_idletasks solution to four test files. Record this additional advice -in idle_test/README.txt - -.. - -.. bpo: 20567 -.. date: 9506 -.. nonce: hhT32b -.. section: IDLE - -Revise idle_test/README.txt with advice about avoiding tk warning messages -from tests. Apply advice to several IDLE tests. - -.. - -.. bpo: 27117 -.. date: 9505 -.. nonce: YrLPf4 -.. section: IDLE - -Make colorizer htest and turtledemo work with dark themes. Move code for -configuring text widget colors to a new function. - -.. - -.. bpo: 26673 -.. date: 9504 -.. nonce: dh0_Ij -.. section: IDLE - -When tk reports font size as 0, change to size 10. Such fonts on Linux -prevented the configuration dialog from opening. - -.. - -.. bpo: 21939 -.. date: 9503 -.. nonce: pWz-OK -.. section: IDLE - -Add test for IDLE's percolator. Original patch by Saimadhav Heblikar. - -.. - -.. bpo: 21676 -.. date: 9502 -.. nonce: hqy6Qh -.. section: IDLE - -Add test for IDLE's replace dialog. Original patch by Saimadhav Heblikar. - -.. - -.. bpo: 18410 -.. date: 9501 -.. nonce: DLSPZo -.. section: IDLE - -Add test for IDLE's search dialog. Original patch by Westley Martínez. - -.. - -.. bpo: 21703 -.. date: 9500 -.. nonce: BAZfDM -.. section: IDLE - -Add test for IDLE's undo delegator. Original patch by Saimadhav Heblikar . - -.. - -.. bpo: 27044 -.. date: 9499 -.. nonce: 4y7tyM -.. section: IDLE - -Add ConfigDialog.remove_var_callbacks to stop memory leaks. - -.. - -.. bpo: 23977 -.. date: 9498 -.. nonce: miDjj8 -.. section: IDLE - -Add more asserts to test_delegator. - -.. - -.. bpo: 20640 -.. date: 9497 -.. nonce: PmI-G8 -.. section: IDLE - -Add tests for idlelib.configHelpSourceEdit. Patch by Saimadhav Heblikar. - -.. - -.. bpo: 0 -.. date: 9496 -.. nonce: _YJfG7 -.. section: IDLE - -In the 'IDLE-console differences' section of the IDLE doc, clarify how -running with IDLE affects sys.modules and the standard streams. - -.. - -.. bpo: 25507 -.. date: 9495 -.. nonce: i8bNpk -.. section: IDLE - -fix incorrect change in IOBinding that prevented printing. Augment IOBinding -htest to include all major IOBinding functions. - -.. - -.. bpo: 25905 -.. date: 9494 -.. nonce: FzNb3B -.. section: IDLE - -Revert unwanted conversion of ' to ’ RIGHT SINGLE QUOTATION MARK in -README.txt and open this and NEWS.txt with 'ascii'. Re-encode CREDITS.txt to -utf-8 and open it with 'utf-8'. - -.. - -.. bpo: 19489 -.. date: 9493 -.. nonce: jvzuO7 -.. section: Documentation - -Moved the search box from the sidebar to the header and footer of each page. -Patch by Ammar Askar. - -.. - -.. bpo: 24136 -.. date: 9492 -.. nonce: MUK0zK -.. section: Documentation - -Document the new :pep:`448` unpacking syntax of 3.5. - -.. - -.. bpo: 26736 -.. date: 9491 -.. nonce: U_Hyqo -.. section: Documentation - -Used HTTPS for external links in the documentation if possible. - -.. - -.. bpo: 6953 -.. date: 9490 -.. nonce: Zk6rno -.. section: Documentation - -Rework the Readline module documentation to group related functions -together, and add more details such as what underlying Readline functions -and variables are accessed. - -.. - -.. bpo: 23606 -.. date: 9489 -.. nonce: 9MhIso -.. section: Documentation - -Adds note to ctypes documentation regarding cdll.msvcrt. - -.. - -.. bpo: 25500 -.. date: 9488 -.. nonce: AV47eF -.. section: Documentation - -Fix documentation to not claim that __import__ is searched for in the global -scope. - -.. - -.. bpo: 26014 -.. date: 9487 -.. nonce: ptdZ_I -.. section: Documentation - -Update 3.x packaging documentation: * "See also" links to the new docs are -now provided in the legacy pages * links to setuptools documentation have -been updated - -.. - -.. bpo: 21916 -.. date: 9486 -.. nonce: muwCyp -.. section: Tests - -Added tests for the turtle module. Patch by ingrid, Gregory Loyse and Jelle -Zijlstra. - -.. - -.. bpo: 26523 -.. date: 9485 -.. nonce: em_Uzt -.. section: Tests - -The multiprocessing thread pool (multiprocessing.dummy.Pool) was untested. - -.. - -.. bpo: 26015 -.. date: 9484 -.. nonce: p3oWK3 -.. section: Tests - -Added new tests for pickling iterators of mutable sequences. - -.. - -.. bpo: 26325 -.. date: 9483 -.. nonce: KOUc82 -.. section: Tests - -Added test.support.check_no_resource_warning() to check that no -ResourceWarning is emitted. - -.. - -.. bpo: 25940 -.. date: 9482 -.. nonce: PgiLVN -.. section: Tests - -Changed test_ssl to use self-signed.pythontest.net. This avoids relying on -svn.python.org, which recently changed root certificate. - -.. - -.. bpo: 25616 -.. date: 9481 -.. nonce: Qr-60p -.. section: Tests - -Tests for OrderedDict are extracted from test_collections into separate file -test_ordered_dict. - -.. - -.. bpo: 26583 -.. date: 9480 -.. nonce: Up7hTl -.. section: Tests - -Skip test_timestamp_overflow in test_import if bytecode files cannot be -written. - -.. - -.. bpo: 26884 -.. date: 9479 -.. nonce: O8-azL -.. section: Build - -Fix linking extension modules for cross builds. Patch by Xavier de Gaye. - -.. - -.. bpo: 22359 -.. date: 9478 -.. nonce: HDjM4s -.. section: Build - -Disable the rules for running _freeze_importlib and pgen when -cross-compiling. The output of these programs is normally saved with the -source code anyway, and is still regenerated when doing a native build. -Patch by Xavier de Gaye. - -.. - -.. bpo: 27229 -.. date: 9477 -.. nonce: C2NDch -.. section: Build - -Fix the cross-compiling pgen rule for in-tree builds. Patch by Xavier de -Gaye. - -.. - -.. bpo: 21668 -.. date: 9476 -.. nonce: 4sMAa1 -.. section: Build - -Link audioop, _datetime, _ctypes_test modules to libm, except on Mac OS X. -Patch written by Xavier de Gaye. - -.. - -.. bpo: 25702 -.. date: 9475 -.. nonce: ipxyJs -.. section: Build - -A --with-lto configure option has been added that will enable link time -optimizations at build time during a make profile-opt. Some compilers and -toolchains are known to not produce stable code when using LTO, be sure to -test things thoroughly before relying on it. It can provide a few % speed up -over profile-opt alone. - -.. - -.. bpo: 26624 -.. date: 9474 -.. nonce: 4fGrTl -.. section: Build - -Adds validation of ucrtbase[d].dll version with warning for old versions. - -.. - -.. bpo: 17603 -.. date: 9473 -.. nonce: 102DA- -.. section: Build - -Avoid error about nonexistent fileblocks.o file by using a lower-level check -for st_blocks in struct stat. - -.. - -.. bpo: 26079 -.. date: 9472 -.. nonce: mEzW0O -.. section: Build - -Fixing the build output folder for tix-8.4.3.6. Patch by Bjoern Thiel. - -.. - -.. bpo: 26465 -.. date: 9471 -.. nonce: _YR608 -.. section: Build - -Update Windows builds to use OpenSSL 1.0.2g. - -.. - -.. bpo: 24421 -.. date: 9470 -.. nonce: 2zY7vM -.. section: Build - -Compile Modules/_math.c once, before building extensions. Previously it -could fail to compile properly if the math and cmath builds were concurrent. - -.. - -.. bpo: 25348 -.. date: 9469 -.. nonce: u6_BaQ -.. section: Build - -Added ``--pgo`` and ``--pgo-job`` arguments to ``PCbuild\build.bat`` for -building with Profile-Guided Optimization. The old -``PCbuild\build_pgo.bat`` script is now deprecated, and simply calls -``PCbuild\build.bat --pgo %*``. - -.. - -.. bpo: 25827 -.. date: 9468 -.. nonce: yg3DMM -.. section: Build - -Add support for building with ICC to ``configure``, including a new -``--with-icc`` flag. - -.. - -.. bpo: 25696 -.. date: 9467 -.. nonce: 2R_wIv -.. section: Build - -Fix installation of Python on UNIX with make -j9. - -.. - -.. bpo: 26930 -.. date: 9466 -.. nonce: Sqz2O3 -.. section: Build - -Update OS X 10.5+ 32-bit-only installer to build and link with OpenSSL -1.0.2h. - -.. - -.. bpo: 26268 -.. date: 9465 -.. nonce: I3-YLh -.. section: Build - -Update Windows builds to use OpenSSL 1.0.2f. - -.. - -.. bpo: 25136 -.. date: 9464 -.. nonce: Vi-fmO -.. section: Build - -Support Apple Xcode 7's new textual SDK stub libraries. - -.. - -.. bpo: 24324 -.. date: 9463 -.. nonce: m6DZMx -.. section: Build - -Do not enable unreachable code warnings when using gcc as the option does -not work correctly in older versions of gcc and has been silently removed as -of gcc-4.5. - -.. - -.. bpo: 27053 -.. date: 9462 -.. nonce: 1IRbae -.. section: Windows - -Updates make_zip.py to correctly generate library ZIP file. - -.. - -.. bpo: 26268 -.. date: 9461 -.. nonce: Z-lJEh -.. section: Windows - -Update the prepare_ssl.py script to handle OpenSSL releases that don't -include the contents of the include directory (that is, 1.0.2e and later). - -.. - -.. bpo: 26071 -.. date: 9460 -.. nonce: wLxL2l -.. section: Windows - -bdist_wininst created binaries fail to start and find 32bit Python - -.. - -.. bpo: 26073 -.. date: 9459 -.. nonce: XwWgHp -.. section: Windows - -Update the list of magic numbers in launcher - -.. - -.. bpo: 26065 -.. date: 9458 -.. nonce: SkVLJp -.. section: Windows - -Excludes venv from library when generating embeddable distro. - -.. - -.. bpo: 26799 -.. date: 9457 -.. nonce: gK2VXX -.. section: Tools/Demos - -Fix python-gdb.py: don't get C types once when the Python code is loaded, -but get C types on demand. The C types can change if python-gdb.py is loaded -before the Python executable. Patch written by Thomas Ilsche. - -.. - -.. bpo: 26271 -.. date: 9456 -.. nonce: wg-rzr -.. section: Tools/Demos - -Fix the Freeze tool to properly use flags passed through configure. Patch by -Daniel Shaulov. - -.. - -.. bpo: 26489 -.. date: 9455 -.. nonce: rJ_U5S -.. section: Tools/Demos - -Add dictionary unpacking support to Tools/parser/unparse.py. Patch by Guo Ci -Teo. - -.. - -.. bpo: 26316 -.. date: 9454 -.. nonce: QJvVOi -.. section: Tools/Demos - -Fix variable name typo in Argument Clinic. - -.. - -.. bpo: 17500 -.. date: 9453 -.. nonce: QTZbRV -.. section: Windows - -Remove unused and outdated icons. (See also: -https://github.com/python/pythondotorg/issues/945) diff --git a/Misc/NEWS.d/3.5.3.rst b/Misc/NEWS.d/3.5.3.rst deleted file mode 100644 index c3fcb67a4563f984726ba02ee585bb6f9959f579..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.3.rst +++ /dev/null @@ -1,7 +0,0 @@ -.. bpo: 0 -.. date: 9899 -.. no changes: True -.. nonce: zYPqUK -.. release date: 2017-01-17 - -There were no code changes between 3.5.3rc1 and 3.5.3 final. diff --git a/Misc/NEWS.d/3.5.3rc1.rst b/Misc/NEWS.d/3.5.3rc1.rst deleted file mode 100644 index 037cfe416510b9be9c6ec013e52bc73b1a874f0e..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.3rc1.rst +++ /dev/null @@ -1,2163 +0,0 @@ -.. bpo: 29073 -.. date: 9898 -.. nonce: EFpHQ7 -.. release date: 2017-01-02 -.. section: Core and Builtins - -bytearray formatting no longer truncates on first null byte. - -.. - -.. bpo: 28932 -.. date: 9897 -.. nonce: QnLx8A -.. section: Core and Builtins - -Do not include if it does not exist. - -.. - -.. bpo: 28147 -.. date: 9896 -.. nonce: EV4bm6 -.. section: Core and Builtins - -Fix a memory leak in split-table dictionaries: setattr() must not convert -combined table into split table. - -.. - -.. bpo: 25677 -.. date: 9895 -.. nonce: RWhZrb -.. section: Core and Builtins - -Correct the positioning of the syntax error caret for indented blocks. -Based on patch by Michael Layzell. - -.. - -.. bpo: 29000 -.. date: 9894 -.. nonce: K6wQ-3 -.. section: Core and Builtins - -Fixed bytes formatting of octals with zero padding in alternate form. - -.. - -.. bpo: 28512 -.. date: 9893 -.. nonce: i-pv6d -.. section: Core and Builtins - -Fixed setting the offset attribute of SyntaxError by -PyErr_SyntaxLocationEx() and PyErr_SyntaxLocationObject(). - -.. - -.. bpo: 28991 -.. date: 9892 -.. nonce: -qOTxS -.. section: Core and Builtins - -functools.lru_cache() was susceptible to an obscure reentrancy bug caused by -a monkey-patched len() function. - -.. - -.. bpo: 28648 -.. date: 9891 -.. nonce: z7B52W -.. section: Core and Builtins - -Fixed crash in Py_DecodeLocale() in debug build on Mac OS X when decode -astral characters. Patch by Xiang Zhang. - -.. - -.. bpo: 19398 -.. date: 9890 -.. nonce: RYbEGH -.. section: Core and Builtins - -Extra slash no longer added to sys.path components in case of empty -compile-time PYTHONPATH components. - -.. - -.. bpo: 28426 -.. date: 9889 -.. nonce: E_quyK -.. section: Core and Builtins - -Fixed potential crash in PyUnicode_AsDecodedObject() in debug build. - -.. - -.. bpo: 23782 -.. date: 9888 -.. nonce: lonDzj -.. section: Core and Builtins - -Fixed possible memory leak in _PyTraceback_Add() and exception loss in -PyTraceBack_Here(). - -.. - -.. bpo: 28379 -.. date: 9887 -.. nonce: DuXlco -.. section: Core and Builtins - -Added sanity checks and tests for PyUnicode_CopyCharacters(). Patch by Xiang -Zhang. - -.. - -.. bpo: 28376 -.. date: 9886 -.. nonce: oPD-5D -.. section: Core and Builtins - -The type of long range iterator is now registered as Iterator. Patch by Oren -Milman. - -.. - -.. bpo: 28376 -.. date: 9885 -.. nonce: fLeHM2 -.. section: Core and Builtins - -The constructor of range_iterator now checks that step is not 0. Patch by -Oren Milman. - -.. - -.. bpo: 26906 -.. date: 9884 -.. nonce: YBjcwI -.. section: Core and Builtins - -Resolving special methods of uninitialized type now causes implicit -initialization of the type instead of a fail. - -.. - -.. bpo: 18287 -.. date: 9883 -.. nonce: k6jffS -.. section: Core and Builtins - -PyType_Ready() now checks that tp_name is not NULL. Original patch by Niklas -Koep. - -.. - -.. bpo: 24098 -.. date: 9882 -.. nonce: XqlP_1 -.. section: Core and Builtins - -Fixed possible crash when AST is changed in process of compiling it. - -.. - -.. bpo: 28350 -.. date: 9881 -.. nonce: 8M5Eg9 -.. section: Core and Builtins - -String constants with null character no longer interned. - -.. - -.. bpo: 26617 -.. date: 9880 -.. nonce: Gh5LvN -.. section: Core and Builtins - -Fix crash when GC runs during weakref callbacks. - -.. - -.. bpo: 27942 -.. date: 9879 -.. nonce: ZGuhns -.. section: Core and Builtins - -String constants now interned recursively in tuples and frozensets. - -.. - -.. bpo: 21578 -.. date: 9878 -.. nonce: GI1bhj -.. section: Core and Builtins - -Fixed misleading error message when ImportError called with invalid keyword -args. - -.. - -.. bpo: 28203 -.. date: 9877 -.. nonce: kOgvtp -.. section: Core and Builtins - -Fix incorrect type in error message from ``complex(1.0, {2:3})``. Patch by -Soumya Sharma. - -.. - -.. bpo: 27955 -.. date: 9876 -.. nonce: HC4pZ4 -.. section: Core and Builtins - -Fallback on reading /dev/urandom device when the getrandom() syscall fails -with EPERM, for example when blocked by SECCOMP. - -.. - -.. bpo: 28131 -.. date: 9875 -.. nonce: owq0wW -.. section: Core and Builtins - -Fix a regression in zipimport's compile_source(). zipimport should use the -same optimization level as the interpreter. - -.. - -.. bpo: 25221 -.. date: 9874 -.. nonce: Zvkz9i -.. section: Core and Builtins - -Fix corrupted result from PyLong_FromLong(0) when Python is compiled with -NSMALLPOSINTS = 0. - -.. - -.. bpo: 25758 -.. date: 9873 -.. nonce: yR-YTD -.. section: Core and Builtins - -Prevents zipimport from unnecessarily encoding a filename (patch by Eryk -Sun) - -.. - -.. bpo: 28189 -.. date: 9872 -.. nonce: c_nbR_ -.. section: Core and Builtins - -dictitems_contains no longer swallows compare errors. (Patch by Xiang Zhang) - -.. - -.. bpo: 27812 -.. date: 9871 -.. nonce: sidcs8 -.. section: Core and Builtins - -Properly clear out a generator's frame's backreference to the generator to -prevent crashes in frame.clear(). - -.. - -.. bpo: 27811 -.. date: 9870 -.. nonce: T4AuBo -.. section: Core and Builtins - -Fix a crash when a coroutine that has not been awaited is finalized with -warnings-as-errors enabled. - -.. - -.. bpo: 27587 -.. date: 9869 -.. nonce: mbavY2 -.. section: Core and Builtins - -Fix another issue found by PVS-Studio: Null pointer check after use of 'def' -in _PyState_AddModule(). Initial patch by Christian Heimes. - -.. - -.. bpo: 26020 -.. date: 9868 -.. nonce: niLbLa -.. section: Core and Builtins - -set literal evaluation order did not match documented behaviour. - -.. - -.. bpo: 27782 -.. date: 9867 -.. nonce: C8OBQD -.. section: Core and Builtins - -Multi-phase extension module import now correctly allows the ``m_methods`` -field to be used to add module level functions to instances of non-module -types returned from ``Py_create_mod``. Patch by Xiang Zhang. - -.. - -.. bpo: 27936 -.. date: 9866 -.. nonce: AdOann -.. section: Core and Builtins - -The round() function accepted a second None argument for some types but not -for others. Fixed the inconsistency by accepting None for all numeric -types. - -.. - -.. bpo: 27487 -.. date: 9865 -.. nonce: jeTQNr -.. section: Core and Builtins - -Warn if a submodule argument to "python -m" or runpy.run_module() is found -in sys.modules after parent packages are imported, but before the submodule -is executed. - -.. - -.. bpo: 27558 -.. date: 9864 -.. nonce: VmltMh -.. section: Core and Builtins - -Fix a SystemError in the implementation of "raise" statement. In a brand new -thread, raise a RuntimeError since there is no active exception to reraise. -Patch written by Xiang Zhang. - -.. - -.. bpo: 27419 -.. date: 9863 -.. nonce: JZ94ju -.. section: Core and Builtins - -Standard __import__() no longer look up "__import__" in globals or builtins -for importing submodules or "from import". Fixed handling an error of -non-string package name. - -.. - -.. bpo: 27083 -.. date: 9862 -.. nonce: F4ZT1C -.. section: Core and Builtins - -Respect the PYTHONCASEOK environment variable under Windows. - -.. - -.. bpo: 27514 -.. date: 9861 -.. nonce: NLbwPG -.. section: Core and Builtins - -Make having too many statically nested blocks a SyntaxError instead of -SystemError. - -.. - -.. bpo: 27473 -.. date: 9860 -.. nonce: _nOtTA -.. section: Core and Builtins - -Fixed possible integer overflow in bytes and bytearray concatenations. -Patch by Xiang Zhang. - -.. - -.. bpo: 27507 -.. date: 9859 -.. nonce: 3pX0Be -.. section: Core and Builtins - -Add integer overflow check in bytearray.extend(). Patch by Xiang Zhang. - -.. - -.. bpo: 27581 -.. date: 9858 -.. nonce: KezjNt -.. section: Core and Builtins - -Don't rely on wrapping for overflow check in PySequence_Tuple(). Patch by -Xiang Zhang. - -.. - -.. bpo: 27443 -.. date: 9857 -.. nonce: 87ZwZ1 -.. section: Core and Builtins - -__length_hint__() of bytearray iterators no longer return a negative integer -for a resized bytearray. - -.. - -.. bpo: 27942 -.. date: 9856 -.. nonce: wCAkW5 -.. section: Core and Builtins - -Fix memory leak in codeobject.c - -.. - -.. bpo: 15812 -.. date: 9855 -.. nonce: R1U-Ec -.. section: Library - -inspect.getframeinfo() now correctly shows the first line of a context. -Patch by Sam Breese. - -.. - -.. bpo: 29094 -.. date: 9854 -.. nonce: 460ZQo -.. section: Library - -Offsets in a ZIP file created with extern file object and modes "w" and "x" -now are relative to the start of the file. - -.. - -.. bpo: 13051 -.. date: 9853 -.. nonce: YzC1Te -.. section: Library - -Fixed recursion errors in large or resized curses.textpad.Textbox. Based on -patch by Tycho Andersen. - -.. - -.. bpo: 29119 -.. date: 9852 -.. nonce: Ov69fr -.. section: Library - -Fix weakrefs in the pure python version of collections.OrderedDict -move_to_end() method. Contributed by Andra Bogildea. - -.. - -.. bpo: 9770 -.. date: 9851 -.. nonce: WJJnwP -.. section: Library - -curses.ascii predicates now work correctly with negative integers. - -.. - -.. bpo: 28427 -.. date: 9850 -.. nonce: vUd-va -.. section: Library - -old keys should not remove new values from WeakValueDictionary when -collecting from another thread. - -.. - -.. bpo: 28923 -.. date: 9849 -.. nonce: naVULD -.. section: Library - -Remove editor artifacts from Tix.py. - -.. - -.. bpo: 28871 -.. date: 9848 -.. nonce: cPMXCJ -.. section: Library - -Fixed a crash when deallocate deep ElementTree. - -.. - -.. bpo: 19542 -.. date: 9847 -.. nonce: 5tCkaK -.. section: Library - -Fix bugs in WeakValueDictionary.setdefault() and WeakValueDictionary.pop() -when a GC collection happens in another thread. - -.. - -.. bpo: 20191 -.. date: 9846 -.. nonce: P_EZ7c -.. section: Library - -Fixed a crash in resource.prlimit() when pass a sequence that doesn't own -its elements as limits. - -.. - -.. bpo: 28779 -.. date: 9845 -.. nonce: t-mjED -.. section: Library - -multiprocessing.set_forkserver_preload() would crash the forkserver process -if a preloaded module instantiated some multiprocessing objects such as -locks. - -.. - -.. bpo: 28847 -.. date: 9844 -.. nonce: J7d3nG -.. section: Library - -dbm.dumb now supports reading read-only files and no longer writes the index -file when it is not changed. - -.. - -.. bpo: 25659 -.. date: 9843 -.. nonce: lE2IlT -.. section: Library - -In ctypes, prevent a crash calling the from_buffer() and from_buffer_copy() -methods on abstract classes like Array. - -.. - -.. bpo: 28732 -.. date: 9842 -.. nonce: xkG8k7 -.. section: Library - -Fix crash in os.spawnv() with no elements in args - -.. - -.. bpo: 28485 -.. date: 9841 -.. nonce: WuKqKh -.. section: Library - -Always raise ValueError for negative compileall.compile_dir(workers=...) -parameter, even when multithreading is unavailable. - -.. - -.. bpo: 28387 -.. date: 9840 -.. nonce: 1clJu7 -.. section: Library - -Fixed possible crash in _io.TextIOWrapper deallocator when the garbage -collector is invoked in other thread. Based on patch by Sebastian Cufre. - -.. - -.. bpo: 27517 -.. date: 9839 -.. nonce: 1CYM8A -.. section: Library - -LZMA compressor and decompressor no longer raise exceptions if given empty -data twice. Patch by Benjamin Fogle. - -.. - -.. bpo: 28549 -.. date: 9838 -.. nonce: ShnM2y -.. section: Library - -Fixed segfault in curses's addch() with ncurses6. - -.. - -.. bpo: 28449 -.. date: 9837 -.. nonce: 5JK6ES -.. section: Library - -tarfile.open() with mode "r" or "r:" now tries to open a tar file with -compression before trying to open it without compression. Otherwise it had -50% chance failed with ignore_zeros=True. - -.. - -.. bpo: 23262 -.. date: 9836 -.. nonce: 6EVB7N -.. section: Library - -The webbrowser module now supports Firefox 36+ and derived browsers. Based -on patch by Oleg Broytman. - -.. - -.. bpo: 27939 -.. date: 9835 -.. nonce: mTfADV -.. section: Library - -Fixed bugs in tkinter.ttk.LabeledScale and tkinter.Scale caused by -representing the scale as float value internally in Tk. tkinter.IntVar now -works if float value is set to underlying Tk variable. - -.. - -.. bpo: 28255 -.. date: 9834 -.. nonce: _ZH4wm -.. section: Library - -calendar.TextCalendar().prmonth() no longer prints a space at the start of -new line after printing a month's calendar. Patch by Xiang Zhang. - -.. - -.. bpo: 20491 -.. date: 9833 -.. nonce: ObgnQ2 -.. section: Library - -The textwrap.TextWrapper class now honors non-breaking spaces. Based on -patch by Kaarle Ritvanen. - -.. - -.. bpo: 28353 -.. date: 9832 -.. nonce: sKGbLL -.. section: Library - -os.fwalk() no longer fails on broken links. - -.. - -.. bpo: 25464 -.. date: 9831 -.. nonce: HDUTCu -.. section: Library - -Fixed HList.header_exists() in tkinter.tix module by addin a workaround to -Tix library bug. - -.. - -.. bpo: 28488 -.. date: 9830 -.. nonce: NlkjBM -.. section: Library - -shutil.make_archive() no longer add entry "./" to ZIP archive. - -.. - -.. bpo: 24452 -.. date: 9829 -.. nonce: m9Kyg3 -.. section: Library - -Make webbrowser support Chrome on Mac OS X. - -.. - -.. bpo: 20766 -.. date: 9828 -.. nonce: 4kvCzx -.. section: Library - -Fix references leaked by pdb in the handling of SIGINT handlers. - -.. - -.. bpo: 26293 -.. date: 9827 -.. nonce: 2mjvwX -.. section: Library - -Fixed writing ZIP files that starts not from the start of the file. Offsets -in ZIP file now are relative to the start of the archive in conforming to -the specification. - -.. - -.. bpo: 28321 -.. date: 9826 -.. nonce: bQ-IIX -.. section: Library - -Fixed writing non-BMP characters with binary format in plistlib. - -.. - -.. bpo: 28322 -.. date: 9825 -.. nonce: l9hzap -.. section: Library - -Fixed possible crashes when unpickle itertools objects from incorrect pickle -data. Based on patch by John Leitch. - -.. - -.. bpo: 0 -.. date: 9824 -.. nonce: 81jNns -.. section: Library - -Fix possible integer overflows and crashes in the mmap module with unusual -usage patterns. - -.. - -.. bpo: 1703178 -.. date: 9823 -.. nonce: meb49K -.. section: Library - -Fix the ability to pass the --link-objects option to the distutils build_ext -command. - -.. - -.. bpo: 28253 -.. date: 9822 -.. nonce: aLfmhe -.. section: Library - -Fixed calendar functions for extreme months: 0001-01 and 9999-12. -Methods itermonthdays() and itermonthdays2() are reimplemented so that they -don't call itermonthdates() which can cause datetime.date under/overflow. - -.. - -.. bpo: 28275 -.. date: 9821 -.. nonce: EhWIsz -.. section: Library - -Fixed possible use after free in the decompress() methods of the -LZMADecompressor and BZ2Decompressor classes. Original patch by John Leitch. - -.. - -.. bpo: 27897 -.. date: 9820 -.. nonce: I0Ppmx -.. section: Library - -Fixed possible crash in sqlite3.Connection.create_collation() if pass -invalid string-like object as a name. Patch by Xiang Zhang. - -.. - -.. bpo: 18893 -.. date: 9819 -.. nonce: osiX5c -.. section: Library - -Fix invalid exception handling in Lib/ctypes/macholib/dyld.py. Patch by -Madison May. - -.. - -.. bpo: 27611 -.. date: 9818 -.. nonce: qL-UVQ -.. section: Library - -Fixed support of default root window in the tkinter.tix module. - -.. - -.. bpo: 27348 -.. date: 9817 -.. nonce: tDx7Vw -.. section: Library - -In the traceback module, restore the formatting of exception messages like -"Exception: None". This fixes a regression introduced in 3.5a2. - -.. - -.. bpo: 25651 -.. date: 9816 -.. nonce: 3UhyPo -.. section: Library - -Allow falsy values to be used for msg parameter of subTest(). - -.. - -.. bpo: 27932 -.. date: 9815 -.. nonce: mtgl-6 -.. section: Library - -Prevent memory leak in win32_ver(). - -.. - -.. bpo: 0 -.. date: 9814 -.. nonce: iPpjqX -.. section: Library - -Fix UnboundLocalError in socket._sendfile_use_sendfile. - -.. - -.. bpo: 28075 -.. date: 9813 -.. nonce: aLiUs9 -.. section: Library - -Check for ERROR_ACCESS_DENIED in Windows implementation of os.stat(). Patch -by Eryk Sun. - -.. - -.. bpo: 25270 -.. date: 9812 -.. nonce: jrZruM -.. section: Library - -Prevent codecs.escape_encode() from raising SystemError when an empty -bytestring is passed. - -.. - -.. bpo: 28181 -.. date: 9811 -.. nonce: NGc4Yv -.. section: Library - -Get antigravity over HTTPS. Patch by Kaartic Sivaraam. - -.. - -.. bpo: 25895 -.. date: 9810 -.. nonce: j92qoQ -.. section: Library - -Enable WebSocket URL schemes in urllib.parse.urljoin. Patch by Gergely Imreh -and Markus Holtermann. - -.. - -.. bpo: 27599 -.. date: 9809 -.. nonce: itvm8T -.. section: Library - -Fixed buffer overrun in binascii.b2a_qp() and binascii.a2b_qp(). - -.. - -.. bpo: 19003 -.. date: 9808 -.. nonce: UUcK_F -.. section: Library - -m email.generator now replaces only ``\r`` and/or ``\n`` line endings, per -the RFC, instead of all unicode line endings. - -.. - -.. bpo: 28019 -.. date: 9807 -.. nonce: KUhBaS -.. section: Library - -itertools.count() no longer rounds non-integer step in range between 1.0 and -2.0 to 1. - -.. - -.. bpo: 25969 -.. date: 9806 -.. nonce: qSPkl- -.. section: Library - -Update the lib2to3 grammar to handle the unpacking generalizations added in -3.5. - -.. - -.. bpo: 14977 -.. date: 9805 -.. nonce: 4MvALg -.. section: Library - -mailcap now respects the order of the lines in the mailcap files ("first -match"), as required by RFC 1542. Patch by Michael Lazar. - -.. - -.. bpo: 24594 -.. date: 9804 -.. nonce: 9CnFVS -.. section: Library - -Validates persist parameter when opening MSI database - -.. - -.. bpo: 17582 -.. date: 9803 -.. nonce: MXEHxQ -.. section: Library - -xml.etree.ElementTree nows preserves whitespaces in attributes (Patch by -Duane Griffin. Reviewed and approved by Stefan Behnel.) - -.. - -.. bpo: 28047 -.. date: 9802 -.. nonce: pDu3Fm -.. section: Library - -Fixed calculation of line length used for the base64 CTE in the new email -policies. - -.. - -.. bpo: 27445 -.. date: 9801 -.. nonce: wOG0C0 -.. section: Library - -Don't pass str(_charset) to MIMEText.set_payload(). Patch by Claude Paroz. - -.. - -.. bpo: 22450 -.. date: 9800 -.. nonce: T3Sn_J -.. section: Library - -urllib now includes an ``Accept: */*`` header among the default headers. -This makes the results of REST API requests more consistent and predictable -especially when proxy servers are involved. - -.. - -.. bpo: 0 -.. date: 9799 -.. nonce: PVZStR -.. section: Library - -lib2to3.pgen3.driver.load_grammar() now creates a stable cache file between -runs given the same Grammar.txt input regardless of the hash randomization -setting. - -.. - -.. bpo: 27570 -.. date: 9798 -.. nonce: pU0Zie -.. section: Library - -Avoid zero-length memcpy() etc calls with null source pointers in the -"ctypes" and "array" modules. - -.. - -.. bpo: 22233 -.. date: 9797 -.. nonce: uXSN0R -.. section: Library - -Break email header lines *only* on the RFC specified CR and LF characters, -not on arbitrary unicode line breaks. This also fixes a bug in HTTP header -parsing. - -.. - -.. bpo: 27988 -.. date: 9796 -.. nonce: VfMzZH -.. section: Library - -Fix email iter_attachments incorrect mutation of payload list. - -.. - -.. bpo: 27691 -.. date: 9795 -.. nonce: TMYF5_ -.. section: Library - -Fix ssl module's parsing of GEN_RID subject alternative name fields in X.509 -certs. - -.. - -.. bpo: 27850 -.. date: 9794 -.. nonce: kIVQ0m -.. section: Library - -Remove 3DES from ssl module's default cipher list to counter measure sweet32 -attack (CVE-2016-2183). - -.. - -.. bpo: 27766 -.. date: 9793 -.. nonce: WI70Tc -.. section: Library - -Add ChaCha20 Poly1305 to ssl module's default cipher list. (Required OpenSSL -1.1.0 or LibreSSL). - -.. - -.. bpo: 26470 -.. date: 9792 -.. nonce: QGu_wo -.. section: Library - -Port ssl and hashlib module to OpenSSL 1.1.0. - -.. - -.. bpo: 0 -.. date: 9791 -.. nonce: 6TjEgz -.. section: Library - -Remove support for passing a file descriptor to os.access. It never worked -but previously didn't raise. - -.. - -.. bpo: 12885 -.. date: 9790 -.. nonce: r-IV1g -.. section: Library - -Fix error when distutils encounters symlink. - -.. - -.. bpo: 27881 -.. date: 9789 -.. nonce: fkETd9 -.. section: Library - -Fixed possible bugs when setting sqlite3.Connection.isolation_level. Based -on patch by Xiang Zhang. - -.. - -.. bpo: 27861 -.. date: 9788 -.. nonce: DBYuo9 -.. section: Library - -Fixed a crash in sqlite3.Connection.cursor() when a factory creates not a -cursor. Patch by Xiang Zhang. - -.. - -.. bpo: 19884 -.. date: 9787 -.. nonce: MO8AWH -.. section: Library - -Avoid spurious output on OS X with Gnu Readline. - -.. - -.. bpo: 27706 -.. date: 9786 -.. nonce: ZY67yu -.. section: Library - -Restore deterministic behavior of random.Random().seed() for string seeds -using seeding version 1. Allows sequences of calls to random() to exactly -match those obtained in Python 2. Patch by Nofar Schnider. - -.. - -.. bpo: 10513 -.. date: 9785 -.. nonce: tQIQD_ -.. section: Library - -Fix a regression in Connection.commit(). Statements should not be reset -after a commit. - -.. - -.. bpo: 0 -.. date: 9784 -.. nonce: cYraeH -.. section: Library - -A new version of typing.py from https://github.com/python/typing: -Collection (only for 3.6) (Issue #27598). Add FrozenSet to __all__ -(upstream #261). Fix crash in _get_type_vars() (upstream #259). Remove the -dict constraint in ForwardRef._eval_type (upstream #252). - -.. - -.. bpo: 27539 -.. date: 9783 -.. nonce: S4L1cq -.. section: Library - -Fix unnormalised ``Fraction.__pow__`` result in the case of negative -exponent and negative base. - -.. - -.. bpo: 21718 -.. date: 9782 -.. nonce: FUJd-7 -.. section: Library - -cursor.description is now available for queries using CTEs. - -.. - -.. bpo: 2466 -.. date: 9781 -.. nonce: VRNlkg -.. section: Library - -posixpath.ismount now correctly recognizes mount points which the user does -not have permission to access. - -.. - -.. bpo: 27773 -.. date: 9780 -.. nonce: hMSSeX -.. section: Library - -Correct some memory management errors server_hostname in _ssl.wrap_socket(). - -.. - -.. bpo: 26750 -.. date: 9779 -.. nonce: rv76vt -.. section: Library - -unittest.mock.create_autospec() now works properly for subclasses of -property() and other data descriptors. - -.. - -.. bpo: 0 -.. date: 9778 -.. nonce: Ny9oPv -.. section: Library - -In the curses module, raise an error if window.getstr() or window.instr() is -passed a negative value. - -.. - -.. bpo: 27783 -.. date: 9777 -.. nonce: cR1jXH -.. section: Library - -Fix possible usage of uninitialized memory in operator.methodcaller. - -.. - -.. bpo: 27774 -.. date: 9776 -.. nonce: FDcik1 -.. section: Library - -Fix possible Py_DECREF on unowned object in _sre. - -.. - -.. bpo: 27760 -.. date: 9775 -.. nonce: gxMjp4 -.. section: Library - -Fix possible integer overflow in binascii.b2a_qp. - -.. - -.. bpo: 27758 -.. date: 9774 -.. nonce: 0NRV03 -.. section: Library - -Fix possible integer overflow in the _csv module for large record lengths. - -.. - -.. bpo: 27568 -.. date: 9773 -.. nonce: OnuO9s -.. section: Library - -Prevent HTTPoxy attack (CVE-2016-1000110). Ignore the HTTP_PROXY variable -when REQUEST_METHOD environment is set, which indicates that the script is -in CGI mode. - -.. - -.. bpo: 27656 -.. date: 9772 -.. nonce: joTscM -.. section: Library - -Do not assume sched.h defines any SCHED_* constants. - -.. - -.. bpo: 27130 -.. date: 9771 -.. nonce: SUxwXZ -.. section: Library - -In the "zlib" module, fix handling of large buffers (typically 4 GiB) when -compressing and decompressing. Previously, inputs were limited to 4 GiB, -and compression and decompression operations did not properly handle results -of 4 GiB. - -.. - -.. bpo: 27533 -.. date: 9770 -.. nonce: iDmKzV -.. section: Library - -Release GIL in nt._isdir - -.. - -.. bpo: 17711 -.. date: 9769 -.. nonce: 47AILJ -.. section: Library - -Fixed unpickling by the persistent ID with protocol 0. Original patch by -Alexandre Vassalotti. - -.. - -.. bpo: 27522 -.. date: 9768 -.. nonce: 8vVz_t -.. section: Library - -Avoid an unintentional reference cycle in email.feedparser. - -.. - -.. bpo: 26844 -.. date: 9767 -.. nonce: I0wdnY -.. section: Library - -Fix error message for imp.find_module() to refer to 'path' instead of -'name'. Patch by Lev Maximov. - -.. - -.. bpo: 23804 -.. date: 9766 -.. nonce: ipFvxc -.. section: Library - -Fix SSL zero-length recv() calls to not block and not raise an error about -unclean EOF. - -.. - -.. bpo: 27466 -.. date: 9765 -.. nonce: C_3a8E -.. section: Library - -Change time format returned by http.cookie.time2netscape, confirming the -netscape cookie format and making it consistent with documentation. - -.. - -.. bpo: 26664 -.. date: 9764 -.. nonce: OzsSzf -.. section: Library - -Fix activate.fish by removing mis-use of ``$``. - -.. - -.. bpo: 22115 -.. date: 9763 -.. nonce: apoFQ9 -.. section: Library - -Fixed tracing Tkinter variables: trace_vdelete() with wrong mode no longer -break tracing, trace_vinfo() now always returns a list of pairs of strings, -tracing in the "u" mode now works. - -.. - -.. bpo: 0 -.. date: 9762 -.. nonce: oZOeFE -.. section: Library - -Fix a scoping issue in importlib.util.LazyLoader which triggered an -UnboundLocalError when lazy-loading a module that was already put into -sys.modules. - -.. - -.. bpo: 27079 -.. date: 9761 -.. nonce: c7d0Ym -.. section: Library - -Fixed curses.ascii functions isblank(), iscntrl() and ispunct(). - -.. - -.. bpo: 26754 -.. date: 9760 -.. nonce: J3n0QW -.. section: Library - -Some functions (compile() etc) accepted a filename argument encoded as an -iterable of integers. Now only strings and byte-like objects are accepted. - -.. - -.. bpo: 27048 -.. date: 9759 -.. nonce: EVe-Bk -.. section: Library - -Prevents distutils failing on Windows when environment variables contain -non-ASCII characters - -.. - -.. bpo: 27330 -.. date: 9758 -.. nonce: GJaFCV -.. section: Library - -Fixed possible leaks in the ctypes module. - -.. - -.. bpo: 27238 -.. date: 9757 -.. nonce: Q6v6Qv -.. section: Library - -Got rid of bare excepts in the turtle module. Original patch by Jelle -Zijlstra. - -.. - -.. bpo: 27122 -.. date: 9756 -.. nonce: 06t7zN -.. section: Library - -When an exception is raised within the context being managed by a -contextlib.ExitStack() and one of the exit stack generators catches and -raises it in a chain, do not re-raise the original exception when exiting, -let the new chained one through. This avoids the :pep:`479` bug described in -issue25782. - -.. - -.. bpo: 27278 -.. date: 9755 -.. nonce: y_HkGw -.. original section: Library -.. section: Security - -Fix os.urandom() implementation using getrandom() on Linux. Truncate size -to INT_MAX and loop until we collected enough random bytes, instead of -casting a directly Py_ssize_t to int. - -.. - -.. bpo: 26386 -.. date: 9754 -.. nonce: 9L3Ut4 -.. section: Library - -Fixed ttk.TreeView selection operations with item id's containing spaces. - -.. - -.. bpo: 22636 -.. date: 9753 -.. nonce: 3fQW_g -.. original section: Library -.. section: Security - -Avoid shell injection problems with ctypes.util.find_library(). - -.. - -.. bpo: 16182 -.. date: 9752 -.. nonce: RgFXyr -.. section: Library - -Fix various functions in the "readline" module to use the locale encoding, -and fix get_begidx() and get_endidx() to return code point indexes. - -.. - -.. bpo: 27392 -.. date: 9751 -.. nonce: obfni7 -.. section: Library - -Add loop.connect_accepted_socket(). Patch by Jim Fulton. - -.. - -.. bpo: 27930 -.. date: 9750 -.. nonce: BkOfSi -.. section: Library - -Improved behaviour of logging.handlers.QueueListener. Thanks to Paulo -Andrade and Petr Viktorin for the analysis and patch. - -.. - -.. bpo: 21201 -.. date: 9749 -.. nonce: wLCKiA -.. section: Library - -Improves readability of multiprocessing error message. Thanks to Wojciech -Walczak for patch. - -.. - -.. bpo: 27456 -.. date: 9748 -.. nonce: lI_IE7 -.. section: Library - -asyncio: Set TCP_NODELAY by default. - -.. - -.. bpo: 27906 -.. date: 9747 -.. nonce: TBBXrv -.. section: Library - -Fix socket accept exhaustion during high TCP traffic. Patch by Kevin Conway. - -.. - -.. bpo: 28174 -.. date: 9746 -.. nonce: CV1UdI -.. section: Library - -Handle when SO_REUSEPORT isn't properly supported. Patch by Seth Michael -Larson. - -.. - -.. bpo: 26654 -.. date: 9745 -.. nonce: XtzTE9 -.. section: Library - -Inspect functools.partial in asyncio.Handle.__repr__. Patch by iceboy. - -.. - -.. bpo: 26909 -.. date: 9744 -.. nonce: ASiakT -.. section: Library - -Fix slow pipes IO in asyncio. Patch by INADA Naoki. - -.. - -.. bpo: 28176 -.. date: 9743 -.. nonce: sU8R6L -.. section: Library - -Fix callbacks race in asyncio.SelectorLoop.sock_connect. - -.. - -.. bpo: 27759 -.. date: 9742 -.. nonce: qpMDGq -.. section: Library - -Fix selectors incorrectly retain invalid file descriptors. Patch by Mark -Williams. - -.. - -.. bpo: 28368 -.. date: 9741 -.. nonce: n594X4 -.. section: Library - -Refuse monitoring processes if the child watcher has no loop attached. Patch -by Vincent Michel. - -.. - -.. bpo: 28369 -.. date: 9740 -.. nonce: 8DTANe -.. section: Library - -Raise RuntimeError when transport's FD is used with add_reader, add_writer, -etc. - -.. - -.. bpo: 28370 -.. date: 9739 -.. nonce: 18jBuZ -.. section: Library - -Speedup asyncio.StreamReader.readexactly. Patch by Коренберг Марк. - -.. - -.. bpo: 28371 -.. date: 9738 -.. nonce: U9Zqdk -.. section: Library - -Deprecate passing asyncio.Handles to run_in_executor. - -.. - -.. bpo: 28372 -.. date: 9737 -.. nonce: njcIPk -.. section: Library - -Fix asyncio to support formatting of non-python coroutines. - -.. - -.. bpo: 28399 -.. date: 9736 -.. nonce: QKIqRX -.. section: Library - -Remove UNIX socket from FS before binding. Patch by Коренберг Марк. - -.. - -.. bpo: 27972 -.. date: 9735 -.. nonce: ZK-GFm -.. section: Library - -Prohibit Tasks to await on themselves. - -.. - -.. bpo: 26923 -.. date: 9734 -.. nonce: 8dh3AV -.. section: Library - -Fix asyncio.Gather to refuse being cancelled once all children are done. -Patch by Johannes Ebke. - -.. - -.. bpo: 26796 -.. date: 9733 -.. nonce: TZyAfJ -.. section: Library - -Don't configure the number of workers for default threadpool executor. -Initial patch by Hans Lawrenz. - -.. - -.. bpo: 28600 -.. date: 9732 -.. nonce: 2ThUQV -.. section: Library - -Optimize loop.call_soon(). - -.. - -.. bpo: 28613 -.. date: 9731 -.. nonce: sqUPrv -.. section: Library - -Fix get_event_loop() return the current loop if called from -coroutines/callbacks. - -.. - -.. bpo: 28639 -.. date: 9730 -.. nonce: WUPo1o -.. section: Library - -Fix inspect.isawaitable to always return bool Patch by Justin Mayfield. - -.. - -.. bpo: 28652 -.. date: 9729 -.. nonce: f5M8FG -.. section: Library - -Make loop methods reject socket kinds they do not support. - -.. - -.. bpo: 28653 -.. date: 9728 -.. nonce: S5bA9i -.. section: Library - -Fix a refleak in functools.lru_cache. - -.. - -.. bpo: 28703 -.. date: 9727 -.. nonce: CRLTJc -.. section: Library - -Fix asyncio.iscoroutinefunction to handle Mock objects. - -.. - -.. bpo: 24142 -.. date: 9726 -.. nonce: _BgogI -.. section: Library - -Reading a corrupt config file left the parser in an invalid state. Original -patch by Florian Höch. - -.. - -.. bpo: 28990 -.. date: 9725 -.. nonce: W8tuYZ -.. section: Library - -Fix SSL hanging if connection is closed before handshake completed. (Patch -by HoHo-Ho) - -.. - -.. bpo: 15308 -.. date: 9724 -.. nonce: zZxn8m -.. section: IDLE - -Add 'interrupt execution' (^C) to Shell menu. Patch by Roger Serwy, updated -by Bayard Randel. - -.. - -.. bpo: 27922 -.. date: 9723 -.. nonce: UEtEv9 -.. section: IDLE - -Stop IDLE tests from 'flashing' gui widgets on the screen. - -.. - -.. bpo: 0 -.. date: 9722 -.. nonce: zWZs6o -.. section: IDLE - -Add version to title of IDLE help window. - -.. - -.. bpo: 25564 -.. date: 9721 -.. nonce: GN0p14 -.. section: IDLE - -In section on IDLE -- console differences, mention that using exec means -that __builtins__ is defined for each statement. - -.. - -.. bpo: 27714 -.. date: 9720 -.. nonce: bUEDsI -.. section: IDLE - -text_textview and test_autocomplete now pass when re-run in the same -process. This occurs when test_idle fails when run with the -w option but -without -jn. Fix warning from test_config. - -.. - -.. bpo: 25507 -.. date: 9719 -.. nonce: lxf68d -.. section: IDLE - -IDLE no longer runs buggy code because of its tkinter imports. Users must -include the same imports required to run directly in Python. - -.. - -.. bpo: 27452 -.. date: 9718 -.. nonce: RtWnyR -.. section: IDLE - -add line counter and crc to IDLE configHandler test dump. - -.. - -.. bpo: 27365 -.. date: 9717 -.. nonce: y7ys_A -.. section: IDLE - -Allow non-ascii chars in IDLE NEWS.txt, for contributor names. - -.. - -.. bpo: 27245 -.. date: 9716 -.. nonce: u9aKO1 -.. section: IDLE - -IDLE: Cleanly delete custom themes and key bindings. Previously, when IDLE -was started from a console or by import, a cascade of warnings was emitted. -Patch by Serhiy Storchaka. - -.. - -.. bpo: 28808 -.. date: 9715 -.. nonce: A03X6r -.. section: C API - -PyUnicode_CompareWithASCIIString() now never raises exceptions. - -.. - -.. bpo: 26754 -.. date: 9714 -.. nonce: j2czHF -.. section: C API - -PyUnicode_FSDecoder() accepted a filename argument encoded as an iterable of -integers. Now only strings and bytes-like objects are accepted. - -.. - -.. bpo: 28513 -.. date: 9713 -.. nonce: L3joAz -.. section: Documentation - -Documented command-line interface of zipfile. - -.. - -.. bpo: 28950 -.. date: 9712 -.. nonce: 9_vY6R -.. section: Tests - -Disallow -j0 to be combined with -T/-l/-M in regrtest command line -arguments. - -.. - -.. bpo: 28666 -.. date: 9711 -.. nonce: RtTk-4 -.. section: Tests - -Now test.support.rmtree is able to remove unwritable or unreadable -directories. - -.. - -.. bpo: 23839 -.. date: 9710 -.. nonce: zsT_L9 -.. section: Tests - -Various caches now are cleared before running every test file. - -.. - -.. bpo: 28409 -.. date: 9709 -.. nonce: Q2IlxJ -.. section: Tests - -regrtest: fix the parser of command line arguments. - -.. - -.. bpo: 27787 -.. date: 9708 -.. nonce: kf0YAt -.. section: Tests - -Call gc.collect() before checking each test for "dangling threads", since -the dangling threads are weak references. - -.. - -.. bpo: 27369 -.. date: 9707 -.. nonce: LG7U2D -.. section: Tests - -In test_pyexpat, avoid testing an error message detail that changed in Expat -2.2.0. - -.. - -.. bpo: 27952 -.. date: 9706 -.. nonce: WX9Ufc -.. section: Tools/Demos - -Get Tools/scripts/fixcid.py working with Python 3 and the current "re" -module, avoid invalid Python backslash escapes, and fix a bug parsing -escaped C quote signs. - -.. - -.. bpo: 27332 -.. date: 9705 -.. nonce: OuRZp9 -.. section: Tools/Demos - -Fixed the type of the first argument of module-level functions generated by -Argument Clinic. Patch by Petr Viktorin. - -.. - -.. bpo: 27418 -.. date: 9704 -.. nonce: W2m_8I -.. section: Tools/Demos - -Fixed Tools/importbench/importbench.py. - -.. - -.. bpo: 28251 -.. date: 9703 -.. nonce: tR_AFs -.. section: Windows - -Improvements to help manuals on Windows. - -.. - -.. bpo: 28110 -.. date: 9702 -.. nonce: cnkP5F -.. section: Windows - -launcher.msi has different product codes between 32-bit and 64-bit - -.. - -.. bpo: 25144 -.. date: 9701 -.. nonce: iUha52 -.. section: Windows - -Ensures TargetDir is set before continuing with custom install. - -.. - -.. bpo: 27469 -.. date: 9700 -.. nonce: 0GwDkX -.. section: Windows - -Adds a shell extension to the launcher so that drag and drop works -correctly. - -.. - -.. bpo: 27309 -.. date: 9699 -.. nonce: 4DPjhF -.. section: Windows - -Enabled proper Windows styles in python[w].exe manifest. - -.. - -.. bpo: 29080 -.. date: 9698 -.. nonce: b3qLQT -.. section: Build - -Removes hard dependency on hg.exe from PCBuild/build.bat - -.. - -.. bpo: 23903 -.. date: 9697 -.. nonce: JXJ889 -.. section: Build - -Added missed names to PC/python3.def. - -.. - -.. bpo: 10656 -.. date: 9696 -.. nonce: pR8FFU -.. section: Build - -Fix out-of-tree building on AIX. Patch by Tristan Carel and Michael -Haubenwallner. - -.. - -.. bpo: 26359 -.. date: 9695 -.. nonce: CLz6qy -.. section: Build - -Rename --with-optimiations to --enable-optimizations. - -.. - -.. bpo: 28444 -.. date: 9694 -.. nonce: zkc9nT -.. section: Build - -Fix missing extensions modules when cross compiling. - -.. - -.. bpo: 28248 -.. date: 9693 -.. nonce: KY_-en -.. section: Build - -Update Windows build and OS X installers to use OpenSSL 1.0.2j. - -.. - -.. bpo: 28258 -.. date: 9692 -.. nonce: iKtAHd -.. section: Build - -Fixed build with Estonian locale (python-config and distclean targets in -Makefile). Patch by Arfrever Frehtes Taifersar Arahesis. - -.. - -.. bpo: 26661 -.. date: 9691 -.. nonce: Z_HNbs -.. section: Build - -setup.py now detects system libffi with multiarch wrapper. - -.. - -.. bpo: 28066 -.. date: 9690 -.. nonce: _3xImV -.. section: Build - -Fix the logic that searches build directories for generated include files -when building outside the source tree. - -.. - -.. bpo: 15819 -.. date: 9689 -.. nonce: QVDr3E -.. section: Build - -Remove redundant include search directory option for building outside the -source tree. - -.. - -.. bpo: 27566 -.. date: 9688 -.. nonce: xDWjEb -.. section: Build - -Fix clean target in freeze makefile (patch by Lisa Roach) - -.. - -.. bpo: 27705 -.. date: 9687 -.. nonce: 8C2Ms3 -.. section: Build - -Update message in validate_ucrtbase.py - -.. - -.. bpo: 27983 -.. date: 9686 -.. nonce: jL_1n8 -.. section: Build - -Cause lack of llvm-profdata tool when using clang as required for PGO -linking to be a configure time error rather than make time when ---with-optimizations is enabled. Also improve our ability to find the -llvm-profdata tool on MacOS and some Linuxes. - -.. - -.. bpo: 26307 -.. date: 9685 -.. nonce: Puk2rd -.. section: Build - -The profile-opt build now applies PGO to the built-in modules. - -.. - -.. bpo: 26359 -.. date: 9684 -.. nonce: WXBL-Y -.. section: Build - -Add the --with-optimizations configure flag. - -.. - -.. bpo: 27713 -.. date: 9683 -.. nonce: _3DgXG -.. section: Build - -Suppress spurious build warnings when updating importlib's bootstrap files. -Patch by Xiang Zhang - -.. - -.. bpo: 25825 -.. date: 9682 -.. nonce: JD8aRp -.. section: Build - -Correct the references to Modules/python.exp and ld_so_aix, which are -required on AIX. This updates references to an installation path that was -changed in 3.2a4, and undoes changed references to the build tree that were -made in 3.5.0a1. - -.. - -.. bpo: 27453 -.. date: 9681 -.. nonce: Pb5DBi -.. section: Build - -CPP invocation in configure must use CPPFLAGS. Patch by Chi Hsuan Yen. - -.. - -.. bpo: 27641 -.. date: 9680 -.. nonce: eGzgCk -.. section: Build - -The configure script now inserts comments into the makefile to prevent the -pgen and _freeze_importlib executables from being cross-compiled. - -.. - -.. bpo: 26662 -.. date: 9679 -.. nonce: XkwRxM -.. section: Build - -Set PYTHON_FOR_GEN in configure as the Python program to be used for file -generation during the build. - -.. - -.. bpo: 10910 -.. date: 9678 -.. nonce: ZdRayb -.. section: Build - -Avoid C++ compilation errors on FreeBSD and OS X. Also update FreedBSD -version checks for the original ctype UTF-8 workaround. - -.. - -.. bpo: 28676 -.. date: 9677 -.. nonce: Wxf6Ds -.. section: Build - -Prevent missing 'getentropy' declaration warning on macOS. Patch by Gareth -Rees. diff --git a/Misc/NEWS.d/3.5.4.rst b/Misc/NEWS.d/3.5.4.rst deleted file mode 100644 index cd0ca4872f1ab01840e82767415d5c527333a0b2..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.4.rst +++ /dev/null @@ -1,8 +0,0 @@ -.. bpo: 30119 -.. date: 2017-07-26-15-11-17 -.. nonce: DZ6C_S -.. release date: 2017-08-07 -.. section: Library - -ftplib.FTP.putline() now throws ValueError on commands that contains CR or -LF. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/3.5.4rc1.rst b/Misc/NEWS.d/3.5.4rc1.rst deleted file mode 100644 index 04a035a41e7461b5c7aba5314284dac74581b226..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.4rc1.rst +++ /dev/null @@ -1,1131 +0,0 @@ -.. bpo: 30730 -.. date: 084 -.. nonce: rJsyTH -.. original section: Library -.. release date: 2017-07-23 -.. section: Security - -Prevent environment variables injection in subprocess on Windows. Prevent -passing other environment variables and command arguments. - -.. - -.. bpo: 30694 -.. date: 083 -.. nonce: WkMWM_ -.. original section: Library -.. section: Security - -Upgrade expat copy from 2.2.0 to 2.2.1 to get fixes of multiple security -vulnerabilities including: CVE-2017-9233 (External entity infinite loop -DoS), CVE-2016-9063 (Integer overflow, re-fix), CVE-2016-0718 (Fix -regression bugs from 2.2.0's fix to CVE-2016-0718) and CVE-2012-0876 -(Counter hash flooding with SipHash). Note: the CVE-2016-5300 (Use -os-specific entropy sources like getrandom) doesn't impact Python, since Python -already gets entropy from the OS to set the expat secret using -``XML_SetHashSalt()``. - -.. - -.. bpo: 30500 -.. date: 081 -.. nonce: 1VG7R- -.. original section: Library -.. section: Security - -Fix urllib.parse.splithost() to correctly parse fragments. For example, -``splithost('//127.0.0.1#@evil.com/')`` now correctly returns the -``127.0.0.1`` host, instead of treating ``@evil.com`` as the host in an -authentication (``login@host``). - -.. - -.. bpo: 29591 -.. date: 076 -.. nonce: ExKblw -.. original section: Library -.. section: Security - -Update expat copy from 2.1.1 to 2.2.0 to get fixes of CVE-2016-0718 and -CVE-2016-4472. See https://sourceforge.net/p/expat/bugs/537/ for more -information. - -.. - -.. bpo: 30876 -.. date: 2017-07-11-06-31-32 -.. nonce: x35jZX -.. section: Core and Builtins - -Relative import from unloaded package now reimports the package instead of -failing with SystemError. Relative import from non-package now fails with -ImportError rather than SystemError. - -.. - -.. bpo: 30765 -.. date: 2017-06-26-14-29-50 -.. nonce: Q5iBmf -.. section: Core and Builtins - -Avoid blocking in pthread_mutex_lock() when PyThread_acquire_lock() is asked -not to block. - -.. - -.. bpo: 27945 -.. date: 100 -.. nonce: p29r3O -.. section: Core and Builtins - -Fixed various segfaults with dict when input collections are mutated during -searching, inserting or comparing. Based on patches by Duane Griffin and -Tim Mitchell. - -.. - -.. bpo: 25794 -.. date: 099 -.. nonce: xfPwqm -.. section: Core and Builtins - -Fixed type.__setattr__() and type.__delattr__() for non-interned attribute -names. Based on patch by Eryk Sun. - -.. - -.. bpo: 29935 -.. date: 098 -.. nonce: vgjdJo -.. section: Core and Builtins - -Fixed error messages in the index() method of tuple, list and deque when -pass indices of wrong type. - -.. - -.. bpo: 28876 -.. date: 097 -.. nonce: cU-sGT -.. section: Core and Builtins - -``bool(range)`` works even if ``len(range)`` raises :exc:`OverflowError`. - -.. - -.. bpo: 29600 -.. date: 096 -.. nonce: 77wQ6C -.. section: Core and Builtins - -Fix wrapping coroutine return values in StopIteration. - -.. - -.. bpo: 29537 -.. date: 095 -.. nonce: lu1ysY -.. section: Core and Builtins - -Restore runtime compatibility with bytecode files generated by CPython 3.5.0 -to 3.5.2, and adjust the eval loop to avoid the problems that could be -caused by the malformed variant of the BUILD_MAP_UNPACK_WITH_CALL opcode -that they may contain. Patch by Petr Viktorin, Serhiy Storchaka, and Nick -Coghlan. - -.. - -.. bpo: 28598 -.. date: 094 -.. nonce: QxbzQn -.. section: Core and Builtins - -Support __rmod__ for subclasses of str being called before str.__mod__. -Patch by Martijn Pieters. - -.. - -.. bpo: 29602 -.. date: 093 -.. nonce: qyyskC -.. section: Core and Builtins - -Fix incorrect handling of signed zeros in complex constructor for complex -subclasses and for inputs having a __complex__ method. Patch by Serhiy -Storchaka. - -.. - -.. bpo: 29347 -.. date: 092 -.. nonce: 1RPPGN -.. section: Core and Builtins - -Fixed possibly dereferencing undefined pointers when creating weakref -objects. - -.. - -.. bpo: 29438 -.. date: 091 -.. nonce: IKxD6I -.. section: Core and Builtins - -Fixed use-after-free problem in key sharing dict. - -.. - -.. bpo: 29319 -.. date: 090 -.. nonce: KLDUZf -.. section: Core and Builtins - -Prevent RunMainFromImporter overwriting sys.path[0]. - -.. - -.. bpo: 29337 -.. date: 089 -.. nonce: bjX8AE -.. section: Core and Builtins - -Fixed possible BytesWarning when compare the code objects. Warnings could be -emitted at compile time. - -.. - -.. bpo: 29478 -.. date: 088 -.. nonce: rTQ-qy -.. section: Core and Builtins - -If max_line_length=None is specified while using the Compat32 policy, it is -no longer ignored. Patch by Mircea Cosbuc. - -.. - -.. bpo: 29403 -.. date: 2017-07-20-02-29-49 -.. nonce: 3RinCV -.. section: Library - -Fix ``unittest.mock``'s autospec to not fail on method-bound builtin -functions. Patch by Aaron Gallagher. - -.. - -.. bpo: 30961 -.. date: 2017-07-18-23-47-51 -.. nonce: 064jz0 -.. section: Library - -Fix decrementing a borrowed reference in tracemalloc. - -.. - -.. bpo: 30886 -.. date: 2017-07-10-12-14-22 -.. nonce: nqQj34 -.. section: Library - -Fix multiprocessing.Queue.join_thread(): it now waits until the thread -completes, even if the thread was started by the same process which created -the queue. - -.. - -.. bpo: 29854 -.. date: 2017-07-07-02-18-57 -.. nonce: J8wKb_ -.. section: Library - -Fix segfault in readline when using readline's history-size option. Patch -by Nir Soffer. - -.. - -.. bpo: 30807 -.. date: 2017-06-29-22-04-44 -.. nonce: sLtjY- -.. section: Library - -signal.setitimer() may disable the timer when passed a tiny value. -Tiny values (such as 1e-6) are valid non-zero values for setitimer(), which -is specified as taking microsecond-resolution intervals. However, on some -platform, our conversion routine could convert 1e-6 into a zero interval, -therefore disabling the timer instead of (re-)scheduling it. - -.. - -.. bpo: 30441 -.. date: 2017-06-29-14-25-14 -.. nonce: 3Wh9kc -.. section: Library - -Fix bug when modifying os.environ while iterating over it - -.. - -.. bpo: 30532 -.. date: 2017-06-26-11-01-59 -.. nonce: qTeL1o -.. section: Library - -Fix email header value parser dropping folding white space in certain cases. - -.. - -.. bpo: 29169 -.. date: 087 -.. nonce: 8ypApm -.. section: Library - -Update zlib to 1.2.11. - -.. - -.. bpo: 30879 -.. date: 086 -.. nonce: N3KI-o -.. section: Library - -os.listdir() and os.scandir() now emit bytes names when called with -bytes-like argument. - -.. - -.. bpo: 30746 -.. date: 085 -.. nonce: 7drQI0 -.. section: Library - -Prohibited the '=' character in environment variable names in -``os.putenv()`` and ``os.spawn*()``. - -.. - -.. bpo: 29755 -.. date: 082 -.. nonce: diQcY_ -.. section: Library - -Fixed the lgettext() family of functions in the gettext module. They now -always return bytes. - -.. - -.. bpo: 30645 -.. date: 080 -.. nonce: oYzbbW -.. section: Library - -Fix path calculation in imp.load_package(), fixing it for cases when a -package is only shipped with bytecodes. Patch by Alexandru Ardelean. - -.. - -.. bpo: 23890 -.. date: 079 -.. nonce: GCFAAZ -.. section: Library - -unittest.TestCase.assertRaises() now manually breaks a reference cycle to -not keep objects alive longer than expected. - -.. - -.. bpo: 30149 -.. date: 078 -.. nonce: hE649r -.. section: Library - -inspect.signature() now supports callables with variable-argument parameters -wrapped with partialmethod. Patch by Dong-hee Na. - -.. - -.. bpo: 29931 -.. date: 077 -.. nonce: tfcTwK -.. section: Library - -Fixed comparison check for ipaddress.ip_interface objects. Patch by Sanjay -Sundaresan. - -.. - -.. bpo: 24484 -.. date: 075 -.. nonce: vFem8K -.. section: Library - -Avoid race condition in multiprocessing cleanup. - -.. - -.. bpo: 28994 -.. date: 074 -.. nonce: 9vzun1 -.. section: Library - -The traceback no longer displayed for SystemExit raised in a callback -registered by atexit. - -.. - -.. bpo: 30508 -.. date: 073 -.. nonce: wNWRS2 -.. section: Library - -Don't log exceptions if Task/Future "cancel()" method was called. - -.. - -.. bpo: 28556 -.. date: 072 -.. nonce: mESP7G -.. section: Library - -Updates to typing module: Add generic AsyncContextManager, add support for -ContextManager on all versions. Original PRs by Jelle Zijlstra and Ivan -Levkivskyi - -.. - -.. bpo: 29870 -.. date: 071 -.. nonce: p960Ih -.. section: Library - -Fix ssl sockets leaks when connection is aborted in asyncio/ssl -implementation. Patch by Michaël Sghaïer. - -.. - -.. bpo: 29743 -.. date: 070 -.. nonce: en2P4s -.. section: Library - -Closing transport during handshake process leaks open socket. Patch by -Nikolay Kim - -.. - -.. bpo: 27585 -.. date: 069 -.. nonce: 0Ugqqu -.. section: Library - -Fix waiter cancellation in asyncio.Lock. Patch by Mathieu Sornay. - -.. - -.. bpo: 30418 -.. date: 068 -.. nonce: EwISQm -.. section: Library - -On Windows, subprocess.Popen.communicate() now also ignore EINVAL on -stdin.write() if the child process is still running but closed the pipe. - -.. - -.. bpo: 30378 -.. date: 067 -.. nonce: R_19_5 -.. section: Library - -Fix the problem that logging.handlers.SysLogHandler cannot handle IPv6 -addresses. - -.. - -.. bpo: 29960 -.. date: 066 -.. nonce: g0wr3r -.. section: Library - -Preserve generator state when _random.Random.setstate() raises an exception. -Patch by Bryan Olson. - -.. - -.. bpo: 30414 -.. date: 065 -.. nonce: jGl1Lb -.. section: Library - -multiprocessing.Queue._feed background running thread do not break from main -loop on exception. - -.. - -.. bpo: 30003 -.. date: 064 -.. nonce: BOl9HE -.. section: Library - -Fix handling escape characters in HZ codec. Based on patch by Ma Lin. - -.. - -.. bpo: 30301 -.. date: 063 -.. nonce: ywOkjN -.. section: Library - -Fix AttributeError when using SimpleQueue.empty() under *spawn* and -*forkserver* start methods. - -.. - -.. bpo: 30329 -.. date: 062 -.. nonce: EuT36N -.. section: Library - -imaplib and poplib now catch the Windows socket WSAEINVAL error (code 10022) -on shutdown(SHUT_RDWR): An invalid operation was attempted. This error -occurs sometimes on SSL connections. - -.. - -.. bpo: 30375 -.. date: 061 -.. nonce: 9c8qM7 -.. section: Library - -Warnings emitted when compile a regular expression now always point to the -line in the user code. Previously they could point into inners of the re -module if emitted from inside of groups or conditionals. - -.. - -.. bpo: 30048 -.. date: 060 -.. nonce: ELRx8R -.. section: Library - -Fixed ``Task.cancel()`` can be ignored when the task is running coroutine -and the coroutine returned without any more ``await``. - -.. - -.. bpo: 29990 -.. date: 059 -.. nonce: HWV6KE -.. section: Library - -Fix range checking in GB18030 decoder. Original patch by Ma Lin. - -.. - -.. bpo: 26293 -.. date: 058 -.. nonce: wig0YG -.. section: Library - -Change resulted because of zipfile breakage. (See also: bpo-29094) - -.. - -.. bpo: 30243 -.. date: 057 -.. nonce: RHQt0v -.. section: Library - -Removed the __init__ methods of _json's scanner and encoder. Misusing them -could cause memory leaks or crashes. Now scanner and encoder objects are -completely initialized in the __new__ methods. - -.. - -.. bpo: 30185 -.. date: 056 -.. nonce: Tiu1n8 -.. section: Library - -Avoid KeyboardInterrupt tracebacks in forkserver helper process when Ctrl-C -is received. - -.. - -.. bpo: 28556 -.. date: 055 -.. nonce: 51gjbP -.. section: Library - -Various updates to typing module: add typing.NoReturn type, use -WrapperDescriptorType, minor bug-fixes. Original PRs by Jim -Fasarakis-Hilliard and Ivan Levkivskyi. - -.. - -.. bpo: 30205 -.. date: 054 -.. nonce: BsxO34 -.. section: Library - -Fix getsockname() for unbound AF_UNIX sockets on Linux. - -.. - -.. bpo: 30070 -.. date: 053 -.. nonce: XM_B41 -.. section: Library - -Fixed leaks and crashes in errors handling in the parser module. - -.. - -.. bpo: 30061 -.. date: 052 -.. nonce: 2w_dX9 -.. section: Library - -Fixed crashes in IOBase methods __next__() and readlines() when readline() -or __next__() respectively return non-sizeable object. Fixed possible other -errors caused by not checking results of PyObject_Size(), PySequence_Size(), -or PyMapping_Size(). - -.. - -.. bpo: 30068 -.. date: 051 -.. nonce: n4q47r -.. section: Library - -_io._IOBase.readlines will check if it's closed first when hint is present. - -.. - -.. bpo: 29694 -.. date: 050 -.. nonce: LWKxb1 -.. section: Library - -Fixed race condition in pathlib mkdir with flags parents=True. Patch by -Armin Rigo. - -.. - -.. bpo: 29692 -.. date: 049 -.. nonce: oyWrAE -.. section: Library - -Fixed arbitrary unchaining of RuntimeError exceptions in -contextlib.contextmanager. Patch by Siddharth Velankar. - -.. - -.. bpo: 29998 -.. date: 048 -.. nonce: poeIKD -.. section: Library - -Pickling and copying ImportError now preserves name and path attributes. - -.. - -.. bpo: 29942 -.. date: 047 -.. nonce: CsGNuT -.. section: Library - -Fix a crash in itertools.chain.from_iterable when encountering long runs of -empty iterables. - -.. - -.. bpo: 27863 -.. date: 046 -.. nonce: pPYHHI -.. section: Library - -Fixed multiple crashes in ElementTree caused by race conditions and wrong -types. - -.. - -.. bpo: 28699 -.. date: 045 -.. nonce: wZztZP -.. section: Library - -Fixed a bug in pools in multiprocessing.pool that raising an exception at -the very first of an iterable may swallow the exception or make the program -hang. Patch by Davin Potts and Xiang Zhang. - -.. - -.. bpo: 25803 -.. date: 044 -.. nonce: CPDR0W -.. section: Library - -Avoid incorrect errors raised by Path.mkdir(exist_ok=True) when the OS gives -priority to errors such as EACCES over EEXIST. - -.. - -.. bpo: 29861 -.. date: 043 -.. nonce: t2ZoRK -.. section: Library - -Release references to tasks, their arguments and their results as soon as -they are finished in multiprocessing.Pool. - -.. - -.. bpo: 29884 -.. date: 042 -.. nonce: kWXR8W -.. section: Library - -faulthandler: Restore the old sigaltstack during teardown. Patch by -Christophe Zeitouny. - -.. - -.. bpo: 25455 -.. date: 041 -.. nonce: ZsahHN -.. section: Library - -Fixed crashes in repr of recursive buffered file-like objects. - -.. - -.. bpo: 29800 -.. date: 040 -.. nonce: d2xASa -.. section: Library - -Fix crashes in partial.__repr__ if the keys of partial.keywords are not -strings. Patch by Michael Seifert. - -.. - -.. bpo: 29742 -.. date: 039 -.. nonce: 8hqfEO -.. section: Library - -get_extra_info() raises exception if get called on closed ssl transport. -Patch by Nikolay Kim. - -.. - -.. bpo: 8256 -.. date: 038 -.. nonce: jAwGQH -.. section: Library - -Fixed possible failing or crashing input() if attributes "encoding" or -"errors" of sys.stdin or sys.stdout are not set or are not strings. - -.. - -.. bpo: 28298 -.. date: 037 -.. nonce: xfm84U -.. section: Library - -Fix a bug that prevented array 'Q', 'L' and 'I' from accepting big intables -(objects that have __int__) as elements. Patch by Oren Milman. - -.. - -.. bpo: 29615 -.. date: 036 -.. nonce: OpFKzg -.. section: Library - -SimpleXMLRPCDispatcher no longer chains KeyError (or any other exception) to -exception(s) raised in the dispatched methods. Patch by Petr Motejlek. - -.. - -.. bpo: 29704 -.. date: 035 -.. nonce: WHbx27 -.. section: Library - -asyncio.subprocess.SubprocessStreamProtocol no longer closes before all -pipes are closed. - -.. - -.. bpo: 29703 -.. date: 034 -.. nonce: ZdsPCR -.. section: Library - -Fix asyncio to support instantiation of new event loops in child processes. - -.. - -.. bpo: 29376 -.. date: 033 -.. nonce: rrJhJy -.. section: Library - -Fix assertion error in threading._DummyThread.is_alive(). - -.. - -.. bpo: 29110 -.. date: 032 -.. nonce: wmE-_T -.. section: Library - -Fix file object leak in aifc.open() when file is given as a filesystem path -and is not in valid AIFF format. Patch by Anthony Zhang. - -.. - -.. bpo: 28961 -.. date: 031 -.. nonce: Rt93vg -.. section: Library - -Fix unittest.mock._Call helper: don't ignore the name parameter anymore. -Patch written by Jiajun Huang. - -.. - -.. bpo: 29532 -.. date: 030 -.. nonce: YCwVQn -.. section: Library - -Altering a kwarg dictionary passed to functools.partial() no longer affects -a partial object after creation. - -.. - -.. bpo: 28556 -.. date: 029 -.. nonce: p6967e -.. section: Library - -Various updates to typing module: typing.Counter, typing.ChainMap, improved -ABC caching, etc. Original PRs by Jelle Zijlstra, Ivan Levkivskyi, Manuel -Krebber, and Łukasz Langa. - -.. - -.. bpo: 29100 -.. date: 028 -.. nonce: LAAERS -.. section: Library - -Fix datetime.fromtimestamp() regression introduced in Python 3.6.0: check -minimum and maximum years. - -.. - -.. bpo: 29519 -.. date: 027 -.. nonce: oGGgZ4 -.. section: Library - -Fix weakref spewing exceptions during interpreter shutdown when used with a -rare combination of multiprocessing and custom codecs. - -.. - -.. bpo: 29416 -.. date: 026 -.. nonce: KJGyI_ -.. section: Library - -Prevent infinite loop in pathlib.Path.mkdir - -.. - -.. bpo: 29444 -.. date: 025 -.. nonce: cEwgmk -.. section: Library - -Fixed out-of-bounds buffer access in the group() method of the match object. -Based on patch by WGH. - -.. - -.. bpo: 29335 -.. date: 024 -.. nonce: _KC7IK -.. section: Library - -Fix subprocess.Popen.wait() when the child process has exited to a stopped -instead of terminated state (ex: when under ptrace). - -.. - -.. bpo: 29290 -.. date: 023 -.. nonce: XBqptF -.. section: Library - -Fix a regression in argparse that help messages would wrap at non-breaking -spaces. - -.. - -.. bpo: 28735 -.. date: 022 -.. nonce: admHLO -.. section: Library - -Fixed the comparison of mock.MagickMock with mock.ANY. - -.. - -.. bpo: 29011 -.. date: 021 -.. nonce: MI5f2R -.. section: Library - -Fix an important omission by adding Deque to the typing module. - -.. - -.. bpo: 29219 -.. date: 020 -.. nonce: kxui7t -.. section: Library - -Fixed infinite recursion in the repr of uninitialized ctypes.CDLL instances. - -.. - -.. bpo: 28969 -.. date: 019 -.. nonce: j3HJYO -.. section: Library - -Fixed race condition in C implementation of functools.lru_cache. KeyError -could be raised when cached function with full cache was simultaneously -called from different threads with the same uncached arguments. - -.. - -.. bpo: 29142 -.. date: 018 -.. nonce: xo6kAv -.. section: Library - -In urllib.request, suffixes in no_proxy environment variable with leading -dots could match related hostnames again (e.g. .b.c matches a.b.c). Patch by -Milan Oberkirch. - -.. - -.. bpo: 30176 -.. date: 013 -.. nonce: VivmCg -.. section: Documentation - -Add missing attribute related constants in curses documentation. - -.. - -.. bpo: 26985 -.. date: 012 -.. nonce: NB5_9S -.. section: Documentation - -Add missing info of code object in inspect documentation. - -.. - -.. bpo: 28929 -.. date: 011 -.. nonce: Md7kb0 -.. section: Documentation - -Link the documentation to its source file on GitHub. - -.. - -.. bpo: 25008 -.. date: 010 -.. nonce: CeIzyU -.. section: Documentation - -Document smtpd.py as effectively deprecated and add a pointer to aiosmtpd, a -third-party asyncio-based replacement. - -.. - -.. bpo: 26355 -.. date: 009 -.. nonce: SDq_8Y -.. section: Documentation - -Add canonical header link on each page to corresponding major version of the -documentation. Patch by Matthias Bussonnier. - -.. - -.. bpo: 29349 -.. date: 008 -.. nonce: PjSo-t -.. section: Documentation - -Fix Python 2 syntax in code for building the documentation. - -.. - -.. bpo: 30822 -.. date: 2017-07-20-14-29-54 -.. nonce: X0wREo -.. section: Tests - -Fix regrtest command line parser to allow passing -u extralargefile to run -test_zipfile64. - -.. - -.. bpo: 30383 -.. date: 2017-06-27-13-52-43 -.. nonce: rCmrv7 -.. section: Tests - -regrtest: Enhance regrtest and backport features from the master branch. -Add options: --coverage, --testdir, --list-tests (list test files, don't run -them), --list-cases (list test identifiers, don't run them, :issue:`30523`), ---matchfile (load a list of test filters from a text file, :issue:`30540`), ---slowest (alias to --slow). -Enhance output: add timestamp, test result, currently running tests, "Tests -result: xxx" summary with total duration, etc. -Fix reference leak hunting in regrtest, --huntrleaks: regrtest now warms up -caches, create explicitly all internal singletons which are created on -demand to prevent false positives when checking for reference leaks. -(:issue:`30675`). - -.. - -.. bpo: 30357 -.. date: 004 -.. nonce: n4CPEa -.. section: Tests - -test_thread: setUp() now uses support.threading_setup() and -support.threading_cleanup() to wait until threads complete to avoid random -side effects on following tests. Initial patch written by Grzegorz Grzywacz. - -.. - -.. bpo: 28087 -.. date: 003 -.. nonce: m8dc4R -.. section: Tests - -Skip test_asyncore and test_eintr poll failures on macOS. Skip some tests of -select.poll when running on macOS due to unresolved issues with the -underlying system poll function on some macOS versions. - -.. - -.. bpo: 30197 -.. date: 002 -.. nonce: c5wRfu -.. section: Tests - -Enhanced functions swap_attr() and swap_item() in the test.support module. -They now work when delete replaced attribute or item inside the with -statement. The old value of the attribute or item (or None if it doesn't -exist) now will be assigned to the target of the "as" clause, if there is -one. - -.. - -.. bpo: 29571 -.. date: 001 -.. nonce: r6Dixr -.. section: Tests - -to match the behaviour of the ``re.LOCALE`` flag, test_re.test_locale_flag -now uses ``locale.getpreferredencoding(False)`` to determine the candidate -encoding for the test regex (allowing it to correctly skip the test when the -default locale encoding is a multi-byte encoding) - -.. - -.. bpo: 29243 -.. date: 007 -.. nonce: WDK4hT -.. section: Build - -Prevent unnecessary rebuilding of Python during ``make test``, ``make -install`` and some other make targets when configured with -``--enable-optimizations``. - -.. - -.. bpo: 23404 -.. date: 006 -.. nonce: PdYVWg -.. section: Build - -Don't regenerate generated files based on file modification time anymore: -the action is now explicit. Replace ``make touch`` with ``make regen-all``. - -.. - -.. bpo: 29643 -.. date: 005 -.. nonce: 4WLIJQ -.. section: Build - -Fix ``--enable-optimization`` didn't work. - -.. - -.. bpo: 30687 -.. date: 017 -.. nonce: 8mqHnu -.. section: Windows - -Locate msbuild.exe on Windows when building rather than vcvarsall.bat - -.. - -.. bpo: 29392 -.. date: 016 -.. nonce: OtqS5t -.. section: Windows - -Prevent crash when passing invalid arguments into msvcrt module. - -.. - -.. bpo: 27867 -.. date: 015 -.. nonce: VMCoJU -.. section: C API - -Function PySlice_GetIndicesEx() is replaced with a macro if Py_LIMITED_API -is set to the value between 0x03050400 and 0x03060000 (not including) or -0x03060100 or higher. - -.. - -.. bpo: 29083 -.. date: 014 -.. nonce: tGTjr_ -.. section: C API - -Fixed the declaration of some public API functions. PyArg_VaParse() and -PyArg_VaParseTupleAndKeywords() were not available in limited API. -PyArg_ValidateKeywordArguments(), PyArg_UnpackTuple() and Py_BuildValue() -were not available in limited API of version < 3.3 when PY_SSIZE_T_CLEAN is -defined. diff --git a/Misc/NEWS.d/3.5.5.rst b/Misc/NEWS.d/3.5.5.rst deleted file mode 100644 index 9d739259e86b92c191ae474bbc5b33fd96fda727..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.5.rst +++ /dev/null @@ -1,8 +0,0 @@ -.. bpo: 0 -.. date: 2018-02-04 -.. no changes: True -.. nonce: G9yme3 -.. release date: 2018-02-04 -.. section: Library - -There were no new changes in version 3.5.5. diff --git a/Misc/NEWS.d/3.5.5rc1.rst b/Misc/NEWS.d/3.5.5rc1.rst deleted file mode 100644 index 9ccbf7b8060cd43f0f8b4a0f9497929c079fb0ba..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.5.5rc1.rst +++ /dev/null @@ -1,72 +0,0 @@ -.. bpo: 32551 -.. date: 2018-01-16-16-05-37 -.. nonce: U0z4W- -.. release date: 2018-01-23 -.. section: Security - -The ``sys.path[0]`` initialization change for bpo-29139 caused a regression -by revealing an inconsistency in how sys.path is initialized when executing -``__main__`` from a zipfile, directory, or other import location. This is -considered a potential security issue, as it may lead to privileged -processes unexpectedly loading code from user controlled directories in -situations where that was not previously the case. -The interpreter now consistently avoids ever adding the import location's -parent directory to ``sys.path``, and ensures no other ``sys.path`` entries -are inadvertently modified when inserting the import location named on the -command line. (Originally reported as bpo-29723 against Python 3.6rc1, but -it was missed at the time that the then upcoming Python 3.5.4 release would -also be affected) - -.. - -.. bpo: 30657 -.. date: 2017-12-01-18-51-03 -.. nonce: Fd8kId -.. section: Security - -Fixed possible integer overflow in PyBytes_DecodeEscape, CVE-2017-1000158. -Original patch by Jay Bosamiya; rebased to Python 3 by Miro Hrončok. - -.. - -.. bpo: 30947 -.. date: 2017-09-05-20-34-44 -.. nonce: iNMmm4 -.. section: Security - -Upgrade libexpat embedded copy from version 2.2.1 to 2.2.3 to get security -fixes. - -.. - -.. bpo: 31095 -.. date: 2017-08-01-18-48-30 -.. nonce: bXWZDb -.. section: Core and Builtins - -Fix potential crash during GC caused by ``tp_dealloc`` which doesn't call -``PyObject_GC_UnTrack()``. - -.. - -.. bpo: 32072 -.. date: 2017-11-18-21-13-52 -.. nonce: nwDV8L -.. section: Library - -Fixed issues with binary plists: -Fixed saving bytearrays. -Identical objects will be saved only once. -Equal references will be load as identical objects. -Added support for saving and loading recursive data structures. - -.. - -.. bpo: 31170 -.. date: 2017-09-05-20-35-21 -.. nonce: QGmJ1t -.. section: Library - -expat: Update libexpat from 2.2.3 to 2.2.4. Fix copying of partial -characters for UTF-8 input (libexpat bug 115): -https://github.com/libexpat/libexpat/issues/115 diff --git a/Misc/NEWS.d/3.6.0.rst b/Misc/NEWS.d/3.6.0.rst deleted file mode 100644 index f9805cab28615e76809940fb6db8bd3ebc2f263b..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.0.rst +++ /dev/null @@ -1,7 +0,0 @@ -.. bpo: 0 -.. date: 9796 -.. no changes: True -.. nonce: F9ENBV -.. release date: 2016-12-23 - -No changes since release candidate 2 diff --git a/Misc/NEWS.d/3.6.0a1.rst b/Misc/NEWS.d/3.6.0a1.rst deleted file mode 100644 index 3fa356c56d94a07895aea696cea7bb4d2ecb3479..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.0a1.rst +++ /dev/null @@ -1,3940 +0,0 @@ -.. bpo: 20041 -.. date: 9253 -.. nonce: TypyGp -.. release date: 2016-05-16 -.. section: Core and Builtins - -Fixed TypeError when frame.f_trace is set to None. Patch by Xavier de Gaye. - -.. - -.. bpo: 26168 -.. date: 9252 -.. nonce: -nPBL6 -.. section: Core and Builtins - -Fixed possible refleaks in failing Py_BuildValue() with the "N" format unit. - -.. - -.. bpo: 26991 -.. date: 9251 -.. nonce: yWGNhz -.. section: Core and Builtins - -Fix possible refleak when creating a function with annotations. - -.. - -.. bpo: 27039 -.. date: 9250 -.. nonce: oO-wLV -.. section: Core and Builtins - -Fixed bytearray.remove() for values greater than 127. Based on patch by Joe -Jevnik. - -.. - -.. bpo: 23640 -.. date: 9249 -.. nonce: kvNC4c -.. section: Core and Builtins - -int.from_bytes() no longer bypasses constructors for subclasses. - -.. - -.. bpo: 27005 -.. date: 9248 -.. nonce: ZtcJf- -.. section: Core and Builtins - -Optimized the float.fromhex() class method for exact float. It is now 2 -times faster. - -.. - -.. bpo: 18531 -.. date: 9247 -.. nonce: PkXgtO -.. section: Core and Builtins - -Single var-keyword argument of dict subtype was passed unscathed to the -C-defined function. Now it is converted to exact dict. - -.. - -.. bpo: 26811 -.. date: 9246 -.. nonce: oNzUWt -.. section: Core and Builtins - -gc.get_objects() no longer contains a broken tuple with NULL pointer. - -.. - -.. bpo: 20120 -.. date: 9245 -.. nonce: c-FZZc -.. section: Core and Builtins - -Use RawConfigParser for .pypirc parsing, removing support for interpolation -unintentionally added with move to Python 3. Behavior no longer does any -interpolation in .pypirc files, matching behavior in Python 2.7 and -Setuptools 19.0. - -.. - -.. bpo: 26249 -.. date: 9244 -.. nonce: ZbpWF3 -.. section: Core and Builtins - -Memory functions of the :c:func:`PyMem_Malloc` domain -(:c:data:`PYMEM_DOMAIN_MEM`) now use the :ref:`pymalloc allocator -` rather than system :c:func:`malloc`. Applications calling -:c:func:`PyMem_Malloc` without holding the GIL can now crash: use -``PYTHONMALLOC=debug`` environment variable to validate the usage of memory -allocators in your application. - -.. - -.. bpo: 26802 -.. date: 9243 -.. nonce: hWpU4v -.. section: Core and Builtins - -Optimize function calls only using unpacking like ``func(*tuple)`` (no other -positional argument, no keyword): avoid copying the tuple. Patch written by -Joe Jevnik. - -.. - -.. bpo: 26659 -.. date: 9242 -.. nonce: 5PRa83 -.. section: Core and Builtins - -Make the builtin slice type support cycle collection. - -.. - -.. bpo: 26718 -.. date: 9241 -.. nonce: K5PQ8j -.. section: Core and Builtins - -super.__init__ no longer leaks memory if called multiple times. NOTE: A -direct call of super.__init__ is not endorsed! - -.. - -.. bpo: 27138 -.. date: 9240 -.. nonce: ifYEro -.. section: Core and Builtins - -Fix the doc comment for FileFinder.find_spec(). - -.. - -.. bpo: 27147 -.. date: 9239 -.. nonce: tCCgmH -.. section: Core and Builtins - -Mention :pep:`420` in the importlib docs. - -.. - -.. bpo: 25339 -.. date: 9238 -.. nonce: ZcaC2E -.. section: Core and Builtins - -PYTHONIOENCODING now has priority over locale in setting the error handler -for stdin and stdout. - -.. - -.. bpo: 26494 -.. date: 9237 -.. nonce: G6eXIi -.. section: Core and Builtins - -Fixed crash on iterating exhausting iterators. Affected classes are generic -sequence iterators, iterators of str, bytes, bytearray, list, tuple, set, -frozenset, dict, OrderedDict, corresponding views and os.scandir() iterator. - -.. - -.. bpo: 26574 -.. date: 9236 -.. nonce: D2YL_w -.. section: Core and Builtins - -Optimize ``bytes.replace(b'', b'.')`` and ``bytearray.replace(b'', b'.')``. -Patch written by Josh Snider. - -.. - -.. bpo: 26581 -.. date: 9235 -.. nonce: yNA7nm -.. section: Core and Builtins - -If coding cookie is specified multiple times on a line in Python source code -file, only the first one is taken to account. - -.. - -.. bpo: 19711 -.. date: 9234 -.. nonce: gDDPJE -.. section: Core and Builtins - -Add tests for reloading namespace packages. - -.. - -.. bpo: 21099 -.. date: 9233 -.. nonce: CuMWZJ -.. section: Core and Builtins - -Switch applicable importlib tests to use :pep:`451` API. - -.. - -.. bpo: 26563 -.. date: 9232 -.. nonce: lyrB2Q -.. section: Core and Builtins - -Debug hooks on Python memory allocators now raise a fatal error if functions -of the :c:func:`PyMem_Malloc` family are called without holding the GIL. - -.. - -.. bpo: 26564 -.. date: 9231 -.. nonce: xeRXaz -.. section: Core and Builtins - -On error, the debug hooks on Python memory allocators now use the -:mod:`tracemalloc` module to get the traceback where a memory block was -allocated. - -.. - -.. bpo: 26558 -.. date: 9230 -.. nonce: s05jz7 -.. section: Core and Builtins - -The debug hooks on Python memory allocator :c:func:`PyObject_Malloc` now -detect when functions are called without holding the GIL. - -.. - -.. bpo: 26516 -.. date: 9229 -.. nonce: OjekqZ -.. section: Core and Builtins - -Add :envvar:`PYTHONMALLOC` environment variable to set the Python memory -allocators and/or install debug hooks. - -.. - -.. bpo: 26516 -.. date: 9228 -.. nonce: chNJuF -.. section: Core and Builtins - -The :c:func:`PyMem_SetupDebugHooks` function can now also be used on Python -compiled in release mode. - -.. - -.. bpo: 26516 -.. date: 9227 -.. nonce: q7fu1f -.. section: Core and Builtins - -The :envvar:`PYTHONMALLOCSTATS` environment variable can now also be used on -Python compiled in release mode. It now has no effect if set to an empty -string. - -.. - -.. bpo: 26516 -.. date: 9226 -.. nonce: 2k9k6R -.. section: Core and Builtins - -In debug mode, debug hooks are now also installed on Python memory -allocators when Python is configured without pymalloc. - -.. - -.. bpo: 26464 -.. date: 9225 -.. nonce: 7BreGz -.. section: Core and Builtins - -Fix str.translate() when string is ASCII and first replacements removes -character, but next replacement uses a non-ASCII character or a string -longer than 1 character. Regression introduced in Python 3.5.0. - -.. - -.. bpo: 22836 -.. date: 9224 -.. nonce: cimt1y -.. section: Core and Builtins - -Ensure exception reports from PyErr_Display() and PyErr_WriteUnraisable() -are sensible even when formatting them produces secondary errors. This -affects the reports produced by sys.__excepthook__() and when __del__() -raises an exception. - -.. - -.. bpo: 26302 -.. date: 9223 -.. nonce: UD9XQt -.. section: Core and Builtins - -Correct behavior to reject comma as a legal character for cookie names. - -.. - -.. bpo: 26136 -.. date: 9222 -.. nonce: eZ0t1K -.. section: Core and Builtins - -Upgrade the warning when a generator raises StopIteration from -PendingDeprecationWarning to DeprecationWarning. Patch by Anish Shah. - -.. - -.. bpo: 26204 -.. date: 9221 -.. nonce: x3Zp8E -.. section: Core and Builtins - -The compiler now ignores all constant statements: bytes, str, int, float, -complex, name constants (None, False, True), Ellipsis and ast.Constant; not -only str and int. For example, ``1.0`` is now ignored in ``def f(): 1.0``. - -.. - -.. bpo: 4806 -.. date: 9220 -.. nonce: i9m3hj -.. section: Core and Builtins - -Avoid masking the original TypeError exception when using star (``*``) -unpacking in function calls. Based on patch by Hagen Fürstenau and Daniel -Urban. - -.. - -.. bpo: 26146 -.. date: 9219 -.. nonce: HKrUth -.. section: Core and Builtins - -Add a new kind of AST node: ``ast.Constant``. It can be used by external AST -optimizers, but the compiler does not emit directly such node. - -.. - -.. bpo: 23601 -.. date: 9218 -.. nonce: 2E4seG -.. section: Core and Builtins - -Sped-up allocation of dict key objects by using Python's small object -allocator. (Contributed by Julian Taylor.) - -.. - -.. bpo: 18018 -.. date: 9217 -.. nonce: XKKap3 -.. section: Core and Builtins - -Import raises ImportError instead of SystemError if a relative import is -attempted without a known parent package. - -.. - -.. bpo: 25843 -.. date: 9216 -.. nonce: NtJZie -.. section: Core and Builtins - -When compiling code, don't merge constants if they are equal but have a -different types. For example, ``f1, f2 = lambda: 1, lambda: 1.0`` is now -correctly compiled to two different functions: ``f1()`` returns ``1`` -(``int``) and ``f2()`` returns ``1.0`` (``float``), even if ``1`` and -``1.0`` are equal. - -.. - -.. bpo: 26107 -.. date: 9215 -.. nonce: q0LBMY -.. section: Core and Builtins - -The format of the ``co_lnotab`` attribute of code objects changes to support -negative line number delta. - -.. - -.. bpo: 26154 -.. date: 9214 -.. nonce: MtnRAH -.. section: Core and Builtins - -Add a new private _PyThreadState_UncheckedGet() function to get the current -Python thread state, but don't issue a fatal error if it is NULL. This new -function must be used instead of accessing directly the -_PyThreadState_Current variable. The variable is no more exposed since -Python 3.5.1 to hide the exact implementation of atomic C types, to avoid -compiler issues. - -.. - -.. bpo: 25791 -.. date: 9213 -.. nonce: gllzPw -.. section: Core and Builtins - -If __package__ != __spec__.parent or if neither __package__ or __spec__ are -defined then ImportWarning is raised. - -.. - -.. bpo: 22995 -.. date: 9212 -.. nonce: KYNKvs -.. section: Core and Builtins - -[UPDATE] Comment out the one of the pickleability tests in -_PyObject_GetState() due to regressions observed in Cython-based projects. - -.. - -.. bpo: 25961 -.. date: 9211 -.. nonce: Hdjjw0 -.. section: Core and Builtins - -Disallowed null characters in the type name. - -.. - -.. bpo: 25973 -.. date: 9210 -.. nonce: Ud__ZP -.. section: Core and Builtins - -Fix segfault when an invalid nonlocal statement binds a name starting with -two underscores. - -.. - -.. bpo: 22995 -.. date: 9209 -.. nonce: Wq0E86 -.. section: Core and Builtins - -Instances of extension types with a state that aren't subclasses of list or -dict and haven't implemented any pickle-related methods (__reduce__, -__reduce_ex__, __getnewargs__, __getnewargs_ex__, or __getstate__), can no -longer be pickled. Including memoryview. - -.. - -.. bpo: 20440 -.. date: 9208 -.. nonce: GCwOfH -.. section: Core and Builtins - -Massive replacing unsafe attribute setting code with special macro -Py_SETREF. - -.. - -.. bpo: 25766 -.. date: 9207 -.. nonce: jn93Yu -.. section: Core and Builtins - -Special method __bytes__() now works in str subclasses. - -.. - -.. bpo: 25421 -.. date: 9206 -.. nonce: c47YEL -.. section: Core and Builtins - -__sizeof__ methods of builtin types now use dynamic basic size. This allows -sys.getsize() to work correctly with their subclasses with __slots__ -defined. - -.. - -.. bpo: 25709 -.. date: 9205 -.. nonce: WwGm2k -.. section: Core and Builtins - -Fixed problem with in-place string concatenation and utf-8 cache. - -.. - -.. bpo: 5319 -.. date: 9204 -.. nonce: HxlGwI -.. section: Core and Builtins - -New Py_FinalizeEx() API allowing Python to set an exit status of 120 on -failure to flush buffered streams. - -.. - -.. bpo: 25485 -.. date: 9203 -.. nonce: 9qnaPt -.. section: Core and Builtins - -telnetlib.Telnet is now a context manager. - -.. - -.. bpo: 24097 -.. date: 9202 -.. nonce: Vt4E-i -.. section: Core and Builtins - -Fixed crash in object.__reduce__() if slot name is freed inside __getattr__. - -.. - -.. bpo: 24731 -.. date: 9201 -.. nonce: h9-hnz -.. section: Core and Builtins - -Fixed crash on converting objects with special methods __bytes__, __trunc__, -and __float__ returning instances of subclasses of bytes, int, and float to -subclasses of bytes, int, and float correspondingly. - -.. - -.. bpo: 25630 -.. date: 9200 -.. nonce: ZxzcoY -.. section: Core and Builtins - -Fix a possible segfault during argument parsing in functions that accept -filesystem paths. - -.. - -.. bpo: 23564 -.. date: 9199 -.. nonce: XHarGG -.. section: Core and Builtins - -Fixed a partially broken sanity check in the _posixsubprocess internals -regarding how fds_to_pass were passed to the child. The bug had no actual -impact as subprocess.py already avoided it. - -.. - -.. bpo: 25388 -.. date: 9198 -.. nonce: zm3uuQ -.. section: Core and Builtins - -Fixed tokenizer crash when processing undecodable source code with a null -byte. - -.. - -.. bpo: 25462 -.. date: 9197 -.. nonce: eXDzgO -.. section: Core and Builtins - -The hash of the key now is calculated only once in most operations in C -implementation of OrderedDict. - -.. - -.. bpo: 22995 -.. date: 9196 -.. nonce: 90kpuP -.. section: Core and Builtins - -Default implementation of __reduce__ and __reduce_ex__ now rejects builtin -types with not defined __new__. - -.. - -.. bpo: 24802 -.. date: 9195 -.. nonce: Qie066 -.. section: Core and Builtins - -Avoid buffer overreads when int(), float(), compile(), exec() and eval() are -passed bytes-like objects. These objects are not necessarily terminated by -a null byte, but the functions assumed they were. - -.. - -.. bpo: 25555 -.. date: 9194 -.. nonce: MUpG-j -.. section: Core and Builtins - -Fix parser and AST: fill lineno and col_offset of "arg" node when compiling -AST from Python objects. - -.. - -.. bpo: 24726 -.. date: 9193 -.. nonce: AHk4v2 -.. section: Core and Builtins - -Fixed a crash and leaking NULL in repr() of OrderedDict that was mutated by -direct calls of dict methods. - -.. - -.. bpo: 25449 -.. date: 9192 -.. nonce: VqTOFi -.. section: Core and Builtins - -Iterating OrderedDict with keys with unstable hash now raises KeyError in C -implementations as well as in Python implementation. - -.. - -.. bpo: 25395 -.. date: 9191 -.. nonce: htkE3W -.. section: Core and Builtins - -Fixed crash when highly nested OrderedDict structures were garbage -collected. - -.. - -.. bpo: 25401 -.. date: 9190 -.. nonce: ofrAtd -.. section: Core and Builtins - -Optimize bytes.fromhex() and bytearray.fromhex(): they are now between 2x -and 3.5x faster. - -.. - -.. bpo: 25399 -.. date: 9189 -.. nonce: dNKIhY -.. section: Core and Builtins - -Optimize bytearray % args using the new private _PyBytesWriter API. -Formatting is now between 2.5 and 5 times faster. - -.. - -.. bpo: 25274 -.. date: 9188 -.. nonce: QCGvAF -.. section: Core and Builtins - -sys.setrecursionlimit() now raises a RecursionError if the new recursion -limit is too low depending at the current recursion depth. Modify also the -"lower-water mark" formula to make it monotonic. This mark is used to decide -when the overflowed flag of the thread state is reset. - -.. - -.. bpo: 24402 -.. date: 9187 -.. nonce: MAgi3X -.. section: Core and Builtins - -Fix input() to prompt to the redirected stdout when sys.stdout.fileno() -fails. - -.. - -.. bpo: 25349 -.. date: 9186 -.. nonce: 7lBgJ8 -.. section: Core and Builtins - -Optimize bytes % args using the new private _PyBytesWriter API. Formatting -is now up to 2 times faster. - -.. - -.. bpo: 24806 -.. date: 9185 -.. nonce: Nb0znT -.. section: Core and Builtins - -Prevent builtin types that are not allowed to be subclassed from being -subclassed through multiple inheritance. - -.. - -.. bpo: 25301 -.. date: 9184 -.. nonce: hUTCfr -.. section: Core and Builtins - -The UTF-8 decoder is now up to 15 times as fast for error handlers: -``ignore``, ``replace`` and ``surrogateescape``. - -.. - -.. bpo: 24848 -.. date: 9183 -.. nonce: HlUSuy -.. section: Core and Builtins - -Fixed a number of bugs in UTF-7 decoding of misformed data. - -.. - -.. bpo: 25267 -.. date: 9182 -.. nonce: SW8Gs6 -.. section: Core and Builtins - -The UTF-8 encoder is now up to 75 times as fast for error handlers: -``ignore``, ``replace``, ``surrogateescape``, ``surrogatepass``. Patch -co-written with Serhiy Storchaka. - -.. - -.. bpo: 25280 -.. date: 9181 -.. nonce: ivTMwd -.. section: Core and Builtins - -Import trace messages emitted in verbose (-v) mode are no longer formatted -twice. - -.. - -.. bpo: 25227 -.. date: 9180 -.. nonce: 19v5rp -.. section: Core and Builtins - -Optimize ASCII and latin1 encoders with the ``surrogateescape`` error -handler: the encoders are now up to 3 times as fast. Initial patch written -by Serhiy Storchaka. - -.. - -.. bpo: 25003 -.. date: 9179 -.. nonce: _ban92 -.. section: Core and Builtins - -On Solaris 11.3 or newer, os.urandom() now uses the getrandom() function -instead of the getentropy() function. The getentropy() function is blocking -to generate very good quality entropy, os.urandom() doesn't need such -high-quality entropy. - -.. - -.. bpo: 9232 -.. date: 9178 -.. nonce: pjsmWw -.. section: Core and Builtins - -Modify Python's grammar to allow trailing commas in the argument list of a -function declaration. For example, "def f(\*, a = 3,): pass" is now legal. -Patch from Mark Dickinson. - -.. - -.. bpo: 24965 -.. date: 9177 -.. nonce: wfyxbB -.. section: Core and Builtins - -Implement :pep:`498` "Literal String Interpolation". This allows you to embed -expressions inside f-strings, which are converted to normal strings at run -time. Given x=3, then f'value={x}' == 'value=3'. Patch by Eric V. Smith. - -.. - -.. bpo: 26478 -.. date: 9176 -.. nonce: n0dB8e -.. section: Core and Builtins - -Fix semantic bugs when using binary operators with dictionary views and -tuples. - -.. - -.. bpo: 26171 -.. date: 9175 -.. nonce: 8SaQEa -.. section: Core and Builtins - -Fix possible integer overflow and heap corruption in zipimporter.get_data(). - -.. - -.. bpo: 25660 -.. date: 9174 -.. nonce: 93DzBo -.. section: Core and Builtins - -Fix TAB key behaviour in REPL with readline. - -.. - -.. bpo: 26288 -.. date: 9173 -.. nonce: f67RLk -.. section: Core and Builtins - -Optimize PyLong_AsDouble. - -.. - -.. bpo: 26289 -.. date: 9172 -.. nonce: uG9ozG -.. section: Core and Builtins - -Optimize floor and modulo division for single-digit longs. Microbenchmarks -show 2-2.5x improvement. Built-in 'divmod' function is now also ~10% -faster. (See also: bpo-26315) - -.. - -.. bpo: 25887 -.. date: 9171 -.. nonce: PtVIX7 -.. section: Core and Builtins - -Raise a RuntimeError when a coroutine object is awaited more than once. - -.. - -.. bpo: 27057 -.. date: 9170 -.. nonce: YzTA_Q -.. section: Library - -Fix os.set_inheritable() on Android, ioctl() is blocked by SELinux and fails -with EACCESS. The function now falls back to fcntl(). Patch written by -Michał Bednarski. - -.. - -.. bpo: 27014 -.. date: 9169 -.. nonce: ui7Khn -.. section: Library - -Fix infinite recursion using typing.py. Thanks to Kalle Tuure! - -.. - -.. bpo: 27031 -.. date: 9168 -.. nonce: FtvDPs -.. section: Library - -Removed dummy methods in Tkinter widget classes: tk_menuBar() and -tk_bindForTraversal(). - -.. - -.. bpo: 14132 -.. date: 9167 -.. nonce: 5wR9MN -.. section: Library - -Fix urllib.request redirect handling when the target only has a query -string. Original fix by Ján Janech. - -.. - -.. bpo: 17214 -.. date: 9166 -.. nonce: lUbZOV -.. section: Library - -The "urllib.request" module now percent-encodes non-ASCII bytes found in -redirect target URLs. Some servers send Location header fields with -non-ASCII bytes, but "http.client" requires the request target to be -ASCII-encodable, otherwise a UnicodeEncodeError is raised. Based on patch by -Christian Heimes. - -.. - -.. bpo: 27033 -.. date: 9165 -.. nonce: o4XIPr -.. section: Library - -The default value of the decode_data parameter for smtpd.SMTPChannel and -smtpd.SMTPServer constructors is changed to False. - -.. - -.. bpo: 27034 -.. date: 9164 -.. nonce: ptzz_S -.. section: Library - -Removed deprecated class asynchat.fifo. - -.. - -.. bpo: 26870 -.. date: 9163 -.. nonce: 5tCUlp -.. section: Library - -Added readline.set_auto_history(), which can stop entries being -automatically added to the history list. Based on patch by Tyler Crompton. - -.. - -.. bpo: 26039 -.. date: 9162 -.. nonce: JnXjiE -.. section: Library - -zipfile.ZipFile.open() can now be used to write data into a ZIP file, as -well as for extracting data. Patch by Thomas Kluyver. - -.. - -.. bpo: 26892 -.. date: 9161 -.. nonce: XIXb0h -.. section: Library - -Honor debuglevel flag in urllib.request.HTTPHandler. Patch contributed by -Chi Hsuan Yen. - -.. - -.. bpo: 22274 -.. date: 9160 -.. nonce: 0RHDMN -.. section: Library - -In the subprocess module, allow stderr to be redirected to stdout even when -stdout is not redirected. Patch by Akira Li. - -.. - -.. bpo: 26807 -.. date: 9159 -.. nonce: LXSPP6 -.. section: Library - -mock_open 'files' no longer error on readline at end of file. Patch from -Yolanda Robla. - -.. - -.. bpo: 25745 -.. date: 9158 -.. nonce: -n8acU -.. section: Library - -Fixed leaking a userptr in curses panel destructor. - -.. - -.. bpo: 26977 -.. date: 9157 -.. nonce: 5G4HtL -.. section: Library - -Removed unnecessary, and ignored, call to sum of squares helper in -statistics.pvariance. - -.. - -.. bpo: 26002 -.. date: 9156 -.. nonce: bVD4pW -.. section: Library - -Use bisect in statistics.median instead of a linear search. Patch by Upendra -Kuma. - -.. - -.. bpo: 25974 -.. date: 9155 -.. nonce: cpOy5R -.. section: Library - -Make use of new Decimal.as_integer_ratio() method in statistics module. -Patch by Stefan Krah. - -.. - -.. bpo: 26996 -.. date: 9154 -.. nonce: LR__VD -.. section: Library - -Add secrets module as described in :pep:`506`. - -.. - -.. bpo: 26881 -.. date: 9153 -.. nonce: mdiq_L -.. section: Library - -The modulefinder module now supports extended opcode arguments. - -.. - -.. bpo: 23815 -.. date: 9152 -.. nonce: _krNe8 -.. section: Library - -Fixed crashes related to directly created instances of types in _tkinter and -curses.panel modules. - -.. - -.. bpo: 17765 -.. date: 9151 -.. nonce: hiSVS1 -.. section: Library - -weakref.ref() no longer silently ignores keyword arguments. Patch by Georg -Brandl. - -.. - -.. bpo: 26873 -.. date: 9150 -.. nonce: cYXRcH -.. section: Library - -xmlrpc now raises ResponseError on unsupported type tags instead of silently -return incorrect result. - -.. - -.. bpo: 26915 -.. date: 9149 -.. nonce: GoQKUL -.. section: Library - -The __contains__ methods in the collections ABCs now check for identity -before checking equality. This better matches the behavior of the concrete -classes, allows sensible handling of NaNs, and makes it easier to reason -about container invariants. - -.. - -.. bpo: 26711 -.. date: 9148 -.. nonce: Eu85Qw -.. section: Library - -Fixed the comparison of plistlib.Data with other types. - -.. - -.. bpo: 24114 -.. date: 9147 -.. nonce: RMRMtM -.. section: Library - -Fix an uninitialized variable in `ctypes.util`. -The bug only occurs on SunOS when the ctypes implementation searches for the -`crle` program. Patch by Xiang Zhang. Tested on SunOS by Kees Bos. - -.. - -.. bpo: 26864 -.. date: 9146 -.. nonce: 1KgGds -.. section: Library - -In urllib.request, change the proxy bypass host checking against no_proxy to -be case-insensitive, and to not match unrelated host names that happen to -have a bypassed hostname as a suffix. Patch by Xiang Zhang. - -.. - -.. bpo: 24902 -.. date: 9145 -.. nonce: bwWpLj -.. section: Library - -Print server URL on http.server startup. Initial patch by Felix Kaiser. - -.. - -.. bpo: 25788 -.. date: 9144 -.. nonce: 9weIV5 -.. section: Library - -fileinput.hook_encoded() now supports an "errors" argument for passing to -open. Original patch by Joseph Hackman. - -.. - -.. bpo: 26634 -.. date: 9143 -.. nonce: FZvsSb -.. section: Library - -recursive_repr() now sets __qualname__ of wrapper. Patch by Xiang Zhang. - -.. - -.. bpo: 26804 -.. date: 9142 -.. nonce: 9Orp-G -.. section: Library - -urllib.request will prefer lower_case proxy environment variables over -UPPER_CASE or Mixed_Case ones. Patch contributed by Hans-Peter Jansen. - -.. - -.. bpo: 26837 -.. date: 9141 -.. nonce: 2FXGsD -.. section: Library - -assertSequenceEqual() now correctly outputs non-stringified differing items -(like bytes in the -b mode). This affects assertListEqual() and -assertTupleEqual(). - -.. - -.. bpo: 26041 -.. date: 9140 -.. nonce: bVem-p -.. section: Library - -Remove "will be removed in Python 3.7" from deprecation messages of -platform.dist() and platform.linux_distribution(). Patch by Kumaripaba -Miyurusara Athukorala. - -.. - -.. bpo: 26822 -.. date: 9139 -.. nonce: rYSL4W -.. section: Library - -itemgetter, attrgetter and methodcaller objects no longer silently ignore -keyword arguments. - -.. - -.. bpo: 26733 -.. date: 9138 -.. nonce: YxaJmL -.. section: Library - -Disassembling a class now disassembles class and static methods. Patch by -Xiang Zhang. - -.. - -.. bpo: 26801 -.. date: 9137 -.. nonce: TQGY-7 -.. section: Library - -Fix error handling in :func:`shutil.get_terminal_size`, catch -:exc:`AttributeError` instead of :exc:`NameError`. Patch written by Emanuel -Barry. - -.. - -.. bpo: 24838 -.. date: 9136 -.. nonce: 3Pfx8T -.. section: Library - -tarfile's ustar and gnu formats now correctly calculate name and link field -limits for multibyte character encodings like utf-8. - -.. - -.. bpo: 26657 -.. date: 9135 -.. nonce: C_-XFg -.. original section: Library -.. section: Security - -Fix directory traversal vulnerability with http.server on Windows. This -fixes a regression that was introduced in 3.3.4rc1 and 3.4.0rc1. Based on -patch by Philipp Hagemeister. - -.. - -.. bpo: 26717 -.. date: 9134 -.. nonce: jngTdu -.. section: Library - -Stop encoding Latin-1-ized WSGI paths with UTF-8. Patch by Anthony Sottile. - -.. - -.. bpo: 26782 -.. date: 9133 -.. nonce: JWLPrH -.. section: Library - -Add STARTUPINFO to subprocess.__all__ on Windows. - -.. - -.. bpo: 26404 -.. date: 9132 -.. nonce: hXw7Bs -.. section: Library - -Add context manager to socketserver. Patch by Aviv Palivoda. - -.. - -.. bpo: 26735 -.. date: 9131 -.. nonce: riSl3b -.. section: Library - -Fix :func:`os.urandom` on Solaris 11.3 and newer when reading more than -1,024 bytes: call ``getrandom()`` multiple times with a limit of 1024 bytes -per call. - -.. - -.. bpo: 26585 -.. date: 9130 -.. nonce: kfb749 -.. section: Library - -Eliminate http.server._quote_html() and use html.escape(quote=False). Patch -by Xiang Zhang. - -.. - -.. bpo: 26685 -.. date: 9129 -.. nonce: sI_1Ff -.. section: Library - -Raise OSError if closing a socket fails. - -.. - -.. bpo: 16329 -.. date: 9128 -.. nonce: nuXD8W -.. section: Library - -Add .webm to mimetypes.types_map. Patch by Giampaolo Rodola'. - -.. - -.. bpo: 13952 -.. date: 9127 -.. nonce: SOoTVE -.. section: Library - -Add .csv to mimetypes.types_map. Patch by Geoff Wilson. - -.. - -.. bpo: 26587 -.. date: 9126 -.. nonce: Qo-B6C -.. section: Library - -the site module now allows .pth files to specify files to be added to -sys.path (e.g. zip files). - -.. - -.. bpo: 25609 -.. date: 9125 -.. nonce: t1ydQM -.. section: Library - -Introduce contextlib.AbstractContextManager and typing.ContextManager. - -.. - -.. bpo: 26709 -.. date: 9124 -.. nonce: luOPbP -.. section: Library - -Fixed Y2038 problem in loading binary PLists. - -.. - -.. bpo: 23735 -.. date: 9123 -.. nonce: Y5oQ9r -.. section: Library - -Handle terminal resizing with Readline 6.3+ by installing our own SIGWINCH -handler. Patch by Eric Price. - -.. - -.. bpo: 25951 -.. date: 9122 -.. nonce: 1CUASJ -.. section: Library - -Change SSLSocket.sendall() to return None, as explicitly documented for -plain socket objects. Patch by Aviv Palivoda. - -.. - -.. bpo: 26586 -.. date: 9121 -.. nonce: V5pZNa -.. section: Library - -In http.server, respond with "413 Request header fields too large" if there -are too many header fields to parse, rather than killing the connection and -raising an unhandled exception. Patch by Xiang Zhang. - -.. - -.. bpo: 26676 -.. date: 9120 -.. nonce: zLRFed -.. section: Library - -Added missing XMLPullParser to ElementTree.__all__. - -.. - -.. bpo: 22854 -.. date: 9119 -.. nonce: K3rMEH -.. section: Library - -Change BufferedReader.writable() and BufferedWriter.readable() to always -return False. - -.. - -.. bpo: 26492 -.. date: 9118 -.. nonce: YN18iz -.. section: Library - -Exhausted iterator of array.array now conforms with the behavior of -iterators of other mutable sequences: it lefts exhausted even if iterated -array is extended. - -.. - -.. bpo: 26641 -.. date: 9117 -.. nonce: 1ICQz0 -.. section: Library - -doctest.DocFileTest and doctest.testfile() now support packages (module -splitted into multiple directories) for the package parameter. - -.. - -.. bpo: 25195 -.. date: 9116 -.. nonce: EOc4Po -.. section: Library - -Fix a regression in mock.MagicMock. _Call is a subclass of tuple (changeset -3603bae63c13 only works for classes) so we need to implement __ne__ -ourselves. Patch by Andrew Plummer. - -.. - -.. bpo: 26644 -.. date: 9115 -.. nonce: 7tt1tk -.. section: Library - -Raise ValueError rather than SystemError when a negative length is passed to -SSLSocket.recv() or read(). - -.. - -.. bpo: 23804 -.. date: 9114 -.. nonce: PP63Ff -.. section: Library - -Fix SSL recv(0) and read(0) methods to return zero bytes instead of up to -1024. - -.. - -.. bpo: 26616 -.. date: 9113 -.. nonce: v3QwdD -.. section: Library - -Fixed a bug in datetime.astimezone() method. - -.. - -.. bpo: 26637 -.. date: 9112 -.. nonce: ttiUf7 -.. section: Library - -The :mod:`importlib` module now emits an :exc:`ImportError` rather than a -:exc:`TypeError` if :func:`__import__` is tried during the Python shutdown -process but :data:`sys.path` is already cleared (set to ``None``). - -.. - -.. bpo: 21925 -.. date: 9111 -.. nonce: xFz-hR -.. section: Library - -:func:`warnings.formatwarning` now catches exceptions when calling -:func:`linecache.getline` and :func:`tracemalloc.get_object_traceback` to be -able to log :exc:`ResourceWarning` emitted late during the Python shutdown -process. - -.. - -.. bpo: 23848 -.. date: 9110 -.. nonce: RkKqPi -.. section: Library - -On Windows, faulthandler.enable() now also installs an exception handler to -dump the traceback of all Python threads on any Windows exception, not only -on UNIX signals (SIGSEGV, SIGFPE, SIGABRT). - -.. - -.. bpo: 26530 -.. date: 9109 -.. nonce: RWN1jR -.. section: Library - -Add C functions :c:func:`_PyTraceMalloc_Track` and -:c:func:`_PyTraceMalloc_Untrack` to track memory blocks using the -:mod:`tracemalloc` module. Add :c:func:`_PyTraceMalloc_GetTraceback` to get -the traceback of an object. - -.. - -.. bpo: 26588 -.. date: 9108 -.. nonce: uen0XP -.. section: Library - -The _tracemalloc now supports tracing memory allocations of multiple address -spaces (domains). - -.. - -.. bpo: 24266 -.. date: 9107 -.. nonce: YZgVyM -.. section: Library - -Ctrl+C during Readline history search now cancels the search mode when -compiled with Readline 7. - -.. - -.. bpo: 26590 -.. date: 9106 -.. nonce: qEy91x -.. section: Library - -Implement a safe finalizer for the _socket.socket type. It now releases the -GIL to close the socket. - -.. - -.. bpo: 18787 -.. date: 9105 -.. nonce: rWyzgA -.. section: Library - -spwd.getspnam() now raises a PermissionError if the user doesn't have -privileges. - -.. - -.. bpo: 26560 -.. date: 9104 -.. nonce: A4WXNz -.. section: Library - -Avoid potential ValueError in BaseHandler.start_response. Initial patch by -Peter Inglesby. - -.. - -.. bpo: 26567 -.. date: 9103 -.. nonce: kcC99B -.. section: Library - -Add a new function :c:func:`PyErr_ResourceWarning` function to pass the -destroyed object. Add a *source* attribute to -:class:`warnings.WarningMessage`. Add warnings._showwarnmsg() which uses -tracemalloc to get the traceback where source object was allocated. - -.. - -.. bpo: 26313 -.. date: 9102 -.. nonce: LjZAjy -.. original section: Library -.. section: Security - -ssl.py _load_windows_store_certs fails if windows cert store is empty. Patch -by Baji. - -.. - -.. bpo: 26569 -.. date: 9101 -.. nonce: EX8vF1 -.. section: Library - -Fix :func:`pyclbr.readmodule` and :func:`pyclbr.readmodule_ex` to support -importing packages. - -.. - -.. bpo: 26499 -.. date: 9100 -.. nonce: NP08PI -.. section: Library - -Account for remaining Content-Length in HTTPResponse.readline() and read1(). -Based on patch by Silent Ghost. Also document that HTTPResponse now supports -these methods. - -.. - -.. bpo: 25320 -.. date: 9099 -.. nonce: V96LIy -.. section: Library - -Handle sockets in directories unittest discovery is scanning. Patch from -Victor van den Elzen. - -.. - -.. bpo: 16181 -.. date: 9098 -.. nonce: P7lLvo -.. section: Library - -cookiejar.http2time() now returns None if year is higher than -datetime.MAXYEAR. - -.. - -.. bpo: 26513 -.. date: 9097 -.. nonce: HoPepy -.. section: Library - -Fixes platform module detection of Windows Server - -.. - -.. bpo: 23718 -.. date: 9096 -.. nonce: AMPC0o -.. section: Library - -Fixed parsing time in week 0 before Jan 1. Original patch by Tamás Bence -Gedai. - -.. - -.. bpo: 26323 -.. date: 9095 -.. nonce: KkZqEj -.. section: Library - -Add Mock.assert_called() and Mock.assert_called_once() methods to -unittest.mock. Patch written by Amit Saha. - -.. - -.. bpo: 20589 -.. date: 9094 -.. nonce: NsQ_I1 -.. section: Library - -Invoking Path.owner() and Path.group() on Windows now raise -NotImplementedError instead of ImportError. - -.. - -.. bpo: 26177 -.. date: 9093 -.. nonce: HlSWer -.. section: Library - -Fixed the keys() method for Canvas and Scrollbar widgets. - -.. - -.. bpo: 15068 -.. date: 9092 -.. nonce: xokEVC -.. section: Library - -Got rid of excessive buffering in fileinput. The bufsize parameter is now -deprecated and ignored. - -.. - -.. bpo: 19475 -.. date: 9091 -.. nonce: MH2HH9 -.. section: Library - -Added an optional argument timespec to the datetime isoformat() method to -choose the precision of the time component. - -.. - -.. bpo: 2202 -.. date: 9090 -.. nonce: dk9sd0 -.. section: Library - -Fix UnboundLocalError in AbstractDigestAuthHandler.get_algorithm_impls. -Initial patch by Mathieu Dupuy. - -.. - -.. bpo: 26167 -.. date: 9089 -.. nonce: 3F-d12 -.. section: Library - -Minimized overhead in copy.copy() and copy.deepcopy(). Optimized copying and -deepcopying bytearrays, NotImplemented, slices, short lists, tuples, dicts, -sets. - -.. - -.. bpo: 25718 -.. date: 9088 -.. nonce: 4EjZyv -.. section: Library - -Fixed pickling and copying the accumulate() iterator with total is None. - -.. - -.. bpo: 26475 -.. date: 9087 -.. nonce: JXVccY -.. section: Library - -Fixed debugging output for regular expressions with the (?x) flag. - -.. - -.. bpo: 26482 -.. date: 9086 -.. nonce: d635gW -.. section: Library - -Allowed pickling recursive dequeues. - -.. - -.. bpo: 26335 -.. date: 9085 -.. nonce: iXw5Yb -.. section: Library - -Make mmap.write() return the number of bytes written like other write -methods. Patch by Jakub Stasiak. - -.. - -.. bpo: 26457 -.. date: 9084 -.. nonce: Xe6Clh -.. section: Library - -Fixed the subnets() methods in IP network classes for the case when -resulting prefix length is equal to maximal prefix length. Based on patch by -Xiang Zhang. - -.. - -.. bpo: 26385 -.. date: 9083 -.. nonce: 50bDXm -.. section: Library - -Remove the file if the internal open() call in NamedTemporaryFile() fails. -Patch by Silent Ghost. - -.. - -.. bpo: 26402 -.. date: 9082 -.. nonce: k7DVuU -.. section: Library - -Fix XML-RPC client to retry when the server shuts down a persistent -connection. This was a regression related to the new -http.client.RemoteDisconnected exception in 3.5.0a4. - -.. - -.. bpo: 25913 -.. date: 9081 -.. nonce: 5flb95 -.. section: Library - -Leading ``<~`` is optional now in base64.a85decode() with adobe=True. Patch -by Swati Jaiswal. - -.. - -.. bpo: 26186 -.. date: 9080 -.. nonce: R9rfiL -.. section: Library - -Remove an invalid type check in importlib.util.LazyLoader. - -.. - -.. bpo: 26367 -.. date: 9079 -.. nonce: Qct-9S -.. section: Library - -importlib.__import__() raises ImportError like builtins.__import__() when -``level`` is specified but without an accompanying package specified. - -.. - -.. bpo: 26309 -.. date: 9078 -.. nonce: ubEeiz -.. section: Library - -In the "socketserver" module, shut down the request (closing the connected -socket) when verify_request() returns false. Patch by Aviv Palivoda. - -.. - -.. bpo: 23430 -.. date: 9077 -.. nonce: s_mLiA -.. section: Library - -Change the socketserver module to only catch exceptions raised from a -request handler that are derived from Exception (instead of BaseException). -Therefore SystemExit and KeyboardInterrupt no longer trigger the -handle_error() method, and will now to stop a single-threaded server. - -.. - -.. bpo: 25939 -.. date: 9076 -.. nonce: X49Fqd -.. original section: Library -.. section: Security - -On Windows open the cert store readonly in ssl.enum_certificates. - -.. - -.. bpo: 25995 -.. date: 9075 -.. nonce: NfcimP -.. section: Library - -os.walk() no longer uses FDs proportional to the tree depth. - -.. - -.. bpo: 25994 -.. date: 9074 -.. nonce: ga9rT- -.. section: Library - -Added the close() method and the support of the context manager protocol for -the os.scandir() iterator. - -.. - -.. bpo: 23992 -.. date: 9073 -.. nonce: O0Hhvc -.. section: Library - -multiprocessing: make MapResult not fail-fast upon exception. - -.. - -.. bpo: 26243 -.. date: 9072 -.. nonce: 41WSpF -.. section: Library - -Support keyword arguments to zlib.compress(). Patch by Aviv Palivoda. - -.. - -.. bpo: 26117 -.. date: 9071 -.. nonce: ne6p11 -.. section: Library - -The os.scandir() iterator now closes file descriptor not only when the -iteration is finished, but when it was failed with error. - -.. - -.. bpo: 25949 -.. date: 9070 -.. nonce: -Lh9vz -.. section: Library - -__dict__ for an OrderedDict instance is now created only when needed. - -.. - -.. bpo: 25911 -.. date: 9069 -.. nonce: d4Zadh -.. section: Library - -Restored support of bytes paths in os.walk() on Windows. - -.. - -.. bpo: 26045 -.. date: 9068 -.. nonce: WmzUrX -.. section: Library - -Add UTF-8 suggestion to error message when posting a non-Latin-1 string with -http.client. - -.. - -.. bpo: 26039 -.. date: 9067 -.. nonce: a5Bxm4 -.. section: Library - -Added zipfile.ZipInfo.from_file() and zipinfo.ZipInfo.is_dir(). Patch by -Thomas Kluyver. - -.. - -.. bpo: 12923 -.. date: 9066 -.. nonce: HPAu-B -.. section: Library - -Reset FancyURLopener's redirect counter even if there is an exception. -Based on patches by Brian Brazil and Daniel Rocco. - -.. - -.. bpo: 25945 -.. date: 9065 -.. nonce: guNgNM -.. section: Library - -Fixed a crash when unpickle the functools.partial object with wrong state. -Fixed a leak in failed functools.partial constructor. "args" and "keywords" -attributes of functools.partial have now always types tuple and dict -correspondingly. - -.. - -.. bpo: 26202 -.. date: 9064 -.. nonce: LPIXLg -.. section: Library - -copy.deepcopy() now correctly copies range() objects with non-atomic -attributes. - -.. - -.. bpo: 23076 -.. date: 9063 -.. nonce: 8rphoP -.. section: Library - -Path.glob() now raises a ValueError if it's called with an invalid pattern. -Patch by Thomas Nyberg. - -.. - -.. bpo: 19883 -.. date: 9062 -.. nonce: z9TsO6 -.. section: Library - -Fixed possible integer overflows in zipimport. - -.. - -.. bpo: 26227 -.. date: 9061 -.. nonce: Fe6oiB -.. section: Library - -On Windows, getnameinfo(), gethostbyaddr() and gethostbyname_ex() functions -of the socket module now decode the hostname from the ANSI code page rather -than UTF-8. - -.. - -.. bpo: 26099 -.. date: 9060 -.. nonce: CH5jer -.. section: Library - -The site module now writes an error into stderr if sitecustomize module can -be imported but executing the module raise an ImportError. Same change for -usercustomize. - -.. - -.. bpo: 26147 -.. date: 9059 -.. nonce: i-Jc01 -.. section: Library - -xmlrpc now works with strings not encodable with used non-UTF-8 encoding. - -.. - -.. bpo: 25935 -.. date: 9058 -.. nonce: cyni91 -.. section: Library - -Garbage collector now breaks reference loops with OrderedDict. - -.. - -.. bpo: 16620 -.. date: 9057 -.. nonce: rxpn_Y -.. section: Library - -Fixed AttributeError in msilib.Directory.glob(). - -.. - -.. bpo: 26013 -.. date: 9056 -.. nonce: 93RKNz -.. section: Library - -Added compatibility with broken protocol 2 pickles created in old Python 3 -versions (3.4.3 and lower). - -.. - -.. bpo: 26129 -.. date: 9055 -.. nonce: g4RQZd -.. section: Library - -Deprecated accepting non-integers in grp.getgrgid(). - -.. - -.. bpo: 25850 -.. date: 9054 -.. nonce: jwFPxj -.. section: Library - -Use cross-compilation by default for 64-bit Windows. - -.. - -.. bpo: 25822 -.. date: 9053 -.. nonce: 0Eafyi -.. section: Library - -Add docstrings to the fields of urllib.parse results. Patch contributed by -Swati Jaiswal. - -.. - -.. bpo: 22642 -.. date: 9052 -.. nonce: PEgS9F -.. section: Library - -Convert trace module option parsing mechanism to argparse. Patch contributed -by SilentGhost. - -.. - -.. bpo: 24705 -.. date: 9051 -.. nonce: IZYwjR -.. section: Library - -Fix sysconfig._parse_makefile not expanding ${} vars appearing before $() -vars. - -.. - -.. bpo: 26069 -.. date: 9050 -.. nonce: NaF4lN -.. section: Library - -Remove the deprecated apis in the trace module. - -.. - -.. bpo: 22138 -.. date: 9049 -.. nonce: nRNYkc -.. section: Library - -Fix mock.patch behavior when patching descriptors. Restore original values -after patching. Patch contributed by Sean McCully. - -.. - -.. bpo: 25672 -.. date: 9048 -.. nonce: fw9RJP -.. section: Library - -In the ssl module, enable the SSL_MODE_RELEASE_BUFFERS mode option if it is -safe to do so. - -.. - -.. bpo: 26012 -.. date: 9047 -.. nonce: IFSXNm -.. section: Library - -Don't traverse into symlinks for ``**`` pattern in pathlib.Path.[r]glob(). - -.. - -.. bpo: 24120 -.. date: 9046 -.. nonce: Yiwa0h -.. section: Library - -Ignore PermissionError when traversing a tree with pathlib.Path.[r]glob(). -Patch by Ulrich Petri. - -.. - -.. bpo: 21815 -.. date: 9045 -.. nonce: h7-UY8 -.. section: Library - -Accept ] characters in the data portion of imap responses, in order to -handle the flags with square brackets accepted and produced by servers such -as gmail. - -.. - -.. bpo: 25447 -.. date: 9044 -.. nonce: -4m4xO -.. section: Library - -fileinput now uses sys.stdin as-is if it does not have a buffer attribute -(restores backward compatibility). - -.. - -.. bpo: 25971 -.. date: 9043 -.. nonce: vhMeG0 -.. section: Library - -Optimized creating Fractions from floats by 2 times and from Decimals by 3 -times. - -.. - -.. bpo: 25802 -.. date: 9042 -.. nonce: Y2KOnA -.. section: Library - -Document as deprecated the remaining implementations of -importlib.abc.Loader.load_module(). - -.. - -.. bpo: 25928 -.. date: 9041 -.. nonce: JsQfKK -.. section: Library - -Add Decimal.as_integer_ratio(). - -.. - -.. bpo: 25447 -.. date: 9040 -.. nonce: ajPRDy -.. section: Library - -Copying the lru_cache() wrapper object now always works, independently from -the type of the wrapped object (by returning the original object unchanged). - -.. - -.. bpo: 25768 -.. date: 9039 -.. nonce: GDj2ip -.. section: Library - -Have the functions in compileall return booleans instead of ints and add -proper documentation and tests for the return values. - -.. - -.. bpo: 24103 -.. date: 9038 -.. nonce: WufqrQ -.. section: Library - -Fixed possible use after free in ElementTree.XMLPullParser. - -.. - -.. bpo: 25860 -.. date: 9037 -.. nonce: 0hActb -.. section: Library - -os.fwalk() no longer skips remaining directories when error occurs. -Original patch by Samson Lee. - -.. - -.. bpo: 25914 -.. date: 9036 -.. nonce: h0V61F -.. section: Library - -Fixed and simplified OrderedDict.__sizeof__. - -.. - -.. bpo: 25869 -.. date: 9035 -.. nonce: eAnRH5 -.. section: Library - -Optimized deepcopying ElementTree; it is now 20 times faster. - -.. - -.. bpo: 25873 -.. date: 9034 -.. nonce: L4Fgjm -.. section: Library - -Optimized iterating ElementTree. Iterating elements Element.iter() is now -40% faster, iterating text Element.itertext() is now up to 2.5 times faster. - -.. - -.. bpo: 25902 -.. date: 9033 -.. nonce: 6t2FmH -.. section: Library - -Fixed various refcount issues in ElementTree iteration. - -.. - -.. bpo: 22227 -.. date: 9032 -.. nonce: 5utM-Q -.. section: Library - -The TarFile iterator is reimplemented using generator. This implementation -is simpler that using class. - -.. - -.. bpo: 25638 -.. date: 9031 -.. nonce: yitRj4 -.. section: Library - -Optimized ElementTree.iterparse(); it is now 2x faster. Optimized -ElementTree parsing; it is now 10% faster. - -.. - -.. bpo: 25761 -.. date: 9030 -.. nonce: JGgMOP -.. section: Library - -Improved detecting errors in broken pickle data. - -.. - -.. bpo: 25717 -.. date: 9029 -.. nonce: 0_xjaK -.. section: Library - -Restore the previous behaviour of tolerating most fstat() errors when -opening files. This was a regression in 3.5a1, and stopped anonymous -temporary files from working in special cases. - -.. - -.. bpo: 24903 -.. date: 9028 -.. nonce: 3LBdzb -.. section: Library - -Fix regression in number of arguments compileall accepts when '-d' is -specified. The check on the number of arguments has been dropped completely -as it never worked correctly anyway. - -.. - -.. bpo: 25764 -.. date: 9027 -.. nonce: 7WWG07 -.. section: Library - -In the subprocess module, preserve any exception caused by fork() failure -when preexec_fn is used. - -.. - -.. bpo: 25771 -.. date: 9026 -.. nonce: It-7Qf -.. section: Library - -Tweak the exception message for importlib.util.resolve_name() when 'package' -isn't specified but necessary. - -.. - -.. bpo: 6478 -.. date: 9025 -.. nonce: -Bi9Hb -.. section: Library - -_strptime's regexp cache now is reset after changing timezone with -time.tzset(). - -.. - -.. bpo: 14285 -.. date: 9024 -.. nonce: UyG8Hj -.. section: Library - -When executing a package with the "python -m package" option, and package -initialization fails, a proper traceback is now reported. The "runpy" -module now lets exceptions from package initialization pass back to the -caller, rather than raising ImportError. - -.. - -.. bpo: 19771 -.. date: 9023 -.. nonce: 5NG-bg -.. section: Library - -Also in runpy and the "-m" option, omit the irrelevant message ". . . is a -package and cannot be directly executed" if the package could not even be -initialized (e.g. due to a bad ``*.pyc`` file). - -.. - -.. bpo: 25177 -.. date: 9022 -.. nonce: aNR4Ha -.. section: Library - -Fixed problem with the mean of very small and very large numbers. As a side -effect, statistics.mean and statistics.variance should be significantly -faster. - -.. - -.. bpo: 25718 -.. date: 9021 -.. nonce: D9mHZF -.. section: Library - -Fixed copying object with state with boolean value is false. - -.. - -.. bpo: 10131 -.. date: 9020 -.. nonce: a7tptz -.. section: Library - -Fixed deep copying of minidom documents. Based on patch by Marian Ganisin. - -.. - -.. bpo: 7990 -.. date: 9019 -.. nonce: fpvQxH -.. section: Library - -dir() on ElementTree.Element now lists properties: "tag", "text", "tail" and -"attrib". Original patch by Santoso Wijaya. - -.. - -.. bpo: 25725 -.. date: 9018 -.. nonce: XIKv3R -.. section: Library - -Fixed a reference leak in pickle.loads() when unpickling invalid data -including tuple instructions. - -.. - -.. bpo: 25663 -.. date: 9017 -.. nonce: Ofwfqa -.. section: Library - -In the Readline completer, avoid listing duplicate global names, and search -the global namespace before searching builtins. - -.. - -.. bpo: 25688 -.. date: 9016 -.. nonce: 8P1HOv -.. section: Library - -Fixed file leak in ElementTree.iterparse() raising an error. - -.. - -.. bpo: 23914 -.. date: 9015 -.. nonce: 1sEz4J -.. section: Library - -Fixed SystemError raised by unpickler on broken pickle data. - -.. - -.. bpo: 25691 -.. date: 9014 -.. nonce: ZEaapY -.. section: Library - -Fixed crash on deleting ElementTree.Element attributes. - -.. - -.. bpo: 25624 -.. date: 9013 -.. nonce: ed-fM0 -.. section: Library - -ZipFile now always writes a ZIP_STORED header for directory entries. Patch -by Dingyuan Wang. - -.. - -.. bpo: 25626 -.. date: 9012 -.. nonce: TQ3fvb -.. section: Library - -Change three zlib functions to accept sizes that fit in Py_ssize_t, but -internally cap those sizes to UINT_MAX. This resolves a regression in 3.5 -where GzipFile.read() failed to read chunks larger than 2 or 4 GiB. The -change affects the zlib.Decompress.decompress() max_length parameter, the -zlib.decompress() bufsize parameter, and the zlib.Decompress.flush() length -parameter. - -.. - -.. bpo: 25583 -.. date: 9011 -.. nonce: Gk-cim -.. section: Library - -Avoid incorrect errors raised by os.makedirs(exist_ok=True) when the OS -gives priority to errors such as EACCES over EEXIST. - -.. - -.. bpo: 25593 -.. date: 9010 -.. nonce: 56uegI -.. section: Library - -Change semantics of EventLoop.stop() in asyncio. - -.. - -.. bpo: 6973 -.. date: 9009 -.. nonce: nl5cHt -.. section: Library - -When we know a subprocess.Popen process has died, do not allow the -send_signal(), terminate(), or kill() methods to do anything as they could -potentially signal a different process. - -.. - -.. bpo: 23883 -.. date: 9008 -.. nonce: OQS5sS -.. section: Library - -Added missing APIs to __all__ to match the documented APIs for the following -modules: calendar, csv, enum, fileinput, ftplib, logging, optparse, tarfile, -threading and wave. Also added a test.support.check__all__() helper. -Patches by Jacek Kołodziej, Mauro S. M. Rodrigues and Joel Taddei. - -.. - -.. bpo: 25590 -.. date: 9007 -.. nonce: KPcnfv -.. section: Library - -In the Readline completer, only call getattr() once per attribute. Also -complete names of attributes such as properties and slots which are listed -by dir() but not yet created on an instance. - -.. - -.. bpo: 25498 -.. date: 9006 -.. nonce: AvqEBl -.. section: Library - -Fix a crash when garbage-collecting ctypes objects created by wrapping a -memoryview. This was a regression made in 3.5a1. Based on patch by -Eryksun. - -.. - -.. bpo: 25584 -.. date: 9005 -.. nonce: 124mYw -.. section: Library - -Added "escape" to the __all__ list in the glob module. - -.. - -.. bpo: 25584 -.. date: 9004 -.. nonce: ZeWX0J -.. section: Library - -Fixed recursive glob() with patterns starting with ``**``. - -.. - -.. bpo: 25446 -.. date: 9003 -.. nonce: k1DByx -.. section: Library - -Fix regression in smtplib's AUTH LOGIN support. - -.. - -.. bpo: 18010 -.. date: 9002 -.. nonce: Azyf1C -.. section: Library - -Fix the pydoc web server's module search function to handle exceptions from -importing packages. - -.. - -.. bpo: 25554 -.. date: 9001 -.. nonce: UM9MlR -.. section: Library - -Got rid of circular references in regular expression parsing. - -.. - -.. bpo: 18973 -.. date: 9000 -.. nonce: Am9jFL -.. section: Library - -Command-line interface of the calendar module now uses argparse instead of -optparse. - -.. - -.. bpo: 25510 -.. date: 8999 -.. nonce: 79g7LA -.. section: Library - -fileinput.FileInput.readline() now returns b'' instead of '' at the end if -the FileInput was opened with binary mode. Patch by Ryosuke Ito. - -.. - -.. bpo: 25503 -.. date: 8998 -.. nonce: Zea0Y7 -.. section: Library - -Fixed inspect.getdoc() for inherited docstrings of properties. Original -patch by John Mark Vandenberg. - -.. - -.. bpo: 25515 -.. date: 8997 -.. nonce: fQsyYG -.. section: Library - -Always use os.urandom as a source of randomness in uuid.uuid4. - -.. - -.. bpo: 21827 -.. date: 8996 -.. nonce: k2oreR -.. section: Library - -Fixed textwrap.dedent() for the case when largest common whitespace is a -substring of smallest leading whitespace. Based on patch by Robert Li. - -.. - -.. bpo: 25447 -.. date: 8995 -.. nonce: eDYc4t -.. section: Library - -The lru_cache() wrapper objects now can be copied and pickled (by returning -the original object unchanged). - -.. - -.. bpo: 25390 -.. date: 8994 -.. nonce: 6mSgRq -.. section: Library - -typing: Don't crash on Union[str, Pattern]. - -.. - -.. bpo: 25441 -.. date: 8993 -.. nonce: d7zph6 -.. section: Library - -asyncio: Raise error from drain() when socket is closed. - -.. - -.. bpo: 25410 -.. date: 8992 -.. nonce: QAs_3B -.. section: Library - -Cleaned up and fixed minor bugs in C implementation of OrderedDict. - -.. - -.. bpo: 25411 -.. date: 8991 -.. nonce: qsJTCb -.. section: Library - -Improved Unicode support in SMTPHandler through better use of the email -package. Thanks to user simon04 for the patch. - -.. - -.. bpo: 0 -.. date: 8990 -.. nonce: pFHJ0i -.. section: Library - -Move the imp module from a PendingDeprecationWarning to DeprecationWarning. - -.. - -.. bpo: 25407 -.. date: 8989 -.. nonce: ukNt1D -.. section: Library - -Remove mentions of the formatter module being removed in Python 3.6. - -.. - -.. bpo: 25406 -.. date: 8988 -.. nonce: 5MZKU_ -.. section: Library - -Fixed a bug in C implementation of OrderedDict.move_to_end() that caused -segmentation fault or hang in iterating after moving several items to the -start of ordered dict. - -.. - -.. bpo: 25382 -.. date: 8987 -.. nonce: XQ44yE -.. section: Library - -pickletools.dis() now outputs implicit memo index for the MEMOIZE opcode. - -.. - -.. bpo: 25357 -.. date: 8986 -.. nonce: ebqGy- -.. section: Library - -Add an optional newline parameter to binascii.b2a_base64(). base64.b64encode() -uses it to avoid a memory copy. - -.. - -.. bpo: 24164 -.. date: 8985 -.. nonce: oi6H3E -.. section: Library - -Objects that need calling ``__new__`` with keyword arguments, can now be -pickled using pickle protocols older than protocol version 4. - -.. - -.. bpo: 25364 -.. date: 8984 -.. nonce: u_1Wi6 -.. section: Library - -zipfile now works in threads disabled builds. - -.. - -.. bpo: 25328 -.. date: 8983 -.. nonce: Rja1Xg -.. section: Library - -smtpd's SMTPChannel now correctly raises a ValueError if both decode_data -and enable_SMTPUTF8 are set to true. - -.. - -.. bpo: 16099 -.. date: 8982 -.. nonce: _MTt3k -.. section: Library - -RobotFileParser now supports Crawl-delay and Request-rate extensions. Patch -by Nikolay Bogoychev. - -.. - -.. bpo: 25316 -.. date: 8981 -.. nonce: dHQHWI -.. section: Library - -distutils raises OSError instead of DistutilsPlatformError when MSVC is not -installed. - -.. - -.. bpo: 25380 -.. date: 8980 -.. nonce: sKZ6-I -.. section: Library - -Fixed protocol for the STACK_GLOBAL opcode in pickletools.opcodes. - -.. - -.. bpo: 23972 -.. date: 8979 -.. nonce: s2g30g -.. section: Library - -Updates asyncio datagram create method allowing reuseport and reuseaddr -socket options to be set prior to binding the socket. Mirroring the existing -asyncio create_server method the reuseaddr option for datagram sockets -defaults to True if the O/S is 'posix' (except if the platform is Cygwin). -Patch by Chris Laws. - -.. - -.. bpo: 25304 -.. date: 8978 -.. nonce: CsmLyI -.. section: Library - -Add asyncio.run_coroutine_threadsafe(). This lets you submit a coroutine to -a loop from another thread, returning a concurrent.futures.Future. By -Vincent Michel. - -.. - -.. bpo: 25232 -.. date: 8977 -.. nonce: KhKjCE -.. section: Library - -Fix CGIRequestHandler to split the query from the URL at the first question -mark (?) rather than the last. Patch from Xiang Zhang. - -.. - -.. bpo: 24657 -.. date: 8976 -.. nonce: h2Ag7y -.. section: Library - -Prevent CGIRequestHandler from collapsing slashes in the query part of the -URL as if it were a path. Patch from Xiang Zhang. - -.. - -.. bpo: 25287 -.. date: 8975 -.. nonce: KhzzMW -.. section: Library - -Don't add crypt.METHOD_CRYPT to crypt.methods if it's not supported. Check -if it is supported, it may not be supported on OpenBSD for example. - -.. - -.. bpo: 23600 -.. date: 8974 -.. nonce: 7J_RD5 -.. section: Library - -Default implementation of tzinfo.fromutc() was returning wrong results in -some cases. - -.. - -.. bpo: 25203 -.. date: 8973 -.. nonce: IgDEbt -.. section: Library - -Failed readline.set_completer_delims() no longer left the module in -inconsistent state. - -.. - -.. bpo: 25011 -.. date: 8972 -.. nonce: VcaCd6 -.. section: Library - -rlcompleter now omits private and special attribute names unless the prefix -starts with underscores. - -.. - -.. bpo: 25209 -.. date: 8971 -.. nonce: WxKcdJ -.. section: Library - -rlcompleter now can add a space or a colon after completed keyword. - -.. - -.. bpo: 22241 -.. date: 8970 -.. nonce: a-Mtw2 -.. section: Library - -timezone.utc name is now plain 'UTC', not 'UTC-00:00'. - -.. - -.. bpo: 23517 -.. date: 8969 -.. nonce: 0ABp8q -.. section: Library - -fromtimestamp() and utcfromtimestamp() methods of datetime.datetime now -round microseconds to nearest with ties going to nearest even integer -(ROUND_HALF_EVEN), as round(float), instead of rounding towards -Infinity -(ROUND_FLOOR). - -.. - -.. bpo: 23552 -.. date: 8968 -.. nonce: I0T-M- -.. section: Library - -Timeit now warns when there is substantial (4x) variance between best and -worst times. Patch from Serhiy Storchaka. - -.. - -.. bpo: 24633 -.. date: 8967 -.. nonce: 6Unn9B -.. section: Library - -site-packages/README -> README.txt. - -.. - -.. bpo: 24879 -.. date: 8966 -.. nonce: YUzg_z -.. section: Library - -help() and pydoc can now list named tuple fields in the order they were -defined rather than alphabetically. The ordering is determined by the -_fields attribute if present. - -.. - -.. bpo: 24874 -.. date: 8965 -.. nonce: luBfgA -.. section: Library - -Improve speed of itertools.cycle() and make its pickle more compact. - -.. - -.. bpo: 0 -.. date: 8964 -.. nonce: mD-_3v -.. section: Library - -Fix crash in itertools.cycle.__setstate__() when the first argument wasn't a -list. - -.. - -.. bpo: 20059 -.. date: 8963 -.. nonce: SHv0Ji -.. section: Library - -urllib.parse raises ValueError on all invalid ports. Patch by Martin Panter. - -.. - -.. bpo: 24360 -.. date: 8962 -.. nonce: 5RwH-e -.. section: Library - -Improve __repr__ of argparse.Namespace() for invalid identifiers. Patch by -Matthias Bussonnier. - -.. - -.. bpo: 23426 -.. date: 8961 -.. nonce: PUV-Cx -.. section: Library - -run_setup was broken in distutils. Patch from Alexander Belopolsky. - -.. - -.. bpo: 13938 -.. date: 8960 -.. nonce: e5NSE1 -.. section: Library - -2to3 converts StringTypes to a tuple. Patch from Mark Hammond. - -.. - -.. bpo: 2091 -.. date: 8959 -.. nonce: bp56pO -.. section: Library - -open() accepted a 'U' mode string containing '+', but 'U' can only be used -with 'r'. Patch from Jeff Balogh and John O'Connor. - -.. - -.. bpo: 8585 -.. date: 8958 -.. nonce: 78hPc2 -.. section: Library - -improved tests for zipimporter2. Patch from Mark Lawrence. - -.. - -.. bpo: 18622 -.. date: 8957 -.. nonce: i6nCCW -.. section: Library - -unittest.mock.mock_open().reset_mock would recurse infinitely. Patch from -Nicola Palumbo and Laurent De Buyst. - -.. - -.. bpo: 24426 -.. date: 8956 -.. nonce: yCtQfT -.. section: Library - -Fast searching optimization in regular expressions now works for patterns -that starts with capturing groups. Fast searching optimization now can't be -disabled at compile time. - -.. - -.. bpo: 23661 -.. date: 8955 -.. nonce: 5VHJmh -.. section: Library - -unittest.mock side_effects can now be exceptions again. This was a -regression vs Python 3.4. Patch from Ignacio Rossi - -.. - -.. bpo: 13248 -.. date: 8954 -.. nonce: SA2hvu -.. section: Library - -Remove deprecated inspect.getmoduleinfo function. - -.. - -.. bpo: 25578 -.. date: 8953 -.. nonce: G6S-ft -.. section: Library - -Fix (another) memory leak in SSLSocket.getpeercer(). - -.. - -.. bpo: 25530 -.. date: 8952 -.. nonce: hDFkwu -.. section: Library - -Disable the vulnerable SSLv3 protocol by default when creating -ssl.SSLContext. - -.. - -.. bpo: 25569 -.. date: 8951 -.. nonce: CfvQjK -.. section: Library - -Fix memory leak in SSLSocket.getpeercert(). - -.. - -.. bpo: 25471 -.. date: 8950 -.. nonce: T0A02M -.. section: Library - -Sockets returned from accept() shouldn't appear to be nonblocking. - -.. - -.. bpo: 25319 -.. date: 8949 -.. nonce: iyuglv -.. section: Library - -When threading.Event is reinitialized, the underlying condition should use a -regular lock rather than a recursive lock. - -.. - -.. bpo: 0 -.. date: 8948 -.. nonce: rtZyid -.. section: Library - -Skip getaddrinfo if host is already resolved. Patch by A. Jesse Jiryu Davis. - -.. - -.. bpo: 26050 -.. date: 8947 -.. nonce: sclyvk -.. section: Library - -Add asyncio.StreamReader.readuntil() method. Patch by Марк Коренберг. - -.. - -.. bpo: 25924 -.. date: 8946 -.. nonce: Uxr2vt -.. section: Library - -Avoid unnecessary serialization of getaddrinfo(3) calls on OS X versions -10.5 or higher. Original patch by A. Jesse Jiryu Davis. - -.. - -.. bpo: 26406 -.. date: 8945 -.. nonce: ihvhF4 -.. section: Library - -Avoid unnecessary serialization of getaddrinfo(3) calls on current versions -of OpenBSD and NetBSD. Patch by A. Jesse Jiryu Davis. - -.. - -.. bpo: 26848 -.. date: 8944 -.. nonce: ChBOpQ -.. section: Library - -Fix asyncio/subprocess.communicate() to handle empty input. Patch by Jack -O'Connor. - -.. - -.. bpo: 27040 -.. date: 8943 -.. nonce: UASyCC -.. section: Library - -Add loop.get_exception_handler method - -.. - -.. bpo: 27041 -.. date: 8942 -.. nonce: p3893U -.. section: Library - -asyncio: Add loop.create_future method - -.. - -.. bpo: 20640 -.. date: 8941 -.. nonce: PmI-G8 -.. section: IDLE - -Add tests for idlelib.configHelpSourceEdit. Patch by Saimadhav Heblikar. - -.. - -.. bpo: 0 -.. date: 8940 -.. nonce: _YJfG7 -.. section: IDLE - -In the 'IDLE-console differences' section of the IDLE doc, clarify how -running with IDLE affects sys.modules and the standard streams. - -.. - -.. bpo: 25507 -.. date: 8939 -.. nonce: i8bNpk -.. section: IDLE - -fix incorrect change in IOBinding that prevented printing. Augment IOBinding -htest to include all major IOBinding functions. - -.. - -.. bpo: 25905 -.. date: 8938 -.. nonce: FzNb3B -.. section: IDLE - -Revert unwanted conversion of ' to ’ RIGHT SINGLE QUOTATION MARK in -README.txt and open this and NEWS.txt with 'ascii'. Re-encode CREDITS.txt to -utf-8 and open it with 'utf-8'. - -.. - -.. bpo: 15348 -.. date: 8937 -.. nonce: d1Fg01 -.. section: IDLE - -Stop the debugger engine (normally in a user process) before closing the -debugger window (running in the IDLE process). This prevents the -RuntimeErrors that were being caught and ignored. - -.. - -.. bpo: 24455 -.. date: 8936 -.. nonce: x6YqtE -.. section: IDLE - -Prevent IDLE from hanging when a) closing the shell while the debugger is -active (15347); b) closing the debugger with the [X] button (15348); and c) -activating the debugger when already active (24455). The patch by Mark -Roseman does this by making two changes. 1. Suspend and resume the -gui.interaction method with the tcl vwait mechanism intended for this -purpose (instead of root.mainloop & .quit). 2. In gui.run, allow any -existing interaction to terminate first. - -.. - -.. bpo: 0 -.. date: 8935 -.. nonce: Yp9LRY -.. section: IDLE - -Change 'The program' to 'Your program' in an IDLE 'kill program?' message to -make it clearer that the program referred to is the currently running user -program, not IDLE itself. - -.. - -.. bpo: 24750 -.. date: 8934 -.. nonce: xgsi-K -.. section: IDLE - -Improve the appearance of the IDLE editor window status bar. Patch by Mark -Roseman. - -.. - -.. bpo: 25313 -.. date: 8933 -.. nonce: xMXHpO -.. section: IDLE - -Change the handling of new built-in text color themes to better address the -compatibility problem introduced by the addition of IDLE Dark. Consistently -use the revised idleConf.CurrentTheme everywhere in idlelib. - -.. - -.. bpo: 24782 -.. date: 8932 -.. nonce: RgIPYE -.. section: IDLE - -Extension configuration is now a tab in the IDLE Preferences dialog rather -than a separate dialog. The former tabs are now a sorted list. Patch by -Mark Roseman. - -.. - -.. bpo: 22726 -.. date: 8931 -.. nonce: x8T0dA -.. section: IDLE - -Re-activate the config dialog help button with some content about the other -buttons and the new IDLE Dark theme. - -.. - -.. bpo: 24820 -.. date: 8930 -.. nonce: TFPJhr -.. section: IDLE - -IDLE now has an 'IDLE Dark' built-in text color theme. It is more or less -IDLE Classic inverted, with a cobalt blue background. Strings, comments, -keywords, ... are still green, red, orange, ... . To use it with IDLEs -released before November 2015, hit the 'Save as New Custom Theme' button and -enter a new name, such as 'Custom Dark'. The custom theme will work with -any IDLE release, and can be modified. - -.. - -.. bpo: 25224 -.. date: 8929 -.. nonce: 5Llwo4 -.. section: IDLE - -README.txt is now an idlelib index for IDLE developers and curious users. -The previous user content is now in the IDLE doc chapter. 'IDLE' now means -'Integrated Development and Learning Environment'. - -.. - -.. bpo: 24820 -.. date: 8928 -.. nonce: ZUz9Fn -.. section: IDLE - -Users can now set breakpoint colors in Settings -> Custom Highlighting. -Original patch by Mark Roseman. - -.. - -.. bpo: 24972 -.. date: 8927 -.. nonce: uc0uNo -.. section: IDLE - -Inactive selection background now matches active selection background, as -configured by users, on all systems. Found items are now always highlighted -on Windows. Initial patch by Mark Roseman. - -.. - -.. bpo: 24570 -.. date: 8926 -.. nonce: s3EkNn -.. section: IDLE - -Idle: make calltip and completion boxes appear on Macs affected by a tk -regression. Initial patch by Mark Roseman. - -.. - -.. bpo: 24988 -.. date: 8925 -.. nonce: tXqq4T -.. section: IDLE - -Idle ScrolledList context menus (used in debugger) now work on Mac Aqua. -Patch by Mark Roseman. - -.. - -.. bpo: 24801 -.. date: 8924 -.. nonce: -bj_Ou -.. section: IDLE - -Make right-click for context menu work on Mac Aqua. Patch by Mark Roseman. - -.. - -.. bpo: 25173 -.. date: 8923 -.. nonce: EZzrPg -.. section: IDLE - -Associate tkinter messageboxes with a specific widget. For Mac OSX, make -them a 'sheet'. Patch by Mark Roseman. - -.. - -.. bpo: 25198 -.. date: 8922 -.. nonce: -j_BV7 -.. section: IDLE - -Enhance the initial html viewer now used for Idle Help. Properly indent -fixed-pitch text (patch by Mark Roseman). Give code snippet a very -Sphinx-like light blueish-gray background. Re-use initial width and height set by -users for shell and editor. When the Table of Contents (TOC) menu is used, -put the section header at the top of the screen. - -.. - -.. bpo: 25225 -.. date: 8921 -.. nonce: 9pvdq6 -.. section: IDLE - -Condense and rewrite Idle doc section on text colors. - -.. - -.. bpo: 21995 -.. date: 8920 -.. nonce: C5Rmzx -.. section: IDLE - -Explain some differences between IDLE and console Python. - -.. - -.. bpo: 22820 -.. date: 8919 -.. nonce: hix_8X -.. section: IDLE - -Explain need for *print* when running file from Idle editor. - -.. - -.. bpo: 25224 -.. date: 8918 -.. nonce: UVMYQq -.. section: IDLE - -Doc: augment Idle feature list and no-subprocess section. - -.. - -.. bpo: 25219 -.. date: 8917 -.. nonce: 8_9DYg -.. section: IDLE - -Update doc for Idle command line options. Some were missing and notes were -not correct. - -.. - -.. bpo: 24861 -.. date: 8916 -.. nonce: Ecg2yT -.. section: IDLE - -Most of idlelib is private and subject to change. Use idleib.idle.* to start -Idle. See idlelib.__init__.__doc__. - -.. - -.. bpo: 25199 -.. date: 8915 -.. nonce: ih7yY3 -.. section: IDLE - -Idle: add synchronization comments for future maintainers. - -.. - -.. bpo: 16893 -.. date: 8914 -.. nonce: uIi1oB -.. section: IDLE - -Replace help.txt with help.html for Idle doc display. The new -idlelib/help.html is rstripped Doc/build/html/library/idle.html. It looks -better than help.txt and will better document Idle as released. The tkinter -html viewer that works for this file was written by Rose Roseman. The now -unused EditorWindow.HelpDialog class and helt.txt file are deprecated. - -.. - -.. bpo: 24199 -.. date: 8913 -.. nonce: VKnZEv -.. section: IDLE - -Deprecate unused idlelib.idlever with possible removal in 3.6. - -.. - -.. bpo: 24790 -.. date: 8912 -.. nonce: hD1hlj -.. section: IDLE - -Remove extraneous code (which also create 2 & 3 conflicts). - -.. - -.. bpo: 26736 -.. date: 8911 -.. nonce: U_Hyqo -.. section: Documentation - -Used HTTPS for external links in the documentation if possible. - -.. - -.. bpo: 6953 -.. date: 8910 -.. nonce: Zk6rno -.. section: Documentation - -Rework the Readline module documentation to group related functions -together, and add more details such as what underlying Readline functions -and variables are accessed. - -.. - -.. bpo: 23606 -.. date: 8909 -.. nonce: 9MhIso -.. section: Documentation - -Adds note to ctypes documentation regarding cdll.msvcrt. - -.. - -.. bpo: 24952 -.. date: 8908 -.. nonce: RHhFPE -.. section: Documentation - -Clarify the default size argument of stack_size() in the "threading" and -"_thread" modules. Patch from Mattip. - -.. - -.. bpo: 26014 -.. date: 8907 -.. nonce: ptdZ_I -.. section: Documentation - -Update 3.x packaging documentation: * "See also" links to the new docs are -now provided in the legacy pages * links to setuptools documentation have -been updated - -.. - -.. bpo: 21916 -.. date: 8906 -.. nonce: muwCyp -.. section: Tests - -Added tests for the turtle module. Patch by ingrid, Gregory Loyse and Jelle -Zijlstra. - -.. - -.. bpo: 26295 -.. date: 8905 -.. nonce: sYBtj5 -.. section: Tests - -When using "python3 -m test --testdir=TESTDIR", regrtest doesn't add "test." -prefix to test module names. - -.. - -.. bpo: 26523 -.. date: 8904 -.. nonce: em_Uzt -.. section: Tests - -The multiprocessing thread pool (multiprocessing.dummy.Pool) was untested. - -.. - -.. bpo: 26015 -.. date: 8903 -.. nonce: p3oWK3 -.. section: Tests - -Added new tests for pickling iterators of mutable sequences. - -.. - -.. bpo: 26325 -.. date: 8902 -.. nonce: KOUc82 -.. section: Tests - -Added test.support.check_no_resource_warning() to check that no -ResourceWarning is emitted. - -.. - -.. bpo: 25940 -.. date: 8901 -.. nonce: MvBwSe -.. section: Tests - -Changed test_ssl to use its internal local server more. This avoids relying -on svn.python.org, which recently changed root certificate. - -.. - -.. bpo: 25616 -.. date: 8900 -.. nonce: Qr-60p -.. section: Tests - -Tests for OrderedDict are extracted from test_collections into separate file -test_ordered_dict. - -.. - -.. bpo: 25449 -.. date: 8899 -.. nonce: MP6KNs -.. section: Tests - -Added tests for OrderedDict subclasses. - -.. - -.. bpo: 25188 -.. date: 8898 -.. nonce: lnLnIW -.. section: Tests - -Add -P/--pgo to test.regrtest to suppress error output when running the test -suite for the purposes of a PGO build. Initial patch by Alecsandru Patrascu. - -.. - -.. bpo: 22806 -.. date: 8897 -.. nonce: _QHyyV -.. section: Tests - -Add ``python -m test --list-tests`` command to list tests. - -.. - -.. bpo: 18174 -.. date: 8896 -.. nonce: TzH9d_ -.. section: Tests - -``python -m test --huntrleaks ...`` now also checks for leak of file -descriptors. Patch written by Richard Oudkerk. - -.. - -.. bpo: 25260 -.. date: 8895 -.. nonce: jw3p83 -.. section: Tests - -Fix ``python -m test --coverage`` on Windows. Remove the list of ignored -directories. - -.. - -.. bpo: 0 -.. date: 8894 -.. nonce: X-Bk5l -.. section: Tests - -``PCbuild\rt.bat`` now accepts an unlimited number of arguments to pass -along to regrtest.py. Previously there was a limit of 9. - -.. - -.. bpo: 26583 -.. date: 8893 -.. nonce: Up7hTl -.. section: Tests - -Skip test_timestamp_overflow in test_import if bytecode files cannot be -written. - -.. - -.. bpo: 21277 -.. date: 8892 -.. nonce: 7y1j9a -.. section: Build - -Don't try to link _ctypes with a ffi_convenience library. - -.. - -.. bpo: 26884 -.. date: 8891 -.. nonce: O8-azL -.. section: Build - -Fix linking extension modules for cross builds. Patch by Xavier de Gaye. - -.. - -.. bpo: 26932 -.. date: 8890 -.. nonce: 5kzaG9 -.. section: Build - -Fixed support of RTLD_* constants defined as enum values, not via macros (in -particular on Android). Patch by Chi Hsuan Yen. - -.. - -.. bpo: 22359 -.. date: 8889 -.. nonce: HDjM4s -.. section: Build - -Disable the rules for running _freeze_importlib and pgen when -cross-compiling. The output of these programs is normally saved with the source -code anyway, and is still regenerated when doing a native build. Patch by -Xavier de Gaye. - -.. - -.. bpo: 21668 -.. date: 8888 -.. nonce: qWwBui -.. section: Build - -Link audioop, _datetime, _ctypes_test modules to libm, except on Mac OS X. -Patch written by Chi Hsuan Yen. - -.. - -.. bpo: 25702 -.. date: 8887 -.. nonce: ipxyJs -.. section: Build - -A --with-lto configure option has been added that will enable link time -optimizations at build time during a make profile-opt. Some compilers and -toolchains are known to not produce stable code when using LTO, be sure to -test things thoroughly before relying on it. It can provide a few % speed up -over profile-opt alone. - -.. - -.. bpo: 26624 -.. date: 8886 -.. nonce: 4fGrTl -.. section: Build - -Adds validation of ucrtbase[d].dll version with warning for old versions. - -.. - -.. bpo: 17603 -.. date: 8885 -.. nonce: 102DA- -.. section: Build - -Avoid error about nonexistent fileblocks.o file by using a lower-level check -for st_blocks in struct stat. - -.. - -.. bpo: 26079 -.. date: 8884 -.. nonce: mEzW0O -.. section: Build - -Fixing the build output folder for tix-8.4.3.6. Patch by Bjoern Thiel. - -.. - -.. bpo: 26465 -.. date: 8883 -.. nonce: _YR608 -.. section: Build - -Update Windows builds to use OpenSSL 1.0.2g. - -.. - -.. bpo: 25348 -.. date: 8882 -.. nonce: FLSPfp -.. section: Build - -Added ``--pgo`` and ``--pgo-job`` arguments to ``PCbuild\build.bat`` for -building with Profile-Guided Optimization. The old -``PCbuild\build_pgo.bat`` script is removed. - -.. - -.. bpo: 25827 -.. date: 8881 -.. nonce: yg3DMM -.. section: Build - -Add support for building with ICC to ``configure``, including a new -``--with-icc`` flag. - -.. - -.. bpo: 25696 -.. date: 8880 -.. nonce: 2R_wIv -.. section: Build - -Fix installation of Python on UNIX with make -j9. - -.. - -.. bpo: 24986 -.. date: 8879 -.. nonce: 1WyXeU -.. section: Build - -It is now possible to build Python on Windows without errors when external -libraries are not available. - -.. - -.. bpo: 24421 -.. date: 8878 -.. nonce: 2zY7vM -.. section: Build - -Compile Modules/_math.c once, before building extensions. Previously it -could fail to compile properly if the math and cmath builds were concurrent. - -.. - -.. bpo: 26465 -.. date: 8877 -.. nonce: PkIaV8 -.. section: Build - -Update OS X 10.5+ 32-bit-only installer to build and link with OpenSSL -1.0.2g. - -.. - -.. bpo: 26268 -.. date: 8876 -.. nonce: I3-YLh -.. section: Build - -Update Windows builds to use OpenSSL 1.0.2f. - -.. - -.. bpo: 25136 -.. date: 8875 -.. nonce: Vi-fmO -.. section: Build - -Support Apple Xcode 7's new textual SDK stub libraries. - -.. - -.. bpo: 24324 -.. date: 8874 -.. nonce: m6DZMx -.. section: Build - -Do not enable unreachable code warnings when using gcc as the option does -not work correctly in older versions of gcc and has been silently removed as -of gcc-4.5. - -.. - -.. bpo: 27053 -.. date: 8873 -.. nonce: 1IRbae -.. section: Windows - -Updates make_zip.py to correctly generate library ZIP file. - -.. - -.. bpo: 26268 -.. date: 8872 -.. nonce: Z-lJEh -.. section: Windows - -Update the prepare_ssl.py script to handle OpenSSL releases that don't -include the contents of the include directory (that is, 1.0.2e and later). - -.. - -.. bpo: 26071 -.. date: 8871 -.. nonce: wLxL2l -.. section: Windows - -bdist_wininst created binaries fail to start and find 32bit Python - -.. - -.. bpo: 26073 -.. date: 8870 -.. nonce: XwWgHp -.. section: Windows - -Update the list of magic numbers in launcher - -.. - -.. bpo: 26065 -.. date: 8869 -.. nonce: SkVLJp -.. section: Windows - -Excludes venv from library when generating embeddable distro. - -.. - -.. bpo: 25022 -.. date: 8868 -.. nonce: vAt_zr -.. section: Windows - -Removed very outdated PC/example_nt/ directory. - -.. - -.. bpo: 26799 -.. date: 8867 -.. nonce: gK2VXX -.. section: Tools/Demos - -Fix python-gdb.py: don't get C types once when the Python code is loaded, -but get C types on demand. The C types can change if python-gdb.py is loaded -before the Python executable. Patch written by Thomas Ilsche. - -.. - -.. bpo: 26271 -.. date: 8866 -.. nonce: wg-rzr -.. section: Tools/Demos - -Fix the Freeze tool to properly use flags passed through configure. Patch by -Daniel Shaulov. - -.. - -.. bpo: 26489 -.. date: 8865 -.. nonce: rJ_U5S -.. section: Tools/Demos - -Add dictionary unpacking support to Tools/parser/unparse.py. Patch by Guo Ci -Teo. - -.. - -.. bpo: 26316 -.. date: 8864 -.. nonce: QJvVOi -.. section: Tools/Demos - -Fix variable name typo in Argument Clinic. - -.. - -.. bpo: 25440 -.. date: 8863 -.. nonce: 5xhyGr -.. section: Tools/Demos - -Fix output of python-config --extension-suffix. - -.. - -.. bpo: 25154 -.. date: 8862 -.. nonce: yLO-r4 -.. section: Tools/Demos - -The pyvenv script has been deprecated in favour of `python3 -m venv`. - -.. - -.. bpo: 26312 -.. date: 8861 -.. nonce: h1T61B -.. section: C API - -SystemError is now raised in all programming bugs with using -PyArg_ParseTupleAndKeywords(). RuntimeError did raised before in some -programming bugs. - -.. - -.. bpo: 26198 -.. date: 8860 -.. nonce: lVn1HX -.. section: C API - -ValueError is now raised instead of TypeError on buffer overflow in parsing -"es#" and "et#" format units. SystemError is now raised instead of -TypeError on programmatical error in parsing format string. diff --git a/Misc/NEWS.d/3.6.0a2.rst b/Misc/NEWS.d/3.6.0a2.rst deleted file mode 100644 index fa050dec27ff031aeeb34b73bea88bc1847a2ff6..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.0a2.rst +++ /dev/null @@ -1,792 +0,0 @@ -.. bpo: 27095 -.. date: 9332 -.. nonce: 92UoyH -.. release date: 2016-06-13 -.. section: Core and Builtins - -Simplified MAKE_FUNCTION and removed MAKE_CLOSURE opcodes. Patch by Demur -Rumed. - -.. - -.. bpo: 27190 -.. date: 9331 -.. nonce: DHDFeD -.. section: Core and Builtins - -Raise NotSupportedError if sqlite3 is older than 3.3.1. Patch by Dave -Sawyer. - -.. - -.. bpo: 27286 -.. date: 9330 -.. nonce: U8q6B1 -.. section: Core and Builtins - -Fixed compiling BUILD_MAP_UNPACK_WITH_CALL opcode. Calling function with -generalized unpacking (PEP 448) and conflicting keyword names could cause -undefined behavior. - -.. - -.. bpo: 27140 -.. date: 9329 -.. nonce: uc39-1 -.. section: Core and Builtins - -Added BUILD_CONST_KEY_MAP opcode. - -.. - -.. bpo: 27186 -.. date: 9328 -.. nonce: EAnCS7 -.. section: Core and Builtins - -Add support for os.PathLike objects to open() (part of :pep:`519`). - -.. - -.. bpo: 27066 -.. date: 9327 -.. nonce: SNExZi -.. section: Core and Builtins - -Fixed SystemError if a custom opener (for open()) returns a negative number -without setting an exception. - -.. - -.. bpo: 26983 -.. date: 9326 -.. nonce: A0f3fK -.. section: Core and Builtins - -float() now always return an instance of exact float. The deprecation -warning is emitted if __float__ returns an instance of a strict subclass of -float. In a future versions of Python this can be an error. - -.. - -.. bpo: 27097 -.. date: 9325 -.. nonce: woRKey -.. section: Core and Builtins - -Python interpreter is now about 7% faster due to optimized instruction -decoding. Based on patch by Demur Rumed. - -.. - -.. bpo: 26647 -.. date: 9324 -.. nonce: DLSzRi -.. section: Core and Builtins - -Python interpreter now uses 16-bit wordcode instead of bytecode. Patch by -Demur Rumed. - -.. - -.. bpo: 23275 -.. date: 9323 -.. nonce: YGPb_y -.. section: Core and Builtins - -Allow assigning to an empty target list in round brackets: () = iterable. - -.. - -.. bpo: 27243 -.. date: 9322 -.. nonce: U36M4E -.. section: Core and Builtins - -Update the __aiter__ protocol: instead of returning an awaitable that -resolves to an asynchronous iterator, the asynchronous iterator should be -returned directly. Doing the former will trigger a -PendingDeprecationWarning. - -.. - -.. bpo: 0 -.. date: 9321 -.. nonce: nBpVM1 -.. section: Library - -Comment out socket (SO_REUSEPORT) and posix (O_SHLOCK, O_EXLOCK) constants -exposed on the API which are not implemented on GNU/Hurd. They would not -work at runtime anyway. - -.. - -.. bpo: 27025 -.. date: 9320 -.. nonce: ffzxpX -.. section: Library - -Generated names for Tkinter widgets are now more meaningful and recognizable. - -.. - -.. bpo: 25455 -.. date: 9319 -.. nonce: k10GoO -.. section: Library - -Fixed crashes in repr of recursive ElementTree.Element and functools.partial -objects. - -.. - -.. bpo: 27294 -.. date: 9318 -.. nonce: XPCURr -.. section: Library - -Improved repr for Tkinter event objects. - -.. - -.. bpo: 20508 -.. date: 9317 -.. nonce: 3NMbT2 -.. section: Library - -Improve exception message of IPv{4,6}Network.__getitem__. Patch by Gareth -Rees. - -.. - -.. bpo: 26556 -.. date: 9316 -.. nonce: v5j2uL -.. original section: Library -.. section: Security - -Update expat to 2.1.1, fixes CVE-2015-1283. - -.. - -.. bpo: 0 -.. date: 9315 -.. nonce: PHOAdg -.. original section: Library -.. section: Security - -Fix TLS stripping vulnerability in smtplib, CVE-2016-0772. Reported by Team -Oststrom. - -.. - -.. bpo: 21386 -.. date: 9314 -.. nonce: DjV72U -.. section: Library - -Implement missing IPv4Address.is_global property. It was documented since -07a5610bae9d. Initial patch by Roger Luethi. - -.. - -.. bpo: 27029 -.. date: 9313 -.. nonce: dmycvw -.. section: Library - -Removed deprecated support of universal newlines mode from ZipFile.open(). - -.. - -.. bpo: 27030 -.. date: 9312 -.. nonce: p29J7m -.. section: Library - -Unknown escapes consisting of ``'\'`` and an ASCII letter in regular -expressions now are errors. The re.LOCALE flag now can be used only with -bytes patterns. - -.. - -.. bpo: 27186 -.. date: 9311 -.. nonce: UYiwoh -.. section: Library - -Add os.PathLike support to DirEntry (part of :pep:`519`). Initial patch by -Jelle Zijlstra. - -.. - -.. bpo: 20900 -.. date: 9310 -.. nonce: H5YQPR -.. section: Library - -distutils register command now decodes HTTP responses correctly. Initial -patch by ingrid. - -.. - -.. bpo: 27186 -.. date: 9309 -.. nonce: Xo4c_F -.. section: Library - -Add os.PathLike support to pathlib, removing its provisional status (part of -PEP 519). Initial patch by Dusty Phillips. - -.. - -.. bpo: 27186 -.. date: 9308 -.. nonce: ZD1wpp -.. section: Library - -Add support for os.PathLike objects to os.fsencode() and os.fsdecode() (part -of :pep:`519`). - -.. - -.. bpo: 27186 -.. date: 9307 -.. nonce: y7YRfj -.. section: Library - -Introduce os.PathLike and os.fspath() (part of :pep:`519`). - -.. - -.. bpo: 0 -.. date: 9306 -.. nonce: iYIeng -.. section: Library - -A new version of typing.py provides several new classes and features: -@overload outside stubs, Reversible, DefaultDict, Text, ContextManager, -Type[], NewType(), TYPE_CHECKING, and numerous bug fixes (note that some of -the new features are not yet implemented in mypy or other static analyzers). -Also classes for :pep:`492` (Awaitable, AsyncIterable, AsyncIterator) have been -added (in fact they made it into 3.5.1 but were never mentioned). - -.. - -.. bpo: 25738 -.. date: 9305 -.. nonce: mED9w4 -.. section: Library - -Stop http.server.BaseHTTPRequestHandler.send_error() from sending a message -body for 205 Reset Content. Also, don't send Content header fields in -responses that don't have a body. Patch by Susumu Koshiba. - -.. - -.. bpo: 21313 -.. date: 9304 -.. nonce: W30MBr -.. section: Library - -Fix the "platform" module to tolerate when sys.version contains truncated -build information. - -.. - -.. bpo: 26839 -.. date: 9303 -.. nonce: yVvy7R -.. original section: Library -.. section: Security - -On Linux, :func:`os.urandom` now calls ``getrandom()`` with -``GRND_NONBLOCK`` to fall back on reading ``/dev/urandom`` if the urandom -entropy pool is not initialized yet. Patch written by Colm Buckley. - -.. - -.. bpo: 23883 -.. date: 9302 -.. nonce: tsZUiM -.. section: Library - -Added missing APIs to __all__ to match the documented APIs for the following -modules: cgi, mailbox, mimetypes, plistlib and smtpd. Patches by Jacek -Kołodziej. - -.. - -.. bpo: 27164 -.. date: 9301 -.. nonce: 6wmjx2 -.. section: Library - -In the zlib module, allow decompressing raw Deflate streams with a -predefined zdict. Based on patch by Xiang Zhang. - -.. - -.. bpo: 24291 -.. date: 9300 -.. nonce: Ac6HvL -.. section: Library - -Fix wsgiref.simple_server.WSGIRequestHandler to completely write data to the -client. Previously it could do partial writes and truncate data. Also, -wsgiref.handler.ServerHandler can now handle stdout doing partial writes, -but this is deprecated. - -.. - -.. bpo: 21272 -.. date: 9299 -.. nonce: unScIG -.. section: Library - -Use _sysconfigdata.py to initialize distutils.sysconfig. - -.. - -.. bpo: 19611 -.. date: 9298 -.. nonce: MT-Qga -.. section: Library - -:mod:`inspect` now reports the implicit ``.0`` parameters generated by the -compiler for comprehension and generator expression scopes as if they were -positional-only parameters called ``implicit0``. Patch by Jelle Zijlstra. - -.. - -.. bpo: 26809 -.. date: 9297 -.. nonce: ya7JMb -.. section: Library - -Add ``__all__`` to :mod:`string`. Patch by Emanuel Barry. - -.. - -.. bpo: 26373 -.. date: 9296 -.. nonce: P6qz6o -.. section: Library - -subprocess.Popen.communicate now correctly ignores BrokenPipeError when the -child process dies before .communicate() is called in more/all -circumstances. - -.. - -.. bpo: 0 -.. date: 9295 -.. nonce: eKchPz -.. section: Library - -signal, socket, and ssl module IntEnum constant name lookups now return a -consistent name for values having multiple names. Ex: signal.Signals(6) now -refers to itself as signal.SIGALRM rather than flipping between that and -signal.SIGIOT based on the interpreter's hash randomization seed. - -.. - -.. bpo: 27167 -.. date: 9294 -.. nonce: orA_j0 -.. section: Library - -Clarify the subprocess.CalledProcessError error message text when the child -process died due to a signal. - -.. - -.. bpo: 25931 -.. date: 9293 -.. nonce: W7h6Am -.. section: Library - -Don't define socketserver.Forking* names on platforms such as Windows that -do not support os.fork(). - -.. - -.. bpo: 21776 -.. date: 9292 -.. nonce: 04eQfa -.. section: Library - -distutils.upload now correctly handles HTTPError. Initial patch by Claudiu -Popa. - -.. - -.. bpo: 26526 -.. date: 9291 -.. nonce: ScewjJ -.. section: Library - -Replace custom parse tree validation in the parser module with a simple DFA -validator. - -.. - -.. bpo: 27114 -.. date: 9290 -.. nonce: bGCuAM -.. section: Library - -Fix SSLContext._load_windows_store_certs fails with PermissionError - -.. - -.. bpo: 18383 -.. date: 9289 -.. nonce: jr-b0l -.. section: Library - -Avoid creating duplicate filters when using filterwarnings and simplefilter. -Based on patch by Alex Shkop. - -.. - -.. bpo: 23026 -.. date: 9288 -.. nonce: V2rgYX -.. section: Library - -winreg.QueryValueEx() now return an integer for REG_QWORD type. - -.. - -.. bpo: 26741 -.. date: 9287 -.. nonce: fsbb42 -.. section: Library - -subprocess.Popen destructor now emits a ResourceWarning warning if the child -process is still running. - -.. - -.. bpo: 27056 -.. date: 9286 -.. nonce: rk-BBL -.. section: Library - -Optimize pickle.load() and pickle.loads(), up to 10% faster to deserialize a -lot of small objects. - -.. - -.. bpo: 21271 -.. date: 9285 -.. nonce: bHIfFA -.. section: Library - -New keyword only parameters in reset_mock call. - -.. - -.. bpo: 5124 -.. date: 9284 -.. nonce: 4kwBvM -.. section: IDLE - -Paste with text selected now replaces the selection on X11. This matches how -paste works on Windows, Mac, most modern Linux apps, and ttk widgets. -Original patch by Serhiy Storchaka. - -.. - -.. bpo: 24750 -.. date: 9283 -.. nonce: wA-pc9 -.. section: IDLE - -Switch all scrollbars in IDLE to ttk versions. Where needed, minimal tests -are added to cover changes. - -.. - -.. bpo: 24759 -.. date: 9282 -.. nonce: 76HB4w -.. section: IDLE - -IDLE requires tk 8.5 and availability ttk widgets. Delete now unneeded tk -version tests and code for older versions. Add test for IDLE syntax -colorizer. - -.. - -.. bpo: 27239 -.. date: 9281 -.. nonce: fToURh -.. section: IDLE - -idlelib.macosx.isXyzTk functions initialize as needed. - -.. - -.. bpo: 27262 -.. date: 9280 -.. nonce: t7ckly -.. section: IDLE - -move Aqua unbinding code, which enable context menus, to macosx. - -.. - -.. bpo: 24759 -.. date: 9279 -.. nonce: ccmySu -.. section: IDLE - -Make clear in idlelib.idle_test.__init__ that the directory is a private -implementation of test.test_idle and tool for maintainers. - -.. - -.. bpo: 27196 -.. date: 9278 -.. nonce: 3yp8TF -.. section: IDLE - -Stop 'ThemeChanged' warnings when running IDLE tests. These persisted after -other warnings were suppressed in #20567. Apply Serhiy Storchaka's -update_idletasks solution to four test files. Record this additional advice -in idle_test/README.txt - -.. - -.. bpo: 20567 -.. date: 9277 -.. nonce: hhT32b -.. section: IDLE - -Revise idle_test/README.txt with advice about avoiding tk warning messages -from tests. Apply advice to several IDLE tests. - -.. - -.. bpo: 24225 -.. date: 9276 -.. nonce: NxQCka -.. section: IDLE - -Update idlelib/README.txt with new file names and event handlers. - -.. - -.. bpo: 27156 -.. date: 9275 -.. nonce: j1N9br -.. section: IDLE - -Remove obsolete code not used by IDLE. - -.. - -.. bpo: 27117 -.. date: 9274 -.. nonce: YrLPf4 -.. section: IDLE - -Make colorizer htest and turtledemo work with dark themes. Move code for -configuring text widget colors to a new function. - -.. - -.. bpo: 24225 -.. date: 9273 -.. nonce: RbyFuV -.. section: IDLE - -Rename many `idlelib/*.py` and `idle_test/test_*.py` files. Edit files to -replace old names with new names when the old name referred to the module -rather than the class it contained. See the issue and IDLE section in What's -New in 3.6 for more. - -.. - -.. bpo: 26673 -.. date: 9272 -.. nonce: dh0_Ij -.. section: IDLE - -When tk reports font size as 0, change to size 10. Such fonts on Linux -prevented the configuration dialog from opening. - -.. - -.. bpo: 21939 -.. date: 9271 -.. nonce: pWz-OK -.. section: IDLE - -Add test for IDLE's percolator. Original patch by Saimadhav Heblikar. - -.. - -.. bpo: 21676 -.. date: 9270 -.. nonce: hqy6Qh -.. section: IDLE - -Add test for IDLE's replace dialog. Original patch by Saimadhav Heblikar. - -.. - -.. bpo: 18410 -.. date: 9269 -.. nonce: DLSPZo -.. section: IDLE - -Add test for IDLE's search dialog. Original patch by Westley Martínez. - -.. - -.. bpo: 21703 -.. date: 9268 -.. nonce: bEU8sP -.. section: IDLE - -Add test for undo delegator. Patch mostly by Saimadhav Heblikar . - -.. - -.. bpo: 27044 -.. date: 9267 -.. nonce: 4y7tyM -.. section: IDLE - -Add ConfigDialog.remove_var_callbacks to stop memory leaks. - -.. - -.. bpo: 23977 -.. date: 9266 -.. nonce: miDjj8 -.. section: IDLE - -Add more asserts to test_delegator. - -.. - -.. bpo: 16484 -.. date: 9265 -.. nonce: ITzcGg -.. section: Documentation - -Change the default PYTHONDOCS URL to "https:", and fix the resulting links -to use lowercase. Patch by Sean Rodman, test by Kaushik Nadikuditi. - -.. - -.. bpo: 24136 -.. date: 9264 -.. nonce: MUK0zK -.. section: Documentation - -Document the new :pep:`448` unpacking syntax of 3.5. - -.. - -.. bpo: 22558 -.. date: 9263 -.. nonce: Pk02YC -.. section: Documentation - -Add remaining doc links to source code for Python-coded modules. Patch by -Yoni Lavi. - -.. - -.. bpo: 25285 -.. date: 9262 -.. nonce: 6CxIBo -.. section: Tests - -regrtest now uses subprocesses when the -j1 command line option is used: -each test file runs in a fresh child process. Before, the -j1 option was -ignored. - -.. - -.. bpo: 25285 -.. date: 9261 -.. nonce: ENYqUQ -.. section: Tests - -Tools/buildbot/test.bat script now uses -j1 by default to run each test file -in fresh child process. - -.. - -.. bpo: 27064 -.. date: 9260 -.. nonce: xeY1WF -.. section: Windows - -The py.exe launcher now defaults to Python 3. The Windows launcher -``py.exe`` no longer prefers an installed Python 2 version over Python 3 by -default when used interactively. - -.. - -.. bpo: 27229 -.. date: 9259 -.. nonce: C2NDch -.. section: Build - -Fix the cross-compiling pgen rule for in-tree builds. Patch by Xavier de -Gaye. - -.. - -.. bpo: 26930 -.. date: 9258 -.. nonce: Sqz2O3 -.. section: Build - -Update OS X 10.5+ 32-bit-only installer to build and link with OpenSSL -1.0.2h. - -.. - -.. bpo: 17500 -.. date: 9257 -.. nonce: QTZbRV -.. section: Windows - -Remove unused and outdated icons. (See also: -https://github.com/python/pythondotorg/issues/945) - -.. - -.. bpo: 27186 -.. date: 9256 -.. nonce: Ll8R-t -.. section: C API - -Add the PyOS_FSPath() function (part of :pep:`519`). - -.. - -.. bpo: 26282 -.. date: 9255 -.. nonce: Rp-R6L -.. section: C API - -PyArg_ParseTupleAndKeywords() now supports positional-only parameters. - -.. - -.. bpo: 26282 -.. date: 9254 -.. nonce: DRRV-- -.. section: Tools/Demos - -Argument Clinic now supports positional-only and keyword parameters in the -same function. diff --git a/Misc/NEWS.d/3.6.0a3.rst b/Misc/NEWS.d/3.6.0a3.rst deleted file mode 100644 index 4b0000b0e7975a391795c1a994745fd212842985..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.0a3.rst +++ /dev/null @@ -1,537 +0,0 @@ -.. bpo: 27473 -.. date: 9385 -.. nonce: _nOtTA -.. release date: 2016-07-11 -.. section: Core and Builtins - -Fixed possible integer overflow in bytes and bytearray concatenations. -Patch by Xiang Zhang. - -.. - -.. bpo: 23034 -.. date: 9384 -.. nonce: GWaUqn -.. section: Core and Builtins - -The output of a special Python build with defined COUNT_ALLOCS, -SHOW_ALLOC_COUNT or SHOW_TRACK_COUNT macros is now off by default. It can -be re-enabled using the "-X showalloccount" option. It now outputs to -stderr instead of stdout. - -.. - -.. bpo: 27443 -.. date: 9383 -.. nonce: 87ZwZ1 -.. section: Core and Builtins - -__length_hint__() of bytearray iterators no longer return a negative integer -for a resized bytearray. - -.. - -.. bpo: 27007 -.. date: 9382 -.. nonce: Gg8Um4 -.. section: Core and Builtins - -The fromhex() class methods of bytes and bytearray subclasses now return an -instance of corresponding subclass. - -.. - -.. bpo: 26844 -.. date: 9381 -.. nonce: I0wdnY -.. section: Library - -Fix error message for imp.find_module() to refer to 'path' instead of -'name'. Patch by Lev Maximov. - -.. - -.. bpo: 23804 -.. date: 9380 -.. nonce: ipFvxc -.. section: Library - -Fix SSL zero-length recv() calls to not block and not raise an error about -unclean EOF. - -.. - -.. bpo: 27466 -.. date: 9379 -.. nonce: C_3a8E -.. section: Library - -Change time format returned by http.cookie.time2netscape, confirming the -netscape cookie format and making it consistent with documentation. - -.. - -.. bpo: 21708 -.. date: 9378 -.. nonce: RpPYiv -.. section: Library - -Deprecated dbm.dumb behavior that differs from common dbm behavior: creating -a database in 'r' and 'w' modes and modifying a database in 'r' mode. - -.. - -.. bpo: 26721 -.. date: 9377 -.. nonce: L37Y7r -.. section: Library - -Change the socketserver.StreamRequestHandler.wfile attribute to implement -BufferedIOBase. In particular, the write() method no longer does partial -writes. - -.. - -.. bpo: 22115 -.. date: 9376 -.. nonce: vG5UQW -.. section: Library - -Added methods trace_add, trace_remove and trace_info in the tkinter.Variable -class. They replace old methods trace_variable, trace, trace_vdelete and -trace_vinfo that use obsolete Tcl commands and might not work in future -versions of Tcl. Fixed old tracing methods: trace_vdelete() with wrong mode -no longer break tracing, trace_vinfo() now always returns a list of pairs of -strings, tracing in the "u" mode now works. - -.. - -.. bpo: 26243 -.. date: 9375 -.. nonce: dBtlhI -.. section: Library - -Only the level argument to zlib.compress() is keyword argument now. The -first argument is positional-only. - -.. - -.. bpo: 27038 -.. date: 9374 -.. nonce: yGMV4h -.. section: Library - -Expose the DirEntry type as os.DirEntry. Code patch by Jelle Zijlstra. - -.. - -.. bpo: 27186 -.. date: 9373 -.. nonce: OtorpF -.. section: Library - -Update os.fspath()/PyOS_FSPath() to check the return value of __fspath__() -to be either str or bytes. - -.. - -.. bpo: 18726 -.. date: 9372 -.. nonce: eIXHIl -.. section: Library - -All optional parameters of the dump(), dumps(), load() and loads() functions -and JSONEncoder and JSONDecoder class constructors in the json module are -now keyword-only. - -.. - -.. bpo: 27319 -.. date: 9371 -.. nonce: vDl2zm -.. section: Library - -Methods selection_set(), selection_add(), selection_remove() and -selection_toggle() of ttk.TreeView now allow passing multiple items as -multiple arguments instead of passing them as a tuple. Deprecated -undocumented ability of calling the selection() method with arguments. - -.. - -.. bpo: 27079 -.. date: 9370 -.. nonce: c7d0Ym -.. section: Library - -Fixed curses.ascii functions isblank(), iscntrl() and ispunct(). - -.. - -.. bpo: 27294 -.. date: 9369 -.. nonce: 0WSp9y -.. section: Library - -Numerical state in the repr for Tkinter event objects is now represented as -a combination of known flags. - -.. - -.. bpo: 27177 -.. date: 9368 -.. nonce: U6jRnd -.. section: Library - -Match objects in the re module now support index-like objects as group -indices. Based on patches by Jeroen Demeyer and Xiang Zhang. - -.. - -.. bpo: 26754 -.. date: 9367 -.. nonce: J3n0QW -.. section: Library - -Some functions (compile() etc) accepted a filename argument encoded as an -iterable of integers. Now only strings and byte-like objects are accepted. - -.. - -.. bpo: 26536 -.. date: 9366 -.. nonce: DgLWm- -.. section: Library - -socket.ioctl now supports SIO_LOOPBACK_FAST_PATH. Patch by Daniel Stokes. - -.. - -.. bpo: 27048 -.. date: 9365 -.. nonce: EVe-Bk -.. section: Library - -Prevents distutils failing on Windows when environment variables contain -non-ASCII characters - -.. - -.. bpo: 27330 -.. date: 9364 -.. nonce: GJaFCV -.. section: Library - -Fixed possible leaks in the ctypes module. - -.. - -.. bpo: 27238 -.. date: 9363 -.. nonce: Q6v6Qv -.. section: Library - -Got rid of bare excepts in the turtle module. Original patch by Jelle -Zijlstra. - -.. - -.. bpo: 27122 -.. date: 9362 -.. nonce: 06t7zN -.. section: Library - -When an exception is raised within the context being managed by a -contextlib.ExitStack() and one of the exit stack generators catches and -raises it in a chain, do not re-raise the original exception when exiting, -let the new chained one through. This avoids the :pep:`479` bug described in -issue25782. - -.. - -.. bpo: 27278 -.. date: 9361 -.. nonce: y_HkGw -.. original section: Library -.. section: Security - -Fix os.urandom() implementation using getrandom() on Linux. Truncate size -to INT_MAX and loop until we collected enough random bytes, instead of -casting a directly Py_ssize_t to int. - -.. - -.. bpo: 16864 -.. date: 9360 -.. nonce: W7tJDa -.. section: Library - -sqlite3.Cursor.lastrowid now supports REPLACE statement. Initial patch by -Alex LordThorsen. - -.. - -.. bpo: 26386 -.. date: 9359 -.. nonce: 9L3Ut4 -.. section: Library - -Fixed ttk.TreeView selection operations with item id's containing spaces. - -.. - -.. bpo: 8637 -.. date: 9358 -.. nonce: lHiUSA -.. section: Library - -Honor a pager set by the env var MANPAGER (in preference to one set by the -env var PAGER). - -.. - -.. bpo: 22636 -.. date: 9357 -.. nonce: 3fQW_g -.. original section: Library -.. section: Security - -Avoid shell injection problems with ctypes.util.find_library(). - -.. - -.. bpo: 16182 -.. date: 9356 -.. nonce: RgFXyr -.. section: Library - -Fix various functions in the "readline" module to use the locale encoding, -and fix get_begidx() and get_endidx() to return code point indexes. - -.. - -.. bpo: 27392 -.. date: 9355 -.. nonce: obfni7 -.. section: Library - -Add loop.connect_accepted_socket(). Patch by Jim Fulton. - -.. - -.. bpo: 27477 -.. date: 9354 -.. nonce: iEuL-9 -.. section: IDLE - -IDLE search dialogs now use ttk widgets. - -.. - -.. bpo: 27173 -.. date: 9353 -.. nonce: M-fYaV -.. section: IDLE - -Add 'IDLE Modern Unix' to the built-in key sets. Make the default key set -depend on the platform. Add tests for the changes to the config module. - -.. - -.. bpo: 27452 -.. date: 9352 -.. nonce: dLxZ8W -.. section: IDLE - -make command line "idle-test> python test_help.py" work. __file__ is -relative when python is started in the file's directory. - -.. - -.. bpo: 27452 -.. date: 9351 -.. nonce: RtWnyR -.. section: IDLE - -add line counter and crc to IDLE configHandler test dump. - -.. - -.. bpo: 27380 -.. date: 9350 -.. nonce: Q39r9U -.. section: IDLE - -IDLE: add query.py with base Query dialog and ttk widgets. Module had -subclasses SectionName, ModuleName, and HelpSource, which are used to get -information from users by configdialog and file =>Load Module. Each subclass -has itw own validity checks. Using ModuleName allows users to edit bad -module names instead of starting over. Add tests and delete the two files -combined into the new one. - -.. - -.. bpo: 27372 -.. date: 9349 -.. nonce: k3Wj2V -.. section: IDLE - -Test_idle no longer changes the locale. - -.. - -.. bpo: 27365 -.. date: 9348 -.. nonce: y7ys_A -.. section: IDLE - -Allow non-ascii chars in IDLE NEWS.txt, for contributor names. - -.. - -.. bpo: 27245 -.. date: 9347 -.. nonce: u9aKO1 -.. section: IDLE - -IDLE: Cleanly delete custom themes and key bindings. Previously, when IDLE -was started from a console or by import, a cascade of warnings was emitted. -Patch by Serhiy Storchaka. - -.. - -.. bpo: 24137 -.. date: 9346 -.. nonce: v8o-IT -.. section: IDLE - -Run IDLE, test_idle, and htest with tkinter default root disabled. Fix code -and tests that fail with this restriction. Fix htests to not create a -second and redundant root and mainloop. - -.. - -.. bpo: 27310 -.. date: 9345 -.. nonce: KiURpC -.. section: IDLE - -Fix IDLE.app failure to launch on OS X due to vestigial import. - -.. - -.. bpo: 26754 -.. date: 9344 -.. nonce: Qm_N79 -.. section: C API - -PyUnicode_FSDecoder() accepted a filename argument encoded as an iterable of -integers. Now only strings and byte-like objects are accepted. - -.. - -.. bpo: 28066 -.. date: 9343 -.. nonce: _3xImV -.. section: Build - -Fix the logic that searches build directories for generated include files -when building outside the source tree. - -.. - -.. bpo: 27442 -.. date: 9342 -.. nonce: S2M0cz -.. section: Build - -Expose the Android API level that python was built against, in -sysconfig.get_config_vars() as 'ANDROID_API_LEVEL'. - -.. - -.. bpo: 27434 -.. date: 9341 -.. nonce: 4nRZmn -.. section: Build - -The interpreter that runs the cross-build, found in PATH, must now be of the -same feature version (e.g. 3.6) as the source being built. - -.. - -.. bpo: 26930 -.. date: 9340 -.. nonce: 9JUeSD -.. section: Build - -Update Windows builds to use OpenSSL 1.0.2h. - -.. - -.. bpo: 23968 -.. date: 9339 -.. nonce: 7AuSK9 -.. section: Build - -Rename the platform directory from plat-$(MACHDEP) to -plat-$(PLATFORM_TRIPLET). Rename the config directory (LIBPL) from -config-$(LDVERSION) to config-$(LDVERSION)-$(PLATFORM_TRIPLET). Install the -platform specific _sysconfigdata module into the platform directory and -rename it to include the ABIFLAGS. - -.. - -.. bpo: 0 -.. date: 9338 -.. nonce: U46i2u -.. section: Build - -Don't use largefile support for GNU/Hurd. - -.. - -.. bpo: 27332 -.. date: 9337 -.. nonce: OuRZp9 -.. section: Tools/Demos - -Fixed the type of the first argument of module-level functions generated by -Argument Clinic. Patch by Petr Viktorin. - -.. - -.. bpo: 27418 -.. date: 9336 -.. nonce: W2m_8I -.. section: Tools/Demos - -Fixed Tools/importbench/importbench.py. - -.. - -.. bpo: 19489 -.. date: 9335 -.. nonce: jvzuO7 -.. section: Documentation - -Moved the search box from the sidebar to the header and footer of each page. -Patch by Ammar Askar. - -.. - -.. bpo: 27285 -.. date: 9334 -.. nonce: wZur0b -.. section: Documentation - -Update documentation to reflect the deprecation of ``pyvenv`` and normalize -on the term "virtual environment". Patch by Steve Piercy. - -.. - -.. bpo: 27027 -.. date: 9333 -.. nonce: 5oRSGL -.. section: Tests - -Added test.support.is_android that is True when this is an Android build. diff --git a/Misc/NEWS.d/3.6.0a4.rst b/Misc/NEWS.d/3.6.0a4.rst deleted file mode 100644 index d613fd5d928b6545efe8271e2fbf23d0e2a8a498..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.0a4.rst +++ /dev/null @@ -1,685 +0,0 @@ -.. bpo: 27704 -.. date: 9455 -.. nonce: RUxzHf -.. release date: 2016-08-15 -.. section: Core and Builtins - -Optimized creating bytes and bytearray from byte-like objects and iterables. -Speed up to 3 times for short objects. Original patch by Naoki Inada. - -.. - -.. bpo: 26823 -.. date: 9454 -.. nonce: UWORiU -.. section: Core and Builtins - -Large sections of repeated lines in tracebacks are now abbreviated as -"[Previous line repeated {count} more times]" by the builtin traceback -rendering. Patch by Emanuel Barry. - -.. - -.. bpo: 27574 -.. date: 9453 -.. nonce: q73Tss -.. section: Core and Builtins - -Decreased an overhead of parsing keyword arguments in functions implemented -with using Argument Clinic. - -.. - -.. bpo: 22557 -.. date: 9452 -.. nonce: Hta2Rz -.. section: Core and Builtins - -Now importing already imported modules is up to 2.5 times faster. - -.. - -.. bpo: 17596 -.. date: 9451 -.. nonce: XgbA9V -.. section: Core and Builtins - -Include to help with Min GW building. - -.. - -.. bpo: 17599 -.. date: 9450 -.. nonce: noy7o1 -.. section: Core and Builtins - -On Windows, rename the privately defined REPARSE_DATA_BUFFER structure to -avoid conflicting with the definition from Min GW. - -.. - -.. bpo: 27507 -.. date: 9449 -.. nonce: 3pX0Be -.. section: Core and Builtins - -Add integer overflow check in bytearray.extend(). Patch by Xiang Zhang. - -.. - -.. bpo: 27581 -.. date: 9448 -.. nonce: KezjNt -.. section: Core and Builtins - -Don't rely on wrapping for overflow check in PySequence_Tuple(). Patch by -Xiang Zhang. - -.. - -.. bpo: 1621 -.. date: 9447 -.. nonce: _FZWTr -.. section: Core and Builtins - -Avoid signed integer overflow in list and tuple operations. Patch by Xiang -Zhang. - -.. - -.. bpo: 27419 -.. date: 9446 -.. nonce: YaGodL -.. section: Core and Builtins - -Standard __import__() no longer look up "__import__" in globals or builtins -for importing submodules or "from import". Fixed a crash if raise a warning -about unabling to resolve package from __spec__ or __package__. - -.. - -.. bpo: 27083 -.. date: 9445 -.. nonce: F4ZT1C -.. section: Core and Builtins - -Respect the PYTHONCASEOK environment variable under Windows. - -.. - -.. bpo: 27514 -.. date: 9444 -.. nonce: NLbwPG -.. section: Core and Builtins - -Make having too many statically nested blocks a SyntaxError instead of -SystemError. - -.. - -.. bpo: 27366 -.. date: 9443 -.. nonce: VrInsj -.. section: Core and Builtins - -Implemented :pep:`487` (Simpler customization of class creation). Upon -subclassing, the __init_subclass__ classmethod is called on the base class. -Descriptors are initialized with __set_name__ after class creation. - -.. - -.. bpo: 26027 -.. date: 9442 -.. nonce: nfVMKM -.. section: Library - -Add :pep:`519`/__fspath__() support to the os and os.path modules. Includes -code from Jelle Zijlstra. (See also: bpo-27524) - -.. - -.. bpo: 27598 -.. date: 9441 -.. nonce: y7PtEV -.. section: Library - -Add Collections to collections.abc. Patch by Ivan Levkivskyi, docs by Neil -Girdhar. - -.. - -.. bpo: 25958 -.. date: 9440 -.. nonce: X-V4U1 -.. section: Library - -Support "anti-registration" of special methods from various ABCs, like -__hash__, __iter__ or __len__. All these (and several more) can be set to -None in an implementation class and the behavior will be as if the method is -not defined at all. (Previously, this mechanism existed only for __hash__, -to make mutable classes unhashable.) Code contributed by Andrew Barnert and -Ivan Levkivskyi. - -.. - -.. bpo: 16764 -.. date: 9439 -.. nonce: cPbNjL -.. section: Library - -Support keyword arguments to zlib.decompress(). Patch by Xiang Zhang. - -.. - -.. bpo: 27736 -.. date: 9438 -.. nonce: 8kMhpQ -.. section: Library - -Prevent segfault after interpreter re-initialization due to ref count -problem introduced in code for Issue #27038 in 3.6.0a3. Patch by Xiang -Zhang. - -.. - -.. bpo: 25628 -.. date: 9437 -.. nonce: UcQnHF -.. section: Library - -The *verbose* and *rename* parameters for collections.namedtuple are now -keyword-only. - -.. - -.. bpo: 12345 -.. date: 9436 -.. nonce: nbAEM8 -.. section: Library - -Add mathematical constant tau to math and cmath. See also :pep:`628`. - -.. - -.. bpo: 26823 -.. date: 9435 -.. nonce: HcO8tR -.. section: Library - -traceback.StackSummary.format now abbreviates large sections of repeated -lines as "[Previous line repeated {count} more times]" (this change then -further affects other traceback display operations in the module). Patch by -Emanuel Barry. - -.. - -.. bpo: 27664 -.. date: 9434 -.. nonce: 6DJPxw -.. section: Library - -Add to concurrent.futures.thread.ThreadPoolExecutor() the ability to specify -a thread name prefix. - -.. - -.. bpo: 27181 -.. date: 9433 -.. nonce: 8aw9TZ -.. section: Library - -Add geometric_mean and harmonic_mean to statistics module. - -.. - -.. bpo: 27573 -.. date: 9432 -.. nonce: B7XhTs -.. section: Library - -code.interact now prints an message when exiting. - -.. - -.. bpo: 6422 -.. date: 9431 -.. nonce: iBSc45 -.. section: Library - -Add autorange method to timeit.Timer objects. - -.. - -.. bpo: 27773 -.. date: 9430 -.. nonce: hMSSeX -.. section: Library - -Correct some memory management errors server_hostname in _ssl.wrap_socket(). - -.. - -.. bpo: 26750 -.. date: 9429 -.. nonce: OQn3fr -.. section: Library - -unittest.mock.create_autospec() now works properly for subclasses of -property() and other data descriptors. Removes the never publicly used, -never documented unittest.mock.DescriptorTypes tuple. - -.. - -.. bpo: 26754 -.. date: 9428 -.. nonce: XZqomf -.. section: Library - -Undocumented support of general bytes-like objects as path in compile() and -similar functions is now deprecated. - -.. - -.. bpo: 26800 -.. date: 9427 -.. nonce: QDcK8u -.. section: Library - -Undocumented support of general bytes-like objects as paths in os functions -is now deprecated. - -.. - -.. bpo: 26981 -.. date: 9426 -.. nonce: yhNTCf -.. section: Library - -Add _order_ compatibility shim to enum.Enum for Python 2/3 code bases. - -.. - -.. bpo: 27661 -.. date: 9425 -.. nonce: 3JZckO -.. section: Library - -Added tzinfo keyword argument to datetime.combine. - -.. - -.. bpo: 0 -.. date: 9424 -.. nonce: Ny9oPv -.. section: Library - -In the curses module, raise an error if window.getstr() or window.instr() is -passed a negative value. - -.. - -.. bpo: 27783 -.. date: 9423 -.. nonce: cR1jXH -.. section: Library - -Fix possible usage of uninitialized memory in operator.methodcaller. - -.. - -.. bpo: 27774 -.. date: 9422 -.. nonce: FDcik1 -.. section: Library - -Fix possible Py_DECREF on unowned object in _sre. - -.. - -.. bpo: 27760 -.. date: 9421 -.. nonce: gxMjp4 -.. section: Library - -Fix possible integer overflow in binascii.b2a_qp. - -.. - -.. bpo: 27758 -.. date: 9420 -.. nonce: 0NRV03 -.. section: Library - -Fix possible integer overflow in the _csv module for large record lengths. - -.. - -.. bpo: 27568 -.. date: 9419 -.. nonce: OnuO9s -.. section: Library - -Prevent HTTPoxy attack (CVE-2016-1000110). Ignore the HTTP_PROXY variable -when REQUEST_METHOD environment is set, which indicates that the script is -in CGI mode. - -.. - -.. bpo: 7063 -.. date: 9418 -.. nonce: nXsVKB -.. section: Library - -Remove dead code from the "array" module's slice handling. Patch by Chuck. - -.. - -.. bpo: 27656 -.. date: 9417 -.. nonce: joTscM -.. section: Library - -Do not assume sched.h defines any SCHED_* constants. - -.. - -.. bpo: 27130 -.. date: 9416 -.. nonce: SUxwXZ -.. section: Library - -In the "zlib" module, fix handling of large buffers (typically 4 GiB) when -compressing and decompressing. Previously, inputs were limited to 4 GiB, -and compression and decompression operations did not properly handle results -of 4 GiB. - -.. - -.. bpo: 24773 -.. date: 9415 -.. nonce: IDW05R -.. section: Library - -Implemented :pep:`495` (Local Time Disambiguation). - -.. - -.. bpo: 0 -.. date: 9414 -.. nonce: lOkwM8 -.. section: Library - -Expose the EPOLLEXCLUSIVE constant (when it is defined) in the select -module. - -.. - -.. bpo: 27567 -.. date: 9413 -.. nonce: bYOgyw -.. section: Library - -Expose the EPOLLRDHUP and POLLRDHUP constants in the select module. - -.. - -.. bpo: 1621 -.. date: 9412 -.. nonce: 0nclmI -.. section: Library - -Avoid signed int negation overflow in the "audioop" module. - -.. - -.. bpo: 27533 -.. date: 9411 -.. nonce: iDmKzV -.. section: Library - -Release GIL in nt._isdir - -.. - -.. bpo: 17711 -.. date: 9410 -.. nonce: 47AILJ -.. section: Library - -Fixed unpickling by the persistent ID with protocol 0. Original patch by -Alexandre Vassalotti. - -.. - -.. bpo: 27522 -.. date: 9409 -.. nonce: 8vVz_t -.. section: Library - -Avoid an unintentional reference cycle in email.feedparser. - -.. - -.. bpo: 27512 -.. date: 9408 -.. nonce: FaGwup -.. section: Library - -Fix a segfault when os.fspath() called an __fspath__() method that raised an -exception. Patch by Xiang Zhang. - -.. - -.. bpo: 27714 -.. date: 9407 -.. nonce: bUEDsI -.. section: IDLE - -text_textview and test_autocomplete now pass when re-run in the same -process. This occurs when test_idle fails when run with the -w option but -without -jn. Fix warning from test_config. - -.. - -.. bpo: 27621 -.. date: 9406 -.. nonce: BcpOPU -.. section: IDLE - -Put query response validation error messages in the query box itself instead -of in a separate messagebox. Redo tests to match. Add Mac OSX refinements. -Original patch by Mark Roseman. - -.. - -.. bpo: 27620 -.. date: 9405 -.. nonce: TXRR6x -.. section: IDLE - -Escape key now closes Query box as cancelled. - -.. - -.. bpo: 27609 -.. date: 9404 -.. nonce: MbTuKa -.. section: IDLE - -IDLE: tab after initial whitespace should tab, not autocomplete. This fixes -problem with writing docstrings at least twice indented. - -.. - -.. bpo: 27609 -.. date: 9403 -.. nonce: OBYgv_ -.. section: IDLE - -Explicitly return None when there are also non-None returns. In a few cases, -reverse a condition and eliminate a return. - -.. - -.. bpo: 25507 -.. date: 9402 -.. nonce: lxf68d -.. section: IDLE - -IDLE no longer runs buggy code because of its tkinter imports. Users must -include the same imports required to run directly in Python. - -.. - -.. bpo: 27173 -.. date: 9401 -.. nonce: M-fYaV -.. section: IDLE - -Add 'IDLE Modern Unix' to the built-in key sets. Make the default key set -depend on the platform. Add tests for the changes to the config module. - -.. - -.. bpo: 27452 -.. date: 9400 -.. nonce: RtWnyR -.. section: IDLE - -add line counter and crc to IDLE configHandler test dump. - -.. - -.. bpo: 25805 -.. date: 9399 -.. nonce: 9SVxXQ -.. section: Tests - -Skip a test in test_pkgutil as needed that doesn't work when ``__name__ == -__main__``. Patch by SilentGhost. - -.. - -.. bpo: 27472 -.. date: 9398 -.. nonce: NS3L93 -.. section: Tests - -Add test.support.unix_shell as the path to the default shell. - -.. - -.. bpo: 27369 -.. date: 9397 -.. nonce: LG7U2D -.. section: Tests - -In test_pyexpat, avoid testing an error message detail that changed in Expat -2.2.0. - -.. - -.. bpo: 27594 -.. date: 9396 -.. nonce: w3F57B -.. section: Tests - -Prevent assertion error when running test_ast with coverage enabled: ensure -code object has a valid first line number. Patch suggested by Ivan -Levkivskyi. - -.. - -.. bpo: 27647 -.. date: 9395 -.. nonce: -1HUR6 -.. section: Windows - -Update bundled Tcl/Tk to 8.6.6. - -.. - -.. bpo: 27610 -.. date: 9394 -.. nonce: O0o0mB -.. section: Windows - -Adds :pep:`514` metadata to Windows installer - -.. - -.. bpo: 27469 -.. date: 9393 -.. nonce: 0GwDkX -.. section: Windows - -Adds a shell extension to the launcher so that drag and drop works -correctly. - -.. - -.. bpo: 27309 -.. date: 9392 -.. nonce: chiOo6 -.. section: Windows - -Enables proper Windows styles in python[w].exe manifest. - -.. - -.. bpo: 27713 -.. date: 9391 -.. nonce: _3DgXG -.. section: Build - -Suppress spurious build warnings when updating importlib's bootstrap files. -Patch by Xiang Zhang - -.. - -.. bpo: 25825 -.. date: 9390 -.. nonce: MLbdVU -.. section: Build - -Correct the references to Modules/python.exp, which is required on AIX. The -references were accidentally changed in 3.5.0a1. - -.. - -.. bpo: 27453 -.. date: 9389 -.. nonce: Pb5DBi -.. section: Build - -CPP invocation in configure must use CPPFLAGS. Patch by Chi Hsuan Yen. - -.. - -.. bpo: 27641 -.. date: 9388 -.. nonce: eGzgCk -.. section: Build - -The configure script now inserts comments into the makefile to prevent the -pgen and _freeze_importlib executables from being cross-compiled. - -.. - -.. bpo: 26662 -.. date: 9387 -.. nonce: XkwRxM -.. section: Build - -Set PYTHON_FOR_GEN in configure as the Python program to be used for file -generation during the build. - -.. - -.. bpo: 10910 -.. date: 9386 -.. nonce: ZdRayb -.. section: Build - -Avoid C++ compilation errors on FreeBSD and OS X. Also update FreedBSD -version checks for the original ctype UTF-8 workaround. diff --git a/Misc/NEWS.d/3.6.0b1.rst b/Misc/NEWS.d/3.6.0b1.rst deleted file mode 100644 index 3fbae5c6a4b3a8e96a64a1f3821ab971250e7d1c..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.0b1.rst +++ /dev/null @@ -1,1608 +0,0 @@ -.. bpo: 23722 -.. date: 9619 -.. nonce: C-8boi -.. release date: 2016-09-12 -.. section: Core and Builtins - -The __class__ cell used by zero-argument super() is now initialized from -type.__new__ rather than __build_class__, so class methods relying on that -will now work correctly when called from metaclass methods during class -creation. Patch by Martin Teichmann. - -.. - -.. bpo: 25221 -.. date: 9618 -.. nonce: 9YbOxB -.. section: Core and Builtins - -Fix corrupted result from PyLong_FromLong(0) when Python is compiled with -NSMALLPOSINTS = 0. - -.. - -.. bpo: 27080 -.. date: 9617 -.. nonce: Te4Tjb -.. section: Core and Builtins - -Implement formatting support for :pep:`515`. Initial patch by Chris Angelico. - -.. - -.. bpo: 27199 -.. date: 9616 -.. nonce: GheADD -.. section: Core and Builtins - -In tarfile, expose copyfileobj bufsize to improve throughput. Patch by Jason -Fried. - -.. - -.. bpo: 27948 -.. date: 9615 -.. nonce: Rpw5nq -.. section: Core and Builtins - -In f-strings, only allow backslashes inside the braces (where the -expressions are). This is a breaking change from the 3.6 alpha releases, -where backslashes are allowed anywhere in an f-string. Also, require that -expressions inside f-strings be enclosed within literal braces, and not -escapes like ``f'\x7b"hi"\x7d'``. - -.. - -.. bpo: 28046 -.. date: 9614 -.. nonce: liHxFW -.. section: Core and Builtins - -Remove platform-specific directories from sys.path. - -.. - -.. bpo: 28071 -.. date: 9613 -.. nonce: PffE44 -.. section: Core and Builtins - -Add early-out for differencing from an empty set. - -.. - -.. bpo: 25758 -.. date: 9612 -.. nonce: yR-YTD -.. section: Core and Builtins - -Prevents zipimport from unnecessarily encoding a filename (patch by Eryk -Sun) - -.. - -.. bpo: 25856 -.. date: 9611 -.. nonce: neCvXl -.. section: Core and Builtins - -The __module__ attribute of extension classes and functions now is interned. -This leads to more compact pickle data with protocol 4. - -.. - -.. bpo: 27213 -.. date: 9610 -.. nonce: VCfkkp -.. section: Core and Builtins - -Rework CALL_FUNCTION* opcodes to produce shorter and more efficient -bytecode. Patch by Demur Rumed, design by Serhiy Storchaka, reviewed by -Serhiy Storchaka and Victor Stinner. - -.. - -.. bpo: 26331 -.. date: 9609 -.. nonce: TdJp8_ -.. section: Core and Builtins - -Implement tokenizing support for :pep:`515`. Patch by Georg Brandl. - -.. - -.. bpo: 27999 -.. date: 9608 -.. nonce: 8aacQj -.. section: Core and Builtins - -Make "global after use" a SyntaxError, and ditto for nonlocal. Patch by Ivan -Levkivskyi. - -.. - -.. bpo: 28003 -.. date: 9607 -.. nonce: noeoav -.. section: Core and Builtins - -Implement :pep:`525` -- Asynchronous Generators. - -.. - -.. bpo: 27985 -.. date: 9606 -.. nonce: 0ayJ5k -.. section: Core and Builtins - -Implement :pep:`526` -- Syntax for Variable Annotations. Patch by Ivan -Levkivskyi. - -.. - -.. bpo: 26058 -.. date: 9605 -.. nonce: UR_ojv -.. section: Core and Builtins - -Add a new private version to the builtin dict type, incremented at each -dictionary creation and at each dictionary change. Implementation of the PEP -509. - -.. - -.. bpo: 27364 -.. date: 9604 -.. nonce: 8u_LoD -.. section: Core and Builtins - -A backslash-character pair that is not a valid escape sequence now generates -a DeprecationWarning. Patch by Emanuel Barry. - -.. - -.. bpo: 27350 -.. date: 9603 -.. nonce: aABzcL -.. section: Core and Builtins - -`dict` implementation is changed like PyPy. It is more compact and preserves -insertion order. (Concept developed by Raymond Hettinger and patch by Inada -Naoki.) - -.. - -.. bpo: 27911 -.. date: 9602 -.. nonce: 1eaHRd -.. section: Core and Builtins - -Remove unnecessary error checks in ``exec_builtin_or_dynamic()``. - -.. - -.. bpo: 27078 -.. date: 9601 -.. nonce: ZevPQR -.. section: Core and Builtins - -Added BUILD_STRING opcode. Optimized f-strings evaluation. - -.. - -.. bpo: 17884 -.. date: 9600 -.. nonce: wGy0dr -.. section: Core and Builtins - -Python now requires systems with inttypes.h and stdint.h - -.. - -.. bpo: 27961 -.. date: 9599 -.. nonce: EYS8oe -.. section: Core and Builtins - -Require platforms to support ``long long``. Python hasn't compiled without -``long long`` for years, so this is basically a formality. - -.. - -.. bpo: 27355 -.. date: 9598 -.. nonce: qdIpxm -.. section: Core and Builtins - -Removed support for Windows CE. It was never finished, and Windows CE is no -longer a relevant platform for Python. - -.. - -.. bpo: 0 -.. date: 9597 -.. nonce: rdhhVw -.. section: Core and Builtins - -Implement :pep:`523`. - -.. - -.. bpo: 27870 -.. date: 9596 -.. nonce: Y0u34u -.. section: Core and Builtins - -A left shift of zero by a large integer no longer attempts to allocate large -amounts of memory. - -.. - -.. bpo: 25402 -.. date: 9595 -.. nonce: naeRHq -.. section: Core and Builtins - -In int-to-decimal-string conversion, improve the estimate of the -intermediate memory required, and remove an unnecessarily strict overflow -check. Patch by Serhiy Storchaka. - -.. - -.. bpo: 27214 -.. date: 9594 -.. nonce: CDh8S4 -.. section: Core and Builtins - -In long_invert, be more careful about modifying object returned by long_add, -and remove an unnecessary check for small longs. Thanks Oren Milman for -analysis and patch. - -.. - -.. bpo: 27506 -.. date: 9593 -.. nonce: eK87PI -.. section: Core and Builtins - -Support passing the bytes/bytearray.translate() "delete" argument by -keyword. - -.. - -.. bpo: 27812 -.. date: 9592 -.. nonce: sidcs8 -.. section: Core and Builtins - -Properly clear out a generator's frame's backreference to the generator to -prevent crashes in frame.clear(). - -.. - -.. bpo: 27811 -.. date: 9591 -.. nonce: T4AuBo -.. section: Core and Builtins - -Fix a crash when a coroutine that has not been awaited is finalized with -warnings-as-errors enabled. - -.. - -.. bpo: 27587 -.. date: 9590 -.. nonce: mbavY2 -.. section: Core and Builtins - -Fix another issue found by PVS-Studio: Null pointer check after use of 'def' -in _PyState_AddModule(). Initial patch by Christian Heimes. - -.. - -.. bpo: 27792 -.. date: 9589 -.. nonce: Np6_Hl -.. section: Core and Builtins - -The modulo operation applied to ``bool`` and other ``int`` subclasses now -always returns an ``int``. Previously the return type depended on the input -values. Patch by Xiang Zhang. - -.. - -.. bpo: 26984 -.. date: 9588 -.. nonce: 7--80J -.. section: Core and Builtins - -int() now always returns an instance of exact int. - -.. - -.. bpo: 25604 -.. date: 9587 -.. nonce: UkeHGy -.. section: Core and Builtins - -Fix a minor bug in integer true division; this bug could potentially have -caused off-by-one-ulp results on platforms with unreliable ldexp -implementations. - -.. - -.. bpo: 24254 -.. date: 9586 -.. nonce: 368r1U -.. section: Core and Builtins - -Make class definition namespace ordered by default. - -.. - -.. bpo: 27662 -.. date: 9585 -.. nonce: a8cBpq -.. section: Core and Builtins - -Fix an overflow check in ``List_New``: the original code was checking -against ``Py_SIZE_MAX`` instead of the correct upper bound of -``Py_SSIZE_T_MAX``. Patch by Xiang Zhang. - -.. - -.. bpo: 27782 -.. date: 9584 -.. nonce: C8OBQD -.. section: Core and Builtins - -Multi-phase extension module import now correctly allows the ``m_methods`` -field to be used to add module level functions to instances of non-module -types returned from ``Py_create_mod``. Patch by Xiang Zhang. - -.. - -.. bpo: 27936 -.. date: 9583 -.. nonce: AdOann -.. section: Core and Builtins - -The round() function accepted a second None argument for some types but not -for others. Fixed the inconsistency by accepting None for all numeric -types. - -.. - -.. bpo: 27487 -.. date: 9582 -.. nonce: jeTQNr -.. section: Core and Builtins - -Warn if a submodule argument to "python -m" or runpy.run_module() is found -in sys.modules after parent packages are imported, but before the submodule -is executed. - -.. - -.. bpo: 27157 -.. date: 9581 -.. nonce: Wf_eFE -.. section: Core and Builtins - -Make only type() itself accept the one-argument form. Patch by Eryk Sun and -Emanuel Barry. - -.. - -.. bpo: 27558 -.. date: 9580 -.. nonce: VmltMh -.. section: Core and Builtins - -Fix a SystemError in the implementation of "raise" statement. In a brand new -thread, raise a RuntimeError since there is no active exception to reraise. -Patch written by Xiang Zhang. - -.. - -.. bpo: 28008 -.. date: 9579 -.. nonce: 0DdIrA -.. section: Core and Builtins - -Implement :pep:`530` -- asynchronous comprehensions. - -.. - -.. bpo: 27942 -.. date: 9578 -.. nonce: wCAkW5 -.. section: Core and Builtins - -Fix memory leak in codeobject.c - -.. - -.. bpo: 28732 -.. date: 9577 -.. nonce: xkG8k7 -.. section: Library - -Fix crash in os.spawnv() with no elements in args - -.. - -.. bpo: 28485 -.. date: 9576 -.. nonce: WuKqKh -.. section: Library - -Always raise ValueError for negative compileall.compile_dir(workers=...) -parameter, even when multithreading is unavailable. - -.. - -.. bpo: 28037 -.. date: 9575 -.. nonce: -3u7zq -.. section: Library - -Use sqlite3_get_autocommit() instead of setting Connection->inTransaction -manually. - -.. - -.. bpo: 25283 -.. date: 9574 -.. nonce: qwQDX2 -.. section: Library - -Attributes tm_gmtoff and tm_zone are now available on all platforms in the -return values of time.localtime() and time.gmtime(). - -.. - -.. bpo: 24454 -.. date: 9573 -.. nonce: pUTKOA -.. section: Library - -Regular expression match object groups are now accessible using __getitem__. -"mo[x]" is equivalent to "mo.group(x)". - -.. - -.. bpo: 10740 -.. date: 9572 -.. nonce: 8iGFan -.. section: Library - -sqlite3 no longer implicitly commit an open transaction before DDL -statements. - -.. - -.. bpo: 17941 -.. date: 9571 -.. nonce: E9rm_o -.. section: Library - -Add a *module* parameter to collections.namedtuple(). - -.. - -.. bpo: 22493 -.. date: 9570 -.. nonce: yDfUrj -.. section: Library - -Inline flags now should be used only at the start of the regular expression. -Deprecation warning is emitted if uses them in the middle of the regular -expression. - -.. - -.. bpo: 26885 -.. date: 9569 -.. nonce: TJ779X -.. section: Library - -xmlrpc now supports unmarshalling additional data types used by Apache -XML-RPC implementation for numerics and None. - -.. - -.. bpo: 28070 -.. date: 9568 -.. nonce: Kot8Hu -.. section: Library - -Fixed parsing inline verbose flag in regular expressions. - -.. - -.. bpo: 19500 -.. date: 9567 -.. nonce: H7q5im -.. section: Library - -Add client-side SSL session resumption to the ssl module. - -.. - -.. bpo: 28022 -.. date: 9566 -.. nonce: 08kTMg -.. section: Library - -Deprecate ssl-related arguments in favor of SSLContext. The deprecation -include manual creation of SSLSocket and certfile/keyfile (or similar) in -ftplib, httplib, imaplib, smtplib, poplib and urllib. - -.. - -.. bpo: 28043 -.. date: 9565 -.. nonce: 588Oy3 -.. section: Library - -SSLContext has improved default settings: OP_NO_SSLv2, OP_NO_SSLv3, -OP_NO_COMPRESSION, OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE, -OP_SINGLE_ECDH_USE and HIGH ciphers without MD5. - -.. - -.. bpo: 24693 -.. date: 9564 -.. nonce: a63Shp -.. section: Library - -Changed some RuntimeError's in the zipfile module to more appropriate types. -Improved some error messages and debugging output. - -.. - -.. bpo: 17909 -.. date: 9563 -.. nonce: SMNkt6 -.. section: Library - -``json.load`` and ``json.loads`` now support binary input encoded as UTF-8, -UTF-16 or UTF-32. Patch by Serhiy Storchaka. - -.. - -.. bpo: 27137 -.. date: 9562 -.. nonce: frjG8W -.. section: Library - -the pure Python fallback implementation of ``functools.partial`` now matches -the behaviour of its accelerated C counterpart for subclassing, pickling and -text representation purposes. Patch by Emanuel Barry and Serhiy Storchaka. - -.. - -.. bpo: 0 -.. date: 9561 -.. nonce: 81jNns -.. section: Library - -Fix possible integer overflows and crashes in the mmap module with unusual -usage patterns. - -.. - -.. bpo: 1703178 -.. date: 9560 -.. nonce: meb49K -.. section: Library - -Fix the ability to pass the --link-objects option to the distutils build_ext -command. - -.. - -.. bpo: 28019 -.. date: 9559 -.. nonce: KUhBaS -.. section: Library - -itertools.count() no longer rounds non-integer step in range between 1.0 and -2.0 to 1. - -.. - -.. bpo: 18401 -.. date: 9558 -.. nonce: _12WDV -.. section: Library - -Pdb now supports the 'readrc' keyword argument to control whether .pdbrc -files should be read. Patch by Martin Matusiak and Sam Kimbrel. - -.. - -.. bpo: 25969 -.. date: 9557 -.. nonce: qSPkl- -.. section: Library - -Update the lib2to3 grammar to handle the unpacking generalizations added in -3.5. - -.. - -.. bpo: 14977 -.. date: 9556 -.. nonce: 4MvALg -.. section: Library - -mailcap now respects the order of the lines in the mailcap files ("first -match"), as required by RFC 1542. Patch by Michael Lazar. - -.. - -.. bpo: 28082 -.. date: 9555 -.. nonce: EICw4d -.. section: Library - -Convert re flag constants to IntFlag. - -.. - -.. bpo: 28025 -.. date: 9554 -.. nonce: YxcZHY -.. section: Library - -Convert all ssl module constants to IntEnum and IntFlags. SSLContext -properties now return flags and enums. - -.. - -.. bpo: 23591 -.. date: 9553 -.. nonce: 7gSXAN -.. section: Library - -Add Flag, IntFlag, and auto() to enum module. - -.. - -.. bpo: 433028 -.. date: 9552 -.. nonce: yGjT0q -.. section: Library - -Added support of modifier spans in regular expressions. - -.. - -.. bpo: 24594 -.. date: 9551 -.. nonce: 9CnFVS -.. section: Library - -Validates persist parameter when opening MSI database - -.. - -.. bpo: 17582 -.. date: 9550 -.. nonce: MXEHxQ -.. section: Library - -xml.etree.ElementTree nows preserves whitespaces in attributes (Patch by -Duane Griffin. Reviewed and approved by Stefan Behnel.) - -.. - -.. bpo: 28047 -.. date: 9549 -.. nonce: pDu3Fm -.. section: Library - -Fixed calculation of line length used for the base64 CTE in the new email -policies. - -.. - -.. bpo: 27576 -.. date: 9548 -.. nonce: tqZxYv -.. section: Library - -Fix call order in OrderedDict.__init__(). - -.. - -.. bpo: 0 -.. date: 9547 -.. nonce: cxHuUo -.. section: Library - -email.generator.DecodedGenerator now supports the policy keyword. - -.. - -.. bpo: 28027 -.. date: 9546 -.. nonce: v39s1z -.. section: Library - -Remove undocumented modules from ``Lib/plat-*``: IN, CDROM, DLFCN, TYPES, -CDIO, and STROPTS. - -.. - -.. bpo: 27445 -.. date: 9545 -.. nonce: wOG0C0 -.. section: Library - -Don't pass str(_charset) to MIMEText.set_payload(). Patch by Claude Paroz. - -.. - -.. bpo: 24277 -.. date: 9544 -.. nonce: OgDA28 -.. section: Library - -The new email API is no longer provisional, and the docs have been -reorganized and rewritten to emphasize the new API. - -.. - -.. bpo: 22450 -.. date: 9543 -.. nonce: T3Sn_J -.. section: Library - -urllib now includes an ``Accept: */*`` header among the default headers. -This makes the results of REST API requests more consistent and predictable -especially when proxy servers are involved. - -.. - -.. bpo: 0 -.. date: 9542 -.. nonce: PVZStR -.. section: Library - -lib2to3.pgen3.driver.load_grammar() now creates a stable cache file between -runs given the same Grammar.txt input regardless of the hash randomization -setting. - -.. - -.. bpo: 28005 -.. date: 9541 -.. nonce: oJLK1w -.. section: Library - -Allow ImportErrors in encoding implementation to propagate. - -.. - -.. bpo: 26667 -.. date: 9540 -.. nonce: hWs9wA -.. section: Library - -Support path-like objects in importlib.util. - -.. - -.. bpo: 27570 -.. date: 9539 -.. nonce: pU0Zie -.. section: Library - -Avoid zero-length memcpy() etc calls with null source pointers in the -"ctypes" and "array" modules. - -.. - -.. bpo: 22233 -.. date: 9538 -.. nonce: uXSN0R -.. section: Library - -Break email header lines *only* on the RFC specified CR and LF characters, -not on arbitrary unicode line breaks. This also fixes a bug in HTTP header -parsing. - -.. - -.. bpo: 27331 -.. date: 9537 -.. nonce: akOxfh -.. section: Library - -The email.mime classes now all accept an optional policy keyword. - -.. - -.. bpo: 27988 -.. date: 9536 -.. nonce: VfMzZH -.. section: Library - -Fix email iter_attachments incorrect mutation of payload list. - -.. - -.. bpo: 16113 -.. date: 9535 -.. nonce: jyKRxs -.. section: Library - -Add SHA-3 and SHAKE support to hashlib module. - -.. - -.. bpo: 0 -.. date: 9534 -.. nonce: j7npJi -.. section: Library - -Eliminate a tautological-pointer-compare warning in _scproxy.c. - -.. - -.. bpo: 27776 -.. date: 9533 -.. nonce: dOJcUU -.. section: Library - -The :func:`os.urandom` function does now block on Linux 3.17 and newer until -the system urandom entropy pool is initialized to increase the security. -This change is part of the :pep:`524`. - -.. - -.. bpo: 27778 -.. date: 9532 -.. nonce: gvbf3F -.. section: Library - -Expose the Linux ``getrandom()`` syscall as a new :func:`os.getrandom` -function. This change is part of the :pep:`524`. - -.. - -.. bpo: 27691 -.. date: 9531 -.. nonce: TMYF5_ -.. section: Library - -Fix ssl module's parsing of GEN_RID subject alternative name fields in X.509 -certs. - -.. - -.. bpo: 18844 -.. date: 9530 -.. nonce: OZnLOi -.. section: Library - -Add random.choices(). - -.. - -.. bpo: 25761 -.. date: 9529 -.. nonce: qd--Ta -.. section: Library - -Improved error reporting about truncated pickle data in C implementation of -unpickler. UnpicklingError is now raised instead of AttributeError and -ValueError in some cases. - -.. - -.. bpo: 26798 -.. date: 9528 -.. nonce: he58yl -.. section: Library - -Add BLAKE2 (blake2b and blake2s) to hashlib. - -.. - -.. bpo: 26032 -.. date: 9527 -.. nonce: v5ByZW -.. section: Library - -Optimized globbing in pathlib by using os.scandir(); it is now about 1.5--4 -times faster. - -.. - -.. bpo: 25596 -.. date: 9526 -.. nonce: TFtyjC -.. section: Library - -Optimized glob() and iglob() functions in the glob module; they are now -about 3--6 times faster. - -.. - -.. bpo: 27928 -.. date: 9525 -.. nonce: vG2f6q -.. section: Library - -Add scrypt (password-based key derivation function) to hashlib module -(requires OpenSSL 1.1.0). - -.. - -.. bpo: 27850 -.. date: 9524 -.. nonce: kIVQ0m -.. section: Library - -Remove 3DES from ssl module's default cipher list to counter measure sweet32 -attack (CVE-2016-2183). - -.. - -.. bpo: 27766 -.. date: 9523 -.. nonce: WI70Tc -.. section: Library - -Add ChaCha20 Poly1305 to ssl module's default cipher list. (Required OpenSSL -1.1.0 or LibreSSL). - -.. - -.. bpo: 25387 -.. date: 9522 -.. nonce: -wsV59 -.. section: Library - -Check return value of winsound.MessageBeep. - -.. - -.. bpo: 27866 -.. date: 9521 -.. nonce: FM3-BZ -.. section: Library - -Add SSLContext.get_ciphers() method to get a list of all enabled ciphers. - -.. - -.. bpo: 27744 -.. date: 9520 -.. nonce: 2cVMpG -.. section: Library - -Add AF_ALG (Linux Kernel crypto) to socket module. - -.. - -.. bpo: 26470 -.. date: 9519 -.. nonce: QGu_wo -.. section: Library - -Port ssl and hashlib module to OpenSSL 1.1.0. - -.. - -.. bpo: 11620 -.. date: 9518 -.. nonce: JyL-Po -.. section: Library - -Fix support for SND_MEMORY in winsound.PlaySound. Based on a patch by Tim -Lesher. - -.. - -.. bpo: 11734 -.. date: 9517 -.. nonce: AQoy-q -.. section: Library - -Add support for IEEE 754 half-precision floats to the struct module. Based -on a patch by Eli Stevens. - -.. - -.. bpo: 27919 -.. date: 9516 -.. nonce: NRqNEW -.. section: Library - -Deprecated ``extra_path`` distribution option in distutils packaging. - -.. - -.. bpo: 23229 -.. date: 9515 -.. nonce: gXhSFh -.. section: Library - -Add new ``cmath`` constants: ``cmath.inf`` and ``cmath.nan`` to match -``math.inf`` and ``math.nan``, and also ``cmath.infj`` and ``cmath.nanj`` to -match the format used by complex repr. - -.. - -.. bpo: 27842 -.. date: 9514 -.. nonce: qlhp0- -.. section: Library - -The csv.DictReader now returns rows of type OrderedDict. (Contributed by -Steve Holden.) - -.. - -.. bpo: 0 -.. date: 9513 -.. nonce: 6TjEgz -.. section: Library - -Remove support for passing a file descriptor to os.access. It never worked -but previously didn't raise. - -.. - -.. bpo: 12885 -.. date: 9512 -.. nonce: r-IV1g -.. section: Library - -Fix error when distutils encounters symlink. - -.. - -.. bpo: 27881 -.. date: 9511 -.. nonce: fkETd9 -.. section: Library - -Fixed possible bugs when setting sqlite3.Connection.isolation_level. Based -on patch by Xiang Zhang. - -.. - -.. bpo: 27861 -.. date: 9510 -.. nonce: DBYuo9 -.. section: Library - -Fixed a crash in sqlite3.Connection.cursor() when a factory creates not a -cursor. Patch by Xiang Zhang. - -.. - -.. bpo: 19884 -.. date: 9509 -.. nonce: MO8AWH -.. section: Library - -Avoid spurious output on OS X with Gnu Readline. - -.. - -.. bpo: 27706 -.. date: 9508 -.. nonce: ZY67yu -.. section: Library - -Restore deterministic behavior of random.Random().seed() for string seeds -using seeding version 1. Allows sequences of calls to random() to exactly -match those obtained in Python 2. Patch by Nofar Schnider. - -.. - -.. bpo: 10513 -.. date: 9507 -.. nonce: tQIQD_ -.. section: Library - -Fix a regression in Connection.commit(). Statements should not be reset -after a commit. - -.. - -.. bpo: 12319 -.. date: 9506 -.. nonce: Wc4oUu -.. section: Library - -Chunked transfer encoding support added to http.client.HTTPConnection -requests. The urllib.request.AbstractHTTPHandler class does not enforce a -Content-Length header any more. If a HTTP request has a file or iterable -body, but no Content-Length header, the library now falls back to use -chunked transfer-encoding. - -.. - -.. bpo: 0 -.. date: 9505 -.. nonce: cYraeH -.. section: Library - -A new version of typing.py from https://github.com/python/typing: - -Collection (only for 3.6) (Issue #27598) - Add FrozenSet to __all__ -(upstream #261) - fix crash in _get_type_vars() (upstream #259) - Remove the -dict constraint in ForwardRef._eval_type (upstream #252) - -.. - -.. bpo: 27832 -.. date: 9504 -.. nonce: hxh6_h -.. section: Library - -Make ``_normalize`` parameter to ``Fraction`` constructor keyword-only, so -that ``Fraction(2, 3, 4)`` now raises ``TypeError``. - -.. - -.. bpo: 27539 -.. date: 9503 -.. nonce: S4L1cq -.. section: Library - -Fix unnormalised ``Fraction.__pow__`` result in the case of negative -exponent and negative base. - -.. - -.. bpo: 21718 -.. date: 9502 -.. nonce: FUJd-7 -.. section: Library - -cursor.description is now available for queries using CTEs. - -.. - -.. bpo: 27819 -.. date: 9501 -.. nonce: -A_u1x -.. section: Library - -In distutils sdists, simply produce the "gztar" (gzipped tar format) -distributions on all platforms unless "formats" is supplied. - -.. - -.. bpo: 2466 -.. date: 9500 -.. nonce: VRNlkg -.. section: Library - -posixpath.ismount now correctly recognizes mount points which the user does -not have permission to access. - -.. - -.. bpo: 9998 -.. date: 9499 -.. nonce: SNIoPr -.. section: Library - -On Linux, ctypes.util.find_library now looks in LD_LIBRARY_PATH for shared -libraries. - -.. - -.. bpo: 27573 -.. date: 9498 -.. nonce: yuXLnW -.. section: Library - -exit message for code.interact is now configurable. - -.. - -.. bpo: 27930 -.. date: 9497 -.. nonce: BkOfSi -.. section: Library - -Improved behaviour of logging.handlers.QueueListener. Thanks to Paulo -Andrade and Petr Viktorin for the analysis and patch. - -.. - -.. bpo: 6766 -.. date: 9496 -.. nonce: _zO4cV -.. section: Library - -Distributed reference counting added to multiprocessing to support nesting -of shared values / proxy objects. - -.. - -.. bpo: 21201 -.. date: 9495 -.. nonce: wLCKiA -.. section: Library - -Improves readability of multiprocessing error message. Thanks to Wojciech -Walczak for patch. - -.. - -.. bpo: 0 -.. date: 9494 -.. nonce: hgCs-W -.. section: Library - -asyncio: Add set_protocol / get_protocol to Transports. - -.. - -.. bpo: 27456 -.. date: 9493 -.. nonce: lI_IE7 -.. section: Library - -asyncio: Set TCP_NODELAY by default. - -.. - -.. bpo: 15308 -.. date: 9492 -.. nonce: zZxn8m -.. section: IDLE - -Add 'interrupt execution' (^C) to Shell menu. Patch by Roger Serwy, updated -by Bayard Randel. - -.. - -.. bpo: 27922 -.. date: 9491 -.. nonce: UEtEv9 -.. section: IDLE - -Stop IDLE tests from 'flashing' gui widgets on the screen. - -.. - -.. bpo: 27891 -.. date: 9490 -.. nonce: 7W5cAj -.. section: IDLE - -Consistently group and sort imports within idlelib modules. - -.. - -.. bpo: 17642 -.. date: 9489 -.. nonce: B0BNOB -.. section: IDLE - -add larger font sizes for classroom projection. - -.. - -.. bpo: 0 -.. date: 9488 -.. nonce: zWZs6o -.. section: IDLE - -Add version to title of IDLE help window. - -.. - -.. bpo: 25564 -.. date: 9487 -.. nonce: GN0p14 -.. section: IDLE - -In section on IDLE -- console differences, mention that using exec means -that __builtins__ is defined for each statement. - -.. - -.. bpo: 27821 -.. date: 9486 -.. nonce: Vzr42u -.. section: IDLE - -Fix 3.6.0a3 regression that prevented custom key sets from being selected -when no custom theme was defined. - -.. - -.. bpo: 26900 -.. date: 9485 -.. nonce: 0erSIc -.. section: C API - -Excluded underscored names and other private API from limited API. - -.. - -.. bpo: 26027 -.. date: 9484 -.. nonce: 5uVb7n -.. section: C API - -Add support for path-like objects in PyUnicode_FSConverter() & -PyUnicode_FSDecoder(). - -.. - -.. bpo: 27427 -.. date: 9483 -.. nonce: OGhkYQ -.. section: Tests - -Additional tests for the math module. Patch by Francisco Couzo. - -.. - -.. bpo: 27953 -.. date: 9482 -.. nonce: oP3nuf -.. section: Tests - -Skip math and cmath tests that fail on OS X 10.4 due to a poor libm -implementation of tan. - -.. - -.. bpo: 26040 -.. date: 9481 -.. nonce: RvSU5I -.. section: Tests - -Improve test_math and test_cmath coverage and rigour. Patch by Jeff Allen. - -.. - -.. bpo: 27787 -.. date: 9480 -.. nonce: kf0YAt -.. section: Tests - -Call gc.collect() before checking each test for "dangling threads", since -the dangling threads are weak references. - -.. - -.. bpo: 27566 -.. date: 9479 -.. nonce: xDWjEb -.. section: Build - -Fix clean target in freeze makefile (patch by Lisa Roach) - -.. - -.. bpo: 27705 -.. date: 9478 -.. nonce: 8C2Ms3 -.. section: Build - -Update message in validate_ucrtbase.py - -.. - -.. bpo: 27976 -.. date: 9477 -.. nonce: z0CT-3 -.. section: Build - -Deprecate building _ctypes with the bundled copy of libffi on non-OSX UNIX -platforms. - -.. - -.. bpo: 27983 -.. date: 9476 -.. nonce: jL_1n8 -.. section: Build - -Cause lack of llvm-profdata tool when using clang as required for PGO -linking to be a configure time error rather than make time when -``--with-optimizations`` is enabled. Also improve our ability to find the -llvm-profdata tool on MacOS and some Linuxes. - -.. - -.. bpo: 21590 -.. date: 9475 -.. nonce: haPolL -.. section: Build - -Support for DTrace and SystemTap probes. - -.. - -.. bpo: 26307 -.. date: 9474 -.. nonce: Puk2rd -.. section: Build - -The profile-opt build now applies PGO to the built-in modules. - -.. - -.. bpo: 26359 -.. date: 9473 -.. nonce: uxKCqR -.. section: Build - -Add the --with-optimizations flag to turn on LTO and PGO build support when -available. - -.. - -.. bpo: 27917 -.. date: 9472 -.. nonce: 8V2esX -.. section: Build - -Set platform triplets for Android builds. - -.. - -.. bpo: 25825 -.. date: 9471 -.. nonce: PwGiUI -.. section: Build - -Update references to the $(LIBPL) installation path on AIX. This path was -changed in 3.2a4. - -.. - -.. bpo: 0 -.. date: 9470 -.. nonce: G27B6T -.. section: Build - -Update OS X installer to use SQLite 3.14.1 and XZ 5.2.2. - -.. - -.. bpo: 21122 -.. date: 9469 -.. nonce: 98ovv8 -.. section: Build - -Fix LTO builds on OS X. - -.. - -.. bpo: 17128 -.. date: 9468 -.. nonce: jd3Cll -.. section: Build - -Build OS X installer with a private copy of OpenSSL. Also provide a sample -Install Certificates command script to install a set of root certificates -from the third-party certifi module. - -.. - -.. bpo: 27952 -.. date: 9467 -.. nonce: WX9Ufc -.. section: Tools/Demos - -Get Tools/scripts/fixcid.py working with Python 3 and the current "re" -module, avoid invalid Python backslash escapes, and fix a bug parsing -escaped C quote signs. - -.. - -.. bpo: 28065 -.. date: 9466 -.. nonce: TUW63o -.. section: Windows - -Update xz dependency to 5.2.2 and build it from source. - -.. - -.. bpo: 25144 -.. date: 9465 -.. nonce: iUha52 -.. section: Windows - -Ensures TargetDir is set before continuing with custom install. - -.. - -.. bpo: 1602 -.. date: 9464 -.. nonce: 5Kowx0 -.. section: Windows - -Windows console doesn't input or print Unicode (PEP 528) - -.. - -.. bpo: 27781 -.. date: 9463 -.. nonce: 21eQH2 -.. section: Windows - -Change file system encoding on Windows to UTF-8 (PEP 529) - -.. - -.. bpo: 27731 -.. date: 9462 -.. nonce: U2HSrC -.. section: Windows - -Opt-out of MAX_PATH on Windows 10 - -.. - -.. bpo: 6135 -.. date: 9461 -.. nonce: pACuPJ -.. section: Windows - -Adds encoding and errors parameters to subprocess. - -.. - -.. bpo: 27959 -.. date: 9460 -.. nonce: JamSoC -.. section: Windows - -Adds oem encoding, alias ansi to mbcs, move aliasmbcs to codec lookup. - -.. - -.. bpo: 27982 -.. date: 9459 -.. nonce: xrUa9R -.. section: Windows - -The functions of the winsound module now accept keyword arguments. - -.. - -.. bpo: 20366 -.. date: 9458 -.. nonce: s6b-ut -.. section: Windows - -Build full text search support into SQLite on Windows. - -.. - -.. bpo: 27756 -.. date: 9457 -.. nonce: PDAoGy -.. section: Windows - -Adds new icons for Python files and processes on Windows. Designs by Cherry -Wang. - -.. - -.. bpo: 27883 -.. date: 9456 -.. nonce: vyOnxj -.. section: Windows - -Update sqlite to 3.14.1.0 on Windows. diff --git a/Misc/NEWS.d/3.6.0b2.rst b/Misc/NEWS.d/3.6.0b2.rst deleted file mode 100644 index 627465e887bc185523f2906c1fd24535e8bf7ba8..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.0b2.rst +++ /dev/null @@ -1,838 +0,0 @@ -.. bpo: 28183 -.. date: 9707 -.. nonce: MJZeNd -.. release date: 2016-10-10 -.. section: Core and Builtins - -Optimize and cleanup dict iteration. - -.. - -.. bpo: 26081 -.. date: 9706 -.. nonce: _x5vjl -.. section: Core and Builtins - -Added C implementation of asyncio.Future. Original patch by Yury Selivanov. - -.. - -.. bpo: 28379 -.. date: 9705 -.. nonce: DuXlco -.. section: Core and Builtins - -Added sanity checks and tests for PyUnicode_CopyCharacters(). Patch by Xiang -Zhang. - -.. - -.. bpo: 28376 -.. date: 9704 -.. nonce: oPD-5D -.. section: Core and Builtins - -The type of long range iterator is now registered as Iterator. Patch by Oren -Milman. - -.. - -.. bpo: 28376 -.. date: 9703 -.. nonce: YEy-uG -.. section: Core and Builtins - -Creating instances of range_iterator by calling range_iterator type now is -deprecated. Patch by Oren Milman. - -.. - -.. bpo: 28376 -.. date: 9702 -.. nonce: fLeHM2 -.. section: Core and Builtins - -The constructor of range_iterator now checks that step is not 0. Patch by -Oren Milman. - -.. - -.. bpo: 26906 -.. date: 9701 -.. nonce: YBjcwI -.. section: Core and Builtins - -Resolving special methods of uninitialized type now causes implicit -initialization of the type instead of a fail. - -.. - -.. bpo: 18287 -.. date: 9700 -.. nonce: k6jffS -.. section: Core and Builtins - -PyType_Ready() now checks that tp_name is not NULL. Original patch by Niklas -Koep. - -.. - -.. bpo: 24098 -.. date: 9699 -.. nonce: XqlP_1 -.. section: Core and Builtins - -Fixed possible crash when AST is changed in process of compiling it. - -.. - -.. bpo: 28201 -.. date: 9698 -.. nonce: GWUxAy -.. section: Core and Builtins - -Dict reduces possibility of 2nd conflict in hash table when hashes have same -lower bits. - -.. - -.. bpo: 28350 -.. date: 9697 -.. nonce: 8M5Eg9 -.. section: Core and Builtins - -String constants with null character no longer interned. - -.. - -.. bpo: 26617 -.. date: 9696 -.. nonce: Gh5LvN -.. section: Core and Builtins - -Fix crash when GC runs during weakref callbacks. - -.. - -.. bpo: 27942 -.. date: 9695 -.. nonce: ZGuhns -.. section: Core and Builtins - -String constants now interned recursively in tuples and frozensets. - -.. - -.. bpo: 21578 -.. date: 9694 -.. nonce: GI1bhj -.. section: Core and Builtins - -Fixed misleading error message when ImportError called with invalid keyword -args. - -.. - -.. bpo: 28203 -.. date: 9693 -.. nonce: LRn5vp -.. section: Core and Builtins - -Fix incorrect type in complex(1.0, {2:3}) error message. Patch by Soumya -Sharma. - -.. - -.. bpo: 28086 -.. date: 9692 -.. nonce: JsQPMQ -.. section: Core and Builtins - -Single var-positional argument of tuple subtype was passed unscathed to the -C-defined function. Now it is converted to exact tuple. - -.. - -.. bpo: 28214 -.. date: 9691 -.. nonce: zQF8Em -.. section: Core and Builtins - -Now __set_name__ is looked up on the class instead of the instance. - -.. - -.. bpo: 27955 -.. date: 9690 -.. nonce: HC4pZ4 -.. section: Core and Builtins - -Fallback on reading /dev/urandom device when the getrandom() syscall fails -with EPERM, for example when blocked by SECCOMP. - -.. - -.. bpo: 28192 -.. date: 9689 -.. nonce: eR6stU -.. section: Core and Builtins - -Don't import readline in isolated mode. - -.. - -.. bpo: 0 -.. date: 9688 -.. nonce: 9EbOiD -.. section: Core and Builtins - -Upgrade internal unicode databases to Unicode version 9.0.0. - -.. - -.. bpo: 28131 -.. date: 9687 -.. nonce: owq0wW -.. section: Core and Builtins - -Fix a regression in zipimport's compile_source(). zipimport should use the -same optimization level as the interpreter. - -.. - -.. bpo: 28126 -.. date: 9686 -.. nonce: Qf6-uQ -.. section: Core and Builtins - -Replace Py_MEMCPY with memcpy(). Visual Studio can properly optimize -memcpy(). - -.. - -.. bpo: 28120 -.. date: 9685 -.. nonce: e5xc1i -.. section: Core and Builtins - -Fix dict.pop() for splitted dictionary when trying to remove a "pending key" -(Not yet inserted in split-table). Patch by Xiang Zhang. - -.. - -.. bpo: 26182 -.. date: 9684 -.. nonce: jYlqTO -.. section: Core and Builtins - -Raise DeprecationWarning when async and await keywords are used as -variable/attribute/class/function name. - -.. - -.. bpo: 27998 -.. date: 9683 -.. nonce: CPhy4H -.. section: Library - -Fixed bytes path support in os.scandir() on Windows. Patch by Eryk Sun. - -.. - -.. bpo: 28317 -.. date: 9682 -.. nonce: LgHleA -.. section: Library - -The disassembler now decodes FORMAT_VALUE argument. - -.. - -.. bpo: 26293 -.. date: 9681 -.. nonce: 2mjvwX -.. section: Library - -Fixed writing ZIP files that starts not from the start of the file. Offsets -in ZIP file now are relative to the start of the archive in conforming to -the specification. - -.. - -.. bpo: 28380 -.. date: 9680 -.. nonce: jKPMzH -.. section: Library - -unittest.mock Mock autospec functions now properly support assert_called, -assert_not_called, and assert_called_once. - -.. - -.. bpo: 27181 -.. date: 9679 -.. nonce: SQyDpC -.. section: Library - -remove statistics.geometric_mean and defer until 3.7. - -.. - -.. bpo: 28229 -.. date: 9678 -.. nonce: BKAxcS -.. section: Library - -lzma module now supports pathlib. - -.. - -.. bpo: 28321 -.. date: 9677 -.. nonce: bQ-IIX -.. section: Library - -Fixed writing non-BMP characters with binary format in plistlib. - -.. - -.. bpo: 28225 -.. date: 9676 -.. nonce: 6N28nu -.. section: Library - -bz2 module now supports pathlib. Initial patch by Ethan Furman. - -.. - -.. bpo: 28227 -.. date: 9675 -.. nonce: 7lUz8i -.. section: Library - -gzip now supports pathlib. Patch by Ethan Furman. - -.. - -.. bpo: 27358 -.. date: 9674 -.. nonce: t288Iv -.. section: Library - -Optimized merging var-keyword arguments and improved error message when -passing a non-mapping as a var-keyword argument. - -.. - -.. bpo: 28257 -.. date: 9673 -.. nonce: SVD_IH -.. section: Library - -Improved error message when passing a non-iterable as a var-positional -argument. Added opcode BUILD_TUPLE_UNPACK_WITH_CALL. - -.. - -.. bpo: 28322 -.. date: 9672 -.. nonce: l9hzap -.. section: Library - -Fixed possible crashes when unpickle itertools objects from incorrect pickle -data. Based on patch by John Leitch. - -.. - -.. bpo: 28228 -.. date: 9671 -.. nonce: 1qBwdM -.. section: Library - -imghdr now supports pathlib. - -.. - -.. bpo: 28226 -.. date: 9670 -.. nonce: nMXiwU -.. section: Library - -compileall now supports pathlib. - -.. - -.. bpo: 28314 -.. date: 9669 -.. nonce: N7YrkN -.. section: Library - -Fix function declaration (C flags) for the getiterator() method of -xml.etree.ElementTree.Element. - -.. - -.. bpo: 28148 -.. date: 9668 -.. nonce: Flzndx -.. section: Library - -Stop using localtime() and gmtime() in the time module. -Introduced platform independent _PyTime_localtime API that is similar to -POSIX localtime_r, but available on all platforms. Patch by Ed Schouten. - -.. - -.. bpo: 28253 -.. date: 9667 -.. nonce: aLfmhe -.. section: Library - -Fixed calendar functions for extreme months: 0001-01 and 9999-12. -Methods itermonthdays() and itermonthdays2() are reimplemented so that they -don't call itermonthdates() which can cause datetime.date under/overflow. - -.. - -.. bpo: 28275 -.. date: 9666 -.. nonce: EhWIsz -.. section: Library - -Fixed possible use after free in the decompress() methods of the -LZMADecompressor and BZ2Decompressor classes. Original patch by John Leitch. - -.. - -.. bpo: 27897 -.. date: 9665 -.. nonce: I0Ppmx -.. section: Library - -Fixed possible crash in sqlite3.Connection.create_collation() if pass -invalid string-like object as a name. Patch by Xiang Zhang. - -.. - -.. bpo: 18844 -.. date: 9664 -.. nonce: fQsEdn -.. section: Library - -random.choices() now has k as a keyword-only argument to improve the -readability of common cases and come into line with the signature used in -other languages. - -.. - -.. bpo: 18893 -.. date: 9663 -.. nonce: osiX5c -.. section: Library - -Fix invalid exception handling in Lib/ctypes/macholib/dyld.py. Patch by -Madison May. - -.. - -.. bpo: 27611 -.. date: 9662 -.. nonce: A_ArH_ -.. section: Library - -Fixed support of default root window in the tkinter.tix module. Added the -master parameter in the DisplayStyle constructor. - -.. - -.. bpo: 27348 -.. date: 9661 -.. nonce: tDx7Vw -.. section: Library - -In the traceback module, restore the formatting of exception messages like -"Exception: None". This fixes a regression introduced in 3.5a2. - -.. - -.. bpo: 25651 -.. date: 9660 -.. nonce: 3UhyPo -.. section: Library - -Allow falsy values to be used for msg parameter of subTest(). - -.. - -.. bpo: 27778 -.. date: 9659 -.. nonce: Yyo1aP -.. section: Library - -Fix a memory leak in os.getrandom() when the getrandom() is interrupted by a -signal and a signal handler raises a Python exception. - -.. - -.. bpo: 28200 -.. date: 9658 -.. nonce: 4IEbr7 -.. section: Library - -Fix memory leak on Windows in the os module (fix path_converter() function). - -.. - -.. bpo: 25400 -.. date: 9657 -.. nonce: d9Qn0E -.. section: Library - -RobotFileParser now correctly returns default values for crawl_delay and -request_rate. Initial patch by Peter Wirtz. - -.. - -.. bpo: 27932 -.. date: 9656 -.. nonce: mtgl-6 -.. section: Library - -Prevent memory leak in win32_ver(). - -.. - -.. bpo: 0 -.. date: 9655 -.. nonce: iPpjqX -.. section: Library - -Fix UnboundLocalError in socket._sendfile_use_sendfile. - -.. - -.. bpo: 28075 -.. date: 9654 -.. nonce: aLiUs9 -.. section: Library - -Check for ERROR_ACCESS_DENIED in Windows implementation of os.stat(). Patch -by Eryk Sun. - -.. - -.. bpo: 22493 -.. date: 9653 -.. nonce: Mv_hZf -.. section: Library - -Warning message emitted by using inline flags in the middle of regular -expression now contains a (truncated) regex pattern. Patch by Tim Graham. - -.. - -.. bpo: 25270 -.. date: 9652 -.. nonce: jrZruM -.. section: Library - -Prevent codecs.escape_encode() from raising SystemError when an empty -bytestring is passed. - -.. - -.. bpo: 28181 -.. date: 9651 -.. nonce: NGc4Yv -.. section: Library - -Get antigravity over HTTPS. Patch by Kaartic Sivaraam. - -.. - -.. bpo: 25895 -.. date: 9650 -.. nonce: j92qoQ -.. section: Library - -Enable WebSocket URL schemes in urllib.parse.urljoin. Patch by Gergely Imreh -and Markus Holtermann. - -.. - -.. bpo: 28114 -.. date: 9649 -.. nonce: gmFXsA -.. section: Library - -Fix a crash in parse_envlist() when env contains byte strings. Patch by Eryk -Sun. - -.. - -.. bpo: 27599 -.. date: 9648 -.. nonce: itvm8T -.. section: Library - -Fixed buffer overrun in binascii.b2a_qp() and binascii.a2b_qp(). - -.. - -.. bpo: 27906 -.. date: 9647 -.. nonce: TBBXrv -.. section: Library - -Fix socket accept exhaustion during high TCP traffic. Patch by Kevin Conway. - -.. - -.. bpo: 28174 -.. date: 9646 -.. nonce: CV1UdI -.. section: Library - -Handle when SO_REUSEPORT isn't properly supported. Patch by Seth Michael -Larson. - -.. - -.. bpo: 26654 -.. date: 9645 -.. nonce: XtzTE9 -.. section: Library - -Inspect functools.partial in asyncio.Handle.__repr__. Patch by iceboy. - -.. - -.. bpo: 26909 -.. date: 9644 -.. nonce: ASiakT -.. section: Library - -Fix slow pipes IO in asyncio. Patch by INADA Naoki. - -.. - -.. bpo: 28176 -.. date: 9643 -.. nonce: sU8R6L -.. section: Library - -Fix callbacks race in asyncio.SelectorLoop.sock_connect. - -.. - -.. bpo: 27759 -.. date: 9642 -.. nonce: qpMDGq -.. section: Library - -Fix selectors incorrectly retain invalid file descriptors. Patch by Mark -Williams. - -.. - -.. bpo: 28368 -.. date: 9641 -.. nonce: fGl9y4 -.. section: Library - -Refuse monitoring processes if the child watcher has no loop attached. Patch -by Vincent Michel. - -.. - -.. bpo: 28369 -.. date: 9640 -.. nonce: 8DTANe -.. section: Library - -Raise RuntimeError when transport's FD is used with add_reader, add_writer, -etc. - -.. - -.. bpo: 28370 -.. date: 9639 -.. nonce: 18jBuZ -.. section: Library - -Speedup asyncio.StreamReader.readexactly. Patch by Коренберг Марк. - -.. - -.. bpo: 28371 -.. date: 9638 -.. nonce: U9Zqdk -.. section: Library - -Deprecate passing asyncio.Handles to run_in_executor. - -.. - -.. bpo: 28372 -.. date: 9637 -.. nonce: njcIPk -.. section: Library - -Fix asyncio to support formatting of non-python coroutines. - -.. - -.. bpo: 28399 -.. date: 9636 -.. nonce: QKIqRX -.. section: Library - -Remove UNIX socket from FS before binding. Patch by Коренберг Марк. - -.. - -.. bpo: 27972 -.. date: 9635 -.. nonce: ZK-GFm -.. section: Library - -Prohibit Tasks to await on themselves. - -.. - -.. bpo: 28402 -.. date: 9634 -.. nonce: v9zETJ -.. section: Windows - -Adds signed catalog files for stdlib on Windows. - -.. - -.. bpo: 28333 -.. date: 9633 -.. nonce: KnpeO4 -.. section: Windows - -Enables Unicode for ps1/ps2 and input() prompts. (Patch by Eryk Sun) - -.. - -.. bpo: 28251 -.. date: 9632 -.. nonce: tR_AFs -.. section: Windows - -Improvements to help manuals on Windows. - -.. - -.. bpo: 28110 -.. date: 9631 -.. nonce: cnkP5F -.. section: Windows - -launcher.msi has different product codes between 32-bit and 64-bit - -.. - -.. bpo: 28161 -.. date: 9630 -.. nonce: hF91LI -.. section: Windows - -Opening CON for write access fails - -.. - -.. bpo: 28162 -.. date: 9629 -.. nonce: 3FHPVD -.. section: Windows - -WindowsConsoleIO readall() fails if first line starts with Ctrl+Z - -.. - -.. bpo: 28163 -.. date: 9628 -.. nonce: -DUgJw -.. section: Windows - -WindowsConsoleIO fileno() passes wrong flags to _open_osfhandle - -.. - -.. bpo: 28164 -.. date: 9627 -.. nonce: 5MfN0J -.. section: Windows - -_PyIO_get_console_type fails for various paths - -.. - -.. bpo: 28137 -.. date: 9626 -.. nonce: C1uvzY -.. section: Windows - -Renames Windows path file to ._pth - -.. - -.. bpo: 28138 -.. date: 9625 -.. nonce: pNdv64 -.. section: Windows - -Windows ._pth file should allow import site - -.. - -.. bpo: 28426 -.. date: 9624 -.. nonce: zPwvbI -.. section: C API - -Deprecated undocumented functions PyUnicode_AsEncodedObject(), -PyUnicode_AsDecodedObject(), PyUnicode_AsDecodedUnicode() and -PyUnicode_AsEncodedUnicode(). - -.. - -.. bpo: 28258 -.. date: 9623 -.. nonce: iKtAHd -.. section: Build - -Fixed build with Estonian locale (python-config and distclean targets in -Makefile). Patch by Arfrever Frehtes Taifersar Arahesis. - -.. - -.. bpo: 26661 -.. date: 9622 -.. nonce: Z_HNbs -.. section: Build - -setup.py now detects system libffi with multiarch wrapper. - -.. - -.. bpo: 15819 -.. date: 9621 -.. nonce: QVDr3E -.. section: Build - -Remove redundant include search directory option for building outside the -source tree. - -.. - -.. bpo: 28217 -.. date: 9620 -.. nonce: Y37OKV -.. section: Tests - -Adds _testconsole module to test console input. diff --git a/Misc/NEWS.d/3.6.0b3.rst b/Misc/NEWS.d/3.6.0b3.rst deleted file mode 100644 index 4233708aedbd41f5916a014891e29f403aa80937..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.0b3.rst +++ /dev/null @@ -1,355 +0,0 @@ -.. bpo: 28128 -.. date: 9744 -.. nonce: Lc2sFu -.. release date: 2016-10-31 -.. section: Core and Builtins - -Deprecation warning for invalid str and byte escape sequences now prints -better information about where the error occurs. Patch by Serhiy Storchaka -and Eric Smith. - -.. - -.. bpo: 28509 -.. date: 9743 -.. nonce: _Fa4Uq -.. section: Core and Builtins - -dict.update() no longer allocate unnecessary large memory. - -.. - -.. bpo: 28426 -.. date: 9742 -.. nonce: E_quyK -.. section: Core and Builtins - -Fixed potential crash in PyUnicode_AsDecodedObject() in debug build. - -.. - -.. bpo: 28517 -.. date: 9741 -.. nonce: ExPkm9 -.. section: Core and Builtins - -Fixed of-by-one error in the peephole optimizer that caused keeping -unreachable code. - -.. - -.. bpo: 28214 -.. date: 9740 -.. nonce: 6ECJox -.. section: Core and Builtins - -Improved exception reporting for problematic __set_name__ attributes. - -.. - -.. bpo: 23782 -.. date: 9739 -.. nonce: lonDzj -.. section: Core and Builtins - -Fixed possible memory leak in _PyTraceback_Add() and exception loss in -PyTraceBack_Here(). - -.. - -.. bpo: 28471 -.. date: 9738 -.. nonce: Vd5pv7 -.. section: Core and Builtins - -Fix "Python memory allocator called without holding the GIL" crash in -socket.setblocking. - -.. - -.. bpo: 27517 -.. date: 9737 -.. nonce: 1CYM8A -.. section: Library - -LZMA compressor and decompressor no longer raise exceptions if given empty -data twice. Patch by Benjamin Fogle. - -.. - -.. bpo: 28549 -.. date: 9736 -.. nonce: ShnM2y -.. section: Library - -Fixed segfault in curses's addch() with ncurses6. - -.. - -.. bpo: 28449 -.. date: 9735 -.. nonce: 5JK6ES -.. section: Library - -tarfile.open() with mode "r" or "r:" now tries to open a tar file with -compression before trying to open it without compression. Otherwise it had -50% chance failed with ignore_zeros=True. - -.. - -.. bpo: 23262 -.. date: 9734 -.. nonce: 6EVB7N -.. section: Library - -The webbrowser module now supports Firefox 36+ and derived browsers. Based -on patch by Oleg Broytman. - -.. - -.. bpo: 27939 -.. date: 9733 -.. nonce: mTfADV -.. section: Library - -Fixed bugs in tkinter.ttk.LabeledScale and tkinter.Scale caused by -representing the scale as float value internally in Tk. tkinter.IntVar now -works if float value is set to underlying Tk variable. - -.. - -.. bpo: 18844 -.. date: 9732 -.. nonce: oif1-H -.. section: Library - -The various ways of specifying weights for random.choices() now produce the -same result sequences. - -.. - -.. bpo: 28255 -.. date: 9731 -.. nonce: _ZH4wm -.. section: Library - -calendar.TextCalendar().prmonth() no longer prints a space at the start of -new line after printing a month's calendar. Patch by Xiang Zhang. - -.. - -.. bpo: 20491 -.. date: 9730 -.. nonce: ObgnQ2 -.. section: Library - -The textwrap.TextWrapper class now honors non-breaking spaces. Based on -patch by Kaarle Ritvanen. - -.. - -.. bpo: 28353 -.. date: 9729 -.. nonce: sKGbLL -.. section: Library - -os.fwalk() no longer fails on broken links. - -.. - -.. bpo: 28430 -.. date: 9728 -.. nonce: 4MiEYT -.. section: Library - -Fix iterator of C implemented asyncio.Future doesn't accept non-None value -is passed to it.send(val). - -.. - -.. bpo: 27025 -.. date: 9727 -.. nonce: foAViS -.. section: Library - -Generated names for Tkinter widgets now start by the "!" prefix for -readability. - -.. - -.. bpo: 25464 -.. date: 9726 -.. nonce: HDUTCu -.. section: Library - -Fixed HList.header_exists() in tkinter.tix module by addin a workaround to -Tix library bug. - -.. - -.. bpo: 28488 -.. date: 9725 -.. nonce: TgO112 -.. section: Library - -shutil.make_archive() no longer adds entry "./" to ZIP archive. - -.. - -.. bpo: 25953 -.. date: 9724 -.. nonce: EKKJAQ -.. section: Library - -re.sub() now raises an error for invalid numerical group reference in -replacement template even if the pattern is not found in the string. Error -message for invalid group reference now includes the group index and the -position of the reference. Based on patch by SilentGhost. - -.. - -.. bpo: 18219 -.. date: 9723 -.. nonce: 1ANQN1 -.. section: Library - -Optimize csv.DictWriter for large number of columns. Patch by Mariatta -Wijaya. - -.. - -.. bpo: 28448 -.. date: 9722 -.. nonce: 5bduWe -.. section: Library - -Fix C implemented asyncio.Future didn't work on Windows. - -.. - -.. bpo: 28480 -.. date: 9721 -.. nonce: 9lHw6m -.. section: Library - -Fix error building socket module when multithreading is disabled. - -.. - -.. bpo: 24452 -.. date: 9720 -.. nonce: m9Kyg3 -.. section: Library - -Make webbrowser support Chrome on Mac OS X. - -.. - -.. bpo: 20766 -.. date: 9719 -.. nonce: 4kvCzx -.. section: Library - -Fix references leaked by pdb in the handling of SIGINT handlers. - -.. - -.. bpo: 28492 -.. date: 9718 -.. nonce: pFRLQE -.. section: Library - -Fix how StopIteration exception is raised in _asyncio.Future. - -.. - -.. bpo: 28500 -.. date: 9717 -.. nonce: NINKzZ -.. section: Library - -Fix asyncio to handle async gens GC from another thread. - -.. - -.. bpo: 26923 -.. date: 9716 -.. nonce: 8dh3AV -.. section: Library - -Fix asyncio.Gather to refuse being cancelled once all children are done. -Patch by Johannes Ebke. - -.. - -.. bpo: 26796 -.. date: 9715 -.. nonce: TZyAfJ -.. section: Library - -Don't configure the number of workers for default threadpool executor. -Initial patch by Hans Lawrenz. - -.. - -.. bpo: 28544 -.. date: 9714 -.. nonce: KD1oFP -.. section: Library - -Implement asyncio.Task in C. - -.. - -.. bpo: 28522 -.. date: 9713 -.. nonce: XHMQa7 -.. section: Windows - -Fixes mishandled buffer reallocation in getpathp.c - -.. - -.. bpo: 28444 -.. date: 9712 -.. nonce: zkc9nT -.. section: Build - -Fix missing extensions modules when cross compiling. - -.. - -.. bpo: 28208 -.. date: 9711 -.. nonce: DtoP1i -.. section: Build - -Update Windows build and OS X installers to use SQLite 3.14.2. - -.. - -.. bpo: 28248 -.. date: 9710 -.. nonce: KY_-en -.. section: Build - -Update Windows build and OS X installers to use OpenSSL 1.0.2j. - -.. - -.. bpo: 26944 -.. date: 9709 -.. nonce: ChZ_BO -.. section: Tests - -Fix test_posix for Android where 'id -G' is entirely wrong or missing the -effective gid. - -.. - -.. bpo: 28409 -.. date: 9708 -.. nonce: Q2IlxJ -.. section: Tests - -regrtest: fix the parser of command line arguments. diff --git a/Misc/NEWS.d/3.6.0b4.rst b/Misc/NEWS.d/3.6.0b4.rst deleted file mode 100644 index a8e408619af09d73a675cf463b65df674ae97e7d..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.0b4.rst +++ /dev/null @@ -1,327 +0,0 @@ -.. bpo: 28532 -.. date: 9778 -.. nonce: KEYJny -.. release date: 2016-11-21 -.. section: Core and Builtins - -Show sys.version when -V option is supplied twice. - -.. - -.. bpo: 27100 -.. date: 9777 -.. nonce: poVjXq -.. section: Core and Builtins - -The with-statement now checks for __enter__ before it checks for __exit__. -This gives less confusing error messages when both methods are missing. -Patch by Jonathan Ellington. - -.. - -.. bpo: 28746 -.. date: 9776 -.. nonce: r5MXdB -.. section: Core and Builtins - -Fix the set_inheritable() file descriptor method on platforms that do not -have the ioctl FIOCLEX and FIONCLEX commands. - -.. - -.. bpo: 26920 -.. date: 9775 -.. nonce: 1URwGb -.. section: Core and Builtins - -Fix not getting the locale's charset upon initializing the interpreter, on -platforms that do not have langinfo. - -.. - -.. bpo: 28648 -.. date: 9774 -.. nonce: z7B52W -.. section: Core and Builtins - -Fixed crash in Py_DecodeLocale() in debug build on Mac OS X when decode -astral characters. Patch by Xiang Zhang. - -.. - -.. bpo: 19398 -.. date: 9773 -.. nonce: RYbEGH -.. section: Core and Builtins - -Extra slash no longer added to sys.path components in case of empty -compile-time PYTHONPATH components. - -.. - -.. bpo: 28665 -.. date: 9772 -.. nonce: v4nx86 -.. section: Core and Builtins - -Improve speed of the STORE_DEREF opcode by 40%. - -.. - -.. bpo: 28583 -.. date: 9771 -.. nonce: F-QAx1 -.. section: Core and Builtins - -PyDict_SetDefault didn't combine split table when needed. Patch by Xiang -Zhang. - -.. - -.. bpo: 27243 -.. date: 9770 -.. nonce: 61E6K5 -.. section: Core and Builtins - -Change PendingDeprecationWarning -> DeprecationWarning. As it was agreed in -the issue, __aiter__ returning an awaitable should result in -PendingDeprecationWarning in 3.5 and in DeprecationWarning in 3.6. - -.. - -.. bpo: 26182 -.. date: 9769 -.. nonce: a8JXK2 -.. section: Core and Builtins - -Fix a refleak in code that raises DeprecationWarning. - -.. - -.. bpo: 28721 -.. date: 9768 -.. nonce: BO9BUF -.. section: Core and Builtins - -Fix asynchronous generators aclose() and athrow() to handle -StopAsyncIteration propagation properly. - -.. - -.. bpo: 28752 -.. date: 9767 -.. nonce: Q-4oRE -.. section: Library - -Restored the __reduce__() methods of datetime objects. - -.. - -.. bpo: 28727 -.. date: 9766 -.. nonce: ubZP_b -.. section: Library - -Regular expression patterns, _sre.SRE_Pattern objects created by -re.compile(), become comparable (only x==y and x!=y operators). This change -should fix the issue #18383: don't duplicate warning filters when the -warnings module is reloaded (thing usually only done in unit tests). - -.. - -.. bpo: 20572 -.. date: 9765 -.. nonce: lGXaH9 -.. section: Library - -The subprocess.Popen.wait method's undocumented endtime parameter now raises -a DeprecationWarning. - -.. - -.. bpo: 25659 -.. date: 9764 -.. nonce: lE2IlT -.. section: Library - -In ctypes, prevent a crash calling the from_buffer() and from_buffer_copy() -methods on abstract classes like Array. - -.. - -.. bpo: 19717 -.. date: 9763 -.. nonce: HXCAIz -.. section: Library - -Makes Path.resolve() succeed on paths that do not exist. Patch by Vajrasky -Kok - -.. - -.. bpo: 28563 -.. date: 9762 -.. nonce: iweEiw -.. section: Library - -Fixed possible DoS and arbitrary code execution when handle plural form -selections in the gettext module. The expression parser now supports exact -syntax supported by GNU gettext. - -.. - -.. bpo: 28387 -.. date: 9761 -.. nonce: 1clJu7 -.. section: Library - -Fixed possible crash in _io.TextIOWrapper deallocator when the garbage -collector is invoked in other thread. Based on patch by Sebastian Cufre. - -.. - -.. bpo: 28600 -.. date: 9760 -.. nonce: wMVrjN -.. section: Library - -Optimize loop.call_soon. - -.. - -.. bpo: 28613 -.. date: 9759 -.. nonce: sqUPrv -.. section: Library - -Fix get_event_loop() return the current loop if called from -coroutines/callbacks. - -.. - -.. bpo: 28634 -.. date: 9758 -.. nonce: YlRydz -.. section: Library - -Fix asyncio.isfuture() to support unittest.Mock. - -.. - -.. bpo: 26081 -.. date: 9757 -.. nonce: 2Y8-a9 -.. section: Library - -Fix refleak in _asyncio.Future.__iter__().throw. - -.. - -.. bpo: 28639 -.. date: 9756 -.. nonce: WUPo1o -.. section: Library - -Fix inspect.isawaitable to always return bool Patch by Justin Mayfield. - -.. - -.. bpo: 28652 -.. date: 9755 -.. nonce: f5M8FG -.. section: Library - -Make loop methods reject socket kinds they do not support. - -.. - -.. bpo: 28653 -.. date: 9754 -.. nonce: S5bA9i -.. section: Library - -Fix a refleak in functools.lru_cache. - -.. - -.. bpo: 28703 -.. date: 9753 -.. nonce: CRLTJc -.. section: Library - -Fix asyncio.iscoroutinefunction to handle Mock objects. - -.. - -.. bpo: 28704 -.. date: 9752 -.. nonce: EFWBII -.. section: Library - -Fix create_unix_server to support Path-like objects (PEP 519). - -.. - -.. bpo: 28720 -.. date: 9751 -.. nonce: Fsz-Lf -.. section: Library - -Add collections.abc.AsyncGenerator. - -.. - -.. bpo: 28513 -.. date: 9750 -.. nonce: L3joAz -.. section: Documentation - -Documented command-line interface of zipfile. - -.. - -.. bpo: 28666 -.. date: 9749 -.. nonce: RtTk-4 -.. section: Tests - -Now test.support.rmtree is able to remove unwritable or unreadable -directories. - -.. - -.. bpo: 23839 -.. date: 9748 -.. nonce: zsT_L9 -.. section: Tests - -Various caches now are cleared before running every test file. - -.. - -.. bpo: 10656 -.. date: 9747 -.. nonce: pR8FFU -.. section: Build - -Fix out-of-tree building on AIX. Patch by Tristan Carel and Michael -Haubenwallner. - -.. - -.. bpo: 26359 -.. date: 9746 -.. nonce: CLz6qy -.. section: Build - -Rename --with-optimiations to --enable-optimizations. - -.. - -.. bpo: 28676 -.. date: 9745 -.. nonce: Wxf6Ds -.. section: Build - -Prevent missing 'getentropy' declaration warning on macOS. Patch by Gareth -Rees. diff --git a/Misc/NEWS.d/3.6.0rc1.rst b/Misc/NEWS.d/3.6.0rc1.rst deleted file mode 100644 index 15769f950db23914dfe5e8e1a4cd2313825cb403..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.0rc1.rst +++ /dev/null @@ -1,122 +0,0 @@ -.. bpo: 23722 -.. date: 9790 -.. nonce: e8BH5h -.. release date: 2016-12-06 -.. section: Core and Builtins - -Rather than silently producing a class that doesn't support zero-argument -``super()`` in methods, failing to pass the new ``__classcell__`` namespace -entry up to ``type.__new__`` now results in a ``DeprecationWarning`` and a -class that supports zero-argument ``super()``. - -.. - -.. bpo: 28797 -.. date: 9789 -.. nonce: _A0_Z5 -.. section: Core and Builtins - -Modifying the class __dict__ inside the __set_name__ method of a descriptor -that is used inside that class no longer prevents calling the __set_name__ -method of other descriptors. - -.. - -.. bpo: 28782 -.. date: 9788 -.. nonce: foJV_E -.. section: Core and Builtins - -Fix a bug in the implementation ``yield from`` when checking if the next -instruction is YIELD_FROM. Regression introduced by WORDCODE (issue #26647). - -.. - -.. bpo: 27030 -.. date: 9787 -.. nonce: 88FOrz -.. section: Library - -Unknown escapes in re.sub() replacement template are allowed again. But -they still are deprecated and will be disabled in 3.7. - -.. - -.. bpo: 28835 -.. date: 9786 -.. nonce: Fv7Dr1 -.. section: Library - -Fix a regression introduced in warnings.catch_warnings(): call -warnings.showwarning() if it was overridden inside the context manager. - -.. - -.. bpo: 27172 -.. date: 9785 -.. nonce: mVKfLT -.. section: Library - -To assist with upgrades from 2.7, the previously documented deprecation of -``inspect.getfullargspec()`` has been reversed. This decision may be -revisited again after the Python 2.7 branch is no longer officially -supported. - -.. - -.. bpo: 26273 -.. date: 9784 -.. nonce: ilNIWN -.. section: Library - -Add new :data:`socket.TCP_CONGESTION` (Linux 2.6.13) and -:data:`socket.TCP_USER_TIMEOUT` (Linux 2.6.37) constants. Patch written by -Omar Sandoval. - -.. - -.. bpo: 24142 -.. date: 9783 -.. nonce: IrZnFs -.. section: Library - -Reading a corrupt config file left configparser in an invalid state. -Original patch by Florian Höch. - -.. - -.. bpo: 28843 -.. date: 9782 -.. nonce: O7M0LE -.. section: Library - -Fix asyncio C Task to handle exceptions __traceback__. - -.. - -.. bpo: 28808 -.. date: 9781 -.. nonce: A03X6r -.. section: C API - -PyUnicode_CompareWithASCIIString() now never raises exceptions. - -.. - -.. bpo: 23722 -.. date: 9780 -.. nonce: 6HX6fk -.. section: Documentation - -The data model reference and the porting section in the What's New guide now -cover the additional ``__classcell__`` handling needed for custom -metaclasses to fully support :pep:`487` and zero-argument ``super()``. - -.. - -.. bpo: 28023 -.. date: 9779 -.. nonce: 4gzSGp -.. section: Tools/Demos - -Fix python-gdb.py didn't support new dict implementation. diff --git a/Misc/NEWS.d/3.6.0rc2.rst b/Misc/NEWS.d/3.6.0rc2.rst deleted file mode 100644 index 4a78694167eab273a2e0b45dc828396128e6a0ce..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.0rc2.rst +++ /dev/null @@ -1,45 +0,0 @@ -.. bpo: 28147 -.. date: 9795 -.. nonce: CnK_xf -.. release date: 2016-12-16 -.. section: Core and Builtins - -Fix a memory leak in split-table dictionaries: setattr() must not convert -combined table into split table. Patch written by INADA Naoki. - -.. - -.. bpo: 28990 -.. date: 9794 -.. nonce: m8xRMJ -.. section: Core and Builtins - -Fix asyncio SSL hanging if connection is closed before handshake is -completed. (Patch by HoHo-Ho) - -.. - -.. bpo: 28770 -.. date: 9793 -.. nonce: N9GQsz -.. section: Tools/Demos - -Fix python-gdb.py for fastcalls. - -.. - -.. bpo: 28896 -.. date: 9792 -.. nonce: ymAbmH -.. section: Windows - -Deprecate WindowsRegistryFinder. - -.. - -.. bpo: 28898 -.. date: 9791 -.. nonce: YGUd_i -.. section: Build - -Prevent gdb build errors due to HAVE_LONG_LONG redefinition. diff --git a/Misc/NEWS.d/3.6.1.rst b/Misc/NEWS.d/3.6.1.rst deleted file mode 100644 index a7bf84ef4ad0f68a03815897736cfffc22ce7fc5..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.1.rst +++ /dev/null @@ -1,31 +0,0 @@ -.. bpo: 29723 -.. date: 9895 -.. nonce: M5omgP -.. release date: 2017-03-21 -.. section: Core and Builtins - -The ``sys.path[0]`` initialization change for bpo-29139 caused a regression -by revealing an inconsistency in how sys.path is initialized when executing -``__main__`` from a zipfile, directory, or other import location. The -interpreter now consistently avoids ever adding the import location's parent -directory to ``sys.path``, and ensures no other ``sys.path`` entries are -inadvertently modified when inserting the import location named on the -command line. - -.. - -.. bpo: 27593 -.. date: 9894 -.. nonce: nk7Etn -.. section: Build - -fix format of git information used in sys.version - -.. - -.. bpo: 0 -.. date: 9893 -.. nonce: usKKNQ -.. section: Build - -Fix incompatible comment in python.h diff --git a/Misc/NEWS.d/3.6.1rc1.rst b/Misc/NEWS.d/3.6.1rc1.rst deleted file mode 100644 index 58fd1b0624b2deebbf56493b243cbd6974f4fddb..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.1rc1.rst +++ /dev/null @@ -1,940 +0,0 @@ -.. bpo: 28893 -.. date: 9892 -.. nonce: WTKnpj -.. release date: 2017-03-04 -.. section: Core and Builtins - -Set correct __cause__ for errors about invalid awaitables returned from -__aiter__ and __anext__. - -.. - -.. bpo: 29683 -.. date: 9891 -.. nonce: G5iS-P -.. section: Core and Builtins - -Fixes to memory allocation in _PyCode_SetExtra. Patch by Brian Coleman. - -.. - -.. bpo: 29684 -.. date: 9890 -.. nonce: wTgEoh -.. section: Core and Builtins - -Fix minor regression of PyEval_CallObjectWithKeywords. It should raise -TypeError when kwargs is not a dict. But it might cause segv when args=NULL -and kwargs is not a dict. - -.. - -.. bpo: 28598 -.. date: 9889 -.. nonce: QxbzQn -.. section: Core and Builtins - -Support __rmod__ for subclasses of str being called before str.__mod__. -Patch by Martijn Pieters. - -.. - -.. bpo: 29607 -.. date: 9888 -.. nonce: 7NvBA1 -.. section: Core and Builtins - -Fix stack_effect computation for CALL_FUNCTION_EX. Patch by Matthieu -Dartiailh. - -.. - -.. bpo: 29602 -.. date: 9887 -.. nonce: qyyskC -.. section: Core and Builtins - -Fix incorrect handling of signed zeros in complex constructor for complex -subclasses and for inputs having a __complex__ method. Patch by Serhiy -Storchaka. - -.. - -.. bpo: 29347 -.. date: 9886 -.. nonce: 1RPPGN -.. section: Core and Builtins - -Fixed possibly dereferencing undefined pointers when creating weakref -objects. - -.. - -.. bpo: 29438 -.. date: 9885 -.. nonce: IKxD6I -.. section: Core and Builtins - -Fixed use-after-free problem in key sharing dict. - -.. - -.. bpo: 29319 -.. date: 9884 -.. nonce: KLDUZf -.. section: Core and Builtins - -Prevent RunMainFromImporter overwriting sys.path[0]. - -.. - -.. bpo: 29337 -.. date: 9883 -.. nonce: bjX8AE -.. section: Core and Builtins - -Fixed possible BytesWarning when compare the code objects. Warnings could be -emitted at compile time. - -.. - -.. bpo: 29327 -.. date: 9882 -.. nonce: XXQarW -.. section: Core and Builtins - -Fixed a crash when pass the iterable keyword argument to sorted(). - -.. - -.. bpo: 29034 -.. date: 9881 -.. nonce: 7-uEDT -.. section: Core and Builtins - -Fix memory leak and use-after-free in os module (path_converter). - -.. - -.. bpo: 29159 -.. date: 9880 -.. nonce: gEn_kP -.. section: Core and Builtins - -Fix regression in bytes(x) when x.__index__() raises Exception. - -.. - -.. bpo: 28932 -.. date: 9879 -.. nonce: QnLx8A -.. section: Core and Builtins - -Do not include if it does not exist. - -.. - -.. bpo: 25677 -.. date: 9878 -.. nonce: RWhZrb -.. section: Core and Builtins - -Correct the positioning of the syntax error caret for indented blocks. -Based on patch by Michael Layzell. - -.. - -.. bpo: 29000 -.. date: 9877 -.. nonce: K6wQ-3 -.. section: Core and Builtins - -Fixed bytes formatting of octals with zero padding in alternate form. - -.. - -.. bpo: 26919 -.. date: 9876 -.. nonce: Cm7MSa -.. section: Core and Builtins - -On Android, operating system data is now always encoded/decoded to/from -UTF-8, instead of the locale encoding to avoid inconsistencies with -os.fsencode() and os.fsdecode() which are already using UTF-8. - -.. - -.. bpo: 28991 -.. date: 9875 -.. nonce: lGA0FK -.. section: Core and Builtins - -functools.lru_cache() was susceptible to an obscure reentrancy bug -triggerable by a monkey-patched len() function. - -.. - -.. bpo: 28739 -.. date: 9874 -.. nonce: w1fvhk -.. section: Core and Builtins - -f-string expressions are no longer accepted as docstrings and by -ast.literal_eval() even if they do not include expressions. - -.. - -.. bpo: 28512 -.. date: 9873 -.. nonce: i-pv6d -.. section: Core and Builtins - -Fixed setting the offset attribute of SyntaxError by -PyErr_SyntaxLocationEx() and PyErr_SyntaxLocationObject(). - -.. - -.. bpo: 28918 -.. date: 9872 -.. nonce: SFVuPz -.. section: Core and Builtins - -Fix the cross compilation of xxlimited when Python has been built with -Py_DEBUG defined. - -.. - -.. bpo: 28731 -.. date: 9871 -.. nonce: oNF59u -.. section: Core and Builtins - -Optimize _PyDict_NewPresized() to create correct size dict. Improve speed of -dict literal with constant keys up to 30%. - -.. - -.. bpo: 29169 -.. date: 9870 -.. nonce: 8ypApm -.. section: Library - -Update zlib to 1.2.11. - -.. - -.. bpo: 29623 -.. date: 9869 -.. nonce: D3-NP2 -.. section: Library - -Allow use of path-like object as a single argument in ConfigParser.read(). -Patch by David Ellis. - -.. - -.. bpo: 28963 -.. date: 9868 -.. nonce: tPl8dq -.. section: Library - -Fix out of bound iteration in asyncio.Future.remove_done_callback -implemented in C. - -.. - -.. bpo: 29704 -.. date: 9867 -.. nonce: r-kWqv -.. section: Library - -asyncio.subprocess.SubprocessStreamProtocol no longer closes before all -pipes are closed. - -.. - -.. bpo: 29271 -.. date: 9866 -.. nonce: y8Vj2v -.. section: Library - -Fix Task.current_task and Task.all_tasks implemented in C to accept None -argument as their pure Python implementation. - -.. - -.. bpo: 29703 -.. date: 9865 -.. nonce: ZdsPCR -.. section: Library - -Fix asyncio to support instantiation of new event loops in child processes. - -.. - -.. bpo: 29376 -.. date: 9864 -.. nonce: rrJhJy -.. section: Library - -Fix assertion error in threading._DummyThread.is_alive(). - -.. - -.. bpo: 28624 -.. date: 9863 -.. nonce: 43TJib -.. section: Library - -Add a test that checks that cwd parameter of Popen() accepts PathLike -objects. Patch by Sayan Chowdhury. - -.. - -.. bpo: 28518 -.. date: 9862 -.. nonce: o-Q2Nw -.. section: Library - -Start a transaction implicitly before a DML statement. Patch by Aviv -Palivoda. - -.. - -.. bpo: 29532 -.. date: 9861 -.. nonce: YCwVQn -.. section: Library - -Altering a kwarg dictionary passed to functools.partial() no longer affects -a partial object after creation. - -.. - -.. bpo: 29110 -.. date: 9860 -.. nonce: wmE-_T -.. section: Library - -Fix file object leak in aifc.open() when file is given as a filesystem path -and is not in valid AIFF format. Patch by Anthony Zhang. - -.. - -.. bpo: 28556 -.. date: 9859 -.. nonce: p6967e -.. section: Library - -Various updates to typing module: typing.Counter, typing.ChainMap, improved -ABC caching, etc. Original PRs by Jelle Zijlstra, Ivan Levkivskyi, Manuel -Krebber, and Łukasz Langa. - -.. - -.. bpo: 29100 -.. date: 9858 -.. nonce: LAAERS -.. section: Library - -Fix datetime.fromtimestamp() regression introduced in Python 3.6.0: check -minimum and maximum years. - -.. - -.. bpo: 29519 -.. date: 9857 -.. nonce: oGGgZ4 -.. section: Library - -Fix weakref spewing exceptions during interpreter shutdown when used with a -rare combination of multiprocessing and custom codecs. - -.. - -.. bpo: 29416 -.. date: 9856 -.. nonce: KJGyI_ -.. section: Library - -Prevent infinite loop in pathlib.Path.mkdir - -.. - -.. bpo: 29444 -.. date: 9855 -.. nonce: cEwgmk -.. section: Library - -Fixed out-of-bounds buffer access in the group() method of the match object. -Based on patch by WGH. - -.. - -.. bpo: 29335 -.. date: 9854 -.. nonce: _KC7IK -.. section: Library - -Fix subprocess.Popen.wait() when the child process has exited to a stopped -instead of terminated state (ex: when under ptrace). - -.. - -.. bpo: 29290 -.. date: 9853 -.. nonce: XBqptF -.. section: Library - -Fix a regression in argparse that help messages would wrap at non-breaking -spaces. - -.. - -.. bpo: 28735 -.. date: 9852 -.. nonce: admHLO -.. section: Library - -Fixed the comparison of mock.MagickMock with mock.ANY. - -.. - -.. bpo: 29316 -.. date: 9851 -.. nonce: OeOQw5 -.. section: Library - -Restore the provisional status of typing module, add corresponding note to -documentation. Patch by Ivan L. - -.. - -.. bpo: 29219 -.. date: 9850 -.. nonce: kxui7t -.. section: Library - -Fixed infinite recursion in the repr of uninitialized ctypes.CDLL instances. - -.. - -.. bpo: 29011 -.. date: 9849 -.. nonce: MI5f2R -.. section: Library - -Fix an important omission by adding Deque to the typing module. - -.. - -.. bpo: 28969 -.. date: 9848 -.. nonce: j3HJYO -.. section: Library - -Fixed race condition in C implementation of functools.lru_cache. KeyError -could be raised when cached function with full cache was simultaneously -called from different threads with the same uncached arguments. - -.. - -.. bpo: 29142 -.. date: 9847 -.. nonce: xo6kAv -.. section: Library - -In urllib.request, suffixes in no_proxy environment variable with leading -dots could match related hostnames again (e.g. .b.c matches a.b.c). Patch by -Milan Oberkirch. - -.. - -.. bpo: 28961 -.. date: 9846 -.. nonce: Rt93vg -.. section: Library - -Fix unittest.mock._Call helper: don't ignore the name parameter anymore. -Patch written by Jiajun Huang. - -.. - -.. bpo: 29203 -.. date: 9845 -.. nonce: kN5S6v -.. section: Library - -functools.lru_cache() now respects :pep:`468` and preserves the order of -keyword arguments. f(a=1, b=2) is now cached separately from f(b=2, a=1) -since both calls could potentially give different results. - -.. - -.. bpo: 15812 -.. date: 9844 -.. nonce: R1U-Ec -.. section: Library - -inspect.getframeinfo() now correctly shows the first line of a context. -Patch by Sam Breese. - -.. - -.. bpo: 29094 -.. date: 9843 -.. nonce: 460ZQo -.. section: Library - -Offsets in a ZIP file created with extern file object and modes "w" and "x" -now are relative to the start of the file. - -.. - -.. bpo: 29085 -.. date: 9842 -.. nonce: bm3gkx -.. section: Library - -Allow random.Random.seed() to use high quality OS randomness rather than the -pid and time. - -.. - -.. bpo: 29061 -.. date: 9841 -.. nonce: YKq0Ba -.. section: Library - -Fixed bug in secrets.randbelow() which would hang when given a negative -input. Patch by Brendan Donegan. - -.. - -.. bpo: 29079 -.. date: 9840 -.. nonce: g4YLix -.. section: Library - -Prevent infinite loop in pathlib.resolve() on Windows - -.. - -.. bpo: 13051 -.. date: 9839 -.. nonce: YzC1Te -.. section: Library - -Fixed recursion errors in large or resized curses.textpad.Textbox. Based on -patch by Tycho Andersen. - -.. - -.. bpo: 29119 -.. date: 9838 -.. nonce: Ov69fr -.. section: Library - -Fix weakrefs in the pure python version of collections.OrderedDict -move_to_end() method. Contributed by Andra Bogildea. - -.. - -.. bpo: 9770 -.. date: 9837 -.. nonce: WJJnwP -.. section: Library - -curses.ascii predicates now work correctly with negative integers. - -.. - -.. bpo: 28427 -.. date: 9836 -.. nonce: vUd-va -.. section: Library - -old keys should not remove new values from WeakValueDictionary when -collecting from another thread. - -.. - -.. bpo: 28923 -.. date: 9835 -.. nonce: naVULD -.. section: Library - -Remove editor artifacts from Tix.py. - -.. - -.. bpo: 29055 -.. date: 9834 -.. nonce: -r_9jc -.. section: Library - -Neaten-up empty population error on random.choice() by suppressing the -upstream exception. - -.. - -.. bpo: 28871 -.. date: 9833 -.. nonce: cPMXCJ -.. section: Library - -Fixed a crash when deallocate deep ElementTree. - -.. - -.. bpo: 19542 -.. date: 9832 -.. nonce: 5tCkaK -.. section: Library - -Fix bugs in WeakValueDictionary.setdefault() and WeakValueDictionary.pop() -when a GC collection happens in another thread. - -.. - -.. bpo: 20191 -.. date: 9831 -.. nonce: Q7uZCS -.. section: Library - -Fixed a crash in resource.prlimit() when passing a sequence that doesn't own -its elements as limits. - -.. - -.. bpo: 28779 -.. date: 9830 -.. nonce: t-mjED -.. section: Library - -multiprocessing.set_forkserver_preload() would crash the forkserver process -if a preloaded module instantiated some multiprocessing objects such as -locks. - -.. - -.. bpo: 28847 -.. date: 9829 -.. nonce: J7d3nG -.. section: Library - -dbm.dumb now supports reading read-only files and no longer writes the index -file when it is not changed. - -.. - -.. bpo: 26937 -.. date: 9828 -.. nonce: c9kgiA -.. section: Library - -The chown() method of the tarfile.TarFile class does not fail now when the -grp module cannot be imported, as for example on Android platforms. - -.. - -.. bpo: 29071 -.. date: 9827 -.. nonce: FCOpJn -.. section: IDLE - -IDLE colors f-string prefixes (but not invalid ur prefixes). - -.. - -.. bpo: 28572 -.. date: 9826 -.. nonce: 1_duKY -.. section: IDLE - -Add 10% to coverage of IDLE's test_configdialog. Update and augment -description of the configuration system. - -.. - -.. bpo: 29579 -.. date: 9825 -.. nonce: Ih-G2Q -.. section: Windows - -Removes readme.txt from the installer - -.. - -.. bpo: 29326 -.. date: 9824 -.. nonce: 4qDQzs -.. section: Windows - -Ignores blank lines in ._pth files (Patch by Alexey Izbyshev) - -.. - -.. bpo: 28164 -.. date: 9823 -.. nonce: h4CFX8 -.. section: Windows - -Correctly handle special console filenames (patch by Eryk Sun) - -.. - -.. bpo: 29409 -.. date: 9822 -.. nonce: bhvrJ2 -.. section: Windows - -Implement :pep:`529` for io.FileIO (Patch by Eryk Sun) - -.. - -.. bpo: 29392 -.. date: 9821 -.. nonce: OtqS5t -.. section: Windows - -Prevent crash when passing invalid arguments into msvcrt module. - -.. - -.. bpo: 25778 -.. date: 9820 -.. nonce: 8uKJ82 -.. section: Windows - -winreg does not truncate string correctly (Patch by Eryk Sun) - -.. - -.. bpo: 28896 -.. date: 9819 -.. nonce: VMi9w0 -.. section: Windows - -Deprecate WindowsRegistryFinder and disable it by default. - -.. - -.. bpo: 27867 -.. date: 9818 -.. nonce: UC5ohc -.. section: C API - -Function PySlice_GetIndicesEx() is replaced with a macro if Py_LIMITED_API -is not set or set to the value between 0x03050400 and 0x03060000 (not -including) or 0x03060100 or higher. - -.. - -.. bpo: 29083 -.. date: 9817 -.. nonce: tGTjr_ -.. section: C API - -Fixed the declaration of some public API functions. PyArg_VaParse() and -PyArg_VaParseTupleAndKeywords() were not available in limited API. -PyArg_ValidateKeywordArguments(), PyArg_UnpackTuple() and Py_BuildValue() -were not available in limited API of version < 3.3 when PY_SSIZE_T_CLEAN is -defined. - -.. - -.. bpo: 29058 -.. date: 9816 -.. nonce: 0wNVP8 -.. section: C API - -All stable API extensions added after Python 3.2 are now available only when -Py_LIMITED_API is set to the PY_VERSION_HEX value of the minimum Python -version supporting this API. - -.. - -.. bpo: 28929 -.. date: 9815 -.. nonce: Md7kb0 -.. section: Documentation - -Link the documentation to its source file on GitHub. - -.. - -.. bpo: 25008 -.. date: 9814 -.. nonce: CeIzyU -.. section: Documentation - -Document smtpd.py as effectively deprecated and add a pointer to aiosmtpd, a -third-party asyncio-based replacement. - -.. - -.. bpo: 26355 -.. date: 9813 -.. nonce: SDq_8Y -.. section: Documentation - -Add canonical header link on each page to corresponding major version of the -documentation. Patch by Matthias Bussonnier. - -.. - -.. bpo: 29349 -.. date: 9812 -.. nonce: PjSo-t -.. section: Documentation - -Fix Python 2 syntax in code for building the documentation. - -.. - -.. bpo: 28087 -.. date: 9811 -.. nonce: m8dc4R -.. section: Tests - -Skip test_asyncore and test_eintr poll failures on macOS. Skip some tests of -select.poll when running on macOS due to unresolved issues with the -underlying system poll function on some macOS versions. - -.. - -.. bpo: 29571 -.. date: 9810 -.. nonce: r6Dixr -.. section: Tests - -to match the behaviour of the ``re.LOCALE`` flag, test_re.test_locale_flag -now uses ``locale.getpreferredencoding(False)`` to determine the candidate -encoding for the test regex (allowing it to correctly skip the test when the -default locale encoding is a multi-byte encoding) - -.. - -.. bpo: 28950 -.. date: 9809 -.. nonce: 1W8Glo -.. section: Tests - -Disallow -j0 to be combined with -T/-l in regrtest command line arguments. - -.. - -.. bpo: 28683 -.. date: 9808 -.. nonce: Fp-Hdq -.. section: Tests - -Fix the tests that bind() a unix socket and raise PermissionError on Android -for a non-root user. - -.. - -.. bpo: 26939 -.. date: 9807 -.. nonce: 7j_W5R -.. section: Tests - -Add the support.setswitchinterval() function to fix test_functools hanging -on the Android armv7 qemu emulator. - -.. - -.. bpo: 27593 -.. date: 9806 -.. nonce: v87xEr -.. section: Build - -sys.version and the platform module python_build(), python_branch(), and -python_revision() functions now use git information rather than hg when -building from a repo. - -.. - -.. bpo: 29572 -.. date: 9805 -.. nonce: iZ1XKK -.. section: Build - -Update Windows build and OS X installers to use OpenSSL 1.0.2k. - -.. - -.. bpo: 26851 -.. date: 9804 -.. nonce: R5243g -.. section: Build - -Set Android compilation and link flags. - -.. - -.. bpo: 28768 -.. date: 9803 -.. nonce: b9_a6E -.. section: Build - -Fix implicit declaration of function _setmode. Patch by Masayuki Yamamoto - -.. - -.. bpo: 29080 -.. date: 9802 -.. nonce: b3qLQT -.. section: Build - -Removes hard dependency on hg.exe from PCBuild/build.bat - -.. - -.. bpo: 23903 -.. date: 9801 -.. nonce: JXJ889 -.. section: Build - -Added missed names to PC/python3.def. - -.. - -.. bpo: 28762 -.. date: 9800 -.. nonce: Ru0YN_ -.. section: Build - -lockf() is available on Android API level 24, but the F_LOCK macro is not -defined in android-ndk-r13. - -.. - -.. bpo: 28538 -.. date: 9799 -.. nonce: FqtN7v -.. section: Build - -Fix the compilation error that occurs because if_nameindex() is available on -Android API level 24, but the if_nameindex structure is not defined. - -.. - -.. bpo: 20211 -.. date: 9798 -.. nonce: gpNptI -.. section: Build - -Do not add the directory for installing C header files and the directory for -installing object code libraries to the cross compilation search paths. -Original patch by Thomas Petazzoni. - -.. - -.. bpo: 28849 -.. date: 9797 -.. nonce: AzRRF5 -.. section: Build - -Do not define sys.implementation._multiarch on Android. diff --git a/Misc/NEWS.d/3.6.2.rst b/Misc/NEWS.d/3.6.2.rst deleted file mode 100644 index dba43d146df95472cf0bdd61697da97841cc18c3..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.2.rst +++ /dev/null @@ -1,7 +0,0 @@ -.. bpo: 0 -.. date: 9993 -.. no changes: True -.. nonce: F9ENBV -.. release date: 2017-07-17 - -No changes since release candidate 2 diff --git a/Misc/NEWS.d/3.6.2rc1.rst b/Misc/NEWS.d/3.6.2rc1.rst deleted file mode 100644 index 20cabb05fa3b1c2d60761f483c0e504ddc3c0d71..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.2rc1.rst +++ /dev/null @@ -1,941 +0,0 @@ -.. bpo: 30682 -.. date: 9989 -.. nonce: zZm88E -.. release date: 2017-06-17 -.. section: Core and Builtins - -Removed a too-strict assertion that failed for certain f-strings, such as -eval("f'\\\n'") and eval("f'\\\r'"). - -.. - -.. bpo: 30604 -.. date: 9988 -.. nonce: W47hPY -.. section: Core and Builtins - -Move co_extra_freefuncs to not be per-thread to avoid crashes - -.. - -.. bpo: 29104 -.. date: 9987 -.. nonce: u26yCx -.. section: Core and Builtins - -Fixed parsing backslashes in f-strings. - -.. - -.. bpo: 27945 -.. date: 9986 -.. nonce: p29r3O -.. section: Core and Builtins - -Fixed various segfaults with dict when input collections are mutated during -searching, inserting or comparing. Based on patches by Duane Griffin and -Tim Mitchell. - -.. - -.. bpo: 25794 -.. date: 9985 -.. nonce: xfPwqm -.. section: Core and Builtins - -Fixed type.__setattr__() and type.__delattr__() for non-interned attribute -names. Based on patch by Eryk Sun. - -.. - -.. bpo: 30039 -.. date: 9984 -.. nonce: e0u4DG -.. section: Core and Builtins - -If a KeyboardInterrupt happens when the interpreter is in the middle of -resuming a chain of nested 'yield from' or 'await' calls, it's now correctly -delivered to the innermost frame. - -.. - -.. bpo: 12414 -.. date: 9983 -.. nonce: T9ix8O -.. section: Core and Builtins - -sys.getsizeof() on a code object now returns the sizes which includes the -code struct and sizes of objects which it references. Patch by Dong-hee Na. - -.. - -.. bpo: 29949 -.. date: 9982 -.. nonce: DevGPS -.. section: Core and Builtins - -Fix memory usage regression of set and frozenset object. - -.. - -.. bpo: 29935 -.. date: 9981 -.. nonce: vgjdJo -.. section: Core and Builtins - -Fixed error messages in the index() method of tuple, list and deque when -pass indices of wrong type. - -.. - -.. bpo: 29859 -.. date: 9980 -.. nonce: Z1MLcA -.. section: Core and Builtins - -Show correct error messages when any of the pthread_* calls in -thread_pthread.h fails. - -.. - -.. bpo: 28876 -.. date: 9979 -.. nonce: cU-sGT -.. section: Core and Builtins - -``bool(range)`` works even if ``len(range)`` raises :exc:`OverflowError`. - -.. - -.. bpo: 29600 -.. date: 9978 -.. nonce: 77wQ6C -.. section: Core and Builtins - -Fix wrapping coroutine return values in StopIteration. - -.. - -.. bpo: 28856 -.. date: 9977 -.. nonce: AFRmo4 -.. section: Core and Builtins - -Fix an oversight that %b format for bytes should support objects follow the -buffer protocol. - -.. - -.. bpo: 29714 -.. date: 9976 -.. nonce: z-BhVd -.. section: Core and Builtins - -Fix a regression that bytes format may fail when containing zero bytes -inside. - -.. - -.. bpo: 29478 -.. date: 9975 -.. nonce: rTQ-qy -.. section: Core and Builtins - -If max_line_length=None is specified while using the Compat32 policy, it is -no longer ignored. Patch by Mircea Cosbuc. - -.. - -.. bpo: 30616 -.. date: 9974 -.. nonce: I2mDTz -.. section: Library - -Functional API of enum allows to create empty enums. Patched by Dong-hee Na - -.. - -.. bpo: 30038 -.. date: 9973 -.. nonce: vb4DWk -.. section: Library - -Fix race condition between signal delivery and wakeup file descriptor. -Patch by Nathaniel Smith. - -.. - -.. bpo: 23894 -.. date: 9972 -.. nonce: k2pADV -.. section: Library - -lib2to3 now recognizes ``rb'...'`` and ``f'...'`` strings. - -.. - -.. bpo: 23890 -.. date: 9971 -.. nonce: GCFAAZ -.. section: Library - -unittest.TestCase.assertRaises() now manually breaks a reference cycle to -not keep objects alive longer than expected. - -.. - -.. bpo: 30149 -.. date: 9970 -.. nonce: hE649r -.. section: Library - -inspect.signature() now supports callables with variable-argument parameters -wrapped with partialmethod. Patch by Dong-hee Na. - -.. - -.. bpo: 30645 -.. date: 9969 -.. nonce: oYzbbW -.. section: Library - -Fix path calculation in imp.load_package(), fixing it for cases when a -package is only shipped with bytecodes. Patch by Alexandru Ardelean. - -.. - -.. bpo: 29931 -.. date: 9968 -.. nonce: tfcTwK -.. section: Library - -Fixed comparison check for ipaddress.ip_interface objects. Patch by Sanjay -Sundaresan. - -.. - -.. bpo: 30605 -.. date: 9967 -.. nonce: XqGz1r -.. section: Library - -re.compile() no longer raises a BytesWarning when compiling a bytes instance -with misplaced inline modifier. Patch by Roy Williams. - -.. - -.. bpo: 29591 -.. date: 9966 -.. nonce: ExKblw -.. original section: Library -.. section: Security - -Update expat copy from 2.1.1 to 2.2.0 to get fixes of CVE-2016-0718 and -CVE-2016-4472. See https://sourceforge.net/p/expat/bugs/537/ for more -information. - -.. - -.. bpo: 24484 -.. date: 9965 -.. nonce: fNS32j -.. section: Library - -Avoid race condition in multiprocessing cleanup (#2159) - -.. - -.. bpo: 28994 -.. date: 9964 -.. nonce: 9vzun1 -.. section: Library - -The traceback no longer displayed for SystemExit raised in a callback -registered by atexit. - -.. - -.. bpo: 30508 -.. date: 9963 -.. nonce: wNWRS2 -.. section: Library - -Don't log exceptions if Task/Future "cancel()" method was called. - -.. - -.. bpo: 28556 -.. date: 9962 -.. nonce: mESP7G -.. section: Library - -Updates to typing module: Add generic AsyncContextManager, add support for -ContextManager on all versions. Original PRs by Jelle Zijlstra and Ivan -Levkivskyi - -.. - -.. bpo: 29870 -.. date: 9961 -.. nonce: p960Ih -.. section: Library - -Fix ssl sockets leaks when connection is aborted in asyncio/ssl -implementation. Patch by Michaël Sghaïer. - -.. - -.. bpo: 29743 -.. date: 9960 -.. nonce: en2P4s -.. section: Library - -Closing transport during handshake process leaks open socket. Patch by -Nikolay Kim - -.. - -.. bpo: 27585 -.. date: 9959 -.. nonce: 0Ugqqu -.. section: Library - -Fix waiter cancellation in asyncio.Lock. Patch by Mathieu Sornay. - -.. - -.. bpo: 30418 -.. date: 9958 -.. nonce: EwISQm -.. section: Library - -On Windows, subprocess.Popen.communicate() now also ignore EINVAL on -stdin.write() if the child process is still running but closed the pipe. - -.. - -.. bpo: 29822 -.. date: 9957 -.. nonce: G7dX13 -.. section: Library - -inspect.isabstract() now works during __init_subclass__. Patch by Nate -Soares. - -.. - -.. bpo: 29581 -.. date: 9956 -.. nonce: gHCrxP -.. section: Library - -ABCMeta.__new__ now accepts ``**kwargs``, allowing abstract base classes to -use keyword parameters in __init_subclass__. Patch by Nate Soares. - -.. - -.. bpo: 30557 -.. date: 9955 -.. nonce: uykrLf -.. section: Library - -faulthandler now correctly filters and displays exception codes on Windows - -.. - -.. bpo: 30378 -.. date: 9954 -.. nonce: R_19_5 -.. section: Library - -Fix the problem that logging.handlers.SysLogHandler cannot handle IPv6 -addresses. - -.. - -.. bpo: 29960 -.. date: 9953 -.. nonce: g0wr3r -.. section: Library - -Preserve generator state when _random.Random.setstate() raises an exception. -Patch by Bryan Olson. - -.. - -.. bpo: 30414 -.. date: 9952 -.. nonce: jGl1Lb -.. section: Library - -multiprocessing.Queue._feed background running thread do not break from main -loop on exception. - -.. - -.. bpo: 30003 -.. date: 9951 -.. nonce: BOl9HE -.. section: Library - -Fix handling escape characters in HZ codec. Based on patch by Ma Lin. - -.. - -.. bpo: 30301 -.. date: 9950 -.. nonce: ywOkjN -.. section: Library - -Fix AttributeError when using SimpleQueue.empty() under *spawn* and -*forkserver* start methods. - -.. - -.. bpo: 30329 -.. date: 9949 -.. nonce: EuT36N -.. section: Library - -imaplib and poplib now catch the Windows socket WSAEINVAL error (code 10022) -on shutdown(SHUT_RDWR): An invalid operation was attempted. This error -occurs sometimes on SSL connections. - -.. - -.. bpo: 30375 -.. date: 9948 -.. nonce: 9c8qM7 -.. section: Library - -Warnings emitted when compile a regular expression now always point to the -line in the user code. Previously they could point into inners of the re -module if emitted from inside of groups or conditionals. - -.. - -.. bpo: 30048 -.. date: 9947 -.. nonce: ELRx8R -.. section: Library - -Fixed ``Task.cancel()`` can be ignored when the task is running coroutine -and the coroutine returned without any more ``await``. - -.. - -.. bpo: 30266 -.. date: 9946 -.. nonce: YJzHAH -.. section: Library - -contextlib.AbstractContextManager now supports anti-registration by setting -__enter__ = None or __exit__ = None, following the pattern introduced in -bpo-25958. Patch by Jelle Zijlstra. - -.. - -.. bpo: 30298 -.. date: 9945 -.. nonce: ZN-bWo -.. section: Library - -Weaken the condition of deprecation warnings for inline modifiers. Now -allowed several subsequential inline modifiers at the start of the pattern -(e.g. ``'(?i)(?s)...'``). In verbose mode whitespaces and comments now are -allowed before and between inline modifiers (e.g. ``'(?x) (?i) (?s)...'``). - -.. - -.. bpo: 29990 -.. date: 9944 -.. nonce: HWV6KE -.. section: Library - -Fix range checking in GB18030 decoder. Original patch by Ma Lin. - -.. - -.. bpo: 26293 -.. date: 9943 -.. nonce: wig0YG -.. section: Library - -Change resulted because of zipfile breakage. (See also: bpo-29094) - -.. - -.. bpo: 30243 -.. date: 9942 -.. nonce: RHQt0v -.. section: Library - -Removed the __init__ methods of _json's scanner and encoder. Misusing them -could cause memory leaks or crashes. Now scanner and encoder objects are -completely initialized in the __new__ methods. - -.. - -.. bpo: 30185 -.. date: 9941 -.. nonce: Tiu1n8 -.. section: Library - -Avoid KeyboardInterrupt tracebacks in forkserver helper process when Ctrl-C -is received. - -.. - -.. bpo: 28556 -.. date: 9940 -.. nonce: 51gjbP -.. section: Library - -Various updates to typing module: add typing.NoReturn type, use -WrapperDescriptorType, minor bug-fixes. Original PRs by Jim -Fasarakis-Hilliard and Ivan Levkivskyi. - -.. - -.. bpo: 30205 -.. date: 9939 -.. nonce: BsxO34 -.. section: Library - -Fix getsockname() for unbound AF_UNIX sockets on Linux. - -.. - -.. bpo: 30070 -.. date: 9938 -.. nonce: XM_B41 -.. section: Library - -Fixed leaks and crashes in errors handling in the parser module. - -.. - -.. bpo: 30061 -.. date: 9937 -.. nonce: 2w_dX9 -.. section: Library - -Fixed crashes in IOBase methods __next__() and readlines() when readline() -or __next__() respectively return non-sizeable object. Fixed possible other -errors caused by not checking results of PyObject_Size(), PySequence_Size(), -or PyMapping_Size(). - -.. - -.. bpo: 30017 -.. date: 9936 -.. nonce: cKBuhU -.. section: Library - -Allowed calling the close() method of the zip entry writer object multiple -times. Writing to a closed writer now always produces a ValueError. - -.. - -.. bpo: 30068 -.. date: 9935 -.. nonce: n4q47r -.. section: Library - -_io._IOBase.readlines will check if it's closed first when hint is present. - -.. - -.. bpo: 29694 -.. date: 9934 -.. nonce: LWKxb1 -.. section: Library - -Fixed race condition in pathlib mkdir with flags parents=True. Patch by -Armin Rigo. - -.. - -.. bpo: 29692 -.. date: 9933 -.. nonce: oyWrAE -.. section: Library - -Fixed arbitrary unchaining of RuntimeError exceptions in -contextlib.contextmanager. Patch by Siddharth Velankar. - -.. - -.. bpo: 29998 -.. date: 9932 -.. nonce: poeIKD -.. section: Library - -Pickling and copying ImportError now preserves name and path attributes. - -.. - -.. bpo: 29953 -.. date: 9931 -.. nonce: Q1hSt- -.. section: Library - -Fixed memory leaks in the replace() method of datetime and time objects when -pass out of bound fold argument. - -.. - -.. bpo: 29942 -.. date: 9930 -.. nonce: CsGNuT -.. section: Library - -Fix a crash in itertools.chain.from_iterable when encountering long runs of -empty iterables. - -.. - -.. bpo: 27863 -.. date: 9929 -.. nonce: pPYHHI -.. section: Library - -Fixed multiple crashes in ElementTree caused by race conditions and wrong -types. - -.. - -.. bpo: 28699 -.. date: 9928 -.. nonce: wZztZP -.. section: Library - -Fixed a bug in pools in multiprocessing.pool that raising an exception at -the very first of an iterable may swallow the exception or make the program -hang. Patch by Davin Potts and Xiang Zhang. - -.. - -.. bpo: 25803 -.. date: 9927 -.. nonce: CPDR0W -.. section: Library - -Avoid incorrect errors raised by Path.mkdir(exist_ok=True) when the OS gives -priority to errors such as EACCES over EEXIST. - -.. - -.. bpo: 29861 -.. date: 9926 -.. nonce: t2ZoRK -.. section: Library - -Release references to tasks, their arguments and their results as soon as -they are finished in multiprocessing.Pool. - -.. - -.. bpo: 29884 -.. date: 9925 -.. nonce: kWXR8W -.. section: Library - -faulthandler: Restore the old sigaltstack during teardown. Patch by -Christophe Zeitouny. - -.. - -.. bpo: 25455 -.. date: 9924 -.. nonce: ZsahHN -.. section: Library - -Fixed crashes in repr of recursive buffered file-like objects. - -.. - -.. bpo: 29800 -.. date: 9923 -.. nonce: d2xASa -.. section: Library - -Fix crashes in partial.__repr__ if the keys of partial.keywords are not -strings. Patch by Michael Seifert. - -.. - -.. bpo: 29742 -.. date: 9922 -.. nonce: 8hqfEO -.. section: Library - -get_extra_info() raises exception if get called on closed ssl transport. -Patch by Nikolay Kim. - -.. - -.. bpo: 8256 -.. date: 9921 -.. nonce: jAwGQH -.. section: Library - -Fixed possible failing or crashing input() if attributes "encoding" or -"errors" of sys.stdin or sys.stdout are not set or are not strings. - -.. - -.. bpo: 28298 -.. date: 9920 -.. nonce: xfm84U -.. section: Library - -Fix a bug that prevented array 'Q', 'L' and 'I' from accepting big intables -(objects that have __int__) as elements. Patch by Oren Milman. - -.. - -.. bpo: 28231 -.. date: 9919 -.. nonce: MG1X09 -.. section: Library - -The zipfile module now accepts path-like objects for external paths. - -.. - -.. bpo: 26915 -.. date: 9918 -.. nonce: qShJZO -.. section: Library - -index() and count() methods of collections.abc.Sequence now check identity -before checking equality when do comparisons. - -.. - -.. bpo: 29615 -.. date: 9917 -.. nonce: OpFKzg -.. section: Library - -SimpleXMLRPCDispatcher no longer chains KeyError (or any other exception) to -exception(s) raised in the dispatched methods. Patch by Petr Motejlek. - -.. - -.. bpo: 30177 -.. date: 9916 -.. nonce: JGIJNL -.. section: Library - -path.resolve(strict=False) no longer cuts the path after the first element -not present in the filesystem. Patch by Antoine Pietri. - -.. - -.. bpo: 15786 -.. date: 9915 -.. nonce: _XRbaR -.. section: IDLE - -Fix several problems with IDLE's autocompletion box. The following should -now work: clicking on selection box items; using the scrollbar; selecting an -item by hitting Return. Hangs on MacOSX should no longer happen. Patch by -Louie Lu. - -.. - -.. bpo: 25514 -.. date: 9914 -.. nonce: 882pXa -.. section: IDLE - -Add doc subsubsection about IDLE failure to start. Popup no-connection -message directs users to this section. - -.. - -.. bpo: 30642 -.. date: 9913 -.. nonce: 3Zujzt -.. section: IDLE - -Fix reference leaks in IDLE tests. Patches by Louie Lu and Terry Jan Reedy. - -.. - -.. bpo: 30495 -.. date: 9912 -.. nonce: I3i5vL -.. section: IDLE - -Add docstrings for textview.py and use PEP8 names. Patches by Cheryl Sabella -and Terry Jan Reedy. - -.. - -.. bpo: 30290 -.. date: 9911 -.. nonce: fZ3kod -.. section: IDLE - -Help-about: use pep8 names and add tests. Increase coverage to 100%. Patches -by Louie Lu, Cheryl Sabella, and Terry Jan Reedy. - -.. - -.. bpo: 30303 -.. date: 9910 -.. nonce: 2L2F-4 -.. section: IDLE - -Add _utest option to textview; add new tests. Increase coverage to 100%. -Patches by Louie Lu and Terry Jan Reedy. - -.. - -.. bpo: 27867 -.. date: 9909 -.. nonce: B46BRE -.. section: C API - -Function PySlice_GetIndicesEx() no longer replaced with a macro if -Py_LIMITED_API is not set. - -.. - -.. bpo: 29941 -.. date: 9908 -.. nonce: ylh45A -.. section: Build - -Add ``--with-assertions`` configure flag to explicitly enable C ``assert()`` -checks. Defaults to off. ``--with-pydebug`` implies ``--with-assertions``. - -.. - -.. bpo: 28787 -.. date: 9907 -.. nonce: vhH_6a -.. section: Build - -Fix out-of-tree builds of Python when configured with ``--with--dtrace``. - -.. - -.. bpo: 29243 -.. date: 9906 -.. nonce: WDK4hT -.. section: Build - -Prevent unnecessary rebuilding of Python during ``make test``, ``make -install`` and some other make targets when configured with -``--enable-optimizations``. - -.. - -.. bpo: 23404 -.. date: 9905 -.. nonce: PdYVWg -.. section: Build - -Don't regenerate generated files based on file modification time anymore: -the action is now explicit. Replace ``make touch`` with ``make regen-all``. - -.. - -.. bpo: 29643 -.. date: 9904 -.. nonce: 4WLIJQ -.. section: Build - -Fix ``--enable-optimization`` didn't work. - -.. - -.. bpo: 30176 -.. date: 9903 -.. nonce: VivmCg -.. section: Documentation - -Add missing attribute related constants in curses documentation. - -.. - -.. bpo: 30052 -.. date: 9902 -.. nonce: TpmpaF -.. section: Documentation - -the link targets for :func:`bytes` and :func:`bytearray` are now their -respective type definitions, rather than the corresponding builtin function -entries. Use :ref:`bytes ` and :ref:`bytearray ` -to reference the latter. -In order to ensure this and future cross-reference updates are applied -automatically, the daily documentation builds now disable the default output -caching features in Sphinx. - -.. - -.. bpo: 26985 -.. date: 9901 -.. nonce: NB5_9S -.. section: Documentation - -Add missing info of code object in inspect documentation. - -.. - -.. bpo: 29367 -.. date: 9900 -.. nonce: 4dOKL0 -.. section: Tools/Demos - -python-gdb.py now supports also ``method-wrapper`` (``wrapperobject``) -objects. - -.. - -.. bpo: 30357 -.. date: 9899 -.. nonce: n4CPEa -.. section: Tests - -test_thread: setUp() now uses support.threading_setup() and -support.threading_cleanup() to wait until threads complete to avoid random -side effects on following tests. Initial patch written by Grzegorz Grzywacz. - -.. - -.. bpo: 30197 -.. date: 9898 -.. nonce: c5wRfu -.. section: Tests - -Enhanced functions swap_attr() and swap_item() in the test.support module. -They now work when delete replaced attribute or item inside the with -statement. The old value of the attribute or item (or None if it doesn't -exist) now will be assigned to the target of the "as" clause, if there is -one. - -.. - -.. bpo: 30687 -.. date: 9897 -.. nonce: 8mqHnu -.. section: Windows - -Locate msbuild.exe on Windows when building rather than vcvarsall.bat - -.. - -.. bpo: 30450 -.. date: 9896 -.. nonce: qsaK8y -.. section: Windows - -The build process on Windows no longer depends on Subversion, instead -pulling external code from GitHub via a Python script. If Python 3.6 is not -found on the system (via ``py -3.6``), NuGet is used to download a copy of -32-bit Python. diff --git a/Misc/NEWS.d/3.6.2rc2.rst b/Misc/NEWS.d/3.6.2rc2.rst deleted file mode 100644 index 8c6545f6dbbeecbb09973454b3a5cd9f964c5798..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.2rc2.rst +++ /dev/null @@ -1,39 +0,0 @@ -.. bpo: 30730 -.. date: 9992 -.. nonce: rJsyTH -.. original section: Library -.. release date: 2017-07-07 -.. section: Security - -Prevent environment variables injection in subprocess on Windows. Prevent -passing other environment variables and command arguments. - -.. - -.. bpo: 30694 -.. date: 9991 -.. nonce: WkMWM_ -.. original section: Library -.. section: Security - -Upgrade expat copy from 2.2.0 to 2.2.1 to get fixes of multiple security -vulnerabilities including: CVE-2017-9233 (External entity infinite loop -DoS), CVE-2016-9063 (Integer overflow, re-fix), CVE-2016-0718 (Fix -regression bugs from 2.2.0's fix to CVE-2016-0718) and CVE-2012-0876 -(Counter hash flooding with SipHash). Note: the CVE-2016-5300 (Use -os-specific entropy sources like getrandom) doesn't impact Python, since -Python already gets entropy from the OS to set the expat secret using -``XML_SetHashSalt()``. - -.. - -.. bpo: 30500 -.. date: 9990 -.. nonce: 1VG7R- -.. original section: Library -.. section: Security - -Fix urllib.parse.splithost() to correctly parse fragments. For example, -``splithost('//127.0.0.1#@evil.com/')`` now correctly returns the -``127.0.0.1`` host, instead of treating ``@evil.com`` as the host in an -authentication (``login@host``). diff --git a/Misc/NEWS.d/3.6.3.rst b/Misc/NEWS.d/3.6.3.rst deleted file mode 100644 index 4d591d77ffe54541804f8fb51a87bb9cec20972c..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.3.rst +++ /dev/null @@ -1,27 +0,0 @@ -.. bpo: 31641 -.. date: 2017-10-03-01-05-11 -.. nonce: vlQEq5 -.. release date: 2017-10-03 -.. section: Library - -Re-allow arbitrary iterables in `concurrent.futures.as_completed()`. Fixes -regression in 3.6.3rc1. - -.. - -.. bpo: 31662 -.. date: 2017-10-03-01-06-24 -.. nonce: 8l2jEz -.. section: Build - -Fix typos in Windows ``uploadrelease.bat`` script. Fix Windows Doc build -issues in ``Doc/make.bat``. - -.. - -.. bpo: 31423 -.. date: 2017-10-03-01-01-52 -.. nonce: uKvPYA -.. section: Build - -Fix building the PDF documentation with newer versions of Sphinx. diff --git a/Misc/NEWS.d/3.6.3rc1.rst b/Misc/NEWS.d/3.6.3rc1.rst deleted file mode 100644 index 4dc2eef5d3b61bdf3a3763311e781d04c25c38ee..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.3rc1.rst +++ /dev/null @@ -1,1243 +0,0 @@ -.. bpo: 29781 -.. date: 2017-09-05-15-26-30 -.. nonce: LwYtBP -.. release date: 2017-09-18 -.. section: Security - -SSLObject.version() now correctly returns None when handshake over BIO has -not been performed yet. - -.. - -.. bpo: 30947 -.. date: 2017-08-16-16-35-59 -.. nonce: iNMmm4 -.. section: Security - -Upgrade libexpat embedded copy from version 2.2.1 to 2.2.3 to get security -fixes. - -.. - -.. bpo: 31471 -.. date: 2017-09-14-19-47-57 -.. nonce: 0yiA5Q -.. section: Core and Builtins - -Fix an assertion failure in `subprocess.Popen()` on Windows, in case the env -argument has a bad keys() method. Patch by Oren Milman. - -.. - -.. bpo: 31418 -.. date: 2017-09-13-13-03-52 -.. nonce: rS-FlC -.. section: Core and Builtins - -Fix an assertion failure in `PyErr_WriteUnraisable()` in case of an -exception with a bad ``__module__`` attribute. Patch by Oren Milman. - -.. - -.. bpo: 31416 -.. date: 2017-09-11-12-54-35 -.. nonce: 2hlQFd -.. section: Core and Builtins - -Fix assertion failures in case of a bad warnings.filters or -warnings.defaultaction. Patch by Oren Milman. - -.. - -.. bpo: 31411 -.. date: 2017-09-11-08-50-41 -.. nonce: HZz82I -.. section: Core and Builtins - -Raise a TypeError instead of SystemError in case warnings.onceregistry is -not a dictionary. Patch by Oren Milman. - -.. - -.. bpo: 31373 -.. date: 2017-09-06-15-25-59 -.. nonce: dC4jd4 -.. section: Core and Builtins - -Fix several possible instances of undefined behavior due to floating-point -demotions. - -.. - -.. bpo: 30465 -.. date: 2017-09-06-10-47-29 -.. nonce: oe-3GD -.. section: Core and Builtins - -Location information (``lineno`` and ``col_offset``) in f-strings is now -(mostly) correct. This fixes tools like flake8 from showing warnings on the -wrong line (typically the first line of the file). - -.. - -.. bpo: 31343 -.. date: 2017-09-04-14-57-27 -.. nonce: Kl_fS5 -.. section: Core and Builtins - -Include sys/sysmacros.h for major(), minor(), and makedev(). GNU C libray -plans to remove the functions from sys/types.h. - -.. - -.. bpo: 31291 -.. date: 2017-08-28-11-51-29 -.. nonce: t8QggK -.. section: Core and Builtins - -Fix an assertion failure in `zipimport.zipimporter.get_data` on Windows, -when the return value of ``pathname.replace('/','\\')`` isn't a string. -Patch by Oren Milman. - -.. - -.. bpo: 31271 -.. date: 2017-08-25-20-43-22 -.. nonce: YMduKF -.. section: Core and Builtins - -Fix an assertion failure in the write() method of `io.TextIOWrapper`, when -the encoder doesn't return a bytes object. Patch by Oren Milman. - -.. - -.. bpo: 31243 -.. date: 2017-08-24-13-34-49 -.. nonce: dRJzqR -.. section: Core and Builtins - -Fix a crash in some methods of `io.TextIOWrapper`, when the decoder's state -is invalid. Patch by Oren Milman. - -.. - -.. bpo: 30721 -.. date: 2017-08-18-15-15-20 -.. nonce: Hmc56z -.. section: Core and Builtins - -``print`` now shows correct usage hint for using Python 2 redirection -syntax. Patch by Sanyam Khurana. - -.. - -.. bpo: 31070 -.. date: 2017-08-09-09-40-54 -.. nonce: oDyLiI -.. section: Core and Builtins - -Fix a race condition in importlib _get_module_lock(). - -.. - -.. bpo: 31095 -.. date: 2017-08-01-18-48-30 -.. nonce: bXWZDb -.. section: Core and Builtins - -Fix potential crash during GC caused by ``tp_dealloc`` which doesn't call -``PyObject_GC_UnTrack()``. - -.. - -.. bpo: 31071 -.. date: 2017-07-31-13-28-53 -.. nonce: P9UBDy -.. section: Core and Builtins - -Avoid masking original TypeError in call with * unpacking when other -arguments are passed. - -.. - -.. bpo: 30978 -.. date: 2017-07-21-07-39-05 -.. nonce: f0jODc -.. section: Core and Builtins - -str.format_map() now passes key lookup exceptions through. Previously any -exception was replaced with a KeyError exception. - -.. - -.. bpo: 30808 -.. date: 2017-07-17-12-12-59 -.. nonce: bA3zOv -.. section: Core and Builtins - -Use _Py_atomic API for concurrency-sensitive signal state. - -.. - -.. bpo: 30876 -.. date: 2017-07-11-06-31-32 -.. nonce: x35jZX -.. section: Core and Builtins - -Relative import from unloaded package now reimports the package instead of -failing with SystemError. Relative import from non-package now fails with -ImportError rather than SystemError. - -.. - -.. bpo: 30703 -.. date: 2017-06-28-21-07-32 -.. nonce: ULCdFp -.. section: Core and Builtins - -Improve signal delivery. -Avoid using Py_AddPendingCall from signal handler, to avoid calling -signal-unsafe functions. The tests I'm adding here fail without the rest of -the patch, on Linux and OS X. This means our signal delivery logic had -defects (some signals could be lost). - -.. - -.. bpo: 30765 -.. date: 2017-06-26-14-29-50 -.. nonce: Q5iBmf -.. section: Core and Builtins - -Avoid blocking in pthread_mutex_lock() when PyThread_acquire_lock() is asked -not to block. - -.. - -.. bpo: 31161 -.. date: 06 -.. nonce: FcUAA0 -.. section: Core and Builtins - -Make sure the 'Missing parentheses' syntax error message is only applied to -SyntaxError, not to subclasses. Patch by Martijn Pieters. - -.. - -.. bpo: 30814 -.. date: 05 -.. nonce: HcYsfM -.. section: Core and Builtins - -Fixed a race condition when import a submodule from a package. - -.. - -.. bpo: 30597 -.. date: 04 -.. nonce: 7erHiP -.. section: Core and Builtins - -``print`` now shows expected input in custom error message when used as a -Python 2 statement. Patch by Sanyam Khurana. - -.. - -.. bpo: 31499 -.. date: 2017-09-18-10-57-04 -.. nonce: BydYhf -.. section: Library - -xml.etree: Fix a crash when a parser is part of a reference cycle. - -.. - -.. bpo: 28556 -.. date: 2017-09-14-11-02-56 -.. nonce: EUOiYs -.. section: Library - -typing.get_type_hints now finds the right globalns for classes and modules -by default (when no ``globalns`` was specified by the caller). - -.. - -.. bpo: 28556 -.. date: 2017-09-13-23-27-39 -.. nonce: UmTQvv -.. section: Library - -Speed improvements to the ``typing`` module. Original PRs by Ivan -Levkivskyi and Mitar. - -.. - -.. bpo: 31544 -.. date: 2017-09-13-19-55-35 -.. nonce: beTh6t -.. section: Library - -The C accelerator module of ElementTree ignored exceptions raised when -looking up TreeBuilder target methods in XMLParser(). - -.. - -.. bpo: 31234 -.. date: 2017-09-13-18-05-56 -.. nonce: lGkcPg -.. section: Library - -socket.create_connection() now fixes manually a reference cycle: clear the -variable storing the last exception on success. - -.. - -.. bpo: 31457 -.. date: 2017-09-13-13-33-39 -.. nonce: bIVBtI -.. section: Library - -LoggerAdapter objects can now be nested. - -.. - -.. bpo: 31400 -.. date: 2017-09-08-14-19-57 -.. nonce: YOTPKi -.. section: Library - -Improves SSL error handling to avoid losing error numbers. - -.. - -.. bpo: 28958 -.. date: 2017-09-06-19-41-01 -.. nonce: x4-K5F -.. section: Library - -ssl.SSLContext() now uses OpenSSL error information when a context cannot be -instantiated. - -.. - -.. bpo: 27340 -.. date: 2017-09-06-06-50-41 -.. nonce: GgekV5 -.. section: Library - -SSLSocket.sendall() now uses memoryview to create slices of data. This fixes -support for all bytes-like object. It is also more efficient and avoids -costly copies. - -.. - -.. bpo: 31178 -.. date: 2017-09-05-14-55-28 -.. nonce: JrSFo7 -.. section: Library - -Fix string concatenation bug in rare error path in the subprocess module - -.. - -.. bpo: 31350 -.. date: 2017-09-05-10-30-48 -.. nonce: dXJ-7N -.. section: Library - -Micro-optimize :func:`asyncio._get_running_loop` to become up to 10% faster. - -.. - -.. bpo: 31170 -.. date: 2017-09-04-23-41-35 -.. nonce: QGmJ1t -.. section: Library - -expat: Update libexpat from 2.2.3 to 2.2.4. Fix copying of partial -characters for UTF-8 input (libexpat bug 115): -https://github.com/libexpat/libexpat/issues/115 - -.. - -.. bpo: 29136 -.. date: 2017-09-04-16-39-49 -.. nonce: vSn1oR -.. section: Library - -Add TLS 1.3 cipher suites and OP_NO_TLSv1_3. - -.. - -.. bpo: 29212 -.. date: 2017-09-03-14-31-00 -.. nonce: bicycl -.. section: Library - -Fix concurrent.futures.thread.ThreadPoolExecutor threads to have a non -repr() based thread name by default when no thread_name_prefix is supplied. -They will now identify themselves as "ThreadPoolExecutor-y_n". - -.. - -.. bpo: 9146 -.. date: 2017-09-03-14-10-00 -.. nonce: _-oo-_ -.. section: Library - -Fix a segmentation fault in _hashopenssl when standard hash functions such -as md5 are not available in the linked OpenSSL library. As in some special -FIPS-140 build environments. - -.. - -.. bpo: 27144 -.. date: 2017-08-30-11-26-14 -.. nonce: PEDJsE -.. section: Library - -The ``map()`` and ``as_completed()`` iterators in ``concurrent.futures`` now -avoid keeping a reference to yielded objects. - -.. - -.. bpo: 10746 -.. date: 2017-08-28-13-01-05 -.. nonce: nmAvfu -.. section: Library - -Fix ctypes producing wrong :pep:`3118` type codes for integer types. - -.. - -.. bpo: 22536 -.. date: 2017-08-23 -.. nonce: _narf_ -.. section: Library - -The subprocess module now sets the filename when FileNotFoundError is raised -on POSIX systems due to the executable or cwd not being found. - -.. - -.. bpo: 31249 -.. date: 2017-08-22-12-44-48 -.. nonce: STPbb9 -.. section: Library - -concurrent.futures: WorkItem.run() used by ThreadPoolExecutor now breaks a -reference cycle between an exception object and the WorkItem object. - -.. - -.. bpo: 31247 -.. date: 2017-08-21-17-50-27 -.. nonce: 8S3zJp -.. section: Library - -xmlrpc.server now explicitly breaks reference cycles when using -sys.exc_info() in code handling exceptions. - -.. - -.. bpo: 30102 -.. date: 2017-08-16-21-14-31 -.. nonce: 1sPqmc -.. section: Library - -The ssl and hashlib modules now call OPENSSL_add_all_algorithms_noconf() on -OpenSSL < 1.1.0. The function detects CPU features and enables optimizations -on some CPU architectures such as POWER8. Patch is based on research from -Gustavo Serra Scalet. - -.. - -.. bpo: 31185 -.. date: 2017-08-11-19-30-00 -.. nonce: i6TPgL -.. section: Library - -Fixed miscellaneous errors in asyncio speedup module. - -.. - -.. bpo: 31135 -.. date: 2017-08-08-14-44-37 -.. nonce: HH94xR -.. section: Library - -ttk: fix the destroy() method of LabeledScale and OptionMenu classes. Call -the parent destroy() method even if the used attribute doesn't exist. The -LabeledScale.destroy() method now also explicitly clears label and scale -attributes to help the garbage collector to destroy all widgets. - -.. - -.. bpo: 31107 -.. date: 2017-08-02-12-48-15 -.. nonce: 1t2hn5 -.. section: Library - -Fix `copyreg._slotnames()` mangled attribute calculation for classes whose -name begins with an underscore. Patch by Shane Harvey. - -.. - -.. bpo: 31061 -.. date: 2017-08-01-09-32-58 -.. nonce: husAYX -.. section: Library - -Fixed a crash when using asyncio and threads. - -.. - -.. bpo: 30502 -.. date: 2017-07-27-11-33-58 -.. nonce: GJlfU8 -.. section: Library - -Fix handling of long oids in ssl. Based on patch by Christian Heimes. - -.. - -.. bpo: 30119 -.. date: 2017-07-26-15-15-00 -.. nonce: DZ6C_S -.. section: Library - -ftplib.FTP.putline() now throws ValueError on commands that contains CR or -LF. Patch by Dong-hee Na. - -.. - -.. bpo: 30595 -.. date: 2017-07-26-04-46-12 -.. nonce: -zJ7d8 -.. section: Library - -multiprocessing.Queue.get() with a timeout now polls its reader in -non-blocking mode if it succeeded to acquire the lock but the acquire took -longer than the timeout. - -.. - -.. bpo: 29403 -.. date: 2017-07-20-02-29-49 -.. nonce: 3RinCV -.. section: Library - -Fix ``unittest.mock``'s autospec to not fail on method-bound builtin -functions. Patch by Aaron Gallagher. - -.. - -.. bpo: 30961 -.. date: 2017-07-18-23-47-51 -.. nonce: 064jz0 -.. section: Library - -Fix decrementing a borrowed reference in tracemalloc. - -.. - -.. bpo: 25684 -.. date: 2017-07-17-11-35-00 -.. nonce: usELVx -.. section: Library - -Change ``ttk.OptionMenu`` radiobuttons to be unique across instances of -``OptionMenu``. - -.. - -.. bpo: 30886 -.. date: 2017-07-10-12-14-22 -.. nonce: nqQj34 -.. section: Library - -Fix multiprocessing.Queue.join_thread(): it now waits until the thread -completes, even if the thread was started by the same process which created -the queue. - -.. - -.. bpo: 29854 -.. date: 2017-07-07-02-18-57 -.. nonce: J8wKb_ -.. section: Library - -Fix segfault in readline when using readline's history-size option. Patch -by Nir Soffer. - -.. - -.. bpo: 30319 -.. date: 2017-07-04-13-48-21 -.. nonce: hg_3TX -.. section: Library - -socket.close() now ignores ECONNRESET error. - -.. - -.. bpo: 30828 -.. date: 2017-07-04-13-10-52 -.. nonce: CLvEvV -.. section: Library - -Fix out of bounds write in `asyncio.CFuture.remove_done_callback()`. - -.. - -.. bpo: 30807 -.. date: 2017-06-29-22-04-44 -.. nonce: sLtjY- -.. section: Library - -signal.setitimer() may disable the timer when passed a tiny value. -Tiny values (such as 1e-6) are valid non-zero values for setitimer(), which -is specified as taking microsecond-resolution intervals. However, on some -platform, our conversion routine could convert 1e-6 into a zero interval, -therefore disabling the timer instead of (re-)scheduling it. - -.. - -.. bpo: 30441 -.. date: 2017-06-29-14-25-14 -.. nonce: 3Wh9kc -.. section: Library - -Fix bug when modifying os.environ while iterating over it - -.. - -.. bpo: 30532 -.. date: 2017-06-26-11-01-59 -.. nonce: qTeL1o -.. section: Library - -Fix email header value parser dropping folding white space in certain cases. - -.. - -.. bpo: 30879 -.. date: 03 -.. nonce: N3KI-o -.. section: Library - -os.listdir() and os.scandir() now emit bytes names when called with -bytes-like argument. - -.. - -.. bpo: 30746 -.. date: 02 -.. nonce: 7drQI0 -.. section: Library - -Prohibited the '=' character in environment variable names in -``os.putenv()`` and ``os.spawn*()``. - -.. - -.. bpo: 29755 -.. date: 01 -.. nonce: diQcY_ -.. section: Library - -Fixed the lgettext() family of functions in the gettext module. They now -always return bytes. - -.. - -.. bpo: 31294 -.. date: 2017-09-07-20-49-09 -.. nonce: WgI18w -.. section: Documentation - -Fix incomplete code snippet in the ZeroMQSocketListener and -ZeroMQSocketHandler examples and adapt them to Python 3. - -.. - -.. bpo: 21649 -.. date: 2017-09-06-10-11-57 -.. nonce: EUvqA9 -.. section: Documentation - -Add RFC 7525 and Mozilla server side TLS links to SSL documentation. - -.. - -.. bpo: 30803 -.. date: 2017-07-29-14-55-50 -.. nonce: 6hutqQ -.. section: Documentation - -Clarify doc on truth value testing. Original patch by Peter Thomassen. - -.. - -.. bpo: 31320 -.. date: 2017-09-05-14-23-35 -.. nonce: JRDHx7 -.. section: Tests - -Silence traceback in test_ssl - -.. - -.. bpo: 25674 -.. date: 2017-09-04-13-03-55 -.. nonce: whVTXh -.. section: Tests - -Remove sha256.tbs-internet.com ssl test - -.. - -.. bpo: 30715 -.. date: 2017-07-25-15-27-44 -.. nonce: Sp7bTF -.. section: Tests - -Address ALPN callback changes for OpenSSL 1.1.0f. The latest version behaves -like OpenSSL 1.0.2 and no longer aborts handshake. - -.. - -.. bpo: 30822 -.. date: 2017-07-20-14-29-54 -.. nonce: X0wREo -.. section: Tests - -regrtest: Exclude tzdata from regrtest --all. When running the test suite -using --use=all / -u all, exclude tzdata since it makes test_datetime too -slow (15-20 min on some buildbots) which then times out on some buildbots. -Fix also regrtest command line parser to allow passing -u extralargefile to -run test_zipfile64. - -.. - -.. bpo: 30854 -.. date: 2017-07-05-16-54-59 -.. nonce: sPADRI -.. section: Build - -Fix compile error when compiling --without-threads. Patch by Masayuki -Yamamoto. - -.. - -.. bpo: 30389 -.. date: 2017-09-06-17-14-54 -.. nonce: 9Dizrx -.. section: Windows - -Adds detection of Visual Studio 2017 to distutils on Windows. - -.. - -.. bpo: 31340 -.. date: 2017-09-04-13-19-05 -.. nonce: MbkzLi -.. section: Windows - -Change to building with MSVC v141 (included with Visual Studio 2017) - -.. - -.. bpo: 30581 -.. date: 2017-08-04-10-05-19 -.. nonce: OQhR7l -.. section: Windows - -os.cpu_count() now returns the correct number of processors on Windows when -the number of logical processors is greater than 64. - -.. - -.. bpo: 30731 -.. date: 2017-07-13-11-22-53 -.. nonce: nmMDwI -.. section: Windows - -Add a missing xmlns to python.manifest so that it matches the schema. - -.. - -.. bpo: 31493 -.. date: 2017-09-16-23-43-39 -.. nonce: nmHMCR -.. section: IDLE - -IDLE code context -- fix code update and font update timers. -Canceling timers prevents a warning message when test_idle completes. - -.. - -.. bpo: 31488 -.. date: 2017-09-16-01-21-20 -.. nonce: 0rtXIT -.. section: IDLE - -IDLE - Update non-key options in former extension classes. When applying -configdialog changes, call .reload for each feature class. Change ParenMatch -so updated options affect existing instances attached to existing editor -windows. - -.. - -.. bpo: 31477 -.. date: 2017-09-15-12-38-47 -.. nonce: n__6sa -.. section: IDLE - -IDLE - Improve rstrip entry in doc. Strip trailing whitespace strips more -than blank spaces. Multiline string literals are not skipped. - -.. - -.. bpo: 31480 -.. date: 2017-09-14-17-53-53 -.. nonce: 4WJ0pl -.. section: IDLE - -IDLE - make tests pass with zzdummy extension disabled by default. - -.. - -.. bpo: 31421 -.. date: 2017-09-12-08-38-27 -.. nonce: mYfQNq -.. section: IDLE - -Document how IDLE runs tkinter programs. IDLE calls tcl/tk update in the -background in order to make live -interaction and experimentation with tkinter applications much easier. - -.. - -.. bpo: 31414 -.. date: 2017-09-11-15-46-05 -.. nonce: wiepgK -.. section: IDLE - -IDLE -- fix tk entry box tests by deleting first. Adding to an int entry is -not the same as deleting and inserting because int('') will fail. - -.. - -.. bpo: 31051 -.. date: 2017-08-30-00-06-58 -.. nonce: 50Jp_Q -.. section: IDLE - -Rearrange IDLE configdialog GenPage into Window, Editor, and Help sections. - -.. - -.. bpo: 30617 -.. date: 2017-08-27-16-49-36 -.. nonce: UHnswr -.. section: IDLE - -IDLE - Add docstrings and tests for outwin subclass of editor. -Move some data and functions from the class to module level. Patch by Cheryl -Sabella. - -.. - -.. bpo: 31287 -.. date: 2017-08-27-15-31-33 -.. nonce: aZERfI -.. section: IDLE - -IDLE - Do not modify tkinter.message in test_configdialog. - -.. - -.. bpo: 27099 -.. date: 2017-08-24-13-48-16 -.. nonce: rENefC -.. section: IDLE - -Convert IDLE's built-in 'extensions' to regular features. -About 10 IDLE features were implemented as supposedly optional extensions. -Their different behavior could be confusing or worse for users and not good -for maintenance. Hence the conversion. -The main difference for users is that user configurable key bindings for -builtin features are now handled uniformly. Now, editing a binding in a -keyset only affects its value in the keyset. All bindings are defined -together in the system-specific default keysets in config-extensions.def. -All custom keysets are saved as a whole in config-extension.cfg. All take -effect as soon as one clicks Apply or Ok. -The affected events are '<>', '<>', -'<>', '<>', '<>', -'<>', '<>', and '<>'. Any (global) -customizations made before 3.6.3 will not affect their keyset-specific -customization after 3.6.3. and vice versa. -Initial patch by Charles Wohlganger. - -.. - -.. bpo: 31206 -.. date: 2017-08-18-14-13-42 -.. nonce: F1-tKK -.. section: IDLE - -IDLE: Factor HighPage(Frame) class from ConfigDialog. Patch by Cheryl -Sabella. - -.. - -.. bpo: 31001 -.. date: 2017-08-17-15-00-20 -.. nonce: KLxYHC -.. section: IDLE - -Add tests for configdialog highlight tab. Patch by Cheryl Sabella. - -.. - -.. bpo: 31205 -.. date: 2017-08-15-12-58-23 -.. nonce: iuziZ5 -.. section: IDLE - -IDLE: Factor KeysPage(Frame) class from ConfigDialog. The slightly modified -tests continue to pass. Patch by Cheryl Sabella. - -.. - -.. bpo: 31130 -.. date: 2017-08-07-14-02-56 -.. nonce: FbsC7f -.. section: IDLE - -IDLE -- stop leaks in test_configdialog. Initial patch by Victor Stinner. - -.. - -.. bpo: 31002 -.. date: 2017-08-03-17-54-02 -.. nonce: kUSgTE -.. section: IDLE - -Add tests for configdialog keys tab. Patch by Cheryl Sabella. - -.. - -.. bpo: 19903 -.. date: 2017-08-03-14-08-42 -.. nonce: sqE1FS -.. section: IDLE - -IDLE: Calltips use `inspect.signature` instead of `inspect.getfullargspec`. -This improves calltips for builtins converted to use Argument Clinic. Patch -by Louie Lu. - -.. - -.. bpo: 31083 -.. date: 2017-07-31-23-20-51 -.. nonce: 991FXm -.. section: IDLE - -IDLE - Add an outline of a TabPage class in configdialog. Update existing -classes to match outline. Initial patch by Cheryl Sabella. - -.. - -.. bpo: 31050 -.. date: 2017-07-30-17-39-59 -.. nonce: AXR3kP -.. section: IDLE - -Factor GenPage(Frame) class from ConfigDialog. The slightly modified tests -continue to pass. Patch by Cheryl Sabella. - -.. - -.. bpo: 31004 -.. date: 2017-07-30-01-00-58 -.. nonce: m8cc1t -.. section: IDLE - -IDLE - Factor FontPage(Frame) class from ConfigDialog. -Slightly modified tests continue to pass. Fix General tests. Patch mostly by -Cheryl Sabella. - -.. - -.. bpo: 30781 -.. date: 2017-07-28-18-59-06 -.. nonce: ud5m18 -.. section: IDLE - -IDLE - Use ttk widgets in ConfigDialog. Patches by Terry Jan Reedy and -Cheryl Sabella. - -.. - -.. bpo: 31060 -.. date: 2017-07-27-14-48-42 -.. nonce: GdY_VY -.. section: IDLE - -IDLE - Finish rearranging methods of ConfigDialog Grouping methods -pertaining to each tab and the buttons will aid writing tests and improving -the tabs and will enable splitting the groups into classes. - -.. - -.. bpo: 30853 -.. date: 2017-07-27-10-01-14 -.. nonce: enPvvc -.. section: IDLE - -IDLE -- Factor a VarTrace class out of ConfigDialog. -Instance tracers manages pairs consisting of a tk variable and a callback -function. When tracing is turned on, setting the variable calls the -function. Test coverage for the new class is 100%. - -.. - -.. bpo: 31003 -.. date: 2017-07-25-01-28-35 -.. nonce: bYINVH -.. section: IDLE - -IDLE: Add more tests for General tab. - -.. - -.. bpo: 30993 -.. date: 2017-07-22-18-08-41 -.. nonce: 34vJkB -.. section: IDLE - -IDLE - Improve configdialog font page and tests. -In configdialog: Document causal pathways in create_font_tab docstring. -Simplify some attribute names. Move set_samples calls to var_changed_font -(idea from Cheryl Sabella). Move related functions to positions after the -create widgets function. -In test_configdialog: Fix test_font_set so not order dependent. Fix renamed -test_indent_scale so it tests the widget. Adjust tests for movement of -set_samples call. Add tests for load functions. Put all font tests in one -class and tab indent tests in another. Except for two lines, these tests -completely cover the related functions. - -.. - -.. bpo: 30981 -.. date: 2017-07-21-01-55-14 -.. nonce: ZFvQPt -.. section: IDLE - -IDLE -- Add more configdialog font page tests. - -.. - -.. bpo: 28523 -.. date: 2017-07-21-00-54-52 -.. nonce: OPcqYJ -.. section: IDLE - -IDLE: replace 'colour' with 'color' in configdialog. - -.. - -.. bpo: 30917 -.. date: 2017-07-17-23-35-57 -.. nonce: hSiuuO -.. section: IDLE - -Add tests for idlelib.config.IdleConf. Increase coverage from 46% to 96%. -Patch by Louie Lu. - -.. - -.. bpo: 30934 -.. date: 2017-07-15-22-26-57 -.. nonce: BanuSB -.. section: IDLE - -Document coverage details for idlelib tests. -Add section to idlelib/idle-test/README.txt. -Include check that branches are taken both ways. -Exclude IDLE-specific code that does not run during unit tests. - -.. - -.. bpo: 30913 -.. date: 2017-07-13-23-07-33 -.. nonce: aezn_e -.. section: IDLE - -IDLE: Document ConfigDialog tk Vars, methods, and widgets in docstrings This -will facilitate improving the dialog and splitting up the class. Original -patch by Cheryl Sabella. - -.. - -.. bpo: 30899 -.. date: 2017-07-11-02-26-17 -.. nonce: SQmVO8 -.. section: IDLE - -IDLE: Add tests for ConfigParser subclasses in config. Patch by Louie Lu. - -.. - -.. bpo: 30881 -.. date: 2017-07-11-02-21-42 -.. nonce: 4KAq_9 -.. section: IDLE - -IDLE: Add docstrings to browser.py. Patch by Cheryl Sabella. - -.. - -.. bpo: 30851 -.. date: 2017-07-09-23-53-00 -.. nonce: AHXBYa -.. section: IDLE - -IDLE: Remove unused variables in configdialog. One is a duplicate, one is -set but cannot be altered by users. Patch by Cheryl Sabella. - -.. - -.. bpo: 30870 -.. date: 2017-07-08-17-57-04 -.. nonce: IcR2pf -.. section: IDLE - -IDLE: In Settings dialog, select font with Up, Down keys as well as mouse. -Initial patch by Louie Lu. - -.. - -.. bpo: 8231 -.. date: 2017-07-07-21-10-55 -.. nonce: yEge3L -.. section: IDLE - -IDLE: call config.IdleConf.GetUserCfgDir only once. - -.. - -.. bpo: 30779 -.. date: 2017-07-07-20-26-37 -.. nonce: 8KXEXN -.. section: IDLE - -IDLE: Factor ConfigChanges class from configdialog, put in config; test. * -In config, put dump test code in a function; run it and unittest in 'if -__name__ == '__main__'. * Add class config.ConfigChanges based on -changes_class_v4.py on bpo issue. * Add class test_config.ChangesTest, -partly using configdialog_tests_v1.py. * Revise configdialog to use -ConfigChanges; see tracker msg297804. * Revise test_configdialog to match -configdialog changes. * Remove configdialog functions unused or moved to -ConfigChanges. Cheryl Sabella contributed parts of the patch. - -.. - -.. bpo: 30777 -.. date: 2017-07-04-22-45-46 -.. nonce: uxzlMB -.. section: IDLE - -IDLE: configdialog - Add docstrings and fix comments. Patch by Cheryl -Sabella. - -.. - -.. bpo: 30495 -.. date: 2017-06-29-18-23-06 -.. nonce: qIWgc4 -.. section: IDLE - -IDLE: Improve textview with docstrings, PEP8 names, and more tests. Patch by -Cheryl Sabella. - -.. - -.. bpo: 30723 -.. date: 2017-06-27-19-05-40 -.. nonce: rQh06y -.. section: IDLE - -IDLE: Make several improvements to parenmatch. Add 'parens' style to -highlight both opener and closer. Make 'default' style, which is not -default, a synonym for 'opener'. Make time-delay work the same with all -styles. Add help for config dialog extensions tab, including help for -parenmatch. Add new tests. Original patch by Charles Wohlganger. - -.. - -.. bpo: 30674 -.. date: 2017-06-27-01-40-34 -.. nonce: ppK_q8 -.. section: IDLE - -IDLE: add docstrings to grep module. Patch by Cheryl Sabella - -.. - -.. bpo: 21519 -.. date: 2017-06-27-00-29-56 -.. nonce: fTj9T0 -.. section: IDLE - -IDLE's basic custom key entry dialog now detects duplicates properly. -Original patch by Saimadhav Heblikar. - -.. - -.. bpo: 29910 -.. date: 2017-06-26-22-45-27 -.. nonce: mqHh7u -.. section: IDLE - -IDLE no longer deletes a character after commenting out a region by a key -shortcut. Add ``return 'break'`` for this and other potential conflicts -between IDLE and default key bindings. - -.. - -.. bpo: 30728 -.. date: 2017-06-26-15-47-13 -.. nonce: qH4TGL -.. section: IDLE - -Review and change idlelib.configdialog names. Lowercase method and attribute -names. Replace 'colour' with 'color', expand overly cryptic names, delete -unneeded underscores. Replace ``import *`` with specific imports. Patches by -Cheryl Sabella. - -.. - -.. bpo: 6739 -.. date: 2017-06-26-00-28-59 -.. nonce: x5MfhB -.. section: IDLE - -IDLE: Verify user-entered key sequences by trying to bind them with tk. Add -tests for all 3 validation functions. Original patch by G Polo. Tests added -by Cheryl Sabella. - -.. - -.. bpo: 30983 -.. date: 2017-08-18-17-19-23 -.. nonce: ggGz9z -.. section: Tools/Demos - -gdb integration commands (py-bt, etc.) work on optimized shared builds now, -too. :pep:`523` introduced _PyEval_EvalFrameDefault which inlines -PyEval_EvalFrameEx on non-debug shared builds. This broke the ability to -use py-bt, py-up, and a few other Python-specific gdb integrations. The -problem is fixed by only looking for _PyEval_EvalFrameDefault frames in -python-gdb.py. Original patch by Bruno "Polaco" Penteado. diff --git a/Misc/NEWS.d/3.6.4.rst b/Misc/NEWS.d/3.6.4.rst deleted file mode 100644 index cf23101035c89e7c6dc3438956ee13f9eddb38b9..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.4.rst +++ /dev/null @@ -1,8 +0,0 @@ -.. bpo: 0 -.. date: 2017-12-18 -.. no changes: True -.. nonce: qH8KPG -.. release date: 2017-12-18 -.. section: Library - -There were no new code changes in version 3.6.4 since v3.6.4rc1. diff --git a/Misc/NEWS.d/3.6.4rc1.rst b/Misc/NEWS.d/3.6.4rc1.rst deleted file mode 100644 index 36dfadda0fe1b397d9e8622c27a3805721003aa0..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.4rc1.rst +++ /dev/null @@ -1,1129 +0,0 @@ -.. bpo: 32176 -.. date: 2017-12-02-21-37-22 -.. nonce: Wt25-N -.. release date: 2017-12-05 -.. section: Core and Builtins - -co_flags.CO_NOFREE is now always set correctly by the code object -constructor based on freevars and cellvars, rather than needing to be set -correctly by the caller. This ensures it will be cleared automatically when -additional cell references are injected into a modified code object and -function. - -.. - -.. bpo: 31949 -.. date: 2017-11-05-16-11-07 -.. nonce: 2yNC_z -.. section: Core and Builtins - -Fixed several issues in printing tracebacks (PyTraceBack_Print()). -Setting sys.tracebacklimit to 0 or less now suppresses printing tracebacks. -Setting sys.tracebacklimit to None now causes using the default limit. -Setting sys.tracebacklimit to an integer larger than LONG_MAX now means using -the limit LONG_MAX rather than the default limit. -Fixed integer overflows in the case of more than 2**31 traceback items on -Windows. -Fixed output errors handling. - -.. - -.. bpo: 30696 -.. date: 2017-10-28-22-06-03 -.. nonce: lhC3HE -.. section: Core and Builtins - -Fix the interactive interpreter looping endlessly when no memory. - -.. - -.. bpo: 20047 -.. date: 2017-10-28-19-11-05 -.. nonce: GuNAto -.. section: Core and Builtins - -Bytearray methods partition() and rpartition() now accept only bytes-like -objects as separator, as documented. In particular they now raise TypeError -rather of returning a bogus result when an integer is passed as a separator. - -.. - -.. bpo: 31852 -.. date: 2017-10-27-19-18-44 -.. nonce: P_4cVr -.. section: Core and Builtins - -Fix a segmentation fault caused by a combination of the async soft keyword -and continuation lines. - -.. - -.. bpo: 21720 -.. date: 2017-10-25-15-51-37 -.. nonce: BwIKLP -.. section: Core and Builtins - -BytesWarning no longer emitted when the *fromlist* argument of -``__import__()`` or the ``__all__`` attribute of the module contain bytes -instances. - -.. - -.. bpo: 31825 -.. date: 2017-10-20-14-07-46 -.. nonce: gJvmGW -.. section: Core and Builtins - -Fixed OverflowError in the 'unicode-escape' codec and in -codecs.escape_decode() when decode an escaped non-ascii byte. - -.. - -.. bpo: 28603 -.. date: 2017-10-17-13-29-19 -.. nonce: _-oia3 -.. section: Core and Builtins - -Print the full context/cause chain of exceptions on interpreter exit, even -if an exception in the chain is unhashable or compares equal to later ones. -Patch by Zane Bitter. - -.. - -.. bpo: 31786 -.. date: 2017-10-15-23-44-57 -.. nonce: XwdEP4 -.. section: Core and Builtins - -Fix timeout rounding in the select module to round correctly negative -timeouts between -1.0 and 0.0. The functions now block waiting for events as -expected. Previously, the call was incorrectly non-blocking. Patch by Pablo -Galindo. - -.. - -.. bpo: 31642 -.. date: 2017-10-08-10-00-55 -.. nonce: 1IKqgs -.. section: Core and Builtins - -Restored blocking "from package import module" by setting -sys.modules["package.module"] to None. - -.. - -.. bpo: 31626 -.. date: 2017-10-01-15-48-03 -.. nonce: reLPxY -.. section: Core and Builtins - -Fixed a bug in debug memory allocator. There was a write to freed memory -after shrinking a memory block. - -.. - -.. bpo: 31619 -.. date: 2017-09-29-20-32-24 -.. nonce: 6gQ1kv -.. section: Core and Builtins - -Fixed a ValueError when convert a string with large number of underscores to -integer with binary base. - -.. - -.. bpo: 31592 -.. date: 2017-09-26-16-05-04 -.. nonce: IFBZj9 -.. section: Core and Builtins - -Fixed an assertion failure in Python parser in case of a bad -`unicodedata.normalize()`. Patch by Oren Milman. - -.. - -.. bpo: 31588 -.. date: 2017-09-26-13-03-16 -.. nonce: wT9Iy7 -.. section: Core and Builtins - -Raise a `TypeError` with a helpful error message when class creation fails -due to a metaclass with a bad ``__prepare__()`` method. Patch by Oren -Milman. - -.. - -.. bpo: 31566 -.. date: 2017-09-24-09-57-04 -.. nonce: OxwINs -.. section: Core and Builtins - -Fix an assertion failure in `_warnings.warn()` in case of a bad ``__name__`` -global. Patch by Oren Milman. - -.. - -.. bpo: 31505 -.. date: 2017-09-18-12-07-39 -.. nonce: VomaFa -.. section: Core and Builtins - -Fix an assertion failure in `json`, in case `_json.make_encoder()` received -a bad `encoder()` argument. Patch by Oren Milman. - -.. - -.. bpo: 31492 -.. date: 2017-09-16-22-49-16 -.. nonce: RtyteL -.. section: Core and Builtins - -Fix assertion failures in case of failing to import from a module with a bad -``__name__`` attribute, and in case of failing to access an attribute of -such a module. Patch by Oren Milman. - -.. - -.. bpo: 31490 -.. date: 2017-09-16-13-32-35 -.. nonce: r7m2sj -.. section: Core and Builtins - -Fix an assertion failure in `ctypes` class definition, in case the class has -an attribute whose name is specified in ``_anonymous_`` but not in -``_fields_``. Patch by Oren Milman. - -.. - -.. bpo: 31478 -.. date: 2017-09-15-09-13-07 -.. nonce: o06iKD -.. section: Core and Builtins - -Fix an assertion failure in `_random.Random.seed()` in case the argument has -a bad ``__abs__()`` method. Patch by Oren Milman. - -.. - -.. bpo: 31315 -.. date: 2017-09-01-00-40-58 -.. nonce: ZX20bl -.. section: Core and Builtins - -Fix an assertion failure in imp.create_dynamic(), when spec.name is not a -string. Patch by Oren Milman. - -.. - -.. bpo: 31311 -.. date: 2017-08-31-17-52-56 -.. nonce: bNE2l- -.. section: Core and Builtins - -Fix a crash in the ``__setstate__()`` method of `ctypes._CData`, in case of -a bad ``__dict__``. Patch by Oren Milman. - -.. - -.. bpo: 31293 -.. date: 2017-08-28-17-51-42 -.. nonce: eMYZXj -.. section: Core and Builtins - -Fix crashes in true division and multiplication of a timedelta object by a -float with a bad as_integer_ratio() method. Patch by Oren Milman. - -.. - -.. bpo: 31285 -.. date: 2017-08-27-21-18-30 -.. nonce: 7lzaKV -.. section: Core and Builtins - -Fix an assertion failure in `warnings.warn_explicit`, when the return value -of the received loader's get_source() has a bad splitlines() method. Patch -by Oren Milman. - -.. - -.. bpo: 30817 -.. date: 2017-07-01-15-11-13 -.. nonce: j7ZvN_ -.. section: Core and Builtins - -`PyErr_PrintEx()` clears now the ignored exception that may be raised by -`_PySys_SetObjectId()`, for example when no memory. - -.. - -.. bpo: 28556 -.. date: 2017-12-05-02-03-07 -.. nonce: 9Z_PsJ -.. section: Library - -Two minor fixes for ``typing`` module: allow shallow copying instances of -generic classes, improve interaction of ``__init_subclass__`` with generics. -Original PRs by Ivan Levkivskyi. - -.. - -.. bpo: 27240 -.. date: 2017-12-02-16-06-00 -.. nonce: Kji34M -.. section: Library - -The header folding algorithm for the new email policies has been rewritten, -which also fixes bpo-30788, bpo-31831, and bpo-32182. In particular, -RFC2231 folding is now done correctly. - -.. - -.. bpo: 32186 -.. date: 2017-11-30-20-38-16 -.. nonce: O42bVe -.. section: Library - -io.FileIO.readall() and io.FileIO.read() now release the GIL when getting -the file size. Fixed hang of all threads with inaccessible NFS server. Patch -by Nir Soffer. - -.. - -.. bpo: 12239 -.. date: 2017-11-24-14-07-55 -.. nonce: Nj3A0x -.. section: Library - -Make :meth:`msilib.SummaryInformation.GetProperty` return ``None`` when the -value of property is ``VT_EMPTY``. Initial patch by Mark Mc Mahon. - -.. - -.. bpo: 31325 -.. date: 2017-11-23-22-12-11 -.. nonce: 8jAUxN -.. section: Library - -Fix wrong usage of :func:`collections.namedtuple` in the -:meth:`RobotFileParser.parse() ` -method. -Initial patch by Robin Wellner. - -.. - -.. bpo: 12382 -.. date: 2017-11-23-21-47-36 -.. nonce: xWT9k0 -.. section: Library - -:func:`msilib.OpenDatabase` now raises a better exception message when it -couldn't open or create an MSI file. Initial patch by William Tisäter. - -.. - -.. bpo: 32110 -.. date: 2017-11-22-09-44-15 -.. nonce: VJa9bo -.. section: Library - -``codecs.StreamReader.read(n)`` now returns not more than *n* -characters/bytes for non-negative *n*. This makes it compatible with -``read()`` methods of other file-like objects. - -.. - -.. bpo: 32072 -.. date: 2017-11-18-21-13-52 -.. nonce: nwDV8L -.. section: Library - -Fixed issues with binary plists: -Fixed saving bytearrays. -Identical objects will be saved only once. -Equal references will be load as identical objects. -Added support for saving and loading recursive data structures. - -.. - -.. bpo: 32034 -.. date: 2017-11-15-13-44-28 -.. nonce: uHAOmu -.. section: Library - -Make asyncio.IncompleteReadError and LimitOverrunError pickleable. - -.. - -.. bpo: 32015 -.. date: 2017-11-13-17-48-33 -.. nonce: 4nqRTD -.. section: Library - -Fixed the looping of asyncio in the case of reconnection the socket during -waiting async read/write from/to the socket. - -.. - -.. bpo: 32011 -.. date: 2017-11-12-20-47-59 -.. nonce: NzVDdZ -.. section: Library - -Restored support of loading marshal files with the TYPE_INT64 code. These -files can be produced in Python 2.7. - -.. - -.. bpo: 31970 -.. date: 2017-11-07-14-20-09 -.. nonce: x4EN_9 -.. section: Library - -Reduce performance overhead of asyncio debug mode. - -.. - -.. bpo: 9678 -.. date: 2017-11-03-22-05-47 -.. nonce: oD51q6 -.. section: Library - -Fixed determining the MAC address in the uuid module: -Using ifconfig on NetBSD and OpenBSD. -Using arp on Linux, FreeBSD, NetBSD and OpenBSD. -Based on patch by Takayuki Shimizukawa. - -.. - -.. bpo: 30057 -.. date: 2017-11-03-19-11-43 -.. nonce: NCaijI -.. section: Library - -Fix potential missed signal in signal.signal(). - -.. - -.. bpo: 31933 -.. date: 2017-11-03-08-36-03 -.. nonce: UrtoMP -.. section: Library - -Fix Blake2 params leaf_size and node_offset on big endian platforms. Patch -by Jack O'Connor. - -.. - -.. bpo: 31927 -.. date: 2017-11-02-18-26-40 -.. nonce: 40K6kp -.. section: Library - -Fixed compilation of the socket module on NetBSD 8. Fixed assertion failure -or reading arbitrary data when parse a AF_BLUETOOTH address on NetBSD and -DragonFly BSD. - -.. - -.. bpo: 27666 -.. date: 2017-11-01-18-13-42 -.. nonce: j2zRnF -.. section: Library - -Fixed stack corruption in curses.box() and curses.ungetmouse() when the size -of types chtype or mmask_t is less than the size of C long. curses.box() -now accepts characters as arguments. Based on patch by Steve Fink. - -.. - -.. bpo: 31897 -.. date: 2017-10-30-11-04-56 -.. nonce: yjwdEb -.. section: Library - -plistlib now catches more errors when read binary plists and raises -InvalidFileException instead of unexpected exceptions. - -.. - -.. bpo: 25720 -.. date: 2017-10-29-17-52-40 -.. nonce: vSvb5h -.. section: Library - -Fix the method for checking pad state of curses WINDOW. Patch by Masayuki -Yamamoto. - -.. - -.. bpo: 31893 -.. date: 2017-10-29-13-51-01 -.. nonce: 8LZKEz -.. section: Library - -Fixed the layout of the kqueue_event structure on OpenBSD and NetBSD. Fixed -the comparison of the kqueue_event objects. - -.. - -.. bpo: 31891 -.. date: 2017-10-29-11-23-24 -.. nonce: 9kAPha -.. section: Library - -Fixed building the curses module on NetBSD. - -.. - -.. bpo: 28416 -.. date: 2017-10-23-12-05-33 -.. nonce: Ldnw8X -.. section: Library - -Instances of pickle.Pickler subclass with the persistent_id() method and -pickle.Unpickler subclass with the persistent_load() method no longer create -reference cycles. - -.. - -.. bpo: 28326 -.. date: 2017-10-22-11-06-02 -.. nonce: rxh7L4 -.. section: Library - -Fix multiprocessing.Process when stdout and/or stderr is closed or None. - -.. - -.. bpo: 31457 -.. date: 2017-10-18-19-05-17 -.. nonce: KlE6r8 -.. section: Library - -If nested log adapters are used, the inner ``process()`` methods are no -longer omitted. - -.. - -.. bpo: 31457 -.. date: 2017-10-18-16-48-09 -.. nonce: _ovmzp -.. section: Library - -The ``manager`` property on LoggerAdapter objects is now properly settable. - -.. - -.. bpo: 31806 -.. date: 2017-10-17-23-27-03 -.. nonce: TzphdL -.. section: Library - -Fix timeout rounding in time.sleep(), threading.Lock.acquire() and -socket.socket.settimeout() to round correctly negative timeouts between -1.0 -and 0.0. The functions now block waiting for events as expected. Previously, -the call was incorrectly non-blocking. Patch by Pablo Galindo. - -.. - -.. bpo: 28603 -.. date: 2017-10-17-12-29-18 -.. nonce: tGuX2C -.. section: Library - -traceback: Fix a TypeError that occurred during printing of exception -tracebacks when either the current exception or an exception in its -context/cause chain is unhashable. Patch by Zane Bitter. - -.. - -.. bpo: 30058 -.. date: 2017-10-12-19-00-53 -.. nonce: cENtry -.. section: Library - -Fixed buffer overflow in select.kqueue.control(). - -.. - -.. bpo: 31770 -.. date: 2017-10-12-18-45-38 -.. nonce: GV3MPx -.. section: Library - -Prevent a crash when calling the ``__init__()`` method of a -``sqlite3.Cursor`` object more than once. Patch by Oren Milman. - -.. - -.. bpo: 31672 -.. date: 2017-10-12-02-47-16 -.. nonce: DaOkVd -.. section: Library - -``idpattern`` in ``string.Template`` matched some non-ASCII characters. Now -it uses ``-i`` regular expression local flag to avoid non-ASCII characters. - -.. - -.. bpo: 31764 -.. date: 2017-10-11-22-18-04 -.. nonce: EMyIkK -.. section: Library - -Prevent a crash in ``sqlite3.Cursor.close()`` in case the ``Cursor`` object -is uninitialized. Patch by Oren Milman. - -.. - -.. bpo: 31752 -.. date: 2017-10-11-00-45-01 -.. nonce: DhWevN -.. section: Library - -Fix possible crash in timedelta constructor called with custom integers. - -.. - -.. bpo: 31701 -.. date: 2017-10-09-17-42-30 -.. nonce: NRrVel -.. section: Library - -On Windows, faulthandler.enable() now ignores MSC and COM exceptions. - -.. - -.. bpo: 31728 -.. date: 2017-10-08-23-28-30 -.. nonce: XrVMME -.. section: Library - -Prevent crashes in `_elementtree` due to unsafe cleanup of `Element.text` -and `Element.tail`. Patch by Oren Milman. - -.. - -.. bpo: 31620 -.. date: 2017-10-06-04-35-31 -.. nonce: gksLA1 -.. section: Library - -an empty asyncio.Queue now doesn't leak memory when queue.get pollers -timeout - -.. - -.. bpo: 31632 -.. date: 2017-10-04-11-37-14 -.. nonce: LiOC3C -.. section: Library - -Fix method set_protocol() of class _SSLProtocolTransport in asyncio module. -This method was previously modifying a wrong reference to the protocol. - -.. - -.. bpo: 31675 -.. date: 2017-10-03-15-06-24 -.. nonce: Nh7jJ3 -.. section: Library - -Fixed memory leaks in Tkinter's methods splitlist() and split() when pass a -string larger than 2 GiB. - -.. - -.. bpo: 31673 -.. date: 2017-10-03-14-37-46 -.. nonce: RFCrka -.. section: Library - -Fixed typo in the name of Tkinter's method adderrorinfo(). - -.. - -.. bpo: 30806 -.. date: 2017-09-29 -.. nonce: lP5GrH -.. section: Library - -Fix the string representation of a netrc object. - -.. - -.. bpo: 15037 -.. date: 2017-09-29-19-19-36 -.. nonce: ykimLK -.. section: Library - -Added a workaround for getkey() in curses for ncurses 5.7 and earlier. - -.. - -.. bpo: 25351 -.. date: 2017-09-28-23-10-51 -.. nonce: 2JmFpF -.. section: Library - -Avoid venv activate failures with undefined variables - -.. - -.. bpo: 25532 -.. date: 2017-09-27-08-11-38 -.. nonce: ey4Yez -.. section: Library - -inspect.unwrap() will now only try to unwrap an object -sys.getrecursionlimit() times, to protect against objects which create a new -object on every attribute access. - -.. - -.. bpo: 30347 -.. date: 2017-09-25-14-04-30 -.. nonce: B4--_D -.. section: Library - -Stop crashes when concurrently iterate over itertools.groupby() iterators. - -.. - -.. bpo: 31516 -.. date: 2017-09-20-18-43-01 -.. nonce: 23Yuq3 -.. section: Library - -``threading.current_thread()`` should not return a dummy thread at shutdown. - -.. - -.. bpo: 31351 -.. date: 2017-09-17-15-24-25 -.. nonce: yQdKv- -.. section: Library - -python -m ensurepip now exits with non-zero exit code if pip bootstrapping -has failed. - -.. - -.. bpo: 31482 -.. date: 2017-09-16-01-53-11 -.. nonce: 39s5dS -.. section: Library - -``random.seed()`` now works with bytes in version=1 - -.. - -.. bpo: 31334 -.. date: 2017-09-04-00-22-31 -.. nonce: 9WYRfi -.. section: Library - -Fix ``poll.poll([timeout])`` in the ``select`` module for arbitrary negative -timeouts on all OSes where it can only be a non-negative integer or -1. -Patch by Riccardo Coccioli. - -.. - -.. bpo: 31310 -.. date: 2017-08-30-18-23-54 -.. nonce: 7D1UNt -.. section: Library - -multiprocessing's semaphore tracker should be launched again if crashed. - -.. - -.. bpo: 31308 -.. date: 2017-08-30-17-59-36 -.. nonce: KbexyC -.. section: Library - -Make multiprocessing's forkserver process immune to Ctrl-C and other user -interruptions. If it crashes, restart it when necessary. - -.. - -.. bpo: 32105 -.. date: 2017-11-21-10-54-16 -.. nonce: 91mhWm -.. section: Documentation - -Added asyncio.BaseEventLoop.connect_accepted_socket versionadded marker. - -.. - -.. bpo: 31537 -.. date: 2017-10-08-23-02-14 -.. nonce: SiFNM8 -.. section: Documentation - -Fix incorrect usage of ``get_history_length`` in readline documentation -example code. Patch by Brad Smith. - -.. - -.. bpo: 30085 -.. date: 2017-09-14-18-44-50 -.. nonce: 0J9w-u -.. section: Documentation - -The operator functions without double underscores are preferred for clarity. -The one with underscores are only kept for back-compatibility. - -.. - -.. bpo: 31380 -.. date: 2017-12-04-23-19-16 -.. nonce: VlMmHW -.. section: Tests - -Skip test_httpservers test_undecodable_file on macOS: fails on APFS. - -.. - -.. bpo: 31705 -.. date: 2017-11-30-12-27-10 -.. nonce: yULW7O -.. section: Tests - -Skip test_socket.test_sha256() on Linux kernel older than 4.5. The test -fails with ENOKEY on kernel 3.10 (on ppc64le). A fix was merged into the -kernel 4.5. - -.. - -.. bpo: 31174 -.. date: 2017-10-24-11-36-10 -.. nonce: xCvXcr -.. section: Tests - -Fix test_tools.test_unparse: DirectoryTestCase now stores the names sample -to always test the same files. It prevents false alarms when hunting -reference leaks. - -.. - -.. bpo: 30695 -.. date: 2017-06-30-11-20-20 -.. nonce: lo7FQX -.. section: Tests - -Add the `set_nomemory(start, stop)` and `remove_mem_hooks()` functions to -the _testcapi module. - -.. - -.. bpo: 32059 -.. date: 2017-11-18-11-19-28 -.. nonce: a0Hxgp -.. section: Build - -``detect_modules()`` in ``setup.py`` now also searches the sysroot paths -when cross-compiling. - -.. - -.. bpo: 31957 -.. date: 2017-11-06-11-53-39 -.. nonce: S_1jFK -.. section: Build - -Fixes Windows SDK version detection when building for Windows. - -.. - -.. bpo: 31609 -.. date: 2017-11-04-15-35-08 -.. nonce: k7_nBR -.. section: Build - -Fixes quotes in PCbuild/clean.bat - -.. - -.. bpo: 31934 -.. date: 2017-11-03-15-17-50 -.. nonce: 8bUlpv -.. section: Build - -Abort the build when building out of a not clean source tree. - -.. - -.. bpo: 31926 -.. date: 2017-11-03-10-07-14 -.. nonce: 57wE98 -.. section: Build - -Fixed Argument Clinic sometimes causing compilation errors when there was -more than one function and/or method in a .c file with the same name. - -.. - -.. bpo: 28791 -.. date: 2017-11-02-20-30-57 -.. nonce: VaE3o8 -.. section: Build - -Update Windows builds to use SQLite 3.21.0. - -.. - -.. bpo: 28791 -.. date: 2017-11-02-20-13-46 -.. nonce: STt3jL -.. section: Build - -Update OS X installer to use SQLite 3.21.0. - -.. - -.. bpo: 22140 -.. date: 2017-09-26-22-39-58 -.. nonce: ZRf7Wn -.. section: Build - -Prevent double substitution of prefix in python-config.sh. - -.. - -.. bpo: 31536 -.. date: 2017-09-20-21-32-21 -.. nonce: KUDjno -.. section: Build - -Avoid wholesale rebuild after `make regen-all` if nothing changed. - -.. - -.. bpo: 1102 -.. date: 2017-11-19-09-46-27 -.. nonce: NY-g1F -.. section: Windows - -Return ``None`` when ``View.Fetch()`` returns ``ERROR_NO_MORE_ITEMS`` -instead of raising ``MSIError``. -Initial patch by Anthony Tuininga. - -.. - -.. bpo: 31944 -.. date: 2017-11-04-15-29-47 -.. nonce: 0Bx8tZ -.. section: Windows - -Fixes Modify button in Apps and Features dialog. - -.. - -.. bpo: 31392 -.. date: 2017-12-04-21-57-43 -.. nonce: f8huBC -.. section: macOS - -Update macOS installer to use OpenSSL 1.0.2m - -.. - -.. bpo: 32207 -.. date: 2017-12-04-15-04-43 -.. nonce: IzyAJo -.. section: IDLE - -Improve tk event exception tracebacks in IDLE. When tk event handling is -driven by IDLE's run loop, a confusing and distracting queue.EMPTY traceback -context is no longer added to tk event exception tracebacks. The traceback -is now the same as when event handling is driven by user code. Patch based -on a suggestion by Serhiy Storchaka. - -.. - -.. bpo: 32164 -.. date: 2017-11-28-21-47-15 -.. nonce: 2T2Na8 -.. section: IDLE - -Delete unused file idlelib/tabbedpages.py. Use of TabbedPageSet in -configdialog was replaced by ttk.Notebook. - -.. - -.. bpo: 32100 -.. date: 2017-11-21-08-26-08 -.. nonce: P43qx2 -.. section: IDLE - -IDLE: Fix old and new bugs in pathbrowser; improve tests. Patch mostly by -Cheryl Sabella. - -.. - -.. bpo: 31858 -.. date: 2017-10-26-20-20-19 -.. nonce: VuSA_e -.. section: IDLE - -IDLE -- Restrict shell prompt manipulation to the shell. Editor and output -windows only see an empty last prompt line. This simplifies the code and -fixes a minor bug when newline is inserted. Sys.ps1, if present, is read on -Shell start-up, but is not set or changed. - -.. - -.. bpo: 31860 -.. date: 2017-10-24-16-21-50 -.. nonce: gECuWx -.. section: IDLE - -The font sample in the IDLE configuration dialog is now editable. Changes -persist while IDLE remains open - -.. - -.. bpo: 31836 -.. date: 2017-10-21-15-41-53 -.. nonce: fheLME -.. section: IDLE - -Test_code_module now passes if run after test_idle, which sets ps1. -The code module uses sys.ps1 if present or sets it to '>>> ' if not. -Test_code_module now properly tests both behaviors. Ditto for ps2. - -.. - -.. bpo: 28603 -.. date: 2017-10-17-13-26-13 -.. nonce: TMEQfp -.. section: IDLE - -Fix a TypeError that caused a shell restart when printing a traceback that -includes an exception that is unhashable. Patch by Zane Bitter. - -.. - -.. bpo: 13802 -.. date: 2017-10-12-00-51-29 -.. nonce: VwjZRD -.. section: IDLE - -Use non-Latin characters in the IDLE's Font settings sample. Even if one -selects a font that defines a limited subset of the unicode Basic -Multilingual Plane, tcl/tk will use other fonts that define a character. The -expanded example give users of non-Latin characters a better idea of what -they might see in IDLE's shell and editors. To make room for the expanded -sample, frames on the Font tab are re-arranged. The Font/Tabs help explains -a bit about the additions. - -.. - -.. bpo: 31460 -.. date: 2017-09-30-19-03-26 -.. nonce: HpveI6 -.. section: IDLE - -Simplify the API of IDLE's Module Browser. -Passing a widget instead of an flist with a root widget opens the option of -creating a browser frame that is only part of a window. Passing a full file -name instead of pieces assumed to come from a .py file opens the possibility -of browsing python files that do not end in .py. - -.. - -.. bpo: 31649 -.. date: 2017-09-30-13-59-18 -.. nonce: LxN4Vb -.. section: IDLE - -IDLE - Make _htest, _utest parameters keyword only. - -.. - -.. bpo: 31559 -.. date: 2017-09-23-12-52-24 -.. nonce: ydckYX -.. section: IDLE - -Remove test order dependence in idle_test.test_browser. - -.. - -.. bpo: 31459 -.. date: 2017-09-22-20-26-23 -.. nonce: L0pnH9 -.. section: IDLE - -Rename IDLE's module browser from Class Browser to Module Browser. The -original module-level class and method browser became a module browser, with -the addition of module-level functions, years ago. Nested classes and -functions were added yesterday. For back-compatibility, the virtual event -<>, which appears on the Keys tab of the Settings -dialog, is not changed. Patch by Cheryl Sabella. - -.. - -.. bpo: 31500 -.. date: 2017-09-18-10-43-03 -.. nonce: Y_YDxA -.. section: IDLE - -Default fonts now are scaled on HiDPI displays. - -.. - -.. bpo: 1612262 -.. date: 2017-08-14-15-13-50 -.. nonce: -x_Oyq -.. section: IDLE - -IDLE module browser now shows nested classes and functions. Original patches -for code and tests by Guilherme Polo and Cheryl Sabella, respectively. - -.. - -.. bpo: 30722 -.. date: 2017-10-23-19-45-52 -.. nonce: ioRlAu -.. section: Tools/Demos - -Make redemo work with Python 3.6 and newer versions. -Also, remove the ``LOCALE`` option since it doesn't work with string -patterns in Python 3. -Patch by Christoph Sarnowski. - -.. - -.. bpo: 20891 -.. date: 2017-11-30-18-13-45 -.. nonce: wBnMdF -.. section: C API - -Fix PyGILState_Ensure(). When PyGILState_Ensure() is called in a non-Python -thread before PyEval_InitThreads(), only call PyEval_InitThreads() after -calling PyThreadState_New() to fix a crash. - -.. - -.. bpo: 31532 -.. date: 2017-09-20-21-59-52 -.. nonce: s9Cw9_ -.. section: C API - -Fix memory corruption due to allocator mix in getpath.c between Py_GetPath() -and Py_SetPath() - -.. - -.. bpo: 30697 -.. date: 2017-06-30-11-58-01 -.. nonce: Q3T_8n -.. section: C API - -The `PyExc_RecursionErrorInst` singleton is removed and -`PyErr_NormalizeException()` does not use it anymore. This singleton is -persistent and its members being never cleared may cause a segfault during -finalization of the interpreter. See also issue #22898. diff --git a/Misc/NEWS.d/3.6.5.rst b/Misc/NEWS.d/3.6.5.rst deleted file mode 100644 index ded13aebd568155564b07569758699b92c45b025..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.5.rst +++ /dev/null @@ -1,16 +0,0 @@ -.. bpo: 32872 -.. date: 2018-03-28-01-35-02 -.. nonce: J5NDUj -.. release date: 2018-03-28 -.. section: Tests - -Avoid regrtest compatibility issue with namespace packages. - -.. - -.. bpo: 33163 -.. date: 2018-03-28-04-15-03 -.. nonce: hfpWuU -.. section: Build - -Upgrade pip to 9.0.3 and setuptools to v39.0.1. diff --git a/Misc/NEWS.d/3.6.5rc1.rst b/Misc/NEWS.d/3.6.5rc1.rst deleted file mode 100644 index 448baed5413ecb979a1dc50a28767952c4345b25..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.5rc1.rst +++ /dev/null @@ -1,866 +0,0 @@ -.. bpo: 33001 -.. date: 2018-03-05-10-09-51 -.. nonce: elj4Aa -.. release date: 2018-03-13 -.. section: Security - -Minimal fix to prevent buffer overrun in os.symlink on Windows - -.. - -.. bpo: 32981 -.. date: 2018-03-02-10-24-52 -.. nonce: O_qDyj -.. section: Security - -Regexes in difflib and poplib were vulnerable to catastrophic backtracking. -These regexes formed potential DOS vectors (REDOS). They have been -refactored. This resolves CVE-2018-1060 and CVE-2018-1061. Patch by Jamie -Davis. - -.. - -.. bpo: 33026 -.. date: 2018-03-08-09-48-38 -.. nonce: QZA3Ba -.. section: Core and Builtins - -Fixed jumping out of "with" block by setting f_lineno. - -.. - -.. bpo: 17288 -.. date: 2018-02-27-13-36-21 -.. nonce: Gdj24S -.. section: Core and Builtins - -Prevent jumps from 'return' and 'exception' trace events. - -.. - -.. bpo: 32889 -.. date: 2018-02-20-21-53-48 -.. nonce: J6eWy5 -.. section: Core and Builtins - -Update Valgrind suppression list to account for the rename of -``Py_ADDRESS_IN_RANG`` to ``address_in_range``. - -.. - -.. bpo: 32650 -.. date: 2018-01-28-23-01-39 -.. nonce: Bbi7ek -.. section: Core and Builtins - -Pdb and other debuggers dependent on bdb.py will correctly step over (next -command) native coroutines. Patch by Pablo Galindo. - -.. - -.. bpo: 32685 -.. date: 2018-01-28-12-25-06 -.. nonce: nGctze -.. section: Core and Builtins - -Improve suggestion when the Python 2 form of print statement is either -present on the same line as the header of a compound statement or else -terminated by a semi-colon instead of a newline. Patch by Nitish Chandra. - -.. - -.. bpo: 32583 -.. date: 2018-01-26-21-20-21 -.. nonce: Fh3fau -.. section: Core and Builtins - -Fix possible crashing in builtin Unicode decoders caused by write -out-of-bound errors when using customized decode error handlers. - -.. - -.. bpo: 26163 -.. date: 2018-01-14-20-32-47 -.. nonce: xv9Iuv -.. section: Core and Builtins - -Improved frozenset() hash to create more distinct hash values when faced -with datasets containing many similar values. - -.. - -.. bpo: 27169 -.. date: 2017-12-15-11-50-06 -.. nonce: VO84fQ -.. section: Core and Builtins - -The ``__debug__`` constant is now optimized out at compile time. This fixes -also bpo-22091. - -.. - -.. bpo: 32329 -.. date: 2017-12-15-00-55-35 -.. nonce: XL1O99 -.. section: Core and Builtins - -``sys.flags.hash_randomization`` is now properly set to 0 when hash -randomization is turned off by ``PYTHONHASHSEED=0``. - -.. - -.. bpo: 30416 -.. date: 2017-12-14-11-48-19 -.. nonce: hlHo_9 -.. section: Core and Builtins - -The optimizer is now protected from spending much time doing complex -calculations and consuming much memory for creating large constants in -constant folding. - -.. - -.. bpo: 18533 -.. date: 2017-12-13-16-46-23 -.. nonce: Dlk8d7 -.. section: Core and Builtins - -``repr()`` on a dict containing its own ``values()`` or ``items()`` no -longer raises ``RecursionError``; OrderedDict similarly. Instead, use -``...``, as for other recursive structures. Patch by Ben North. - -.. - -.. bpo: 32028 -.. date: 2017-12-03-22-29-13 -.. nonce: KC2w4Q -.. section: Core and Builtins - -Leading whitespace is now correctly ignored when generating suggestions for -converting Py2 print statements to Py3 builtin print function calls. Patch -by Sanyam Khurana. - -.. - -.. bpo: 32137 -.. date: 2017-11-26-14-36-30 -.. nonce: Stj5nL -.. section: Core and Builtins - -The repr of deeply nested dict now raises a RecursionError instead of -crashing due to a stack overflow. - -.. - -.. bpo: 33064 -.. date: 2018-03-12-19-58-25 -.. nonce: LO2KIY -.. section: Library - -lib2to3 now properly supports trailing commas after ``*args`` and -``**kwargs`` in function signatures. - -.. - -.. bpo: 31804 -.. date: 2018-03-11-19-03-52 -.. nonce: i8KUMp -.. section: Library - -Avoid failing in multiprocessing.Process if the standard streams are closed -or None at exit. - -.. - -.. bpo: 33037 -.. date: 2018-03-09-23-07-07 -.. nonce: nAJ3at -.. section: Library - -Skip sending/receiving data after SSL transport closing. - -.. - -.. bpo: 30353 -.. date: 2018-03-08-09-54-01 -.. nonce: XdE5aM -.. section: Library - -Fix ctypes pass-by-value for structs on 64-bit Cygwin/MinGW. - -.. - -.. bpo: 33009 -.. date: 2018-03-06-11-54-59 -.. nonce: -Ekysb -.. section: Library - -Fix inspect.signature() for single-parameter partialmethods. - -.. - -.. bpo: 32969 -.. date: 2018-03-06-00-19-41 -.. nonce: rGTKa0 -.. section: Library - -Expose several missing constants in zlib and fix corresponding -documentation. - -.. - -.. bpo: 32713 -.. date: 2018-02-26-13-16-36 -.. nonce: 55yegW -.. section: Library - -Fixed tarfile.itn handling of out-of-bounds float values. Patch by Joffrey -Fuhrer. - -.. - -.. bpo: 30622 -.. date: 2018-02-24-21-40-42 -.. nonce: dQjxSe -.. section: Library - -The ssl module now detects missing NPN support in LibreSSL. - -.. - -.. bpo: 32922 -.. date: 2018-02-23-19-12-04 -.. nonce: u-xe0B -.. section: Library - -dbm.open() now encodes filename with the filesystem encoding rather than -default encoding. - -.. - -.. bpo: 32859 -.. date: 2018-02-19-17-46-31 -.. nonce: kAT-Xp -.. section: Library - -In ``os.dup2``, don't check every call whether the ``dup3`` syscall exists -or not. - -.. - -.. bpo: 21060 -.. date: 2018-02-17-19-20-19 -.. nonce: S1Z-x6 -.. section: Library - -Rewrite confusing message from setup.py upload from "No dist file created in -earlier command" to the more helpful "Must create and upload files in one -command". - -.. - -.. bpo: 32857 -.. date: 2018-02-16-14-37-14 -.. nonce: -XljAx -.. section: Library - -In :mod:`tkinter`, ``after_cancel(None)`` now raises a :exc:`ValueError` -instead of canceling the first scheduled function. Patch by Cheryl Sabella. - -.. - -.. bpo: 32852 -.. date: 2018-02-15-12-04-29 -.. nonce: HDqIxM -.. section: Library - -Make sure sys.argv remains as a list when running trace. - -.. - -.. bpo: 32841 -.. date: 2018-02-14-00-21-24 -.. nonce: bvHDOc -.. section: Library - -Fixed `asyncio.Condition` issue which silently ignored cancellation after -notifying and cancelling a conditional lock. Patch by Bar Harel. - -.. - -.. bpo: 31787 -.. date: 2018-02-09-21-41-56 -.. nonce: owSZ2t -.. section: Library - -Fixed refleaks of ``__init__()`` methods in various modules. (Contributed by -Oren Milman) - -.. - -.. bpo: 30157 -.. date: 2018-02-09-14-44-43 -.. nonce: lEiiAK -.. section: Library - -Fixed guessing quote and delimiter in csv.Sniffer.sniff() when only the last -field is quoted. Patch by Jake Davis. - -.. - -.. bpo: 32394 -.. date: 2018-02-08-08-18-26 -.. nonce: 6E_7X7 -.. section: Library - -socket: Remove TCP_FASTOPEN, TCP_KEEPCNT flags on older version Windows -during run-time. - -.. - -.. bpo: 32777 -.. date: 2018-02-05-21-28-28 -.. nonce: C-wIXF -.. section: Library - -Fix a rare but potential pre-exec child process deadlock in subprocess on -POSIX systems when marking file descriptors inheritable on exec in the child -process. This bug appears to have been introduced in 3.4. - -.. - -.. bpo: 32647 -.. date: 2018-02-05-13-31-42 -.. nonce: ktmfR_ -.. section: Library - -The ctypes module used to depend on indirect linking for dlopen. The shared -extension is now explicitly linked against libdl on platforms with dl. - -.. - -.. bpo: 32734 -.. date: 2018-02-01-01-34-47 -.. nonce: gCV9AD -.. section: Library - -Fixed ``asyncio.Lock()`` safety issue which allowed acquiring and locking -the same lock multiple times, without it being free. Patch by Bar Harel. - -.. - -.. bpo: 32727 -.. date: 2018-01-30-17-46-18 -.. nonce: aHVsRC -.. section: Library - -Do not include name field in SMTP envelope from address. Patch by Stéphane -Wirtel - -.. - -.. bpo: 27931 -.. date: 2018-01-25-21-04-11 -.. nonce: e4r52t -.. section: Library - -Fix email address header parsing error when the username is an empty quoted -string. Patch by Xiang Zhang. - -.. - -.. bpo: 32304 -.. date: 2018-01-21-16-33-53 -.. nonce: TItrNv -.. section: Library - -distutils' upload command no longer corrupts tar files ending with a CR -byte, and no longer tries to convert CR to CRLF in any of the upload text -fields. - -.. - -.. bpo: 32502 -.. date: 2018-01-20-17-15-34 -.. nonce: OXJfn7 -.. section: Library - -uuid.uuid1 no longer raises an exception if a 64-bit hardware address is -encountered. - -.. - -.. bpo: 31848 -.. date: 2018-01-18-23-34-17 -.. nonce: M2cldy -.. section: Library - -Fix the error handling in Aifc_read.initfp() when the SSND chunk is not -found. Patch by Zackery Spytz. - -.. - -.. bpo: 32555 -.. date: 2018-01-15-17-52-47 -.. nonce: CMq2zF -.. section: Library - -On FreeBSD and Solaris, os.strerror() now always decode the byte string from -the current locale encoding, rather than using ASCII/surrogateescape in some -cases. - -.. - -.. bpo: 32521 -.. date: 2018-01-15-12-53-13 -.. nonce: IxX4Ba -.. section: Library - -The nis module is now compatible with new libnsl and headers location. - -.. - -.. bpo: 32473 -.. date: 2018-01-10-20-37-59 -.. nonce: mP_yJG -.. section: Library - -Improve ABCMeta._dump_registry() output readability - -.. - -.. bpo: 32521 -.. date: 2018-01-08-18-02-33 -.. nonce: Kh-KoN -.. section: Library - -glibc has removed Sun RPC. Use replacement libtirpc headers and library in -nis module. - -.. - -.. bpo: 32228 -.. date: 2017-12-22-16-47-41 -.. nonce: waPx3q -.. section: Library - -Ensure that ``truncate()`` preserves the file position (as reported by -``tell()``) after writes longer than the buffer size. - -.. - -.. bpo: 26133 -.. date: 2017-12-21-11-08-42 -.. nonce: mt81QV -.. section: Library - -Don't unsubscribe signals in asyncio UNIX event loop on interpreter -shutdown. - -.. - -.. bpo: 32185 -.. date: 2017-12-20-09-25-10 -.. nonce: IL0cMt -.. section: Library - -The SSL module no longer sends IP addresses in SNI TLS extension on -platforms with OpenSSL 1.0.2+ or inet_pton. - -.. - -.. bpo: 32323 -.. date: 2017-12-14-10-10-10 -.. nonce: ideco -.. section: Library - -:func:`urllib.parse.urlsplit()` does not convert zone-id (scope) to lower -case for scoped IPv6 addresses in hostnames now. - -.. - -.. bpo: 32302 -.. date: 2017-12-13-22-38-08 -.. nonce: othtTr -.. section: Library - -Fix bdist_wininst of distutils for CRT v142: it binary compatible with CRT -v140. - -.. - -.. bpo: 32255 -.. date: 2017-12-12-07-29-06 -.. nonce: 2bfNmM -.. section: Library - -A single empty field is now always quoted when written into a CSV file. This -allows to distinguish an empty row from a row consisting of a single empty -field. Patch by Licht Takeuchi. - -.. - -.. bpo: 32277 -.. date: 2017-12-11-09-53-14 -.. nonce: jkKiVC -.. section: Library - -Raise ``NotImplementedError`` instead of ``SystemError`` on platforms where -``chmod(..., follow_symlinks=False)`` is not supported. Patch by Anthony -Sottile. - -.. - -.. bpo: 32199 -.. date: 2017-12-04-12-23-26 -.. nonce: nGof4v -.. section: Library - -The getnode() ip getter now uses 'ip link' instead of 'ip link list'. - -.. - -.. bpo: 27456 -.. date: 2017-11-02-11-57-41 -.. nonce: snzyTC -.. section: Library - -Ensure TCP_NODELAY is set on Linux. Tests by Victor Stinner. - -.. - -.. bpo: 31900 -.. date: 2017-10-30-15-55-32 -.. nonce: -S9xc4 -.. section: Library - -The :func:`locale.localeconv` function now sets temporarily the ``LC_CTYPE`` -locale to the ``LC_NUMERIC`` locale to decode ``decimal_point`` and -``thousands_sep`` byte strings if they are non-ASCII or longer than 1 byte, -and the ``LC_NUMERIC`` locale is different than the ``LC_CTYPE`` locale. -This temporary change affects other threads. -Same change for the :meth:`str.format` method when formatting a number -(:class:`int`, :class:`float`, :class:`float` and subclasses) with the ``n`` -type (ex: ``'{:n}'.format(1234)``). - -.. - -.. bpo: 31802 -.. date: 2017-10-17-14-52-14 -.. nonce: sYj2Zv -.. section: Library - -Importing native path module (``posixpath``, ``ntpath``) now works even if -the ``os`` module still is not imported. - -.. - -.. bpo: 17232 -.. date: 2018-02-23-12-48-03 -.. nonce: tmuTKL -.. section: Documentation - -Clarify docs for -O and -OO. Patch by Terry Reedy. - -.. - -.. bpo: 32800 -.. date: 2018-02-10-15-16-04 -.. nonce: FyrqCk -.. section: Documentation - -Update link to w3c doc for xml default namespaces. - -.. - -.. bpo: 8722 -.. date: 2018-02-03-06-11-37 -.. nonce: MPyVyj -.. section: Documentation - -Document :meth:`__getattr__` behavior when property :meth:`get` method -raises :exc:`AttributeError`. - -.. - -.. bpo: 32614 -.. date: 2018-02-02-07-41-57 -.. nonce: LSqzGw -.. section: Documentation - -Modify RE examples in documentation to use raw strings to prevent -:exc:`DeprecationWarning` and add text to REGEX HOWTO to highlight the -deprecation. - -.. - -.. bpo: 31972 -.. date: 2018-01-25-14-23-12 -.. nonce: w1m_8r -.. section: Documentation - -Improve docstrings for `pathlib.PurePath` subclasses. - -.. - -.. bpo: 17799 -.. date: 2018-01-22-21-13-46 -.. nonce: rdZ-Vk -.. section: Documentation - -Explain real behaviour of sys.settrace and sys.setprofile and their C-API -counterparts regarding which type of events are received in each function. -Patch by Pablo Galindo Salgado. - -.. - -.. bpo: 32517 -.. date: 2018-03-09-07-05-12 -.. nonce: ugc1iW -.. section: Tests - -Fix failing ``test_asyncio`` on macOS 10.12.2+ due to transport of -``KqueueSelector`` loop was not being closed. - -.. - -.. bpo: 32721 -.. date: 2018-01-29-21-30-44 -.. nonce: 2Bebm1 -.. section: Tests - -Fix test_hashlib to not fail if the _md5 module is not built. - -.. - -.. bpo: 32252 -.. date: 2017-12-11-13-31-33 -.. nonce: YnFw7J -.. section: Tests - -Fix faulthandler_suppress_crash_report() used to prevent core dump files -when testing crashes. getrlimit() returns zero on success. - -.. - -.. bpo: 31518 -.. date: 2017-09-19-20-48-50 -.. nonce: KwTMMz -.. section: Tests - -Debian Unstable has disabled TLS 1.0 and 1.1 for SSLv23_METHOD(). Change -TLS/SSL protocol of some tests to PROTOCOL_TLS or PROTOCOL_TLSv1_2 to make -them pass on Debian. - -.. - -.. bpo: 32635 -.. date: 2018-01-23-15-33-40 -.. nonce: qHwIZy -.. section: Build - -Fix segfault of the crypt module when libxcrypt is provided instead of -libcrypt at the system. - -.. - -.. bpo: 33016 -.. date: 2018-03-07-01-33-33 -.. nonce: Z_Med0 -.. section: Windows - -Fix potential use of uninitialized memory in nt._getfinalpathname - -.. - -.. bpo: 32903 -.. date: 2018-02-28-11-03-24 -.. nonce: 1SXY4t -.. section: Windows - -Fix a memory leak in os.chdir() on Windows if the current directory is set -to a UNC path. - -.. - -.. bpo: 31966 -.. date: 2018-02-19-13-54-42 -.. nonce: _Q3HPb -.. section: Windows - -Fixed WindowsConsoleIO.write() for writing empty data. - -.. - -.. bpo: 32409 -.. date: 2018-02-19-10-00-57 -.. nonce: nocuDg -.. section: Windows - -Ensures activate.bat can handle Unicode contents. - -.. - -.. bpo: 32457 -.. date: 2018-02-19-08-54-06 -.. nonce: vVP0Iz -.. section: Windows - -Improves handling of denormalized executable path when launching Python. - -.. - -.. bpo: 32370 -.. date: 2018-02-10-15-38-19 -.. nonce: kcKuct -.. section: Windows - -Use the correct encoding for ipconfig output in the uuid module. Patch by -Segev Finer. - -.. - -.. bpo: 29248 -.. date: 2018-02-07-17-50-48 -.. nonce: Xzwj-6 -.. section: Windows - -Fix :func:`os.readlink` on Windows, which was mistakenly treating the -``PrintNameOffset`` field of the reparse data buffer as a number of -characters instead of bytes. Patch by Craig Holmquist and SSE4. - -.. - -.. bpo: 32588 -.. date: 2018-01-18-14-56-45 -.. nonce: vHww6F -.. section: Windows - -Create standalone _distutils_findvs module. - -.. - -.. bpo: 32726 -.. date: 2018-03-13-21-00-20 -.. nonce: Mticyn -.. section: macOS - -Provide an additional, more modern macOS installer variant that supports -macOS 10.9+ systems in 64-bit mode only. Upgrade the supplied third-party -libraries to OpenSSL 1.0.2n, XZ 5.2.3, and SQLite 3.22.0. The 10.9+ -installer now links with and supplies its own copy of Tcl/Tk 8.6.8. - -.. - -.. bpo: 32984 -.. date: 2018-03-05-01-29-05 -.. nonce: NGjgT4 -.. section: IDLE - -Set ``__file__`` while running a startup file. Like Python, IDLE optionally -runs one startup file in the Shell window before presenting the first -interactive input prompt. For IDLE, ``-s`` runs a file named in -environmental variable :envvar:`IDLESTARTUP` or :envvar:`PYTHONSTARTUP`; -``-r file`` runs ``file``. Python sets ``__file__`` to the startup file -name before running the file and unsets it before the first prompt. IDLE -now does the same when run normally, without the ``-n`` option. - -.. - -.. bpo: 32940 -.. date: 2018-02-24-18-20-50 -.. nonce: ZaJ1Rf -.. section: IDLE - -Simplify and rename StringTranslatePseudoMapping in pyparse. - -.. - -.. bpo: 32916 -.. date: 2018-02-23-07-32-36 -.. nonce: 4MsQ5F -.. section: IDLE - -Change ``str`` to ``code`` in pyparse. - -.. - -.. bpo: 32905 -.. date: 2018-02-22-00-09-27 -.. nonce: VlXj0x -.. section: IDLE - -Remove unused code in pyparse module. - -.. - -.. bpo: 32874 -.. date: 2018-02-19-10-56-41 -.. nonce: 6pZ9Gv -.. section: IDLE - -Add tests for pyparse. - -.. - -.. bpo: 32837 -.. date: 2018-02-12-17-22-48 -.. nonce: -33QPl -.. section: IDLE - -Using the system and place-dependent default encoding for open() is a bad -idea for IDLE's system and location-independent files. - -.. - -.. bpo: 32826 -.. date: 2018-02-12-11-05-22 -.. nonce: IxNZrk -.. section: IDLE - -Add "encoding=utf-8" to open() in IDLE's test_help_about. GUI test -test_file_buttons() only looks at initial ascii-only lines, but failed on -systems where open() defaults to 'ascii' because readline() internally reads -and decodes far enough ahead to encounter a non-ascii character in -CREDITS.txt. - -.. - -.. bpo: 32765 -.. date: 2018-02-04-17-52-54 -.. nonce: qm0eCu -.. section: IDLE - -Update configdialog General tab docstring to add new widgets to the widget -list. - -.. - -.. bpo: 24960 -.. date: 2017-12-22-09-25-51 -.. nonce: TGdAgO -.. section: Tools/Demos - -2to3 and lib2to3 can now read pickled grammar files using pkgutil.get_data() -rather than probing the filesystem. This lets 2to3 and lib2to3 work when run -from a zipfile. - -.. - -.. bpo: 32222 -.. date: 2017-12-07-20-51-20 -.. nonce: hPBcGT -.. section: Tools/Demos - -Fix pygettext not extracting docstrings for functions with type annotated -arguments. Patch by Toby Harradine. - -.. - -.. bpo: 29084 -.. date: 2017-12-16-09-59-35 -.. nonce: ZGJ-LJ -.. section: C API - -Undocumented C API for OrderedDict has been excluded from the limited C API. -It was added by mistake and actually never worked in the limited C API. diff --git a/Misc/NEWS.d/3.6.6.rst b/Misc/NEWS.d/3.6.6.rst deleted file mode 100644 index da9f64703de37a1c9b4e92df35d6d4c0a154a2c7..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.6.rst +++ /dev/null @@ -1,8 +0,0 @@ -.. bpo: 0 -.. date: 2018-06-27 -.. no changes: True -.. nonce: IWyX1H -.. release date: 2018-06-27 -.. section: Library - -There were no new changes in version 3.6.6. diff --git a/Misc/NEWS.d/3.6.6rc1.rst b/Misc/NEWS.d/3.6.6rc1.rst deleted file mode 100644 index 71a5c3ec595ba2f023bce52596b09c2e10a4d321..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.6.6rc1.rst +++ /dev/null @@ -1,885 +0,0 @@ -.. bpo: 33786 -.. date: 2018-06-06-23-24-40 -.. nonce: lBvT8z -.. release date: 2018-06-11 -.. section: Core and Builtins - -Fix asynchronous generators to handle GeneratorExit in athrow() correctly - -.. - -.. bpo: 30654 -.. date: 2018-05-28-12-28-53 -.. nonce: 9fDJye -.. section: Core and Builtins - -Fixed reset of the SIGINT handler to SIG_DFL on interpreter shutdown even -when there was a custom handler set previously. Patch by Philipp Kerling. - -.. - -.. bpo: 33622 -.. date: 2018-05-23-20-46-14 -.. nonce: xPucO9 -.. section: Core and Builtins - -Fixed a leak when the garbage collector fails to add an object with the -``__del__`` method or referenced by it into the :data:`gc.garbage` list. -:c:func:`PyGC_Collect` can now be called when an exception is set and -preserves it. - -.. - -.. bpo: 31849 -.. date: 2018-05-14-11-00-00 -.. nonce: EmHaH4 -.. section: Core and Builtins - -Fix signed/unsigned comparison warning in pyhash.c. - -.. - -.. bpo: 33391 -.. date: 2018-05-02-08-36-03 -.. nonce: z4a7rb -.. section: Core and Builtins - -Fix a leak in set_symmetric_difference(). - -.. - -.. bpo: 28055 -.. date: 2018-04-25-20-44-42 -.. nonce: f49kfC -.. section: Core and Builtins - -Fix unaligned accesses in siphash24(). Patch by Rolf Eike Beer. - -.. - -.. bpo: 33231 -.. date: 2018-04-05-22-20-44 -.. nonce: 3Jmo0q -.. section: Core and Builtins - -Fix potential memory leak in ``normalizestring()``. - -.. - -.. bpo: 29922 -.. date: 2018-04-03-00-30-25 -.. nonce: CdLuMl -.. section: Core and Builtins - -Improved error messages in 'async with' when ``__aenter__()`` or -``__aexit__()`` return non-awaitable object. - -.. - -.. bpo: 33199 -.. date: 2018-04-02-09-32-40 -.. nonce: TPnxQu -.. section: Core and Builtins - -Fix ``ma_version_tag`` in dict implementation is uninitialized when copying -from key-sharing dict. - -.. - -.. bpo: 33041 -.. date: 2018-03-18-13-56-14 -.. nonce: XwPhI2 -.. section: Core and Builtins - -Fixed jumping when the function contains an ``async for`` loop. - -.. - -.. bpo: 32282 -.. date: 2017-12-12-14-02-28 -.. nonce: xFVMTn -.. section: Core and Builtins - -Fix an unnecessary ifdef in the include of VersionHelpers.h in socketmodule -on Windows. - -.. - -.. bpo: 21983 -.. date: 2017-10-02-21-02-14 -.. nonce: UoC319 -.. section: Core and Builtins - -Fix a crash in `ctypes.cast()` in case the type argument is a ctypes -structured data type. Patch by Eryk Sun and Oren Milman. - -.. - -.. bpo: 30167 -.. date: 2018-06-10-19-29-17 -.. nonce: G5EgC5 -.. section: Library - -Prevent site.main() exception if PYTHONSTARTUP is set. Patch by Steve Weber. - -.. - -.. bpo: 33812 -.. date: 2018-06-10-13-26-02 -.. nonce: frGAOr -.. section: Library - -Datetime instance d with non-None tzinfo, but with d.tzinfo.utcoffset(d) -returning None is now treated as naive by the astimezone() method. - -.. - -.. bpo: 30805 -.. date: 2018-06-08-17-34-16 -.. nonce: 3qCWa0 -.. section: Library - -Avoid race condition with debug logging - -.. - -.. bpo: 33767 -.. date: 2018-06-03-22-41-59 -.. nonce: 2e82g3 -.. section: Library - -The concatenation (``+``) and repetition (``*``) sequence operations now -raise :exc:`TypeError` instead of :exc:`SystemError` when performed on -:class:`mmap.mmap` objects. Patch by Zackery Spytz. - -.. - -.. bpo: 32684 -.. date: 2018-05-29-12-51-18 -.. nonce: ZEIism -.. section: Library - -Fix gather to propagate cancellation of itself even with return_exceptions. - -.. - -.. bpo: 33674 -.. date: 2018-05-28-22-49-59 -.. nonce: 6LFFj7 -.. section: Library - -Fix a race condition in SSLProtocol.connection_made() of asyncio.sslproto: -start immediately the handshake instead of using call_soon(). Previously, -data_received() could be called before the handshake started, causing the -handshake to hang or fail. - -.. - -.. bpo: 31647 -.. date: 2018-05-28-18-40-26 -.. nonce: s4Fad3 -.. section: Library - -Fixed bug where calling write_eof() on a _SelectorSocketTransport after it's -already closed raises AttributeError. - -.. - -.. bpo: 33672 -.. date: 2018-05-28-17-45-06 -.. nonce: GM_Xm_ -.. section: Library - -Fix Task.__repr__ crash with Cython's bogus coroutines - -.. - -.. bpo: 33469 -.. date: 2018-05-28-15-55-12 -.. nonce: hmXBpY -.. section: Library - -Fix RuntimeError after closing loop that used run_in_executor - -.. - -.. bpo: 11874 -.. date: 2018-05-23-00-26-27 -.. nonce: glK5iP -.. section: Library - -Use a better regex when breaking usage into wrappable parts. Avoids bogus -assertion errors from custom metavar strings. - -.. - -.. bpo: 30877 -.. date: 2018-05-22-13-05-12 -.. nonce: JZEGjI -.. section: Library - -Fixed a bug in the Python implementation of the JSON decoder that prevented -the cache of parsed strings from clearing after finishing the decoding. -Based on patch by c-fos. - -.. - -.. bpo: 33548 -.. date: 2018-05-16-17-05-48 -.. nonce: xWslmx -.. section: Library - -tempfile._candidate_tempdir_list should consider common TEMP locations - -.. - -.. bpo: 33542 -.. date: 2018-05-16-09-30-27 -.. nonce: idNAcs -.. section: Library - -Prevent ``uuid.get_node`` from using a DUID instead of a MAC on Windows. -Patch by Zvi Effron - -.. - -.. bpo: 26819 -.. date: 2018-05-16-05-24-43 -.. nonce: taxbVT -.. section: Library - -Fix race condition with `ReadTransport.resume_reading` in Windows proactor -event loop. - -.. - -.. bpo: 28556 -.. date: 2018-05-10-14-51-19 -.. nonce: y3zK6I -.. section: Library - -Minor fixes in typing module: add annotations to ``NamedTuple.__new__``, -pass ``*args`` and ``**kwds`` in ``Generic.__new__``. Original PRs by -Paulius Šarka and Chad Dombrova. - -.. - -.. bpo: 20087 -.. date: 2018-05-05-18-02-24 -.. nonce: lJrvXL -.. section: Library - -Updated alias mapping with glibc 2.27 supported locales. - -.. - -.. bpo: 33422 -.. date: 2018-05-05-09-53-05 -.. nonce: 4FtQ0q -.. section: Library - -Fix trailing quotation marks getting deleted when looking up byte/string -literals on pydoc. Patch by Andrés Delfino. - -.. - -.. bpo: 33197 -.. date: 2018-04-29-23-56-20 -.. nonce: dgRLqr -.. section: Library - -Update error message when constructing invalid inspect.Parameters Patch by -Dong-hee Na. - -.. - -.. bpo: 33383 -.. date: 2018-04-29-11-15-38 -.. nonce: g32YWn -.. section: Library - -Fixed crash in the get() method of the :mod:`dbm.ndbm` database object when -it is called with a single argument. - -.. - -.. bpo: 33329 -.. date: 2018-04-23-13-21-39 -.. nonce: lQ-Eod -.. section: Library - -Fix multiprocessing regression on newer glibcs - -.. - -.. bpo: 991266 -.. date: 2018-04-21-00-24-08 -.. nonce: h93TP_ -.. section: Library - -Fix quoting of the ``Comment`` attribute of -:class:`http.cookies.SimpleCookie`. - -.. - -.. bpo: 33131 -.. date: 2018-04-20-10-43-17 -.. nonce: L2E977 -.. section: Library - -Upgrade bundled version of pip to 10.0.1. - -.. - -.. bpo: 33308 -.. date: 2018-04-18-19-12-25 -.. nonce: fW75xi -.. section: Library - -Fixed a crash in the :mod:`parser` module when converting an ST object to a -tree of tuples or lists with ``line_info=False`` and ``col_info=True``. - -.. - -.. bpo: 33263 -.. date: 2018-04-11-20-29-19 -.. nonce: B56Hc1 -.. section: Library - -Fix FD leak in `_SelectorSocketTransport` Patch by Vlad Starostin. - -.. - -.. bpo: 33256 -.. date: 2018-04-10-20-57-14 -.. nonce: ndHkqu -.. section: Library - -Fix display of ```` call in the html produced by ``cgitb.html()``. -Patch by Stéphane Blondon. - -.. - -.. bpo: 33203 -.. date: 2018-04-05-11-09-45 -.. nonce: Hje9Py -.. section: Library - -``random.Random.choice()`` now raises ``IndexError`` for empty sequences -consistently even when called from subclasses without a ``getrandbits()`` -implementation. - -.. - -.. bpo: 33224 -.. date: 2018-04-04-23-41-30 -.. nonce: pyR0jB -.. section: Library - -Update difflib.mdiff() for :pep:`479`. Convert an uncaught StopIteration in a -generator into a return-statement. - -.. - -.. bpo: 33209 -.. date: 2018-04-03-10-37-13 -.. nonce: 9sGWE_ -.. section: Library - -End framing at the end of C implementation of :func:`pickle.Pickler.dump`. - -.. - -.. bpo: 32861 -.. date: 2018-04-02-20-44-54 -.. nonce: HeBjzN -.. section: Library - -The urllib.robotparser's ``__str__`` representation now includes wildcard -entries and the "Crawl-delay" and "Request-rate" fields. Patch by Michael -Lazar. - -.. - -.. bpo: 33096 -.. date: 2018-03-25-13-18-16 -.. nonce: ofdbe7 -.. section: Library - -Allow ttk.Treeview.insert to insert iid that has a false boolean value. Note -iid=0 and iid=False would be same. Patch by Garvit Khatri. - -.. - -.. bpo: 33127 -.. date: 2018-03-24-15-08-24 -.. nonce: olJmHv -.. section: Library - -The ssl module now compiles with LibreSSL 2.7.1. - -.. - -.. bpo: 33021 -.. date: 2018-03-12-00-27-56 -.. nonce: m19B9T -.. section: Library - -Release the GIL during fstat() calls, avoiding hang of all threads when -calling mmap.mmap(), os.urandom(), and random.seed(). Patch by Nir Soffer. - -.. - -.. bpo: 27683 -.. date: 2018-03-07-22-28-17 -.. nonce: 572Rv4 -.. section: Library - -Fix a regression in :mod:`ipaddress` that result of :meth:`hosts` is empty -when the network is constructed by a tuple containing an integer mask and -only 1 bit left for addresses. - -.. - -.. bpo: 32844 -.. date: 2018-02-28-13-08-00 -.. nonce: u8tnAe -.. section: Library - -Fix wrong redirection of a low descriptor (0 or 1) to stderr in subprocess -if another low descriptor is closed. - -.. - -.. bpo: 31908 -.. date: 2017-10-31 -.. nonce: g4xh8x -.. section: Library - -Fix output of cover files for ``trace`` module command-line tool. Previously -emitted cover files only when ``--missing`` option was used. Patch by -Michael Selik. - -.. - -.. bpo: 31457 -.. date: 2017-10-18-19-05-17 -.. nonce: KlE6r8 -.. section: Library - -If nested log adapters are used, the inner ``process()`` methods are no -longer omitted. - -.. - -.. bpo: 16865 -.. date: 2017-09-29-16-40-38 -.. nonce: l-f6I_ -.. section: Library - -Support arrays >=2GiB in :mod:`ctypes`. Patch by Segev Finer. - -.. - -.. bpo: 31238 -.. date: 2017-08-21-12-31-53 -.. nonce: Gg0LRH -.. section: Library - -pydoc: the stop() method of the private ServerThread class now waits until -DocServer.serve_until_quit() completes and then explicitly sets its -docserver attribute to None to break a reference cycle. - -.. - -.. bpo: 33503 -.. date: 2018-05-14-20-08-58 -.. nonce: Wvt0qg -.. section: Documentation - -Fix broken pypi link - -.. - -.. bpo: 33421 -.. date: 2018-05-14-15-23-51 -.. nonce: 3GU_QO -.. section: Documentation - -Add missing documentation for ``typing.AsyncContextManager``. - -.. - -.. bpo: 33378 -.. date: 2018-04-29-04-02-18 -.. nonce: -anAHN -.. section: Documentation - -Add Korean language switcher for https://docs.python.org/3/ - -.. - -.. bpo: 33276 -.. date: 2018-04-20-14-09-36 -.. nonce: rA1z_3 -.. section: Documentation - -Clarify that the ``__path__`` attribute on modules cannot be just any value. - -.. - -.. bpo: 33201 -.. date: 2018-04-01-21-03-41 -.. nonce: aa8Lkl -.. section: Documentation - -Modernize documentation for writing C extension types. - -.. - -.. bpo: 33195 -.. date: 2018-04-01-14-30-36 -.. nonce: dRS-XX -.. section: Documentation - -Deprecate ``Py_UNICODE`` usage in ``c-api/arg`` document. ``Py_UNICODE`` -related APIs are deprecated since Python 3.3, but it is missed in the -document. - -.. - -.. bpo: 33126 -.. date: 2018-03-28-17-03-17 -.. nonce: 5UGkNv -.. section: Documentation - -Document PyBuffer_ToContiguous(). - -.. - -.. bpo: 27212 -.. date: 2018-03-22-19-23-04 -.. nonce: wrE5KR -.. section: Documentation - -Modify documentation for the :func:`islice` recipe to consume initial values -up to the start index. - -.. - -.. bpo: 28247 -.. date: 2018-03-20-20-11-05 -.. nonce: -V-WS- -.. section: Documentation - -Update :mod:`zipapp` documentation to describe how to make standalone -applications. - -.. - -.. bpo: 18802 -.. date: 2018-03-11-18-53-47 -.. nonce: JhAqH3 -.. section: Documentation - -Documentation changes for ipaddress. Patch by Jon Foster and Berker Peksag. - -.. - -.. bpo: 27428 -.. date: 2018-03-11-00-16-56 -.. nonce: B7A8FT -.. section: Documentation - -Update documentation to clarify that ``WindowsRegistryFinder`` implements -``MetaPathFinder``. (Patch by Himanshu Lakhara) - -.. - -.. bpo: 8243 -.. date: 2018-01-13-20-30-53 -.. nonce: s98r28 -.. section: Documentation - -Add a note about curses.addch and curses.addstr exception behavior when -writing outside a window, or pad. - -.. - -.. bpo: 31432 -.. date: 2017-09-13-07-14-59 -.. nonce: yAY4Z3 -.. section: Documentation - -Clarify meaning of CERT_NONE, CERT_OPTIONAL, and CERT_REQUIRED flags for -ssl.SSLContext.verify_mode. - -.. - -.. bpo: 33655 -.. date: 2018-05-26-16-01-40 -.. nonce: Frb4LA -.. section: Tests - -Ignore test_posix_fallocate failures on BSD platforms that might be due to -running on ZFS. - -.. - -.. bpo: 19417 -.. date: 2018-01-08-13-33-47 -.. nonce: 2asoXy -.. section: Tests - -Add test_bdb.py. - -.. - -.. bpo: 5755 -.. date: 2018-06-04-21-34-34 -.. nonce: 65GmCj -.. section: Build - -Move ``-Wstrict-prototypes`` option to ``CFLAGS_NODIST`` from ``OPT``. This -option emitted annoying warnings when building extension modules written in -C++. - -.. - -.. bpo: 33614 -.. date: 2018-05-28-11-40-22 -.. nonce: 28e0sE -.. section: Build - -Ensures module definition files for the stable ABI on Windows are correctly -regenerated. - -.. - -.. bpo: 33522 -.. date: 2018-05-15-12-44-50 -.. nonce: mJoNcA -.. section: Build - -Enable CI builds on Visual Studio Team Services at -https://python.visualstudio.com/cpython - -.. - -.. bpo: 33012 -.. date: 2018-05-10-21-10-01 -.. nonce: 5Zfjac -.. section: Build - -Add ``-Wno-cast-function-type`` for gcc 8 for silencing warnings about -function casts like casting to PyCFunction in method definition lists. - -.. - -.. bpo: 33394 -.. date: 2018-04-30-17-36-46 -.. nonce: _Vdi4t -.. section: Build - -Enable the verbose build for extension modules, when GNU make is passed -macros on the command line. - -.. - -.. bpo: 33184 -.. date: 2018-04-13-11-39-28 -.. nonce: aEohx0 -.. section: Windows - -Update Windows installer to OpenSSL 1.0.2o. - -.. - -.. bpo: 33184 -.. date: 2018-04-07-00-58-50 -.. nonce: rMTiqu -.. section: macOS - -Update macOS installer build to use OpenSSL 1.0.2o. - -.. - -.. bpo: 33656 -.. date: 2018-06-10-17-59-36 -.. nonce: 60ZqJS -.. section: IDLE - -On Windows, add API call saying that tk scales for DPI. On Windows 8.1+ or -10, with DPI compatibility properties of the Python binary unchanged, and a -monitor resolution greater than 96 DPI, this should make text and lines -sharper. It should otherwise have no effect. - -.. - -.. bpo: 33768 -.. date: 2018-06-04-19-23-11 -.. nonce: I_2qpV -.. section: IDLE - -Clicking on a context line moves that line to the top of the editor window. - -.. - -.. bpo: 33763 -.. date: 2018-06-03-20-12-57 -.. nonce: URiFlE -.. section: IDLE - -IDLE: Use read-only text widget for code context instead of label widget. - -.. - -.. bpo: 33664 -.. date: 2018-06-03-09-13-28 -.. nonce: PZzQyL -.. section: IDLE - -Scroll IDLE editor text by lines. Previously, the mouse wheel and scrollbar -slider moved text by a fixed number of pixels, resulting in partial lines at -the top of the editor box. The change also applies to the shell and grep -output windows, but not to read-only text views. - -.. - -.. bpo: 33679 -.. date: 2018-05-29-07-14-37 -.. nonce: MgX_Ui -.. section: IDLE - -Enable theme-specific color configuration for Code Context. Use the -Highlights tab to see the setting for built-in themes or add settings to -custom themes. - -.. - -.. bpo: 33642 -.. date: 2018-05-24-20-42-44 -.. nonce: J0VQbS -.. section: IDLE - -Display up to maxlines non-blank lines for Code Context. If there is no -current context, show a single blank line. - -.. - -.. bpo: 33628 -.. date: 2018-05-23-19-51-07 -.. nonce: sLlFLO -.. section: IDLE - -IDLE: Cleanup codecontext.py and its test. - -.. - -.. bpo: 33564 -.. date: 2018-05-17-19-41-12 -.. nonce: XzHZJe -.. section: IDLE - -IDLE's code context now recognizes async as a block opener. - -.. - -.. bpo: 29706 -.. date: 2018-05-15-17-01-10 -.. nonce: id4H5i -.. section: IDLE - -IDLE now colors async and await as keywords in 3.6. They become full -keywords in 3.7. - -.. - -.. bpo: 21474 -.. date: 2018-04-29-16-13-02 -.. nonce: bglg-F -.. section: IDLE - -Update word/identifier definition from ascii to unicode. In text and entry -boxes, this affects selection by double-click, movement left/right by -control-left/right, and deletion left/right by control-BACKSPACE/DEL. - -.. - -.. bpo: 33204 -.. date: 2018-04-02-00-28-13 -.. nonce: NBsuIv -.. section: IDLE - -IDLE: consistently color invalid string prefixes. A 'u' string prefix cannot -be paired with either 'r' or 'f'. Consistently color as much of the prefix, -starting at the right, as is valid. Revise and extend colorizer test. - -.. - -.. bpo: 32831 -.. date: 2018-02-12-08-08-45 -.. nonce: srDRvU -.. section: IDLE - -Add docstrings and tests for codecontext. - -.. - -.. bpo: 33189 -.. date: 2018-04-03-18-10-00 -.. nonce: QrXR00 -.. section: Tools/Demos - -:program:`pygettext.py` now recognizes only literal strings as docstrings -and translatable strings, and rejects bytes literals and f-string -expressions. - -.. - -.. bpo: 31920 -.. date: 2018-03-26-18-54-24 -.. nonce: u_WKsT -.. section: Tools/Demos - -Fixed handling directories as arguments in the ``pygettext`` script. Based -on patch by Oleg Krasnikov. - -.. - -.. bpo: 29673 -.. date: 2018-03-16-17-25-05 -.. nonce: m8QtaW -.. section: Tools/Demos - -Fix pystackv and pystack gdbinit macros. - -.. - -.. bpo: 32885 -.. date: 2018-02-20-12-16-47 -.. nonce: dL5x7C -.. section: Tools/Demos - -Add an ``-n`` flag for ``Tools/scripts/pathfix.py`` to disable automatic -backup creation (files with ``~`` suffix). - -.. - -.. bpo: 31583 -.. date: 2017-09-26-10-11-21 -.. nonce: TM90_H -.. section: Tools/Demos - -Fix 2to3 for using with --add-suffix option but without --output-dir option -for relative path to files in current directory. - -.. - -.. bpo: 32374 -.. date: 2018-01-09-17-03-54 -.. nonce: SwwLoz -.. section: C API - -Document that m_traverse for multi-phase initialized modules can be called -with m_state=NULL, and add a sanity check diff --git a/Misc/NEWS.d/3.7.0.rst b/Misc/NEWS.d/3.7.0.rst deleted file mode 100644 index 41a93165e3cca4a367842be88de12187eaf83bd9..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.7.0.rst +++ /dev/null @@ -1,17 +0,0 @@ -.. bpo: 33851 -.. date: 2018-06-13-15-12-25 -.. nonce: SVbqlz -.. release date: 2018-06-27 -.. section: Library - -Fix :func:`ast.get_docstring` for a node that lacks a docstring. - -.. - -.. bpo: 33932 -.. date: 2018-06-21-15-29-59 -.. nonce: VSlXyS -.. section: C API - -Calling Py_Initialize() twice does nothing, instead of failing with a fatal -error: restore the Python 3.6 behaviour. diff --git a/Misc/NEWS.d/3.7.0a1.rst b/Misc/NEWS.d/3.7.0a1.rst deleted file mode 100644 index 8a304e8755e6b29b05794b9b3c1cfbd995b43b86..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.7.0a1.rst +++ /dev/null @@ -1,6432 +0,0 @@ -.. bpo: 29781 -.. date: 2017-09-05-15-26-30 -.. nonce: LwYtBP -.. release date: 2017-09-19 -.. section: Security - -SSLObject.version() now correctly returns None when handshake over BIO has -not been performed yet. - -.. - -.. bpo: 29505 -.. date: 2017-08-23-17-02-55 -.. nonce: BL6Yt8 -.. section: Security - -Add fuzz tests for float(str), int(str), unicode(str); for oss-fuzz. - -.. - -.. bpo: 30947 -.. date: 2017-08-16-16-35-59 -.. nonce: iNMmm4 -.. section: Security - -Upgrade libexpat embedded copy from version 2.2.1 to 2.2.3 to get security -fixes. - -.. - -.. bpo: 30730 -.. date: 0347 -.. nonce: rJsyTH -.. original section: Library -.. section: Security - -Prevent environment variables injection in subprocess on Windows. Prevent -passing other environment variables and command arguments. - -.. - -.. bpo: 30694 -.. date: 0344 -.. nonce: WkMWM_ -.. original section: Library -.. section: Security - -Upgrade expat copy from 2.2.0 to 2.2.1 to get fixes of multiple security -vulnerabilities including: CVE-2017-9233 (External entity infinite loop -DoS), CVE-2016-9063 (Integer overflow, re-fix), CVE-2016-0718 (Fix -regression bugs from 2.2.0's fix to CVE-2016-0718) and CVE-2012-0876 -(Counter hash flooding with SipHash). Note: the CVE-2016-5300 (Use -os-specific entropy sources like getrandom) doesn't impact Python, since Python -already gets entropy from the OS to set the expat secret using -``XML_SetHashSalt()``. - -.. - -.. bpo: 30500 -.. date: 0342 -.. nonce: 1VG7R- -.. original section: Library -.. section: Security - -Fix urllib.parse.splithost() to correctly parse fragments. For example, -``splithost('//127.0.0.1#@evil.com/')`` now correctly returns the -``127.0.0.1`` host, instead of treating ``@evil.com`` as the host in an -authentication (``login@host``). - -.. - -.. bpo: 29591 -.. date: 0338 -.. nonce: ExKblw -.. original section: Library -.. section: Security - -Update expat copy from 2.1.1 to 2.2.0 to get fixes of CVE-2016-0718 and -CVE-2016-4472. See https://sourceforge.net/p/expat/bugs/537/ for more -information. - -.. - -.. bpo: 31490 -.. date: 2017-09-16-13-32-35 -.. nonce: r7m2sj -.. section: Core and Builtins - -Fix an assertion failure in `ctypes` class definition, in case the class has -an attribute whose name is specified in ``_anonymous_`` but not in -``_fields_``. Patch by Oren Milman. - -.. - -.. bpo: 31471 -.. date: 2017-09-14-19-47-57 -.. nonce: 0yiA5Q -.. section: Core and Builtins - -Fix an assertion failure in `subprocess.Popen()` on Windows, in case the env -argument has a bad keys() method. Patch by Oren Milman. - -.. - -.. bpo: 31418 -.. date: 2017-09-13-13-03-52 -.. nonce: rS-FlC -.. section: Core and Builtins - -Fix an assertion failure in `PyErr_WriteUnraisable()` in case of an -exception with a bad ``__module__`` attribute. Patch by Oren Milman. - -.. - -.. bpo: 31416 -.. date: 2017-09-11-12-54-35 -.. nonce: 2hlQFd -.. section: Core and Builtins - -Fix assertion failures in case of a bad warnings.filters or -warnings.defaultaction. Patch by Oren Milman. - -.. - -.. bpo: 28411 -.. date: 2017-09-11-09-24-21 -.. nonce: 12SpAm -.. section: Core and Builtins - -Change direct usage of PyInterpreterState.modules to -PyImport_GetModuleDict(). Also introduce more uniformity in other code that -deals with sys.modules. This helps reduce complications when working on -sys.modules. - -.. - -.. bpo: 28411 -.. date: 2017-09-11-09-11-20 -.. nonce: Ax91lz -.. section: Core and Builtins - -Switch to the abstract API when dealing with ``PyInterpreterState.modules``. -This allows later support for all dict subclasses and other Mapping -implementations. Also add a ``PyImport_GetModule()`` function to reduce a -bunch of duplicated code. - -.. - -.. bpo: 31411 -.. date: 2017-09-11-08-50-41 -.. nonce: HZz82I -.. section: Core and Builtins - -Raise a TypeError instead of SystemError in case warnings.onceregistry is -not a dictionary. Patch by Oren Milman. - -.. - -.. bpo: 31344 -.. date: 2017-09-06-20-25-47 -.. nonce: XpFs-q -.. section: Core and Builtins - -For finer control of tracing behaviour when testing the interpreter, two new -frame attributes have been added to control the emission of particular trace -events: ``f_trace_lines`` (``True`` by default) to turn off per-line trace -events; and ``f_trace_opcodes`` (``False`` by default) to turn on per-opcode -trace events. - -.. - -.. bpo: 31373 -.. date: 2017-09-06-15-25-59 -.. nonce: dC4jd4 -.. section: Core and Builtins - -Fix several possible instances of undefined behavior due to floating-point -demotions. - -.. - -.. bpo: 30465 -.. date: 2017-09-06-10-47-29 -.. nonce: oe-3GD -.. section: Core and Builtins - -Location information (``lineno`` and ``col_offset``) in f-strings is now -(mostly) correct. This fixes tools like flake8 from showing warnings on the -wrong line (typically the first line of the file). - -.. - -.. bpo: 30860 -.. date: 2017-09-05-13-47-49 -.. nonce: MROpZw -.. section: Core and Builtins - -Consolidate CPython's global runtime state under a single struct. This -improves discoverability of the runtime state. - -.. - -.. bpo: 31347 -.. date: 2017-09-04-16-35-06 -.. nonce: KDuf2w -.. section: Core and Builtins - -Fix possible undefined behavior in _PyObject_FastCall_Prepend. - -.. - -.. bpo: 31343 -.. date: 2017-09-04-14-57-27 -.. nonce: Kl_fS5 -.. section: Core and Builtins - -Include sys/sysmacros.h for major(), minor(), and makedev(). GNU C libray -plans to remove the functions from sys/types.h. - -.. - -.. bpo: 31291 -.. date: 2017-08-28-11-51-29 -.. nonce: t8QggK -.. section: Core and Builtins - -Fix an assertion failure in `zipimport.zipimporter.get_data` on Windows, -when the return value of ``pathname.replace('/','\\')`` isn't a string. -Patch by Oren Milman. - -.. - -.. bpo: 31271 -.. date: 2017-08-25-20-43-22 -.. nonce: YMduKF -.. section: Core and Builtins - -Fix an assertion failure in the write() method of `io.TextIOWrapper`, when -the encoder doesn't return a bytes object. Patch by Oren Milman. - -.. - -.. bpo: 31243 -.. date: 2017-08-24-13-34-49 -.. nonce: dRJzqR -.. section: Core and Builtins - -Fix a crash in some methods of `io.TextIOWrapper`, when the decoder's state -is invalid. Patch by Oren Milman. - -.. - -.. bpo: 30721 -.. date: 2017-08-18-15-15-20 -.. nonce: Hmc56z -.. section: Core and Builtins - -``print`` now shows correct usage hint for using Python 2 redirection -syntax. Patch by Sanyam Khurana. - -.. - -.. bpo: 31070 -.. date: 2017-08-09-09-40-54 -.. nonce: oDyLiI -.. section: Core and Builtins - -Fix a race condition in importlib _get_module_lock(). - -.. - -.. bpo: 30747 -.. date: 2017-08-08-12-00-29 -.. nonce: g2kZRT -.. section: Core and Builtins - -Add a non-dummy implementation of _Py_atomic_store and _Py_atomic_load on -MSVC. - -.. - -.. bpo: 31095 -.. date: 2017-08-01-18-48-30 -.. nonce: bXWZDb -.. section: Core and Builtins - -Fix potential crash during GC caused by ``tp_dealloc`` which doesn't call -``PyObject_GC_UnTrack()``. - -.. - -.. bpo: 31071 -.. date: 2017-07-31-13-28-53 -.. nonce: P9UBDy -.. section: Core and Builtins - -Avoid masking original TypeError in call with * unpacking when other -arguments are passed. - -.. - -.. bpo: 30978 -.. date: 2017-07-21-07-39-05 -.. nonce: f0jODc -.. section: Core and Builtins - -str.format_map() now passes key lookup exceptions through. Previously any -exception was replaced with a KeyError exception. - -.. - -.. bpo: 30808 -.. date: 2017-07-17-12-12-59 -.. nonce: bA3zOv -.. section: Core and Builtins - -Use _Py_atomic API for concurrency-sensitive signal state. - -.. - -.. bpo: 30876 -.. date: 2017-07-11-06-31-32 -.. nonce: x35jZX -.. section: Core and Builtins - -Relative import from unloaded package now reimports the package instead of -failing with SystemError. Relative import from non-package now fails with -ImportError rather than SystemError. - -.. - -.. bpo: 30703 -.. date: 2017-06-28-21-07-32 -.. nonce: ULCdFp -.. section: Core and Builtins - -Improve signal delivery. -Avoid using Py_AddPendingCall from signal handler, to avoid calling -signal-unsafe functions. The tests I'm adding here fail without the rest of the -patch, on Linux and OS X. This means our signal delivery logic had defects -(some signals could be lost). - -.. - -.. bpo: 30765 -.. date: 2017-06-26-14-29-50 -.. nonce: Q5iBmf -.. section: Core and Builtins - -Avoid blocking in pthread_mutex_lock() when PyThread_acquire_lock() is asked -not to block. - -.. - -.. bpo: 31161 -.. date: 0470 -.. nonce: FcUAA0 -.. section: Core and Builtins - -Make sure the 'Missing parentheses' syntax error message is only applied to -SyntaxError, not to subclasses. Patch by Martijn Pieters. - -.. - -.. bpo: 30814 -.. date: 0469 -.. nonce: HcYsfM -.. section: Core and Builtins - -Fixed a race condition when import a submodule from a package. - -.. - -.. bpo: 30736 -.. date: 0468 -.. nonce: kA4J9v -.. section: Core and Builtins - -The internal unicodedata database has been upgraded to Unicode 10.0. - -.. - -.. bpo: 30604 -.. date: 0467 -.. nonce: zGPGoX -.. section: Core and Builtins - -Move co_extra_freefuncs from per-thread to per-interpreter to avoid crashes. - -.. - -.. bpo: 30597 -.. date: 0466 -.. nonce: 7erHiP -.. section: Core and Builtins - -``print`` now shows expected input in custom error message when used as a -Python 2 statement. Patch by Sanyam Khurana. - -.. - -.. bpo: 30682 -.. date: 0465 -.. nonce: zZm88E -.. section: Core and Builtins - -Removed a too-strict assertion that failed for certain f-strings, such as -eval("f'\\\n'") and eval("f'\\\r'"). - -.. - -.. bpo: 30501 -.. date: 0464 -.. nonce: BWJByG -.. section: Core and Builtins - -The compiler now produces more optimal code for complex condition -expressions in the "if", "while" and "assert" statement, the "if" -expression, and generator expressions and comprehensions. - -.. - -.. bpo: 28180 -.. date: 0463 -.. nonce: f_IHor -.. section: Core and Builtins - -Implement :pep:`538` (legacy C locale coercion). This means that when a -suitable coercion target locale is available, both the core interpreter and -locale-aware C extensions will assume the use of UTF-8 as the default text -encoding, rather than ASCII. - -.. - -.. bpo: 30486 -.. date: 0462 -.. nonce: KZi3nB -.. section: Core and Builtins - -Allows setting cell values for __closure__. Patch by Lisa Roach. - -.. - -.. bpo: 30537 -.. date: 0461 -.. nonce: sGC27r -.. section: Core and Builtins - -itertools.islice now accepts integer-like objects (having an __index__ -method) as start, stop, and slice arguments - -.. - -.. bpo: 25324 -.. date: 0460 -.. nonce: l12VjO -.. section: Core and Builtins - -Tokens needed for parsing in Python moved to C. ``COMMENT``, ``NL`` and -``ENCODING``. This way the tokens and tok_names in the token module don't -get changed when you import the tokenize module. - -.. - -.. bpo: 29104 -.. date: 0459 -.. nonce: u26yCx -.. section: Core and Builtins - -Fixed parsing backslashes in f-strings. - -.. - -.. bpo: 27945 -.. date: 0458 -.. nonce: p29r3O -.. section: Core and Builtins - -Fixed various segfaults with dict when input collections are mutated during -searching, inserting or comparing. Based on patches by Duane Griffin and -Tim Mitchell. - -.. - -.. bpo: 25794 -.. date: 0457 -.. nonce: xfPwqm -.. section: Core and Builtins - -Fixed type.__setattr__() and type.__delattr__() for non-interned attribute -names. Based on patch by Eryk Sun. - -.. - -.. bpo: 30039 -.. date: 0456 -.. nonce: e0u4DG -.. section: Core and Builtins - -If a KeyboardInterrupt happens when the interpreter is in the middle of -resuming a chain of nested 'yield from' or 'await' calls, it's now correctly -delivered to the innermost frame. - -.. - -.. bpo: 28974 -.. date: 0455 -.. nonce: jVewS0 -.. section: Core and Builtins - -``object.__format__(x, '')`` is now equivalent to ``str(x)`` rather than -``format(str(self), '')``. - -.. - -.. bpo: 30024 -.. date: 0454 -.. nonce: kSOlED -.. section: Core and Builtins - -Circular imports involving absolute imports with binding a submodule to a -name are now supported. - -.. - -.. bpo: 12414 -.. date: 0453 -.. nonce: T9ix8O -.. section: Core and Builtins - -sys.getsizeof() on a code object now returns the sizes which includes the -code struct and sizes of objects which it references. Patch by Dong-hee Na. - -.. - -.. bpo: 29839 -.. date: 0452 -.. nonce: rUmfay -.. section: Core and Builtins - -len() now raises ValueError rather than OverflowError if __len__() returned -a large negative integer. - -.. - -.. bpo: 11913 -.. date: 0451 -.. nonce: 5uiMX9 -.. section: Core and Builtins - -README.rst is now included in the list of distutils standard READMEs and -therefore included in source distributions. - -.. - -.. bpo: 29914 -.. date: 0450 -.. nonce: nqFSRR -.. section: Core and Builtins - -Fixed default implementations of __reduce__ and __reduce_ex__(). -object.__reduce__() no longer takes arguments, object.__reduce_ex__() now -requires one argument. - -.. - -.. bpo: 29949 -.. date: 0449 -.. nonce: DevGPS -.. section: Core and Builtins - -Fix memory usage regression of set and frozenset object. - -.. - -.. bpo: 29935 -.. date: 0448 -.. nonce: vgjdJo -.. section: Core and Builtins - -Fixed error messages in the index() method of tuple, list and deque when -pass indices of wrong type. - -.. - -.. bpo: 29816 -.. date: 0447 -.. nonce: 0H75Nl -.. section: Core and Builtins - -Shift operation now has less opportunity to raise OverflowError. ValueError -always is raised rather than OverflowError for negative counts. Shifting -zero with non-negative count always returns zero. - -.. - -.. bpo: 24821 -.. date: 0446 -.. nonce: 4DINGV -.. section: Core and Builtins - -Fixed the slowing down to 25 times in the searching of some unlucky Unicode -characters. - -.. - -.. bpo: 29102 -.. date: 0445 -.. nonce: AW4YPj -.. section: Core and Builtins - -Add a unique ID to PyInterpreterState. This makes it easier to identify -each subinterpreter. - -.. - -.. bpo: 29894 -.. date: 0444 -.. nonce: Vev6t- -.. section: Core and Builtins - -The deprecation warning is emitted if __complex__ returns an instance of a -strict subclass of complex. In a future versions of Python this can be an -error. - -.. - -.. bpo: 29859 -.. date: 0443 -.. nonce: Z1MLcA -.. section: Core and Builtins - -Show correct error messages when any of the pthread_* calls in -thread_pthread.h fails. - -.. - -.. bpo: 29849 -.. date: 0442 -.. nonce: hafvBD -.. section: Core and Builtins - -Fix a memory leak when an ImportError is raised during from import. - -.. - -.. bpo: 28856 -.. date: 0441 -.. nonce: AFRmo4 -.. section: Core and Builtins - -Fix an oversight that %b format for bytes should support objects follow the -buffer protocol. - -.. - -.. bpo: 29723 -.. date: 0440 -.. nonce: M5omgP -.. section: Core and Builtins - -The ``sys.path[0]`` initialization change for bpo-29139 caused a regression -by revealing an inconsistency in how sys.path is initialized when executing -``__main__`` from a zipfile, directory, or other import location. The -interpreter now consistently avoids ever adding the import location's parent -directory to ``sys.path``, and ensures no other ``sys.path`` entries are -inadvertently modified when inserting the import location named on the -command line. - -.. - -.. bpo: 29568 -.. date: 0439 -.. nonce: 3EtOC- -.. section: Core and Builtins - -Escaped percent "%%" in the format string for classic string formatting no -longer allows any characters between two percents. - -.. - -.. bpo: 29714 -.. date: 0438 -.. nonce: z-BhVd -.. section: Core and Builtins - -Fix a regression that bytes format may fail when containing zero bytes -inside. - -.. - -.. bpo: 29695 -.. date: 0437 -.. nonce: z75xXa -.. section: Core and Builtins - -bool(), float(), list() and tuple() no longer take keyword arguments. The -first argument of int() can now be passes only as positional argument. - -.. - -.. bpo: 28893 -.. date: 0436 -.. nonce: WTKnpj -.. section: Core and Builtins - -Set correct __cause__ for errors about invalid awaitables returned from -__aiter__ and __anext__. - -.. - -.. bpo: 28876 -.. date: 0435 -.. nonce: cU-sGT -.. section: Core and Builtins - -``bool(range)`` works even if ``len(range)`` raises :exc:`OverflowError`. - -.. - -.. bpo: 29683 -.. date: 0434 -.. nonce: G5iS-P -.. section: Core and Builtins - -Fixes to memory allocation in _PyCode_SetExtra. Patch by Brian Coleman. - -.. - -.. bpo: 29684 -.. date: 0433 -.. nonce: wTgEoh -.. section: Core and Builtins - -Fix minor regression of PyEval_CallObjectWithKeywords. It should raise -TypeError when kwargs is not a dict. But it might cause segv when args=NULL -and kwargs is not a dict. - -.. - -.. bpo: 28598 -.. date: 0432 -.. nonce: QxbzQn -.. section: Core and Builtins - -Support __rmod__ for subclasses of str being called before str.__mod__. -Patch by Martijn Pieters. - -.. - -.. bpo: 29607 -.. date: 0431 -.. nonce: 7NvBA1 -.. section: Core and Builtins - -Fix stack_effect computation for CALL_FUNCTION_EX. Patch by Matthieu -Dartiailh. - -.. - -.. bpo: 29602 -.. date: 0430 -.. nonce: qyyskC -.. section: Core and Builtins - -Fix incorrect handling of signed zeros in complex constructor for complex -subclasses and for inputs having a __complex__ method. Patch by Serhiy -Storchaka. - -.. - -.. bpo: 29347 -.. date: 0429 -.. nonce: 1RPPGN -.. section: Core and Builtins - -Fixed possibly dereferencing undefined pointers when creating weakref -objects. - -.. - -.. bpo: 29463 -.. date: 0428 -.. nonce: h2bg8A -.. section: Core and Builtins - -Add ``docstring`` field to Module, ClassDef, FunctionDef, and -AsyncFunctionDef ast nodes. docstring is not first stmt in their body -anymore. It affects ``co_firstlineno`` and ``co_lnotab`` of code object for -module and class. (Reverted in :issue:`32911`.) - -.. - -.. bpo: 29438 -.. date: 0427 -.. nonce: IKxD6I -.. section: Core and Builtins - -Fixed use-after-free problem in key sharing dict. - -.. - -.. bpo: 29546 -.. date: 0426 -.. nonce: PS1I1T -.. section: Core and Builtins - -Set the 'path' and 'name' attribute on ImportError for ``from ... import -...``. - -.. - -.. bpo: 29546 -.. date: 0425 -.. nonce: O1rmG_ -.. section: Core and Builtins - -Improve from-import error message with location - -.. - -.. bpo: 29478 -.. date: 0424 -.. nonce: rTQ-qy -.. section: Core and Builtins - -If max_line_length=None is specified while using the Compat32 policy, it is -no longer ignored. Patch by Mircea Cosbuc. - -.. - -.. bpo: 29319 -.. date: 0423 -.. nonce: KLDUZf -.. section: Core and Builtins - -Prevent RunMainFromImporter overwriting sys.path[0]. - -.. - -.. bpo: 29337 -.. date: 0422 -.. nonce: bjX8AE -.. section: Core and Builtins - -Fixed possible BytesWarning when compare the code objects. Warnings could be -emitted at compile time. - -.. - -.. bpo: 29327 -.. date: 0421 -.. nonce: XXQarW -.. section: Core and Builtins - -Fixed a crash when pass the iterable keyword argument to sorted(). - -.. - -.. bpo: 29034 -.. date: 0420 -.. nonce: 7-uEDT -.. section: Core and Builtins - -Fix memory leak and use-after-free in os module (path_converter). - -.. - -.. bpo: 29159 -.. date: 0419 -.. nonce: gEn_kP -.. section: Core and Builtins - -Fix regression in bytes(x) when x.__index__() raises Exception. - -.. - -.. bpo: 29049 -.. date: 0418 -.. nonce: KpVXBw -.. section: Core and Builtins - -Call _PyObject_GC_TRACK() lazily when calling Python function. Calling -function is up to 5% faster. - -.. - -.. bpo: 28927 -.. date: 0417 -.. nonce: 9fxf6y -.. section: Core and Builtins - -bytes.fromhex() and bytearray.fromhex() now ignore all ASCII whitespace, not -only spaces. Patch by Robert Xiao. - -.. - -.. bpo: 28932 -.. date: 0416 -.. nonce: QnLx8A -.. section: Core and Builtins - -Do not include if it does not exist. - -.. - -.. bpo: 25677 -.. date: 0415 -.. nonce: RWhZrb -.. section: Core and Builtins - -Correct the positioning of the syntax error caret for indented blocks. Based -on patch by Michael Layzell. - -.. - -.. bpo: 29000 -.. date: 0414 -.. nonce: K6wQ-3 -.. section: Core and Builtins - -Fixed bytes formatting of octals with zero padding in alternate form. - -.. - -.. bpo: 18896 -.. date: 0413 -.. nonce: Pqe0bg -.. section: Core and Builtins - -Python function can now have more than 255 parameters. -collections.namedtuple() now supports tuples with more than 255 elements. - -.. - -.. bpo: 28596 -.. date: 0412 -.. nonce: snIJRd -.. section: Core and Builtins - -The preferred encoding is UTF-8 on Android. Patch written by Chi Hsuan Yen. - -.. - -.. bpo: 22257 -.. date: 0411 -.. nonce: 2a8zxB -.. section: Core and Builtins - -Clean up interpreter startup (see :pep:`432`). - -.. - -.. bpo: 26919 -.. date: 0410 -.. nonce: Cm7MSa -.. section: Core and Builtins - -On Android, operating system data is now always encoded/decoded to/from -UTF-8, instead of the locale encoding to avoid inconsistencies with -os.fsencode() and os.fsdecode() which are already using UTF-8. - -.. - -.. bpo: 28991 -.. date: 0409 -.. nonce: lGA0FK -.. section: Core and Builtins - -functools.lru_cache() was susceptible to an obscure reentrancy bug -triggerable by a monkey-patched len() function. - -.. - -.. bpo: 28147 -.. date: 0408 -.. nonce: CnK_xf -.. section: Core and Builtins - -Fix a memory leak in split-table dictionaries: setattr() must not convert -combined table into split table. Patch written by INADA Naoki. - -.. - -.. bpo: 28739 -.. date: 0407 -.. nonce: w1fvhk -.. section: Core and Builtins - -f-string expressions are no longer accepted as docstrings and by -ast.literal_eval() even if they do not include expressions. - -.. - -.. bpo: 28512 -.. date: 0406 -.. nonce: i-pv6d -.. section: Core and Builtins - -Fixed setting the offset attribute of SyntaxError by -PyErr_SyntaxLocationEx() and PyErr_SyntaxLocationObject(). - -.. - -.. bpo: 28918 -.. date: 0405 -.. nonce: SFVuPz -.. section: Core and Builtins - -Fix the cross compilation of xxlimited when Python has been built with -Py_DEBUG defined. - -.. - -.. bpo: 23722 -.. date: 0404 -.. nonce: e8BH5h -.. section: Core and Builtins - -Rather than silently producing a class that doesn't support zero-argument -``super()`` in methods, failing to pass the new ``__classcell__`` namespace -entry up to ``type.__new__`` now results in a ``DeprecationWarning`` and a -class that supports zero-argument ``super()``. - -.. - -.. bpo: 28797 -.. date: 0403 -.. nonce: _A0_Z5 -.. section: Core and Builtins - -Modifying the class __dict__ inside the __set_name__ method of a descriptor -that is used inside that class no longer prevents calling the __set_name__ -method of other descriptors. - -.. - -.. bpo: 28799 -.. date: 0402 -.. nonce: cP6V1N -.. section: Core and Builtins - -Remove the ``PyEval_GetCallStats()`` function and deprecate the untested and -undocumented ``sys.callstats()`` function. Remove the ``CALL_PROFILE`` -special build: use the :func:`sys.setprofile` function, :mod:`cProfile` or -:mod:`profile` to profile function calls. - -.. - -.. bpo: 12844 -.. date: 0401 -.. nonce: pdr3gY -.. section: Core and Builtins - -More than 255 arguments can now be passed to a function. - -.. - -.. bpo: 28782 -.. date: 0400 -.. nonce: foJV_E -.. section: Core and Builtins - -Fix a bug in the implementation ``yield from`` when checking if the next -instruction is YIELD_FROM. Regression introduced by WORDCODE (issue #26647). - -.. - -.. bpo: 28774 -.. date: 0399 -.. nonce: cEehAr -.. section: Core and Builtins - -Fix error position of the unicode error in ASCII and Latin1 encoders when a -string returned by the error handler contains multiple non-encodable -characters (non-ASCII for the ASCII codec, characters out of the -U+0000-U+00FF range for Latin1). - -.. - -.. bpo: 28731 -.. date: 0398 -.. nonce: oNF59u -.. section: Core and Builtins - -Optimize _PyDict_NewPresized() to create correct size dict. Improve speed of -dict literal with constant keys up to 30%. - -.. - -.. bpo: 28532 -.. date: 0397 -.. nonce: KEYJny -.. section: Core and Builtins - -Show sys.version when -V option is supplied twice. - -.. - -.. bpo: 27100 -.. date: 0396 -.. nonce: poVjXq -.. section: Core and Builtins - -The with-statement now checks for __enter__ before it checks for __exit__. -This gives less confusing error messages when both methods are missing. -Patch by Jonathan Ellington. - -.. - -.. bpo: 28746 -.. date: 0395 -.. nonce: r5MXdB -.. section: Core and Builtins - -Fix the set_inheritable() file descriptor method on platforms that do not -have the ioctl FIOCLEX and FIONCLEX commands. - -.. - -.. bpo: 26920 -.. date: 0394 -.. nonce: 1URwGb -.. section: Core and Builtins - -Fix not getting the locale's charset upon initializing the interpreter, on -platforms that do not have langinfo. - -.. - -.. bpo: 28648 -.. date: 0393 -.. nonce: z7B52W -.. section: Core and Builtins - -Fixed crash in Py_DecodeLocale() in debug build on Mac OS X when decode -astral characters. Patch by Xiang Zhang. - -.. - -.. bpo: 28665 -.. date: 0392 -.. nonce: v4nx86 -.. section: Core and Builtins - -Improve speed of the STORE_DEREF opcode by 40%. - -.. - -.. bpo: 19398 -.. date: 0391 -.. nonce: RYbEGH -.. section: Core and Builtins - -Extra slash no longer added to sys.path components in case of empty -compile-time PYTHONPATH components. - -.. - -.. bpo: 28621 -.. date: 0390 -.. nonce: eCD7n- -.. section: Core and Builtins - -Sped up converting int to float by reusing faster bits counting -implementation. Patch by Adrian Wielgosik. - -.. - -.. bpo: 28580 -.. date: 0389 -.. nonce: 8bqBmG -.. section: Core and Builtins - -Optimize iterating split table values. Patch by Xiang Zhang. - -.. - -.. bpo: 28583 -.. date: 0388 -.. nonce: F-QAx1 -.. section: Core and Builtins - -PyDict_SetDefault didn't combine split table when needed. Patch by Xiang -Zhang. - -.. - -.. bpo: 28128 -.. date: 0387 -.. nonce: Lc2sFu -.. section: Core and Builtins - -Deprecation warning for invalid str and byte escape sequences now prints -better information about where the error occurs. Patch by Serhiy Storchaka -and Eric Smith. - -.. - -.. bpo: 28509 -.. date: 0386 -.. nonce: _Fa4Uq -.. section: Core and Builtins - -dict.update() no longer allocate unnecessary large memory. - -.. - -.. bpo: 28426 -.. date: 0385 -.. nonce: E_quyK -.. section: Core and Builtins - -Fixed potential crash in PyUnicode_AsDecodedObject() in debug build. - -.. - -.. bpo: 28517 -.. date: 0384 -.. nonce: ExPkm9 -.. section: Core and Builtins - -Fixed of-by-one error in the peephole optimizer that caused keeping -unreachable code. - -.. - -.. bpo: 28214 -.. date: 0383 -.. nonce: 6ECJox -.. section: Core and Builtins - -Improved exception reporting for problematic __set_name__ attributes. - -.. - -.. bpo: 23782 -.. date: 0382 -.. nonce: lonDzj -.. section: Core and Builtins - -Fixed possible memory leak in _PyTraceback_Add() and exception loss in -PyTraceBack_Here(). - -.. - -.. bpo: 28183 -.. date: 0381 -.. nonce: MJZeNd -.. section: Core and Builtins - -Optimize and cleanup dict iteration. - -.. - -.. bpo: 26081 -.. date: 0380 -.. nonce: _x5vjl -.. section: Core and Builtins - -Added C implementation of asyncio.Future. Original patch by Yury Selivanov. - -.. - -.. bpo: 28379 -.. date: 0379 -.. nonce: DuXlco -.. section: Core and Builtins - -Added sanity checks and tests for PyUnicode_CopyCharacters(). Patch by Xiang -Zhang. - -.. - -.. bpo: 28376 -.. date: 0378 -.. nonce: oPD-5D -.. section: Core and Builtins - -The type of long range iterator is now registered as Iterator. Patch by Oren -Milman. - -.. - -.. bpo: 28376 -.. date: 0377 -.. nonce: yTEhEo -.. section: Core and Builtins - -Creating instances of range_iterator by calling range_iterator type now is -disallowed. Calling iter() on range instance is the only way. Patch by Oren -Milman. - -.. - -.. bpo: 26906 -.. date: 0376 -.. nonce: YBjcwI -.. section: Core and Builtins - -Resolving special methods of uninitialized type now causes implicit -initialization of the type instead of a fail. - -.. - -.. bpo: 18287 -.. date: 0375 -.. nonce: k6jffS -.. section: Core and Builtins - -PyType_Ready() now checks that tp_name is not NULL. Original patch by Niklas -Koep. - -.. - -.. bpo: 24098 -.. date: 0374 -.. nonce: XqlP_1 -.. section: Core and Builtins - -Fixed possible crash when AST is changed in process of compiling it. - -.. - -.. bpo: 28201 -.. date: 0373 -.. nonce: GWUxAy -.. section: Core and Builtins - -Dict reduces possibility of 2nd conflict in hash table when hashes have same -lower bits. - -.. - -.. bpo: 28350 -.. date: 0372 -.. nonce: 8M5Eg9 -.. section: Core and Builtins - -String constants with null character no longer interned. - -.. - -.. bpo: 26617 -.. date: 0371 -.. nonce: Gh5LvN -.. section: Core and Builtins - -Fix crash when GC runs during weakref callbacks. - -.. - -.. bpo: 27942 -.. date: 0370 -.. nonce: ZGuhns -.. section: Core and Builtins - -String constants now interned recursively in tuples and frozensets. - -.. - -.. bpo: 28289 -.. date: 0369 -.. nonce: l1kHlV -.. section: Core and Builtins - -ImportError.__init__ now resets not specified attributes. - -.. - -.. bpo: 21578 -.. date: 0368 -.. nonce: GI1bhj -.. section: Core and Builtins - -Fixed misleading error message when ImportError called with invalid keyword -args. - -.. - -.. bpo: 28203 -.. date: 0367 -.. nonce: LRn5vp -.. section: Core and Builtins - -Fix incorrect type in complex(1.0, {2:3}) error message. Patch by Soumya -Sharma. - -.. - -.. bpo: 28086 -.. date: 0366 -.. nonce: JsQPMQ -.. section: Core and Builtins - -Single var-positional argument of tuple subtype was passed unscathed to the -C-defined function. Now it is converted to exact tuple. - -.. - -.. bpo: 28214 -.. date: 0365 -.. nonce: zQF8Em -.. section: Core and Builtins - -Now __set_name__ is looked up on the class instead of the instance. - -.. - -.. bpo: 27955 -.. date: 0364 -.. nonce: HC4pZ4 -.. section: Core and Builtins - -Fallback on reading /dev/urandom device when the getrandom() syscall fails -with EPERM, for example when blocked by SECCOMP. - -.. - -.. bpo: 28192 -.. date: 0363 -.. nonce: eR6stU -.. section: Core and Builtins - -Don't import readline in isolated mode. - -.. - -.. bpo: 27441 -.. date: 0362 -.. nonce: scPKax -.. section: Core and Builtins - -Remove some redundant assignments to ob_size in longobject.c. Thanks Oren -Milman. - -.. - -.. bpo: 27222 -.. date: 0361 -.. nonce: 74PvFk -.. section: Core and Builtins - -Clean up redundant code in long_rshift function. Thanks Oren Milman. - -.. - -.. bpo: 0 -.. date: 0360 -.. nonce: 9EbOiD -.. section: Core and Builtins - -Upgrade internal unicode databases to Unicode version 9.0.0. - -.. - -.. bpo: 28131 -.. date: 0359 -.. nonce: owq0wW -.. section: Core and Builtins - -Fix a regression in zipimport's compile_source(). zipimport should use the -same optimization level as the interpreter. - -.. - -.. bpo: 28126 -.. date: 0358 -.. nonce: Qf6-uQ -.. section: Core and Builtins - -Replace Py_MEMCPY with memcpy(). Visual Studio can properly optimize -memcpy(). - -.. - -.. bpo: 28120 -.. date: 0357 -.. nonce: e5xc1i -.. section: Core and Builtins - -Fix dict.pop() for splitted dictionary when trying to remove a "pending key" -(Not yet inserted in split-table). Patch by Xiang Zhang. - -.. - -.. bpo: 26182 -.. date: 0356 -.. nonce: jYlqTO -.. section: Core and Builtins - -Raise DeprecationWarning when async and await keywords are used as -variable/attribute/class/function name. - -.. - -.. bpo: 26182 -.. date: 0355 -.. nonce: a8JXK2 -.. section: Core and Builtins - -Fix a refleak in code that raises DeprecationWarning. - -.. - -.. bpo: 28721 -.. date: 0354 -.. nonce: BO9BUF -.. section: Core and Builtins - -Fix asynchronous generators aclose() and athrow() to handle -StopAsyncIteration propagation properly. - -.. - -.. bpo: 26110 -.. date: 0353 -.. nonce: KRaID6 -.. section: Core and Builtins - -Speed-up method calls: add LOAD_METHOD and CALL_METHOD opcodes. - -.. - -.. bpo: 31499 -.. date: 2017-09-18-10-57-04 -.. nonce: BydYhf -.. section: Library - -xml.etree: Fix a crash when a parser is part of a reference cycle. - -.. - -.. bpo: 31482 -.. date: 2017-09-16-01-53-11 -.. nonce: 39s5dS -.. section: Library - -``random.seed()`` now works with bytes in version=1 - -.. - -.. bpo: 28556 -.. date: 2017-09-14-11-02-56 -.. nonce: EUOiYs -.. section: Library - -typing.get_type_hints now finds the right globalns for classes and modules -by default (when no ``globalns`` was specified by the caller). - -.. - -.. bpo: 28556 -.. date: 2017-09-13-23-27-39 -.. nonce: UmTQvv -.. section: Library - -Speed improvements to the ``typing`` module. Original PRs by Ivan -Levkivskyi and Mitar. - -.. - -.. bpo: 31544 -.. date: 2017-09-13-19-55-35 -.. nonce: beTh6t -.. section: Library - -The C accelerator module of ElementTree ignored exceptions raised when -looking up TreeBuilder target methods in XMLParser(). - -.. - -.. bpo: 31234 -.. date: 2017-09-13-18-05-56 -.. nonce: lGkcPg -.. section: Library - -socket.create_connection() now fixes manually a reference cycle: clear the -variable storing the last exception on success. - -.. - -.. bpo: 31457 -.. date: 2017-09-13-13-33-39 -.. nonce: bIVBtI -.. section: Library - -LoggerAdapter objects can now be nested. - -.. - -.. bpo: 31431 -.. date: 2017-09-13-07-37-20 -.. nonce: dj994R -.. section: Library - -SSLContext.check_hostname now automatically sets SSLContext.verify_mode to -ssl.CERT_REQUIRED instead of failing with a ValueError. - -.. - -.. bpo: 31233 -.. date: 2017-09-13-02-17-11 -.. nonce: r-IPIu -.. section: Library - -socketserver.ThreadingMixIn now keeps a list of non-daemonic threads to wait -until all these threads complete in server_close(). - -.. - -.. bpo: 28638 -.. date: 2017-09-08-14-31-15 -.. nonce: lfbVyH -.. section: Library - -Changed the implementation strategy for collections.namedtuple() to -substantially reduce the use of exec() in favor of precomputed methods. As a -result, the *verbose* parameter and *_source* attribute are no longer -supported. The benefits include 1) having a smaller memory footprint for -applications using multiple named tuples, 2) faster creation of the named -tuple class (approx 4x to 6x depending on how it is measured), and 3) minor -speed-ups for instance creation using __new__, _make, and _replace. (The -primary patch contributor is Jelle Zijlstra with further improvements by -INADA Naoki, Serhiy Storchaka, and Raymond Hettinger.) - -.. - -.. bpo: 31400 -.. date: 2017-09-08-14-19-57 -.. nonce: YOTPKi -.. section: Library - -Improves SSL error handling to avoid losing error numbers. - -.. - -.. bpo: 27629 -.. date: 2017-09-07-12-15-56 -.. nonce: 7xJXEy -.. section: Library - -Make return types of SSLContext.wrap_bio() and SSLContext.wrap_socket() -customizable. - -.. - -.. bpo: 28958 -.. date: 2017-09-06-19-41-01 -.. nonce: x4-K5F -.. section: Library - -ssl.SSLContext() now uses OpenSSL error information when a context cannot be -instantiated. - -.. - -.. bpo: 28182 -.. date: 2017-09-06-18-49-16 -.. nonce: hRP8Bk -.. section: Library - -The SSL module now raises SSLCertVerificationError when OpenSSL fails to -verify the peer's certificate. The exception contains more information about -the error. - -.. - -.. bpo: 27340 -.. date: 2017-09-06-06-50-41 -.. nonce: GgekV5 -.. section: Library - -SSLSocket.sendall() now uses memoryview to create slices of data. This fixes -support for all bytes-like object. It is also more efficient and avoids -costly copies. - -.. - -.. bpo: 14191 -.. date: 2017-09-05-17-43-00 -.. nonce: vhh2xx -.. section: Library - -A new function ``argparse.ArgumentParser.parse_intermixed_args`` provides -the ability to parse command lines where there user intermixes options and -positional arguments. - -.. - -.. bpo: 31178 -.. date: 2017-09-05-14-55-28 -.. nonce: JrSFo7 -.. section: Library - -Fix string concatenation bug in rare error path in the subprocess module - -.. - -.. bpo: 31350 -.. date: 2017-09-05-10-30-48 -.. nonce: dXJ-7N -.. section: Library - -Micro-optimize :func:`asyncio._get_running_loop` to become up to 10% faster. - -.. - -.. bpo: 31170 -.. date: 2017-09-04-23-41-35 -.. nonce: QGmJ1t -.. section: Library - -expat: Update libexpat from 2.2.3 to 2.2.4. Fix copying of partial -characters for UTF-8 input (libexpat bug 115): -https://github.com/libexpat/libexpat/issues/115 - -.. - -.. bpo: 29136 -.. date: 2017-09-04-16-39-49 -.. nonce: vSn1oR -.. section: Library - -Add TLS 1.3 cipher suites and OP_NO_TLSv1_3. - -.. - -.. bpo: 1198569 -.. date: 2017-09-04-10-53-06 -.. nonce: vhh2nY -.. section: Library - -``string.Template`` subclasses can optionally define ``braceidpattern`` if -they want to specify different placeholder patterns inside and outside the -braces. If None (the default) it falls back to ``idpattern``. - -.. - -.. bpo: 31326 -.. date: 2017-09-01-18-48-06 -.. nonce: TB05tV -.. section: Library - -concurrent.futures.ProcessPoolExecutor.shutdown() now explicitly closes the -call queue. Moreover, shutdown(wait=True) now also join the call queue -thread, to prevent leaking a dangling thread. - -.. - -.. bpo: 27144 -.. date: 2017-08-30-11-26-14 -.. nonce: PEDJsE -.. section: Library - -The ``map()`` and ``as_completed()`` iterators in ``concurrent.futures`` now -avoid keeping a reference to yielded objects. - -.. - -.. bpo: 31281 -.. date: 2017-08-29-07-14-14 -.. nonce: DcFyNs -.. section: Library - -Fix ``fileinput.FileInput(files, inplace=True)`` when ``files`` contain -``pathlib.Path`` objects. - -.. - -.. bpo: 10746 -.. date: 2017-08-28-13-01-05 -.. nonce: nmAvfu -.. section: Library - -Fix ctypes producing wrong :pep:`3118` type codes for integer types. - -.. - -.. bpo: 27584 -.. date: 2017-08-24-14-03-14 -.. nonce: r11JHZ -.. section: Library - -``AF_VSOCK`` has been added to the socket interface which allows -communication between virtual machines and their host. - -.. - -.. bpo: 22536 -.. date: 2017-08-23 -.. nonce: _narf_ -.. section: Library - -The subprocess module now sets the filename when FileNotFoundError is raised -on POSIX systems due to the executable or cwd not being found. - -.. - -.. bpo: 29741 -.. date: 2017-08-23-00-31-32 -.. nonce: EBn_DM -.. section: Library - -Update some methods in the _pyio module to also accept integer types. Patch -by Oren Milman. - -.. - -.. bpo: 31249 -.. date: 2017-08-22-12-44-48 -.. nonce: STPbb9 -.. section: Library - -concurrent.futures: WorkItem.run() used by ThreadPoolExecutor now breaks a -reference cycle between an exception object and the WorkItem object. - -.. - -.. bpo: 31247 -.. date: 2017-08-21-17-50-27 -.. nonce: 8S3zJp -.. section: Library - -xmlrpc.server now explicitly breaks reference cycles when using -sys.exc_info() in code handling exceptions. - -.. - -.. bpo: 23835 -.. date: 2017-08-21-16-06-19 -.. nonce: da_4Kz -.. section: Library - -configparser: reading defaults in the ``ConfigParser()`` constructor is now -using ``read_dict()``, making its behavior consistent with the rest of the -parser. Non-string keys and values in the defaults dictionary are now being -implicitly converted to strings. Patch by James Tocknell. - -.. - -.. bpo: 31238 -.. date: 2017-08-21-12-31-53 -.. nonce: Gg0LRH -.. section: Library - -pydoc: the stop() method of the private ServerThread class now waits until -DocServer.serve_until_quit() completes and then explicitly sets its -docserver attribute to None to break a reference cycle. - -.. - -.. bpo: 5001 -.. date: 2017-08-18-17-16-38 -.. nonce: gwnthq -.. section: Library - -Many asserts in `multiprocessing` are now more informative, and some error -types have been changed to more specific ones. - -.. - -.. bpo: 31109 -.. date: 2017-08-17-20-29-45 -.. nonce: 7qtC64 -.. section: Library - -Convert zipimport to use Argument Clinic. - -.. - -.. bpo: 30102 -.. date: 2017-08-16-21-14-31 -.. nonce: 1sPqmc -.. section: Library - -The ssl and hashlib modules now call OPENSSL_add_all_algorithms_noconf() on -OpenSSL < 1.1.0. The function detects CPU features and enables optimizations -on some CPU architectures such as POWER8. Patch is based on research from -Gustavo Serra Scalet. - -.. - -.. bpo: 18966 -.. date: 2017-08-16-20-28-06 -.. nonce: mjHWk2 -.. section: Library - -Non-daemonic threads created by a multiprocessing.Process are now joined on -child exit. - -.. - -.. bpo: 31183 -.. date: 2017-08-13-09-17-01 -.. nonce: -2_YGj -.. section: Library - -`dis` now works with asynchronous generator and coroutine objects. Patch by -George Collins based on diagnosis by Luciano Ramalho. - -.. - -.. bpo: 5001 -.. date: 2017-08-12-09-25-55 -.. nonce: huQi2Y -.. section: Library - -There are a number of uninformative asserts in the `multiprocessing` module, -as noted in issue 5001. This change fixes two of the most potentially -problematic ones, since they are in error-reporting code, in the -`multiprocessing.managers.convert_to_error` function. (It also makes more -informative a ValueError message.) The only potentially problematic change -is that the AssertionError is now a TypeError; however, this should also -help distinguish it from an AssertionError being *reported* by the -function/its caller (such as in issue 31169). - Patch by Allen W. Smith -(drallensmith on github). - -.. - -.. bpo: 31185 -.. date: 2017-08-11-19-30-00 -.. nonce: i6TPgL -.. section: Library - -Fixed miscellaneous errors in asyncio speedup module. - -.. - -.. bpo: 31151 -.. date: 2017-08-10-13-20-02 -.. nonce: 730VBI -.. section: Library - -socketserver.ForkingMixIn.server_close() now waits until all child processes -completed to prevent leaking zombie processes. - -.. - -.. bpo: 31072 -.. date: 2017-08-09-13-45-23 -.. nonce: NLXDPV -.. section: Library - -Add an ``include_file`` parameter to ``zipapp.create_archive()`` - -.. - -.. bpo: 24700 -.. date: 2017-08-08-15-14-34 -.. nonce: 44mvNV -.. section: Library - -Optimize array.array comparison. It is now from 10x up to 70x faster when -comparing arrays holding values of the same integer type. - -.. - -.. bpo: 31135 -.. date: 2017-08-08-14-44-37 -.. nonce: HH94xR -.. section: Library - -ttk: fix the destroy() method of LabeledScale and OptionMenu classes. Call -the parent destroy() method even if the used attribute doesn't exist. The -LabeledScale.destroy() method now also explicitly clears label and scale -attributes to help the garbage collector to destroy all widgets. - -.. - -.. bpo: 31107 -.. date: 2017-08-02-12-48-15 -.. nonce: 1t2hn5 -.. section: Library - -Fix `copyreg._slotnames()` mangled attribute calculation for classes whose -name begins with an underscore. Patch by Shane Harvey. - -.. - -.. bpo: 31080 -.. date: 2017-08-01-18-26-55 -.. nonce: 2CFVCO -.. section: Library - -Allow `logging.config.fileConfig` to accept kwargs and/or args. - -.. - -.. bpo: 30897 -.. date: 2017-08-01-15-56-50 -.. nonce: OuT1-Y -.. section: Library - -``pathlib.Path`` objects now include an ``is_mount()`` method (only -implemented on POSIX). This is similar to ``os.path.ismount(p)``. Patch by -Cooper Ry Lees. - -.. - -.. bpo: 31061 -.. date: 2017-08-01-09-32-58 -.. nonce: husAYX -.. section: Library - -Fixed a crash when using asyncio and threads. - -.. - -.. bpo: 30987 -.. date: 2017-07-30-22-00-12 -.. nonce: 228rW0 -.. section: Library - -Added support for CAN ISO-TP protocol in the socket module. - -.. - -.. bpo: 30522 -.. date: 2017-07-30-10-07-58 -.. nonce: gAX1N- -.. section: Library - -Added a ``setStream`` method to ``logging.StreamHandler`` to allow the -stream to be set after creation. - -.. - -.. bpo: 30502 -.. date: 2017-07-27-11-33-58 -.. nonce: GJlfU8 -.. section: Library - -Fix handling of long oids in ssl. Based on patch by Christian Heimes. - -.. - -.. bpo: 5288 -.. date: 2017-07-26-13-18-29 -.. nonce: o_xEGj -.. section: Library - -Support tzinfo objects with sub-minute offsets. - -.. - -.. bpo: 30919 -.. date: 2017-07-23-11-33-10 -.. nonce: 5dYRru -.. section: Library - -Fix shared memory performance regression in multiprocessing in 3.x. -Shared memory used anonymous memory mappings in 2.x, while 3.x mmaps actual -files. Try to be careful to do as little disk I/O as possible. - -.. - -.. bpo: 26732 -.. date: 2017-07-22-12-12-42 -.. nonce: lYLWBH -.. section: Library - -Fix too many fds in processes started with the "forkserver" method. -A child process would inherit as many fds as the number of still-running -children. - -.. - -.. bpo: 29403 -.. date: 2017-07-20-02-29-49 -.. nonce: 3RinCV -.. section: Library - -Fix ``unittest.mock``'s autospec to not fail on method-bound builtin -functions. Patch by Aaron Gallagher. - -.. - -.. bpo: 30961 -.. date: 2017-07-18-23-47-51 -.. nonce: 064jz0 -.. section: Library - -Fix decrementing a borrowed reference in tracemalloc. - -.. - -.. bpo: 19896 -.. date: 2017-07-18-13-24-50 -.. nonce: -S0IWu -.. section: Library - -Fix multiprocessing.sharedctypes to recognize typecodes ``'q'`` and ``'Q'``. - -.. - -.. bpo: 30946 -.. date: 2017-07-17-12-32-47 -.. nonce: DUo-uA -.. section: Library - -Remove obsolete code in readline module for platforms where GNU readline is -older than 2.1 or where select() is not available. - -.. - -.. bpo: 25684 -.. date: 2017-07-17-11-35-00 -.. nonce: usELVx -.. section: Library - -Change ``ttk.OptionMenu`` radiobuttons to be unique across instances of -``OptionMenu``. - -.. - -.. bpo: 30886 -.. date: 2017-07-10-12-14-22 -.. nonce: nqQj34 -.. section: Library - -Fix multiprocessing.Queue.join_thread(): it now waits until the thread -completes, even if the thread was started by the same process which created -the queue. - -.. - -.. bpo: 29854 -.. date: 2017-07-07-02-18-57 -.. nonce: J8wKb_ -.. section: Library - -Fix segfault in readline when using readline's history-size option. Patch -by Nir Soffer. - -.. - -.. bpo: 30794 -.. date: 2017-07-04-22-00-20 -.. nonce: qFwozm -.. section: Library - -Added multiprocessing.Process.kill method to terminate using the SIGKILL -signal on Unix. - -.. - -.. bpo: 30319 -.. date: 2017-07-04-13-48-21 -.. nonce: hg_3TX -.. section: Library - -socket.close() now ignores ECONNRESET error. - -.. - -.. bpo: 30828 -.. date: 2017-07-04-13-10-52 -.. nonce: CLvEvV -.. section: Library - -Fix out of bounds write in `asyncio.CFuture.remove_done_callback()`. - -.. - -.. bpo: 30302 -.. date: 2017-06-30-23-05-47 -.. nonce: itwK_k -.. section: Library - -Use keywords in the ``repr`` of ``datetime.timedelta``. - -.. - -.. bpo: 30807 -.. date: 2017-06-29-22-04-44 -.. nonce: sLtjY- -.. section: Library - -signal.setitimer() may disable the timer when passed a tiny value. -Tiny values (such as 1e-6) are valid non-zero values for setitimer(), which -is specified as taking microsecond-resolution intervals. However, on some -platform, our conversion routine could convert 1e-6 into a zero interval, -therefore disabling the timer instead of (re-)scheduling it. - -.. - -.. bpo: 30441 -.. date: 2017-06-29-14-25-14 -.. nonce: 3Wh9kc -.. section: Library - -Fix bug when modifying os.environ while iterating over it - -.. - -.. bpo: 29585 -.. date: 2017-06-29-00-17-38 -.. nonce: x2V0my -.. section: Library - -Avoid importing ``sysconfig`` from ``site`` to improve startup speed. Python -startup is about 5% faster on Linux and 30% faster on macOS. - -.. - -.. bpo: 29293 -.. date: 2017-06-29-00-07-22 -.. nonce: Z6WZjD -.. section: Library - -Add missing parameter "n" on multiprocessing.Condition.notify(). -The doc claims multiprocessing.Condition behaves like threading.Condition, -but its notify() method lacked the optional "n" argument (to specify the -number of sleepers to wake up) that threading.Condition.notify() accepts. - -.. - -.. bpo: 30532 -.. date: 2017-06-26-11-01-59 -.. nonce: qTeL1o -.. section: Library - -Fix email header value parser dropping folding white space in certain cases. - -.. - -.. bpo: 30596 -.. date: 2017-06-24-18-55-58 -.. nonce: VhB8iG -.. section: Library - -Add a ``close()`` method to ``multiprocessing.Process``. - -.. - -.. bpo: 9146 -.. date: 2017-05-24-00-00-00 -.. nonce: pinky_ -.. section: Library - -Fix a segmentation fault in _hashopenssl when standard hash functions such -as md5 are not available in the linked OpenSSL library. As in some special -FIPS-140 build environments. - -.. - -.. bpo: 29169 -.. date: 0352 -.. nonce: 8ypApm -.. section: Library - -Update zlib to 1.2.11. - -.. - -.. bpo: 30119 -.. date: 0351 -.. nonce: 4UMLNh -.. section: Library - -ftplib.FTP.putline() now throws ValueError on commands that contains CR or -LF. Patch by Dong-hee Na. - -.. - -.. bpo: 30879 -.. date: 0350 -.. nonce: N3KI-o -.. section: Library - -os.listdir() and os.scandir() now emit bytes names when called with -bytes-like argument. - -.. - -.. bpo: 30746 -.. date: 0349 -.. nonce: 7drQI0 -.. section: Library - -Prohibited the '=' character in environment variable names in -``os.putenv()`` and ``os.spawn*()``. - -.. - -.. bpo: 30664 -.. date: 0348 -.. nonce: oyqiUl -.. section: Library - -The description of a unittest subtest now preserves the order of keyword -arguments of TestCase.subTest(). - -.. - -.. bpo: 21071 -.. date: 0346 -.. nonce: Sw37rs -.. section: Library - -struct.Struct.format type is now :class:`str` instead of :class:`bytes`. - -.. - -.. bpo: 29212 -.. date: 0345 -.. nonce: HmTdef -.. section: Library - -Fix concurrent.futures.thread.ThreadPoolExecutor threads to have a non -repr() based thread name by default when no thread_name_prefix is supplied. -They will now identify themselves as "ThreadPoolExecutor-y_n". - -.. - -.. bpo: 29755 -.. date: 0343 -.. nonce: diQcY_ -.. section: Library - -Fixed the lgettext() family of functions in the gettext module. They now -always return bytes. - -.. - -.. bpo: 30616 -.. date: 0341 -.. nonce: I2mDTz -.. section: Library - -Functional API of enum allows to create empty enums. Patched by Dong-hee Na - -.. - -.. bpo: 30038 -.. date: 0340 -.. nonce: vb4DWk -.. section: Library - -Fix race condition between signal delivery and wakeup file descriptor. Patch -by Nathaniel Smith. - -.. - -.. bpo: 23894 -.. date: 0339 -.. nonce: k2pADV -.. section: Library - -lib2to3 now recognizes ``rb'...'`` and ``f'...'`` strings. - -.. - -.. bpo: 24744 -.. date: 0337 -.. nonce: NKxUj3 -.. section: Library - -pkgutil.walk_packages function now raises ValueError if *path* is a string. -Patch by Sanyam Khurana. - -.. - -.. bpo: 24484 -.. date: 0336 -.. nonce: vFem8K -.. section: Library - -Avoid race condition in multiprocessing cleanup. - -.. - -.. bpo: 30589 -.. date: 0335 -.. nonce: xyZGM0 -.. section: Library - -Fix multiprocessing.Process.exitcode to return the opposite of the signal -number when the process is killed by a signal (instead of 255) when using -the "forkserver" method. - -.. - -.. bpo: 28994 -.. date: 0334 -.. nonce: 9vzun1 -.. section: Library - -The traceback no longer displayed for SystemExit raised in a callback -registered by atexit. - -.. - -.. bpo: 30508 -.. date: 0333 -.. nonce: wNWRS2 -.. section: Library - -Don't log exceptions if Task/Future "cancel()" method was called. - -.. - -.. bpo: 30645 -.. date: 0332 -.. nonce: xihJ4Y -.. section: Library - -Fix path calculation in `imp.load_package()`, fixing it for cases when a -package is only shipped with bytecodes. Patch by Alexandru Ardelean. - -.. - -.. bpo: 11822 -.. date: 0331 -.. nonce: GQmKw3 -.. section: Library - -The dis.dis() function now is able to disassemble nested code objects. - -.. - -.. bpo: 30624 -.. date: 0330 -.. nonce: g5oVSn -.. section: Library - -selectors does not take KeyboardInterrupt and SystemExit into account, -leaving a fd in a bad state in case of error. Patch by Giampaolo Rodola'. - -.. - -.. bpo: 30595 -.. date: 0329 -.. nonce: d0nRRA -.. section: Library - -multiprocessing.Queue.get() with a timeout now polls its reader in -non-blocking mode if it succeeded to acquire the lock but the acquire took -longer than the timeout. - -.. - -.. bpo: 28556 -.. date: 0328 -.. nonce: mESP7G -.. section: Library - -Updates to typing module: Add generic AsyncContextManager, add support for -ContextManager on all versions. Original PRs by Jelle Zijlstra and Ivan -Levkivskyi - -.. - -.. bpo: 30605 -.. date: 0327 -.. nonce: XqGz1r -.. section: Library - -re.compile() no longer raises a BytesWarning when compiling a bytes instance -with misplaced inline modifier. Patch by Roy Williams. - -.. - -.. bpo: 29870 -.. date: 0326 -.. nonce: p960Ih -.. section: Library - -Fix ssl sockets leaks when connection is aborted in asyncio/ssl -implementation. Patch by Michaël Sghaïer. - -.. - -.. bpo: 29743 -.. date: 0325 -.. nonce: en2P4s -.. section: Library - -Closing transport during handshake process leaks open socket. Patch by -Nikolay Kim - -.. - -.. bpo: 27585 -.. date: 0324 -.. nonce: 0Ugqqu -.. section: Library - -Fix waiter cancellation in asyncio.Lock. Patch by Mathieu Sornay. - -.. - -.. bpo: 30014 -.. date: 0323 -.. nonce: x7Yx6o -.. section: Library - -modify() method of poll(), epoll() and devpoll() based classes of selectors -module is around 10% faster. Patch by Giampaolo Rodola'. - -.. - -.. bpo: 30418 -.. date: 0322 -.. nonce: EwISQm -.. section: Library - -On Windows, subprocess.Popen.communicate() now also ignore EINVAL on -stdin.write() if the child process is still running but closed the pipe. - -.. - -.. bpo: 30463 -.. date: 0321 -.. nonce: CdOuSl -.. section: Library - -Addded empty __slots__ to abc.ABC. This allows subclassers to deny __dict__ -and __weakref__ creation. Patch by Aaron Hall. - -.. - -.. bpo: 30520 -.. date: 0320 -.. nonce: VYzaSn -.. section: Library - -Loggers are now pickleable. - -.. - -.. bpo: 30557 -.. date: 0319 -.. nonce: uykrLf -.. section: Library - -faulthandler now correctly filters and displays exception codes on Windows - -.. - -.. bpo: 30526 -.. date: 0318 -.. nonce: 7zTG30 -.. section: Library - -Add TextIOWrapper.reconfigure() and a TextIOWrapper.write_through attribute. - -.. - -.. bpo: 30245 -.. date: 0317 -.. nonce: Xoa_8Y -.. section: Library - -Fix possible overflow when organize struct.pack_into error message. Patch -by Yuan Liu. - -.. - -.. bpo: 30378 -.. date: 0316 -.. nonce: R_19_5 -.. section: Library - -Fix the problem that logging.handlers.SysLogHandler cannot handle IPv6 -addresses. - -.. - -.. bpo: 16500 -.. date: 0315 -.. nonce: 9ypo9k -.. section: Library - -Allow registering at-fork handlers. - -.. - -.. bpo: 30470 -.. date: 0314 -.. nonce: wAYhUc -.. section: Library - -Deprecate invalid ctypes call protection on Windows. Patch by Mariatta -Wijaya. - -.. - -.. bpo: 30414 -.. date: 0313 -.. nonce: jGl1Lb -.. section: Library - -multiprocessing.Queue._feed background running thread do not break from main -loop on exception. - -.. - -.. bpo: 30003 -.. date: 0312 -.. nonce: BOl9HE -.. section: Library - -Fix handling escape characters in HZ codec. Based on patch by Ma Lin. - -.. - -.. bpo: 30149 -.. date: 0311 -.. nonce: hE649r -.. section: Library - -inspect.signature() now supports callables with variable-argument parameters -wrapped with partialmethod. Patch by Dong-hee Na. - -.. - -.. bpo: 30436 -.. date: 0310 -.. nonce: b3zqE7 -.. section: Library - -importlib.find_spec() raises ModuleNotFoundError instead of AttributeError -if the specified parent module is not a package (i.e. lacks a __path__ -attribute). - -.. - -.. bpo: 30301 -.. date: 0309 -.. nonce: ywOkjN -.. section: Library - -Fix AttributeError when using SimpleQueue.empty() under *spawn* and -*forkserver* start methods. - -.. - -.. bpo: 30375 -.. date: 0308 -.. nonce: 9c8qM7 -.. section: Library - -Warnings emitted when compile a regular expression now always point to the -line in the user code. Previously they could point into inners of the re -module if emitted from inside of groups or conditionals. - -.. - -.. bpo: 30329 -.. date: 0307 -.. nonce: EuT36N -.. section: Library - -imaplib and poplib now catch the Windows socket WSAEINVAL error (code 10022) -on shutdown(SHUT_RDWR): An invalid operation was attempted. This error -occurs sometimes on SSL connections. - -.. - -.. bpo: 29196 -.. date: 0306 -.. nonce: qBq9eB -.. section: Library - -Removed previously deprecated in Python 2.4 classes Plist, Dict and -_InternalDict in the plistlib module. Dict values in the result of -functions readPlist() and readPlistFromBytes() are now normal dicts. You no -longer can use attribute access to access items of these dictionaries. - -.. - -.. bpo: 9850 -.. date: 0305 -.. nonce: c6SMxt -.. section: Library - -The :mod:`macpath` is now deprecated and will be removed in Python 3.8. - -.. - -.. bpo: 30299 -.. date: 0304 -.. nonce: O-5d4A -.. section: Library - -Compiling regular expression in debug mode on CPython now displays the -compiled bytecode in human readable form. - -.. - -.. bpo: 30048 -.. date: 0303 -.. nonce: ELRx8R -.. section: Library - -Fixed ``Task.cancel()`` can be ignored when the task is running coroutine -and the coroutine returned without any more ``await``. - -.. - -.. bpo: 30266 -.. date: 0302 -.. nonce: YJzHAH -.. section: Library - -contextlib.AbstractContextManager now supports anti-registration by setting -__enter__ = None or __exit__ = None, following the pattern introduced in -bpo-25958. Patch by Jelle Zijlstra. - -.. - -.. bpo: 30340 -.. date: 0301 -.. nonce: kvtGm- -.. section: Library - -Enhanced regular expressions optimization. This increased the performance of -matching some patterns up to 25 times. - -.. - -.. bpo: 30298 -.. date: 0300 -.. nonce: ZN-bWo -.. section: Library - -Weaken the condition of deprecation warnings for inline modifiers. Now -allowed several subsequential inline modifiers at the start of the pattern -(e.g. ``'(?i)(?s)...'``). In verbose mode whitespaces and comments now are -allowed before and between inline modifiers (e.g. ``'(?x) (?i) (?s)...'``). - -.. - -.. bpo: 30285 -.. date: 0299 -.. nonce: s1vpsO -.. section: Library - -Optimized case-insensitive matching and searching of regular expressions. - -.. - -.. bpo: 29990 -.. date: 0298 -.. nonce: HWV6KE -.. section: Library - -Fix range checking in GB18030 decoder. Original patch by Ma Lin. - -.. - -.. bpo: 29979 -.. date: 0297 -.. nonce: jGBMyE -.. section: Library - -rewrite cgi.parse_multipart, reusing the FieldStorage class and making its -results consistent with those of FieldStorage for multipart/form-data -requests. Patch by Pierre Quentel. - -.. - -.. bpo: 30243 -.. date: 0296 -.. nonce: RHQt0v -.. section: Library - -Removed the __init__ methods of _json's scanner and encoder. Misusing them -could cause memory leaks or crashes. Now scanner and encoder objects are -completely initialized in the __new__ methods. - -.. - -.. bpo: 30215 -.. date: 0295 -.. nonce: SY8738 -.. section: Library - -Compiled regular expression objects with the re.LOCALE flag no longer depend -on the locale at compile time. Only the locale at matching time affects the -result of matching. - -.. - -.. bpo: 30185 -.. date: 0294 -.. nonce: Tiu1n8 -.. section: Library - -Avoid KeyboardInterrupt tracebacks in forkserver helper process when Ctrl-C -is received. - -.. - -.. bpo: 30103 -.. date: 0293 -.. nonce: mmPjf5 -.. section: Library - -binascii.b2a_uu() and uu.encode() now support using ``'`'`` as zero instead -of space. - -.. - -.. bpo: 28556 -.. date: 0292 -.. nonce: 51gjbP -.. section: Library - -Various updates to typing module: add typing.NoReturn type, use -WrapperDescriptorType, minor bug-fixes. Original PRs by Jim -Fasarakis-Hilliard and Ivan Levkivskyi. - -.. - -.. bpo: 30205 -.. date: 0291 -.. nonce: BsxO34 -.. section: Library - -Fix getsockname() for unbound AF_UNIX sockets on Linux. - -.. - -.. bpo: 30228 -.. date: 0290 -.. nonce: nF8Ov4 -.. section: Library - -The seek() and tell() methods of io.FileIO now set the internal seekable -attribute to avoid one syscall on open() (in buffered or text mode). - -.. - -.. bpo: 30190 -.. date: 0289 -.. nonce: 5E7Hyb -.. section: Library - -unittest's assertAlmostEqual and assertNotAlmostEqual provide a better -message in case of failure which includes the difference between left and -right arguments. (patch by Giampaolo Rodola') - -.. - -.. bpo: 30101 -.. date: 0288 -.. nonce: hxUqSL -.. section: Library - -Add support for curses.A_ITALIC. - -.. - -.. bpo: 29822 -.. date: 0287 -.. nonce: G7dX13 -.. section: Library - -inspect.isabstract() now works during __init_subclass__. Patch by Nate -Soares. - -.. - -.. bpo: 29960 -.. date: 0286 -.. nonce: g0wr3r -.. section: Library - -Preserve generator state when _random.Random.setstate() raises an exception. -Patch by Bryan Olson. - -.. - -.. bpo: 30070 -.. date: 0285 -.. nonce: XM_B41 -.. section: Library - -Fixed leaks and crashes in errors handling in the parser module. - -.. - -.. bpo: 22352 -.. date: 0284 -.. nonce: gIQ5qC -.. section: Library - -Column widths in the output of dis.dis() are now adjusted for large line -numbers and instruction offsets. - -.. - -.. bpo: 30061 -.. date: 0283 -.. nonce: 2w_dX9 -.. section: Library - -Fixed crashes in IOBase methods __next__() and readlines() when readline() -or __next__() respectively return non-sizeable object. Fixed possible other -errors caused by not checking results of PyObject_Size(), PySequence_Size(), -or PyMapping_Size(). - -.. - -.. bpo: 30218 -.. date: 0282 -.. nonce: ab5oIg -.. section: Library - -Fix PathLike support for shutil.unpack_archive. Patch by Jelle Zijlstra. - -.. - -.. bpo: 10076 -.. date: 0281 -.. nonce: qCnwly -.. section: Library - -Compiled regular expression and match objects in the re module now support -copy.copy() and copy.deepcopy() (they are considered atomic). - -.. - -.. bpo: 30068 -.. date: 0280 -.. nonce: n4q47r -.. section: Library - -_io._IOBase.readlines will check if it's closed first when hint is present. - -.. - -.. bpo: 29694 -.. date: 0279 -.. nonce: LWKxb1 -.. section: Library - -Fixed race condition in pathlib mkdir with flags parents=True. Patch by -Armin Rigo. - -.. - -.. bpo: 29692 -.. date: 0278 -.. nonce: oyWrAE -.. section: Library - -Fixed arbitrary unchaining of RuntimeError exceptions in -contextlib.contextmanager. Patch by Siddharth Velankar. - -.. - -.. bpo: 26187 -.. date: 0277 -.. nonce: aViyiR -.. section: Library - -Test that sqlite3 trace callback is not called multiple times when schema is -changing. Indirectly fixed by switching to use sqlite3_prepare_v2() in -bpo-9303. Patch by Aviv Palivoda. - -.. - -.. bpo: 30017 -.. date: 0276 -.. nonce: cKBuhU -.. section: Library - -Allowed calling the close() method of the zip entry writer object multiple -times. Writing to a closed writer now always produces a ValueError. - -.. - -.. bpo: 29998 -.. date: 0275 -.. nonce: poeIKD -.. section: Library - -Pickling and copying ImportError now preserves name and path attributes. - -.. - -.. bpo: 29995 -.. date: 0274 -.. nonce: b3mOqx -.. section: Library - -re.escape() now escapes only regex special characters. - -.. - -.. bpo: 29962 -.. date: 0273 -.. nonce: r-ibsN -.. section: Library - -Add math.remainder operation, implementing remainder as specified in IEEE -754. - -.. - -.. bpo: 29649 -.. date: 0272 -.. nonce: 2eIxQ8 -.. section: Library - -Improve struct.pack_into() exception messages for problems with the buffer -size and offset. Patch by Andrew Nester. - -.. - -.. bpo: 29654 -.. date: 0271 -.. nonce: xRFPge -.. section: Library - -Support If-Modified-Since HTTP header (browser cache). Patch by Pierre -Quentel. - -.. - -.. bpo: 29931 -.. date: 0270 -.. nonce: tfcTwK -.. section: Library - -Fixed comparison check for ipaddress.ip_interface objects. Patch by Sanjay -Sundaresan. - -.. - -.. bpo: 29953 -.. date: 0269 -.. nonce: Q1hSt- -.. section: Library - -Fixed memory leaks in the replace() method of datetime and time objects when -pass out of bound fold argument. - -.. - -.. bpo: 29942 -.. date: 0268 -.. nonce: CsGNuT -.. section: Library - -Fix a crash in itertools.chain.from_iterable when encountering long runs of -empty iterables. - -.. - -.. bpo: 10030 -.. date: 0267 -.. nonce: ZdhU3k -.. section: Library - -Sped up reading encrypted ZIP files by 2 times. - -.. - -.. bpo: 29204 -.. date: 0266 -.. nonce: 8Hbqn2 -.. section: Library - -Element.getiterator() and the html parameter of XMLParser() were deprecated -only in the documentation (since Python 3.2 and 3.4 correspondintly). Now -using them emits a deprecation warning. - -.. - -.. bpo: 27863 -.. date: 0265 -.. nonce: pPYHHI -.. section: Library - -Fixed multiple crashes in ElementTree caused by race conditions and wrong -types. - -.. - -.. bpo: 25996 -.. date: 0264 -.. nonce: L2_giP -.. section: Library - -Added support of file descriptors in os.scandir() on Unix. os.fwalk() is -sped up by 2 times by using os.scandir(). - -.. - -.. bpo: 28699 -.. date: 0263 -.. nonce: wZztZP -.. section: Library - -Fixed a bug in pools in multiprocessing.pool that raising an exception at -the very first of an iterable may swallow the exception or make the program -hang. Patch by Davin Potts and Xiang Zhang. - -.. - -.. bpo: 23890 -.. date: 0262 -.. nonce: GCFAAZ -.. section: Library - -unittest.TestCase.assertRaises() now manually breaks a reference cycle to -not keep objects alive longer than expected. - -.. - -.. bpo: 29901 -.. date: 0261 -.. nonce: QdgMvW -.. section: Library - -The zipapp module now supports general path-like objects, not just -pathlib.Path. - -.. - -.. bpo: 25803 -.. date: 0260 -.. nonce: CPDR0W -.. section: Library - -Avoid incorrect errors raised by Path.mkdir(exist_ok=True) when the OS gives -priority to errors such as EACCES over EEXIST. - -.. - -.. bpo: 29861 -.. date: 0259 -.. nonce: t2ZoRK -.. section: Library - -Release references to tasks, their arguments and their results as soon as -they are finished in multiprocessing.Pool. - -.. - -.. bpo: 19930 -.. date: 0258 -.. nonce: QCjO6A -.. section: Library - -The mode argument of os.makedirs() no longer affects the file permission -bits of newly-created intermediate-level directories. - -.. - -.. bpo: 29884 -.. date: 0257 -.. nonce: kWXR8W -.. section: Library - -faulthandler: Restore the old sigaltstack during teardown. Patch by -Christophe Zeitouny. - -.. - -.. bpo: 25455 -.. date: 0256 -.. nonce: ZsahHN -.. section: Library - -Fixed crashes in repr of recursive buffered file-like objects. - -.. - -.. bpo: 29800 -.. date: 0255 -.. nonce: d2xASa -.. section: Library - -Fix crashes in partial.__repr__ if the keys of partial.keywords are not -strings. Patch by Michael Seifert. - -.. - -.. bpo: 8256 -.. date: 0254 -.. nonce: jAwGQH -.. section: Library - -Fixed possible failing or crashing input() if attributes "encoding" or -"errors" of sys.stdin or sys.stdout are not set or are not strings. - -.. - -.. bpo: 28692 -.. date: 0253 -.. nonce: CDt-Gb -.. section: Library - -Using non-integer value for selecting a plural form in gettext is now -deprecated. - -.. - -.. bpo: 26121 -.. date: 0252 -.. nonce: LX-pQA -.. section: Library - -Use C library implementation for math functions erf() and erfc(). - -.. - -.. bpo: 29619 -.. date: 0251 -.. nonce: WIGVxO -.. section: Library - -os.stat() and os.DirEntry.inode() now convert inode (st_ino) using unsigned -integers. - -.. - -.. bpo: 28298 -.. date: 0250 -.. nonce: PNOPsT -.. section: Library - -Fix a bug that prevented array 'Q', 'L' and 'I' from accepting big intables -(objects that have __int__) as elements. - -.. - -.. bpo: 29645 -.. date: 0249 -.. nonce: XCxTHM -.. section: Library - -Speed up importing the webbrowser module. webbrowser.register() is now -thread-safe. - -.. - -.. bpo: 28231 -.. date: 0248 -.. nonce: MG1X09 -.. section: Library - -The zipfile module now accepts path-like objects for external paths. - -.. - -.. bpo: 26915 -.. date: 0247 -.. nonce: qShJZO -.. section: Library - -index() and count() methods of collections.abc.Sequence now check identity -before checking equality when do comparisons. - -.. - -.. bpo: 28682 -.. date: 0246 -.. nonce: hUxdej -.. section: Library - -Added support for bytes paths in os.fwalk(). - -.. - -.. bpo: 29728 -.. date: 0245 -.. nonce: 37jMwb -.. section: Library - -Add new :data:`socket.TCP_NOTSENT_LOWAT` (Linux 3.12) constant. Patch by -Nathaniel J. Smith. - -.. - -.. bpo: 29623 -.. date: 0244 -.. nonce: D3-NP2 -.. section: Library - -Allow use of path-like object as a single argument in ConfigParser.read(). -Patch by David Ellis. - -.. - -.. bpo: 9303 -.. date: 0243 -.. nonce: kDZRSd -.. section: Library - -Migrate sqlite3 module to _v2 API. Patch by Aviv Palivoda. - -.. - -.. bpo: 28963 -.. date: 0242 -.. nonce: tPl8dq -.. section: Library - -Fix out of bound iteration in asyncio.Future.remove_done_callback -implemented in C. - -.. - -.. bpo: 29704 -.. date: 0241 -.. nonce: WHbx27 -.. section: Library - -asyncio.subprocess.SubprocessStreamProtocol no longer closes before all -pipes are closed. - -.. - -.. bpo: 29271 -.. date: 0240 -.. nonce: y8Vj2v -.. section: Library - -Fix Task.current_task and Task.all_tasks implemented in C to accept None -argument as their pure Python implementation. - -.. - -.. bpo: 29703 -.. date: 0239 -.. nonce: ZdsPCR -.. section: Library - -Fix asyncio to support instantiation of new event loops in child processes. - -.. - -.. bpo: 29615 -.. date: 0238 -.. nonce: OpFKzg -.. section: Library - -SimpleXMLRPCDispatcher no longer chains KeyError (or any other exception) to -exception(s) raised in the dispatched methods. Patch by Petr Motejlek. - -.. - -.. bpo: 7769 -.. date: 0237 -.. nonce: xGRJWh -.. section: Library - -Method register_function() of xmlrpc.server.SimpleXMLRPCDispatcher and its -subclasses can now be used as a decorator. - -.. - -.. bpo: 29376 -.. date: 0236 -.. nonce: rrJhJy -.. section: Library - -Fix assertion error in threading._DummyThread.is_alive(). - -.. - -.. bpo: 28624 -.. date: 0235 -.. nonce: 43TJib -.. section: Library - -Add a test that checks that cwd parameter of Popen() accepts PathLike -objects. Patch by Sayan Chowdhury. - -.. - -.. bpo: 28518 -.. date: 0234 -.. nonce: o-Q2Nw -.. section: Library - -Start a transaction implicitly before a DML statement. Patch by Aviv -Palivoda. - -.. - -.. bpo: 29742 -.. date: 0233 -.. nonce: 8hqfEO -.. section: Library - -get_extra_info() raises exception if get called on closed ssl transport. -Patch by Nikolay Kim. - -.. - -.. bpo: 16285 -.. date: 0232 -.. nonce: 4f5gbp -.. section: Library - -urllib.parse.quote is now based on RFC 3986 and hence includes '~' in the -set of characters that is not quoted by default. Patch by Christian Theune -and Ratnadeep Debnath. - -.. - -.. bpo: 29532 -.. date: 0231 -.. nonce: YCwVQn -.. section: Library - -Altering a kwarg dictionary passed to functools.partial() no longer affects -a partial object after creation. - -.. - -.. bpo: 29110 -.. date: 0230 -.. nonce: wmE-_T -.. section: Library - -Fix file object leak in aifc.open() when file is given as a filesystem path -and is not in valid AIFF format. Patch by Anthony Zhang. - -.. - -.. bpo: 22807 -.. date: 0229 -.. nonce: VmoSkZ -.. section: Library - -Add uuid.SafeUUID and uuid.UUID.is_safe to relay information from the -platform about whether generated UUIDs are generated with a multiprocessing -safe method. - -.. - -.. bpo: 29576 -.. date: 0228 -.. nonce: F-b8_5 -.. section: Library - -Improve some deprecations in importlib. Some deprecated methods now emit -DeprecationWarnings and have better descriptive messages. - -.. - -.. bpo: 29534 -.. date: 0227 -.. nonce: Ug3HPU -.. section: Library - -Fixed different behaviour of Decimal.from_float() for _decimal and -_pydecimal. Thanks Andrew Nester. - -.. - -.. bpo: 10379 -.. date: 0226 -.. nonce: mRlZsT -.. section: Library - -locale.format_string now supports the 'monetary' keyword argument, and -locale.format is deprecated. - -.. - -.. bpo: 29851 -.. date: 0225 -.. nonce: jqs_5s -.. section: Library - -importlib.reload() now raises ModuleNotFoundError if the module lacks a -spec. - -.. - -.. bpo: 28556 -.. date: 0224 -.. nonce: p6967e -.. section: Library - -Various updates to typing module: typing.Counter, typing.ChainMap, improved -ABC caching, etc. Original PRs by Jelle Zijlstra, Ivan Levkivskyi, Manuel -Krebber, and Łukasz Langa. - -.. - -.. bpo: 29100 -.. date: 0223 -.. nonce: LAAERS -.. section: Library - -Fix datetime.fromtimestamp() regression introduced in Python 3.6.0: check -minimum and maximum years. - -.. - -.. bpo: 29416 -.. date: 0222 -.. nonce: KJGyI_ -.. section: Library - -Prevent infinite loop in pathlib.Path.mkdir - -.. - -.. bpo: 29444 -.. date: 0221 -.. nonce: cEwgmk -.. section: Library - -Fixed out-of-bounds buffer access in the group() method of the match object. -Based on patch by WGH. - -.. - -.. bpo: 29377 -.. date: 0220 -.. nonce: 4AvSrC -.. section: Library - -Add WrapperDescriptorType, MethodWrapperType, and MethodDescriptorType -built-in types to types module. Original patch by Manuel Krebber. - -.. - -.. bpo: 29218 -.. date: 0219 -.. nonce: -Qoti0 -.. section: Library - -Unused install_misc command is now removed. It has been documented as -unused since 2000. Patch by Eric N. Vander Weele. - -.. - -.. bpo: 29368 -.. date: 0218 -.. nonce: nTtA_V -.. section: Library - -The extend() method is now called instead of the append() method when -unpickle collections.deque and other list-like objects. This can speed up -unpickling to 2 times. - -.. - -.. bpo: 29338 -.. date: 0217 -.. nonce: EpvQJl -.. section: Library - -The help of a builtin or extension class now includes the constructor -signature if __text_signature__ is provided for the class. - -.. - -.. bpo: 29335 -.. date: 0216 -.. nonce: _KC7IK -.. section: Library - -Fix subprocess.Popen.wait() when the child process has exited to a stopped -instead of terminated state (ex: when under ptrace). - -.. - -.. bpo: 29290 -.. date: 0215 -.. nonce: XBqptF -.. section: Library - -Fix a regression in argparse that help messages would wrap at non-breaking -spaces. - -.. - -.. bpo: 28735 -.. date: 0214 -.. nonce: admHLO -.. section: Library - -Fixed the comparison of mock.MagickMock with mock.ANY. - -.. - -.. bpo: 29197 -.. date: 0213 -.. nonce: sZssFZ -.. section: Library - -Removed deprecated function ntpath.splitunc(). - -.. - -.. bpo: 29210 -.. date: 0212 -.. nonce: y1UHWf -.. section: Library - -Removed support of deprecated argument "exclude" in tarfile.TarFile.add(). - -.. - -.. bpo: 29219 -.. date: 0211 -.. nonce: kxui7t -.. section: Library - -Fixed infinite recursion in the repr of uninitialized ctypes.CDLL instances. - -.. - -.. bpo: 29192 -.. date: 0210 -.. nonce: mY31H8 -.. section: Library - -Removed deprecated features in the http.cookies module. - -.. - -.. bpo: 29193 -.. date: 0209 -.. nonce: CgcjEx -.. section: Library - -A format string argument for string.Formatter.format() is now -positional-only. - -.. - -.. bpo: 29195 -.. date: 0208 -.. nonce: vK5LjU -.. section: Library - -Removed support of deprecated undocumented keyword arguments in methods of -regular expression objects. - -.. - -.. bpo: 28969 -.. date: 0207 -.. nonce: j3HJYO -.. section: Library - -Fixed race condition in C implementation of functools.lru_cache. KeyError -could be raised when cached function with full cache was simultaneously -called from different threads with the same uncached arguments. - -.. - -.. bpo: 20804 -.. date: 0206 -.. nonce: XyZhvi -.. section: Library - -The unittest.mock.sentinel attributes now preserve their identity when they -are copied or pickled. - -.. - -.. bpo: 29142 -.. date: 0205 -.. nonce: xo6kAv -.. section: Library - -In urllib.request, suffixes in no_proxy environment variable with leading -dots could match related hostnames again (e.g. .b.c matches a.b.c). Patch by -Milan Oberkirch. - -.. - -.. bpo: 28961 -.. date: 0204 -.. nonce: Rt93vg -.. section: Library - -Fix unittest.mock._Call helper: don't ignore the name parameter anymore. -Patch written by Jiajun Huang. - -.. - -.. bpo: 15812 -.. date: 0203 -.. nonce: R1U-Ec -.. section: Library - -inspect.getframeinfo() now correctly shows the first line of a context. -Patch by Sam Breese. - -.. - -.. bpo: 28985 -.. date: 0202 -.. nonce: TMWJFg -.. section: Library - -Update authorizer constants in sqlite3 module. Patch by Dingyuan Wang. - -.. - -.. bpo: 29079 -.. date: 0201 -.. nonce: g4YLix -.. section: Library - -Prevent infinite loop in pathlib.resolve() on Windows - -.. - -.. bpo: 13051 -.. date: 0200 -.. nonce: YzC1Te -.. section: Library - -Fixed recursion errors in large or resized curses.textpad.Textbox. Based on -patch by Tycho Andersen. - -.. - -.. bpo: 9770 -.. date: 0199 -.. nonce: WJJnwP -.. section: Library - -curses.ascii predicates now work correctly with negative integers. - -.. - -.. bpo: 28427 -.. date: 0198 -.. nonce: vUd-va -.. section: Library - -old keys should not remove new values from WeakValueDictionary when -collecting from another thread. - -.. - -.. bpo: 28923 -.. date: 0197 -.. nonce: naVULD -.. section: Library - -Remove editor artifacts from Tix.py. - -.. - -.. bpo: 28871 -.. date: 0196 -.. nonce: cPMXCJ -.. section: Library - -Fixed a crash when deallocate deep ElementTree. - -.. - -.. bpo: 19542 -.. date: 0195 -.. nonce: 5tCkaK -.. section: Library - -Fix bugs in WeakValueDictionary.setdefault() and WeakValueDictionary.pop() -when a GC collection happens in another thread. - -.. - -.. bpo: 20191 -.. date: 0194 -.. nonce: Q7uZCS -.. section: Library - -Fixed a crash in resource.prlimit() when passing a sequence that doesn't own -its elements as limits. - -.. - -.. bpo: 16255 -.. date: 0193 -.. nonce: p2YA85 -.. section: Library - -subprocess.Popen uses /system/bin/sh on Android as the shell, instead of -/bin/sh. - -.. - -.. bpo: 28779 -.. date: 0192 -.. nonce: t-mjED -.. section: Library - -multiprocessing.set_forkserver_preload() would crash the forkserver process -if a preloaded module instantiated some multiprocessing objects such as -locks. - -.. - -.. bpo: 26937 -.. date: 0191 -.. nonce: c9kgiA -.. section: Library - -The chown() method of the tarfile.TarFile class does not fail now when the -grp module cannot be imported, as for example on Android platforms. - -.. - -.. bpo: 28847 -.. date: 0190 -.. nonce: GiWd9w -.. section: Library - -dbm.dumb now supports reading read-only files and no longer writes the index -file when it is not changed. A deprecation warning is now emitted if the -index file is missed and recreated in the 'r' and 'w' modes (will be an -error in future Python releases). - -.. - -.. bpo: 27030 -.. date: 0189 -.. nonce: GoGlFH -.. section: Library - -Unknown escapes consisting of ``'\'`` and an ASCII letter in re.sub() -replacement templates regular expressions now are errors. - -.. - -.. bpo: 28835 -.. date: 0188 -.. nonce: iWBYH7 -.. section: Library - -Fix a regression introduced in warnings.catch_warnings(): call -warnings.showwarning() if it was overridden inside the context manager. - -.. - -.. bpo: 27172 -.. date: 0187 -.. nonce: mVKfLT -.. section: Library - -To assist with upgrades from 2.7, the previously documented deprecation of -``inspect.getfullargspec()`` has been reversed. This decision may be -revisited again after the Python 2.7 branch is no longer officially -supported. - -.. - -.. bpo: 28740 -.. date: 0186 -.. nonce: rY8kz- -.. section: Library - -Add sys.getandroidapilevel(): return the build time API version of Android -as an integer. Function only available on Android. - -.. - -.. bpo: 26273 -.. date: 0185 -.. nonce: ilNIWN -.. section: Library - -Add new :data:`socket.TCP_CONGESTION` (Linux 2.6.13) and -:data:`socket.TCP_USER_TIMEOUT` (Linux 2.6.37) constants. Patch written by -Omar Sandoval. - -.. - -.. bpo: 28752 -.. date: 0184 -.. nonce: Q-4oRE -.. section: Library - -Restored the __reduce__() methods of datetime objects. - -.. - -.. bpo: 28727 -.. date: 0183 -.. nonce: ubZP_b -.. section: Library - -Regular expression patterns, _sre.SRE_Pattern objects created by -re.compile(), become comparable (only x==y and x!=y operators). This change -should fix the issue #18383: don't duplicate warning filters when the -warnings module is reloaded (thing usually only done in unit tests). - -.. - -.. bpo: 20572 -.. date: 0182 -.. nonce: NCRmvz -.. section: Library - -Remove the subprocess.Popen.wait endtime parameter. It was deprecated in -3.4 and undocumented prior to that. - -.. - -.. bpo: 25659 -.. date: 0181 -.. nonce: lE2IlT -.. section: Library - -In ctypes, prevent a crash calling the from_buffer() and from_buffer_copy() -methods on abstract classes like Array. - -.. - -.. bpo: 28548 -.. date: 0180 -.. nonce: IeNrnG -.. section: Library - -In the "http.server" module, parse the protocol version if possible, to -avoid using HTTP 0.9 in some error responses. - -.. - -.. bpo: 19717 -.. date: 0179 -.. nonce: HXCAIz -.. section: Library - -Makes Path.resolve() succeed on paths that do not exist. Patch by Vajrasky -Kok - -.. - -.. bpo: 28563 -.. date: 0178 -.. nonce: iweEiw -.. section: Library - -Fixed possible DoS and arbitrary code execution when handle plural form -selections in the gettext module. The expression parser now supports exact -syntax supported by GNU gettext. - -.. - -.. bpo: 28387 -.. date: 0177 -.. nonce: 1clJu7 -.. section: Library - -Fixed possible crash in _io.TextIOWrapper deallocator when the garbage -collector is invoked in other thread. Based on patch by Sebastian Cufre. - -.. - -.. bpo: 27517 -.. date: 0176 -.. nonce: 1CYM8A -.. section: Library - -LZMA compressor and decompressor no longer raise exceptions if given empty -data twice. Patch by Benjamin Fogle. - -.. - -.. bpo: 28549 -.. date: 0175 -.. nonce: ShnM2y -.. section: Library - -Fixed segfault in curses's addch() with ncurses6. - -.. - -.. bpo: 28449 -.. date: 0174 -.. nonce: 5JK6ES -.. section: Library - -tarfile.open() with mode "r" or "r:" now tries to open a tar file with -compression before trying to open it without compression. Otherwise it had -50% chance failed with ignore_zeros=True. - -.. - -.. bpo: 23262 -.. date: 0173 -.. nonce: 6EVB7N -.. section: Library - -The webbrowser module now supports Firefox 36+ and derived browsers. Based -on patch by Oleg Broytman. - -.. - -.. bpo: 24241 -.. date: 0172 -.. nonce: y7N12p -.. section: Library - -The webbrowser in an X environment now prefers using the default browser -directly. Also, the webbrowser register() function now has a documented -'preferred' argument, to specify browsers to be returned by get() with no -arguments. Patch by David Steele - -.. - -.. bpo: 27939 -.. date: 0171 -.. nonce: mTfADV -.. section: Library - -Fixed bugs in tkinter.ttk.LabeledScale and tkinter.Scale caused by -representing the scale as float value internally in Tk. tkinter.IntVar now -works if float value is set to underlying Tk variable. - -.. - -.. bpo: 28255 -.. date: 0170 -.. nonce: G3iOPm -.. section: Library - -calendar.TextCalendar.prweek() no longer prints a space after a weeks's -calendar. calendar.TextCalendar.pryear() no longer prints redundant newline -after a year's calendar. Based on patch by Xiang Zhang. - -.. - -.. bpo: 28255 -.. date: 0169 -.. nonce: fHNZu0 -.. section: Library - -calendar.TextCalendar.prmonth() no longer prints a space at the start of new -line after printing a month's calendar. Patch by Xiang Zhang. - -.. - -.. bpo: 20491 -.. date: 0168 -.. nonce: ObgnQ2 -.. section: Library - -The textwrap.TextWrapper class now honors non-breaking spaces. Based on -patch by Kaarle Ritvanen. - -.. - -.. bpo: 28353 -.. date: 0167 -.. nonce: sKGbLL -.. section: Library - -os.fwalk() no longer fails on broken links. - -.. - -.. bpo: 28430 -.. date: 0166 -.. nonce: 4MiEYT -.. section: Library - -Fix iterator of C implemented asyncio.Future doesn't accept non-None value -is passed to it.send(val). - -.. - -.. bpo: 27025 -.. date: 0165 -.. nonce: foAViS -.. section: Library - -Generated names for Tkinter widgets now start by the "!" prefix for -readability. - -.. - -.. bpo: 25464 -.. date: 0164 -.. nonce: HDUTCu -.. section: Library - -Fixed HList.header_exists() in tkinter.tix module by addin a workaround to -Tix library bug. - -.. - -.. bpo: 28488 -.. date: 0163 -.. nonce: TgO112 -.. section: Library - -shutil.make_archive() no longer adds entry "./" to ZIP archive. - -.. - -.. bpo: 25953 -.. date: 0162 -.. nonce: EKKJAQ -.. section: Library - -re.sub() now raises an error for invalid numerical group reference in -replacement template even if the pattern is not found in the string. Error -message for invalid group reference now includes the group index and the -position of the reference. Based on patch by SilentGhost. - -.. - -.. bpo: 28469 -.. date: 0161 -.. nonce: QZW1Np -.. section: Library - -timeit now uses the sequence 1, 2, 5, 10, 20, 50,... instead of 1, 10, -100,... for autoranging. - -.. - -.. bpo: 28115 -.. date: 0160 -.. nonce: 4FIjIE -.. section: Library - -Command-line interface of the zipfile module now uses argparse. Added -support of long options. - -.. - -.. bpo: 18219 -.. date: 0159 -.. nonce: 1ANQN1 -.. section: Library - -Optimize csv.DictWriter for large number of columns. Patch by Mariatta -Wijaya. - -.. - -.. bpo: 28448 -.. date: 0158 -.. nonce: 5bduWe -.. section: Library - -Fix C implemented asyncio.Future didn't work on Windows. - -.. - -.. bpo: 23214 -.. date: 0157 -.. nonce: -4Q5Z7 -.. section: Library - -In the "io" module, the argument to BufferedReader and BytesIO's read1() -methods is now optional and can be -1, matching the BufferedIOBase -specification. - -.. - -.. bpo: 28480 -.. date: 0156 -.. nonce: 9lHw6m -.. section: Library - -Fix error building socket module when multithreading is disabled. - -.. - -.. bpo: 28240 -.. date: 0155 -.. nonce: hqzQvS -.. section: Library - -timeit: remove ``-c/--clock`` and ``-t/--time`` command line options which -were deprecated since Python 3.3. - -.. - -.. bpo: 28240 -.. date: 0154 -.. nonce: IwQMgd -.. section: Library - -timeit now repeats the benchmarks 5 times instead of only 3 to make -benchmarks more reliable. - -.. - -.. bpo: 28240 -.. date: 0153 -.. nonce: cXljq- -.. section: Library - -timeit autorange now uses a single loop iteration if the benchmark takes -less than 10 seconds, instead of 10 iterations. "python3 -m timeit -s -'import time' 'time.sleep(1)'" now takes 4 seconds instead of 40 seconds. - -.. - -.. bpo: 0 -.. date: 0152 -.. nonce: 5Y0ngw -.. section: Library - -Distutils.sdist now looks for README and setup.py files with case -sensitivity. This behavior matches that found in Setuptools 6.0 and later. -See `setuptools 100 `_ for -rationale. - -.. - -.. bpo: 24452 -.. date: 0151 -.. nonce: pVsjt0 -.. section: Library - -Make webbrowser support Chrome on Mac OS X. Patch by Ned Batchelder. - -.. - -.. bpo: 20766 -.. date: 0150 -.. nonce: 4kvCzx -.. section: Library - -Fix references leaked by pdb in the handling of SIGINT handlers. - -.. - -.. bpo: 27998 -.. date: 0149 -.. nonce: CPhy4H -.. section: Library - -Fixed bytes path support in os.scandir() on Windows. Patch by Eryk Sun. - -.. - -.. bpo: 28317 -.. date: 0148 -.. nonce: LgHleA -.. section: Library - -The disassembler now decodes FORMAT_VALUE argument. - -.. - -.. bpo: 28380 -.. date: 0147 -.. nonce: jKPMzH -.. section: Library - -unittest.mock Mock autospec functions now properly support assert_called, -assert_not_called, and assert_called_once. - -.. - -.. bpo: 28229 -.. date: 0146 -.. nonce: BKAxcS -.. section: Library - -lzma module now supports pathlib. - -.. - -.. bpo: 28321 -.. date: 0145 -.. nonce: bQ-IIX -.. section: Library - -Fixed writing non-BMP characters with binary format in plistlib. - -.. - -.. bpo: 28225 -.. date: 0144 -.. nonce: 6N28nu -.. section: Library - -bz2 module now supports pathlib. Initial patch by Ethan Furman. - -.. - -.. bpo: 28227 -.. date: 0143 -.. nonce: 7lUz8i -.. section: Library - -gzip now supports pathlib. Patch by Ethan Furman. - -.. - -.. bpo: 28332 -.. date: 0142 -.. nonce: Ed8fNk -.. section: Library - -Deprecated silent truncations in socket.htons and socket.ntohs. Original -patch by Oren Milman. - -.. - -.. bpo: 27358 -.. date: 0141 -.. nonce: t288Iv -.. section: Library - -Optimized merging var-keyword arguments and improved error message when -passing a non-mapping as a var-keyword argument. - -.. - -.. bpo: 28257 -.. date: 0140 -.. nonce: SVD_IH -.. section: Library - -Improved error message when passing a non-iterable as a var-positional -argument. Added opcode BUILD_TUPLE_UNPACK_WITH_CALL. - -.. - -.. bpo: 28322 -.. date: 0139 -.. nonce: l9hzap -.. section: Library - -Fixed possible crashes when unpickle itertools objects from incorrect pickle -data. Based on patch by John Leitch. - -.. - -.. bpo: 28228 -.. date: 0138 -.. nonce: 1qBwdM -.. section: Library - -imghdr now supports pathlib. - -.. - -.. bpo: 28226 -.. date: 0137 -.. nonce: nMXiwU -.. section: Library - -compileall now supports pathlib. - -.. - -.. bpo: 28314 -.. date: 0136 -.. nonce: N7YrkN -.. section: Library - -Fix function declaration (C flags) for the getiterator() method of -xml.etree.ElementTree.Element. - -.. - -.. bpo: 28148 -.. date: 0135 -.. nonce: Flzndx -.. section: Library - -Stop using localtime() and gmtime() in the time module. -Introduced platform independent _PyTime_localtime API that is similar to -POSIX localtime_r, but available on all platforms. Patch by Ed Schouten. - -.. - -.. bpo: 28253 -.. date: 0134 -.. nonce: aLfmhe -.. section: Library - -Fixed calendar functions for extreme months: 0001-01 and 9999-12. -Methods itermonthdays() and itermonthdays2() are reimplemented so that they -don't call itermonthdates() which can cause datetime.date under/overflow. - -.. - -.. bpo: 28275 -.. date: 0133 -.. nonce: EhWIsz -.. section: Library - -Fixed possible use after free in the decompress() methods of the -LZMADecompressor and BZ2Decompressor classes. Original patch by John Leitch. - -.. - -.. bpo: 27897 -.. date: 0132 -.. nonce: I0Ppmx -.. section: Library - -Fixed possible crash in sqlite3.Connection.create_collation() if pass -invalid string-like object as a name. Patch by Xiang Zhang. - -.. - -.. bpo: 18844 -.. date: 0131 -.. nonce: fQsEdn -.. section: Library - -random.choices() now has k as a keyword-only argument to improve the -readability of common cases and come into line with the signature used in -other languages. - -.. - -.. bpo: 18893 -.. date: 0130 -.. nonce: osiX5c -.. section: Library - -Fix invalid exception handling in Lib/ctypes/macholib/dyld.py. Patch by -Madison May. - -.. - -.. bpo: 27611 -.. date: 0129 -.. nonce: A_ArH_ -.. section: Library - -Fixed support of default root window in the tkinter.tix module. Added the -master parameter in the DisplayStyle constructor. - -.. - -.. bpo: 27348 -.. date: 0128 -.. nonce: tDx7Vw -.. section: Library - -In the traceback module, restore the formatting of exception messages like -"Exception: None". This fixes a regression introduced in 3.5a2. - -.. - -.. bpo: 25651 -.. date: 0127 -.. nonce: 3UhyPo -.. section: Library - -Allow falsy values to be used for msg parameter of subTest(). - -.. - -.. bpo: 27778 -.. date: 0126 -.. nonce: Yyo1aP -.. section: Library - -Fix a memory leak in os.getrandom() when the getrandom() is interrupted by a -signal and a signal handler raises a Python exception. - -.. - -.. bpo: 28200 -.. date: 0125 -.. nonce: 4IEbr7 -.. section: Library - -Fix memory leak on Windows in the os module (fix path_converter() function). - -.. - -.. bpo: 25400 -.. date: 0124 -.. nonce: d9Qn0E -.. section: Library - -RobotFileParser now correctly returns default values for crawl_delay and -request_rate. Initial patch by Peter Wirtz. - -.. - -.. bpo: 27932 -.. date: 0123 -.. nonce: mtgl-6 -.. section: Library - -Prevent memory leak in win32_ver(). - -.. - -.. bpo: 0 -.. date: 0122 -.. nonce: iPpjqX -.. section: Library - -Fix UnboundLocalError in socket._sendfile_use_sendfile. - -.. - -.. bpo: 28075 -.. date: 0121 -.. nonce: aLiUs9 -.. section: Library - -Check for ERROR_ACCESS_DENIED in Windows implementation of os.stat(). Patch -by Eryk Sun. - -.. - -.. bpo: 22493 -.. date: 0120 -.. nonce: Mv_hZf -.. section: Library - -Warning message emitted by using inline flags in the middle of regular -expression now contains a (truncated) regex pattern. Patch by Tim Graham. - -.. - -.. bpo: 25270 -.. date: 0119 -.. nonce: jrZruM -.. section: Library - -Prevent codecs.escape_encode() from raising SystemError when an empty -bytestring is passed. - -.. - -.. bpo: 28181 -.. date: 0118 -.. nonce: NGc4Yv -.. section: Library - -Get antigravity over HTTPS. Patch by Kaartic Sivaraam. - -.. - -.. bpo: 25895 -.. date: 0117 -.. nonce: j92qoQ -.. section: Library - -Enable WebSocket URL schemes in urllib.parse.urljoin. Patch by Gergely Imreh -and Markus Holtermann. - -.. - -.. bpo: 28114 -.. date: 0116 -.. nonce: gmFXsA -.. section: Library - -Fix a crash in parse_envlist() when env contains byte strings. Patch by Eryk -Sun. - -.. - -.. bpo: 27599 -.. date: 0115 -.. nonce: itvm8T -.. section: Library - -Fixed buffer overrun in binascii.b2a_qp() and binascii.a2b_qp(). - -.. - -.. bpo: 27906 -.. date: 0114 -.. nonce: TBBXrv -.. section: Library - -Fix socket accept exhaustion during high TCP traffic. Patch by Kevin Conway. - -.. - -.. bpo: 28174 -.. date: 0113 -.. nonce: CV1UdI -.. section: Library - -Handle when SO_REUSEPORT isn't properly supported. Patch by Seth Michael -Larson. - -.. - -.. bpo: 26654 -.. date: 0112 -.. nonce: XtzTE9 -.. section: Library - -Inspect functools.partial in asyncio.Handle.__repr__. Patch by iceboy. - -.. - -.. bpo: 26909 -.. date: 0111 -.. nonce: ASiakT -.. section: Library - -Fix slow pipes IO in asyncio. Patch by INADA Naoki. - -.. - -.. bpo: 28176 -.. date: 0110 -.. nonce: sU8R6L -.. section: Library - -Fix callbacks race in asyncio.SelectorLoop.sock_connect. - -.. - -.. bpo: 27759 -.. date: 0109 -.. nonce: qpMDGq -.. section: Library - -Fix selectors incorrectly retain invalid file descriptors. Patch by Mark -Williams. - -.. - -.. bpo: 28325 -.. date: 0108 -.. nonce: wAHmnK -.. section: Library - -Remove vestigial MacOS 9 macurl2path module and its tests. - -.. - -.. bpo: 28368 -.. date: 0107 -.. nonce: n594X4 -.. section: Library - -Refuse monitoring processes if the child watcher has no loop attached. Patch -by Vincent Michel. - -.. - -.. bpo: 28369 -.. date: 0106 -.. nonce: 8DTANe -.. section: Library - -Raise RuntimeError when transport's FD is used with add_reader, add_writer, -etc. - -.. - -.. bpo: 28370 -.. date: 0105 -.. nonce: 18jBuZ -.. section: Library - -Speedup asyncio.StreamReader.readexactly. Patch by Коренберг Марк. - -.. - -.. bpo: 28371 -.. date: 0104 -.. nonce: U9Zqdk -.. section: Library - -Deprecate passing asyncio.Handles to run_in_executor. - -.. - -.. bpo: 28372 -.. date: 0103 -.. nonce: njcIPk -.. section: Library - -Fix asyncio to support formatting of non-python coroutines. - -.. - -.. bpo: 28399 -.. date: 0102 -.. nonce: QKIqRX -.. section: Library - -Remove UNIX socket from FS before binding. Patch by Коренберг Марк. - -.. - -.. bpo: 27972 -.. date: 0101 -.. nonce: ZK-GFm -.. section: Library - -Prohibit Tasks to await on themselves. - -.. - -.. bpo: 24142 -.. date: 0100 -.. nonce: IrZnFs -.. section: Library - -Reading a corrupt config file left configparser in an invalid state. -Original patch by Florian Höch. - -.. - -.. bpo: 29581 -.. date: 0099 -.. nonce: gHCrxP -.. section: Library - -ABCMeta.__new__ now accepts ``**kwargs``, allowing abstract base classes to -use keyword parameters in __init_subclass__. Patch by Nate Soares. - -.. - -.. bpo: 25532 -.. date: 0098 -.. nonce: ey4Yez -.. section: Library - -inspect.unwrap() will now only try to unwrap an object -sys.getrecursionlimit() times, to protect against objects which create a new -object on every attribute access. - -.. - -.. bpo: 30177 -.. date: 0097 -.. nonce: JGIJNL -.. section: Library - -path.resolve(strict=False) no longer cuts the path after the first element -not present in the filesystem. Patch by Antoine Pietri. - -.. - -.. bpo: 31294 -.. date: 2017-09-07-20-49-09 -.. nonce: WgI18w -.. section: Documentation - -Fix incomplete code snippet in the ZeroMQSocketListener and -ZeroMQSocketHandler examples and adapt them to Python 3. - -.. - -.. bpo: 21649 -.. date: 2017-09-06-10-11-57 -.. nonce: EUvqA9 -.. section: Documentation - -Add RFC 7525 and Mozilla server side TLS links to SSL documentation. - -.. - -.. bpo: 31128 -.. date: 2017-08-31 -.. nonce: uoa3cr -.. section: Documentation - -Allow the pydoc server to bind to arbitrary hostnames. - -.. - -.. bpo: 30803 -.. date: 2017-07-29-14-55-50 -.. nonce: 6hutqQ -.. section: Documentation - -Clarify doc on truth value testing. Original patch by Peter Thomassen. - -.. - -.. bpo: 30176 -.. date: 0060 -.. nonce: VivmCg -.. section: Documentation - -Add missing attribute related constants in curses documentation. - -.. - -.. bpo: 30052 -.. date: 0059 -.. nonce: TpmpaF -.. section: Documentation - -the link targets for :func:`bytes` and :func:`bytearray` are now their -respective type definitions, rather than the corresponding builtin function -entries. Use :ref:`bytes ` and :ref:`bytearray ` -to reference the latter. -In order to ensure this and future cross-reference updates are applied -automatically, the daily documentation builds now disable the default output -caching features in Sphinx. - -.. - -.. bpo: 26985 -.. date: 0058 -.. nonce: NB5_9S -.. section: Documentation - -Add missing info of code object in inspect documentation. - -.. - -.. bpo: 19824 -.. date: 0057 -.. nonce: We9an6 -.. section: Documentation - -Improve the documentation for, and links to, template strings by emphasizing -their utility for internationalization, and by clarifying some usage -constraints. (See also: bpo-20314, bpo-12518) - -.. - -.. bpo: 28929 -.. date: 0056 -.. nonce: Md7kb0 -.. section: Documentation - -Link the documentation to its source file on GitHub. - -.. - -.. bpo: 25008 -.. date: 0055 -.. nonce: CeIzyU -.. section: Documentation - -Document smtpd.py as effectively deprecated and add a pointer to aiosmtpd, a -third-party asyncio-based replacement. - -.. - -.. bpo: 26355 -.. date: 0054 -.. nonce: SDq_8Y -.. section: Documentation - -Add canonical header link on each page to corresponding major version of the -documentation. Patch by Matthias Bussonnier. - -.. - -.. bpo: 29349 -.. date: 0053 -.. nonce: PjSo-t -.. section: Documentation - -Fix Python 2 syntax in code for building the documentation. - -.. - -.. bpo: 23722 -.. date: 0052 -.. nonce: nFjY3C -.. section: Documentation - -The data model reference and the porting section in the 3.6 What's New guide -now cover the additional ``__classcell__`` handling needed for custom -metaclasses to fully support :pep:`487` and zero-argument ``super()``. - -.. - -.. bpo: 28513 -.. date: 0051 -.. nonce: L3joAz -.. section: Documentation - -Documented command-line interface of zipfile. - -.. - -.. bpo: 29639 -.. date: 2017-09-08-15-59-07 -.. nonce: yIZecp -.. section: Tests - -test.support.HOST is now "localhost", a new HOSTv4 constant has been added -for your ``127.0.0.1`` needs, similar to the existing HOSTv6 constant. - -.. - -.. bpo: 31320 -.. date: 2017-09-05-14-23-35 -.. nonce: JRDHx7 -.. section: Tests - -Silence traceback in test_ssl - -.. - -.. bpo: 31346 -.. date: 2017-09-04-16-21-18 -.. nonce: xni1VR -.. section: Tests - -Prefer PROTOCOL_TLS_CLIENT and PROTOCOL_TLS_SERVER protocols for SSLContext. - -.. - -.. bpo: 25674 -.. date: 2017-09-04-13-03-55 -.. nonce: whVTXh -.. section: Tests - -Remove sha256.tbs-internet.com ssl test - -.. - -.. bpo: 30715 -.. date: 2017-07-25-15-27-44 -.. nonce: Sp7bTF -.. section: Tests - -Address ALPN callback changes for OpenSSL 1.1.0f. The latest version behaves -like OpenSSL 1.0.2 and no longer aborts handshake. - -.. - -.. bpo: 30822 -.. date: 2017-07-20-14-29-54 -.. nonce: X0wREo -.. section: Tests - -regrtest: Exclude tzdata from regrtest --all. When running the test suite -using --use=all / -u all, exclude tzdata since it makes test_datetime too -slow (15-20 min on some buildbots) which then times out on some buildbots. -Fix also regrtest command line parser to allow passing -u extralargefile to -run test_zipfile64. - -.. - -.. bpo: 30695 -.. date: 2017-06-30-11-20-20 -.. nonce: lo7FQX -.. section: Tests - -Add the `set_nomemory(start, stop)` and `remove_mem_hooks()` functions to -the _testcapi module. - -.. - -.. bpo: 30357 -.. date: 0012 -.. nonce: n4CPEa -.. section: Tests - -test_thread: setUp() now uses support.threading_setup() and -support.threading_cleanup() to wait until threads complete to avoid random -side effects on following tests. Initial patch written by Grzegorz Grzywacz. - -.. - -.. bpo: 30197 -.. date: 0011 -.. nonce: c5wRfu -.. section: Tests - -Enhanced functions swap_attr() and swap_item() in the test.support module. -They now work when delete replaced attribute or item inside the with -statement. The old value of the attribute or item (or None if it doesn't -exist) now will be assigned to the target of the "as" clause, if there is -one. - -.. - -.. bpo: 24932 -.. date: 0010 -.. nonce: XLTzvR -.. section: Tests - -Use proper command line parsing in _testembed - -.. - -.. bpo: 28950 -.. date: 0009 -.. nonce: 1W8Glo -.. section: Tests - -Disallow -j0 to be combined with -T/-l in regrtest command line arguments. - -.. - -.. bpo: 28683 -.. date: 0008 -.. nonce: Fp-Hdq -.. section: Tests - -Fix the tests that bind() a unix socket and raise PermissionError on Android -for a non-root user. - -.. - -.. bpo: 26936 -.. date: 0007 -.. nonce: XSZSVS -.. section: Tests - -Fix the test_socket failures on Android - getservbyname(), getservbyport() -and getaddrinfo() are broken on some Android API levels. - -.. - -.. bpo: 28666 -.. date: 0006 -.. nonce: RtTk-4 -.. section: Tests - -Now test.support.rmtree is able to remove unwritable or unreadable -directories. - -.. - -.. bpo: 23839 -.. date: 0005 -.. nonce: zsT_L9 -.. section: Tests - -Various caches now are cleared before running every test file. - -.. - -.. bpo: 26944 -.. date: 0004 -.. nonce: ChZ_BO -.. section: Tests - -Fix test_posix for Android where 'id -G' is entirely wrong or missing the -effective gid. - -.. - -.. bpo: 28409 -.. date: 0003 -.. nonce: Q2IlxJ -.. section: Tests - -regrtest: fix the parser of command line arguments. - -.. - -.. bpo: 28217 -.. date: 0002 -.. nonce: Y37OKV -.. section: Tests - -Adds _testconsole module to test console input. - -.. - -.. bpo: 26939 -.. date: 0001 -.. nonce: 7j_W5R -.. section: Tests - -Add the support.setswitchinterval() function to fix test_functools hanging -on the Android armv7 qemu emulator. - -.. - -.. bpo: 31354 -.. date: 2017-09-08-11-48-11 -.. nonce: 4f-VJK -.. section: Build - -Allow --with-lto to be used on all builds, not just `make profile-opt`. - -.. - -.. bpo: 31370 -.. date: 2017-09-06-23-14-08 -.. nonce: -j4kN4 -.. section: Build - -Remove support for building --without-threads. -This option is not really useful anymore in the 21st century. Removing lots -of conditional paths allows us to simplify the code base, including in -difficult to maintain low-level internal code. - -.. - -.. bpo: 31341 -.. date: 2017-09-04-14-43-46 -.. nonce: XLuZFk -.. section: Build - -Per :pep:`11`, support for the IRIX operating system was removed. - -.. - -.. bpo: 30854 -.. date: 2017-07-05-16-54-59 -.. nonce: sPADRI -.. section: Build - -Fix compile error when compiling --without-threads. Patch by Masayuki -Yamamoto. - -.. - -.. bpo: 30687 -.. date: 0050 -.. nonce: 8mqHnu -.. section: Build - -Locate msbuild.exe on Windows when building rather than vcvarsall.bat - -.. - -.. bpo: 20210 -.. date: 0049 -.. nonce: MN_n-r -.. section: Build - -Support the *disabled* marker in Setup files. Extension modules listed after -this marker are not built at all, neither by the Makefile nor by setup.py. - -.. - -.. bpo: 29941 -.. date: 0048 -.. nonce: ylh45A -.. section: Build - -Add ``--with-assertions`` configure flag to explicitly enable C ``assert()`` -checks. Defaults to off. ``--with-pydebug`` implies ``--with-assertions``. - -.. - -.. bpo: 28787 -.. date: 0047 -.. nonce: vhH_6a -.. section: Build - -Fix out-of-tree builds of Python when configured with ``--with--dtrace``. - -.. - -.. bpo: 29243 -.. date: 0046 -.. nonce: WDK4hT -.. section: Build - -Prevent unnecessary rebuilding of Python during ``make test``, ``make -install`` and some other make targets when configured with -``--enable-optimizations``. - -.. - -.. bpo: 23404 -.. date: 0045 -.. nonce: PdYVWg -.. section: Build - -Don't regenerate generated files based on file modification time anymore: -the action is now explicit. Replace ``make touch`` with ``make regen-all``. - -.. - -.. bpo: 29643 -.. date: 0044 -.. nonce: 4WLIJQ -.. section: Build - -Fix ``--enable-optimization`` didn't work. - -.. - -.. bpo: 27593 -.. date: 0043 -.. nonce: v87xEr -.. section: Build - -sys.version and the platform module python_build(), python_branch(), and -python_revision() functions now use git information rather than hg when -building from a repo. - -.. - -.. bpo: 29572 -.. date: 0042 -.. nonce: iZ1XKK -.. section: Build - -Update Windows build and OS X installers to use OpenSSL 1.0.2k. - -.. - -.. bpo: 27659 -.. date: 0041 -.. nonce: i8UzRC -.. section: Build - -Prohibit implicit C function declarations: use -``-Werror=implicit-function-declaration`` when possible (GCC and Clang, -but it depends on the compiler version). Patch written by Chi Hsuan Yen. - -.. - -.. bpo: 29384 -.. date: 0040 -.. nonce: v3IqBE -.. section: Build - -Remove old Be OS helper scripts. - -.. - -.. bpo: 26851 -.. date: 0039 -.. nonce: R5243g -.. section: Build - -Set Android compilation and link flags. - -.. - -.. bpo: 28768 -.. date: 0038 -.. nonce: b9_a6E -.. section: Build - -Fix implicit declaration of function _setmode. Patch by Masayuki Yamamoto - -.. - -.. bpo: 29080 -.. date: 0037 -.. nonce: b3qLQT -.. section: Build - -Removes hard dependency on hg.exe from PCBuild/build.bat - -.. - -.. bpo: 23903 -.. date: 0036 -.. nonce: JXJ889 -.. section: Build - -Added missed names to PC/python3.def. - -.. - -.. bpo: 28762 -.. date: 0035 -.. nonce: Ru0YN_ -.. section: Build - -lockf() is available on Android API level 24, but the F_LOCK macro is not -defined in android-ndk-r13. - -.. - -.. bpo: 28538 -.. date: 0034 -.. nonce: FqtN7v -.. section: Build - -Fix the compilation error that occurs because if_nameindex() is available on -Android API level 24, but the if_nameindex structure is not defined. - -.. - -.. bpo: 20211 -.. date: 0033 -.. nonce: gpNptI -.. section: Build - -Do not add the directory for installing C header files and the directory for -installing object code libraries to the cross compilation search paths. -Original patch by Thomas Petazzoni. - -.. - -.. bpo: 28849 -.. date: 0032 -.. nonce: AzRRF5 -.. section: Build - -Do not define sys.implementation._multiarch on Android. - -.. - -.. bpo: 10656 -.. date: 0031 -.. nonce: pR8FFU -.. section: Build - -Fix out-of-tree building on AIX. Patch by Tristan Carel and Michael -Haubenwallner. - -.. - -.. bpo: 26359 -.. date: 0030 -.. nonce: CLz6qy -.. section: Build - -Rename --with-optimiations to --enable-optimizations. - -.. - -.. bpo: 28444 -.. date: 0029 -.. nonce: zkc9nT -.. section: Build - -Fix missing extensions modules when cross compiling. - -.. - -.. bpo: 28208 -.. date: 0028 -.. nonce: DtoP1i -.. section: Build - -Update Windows build and OS X installers to use SQLite 3.14.2. - -.. - -.. bpo: 28248 -.. date: 0027 -.. nonce: KY_-en -.. section: Build - -Update Windows build and OS X installers to use OpenSSL 1.0.2j. - -.. - -.. bpo: 21124 -.. date: 0026 -.. nonce: 1bbArU -.. section: Build - -Fix building the _struct module on Cygwin by passing ``NULL`` instead of -``&PyType_Type`` to PyVarObject_HEAD_INIT. Patch by Masayuki Yamamoto. - -.. - -.. bpo: 13756 -.. date: 0025 -.. nonce: sslhpC -.. section: Build - -Fix building extensions modules on Cygwin. Patch by Roumen Petrov, based on -original patch by Jason Tishler. - -.. - -.. bpo: 21085 -.. date: 0024 -.. nonce: 2VvyUF -.. section: Build - -Add configure check for siginfo_t.si_band, which Cygwin does not provide. -Patch by Masayuki Yamamoto with review and rebase by Erik Bray. - -.. - -.. bpo: 28258 -.. date: 0023 -.. nonce: iKtAHd -.. section: Build - -Fixed build with Estonian locale (python-config and distclean targets in -Makefile). Patch by Arfrever Frehtes Taifersar Arahesis. - -.. - -.. bpo: 26661 -.. date: 0022 -.. nonce: Z_HNbs -.. section: Build - -setup.py now detects system libffi with multiarch wrapper. - -.. - -.. bpo: 27979 -.. date: 0021 -.. nonce: fR0KgM -.. section: Build - -A full copy of libffi is no longer bundled for use when building _ctypes on -non-OSX UNIX platforms. An installed copy of libffi is now required when -building _ctypes on such platforms. - -.. - -.. bpo: 15819 -.. date: 0020 -.. nonce: QVDr3E -.. section: Build - -Remove redundant include search directory option for building outside the -source tree. - -.. - -.. bpo: 28676 -.. date: 0019 -.. nonce: Wxf6Ds -.. section: Build - -Prevent missing 'getentropy' declaration warning on macOS. Patch by Gareth -Rees. - -.. - -.. bpo: 31392 -.. date: 2017-09-07-20-09-04 -.. nonce: h92bWF -.. section: Windows - -Update Windows build to use OpenSSL 1.1.0f - -.. - -.. bpo: 30389 -.. date: 2017-09-06-17-14-54 -.. nonce: 9Dizrx -.. section: Windows - -Adds detection of Visual Studio 2017 to distutils on Windows. - -.. - -.. bpo: 31358 -.. date: 2017-09-05-19-46-52 -.. nonce: n1Fjxc -.. section: Windows - -zlib is no longer bundled in the CPython source, instead it is downloaded on -demand just like bz2, lzma, OpenSSL, Tcl/Tk, and SQLite. - -.. - -.. bpo: 31340 -.. date: 2017-09-04-13-19-05 -.. nonce: MbkzLi -.. section: Windows - -Change to building with MSVC v141 (included with Visual Studio 2017) - -.. - -.. bpo: 30581 -.. date: 2017-08-04-10-05-19 -.. nonce: OQhR7l -.. section: Windows - -os.cpu_count() now returns the correct number of processors on Windows when -the number of logical processors is greater than 64. - -.. - -.. bpo: 30916 -.. date: 2017-07-15-00-40-12 -.. nonce: BpCrro -.. section: Windows - -Pre-build OpenSSL, Tcl and Tk and include the binaries in the build. - -.. - -.. bpo: 30731 -.. date: 2017-07-13-11-22-53 -.. nonce: nmMDwI -.. section: Windows - -Add a missing xmlns to python.manifest so that it matches the schema. - -.. - -.. bpo: 30291 -.. date: 2017-06-28-03-20-48 -.. nonce: zBpOl6 -.. section: Windows - -Allow requiring 64-bit interpreters from py.exe using -64 suffix. -Contributed by Steve (Gadget) Barnes. - -.. - -.. bpo: 30362 -.. date: 2017-06-28-03-08-22 -.. nonce: XxeVMB -.. section: Windows - -Adds list options (-0, -0p) to py.exe launcher. Contributed by Steve Barnes. - -.. - -.. bpo: 23451 -.. date: 2017-06-27-07-04-06 -.. nonce: bl_QOB -.. section: Windows - -Fix socket deprecation warnings in socketmodule.c. Patch by Segev Finer. - -.. - -.. bpo: 30450 -.. date: 0088 -.. nonce: qsaK8y -.. section: Windows - -The build process on Windows no longer depends on Subversion, instead -pulling external code from GitHub via a Python script. If Python 3.6 is not -found on the system (via ``py -3.6``), NuGet is used to download a copy of -32-bit Python. - -.. - -.. bpo: 29579 -.. date: 0087 -.. nonce: 07B-FQ -.. section: Windows - -Removes readme.txt from the installer. - -.. - -.. bpo: 25778 -.. date: 0086 -.. nonce: 8uKJ82 -.. section: Windows - -winreg does not truncate string correctly (Patch by Eryk Sun) - -.. - -.. bpo: 28896 -.. date: 0085 -.. nonce: qOcBBL -.. section: Windows - -Deprecate WindowsRegistryFinder and disable it by default - -.. - -.. bpo: 28522 -.. date: 0084 -.. nonce: XHMQa7 -.. section: Windows - -Fixes mishandled buffer reallocation in getpathp.c - -.. - -.. bpo: 28402 -.. date: 0083 -.. nonce: v9zETJ -.. section: Windows - -Adds signed catalog files for stdlib on Windows. - -.. - -.. bpo: 28333 -.. date: 0082 -.. nonce: KnpeO4 -.. section: Windows - -Enables Unicode for ps1/ps2 and input() prompts. (Patch by Eryk Sun) - -.. - -.. bpo: 28251 -.. date: 0081 -.. nonce: tR_AFs -.. section: Windows - -Improvements to help manuals on Windows. - -.. - -.. bpo: 28110 -.. date: 0080 -.. nonce: cnkP5F -.. section: Windows - -launcher.msi has different product codes between 32-bit and 64-bit - -.. - -.. bpo: 28161 -.. date: 0079 -.. nonce: hF91LI -.. section: Windows - -Opening CON for write access fails - -.. - -.. bpo: 28162 -.. date: 0078 -.. nonce: 3FHPVD -.. section: Windows - -WindowsConsoleIO readall() fails if first line starts with Ctrl+Z - -.. - -.. bpo: 28163 -.. date: 0077 -.. nonce: -DUgJw -.. section: Windows - -WindowsConsoleIO fileno() passes wrong flags to _open_osfhandle - -.. - -.. bpo: 28164 -.. date: 0076 -.. nonce: 5MfN0J -.. section: Windows - -_PyIO_get_console_type fails for various paths - -.. - -.. bpo: 28137 -.. date: 0075 -.. nonce: C1uvzY -.. section: Windows - -Renames Windows path file to ._pth - -.. - -.. bpo: 28138 -.. date: 0074 -.. nonce: pNdv64 -.. section: Windows - -Windows ._pth file should allow import site - -.. - -.. bpo: 31493 -.. date: 2017-09-16-23-43-39 -.. nonce: nmHMCR -.. section: IDLE - -IDLE code context -- fix code update and font update timers. -Canceling timers prevents a warning message when test_idle completes. - -.. - -.. bpo: 31488 -.. date: 2017-09-16-01-21-20 -.. nonce: 0rtXIT -.. section: IDLE - -IDLE - Update non-key options in former extension classes. When applying -configdialog changes, call .reload for each feature class. Change ParenMatch -so updated options affect existing instances attached to existing editor -windows. - -.. - -.. bpo: 31477 -.. date: 2017-09-15-12-38-47 -.. nonce: n__6sa -.. section: IDLE - -IDLE - Improve rstrip entry in doc. Strip trailing whitespace strips more -than blank spaces. Multiline string literals are not skipped. - -.. - -.. bpo: 31480 -.. date: 2017-09-14-17-53-53 -.. nonce: 4WJ0pl -.. section: IDLE - -IDLE - make tests pass with zzdummy extension disabled by default. - -.. - -.. bpo: 31421 -.. date: 2017-09-12-08-38-27 -.. nonce: mYfQNq -.. section: IDLE - -Document how IDLE runs tkinter programs. IDLE calls tcl/tk update in the -background in order to make live -interaction and experimentation with tkinter applications much easier. - -.. - -.. bpo: 31414 -.. date: 2017-09-11-15-46-05 -.. nonce: wiepgK -.. section: IDLE - -IDLE -- fix tk entry box tests by deleting first. Adding to an int entry is -not the same as deleting and inserting because int('') will fail. - -.. - -.. bpo: 31051 -.. date: 2017-08-30-00-06-58 -.. nonce: 50Jp_Q -.. section: IDLE - -Rearrange IDLE configdialog GenPage into Window, Editor, and Help sections. - -.. - -.. bpo: 30617 -.. date: 2017-08-27-16-49-36 -.. nonce: UHnswr -.. section: IDLE - -IDLE - Add docstrings and tests for outwin subclass of editor. -Move some data and functions from the class to module level. Patch by Cheryl -Sabella. - -.. - -.. bpo: 31287 -.. date: 2017-08-27-15-31-33 -.. nonce: aZERfI -.. section: IDLE - -IDLE - Do not modify tkinter.message in test_configdialog. - -.. - -.. bpo: 27099 -.. date: 2017-08-24-13-48-16 -.. nonce: rENefC -.. section: IDLE - -Convert IDLE's built-in 'extensions' to regular features. -About 10 IDLE features were implemented as supposedly optional extensions. -Their different behavior could be confusing or worse for users and not good -for maintenance. Hence the conversion. -The main difference for users is that user configurable key bindings for -builtin features are now handled uniformly. Now, editing a binding in a -keyset only affects its value in the keyset. All bindings are defined -together in the system-specific default keysets in config-extensions.def. -All custom keysets are saved as a whole in config-extension.cfg. All take -effect as soon as one clicks Apply or Ok. -The affected events are '<>', '<>', -'<>', '<>', '<>', -'<>', '<>', and '<>'. Any (global) -customizations made before 3.6.3 will not affect their keyset-specific -customization after 3.6.3. and vice versa. -Initial patch by Charles Wohlganger. - -.. - -.. bpo: 31206 -.. date: 2017-08-18-14-13-42 -.. nonce: F1-tKK -.. section: IDLE - -IDLE: Factor HighPage(Frame) class from ConfigDialog. Patch by Cheryl -Sabella. - -.. - -.. bpo: 31001 -.. date: 2017-08-17-15-00-20 -.. nonce: KLxYHC -.. section: IDLE - -Add tests for configdialog highlight tab. Patch by Cheryl Sabella. - -.. - -.. bpo: 31205 -.. date: 2017-08-15-12-58-23 -.. nonce: iuziZ5 -.. section: IDLE - -IDLE: Factor KeysPage(Frame) class from ConfigDialog. The slightly modified -tests continue to pass. Patch by Cheryl Sabella. - -.. - -.. bpo: 31130 -.. date: 2017-08-07-14-02-56 -.. nonce: FbsC7f -.. section: IDLE - -IDLE -- stop leaks in test_configdialog. Initial patch by Victor Stinner. - -.. - -.. bpo: 31002 -.. date: 2017-08-03-17-54-02 -.. nonce: kUSgTE -.. section: IDLE - -Add tests for configdialog keys tab. Patch by Cheryl Sabella. - -.. - -.. bpo: 19903 -.. date: 2017-08-03-14-08-42 -.. nonce: sqE1FS -.. section: IDLE - -IDLE: Calltips use `inspect.signature` instead of `inspect.getfullargspec`. -This improves calltips for builtins converted to use Argument Clinic. Patch -by Louie Lu. - -.. - -.. bpo: 31083 -.. date: 2017-07-31-23-20-51 -.. nonce: 991FXm -.. section: IDLE - -IDLE - Add an outline of a TabPage class in configdialog. Update existing -classes to match outline. Initial patch by Cheryl Sabella. - -.. - -.. bpo: 31050 -.. date: 2017-07-30-17-39-59 -.. nonce: AXR3kP -.. section: IDLE - -Factor GenPage(Frame) class from ConfigDialog. The slightly modified tests -continue to pass. Patch by Cheryl Sabella. - -.. - -.. bpo: 31004 -.. date: 2017-07-30-01-00-58 -.. nonce: m8cc1t -.. section: IDLE - -IDLE - Factor FontPage(Frame) class from ConfigDialog. -Slightly modified tests continue to pass. Fix General tests. Patch mostly by -Cheryl Sabella. - -.. - -.. bpo: 30781 -.. date: 2017-07-28-18-59-06 -.. nonce: ud5m18 -.. section: IDLE - -IDLE - Use ttk widgets in ConfigDialog. Patches by Terry Jan Reedy and -Cheryl Sabella. - -.. - -.. bpo: 31060 -.. date: 2017-07-27-14-48-42 -.. nonce: GdY_VY -.. section: IDLE - -IDLE - Finish rearranging methods of ConfigDialog Grouping methods -pertaining to each tab and the buttons will aid writing tests and improving -the tabs and will enable splitting the groups into classes. - -.. - -.. bpo: 30853 -.. date: 2017-07-27-10-01-14 -.. nonce: enPvvc -.. section: IDLE - -IDLE -- Factor a VarTrace class out of ConfigDialog. -Instance tracers manages pairs consisting of a tk variable and a callback -function. When tracing is turned on, setting the variable calls the -function. Test coverage for the new class is 100%. - -.. - -.. bpo: 31003 -.. date: 2017-07-25-01-28-35 -.. nonce: bYINVH -.. section: IDLE - -IDLE: Add more tests for General tab. - -.. - -.. bpo: 30993 -.. date: 2017-07-22-18-08-41 -.. nonce: 34vJkB -.. section: IDLE - -IDLE - Improve configdialog font page and tests. -In configdialog: Document causal pathways in create_font_tab docstring. -Simplify some attribute names. Move set_samples calls to var_changed_font -(idea from Cheryl Sabella). Move related functions to positions after the -create widgets function. -In test_configdialog: Fix test_font_set so not order dependent. Fix renamed -test_indent_scale so it tests the widget. Adjust tests for movement of -set_samples call. Add tests for load functions. Put all font tests in one -class and tab indent tests in another. Except for two lines, these tests -completely cover the related functions. - -.. - -.. bpo: 30981 -.. date: 2017-07-21-01-55-14 -.. nonce: ZFvQPt -.. section: IDLE - -IDLE -- Add more configdialog font page tests. - -.. - -.. bpo: 28523 -.. date: 2017-07-21-00-54-52 -.. nonce: OPcqYJ -.. section: IDLE - -IDLE: replace 'colour' with 'color' in configdialog. - -.. - -.. bpo: 30917 -.. date: 2017-07-17-23-35-57 -.. nonce: hSiuuO -.. section: IDLE - -Add tests for idlelib.config.IdleConf. Increase coverage from 46% to 96%. -Patch by Louie Lu. - -.. - -.. bpo: 30934 -.. date: 2017-07-15-22-26-57 -.. nonce: BanuSB -.. section: IDLE - -Document coverage details for idlelib tests. -Add section to idlelib/idle-test/README.txt. -Include check that branches are taken both ways. -Exclude IDLE-specific code that does not run during unit tests. - -.. - -.. bpo: 30913 -.. date: 2017-07-13-23-07-33 -.. nonce: aezn_e -.. section: IDLE - -IDLE: Document ConfigDialog tk Vars, methods, and widgets in docstrings This -will facilitate improving the dialog and splitting up the class. Original -patch by Cheryl Sabella. - -.. - -.. bpo: 30899 -.. date: 2017-07-11-02-26-17 -.. nonce: SQmVO8 -.. section: IDLE - -IDLE: Add tests for ConfigParser subclasses in config. Patch by Louie Lu. - -.. - -.. bpo: 30881 -.. date: 2017-07-11-02-21-42 -.. nonce: 4KAq_9 -.. section: IDLE - -IDLE: Add docstrings to browser.py. Patch by Cheryl Sabella. - -.. - -.. bpo: 30851 -.. date: 2017-07-09-23-53-00 -.. nonce: AHXBYa -.. section: IDLE - -IDLE: Remove unused variables in configdialog. One is a duplicate, one is -set but cannot be altered by users. Patch by Cheryl Sabella. - -.. - -.. bpo: 30870 -.. date: 2017-07-08-17-57-04 -.. nonce: IcR2pf -.. section: IDLE - -IDLE: In Settings dialog, select font with Up, Down keys as well as mouse. -Initial patch by Louie Lu. - -.. - -.. bpo: 8231 -.. date: 2017-07-07-21-10-55 -.. nonce: yEge3L -.. section: IDLE - -IDLE: call config.IdleConf.GetUserCfgDir only once. - -.. - -.. bpo: 30779 -.. date: 2017-07-07-20-26-37 -.. nonce: 8KXEXN -.. section: IDLE - -IDLE: Factor ConfigChanges class from configdialog, put in config; test. * -In config, put dump test code in a function; run it and unittest in 'if -__name__ == '__main__'. * Add class config.ConfigChanges based on -changes_class_v4.py on bpo issue. * Add class test_config.ChangesTest, -partly using configdialog_tests_v1.py. * Revise configdialog to use -ConfigChanges; see tracker msg297804. * Revise test_configdialog to match -configdialog changes. * Remove configdialog functions unused or moved to -ConfigChanges. Cheryl Sabella contributed parts of the patch. - -.. - -.. bpo: 30777 -.. date: 2017-07-04-22-45-46 -.. nonce: uxzlMB -.. section: IDLE - -IDLE: configdialog - Add docstrings and fix comments. Patch by Cheryl -Sabella. - -.. - -.. bpo: 30495 -.. date: 2017-06-29-18-23-06 -.. nonce: qIWgc4 -.. section: IDLE - -IDLE: Improve textview with docstrings, PEP8 names, and more tests. Patch by -Cheryl Sabella. - -.. - -.. bpo: 30723 -.. date: 2017-06-27-19-05-40 -.. nonce: rQh06y -.. section: IDLE - -IDLE: Make several improvements to parenmatch. Add 'parens' style to -highlight both opener and closer. Make 'default' style, which is not -default, a synonym for 'opener'. Make time-delay work the same with all -styles. Add help for config dialog extensions tab, including help for -parenmatch. Add new tests. Original patch by Charles Wohlganger. - -.. - -.. bpo: 30674 -.. date: 2017-06-27-01-40-34 -.. nonce: ppK_q8 -.. section: IDLE - -IDLE: add docstrings to grep module. Patch by Cheryl Sabella - -.. - -.. bpo: 21519 -.. date: 2017-06-27-00-29-56 -.. nonce: fTj9T0 -.. section: IDLE - -IDLE's basic custom key entry dialog now detects duplicates properly. -Original patch by Saimadhav Heblikar. - -.. - -.. bpo: 29910 -.. date: 2017-06-26-22-45-27 -.. nonce: mqHh7u -.. section: IDLE - -IDLE no longer deletes a character after commenting out a region by a key -shortcut. Add ``return 'break'`` for this and other potential conflicts -between IDLE and default key bindings. - -.. - -.. bpo: 30728 -.. date: 2017-06-26-15-47-13 -.. nonce: qH4TGL -.. section: IDLE - -Review and change idlelib.configdialog names. Lowercase method and attribute -names. Replace 'colour' with 'color', expand overly cryptic names, delete -unneeded underscores. Replace ``import *`` with specific imports. Patches by -Cheryl Sabella. - -.. - -.. bpo: 6739 -.. date: 2017-06-26-00-28-59 -.. nonce: x5MfhB -.. section: IDLE - -IDLE: Verify user-entered key sequences by trying to bind them with tk. Add -tests for all 3 validation functions. Original patch by G Polo. Tests added -by Cheryl Sabella. - -.. - -.. bpo: 15786 -.. date: 0096 -.. nonce: _XRbaR -.. section: IDLE - -Fix several problems with IDLE's autocompletion box. The following should -now work: clicking on selection box items; using the scrollbar; selecting an -item by hitting Return. Hangs on MacOSX should no longer happen. Patch by -Louie Lu. - -.. - -.. bpo: 25514 -.. date: 0095 -.. nonce: 882pXa -.. section: IDLE - -Add doc subsubsection about IDLE failure to start. Popup no-connection -message directs users to this section. - -.. - -.. bpo: 30642 -.. date: 0094 -.. nonce: 3Zujzt -.. section: IDLE - -Fix reference leaks in IDLE tests. Patches by Louie Lu and Terry Jan Reedy. - -.. - -.. bpo: 30495 -.. date: 0093 -.. nonce: I3i5vL -.. section: IDLE - -Add docstrings for textview.py and use PEP8 names. Patches by Cheryl Sabella -and Terry Jan Reedy. - -.. - -.. bpo: 30290 -.. date: 0092 -.. nonce: fZ3kod -.. section: IDLE - -Help-about: use pep8 names and add tests. Increase coverage to 100%. Patches -by Louie Lu, Cheryl Sabella, and Terry Jan Reedy. - -.. - -.. bpo: 30303 -.. date: 0091 -.. nonce: 2L2F-4 -.. section: IDLE - -Add _utest option to textview; add new tests. Increase coverage to 100%. -Patches by Louie Lu and Terry Jan Reedy. - -.. - -.. bpo: 29071 -.. date: 0090 -.. nonce: FCOpJn -.. section: IDLE - -IDLE colors f-string prefixes (but not invalid ur prefixes). - -.. - -.. bpo: 28572 -.. date: 0089 -.. nonce: 1_duKY -.. section: IDLE - -Add 10% to coverage of IDLE's test_configdialog. Update and augment -description of the configuration system. - -.. - -.. bpo: 30983 -.. date: 2017-08-18-17-19-23 -.. nonce: ggGz9z -.. section: Tools/Demos - -gdb integration commands (py-bt, etc.) work on optimized shared builds now, -too. :pep:`523` introduced _PyEval_EvalFrameDefault which inlines -PyEval_EvalFrameEx on non-debug shared builds. This broke the ability to -use py-bt, py-up, and a few other Python-specific gdb integrations. The -problem is fixed by only looking for _PyEval_EvalFrameDefault frames in -python-gdb.py. Original patch by Bruno "Polaco" Penteado. - -.. - -.. bpo: 29748 -.. date: 0018 -.. nonce: 6pV6s9 -.. section: Tools/Demos - -Added the slice index converter in Argument Clinic. - -.. - -.. bpo: 24037 -.. date: 0017 -.. nonce: KPFC7o -.. section: Tools/Demos - -Argument Clinic now uses the converter `bool(accept={int})` rather than -`int` for semantical booleans. This avoids repeating the default value for -Python and C and will help in converting to `bool` in future. - -.. - -.. bpo: 29367 -.. date: 0016 -.. nonce: 4dOKL0 -.. section: Tools/Demos - -python-gdb.py now supports also ``method-wrapper`` (``wrapperobject``) -objects. - -.. - -.. bpo: 28023 -.. date: 0015 -.. nonce: 4gzSGp -.. section: Tools/Demos - -Fix python-gdb.py didn't support new dict implementation. - -.. - -.. bpo: 15369 -.. date: 0014 -.. nonce: bdZ3n- -.. section: Tools/Demos - -The pybench and pystone microbenchmark have been removed from Tools. Please -use the new Python benchmark suite https://github.com/python/performance -which is more reliable and includes a portable version of pybench working on -Python 2 and Python 3. - -.. - -.. bpo: 28102 -.. date: 0013 -.. nonce: 5fKaek -.. section: Tools/Demos - -The zipfile module CLI now prints usage to stderr. Patch by Stephen J. -Turnbull. - -.. - -.. bpo: 31338 -.. date: 2017-09-05-17-51-12 -.. nonce: LjA43Y -.. section: C API - -Added the ``Py_UNREACHABLE()`` macro for code paths which are never expected -to be reached. This and a few other useful macros are now documented in the -C API manual. - -.. - -.. bpo: 30832 -.. date: 2017-07-03-17-25-40 -.. nonce: PcTAEP -.. section: C API - -Remove own implementation for thread-local storage. -CPython has provided the own implementation for thread-local storage (TLS) -on Python/thread.c, it's used in the case which a platform has not supplied -native TLS. However, currently all supported platforms (Windows and -pthreads) have provided native TLS and defined the Py_HAVE_NATIVE_TLS macro -with unconditional in any case. - -.. - -.. bpo: 30708 -.. date: 0073 -.. nonce: np-l1j -.. section: C API - -PyUnicode_AsWideCharString() now raises a ValueError if the second argument -is NULL and the wchar_t\* string contains null characters. - -.. - -.. bpo: 16500 -.. date: 0072 -.. nonce: lRpooa -.. section: C API - -Deprecate PyOS_AfterFork() and add PyOS_BeforeFork(), -PyOS_AfterFork_Parent() and PyOS_AfterFork_Child(). - -.. - -.. bpo: 6532 -.. date: 0071 -.. nonce: qcH6k1 -.. section: C API - -The type of results of PyThread_start_new_thread() and -PyThread_get_thread_ident(), and the id parameter of -PyThreadState_SetAsyncExc() changed from "long" to "unsigned long". - -.. - -.. bpo: 27867 -.. date: 0070 -.. nonce: J-8CGo -.. section: C API - -Function PySlice_GetIndicesEx() is deprecated and replaced with a macro if -Py_LIMITED_API is not set or set to the value between 0x03050400 and -0x03060000 (not including) or 0x03060100 or higher. Added functions -PySlice_Unpack() and PySlice_AdjustIndices(). - -.. - -.. bpo: 29083 -.. date: 0069 -.. nonce: tGTjr_ -.. section: C API - -Fixed the declaration of some public API functions. PyArg_VaParse() and -PyArg_VaParseTupleAndKeywords() were not available in limited API. -PyArg_ValidateKeywordArguments(), PyArg_UnpackTuple() and Py_BuildValue() -were not available in limited API of version < 3.3 when PY_SSIZE_T_CLEAN is -defined. - -.. - -.. bpo: 28769 -.. date: 0068 -.. nonce: Ecmtn8 -.. section: C API - -The result of PyUnicode_AsUTF8AndSize() and PyUnicode_AsUTF8() is now of -type ``const char *`` rather of ``char *``. - -.. - -.. bpo: 29058 -.. date: 0067 -.. nonce: 0wNVP8 -.. section: C API - -All stable API extensions added after Python 3.2 are now available only when -Py_LIMITED_API is set to the PY_VERSION_HEX value of the minimum Python -version supporting this API. - -.. - -.. bpo: 28822 -.. date: 0066 -.. nonce: gMqwvb -.. section: C API - -The index parameters *start* and *end* of PyUnicode_FindChar() are now -adjusted to behave like ``str[start:end]``. - -.. - -.. bpo: 28808 -.. date: 0065 -.. nonce: A03X6r -.. section: C API - -PyUnicode_CompareWithASCIIString() now never raises exceptions. - -.. - -.. bpo: 28761 -.. date: 0064 -.. nonce: iOgCoX -.. section: C API - -The fields name and doc of structures PyMemberDef, PyGetSetDef, -PyStructSequence_Field, PyStructSequence_Desc, and wrapperbase are now of -type ``const char *`` rather of ``char *``. - -.. - -.. bpo: 28748 -.. date: 0063 -.. nonce: AMgb_G -.. section: C API - -Private variable _Py_PackageContext is now of type ``const char *`` rather -of ``char *``. - -.. - -.. bpo: 19569 -.. date: 0062 -.. nonce: IPke0J -.. section: C API - -Compiler warnings are now emitted if use most of deprecated functions. - -.. - -.. bpo: 28426 -.. date: 0061 -.. nonce: zPwvbI -.. section: C API - -Deprecated undocumented functions PyUnicode_AsEncodedObject(), -PyUnicode_AsDecodedObject(), PyUnicode_AsDecodedUnicode() and -PyUnicode_AsEncodedUnicode(). diff --git a/Misc/NEWS.d/3.7.0a2.rst b/Misc/NEWS.d/3.7.0a2.rst deleted file mode 100644 index 0f107d8c5f5a930bd5b1d8017fcd3789e8baf875..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.7.0a2.rst +++ /dev/null @@ -1,683 +0,0 @@ -.. bpo: 31558 -.. date: 2017-10-16-14-27-25 -.. nonce: K-uRRm -.. release date: 2017-10-16 -.. section: Core and Builtins - -``gc.freeze()`` is a new API that allows for moving all objects currently -tracked by the garbage collector to a permanent generation, effectively -removing them from future collection events. This can be used to protect -those objects from having their PyGC_Head mutated. In effect, this enables -great copy-on-write stability at fork(). - -.. - -.. bpo: 31642 -.. date: 2017-10-08-10-00-55 -.. nonce: 1IKqgs -.. section: Core and Builtins - -Restored blocking "from package import module" by setting -sys.modules["package.module"] to None. - -.. - -.. bpo: 31708 -.. date: 2017-10-06-02-10-48 -.. nonce: 66CCVU -.. section: Core and Builtins - -Allow use of asynchronous generator expressions in synchronous functions. - -.. - -.. bpo: 31709 -.. date: 2017-10-06-00-27-04 -.. nonce: _PmU51 -.. section: Core and Builtins - -Drop support of asynchronous __aiter__. - -.. - -.. bpo: 30404 -.. date: 2017-10-03-23-46-39 -.. nonce: _9Yi5u -.. section: Core and Builtins - -The -u option now makes the stdout and stderr streams unbuffered rather than -line-buffered. - -.. - -.. bpo: 31619 -.. date: 2017-09-29-20-32-24 -.. nonce: 6gQ1kv -.. section: Core and Builtins - -Fixed a ValueError when convert a string with large number of underscores to -integer with binary base. - -.. - -.. bpo: 31602 -.. date: 2017-09-27-09-30-03 -.. nonce: MtgLCn -.. section: Core and Builtins - -Fix an assertion failure in `zipimporter.get_source()` in case of a bad -`zlib.decompress()`. Patch by Oren Milman. - -.. - -.. bpo: 31592 -.. date: 2017-09-26-16-05-04 -.. nonce: IFBZj9 -.. section: Core and Builtins - -Fixed an assertion failure in Python parser in case of a bad -`unicodedata.normalize()`. Patch by Oren Milman. - -.. - -.. bpo: 31588 -.. date: 2017-09-26-13-03-16 -.. nonce: wT9Iy7 -.. section: Core and Builtins - -Raise a `TypeError` with a helpful error message when class creation fails -due to a metaclass with a bad ``__prepare__()`` method. Patch by Oren -Milman. - -.. - -.. bpo: 31574 -.. date: 2017-09-25-12-35-48 -.. nonce: 5yX5r5 -.. section: Core and Builtins - -Importlib was instrumented with two dtrace probes to profile import timing. - -.. - -.. bpo: 31566 -.. date: 2017-09-24-09-57-04 -.. nonce: OxwINs -.. section: Core and Builtins - -Fix an assertion failure in `_warnings.warn()` in case of a bad ``__name__`` -global. Patch by Oren Milman. - -.. - -.. bpo: 31506 -.. date: 2017-09-19-10-29-36 -.. nonce: pRVTRB -.. section: Core and Builtins - -Improved the error message logic for object.__new__ and object.__init__. - -.. - -.. bpo: 31505 -.. date: 2017-09-18-12-07-39 -.. nonce: VomaFa -.. section: Core and Builtins - -Fix an assertion failure in `json`, in case `_json.make_encoder()` received -a bad `encoder()` argument. Patch by Oren Milman. - -.. - -.. bpo: 31492 -.. date: 2017-09-16-22-49-16 -.. nonce: RtyteL -.. section: Core and Builtins - -Fix assertion failures in case of failing to import from a module with a bad -``__name__`` attribute, and in case of failing to access an attribute of -such a module. Patch by Oren Milman. - -.. - -.. bpo: 31478 -.. date: 2017-09-15-09-13-07 -.. nonce: o06iKD -.. section: Core and Builtins - -Fix an assertion failure in `_random.Random.seed()` in case the argument has -a bad ``__abs__()`` method. Patch by Oren Milman. - -.. - -.. bpo: 31336 -.. date: 2017-09-13-12-04-23 -.. nonce: gi2ahY -.. section: Core and Builtins - -Speed up class creation by 10-20% by reducing the overhead in the necessary -special method lookups. Patch by Stefan Behnel. - -.. - -.. bpo: 31415 -.. date: 2017-09-11-14-28-56 -.. nonce: GBdz7o -.. section: Core and Builtins - -Add ``-X importtime`` option to show how long each import takes. It can be -used to optimize application's startup time. Support the -:envvar:`PYTHONPROFILEIMPORTTIME` as an equivalent way to enable this. - -.. - -.. bpo: 31410 -.. date: 2017-09-10-20-58-51 -.. nonce: wD_RbH -.. section: Core and Builtins - -Optimized calling wrapper and classmethod descriptors. - -.. - -.. bpo: 31353 -.. date: 2017-09-05-14-19-02 -.. nonce: oGZUeJ -.. section: Core and Builtins - -:pep:`553` - Add a new built-in called ``breakpoint()`` which calls -``sys.breakpointhook()``. By default this imports ``pdb`` and calls -``pdb.set_trace()``, but users may override ``sys.breakpointhook()`` to call -whatever debugger they want. The original value of the hook is saved in -``sys.__breakpointhook__``. - -.. - -.. bpo: 17852 -.. date: 2017-09-04-12-46-25 -.. nonce: OxAtCg -.. section: Core and Builtins - -Maintain a list of open buffered files, flush them before exiting the -interpreter. Based on a patch from Armin Rigo. - -.. - -.. bpo: 31315 -.. date: 2017-09-01-00-40-58 -.. nonce: ZX20bl -.. section: Core and Builtins - -Fix an assertion failure in imp.create_dynamic(), when spec.name is not a -string. Patch by Oren Milman. - -.. - -.. bpo: 31311 -.. date: 2017-08-31-17-52-56 -.. nonce: bNE2l- -.. section: Core and Builtins - -Fix a crash in the ``__setstate__()`` method of `ctypes._CData`, in case of -a bad ``__dict__``. Patch by Oren Milman. - -.. - -.. bpo: 31293 -.. date: 2017-08-28-17-51-42 -.. nonce: eMYZXj -.. section: Core and Builtins - -Fix crashes in true division and multiplication of a timedelta object by a -float with a bad as_integer_ratio() method. Patch by Oren Milman. - -.. - -.. bpo: 31285 -.. date: 2017-08-27-21-18-30 -.. nonce: 7lzaKV -.. section: Core and Builtins - -Fix an assertion failure in `warnings.warn_explicit`, when the return value -of the received loader's get_source() has a bad splitlines() method. Patch -by Oren Milman. - -.. - -.. bpo: 30406 -.. date: 2017-07-20-22-03-44 -.. nonce: _kr47t -.. section: Core and Builtins - -Make ``async`` and ``await`` proper keywords, as specified in :pep:`492`. - -.. - -.. bpo: 30058 -.. date: 2017-10-12-19-00-53 -.. nonce: cENtry -.. section: Library - -Fixed buffer overflow in select.kqueue.control(). - -.. - -.. bpo: 31672 -.. date: 2017-10-12-02-47-16 -.. nonce: DaOkVd -.. section: Library - -``idpattern`` in ``string.Template`` matched some non-ASCII characters. Now -it uses ``-i`` regular expression local flag to avoid non-ASCII characters. - -.. - -.. bpo: 31701 -.. date: 2017-10-09-17-42-30 -.. nonce: NRrVel -.. section: Library - -On Windows, faulthandler.enable() now ignores MSC and COM exceptions. - -.. - -.. bpo: 31728 -.. date: 2017-10-08-23-28-30 -.. nonce: XrVMME -.. section: Library - -Prevent crashes in `_elementtree` due to unsafe cleanup of `Element.text` -and `Element.tail`. Patch by Oren Milman. - -.. - -.. bpo: 31671 -.. date: 2017-10-04-21-28-44 -.. nonce: E-zfc9 -.. section: Library - -Now ``re.compile()`` converts passed RegexFlag to normal int object before -compiling. bm_regex_compile benchmark shows 14% performance improvements. - -.. - -.. bpo: 30397 -.. date: 2017-10-03-22-45-50 -.. nonce: e4F7Kr -.. section: Library - -The types of compiled regular objects and match objects are now exposed as -`re.Pattern` and `re.Match`. This adds information in pydoc output for the -re module. - -.. - -.. bpo: 31675 -.. date: 2017-10-03-15-06-24 -.. nonce: Nh7jJ3 -.. section: Library - -Fixed memory leaks in Tkinter's methods splitlist() and split() when pass a -string larger than 2 GiB. - -.. - -.. bpo: 31673 -.. date: 2017-10-03-14-37-46 -.. nonce: RFCrka -.. section: Library - -Fixed typo in the name of Tkinter's method adderrorinfo(). - -.. - -.. bpo: 31648 -.. date: 2017-09-30-10-45-12 -.. nonce: Cai7ji -.. section: Library - -Improvements to path predicates in ElementTree: -Allow whitespace around predicate parts, i.e. "[a = 'text']" instead of requiring the less readable "[a='text']". -Add support for text comparison of the current node, like "[.='text']". -Patch by Stefan Behnel. - -.. - -.. bpo: 30806 -.. date: 2017-09-29 -.. nonce: lP5GrH -.. section: Library - -Fix the string representation of a netrc object. - -.. - -.. bpo: 31638 -.. date: 2017-09-29-07-14-28 -.. nonce: jElfhl -.. section: Library - -Add optional argument ``compressed`` to ``zipapp.create_archive``, and add -option ``--compress`` to the command line interface of ``zipapp``. - -.. - -.. bpo: 25351 -.. date: 2017-09-28-23-10-51 -.. nonce: 2JmFpF -.. section: Library - -Avoid venv activate failures with undefined variables - -.. - -.. bpo: 20519 -.. date: 2017-09-28-13-17-33 -.. nonce: FteeQQ -.. section: Library - -Avoid ctypes use (if possible) and improve import time for uuid. - -.. - -.. bpo: 28293 -.. date: 2017-09-26-17-51-17 -.. nonce: UC5pm4 -.. section: Library - -The regular expression cache is no longer completely dumped when it is full. - -.. - -.. bpo: 31596 -.. date: 2017-09-26-11-38-52 -.. nonce: 50Eyel -.. section: Library - -Added pthread_getcpuclockid() to the time module - -.. - -.. bpo: 27494 -.. date: 2017-09-26-01-43-17 -.. nonce: 37QnaT -.. section: Library - -Make 2to3 accept a trailing comma in generator expressions. For example, -``set(x for x in [],)`` is now allowed. - -.. - -.. bpo: 30347 -.. date: 2017-09-25-14-04-30 -.. nonce: B4--_D -.. section: Library - -Stop crashes when concurrently iterate over itertools.groupby() iterators. - -.. - -.. bpo: 30346 -.. date: 2017-09-24-13-08-46 -.. nonce: Csse77 -.. section: Library - -An iterator produced by itertools.groupby() iterator now becomes exhausted -after advancing the groupby iterator. - -.. - -.. bpo: 31556 -.. date: 2017-09-22-23-48-49 -.. nonce: 9J0u5H -.. section: Library - -Cancel asyncio.wait_for future faster if timeout <= 0 - -.. - -.. bpo: 31540 -.. date: 2017-09-22-16-02-00 -.. nonce: ybDHT5 -.. section: Library - -Allow passing a context object in -:class:`concurrent.futures.ProcessPoolExecutor` constructor. Also, free job -resources in :class:`concurrent.futures.ProcessPoolExecutor` earlier to -improve memory usage when a worker waits for new jobs. - -.. - -.. bpo: 31516 -.. date: 2017-09-20-18-43-01 -.. nonce: 23Yuq3 -.. section: Library - -``threading.current_thread()`` should not return a dummy thread at shutdown. - -.. - -.. bpo: 31525 -.. date: 2017-09-19-18-48-21 -.. nonce: O2TIL2 -.. section: Library - -In the sqlite module, require the sqlite3_prepare_v2 API. Thus, the sqlite -module now requires sqlite version at least 3.3.9. - -.. - -.. bpo: 26510 -.. date: 2017-09-19-13-29-29 -.. nonce: oncW6V -.. section: Library - -argparse subparsers are now required by default. This matches behaviour in -Python 2. For optional subparsers, use the new parameter -``add_subparsers(required=False)``. Patch by Anthony Sottile. -(As of 3.7.0rc1, the default was changed to not required as had been the case -since Python 3.3.) - -.. - -.. bpo: 27541 -.. date: 2017-09-17-19-59-04 -.. nonce: cIMFJW -.. section: Library - -Reprs of subclasses of some collection and iterator classes (`bytearray`, -`array.array`, `collections.deque`, `collections.defaultdict`, -`itertools.count`, `itertools.repeat`) now contain actual type name insteads -of hardcoded name of the base class. - -.. - -.. bpo: 31351 -.. date: 2017-09-17-15-24-25 -.. nonce: yQdKv- -.. section: Library - -python -m ensurepip now exits with non-zero exit code if pip bootstrapping -has failed. - -.. - -.. bpo: 31389 -.. date: 2017-09-07-15-31-47 -.. nonce: jNFYqB -.. section: Library - -``pdb.set_trace()`` now takes an optional keyword-only argument ``header``. -If given, this is printed to the console just before debugging begins. - -.. - -.. bpo: 31537 -.. date: 2017-10-08-23-02-14 -.. nonce: SiFNM8 -.. section: Documentation - -Fix incorrect usage of ``get_history_length`` in readline documentation -example code. Patch by Brad Smith. - -.. - -.. bpo: 30085 -.. date: 2017-09-14-18-44-50 -.. nonce: 0J9w-u -.. section: Documentation - -The operator functions without double underscores are preferred for clarity. -The one with underscores are only kept for back-compatibility. - -.. - -.. bpo: 31696 -.. date: 2017-10-04-23-40-32 -.. nonce: Y3_aBV -.. section: Build - -Improve compiler version information in :data:`sys.version` when Python is -built with Clang. - -.. - -.. bpo: 31625 -.. date: 2017-09-28-23-21-20 -.. nonce: Bb2NXr -.. section: Build - -Stop using ranlib on static libraries. Instead, we assume ar supports the -'s' flag. - -.. - -.. bpo: 31624 -.. date: 2017-09-28-20-54-52 -.. nonce: 11w91_ -.. section: Build - -Remove support for BSD/OS. - -.. - -.. bpo: 22140 -.. date: 2017-09-26-22-39-58 -.. nonce: ZRf7Wn -.. section: Build - -Prevent double substitution of prefix in python-config.sh. - -.. - -.. bpo: 31569 -.. date: 2017-09-25-00-25-23 -.. nonce: TS49pM -.. section: Build - -Correct PCBuild/ case to PCbuild/ in build scripts and documentation. - -.. - -.. bpo: 31536 -.. date: 2017-09-20-21-32-21 -.. nonce: KUDjno -.. section: Build - -Avoid wholesale rebuild after `make regen-all` if nothing changed. - -.. - -.. bpo: 31460 -.. date: 2017-09-30-19-03-26 -.. nonce: HpveI6 -.. section: IDLE - -Simplify the API of IDLE's Module Browser. -Passing a widget instead of an flist with a root widget opens the option of -creating a browser frame that is only part of a window. Passing a full file -name instead of pieces assumed to come from a .py file opens the possibility -of browsing python files that do not end in .py. - -.. - -.. bpo: 31649 -.. date: 2017-09-30-13-59-18 -.. nonce: LxN4Vb -.. section: IDLE - -IDLE - Make _htest, _utest parameters keyword only. - -.. - -.. bpo: 31559 -.. date: 2017-09-23-12-52-24 -.. nonce: ydckYX -.. section: IDLE - -Remove test order dependence in idle_test.test_browser. - -.. - -.. bpo: 31459 -.. date: 2017-09-22-20-26-23 -.. nonce: L0pnH9 -.. section: IDLE - -Rename IDLE's module browser from Class Browser to Module Browser. The -original module-level class and method browser became a module browser, with -the addition of module-level functions, years ago. Nested classes and -functions were added yesterday. For back-compatibility, the virtual event -<>, which appears on the Keys tab of the Settings -dialog, is not changed. Patch by Cheryl Sabella. - -.. - -.. bpo: 31500 -.. date: 2017-09-18-10-43-03 -.. nonce: Y_YDxA -.. section: IDLE - -Default fonts now are scaled on HiDPI displays. - -.. - -.. bpo: 1612262 -.. date: 2017-08-14-15-13-50 -.. nonce: -x_Oyq -.. section: IDLE - -IDLE module browser now shows nested classes and functions. Original patches -for code and tests by Guilherme Polo and Cheryl Sabella, respectively. - -.. - -.. bpo: 28280 -.. date: 2017-09-30-19-41-44 -.. nonce: K_EjpO -.. section: C API - -Make `PyMapping_Keys()`, `PyMapping_Values()` and `PyMapping_Items()` always -return a `list` (rather than a `list` or a `tuple`). Patch by Oren Milman. - -.. - -.. bpo: 31532 -.. date: 2017-09-20-21-59-52 -.. nonce: s9Cw9_ -.. section: C API - -Fix memory corruption due to allocator mix in getpath.c between Py_GetPath() -and Py_SetPath() - -.. - -.. bpo: 25658 -.. date: 2017-06-24-14-30-44 -.. nonce: vm8vGE -.. section: C API - -Implement :pep:`539` for Thread Specific Storage (TSS) API: it is a new Thread -Local Storage (TLS) API to CPython which would supersede use of the existing -TLS API within the CPython interpreter, while deprecating the existing API. -PEP written by Erik M. Bray, patch by Masayuki Yamamoto. diff --git a/Misc/NEWS.d/3.7.0a3.rst b/Misc/NEWS.d/3.7.0a3.rst deleted file mode 100644 index 8ef7a5118a1f55839f91597c68fe8b4cc40c2d9e..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.7.0a3.rst +++ /dev/null @@ -1,1615 +0,0 @@ -.. bpo: 32176 -.. date: 2017-12-02-21-37-22 -.. nonce: Wt25-N -.. release date: 2017-12-05 -.. section: Core and Builtins - -co_flags.CO_NOFREE is now always set correctly by the code object -constructor based on freevars and cellvars, rather than needing to be set -correctly by the caller. This ensures it will be cleared automatically when -additional cell references are injected into a modified code object and -function. - -.. - -.. bpo: 10544 -.. date: 2017-11-27-08-37-34 -.. nonce: 07nioT -.. section: Core and Builtins - -Yield expressions are now deprecated in comprehensions and generator -expressions. They are still permitted in the definition of the outermost -iterable, as that is evaluated directly in the enclosing scope. - -.. - -.. bpo: 32137 -.. date: 2017-11-26-14-36-30 -.. nonce: Stj5nL -.. section: Core and Builtins - -The repr of deeply nested dict now raises a RecursionError instead of -crashing due to a stack overflow. - -.. - -.. bpo: 32096 -.. date: 2017-11-24-01-13-58 -.. nonce: CQTHXJ -.. section: Core and Builtins - -Revert memory allocator changes in the C API: move structures back from -_PyRuntime to Objects/obmalloc.c. The memory allocators are once again -initialized statically, and so PyMem_RawMalloc() and Py_DecodeLocale() can -be called before _PyRuntime_Initialize(). - -.. - -.. bpo: 32043 -.. date: 2017-11-16-03-44-08 -.. nonce: AAzwpZ -.. section: Core and Builtins - -Add a new "developer mode": new "-X dev" command line option to enable debug -checks at runtime. - -.. - -.. bpo: 32023 -.. date: 2017-11-15-10-49-35 -.. nonce: XnCGT5 -.. section: Core and Builtins - -SyntaxError is now correctly raised when a generator expression without -parenthesis is used instead of an inheritance list in a class definition. -The duplication of the parentheses can be omitted only on calls. - -.. - -.. bpo: 32012 -.. date: 2017-11-13-00-37-11 -.. nonce: Kprjqe -.. section: Core and Builtins - -SyntaxError is now correctly raised when a generator expression without -parenthesis is passed as an argument, but followed by a trailing comma. A -generator expression always needs to be directly inside a set of parentheses -and cannot have a comma on either side. - -.. - -.. bpo: 28180 -.. date: 2017-11-12-11-44-22 -.. nonce: HQX000 -.. section: Core and Builtins - -A new internal ``_Py_SetLocaleFromEnv(category)`` helper function has been -added in order to improve the consistency of behaviour across different -``libc`` implementations (e.g. Android doesn't support setting the locale -from the environment by default). - -.. - -.. bpo: 31949 -.. date: 2017-11-05-16-11-07 -.. nonce: 2yNC_z -.. section: Core and Builtins - -Fixed several issues in printing tracebacks (PyTraceBack_Print()). -Setting sys.tracebacklimit to 0 or less now suppresses printing tracebacks. -Setting sys.tracebacklimit to None now causes using the default limit. -Setting sys.tracebacklimit to an integer larger than LONG_MAX now means using -the limit LONG_MAX rather than the default limit. -Fixed integer overflows in the case of more than 2**31 traceback items on -Windows. -Fixed output errors handling. - -.. - -.. bpo: 30696 -.. date: 2017-10-28-22-06-03 -.. nonce: lhC3HE -.. section: Core and Builtins - -Fix the interactive interpreter looping endlessly when no memory. - -.. - -.. bpo: 20047 -.. date: 2017-10-28-19-11-05 -.. nonce: GuNAto -.. section: Core and Builtins - -Bytearray methods partition() and rpartition() now accept only bytes-like -objects as separator, as documented. In particular they now raise TypeError -rather of returning a bogus result when an integer is passed as a separator. - -.. - -.. bpo: 21720 -.. date: 2017-10-25-15-51-37 -.. nonce: BwIKLP -.. section: Core and Builtins - -BytesWarning no longer emitted when the *fromlist* argument of -``__import__()`` or the ``__all__`` attribute of the module contain bytes -instances. - -.. - -.. bpo: 31845 -.. date: 2017-10-24-21-27-32 -.. nonce: 8OS-k3 -.. section: Core and Builtins - -Environment variables are once more read correctly at interpreter startup. - -.. - -.. bpo: 28936 -.. date: 2017-10-23-23-39-26 -.. nonce: C288Jh -.. section: Core and Builtins - -Ensure that lexically first syntax error involving a parameter and -``global`` or ``nonlocal`` is detected first at a given scope. Patch by Ivan -Levkivskyi. - -.. - -.. bpo: 31825 -.. date: 2017-10-20-14-07-46 -.. nonce: gJvmGW -.. section: Core and Builtins - -Fixed OverflowError in the 'unicode-escape' codec and in -codecs.escape_decode() when decode an escaped non-ascii byte. - -.. - -.. bpo: 31618 -.. date: 2017-10-18-19-41-12 -.. nonce: liLDiS -.. section: Core and Builtins - -The per-frame tracing logic added in 3.7a1 has been altered so that -``frame->f_lineno`` is updated before either ``"line"`` or ``"opcode"`` -events are emitted. Previously, opcode events were emitted first, and -therefore would occasionally see stale line numbers on the frame. The -behavior of this feature has changed slightly as a result: when both -``f_trace_lines`` and ``f_trace_opcodes`` are enabled, line events now occur -first. - -.. - -.. bpo: 28603 -.. date: 2017-10-17-13-29-19 -.. nonce: _-oia3 -.. section: Core and Builtins - -Print the full context/cause chain of exceptions on interpreter exit, even -if an exception in the chain is unhashable or compares equal to later ones. -Patch by Zane Bitter. - -.. - -.. bpo: 31786 -.. date: 2017-10-15-23-44-57 -.. nonce: XwdEP4 -.. section: Core and Builtins - -Fix timeout rounding in the select module to round correctly negative -timeouts between -1.0 and 0.0. The functions now block waiting for events as -expected. Previously, the call was incorrectly non-blocking. Patch by Pablo -Galindo. - -.. - -.. bpo: 31781 -.. date: 2017-10-13-20-01-47 -.. nonce: cXE9SM -.. section: Core and Builtins - -Prevent crashes when calling methods of an uninitialized -``zipimport.zipimporter`` object. Patch by Oren Milman. - -.. - -.. bpo: 30399 -.. date: 2017-10-12-22-21-01 -.. nonce: 45f1gv -.. section: Core and Builtins - -Standard repr() of BaseException with a single argument no longer contains -redundant trailing comma. - -.. - -.. bpo: 31626 -.. date: 2017-10-01-15-48-03 -.. nonce: reLPxY -.. section: Core and Builtins - -Fixed a bug in debug memory allocator. There was a write to freed memory -after shrinking a memory block. - -.. - -.. bpo: 30817 -.. date: 2017-07-01-15-11-13 -.. nonce: j7ZvN_ -.. section: Core and Builtins - -`PyErr_PrintEx()` clears now the ignored exception that may be raised by -`_PySys_SetObjectId()`, for example when no memory. - -.. - -.. bpo: 28556 -.. date: 2017-12-05-02-03-07 -.. nonce: 9Z_PsJ -.. section: Library - -Two minor fixes for ``typing`` module: allow shallow copying instances of -generic classes, improve interaction of ``__init_subclass__`` with generics. -Original PRs by Ivan Levkivskyi. - -.. - -.. bpo: 32214 -.. date: 2017-12-04-15-51-57 -.. nonce: uozdNj -.. section: Library - -PEP 557, Data Classes. Provides a decorator which adds boilerplate methods -to classes which use type annotations so specify fields. - -.. - -.. bpo: 27240 -.. date: 2017-12-02-16-06-00 -.. nonce: Kji34M -.. section: Library - -The header folding algorithm for the new email policies has been rewritten, -which also fixes bpo-30788, bpo-31831, and bpo-32182. In particular, -RFC2231 folding is now done correctly. - -.. - -.. bpo: 32186 -.. date: 2017-11-30-20-38-16 -.. nonce: O42bVe -.. section: Library - -io.FileIO.readall() and io.FileIO.read() now release the GIL when getting -the file size. Fixed hang of all threads with inaccessible NFS server. Patch -by Nir Soffer. - -.. - -.. bpo: 321010 -.. date: 2017-11-29-00-42-47 -.. nonce: -axD5l -.. section: Library - -Add :attr:`sys.flags.dev_mode` flag - -.. - -.. bpo: 32154 -.. date: 2017-11-28-15-27-10 -.. nonce: kDox7L -.. section: Library - -The ``asyncio.windows_utils.socketpair()`` function has been removed: use -directly :func:`socket.socketpair` which is available on all platforms since -Python 3.5 (before, it wasn't available on Windows). -``asyncio.windows_utils.socketpair()`` was just an alias to -``socket.socketpair`` on Python 3.5 and newer. - -.. - -.. bpo: 32089 -.. date: 2017-11-27-11-29-34 -.. nonce: 6ydDYv -.. section: Library - -warnings: In development (-X dev) and debug mode (pydebug build), use the -"default" action for ResourceWarning, rather than the "always" action, in -the default warnings filters. - -.. - -.. bpo: 32107 -.. date: 2017-11-26-18-48-17 -.. nonce: h2ph2K -.. section: Library - -``uuid.getnode()`` now preferentially returns universally administered MAC -addresses if available, over locally administered MAC addresses. This makes -a better guarantee for global uniqueness of UUIDs returned from -``uuid.uuid1()``. If only locally administered MAC addresses are available, -the first such one found is returned. - -.. - -.. bpo: 23033 -.. date: 2017-11-26-17-00-52 -.. nonce: YGXRWT -.. section: Library - -Wildcard is now supported in hostname when it is one and only character in -the left most segment of hostname in second argument of -:meth:`ssl.match_hostname`. Patch by Mandeep Singh. - -.. - -.. bpo: 12239 -.. date: 2017-11-24-14-07-55 -.. nonce: Nj3A0x -.. section: Library - -Make :meth:`msilib.SummaryInformation.GetProperty` return ``None`` when the -value of property is ``VT_EMPTY``. Initial patch by Mark Mc Mahon. - -.. - -.. bpo: 28334 -.. date: 2017-11-24-11-50-41 -.. nonce: 3gGGlt -.. section: Library - -Use :func:`os.path.expanduser` to find the ``~/.netrc`` file in -:class:`netrc.netrc`. If it does not exist, :exc:`FileNotFoundError` is -raised. Patch by Dimitri Merejkowsky. - -.. - -.. bpo: 32121 -.. date: 2017-11-24-00-59-12 -.. nonce: ePbmwC -.. section: Library - -Made ``tracemalloc.Traceback`` behave more like the traceback module, -sorting the frames from oldest to most recent. ``Traceback.format()`` now -accepts negative *limit*, truncating the result to the ``abs(limit)`` oldest -frames. To get the old behaviour, one can use the new *most_recent_first* -argument to ``Traceback.format()``. (Patch by Jesse Bakker.) - -.. - -.. bpo: 31325 -.. date: 2017-11-23-22-12-11 -.. nonce: 8jAUxN -.. section: Library - -Fix wrong usage of :func:`collections.namedtuple` in the -:meth:`RobotFileParser.parse() ` -method. -Initial patch by Robin Wellner. - -.. - -.. bpo: 12382 -.. date: 2017-11-23-21-47-36 -.. nonce: xWT9k0 -.. section: Library - -:func:`msilib.OpenDatabase` now raises a better exception message when it -couldn't open or create an MSI file. Initial patch by William Tisäter. - -.. - -.. bpo: 19610 -.. date: 2017-11-23-16-15-55 -.. nonce: Dlca2P -.. section: Library - -``setup()`` now warns about invalid types for some fields. -The ``distutils.dist.Distribution`` class now warns when ``classifiers``, -``keywords`` and ``platforms`` fields are not specified as a list or a -string. - -.. - -.. bpo: 32071 -.. date: 2017-11-22-19-52-17 -.. nonce: 4WNhUH -.. section: Library - -Added the ``-k`` command-line option to ``python -m unittest`` to run only -tests that match the given pattern(s). - -.. - -.. bpo: 10049 -.. date: 2017-11-22-17-21-01 -.. nonce: ttsBqb -.. section: Library - -Added *nullcontext* no-op context manager to contextlib. This provides a -simpler and faster alternative to ExitStack() when handling optional context -managers. - -.. - -.. bpo: 28684 -.. date: 2017-11-22-12-54-46 -.. nonce: NLiDKZ -.. section: Library - -The new test.support.skip_unless_bind_unix_socket() decorator is used here -to skip asyncio tests that fail because the platform lacks a functional -bind() function for unix domain sockets (as it is the case for non root -users on the recent Android versions that run now SELinux in enforcing -mode). - -.. - -.. bpo: 32110 -.. date: 2017-11-22-09-44-15 -.. nonce: VJa9bo -.. section: Library - -``codecs.StreamReader.read(n)`` now returns not more than *n* -characters/bytes for non-negative *n*. This makes it compatible with -``read()`` methods of other file-like objects. - -.. - -.. bpo: 27535 -.. date: 2017-11-21-16-05-35 -.. nonce: JLhcNz -.. section: Library - -The warnings module doesn't leak memory anymore in the hidden warnings -registry for the "ignore" action of warnings filters. warn_explicit() -function doesn't add the warning key to the registry anymore for the -"ignore" action. - -.. - -.. bpo: 32088 -.. date: 2017-11-20-15-28-31 -.. nonce: mV-4Nu -.. section: Library - -warnings: When Python is build is debug mode (``Py_DEBUG``), -:exc:`DeprecationWarning`, :exc:`PendingDeprecationWarning` and -:exc:`ImportWarning` warnings are now displayed by default. - -.. - -.. bpo: 1647489 -.. date: 2017-11-20-01-29-46 -.. nonce: -ZNNkh -.. section: Library - -Fixed searching regular expression patterns that could match an empty -string. Non-empty string can now be correctly found after matching an empty -string. - -.. - -.. bpo: 25054 -.. date: 2017-11-20-01-01-01 -.. nonce: rOlRV6 -.. section: Library - -Added support of splitting on a pattern that could match an empty string. - -.. - -.. bpo: 32072 -.. date: 2017-11-18-21-13-52 -.. nonce: nwDV8L -.. section: Library - -Fixed issues with binary plists: -Fixed saving bytearrays. -Identical objects will be saved only once. -Equal references will be load as identical objects. -Added support for saving and loading recursive data structures. - -.. - -.. bpo: 32069 -.. date: 2017-11-18-17-09-01 -.. nonce: S0wyy4 -.. section: Library - -Drop legacy SSL transport from asyncio, ssl.MemoryBIO is always used anyway. - -.. - -.. bpo: 32066 -.. date: 2017-11-17-18-28-53 -.. nonce: OMQFLH -.. section: Library - -asyncio: Support pathlib.Path in create_unix_connection; sock arg should be -optional - -.. - -.. bpo: 32046 -.. date: 2017-11-16-20-09-45 -.. nonce: 9sGDtw -.. section: Library - -Updates 2to3 to convert from operator.isCallable(obj) to callable(obj). -Patch by Dong-hee Na. - -.. - -.. bpo: 32018 -.. date: 2017-11-16-02-32-41 -.. nonce: YMQ7Q2 -.. section: Library - -inspect.signature should follow :pep:`8`, if the parameter has an annotation -and a default value. Patch by Dong-hee Na. - -.. - -.. bpo: 32025 -.. date: 2017-11-15-20-03-45 -.. nonce: lnIKYT -.. section: Library - -Add time.thread_time() and time.thread_time_ns() - -.. - -.. bpo: 32037 -.. date: 2017-11-15-19-04-22 -.. nonce: r8-5Nk -.. section: Library - -Integers that fit in a signed 32-bit integer will be now pickled with -protocol 0 using the INT opcode. This will decrease the size of a pickle, -speed up pickling and unpickling, and make these integers be unpickled as -int instances in Python 2. - -.. - -.. bpo: 32034 -.. date: 2017-11-15-13-44-28 -.. nonce: uHAOmu -.. section: Library - -Make asyncio.IncompleteReadError and LimitOverrunError pickleable. - -.. - -.. bpo: 32015 -.. date: 2017-11-13-17-48-33 -.. nonce: 4nqRTD -.. section: Library - -Fixed the looping of asyncio in the case of reconnection the socket during -waiting async read/write from/to the socket. - -.. - -.. bpo: 32011 -.. date: 2017-11-12-20-47-59 -.. nonce: NzVDdZ -.. section: Library - -Restored support of loading marshal files with the TYPE_INT64 code. These -files can be produced in Python 2.7. - -.. - -.. bpo: 28369 -.. date: 2017-11-10-16-27-26 -.. nonce: IS74nd -.. section: Library - -Enhance add_reader/writer check that socket is not used by some transport. -Before, only cases when add_reader/writer were called with an int FD were -supported. Now the check is implemented correctly for all file-like -objects. - -.. - -.. bpo: 31976 -.. date: 2017-11-09-21-36-32 -.. nonce: EOA7qY -.. section: Library - -Fix race condition when flushing a file is slow, which can cause a segfault -if closing the file from another thread. - -.. - -.. bpo: 31985 -.. date: 2017-11-08-16-51-52 -.. nonce: dE_fOB -.. section: Library - -Formally deprecated aifc.openfp, sunau.openfp, and wave.openfp. Since change -7bc817d5ba917528e8bd07ec461c635291e7b06a in 1993, openfp in each of the -three modules had been pointing to that module's open function as a matter -of backwards compatibility, though it had been both untested and -undocumented. - -.. - -.. bpo: 21862 -.. date: 2017-11-07-15-19-52 -.. nonce: RwietE -.. section: Library - -cProfile command line now accepts `-m module_name` as an alternative to -script path. Patch by Sanyam Khurana. - -.. - -.. bpo: 31970 -.. date: 2017-11-07-14-20-09 -.. nonce: x4EN_9 -.. section: Library - -Reduce performance overhead of asyncio debug mode. - -.. - -.. bpo: 31843 -.. date: 2017-11-07-00-37-50 -.. nonce: lM2gkR -.. section: Library - -*database* argument of sqlite3.connect() now accepts a :term:`path-like -object`, instead of just a string. - -.. - -.. bpo: 31945 -.. date: 2017-11-05-01-17-12 -.. nonce: TLPBtS -.. section: Library - -Add Configurable *blocksize* to ``HTTPConnection`` and ``HTTPSConnection`` -for improved upload throughput. Patch by Nir Soffer. - -.. - -.. bpo: 31943 -.. date: 2017-11-04-19-28-08 -.. nonce: bxw5gM -.. section: Library - -Add a ``cancelled()`` method to :class:`asyncio.Handle`. Patch by Marat -Sharafutdinov. - -.. - -.. bpo: 9678 -.. date: 2017-11-03-22-05-47 -.. nonce: oD51q6 -.. section: Library - -Fixed determining the MAC address in the uuid module: -Using ifconfig on NetBSD and OpenBSD. -Using arp on Linux, FreeBSD, NetBSD and OpenBSD. -Based on patch by Takayuki Shimizukawa. - -.. - -.. bpo: 30057 -.. date: 2017-11-03-19-11-43 -.. nonce: NCaijI -.. section: Library - -Fix potential missed signal in signal.signal(). - -.. - -.. bpo: 31933 -.. date: 2017-11-03-08-36-03 -.. nonce: UrtoMP -.. section: Library - -Fix Blake2 params leaf_size and node_offset on big endian platforms. Patch -by Jack O'Connor. - -.. - -.. bpo: 21423 -.. date: 2017-11-02-22-26-16 -.. nonce: hw5mEh -.. section: Library - -Add an initializer argument to {Process,Thread}PoolExecutor - -.. - -.. bpo: 31927 -.. date: 2017-11-02-18-26-40 -.. nonce: 40K6kp -.. section: Library - -Fixed compilation of the socket module on NetBSD 8. Fixed assertion failure -or reading arbitrary data when parse a AF_BLUETOOTH address on NetBSD and -DragonFly BSD. - -.. - -.. bpo: 27666 -.. date: 2017-11-01-18-13-42 -.. nonce: j2zRnF -.. section: Library - -Fixed stack corruption in curses.box() and curses.ungetmouse() when the size -of types chtype or mmask_t is less than the size of C long. curses.box() -now accepts characters as arguments. Based on patch by Steve Fink. - -.. - -.. bpo: 31917 -.. date: 2017-11-01-03-28-24 -.. nonce: DYQL0g -.. section: Library - -Add 3 new clock identifiers: :data:`time.CLOCK_BOOTTIME`, -:data:`time.CLOCK_PROF` and :data:`time.CLOCK_UPTIME`. - -.. - -.. bpo: 31897 -.. date: 2017-10-30-11-04-56 -.. nonce: yjwdEb -.. section: Library - -plistlib now catches more errors when read binary plists and raises -InvalidFileException instead of unexpected exceptions. - -.. - -.. bpo: 25720 -.. date: 2017-10-29-17-52-40 -.. nonce: vSvb5h -.. section: Library - -Fix the method for checking pad state of curses WINDOW. Patch by Masayuki -Yamamoto. - -.. - -.. bpo: 31893 -.. date: 2017-10-29-13-51-01 -.. nonce: 8LZKEz -.. section: Library - -Fixed the layout of the kqueue_event structure on OpenBSD and NetBSD. Fixed -the comparison of the kqueue_event objects. - -.. - -.. bpo: 31891 -.. date: 2017-10-29-11-23-24 -.. nonce: 9kAPha -.. section: Library - -Fixed building the curses module on NetBSD. - -.. - -.. bpo: 31884 -.. date: 2017-10-27 -.. nonce: bjhre9 -.. section: Library - -added required constants to subprocess module for setting priority on -windows - -.. - -.. bpo: 28281 -.. date: 2017-10-26-14-54-38 -.. nonce: 7ZN5FG -.. section: Library - -Remove year (1-9999) limits on the Calendar.weekday() function. -Patch by Mark Gollahon. - -.. - -.. bpo: 31702 -.. date: 2017-10-24-21-10-44 -.. nonce: SfwJDI -.. section: Library - -crypt.mksalt() now allows to specify the number of rounds for SHA-256 and -SHA-512 hashing. - -.. - -.. bpo: 30639 -.. date: 2017-10-24-12-24-56 -.. nonce: ptNM9a -.. section: Library - -:func:`inspect.getfile` no longer computes the repr of unknown objects to -display in an error message, to protect against badly behaved custom reprs. - -.. - -.. bpo: 30768 -.. date: 2017-10-24-12-00-16 -.. nonce: Om8Yj_ -.. section: Library - -Fix the pthread+semaphore implementation of PyThread_acquire_lock_timed() -when called with timeout > 0 and intr_flag=0: recompute the timeout if -sem_timedwait() is interrupted by a signal (EINTR). See also the :pep:`475`. - -.. - -.. bpo: 31854 -.. date: 2017-10-23 -.. nonce: fh8334f -.. section: Library - -Add ``mmap.ACCESS_DEFAULT`` constant. - -.. - -.. bpo: 31834 -.. date: 2017-10-23-23-27-52 -.. nonce: InwC6O -.. section: Library - -Use optimized code for BLAKE2 only with SSSE3+. The pure SSE2 implementation -is slower than the pure C reference implementation. - -.. - -.. bpo: 28292 -.. date: 2017-10-23-20-03-36 -.. nonce: 1Gkim2 -.. section: Library - -Calendar.itermonthdates() will now consistently raise an exception when a -date falls outside of the 0001-01-01 through 9999-12-31 range. To support -applications that cannot tolerate such exceptions, the new methods -itermonthdays3() and itermonthdays4() are added. The new methods return -tuples and are not restricted by the range supported by datetime.date. - -.. - -.. bpo: 28564 -.. date: 2017-10-23-16-22-54 -.. nonce: Tx-l-I -.. section: Library - -The shutil.rmtree() function has been sped up to 20--40%. This was done -using the os.scandir() function. - -.. - -.. bpo: 28416 -.. date: 2017-10-23-12-05-33 -.. nonce: Ldnw8X -.. section: Library - -Instances of pickle.Pickler subclass with the persistent_id() method and -pickle.Unpickler subclass with the persistent_load() method no longer create -reference cycles. - -.. - -.. bpo: 31653 -.. date: 2017-10-22-12-43-03 -.. nonce: ttfGvq -.. section: Library - -Don't release the GIL if we can acquire a multiprocessing semaphore -immediately. - -.. - -.. bpo: 28326 -.. date: 2017-10-22-11-06-02 -.. nonce: rxh7L4 -.. section: Library - -Fix multiprocessing.Process when stdout and/or stderr is closed or None. - -.. - -.. bpo: 20825 -.. date: 2017-10-21-09-13-16 -.. nonce: -1MBEy -.. section: Library - -Add `subnet_of` and `superset_of` containment tests to -:class:`ipaddress.IPv6Network` and :class:`ipaddress.IPv4Network`. Patch by -Michel Albert and Cheryl Sabella. - -.. - -.. bpo: 31827 -.. date: 2017-10-20-16-12-01 -.. nonce: 7R8s8s -.. section: Library - -Remove the os.stat_float_times() function. It was introduced in Python 2.3 -for backward compatibility with Python 2.2, and was deprecated since Python -3.1. - -.. - -.. bpo: 31756 -.. date: 2017-10-20-12-57-52 -.. nonce: IxCvGB -.. section: Library - -Add a ``subprocess.Popen(text=False)`` keyword argument to `subprocess` -functions to be more explicit about when the library should attempt to -decode outputs into text. Patch by Andrew Clegg. - -.. - -.. bpo: 31819 -.. date: 2017-10-19-20-03-13 -.. nonce: mw2wF9 -.. section: Library - -Add AbstractEventLoop.sock_recv_into(). - -.. - -.. bpo: 31457 -.. date: 2017-10-18-19-05-17 -.. nonce: KlE6r8 -.. section: Library - -If nested log adapters are used, the inner ``process()`` methods are no -longer omitted. - -.. - -.. bpo: 31457 -.. date: 2017-10-18-16-48-09 -.. nonce: _ovmzp -.. section: Library - -The ``manager`` property on LoggerAdapter objects is now properly settable. - -.. - -.. bpo: 31806 -.. date: 2017-10-17-23-27-03 -.. nonce: TzphdL -.. section: Library - -Fix timeout rounding in time.sleep(), threading.Lock.acquire() and -socket.socket.settimeout() to round correctly negative timeouts between -1.0 -and 0.0. The functions now block waiting for events as expected. Previously, -the call was incorrectly non-blocking. Patch by Pablo Galindo. - -.. - -.. bpo: 31803 -.. date: 2017-10-17-22-55-13 -.. nonce: YLL1gJ -.. section: Library - -time.clock() and time.get_clock_info('clock') now emit a DeprecationWarning -warning. - -.. - -.. bpo: 31800 -.. date: 2017-10-17-20-08-19 -.. nonce: foOSCi -.. section: Library - -Extended support for parsing UTC offsets. strptime '%z' can now parse the -output generated by datetime.isoformat, including seconds and microseconds. - -.. - -.. bpo: 28603 -.. date: 2017-10-17-12-29-18 -.. nonce: tGuX2C -.. section: Library - -traceback: Fix a TypeError that occurred during printing of exception -tracebacks when either the current exception or an exception in its -context/cause chain is unhashable. Patch by Zane Bitter. - -.. - -.. bpo: 30541 -.. date: 2017-10-17-12-04-37 -.. nonce: q3BM6C -.. section: Library - -Add new function to seal a mock and prevent the automatically creation of -child mocks. Patch by Mario Corchero. - -.. - -.. bpo: 31784 -.. date: 2017-10-13-23-35-47 -.. nonce: 6e57bd -.. section: Library - -Implement the :pep:`564`, add new 6 new functions with nanosecond resolution -to the :mod:`time` module: :func:`~time.clock_gettime_ns`, -:func:`~time.clock_settime_ns`, :func:`~time.monotonic_ns`, -:func:`~time.perf_counter_ns`, :func:`~time.process_time_ns`, -:func:`~time.time_ns`. - -.. - -.. bpo: 30143 -.. date: 2017-10-12-19-05-54 -.. nonce: 25_hU1 -.. section: Library - -2to3 now generates a code that uses abstract collection classes from -collections.abc rather than collections. - -.. - -.. bpo: 31770 -.. date: 2017-10-12-18-45-38 -.. nonce: GV3MPx -.. section: Library - -Prevent a crash when calling the ``__init__()`` method of a -``sqlite3.Cursor`` object more than once. Patch by Oren Milman. - -.. - -.. bpo: 31764 -.. date: 2017-10-11-22-18-04 -.. nonce: EMyIkK -.. section: Library - -Prevent a crash in ``sqlite3.Cursor.close()`` in case the ``Cursor`` object -is uninitialized. Patch by Oren Milman. - -.. - -.. bpo: 31752 -.. date: 2017-10-11-00-45-01 -.. nonce: DhWevN -.. section: Library - -Fix possible crash in timedelta constructor called with custom integers. - -.. - -.. bpo: 31620 -.. date: 2017-10-06-04-35-31 -.. nonce: gksLA1 -.. section: Library - -an empty asyncio.Queue now doesn't leak memory when queue.get pollers -timeout - -.. - -.. bpo: 31690 -.. date: 2017-10-05-15-14-46 -.. nonce: f0XteV -.. section: Library - -Allow the flags re.ASCII, re.LOCALE, and re.UNICODE to be used as group -flags for regular expressions. - -.. - -.. bpo: 30349 -.. date: 2017-10-05-12-45-29 -.. nonce: 6zKJsF -.. section: Library - -FutureWarning is now emitted if a regular expression contains character set -constructs that will change semantically in the future (nested sets and set -operations). - -.. - -.. bpo: 31664 -.. date: 2017-10-04-20-36-28 -.. nonce: 4VDUzo -.. section: Library - -Added support for the Blowfish hashing in the crypt module. - -.. - -.. bpo: 31632 -.. date: 2017-10-04-11-37-14 -.. nonce: LiOC3C -.. section: Library - -Fix method set_protocol() of class _SSLProtocolTransport in asyncio module. -This method was previously modifying a wrong reference to the protocol. - -.. - -.. bpo: 15037 -.. date: 2017-09-29-19-19-36 -.. nonce: ykimLK -.. section: Library - -Added a workaround for getkey() in curses for ncurses 5.7 and earlier. - -.. - -.. bpo: 31307 -.. date: 2017-09-07-12-50-28 -.. nonce: AVBiNY -.. section: Library - -Allow use of bytes objects for arguments to -:meth:`configparser.ConfigParser.read`. Patch by Vincent Michel. - -.. - -.. bpo: 31334 -.. date: 2017-09-04-00-22-31 -.. nonce: 9WYRfi -.. section: Library - -Fix ``poll.poll([timeout])`` in the ``select`` module for arbitrary negative -timeouts on all OSes where it can only be a non-negative integer or -1. -Patch by Riccardo Coccioli. - -.. - -.. bpo: 31310 -.. date: 2017-08-30-18-23-54 -.. nonce: 7D1UNt -.. section: Library - -multiprocessing's semaphore tracker should be launched again if crashed. - -.. - -.. bpo: 31308 -.. date: 2017-08-30-17-59-36 -.. nonce: KbexyC -.. section: Library - -Make multiprocessing's forkserver process immune to Ctrl-C and other user -interruptions. If it crashes, restart it when necessary. - -.. - -.. bpo: 31245 -.. date: 2017-08-22-11-05-35 -.. nonce: AniZuz -.. section: Library - -Added support for AF_UNIX socket in asyncio `create_datagram_endpoint`. - -.. - -.. bpo: 30553 -.. date: 2017-07-05-14-48-26 -.. nonce: Oupsxo -.. section: Library - -Add HTTP/2 status code 421 (Misdirected Request) to -:class:`http.HTTPStatus`. Patch by Vitor Pereira. - -.. - -.. bpo: 32105 -.. date: 2017-11-21-10-54-16 -.. nonce: 91mhWm -.. section: Documentation - -Added asyncio.BaseEventLoop.connect_accepted_socket versionadded marker. - -.. - -.. bpo: 31380 -.. date: 2017-12-04-23-19-16 -.. nonce: VlMmHW -.. section: Tests - -Skip test_httpservers test_undecodable_file on macOS: fails on APFS. - -.. - -.. bpo: 31705 -.. date: 2017-11-30-12-27-10 -.. nonce: yULW7O -.. section: Tests - -Skip test_socket.test_sha256() on Linux kernel older than 4.5. The test -fails with ENOKEY on kernel 3.10 (on ppc64le). A fix was merged into the -kernel 4.5. - -.. - -.. bpo: 32138 -.. date: 2017-11-27-16-18-58 -.. nonce: QsTvf- -.. section: Tests - -Skip on Android test_faulthandler tests that raise SIGSEGV and remove the -test.support.requires_android_level decorator. - -.. - -.. bpo: 32136 -.. date: 2017-11-26-17-11-27 -.. nonce: Y11luJ -.. section: Tests - -The runtime embedding tests have been split out from -``Lib/test/test_capi.py`` into a new ``Lib/test/test_embed.py`` file. - -.. - -.. bpo: 28668 -.. date: 2017-11-25-14-53-29 -.. nonce: Y1G6pA -.. section: Tests - -test.support.requires_multiprocessing_queue is removed. Skip tests with -test.support.import_module('multiprocessing.synchronize') instead when the -semaphore implementation is broken or missing. - -.. - -.. bpo: 32126 -.. date: 2017-11-24-18-15-12 -.. nonce: PLmNLn -.. section: Tests - -Skip test_get_event_loop_new_process in test.test_asyncio.test_events when -sem_open() is not functional. - -.. - -.. bpo: 31174 -.. date: 2017-10-24-11-36-10 -.. nonce: xCvXcr -.. section: Tests - -Fix test_tools.test_unparse: DirectoryTestCase now stores the names sample -to always test the same files. It prevents false alarms when hunting -reference leaks. - -.. - -.. bpo: 28538 -.. date: 2017-11-21-17-27-59 -.. nonce: DsNBS7 -.. section: Build - -Revert the previous changes, the if_nameindex structure is defined by -Unified Headers. - -.. - -.. bpo: 28762 -.. date: 2017-11-21-17-12-24 -.. nonce: R6uu8w -.. section: Build - -Revert the last commit, the F_LOCK macro is defined by Android Unified -Headers. - -.. - -.. bpo: 29040 -.. date: 2017-11-21-16-56-24 -.. nonce: 14lCSr -.. section: Build - -Support building Android with Unified Headers. The first NDK release to -support Unified Headers is android-ndk-r14. - -.. - -.. bpo: 32059 -.. date: 2017-11-18-11-19-28 -.. nonce: a0Hxgp -.. section: Build - -``detect_modules()`` in ``setup.py`` now also searches the sysroot paths -when cross-compiling. - -.. - -.. bpo: 31957 -.. date: 2017-11-06-11-53-39 -.. nonce: S_1jFK -.. section: Build - -Fixes Windows SDK version detection when building for Windows. - -.. - -.. bpo: 31609 -.. date: 2017-11-04-15-35-08 -.. nonce: k7_nBR -.. section: Build - -Fixes quotes in PCbuild/clean.bat - -.. - -.. bpo: 31934 -.. date: 2017-11-03-15-17-50 -.. nonce: 8bUlpv -.. section: Build - -Abort the build when building out of a not clean source tree. - -.. - -.. bpo: 31926 -.. date: 2017-11-03-10-07-14 -.. nonce: 57wE98 -.. section: Build - -Fixed Argument Clinic sometimes causing compilation errors when there was -more than one function and/or method in a .c file with the same name. - -.. - -.. bpo: 28791 -.. date: 2017-11-02-20-30-57 -.. nonce: VaE3o8 -.. section: Build - -Update Windows builds to use SQLite 3.21.0. - -.. - -.. bpo: 28791 -.. date: 2017-11-02-20-13-46 -.. nonce: STt3jL -.. section: Build - -Update OS X installer to use SQLite 3.21.0. - -.. - -.. bpo: 28643 -.. date: 2017-11-01-14-16-27 -.. nonce: 9iPKJy -.. section: Build - -Record profile-opt build progress with stamp files. - -.. - -.. bpo: 31866 -.. date: 2017-10-24-23-21-13 -.. nonce: MkNO66 -.. section: Build - -Finish removing support for AtheOS. - -.. - -.. bpo: 1102 -.. date: 2017-11-19-09-46-27 -.. nonce: NY-g1F -.. section: Windows - -Return ``None`` when ``View.Fetch()`` returns ``ERROR_NO_MORE_ITEMS`` -instead of raising ``MSIError``. -Initial patch by Anthony Tuininga. - -.. - -.. bpo: 31944 -.. date: 2017-11-04-15-29-47 -.. nonce: 0Bx8tZ -.. section: Windows - -Fixes Modify button in Apps and Features dialog. - -.. - -.. bpo: 20486 -.. date: 2017-10-26-23-02-57 -.. nonce: 3IdsZ1 -.. section: Windows - -Implement the ``Database.Close()`` method to help closing MSI database -objects. - -.. - -.. bpo: 31857 -.. date: 2017-10-23-18-35-50 -.. nonce: YwhEvc -.. section: Windows - -Make the behavior of USE_STACKCHECK deterministic in a multi-threaded -environment. - -.. - -.. bpo: 31392 -.. date: 2017-12-04-21-57-43 -.. nonce: f8huBC -.. section: macOS - -Update macOS installer to use OpenSSL 1.0.2m - -.. - -.. bpo: 32207 -.. date: 2017-12-04-15-04-43 -.. nonce: IzyAJo -.. section: IDLE - -Improve tk event exception tracebacks in IDLE. When tk event handling is -driven by IDLE's run loop, a confusing and distracting queue.EMPTY traceback -context is no longer added to tk event exception tracebacks. The traceback -is now the same as when event handling is driven by user code. Patch based -on a suggestion by Serhiy Storchaka. - -.. - -.. bpo: 32164 -.. date: 2017-11-28-21-47-15 -.. nonce: 2T2Na8 -.. section: IDLE - -Delete unused file idlelib/tabbedpages.py. Use of TabbedPageSet in -configdialog was replaced by ttk.Notebook. - -.. - -.. bpo: 32100 -.. date: 2017-11-21-08-26-08 -.. nonce: P43qx2 -.. section: IDLE - -IDLE: Fix old and new bugs in pathbrowser; improve tests. Patch mostly by -Cheryl Sabella. - -.. - -.. bpo: 31858 -.. date: 2017-10-26-20-20-19 -.. nonce: VuSA_e -.. section: IDLE - -IDLE -- Restrict shell prompt manipulation to the shell. Editor and output -windows only see an empty last prompt line. This simplifies the code and -fixes a minor bug when newline is inserted. Sys.ps1, if present, is read on -Shell start-up, but is not set or changed. - -.. - -.. bpo: 31860 -.. date: 2017-10-24-16-21-50 -.. nonce: gECuWx -.. section: IDLE - -The font sample in the IDLE configuration dialog is now editable. Changes -persist while IDLE remains open - -.. - -.. bpo: 31836 -.. date: 2017-10-21-15-41-53 -.. nonce: fheLME -.. section: IDLE - -Test_code_module now passes if run after test_idle, which sets ps1. -The code module uses sys.ps1 if present or sets it to '>>> ' if not. -Test_code_module now properly tests both behaviors. Ditto for ps2. - -.. - -.. bpo: 28603 -.. date: 2017-10-17-13-26-13 -.. nonce: TMEQfp -.. section: IDLE - -Fix a TypeError that caused a shell restart when printing a traceback that -includes an exception that is unhashable. Patch by Zane Bitter. - -.. - -.. bpo: 13802 -.. date: 2017-10-12-00-51-29 -.. nonce: VwjZRD -.. section: IDLE - -Use non-Latin characters in the IDLE's Font settings sample. Even if one -selects a font that defines a limited subset of the unicode Basic -Multilingual Plane, tcl/tk will use other fonts that define a character. The -expanded example give users of non-Latin characters a better idea of what -they might see in IDLE's shell and editors. -To make room for the expanded sample, frames on the Font tab are -re-arranged. The Font/Tabs help explains a bit about the additions. - -.. - -.. bpo: 32159 -.. date: 2017-11-28-21-24-41 -.. nonce: RSl4QK -.. section: Tools/Demos - -Remove CVS and Subversion tools: remove svneol.py and treesync.py scripts. -CPython migrated from CVS to Subversion, to Mercurial, and then to Git. CVS -and Subversion are no longer used to develop CPython. - -.. - -.. bpo: 30722 -.. date: 2017-10-23-19-45-52 -.. nonce: ioRlAu -.. section: Tools/Demos - -Make redemo work with Python 3.6 and newer versions. -Also, remove the ``LOCALE`` option since it doesn't work with string -patterns in Python 3. -Patch by Christoph Sarnowski. - -.. - -.. bpo: 20891 -.. date: 2017-11-30-18-13-45 -.. nonce: wBnMdF -.. section: C API - -Fix PyGILState_Ensure(). When PyGILState_Ensure() is called in a non-Python -thread before PyEval_InitThreads(), only call PyEval_InitThreads() after -calling PyThreadState_New() to fix a crash. - -.. - -.. bpo: 32125 -.. date: 2017-11-24-21-25-43 -.. nonce: K8zWgn -.. section: C API - -The ``Py_UseClassExceptionsFlag`` flag has been removed. It was deprecated -and wasn't used anymore since Python 2.0. - -.. - -.. bpo: 25612 -.. date: 2017-10-22-13-12-28 -.. nonce: 1jnWKT -.. section: C API - -Move the current exception state from the frame object to the co-routine. -This simplifies the interpreter and fixes a couple of obscure bugs caused by -having swap exception state when entering or exiting a generator. - -.. - -.. bpo: 23699 -.. date: 2017-10-19-15-27-04 -.. nonce: -noVVc -.. section: C API - -Add Py_RETURN_RICHCOMPARE macro to reduce boilerplate code in rich -comparison functions. - -.. - -.. bpo: 30697 -.. date: 2017-06-30-11-58-01 -.. nonce: Q3T_8n -.. section: C API - -The `PyExc_RecursionErrorInst` singleton is removed and -`PyErr_NormalizeException()` does not use it anymore. This singleton is -persistent and its members being never cleared may cause a segfault during -finalization of the interpreter. See also issue #22898. diff --git a/Misc/NEWS.d/3.7.0a4.rst b/Misc/NEWS.d/3.7.0a4.rst deleted file mode 100644 index af9cf4d29f902f3eeec3728378f8390c531eb5ac..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.7.0a4.rst +++ /dev/null @@ -1,846 +0,0 @@ -.. bpo: 31975 -.. date: 2018-01-05-20-54-27 -.. nonce: AmftlU -.. release date: 2018-01-08 -.. section: Core and Builtins - -The default warning filter list now starts with a -"default::DeprecationWarning:__main__" entry, so deprecation warnings are -once again shown by default in single-file scripts and at the interactive -prompt. - -.. - -.. bpo: 32226 -.. date: 2018-01-04-15-06-15 -.. nonce: 7cAvRG -.. section: Core and Builtins - -``__class_getitem__`` is now an automatic class method. - -.. - -.. bpo: 32399 -.. date: 2017-12-22-13-38-17 -.. nonce: wlH12z -.. section: Core and Builtins - -Add AIX uuid library support for RFC4122 using uuid_create() in libc.a - -.. - -.. bpo: 32390 -.. date: 2017-12-22-13-28-07 -.. nonce: QPj083 -.. section: Core and Builtins - -Fix the compilation failure on AIX after the f_fsid field has been added to -the object returned by os.statvfs() (issue #32143). Original patch by -Michael Felt. - -.. - -.. bpo: 32379 -.. date: 2017-12-19-21-14-41 -.. nonce: B7mOmI -.. section: Core and Builtins - -Make MRO computation faster when a class inherits from a single base. - -.. - -.. bpo: 32259 -.. date: 2017-12-16-14-30-21 -.. nonce: GoOJiX -.. section: Core and Builtins - -The error message of a TypeError raised when unpack non-iterable is now more -specific. - -.. - -.. bpo: 27169 -.. date: 2017-12-15-11-50-06 -.. nonce: VO84fQ -.. section: Core and Builtins - -The ``__debug__`` constant is now optimized out at compile time. This fixes -also bpo-22091. - -.. - -.. bpo: 32329 -.. date: 2017-12-15-00-13-04 -.. nonce: q47IN2 -.. section: Core and Builtins - -The :option:`-R` option now turns on hash randomization when the -:envvar:`PYTHONHASHSEED` environment variable is set to ``0``. Previously, -the option was ignored. Moreover, ``sys.flags.hash_randomization`` is now -properly set to 0 when hash randomization is turned off by -``PYTHONHASHSEED=0``. - -.. - -.. bpo: 30416 -.. date: 2017-12-14-11-48-19 -.. nonce: hlHo_9 -.. section: Core and Builtins - -The optimizer is now protected from spending much time doing complex -calculations and consuming much memory for creating large constants in -constant folding. Increased limits for constants that can be produced in -constant folding. - -.. - -.. bpo: 32282 -.. date: 2017-12-12-14-02-28 -.. nonce: xFVMTn -.. section: Core and Builtins - -Fix an unnecessary ifdef in the include of VersionHelpers.h in socketmodule -on Windows. - -.. - -.. bpo: 30579 -.. date: 2017-12-11-01-52-42 -.. nonce: X6cEzf -.. section: Core and Builtins - -Implement TracebackType.__new__ to allow Python-level creation of traceback -objects, and make TracebackType.tb_next mutable. - -.. - -.. bpo: 32260 -.. date: 2017-12-09-11-03-51 -.. nonce: 1DAO-p -.. section: Core and Builtins - -Don't byte swap the input keys to the SipHash algorithm on big-endian -platforms. This should ensure siphash gives consistent results across -platforms. - -.. - -.. bpo: 31506 -.. date: 2017-12-07-23-44-29 -.. nonce: j1U2fU -.. section: Core and Builtins - -Improve the error message logic for object.__new__ and object.__init__. -Patch by Sanyam Khurana. - -.. - -.. bpo: 20361 -.. date: 2017-12-07-17-22-30 -.. nonce: zQUmbi -.. section: Core and Builtins - -``-b`` and ``-bb`` now inject ``'default::BytesWarning'`` and -``error::BytesWarning`` entries into ``sys.warnoptions``, ensuring that they -take precedence over any other warning filters configured via the ``-W`` -option or the ``PYTHONWARNINGS`` environment variable. - -.. - -.. bpo: 32230 -.. date: 2017-12-06-20-18-34 -.. nonce: PgGQaB -.. section: Core and Builtins - -`-X dev` now injects a ``'default'`` entry into sys.warnoptions, ensuring -that it behaves identically to actually passing ``-Wdefault`` at the command -line. - -.. - -.. bpo: 29240 -.. date: 2017-12-05-23-10-58 -.. nonce: qpJP5l -.. section: Core and Builtins - -Add a new UTF-8 mode: implementation of the :pep:`540`. - -.. - -.. bpo: 32226 -.. date: 2017-12-05-21-42-58 -.. nonce: G8fqb6 -.. section: Core and Builtins - -:pep:`560`: Add support for ``__mro_entries__`` and ``__class_getitem__``. Implemented -by Ivan Levkivskyi. - -.. - -.. bpo: 32225 -.. date: 2017-12-05-21-33-47 -.. nonce: ucKjvw -.. section: Core and Builtins - -:pep:`562`: Add support for module ``__getattr__`` and ``__dir__``. Implemented -by Ivan Levkivskyi. - -.. - -.. bpo: 31901 -.. date: 2017-11-28-15-04-14 -.. nonce: mDeCLK -.. section: Core and Builtins - -The `atexit` module now has its callback stored per interpreter. - -.. - -.. bpo: 31650 -.. date: 2017-11-26-14-38-44 -.. nonce: JWf_Im -.. section: Core and Builtins - -Implement :pep:`552` (Deterministic pycs). Python now supports invalidating -bytecode cache files bashed on a source content hash rather than source -last-modified time. - -.. - -.. bpo: 29469 -.. date: 2017-07-26-00-20-15 -.. nonce: potmyI -.. section: Core and Builtins - -Move constant folding from bytecode layer to AST layer. Original patch by -Eugene Toder. - -.. - -.. bpo: 32506 -.. date: 2018-01-07-11-32-42 -.. nonce: MaT-zU -.. section: Library - -Now that dict is defined as keeping insertion order, drop OrderedDict and -just use plain dict. - -.. - -.. bpo: 32279 -.. date: 2018-01-06-16-50-11 -.. nonce: 1xOpU8 -.. section: Library - -Add params to dataclasses.make_dataclasses(): init, repr, eq, order, hash, -and frozen. Pass them through to dataclass(). - -.. - -.. bpo: 32278 -.. date: 2018-01-06-15-15-34 -.. nonce: bGnGc0 -.. section: Library - -Make type information optional on dataclasses.make_dataclass(). If omitted, -the string 'typing.Any' is used. - -.. - -.. bpo: 32499 -.. date: 2018-01-06-10-54-16 -.. nonce: koyY-4 -.. section: Library - -Add dataclasses.is_dataclass(obj), which returns True if obj is a dataclass -or an instance of one. - -.. - -.. bpo: 32468 -.. date: 2017-12-31-20-32-58 -.. nonce: YBs__0 -.. section: Library - -Improve frame repr() to mention filename, code name and current line number. - -.. - -.. bpo: 23749 -.. date: 2017-12-29-00-44-42 -.. nonce: QL1Cxd -.. section: Library - -asyncio: Implement loop.start_tls() - -.. - -.. bpo: 32441 -.. date: 2017-12-28-21-30-40 -.. nonce: LqlboJ -.. section: Library - -Return the new file descriptor (i.e., the second argument) from ``os.dup2``. -Previously, ``None`` was always returned. - -.. - -.. bpo: 32422 -.. date: 2017-12-25-20-22-47 -.. nonce: 5H3Wq2 -.. section: Library - -``functools.lru_cache`` uses less memory (3 words for each cached key) and -takes about 1/3 time for cyclic GC. - -.. - -.. bpo: 31721 -.. date: 2017-12-25-11-09-46 -.. nonce: 5gM972 -.. section: Library - -Prevent Python crash from happening when Future._log_traceback is set to -True manually. Now it can only be set to False, or a ValueError is raised. - -.. - -.. bpo: 32415 -.. date: 2017-12-23-12-45-00 -.. nonce: YufXTU -.. section: Library - -asyncio: Add Task.get_loop() and Future.get_loop() - -.. - -.. bpo: 26133 -.. date: 2017-12-21-11-08-42 -.. nonce: mt81QV -.. section: Library - -Don't unsubscribe signals in asyncio UNIX event loop on interpreter -shutdown. - -.. - -.. bpo: 32363 -.. date: 2017-12-19-00-37-28 -.. nonce: YTeGU0 -.. section: Library - -Make asyncio.Task.set_exception() and set_result() raise -NotImplementedError. Task._step() and Future.__await__() raise proper -exceptions when they are in an invalid state, instead of raising an -AssertionError. - -.. - -.. bpo: 32357 -.. date: 2017-12-18-00-36-41 -.. nonce: t1F3sn -.. section: Library - -Optimize asyncio.iscoroutine() and loop.create_task() for non-native -coroutines (e.g. async/await compiled with Cython). -'loop.create_task(python_coroutine)' used to be 20% faster than -'loop.create_task(cython_coroutine)'. Now, the latter is as fast. - -.. - -.. bpo: 32356 -.. date: 2017-12-17-22-50-51 -.. nonce: roZJpA -.. section: Library - -asyncio.transport.resume_reading() and pause_reading() are now idempotent. -New transport.is_reading() method is added. - -.. - -.. bpo: 32355 -.. date: 2017-12-17-21-42-24 -.. nonce: tbaTWA -.. section: Library - -Optimize asyncio.gather(); now up to 15% faster. - -.. - -.. bpo: 32351 -.. date: 2017-12-17-14-23-23 -.. nonce: 95fh2K -.. section: Library - -Use fastpath in asyncio.sleep if delay<0 (2x boost) - -.. - -.. bpo: 32348 -.. date: 2017-12-16-18-50-57 -.. nonce: 5j__he -.. section: Library - -Optimize asyncio.Future schedule/add/remove callback. The optimization -shows 3-6% performance improvements of async/await code. - -.. - -.. bpo: 32331 -.. date: 2017-12-15-23-48-43 -.. nonce: fIg1Uc -.. section: Library - -Fix socket.settimeout() and socket.setblocking() to keep socket.type as is. -Fix socket.socket() constructor to reset any bit flags applied to socket's -type. This change only affects OSes that have SOCK_NONBLOCK and/or -SOCK_CLOEXEC. - -.. - -.. bpo: 32248 -.. date: 2017-12-15-15-34-12 -.. nonce: zmO8G2 -.. section: Library - -Add :class:`importlib.abc.ResourceReader` as an ABC for loaders to provide a -unified API for reading resources contained within packages. Also add -:mod:`importlib.resources` as the port of ``importlib_resources``. - -.. - -.. bpo: 32311 -.. date: 2017-12-14-17-28-54 -.. nonce: DL5Ytn -.. section: Library - -Implement asyncio.create_task(coro) shortcut - -.. - -.. bpo: 32327 -.. date: 2017-12-14-16-00-25 -.. nonce: bbkSxA -.. section: Library - -Convert asyncio functions that were documented as coroutines to coroutines. -Affected functions: loop.sock_sendall, loop.sock_recv, loop.sock_accept, -loop.getaddrinfo, loop.getnameinfo. - -.. - -.. bpo: 32323 -.. date: 2017-12-14-10-10-10 -.. nonce: ideco -.. section: Library - -:func:`urllib.parse.urlsplit()` does not convert zone-id (scope) to lower -case for scoped IPv6 addresses in hostnames now. - -.. - -.. bpo: 32302 -.. date: 2017-12-13-22-38-08 -.. nonce: othtTr -.. section: Library - -Fix bdist_wininst of distutils for CRT v142: it binary compatible with CRT -v140. - -.. - -.. bpo: 29711 -.. date: 2017-12-13-22-10-36 -.. nonce: hJjghA -.. section: Library - -Fix ``stop_serving`` in asyncio proactor loop kill all listening servers - -.. - -.. bpo: 32308 -.. date: 2017-12-13-20-31-30 -.. nonce: CUbsb2 -.. section: Library - -:func:`re.sub()` now replaces empty matches adjacent to a previous non-empty -match. - -.. - -.. bpo: 29970 -.. date: 2017-12-13-19-02-38 -.. nonce: uxVOpk -.. section: Library - -Abort asyncio SSLProtocol connection if handshake not complete within 10s - -.. - -.. bpo: 32314 -.. date: 2017-12-13-16-47-38 -.. nonce: W4_U2j -.. section: Library - -Implement asyncio.run(). - -.. - -.. bpo: 17852 -.. date: 2017-12-13-00-00-37 -.. nonce: Q8BP8N -.. section: Library - -Revert incorrect fix based on misunderstanding of _Py_PyAtExit() semantics. - -.. - -.. bpo: 32296 -.. date: 2017-12-12-18-01-01 -.. nonce: bwscHz -.. section: Library - -Implement asyncio._get_running_loop() and get_event_loop() in C. This makes -them 4x faster. - -.. - -.. bpo: 32250 -.. date: 2017-12-12-16-58-20 -.. nonce: UljTa0 -.. section: Library - -Implement ``asyncio.current_task()`` and ``asyncio.all_tasks()``. Add -helpers intended to be used by alternative task implementations: -``asyncio._register_task``, ``asyncio._enter_task``, ``asyncio._leave_task`` -and ``asyncio._unregister_task``. Deprecate ``asyncio.Task.current_task()`` -and ``asyncio.Task.all_tasks()``. - -.. - -.. bpo: 32255 -.. date: 2017-12-12-07-29-06 -.. nonce: 2bfNmM -.. section: Library - -A single empty field is now always quoted when written into a CSV file. This -allows to distinguish an empty row from a row consisting of a single empty -field. Patch by Licht Takeuchi. - -.. - -.. bpo: 32277 -.. date: 2017-12-11-09-53-14 -.. nonce: jkKiVC -.. section: Library - -Raise ``NotImplementedError`` instead of ``SystemError`` on platforms where -``chmod(..., follow_symlinks=False)`` is not supported. Patch by Anthony -Sottile. - -.. - -.. bpo: 30050 -.. date: 2017-12-10-23-44-56 -.. nonce: 4SZ3lY -.. section: Library - -New argument warn_on_full_buffer to signal.set_wakeup_fd lets you control -whether Python prints a warning on stderr when the wakeup fd buffer -overflows. - -.. - -.. bpo: 29137 -.. date: 2017-12-10-21-19-14 -.. nonce: CFcON1 -.. section: Library - -The ``fpectl`` library has been removed. It was never enabled by default, -never worked correctly on x86-64, and it changed the Python ABI in ways that -caused unexpected breakage of C extensions. - -.. - -.. bpo: 32273 -.. date: 2017-12-10-19-14-55 -.. nonce: 5KKlCv -.. section: Library - -Move asyncio.test_utils to test.test_asyncio. - -.. - -.. bpo: 32272 -.. date: 2017-12-10-18-59-13 -.. nonce: Mu84Am -.. section: Library - -Remove asyncio.async() function. - -.. - -.. bpo: 32269 -.. date: 2017-12-10-12-30-13 -.. nonce: Q85pKj -.. section: Library - -Add asyncio.get_running_loop() function. - -.. - -.. bpo: 32265 -.. date: 2017-12-10-00-57-51 -.. nonce: kELtTE -.. section: Library - -All class and static methods of builtin types now are correctly classified -by inspect.classify_class_attrs() and grouped in pydoc ouput. Added -types.ClassMethodDescriptorType for unbound class methods of builtin types. - -.. - -.. bpo: 32253 -.. date: 2017-12-09-11-30-35 -.. nonce: TQHSYF -.. section: Library - -Deprecate ``yield from lock``, ``await lock``, ``with (yield from lock)`` -and ``with await lock`` for asyncio synchronization primitives. - -.. - -.. bpo: 22589 -.. date: 2017-12-08-15-09-41 -.. nonce: 8ouqI6 -.. section: Library - -Changed MIME type of .bmp from 'image/x-ms-bmp' to 'image/bmp' - -.. - -.. bpo: 32193 -.. date: 2017-12-08-11-02-26 -.. nonce: NJe_TQ -.. section: Library - -Convert asyncio to use *async/await* syntax. Old styled ``yield from`` is -still supported too. - -.. - -.. bpo: 32206 -.. date: 2017-12-07-13-14-40 -.. nonce: obm4OM -.. section: Library - -Add support to run modules with pdb - -.. - -.. bpo: 32227 -.. date: 2017-12-05-13-25-15 -.. nonce: 3vnWFS -.. section: Library - -``functools.singledispatch`` now supports registering implementations using -type annotations. - -.. - -.. bpo: 15873 -.. date: 2017-12-04-17-41-40 -.. nonce: -T4TRK -.. section: Library - -Added new alternate constructors :meth:`datetime.datetime.fromisoformat`, -:meth:`datetime.time.fromisoformat` and :meth:`datetime.date.fromisoformat` -as the inverse operation of each classes's respective ``isoformat`` methods. - -.. - -.. bpo: 32199 -.. date: 2017-12-04-12-23-26 -.. nonce: nGof4v -.. section: Library - -The getnode() ip getter now uses 'ip link' instead of 'ip link list'. - -.. - -.. bpo: 32143 -.. date: 2017-11-26-17-28-26 -.. nonce: o7YdXL -.. section: Library - -os.statvfs() includes the f_fsid field from statvfs(2) - -.. - -.. bpo: 26439 -.. date: 2017-11-24-08-35-43 -.. nonce: IC45_f -.. section: Library - -Fix ctypes.util.find_library() for AIX by implementing -ctypes._aix.find_library() Patch by: Michael Felt - -.. - -.. bpo: 31993 -.. date: 2017-11-10-00-05-08 -.. nonce: -OMNg8 -.. section: Library - -The pickler now uses less memory when serializing large bytes and str -objects into a file. Pickles created with protocol 4 will require less -memory for unpickling large bytes and str objects. - -.. - -.. bpo: 27456 -.. date: 2017-11-02-11-57-41 -.. nonce: snzyTC -.. section: Library - -Ensure TCP_NODELAY is set on Linux. Tests by Victor Stinner. - -.. - -.. bpo: 31778 -.. date: 2017-10-18-17-29-30 -.. nonce: B6vAkP -.. section: Library - -ast.literal_eval() is now more strict. Addition and subtraction of arbitrary -numbers no longer allowed. - -.. - -.. bpo: 31802 -.. date: 2017-10-17-14-52-14 -.. nonce: sYj2Zv -.. section: Library - -Importing native path module (``posixpath``, ``ntpath``) now works even if -the ``os`` module still is not imported. - -.. - -.. bpo: 30241 -.. date: 2017-10-10-18-56-46 -.. nonce: F_go20 -.. section: Library - -Add contextlib.AbstractAsyncContextManager. Patch by Jelle Zijlstra. - -.. - -.. bpo: 31699 -.. date: 2017-10-05-11-06-32 -.. nonce: MF47Y6 -.. section: Library - -Fix deadlocks in :class:`concurrent.futures.ProcessPoolExecutor` when task -arguments or results cause pickling or unpickling errors. This should make -sure that calls to the :class:`ProcessPoolExecutor` API always eventually -return. - -.. - -.. bpo: 15216 -.. date: 2017-09-16-02-56-33 -.. nonce: lqXCTT -.. section: Library - -``TextIOWrapper.reconfigure()`` supports changing *encoding*, *errors*, and -*newline*. - -.. - -.. bpo: 32418 -.. date: 2017-12-24-17-29-37 -.. nonce: eZe-ID -.. section: Documentation - -Add get_loop() method to Server and AbstractServer classes. - -.. - -.. bpo: 32252 -.. date: 2017-12-11-13-31-33 -.. nonce: YnFw7J -.. section: Tests - -Fix faulthandler_suppress_crash_report() used to prevent core dump files -when testing crashes. getrlimit() returns zero on success. - -.. - -.. bpo: 32002 -.. date: 2017-11-11-16-35-18 -.. nonce: itDxIo -.. section: Tests - -Adjust C locale coercion testing for the empty locale and POSIX locale cases -to more readily adjust to platform dependent behaviour. - -.. - -.. bpo: 19764 -.. date: 2017-08-18-18-00-24 -.. nonce: ODpc9y -.. section: Windows - -Implement support for `subprocess.Popen(close_fds=True)` on Windows. Patch -by Segev Finer. - -.. - -.. bpo: 24960 -.. date: 2017-12-22-09-25-51 -.. nonce: TGdAgO -.. section: Tools/Demos - -2to3 and lib2to3 can now read pickled grammar files using pkgutil.get_data() -rather than probing the filesystem. This lets 2to3 and lib2to3 work when run -from a zipfile. - -.. - -.. bpo: 32030 -.. date: 2017-12-20-23-22-32 -.. nonce: d1dcwh -.. section: C API - -Py_Initialize() doesn't reset the memory allocators to default if the -``PYTHONMALLOC`` environment variable is not set. - -.. - -.. bpo: 29084 -.. date: 2017-12-16-09-59-35 -.. nonce: ZGJ-LJ -.. section: C API - -Undocumented C API for OrderedDict has been excluded from the limited C API. -It was added by mistake and actually never worked in the limited C API. - -.. - -.. bpo: 32264 -.. date: 2017-12-12-23-09-46 -.. nonce: ahRlOI -.. section: C API - -Moved the pygetopt.h header into internal/, since it has no public APIs. - -.. - -.. bpo: 32241 -.. date: 2017-12-07-15-58-15 -.. nonce: LbyQt6 -.. section: C API - -:c:func:`Py_SetProgramName` and :c:func:`Py_SetPythonHome` now take the -``const wchar *`` arguments instead of ``wchar *``. diff --git a/Misc/NEWS.d/3.7.0b1.rst b/Misc/NEWS.d/3.7.0b1.rst deleted file mode 100644 index d1beec9cdcc33aedbf50d838330b6df75443c842..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.7.0b1.rst +++ /dev/null @@ -1,878 +0,0 @@ -.. bpo: 32703 -.. date: 2018-01-29-01-15-17 -.. nonce: mwrF4- -.. release date: 2018-01-30 -.. section: Core and Builtins - -Fix coroutine's ResourceWarning when there's an active error set when it's -being finalized. - -.. - -.. bpo: 32650 -.. date: 2018-01-28-23-01-39 -.. nonce: Bbi7ek -.. section: Core and Builtins - -Pdb and other debuggers dependent on bdb.py will correctly step over (next -command) native coroutines. Patch by Pablo Galindo. - -.. - -.. bpo: 28685 -.. date: 2018-01-28-15-09-33 -.. nonce: cHThLM -.. section: Core and Builtins - -Optimize list.sort() and sorted() by using type specialized comparisons when -possible. - -.. - -.. bpo: 32685 -.. date: 2018-01-28-12-25-06 -.. nonce: nGctze -.. section: Core and Builtins - -Improve suggestion when the Python 2 form of print statement is either -present on the same line as the header of a compound statement or else -terminated by a semi-colon instead of a newline. Patch by Nitish Chandra. - -.. - -.. bpo: 32697 -.. date: 2018-01-28-09-52-12 -.. nonce: RHlu6k -.. section: Core and Builtins - -Python now explicitly preserves the definition order of keyword-only -parameters. It's always preserved their order, but this behavior was never -guaranteed before; this behavior is now guaranteed and tested. - -.. - -.. bpo: 32690 -.. date: 2018-01-28-09-26-07 -.. nonce: 8i9g5P -.. section: Core and Builtins - -The locals() dictionary now displays in the lexical order that variables -were defined. Previously, the order was reversed. - -.. - -.. bpo: 32677 -.. date: 2018-01-26-20-11-09 -.. nonce: xTGfCq -.. section: Core and Builtins - -Add ``.isascii()`` method to ``str``, ``bytes`` and ``bytearray``. It can be -used to test that string contains only ASCII characters. - -.. - -.. bpo: 32670 -.. date: 2018-01-25-17-03-46 -.. nonce: YsqJUC -.. section: Core and Builtins - -Enforce :pep:`479` for all code. -This means that manually raising a StopIteration exception from a generator -is prohibited for all code, regardless of whether 'from __future__ import -generator_stop' was used or not. - -.. - -.. bpo: 32591 -.. date: 2018-01-20-00-50-33 -.. nonce: 666kl6 -.. section: Core and Builtins - -Added built-in support for tracking the origin of coroutine objects; see -sys.set_coroutine_origin_tracking_depth and CoroutineType.cr_origin. This -replaces the asyncio debug mode's use of coroutine wrapping for native -coroutine objects. - -.. - -.. bpo: 31368 -.. date: 2018-01-19-01-54-22 -.. nonce: kzKqUR -.. section: Core and Builtins - -Expose preadv and pwritev system calls in the os module. Patch by Pablo -Galindo - -.. - -.. bpo: 32544 -.. date: 2018-01-16-18-51-58 -.. nonce: ga-cFE -.. section: Core and Builtins - -``hasattr(obj, name)`` and ``getattr(obj, name, default)`` are about 4 times -faster than before when ``name`` is not found and ``obj`` doesn't override -``__getattr__`` or ``__getattribute__``. - -.. - -.. bpo: 26163 -.. date: 2018-01-14-20-32-47 -.. nonce: xv9Iuv -.. section: Core and Builtins - -Improved frozenset() hash to create more distinct hash values when faced -with datasets containing many similar values. - -.. - -.. bpo: 32550 -.. date: 2018-01-14-12-42-17 -.. nonce: k0EK-4 -.. section: Core and Builtins - -Remove the STORE_ANNOTATION bytecode. - -.. - -.. bpo: 20104 -.. date: 2018-01-06-01-14-53 -.. nonce: 9DkKb8 -.. section: Core and Builtins - -Expose posix_spawn as a low level API in the os module. -(removed before 3.7.0rc1) - -.. - -.. bpo: 24340 -.. date: 2018-01-01-21-59-31 -.. nonce: hmKBvg -.. section: Core and Builtins - -Fixed estimation of the code stack size. - -.. - -.. bpo: 32436 -.. date: 2017-12-28-00-20-42 -.. nonce: H159Jv -.. section: Core and Builtins - -Implement :pep:`567` Context Variables. - -.. - -.. bpo: 18533 -.. date: 2017-12-13-16-46-23 -.. nonce: Dlk8d7 -.. section: Core and Builtins - -``repr()`` on a dict containing its own ``values()`` or ``items()`` no -longer raises ``RecursionError``; OrderedDict similarly. Instead, use -``...``, as for other recursive structures. Patch by Ben North. - -.. - -.. bpo: 20891 -.. date: 2017-12-04-18-34-11 -.. nonce: C2TsfR -.. section: Core and Builtins - -Py_Initialize() now creates the GIL. The GIL is no longer created "on -demand" to fix a race condition when PyGILState_Ensure() is called in a -non-Python thread. - -.. - -.. bpo: 32028 -.. date: 2017-12-03-22-29-13 -.. nonce: KC2w4Q -.. section: Core and Builtins - -Leading whitespace is now correctly ignored when generating suggestions for -converting Py2 print statements to Py3 builtin print function calls. Patch -by Sanyam Khurana. - -.. - -.. bpo: 31179 -.. date: 2017-08-10-17-32-48 -.. nonce: XcgLYI -.. section: Core and Builtins - -Make dict.copy() up to 5.5 times faster. - -.. - -.. bpo: 31113 -.. date: 2017-08-07-16-46-56 -.. nonce: XgNEFg -.. section: Core and Builtins - -Get rid of recursion in the compiler for normal control flow. - -.. - -.. bpo: 25988 -.. date: 2018-01-28-23-48-45 -.. nonce: I9uBct -.. section: Library - -Deprecate exposing the contents of collections.abc in the regular -collections module. - -.. - -.. bpo: 31429 -.. date: 2018-01-28-22-40-05 -.. nonce: qNt8rQ -.. section: Library - -The default cipher suite selection of the ssl module now uses a blacklist -approach rather than a hard-coded whitelist. Python no longer re-enables -ciphers that have been blocked by OpenSSL security update. Default cipher -suite selection can be configured on compile time. - -.. - -.. bpo: 30306 -.. date: 2018-01-28-14-10-51 -.. nonce: TmKMXi -.. section: Library - -contextlib.contextmanager now releases the arguments passed to the -underlying generator as soon as the context manager is entered. Previously -it would keep them alive for as long as the context manager was alive, even -when not being used as a function decorator. Patch by Martin Teichmann. - -.. - -.. bpo: 21417 -.. date: 2018-01-28-07-55-10 -.. nonce: JFnV99 -.. section: Library - -Added support for setting the compression level for zipfile.ZipFile. - -.. - -.. bpo: 32251 -.. date: 2018-01-28-01-21-47 -.. nonce: fOA5qB -.. section: Library - -Implement asyncio.BufferedProtocol (provisional API). - -.. - -.. bpo: 32513 -.. date: 2018-01-27-11-20-16 -.. nonce: ak-iD2 -.. section: Library - -In dataclasses, allow easier overriding of dunder methods without specifying -decorator parameters. - -.. - -.. bpo: 32660 -.. date: 2018-01-26-01-26-00 -.. nonce: tVJIWV -.. section: Library - -:mod:`termios` makes available ``FIONREAD``, ``FIONCLEX``, ``FIOCLEX``, -``FIOASYNC`` and ``FIONBIO`` also under Solaris/derivatives. - -.. - -.. bpo: 27931 -.. date: 2018-01-25-21-04-11 -.. nonce: e4r52t -.. section: Library - -Fix email address header parsing error when the username is an empty quoted -string. Patch by Xiang Zhang. - -.. - -.. bpo: 32659 -.. date: 2018-01-25-03-46-00 -.. nonce: VHYoON -.. section: Library - -Under Solaris and derivatives, :class:`os.stat_result` provides a st_fstype -attribute. - -.. - -.. bpo: 32662 -.. date: 2018-01-25-01-45-30 -.. nonce: oabhd8 -.. section: Library - -Implement Server.start_serving(), Server.serve_forever(), and -Server.is_serving() methods. Add 'start_serving' keyword parameter to -loop.create_server() and loop.create_unix_server(). - -.. - -.. bpo: 32391 -.. date: 2018-01-24-15-20-12 -.. nonce: 0f8MY9 -.. section: Library - -Implement :meth:`asyncio.StreamWriter.wait_closed` and -:meth:`asyncio.StreamWriter.is_closing` methods - -.. - -.. bpo: 32643 -.. date: 2018-01-24-00-32-58 -.. nonce: VWipsW -.. section: Library - -Make Task._step, Task._wakeup and Future._schedule_callbacks methods -private. - -.. - -.. bpo: 32630 -.. date: 2018-01-23-01-57-36 -.. nonce: 6KRHBs -.. section: Library - -Refactor decimal module to use contextvars to store decimal context. - -.. - -.. bpo: 32622 -.. date: 2018-01-22-18-18-44 -.. nonce: A1D6FP -.. section: Library - -Add :meth:`asyncio.AbstractEventLoop.sendfile` method. - -.. - -.. bpo: 32304 -.. date: 2018-01-21-16-33-53 -.. nonce: TItrNv -.. section: Library - -distutils' upload command no longer corrupts tar files ending with a CR -byte, and no longer tries to convert CR to CRLF in any of the upload text -fields. - -.. - -.. bpo: 32502 -.. date: 2018-01-20-17-15-34 -.. nonce: OXJfn7 -.. section: Library - -uuid.uuid1 no longer raises an exception if a 64-bit hardware address is -encountered. - -.. - -.. bpo: 32596 -.. date: 2018-01-19-19-57-45 -.. nonce: 4aVIie -.. section: Library - -``concurrent.futures`` imports ``ThreadPoolExecutor`` and -``ProcessPoolExecutor`` lazily (using :pep:`562`). It makes ``import -asyncio`` about 15% faster because asyncio uses only ``ThreadPoolExecutor`` -by default. - -.. - -.. bpo: 31801 -.. date: 2018-01-18-13-47-40 -.. nonce: 3UGH1h -.. section: Library - -Add ``_ignore_`` to ``Enum`` so temporary variables can be used during class -construction without being turned into members. - -.. - -.. bpo: 32576 -.. date: 2018-01-17-13-04-16 -.. nonce: iDL09t -.. section: Library - -Use queue.SimpleQueue() in places where it can be invoked from a weakref -callback. - -.. - -.. bpo: 32574 -.. date: 2018-01-16-20-37-28 -.. nonce: ru8eZ9 -.. section: Library - -Fix memory leak in asyncio.Queue, when the queue has limited size and it is -full, the cancelation of queue.put() can cause a memory leak. Patch by: José -Melero. - -.. - -.. bpo: 32521 -.. date: 2018-01-15-12-53-13 -.. nonce: IxX4Ba -.. section: Library - -The nis module is now compatible with new libnsl and headers location. - -.. - -.. bpo: 32467 -.. date: 2018-01-11-00-33-42 -.. nonce: YVEOv6 -.. section: Library - -collections.abc.ValuesView now inherits from collections.abc.Collection. - -.. - -.. bpo: 32473 -.. date: 2018-01-10-20-37-59 -.. nonce: mP_yJG -.. section: Library - -Improve ABCMeta._dump_registry() output readability - -.. - -.. bpo: 32102 -.. date: 2018-01-10-18-04-21 -.. nonce: 9-CZgD -.. section: Library - -New argument ``capture_output`` for subprocess.run - -.. - -.. bpo: 32521 -.. date: 2018-01-08-18-02-33 -.. nonce: Kh-KoN -.. section: Library - -glibc has removed Sun RPC. Use replacement libtirpc headers and library in -nis module. - -.. - -.. bpo: 32493 -.. date: 2018-01-08-15-53-37 -.. nonce: vTXxGN -.. section: Library - -UUID module fixes build for FreeBSD/OpenBSD - -.. - -.. bpo: 32503 -.. date: 2018-01-07-09-22-26 -.. nonce: ViMxpD -.. section: Library - -Pickling with protocol 4 no longer creates too small frames. - -.. - -.. bpo: 29237 -.. date: 2018-01-04-14-45-33 -.. nonce: zenYA6 -.. section: Library - -Create enum for pstats sorting options - -.. - -.. bpo: 32454 -.. date: 2017-12-30-10-38-05 -.. nonce: wsZnl- -.. section: Library - -Add close(fd) function to the socket module. - -.. - -.. bpo: 25942 -.. date: 2017-12-27-20-15-51 -.. nonce: Giyr8v -.. section: Library - -The subprocess module is now more graceful when handling a Ctrl-C -KeyboardInterrupt during subprocess.call, subprocess.run, or a Popen context -manager. It now waits a short amount of time for the child (presumed to -have also gotten the SIGINT) to exit, before continuing the -KeyboardInterrupt exception handling. This still includes a SIGKILL in the -call() and run() APIs, but at least the child had a chance first. - -.. - -.. bpo: 32433 -.. date: 2017-12-27-20-09-27 -.. nonce: vmxsVI -.. section: Library - -The hmac module now has hmac.digest(), which provides an optimized HMAC -digest. - -.. - -.. bpo: 28134 -.. date: 2017-12-24-20-01-09 -.. nonce: HJ8Beb -.. section: Library - -Sockets now auto-detect family, type and protocol from file descriptor by -default. - -.. - -.. bpo: 32404 -.. date: 2017-12-23-14-54-05 -.. nonce: yJqtlJ -.. section: Library - -Fix bug where :meth:`datetime.datetime.fromtimestamp` did not call __new__ -in :class:`datetime.datetime` subclasses. - -.. - -.. bpo: 32403 -.. date: 2017-12-23-14-51-46 -.. nonce: CVFapH -.. section: Library - -Improved speed of :class:`datetime.date` and :class:`datetime.datetime` -alternate constructors. - -.. - -.. bpo: 32228 -.. date: 2017-12-22-16-47-41 -.. nonce: waPx3q -.. section: Library - -Ensure that ``truncate()`` preserves the file position (as reported by -``tell()``) after writes longer than the buffer size. - -.. - -.. bpo: 32410 -.. date: 2017-12-22-16-05-01 -.. nonce: 8JzhvH -.. section: Library - -Implement ``loop.sock_sendfile`` for asyncio event loop. - -.. - -.. bpo: 22908 -.. date: 2017-12-21-22-00-11 -.. nonce: cVm89I -.. section: Library - -Added seek and tell to the ZipExtFile class. This only works if the file -object used to open the zipfile is seekable. - -.. - -.. bpo: 32373 -.. date: 2017-12-19-09-23-46 -.. nonce: 8qAkoW -.. section: Library - -Add socket.getblocking() method. - -.. - -.. bpo: 32248 -.. date: 2017-12-15-15-34-12 -.. nonce: zmO8G2 -.. section: Library - -Add :mod:`importlib.resources` and :class:`importlib.abc.ResourceReader` as -the unified API for reading resources contained within packages. Loaders -wishing to support resource reading must implement the -:meth:`get_resource_reader()` method. File-based and zipimport-based -loaders both implement these APIs. :class:`importlib.abc.ResourceLoader` is -deprecated in favor of these new APIs. - -.. - -.. bpo: 32320 -.. date: 2017-12-14-01-36-25 -.. nonce: jwOZlr -.. section: Library - -collections.namedtuple() now supports default values. - -.. - -.. bpo: 29302 -.. date: 2017-12-11-15-14-55 -.. nonce: Nczj9l -.. section: Library - -Add contextlib.AsyncExitStack. Patch by Alexander Mohr and Ilya Kulakov. - -.. - -.. bpo: 31961 -.. date: 2017-11-08-03-38-20 -.. nonce: x5Sv0R -.. section: Library - -*Removed in Python 3.7.0b2.* -The *args* argument of subprocess.Popen can now be a :term:`path-like -object`. If *args* is given as a sequence, it's first element can now be a -:term:`path-like object` as well. - -.. - -.. bpo: 31900 -.. date: 2017-10-30-15-55-32 -.. nonce: -S9xc4 -.. section: Library - -The :func:`locale.localeconv` function now sets temporarily the ``LC_CTYPE`` -locale to the ``LC_NUMERIC`` locale to decode ``decimal_point`` and -``thousands_sep`` byte strings if they are non-ASCII or longer than 1 byte, -and the ``LC_NUMERIC`` locale is different than the ``LC_CTYPE`` locale. -This temporary change affects other threads. -Same change for the :meth:`str.format` method when formatting a number -(:class:`int`, :class:`float`, :class:`float` and subclasses) with the ``n`` -type (ex: ``'{:n}'.format(1234)``). - -.. - -.. bpo: 31853 -.. date: 2017-10-23-22-55-51 -.. nonce: h5fjrP -.. section: Library - -Use super().method instead of socket.method in SSLSocket. They were there -most likely for legacy reasons. - -.. - -.. bpo: 31399 -.. date: 2017-09-08-14-05-33 -.. nonce: FtBrrt -.. section: Library - -The ssl module now uses OpenSSL's X509_VERIFY_PARAM_set1_host() and -X509_VERIFY_PARAM_set1_ip() API to verify hostname and IP addresses. Subject -common name fallback can be disabled with -SSLContext.hostname_checks_common_name. - -.. - -.. bpo: 14976 -.. date: 2017-09-07-19-12-47 -.. nonce: dx0Zxb -.. section: Library - -Add a queue.SimpleQueue class, an unbounded FIFO queue with a reentrant C -implementation of put(). - -.. - -.. bpo: 32724 -.. date: 2018-01-30-09-00-19 -.. nonce: qPIaM- -.. section: Documentation - -Add references to some commands in the documentation of Pdb. Patch by -Stéphane Wirtel - -.. - -.. bpo: 32649 -.. date: 2018-01-27-23-36-31 -.. nonce: o7qOjF -.. section: Documentation - -Complete the C API documentation, profiling and tracing part with the newly -added per-opcode events. - -.. - -.. bpo: 17799 -.. date: 2018-01-22-21-13-46 -.. nonce: rdZ-Vk -.. section: Documentation - -Explain real behaviour of sys.settrace and sys.setprofile and their C-API -counterparts regarding which type of events are received in each function. -Patch by Pablo Galindo Salgado. - -.. - -.. bpo: 32721 -.. date: 2018-01-29-21-30-44 -.. nonce: 2Bebm1 -.. section: Tests - -Fix test_hashlib to not fail if the _md5 module is not built. - -.. - -.. bpo: 28414 -.. date: 2018-01-28-21-19-13 -.. nonce: a6Onzt -.. section: Tests - -Add test cases for IDNA 2003 and 2008 host names. IDNA 2003 -internationalized host names are working since bpo-31399 has landed. IDNA -2008 are still broken. - -.. - -.. bpo: 32604 -.. date: 2018-01-26-21-29-09 -.. nonce: 7iazNx -.. section: Tests - -Add a new "_xxsubinterpreters" extension module that exposes the existing -subinterpreter C-API and a new cross-interpreter data sharing mechanism. The -module is primarily intended for more thorough testing of the existing -subinterpreter support. -Note that the _xxsubinterpreters module has been removed in 3.7.0rc1. - -.. - -.. bpo: 32602 -.. date: 2018-01-19-20-47-11 -.. nonce: dz41pq -.. section: Tests - -Add test certs and test for ECDSA cert and EC/RSA dual mode. - -.. - -.. bpo: 32549 -.. date: 2018-01-14-11-40-22 -.. nonce: fLwbVA -.. section: Tests - -On Travis CI, Python now Compiles and uses a local copy of OpenSSL 1.1.0g -for testing. - -.. - -.. bpo: 32635 -.. date: 2018-01-23-15-33-40 -.. nonce: qHwIZy -.. section: Build - -Fix segfault of the crypt module when libxcrypt is provided instead of -libcrypt at the system. - -.. - -.. bpo: 32598 -.. date: 2018-01-19-14-50-19 -.. nonce: hP7bMV -.. section: Build - -Use autoconf to detect OpenSSL libs, headers and supported features. The -ax_check_openssl M4 macro uses pkg-config to locate OpenSSL and falls back -to manual search. - -.. - -.. bpo: 32593 -.. date: 2018-01-18-11-10-52 -.. nonce: XIrf3v -.. section: Build - -Drop support of FreeBSD 9 and older. - -.. - -.. bpo: 29708 -.. date: 2018-01-16-08-32-49 -.. nonce: YCaHEx -.. section: Build - -If the :envvar:`SOURCE_DATE_EPOCH` environment variable is set, -:mod:`py_compile` will always create hash-based ``.pyc`` files. - -.. - -.. bpo: 32588 -.. date: 2018-01-18-14-56-45 -.. nonce: vHww6F -.. section: Windows - -Create standalone _distutils_findvs module and add missing _queue module to -installer. - -.. - -.. bpo: 29911 -.. date: 2018-01-07-12-33-21 -.. nonce: ewSJKb -.. section: Windows - -Ensure separate Modify and Uninstall buttons are displayed. - -.. - -.. bpo: 32507 -.. date: 2018-01-07-12-32-49 -.. nonce: vB4gxk -.. section: Windows - -Use app-local UCRT install rather than the proper update for old versions of -Windows. - -.. - -.. bpo: 32726 -.. date: 2018-01-30-07-13-10 -.. nonce: tcARLK -.. section: macOS - -Provide an additional, more modern macOS installer variant that supports -macOS 10.9+ systems in 64-bit mode only. Upgrade the supplied third-party -libraries to OpenSSL 1.1.0g and to SQLite 3.22.0. The 10.9+ installer now -links with and supplies its own copy of Tcl/Tk 8.6. - -.. - -.. bpo: 28440 -.. date: 2018-01-30-04-40-12 -.. nonce: W_BUWU -.. section: macOS - -No longer add /Library/Python/3.x/site-packages to sys.path for macOS -framework builds to avoid future conflicts. - -.. - -.. bpo: 32681 -.. date: 2018-01-26-17-29-29 -.. nonce: N1ruWa -.. section: C API - -Fix uninitialized variable 'res' in the C implementation of os.dup2. Patch -by Stéphane Wirtel - -.. - -.. bpo: 10381 -.. date: 2017-12-28-15-22-05 -.. nonce: a1E6aF -.. section: C API - -Add C API access to the ``datetime.timezone`` constructor and -``datetime.timzone.UTC`` singleton. diff --git a/Misc/NEWS.d/3.7.0b2.rst b/Misc/NEWS.d/3.7.0b2.rst deleted file mode 100644 index b2ade206bd5f970f3c6450e2d42612bfc51aa3ee..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.7.0b2.rst +++ /dev/null @@ -1,654 +0,0 @@ -.. bpo: 28414 -.. date: 2017-08-06-14-43-45 -.. nonce: mzZ6vD -.. release date: 2018-02-27 -.. section: Security - -The ssl module now allows users to perform their own IDN en/decoding when -using SNI. - -.. - -.. bpo: 32889 -.. date: 2018-02-20-21-53-48 -.. nonce: J6eWy5 -.. section: Core and Builtins - -Update Valgrind suppression list to account for the rename of -``Py_ADDRESS_IN_RANG`` to ``address_in_range``. - -.. - -.. bpo: 31356 -.. date: 2018-02-02-08-50-46 -.. nonce: MNwUOQ -.. section: Core and Builtins - -Remove the new API added in bpo-31356 (gc.ensure_disabled() context -manager). - -.. - -.. bpo: 32305 -.. date: 2018-02-01-10-56-41 -.. nonce: dkU9Qa -.. section: Core and Builtins - -For namespace packages, ensure that both ``__file__`` and -``__spec__.origin`` are set to None. - -.. - -.. bpo: 32303 -.. date: 2018-02-01-10-16-28 -.. nonce: VsvhSl -.. section: Core and Builtins - -Make sure ``__spec__.loader`` matches ``__loader__`` for namespace packages. - -.. - -.. bpo: 32711 -.. date: 2018-01-29-14-36-37 -.. nonce: 8hQFJP -.. section: Core and Builtins - -Fix the warning messages for Python/ast_unparse.c. Patch by Stéphane Wirtel - -.. - -.. bpo: 32583 -.. date: 2018-01-26-21-20-21 -.. nonce: Fh3fau -.. section: Core and Builtins - -Fix possible crashing in builtin Unicode decoders caused by write -out-of-bound errors when using customized decode error handlers. - -.. - -.. bpo: 32960 -.. date: 2018-02-26-20-04-40 -.. nonce: 48r0Ml -.. section: Library - -For dataclasses, disallow inheriting frozen from non-frozen classes, and -also disallow inheriting non-frozen from frozen classes. This restriction -will be relaxed at a future date. - -.. - -.. bpo: 32713 -.. date: 2018-02-26-13-16-36 -.. nonce: 55yegW -.. section: Library - -Fixed tarfile.itn handling of out-of-bounds float values. Patch by Joffrey -Fuhrer. - -.. - -.. bpo: 32951 -.. date: 2018-02-25-18-22-01 -.. nonce: gHrCXq -.. section: Library - -Direct instantiation of SSLSocket and SSLObject objects is now prohibited. -The constructors were never documented, tested, or designed as public -constructors. Users were suppose to use ssl.wrap_socket() or SSLContext. - -.. - -.. bpo: 32929 -.. date: 2018-02-25-13-47-48 -.. nonce: X2gTDH -.. section: Library - -Remove the tri-state parameter "hash", and add the boolean "unsafe_hash". If -unsafe_hash is True, add a __hash__ function, but if a __hash__ exists, -raise TypeError. If unsafe_hash is False, add a __hash__ based on the -values of eq= and frozen=. The unsafe_hash=False behavior is the same as -the old hash=None behavior. unsafe_hash=False is the default, just as -hash=None used to be. - -.. - -.. bpo: 32947 -.. date: 2018-02-25-13-06-21 -.. nonce: mqStVW -.. section: Library - -Add OP_ENABLE_MIDDLEBOX_COMPAT and test workaround for TLSv1.3 for future -compatibility with OpenSSL 1.1.1. - -.. - -.. bpo: 30622 -.. date: 2018-02-24-21-40-42 -.. nonce: dQjxSe -.. section: Library - -The ssl module now detects missing NPN support in LibreSSL. - -.. - -.. bpo: 32922 -.. date: 2018-02-23-19-12-04 -.. nonce: u-xe0B -.. section: Library - -dbm.open() now encodes filename with the filesystem encoding rather than -default encoding. - -.. - -.. bpo: 32859 -.. date: 2018-02-19-17-46-31 -.. nonce: kAT-Xp -.. section: Library - -In ``os.dup2``, don't check every call whether the ``dup3`` syscall exists -or not. - -.. - -.. bpo: 32556 -.. date: 2018-02-19-14-27-51 -.. nonce: CsRsgr -.. section: Library - -nt._getfinalpathname, nt._getvolumepathname and nt._getdiskusage now -correctly convert from bytes. - -.. - -.. bpo: 25988 -.. date: 2018-02-18-13-04-59 -.. nonce: ACidKC -.. section: Library - -Emit a :exc:`DeprecationWarning` when using or importing an ABC directly -from :mod:`collections` rather than from :mod:`collections.abc`. - -.. - -.. bpo: 21060 -.. date: 2018-02-17-19-20-19 -.. nonce: S1Z-x6 -.. section: Library - -Rewrite confusing message from setup.py upload from "No dist file created in -earlier command" to the more helpful "Must create and upload files in one -command". - -.. - -.. bpo: 32852 -.. date: 2018-02-15-12-04-29 -.. nonce: HDqIxM -.. section: Library - -Make sure sys.argv remains as a list when running trace. - -.. - -.. bpo: 31333 -.. date: 2018-02-15-08-18-52 -.. nonce: 4fF-gM -.. section: Library - -``_abc`` module is added. It is a speedup module with C implementations for -various functions and methods in ``abc``. Creating an ABC subclass and -calling ``isinstance`` or ``issubclass`` with an ABC subclass are up to 1.5x -faster. In addition, this makes Python start-up up to 10% faster. -Note that the new implementation hides internal registry and caches, -previously accessible via private attributes ``_abc_registry``, -``_abc_cache``, and ``_abc_negative_cache``. There are three debugging -helper methods that can be used instead ``_dump_registry``, -``_abc_registry_clear``, and ``_abc_caches_clear``. - -.. - -.. bpo: 32841 -.. date: 2018-02-14-00-21-24 -.. nonce: bvHDOc -.. section: Library - -Fixed `asyncio.Condition` issue which silently ignored cancellation after -notifying and cancelling a conditional lock. Patch by Bar Harel. - -.. - -.. bpo: 32819 -.. date: 2018-02-11-15-54-41 -.. nonce: ZTRX2Q -.. section: Library - -ssl.match_hostname() has been simplified and no longer depends on re and -ipaddress module for wildcard and IP addresses. Error reporting for invalid -wildcards has been improved. - -.. - -.. bpo: 32394 -.. date: 2018-02-10-13-51-56 -.. nonce: dFM9SI -.. section: Library - -socket: Remove TCP_FASTOPEN,TCP_KEEPCNT,TCP_KEEPIDLE,TCP_KEEPINTVL flags on -older version Windows during run-time. - -.. - -.. bpo: 31787 -.. date: 2018-02-09-21-41-56 -.. nonce: owSZ2t -.. section: Library - -Fixed refleaks of ``__init__()`` methods in various modules. (Contributed by -Oren Milman) - -.. - -.. bpo: 30157 -.. date: 2018-02-09-14-44-43 -.. nonce: lEiiAK -.. section: Library - -Fixed guessing quote and delimiter in csv.Sniffer.sniff() when only the last -field is quoted. Patch by Jake Davis. - -.. - -.. bpo: 32792 -.. date: 2018-02-08-00-47-07 -.. nonce: NtyDb4 -.. section: Library - -collections.ChainMap() preserves the order of the underlying mappings. - -.. - -.. bpo: 32775 -.. date: 2018-02-07-19-12-10 -.. nonce: -T77_c -.. section: Library - -:func:`fnmatch.translate()` no longer produces patterns which contain set -operations. Sets starting with '[' or containing '--', '&&', '~~' or '||' -will be interpreted differently in regular expressions in future versions. -Currently they emit warnings. fnmatch.translate() now avoids producing -patterns containing such sets by accident. - -.. - -.. bpo: 32622 -.. date: 2018-02-06-17-58-15 -.. nonce: AE0Jz7 -.. section: Library - -Implement native fast sendfile for Windows proactor event loop. - -.. - -.. bpo: 32777 -.. date: 2018-02-05-21-28-28 -.. nonce: C-wIXF -.. section: Library - -Fix a rare but potential pre-exec child process deadlock in subprocess on -POSIX systems when marking file descriptors inheritable on exec in the child -process. This bug appears to have been introduced in 3.4. - -.. - -.. bpo: 32647 -.. date: 2018-02-05-13-31-42 -.. nonce: ktmfR_ -.. section: Library - -The ctypes module used to depend on indirect linking for dlopen. The shared -extension is now explicitly linked against libdl on platforms with dl. - -.. - -.. bpo: 32741 -.. date: 2018-02-01-17-54-08 -.. nonce: KUvOPL -.. section: Library - -Implement ``asyncio.TimerHandle.when()`` method. - -.. - -.. bpo: 32691 -.. date: 2018-02-01-15-53-35 -.. nonce: VLWVTq -.. section: Library - -Use mod_spec.parent when running modules with pdb - -.. - -.. bpo: 32734 -.. date: 2018-02-01-01-34-47 -.. nonce: gCV9AD -.. section: Library - -Fixed ``asyncio.Lock()`` safety issue which allowed acquiring and locking -the same lock multiple times, without it being free. Patch by Bar Harel. - -.. - -.. bpo: 32727 -.. date: 2018-01-30-17-46-18 -.. nonce: aHVsRC -.. section: Library - -Do not include name field in SMTP envelope from address. Patch by Stéphane -Wirtel - -.. - -.. bpo: 31453 -.. date: 2018-01-21-15-01-50 -.. nonce: cZiZBe -.. section: Library - -Add TLSVersion constants and SSLContext.maximum_version / minimum_version -attributes. The new API wraps OpenSSL 1.1 -https://www.openssl.org/docs/man1.1.0/ssl/SSL_CTX_set_min_proto_version.html -feature. - -.. - -.. bpo: 24334 -.. date: 2018-01-20-23-17-25 -.. nonce: GZuQLv -.. section: Library - -Internal implementation details of ssl module were cleaned up. The SSLSocket -has one less layer of indirection. Owner and session information are now -handled by the SSLSocket and SSLObject constructor. Channel binding -implementation has been simplified. - -.. - -.. bpo: 31848 -.. date: 2018-01-18-23-34-17 -.. nonce: M2cldy -.. section: Library - -Fix the error handling in Aifc_read.initfp() when the SSND chunk is not -found. Patch by Zackery Spytz. - -.. - -.. bpo: 32585 -.. date: 2018-01-18-13-09-00 -.. nonce: qpeijr -.. section: Library - -Add Ttk spinbox widget to :mod:`tkinter.ttk`. Patch by Alan D Moore. - -.. - -.. bpo: 32221 -.. date: 2017-12-06-10-10-10 -.. nonce: ideco_ -.. section: Library - -Various functions returning tuple containing IPv6 addresses now omit -``%scope`` part since the same information is already encoded in *scopeid* -tuple item. Especially this speeds up :func:`socket.recvfrom` when it -receives multicast packet since useless resolving of network interface name -is omitted. - -.. - -.. bpo: 30693 -.. date: 2017-11-27-15-09-49 -.. nonce: yC4mJ8 -.. section: Library - -The TarFile class now recurses directories in a reproducible way. - -.. - -.. bpo: 30693 -.. date: 2017-11-27-15-09-49 -.. nonce: yC4mJ7 -.. section: Library - -The ZipFile class now recurses directories in a reproducible way. - -.. - -.. bpo: 28124 -.. date: 2018-02-25-16-33-35 -.. nonce: _uzkgq -.. section: Documentation - -The ssl module function ssl.wrap_socket() has been de-emphasized and -deprecated in favor of the more secure and efficient -SSLContext.wrap_socket() method. - -.. - -.. bpo: 17232 -.. date: 2018-02-23-12-48-03 -.. nonce: tmuTKL -.. section: Documentation - -Clarify docs for -O and -OO. Patch by Terry Reedy. - -.. - -.. bpo: 32436 -.. date: 2018-02-14-11-10-41 -.. nonce: TTJ2jb -.. section: Documentation - -Add documentation for the contextvars module (PEP 567). - -.. - -.. bpo: 32800 -.. date: 2018-02-10-15-16-04 -.. nonce: FyrqCk -.. section: Documentation - -Update link to w3c doc for xml default namespaces. - -.. - -.. bpo: 11015 -.. date: 2018-02-10-12-48-38 -.. nonce: -gUf34 -.. section: Documentation - -Update :mod:`test.support` documentation. - -.. - -.. bpo: 8722 -.. date: 2018-02-03-06-11-37 -.. nonce: MPyVyj -.. section: Documentation - -Document :meth:`__getattr__` behavior when property :meth:`get` method -raises :exc:`AttributeError`. - -.. - -.. bpo: 32614 -.. date: 2018-02-02-07-41-57 -.. nonce: LSqzGw -.. section: Documentation - -Modify RE examples in documentation to use raw strings to prevent -:exc:`DeprecationWarning` and add text to REGEX HOWTO to highlight the -deprecation. - -.. - -.. bpo: 31972 -.. date: 2018-01-25-14-23-12 -.. nonce: w1m_8r -.. section: Documentation - -Improve docstrings for `pathlib.PurePath` subclasses. - -.. - -.. bpo: 31809 -.. date: 2017-10-18-18-07-45 -.. nonce: KlQrkE -.. section: Tests - -Add tests to verify connection with secp ECDH curves. - -.. - -.. bpo: 32898 -.. date: 2018-02-21-12-46-00 -.. nonce: M15bZh -.. section: Build - -Fix the python debug build when using COUNT_ALLOCS. - -.. - -.. bpo: 32901 -.. date: 2018-02-23-00-47-13 -.. nonce: mGKz5_ -.. section: Windows - -Update Tcl and Tk versions to 8.6.8 - -.. - -.. bpo: 31966 -.. date: 2018-02-19-13-54-42 -.. nonce: _Q3HPb -.. section: Windows - -Fixed WindowsConsoleIO.write() for writing empty data. - -.. - -.. bpo: 32409 -.. date: 2018-02-19-10-00-57 -.. nonce: nocuDg -.. section: Windows - -Ensures activate.bat can handle Unicode contents. - -.. - -.. bpo: 32457 -.. date: 2018-02-19-08-54-06 -.. nonce: vVP0Iz -.. section: Windows - -Improves handling of denormalized executable path when launching Python. - -.. - -.. bpo: 32370 -.. date: 2018-02-10-15-38-19 -.. nonce: kcKuct -.. section: Windows - -Use the correct encoding for ipconfig output in the uuid module. Patch by -Segev Finer. - -.. - -.. bpo: 29248 -.. date: 2018-02-07-17-50-48 -.. nonce: Xzwj-6 -.. section: Windows - -Fix :func:`os.readlink` on Windows, which was mistakenly treating the -``PrintNameOffset`` field of the reparse data buffer as a number of -characters instead of bytes. Patch by Craig Holmquist and SSE4. - -.. - -.. bpo: 32901 -.. date: 2018-02-27-17-33-15 -.. nonce: hQu0w3 -.. section: macOS - -Update macOS 10.9+ installer to Tcl/Tk 8.6.8. - -.. - -.. bpo: 32916 -.. date: 2018-02-23-07-32-36 -.. nonce: 4MsQ5F -.. section: IDLE - -Change ``str`` to ``code`` in pyparse. - -.. - -.. bpo: 32905 -.. date: 2018-02-22-00-09-27 -.. nonce: VlXj0x -.. section: IDLE - -Remove unused code in pyparse module. - -.. - -.. bpo: 32874 -.. date: 2018-02-19-10-56-41 -.. nonce: 6pZ9Gv -.. section: IDLE - -Add tests for pyparse. - -.. - -.. bpo: 32837 -.. date: 2018-02-12-17-22-48 -.. nonce: -33QPl -.. section: IDLE - -Using the system and place-dependent default encoding for open() is a bad -idea for IDLE's system and location-independent files. - -.. - -.. bpo: 32826 -.. date: 2018-02-12-11-05-22 -.. nonce: IxNZrk -.. section: IDLE - -Add "encoding=utf-8" to open() in IDLE's test_help_about. GUI test -test_file_buttons() only looks at initial ascii-only lines, but failed on -systems where open() defaults to 'ascii' because readline() internally reads -and decodes far enough ahead to encounter a non-ascii character in -CREDITS.txt. - -.. - -.. bpo: 32765 -.. date: 2018-02-04-17-52-54 -.. nonce: qm0eCu -.. section: IDLE - -Update configdialog General tab docstring to add new widgets to the widget -list. - -.. - -.. bpo: 32222 -.. date: 2017-12-07-20-51-20 -.. nonce: hPBcGT -.. section: Tools/Demos - -Fix pygettext not extracting docstrings for functions with type annotated -arguments. Patch by Toby Harradine. diff --git a/Misc/NEWS.d/3.7.0b3.rst b/Misc/NEWS.d/3.7.0b3.rst deleted file mode 100644 index 547fb50f5ecfdde9cad60360f97362a31abb68a4..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.7.0b3.rst +++ /dev/null @@ -1,541 +0,0 @@ -.. bpo: 33136 -.. date: 2018-03-25-12-05-43 -.. nonce: TzSN4x -.. release date: 2018-03-29 -.. section: Security - -Harden ssl module against LibreSSL CVE-2018-8970. -X509_VERIFY_PARAM_set1_host() is called with an explicit namelen. A new test -ensures that NULL bytes are not allowed. - -.. - -.. bpo: 33001 -.. date: 2018-03-05-10-09-51 -.. nonce: elj4Aa -.. section: Security - -Minimal fix to prevent buffer overrun in os.symlink on Windows - -.. - -.. bpo: 32981 -.. date: 2018-03-02-10-24-52 -.. nonce: O_qDyj -.. section: Security - -Regexes in difflib and poplib were vulnerable to catastrophic backtracking. -These regexes formed potential DOS vectors (REDOS). They have been -refactored. This resolves CVE-2018-1060 and CVE-2018-1061. Patch by Jamie -Davis. - -.. - -.. bpo: 33053 -.. date: 2018-03-25-19-49-06 -.. nonce: V3xlsH -.. section: Core and Builtins - -When using the -m switch, sys.path[0] is now explicitly expanded as the -*starting* working directory, rather than being left as the empty path -(which allows imports from the current working directory at the time of the -import) - -.. - -.. bpo: 33018 -.. date: 2018-03-22-23-09-06 -.. nonce: 0ncEJV -.. section: Core and Builtins - -Improve consistency of errors raised by ``issubclass()`` when called with a -non-class and an abstract base class as the first and second arguments, -respectively. Patch by Josh Bronson. - -.. - -.. bpo: 33041 -.. date: 2018-03-18-13-56-14 -.. nonce: XwPhI2 -.. section: Core and Builtins - -Fixed jumping when the function contains an ``async for`` loop. - -.. - -.. bpo: 33026 -.. date: 2018-03-08-09-48-38 -.. nonce: QZA3Ba -.. section: Core and Builtins - -Fixed jumping out of "with" block by setting f_lineno. - -.. - -.. bpo: 33005 -.. date: 2018-03-06-12-19-19 -.. nonce: LP-V2U -.. section: Core and Builtins - -Fix a crash on fork when using a custom memory allocator (ex: using -PYTHONMALLOC env var). _PyGILState_Reinit() and _PyInterpreterState_Enable() -now use the default RAW memory allocator to allocate a new interpreters -mutex on fork. - -.. - -.. bpo: 17288 -.. date: 2018-02-27-13-36-21 -.. nonce: Gdj24S -.. section: Core and Builtins - -Prevent jumps from 'return' and 'exception' trace events. - -.. - -.. bpo: 32836 -.. date: 2018-02-14-12-35-47 -.. nonce: bThJnx -.. section: Core and Builtins - -Don't use temporary variables in cases of list/dict/set comprehensions - -.. - -.. bpo: 33141 -.. date: 2018-03-26-12-33-13 -.. nonce: 23wlxf -.. section: Library - -Have Field objects pass through __set_name__ to their default values, if -they have their own __set_name__. - -.. - -.. bpo: 33096 -.. date: 2018-03-25-13-18-16 -.. nonce: ofdbe7 -.. section: Library - -Allow ttk.Treeview.insert to insert iid that has a false boolean value. Note -iid=0 and iid=False would be same. Patch by Garvit Khatri. - -.. - -.. bpo: 32873 -.. date: 2018-03-24-19-54-48 -.. nonce: cHyoAm -.. section: Library - -Treat type variables and special typing forms as immutable by copy and -pickle. This fixes several minor issues and inconsistencies, and improves -backwards compatibility with Python 3.6. - -.. - -.. bpo: 33134 -.. date: 2018-03-24-19-34-26 -.. nonce: hbVeIX -.. section: Library - -When computing dataclass's __hash__, use the lookup table to contain the -function which returns the __hash__ value. This is an improvement over -looking up a string, and then testing that string to see what to do. - -.. - -.. bpo: 33127 -.. date: 2018-03-24-15-08-24 -.. nonce: olJmHv -.. section: Library - -The ssl module now compiles with LibreSSL 2.7.1. - -.. - -.. bpo: 32505 -.. date: 2018-03-22-16-05-56 -.. nonce: YK1N8v -.. section: Library - -Raise TypeError if a member variable of a dataclass is of type Field, but -doesn't have a type annotation. - -.. - -.. bpo: 33078 -.. date: 2018-03-21-17-59-39 -.. nonce: PQOniT -.. section: Library - -Fix the failure on OSX caused by the tests relying on sem_getvalue - -.. - -.. bpo: 33116 -.. date: 2018-03-21-16-52-26 -.. nonce: Tvzerj -.. section: Library - -Add 'Field' to dataclasses.__all__. - -.. - -.. bpo: 32896 -.. date: 2018-03-20-20-53-21 -.. nonce: ewW3Ln -.. section: Library - -Fix an error where subclassing a dataclass with a field that uses a -default_factory would generate an incorrect class. - -.. - -.. bpo: 33100 -.. date: 2018-03-19-20-47-00 -.. nonce: chyIO4 -.. section: Library - -Dataclasses: If a field has a default value that's a MemberDescriptorType, -then it's from that field being in __slots__, not an actual default value. - -.. - -.. bpo: 32953 -.. date: 2018-03-18-17-38-48 -.. nonce: t8WAWN -.. section: Library - -If a non-dataclass inherits from a frozen dataclass, allow attributes to be -added to the derived class. Only attributes from the frozen dataclass -cannot be assigned to. Require all dataclasses in a hierarchy to be either -all frozen or all non-frozen. - -.. - -.. bpo: 33061 -.. date: 2018-03-16-16-07-33 -.. nonce: TRTTek -.. section: Library - -Add missing ``NoReturn`` to ``__all__`` in typing.py - -.. - -.. bpo: 33078 -.. date: 2018-03-15-07-38-00 -.. nonce: RmjUF5 -.. section: Library - -Fix the size handling in multiprocessing.Queue when a pickling error occurs. - -.. - -.. bpo: 33064 -.. date: 2018-03-12-19-58-25 -.. nonce: LO2KIY -.. section: Library - -lib2to3 now properly supports trailing commas after ``*args`` and -``**kwargs`` in function signatures. - -.. - -.. bpo: 33056 -.. date: 2018-03-12-16-40-00 -.. nonce: lNN9Eh -.. section: Library - -FIX properly close leaking fds in concurrent.futures.ProcessPoolExecutor. - -.. - -.. bpo: 33021 -.. date: 2018-03-12-00-27-56 -.. nonce: m19B9T -.. section: Library - -Release the GIL during fstat() calls, avoiding hang of all threads when -calling mmap.mmap(), os.urandom(), and random.seed(). Patch by Nir Soffer. - -.. - -.. bpo: 31804 -.. date: 2018-03-11-19-03-52 -.. nonce: i8KUMp -.. section: Library - -Avoid failing in multiprocessing.Process if the standard streams are closed -or None at exit. - -.. - -.. bpo: 33037 -.. date: 2018-03-09-23-07-07 -.. nonce: nAJ3at -.. section: Library - -Skip sending/receiving data after SSL transport closing. - -.. - -.. bpo: 27683 -.. date: 2018-03-07-22-28-17 -.. nonce: 572Rv4 -.. section: Library - -Fix a regression in :mod:`ipaddress` that result of :meth:`hosts` is empty -when the network is constructed by a tuple containing an integer mask and -only 1 bit left for addresses. - -.. - -.. bpo: 32999 -.. date: 2018-03-06-20-30-20 -.. nonce: lgFXWl -.. section: Library - -Fix C implementation of ``ABC.__subclasscheck__(cls, subclass)`` crashed when -``subclass`` is not a type object. - -.. - -.. bpo: 33009 -.. date: 2018-03-06-11-54-59 -.. nonce: -Ekysb -.. section: Library - -Fix inspect.signature() for single-parameter partialmethods. - -.. - -.. bpo: 32969 -.. date: 2018-03-06-00-19-41 -.. nonce: rGTKa0 -.. section: Library - -Expose several missing constants in zlib and fix corresponding -documentation. - -.. - -.. bpo: 32056 -.. date: 2018-03-01-17-49-56 -.. nonce: IlpfgE -.. section: Library - -Improved exceptions raised for invalid number of channels and sample width -when read an audio file in modules :mod:`aifc`, :mod:`wave` and -:mod:`sunau`. - -.. - -.. bpo: 32844 -.. date: 2018-02-28-13-08-00 -.. nonce: u8tnAe -.. section: Library - -Fix wrong redirection of a low descriptor (0 or 1) to stderr in subprocess -if another low descriptor is closed. - -.. - -.. bpo: 32857 -.. date: 2018-02-16-14-37-14 -.. nonce: -XljAx -.. section: Library - -In :mod:`tkinter`, ``after_cancel(None)`` now raises a :exc:`ValueError` -instead of canceling the first scheduled function. Patch by Cheryl Sabella. - -.. - -.. bpo: 31639 -.. date: 2017-12-27-21-55-19 -.. nonce: l3avDJ -.. section: Library - -http.server now exposes a ThreadedHTTPServer class and uses it when the -module is run with ``-m`` to cope with web browsers pre-opening sockets. - -.. - -.. bpo: 27645 -.. date: 2017-10-05-20-41-48 -.. nonce: 1Y_Wag -.. section: Library - -:class:`sqlite3.Connection` now exposes a -:class:`~sqlite3.Connection.backup` method, if the underlying SQLite library -is at version 3.6.11 or higher. Patch by Lele Gaifax. - -.. - -.. bpo: 33126 -.. date: 2018-03-28-17-03-17 -.. nonce: 5UGkNv -.. section: Documentation - -Document PyBuffer_ToContiguous(). - -.. - -.. bpo: 27212 -.. date: 2018-03-22-19-23-04 -.. nonce: wrE5KR -.. section: Documentation - -Modify documentation for the :func:`islice` recipe to consume initial values -up to the start index. - -.. - -.. bpo: 28247 -.. date: 2018-03-20-20-11-05 -.. nonce: -V-WS- -.. section: Documentation - -Update :mod:`zipapp` documentation to describe how to make standalone -applications. - -.. - -.. bpo: 18802 -.. date: 2018-03-11-18-53-47 -.. nonce: JhAqH3 -.. section: Documentation - -Documentation changes for ipaddress. Patch by Jon Foster and Berker Peksag. - -.. - -.. bpo: 27428 -.. date: 2018-03-11-00-16-56 -.. nonce: B7A8FT -.. section: Documentation - -Update documentation to clarify that ``WindowsRegistryFinder`` implements -``MetaPathFinder``. (Patch by Himanshu Lakhara) - -.. - -.. bpo: 32872 -.. date: 2018-03-28-01-35-02 -.. nonce: J5NDUj -.. section: Tests - -Avoid regrtest compatibility issue with namespace packages. - -.. - -.. bpo: 32517 -.. date: 2018-03-09-07-05-12 -.. nonce: ugc1iW -.. section: Tests - -Fix failing ``test_asyncio`` on macOS 10.12.2+ due to transport of -``KqueueSelector`` loop was not being closed. - -.. - -.. bpo: 19417 -.. date: 2018-01-08-13-33-47 -.. nonce: 2asoXy -.. section: Tests - -Add test_bdb.py. - -.. - -.. bpo: 33163 -.. date: 2018-03-28-04-15-03 -.. nonce: hfpWuU -.. section: Build - -Upgrade pip to 9.0.3 and setuptools to v39.0.1. - -.. - -.. bpo: 33016 -.. date: 2018-03-07-01-33-33 -.. nonce: Z_Med0 -.. section: Windows - -Fix potential use of uninitialized memory in nt._getfinalpathname - -.. - -.. bpo: 32903 -.. date: 2018-02-28-11-03-24 -.. nonce: 1SXY4t -.. section: Windows - -Fix a memory leak in os.chdir() on Windows if the current directory is set -to a UNC path. - -.. - -.. bpo: 32726 -.. date: 2018-03-29-06-56-12 -.. nonce: urS9uX -.. section: macOS - -Build and link with private copy of Tcl/Tk 8.6 for the macOS 10.6+ -installer. The 10.9+ installer variant already does this. This means that -the Python 3.7 provided by the python.org macOS installers no longer need or -use any external versions of Tcl/Tk, either system-provided or -user-installed, such as ActiveTcl. - -.. - -.. bpo: 32984 -.. date: 2018-03-05-01-29-05 -.. nonce: NGjgT4 -.. section: IDLE - -Set ``__file__`` while running a startup file. Like Python, IDLE optionally -runs one startup file in the Shell window before presenting the first -interactive input prompt. For IDLE, ``-s`` runs a file named in -environmental variable :envvar:`IDLESTARTUP` or :envvar:`PYTHONSTARTUP`; -``-r file`` runs ``file``. Python sets ``__file__`` to the startup file -name before running the file and unsets it before the first prompt. IDLE -now does the same when run normally, without the ``-n`` option. - -.. - -.. bpo: 32940 -.. date: 2018-02-24-18-20-50 -.. nonce: ZaJ1Rf -.. section: IDLE - -Simplify and rename StringTranslatePseudoMapping in pyparse. - -.. - -.. bpo: 32885 -.. date: 2018-02-20-12-16-47 -.. nonce: dL5x7C -.. section: Tools/Demos - -Add an ``-n`` flag for ``Tools/scripts/pathfix.py`` to disable automatic -backup creation (files with ``~`` suffix). - -.. - -.. bpo: 33042 -.. date: 2018-03-20-21-43-09 -.. nonce: FPFp64 -.. section: C API - -Embedding applications may once again call PySys_ResetWarnOptions, -PySys_AddWarnOption, and PySys_AddXOption prior to calling Py_Initialize. - -.. - -.. bpo: 32374 -.. date: 2018-01-09-17-03-54 -.. nonce: SwwLoz -.. section: C API - -Document that m_traverse for multi-phase initialized modules can be called -with m_state=NULL, and add a sanity check diff --git a/Misc/NEWS.d/3.7.0b4.rst b/Misc/NEWS.d/3.7.0b4.rst deleted file mode 100644 index 1d4fc921406fd0025482fdc5d2b5b7d99f9be276..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.7.0b4.rst +++ /dev/null @@ -1,465 +0,0 @@ -.. bpo: 33363 -.. date: 2018-04-26-22-48-28 -.. nonce: 8RCnN2 -.. release date: 2018-05-02 -.. section: Core and Builtins - -Raise a SyntaxError for ``async with`` and ``async for`` statements outside -of async functions. - -.. - -.. bpo: 33128 -.. date: 2018-04-24-22-31-04 -.. nonce: g2yLuf -.. section: Core and Builtins - -Fix a bug that causes PathFinder to appear twice on sys.meta_path. Patch by -Pablo Galindo Salgado. - -.. - -.. bpo: 33312 -.. date: 2018-04-19-08-30-07 -.. nonce: mDe2iL -.. section: Core and Builtins - -Fixed clang ubsan (undefined behavior sanitizer) warnings in dictobject.c by -adjusting how the internal struct _dictkeysobject shared keys structure is -declared. - -.. - -.. bpo: 33231 -.. date: 2018-04-05-22-20-44 -.. nonce: 3Jmo0q -.. section: Core and Builtins - -Fix potential memory leak in ``normalizestring()``. - -.. - -.. bpo: 33205 -.. date: 2018-04-03-00-58-41 -.. nonce: lk2F3r -.. section: Core and Builtins - -Change dict growth function from -``round_up_to_power_2(used*2+hashtable_size/2)`` to -``round_up_to_power_2(used*3)``. Previously, dict is shrinked only when -``used == 0``. Now dict has more chance to be shrinked. - -.. - -.. bpo: 29922 -.. date: 2018-04-03-00-30-25 -.. nonce: CdLuMl -.. section: Core and Builtins - -Improved error messages in 'async with' when ``__aenter__()`` or -``__aexit__()`` return non-awaitable object. - -.. - -.. bpo: 33199 -.. date: 2018-04-02-09-32-40 -.. nonce: TPnxQu -.. section: Core and Builtins - -Fix ``ma_version_tag`` in dict implementation is uninitialized when copying -from key-sharing dict. - -.. - -.. bpo: 33281 -.. date: 2018-05-01-22-35-50 -.. nonce: d4jOt4 -.. section: Library - -Fix ctypes.util.find_library regression on macOS. - -.. - -.. bpo: 33383 -.. date: 2018-04-29-11-15-38 -.. nonce: g32YWn -.. section: Library - -Fixed crash in the get() method of the :mod:`dbm.ndbm` database object when -it is called with a single argument. - -.. - -.. bpo: 33329 -.. date: 2018-04-23-13-21-39 -.. nonce: lQ-Eod -.. section: Library - -Fix multiprocessing regression on newer glibcs - -.. - -.. bpo: 991266 -.. date: 2018-04-21-00-24-08 -.. nonce: h93TP_ -.. section: Library - -Fix quoting of the ``Comment`` attribute of -:class:`http.cookies.SimpleCookie`. - -.. - -.. bpo: 33131 -.. date: 2018-04-20-10-43-17 -.. nonce: L2E977 -.. section: Library - -Upgrade bundled version of pip to 10.0.1. - -.. - -.. bpo: 33308 -.. date: 2018-04-18-19-12-25 -.. nonce: fW75xi -.. section: Library - -Fixed a crash in the :mod:`parser` module when converting an ST object to a -tree of tuples or lists with ``line_info=False`` and ``col_info=True``. - -.. - -.. bpo: 33266 -.. date: 2018-04-16-15-59-21 -.. nonce: w2PAm- -.. section: Library - -lib2to3 now recognizes ``rf'...'`` strings. - -.. - -.. bpo: 11594 -.. date: 2018-04-16-08-42-03 -.. nonce: QLo4vv -.. section: Library - -Ensure line-endings are respected when using lib2to3. - -.. - -.. bpo: 33254 -.. date: 2018-04-13-15-14-47 -.. nonce: DS4KFK -.. section: Library - -Have :func:`importlib.resources.contents` and -:meth:`importlib.abc.ResourceReader.contents` return an :term:`iterable` -instead of an :term:`iterator`. - -.. - -.. bpo: 33256 -.. date: 2018-04-10-20-57-14 -.. nonce: ndHkqu -.. section: Library - -Fix display of ```` call in the html produced by ``cgitb.html()``. -Patch by Stéphane Blondon. - -.. - -.. bpo: 33185 -.. date: 2018-04-08-22-54-07 -.. nonce: Id-Ba9 -.. section: Library - -Fixed regression when running pydoc with the :option:`-m` switch. (The -regression was introduced in 3.7.0b3 by the resolution of :issue:`33053`) -This fix also changed pydoc to add ``os.getcwd()`` to :data:`sys.path` when -necessary, rather than adding ``"."``. - -.. - -.. bpo: 33169 -.. date: 2018-04-06-14-56-26 -.. nonce: ByhDqb -.. section: Library - -Delete entries of ``None`` in :data:`sys.path_importer_cache` when -:meth:`importlib.machinery.invalidate_caches` is called. - -.. - -.. bpo: 33217 -.. date: 2018-04-05-13-36-09 -.. nonce: FfOKDI -.. section: Library - -Deprecate looking up non-Enum objects in Enum classes and Enum members (will -raise :exc:`TypeError` in 3.8+). - -.. - -.. bpo: 33203 -.. date: 2018-04-05-11-09-45 -.. nonce: Hje9Py -.. section: Library - -``random.Random.choice()`` now raises ``IndexError`` for empty sequences -consistently even when called from subclasses without a ``getrandbits()`` -implementation. - -.. - -.. bpo: 33224 -.. date: 2018-04-04-23-41-30 -.. nonce: pyR0jB -.. section: Library - -Update difflib.mdiff() for :pep:`479`. Convert an uncaught StopIteration in a -generator into a return-statement. - -.. - -.. bpo: 33209 -.. date: 2018-04-03-10-37-13 -.. nonce: 9sGWE_ -.. section: Library - -End framing at the end of C implementation of :func:`pickle.Pickler.dump`. - -.. - -.. bpo: 20104 -.. date: 2018-04-01-19-21-04 -.. nonce: -AKcGa -.. section: Library - -Improved error handling and fixed a reference leak in -:func:`os.posix_spawn()`. - -.. - -.. bpo: 33175 -.. date: 2018-03-29-04-32-25 -.. nonce: _zs1yM -.. section: Library - -In dataclasses, Field.__set_name__ now looks up the __set_name__ special -method on the class, not the instance, of the default value. - -.. - -.. bpo: 33097 -.. date: 2018-03-18-16-48-23 -.. nonce: Yl4gI2 -.. section: Library - -Raise RuntimeError when ``executor.submit`` is called during interpreter -shutdown. - -.. - -.. bpo: 31908 -.. date: 2017-10-31 -.. nonce: g4xh8x -.. section: Library - -Fix output of cover files for ``trace`` module command-line tool. Previously -emitted cover files only when ``--missing`` option was used. Patch by -Michael Selik. - -.. - -.. bpo: 33378 -.. date: 2018-04-29-04-02-18 -.. nonce: -anAHN -.. section: Documentation - -Add Korean language switcher for https://docs.python.org/3/ - -.. - -.. bpo: 33276 -.. date: 2018-04-20-14-09-36 -.. nonce: rA1z_3 -.. section: Documentation - -Clarify that the ``__path__`` attribute on modules cannot be just any value. - -.. - -.. bpo: 33201 -.. date: 2018-04-01-21-03-41 -.. nonce: aa8Lkl -.. section: Documentation - -Modernize documentation for writing C extension types. - -.. - -.. bpo: 33195 -.. date: 2018-04-01-14-30-36 -.. nonce: dRS-XX -.. section: Documentation - -Deprecate ``Py_UNICODE`` usage in ``c-api/arg`` document. ``Py_UNICODE`` -related APIs are deprecated since Python 3.3, but it is missed in the -document. - -.. - -.. bpo: 8243 -.. date: 2018-01-13-20-30-53 -.. nonce: s98r28 -.. section: Documentation - -Add a note about curses.addch and curses.addstr exception behavior when -writing outside a window, or pad. - -.. - -.. bpo: 32337 -.. date: 2017-12-22-17-29-37 -.. nonce: eZe-ID -.. section: Documentation - -Update documentation related with ``dict`` order. - -.. - -.. bpo: 33358 -.. date: 2018-04-27-11-46-35 -.. nonce: _OcR59 -.. section: Tests - -Fix ``test_embed.test_pre_initialization_sys_options()`` when the -interpreter is built with ``--enable-shared``. - -.. - -.. bpo: 33394 -.. date: 2018-04-30-17-36-46 -.. nonce: _Vdi4t -.. section: Build - -Enable the verbose build for extension modules, when GNU make is passed -macros on the command line. - -.. - -.. bpo: 33393 -.. date: 2018-04-30-17-19-37 -.. nonce: HkVCqI -.. section: Build - -Update config.guess and config.sub files. - -.. - -.. bpo: 33377 -.. date: 2018-04-30-16-53-00 -.. nonce: QBh6vP -.. section: Build - -Add new triplets for mips r6 and riscv variants (used in extension -suffixes). - -.. - -.. bpo: 32232 -.. date: 2018-04-17-00-38-19 -.. nonce: o7G_UO -.. section: Build - -By default, modules configured in `Modules/Setup` are no longer built with -`-DPy_BUILD_CORE`. Instead, modules that specifically need that preprocessor -definition include it in their individual entries. - -.. - -.. bpo: 33182 -.. date: 2018-03-30-14-55-48 -.. nonce: CePczb -.. section: Build - -The embedding tests can once again be built with clang 6.0 - -.. - -.. bpo: 33184 -.. date: 2018-04-13-11-28-55 -.. nonce: 7YhqQE -.. section: Windows - -Update Windows installer to use OpenSSL 1.1.0h. - -.. - -.. bpo: 33184 -.. date: 2018-04-07-00-51-34 -.. nonce: 3j208P -.. section: macOS - -Update macOS installer build to use OpenSSL 1.1.0h. - -.. - -.. bpo: 21474 -.. date: 2018-04-29-16-13-02 -.. nonce: bglg-F -.. section: IDLE - -Update word/identifier definition from ascii to unicode. In text and entry -boxes, this affects selection by double-click, movement left/right by -control-left/right, and deletion left/right by control-BACKSPACE/DEL. - -.. - -.. bpo: 33204 -.. date: 2018-04-02-00-28-13 -.. nonce: NBsuIv -.. section: IDLE - -IDLE: consistently color invalid string prefixes. A 'u' string prefix cannot -be paired with either 'r' or 'f'. Consistently color as much of the prefix, -starting at the right, as is valid. Revise and extend colorizer test. - -.. - -.. bpo: 33189 -.. date: 2018-04-03-18-10-00 -.. nonce: QrXR00 -.. section: Tools/Demos - -:program:`pygettext.py` now recognizes only literal strings as docstrings -and translatable strings, and rejects bytes literals and f-string -expressions. - -.. - -.. bpo: 31920 -.. date: 2018-03-26-18-54-24 -.. nonce: u_WKsT -.. section: Tools/Demos - -Fixed handling directories as arguments in the ``pygettext`` script. Based -on patch by Oleg Krasnikov. - -.. - -.. bpo: 29673 -.. date: 2018-03-16-17-25-05 -.. nonce: m8QtaW -.. section: Tools/Demos - -Fix pystackv and pystack gdbinit macros. - -.. - -.. bpo: 31583 -.. date: 2017-09-26-10-11-21 -.. nonce: TM90_H -.. section: Tools/Demos - -Fix 2to3 for using with --add-suffix option but without --output-dir option -for relative path to files in current directory. diff --git a/Misc/NEWS.d/3.7.0b5.rst b/Misc/NEWS.d/3.7.0b5.rst deleted file mode 100644 index 20476993b9652a537143786a7b50d2e4bd54fbac..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.7.0b5.rst +++ /dev/null @@ -1,592 +0,0 @@ -.. bpo: 33622 -.. date: 2018-05-23-20-46-14 -.. nonce: xPucO9 -.. release date: 2018-05-30 -.. section: Core and Builtins - -Fixed a leak when the garbage collector fails to add an object with the -``__del__`` method or referenced by it into the :data:`gc.garbage` list. -:c:func:`PyGC_Collect` can now be called when an exception is set and -preserves it. - -.. - -.. bpo: 33509 -.. date: 2018-05-14-17-31-02 -.. nonce: pIUfTd -.. section: Core and Builtins - -Fix module_globals parameter of warnings.warn_explicit(): don't crash if -module_globals is not a dict. - -.. - -.. bpo: 20104 -.. date: 2018-05-14-11-34-55 -.. nonce: kqBNzv -.. section: Core and Builtins - -The new `os.posix_spawn` added in 3.7.0b1 was removed as we are still -working on what the API should look like. Expect this in 3.8 instead. - -.. - -.. bpo: 33475 -.. date: 2018-05-13-01-26-18 -.. nonce: rI0y1U -.. section: Core and Builtins - -Fixed miscellaneous bugs in converting annotations to strings and optimized -parentheses in the string representation. - -.. - -.. bpo: 33391 -.. date: 2018-05-02-08-36-03 -.. nonce: z4a7rb -.. section: Core and Builtins - -Fix a leak in set_symmetric_difference(). - -.. - -.. bpo: 28055 -.. date: 2018-04-25-20-44-42 -.. nonce: f49kfC -.. section: Core and Builtins - -Fix unaligned accesses in siphash24(). Patch by Rolf Eike Beer. - -.. - -.. bpo: 32911 -.. date: 2018-02-27-20-57-00 -.. nonce: cmKfco -.. section: Core and Builtins - -Due to unexpected compatibility issues discovered during downstream beta -testing, reverted :issue:`29463`. ``docstring`` field is removed from -Module, ClassDef, FunctionDef, and AsyncFunctionDef ast nodes which was -added in 3.7a1. Docstring expression is restored as a first statement in -their body. Based on patch by Inada Naoki. - -.. - -.. bpo: 21983 -.. date: 2017-10-02-21-02-14 -.. nonce: UoC319 -.. section: Core and Builtins - -Fix a crash in `ctypes.cast()` in case the type argument is a ctypes -structured data type. Patch by Eryk Sun and Oren Milman. - -.. - -.. bpo: 32751 -.. date: 2018-05-29-15-32-18 -.. nonce: oBTqr7 -.. section: Library - -When cancelling the task due to a timeout, :meth:`asyncio.wait_for` will now -wait until the cancellation is complete. - -.. - -.. bpo: 32684 -.. date: 2018-05-29-12-51-18 -.. nonce: ZEIism -.. section: Library - -Fix gather to propagate cancellation of itself even with return_exceptions. - -.. - -.. bpo: 33654 -.. date: 2018-05-29-01-13-39 -.. nonce: sa81Si -.. section: Library - -Support protocol type switching in SSLTransport.set_protocol(). - -.. - -.. bpo: 33674 -.. date: 2018-05-29-00-37-56 -.. nonce: 2IkGhL -.. section: Library - -Pause the transport as early as possible to further reduce the risk of -data_received() being called before connection_made(). - -.. - -.. bpo: 33674 -.. date: 2018-05-28-22-49-59 -.. nonce: 6LFFj7 -.. section: Library - -Fix a race condition in SSLProtocol.connection_made() of asyncio.sslproto: -start immediately the handshake instead of using call_soon(). Previously, -data_received() could be called before the handshake started, causing the -handshake to hang or fail. - -.. - -.. bpo: 31647 -.. date: 2018-05-28-18-40-26 -.. nonce: s4Fad3 -.. section: Library - -Fixed bug where calling write_eof() on a _SelectorSocketTransport after it's -already closed raises AttributeError. - -.. - -.. bpo: 32610 -.. date: 2018-05-28-16-40-32 -.. nonce: KvUAsL -.. section: Library - -Make asyncio.all_tasks() return only pending tasks. - -.. - -.. bpo: 32410 -.. date: 2018-05-28-16-19-35 -.. nonce: Z1DZaF -.. section: Library - -Avoid blocking on file IO in sendfile fallback code - -.. - -.. bpo: 33469 -.. date: 2018-05-28-15-55-12 -.. nonce: hmXBpY -.. section: Library - -Fix RuntimeError after closing loop that used run_in_executor - -.. - -.. bpo: 33672 -.. date: 2018-05-28-12-29-54 -.. nonce: GM_Xm_ -.. section: Library - -Fix Task.__repr__ crash with Cython's bogus coroutines - -.. - -.. bpo: 33654 -.. date: 2018-05-26-13-09-34 -.. nonce: IbYWxA -.. section: Library - -Fix transport.set_protocol() to support switching between asyncio.Protocol -and asyncio.BufferedProtocol. Fix loop.start_tls() to work with -asyncio.BufferedProtocols. - -.. - -.. bpo: 33652 -.. date: 2018-05-26-10-13-59 -.. nonce: humFJ1 -.. section: Library - -Pickles of type variables and subscripted generics are now future-proof and -compatible with older Python versions. - -.. - -.. bpo: 32493 -.. date: 2018-05-24-17-41-36 -.. nonce: 5tAoAu -.. section: Library - -Fixed :func:`uuid.uuid1` on FreeBSD. - -.. - -.. bpo: 33618 -.. date: 2018-05-23-20-14-34 -.. nonce: xU39lr -.. section: Library - -Finalize and document preliminary and experimental TLS 1.3 support with -OpenSSL 1.1.1 - -.. - -.. bpo: 33623 -.. date: 2018-05-23-14-58-05 -.. nonce: wAw1cF -.. section: Library - -Fix possible SIGSGV when asyncio.Future is created in __del__ - -.. - -.. bpo: 30877 -.. date: 2018-05-22-13-05-12 -.. nonce: JZEGjI -.. section: Library - -Fixed a bug in the Python implementation of the JSON decoder that prevented -the cache of parsed strings from clearing after finishing the decoding. -Based on patch by c-fos. - -.. - -.. bpo: 33570 -.. date: 2018-05-18-21-50-47 -.. nonce: 7CZy4t -.. section: Library - -Change TLS 1.3 cipher suite settings for compatibility with OpenSSL -1.1.1-pre6 and newer. OpenSSL 1.1.1 will have TLS 1.3 ciphers enabled by -default. - -.. - -.. bpo: 28556 -.. date: 2018-05-17-22-53-08 -.. nonce: C6Hnd1 -.. section: Library - -Do not simplify arguments to `typing.Union`. Now `Union[Manager, Employee]` -is not simplified to `Employee` at runtime. Such simplification previously -caused several bugs and limited possibilities for introspection. - -.. - -.. bpo: 33540 -.. date: 2018-05-16-18-10-38 -.. nonce: wy9LRV -.. section: Library - -Add a new ``block_on_close`` class attribute to ``ForkingMixIn`` and -``ThreadingMixIn`` classes of :mod:`socketserver`. - -.. - -.. bpo: 33548 -.. date: 2018-05-16-17-05-48 -.. nonce: xWslmx -.. section: Library - -tempfile._candidate_tempdir_list should consider common TEMP locations - -.. - -.. bpo: 33109 -.. date: 2018-05-16-14-57-58 -.. nonce: nPLL_S -.. section: Library - -argparse subparsers are once again not required by default, reverting the -change in behavior introduced by bpo-26510 in 3.7.0a2. - -.. - -.. bpo: 33536 -.. date: 2018-05-16-10-07-40 -.. nonce: _s0TE8 -.. section: Library - -dataclasses.make_dataclass now checks for invalid field names and duplicate -fields. Also, added a check for invalid field specifications. - -.. - -.. bpo: 33542 -.. date: 2018-05-16-09-30-27 -.. nonce: idNAcs -.. section: Library - -Prevent ``uuid.get_node`` from using a DUID instead of a MAC on Windows. -Patch by Zvi Effron - -.. - -.. bpo: 26819 -.. date: 2018-05-16-05-24-43 -.. nonce: taxbVT -.. section: Library - -Fix race condition with `ReadTransport.resume_reading` in Windows proactor -event loop. - -.. - -.. bpo: 0 -.. date: 2018-05-15-18-02-03 -.. nonce: pj2Mbb -.. section: Library - -Fix failure in `typing.get_type_hints()` when ClassVar was provided as a -string forward reference. - -.. - -.. bpo: 33505 -.. date: 2018-05-14-18-05-35 -.. nonce: L8pAyt -.. section: Library - -Optimize asyncio.ensure_future() by reordering if checks: 1.17x faster. - -.. - -.. bpo: 33497 -.. date: 2018-05-14-17-49-34 -.. nonce: wWT6XM -.. section: Library - -Add errors param to cgi.parse_multipart and make an encoding in FieldStorage -use the given errors (needed for Twisted). Patch by Amber Brown. - -.. - -.. bpo: 33495 -.. date: 2018-05-14-10-29-03 -.. nonce: TeGTQJ -.. section: Library - -Change dataclasses.Fields repr to use the repr of each of its members, -instead of str. This makes it more clear what each field actually -represents. This is especially true for the 'type' member. - -.. - -.. bpo: 33453 -.. date: 2018-05-12-06-01-02 -.. nonce: Fj-jMD -.. section: Library - -Fix dataclasses to work if using literal string type annotations or if using -PEP 563 "Postponed Evaluation of Annotations". Only specific string -prefixes are detected for both ClassVar ("ClassVar" and "typing.ClassVar") -and InitVar ("InitVar" and "dataclasses.InitVar"). - -.. - -.. bpo: 28556 -.. date: 2018-05-08-16-43-42 -.. nonce: _xr5mp -.. section: Library - -Minor fixes in typing module: add annotations to ``NamedTuple.__new__``, -pass ``*args`` and ``**kwds`` in ``Generic.__new__``. Original PRs by -Paulius Šarka and Chad Dombrova. - -.. - -.. bpo: 20087 -.. date: 2018-05-05-18-02-24 -.. nonce: lJrvXL -.. section: Library - -Updated alias mapping with glibc 2.27 supported locales. - -.. - -.. bpo: 33422 -.. date: 2018-05-05-09-53-05 -.. nonce: 4FtQ0q -.. section: Library - -Fix trailing quotation marks getting deleted when looking up byte/string -literals on pydoc. Patch by Andrés Delfino. - -.. - -.. bpo: 28167 -.. date: 2018-05-02-07-26-29 -.. nonce: 7FwDfN -.. section: Library - -The function ``platform.linux_distribution`` and ``platform.dist`` now -trigger a ``DeprecationWarning`` and have been marked for removal in Python -3.8 - -.. - -.. bpo: 33197 -.. date: 2018-04-29-23-56-20 -.. nonce: dgRLqr -.. section: Library - -Update error message when constructing invalid inspect.Parameters Patch by -Dong-hee Na. - -.. - -.. bpo: 33263 -.. date: 2018-04-11-20-29-19 -.. nonce: B56Hc1 -.. section: Library - -Fix FD leak in `_SelectorSocketTransport` Patch by Vlad Starostin. - -.. - -.. bpo: 32861 -.. date: 2018-04-02-20-44-54 -.. nonce: HeBjzN -.. section: Library - -The urllib.robotparser's ``__str__`` representation now includes wildcard -entries and the "Crawl-delay" and "Request-rate" fields. Patch by Michael -Lazar. - -.. - -.. bpo: 32257 -.. date: 2018-02-26-09-08-07 -.. nonce: 6ElnUt -.. section: Library - -The ssl module now contains OP_NO_RENEGOTIATION constant, available with -OpenSSL 1.1.0h or 1.1.1. - -.. - -.. bpo: 16865 -.. date: 2017-09-29-16-40-38 -.. nonce: l-f6I_ -.. section: Library - -Support arrays >=2GiB in :mod:`ctypes`. Patch by Segev Finer. - -.. - -.. bpo: 23859 -.. date: 2018-05-29-16-02-31 -.. nonce: E5gba1 -.. section: Documentation - -Document that `asyncio.wait()` does not cancel its futures on timeout. - -.. - -.. bpo: 32436 -.. date: 2018-05-23-11-59-51 -.. nonce: S1LGPa -.. section: Documentation - -Document :pep:`567` changes to asyncio. - -.. - -.. bpo: 33604 -.. date: 2018-05-22-11-47-14 -.. nonce: 5YHTpz -.. section: Documentation - -Update HMAC md5 default to a DeprecationWarning, bump removal to 3.8. - -.. - -.. bpo: 33503 -.. date: 2018-05-14-20-08-58 -.. nonce: Wvt0qg -.. section: Documentation - -Fix broken pypi link - -.. - -.. bpo: 33421 -.. date: 2018-05-14-15-15-41 -.. nonce: 3GU_QO -.. section: Documentation - -Add missing documentation for ``typing.AsyncContextManager``. - -.. - -.. bpo: 33655 -.. date: 2018-05-26-16-01-40 -.. nonce: Frb4LA -.. section: Tests - -Ignore test_posix_fallocate failures on BSD platforms that might be due to -running on ZFS. - -.. - -.. bpo: 32604 -.. date: 2018-05-14-13-32-46 -.. nonce: a_z6D_ -.. section: Tests - -Remove the _xxsubinterpreters module (meant for testing) and associated -helpers. This module was originally added recently in 3.7b1. - -.. - -.. bpo: 33614 -.. date: 2018-05-28-11-40-22 -.. nonce: 28e0sE -.. section: Build - -Ensures module definition files for the stable ABI on Windows are correctly -regenerated. - -.. - -.. bpo: 33522 -.. date: 2018-05-15-12-44-50 -.. nonce: mJoNcA -.. section: Build - -Enable CI builds on Visual Studio Team Services at -https://python.visualstudio.com/cpython - -.. - -.. bpo: 33012 -.. date: 2018-05-10-21-10-01 -.. nonce: 5Zfjac -.. section: Build - -Add ``-Wno-cast-function-type`` for gcc 8 for silencing warnings about -function casts like casting to PyCFunction in method definition lists. - -.. - -.. bpo: 13631 -.. date: 2018-05-16-13-25-58 -.. nonce: UIjDyY -.. section: macOS - -The .editrc file in user's home directory is now processed correctly during -the readline initialization through editline emulation on macOS. - -.. - -.. bpo: 33628 -.. date: 2018-05-23-19-51-07 -.. nonce: sLlFLO -.. section: IDLE - -IDLE: Cleanup codecontext.py and its test. - -.. - -.. bpo: 33564 -.. date: 2018-05-17-19-41-12 -.. nonce: XzHZJe -.. section: IDLE - -IDLE's code context now recognizes async as a block opener. - -.. - -.. bpo: 32831 -.. date: 2018-02-12-08-08-45 -.. nonce: srDRvU -.. section: IDLE - -Add docstrings and tests for codecontext. diff --git a/Misc/NEWS.d/3.7.0rc1.rst b/Misc/NEWS.d/3.7.0rc1.rst deleted file mode 100644 index 89457ef59ab38d3a7b6d3b67007548f9162c9b46..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.7.0rc1.rst +++ /dev/null @@ -1,275 +0,0 @@ -.. bpo: 33803 -.. date: 2018-06-07-20-18-38 -.. nonce: n-Nq6_ -.. release date: 2018-06-12 -.. section: Core and Builtins - -Fix a crash in hamt.c caused by enabling GC tracking for an object that -hadn't all of its fields set to NULL. - -.. - -.. bpo: 33706 -.. date: 2018-05-31-14-50-04 -.. nonce: ztlH04 -.. section: Core and Builtins - -Fix a crash in Python initialization when parsing the command line options. -Thanks Christoph Gohlke for the bug report and the fix! - -.. - -.. bpo: 30654 -.. date: 2018-05-28-12-28-53 -.. nonce: 9fDJye -.. section: Core and Builtins - -Fixed reset of the SIGINT handler to SIG_DFL on interpreter shutdown even -when there was a custom handler set previously. Patch by Philipp Kerling. - -.. - -.. bpo: 31849 -.. date: 2018-05-14-11-00-00 -.. nonce: EmHaH4 -.. section: Core and Builtins - -Fix signed/unsigned comparison warning in pyhash.c. - -.. - -.. bpo: 30167 -.. date: 2018-06-10-19-29-17 -.. nonce: G5EgC5 -.. section: Library - -Prevent site.main() exception if PYTHONSTARTUP is set. Patch by Steve Weber. - -.. - -.. bpo: 33812 -.. date: 2018-06-10-13-26-02 -.. nonce: frGAOr -.. section: Library - -Datetime instance d with non-None tzinfo, but with d.tzinfo.utcoffset(d) -returning None is now treated as naive by the astimezone() method. - -.. - -.. bpo: 30805 -.. date: 2018-06-08-17-34-16 -.. nonce: 3qCWa0 -.. section: Library - -Avoid race condition with debug logging - -.. - -.. bpo: 33694 -.. date: 2018-06-07-23-51-00 -.. nonce: F1zIR1 -.. section: Library - -asyncio: Fix a race condition causing data loss on -pause_reading()/resume_reading() when using the ProactorEventLoop. - -.. - -.. bpo: 32493 -.. date: 2018-06-07-18-55-35 -.. nonce: 1Bte62 -.. section: Library - -Correct test for ``uuid_enc_be`` availability in ``configure.ac``. Patch by -Michael Felt. - -.. - -.. bpo: 33792 -.. date: 2018-06-07-12-38-12 -.. nonce: 3aKG7u -.. section: Library - -Add asyncio.WindowsSelectorEventLoopPolicy and -asyncio.WindowsProactorEventLoopPolicy. - -.. - -.. bpo: 33778 -.. date: 2018-06-05-20-22-30 -.. nonce: _tSAS6 -.. section: Library - -Update ``unicodedata``'s database to Unicode version 11.0.0. - -.. - -.. bpo: 33770 -.. date: 2018-06-05-11-29-26 -.. nonce: oBhxxw -.. section: Library - -improve base64 exception message for encoded inputs of invalid length - -.. - -.. bpo: 33769 -.. date: 2018-06-04-13-46-39 -.. nonce: D_pxYz -.. section: Library - -asyncio/start_tls: Fix error message; cancel callbacks in case of an -unhandled error; mark SSLTransport as closed if it is aborted. - -.. - -.. bpo: 33767 -.. date: 2018-06-03-22-41-59 -.. nonce: 2e82g3 -.. section: Library - -The concatenation (``+``) and repetition (``*``) sequence operations now -raise :exc:`TypeError` instead of :exc:`SystemError` when performed on -:class:`mmap.mmap` objects. Patch by Zackery Spytz. - -.. - -.. bpo: 33734 -.. date: 2018-06-01-10-55-48 -.. nonce: x1W9x0 -.. section: Library - -asyncio/ssl: Fix AttributeError, increase default handshake timeout - -.. - -.. bpo: 11874 -.. date: 2018-05-23-00-26-27 -.. nonce: glK5iP -.. section: Library - -Use a better regex when breaking usage into wrappable parts. Avoids bogus -assertion errors from custom metavar strings. - -.. - -.. bpo: 33582 -.. date: 2018-05-19-15-58-14 -.. nonce: qBZPmF -.. section: Library - -Emit a deprecation warning for inspect.formatargspec - -.. - -.. bpo: 33409 -.. date: 2018-06-08-23-46-01 -.. nonce: r4z9MM -.. section: Documentation - -Clarified the relationship between :pep:`538`'s PYTHONCOERCECLOCALE and PEP -540's PYTHONUTF8 mode. - -.. - -.. bpo: 33736 -.. date: 2018-06-01-12-27-40 -.. nonce: JVegIu -.. section: Documentation - -Improve the documentation of :func:`asyncio.open_connection`, -:func:`asyncio.start_server` and their UNIX socket counterparts. - -.. - -.. bpo: 31432 -.. date: 2017-09-13-07-14-59 -.. nonce: yAY4Z3 -.. section: Documentation - -Clarify meaning of CERT_NONE, CERT_OPTIONAL, and CERT_REQUIRED flags for -ssl.SSLContext.verify_mode. - -.. - -.. bpo: 5755 -.. date: 2018-06-04-21-34-34 -.. nonce: 65GmCj -.. section: Build - -Move ``-Wstrict-prototypes`` option to ``CFLAGS_NODIST`` from ``OPT``. This -option emitted annoying warnings when building extension modules written in -C++. - -.. - -.. bpo: 33720 -.. date: 2018-06-04-09-20-53 -.. nonce: VKDXHK -.. section: Windows - -Reduces maximum marshal recursion depth on release builds. - -.. - -.. bpo: 33656 -.. date: 2018-06-10-17-59-36 -.. nonce: 60ZqJS -.. section: IDLE - -On Windows, add API call saying that tk scales for DPI. On Windows 8.1+ or -10, with DPI compatibility properties of the Python binary unchanged, and a -monitor resolution greater than 96 DPI, this should make text and lines -sharper. It should otherwise have no effect. - -.. - -.. bpo: 33768 -.. date: 2018-06-04-19-23-11 -.. nonce: I_2qpV -.. section: IDLE - -Clicking on a context line moves that line to the top of the editor window. - -.. - -.. bpo: 33763 -.. date: 2018-06-03-20-12-57 -.. nonce: URiFlE -.. section: IDLE - -IDLE: Use read-only text widget for code context instead of label widget. - -.. - -.. bpo: 33664 -.. date: 2018-06-03-09-13-28 -.. nonce: PZzQyL -.. section: IDLE - -Scroll IDLE editor text by lines. Previously, the mouse wheel and scrollbar -slider moved text by a fixed number of pixels, resulting in partial lines at -the top of the editor box. The change also applies to the shell and grep -output windows, but not to read-only text views. - -.. - -.. bpo: 33679 -.. date: 2018-05-29-07-14-37 -.. nonce: MgX_Ui -.. section: IDLE - -Enable theme-specific color configuration for Code Context. Use the -Highlights tab to see the setting for built-in themes or add settings to -custom themes. - -.. - -.. bpo: 33642 -.. date: 2018-05-24-20-42-44 -.. nonce: J0VQbS -.. section: IDLE - -Display up to maxlines non-blank lines for Code Context. If there is no -current context, show a single blank line. diff --git a/Misc/NEWS.d/3.8.0.rst b/Misc/NEWS.d/3.8.0.rst deleted file mode 100644 index e72025cfca572b72774154294d522569580a2f44..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.8.0.rst +++ /dev/null @@ -1,186 +0,0 @@ -.. bpo: 38469 -.. date: 2019-10-13-23-41-38 -.. nonce: 9kmuQj -.. release date: 2019-10-14 -.. section: Core and Builtins - -Fixed a bug where the scope of named expressions was not being resolved -correctly in the presence of the *global* keyword. Patch by Pablo Galindo. - -.. - -.. bpo: 38379 -.. date: 2019-10-09-16-50-52 -.. nonce: oz5qZx -.. section: Core and Builtins - -When cyclic garbage collection (gc) runs finalizers that resurrect -unreachable objects, the current gc run ends, without collecting any cyclic -trash. However, the statistics reported by ``collect()`` and -``get_stats()`` claimed that all cyclic trash found was collected, and that -the resurrected objects were collected. Changed the stats to report that -none were collected. - -.. - -.. bpo: 38449 -.. date: 2019-10-11-18-49-00 -.. nonce: 9TWMlz -.. section: Library - -Revert GH-15522, which introduces a regression in -:meth:`mimetypes.guess_type` due to improper handling of filenames as urls. - -.. - -.. bpo: 38431 -.. date: 2019-10-10-16-53-00 -.. nonce: d5wzNp -.. section: Library - -Fix ``__repr__`` method for :class:`dataclasses.InitVar` to support typing -objects, patch by Samuel Colvin. - -.. - -.. bpo: 38109 -.. date: 2019-10-10-00-25-28 -.. nonce: 9w-IGF -.. section: Library - -Add missing :data:`stat.S_IFDOOR`, :data:`stat.S_IFPORT`, -:data:`stat.S_IFWHT`, :func:`stat.S_ISDOOR`, :func:`stat.S_ISPORT`, and -:func:`stat.S_ISWHT` values to the Python implementation of :mod:`stat`. - -.. - -.. bpo: 38405 -.. date: 2019-10-08-11-18-40 -.. nonce: 0-7e7s -.. section: Library - -Nested subclasses of :class:`typing.NamedTuple` are now pickleable. - -.. - -.. bpo: 38332 -.. date: 2019-10-05-02-07-52 -.. nonce: hwrPN7 -.. section: Library - -Prevent :exc:`KeyError` thrown by :func:`_encoded_words.decode` when given -an encoded-word with invalid content-type encoding from propagating all the -way to :func:`email.message.get`. - -.. - -.. bpo: 38341 -.. date: 2019-10-01-21-06-18 -.. nonce: uqwgU_ -.. section: Library - -Add :exc:`smtplib.SMTPNotSupportedError` to the :mod:`smtplib` exported -names. - -.. - -.. bpo: 13153 -.. date: 2019-09-29-22-47-37 -.. nonce: 0mO9qR -.. section: Library - -OS native encoding is now used for converting between Python strings and Tcl -objects. This allows to display, copy and paste to clipboard emoji and -other non-BMP characters. Converting strings from Tcl to Python and back -now never fails (except MemoryError). - -.. - -.. bpo: 38294 -.. date: 2019-09-27-23-37-41 -.. nonce: go_jFf -.. section: Documentation - -Add list of no-longer-escaped chars to re.escape documentation. - -.. - -.. bpo: 37531 -.. date: 2019-10-08-16-42-05 -.. nonce: 7v-_Ca -.. section: Tests - -On timeout, regrtest no longer attempts to call ``popen.communicate()`` -again: it can hang until all child processes using stdout and stderr pipes -completes. Kill the worker process and ignores its output. Change also the -faulthandler timeout of the main process from 1 minute to 5 minutes, for -Python slowest buildbots. - -.. - -.. bpo: 38344 -.. date: 2019-10-05-05-50-58 -.. nonce: scr2LO -.. section: Windows - -Fix error message in activate.bat. - -.. - -.. bpo: 38359 -.. date: 2019-10-03-08-04-14 -.. nonce: wzwsl_ -.. section: Windows - -Ensures ``pyw.exe`` launcher reads correct registry key. - -.. - -.. bpo: 38355 -.. date: 2019-10-02-15-38-49 -.. nonce: n3AWX6 -.. section: Windows - -Fixes ``ntpath.realpath`` failing on ``sys.executable``. - -.. - -.. bpo: 36698 -.. date: 2019-10-04-18-03-09 -.. nonce: BKcmom -.. section: IDLE - -IDLE no longer fails when write non-encodable characters to stderr. It now -escapes them with a backslash, as the regular Python interpreter. Added the -``errors`` field to the standard streams. - -.. - -.. bpo: 38118 -.. date: 2019-10-08-15-07-52 -.. nonce: pIZD6H -.. section: Tools/Demos - -Update Valgrind suppression file to ignore a false alarm in -:c:func:`PyUnicode_Decode` when using GCC builtin strcmp(). - -.. - -.. bpo: 38347 -.. date: 2019-10-02-09-48-42 -.. nonce: 2Tq5D1 -.. section: Tools/Demos - -pathfix.py: Assume all files that end on '.py' are Python scripts when -working recursively. - -.. - -.. bpo: 38395 -.. date: 2019-10-08-01-23-24 -.. nonce: MJ6Ey9 -.. section: C API - -Fix a crash in :class:`weakref.proxy` objects due to incorrect lifetime -management when calling some associated methods that may delete the last -reference to object being referenced by the proxy. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/3.8.0a1.rst b/Misc/NEWS.d/3.8.0a1.rst deleted file mode 100644 index 96208c88d32b3c771f216e30ec10264f20e24209..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.8.0a1.rst +++ /dev/null @@ -1,8978 +0,0 @@ -.. bpo: 35746 -.. date: 2019-01-15-18-16-05 -.. nonce: nMSd0j -.. release date: 2019-02-03 -.. section: Security - -[CVE-2019-5010] Fix a NULL pointer deref in ssl module. The cert parser did -not handle CRL distribution points with empty DP or URI correctly. A -malicious or buggy certificate can result into segfault. Vulnerability -(TALOS-2018-0758) reported by Colin Read and Nicolas Edet of Cisco. - -.. - -.. bpo: 34812 -.. date: 2018-11-23-15-00-23 -.. nonce: 84VQnb -.. section: Security - -The :option:`-I` command line option (run Python in isolated mode) is now -also copied by the :mod:`multiprocessing` and :mod:`distutils` modules when -spawning child processes. Previously, only :option:`-E` and :option:`-s` -options (enabled by :option:`-I`) were copied. - -.. - -.. bpo: 34791 -.. date: 2018-09-24-18-49-25 -.. nonce: 78GmIG -.. section: Security - -The xml.sax and xml.dom.domreg no longer use environment variables to -override parser implementations when sys.flags.ignore_environment is set by --E or -I arguments. - -.. - -.. bpo: 17239 -.. date: 2018-09-11-18-30-55 -.. nonce: kOpwK2 -.. section: Security - -The xml.sax and xml.dom.minidom parsers no longer processes external -entities by default. External DTD and ENTITY declarations no longer load -files or create network connections. - -.. - -.. bpo: 34623 -.. date: 2018-09-10-16-05-39 -.. nonce: Ua9jMv -.. section: Security - -CVE-2018-14647: The C accelerated _elementtree module now initializes hash -randomization salt from _Py_HashSecret instead of libexpat's default CSPRNG. - -.. - -.. bpo: 34405 -.. date: 2018-08-15-12-12-47 -.. nonce: qbHTH_ -.. section: Security - -Updated to OpenSSL 1.1.0i for Windows builds. - -.. - -.. bpo: 33871 -.. date: 2018-06-26-19-35-33 -.. nonce: S4HR9n -.. section: Security - -Fixed sending the part of the file in :func:`os.sendfile` on macOS. Using -the *trailers* argument could cause sending more bytes from the input file -than was specified. - -.. - -.. bpo: 32533 -.. date: 2018-05-28-08-55-30 -.. nonce: IzwkBI -.. section: Security - -Fixed thread-safety of error handling in _ssl. - -.. - -.. bpo: 33136 -.. date: 2018-03-25-12-05-43 -.. nonce: TzSN4x -.. section: Security - -Harden ssl module against LibreSSL CVE-2018-8970. -X509_VERIFY_PARAM_set1_host() is called with an explicit namelen. A new test -ensures that NULL bytes are not allowed. - -.. - -.. bpo: 33001 -.. date: 2018-03-05-10-09-51 -.. nonce: elj4Aa -.. section: Security - -Minimal fix to prevent buffer overrun in os.symlink on Windows - -.. - -.. bpo: 32981 -.. date: 2018-03-02-10-24-52 -.. nonce: O_qDyj -.. section: Security - -Regexes in difflib and poplib were vulnerable to catastrophic backtracking. -These regexes formed potential DOS vectors (REDOS). They have been -refactored. This resolves CVE-2018-1060 and CVE-2018-1061. Patch by Jamie -Davis. - -.. - -.. bpo: 28414 -.. date: 2017-08-06-14-43-45 -.. nonce: mzZ6vD -.. section: Security - -The ssl module now allows users to perform their own IDN en/decoding when -using SNI. - -.. - -.. bpo: 35877 -.. date: 2019-02-01-22-38-11 -.. nonce: Jrse8f -.. section: Core and Builtins - -Make parenthesis optional for named expressions in while statement. Patch by -Karthikeyan Singaravelan. - -.. - -.. bpo: 35814 -.. date: 2019-01-24-13-25-21 -.. nonce: r_MjA6 -.. section: Core and Builtins - -Allow same right hand side expressions in annotated assignments as in normal -ones. In particular, ``x: Tuple[int, int] = 1, 2`` (without parentheses on -the right) is now allowed. - -.. - -.. bpo: 35766 -.. date: 2019-01-22-19-17-27 -.. nonce: gh1tHZ -.. section: Core and Builtins - -Add the option to parse PEP 484 type comments in the ast module. (Off by -default.) This is merging the key functionality of the third party fork -thereof, [typed_ast](https://github.com/python/typed_ast). - -.. - -.. bpo: 35713 -.. date: 2019-01-22-18-50-21 -.. nonce: bTeUsa -.. section: Core and Builtins - -Reorganize Python initialization to get working exceptions and sys.stderr -earlier. - -.. - -.. bpo: 33416 -.. date: 2019-01-19-19-41-53 -.. nonce: VDeOU5 -.. section: Core and Builtins - -Add end line and end column position information to the Python AST nodes. -This is a C-level backwards incompatible change. - -.. - -.. bpo: 35720 -.. date: 2019-01-12-23-33-04 -.. nonce: LELKQx -.. section: Core and Builtins - -Fixed a minor memory leak in pymain_parse_cmdline_impl function in -Modules/main.c - -.. - -.. bpo: 35634 -.. date: 2019-01-05-18-39-49 -.. nonce: nVP_gs -.. section: Core and Builtins - -``func(**kwargs)`` will now raise an error when ``kwargs`` is a mapping -containing multiple entries with the same key. An error was already raised -when other keyword arguments are passed before ``**kwargs`` since Python -3.6. - -.. - -.. bpo: 35623 -.. date: 2018-12-31-02-37-20 -.. nonce: 24AQhY -.. section: Core and Builtins - -Fix a crash when sorting very long lists. Patch by Stephan Hohe. - -.. - -.. bpo: 35214 -.. date: 2018-12-30-15-36-23 -.. nonce: GWDQcv -.. section: Core and Builtins - -clang Memory Sanitizer build instrumentation was added to work around false -positives from posix, socket, time, test_io, and test_faulthandler. - -.. - -.. bpo: 35560 -.. date: 2018-12-22-22-19-51 -.. nonce: 9vMWSP -.. section: Core and Builtins - -Fix an assertion error in :func:`format` in debug build for floating point -formatting with "n" format, zero padding and small width. Release build is -not impacted. Patch by Karthikeyan Singaravelan. - -.. - -.. bpo: 35552 -.. date: 2018-12-21-13-29-30 -.. nonce: 1DzQQc -.. section: Core and Builtins - -Format characters ``%s`` and ``%V`` in :c:func:`PyUnicode_FromFormat` and -``%s`` in :c:func:`PyBytes_FromFormat` no longer read memory past the limit -if *precision* is specified. - -.. - -.. bpo: 35504 -.. date: 2018-12-15-14-01-45 -.. nonce: JtKczP -.. section: Core and Builtins - -Fix segfaults and :exc:`SystemError`\ s when deleting certain attributes. -Patch by Zackery Spytz. - -.. - -.. bpo: 35504 -.. date: 2018-12-15-00-47-41 -.. nonce: 9gVuen -.. section: Core and Builtins - -Fixed a SystemError when delete the characters_written attribute of an -OSError. - -.. - -.. bpo: 35494 -.. date: 2018-12-14-18-02-34 -.. nonce: IWOPtb -.. section: Core and Builtins - -Improved syntax error messages for unbalanced parentheses in f-string. - -.. - -.. bpo: 35444 -.. date: 2018-12-09-13-09-39 -.. nonce: 9kYn4V -.. section: Core and Builtins - -Fixed error handling in pickling methods when fail to look up builtin -"getattr". Sped up pickling iterators. - -.. - -.. bpo: 35436 -.. date: 2018-12-07-02-38-01 -.. nonce: 0VW7p9 -.. section: Core and Builtins - -Fix various issues with memory allocation error handling. Patch by Zackery -Spytz. - -.. - -.. bpo: 35423 -.. date: 2018-12-05-16-24-05 -.. nonce: UIie_O -.. section: Core and Builtins - -Separate the signal handling trigger in the eval loop from the "pending -calls" machinery. There is no semantic change and the difference in -performance is insignificant. - -.. - -.. bpo: 35357 -.. date: 2018-12-03-21-20-24 -.. nonce: rhhoiC -.. section: Core and Builtins - -Internal attributes' names of unittest.mock._Call and -unittest.mock.MagicProxy (name, parent & from_kall) are now prefixed with -_mock_ in order to prevent clashes with widely used object attributes. Fixed -minor typo in test function name. - -.. - -.. bpo: 35372 -.. date: 2018-12-01-19-20-53 -.. nonce: RwVJjZ -.. section: Core and Builtins - -Fixed the code page decoder for input longer than 2 GiB containing -undecodable bytes. - -.. - -.. bpo: 35336 -.. date: 2018-11-29-23-59-52 -.. nonce: 8LOz4F -.. section: Core and Builtins - -Fix PYTHONCOERCECLOCALE=1 environment variable: only coerce the C locale if -the LC_CTYPE locale is "C". - -.. - -.. bpo: 31241 -.. date: 2018-11-21-14-05-51 -.. nonce: Kin10- -.. section: Core and Builtins - -The *lineno* and *col_offset* attributes of AST nodes for list -comprehensions, generator expressions and tuples are now point to the -opening parenthesis or square brace. For tuples without parenthesis they -point to the position of the first item. - -.. - -.. bpo: 33954 -.. date: 2018-11-20-22-33-38 -.. nonce: RzSngM -.. section: Core and Builtins - -For :meth:`str.format`, :meth:`float.__format__` and -:meth:`complex.__format__` methods for non-ASCII decimal point when using -the "n" formatter. - -.. - -.. bpo: 35269 -.. date: 2018-11-17-10-18-29 -.. nonce: gjm1LO -.. section: Core and Builtins - -Fix a possible segfault involving a newly-created coroutine. Patch by -Zackery Spytz. - -.. - -.. bpo: 35224 -.. date: 2018-11-13-14-26-54 -.. nonce: F0B6UQ -.. section: Core and Builtins - -Implement :pep:`572` (assignment expressions). Patch by Emily Morehouse. - -.. - -.. bpo: 32492 -.. date: 2018-11-13-01-03-10 -.. nonce: voIdcp -.. section: Core and Builtins - -Speed up :class:`namedtuple` attribute access by 1.6x using a C fast-path -for the name descriptors. Patch by Pablo Galindo. - -.. - -.. bpo: 35214 -.. date: 2018-11-13-00-40-35 -.. nonce: OQBjph -.. section: Core and Builtins - -Fixed an out of bounds memory access when parsing a truncated unicode escape -sequence at the end of a string such as ``'\N'``. It would read one byte -beyond the end of the memory allocation. - -.. - -.. bpo: 35214 -.. date: 2018-11-12-11-38-06 -.. nonce: PCHKbX -.. section: Core and Builtins - -The interpreter and extension modules have had annotations added so that -they work properly under clang's Memory Sanitizer. A new configure flag ---with-memory-sanitizer has been added to make test builds of this nature -easier to perform. - -.. - -.. bpo: 35193 -.. date: 2018-11-08-15-00-58 -.. nonce: HzPS6R -.. section: Core and Builtins - -Fix an off by one error in the bytecode peephole optimizer where it could -read bytes beyond the end of bounds of an array when removing unreachable -code. This bug was present in every release of Python 3.6 and 3.7 until now. - -.. - -.. bpo: 35169 -.. date: 2018-11-05-21-19-05 -.. nonce: _FyPI2 -.. section: Core and Builtins - -Improved error messages for forbidden assignments. - -.. - -.. bpo: 34022 -.. date: 2018-11-04-18-13-40 -.. nonce: U3btVj -.. section: Core and Builtins - -Fix handling of hash-based bytecode files in :mod:`zipimport`. Patch by -Elvis Pranskevichus. - -.. - -.. bpo: 28401 -.. date: 2018-11-03-10-37-29 -.. nonce: RprDIg -.. section: Core and Builtins - -Debug builds will no longer to attempt to import extension modules built for -the ABI as they were never compatible to begin with. Patch by Stefano -Rivera. - -.. - -.. bpo: 29341 -.. date: 2018-10-25-20-53-32 -.. nonce: jH-AMF -.. section: Core and Builtins - -Clarify in the docstrings of :mod:`os` methods that path-like objects are -also accepted as input parameters. - -.. - -.. bpo: 35050 -.. date: 2018-10-23-15-03-53 -.. nonce: 49wraS -.. section: Core and Builtins - -:mod:`socket`: Fix off-by-one bug in length check for ``AF_ALG`` name and -type. - -.. - -.. bpo: 29743 -.. date: 2018-10-21-17-43-48 -.. nonce: aeCcKR -.. section: Core and Builtins - -Raise :exc:`ValueError` instead of :exc:`OverflowError` in case of a -negative ``_length_`` in a :class:`ctypes.Array` subclass. Also raise -:exc:`TypeError` instead of :exc:`AttributeError` for non-integer -``_length_``. Original patch by Oren Milman. - -.. - -.. bpo: 16806 -.. date: 2018-10-20-18-05-58 -.. nonce: zr3A9N -.. section: Core and Builtins - -Fix ``lineno`` and ``col_offset`` for multi-line string tokens. - -.. - -.. bpo: 35029 -.. date: 2018-10-20-10-26-15 -.. nonce: t4tZcQ -.. section: Core and Builtins - -:exc:`SyntaxWarning` raised as an exception at code generation time will be -now replaced with a :exc:`SyntaxError` for better error reporting. - -.. - -.. bpo: 34983 -.. date: 2018-10-14-17-26-41 -.. nonce: l8XaZd -.. section: Core and Builtins - -Expose :meth:`symtable.Symbol.is_nonlocal` in the symtable module. Patch by -Pablo Galindo. - -.. - -.. bpo: 34974 -.. date: 2018-10-13-22-24-19 -.. nonce: 7LgTc2 -.. section: Core and Builtins - -:class:`bytes` and :class:`bytearray` constructors no longer convert -unexpected exceptions (e.g. :exc:`MemoryError` and :exc:`KeyboardInterrupt`) -to :exc:`TypeError`. - -.. - -.. bpo: 34939 -.. date: 2018-10-13-17-40-15 -.. nonce: 0gpxlJ -.. section: Core and Builtins - -Allow annotated names in module namespace that are declared global before -the annotation happens. Patch by Pablo Galindo. - -.. - -.. bpo: 34973 -.. date: 2018-10-13-16-42-03 -.. nonce: B5M-3g -.. section: Core and Builtins - -Fixed crash in :func:`bytes` when the :class:`list` argument is mutated -while it is iterated. - -.. - -.. bpo: 34876 -.. date: 2018-10-06-14-02-51 -.. nonce: oBKBA4 -.. section: Core and Builtins - -The *lineno* and *col_offset* attributes of the AST for decorated function -and class refer now to the position of the corresponding ``def``, ``async -def`` and ``class`` instead of the position of the first decorator. This -leads to more correct line reporting in tracing. This is the only case when -the position of child AST nodes can precede the position of the parent AST -node. - -.. - -.. bpo: 34879 -.. date: 2018-10-02-22-55-11 -.. nonce: 7VNH2a -.. section: Core and Builtins - -Fix a possible null pointer dereference in bytesobject.c. Patch by Zackery -Spytz. - -.. - -.. bpo: 34784 -.. date: 2018-10-02-09-10-47 -.. nonce: 07hdgD -.. section: Core and Builtins - -Fix the implementation of PyStructSequence_NewType in order to create heap -allocated StructSequences. - -.. - -.. bpo: 32912 -.. date: 2018-10-01-10-41-53 -.. nonce: JeIOdM -.. section: Core and Builtins - -A :exc:`SyntaxWarning` is now emitted instead of a :exc:`DeprecationWarning` -for invalid escape sequences in string and bytes literals. - -.. - -.. bpo: 34854 -.. date: 2018-09-30-19-27-13 -.. nonce: 6TKTcB -.. section: Core and Builtins - -Fixed a crash in compiling string annotations containing a lambda with a -keyword-only argument that doesn't have a default value. - -.. - -.. bpo: 34850 -.. date: 2018-09-30-11-19-55 -.. nonce: CbgDwb -.. section: Core and Builtins - -The compiler now produces a :exc:`SyntaxWarning` when identity checks -(``is`` and ``is not``) are used with certain types of literals (e.g. -strings, ints). These can often work by accident in CPython, but are not -guaranteed by the language spec. The warning advises users to use equality -tests (``==`` and ``!=``) instead. - -.. - -.. bpo: 34824 -.. date: 2018-09-27-11-10-02 -.. nonce: VLlCaU -.. section: Core and Builtins - -Fix a possible null pointer dereference in Modules/_ssl.c. Patch by Zackery -Spytz. - -.. - -.. bpo: 30156 -.. date: 2018-09-24-17-51-15 -.. nonce: pH0j5j -.. section: Core and Builtins - -The C function ``property_descr_get()`` uses a "cached" tuple to optimize -function calls. But this tuple can be discovered in debug mode with -:func:`sys.getobjects()`. Remove the optimization, it's not really worth it -and it causes 3 different crashes last years. - -.. - -.. bpo: 34762 -.. date: 2018-09-21-11-06-56 -.. nonce: 1nN53m -.. section: Core and Builtins - -Fix contextvars C API to use PyObject* pointer types. - -.. - -.. bpo: 34751 -.. date: 2018-09-20-15-41-58 -.. nonce: Yiv0pV -.. section: Core and Builtins - -The hash function for tuples is now based on xxHash which gives better -collision results on (formerly) pathological cases. Additionally, on 64-bit -systems it improves tuple hashes in general. Patch by Jeroen Demeyer with -substantial contributions by Tim Peters. - -.. - -.. bpo: 34735 -.. date: 2018-09-19-06-57-34 -.. nonce: -3mrSJ -.. section: Core and Builtins - -Fix a memory leak in Modules/timemodule.c. Patch by Zackery Spytz. - -.. - -.. bpo: 34683 -.. date: 2018-09-15-19-32-34 -.. nonce: msCiQE -.. section: Core and Builtins - -Fixed a bug where some SyntaxError error pointed to locations that were -off-by-one. - -.. - -.. bpo: 34651 -.. date: 2018-09-13-12-21-08 -.. nonce: v-bUeV -.. section: Core and Builtins - -Only allow the main interpreter to fork. The avoids the possibility of -affecting the main interpreter, which is critical to operation of the -runtime. - -.. - -.. bpo: 34653 -.. date: 2018-09-13-12-06-09 -.. nonce: z8NE-i -.. section: Core and Builtins - -Remove unused function PyParser_SimpleParseStringFilename. - -.. - -.. bpo: 32236 -.. date: 2018-09-11-23-50-40 -.. nonce: 3RupnN -.. section: Core and Builtins - -Warn that line buffering is not supported if :func:`open` is called with -binary mode and ``buffering=1``. - -.. - -.. bpo: 34641 -.. date: 2018-09-11-23-12-33 -.. nonce: gFBCc9 -.. section: Core and Builtins - -Further restrict the syntax of the left-hand side of keyword arguments in -function calls. In particular, ``f((keyword)=arg)`` is now disallowed. - -.. - -.. bpo: 34637 -.. date: 2018-09-11-17-25-44 -.. nonce: HSLqY4 -.. section: Core and Builtins - -Make the *start* argument to *sum()* visible as a keyword argument. - -.. - -.. bpo: 1621 -.. date: 2018-09-11-15-19-37 -.. nonce: 7o19yG -.. section: Core and Builtins - -Do not assume signed integer overflow behavior (C undefined behavior) when -performing set hash table resizing. - -.. - -.. bpo: 34588 -.. date: 2018-09-05-22-56-52 -.. nonce: UIuPmL -.. section: Core and Builtins - -Fix an off-by-one in the recursive call pruning feature of traceback -formatting. - -.. - -.. bpo: 34485 -.. date: 2018-08-29-11-04-19 -.. nonce: c2AFdp -.. section: Core and Builtins - -On Windows, the LC_CTYPE is now set to the user preferred locale at startup. -Previously, the LC_CTYPE locale was "C" at startup, but changed when calling -setlocale(LC_CTYPE, "") or setlocale(LC_ALL, ""). - -.. - -.. bpo: 34485 -.. date: 2018-08-29-09-27-47 -.. nonce: 5aJCmw -.. section: Core and Builtins - -Standard streams like sys.stdout now use the "surrogateescape" error -handler, instead of "strict", on the POSIX locale (when the C locale is not -coerced and the UTF-8 Mode is disabled). - -.. - -.. bpo: 34485 -.. date: 2018-08-28-23-01-14 -.. nonce: dq1Kqk -.. section: Core and Builtins - -Fix the error handler of standard streams like sys.stdout: -PYTHONIOENCODING=":" is now ignored instead of setting the error handler to -"strict". - -.. - -.. bpo: 34485 -.. date: 2018-08-28-17-48-40 -.. nonce: aFwck2 -.. section: Core and Builtins - -Python now gets the locale encoding with C code to initialize the encoding -of standard streams like sys.stdout. Moreover, the encoding is now -initialized to the Python codec name to get a normalized encoding name and -to ensure that the codec is loaded. The change avoids importing _bootlocale -and _locale modules at startup by default. - -.. - -.. bpo: 34527 -.. date: 2018-08-28-11-53-39 -.. nonce: aBEX9b -.. section: Core and Builtins - -On FreeBSD, Py_DecodeLocale() and Py_EncodeLocale() now also forces the -ASCII encoding if the LC_CTYPE locale is "POSIX", not only if the LC_CTYPE -locale is "C". - -.. - -.. bpo: 34527 -.. date: 2018-08-28-11-52-13 -.. nonce: sh5MQJ -.. section: Core and Builtins - -The UTF-8 Mode is now also enabled by the "POSIX" locale, not only by the -"C" locale. - -.. - -.. bpo: 34403 -.. date: 2018-08-28-10-49-55 -.. nonce: 4Q3LzP -.. section: Core and Builtins - -On HP-UX with C or POSIX locale, sys.getfilesystemencoding() now returns -"ascii" instead of "roman8" (when the UTF-8 Mode is disabled and the C -locale is not coerced). - -.. - -.. bpo: 34523 -.. date: 2018-08-28-01-45-01 -.. nonce: aUUkc3 -.. section: Core and Builtins - -The Python filesystem encoding is now read earlier during the Python -initialization. - -.. - -.. bpo: 12458 -.. date: 2018-08-15-20-46-49 -.. nonce: ApHbx5 -.. section: Core and Builtins - -Tracebacks show now correct line number for subexpressions in multiline -expressions. Tracebacks show now the line number of the first line for -multiline expressions instead of the line number of the last subexpression. - -.. - -.. bpo: 34408 -.. date: 2018-08-14-22-35-19 -.. nonce: aomWYW -.. section: Core and Builtins - -Prevent a null pointer dereference and resource leakage in -``PyInterpreterState_New()``. - -.. - -.. bpo: 34400 -.. date: 2018-08-14-03-52-43 -.. nonce: AJD0bz -.. section: Core and Builtins - -Fix undefined behavior in parsetok.c. Patch by Zackery Spytz. - -.. - -.. bpo: 33073 -.. date: 2018-08-12-16-03-58 -.. nonce: XWu1Jh -.. section: Core and Builtins - -Added as_integer_ratio to ints to make them more interoperable with floats. - -.. - -.. bpo: 34377 -.. date: 2018-08-10-15-05-00 -.. nonce: EJMMY4 -.. section: Core and Builtins - -Update valgrind suppression list to use -``_PyObject_Free``/``_PyObject_Realloc`` instead of -``PyObject_Free``/``PyObject_Realloc``. - -.. - -.. bpo: 34353 -.. date: 2018-08-09-18-42-49 -.. nonce: GIOm_8 -.. section: Core and Builtins - -Added the "socket" option in the `stat.filemode()` Python implementation to -match the C implementation. - -.. - -.. bpo: 34320 -.. date: 2018-08-02-22-34-59 -.. nonce: hNshAA -.. section: Core and Builtins - -Fix ``dict(od)`` didn't copy iteration order of OrderedDict. - -.. - -.. bpo: 34113 -.. date: 2018-07-28-10-34-00 -.. nonce: eZ5FWV -.. section: Core and Builtins - -Fixed crash on debug builds when opcode stack was adjusted with negative -numbers. Patch by Constantin Petrisor. - -.. - -.. bpo: 34100 -.. date: 2018-07-27-20-04-52 -.. nonce: ypJQX1 -.. section: Core and Builtins - -Compiler now merges constants in tuples and frozensets recursively. Code -attributes like ``co_names`` are merged too. - -.. - -.. bpo: 34151 -.. date: 2018-07-25-20-26-02 -.. nonce: Q2pK9Q -.. section: Core and Builtins - -Performance of list concatenation, repetition and slicing operations is -slightly improved. Patch by Sergey Fedoseev. - -.. - -.. bpo: 34170 -.. date: 2018-07-25-19-23-33 -.. nonce: v1h_H2 -.. section: Core and Builtins - --X dev: it is now possible to override the memory allocator using -PYTHONMALLOC even if the developer mode is enabled. - -.. - -.. bpo: 33237 -.. date: 2018-07-24-12-54-57 -.. nonce: O95mps -.. section: Core and Builtins - -Improved :exc:`AttributeError` message for partially initialized module. - -.. - -.. bpo: 34149 -.. date: 2018-07-23-21-49-05 -.. nonce: WSV-_g -.. section: Core and Builtins - -Fix min and max functions to get default behavior when key is None. - -.. - -.. bpo: 34125 -.. date: 2018-07-23-16-34-03 -.. nonce: jCl2Q2 -.. section: Core and Builtins - -Profiling of unbound built-in methods now works when ``**kwargs`` is given. - -.. - -.. bpo: 34141 -.. date: 2018-07-18-08-36-58 -.. nonce: Fo7Q5r -.. section: Core and Builtins - -Optimized pickling atomic types (None, bool, int, float, bytes, str). - -.. - -.. bpo: 34126 -.. date: 2018-07-16-20-55-29 -.. nonce: mBVmgc -.. section: Core and Builtins - -Fix crashes when profiling certain invalid calls of unbound methods. Patch -by Jeroen Demeyer. - -.. - -.. bpo: 24618 -.. date: 2018-07-14-14-01-37 -.. nonce: iTKjD_ -.. section: Core and Builtins - -Fixed reading invalid memory when create the code object with too small -varnames tuple or too large argument counts. - -.. - -.. bpo: 34068 -.. date: 2018-07-14-08-58-46 -.. nonce: 9xfM55 -.. section: Core and Builtins - -In :meth:`io.IOBase.close`, ensure that the :attr:`~io.IOBase.closed` -attribute is not set with a live exception. Patch by Zackery Spytz and -Serhiy Storchaka. - -.. - -.. bpo: 34087 -.. date: 2018-07-13-22-09-55 -.. nonce: I1Bxfc -.. section: Core and Builtins - -Fix buffer overflow while converting unicode to numeric values. - -.. - -.. bpo: 34080 -.. date: 2018-07-10-11-24-16 -.. nonce: 8t7PtO -.. section: Core and Builtins - -Fixed a memory leak in the compiler when it raised some uncommon errors -during tokenizing. - -.. - -.. bpo: 34066 -.. date: 2018-07-07-20-15-34 -.. nonce: y9vs6s -.. section: Core and Builtins - -Disabled interruption by Ctrl-C between calling ``open()`` and entering a -**with** block in ``with open()``. - -.. - -.. bpo: 34042 -.. date: 2018-07-05-15-51-29 -.. nonce: Gr9XUH -.. section: Core and Builtins - -Fix dict.copy() to maintain correct total refcount (as reported by -sys.gettotalrefcount()). - -.. - -.. bpo: 33418 -.. date: 2018-07-03-19-00-10 -.. nonce: cfGm3n -.. section: Core and Builtins - -Fix potential memory leak in function object when it creates reference -cycle. - -.. - -.. bpo: 33985 -.. date: 2018-06-27-18-56-41 -.. nonce: ILJ3Af -.. section: Core and Builtins - -Implement contextvars.ContextVar.name attribute. - -.. - -.. bpo: 33956 -.. date: 2018-06-25-20-42-44 -.. nonce: 1qoTwD -.. section: Core and Builtins - -Update vendored Expat library copy to version 2.2.5. - -.. - -.. bpo: 24596 -.. date: 2018-06-25-16-54-05 -.. nonce: Rkwova -.. section: Core and Builtins - -Decref the module object in :c:func:`PyRun_SimpleFileExFlags` before calling -:c:func:`PyErr_Print()`. Patch by Zackery Spytz. - -.. - -.. bpo: 33451 -.. date: 2018-06-23-15-32-02 -.. nonce: sWN-1l -.. section: Core and Builtins - -Close directly executed pyc files before calling ``PyEval_EvalCode()``. - -.. - -.. bpo: 1617161 -.. date: 2018-06-21-21-42-15 -.. nonce: tSo2yM -.. section: Core and Builtins - -The hash of :class:`BuiltinMethodType` instances (methods of built-in -classes) now depends on the hash of the identity of *__self__* instead of -its value. The hash and equality of :class:`ModuleType` and -:class:`MethodWrapperType` instances (methods of user-defined classes and -some methods of built-in classes like ``str.__add__``) now depend on the -hash and equality of the identity of *__self__* instead of its value. -:class:`MethodWrapperType` instances no longer support ordering. - -.. - -.. bpo: 33824 -.. date: 2018-06-15-19-39-06 -.. nonce: DfWHT3 -.. section: Core and Builtins - -Fix "LC_ALL=C python3.7 -V": reset properly the command line parser when the -encoding changes after reading the Python configuration. - -.. - -.. bpo: 33803 -.. date: 2018-06-07-20-18-38 -.. nonce: n-Nq6_ -.. section: Core and Builtins - -Fix a crash in hamt.c caused by enabling GC tracking for an object that -hadn't all of its fields set to NULL. - -.. - -.. bpo: 33738 -.. date: 2018-06-07-18-34-19 -.. nonce: ODZS7a -.. section: Core and Builtins - -Seven macro incompatibilities with the Limited API were fixed, and the -macros :c:func:`PyIter_Check`, :c:func:`PyIndex_Check` and -:c:func:`PyExceptionClass_Name` were added as functions. A script for -automatic macro checks was added. - -.. - -.. bpo: 33786 -.. date: 2018-06-06-23-24-40 -.. nonce: lBvT8z -.. section: Core and Builtins - -Fix asynchronous generators to handle GeneratorExit in athrow() correctly - -.. - -.. bpo: 30167 -.. date: 2018-06-05-15-49-02 -.. nonce: e956hA -.. section: Core and Builtins - -``PyRun_SimpleFileExFlags`` removes ``__cached__`` from module in addition -to ``__file__``. - -.. - -.. bpo: 33706 -.. date: 2018-05-31-14-50-04 -.. nonce: ztlH04 -.. section: Core and Builtins - -Fix a crash in Python initialization when parsing the command line options. -Thanks Christoph Gohlke for the bug report and the fix! - -.. - -.. bpo: 33597 -.. date: 2018-05-28-21-17-31 -.. nonce: r0ToM4 -.. section: Core and Builtins - -Reduce ``PyGC_Head`` size from 3 words to 2 words. - -.. - -.. bpo: 30654 -.. date: 2018-05-28-12-28-53 -.. nonce: 9fDJye -.. section: Core and Builtins - -Fixed reset of the SIGINT handler to SIG_DFL on interpreter shutdown even -when there was a custom handler set previously. Patch by Philipp Kerling. - -.. - -.. bpo: 33622 -.. date: 2018-05-23-20-46-14 -.. nonce: xPucO9 -.. section: Core and Builtins - -Fixed a leak when the garbage collector fails to add an object with the -``__del__`` method or referenced by it into the :data:`gc.garbage` list. -:c:func:`PyGC_Collect` can now be called when an exception is set and -preserves it. - -.. - -.. bpo: 33462 -.. date: 2018-05-23-17-18-02 -.. nonce: gurbpbrhe -.. section: Core and Builtins - -Make dict and dict views reversible. Patch by Rémi Lapeyre. - -.. - -.. bpo: 23722 -.. date: 2018-05-17-13-06-36 -.. nonce: xisqZk -.. section: Core and Builtins - -A :exc:`RuntimeError` is now raised when the custom metaclass doesn't -provide the ``__classcell__`` entry in the namespace passed to -``type.__new__``. A :exc:`DeprecationWarning` was emitted in Python -3.6--3.7. - -.. - -.. bpo: 33499 -.. date: 2018-05-15-10-48-47 -.. nonce: uBEc06 -.. section: Core and Builtins - -Add :envvar:`PYTHONPYCACHEPREFIX` environment variable and :option:`-X` -``pycache_prefix`` command-line option to set an alternate root directory -for writing module bytecode cache files. - -.. - -.. bpo: 25711 -.. date: 2018-05-14-18-54-03 -.. nonce: 9xfq-v -.. section: Core and Builtins - -The :mod:`zipimport` module has been rewritten in pure Python. - -.. - -.. bpo: 33509 -.. date: 2018-05-14-17-31-02 -.. nonce: pIUfTd -.. section: Core and Builtins - -Fix module_globals parameter of warnings.warn_explicit(): don't crash if -module_globals is not a dict. - -.. - -.. bpo: 31849 -.. date: 2018-05-14-11-00-00 -.. nonce: EmHaH4 -.. section: Core and Builtins - -Fix signed/unsigned comparison warning in pyhash.c. - -.. - -.. bpo: 33475 -.. date: 2018-05-13-01-26-18 -.. nonce: rI0y1U -.. section: Core and Builtins - -Fixed miscellaneous bugs in converting annotations to strings and optimized -parentheses in the string representation. - -.. - -.. bpo: 20104 -.. date: 2018-05-05-23-26-58 -.. nonce: tDBciE -.. section: Core and Builtins - -Added support for the `setpgroup`, `resetids`, `setsigmask`, `setsigdef` and -`scheduler` parameters of `posix_spawn`. Patch by Pablo Galindo. - -.. - -.. bpo: 33391 -.. date: 2018-05-02-08-36-03 -.. nonce: z4a7rb -.. section: Core and Builtins - -Fix a leak in set_symmetric_difference(). - -.. - -.. bpo: 33363 -.. date: 2018-04-26-22-48-28 -.. nonce: 8RCnN2 -.. section: Core and Builtins - -Raise a SyntaxError for ``async with`` and ``async for`` statements outside -of async functions. - -.. - -.. bpo: 28055 -.. date: 2018-04-25-20-44-42 -.. nonce: f49kfC -.. section: Core and Builtins - -Fix unaligned accesses in siphash24(). Patch by Rolf Eike Beer. - -.. - -.. bpo: 33128 -.. date: 2018-04-24-22-31-04 -.. nonce: g2yLuf -.. section: Core and Builtins - -Fix a bug that causes PathFinder to appear twice on sys.meta_path. Patch by -Pablo Galindo Salgado. - -.. - -.. bpo: 33331 -.. date: 2018-04-22-13-41-59 -.. nonce: s_DxdL -.. section: Core and Builtins - -Modules imported last are now cleared first at interpreter shutdown. - -.. - -.. bpo: 33312 -.. date: 2018-04-19-08-30-07 -.. nonce: mDe2iL -.. section: Core and Builtins - -Fixed clang ubsan (undefined behavior sanitizer) warnings in dictobject.c by -adjusting how the internal struct _dictkeysobject shared keys structure is -declared. - -.. - -.. bpo: 33305 -.. date: 2018-04-18-14-17-44 -.. nonce: 9z3dDH -.. section: Core and Builtins - -Improved syntax error messages for invalid numerical literals. - -.. - -.. bpo: 33306 -.. date: 2018-04-18-12-23-30 -.. nonce: tSM3cp -.. section: Core and Builtins - -Improved syntax error messages for unbalanced parentheses. - -.. - -.. bpo: 33234 -.. date: 2018-04-17-01-24-51 -.. nonce: l9IDtp -.. section: Core and Builtins - -The list constructor will pre-size and not over-allocate when the input -length is known. - -.. - -.. bpo: 33270 -.. date: 2018-04-14-13-12-50 -.. nonce: UmVV6i -.. section: Core and Builtins - -Intern the names for all anonymous code objects. Patch by Zackery Spytz. - -.. - -.. bpo: 30455 -.. date: 2018-04-14-11-02-57 -.. nonce: ANRwjo -.. section: Core and Builtins - -The C and Python code and the documentation related to tokens are now -generated from a single source file :file:`Grammar/Tokens`. - -.. - -.. bpo: 33176 -.. date: 2018-04-13-22-31-09 -.. nonce: PB9com -.. section: Core and Builtins - -Add a ``toreadonly()`` method to memoryviews. - -.. - -.. bpo: 33231 -.. date: 2018-04-05-22-20-44 -.. nonce: 3Jmo0q -.. section: Core and Builtins - -Fix potential memory leak in ``normalizestring()``. - -.. - -.. bpo: 33205 -.. date: 2018-04-03-00-58-41 -.. nonce: lk2F3r -.. section: Core and Builtins - -Change dict growth function from -``round_up_to_power_2(used*2+hashtable_size/2)`` to -``round_up_to_power_2(used*3)``. Previously, dict is shrinked only when -``used == 0``. Now dict has more chance to be shrinked. - -.. - -.. bpo: 29922 -.. date: 2018-04-03-00-30-25 -.. nonce: CdLuMl -.. section: Core and Builtins - -Improved error messages in 'async with' when ``__aenter__()`` or -``__aexit__()`` return non-awaitable object. - -.. - -.. bpo: 33199 -.. date: 2018-04-02-09-32-40 -.. nonce: TPnxQu -.. section: Core and Builtins - -Fix ``ma_version_tag`` in dict implementation is uninitialized when copying -from key-sharing dict. - -.. - -.. bpo: 33053 -.. date: 2018-03-25-19-49-06 -.. nonce: V3xlsH -.. section: Core and Builtins - -When using the -m switch, sys.path[0] is now explicitly expanded as the -*starting* working directory, rather than being left as the empty path -(which allows imports from the current working directory at the time of the -import) - -.. - -.. bpo: 33138 -.. date: 2018-03-25-19-25-14 -.. nonce: aSqudH -.. section: Core and Builtins - -Changed standard error message for non-pickleable and non-copyable types. It -now says "cannot pickle" instead of "can't pickle" or "cannot serialize". - -.. - -.. bpo: 33018 -.. date: 2018-03-22-23-09-06 -.. nonce: 0ncEJV -.. section: Core and Builtins - -Improve consistency of errors raised by ``issubclass()`` when called with a -non-class and an abstract base class as the first and second arguments, -respectively. Patch by Josh Bronson. - -.. - -.. bpo: 33083 -.. date: 2018-03-19-00-59-20 -.. nonce: Htztjl -.. section: Core and Builtins - -``math.factorial`` no longer accepts arguments that are not int-like. Patch -by Pablo Galindo. - -.. - -.. bpo: 33041 -.. date: 2018-03-18-13-56-14 -.. nonce: XwPhI2 -.. section: Core and Builtins - -Added new opcode :opcode:`END_ASYNC_FOR` and fixes the following issues: - -* Setting global :exc:`StopAsyncIteration` no longer breaks ``async for`` - loops. -* Jumping into an ``async for`` loop is now disabled. -* Jumping out of an ``async for`` loop no longer corrupts the stack. - -.. - -.. bpo: 25750 -.. date: 2018-03-14-21-42-17 -.. nonce: lxgkQz -.. section: Core and Builtins - -Fix rare Python crash due to bad refcounting in ``type_getattro()`` if a -descriptor deletes itself from the class. Patch by Jeroen Demeyer. - -.. - -.. bpo: 33041 -.. date: 2018-03-10-15-16-40 -.. nonce: -ak5Fk -.. section: Core and Builtins - -Fixed bytecode generation for "async for" with a complex target. A -StopAsyncIteration raised on assigning or unpacking will be now propagated -instead of stopping the iteration. - -.. - -.. bpo: 33026 -.. date: 2018-03-08-09-48-38 -.. nonce: QZA3Ba -.. section: Core and Builtins - -Fixed jumping out of "with" block by setting f_lineno. - -.. - -.. bpo: 33005 -.. date: 2018-03-06-12-19-19 -.. nonce: LP-V2U -.. section: Core and Builtins - -Fix a crash on fork when using a custom memory allocator (ex: using -PYTHONMALLOC env var). _PyGILState_Reinit() and _PyInterpreterState_Enable() -now use the default RAW memory allocator to allocate a new interpreters -mutex on fork. - -.. - -.. bpo: 32911 -.. date: 2018-02-27-20-57-00 -.. nonce: cmKfco -.. section: Core and Builtins - -Due to unexpected compatibility issues discovered during downstream beta -testing, reverted :issue:`29463`. ``docstring`` field is removed from -Module, ClassDef, FunctionDef, and AsyncFunctionDef ast nodes which was -added in 3.7a1. Docstring expression is restored as a first statement in -their body. Based on patch by Inada Naoki. - -.. - -.. bpo: 17288 -.. date: 2018-02-27-13-36-21 -.. nonce: Gdj24S -.. section: Core and Builtins - -Prevent jumps from 'return' and 'exception' trace events. - -.. - -.. bpo: 32946 -.. date: 2018-02-25-10-52-40 -.. nonce: Lo09rG -.. section: Core and Builtins - -Importing names from already imported module with "from ... import ..." is -now 30% faster if the module is not a package. - -.. - -.. bpo: 32932 -.. date: 2018-02-24-21-51-42 -.. nonce: 2cz31L -.. section: Core and Builtins - -Make error message more revealing when there are non-str objects in -``__all__``. - -.. - -.. bpo: 32925 -.. date: 2018-02-24-00-07-05 -.. nonce: e-7Ufh -.. section: Core and Builtins - -Optimized iterating and containing test for literal lists consisting of -non-constants: ``x in [a, b]`` and ``for x in [a, b]``. The case of all -constant elements already was optimized. - -.. - -.. bpo: 32889 -.. date: 2018-02-20-21-53-48 -.. nonce: J6eWy5 -.. section: Core and Builtins - -Update Valgrind suppression list to account for the rename of -``Py_ADDRESS_IN_RANG`` to ``address_in_range``. - -.. - -.. bpo: 32836 -.. date: 2018-02-14-12-35-47 -.. nonce: bThJnx -.. section: Core and Builtins - -Don't use temporary variables in cases of list/dict/set comprehensions - -.. - -.. bpo: 31356 -.. date: 2018-02-02-08-50-46 -.. nonce: MNwUOQ -.. section: Core and Builtins - -Remove the new API added in bpo-31356 (gc.ensure_disabled() context -manager). - -.. - -.. bpo: 32305 -.. date: 2018-02-01-10-56-41 -.. nonce: dkU9Qa -.. section: Core and Builtins - -For namespace packages, ensure that both ``__file__`` and -``__spec__.origin`` are set to None. - -.. - -.. bpo: 32303 -.. date: 2018-02-01-10-16-28 -.. nonce: VsvhSl -.. section: Core and Builtins - -Make sure ``__spec__.loader`` matches ``__loader__`` for namespace packages. - -.. - -.. bpo: 32711 -.. date: 2018-01-29-14-36-37 -.. nonce: 8hQFJP -.. section: Core and Builtins - -Fix the warning messages for Python/ast_unparse.c. Patch by Stéphane Wirtel - -.. - -.. bpo: 32583 -.. date: 2018-01-26-21-20-21 -.. nonce: Fh3fau -.. section: Core and Builtins - -Fix possible crashing in builtin Unicode decoders caused by write -out-of-bound errors when using customized decode error handlers. - -.. - -.. bpo: 32489 -.. date: 2018-01-03-23-12-43 -.. nonce: SDEPHB -.. section: Core and Builtins - -A :keyword:`continue` statement is now allowed in the :keyword:`finally` -clause. - -.. - -.. bpo: 17611 -.. date: 2017-12-24-19-48-59 -.. nonce: P85kWL -.. section: Core and Builtins - -Simplified the interpreter loop by moving the logic of unrolling the stack -of blocks into the compiler. The compiler emits now explicit instructions -for adjusting the stack of values and calling the cleaning up code for -:keyword:`break`, :keyword:`continue` and :keyword:`return`. - -Removed opcodes :opcode:`BREAK_LOOP`, :opcode:`CONTINUE_LOOP`, -:opcode:`SETUP_LOOP` and :opcode:`SETUP_EXCEPT`. Added new opcodes -:opcode:`ROT_FOUR`, :opcode:`BEGIN_FINALLY` and :opcode:`CALL_FINALLY` and -:opcode:`POP_FINALLY`. Changed the behavior of :opcode:`END_FINALLY` and -:opcode:`WITH_CLEANUP_START`. - -.. - -.. bpo: 32285 -.. date: 2017-12-12-13-43-13 -.. nonce: LzKSwz -.. section: Core and Builtins - -New function unicodedata.is_normalized, which can check whether a string is -in a specific normal form. - -.. - -.. bpo: 10544 -.. date: 2017-11-26-00-59-22 -.. nonce: fHOM3V -.. section: Core and Builtins - -Yield expressions are now disallowed in comprehensions and generator -expressions except the expression for the outermost iterable. - -.. - -.. bpo: 32117 -.. date: 2017-11-22-15-43-14 -.. nonce: -vloh8 -.. section: Core and Builtins - -Iterable unpacking is now allowed without parentheses in yield and return -statements, e.g. ``yield 1, 2, 3, *rest``. Thanks to David Cuthbert for the -change and Jordan Chapman for added tests. - -.. - -.. bpo: 31902 -.. date: 2017-10-30-12-44-50 -.. nonce: a07fa57 -.. section: Core and Builtins - -Fix the ``col_offset`` attribute for ast nodes ``ast.AsyncFor``, -``ast.AsyncFunctionDef``, and ``ast.AsyncWith``. Previously, ``col_offset`` -pointed to the keyword after ``async``. - -.. - -.. bpo: 25862 -.. date: 2017-10-07-10-13-15 -.. nonce: FPYBA5 -.. section: Core and Builtins - -Fix assertion failures in the ``tell()`` method of ``io.TextIOWrapper``. -Patch by Zackery Spytz. - -.. - -.. bpo: 21983 -.. date: 2017-10-02-21-02-14 -.. nonce: UoC319 -.. section: Core and Builtins - -Fix a crash in `ctypes.cast()` in case the type argument is a ctypes -structured data type. Patch by Eryk Sun and Oren Milman. - -.. - -.. bpo: 31577 -.. date: 2017-09-25-20-36-24 -.. nonce: jgYsSA -.. section: Core and Builtins - -Fix a crash in `os.utime()` in case of a bad ns argument. Patch by Oren -Milman. - -.. - -.. bpo: 29832 -.. date: 2017-09-12-08-11-01 -.. nonce: Kuf2M7 -.. section: Core and Builtins - -Remove references to 'getsockaddrarg' from various socket error messages. -Patch by Oren Milman. - -.. - -.. bpo: 35845 -.. date: 2019-02-02-00-04-01 -.. nonce: 1jx2wk -.. section: Library - -Add 'order' parameter to memoryview.tobytes(). - -.. - -.. bpo: 35864 -.. date: 2019-01-30-20-22-36 -.. nonce: ig9KnG -.. section: Library - -The _asdict() method for collections.namedtuple now returns a regular dict -instead of an OrderedDict. - -.. - -.. bpo: 35537 -.. date: 2019-01-29-17-24-52 -.. nonce: Q0ktFC -.. section: Library - -An ExitStack is now used internally within subprocess.POpen to clean up pipe -file handles. No behavior change in normal operation. But if closing one -handle were ever to cause an exception, the others will now be closed -instead of leaked. (patch by Giampaolo Rodola) - -.. - -.. bpo: 35847 -.. date: 2019-01-29-09-11-09 -.. nonce: eiSi4t -.. section: Library - -RISC-V needed the CTYPES_PASS_BY_REF_HACK. Fixes ctypes Structure -test_pass_by_value. - -.. - -.. bpo: 35813 -.. date: 2019-01-23-22-44-37 -.. nonce: Yobj-Y -.. section: Library - -Shared memory submodule added to multiprocessing to avoid need for -serialization between processes - -.. - -.. bpo: 35780 -.. date: 2019-01-19-17-01-43 -.. nonce: CLf7fT -.. section: Library - -Fix lru_cache() errors arising in recursive, reentrant, or multi-threaded -code. These errors could result in orphan links and in the cache being -trapped in a state with fewer than the specified maximum number of links. -Fix handling of negative maxsize which should have been treated as zero. Fix -errors in toggling the "full" status flag. Fix misordering of links when -errors are encountered. Sync-up the C code and pure Python code for the -space saving path in functions with a single positional argument. In this -common case, the space overhead of an lru cache entry is reduced by almost -half. Fix counting of cache misses. In error cases, the miss count was out -of sync with the actual number of times the underlying user function was -called. - -.. - -.. bpo: 35537 -.. date: 2019-01-18-13-44-13 -.. nonce: R1lbTl -.. section: Library - -:func:`os.posix_spawn` and :func:`os.posix_spawnp` now have a *setsid* -parameter. - -.. - -.. bpo: 23846 -.. date: 2019-01-15-13-31-30 -.. nonce: LT_qL8 -.. section: Library - -:class:`asyncio.ProactorEventLoop` now catches and logs send errors when the -self-pipe is full. - -.. - -.. bpo: 34323 -.. date: 2019-01-14-17-34-36 -.. nonce: CRErrt -.. section: Library - -:mod:`asyncio`: Enhance ``IocpProactor.close()`` log: wait 1 second before -the first log, then log every second. Log also the number of seconds since -``close()`` was called. - -.. - -.. bpo: 35674 -.. date: 2019-01-14-14-13-08 -.. nonce: kamWqz -.. section: Library - -Add a new :func:`os.posix_spawnp` function. Patch by Joannah Nanjekye. - -.. - -.. bpo: 35733 -.. date: 2019-01-13-18-42-41 -.. nonce: eFfLiv -.. section: Library - -``ast.Constant(boolean)`` no longer an instance of :class:`ast.Num`. Patch -by Anthony Sottile. - -.. - -.. bpo: 35726 -.. date: 2019-01-13-01-33-00 -.. nonce: dasdas -.. section: Library - -QueueHandler.prepare() now makes a copy of the record before modifying and -enqueueing it, to avoid affecting other handlers in the chain. - -.. - -.. bpo: 35719 -.. date: 2019-01-11-20-21-59 -.. nonce: qyRcpE -.. section: Library - -Sped up multi-argument :mod:`math` functions atan2(), copysign(), -remainder() and hypot() by 1.3--2.5 times. - -.. - -.. bpo: 35717 -.. date: 2019-01-11-17-56-15 -.. nonce: 6TDTB_ -.. section: Library - -Fix KeyError exception raised when using enums and compile. Patch -contributed by Rémi Lapeyre. - -.. - -.. bpo: 35699 -.. date: 2019-01-11-07-09-25 -.. nonce: VDiENF -.. section: Library - -Fixed detection of Visual Studio Build Tools 2017 in distutils - -.. - -.. bpo: 32710 -.. date: 2019-01-10-15-55-10 -.. nonce: KwECPu -.. section: Library - -Fix memory leaks in asyncio ProactorEventLoop on overlapped operation -failure. - -.. - -.. bpo: 35702 -.. date: 2019-01-10-14-03-12 -.. nonce: _ct_0H -.. section: Library - -The :data:`time.CLOCK_UPTIME_RAW` constant is now available for macOS 10.12. - -.. - -.. bpo: 32710 -.. date: 2019-01-08-14-00-52 -.. nonce: Sn5Ujj -.. section: Library - -Fix a memory leak in asyncio in the ProactorEventLoop when ``ReadFile()`` or -``WSASend()`` overlapped operation fail immediately: release the internal -buffer. - -.. - -.. bpo: 35682 -.. date: 2019-01-08-01-54-02 -.. nonce: KDM9lk -.. section: Library - -Fix ``asyncio.ProactorEventLoop.sendfile()``: don't attempt to set the -result of an internal future if it's already done. - -.. - -.. bpo: 35283 -.. date: 2019-01-07-17-17-16 -.. nonce: WClosC -.. section: Library - -Add a deprecated warning for the :meth:`threading.Thread.isAlive` method. -Patch by Dong-hee Na. - -.. - -.. bpo: 35664 -.. date: 2019-01-04-22-18-25 -.. nonce: Z-Gyyj -.. section: Library - -Improve operator.itemgetter() performance by 33% with optimized argument -handling and with adding a fast path for the common case of a single -non-negative integer index into a tuple (which is the typical use case in -the standard library). - -.. - -.. bpo: 35643 -.. date: 2019-01-02-20-04-49 -.. nonce: DaMiaV -.. section: Library - -Fixed a SyntaxWarning: invalid escape sequence in Modules/_sha3/cleanup.py. -Patch by Mickaël Schoentgen. - -.. - -.. bpo: 35619 -.. date: 2018-12-30-19-50-36 -.. nonce: ZRXdhy -.. section: Library - -Improved support of custom data descriptors in :func:`help` and -:mod:`pydoc`. - -.. - -.. bpo: 28503 -.. date: 2018-12-30-14-56-33 -.. nonce: V4kNN3 -.. section: Library - -The `crypt` module now internally uses the `crypt_r()` library function -instead of `crypt()` when available. - -.. - -.. bpo: 35614 -.. date: 2018-12-30-01-10-50 -.. nonce: cnkM4f -.. section: Library - -Fixed help() on metaclasses. Patch by Sanyam Khurana. - -.. - -.. bpo: 35568 -.. date: 2018-12-27-19-23-00 -.. nonce: PutiOC -.. section: Library - -Expose ``raise(signum)`` as `raise_signal` - -.. - -.. bpo: 35588 -.. date: 2018-12-26-10-55-59 -.. nonce: PSR6Ez -.. section: Library - -The floor division and modulo operations and the :func:`divmod` function on -:class:`fractions.Fraction` types are 2--4x faster. Patch by Stefan Behnel. - -.. - -.. bpo: 35585 -.. date: 2018-12-26-02-28-00 -.. nonce: Lkzd3Z -.. section: Library - -Speed-up building enums by value, e.g. http.HTTPStatus(200). - -.. - -.. bpo: 30561 -.. date: 2018-12-23-22-27-59 -.. nonce: PSRQ2w -.. section: Library - -random.gammavariate(1.0, beta) now computes the same result as -random.expovariate(1.0 / beta). This synchonizes the two algorithms and -eliminates some idiosyncrasies in the old implementation. It does however -produce a difference stream of random variables than it used to. - -.. - -.. bpo: 35537 -.. date: 2018-12-20-16-24-51 -.. nonce: z4E7aA -.. section: Library - -The :mod:`subprocess` module can now use the :func:`os.posix_spawn` function -in some cases for better performance. - -.. - -.. bpo: 35526 -.. date: 2018-12-18-21-12-25 -.. nonce: fYvo6H -.. section: Library - -Delaying the 'joke' of barry_as_FLUFL.mandatory to Python version 4.0 - -.. - -.. bpo: 35523 -.. date: 2018-12-18-13-52-13 -.. nonce: SkoMno -.. section: Library - -Remove :mod:`ctypes` callback workaround: no longer create a callback at -startup. Avoid SELinux alert on ``import ctypes`` and ``import uuid``. - -.. - -.. bpo: 31784 -.. date: 2018-12-17-11-43-11 -.. nonce: W0gDjC -.. section: Library - -:func:`uuid.uuid1` now calls :func:`time.time_ns` rather than -``int(time.time() * 1e9)``. - -.. - -.. bpo: 35513 -.. date: 2018-12-16-23-28-49 -.. nonce: pn-Zh3 -.. section: Library - -:class:`~unittest.runner.TextTestRunner` of :mod:`unittest.runner` now uses -:func:`time.perf_counter` rather than :func:`time.time` to measure the -execution time of a test: :func:`time.time` can go backwards, whereas -:func:`time.perf_counter` is monotonic. - -.. - -.. bpo: 35502 -.. date: 2018-12-14-23-56-48 -.. nonce: gLHuFS -.. section: Library - -Fixed reference leaks in :class:`xml.etree.ElementTree.TreeBuilder` in case -of unfinished building of the tree (in particular when an error was raised -during parsing XML). - -.. - -.. bpo: 35348 -.. date: 2018-12-14-13-27-45 -.. nonce: u3Y2an -.. section: Library - -Make :func:`platform.architecture` parsing of ``file`` command output more -reliable: add the ``-b`` option to the ``file`` command to omit the -filename, force the usage of the C locale, and search also the "shared -object" pattern. - -.. - -.. bpo: 35491 -.. date: 2018-12-14-12-12-15 -.. nonce: jHsNOU -.. section: Library - -:mod:`multiprocessing`: Add ``Pool.__repr__()`` and enhance -``BaseProcess.__repr__()`` (add pid and parent pid) to ease debugging. Pool -state constant values are now strings instead of integers, for example -``RUN`` value becomes ``'RUN'`` instead of ``0``. - -.. - -.. bpo: 35477 -.. date: 2018-12-13-00-10-51 -.. nonce: hHyy06 -.. section: Library - -:meth:`multiprocessing.Pool.__enter__` now fails if the pool is not running: -``with pool:`` fails if used more than once. - -.. - -.. bpo: 31446 -.. date: 2018-12-12-22-52-34 -.. nonce: l--Fjz -.. section: Library - -Copy command line that was passed to CreateProcessW since this function can -change the content of the input buffer. - -.. - -.. bpo: 35471 -.. date: 2018-12-12-16-25-21 -.. nonce: SK8jFC -.. section: Library - -Python 2.4 dropped MacOS 9 support. The macpath module was deprecated in -Python 3.7. The module is now removed. - -.. - -.. bpo: 23057 -.. date: 2018-12-12-16-24-55 -.. nonce: OB4Z1Y -.. section: Library - -Unblock Proactor event loop when keyboard interrupt is received on Windows - -.. - -.. bpo: 35052 -.. date: 2018-12-10-09-48-27 -.. nonce: xE1ymg -.. section: Library - -Fix xml.dom.minidom cloneNode() on a document with an entity: pass the -correct arguments to the user data handler of an entity. - -.. - -.. bpo: 20239 -.. date: 2018-12-09-21-35-49 -.. nonce: V4mWBL -.. section: Library - -Allow repeated assignment deletion of :class:`unittest.mock.Mock` -attributes. Patch by Pablo Galindo. - -.. - -.. bpo: 17185 -.. date: 2018-12-09-17-04-15 -.. nonce: SfSCJF -.. section: Library - -Set ``__signature__`` on mock for :mod:`inspect` to get signature. Patch by -Karthikeyan Singaravelan. - -.. - -.. bpo: 35445 -.. date: 2018-12-09-14-35-49 -.. nonce: LjvtsC -.. section: Library - -Memory errors during creating posix.environ no longer ignored. - -.. - -.. bpo: 35415 -.. date: 2018-12-06-14-44-21 -.. nonce: -HoK3d -.. section: Library - -Validate fileno= argument to socket.socket(). - -.. - -.. bpo: 35424 -.. date: 2018-12-06-02-02-28 -.. nonce: gXxOJU -.. section: Library - -:class:`multiprocessing.Pool` destructor now emits :exc:`ResourceWarning` if -the pool is still running. - -.. - -.. bpo: 35330 -.. date: 2018-12-06-00-43-13 -.. nonce: abB4BN -.. section: Library - -When a :class:`Mock` instance was used to wrap an object, if `side_effect` -is used in one of the mocks of it methods, don't call the original -implementation and return the result of using the side effect the same way -that it is done with return_value. - -.. - -.. bpo: 35346 -.. date: 2018-12-05-22-52-21 -.. nonce: Okm9-S -.. section: Library - -Drop Mac OS 9 and Rhapsody support from the :mod:`platform` module. Rhapsody -last release was in 2000. Mac OS 9 last release was in 2001. - -.. - -.. bpo: 10496 -.. date: 2018-12-05-17-42-49 -.. nonce: laV_IE -.. section: Library - -:func:`~distutils.utils.check_environ` of :mod:`distutils.utils` now catches -:exc:`KeyError` on calling :func:`pwd.getpwuid`: don't create the ``HOME`` -environment variable in this case. - -.. - -.. bpo: 10496 -.. date: 2018-12-05-13-37-39 -.. nonce: VH-1Lp -.. section: Library - -:func:`posixpath.expanduser` now returns the input *path* unchanged if the -``HOME`` environment variable is not set and the current user has no home -directory (if the current user identifier doesn't exist in the password -database). This change fix the :mod:`site` module if the current user -doesn't exist in the password database (if the user has no home directory). - -.. - -.. bpo: 35389 -.. date: 2018-12-04-12-46-05 -.. nonce: CTZ9iA -.. section: Library - -:func:`platform.libc_ver` now uses ``os.confstr('CS_GNU_LIBC_VERSION')`` if -available and the *executable* parameter is not set. - -.. - -.. bpo: 35394 -.. date: 2018-12-04-12-17-08 -.. nonce: fuTVDk -.. section: Library - -Add empty slots to asyncio abstract protocols. - -.. - -.. bpo: 35310 -.. date: 2018-12-03-19-45-00 -.. nonce: 9k28gR -.. section: Library - -Fix a bug in :func:`select.select` where, in some cases, the file descriptor -sequences were returned unmodified after a signal interruption, even though -the file descriptors might not be ready yet. :func:`select.select` will now -always return empty lists if a timeout has occurred. Patch by Oran Avraham. - -.. - -.. bpo: 35380 -.. date: 2018-12-03-14-41-11 -.. nonce: SdRF9l -.. section: Library - -Enable TCP_NODELAY on Windows for proactor asyncio event loop. - -.. - -.. bpo: 35341 -.. date: 2018-12-02-13-50-52 -.. nonce: 32E8T_ -.. section: Library - -Add generic version of ``collections.OrderedDict`` to the ``typing`` module. -Patch by Ismo Toijala. - -.. - -.. bpo: 35371 -.. date: 2018-12-01-13-44-12 -.. nonce: fTAwlX -.. section: Library - -Fixed possible crash in ``os.utime()`` on Windows when pass incorrect -arguments. - -.. - -.. bpo: 35346 -.. date: 2018-11-29-12-42-13 -.. nonce: OmTY5c -.. section: Library - -:func:`platform.uname` now redirects ``stderr`` to :data:`os.devnull` when -running external programs like ``cmd /c ver``. - -.. - -.. bpo: 35066 -.. date: 2018-11-29-09-38-40 -.. nonce: Nwej2s -.. section: Library - -Previously, calling the strftime() method on a datetime object with a -trailing '%' in the format string would result in an exception. However, -this only occurred when the datetime C module was being used; the python -implementation did not match this behavior. Datetime is now PEP-399 -compliant, and will not throw an exception on a trailing '%'. - -.. - -.. bpo: 35345 -.. date: 2018-11-29-00-55-33 -.. nonce: vepCSJ -.. section: Library - -The function `platform.popen` has been removed, it was deprecated since -Python 3.3: use :func:`os.popen` instead. - -.. - -.. bpo: 35344 -.. date: 2018-11-29-00-23-25 -.. nonce: 4QOPJQ -.. section: Library - -On macOS, :func:`platform.platform` now uses :func:`platform.mac_ver`, if it -returns a non-empty release string, to get the macOS version rather than the -darwin version. - -.. - -.. bpo: 35312 -.. date: 2018-11-25-20-05-33 -.. nonce: wbw0zO -.. section: Library - -Make ``lib2to3.pgen2.parse.ParseError`` round-trip pickle-able. Patch by -Anthony Sottile. - -.. - -.. bpo: 35308 -.. date: 2018-11-24-10-33-42 -.. nonce: 9--2iy -.. section: Library - -Fix regression in ``webbrowser`` where default browsers may be preferred -over browsers in the ``BROWSER`` environment variable. - -.. - -.. bpo: 24746 -.. date: 2018-11-22-15-22-56 -.. nonce: eSLKBE -.. section: Library - -Avoid stripping trailing whitespace in doctest fancy diff. Original patch by -R. David Murray & Jairo Trad. Enhanced by Sanyam Khurana. - -.. - -.. bpo: 28604 -.. date: 2018-11-20-13-34-01 -.. nonce: iiih5h -.. section: Library - -:func:`locale.localeconv` now sets temporarily the ``LC_CTYPE`` locale to -the ``LC_MONETARY`` locale if the two locales are different and monetary -strings are non-ASCII. This temporary change affects other threads. - -.. - -.. bpo: 35277 -.. date: 2018-11-19-07-22-04 -.. nonce: dsD-2E -.. section: Library - -Update ensurepip to install pip 18.1 and setuptools 40.6.2. - -.. - -.. bpo: 24209 -.. date: 2018-11-18-18-44-40 -.. nonce: p3YWOf -.. section: Library - -Adds IPv6 support when invoking http.server directly. - -.. - -.. bpo: 35226 -.. date: 2018-11-15-07-14-32 -.. nonce: wJPEEe -.. section: Library - -Recursively check arguments when testing for equality of -:class:`unittest.mock.call` objects and add note that tracking of parameters -used to create ancestors of mocks in ``mock_calls`` is not possible. - -.. - -.. bpo: 29564 -.. date: 2018-11-12-17-40-04 -.. nonce: SFNBT5 -.. section: Library - -The warnings module now suggests to enable tracemalloc if the source is -specified, the tracemalloc module is available, but tracemalloc is not -tracing memory allocations. - -.. - -.. bpo: 35189 -.. date: 2018-11-09-13-35-36 -.. nonce: gog-sl -.. section: Library - -Modify the following fnctl function to retry if interrupted by a signal -(EINTR): flock, lockf, fnctl - -.. - -.. bpo: 30064 -.. date: 2018-11-09-01-18-51 -.. nonce: IF5mH6 -.. section: Library - -Use add_done_callback() in sock_* asyncio API to unsubscribe reader/writer -early on calcellation. - -.. - -.. bpo: 35186 -.. date: 2018-11-08-14-22-29 -.. nonce: 5m22Mj -.. section: Library - -Removed the "built with" comment added when ``setup.py upload`` is used with -either ``bdist_rpm`` or ``bdist_dumb``. - -.. - -.. bpo: 35152 -.. date: 2018-11-03-10-12-04 -.. nonce: xpqskp -.. section: Library - -Allow sending more than 2 GB at once on a multiprocessing connection on -non-Windows systems. - -.. - -.. bpo: 35062 -.. date: 2018-10-29-23-09-24 -.. nonce: dQS1ng -.. section: Library - -Fix incorrect parsing of :class:`_io.IncrementalNewlineDecoder`'s -*translate* argument. - -.. - -.. bpo: 35065 -.. date: 2018-10-29-10-18-31 -.. nonce: CulMN8 -.. section: Library - -Remove `StreamReaderProtocol._untrack_reader`. The call to `_untrack_reader` -is currently performed too soon, causing the protocol to forget about the -reader before `connection_lost` can run and feed the EOF to the reader. - -.. - -.. bpo: 34160 -.. date: 2018-10-27-21-11-42 -.. nonce: UzyPZf -.. section: Library - -ElementTree and minidom now preserve the attribute order specified by the -user. - -.. - -.. bpo: 35079 -.. date: 2018-10-26-22-53-16 -.. nonce: Tm5jvF -.. section: Library - -Improve difflib.SequenceManager.get_matching_blocks doc by adding -'non-overlapping' and changing '!=' to '<'. - -.. - -.. bpo: 33710 -.. date: 2018-10-26-21-12-55 -.. nonce: Q5oXc6 -.. section: Library - -Deprecated ``l*gettext()`` functions and methods in the :mod:`gettext` -module. They return encoded bytes instead of Unicode strings and are -artifacts from Python 2 times. Also deprecated functions and methods related -to setting the charset for ``l*gettext()`` functions and methods. - -.. - -.. bpo: 35017 -.. date: 2018-10-26-00-11-21 -.. nonce: 6Ez4Cv -.. section: Library - -:meth:`socketserver.BaseServer.serve_forever` now exits immediately if it's -:meth:`~socketserver.BaseServer.shutdown` method is called while it is -polling for new events. - -.. - -.. bpo: 35024 -.. date: 2018-10-25-15-43-32 -.. nonce: ltSrtr -.. section: Library - -`importlib` no longer logs `wrote ` redundantly after -`(created|could not create) ` is already logged. Patch by -Quentin Agren. - -.. - -.. bpo: 35047 -.. date: 2018-10-25-09-59-00 -.. nonce: abbaa -.. section: Library - -``unittest.mock`` now includes mock calls in exception messages if -``assert_not_called``, ``assert_called_once``, or -``assert_called_once_with`` fails. Patch by Petter Strandmark. - -.. - -.. bpo: 31047 -.. date: 2018-10-25-09-37-03 -.. nonce: kBbX8r -.. section: Library - -Fix ``ntpath.abspath`` regression where it didn't remove a trailing -separator on Windows. Patch by Tim Graham. - -.. - -.. bpo: 35053 -.. date: 2018-10-23-18-58-12 -.. nonce: G82qwh -.. section: Library - -tracemalloc now tries to update the traceback when an object is reused from -a "free list" (optimization for faster object creation, used by the builtin -list type for example). - -.. - -.. bpo: 31553 -.. date: 2018-10-23-14-46-47 -.. nonce: JxRkAW -.. section: Library - -Add the --json-lines option to json.tool. Patch by hongweipeng. - -.. - -.. bpo: 34794 -.. date: 2018-10-21-14-53-19 -.. nonce: yt3R4- -.. section: Library - -Fixed a leak in Tkinter when pass the Python wrapper around Tcl_Obj back to -Tcl/Tk. - -.. - -.. bpo: 34909 -.. date: 2018-10-20-00-29-43 -.. nonce: Ew_8DC -.. section: Library - -Enum: fix grandchildren subclassing when parent mixed with concrete data -types. - -.. - -.. bpo: 35022 -.. date: 2018-10-18-17-57-28 -.. nonce: KeEF4T -.. section: Library - -:class:`unittest.mock.MagicMock` now supports the ``__fspath__`` method -(from :class:`os.PathLike`). - -.. - -.. bpo: 35008 -.. date: 2018-10-17-11-54-04 -.. nonce: dotef_ -.. section: Library - -Fixed references leaks when call the ``__setstate__()`` method of -:class:`xml.etree.ElementTree.Element` in the C implementation for already -initialized element. - -.. - -.. bpo: 23420 -.. date: 2018-10-17-11-00-00 -.. nonce: Lq74Uu -.. section: Library - -Verify the value for the parameter '-s' of the cProfile CLI. Patch by Robert -Kuska - -.. - -.. bpo: 33947 -.. date: 2018-10-17-02-15-23 -.. nonce: SRuq3T -.. section: Library - -dataclasses now handle recursive reprs without raising RecursionError. - -.. - -.. bpo: 34890 -.. date: 2018-10-15-23-10-41 -.. nonce: 77E770 -.. section: Library - -Make :func:`inspect.iscoroutinefunction`, -:func:`inspect.isgeneratorfunction` and :func:`inspect.isasyncgenfunction` -work with :func:`functools.partial`. Patch by Pablo Galindo. - -.. - -.. bpo: 34521 -.. date: 2018-10-13-19-15-23 -.. nonce: YPaiTK -.. section: Library - -Use :func:`socket.CMSG_SPACE` to calculate ancillary data size instead of -:func:`socket.CMSG_LEN` in :func:`multiprocessing.reduction.recvfds` as -:rfc:`3542` requires the use of the former for portable applications. - -.. - -.. bpo: 31522 -.. date: 2018-10-13-18-16-20 -.. nonce: rWBb43 -.. section: Library - -The `mailbox.mbox.get_string` function *from_* parameter can now -successfully be set to a non-default value. - -.. - -.. bpo: 34970 -.. date: 2018-10-13-11-14-13 -.. nonce: SrJTY7 -.. section: Library - -Protect tasks weak set manipulation in ``asyncio.all_tasks()`` - -.. - -.. bpo: 34969 -.. date: 2018-10-13-07-46-50 -.. nonce: Mfnhjb -.. section: Library - -gzip: Add --fast, --best on the gzip CLI, these parameters will be used for -the fast compression method (quick) or the best method compress (slower, but -smaller file). Also, change the default compression level to 6 (tradeoff). - -.. - -.. bpo: 16965 -.. date: 2018-10-12-20-30-42 -.. nonce: xo5LAr -.. section: Library - -The :term:`2to3` :2to3fixer:`execfile` fixer now opens the file with mode -``'rb'``. Patch by Zackery Spytz. - -.. - -.. bpo: 34966 -.. date: 2018-10-12-18-57-52 -.. nonce: WZeBHO -.. section: Library - -:mod:`pydoc` now supports aliases not only to methods defined in the end -class, but also to inherited methods. The docstring is not duplicated for -aliases. - -.. - -.. bpo: 34926 -.. date: 2018-10-10-00-22-57 -.. nonce: CA0rqd -.. section: Library - -:meth:`mimetypes.MimeTypes.guess_type` now accepts :term:`path-like object` -in addition to url strings. Patch by Mayank Asthana. - -.. - -.. bpo: 23831 -.. date: 2018-10-09-15-44-04 -.. nonce: 2CL7lL -.. section: Library - -Add ``moveto()`` method to the ``tkinter.Canvas`` widget. Patch by Juliette -Monsel. - -.. - -.. bpo: 34941 -.. date: 2018-10-09-14-42-16 -.. nonce: 1Q5QKv -.. section: Library - -Methods ``find()``, ``findtext()`` and ``findall()`` of the ``Element`` -class in the :mod:`xml.etree.ElementTree` module are now able to find -children which are instances of ``Element`` subclasses. - -.. - -.. bpo: 32680 -.. date: 2018-10-09-14-25-36 -.. nonce: z2FbOp -.. section: Library - -:class:`smtplib.SMTP` objects now always have a `sock` attribute present - -.. - -.. bpo: 34769 -.. date: 2018-10-09-11-01-16 -.. nonce: cSkkZt -.. section: Library - -Fix for async generators not finalizing when event loop is in debug mode and -garbage collector runs in another thread. - -.. - -.. bpo: 34936 -.. date: 2018-10-08-21-05-11 -.. nonce: 3tRqdq -.. section: Library - -Fix ``TclError`` in ``tkinter.Spinbox.selection_element()``. Patch by -Juliette Monsel. - -.. - -.. bpo: 34829 -.. date: 2018-10-08-16-04-36 -.. nonce: B7v7D0 -.. section: Library - -Add methods ``selection_from``, ``selection_range``, ``selection_present`` -and ``selection_to`` to the ``tkinter.Spinbox`` for consistency with the -``tkinter.Entry`` widget. Patch by Juliette Monsel. - -.. - -.. bpo: 34911 -.. date: 2018-10-08-15-22-02 -.. nonce: hCy0Fv -.. section: Library - -Added *secure_protocols* argument to *http.cookiejar.DefaultCookiePolicy* to -allow for tweaking of protocols and also to add support by default for -*wss*, the secure websocket protocol. - -.. - -.. bpo: 34922 -.. date: 2018-10-07-21-18-52 -.. nonce: 37IdsA -.. section: Library - -Fixed integer overflow in the :meth:`~hashlib.shake.digest()` and -:meth:`~hashlib.shake.hexdigest()` methods for the SHAKE algorithm in the -:mod:`hashlib` module. - -.. - -.. bpo: 34925 -.. date: 2018-10-07-20-37-02 -.. nonce: KlkZ-Y -.. section: Library - -25% speedup in argument parsing for the functions in the bisect module. - -.. - -.. bpo: 34900 -.. date: 2018-10-05-05-55-53 -.. nonce: 8RNiFu -.. section: Library - -Fixed :meth:`unittest.TestCase.debug` when used to call test methods with -subtests. Patch by Bruno Oliveira. - -.. - -.. bpo: 34844 -.. date: 2018-10-04-20-44-45 -.. nonce: Hnuxav -.. section: Library - -logging.Formatter enhancement - Ensure styles and fmt matches in -logging.Formatter - Added validate method in each format style class: -StrFormatStyle, PercentStyle, StringTemplateStyle. - This method is called -in the constructor of logging.Formatter class - Also re-raise the KeyError -in the format method of each style class, so it would a bit clear that it's -an error with the invalid format fields. - -.. - -.. bpo: 34897 -.. date: 2018-10-04-20-25-35 -.. nonce: rNE2Cy -.. section: Library - -Adjust test.support.missing_compiler_executable check so that a nominal -command name of "" is ignored. Patch by Michael Felt. - -.. - -.. bpo: 34871 -.. date: 2018-10-04-18-46-54 -.. nonce: t3X-dB -.. section: Library - -Fix inspect module polluted ``sys.modules`` when parsing -``__text_signature__`` of callable. - -.. - -.. bpo: 34898 -.. date: 2018-10-04-17-23-43 -.. nonce: Wo2PoJ -.. section: Library - -Add `mtime` argument to `gzip.compress` for reproducible output. Patch by -Guo Ci Teo. - -.. - -.. bpo: 28441 -.. date: 2018-10-04-15-53-14 -.. nonce: 2sQENe -.. section: Library - -On Cygwin and MinGW, ensure that ``sys.executable`` always includes the full -filename in the path, including the ``.exe`` suffix (unless it is a symbolic -link). - -.. - -.. bpo: 34866 -.. date: 2018-10-03-11-07-28 -.. nonce: ML6KpJ -.. section: Library - -Adding ``max_num_fields`` to ``cgi.FieldStorage`` to make DOS attacks harder -by limiting the number of ``MiniFieldStorage`` objects created by -``FieldStorage``. - -.. - -.. bpo: 34711 -.. date: 2018-10-03-09-25-02 -.. nonce: HeOmKR -.. section: Library - -http.server ensures it reports HTTPStatus.NOT_FOUND when the local path ends -with "/" and is not a directory, even if the underlying OS (e.g. AIX) -accepts such paths as a valid file reference. Patch by Michael Felt. - -.. - -.. bpo: 34872 -.. date: 2018-10-02-19-36-34 -.. nonce: yWZRhI -.. section: Library - -Fix self-cancellation in C implementation of asyncio.Task - -.. - -.. bpo: 34849 -.. date: 2018-09-30-08-08-14 -.. nonce: NXK9Ff -.. section: Library - -Don't log waiting for ``selector.select`` in asyncio loop iteration. The -waiting is pretty normal for any asyncio program, logging its time just adds -a noise to logs without any useful information provided. - -.. - -.. bpo: 34022 -.. date: 2018-09-27-13-14-15 -.. nonce: E2cl0r -.. section: Library - -The :envvar:`SOURCE_DATE_EPOCH` environment variable no longer overrides the -value of the *invalidation_mode* argument to :func:`py_compile.compile`, and -determines its default value instead. - -.. - -.. bpo: 34819 -.. date: 2018-09-27-09-45-00 -.. nonce: 9ZaFyO -.. section: Library - -Use a monotonic clock to compute timeouts in :meth:`Executor.map` and -:func:`as_completed`, in order to prevent timeouts from deviating when the -system clock is adjusted. - -.. - -.. bpo: 34758 -.. date: 2018-09-26-14-09-34 -.. nonce: bRBfAi -.. section: Library - -Add .wasm -> application/wasm to list of recognized file types and content -type headers - -.. - -.. bpo: 34789 -.. date: 2018-09-25-15-48-50 -.. nonce: rPOEj5 -.. section: Library - -:func:`xml.sax.make_parser` now accepts any iterable as its *parser_list* -argument. Patch by Andrés Delfino. - -.. - -.. bpo: 34334 -.. date: 2018-09-25-08-42-34 -.. nonce: rSPBW9 -.. section: Library - -In :class:`QueueHandler`, clear `exc_text` from :class:`LogRecord` to -prevent traceback from being written twice. - -.. - -.. bpo: 34687 -.. date: 2018-09-24-17-14-57 -.. nonce: Fku_8S -.. section: Library - -On Windows, asyncio now uses ProactorEventLoop, instead of -SelectorEventLoop, by default. - -.. - -.. bpo: 5950 -.. date: 2018-09-24-14-21-58 -.. nonce: xH0ekQ -.. section: Library - -Support reading zip files with archive comments in :mod:`zipimport`. - -.. - -.. bpo: 32892 -.. date: 2018-09-20-17-35-05 -.. nonce: TOUBdg -.. section: Library - -The parser now represents all constants as :class:`ast.Constant` instead of -using specific constant AST types (``Num``, ``Str``, ``Bytes``, -``NameConstant`` and ``Ellipsis``). These classes are considered deprecated -and will be removed in future Python versions. - -.. - -.. bpo: 34728 -.. date: 2018-09-20-16-55-43 -.. nonce: CUE8LU -.. section: Library - -Add deprecation warning when `loop` is used in methods: `asyncio.sleep`, -`asyncio.wait` and `asyncio.wait_for`. - -.. - -.. bpo: 34738 -.. date: 2018-09-19-16-51-04 -.. nonce: Pr3-iG -.. section: Library - -ZIP files created by :mod:`distutils` will now include entries for -directories. - -.. - -.. bpo: 34659 -.. date: 2018-09-16-17-04-16 -.. nonce: CWemzH -.. section: Library - -Add an optional *initial* argument to itertools.accumulate(). - -.. - -.. bpo: 29577 -.. date: 2018-09-14-20-00-47 -.. nonce: RzwKFD -.. section: Library - -Support multiple mixin classes when creating Enums. - -.. - -.. bpo: 34670 -.. date: 2018-09-14-14-29-45 -.. nonce: 17XwGB -.. section: Library - -Add SSLContext.post_handshake_auth and -SSLSocket.verify_client_post_handshake for TLS 1.3's post handshake -authentication feature. - -.. - -.. bpo: 32718 -.. date: 2018-09-14-12-38-49 -.. nonce: ICYQbt -.. section: Library - -The Activate.ps1 script from venv works with PowerShell Core 6.1 and is now -available under all operating systems. - -.. - -.. bpo: 31177 -.. date: 2018-09-14-10-38-18 -.. nonce: Sv91TN -.. section: Library - -Fix bug that prevented using :meth:`reset_mock -` on mock instances with deleted attributes - -.. - -.. bpo: 34672 -.. date: 2018-09-13-21-04-23 -.. nonce: BYuKKS -.. section: Library - -Add a workaround, so the ``'Z'`` :func:`time.strftime` specifier on the musl -C library can work in some cases. - -.. - -.. bpo: 34666 -.. date: 2018-09-13-11-49-52 -.. nonce: 3uLtWv -.. section: Library - -Implement ``asyncio.StreamWriter.awrite`` and -``asyncio.StreamWriter.aclose()`` coroutines. Methods are needed for -providing a consistent stream API with control flow switched on by default. - -.. - -.. bpo: 6721 -.. date: 2018-09-13-10-09-19 -.. nonce: ZUL_F3 -.. section: Library - -Acquire the logging module's commonly used internal locks while fork()ing to -avoid deadlocks in the child process. - -.. - -.. bpo: 34658 -.. date: 2018-09-13-03-59-43 -.. nonce: ykZ-ia -.. section: Library - -Fix a rare interpreter unhandled exception state SystemError only seen when -using subprocess with a preexec_fn while an after_parent handler has been -registered with os.register_at_fork and the fork system call fails. - -.. - -.. bpo: 34652 -.. date: 2018-09-12-14-46-51 -.. nonce: Rt1m1b -.. section: Library - -Ensure :func:`os.lchmod` is never defined on Linux. - -.. - -.. bpo: 34638 -.. date: 2018-09-12-10-33-44 -.. nonce: xaeZX5 -.. section: Library - -Store a weak reference to stream reader to break strong references loop -between reader and protocol. It allows to detect and close the socket if -the stream is deleted (garbage collected) without ``close()`` call. - -.. - -.. bpo: 34536 -.. date: 2018-09-11-15-49-09 -.. nonce: 3IPIH5 -.. section: Library - -`Enum._missing_`: raise `ValueError` if None returned and `TypeError` if -non-member is returned. - -.. - -.. bpo: 34636 -.. date: 2018-09-11-15-04-05 -.. nonce: capCmt -.. section: Library - -Speed up re scanning of many non-matching characters for \s \w and \d within -bytes objects. (microoptimization) - -.. - -.. bpo: 24412 -.. date: 2018-09-11-10-51-16 -.. nonce: i-F_E5 -.. section: Library - -Add :func:`~unittest.addModuleCleanup()` and -:meth:`~unittest.TestCase.addClassCleanup()` to unittest to support cleanups -for :func:`~unittest.setUpModule()` and -:meth:`~unittest.TestCase.setUpClass()`. Patch by Lisa Roach. - -.. - -.. bpo: 34630 -.. date: 2018-09-11-10-00-53 -.. nonce: YbqUS6 -.. section: Library - -Don't log SSL certificate errors in asyncio code (connection error logging -is skipped already). - -.. - -.. bpo: 32490 -.. date: 2018-09-11-01-25-35 -.. nonce: ROIDO1 -.. section: Library - -Prevent filename duplication in :mod:`subprocess` exception messages. Patch -by Zackery Spytz. - -.. - -.. bpo: 34363 -.. date: 2018-09-10-21-09-34 -.. nonce: YuSb0T -.. section: Library - -dataclasses.asdict() and .astuple() now handle namedtuples correctly. - -.. - -.. bpo: 34625 -.. date: 2018-09-10-17-46-51 -.. nonce: D2YfDz -.. section: Library - -Update vendorized expat library version to 2.2.6. - -.. - -.. bpo: 32270 -.. date: 2018-09-10-14-15-53 -.. nonce: wSJjuD -.. section: Library - -The subprocess module no longer mistakenly closes redirected fds even when -they were in pass_fds when outside of the default {0, 1, 2} set. - -.. - -.. bpo: 34622 -.. date: 2018-09-10-13-04-40 -.. nonce: tpv_rN -.. section: Library - -Create a dedicated ``asyncio.CancelledError``, ``asyncio.InvalidStateError`` -and ``asyncio.TimeoutError`` exception classes. Inherit them from -corresponding exceptions from ``concurrent.futures`` package. Extract -``asyncio`` exceptions into a separate file. - -.. - -.. bpo: 34610 -.. date: 2018-09-08-12-57-07 -.. nonce: wmoP5j -.. section: Library - -Fixed iterator of :class:`multiprocessing.managers.DictProxy`. - -.. - -.. bpo: 34421 -.. date: 2018-09-07-10-57-00 -.. nonce: AKJISD -.. section: Library - -Fix distutils logging for non-ASCII strings. This caused installation -issues on Windows. - -.. - -.. bpo: 34604 -.. date: 2018-09-07-10-16-34 -.. nonce: xL7-kG -.. section: Library - -Fix possible mojibake in the error message of `pwd.getpwnam` and -`grp.getgrnam` using string representation because of invisible characters -or trailing whitespaces. Patch by William Grzybowski. - -.. - -.. bpo: 30977 -.. date: 2018-09-06-10-07-46 -.. nonce: bP661V -.. section: Library - -Make uuid.UUID use ``__slots__`` to reduce its memory footprint. Based on -original patch by Wouter Bolsterlee. - -.. - -.. bpo: 34574 -.. date: 2018-09-04-09-32-54 -.. nonce: X4RwYI -.. section: Library - -OrderedDict iterators are not exhausted during pickling anymore. Patch by -Sergey Fedoseev. - -.. - -.. bpo: 8110 -.. date: 2018-09-03-23-54-35 -.. nonce: FExWI_ -.. section: Library - -Refactored :mod:`subprocess` to check for Windows-specific modules rather -than ``sys.platform == 'win32'``. - -.. - -.. bpo: 34530 -.. date: 2018-09-03-23-23-32 -.. nonce: h_Xsu7 -.. section: Library - -``distutils.spawn.find_executable()`` now falls back on :data:`os.defpath` -if the ``PATH`` environment variable is not set. - -.. - -.. bpo: 34563 -.. date: 2018-09-01-20-43-10 -.. nonce: 7NQK7B -.. section: Library - -On Windows, fix multiprocessing.Connection for very large read: fix -_winapi.PeekNamedPipe() and _winapi.ReadFile() for read larger than INT_MAX -(usually 2^31-1). - -.. - -.. bpo: 34558 -.. date: 2018-08-31-19-26-55 -.. nonce: MHv582 -.. section: Library - -Correct typo in Lib/ctypes/_aix.py - -.. - -.. bpo: 34282 -.. date: 2018-08-31-06-28-03 -.. nonce: ztyXH8 -.. section: Library - -Move ``Enum._convert`` to ``EnumMeta._convert_`` and fix enum members -getting shadowed by parent attributes. - -.. - -.. bpo: 22872 -.. date: 2018-08-30-14-44-11 -.. nonce: NhIaZ9 -.. section: Library - -When the queue is closed, :exc:`ValueError` is now raised by -:meth:`multiprocessing.Queue.put` and :meth:`multiprocessing.Queue.get` -instead of :exc:`AssertionError` and :exc:`OSError`, respectively. Patch by -Zackery Spytz. - -.. - -.. bpo: 34515 -.. date: 2018-08-27-16-01-22 -.. nonce: S0Irst -.. section: Library - -Fix parsing non-ASCII identifiers in :mod:`lib2to3.pgen2.tokenize` (PEP -3131). - -.. - -.. bpo: 13312 -.. date: 2018-08-24-17-31-27 -.. nonce: 6hA5La -.. section: Library - -Avoids a possible integer underflow (undefined behavior) in the time -module's year handling code when passed a very low negative year value. - -.. - -.. bpo: 34472 -.. date: 2018-08-23-09-25-08 -.. nonce: cGyYrO -.. section: Library - -Improved compatibility for streamed files in :mod:`zipfile`. Previously an -optional signature was not being written and certain ZIP applications were -not supported. Patch by Silas Sewell. - -.. - -.. bpo: 34454 -.. date: 2018-08-22-21-59-08 -.. nonce: z7uG4b -.. section: Library - -Fix the .fromisoformat() methods of datetime types crashing when given -unicode with non-UTF-8-encodable code points. Specifically, -datetime.fromisoformat() now accepts surrogate unicode code points used as -the separator. Report and tests by Alexey Izbyshev, patch by Paul Ganssle. - -.. - -.. bpo: 6700 -.. date: 2018-08-22-17-43-52 -.. nonce: hp7C4B -.. section: Library - -Fix inspect.getsourcelines for module level frames/tracebacks. Patch by -Vladimir Matveev. - -.. - -.. bpo: 34171 -.. date: 2018-08-21-00-29-01 -.. nonce: 6LkWav -.. section: Library - -Running the :mod:`trace` module no longer creates the ``trace.cover`` file. - -.. - -.. bpo: 34441 -.. date: 2018-08-20-16-48-32 -.. nonce: _zx9lU -.. section: Library - -Fix crash when an ``ABC``-derived class with invalid ``__subclasses__`` is -passed as the second argument to :func:`issubclass()`. Patch by Alexey -Izbyshev. - -.. - -.. bpo: 34427 -.. date: 2018-08-20-13-53-10 -.. nonce: tMRQjl -.. section: Library - -Fix infinite loop in ``a.extend(a)`` for ``MutableSequence`` subclasses. - -.. - -.. bpo: 34412 -.. date: 2018-08-16-19-07-05 -.. nonce: NF5Jm2 -.. section: Library - -Make :func:`signal.strsignal` work on HP-UX. Patch by Michael Osipov. - -.. - -.. bpo: 20849 -.. date: 2018-08-16-16-47-15 -.. nonce: YWJECC -.. section: Library - -shutil.copytree now accepts a new ``dirs_exist_ok`` keyword argument. Patch -by Josh Bronson. - -.. - -.. bpo: 31715 -.. date: 2018-08-15-16-22-30 -.. nonce: Iw8jS8 -.. section: Library - -Associate ``.mjs`` file extension with ``application/javascript`` MIME Type. - -.. - -.. bpo: 34384 -.. date: 2018-08-12-08-43-21 -.. nonce: yjofCv -.. section: Library - -:func:`os.readlink` now accepts :term:`path-like ` and -:class:`bytes` objects on Windows. - -.. - -.. bpo: 22602 -.. date: 2018-08-12-00-14-54 -.. nonce: ybG9K8 -.. section: Library - -The UTF-7 decoder now raises :exc:`UnicodeDecodeError` for ill-formed -sequences starting with "+" (as specified in RFC 2152). Patch by Zackery -Spytz. - -.. - -.. bpo: 2122 -.. date: 2018-08-06-21-47-03 -.. nonce: GWdmrm -.. section: Library - -The :meth:`mmap.flush() ` method now returns ``None`` on -success, raises an exception on error under all platforms. - -.. - -.. bpo: 34341 -.. date: 2018-08-06-11-01-18 -.. nonce: E0b9p2 -.. section: Library - -Appending to the ZIP archive with the ZIP64 extension no longer grows the -size of extra fields of existing entries. - -.. - -.. bpo: 34333 -.. date: 2018-08-04-00-06-28 -.. nonce: 5NHG93 -.. section: Library - -Fix %-formatting in :meth:`pathlib.PurePath.with_suffix` when formatting an -error message. - -.. - -.. bpo: 18540 -.. date: 2018-08-02-21-28-38 -.. nonce: AryoYY -.. section: Library - -The :class:`imaplib.IMAP4` and :class:`imaplib.IMAP4_SSL` classes now -resolve to the local host IP correctly when the default value of *host* -parameter (``''``) is used. - -.. - -.. bpo: 26502 -.. date: 2018-08-02-20-39-32 -.. nonce: eGXr_k -.. section: Library - -Implement ``traceback.FrameSummary.__len__()`` method to preserve -compatibility with the old tuple API. - -.. - -.. bpo: 34318 -.. date: 2018-08-02-14-43-42 -.. nonce: GneiXs -.. section: Library - -:func:`~unittest.TestCase.assertRaises`, -:func:`~unittest.TestCase.assertRaisesRegex`, -:func:`~unittest.TestCase.assertWarns` and -:func:`~unittest.TestCase.assertWarnsRegex` no longer success if the passed -callable is None. They no longer ignore unknown keyword arguments in the -context manager mode. A DeprecationWarning was raised in these cases since -Python 3.5. - -.. - -.. bpo: 9372 -.. date: 2018-08-01-21-26-17 -.. nonce: V8Ou3K -.. section: Library - -Deprecate :meth:`__getitem__` methods of -:class:`xml.dom.pulldom.DOMEventStream`, :class:`wsgiref.util.FileWrapper` -and :class:`fileinput.FileInput`. - -.. - -.. bpo: 33613 -.. date: 2018-07-31-23-33-06 -.. nonce: Cdnt0i -.. section: Library - -Fix a race condition in ``multiprocessing.semaphore_tracker`` when the -tracker receives SIGINT before it can register signal handlers for ignoring -it. - -.. - -.. bpo: 34248 -.. date: 2018-07-31-23-00-09 -.. nonce: 5U6wwc -.. section: Library - -Report filename in the exception raised when the database file cannot be -opened by :func:`dbm.gnu.open` and :func:`dbm.ndbm.open` due to OS-related -error. Patch by Zsolt Cserna. - -.. - -.. bpo: 33089 -.. date: 2018-07-29-21-53-15 -.. nonce: hxbp3g -.. section: Library - -Add math.dist() to compute the Euclidean distance between two points. - -.. - -.. bpo: 34246 -.. date: 2018-07-29-15-25-15 -.. nonce: xiKq-Q -.. section: Library - -:meth:`smtplib.SMTP.send_message` no longer modifies the content of the -*mail_options* argument. Patch by Pablo S. Blum de Aguiar. - -.. - -.. bpo: 31047 -.. date: 2018-07-29-14-12-23 -.. nonce: FSarLs -.. section: Library - -Fix ``ntpath.abspath`` for invalid paths on windows. Patch by Franz -Woellert. - -.. - -.. bpo: 32321 -.. date: 2018-07-29-13-50-32 -.. nonce: hDoNKC -.. section: Library - -Add pure Python fallback for functools.reduce. Patch by Robert Wright. - -.. - -.. bpo: 34270 -.. date: 2018-07-29-11-32-56 -.. nonce: aL6P-3 -.. section: Library - -The default asyncio task class now always has a name which can be get or set -using two new methods (:meth:`~asyncio.Task.get_name()` and -:meth:`~asyncio.Task.set_name`) and is visible in the :func:`repr` output. -An initial name can also be set using the new ``name`` keyword argument to -:func:`asyncio.create_task` or the -:meth:`~asyncio.AbstractEventLoop.create_task` method of the event loop. If -no initial name is set, the default Task implementation generates a name -like ``Task-1`` using a monotonic counter. - -.. - -.. bpo: 34263 -.. date: 2018-07-28-17-00-36 -.. nonce: zUfRsu -.. section: Library - -asyncio's event loop will not pass timeouts longer than one day to -epoll/select etc. - -.. - -.. bpo: 34035 -.. date: 2018-07-28-15-00-31 -.. nonce: 75nW0H -.. section: Library - -Fix several AttributeError in zipfile seek() methods. Patch by Mickaël -Schoentgen. - -.. - -.. bpo: 32215 -.. date: 2018-07-28-12-08-53 -.. nonce: EU68SY -.. section: Library - -Fix performance regression in :mod:`sqlite3` when a DML statement appeared -in a different line than the rest of the SQL query. - -.. - -.. bpo: 34075 -.. date: 2018-07-28-11-49-21 -.. nonce: 9u1bO- -.. section: Library - -Deprecate passing non-ThreadPoolExecutor instances to -:meth:`AbstractEventLoop.set_default_executor`. - -.. - -.. bpo: 34251 -.. date: 2018-07-28-11-47-10 -.. nonce: q3elQ6 -.. section: Library - -Restore ``msilib.Win64`` to preserve backwards compatibility since it's -already used by :mod:`distutils`' ``bdist_msi`` command. - -.. - -.. bpo: 19891 -.. date: 2018-07-26-08-45-49 -.. nonce: Y-3IiB -.. section: Library - -Ignore errors caused by missing / non-writable homedir while writing history -during exit of an interactive session. Patch by Anthony Sottile. - -.. - -.. bpo: 33089 -.. date: 2018-07-25-22-38-54 -.. nonce: C3CB7e -.. section: Library - -Enhanced math.hypot() to support more than two dimensions. - -.. - -.. bpo: 34228 -.. date: 2018-07-25-19-02-39 -.. nonce: 0Ibztw -.. section: Library - -tracemalloc: PYTHONTRACEMALLOC=0 environment variable and -X tracemalloc=0 -command line option are now allowed to disable explicitly tracemalloc at -startup. - -.. - -.. bpo: 13041 -.. date: 2018-07-25-12-08-48 -.. nonce: lNmgDz -.. section: Library - -Use :func:`shutil.get_terminal_size` to calculate the terminal width -correctly in the ``argparse.HelpFormatter`` class. Initial patch by Zbyszek -Jędrzejewski-Szmek. - -.. - -.. bpo: 34213 -.. date: 2018-07-25-00-40-14 -.. nonce: O15MgP -.. section: Library - -Allow frozen dataclasses to have a field named "object". Previously this -conflicted with an internal use of "object". - -.. - -.. bpo: 34052 -.. date: 2018-07-24-16-37-40 -.. nonce: VbbFAE -.. section: Library - -:meth:`sqlite3.Connection.create_aggregate`, -:meth:`sqlite3.Connection.create_function`, -:meth:`sqlite3.Connection.set_authorizer`, -:meth:`sqlite3.Connection.set_progress_handler` methods raises TypeError -when unhashable objects are passed as callable. These methods now don't pass -such objects to SQLite API. Previous behavior could lead to segfaults. Patch -by Sergey Fedoseev. - -.. - -.. bpo: 34197 -.. date: 2018-07-23-14-12-28 -.. nonce: 7yFSP5 -.. section: Library - -Attributes *skipinitialspace*, *doublequote* and *strict* of the *dialect* -attribute of the :mod:`csv` reader are now :class:`bool` instances instead -of integers 0 or 1. - -.. - -.. bpo: 32788 -.. date: 2018-07-23-12-20-02 -.. nonce: R2jSiK -.. section: Library - -Errors other than :exc:`TypeError` raised in methods ``__adapt__()`` and -``__conform__()`` in the :mod:`sqlite3` module are now propagated to the -user. - -.. - -.. bpo: 21446 -.. date: 2018-07-22-09-05-01 -.. nonce: w6g7tn -.. section: Library - -The :2to3fixer:`reload` fixer now uses :func:`importlib.reload` instead of -deprecated :func:`imp.reload`. - -.. - -.. bpo: 940286 -.. date: 2018-07-22-07-59-32 -.. nonce: NZTzyc -.. section: Library - -pydoc's ``Helper.showtopic()`` method now prints the cross references of a -topic correctly. - -.. - -.. bpo: 34164 -.. date: 2018-07-20-18-06-00 -.. nonce: fNfT-q -.. section: Library - -:func:`base64.b32decode` could raise UnboundLocalError or OverflowError for -incorrect padding. Now it always raises :exc:`base64.Error` in these cases. - -.. - -.. bpo: 33729 -.. date: 2018-07-20-09-11-05 -.. nonce: sO6iTb -.. section: Library - -Fixed issues with arguments parsing in :mod:`hashlib`. - -.. - -.. bpo: 34097 -.. date: 2018-07-13-13-42-10 -.. nonce: F5Dk5o -.. section: Library - -ZipFile can zip files older than 1980-01-01 and newer than 2107-12-31 using -a new ``strict_timestamps`` parameter at the cost of setting the timestamp -to the limit. - -.. - -.. bpo: 34108 -.. date: 2018-07-13-08-44-52 -.. nonce: RjobUC -.. section: Library - -Remove extraneous CR in 2to3 refactor. - -.. - -.. bpo: 34070 -.. date: 2018-07-11-20-51-20 -.. nonce: WpmFAu -.. section: Library - -Make sure to only check if the handle is a tty, when opening a file with -``buffering=-1``. - -.. - -.. bpo: 27494 -.. date: 2018-07-11-10-03-21 -.. nonce: 04OWkW -.. section: Library - -Reverted :issue:`27494`. 2to3 rejects now a trailing comma in generator -expressions. - -.. - -.. bpo: 33967 -.. date: 2018-07-08-18-49-41 -.. nonce: lhaAez -.. section: Library - -functools.singledispatch now raises TypeError instead of IndexError when no -positional arguments are passed. - -.. - -.. bpo: 34041 -.. date: 2018-07-06-15-06-32 -.. nonce: 0zrKLh -.. section: Library - -Add the parameter *deterministic* to the -:meth:`sqlite3.Connection.create_function` method. Patch by Sergey Fedoseev. - -.. - -.. bpo: 34056 -.. date: 2018-07-05-22-45-46 -.. nonce: 86isrU -.. section: Library - -Ensure the loader shim created by ``imp.load_module`` always returns bytes -from its ``get_data()`` function. This fixes using ``imp.load_module`` with -:pep:`552` hash-based pycs. - -.. - -.. bpo: 34054 -.. date: 2018-07-05-18-37-05 -.. nonce: nWRS6M -.. section: Library - -The multiprocessing module now uses the monotonic clock -:func:`time.monotonic` instead of the system clock :func:`time.time` to -implement timeout. - -.. - -.. bpo: 34043 -.. date: 2018-07-04-21-14-35 -.. nonce: 0YJNq9 -.. section: Library - -Optimize tarfile uncompress performance about 15% when gzip is used. - -.. - -.. bpo: 34044 -.. date: 2018-07-04-17-14-26 -.. nonce: KWAu4y -.. section: Library - -``subprocess.Popen`` now copies the *startupinfo* argument to leave it -unchanged: it will modify the copy, so that the same ``STARTUPINFO`` object -can be used multiple times. - -.. - -.. bpo: 34010 -.. date: 2018-07-04-07-36-53 -.. nonce: VNDkde -.. section: Library - -Fixed a performance regression for reading streams with tarfile. The -buffered read should use a list, instead of appending to a bytes object. - -.. - -.. bpo: 34019 -.. date: 2018-07-02-05-59-11 -.. nonce: ZXJIife -.. section: Library - -webbrowser: Correct the arguments passed to Opera Browser when opening a new -URL using the ``webbrowser`` module. Patch by Bumsik Kim. - -.. - -.. bpo: 34003 -.. date: 2018-06-29-13-05-01 -.. nonce: Iu831h -.. section: Library - -csv.DictReader now creates dicts instead of OrderedDicts. Patch by Michael -Selik. - -.. - -.. bpo: 33978 -.. date: 2018-06-29-12-23-34 -.. nonce: y4csIw -.. section: Library - -Closed existing logging handlers before reconfiguration via fileConfig and -dictConfig. Patch by Karthikeyan Singaravelan. - -.. - -.. bpo: 14117 -.. date: 2018-06-29-00-31-36 -.. nonce: 3nvDuR -.. section: Library - -Make minor tweaks to turtledemo. The 'wikipedia' example is now 'rosette', -describing what it draws. The 'penrose' print output is reduced. The'1024' -output of 'tree' is eliminated. - -.. - -.. bpo: 33974 -.. date: 2018-06-28-14-56-44 -.. nonce: SA8nNP -.. section: Library - -Fixed passing lists and tuples of strings containing special characters -``"``, ``\``, ``{``, ``}`` and ``\n`` as options to :mod:`~tkinter.ttk` -widgets. - -.. - -.. bpo: 27500 -.. date: 2018-06-28-13-00-12 -.. nonce: _s1gZ5 -.. section: Library - -Fix getaddrinfo to resolve IPv6 addresses correctly. - -.. - -.. bpo: 24567 -.. date: 2018-06-27-00-31-30 -.. nonce: FuePyY -.. section: Library - -Improve random.choices() to handle subnormal input weights that could -occasionally trigger an IndexError. - -.. - -.. bpo: 33871 -.. date: 2018-06-26-19-03-56 -.. nonce: XhlrGU -.. section: Library - -Fixed integer overflow in :func:`os.readv`, :func:`os.writev`, -:func:`os.preadv` and :func:`os.pwritev` and in :func:`os.sendfile` with -*headers* or *trailers* arguments (on BSD-based OSes and macOS). - -.. - -.. bpo: 25007 -.. date: 2018-06-26-16-55-59 -.. nonce: 6LQWOF -.. section: Library - -Add :func:`copy.copy` and :func:`copy.deepcopy` support to zlib compressors -and decompressors. Patch by Zackery Spytz. - -.. - -.. bpo: 33929 -.. date: 2018-06-26-02-09-18 -.. nonce: OcCLah -.. section: Library - -multiprocessing: Fix a race condition in Popen of -multiprocessing.popen_spawn_win32. The child process now duplicates the read -end of pipe instead of "stealing" it. Previously, the read end of pipe was -"stolen" by the child process, but it leaked a handle if the child process -had been terminated before it could steal the handle from the parent -process. - -.. - -.. bpo: 33899 -.. date: 2018-06-24-01-57-14 -.. nonce: IaOcAr -.. section: Library - -Tokenize module now implicitly emits a NEWLINE when provided with input that -does not have a trailing new line. This behavior now matches what the C -tokenizer does internally. Contributed by Ammar Askar. - -.. - -.. bpo: 33897 -.. date: 2018-06-23-18-09-28 -.. nonce: Hu0yvt -.. section: Library - -Added a 'force' keyword argument to logging.basicConfig(). - -.. - -.. bpo: 33695 -.. date: 2018-06-23-12-47-37 -.. nonce: seRTxh -.. section: Library - -:func:`shutil.copytree` uses :func:`os.scandir` function and all copy -functions depending from it use cached :func:`os.stat` values. The speedup -for copying a directory with 8000 files is around +9% on Linux, +20% on -Windows and + 30% on a Windows SMB share. Also the number of :func:`os.stat` -syscalls is reduced by 38% making :func:`shutil.copytree` especially faster -on network filesystems. (Contributed by Giampaolo Rodola' in -:issue:`33695`.) - -.. - -.. bpo: 33916 -.. date: 2018-06-21-11-35-47 -.. nonce: cZgPCD -.. section: Library - -bz2 and lzma: When Decompressor.__init__() is called twice, free the old -lock to not leak memory. - -.. - -.. bpo: 32568 -.. date: 2018-06-21-09-33-02 -.. nonce: f_meGY -.. section: Library - -Make select.epoll() and its documentation consistent regarding *sizehint* -and *flags*. - -.. - -.. bpo: 33833 -.. date: 2018-06-17-11-46-20 -.. nonce: RnEqvM -.. section: Library - -Fixed bug in asyncio where ProactorSocketTransport logs AssertionError if -force closed during write. - -.. - -.. bpo: 33663 -.. date: 2018-06-17-10-48-03 -.. nonce: sUuGmq -.. section: Library - -Convert content length to string before putting to header. - -.. - -.. bpo: 33721 -.. date: 2018-06-14-17-53-30 -.. nonce: 8i9_9A -.. section: Library - -:mod:`os.path` functions that return a boolean result like -:func:`~os.path.exists`, :func:`~os.path.lexists`, :func:`~os.path.isdir`, -:func:`~os.path.isfile`, :func:`~os.path.islink`, and -:func:`~os.path.ismount`, and :mod:`pathlib.Path` methods that return a -boolean result like :meth:`~pathlib.Path.exists()`, -:meth:`~pathlib.Path.is_dir()`, :meth:`~pathlib.Path.is_file()`, -:meth:`~pathlib.Path.is_mount()`, :meth:`~pathlib.Path.is_symlink()`, -:meth:`~pathlib.Path.is_block_device()`, -:meth:`~pathlib.Path.is_char_device()`, :meth:`~pathlib.Path.is_fifo()`, -:meth:`~pathlib.Path.is_socket()` now return ``False`` instead of raising -:exc:`ValueError` or its subclasses :exc:`UnicodeEncodeError` and -:exc:`UnicodeDecodeError` for paths that contain characters or bytes -unrepresentable at the OS level. - -.. - -.. bpo: 26544 -.. date: 2018-06-13-20-33-29 -.. nonce: hQ1oMt -.. section: Library - -Fixed implementation of :func:`platform.libc_ver`. It almost always returned -version '2.9' for glibc. - -.. - -.. bpo: 33843 -.. date: 2018-06-12-18-59-16 -.. nonce: qVAK8g -.. section: Library - -Remove deprecated ``cgi.escape``, ``cgi.parse_qs`` and ``cgi.parse_qsl``. - -.. - -.. bpo: 33842 -.. date: 2018-06-12-18-34-54 -.. nonce: RZXSGu -.. section: Library - -Remove ``tarfile.filemode`` which is deprecated since Python 3.3. - -.. - -.. bpo: 30167 -.. date: 2018-06-10-19-29-17 -.. nonce: G5EgC5 -.. section: Library - -Prevent site.main() exception if PYTHONSTARTUP is set. Patch by Steve Weber. - -.. - -.. bpo: 33805 -.. date: 2018-06-10-15-14-17 -.. nonce: 5LAz5a -.. section: Library - -Improve error message of dataclasses.replace() when an InitVar is not -specified - -.. - -.. bpo: 33687 -.. date: 2018-06-10-14-08-52 -.. nonce: 1zZdnA -.. section: Library - -Fix the call to ``os.chmod()`` for ``uu.decode()`` if a mode is given or -decoded. Patch by Timo Furrer. - -.. - -.. bpo: 33812 -.. date: 2018-06-10-13-26-02 -.. nonce: frGAOr -.. section: Library - -Datetime instance d with non-None tzinfo, but with d.tzinfo.utcoffset(d) -returning None is now treated as naive by the astimezone() method. - -.. - -.. bpo: 32108 -.. date: 2018-06-10-12-15-26 -.. nonce: iEkvh0 -.. section: Library - -In configparser, don't clear section when it is assigned to itself. - -.. - -.. bpo: 27397 -.. date: 2018-06-10-09-43-54 -.. nonce: 0_fFQR -.. section: Library - -Make email module properly handle invalid-length base64 strings. - -.. - -.. bpo: 33578 -.. date: 2018-06-08-23-55-34 -.. nonce: 7oSsjG -.. section: Library - -Implement multibyte encoder/decoder state methods - -.. - -.. bpo: 30805 -.. date: 2018-06-08-17-34-16 -.. nonce: 3qCWa0 -.. section: Library - -Avoid race condition with debug logging - -.. - -.. bpo: 33476 -.. date: 2018-06-08-00-29-40 -.. nonce: R0Bhlj -.. section: Library - -Fix _header_value_parser.py when address group is missing final ';'. -Contributed by Enrique Perez-Terron - -.. - -.. bpo: 33694 -.. date: 2018-06-07-23-51-00 -.. nonce: F1zIR1 -.. section: Library - -asyncio: Fix a race condition causing data loss on -pause_reading()/resume_reading() when using the ProactorEventLoop. - -.. - -.. bpo: 32493 -.. date: 2018-06-07-18-55-35 -.. nonce: 1Bte62 -.. section: Library - -Correct test for ``uuid_enc_be`` availability in ``configure.ac``. Patch by -Michael Felt. - -.. - -.. bpo: 33792 -.. date: 2018-06-07-12-38-12 -.. nonce: 3aKG7u -.. section: Library - -Add asyncio.WindowsSelectorEventLoopPolicy and -asyncio.WindowsProactorEventLoopPolicy. - -.. - -.. bpo: 33274 -.. date: 2018-06-06-22-01-33 -.. nonce: teYqv8 -.. section: Library - -W3C DOM Level 1 specifies return value of Element.removeAttributeNode() as -"The Attr node that was removed." xml.dom.minidom now complies with this -requirement. - -.. - -.. bpo: 33778 -.. date: 2018-06-05-20-22-30 -.. nonce: _tSAS6 -.. section: Library - -Update ``unicodedata``'s database to Unicode version 11.0.0. - -.. - -.. bpo: 33165 -.. date: 2018-06-05-12-43-25 -.. nonce: 9TIsVf -.. section: Library - -Added a stacklevel parameter to logging calls to allow use of wrapper/helper -functions for logging APIs. - -.. - -.. bpo: 33770 -.. date: 2018-06-05-11-29-26 -.. nonce: oBhxxw -.. section: Library - -improve base64 exception message for encoded inputs of invalid length - -.. - -.. bpo: 33769 -.. date: 2018-06-04-13-46-39 -.. nonce: D_pxYz -.. section: Library - -asyncio/start_tls: Fix error message; cancel callbacks in case of an -unhandled error; mark SSLTransport as closed if it is aborted. - -.. - -.. bpo: 33767 -.. date: 2018-06-03-22-41-59 -.. nonce: 2e82g3 -.. section: Library - -The concatenation (``+``) and repetition (``*``) sequence operations now -raise :exc:`TypeError` instead of :exc:`SystemError` when performed on -:class:`mmap.mmap` objects. Patch by Zackery Spytz. - -.. - -.. bpo: 33734 -.. date: 2018-06-01-10-55-48 -.. nonce: x1W9x0 -.. section: Library - -asyncio/ssl: Fix AttributeError, increase default handshake timeout - -.. - -.. bpo: 31014 -.. date: 2018-05-31-06-48-55 -.. nonce: SNY681 -.. section: Library - -Fixed creating a controller for :mod:`webbrowser` when a user specifies a -path to an entry in the BROWSER environment variable. Based on patch by -John Still. - -.. - -.. bpo: 2504 -.. date: 2018-05-30-16-00-06 -.. nonce: BynUvU -.. section: Library - -Add gettext.pgettext() and variants. - -.. - -.. bpo: 33197 -.. date: 2018-05-30-00-26-05 -.. nonce: XkE2kL -.. section: Library - -Add description property for _ParameterKind - -.. - -.. bpo: 32751 -.. date: 2018-05-29-15-32-18 -.. nonce: oBTqr7 -.. section: Library - -When cancelling the task due to a timeout, :meth:`asyncio.wait_for` will now -wait until the cancellation is complete. - -.. - -.. bpo: 32684 -.. date: 2018-05-29-12-51-18 -.. nonce: ZEIism -.. section: Library - -Fix gather to propagate cancellation of itself even with return_exceptions. - -.. - -.. bpo: 33654 -.. date: 2018-05-29-01-13-39 -.. nonce: sa81Si -.. section: Library - -Support protocol type switching in SSLTransport.set_protocol(). - -.. - -.. bpo: 33674 -.. date: 2018-05-29-00-37-56 -.. nonce: 2IkGhL -.. section: Library - -Pause the transport as early as possible to further reduce the risk of -data_received() being called before connection_made(). - -.. - -.. bpo: 33671 -.. date: 2018-05-28-23-25-17 -.. nonce: GIdKKi -.. section: Library - -:func:`shutil.copyfile`, :func:`shutil.copy`, :func:`shutil.copy2`, -:func:`shutil.copytree` and :func:`shutil.move` use platform-specific -fast-copy syscalls on Linux and macOS in order to copy the file -more efficiently. On Windows :func:`shutil.copyfile` uses a bigger default -buffer size (1 MiB instead of 16 KiB) and a :func:`memoryview`-based variant -of :func:`shutil.copyfileobj` is used. The speedup for copying a 512MiB file -is about +26% on Linux, +50% on macOS and +40% on Windows. Also, much less -CPU cycles are consumed. (Contributed by Giampaolo Rodola' in -:issue:`25427`.) - -.. - -.. bpo: 33674 -.. date: 2018-05-28-22-49-59 -.. nonce: 6LFFj7 -.. section: Library - -Fix a race condition in SSLProtocol.connection_made() of asyncio.sslproto: -start immediately the handshake instead of using call_soon(). Previously, -data_received() could be called before the handshake started, causing the -handshake to hang or fail. - -.. - -.. bpo: 31647 -.. date: 2018-05-28-18-40-26 -.. nonce: s4Fad3 -.. section: Library - -Fixed bug where calling write_eof() on a _SelectorSocketTransport after it's -already closed raises AttributeError. - -.. - -.. bpo: 32610 -.. date: 2018-05-28-16-40-32 -.. nonce: KvUAsL -.. section: Library - -Make asyncio.all_tasks() return only pending tasks. - -.. - -.. bpo: 32410 -.. date: 2018-05-28-16-19-35 -.. nonce: Z1DZaF -.. section: Library - -Avoid blocking on file IO in sendfile fallback code - -.. - -.. bpo: 33469 -.. date: 2018-05-28-15-55-12 -.. nonce: hmXBpY -.. section: Library - -Fix RuntimeError after closing loop that used run_in_executor - -.. - -.. bpo: 33672 -.. date: 2018-05-28-12-29-54 -.. nonce: GM_Xm_ -.. section: Library - -Fix Task.__repr__ crash with Cython's bogus coroutines - -.. - -.. bpo: 33654 -.. date: 2018-05-26-13-09-34 -.. nonce: IbYWxA -.. section: Library - -Fix transport.set_protocol() to support switching between asyncio.Protocol -and asyncio.BufferedProtocol. Fix loop.start_tls() to work with -asyncio.BufferedProtocols. - -.. - -.. bpo: 33652 -.. date: 2018-05-26-10-13-59 -.. nonce: humFJ1 -.. section: Library - -Pickles of type variables and subscripted generics are now future-proof and -compatible with older Python versions. - -.. - -.. bpo: 32493 -.. date: 2018-05-24-17-41-36 -.. nonce: 5tAoAu -.. section: Library - -Fixed :func:`uuid.uuid1` on FreeBSD. - -.. - -.. bpo: 33238 -.. date: 2018-05-24-09-15-52 -.. nonce: ooDfoo -.. section: Library - -Add ``InvalidStateError`` to :mod:`concurrent.futures`. -``Future.set_result`` and ``Future.set_exception`` now raise -``InvalidStateError`` if the futures are not pending or running. Patch by -Jason Haydaman. - -.. - -.. bpo: 33618 -.. date: 2018-05-23-20-14-34 -.. nonce: xU39lr -.. section: Library - -Finalize and document preliminary and experimental TLS 1.3 support with -OpenSSL 1.1.1 - -.. - -.. bpo: 33625 -.. date: 2018-05-23-17-07-54 -.. nonce: nzQgD8 -.. section: Library - -Release GIL on `grp.getgrnam`, `grp.getgrgid`, `pwd.getpwnam` and -`pwd.getpwuid` if reentrant variants of these functions are available. Patch -by William Grzybowski. - -.. - -.. bpo: 33623 -.. date: 2018-05-23-14-58-05 -.. nonce: wAw1cF -.. section: Library - -Fix possible SIGSGV when asyncio.Future is created in __del__ - -.. - -.. bpo: 11874 -.. date: 2018-05-23-00-26-27 -.. nonce: glK5iP -.. section: Library - -Use a better regex when breaking usage into wrappable parts. Avoids bogus -assertion errors from custom metavar strings. - -.. - -.. bpo: 30877 -.. date: 2018-05-22-13-05-12 -.. nonce: JZEGjI -.. section: Library - -Fixed a bug in the Python implementation of the JSON decoder that prevented -the cache of parsed strings from clearing after finishing the decoding. -Based on patch by c-fos. - -.. - -.. bpo: 33604 -.. date: 2018-05-22-11-55-33 -.. nonce: 6V4JcO -.. section: Library - -Remove HMAC default to md5 marked for removal in 3.8 (removal originally -planned in 3.6, bump to 3.8 in gh-7062). - -.. - -.. bpo: 33582 -.. date: 2018-05-19-15-58-14 -.. nonce: qBZPmF -.. section: Library - -Emit a deprecation warning for inspect.formatargspec - -.. - -.. bpo: 21145 -.. date: 2018-05-18-22-52-34 -.. nonce: AiQMDx -.. section: Library - -Add ``functools.cached_property`` decorator, for computed properties cached -for the life of the instance. - -.. - -.. bpo: 33570 -.. date: 2018-05-18-21-50-47 -.. nonce: 7CZy4t -.. section: Library - -Change TLS 1.3 cipher suite settings for compatibility with OpenSSL -1.1.1-pre6 and newer. OpenSSL 1.1.1 will have TLS 1.3 ciphers enabled by -default. - -.. - -.. bpo: 28556 -.. date: 2018-05-17-22-53-08 -.. nonce: C6Hnd1 -.. section: Library - -Do not simplify arguments to `typing.Union`. Now `Union[Manager, Employee]` -is not simplified to `Employee` at runtime. Such simplification previously -caused several bugs and limited possibilities for introspection. - -.. - -.. bpo: 12486 -.. date: 2018-05-17-22-14-58 -.. nonce: HBeh62 -.. section: Library - -:func:`tokenize.generate_tokens` is now documented as a public API to -tokenize unicode strings. It was previously present but undocumented. - -.. - -.. bpo: 33540 -.. date: 2018-05-16-18-10-38 -.. nonce: wy9LRV -.. section: Library - -Add a new ``block_on_close`` class attribute to ``ForkingMixIn`` and -``ThreadingMixIn`` classes of :mod:`socketserver`. - -.. - -.. bpo: 33548 -.. date: 2018-05-16-17-05-48 -.. nonce: xWslmx -.. section: Library - -tempfile._candidate_tempdir_list should consider common TEMP locations - -.. - -.. bpo: 33109 -.. date: 2018-05-16-14-57-58 -.. nonce: nPLL_S -.. section: Library - -argparse subparsers are once again not required by default, reverting the -change in behavior introduced by bpo-26510 in 3.7.0a2. - -.. - -.. bpo: 33541 -.. date: 2018-05-16-12-32-48 -.. nonce: kQORPE -.. section: Library - -Remove unused private method ``_strptime.LocaleTime.__pad`` (a.k.a. -``_LocaleTime__pad``). - -.. - -.. bpo: 33536 -.. date: 2018-05-16-10-07-40 -.. nonce: _s0TE8 -.. section: Library - -dataclasses.make_dataclass now checks for invalid field names and duplicate -fields. Also, added a check for invalid field specifications. - -.. - -.. bpo: 33542 -.. date: 2018-05-16-09-30-27 -.. nonce: idNAcs -.. section: Library - -Prevent ``uuid.get_node`` from using a DUID instead of a MAC on Windows. -Patch by Zvi Effron - -.. - -.. bpo: 26819 -.. date: 2018-05-16-05-24-43 -.. nonce: taxbVT -.. section: Library - -Fix race condition with `ReadTransport.resume_reading` in Windows proactor -event loop. - -.. - -.. bpo: 0 -.. date: 2018-05-15-18-02-03 -.. nonce: pj2Mbb -.. section: Library - -Fix failure in `typing.get_type_hints()` when ClassVar was provided as a -string forward reference. - -.. - -.. bpo: 33516 -.. date: 2018-05-15-17-06-42 -.. nonce: ZzARe4 -.. section: Library - -:class:`unittest.mock.MagicMock` now supports the ``__round__`` magic -method. - -.. - -.. bpo: 28612 -.. date: 2018-05-15-15-03-48 -.. nonce: E9dz39 -.. section: Library - -Added support for Site Maps to urllib's ``RobotFileParser`` as -:meth:`RobotFileParser.site_maps() -`. Patch by Lady Red, based on -patch by Peter Wirtz. - -.. - -.. bpo: 28167 -.. date: 2018-05-15-13-49-13 -.. nonce: p4RdQt -.. section: Library - -Remove platform.linux_distribution, which was deprecated since 3.5. - -.. - -.. bpo: 33504 -.. date: 2018-05-15-12-11-13 -.. nonce: czsHFg -.. section: Library - -Switch the default dictionary implementation for :mod:`configparser` from -:class:`collections.OrderedDict` to the standard :class:`dict` type. - -.. - -.. bpo: 33505 -.. date: 2018-05-14-18-05-35 -.. nonce: L8pAyt -.. section: Library - -Optimize asyncio.ensure_future() by reordering if checks: 1.17x faster. - -.. - -.. bpo: 33497 -.. date: 2018-05-14-17-49-34 -.. nonce: wWT6XM -.. section: Library - -Add errors param to cgi.parse_multipart and make an encoding in FieldStorage -use the given errors (needed for Twisted). Patch by Amber Brown. - -.. - -.. bpo: 29235 -.. date: 2018-05-14-15-01-55 -.. nonce: 47Fzwt -.. section: Library - -The :class:`cProfile.Profile` class can now be used as a context manager. -Patch by Scott Sanderson. - -.. - -.. bpo: 33495 -.. date: 2018-05-14-10-29-03 -.. nonce: TeGTQJ -.. section: Library - -Change dataclasses.Fields repr to use the repr of each of its members, -instead of str. This makes it more clear what each field actually -represents. This is especially true for the 'type' member. - -.. - -.. bpo: 26103 -.. date: 2018-05-14-09-07-14 -.. nonce: _zU8E2 -.. section: Library - -Correct ``inspect.isdatadescriptor`` to look for ``__set__`` or -``__delete__``. Patch by Aaron Hall. - -.. - -.. bpo: 29209 -.. date: 2018-05-12-13-06-41 -.. nonce: h5RxYy -.. section: Library - -Removed the ``doctype()`` method and the *html* parameter of the constructor -of :class:`~xml.etree.ElementTree.XMLParser`. The ``doctype()`` method -defined in a subclass will no longer be called. Deprecated methods -``getchildren()`` and ``getiterator()`` in the :mod:`~xml.etree.ElementTree` -module emit now a :exc:`DeprecationWarning` instead of -:exc:`PendingDeprecationWarning`. - -.. - -.. bpo: 33453 -.. date: 2018-05-12-06-01-02 -.. nonce: Fj-jMD -.. section: Library - -Fix dataclasses to work if using literal string type annotations or if using -PEP 563 "Postponed Evaluation of Annotations". Only specific string -prefixes are detected for both ClassVar ("ClassVar" and "typing.ClassVar") -and InitVar ("InitVar" and "dataclasses.InitVar"). - -.. - -.. bpo: 28556 -.. date: 2018-05-08-16-43-42 -.. nonce: _xr5mp -.. section: Library - -Minor fixes in typing module: add annotations to ``NamedTuple.__new__``, -pass ``*args`` and ``**kwds`` in ``Generic.__new__``. Original PRs by -Paulius Šarka and Chad Dombrova. - -.. - -.. bpo: 33365 -.. date: 2018-05-08-15-01-10 -.. nonce: SicsAd -.. section: Library - -Print the header values besides the header keys instead just the header keys -if *debuglevel* is set to >0 in :mod:`http.client`. Patch by Marco Strigl. - -.. - -.. bpo: 20087 -.. date: 2018-05-05-18-02-24 -.. nonce: lJrvXL -.. section: Library - -Updated alias mapping with glibc 2.27 supported locales. - -.. - -.. bpo: 33422 -.. date: 2018-05-05-09-53-05 -.. nonce: 4FtQ0q -.. section: Library - -Fix trailing quotation marks getting deleted when looking up byte/string -literals on pydoc. Patch by Andrés Delfino. - -.. - -.. bpo: 28167 -.. date: 2018-05-02-07-26-29 -.. nonce: 7FwDfN -.. section: Library - -The function ``platform.linux_distribution`` and ``platform.dist`` now -trigger a ``DeprecationWarning`` and have been marked for removal in Python -3.8 - -.. - -.. bpo: 33281 -.. date: 2018-05-01-22-35-50 -.. nonce: d4jOt4 -.. section: Library - -Fix ctypes.util.find_library regression on macOS. - -.. - -.. bpo: 33311 -.. date: 2018-05-01-22-33-14 -.. nonce: 8YPB-k -.. section: Library - -Text and html output generated by cgitb does not display parentheses if the -current call is done directly in the module. Patch by Stéphane Blondon. - -.. - -.. bpo: 27300 -.. date: 2018-05-01-02-24-44 -.. nonce: LdIXvK -.. section: Library - -The file classes in *tempfile* now accept an *errors* parameter that -complements the already existing *encoding*. Patch by Stephan Hohe. - -.. - -.. bpo: 32933 -.. date: 2018-04-30-22-43-31 -.. nonce: M3iI_y -.. section: Library - -:func:`unittest.mock.mock_open` now supports iteration over the file -contents. Patch by Tony Flury. - -.. - -.. bpo: 33217 -.. date: 2018-04-30-13-29-47 -.. nonce: TENDzd -.. section: Library - -Raise :exc:`TypeError` when looking up non-Enum objects in Enum classes and -Enum members. - -.. - -.. bpo: 33197 -.. date: 2018-04-29-23-56-20 -.. nonce: dgRLqr -.. section: Library - -Update error message when constructing invalid inspect.Parameters Patch by -Dong-hee Na. - -.. - -.. bpo: 33383 -.. date: 2018-04-29-11-15-38 -.. nonce: g32YWn -.. section: Library - -Fixed crash in the get() method of the :mod:`dbm.ndbm` database object when -it is called with a single argument. - -.. - -.. bpo: 33375 -.. date: 2018-04-28-08-11-35 -.. nonce: Dbq1fz -.. section: Library - -The warnings module now finds the Python file associated with a warning from -the code object, rather than the frame's global namespace. This is -consistent with how tracebacks and pdb find filenames, and should work -better for dynamically executed code. - -.. - -.. bpo: 33336 -.. date: 2018-04-27-22-18-38 -.. nonce: T8rxn0 -.. section: Library - -``imaplib`` now allows ``MOVE`` command in ``IMAP4.uid()`` (RFC 6851: IMAP -MOVE Extension) and potentially as a name of supported method of ``IMAP4`` -object. - -.. - -.. bpo: 32455 -.. date: 2018-04-26-13-31-10 -.. nonce: KPWg3K -.. section: Library - -Added *jump* parameter to :func:`dis.stack_effect`. - -.. - -.. bpo: 27485 -.. date: 2018-04-25-14-05-21 -.. nonce: nclVSU -.. section: Library - -Rename and deprecate undocumented functions in :func:`urllib.parse`. - -.. - -.. bpo: 33332 -.. date: 2018-04-23-21-41-30 -.. nonce: Y6OZ8Z -.. section: Library - -Add ``signal.valid_signals()`` to expose the POSIX sigfillset() -functionality. - -.. - -.. bpo: 33251 -.. date: 2018-04-23-18-25-36 -.. nonce: C_K-J9 -.. section: Library - -`ConfigParser.items()` was fixed so that key-value pairs passed in via -`vars` are not included in the resulting output. - -.. - -.. bpo: 33329 -.. date: 2018-04-23-13-21-39 -.. nonce: lQ-Eod -.. section: Library - -Fix multiprocessing regression on newer glibcs - -.. - -.. bpo: 33334 -.. date: 2018-04-22-20-13-21 -.. nonce: 19UMOC -.. section: Library - -:func:`dis.stack_effect` now supports all defined opcodes including NOP and -EXTENDED_ARG. - -.. - -.. bpo: 991266 -.. date: 2018-04-21-00-24-08 -.. nonce: h93TP_ -.. section: Library - -Fix quoting of the ``Comment`` attribute of -:class:`http.cookies.SimpleCookie`. - -.. - -.. bpo: 33131 -.. date: 2018-04-20-10-43-17 -.. nonce: L2E977 -.. section: Library - -Upgrade bundled version of pip to 10.0.1. - -.. - -.. bpo: 33308 -.. date: 2018-04-18-19-12-25 -.. nonce: fW75xi -.. section: Library - -Fixed a crash in the :mod:`parser` module when converting an ST object to a -tree of tuples or lists with ``line_info=False`` and ``col_info=True``. - -.. - -.. bpo: 23403 -.. date: 2018-04-16-16-21-09 -.. nonce: rxR1Q_ -.. section: Library - -lib2to3 now uses pickle protocol 4 for pre-computed grammars. - -.. - -.. bpo: 33266 -.. date: 2018-04-16-15-59-21 -.. nonce: w2PAm- -.. section: Library - -lib2to3 now recognizes ``rf'...'`` strings. - -.. - -.. bpo: 11594 -.. date: 2018-04-16-08-42-03 -.. nonce: QLo4vv -.. section: Library - -Ensure line-endings are respected when using lib2to3. - -.. - -.. bpo: 33254 -.. date: 2018-04-13-15-14-47 -.. nonce: DS4KFK -.. section: Library - -Have :func:`importlib.resources.contents` and -:meth:`importlib.abc.ResourceReader.contents` return an :term:`iterable` -instead of an :term:`iterator`. - -.. - -.. bpo: 33265 -.. date: 2018-04-13-08-12-50 -.. nonce: KPQRk0 -.. section: Library - -``contextlib.ExitStack`` and ``contextlib.AsyncExitStack`` now use a method -instead of a wrapper function for exit callbacks. - -.. - -.. bpo: 33263 -.. date: 2018-04-11-20-29-19 -.. nonce: B56Hc1 -.. section: Library - -Fix FD leak in `_SelectorSocketTransport` Patch by Vlad Starostin. - -.. - -.. bpo: 33256 -.. date: 2018-04-10-20-57-14 -.. nonce: ndHkqu -.. section: Library - -Fix display of ```` call in the html produced by ``cgitb.html()``. -Patch by Stéphane Blondon. - -.. - -.. bpo: 33144 -.. date: 2018-04-10-14-50-30 -.. nonce: iZr4et -.. section: Library - -``random.Random()`` and its subclassing mechanism got optimized to check -only once at class/subclass instantiation time whether its ``getrandbits()`` -method can be relied on by other methods, including ``randrange()``, for the -generation of arbitrarily large random integers. Patch by Wolfgang Maier. - -.. - -.. bpo: 33185 -.. date: 2018-04-08-22-54-07 -.. nonce: Id-Ba9 -.. section: Library - -Fixed regression when running pydoc with the :option:`-m` switch. (The -regression was introduced in 3.7.0b3 by the resolution of :issue:`33053`) - -This fix also changed pydoc to add ``os.getcwd()`` to :data:`sys.path` when -necessary, rather than adding ``"."``. - -.. - -.. bpo: 29613 -.. date: 2018-04-07-13-49-39 -.. nonce: r6FDnB -.. section: Library - -Added support for the ``SameSite`` cookie flag to the ``http.cookies`` -module. - -.. - -.. bpo: 33169 -.. date: 2018-04-06-14-56-26 -.. nonce: ByhDqb -.. section: Library - -Delete entries of ``None`` in :data:`sys.path_importer_cache` when -:meth:`importlib.machinery.invalidate_caches` is called. - -.. - -.. bpo: 33203 -.. date: 2018-04-05-11-09-45 -.. nonce: Hje9Py -.. section: Library - -``random.Random.choice()`` now raises ``IndexError`` for empty sequences -consistently even when called from subclasses without a ``getrandbits()`` -implementation. - -.. - -.. bpo: 33224 -.. date: 2018-04-04-23-41-30 -.. nonce: pyR0jB -.. section: Library - -Update difflib.mdiff() for :pep:`479`. Convert an uncaught StopIteration in -a generator into a return-statement. - -.. - -.. bpo: 33209 -.. date: 2018-04-03-10-37-13 -.. nonce: 9sGWE_ -.. section: Library - -End framing at the end of C implementation of :func:`pickle.Pickler.dump`. - -.. - -.. bpo: 32861 -.. date: 2018-04-02-20-44-54 -.. nonce: HeBjzN -.. section: Library - -The urllib.robotparser's ``__str__`` representation now includes wildcard -entries and the "Crawl-delay" and "Request-rate" fields. Also removes extra -newlines that were being appended to the end of the string. Patch by Michael -Lazar. - -.. - -.. bpo: 23403 -.. date: 2018-04-02-16-10-12 -.. nonce: KG7ADV -.. section: Library - -``DEFAULT_PROTOCOL`` in :mod:`pickle` was bumped to 4. Protocol 4 is -described in :pep:`3154` and available since Python 3.4. It offers better -performance and smaller size compared to protocol 3 introduced in Python -3.0. - -.. - -.. bpo: 20104 -.. date: 2018-04-01-19-21-04 -.. nonce: -AKcGa -.. section: Library - -Improved error handling and fixed a reference leak in -:func:`os.posix_spawn()`. - -.. - -.. bpo: 33106 -.. date: 2018-03-30-01-20-35 -.. nonce: zncfvW -.. section: Library - -Deleting a key from a read-only dbm database raises module specific error -instead of KeyError. - -.. - -.. bpo: 33175 -.. date: 2018-03-29-04-32-25 -.. nonce: _zs1yM -.. section: Library - -In dataclasses, Field.__set_name__ now looks up the __set_name__ special -method on the class, not the instance, of the default value. - -.. - -.. bpo: 32380 -.. date: 2018-03-29-03-09-22 -.. nonce: NhuGig -.. section: Library - -Create functools.singledispatchmethod to support generic single dispatch on -descriptors and methods. - -.. - -.. bpo: 33141 -.. date: 2018-03-26-12-33-13 -.. nonce: 23wlxf -.. section: Library - -Have Field objects pass through __set_name__ to their default values, if -they have their own __set_name__. - -.. - -.. bpo: 33096 -.. date: 2018-03-25-13-18-16 -.. nonce: ofdbe7 -.. section: Library - -Allow ttk.Treeview.insert to insert iid that has a false boolean value. Note -iid=0 and iid=False would be same. Patch by Garvit Khatri. - -.. - -.. bpo: 32873 -.. date: 2018-03-24-19-54-48 -.. nonce: cHyoAm -.. section: Library - -Treat type variables and special typing forms as immutable by copy and -pickle. This fixes several minor issues and inconsistencies, and improves -backwards compatibility with Python 3.6. - -.. - -.. bpo: 33134 -.. date: 2018-03-24-19-34-26 -.. nonce: hbVeIX -.. section: Library - -When computing dataclass's __hash__, use the lookup table to contain the -function which returns the __hash__ value. This is an improvement over -looking up a string, and then testing that string to see what to do. - -.. - -.. bpo: 33127 -.. date: 2018-03-24-15-08-24 -.. nonce: olJmHv -.. section: Library - -The ssl module now compiles with LibreSSL 2.7.1. - -.. - -.. bpo: 32505 -.. date: 2018-03-22-16-05-56 -.. nonce: YK1N8v -.. section: Library - -Raise TypeError if a member variable of a dataclass is of type Field, but -doesn't have a type annotation. - -.. - -.. bpo: 33078 -.. date: 2018-03-21-17-59-39 -.. nonce: PQOniT -.. section: Library - -Fix the failure on OSX caused by the tests relying on sem_getvalue - -.. - -.. bpo: 33116 -.. date: 2018-03-21-16-52-26 -.. nonce: Tvzerj -.. section: Library - -Add 'Field' to dataclasses.__all__. - -.. - -.. bpo: 32896 -.. date: 2018-03-20-20-53-21 -.. nonce: ewW3Ln -.. section: Library - -Fix an error where subclassing a dataclass with a field that uses a -default_factory would generate an incorrect class. - -.. - -.. bpo: 33100 -.. date: 2018-03-19-20-47-00 -.. nonce: chyIO4 -.. section: Library - -Dataclasses: If a field has a default value that's a MemberDescriptorType, -then it's from that field being in __slots__, not an actual default value. - -.. - -.. bpo: 32953 -.. date: 2018-03-18-17-38-48 -.. nonce: t8WAWN -.. section: Library - -If a non-dataclass inherits from a frozen dataclass, allow attributes to be -added to the derived class. Only attributes from the frozen dataclass -cannot be assigned to. Require all dataclasses in a hierarchy to be either -all frozen or all non-frozen. - -.. - -.. bpo: 33097 -.. date: 2018-03-18-16-48-23 -.. nonce: Yl4gI2 -.. section: Library - -Raise RuntimeError when ``executor.submit`` is called during interpreter -shutdown. - -.. - -.. bpo: 32968 -.. date: 2018-03-18-15-57-32 -.. nonce: E4G7BO -.. section: Library - -Modulo and floor division involving Fraction and float should return float. - -.. - -.. bpo: 33061 -.. date: 2018-03-16-16-07-33 -.. nonce: TRTTek -.. section: Library - -Add missing ``NoReturn`` to ``__all__`` in typing.py - -.. - -.. bpo: 33078 -.. date: 2018-03-15-07-38-00 -.. nonce: RmjUF5 -.. section: Library - -Fix the size handling in multiprocessing.Queue when a pickling error occurs. - -.. - -.. bpo: 33064 -.. date: 2018-03-12-19-58-25 -.. nonce: LO2KIY -.. section: Library - -lib2to3 now properly supports trailing commas after ``*args`` and -``**kwargs`` in function signatures. - -.. - -.. bpo: 33056 -.. date: 2018-03-12-16-40-00 -.. nonce: lNN9Eh -.. section: Library - -FIX properly close leaking fds in concurrent.futures.ProcessPoolExecutor. - -.. - -.. bpo: 33021 -.. date: 2018-03-12-00-27-56 -.. nonce: m19B9T -.. section: Library - -Release the GIL during fstat() calls, avoiding hang of all threads when -calling mmap.mmap(), os.urandom(), and random.seed(). Patch by Nir Soffer. - -.. - -.. bpo: 31804 -.. date: 2018-03-11-19-03-52 -.. nonce: i8KUMp -.. section: Library - -Avoid failing in multiprocessing.Process if the standard streams are closed -or None at exit. - -.. - -.. bpo: 33034 -.. date: 2018-03-11-08-44-12 -.. nonce: bpb23d -.. section: Library - -Providing an explicit error message when casting the port property to -anything that is not an integer value using ``urlparse()`` and -``urlsplit()``. Patch by Matt Eaton. - -.. - -.. bpo: 30249 -.. date: 2018-03-11-00-20-26 -.. nonce: KSkgLB -.. section: Library - -Improve struct.unpack_from() exception messages for problems with the buffer -size and offset. - -.. - -.. bpo: 33037 -.. date: 2018-03-09-23-07-07 -.. nonce: nAJ3at -.. section: Library - -Skip sending/receiving data after SSL transport closing. - -.. - -.. bpo: 27683 -.. date: 2018-03-07-22-28-17 -.. nonce: 572Rv4 -.. section: Library - -Fix a regression in :mod:`ipaddress` that result of :meth:`hosts` is empty -when the network is constructed by a tuple containing an integer mask and -only 1 bit left for addresses. - -.. - -.. bpo: 22674 -.. date: 2018-03-07-19-37-00 -.. nonce: 2sIMmM -.. section: Library - -Add the strsignal() function in the signal module that returns the system -description of the given signal, as returned by strsignal(3). - -.. - -.. bpo: 32999 -.. date: 2018-03-06-20-30-20 -.. nonce: lgFXWl -.. section: Library - -Fix C implementation of ``ABC.__subclasscheck__(cls, subclass)`` crashed -when ``subclass`` is not a type object. - -.. - -.. bpo: 33009 -.. date: 2018-03-06-11-54-59 -.. nonce: -Ekysb -.. section: Library - -Fix inspect.signature() for single-parameter partialmethods. - -.. - -.. bpo: 32969 -.. date: 2018-03-06-00-19-41 -.. nonce: rGTKa0 -.. section: Library - -Expose several missing constants in zlib and fix corresponding -documentation. - -.. - -.. bpo: 32056 -.. date: 2018-03-01-17-49-56 -.. nonce: IlpfgE -.. section: Library - -Improved exceptions raised for invalid number of channels and sample width -when read an audio file in modules :mod:`aifc`, :mod:`wave` and -:mod:`sunau`. - -.. - -.. bpo: 32970 -.. date: 2018-02-28-18-39-48 -.. nonce: IPWtbS -.. section: Library - -Improved disassembly of the MAKE_FUNCTION instruction. - -.. - -.. bpo: 32844 -.. date: 2018-02-28-13-08-00 -.. nonce: u8tnAe -.. section: Library - -Fix wrong redirection of a low descriptor (0 or 1) to stderr in subprocess -if another low descriptor is closed. - -.. - -.. bpo: 32960 -.. date: 2018-02-26-20-04-40 -.. nonce: 48r0Ml -.. section: Library - -For dataclasses, disallow inheriting frozen from non-frozen classes, and -also disallow inheriting non-frozen from frozen classes. This restriction -will be relaxed at a future date. - -.. - -.. bpo: 32713 -.. date: 2018-02-26-13-16-36 -.. nonce: 55yegW -.. section: Library - -Fixed tarfile.itn handling of out-of-bounds float values. Patch by Joffrey -Fuhrer. - -.. - -.. bpo: 32257 -.. date: 2018-02-26-09-08-07 -.. nonce: 6ElnUt -.. section: Library - -The ssl module now contains OP_NO_RENEGOTIATION constant, available with -OpenSSL 1.1.0h or 1.1.1. - -.. - -.. bpo: 32951 -.. date: 2018-02-25-18-22-01 -.. nonce: gHrCXq -.. section: Library - -Direct instantiation of SSLSocket and SSLObject objects is now prohibited. -The constructors were never documented, tested, or designed as public -constructors. Users were suppose to use ssl.wrap_socket() or SSLContext. - -.. - -.. bpo: 32929 -.. date: 2018-02-25-13-47-48 -.. nonce: X2gTDH -.. section: Library - -Remove the tri-state parameter "hash", and add the boolean "unsafe_hash". If -unsafe_hash is True, add a __hash__ function, but if a __hash__ exists, -raise TypeError. If unsafe_hash is False, add a __hash__ based on the -values of eq= and frozen=. The unsafe_hash=False behavior is the same as -the old hash=None behavior. unsafe_hash=False is the default, just as -hash=None used to be. - -.. - -.. bpo: 32947 -.. date: 2018-02-25-13-06-21 -.. nonce: mqStVW -.. section: Library - -Add OP_ENABLE_MIDDLEBOX_COMPAT and test workaround for TLSv1.3 for future -compatibility with OpenSSL 1.1.1. - -.. - -.. bpo: 32146 -.. date: 2018-02-25-10-17-23 -.. nonce: xOzUFW -.. section: Library - -Document the interaction between frozen executables and the spawn and -forkserver start methods in multiprocessing. - -.. - -.. bpo: 30622 -.. date: 2018-02-24-21-40-42 -.. nonce: dQjxSe -.. section: Library - -The ssl module now detects missing NPN support in LibreSSL. - -.. - -.. bpo: 32922 -.. date: 2018-02-23-19-12-04 -.. nonce: u-xe0B -.. section: Library - -dbm.open() now encodes filename with the filesystem encoding rather than -default encoding. - -.. - -.. bpo: 32759 -.. date: 2018-02-23-12-21-41 -.. nonce: M-y9GA -.. section: Library - -Free unused arenas in multiprocessing.heap. - -.. - -.. bpo: 32859 -.. date: 2018-02-19-17-46-31 -.. nonce: kAT-Xp -.. section: Library - -In ``os.dup2``, don't check every call whether the ``dup3`` syscall exists -or not. - -.. - -.. bpo: 32556 -.. date: 2018-02-19-14-27-51 -.. nonce: CsRsgr -.. section: Library - -nt._getfinalpathname, nt._getvolumepathname and nt._getdiskusage now -correctly convert from bytes. - -.. - -.. bpo: 21060 -.. date: 2018-02-17-19-20-19 -.. nonce: S1Z-x6 -.. section: Library - -Rewrite confusing message from setup.py upload from "No dist file created in -earlier command" to the more helpful "Must create and upload files in one -command". - -.. - -.. bpo: 32857 -.. date: 2018-02-16-14-37-14 -.. nonce: -XljAx -.. section: Library - -In :mod:`tkinter`, ``after_cancel(None)`` now raises a :exc:`ValueError` -instead of canceling the first scheduled function. Patch by Cheryl Sabella. - -.. - -.. bpo: 32852 -.. date: 2018-02-15-12-04-29 -.. nonce: HDqIxM -.. section: Library - -Make sure sys.argv remains as a list when running trace. - -.. - -.. bpo: 31333 -.. date: 2018-02-15-08-18-52 -.. nonce: 4fF-gM -.. section: Library - -``_abc`` module is added. It is a speedup module with C implementations for -various functions and methods in ``abc``. Creating an ABC subclass and -calling ``isinstance`` or ``issubclass`` with an ABC subclass are up to 1.5x -faster. In addition, this makes Python start-up up to 10% faster. - -Note that the new implementation hides internal registry and caches, -previously accessible via private attributes ``_abc_registry``, -``_abc_cache``, and ``_abc_negative_cache``. There are three debugging -helper methods that can be used instead ``_dump_registry``, -``_abc_registry_clear``, and ``_abc_caches_clear``. - -.. - -.. bpo: 32841 -.. date: 2018-02-14-00-21-24 -.. nonce: bvHDOc -.. section: Library - -Fixed `asyncio.Condition` issue which silently ignored cancellation after -notifying and cancelling a conditional lock. Patch by Bar Harel. - -.. - -.. bpo: 32819 -.. date: 2018-02-11-15-54-41 -.. nonce: ZTRX2Q -.. section: Library - -ssl.match_hostname() has been simplified and no longer depends on re and -ipaddress module for wildcard and IP addresses. Error reporting for invalid -wildcards has been improved. - -.. - -.. bpo: 19675 -.. date: 2018-02-10-23-41-05 -.. nonce: -dj35- -.. section: Library - -``multiprocessing.Pool`` no longer leaks processes if its initialization -fails. - -.. - -.. bpo: 32394 -.. date: 2018-02-10-13-51-56 -.. nonce: dFM9SI -.. section: Library - -socket: Remove TCP_FASTOPEN,TCP_KEEPCNT,TCP_KEEPIDLE,TCP_KEEPINTVL flags on -older version Windows during run-time. - -.. - -.. bpo: 31787 -.. date: 2018-02-09-21-41-56 -.. nonce: owSZ2t -.. section: Library - -Fixed refleaks of ``__init__()`` methods in various modules. (Contributed by -Oren Milman) - -.. - -.. bpo: 30157 -.. date: 2018-02-09-14-44-43 -.. nonce: lEiiAK -.. section: Library - -Fixed guessing quote and delimiter in csv.Sniffer.sniff() when only the last -field is quoted. Patch by Jake Davis. - -.. - -.. bpo: 30688 -.. date: 2018-02-08-18-59-11 -.. nonce: zBh4TH -.. section: Library - -Added support of ``\N{name}`` escapes in regular expressions. Based on -patch by Jonathan Eunice. - -.. - -.. bpo: 32792 -.. date: 2018-02-08-00-47-07 -.. nonce: NtyDb4 -.. section: Library - -collections.ChainMap() preserves the order of the underlying mappings. - -.. - -.. bpo: 32775 -.. date: 2018-02-07-19-12-10 -.. nonce: -T77_c -.. section: Library - -:func:`fnmatch.translate()` no longer produces patterns which contain set -operations. Sets starting with '[' or containing '--', '&&', '~~' or '||' -will be interpreted differently in regular expressions in future versions. -Currently they emit warnings. fnmatch.translate() now avoids producing -patterns containing such sets by accident. - -.. - -.. bpo: 32622 -.. date: 2018-02-06-17-58-15 -.. nonce: AE0Jz7 -.. section: Library - -Implement native fast sendfile for Windows proactor event loop. - -.. - -.. bpo: 32777 -.. date: 2018-02-05-21-28-28 -.. nonce: C-wIXF -.. section: Library - -Fix a rare but potential pre-exec child process deadlock in subprocess on -POSIX systems when marking file descriptors inheritable on exec in the child -process. This bug appears to have been introduced in 3.4. - -.. - -.. bpo: 32647 -.. date: 2018-02-05-13-31-42 -.. nonce: ktmfR_ -.. section: Library - -The ctypes module used to depend on indirect linking for dlopen. The shared -extension is now explicitly linked against libdl on platforms with dl. - -.. - -.. bpo: 32749 -.. date: 2018-02-02-17-21-24 -.. nonce: u5scIn -.. section: Library - -A :mod:`dbm.dumb` database opened with flags 'r' is now read-only. -:func:`dbm.dumb.open` with flags 'r' and 'w' no longer creates a database if -it does not exist. - -.. - -.. bpo: 32741 -.. date: 2018-02-01-17-54-08 -.. nonce: KUvOPL -.. section: Library - -Implement ``asyncio.TimerHandle.when()`` method. - -.. - -.. bpo: 32691 -.. date: 2018-02-01-15-53-35 -.. nonce: VLWVTq -.. section: Library - -Use mod_spec.parent when running modules with pdb - -.. - -.. bpo: 32734 -.. date: 2018-02-01-01-34-47 -.. nonce: gCV9AD -.. section: Library - -Fixed ``asyncio.Lock()`` safety issue which allowed acquiring and locking -the same lock multiple times, without it being free. Patch by Bar Harel. - -.. - -.. bpo: 32727 -.. date: 2018-01-30-17-46-18 -.. nonce: aHVsRC -.. section: Library - -Do not include name field in SMTP envelope from address. Patch by Stéphane -Wirtel - -.. - -.. bpo: 31453 -.. date: 2018-01-21-15-01-50 -.. nonce: cZiZBe -.. section: Library - -Add TLSVersion constants and SSLContext.maximum_version / minimum_version -attributes. The new API wraps OpenSSL 1.1 -https://www.openssl.org/docs/man1.1.0/ssl/SSL_CTX_set_min_proto_version.html -feature. - -.. - -.. bpo: 24334 -.. date: 2018-01-20-23-17-25 -.. nonce: GZuQLv -.. section: Library - -Internal implementation details of ssl module were cleaned up. The SSLSocket -has one less layer of indirection. Owner and session information are now -handled by the SSLSocket and SSLObject constructor. Channel binding -implementation has been simplified. - -.. - -.. bpo: 31848 -.. date: 2018-01-18-23-34-17 -.. nonce: M2cldy -.. section: Library - -Fix the error handling in Aifc_read.initfp() when the SSND chunk is not -found. Patch by Zackery Spytz. - -.. - -.. bpo: 32585 -.. date: 2018-01-18-13-09-00 -.. nonce: qpeijr -.. section: Library - -Add Ttk spinbox widget to :mod:`tkinter.ttk`. Patch by Alan D Moore. - -.. - -.. bpo: 32512 -.. date: 2018-01-07-17-43-10 -.. nonce: flC-dE -.. section: Library - -:mod:`profile` CLI accepts `-m module_name` as an alternative to script -path. - -.. - -.. bpo: 8525 -.. date: 2018-01-01-00-16-59 -.. nonce: Dq8s63 -.. section: Library - -help() on a type now displays builtin subclasses. This is intended primarily -to help with notification of more specific exception subclasses. - -Patch by Sanyam Khurana. - -.. - -.. bpo: 31639 -.. date: 2017-12-27-21-55-19 -.. nonce: l3avDJ -.. section: Library - -http.server now exposes a ThreadingHTTPServer class and uses it when the -module is run with ``-m`` to cope with web browsers pre-opening sockets. - -.. - -.. bpo: 29877 -.. date: 2017-12-16-11-40-52 -.. nonce: SfWhmz -.. section: Library - -compileall: import ProcessPoolExecutor only when needed, preventing hangs on -low resource platforms - -.. - -.. bpo: 32221 -.. date: 2017-12-06-10-10-10 -.. nonce: ideco_ -.. section: Library - -Various functions returning tuple containing IPv6 addresses now omit -``%scope`` part since the same information is already encoded in *scopeid* -tuple item. Especially this speeds up :func:`socket.recvfrom` when it -receives multicast packet since useless resolving of network interface name -is omitted. - -.. - -.. bpo: 32147 -.. date: 2017-11-28-10-23-13 -.. nonce: PI2k1Y -.. section: Library - -:func:`binascii.unhexlify` is now up to 2 times faster. Patch by Sergey -Fedoseev. - -.. - -.. bpo: 30693 -.. date: 2017-11-27-15-09-49 -.. nonce: yC4mJ8 -.. section: Library - -The TarFile class now recurses directories in a reproducible way. - -.. - -.. bpo: 30693 -.. date: 2017-11-27-15-09-49 -.. nonce: yC4mJ7 -.. section: Library - -The ZipFile class now recurses directories in a reproducible way. - -.. - -.. bpo: 31680 -.. date: 2017-11-01-15-44-48 -.. nonce: yO6oSC -.. section: Library - -Added :data:`curses.ncurses_version`. - -.. - -.. bpo: 31908 -.. date: 2017-10-31 -.. nonce: g4xh8x -.. section: Library - -Fix output of cover files for ``trace`` module command-line tool. Previously -emitted cover files only when ``--missing`` option was used. Patch by -Michael Selik. - -.. - -.. bpo: 31608 -.. date: 2017-10-29-10-37-55 -.. nonce: wkp8Nw -.. section: Library - -Raise a ``TypeError`` instead of crashing if a ``collections.deque`` -subclass returns a non-deque from ``__new__``. Patch by Oren Milman. - -.. - -.. bpo: 31425 -.. date: 2017-10-24-10-18-35 -.. nonce: 1lgw47 -.. section: Library - -Add support for sockets of the AF_QIPCRTR address family, supported by the -Linux kernel. This is used to communicate with services, such as GPS or -radio, running on Qualcomm devices. Patch by Bjorn Andersson. - -.. - -.. bpo: 22005 -.. date: 2017-10-12-22-39-55 -.. nonce: lGP-sc -.. section: Library - -Implemented unpickling instances of :class:`~datetime.datetime`, -:class:`~datetime.date` and :class:`~datetime.time` pickled by Python 2. -``encoding='latin1'`` should be used for successful decoding. - -.. - -.. bpo: 27645 -.. date: 2017-10-05-20-41-48 -.. nonce: 1Y_Wag -.. section: Library - -:class:`sqlite3.Connection` now exposes a -:class:`~sqlite3.Connection.backup` method, if the underlying SQLite library -is at version 3.6.11 or higher. Patch by Lele Gaifax. - -.. - -.. bpo: 16865 -.. date: 2017-09-29-16-40-38 -.. nonce: l-f6I_ -.. section: Library - -Support arrays >=2GiB in :mod:`ctypes`. Patch by Segev Finer. - -.. - -.. bpo: 31508 -.. date: 2017-09-19-12-38-31 -.. nonce: pDsFJl -.. section: Library - -Removed support of arguments in `tkinter.ttk.Treeview.selection`. It was -deprecated in 3.6. Use specialized methods like `selection_set` for -changing the selection. - -.. - -.. bpo: 29456 -.. date: 2017-08-24-17-55-39 -.. nonce: XaB3MP -.. section: Library - -Fix bugs in hangul normalization: u1176, u11a7 and u11c3 - -.. - -.. bpo: 21257 -.. date: 2019-01-15-21-45-27 -.. nonce: U9LKkx -.. section: Documentation - -Document :func:`http.client.parse_headers`. - -.. - -.. bpo: 34764 -.. date: 2018-12-23-23-52-31 -.. nonce: DwOGeT -.. section: Documentation - -Improve example of iter() with 2nd sentinel argument. - -.. - -.. bpo: 35564 -.. date: 2018-12-22-22-52-05 -.. nonce: TuEU_D -.. section: Documentation - -Explicitly set master_doc variable in conf.py for compliance with Sphinx 2.0 - -.. - -.. bpo: 35511 -.. date: 2018-12-16-16-14-44 -.. nonce: iVcyav -.. section: Documentation - -Specified that profile.Profile class doesn't not support enable or disable -methods. Also, elaborated that Profile object as a context manager is only -supported in cProfile module. - -.. - -.. bpo: 10536 -.. date: 2018-11-04-22-03-56 -.. nonce: a0IsfE -.. section: Documentation - -Enhance the gettext docs. Patch by Éric Araujo - -.. - -.. bpo: 35089 -.. date: 2018-10-28-16-51-31 -.. nonce: _stCpS -.. section: Documentation - -Remove mention of ``typing.io`` and ``typing.re``. Their types should be -imported from ``typing`` directly. - -.. - -.. bpo: 35038 -.. date: 2018-10-25-17-45-09 -.. nonce: 2eVOYS -.. section: Documentation - -Fix the documentation about an unexisting `f_restricted` attribute in the -frame object. Patch by Stéphane Wirtel - -.. - -.. bpo: 35042 -.. date: 2018-10-22-14-17-57 -.. nonce: 1UGv1a -.. section: Documentation - -Replace PEP XYZ by the pep role and allow to use the direct links to the -PEPs. - -.. - -.. bpo: 35044 -.. date: 2018-10-22-14-09-58 -.. nonce: qjvNtI -.. section: Documentation - -Fix the documentation with the role ``exc`` for the appropriated exception. -Patch by Stéphane Wirtel - -.. - -.. bpo: 35035 -.. date: 2018-10-21-02-20-36 -.. nonce: 4zBObK -.. section: Documentation - -Rename documentation for :mod:`email.utils` to ``email.utils.rst``. - -.. - -.. bpo: 34967 -.. date: 2018-10-13-07-39-57 -.. nonce: E40tFP -.. section: Documentation - -Use app.add_object_type() instead of the deprecated Sphinx function -app.description_unit() - -.. - -.. bpo: 34913 -.. date: 2018-10-10-00-34-08 -.. nonce: kVd1Fv -.. section: Documentation - -Add documentation about the new command line interface of the gzip module. - -.. - -.. bpo: 32174 -.. date: 2018-10-08-19-15-28 -.. nonce: YO9CYm -.. section: Documentation - -chm document displays non-ASCII charaters properly on some MBCS Windows -systems. - -.. - -.. bpo: 11233 -.. date: 2018-10-03-20-39-25 -.. nonce: BX6Gen -.. section: Documentation - -Create availability directive for documentation. Original patch by Georg -Brandl. - -.. - -.. bpo: 34790 -.. date: 2018-09-24-12-47-08 -.. nonce: G2KXIH -.. section: Documentation - -Document how passing coroutines to asyncio.wait() can be confusing. - -.. - -.. bpo: 34552 -.. date: 2018-09-12-10-18-04 -.. nonce: p9PoYv -.. section: Documentation - -Make clear that ``==`` operator sometimes is equivalent to `is`. The ``<``, -``<=``, ``>`` and ``>=`` operators are only defined where they make sense. - -.. - -.. bpo: 28617 -.. date: 2018-09-06-22-39-47 -.. nonce: MjnJLz -.. section: Documentation - -Fixed info in the stdtypes docs concerning the types that support membership -tests. - -.. - -.. bpo: 20177 -.. date: 2018-07-28-17-17-42 -.. nonce: cOZJWp -.. section: Documentation - -Migrate datetime.date.fromtimestamp to Argument Clinic. Patch by Tim -Hoffmann. - -.. - -.. bpo: 34065 -.. date: 2018-07-07-20-38-41 -.. nonce: 1snofM -.. section: Documentation - -Fix wrongly written basicConfig documentation markup syntax - -.. - -.. bpo: 33460 -.. date: 2018-06-22-08-38-29 -.. nonce: kHt4D0 -.. section: Documentation - -replaced ellipsis with correct error codes in tutorial chapter 3. - -.. - -.. bpo: 33847 -.. date: 2018-06-15-14-58-45 -.. nonce: IIDp6t -.. section: Documentation - -Add '@' operator entry to index. - -.. - -.. bpo: 33409 -.. date: 2018-06-08-23-46-01 -.. nonce: r4z9MM -.. section: Documentation - -Clarified the relationship between :pep:`538`'s PYTHONCOERCECLOCALE and PEP -540's PYTHONUTF8 mode. - -.. - -.. bpo: 33197 -.. date: 2018-06-08-23-37-14 -.. nonce: OERTKf -.. section: Documentation - -Add versionadded tag to the documentation of ParameterKind.description - -.. - -.. bpo: 17045 -.. date: 2018-06-07-08-33-45 -.. nonce: ZNx6KU -.. section: Documentation - -Improve the C-API doc for PyTypeObject. This includes adding several -quick-reference tables and a lot of missing slot/typedef entries. The -existing entries were also cleaned up with a slightly more consistent -format. - -.. - -.. bpo: 33736 -.. date: 2018-06-01-12-27-40 -.. nonce: JVegIu -.. section: Documentation - -Improve the documentation of :func:`asyncio.open_connection`, -:func:`asyncio.start_server` and their UNIX socket counterparts. - -.. - -.. bpo: 23859 -.. date: 2018-05-29-16-02-31 -.. nonce: E5gba1 -.. section: Documentation - -Document that `asyncio.wait()` does not cancel its futures on timeout. - -.. - -.. bpo: 32436 -.. date: 2018-05-23-11-59-51 -.. nonce: S1LGPa -.. section: Documentation - -Document :pep:`567` changes to asyncio. - -.. - -.. bpo: 33604 -.. date: 2018-05-22-11-47-14 -.. nonce: 5YHTpz -.. section: Documentation - -Update HMAC md5 default to a DeprecationWarning, bump removal to 3.8. - -.. - -.. bpo: 33594 -.. date: 2018-05-21-14-36-12 -.. nonce: -HRcyX -.. section: Documentation - -Document ``getargspec``, ``from_function`` and ``from_builtin`` as -deprecated in their respective docstring, and include version since -deprecation in DeprecationWarning message. - -.. - -.. bpo: 33503 -.. date: 2018-05-14-20-08-58 -.. nonce: Wvt0qg -.. section: Documentation - -Fix broken pypi link - -.. - -.. bpo: 33421 -.. date: 2018-05-14-15-15-41 -.. nonce: 3GU_QO -.. section: Documentation - -Add missing documentation for ``typing.AsyncContextManager``. - -.. - -.. bpo: 33487 -.. date: 2018-05-13-14-44-30 -.. nonce: iLDzFb -.. section: Documentation - -BZ2file now emit a DeprecationWarning when buffering=None is passed, the -deprecation message and documentation also now explicitly state it is -deprecated since 3.0. - -.. - -.. bpo: 33378 -.. date: 2018-04-29-04-02-18 -.. nonce: -anAHN -.. section: Documentation - -Add Korean language switcher for https://docs.python.org/3/ - -.. - -.. bpo: 33276 -.. date: 2018-04-20-14-09-36 -.. nonce: rA1z_3 -.. section: Documentation - -Clarify that the ``__path__`` attribute on modules cannot be just any value. - -.. - -.. bpo: 33201 -.. date: 2018-04-01-21-03-41 -.. nonce: aa8Lkl -.. section: Documentation - -Modernize documentation for writing C extension types. - -.. - -.. bpo: 33195 -.. date: 2018-04-01-14-30-36 -.. nonce: dRS-XX -.. section: Documentation - -Deprecate ``Py_UNICODE`` usage in ``c-api/arg`` document. ``Py_UNICODE`` -related APIs are deprecated since Python 3.3, but it is missed in the -document. - -.. - -.. bpo: 33126 -.. date: 2018-03-28-17-03-17 -.. nonce: 5UGkNv -.. section: Documentation - -Document PyBuffer_ToContiguous(). - -.. - -.. bpo: 27212 -.. date: 2018-03-22-19-23-04 -.. nonce: wrE5KR -.. section: Documentation - -Modify documentation for the :func:`islice` recipe to consume initial values -up to the start index. - -.. - -.. bpo: 28247 -.. date: 2018-03-20-20-11-05 -.. nonce: -V-WS- -.. section: Documentation - -Update :mod:`zipapp` documentation to describe how to make standalone -applications. - -.. - -.. bpo: 18802 -.. date: 2018-03-11-18-53-47 -.. nonce: JhAqH3 -.. section: Documentation - -Documentation changes for ipaddress. Patch by Jon Foster and Berker Peksag. - -.. - -.. bpo: 27428 -.. date: 2018-03-11-00-16-56 -.. nonce: B7A8FT -.. section: Documentation - -Update documentation to clarify that ``WindowsRegistryFinder`` implements -``MetaPathFinder``. (Patch by Himanshu Lakhara) - -.. - -.. bpo: 28124 -.. date: 2018-02-25-16-33-35 -.. nonce: _uzkgq -.. section: Documentation - -The ssl module function ssl.wrap_socket() has been de-emphasized and -deprecated in favor of the more secure and efficient -SSLContext.wrap_socket() method. - -.. - -.. bpo: 17232 -.. date: 2018-02-23-12-48-03 -.. nonce: tmuTKL -.. section: Documentation - -Clarify docs for -O and -OO. Patch by Terry Reedy. - -.. - -.. bpo: 32436 -.. date: 2018-02-14-11-10-41 -.. nonce: TTJ2jb -.. section: Documentation - -Add documentation for the contextvars module (PEP 567). - -.. - -.. bpo: 32800 -.. date: 2018-02-10-15-16-04 -.. nonce: FyrqCk -.. section: Documentation - -Update link to w3c doc for xml default namespaces. - -.. - -.. bpo: 11015 -.. date: 2018-02-10-12-48-38 -.. nonce: -gUf34 -.. section: Documentation - -Update :mod:`test.support` documentation. - -.. - -.. bpo: 32613 -.. date: 2018-02-05-15-05-53 -.. nonce: TDjgM1 -.. section: Documentation - -Update the faq/windows.html to use the py command from PEP 397 instead of -python. - -.. - -.. bpo: 8722 -.. date: 2018-02-03-06-11-37 -.. nonce: MPyVyj -.. section: Documentation - -Document :meth:`__getattr__` behavior when property :meth:`get` method -raises :exc:`AttributeError`. - -.. - -.. bpo: 32614 -.. date: 2018-02-02-07-41-57 -.. nonce: LSqzGw -.. section: Documentation - -Modify RE examples in documentation to use raw strings to prevent -:exc:`DeprecationWarning` and add text to REGEX HOWTO to highlight the -deprecation. - -.. - -.. bpo: 20709 -.. date: 2018-02-01-10-57-24 -.. nonce: 1flcnc -.. section: Documentation - -Remove the paragraph where we explain that os.utime() does not support a -directory as path under Windows. Patch by Jan-Philip Gehrcke - -.. - -.. bpo: 32722 -.. date: 2018-01-30-11-28-27 -.. nonce: frdp6A -.. section: Documentation - -Remove the bad example in the tutorial of the Generator Expression. Patch by -Stéphane Wirtel - -.. - -.. bpo: 31972 -.. date: 2018-01-25-14-23-12 -.. nonce: w1m_8r -.. section: Documentation - -Improve docstrings for `pathlib.PurePath` subclasses. - -.. - -.. bpo: 30607 -.. date: 2018-01-25-13-58-49 -.. nonce: 4dXxiq -.. section: Documentation - -Use the externalized ``python-docs-theme`` package when building the -documentation. - -.. - -.. bpo: 8243 -.. date: 2018-01-13-20-30-53 -.. nonce: s98r28 -.. section: Documentation - -Add a note about curses.addch and curses.addstr exception behavior when -writing outside a window, or pad. - -.. - -.. bpo: 32337 -.. date: 2017-12-22-17-29-37 -.. nonce: eZe-ID -.. section: Documentation - -Update documentation related with ``dict`` order. - -.. - -.. bpo: 25041 -.. date: 2017-10-23-13-41-12 -.. nonce: iAo2gW -.. section: Documentation - -Document ``AF_PACKET`` in the :mod:`socket` module. - -.. - -.. bpo: 31432 -.. date: 2017-09-13-07-14-59 -.. nonce: yAY4Z3 -.. section: Documentation - -Clarify meaning of CERT_NONE, CERT_OPTIONAL, and CERT_REQUIRED flags for -ssl.SSLContext.verify_mode. - -.. - -.. bpo: 35772 -.. date: 2019-01-18-12-19-19 -.. nonce: sGBbsn -.. section: Tests - -Fix sparse file tests of test_tarfile on ppc64 with the tmpfs filesystem. -Fix the function testing if the filesystem supports sparse files: create a -file which contains data and "holes", instead of creating a file which -contains no data. tmpfs effective block size is a page size (tmpfs lives in -the page cache). RHEL uses 64 KiB pages on aarch64, ppc64, ppc64le, only -s390x and x86_64 use 4 KiB pages, whereas the test punch holes of 4 KiB. - -.. - -.. bpo: 35045 -.. date: 2019-01-10-18-35-42 -.. nonce: qdd6d9 -.. section: Tests - -Make ssl tests less strict and also accept TLSv1 as system default. The -changes unbreaks test_min_max_version on Fedora 29. - -.. - -.. bpo: 32710 -.. date: 2019-01-07-23-34-41 -.. nonce: Hzo1b8 -.. section: Tests - -``test_asyncio/test_sendfile.py`` now resets the event loop policy using -:func:`tearDownModule` as done in other tests, to prevent a warning when -running tests on Windows. - -.. - -.. bpo: 33717 -.. date: 2019-01-07-23-22-44 -.. nonce: GhHXv8 -.. section: Tests - -test.pythoninfo now logs information of all clocks, not only time.time() and -time.perf_counter(). - -.. - -.. bpo: 35488 -.. date: 2019-01-04-21-34-53 -.. nonce: U7JJzP -.. section: Tests - -Add a test to pathlib's Path.match() to verify it does not support -glob-style ** recursive pattern matching. - -.. - -.. bpo: 31731 -.. date: 2018-12-18-23-20-39 -.. nonce: tcv85C -.. section: Tests - -Fix a race condition in ``check_interrupted_write()`` of test_io: create -directly the thread with SIGALRM signal blocked, rather than blocking the -signal later from the thread. Previously, it was possible that the thread -gets the signal before the signal is blocked. - -.. - -.. bpo: 35424 -.. date: 2018-12-18-22-36-53 -.. nonce: 1Pz4IS -.. section: Tests - -Fix test_multiprocessing_main_handling: use :class:`multiprocessing.Pool` -with a context manager and then explicitly join the pool. - -.. - -.. bpo: 35519 -.. date: 2018-12-17-16-41-45 -.. nonce: RR3L_w -.. section: Tests - -Rename :mod:`test.bisect` module to :mod:`test.bisect_cmd` to avoid conflict -with :mod:`bisect` module when running directly a test like ``./python -Lib/test/test_xmlrpc.py``. - -.. - -.. bpo: 35513 -.. date: 2018-12-16-23-36-47 -.. nonce: k4WHlA -.. section: Tests - -Replace :func:`time.time` with :func:`time.monotonic` in tests to measure -time delta. - -.. - -.. bpo: 34279 -.. date: 2018-12-12-18-20-18 -.. nonce: DhKcuP -.. section: Tests - -:func:`test.support.run_unittest` no longer raise :exc:`TestDidNotRun` if -the test result contains skipped tests. The exception is now only raised if -no test have been run and no test have been skipped. - -.. - -.. bpo: 35412 -.. date: 2018-12-12-18-07-58 -.. nonce: kbuJor -.. section: Tests - -Add testcase to ``test_future4``: check unicode literal. - -.. - -.. bpo: 26704 -.. date: 2018-12-10-13-18-37 -.. nonce: DBAN4c -.. section: Tests - -Added test demonstrating double-patching of an instance method. Patch by -Anthony Sottile. - -.. - -.. bpo: 33725 -.. date: 2018-12-09-01-27-29 -.. nonce: TaGayj -.. section: Tests - -test_multiprocessing_fork may crash on recent versions of macOS. Until the -issue is resolved, skip the test on macOS. - -.. - -.. bpo: 35352 -.. date: 2018-11-30-17-18-56 -.. nonce: 8bD7GC -.. section: Tests - -Modify test_asyncio to use the certificate set from the test directory. - -.. - -.. bpo: 35317 -.. date: 2018-11-26-16-54-21 -.. nonce: jByGP2 -.. section: Tests - -Fix ``mktime()`` overflow error in ``test_email``: run -``test_localtime_daylight_true_dst_true()`` and -``test_localtime_daylight_false_dst_true()`` with a specific timezone. - -.. - -.. bpo: 21263 -.. date: 2018-11-04-20-17-09 -.. nonce: T3qo9r -.. section: Tests - -After several reports that test_gdb does not work properly on macOS and -since gdb is not shipped by default anymore, test_gdb is now skipped on -macOS when LLVM Clang has been used to compile Python. Patch by Lysandros -Nikolaou - -.. - -.. bpo: 34279 -.. date: 2018-10-27-13-41-55 -.. nonce: v0Xqxe -.. section: Tests - -regrtest issue a warning when no tests have been executed in a particular -test file. Also, a new final result state is issued if no test have been -executed across all test files. Patch by Pablo Galindo. - -.. - -.. bpo: 34962 -.. date: 2018-10-11-22-34-27 -.. nonce: 0PLBi8 -.. section: Tests - -make docstest in Doc now passes., and is enforced in CI - -.. - -.. bpo: 23596 -.. date: 2018-10-09-23-51-07 -.. nonce: rdnert -.. section: Tests - -Use argparse for the command line of the gzip module. Patch by Antony Lee - -.. - -.. bpo: 34537 -.. date: 2018-09-21-17-33-41 -.. nonce: GImYtZ -.. section: Tests - -Fix ``test_gdb.test_strings()`` when ``LC_ALL=C`` and GDB was compiled with -Python 3.6 or earlier. - -.. - -.. bpo: 34587 -.. date: 2018-09-13-20-58-07 -.. nonce: rCcxp3 -.. section: Tests - -test_socket: Remove RDSTest.testCongestion(). The test tries to fill the -receiver's socket buffer and expects an error. But the RDS protocol doesn't -require that. Moreover, the Linux implementation of RDS expects that the -producer of the messages reduces its rate, it's not the role of the receiver -to trigger an error. The test fails on Fedora 28 by design, so just remove -it. - -.. - -.. bpo: 34661 -.. date: 2018-09-13-09-53-15 -.. nonce: bdTamP -.. section: Tests - -Fix test_shutil if unzip doesn't support -t. - -.. - -.. bpo: 34200 -.. date: 2018-09-12-17-00-34 -.. nonce: dfxYQK -.. section: Tests - -Fixed non-deterministic flakiness of test_pkg by not using the scary -test.support.module_cleanup() logic to save and restore sys.modules contents -between test cases. - -.. - -.. bpo: 34569 -.. date: 2018-09-09-14-36-59 -.. nonce: okj1Xh -.. section: Tests - -The experimental PEP 554 data channels now correctly pass negative PyLong -objects between subinterpreters on 32-bit systems. Patch by Michael Felt. - -.. - -.. bpo: 34594 -.. date: 2018-09-05-23-50-21 -.. nonce: tqL-GS -.. section: Tests - -Fix usage of hardcoded ``errno`` values in the tests. - -.. - -.. bpo: 34579 -.. date: 2018-09-04-15-16-42 -.. nonce: bp4HdM -.. section: Tests - -Fix test_embed for AIX Patch by Michael Felt - -.. - -.. bpo: 34542 -.. date: 2018-08-29-16-30-52 -.. nonce: 9stVAW -.. section: Tests - -Use 3072 RSA keys and SHA-256 signature for test certs and keys. - -.. - -.. bpo: 11193 -.. date: 2018-08-26-13-12-34 -.. nonce: H8fCGa -.. section: Tests - -Remove special condition for AIX in `test_subprocess.test_undecodable_env` - -.. - -.. bpo: 34347 -.. date: 2018-08-25-13-28-18 -.. nonce: IsRDPB -.. section: Tests - -Fix `test_utf8_mode.test_cmd_line` for AIX - -.. - -.. bpo: 34490 -.. date: 2018-08-24-20-23-15 -.. nonce: vb2cx4 -.. section: Tests - -On AIX with AF_UNIX family sockets getsockname() does not provide -'sockname', so skip calls to transport.get_extra_info('sockname') - -.. - -.. bpo: 34391 -.. date: 2018-08-16-18-48-47 -.. nonce: ouNfxC -.. section: Tests - -Fix ftplib test for TLS 1.3 by reading from data socket. - -.. - -.. bpo: 11192 -.. date: 2018-08-14-20-50-07 -.. nonce: g7TwYm -.. section: Tests - -Fix `test_socket` on AIX AIX 6.1 and later IPv6 zone id supports only -supported by inet_pton6_zone() Switch to runtime-based platform.system() to -establish current platform rather than build-time based sys.platform() - -.. - -.. bpo: 34399 -.. date: 2018-08-14-10-47-44 -.. nonce: D_jd1G -.. section: Tests - -Update all RSA keys and DH params to use at least 2048 bits. - -.. - -.. bpo: 34373 -.. date: 2018-08-10-16-17-51 -.. nonce: SKdb1k -.. section: Tests - -Fix ``test_mktime`` and ``test_pthread_getcpuclickid`` tests for AIX Add -range checking for ``_PyTime_localtime`` for AIX Patch by Michael Felt - -.. - -.. bpo: 11191 -.. date: 2018-08-08-22-41-30 -.. nonce: eq9tSH -.. section: Tests - -Skip the distutils test 'test_search_cpp' when using XLC as compiler patch -by aixtools (Michael Felt) - -.. - -.. bpo: 0 -.. date: 2018-07-10-18-53-46 -.. nonce: UBQJBc -.. section: Tests - -Improved an error message when mock assert_has_calls fails. - -.. - -.. bpo: 33746 -.. date: 2018-06-19-17-55-46 -.. nonce: Sz7avn -.. section: Tests - -Fix test_unittest when run in verbose mode. - -.. - -.. bpo: 33901 -.. date: 2018-06-19-14-04-21 -.. nonce: OFW1Sr -.. section: Tests - -Fix test_dbm_gnu on macOS with gdbm 1.15: add a larger value to make sure -that the file size changes. - -.. - -.. bpo: 33873 -.. date: 2018-06-16-01-37-31 -.. nonce: d86vab -.. section: Tests - -Fix a bug in ``regrtest`` that caused an extra test to run if ---huntrleaks/-R was used. Exit with error in case that invalid parameters -are specified to --huntrleaks/-R (at least one warmup run and one repetition -must be used). - -.. - -.. bpo: 33562 -.. date: 2018-06-01-14-25-31 -.. nonce: GutEHf -.. section: Tests - -Check that a global asyncio event loop policy is not left behind by any -tests. - -.. - -.. bpo: 33655 -.. date: 2018-05-26-16-01-40 -.. nonce: Frb4LA -.. section: Tests - -Ignore test_posix_fallocate failures on BSD platforms that might be due to -running on ZFS. - -.. - -.. bpo: 32962 -.. date: 2018-05-10-16-59-15 -.. nonce: S-rcIN -.. section: Tests - -Fixed test_gdb when Python is compiled with flags -mcet -fcf-protection -O0. - -.. - -.. bpo: 33358 -.. date: 2018-04-27-11-46-35 -.. nonce: _OcR59 -.. section: Tests - -Fix ``test_embed.test_pre_initialization_sys_options()`` when the -interpreter is built with ``--enable-shared``. - -.. - -.. bpo: 32872 -.. date: 2018-03-28-01-35-02 -.. nonce: J5NDUj -.. section: Tests - -Avoid regrtest compatibility issue with namespace packages. - -.. - -.. bpo: 32517 -.. date: 2018-03-09-07-05-12 -.. nonce: ugc1iW -.. section: Tests - -Fix failing ``test_asyncio`` on macOS 10.12.2+ due to transport of -``KqueueSelector`` loop was not being closed. - -.. - -.. bpo: 32663 -.. date: 2018-01-25-18-10-47 -.. nonce: IKDsqu -.. section: Tests - -Making sure the `SMTPUTF8SimTests` class of tests gets run in -test_smtplib.py. - -.. - -.. bpo: 27643 -.. date: 2018-01-12-09-05-19 -.. nonce: _6z49y -.. section: Tests - -Test_C test case needs "signed short" bitfields, but the IBM XLC compiler -(on AIX) does not support this Skip the code and test when AIX and XLC are -used - -Applicable to Python2-2.7 and later - -.. - -.. bpo: 19417 -.. date: 2018-01-08-13-33-47 -.. nonce: 2asoXy -.. section: Tests - -Add test_bdb.py. - -.. - -.. bpo: 31809 -.. date: 2017-10-18-18-07-45 -.. nonce: KlQrkE -.. section: Tests - -Add tests to verify connection with secp ECDH curves. - -.. - -.. bpo: 34691 -.. date: 2019-02-02-13-34-05 -.. nonce: B-Lsj4 -.. section: Build - -The _contextvars module is now built into the core Python library on -Windows. - -.. - -.. bpo: 35683 -.. date: 2019-01-10-11-37-18 -.. nonce: pf5Oos -.. section: Build - -Improved Azure Pipelines build steps and now verifying layouts correctly - -.. - -.. bpo: 35642 -.. date: 2019-01-02-11-23-33 -.. nonce: pjkhJe -.. section: Build - -Remove asynciomodule.c from pythoncore.vcxproj - -.. - -.. bpo: 35550 -.. date: 2018-12-29-10-19-43 -.. nonce: BTuu8e -.. section: Build - -Fix incorrect Solaris #ifdef checks to look for __sun && __SVR4 instead of -sun when compiling. - -.. - -.. bpo: 35499 -.. date: 2018-12-14-19-36-05 -.. nonce: 9yAldM -.. section: Build - -``make profile-opt`` no longer replaces ``CFLAGS_NODIST`` with ``CFLAGS``. -It now adds profile-guided optimization (PGO) flags to ``CFLAGS_NODIST``: -existing ``CFLAGS_NODIST`` flags are kept. - -.. - -.. bpo: 35257 -.. date: 2018-12-05-22-28-40 -.. nonce: dmcd_s -.. section: Build - -Avoid leaking the linker flags from Link Time Optimizations (LTO) into -distutils when compiling C extensions. - -.. - -.. bpo: 35351 -.. date: 2018-12-04-15-33-28 -.. nonce: ZhhBfT -.. section: Build - -When building Python with clang and LTO, LTO flags are no longer passed into -CFLAGS to build third-party C extensions through distutils. - -.. - -.. bpo: 35139 -.. date: 2018-11-01-15-01-23 -.. nonce: XZTttb -.. section: Build - -Fix a compiler error when statically linking `pyexpat` in `Modules/Setup`. - -.. - -.. bpo: 35059 -.. date: 2018-10-26-14-49-19 -.. nonce: PKsBxP -.. section: Build - -PCbuild: Set InlineFunctionExpansion to OnlyExplicitInline ("/Ob1" option) -in pyproject.props in Debug mode to expand functions marked as inline. This -change should make Python compiled in Debug mode a little bit faster on -Windows. - -.. - -.. bpo: 35011 -.. date: 2018-10-17-17-38-57 -.. nonce: GgoPIC -.. section: Build - -Restores the use of pyexpatns.h to isolate our embedded copy of the expat C -library so that its symbols do not conflict at link or dynamic loading time -with an embedding application or other extension modules with their own -version of libexpat. - -.. - -.. bpo: 28015 -.. date: 2018-10-16-12-22-36 -.. nonce: ylSgFh -.. section: Build - -Have --with-lto works correctly with clang. - -.. - -.. bpo: 34765 -.. date: 2018-09-26-17-29-10 -.. nonce: AvxdVj -.. section: Build - -Update the outdated install-sh file to the latest revision from automake -v1.16.1 - -.. - -.. bpo: 34585 -.. date: 2018-09-18-16-28-31 -.. nonce: CGMu0h -.. section: Build - -Check for floating-point byte order in configure.ac using compilation tests -instead of executing code, so that these checks work in cross-compiled -builds. - -.. - -.. bpo: 34710 -.. date: 2018-09-17-13-56-12 -.. nonce: ARqIAK -.. section: Build - -Fixed SSL module build with OpenSSL & pedantic CFLAGS. - -.. - -.. bpo: 34582 -.. date: 2018-09-14-09-53-21 -.. nonce: j3omgk -.. section: Build - -Add JUnit XML output for regression tests and update Azure DevOps builds. - -.. - -.. bpo: 34081 -.. date: 2018-09-06-07-15-20 -.. nonce: cuSTnH -.. section: Build - -Make Sphinx warnings as errors in the Docs Makefile. - -.. - -.. bpo: 34555 -.. date: 2018-08-31-19-41-09 -.. nonce: dfQcnm -.. section: Build - -Fix for case where it was not possible to have both -``HAVE_LINUX_VM_SOCKETS_H`` and ``HAVE_SOCKADDR_ALG`` be undefined. - -.. - -.. bpo: 33015 -.. date: 2018-08-24-09-48-25 -.. nonce: s21y74 -.. section: Build - -Fix an undefined behaviour in the pthread implementation of -:c:func:`PyThread_start_new_thread`: add a function wrapper to always return -``NULL``. - -.. - -.. bpo: 34245 -.. date: 2018-07-27-09-52-48 -.. nonce: bBV0NI -.. section: Build - -The Python shared library is now installed with write permission (mode -0755), which is the standard way of installing such libraries. - -.. - -.. bpo: 34121 -.. date: 2018-07-15-16-49-06 -.. nonce: 74G_lo -.. section: Build - -Fix detection of C11 atomic support on clang. - -.. - -.. bpo: 32430 -.. date: 2018-07-10-21-33-25 -.. nonce: UN3Nk8 -.. section: Build - -Rename Modules/Setup.dist to Modules/Setup, and remove the necessity to copy -the former manually to the latter when updating the local source tree. - -.. - -.. bpo: 30345 -.. date: 2018-06-15-18-18-16 -.. nonce: j-xRE1 -.. section: Build - -Add -g to LDFLAGS when compiling with LTO to get debug symbols. - -.. - -.. bpo: 5755 -.. date: 2018-06-04-21-34-34 -.. nonce: 65GmCj -.. section: Build - -Move ``-Wstrict-prototypes`` option to ``CFLAGS_NODIST`` from ``OPT``. This -option emitted annoying warnings when building extension modules written in -C++. - -.. - -.. bpo: 33614 -.. date: 2018-05-28-11-40-22 -.. nonce: 28e0sE -.. section: Build - -Ensures module definition files for the stable ABI on Windows are correctly -regenerated. - -.. - -.. bpo: 33648 -.. date: 2018-05-25-13-05-51 -.. nonce: bJ4JZH -.. section: Build - -The --with-c-locale-warning configuration flag has been removed. It has had -no effect for about a year. - -.. - -.. bpo: 33522 -.. date: 2018-05-15-12-44-50 -.. nonce: mJoNcA -.. section: Build - -Enable CI builds on Visual Studio Team Services at -https://python.visualstudio.com/cpython - -.. - -.. bpo: 33512 -.. date: 2018-05-15-02-07-49 -.. nonce: X4Fy1Q -.. section: Build - -configure's check for "long double" has been simplified - -.. - -.. bpo: 33483 -.. date: 2018-05-13-17-21-54 -.. nonce: WOs-en -.. section: Build - -C compiler is now correctly detected from the standard environment -variables. --without-gcc and --with-icc options have been removed. - -.. - -.. bpo: 33394 -.. date: 2018-04-30-17-36-46 -.. nonce: _Vdi4t -.. section: Build - -Enable the verbose build for extension modules, when GNU make is passed -macros on the command line. - -.. - -.. bpo: 33393 -.. date: 2018-04-30-17-19-37 -.. nonce: HkVCqI -.. section: Build - -Update config.guess and config.sub files. - -.. - -.. bpo: 33377 -.. date: 2018-04-30-16-53-00 -.. nonce: QBh6vP -.. section: Build - -Add new triplets for mips r6 and riscv variants (used in extension -suffixes). - -.. - -.. bpo: 32232 -.. date: 2018-04-17-00-38-19 -.. nonce: o7G_UO -.. section: Build - -By default, modules configured in `Modules/Setup` are no longer built with -`-DPy_BUILD_CORE`. Instead, modules that specifically need that preprocessor -definition include it in their individual entries. - -.. - -.. bpo: 33182 -.. date: 2018-03-30-14-55-48 -.. nonce: CePczb -.. section: Build - -The embedding tests can once again be built with clang 6.0 - -.. - -.. bpo: 33163 -.. date: 2018-03-28-04-15-03 -.. nonce: hfpWuU -.. section: Build - -Upgrade pip to 9.0.3 and setuptools to v39.0.1. - -.. - -.. bpo: 33012 -.. date: 2018-03-08-20-25-29 -.. nonce: k9Fe1q -.. section: Build - -gcc 8 has added a new warning heuristic to detect invalid function casts and -a stock python build seems to hit that warning quite often. The most common -is the cast of a METH_NOARGS function (that uses just one argument) to a -PyCFunction. Fix this by adding a dummy argument to all functions that -implement METH_NOARGS. - -.. - -.. bpo: 32898 -.. date: 2018-02-21-12-46-00 -.. nonce: M15bZh -.. section: Build - -Fix the python debug build when using COUNT_ALLOCS. - -.. - -.. bpo: 29442 -.. date: 2017-09-26-23-08-27 -.. nonce: fD8YTi -.. section: Build - -Replace optparse with argparse in setup.py - -.. - -.. bpo: 35890 -.. date: 2019-02-02-22-12-23 -.. nonce: ccIjHH -.. section: Windows - -Fix API calling consistency of GetVersionEx and wcstok. - -.. - -.. bpo: 32560 -.. date: 2019-02-02-11-02-44 -.. nonce: I5WAGW -.. section: Windows - -The ``py`` launcher now forwards its ``STARTUPINFO`` structure to child -processes. - -.. - -.. bpo: 35854 -.. date: 2019-01-29-15-44-46 -.. nonce: Ww3z19 -.. section: Windows - -Fix EnvBuilder and --symlinks in venv on Windows - -.. - -.. bpo: 35811 -.. date: 2019-01-25-12-46-36 -.. nonce: 2hU-mm -.. section: Windows - -Avoid propagating venv settings when launching via py.exe - -.. - -.. bpo: 35797 -.. date: 2019-01-25-12-29-14 -.. nonce: MzyOK9 -.. section: Windows - -Fix default executable used by the multiprocessing module - -.. - -.. bpo: 35758 -.. date: 2019-01-21-05-18-14 -.. nonce: 8LsY3l -.. section: Windows - -Allow building on ARM with MSVC. - -.. - -.. bpo: 29734 -.. date: 2019-01-12-16-52-38 -.. nonce: 6_OJwI -.. section: Windows - -Fix handle leaks in os.stat on Windows. - -.. - -.. bpo: 35596 -.. date: 2019-01-08-13-56-01 -.. nonce: oFvhcm -.. section: Windows - -Use unchecked PYCs for the embeddable distro to avoid zipimport -restrictions. - -.. - -.. bpo: 35596 -.. date: 2018-12-28-07-25-47 -.. nonce: P9CEY2 -.. section: Windows - -Fix vcruntime140.dll being added to embeddable distro multiple times. - -.. - -.. bpo: 35402 -.. date: 2018-12-13-13-30-04 -.. nonce: n_mXb2 -.. section: Windows - -Update Windows build to use Tcl and Tk 8.6.9 - -.. - -.. bpo: 35401 -.. date: 2018-12-10-15-01-13 -.. nonce: 9L1onG -.. section: Windows - -Updates Windows build to OpenSSL 1.1.0j - -.. - -.. bpo: 34977 -.. date: 2018-12-07-10-00-38 -.. nonce: agQJbD -.. section: Windows - -venv on Windows will now use a python.exe redirector rather than copying the -actual binaries from the base environment. - -.. - -.. bpo: 34977 -.. date: 2018-10-30-13-39-17 -.. nonce: 0l7_QV -.. section: Windows - -Adds support for building a Windows App Store package - -.. - -.. bpo: 35067 -.. date: 2018-10-25-11-29-22 -.. nonce: RHWi7W -.. section: Windows - -Remove _distutils_findvs module and use vswhere.exe instead. - -.. - -.. bpo: 32557 -.. date: 2018-09-25-10-39-27 -.. nonce: Rs1bf9 -.. section: Windows - -Allow shutil.disk_usage to take a file path on Windows - -.. - -.. bpo: 34770 -.. date: 2018-09-22-11-02-35 -.. nonce: 4lEUOd -.. section: Windows - -Fix a possible null pointer dereference in pyshellext.cpp. - -.. - -.. bpo: 34603 -.. date: 2018-09-13-08-29-04 -.. nonce: 2AB7sc -.. section: Windows - -Fix returning structs from functions produced by MSVC - -.. - -.. bpo: 34581 -.. date: 2018-09-04-23-13-19 -.. nonce: lnbC0k -.. section: Windows - -Guard MSVC-specific code in socketmodule.c with ``#ifdef _MSC_VER``. - -.. - -.. bpo: 34532 -.. date: 2018-09-03-01-23-52 -.. nonce: N1HEbE -.. section: Windows - -Fixes exit code of list version arguments for py.exe. - -.. - -.. bpo: 34062 -.. date: 2018-08-21-19-28-23 -.. nonce: 3gxsA3 -.. section: Windows - -Fixed the '--list' and '--list-paths' arguments for the py.exe launcher - -.. - -.. bpo: 34225 -.. date: 2018-07-25-16-13-12 -.. nonce: ngemNL -.. section: Windows - -Ensure INCLUDE and LIB directories do not end with a backslash. - -.. - -.. bpo: 34011 -.. date: 2018-07-11-15-58-06 -.. nonce: Ho_d5T -.. section: Windows - -A suite of code has been changed which copied across DLLs and init.tcl from -the running Python location into a venv being created. These copies are -needed only when running from a Python source build, and the copying code is -now only run when that is the case, rather than whenever a venv is created. - -.. - -.. bpo: 34006 -.. date: 2018-07-02-14-19-32 -.. nonce: 7SgBT_ -.. section: Windows - -Revert line length limit for Windows help docs. The line-length limit is not -needed because the pages appear in a separate app rather than on a browser -tab. It can also interact badly with the DPI setting. - -.. - -.. bpo: 31546 -.. date: 2018-06-27-23-33-54 -.. nonce: zJlap- -.. section: Windows - -Restore running PyOS_InputHook while waiting for user input at the prompt. -The restores integration of interactive GUI windows (such as Matplotlib -figures) with the prompt on Windows. - -.. - -.. bpo: 30237 -.. date: 2018-06-25-09-33-48 -.. nonce: EybiZA -.. section: Windows - -Output error when ReadConsole is canceled by CancelSynchronousIo instead of -crashing. - -.. - -.. bpo: 33895 -.. date: 2018-06-19-11-57-50 -.. nonce: zpblTy -.. section: Windows - -GIL is released while calling functions that acquire Windows loader lock. - -.. - -.. bpo: 33720 -.. date: 2018-06-04-09-20-53 -.. nonce: VKDXHK -.. section: Windows - -Reduces maximum marshal recursion depth on release builds. - -.. - -.. bpo: 29097 -.. date: 2018-05-16-11-31-17 -.. nonce: 9mqEuI -.. section: Windows - -Fix bug where :meth:`datetime.fromtimestamp` erroneously throws an -:exc:`OSError` on Windows for values between 0 and 86400. Patch by Ammar -Askar. - -.. - -.. bpo: 33316 -.. date: 2018-04-20-03-24-07 -.. nonce: 9IiJ8J -.. section: Windows - -PyThread_release_lock always fails - -.. - -.. bpo: 33184 -.. date: 2018-04-13-11-28-55 -.. nonce: 7YhqQE -.. section: Windows - -Update Windows installer to use OpenSSL 1.1.0h. - -.. - -.. bpo: 32890 -.. date: 2018-03-08-20-02-38 -.. nonce: 3jzFzY -.. section: Windows - -Fix usage of GetLastError() instead of errno in os.execve() and -os.truncate(). - -.. - -.. bpo: 33016 -.. date: 2018-03-07-01-33-33 -.. nonce: Z_Med0 -.. section: Windows - -Fix potential use of uninitialized memory in nt._getfinalpathname - -.. - -.. bpo: 32903 -.. date: 2018-02-28-11-03-24 -.. nonce: 1SXY4t -.. section: Windows - -Fix a memory leak in os.chdir() on Windows if the current directory is set -to a UNC path. - -.. - -.. bpo: 32901 -.. date: 2018-02-23-00-47-13 -.. nonce: mGKz5_ -.. section: Windows - -Update Tcl and Tk versions to 8.6.8 - -.. - -.. bpo: 31966 -.. date: 2018-02-19-13-54-42 -.. nonce: _Q3HPb -.. section: Windows - -Fixed WindowsConsoleIO.write() for writing empty data. - -.. - -.. bpo: 32409 -.. date: 2018-02-19-10-00-57 -.. nonce: nocuDg -.. section: Windows - -Ensures activate.bat can handle Unicode contents. - -.. - -.. bpo: 32457 -.. date: 2018-02-19-08-54-06 -.. nonce: vVP0Iz -.. section: Windows - -Improves handling of denormalized executable path when launching Python. - -.. - -.. bpo: 32370 -.. date: 2018-02-10-15-38-19 -.. nonce: kcKuct -.. section: Windows - -Use the correct encoding for ipconfig output in the uuid module. Patch by -Segev Finer. - -.. - -.. bpo: 29248 -.. date: 2018-02-07-17-50-48 -.. nonce: Xzwj-6 -.. section: Windows - -Fix :func:`os.readlink` on Windows, which was mistakenly treating the -``PrintNameOffset`` field of the reparse data buffer as a number of -characters instead of bytes. Patch by Craig Holmquist and SSE4. - -.. - -.. bpo: 1104 -.. date: 2017-11-24-12-53-54 -.. nonce: 1CWSZp -.. section: Windows - -Correctly handle string length in ``msilib.SummaryInfo.GetProperty()`` to -prevent it from truncating the last character. - -.. - -.. bpo: 35401 -.. date: 2018-12-09-13-56-49 -.. nonce: n8B7X1 -.. section: macOS - -Update macOS installer to use OpenSSL 1.1.0j. - -.. - -.. bpo: 35025 -.. date: 2018-10-18-23-54-55 -.. nonce: X4LFJg -.. section: macOS - -Properly guard the use of the ``CLOCK_GETTIME`` et al. macros in -``timemodule`` on macOS. - -.. - -.. bpo: 24658 -.. date: 2018-10-17-14-36-08 -.. nonce: Naddgx -.. section: macOS - -On macOS, fix reading from and writing into a file with a size larger than 2 -GiB. - -.. - -.. bpo: 34405 -.. date: 2018-09-11-08-30-55 -.. nonce: UzIi0n -.. section: macOS - -Update to OpenSSL 1.1.0i for macOS installer builds. - -.. - -.. bpo: 33635 -.. date: 2018-07-31-09-51-01 -.. nonce: KiscE- -.. section: macOS - -In macOS stat on some file descriptors (/dev/fd/3 f.e) will result in bad -file descriptor OSError. Guard against this exception was added in is_dir, -is_file and similar methods. DirEntry.is_dir can also throw this exception -so _RecursiveWildcardSelector._iterate_directories was also extended with -the same error ignoring pattern. - -.. - -.. bpo: 13631 -.. date: 2018-05-16-13-25-58 -.. nonce: UIjDyY -.. section: macOS - -The .editrc file in user's home directory is now processed correctly during -the readline initialization through editline emulation on macOS. - -.. - -.. bpo: 33184 -.. date: 2018-04-07-00-51-34 -.. nonce: 3j208P -.. section: macOS - -Update macOS installer build to use OpenSSL 1.1.0h. - -.. - -.. bpo: 32726 -.. date: 2018-03-29-06-56-12 -.. nonce: urS9uX -.. section: macOS - -Build and link with private copy of Tcl/Tk 8.6 for the macOS 10.6+ -installer. The 10.9+ installer variant already does this. This means that -the Python 3.7 provided by the python.org macOS installers no longer need or -use any external versions of Tcl/Tk, either system-provided or -user-installed, such as ActiveTcl. - -.. - -.. bpo: 32901 -.. date: 2018-02-27-17-33-15 -.. nonce: hQu0w3 -.. section: macOS - -Update macOS 10.9+ installer to Tcl/Tk 8.6.8. - -.. - -.. bpo: 31903 -.. date: 2017-11-01-16-53-12 -.. nonce: K6jCVG -.. section: macOS - -In :mod:`_scproxy`, drop the GIL when calling into ``SystemConfiguration`` -to avoid deadlocks. - -.. - -.. bpo: 35770 -.. date: 2019-01-18-13-04-30 -.. nonce: 2LxJGu -.. section: IDLE - -IDLE macosx deletes Options => Configure IDLE. It previously deleted Window -=> Zoom Height by mistake. (Zoom Height is now on the Options menu). On -Mac, the settings dialog is accessed via Preferences on the IDLE menu. - -.. - -.. bpo: 35769 -.. date: 2019-01-18-01-24-23 -.. nonce: GqsB34 -.. section: IDLE - -Change IDLE's new file name from 'Untitled' to 'untitled' - -.. - -.. bpo: 35660 -.. date: 2019-01-04-19-14-29 -.. nonce: hMxI7N -.. section: IDLE - -Fix imports in idlelib.window. - -.. - -.. bpo: 35641 -.. date: 2019-01-02-22-15-01 -.. nonce: QEaANl -.. section: IDLE - -Proper format `calltip` when the function has no docstring. - -.. - -.. bpo: 33987 -.. date: 2018-12-31-17-04-18 -.. nonce: fD92up -.. section: IDLE - -Use ttk Frame for ttk widgets. - -.. - -.. bpo: 34055 -.. date: 2018-12-28-17-16-33 -.. nonce: TmmpzR -.. section: IDLE - -Fix erroneous 'smart' indents and newlines in IDLE Shell. - -.. - -.. bpo: 35591 -.. date: 2018-12-28-01-19-20 -.. nonce: SFpDj2 -.. section: IDLE - -Find Selection now works when selection not found. - -.. - -.. bpo: 35196 -.. date: 2018-12-27-17-46-42 -.. nonce: 9E-xUh -.. section: IDLE - -Speed up squeezer line counting. - -.. - -.. bpo: 35598 -.. date: 2018-12-27-15-29-11 -.. nonce: FWOOm8 -.. section: IDLE - -Update config_key: use PEP 8 names and ttk widgets, make some objects -global, and add tests. - -.. - -.. bpo: 28097 -.. date: 2018-12-26-13-53-34 -.. nonce: 95I9NT -.. section: IDLE - -Add Previous/Next History entries to Shell menu. - -.. - -.. bpo: 35208 -.. date: 2018-12-23-17-42-11 -.. nonce: J5NOg7 -.. section: IDLE - -Squeezer now properly counts wrapped lines before newlines. - -.. - -.. bpo: 35555 -.. date: 2018-12-21-18-44-30 -.. nonce: M58_K3 -.. section: IDLE - -Gray out Code Context menu entry when it's not applicable. - -.. - -.. bpo: 35521 -.. date: 2018-12-20-00-14-15 -.. nonce: x32BRn -.. section: IDLE - -Document the IDLE editor code context feature. Add some internal references -within the IDLE doc. - -.. - -.. bpo: 22703 -.. date: 2018-12-18-13-56-31 -.. nonce: UlsjKQ -.. section: IDLE - -The Code Context menu label now toggles between Show/Hide Code Context. The -Zoom Height menu now toggles between Zoom/Restore Height. Zoom Height has -moved from the Window menu to the Options menu. - -.. - -.. bpo: 35213 -.. date: 2018-11-12-00-20-01 -.. nonce: cqNgzT -.. section: IDLE - -Where appropriate, use 'macOS' in idlelib. - -.. - -.. bpo: 34864 -.. date: 2018-11-11-17-13-50 -.. nonce: cw0PvO -.. section: IDLE - -On macOS, warn if the system preference "Prefer tabs when opening documents" -is set to "Always". - -.. - -.. bpo: 34864 -.. date: 2018-11-10-21-27-25 -.. nonce: Ci-G2q -.. section: IDLE - -Document two IDLE on MacOS issues. The System Preferences Dock "prefer tabs -always" setting disables some IDLE features. Menus are a bit different than -as described for Windows and Linux. - -.. - -.. bpo: 35202 -.. date: 2018-11-10-09-10-54 -.. nonce: TeJJrt -.. section: IDLE - -Remove unused imports from lib/idlelib - -.. - -.. bpo: 33000 -.. date: 2018-11-06-23-10-54 -.. nonce: pQasCt -.. section: IDLE - -Document that IDLE's shell has no line limit. A program that runs -indefinitely can overfill memory. - -.. - -.. bpo: 23220 -.. date: 2018-11-05-23-23-00 -.. nonce: H3SAWE -.. section: IDLE - -Explain how IDLE's Shell displays output. - -.. - -.. bpo: 35099 -.. date: 2018-11-05-20-43-08 -.. nonce: SVOZXC -.. section: IDLE - -Improve the doc about IDLE running user code. The section is renamed from -"IDLE -- console differences" is renamed "Running user code". It mostly -covers the implications of using custom sys.stdxxx objects. - -.. - -.. bpo: 35097 -.. date: 2018-10-28-20-17-14 -.. nonce: 07tm66 -.. section: IDLE - -Add IDLE doc subsection explaining editor windows. Topics include opening, -title and status bar, .py* extension, and running. - -.. - -.. bpo: 35093 -.. date: 2018-10-28-15-53-51 -.. nonce: cH-tli -.. section: IDLE - -Document the IDLE document viewer in the IDLE doc. Add a paragraph in "Help -and preferences", "Help sources" subsection. - -.. - -.. bpo: 35088 -.. date: 2018-10-28-00-54-32 -.. nonce: r1lJZd -.. section: IDLE - -Update idlelib.help.copy_string docstring. We now use git and backporting -instead of hg and forward merging. - -.. - -.. bpo: 35087 -.. date: 2018-10-28-00-08-42 -.. nonce: G7gx2- -.. section: IDLE - -Update idlelib help files for the current doc build. The main change is the -elimination of chapter-section numbers. - -.. - -.. bpo: 34548 -.. date: 2018-09-22-20-25-07 -.. nonce: 7pBzjg -.. section: IDLE - -Use configured color theme for read-only text views. - -.. - -.. bpo: 1529353 -.. date: 2018-08-13-16-31-24 -.. nonce: wXfQJk -.. section: IDLE - -Enable "squeezing" of long outputs in the shell, to avoid performance -degradation and to clean up the history without losing it. Squeezed outputs -may be copied, viewed in a separate window, and "unsqueezed". - -.. - -.. bpo: 34047 -.. date: 2018-08-05-15-49-55 -.. nonce: LGKsIm -.. section: IDLE - -Fixed mousewheel scrolling direction on macOS. - -.. - -.. bpo: 34275 -.. date: 2018-08-02-22-16-42 -.. nonce: Iu0d7t -.. section: IDLE - -Make IDLE calltips always visible on Mac. Some MacOS-tk combinations need -.update_idletasks(). Patch by Kevin Walzer. - -.. - -.. bpo: 34120 -.. date: 2018-08-01-23-25-38 -.. nonce: HgsIz- -.. section: IDLE - -Fix unresponsiveness after closing certain windows and dialogs. - -.. - -.. bpo: 33975 -.. date: 2018-06-26-22-53-14 -.. nonce: Ow7alv -.. section: IDLE - -Avoid small type when running htests. Since part of the purpose of -human-viewed tests is to determine that widgets look right, it is important -that they look the same for testing as when running IDLE. - -.. - -.. bpo: 33905 -.. date: 2018-06-21-20-35-33 -.. nonce: W2mhiY -.. section: IDLE - -Add test for idlelib.stackview.StackBrowser. - -.. - -.. bpo: 33924 -.. date: 2018-06-20-22-14-07 -.. nonce: 6Rz1wt -.. section: IDLE - -Change mainmenu.menudefs key 'windows' to 'window'. Every other menudef key -is lowercase version of main menu entry. - -.. - -.. bpo: 33906 -.. date: 2018-06-20-19-16-24 -.. nonce: a1lXq0 -.. section: IDLE - -Rename idlelib.windows as window Match Window on the main menu and remove -last plural module name. - -.. - -.. bpo: 33917 -.. date: 2018-06-20-16-27-48 -.. nonce: ZXHs8x -.. section: IDLE - -Fix and document idlelib/idle_test/template.py. The revised file compiles, -runs, and tests OK. idle_test/README.txt explains how to use it to create -new IDLE test files. - -.. - -.. bpo: 33904 -.. date: 2018-06-20-12-40-54 -.. nonce: qm0eCu -.. section: IDLE - -IDLE: In rstrip, rename class RstripExtension as Rstrip - -.. - -.. bpo: 33907 -.. date: 2018-06-19-22-21-27 -.. nonce: z-_B3N -.. section: IDLE - -For consistency and clarity, rename an IDLE module and classes. Module -calltips and its class CallTips are now calltip and Calltip. In module -calltip_w, class CallTip is now CalltipWindow. - -.. - -.. bpo: 33856 -.. date: 2018-06-16-21-54-45 -.. nonce: TH8WHU -.. section: IDLE - -Add "help" in the welcome message of IDLE - -.. - -.. bpo: 33839 -.. date: 2018-06-14-13-23-55 -.. nonce: ZlJzHa -.. section: IDLE - -IDLE: refactor ToolTip and CallTip and add documentation and tests - -.. - -.. bpo: 33855 -.. date: 2018-06-14-11-35-50 -.. nonce: XL230W -.. section: IDLE - -Minimally test all IDLE modules. Add missing files, import module, -instantiate classes, and check coverage. Check existing files. - -.. - -.. bpo: 33656 -.. date: 2018-06-10-17-59-36 -.. nonce: 60ZqJS -.. section: IDLE - -On Windows, add API call saying that tk scales for DPI. On Windows 8.1+ or -10, with DPI compatibility properties of the Python binary unchanged, and a -monitor resolution greater than 96 DPI, this should make text and lines -sharper. It should otherwise have no effect. - -.. - -.. bpo: 33768 -.. date: 2018-06-04-19-23-11 -.. nonce: I_2qpV -.. section: IDLE - -Clicking on a context line moves that line to the top of the editor window. - -.. - -.. bpo: 33763 -.. date: 2018-06-03-20-12-57 -.. nonce: URiFlE -.. section: IDLE - -IDLE: Use read-only text widget for code context instead of label widget. - -.. - -.. bpo: 33664 -.. date: 2018-06-03-09-13-28 -.. nonce: PZzQyL -.. section: IDLE - -Scroll IDLE editor text by lines. Previously, the mouse wheel and scrollbar -slider moved text by a fixed number of pixels, resulting in partial lines at -the top of the editor box. The change also applies to the shell and grep -output windows, but not to read-only text views. - -.. - -.. bpo: 33679 -.. date: 2018-05-29-07-14-37 -.. nonce: MgX_Ui -.. section: IDLE - -Enable theme-specific color configuration for Code Context. Use the -Highlights tab to see the setting for built-in themes or add settings to -custom themes. - -.. - -.. bpo: 33642 -.. date: 2018-05-24-20-42-44 -.. nonce: J0VQbS -.. section: IDLE - -Display up to maxlines non-blank lines for Code Context. If there is no -current context, show a single blank line. - -.. - -.. bpo: 33628 -.. date: 2018-05-23-19-51-07 -.. nonce: sLlFLO -.. section: IDLE - -IDLE: Cleanup codecontext.py and its test. - -.. - -.. bpo: 33564 -.. date: 2018-05-17-19-41-12 -.. nonce: XzHZJe -.. section: IDLE - -IDLE's code context now recognizes async as a block opener. - -.. - -.. bpo: 21474 -.. date: 2018-04-29-16-13-02 -.. nonce: bglg-F -.. section: IDLE - -Update word/identifier definition from ascii to unicode. In text and entry -boxes, this affects selection by double-click, movement left/right by -control-left/right, and deletion left/right by control-BACKSPACE/DEL. - -.. - -.. bpo: 33204 -.. date: 2018-04-02-00-28-13 -.. nonce: NBsuIv -.. section: IDLE - -IDLE: consistently color invalid string prefixes. A 'u' string prefix cannot -be paired with either 'r' or 'f'. Consistently color as much of the prefix, -starting at the right, as is valid. Revise and extend colorizer test. - -.. - -.. bpo: 32984 -.. date: 2018-03-05-01-29-05 -.. nonce: NGjgT4 -.. section: IDLE - -Set ``__file__`` while running a startup file. Like Python, IDLE optionally -runs one startup file in the Shell window before presenting the first -interactive input prompt. For IDLE, ``-s`` runs a file named in -environmental variable :envvar:`IDLESTARTUP` or :envvar:`PYTHONSTARTUP`; -``-r file`` runs ``file``. Python sets ``__file__`` to the startup file -name before running the file and unsets it before the first prompt. IDLE -now does the same when run normally, without the ``-n`` option. - -.. - -.. bpo: 32940 -.. date: 2018-02-24-18-20-50 -.. nonce: ZaJ1Rf -.. section: IDLE - -Simplify and rename StringTranslatePseudoMapping in pyparse. - -.. - -.. bpo: 32916 -.. date: 2018-02-23-07-32-36 -.. nonce: 4MsQ5F -.. section: IDLE - -Change ``str`` to ``code`` in pyparse. - -.. - -.. bpo: 32905 -.. date: 2018-02-22-00-09-27 -.. nonce: VlXj0x -.. section: IDLE - -Remove unused code in pyparse module. - -.. - -.. bpo: 32874 -.. date: 2018-02-19-10-56-41 -.. nonce: 6pZ9Gv -.. section: IDLE - -Add tests for pyparse. - -.. - -.. bpo: 32837 -.. date: 2018-02-12-17-22-48 -.. nonce: -33QPl -.. section: IDLE - -Using the system and place-dependent default encoding for open() is a bad -idea for IDLE's system and location-independent files. - -.. - -.. bpo: 32826 -.. date: 2018-02-12-11-05-22 -.. nonce: IxNZrk -.. section: IDLE - -Add "encoding=utf-8" to open() in IDLE's test_help_about. GUI test -test_file_buttons() only looks at initial ascii-only lines, but failed on -systems where open() defaults to 'ascii' because readline() internally reads -and decodes far enough ahead to encounter a non-ascii character in -CREDITS.txt. - -.. - -.. bpo: 32831 -.. date: 2018-02-12-08-08-45 -.. nonce: srDRvU -.. section: IDLE - -Add docstrings and tests for codecontext. - -.. - -.. bpo: 32765 -.. date: 2018-02-04-17-52-54 -.. nonce: qm0eCu -.. section: IDLE - -Update configdialog General tab docstring to add new widgets to the widget -list. - -.. - -.. bpo: 35884 -.. date: 2019-02-01-12-22-37 -.. nonce: hJkMRD -.. section: Tools/Demos - -Add a benchmark script for timing various ways to access variables: -``Tools/scripts/var_access_benchmark.py``. - -.. - -.. bpo: 34989 -.. date: 2018-10-15-13-22-28 -.. nonce: hU4fra -.. section: Tools/Demos - -python-gdb.py now handles errors on computing the line number of a Python -frame. - -.. - -.. bpo: 20260 -.. date: 2018-07-24-00-11-44 -.. nonce: klmmqI -.. section: Tools/Demos - -Argument Clinic now has non-bitwise unsigned int converters. - -.. - -.. bpo: 32962 -.. date: 2018-06-14-16-23-07 -.. nonce: Q3Dwns -.. section: Tools/Demos - -python-gdb now catches ``UnicodeDecodeError`` exceptions when calling -``string()``. - -.. - -.. bpo: 32962 -.. date: 2018-06-14-16-16-53 -.. nonce: 2YfdwI -.. section: Tools/Demos - -python-gdb now catches ValueError on read_var(): when Python has no debug -symbols for example. - -.. - -.. bpo: 33189 -.. date: 2018-04-03-18-10-00 -.. nonce: QrXR00 -.. section: Tools/Demos - -:program:`pygettext.py` now recognizes only literal strings as docstrings -and translatable strings, and rejects bytes literals and f-string -expressions. - -.. - -.. bpo: 31920 -.. date: 2018-03-26-18-54-24 -.. nonce: u_WKsT -.. section: Tools/Demos - -Fixed handling directories as arguments in the ``pygettext`` script. Based -on patch by Oleg Krasnikov. - -.. - -.. bpo: 29673 -.. date: 2018-03-16-17-25-05 -.. nonce: m8QtaW -.. section: Tools/Demos - -Fix pystackv and pystack gdbinit macros. - -.. - -.. bpo: 25427 -.. date: 2018-03-02-16-23-31 -.. nonce: 1mgMOG -.. section: Tools/Demos - -Remove the pyvenv script in favor of ``python3 -m venv`` in order to lower -confusion as to what Python interpreter a virtual environment will be -created for. - -.. - -.. bpo: 32885 -.. date: 2018-02-20-12-16-47 -.. nonce: dL5x7C -.. section: Tools/Demos - -Add an ``-n`` flag for ``Tools/scripts/pathfix.py`` to disable automatic -backup creation (files with ``~`` suffix). - -.. - -.. bpo: 32222 -.. date: 2017-12-07-20-51-20 -.. nonce: hPBcGT -.. section: Tools/Demos - -Fix pygettext not extracting docstrings for functions with type annotated -arguments. Patch by Toby Harradine. - -.. - -.. bpo: 31583 -.. date: 2017-09-26-10-11-21 -.. nonce: TM90_H -.. section: Tools/Demos - -Fix 2to3 for using with --add-suffix option but without --output-dir option -for relative path to files in current directory. - -.. - -.. bpo: 35713 -.. date: 2019-01-22-17-04-10 -.. nonce: fmehdG -.. section: C API - -The :c:func:`PyByteArray_Init` and :c:func:`PyByteArray_Fini` functions have -been removed. They did nothing since Python 2.7.4 and Python 3.2.0, were -excluded from the limited API (stable ABI), and were not documented. - -.. - -.. bpo: 33817 -.. date: 2019-01-11-11-16-16 -.. nonce: nJ4yIj -.. section: C API - -Fixed :c:func:`_PyBytes_Resize` for empty bytes objects. - -.. - -.. bpo: 35322 -.. date: 2018-11-28-03-20-36 -.. nonce: Qcqsag -.. section: C API - -Fix memory leak in :c:func:`PyUnicode_EncodeLocale` and -:c:func:`PyUnicode_EncodeFSDefault` on error handling. - -.. - -.. bpo: 35059 -.. date: 2018-11-23-11-52-34 -.. nonce: BLSp6y -.. section: C API - -The following C macros have been converted to static inline functions: -:c:func:`Py_INCREF`, :c:func:`Py_DECREF`, :c:func:`Py_XINCREF`, -:c:func:`Py_XDECREF`, :c:func:`PyObject_INIT`, :c:func:`PyObject_INIT_VAR`. - -.. - -.. bpo: 35296 -.. date: 2018-11-22-18-34-23 -.. nonce: nxrIQt -.. section: C API - -``make install`` now also installs the internal API: -``Include/internal/*.h`` header files. - -.. - -.. bpo: 35081 -.. date: 2018-11-22-18-15-46 -.. nonce: FdK9mV -.. section: C API - -Internal APIs surrounded by ``#ifdef Py_BUILD_CORE`` have been moved from -``Include/*.h`` headers to new header files ``Include/internal/pycore_*.h``. - -.. - -.. bpo: 35259 -.. date: 2018-11-22-13-52-36 -.. nonce: p07c61 -.. section: C API - -Conditionally declare :c:func:`Py_FinalizeEx()` (new in 3.6) based on -Py_LIMITED_API. Patch by Arthur Neufeld. - -.. - -.. bpo: 35081 -.. date: 2018-11-13-12-13-04 -.. nonce: gFd85N -.. section: C API - -The :c:func:`_PyObject_GC_TRACK` and :c:func:`_PyObject_GC_UNTRACK` macros -have been removed from the public C API. - -.. - -.. bpo: 35134 -.. date: 2018-11-01-13-58-37 -.. nonce: SbZo0o -.. section: C API - -Creation of a new ``Include/cpython/`` subdirectory. - -.. - -.. bpo: 34725 -.. date: 2018-10-13-16-30-54 -.. nonce: j52rIS -.. section: C API - -Adds _Py_SetProgramFullPath so embedders may override sys.executable - -.. - -.. bpo: 34910 -.. date: 2018-10-05-17-06-49 -.. nonce: tSFrls -.. section: C API - -Ensure that :c:func:`PyObject_Print` always returns ``-1`` on error. Patch -by Zackery Spytz. - -.. - -.. bpo: 34523 -.. date: 2018-08-29-18-48-47 -.. nonce: lLQ8rh -.. section: C API - -Py_DecodeLocale() and Py_EncodeLocale() now use the UTF-8 encoding on -Windows if Py_LegacyWindowsFSEncodingFlag is zero. - -.. - -.. bpo: 34193 -.. date: 2018-07-24-11-57-35 -.. nonce: M6ch1Q -.. section: C API - -Fix pluralization in TypeError messages in getargs.c and typeobject.c: '1 -argument' instead of '1 arguments' and '1 element' instead of '1 elements'. - -.. - -.. bpo: 34127 -.. date: 2018-07-22-14-58-06 -.. nonce: qkfnHO -.. section: C API - -Return grammatically correct error message based on argument count. Patch by -Karthikeyan Singaravelan. - -.. - -.. bpo: 23927 -.. date: 2018-07-09-11-39-54 -.. nonce: pDFkxb -.. section: C API - -Fixed :exc:`SystemError` in :c:func:`PyArg_ParseTupleAndKeywords` when the -``w*`` format unit is used for optional parameter. - -.. - -.. bpo: 32455 -.. date: 2018-07-08-12-06-18 -.. nonce: KVHlkz -.. section: C API - -Added :c:func:`PyCompile_OpcodeStackEffectWithJump`. - -.. - -.. bpo: 34008 -.. date: 2018-07-02-10-58-11 -.. nonce: COewz- -.. section: C API - -Py_Main() can again be called after Py_Initialize(), as in Python 3.6. - -.. - -.. bpo: 32500 -.. date: 2018-06-21-17-19-31 -.. nonce: WGCNad -.. section: C API - -Fixed error messages for :c:func:`PySequence_Size`, -:c:func:`PySequence_GetItem`, :c:func:`PySequence_SetItem` and -:c:func:`PySequence_DelItem` called with a mapping and -:c:func:`PyMapping_Size` called with a sequence. - -.. - -.. bpo: 33818 -.. date: 2018-06-10-09-42-31 -.. nonce: 50nlf3 -.. section: C API - -:c:func:`PyExceptionClass_Name` will now return ``const char *`` instead of -``char *``. - -.. - -.. bpo: 33042 -.. date: 2018-03-20-21-43-09 -.. nonce: FPFp64 -.. section: C API - -Embedding applications may once again call PySys_ResetWarnOptions, -PySys_AddWarnOption, and PySys_AddXOption prior to calling Py_Initialize. - -.. - -.. bpo: 32374 -.. date: 2018-01-09-17-03-54 -.. nonce: SwwLoz -.. section: C API - -Document that m_traverse for multi-phase initialized modules can be called -with m_state=NULL, and add a sanity check - -.. - -.. bpo: 30863 -.. date: 2017-10-12-23-24-27 -.. nonce: xrED19 -.. section: C API - -:c:func:`PyUnicode_AsWideChar` and :c:func:`PyUnicode_AsWideCharString` no -longer cache the ``wchar_t*`` representation of string objects. diff --git a/Misc/NEWS.d/3.8.0a2.rst b/Misc/NEWS.d/3.8.0a2.rst deleted file mode 100644 index 1c0abab4c474ac6c82765fb7ee9ef14db0bf35f6..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.8.0a2.rst +++ /dev/null @@ -1,544 +0,0 @@ -.. bpo: 36052 -.. date: 2019-02-20-17-57-31 -.. nonce: l8lJSi -.. release date: 2019-02-25 -.. section: Core and Builtins - -Raise a :exc:`SyntaxError` when assigning a value to `__debug__` with the -Assignment Operator. Contributed by Stéphane Wirtel and Pablo Galindo. - -.. - -.. bpo: 36012 -.. date: 2019-02-19-10-47-51 -.. nonce: xq7C9E -.. section: Core and Builtins - -Doubled the speed of class variable writes. When a non-dunder attribute was -updated, there was an unnecessary call to update slots. - -.. - -.. bpo: 35942 -.. date: 2019-02-18-09-30-55 -.. nonce: oLhL2v -.. section: Core and Builtins - -The error message emitted when returning invalid types from ``__fspath__`` -in interfaces that allow passing :class:`~os.PathLike` objects has been -improved and now it does explain the origin of the error. - -.. - -.. bpo: 36016 -.. date: 2019-02-17-20-23-54 -.. nonce: 5Hns-f -.. section: Core and Builtins - -``gc.get_objects`` can now receive an optional parameter indicating a -generation to get objects from. Patch by Pablo Galindo. - -.. - -.. bpo: 1054041 -.. date: 2019-02-16-00-42-32 -.. nonce: BL-WLd -.. section: Core and Builtins - -When the main interpreter exits due to an uncaught KeyboardInterrupt, the -process now exits in the appropriate manner for its parent process to detect -that a SIGINT or ^C terminated the process. This allows shells and batch -scripts to understand that the user has asked them to stop. - -.. - -.. bpo: 35992 -.. date: 2019-02-14-12-01-44 -.. nonce: nG9e2L -.. section: Core and Builtins - -Fix ``__class_getitem__()`` not being called on a class with a custom -non-subscriptable metaclass. - -.. - -.. bpo: 35993 -.. date: 2019-02-14-09-17-54 -.. nonce: Bvm3fP -.. section: Core and Builtins - -Fix a crash on fork when using subinterpreters. Contributed by Stéphane -Wirtel - -.. - -.. bpo: 35991 -.. date: 2019-02-14-00-00-30 -.. nonce: xlbfSk -.. section: Core and Builtins - -Fix a potential double free in Modules/_randommodule.c. - -.. - -.. bpo: 35961 -.. date: 2019-02-12-20-16-34 -.. nonce: 7f7Sne -.. section: Core and Builtins - -Fix a crash in slice_richcompare(): use strong references rather than stolen -references for the two temporary internal tuples. - -.. - -.. bpo: 35911 -.. date: 2019-02-06-17-50-59 -.. nonce: oiWE8 -.. section: Core and Builtins - -Enable the creation of cell objects by adding a ``cell.__new__`` method, and -expose the type ``cell`` in ``Lib/types.py`` under the name CellType. Patch -by Pierre Glaser. - -.. - -.. bpo: 12822 -.. date: 2019-02-05-12-48-23 -.. nonce: 0x2NDx -.. section: Core and Builtins - -Use monotonic clock for ``pthread_cond_timedwait`` when -``pthread_condattr_setclock`` and ``CLOCK_MONOTONIC`` are available. - -.. - -.. bpo: 15248 -.. date: 2019-02-04-21-10-17 -.. nonce: 2sXSZZ -.. section: Core and Builtins - -The compiler emits now syntax warnings in the case when a comma is likely -missed before tuple or list. - -.. - -.. bpo: 35886 -.. date: 2019-02-01-18-12-14 -.. nonce: 0Z-C0V -.. section: Core and Builtins - -The implementation of PyInterpreterState has been moved into the internal -header files (guarded by Py_BUILD_CORE). - -.. - -.. bpo: 31506 -.. date: 2019-01-22-02-06-39 -.. nonce: eJ5FpV -.. section: Core and Builtins - -Clarify the errors reported when ``object.__new__`` and ``object.__init__`` -receive more than one argument. Contributed by Sanyam Khurana. - -.. - -.. bpo: 35724 -.. date: 2019-01-11-14-46-08 -.. nonce: Wv79MG -.. section: Core and Builtins - -Signal-handling is now guaranteed to happen relative to the main -interpreter. - -.. - -.. bpo: 33608 -.. date: 2018-09-15-12-13-46 -.. nonce: avmvVP -.. section: Core and Builtins - -We added a new internal _Py_AddPendingCall() that operates relative to the -provided interpreter. This allows us to use the existing implementation to -ask another interpreter to do work that cannot be done in the current -interpreter, like decref an object the other interpreter owns. The existing -Py_AddPendingCall() only operates relative to the main interpreter. - -.. - -.. bpo: 33989 -.. date: 2018-08-08-20-52-55 -.. nonce: TkLBui -.. section: Core and Builtins - -Fix a possible crash in :meth:`list.sort` when sorting objects with -``ob_type->tp_richcompare == NULL``. Patch by Zackery Spytz. - -.. - -.. bpo: 35512 -.. date: 2019-02-24-00-04-10 -.. nonce: eWDjCJ -.. section: Library - -:func:`unittest.mock.patch.dict` used as a decorator with string target -resolves the target during function call instead of during decorator -construction. Patch by Karthikeyan Singaravelan. - -.. - -.. bpo: 36018 -.. date: 2019-02-21-15-47-00 -.. nonce: qt7QUe -.. section: Library - -Add statistics.NormalDist, a tool for creating and manipulating normal -distributions of random variable. Features a composite class that treats -the mean and standard deviation of measurement data as single entity. - -.. - -.. bpo: 35904 -.. date: 2019-02-16-00-55-52 -.. nonce: V88MCD -.. section: Library - -Added statistics.fmean() as a faster, floating point variant of the existing -mean() function. - -.. - -.. bpo: 35918 -.. date: 2019-02-11-16-23-10 -.. nonce: oGDlpT -.. section: Library - -Removed broken ``has_key`` method from -multiprocessing.managers.SyncManager.dict. Contributed by Rémi Lapeyre. - -.. - -.. bpo: 18283 -.. date: 2019-02-11-09-24-08 -.. nonce: BT3Jhc -.. section: Library - -Add support for bytes to :func:`shutil.which`. - -.. - -.. bpo: 35960 -.. date: 2019-02-10-20-57-12 -.. nonce: bh-6Ja -.. section: Library - -Fix :func:`dataclasses.field` throwing away empty mapping objects passed as -metadata. - -.. - -.. bpo: 35500 -.. date: 2019-02-10-00-00-13 -.. nonce: 1HOMmo -.. section: Library - -Write expected and actual call parameters on separate lines in -:meth:`unittest.mock.Mock.assert_called_with` assertion errors. Contributed -by Susan Su. - -.. - -.. bpo: 35931 -.. date: 2019-02-07-16-22-50 -.. nonce: _63i7B -.. section: Library - -The :mod:`pdb` ``debug`` command now gracefully handles syntax errors. - -.. - -.. bpo: 24209 -.. date: 2019-02-06-01-40-55 -.. nonce: awtwPD -.. section: Library - -In http.server script, rely on getaddrinfo to bind to preferred address -based on the bind parameter. Now default bind or binding to a name may bind -to IPv6 or dual-stack, depending on the environment. - -.. - -.. bpo: 35321 -.. date: 2019-02-02-01-53-36 -.. nonce: 1Y4DU4 -.. section: Library - -Set ``__spec__.origin`` of ``_frozen_importlib`` to frozen so that it -matches the behavior of ``_frozen_importlib_external``. Patch by Nina -Zakharenko. - -.. - -.. bpo: 35378 -.. date: 2019-01-21-02-15-20 -.. nonce: 4oF03i -.. section: Library - -Fix a reference issue inside :class:`multiprocessing.Pool` that caused the -pool to remain alive if it was deleted without being closed or terminated -explicitly. A new strong reference is added to the pool iterators to link -the lifetime of the pool to the lifetime of its iterators so the pool does -not get destroyed if a pool iterator is still alive. - -.. - -.. bpo: 34294 -.. date: 2019-01-14-11-53-10 -.. nonce: 3JFdg2 -.. section: Library - -re module, fix wrong capturing groups in rare cases. :func:`re.search`, -:func:`re.findall`, :func:`re.sub` and other functions that scan through -string looking for a match, should reset capturing groups between two match -attempts. Patch by Ma Lin. - -.. - -.. bpo: 35615 -.. date: 2018-12-30-20-00-05 -.. nonce: Uz1SVh -.. section: Library - -:mod:`weakref`: Fix a RuntimeError when copying a WeakKeyDictionary or a -WeakValueDictionary, due to some keys or values disappearing while -iterating. - -.. - -.. bpo: 35606 -.. date: 2018-12-29-21-59-03 -.. nonce: NjGjou -.. section: Library - -Implement :func:`math.prod` as analogous function to :func:`sum` that -returns the product of a 'start' value (default: 1) times an iterable of -numbers. Patch by Pablo Galindo. - -.. - -.. bpo: 32417 -.. date: 2018-12-04-13-35-36 -.. nonce: _Y9SKM -.. section: Library - -Performing arithmetic between :class:`datetime.datetime` subclasses and -:class:`datetime.timedelta` now returns an object of the same type as the -:class:`datetime.datetime` subclass. As a result, -:meth:`datetime.datetime.astimezone` and alternate constructors like -:meth:`datetime.datetime.now` and :meth:`datetime.fromtimestamp` called with -a ``tz`` argument now *also* retain their subclass. - -.. - -.. bpo: 35153 -.. date: 2018-11-03-12-38-03 -.. nonce: 009pdF -.. section: Library - -Add *headers* optional keyword-only parameter to -:class:`xmlrpc.client.ServerProxy`, :class:`xmlrpc.client.Transport` and -:class:`xmlrpc.client.SafeTransport`. Patch by Cédric Krier. - -.. - -.. bpo: 34572 -.. date: 2018-09-05-03-02-32 -.. nonce: ayisd2 -.. section: Library - -Fix C implementation of pickle.loads to use importlib's locking mechanisms, -and thereby avoid using partially-loaded modules. Patch by Tim Burgess. - -.. - -.. bpo: 36083 -.. date: 2019-02-24-12-40-13 -.. nonce: JX7zbv -.. section: Documentation - -Fix formatting of --check-hash-based-pycs options in the manpage Synopsis. - -.. - -.. bpo: 36007 -.. date: 2019-02-15-15-33-41 -.. nonce: OTFrza -.. section: Documentation - -Bump minimum sphinx version to 1.8. Patch by Anthony Sottile. - -.. - -.. bpo: 22062 -.. date: 2018-07-28-12-41-01 -.. nonce: TaN2hn -.. section: Documentation - -Update documentation and docstrings for pathlib. Original patch by Mike -Short. - -.. - -.. bpo: 27313 -.. date: 2019-02-24-01-58-38 -.. nonce: Sj9veH -.. section: Tests - -Avoid test_ttk_guionly ComboboxTest failure with macOS Cocoa Tk. - -.. - -.. bpo: 36019 -.. date: 2019-02-21-14-23-51 -.. nonce: zS_OUi -.. section: Tests - -Add test.support.TEST_HTTP_URL and replace references of -http://www.example.com by this new constant. Contributed by Stéphane Wirtel. - -.. - -.. bpo: 36037 -.. date: 2019-02-19-15-21-14 -.. nonce: 75wG9_ -.. section: Tests - -Fix test_ssl for strict OpenSSL configuration like RHEL8 strict crypto -policy. Use older TLS version for minimum TLS version of the server SSL -context if needed, to test TLS version older than default minimum TLS -version. - -.. - -.. bpo: 35798 -.. date: 2019-02-16-15-19-31 -.. nonce: JF16MP -.. section: Tests - -Added :func:`test.support.check_syntax_warning`. - -.. - -.. bpo: 35505 -.. date: 2019-02-12-01-33-08 -.. nonce: N9ba_K -.. section: Tests - -Make test_imap4_host_default_value independent on whether the local IMAP -server is running. - -.. - -.. bpo: 35917 -.. date: 2019-02-06-18-06-16 -.. nonce: -Clv1L -.. section: Tests - -multiprocessing: provide unit tests for SyncManager and SharedMemoryManager -classes + all the shareable types which are supposed to be supported by -them. (patch by Giampaolo Rodola) - -.. - -.. bpo: 35704 -.. date: 2019-01-10-09-14-58 -.. nonce: FLglYo -.. section: Tests - -Skip ``test_shutil.test_unpack_archive_xztar`` to prevent a MemoryError on -32-bit AIX when MAXDATA setting is less than 0x20000000. - -Patch by Michael Felt (aixtools) - -.. - -.. bpo: 34720 -.. date: 2018-12-26-12-31-16 -.. nonce: T268vz -.. section: Tests - -Assert m_state != NULL to mimic GC traversal functions that do not correctly -handle module creation when the module state has not been created. - -.. - -.. bpo: 35976 -.. date: 2019-02-11-20-07-43 -.. nonce: toap7O -.. section: Windows - -Added ARM build support to Windows build files in PCBuild. - -.. - -.. bpo: 35692 -.. date: 2019-02-02-16-23-57 -.. nonce: cIiiE9 -.. section: Windows - -``pathlib`` no longer raises when checking file and directory existence on -drives that are not ready - -.. - -.. bpo: 35872 -.. date: 2019-02-02-15-57-19 -.. nonce: Bba2n7 -.. section: Windows - -Uses the base Python executable when invoking venv in a virtual environment - -.. - -.. bpo: 35873 -.. date: 2019-02-02-15-56-50 -.. nonce: UW-qS9 -.. section: Windows - -Prevents venv paths being inherited by child processes - -.. - -.. bpo: 35299 -.. date: 2019-02-02-14-47-12 -.. nonce: 1rgEzd -.. section: Windows - -Fix sysconfig detection of the source directory and distutils handling of -pyconfig.h during PGO profiling - -.. - -.. bpo: 24310 -.. date: 2019-02-23-22-31-20 -.. nonce: j_vJQl -.. section: IDLE - -IDLE -- Document settings dialog font tab sample. - -.. - -.. bpo: 35833 -.. date: 2019-02-08-22-14-24 -.. nonce: XKFRvF -.. section: IDLE - -Revise IDLE doc for control codes sent to Shell. Add a code example block. - -.. - -.. bpo: 35689 -.. date: 2019-01-08-17-51-44 -.. nonce: LlaqR8 -.. section: IDLE - -Add docstrings and unittests for colorizer.py. diff --git a/Misc/NEWS.d/3.8.0a3.rst b/Misc/NEWS.d/3.8.0a3.rst deleted file mode 100644 index 66308c6bca2e262a34f17f9ac06d72830c695c40..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.8.0a3.rst +++ /dev/null @@ -1,872 +0,0 @@ -.. bpo: 36216 -.. date: 2019-03-06-09-38-40 -.. nonce: 6q1m4a -.. release date: 2019-03-25 -.. section: Security - -Changes urlsplit() to raise ValueError when the URL contains characters that -decompose under IDNA encoding (NFKC-normalization) into characters that -affect how the URL is parsed. - -.. - -.. bpo: 35121 -.. date: 2018-10-31-15-39-17 -.. nonce: EgHv9k -.. section: Security - -Don't send cookies of domain A without Domain attribute to domain B when -domain A is a suffix match of domain B while using a cookiejar with -:class:`http.cookiejar.DefaultCookiePolicy` policy. Patch by Karthikeyan -Singaravelan. - -.. - -.. bpo: 36421 -.. date: 2019-03-24-21-33-22 -.. nonce: gJ2Pv9 -.. section: Core and Builtins - -Fix a possible double decref in _ctypes.c's ``PyCArrayType_new()``. - -.. - -.. bpo: 36412 -.. date: 2019-03-23-19-51-09 -.. nonce: C7acGn -.. section: Core and Builtins - -Fix a possible crash when creating a new dictionary. - -.. - -.. bpo: 36398 -.. date: 2019-03-21-22-19-38 -.. nonce: B_jXGe -.. section: Core and Builtins - -Fix a possible crash in ``structseq_repr()``. - -.. - -.. bpo: 36256 -.. date: 2019-03-21-00-24-18 -.. nonce: OZHa0t -.. section: Core and Builtins - -Fix bug in parsermodule when parsing a state in a DFA that has two or more -arcs with labels of the same type. Patch by Pablo Galindo. - -.. - -.. bpo: 36365 -.. date: 2019-03-19-15-58-23 -.. nonce: jHaErz -.. section: Core and Builtins - -repr(structseq) is no longer limited to 512 bytes. - -.. - -.. bpo: 36374 -.. date: 2019-03-19-15-46-42 -.. nonce: EWKMZE -.. section: Core and Builtins - -Fix a possible null pointer dereference in ``merge_consts_recursive()``. -Patch by Zackery Spytz. - -.. - -.. bpo: 36236 -.. date: 2019-03-19-03-08-26 -.. nonce: 5qN9qK -.. section: Core and Builtins - -At Python initialization, the current directory is no longer prepended to -:data:`sys.path` if it has been removed. - -.. - -.. bpo: 36352 -.. date: 2019-03-19-02-36-40 -.. nonce: qj2trz -.. section: Core and Builtins - -Python initialization now fails with an error, rather than silently -truncating paths, if a path is too long. - -.. - -.. bpo: 36301 -.. date: 2019-03-19-00-54-31 -.. nonce: xvOCJb -.. section: Core and Builtins - -Python initialization now fails if decoding ``pybuilddir.txt`` configuration -file fails at startup. - -.. - -.. bpo: 36333 -.. date: 2019-03-18-10-56-53 -.. nonce: 4dqemZ -.. section: Core and Builtins - -Fix leak in _PyRuntimeState_Fini. Contributed by Stéphane Wirtel. - -.. - -.. bpo: 36332 -.. date: 2019-03-18-09-27-54 -.. nonce: yEC-Vz -.. section: Core and Builtins - -The builtin :func:`compile` can now handle AST objects that contain -assignment expressions. Patch by Pablo Galindo. - -.. - -.. bpo: 36282 -.. date: 2019-03-13-22-47-28 -.. nonce: zs7RKP -.. section: Core and Builtins - -Improved error message for too much positional arguments in some builtin -functions. - -.. - -.. bpo: 30040 -.. date: 2019-03-11-22-30-56 -.. nonce: W9z8X7 -.. section: Core and Builtins - -New empty dict uses fewer memory for now. It used more memory than empty -dict created by ``dict.clear()``. And empty dict creation and deletion is -about 2x faster. Patch by Inada Naoki. - -.. - -.. bpo: 36262 -.. date: 2019-03-11-15-37-33 -.. nonce: v3N6Fz -.. section: Core and Builtins - -Fix an unlikely memory leak on conversion from string to float in the -function ``_Py_dg_strtod()`` used by ``float(str)``, ``complex(str)``, -:func:`pickle.load`, :func:`marshal.load`, etc. - -.. - -.. bpo: 36252 -.. date: 2019-03-09-15-47-05 -.. nonce: sCQFKq -.. section: Core and Builtins - -Update Unicode databases to version 12.0.0. - -.. - -.. bpo: 36218 -.. date: 2019-03-07-13-05-43 -.. nonce: dZemNt -.. section: Core and Builtins - -Fix a segfault occurring when sorting a list of heterogeneous values. Patch -contributed by Rémi Lapeyre and Elliot Gorokhovsky. - -.. - -.. bpo: 36188 -.. date: 2019-03-04-18-05-31 -.. nonce: EuUZNz -.. section: Core and Builtins - -Cleaned up left-over vestiges of Python 2 unbound method handling in method -objects and documentation. Patch by Martijn Pieters - -.. - -.. bpo: 36124 -.. date: 2019-03-01-13-48-01 -.. nonce: Blzxq1 -.. section: Core and Builtins - -Add a new interpreter-specific dict and expose it in the C-API via -PyInterpreterState_GetDict(). This parallels PyThreadState_GetDict(). -However, extension modules should continue using PyModule_GetState() for -their own internal per-interpreter state. - -.. - -.. bpo: 35975 -.. date: 2019-02-27-16-49-08 -.. nonce: IescLY -.. section: Core and Builtins - -Add a ``feature_version`` flag to ``ast.parse()`` (documented) and -``compile()`` (hidden) that allows tweaking the parser to support older -versions of the grammar. In particular, if ``feature_version`` is 5 or 6, -the hacks for the ``async`` and ``await`` keyword from PEP 492 are -reinstated. (For 7 or higher, these are unconditionally treated as keywords, -but they are still special tokens rather than ``NAME`` tokens that the -parser driver recognizes.) - -.. - -.. bpo: 31904 -.. date: 2019-02-26-17-34-49 -.. nonce: R4KSj6 -.. section: Core and Builtins - -Use UTF-8 as the system encoding on VxWorks. - -.. - -.. bpo: 36048 -.. date: 2019-02-20-08-51-04 -.. nonce: I3LJt9 -.. section: Core and Builtins - -The :meth:`~object.__index__` special method will be used instead of -:meth:`~object.__int__` for implicit conversion of Python numbers to C -integers. Using the ``__int__()`` method in implicit conversions has been -deprecated. - -.. - -.. bpo: 35808 -.. date: 2019-02-11-00-50-03 -.. nonce: M12CMH -.. section: Core and Builtins - -Retire pgen and use a modified version of pgen2 to generate the parser. -Patch by Pablo Galindo. - -.. - -.. bpo: 36401 -.. date: 2019-03-23-10-25-07 -.. nonce: hYpVBS -.. section: Library - -The class documentation created by pydoc now has a separate section for -readonly properties. - -.. - -.. bpo: 36320 -.. date: 2019-03-18-01-08-14 -.. nonce: -06b9_ -.. section: Library - -The typing.NamedTuple() class has deprecated the _field_types attribute in -favor of the __annotations__ attribute which carried the same information. -Also, both attributes were converted from OrderedDict to a regular dict. - -.. - -.. bpo: 34745 -.. date: 2019-03-17-16-43-29 -.. nonce: nOfm7_ -.. section: Library - -Fix :mod:`asyncio` ssl memory issues caused by circular references - -.. - -.. bpo: 36324 -.. date: 2019-03-17-01-17-45 -.. nonce: dvNrRe -.. section: Library - -Add method to statistics.NormalDist for computing the inverse cumulative -normal distribution. - -.. - -.. bpo: 36321 -.. date: 2019-03-16-13-40-59 -.. nonce: s6crQx -.. section: Library - -collections.namedtuple() misspelled the name of an attribute. To be -consistent with typing.NamedTuple, the attribute name should have been -"_field_defaults" instead of "_fields_defaults". For backwards -compatibility, both spellings are now created. The misspelled version may -be removed in the future. - -.. - -.. bpo: 36297 -.. date: 2019-03-15-21-41-22 -.. nonce: Gz9ZfU -.. section: Library - -"unicode_internal" codec is removed. It was deprecated since Python 3.3. -Patch by Inada Naoki. - -.. - -.. bpo: 36298 -.. date: 2019-03-15-13-54-07 -.. nonce: amEVK2 -.. section: Library - -Raise ModuleNotFoundError in pyclbr when a module can't be found. Thanks to -'mental' for the bug report. - -.. - -.. bpo: 36268 -.. date: 2019-03-14-16-25-17 -.. nonce: MDXLw6 -.. section: Library - -Switch the default format used for writing tars with mod:`tarfile` to the -modern POSIX.1-2001 pax standard, from the vendor-specific GNU. Contributed -by C.A.M. Gerlach. - -.. - -.. bpo: 36285 -.. date: 2019-03-14-01-09-59 -.. nonce: G-usj8 -.. section: Library - -Fix integer overflows in the array module. Patch by Stephan Hohe. - -.. - -.. bpo: 31904 -.. date: 2019-03-13-14-55-02 -.. nonce: 834kfY -.. section: Library - -Add _signal module support for VxWorks. - -.. - -.. bpo: 36272 -.. date: 2019-03-13-14-14-36 -.. nonce: f3l2IG -.. section: Library - -:mod:`logging` does not silently ignore RecursionError anymore. Patch -contributed by Rémi Lapeyre. - -.. - -.. bpo: 36280 -.. date: 2019-03-12-21-02-55 -.. nonce: mOd3iH -.. section: Library - -Add a kind field to ast.Constant. It is 'u' if the literal has a 'u' prefix -(i.e. a Python 2 style unicode literal), else None. - -.. - -.. bpo: 35931 -.. date: 2019-03-11-22-06-36 -.. nonce: Qp_Tbe -.. section: Library - -The :mod:`pdb` ``debug`` command now gracefully handles all exceptions. - -.. - -.. bpo: 36251 -.. date: 2019-03-09-18-01-24 -.. nonce: zOp9l0 -.. section: Library - -Fix format strings used for stderrprinter and re.Match reprs. Patch by -Stephan Hohe. - -.. - -.. bpo: 36235 -.. date: 2019-03-08-13-32-21 -.. nonce: _M72wU -.. section: Library - -Fix ``CFLAGS`` in ``customize_compiler()`` of ``distutils.sysconfig``: when -the ``CFLAGS`` environment variable is defined, don't override ``CFLAGS`` -variable with the ``OPT`` variable anymore. Initial patch written by David -Malcolm. - -.. - -.. bpo: 35807 -.. date: 2019-03-06-13-21-33 -.. nonce: W7mmu3 -.. section: Library - -Update ensurepip to install pip 19.0.3 and setuptools 40.8.0. - -.. - -.. bpo: 36139 -.. date: 2019-03-06-13-07-29 -.. nonce: 6kedum -.. section: Library - -Release GIL when closing :class:`~mmap.mmap` objects. - -.. - -.. bpo: 36179 -.. date: 2019-03-04-10-42-46 -.. nonce: jEyuI- -.. section: Library - -Fix two unlikely reference leaks in _hashopenssl. The leaks only occur in -out-of-memory cases. - -.. - -.. bpo: 36169 -.. date: 2019-03-03-11-37-09 -.. nonce: 8nWJy7 -.. section: Library - -Add overlap() method to statistics.NormalDist. Computes the overlapping -coefficient for two normal distributions. - -.. - -.. bpo: 36103 -.. date: 2019-03-01-16-10-01 -.. nonce: n6VgXL -.. section: Library - -Default buffer size used by ``shutil.copyfileobj()`` is changed from 16 KiB -to 64 KiB on non-Windows platform to reduce system call overhead. -Contributed by Inada Naoki. - -.. - -.. bpo: 36130 -.. date: 2019-02-26-22-41-38 -.. nonce: _BnZOo -.. section: Library - -Fix ``pdb`` with ``skip=...`` when stepping into a frame without a -``__name__`` global. Patch by Anthony Sottile. - -.. - -.. bpo: 35652 -.. date: 2019-02-26-11-34-44 -.. nonce: 6KRJu_ -.. section: Library - -shutil.copytree(copy_function=...) erroneously pass DirEntry instead of a -path string. - -.. - -.. bpo: 35178 -.. date: 2019-02-25-23-04-00 -.. nonce: NA_rXa -.. section: Library - -Ensure custom :func:`warnings.formatwarning` function can receive `line` as -positional argument. Based on patch by Tashrif Billah. - -.. - -.. bpo: 36106 -.. date: 2019-02-25-13-21-43 -.. nonce: VuhEiQ -.. section: Library - -Resolve potential name clash with libm's sinpi(). Patch by Dmitrii -Pasechnik. - -.. - -.. bpo: 36091 -.. date: 2019-02-23-06-49-06 -.. nonce: 26o4Lc -.. section: Library - -Clean up reference to async generator in Lib/types. Patch by Henry Chen. - -.. - -.. bpo: 36043 -.. date: 2019-02-19-19-53-46 -.. nonce: l867v0 -.. section: Library - -:class:`FileCookieJar` supports :term:`path-like object`. Contributed by -Stéphane Wirtel - -.. - -.. bpo: 35899 -.. date: 2019-02-16-07-11-02 -.. nonce: cjfn5a -.. section: Library - -Enum has been fixed to correctly handle empty strings and strings with -non-Latin characters (ie. 'α', 'א') without crashing. Original patch -contributed by Maxwell. Assisted by Stéphane Wirtel. - -.. - -.. bpo: 21269 -.. date: 2019-02-10-16-49-16 -.. nonce: Fqi7VH -.. section: Library - -Add ``args`` and ``kwargs`` properties to mock call objects. Contributed by -Kumar Akshay. - -.. - -.. bpo: 30670 -.. date: 2019-02-06-12-07-46 -.. nonce: yffB3F -.. section: Library - -`pprint.pp` has been added to pretty-print objects with dictionary keys -being sorted with their insertion order by default. Parameter *sort_dicts* -has been added to `pprint.pprint`, `pprint.pformat` and -`pprint.PrettyPrinter`. Contributed by Rémi Lapeyre. - -.. - -.. bpo: 35843 -.. date: 2019-01-28-10-19-40 -.. nonce: 7rXGQE -.. section: Library - -Implement ``__getitem__`` for ``_NamespacePath``. Patch by Anthony Sottile. - -.. - -.. bpo: 35802 -.. date: 2019-01-21-13-56-55 -.. nonce: 6633PE -.. section: Library - -Clean up code which checked presence of ``os.stat`` / ``os.lstat`` / -``os.chmod`` which are always present. Patch by Anthony Sottile. - -.. - -.. bpo: 35715 -.. date: 2019-01-11-08-47-58 -.. nonce: Wi3gl0 -.. section: Library - -Librates the return value of a ProcessPoolExecutor _process_worker after -it's no longer needed to free memory - -.. - -.. bpo: 35493 -.. date: 2019-01-09-23-43-08 -.. nonce: kEcRGE -.. section: Library - -Use :func:`multiprocessing.connection.wait` instead of polling each 0.2 -seconds for worker updates in :class:`multiprocessing.Pool`. Patch by Pablo -Galindo. - -.. - -.. bpo: 35661 -.. date: 2019-01-05-16-16-20 -.. nonce: H_UOXc -.. section: Library - -Store the venv prompt in pyvenv.cfg. - -.. - -.. bpo: 35121 -.. date: 2018-12-30-14-35-19 -.. nonce: oWmiGU -.. section: Library - -Don't set cookie for a request when the request path is a prefix match of -the cookie's path attribute but doesn't end with "/". Patch by Karthikeyan -Singaravelan. - -.. - -.. bpo: 21478 -.. date: 2018-12-21-09-54-30 -.. nonce: 5gsXtc -.. section: Library - -Calls to a child function created with :func:`unittest.mock.create_autospec` -should propagate to the parent. Patch by Karthikeyan Singaravelan. - -.. - -.. bpo: 35198 -.. date: 2018-11-09-12-45-28 -.. nonce: EJ8keW -.. section: Library - -Fix C++ extension compilation on AIX - -.. - -.. bpo: 36329 -.. date: 2019-03-17-20-01-41 -.. nonce: L5dJPD -.. section: Documentation - -Declare the path of the Python binary for the usage of -``Tools/scripts/serve.py`` when executing ``make -C Doc/ serve``. -Contributed by Stéphane Wirtel - -.. - -.. bpo: 36138 -.. date: 2019-03-02-00-40-57 -.. nonce: yfjNzG -.. section: Documentation - -Improve documentation about converting datetime.timedelta to scalars. - -.. - -.. bpo: 21314 -.. date: 2018-11-21-23-01-37 -.. nonce: PG33VT -.. section: Documentation - -A new entry was added to the Core Language Section of the Programming FAQ, -which explaines the usage of slash(/) in the signature of a function. Patch -by Lysandros Nikolaou - -.. - -.. bpo: 36234 -.. date: 2019-03-08-12-53-37 -.. nonce: NRVK6W -.. section: Tests - -test_posix.PosixUidGidTests: add tests for invalid uid/gid type (str). -Initial patch written by David Malcolm. - -.. - -.. bpo: 29571 -.. date: 2019-02-28-18-33-29 -.. nonce: r6b9fr -.. section: Tests - -Fix ``test_re.test_locale_flag()``: use ``locale.getpreferredencoding()`` -rather than ``locale.getlocale()`` to get the locale encoding. With some -locales, ``locale.getlocale()`` returns the wrong encoding. - -.. - -.. bpo: 36123 -.. date: 2019-02-26-12-51-35 -.. nonce: QRhhRS -.. section: Tests - -Fix race condition in test_socket. - -.. - -.. bpo: 36356 -.. date: 2019-03-18-23-49-15 -.. nonce: WNrwYI -.. section: Build - -Fix leaks that led to build failure when configured with address sanitizer. - -.. - -.. bpo: 36146 -.. date: 2019-03-01-17-49-22 -.. nonce: VeoyG7 -.. section: Build - -Add ``TEST_EXTENSIONS`` constant to ``setup.py`` to allow to not build test -extensions like ``_testcapi``. - -.. - -.. bpo: 36146 -.. date: 2019-02-28-18-09-01 -.. nonce: IwPJVT -.. section: Build - -Fix setup.py on macOS: only add ``/usr/include/ffi`` to include directories -of _ctypes, not for all extensions. - -.. - -.. bpo: 31904 -.. date: 2019-02-21-14-48-31 -.. nonce: J82jY2 -.. section: Build - -Enable build system to cross-build for VxWorks RTOS. - -.. - -.. bpo: 36312 -.. date: 2019-03-16-16-51-17 -.. nonce: Niwm-T -.. section: Windows - -Fixed decoders for the following code pages: 50220, 50221, 50222, 50225, -50227, 50229, 57002 through 57011, 65000 and 42. - -.. - -.. bpo: 36264 -.. date: 2019-03-11-09-33-47 -.. nonce: rTzWce -.. section: Windows - -Don't honor POSIX ``HOME`` in ``os.path.expanduser`` on windows. Patch by -Anthony Sottile. - -.. - -.. bpo: 24643 -.. date: 2019-02-24-07-52-39 -.. nonce: PofyiS -.. section: Windows - -Fix name collisions due to ``#define timezone _timezone`` in PC/pyconfig.h. - -.. - -.. bpo: 36405 -.. date: 2019-03-23-01-45-56 -.. nonce: m7Wv1F -.. section: IDLE - -Use dict unpacking in idlelib. - -.. - -.. bpo: 36396 -.. date: 2019-03-21-22-43-21 -.. nonce: xSTX-I -.. section: IDLE - -Remove fgBg param of idlelib.config.GetHighlight(). This param was only used -twice and changed the return type. - -.. - -.. bpo: 36176 -.. date: 2019-03-10-00-07-46 -.. nonce: jk_vv6 -.. section: IDLE - -Fix IDLE autocomplete & calltip popup colors. Prevent conflicts with Linux -dark themes (and slightly darken calltip background). - -.. - -.. bpo: 23205 -.. date: 2019-03-06-14-47-57 -.. nonce: Vv0gfH -.. section: IDLE - -For the grep module, add tests for findfiles, refactor findfiles to be a -module-level function, and refactor findfiles to use os.walk. - -.. - -.. bpo: 23216 -.. date: 2019-03-02-19-39-53 -.. nonce: ZA7H8H -.. section: IDLE - -Add docstrings to IDLE search modules. - -.. - -.. bpo: 36152 -.. date: 2019-02-28-18-52-40 -.. nonce: 9pkHIU -.. section: IDLE - -Remove colorizer.ColorDelegator.close_when_done and the corresponding -argument of .close(). In IDLE, both have always been None or False since -2007. - -.. - -.. bpo: 32129 -.. date: 2019-02-25-11-40-14 -.. nonce: 4qVCzD -.. section: IDLE - -Avoid blurry IDLE application icon on macOS with Tk 8.6. Patch by Kevin -Walzer. - -.. - -.. bpo: 36096 -.. date: 2019-02-23-17-53-53 -.. nonce: mN5Ly3 -.. section: IDLE - -Refactor class variables to instance variables in colorizer. - -.. - -.. bpo: 30348 -.. date: 2018-06-27-21-18-41 -.. nonce: WbaRJW -.. section: IDLE - -Increase test coverage of idlelib.autocomplete by 30%. Patch by Louie -Lu - -.. - -.. bpo: 35132 -.. date: 2019-03-04-02-09-09 -.. nonce: 1R_pnL -.. section: Tools/Demos - -Fix py-list and py-bt commands of python-gdb.py on gdb7. - -.. - -.. bpo: 32217 -.. date: 2017-12-19-20-42-36 -.. nonce: axXcjA -.. section: Tools/Demos - -Fix freeze script on Windows. - -.. - -.. bpo: 36381 -.. date: 2019-03-20-22-02-40 -.. nonce: xlzDJ2 -.. section: C API - -Raise ``DeprecationWarning`` when '#' formats are used for building or -parsing values without ``PY_SSIZE_T_CLEAN``. - -.. - -.. bpo: 36142 -.. date: 2019-03-01-03-23-48 -.. nonce: 7F6wJd -.. section: C API - -The whole coreconfig.h header is now excluded from Py_LIMITED_API. Move -functions definitions into a new internal pycore_coreconfig.h header. diff --git a/Misc/NEWS.d/3.8.0a4.rst b/Misc/NEWS.d/3.8.0a4.rst deleted file mode 100644 index 995aa94a7405e474e61748f50cb80bdc65c6bcdb..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.8.0a4.rst +++ /dev/null @@ -1,1411 +0,0 @@ -.. bpo: 36742 -.. date: 2019-04-29-15-34-59 -.. nonce: QCUY0i -.. release date: 2019-05-06 -.. section: Security - -Fixes mishandling of pre-normalization characters in urlsplit(). - -.. - -.. bpo: 30458 -.. date: 2019-04-10-08-53-30 -.. nonce: 51E-DA -.. section: Security - -Address CVE-2019-9740 by disallowing URL paths with embedded whitespace or -control characters through into the underlying http client request. Such -potentially malicious header injection URLs now cause an -http.client.InvalidURL exception to be raised. - -.. - -.. bpo: 35755 -.. date: 2019-01-17-10-03-48 -.. nonce: GmllIs -.. section: Security - -:func:`shutil.which` now uses ``os.confstr("CS_PATH")`` if available and if -the :envvar:`PATH` environment variable is not set. Remove also the current -directory from :data:`posixpath.defpath`. On Unix, :func:`shutil.which` and -the :mod:`subprocess` module no longer search the executable in the current -directory if the :envvar:`PATH` environment variable is not set. - -.. - -.. bpo: 36722 -.. date: 2019-04-25-21-02-40 -.. nonce: 8NApVM -.. section: Core and Builtins - -In debug build, import now also looks for C extensions compiled in release -mode and for C extensions compiled in the stable ABI. - -.. - -.. bpo: 32849 -.. date: 2019-04-16-11-56-12 -.. nonce: aeSg-D -.. section: Core and Builtins - -Fix Python Initialization code on FreeBSD to detect properly when stdin file -descriptor (fd 0) is invalid. - -.. - -.. bpo: 36623 -.. date: 2019-04-13-02-08-44 -.. nonce: HR_xhB -.. section: Core and Builtins - -Remove parser headers and related function declarations that lack -implementations after the removal of pgen. - -.. - -.. bpo: 20180 -.. date: 2019-04-12-15-49-15 -.. nonce: KUqVk7 -.. section: Core and Builtins - -``dict.pop()`` is now up to 33% faster thanks to Argument Clinic. Patch by -Inada Naoki. - -.. - -.. bpo: 36611 -.. date: 2019-04-12-12-32-39 -.. nonce: zbo9WQ -.. section: Core and Builtins - -Debug memory allocators: disable serialno field by default from debug hooks -on Python memory allocators to reduce the memory footprint by 5%. Enable -:mod:`tracemalloc` to get the traceback where a memory block has been -allocated when a fatal memory error is logged to decide where to put a -breakpoint. Compile Python with ``PYMEM_DEBUG_SERIALNO`` defined to get back -the field. - -.. - -.. bpo: 36588 -.. date: 2019-04-11-14-36-55 -.. nonce: wejLoC -.. section: Core and Builtins - -On AIX, :attr:`sys.platform` doesn't contain the major version anymore. -Always return ``'aix'``, instead of ``'aix3'`` .. ``'aix7'``. Since older -Python versions include the version number, it is recommended to always use -``sys.platform.startswith('aix')``. Contributed by M. Felt. - -.. - -.. bpo: 36549 -.. date: 2019-04-11-12-41-31 -.. nonce: QSp8of -.. section: Core and Builtins - -Change str.capitalize to use titlecase for the first character instead of -uppercase. - -.. - -.. bpo: 36540 -.. date: 2019-04-06-20-59-19 -.. nonce: SzVUfC -.. section: Core and Builtins - -Implement :pep:`570` (Python positional-only parameters). Patch by Pablo -Galindo. - -.. - -.. bpo: 36475 -.. date: 2019-04-02-20-02-22 -.. nonce: CjRps3 -.. section: Core and Builtins - -:c:func:`PyEval_AcquireLock` and :c:func:`PyEval_AcquireThread` now -terminate the current thread if called while the interpreter is finalizing, -making them consistent with :c:func:`PyEval_RestoreThread`, -:c:func:`Py_END_ALLOW_THREADS`, and :c:func:`PyGILState_Ensure`. - -.. - -.. bpo: 36504 -.. date: 2019-04-02-04-10-32 -.. nonce: k_V8Bm -.. section: Core and Builtins - -Fix signed integer overflow in _ctypes.c's ``PyCArrayType_new()``. - -.. - -.. bpo: 20844 -.. date: 2019-03-29-18-47-50 -.. nonce: ge-7SM -.. section: Core and Builtins - -Fix running script with encoding cookie and LF line ending may fail on -Windows. - -.. - -.. bpo: 24214 -.. date: 2019-03-28-15-22-45 -.. nonce: tZ6lYU -.. section: Core and Builtins - -Fixed support of the surrogatepass error handler in the UTF-8 incremental -decoder. - -.. - -.. bpo: 36452 -.. date: 2019-03-27-23-53-00 -.. nonce: xhK2lT -.. section: Core and Builtins - -Changing ``dict`` keys during iteration of the dict itself, ``keys()``, -``values()``, or ``items()`` will now be detected in certain corner cases -where keys are deleted/added so that the number of keys isn't changed. A -`RuntimeError` will be raised after ``len(dict)`` iterations. Contributed by -Thomas Perl. - -.. - -.. bpo: 36459 -.. date: 2019-03-27-22-35-16 -.. nonce: UAvkKp -.. section: Core and Builtins - -Fix a possible double ``PyMem_FREE()`` due to tokenizer.c's ``tok_nextc()``. - -.. - -.. bpo: 36433 -.. date: 2019-03-26-17-23-02 -.. nonce: -8XzZf -.. section: Core and Builtins - -Fixed TypeError message in classmethoddescr_call. - -.. - -.. bpo: 36430 -.. date: 2019-03-25-23-37-26 -.. nonce: sd9xxQ -.. section: Core and Builtins - -Fix a possible reference leak in :func:`itertools.count`. - -.. - -.. bpo: 36440 -.. date: 2019-03-25-13-45-19 -.. nonce: gkvzhi -.. section: Core and Builtins - -Include node names in ``ParserError`` messages, instead of numeric IDs. -Patch by A. Skrobov. - -.. - -.. bpo: 36143 -.. date: 2019-03-20-00-37-24 -.. nonce: fnKoKo -.. section: Core and Builtins - -Regenerate :mod:`keyword` from the Grammar and Tokens file using pgen. Patch -by Pablo Galindo. - -.. - -.. bpo: 18372 -.. date: 2018-12-08-03-40-43 -.. nonce: DT1nR0 -.. section: Core and Builtins - -Add missing :c:func:`PyObject_GC_Track` calls in the :mod:`pickle` module. -Patch by Zackery Spytz. - -.. - -.. bpo: 35952 -.. date: 2019-04-29-11-47-06 -.. nonce: 3uNuyo -.. section: Library - -Fix pythoninfo when the compiler is missing. - -.. - -.. bpo: 28238 -.. date: 2019-04-28-15-01-29 -.. nonce: gdk38f -.. section: Library - -The ``.find*()`` methods of xml.etree.ElementTree can now search for -wildcards like ``{*}tag`` and ``{ns}*`` that match a tag in any namespace or -all tags in a namespace. Patch by Stefan Behnel. - -.. - -.. bpo: 26978 -.. date: 2019-04-28-01-52-39 -.. nonce: Lpm-SI -.. section: Library - -`pathlib.path.link_to()` is now implemented. It creates a hard link pointing -to a path. - -.. - -.. bpo: 1613500 -.. date: 2019-04-27-21-09-33 -.. nonce: Ogp4P0 -.. section: Library - -:class:`fileinput.FileInput` now uses the input file mode to correctly set -the output file mode (previously it was hardcoded to ``'w'``) when -``inplace=True`` is passed to its constructor. - -.. - -.. bpo: 36734 -.. date: 2019-04-26-17-14-20 -.. nonce: p2MaiN -.. section: Library - -Fix compilation of ``faulthandler.c`` on HP-UX. Initialize ``stack_t -current_stack`` to zero using ``memset()``. - -.. - -.. bpo: 13611 -.. date: 2019-04-26-10-10-34 -.. nonce: XEF4bg -.. section: Library - -The xml.etree.ElementTree packages gained support for C14N 2.0 -serialisation. Patch by Stefan Behnel. - -.. - -.. bpo: 36669 -.. date: 2019-04-24-17-08-45 -.. nonce: X4g0fu -.. section: Library - -Add missing matrix multiplication operator support to weakref.proxy. - -.. - -.. bpo: 36676 -.. date: 2019-04-20-13-10-34 -.. nonce: XF4Egb -.. section: Library - -The XMLParser() in xml.etree.ElementTree provides namespace prefix context -to the parser target if it defines the callback methods "start_ns()" and/or -"end_ns()". Patch by Stefan Behnel. - -.. - -.. bpo: 36673 -.. date: 2019-04-20-09-50-32 -.. nonce: XF4Egb -.. section: Library - -The TreeBuilder and XMLPullParser in xml.etree.ElementTree gained support -for parsing comments and processing instructions. Patch by Stefan Behnel. - -.. - -.. bpo: 36650 -.. date: 2019-04-19-15-29-55 -.. nonce: _EVdrz -.. section: Library - -The C version of functools.lru_cache() was treating calls with an empty -``**kwargs`` dictionary as being distinct from calls with no keywords at -all. This did not result in an incorrect answer, but it did trigger an -unexpected cache miss. - -.. - -.. bpo: 28552 -.. date: 2019-04-18-16-10-29 -.. nonce: MW1TLt -.. section: Library - -Fix :mod:`distutils.sysconfig` if :data:`sys.executable` is ``None`` or an -empty string: use :func:`os.getcwd` to initialize ``project_base``. Fix -also the distutils build command: don't use :data:`sys.executable` if it is -``None`` or an empty string. - -.. - -.. bpo: 35755 -.. date: 2019-04-16-17-50-39 -.. nonce: Fg4EXb -.. section: Library - -:func:`shutil.which` and :func:`distutils.spawn.find_executable` now use -``os.confstr("CS_PATH")`` if available instead of :data:`os.defpath`, if the -``PATH`` environment variable is not set. Moreover, don't use -``os.confstr("CS_PATH")`` nor :data:`os.defpath` if the ``PATH`` environment -variable is set to an empty string. - -.. - -.. bpo: 25430 -.. date: 2019-04-15-12-22-09 -.. nonce: 7_8kqc -.. section: Library - -improve performance of ``IPNetwork.__contains__()`` - -.. - -.. bpo: 30485 -.. date: 2019-04-13-23-42-33 -.. nonce: JHhjJS -.. section: Library - -Path expressions in xml.etree.ElementTree can now avoid explicit namespace -prefixes for tags (or the "{namespace}tag" notation) by passing a default -namespace with an empty string prefix. - -.. - -.. bpo: 36613 -.. date: 2019-04-12-13-52-15 -.. nonce: hqT1qn -.. section: Library - -Fix :mod:`asyncio` wait() not removing callback if exception - -.. - -.. bpo: 36598 -.. date: 2019-04-11-22-11-24 -.. nonce: hfzDUl -.. section: Library - -Fix ``isinstance`` check for Mock objects with spec when the code is -executed under tracing. Patch by Karthikeyan Singaravelan. - -.. - -.. bpo: 18748 -.. date: 2019-04-11-16-09-42 -.. nonce: QW7upB -.. section: Library - -In development mode (:option:`-X` ``dev``) and in debug build, the -:class:`io.IOBase` destructor now logs ``close()`` exceptions. These -exceptions are silent by default in release mode. - -.. - -.. bpo: 36575 -.. date: 2019-04-09-22-40-52 -.. nonce: Vg_p92 -.. section: Library - -The ``_lsprof`` module now uses internal timer same to -``time.perf_counter()`` by default. ``gettimeofday(2)`` was used on Unix. -New timer has better resolution on most Unix platforms and timings are no -longer impacted by system clock updates since ``perf_counter()`` is -monotonic. Patch by Inada Naoki. - -.. - -.. bpo: 33461 -.. date: 2019-04-09-14-46-28 -.. nonce: SYJM-E -.. section: Library - -``json.loads`` now emits ``DeprecationWarning`` when ``encoding`` option is -specified. Patch by Matthias Bussonnier. - -.. - -.. bpo: 36559 -.. date: 2019-04-09-12-02-35 -.. nonce: LbDRrw -.. section: Library - -The random module now prefers the lean internal _sha512 module over hashlib -for seed(version=2) to optimize import time. - -.. - -.. bpo: 17561 -.. date: 2019-04-09-04-08-46 -.. nonce: hOhVnh -.. section: Library - -Set backlog=None as the default for socket.create_server. - -.. - -.. bpo: 34373 -.. date: 2019-04-08-14-41-22 -.. nonce: lEAl_- -.. section: Library - -Fix :func:`time.mktime` error handling on AIX for year before 1970. - -.. - -.. bpo: 36232 -.. date: 2019-04-06-20-25-25 -.. nonce: SClmhb -.. section: Library - -Improve error message when trying to open existing DBM database that -actually doesn't exist. Patch by Marco Rougeth. - -.. - -.. bpo: 36546 -.. date: 2019-04-06-14-23-00 -.. nonce: YXjbyY -.. section: Library - -Add statistics.quantiles() - -.. - -.. bpo: 36050 -.. date: 2019-04-05-21-29-53 -.. nonce: x9DRKE -.. section: Library - -Optimized ``http.client.HTTPResponse.read()`` for large response. Patch by -Inada Naoki. - -.. - -.. bpo: 36522 -.. date: 2019-04-03-20-46-47 -.. nonce: g5x3By -.. section: Library - -If *debuglevel* is set to >0 in :mod:`http.client`, print all values for -headers with multiple values for the same header name. Patch by Matt -Houglum. - -.. - -.. bpo: 36492 -.. date: 2019-03-31-10-21-54 -.. nonce: f7vyUs -.. section: Library - -Deprecated passing required arguments like *func* as keyword arguments in -functions which should accept arbitrary keyword arguments and pass them to -other function. Arbitrary keyword arguments (even with names "self" and -"func") can now be passed to these functions if the required arguments are -passed as positional arguments. - -.. - -.. bpo: 27181 -.. date: 2019-03-31-01-18-52 -.. nonce: LVUWcc -.. section: Library - -Add statistics.geometric_mean(). - -.. - -.. bpo: 30427 -.. date: 2019-03-28-21-17-08 -.. nonce: lxzvbw -.. section: Library - -``os.path.normcase()`` relies on ``os.fspath()`` to check the type of its -argument. Redundant checks have been removed from its -``posixpath.normcase()`` and ``ntpath.normcase()`` implementations. Patch by -Wolfgang Maier. - -.. - -.. bpo: 36385 -.. date: 2019-03-27-02-09-22 -.. nonce: we2F45 -.. section: Library - -Stop rejecting IPv4 octets for being ambiguously octal. Leading zeros are -ignored, and no longer are assumed to specify octal octets. Octets are -always decimal numbers. Octets must still be no more than three digits, -including leading zeroes. - -.. - -.. bpo: 36434 -.. date: 2019-03-26-14-20-59 -.. nonce: PTdidw -.. section: Library - -Errors during writing to a ZIP file no longer prevent to properly close it. - -.. - -.. bpo: 36407 -.. date: 2019-03-23-17-16-15 -.. nonce: LG3aC4 -.. section: Library - -Fixed wrong indentation writing for CDATA section in xml.dom.minidom. Patch -by Vladimir Surjaninov. - -.. - -.. bpo: 36326 -.. date: 2019-03-22-13-47-52 -.. nonce: WCnEI5 -.. section: Library - -inspect.getdoc() can now find docstrings for member objects when __slots__ -is a dictionary. - -.. - -.. bpo: 36366 -.. date: 2019-03-20-15-13-18 -.. nonce: n0eav_ -.. section: Library - -Calling ``stop()`` on an unstarted or stopped :func:`unittest.mock.patch` -object will now return `None` instead of raising :exc:`RuntimeError`, making -the method idempotent. Patch by Karthikeyan Singaravelan. - -.. - -.. bpo: 36348 -.. date: 2019-03-18-16-16-55 -.. nonce: E0w_US -.. section: Library - -The :meth:`imap.IMAP4.logout` method no longer ignores silently arbitrary -exceptions. - -.. - -.. bpo: 31904 -.. date: 2019-03-13-16-48-42 -.. nonce: 9sjd38 -.. section: Library - -Add time module support and fix test_time faiures for VxWorks. - -.. - -.. bpo: 36227 -.. date: 2019-03-07-20-02-18 -.. nonce: i2Z1XR -.. section: Library - -Added support for keyword arguments `default_namespace` and -`xml_declaration` in functions ElementTree.tostring() and -ElementTree.tostringlist(). - -.. - -.. bpo: 36004 -.. date: 2019-02-17-12-55-51 -.. nonce: hCt_KK -.. section: Library - -Added new alternate constructors :meth:`datetime.date.fromisocalendar` and -:meth:`datetime.datetime.fromisocalendar`, which construct date objects from -ISO year, week number and weekday; these are the inverse of each class's -``isocalendar`` method. Patch by Paul Ganssle. - -.. - -.. bpo: 35936 -.. date: 2019-02-16-22-19-32 -.. nonce: Ay5WtD -.. section: Library - -:mod:`modulefinder` no longer depends on the deprecated :mod:`imp` module, -and the initializer for :class:`modulefinder.ModuleFinder` now has immutable -default arguments. Patch by Brandt Bucher. - -.. - -.. bpo: 35376 -.. date: 2019-02-13-18-56-27 -.. nonce: UFhYLj -.. section: Library - -:mod:`modulefinder` correctly handles modules that have the same name as a -bad package. Patch by Brandt Bucher. - -.. - -.. bpo: 17396 -.. date: 2019-02-13-18-56-22 -.. nonce: oKRkrD -.. section: Library - -:mod:`modulefinder` no longer crashes when encountering syntax errors in -followed imports. Patch by Brandt Bucher. - -.. - -.. bpo: 35934 -.. date: 2019-02-07-20-25-39 -.. nonce: QmfNmY -.. section: Library - -Added :meth:`~socket.create_server()` and -:meth:`~socket.has_dualstack_ipv6()` convenience functions to automate the -necessary tasks usually involved when creating a server socket, including -accepting both IPv4 and IPv6 connections on the same socket. (Contributed -by Giampaolo Rodola in :issue:`17561`.) - -.. - -.. bpo: 23078 -.. date: 2019-01-18-23-10-10 -.. nonce: l4dFoj -.. section: Library - -Add support for :func:`classmethod` and :func:`staticmethod` to -:func:`unittest.mock.create_autospec`. Initial patch by Felipe Ochoa. - -.. - -.. bpo: 35416 -.. date: 2018-12-05-09-55-05 -.. nonce: XALKZG -.. section: Library - -Fix potential resource warnings in distutils. Patch by Mickaël Schoentgen. - -.. - -.. bpo: 25451 -.. date: 2018-11-07-23-44-25 -.. nonce: re_8db -.. section: Library - -Add transparency methods to :class:`tkinter.PhotoImage`. Patch by Zackery -Spytz. - -.. - -.. bpo: 35082 -.. date: 2018-10-27-11-54-12 -.. nonce: HDj1nr -.. section: Library - -Don't return deleted attributes when calling dir on a -:class:`unittest.mock.Mock`. - -.. - -.. bpo: 34547 -.. date: 2018-10-05-16-01-00 -.. nonce: abbaa -.. section: Library - -:class:`wsgiref.handlers.BaseHandler` now handles abrupt client connection -terminations gracefully. Patch by Petter Strandmark. - -.. - -.. bpo: 31658 -.. date: 2018-07-30-12-00-15 -.. nonce: _bx7a_ -.. section: Library - -:func:`xml.sax.parse` now supports :term:`path-like `. -Patch by Mickaël Schoentgen. - -.. - -.. bpo: 34139 -.. date: 2018-07-18-11-25-34 -.. nonce: tKbmW7 -.. section: Library - -Remove stale unix datagram socket before binding - -.. - -.. bpo: 33530 -.. date: 2018-05-29-18-34-53 -.. nonce: _4Q_bi -.. section: Library - -Implemented Happy Eyeballs in `asyncio.create_connection()`. Added two new -arguments, *happy_eyeballs_delay* and *interleave*, to specify Happy -Eyeballs behavior. - -.. - -.. bpo: 33291 -.. date: 2018-04-11-11-41-52 -.. nonce: -xLGf8 -.. section: Library - -Do not raise AttributeError when calling the inspect functions -isgeneratorfunction, iscoroutinefunction, isasyncgenfunction on a method -created from an arbitrary callable. Instead, return False. - -.. - -.. bpo: 31310 -.. date: 2018-04-06-11-06-23 -.. nonce: eq9ky0 -.. section: Library - -Fix the multiprocessing.semaphore_tracker so it is reused by child processes - -.. - -.. bpo: 31292 -.. date: 2017-08-30-20-27-00 -.. nonce: dKIaZb -.. section: Library - -Fix ``setup.py check --restructuredtext`` for files containing ``include`` -directives. - -.. - -.. bpo: 36625 -.. date: 2019-04-15-12-02-45 -.. nonce: x3LMCF -.. section: Documentation - -Remove obsolete comments from docstrings in fractions.Fraction - -.. - -.. bpo: 30840 -.. date: 2019-04-14-19-46-21 -.. nonce: R-JFzw -.. section: Documentation - -Document relative imports - -.. - -.. bpo: 36523 -.. date: 2019-04-04-19-11-47 -.. nonce: sG1Tr4 -.. section: Documentation - -Add docstring for io.IOBase.writelines(). - -.. - -.. bpo: 36425 -.. date: 2019-03-27-22-46-00 -.. nonce: kG9gx1 -.. section: Documentation - -New documentation translation: `Simplified Chinese -`_. - -.. - -.. bpo: 36345 -.. date: 2019-03-26-14-58-34 -.. nonce: r2stx3 -.. section: Documentation - -Avoid the duplication of code from ``Tools/scripts/serve.py`` in using the -:rst:dir:`literalinclude` directive for the basic wsgiref-based web server -in the documentation of :mod:`wsgiref`. Contributed by Stéphane Wirtel. - -.. - -.. bpo: 36345 -.. date: 2019-03-23-09-25-12 -.. nonce: L704Zv -.. section: Documentation - -Using the code of the ``Tools/scripts/serve.py`` script as an example in the -:mod:`wsgiref` documentation. Contributed by Stéphane Wirtel. - -.. - -.. bpo: 36157 -.. date: 2019-03-08-15-39-47 -.. nonce: nF1pP1 -.. section: Documentation - -Added Documention for PyInterpreterState_Main(). - -.. - -.. bpo: 33043 -.. date: 2019-02-24-03-15-10 -.. nonce: 8knWTS -.. section: Documentation - -Updates the docs.python.org page with the addition of a 'Contributing to -Docs' link at the end of the page (between 'Reporting Bugs' and 'About -Documentation'). Updates the 'Found a Bug' page with additional links and -information in the Documentation Bugs section. - -.. - -.. bpo: 35581 -.. date: 2018-12-25-12-56-57 -.. nonce: aA7r6T -.. section: Documentation - -@typing.type_check_only now allows type stubs to mark functions and classes -not available during runtime. - -.. - -.. bpo: 33832 -.. date: 2018-06-15-15-57-37 -.. nonce: xBFhKw -.. section: Documentation - -Add glossary entry for 'magic method'. - -.. - -.. bpo: 32913 -.. date: 2018-02-22-15-48-16 -.. nonce: f3utho -.. section: Documentation - -Added re.Match.groupdict example to regex HOWTO. - -.. - -.. bpo: 36719 -.. date: 2019-04-26-09-02-49 -.. nonce: ys2uqH -.. section: Tests - -regrtest now always detects uncollectable objects. Previously, the check was -only enabled by ``--findleaks``. The check now also works with -``-jN/--multiprocess N``. ``--findleaks`` becomes a deprecated alias to -``--fail-env-changed``. - -.. - -.. bpo: 36725 -.. date: 2019-04-26-04-12-29 -.. nonce: B8-ghi -.. section: Tests - -When using mulitprocessing mode (-jN), regrtest now better reports errors if -a worker process fails, and it exits immediately on a worker thread failure -or when interrupted. - -.. - -.. bpo: 36454 -.. date: 2019-04-23-17-48-11 -.. nonce: 0q4lQz -.. section: Tests - -Change test_time.test_monotonic() to test only the lower bound of elapsed -time after a sleep command rather than the upper bound. This prevents -unnecessary test failures on slow buildbots. Patch by Victor Stinner. - -.. - -.. bpo: 32424 -.. date: 2019-04-21-17-55-18 -.. nonce: yDy49h -.. section: Tests - -Improve test coverage for xml.etree.ElementTree. Patch by Gordon P. Hemsley. - -.. - -.. bpo: 32424 -.. date: 2019-04-21-17-53-50 -.. nonce: Q4rBmn -.. section: Tests - -Fix typo in test_cyclic_gc() test for xml.etree.ElementTree. Patch by Gordon -P. Hemsley. - -.. - -.. bpo: 36635 -.. date: 2019-04-15-16-55-49 -.. nonce: __FTq9 -.. section: Tests - -Add a new :mod:`_testinternalcapi` module to test the internal C API. - -.. - -.. bpo: 36629 -.. date: 2019-04-15-11-57-39 -.. nonce: ySnaL3 -.. section: Tests - -Fix ``test_imap4_host_default_value()`` of ``test_imaplib``: catch also -:data:`errno.ENETUNREACH` error. - -.. - -.. bpo: 36611 -.. date: 2019-04-12-12-44-42 -.. nonce: UtorXL -.. section: Tests - -Fix ``test_sys.test_getallocatedblocks()`` when :mod:`tracemalloc` is -enabled. - -.. - -.. bpo: 36560 -.. date: 2019-04-09-14-08-02 -.. nonce: _ejeOr -.. section: Tests - -Fix reference leak hunting in regrtest: compute also deltas (of reference -count, allocated memory blocks, file descriptor count) during warmup, to -ensure that everything is initialized before starting to hunt reference -leaks. - -.. - -.. bpo: 36565 -.. date: 2019-04-08-19-01-21 -.. nonce: 2bxgtU -.. section: Tests - -Fix reference hunting (``python3 -m test -R 3:3``) when Python has no -built-in abc module. - -.. - -.. bpo: 31904 -.. date: 2019-04-08-09-24-36 -.. nonce: ab03ea -.. section: Tests - -Port test_resource to VxWorks: skip tests cases setting RLIMIT_FSIZE and -RLIMIT_CPU. - -.. - -.. bpo: 31904 -.. date: 2019-04-01-16-06-36 -.. nonce: peaceF -.. section: Tests - -Fix test_tabnanny on VxWorks: adjust ENOENT error message. - -.. - -.. bpo: 36436 -.. date: 2019-03-26-13-49-21 -.. nonce: yAtN0V -.. section: Tests - -Fix ``_testcapi.pymem_buffer_overflow()``: handle memory allocation failure. - -.. - -.. bpo: 31904 -.. date: 2019-03-19-17-39-25 -.. nonce: QxhhRx -.. section: Tests - -Fix test_utf8_mode on VxWorks: Python always use UTF-8 on VxWorks. - -.. - -.. bpo: 36341 -.. date: 2019-03-18-10-47-45 -.. nonce: UXlY0P -.. section: Tests - -Fix tests that may fail with PermissionError upon calling bind() on AF_UNIX -sockets. - -.. - -.. bpo: 36747 -.. date: 2019-04-29-09-57-20 -.. nonce: 1YEyu- -.. section: Build - -Remove the stale scriptsinstall Makefile target. - -.. - -.. bpo: 21536 -.. date: 2019-04-25-01-51-52 -.. nonce: ACQkiC -.. section: Build - -On Unix, C extensions are no longer linked to libpython except on Android -and Cygwin. - -It is now possible for a statically linked Python to load a C extension -built using a shared library Python. - -When Python is embedded, ``libpython`` must not be loaded with -``RTLD_LOCAL``, but ``RTLD_GLOBAL`` instead. Previously, using -``RTLD_LOCAL``, it was already not possible to load C extensions which were -not linked to ``libpython``, such as C extensions of the standard library -built by the ``*shared*`` section of ``Modules/Setup``. - -distutils, python-config and python-config.py have been modified. - -.. - -.. bpo: 36707 -.. date: 2019-04-24-02-29-15 -.. nonce: 8ZNB67 -.. section: Build - -``./configure --with-pymalloc`` no longer adds the ``m`` flag to SOABI -(sys.implementation.cache_tag). Enabling or disabling pymalloc has no impact -on the ABI. - -.. - -.. bpo: 36635 -.. date: 2019-04-16-13-58-52 -.. nonce: JKlzkf -.. section: Build - -Change ``PyAPI_FUNC(type)``, ``PyAPI_DATA(type)`` and ``PyMODINIT_FUNC`` -macros of ``pyport.h`` when ``Py_BUILD_CORE_MODULE`` is defined. The -``Py_BUILD_CORE_MODULE`` define must be now be used to build a C extension -as a dynamic library accessing Python internals: export the PyInit_xxx() -function in DLL exports on Windows. - -.. - -.. bpo: 31904 -.. date: 2019-04-15-15-01-29 -.. nonce: 38fdkg -.. section: Build - -Don't build the ``_crypt`` extension on VxWorks. - -.. - -.. bpo: 36618 -.. date: 2019-04-12-19-49-10 -.. nonce: gcI9iq -.. section: Build - -Add ``-fmax-type-align=8`` to CFLAGS when clang compiler is detected. The -pymalloc memory allocator aligns memory on 8 bytes. On x86-64, clang expects -alignment on 16 bytes by default and so uses MOVAPS instruction which can -lead to segmentation fault. Instruct clang that Python is limited to -alignment on 8 bytes to use MOVUPS instruction instead: slower but don't -trigger a SIGSEGV if the memory is not aligned on 16 bytes. Sadly, the flag -must be added to ``CFLAGS`` and not just ``CFLAGS_NODIST``, since third -party C extensions can have the same issue. - -.. - -.. bpo: 36605 -.. date: 2019-04-11-18-50-58 -.. nonce: gk5czf -.. section: Build - -``make tags`` and ``make TAGS`` now also parse ``Modules/_io/*.c`` and -``Modules/_io/*.h``. - -.. - -.. bpo: 36465 -.. date: 2019-04-09-18-19-43 -.. nonce: -w6vx6 -.. section: Build - -Release builds and debug builds are now ABI compatible: defining the -``Py_DEBUG`` macro no longer implies the ``Py_TRACE_REFS`` macro, which -introduces the only ABI incompatibility. The ``Py_TRACE_REFS`` macro, which -adds the :func:`sys.getobjects` function and the :envvar:`PYTHONDUMPREFS` -environment variable, can be set using the new ``./configure ---with-trace-refs`` build option. - -.. - -.. bpo: 36577 -.. date: 2019-04-09-17-31-47 -.. nonce: 34kuUW -.. section: Build - -setup.py now correctly reports missing OpenSSL headers and libraries again. - -.. - -.. bpo: 36544 -.. date: 2019-04-06-18-53-03 -.. nonce: hJr2_a -.. section: Build - -Fix regression introduced in bpo-36146 refactoring setup.py - -.. - -.. bpo: 36508 -.. date: 2019-04-02-17-01-23 -.. nonce: SN5Y6N -.. section: Build - -``python-config --ldflags`` no longer includes flags of the -``LINKFORSHARED`` variable. The ``LINKFORSHARED`` variable must only be used -to build executables. - -.. - -.. bpo: 36503 -.. date: 2019-04-02-09-25-23 -.. nonce: 0xzfkQ -.. section: Build - -Remove references to "aix3" and "aix4". Patch by M. Felt. - -.. - -.. bpo: 35920 -.. date: 2019-04-22-16-59-20 -.. nonce: VSfGOI -.. section: Windows - -Added platform.win32_edition() and platform.win32_is_iot(). Added support -for cross-compiling packages for Windows ARM32. Skip tests that are not -expected to work on Windows IoT Core ARM32. - -.. - -.. bpo: 36649 -.. date: 2019-04-17-11-39-24 -.. nonce: arbzIo -.. section: Windows - -Remove trailing spaces for registry keys when installed via the Store. - -.. - -.. bpo: 34144 -.. date: 2019-04-10-04-35-31 -.. nonce: _KzB5z -.. section: Windows - -Fixed activate.bat to correctly update codepage when chcp.com returns dots -in output. Patch by Lorenz Mende. - -.. - -.. bpo: 36509 -.. date: 2019-04-02-10-11-18 -.. nonce: DdaM67 -.. section: Windows - -Added preset-iot layout for Windows IoT ARM containers. This layout doesn't -contain UI components like tkinter or IDLE. It also doesn't contain files to -support on-target builds since Windows ARM32 builds must be cross-compiled -when using MSVC. - -.. - -.. bpo: 35941 -.. date: 2019-03-28-03-51-16 -.. nonce: UnlAEE -.. section: Windows - -enum_certificates function of the ssl module now returns certificates from -all available certificate stores inside windows in a query instead of -returning only certificates from the system wide certificate store. This -includes certificates from these certificate stores: local machine, local -machine enterprise, local machine group policy, current user, current user -group policy, services, users. ssl.enum_crls() function is changed in the -same way to return all certificate revocation lists inside the windows -certificate revocation list stores. - -.. - -.. bpo: 36441 -.. date: 2019-03-26-11-46-15 -.. nonce: lYjGF1 -.. section: Windows - -Fixes creating a venv when debug binaries are installed. - -.. - -.. bpo: 36085 -.. date: 2019-03-18-11-44-49 -.. nonce: mLfxfc -.. section: Windows - -Enable better DLL resolution on Windows by using safe DLL search paths and -adding :func:`os.add_dll_directory`. - -.. - -.. bpo: 36010 -.. date: 2019-03-16-10-24-58 -.. nonce: dttWfp -.. section: Windows - -Add the venv standard library module to the nuget distribution for Windows. - -.. - -.. bpo: 29515 -.. date: 2019-03-05-18-09-43 -.. nonce: vwUTv0 -.. section: Windows - -Add the following socket module constants on Windows: IPPROTO_AH IPPROTO_CBT -IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP -IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGMP -IPPROTO_IGP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_ND -IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING -IPPROTO_SCTP IPPROTO_ST - -.. - -.. bpo: 35947 -.. date: 2019-02-11-14-53-17 -.. nonce: 9vI4hP -.. section: Windows - -Added current version of libffi to cpython-source-deps. Change _ctypes to -use current version of libffi on Windows. - -.. - -.. bpo: 34060 -.. date: 2018-07-20-13-09-19 -.. nonce: v-z87j -.. section: Windows - -Report system load when running test suite on Windows. Patch by Ammar Askar. -Based on prior work by Jeremy Kloth. - -.. - -.. bpo: 31512 -.. date: 2017-10-04-12-40-45 -.. nonce: YQeBt2 -.. section: Windows - -With the Windows 10 Creators Update, non-elevated users can now create -symlinks as long as the computer has Developer Mode enabled. - -.. - -.. bpo: 34602 -.. date: 2019-04-29-10-54-14 -.. nonce: Lrl2zU -.. section: macOS - -Avoid failures setting macOS stack resource limit with resource.setrlimit. -This reverts an earlier fix for bpo-18075 which forced a non-default stack -size when building the interpreter executable on macOS. - -.. - -.. bpo: 36429 -.. date: 2019-03-26-00-09-50 -.. nonce: w-jL2e -.. section: IDLE - -Fix starting IDLE with pyshell. Add idlelib.pyshell alias at top; remove -pyshell alias at bottom. Remove obsolete __name__=='__main__' command. - -.. - -.. bpo: 14546 -.. date: 2019-04-30-14-30-29 -.. nonce: r38Y-6 -.. section: Tools/Demos - -Fix the argument handling in Tools/scripts/lll.py. - -.. - -.. bpo: 36763 -.. date: 2019-05-01-00-42-08 -.. nonce: vghb86 -.. section: C API - -Fix memory leak in :c:func:`Py_SetStandardStreamEncoding`: release memory if -the function is called twice. - -.. - -.. bpo: 36641 -.. date: 2019-04-16-21-18-19 -.. nonce: pz-DIR -.. section: C API - -:c:macro:`PyDoc_VAR(name)` and :c:macro:`PyDoc_STRVAR(name,str)` now create -``static const char name[]`` instead of ``static char name[]``. Patch by -Inada Naoki. - -.. - -.. bpo: 36389 -.. date: 2019-04-11-12-20-35 -.. nonce: P9QFoP -.. section: C API - -Change the value of ``CLEANBYTE``, ``DEADDYTE`` and ``FORBIDDENBYTE`` -internal constants used by debug hooks on Python memory allocators -(:c:func:`PyMem_SetupDebugHooks` function). Byte patterns ``0xCB``, ``0xDB`` -and ``0xFB`` have been replaced with ``0xCD``, ``0xDD`` and ``0xFD`` to use -the same values than Windows CRT debug ``malloc()`` and ``free()``. - -.. - -.. bpo: 36443 -.. date: 2019-03-27-15-58-23 -.. nonce: tAfZR9 -.. section: C API - -Since Python 3.7.0, calling :c:func:`Py_DecodeLocale` before -:c:func:`Py_Initialize` produces mojibake if the ``LC_CTYPE`` locale is -coerced and/or if the UTF-8 Mode is enabled by the user configuration. The -LC_CTYPE coercion and UTF-8 Mode are now disabled by default to fix the -mojibake issue. They must now be enabled explicitly (opt-in) using the new -:c:func:`_Py_PreInitialize` API with ``_PyPreConfig``. - -.. - -.. bpo: 36025 -.. date: 2019-02-19-08-23-42 -.. nonce: tnwylQ -.. section: C API - -Fixed an accidental change to the datetime C API where the arguments to the -:c:func:`PyDate_FromTimestamp` function were incorrectly interpreted as a -single timestamp rather than an arguments tuple, which causes existing code -to start raising :exc:`TypeError`. The backwards-incompatible change was -only present in alpha releases of Python 3.8. Patch by Paul Ganssle. - -.. - -.. bpo: 35810 -.. date: 2019-01-23-12-38-11 -.. nonce: wpbWeb -.. section: C API - -Modify ``PyObject_Init`` to correctly increase the refcount of heap- -allocated Type objects. Also fix the refcounts of the heap-allocated types -that were either doing this manually or not decreasing the type's refcount -in tp_dealloc diff --git a/Misc/NEWS.d/3.8.0b1.rst b/Misc/NEWS.d/3.8.0b1.rst deleted file mode 100644 index 43a88a37c5cb08911d76492a2c2f1b63fa651075..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.8.0b1.rst +++ /dev/null @@ -1,2052 +0,0 @@ -.. bpo: 35907 -.. date: 2019-05-21-23-20-18 -.. nonce: NC_zNK -.. release date: 2019-06-04 -.. section: Security - -CVE-2019-9948: Avoid file reading by disallowing ``local-file://`` and -``local_file://`` URL schemes in ``URLopener().open()`` and -``URLopener().retrieve()`` of :mod:`urllib.request`. - -.. - -.. bpo: 33529 -.. date: 2019-02-24-18-48-16 -.. nonce: wpNNBD -.. section: Security - -Prevent fold function used in email header encoding from entering infinite -loop when there are too many non-ASCII characters in a header. - -.. - -.. bpo: 33164 -.. date: 2018-03-30-12-26-47 -.. nonce: aO29Cx -.. section: Security - -Updated blake2 implementation which uses secure memset implementation -provided by platform. - -.. - -.. bpo: 35814 -.. date: 2019-06-03-00-51-02 -.. nonce: Cf7sGY -.. section: Core and Builtins - -Allow unpacking in the right hand side of annotated assignments. In -particular, ``t: Tuple[int, ...] = x, y, *z`` is now allowed. - -.. - -.. bpo: 37126 -.. date: 2019-06-01-20-03-13 -.. nonce: tP6lL4 -.. section: Core and Builtins - -All structseq objects are now tracked by the garbage collector. Patch by -Pablo Galindo. - -.. - -.. bpo: 37122 -.. date: 2019-06-01-16-53-41 -.. nonce: dZ3-NY -.. section: Core and Builtins - -Make the *co_argcount* attribute of code objects represent the total number -of positional arguments (including positional-only arguments). The value of -*co_posonlyargcount* can be used to distinguish which arguments are -positional only, and the difference (*co_argcount* - *co_posonlyargcount*) -is the number of positional-or-keyword arguments. Patch by Pablo Galindo. - -.. - -.. bpo: 20092 -.. date: 2019-05-31-11-55-49 -.. nonce: KIMjBW -.. section: Core and Builtins - -Constructors of :class:`int`, :class:`float` and :class:`complex` will now -use the :meth:`~object.__index__` special method, if available and the -corresponding method :meth:`~object.__int__`, :meth:`~object.__float__` or -:meth:`~object.__complex__` is not available. - -.. - -.. bpo: 37087 -.. date: 2019-05-30-17-33-55 -.. nonce: vElenE -.. section: Core and Builtins - -Add native thread ID (TID) support to OpenBSD. - -.. - -.. bpo: 26219 -.. date: 2019-05-29-22-03-09 -.. nonce: Ovf1Qs -.. section: Core and Builtins - -Implemented per opcode cache mechanism and ``LOAD_GLOBAL`` instruction use -it. ``LOAD_GLOBAL`` is now about 40% faster. Contributed by Yury Selivanov, -and Inada Naoki. - -.. - -.. bpo: 37072 -.. date: 2019-05-28-18-18-55 -.. nonce: 1Hewl3 -.. section: Core and Builtins - -Fix crash in PyAST_FromNodeObject() when flags is NULL. - -.. - -.. bpo: 37029 -.. date: 2019-05-28-17-02-46 -.. nonce: MxpgfJ -.. section: Core and Builtins - -Freeing a great many small objects could take time quadratic in the number -of arenas, due to using linear search to keep ``obmalloc.c``'s list of -usable arenas sorted by order of number of free memory pools. This is -accomplished without search now, leaving the worst-case time linear in the -number of arenas. For programs where this quite visibly matters (typically -with more than 100 thousand small objects alive simultaneously), this can -greatly reduce the time needed to release their memory. - -.. - -.. bpo: 26423 -.. date: 2019-05-27-18-00-19 -.. nonce: RgUOE8 -.. section: Core and Builtins - -Fix possible overflow in ``wrap_lenfunc()`` when ``sizeof(long) < -sizeof(Py_ssize_t)`` (e.g., 64-bit Windows). - -.. - -.. bpo: 37050 -.. date: 2019-05-27-14-46-24 -.. nonce: 7MyZGg -.. section: Core and Builtins - -Improve the AST for "debug" f-strings, which use '=' to print out the source -of the expression being evaluated. Delete expr_text from the FormattedValue -node, and instead use a Constant string node (possibly merged with adjacent -constant expressions inside the f-string). - -.. - -.. bpo: 22385 -.. date: 2019-05-25-17-18-26 -.. nonce: VeVvhJ -.. section: Core and Builtins - -The `bytes.hex`, `bytearray.hex`, and `memoryview.hex` methods as well as -the `binascii.hexlify` and `b2a_hex` functions now have the ability to -include an optional separator between hex bytes. This functionality was -inspired by MicroPython's hexlify implementation. - -.. - -.. bpo: 26836 -.. date: 2019-05-25-08-18-01 -.. nonce: rplYWW -.. section: Core and Builtins - -Add :func:`os.memfd_create`. - -.. - -.. bpo: 37032 -.. date: 2019-05-24-12-38-40 -.. nonce: T8rSH8 -.. section: Core and Builtins - -Added new ``replace()`` method to the code type (:class:`types.CodeType`). - -.. - -.. bpo: 37007 -.. date: 2019-05-23-04-19-13 -.. nonce: d1SOtF -.. section: Core and Builtins - -Implement :func:`socket.if_nameindex()`, :func:`socket.if_nametoindex()`, -and :func:`socket.if_indextoname()` on Windows. - -.. - -.. bpo: 36829 -.. date: 2019-05-22-23-01-29 -.. nonce: MfOcUg -.. section: Core and Builtins - -:c:func:`PyErr_WriteUnraisable` now creates a traceback object if there is -no current traceback. Moreover, call :c:func:`PyErr_NormalizeException` and -:c:func:`PyException_SetTraceback` to normalize the exception value. Ignore -any error. - -.. - -.. bpo: 36878 -.. date: 2019-05-22-11-16-16 -.. nonce: QwLa3P -.. section: Core and Builtins - -Only accept text after `# type: ignore` if the first character is ASCII. -This is to disallow things like `# type: ignoreé`. - -.. - -.. bpo: 36878 -.. date: 2019-05-21-16-21-22 -.. nonce: EFRHZ3 -.. section: Core and Builtins - -Store text appearing after a `# type: ignore` comment in the AST. For -example a type ignore like `# type: ignore[E1000]` will have the string -`"[E1000]"` stored in its AST node. - -.. - -.. bpo: 2180 -.. date: 2019-05-17-18-34-30 -.. nonce: aBqHeW -.. section: Core and Builtins - -Treat line continuation at EOF as a ``SyntaxError`` by Anthony Sottile. - -.. - -.. bpo: 36907 -.. date: 2019-05-17-12-28-24 -.. nonce: rk7kgp -.. section: Core and Builtins - -Fix a crash when calling a C function with a keyword dict (``f(**kwargs)``) -and changing the dict ``kwargs`` while that function is running. - -.. - -.. bpo: 36946 -.. date: 2019-05-16-23-53-45 -.. nonce: qjxr0Y -.. section: Core and Builtins - -Fix possible signed integer overflow when handling slices. - -.. - -.. bpo: 36826 -.. date: 2019-05-15-14-01-09 -.. nonce: GLrO3W -.. section: Core and Builtins - -Add NamedExpression kind support to ast_unparse.c - -.. - -.. bpo: 1875 -.. date: 2019-05-15-01-29-29 -.. nonce: 9oxXFX -.. section: Core and Builtins - -A :exc:`SyntaxError` is now raised if a code blocks that will be optimized -away (e.g. if conditions that are always false) contains syntax errors. -Patch by Pablo Galindo. - -.. - -.. bpo: 36027 -.. date: 2019-05-12-18-46-50 -.. nonce: Q4YatQ -.. section: Core and Builtins - -Allow computation of modular inverses via three-argument ``pow``: the second -argument is now permitted to be negative in the case where the first and -third arguments are relatively prime. - -.. - -.. bpo: 36861 -.. date: 2019-05-08-20-42-40 -.. nonce: 72mvZM -.. section: Core and Builtins - -Update the Unicode database to version 12.1.0. - -.. - -.. bpo: 28866 -.. date: 2019-05-08-16-36-51 -.. nonce: qCv_bj -.. section: Core and Builtins - -Avoid caching attributes of classes which type defines mro() to avoid a hard -cache invalidation problem. - -.. - -.. bpo: 36851 -.. date: 2019-05-08-11-42-06 -.. nonce: J7DiCW -.. section: Core and Builtins - -The ``FrameType`` stack is now correctly cleaned up if the execution ends -with a return and the stack is not empty. - -.. - -.. bpo: 34616 -.. date: 2019-05-07-17-12-37 -.. nonce: 0Y0_9r -.. section: Core and Builtins - -The ``compile()`` builtin functions now support the -``ast.PyCF_ALLOW_TOP_LEVEL_AWAIT`` flag, which allow to compile sources -that contains top-level ``await``, ``async with`` or ``async for``. This is -useful to evaluate async-code from with an already async functions; for -example in a custom REPL. - -.. - -.. bpo: 36842 -.. date: 2019-05-07-16-50-12 -.. nonce: NYww_N -.. section: Core and Builtins - -Implement PEP 578, adding sys.audit, io.open_code and related APIs. - -.. - -.. bpo: 27639 -.. date: 2019-05-07-15-49-17 -.. nonce: b1Ah87 -.. section: Core and Builtins - -Correct return type for UserList slicing operations. Patch by Michael -Blahay, Erick Cervantes, and vaultah - -.. - -.. bpo: 36737 -.. date: 2019-05-07-12-18-11 -.. nonce: XAo6LY -.. section: Core and Builtins - -Move PyRuntimeState.warnings into per-interpreter state (via "module -state"). - -.. - -.. bpo: 36793 -.. date: 2019-05-04-16-15-33 -.. nonce: Izog4Z -.. section: Core and Builtins - -Removed ``__str__`` implementations from builtin types :class:`bool`, -:class:`int`, :class:`float`, :class:`complex` and few classes from the -standard library. They now inherit ``__str__()`` from :class:`object`. - -.. - -.. bpo: 36817 -.. date: 2019-05-02-11-48-08 -.. nonce: ZqbJ1J -.. section: Core and Builtins - -Add a ``=`` feature f-strings for debugging. This can precede ``!s``, -``!r``, or ``!a``. It produces the text of the expression, followed by an -equal sign, followed by the repr of the value of the expression. So -``f'{3*9+15=}'`` would be equal to the string ``'3*9+15=42'``. If ``=`` is -specified, the default conversion is set to ``!r``, unless a format spec is -given, in which case the formatting behavior is unchanged, and __format__ -will be used. - -.. - -.. bpo: 24048 -.. date: 2019-04-29-03-27-22 -.. nonce: vXxUDQ -.. section: Core and Builtins - -Save the live exception during import.c's ``remove_module()``. - -.. - -.. bpo: 27987 -.. date: 2019-04-16-11-52-21 -.. nonce: n2_DcQ -.. section: Core and Builtins - -pymalloc returns memory blocks aligned by 16 bytes, instead of 8 bytes, on -64-bit platforms to conform x86-64 ABI. Recent compilers assume this -alignment more often. Patch by Inada Naoki. - -.. - -.. bpo: 36601 -.. date: 2019-04-13-16-14-16 -.. nonce: mIgS7t -.. section: Core and Builtins - -A long-since-meaningless check for ``getpid() == main_pid`` was removed from -Python's internal C signal handler. - -.. - -.. bpo: 36594 -.. date: 2019-04-10-18-12-11 -.. nonce: fbnJAc -.. section: Core and Builtins - -Fix incorrect use of ``%p`` in format strings. Patch by Zackery Spytz. - -.. - -.. bpo: 36045 -.. date: 2019-02-24-12-44-46 -.. nonce: RO20OV -.. section: Core and Builtins - -builtins.help() now prefixes `async` for async functions - -.. - -.. bpo: 36084 -.. date: 2019-02-22-23-03-20 -.. nonce: 86Eh4X -.. section: Core and Builtins - -Add native thread ID (TID) to threading.Thread objects (supported platforms: -Windows, FreeBSD, Linux, macOS) - -.. - -.. bpo: 36035 -.. date: 2019-02-22-14-30-19 -.. nonce: -6dy1y -.. section: Core and Builtins - -Added fix for broken symlinks in combination with pathlib - -.. - -.. bpo: 35983 -.. date: 2019-02-13-16-47-19 -.. nonce: bNxsXv -.. section: Core and Builtins - -Added new trashcan macros to deal with a double deallocation that could -occur when the `tp_dealloc` of a subclass calls the `tp_dealloc` of a base -class and that base class uses the trashcan mechanism. Patch by Jeroen -Demeyer. - -.. - -.. bpo: 20602 -.. date: 2018-07-04-16-57-59 -.. nonce: sDLElw -.. section: Core and Builtins - -Do not clear :data:`sys.flags` and :data:`sys.float_info` during shutdown. -Patch by Zackery Spytz. - -.. - -.. bpo: 26826 -.. date: 2018-05-30-23-43-03 -.. nonce: NkRzjb -.. section: Core and Builtins - -Expose :func:`copy_file_range` as a low level API in the :mod:`os` module. - -.. - -.. bpo: 32388 -.. date: 2017-12-21-20-37-40 -.. nonce: 6w-i5t -.. section: Core and Builtins - -Remove cross-version binary compatibility requirement in tp_flags. - -.. - -.. bpo: 31862 -.. date: 2017-10-24-17-26-58 -.. nonce: 5Gea8L -.. section: Core and Builtins - -Port binascii to PEP 489 multiphase initialization. Patch by Marcel Plch. - -.. - -.. bpo: 37128 -.. date: 2019-06-01-22-54-03 -.. nonce: oGXBWN -.. section: Library - -Added :func:`math.perm`. - -.. - -.. bpo: 37120 -.. date: 2019-06-01-09-03-32 -.. nonce: FOKQLU -.. section: Library - -Add SSLContext.num_tickets to control the number of TLSv1.3 session tickets. - -.. - -.. bpo: 12202 -.. date: 2019-05-31-15-53-34 -.. nonce: nobzc9 -.. section: Library - -Fix the error handling in :meth:`msilib.SummaryInformation.GetProperty`. -Patch by Zackery Spytz. - -.. - -.. bpo: 26835 -.. date: 2019-05-31-11-33-11 -.. nonce: xGbUX0 -.. section: Library - -The fcntl module now contains file sealing constants for sealing of memfds. - -.. - -.. bpo: 29262 -.. date: 2019-05-30-21-25-14 -.. nonce: LdIzun -.. section: Library - -Add ``get_origin()`` and ``get_args()`` introspection helpers to ``typing`` -module. - -.. - -.. bpo: 12639 -.. date: 2019-05-30-16-16-47 -.. nonce: TQFOR4 -.. section: Library - -:meth:`msilib.Directory.start_component()` no longer fails if *keyfile* is -not ``None``. - -.. - -.. bpo: 36999 -.. date: 2019-05-30-13-30-46 -.. nonce: EjY_L2 -.. section: Library - -Add the ``asyncio.Task.get_coro()`` method to publicly expose the tasks's -coroutine object. - -.. - -.. bpo: 35246 -.. date: 2019-05-28-23-17-35 -.. nonce: oXT21d -.. section: Library - -Make :func:`asyncio.create_subprocess_exec` accept path-like arguments. - -.. - -.. bpo: 35279 -.. date: 2019-05-28-19-14-29 -.. nonce: PX7yl9 -.. section: Library - -Change default *max_workers* of ``ThreadPoolExecutor`` from ``cpu_count() * -5`` to ``min(32, cpu_count() + 4))``. Previous value was unreasonably large -on many cores machines. - -.. - -.. bpo: 37076 -.. date: 2019-05-28-12-17-10 -.. nonce: Bk2xOs -.. section: Library - -:func:`_thread.start_new_thread` now logs uncaught exception raised by the -function using :func:`sys.unraisablehook`, rather than -:func:`sys.excepthook`, so the hook gets access to the function which raised -the exception. - -.. - -.. bpo: 33725 -.. date: 2019-05-28-01-17-42 -.. nonce: fFZoDG -.. section: Library - -On macOS, the :mod:`multiprocessing` module now uses *spawn* start method by -default. - -.. - -.. bpo: 37054 -.. date: 2019-05-28-01-06-44 -.. nonce: sLULGQ -.. section: Library - -Fix destructor :class:`_pyio.BytesIO` and :class:`_pyio.TextIOWrapper`: -initialize their ``_buffer`` attribute as soon as possible (in the class -body), because it's used by ``__del__()`` which calls ``close()``. - -.. - -.. bpo: 37058 -.. date: 2019-05-26-19-05-24 -.. nonce: jmRu_g -.. section: Library - -PEP 544: Add ``Protocol`` and ``@runtime_checkable`` to the ``typing`` -module. - -.. - -.. bpo: 36933 -.. date: 2019-05-26-10-16-55 -.. nonce: 4w3eP9 -.. section: Library - -The functions ``sys.set_coroutine_wrapper`` and -``sys.get_coroutine_wrapper`` that were deprecated and marked for removal in -3.8 have been removed. - -.. - -.. bpo: 37047 -.. date: 2019-05-26-01-20-06 -.. nonce: K9epi8 -.. section: Library - -Handle late binding and attribute access in :class:`unittest.mock.AsyncMock` -setup for autospeccing. Document newly implemented async methods in -:class:`unittest.mock.MagicMock`. - -.. - -.. bpo: 37049 -.. date: 2019-05-25-19-48-42 -.. nonce: an2LXJ -.. section: Library - -PEP 589: Add ``TypedDict`` to the ``typing`` module. - -.. - -.. bpo: 37046 -.. date: 2019-05-25-19-12-53 -.. nonce: iuhQQj -.. section: Library - -PEP 586: Add ``Literal`` to the ``typing`` module. - -.. - -.. bpo: 37045 -.. date: 2019-05-25-18-36-50 -.. nonce: suHdVJ -.. section: Library - -PEP 591: Add ``Final`` qualifier and ``@final`` decorator to the ``typing`` -module. - -.. - -.. bpo: 37035 -.. date: 2019-05-24-18-16-07 -.. nonce: HFbJVT -.. section: Library - -Don't log OSError based exceptions if a fatal error has occurred in asyncio -transport. Peer can generate almost any OSError, user cannot avoid these -exceptions by fixing own code. Errors are still propagated to user code, -it's just logging them is pointless and pollute asyncio logs. - -.. - -.. bpo: 37001 -.. date: 2019-05-23-21-10-57 -.. nonce: DoLvTK -.. section: Library - -:func:`symtable.symtable` now accepts the same input types for source code -as the built-in :func:`compile` function. Patch by Dino Viehland. - -.. - -.. bpo: 37028 -.. date: 2019-05-23-18-57-34 -.. nonce: Vse6Pj -.. section: Library - -Implement asyncio REPL - -.. - -.. bpo: 37027 -.. date: 2019-05-23-18-46-56 -.. nonce: iH4eut -.. section: Library - -Return safe to use proxy socket object from -transport.get_extra_info('socket') - -.. - -.. bpo: 32528 -.. date: 2019-05-23-17-37-22 -.. nonce: sGnkcl -.. section: Library - -Make asyncio.CancelledError a BaseException. - -This will address the common mistake many asyncio users make: an "except -Exception" clause breaking Tasks cancellation. - -In addition to this change, we stop inheriting asyncio.TimeoutError and -asyncio.InvalidStateError from their concurrent.futures.* counterparts. -There's no point for these exceptions to share the inheritance chain. - -.. - -.. bpo: 1230540 -.. date: 2019-05-23-01-48-39 -.. nonce: oKTNEQ -.. section: Library - -Add a new :func:`threading.excepthook` function which handles uncaught -:meth:`threading.Thread.run` exception. It can be overridden to control how -uncaught :meth:`threading.Thread.run` exceptions are handled. - -.. - -.. bpo: 36996 -.. date: 2019-05-22-22-55-18 -.. nonce: XQx08d -.. section: Library - -Handle :func:`unittest.mock.patch` used as a decorator on async functions. - -.. - -.. bpo: 37008 -.. date: 2019-05-22-15-26-08 -.. nonce: WPbv31 -.. section: Library - -Add support for calling :func:`next` with the mock resulting from -:func:`unittest.mock.mock_open` - -.. - -.. bpo: 27737 -.. date: 2019-05-22-02-25-31 -.. nonce: 7bgKpa -.. section: Library - -Allow whitespace only header encoding in ``email.header`` - by Batuhan -Taskaya - -.. - -.. bpo: 36969 -.. date: 2019-05-21-12-31-21 -.. nonce: u7cxu7 -.. section: Library - -PDB command `args` now display positional only arguments. Patch contributed -by Rémi Lapeyre. - -.. - -.. bpo: 36969 -.. date: 2019-05-20-23-31-20 -.. nonce: JkZORP -.. section: Library - -PDB command `args` now display keyword only arguments. Patch contributed by -Rémi Lapeyre. - -.. - -.. bpo: 36983 -.. date: 2019-05-20-20-41-30 -.. nonce: hz-fLr -.. section: Library - -Add missing names to ``typing.__all__``: ``ChainMap``, ``ForwardRef``, -``OrderedDict`` - by Anthony Sottile. - -.. - -.. bpo: 36972 -.. date: 2019-05-20-17-08-26 -.. nonce: 3l3SGc -.. section: Library - -Add SupportsIndex protocol to the typing module to allow type checking to -detect classes that can be passed to `hex()`, `oct()` and `bin()`. - -.. - -.. bpo: 32972 -.. date: 2019-05-20-14-47-55 -.. nonce: LoeUNh -.. section: Library - -Implement ``unittest.IsolatedAsyncioTestCase`` to help testing asyncio-based code. - -.. - -.. bpo: 36952 -.. date: 2019-05-20-11-01-28 -.. nonce: MgZi7- -.. section: Library - -:func:`fileinput.input` and :class:`fileinput.FileInput` **bufsize** -argument has been removed (was deprecated and ignored since Python 3.6), and -as a result the **mode** and **openhook** arguments have been made -keyword-only. - -.. - -.. bpo: 36952 -.. date: 2019-05-20-08-54-41 -.. nonce: I_glok -.. section: Library - -Starting with Python 3.3, importing ABCs from :mod:`collections` is -deprecated, and import should be done from :mod:`collections.abc`. Still -being able to import from :mod:`collections` was marked for removal in 3.8, -but has been delayed to 3.9; documentation and ``DeprecationWarning`` -clarified. - -.. - -.. bpo: 36949 -.. date: 2019-05-19-06-54-26 -.. nonce: jBlG9F -.. section: Library - -Implement __repr__ for WeakSet objects. - -.. - -.. bpo: 36948 -.. date: 2019-05-17-21-42-58 -.. nonce: vnUDvk -.. section: Library - -Fix :exc:`NameError` in :meth:`urllib.request.URLopener.retrieve`. Patch by -Karthikeyan Singaravelan. - -.. - -.. bpo: 33524 -.. date: 2019-05-17-11-44-21 -.. nonce: 8y_xUU -.. section: Library - -Fix the folding of email header when the max_line_length is 0 or None and -the header contains non-ascii characters. Contributed by Licht Takeuchi -(@Licht-T). - -.. - -.. bpo: 24564 -.. date: 2019-05-16-23-40-36 -.. nonce: lIwV_7 -.. section: Library - -:func:`shutil.copystat` now ignores :const:`errno.EINVAL` on -:func:`os.setxattr` which may occur when copying files on filesystems -without extended attributes support. - -Original patch by Giampaolo Rodola, updated by Ying Wang. - -.. - -.. bpo: 36888 -.. date: 2019-05-16-18-02-08 -.. nonce: -H2Dkm -.. section: Library - -Python child processes can now access the status of their parent process -using multiprocessing.process.parent_process - -.. - -.. bpo: 36921 -.. date: 2019-05-15-21-35-23 -.. nonce: kA1306 -.. section: Library - -Deprecate ``@coroutine`` for sake of ``async def``. - -.. - -.. bpo: 25652 -.. date: 2019-05-14-21-39-52 -.. nonce: xLw42k -.. section: Library - -Fix bug in ``__rmod__`` of ``UserString`` - by Batuhan Taskaya. - -.. - -.. bpo: 36916 -.. date: 2019-05-14-15-39-34 -.. nonce: _GPsTt -.. section: Library - -Remove a message about an unhandled exception in a task when writer.write() -is used without await and writer.drain() fails with an exception. - -.. - -.. bpo: 36889 -.. date: 2019-05-14-12-25-44 -.. nonce: MChPqP -.. section: Library - -Introduce :class:`asyncio.Stream` class that merges -:class:`asyncio.StreamReader` and :class:`asyncio.StreamWriter` -functionality. :class:`asyncio.Stream` can work in readonly, writeonly and -readwrite modes. Provide :func:`asyncio.connect`, -:func:`asyncio.connect_unix`, :func:`asyncio.connect_read_pipe` and -:func:`asyncio.connect_write_pipe` factories to open :class:`asyncio.Stream` -connections. Provide :class:`asyncio.StreamServer` and -:class:`UnixStreamServer` to serve servers with asyncio.Stream API. Modify -:func:`asyncio.create_subprocess_shell` and -:func:`asyncio.create_subprocess_exec` to use :class:`asyncio.Stream` -instead of deprecated :class:`StreamReader` and :class:`StreamWriter`. -Deprecate :class:`asyncio.StreamReader` and :class:`asyncio.StreamWriter`. -Deprecate usage of private classes, e.g. :class:`asyncio.FlowControlMixing` -and :class:`asyncio.StreamReaderProtocol` outside of asyncio package. - -.. - -.. bpo: 36845 -.. date: 2019-05-14-07-57-02 -.. nonce: _GtFFf -.. section: Library - -Added validation of integer prefixes to the construction of IP networks and -interfaces in the ipaddress module. - -.. - -.. bpo: 23378 -.. date: 2019-05-14-05-38-22 -.. nonce: R25teI -.. section: Library - -Add an extend action to argparser. - -.. - -.. bpo: 36867 -.. date: 2019-05-13-13-02-43 -.. nonce: Qh-6mX -.. section: Library - -Fix a bug making a SharedMemoryManager instance and its parent process use -two separate resource_tracker processes. - -.. - -.. bpo: 23896 -.. date: 2019-05-13-05-49-15 -.. nonce: 8TtUKo -.. section: Library - -Adds a grammar to lib2to3.pygram that contains exec as a function not as -statement. - -.. - -.. bpo: 36895 -.. date: 2019-05-12-14-49-13 -.. nonce: ZZuuY7 -.. section: Library - -The function ``time.clock()`` was deprecated in 3.3 in favor of -``time.perf_counter()`` and marked for removal in 3.8, it has removed. - -.. - -.. bpo: 35545 -.. date: 2019-05-11-16-21-29 -.. nonce: FcvJvP -.. section: Library - -Fix asyncio discarding IPv6 scopes when ensuring hostname resolutions -internally - -.. - -.. bpo: 36887 -.. date: 2019-05-11-14-50-59 -.. nonce: XD3f22 -.. section: Library - -Add new function :func:`math.isqrt` to compute integer square roots. - -.. - -.. bpo: 34632 -.. date: 2019-05-11-02-30-45 -.. nonce: 8MXa7T -.. section: Library - -Introduce the ``importlib.metadata`` module with (provisional) support for -reading metadata from third-party packages. - -.. - -.. bpo: 36878 -.. date: 2019-05-10-22-00-06 -.. nonce: iigeqk -.. section: Library - -When using `type_comments=True` in `ast.parse`, treat `# type: ignore` -followed by a non-alphanumeric character and then arbitrary text as a type -ignore, instead of requiring nothing but whitespace or another comment. This -is to permit formations such as `# type: ignore[E1000]`. - -.. - -.. bpo: 36778 -.. date: 2019-05-10-01-06-36 -.. nonce: GRqeiS -.. section: Library - -``cp65001`` encoding (Windows code page 65001) becomes an alias to ``utf_8`` -encoding. - -.. - -.. bpo: 36867 -.. date: 2019-05-09-18-12-55 -.. nonce: FuwVTi -.. section: Library - -The multiprocessing.resource_tracker replaces the -multiprocessing.semaphore_tracker module. Other than semaphores, -resource_tracker also tracks shared_memory segments. - -.. - -.. bpo: 30262 -.. date: 2019-05-09-12-38-40 -.. nonce: Tu74ak -.. section: Library - -The ``Cache`` and ``Statement`` objects of the :mod:`sqlite3` module are not -exposed to the user. Patch by Aviv Palivoda. - -.. - -.. bpo: 24538 -.. date: 2019-05-09-08-35-18 -.. nonce: WK8Y-k -.. section: Library - -In `shutil.copystat()`, first copy extended file attributes and then file -permissions, since extended attributes can only be set on the destination -while it is still writeable. - -.. - -.. bpo: 36829 -.. date: 2019-05-08-12-51-37 -.. nonce: 8enFMA -.. section: Library - -Add new :func:`sys.unraisablehook` function which can be overridden to -control how "unraisable exceptions" are handled. It is called when an -exception has occurred but there is no way for Python to handle it. For -example, when a destructor raises an exception or during garbage collection -(:func:`gc.collect`). - -.. - -.. bpo: 36832 -.. date: 2019-05-07-15-00-45 -.. nonce: TExgqb -.. section: Library - -Introducing ``zipfile.Path``, a pathlib-compatible wrapper for traversing -zip files. - -.. - -.. bpo: 36814 -.. date: 2019-05-06-23-13-26 -.. nonce: dSeMz_ -.. section: Library - -Fix an issue where os.posix_spawnp() would incorrectly raise a TypeError -when file_actions is None. - -.. - -.. bpo: 33110 -.. date: 2019-05-06-22-34-47 -.. nonce: rSJSCh -.. section: Library - -Handle exceptions raised by functions added by concurrent.futures -add_done_callback correctly when the Future has already completed. - -.. - -.. bpo: 26903 -.. date: 2019-05-06-19-17-04 -.. nonce: 4payXb -.. section: Library - -Limit `max_workers` in `ProcessPoolExecutor` to 61 to work around a -WaitForMultipleObjects limitation. - -.. - -.. bpo: 36813 -.. date: 2019-05-06-18-28-38 -.. nonce: NXD0KZ -.. section: Library - -Fix :class:`~logging.handlers.QueueListener` to call ``queue.task_done()`` -upon stopping. Patch by Bar Harel. - -.. - -.. bpo: 36806 -.. date: 2019-05-05-16-14-38 -.. nonce: rAzF-x -.. section: Library - -Forbid creation of asyncio stream objects like StreamReader, StreamWriter, -Process, and their protocols outside of asyncio package. - -.. - -.. bpo: 36802 -.. date: 2019-05-05-10-12-23 -.. nonce: HYMc8P -.. section: Library - -Provide both sync and async calls for StreamWriter.write() and -StreamWriter.close() - -.. - -.. bpo: 36801 -.. date: 2019-05-05-09-45-44 -.. nonce: XrlFFs -.. section: Library - -Properly handle SSL connection closing in asyncio StreamWriter.drain() call. - -.. - -.. bpo: 36785 -.. date: 2019-05-03-20-47-55 -.. nonce: PQLnPq -.. section: Library - -Implement PEP 574 (pickle protocol 5 with out-of-band buffers). - -.. - -.. bpo: 36772 -.. date: 2019-05-01-20-41-53 -.. nonce: fV2K0F -.. section: Library - -functools.lru_cache() can now be used as a straight decorator in addition to -its existing usage as a function that returns a decorator. - -.. - -.. bpo: 6584 -.. date: 2019-04-30-04-34-53 -.. nonce: Hzp9-P -.. section: Library - -Add a :exc:`~gzip.BadGzipFile` exception to the :mod:`gzip` module. - -.. - -.. bpo: 36748 -.. date: 2019-04-29-15-18-13 -.. nonce: YBKWps -.. section: Library - -Optimized write buffering in C implementation of ``TextIOWrapper``. Writing -ASCII string to ``TextIOWrapper`` with ascii, latin1, or utf-8 encoding is -about 20% faster. Patch by Inada Naoki. - -.. - -.. bpo: 8138 -.. date: 2019-04-27-02-54-23 -.. nonce: osBRGI -.. section: Library - -Don't mark ``wsgiref.simple_server.SimpleServer`` as multi-threaded since -``wsgiref.simple_server.WSGIServer`` is single-threaded. - -.. - -.. bpo: 22640 -.. date: 2019-04-26-22-13-26 -.. nonce: p3rheW -.. section: Library - -:func:`py_compile.compile` now supports silent mode. Patch by Joannah -Nanjekye - -.. - -.. bpo: 29183 -.. date: 2019-04-22-22-55-29 -.. nonce: MILvsk -.. section: Library - -Fix double exceptions in :class:`wsgiref.handlers.BaseHandler` by calling -its :meth:`~wsgiref.handlers.BaseHandler.close` method only when no -exception is raised. - -.. - -.. bpo: 36548 -.. date: 2019-04-07-14-30-10 -.. nonce: CJQiYw -.. section: Library - -Improved the repr of regular expression flags. - -.. - -.. bpo: 36542 -.. date: 2019-04-06-12-36-09 -.. nonce: Q0qyYV -.. section: Library - -The signature of Python functions can now be overridden by specifying the -``__text_signature__`` attribute. - -.. - -.. bpo: 36533 -.. date: 2019-04-06-00-55-09 -.. nonce: kzMyRH -.. section: Library - -Reinitialize logging.Handler locks in forked child processes instead of -attempting to acquire them all in the parent before forking only to be -released in the child process. The acquire/release pattern was leading to -deadlocks in code that has implemented any form of chained logging handlers -that depend upon one another as the lock acquisition order cannot be -guaranteed. - -.. - -.. bpo: 35252 -.. date: 2019-04-02-19-23-12 -.. nonce: VooTVv -.. section: Library - -Throw a TypeError instead of an AssertionError when using an invalid type -annotation with singledispatch. - -.. - -.. bpo: 35900 -.. date: 2019-03-27-15-09-00 -.. nonce: fh56UU -.. section: Library - -Allow reduction methods to return a 6-item tuple where the 6th item -specifies a custom state-setting method that's called instead of the regular -``__setstate__`` method. - -.. - -.. bpo: 35900 -.. date: 2019-03-22-22-40-00 -.. nonce: oiee0o -.. section: Library - -enable custom reduction callback registration for functions and classes in -_pickle.c, using the new Pickler's attribute ``reducer_override`` - -.. - -.. bpo: 36368 -.. date: 2019-03-21-16-00-00 -.. nonce: zsRT1 -.. section: Library - -Fix a bug crashing SharedMemoryManager instances in interactive sessions -after a ctrl-c (KeyboardInterrupt) was sent - -.. - -.. bpo: 31904 -.. date: 2019-03-18-14-25-36 -.. nonce: ds3d67 -.. section: Library - -Fix mmap fail for VxWorks - -.. - -.. bpo: 27497 -.. date: 2019-03-13-10-57-41 -.. nonce: JDmIe_ -.. section: Library - -:meth:`csv.DictWriter.writeheader` now returns the return value of the -underlying :meth:`csv.Writer.writerow` method. Patch contributed by Ashish -Nitin Patil. - -.. - -.. bpo: 36239 -.. date: 2019-03-09-23-51-27 -.. nonce: BHJ3Ln -.. section: Library - -Parsing .mo files now ignores comments starting and ending with #-#-#-#-#. - -.. - -.. bpo: 26707 -.. date: 2019-03-04-01-28-33 -.. nonce: QY4kRZ -.. section: Library - -Enable plistlib to read and write binary plist files that were created as a -KeyedArchive file. Specifically, this allows the plistlib to process 0x80 -tokens as UID objects. - -.. - -.. bpo: 31904 -.. date: 2019-03-01-17-59-39 -.. nonce: 38djdk -.. section: Library - -Add posix module support for VxWorks. - -.. - -.. bpo: 35125 -.. date: 2019-02-15-17-18-50 -.. nonce: h0xk0f -.. section: Library - -Asyncio: Remove inner callback on outer cancellation in shield - -.. - -.. bpo: 35721 -.. date: 2019-01-18-16-23-00 -.. nonce: d8djAJ -.. section: Library - -Fix :meth:`asyncio.SelectorEventLoop.subprocess_exec()` leaks file -descriptors if ``Popen`` fails and called with ``stdin=subprocess.PIPE``. -Patch by Niklas Fiekas. - -.. - -.. bpo: 31855 -.. date: 2019-01-11-17-09-15 -.. nonce: PlhfsX -.. section: Library - -:func:`unittest.mock.mock_open` results now respects the argument of -read([size]). Patch contributed by Rémi Lapeyre. - -.. - -.. bpo: 35431 -.. date: 2019-01-02-19-48-23 -.. nonce: FhG6QA -.. section: Library - -Implement :func:`math.comb` that returns binomial coefficient, that computes -the number of ways to choose k items from n items without repetition and -without order. Patch by Yash Aggarwal and Keller Fuchs. - -.. - -.. bpo: 26660 -.. date: 2018-11-04-16-39-46 -.. nonce: RdXz8a -.. section: Library - -Fixed permission errors in :class:`~tempfile.TemporaryDirectory` clean up. -Previously ``TemporaryDirectory.cleanup()`` failed when non-writeable or -non-searchable files or directories were created inside a temporary -directory. - -.. - -.. bpo: 34271 -.. date: 2018-10-21-17-39-32 -.. nonce: P15VLM -.. section: Library - -Add debugging helpers to ssl module. It's now possible to dump key material -and to trace TLS protocol. The default and stdlib contexts also support -SSLKEYLOGFILE env var. - -.. - -.. bpo: 26467 -.. date: 2018-09-13-20-33-24 -.. nonce: cahAk3 -.. section: Library - -Added AsyncMock to support using unittest to mock asyncio coroutines. Patch -by Lisa Roach. - -.. - -.. bpo: 33569 -.. date: 2018-08-28-03-00-12 -.. nonce: 45YlGG -.. section: Library - -dataclasses.InitVar: Exposes the type used to create the init var. - -.. - -.. bpo: 34424 -.. date: 2018-08-18-14-47-00 -.. nonce: wAlRuS -.. section: Library - -Fix serialization of messages containing encoded strings when the -policy.linesep is set to a multi-character string. Patch by Jens Troeger. - -.. - -.. bpo: 34303 -.. date: 2018-08-03-09-47-20 -.. nonce: tOE2HP -.. section: Library - -Performance of :func:`functools.reduce` is slightly improved. Patch by -Sergey Fedoseev. - -.. - -.. bpo: 33361 -.. date: 2018-07-13-20-17-17 -.. nonce: dx2NVn -.. section: Library - -Fix a bug in :class:`codecs.StreamRecoder` where seeking might leave old -data in a buffer and break subsequent read calls. Patch by Ammar Askar. - -.. - -.. bpo: 22454 -.. date: 2018-06-10-17-48-07 -.. nonce: qeiy_X -.. section: Library - -The :mod:`shlex` module now exposes :func:`shlex.join`, the inverse of -:func:`shlex.split`. Patch by Bo Bayles. - -.. - -.. bpo: 31922 -.. date: 2018-05-30-01-05-50 -.. nonce: fobsXJ -.. section: Library - -:meth:`asyncio.AbstractEventLoop.create_datagram_endpoint`: Do not connect -UDP socket when broadcast is allowed. This allows to receive replies after a -UDP broadcast. - -.. - -.. bpo: 24882 -.. date: 2018-04-04-14-54-30 -.. nonce: urybpa -.. section: Library - -Change ThreadPoolExecutor to use existing idle threads before spinning up -new ones. - -.. - -.. bpo: 31961 -.. date: 2018-03-27-13-28-16 -.. nonce: GjLoYu -.. section: Library - -Added support for bytes and path-like objects in :func:`subprocess.Popen` on -Windows. The *args* parameter now accepts a :term:`path-like object` if -*shell* is ``False`` and a sequence containing bytes and path-like objects. -The *executable* parameter now accepts a bytes and :term:`path-like object`. -The *cwd* parameter now accepts a bytes object. Based on patch by Anders -Lorentsen. - -.. - -.. bpo: 33123 -.. date: 2018-03-22-19-13-19 -.. nonce: _Y5ooE -.. section: Library - -:class:`pathlib.Path.unlink` now accepts a *missing_ok* parameter to avoid a -:exc:`FileNotFoundError` from being raised. Patch by Robert Buchholz. - -.. - -.. bpo: 32941 -.. date: 2018-03-20-20-57-00 -.. nonce: 9FU0gL -.. section: Library - -Allow :class:`mmap.mmap` objects to access the madvise() system call -(through :meth:`mmap.mmap.madvise`). - -.. - -.. bpo: 22102 -.. date: 2018-03-08-16-15-00 -.. nonce: th33uD -.. section: Library - -Added support for ZIP files with disks set to 0. Such files are commonly -created by builtin tools on Windows when use ZIP64 extension. Patch by -Francisco Facioni. - -.. - -.. bpo: 32515 -.. date: 2018-01-07-21-04-50 -.. nonce: D8_Wcb -.. section: Library - -trace.py can now run modules via python3 -m trace -t --module module_name - -.. - -.. bpo: 32299 -.. date: 2017-12-13-17-49-56 -.. nonce: eqAPWs -.. section: Library - -Changed :func:`unittest.mock.patch.dict` to return the patched dictionary -when used as context manager. Patch by Vadim Tsander. - -.. - -.. bpo: 27141 -.. date: 2017-10-24-00-42-14 -.. nonce: zbAgSs -.. section: Library - -Added a ``__copy__()`` to ``collections.UserList`` and -``collections.UserDict`` in order to correctly implement shallow copying of -the objects. Patch by Bar Harel. - -.. - -.. bpo: 31829 -.. date: 2017-10-21-12-07-56 -.. nonce: 6IhP-O -.. section: Library - -``\r``, ``\0`` and ``\x1a`` (end-of-file on Windows) are now escaped in -protocol 0 pickles of Unicode strings. This allows to load them without loss -from files open in text mode in Python 2. - -.. - -.. bpo: 23395 -.. date: 2016-07-27-11-06-43 -.. nonce: MuCEX9 -.. section: Library - -``_thread.interrupt_main()`` now avoids setting the Python error status if -the ``SIGINT`` signal is ignored or not handled by Python. - -.. - -.. bpo: 36896 -.. date: 2019-05-31-10-46-36 -.. nonce: wkXTW9 -.. section: Documentation - -Clarify that some types have unstable constructor signature between Python -versions. - -.. - -.. bpo: 36686 -.. date: 2019-05-27-17-28-58 -.. nonce: Zot4sx -.. section: Documentation - -Improve documentation of the stdin, stdout, and stderr arguments of of the -``asyncio.subprocess_exec`` function to specify which values are supported. -Also mention that decoding as text is not supported. - -Add a few tests to verify that the various values passed to the std* -arguments actually work. - -.. - -.. bpo: 36984 -.. date: 2019-05-20-22-21-17 -.. nonce: IjZlmS -.. section: Documentation - -Improve version added references in ``typing`` module - by Anthony Sottile. - -.. - -.. bpo: 36868 -.. date: 2019-05-11-17-42-15 -.. nonce: yioL0R -.. section: Documentation - -What's new now mentions SSLContext.hostname_checks_common_name instead of -SSLContext.host_flags. - -.. - -.. bpo: 35924 -.. date: 2019-05-08-13-17-44 -.. nonce: lqbNpW -.. section: Documentation - -Add a note to the ``curses.addstr()`` documentation to warn that multiline -strings can cause segfaults because of an ncurses bug. - -.. - -.. bpo: 36783 -.. date: 2019-05-07-02-30-51 -.. nonce: gpC8E2 -.. section: Documentation - -Added C API Documentation for Time_FromTimeAndFold and -PyDateTime_FromDateAndTimeAndFold as per PEP 495. Patch by Edison Abahurire. - -.. - -.. bpo: 36797 -.. date: 2019-05-05-07-58-50 -.. nonce: W1X4On -.. section: Documentation - -More of the legacy distutils documentation has been either pruned, or else -more clearly marked as being retained solely until the setuptools -documentation covers it independently. - -.. - -.. bpo: 22865 -.. date: 2019-02-21-18-13-50 -.. nonce: 6hg6J8 -.. section: Documentation - -Add detail to the documentation on the `pty.spawn` function. - -.. - -.. bpo: 35397 -.. date: 2019-01-09-17-56-35 -.. nonce: ZMreIz -.. section: Documentation - -Remove deprecation and document urllib.parse.unwrap(). Patch contributed by -Rémi Lapeyre. - -.. - -.. bpo: 32995 -.. date: 2018-10-07-03-04-57 -.. nonce: TXN9ur -.. section: Documentation - -Added the context variable in glossary. - -.. - -.. bpo: 33519 -.. date: 2018-05-17-21-02-00 -.. nonce: Q7s2FB -.. section: Documentation - -Clarify that `copy()` is not part of the `MutableSequence` ABC. - -.. - -.. bpo: 33482 -.. date: 2018-05-13-10-36-37 -.. nonce: jalAaQ -.. section: Documentation - -Make `codecs.StreamRecoder.writelines` take a list of bytes. - -.. - -.. bpo: 25735 -.. date: 2018-04-08-19-09-22 -.. nonce: idVQBD -.. section: Documentation - -Added documentation for func factorial to indicate that returns integer -values - -.. - -.. bpo: 20285 -.. date: 2017-12-08-20-30-37 -.. nonce: cfnp0J -.. section: Documentation - -Expand object.__doc__ (docstring) to make it clearer. Modify pydoc.py so -that help(object) lists object methods (for other classes, help omits -methods of the object base class.) - -.. - -.. bpo: 37069 -.. date: 2019-06-03-02-30-36 -.. nonce: rVtdLk -.. section: Tests - -Modify test_coroutines, test_cprofile, test_generators, test_raise, test_ssl -and test_yield_from to use :func:`test.support.catch_unraisable_exception` -rather than :func:`test.support.captured_stderr`. - -.. - -.. bpo: 37098 -.. date: 2019-05-30-10-57-39 -.. nonce: SfXt1M -.. section: Tests - -Fix test_memfd_create on older Linux Kernels. - -.. - -.. bpo: 37081 -.. date: 2019-05-28-17-48-22 -.. nonce: qxB-1l -.. section: Tests - -Test with OpenSSL 1.1.1c - -.. - -.. bpo: 36829 -.. date: 2019-05-22-12-57-15 -.. nonce: e9mRWC -.. section: Tests - -Add :func:`test.support.catch_unraisable_exception`: context manager -catching unraisable exception using :func:`sys.unraisablehook`. - -.. - -.. bpo: 36915 -.. date: 2019-05-14-14-12-24 -.. nonce: 58b7pH -.. section: Tests - -The main regrtest process now always removes all temporary directories of -worker processes even if they crash or if they are killed on -KeyboardInterrupt (CTRL+c). - -.. - -.. bpo: 36719 -.. date: 2019-05-10-01-50-30 -.. nonce: O84ZWv -.. section: Tests - -"python3 -m test -jN ..." now continues the execution of next tests when a -worker process crash (CHILD_ERROR state). Previously, the test suite stopped -immediately. Use --failfast to stop at the first error. - -.. - -.. bpo: 36816 -.. date: 2019-05-08-15-55-46 -.. nonce: WBKRGZ -.. section: Tests - -Update Lib/test/selfsigned_pythontestdotnet.pem to match -self-signed.pythontest.net's new TLS certificate. - -.. - -.. bpo: 35925 -.. date: 2019-05-06-18-29-54 -.. nonce: gwQPuC -.. section: Tests - -Skip httplib and nntplib networking tests when they would otherwise fail due -to a modern OS or distro with a default OpenSSL policy of rejecting -connections to servers with weak certificates. - -.. - -.. bpo: 36782 -.. date: 2019-05-04-21-25-19 -.. nonce: h3oPIb -.. section: Tests - -Add tests for several C API functions in the :mod:`datetime` module. Patch -by Edison Abahurire. - -.. - -.. bpo: 36342 -.. date: 2019-03-23-13-58-49 -.. nonce: q6Quiq -.. section: Tests - -Fix test_multiprocessing in test_venv if platform lacks functioning -sem_open. - -.. - -.. bpo: 36721 -.. date: 2019-05-22-16-19-18 -.. nonce: 9aRwfZ -.. section: Build - -To embed Python into an application, a new ``--embed`` option must be passed -to ``python3-config --libs --embed`` to get ``-lpython3.8`` (link the -application to libpython). To support both 3.8 and older, try -``python3-config --libs --embed`` first and fallback to ``python3-config ---libs`` (without ``--embed``) if the previous command fails. - -Add a pkg-config ``python-3.8-embed`` module to embed Python into an -application: ``pkg-config python-3.8-embed --libs`` includes -``-lpython3.8``. To support both 3.8 and older, try ``pkg-config -python-X.Y-embed --libs`` first and fallback to ``pkg-config python-X.Y ---libs`` (without ``--embed``) if the previous command fails (replace -``X.Y`` with the Python version). - -On the other hand, ``pkg-config python3.8 --libs`` no longer contains -``-lpython3.8``. C extensions must not be linked to libpython (except on -Android, case handled by the script); this change is backward incompatible -on purpose. - -.. - -.. bpo: 36786 -.. date: 2019-05-03-21-08-06 -.. nonce: gOLFbD -.. section: Build - -"make install" now runs compileall in parallel. - -.. - -.. bpo: 36965 -.. date: 2019-05-20-20-26-36 -.. nonce: KsfI-N -.. section: Windows - -include of STATUS_CONTROL_C_EXIT without depending on MSC compiler - -.. - -.. bpo: 35926 -.. date: 2019-03-01-16-43-45 -.. nonce: mLszHo -.. section: Windows - -Update to OpenSSL 1.1.1b for Windows. - -.. - -.. bpo: 29883 -.. date: 2018-09-15-11-36-55 -.. nonce: HErerE -.. section: Windows - -Add Windows support for UDP transports for the Proactor Event Loop. Patch by -Adam Meily. - -.. - -.. bpo: 33407 -.. date: 2018-08-28-17-23-49 -.. nonce: ARG0W_ -.. section: Windows - -The :c:macro:`Py_DEPRECATED()` macro has been implemented for MSVC. - -.. - -.. bpo: 36231 -.. date: 2019-06-03-05-49-49 -.. nonce: RfmW_p -.. section: macOS - -Support building Python on macOS without /usr/include installed. As of macOS -10.14, system header files are only available within an SDK provided by -either the Command Line Tools or the Xcode app. - -.. - -.. bpo: 35610 -.. date: 2019-06-02-14-10-52 -.. nonce: 0w_v6Y -.. section: IDLE - -Replace now redundant .context_use_ps1 with .prompt_last_line. This finishes -change started in bpo-31858. - -.. - -.. bpo: 37038 -.. date: 2019-05-24-18-57-57 -.. nonce: AJ3RwQ -.. section: IDLE - -Make idlelib.run runnable; add test clause. - -.. - -.. bpo: 36958 -.. date: 2019-05-19-22-02-22 -.. nonce: DZUC6G -.. section: IDLE - -Print any argument other than None or int passed to SystemExit or -sys.exit(). - -.. - -.. bpo: 36807 -.. date: 2019-05-05-16-27-53 -.. nonce: AGNWYJ -.. section: IDLE - -When saving a file, call os.fsync() so bits are flushed to e.g. USB drive. - -.. - -.. bpo: 32411 -.. date: 2017-12-25-18-48-50 -.. nonce: vNwDhe -.. section: IDLE - -In browser.py, remove extraneous sorting by line number since dictionary was -created in line number order. - -.. - -.. bpo: 37053 -.. date: 2019-05-26-16-47-06 -.. nonce: -EYRuz -.. section: Tools/Demos - -Handle strings like u"bar" correctly in Tools/parser/unparse.py. Patch by -Chih-Hsuan Yen. - -.. - -.. bpo: 36763 -.. date: 2019-05-27-12-25-25 -.. nonce: bHCA9j -.. section: C API - -Implement the :pep:`587` "Python Initialization Configuration". - -.. - -.. bpo: 36379 -.. date: 2019-05-24-07-11-08 -.. nonce: 8zgoKe -.. section: C API - -Fix crashes when attempting to use the *modulo* parameter when ``__ipow__`` -is implemented in C. - -.. - -.. bpo: 37107 -.. date: 2019-05-22-17-33-52 -.. nonce: 8BVPR- -.. section: C API - -Update :c:func:`PyObject_CallMethodObjArgs` and -``_PyObject_CallMethodIdObjArgs`` to use ``_PyObject_GetMethod`` to avoid -creating a bound method object in many cases. Patch by Michael J. Sullivan. - -.. - -.. bpo: 36974 -.. date: 2019-05-22-15-24-08 -.. nonce: TkySRe -.. section: C API - -Implement :pep:`590`: Vectorcall: a fast calling protocol for CPython. This -is a new protocol to optimize calls of custom callable objects. - -.. - -.. bpo: 36763 -.. date: 2019-05-17-19-23-24 -.. nonce: TswmDy -.. section: C API - -``Py_Main()`` now returns the exitcode rather than calling -``Py_Exit(exitcode)`` when calling ``PyErr_Print()`` if the current -exception type is ``SystemExit``. - -.. - -.. bpo: 36922 -.. date: 2019-05-15-10-46-55 -.. nonce: J3EFK_ -.. section: C API - -Add new type flag ``Py_TPFLAGS_METHOD_DESCRIPTOR`` for objects behaving like -unbound methods. These are objects supporting the optimization given by the -``LOAD_METHOD``/``CALL_METHOD`` opcodes. See PEP 590. - -.. - -.. bpo: 36728 -.. date: 2019-05-11-03-56-23 -.. nonce: FR-dMP -.. section: C API - -The :c:func:`PyEval_ReInitThreads` function has been removed from the C API. -It should not be called explicitly: use :c:func:`PyOS_AfterFork_Child` -instead. diff --git a/Misc/NEWS.d/3.8.0b2.rst b/Misc/NEWS.d/3.8.0b2.rst deleted file mode 100644 index f462e753956b48fc622475ba17e988e62b3f278e..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.8.0b2.rst +++ /dev/null @@ -1,933 +0,0 @@ -.. bpo: 37363 -.. date: 2019-07-01-10-31-14 -.. nonce: fSjatj -.. release date: 2019-07-04 -.. section: Security - -Adds audit events for the range of supported run commands (see -:ref:`using-on-general`). - -.. - -.. bpo: 37463 -.. date: 2019-07-01-08-46-14 -.. nonce: 1CHwjE -.. section: Security - -ssl.match_hostname() no longer accepts IPv4 addresses with additional text -after the address and only quad-dotted notation without trailing -whitespaces. Some inet_aton() implementations ignore whitespace and all data -after whitespace, e.g. '127.0.0.1 whatever'. - -.. - -.. bpo: 37363 -.. date: 2019-06-21-15-58-59 -.. nonce: diouyl -.. section: Security - -Adds audit events for :mod:`ensurepip`, :mod:`ftplib`, :mod:`glob`, -:mod:`imaplib`, :mod:`nntplib`, :mod:`pdb`, :mod:`poplib`, :mod:`shutil`, -:mod:`smtplib`, :mod:`sqlite3`, :mod:`subprocess`, :mod:`telnetlib`, -:mod:`tempfile` and :mod:`webbrowser`, as well as :func:`os.listdir`, -:func:`os.scandir` and :func:`breakpoint`. - -.. - -.. bpo: 37364 -.. date: 2019-06-21-14-42-53 -.. nonce: IIRc2s -.. section: Security - -:func:`io.open_code` is now used when reading :file:`.pth` files. - -.. - -.. bpo: 34631 -.. date: 2019-06-17-09-34-25 -.. nonce: DBfM4j -.. section: Security - -Updated OpenSSL to 1.1.1c in Windows installer - -.. - -.. bpo: 37467 -.. date: 2019-07-01-12-22-44 -.. nonce: u-XyEu -.. section: Core and Builtins - -Fix :func:`sys.excepthook` and :c:func:`PyErr_Display` if a filename is a -bytes string. For example, for a SyntaxError exception where the filename -attribute is a bytes string. - -.. - -.. bpo: 37417 -.. date: 2019-06-26-18-41-00 -.. nonce: VsZeHL -.. section: Core and Builtins - -:meth:`bytearray.extend` now correctly handles errors that arise during -iteration. Patch by Brandt Bucher. - -.. - -.. bpo: 24214 -.. date: 2019-06-22-12-45-20 -.. nonce: hIiHeD -.. section: Core and Builtins - -Improved support of the surrogatepass error handler in the UTF-8 and UTF-16 -incremental decoders. - -.. - -.. bpo: 35224 -.. date: 2019-06-17-06-03-55 -.. nonce: FHWPGv -.. section: Core and Builtins - -Reverse evaluation order of key: value in dict comprehensions as proposed in -PEP 572. I.e. in ``{k: v for ...}``, ``k`` will be evaluated before ``v``. - -.. - -.. bpo: 37316 -.. date: 2019-06-17-03-53-16 -.. nonce: LytDX_ -.. section: Core and Builtins - -Fix the :c:func:`PySys_Audit` call in :class:`mmap.mmap`. - -.. - -.. bpo: 37269 -.. date: 2019-06-14-06-32-33 -.. nonce: SjVVAe -.. section: Core and Builtins - -Fix a bug in the peephole optimizer that was not treating correctly constant -conditions with binary operators. Patch by Pablo Galindo. - -.. - -.. bpo: 37213 -.. date: 2019-06-11-11-15-19 -.. nonce: UPii5K -.. section: Core and Builtins - -Handle correctly negative line offsets in the peephole optimizer. Patch by -Pablo Galindo. - -.. - -.. bpo: 37219 -.. date: 2019-06-10-23-18-31 -.. nonce: jPSufq -.. section: Core and Builtins - -Remove errorneous optimization for empty set differences. - -.. - -.. bpo: 36922 -.. date: 2019-06-06-13-59-52 -.. nonce: EMZ3TF -.. section: Core and Builtins - -Slot functions optimize any callable with ``Py_TPFLAGS_METHOD_DESCRIPTOR`` -instead of only instances of ``function``. - -.. - -.. bpo: 36974 -.. date: 2019-06-06-11-00-55 -.. nonce: wdzzym -.. section: Core and Builtins - -The slot ``tp_vectorcall_offset`` is inherited unconditionally to support -``super().__call__()`` when the base class uses vectorcall. - -.. - -.. bpo: 37160 -.. date: 2019-06-05-09-24-17 -.. nonce: O3IAY3 -.. section: Core and Builtins - -:func:`threading.get_native_id` now also supports NetBSD. - -.. - -.. bpo: 37077 -.. date: 2019-05-28-11-47-44 -.. nonce: S1h0Fc -.. section: Core and Builtins - -Add :func:`threading.get_native_id` support for AIX. Patch by M. Felt - -.. - -.. bpo: 37440 -.. date: 2019-06-28-16-40-17 -.. nonce: t3wX-N -.. section: Library - -http.client now enables TLS 1.3 post-handshake authentication for default -context or if a cert_file is passed to HTTPSConnection. - -.. - -.. bpo: 37437 -.. date: 2019-06-27-20-33-50 -.. nonce: du39_A -.. section: Library - -Update vendorized expat version to 2.2.7. - -.. - -.. bpo: 37428 -.. date: 2019-06-27-13-27-02 -.. nonce: _wcwUd -.. section: Library - -SSLContext.post_handshake_auth = True no longer sets -SSL_VERIFY_POST_HANDSHAKE verify flag for client connections. Although the -option is documented as ignored for clients, OpenSSL implicitly enables cert -chain validation when the flag is set. - -.. - -.. bpo: 37420 -.. date: 2019-06-26-22-25-05 -.. nonce: CxFJ09 -.. section: Library - -:func:`os.sched_setaffinity` now correctly handles errors that arise during -iteration over its ``mask`` argument. Patch by Brandt Bucher. - -.. - -.. bpo: 37412 -.. date: 2019-06-26-16-28-59 -.. nonce: lx0VjC -.. section: Library - -The :func:`os.getcwdb` function now uses the UTF-8 encoding on Windows, -rather than the ANSI code page: see :pep:`529` for the rationale. The -function is no longer deprecated on Windows. - -.. - -.. bpo: 29412 -.. date: 2019-06-25-19-27-25 -.. nonce: n4Zqdh -.. section: Library - -Fix IndexError in parsing a header value ending unexpectedly. Patch by -Abhilash Raj. - -.. - -.. bpo: 36546 -.. date: 2019-06-25-05-07-48 -.. nonce: RUcxaK -.. section: Library - -The *dist* argument for statistics.quantiles() is now positional only. The -current name doesn't reflect that the argument can be either a dataset or a -distribution. Marking the parameter as positional avoids confusion and -makes it possible to change the name later. - -.. - -.. bpo: 37394 -.. date: 2019-06-25-02-10-00 -.. nonce: srZ1zx -.. section: Library - -Fix a bug that was causing the :mod:`queue` module to fail if the -accelerator module was not available. Patch by Pablo Galindo. - -.. - -.. bpo: 33972 -.. date: 2019-06-15-14-39-50 -.. nonce: XxnNPw -.. section: Library - -Email with single part but content-type set to ``multipart/*`` doesn't raise -AttributeError anymore. - -.. - -.. bpo: 37280 -.. date: 2019-06-14-13-30-47 -.. nonce: Fxur0F -.. section: Library - -Use threadpool for reading from file for sendfile fallback mode. - -.. - -.. bpo: 37279 -.. date: 2019-06-14-13-25-56 -.. nonce: OHlW6l -.. section: Library - -Fix asyncio sendfile support when sendfile sends extra data in fallback -mode. - -.. - -.. bpo: 19865 -.. date: 2019-06-14-08-30-16 -.. nonce: FRGH4I -.. section: Library - -:func:`ctypes.create_unicode_buffer()` now also supports non-BMP characters -on platforms with 16-bit :c:type:`wchar_t` (for example, Windows and AIX). - -.. - -.. bpo: 37210 -.. date: 2019-06-12-16-10-50 -.. nonce: r4yMg6 -.. section: Library - -Allow pure Python implementation of :mod:`pickle` to work even when the C -:mod:`_pickle` module is unavailable. - -.. - -.. bpo: 35922 -.. date: 2019-06-11-19-34-29 -.. nonce: rxpzWr -.. section: Library - -Fix :meth:`RobotFileParser.crawl_delay` and -:meth:`RobotFileParser.request_rate` to return ``None`` rather than raise -:exc:`AttributeError` when no relevant rule is defined in the robots.txt -file. Patch by Rémi Lapeyre. - -.. - -.. bpo: 35766 -.. date: 2019-06-11-16-41-40 -.. nonce: v1Kj-T -.. section: Library - -Change the format of feature_version to be a (major, minor) tuple. - -.. - -.. bpo: 36607 -.. date: 2019-06-11-13-52-04 -.. nonce: 5_mJkQ -.. section: Library - -Eliminate :exc:`RuntimeError` raised by :func:`asyncio.all_tasks()` if -internal tasks weak set is changed by another thread during iteration. - -.. - -.. bpo: 18748 -.. date: 2019-06-11-01-54-19 -.. nonce: ADqCkq -.. section: Library - -:class:`_pyio.IOBase` destructor now does nothing if getting the ``closed`` -attribute fails to better mimick :class:`_io.IOBase` finalizer. - -.. - -.. bpo: 36402 -.. date: 2019-06-11-00-35-02 -.. nonce: b0IJVp -.. section: Library - -Fix a race condition at Python shutdown when waiting for threads. Wait until -the Python thread state of all non-daemon threads get deleted (join all -non-daemon threads), rather than just wait until non-daemon Python threads -complete. - -.. - -.. bpo: 34886 -.. date: 2019-06-08-16-03-19 -.. nonce: Ov-pc9 -.. section: Library - -Fix an unintended ValueError from :func:`subprocess.run` when checking for -conflicting `input` and `stdin` or `capture_output` and `stdout` or `stderr` -args when they were explicitly provided but with `None` values within a -passed in `**kwargs` dict rather than as passed directly by name. Patch -contributed by Rémi Lapeyre. - -.. - -.. bpo: 37173 -.. date: 2019-06-08-11-33-48 -.. nonce: 0e_8gS -.. section: Library - -The exception message for ``inspect.getfile()`` now correctly reports the -passed class rather than the builtins module. - -.. - -.. bpo: 37178 -.. date: 2019-06-07-17-16-09 -.. nonce: Day_oB -.. section: Library - -Give math.perm() a one argument form that means the same as -math.factorial(). - -.. - -.. bpo: 37178 -.. date: 2019-06-07-17-11-34 -.. nonce: b1StSv -.. section: Library - -For math.perm(n, k), let k default to n, giving the same result as -factorial. - -.. - -.. bpo: 37163 -.. date: 2019-06-07-08-18-05 -.. nonce: 36JkUh -.. section: Library - -Deprecated passing ``obj`` argument of :func:`dataclasses.replace` as -keyword argument. - -.. - -.. bpo: 37165 -.. date: 2019-06-05-11-48-19 -.. nonce: V_rwfE -.. section: Library - -Converted _collections._count_elements to use the Argument Clinic. - -.. - -.. bpo: 34767 -.. date: 2019-06-04-23-44-52 -.. nonce: BpDShN -.. section: Library - -Do not always create a :class:`collections.deque` in :class:`asyncio.Lock`. - -.. - -.. bpo: 37158 -.. date: 2019-06-04-22-25-38 -.. nonce: JKm15S -.. section: Library - -Speed-up statistics.fmean() by switching from a function to a generator. - -.. - -.. bpo: 37150 -.. date: 2019-06-04-14-44-41 -.. nonce: TTzHxj -.. section: Library - -`argparse._ActionsContainer.add_argument` now throws error, if someone -accidentally pass FileType class object instead of instance of FileType as -`type` argument - -.. - -.. bpo: 35621 -.. date: 2019-05-28-19-03-46 -.. nonce: Abc1lf -.. section: Library - -Support running asyncio subprocesses when execution event loop in a thread -on UNIX. - -.. - -.. bpo: 36520 -.. date: 2019-05-28-02-37-00 -.. nonce: W4tday -.. section: Library - -Lengthy email headers with UTF-8 characters are now properly encoded when -they are folded. Patch by Jeffrey Kintscher. - -.. - -.. bpo: 30835 -.. date: 2019-05-27-15-29-46 -.. nonce: 3FoaWH -.. section: Library - -Fixed a bug in email parsing where a message with invalid bytes in -content-transfer-encoding of a multipart message can cause an -AttributeError. Patch by Andrew Donnellan. - -.. - -.. bpo: 35805 -.. date: 2019-05-17-15-11-08 -.. nonce: E4YwYz -.. section: Library - -Add parser for Message-ID header and add it to default HeaderRegistry. This -should prevent folding of Message-ID using RFC 2048 encoded words. - -.. - -.. bpo: 35070 -.. date: 2019-05-09-18-50-55 -.. nonce: 4vaqNL -.. section: Library - -posix.getgrouplist() now works correctly when the user belongs to -NGROUPS_MAX supplemental groups. Patch by Jeffrey Kintscher. - -.. - -.. bpo: 32627 -.. date: 2019-02-03-19-13-08 -.. nonce: b68f64 -.. section: Library - -Fix compile error when ``_uuid`` headers conflicting included. - -.. - -.. bpo: 11122 -.. date: 2018-11-12-19-08-50 -.. nonce: Gj7BQn -.. section: Library - -Distutils won't check for rpmbuild in specified paths only. - -.. - -.. bpo: 4963 -.. date: 2017-08-15-11-24-41 -.. nonce: LRYres -.. section: Library - -Fixed non-deterministic behavior related to mimetypes extension mapping and -module reinitialization. - -.. - -.. bpo: 34903 -.. date: 2019-06-17-09-36-46 -.. nonce: r_wGRc -.. section: Documentation - -Documented that in :meth:`datetime.datetime.strptime()`, the leading zero in -some two-digit formats is optional. Patch by Mike Gleen. - -.. - -.. bpo: 37421 -.. date: 2019-07-03-00-05-28 -.. nonce: ORGRSG -.. section: Tests - -test_distutils.test_build_ext() is now able to remove the temporary -directory on Windows: don't import the newly built C extension ("xx") in the -current process, but test it in a separated process. - -.. - -.. bpo: 37421 -.. date: 2019-07-02-23-29-06 -.. nonce: WEfc5A -.. section: Tests - -test_concurrent_futures now cleans up multiprocessing to remove immediately -temporary directories created by multiprocessing.util.get_temp_dir(). - -.. - -.. bpo: 37421 -.. date: 2019-07-02-23-20-35 -.. nonce: HCkKWz -.. section: Tests - -test_winconsoleio doesn't leak a temporary file anymore: use -tempfile.TemporaryFile() to remove it when the test completes. - -.. - -.. bpo: 37421 -.. date: 2019-07-01-19-57-26 -.. nonce: NFH1f0 -.. section: Tests - -multiprocessing tests now explicitly call ``_run_finalizers()`` to -immediately remove temporary directories created by tests. - -.. - -.. bpo: 37199 -.. date: 2019-06-29-23-56-28 -.. nonce: FHDsLf -.. section: Tests - -Fix test failures when IPv6 is unavailable or disabled. - -.. - -.. bpo: 37335 -.. date: 2019-06-28-16-37-52 -.. nonce: o5S2hY -.. section: Tests - -Remove no longer necessary code from c locale coercion tests - -.. - -.. bpo: 37421 -.. date: 2019-06-27-00-37-59 -.. nonce: rVJb3x -.. section: Tests - -Fix test_shutil to no longer leak temporary files. - -.. - -.. bpo: 37411 -.. date: 2019-06-26-15-28-45 -.. nonce: 5lGNhM -.. section: Tests - -Fix test_wsgiref.testEnviron() to no longer depend on the environment -variables (don't fail if "X" variable is set). - -.. - -.. bpo: 37400 -.. date: 2019-06-25-16-02-43 -.. nonce: cx_EWv -.. section: Tests - -Fix test_os.test_chown(): use os.getgroups() rather than grp.getgrall() to -get groups. Rename also the test to test_chown_gid(). - -.. - -.. bpo: 37359 -.. date: 2019-06-24-10-47-07 -.. nonce: CkdtyO -.. section: Tests - -Add --cleanup option to python3 -m test to remove ``test_python_*`` -directories of previous failed jobs. Add "make cleantest" to run ``python3 --m test --cleanup``. - -.. - -.. bpo: 37362 -.. date: 2019-06-21-15-47-33 -.. nonce: D3xppx -.. section: Tests - -test_gdb no longer fails if it gets an "unexpected" message on stderr: it -now ignores stderr. The purpose of test_gdb is to test that python-gdb.py -commands work as expected, not to test gdb. - -.. - -.. bpo: 35998 -.. date: 2019-06-14-17-05-49 -.. nonce: yX82oD -.. section: Tests - -Avoid TimeoutError in test_asyncio: test_start_tls_server_1() - -.. - -.. bpo: 37278 -.. date: 2019-06-14-12-21-47 -.. nonce: z0HUOr -.. section: Tests - -Fix test_asyncio ProactorLoopCtrlC: join the thread to prevent leaking a -running thread and leaking a reference. - -.. - -.. bpo: 37261 -.. date: 2019-06-13-12-19-56 -.. nonce: NuKFVo -.. section: Tests - -Fix :func:`test.support.catch_unraisable_exception`: its __exit__() method -now ignores unraisable exception raised when clearing its ``unraisable`` -attribute. - -.. - -.. bpo: 37169 -.. date: 2019-06-07-12-23-15 -.. nonce: yfXTFg -.. section: Tests - -Rewrite ``_PyObject_IsFreed()`` unit tests. - -.. - -.. bpo: 37153 -.. date: 2019-06-04-18-30-39 -.. nonce: 711INB -.. section: Tests - -``test_venv.test_mutiprocessing()`` now explicitly calls -``pool.terminate()`` to wait until the pool completes. - -.. - -.. bpo: 28009 -.. date: 2019-04-11-07-59-43 -.. nonce: s85urF -.. section: Tests - -Modify the test_uuid logic to test when a program is available AND can be -used to obtain a MACADDR as basis for an UUID. Patch by M. Felt - -.. - -.. bpo: 37189 -.. date: 2019-06-17-09-40-59 -.. nonce: j5ebdT -.. section: Build - -Many ``PyRun_XXX()`` functions like :c:func:`PyRun_String` were no longer -exported in ``libpython38.dll`` by mistake. Export them again to fix the ABI -compatibiliy. - -.. - -.. bpo: 10945 -.. date: 2019-07-01-12-38-48 -.. nonce: s0YBHG -.. section: Windows - -Officially drop support for creating bdist_wininst installers on non-Windows -systems. - -.. - -.. bpo: 37369 -.. date: 2019-06-28-09-44-08 -.. nonce: 1iVpxq -.. section: Windows - -Fixes path for :data:`sys.executable` when running from the Microsoft Store. - -.. - -.. bpo: 37351 -.. date: 2019-06-20-12-50-32 -.. nonce: asTnVW -.. section: Windows - -Removes libpython38.a from standard Windows distribution. - -.. - -.. bpo: 35360 -.. date: 2019-06-18-09-05-08 -.. nonce: tdqSmo -.. section: Windows - -Update Windows builds to use SQLite 3.28.0. - -.. - -.. bpo: 37267 -.. date: 2019-06-13-04-15-51 -.. nonce: Ygo5ef -.. section: Windows - -On Windows, :func:`os.dup` no longer creates an inheritable fd when handling -a character file. - -.. - -.. bpo: 36779 -.. date: 2019-06-11-15-41-34 -.. nonce: 0TMw6f -.. section: Windows - -Ensure ``time.tzname`` is correct on Windows when the active code page is -set to CP_UTF7 or CP_UTF8. - -.. - -.. bpo: 34602 -.. date: 2019-07-02-01-06-47 -.. nonce: 10d4wl -.. section: macOS - -Avoid test suite failures on macOS by no longer calling resource.setrlimit -to increase the process stack size limit at runtime. The runtime change is -no longer needed since the interpreter is being built with a larger default -stack size. - -.. - -.. bpo: 35360 -.. date: 2019-06-18-08-58-30 -.. nonce: -CWbfy -.. section: macOS - -Update macOS installer to use SQLite 3.28.0. - -.. - -.. bpo: 34631 -.. date: 2019-06-18-00-30-40 -.. nonce: vSifcv -.. section: macOS - -Updated OpenSSL to 1.1.1c in macOS installer. - -.. - -.. bpo: 37325 -.. date: 2019-06-18-16-40-05 -.. nonce: GssOf1 -.. section: IDLE - -Fix tab focus traversal order for help source and custom run dialogs. - -.. - -.. bpo: 37321 -.. date: 2019-06-17-16-35-30 -.. nonce: zVTTGS -.. section: IDLE - -Both subprocess connection error messages now refer to the 'Startup failure' -section of the IDLE doc. - -.. - -.. bpo: 37177 -.. date: 2019-06-07-00-17-41 -.. nonce: voU6pQ -.. section: IDLE - -Properly 'attach' search dialogs to their main window so that they behave -like other dialogs and do not get hidden behind their main window. - -.. - -.. bpo: 37039 -.. date: 2019-06-04-23-27-33 -.. nonce: FN_fBf -.. section: IDLE - -Adjust "Zoom Height" to individual screens by momemtarily maximizing the -window on first use with a particular screen. Changing screen settings may -invalidate the saved height. While a window is maximized, "Zoom Height" has -no effect. - -.. - -.. bpo: 35763 -.. date: 2019-06-04-20-36-24 -.. nonce: 7XdoWz -.. section: IDLE - -Make calltip reminder about '/' meaning positional-only less obtrusive by -only adding it when there is room on the first line. - -.. - -.. bpo: 5680 -.. date: 2019-06-03-00-39-29 -.. nonce: VCQfOO -.. section: IDLE - -Add 'Run... Customized' to the Run menu to run a module with customized -settings. Any 'command line arguments' entered are added to sys.argv. One -can suppress the normal Shell main module restart. - -.. - -.. bpo: 36763 -.. date: 2019-06-28-15-49-16 -.. nonce: zrmgki -.. section: C API - -Add :func:`PyConfig_SetWideStringList` function. - -.. - -.. bpo: 28805 -.. date: 2019-06-14-14-03-51 -.. nonce: qZC0N_ -.. section: C API - -The :const:`METH_FASTCALL` calling convention has been documented. - -.. - -.. bpo: 37221 -.. date: 2019-06-12-11-45-36 -.. nonce: RhP1E7 -.. section: C API - -``tp_print`` is put back at the end of the ``PyTypeObject`` structure to -restore support for old code (in particular generated by Cython) setting -``tp_print = 0``. Note that ``tp_print`` will be removed entirely in Python -3.9. - -.. - -.. bpo: 37221 -.. date: 2019-06-11-02-50-38 -.. nonce: 4tClQT -.. section: C API - -The new function :c:func:`PyCode_NewWithPosOnlyArgs` allows to create code -objects like :c:func:`PyCode_New`, but with an extra *posonlyargcount* -parameter for indicating the number of positonal-only arguments. - -.. - -.. bpo: 37215 -.. date: 2019-06-10-15-32-34 -.. nonce: yzoNyU -.. section: C API - -Fix dtrace issue introduce by bpo-36842 - -.. - -.. bpo: 37191 -.. date: 2019-06-07-10-47-37 -.. nonce: iGL1_K -.. section: C API - -Python.h does not need compiler support for intermingled declarations (GCC's -``-Wdeclaration-after-statement``), which were added in 3.8.0 Beta 1. Note -that in Python 3.9, intermingled declarations will be needed again. - -.. - -.. bpo: 37170 -.. date: 2019-06-06-08-47-04 -.. nonce: hO_fpM -.. section: C API - -Fix the cast on error in :c:func:`PyLong_AsUnsignedLongLongMask()`. diff --git a/Misc/NEWS.d/3.8.0b3.rst b/Misc/NEWS.d/3.8.0b3.rst deleted file mode 100644 index 5e5225294ad8ce6e2482a739faf7eb508da8ecfe..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.8.0b3.rst +++ /dev/null @@ -1,437 +0,0 @@ -.. bpo: 37461 -.. date: 2019-07-16-08-11-00 -.. nonce: 1Ahz7O -.. release date: 2019-07-29 -.. section: Security - -Fix an infinite loop when parsing specially crafted email headers. Patch by -Abhilash Raj. - -.. - -.. bpo: 37593 -.. date: 2019-07-14-23-57-27 -.. nonce: yHSTwH -.. section: Core and Builtins - -Swap the positions of the *posonlyargs* and *args* parameters in the -constructor of :class:`ast.parameters` nodes. - -.. - -.. bpo: 36974 -.. date: 2019-06-11-12-59-38 -.. nonce: bVYmSA -.. section: Core and Builtins - -Implemented separate vectorcall functions for every calling convention of -builtin functions and methods. This improves performance for calls. - -.. - -.. bpo: 37697 -.. date: 2019-07-28-17-44-21 -.. nonce: 7UV5d0 -.. section: Library - -Syncronize ``importlib.metadata`` with `importlib_metadata 0.19 -`_, -improving handling of EGG-INFO files and fixing a crash when entry point -names contained colons. - -.. - -.. bpo: 37691 -.. date: 2019-07-26-22-30-01 -.. nonce: 1Li3rx -.. section: Library - -Let math.dist() accept coordinates as sequences (or iterables) rather than -just tuples. - -.. - -.. bpo: 37664 -.. date: 2019-07-24-18-27-44 -.. nonce: o-GYZC -.. section: Library - -Update wheels bundled with ensurepip (pip 19.2.1 and setuptools 41.0.1) - -.. - -.. bpo: 36324 -.. date: 2019-07-19-22-44-41 -.. nonce: 1VjywS -.. section: Library - -Make internal attributes for statistics.NormalDist() private. - -.. - -.. bpo: 37491 -.. date: 2019-07-17-06-54-43 -.. nonce: op0aMs -.. section: Library - -Fix ``IndexError`` when parsing email headers with unexpectedly ending -bare-quoted string value. Patch by Abhilash Raj. - -.. - -.. bpo: 37579 -.. date: 2019-07-13-10-59-43 -.. nonce: B1Tq9i -.. section: Library - -Return :exc:`NotImplemented` in Python implementation of ``__eq__`` for -:class:`~datetime.timedelta` and :class:`~datetime.time` when the other -object being compared is not of the same type to match C implementation. -Patch by Karthikeyan Singaravelan. - -.. - -.. bpo: 21478 -.. date: 2019-07-10-23-07-11 -.. nonce: cCw9rF -.. section: Library - -Record calls to parent when autospecced object is attached to a mock using -:func:`unittest.mock.attach_mock`. Patch by Karthikeyan Singaravelan. - -.. - -.. bpo: 37502 -.. date: 2019-07-08-03-15-04 -.. nonce: qZGC4g -.. section: Library - -pickle.loads() no longer raises TypeError when the buffers argument is set -to None - -.. - -.. bpo: 37520 -.. date: 2019-07-07-21-09-08 -.. nonce: Gg0KD6 -.. section: Library - -Correct behavior for zipfile.Path.parent when the path object identifies a -subdirectory. - -.. - -.. bpo: 18374 -.. date: 2019-07-05-21-46-45 -.. nonce: qgE0H3 -.. section: Library - -Fix the ``.col_offset`` attribute of nested :class:`ast.BinOp` instances -which had a too large value in some situations. - -.. - -.. bpo: 37421 -.. date: 2019-07-03-12-47-52 -.. nonce: gR5hC8 -.. section: Library - -Fix :func:`multiprocessing.util.get_temp_dir` finalizer: clear also the -'tempdir' configuration of the current process, so next call to -``get_temp_dir()`` will create a new temporary directory, rather than -reusing the removed temporary directory. - -.. - -.. bpo: 37481 -.. date: 2019-07-02-13-08-30 -.. nonce: hd5k09 -.. section: Library - -The distutils ``bdist_wininst`` command is deprecated in Python 3.8, use -``bdist_wheel`` (wheel packages) instead. - -.. - -.. bpo: 26967 -.. date: 2019-06-23-12-46-10 -.. nonce: xEuem1 -.. section: Library - -An :class:`~argparse.ArgumentParser` with ``allow_abbrev=False`` no longer -disables grouping of short flags, such as ``-vv``, but only disables -abbreviation of long flags as documented. Patch by Zac Hatfield-Dodds. - -.. - -.. bpo: 37347 -.. date: 2019-06-20-14-23-48 -.. nonce: Gf9yYI -.. section: Library - -:meth:`sqlite3.Connection.create_aggregate`, -:meth:`sqlite3.Connection.create_function`, -:meth:`sqlite3.Connection.set_authorizer`, -:meth:`sqlite3.Connection.set_progress_handler` -:meth:`sqlite3.Connection.set_trace_callback` methods lead to segfaults if -some of these methods are called twice with an equal object but not the -same. Now callbacks are stored more carefully. Patch by Aleksandr Balezin. - -.. - -.. bpo: 36564 -.. date: 2019-04-08-13-00-13 -.. nonce: _n67m_ -.. section: Library - -Fix infinite loop in email header folding logic that would be triggered when -an email policy's max_line_length is not long enough to include the required -markup and any values in the message. Patch by Paul Ganssle - -.. - -.. bpo: 32910 -.. date: 2019-07-25-10-30-32 -.. nonce: caLLAe -.. section: Documentation - -Remove implementation-specific behaviour of how venv's Deactivate works. - -.. - -.. bpo: 37284 -.. date: 2019-07-13-12-58-20 -.. nonce: rP8WpB -.. section: Documentation - -Add a brief note to indicate that any new ``sys.implementation`` required -attributes must go through the PEP process. - -.. - -.. bpo: 30088 -.. date: 2019-07-13-12-43-01 -.. nonce: CIcBjy -.. section: Documentation - -Documented that :class:`mailbox.Maildir` constructor doesn't attempt to -verify the maildir folder layout correctness. Patch by Sviatoslav Sydorenko. - -.. - -.. bpo: 37521 -.. date: 2019-07-12-15-09-56 -.. nonce: 7tiFR- -.. section: Documentation - -Fix `importlib` examples to insert any newly created modules via -importlib.util.module_from_spec() immediately into sys.modules instead of -after calling loader.exec_module(). - -Thanks to Benjamin Mintz for finding the bug. - -.. - -.. bpo: 37456 -.. date: 2019-07-06-17-51-36 -.. nonce: lgAQHn -.. section: Documentation - -Slash ('/') is now part of syntax. - -.. - -.. bpo: 37487 -.. date: 2019-07-06-17-19-26 -.. nonce: QagfZ5 -.. section: Documentation - -Fix PyList_GetItem index description to include 0. - -.. - -.. bpo: 37149 -.. date: 2019-07-06-02-19-02 -.. nonce: NumHn3 -.. section: Documentation - -Replace the dead link to the Tkinter 8.5 reference by John Shipman, New -Mexico Tech, with a link to the archive.org copy. - -.. - -.. bpo: 37478 -.. date: 2019-07-06-00-57-27 -.. nonce: B0ioLw -.. section: Documentation - -Added possible exceptions to the description of os.chdir(). - -.. - -.. bpo: 37558 -.. date: 2019-07-11-10-33-56 -.. nonce: SKHRsL -.. section: Tests - -Fix test_shared_memory_cleaned_after_process_termination name handling - -.. - -.. bpo: 37526 -.. date: 2019-07-09-12-33-18 -.. nonce: vmm5y7 -.. section: Tests - -Add :func:`test.support.catch_threading_exception`: context manager catching -:class:`threading.Thread` exception using :func:`threading.excepthook`. - -.. - -.. bpo: 37421 -.. date: 2019-07-08-10-11-36 -.. nonce: OY77go -.. section: Tests - -test_concurrent_futures now explicitly stops the ForkServer instance if it's -running. - -.. - -.. bpo: 37421 -.. date: 2019-07-05-14-47-55 -.. nonce: n8o2to -.. section: Tests - -multiprocessing tests now stop the ForkServer instance if it's running: -close the "alive" file descriptor to ask the server to stop and then remove -its UNIX address. - -.. - -.. bpo: 36044 -.. date: 2019-07-11-01-28-24 -.. nonce: gIgfiJ -.. section: Build - -Reduce the number of unit tests run for the PGO generation task. This -speeds up the task by a factor of about 15x. Running the full unit test -suite is slow. This change may result in a slightly less optimized build -since not as many code branches will be executed. If you are willing to -wait for the much slower build, the old behavior can be restored using -'./configure [..] PROFILE_TASK="-m test --pgo-extended"'. We make no -guarantees as to which PGO task set produces a faster build. Users who care -should run their own relevant benchmarks as results can depend on the -environment, workload, and compiler tool chain. - -.. - -.. bpo: 37672 -.. date: 2019-07-24-14-36-28 -.. nonce: uKEVHN -.. section: Windows - -Switch Windows Store package's pip to use bundled :file:`pip.ini` instead of -:envvar:`PIP_USER` variable. - -.. - -.. bpo: 37692 -.. date: 2019-07-27-15-14-20 -.. nonce: TRHGjD -.. section: IDLE - -Improve highlight config sample with example shell interaction and better -labels for shell elements. - -.. - -.. bpo: 37628 -.. date: 2019-07-26-17-51-13 -.. nonce: kX4AUF -.. section: IDLE - -Settings dialog no longer expands with font size. - -.. - -.. bpo: 37627 -.. date: 2019-07-20-23-33-53 -.. nonce: dQhUNB -.. section: IDLE - -Initialize the Customize Run dialog with the command line arguments most -recently entered before. The user can optionally edit before submitting -them. - -.. - -.. bpo: 33610 -.. date: 2019-07-18-10-11-36 -.. nonce: xYqMLg -.. section: IDLE - -Fix code context not showing the correct context when first toggled on. - -.. - -.. bpo: 37530 -.. date: 2019-07-11-00-05-31 -.. nonce: AuyCyD -.. section: IDLE - -Optimize code context to reduce unneeded background activity. Font and -highlight changes now occur along with text changes instead of after a -random delay. - -.. - -.. bpo: 27452 -.. date: 2019-07-03-22-47-44 -.. nonce: nePPLi -.. section: IDLE - -Cleanup ``config.py`` by inlining ``RemoveFile`` and simplifying the -handling of ``file`` in ``CreateConfigHandlers``. - -.. - -.. bpo: 17535 -.. date: 2019-06-13-01-07-20 -.. nonce: K8i2St -.. section: IDLE - -Add optional line numbers for IDLE editor windows. Windows open without -line numbers unless set otherwise in the General tab of the configuration -dialog. - -.. - -.. bpo: 26806 -.. date: 2019-06-10-22-48-50 -.. nonce: Zltkum -.. section: IDLE - -To compensate for stack frames added by IDLE and avoid possible problems -with low recursion limits, add 30 to limits in the user code execution -process. Subtract 30 when reporting recursion limits to make this addition -mostly transparent. - -.. - -.. bpo: 36390 -.. date: 2019-03-21-08-35-00 -.. nonce: OdDCGk -.. section: IDLE - -Gather Format menu functions into format.py. Combine paragraph.py, -rstrip.py, and format methods from editor.py. - -.. - -.. bpo: 37675 -.. date: 2019-07-24-16-20-54 -.. nonce: 951Cvf -.. section: Tools/Demos - -2to3 now works when run from a zipped standard library. diff --git a/Misc/NEWS.d/3.8.0b4.rst b/Misc/NEWS.d/3.8.0b4.rst deleted file mode 100644 index 99c914815e52da7c3b0c725264151876e19f2d0f..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.8.0b4.rst +++ /dev/null @@ -1,733 +0,0 @@ -.. bpo: 34155 -.. date: 2019-05-04-13-33-37 -.. nonce: MJll68 -.. release date: 2019-08-29 -.. section: Security - -Fix parsing of invalid email addresses with more than one ``@`` (e.g. -a@b@c.com.) to not return the part before 2nd ``@`` as valid email address. -Patch by maxking & jpic. - -.. - -.. bpo: 37947 -.. date: 2019-08-26-04-09-57 -.. nonce: mzAQtB -.. section: Core and Builtins - -Adjust correctly the recursion level in the symtable generation for named -expressions. Patch by Pablo Galindo. - -.. - -.. bpo: 37830 -.. date: 2019-08-17-18-41-59 -.. nonce: fNfMbz -.. section: Core and Builtins - -Fixed compilation of :keyword:`break` and :keyword:`continue` in the -:keyword:`finally` block when the corresponding :keyword:`try` block -contains :keyword:`return` with a non-constant value. - -.. - -.. bpo: 32912 -.. date: 2019-08-06-14-03-59 -.. nonce: UDwSMJ -.. section: Core and Builtins - -Reverted :issue:`32912`: emitting :exc:`SyntaxWarning` instead of -:exc:`DeprecationWarning` for invalid escape sequences in string and bytes -literals. - -.. - -.. bpo: 37757 -.. date: 2019-08-05-14-22-59 -.. nonce: lRv5HX -.. section: Core and Builtins - -:pep:`572`: As described in the PEP, assignment expressions now raise -:exc:`SyntaxError` when their interaction with comprehension scoping results -in an ambiguous target scope. - -The ``TargetScopeError`` subclass originally proposed by the PEP has been -removed in favour of just raising regular syntax errors for the disallowed -cases. - -.. - -.. bpo: 36311 -.. date: 2019-08-02-15-01-33 -.. nonce: uY5vt- -.. section: Core and Builtins - -Decoding bytes objects larger than 2GiB is faster and no longer fails when a -multibyte characters spans a chunk boundary. - -.. - -.. bpo: 37433 -.. date: 2019-06-27-15-01-14 -.. nonce: amNGqr -.. section: Core and Builtins - -Fix ``SyntaxError`` indicator printing too many spaces for multi-line -strings - by Anthony Sottile. - -.. - -.. bpo: 20523 -.. date: 2019-02-15-20-42-36 -.. nonce: rRLrvr -.. section: Core and Builtins - -``pdb.Pdb`` supports ~/.pdbrc in Windows 7. Patch by Tim Hopper and Dan -Lidral-Porter. - -.. - -.. bpo: 37834 -.. date: 2019-08-29-16-41-36 -.. nonce: FThnsh -.. section: Library - -Prevent shutil.rmtree exception when built on non-Windows system without fd -system call support, like older versions of macOS. - -.. - -.. bpo: 37965 -.. date: 2019-08-28-14-04-18 -.. nonce: 7xGE-C -.. section: Library - -Fix C compiler warning caused by distutils.ccompiler.CCompiler.has_function. - -.. - -.. bpo: 37960 -.. date: 2019-08-27-10-52-13 -.. nonce: CTY7Lw -.. section: Library - -``repr()`` of buffered and text streams now silences only expected -exceptions when get the value of "name" and "mode" attributes. - -.. - -.. bpo: 37951 -.. date: 2019-08-27-10-03-48 -.. nonce: MfRQgL -.. section: Library - -Most features of the subprocess module now work again in subinterpreters. -Only *preexec_fn* is restricted in subinterpreters. - -.. - -.. bpo: 36205 -.. date: 2019-08-27-03-53-26 -.. nonce: AfkGRl -.. section: Library - -Fix the rusage implementation of time.process_time() to correctly report the -sum of the system and user CPU time. - -.. - -.. bpo: 37950 -.. date: 2019-08-26-10-45-51 -.. nonce: -K1IKT -.. section: Library - -Fix :func:`ast.dump` when call with incompletely initialized node. - -.. - -.. bpo: 34679 -.. date: 2019-08-25-18-07-48 -.. nonce: HECzL7 -.. section: Library - -Restores instantiation of Windows IOCP event loops from the non-main thread. - -.. - -.. bpo: 36917 -.. date: 2019-08-25-14-56-42 -.. nonce: GBxdw2 -.. section: Library - -Add default implementation of the :meth:`ast.NodeVisitor.visit_Constant` -method which emits a deprecation warning and calls corresponding methody -``visit_Num()``, ``visit_Str()``, etc. - -.. - -.. bpo: 37798 -.. date: 2019-08-24-16-54-49 -.. nonce: 7mRQCk -.. section: Library - -Update test_statistics.py to verify that the statistics module works well -for both C and Python implementations. Patch by Dong-hee Na - -.. - -.. bpo: 26589 -.. date: 2019-08-23-00-55-19 -.. nonce: M1xyxG -.. section: Library - -Added a new status code to the http module: 451 -UNAVAILABLE_FOR_LEGAL_REASONS - -.. - -.. bpo: 37915 -.. date: 2019-08-22-16-13-27 -.. nonce: xyoZI5 -.. section: Library - -Fix a segmentation fault that appeared when comparing instances of -``datetime.timezone`` and ``datetime.tzinfo`` objects. Patch by Pablo -Galindo. - -.. - -.. bpo: 37868 -.. date: 2019-08-17-22-33-54 -.. nonce: hp64fi -.. section: Library - -Fix dataclasses.is_dataclass when given an instance that never raises -AttributeError in __getattr__. That is, an object that returns something -for __dataclass_fields__ even if it's not a dataclass. - -.. - -.. bpo: 37811 -.. date: 2019-08-14-21-41-07 -.. nonce: d1xYj7 -.. section: Library - -Fix ``socket`` module's ``socket.connect(address)`` function being unable to -establish connection in case of interrupted system call. The problem was -observed on all OSes which ``poll(2)`` system call can take only -non-negative integers and -1 as a timeout value. - -.. - -.. bpo: 21131 -.. date: 2019-08-14-15-34-23 -.. nonce: 0MMQRi -.. section: Library - -Fix ``faulthandler.register(chain=True)`` stack. faulthandler now allocates -a dedicated stack of ``SIGSTKSZ*2`` bytes, instead of just ``SIGSTKSZ`` -bytes. Calling the previous signal handler in faulthandler signal handler -uses more than ``SIGSTKSZ`` bytes of stack memory on some platforms. - -.. - -.. bpo: 37798 -.. date: 2019-08-14-13-51-24 -.. nonce: AmXrik -.. section: Library - -Add C fastpath for statistics.NormalDist.inv_cdf() Patch by Dong-hee Na - -.. - -.. bpo: 37819 -.. date: 2019-08-11-10-34-19 -.. nonce: LVJls- -.. section: Library - -Add Fraction.as_integer_ratio() to match the corresponding methods in bool, -int, float, and decimal. - -.. - -.. bpo: 37810 -.. date: 2019-08-10-12-33-27 -.. nonce: d4zbvB -.. section: Library - -Fix :mod:`difflib` ``?`` hint in diff output when dealing with tabs. Patch -by Anthony Sottile. - -.. - -.. bpo: 37772 -.. date: 2019-08-07-23-48-09 -.. nonce: hLCvdn -.. section: Library - -In ``zipfile.Path``, when adding implicit dirs, ensure that ancestral -directories are added and that duplicates are excluded. - -.. - -.. bpo: 28292 -.. date: 2019-08-04-11-47-58 -.. nonce: vkihH5 -.. section: Library - -Mark calendar.py helper functions as being private. The follows PEP 8 -guidance to maintain the style conventions in the module and it addresses a -known case of user confusion. - -.. - -.. bpo: 18049 -.. date: 2019-08-02-16-44-42 -.. nonce: OA4qBL -.. section: Library - -Add definition of THREAD_STACK_SIZE for AIX in Python/thread_pthread.h The -default thread stacksize caused crashes with the default recursion limit -Patch by M Felt - -.. - -.. bpo: 37738 -.. date: 2019-08-01-17-11-16 -.. nonce: A3WWcT -.. section: Library - -Fix the implementation of curses ``addch(str, color_pair)``: pass the color -pair to ``setcchar()``, instead of always passing 0 as the color pair. - -.. - -.. bpo: 37723 -.. date: 2019-07-31-16-49-01 -.. nonce: zq6tw8 -.. section: Library - -Fix performance regression on regular expression parsing with huge character -sets. Patch by Yann Vaginay. - -.. - -.. bpo: 32178 -.. date: 2019-07-30-22-41-05 -.. nonce: X-IFLe -.. section: Library - -Fix IndexError in :mod:`email` package when trying to parse invalid address -fields starting with ``:``. - -.. - -.. bpo: 37685 -.. date: 2019-07-28-22-25-25 -.. nonce: _3bN9f -.. section: Library - -Fixed comparisons of :class:`datetime.timedelta` and -:class:`datetime.timezone`. - -.. - -.. bpo: 37695 -.. date: 2019-07-27-20-21-03 -.. nonce: QANdvg -.. section: Library - -Correct :func:`curses.unget_wch` error message. Patch by Anthony Sottile. - -.. - -.. bpo: 37354 -.. date: 2019-07-25-10-28-40 -.. nonce: RT3_3H -.. section: Library - -Make Activate.ps1 Powershell script static to allow for signing it. - -.. - -.. bpo: 37664 -.. date: 2019-07-24-18-27-44 -.. nonce: o-GYZC -.. section: Library - -Update wheels bundled with ensurepip (pip 19.2.3 and setuptools 41.2.0) - -.. - -.. bpo: 37642 -.. date: 2019-07-21-20-59-31 -.. nonce: L61Bvy -.. section: Library - -Allowed the pure Python implementation of :class:`datetime.timezone` to -represent sub-minute offsets close to minimum and maximum boundaries, -specifically in the ranges (23:59, 24:00) and (-23:59, 24:00). Patch by -Ngalim Siregar - -.. - -.. bpo: 16970 -.. date: 2019-07-19-01-46-56 -.. nonce: GEASf5 -.. section: Library - -Adding a value error when an invalid value in passed to nargs Patch by -Robert Leenders - -.. - -.. bpo: 37587 -.. date: 2019-07-13-16-02-48 -.. nonce: fd-1aF -.. section: Library - -Make json.loads faster for long strings. (Patch by Marco Paolini) - -.. - -.. bpo: 18378 -.. date: 2019-07-13-13-40-12 -.. nonce: NHcojp -.. section: Library - -Recognize "UTF-8" as a valid value for LC_CTYPE in locale._parse_localename. - -.. - -.. bpo: 37531 -.. date: 2019-07-09-19-38-26 -.. nonce: GX7s8S -.. section: Library - -"python3 -m test -jN --timeout=TIMEOUT" now kills a worker process if it -runs longer than *TIMEOUT* seconds. - -.. - -.. bpo: 37482 -.. date: 2019-07-09-11-20-21 -.. nonce: auzvev -.. section: Library - -Fix serialization of display name in originator or destination address -fields with both encoded words and special chars. - -.. - -.. bpo: 37372 -.. date: 2019-06-22-12-30-00 -.. nonce: kIKqZ6 -.. section: Library - -Fix error unpickling datetime.time objects from Python 2 with seconds>=24. -Patch by Justin Blanchard. - -.. - -.. bpo: 37085 -.. date: 2019-06-18-16-29-31 -.. nonce: GeYaD6 -.. section: Library - -Add the optional Linux SocketCAN Broadcast Manager constants, used as flags -to configure the BCM behaviour, in the socket module. Patch by Karl Ding. - -.. - -.. bpo: 36871 -.. date: 2019-05-12-12-58-37 -.. nonce: 6xiEHZ -.. section: Library - -Ensure method signature is used instead of constructor signature of a class -while asserting mock object against method calls. Patch by Karthikeyan -Singaravelan. - -.. - -.. bpo: 36582 -.. date: 2019-05-07-17-42-36 -.. nonce: L_dxR6 -.. section: Library - -Fix ``UserString.encode()`` to correctly return ``bytes`` rather than a -``UserString`` instance. - -.. - -.. bpo: 34775 -.. date: 2018-09-23-03-18-52 -.. nonce: vHeuHk -.. section: Library - -Division handling of PurePath now returns NotImplemented instead of raising -a TypeError when passed something other than an instance of str or PurePath. -Patch by Roger Aiudi. - -.. - -.. bpo: 37979 -.. date: 2019-08-29-10-40-05 -.. nonce: TAUx_E -.. section: Documentation - -Added a link to dateutil.parser.isoparse in the datetime.fromisoformat -documentation. Patch by Paul Ganssle - -.. - -.. bpo: 37759 -.. date: 2019-08-04-19-20-58 -.. nonce: EHRF4i -.. section: Documentation - -Beginning edits to Whatsnew 3.8 - -.. - -.. bpo: 37726 -.. date: 2019-07-31-11-40-06 -.. nonce: h-3o9a -.. section: Documentation - -Stop recommending getopt in the tutorial for command line argument parsing -and promote argparse. - -.. - -.. bpo: 37256 -.. date: 2019-07-16-14-48-12 -.. nonce: qJTrBb -.. section: Documentation - -Fix wording of arguments for :class:`Request` in :mod:`urllib.request` - -.. - -.. bpo: 37004 -.. date: 2019-05-22-04-30-07 -.. nonce: BRgxrt -.. section: Documentation - -In the documentation for difflib, a note was added explicitly warning that -the results of SequenceMatcher's ratio method may depend on the order of the -input strings. - -.. - -.. bpo: 36487 -.. date: 2019-04-02-19-23-00 -.. nonce: Jg6-MG -.. section: Documentation - -Make C-API docs clear about what the "main" interpreter is. - -.. - -.. bpo: 37805 -.. date: 2019-08-25-19-51-46 -.. nonce: Kl1sti -.. section: Tests - -Add tests for json.dump(..., skipkeys=True). Patch by Dong-hee Na. - -.. - -.. bpo: 37707 -.. date: 2019-07-29-11-36-16 -.. nonce: Sm-dGk -.. section: Build - -Mark some individual tests to skip when --pgo is used. The tests marked -increase the PGO task time significantly and likely don't help improve -optimization of the final executable. - -.. - -.. bpo: 37549 -.. date: 2019-08-22-09-04-44 -.. nonce: TpKI3M -.. section: Windows - -:func:`os.dup` no longer fails for standard streams on Windows 7. - -.. - -.. bpo: 1311 -.. date: 2019-08-21-12-58-18 -.. nonce: BoW1wU -.. section: Windows - -The ``nul`` file on Windows now returns True from :func:`~os.path.exists` -and a valid result from :func:`os.stat` with ``S_IFCHR`` set. - -.. - -.. bpo: 9949 -.. date: 2019-08-14-13-40-15 -.. nonce: zW45Ks -.. section: Windows - -Enable support for following symlinks in :func:`os.realpath`. - -.. - -.. bpo: 37834 -.. date: 2019-08-12-12-00-24 -.. nonce: VB2QVj -.. section: Windows - -Treat all name surrogate reparse points on Windows in :func:`os.lstat` and -other reparse points as regular files in :func:`os.stat`. - -.. - -.. bpo: 36266 -.. date: 2019-08-08-18-05-27 -.. nonce: x4eZU3 -.. section: Windows - -Add the module name in the formatted error message when DLL load fail -happens during module import in ``_PyImport_FindSharedFuncptrWindows()``. -Patch by Srinivas Nyayapati. - -.. - -.. bpo: 25172 -.. date: 2019-08-06-18-09-18 -.. nonce: Akreij -.. section: Windows - -Trying to import the :mod:`crypt` module on Windows will result in an -:exc:`ImportError` with a message explaining that the module isn't supported -on Windows. On other platforms, if the underlying ``_crypt`` module is not -available, the ImportError will include a message explaining the problem. - -.. - -.. bpo: 37778 -.. date: 2019-08-06-13-54-12 -.. nonce: AY1XhH -.. section: Windows - -Fixes the icons used for file associations to the Microsoft Store package. - -.. - -.. bpo: 37734 -.. date: 2019-08-06-09-35-12 -.. nonce: EoJ9Nh -.. section: Windows - -Fix use of registry values to launch Python from Microsoft Store app. - -.. - -.. bpo: 28269 -.. date: 2019-05-05-05-23-34 -.. nonce: -MOHI7 -.. section: Windows - -Replace use of :c:func:`strcasecmp` for the system function -:c:func:`_stricmp`. Patch by Minmin Gong. - -.. - -.. bpo: 18049 -.. date: 2019-07-13-15-58-18 -.. nonce: MklhQQ -.. section: macOS - -Increase the default stack size of threads from 5MB to 16MB on macOS, to -match the stack size of the main thread. This avoids crashes on deep -recursion in threads. - -.. - -.. bpo: 37824 -.. date: 2019-08-26-00-41-53 -.. nonce: YY5jAI -.. section: IDLE - -Properly handle user input warnings in IDLE shell. Cease turning -SyntaxWarnings into SyntaxErrors. - -.. - -.. bpo: 37929 -.. date: 2019-08-24-22-00-33 -.. nonce: jb7523 -.. section: IDLE - -IDLE Settings dialog now closes properly when there is no shell window. - -.. - -.. bpo: 37849 -.. date: 2019-08-14-09-43-15 -.. nonce: -bcYF3 -.. section: IDLE - -Fixed completions list appearing too high or low when shown above the -current line. - -.. - -.. bpo: 36419 -.. date: 2019-08-04-17-10-01 -.. nonce: TJZqOc -.. section: IDLE - -Refactor IDLE autocomplete and improve testing. - -.. - -.. bpo: 37748 -.. date: 2019-08-04-15-27-50 -.. nonce: 0vf6pg -.. section: IDLE - -Reorder the Run menu. Put the most common choice, Run Module, at the top. - -.. - -.. bpo: 37942 -.. date: 2019-08-24-12-11-30 -.. nonce: 7H8N9a -.. section: Tools/Demos - -Improve ArgumentClinic converter for floats. - -.. - -.. bpo: 37034 -.. date: 2019-05-27-16-13-08 -.. nonce: zbTgy8 -.. section: Tools/Demos - -Argument Clinic now uses the argument name on errors with keyword-only -argument instead of their position. Patch contributed by Rémi Lapeyre. - -.. - -.. bpo: 36763 -.. date: 2019-08-23-18-45-11 -.. nonce: q3Kh8Z -.. section: C API - -Options added by ``PySys_AddXOption()`` are now handled the same way than -``PyConfig.xoptions`` and command line ``-X`` options. - -.. - -.. bpo: 37926 -.. date: 2019-08-23-11-35-55 -.. nonce: hnI5IQ -.. section: C API - -Fix a crash in ``PySys_SetArgvEx(0, NULL, 0)``. diff --git a/Misc/NEWS.d/3.8.0rc1.rst b/Misc/NEWS.d/3.8.0rc1.rst deleted file mode 100644 index f7c3c9984c09e1f8d79d9550dd9ba2b1e4727057..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.8.0rc1.rst +++ /dev/null @@ -1,1349 +0,0 @@ -.. bpo: 38243 -.. date: 2019-09-25-13-21-09 -.. nonce: 1pfz24 -.. release date: 2019-10-01 -.. section: Security - -Escape the server title of :class:`xmlrpc.server.DocXMLRPCServer` when -rendering the document page as HTML. (Contributed by Dong-hee Na in -:issue:`38243`.) - -.. - -.. bpo: 38174 -.. date: 2019-09-23-21-02-46 -.. nonce: MeWuJd -.. section: Security - -Update vendorized expat library version to 2.2.8, which resolves -CVE-2019-15903. - -.. - -.. bpo: 37764 -.. date: 2019-08-27-01-13-05 -.. nonce: qv67PQ -.. section: Security - -Fixes email._header_value_parser.get_unstructured going into an infinite -loop for a specific case in which the email header does not have trailing -whitespace, and the case in which it contains an invalid encoded word. Patch -by Ashwin Ramaswami. - -.. - -.. bpo: 38006 -.. date: 2019-09-30-09-33-21 -.. nonce: UYlJum -.. section: Core and Builtins - -Fix a bug due to the interaction of weakrefs and the cyclic garbage -collector. We must clear any weakrefs in garbage in order to prevent their -callbacks from executing and causing a crash. - -.. - -.. bpo: 38317 -.. date: 2019-09-30-00-56-21 -.. nonce: pmqlIQ -.. section: Core and Builtins - -Fix warnings options priority: ``PyConfig.warnoptions`` has the highest -priority, as stated in the :pep:`587`. - -.. - -.. bpo: 36871 -.. date: 2019-09-24-18-45-46 -.. nonce: p47knk -.. section: Core and Builtins - -Improve error handling for the assert_has_calls and assert_has_awaits -methods of mocks. Fixed a bug where any errors encountered while binding the -expected calls to the mock's spec were silently swallowed, leading to -misleading error output. - -.. - -.. bpo: 38236 -.. date: 2019-09-20-19-06-23 -.. nonce: eQ0Tmj -.. section: Core and Builtins - -Python now dumps path configuration if it fails to import the Python codecs -of the filesystem and stdio encodings. - -.. - -.. bpo: 38013 -.. date: 2019-09-12-19-50-01 -.. nonce: I7btD0 -.. section: Core and Builtins - -Allow to call ``async_generator_athrow().throw(...)`` even for non-started -async generator helper. It fixes annoying warning at the end of -:func:`asyncio.run` call. - -.. - -.. bpo: 38124 -.. date: 2019-09-12-00-14-01 -.. nonce: n6E0H7 -.. section: Core and Builtins - -Fix an off-by-one error in PyState_AddModule that could cause out-of-bounds -memory access. - -.. - -.. bpo: 38005 -.. date: 2019-09-02-20-00-31 -.. nonce: e7VsTA -.. section: Core and Builtins - -Fixed comparing and creating of InterpreterID and ChannelID. - -.. - -.. bpo: 37994 -.. date: 2019-08-31-11-13-25 -.. nonce: Rj6S4j -.. section: Core and Builtins - -Fixed silencing arbitrary errors if an attribute lookup fails in several -sites. Only AttributeError should be silenced. - -.. - -.. bpo: 37990 -.. date: 2019-08-31-09-22-33 -.. nonce: WDY2f- -.. section: Core and Builtins - -Fix elapsed time in gc stats was not printed correctly. This bug was a -regression in 3.8b4. - -.. - -.. bpo: 37966 -.. date: 2019-08-27-21-21-36 -.. nonce: 5OBLez -.. section: Core and Builtins - -The implementation of :func:`~unicodedata.is_normalized` has been greatly -sped up on strings that aren't normalized, by implementing the full -normalization-quick-check algorithm from the Unicode standard. - -.. - -.. bpo: 20490 -.. date: 2019-08-15-12-48-36 -.. nonce: -hXeEn -.. section: Core and Builtins - -Improve import error message for partially initialized module on circular -``from`` imports - by Anthony Sottile. - -.. - -.. bpo: 37409 -.. date: 2019-08-06-23-39-05 -.. nonce: 1qwzn2 -.. section: Core and Builtins - -Ensure explicit relative imports from interactive sessions and scripts -(having no parent package) always raise ImportError, rather than treating -the current module as the package. Patch by Ben Lewis. - -.. - -.. bpo: 37619 -.. date: 2019-07-18-11-50-49 -.. nonce: X6Lulo -.. section: Core and Builtins - -When adding a wrapper descriptor from one class to a different class (for -example, setting ``__add__ = str.__add__`` on an ``int`` subclass), an -exception is correctly raised when the operator is called. - -.. - -.. bpo: 30773 -.. date: 2018-06-07-01-01-20 -.. nonce: C31rVE -.. section: Core and Builtins - -Prohibit parallel running of aclose() / asend() / athrow(). Fix ag_running -to reflect the actual running status of the AG. - -.. - -.. bpo: 38319 -.. date: 2019-09-30-22-06-33 -.. nonce: 5QjiDa -.. section: Library - -sendfile() used in socket and shutil modules was raising OverflowError for -files >= 2GiB on 32-bit architectures. (patch by Giampaolo Rodola) - -.. - -.. bpo: 38242 -.. date: 2019-09-30-00-15-27 -.. nonce: uPIyAc -.. section: Library - -Revert the new asyncio Streams API - -.. - -.. bpo: 38019 -.. date: 2019-09-29-13-50-24 -.. nonce: 6MoOE3 -.. section: Library - -Correctly handle pause/resume reading of closed asyncio unix pipe. - -.. - -.. bpo: 38163 -.. date: 2019-09-28-20-16-40 -.. nonce: x51-vK -.. section: Library - -Child mocks will now detect their type as either synchronous or -asynchronous, asynchronous child mocks will be AsyncMocks and synchronous -child mocks will be either MagicMock or Mock (depending on their parent -type). - -.. - -.. bpo: 38161 -.. date: 2019-09-27-16-31-28 -.. nonce: zehai1 -.. section: Library - -Removes _AwaitEvent from AsyncMock. - -.. - -.. bpo: 38216 -.. date: 2019-09-27-15-24-45 -.. nonce: -7yvZR -.. section: Library - -Allow the rare code that wants to send invalid http requests from the -`http.client` library a way to do so. The fixes for bpo-30458 led to -breakage for some projects that were relying on this ability to test their -own behavior in the face of bad requests. - -.. - -.. bpo: 38108 -.. date: 2019-09-25-21-37-02 -.. nonce: Jr9HU6 -.. section: Library - -Any synchronous magic methods on an AsyncMock now return a MagicMock. Any -asynchronous magic methods on a MagicMock now return an AsyncMock. - -.. - -.. bpo: 38248 -.. date: 2019-09-22-13-05-36 -.. nonce: Yo3N_1 -.. section: Library - -asyncio: Fix inconsistent immediate Task cancellation - -.. - -.. bpo: 38237 -.. date: 2019-09-20-14-27-17 -.. nonce: xRUZbx -.. section: Library - -The arguments for the builtin pow function are more descriptive. They can -now also be passed in as keywords. - -.. - -.. bpo: 38191 -.. date: 2019-09-17-12-28-27 -.. nonce: 1TU0HV -.. section: Library - -Constructors of :class:`~typing.NamedTuple` and :class:`~typing.TypedDict` -types now accept arbitrary keyword argument names, including "cls", "self", -"typename", "_typename", "fields" and "_fields". Passing positional -arguments by keyword is deprecated. - -.. - -.. bpo: 38185 -.. date: 2019-09-16-19-12-57 -.. nonce: zYWppY -.. section: Library - -Fixed case-insensitive string comparison in :class:`sqlite3.Row` indexing. - -.. - -.. bpo: 38136 -.. date: 2019-09-16-09-54-42 -.. nonce: MdI-Zb -.. section: Library - -Changes AsyncMock call count and await count to be two different counters. -Now await count only counts when a coroutine has been awaited, not when it -has been called, and vice-versa. Update the documentation around this. - -.. - -.. bpo: 37828 -.. date: 2019-09-15-21-31-18 -.. nonce: gLLDX7 -.. section: Library - -Fix default mock name in :meth:`unittest.mock.Mock.assert_called` -exceptions. Patch by Abraham Toriz Cruz. - -.. - -.. bpo: 38175 -.. date: 2019-09-15-10-30-33 -.. nonce: 61XlUv -.. section: Library - -Fix a memory leak in comparison of :class:`sqlite3.Row` objects. - -.. - -.. bpo: 33936 -.. date: 2019-09-14-10-34-00 -.. nonce: 8wCI_n -.. section: Library - -_hashlib no longer calls obsolete OpenSSL initialization function with -OpenSSL 1.1.0+. - -.. - -.. bpo: 34706 -.. date: 2019-09-13-14-54-33 -.. nonce: HWVpOY -.. section: Library - -Preserve subclassing in inspect.Signature.from_callable. - -.. - -.. bpo: 38153 -.. date: 2019-09-13-12-18-51 -.. nonce: nHAbuJ -.. section: Library - -Names of hashing algorithms frome OpenSSL are now normalized to follow -Python's naming conventions. For example OpenSSL uses sha3-512 instead of -sha3_512 or blake2b512 instead of blake2b. - -.. - -.. bpo: 38115 -.. date: 2019-09-13-09-24-58 -.. nonce: BOO-Y1 -.. section: Library - -Fix a bug in dis.findlinestarts() where it would return invalid bytecode -offsets. Document that a code object's co_lnotab can contain invalid -bytecode offsets. - -.. - -.. bpo: 38148 -.. date: 2019-09-13-08-55-43 -.. nonce: Lnww6D -.. section: Library - -Add slots to :mod:`asyncio` transport classes, which can reduce memory -usage. - -.. - -.. bpo: 36991 -.. date: 2019-09-12-14-52-38 -.. nonce: 1OcSm8 -.. section: Library - -Fixes a potential incorrect AttributeError exception escaping -ZipFile.extract() in some unsupported input error situations. - -.. - -.. bpo: 38134 -.. date: 2019-09-12-13-18-55 -.. nonce: gXJTbP -.. section: Library - -Remove obsolete copy of PBKDF2_HMAC_fast. All supported OpenSSL versions -contain a fast implementation. - -.. - -.. bpo: 38132 -.. date: 2019-09-12-12-47-35 -.. nonce: KSFx1F -.. section: Library - -The OpenSSL hashlib wrapper uses a simpler implementation. Several Macros -and pointless caches are gone. The hash name now comes from OpenSSL's EVP. -The algorithm name stays the same, except it is now always lower case. - -.. - -.. bpo: 38008 -.. date: 2019-09-12-10-47-34 -.. nonce: sH74Iy -.. section: Library - -Fix parent class check in protocols to correctly identify the module that -provides a builtin protocol, instead of assuming they all come from the -:mod:`collections.abc` module - -.. - -.. bpo: 37405 -.. date: 2019-09-11-20-27-41 -.. nonce: MG5xiY -.. section: Library - -Fixed regression bug for socket.getsockname() for non-CAN_ISOTP AF_CAN -address family sockets by returning a 1-tuple instead of string. - -.. - -.. bpo: 38121 -.. date: 2019-09-11-16-54-57 -.. nonce: SrSDzB -.. section: Library - -Update parameter names on functions in importlib.metadata matching the -changes in the 0.22 release of importlib_metadata. - -.. - -.. bpo: 38110 -.. date: 2019-09-11-14-49-20 -.. nonce: A19Y-q -.. section: Library - -The os.closewalk() implementation now uses the libc fdwalk() API on -platforms where it is available. - -.. - -.. bpo: 38093 -.. date: 2019-09-11-14-45-30 -.. nonce: yQ6k7y -.. section: Library - -Fixes AsyncMock so it doesn't crash when used with AsyncContextManagers or -AsyncIterators. - -.. - -.. bpo: 37488 -.. date: 2019-09-11-11-44-16 -.. nonce: S8CJUL -.. section: Library - -Add warning to :meth:`datetime.utctimetuple`, :meth:`datetime.utcnow` and -:meth:`datetime.utcfromtimestamp` . - -.. - -.. bpo: 38086 -.. date: 2019-09-10-11-42-59 -.. nonce: w5TlG- -.. section: Library - -Update importlib.metadata with changes from `importlib_metadata 0.21 -`_. - -.. - -.. bpo: 37251 -.. date: 2019-09-10-10-59-50 -.. nonce: 8zn2o3 -.. section: Library - -Remove `__code__` check in AsyncMock that incorrectly evaluated function -specs as async objects but failed to evaluate classes with `__await__` but -no `__code__` attribute defined as async objects. - -.. - -.. bpo: 38037 -.. date: 2019-09-09-18-39-23 -.. nonce: B0UgFU -.. section: Library - -Fix reference counters in the :mod:`signal` module. - -.. - -.. bpo: 38066 -.. date: 2019-09-09-14-39-47 -.. nonce: l9mWv- -.. section: Library - -Hide internal asyncio.Stream methods: feed_eof(), feed_data(), -set_exception() and set_transport(). - -.. - -.. bpo: 38059 -.. date: 2019-09-08-11-36-50 -.. nonce: 8SA6co -.. section: Library - -inspect.py now uses sys.exit() instead of exit() - -.. - -.. bpo: 37953 -.. date: 2019-09-06-17-40-34 -.. nonce: db5FQq -.. section: Library - -In :mod:`typing`, improved the ``__hash__`` and ``__eq__`` methods for -:class:`ForwardReferences`. - -.. - -.. bpo: 38026 -.. date: 2019-09-04-20-34-14 -.. nonce: 0LLRX- -.. section: Library - -Fixed :func:`inspect.getattr_static` used ``isinstance`` while it should -avoid dynamic lookup. - -.. - -.. bpo: 38010 -.. date: 2019-09-02-14-30-39 -.. nonce: JOnz9Z -.. section: Library - -In ``importlib.metadata`` sync with ``importlib_metadata`` 0.20, clarifying -behavior of ``files()`` and fixing issue where only one requirement was -returned for ``requires()`` on ``dist-info`` packages. - -.. - -.. bpo: 38006 -.. date: 2019-09-02-13-37-27 -.. nonce: Y7vA0Q -.. section: Library - -weakref.WeakValueDictionary defines a local remove() function used as -callback for weak references. This function was created with a closure. -Modify the implementation to avoid the closure. - -.. - -.. bpo: 34410 -.. date: 2019-08-31-01-52-59 -.. nonce: 7KbWZQ -.. section: Library - -Fixed a crash in the :func:`tee` iterator when re-enter it. RuntimeError is -now raised in this case. - -.. - -.. bpo: 37140 -.. date: 2019-08-30-11-21-10 -.. nonce: cFAX-a -.. section: Library - -Fix a ctypes regression of Python 3.8. When a ctypes.Structure is passed by -copy to a function, ctypes internals created a temporary object which had -the side effect of calling the structure finalizer (__del__) twice. The -Python semantics requires a finalizer to be called exactly once. Fix ctypes -internals to no longer call the finalizer twice. - -.. - -.. bpo: 37972 -.. date: 2019-08-28-21-40-12 -.. nonce: kP-n4L -.. section: Library - -Subscripts to the `unittest.mock.call` objects now receive the same chaining -mechanism as any other custom attributes, so that the following usage no -longer raises a `TypeError`: - -call().foo().__getitem__('bar') - -Patch by blhsing - -.. - -.. bpo: 22347 -.. date: 2019-08-27-01-03-26 -.. nonce: _TRpYr -.. section: Library - -Update mimetypes.guess_type to allow proper parsing of URLs with only a host -name. Patch by Dong-hee Na. - -.. - -.. bpo: 37885 -.. date: 2019-08-19-10-31-41 -.. nonce: 4Nc9sp -.. section: Library - -venv: Don't generate unset variable warning on deactivate. - -.. - -.. bpo: 37785 -.. date: 2019-08-07-14-49-22 -.. nonce: y7OlT8 -.. section: Library - -Fix xgettext warnings in :mod:`argparse`. - -.. - -.. bpo: 11953 -.. date: 2019-07-29-21-39-45 -.. nonce: 4Hpwf9 -.. section: Library - -Completing WSA* error codes in :mod:`socket`. - -.. - -.. bpo: 37424 -.. date: 2019-07-04-13-00-20 -.. nonce: 0i1MR- -.. section: Library - -Fixes a possible hang when using a timeout on `subprocess.run()` while -capturing output. If the child process spawned its own children or -otherwise connected its stdout or stderr handles with another process, we -could hang after the timeout was reached and our child was killed when -attempting to read final output from the pipes. - -.. - -.. bpo: 37212 -.. date: 2019-06-22-22-00-35 -.. nonce: Zhv-tq -.. section: Library - -:func:`unittest.mock.call` now preserves the order of keyword arguments in -repr output. Patch by Karthikeyan Singaravelan. - -.. - -.. bpo: 37305 -.. date: 2019-06-18-13-59-55 -.. nonce: fGzWlP -.. section: Library - -Add .webmanifest -> application/manifest+json to list of recognized file -types and content type headers - -.. - -.. bpo: 21872 -.. date: 2019-06-12-08-56-22 -.. nonce: V9QGGN -.. section: Library - -Fix :mod:`lzma`: module decompresses data incompletely. When decompressing a -FORMAT_ALONE format file, and it doesn't have the end marker, sometimes the -last one to dozens bytes can't be output. Patch by Ma Lin. - -.. - -.. bpo: 37206 -.. date: 2019-06-09-22-25-03 -.. nonce: 2WBg4q -.. section: Library - -Default values which cannot be represented as Python objects no longer -improperly represented as ``None`` in function signatures. - -.. - -.. bpo: 12144 -.. date: 2019-06-08-23-26-58 -.. nonce: Z7mz-q -.. section: Library - -Ensure cookies with ``expires`` attribute are handled in -:meth:`CookieJar.make_cookies`. - -.. - -.. bpo: 31163 -.. date: 2019-05-26-16-34-53 -.. nonce: 21A802 -.. section: Library - -pathlib.Path instance's rename and replace methods now return the new Path -instance. - -.. - -.. bpo: 25068 -.. date: 2019-05-22-04-52-35 -.. nonce: vR_rC- -.. section: Library - -:class:`urllib.request.ProxyHandler` now lowercases the keys of the passed -dictionary. - -.. - -.. bpo: 21315 -.. date: 2019-05-19-10-48-46 -.. nonce: PgXVqF -.. section: Library - -Email headers containing RFC2047 encoded words are parsed despite the -missing whitespace, and a defect registered. Also missing trailing -whitespace after encoded words is now registered as a defect. - -.. - -.. bpo: 36250 -.. date: 2019-03-09-16-04-12 -.. nonce: tSK4N1 -.. section: Library - -Ignore ``ValueError`` from ``signal`` with ``interaction`` in non-main -thread. - -.. - -.. bpo: 35168 -.. date: 2019-01-22-09-23-20 -.. nonce: UGv2yW -.. section: Library - -:attr:`shlex.shlex.punctuation_chars` is now a read-only property. - -.. - -.. bpo: 20504 -.. date: 2018-11-21-18-05-50 -.. nonce: kG0ub5 -.. section: Library - -Fixes a bug in :mod:`cgi` module when a multipart/form-data request has no -`Content-Length` header. - -.. - -.. bpo: 34519 -.. date: 2018-08-27-15-44-50 -.. nonce: cPlH1h -.. section: Library - -Add additional aliases for HP Roman 8. Patch by Michael Osipov. - -.. - -.. bpo: 26868 -.. date: 2019-09-07-15-55-46 -.. nonce: Raw0Gd -.. section: Documentation - -Fix example usage of :c:func:`PyModule_AddObject` to properly handle errors. - -.. - -.. bpo: 36797 -.. date: 2019-09-05-14-47-51 -.. nonce: KN9Ga5 -.. section: Documentation - -Fix a dead link in the distutils API Reference. - -.. - -.. bpo: 37977 -.. date: 2019-08-29-14-38-01 -.. nonce: pML-UI -.. section: Documentation - -Warn more strongly and clearly about pickle insecurity - -.. - -.. bpo: 37937 -.. date: 2019-08-24-12-59-06 -.. nonce: F7fHbt -.. section: Documentation - -Mention ``frame.f_trace`` in :func:`sys.settrace` docs. - -.. - -.. bpo: 36260 -.. date: 2019-06-04-09-29-00 -.. nonce: WrGuc- -.. section: Documentation - -Add decompression pitfalls to zipfile module documentation. - -.. - -.. bpo: 36960 -.. date: 2019-05-18-16-25-44 -.. nonce: xEKHXj -.. section: Documentation - -Restructured the :mod:`datetime` docs in the interest of making them more -user-friendly and improving readability. Patch by Brad Solomon. - -.. - -.. bpo: 23460 -.. date: 2019-02-14-07-12-48 -.. nonce: Iqiqtm -.. section: Documentation - -The documentation for decimal string formatting using the `:g` specifier has -been updated to reflect the correct exponential notation cutoff point. -Original patch contributed by Tuomas Suutari. - -.. - -.. bpo: 35803 -.. date: 2019-01-21-14-30-59 -.. nonce: yae6Lq -.. section: Documentation - -Document and test that ``tempfile`` functions may accept a :term:`path-like -object` for the ``dir`` argument. Patch by Anthony Sottile. - -.. - -.. bpo: 33944 -.. date: 2018-10-26-18-10-29 -.. nonce: V1YeOA -.. section: Documentation - -Added a note about the intended use of code in .pth files. - -.. - -.. bpo: 34293 -.. date: 2018-07-31-15-38-26 -.. nonce: yHupAL -.. section: Documentation - -Fix the Doc/Makefile regarding PAPER environment variable and PDF builds - -.. - -.. bpo: 38239 -.. date: 2019-09-26-15-48-36 -.. nonce: MfoVzY -.. section: Tests - -Fix test_gdb for Link Time Optimization (LTO) builds. - -.. - -.. bpo: 38275 -.. date: 2019-09-25-14-40-57 -.. nonce: -kdveI -.. section: Tests - -test_ssl now handles disabled TLS/SSL versions better. OpenSSL's crypto -policy and run-time settings are recognized and tests for disabled versions -are skipped. Tests also accept more TLS minimum_versions for platforms that -override OpenSSL's default with strict settings. - -.. - -.. bpo: 38271 -.. date: 2019-09-25-13-11-29 -.. nonce: iHXNIg -.. section: Tests - -The private keys for test_ssl were encrypted with 3DES in traditional PKCS#5 -format. 3DES and the digest algorithm of PKCS#5 are blocked by some strict -crypto policies. Use PKCS#8 format with AES256 encryption instead. - -.. - -.. bpo: 38270 -.. date: 2019-09-25-12-18-31 -.. nonce: _x-9uH -.. section: Tests - -test.support now has a helper function to check for availibility of a hash -digest function. Several tests are refactored avoid MD5 and use SHA256 -instead. Other tests are marked to use MD5 and skipped when MD5 is disabled. - -.. - -.. bpo: 37123 -.. date: 2019-09-24-12-30-55 -.. nonce: IoutBn -.. section: Tests - -Multiprocessing test test_mymanager() now also expects -SIGTERM, not only -exitcode 0. BaseManager._finalize_manager() sends SIGTERM to the manager -process if it takes longer than 1 second to stop, which happens on slow -buildbots. - -.. - -.. bpo: 38212 -.. date: 2019-09-24-12-24-05 -.. nonce: IWbhWz -.. section: Tests - -Multiprocessing tests: increase test_queue_feeder_donot_stop_onexc() timeout -from 1 to 60 seconds. - -.. - -.. bpo: 38117 -.. date: 2019-09-11-17-22-32 -.. nonce: X7LgGY -.. section: Tests - -Test with OpenSSL 1.1.1d - -.. - -.. bpo: 37531 -.. date: 2019-08-20-19-24-19 -.. nonce: wRoXfU -.. section: Tests - -Enhance regrtest multiprocess timeout: write a message when killing a worker -process, catch popen.kill() and popen.wait() exceptions, put a timeout on -the second call to popen.communicate(). - -.. - -.. bpo: 37876 -.. date: 2019-08-16-16-15-14 -.. nonce: m3k1w3 -.. section: Tests - -Add tests for ROT-13 codec. - -.. - -.. bpo: 37252 -.. date: 2019-06-12-14-30-29 -.. nonce: 4o-uLs -.. section: Tests - -Fix assertions in ``test_close`` and ``test_events_mask_overflow`` devpoll -tests. - -.. - -.. bpo: 34001 -.. date: 2019-06-03-20-47-10 -.. nonce: KvYx9z -.. section: Tests - -Make test_ssl pass with LibreSSL. LibreSSL handles minimum and maximum TLS -version differently than OpenSSL. - -.. - -.. bpo: 36919 -.. date: 2019-05-28-15-41-34 -.. nonce: -vGt_m -.. section: Tests - -Make ``test_source_encoding.test_issue2301`` implementation independent. The -test will work now for both CPython and IronPython. - -.. - -.. bpo: 34596 -.. date: 2018-09-07-01-18-27 -.. nonce: r2-EGd -.. section: Tests - -Fallback to a default reason when :func:`unittest.skip` is uncalled. Patch -by Naitree Zhu. - -.. - -.. bpo: 38301 -.. date: 2019-09-28-02-37-11 -.. nonce: 123456 -.. section: Build - -In Solaris family, we must be sure to use ``-D_REENTRANT``. Patch by Jesús -Cea Avión. - -.. - -.. bpo: 36210 -.. date: 2019-09-24-22-47-47 -.. nonce: EmL9X1 -.. section: Build - -Update optional extension module detection for AIX. ossaudiodev and spwd are -not applicable for AIX, and are no longer reported as missing. 3rd-party -packaging of ncurses (with ASIS support) conflicts with officially supported -AIX curses library, so configure AIX to use libcurses.a. However, skip -trying to build _curses_panel. - -patch by M Felt - -.. - -.. bpo: 36002 -.. date: 2019-09-13-14-12-36 -.. nonce: Bcl4oe -.. section: Build - -Locate ``llvm-profdata`` and ``llvm-ar`` binaries using ``AC_PATH_TOOL`` -rather than ``AC_PATH_TARGET_TOOL``. - -.. - -.. bpo: 37936 -.. date: 2019-09-10-00-54-48 -.. nonce: E7XEwu -.. section: Build - -The :file:`.gitignore` file systematically keeps "rooted", with a -non-trailing slash, all the rules that are meant to apply to files in a -specific place in the repo. Previously, when the intended file to ignore -happened to be at the root of the repo, we'd most often accidentally also -ignore files and directories with the same name anywhere in the tree. - -.. - -.. bpo: 37936 -.. date: 2019-08-24-00-29-40 -.. nonce: QrORqA -.. section: Build - -The :file:`.gitignore` file no longer applies to any files that are in fact -tracked in the Git repository. Patch by Greg Price. - -.. - -.. bpo: 38117 -.. date: 2019-09-16-14-07-11 -.. nonce: hJVf0C -.. section: Windows - -Update bundled OpenSSL to 1.1.1d - -.. - -.. bpo: 38092 -.. date: 2019-09-13-14-11-42 -.. nonce: x31ehI -.. section: Windows - -Reduce overhead when using multiprocessing in a Windows virtual environment. - -.. - -.. bpo: 38133 -.. date: 2019-09-12-12-05-55 -.. nonce: yFeRGS -.. section: Windows - -Allow py.exe launcher to locate installations from the Microsoft Store and -improve display of active virtual environments. - -.. - -.. bpo: 38114 -.. date: 2019-09-11-15-24-04 -.. nonce: cc0E5E -.. section: Windows - -The ``pip.ini`` is no longer included in the Nuget package. - -.. - -.. bpo: 36634 -.. date: 2019-09-11-14-42-04 -.. nonce: 8Un8ih -.. section: Windows - -:func:`os.cpu_count` now returns active processors rather than maximum -processors. - -.. - -.. bpo: 36634 -.. date: 2019-09-11-12-34-31 -.. nonce: xLaGgb -.. section: Windows - -venv activate.bat now works when the existing variables contain double quote -characters. - -.. - -.. bpo: 38081 -.. date: 2019-09-11-10-22-01 -.. nonce: 8JhzjD -.. section: Windows - -Prevent error calling :func:`os.path.realpath` on ``'NUL'``. - -.. - -.. bpo: 38087 -.. date: 2019-09-10-14-21-40 -.. nonce: --eIib -.. section: Windows - -Fix case sensitivity in test_pathlib and test_ntpath. - -.. - -.. bpo: 38088 -.. date: 2019-09-10-14-17-25 -.. nonce: FOvWSM -.. section: Windows - -Fixes distutils not finding vcruntime140.dll with only the v142 toolset -installed. - -.. - -.. bpo: 37283 -.. date: 2019-09-09-12-22-23 -.. nonce: 8NvOkU -.. section: Windows - -Ensure command-line and unattend.xml setting override previously detected -states in Windows installer. - -.. - -.. bpo: 38030 -.. date: 2019-09-04-14-01-08 -.. nonce: _USdtk -.. section: Windows - -Fixes :func:`os.stat` failing for block devices on Windows - -.. - -.. bpo: 38020 -.. date: 2019-09-03-11-47-37 -.. nonce: xFZ2j0 -.. section: Windows - -Fixes potential crash when calling :func:`os.readlink` (or indirectly -through :func:`~os.path.realpath`) on a file that is not a supported link. - -.. - -.. bpo: 37705 -.. date: 2019-08-30-15-15-22 -.. nonce: 2o4NWW -.. section: Windows - -Improve the implementation of ``winerror_to_errno()``. - -.. - -.. bpo: 37702 -.. date: 2019-07-29-16-49-31 -.. nonce: Lj2f5e -.. section: Windows - -Fix memory leak on Windows in creating an SSLContext object or running -urllib.request.urlopen('https://...'). - -.. - -.. bpo: 37445 -.. date: 2019-06-28-18-10-29 -.. nonce: LsdYO6 -.. section: Windows - -Include the ``FORMAT_MESSAGE_IGNORE_INSERTS`` flag in ``FormatMessageW()`` -calls. - -.. - -.. bpo: 37380 -.. date: 2019-06-25-04-15-22 -.. nonce: tPxjuz -.. section: Windows - -Don't collect unfinished processes with ``subprocess._active`` on Windows to -cleanup later. Patch by Ruslan Kuprieiev. - -.. - -.. bpo: 32587 -.. date: 2019-05-10-15-25-44 -.. nonce: -0g2O3 -.. section: Windows - -Make :data:`winreg.REG_MULTI_SZ` support zero-length strings. - -.. - -.. bpo: 38117 -.. date: 2019-09-15-21-29-13 -.. nonce: ZLsoAZ -.. section: macOS - -Updated OpenSSL to 1.1.1d in macOS installer. - -.. - -.. bpo: 38089 -.. date: 2019-09-10-14-24-35 -.. nonce: eedgyD -.. section: macOS - -Move Azure Pipelines to latest VM versions and make macOS tests optional - -.. - -.. bpo: 35379 -.. date: 2019-09-17-01-28-56 -.. nonce: yAECDr -.. section: IDLE - -When exiting IDLE, catch any AttributeError. One happens when -EditorWindow.close is called twice. Printing a traceback, when IDLE is run -from a terminal, is useless and annoying. - -.. - -.. bpo: 38183 -.. date: 2019-09-16-15-04-29 -.. nonce: eudCN1 -.. section: IDLE - -To avoid problems, test_idle ignores the user config directory. It no longer -tries to create or access .idlerc or any files within. Users must run IDLE -to discover problems with saving settings. - -.. - -.. bpo: 38077 -.. date: 2019-09-09-22-08-36 -.. nonce: Mzpfe2 -.. section: IDLE - -IDLE no longer adds 'argv' to the user namespace when initializing it. This -bug only affected 3.7.4 and 3.8.0b2 to 3.8.0b4. - -.. - -.. bpo: 38041 -.. date: 2019-09-05-23-12-13 -.. nonce: nxmGGK -.. section: IDLE - -Shell restart lines now fill the window width, always start with '=', and -avoid wrapping unnecessarily. The line will still wrap if the included file -name is long relative to the width. - -.. - -.. bpo: 35771 -.. date: 2019-09-01-10-22-55 -.. nonce: tdbmbP -.. section: IDLE - -To avoid occasional spurious test_idle failures on slower machines, increase -the ``hover_delay`` in test_tooltip. - -.. - -.. bpo: 37902 -.. date: 2019-08-21-16-02-49 -.. nonce: _R_adE -.. section: IDLE - -Add mousewheel scrolling for IDLE module, path, and stack browsers. Patch by -George Zhang. - -.. - -.. bpo: 37803 -.. date: 2019-09-12-16-15-55 -.. nonce: chEizy -.. section: Tools/Demos - -pdb's ``--help`` and ``--version`` long options now work. - -.. - -.. bpo: 37064 -.. date: 2019-05-27-15-26-12 -.. nonce: k_SPW2 -.. section: Tools/Demos - -Add option -k to pathscript.py script: preserve shebang flags. Add option -a -to pathscript.py script: add flags. - -.. - -.. bpo: 38234 -.. date: 2019-09-24-17-09-48 -.. nonce: d0bhEA -.. section: C API - -:c:func:`Py_SetPath` now sets :data:`sys.executable` to the program full -path (:c:func:`Py_GetProgramFullPath`) rather than to the program name -(:c:func:`Py_GetProgramName`). - -.. - -.. bpo: 38234 -.. date: 2019-09-20-17-22-41 -.. nonce: ZbquVK -.. section: C API - -Python ignored arguments passed to :c:func:`Py_SetPath`, -:c:func:`Py_SetPythonHome` and :c:func:`Py_SetProgramName`: fix Python -initialization to use specified arguments. - -.. - -.. bpo: 38205 -.. date: 2019-09-19-18-26-29 -.. nonce: Db1OJL -.. section: C API - -The :c:func:`Py_UNREACHABLE` macro now calls :c:func:`Py_FatalError`. - -.. - -.. bpo: 37879 -.. date: 2019-08-17-13-50-21 -.. nonce: CZeUem -.. section: C API - -Fix subtype_dealloc to suppress the type decref when the base type is a C -heap type diff --git a/Misc/NEWS.d/3.8.1.rst b/Misc/NEWS.d/3.8.1.rst deleted file mode 100644 index 55d23dd7fa53e0a309ec7716d43c8d1ac9fab04d..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.8.1.rst +++ /dev/null @@ -1,108 +0,0 @@ -.. bpo: 39080 -.. date: 2019-12-17-21-45-36 -.. nonce: OrxEVS -.. release date: 2019-12-18 -.. section: Core and Builtins - -Fix the value of *end_col_offset* for Starred Expression AST nodes when they -are among the elements in the *args* attribute of Call AST nodes. - -.. - -.. bpo: 39031 -.. date: 2019-12-12-21-05-43 -.. nonce: imlCYZ -.. section: Core and Builtins - -When parsing an "elif" node, lineno and col_offset of the node now point to -the "elif" keyword and not to its condition, making it consistent with the -"if" node. Patch by Lysandros Nikolaou. - -.. - -.. bpo: 39008 -.. date: 2019-12-09-10-38-51 -.. nonce: Rrp6f1 -.. section: Core and Builtins - -:c:func:`PySys_Audit` now requires ``Py_ssize_t`` to be used for size -arguments in the format string, regardless of whether ``PY_SSIZE_T_CLEAN`` -was defined at include time. - -.. - -.. bpo: 39022 -.. date: 2019-12-10-23-34-48 -.. nonce: QDtIxI -.. section: Library - -Update importlib.metadata to include improvements from importlib_metadata -1.3 including better serialization of EntryPoints and improved documentation -for custom finders. - -.. - -.. bpo: 38811 -.. date: 2019-11-15-18-06-04 -.. nonce: AmdQ6M -.. section: Library - -Fix an unhandled exception in :mod:`pathlib` when :meth:`os.link` is -missing. Patch by Toke Høiland-Jørgensen. - -.. - -.. bpo: 36406 -.. date: 2019-03-24-12-12-27 -.. nonce: mCEkOl -.. section: Library - -Handle namespace packages in :mod:`doctest`. Patch by Karthikeyan -Singaravelan. - -.. - -.. bpo: 38546 -.. date: 2019-12-17-15-27-07 -.. nonce: 82JwN2 -.. section: Tests - -Multiprocessing and concurrent.futures tests now stop the resource tracker -process when tests complete. - -.. - -.. bpo: 39007 -.. date: 2019-12-09-10-40-34 -.. nonce: vtarxo -.. section: Windows - -Add auditing events to functions in :mod:`winreg`. - -.. - -.. bpo: 38295 -.. date: 2019-12-17-03-43-04 -.. nonce: hgDvlB -.. section: macOS - -Prevent failure of test_relative_path in test_py_compile on macOS Catalina. - -.. - -.. bpo: 38944 -.. date: 2019-11-30-12-10-36 -.. nonce: _3xjKG -.. section: IDLE - -Escape key now closes IDLE completion windows. Patch by Johnny Najera. - -.. - -.. bpo: 38943 -.. date: 2019-11-29-23-44-11 -.. nonce: 8pUKKs -.. section: IDLE - -Fix IDLE autocomplete windows not always appearing on some systems. Patch by -Johnny Najera. diff --git a/Misc/NEWS.d/3.8.1rc1.rst b/Misc/NEWS.d/3.8.1rc1.rst deleted file mode 100644 index 351996433c4cff84cf88d52c43a5426105199a95..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.8.1rc1.rst +++ /dev/null @@ -1,778 +0,0 @@ -.. bpo: 38945 -.. date: 2019-12-01-22-44-40 -.. nonce: ztmNXc -.. release date: 2019-12-09 -.. section: Security - -Newline characters have been escaped when performing uu encoding to prevent -them from overflowing into to content section of the encoded file. This -prevents malicious or accidental modification of data during the decoding -process. - -.. - -.. bpo: 37228 -.. date: 2019-11-21-21-36-54 -.. nonce: yBZnFG -.. section: Security - -Due to significant security concerns, the *reuse_address* parameter of -:meth:`asyncio.loop.create_datagram_endpoint` is no longer supported. This -is because of the behavior of ``SO_REUSEADDR`` in UDP. For more details, see -the documentation for ``loop.create_datagram_endpoint()``. (Contributed by -Kyle Stanley, Antoine Pitrou, and Yury Selivanov in :issue:`37228`.) - -.. - -.. bpo: 38722 -.. date: 2019-11-18-16-17-56 -.. nonce: x3mECW -.. section: Security - -:mod:`runpy` now uses :meth:`io.open_code` to open code files. Patch by -Jason Killen. - -.. - -.. bpo: 38804 -.. date: 2019-11-15-00-54-42 -.. nonce: vjbM8V -.. section: Security - -Fixes a ReDoS vulnerability in :mod:`http.cookiejar`. Patch by Ben Caller. - -.. - -.. bpo: 38622 -.. date: 2019-11-14-16-13-23 -.. nonce: 3DYkfb -.. section: Security - -Add additional audit events for the :mod:`ctypes` module. - -.. - -.. bpo: 38418 -.. date: 2019-10-08-19-29-55 -.. nonce: QL7s0- -.. section: Security - -Fixes audit event for :func:`os.system` to be named ``os.system``. - -.. - -.. bpo: 38673 -.. date: 2019-12-01-00-17-44 -.. nonce: K_Tze- -.. section: Core and Builtins - -In REPL mode, don't switch to PS2 if the line starts with comment or -whitespace. Based on work by Batuhan Taşkaya. - -.. - -.. bpo: 38922 -.. date: 2019-11-26-12-20-34 -.. nonce: i6ja-i -.. section: Core and Builtins - -Calling ``replace`` on a code object now raises the ``code.__new__`` audit -event. - -.. - -.. bpo: 38920 -.. date: 2019-11-26-09-16-47 -.. nonce: Vx__sT -.. section: Core and Builtins - -Add audit hooks for when :func:`sys.excepthook` and -:func:`sys.unraisablehook` are invoked - -.. - -.. bpo: 38892 -.. date: 2019-11-22-22-18-50 -.. nonce: LS586s -.. section: Core and Builtins - -Improve documentation for audit events table and functions. - -.. - -.. bpo: 38707 -.. date: 2019-11-08-00-36-10 -.. nonce: SZL036 -.. section: Core and Builtins - -``MainThread.native_id`` is now correctly reset in child processes spawned -using :class:`multiprocessing.Process`, instead of retaining the parent's -value. - -.. - -.. bpo: 38640 -.. date: 2019-10-30-11-25-25 -.. nonce: 4sAFh5 -.. section: Core and Builtins - -Fixed a bug in the compiler that was causing to raise in the presence of -break statements and continue statements inside always false while loops. -Patch by Pablo Galindo. - -.. - -.. bpo: 38535 -.. date: 2019-10-20-12-43-48 -.. nonce: ESMkVN -.. section: Core and Builtins - -Fixed line numbers and column offsets for AST nodes for calls without -arguments in decorators. - -.. - -.. bpo: 38525 -.. date: 2019-10-20-00-36-18 -.. nonce: Vty1cA -.. section: Core and Builtins - -Fix a segmentation fault when using reverse iterators of empty ``dict`` -objects. Patch by Dong-hee Na and Inada Naoki. - -.. - -.. bpo: 35409 -.. date: 2019-07-13-18-01-13 -.. nonce: ozbcsR -.. section: Core and Builtins - -Ignore GeneratorExit exceptions when throwing an exception into the aclose -coroutine of an asynchronous generator. - -.. - -.. bpo: 39006 -.. date: 2019-12-09-14-40-09 -.. nonce: v4VsPg -.. section: Library - -Fix asyncio when the ssl module is missing: only check for ssl.SSLSocket -instance if the ssl module is available. - -.. - -.. bpo: 38708 -.. date: 2019-12-07-22-25-39 -.. nonce: rZTUfk -.. section: Library - -Fix a potential IndexError in email parser when parsing an empty msg-id. - -.. - -.. bpo: 38698 -.. date: 2019-12-07-21-49-50 -.. nonce: HxoSym -.. section: Library - -Add a new ``InvalidMessageID`` token to email parser to represent invalid -Message-ID headers. Also, add defects when there is remaining value after -parsing the header. - -.. - -.. bpo: 38979 -.. date: 2019-12-07-16-32-42 -.. nonce: q0sIHy -.. section: Library - -Return class from ``ContextVar.__class_getitem__`` to simplify subclassing. - -.. - -.. bpo: 38986 -.. date: 2019-12-06-15-11-42 -.. nonce: bg6iZt -.. section: Library - -Make repr of C accelerated TaskWakeupMethWrapper the same as of pure Python -version. - -.. - -.. bpo: 38529 -.. date: 2019-12-05-16-13-25 -.. nonce: yvQgx3 -.. section: Library - -Drop too noisy asyncio warning about deletion of a stream without explicit -``.close()`` call. - -.. - -.. bpo: 38634 -.. date: 2019-12-04-15-56-28 -.. nonce: pq0ZWa -.. section: Library - -The :mod:`readline` module now detects if Python is linked to libedit at -runtime on all platforms. Previously, the check was only done on macOS. - -.. - -.. bpo: 33684 -.. date: 2019-12-04-15-28-40 -.. nonce: QeSmQP -.. section: Library - -Fix ``json.tool`` failed to read a JSON file with non-ASCII characters when -locale encoding is not UTF-8. - -.. - -.. bpo: 38698 -.. date: 2019-12-02-10-35-19 -.. nonce: WZnAPQ -.. section: Library - -Prevent UnboundLocalError to pop up in parse_message_id - -parse_message_id() was improperly using a token defined inside an exception -handler, which was raising `UnboundLocalError` on parsing an invalid value. -Patch by Claudiu Popa. - -.. - -.. bpo: 26730 -.. date: 2019-11-27-16-30-02 -.. nonce: 56cdBn -.. section: Library - -Fix ``SpooledTemporaryFile.rollover()`` might corrupt the file when it is in -text mode. Patch by Serhiy Storchaka. - -.. - -.. bpo: 38668 -.. date: 2019-11-22-10-45-03 -.. nonce: iKx23z -.. section: Library - -Calling func:`shutil.copytree` to copy a directory tree from one directory -to another subdirectory resulted in an endless loop and a RecursionError. A -fix was added to consume an iterator and create the list of the entries to -be copied, avoiding the recursion for newly created directories. Patch by -Bruno P. Kinoshita. - -.. - -.. bpo: 37838 -.. date: 2019-11-21-11-39-17 -.. nonce: lRFcEC -.. section: Library - -:meth:`typing.get_type_hints` properly handles functions decorated with -:meth:`functools.wraps`. - -.. - -.. bpo: 38859 -.. date: 2019-11-19-16-30-46 -.. nonce: AZUzL8 -.. section: Library - -AsyncMock now returns StopAsyncIteration on the exaustion of a side_effects -iterable. Since PEP-479 its Impossible to raise a StopIteration exception -from a coroutine. - -.. - -.. bpo: 38857 -.. date: 2019-11-19-16-28-25 -.. nonce: YPUkU9 -.. section: Library - -AsyncMock fix for return values that are awaitable types. This also covers -side_effect iterable values that happend to be awaitable, and wraps -callables that return an awaitable type. Before these awaitables were being -awaited instead of being returned as is. - -.. - -.. bpo: 38821 -.. date: 2019-11-16-23-26-25 -.. nonce: -albNN -.. section: Library - -Fix unhandled exceptions in :mod:`argparse` when internationalizing error -messages for arguments with ``nargs`` set to special (non-integer) values. -Patch by Federico Bond. - -.. - -.. bpo: 38820 -.. date: 2019-11-16-16-09-07 -.. nonce: ivhUSV -.. section: Library - -Make Python compatible with OpenSSL 3.0.0. :func:`ssl.SSLSocket.getpeercert` -no longer returns IPv6 addresses with a trailing new line. - -.. - -.. bpo: 38807 -.. date: 2019-11-15-09-30-29 -.. nonce: PsmRog -.. section: Library - -Update :exc:`TypeError` messages for :meth:`os.path.join` to include -:class:`os.PathLike` objects as acceptable input types. - -.. - -.. bpo: 38785 -.. date: 2019-11-13-16-17-43 -.. nonce: NEOEfk -.. section: Library - -Prevent asyncio from crashing if parent ``__init__`` is not called from a -constructor of object derived from ``asyncio.Future``. - -.. - -.. bpo: 38723 -.. date: 2019-11-12-15-46-28 -.. nonce: gcdMFn -.. section: Library - -:mod:`pdb` now uses :meth:`io.open_code` to trigger auditing events. - -.. - -.. bpo: 27805 -.. date: 2019-11-11-21-43-06 -.. nonce: D3zl1_ -.. section: Library - -Allow opening pipes and other non-seekable files in append mode with -:func:`open`. - -.. - -.. bpo: 38686 -.. date: 2019-11-06-15-26-15 -.. nonce: HNFBce -.. section: Library - -Added support for multiple ``qop`` values in -:class:`urllib.request.AbstractDigestAuthHandler`. - -.. - -.. bpo: 38334 -.. date: 2019-10-27-00-08-49 -.. nonce: pfLLmc -.. section: Library - -Fixed seeking backward on an encrypted :class:`zipfile.ZipExtFile`. - -.. - -.. bpo: 34679 -.. date: 2019-10-23-16-25-12 -.. nonce: Bnw8o3 -.. section: Library - -asynci.ProactorEventLoop.close() now only calls signal.set_wakeup_fd() in -the main thread. - -.. - -.. bpo: 31202 -.. date: 2019-10-20-12-04-48 -.. nonce: NfdIus -.. section: Library - -The case the result of :func:`pathlib.WindowsPath.glob` matches now the case -of the pattern for literal parts. - -.. - -.. bpo: 38521 -.. date: 2019-10-18-13-57-31 -.. nonce: U-7aaM -.. section: Library - -Fixed erroneous equality comparison in statistics.NormalDist(). - -.. - -.. bpo: 38478 -.. date: 2019-10-15-11-37-57 -.. nonce: A87OPO -.. section: Library - -Fixed a bug in :meth:`inspect.signature.bind` that was causing it to fail -when handling a keyword argument with same name as positional-only -parameter. Patch by Pablo Galindo. - -.. - -.. bpo: 33604 -.. date: 2019-10-15-09-47-40 -.. nonce: J12cWT -.. section: Library - -Fixed `hmac.new` and `hmac.HMAC` to raise TypeError instead of ValueError -when the digestmod parameter, now required in 3.8, is omitted. Also -clarified the hmac module documentation and docstrings. - -.. - -.. bpo: 38422 -.. date: 2019-10-09-18-16-51 -.. nonce: aiM5bq -.. section: Library - -Clarify docstrings of pathlib suffix(es) - -.. - -.. bpo: 36993 -.. date: 2019-07-09-05-44-39 -.. nonce: 4javqu -.. section: Library - -Improve error reporting for corrupt zip files with bad zip64 extra data. -Patch by Daniel Hillier. - -.. - -.. bpo: 36820 -.. date: 2019-05-06-15-34-17 -.. nonce: Eh5mIB -.. section: Library - -Break cycle generated when saving an exception in socket.py, codeop.py and -dyld.py as they keep alive not only the exception but user objects through -the ``__traceback__`` attribute. Patch by Mario Corchero. - -.. - -.. bpo: 34776 -.. date: 2018-09-23-14-24-37 -.. nonce: 1SrQe3 -.. section: Library - -Fix dataclasses to support forward references in type annotations - -.. - -.. bpo: 33348 -.. date: 2018-04-24-13-18-48 -.. nonce: XaJDei -.. section: Library - -lib2to3 now recognizes expressions after ``*`` and `**` like in ``f(*[] or -[])``. - -.. - -.. bpo: 27657 -.. date: 2017-12-26-14-32-23 -.. nonce: 6BhyVK -.. section: Library - -Fix urllib.parse.urlparse() with numeric paths. A string like "path:80" is -no longer parsed as a path but as a scheme ("path") and a path ("80"). - -.. - -.. bpo: 38816 -.. date: 2019-11-15-11-39-13 -.. nonce: vUaSVL -.. section: Documentation - -Provides more details about the interaction between :c:func:`fork` and -CPython's runtime, focusing just on the C-API. This includes cautions about -where :c:func:`fork` should and shouldn't be called. - -.. - -.. bpo: 38351 -.. date: 2019-11-15-09-22-28 -.. nonce: xwhlse -.. section: Documentation - -Modernize :mod:`email` examples from %-formatting to f-strings. - -.. - -.. bpo: 38778 -.. date: 2019-11-12-15-31-09 -.. nonce: PHhTlv -.. section: Documentation - -Document the fact that :exc:`RuntimeError` is raised if :meth:`os.fork` is -called in a subinterpreter. - -.. - -.. bpo: 38592 -.. date: 2019-10-26-13-19-07 -.. nonce: Y96BYO -.. section: Documentation - -Add Brazilian Portuguese to the language switcher at Python Documentation -website. - -.. - -.. bpo: 38547 -.. date: 2019-12-09-11-32-34 -.. nonce: Juw54e -.. section: Tests - -Fix test_pty: if the process is the session leader, closing the master file -descriptor raises a SIGHUP signal: simply ignore SIGHUP when running the -tests. - -.. - -.. bpo: 38992 -.. date: 2019-12-08-15-11-06 -.. nonce: cVoHOZ -.. section: Tests - -Fix a test for :func:`math.fsum` that was failing due to constant folding. - -.. - -.. bpo: 38965 -.. date: 2019-12-04-17-08-55 -.. nonce: yqax3m -.. section: Tests - -Fix test_faulthandler on GCC 10. Use the "volatile" keyword in -``faulthandler._stack_overflow()`` to prevent tail call optimization on any -compiler, rather than relying on compiler specific pragma. - -.. - -.. bpo: 38875 -.. date: 2019-11-21-09-11-06 -.. nonce: wSZJal -.. section: Tests - -test_capi: trashcan tests now require the test "cpu" resource. - -.. - -.. bpo: 38841 -.. date: 2019-11-20-16-08-19 -.. nonce: 5F5Lbw -.. section: Tests - -Skip asyncio test_create_datagram_endpoint_existing_sock_unix on platforms -lacking a functional bind() for named unix domain sockets. - -.. - -.. bpo: 38669 -.. date: 2019-11-04-02-54-16 -.. nonce: pazXZ8 -.. section: Tests - -Raise :exc:`TypeError` when passing target as a string with -:meth:`unittest.mock.patch.object`. - -.. - -.. bpo: 35998 -.. date: 2019-10-16-01-36-15 -.. nonce: G305Bf -.. section: Tests - -Fix a race condition in test_asyncio.test_start_tls_server_1(). Previously, -there was a race condition between the test main() function which replaces -the protocol and the test ServerProto protocol which sends ANSWER once it -gets HELLO. Now, only the test main() function is responsible to send data, -ServerProto no longer sends data. - -.. - -.. bpo: 37404 -.. date: 2019-12-01-21-45-24 -.. nonce: cNsA7S -.. section: Build - -:mod:`asyncio` now raises :exc:`TyperError` when calling incompatible -methods with an :class:`ssl.SSLSocket` socket. Patch by Ido Michael. - -.. - -.. bpo: 38809 -.. date: 2019-11-15-09-25-44 -.. nonce: 9jwta6 -.. section: Build - -On Windows, build scripts will now recognize and use python.exe from an -active virtual env. - -.. - -.. bpo: 38684 -.. date: 2019-11-04-14-30-37 -.. nonce: aed593 -.. section: Build - -Fix _hashlib build when Blake2 is disabled, but OpenSSL supports it. - -.. - -.. bpo: 37415 -.. date: 2019-10-11-15-32-58 -.. nonce: D9RXrq -.. section: Build - -Fix stdatomic.h header check for ICC compiler: the ICC implementation lacks -atomic_uintptr_t type which is needed by Python. - -.. - -.. bpo: 33125 -.. date: 2019-11-14-08-57-50 -.. nonce: EN5MWS -.. section: Windows - -Add support for building and releasing Windows ARM64 packages. - -.. - -.. bpo: 38589 -.. date: 2019-10-28-10-48-16 -.. nonce: V69Q1a -.. section: Windows - -Fixes HTML Help shortcut when Windows is not installed to C drive - -.. - -.. bpo: 38453 -.. date: 2019-10-28-10-32-43 -.. nonce: NwwatW -.. section: Windows - -Ensure ntpath.realpath() correctly resolves relative paths. - -.. - -.. bpo: 38519 -.. date: 2019-10-28-05-01-29 -.. nonce: dCkY66 -.. section: Windows - -Restores the internal C headers that were missing from the nuget.org and -Microsoft Store packages. - -.. - -.. bpo: 38492 -.. date: 2019-10-16-09-49-09 -.. nonce: Te1LxC -.. section: Windows - -Remove ``pythonw.exe`` dependency on the Microsoft C++ runtime. - -.. - -.. bpo: 37931 -.. date: 2019-08-23-12-14-34 -.. nonce: goYgQj -.. section: macOS - -Fixed a crash on OSX dynamic builds that occurred when re-initializing the -posix module after a Py_Finalize if the environment had changed since the -previous `import posix`. Patch by Benoît Hudson. - -.. - -.. bpo: 38862 -.. date: 2019-11-23-21-50-57 -.. nonce: KQ9A0m -.. section: IDLE - -'Strip Trailing Whitespace' on the Format menu removes extra newlines at the -end of non-shell files. - -.. - -.. bpo: 26353 -.. date: 2019-11-09-23-55-59 -.. nonce: duYZiF -.. section: IDLE - -Stop adding newline when saving an IDLE shell window. - -.. - -.. bpo: 38636 -.. date: 2019-10-30-22-11-16 -.. nonce: hUhDeB -.. section: IDLE - -Fix IDLE Format menu tab toggle and file indent width. These functions -(default shortcuts Alt-T and Alt-U) were mistakenly disabled in 3.7.5 and -3.8.0. - -.. - -.. bpo: 4630 -.. date: 2019-10-28-04-48-03 -.. nonce: upgjiV -.. section: IDLE - -Add an option to toggle IDLE's cursor blink for shell, editor, and output -windows. See Settings, General, Window Preferences, Cursor Blink. Patch by -Zachary Spytz. - -.. - -.. bpo: 38598 -.. date: 2019-10-26-18-16-24 -.. nonce: 6kH9FY -.. section: IDLE - -Do not try to compile IDLE shell or output windows - -.. - -.. bpo: 37633 -.. date: 2019-11-04-21-10-47 -.. nonce: oOGVdo -.. section: C API - -Re-export some function compatibility wrappers for macros in ``pythonrun.h``. - -.. - -.. bpo: 38540 -.. date: 2019-10-21-09-24-03 -.. nonce: 314N_T -.. section: C API - -Fixed possible leak in :c:func:`PyArg_Parse` and similar functions for -format units ``"es#"`` and ``"et#"`` when the macro -:c:macro:`PY_SSIZE_T_CLEAN` is not defined. - -.. - -.. bpo: 36389 -.. date: 2019-10-07-17-15-09 -.. nonce: hFX_jD -.. section: C API - -The ``_PyObject_CheckConsistency()`` function is now also available in -release mode. For example, it can be used to debug a crash in the -``visit_decref()`` function of the GC. diff --git a/Misc/NEWS.d/3.8.2.rst b/Misc/NEWS.d/3.8.2.rst deleted file mode 100644 index bde681204cb0cbd9cfcbf6a87333a6cbdc98de5c..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.8.2.rst +++ /dev/null @@ -1,97 +0,0 @@ -.. bpo: 39382 -.. date: 2020-02-18-01-40-13 -.. nonce: OLSJu9 -.. release date: 2020-02-24 -.. section: Core and Builtins - -Fix a use-after-free in the single inheritance path of ``issubclass()``, -when the ``__bases__`` of an object has a single reference, and so does its -first item. Patch by Yonatan Goldschmidt. - -.. - -.. bpo: 39427 -.. date: 2020-01-22-22-28-04 -.. nonce: LiO-Eo -.. section: Core and Builtins - -Document all possibilities for the ``-X`` options in the command line help -section. Patch by Pablo Galindo. - -.. - -.. bpo: 39649 -.. date: 2020-02-23-21-27-10 -.. nonce: qiubSp -.. section: Library - -Remove obsolete check for `__args__` in bdb.Bdb.format_stack_entry. - -.. - -.. bpo: 39681 -.. date: 2020-02-21-13-58-40 -.. nonce: zN8hf0 -.. section: Library - -Fix a regression where the C pickle module wouldn't allow unpickling from a -file-like object that doesn't expose a readinto() method. - -.. - -.. bpo: 39546 -.. date: 2020-02-03-15-12-51 -.. nonce: _Kj0Pn -.. section: Library - -Fix a regression in :class:`~argparse.ArgumentParser` where -``allow_abbrev=False`` was ignored for long options that used a prefix -character other than "-". - -.. - -.. bpo: 39432 -.. date: 2020-01-23-16-08-58 -.. nonce: Cee6mi -.. section: Library - -Implement PEP-489 algorithm for non-ascii "PyInit\_..." symbol names in -distutils to make it export the correct init symbol also on Windows. - -.. - -.. bpo: 17422 -.. date: 2020-02-19-11-13-47 -.. nonce: g7_9zz -.. section: Documentation - -The language reference now specifies restrictions on class namespaces. -Adapted from a patch by Ethan Furman. - -.. - -.. bpo: 39572 -.. date: 2020-02-18-18-37-07 -.. nonce: CCtzy1 -.. section: Documentation - -Updated documentation of ``total`` flag of TypeDict. - -.. - -.. bpo: 39654 -.. date: 2020-02-18-07-42-20 -.. nonce: MoT1jI -.. section: Documentation - -In pyclbr doc, update 'class' to 'module' where appropriate and add -readmodule comment. Patch by Hakan Çelik. - -.. - -.. bpo: 39663 -.. date: 2020-02-17-21-09-03 -.. nonce: wexcsH -.. section: IDLE - -Add tests for pyparse find_good_parse_start(). diff --git a/Misc/NEWS.d/3.8.2rc1.rst b/Misc/NEWS.d/3.8.2rc1.rst deleted file mode 100644 index a4b8a1ed8fb4f9a8ec75be784f207b80b9fb3ac0..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.8.2rc1.rst +++ /dev/null @@ -1,580 +0,0 @@ -.. bpo: 39401 -.. date: 2020-01-28-20-54-09 -.. nonce: he7h_A -.. release date: 2020-02-10 -.. section: Security - -Avoid unsafe load of ``api-ms-win-core-path-l1-1-0.dll`` at startup on -Windows 7. - -.. - -.. bpo: 39184 -.. date: 2020-01-07-00-42-08 -.. nonce: fe7NgK -.. section: Security - -Add audit events to command execution functions in os and pty modules. - -.. - -.. bpo: 39579 -.. date: 2020-02-07-15-18-35 -.. nonce: itNmC0 -.. section: Core and Builtins - -Change the ending column offset of `Attribute` nodes constructed in -`ast_for_dotted_name` to point at the end of the current node and not at the -end of the last `NAME` node. - -.. - -.. bpo: 39510 -.. date: 2020-02-04-10-27-41 -.. nonce: PMIh-f -.. section: Core and Builtins - -Fix segfault in ``readinto()`` method on closed BufferedReader. - -.. - -.. bpo: 39492 -.. date: 2020-01-30-01-14-42 -.. nonce: eTuy0F -.. section: Core and Builtins - -Fix a reference cycle in the C Pickler that was preventing the garbage -collection of deleted, pickled objects. - -.. - -.. bpo: 39421 -.. date: 2020-01-22-15-53-37 -.. nonce: O3nG7u -.. section: Core and Builtins - -Fix possible crashes when operating with the functions in the :mod:`heapq` -module and custom comparison operators. - -.. - -.. bpo: 39386 -.. date: 2020-01-20-21-40-57 -.. nonce: ULqD8t -.. section: Core and Builtins - -Prevent double awaiting of async iterator. - -.. - -.. bpo: 39235 -.. date: 2020-01-09-10-01-18 -.. nonce: RYwjoc -.. section: Core and Builtins - -Fix AST end location for lone generator expression in function call, e.g. -f(i for i in a). - -.. - -.. bpo: 39209 -.. date: 2020-01-06-10-29-16 -.. nonce: QHAONe -.. section: Core and Builtins - -Correctly handle multi-line tokens in interactive mode. Patch by Pablo -Galindo. - -.. - -.. bpo: 39216 -.. date: 2020-01-05-06-55-52 -.. nonce: 74jLh9 -.. section: Core and Builtins - -Fix constant folding optimization for positional only arguments - by Anthony -Sottile. - -.. - -.. bpo: 39215 -.. date: 2020-01-04-17-25-34 -.. nonce: xiqiIz -.. section: Core and Builtins - -Fix ``SystemError`` when nested function has annotation on positional-only -argument - by Anthony Sottile. - -.. - -.. bpo: 38588 -.. date: 2019-12-29-19-13-54 -.. nonce: pgXnNS -.. section: Core and Builtins - -Fix possible crashes in dict and list when calling -:c:func:`PyObject_RichCompareBool`. - -.. - -.. bpo: 38610 -.. date: 2019-10-31-14-30-39 -.. nonce: fHdVMS -.. section: Core and Builtins - -Fix possible crashes in several list methods by holding strong references to -list elements when calling :c:func:`PyObject_RichCompareBool`. - -.. - -.. bpo: 39590 -.. date: 2020-02-09-05-51-05 -.. nonce: rf98GU -.. section: Library - -Collections.deque now holds strong references during deque.__contains__ and -deque.count, fixing crashes. - -.. - -.. bpo: 38149 -.. date: 2020-02-05-11-24-16 -.. nonce: GWsjHE -.. section: Library - -:func:`sys.audit` is now called only once per call of :func:`glob.glob` and -:func:`glob.iglob`. - -.. - -.. bpo: 39450 -.. date: 2020-02-02-14-46-34 -.. nonce: 48R274 -.. section: Library - -Striped whitespace from docstring before returning it from -:func:`unittest.case.shortDescription`. - -.. - -.. bpo: 39493 -.. date: 2020-01-30-01-13-19 -.. nonce: CbFRi7 -.. section: Library - -Mark ``typing.IO.closed`` as a property - -.. - -.. bpo: 39485 -.. date: 2020-01-29-14-58-27 -.. nonce: Zy3ot6 -.. section: Library - -Fix a bug in :func:`unittest.mock.create_autospec` that would complain about -the wrong number of arguments for custom descriptors defined in an extension -module returning functions. - -.. - -.. bpo: 39082 -.. date: 2020-01-24-13-24-35 -.. nonce: qKgrq_ -.. section: Library - -Allow AsyncMock to correctly patch static/class methods - -.. - -.. bpo: 39430 -.. date: 2020-01-24-11-05-21 -.. nonce: I0UQzM -.. section: Library - -Fixed race condition in lazy imports in :mod:`tarfile`. - -.. - -.. bpo: 39390 -.. date: 2020-01-23-21-34-29 -.. nonce: D2tSXk -.. section: Library - -Fixed a regression with the `ignore` callback of :func:`shutil.copytree`. -The argument types are now str and List[str] again. - -.. - -.. bpo: 39389 -.. date: 2020-01-20-00-56-01 -.. nonce: fEirIS -.. section: Library - -Write accurate compression level metadata in :mod:`gzip` archives, rather -than always signaling maximum compression. - -.. - -.. bpo: 39274 -.. date: 2020-01-15-23-13-03 -.. nonce: lpc0-n -.. section: Library - -``bool(fraction.Fraction)`` now returns a boolean even if (numerator != 0) -does not return a boolean (ex: numpy number). - -.. - -.. bpo: 39297 -.. date: 2020-01-11-01-15-37 -.. nonce: y98Z6Q -.. section: Library - -Improved performance of importlib.metadata distribution discovery and -resilients to inaccessible sys.path entries (importlib_metadata v1.4.0). - -.. - -.. bpo: 39242 -.. date: 2020-01-08-23-25-27 -.. nonce: bnL65N -.. section: Library - -Updated the Gmane domain from news.gmane.org to news.gmane.io which is used -for examples of :class:`~nntplib.NNTP` news reader server and nntplib tests. - -.. - -.. bpo: 38907 -.. date: 2020-01-06-02-14-38 -.. nonce: F1RkCR -.. section: Library - -In http.server script, restore binding to IPv4 on Windows. - -.. - -.. bpo: 39152 -.. date: 2020-01-03-18-02-50 -.. nonce: JgPjCC -.. section: Library - -Fix ttk.Scale.configure([name]) to return configuration tuple for name or -all options. Giovanni Lombardo contributed part of the patch. - -.. - -.. bpo: 39198 -.. date: 2020-01-02-20-21-03 -.. nonce: nzwGyG -.. section: Library - -If an exception were to be thrown in `Logger.isEnabledFor` (say, by asyncio -timeouts or stopit) , the `logging` global lock may not be released -appropriately, resulting in deadlock. This change wraps that block of code -with `try...finally` to ensure the lock is released. - -.. - -.. bpo: 39191 -.. date: 2020-01-02-17-28-03 -.. nonce: ur_scy -.. section: Library - -Perform a check for running loop before starting a new task in -``loop.run_until_complete()`` to fail fast; it prevents the side effect of -new task spawning before exception raising. - -.. - -.. bpo: 38871 -.. date: 2020-01-01-18-44-52 -.. nonce: 3EEOLg -.. section: Library - -Correctly parenthesize filter-based statements that contain lambda -expressions in mod:`lib2to3`. Patch by Dong-hee Na. - -.. - -.. bpo: 39142 -.. date: 2019-12-31-19-27-23 -.. nonce: oqU5iD -.. section: Library - -A change was made to logging.config.dictConfig to avoid converting instances -of named tuples to ConvertingTuple. It's assumed that named tuples are too -specialised to be treated like ordinary tuples; if a user of named tuples -requires ConvertingTuple functionality, they will have to implement that -themselves in their named tuple class. - -.. - -.. bpo: 39129 -.. date: 2019-12-24-10-43-13 -.. nonce: jVx5rW -.. section: Library - -Fix import path for ``asyncio.TimeoutError`` - -.. - -.. bpo: 39057 -.. date: 2019-12-15-21-47-54 -.. nonce: FOxn-w -.. section: Library - -:func:`urllib.request.proxy_bypass_environment` now ignores leading dots and -no longer ignores a trailing newline. - -.. - -.. bpo: 39056 -.. date: 2019-12-15-21-05-16 -.. nonce: nEfUM9 -.. section: Library - -Fixed handling invalid warning category in the -W option. No longer import -the re module if it is not needed. - -.. - -.. bpo: 39055 -.. date: 2019-12-15-19-23-23 -.. nonce: FmN3un -.. section: Library - -:func:`base64.b64decode` with ``validate=True`` raises now a binascii.Error -if the input ends with a single ``\n``. - -.. - -.. bpo: 39033 -.. date: 2019-12-13-18-54-49 -.. nonce: cepuyD -.. section: Library - -Fix :exc:`NameError` in :mod:`zipimport`. Patch by Karthikeyan Singaravelan. - -.. - -.. bpo: 38878 -.. date: 2019-11-22-12-08-52 -.. nonce: EJ0cFf -.. section: Library - -Fixed __subclasshook__ of :class:`os.PathLike` to return a correct result -upon inheritence. Patch by Bar Harel. - -.. - -.. bpo: 35182 -.. date: 2019-10-31-19-23-25 -.. nonce: hzeNl9 -.. section: Library - -Fixed :func:`Popen.communicate` subsequent call crash when the child process -has already closed any piped standard stream, but still continues to be -running. Patch by Andriy Maletsky. - -.. - -.. bpo: 38473 -.. date: 2019-10-14-21-14-55 -.. nonce: uXpVld -.. section: Library - -Use signature from inner mock for autospecced methods attached with -:func:`unittest.mock.attach_mock`. Patch by Karthikeyan Singaravelan. - -.. - -.. bpo: 38293 -.. date: 2019-09-29-08-17-03 -.. nonce: wls5s3 -.. section: Library - -Add :func:`copy.copy` and :func:`copy.deepcopy` support to :func:`property` -objects. - -.. - -.. bpo: 39153 -.. date: 2020-01-27-22-24-51 -.. nonce: Pjl8jV -.. section: Documentation - -Clarify refcounting semantics for the following functions: - -PyObject_SetItem - PyMapping_SetItemString - PyDict_SetItem - -PyDict_SetItemString - -.. - -.. bpo: 39392 -.. date: 2020-01-27-18-18-42 -.. nonce: oiqcLO -.. section: Documentation - -Explain that when filling with turtle, overlap regions may be left unfilled. - -.. - -.. bpo: 39381 -.. date: 2020-01-18-15-37-56 -.. nonce: wTWe8d -.. section: Documentation - -Mention in docs that :func:`asyncio.get_event_loop` implicitly creates new -event loop only if called from the main thread. - -.. - -.. bpo: 38918 -.. date: 2019-12-15-22-04-41 -.. nonce: 8JnDTS -.. section: Documentation - -Add an entry for ``__module__`` in the "function" & "method" sections of the -`inspect docs types and members table -`_ - -.. - -.. bpo: 3530 -.. date: 2019-11-17-11-53-10 -.. nonce: 8zFUMc -.. section: Documentation - -In the :mod:`ast` module documentation, fix a misleading ``NodeTransformer`` -example and add advice on when to use the ``fix_missing_locations`` -function. - -.. - -.. bpo: 39502 -.. date: 2020-01-30-15-04-54 -.. nonce: chbpII -.. section: Tests - -Skip test_zipfile.test_add_file_after_2107() if :func:`time.localtime` fails -with :exc:`OverflowError`. It is the case on AIX 6.1 for example. - -.. - -.. bpo: 38546 -.. date: 2019-12-18-14-52-08 -.. nonce: 2kxNuM -.. section: Tests - -Fix test_ressources_gced_in_workers() of test_concurrent_futures: explicitly -stop the manager to prevent leaking a child process running in the -background after the test completes. - -.. - -.. bpo: 39144 -.. date: 2019-12-27-22-18-26 -.. nonce: dwHMlR -.. section: Build - -The ctags and etags build targets both include Modules/_ctypes and Python -standard library source files. - -.. - -.. bpo: 39439 -.. date: 2020-01-24-03-15-05 -.. nonce: sFxGfR -.. section: Windows - -Honor the Python path when a virtualenv is active on Windows. - -.. - -.. bpo: 39393 -.. date: 2020-01-20-23-42-53 -.. nonce: gWlJDG -.. section: Windows - -Improve the error message when attempting to load a DLL with unresolved -dependencies. - -.. - -.. bpo: 38883 -.. date: 2020-01-11-22-53-55 -.. nonce: X7FRaN -.. section: Windows - -:meth:`~pathlib.Path.home()` and :meth:`~pathlib.Path.expanduser()` on -Windows now prefer :envvar:`USERPROFILE` and no longer use :envvar:`HOME`, -which is not normally set for regular user accounts. This makes them again -behave like :func:`os.path.expanduser`, which was changed to ignore -:envvar:`HOME` in 3.8, see :issue:`36264`. - -.. - -.. bpo: 39185 -.. date: 2020-01-02-01-11-53 -.. nonce: T4herN -.. section: Windows - -The build.bat script has additional options for very-quiet output (-q) and -very-verbose output (-vv) - -.. - -.. bpo: 30780 -.. date: 2020-01-27-16-44-29 -.. nonce: nR80qu -.. section: IDLE - -Add remaining configdialog tests for buttons and highlights and keys tabs. - -.. - -.. bpo: 39388 -.. date: 2020-01-25-02-26-45 -.. nonce: x4TQNh -.. section: IDLE - -IDLE Settings Cancel button now cancels pending changes - -.. - -.. bpo: 39050 -.. date: 2020-01-22-22-28-06 -.. nonce: zkn0FO -.. section: IDLE - -Make IDLE Settings dialog Help button work again. - -.. - -.. bpo: 34118 -.. date: 2019-12-30-16-44-07 -.. nonce: FaNW0a -.. section: IDLE - -Tag memoryview, range, and tuple as classes, the same as list, etcetera, in -the library manual built-in functions list. - -.. - -.. bpo: 38792 -.. date: 2019-11-13-23-51-39 -.. nonce: xhTC5a -.. section: IDLE - -Close an IDLE shell calltip if a :exc:`KeyboardInterrupt` or shell restart -occurs. Patch by Zackery Spytz. - -.. - -.. bpo: 32989 -.. date: 2018-03-03-12-56-26 -.. nonce: FVhmhH -.. section: IDLE - -Add tests for editor newline_and_indent_event method. Remove dead code from -pyparse find_good_parse_start method. diff --git a/Misc/NEWS.d/3.8.2rc2.rst b/Misc/NEWS.d/3.8.2rc2.rst deleted file mode 100644 index fed6ceadb28c55afe25ed5ad521a746a3943356a..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.8.2rc2.rst +++ /dev/null @@ -1,103 +0,0 @@ -.. bpo: 39184 -.. date: 2020-02-07-23-54-18 -.. nonce: v-ue-v -.. release date: 2020-02-17 -.. section: Security - -Add audit events to functions in `fcntl`, `msvcrt`, `os`, `resource`, -`shutil`, `signal` and `syslog`. - -.. - -.. bpo: 39619 -.. date: 2020-02-13-07-35-00 -.. nonce: inb_master_chroot -.. section: Core and Builtins - -Enable use of :func:`os.chroot` on HP-UX systems. - -.. - -.. bpo: 39606 -.. date: 2020-02-11-23-59-07 -.. nonce: a72Sxc -.. section: Core and Builtins - -Fix regression caused by fix for bpo-39386, that prevented calling -``aclose`` on an async generator that had already been closed or exhausted. - -.. - -.. bpo: 39453 -.. date: 2020-01-25-23-51-17 -.. nonce: xCOkYk -.. section: Core and Builtins - -Fixed a possible crash in :meth:`list.__contains__` when a list is changed -during comparing items. Patch by Dong-hee Na. - -.. - -.. bpo: 39219 -.. date: 2020-01-05-13-36-08 -.. nonce: uHtKd4 -.. section: Core and Builtins - -Syntax errors raised in the tokenizer now always set correct "text" and -"offset" attributes. - -.. - -.. bpo: 27657 -.. date: 2020-02-16-07-08-54 -.. nonce: 9atgcz -.. section: Library - -The original fix for bpo-27657, "Fix urlparse() with numeric paths" -(GH-16839) included in 3.8.1, inadvertently introduced a behavior change -that broke several third-party packages relying on the original undefined -parsing behavior. The change is reverted in 3.8.2, restoring the behavior of -3.8.0 and earlier releases. - -.. - -.. bpo: 39474 -.. date: 2020-02-12-12-01-26 -.. nonce: RZMEUH -.. section: Library - -Fixed starting position of AST for expressions like ``(a)(b)``, ``(a)[b]`` -and ``(a).b``. - -.. - -.. bpo: 21016 -.. date: 2020-02-12-10-04-39 -.. nonce: bFXPH7 -.. section: Library - -The :mod:`pydoc` and :mod:`trace` modules now use the :mod:`sysconfig` -module to get the path to the Python standard library, to support uncommon -installation path like ``/usr/lib64/python3.9/`` on Fedora. Patch by Jan -Matějek. - -.. - -.. bpo: 39595 -.. date: 2020-02-07-23-14-14 -.. nonce: DHwddE -.. section: Library - -Improved performance of zipfile.Path for files with a large number of -entries. Also improved performance and fixed minor issue as published with -`importlib_metadata 1.5 -`_. - -.. - -.. bpo: 39600 -.. date: 2020-02-10-17-09-48 -.. nonce: X6NsyM -.. section: IDLE - -In the font configuration window, remove duplicated font names. diff --git a/Misc/NEWS.d/3.8.3.rst b/Misc/NEWS.d/3.8.3.rst deleted file mode 100644 index 39a4417409df5f3cf5471295e9b4ff18116fd248..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.8.3.rst +++ /dev/null @@ -1,107 +0,0 @@ -.. bpo: 40527 -.. date: 2020-05-06-14-52-35 -.. nonce: gTNKuy -.. release date: 2020-05-13 -.. section: Core and Builtins - -Fix command line argument parsing: no longer write errors multiple times -into stderr. - -.. - -.. bpo: 40417 -.. date: 2020-05-01-19-04-52 -.. nonce: Sti2lJ -.. section: Core and Builtins - -Fix imp module deprecation warning when PyImport_ReloadModule is called. -Patch by Robert Rouhani. - -.. - -.. bpo: 39562 -.. date: 2020-05-01-14-58-16 -.. nonce: KCsX8n -.. section: Core and Builtins - -The constant values of future flags in the :mod:`__future__` module are -updated in order to prevent collision with compiler flags. Previously -``PyCF_ALLOW_TOP_LEVEL_AWAIT`` was clashing with ``CO_FUTURE_DIVISION``. - -.. - -.. bpo: 40559 -.. date: 2020-05-05-08-12-51 -.. nonce: 112wwa -.. section: Library - -Fix possible memory leak in the C implementation of :class:`asyncio.Task`. - -.. - -.. bpo: 40355 -.. date: 2020-05-02-14-24-48 -.. nonce: xTujaB -.. section: Library - -Improve error reporting in :func:`ast.literal_eval` in the presence of -malformed :class:`ast.Dict` nodes instead of silently ignoring any -non-conforming elements. Patch by Curtis Bucher. - -.. - -.. bpo: 40459 -.. date: 2020-05-02-04-29-31 -.. nonce: fSAYVD -.. section: Library - -:func:`platform.win32_ver` now produces correct *ptype* strings instead of -empty strings. - -.. - -.. bpo: 40398 -.. date: 2020-04-26-22-25-36 -.. nonce: OdXnR3 -.. section: Library - -:func:`typing.get_args` now always returns an empty tuple for special -generic aliases. - -.. - -.. bpo: 40561 -.. date: 2020-05-08-08-39-40 -.. nonce: ZMB_2i -.. section: Documentation - -Provide docstrings for webbrowser open functions. - -.. - -.. bpo: 39435 -.. date: 2020-01-24-05-42-57 -.. nonce: EFcdFU -.. section: Documentation - -Fix an incorrect signature for :func:`pickle.loads` in the docs - -.. - -.. bpo: 40458 -.. date: 2020-05-01-20-57-57 -.. nonce: Eb0ueI -.. section: Windows - -Increase reserved stack space to prevent overflow crash on Windows. - -.. - -.. bpo: 40412 -.. date: 2020-05-01-17-28-04 -.. nonce: dE0D8N -.. section: C API - -Nullify inittab_copy during finalization, preventing future interpreter -initializations in an embedded situation from crashing. Patch by Gregory -Szorc. diff --git a/Misc/NEWS.d/3.8.3rc1.rst b/Misc/NEWS.d/3.8.3rc1.rst deleted file mode 100644 index f07bf9072bd6163205a5369dcc88809226bcec8c..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.8.3rc1.rst +++ /dev/null @@ -1,884 +0,0 @@ -.. bpo: 40121 -.. date: 2020-03-30-23-16-25 -.. nonce: p2LIio -.. release date: 2020-04-29 -.. section: Security - -Fixes audit events raised on creating a new socket. - -.. - -.. bpo: 38576 -.. date: 2020-03-14-14-57-44 -.. nonce: OowwQn -.. section: Security - -Disallow control characters in hostnames in http.client, addressing -CVE-2019-18348. Such potentially malicious header injection URLs now cause a -InvalidURL to be raised. - -.. - -.. bpo: 39503 -.. date: 2020-01-30-16-15-29 -.. nonce: B299Yq -.. section: Security - -CVE-2020-8492: The :class:`~urllib.request.AbstractBasicAuthHandler` class -of the :mod:`urllib.request` module uses an inefficient regular expression -which can be exploited by an attacker to cause a denial of service. Fix the -regex to prevent the catastrophic backtracking. Vulnerability reported by -Ben Caller and Matt Schwager. - -.. - -.. bpo: 20526 -.. date: 2020-03-23-18-08-34 -.. nonce: NHNZIv -.. section: Core and Builtins - -Fix :c:func:`PyThreadState_Clear()`. ``PyThreadState.frame`` is a borrowed -reference, not a strong reference: ``PyThreadState_Clear()`` must not call -``Py_CLEAR(tstate->frame)``. - -.. - -.. bpo: 39965 -.. date: 2020-03-15-03-52-01 -.. nonce: Od3ZdP -.. section: Core and Builtins - -Correctly raise ``SyntaxError`` if *await* is used inside non-async -functions and ``PyCF_ALLOW_TOP_LEVEL_AWAIT`` is set (like in the asyncio -REPL). Patch by Pablo Galindo. - -.. - -.. bpo: 39562 -.. date: 2020-03-12-22-13-50 -.. nonce: E2u273 -.. section: Core and Builtins - -Allow executing asynchronous comprehensions on the top level when the -``PyCF_ALLOW_TOP_LEVEL_AWAIT`` flag is given. Patch by Batuhan Taskaya. - -.. - -.. bpo: 38894 -.. date: 2020-03-06-21-04-39 -.. nonce: nfcGKv -.. section: Core and Builtins - -Fix a bug that was causing incomplete results when calling -``pathlib.Path.glob`` in the presence of symlinks that point to files where -the user does not have read access. Patch by Pablo Galindo and Matt -Wozniski. - -.. - -.. bpo: 39871 -.. date: 2020-03-06-06-12-37 -.. nonce: dCAj_2 -.. section: Core and Builtins - -Fix a possible :exc:`SystemError` in ``math.{atan2,copysign,remainder}()`` -when the first argument cannot be converted to a :class:`float`. Patch by -Zachary Spytz. - -.. - -.. bpo: 39776 -.. date: 2020-03-02-20-12-33 -.. nonce: fNaxi_ -.. section: Core and Builtins - -Fix race condition where threads created by PyGILState_Ensure() could get a -duplicate id. - -This affects consumers of tstate->id like the contextvar caching machinery, -which could return invalid cached objects under heavy thread load (observed -in embedded scenarios). - -.. - -.. bpo: 39778 -.. date: 2020-03-02-19-21-21 -.. nonce: _YGLEc -.. section: Core and Builtins - -Fixed a crash due to incorrect handling of weak references in -``collections.OrderedDict`` classes. Patch by Pablo Galindo. - -.. - -.. bpo: 39520 -.. date: 2020-02-02-00-12-07 -.. nonce: uicBq6 -.. section: Core and Builtins - -Fix unparsing of ext slices with no items (``foo[:,]``). Patch by Batuhan -Taskaya. - -.. - -.. bpo: 22490 -.. date: 2018-09-23-16-32-58 -.. nonce: 8e0YDf -.. section: Core and Builtins - -Don't leak environment variable ``__PYVENV_LAUNCHER__`` into the interpreter -session on macOS. - -.. - -.. bpo: 40138 -.. date: 2020-04-22-00-05-10 -.. nonce: i_oGqa -.. section: Library - -Fix the Windows implementation of :func:`os.waitpid` for exit code larger -than ``INT_MAX >> 8``. The exit status is now interpreted as an unsigned -number. - -.. - -.. bpo: 39942 -.. date: 2020-04-20-20-16-02 -.. nonce: NvGnTc -.. section: Library - -Set "__main__" as the default module name when "__name__" is missing in -:class:`typing.TypeVar`. Patch by Weipeng Hong. - -.. - -.. bpo: 40330 -.. date: 2020-04-19-17-31-29 -.. nonce: DGjoIS -.. section: Library - -In :meth:`ShareableList.__setitem__`, check the size of a new string item -after encoding it to utf-8, not before. - -.. - -.. bpo: 40287 -.. date: 2020-04-15-17-21-48 -.. nonce: -mkEJH -.. section: Library - -Fixed ``SpooledTemporaryFile.seek()`` to return the position. - -.. - -.. bpo: 40260 -.. date: 2020-04-12-21-18-56 -.. nonce: F6VWaE -.. section: Library - -Ensure :mod:`modulefinder` uses :func:`io.open_code` and respects coding -comments. - -.. - -.. bpo: 40196 -.. date: 2020-04-06-11-05-13 -.. nonce: Jqowse -.. section: Library - -Fix a bug in the :mod:`symtable` module that was causing incorrectly report -global variables as local. Patch by Pablo Galindo. - -.. - -.. bpo: 40126 -.. date: 2020-04-04-00-47-40 -.. nonce: Y-bTNP -.. section: Library - -Fixed reverting multiple patches in unittest.mock. Patcher's ``__exit__()`` -is now never called if its ``__enter__()`` is failed. Returning true from -``__exit__()`` silences now the exception. - -.. - -.. bpo: 40089 -.. date: 2020-03-27-17-22-34 -.. nonce: -lFsD0 -.. section: Library - -Fix threading._after_fork(): if fork was not called by a thread spawned by -threading.Thread, threading._after_fork() now creates a _MainThread instance -for _main_thread, instead of a _DummyThread instance. - -.. - -.. bpo: 39503 -.. date: 2020-03-25-16-02-16 -.. nonce: YmMbYn -.. section: Library - -:class:`~urllib.request.AbstractBasicAuthHandler` of :mod:`urllib.request` -now parses all WWW-Authenticate HTTP headers and accepts multiple challenges -per header: use the realm of the first Basic challenge. - -.. - -.. bpo: 40014 -.. date: 2020-03-23-17-52-00 -.. nonce: Ya70VG -.. section: Library - -Fix ``os.getgrouplist()``: if ``getgrouplist()`` function fails because the -group list is too small, retry with a larger group list. On failure, the -glibc implementation of ``getgrouplist()`` sets ``ngroups`` to the total -number of groups. For other implementations, double the group list size. - -.. - -.. bpo: 40016 -.. date: 2020-03-19-19-40-27 -.. nonce: JWtxqJ -.. section: Library - -In re docstring, clarify the relationship between inline and argument -compile flags. - -.. - -.. bpo: 39953 -.. date: 2020-03-19-16-33-03 -.. nonce: yy5lC_ -.. section: Library - -Update internal table of OpenSSL error codes in the ``ssl`` module. - -.. - -.. bpo: 39360 -.. date: 2020-03-15-05-41-05 -.. nonce: cmcU5p -.. section: Library - -Ensure all workers exit when finalizing a :class:`multiprocessing.Pool` -implicitly via the module finalization handlers of multiprocessing. This -fixes a deadlock situation that can be experienced when the Pool is not -properly finalized via the context manager or a call to -``multiprocessing.Pool.terminate``. Patch by Batuhan Taskaya and Pablo -Galindo. - -.. - -.. bpo: 39652 -.. date: 2020-03-11-23-08-25 -.. nonce: gbasrk -.. section: Library - -The column name found in ``sqlite3.Cursor.description`` is now truncated on -the first '[' only if the PARSE_COLNAMES option is set. - -.. - -.. bpo: 39915 -.. date: 2020-03-10-19-38-47 -.. nonce: CjPeiY -.. section: Library - -Ensure :attr:`unittest.mock.AsyncMock.await_args_list` has call objects in -the order of awaited arguments instead of using -:attr:`unittest.mock.Mock.call_args` which has the last value of the call. -Patch by Karthikeyan Singaravelan. - -.. - -.. bpo: 38662 -.. date: 2020-03-10-15-32-31 -.. nonce: o1DMXj -.. section: Library - -The ``ensurepip`` module now invokes ``pip`` via the ``runpy`` module. Hence -it is no longer tightly coupled with the internal API of the bundled ``pip`` -version, allowing easier updates to a newer ``pip`` version both internally -and for distributors. - -.. - -.. bpo: 39916 -.. date: 2020-03-09-18-56-27 -.. nonce: BHHyp3 -.. section: Library - -More reliable use of ``os.scandir()`` in ``Path.glob()``. It no longer emits -a ResourceWarning when interrupted. - -.. - -.. bpo: 39850 -.. date: 2020-03-09-01-45-06 -.. nonce: eaJNIE -.. section: Library - -:mod:`multiprocessing` now supports abstract socket addresses (if abstract -sockets are supported in the running platform). Patch by Pablo Galindo. - -.. - -.. bpo: 39828 -.. date: 2020-03-05-00-57-49 -.. nonce: yWq9NJ -.. section: Library - -Fix :mod:`json.tool` to catch :exc:`BrokenPipeError`. Patch by Dong-hee Na. - -.. - -.. bpo: 13487 -.. date: 2020-03-04-16-10-59 -.. nonce: gqe4Fb -.. section: Library - -Avoid a possible *"RuntimeError: dictionary changed size during iteration"* -from :func:`inspect.getmodule` when it tried to loop through -:attr:`sys.modules`. - -.. - -.. bpo: 39794 -.. date: 2020-02-29-19-17-39 -.. nonce: 7VjatS -.. section: Library - -Add --without-decimal-contextvar build option. This enables a thread-local -rather than a coroutine local context. - -.. - -.. bpo: 39769 -.. date: 2020-02-29-13-20-33 -.. nonce: hJmxu4 -.. section: Library - -The :func:`compileall.compile_dir` function's *ddir* parameter and the -compileall command line flag `-d` no longer write the wrong pathname to the -generated pyc file for submodules beneath the root of the directory tree -being compiled. This fixes a regression introduced with Python 3.5. - -.. - -.. bpo: 39517 -.. date: 2020-02-29-11-20-50 -.. nonce: voQZb8 -.. section: Library - -Fix runpy.run_path() when using pathlike objects - -.. - -.. bpo: 39764 -.. date: 2020-02-27-18-21-07 -.. nonce: wqPk68 -.. section: Library - -Fix AttributeError when calling get_stack on a PyAsyncGenObject Task - -.. - -.. bpo: 30566 -.. date: 2020-02-24-03-45-28 -.. nonce: qROxty -.. section: Library - -Fix :exc:`IndexError` when trying to decode an invalid string with punycode -codec. - -.. - -.. bpo: 39667 -.. date: 2020-02-17-22-38-15 -.. nonce: QuzEHH -.. section: Library - -Correct performance degradation in ``zipfile.Path`` as found in zipp 3.0. -While retaining compatibility, this change discourages the use of -``zipfile.Path.open`` due to the signature change in Python 3.9. For -compatibility across Python 3.8 and later versions, consider using -``zipp.Path`` on Python 3.8.x and earlier. - -.. - -.. bpo: 39548 -.. date: 2020-02-06-05-33-52 -.. nonce: DF4FFe -.. section: Library - -Fix handling of header in :class:`urllib.request.AbstractDigestAuthHandler` -when the optional ``qop`` parameter is not present. - -.. - -.. bpo: 38971 -.. date: 2019-12-20-16-06-28 -.. nonce: fKRYlF -.. section: Library - -Open issue in the BPO indicated a desire to make the implementation of -codecs.open() at parity with io.open(), which implements a try/except to -assure file stream gets closed before an exception is raised. - -.. - -.. bpo: 38410 -.. date: 2019-10-09-08-14-25 -.. nonce: _YyoMV -.. section: Library - -Properly handle :func:`sys.audit` failures in -:func:`sys.set_asyncgen_hooks`. Based on patch by Zackery Spytz. - -.. - -.. bpo: 36541 -.. date: 2019-06-18-19-38-27 -.. nonce: XI8mi1 -.. section: Library - -lib2to3 now recognizes named assignment expressions (the walrus operator, -``:=``) - -.. - -.. bpo: 31758 -.. date: 2017-10-14-21-02-40 -.. nonce: 563ZZb -.. section: Library - -Prevent crashes when using an uninitialized ``_elementtree.XMLParser`` -object. Patch by Oren Milman. - -.. - -.. bpo: 27635 -.. date: 2020-04-01-00-27-03 -.. nonce: VwxUty -.. section: Documentation - -The pickle documentation incorrectly claimed that ``__new__`` isn't called -by default when unpickling. - -.. - -.. bpo: 39879 -.. date: 2020-03-16-18-12-02 -.. nonce: CnQ7Cv -.. section: Documentation - -Updated :ref:`datamodel` docs to include :func:`dict` insertion order -preservation. Patch by Furkan Onder and Samy Lahfa. - -.. - -.. bpo: 39868 -.. date: 2020-03-05-16-29-03 -.. nonce: JQoHhO -.. section: Documentation - -Updated the Language Reference for :pep:`572`. - -.. - -.. bpo: 13790 -.. date: 2020-02-28-14-39-25 -.. nonce: hvLaRI -.. section: Documentation - -Change 'string' to 'specification' in format doc. - -.. - -.. bpo: 17422 -.. date: 2020-02-27-17-35-27 -.. nonce: eS1hVh -.. section: Documentation - -The language reference no longer restricts default class namespaces to dicts -only. - -.. - -.. bpo: 39530 -.. date: 2020-02-23-13-26-40 -.. nonce: _bCvzQ -.. section: Documentation - -Fix misleading documentation about mixed-type numeric comparisons. - -.. - -.. bpo: 39718 -.. date: 2020-02-21-22-05-20 -.. nonce: xtBoSi -.. section: Documentation - -Update :mod:`token` documentation to reflect additions in Python 3.8 - -.. - -.. bpo: 39677 -.. date: 2020-02-18-14-28-31 -.. nonce: vNHqoX -.. section: Documentation - -Changed operand name of **MAKE_FUNCTION** from *argc* to *flags* for module -:mod:`dis` - -.. - -.. bpo: 38387 -.. date: 2019-10-06-23-44-15 -.. nonce: fZoq0S -.. section: Documentation - -Document :c:macro:`PyDoc_STRVAR` macro in the C-API reference. - -.. - -.. bpo: 40436 -.. date: 2020-04-29-16-08-24 -.. nonce: gDMnYl -.. section: Tests - -test_gdb and test.pythoninfo now check gdb command exit code. - -.. - -.. bpo: 40162 -.. date: 2020-04-03-02-40-16 -.. nonce: v3pQW_ -.. section: Tests - -Update Travis CI configuration to OpenSSL 1.1.1f. - -.. - -.. bpo: 40146 -.. date: 2020-04-02-02-14-37 -.. nonce: J-Yo9G -.. section: Tests - -Update OpenSSL to 1.1.1f in Azure Pipelines. - -.. - -.. bpo: 40019 -.. date: 2020-03-20-00-30-36 -.. nonce: zOqHpQ -.. section: Tests - -test_gdb now skips tests if it detects that gdb failed to read debug -information because the Python binary is optimized. - -.. - -.. bpo: 27807 -.. date: 2020-03-18-16-04-33 -.. nonce: 9gKjET -.. section: Tests - -``test_site.test_startup_imports()`` is now skipped if a path of -:data:`sys.path` contains a ``.pth`` file. - -.. - -.. bpo: 39793 -.. date: 2020-02-29-12-58-17 -.. nonce: Og2SUN -.. section: Tests - -Use the same domain when testing ``make_msgid``. Patch by Batuhan Taskaya. - -.. - -.. bpo: 1812 -.. date: 2019-11-25-21-46-47 -.. nonce: sAbTbY -.. section: Tests - -Fix newline handling in doctest.testfile when loading from a package whose -loader has a get_data method. Patch by Peter Donis. - -.. - -.. bpo: 37957 -.. date: 2019-10-30-00-01-43 -.. nonce: X1r78F -.. section: Tests - -test.regrtest now can receive a list of test patterns to ignore (using the --i/--ignore argument) or a file with a list of patterns to ignore (using the ---ignore-file argument). Patch by Pablo Galindo. - -.. - -.. bpo: 38502 -.. date: 2019-10-17-00-49-38 -.. nonce: vUEic7 -.. section: Tests - -test.regrtest now uses process groups in the multiprocessing mode (-jN -command line option) if process groups are available: if :func:`os.setsid` -and :func:`os.killpg` functions are available. - -.. - -.. bpo: 38360 -.. date: 2020-04-22-02-33-54 -.. nonce: 74C68u -.. section: Build - -Support single-argument form of macOS -isysroot flag. - -.. - -.. bpo: 40204 -.. date: 2020-04-09-00-19-10 -.. nonce: K-S6RZ -.. section: Build - -Pin Sphinx version to 1.8.2 in ``Doc/Makefile``. - -.. - -.. bpo: 40158 -.. date: 2020-04-03-17-54-33 -.. nonce: MWUTs4 -.. section: Build - -Fix CPython MSBuild Properties in NuGet Package (build/native/python.props) - -.. - -.. bpo: 38527 -.. date: 2020-03-28-10-43-09 -.. nonce: fqCRgD -.. section: Build - -Fix configure check on Solaris for "float word ordering": sometimes, the -correct "grep" command was not being used. Patch by Arnon Yaari. - -.. - -.. bpo: 40164 -.. date: 2020-04-04-13-13-44 -.. nonce: SPrSn5 -.. section: Windows - -Updates Windows to OpenSSL 1.1.1f - -.. - -.. bpo: 39930 -.. date: 2020-03-11-10-15-56 -.. nonce: LGHw1j -.. section: Windows - -Ensures the required :file:`vcruntime140.dll` is included in install -packages. - -.. - -.. bpo: 39847 -.. date: 2020-03-04-17-05-11 -.. nonce: C3N2m3 -.. section: Windows - -Avoid hang when computer is hibernated whilst waiting for a mutex (for -lock-related objects from :mod:`threading`) around 49-day uptime. - -.. - -.. bpo: 38597 -.. date: 2020-03-01-15-04-54 -.. nonce: MnHdYl -.. section: Windows - -:mod:`distutils` will no longer statically link :file:`vcruntime140.dll` -when a redistributable version is unavailable. All future releases of -CPython will include a copy of this DLL to ensure distributed extensions can -continue to load. - -.. - -.. bpo: 38380 -.. date: 2020-02-28-23-51-27 -.. nonce: TpOBCj -.. section: Windows - -Update Windows builds to use SQLite 3.31.1 - -.. - -.. bpo: 39789 -.. date: 2020-02-28-22-46-09 -.. nonce: 67XRoP -.. section: Windows - -Update Windows release build machines to Visual Studio 2019 (MSVC 14.2). - -.. - -.. bpo: 34803 -.. date: 2020-02-25-18-43-34 -.. nonce: S3VcS0 -.. section: Windows - -Package for nuget.org now includes repository reference and bundled icon -image. - -.. - -.. bpo: 40164 -.. date: 2020-04-21-19-46-35 -.. nonce: 6HA6IC -.. section: macOS - -Update macOS installer builds to use OpenSSL 1.1.1g. - -.. - -.. bpo: 38380 -.. date: 2020-02-28-23-51-47 -.. nonce: u-ySyA -.. section: macOS - -Update macOS builds to use SQLite 3.31.1 - -.. - -.. bpo: 27115 -.. date: 2020-03-09-02-45-12 -.. nonce: 8hSHMo -.. section: IDLE - -For 'Go to Line', use a Query box subclass with IDLE standard behavior and -improved error checking. - -.. - -.. bpo: 39885 -.. date: 2020-03-08-14-27-36 -.. nonce: 29ERiR -.. section: IDLE - -Since clicking to get an IDLE context menu moves the cursor, any text -selection should be and now is cleared. - -.. - -.. bpo: 39852 -.. date: 2020-03-06-01-55-14 -.. nonce: QjA1qF -.. section: IDLE - -Edit "Go to line" now clears any selection, preventing accidental deletion. -It also updates Ln and Col on the status bar. - -.. - -.. bpo: 39781 -.. date: 2020-02-27-22-17-09 -.. nonce: bbYBeL -.. section: IDLE - -Selecting code context lines no longer causes a jump. - -.. - -.. bpo: 38439 -.. date: 2019-12-05-14-20-53 -.. nonce: j_L2PI -.. section: IDLE - -Add a 256×256 pixel IDLE icon to support more modern environments. Created -by Andrew Clover. Delete the unused macOS idle.icns icon file. - -.. - -.. bpo: 38689 -.. date: 2019-11-14-12-59-19 -.. nonce: Lgfxva -.. section: IDLE - -IDLE will no longer freeze when inspect.signature fails when fetching a -calltip. - -.. - -.. bpo: 40179 -.. date: 2020-04-04-19-35-22 -.. nonce: u9FH10 -.. section: Tools/Demos - -Fixed translation of ``#elif`` in Argument Clinic. - -.. - -.. bpo: 36184 -.. date: 2020-03-09-13-28-13 -.. nonce: BMPJ0D -.. section: Tools/Demos - -Port python-gdb.py to FreeBSD. python-gdb.py now checks for "take_gil" -function name to check if a frame tries to acquire the GIL, instead of -checking for "pthread_cond_timedwait" which is specific to Linux and can be -a different condition than the GIL. - -.. - -.. bpo: 39889 -.. date: 2020-03-07-18-01-30 -.. nonce: l1czT6 -.. section: Tools/Demos - -Fixed ``unparse.py`` for extended slices containing a single element (e.g. -``a[i:j,]``). Remove redundant tuples when index with a tuple (e.g. ``a[i, -j]``). - -.. - -.. bpo: 35370 -.. date: 2020-03-13-16-44-23 -.. nonce: sXRA-r -.. section: C API - -If :c:func:`PySys_Audit` fails in :c:func:`PyEval_SetProfile` or -:c:func:`PyEval_SetTrace`, log the error as an unraisable exception. - -.. - -.. bpo: 39884 -.. date: 2020-03-12-00-27-26 -.. nonce: CGOJBO -.. section: C API - -:c:func:`PyDescr_NewMethod` and :c:func:`PyCFunction_NewEx` now include the -method name in the SystemError "bad call flags" error message to ease debug. - -.. - -.. bpo: 38643 -.. date: 2020-03-08-22-56-22 -.. nonce: k2ixx6 -.. section: C API - -:c:func:`PyNumber_ToBase` now raises a :exc:`SystemError` instead of -crashing when called with invalid base. - -.. - -.. bpo: 38913 -.. date: 2020-02-25-20-10-34 -.. nonce: siF1lS -.. section: C API - -Fixed segfault in ``Py_BuildValue()`` called with a format containing "#" -and undefined PY_SSIZE_T_CLEAN whwn an exception is set. diff --git a/Misc/NEWS.d/3.8.4.rst b/Misc/NEWS.d/3.8.4.rst deleted file mode 100644 index 4e0c3720bad0b137d929fa767ee90d097768ac90..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.8.4.rst +++ /dev/null @@ -1,130 +0,0 @@ -.. bpo: 41162 -.. date: 2020-07-03-20-41-29 -.. nonce: tb8pVj -.. release date: 2020-07-13 -.. section: Security - -Audit hooks are now cleared later during finalization to avoid missing -events. - -.. - -.. bpo: 29778 -.. date: 2020-07-03-17-21-37 -.. nonce: cR_fGS -.. section: Security - -Ensure :file:`python3.dll` is loaded from correct locations when Python is -embedded (CVE-2020-15523). - -.. - -.. bpo: 41247 -.. date: 2020-07-08-22-03-54 -.. nonce: PndYIk -.. section: Core and Builtins - -Always cache the running loop holder when running -``asyncio.set_running_loop``. - -.. - -.. bpo: 41252 -.. date: 2020-07-08-21-55-23 -.. nonce: nBWL-Y -.. section: Core and Builtins - -Fix incorrect refcounting in _ssl.c's ``_servername_callback()``. - -.. - -.. bpo: 41218 -.. date: 2020-07-06-13-35-17 -.. nonce: oKnSr2 -.. section: Core and Builtins - -Python 3.8.3 had a regression where compiling with -ast.PyCF_ALLOW_TOP_LEVEL_AWAIT would aggressively mark list comprehension -with CO_COROUTINE. Now only list comprehension making use of async/await -will tagged as so. - -.. - -.. bpo: 41175 -.. date: 2020-06-30-20-17-31 -.. nonce: acJoXB -.. section: Core and Builtins - -Guard against a NULL pointer dereference within bytearrayobject triggered by -the ``bytearray() + bytearray()`` operation. - -.. - -.. bpo: 39960 -.. date: 2020-06-23-18-32-41 -.. nonce: Kez3fP -.. section: Core and Builtins - -The "hackcheck" that prevents sneaking around a type's __setattr__() by -calling the superclass method was rewritten to allow C implemented heap -types. - -.. - -.. bpo: 41235 -.. date: 2020-07-07-21-56-26 -.. nonce: H2csMU -.. section: Library - -Fix the error handling in :meth:`ssl.SSLContext.load_dh_params`. - -.. - -.. bpo: 41193 -.. date: 2020-07-02-11-53-45 -.. nonce: 8-Tnql -.. section: Library - -The ``write_history()`` atexit function of the readline completer now -ignores any :exc:`OSError` to ignore error if the filesystem is read-only, -instead of only ignoring :exc:`FileNotFoundError` and -:exc:`PermissionError`. - -.. - -.. bpo: 41043 -.. date: 2020-06-20-00-19-30 -.. nonce: p-Pk-H -.. section: Library - -Fixed the use of :func:`~glob.glob` in the stdlib: literal part of the path -is now always correctly escaped. - -.. - -.. bpo: 39384 -.. date: 2020-05-30-12-44-29 -.. nonce: Iqxy3q -.. section: Library - -Fixed email.contentmanager to allow set_content() to set a null string. - -.. - -.. bpo: 37765 -.. date: 2020-07-07-18-44-30 -.. nonce: umc1o8 -.. section: IDLE - -Add keywords to module name completion list. Rewrite Completions section of -IDLE doc. - -.. - -.. bpo: 41152 -.. date: 2020-06-29-14-51-15 -.. nonce: d6mV0C -.. section: IDLE - -The encoding of ``stdin``, ``stdout`` and ``stderr`` in IDLE is now always -UTF-8. diff --git a/Misc/NEWS.d/3.8.4rc1.rst b/Misc/NEWS.d/3.8.4rc1.rst deleted file mode 100644 index 1f7cb9620040a8f68dea54701a776afa151c487c..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.8.4rc1.rst +++ /dev/null @@ -1,637 +0,0 @@ -.. bpo: 41004 -.. date: 2020-06-29-16-02-29 -.. nonce: ovF0KZ -.. release date: 2020-06-29 -.. section: Security - -The __hash__() methods of ipaddress.IPv4Interface and -ipaddress.IPv6Interface incorrectly generated constant hash values of 32 and -128 respectively. This resulted in always causing hash collisions. The fix -uses hash() to generate hash values for the tuple of (address, mask length, -network address). - -.. - -.. bpo: 39073 -.. date: 2020-03-15-01-28-36 -.. nonce: 6Szd3i -.. section: Security - -Disallow CR or LF in email.headerregistry.Address arguments to guard against -header injection attacks. - -.. - -.. bpo: 41094 -.. date: 2020-06-23-23-26-42 -.. nonce: zEIJse -.. section: Core and Builtins - -Fix decoding errors with audit when open files with non-ASCII names on -non-UTF-8 locale. - -.. - -.. bpo: 41056 -.. date: 2020-06-21-19-53-33 -.. nonce: IDu_EK -.. section: Core and Builtins - -Fixes a reference to deallocated stack space during startup when -constructing sys.path involving a relative symlink when code was supplied -via -c. (discovered via Coverity) - -.. - -.. bpo: 35975 -.. date: 2020-06-20-17-21-07 -.. nonce: UDHCHp -.. section: Core and Builtins - -Stefan Behnel reported that cf_feature_version is used even when -PyCF_ONLY_AST is not set. This is against the intention and against the -documented behavior, so it's been fixed. - -.. - -.. bpo: 40957 -.. date: 2020-06-12-12-21-54 -.. nonce: Z8n6I6 -.. section: Core and Builtins - -Fix refleak in _Py_fopen_obj() when PySys_Audit() fails - -.. - -.. bpo: 40870 -.. date: 2020-06-05-12-48-28 -.. nonce: 9cd2sk -.. section: Core and Builtins - -Raise :exc:`ValueError` when validating custom AST's where the constants -``True``, ``False`` and ``None`` are used within a :class:`ast.Name` node. - -.. - -.. bpo: 40826 -.. date: 2020-06-01-20-31-07 -.. nonce: XCI4M2 -.. section: Core and Builtins - -Fix GIL usage in :c:func:`PyOS_Readline`: lock the GIL to set an exception -and pass the Python thread state when checking if there is a pending signal. - -.. - -.. bpo: 40824 -.. date: 2020-05-30-14-37-18 -.. nonce: XR3V5s -.. section: Core and Builtins - -Unexpected errors in calling the ``__iter__`` method are no longer masked by -``TypeError`` in the :keyword:`in` operator and functions -:func:`~operator.contains`, :func:`~operator.indexOf` and -:func:`~operator.countOf` of the :mod:`operator` module. - -.. - -.. bpo: 40663 -.. date: 2020-05-17-20-38-12 -.. nonce: u2aiZf -.. section: Core and Builtins - -Correctly generate annotations where parentheses are omitted but required -(e.g: ``Type[(str, int, *other))]``. - -.. - -.. bpo: 41138 -.. date: 2020-06-27-13-51-36 -.. nonce: bIpf7g -.. section: Library - -Fixed the :mod:`trace` module CLI for Python source files with non-UTF-8 -encoding. - -.. - -.. bpo: 31938 -.. date: 2020-06-22-20-08-40 -.. nonce: EVuko9 -.. section: Library - -Fix default-value signatures of several functions in the :mod:`select` -module - by Anthony Sottile. - -.. - -.. bpo: 41068 -.. date: 2020-06-22-10-25-39 -.. nonce: _bX2BW -.. section: Library - -Fixed reading files with non-ASCII names from ZIP archive directly after -writing them. - -.. - -.. bpo: 41058 -.. date: 2020-06-20-21-03-55 -.. nonce: gztdZy -.. section: Library - -:func:`pdb.find_function` now correctly determines the source file encoding. - -.. - -.. bpo: 41056 -.. date: 2020-06-20-18-35-43 -.. nonce: Garcle -.. section: Library - -Fix a NULL pointer dereference within the ssl module during a MemoryError in -the keylog callback. (discovered by Coverity) - -.. - -.. bpo: 41048 -.. date: 2020-06-20-10-16-57 -.. nonce: hEXB-B -.. section: Library - -:func:`mimetypes.read_mime_types` function reads the rule file using UTF-8 -encoding, not the locale encoding. Patch by Srinivas Reddy Thatiparthy. - -.. - -.. bpo: 40448 -.. date: 2020-06-15-12-22-53 -.. nonce: 1dk8Bu -.. section: Library - -:mod:`ensurepip` now disables the use of `pip` cache when installing the -bundled versions of `pip` and `setuptools`. Patch by Krzysztof Konopko. - -.. - -.. bpo: 40855 -.. date: 2020-06-12-10-44-15 -.. nonce: jSot83 -.. section: Library - -The standard deviation and variance functions in the statistics module were -ignoring their mu and xbar arguments. - -.. - -.. bpo: 40807 -.. date: 2020-06-04-16-25-15 -.. nonce: yYyLWx -.. section: Library - -Stop codeop._maybe_compile, used by code.InteractiveInterpreter (and IDLE). -from from emitting each warning three times. - -.. - -.. bpo: 40834 -.. date: 2020-05-31-15-52-18 -.. nonce: MO9_hb -.. section: Library - -Fix truncate when sending str object with_xxsubinterpreters.channel_send. - -.. - -.. bpo: 38488 -.. date: 2020-05-28-16-51-00 -.. nonce: hFQNgA -.. section: Library - -Update ensurepip to install pip 20.1.1 and setuptools 47.1.0. - -.. - -.. bpo: 40767 -.. date: 2020-05-27-21-27-01 -.. nonce: L5MnVV -.. section: Library - -:mod:`webbrowser` now properly finds the default browser in pure Wayland -systems by checking the WAYLAND_DISPLAY environment variable. Patch -contributed by Jérémy Attali. - -.. - -.. bpo: 40795 -.. date: 2020-05-27-17-00-18 -.. nonce: eZSnHA -.. section: Library - -:mod:`ctypes` module: If ctypes fails to convert the result of a callback or -if a ctypes callback function raises an exception, sys.unraisablehook is now -called with an exception set. Previously, the error was logged into stderr -by :c:func:`PyErr_Print`. - -.. - -.. bpo: 30008 -.. date: 2020-05-25-22-18-38 -.. nonce: CKC3td -.. section: Library - -Fix :mod:`ssl` code to be compatible with OpenSSL 1.1.x builds that use -``no-deprecated`` and ``--api=1.1.0``. - -.. - -.. bpo: 40614 -.. date: 2020-05-18-22-41-02 -.. nonce: 8j3kmq -.. section: Library - -:func:`ast.parse` will not parse self documenting expressions in f-strings -when passed ``feature_version`` is less than ``(3, 8)``. - -.. - -.. bpo: 40626 -.. date: 2020-05-18-17-29-30 -.. nonce: NeZufF -.. section: Library - -Add h5 file extension as MIME Type application/x-hdf5, as per HDF Group -recommendation for HDF5 formatted data files. Patch contributed by Mark -Schwab. - -.. - -.. bpo: 25872 -.. date: 2020-05-14-13-25-36 -.. nonce: 5D5538 -.. section: Library - -:mod:`linecache` could crash with a :exc:`KeyError` when accessed from -multiple threads. Fix by Michael Graczyk. - -.. - -.. bpo: 40597 -.. date: 2020-05-11-19-17-23 -.. nonce: 4SGfgm -.. section: Library - -If text content lines are longer than policy.max_line_length, always use a -content-encoding to make sure they are wrapped. - -.. - -.. bpo: 40515 -.. date: 2020-05-06-13-51-19 -.. nonce: TUCvYB -.. section: Library - -The :mod:`ssl` and :mod:`hashlib` modules now actively check that OpenSSL is -build with thread support. Python 3.7.0 made thread support mandatory and no -longer works safely with a no-thread builds. - -.. - -.. bpo: 13097 -.. date: 2020-05-06-02-01-25 -.. nonce: Wh5xSK -.. section: Library - -``ctypes`` now raises an ``ArgumentError`` when a callback is invoked with -more than 1024 arguments. - -.. - -.. bpo: 40457 -.. date: 2020-05-02-17-17-37 -.. nonce: EXReI1 -.. section: Library - -The ssl module now support OpenSSL builds without TLS 1.0 and 1.1 methods. - -.. - -.. bpo: 39830 -.. date: 2020-03-23-05-21-13 -.. nonce: IkqU1Y -.. section: Library - -Add :class:`zipfile.Path` to ``__all__`` in the :mod:`zipfile` module. - -.. - -.. bpo: 40025 -.. date: 2020-03-21-05-26-38 -.. nonce: DTLtyq -.. section: Library - -Raise TypeError when _generate_next_value_ is defined after members. Patch -by Ethan Onstott. - -.. - -.. bpo: 39244 -.. date: 2020-02-23-15-09-47 -.. nonce: aBK5IM -.. section: Library - -Fixed :class:`multiprocessing.context.get_all_start_methods` to properly -return the default method first on macOS. - -.. - -.. bpo: 39040 -.. date: 2019-12-15-18-47-20 -.. nonce: tKa0Qs -.. section: Library - -Fix parsing of invalid mime headers parameters by collapsing whitespace -between encoded words in a bare-quote-string. - -.. - -.. bpo: 35714 -.. date: 2019-10-25-23-45-49 -.. nonce: fw3xb7 -.. section: Library - -:exc:`struct.error` is now raised if there is a null character in a -:mod:`struct` format string. - -.. - -.. bpo: 36290 -.. date: 2019-03-17-19-01-53 -.. nonce: 7VXo_K -.. section: Library - -AST nodes are now raising :exc:`TypeError` on conflicting keyword arguments. -Patch contributed by Rémi Lapeyre. - -.. - -.. bpo: 29620 -.. date: 2018-08-21-16-20-33 -.. nonce: xxx666 -.. section: Library - -:func:`~unittest.TestCase.assertWarns` no longer raises a -``RuntimeException`` when accessing a module's ``__warningregistry__`` -causes importation of a new module, or when a new module is imported in -another thread. Patch by Kernc. - -.. - -.. bpo: 34226 -.. date: 2018-07-29-12-14-54 -.. nonce: BE7zbu -.. section: Library - -Fix `cgi.parse_multipart` without content_length. Patch by Roger Duran - -.. - -.. bpo: 41085 -.. date: 2020-06-23-12-02-45 -.. nonce: JZKsyz -.. section: Tests - -Fix integer overflow in the :meth:`array.array.index` method on 64-bit -Windows for index larger than ``2**31``. - -.. - -.. bpo: 38377 -.. date: 2020-06-17-18-00-21 -.. nonce: jfg4TH -.. section: Tests - -On Linux, skip tests using multiprocessing if the current user cannot create -a file in ``/dev/shm/`` directory. Add the -:func:`~test.support.skip_if_broken_multiprocessing_synchronize` function to -the :mod:`test.support` module. - -.. - -.. bpo: 41009 -.. date: 2020-06-17-17-27-07 -.. nonce: Rvn6OQ -.. section: Tests - -Fix use of ``support.require_{linux|mac|freebsd}_version()`` decorators as -class decorator. - -.. - -.. bpo: 41003 -.. date: 2020-06-17-15-07-14 -.. nonce: tiH_Fy -.. section: Tests - -Fix ``test_copyreg`` when ``numpy`` is installed: ``test.pickletester`` now -saves/restores warnings filters when importing ``numpy``, to ignore filters -installed by ``numpy``. - -.. - -.. bpo: 40964 -.. date: 2020-06-12-20-46-23 -.. nonce: OBzf2c -.. section: Tests - -Disable remote :mod:`imaplib` tests, host cyrus.andrew.cmu.edu is blocking -incoming connections. - -.. - -.. bpo: 40055 -.. date: 2020-05-15-01-21-44 -.. nonce: Xp4aP9 -.. section: Tests - -distutils.tests now saves/restores warnings filters to leave them unchanged. -Importing tests imports docutils which imports pkg_resources which adds a -warnings filter. - -.. - -.. bpo: 34401 -.. date: 2018-08-20-09-38-52 -.. nonce: eGxMPm -.. section: Tests - -Make test_gdb properly run on HP-UX. Patch by Michael Osipov. - -.. - -.. bpo: 40204 -.. date: 2020-06-25-06-59-13 -.. nonce: GpD04D -.. section: Build - -Pin Sphinx version to 2.3.1 in ``Doc/Makefile``. - -.. - -.. bpo: 40653 -.. date: 2020-05-17-03-33-00 -.. nonce: WI8UGn -.. section: Build - -Move _dirnameW out of HAVE_SYMLINK to fix a potential compiling issue. - -.. - -.. bpo: 41074 -.. date: 2020-06-24-21-30-42 -.. nonce: gaQc3C -.. section: Windows - -Fixed support of non-ASCII names in functions :func:`msilib.OpenDatabase` -and :func:`msilib.init_database` and non-ASCII SQL in method -:meth:`msilib.Database.OpenView`. - -.. - -.. bpo: 40164 -.. date: 2020-06-12-13-13-44 -.. nonce: SPrSn5 -.. section: Windows - -Updates Windows OpenSSL to 1.1.1g - -.. - -.. bpo: 39631 -.. date: 2020-05-19-14-43-33 -.. nonce: Z5yXam -.. section: Windows - -Changes the registered MIME type for ``.py`` files on Windows to -``text/x-python`` instead of ``text/plain``. - -.. - -.. bpo: 40677 -.. date: 2020-05-19-04-11-12 -.. nonce: qQbLW8 -.. section: Windows - -Manually define IO_REPARSE_TAG_APPEXECLINK in case some old Windows SDK -doesn't have it. - -.. - -.. bpo: 40650 -.. date: 2020-05-17-00-08-13 -.. nonce: 4euMtU -.. section: Windows - -Include winsock2.h in pytime.c for timeval. - -.. - -.. bpo: 39148 -.. date: 2020-03-23-19-07-55 -.. nonce: W1YJEb -.. section: Windows - -Add IPv6 support to :mod:`asyncio` datagram endpoints in ProactorEventLoop. -Change the raised exception for unknown address families to ValueError as -it's not coming from Windows API. - -.. - -.. bpo: 39580 -.. date: 2020-06-25-06-09-00 -.. nonce: N_vJ9h -.. section: macOS - -Avoid opening Finder window if running installer from the command line. -Patch contributed by Rick Heil. - -.. - -.. bpo: 41100 -.. date: 2020-06-24-13-51-57 -.. nonce: mcHdc5 -.. section: macOS - -Fix configure error when building on macOS 11. Note that the current Python -release was released shortly after the first developer preview of macOS 11 -(Big Sur); there are other known issues with building and running on the -developer preview. Big Sur is expected to be fully supported in a future -bugfix release of Python 3.8.x and with 3.9.0. - -.. - -.. bpo: 41005 -.. date: 2020-06-17-13-45-15 -.. nonce: zZegdV -.. section: macOS - -fixed an XDG settings issue not allowing macos to open browser in -webbrowser.py - -.. - -.. bpo: 40741 -.. date: 2020-06-07-20-10-56 -.. nonce: 80A2BW -.. section: macOS - -Update macOS installer to use SQLite 3.32.2. - -.. - -.. bpo: 41144 -.. date: 2020-06-27-17-02-00 -.. nonce: JoFGIX -.. section: IDLE - -Make Open Module open a special module such as os.path. - -.. - -.. bpo: 39885 -.. date: 2020-05-29-18-21-58 -.. nonce: zB_-bN -.. section: IDLE - -Make context menu Cut and Copy work again when right-clicking within a -selection. - -.. - -.. bpo: 40723 -.. date: 2020-05-24-06-19-43 -.. nonce: AJLd4U -.. section: IDLE - -Make test_idle pass when run after import. - -.. - -.. bpo: 40479 -.. date: 2020-05-15-17-48-25 -.. nonce: B1gBl- -.. section: Tools/Demos - -Update multissltest helper to test with latest OpenSSL 1.0.2, 1.1.0, 1.1.1, -and 3.0.0-alpha. - -.. - -.. bpo: 40163 -.. date: 2020-04-03-08-32-31 -.. nonce: lX8K4B -.. section: Tools/Demos - -Fix multissltest tool. OpenSSL has changed download URL for old releases. -The multissltest tool now tries to download from current and old download -URLs. diff --git a/Misc/NEWS.d/3.8.5.rst b/Misc/NEWS.d/3.8.5.rst deleted file mode 100644 index e7ca48385acef16397e4242cc8ea5bba7bbe582e..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/3.8.5.rst +++ /dev/null @@ -1,88 +0,0 @@ -.. bpo: 41304 -.. date: 2020-07-15-20-15-08 -.. nonce: vNEeYA -.. release date: 2020-07-20 -.. section: Security - -Fixes `python3x._pth` being ignored on Windows, caused by the fix for -:issue:`29778` (CVE-2020-15801). - -.. - -.. bpo: 39603 -.. date: 2020-02-12-14-17-39 -.. nonce: Gt3RSg -.. section: Security - -Prevent http header injection by rejecting control characters in -http.client.putrequest(...). - -.. - -.. bpo: 41295 -.. date: 2020-07-18-08-15-32 -.. nonce: pu8Ezo -.. section: Core and Builtins - -Resolve a regression in CPython 3.8.4 where defining "__setattr__" in a -multi-inheritance setup and calling up the hierarchy chain could fail if -builtins/extension types were involved in the base types. - -.. - -.. bpo: 41288 -.. date: 2020-07-13-15-06-35 -.. nonce: 8mn5P- -.. section: Library - -Unpickling invalid NEWOBJ_EX opcode with the C implementation raises now -UnpicklingError instead of crashing. - -.. - -.. bpo: 39017 -.. date: 2020-07-12-22-16-58 -.. nonce: x3Cg-9 -.. section: Library - -Avoid infinite loop when reading specially crafted TAR files using the -tarfile module (CVE-2019-20907). - -.. - -.. bpo: 37703 -.. date: 2019-08-16-20-25-42 -.. nonce: Qm_l_H -.. section: Documentation - -Updated Documentation to comprehensively elaborate on the behaviour of -gather.cancel() - -.. - -.. bpo: 41302 -.. date: 2020-07-15-17-56-32 -.. nonce: S3o-x9 -.. section: Build - -Enable building Python 3.8 with libmpdec-2.5.0 to ease maintenance for Linux -distributions. Patch by Felix Yan. - -.. - -.. bpo: 40741 -.. date: 2020-06-19-14-19-08 -.. nonce: L7yTbm -.. section: macOS - -Update macOS installer to use SQLite 3.32.3. - -.. - -.. bpo: 41300 -.. date: 2020-07-16-17-39-06 -.. nonce: wRixNb -.. section: IDLE - -Save files with non-ascii chars. Fix regression released in 3.9.0b4 and -3.8.4. diff --git a/Misc/NEWS.d/next/Build/README.rst b/Misc/NEWS.d/next/Build/README.rst deleted file mode 100644 index d43e989e18051aad0367571fb87d5f2da342e649..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/next/Build/README.rst +++ /dev/null @@ -1,3 +0,0 @@ -Put news entry `blurb`_ files for the *Build* section in this directory. - -.. _blurb: https://pypi.org/project/blurb/ diff --git a/Misc/NEWS.d/next/C API/README.rst b/Misc/NEWS.d/next/C API/README.rst deleted file mode 100644 index a4eb261579f2097934bc6192a23e7e40f23dc33a..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/next/C API/README.rst +++ /dev/null @@ -1,3 +0,0 @@ -Put news entry `blurb`_ files for the *C API* section in this directory. - -.. _blurb: https://pypi.org/project/blurb/ diff --git a/Misc/NEWS.d/next/Core and Builtins/README.rst b/Misc/NEWS.d/next/Core and Builtins/README.rst deleted file mode 100644 index 00831936c4508419807c9c2bb7b1886f09c3fbf0..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/README.rst +++ /dev/null @@ -1,3 +0,0 @@ -Put news entry `blurb`_ files for the *Core and Builtins* section in this directory. - -.. _blurb: https://pypi.org/project/blurb/ diff --git a/Misc/NEWS.d/next/Documentation/README.rst b/Misc/NEWS.d/next/Documentation/README.rst deleted file mode 100644 index 245b7d635993de2d8f8466232d1f6022fc37a1ca..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/next/Documentation/README.rst +++ /dev/null @@ -1,3 +0,0 @@ -Put news entry `blurb`_ files for the *Documentation* section in this directory. - -.. _blurb: https://pypi.org/project/blurb/ diff --git a/Misc/NEWS.d/next/IDLE/README.rst b/Misc/NEWS.d/next/IDLE/README.rst deleted file mode 100644 index 834c5d48b95f608d25f1ff8385412002851023d7..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/next/IDLE/README.rst +++ /dev/null @@ -1,3 +0,0 @@ -Put news entry `blurb`_ files for the *IDLE* section in this directory. - -.. _blurb: https://pypi.org/project/blurb/ diff --git a/Misc/NEWS.d/next/Library/README.rst b/Misc/NEWS.d/next/Library/README.rst deleted file mode 100644 index 178ac664cc0be1d15768ff4f0af5e0bed3f3866a..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/next/Library/README.rst +++ /dev/null @@ -1,3 +0,0 @@ -Put news entry `blurb`_ files for the *Library* section in this directory. - -.. _blurb: https://pypi.org/project/blurb/ diff --git a/Misc/NEWS.d/next/Security/2021-01-18-09-27-31.bpo-42938.4Zn4Mp.rst b/Misc/NEWS.d/next/Security/2021-01-18-09-27-31.bpo-42938.4Zn4Mp.rst deleted file mode 100644 index 7df65a156feabd7f887ff295088218d1fc2386b0..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/next/Security/2021-01-18-09-27-31.bpo-42938.4Zn4Mp.rst +++ /dev/null @@ -1,2 +0,0 @@ -Avoid static buffers when computing the repr of :class:`ctypes.c_double` and -:class:`ctypes.c_longdouble` values. diff --git a/Misc/NEWS.d/next/Security/README.rst b/Misc/NEWS.d/next/Security/README.rst deleted file mode 100644 index 9ea371df667a430804802eea90e63617ebc4f428..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/next/Security/README.rst +++ /dev/null @@ -1,3 +0,0 @@ -Put news entry `blurb`_ files for the *Security* section in this directory. - -.. _blurb: https://pypi.org/project/blurb/ diff --git a/Misc/NEWS.d/next/Tests/README.rst b/Misc/NEWS.d/next/Tests/README.rst deleted file mode 100644 index 8ea9b4ceb277bf5a4ccbd7e524dd0b7282bf8042..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/next/Tests/README.rst +++ /dev/null @@ -1,3 +0,0 @@ -Put news entry `blurb`_ files for the *Tests* section in this directory. - -.. _blurb: https://pypi.org/project/blurb/ diff --git a/Misc/NEWS.d/next/Tools-Demos/README.rst b/Misc/NEWS.d/next/Tools-Demos/README.rst deleted file mode 100644 index 9f03d79b208653ac2079c2acdacf08061df6703f..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/next/Tools-Demos/README.rst +++ /dev/null @@ -1,3 +0,0 @@ -Put news entry `blurb`_ files for the *Tools/Demos* section in this directory. - -.. _blurb: https://pypi.org/project/blurb/ diff --git a/Misc/NEWS.d/next/Windows/README.rst b/Misc/NEWS.d/next/Windows/README.rst deleted file mode 100644 index 7dbc5805e3f99faeeac8d72eae5863f1f72b1a50..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/next/Windows/README.rst +++ /dev/null @@ -1,3 +0,0 @@ -Put news entry `blurb`_ files for the *Windows* section in this directory. - -.. _blurb: https://pypi.org/project/blurb/ diff --git a/Misc/NEWS.d/next/macOS/README.rst b/Misc/NEWS.d/next/macOS/README.rst deleted file mode 100644 index 563766928cf9441b7c02574a7d51ab23fc6fec8a..0000000000000000000000000000000000000000 --- a/Misc/NEWS.d/next/macOS/README.rst +++ /dev/null @@ -1,3 +0,0 @@ -Put news entry `blurb`_ files for the *macOS* section in this directory. - -.. _blurb: https://pypi.org/project/blurb/ diff --git a/Misc/SpecialBuilds.txt b/Misc/SpecialBuilds.txt index d1a032165f8520ac23196a92f6b1690f82fdfb11..27369abfb37b35e877a150bb2764e9be37d325de 100644 --- a/Misc/SpecialBuilds.txt +++ b/Misc/SpecialBuilds.txt @@ -46,9 +46,7 @@ Build option: ``./configure --with-trace-refs``. Turn on heavy reference debugging. This is major surgery. Every PyObject grows two more pointers, to maintain a doubly-linked list of all live heap-allocated objects. Most built-in type objects are not in this list, as they're statically -allocated. Starting in Python 2.3, if COUNT_ALLOCS (see below) is also defined, -a static type object T does appear in this list if at least one object of type T -has been created. +allocated. Note that because the fundamental PyObject layout changes, Python modules compiled with Py_TRACE_REFS are incompatible with modules compiled without it. @@ -165,55 +163,6 @@ by not defining NDEBUG), and some routines do additional sanity checks inside "#ifdef Py_DEBUG" blocks. -COUNT_ALLOCS ------------- - -Each type object grows three new members: - - /* Number of times an object of this type was allocated. */ - int tp_allocs; - - /* Number of times an object of this type was deallocated. */ - int tp_frees; - - /* Highwater mark: the maximum value of tp_allocs - tp_frees so - * far; or, IOW, the largest number of objects of this type alive at - * the same time. - */ - int tp_maxalloc; - -Allocation and deallocation code keeps these counts up to date. Py_FinalizeEx() -displays a summary of the info returned by sys.getcounts() (see below), along -with assorted other special allocation counts (like the number of tuple -allocations satisfied by a tuple free-list, the number of 1-character strings -allocated, etc). - -Before Python 2.2, type objects were immortal, and the COUNT_ALLOCS -implementation relies on that. As of Python 2.2, heap-allocated type/ class -objects can go away. COUNT_ALLOCS can blow up in 2.2 and 2.2.1 because of this; -this was fixed in 2.2.2. Use of COUNT_ALLOCS makes all heap-allocated type -objects immortal, except for those for which no object of that type is ever -allocated. - -Starting with Python 2.3, If Py_TRACE_REFS is also defined, COUNT_ALLOCS -arranges to ensure that the type object for each allocated object appears in the -doubly-linked list of all objects maintained by Py_TRACE_REFS. - -Special gimmicks: - -sys.getcounts() - Return a list of 4-tuples, one entry for each type object for which at least - one object of that type was allocated. Each tuple is of the form: - - (tp_name, tp_allocs, tp_frees, tp_maxalloc) - - Each distinct type object gets a distinct entry in this list, even if two or - more type objects have the same tp_name (in which case there's no way to - distinguish them by looking at this list). The list is ordered by time of - first object allocation: the type object for which the first allocation of - an object of that type occurred most recently is at the front of the list. - - LLTRACE ------- diff --git a/Misc/python-config.in b/Misc/python-config.in index 727c4a8682270fc6a77ced0aeda0684b63bd00bd..ebd99daa0c2798a34d54797d41c3bdb773918036 100644 --- a/Misc/python-config.in +++ b/Misc/python-config.in @@ -25,8 +25,8 @@ except getopt.error: if not opts: exit_with_usage() -pyver = sysconfig.get_config_var('VERSION') getvar = sysconfig.get_config_var +pyver = getvar('VERSION') opt_flags = [flag for (flag, val) in opts] @@ -35,10 +35,10 @@ if '--help' in opt_flags: for opt in opt_flags: if opt == '--prefix': - print(sysconfig.get_config_var('prefix')) + print(getvar('prefix')) elif opt == '--exec-prefix': - print(sysconfig.get_config_var('exec_prefix')) + print(getvar('exec_prefix')) elif opt in ('--includes', '--cflags'): flags = ['-I' + sysconfig.get_path('include'), @@ -65,10 +65,10 @@ for opt in opt_flags: print(' '.join(libs)) elif opt == '--extension-suffix': - print(sysconfig.get_config_var('EXT_SUFFIX')) + print(getvar('EXT_SUFFIX')) elif opt == '--abiflags': print(sys.abiflags) elif opt == '--configdir': - print(sysconfig.get_config_var('LIBPL')) + print(getvar('LIBPL')) diff --git a/Misc/python.man b/Misc/python.man index 3645b0206eb2b569bd477a677934835d75a37f0d..225376574a26a96af7c568072184e96e1dfa7174 100644 --- a/Misc/python.man +++ b/Misc/python.man @@ -286,16 +286,12 @@ Set implementation specific option. The following options are available: traceback of a trace. Use -X tracemalloc=NFRAME to start tracing with a traceback limit of NFRAME frames - -X showalloccount: output the total count of allocated objects for each - type when the program finishes. This only works when Python was built with - COUNT_ALLOCS defined - -X importtime: show how long each import takes. It shows module name, cumulative time (including nested imports) and self time (excluding nested imports). Note that its output may be broken in multi-threaded application. Typical usage is python3 -X importtime -c 'import asyncio' - -X dev: enable CPython’s “development mode”, introducing additional runtime + -X dev: enable CPython's "development mode", introducing additional runtime checks which are too expensive to be enabled by default. It will not be more verbose than the default if the code is correct: new warnings are only emitted when an issue is detected. Effect of the developer mode: @@ -417,6 +413,8 @@ inserted in the path in front of $PYTHONPATH. The search path can be manipulated from within a Python program as the variable .IR sys.path . +.IP PYTHONPLATLIBDIR +Override sys.platlibdir. .IP PYTHONSTARTUP If this is the name of a readable file, the Python commands in that file are executed before the first prompt is displayed in interactive diff --git a/Misc/requirements-test.txt b/Misc/requirements-test.txt new file mode 100644 index 0000000000000000000000000000000000000000..6e46c12e4f9d13b3fe5ad74648d15f336c40d716 --- /dev/null +++ b/Misc/requirements-test.txt @@ -0,0 +1 @@ +tzdata==2020.1rc0 diff --git a/Modules/Setup b/Modules/Setup index 983fa014ecb242bf8716a7ff997f56aaee6e913c..02cfb67518df7411289d3deabe5be808c854eacf 100644 --- a/Modules/Setup +++ b/Modules/Setup @@ -132,7 +132,10 @@ faulthandler faulthandler.c # # bpo-35053: The module must be builtin since _Py_NewReference() # can call _PyTraceMalloc_NewReference(). -_tracemalloc _tracemalloc.c hashtable.c +_tracemalloc _tracemalloc.c + +# PEG-based parser module -- slated to be *the* parser +_peg_parser _peg_parser.c # The rest of the modules listed in this file are all commented out by # default. Usually they can be detected and built as dynamically @@ -167,17 +170,18 @@ _symtable symtablemodule.c # Modules that should always be present (non UNIX dependent): #array arraymodule.c # array objects -#cmath cmathmodule.c _math.c # -lm # complex math library functions -#math mathmodule.c _math.c # -lm # math library functions, e.g. sin() +#cmath cmathmodule.c _math.c -DPy_BUILD_CORE_MODULE # -lm # complex math library functions +#math mathmodule.c _math.c -DPy_BUILD_CORE_MODULE # -lm # math library functions, e.g. sin() #_contextvars _contextvarsmodule.c # Context Variables #_struct _struct.c # binary structure packing/unpacking #_weakref _weakref.c # basic weak reference support #_testcapi _testcapimodule.c # Python C API test module #_testinternalcapi _testinternalcapi.c -I$(srcdir)/Include/internal -DPy_BUILD_CORE_MODULE # Python internal C API test module -#_random _randommodule.c # Random number generator +#_random _randommodule.c -DPy_BUILD_CORE_MODULE # Random number generator #_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI _elementtree.c # elementtree accelerator #_pickle _pickle.c # pickle accelerator #_datetime _datetimemodule.c # datetime accelerator +#_zoneinfo _zoneinfo.c # zoneinfo accelerator #_bisect _bisectmodule.c # Bisection algorithms #_heapq _heapqmodule.c # Heap queue algorithm #_asyncio _asynciomodule.c # Fast asyncio Future @@ -247,8 +251,8 @@ _symtable symtablemodule.c # The _sha module implements the SHA checksum algorithms. # (NIST's Secure Hash Algorithms.) #_sha1 sha1module.c -#_sha256 sha256module.c -#_sha512 sha512module.c +#_sha256 sha256module.c -DPy_BUILD_CORE_BUILTIN +#_sha512 sha512module.c -DPy_BUILD_CORE_BUILTIN #_sha3 _sha3/sha3module.c # _blake module diff --git a/Modules/_abc.c b/Modules/_abc.c index de938dd0d7d5252830ede85c7ce948cbaeb3d353..709b52ff96b2967acc5736157c3869369b9c25ce 100644 --- a/Modules/_abc.c +++ b/Modules/_abc.c @@ -1,7 +1,6 @@ /* ABCMeta implementation */ #include "Python.h" -#include "structmember.h" #include "clinic/_abc.c.h" /*[clinic input] @@ -20,12 +19,18 @@ _Py_IDENTIFIER(_abc_impl); _Py_IDENTIFIER(__subclasscheck__); _Py_IDENTIFIER(__subclasshook__); -/* A global counter that is incremented each time a class is - registered as a virtual subclass of anything. It forces the - negative cache to be cleared before its next use. - Note: this counter is private. Use `abc.get_cache_token()` for - external code. */ -static unsigned long long abc_invalidation_counter = 0; +typedef struct { + PyTypeObject *_abc_data_type; + unsigned long long abc_invalidation_counter; +} _abcmodule_state; + +static inline _abcmodule_state* +get_abc_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_abcmodule_state *)state; +} /* This object stores internal state for ABCs. Note that we can use normal sets for caches, @@ -38,51 +43,84 @@ typedef struct { unsigned long long _abc_negative_cache_version; } _abc_data; +static int +abc_data_traverse(_abc_data *self, visitproc visit, void *arg) +{ + Py_VISIT(Py_TYPE(self)); + Py_VISIT(self->_abc_registry); + Py_VISIT(self->_abc_cache); + Py_VISIT(self->_abc_negative_cache); + return 0; +} + +static int +abc_data_clear(_abc_data *self) +{ + Py_CLEAR(self->_abc_registry); + Py_CLEAR(self->_abc_cache); + Py_CLEAR(self->_abc_negative_cache); + return 0; +} + static void abc_data_dealloc(_abc_data *self) { - Py_XDECREF(self->_abc_registry); - Py_XDECREF(self->_abc_cache); - Py_XDECREF(self->_abc_negative_cache); - Py_TYPE(self)->tp_free(self); + PyTypeObject *tp = Py_TYPE(self); + (void)abc_data_clear(self); + tp->tp_free(self); + Py_DECREF(tp); } static PyObject * abc_data_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { _abc_data *self = (_abc_data *) type->tp_alloc(type, 0); + _abcmodule_state *state = NULL; if (self == NULL) { return NULL; } + state = PyType_GetModuleState(type); + if (state == NULL) { + Py_DECREF(self); + return NULL; + } + self->_abc_registry = NULL; self->_abc_cache = NULL; self->_abc_negative_cache = NULL; - self->_abc_negative_cache_version = abc_invalidation_counter; + self->_abc_negative_cache_version = state->abc_invalidation_counter; return (PyObject *) self; } PyDoc_STRVAR(abc_data_doc, "Internal state held by ABC machinery."); -static PyTypeObject _abc_data_type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_abc_data", /*tp_name*/ - sizeof(_abc_data), /*tp_basicsize*/ - .tp_dealloc = (destructor)abc_data_dealloc, - .tp_flags = Py_TPFLAGS_DEFAULT, - .tp_alloc = PyType_GenericAlloc, - .tp_new = abc_data_new, +static PyType_Slot _abc_data_type_spec_slots[] = { + {Py_tp_doc, (void *)abc_data_doc}, + {Py_tp_new, abc_data_new}, + {Py_tp_dealloc, abc_data_dealloc}, + {Py_tp_traverse, abc_data_traverse}, + {Py_tp_clear, abc_data_clear}, + {0, 0} +}; + +static PyType_Spec _abc_data_type_spec = { + .name = "_abc._abc_data", + .basicsize = sizeof(_abc_data), + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + .slots = _abc_data_type_spec_slots, }; static _abc_data * -_get_impl(PyObject *self) +_get_impl(PyObject *module, PyObject *self) { + _abcmodule_state *state = get_abc_state(module); PyObject *impl = _PyObject_GetAttrId(self, &PyId__abc_impl); if (impl == NULL) { return NULL; } - if (Py_TYPE(impl) != &_abc_data_type) { + if (!Py_IS_TYPE(impl, state->_abc_data_type)) { PyErr_SetString(PyExc_TypeError, "_abc_impl is set to a wrong type"); Py_DECREF(impl); return NULL; @@ -179,7 +217,7 @@ static PyObject * _abc__reset_registry(PyObject *module, PyObject *self) /*[clinic end generated code: output=92d591a43566cc10 input=12a0b7eb339ac35c]*/ { - _abc_data *impl = _get_impl(self); + _abc_data *impl = _get_impl(module, self); if (impl == NULL) { return NULL; } @@ -206,7 +244,7 @@ static PyObject * _abc__reset_caches(PyObject *module, PyObject *self) /*[clinic end generated code: output=f296f0d5c513f80c input=c0ac616fd8acfb6f]*/ { - _abc_data *impl = _get_impl(self); + _abc_data *impl = _get_impl(module, self); if (impl == NULL) { return NULL; } @@ -241,7 +279,7 @@ static PyObject * _abc__get_dump(PyObject *module, PyObject *self) /*[clinic end generated code: output=9d9569a8e2c1c443 input=2c5deb1bfe9e3c79]*/ { - _abc_data *impl = _get_impl(self); + _abc_data *impl = _get_impl(module, self); if (impl == NULL) { return NULL; } @@ -391,13 +429,14 @@ static PyObject * _abc__abc_init(PyObject *module, PyObject *self) /*[clinic end generated code: output=594757375714cda1 input=8d7fe470ff77f029]*/ { + _abcmodule_state *state = get_abc_state(module); PyObject *data; if (compute_abstract_methods(self) < 0) { return NULL; } /* Set up inheritance registry. */ - data = abc_data_new(&_abc_data_type, NULL, NULL); + data = abc_data_new(state->_abc_data_type, NULL, NULL); if (data == NULL) { return NULL; } @@ -446,7 +485,7 @@ _abc__abc_register_impl(PyObject *module, PyObject *self, PyObject *subclass) if (result < 0) { return NULL; } - _abc_data *impl = _get_impl(self); + _abc_data *impl = _get_impl(module, self); if (impl == NULL) { return NULL; } @@ -457,7 +496,7 @@ _abc__abc_register_impl(PyObject *module, PyObject *self, PyObject *subclass) Py_DECREF(impl); /* Invalidate negative cache */ - abc_invalidation_counter++; + get_abc_state(module)->abc_invalidation_counter++; Py_INCREF(subclass); return subclass; @@ -480,7 +519,7 @@ _abc__abc_instancecheck_impl(PyObject *module, PyObject *self, /*[clinic end generated code: output=b8b5148f63b6b56f input=a4f4525679261084]*/ { PyObject *subtype, *result = NULL, *subclass = NULL; - _abc_data *impl = _get_impl(self); + _abc_data *impl = _get_impl(module, self); if (impl == NULL) { return NULL; } @@ -502,7 +541,7 @@ _abc__abc_instancecheck_impl(PyObject *module, PyObject *self, } subtype = (PyObject *)Py_TYPE(instance); if (subtype == subclass) { - if (impl->_abc_negative_cache_version == abc_invalidation_counter) { + if (impl->_abc_negative_cache_version == get_abc_state(module)->abc_invalidation_counter) { incache = _in_weak_set(impl->_abc_negative_cache, subclass); if (incache < 0) { goto end; @@ -514,12 +553,12 @@ _abc__abc_instancecheck_impl(PyObject *module, PyObject *self, } } /* Fall back to the subclass check. */ - result = _PyObject_CallMethodIdObjArgs(self, &PyId___subclasscheck__, - subclass, NULL); + result = _PyObject_CallMethodIdOneArg(self, &PyId___subclasscheck__, + subclass); goto end; } - result = _PyObject_CallMethodIdObjArgs(self, &PyId___subclasscheck__, - subclass, NULL); + result = _PyObject_CallMethodIdOneArg(self, &PyId___subclasscheck__, + subclass); if (result == NULL) { goto end; } @@ -531,8 +570,8 @@ _abc__abc_instancecheck_impl(PyObject *module, PyObject *self, break; case 0: Py_DECREF(result); - result = _PyObject_CallMethodIdObjArgs(self, &PyId___subclasscheck__, - subtype, NULL); + result = _PyObject_CallMethodIdOneArg(self, &PyId___subclasscheck__, + subtype); break; case 1: // Nothing to do. break; @@ -574,9 +613,10 @@ _abc__abc_subclasscheck_impl(PyObject *module, PyObject *self, } PyObject *ok, *subclasses = NULL, *result = NULL; + _abcmodule_state *state = NULL; Py_ssize_t pos; int incache; - _abc_data *impl = _get_impl(self); + _abc_data *impl = _get_impl(module, self); if (impl == NULL) { return NULL; } @@ -591,15 +631,16 @@ _abc__abc_subclasscheck_impl(PyObject *module, PyObject *self, goto end; } + state = get_abc_state(module); /* 2. Check negative cache; may have to invalidate. */ - if (impl->_abc_negative_cache_version < abc_invalidation_counter) { + if (impl->_abc_negative_cache_version < state->abc_invalidation_counter) { /* Invalidate the negative cache. */ if (impl->_abc_negative_cache != NULL && PySet_Clear(impl->_abc_negative_cache) < 0) { goto end; } - impl->_abc_negative_cache_version = abc_invalidation_counter; + impl->_abc_negative_cache_version = state->abc_invalidation_counter; } else { incache = _in_weak_set(impl->_abc_negative_cache, subclass); @@ -613,8 +654,8 @@ _abc__abc_subclasscheck_impl(PyObject *module, PyObject *self, } /* 3. Check the subclass hook. */ - ok = _PyObject_CallMethodIdObjArgs((PyObject *)self, &PyId___subclasshook__, - subclass, NULL); + ok = _PyObject_CallMethodIdOneArg((PyObject *)self, &PyId___subclasshook__, + subclass); if (ok == NULL) { goto end; } @@ -792,10 +833,11 @@ static PyObject * _abc_get_cache_token_impl(PyObject *module) /*[clinic end generated code: output=c7d87841e033dacc input=70413d1c423ad9f9]*/ { - return PyLong_FromUnsignedLongLong(abc_invalidation_counter); + _abcmodule_state *state = get_abc_state(module); + return PyLong_FromUnsignedLongLong(state->abc_invalidation_counter); } -static struct PyMethodDef module_functions[] = { +static struct PyMethodDef _abcmodule_methods[] = { _ABC_GET_CACHE_TOKEN_METHODDEF _ABC__ABC_INIT_METHODDEF _ABC__RESET_REGISTRY_METHODDEF @@ -807,26 +849,60 @@ static struct PyMethodDef module_functions[] = { {NULL, NULL} /* sentinel */ }; +static int +_abcmodule_exec(PyObject *module) +{ + _abcmodule_state *state = get_abc_state(module); + state->abc_invalidation_counter = 0; + state->_abc_data_type = (PyTypeObject *)PyType_FromModuleAndSpec(module, &_abc_data_type_spec, NULL); + if (state->_abc_data_type == NULL) { + return -1; + } + + return 0; +} + +static int +_abcmodule_traverse(PyObject *module, visitproc visit, void *arg) +{ + _abcmodule_state *state = get_abc_state(module); + Py_VISIT(state->_abc_data_type); + return 0; +} + +static int +_abcmodule_clear(PyObject *module) +{ + _abcmodule_state *state = get_abc_state(module); + Py_CLEAR(state->_abc_data_type); + return 0; +} + +static void +_abcmodule_free(void *module) +{ + _abcmodule_clear((PyObject *)module); +} + +static PyModuleDef_Slot _abcmodule_slots[] = { + {Py_mod_exec, _abcmodule_exec}, + {0, NULL} +}; + static struct PyModuleDef _abcmodule = { PyModuleDef_HEAD_INIT, "_abc", _abc__doc__, - -1, - module_functions, - NULL, - NULL, - NULL, - NULL + sizeof(_abcmodule_state), + _abcmodule_methods, + _abcmodule_slots, + _abcmodule_traverse, + _abcmodule_clear, + _abcmodule_free, }; - PyMODINIT_FUNC PyInit__abc(void) { - if (PyType_Ready(&_abc_data_type) < 0) { - return NULL; - } - _abc_data_type.tp_doc = abc_data_doc; - - return PyModule_Create(&_abcmodule); + return PyModuleDef_Init(&_abcmodule); } diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 4ed2af5598029cc49946eaeb1383f80cb32af911..b615c48c431828696af8cf7628429265c844dfba 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -1,5 +1,6 @@ #include "Python.h" -#include "structmember.h" +#include "pycore_pyerrors.h" // _PyErr_ClearExcState() +#include // offsetof() /*[clinic input] @@ -12,10 +13,8 @@ module _asyncio _Py_IDENTIFIER(__asyncio_running_event_loop__); _Py_IDENTIFIER(_asyncio_future_blocking); _Py_IDENTIFIER(add_done_callback); -_Py_IDENTIFIER(_all_tasks_compat); _Py_IDENTIFIER(call_soon); _Py_IDENTIFIER(cancel); -_Py_IDENTIFIER(current_task); _Py_IDENTIFIER(get_event_loop); _Py_IDENTIFIER(send); _Py_IDENTIFIER(throw); @@ -67,11 +66,13 @@ typedef enum { PyObject *prefix##_exception; \ PyObject *prefix##_result; \ PyObject *prefix##_source_tb; \ + PyObject *prefix##_cancel_msg; \ fut_state prefix##_state; \ int prefix##_log_tb; \ int prefix##_blocking; \ PyObject *dict; \ - PyObject *prefix##_weakreflist; + PyObject *prefix##_weakreflist; \ + _PyErr_StackItem prefix##_cancelled_exc_state; typedef struct { FutureObj_HEAD(fut) @@ -112,8 +113,8 @@ static PyTypeObject TaskType; static PyTypeObject PyRunningLoopHolder_Type; -#define Future_CheckExact(obj) (Py_TYPE(obj) == &FutureType) -#define Task_CheckExact(obj) (Py_TYPE(obj) == &TaskType) +#define Future_CheckExact(obj) Py_IS_TYPE(obj, &FutureType) +#define Task_CheckExact(obj) Py_IS_TYPE(obj, &TaskType) #define Future_Check(obj) PyObject_TypeCheck(obj, &FutureType) #define Task_Check(obj) PyObject_TypeCheck(obj, &TaskType) @@ -142,8 +143,7 @@ _is_coroutine(PyObject *coro) Do this check after 'future_init()'; in case we need to raise an error, __del__ needs a properly initialized object. */ - PyObject *res = PyObject_CallFunctionObjArgs( - asyncio_iscoroutine_func, coro, NULL); + PyObject *res = PyObject_CallOneArg(asyncio_iscoroutine_func, coro); if (res == NULL) { return -1; } @@ -217,7 +217,7 @@ get_future_loop(PyObject *fut) return NULL; } if (getloop != NULL) { - PyObject *res = _PyObject_CallNoArg(getloop); + PyObject *res = PyObject_CallNoArgs(getloop); Py_DECREF(getloop); return res; } @@ -232,17 +232,19 @@ get_running_loop(PyObject **loop) PyObject *rl; PyThreadState *ts = PyThreadState_Get(); - if (ts->id == cached_running_holder_tsid && cached_running_holder != NULL) { + uint64_t ts_id = PyThreadState_GetID(ts); + if (ts_id == cached_running_holder_tsid && cached_running_holder != NULL) { // Fast path, check the cache. rl = cached_running_holder; // borrowed } else { - if (ts->dict == NULL) { + PyObject *ts_dict = _PyThreadState_GetDict(ts); // borrowed + if (ts_dict == NULL) { goto not_found; } rl = _PyDict_GetItemIdWithError( - ts->dict, &PyId___asyncio_running_event_loop__); // borrowed + ts_dict, &PyId___asyncio_running_event_loop__); // borrowed if (rl == NULL) { if (PyErr_Occurred()) { goto error; @@ -253,10 +255,10 @@ get_running_loop(PyObject **loop) } cached_running_holder = rl; // borrowed - cached_running_holder_tsid = ts->id; + cached_running_holder_tsid = ts_id; } - assert(Py_TYPE(rl) == &PyRunningLoopHolder_Type); + assert(Py_IS_TYPE(rl, &PyRunningLoopHolder_Type)); PyObject *running_loop = ((PyRunningLoopHolder *)rl)->rl_loop; if (running_loop == Py_None) { @@ -289,7 +291,13 @@ get_running_loop(PyObject **loop) static int set_running_loop(PyObject *loop) { - PyObject *ts_dict = PyThreadState_GetDict(); // borrowed + PyObject *ts_dict = NULL; + + PyThreadState *tstate = PyThreadState_Get(); + if (tstate != NULL) { + ts_dict = _PyThreadState_GetDict(tstate); // borrowed + } + if (ts_dict == NULL) { PyErr_SetString( PyExc_RuntimeError, "thread-local storage is not available"); @@ -310,10 +318,7 @@ set_running_loop(PyObject *loop) Py_DECREF(rl); cached_running_holder = (PyObject *)rl; - - /* safe to assume state is not NULL as the call to PyThreadState_GetDict() - above already checks if state is NULL */ - cached_running_holder_tsid = PyThreadState_Get()->id; + cached_running_holder_tsid = PyThreadState_GetID(tstate); return 0; } @@ -332,12 +337,12 @@ get_event_loop(void) return loop; } - policy = _PyObject_CallNoArg(asyncio_get_event_loop_policy); + policy = PyObject_CallNoArgs(asyncio_get_event_loop_policy); if (policy == NULL) { return NULL; } - loop = _PyObject_CallMethodId(policy, &PyId_get_event_loop, NULL); + loop = _PyObject_CallMethodIdNoArgs(policy, &PyId_get_event_loop); Py_DECREF(policy); return loop; } @@ -371,7 +376,7 @@ call_soon(PyObject *loop, PyObject *func, PyObject *arg, PyObject *ctx) } stack[nargs] = (PyObject *)ctx; - handle = _PyObject_Vectorcall(callable, stack, nargs, context_kwname); + handle = PyObject_Vectorcall(callable, stack, nargs, context_kwname); Py_DECREF(callable); } @@ -482,6 +487,8 @@ future_init(FutureObj *fut, PyObject *loop) Py_CLEAR(fut->fut_result); Py_CLEAR(fut->fut_exception); Py_CLEAR(fut->fut_source_tb); + Py_CLEAR(fut->fut_cancel_msg); + _PyErr_ClearExcState(&fut->fut_cancelled_exc_state); fut->fut_state = STATE_PENDING; fut->fut_log_tb = 0; @@ -498,7 +505,7 @@ future_init(FutureObj *fut, PyObject *loop) } fut->fut_loop = loop; - res = _PyObject_CallMethodId(fut->fut_loop, &PyId_get_debug, NULL); + res = _PyObject_CallMethodIdNoArgs(fut->fut_loop, &PyId_get_debug); if (res == NULL) { return -1; } @@ -514,7 +521,7 @@ future_init(FutureObj *fut, PyObject *loop) method, which is called during the interpreter shutdown and the traceback module is already unloaded. */ - fut->fut_source_tb = _PyObject_CallNoArg(traceback_extract_stack); + fut->fut_source_tb = PyObject_CallNoArgs(traceback_extract_stack); if (fut->fut_source_tb == NULL) { return -1; } @@ -557,7 +564,7 @@ future_set_exception(FutureObj *fut, PyObject *exc) } if (PyExceptionClass_Check(exc)) { - exc_val = _PyObject_CallNoArg(exc); + exc_val = PyObject_CallNoArgs(exc); if (exc_val == NULL) { return NULL; } @@ -576,7 +583,7 @@ future_set_exception(FutureObj *fut, PyObject *exc) PyErr_SetString(PyExc_TypeError, "invalid exception object"); return NULL; } - if ((PyObject*)Py_TYPE(exc_val) == PyExc_StopIteration) { + if (Py_IS_TYPE(exc_val, (PyTypeObject *)PyExc_StopIteration)) { Py_DECREF(exc_val); PyErr_SetString(PyExc_TypeError, "StopIteration interacts badly with generators " @@ -596,11 +603,33 @@ future_set_exception(FutureObj *fut, PyObject *exc) Py_RETURN_NONE; } +static PyObject * +create_cancelled_error(PyObject *msg) +{ + PyObject *exc; + if (msg == NULL || msg == Py_None) { + exc = PyObject_CallNoArgs(asyncio_CancelledError); + } else { + exc = PyObject_CallOneArg(asyncio_CancelledError, msg); + } + return exc; +} + +static void +future_set_cancelled_error(FutureObj *fut) +{ + PyObject *exc = create_cancelled_error(fut->fut_cancel_msg); + PyErr_SetObject(asyncio_CancelledError, exc); + Py_DECREF(exc); + + _PyErr_ChainStackItem(&fut->fut_cancelled_exc_state); +} + static int future_get_result(FutureObj *fut, PyObject **result) { if (fut->fut_state == STATE_CANCELLED) { - PyErr_SetNone(asyncio_CancelledError); + future_set_cancelled_error(fut); return -1; } @@ -697,7 +726,7 @@ future_add_done_callback(FutureObj *fut, PyObject *arg, PyObject *ctx) } static PyObject * -future_cancel(FutureObj *fut) +future_cancel(FutureObj *fut, PyObject *msg) { fut->fut_log_tb = 0; @@ -706,6 +735,9 @@ future_cancel(FutureObj *fut) } fut->fut_state = STATE_CANCELLED; + Py_XINCREF(msg); + Py_XSETREF(fut->fut_cancel_msg, msg); + if (future_schedule_callbacks(fut) == -1) { return NULL; } @@ -751,6 +783,8 @@ FutureObj_clear(FutureObj *fut) Py_CLEAR(fut->fut_result); Py_CLEAR(fut->fut_exception); Py_CLEAR(fut->fut_source_tb); + Py_CLEAR(fut->fut_cancel_msg); + _PyErr_ClearExcState(&fut->fut_cancelled_exc_state); Py_CLEAR(fut->dict); return 0; } @@ -765,7 +799,14 @@ FutureObj_traverse(FutureObj *fut, visitproc visit, void *arg) Py_VISIT(fut->fut_result); Py_VISIT(fut->fut_exception); Py_VISIT(fut->fut_source_tb); + Py_VISIT(fut->fut_cancel_msg); Py_VISIT(fut->dict); + + _PyErr_StackItem *exc_state = &fut->fut_cancelled_exc_state; + Py_VISIT(exc_state->exc_type); + Py_VISIT(exc_state->exc_value); + Py_VISIT(exc_state->exc_traceback); + return 0; } @@ -830,7 +871,7 @@ _asyncio_Future_exception_impl(FutureObj *self) } if (self->fut_state == STATE_CANCELLED) { - PyErr_SetNone(asyncio_CancelledError); + future_set_cancelled_error(self); return NULL; } @@ -942,7 +983,7 @@ _asyncio_Future_remove_done_callback(FutureObj *self, PyObject *fn) ENSURE_FUTURE_ALIVE(self) if (self->fut_callback0 != NULL) { - int cmp = PyObject_RichCompareBool(fn, self->fut_callback0, Py_EQ); + int cmp = PyObject_RichCompareBool(self->fut_callback0, fn, Py_EQ); if (cmp == -1) { return NULL; } @@ -967,7 +1008,7 @@ _asyncio_Future_remove_done_callback(FutureObj *self, PyObject *fn) if (len == 1) { PyObject *cb_tup = PyList_GET_ITEM(self->fut_callbacks, 0); int cmp = PyObject_RichCompareBool( - fn, PyTuple_GET_ITEM(cb_tup, 0), Py_EQ); + PyTuple_GET_ITEM(cb_tup, 0), fn, Py_EQ); if (cmp == -1) { return NULL; } @@ -989,7 +1030,7 @@ _asyncio_Future_remove_done_callback(FutureObj *self, PyObject *fn) int ret; PyObject *item = PyList_GET_ITEM(self->fut_callbacks, i); Py_INCREF(item); - ret = PyObject_RichCompareBool(fn, PyTuple_GET_ITEM(item, 0), Py_EQ); + ret = PyObject_RichCompareBool(PyTuple_GET_ITEM(item, 0), fn, Py_EQ); if (ret == 0) { if (j < len) { PyList_SET_ITEM(newlist, j, item); @@ -1011,7 +1052,7 @@ _asyncio_Future_remove_done_callback(FutureObj *self, PyObject *fn) } if (j < len) { - Py_SIZE(newlist) = j; + Py_SET_SIZE(newlist, j); } j = PyList_GET_SIZE(newlist); len = PyList_GET_SIZE(self->fut_callbacks); @@ -1031,6 +1072,8 @@ _asyncio_Future_remove_done_callback(FutureObj *self, PyObject *fn) /*[clinic input] _asyncio.Future.cancel + msg: object = None + Cancel the future and schedule callbacks. If the future is already done or cancelled, return False. Otherwise, @@ -1039,11 +1082,11 @@ return True. [clinic start generated code]*/ static PyObject * -_asyncio_Future_cancel_impl(FutureObj *self) -/*[clinic end generated code: output=e45b932ba8bd68a1 input=515709a127995109]*/ +_asyncio_Future_cancel_impl(FutureObj *self, PyObject *msg) +/*[clinic end generated code: output=3edebbc668e5aba3 input=925eb545251f2c5a]*/ { ENSURE_FUTURE_ALIVE(self) - return future_cancel(self); + return future_cancel(self, msg); } /*[clinic input] @@ -1256,6 +1299,29 @@ FutureObj_get_source_traceback(FutureObj *fut, void *Py_UNUSED(ignored)) return fut->fut_source_tb; } +static PyObject * +FutureObj_get_cancel_message(FutureObj *fut, void *Py_UNUSED(ignored)) +{ + if (fut->fut_cancel_msg == NULL) { + Py_RETURN_NONE; + } + Py_INCREF(fut->fut_cancel_msg); + return fut->fut_cancel_msg; +} + +static int +FutureObj_set_cancel_message(FutureObj *fut, PyObject *msg, + void *Py_UNUSED(ignored)) +{ + if (msg == NULL) { + PyErr_SetString(PyExc_AttributeError, "cannot delete attribute"); + return -1; + } + Py_INCREF(msg); + Py_XSETREF(fut->fut_cancel_msg, msg); + return 0; +} + static PyObject * FutureObj_get_state(FutureObj *fut, void *Py_UNUSED(ignored)) { @@ -1283,6 +1349,29 @@ FutureObj_get_state(FutureObj *fut, void *Py_UNUSED(ignored)) return ret; } +/*[clinic input] +_asyncio.Future._make_cancelled_error + +Create the CancelledError to raise if the Future is cancelled. + +This should only be called once when handling a cancellation since +it erases the context exception value. +[clinic start generated code]*/ + +static PyObject * +_asyncio_Future__make_cancelled_error_impl(FutureObj *self) +/*[clinic end generated code: output=a5df276f6c1213de input=ac6effe4ba795ecc]*/ +{ + PyObject *exc = create_cancelled_error(self->fut_cancel_msg); + _PyErr_StackItem *exc_state = &self->fut_cancelled_exc_state; + /* Transfer ownership of exc_value from exc_state to exc since we are + done with it. */ + PyException_SetContext(exc, exc_state->exc_value); + exc_state->exc_value = NULL; + + return exc; +} + /*[clinic input] _asyncio.Future._repr_info [clinic start generated code]*/ @@ -1291,8 +1380,7 @@ static PyObject * _asyncio_Future__repr_info_impl(FutureObj *self) /*[clinic end generated code: output=fa69e901bd176cfb input=f21504d8e2ae1ca2]*/ { - return PyObject_CallFunctionObjArgs( - asyncio_future_repr_info_func, self, NULL); + return PyObject_CallOneArg(asyncio_future_repr_info_func, (PyObject *)self); } static PyObject * @@ -1302,9 +1390,8 @@ FutureObj_repr(FutureObj *fut) ENSURE_FUTURE_ALIVE(fut) - PyObject *rinfo = _PyObject_CallMethodIdObjArgs((PyObject*)fut, - &PyId__repr_info, - NULL); + PyObject *rinfo = _PyObject_CallMethodIdNoArgs((PyObject*)fut, + &PyId__repr_info); if (rinfo == NULL) { return NULL; } @@ -1369,7 +1456,7 @@ FutureObj_finalize(FutureObj *fut) func = _PyObject_GetAttrId(fut->fut_loop, &PyId_call_exception_handler); if (func != NULL) { - PyObject *res = PyObject_CallFunctionObjArgs(func, context, NULL); + PyObject *res = PyObject_CallOneArg(func, context); if (res == NULL) { PyErr_WriteUnraisable(func); } @@ -1387,6 +1474,12 @@ FutureObj_finalize(FutureObj *fut) PyErr_Restore(error_type, error_value, error_traceback); } +static PyObject * +future_cls_getitem(PyObject *cls, PyObject *type) +{ + Py_INCREF(cls); + return cls; +} static PyAsyncMethods FutureType_as_async = { (unaryfunc)future_new_iter, /* am_await */ @@ -1405,7 +1498,9 @@ static PyMethodDef FutureType_methods[] = { _ASYNCIO_FUTURE_CANCELLED_METHODDEF _ASYNCIO_FUTURE_DONE_METHODDEF _ASYNCIO_FUTURE_GET_LOOP_METHODDEF + _ASYNCIO_FUTURE__MAKE_CANCELLED_ERROR_METHODDEF _ASYNCIO_FUTURE__REPR_INFO_METHODDEF + {"__class_getitem__", future_cls_getitem, METH_O|METH_CLASS, NULL}, {NULL, NULL} /* Sentinel */ }; @@ -1419,7 +1514,10 @@ static PyMethodDef FutureType_methods[] = { {"_exception", (getter)FutureObj_get_exception, NULL, NULL}, \ {"_log_traceback", (getter)FutureObj_get_log_traceback, \ (setter)FutureObj_set_log_traceback, NULL}, \ - {"_source_traceback", (getter)FutureObj_get_source_traceback, NULL, NULL}, + {"_source_traceback", (getter)FutureObj_get_source_traceback, \ + NULL, NULL}, \ + {"_cancel_message", (getter)FutureObj_get_cancel_message, \ + (setter)FutureObj_set_cancel_message, NULL}, static PyGetSetDef FutureType_getsetlist[] = { FUTURE_COMMON_GETSETLIST @@ -1866,8 +1964,8 @@ register_task(PyObject *task) { _Py_IDENTIFIER(add); - PyObject *res = _PyObject_CallMethodIdObjArgs( - all_tasks, &PyId_add, task, NULL); + PyObject *res = _PyObject_CallMethodIdOneArg(all_tasks, + &PyId_add, task); if (res == NULL) { return -1; } @@ -1881,8 +1979,8 @@ unregister_task(PyObject *task) { _Py_IDENTIFIER(discard); - PyObject *res = _PyObject_CallMethodIdObjArgs( - all_tasks, &PyId_discard, task, NULL); + PyObject *res = _PyObject_CallMethodIdOneArg(all_tasks, + &PyId_discard, task); if (res == NULL) { return -1; } @@ -2088,89 +2186,22 @@ TaskObj_get_fut_waiter(TaskObj *task, void *Py_UNUSED(ignored)) } /*[clinic input] -@classmethod -_asyncio.Task.current_task +_asyncio.Task._make_cancelled_error - loop: object = None +Create the CancelledError to raise if the Task is cancelled. -Return the currently running task in an event loop or None. - -By default the current task for the current event loop is returned. - -None is returned when called not in the context of a Task. +This should only be called once when handling a cancellation since +it erases the context exception value. [clinic start generated code]*/ static PyObject * -_asyncio_Task_current_task_impl(PyTypeObject *type, PyObject *loop) -/*[clinic end generated code: output=99fbe7332c516e03 input=cd14770c5b79c7eb]*/ +_asyncio_Task__make_cancelled_error_impl(TaskObj *self) +/*[clinic end generated code: output=55a819e8b4276fab input=52c0e32de8e2f840]*/ { - PyObject *ret; - PyObject *current_task_func; - - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "Task.current_task() is deprecated, " \ - "use asyncio.current_task() instead", - 1) < 0) { - return NULL; - } - - current_task_func = _PyObject_GetAttrId(asyncio_mod, &PyId_current_task); - if (current_task_func == NULL) { - return NULL; - } - - if (loop == Py_None) { - loop = get_event_loop(); - if (loop == NULL) { - Py_DECREF(current_task_func); - return NULL; - } - ret = PyObject_CallFunctionObjArgs(current_task_func, loop, NULL); - Py_DECREF(current_task_func); - Py_DECREF(loop); - return ret; - } - else { - ret = PyObject_CallFunctionObjArgs(current_task_func, loop, NULL); - Py_DECREF(current_task_func); - return ret; - } + FutureObj *fut = (FutureObj*)self; + return _asyncio_Future__make_cancelled_error_impl(fut); } -/*[clinic input] -@classmethod -_asyncio.Task.all_tasks - - loop: object = None - -Return a set of all tasks for an event loop. - -By default all tasks for the current event loop are returned. -[clinic start generated code]*/ - -static PyObject * -_asyncio_Task_all_tasks_impl(PyTypeObject *type, PyObject *loop) -/*[clinic end generated code: output=11f9b20749ccca5d input=497f80bc9ce726b5]*/ -{ - PyObject *res; - PyObject *all_tasks_func; - - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "Task.all_tasks() is deprecated, " \ - "use asyncio.all_tasks() instead", - 1) < 0) { - return NULL; - } - - all_tasks_func = _PyObject_GetAttrId(asyncio_mod, &PyId__all_tasks_compat); - if (all_tasks_func == NULL) { - return NULL; - } - - res = PyObject_CallFunctionObjArgs(all_tasks_func, loop, NULL); - Py_DECREF(all_tasks_func); - return res; -} /*[clinic input] _asyncio.Task._repr_info @@ -2180,13 +2211,14 @@ static PyObject * _asyncio_Task__repr_info_impl(TaskObj *self) /*[clinic end generated code: output=6a490eb66d5ba34b input=3c6d051ed3ddec8b]*/ { - return PyObject_CallFunctionObjArgs( - asyncio_task_repr_info_func, self, NULL); + return PyObject_CallOneArg(asyncio_task_repr_info_func, (PyObject *)self); } /*[clinic input] _asyncio.Task.cancel + msg: object = None + Request that this task cancel itself. This arranges for a CancelledError to be thrown into the @@ -2208,8 +2240,8 @@ was not called). [clinic start generated code]*/ static PyObject * -_asyncio_Task_cancel_impl(TaskObj *self) -/*[clinic end generated code: output=6bfc0479da9d5757 input=13f9bf496695cb52]*/ +_asyncio_Task_cancel_impl(TaskObj *self, PyObject *msg) +/*[clinic end generated code: output=c66b60d41c74f9f1 input=f4ff8e8ffc5f1c00]*/ { self->task_log_tb = 0; @@ -2221,8 +2253,8 @@ _asyncio_Task_cancel_impl(TaskObj *self) PyObject *res; int is_true; - res = _PyObject_CallMethodId( - self->task_fut_waiter, &PyId_cancel, NULL); + res = _PyObject_CallMethodIdOneArg(self->task_fut_waiter, + &PyId_cancel, msg); if (res == NULL) { return NULL; } @@ -2239,6 +2271,8 @@ _asyncio_Task_cancel_impl(TaskObj *self) } self->task_must_cancel = 1; + Py_XINCREF(msg); + Py_XSETREF(self->task_cancel_msg, msg); Py_RETURN_TRUE; } @@ -2432,7 +2466,7 @@ TaskObj_finalize(TaskObj *task) func = _PyObject_GetAttrId(task->task_loop, &PyId_call_exception_handler); if (func != NULL) { - PyObject *res = PyObject_CallFunctionObjArgs(func, context, NULL); + PyObject *res = PyObject_CallOneArg(func, context); if (res == NULL) { PyErr_WriteUnraisable(func); } @@ -2453,6 +2487,13 @@ TaskObj_finalize(TaskObj *task) FutureObj_finalize((FutureObj*)task); } +static PyObject * +task_cls_getitem(PyObject *cls, PyObject *type) +{ + Py_INCREF(cls); + return cls; +} + static void TaskObj_dealloc(PyObject *); /* Needs Task_CheckExact */ static PyMethodDef TaskType_methods[] = { @@ -2464,15 +2505,15 @@ static PyMethodDef TaskType_methods[] = { _ASYNCIO_FUTURE_DONE_METHODDEF _ASYNCIO_TASK_SET_RESULT_METHODDEF _ASYNCIO_TASK_SET_EXCEPTION_METHODDEF - _ASYNCIO_TASK_CURRENT_TASK_METHODDEF - _ASYNCIO_TASK_ALL_TASKS_METHODDEF _ASYNCIO_TASK_CANCEL_METHODDEF _ASYNCIO_TASK_GET_STACK_METHODDEF _ASYNCIO_TASK_PRINT_STACK_METHODDEF + _ASYNCIO_TASK__MAKE_CANCELLED_ERROR_METHODDEF _ASYNCIO_TASK__REPR_INFO_METHODDEF _ASYNCIO_TASK_GET_NAME_METHODDEF _ASYNCIO_TASK_SET_NAME_METHODDEF _ASYNCIO_TASK_GET_CORO_METHODDEF + {"__class_getitem__", task_cls_getitem, METH_O|METH_CLASS, NULL}, {NULL, NULL} /* Sentinel */ }; @@ -2564,7 +2605,7 @@ task_set_error_soon(TaskObj *task, PyObject *et, const char *format, ...) return NULL; } - PyObject *e = PyObject_CallFunctionObjArgs(et, msg, NULL); + PyObject *e = PyObject_CallOneArg(et, msg); Py_DECREF(msg); if (e == NULL) { return NULL; @@ -2614,7 +2655,8 @@ task_step_impl(TaskObj *task, PyObject *exc) if (!exc) { /* exc was not a CancelledError */ - exc = _PyObject_CallNoArg(asyncio_CancelledError); + exc = create_cancelled_error(task->task_cancel_msg); + if (!exc) { goto fail; } @@ -2641,13 +2683,11 @@ task_step_impl(TaskObj *task, PyObject *exc) result = _PyGen_Send((PyGenObject*)coro, Py_None); } else { - result = _PyObject_CallMethodIdObjArgs(coro, &PyId_send, - Py_None, NULL); + result = _PyObject_CallMethodIdOneArg(coro, &PyId_send, Py_None); } } else { - result = _PyObject_CallMethodIdObjArgs(coro, &PyId_throw, - exc, NULL); + result = _PyObject_CallMethodIdOneArg(coro, &PyId_throw, exc); if (clear_exc) { /* We created 'exc' during this call */ Py_DECREF(exc); @@ -2665,7 +2705,7 @@ task_step_impl(TaskObj *task, PyObject *exc) if (task->task_must_cancel) { // Task is cancelled right before coro stops. task->task_must_cancel = 0; - res = future_cancel((FutureObj*)task); + res = future_cancel((FutureObj*)task, task->task_cancel_msg); } else { res = future_set_result((FutureObj*)task, o); @@ -2682,8 +2722,15 @@ task_step_impl(TaskObj *task, PyObject *exc) if (PyErr_ExceptionMatches(asyncio_CancelledError)) { /* CancelledError */ - PyErr_Clear(); - return future_cancel((FutureObj*)task); + PyErr_Fetch(&et, &ev, &tb); + + FutureObj *fut = (FutureObj*)task; + _PyErr_StackItem *exc_state = &fut->fut_cancelled_exc_state; + exc_state->exc_type = et; + exc_state->exc_value = ev; + exc_state->exc_traceback = tb; + + return future_cancel(fut, NULL); } /* Some other exception; pop it and call Task.set_exception() */ @@ -2763,7 +2810,8 @@ task_step_impl(TaskObj *task, PyObject *exc) if (task->task_must_cancel) { PyObject *r; int is_true; - r = _PyObject_CallMethodId(result, &PyId_cancel, NULL); + r = _PyObject_CallMethodIdOneArg(result, &PyId_cancel, + task->task_cancel_msg); if (r == NULL) { return NULL; } @@ -2840,7 +2888,7 @@ task_step_impl(TaskObj *task, PyObject *exc) PyObject *stack[2]; stack[0] = wrapper; stack[1] = (PyObject *)task->task_context; - res = _PyObject_Vectorcall(add_cb, stack, 1, context_kwname); + res = PyObject_Vectorcall(add_cb, stack, 1, context_kwname); Py_DECREF(add_cb); Py_DECREF(wrapper); if (res == NULL) { @@ -2854,7 +2902,8 @@ task_step_impl(TaskObj *task, PyObject *exc) if (task->task_must_cancel) { PyObject *r; int is_true; - r = _PyObject_CallMethodId(result, &PyId_cancel, NULL); + r = _PyObject_CallMethodIdOneArg(result, &PyId_cancel, + task->task_cancel_msg); if (r == NULL) { return NULL; } @@ -3341,7 +3390,7 @@ module_init(void) PyObject *weak_set; WITH_MOD("weakref") GET_MOD_ATTR(weak_set, "WeakSet"); - all_tasks = _PyObject_CallNoArg(weak_set); + all_tasks = PyObject_CallNoArgs(weak_set); Py_CLEAR(weak_set); if (all_tasks == NULL) { goto fail; @@ -3392,9 +3441,6 @@ PyInit__asyncio(void) if (module_init() < 0) { return NULL; } - if (PyType_Ready(&FutureType) < 0) { - return NULL; - } if (PyType_Ready(&FutureIterType) < 0) { return NULL; } @@ -3404,9 +3450,6 @@ PyInit__asyncio(void) if (PyType_Ready(&TaskWakeupMethWrapper_Type) < 0) { return NULL; } - if (PyType_Ready(&TaskType) < 0) { - return NULL; - } if (PyType_Ready(&PyRunningLoopHolder_Type) < 0) { return NULL; } @@ -3416,16 +3459,13 @@ PyInit__asyncio(void) return NULL; } - Py_INCREF(&FutureType); - if (PyModule_AddObject(m, "Future", (PyObject *)&FutureType) < 0) { - Py_DECREF(&FutureType); + /* FutureType and TaskType are made ready by PyModule_AddType() calls below. */ + if (PyModule_AddType(m, &FutureType) < 0) { Py_DECREF(m); return NULL; } - Py_INCREF(&TaskType); - if (PyModule_AddObject(m, "Task", (PyObject *)&TaskType) < 0) { - Py_DECREF(&TaskType); + if (PyModule_AddType(m, &TaskType) < 0) { Py_DECREF(m); return NULL; } diff --git a/Modules/_bisectmodule.c b/Modules/_bisectmodule.c index 461a11f5099db323db2db4117843e982090d7ba7..82d800d9a8790f4450fb16a8cccc6696f0f4e033 100644 --- a/Modules/_bisectmodule.c +++ b/Modules/_bisectmodule.c @@ -6,6 +6,13 @@ Converted to C by Dmitry Vasiliev (dima at hlabs.spb.ru). #define PY_SSIZE_T_CLEAN #include "Python.h" +/*[clinic input] +module _bisect +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=4d56a2b2033b462b]*/ + +#include "clinic/_bisectmodule.c.h" + _Py_IDENTIFIER(insert); static inline Py_ssize_t @@ -44,69 +51,63 @@ internal_bisect_right(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t return lo; } -static PyObject * -bisect_right(PyObject *self, PyObject *args, PyObject *kw) +/*[clinic input] +_bisect.bisect_right -> Py_ssize_t + + a: object + x: object + lo: Py_ssize_t = 0 + hi: Py_ssize_t(c_default='-1', accept={int, NoneType}) = None + +Return the index where to insert item x in list a, assuming a is sorted. + +The return value i is such that all e in a[:i] have e <= x, and all e in +a[i:] have e > x. So if x already appears in the list, i points just +beyond the rightmost x already there + +Optional args lo (default 0) and hi (default len(a)) bound the +slice of a to be searched. +[clinic start generated code]*/ + +static Py_ssize_t +_bisect_bisect_right_impl(PyObject *module, PyObject *a, PyObject *x, + Py_ssize_t lo, Py_ssize_t hi) +/*[clinic end generated code: output=419e150cf1d2a235 input=e72212b282c83375]*/ { - PyObject *list, *item; - Py_ssize_t lo = 0; - Py_ssize_t hi = -1; - Py_ssize_t index; - static char *keywords[] = {"a", "x", "lo", "hi", NULL}; - - if (kw == NULL && PyTuple_GET_SIZE(args) == 2) { - list = PyTuple_GET_ITEM(args, 0); - item = PyTuple_GET_ITEM(args, 1); - } - else { - if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|nn:bisect_right", - keywords, &list, &item, &lo, &hi)) - return NULL; - } - index = internal_bisect_right(list, item, lo, hi); - if (index < 0) - return NULL; - return PyLong_FromSsize_t(index); + return internal_bisect_right(a, x, lo, hi); } -PyDoc_STRVAR(bisect_right_doc, -"bisect_right(a, x[, lo[, hi]]) -> index\n\ -\n\ -Return the index where to insert item x in list a, assuming a is sorted.\n\ -\n\ -The return value i is such that all e in a[:i] have e <= x, and all e in\n\ -a[i:] have e > x. So if x already appears in the list, i points just\n\ -beyond the rightmost x already there\n\ -\n\ -Optional args lo (default 0) and hi (default len(a)) bound the\n\ -slice of a to be searched.\n"); +/*[clinic input] +_bisect.insort_right + + a: object + x: object + lo: Py_ssize_t = 0 + hi: Py_ssize_t(c_default='-1', accept={int, NoneType}) = None + +Insert item x in list a, and keep it sorted assuming a is sorted. + +If x is already in a, insert it to the right of the rightmost x. + +Optional args lo (default 0) and hi (default len(a)) bound the +slice of a to be searched. +[clinic start generated code]*/ static PyObject * -insort_right(PyObject *self, PyObject *args, PyObject *kw) +_bisect_insort_right_impl(PyObject *module, PyObject *a, PyObject *x, + Py_ssize_t lo, Py_ssize_t hi) +/*[clinic end generated code: output=c2caa3d4cd02035a input=d1c45bfa68182669]*/ { - PyObject *list, *item, *result; - Py_ssize_t lo = 0; - Py_ssize_t hi = -1; - Py_ssize_t index; - static char *keywords[] = {"a", "x", "lo", "hi", NULL}; - - if (kw == NULL && PyTuple_GET_SIZE(args) == 2) { - list = PyTuple_GET_ITEM(args, 0); - item = PyTuple_GET_ITEM(args, 1); - } - else { - if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|nn:insort_right", - keywords, &list, &item, &lo, &hi)) - return NULL; - } - index = internal_bisect_right(list, item, lo, hi); + PyObject *result; + Py_ssize_t index = internal_bisect_right(a, x, lo, hi); if (index < 0) return NULL; - if (PyList_CheckExact(list)) { - if (PyList_Insert(list, index, item) < 0) + if (PyList_CheckExact(a)) { + if (PyList_Insert(a, index, x) < 0) return NULL; } else { - result = _PyObject_CallMethodId(list, &PyId_insert, "nO", index, item); + result = _PyObject_CallMethodId(a, &PyId_insert, "nO", index, x); if (result == NULL) return NULL; Py_DECREF(result); @@ -115,16 +116,6 @@ insort_right(PyObject *self, PyObject *args, PyObject *kw) Py_RETURN_NONE; } -PyDoc_STRVAR(insort_right_doc, -"insort_right(a, x[, lo[, hi]])\n\ -\n\ -Insert item x in list a, and keep it sorted assuming a is sorted.\n\ -\n\ -If x is already in a, insert it to the right of the rightmost x.\n\ -\n\ -Optional args lo (default 0) and hi (default len(a)) bound the\n\ -slice of a to be searched.\n"); - static inline Py_ssize_t internal_bisect_left(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t hi) { @@ -161,67 +152,64 @@ internal_bisect_left(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t h return lo; } -static PyObject * -bisect_left(PyObject *self, PyObject *args, PyObject *kw) + +/*[clinic input] +_bisect.bisect_left -> Py_ssize_t + + a: object + x: object + lo: Py_ssize_t = 0 + hi: Py_ssize_t(c_default='-1', accept={int, NoneType}) = None + +Return the index where to insert item x in list a, assuming a is sorted. + +The return value i is such that all e in a[:i] have e < x, and all e in +a[i:] have e >= x. So if x already appears in the list, i points just +before the leftmost x already there. + +Optional args lo (default 0) and hi (default len(a)) bound the +slice of a to be searched. +[clinic start generated code]*/ + +static Py_ssize_t +_bisect_bisect_left_impl(PyObject *module, PyObject *a, PyObject *x, + Py_ssize_t lo, Py_ssize_t hi) +/*[clinic end generated code: output=af82168bc2856f24 input=2bd90f34afe5609f]*/ { - PyObject *list, *item; - Py_ssize_t lo = 0; - Py_ssize_t hi = -1; - Py_ssize_t index; - static char *keywords[] = {"a", "x", "lo", "hi", NULL}; - - if (kw == NULL && PyTuple_GET_SIZE(args) == 2) { - list = PyTuple_GET_ITEM(args, 0); - item = PyTuple_GET_ITEM(args, 1); - } - else { - if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|nn:bisect_left", - keywords, &list, &item, &lo, &hi)) - return NULL; - } - index = internal_bisect_left(list, item, lo, hi); - if (index < 0) - return NULL; - return PyLong_FromSsize_t(index); + return internal_bisect_left(a, x, lo, hi); } -PyDoc_STRVAR(bisect_left_doc, -"bisect_left(a, x[, lo[, hi]]) -> index\n\ -\n\ -Return the index where to insert item x in list a, assuming a is sorted.\n\ -\n\ -The return value i is such that all e in a[:i] have e < x, and all e in\n\ -a[i:] have e >= x. So if x already appears in the list, i points just\n\ -before the leftmost x already there.\n\ -\n\ -Optional args lo (default 0) and hi (default len(a)) bound the\n\ -slice of a to be searched.\n"); + +/*[clinic input] +_bisect.insort_left + + a: object + x: object + lo: Py_ssize_t = 0 + hi: Py_ssize_t(c_default='-1', accept={int, NoneType}) = None + +Insert item x in list a, and keep it sorted assuming a is sorted. + +If x is already in a, insert it to the left of the leftmost x. + +Optional args lo (default 0) and hi (default len(a)) bound the +slice of a to be searched. +[clinic start generated code]*/ static PyObject * -insort_left(PyObject *self, PyObject *args, PyObject *kw) +_bisect_insort_left_impl(PyObject *module, PyObject *a, PyObject *x, + Py_ssize_t lo, Py_ssize_t hi) +/*[clinic end generated code: output=9e8356c0844a182b input=bc4583308bce00cc]*/ { - PyObject *list, *item, *result; - Py_ssize_t lo = 0; - Py_ssize_t hi = -1; - Py_ssize_t index; - static char *keywords[] = {"a", "x", "lo", "hi", NULL}; - - if (kw == NULL && PyTuple_GET_SIZE(args) == 2) { - list = PyTuple_GET_ITEM(args, 0); - item = PyTuple_GET_ITEM(args, 1); - } else { - if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|nn:insort_left", - keywords, &list, &item, &lo, &hi)) - return NULL; - } - index = internal_bisect_left(list, item, lo, hi); + PyObject *result; + Py_ssize_t index = internal_bisect_left(a, x, lo, hi); if (index < 0) return NULL; - if (PyList_CheckExact(list)) { - if (PyList_Insert(list, index, item) < 0) + if (PyList_CheckExact(a)) { + if (PyList_Insert(a, index, x) < 0) return NULL; } else { - result = _PyObject_CallMethodId(list, &PyId_insert, "nO", index, item); + result = _PyObject_CallMethodId(a, &PyId_insert, "nO", index, x); if (result == NULL) return NULL; Py_DECREF(result); @@ -230,25 +218,11 @@ insort_left(PyObject *self, PyObject *args, PyObject *kw) Py_RETURN_NONE; } -PyDoc_STRVAR(insort_left_doc, -"insort_left(a, x[, lo[, hi]])\n\ -\n\ -Insert item x in list a, and keep it sorted assuming a is sorted.\n\ -\n\ -If x is already in a, insert it to the left of the leftmost x.\n\ -\n\ -Optional args lo (default 0) and hi (default len(a)) bound the\n\ -slice of a to be searched.\n"); - static PyMethodDef bisect_methods[] = { - {"bisect_right", (PyCFunction)(void(*)(void))bisect_right, - METH_VARARGS|METH_KEYWORDS, bisect_right_doc}, - {"insort_right", (PyCFunction)(void(*)(void))insort_right, - METH_VARARGS|METH_KEYWORDS, insort_right_doc}, - {"bisect_left", (PyCFunction)(void(*)(void))bisect_left, - METH_VARARGS|METH_KEYWORDS, bisect_left_doc}, - {"insort_left", (PyCFunction)(void(*)(void))insort_left, - METH_VARARGS|METH_KEYWORDS, insort_left_doc}, + _BISECT_BISECT_RIGHT_METHODDEF + _BISECT_INSORT_RIGHT_METHODDEF + _BISECT_BISECT_LEFT_METHODDEF + _BISECT_INSORT_LEFT_METHODDEF {NULL, NULL} /* sentinel */ }; diff --git a/Modules/_blake2/blake2b_impl.c b/Modules/_blake2/blake2b_impl.c index edab31ea222ab82fdff89a8bf48fa037f3836641..7fb1296f8b2b90b480d2879db2c6197f824eff7d 100644 --- a/Modules/_blake2/blake2b_impl.c +++ b/Modules/_blake2/blake2b_impl.c @@ -15,7 +15,6 @@ #include "Python.h" #include "pystrhex.h" -#include "pythread.h" #include "../hashlib.h" #include "blake2ns.h" @@ -81,6 +80,7 @@ _blake2.blake2b.__new__ as py_blake2b_new node_depth: int = 0 inner_size: int = 0 last_node: bool = False + usedforsecurity: bool = True Return a new BLAKE2b hash object. [clinic start generated code]*/ @@ -90,8 +90,8 @@ py_blake2b_new_impl(PyTypeObject *type, PyObject *data, int digest_size, Py_buffer *key, Py_buffer *salt, Py_buffer *person, int fanout, int depth, unsigned long leaf_size, unsigned long long node_offset, int node_depth, - int inner_size, int last_node) -/*[clinic end generated code: output=65e732c66c2297a0 input=82be35a4e6a9daa2]*/ + int inner_size, int last_node, int usedforsecurity) +/*[clinic end generated code: output=32bfd8f043c6896f input=b947312abff46977]*/ { BLAKE2bObject *self = NULL; Py_buffer buf; diff --git a/Modules/_blake2/blake2module.c b/Modules/_blake2/blake2module.c index e2a3d420d4eb8ef845df04943f43ba85e18b61db..ff142c9f3ed33049bf06ba15ff9ce62e91af3fe7 100644 --- a/Modules/_blake2/blake2module.c +++ b/Modules/_blake2/blake2module.c @@ -62,14 +62,11 @@ PyInit__blake2(void) return NULL; /* BLAKE2b */ - Py_TYPE(&PyBlake2_BLAKE2bType) = &PyType_Type; - if (PyType_Ready(&PyBlake2_BLAKE2bType) < 0) { + Py_SET_TYPE(&PyBlake2_BLAKE2bType, &PyType_Type); + if (PyModule_AddType(m, &PyBlake2_BLAKE2bType) < 0) { return NULL; } - Py_INCREF(&PyBlake2_BLAKE2bType); - PyModule_AddObject(m, "blake2b", (PyObject *)&PyBlake2_BLAKE2bType); - d = PyBlake2_BLAKE2bType.tp_dict; ADD_INT(d, "SALT_SIZE", BLAKE2B_SALTBYTES); ADD_INT(d, "PERSON_SIZE", BLAKE2B_PERSONALBYTES); @@ -82,14 +79,11 @@ PyInit__blake2(void) PyModule_AddIntConstant(m, "BLAKE2B_MAX_DIGEST_SIZE", BLAKE2B_OUTBYTES); /* BLAKE2s */ - Py_TYPE(&PyBlake2_BLAKE2sType) = &PyType_Type; - if (PyType_Ready(&PyBlake2_BLAKE2sType) < 0) { + Py_SET_TYPE(&PyBlake2_BLAKE2sType, &PyType_Type); + if (PyModule_AddType(m, &PyBlake2_BLAKE2sType) < 0) { return NULL; } - Py_INCREF(&PyBlake2_BLAKE2sType); - PyModule_AddObject(m, "blake2s", (PyObject *)&PyBlake2_BLAKE2sType); - d = PyBlake2_BLAKE2sType.tp_dict; ADD_INT(d, "SALT_SIZE", BLAKE2S_SALTBYTES); ADD_INT(d, "PERSON_SIZE", BLAKE2S_PERSONALBYTES); diff --git a/Modules/_blake2/blake2s_impl.c b/Modules/_blake2/blake2s_impl.c index ef2f7e1980ff30db926a283bcafb61a20f2f01bc..e3e90d0587b8054d1bf2db83c12feb93f126a349 100644 --- a/Modules/_blake2/blake2s_impl.c +++ b/Modules/_blake2/blake2s_impl.c @@ -15,7 +15,6 @@ #include "Python.h" #include "pystrhex.h" -#include "pythread.h" #include "../hashlib.h" #include "blake2ns.h" @@ -81,6 +80,7 @@ _blake2.blake2s.__new__ as py_blake2s_new node_depth: int = 0 inner_size: int = 0 last_node: bool = False + usedforsecurity: bool = True Return a new BLAKE2s hash object. [clinic start generated code]*/ @@ -90,8 +90,8 @@ py_blake2s_new_impl(PyTypeObject *type, PyObject *data, int digest_size, Py_buffer *key, Py_buffer *salt, Py_buffer *person, int fanout, int depth, unsigned long leaf_size, unsigned long long node_offset, int node_depth, - int inner_size, int last_node) -/*[clinic end generated code: output=b95806be0514dcf7 input=641c0509debf714d]*/ + int inner_size, int last_node, int usedforsecurity) +/*[clinic end generated code: output=556181f73905c686 input=4dda87723f23abb0]*/ { BLAKE2sObject *self = NULL; Py_buffer buf; diff --git a/Modules/_blake2/clinic/blake2b_impl.c.h b/Modules/_blake2/clinic/blake2b_impl.c.h index cd329c07c99981942dcaa570a1a5db2769676b2e..07258c31c9bff6560a8dc53d6a19f1b68b304efd 100644 --- a/Modules/_blake2/clinic/blake2b_impl.c.h +++ b/Modules/_blake2/clinic/blake2b_impl.c.h @@ -5,7 +5,8 @@ preserve PyDoc_STRVAR(py_blake2b_new__doc__, "blake2b(data=b\'\', /, *, digest_size=_blake2.blake2b.MAX_DIGEST_SIZE,\n" " key=b\'\', salt=b\'\', person=b\'\', fanout=1, depth=1, leaf_size=0,\n" -" node_offset=0, node_depth=0, inner_size=0, last_node=False)\n" +" node_offset=0, node_depth=0, inner_size=0, last_node=False,\n" +" usedforsecurity=True)\n" "--\n" "\n" "Return a new BLAKE2b hash object."); @@ -15,15 +16,15 @@ py_blake2b_new_impl(PyTypeObject *type, PyObject *data, int digest_size, Py_buffer *key, Py_buffer *salt, Py_buffer *person, int fanout, int depth, unsigned long leaf_size, unsigned long long node_offset, int node_depth, - int inner_size, int last_node); + int inner_size, int last_node, int usedforsecurity); static PyObject * py_blake2b_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"", "digest_size", "key", "salt", "person", "fanout", "depth", "leaf_size", "node_offset", "node_depth", "inner_size", "last_node", NULL}; + static const char * const _keywords[] = {"", "digest_size", "key", "salt", "person", "fanout", "depth", "leaf_size", "node_offset", "node_depth", "inner_size", "last_node", "usedforsecurity", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "blake2b", 0}; - PyObject *argsbuf[12]; + PyObject *argsbuf[13]; PyObject * const *fastargs; Py_ssize_t nargs = PyTuple_GET_SIZE(args); Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; @@ -39,6 +40,7 @@ py_blake2b_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) int node_depth = 0; int inner_size = 0; int last_node = 0; + int usedforsecurity = 1; fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 1, 0, argsbuf); if (!fastargs) { @@ -175,12 +177,21 @@ skip_optional_posonly: goto skip_optional_kwonly; } } - last_node = PyObject_IsTrue(fastargs[11]); - if (last_node < 0) { + if (fastargs[11]) { + last_node = PyObject_IsTrue(fastargs[11]); + if (last_node < 0) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + usedforsecurity = PyObject_IsTrue(fastargs[12]); + if (usedforsecurity < 0) { goto exit; } skip_optional_kwonly: - return_value = py_blake2b_new_impl(type, data, digest_size, &key, &salt, &person, fanout, depth, leaf_size, node_offset, node_depth, inner_size, last_node); + return_value = py_blake2b_new_impl(type, data, digest_size, &key, &salt, &person, fanout, depth, leaf_size, node_offset, node_depth, inner_size, last_node, usedforsecurity); exit: /* Cleanup for key */ @@ -261,4 +272,4 @@ _blake2_blake2b_hexdigest(BLAKE2bObject *self, PyObject *Py_UNUSED(ignored)) { return _blake2_blake2b_hexdigest_impl(self); } -/*[clinic end generated code: output=cbb625d7f60c288c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=2d6d0fe9aa42a42a input=a9049054013a1b77]*/ diff --git a/Modules/_blake2/clinic/blake2s_impl.c.h b/Modules/_blake2/clinic/blake2s_impl.c.h index 560bd68160b016645a70cf1cfbd75ff6576744a8..71c5706fb660b9b0c6e29112e7907eed6ba3e1cb 100644 --- a/Modules/_blake2/clinic/blake2s_impl.c.h +++ b/Modules/_blake2/clinic/blake2s_impl.c.h @@ -5,7 +5,8 @@ preserve PyDoc_STRVAR(py_blake2s_new__doc__, "blake2s(data=b\'\', /, *, digest_size=_blake2.blake2s.MAX_DIGEST_SIZE,\n" " key=b\'\', salt=b\'\', person=b\'\', fanout=1, depth=1, leaf_size=0,\n" -" node_offset=0, node_depth=0, inner_size=0, last_node=False)\n" +" node_offset=0, node_depth=0, inner_size=0, last_node=False,\n" +" usedforsecurity=True)\n" "--\n" "\n" "Return a new BLAKE2s hash object."); @@ -15,15 +16,15 @@ py_blake2s_new_impl(PyTypeObject *type, PyObject *data, int digest_size, Py_buffer *key, Py_buffer *salt, Py_buffer *person, int fanout, int depth, unsigned long leaf_size, unsigned long long node_offset, int node_depth, - int inner_size, int last_node); + int inner_size, int last_node, int usedforsecurity); static PyObject * py_blake2s_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"", "digest_size", "key", "salt", "person", "fanout", "depth", "leaf_size", "node_offset", "node_depth", "inner_size", "last_node", NULL}; + static const char * const _keywords[] = {"", "digest_size", "key", "salt", "person", "fanout", "depth", "leaf_size", "node_offset", "node_depth", "inner_size", "last_node", "usedforsecurity", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "blake2s", 0}; - PyObject *argsbuf[12]; + PyObject *argsbuf[13]; PyObject * const *fastargs; Py_ssize_t nargs = PyTuple_GET_SIZE(args); Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; @@ -39,6 +40,7 @@ py_blake2s_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) int node_depth = 0; int inner_size = 0; int last_node = 0; + int usedforsecurity = 1; fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 1, 0, argsbuf); if (!fastargs) { @@ -175,12 +177,21 @@ skip_optional_posonly: goto skip_optional_kwonly; } } - last_node = PyObject_IsTrue(fastargs[11]); - if (last_node < 0) { + if (fastargs[11]) { + last_node = PyObject_IsTrue(fastargs[11]); + if (last_node < 0) { + goto exit; + } + if (!--noptargs) { + goto skip_optional_kwonly; + } + } + usedforsecurity = PyObject_IsTrue(fastargs[12]); + if (usedforsecurity < 0) { goto exit; } skip_optional_kwonly: - return_value = py_blake2s_new_impl(type, data, digest_size, &key, &salt, &person, fanout, depth, leaf_size, node_offset, node_depth, inner_size, last_node); + return_value = py_blake2s_new_impl(type, data, digest_size, &key, &salt, &person, fanout, depth, leaf_size, node_offset, node_depth, inner_size, last_node, usedforsecurity); exit: /* Cleanup for key */ @@ -261,4 +272,4 @@ _blake2_blake2s_hexdigest(BLAKE2sObject *self, PyObject *Py_UNUSED(ignored)) { return _blake2_blake2s_hexdigest_impl(self); } -/*[clinic end generated code: output=39af5a74c8805b36 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=c80d8d06ce40a192 input=a9049054013a1b77]*/ diff --git a/Modules/_bz2module.c b/Modules/_bz2module.c index 31bbf66104119cd1c97328241ed0da688c3c2c97..880632c62349f18d78815e26b442f597991ff6b0 100644 --- a/Modules/_bz2module.c +++ b/Modules/_bz2module.c @@ -3,9 +3,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" - -#include "pythread.h" +#include "structmember.h" // PyMemberDef #include #include @@ -728,13 +726,32 @@ static PyTypeObject BZ2Decompressor_Type = { /* Module initialization. */ +static int +_bz2_exec(PyObject *module) +{ + if (PyModule_AddType(module, &BZ2Compressor_Type) < 0) { + return -1; + } + + if (PyModule_AddType(module, &BZ2Decompressor_Type) < 0) { + return -1; + } + + return 0; +} + +static struct PyModuleDef_Slot _bz2_slots[] = { + {Py_mod_exec, _bz2_exec}, + {0, NULL} +}; + static struct PyModuleDef _bz2module = { PyModuleDef_HEAD_INIT, "_bz2", NULL, - -1, - NULL, + 0, NULL, + _bz2_slots, NULL, NULL, NULL @@ -743,23 +760,5 @@ static struct PyModuleDef _bz2module = { PyMODINIT_FUNC PyInit__bz2(void) { - PyObject *m; - - if (PyType_Ready(&BZ2Compressor_Type) < 0) - return NULL; - if (PyType_Ready(&BZ2Decompressor_Type) < 0) - return NULL; - - m = PyModule_Create(&_bz2module); - if (m == NULL) - return NULL; - - Py_INCREF(&BZ2Compressor_Type); - PyModule_AddObject(m, "BZ2Compressor", (PyObject *)&BZ2Compressor_Type); - - Py_INCREF(&BZ2Decompressor_Type); - PyModule_AddObject(m, "BZ2Decompressor", - (PyObject *)&BZ2Decompressor_Type); - - return m; + return PyModuleDef_Init(&_bz2module); } diff --git a/Modules/_codecsmodule.c b/Modules/_codecsmodule.c index a8ffb699557abf84216bf996bd996bdaf0129006..952072102d5d8d1941c095d06eb8dde15ec3564c 100644 --- a/Modules/_codecsmodule.c +++ b/Modules/_codecsmodule.c @@ -1039,13 +1039,17 @@ static PyMethodDef _codecs_functions[] = { {NULL, NULL} /* sentinel */ }; +static PyModuleDef_Slot _codecs_slots[] = { + {0, NULL} +}; + static struct PyModuleDef codecsmodule = { PyModuleDef_HEAD_INIT, "_codecs", NULL, - -1, + 0, _codecs_functions, - NULL, + _codecs_slots, NULL, NULL, NULL @@ -1054,5 +1058,5 @@ static struct PyModuleDef codecsmodule = { PyMODINIT_FUNC PyInit__codecs(void) { - return PyModule_Create(&codecsmodule); + return PyModuleDef_Init(&codecsmodule); } diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index cc2b90eaa283ea3f704e1a3f593dfcb32ffba642..7120e4dda0ed236cd99c420e4d483aa40b6b8d9a 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -1,10 +1,10 @@ #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #ifdef STDC_HEADERS #include #else -#include /* For size_t */ +#include // size_t #endif /*[clinic input] @@ -172,7 +172,7 @@ deque_new(PyTypeObject *type, PyObject *args, PyObject *kwds) MARK_END(b->rightlink); assert(BLOCKLEN >= 2); - Py_SIZE(deque) = 0; + Py_SET_SIZE(deque, 0); deque->leftblock = b; deque->rightblock = b; deque->leftindex = CENTER + 1; @@ -196,7 +196,7 @@ deque_pop(dequeobject *deque, PyObject *unused) } item = deque->rightblock->data[deque->rightindex]; deque->rightindex--; - Py_SIZE(deque)--; + Py_SET_SIZE(deque, Py_SIZE(deque) - 1); deque->state++; if (deque->rightindex < 0) { @@ -234,7 +234,7 @@ deque_popleft(dequeobject *deque, PyObject *unused) assert(deque->leftblock != NULL); item = deque->leftblock->data[deque->leftindex]; deque->leftindex++; - Py_SIZE(deque)--; + Py_SET_SIZE(deque, Py_SIZE(deque) - 1); deque->state++; if (deque->leftindex == BLOCKLEN) { @@ -287,7 +287,7 @@ deque_append_internal(dequeobject *deque, PyObject *item, Py_ssize_t maxlen) MARK_END(b->rightlink); deque->rightindex = -1; } - Py_SIZE(deque)++; + Py_SET_SIZE(deque, Py_SIZE(deque) + 1); deque->rightindex++; deque->rightblock->data[deque->rightindex] = item; if (NEEDS_TRIM(deque, maxlen)) { @@ -324,7 +324,7 @@ deque_appendleft_internal(dequeobject *deque, PyObject *item, Py_ssize_t maxlen) MARK_END(b->leftlink); deque->leftindex = BLOCKLEN; } - Py_SIZE(deque)++; + Py_SET_SIZE(deque, Py_SIZE(deque) + 1); deque->leftindex--; deque->leftblock->data[deque->leftindex] = item; if (NEEDS_TRIM(deque, deque->maxlen)) { @@ -489,7 +489,7 @@ deque_copy(PyObject *deque, PyObject *Py_UNUSED(ignored)) { PyObject *result; dequeobject *old_deque = (dequeobject *)deque; - if (Py_TYPE(deque) == &deque_type) { + if (Py_IS_TYPE(deque, &deque_type)) { dequeobject *new_deque; PyObject *rv; @@ -512,8 +512,7 @@ deque_copy(PyObject *deque, PyObject *Py_UNUSED(ignored)) return NULL; } if (old_deque->maxlen < 0) - result = PyObject_CallFunctionObjArgs((PyObject *)(Py_TYPE(deque)), - deque, NULL); + result = PyObject_CallOneArg((PyObject *)(Py_TYPE(deque)), deque); else result = PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi", deque, old_deque->maxlen, NULL); @@ -540,7 +539,7 @@ deque_concat(dequeobject *deque, PyObject *other) if (rv == 0) { PyErr_Format(PyExc_TypeError, "can only concatenate deque (not \"%.200s\") to deque", - other->ob_type->tp_name); + Py_TYPE(other)->tp_name); } return NULL; } @@ -598,7 +597,7 @@ deque_clear(dequeobject *deque) /* Set the deque to be empty using the newly allocated block */ MARK_END(b->leftlink); MARK_END(b->rightlink); - Py_SIZE(deque) = 0; + Py_SET_SIZE(deque, 0); deque->leftblock = b; deque->rightblock = b; deque->leftindex = CENTER + 1; @@ -681,7 +680,7 @@ deque_inplace_repeat(dequeobject *deque, Py_ssize_t n) if (deque->rightindex == BLOCKLEN - 1) { block *b = newblock(); if (b == NULL) { - Py_SIZE(deque) += i; + Py_SET_SIZE(deque, Py_SIZE(deque) + i); return NULL; } b->leftlink = deque->rightblock; @@ -701,7 +700,7 @@ deque_inplace_repeat(dequeobject *deque, Py_ssize_t n) deque->rightblock->data[deque->rightindex] = item; } } - Py_SIZE(deque) += i; + Py_SET_SIZE(deque, Py_SIZE(deque) + i); Py_INCREF(deque); return (PyObject *)deque; } @@ -1610,6 +1609,8 @@ static PyMethodDef deque_methods[] = { METH_FASTCALL, rotate_doc}, {"__sizeof__", (PyCFunction)deque_sizeof, METH_NOARGS, sizeof_doc}, + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* sentinel */ }; @@ -1981,7 +1982,7 @@ defdict_missing(defdictobject *dd, PyObject *key) Py_DECREF(tup); return NULL; } - value = PyEval_CallObject(factory, NULL); + value = _PyObject_CallNoArg(factory); if (value == NULL) return value; if (PyObject_SetItem((PyObject *)dd, key, value) < 0) { @@ -1991,6 +1992,13 @@ defdict_missing(defdictobject *dd, PyObject *key) return value; } +static inline PyObject* +new_defdict(defdictobject *dd, PyObject *arg) +{ + return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), + dd->default_factory ? dd->default_factory : Py_None, arg, NULL); +} + PyDoc_STRVAR(defdict_copy_doc, "D.copy() -> a shallow copy of D."); static PyObject * @@ -2000,11 +2008,7 @@ defdict_copy(defdictobject *dd, PyObject *Py_UNUSED(ignored)) whose class constructor has the same signature. Subclasses that define a different constructor signature must override copy(). */ - - if (dd->default_factory == NULL) - return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), Py_None, dd, NULL); - return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), - dd->default_factory, dd, NULL); + return new_defdict(dd, (PyObject*)dd); } static PyObject * @@ -2044,7 +2048,7 @@ defdict_reduce(defdictobject *dd, PyObject *Py_UNUSED(ignored)) args = PyTuple_Pack(1, dd->default_factory); if (args == NULL) return NULL; - items = _PyObject_CallMethodId((PyObject *)dd, &PyId_items, NULL); + items = _PyObject_CallMethodIdNoArgs((PyObject *)dd, &PyId_items); if (items == NULL) { Py_DECREF(args); return NULL; @@ -2072,6 +2076,8 @@ static PyMethodDef defdict_methods[] = { defdict_copy_doc}, {"__reduce__", (PyCFunction)defdict_reduce, METH_NOARGS, reduce_doc}, + {"__class_getitem__", (PyCFunction)Py_GenericAlias, METH_O|METH_CLASS, + PyDoc_STR("See PEP 585")}, {NULL} }; @@ -2128,6 +2134,38 @@ defdict_repr(defdictobject *dd) return result; } +static PyObject* +defdict_or(PyObject* left, PyObject* right) +{ + PyObject *self, *other; + if (PyObject_TypeCheck(left, &defdict_type)) { + self = left; + other = right; + } + else { + self = right; + other = left; + } + if (!PyDict_Check(other)) { + Py_RETURN_NOTIMPLEMENTED; + } + // Like copy(), this calls the object's class. + // Override __or__/__ror__ for subclasses with different constructors. + PyObject *new = new_defdict((defdictobject*)self, left); + if (!new) { + return NULL; + } + if (PyDict_Update(new, right)) { + Py_DECREF(new); + return NULL; + } + return new; +} + +static PyNumberMethods defdict_as_number = { + .nb_or = defdict_or, +}; + static int defdict_traverse(PyObject *self, visitproc visit, void *arg) { @@ -2199,7 +2237,7 @@ static PyTypeObject defdict_type = { 0, /* tp_setattr */ 0, /* tp_as_async */ (reprfunc)defdict_repr, /* tp_repr */ - 0, /* tp_as_number */ + &defdict_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ @@ -2400,7 +2438,7 @@ tuplegetter_descr_get(PyObject *self, PyObject *obj, PyObject *type) "descriptor for index '%zd' for tuple subclasses " "doesn't apply to '%s' object", index, - obj->ob_type->tp_name); + Py_TYPE(obj)->tp_name); return NULL; } @@ -2455,6 +2493,14 @@ tuplegetter_reduce(_tuplegetterobject *self, PyObject *Py_UNUSED(ignored)) return Py_BuildValue("(O(nO))", (PyObject*) Py_TYPE(self), self->index, self->doc); } +static PyObject* +tuplegetter_repr(_tuplegetterobject *self) +{ + return PyUnicode_FromFormat("%s(%zd, %R)", + _PyType_Name(Py_TYPE(self)), + self->index, self->doc); +} + static PyMemberDef tuplegetter_members[] = { {"__doc__", T_OBJECT, offsetof(_tuplegetterobject, doc), 0}, @@ -2477,7 +2523,7 @@ static PyTypeObject tuplegetter_type = { 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ - 0, /* tp_repr */ + (reprfunc)tuplegetter_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ @@ -2512,24 +2558,51 @@ static PyTypeObject tuplegetter_type = { /* module level code ********************************************************/ -PyDoc_STRVAR(module_doc, +PyDoc_STRVAR(collections_doc, "High performance data structures.\n\ - deque: ordered collection accessible from endpoints only\n\ - defaultdict: dict subclass with a default value factory\n\ "); -static struct PyMethodDef module_functions[] = { +static struct PyMethodDef collections_methods[] = { _COLLECTIONS__COUNT_ELEMENTS_METHODDEF {NULL, NULL} /* sentinel */ }; +static int +collections_exec(PyObject *module) { + PyTypeObject *typelist[] = { + &deque_type, + &defdict_type, + &PyODict_Type, + &dequeiter_type, + &dequereviter_type, + &tuplegetter_type + }; + + defdict_type.tp_base = &PyDict_Type; + + for (size_t i = 0; i < Py_ARRAY_LENGTH(typelist); i++) { + if (PyModule_AddType(module, typelist[i]) < 0) { + return -1; + } + } + + return 0; +} + +static struct PyModuleDef_Slot collections_slots[] = { + {Py_mod_exec, collections_exec}, + {0, NULL} +}; + static struct PyModuleDef _collectionsmodule = { PyModuleDef_HEAD_INIT, "_collections", - module_doc, - -1, - module_functions, - NULL, + collections_doc, + 0, + collections_methods, + collections_slots, NULL, NULL, NULL @@ -2538,40 +2611,5 @@ static struct PyModuleDef _collectionsmodule = { PyMODINIT_FUNC PyInit__collections(void) { - PyObject *m; - - m = PyModule_Create(&_collectionsmodule); - if (m == NULL) - return NULL; - - if (PyType_Ready(&deque_type) < 0) - return NULL; - Py_INCREF(&deque_type); - PyModule_AddObject(m, "deque", (PyObject *)&deque_type); - - defdict_type.tp_base = &PyDict_Type; - if (PyType_Ready(&defdict_type) < 0) - return NULL; - Py_INCREF(&defdict_type); - PyModule_AddObject(m, "defaultdict", (PyObject *)&defdict_type); - - Py_INCREF(&PyODict_Type); - PyModule_AddObject(m, "OrderedDict", (PyObject *)&PyODict_Type); - - if (PyType_Ready(&dequeiter_type) < 0) - return NULL; - Py_INCREF(&dequeiter_type); - PyModule_AddObject(m, "_deque_iterator", (PyObject *)&dequeiter_type); - - if (PyType_Ready(&dequereviter_type) < 0) - return NULL; - Py_INCREF(&dequereviter_type); - PyModule_AddObject(m, "_deque_reverse_iterator", (PyObject *)&dequereviter_type); - - if (PyType_Ready(&tuplegetter_type) < 0) - return NULL; - Py_INCREF(&tuplegetter_type); - PyModule_AddObject(m, "_tuplegetter", (PyObject *)&tuplegetter_type); - - return m; + return PyModuleDef_Init(&_collectionsmodule); } diff --git a/Modules/_contextvarsmodule.c b/Modules/_contextvarsmodule.c index 1abcdbfa921c272bab371f1818dc7fd6ca1779c4..d6d7f375d1230782b36c2f344ac8c704ff56a94f 100644 --- a/Modules/_contextvarsmodule.c +++ b/Modules/_contextvarsmodule.c @@ -27,33 +27,15 @@ static PyMethodDef _contextvars_methods[] = { {NULL, NULL} }; -static struct PyModuleDef _contextvarsmodule = { - PyModuleDef_HEAD_INIT, /* m_base */ - "_contextvars", /* m_name */ - module_doc, /* m_doc */ - -1, /* m_size */ - _contextvars_methods, /* m_methods */ - NULL, /* m_slots */ - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL, /* m_free */ -}; - -PyMODINIT_FUNC -PyInit__contextvars(void) +static int +_contextvars_exec(PyObject *m) { - PyObject *m = PyModule_Create(&_contextvarsmodule); - if (m == NULL) { - return NULL; - } - Py_INCREF(&PyContext_Type); if (PyModule_AddObject(m, "Context", (PyObject *)&PyContext_Type) < 0) { Py_DECREF(&PyContext_Type); - Py_DECREF(m); - return NULL; + return -1; } Py_INCREF(&PyContextVar_Type); @@ -61,8 +43,7 @@ PyInit__contextvars(void) (PyObject *)&PyContextVar_Type) < 0) { Py_DECREF(&PyContextVar_Type); - Py_DECREF(m); - return NULL; + return -1; } Py_INCREF(&PyContextToken_Type); @@ -70,9 +51,31 @@ PyInit__contextvars(void) (PyObject *)&PyContextToken_Type) < 0) { Py_DECREF(&PyContextToken_Type); - Py_DECREF(m); - return NULL; + return -1; } - return m; + return 0; +} + +static struct PyModuleDef_Slot _contextvars_slots[] = { + {Py_mod_exec, _contextvars_exec}, + {0, NULL} +}; + +static struct PyModuleDef _contextvarsmodule = { + PyModuleDef_HEAD_INIT, /* m_base */ + "_contextvars", /* m_name */ + module_doc, /* m_doc */ + 0, /* m_size */ + _contextvars_methods, /* m_methods */ + _contextvars_slots, /* m_slots */ + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL, /* m_free */ +}; + +PyMODINIT_FUNC +PyInit__contextvars(void) +{ + return PyModuleDef_Init(&_contextvarsmodule); } diff --git a/Modules/_cryptmodule.c b/Modules/_cryptmodule.c index 5d03f45f643615315ddaf20758c0dcd659e6a6db..a95f55a63c306e3ab724a35d80294f674226dc16 100644 --- a/Modules/_cryptmodule.c +++ b/Modules/_cryptmodule.c @@ -42,6 +42,9 @@ crypt_crypt_impl(PyObject *module, const char *word, const char *salt) #else crypt_result = crypt(word, salt); #endif + if (crypt_result == NULL) { + return PyErr_SetFromErrno(PyExc_OSError); + } return Py_BuildValue("s", crypt_result); } @@ -51,14 +54,17 @@ static PyMethodDef crypt_methods[] = { {NULL, NULL} /* sentinel */ }; +static PyModuleDef_Slot _crypt_slots[] = { + {0, NULL} +}; static struct PyModuleDef cryptmodule = { PyModuleDef_HEAD_INIT, "_crypt", NULL, - -1, + 0, crypt_methods, - NULL, + _crypt_slots, NULL, NULL, NULL @@ -67,5 +73,5 @@ static struct PyModuleDef cryptmodule = { PyMODINIT_FUNC PyInit__crypt(void) { - return PyModule_Create(&cryptmodule); + return PyModuleDef_Init(&cryptmodule); } diff --git a/Modules/_csv.c b/Modules/_csv.c index 46d414383cbd20b21151637a441e6b63b5ad947b..59109b018e7562c09ffe5e4cda069aaa179b2398 100644 --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -11,7 +11,7 @@ module instead. #define MODULE_VERSION "1.0" #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include @@ -21,21 +21,27 @@ typedef struct { long field_limit; /* max parsed field size */ } _csvstate; -#define _csvstate(o) ((_csvstate *)PyModule_GetState(o)) +static inline _csvstate* +get_csv_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_csvstate *)state; +} static int _csv_clear(PyObject *m) { - Py_CLEAR(_csvstate(m)->error_obj); - Py_CLEAR(_csvstate(m)->dialects); + Py_CLEAR(get_csv_state(m)->error_obj); + Py_CLEAR(get_csv_state(m)->dialects); return 0; } static int _csv_traverse(PyObject *m, visitproc visit, void *arg) { - Py_VISIT(_csvstate(m)->error_obj); - Py_VISIT(_csvstate(m)->dialects); + Py_VISIT(get_csv_state(m)->error_obj); + Py_VISIT(get_csv_state(m)->dialects); return 0; } @@ -106,7 +112,7 @@ typedef struct { static PyTypeObject Reader_Type; -#define ReaderObject_Check(v) (Py_TYPE(v) == &Reader_Type) +#define ReaderObject_Check(v) Py_IS_TYPE(v, &Reader_Type) typedef struct { PyObject_HEAD @@ -236,7 +242,7 @@ _set_char(const char *name, Py_UCS4 *target, PyObject *src, Py_UCS4 dflt) if (!PyUnicode_Check(src)) { PyErr_Format(PyExc_TypeError, "\"%s\" must be string, not %.200s", name, - src->ob_type->tp_name); + Py_TYPE(src)->tp_name); return -1; } len = PyUnicode_GetLength(src); @@ -514,10 +520,10 @@ _call_dialect(PyObject *dialect_inst, PyObject *kwargs) { PyObject *type = (PyObject *)&Dialect_Type; if (dialect_inst) { - return _PyObject_FastCallDict(type, &dialect_inst, 1, kwargs); + return PyObject_VectorcallDict(type, &dialect_inst, 1, kwargs); } else { - return _PyObject_FastCallDict(type, NULL, 0, kwargs); + return PyObject_VectorcallDict(type, NULL, 0, kwargs); } } @@ -783,7 +789,7 @@ Reader_iternext(ReaderObj *self) Py_UCS4 c; Py_ssize_t pos, linelen; unsigned int kind; - void *data; + const void *data; PyObject *lineobj; if (parse_reset(self) < 0) @@ -807,7 +813,7 @@ Reader_iternext(ReaderObj *self) "iterator should return strings, " "not %.200s " "(did you open the file in text mode?)", - lineobj->ob_type->tp_name + Py_TYPE(lineobj)->tp_name ); Py_DECREF(lineobj); return NULL; @@ -958,8 +964,6 @@ csv_reader(PyObject *module, PyObject *args, PyObject *keyword_args) } self->input_iter = PyObject_GetIter(iterator); if (self->input_iter == NULL) { - PyErr_SetString(PyExc_TypeError, - "argument 1 must be an iterator"); Py_DECREF(self); return NULL; } @@ -990,7 +994,7 @@ join_reset(WriterObj *self) * record length. */ static Py_ssize_t -join_append_data(WriterObj *self, unsigned int field_kind, void *field_data, +join_append_data(WriterObj *self, unsigned int field_kind, const void *field_data, Py_ssize_t field_len, int *quoted, int copy_phase) { @@ -1101,7 +1105,7 @@ static int join_append(WriterObj *self, PyObject *field, int quoted) { unsigned int field_kind = -1; - void *field_data = NULL; + const void *field_data = NULL; Py_ssize_t field_len = 0; Py_ssize_t rec_len; @@ -1133,7 +1137,7 @@ join_append_lineterminator(WriterObj *self) { Py_ssize_t terminator_len, i; unsigned int term_kind; - void *term_data; + const void *term_data; terminator_len = PyUnicode_GET_LENGTH(self->dialect->lineterminator); if (terminator_len == -1) @@ -1165,10 +1169,14 @@ csv_writerow(WriterObj *self, PyObject *seq) PyObject *iter, *field, *line, *result; iter = PyObject_GetIter(seq); - if (iter == NULL) - return PyErr_Format(_csvstate_global->error_obj, - "iterable expected, not %.200s", - seq->ob_type->tp_name); + if (iter == NULL) { + if (PyErr_ExceptionMatches(PyExc_TypeError)) { + PyErr_Format(_csvstate_global->error_obj, + "iterable expected, not %.200s", + Py_TYPE(seq)->tp_name); + } + return NULL; + } /* Join all fields in internal buffer. */ @@ -1240,7 +1248,7 @@ csv_writerow(WriterObj *self, PyObject *seq) if (line == NULL) { return NULL; } - result = PyObject_CallFunctionObjArgs(self->write, line, NULL); + result = PyObject_CallOneArg(self->write, line); Py_DECREF(line); return result; } @@ -1258,8 +1266,6 @@ csv_writerows(WriterObj *self, PyObject *seqseq) row_iter = PyObject_GetIter(seqseq); if (row_iter == NULL) { - PyErr_SetString(PyExc_TypeError, - "writerows() argument must be iterable"); return NULL; } while ((row_obj = PyIter_Next(row_iter))) { @@ -1627,9 +1633,6 @@ PyInit__csv(void) PyObject *module; const StyleDesc *style; - if (PyType_Ready(&Dialect_Type) < 0) - return NULL; - if (PyType_Ready(&Reader_Type) < 0) return NULL; @@ -1647,15 +1650,15 @@ PyInit__csv(void) return NULL; /* Set the field limit */ - _csvstate(module)->field_limit = 128 * 1024; + get_csv_state(module)->field_limit = 128 * 1024; /* Do I still need to add this var to the Module Dict? */ /* Add _dialects dictionary */ - _csvstate(module)->dialects = PyDict_New(); - if (_csvstate(module)->dialects == NULL) + get_csv_state(module)->dialects = PyDict_New(); + if (get_csv_state(module)->dialects == NULL) return NULL; - Py_INCREF(_csvstate(module)->dialects); - if (PyModule_AddObject(module, "_dialects", _csvstate(module)->dialects)) + Py_INCREF(get_csv_state(module)->dialects); + if (PyModule_AddObject(module, "_dialects", get_csv_state(module)->dialects)) return NULL; /* Add quote styles into dictionary */ @@ -1665,16 +1668,15 @@ PyInit__csv(void) return NULL; } - /* Add the Dialect type */ - Py_INCREF(&Dialect_Type); - if (PyModule_AddObject(module, "Dialect", (PyObject *)&Dialect_Type)) + if (PyModule_AddType(module, &Dialect_Type)) { return NULL; + } /* Add the CSV exception object to the module. */ - _csvstate(module)->error_obj = PyErr_NewException("_csv.Error", NULL, NULL); - if (_csvstate(module)->error_obj == NULL) + get_csv_state(module)->error_obj = PyErr_NewException("_csv.Error", NULL, NULL); + if (get_csv_state(module)->error_obj == NULL) return NULL; - Py_INCREF(_csvstate(module)->error_obj); - PyModule_AddObject(module, "Error", _csvstate(module)->error_obj); + Py_INCREF(get_csv_state(module)->error_obj); + PyModule_AddObject(module, "Error", get_csv_state(module)->error_obj); return module; } diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index b10b86725ff171da479cb4bbba84ef08f65ca30e..ceae67ebb1612747290348f7fc339729c990233a 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -102,7 +102,7 @@ bytes(cdata) #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include #ifdef MS_WIN32 @@ -1060,8 +1060,8 @@ PyCPointerType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) stgdict items size, align, length contain info about pointers itself, stgdict->proto has info about the pointed to type! */ - stgdict = (StgDictObject *)PyObject_CallObject( - (PyObject *)&PyCStgDict_Type, NULL); + stgdict = (StgDictObject *)_PyObject_CallNoArg( + (PyObject *)&PyCStgDict_Type); if (!stgdict) return NULL; stgdict->size = sizeof(void *); @@ -1310,7 +1310,7 @@ CharArray_get_value(CDataObject *self, void *Py_UNUSED(ignored)) static int CharArray_set_value(CDataObject *self, PyObject *value, void *Py_UNUSED(ignored)) { - char *ptr; + const char *ptr; Py_ssize_t size; if (value == NULL) { @@ -1552,8 +1552,8 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) goto error; } - stgdict = (StgDictObject *)PyObject_CallObject( - (PyObject *)&PyCStgDict_Type, NULL); + stgdict = (StgDictObject *)_PyObject_CallNoArg( + (PyObject *)&PyCStgDict_Type); if (!stgdict) goto error; @@ -2009,8 +2009,8 @@ static PyObject *CreateSwappedType(PyTypeObject *type, PyObject *args, PyObject if (result == NULL) return NULL; - stgdict = (StgDictObject *)PyObject_CallObject( - (PyObject *)&PyCStgDict_Type, NULL); + stgdict = (StgDictObject *)_PyObject_CallNoArg( + (PyObject *)&PyCStgDict_Type); if (!stgdict) { Py_DECREF(result); return NULL; @@ -2123,8 +2123,8 @@ PyCSimpleType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) goto error; } - stgdict = (StgDictObject *)PyObject_CallObject( - (PyObject *)&PyCStgDict_Type, NULL); + stgdict = (StgDictObject *)_PyObject_CallNoArg( + (PyObject *)&PyCStgDict_Type); if (!stgdict) goto error; @@ -2563,8 +2563,8 @@ PyCFuncPtrType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) PyTypeObject *result; StgDictObject *stgdict; - stgdict = (StgDictObject *)PyObject_CallObject( - (PyObject *)&PyCStgDict_Type, NULL); + stgdict = (StgDictObject *)_PyObject_CallNoArg( + (PyObject *)&PyCStgDict_Type); if (!stgdict) return NULL; @@ -4085,7 +4085,7 @@ _build_result(PyObject *result, PyObject *callargs, _Py_IDENTIFIER(__ctypes_from_outparam__); v = PyTuple_GET_ITEM(callargs, i); - v = _PyObject_CallMethodId(v, &PyId___ctypes_from_outparam__, NULL); + v = _PyObject_CallMethodIdNoArgs(v, &PyId___ctypes_from_outparam__); if (v == NULL || numretvals == 1) { Py_DECREF(callargs); return v; @@ -4798,6 +4798,12 @@ Array_length(PyObject *myself) return self->b_length; } +static PyMethodDef Array_methods[] = { + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, + { NULL, NULL } +}; + static PySequenceMethods Array_as_sequence = { Array_length, /* sq_length; */ 0, /* sq_concat; */ @@ -4846,7 +4852,7 @@ PyTypeObject PyCArray_Type = { 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ - 0, /* tp_methods */ + Array_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ @@ -5265,7 +5271,8 @@ Pointer_subscript(PyObject *myself, PyObject *item) PyObject *np; StgDictObject *stgdict, *itemdict; PyObject *proto; - Py_ssize_t i, len, cur; + Py_ssize_t i, len; + size_t cur; /* Since pointers have no length, and we want to apply different semantics to negative indices than normal @@ -5694,7 +5701,6 @@ PyInit__ctypes(void) ob_type is the metatype (the 'type'), defaults to PyType_Type, tp_base is the base type, defaults to 'object' aka PyBaseObject_Type. */ - PyEval_InitThreads(); m = PyModule_Create(&_ctypesmodule); if (!m) return NULL; @@ -5757,42 +5763,42 @@ PyInit__ctypes(void) if (PyType_Ready(&PyCData_Type) < 0) return NULL; - Py_TYPE(&Struct_Type) = &PyCStructType_Type; + Py_SET_TYPE(&Struct_Type, &PyCStructType_Type); Struct_Type.tp_base = &PyCData_Type; if (PyType_Ready(&Struct_Type) < 0) return NULL; Py_INCREF(&Struct_Type); PyModule_AddObject(m, "Structure", (PyObject *)&Struct_Type); - Py_TYPE(&Union_Type) = &UnionType_Type; + Py_SET_TYPE(&Union_Type, &UnionType_Type); Union_Type.tp_base = &PyCData_Type; if (PyType_Ready(&Union_Type) < 0) return NULL; Py_INCREF(&Union_Type); PyModule_AddObject(m, "Union", (PyObject *)&Union_Type); - Py_TYPE(&PyCPointer_Type) = &PyCPointerType_Type; + Py_SET_TYPE(&PyCPointer_Type, &PyCPointerType_Type); PyCPointer_Type.tp_base = &PyCData_Type; if (PyType_Ready(&PyCPointer_Type) < 0) return NULL; Py_INCREF(&PyCPointer_Type); PyModule_AddObject(m, "_Pointer", (PyObject *)&PyCPointer_Type); - Py_TYPE(&PyCArray_Type) = &PyCArrayType_Type; + Py_SET_TYPE(&PyCArray_Type, &PyCArrayType_Type); PyCArray_Type.tp_base = &PyCData_Type; if (PyType_Ready(&PyCArray_Type) < 0) return NULL; Py_INCREF(&PyCArray_Type); PyModule_AddObject(m, "Array", (PyObject *)&PyCArray_Type); - Py_TYPE(&Simple_Type) = &PyCSimpleType_Type; + Py_SET_TYPE(&Simple_Type, &PyCSimpleType_Type); Simple_Type.tp_base = &PyCData_Type; if (PyType_Ready(&Simple_Type) < 0) return NULL; Py_INCREF(&Simple_Type); PyModule_AddObject(m, "_SimpleCData", (PyObject *)&Simple_Type); - Py_TYPE(&PyCFuncPtr_Type) = &PyCFuncPtrType_Type; + Py_SET_TYPE(&PyCFuncPtr_Type, &PyCFuncPtrType_Type); PyCFuncPtr_Type.tp_base = &PyCData_Type; if (PyType_Ready(&PyCFuncPtr_Type) < 0) return NULL; diff --git a/Modules/_ctypes/_ctypes_test.c b/Modules/_ctypes/_ctypes_test.c index 33922082ab11a85ae8a2f012767309bee3aef2e3..1ccad8e0e3d64d4d42fe36a3e9ba69069e220298 100644 --- a/Modules/_ctypes/_ctypes_test.c +++ b/Modules/_ctypes/_ctypes_test.c @@ -4,11 +4,7 @@ #include #endif -#if defined(MS_WIN32) || defined(__CYGWIN__) -#define EXPORT(x) __declspec(dllexport) x -#else -#define EXPORT(x) x -#endif +#define EXPORT(x) Py_EXPORTED_SYMBOL x /* some functions handy for testing */ @@ -598,30 +594,6 @@ struct BITS { #endif }; -EXPORT(void) set_bitfields(struct BITS *bits, char name, int value) -{ - switch (name) { - case 'A': bits->A = value; break; - case 'B': bits->B = value; break; - case 'C': bits->C = value; break; - case 'D': bits->D = value; break; - case 'E': bits->E = value; break; - case 'F': bits->F = value; break; - case 'G': bits->G = value; break; - case 'H': bits->H = value; break; - case 'I': bits->I = value; break; -#ifdef SIGNED_SHORT_BITFIELDS - case 'M': bits->M = value; break; - case 'N': bits->N = value; break; - case 'O': bits->O = value; break; - case 'P': bits->P = value; break; - case 'Q': bits->Q = value; break; - case 'R': bits->R = value; break; - case 'S': bits->S = value; break; -#endif - } -} - EXPORT(int) unpack_bitfields(struct BITS *bits, char name) { switch (name) { @@ -1060,14 +1032,17 @@ EXPORT (HRESULT) KeepObject(IUnknown *punk) #endif +static struct PyModuleDef_Slot _ctypes_test_slots[] = { + {0, NULL} +}; static struct PyModuleDef _ctypes_testmodule = { PyModuleDef_HEAD_INIT, "_ctypes_test", NULL, - -1, + 0, module_methods, - NULL, + _ctypes_test_slots, NULL, NULL, NULL @@ -1076,5 +1051,5 @@ static struct PyModuleDef _ctypes_testmodule = { PyMODINIT_FUNC PyInit__ctypes_test(void) { - return PyModule_Create(&_ctypes_testmodule); + return PyModuleDef_Init(&_ctypes_testmodule); } diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c index 2a364d6c80e15a2ab340c22b0dc3ffceab86f1fd..19c77f4f57ef5a413fdcffbe1d42a7a111618dd0 100644 --- a/Modules/_ctypes/callbacks.c +++ b/Modules/_ctypes/callbacks.c @@ -1,6 +1,8 @@ #include "Python.h" #include "frameobject.h" +#include + #include #ifdef MS_WIN32 #include @@ -18,7 +20,7 @@ CThunkObject_dealloc(PyObject *myself) Py_XDECREF(self->callable); Py_XDECREF(self->restype); if (self->pcl_write) - ffi_closure_free(self->pcl_write); + Py_ffi_closure_free(self->pcl_write); PyObject_GC_Del(self); } @@ -84,7 +86,7 @@ PrintError(const char *msg, ...) va_list marker; va_start(marker, msg); - vsnprintf(buf, sizeof(buf), msg, marker); + PyOS_vsnprintf(buf, sizeof(buf), msg, marker); va_end(marker); if (f != NULL && f != Py_None) PyFile_WriteString(buf, f); @@ -361,8 +363,7 @@ CThunkObject *_ctypes_alloc_callback(PyObject *callable, assert(CThunk_CheckExact((PyObject *)p)); - p->pcl_write = ffi_closure_alloc(sizeof(ffi_closure), - &p->pcl_exec); + p->pcl_write = Py_ffi_closure_alloc(sizeof(ffi_closure), &p->pcl_exec); if (p->pcl_write == NULL) { PyErr_NoMemory(); goto error; @@ -408,13 +409,42 @@ CThunkObject *_ctypes_alloc_callback(PyObject *callable, "ffi_prep_cif failed with %d", result); goto error; } -#if defined(X86_DARWIN) || defined(POWERPC_DARWIN) - result = ffi_prep_closure(p->pcl_write, &p->cif, closure_fcn, p); +#if HAVE_FFI_PREP_CLOSURE_LOC +# if USING_APPLE_OS_LIBFFI +# define HAVE_FFI_PREP_CLOSURE_LOC_RUNTIME __builtin_available(macos 10.15, ios 13, watchos 6, tvos 13, *) +# else +# define HAVE_FFI_PREP_CLOSURE_LOC_RUNTIME 1 +# endif + if (HAVE_FFI_PREP_CLOSURE_LOC_RUNTIME) { + result = ffi_prep_closure_loc(p->pcl_write, &p->cif, closure_fcn, + p, + p->pcl_exec); + } else +#endif + { +#if USING_APPLE_OS_LIBFFI && defined(__arm64__) + PyErr_Format(PyExc_NotImplementedError, "ffi_prep_closure_loc() is missing"); + goto error; #else - result = ffi_prep_closure_loc(p->pcl_write, &p->cif, closure_fcn, - p, - p->pcl_exec); +#if defined(__clang__) || defined(MACOSX) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif +#if defined(__GNUC__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif + result = ffi_prep_closure(p->pcl_write, &p->cif, closure_fcn, p); + +#if defined(__clang__) || defined(MACOSX) + #pragma clang diagnostic pop +#endif +#if defined(__GNUC__) + #pragma GCC diagnostic pop +#endif + +#endif + } if (result != FFI_OK) { PyErr_Format(PyExc_RuntimeError, "ffi_prep_closure failed with %d", result); @@ -438,7 +468,6 @@ static void LoadPython(void) { if (!Py_IsInitialized()) { Py_Initialize(); - PyEval_InitThreads(); } } diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index de75918d49f3709063367ba906f4986231fbaddc..f2506de54498e7b38f3e0ed00418ad25751c7a1b 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -55,7 +55,9 @@ */ #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef + +#include #ifdef MS_WIN32 #include @@ -64,6 +66,10 @@ #include "ctypes_dlfcn.h" #endif +#ifdef __APPLE__ +#include +#endif + #ifdef MS_WIN32 #include #endif @@ -156,10 +162,9 @@ _ctypes_get_errobj(int **pspace) Py_INCREF(errobj); } else if (!PyErr_Occurred()) { - void *space = PyMem_Malloc(sizeof(int) * 2); + void *space = PyMem_Calloc(2, sizeof(int)); if (space == NULL) return NULL; - memset(space, 0, sizeof(int) * 2); errobj = PyCapsule_New(space, CTYPES_CAPSULE_NAME_PYMEM, pymem_destructor); if (errobj == NULL) { PyMem_Free(space); @@ -739,7 +744,7 @@ static int ConvParam(PyObject *obj, Py_ssize_t index, struct argument *pa) #if defined(MS_WIN32) && !defined(_WIN32_WCE) /* Per: https://msdn.microsoft.com/en-us/library/7572ztz4.aspx -To be returned by value in RAX, user-defined types must have a length +To be returned by value in RAX, user-defined types must have a length of 1, 2, 4, 8, 16, 32, or 64 bits */ int can_return_struct_as_int(size_t s) @@ -800,7 +805,8 @@ static int _call_function_pointer(int flags, ffi_type **atypes, ffi_type *restype, void *resmem, - int argcount) + int argcount, + int argtypecount) { PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */ PyObject *error_object = NULL; @@ -823,14 +829,70 @@ static int _call_function_pointer(int flags, if ((flags & FUNCFLAG_CDECL) == 0) cc = FFI_STDCALL; #endif - if (FFI_OK != ffi_prep_cif(&cif, - cc, - argcount, - restype, - atypes)) { - PyErr_SetString(PyExc_RuntimeError, - "ffi_prep_cif failed"); - return -1; + +# if USING_APPLE_OS_LIBFFI +# define HAVE_FFI_PREP_CIF_VAR_RUNTIME __builtin_available(macos 10.15, ios 13, watchos 6, tvos 13, *) +# elif HAVE_FFI_PREP_CIF_VAR +# define HAVE_FFI_PREP_CIF_VAR_RUNTIME true +# else +# define HAVE_FFI_PREP_CIF_VAR_RUNTIME false +# endif + + /* Even on Apple-arm64 the calling convention for variadic functions conincides + * with the standard calling convention in the case that the function called + * only with its fixed arguments. Thus, we do not need a special flag to be + * set on variadic functions. We treat a function as variadic if it is called + * with a nonzero number of variadic arguments */ + bool is_variadic = (argtypecount != 0 && argcount > argtypecount); + (void) is_variadic; + +#if defined(__APPLE__) && defined(__arm64__) + if (is_variadic) { + if (HAVE_FFI_PREP_CIF_VAR_RUNTIME) { + } else { + PyErr_SetString(PyExc_NotImplementedError, "ffi_prep_cif_var() is missing"); + return -1; + } + } +#endif + +#if HAVE_FFI_PREP_CIF_VAR + if (is_variadic) { + if (HAVE_FFI_PREP_CIF_VAR_RUNTIME) { + if (FFI_OK != ffi_prep_cif_var(&cif, + cc, + argtypecount, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif_var failed"); + return -1; + } + } else { + if (FFI_OK != ffi_prep_cif(&cif, + cc, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif failed"); + return -1; + } + } + } else +#endif + + { + if (FFI_OK != ffi_prep_cif(&cif, + cc, + argcount, + restype, + atypes)) { + PyErr_SetString(PyExc_RuntimeError, + "ffi_prep_cif failed"); + return -1; + } } if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) { @@ -932,7 +994,7 @@ static PyObject *GetResult(PyObject *restype, void *result, PyObject *checker) if (!checker || !retval) return retval; - v = PyObject_CallFunctionObjArgs(checker, retval, NULL); + v = PyObject_CallOneArg(checker, retval); if (v == NULL) _PyTraceback_Add("GetResult", "_ctypes/callproc.c", __LINE__-2); Py_DECREF(retval); @@ -1140,7 +1202,7 @@ PyObject *_ctypes_callproc(PPROC pProc, if (argtypes && argtype_count > i) { PyObject *v; converter = PyTuple_GET_ITEM(argtypes, i); - v = PyObject_CallFunctionObjArgs(converter, arg, NULL); + v = PyObject_CallOneArg(converter, arg); if (v == NULL) { _ctypes_extend_error(PyExc_ArgError, "argument %zd: ", i+1); goto cleanup; @@ -1200,9 +1262,8 @@ PyObject *_ctypes_callproc(PPROC pProc, if (-1 == _call_function_pointer(flags, pProc, avalues, atypes, rtype, resbuf, - Py_SAFE_DOWNCAST(argcount, - Py_ssize_t, - int))) + Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int), + Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int))) goto cleanup; #ifdef WORDS_BIGENDIAN @@ -1386,10 +1447,46 @@ copy_com_pointer(PyObject *self, PyObject *args) } #else +#ifdef HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH +static PyObject *py_dyld_shared_cache_contains_path(PyObject *self, PyObject *args) +{ + PyObject *name, *name2; + char *name_str; + + if (__builtin_available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)) { + int r; + + if (!PyArg_ParseTuple(args, "O", &name)) + return NULL; + + if (name == Py_None) + Py_RETURN_FALSE; + + if (PyUnicode_FSConverter(name, &name2) == 0) + return NULL; + name_str = PyBytes_AS_STRING(name2); + + r = _dyld_shared_cache_contains_path(name_str); + Py_DECREF(name2); + + if (r) { + Py_RETURN_TRUE; + } else { + Py_RETURN_FALSE; + } + + } else { + PyErr_SetString(PyExc_NotImplementedError, "_dyld_shared_cache_contains_path symbol is missing"); + return NULL; + } + + } +#endif + static PyObject *py_dl_open(PyObject *self, PyObject *args) { PyObject *name, *name2; - char *name_str; + const char *name_str; void * handle; #if HAVE_DECL_RTLD_LOCAL int mode = RTLD_NOW | RTLD_LOCAL; @@ -1713,10 +1810,9 @@ resize(PyObject *self, PyObject *args) if (!_CDataObject_HasExternalBuffer(obj)) { /* We are currently using the objects default buffer, but it isn't large enough any more. */ - void *ptr = PyMem_Malloc(size); + void *ptr = PyMem_Calloc(1, size); if (ptr == NULL) return PyErr_NoMemory(); - memset(ptr, 0, size); memmove(ptr, obj->b_ptr, obj->b_size); obj->b_ptr = ptr; obj->b_size = size; @@ -1740,7 +1836,7 @@ unpickle(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "OO!", &typ, &PyTuple_Type, &state)) return NULL; - obj = _PyObject_CallMethodIdObjArgs(typ, &PyId___new__, typ, NULL); + obj = _PyObject_CallMethodIdOneArg(typ, &PyId___new__, typ); if (obj == NULL) return NULL; @@ -1836,7 +1932,7 @@ pointer(PyObject *self, PyObject *arg) typ = PyDict_GetItemWithError(_ctypes_ptrtype_cache, (PyObject *)Py_TYPE(arg)); if (typ) { - return PyObject_CallFunctionObjArgs(typ, arg, NULL); + return PyObject_CallOneArg(typ, arg); } else if (PyErr_Occurred()) { return NULL; @@ -1844,7 +1940,7 @@ pointer(PyObject *self, PyObject *arg) typ = POINTER(NULL, (PyObject *)Py_TYPE(arg)); if (typ == NULL) return NULL; - result = PyObject_CallFunctionObjArgs(typ, arg, NULL); + result = PyObject_CallOneArg(typ, arg); Py_DECREF(typ); return result; } @@ -1876,6 +1972,8 @@ buffer_info(PyObject *self, PyObject *arg) return Py_BuildValue("siN", dict->format, dict->ndim, shape); } + + PyMethodDef _ctypes_module_methods[] = { {"get_errno", get_errno, METH_NOARGS}, {"set_errno", set_errno, METH_VARARGS}, @@ -1897,6 +1995,9 @@ PyMethodDef _ctypes_module_methods[] = { "dlopen(name, flag={RTLD_GLOBAL|RTLD_LOCAL}) open a shared library"}, {"dlclose", py_dl_close, METH_VARARGS, "dlclose a library"}, {"dlsym", py_dl_sym, METH_VARARGS, "find symbol in shared library"}, +#endif +#ifdef HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH + {"_dyld_shared_cache_contains_path", py_dyld_shared_cache_contains_path, METH_VARARGS, "check if path is in the shared cache"}, #endif {"alignment", align_func, METH_O, alignment_doc}, {"sizeof", sizeof_func, METH_O, sizeof_doc}, diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index 95367d50937654cd8ecc2d1e28daf1097ee4d789..2261a59e439f616807c1d802b925a7bad9b56d47 100644 --- a/Modules/_ctypes/cfield.c +++ b/Modules/_ctypes/cfield.c @@ -1,4 +1,5 @@ #include "Python.h" +#include "pycore_byteswap.h" // _Py_bswap32() #include #ifdef MS_WIN32 @@ -60,8 +61,7 @@ PyCField_FromDesc(PyObject *desc, Py_ssize_t index, #define CONT_BITFIELD 2 #define EXPAND_BITFIELD 3 - self = (CFieldObject *)PyObject_CallObject((PyObject *)&PyCField_Type, - NULL); + self = (CFieldObject *)_PyObject_CallNoArg((PyObject *)&PyCField_Type); if (self == NULL) return NULL; dict = PyType_stgdict(desc); @@ -275,7 +275,7 @@ static void PyCField_dealloc(PyObject *self) { PyCField_clear((CFieldObject *)self); - self->ob_type->tp_free((PyObject *)self); + Py_TYPE(self)->tp_free((PyObject *)self); } static PyObject * @@ -449,46 +449,32 @@ get_ulonglong(PyObject *v, unsigned long long *p) ( ( (type)x & ~(BIT_MASK(type, size) << LOW_BIT(size)) ) | ( ((type)v & BIT_MASK(type, size)) << LOW_BIT(size) ) ) \ : (type)v) -/* byte swapping macros */ -#define SWAP_2(v) \ - ( ( (v >> 8) & 0x00FF) | \ - ( (v << 8) & 0xFF00) ) - -#define SWAP_4(v) \ - ( ( (v & 0x000000FF) << 24 ) | \ - ( (v & 0x0000FF00) << 8 ) | \ - ( (v & 0x00FF0000) >> 8 ) | \ - ( ((v >> 24) & 0xFF)) ) - -#ifdef _MSC_VER -#define SWAP_8(v) \ - ( ( (v & 0x00000000000000FFL) << 56 ) | \ - ( (v & 0x000000000000FF00L) << 40 ) | \ - ( (v & 0x0000000000FF0000L) << 24 ) | \ - ( (v & 0x00000000FF000000L) << 8 ) | \ - ( (v & 0x000000FF00000000L) >> 8 ) | \ - ( (v & 0x0000FF0000000000L) >> 24 ) | \ - ( (v & 0x00FF000000000000L) >> 40 ) | \ - ( ((v >> 56) & 0xFF)) ) +#if SIZEOF_SHORT == 2 +# define SWAP_SHORT _Py_bswap16 #else -#define SWAP_8(v) \ - ( ( (v & 0x00000000000000FFLL) << 56 ) | \ - ( (v & 0x000000000000FF00LL) << 40 ) | \ - ( (v & 0x0000000000FF0000LL) << 24 ) | \ - ( (v & 0x00000000FF000000LL) << 8 ) | \ - ( (v & 0x000000FF00000000LL) >> 8 ) | \ - ( (v & 0x0000FF0000000000LL) >> 24 ) | \ - ( (v & 0x00FF000000000000LL) >> 40 ) | \ - ( ((v >> 56) & 0xFF)) ) +# error "unsupported short size" #endif -#define SWAP_INT SWAP_4 +#if SIZEOF_INT == 4 +# define SWAP_INT _Py_bswap32 +#else +# error "unsupported int size" +#endif #if SIZEOF_LONG == 4 -# define SWAP_LONG SWAP_4 +# define SWAP_LONG _Py_bswap32 #elif SIZEOF_LONG == 8 -# define SWAP_LONG SWAP_8 +# define SWAP_LONG _Py_bswap64 +#else +# error "unsupported long size" +#endif + +#if SIZEOF_LONG_LONG == 8 +# define SWAP_LONG_LONG _Py_bswap64 +#else +# error "unsupported long long size" #endif + /***************************************************************** * The setter methods return an object which must be kept alive, to keep the * data valid which has been stored in the memory block. The ctypes object @@ -570,12 +556,13 @@ h_set_sw(void *ptr, PyObject *value, Py_ssize_t size) { long val; short field; - if (get_long(value, &val) < 0) + if (get_long(value, &val) < 0) { return NULL; + } memcpy(&field, ptr, sizeof(field)); - field = SWAP_2(field); + field = SWAP_SHORT(field); field = SET(short, field, val, size); - field = SWAP_2(field); + field = SWAP_SHORT(field); memcpy(ptr, &field, sizeof(field)); _RET(value); } @@ -594,7 +581,7 @@ h_get_sw(void *ptr, Py_ssize_t size) { short val; memcpy(&val, ptr, sizeof(val)); - val = SWAP_2(val); + val = SWAP_SHORT(val); GET_BITFIELD(val, size); return PyLong_FromLong(val); } @@ -617,12 +604,13 @@ H_set_sw(void *ptr, PyObject *value, Py_ssize_t size) { unsigned long val; unsigned short field; - if (get_ulong(value, &val) < 0) + if (get_ulong(value, &val) < 0) { return NULL; + } memcpy(&field, ptr, sizeof(field)); - field = SWAP_2(field); + field = SWAP_SHORT(field); field = SET(unsigned short, field, val, size); - field = SWAP_2(field); + field = SWAP_SHORT(field); memcpy(ptr, &field, sizeof(field)); _RET(value); } @@ -642,7 +630,7 @@ H_get_sw(void *ptr, Py_ssize_t size) { unsigned short val; memcpy(&val, ptr, sizeof(val)); - val = SWAP_2(val); + val = SWAP_SHORT(val); GET_BITFIELD(val, size); return PyLong_FromLong(val); } @@ -665,8 +653,9 @@ i_set_sw(void *ptr, PyObject *value, Py_ssize_t size) { long val; int field; - if (get_long(value, &val) < 0) + if (get_long(value, &val) < 0) { return NULL; + } memcpy(&field, ptr, sizeof(field)); field = SWAP_INT(field); field = SET(int, field, val, size); @@ -695,7 +684,11 @@ i_get_sw(void *ptr, Py_ssize_t size) return PyLong_FromLong(val); } -#ifdef MS_WIN32 +#ifndef MS_WIN32 +/* http://msdn.microsoft.com/en-us/library/cc237864.aspx */ +#define VARIANT_FALSE 0x0000 +#define VARIANT_TRUE 0xFFFF +#endif /* short BOOL - VARIANT_BOOL */ static PyObject * vBOOL_set(void *ptr, PyObject *value, Py_ssize_t size) @@ -717,7 +710,6 @@ vBOOL_get(void *ptr, Py_ssize_t size) { return PyBool_FromLong((long)*(short int *)ptr); } -#endif static PyObject * bool_set(void *ptr, PyObject *value, Py_ssize_t size) @@ -758,8 +750,9 @@ I_set_sw(void *ptr, PyObject *value, Py_ssize_t size) { unsigned long val; unsigned int field; - if (get_ulong(value, &val) < 0) + if (get_ulong(value, &val) < 0) { return NULL; + } memcpy(&field, ptr, sizeof(field)); field = SWAP_INT(field); field = SET(unsigned int, field, (unsigned int)val, size); @@ -806,8 +799,9 @@ l_set_sw(void *ptr, PyObject *value, Py_ssize_t size) { long val; long field; - if (get_long(value, &val) < 0) + if (get_long(value, &val) < 0) { return NULL; + } memcpy(&field, ptr, sizeof(field)); field = SWAP_LONG(field); field = SET(long, field, val, size); @@ -854,8 +848,9 @@ L_set_sw(void *ptr, PyObject *value, Py_ssize_t size) { unsigned long val; unsigned long field; - if (get_ulong(value, &val) < 0) + if (get_ulong(value, &val) < 0) { return NULL; + } memcpy(&field, ptr, sizeof(field)); field = SWAP_LONG(field); field = SET(unsigned long, field, val, size); @@ -902,12 +897,13 @@ q_set_sw(void *ptr, PyObject *value, Py_ssize_t size) { long long val; long long field; - if (get_longlong(value, &val) < 0) + if (get_longlong(value, &val) < 0) { return NULL; + } memcpy(&field, ptr, sizeof(field)); - field = SWAP_8(field); + field = SWAP_LONG_LONG(field); field = SET(long long, field, val, size); - field = SWAP_8(field); + field = SWAP_LONG_LONG(field); memcpy(ptr, &field, sizeof(field)); _RET(value); } @@ -926,7 +922,7 @@ q_get_sw(void *ptr, Py_ssize_t size) { long long val; memcpy(&val, ptr, sizeof(val)); - val = SWAP_8(val); + val = SWAP_LONG_LONG(val); GET_BITFIELD(val, size); return PyLong_FromLongLong(val); } @@ -949,12 +945,13 @@ Q_set_sw(void *ptr, PyObject *value, Py_ssize_t size) { unsigned long long val; unsigned long long field; - if (get_ulonglong(value, &val) < 0) + if (get_ulonglong(value, &val) < 0) { return NULL; + } memcpy(&field, ptr, sizeof(field)); - field = SWAP_8(field); + field = SWAP_LONG_LONG(field); field = SET(unsigned long long, field, val, size); - field = SWAP_8(field); + field = SWAP_LONG_LONG(field); memcpy(ptr, &field, sizeof(field)); _RET(value); } @@ -973,7 +970,7 @@ Q_get_sw(void *ptr, Py_ssize_t size) { unsigned long long val; memcpy(&val, ptr, sizeof(val)); - val = SWAP_8(val); + val = SWAP_LONG_LONG(val); GET_BITFIELD(val, size); return PyLong_FromUnsignedLongLong(val); } @@ -1176,7 +1173,7 @@ u_set(void *ptr, PyObject *value, Py_ssize_t size) if (!PyUnicode_Check(value)) { PyErr_Format(PyExc_TypeError, "unicode string expected instead of %s instance", - value->ob_type->tp_name); + Py_TYPE(value)->tp_name); return NULL; } else Py_INCREF(value); @@ -1235,7 +1232,7 @@ U_set(void *ptr, PyObject *value, Py_ssize_t length) if (!PyUnicode_Check(value)) { PyErr_Format(PyExc_TypeError, "unicode string expected instead of %s instance", - value->ob_type->tp_name); + Py_TYPE(value)->tp_name); return NULL; } @@ -1284,13 +1281,13 @@ s_get(void *ptr, Py_ssize_t size) static PyObject * s_set(void *ptr, PyObject *value, Py_ssize_t length) { - char *data; + const char *data; Py_ssize_t size; if(!PyBytes_Check(value)) { PyErr_Format(PyExc_TypeError, "expected bytes, %s found", - value->ob_type->tp_name); + Py_TYPE(value)->tp_name); return NULL; } @@ -1322,7 +1319,7 @@ z_set(void *ptr, PyObject *value, Py_ssize_t size) return value; } if (PyBytes_Check(value)) { - *(char **)ptr = PyBytes_AsString(value); + *(const char **)ptr = PyBytes_AsString(value); Py_INCREF(value); return value; } else if (PyLong_Check(value)) { @@ -1335,7 +1332,7 @@ z_set(void *ptr, PyObject *value, Py_ssize_t size) } PyErr_Format(PyExc_TypeError, "bytes or integer address expected instead of %s instance", - value->ob_type->tp_name); + Py_TYPE(value)->tp_name); return NULL; } @@ -1374,7 +1371,7 @@ Z_set(void *ptr, PyObject *value, Py_ssize_t size) if (!PyUnicode_Check(value)) { PyErr_Format(PyExc_TypeError, "unicode string or integer address expected instead of %s instance", - value->ob_type->tp_name); + Py_TYPE(value)->tp_name); return NULL; } @@ -1417,7 +1414,7 @@ BSTR_set(void *ptr, PyObject *value, Py_ssize_t size) } else if (!PyUnicode_Check(value)) { PyErr_Format(PyExc_TypeError, "unicode string expected instead of %s instance", - value->ob_type->tp_name); + Py_TYPE(value)->tp_name); return NULL; } @@ -1544,8 +1541,8 @@ static struct fielddesc formattable[] = { #endif #ifdef MS_WIN32 { 'X', BSTR_set, BSTR_get, &ffi_type_pointer}, - { 'v', vBOOL_set, vBOOL_get, &ffi_type_sshort}, #endif + { 'v', vBOOL_set, vBOOL_get, &ffi_type_sshort}, #if SIZEOF__BOOL == 1 { '?', bool_set, bool_get, &ffi_type_uchar}, /* Also fallback for no native _Bool support */ #elif SIZEOF__BOOL == SIZEOF_SHORT diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h index e58f85233cb71e33132340fbe1fa03871a6b7750..3f20031d671a8a8f3920820417ce241d63789f1f 100644 --- a/Modules/_ctypes/ctypes.h +++ b/Modules/_ctypes/ctypes.h @@ -68,7 +68,7 @@ typedef struct { ffi_type *atypes[1]; } CThunkObject; extern PyTypeObject PyCThunk_Type; -#define CThunk_CheckExact(v) ((v)->ob_type == &PyCThunk_Type) +#define CThunk_CheckExact(v) Py_IS_TYPE(v, &PyCThunk_Type) typedef struct { /* First part identical to tagCDataObject */ @@ -102,7 +102,7 @@ typedef struct { } PyCFuncPtrObject; extern PyTypeObject PyCStgDict_Type; -#define PyCStgDict_CheckExact(v) ((v)->ob_type == &PyCStgDict_Type) +#define PyCStgDict_CheckExact(v) Py_IS_TYPE(v, &PyCStgDict_Type) #define PyCStgDict_Check(v) PyObject_TypeCheck(v, &PyCStgDict_Type) extern int PyCStructUnionType_update_stgdict(PyObject *fields, PyObject *type, int isStruct); @@ -112,12 +112,12 @@ extern int PyObject_stginfo(PyObject *self, Py_ssize_t *psize, Py_ssize_t *palig extern PyTypeObject PyCData_Type; -#define CDataObject_CheckExact(v) ((v)->ob_type == &PyCData_Type) +#define CDataObject_CheckExact(v) Py_IS_TYPE(v, &PyCData_Type) #define CDataObject_Check(v) PyObject_TypeCheck(v, &PyCData_Type) #define _CDataObject_HasExternalBuffer(v) ((v)->b_ptr != (char *)&(v)->b_value) extern PyTypeObject PyCSimpleType_Type; -#define PyCSimpleTypeObject_CheckExact(v) ((v)->ob_type == &PyCSimpleType_Type) +#define PyCSimpleTypeObject_CheckExact(v) Py_IS_TYPE(v, &PyCSimpleType_Type) #define PyCSimpleTypeObject_Check(v) PyObject_TypeCheck(v, &PyCSimpleType_Type) extern PyTypeObject PyCField_Type; @@ -314,7 +314,7 @@ struct tagPyCArgObject { }; extern PyTypeObject PyCArg_Type; -#define PyCArg_CheckExact(v) ((v)->ob_type == &PyCArg_Type) +#define PyCArg_CheckExact(v) Py_IS_TYPE(v, &PyCArg_Type) extern PyCArgObject *PyCArgObject_new(void); extern PyObject * @@ -366,6 +366,14 @@ PyObject *_ctypes_get_errobj(int **pspace); extern PyObject *ComError; #endif +#if USING_MALLOC_CLOSURE_DOT_C +void Py_ffi_closure_free(void *p); +void *Py_ffi_closure_alloc(size_t size, void** codeloc); +#else +#define Py_ffi_closure_free ffi_closure_free +#define Py_ffi_closure_alloc ffi_closure_alloc +#endif + /* Local Variables: compile-command: "python setup.py -q build install --home ~" diff --git a/Modules/_ctypes/libffi_osx/x86/x86-ffi64.c b/Modules/_ctypes/libffi_osx/x86/x86-ffi64.c index f2610c16c78379fd43f2b2b308ede6701e2afd9d..8e7d016488029f56eaca5412485b4b0e9462a4c9 100644 --- a/Modules/_ctypes/libffi_osx/x86/x86-ffi64.c +++ b/Modules/_ctypes/libffi_osx/x86/x86-ffi64.c @@ -57,7 +57,7 @@ ffi_call_unix64( of SSESF, SSEDF classes, that are basically SSE class, just gcc will use SF or DFmode move instead of DImode to avoid reformating penalties. - Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves + Similarly we play games with INTEGERSI_CLASS to use cheaper SImode moves whenever possible (upper half does contain padding). */ enum x86_64_reg_class { diff --git a/Modules/_ctypes/malloc_closure.c b/Modules/_ctypes/malloc_closure.c index f9cdb336958c6f352fc003257578988bb98c39d0..788bae6a96c7f4a8558f8ef3f34c01c747e659fd 100644 --- a/Modules/_ctypes/malloc_closure.c +++ b/Modules/_ctypes/malloc_closure.c @@ -89,16 +89,35 @@ static void more_core(void) /******************************************************************/ /* put the item back into the free list */ -void ffi_closure_free(void *p) +void Py_ffi_closure_free(void *p) { +#if HAVE_FFI_CLOSURE_ALLOC +#if USING_APPLE_OS_LIBFFI + if (__builtin_available(macos 10.15, ios 13, watchos 6, tvos 13, *)) { +#endif + ffi_closure_free(p); + return; +#if USING_APPLE_OS_LIBFFI + } +#endif +#endif ITEM *item = (ITEM *)p; item->next = free_list; free_list = item; } /* return one item from the free list, allocating more if needed */ -void *ffi_closure_alloc(size_t ignored, void** codeloc) +void *Py_ffi_closure_alloc(size_t size, void** codeloc) { +#if HAVE_FFI_CLOSURE_ALLOC +#if USING_APPLE_OS_LIBFFI + if (__builtin_available(macos 10.15, ios 13, watchos 6, tvos 13, *)) { +#endif + return ffi_closure_alloc(size, codeloc); +#if USING_APPLE_OS_LIBFFI + } +#endif +#endif ITEM *item; if (!free_list) more_core(); diff --git a/Modules/_ctypes/stgdict.c b/Modules/_ctypes/stgdict.c index 1d45ade5efd9037c194f0f4bfacd22d2c179ee30..443951a6b030251db13ac504afcb786d1e5d2e72 100644 --- a/Modules/_ctypes/stgdict.c +++ b/Modules/_ctypes/stgdict.c @@ -190,7 +190,7 @@ PyType_stgdict(PyObject *obj) StgDictObject * PyObject_stgdict(PyObject *self) { - PyTypeObject *type = self->ob_type; + PyTypeObject *type = Py_TYPE(self); if (!type->tp_dict || !PyCStgDict_CheckExact(type->tp_dict)) return NULL; return (StgDictObject *)type->tp_dict; @@ -231,7 +231,7 @@ MakeFields(PyObject *type, CFieldObject *descr, Py_DECREF(fieldlist); return -1; } - if (Py_TYPE(fdescr) != &PyCField_Type) { + if (!Py_IS_TYPE(fdescr, &PyCField_Type)) { PyErr_SetString(PyExc_TypeError, "unexpected type"); Py_DECREF(fdescr); Py_DECREF(fieldlist); @@ -254,7 +254,7 @@ MakeFields(PyObject *type, CFieldObject *descr, Py_DECREF(fieldlist); return -1; } - assert(Py_TYPE(new_descr) == &PyCField_Type); + assert(Py_IS_TYPE(new_descr, &PyCField_Type)); new_descr->size = fdescr->size; new_descr->offset = fdescr->offset + offset; new_descr->index = fdescr->index + index; @@ -304,7 +304,7 @@ MakeAnonFields(PyObject *type) Py_DECREF(anon_names); return -1; } - if (Py_TYPE(descr) != &PyCField_Type) { + if (!Py_IS_TYPE(descr, &PyCField_Type)) { PyErr_Format(PyExc_AttributeError, "'%U' is specified in _anonymous_ but not in " "_fields_", diff --git a/Modules/_curses_panel.c b/Modules/_curses_panel.c index 53849e3a29cc0252e9e601d13aea7c248757d75b..4f026794e341774b177d5f0cf3bfdf3a233990b3 100644 --- a/Modules/_curses_panel.c +++ b/Modules/_curses_panel.c @@ -21,19 +21,26 @@ typedef struct { PyObject *PyCursesPanel_Type; } _curses_panelstate; -#define _curses_panelstate(o) ((_curses_panelstate *)PyModule_GetState(o)) +static inline _curses_panelstate* +get_curses_panelstate(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_curses_panelstate *)state; +} static int _curses_panel_clear(PyObject *m) { - Py_CLEAR(_curses_panelstate(m)->PyCursesError); + Py_CLEAR(get_curses_panelstate(m)->PyCursesError); return 0; } static int _curses_panel_traverse(PyObject *m, visitproc visit, void *arg) { - Py_VISIT(_curses_panelstate(m)->PyCursesError); + Py_VISIT(Py_TYPE(m)); + Py_VISIT(get_curses_panelstate(m)->PyCursesError); return 0; } @@ -83,7 +90,7 @@ typedef struct { } PyCursesPanelObject; #define PyCursesPanel_Check(v) \ - (Py_TYPE(v) == _curses_panelstate_global->PyCursesPanel_Type) + Py_IS_TYPE(v, _curses_panelstate_global->PyCursesPanel_Type) /* Some helper functions. The problem is that there's always a window associated with a panel. To ensure that Python's GC doesn't pull @@ -233,7 +240,7 @@ PyCursesPanel_New(PANEL *pan, PyCursesWindowObject *wo) { PyCursesPanelObject *po; - po = PyObject_NEW(PyCursesPanelObject, + po = PyObject_New(PyCursesPanelObject, (PyTypeObject *)(_curses_panelstate_global)->PyCursesPanel_Type); if (po == NULL) return NULL; po->pan = pan; @@ -433,7 +440,9 @@ _curses_panel_panel_set_userptr(PyCursesPanelObject *self, PyObject *obj) /* In case of an ncurses error, decref the new object again */ Py_DECREF(obj); } - Py_XDECREF(oldobj); + else { + Py_XDECREF(oldobj); + } return PyCursesCheckERR(rc, "set_panel_userptr"); } @@ -645,15 +654,15 @@ PyInit__curses_panel(void) if (v == NULL) goto fail; ((PyTypeObject *)v)->tp_new = NULL; - _curses_panelstate(m)->PyCursesPanel_Type = v; + get_curses_panelstate(m)->PyCursesPanel_Type = v; import_curses(); if (PyErr_Occurred()) goto fail; /* For exception _curses_panel.error */ - _curses_panelstate(m)->PyCursesError = PyErr_NewException("_curses_panel.error", NULL, NULL); - PyDict_SetItemString(d, "error", _curses_panelstate(m)->PyCursesError); + get_curses_panelstate(m)->PyCursesError = PyErr_NewException("_curses_panel.error", NULL, NULL); + PyDict_SetItemString(d, "error", get_curses_panelstate(m)->PyCursesError); /* Make the version available */ v = PyUnicode_FromString(PyCursesVersion); @@ -661,8 +670,9 @@ PyInit__curses_panel(void) PyDict_SetItemString(d, "__version__", v); Py_DECREF(v); - Py_INCREF(_curses_panelstate(m)->PyCursesPanel_Type); - PyModule_AddObject(m, "panel", (PyObject *)_curses_panelstate(m)->PyCursesPanel_Type); + Py_INCREF(get_curses_panelstate(m)->PyCursesPanel_Type); + PyModule_AddObject(m, "panel", + (PyObject *)get_curses_panelstate(m)->PyCursesPanel_Type); return m; fail: Py_XDECREF(m); diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index b2b1117fb0934eb6228dd1a7e0f183cf45730fb7..c84f8382274b5e4d12bc6902a2ae9e24f513fafd 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -176,18 +176,6 @@ static char *screen_encoding = NULL; /* Utility Functions */ -static inline int -color_pair_to_attr(short color_number) -{ - return ((int)color_number << 8); -} - -static inline short -attr_to_color_pair(int attr) -{ - return (short)((attr & A_COLOR) >> 8); -} - /* * Check the return code from a curses function and return None * or raise an exception as appropriate. These are exported using the @@ -377,6 +365,7 @@ PyCurses_ConvertToString(PyCursesWindowObject *win, PyObject *obj, *bytes = obj; /* check for embedded null bytes */ if (PyBytes_AsStringAndSize(*bytes, &str, NULL) < 0) { + Py_DECREF(obj); return 0; } return 1; @@ -547,7 +536,7 @@ PyCursesWindow_New(WINDOW *win, const char *encoding) encoding = "utf-8"; } - wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type); + wo = PyObject_New(PyCursesWindowObject, &PyCursesWindow_Type); if (wo == NULL) return NULL; wo->win = win; wo->encoding = _PyMem_Strdup(encoding); @@ -618,7 +607,7 @@ _curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, if (type == 2) { funcname = "add_wch"; wstr[1] = L'\0'; - setcchar(&wcval, wstr, attr, attr_to_color_pair(attr), NULL); + setcchar(&wcval, wstr, attr, PAIR_NUMBER(attr), NULL); if (coordinates_group) rtn = mvwadd_wch(self->win,y,x, &wcval); else { @@ -691,8 +680,9 @@ _curses_window_addstr_impl(PyCursesWindowObject *self, int group_left_1, #else strtype = PyCurses_ConvertToString(self, str, &bytesobj, NULL); #endif - if (strtype == 0) + if (strtype == 0) { return NULL; + } if (use_attr) { attr_old = getattrs(self->win); (void)wattrset(self->win,attr); @@ -709,7 +699,7 @@ _curses_window_addstr_impl(PyCursesWindowObject *self, int group_left_1, else #endif { - char *str = PyBytes_AS_STRING(bytesobj); + const char *str = PyBytes_AS_STRING(bytesobj); funcname = "addstr"; if (use_xy) rtn = mvwaddstr(self->win,y,x,str); @@ -792,7 +782,7 @@ _curses_window_addnstr_impl(PyCursesWindowObject *self, int group_left_1, else #endif { - char *str = PyBytes_AS_STRING(bytesobj); + const char *str = PyBytes_AS_STRING(bytesobj); funcname = "addnstr"; if (use_xy) rtn = mvwaddnstr(self->win,y,x,str,n); @@ -1710,7 +1700,7 @@ _curses_window_insstr_impl(PyCursesWindowObject *self, int group_left_1, else #endif { - char *str = PyBytes_AS_STRING(bytesobj); + const char *str = PyBytes_AS_STRING(bytesobj); funcname = "insstr"; if (use_xy) rtn = mvwinsstr(self->win,y,x,str); @@ -1795,7 +1785,7 @@ _curses_window_insnstr_impl(PyCursesWindowObject *self, int group_left_1, else #endif { - char *str = PyBytes_AS_STRING(bytesobj); + const char *str = PyBytes_AS_STRING(bytesobj); funcname = "insnstr"; if (use_xy) rtn = mvwinsnstr(self->win,y,x,str,n); @@ -2586,7 +2576,7 @@ NoArgOrFlagNoReturnFunctionBody(cbreak, flag) _curses.color_content color_number: short - The number of the color (0 - COLORS). + The number of the color (0 - (COLORS-1)). / Return the red, green, and blue (RGB) components of the specified color. @@ -2597,27 +2587,32 @@ which will be between 0 (no component) and 1000 (maximum amount of component). static PyObject * _curses_color_content_impl(PyObject *module, short color_number) -/*[clinic end generated code: output=cb15cf3120d4bfc1 input=5555abb1c11e11b7]*/ +/*[clinic end generated code: output=cb15cf3120d4bfc1 input=630f6737514db6ad]*/ { short r,g,b; PyCursesInitialised; PyCursesInitialisedColor; - if (color_content(color_number, &r, &g, &b) != ERR) - return Py_BuildValue("(iii)", r, g, b); - else { - PyErr_SetString(PyCursesError, - "Argument 1 was out of range. Check value of COLORS."); + if (color_content(color_number, &r, &g, &b) == ERR) { + if (color_number >= COLORS) { + PyErr_SetString(PyCursesError, + "Argument 1 was out of range. Check value of COLORS."); + } + else { + PyErr_SetString(PyCursesError, "color_content() returned ERR"); + } return NULL; } + + return Py_BuildValue("(iii)", r, g, b); } /*[clinic input] _curses.color_pair - color_number: short - The number of the color (0 - COLORS). + pair_number: short + The number of the color pair. / Return the attribute value for displaying text in the specified color. @@ -2627,13 +2622,13 @@ other A_* attributes. pair_number() is the counterpart to this function. [clinic start generated code]*/ static PyObject * -_curses_color_pair_impl(PyObject *module, short color_number) -/*[clinic end generated code: output=6a84cb6b29ecaf9a input=a9d3eb6f50e4dc12]*/ +_curses_color_pair_impl(PyObject *module, short pair_number) +/*[clinic end generated code: output=ce609d238b70dc11 input=8dd0d5da94cb15b5]*/ { PyCursesInitialised; PyCursesInitialisedColor; - return PyLong_FromLong(color_pair_to_attr(color_number)); + return PyLong_FromLong(COLOR_PAIR(pair_number)); } /*[clinic input] @@ -2918,13 +2913,13 @@ _curses_getwin(PyObject *module, PyObject *file) if (_Py_set_inheritable(fileno(fp), 0, NULL) < 0) goto error; - data = _PyObject_CallMethodId(file, &PyId_read, NULL); + data = _PyObject_CallMethodIdNoArgs(file, &PyId_read); if (data == NULL) goto error; if (!PyBytes_Check(data)) { PyErr_Format(PyExc_TypeError, "f.read() returned %.100s instead of bytes", - data->ob_type->tp_name); + Py_TYPE(data)->tp_name); Py_DECREF(data); goto error; } @@ -3028,7 +3023,7 @@ _curses_has_key_impl(PyObject *module, int key) _curses.init_color color_number: short - The number of the color to be changed (0 - COLORS). + The number of the color to be changed (0 - (COLORS-1)). r: short Red component (0 - 1000). g: short @@ -3041,13 +3036,13 @@ Change the definition of a color. When init_color() is used, all occurrences of that color on the screen immediately change to the new definition. This function is a no-op on -most terminals; it is active only if can_change_color() returns 1. +most terminals; it is active only if can_change_color() returns true. [clinic start generated code]*/ static PyObject * _curses_init_color_impl(PyObject *module, short color_number, short r, short g, short b) -/*[clinic end generated code: output=280236f5efe9776a input=f3a05bd38f619175]*/ +/*[clinic end generated code: output=280236f5efe9776a input=128601b5dc76d548]*/ { PyCursesInitialised; PyCursesInitialisedColor; @@ -3061,9 +3056,9 @@ _curses.init_pair pair_number: short The number of the color-pair to be changed (1 - (COLOR_PAIRS-1)). fg: short - Foreground color number (0 - COLORS). + Foreground color number (-1 - (COLORS-1)). bg: short - Background color number (0 - COLORS). + Background color number (-1 - (COLORS-1)). / Change the definition of a color-pair. @@ -3075,7 +3070,7 @@ all occurrences of that color-pair are changed to the new definition. static PyObject * _curses_init_pair_impl(PyObject *module, short pair_number, short fg, short bg) -/*[clinic end generated code: output=9c2ce39c22f376b6 input=c9f0b11b17a2ac6d]*/ +/*[clinic end generated code: output=9c2ce39c22f376b6 input=12c320ec14396ea2]*/ { PyCursesInitialised; PyCursesInitialisedColor; @@ -3255,6 +3250,90 @@ _curses_setupterm_impl(PyObject *module, const char *term, int fd) Py_RETURN_NONE; } +#if defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102 +// https://invisible-island.net/ncurses/NEWS.html#index-t20080119 + +/*[clinic input] +_curses.get_escdelay + +Gets the curses ESCDELAY setting. + +Gets the number of milliseconds to wait after reading an escape character, +to distinguish between an individual escape character entered on the +keyboard from escape sequences sent by cursor and function keys. +[clinic start generated code]*/ + +static PyObject * +_curses_get_escdelay_impl(PyObject *module) +/*[clinic end generated code: output=222fa1a822555d60 input=be2d5b3dd974d0a4]*/ +{ + return PyLong_FromLong(ESCDELAY); +} +/*[clinic input] +_curses.set_escdelay + ms: int + length of the delay in milliseconds. + / + +Sets the curses ESCDELAY setting. + +Sets the number of milliseconds to wait after reading an escape character, +to distinguish between an individual escape character entered on the +keyboard from escape sequences sent by cursor and function keys. +[clinic start generated code]*/ + +static PyObject * +_curses_set_escdelay_impl(PyObject *module, int ms) +/*[clinic end generated code: output=43818efbf7980ac4 input=7796fe19f111e250]*/ +{ + if (ms <= 0) { + PyErr_SetString(PyExc_ValueError, "ms must be > 0"); + return NULL; + } + + return PyCursesCheckERR(set_escdelay(ms), "set_escdelay"); +} + +/*[clinic input] +_curses.get_tabsize + +Gets the curses TABSIZE setting. + +Gets the number of columns used by the curses library when converting a tab +character to spaces as it adds the tab to a window. +[clinic start generated code]*/ + +static PyObject * +_curses_get_tabsize_impl(PyObject *module) +/*[clinic end generated code: output=7e9e51fb6126fbdf input=74af86bf6c9f5d7e]*/ +{ + return PyLong_FromLong(TABSIZE); +} +/*[clinic input] +_curses.set_tabsize + size: int + rendered cell width of a tab character. + / + +Sets the curses TABSIZE setting. + +Sets the number of columns used by the curses library when converting a tab +character to spaces as it adds the tab to a window. +[clinic start generated code]*/ + +static PyObject * +_curses_set_tabsize_impl(PyObject *module, int size) +/*[clinic end generated code: output=c1de5a76c0daab1e input=78cba6a3021ad061]*/ +{ + if (size <= 0) { + PyErr_SetString(PyExc_ValueError, "size must be > 0"); + return NULL; + } + + return PyCursesCheckERR(set_tabsize(size), "set_tabsize"); +} +#endif + /*[clinic input] _curses.intrflush @@ -3629,9 +3708,14 @@ _curses_pair_content_impl(PyObject *module, short pair_number) PyCursesInitialised; PyCursesInitialisedColor; - if (pair_content(pair_number, &f, &b)==ERR) { - PyErr_SetString(PyCursesError, - "Argument 1 was out of range. (1..COLOR_PAIRS-1)"); + if (pair_content(pair_number, &f, &b) == ERR) { + if (pair_number >= COLOR_PAIRS) { + PyErr_SetString(PyCursesError, + "Argument 1 was out of range. (0..COLOR_PAIRS-1)"); + } + else { + PyErr_SetString(PyCursesError, "pair_content() returned ERR"); + } return NULL; } @@ -3656,7 +3740,7 @@ _curses_pair_number_impl(PyObject *module, int attr) PyCursesInitialised; PyCursesInitialisedColor; - return PyLong_FromLong(attr_to_color_pair(attr)); + return PyLong_FromLong(PAIR_NUMBER(attr)); } /*[clinic input] @@ -3730,7 +3814,7 @@ update_lines_cols(void) return 0; } /* PyId_LINES.object will be initialized here. */ - if (PyDict_SetItem(ModDict, PyId_LINES.object, o)) { + if (PyDict_SetItem(ModDict, _PyUnicode_FromId(&PyId_LINES), o)) { Py_DECREF(m); Py_DECREF(o); return 0; @@ -3746,7 +3830,7 @@ update_lines_cols(void) Py_DECREF(o); return 0; } - if (PyDict_SetItem(ModDict, PyId_COLS.object, o)) { + if (PyDict_SetItem(ModDict, _PyUnicode_FromId(&PyId_COLS), o)) { Py_DECREF(m); Py_DECREF(o); return 0; @@ -3757,15 +3841,18 @@ update_lines_cols(void) } /*[clinic input] -_curses.update_lines_cols -> int +_curses.update_lines_cols [clinic start generated code]*/ -static int +static PyObject * _curses_update_lines_cols_impl(PyObject *module) -/*[clinic end generated code: output=0345e7f072ea711a input=3a87760f7d5197f0]*/ +/*[clinic end generated code: output=423f2b1e63ed0f75 input=5f065ab7a28a5d90]*/ { - return update_lines_cols(); + if (!update_lines_cols()) { + return NULL; + } + Py_RETURN_NONE; } #endif @@ -3849,8 +3936,10 @@ _curses_resizeterm_impl(PyObject *module, int nlines, int ncols) result = PyCursesCheckERR(resizeterm(nlines, ncols), "resizeterm"); if (!result) return NULL; - if (!update_lines_cols()) + if (!update_lines_cols()) { + Py_DECREF(result); return NULL; + } return result; } @@ -3886,8 +3975,10 @@ _curses_resize_term_impl(PyObject *module, int nlines, int ncols) result = PyCursesCheckERR(resize_term(nlines, ncols), "resize_term"); if (!result) return NULL; - if (!update_lines_cols()) + if (!update_lines_cols()) { + Py_DECREF(result); return NULL; + } return result; } #endif /* HAVE_CURSES_RESIZE_TERM */ @@ -3958,12 +4049,18 @@ _curses_start_color_impl(PyObject *module) c = PyLong_FromLong((long) COLORS); if (c == NULL) return NULL; - PyDict_SetItemString(ModDict, "COLORS", c); + if (PyDict_SetItemString(ModDict, "COLORS", c) < 0) { + Py_DECREF(c); + return NULL; + } Py_DECREF(c); cp = PyLong_FromLong((long) COLOR_PAIRS); if (cp == NULL) return NULL; - PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp); + if (PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp) < 0) { + Py_DECREF(cp); + return NULL; + } Py_DECREF(cp); Py_RETURN_NONE; } else { @@ -4415,6 +4512,12 @@ static PyMethodDef PyCurses_methods[] = { _CURSES_RESIZETERM_METHODDEF _CURSES_RESIZE_TERM_METHODDEF _CURSES_SAVETTY_METHODDEF +#if defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102 + _CURSES_GET_ESCDELAY_METHODDEF + _CURSES_SET_ESCDELAY_METHODDEF +#endif + _CURSES_GET_TABSIZE_METHODDEF + _CURSES_SET_TABSIZE_METHODDEF _CURSES_SETSYX_METHODDEF _CURSES_SETUPTERM_METHODDEF _CURSES_START_COLOR_METHODDEF @@ -4637,7 +4740,8 @@ PyInit__curses(void) SetDictInt("KEY_MAX", KEY_MAX); } - Py_INCREF(&PyCursesWindow_Type); - PyModule_AddObject(m, "window", (PyObject *)&PyCursesWindow_Type); + if (PyModule_AddType(m, &PyCursesWindow_Type) < 0) { + return NULL; + } return m; } diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 41c3f34269ddc67427d7758b8161cf66d38d5d22..4e0c3783d91eb810de5194d2e2c7ba910bcbc04f 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -9,7 +9,7 @@ #include "Python.h" #include "datetime.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include @@ -18,19 +18,19 @@ #endif #define PyDate_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateType) -#define PyDate_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateType) +#define PyDate_CheckExact(op) Py_IS_TYPE(op, &PyDateTime_DateType) #define PyDateTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateTimeType) -#define PyDateTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateTimeType) +#define PyDateTime_CheckExact(op) Py_IS_TYPE(op, &PyDateTime_DateTimeType) #define PyTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_TimeType) -#define PyTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TimeType) +#define PyTime_CheckExact(op) Py_IS_TYPE(op, &PyDateTime_TimeType) #define PyDelta_Check(op) PyObject_TypeCheck(op, &PyDateTime_DeltaType) -#define PyDelta_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DeltaType) +#define PyDelta_CheckExact(op) Py_IS_TYPE(op, &PyDateTime_DeltaType) #define PyTZInfo_Check(op) PyObject_TypeCheck(op, &PyDateTime_TZInfoType) -#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TZInfoType) +#define PyTZInfo_CheckExact(op) Py_IS_TYPE(op, &PyDateTime_TZInfoType) #define PyTimezone_Check(op) PyObject_TypeCheck(op, &PyDateTime_TimeZoneType) @@ -38,8 +38,9 @@ module datetime class datetime.datetime "PyDateTime_DateTime *" "&PyDateTime_DateTimeType" class datetime.date "PyDateTime_Date *" "&PyDateTime_DateType" +class datetime.IsoCalendarDate "PyDateTime_IsoCalendarDate *" "&PyDateTime_IsoCalendarDateType" [clinic start generated code]*/ -/*[clinic end generated code: output=da39a3ee5e6b4b0d input=25138ad6a696b785]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=81bec0fa19837f63]*/ #include "clinic/_datetimemodule.c.h" @@ -131,6 +132,7 @@ class datetime.date "PyDateTime_Date *" "&PyDateTime_DateType" static PyTypeObject PyDateTime_DateType; static PyTypeObject PyDateTime_DateTimeType; static PyTypeObject PyDateTime_DeltaType; +static PyTypeObject PyDateTime_IsoCalendarDateType; static PyTypeObject PyDateTime_TimeType; static PyTypeObject PyDateTime_TZInfoType; static PyTypeObject PyDateTime_TimeZoneType; @@ -1242,8 +1244,7 @@ call_tzname(PyObject *tzinfo, PyObject *tzinfoarg) if (tzinfo == Py_None) Py_RETURN_NONE; - result = _PyObject_CallMethodIdObjArgs(tzinfo, &PyId_tzname, - tzinfoarg, NULL); + result = _PyObject_CallMethodIdOneArg(tzinfo, &PyId_tzname, tzinfoarg); if (result == NULL || result == Py_None) return result; @@ -1533,8 +1534,8 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple, ntoappend = 1; } else if ((ch = *pin++) == '\0') { - /* Null byte follows %, copy only '%'. - * + /* Null byte follows %, copy only '%'. + * * Back the pin up one char so that we catch the null check * the next time through the loop.*/ pin--; @@ -1624,7 +1625,7 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple, usednew += ntoappend; assert(usednew <= totalnew); } /* end while() */ - + if (_PyBytes_Resize(&newfmt, usednew) < 0) goto Done; { @@ -1664,7 +1665,7 @@ time_time(void) if (time != NULL) { _Py_IDENTIFIER(time); - result = _PyObject_CallMethodId(time, &PyId_time, NULL); + result = _PyObject_CallMethodIdNoArgs(time, &PyId_time); Py_DECREF(time); } return result; @@ -1698,8 +1699,7 @@ build_struct_time(int y, int m, int d, int hh, int mm, int ss, int dstflag) return NULL; } - result = _PyObject_CallMethodIdObjArgs(time, &PyId_struct_time, - args, NULL); + result = _PyObject_CallMethodIdOneArg(time, &PyId_struct_time, args); Py_DECREF(time); Py_DECREF(args); return result; @@ -1812,7 +1812,7 @@ checked_divmod(PyObject *a, PyObject *b) if (!PyTuple_Check(result)) { PyErr_Format(PyExc_TypeError, "divmod() returned non-tuple (type %.200s)", - result->ob_type->tp_name); + Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } @@ -1923,7 +1923,7 @@ get_float_as_integer_ratio(PyObject *floatobj) PyObject *ratio; assert(floatobj && PyFloat_Check(floatobj)); - ratio = _PyObject_CallMethodId(floatobj, &PyId_as_integer_ratio, NULL); + ratio = _PyObject_CallMethodIdNoArgs(floatobj, &PyId_as_integer_ratio); if (ratio == NULL) { return NULL; } @@ -2491,7 +2491,6 @@ delta_new(PyTypeObject *type, PyObject *args, PyObject *kw) int x_is_odd; PyObject *temp; - whole_us = round(leftover_us); if (fabs(whole_us - leftover_us) == 0.5) { /* We're exactly halfway between two integers. In order * to do round-half-to-even, we must determine whether x @@ -2899,8 +2898,7 @@ date_today(PyObject *cls, PyObject *dummy) * time.time() delivers; if someone were gonzo about optimization, * date.today() could get away with plain C time(). */ - result = _PyObject_CallMethodIdObjArgs(cls, &PyId_fromtimestamp, - time, NULL); + result = _PyObject_CallMethodIdOneArg(cls, &PyId_fromtimestamp, time); Py_DECREF(time); return result; } @@ -3167,7 +3165,7 @@ date_isoformat(PyDateTime_Date *self, PyObject *Py_UNUSED(ignored)) static PyObject * date_str(PyDateTime_Date *self) { - return _PyObject_CallMethodId((PyObject *)self, &PyId_isoformat, NULL); + return _PyObject_CallMethodIdNoArgs((PyObject *)self, &PyId_isoformat); } @@ -3193,7 +3191,7 @@ date_strftime(PyDateTime_Date *self, PyObject *args, PyObject *kw) &format)) return NULL; - tuple = _PyObject_CallMethodId((PyObject *)self, &PyId_timetuple, NULL); + tuple = _PyObject_CallMethodIdNoArgs((PyObject *)self, &PyId_timetuple); if (tuple == NULL) return NULL; result = wrap_strftime((PyObject *)self, format, tuple, @@ -3214,8 +3212,8 @@ date_format(PyDateTime_Date *self, PyObject *args) if (PyUnicode_GetLength(format) == 0) return PyObject_Str((PyObject *)self); - return _PyObject_CallMethodIdObjArgs((PyObject *)self, &PyId_strftime, - format, NULL); + return _PyObject_CallMethodIdOneArg((PyObject *)self, &PyId_strftime, + format); } /* ISO methods. */ @@ -3228,6 +3226,136 @@ date_isoweekday(PyDateTime_Date *self, PyObject *Py_UNUSED(ignored)) return PyLong_FromLong(dow + 1); } +PyDoc_STRVAR(iso_calendar_date__doc__, +"The result of date.isocalendar() or datetime.isocalendar()\n\n\ +This object may be accessed either as a tuple of\n\ + ((year, week, weekday)\n\ +or via the object attributes as named in the above tuple."); + +typedef struct { + PyTupleObject tuple; +} PyDateTime_IsoCalendarDate; + +static PyObject * +iso_calendar_date_repr(PyDateTime_IsoCalendarDate *self) +{ + PyObject* year = PyTuple_GetItem((PyObject *)self, 0); + if (year == NULL) { + return NULL; + } + PyObject* week = PyTuple_GetItem((PyObject *)self, 1); + if (week == NULL) { + return NULL; + } + PyObject* weekday = PyTuple_GetItem((PyObject *)self, 2); + if (weekday == NULL) { + return NULL; + } + + return PyUnicode_FromFormat("%.200s(year=%S, week=%S, weekday=%S)", + Py_TYPE(self)->tp_name, year, week, weekday); +} + +static PyObject * +iso_calendar_date_reduce(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + // Construct the tuple that this reduces to + PyObject * reduce_tuple = Py_BuildValue( + "O((OOO))", &PyTuple_Type, + PyTuple_GET_ITEM(self, 0), + PyTuple_GET_ITEM(self, 1), + PyTuple_GET_ITEM(self, 2) + ); + + return reduce_tuple; +} + +static PyObject * +iso_calendar_date_year(PyDateTime_IsoCalendarDate *self, void *unused) +{ + PyObject *year = PyTuple_GetItem((PyObject *)self, 0); + if (year == NULL) { + return NULL; + } + Py_INCREF(year); + return year; +} + +static PyObject * +iso_calendar_date_week(PyDateTime_IsoCalendarDate *self, void *unused) +{ + PyObject *week = PyTuple_GetItem((PyObject *)self, 1); + if (week == NULL) { + return NULL; + } + Py_INCREF(week); + return week; +} + +static PyObject * +iso_calendar_date_weekday(PyDateTime_IsoCalendarDate *self, void *unused) +{ + PyObject *weekday = PyTuple_GetItem((PyObject *)self, 2); + if (weekday == NULL) { + return NULL; + } + Py_INCREF(weekday); + return weekday; +} + +static PyGetSetDef iso_calendar_date_getset[] = { + {"year", (getter)iso_calendar_date_year}, + {"week", (getter)iso_calendar_date_week}, + {"weekday", (getter)iso_calendar_date_weekday}, + {NULL} +}; + +static PyMethodDef iso_calendar_date_methods[] = { + {"__reduce__", (PyCFunction)iso_calendar_date_reduce, METH_NOARGS, + PyDoc_STR("__reduce__() -> (cls, state)")}, + {NULL, NULL}, +}; + +static PyTypeObject PyDateTime_IsoCalendarDateType = { + PyVarObject_HEAD_INIT(NULL, 0) + .tp_name = "datetime.IsoCalendarDate", + .tp_basicsize = sizeof(PyDateTime_IsoCalendarDate), + .tp_repr = (reprfunc) iso_calendar_date_repr, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_doc = iso_calendar_date__doc__, + .tp_methods = iso_calendar_date_methods, + .tp_getset = iso_calendar_date_getset, + // .tp_base = &PyTuple_Type, // filled in PyInit__datetime + .tp_new = iso_calendar_date_new, +}; + +/*[clinic input] +@classmethod +datetime.IsoCalendarDate.__new__ as iso_calendar_date_new + year: int + week: int + weekday: int +[clinic start generated code]*/ + +static PyObject * +iso_calendar_date_new_impl(PyTypeObject *type, int year, int week, + int weekday) +/*[clinic end generated code: output=383d33d8dc7183a2 input=4f2c663c9d19c4ee]*/ + +{ + PyDateTime_IsoCalendarDate *self; + self = (PyDateTime_IsoCalendarDate *) type->tp_alloc(type, 3); + if (self == NULL) { + return NULL; + } + + PyTuple_SET_ITEM(self, 0, PyLong_FromLong(year)); + PyTuple_SET_ITEM(self, 1, PyLong_FromLong(week)); + PyTuple_SET_ITEM(self, 2, PyLong_FromLong(weekday)); + + return (PyObject *)self; +} + static PyObject * date_isocalendar(PyDateTime_Date *self, PyObject *Py_UNUSED(ignored)) { @@ -3247,7 +3375,13 @@ date_isocalendar(PyDateTime_Date *self, PyObject *Py_UNUSED(ignored)) ++year; week = 0; } - return Py_BuildValue("iii", year, week + 1, day + 1); + + PyObject* v = iso_calendar_date_new_impl(&PyDateTime_IsoCalendarDateType, + year, week + 1, day + 1); + if (v == NULL) { + return NULL; + } + return v; } /* Miscellaneous methods. */ @@ -3386,7 +3520,7 @@ static PyMethodDef date_methods[] = { PyDoc_STR("Return time tuple, compatible with time.localtime().")}, {"isocalendar", (PyCFunction)date_isocalendar, METH_NOARGS, - PyDoc_STR("Return a 3-tuple containing ISO year, week number, and " + PyDoc_STR("Return a named tuple containing ISO year, week number, and " "weekday.")}, {"isoformat", (PyCFunction)date_isoformat, METH_NOARGS, @@ -3614,7 +3748,7 @@ tzinfo_reduce(PyObject *self, PyObject *Py_UNUSED(ignored)) return NULL; } if (getinitargs != NULL) { - args = _PyObject_CallNoArg(getinitargs); + args = PyObject_CallNoArgs(getinitargs); Py_DECREF(getinitargs); } else { @@ -3629,7 +3763,7 @@ tzinfo_reduce(PyObject *self, PyObject *Py_UNUSED(ignored)) return NULL; } if (getstate != NULL) { - state = _PyObject_CallNoArg(getstate); + state = PyObject_CallNoArgs(getstate); Py_DECREF(getstate); if (state == NULL) { Py_DECREF(args); @@ -3945,7 +4079,7 @@ static PyTypeObject PyDateTime_TimeZoneType = { timezone_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ - &PyDateTime_TZInfoType, /* tp_base */ + 0, /* tp_base; filled in PyInit__datetime */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ @@ -4176,18 +4310,18 @@ time_repr(PyDateTime_Time *self) static PyObject * time_str(PyDateTime_Time *self) { - return _PyObject_CallMethodId((PyObject *)self, &PyId_isoformat, NULL); + return _PyObject_CallMethodIdNoArgs((PyObject *)self, &PyId_isoformat); } static PyObject * time_isoformat(PyDateTime_Time *self, PyObject *args, PyObject *kw) { char buf[100]; - char *timespec = NULL; + const char *timespec = NULL; static char *keywords[] = {"timespec", NULL}; PyObject *result; int us = TIME_GET_MICROSECOND(self); - static char *specs[][2] = { + static const char *specs[][2] = { {"hours", "%02d"}, {"minutes", "%02d:%02d"}, {"seconds", "%02d:%02d:%02d"}, @@ -4539,7 +4673,10 @@ static PyMethodDef time_methods[] = { {"isoformat", (PyCFunction)(void(*)(void))time_isoformat, METH_VARARGS | METH_KEYWORDS, PyDoc_STR("Return string in ISO 8601 format, [HH[:MM[:SS[.mmm[uuu]]]]]" "[+HH:MM].\n\n" - "timespec specifies what components of the time to include.\n")}, + "The optional argument timespec specifies the number " + "of additional terms\nof the time to include. Valid " + "options are 'auto', 'hours', 'minutes',\n'seconds', " + "'milliseconds' and 'microseconds'.\n")}, {"strftime", (PyCFunction)(void(*)(void))time_strftime, METH_VARARGS | METH_KEYWORDS, PyDoc_STR("format -> strftime() style string.")}, @@ -5419,7 +5556,7 @@ datetime_isoformat(PyDateTime_DateTime *self, PyObject *args, PyObject *kw) char buffer[100]; PyObject *result = NULL; int us = DATE_GET_MICROSECOND(self); - static char *specs[][2] = { + static const char *specs[][2] = { {"hours", "%04d-%02d-%02d%c%02d"}, {"minutes", "%04d-%02d-%02d%c%02d:%02d"}, {"seconds", "%04d-%02d-%02d%c%02d:%02d:%02d"}, @@ -5961,7 +6098,7 @@ datetime_astimezone(PyDateTime_DateTime *self, PyObject *args, PyObject *kw) temp = (PyObject *)result; result = (PyDateTime_DateTime *) - _PyObject_CallMethodIdObjArgs(tzinfo, &PyId_fromutc, temp, NULL); + _PyObject_CallMethodIdOneArg(tzinfo, &PyId_fromutc, temp); Py_DECREF(temp); return result; @@ -6246,9 +6383,10 @@ static PyMethodDef datetime_methods[] = { "YYYY-MM-DDT[HH[:MM[:SS[.mmm[uuu]]]]][+HH:MM].\n" "sep is used to separate the year from the time, and " "defaults to 'T'.\n" - "timespec specifies what components of the time to include" - " (allowed values are 'auto', 'hours', 'minutes', 'seconds'," - " 'milliseconds', and 'microseconds').\n")}, + "The optional argument timespec specifies the number " + "of additional terms\nof the time to include. Valid " + "options are 'auto', 'hours', 'minutes',\n'seconds', " + "'milliseconds' and 'microseconds'.\n")}, {"utcoffset", (PyCFunction)datetime_utcoffset, METH_NOARGS, PyDoc_STR("Return self.tzinfo.utcoffset(self).")}, @@ -6324,7 +6462,8 @@ static PyTypeObject PyDateTime_DateTimeType = { datetime_methods, /* tp_methods */ 0, /* tp_members */ datetime_getset, /* tp_getset */ - &PyDateTime_DateType, /* tp_base */ + 0, /* tp_base; filled in + PyInit__datetime */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ @@ -6390,18 +6529,32 @@ PyInit__datetime(void) if (m == NULL) return NULL; - if (PyType_Ready(&PyDateTime_DateType) < 0) - return NULL; - if (PyType_Ready(&PyDateTime_DateTimeType) < 0) - return NULL; - if (PyType_Ready(&PyDateTime_DeltaType) < 0) - return NULL; - if (PyType_Ready(&PyDateTime_TimeType) < 0) - return NULL; - if (PyType_Ready(&PyDateTime_TZInfoType) < 0) - return NULL; - if (PyType_Ready(&PyDateTime_TimeZoneType) < 0) + // `&...` is not a constant expression according to a strict reading + // of C standards. Fill tp_base at run-time rather than statically. + // See https://bugs.python.org/issue40777 + PyDateTime_IsoCalendarDateType.tp_base = &PyTuple_Type; + PyDateTime_TimeZoneType.tp_base = &PyDateTime_TZInfoType; + PyDateTime_DateTimeType.tp_base = &PyDateTime_DateType; + + PyTypeObject *types[] = { + &PyDateTime_DateType, + &PyDateTime_DateTimeType, + &PyDateTime_TimeType, + &PyDateTime_DeltaType, + &PyDateTime_TZInfoType, + &PyDateTime_TimeZoneType, + }; + + for (size_t i = 0; i < Py_ARRAY_LENGTH(types); i++) { + if (PyModule_AddType(m, types[i]) < 0) { + return NULL; + } + } + + if (PyType_Ready(&PyDateTime_IsoCalendarDateType) < 0) { return NULL; + } + Py_INCREF(&PyDateTime_IsoCalendarDateType); /* timedelta values */ d = PyDateTime_DeltaType.tp_dict; @@ -6519,25 +6672,6 @@ PyInit__datetime(void) PyModule_AddIntMacro(m, MINYEAR); PyModule_AddIntMacro(m, MAXYEAR); - Py_INCREF(&PyDateTime_DateType); - PyModule_AddObject(m, "date", (PyObject *) &PyDateTime_DateType); - - Py_INCREF(&PyDateTime_DateTimeType); - PyModule_AddObject(m, "datetime", - (PyObject *)&PyDateTime_DateTimeType); - - Py_INCREF(&PyDateTime_TimeType); - PyModule_AddObject(m, "time", (PyObject *) &PyDateTime_TimeType); - - Py_INCREF(&PyDateTime_DeltaType); - PyModule_AddObject(m, "timedelta", (PyObject *) &PyDateTime_DeltaType); - - Py_INCREF(&PyDateTime_TZInfoType); - PyModule_AddObject(m, "tzinfo", (PyObject *) &PyDateTime_TZInfoType); - - Py_INCREF(&PyDateTime_TimeZoneType); - PyModule_AddObject(m, "timezone", (PyObject *) &PyDateTime_TimeZoneType); - x = PyCapsule_New(&CAPI, PyDateTime_CAPSULE_NAME, NULL); if (x == NULL) return NULL; diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c index ea0a9d6fc957b6899b287ffb9e6affc83dad91a6..80a0503622c3fe45ba1961202087efb62f8956ad 100644 --- a/Modules/_dbmmodule.c +++ b/Modules/_dbmmodule.c @@ -45,7 +45,7 @@ typedef struct { static PyTypeObject Dbmtype; -#define is_dbmobject(v) (Py_TYPE(v) == &Dbmtype) +#define is_dbmobject(v) Py_IS_TYPE(v, &Dbmtype) #define check_dbmobject_open(v) if ((v)->di_dbm == NULL) \ { PyErr_SetString(DbmError, "DBM object has already been closed"); \ return NULL; } @@ -255,7 +255,7 @@ dbm_contains(PyObject *self, PyObject *arg) else if (!PyBytes_Check(arg)) { PyErr_Format(PyExc_TypeError, "dbm key must be bytes or string, not %.100s", - arg->ob_type->tp_name); + Py_TYPE(arg)->tp_name); return -1; } else { @@ -370,7 +370,7 @@ static PyObject * dbm__exit__(PyObject *self, PyObject *args) { _Py_IDENTIFIER(close); - return _PyObject_CallMethodId(self, &PyId_close, NULL); + return _PyObject_CallMethodIdNoArgs(self, &PyId_close); } diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index eb1f1a01feeca8374b1e67adb045e8b1953e86f1..fb4e020f1260e6ec9e17d77e5aa3317e08294a24 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -28,8 +28,6 @@ #include #include "longintrepr.h" -#include "pythread.h" -#include "structmember.h" #include "complexobject.h" #include "mpdecimal.h" @@ -38,8 +36,8 @@ #include "docstrings.h" -#if !defined(MPD_VERSION_HEX) || MPD_VERSION_HEX < 0x02040100 - #error "libmpdec version >= 2.4.1 required" +#if !defined(MPD_VERSION_HEX) || MPD_VERSION_HEX < 0x02050000 + #error "libmpdec version >= 2.5.0 required" #endif @@ -58,13 +56,11 @@ #define BOUNDS_CHECK(x, MIN, MAX) x = (x < MIN || MAX < x) ? MAX : x -#ifndef UNUSED #if defined(__GNUC__) && !defined(__INTEL_COMPILER) #define UNUSED __attribute__((unused)) #else #define UNUSED #endif -#endif /* _Py_DEC_MINALLOC >= MPD_MINALLOC */ #define _Py_DEC_MINALLOC 4 @@ -103,9 +99,9 @@ static PyTypeObject PyDec_Type; static PyTypeObject *PyDecSignalDict_Type; static PyTypeObject PyDecContext_Type; static PyTypeObject PyDecContextManager_Type; -#define PyDec_CheckExact(v) (Py_TYPE(v) == &PyDec_Type) +#define PyDec_CheckExact(v) Py_IS_TYPE(v, &PyDec_Type) #define PyDec_Check(v) PyObject_TypeCheck(v, &PyDec_Type) -#define PyDecSignalDict_Check(v) (Py_TYPE(v) == PyDecSignalDict_Type) +#define PyDecSignalDict_Check(v) Py_IS_TYPE(v, PyDecSignalDict_Type) #define PyDecContext_Check(v) PyObject_TypeCheck(v, &PyDecContext_Type) #define MPD(v) (&((PyDecObject *)v)->dec) #define SdFlagAddr(v) (((PyDecSignalDictObject *)v)->flags) @@ -1885,7 +1881,7 @@ dec_dealloc(PyObject *dec) /******************************************************************************/ Py_LOCAL_INLINE(int) -is_space(enum PyUnicode_Kind kind, void *data, Py_ssize_t pos) +is_space(enum PyUnicode_Kind kind, const void *data, Py_ssize_t pos) { Py_UCS4 ch = PyUnicode_READ(kind, data, pos); return Py_UNICODE_ISSPACE(ch); @@ -1903,7 +1899,7 @@ static char * numeric_as_ascii(const PyObject *u, int strip_ws, int ignore_underscores) { enum PyUnicode_Kind kind; - void *data; + const void *data; Py_UCS4 ch; char *res, *cp; Py_ssize_t j, len; @@ -2733,7 +2729,7 @@ PyDecType_FromObjectExact(PyTypeObject *type, PyObject *v, PyObject *context) else { PyErr_Format(PyExc_TypeError, "conversion from %s to Decimal is not supported", - v->ob_type->tp_name); + Py_TYPE(v)->tp_name); return NULL; } } @@ -2782,7 +2778,7 @@ PyDec_FromObject(PyObject *v, PyObject *context) else { PyErr_Format(PyExc_TypeError, "conversion from %s to Decimal is not supported", - v->ob_type->tp_name); + Py_TYPE(v)->tp_name); return NULL; } } @@ -2845,7 +2841,7 @@ convert_op(int type_err, PyObject **conv, PyObject *v, PyObject *context) if (type_err) { PyErr_Format(PyExc_TypeError, "conversion from %s to Decimal is not supported", - v->ob_type->tp_name); + Py_TYPE(v)->tp_name); } else { Py_INCREF(Py_NotImplemented); @@ -3402,9 +3398,9 @@ dec_as_long(PyObject *dec, PyObject *context, int round) i--; } - Py_SIZE(pylong) = i; + Py_SET_SIZE(pylong, i); if (mpd_isnegative(x) && !mpd_iszero(x)) { - Py_SIZE(pylong) = -i; + Py_SET_SIZE(pylong, -i); } mpd_del(x); diff --git a/Modules/_decimal/libmpdec/README.txt b/Modules/_decimal/libmpdec/README.txt index 96b72232d2ad7c6df5c2b3c6717f28d396c16cf9..dc97820a6eb0c4a0ab694b714c12f83c5973131c 100644 --- a/Modules/_decimal/libmpdec/README.txt +++ b/Modules/_decimal/libmpdec/README.txt @@ -20,7 +20,7 @@ Files required for the Python _decimal module context.c -> Context functions. io.{c,h} -> Conversions between mpd_t and ASCII strings, mpd_t formatting (allows UTF-8 fill character). - memory.{c,h} -> Allocation handlers with overflow detection + mpalloc.{c,h} -> Allocation handlers with overflow detection and functions for switching between static and dynamic mpd_t. mpdecimal.{c,h} -> All (quiet) functions of the specification. @@ -30,7 +30,6 @@ Files required for the Python _decimal module Visual Studio only: ~~~~~~~~~~~~~~~~~~~ vccompat.h -> snprintf <==> sprintf_s and similar things. - vcstdint.h -> stdint.h (included in VS 2010 but not in VS 2008). vcdiv64.asm -> Double word division used in typearith.h. VS 2008 does not allow inline asm for x64. Also, it does not provide an intrinsic for double word division. diff --git a/Modules/_decimal/libmpdec/basearith.c b/Modules/_decimal/libmpdec/basearith.c index dfe1523927a4078c5f6d9d2ed15a06dffa44d661..85c608fadf51567a42afadda3703925b7bfc6fd4 100644 --- a/Modules/_decimal/libmpdec/basearith.c +++ b/Modules/_decimal/libmpdec/basearith.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,13 +27,13 @@ #include "mpdecimal.h" -#include -#include -#include + #include +#include + +#include "basearith.h" #include "constants.h" #include "typearith.h" -#include "basearith.h" /*********************************************************************/ @@ -337,6 +337,7 @@ _mpd_basedivmod(mpd_uint_t *q, mpd_uint_t *r, /* D2: loop */ for (j=m; j != MPD_SIZE_MAX; j--) { + assert(2 <= j+n && j+n <= nplusm); /* annotation for scan-build */ /* D3: calculate qhat and rhat */ rhat = _mpd_shortdiv(w2, u+j+n-1, 2, v[n-1]); @@ -652,6 +653,3 @@ _mpd_shortdiv_b(mpd_uint_t *w, const mpd_uint_t *u, mpd_size_t n, return rem; } - - - diff --git a/Modules/_decimal/libmpdec/basearith.h b/Modules/_decimal/libmpdec/basearith.h index 976358a110ecf3e7580ae4bc682057bc0aa4ee8a..d35925aaddb48e0812d034d69e34e48fd36ee66f 100644 --- a/Modules/_decimal/libmpdec/basearith.h +++ b/Modules/_decimal/libmpdec/basearith.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,11 @@ */ -#ifndef BASEARITH_H -#define BASEARITH_H +#ifndef LIBMPDEC_BASEARITH_H_ +#define LIBMPDEC_BASEARITH_H_ #include "mpdecimal.h" -#include #include "typearith.h" @@ -216,7 +215,4 @@ _mpd_isallnine(const mpd_uint_t *data, mpd_ssize_t len) MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ -#endif /* BASEARITH_H */ - - - +#endif /* LIBMPDEC_BASEARITH_H_ */ diff --git a/Modules/_decimal/libmpdec/bits.h b/Modules/_decimal/libmpdec/bits.h index b5eaa24976ae51bb7afe4fa9453254735832ace2..aa9c3e77980c031246e9cda56f462835c6a6cb01 100644 --- a/Modules/_decimal/libmpdec/bits.h +++ b/Modules/_decimal/libmpdec/bits.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,11 @@ */ -#ifndef BITS_H -#define BITS_H +#ifndef LIBMPDEC_BITS_H_ +#define LIBMPDEC_BITS_H_ #include "mpdecimal.h" -#include /* Check if n is a power of 2. */ @@ -186,7 +185,4 @@ mpd_bsf(mpd_size_t a) #endif /* BSR/BSF */ -#endif /* BITS_H */ - - - +#endif /* LIBMPDEC_BITS_H_ */ diff --git a/Modules/_decimal/libmpdec/constants.c b/Modules/_decimal/libmpdec/constants.c index 2c2d5ea4810353935d2adcb7a74d204f2d6a20c3..4c4de622bc6018d6fddf9e223834e0a90449c975 100644 --- a/Modules/_decimal/libmpdec/constants.c +++ b/Modules/_decimal/libmpdec/constants.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,7 +27,6 @@ #include "mpdecimal.h" -#include #include "constants.h" @@ -128,5 +127,3 @@ const char *mpd_clamp_string[MPD_CLAMP_GUARD] = { "CLAMP_DEFAULT", "CLAMP_IEEE_754" }; - - diff --git a/Modules/_decimal/libmpdec/constants.h b/Modules/_decimal/libmpdec/constants.h index c0febfc8772d7e2c4b0c650cc1cbab0eb13bcd9e..7c1db839c20ba285b04fe04a278f196970230b3f 100644 --- a/Modules/_decimal/libmpdec/constants.h +++ b/Modules/_decimal/libmpdec/constants.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,14 @@ */ -#ifndef CONSTANTS_H -#define CONSTANTS_H +#ifndef LIBMPDEC_CONSTANTS_H_ +#define LIBMPDEC_CONSTANTS_H_ #include "mpdecimal.h" +#include + /* Internal header file: all symbols have local scope in the DSO */ MPD_PRAGMA(MPD_HIDE_SYMBOLS_START) @@ -84,7 +86,4 @@ extern const mpd_uint_t UH_P1P2; MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ -#endif /* CONSTANTS_H */ - - - +#endif /* LIBMPDEC_CONSTANTS_H_ */ diff --git a/Modules/_decimal/libmpdec/context.c b/Modules/_decimal/libmpdec/context.c index 24c7b890c1d9895f1a92b68c65561bd0f38b85a4..9cbc20509595d4dd54ffd769be73e393735e9836 100644 --- a/Modules/_decimal/libmpdec/context.c +++ b/Modules/_decimal/libmpdec/context.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,14 +27,16 @@ #include "mpdecimal.h" + +#include #include #include -#include void -mpd_dflt_traphandler(mpd_context_t *ctx UNUSED) +mpd_dflt_traphandler(mpd_context_t *ctx) { + (void)ctx; raise(SIGFPE); } @@ -282,5 +284,3 @@ mpd_addstatus_raise(mpd_context_t *ctx, uint32_t flags) mpd_traphandler(ctx); } } - - diff --git a/Modules/_decimal/libmpdec/convolute.c b/Modules/_decimal/libmpdec/convolute.c index 4c62e8bd3abd808a5cd4f88b0a45b425b9764cbd..4bc8e8b5fd32f48e3698daea15d37afaf6f33156 100644 --- a/Modules/_decimal/libmpdec/convolute.c +++ b/Modules/_decimal/libmpdec/convolute.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,15 +27,14 @@ #include "mpdecimal.h" -#include #include "bits.h" #include "constants.h" +#include "convolute.h" #include "fnt.h" #include "fourstep.h" #include "numbertheory.h" #include "sixstep.h" #include "umodarith.h" -#include "convolute.h" /* Bignum: Fast convolution using the Number Theoretic Transform. Used for @@ -170,5 +169,3 @@ fnt_autoconvolute(mpd_uint_t *c1, mpd_size_t n, int modnum) return 1; } - - diff --git a/Modules/_decimal/libmpdec/convolute.h b/Modules/_decimal/libmpdec/convolute.h index f30a177a684067785f0bca011c3898fd6df8136c..62edb3e45739cb0f39144d898d3c21e4c1dda2af 100644 --- a/Modules/_decimal/libmpdec/convolute.h +++ b/Modules/_decimal/libmpdec/convolute.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,11 @@ */ -#ifndef CONVOLUTE_H -#define CONVOLUTE_H +#ifndef LIBMPDEC_CONVOLUTE_H_ +#define LIBMPDEC_CONVOLUTE_H_ #include "mpdecimal.h" -#include /* Internal header file: all symbols have local scope in the DSO */ @@ -47,4 +46,4 @@ int fnt_autoconvolute(mpd_uint_t *c1, mpd_size_t n, int modnum); MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ -#endif +#endif /* LIBMPDEC_CONVOLUTE_H_ */ diff --git a/Modules/_decimal/libmpdec/crt.c b/Modules/_decimal/libmpdec/crt.c index 4a1e80a232284fb85b7b6973a18aed44cc03d412..613274ee0c5b5074cb0d1628d30b41bd8d3afe73 100644 --- a/Modules/_decimal/libmpdec/crt.c +++ b/Modules/_decimal/libmpdec/crt.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,11 +27,14 @@ #include "mpdecimal.h" -#include + #include + +#include "constants.h" +#include "crt.h" #include "numbertheory.h" #include "umodarith.h" -#include "crt.h" +#include "typearith.h" /* Bignum: Chinese Remainder Theorem, extends the maximum transform length. */ @@ -175,5 +178,3 @@ crt3(mpd_uint_t *x1, mpd_uint_t *x2, mpd_uint_t *x3, mpd_size_t rsize) assert(carry[0] == 0 && carry[1] == 0 && carry[2] == 0); } - - diff --git a/Modules/_decimal/libmpdec/crt.h b/Modules/_decimal/libmpdec/crt.h index f61e77293632e16a7dade2e89697d7e8f9ecded0..15a347d4cb31e58acae055d8c00132bbee80ff86 100644 --- a/Modules/_decimal/libmpdec/crt.h +++ b/Modules/_decimal/libmpdec/crt.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,11 @@ */ -#ifndef CRT_H -#define CRT_H +#ifndef LIBMPDEC_CRT_H_ +#define LIBMPDEC_CRT_H_ #include "mpdecimal.h" -#include /* Internal header file: all symbols have local scope in the DSO */ @@ -44,4 +43,4 @@ void crt3(mpd_uint_t *x1, mpd_uint_t *x2, mpd_uint_t *x3, mpd_size_t nmemb); MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ -#endif +#endif /* LIBMPDEC_CRT_H_ */ diff --git a/Modules/_decimal/libmpdec/difradix2.c b/Modules/_decimal/libmpdec/difradix2.c index 06e5ab5e222ee099be9a7f858ba51284cc834d30..049ecff65b6eefce3d3902a20ef4524d2bef66b3 100644 --- a/Modules/_decimal/libmpdec/difradix2.c +++ b/Modules/_decimal/libmpdec/difradix2.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,12 +27,14 @@ #include "mpdecimal.h" -#include + #include + #include "bits.h" +#include "constants.h" +#include "difradix2.h" #include "numbertheory.h" #include "umodarith.h" -#include "difradix2.h" /* Bignum: The actual transform routine (decimation in frequency). */ @@ -169,5 +171,3 @@ fnt_dif2(mpd_uint_t a[], mpd_size_t n, struct fnt_params *tparams) bitreverse_permute(a, n); } - - diff --git a/Modules/_decimal/libmpdec/difradix2.h b/Modules/_decimal/libmpdec/difradix2.h index 5e22bcf324fac78645235528f4638093231731a2..cdcbcf9a71043ce9e18dccfc4c6731e1f6d2a80f 100644 --- a/Modules/_decimal/libmpdec/difradix2.h +++ b/Modules/_decimal/libmpdec/difradix2.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,11 @@ */ -#ifndef DIF_RADIX2_H -#define DIF_RADIX2_H +#ifndef LIBMPDEC_DIFRADIX2_H_ +#define LIBMPDEC_DIFRADIX2_H_ #include "mpdecimal.h" -#include #include "numbertheory.h" @@ -45,4 +44,4 @@ void fnt_dif2(mpd_uint_t a[], mpd_size_t n, struct fnt_params *tparams); MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ -#endif +#endif /* LIBMPDEC_DIFRADIX2_H_ */ diff --git a/Modules/_decimal/libmpdec/fnt.c b/Modules/_decimal/libmpdec/fnt.c index 7e924c85242b08df5d55d0fbe993427d383067a6..0dbe98fc71c9ea6315245c63929284d50cee2ce9 100644 --- a/Modules/_decimal/libmpdec/fnt.c +++ b/Modules/_decimal/libmpdec/fnt.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,13 +27,14 @@ #include "mpdecimal.h" -#include -#include + #include +#include + #include "bits.h" #include "difradix2.h" -#include "numbertheory.h" #include "fnt.h" +#include "numbertheory.h" /* Bignum: Fast transform for medium-sized coefficients. */ @@ -76,6 +77,3 @@ std_inv_fnt(mpd_uint_t *a, mpd_size_t n, int modnum) mpd_free(tparams); return 1; } - - - diff --git a/Modules/_decimal/libmpdec/fnt.h b/Modules/_decimal/libmpdec/fnt.h index fa2154a798d453bdc42c58411c5d17b203212b2d..5222c476a3a4f54144ba6f35c93eaeadc801c892 100644 --- a/Modules/_decimal/libmpdec/fnt.h +++ b/Modules/_decimal/libmpdec/fnt.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,11 @@ */ -#ifndef FNT_H -#define FNT_H +#ifndef LIBMPDEC_FNT_H_ +#define LIBMPDEC_FNT_H_ #include "mpdecimal.h" -#include /* Internal header file: all symbols have local scope in the DSO */ @@ -45,5 +44,4 @@ int std_inv_fnt(mpd_uint_t a[], mpd_size_t n, int modnum); MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ -#endif - +#endif /* LIBMPDEC_FNT_H_ */ diff --git a/Modules/_decimal/libmpdec/fourstep.c b/Modules/_decimal/libmpdec/fourstep.c index 21d3e7485df4dabf890f62926afbb3c1ef396af7..fb173ed5a52e4631adc0eb0094072b72ab79ca67 100644 --- a/Modules/_decimal/libmpdec/fourstep.c +++ b/Modules/_decimal/libmpdec/fourstep.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,12 +27,14 @@ #include "mpdecimal.h" + #include + +#include "constants.h" +#include "fourstep.h" #include "numbertheory.h" #include "sixstep.h" -#include "transpose.h" #include "umodarith.h" -#include "fourstep.h" /* Bignum: Cache efficient Matrix Fourier Transform for arrays of the @@ -187,6 +189,7 @@ four_step_fnt(mpd_uint_t *a, mpd_size_t n, int modnum) #if 0 /* An unordered transform is sufficient for convolution. */ /* Transpose the matrix. */ + #include "transpose.h" transpose_3xpow2(a, R, C); #endif @@ -217,6 +220,7 @@ inv_four_step_fnt(mpd_uint_t *a, mpd_size_t n, int modnum) #if 0 /* An unordered transform is sufficient for convolution. */ /* Transpose the matrix, producing an R*C matrix. */ + #include "transpose.h" transpose_3xpow2(a, C, R); #endif @@ -253,5 +257,3 @@ inv_four_step_fnt(mpd_uint_t *a, mpd_size_t n, int modnum) return 1; } - - diff --git a/Modules/_decimal/libmpdec/fourstep.h b/Modules/_decimal/libmpdec/fourstep.h index 80dcd4be3d59b9715b2f12899282d9eb64f02db6..5ffb6fcc8ecd0d5086b46583319ca4323713cf5f 100644 --- a/Modules/_decimal/libmpdec/fourstep.h +++ b/Modules/_decimal/libmpdec/fourstep.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,11 @@ */ -#ifndef FOUR_STEP_H -#define FOUR_STEP_H +#ifndef LIBMPDEC_FOURSTEP_H_ +#define LIBMPDEC_FOURSTEP_H_ #include "mpdecimal.h" -#include /* Internal header file: all symbols have local scope in the DSO */ @@ -45,4 +44,4 @@ int inv_four_step_fnt(mpd_uint_t *a, mpd_size_t n, int modnum); MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ -#endif +#endif /* LIBMPDEC_FOURSTEP_H_ */ diff --git a/Modules/_decimal/libmpdec/io.c b/Modules/_decimal/libmpdec/io.c index f45e558f1a9573448a9e4b9d73505cca7bb4d998..9513a68e3782d129cad27daf7a492eb931007732 100644 --- a/Modules/_decimal/libmpdec/io.c +++ b/Modules/_decimal/libmpdec/io.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,16 +27,16 @@ #include "mpdecimal.h" -#include -#include -#include -#include -#include + #include +#include #include +#include #include -#include "bits.h" -#include "constants.h" +#include +#include +#include + #include "typearith.h" #include "io.h" @@ -277,7 +277,7 @@ mpd_qset_string(mpd_t *dec, const char *s, const mpd_context_t *ctx, } } - digits = end - coeff; + digits = end - coeff; if (dpoint) { size_t fracdigits = end-dpoint-1; if (dpoint > coeff) digits--; @@ -326,6 +326,22 @@ mpd_qset_string(mpd_t *dec, const char *s, const mpd_context_t *ctx, mpd_seterror(dec, MPD_Conversion_syntax, status); } +/* convert a character string to a decimal, use a maxcontext for conversion */ +void +mpd_qset_string_exact(mpd_t *dec, const char *s, uint32_t *status) +{ + mpd_context_t maxcontext; + + mpd_maxcontext(&maxcontext); + mpd_qset_string(dec, s, &maxcontext, status); + + if (*status & (MPD_Inexact|MPD_Rounded|MPD_Clamped)) { + /* we want exact results */ + mpd_seterror(dec, MPD_Invalid_operation, status); + } + *status &= MPD_Errors; +} + /* Print word x with n decimal digits to string s. dot is either NULL or the location of a decimal point. */ #define EXTRACT_DIGIT(s, x, d, dot) \ @@ -539,8 +555,8 @@ _mpd_to_string(char **result, const mpd_t *dec, int flags, mpd_ssize_t dplace) dplace = -1 + mod_mpd_ssize_t(dec->exp+2, 3); } else { /* ldigits-1 is the adjusted exponent, which - * should be divisible by three. If not, move - * dplace one or two places to the right. */ + * should be divisible by three. If not, move + * dplace one or two places to the right. */ dplace += mod_mpd_ssize_t(ldigits-1, 3); } } @@ -1247,7 +1263,7 @@ mpd_qformat_spec(const mpd_t *dec, const mpd_spec_t *spec, } if (isupper((uchar)type)) { - type = tolower((uchar)type); + type = (char)tolower((uchar)type); flags |= MPD_FMT_UPPER; } if (spec->sign == ' ') { @@ -1265,6 +1281,7 @@ mpd_qformat_spec(const mpd_t *dec, const mpd_spec_t *spec, stackspec.align = '>'; spec = &stackspec; } + assert(strlen(spec->fill) == 1); /* annotation for scan-build */ if (type == '%') { flags |= MPD_FMT_PERCENT; } @@ -1579,5 +1596,3 @@ mpd_print(const mpd_t *dec) fputs("mpd_fprint: output error\n", stderr); /* GCOV_NOT_REACHED */ } } - - diff --git a/Modules/_decimal/libmpdec/io.h b/Modules/_decimal/libmpdec/io.h index de5486a00ca56f14b8bf840adf40d15e6ab9f904..79d7c05ce369c6667534e8249abdef7e803c7305 100644 --- a/Modules/_decimal/libmpdec/io.h +++ b/Modules/_decimal/libmpdec/io.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,17 +26,20 @@ */ -#ifndef IO_H -#define IO_H +#ifndef LIBMPDEC_IO_H_ +#define LIBMPDEC_IO_H_ -#include #include "mpdecimal.h" +#include + #if SIZE_MAX == MPD_SIZE_MAX #define mpd_strtossize _mpd_strtossize #else +#include + static inline mpd_ssize_t mpd_strtossize(const char *s, char **end, int base) { @@ -56,4 +59,4 @@ mpd_strtossize(const char *s, char **end, int base) #endif -#endif +#endif /* LIBMPDEC_IO_H_ */ diff --git a/Modules/_decimal/libmpdec/literature/fnt.py b/Modules/_decimal/libmpdec/literature/fnt.py index 6363536da648737d36ce02690f1411f8ce470c55..c1285a565db96bdbae9dc3ac19575ba6ca0bd171 100644 --- a/Modules/_decimal/libmpdec/literature/fnt.py +++ b/Modules/_decimal/libmpdec/literature/fnt.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2008-2016 Stefan Krah. All rights reserved. +# Copyright (c) 2008-2020 Stefan Krah. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/Modules/_decimal/libmpdec/literature/matrix-transform.txt b/Modules/_decimal/libmpdec/literature/matrix-transform.txt index 701d85d6b43c8145b4d55ef841c4de9327bdeecf..6e7ad7420909fd269e35f4fe3f1a289488140e19 100644 --- a/Modules/_decimal/libmpdec/literature/matrix-transform.txt +++ b/Modules/_decimal/libmpdec/literature/matrix-transform.txt @@ -1,6 +1,6 @@ -(* Copyright (c) 2011 Stefan Krah. All rights reserved. *) +(* Copyright (c) 2011-2020 Stefan Krah. All rights reserved. *) The Matrix Fourier Transform: diff --git a/Modules/_decimal/libmpdec/literature/mulmod-64.txt b/Modules/_decimal/libmpdec/literature/mulmod-64.txt index 029b8de3d7c925b99a8ff2985eeb3cc959130441..fa967bf95e3030bfccf7e937ba8e0fa43fc3dfb0 100644 --- a/Modules/_decimal/libmpdec/literature/mulmod-64.txt +++ b/Modules/_decimal/libmpdec/literature/mulmod-64.txt @@ -1,6 +1,6 @@ -(* Copyright (c) 2011 Stefan Krah. All rights reserved. *) +(* Copyright (c) 2011-2020 Stefan Krah. All rights reserved. *) ========================================================================== diff --git a/Modules/_decimal/libmpdec/literature/mulmod-ppro.txt b/Modules/_decimal/libmpdec/literature/mulmod-ppro.txt index 4d17a928e6eae54dd1df136fc8bec7e591a6652f..ba804e4b4e78641498ec2d2f7dc84e5250700da4 100644 --- a/Modules/_decimal/libmpdec/literature/mulmod-ppro.txt +++ b/Modules/_decimal/libmpdec/literature/mulmod-ppro.txt @@ -1,6 +1,6 @@ -(* Copyright (c) 2011 Stefan Krah. All rights reserved. *) +(* Copyright (c) 2011-2020 Stefan Krah. All rights reserved. *) ======================================================================== diff --git a/Modules/_decimal/libmpdec/literature/six-step.txt b/Modules/_decimal/libmpdec/literature/six-step.txt index 8e45f48758478aea2dc1377fc679a3bb766fdcdd..852d5b0df8bf37bed80c7155636b822a23164088 100644 --- a/Modules/_decimal/libmpdec/literature/six-step.txt +++ b/Modules/_decimal/libmpdec/literature/six-step.txt @@ -1,6 +1,6 @@ -(* Copyright (c) 2011 Stefan Krah. All rights reserved. *) +(* Copyright (c) 2011-2020 Stefan Krah. All rights reserved. *) The Six Step Transform: diff --git a/Modules/_decimal/libmpdec/literature/umodarith.lisp b/Modules/_decimal/libmpdec/literature/umodarith.lisp index 99d71c373d1abd66b41dc254e0770b334e3f44e1..d71f074a26dccaad14b1889bd9afc6d9e489946b 100644 --- a/Modules/_decimal/libmpdec/literature/umodarith.lisp +++ b/Modules/_decimal/libmpdec/literature/umodarith.lisp @@ -1,5 +1,5 @@ ; -; Copyright (c) 2008-2016 Stefan Krah. All rights reserved. +; Copyright (c) 2008-2020 Stefan Krah. All rights reserved. ; ; Redistribution and use in source and binary forms, with or without ; modification, are permitted provided that the following conditions @@ -149,7 +149,7 @@ (defthmd addmod-correct (implies (and (< 0 m) (< m base) - (< a m) (<= b m) + (< a m) (<= b m) (natp m) (natp base) (natp a) (natp b)) (equal (addmod a b m base) @@ -179,7 +179,7 @@ (defthmd submod-correct (implies (and (< 0 m) (< m base) - (< a m) (<= b m) + (< a m) (<= b m) (natp m) (natp base) (natp a) (natp b)) (equal (submod a b m base) @@ -200,7 +200,7 @@ (defthm submod-2-correct (implies (and (< 0 m) (< m base) - (< a m) (<= b m) + (< a m) (<= b m) (natp m) (natp base) (natp a) (natp b)) (equal (submod-2 a b m base) @@ -231,7 +231,7 @@ (defthmd ext-submod-ext-submod-2-equal (implies (and (< 0 m) (< m base) - (< a (* 2 m)) (< b (* 2 m)) + (< a (* 2 m)) (< b (* 2 m)) (natp m) (natp base) (natp a) (natp b)) (equal (ext-submod a b m base) @@ -239,7 +239,7 @@ (defthmd ext-submod-2-correct (implies (and (< 0 m) (< m base) - (< a (* 2 m)) (< b (* 2 m)) + (< a (* 2 m)) (< b (* 2 m)) (natp m) (natp base) (natp a) (natp b)) (equal (ext-submod-2 a b m base) @@ -257,7 +257,7 @@ (defthmd dw-reduce-correct (implies (and (< 0 m) (< m base) - (< hi base) (< lo base) + (< hi base) (< lo base) (natp m) (natp base) (natp hi) (natp lo)) (equal (dw-reduce hi lo m base) @@ -322,7 +322,7 @@ (defthmd dw-submod-correct (implies (and (< 0 m) (< m base) (natp a) (< a m) - (< hi base) (< lo base) + (< hi base) (< lo base) (natp m) (natp base) (natp hi) (natp lo)) (equal (dw-submod a hi lo m base) diff --git a/Modules/_decimal/libmpdec/memory.c b/Modules/_decimal/libmpdec/mpalloc.c similarity index 82% rename from Modules/_decimal/libmpdec/memory.c rename to Modules/_decimal/libmpdec/mpalloc.c index a854e09911bd3321aa69eeab321ffbfbd7f59c62..eb5ee7a807b3338a7c1a2f892fc3d7b1f07c4bbb 100644 --- a/Modules/_decimal/libmpdec/memory.c +++ b/Modules/_decimal/libmpdec/mpalloc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,10 +27,14 @@ #include "mpdecimal.h" + +#include #include #include -#include "typearith.h" +#include + #include "mpalloc.h" +#include "typearith.h" #if defined(_MSC_VER) @@ -294,4 +298,59 @@ mpd_realloc_dyn(mpd_t *result, mpd_ssize_t nwords, uint32_t *status) return 1; } +/* + * Input: 'result' is a static mpd_t with a static coefficient. + * Assumption: 'nwords' >= result->alloc. + * + * Resize the static coefficient to a larger dynamic one and copy the + * existing data. + * + * On failure the value of 'result' is unchanged. + */ +int +mpd_switch_to_dyn_cxx(mpd_t *result, mpd_ssize_t nwords) +{ + assert(nwords >= result->alloc); + + mpd_uint_t *data = mpd_alloc(nwords, sizeof *result->data); + if (data == NULL) { + return 0; + } + + memcpy(data, result->data, result->alloc * (sizeof *result->data)); + result->data = data; + result->alloc = nwords; + mpd_set_dynamic_data(result); + return 1; +} +/* + * Input: 'result' is a static or a dynamic mpd_t with a dynamic coefficient. + * Resize the coefficient to length 'nwords': + * Case nwords > result->alloc: + * If realloc is successful: + * 'result' has a larger coefficient but the same value. Return 1. + * Otherwise: + * 'result' has a the same coefficient. Return 0. + * Case nwords < result->alloc: + * If realloc is successful: + * 'result' has a smaller coefficient. result->len is undefined. Return 1. + * Otherwise (unlikely): + * 'result' is unchanged. Reuse the now oversized coefficient. Return 1. + */ +int +mpd_realloc_dyn_cxx(mpd_t *result, mpd_ssize_t nwords) +{ + uint8_t err = 0; + + mpd_uint_t *p = mpd_realloc(result->data, nwords, sizeof *result->data, &err); + if (!err) { + result->data = p; + result->alloc = nwords; + } + else if (nwords > result->alloc) { + return 0; + } + + return 1; +} diff --git a/Modules/_decimal/libmpdec/mpalloc.h b/Modules/_decimal/libmpdec/mpalloc.h index efd711953a39827aa45d776003bcf50c58704805..186808457b25c01b67daf5ddf8ce023ed4cb8a75 100644 --- a/Modules/_decimal/libmpdec/mpalloc.h +++ b/Modules/_decimal/libmpdec/mpalloc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,14 @@ */ -#ifndef MPALLOC_H -#define MPALLOC_H +#ifndef LIBMPDEC_MPALLOC_H_ +#define LIBMPDEC_MPALLOC_H_ #include "mpdecimal.h" +#include + /* Internal header file: all symbols have local scope in the DSO */ MPD_PRAGMA(MPD_HIDE_SYMBOLS_START) @@ -41,11 +43,11 @@ int mpd_switch_to_dyn(mpd_t *result, mpd_ssize_t size, uint32_t *status); int mpd_switch_to_dyn_zero(mpd_t *result, mpd_ssize_t size, uint32_t *status); int mpd_realloc_dyn(mpd_t *result, mpd_ssize_t size, uint32_t *status); - -MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ +int mpd_switch_to_dyn_cxx(mpd_t *result, mpd_ssize_t size); +int mpd_realloc_dyn_cxx(mpd_t *result, mpd_ssize_t size); -#endif - +MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ +#endif /* LIBMPDEC_MPALLOC_H_ */ diff --git a/Modules/_decimal/libmpdec/mpdecimal.c b/Modules/_decimal/libmpdec/mpdecimal.c index bfa8bb343e60c1db28c2f11fa07baa7c8d20d796..28b639ccb405f688aeb24dd06a4db90d4c0e555c 100644 --- a/Modules/_decimal/libmpdec/mpdecimal.c +++ b/Modules/_decimal/libmpdec/mpdecimal.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,18 +27,21 @@ #include "mpdecimal.h" + +#include +#include +#include #include #include #include -#include -#include + #include "basearith.h" #include "bits.h" +#include "constants.h" #include "convolute.h" #include "crt.h" #include "mpalloc.h" #include "typearith.h" -#include "umodarith.h" #ifdef PPRO #if defined(_MSC_VER) @@ -61,7 +64,7 @@ #if defined(_MSC_VER) #define ALWAYS_INLINE __forceinline -#elif defined(LEGACY_COMPILER) +#elif defined(__IBMC__) || defined(LEGACY_COMPILER) #define ALWAYS_INLINE #undef inline #define inline @@ -241,7 +244,7 @@ mpd_lsd(mpd_uint_t word) } /* Coefficient size needed to store 'digits' */ -ALWAYS_INLINE mpd_ssize_t +mpd_ssize_t mpd_digits_to_size(mpd_ssize_t digits) { mpd_ssize_t q, r; @@ -260,8 +263,9 @@ mpd_exp_digits(mpd_ssize_t exp) /* Canonical */ ALWAYS_INLINE int -mpd_iscanonical(const mpd_t *dec UNUSED) +mpd_iscanonical(const mpd_t *dec) { + (void)dec; return 1; } @@ -512,6 +516,28 @@ mpd_qresize(mpd_t *result, mpd_ssize_t nwords, uint32_t *status) return mpd_realloc_dyn(result, nwords, status); } +/* Same as mpd_qresize, but do not set the result no NaN on failure. */ +static ALWAYS_INLINE int +mpd_qresize_cxx(mpd_t *result, mpd_ssize_t nwords) +{ + assert(!mpd_isconst_data(result)); /* illegal operation for a const */ + assert(!mpd_isshared_data(result)); /* illegal operation for a shared */ + assert(MPD_MINALLOC <= result->alloc); + + nwords = (nwords <= MPD_MINALLOC) ? MPD_MINALLOC : nwords; + if (nwords == result->alloc) { + return 1; + } + if (mpd_isstatic_data(result)) { + if (nwords > result->alloc) { + return mpd_switch_to_dyn_cxx(result, nwords); + } + return 1; + } + + return mpd_realloc_dyn_cxx(result, nwords); +} + /* Same as mpd_qresize, but the complete coefficient (including the old * memory area!) is initialized to zero. */ ALWAYS_INLINE int @@ -1192,7 +1218,7 @@ _c32setu64(mpd_t *result, uint64_t u, uint8_t sign, uint32_t *status) result->data[i] = w[i]; } - mpd_set_sign(result, sign); + mpd_set_flags(result, sign); result->exp = 0; result->len = len; mpd_setdigits(result); @@ -1244,6 +1270,26 @@ mpd_qset_i64(mpd_t *result, int64_t a, const mpd_context_t *ctx, #endif } +/* quietly set a decimal from an int64_t, use a maxcontext for conversion */ +void +mpd_qset_i64_exact(mpd_t *result, int64_t a, uint32_t *status) +{ + mpd_context_t maxcontext; + + mpd_maxcontext(&maxcontext); +#ifdef CONFIG_64 + mpd_qset_ssize(result, a, &maxcontext, status); +#else + _c32_qset_i64(result, a, &maxcontext, status); +#endif + + if (*status & (MPD_Inexact|MPD_Rounded|MPD_Clamped)) { + /* we want exact results */ + mpd_seterror(result, MPD_Invalid_operation, status); + } + *status &= MPD_Errors; +} + /* quietly set a decimal from a uint64_t */ void mpd_qset_u64(mpd_t *result, uint64_t a, const mpd_context_t *ctx, @@ -1255,8 +1301,27 @@ mpd_qset_u64(mpd_t *result, uint64_t a, const mpd_context_t *ctx, _c32_qset_u64(result, a, ctx, status); #endif } -#endif /* !LEGACY_COMPILER */ +/* quietly set a decimal from a uint64_t, use a maxcontext for conversion */ +void +mpd_qset_u64_exact(mpd_t *result, uint64_t a, uint32_t *status) +{ + mpd_context_t maxcontext; + + mpd_maxcontext(&maxcontext); +#ifdef CONFIG_64 + mpd_qset_uint(result, a, &maxcontext, status); +#else + _c32_qset_u64(result, a, &maxcontext, status); +#endif + + if (*status & (MPD_Inexact|MPD_Rounded|MPD_Clamped)) { + /* we want exact results */ + mpd_seterror(result, MPD_Invalid_operation, status); + } + *status &= MPD_Errors; +} +#endif /* !LEGACY_COMPILER */ /* * Quietly get an mpd_uint_t from a decimal. Assumes @@ -1345,11 +1410,13 @@ mpd_qabs_uint(const mpd_t *a, uint32_t *status) mpd_ssize_t mpd_qget_ssize(const mpd_t *a, uint32_t *status) { + uint32_t workstatus = 0; mpd_uint_t u; int isneg; - u = mpd_qabs_uint(a, status); - if (*status&MPD_Invalid_operation) { + u = mpd_qabs_uint(a, &workstatus); + if (workstatus&MPD_Invalid_operation) { + *status |= workstatus; return MPD_SSIZE_MAX; } @@ -1469,9 +1536,11 @@ mpd_qget_i64(const mpd_t *a, uint32_t *status) uint32_t mpd_qget_u32(const mpd_t *a, uint32_t *status) { - uint64_t x = mpd_qget_uint(a, status); + uint32_t workstatus = 0; + uint64_t x = mpd_qget_uint(a, &workstatus); - if (*status&MPD_Invalid_operation) { + if (workstatus&MPD_Invalid_operation) { + *status |= workstatus; return UINT32_MAX; } if (x > UINT32_MAX) { @@ -1486,9 +1555,11 @@ mpd_qget_u32(const mpd_t *a, uint32_t *status) int32_t mpd_qget_i32(const mpd_t *a, uint32_t *status) { - int64_t x = mpd_qget_ssize(a, status); + uint32_t workstatus = 0; + int64_t x = mpd_qget_ssize(a, &workstatus); - if (*status&MPD_Invalid_operation) { + if (workstatus&MPD_Invalid_operation) { + *status |= workstatus; return INT32_MAX; } if (x < INT32_MIN || x > INT32_MAX) { @@ -1504,14 +1575,20 @@ mpd_qget_i32(const mpd_t *a, uint32_t *status) uint64_t mpd_qget_u64(const mpd_t *a, uint32_t *status) { - return _c32_qget_u64(1, a, status); + uint32_t workstatus = 0; + uint64_t x = _c32_qget_u64(1, a, &workstatus); + *status |= workstatus; + return x; } /* quietly get an int64_t from a decimal */ int64_t mpd_qget_i64(const mpd_t *a, uint32_t *status) { - return _c32_qget_i64(a, status); + uint32_t workstatus = 0; + int64_t x = _c32_qget_i64(a, &workstatus); + *status |= workstatus; + return x; } #endif @@ -1937,6 +2014,25 @@ mpd_qcopy(mpd_t *result, const mpd_t *a, uint32_t *status) return 1; } +/* Same as mpd_qcopy, but do not set the result to NaN on failure. */ +int +mpd_qcopy_cxx(mpd_t *result, const mpd_t *a) +{ + if (result == a) return 1; + + if (!mpd_qresize_cxx(result, a->len)) { + return 0; + } + + mpd_copy_flags(result, a); + result->exp = a->exp; + result->digits = a->digits; + result->len = a->len; + memcpy(result->data, a->data, a->len * (sizeof *result->data)); + + return 1; +} + /* * Copy to a decimal with a static buffer. The caller has to make sure that * the buffer is big enough. Cannot fail. @@ -3780,7 +3876,72 @@ void mpd_qdiv(mpd_t *q, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status) { - _mpd_qdiv(SET_IDEAL_EXP, q, a, b, ctx, status); + MPD_NEW_STATIC(aa,0,0,0,0); + MPD_NEW_STATIC(bb,0,0,0,0); + uint32_t xstatus = 0; + + if (q == a) { + if (!mpd_qcopy(&aa, a, status)) { + mpd_seterror(q, MPD_Malloc_error, status); + goto out; + } + a = &aa; + } + + if (q == b) { + if (!mpd_qcopy(&bb, b, status)) { + mpd_seterror(q, MPD_Malloc_error, status); + goto out; + } + b = &bb; + } + + _mpd_qdiv(SET_IDEAL_EXP, q, a, b, ctx, &xstatus); + + if (xstatus & (MPD_Malloc_error|MPD_Division_impossible)) { + /* Inexact quotients (the usual case) fill the entire context precision, + * which can lead to the above errors for very high precisions. Retry + * the operation with a lower precision in case the result is exact. + * + * We need an upper bound for the number of digits of a_coeff / b_coeff + * when the result is exact. If a_coeff' * 1 / b_coeff' is in lowest + * terms, then maxdigits(a_coeff') + maxdigits(1 / b_coeff') is a suitable + * bound. + * + * 1 / b_coeff' is exact iff b_coeff' exclusively has prime factors 2 or 5. + * The largest amount of digits is generated if b_coeff' is a power of 2 or + * a power of 5 and is less than or equal to log5(b_coeff') <= log2(b_coeff'). + * + * We arrive at a total upper bound: + * + * maxdigits(a_coeff') + maxdigits(1 / b_coeff') <= + * log10(a_coeff) + log2(b_coeff) = + * log10(a_coeff) + log10(b_coeff) / log10(2) <= + * a->digits + b->digits * 4; + */ + mpd_context_t workctx = *ctx; + uint32_t ystatus = 0; + + workctx.prec = a->digits + b->digits * 4; + if (workctx.prec >= ctx->prec) { + *status |= (xstatus&MPD_Errors); + goto out; /* No point in retrying, keep the original error. */ + } + + _mpd_qdiv(SET_IDEAL_EXP, q, a, b, &workctx, &ystatus); + if (ystatus != 0) { + ystatus = *status | ((ystatus|xstatus)&MPD_Errors); + mpd_seterror(q, ystatus, status); + } + } + else { + *status |= xstatus; + } + + +out: + mpd_del(&aa); + mpd_del(&bb); } /* Internal function. */ @@ -3870,6 +4031,7 @@ _mpd_qdivmod(mpd_t *q, mpd_t *r, const mpd_t *a, const mpd_t *b, } if (b->len == 1) { + assert(b->data[0] != 0); /* annotation for scan-build */ if (a->len == 1) { _mpd_div_word(&q->data[0], &r->data[0], a->data[0], b->data[0]); } @@ -6214,9 +6376,11 @@ _mpd_qpow_int(mpd_t *result, const mpd_t *base, const mpd_t *exp, workctx.round = MPD_ROUND_HALF_EVEN; workctx.clamp = 0; if (mpd_isnegative(exp)) { + uint32_t workstatus = 0; workctx.prec += 1; - mpd_qdiv(&tbase, &one, base, &workctx, status); - if (*status&MPD_Errors) { + mpd_qdiv(&tbase, &one, base, &workctx, &workstatus); + *status |= workstatus; + if (workstatus&MPD_Errors) { mpd_setspecial(result, MPD_POS, MPD_NAN); goto finish; } @@ -6951,6 +7115,8 @@ mpd_qrem_near(mpd_t *r, const mpd_t *a, const mpd_t *b, mpd_ssize_t expdiff, qdigits; int cmp, isodd, allnine; + assert(r != NULL); /* annotation for scan-build */ + if (mpd_isspecial(a) || mpd_isspecial(b)) { if (mpd_qcheck_nans(r, a, b, ctx, status)) { return; @@ -7181,6 +7347,11 @@ void mpd_qtrunc(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status) { + if (mpd_isspecial(a)) { + mpd_seterror(result, MPD_Invalid_operation, status); + return; + } + (void)_mpd_qround_to_integral(TO_INT_TRUNC, result, a, ctx, status); } @@ -7189,6 +7360,12 @@ mpd_qfloor(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status) { mpd_context_t workctx = *ctx; + + if (mpd_isspecial(a)) { + mpd_seterror(result, MPD_Invalid_operation, status); + return; + } + workctx.round = MPD_ROUND_FLOOR; (void)_mpd_qround_to_integral(TO_INT_SILENT, result, a, &workctx, status); @@ -7199,6 +7376,12 @@ mpd_qceil(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status) { mpd_context_t workctx = *ctx; + + if (mpd_isspecial(a)) { + mpd_seterror(result, MPD_Invalid_operation, status); + return; + } + workctx.round = MPD_ROUND_CEILING; (void)_mpd_qround_to_integral(TO_INT_SILENT, result, a, &workctx, status); @@ -7702,9 +7885,9 @@ mpd_qinvroot(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, /* END LIBMPDEC_ONLY */ /* Algorithm from decimal.py */ -void -mpd_qsqrt(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, - uint32_t *status) +static void +_mpd_qsqrt(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, + uint32_t *status) { mpd_context_t maxcontext; MPD_NEW_STATIC(c,0,0,0,0); @@ -7836,6 +8019,56 @@ mpd_qsqrt(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, goto out; } +void +mpd_qsqrt(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, + uint32_t *status) +{ + MPD_NEW_STATIC(aa,0,0,0,0); + uint32_t xstatus = 0; + + if (result == a) { + if (!mpd_qcopy(&aa, a, status)) { + mpd_seterror(result, MPD_Malloc_error, status); + goto out; + } + a = &aa; + } + + _mpd_qsqrt(result, a, ctx, &xstatus); + + if (xstatus & (MPD_Malloc_error|MPD_Division_impossible)) { + /* The above conditions can occur at very high context precisions + * if intermediate values get too large. Retry the operation with + * a lower context precision in case the result is exact. + * + * If the result is exact, an upper bound for the number of digits + * is the number of digits in the input. + * + * NOTE: sqrt(40e9) = 2.0e+5 /\ digits(40e9) = digits(2.0e+5) = 2 + */ + uint32_t ystatus = 0; + mpd_context_t workctx = *ctx; + + workctx.prec = a->digits; + if (workctx.prec >= ctx->prec) { + *status |= (xstatus|MPD_Errors); + goto out; /* No point in repeating this, keep the original error. */ + } + + _mpd_qsqrt(result, a, &workctx, &ystatus); + if (ystatus != 0) { + ystatus = *status | ((xstatus|ystatus)&MPD_Errors); + mpd_seterror(result, ystatus, status); + } + } + else { + *status |= xstatus; + } + +out: + mpd_del(&aa); +} + /******************************************************************************/ /* Base conversions */ @@ -7847,6 +8080,7 @@ mpd_sizeinbase(const mpd_t *a, uint32_t base) { double x; size_t digits; + double upper_bound; assert(mpd_isinteger(a)); assert(base >= 2); @@ -7863,10 +8097,14 @@ mpd_sizeinbase(const mpd_t *a, uint32_t base) if (digits > 2711437152599294ULL) { return SIZE_MAX; } + + upper_bound = (double)((1ULL<<53)-1); +#else + upper_bound = (double)(SIZE_MAX-1); #endif x = (double)digits / log10(base); - return (x > SIZE_MAX-1) ? SIZE_MAX : (size_t)x + 1; + return (x > upper_bound) ? SIZE_MAX : (size_t)x + 1; } /* Space needed to import a base 'base' integer of length 'srclen'. */ @@ -7874,6 +8112,7 @@ static mpd_ssize_t _mpd_importsize(size_t srclen, uint32_t base) { double x; + double upper_bound; assert(srclen > 0); assert(base >= 2); @@ -7882,10 +8121,15 @@ _mpd_importsize(size_t srclen, uint32_t base) if (srclen > (1ULL<<53)) { return MPD_SSIZE_MAX; } + + assert((1ULL<<53) <= MPD_MAXIMPORT); + upper_bound = (double)((1ULL<<53)-1); +#else + upper_bound = MPD_MAXIMPORT-1; #endif x = (double)srclen * (log10(base)/MPD_RDIGITS); - return (x >= MPD_MAXIMPORT) ? MPD_SSIZE_MAX : (mpd_ssize_t)x + 1; + return (x > upper_bound) ? MPD_SSIZE_MAX : (mpd_ssize_t)x + 1; } static uint8_t @@ -8412,6 +8656,3 @@ mpd_qimport_u32(mpd_t *result, mpd_qresize(result, result->len, status); mpd_qfinalize(result, ctx, status); } - - - diff --git a/Modules/_decimal/libmpdec/mpdecimal.h b/Modules/_decimal/libmpdec/mpdecimal.h index a67dd9bc126c27ca0dc53ba70f5ca157fd10018c..5a2439690c3509c5b47d68731eabc42fc05fb420 100644 --- a/Modules/_decimal/libmpdec/mpdecimal.h +++ b/Modules/_decimal/libmpdec/mpdecimal.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,59 +26,45 @@ */ -#ifndef MPDECIMAL_H -#define MPDECIMAL_H - - -#ifdef __cplusplus -extern "C" { - #ifndef __STDC_LIMIT_MACROS - #define __STDC_LIMIT_MACROS - #define MPD_CLEAR_STDC_LIMIT_MACROS - #endif -#endif +#ifndef LIBMPDEC_MPDECIMAL_H_ +#define LIBMPDEC_MPDECIMAL_H_ #ifndef _MSC_VER #include "pyconfig.h" #endif -#include -#include -#include -#include -#include -#include -#include +#ifdef __cplusplus + #include + #include + #include + #include + #include +extern "C" { +#else + #include + #include + #include + #include + #include +#endif + -#ifdef _MSC_VER - #include "vccompat.h" - #ifndef UNUSED - #define UNUSED - #endif +#if (defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__)) && \ + defined(__GNUC__) && __GNUC__ >= 4 && !defined(__INTEL_COMPILER) + #define MPD_PRAGMA(x) _Pragma(x) + #define MPD_HIDE_SYMBOLS_START "GCC visibility push(hidden)" + #define MPD_HIDE_SYMBOLS_END "GCC visibility pop" +#else #define MPD_PRAGMA(x) #define MPD_HIDE_SYMBOLS_START #define MPD_HIDE_SYMBOLS_END +#endif + +#if defined(_MSC_VER) + #include "vccompat.h" #define EXTINLINE extern inline #else - #ifndef __GNUC_STDC_INLINE__ - #define __GNUC_STDC_INLINE__ 1 - #endif - #if defined(__GNUC__) && !defined(__INTEL_COMPILER) - #define UNUSED __attribute__((unused)) - #else - #define UNUSED - #endif - #if (defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__)) && \ - defined(__GNUC__) && __GNUC__ >= 4 && !defined(__INTEL_COMPILER) - #define MPD_PRAGMA(x) _Pragma(x) - #define MPD_HIDE_SYMBOLS_START "GCC visibility push(hidden)" - #define MPD_HIDE_SYMBOLS_END "GCC visibility pop" - #else - #define MPD_PRAGMA(x) - #define MPD_HIDE_SYMBOLS_START - #define MPD_HIDE_SYMBOLS_END - #endif #define EXTINLINE #endif @@ -103,10 +89,10 @@ MPD_PRAGMA(MPD_HIDE_SYMBOLS_START) /******************************************************************************/ #define MPD_MAJOR_VERSION 2 -#define MPD_MINOR_VERSION 4 -#define MPD_MICRO_VERSION 2 +#define MPD_MINOR_VERSION 5 +#define MPD_MICRO_VERSION 0 -#define MPD_VERSION "2.4.2" +#define MPD_VERSION "2.5.0" #define MPD_VERSION_HEX ((MPD_MAJOR_VERSION << 24) | \ (MPD_MINOR_VERSION << 16) | \ @@ -135,6 +121,9 @@ const char *mpd_version(void); #elif defined(__x86_64__) #define CONFIG_64 #define ASM + #elif defined(__arm64__) + #define CONFIG_64 + #define ANSI #else #error "unknown architecture for universal build." #endif @@ -423,6 +412,7 @@ void mpd_print(const mpd_t *dec); /* assignment from a string */ void mpd_qset_string(mpd_t *dec, const char *s, const mpd_context_t *ctx, uint32_t *status); +void mpd_qset_string_exact(mpd_t *dec, const char *s, uint32_t *status); /* set to NaN with error flags */ void mpd_seterror(mpd_t *result, uint32_t flags, uint32_t *status); @@ -440,6 +430,8 @@ void mpd_qset_u32(mpd_t *result, uint32_t a, const mpd_context_t *ctx, uint32_t #ifndef LEGACY_COMPILER void mpd_qset_i64(mpd_t *result, int64_t a, const mpd_context_t *ctx, uint32_t *status); void mpd_qset_u64(mpd_t *result, uint64_t a, const mpd_context_t *ctx, uint32_t *status); +void mpd_qset_i64_exact(mpd_t *result, int64_t a, uint32_t *status); +void mpd_qset_u64_exact(mpd_t *result, uint64_t a, uint32_t *status); #endif /* quietly assign a C integer type to an mpd_t with a static coefficient */ @@ -467,7 +459,8 @@ void mpd_qfinalize(mpd_t *result, const mpd_context_t *ctx, uint32_t *status); const char *mpd_class(const mpd_t *a, const mpd_context_t *ctx); -int mpd_qcopy(mpd_t *result, const mpd_t *a, uint32_t *status); +int mpd_qcopy(mpd_t *result, const mpd_t *a, uint32_t *status); +int mpd_qcopy_cxx(mpd_t *result, const mpd_t *a); mpd_t *mpd_qncopy(const mpd_t *a); int mpd_qcopy_abs(mpd_t *result, const mpd_t *a, uint32_t *status); int mpd_qcopy_negate(mpd_t *result, const mpd_t *a, uint32_t *status); @@ -721,7 +714,7 @@ EXTINLINE mpd_uint_t mpd_lsd(mpd_uint_t word); EXTINLINE mpd_ssize_t mpd_digits_to_size(mpd_ssize_t digits); /* number of digits in the exponent, undefined for MPD_SSIZE_MIN */ EXTINLINE int mpd_exp_digits(mpd_ssize_t exp); -EXTINLINE int mpd_iscanonical(const mpd_t *dec UNUSED); +EXTINLINE int mpd_iscanonical(const mpd_t *dec); EXTINLINE int mpd_isfinite(const mpd_t *dec); EXTINLINE int mpd_isinfinite(const mpd_t *dec); EXTINLINE int mpd_isinteger(const mpd_t *dec); @@ -833,15 +826,8 @@ MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ #ifdef __cplusplus - #ifdef MPD_CLEAR_STDC_LIMIT_MACROS - #undef MPD_CLEAR_STDC_LIMIT_MACROS - #undef __STDC_LIMIT_MACROS - #endif } /* END extern "C" */ #endif -#endif /* MPDECIMAL_H */ - - - +#endif /* LIBMPDEC_MPDECIMAL_H_ */ diff --git a/Modules/_decimal/libmpdec/numbertheory.c b/Modules/_decimal/libmpdec/numbertheory.c index 4e035477e280001cdb3ba69418e0270215b88513..210e0deb37120342d2ccceb97751d5ca8c7b7885 100644 --- a/Modules/_decimal/libmpdec/numbertheory.c +++ b/Modules/_decimal/libmpdec/numbertheory.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,11 +27,13 @@ #include "mpdecimal.h" -#include + #include +#include + #include "bits.h" -#include "umodarith.h" #include "numbertheory.h" +#include "umodarith.h" /* Bignum: Initialize the Number Theoretic Transform. */ @@ -128,5 +130,3 @@ _mpd_init_w3table(mpd_uint_t w3table[3], int sign, int modnum) w3table[1] = kernel; w3table[2] = POWMOD(kernel, 2); } - - diff --git a/Modules/_decimal/libmpdec/numbertheory.h b/Modules/_decimal/libmpdec/numbertheory.h index e94c157910c83e99c4425d0d81bf96a9ed9e23fa..47b7753b831b89ba7f4d38ce24e12d89052db1a2 100644 --- a/Modules/_decimal/libmpdec/numbertheory.h +++ b/Modules/_decimal/libmpdec/numbertheory.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,12 @@ */ -#ifndef NUMBER_THEORY_H -#define NUMBER_THEORY_H +#ifndef LIBMPDEC_NUMBERTHEORY_H_ +#define LIBMPDEC_NUMBERTHEORY_H_ -#include "constants.h" #include "mpdecimal.h" +#include "constants.h" /* Internal header file: all symbols have local scope in the DSO */ @@ -73,6 +73,4 @@ std_setmodulus(int modnum, mpd_uint_t *umod) MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ -#endif - - +#endif /* LIBMPDEC_NUMBERTHEORY_H_ */ diff --git a/Modules/_decimal/libmpdec/sixstep.c b/Modules/_decimal/libmpdec/sixstep.c index 92d513ebe18286ad402d046101bd0744b45aab7c..a4d1dbed7813c6c3aac64803db9e1620ebe8dd2d 100644 --- a/Modules/_decimal/libmpdec/sixstep.c +++ b/Modules/_decimal/libmpdec/sixstep.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,15 +27,17 @@ #include "mpdecimal.h" -#include -#include + #include +#include + #include "bits.h" +#include "constants.h" #include "difradix2.h" #include "numbertheory.h" +#include "sixstep.h" #include "transpose.h" #include "umodarith.h" -#include "sixstep.h" /* Bignum: Cache efficient Matrix Fourier Transform for arrays of the @@ -210,5 +212,3 @@ inv_six_step_fnt(mpd_uint_t *a, mpd_size_t n, int modnum) return 1; } - - diff --git a/Modules/_decimal/libmpdec/sixstep.h b/Modules/_decimal/libmpdec/sixstep.h index 4a8b015e3a9b90e807734378e03c72310e5af135..89b4a33afc792076fed62b3840893fa24c40d6bd 100644 --- a/Modules/_decimal/libmpdec/sixstep.h +++ b/Modules/_decimal/libmpdec/sixstep.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,11 @@ */ -#ifndef SIX_STEP_H -#define SIX_STEP_H +#ifndef LIBMPDEC_SIXSTEP_H_ +#define LIBMPDEC_SIXSTEP_H_ #include "mpdecimal.h" -#include /* Internal header file: all symbols have local scope in the DSO */ @@ -45,4 +44,4 @@ int inv_six_step_fnt(mpd_uint_t *a, mpd_size_t n, int modnum); MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ -#endif +#endif /* LIBMPDEC_SIXSTEP_H_ */ diff --git a/Modules/_decimal/libmpdec/transpose.c b/Modules/_decimal/libmpdec/transpose.c index 55d6d8992279009f320e8479514f71412195fa48..56321b5f39a733e27518bace4a0620225d3d485a 100644 --- a/Modules/_decimal/libmpdec/transpose.c +++ b/Modules/_decimal/libmpdec/transpose.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,15 +27,17 @@ #include "mpdecimal.h" + +#include +#include #include #include #include -#include -#include + #include "bits.h" #include "constants.h" -#include "typearith.h" #include "transpose.h" +#include "typearith.h" #define BUFSIZE 4096 @@ -272,5 +274,3 @@ transpose_pow2(mpd_uint_t *matrix, mpd_size_t rows, mpd_size_t cols) return 1; } - - diff --git a/Modules/_decimal/libmpdec/transpose.h b/Modules/_decimal/libmpdec/transpose.h index e1cd1fa17dd7730237f02e01f38fc37cf96c28cf..e91c18d74356bcfa3d08ac0e321f15f94ad7e128 100644 --- a/Modules/_decimal/libmpdec/transpose.h +++ b/Modules/_decimal/libmpdec/transpose.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,11 @@ */ -#ifndef TRANSPOSE_H -#define TRANSPOSE_H +#ifndef LIBMPDEC_TRANSPOSE_H_ +#define LIBMPDEC_TRANSPOSE_H_ #include "mpdecimal.h" -#include /* Internal header file: all symbols have local scope in the DSO */ @@ -59,4 +58,4 @@ static inline void pointerswap(mpd_uint_t **a, mpd_uint_t **b) MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */ -#endif +#endif /* LIBMPDEC_TRANSPOSE_H_ */ diff --git a/Modules/_decimal/libmpdec/typearith.h b/Modules/_decimal/libmpdec/typearith.h index 405237dac516ad0c5666a31842e6519403978521..47961788d764198590c1e2776abd262dd2238f5b 100644 --- a/Modules/_decimal/libmpdec/typearith.h +++ b/Modules/_decimal/libmpdec/typearith.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,14 @@ */ -#ifndef TYPEARITH_H -#define TYPEARITH_H +#ifndef LIBMPDEC_TYPEARITH_H_ +#define LIBMPDEC_TYPEARITH_H_ #include "mpdecimal.h" +#include + /*****************************************************************************/ /* Low level native arithmetic on basic types */ @@ -663,7 +665,4 @@ mulmod_size_t(mpd_size_t a, mpd_size_t b, mpd_size_t m) } -#endif /* TYPEARITH_H */ - - - +#endif /* LIBMPDEC_TYPEARITH_H_ */ diff --git a/Modules/_decimal/libmpdec/umodarith.h b/Modules/_decimal/libmpdec/umodarith.h index 68d15188cb39e5accf9dff257d1c5c47aceae20a..d7dbbbe6a7331a89c2fab7f4817b8c858775f974 100644 --- a/Modules/_decimal/libmpdec/umodarith.h +++ b/Modules/_decimal/libmpdec/umodarith.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,12 +26,13 @@ */ -#ifndef UMODARITH_H -#define UMODARITH_H +#ifndef LIBMPDEC_UMODARITH_H_ +#define LIBMPDEC_UMODARITH_H_ -#include "constants.h" #include "mpdecimal.h" + +#include "constants.h" #include "typearith.h" @@ -644,7 +645,4 @@ ppro_powmod(mpd_uint_t base, mpd_uint_t exp, double *dmod, uint32_t *dinvmod) #endif /* CONFIG_32 */ -#endif /* UMODARITH_H */ - - - +#endif /* LIBMPDEC_UMODARITH_H_ */ diff --git a/Modules/_decimal/libmpdec/vccompat.h b/Modules/_decimal/libmpdec/vccompat.h index dd131d8da2645c66fa241e55ca55d126f1447dfc..e2e1c42cc0250e1b9dd764d950026f0cd5b78729 100644 --- a/Modules/_decimal/libmpdec/vccompat.h +++ b/Modules/_decimal/libmpdec/vccompat.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. + * Copyright (c) 2008-2020 Stefan Krah. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,14 +26,16 @@ */ -#ifndef VCCOMPAT_H -#define VCCOMPAT_H +#ifndef LIBMPDEC_VCCOMPAT_H_ +#define LIBMPDEC_VCCOMPAT_H_ -/* Visual C fixes: no stdint.h, no snprintf ... */ +/* Visual C fixes: no snprintf ... */ #ifdef _MSC_VER - #undef inline - #define inline __inline + #ifndef __cplusplus + #undef inline + #define inline __inline + #endif #undef random #define random rand #undef srandom @@ -51,7 +53,4 @@ #endif -#endif /* VCCOMPAT_H */ - - - +#endif /* LIBMPDEC_VCCOMPAT_H_ */ diff --git a/Modules/_decimal/libmpdec/vcdiv64.asm b/Modules/_decimal/libmpdec/vcdiv64.asm index becb80ad54ba24dbd5e77edbbf67cccd503684f5..4cbf1a4988da0002ed6fd3aa01afa11f05364e79 100644 --- a/Modules/_decimal/libmpdec/vcdiv64.asm +++ b/Modules/_decimal/libmpdec/vcdiv64.asm @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5f5fc2a63d5f52d5c883ffae3f42f9d41ae6932bd60a92ede053adebf0908086 -size 1641 +oid sha256:aacc3e47ea8f41e8840c6c67f64ec96d54696a16889903098fa1aab56949a00f +size 1639 diff --git a/Modules/_decimal/libmpdec/vcstdint.h b/Modules/_decimal/libmpdec/vcstdint.h deleted file mode 100644 index 17dcad4541ee5c201cf10d70e05510949b536462..0000000000000000000000000000000000000000 --- a/Modules/_decimal/libmpdec/vcstdint.h +++ /dev/null @@ -1,232 +0,0 @@ -// ISO C9x compliant stdint.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006-2008 Alexander Chemeris -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. The name of the author may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef _MSC_VER // [ -#error "Use this header only with Microsoft Visual C++ compilers!" -#endif // _MSC_VER ] - -#ifndef _MSC_STDINT_H_ // [ -#define _MSC_STDINT_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include - -// For Visual Studio 6 in C++ mode wrap include with 'extern "C++" {}' -// or compiler give many errors like this: -// error C2733: second C linkage of overloaded function 'wmemchr' not allowed -#if (_MSC_VER < 1300) && defined(__cplusplus) - extern "C++" { -#endif -# include -#if (_MSC_VER < 1300) && defined(__cplusplus) - } -#endif - -// Define _W64 macros to mark types changing their size, like intptr_t. -#ifndef _W64 -# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 -# define _W64 __w64 -# else -# define _W64 -# endif -#endif - - -// 7.18.1 Integer types - -// 7.18.1.1 Exact-width integer types -typedef __int8 int8_t; -typedef __int16 int16_t; -typedef __int32 int32_t; -typedef __int64 int64_t; -typedef unsigned __int8 uint8_t; -typedef unsigned __int16 uint16_t; -typedef unsigned __int32 uint32_t; -typedef unsigned __int64 uint64_t; - -// 7.18.1.2 Minimum-width integer types -typedef int8_t int_least8_t; -typedef int16_t int_least16_t; -typedef int32_t int_least32_t; -typedef int64_t int_least64_t; -typedef uint8_t uint_least8_t; -typedef uint16_t uint_least16_t; -typedef uint32_t uint_least32_t; -typedef uint64_t uint_least64_t; - -// 7.18.1.3 Fastest minimum-width integer types -typedef int8_t int_fast8_t; -typedef int16_t int_fast16_t; -typedef int32_t int_fast32_t; -typedef int64_t int_fast64_t; -typedef uint8_t uint_fast8_t; -typedef uint16_t uint_fast16_t; -typedef uint32_t uint_fast32_t; -typedef uint64_t uint_fast64_t; - -// 7.18.1.4 Integer types capable of holding object pointers -#ifdef _WIN64 // [ - typedef __int64 intptr_t; - typedef unsigned __int64 uintptr_t; -#else // _WIN64 ][ - typedef _W64 int intptr_t; - typedef _W64 unsigned int uintptr_t; -#endif // _WIN64 ] - -// 7.18.1.5 Greatest-width integer types -typedef int64_t intmax_t; -typedef uint64_t uintmax_t; - - -// 7.18.2 Limits of specified-width integer types - -#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 - -// 7.18.2.1 Limits of exact-width integer types -#define INT8_MIN ((int8_t)_I8_MIN) -#define INT8_MAX _I8_MAX -#define INT16_MIN ((int16_t)_I16_MIN) -#define INT16_MAX _I16_MAX -#define INT32_MIN ((int32_t)_I32_MIN) -#define INT32_MAX _I32_MAX -#define INT64_MIN ((int64_t)_I64_MIN) -#define INT64_MAX _I64_MAX -#define UINT8_MAX _UI8_MAX -#define UINT16_MAX _UI16_MAX -#define UINT32_MAX _UI32_MAX -#define UINT64_MAX _UI64_MAX - -// 7.18.2.2 Limits of minimum-width integer types -#define INT_LEAST8_MIN INT8_MIN -#define INT_LEAST8_MAX INT8_MAX -#define INT_LEAST16_MIN INT16_MIN -#define INT_LEAST16_MAX INT16_MAX -#define INT_LEAST32_MIN INT32_MIN -#define INT_LEAST32_MAX INT32_MAX -#define INT_LEAST64_MIN INT64_MIN -#define INT_LEAST64_MAX INT64_MAX -#define UINT_LEAST8_MAX UINT8_MAX -#define UINT_LEAST16_MAX UINT16_MAX -#define UINT_LEAST32_MAX UINT32_MAX -#define UINT_LEAST64_MAX UINT64_MAX - -// 7.18.2.3 Limits of fastest minimum-width integer types -#define INT_FAST8_MIN INT8_MIN -#define INT_FAST8_MAX INT8_MAX -#define INT_FAST16_MIN INT16_MIN -#define INT_FAST16_MAX INT16_MAX -#define INT_FAST32_MIN INT32_MIN -#define INT_FAST32_MAX INT32_MAX -#define INT_FAST64_MIN INT64_MIN -#define INT_FAST64_MAX INT64_MAX -#define UINT_FAST8_MAX UINT8_MAX -#define UINT_FAST16_MAX UINT16_MAX -#define UINT_FAST32_MAX UINT32_MAX -#define UINT_FAST64_MAX UINT64_MAX - -// 7.18.2.4 Limits of integer types capable of holding object pointers -#ifdef _WIN64 // [ -# define INTPTR_MIN INT64_MIN -# define INTPTR_MAX INT64_MAX -# define UINTPTR_MAX UINT64_MAX -#else // _WIN64 ][ -# define INTPTR_MIN INT32_MIN -# define INTPTR_MAX INT32_MAX -# define UINTPTR_MAX UINT32_MAX -#endif // _WIN64 ] - -// 7.18.2.5 Limits of greatest-width integer types -#define INTMAX_MIN INT64_MIN -#define INTMAX_MAX INT64_MAX -#define UINTMAX_MAX UINT64_MAX - -// 7.18.3 Limits of other integer types - -#ifdef _WIN64 // [ -# define PTRDIFF_MIN _I64_MIN -# define PTRDIFF_MAX _I64_MAX -#else // _WIN64 ][ -# define PTRDIFF_MIN _I32_MIN -# define PTRDIFF_MAX _I32_MAX -#endif // _WIN64 ] - -#define SIG_ATOMIC_MIN INT_MIN -#define SIG_ATOMIC_MAX INT_MAX - -#ifndef SIZE_MAX // [ -# ifdef _WIN64 // [ -# define SIZE_MAX _UI64_MAX -# else // _WIN64 ][ -# define SIZE_MAX _UI32_MAX -# endif // _WIN64 ] -#endif // SIZE_MAX ] - -// WCHAR_MIN and WCHAR_MAX are also defined in -#ifndef WCHAR_MIN // [ -# define WCHAR_MIN 0 -#endif // WCHAR_MIN ] -#ifndef WCHAR_MAX // [ -# define WCHAR_MAX _UI16_MAX -#endif // WCHAR_MAX ] - -#define WINT_MIN 0 -#define WINT_MAX _UI16_MAX - -#endif // __STDC_LIMIT_MACROS ] - - -// 7.18.4 Limits of other integer types - -#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 - -// 7.18.4.1 Macros for minimum-width integer constants - -#define INT8_C(val) val##i8 -#define INT16_C(val) val##i16 -#define INT32_C(val) val##i32 -#define INT64_C(val) val##i64 - -#define UINT8_C(val) val##ui8 -#define UINT16_C(val) val##ui16 -#define UINT32_C(val) val##ui32 -#define UINT64_C(val) val##ui64 - -// 7.18.4.2 Macros for greatest-width integer constants -#define INTMAX_C INT64_C -#define UINTMAX_C UINT64_C - -#endif // __STDC_CONSTANT_MACROS ] - - -#endif // _MSC_STDINT_H_ ] diff --git a/Modules/_decimal/tests/deccheck.py b/Modules/_decimal/tests/deccheck.py index f907531e1ffa58b52e9e5a48b6f5e70a7d35c0ce..5d9179e61689d00999aef578d0d31dbedca52d51 100644 --- a/Modules/_decimal/tests/deccheck.py +++ b/Modules/_decimal/tests/deccheck.py @@ -29,9 +29,20 @@ # Usage: python deccheck.py [--short|--medium|--long|--all] # -import sys, random + +import sys +import os +import time +import random from copy import copy from collections import defaultdict + +import argparse +import subprocess +from subprocess import PIPE, STDOUT +from queue import Queue, Empty +from threading import Thread, Event, Lock + from test.support import import_fresh_module from randdec import randfloat, all_unary, all_binary, all_ternary from randdec import unary_optarg, binary_optarg, ternary_optarg @@ -125,6 +136,12 @@ 'special': ('context.__reduce_ex__', 'context.create_decimal_from_float') } +# Functions that set no context flags but whose result can differ depending +# on prec, Emin and Emax. +MaxContextSkip = ['is_normal', 'is_subnormal', 'logical_invert', 'next_minus', + 'next_plus', 'number_class', 'logical_and', 'logical_or', + 'logical_xor', 'next_toward', 'rotate', 'shift'] + # Functions that require a restricted exponent range for reasonable runtimes. UnaryRestricted = [ '__ceil__', '__floor__', '__int__', '__trunc__', @@ -344,6 +361,20 @@ def __init__(self, funcname, operands): self.pex = RestrictedList() # Python exceptions for P.Decimal self.presults = RestrictedList() # P.Decimal results + # If the above results are exact, unrounded and not clamped, repeat + # the operation with a maxcontext to ensure that huge intermediate + # values do not cause a MemoryError. + self.with_maxcontext = False + self.maxcontext = context.c.copy() + self.maxcontext.prec = C.MAX_PREC + self.maxcontext.Emax = C.MAX_EMAX + self.maxcontext.Emin = C.MIN_EMIN + self.maxcontext.clear_flags() + + self.maxop = RestrictedList() # converted C.Decimal operands + self.maxex = RestrictedList() # Python exceptions for C.Decimal + self.maxresults = RestrictedList() # C.Decimal results + # ====================================================================== # SkipHandler: skip known discrepancies @@ -545,13 +576,17 @@ def function_as_string(t): if t.contextfunc: cargs = t.cop pargs = t.pop + maxargs = t.maxop cfunc = "c_func: %s(" % t.funcname pfunc = "p_func: %s(" % t.funcname + maxfunc = "max_func: %s(" % t.funcname else: cself, cargs = t.cop[0], t.cop[1:] pself, pargs = t.pop[0], t.pop[1:] + maxself, maxargs = t.maxop[0], t.maxop[1:] cfunc = "c_func: %s.%s(" % (repr(cself), t.funcname) pfunc = "p_func: %s.%s(" % (repr(pself), t.funcname) + maxfunc = "max_func: %s.%s(" % (repr(maxself), t.funcname) err = cfunc for arg in cargs: @@ -565,6 +600,14 @@ def function_as_string(t): err = err.rstrip(", ") err += ")" + if t.with_maxcontext: + err += "\n" + err += maxfunc + for arg in maxargs: + err += "%s, " % repr(arg) + err = err.rstrip(", ") + err += ")" + return err def raise_error(t): @@ -577,9 +620,24 @@ def raise_error(t): err = "Error in %s:\n\n" % t.funcname err += "input operands: %s\n\n" % (t.op,) err += function_as_string(t) - err += "\n\nc_result: %s\np_result: %s\n\n" % (t.cresults, t.presults) - err += "c_exceptions: %s\np_exceptions: %s\n\n" % (t.cex, t.pex) - err += "%s\n\n" % str(t.context) + + err += "\n\nc_result: %s\np_result: %s\n" % (t.cresults, t.presults) + if t.with_maxcontext: + err += "max_result: %s\n\n" % (t.maxresults) + else: + err += "\n" + + err += "c_exceptions: %s\np_exceptions: %s\n" % (t.cex, t.pex) + if t.with_maxcontext: + err += "max_exceptions: %s\n\n" % t.maxex + else: + err += "\n" + + err += "%s\n" % str(t.context) + if t.with_maxcontext: + err += "%s\n" % str(t.maxcontext) + else: + err += "\n" raise VerifyError(err) @@ -603,6 +661,13 @@ def raise_error(t): # are printed to stdout. # ====================================================================== +def all_nan(a): + if isinstance(a, C.Decimal): + return a.is_nan() + elif isinstance(a, tuple): + return all(all_nan(v) for v in a) + return False + def convert(t, convstr=True): """ t is the testset. At this stage the testset contains a tuple of operands t.op of various types. For decimal methods the first @@ -617,10 +682,12 @@ def convert(t, convstr=True): for i, op in enumerate(t.op): context.clear_status() + t.maxcontext.clear_flags() if op in RoundModes: t.cop.append(op) t.pop.append(op) + t.maxop.append(op) elif not t.contextfunc and i == 0 or \ convstr and isinstance(op, str): @@ -638,11 +705,25 @@ def convert(t, convstr=True): p = None pex = e.__class__ + try: + C.setcontext(t.maxcontext) + maxop = C.Decimal(op) + maxex = None + except (TypeError, ValueError, OverflowError) as e: + maxop = None + maxex = e.__class__ + finally: + C.setcontext(context.c) + t.cop.append(c) t.cex.append(cex) + t.pop.append(p) t.pex.append(pex) + t.maxop.append(maxop) + t.maxex.append(maxex) + if cex is pex: if str(c) != str(p) or not context.assert_eq_status(): raise_error(t) @@ -652,14 +733,21 @@ def convert(t, convstr=True): else: raise_error(t) + # The exceptions in the maxcontext operation can legitimately + # differ, only test that maxex implies cex: + if maxex is not None and cex is not maxex: + raise_error(t) + elif isinstance(op, Context): t.context = op t.cop.append(op.c) t.pop.append(op.p) + t.maxop.append(t.maxcontext) else: t.cop.append(op) t.pop.append(op) + t.maxop.append(op) return 1 @@ -673,6 +761,7 @@ def callfuncs(t): t.rc and t.rp are the results of the operation. """ context.clear_status() + t.maxcontext.clear_flags() try: if t.contextfunc: @@ -700,6 +789,35 @@ def callfuncs(t): t.rp = None t.pex.append(e.__class__) + # If the above results are exact, unrounded, normal etc., repeat the + # operation with a maxcontext to ensure that huge intermediate values + # do not cause a MemoryError. + if (t.funcname not in MaxContextSkip and + not context.c.flags[C.InvalidOperation] and + not context.c.flags[C.Inexact] and + not context.c.flags[C.Rounded] and + not context.c.flags[C.Subnormal] and + not context.c.flags[C.Clamped] and + not context.clamp and # results are padded to context.prec if context.clamp==1. + not any(isinstance(v, C.Context) for v in t.cop)): # another context is used. + t.with_maxcontext = True + try: + if t.contextfunc: + maxargs = t.maxop + t.rmax = getattr(t.maxcontext, t.funcname)(*maxargs) + else: + maxself = t.maxop[0] + maxargs = t.maxop[1:] + try: + C.setcontext(t.maxcontext) + t.rmax = getattr(maxself, t.funcname)(*maxargs) + finally: + C.setcontext(context.c) + t.maxex.append(None) + except (TypeError, ValueError, OverflowError, MemoryError) as e: + t.rmax = None + t.maxex.append(e.__class__) + def verify(t, stat): """ t is the testset. At this stage the testset contains the following tuples: @@ -714,6 +832,9 @@ def verify(t, stat): """ t.cresults.append(str(t.rc)) t.presults.append(str(t.rp)) + if t.with_maxcontext: + t.maxresults.append(str(t.rmax)) + if isinstance(t.rc, C.Decimal) and isinstance(t.rp, P.Decimal): # General case: both results are Decimals. t.cresults.append(t.rc.to_eng_string()) @@ -725,6 +846,12 @@ def verify(t, stat): t.presults.append(str(t.rp.imag)) t.presults.append(str(t.rp.real)) + if t.with_maxcontext and isinstance(t.rmax, C.Decimal): + t.maxresults.append(t.rmax.to_eng_string()) + t.maxresults.append(t.rmax.as_tuple()) + t.maxresults.append(str(t.rmax.imag)) + t.maxresults.append(str(t.rmax.real)) + nc = t.rc.number_class().lstrip('+-s') stat[nc] += 1 else: @@ -732,6 +859,9 @@ def verify(t, stat): if not isinstance(t.rc, tuple) and not isinstance(t.rp, tuple): if t.rc != t.rp: raise_error(t) + if t.with_maxcontext and not isinstance(t.rmax, tuple): + if t.rmax != t.rc: + raise_error(t) stat[type(t.rc).__name__] += 1 # The return value lists must be equal. @@ -744,6 +874,20 @@ def verify(t, stat): if not t.context.assert_eq_status(): raise_error(t) + if t.with_maxcontext: + # NaN payloads etc. depend on precision and clamp. + if all_nan(t.rc) and all_nan(t.rmax): + return + # The return value lists must be equal. + if t.maxresults != t.cresults: + raise_error(t) + # The Python exception lists (TypeError, etc.) must be equal. + if t.maxex != t.cex: + raise_error(t) + # The context flags must be equal. + if t.maxcontext.flags != t.context.c.flags: + raise_error(t) + # ====================================================================== # Main test loops @@ -991,18 +1135,35 @@ def check_untested(funcdict, c_cls, p_cls): funcdict['untested'] = tuple(sorted(intersect-tested)) - #for key in ('untested', 'c_only', 'p_only'): - # s = 'Context' if c_cls == C.Context else 'Decimal' - # print("\n%s %s:\n%s" % (s, key, funcdict[key])) + # for key in ('untested', 'c_only', 'p_only'): + # s = 'Context' if c_cls == C.Context else 'Decimal' + # print("\n%s %s:\n%s" % (s, key, funcdict[key])) if __name__ == '__main__': - import time + parser = argparse.ArgumentParser(prog="deccheck.py") + + group = parser.add_mutually_exclusive_group() + group.add_argument('--short', dest='time', action="store_const", const='short', default='short', help="short test (default)") + group.add_argument('--medium', dest='time', action="store_const", const='medium', default='short', help="medium test (reasonable run time)") + group.add_argument('--long', dest='time', action="store_const", const='long', default='short', help="long test (long run time)") + group.add_argument('--all', dest='time', action="store_const", const='all', default='short', help="all tests (excessive run time)") + + group = parser.add_mutually_exclusive_group() + group.add_argument('--single', dest='single', nargs=1, default=False, metavar="TEST", help="run a single test") + group.add_argument('--multicore', dest='multicore', action="store_true", default=False, help="use all available cores") + + args = parser.parse_args() + assert args.single is False or args.multicore is False + if args.single: + args.single = args.single[0] + randseed = int(time.time()) random.seed(randseed) + # Set up the testspecs list. A testspec is simply a dictionary # that determines the amount of different contexts that 'test_method' # will generate. @@ -1035,17 +1196,17 @@ def check_untested(funcdict, c_cls, p_cls): {'prec': [34], 'expts': [(-6143, 6144)], 'clamp': 1, 'iter': None} ] - if '--medium' in sys.argv: + if args.time == 'medium': base['expts'].append(('rand', 'rand')) # 5 random precisions base['samples'] = 5 testspecs = [small] + ieee + [base] - if '--long' in sys.argv: + elif args.time == 'long': base['expts'].append(('rand', 'rand')) # 10 random precisions base['samples'] = 10 testspecs = [small] + ieee + [base] - elif '--all' in sys.argv: + elif args.time == 'all': base['expts'].append(('rand', 'rand')) # All precisions in [1, 100] base['samples'] = 100 @@ -1062,39 +1223,100 @@ def check_untested(funcdict, c_cls, p_cls): small['expts'] = [(-prec, prec)] testspecs = [small, rand_ieee, base] + check_untested(Functions, C.Decimal, P.Decimal) check_untested(ContextFunctions, C.Context, P.Context) - log("\n\nRandom seed: %d\n\n", randseed) + if args.multicore: + q = Queue() + elif args.single: + log("Random seed: %d", randseed) + else: + log("\n\nRandom seed: %d\n\n", randseed) + + + FOUND_METHOD = False + def do_single(method, f): + global FOUND_METHOD + if args.multicore: + q.put(method) + elif not args.single or args.single == method: + FOUND_METHOD = True + f() # Decimal methods: for method in Functions['unary'] + Functions['unary_ctx'] + \ Functions['unary_rnd_ctx']: - test_method(method, testspecs, test_unary) + do_single(method, lambda: test_method(method, testspecs, test_unary)) for method in Functions['binary'] + Functions['binary_ctx']: - test_method(method, testspecs, test_binary) + do_single(method, lambda: test_method(method, testspecs, test_binary)) for method in Functions['ternary'] + Functions['ternary_ctx']: - test_method(method, testspecs, test_ternary) + name = '__powmod__' if method == '__pow__' else method + do_single(name, lambda: test_method(method, testspecs, test_ternary)) - test_method('__format__', testspecs, test_format) - test_method('__round__', testspecs, test_round) - test_method('from_float', testspecs, test_from_float) - test_method('quantize', testspecs, test_quantize_api) + do_single('__format__', lambda: test_method('__format__', testspecs, test_format)) + do_single('__round__', lambda: test_method('__round__', testspecs, test_round)) + do_single('from_float', lambda: test_method('from_float', testspecs, test_from_float)) + do_single('quantize_api', lambda: test_method('quantize', testspecs, test_quantize_api)) # Context methods: for method in ContextFunctions['unary']: - test_method(method, testspecs, test_unary) + do_single(method, lambda: test_method(method, testspecs, test_unary)) for method in ContextFunctions['binary']: - test_method(method, testspecs, test_binary) + do_single(method, lambda: test_method(method, testspecs, test_binary)) for method in ContextFunctions['ternary']: - test_method(method, testspecs, test_ternary) - - test_method('context.create_decimal_from_float', testspecs, test_from_float) - - - sys.exit(EXIT_STATUS) + name = 'context.powmod' if method == 'context.power' else method + do_single(name, lambda: test_method(method, testspecs, test_ternary)) + + do_single('context.create_decimal_from_float', + lambda: test_method('context.create_decimal_from_float', + testspecs, test_from_float)) + + if args.multicore: + error = Event() + write_lock = Lock() + + def write_output(out, returncode): + if returncode != 0: + error.set() + + with write_lock: + sys.stdout.buffer.write(out + b"\n") + sys.stdout.buffer.flush() + + def tfunc(): + while not error.is_set(): + try: + test = q.get(block=False, timeout=-1) + except Empty: + return + + cmd = [sys.executable, "deccheck.py", "--%s" % args.time, "--single", test] + p = subprocess.Popen(cmd, stdout=PIPE, stderr=STDOUT) + out, _ = p.communicate() + write_output(out, p.returncode) + + N = os.cpu_count() + t = N * [None] + + for i in range(N): + t[i] = Thread(target=tfunc) + t[i].start() + + for i in range(N): + t[i].join() + + sys.exit(1 if error.is_set() else 0) + + elif args.single: + if not FOUND_METHOD: + log("\nerror: cannot find method \"%s\"" % args.single) + EXIT_STATUS = 1 + sys.exit(EXIT_STATUS) + else: + sys.exit(EXIT_STATUS) diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index a96e3f43b5597f99cf1358dc534ef38b699dbd61..2c92a8aedb5a8841a9354defc38a9a97882888e1 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -14,7 +14,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef /* -------------------------------------------------------------------- */ /* configuration */ @@ -101,7 +101,13 @@ static struct PyModuleDef elementtreemodule; /* Given a module object (assumed to be _elementtree), get its per-module * state. */ -#define ET_STATE(mod) ((elementtreestate *) PyModule_GetState(mod)) +static inline elementtreestate* +get_elementtree_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (elementtreestate *)state; +} /* Find the module instance imported in the currently running sub-interpreter * and get its state. @@ -112,7 +118,7 @@ static struct PyModuleDef elementtreemodule; static int elementtree_clear(PyObject *m) { - elementtreestate *st = ET_STATE(m); + elementtreestate *st = get_elementtree_state(m); Py_CLEAR(st->parseerror_obj); Py_CLEAR(st->deepcopy_obj); Py_CLEAR(st->elementpath_obj); @@ -124,7 +130,7 @@ elementtree_clear(PyObject *m) static int elementtree_traverse(PyObject *m, visitproc visit, void *arg) { - elementtreestate *st = ET_STATE(m); + elementtreestate *st = get_elementtree_state(m); Py_VISIT(st->parseerror_obj); Py_VISIT(st->deepcopy_obj); Py_VISIT(st->elementpath_obj); @@ -170,7 +176,7 @@ is_empty_dict(PyObject *obj) typedef struct { - /* attributes (a dictionary object), or None if no attributes */ + /* attributes (a dictionary object), or NULL if no attributes */ PyObject* attrib; /* child elements */ @@ -209,7 +215,7 @@ typedef struct { } ElementObject; -#define Element_CheckExact(op) (Py_TYPE(op) == &Element_Type) +#define Element_CheckExact(op) Py_IS_TYPE(op, &Element_Type) #define Element_Check(op) PyObject_TypeCheck(op, &Element_Type) @@ -225,10 +231,7 @@ create_extra(ElementObject* self, PyObject* attrib) return -1; } - if (!attrib) - attrib = Py_None; - - Py_INCREF(attrib); + Py_XINCREF(attrib); self->extra->attrib = attrib; self->extra->length = 0; @@ -246,7 +249,7 @@ dealloc_extra(ElementObjectExtra *extra) if (!extra) return; - Py_DECREF(extra->attrib); + Py_XDECREF(extra->attrib); for (i = 0; i < extra->length; i++) Py_DECREF(extra->children[i]); @@ -300,7 +303,7 @@ create_new_element(PyObject* tag, PyObject* attrib) ALLOC(sizeof(ElementObject), "create element"); PyObject_GC_Track(self); - if (attrib != Py_None && !is_empty_dict(attrib)) { + if (attrib != NULL && !is_empty_dict(attrib)) { if (create_extra(self, attrib) < 0) { Py_DECREF(self); return NULL; @@ -530,13 +533,9 @@ element_get_attrib(ElementObject* self) PyObject* res = self->extra->attrib; - if (res == Py_None) { + if (!res) { /* create missing dictionary */ - res = PyDict_New(); - if (!res) - return NULL; - Py_DECREF(Py_None); - self->extra->attrib = res; + res = self->extra->attrib = PyDict_New(); } return res; @@ -616,12 +615,10 @@ subelement(PyObject *self, PyObject *args, PyObject *kwds) return NULL; } else { /* no attrib arg, no kwds, so no attribute */ - Py_INCREF(Py_None); - attrib = Py_None; } elem = create_new_element(tag, attrib); - Py_DECREF(attrib); + Py_XDECREF(attrib); if (elem == NULL) return NULL; @@ -736,7 +733,7 @@ _elementtree_Element___copy___impl(ElementObject *self) ElementObject* element; element = (ElementObject*) create_new_element( - self->tag, (self->extra) ? self->extra->attrib : Py_None); + self->tag, self->extra ? self->extra->attrib : NULL); if (!element) return NULL; @@ -792,21 +789,20 @@ _elementtree_Element___deepcopy___impl(ElementObject *self, PyObject *memo) if (!tag) return NULL; - if (self->extra) { + if (self->extra && self->extra->attrib) { attrib = deepcopy(self->extra->attrib, memo); if (!attrib) { Py_DECREF(tag); return NULL; } } else { - Py_INCREF(Py_None); - attrib = Py_None; + attrib = NULL; } element = (ElementObject*) create_new_element(tag, attrib); Py_DECREF(tag); - Py_DECREF(attrib); + Py_XDECREF(attrib); if (!element) return NULL; @@ -963,7 +959,7 @@ _elementtree_Element___getstate___impl(ElementObject *self) PyList_SET_ITEM(children, i, child); } - if (self->extra && self->extra->attrib != Py_None) { + if (self->extra && self->extra->attrib) { attrib = self->extra->attrib; Py_INCREF(attrib); } @@ -1037,9 +1033,9 @@ element_setstate_from_attributes(ElementObject *self, assert(self->extra); assert(self->extra->allocated >= nchildren); if (oldextra) { - assert(self->extra->attrib == Py_None); + assert(self->extra->attrib == NULL); self->extra->attrib = oldextra->attrib; - oldextra->attrib = Py_None; + oldextra->attrib = NULL; } /* Copy children */ @@ -1065,10 +1061,8 @@ element_setstate_from_attributes(ElementObject *self, } /* Stash attrib. */ - if (attrib) { - Py_INCREF(attrib); - Py_XSETREF(self->extra->attrib, attrib); - } + Py_XINCREF(attrib); + Py_XSETREF(self->extra->attrib, attrib); dealloc_extra(oldextra); Py_RETURN_NONE; @@ -1138,7 +1132,7 @@ checkpath(PyObject* tag) if (PyUnicode_Check(tag)) { const Py_ssize_t len = PyUnicode_GET_LENGTH(tag); - void *data = PyUnicode_DATA(tag); + const void *data = PyUnicode_DATA(tag); unsigned int kind = PyUnicode_KIND(tag); if (len >= 3 && PyUnicode_READ(kind, data, 0) == '{' && ( PyUnicode_READ(kind, data, 1) == '}' || ( @@ -1159,7 +1153,7 @@ checkpath(PyObject* tag) return 0; } if (PyBytes_Check(tag)) { - char *p = PyBytes_AS_STRING(tag); + const char *p = PyBytes_AS_STRING(tag); const Py_ssize_t len = PyBytes_GET_SIZE(tag); if (len >= 3 && p[0] == '{' && ( p[1] == '}' || (p[1] == '*' && p[2] == '}'))) { @@ -1401,7 +1395,7 @@ _elementtree_Element_get_impl(ElementObject *self, PyObject *key, { PyObject* value; - if (!self->extra || self->extra->attrib == Py_None) + if (!self->extra || !self->extra->attrib) value = default_value; else { value = PyDict_GetItemWithError(self->extra->attrib, key); @@ -1417,42 +1411,6 @@ _elementtree_Element_get_impl(ElementObject *self, PyObject *key, return value; } -/*[clinic input] -_elementtree.Element.getchildren - -[clinic start generated code]*/ - -static PyObject * -_elementtree_Element_getchildren_impl(ElementObject *self) -/*[clinic end generated code: output=e50ffe118637b14f input=0f754dfded150d5f]*/ -{ - Py_ssize_t i; - PyObject* list; - - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "This method will be removed in future versions. " - "Use 'list(elem)' or iteration over elem instead.", - 1) < 0) { - return NULL; - } - - if (!self->extra) - return PyList_New(0); - - list = PyList_New(self->extra->length); - if (!list) - return NULL; - - for (i = 0; i < self->extra->length; i++) { - PyObject* item = self->extra->children[i]; - Py_INCREF(item); - PyList_SET_ITEM(list, i, item); - } - - return list; -} - - static PyObject * create_elementiter(ElementObject *self, PyObject *tag, int gettext); @@ -1483,27 +1441,6 @@ _elementtree_Element_iter_impl(ElementObject *self, PyObject *tag) } -/*[clinic input] -_elementtree.Element.getiterator - - tag: object = None - -[clinic start generated code]*/ - -static PyObject * -_elementtree_Element_getiterator_impl(ElementObject *self, PyObject *tag) -/*[clinic end generated code: output=cb69ff4a3742dfa1 input=500da1a03f7b9e28]*/ -{ - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "This method will be removed in future versions. " - "Use 'tree.iter()' or 'list(tree.iter())' instead.", - 1) < 0) { - return NULL; - } - return _elementtree_Element_iter_impl(self, tag); -} - - /*[clinic input] _elementtree.Element.itertext @@ -1586,7 +1523,7 @@ static PyObject * _elementtree_Element_items_impl(ElementObject *self) /*[clinic end generated code: output=6db2c778ce3f5a4d input=adbe09aaea474447]*/ { - if (!self->extra || self->extra->attrib == Py_None) + if (!self->extra || !self->extra->attrib) return PyList_New(0); return PyDict_Items(self->extra->attrib); @@ -1601,7 +1538,7 @@ static PyObject * _elementtree_Element_keys_impl(ElementObject *self) /*[clinic end generated code: output=bc5bfabbf20eeb3c input=f02caf5b496b5b0b]*/ { - if (!self->extra || self->extra->attrib == Py_None) + if (!self->extra || !self->extra->attrib) return PyList_New(0); return PyDict_Keys(self->extra->attrib); @@ -1620,7 +1557,7 @@ element_length(ElementObject* self) _elementtree.Element.makeelement tag: object - attrib: object + attrib: object(subclass_of='&PyDict_Type') / [clinic start generated code]*/ @@ -1628,7 +1565,7 @@ _elementtree.Element.makeelement static PyObject * _elementtree_Element_makeelement_impl(ElementObject *self, PyObject *tag, PyObject *attrib) -/*[clinic end generated code: output=4109832d5bb789ef input=9480d1d2e3e68235]*/ +/*[clinic end generated code: output=4109832d5bb789ef input=2279d974529c3861]*/ { PyObject* elem; @@ -2100,12 +2037,18 @@ static int element_attrib_setter(ElementObject *self, PyObject *value, void *closure) { _VALIDATE_ATTR_VALUE(value); + if (!PyDict_Check(value)) { + PyErr_Format(PyExc_TypeError, + "attrib must be dict, not %.200s", + value->ob_type->tp_name); + return -1; + } if (!self->extra) { if (create_extra(self, NULL) < 0) return -1; } Py_INCREF(value); - Py_SETREF(self->extra->attrib, value); + Py_XSETREF(self->extra->attrib, value); return 0; } @@ -2365,8 +2308,6 @@ create_elementiter(ElementObject *self, PyObject *tag, int gettext) Py_INCREF(self); it->root_element = self; - PyObject_GC_Track(it); - it->parent_stack = PyMem_New(ParentLocator, INIT_PARENT_STACK_SIZE); if (it->parent_stack == NULL) { Py_DECREF(it); @@ -2376,6 +2317,8 @@ create_elementiter(ElementObject *self, PyObject *tag, int gettext) it->parent_stack_used = 0; it->parent_stack_size = INIT_PARENT_STACK_SIZE; + PyObject_GC_Track(it); + return (PyObject *)it; } @@ -2414,7 +2357,7 @@ typedef struct { char insert_pis; } TreeBuilderObject; -#define TreeBuilder_CheckExact(op) (Py_TYPE(op) == &TreeBuilder_Type) +#define TreeBuilder_CheckExact(op) Py_IS_TYPE((op), &TreeBuilder_Type) /* -------------------------------------------------------------------- */ /* constructor and destructor */ @@ -2702,7 +2645,7 @@ treebuilder_add_subelement(PyObject *element, PyObject *child) } else { PyObject *res; - res = _PyObject_CallMethodIdObjArgs(element, &PyId_append, child, NULL); + res = _PyObject_CallMethodIdOneArg(element, &PyId_append, child); if (res == NULL) return -1; Py_DECREF(res); @@ -2719,7 +2662,7 @@ treebuilder_append_event(TreeBuilderObject *self, PyObject *action, PyObject *event = PyTuple_Pack(2, action, node); if (event == NULL) return -1; - res = _PyObject_FastCall(self->events_append, &event, 1); + res = PyObject_CallOneArg(self->events_append, event); Py_DECREF(event); if (res == NULL) return -1; @@ -2745,7 +2688,7 @@ treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag, if (!self->element_factory) { node = create_new_element(tag, attrib); - } else if (attrib == Py_None) { + } else if (attrib == NULL) { attrib = PyDict_New(); if (!attrib) return NULL; @@ -2885,7 +2828,7 @@ treebuilder_handle_comment(TreeBuilderObject* self, PyObject* text) } if (self->comment_factory) { - comment = _PyObject_FastCall(self->comment_factory, &text, 1); + comment = PyObject_CallOneArg(self->comment_factory, text); if (!comment) return NULL; @@ -3086,7 +3029,7 @@ _elementtree_TreeBuilder_close_impl(TreeBuilderObject *self) _elementtree.TreeBuilder.start tag: object - attrs: object = None + attrs: object(subclass_of='&PyDict_Type') / [clinic start generated code]*/ @@ -3094,7 +3037,7 @@ _elementtree.TreeBuilder.start static PyObject * _elementtree_TreeBuilder_start_impl(TreeBuilderObject *self, PyObject *tag, PyObject *attrs) -/*[clinic end generated code: output=e7e9dc2861349411 input=95fc1758dd042c65]*/ +/*[clinic end generated code: output=e7e9dc2861349411 input=7288e9e38e63b2b6]*/ { return treebuilder_handle_start(self, tag, attrs); } @@ -3227,7 +3170,7 @@ expat_set_error(enum XML_Error error_code, Py_ssize_t line, Py_ssize_t column, if (errmsg == NULL) return; - error = _PyObject_FastCall(st->parseerror_obj, &errmsg, 1); + error = PyObject_CallOneArg(st->parseerror_obj, errmsg); Py_DECREF(errmsg); if (!error) return; @@ -3290,7 +3233,7 @@ expat_default_handler(XMLParserObject* self, const XML_Char* data_in, (TreeBuilderObject*) self->target, value ); else if (self->handle_data) - res = _PyObject_FastCall(self->handle_data, &value, 1); + res = PyObject_CallOneArg(self->handle_data, value); else res = NULL; Py_XDECREF(res); @@ -3354,8 +3297,7 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in, attrib_in += 2; } } else { - Py_INCREF(Py_None); - attrib = Py_None; + attrib = NULL; } if (TreeBuilder_CheckExact(self->target)) { @@ -3364,8 +3306,7 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in, tag, attrib); } else if (self->handle_start) { - if (attrib == Py_None) { - Py_DECREF(attrib); + if (attrib == NULL) { attrib = PyDict_New(); if (!attrib) { Py_DECREF(tag); @@ -3378,7 +3319,7 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in, res = NULL; Py_DECREF(tag); - Py_DECREF(attrib); + Py_XDECREF(attrib); Py_XDECREF(res); } @@ -3401,7 +3342,7 @@ expat_data_handler(XMLParserObject* self, const XML_Char* data_in, /* shortcut */ res = treebuilder_handle_data((TreeBuilderObject*) self->target, data); else if (self->handle_data) - res = _PyObject_FastCall(self->handle_data, &data, 1); + res = PyObject_CallOneArg(self->handle_data, data); else res = NULL; @@ -3428,7 +3369,7 @@ expat_end_handler(XMLParserObject* self, const XML_Char* tag_in) else if (self->handle_end) { tag = makeuniversal(self, tag_in); if (tag) { - res = _PyObject_FastCall(self->handle_end, &tag, 1); + res = PyObject_CallOneArg(self->handle_end, tag); Py_DECREF(tag); } } @@ -3515,7 +3456,7 @@ expat_end_ns_handler(XMLParserObject* self, const XML_Char* prefix_in) if (!prefix) return; - res = _PyObject_FastCall(self->handle_end_ns, &prefix, 1); + res = PyObject_CallOneArg(self->handle_end_ns, prefix); Py_DECREF(prefix); } @@ -3547,7 +3488,7 @@ expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in) if (!comment) return; - res = _PyObject_FastCall(self->handle_comment, &comment, 1); + res = PyObject_CallOneArg(self->handle_comment, comment); Py_XDECREF(res); Py_DECREF(comment); } @@ -3938,7 +3879,7 @@ _elementtree_XMLParser_close_impl(XMLParserObject *self) } else if (self->handle_close) { Py_DECREF(res); - return _PyObject_CallNoArg(self->handle_close); + return PyObject_CallNoArgs(self->handle_close); } else { return res; @@ -4235,9 +4176,6 @@ static PyMethodDef element_methods[] = { _ELEMENTTREE_ELEMENT_ITERTEXT_METHODDEF _ELEMENTTREE_ELEMENT_ITERFIND_METHODDEF - _ELEMENTTREE_ELEMENT_GETITERATOR_METHODDEF - _ELEMENTTREE_ELEMENT_GETCHILDREN_METHODDEF - _ELEMENTTREE_ELEMENT_ITEMS_METHODDEF _ELEMENTTREE_ELEMENT_KEYS_METHODDEF @@ -4469,7 +4407,7 @@ PyInit__elementtree(void) m = PyModule_Create(&elementtreemodule); if (!m) return NULL; - st = ET_STATE(m); + st = get_elementtree_state(m); if (!(temp = PyImport_ImportModule("copy"))) return NULL; @@ -4505,16 +4443,22 @@ PyInit__elementtree(void) "xml.etree.ElementTree.ParseError", PyExc_SyntaxError, NULL ); Py_INCREF(st->parseerror_obj); - PyModule_AddObject(m, "ParseError", st->parseerror_obj); - - Py_INCREF((PyObject *)&Element_Type); - PyModule_AddObject(m, "Element", (PyObject *)&Element_Type); + if (PyModule_AddObject(m, "ParseError", st->parseerror_obj) < 0) { + Py_DECREF(st->parseerror_obj); + return NULL; + } - Py_INCREF((PyObject *)&TreeBuilder_Type); - PyModule_AddObject(m, "TreeBuilder", (PyObject *)&TreeBuilder_Type); + PyTypeObject *types[] = { + &Element_Type, + &TreeBuilder_Type, + &XMLParser_Type + }; - Py_INCREF((PyObject *)&XMLParser_Type); - PyModule_AddObject(m, "XMLParser", (PyObject *)&XMLParser_Type); + for (size_t i = 0; i < Py_ARRAY_LENGTH(types); i++) { + if (PyModule_AddType(m, types[i]) < 0) { + return NULL; + } + } return m; } diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index a101363bf02a07dedfa3184a52fc42c46bbb660c..42764a181d26ba07ba40d14bb1fa6b3b328a30d6 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -1,8 +1,8 @@ #include "Python.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" +#include "pycore_object.h" // _PyObject_GC_TRACK +#include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_tupleobject.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef /* _functools module written and maintained by Hye-Shik Chang @@ -18,13 +18,15 @@ typedef struct { PyObject *fn; PyObject *args; PyObject *kw; - PyObject *dict; + PyObject *dict; /* __dict__ */ PyObject *weakreflist; /* List of weak references */ - int use_fastcall; + vectorcallfunc vectorcall; } partialobject; static PyTypeObject partial_type; +static void partial_setvectorcall(partialobject *pto); + static PyObject * partial_new(PyTypeObject *type, PyObject *args, PyObject *kw) { @@ -39,7 +41,7 @@ partial_new(PyTypeObject *type, PyObject *args, PyObject *kw) pargs = pkw = NULL; func = PyTuple_GET_ITEM(args, 0); - if (Py_TYPE(func) == &partial_type && type == &partial_type) { + if (Py_IS_TYPE(func, &partial_type) && type == &partial_type) { partialobject *part = (partialobject *)func; if (part->dict == NULL) { pargs = part->args; @@ -107,8 +109,7 @@ partial_new(PyTypeObject *type, PyObject *args, PyObject *kw) return NULL; } - pto->use_fastcall = (_PyVectorcall_Function(func) != NULL); - + partial_setvectorcall(pto); return (PyObject *)pto; } @@ -126,77 +127,114 @@ partial_dealloc(partialobject *pto) Py_TYPE(pto)->tp_free(pto); } + +/* Merging keyword arguments using the vectorcall convention is messy, so + * if we would need to do that, we stop using vectorcall and fall back + * to using partial_call() instead. */ +_Py_NO_INLINE static PyObject * +partial_vectorcall_fallback(PyThreadState *tstate, partialobject *pto, + PyObject *const *args, size_t nargsf, + PyObject *kwnames) +{ + pto->vectorcall = NULL; + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + return _PyObject_MakeTpCall(tstate, (PyObject *)pto, + args, nargs, kwnames); +} + static PyObject * -partial_fastcall(partialobject *pto, PyObject **args, Py_ssize_t nargs, - PyObject *kwargs) +partial_vectorcall(partialobject *pto, PyObject *const *args, + size_t nargsf, PyObject *kwnames) { - PyObject *small_stack[_PY_FASTCALL_SMALL_STACK]; - PyObject *ret; - PyObject **stack, **stack_buf = NULL; - Py_ssize_t nargs2, pto_nargs; + PyThreadState *tstate = _PyThreadState_GET(); - pto_nargs = PyTuple_GET_SIZE(pto->args); - nargs2 = pto_nargs + nargs; + /* pto->kw is mutable, so need to check every time */ + if (PyDict_GET_SIZE(pto->kw)) { + return partial_vectorcall_fallback(tstate, pto, args, nargsf, kwnames); + } - if (pto_nargs == 0) { - stack = args; + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + Py_ssize_t nargs_total = nargs; + if (kwnames != NULL) { + nargs_total += PyTuple_GET_SIZE(kwnames); } - else if (nargs == 0) { - stack = _PyTuple_ITEMS(pto->args); + + PyObject **pto_args = _PyTuple_ITEMS(pto->args); + Py_ssize_t pto_nargs = PyTuple_GET_SIZE(pto->args); + + /* Fast path if we're called without arguments */ + if (nargs_total == 0) { + return _PyObject_VectorcallTstate(tstate, pto->fn, + pto_args, pto_nargs, NULL); + } + + /* Fast path using PY_VECTORCALL_ARGUMENTS_OFFSET to prepend a single + * positional argument */ + if (pto_nargs == 1 && (nargsf & PY_VECTORCALL_ARGUMENTS_OFFSET)) { + PyObject **newargs = (PyObject **)args - 1; + PyObject *tmp = newargs[0]; + newargs[0] = pto_args[0]; + PyObject *ret = _PyObject_VectorcallTstate(tstate, pto->fn, + newargs, nargs + 1, kwnames); + newargs[0] = tmp; + return ret; + } + + Py_ssize_t newnargs_total = pto_nargs + nargs_total; + + PyObject *small_stack[_PY_FASTCALL_SMALL_STACK]; + PyObject *ret; + PyObject **stack; + + if (newnargs_total <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) { + stack = small_stack; } else { - if (nargs2 <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) { - stack = small_stack; - } - else { - stack_buf = PyMem_Malloc(nargs2 * sizeof(PyObject *)); - if (stack_buf == NULL) { - PyErr_NoMemory(); - return NULL; - } - stack = stack_buf; + stack = PyMem_Malloc(newnargs_total * sizeof(PyObject *)); + if (stack == NULL) { + PyErr_NoMemory(); + return NULL; } - - /* use borrowed references */ - memcpy(stack, - _PyTuple_ITEMS(pto->args), - pto_nargs * sizeof(PyObject*)); - memcpy(&stack[pto_nargs], - args, - nargs * sizeof(PyObject*)); } - ret = _PyObject_FastCallDict(pto->fn, stack, nargs2, kwargs); - PyMem_Free(stack_buf); + /* Copy to new stack, using borrowed references */ + memcpy(stack, pto_args, pto_nargs * sizeof(PyObject*)); + memcpy(stack + pto_nargs, args, nargs_total * sizeof(PyObject*)); + + ret = _PyObject_VectorcallTstate(tstate, pto->fn, + stack, pto_nargs + nargs, kwnames); + if (stack != small_stack) { + PyMem_Free(stack); + } return ret; } -static PyObject * -partial_call_impl(partialobject *pto, PyObject *args, PyObject *kwargs) +/* Set pto->vectorcall depending on the parameters of the partial object */ +static void +partial_setvectorcall(partialobject *pto) { - PyObject *ret, *args2; - - /* Note: tupleconcat() is optimized for empty tuples */ - args2 = PySequence_Concat(pto->args, args); - if (args2 == NULL) { - return NULL; + if (PyVectorcall_Function(pto->fn) == NULL) { + /* Don't use vectorcall if the underlying function doesn't support it */ + pto->vectorcall = NULL; + } + /* We could have a special case if there are no arguments, + * but that is unlikely (why use partial without arguments?), + * so we don't optimize that */ + else { + pto->vectorcall = (vectorcallfunc)partial_vectorcall; } - assert(PyTuple_Check(args2)); - - ret = PyObject_Call(pto->fn, args2, kwargs); - Py_DECREF(args2); - return ret; } + static PyObject * partial_call(partialobject *pto, PyObject *args, PyObject *kwargs) { - PyObject *kwargs2, *res; - - assert (PyCallable_Check(pto->fn)); - assert (PyTuple_Check(pto->args)); - assert (PyDict_Check(pto->kw)); + assert(PyCallable_Check(pto->fn)); + assert(PyTuple_Check(pto->args)); + assert(PyDict_Check(pto->kw)); + /* Merge keywords */ + PyObject *kwargs2; if (PyDict_GET_SIZE(pto->kw) == 0) { /* kwargs can be NULL */ kwargs2 = kwargs; @@ -219,16 +257,16 @@ partial_call(partialobject *pto, PyObject *args, PyObject *kwargs) } } - - if (pto->use_fastcall) { - res = partial_fastcall(pto, - _PyTuple_ITEMS(args), - PyTuple_GET_SIZE(args), - kwargs2); - } - else { - res = partial_call_impl(pto, args, kwargs2); + /* Merge positional arguments */ + /* Note: tupleconcat() is optimized for empty tuples */ + PyObject *args2 = PySequence_Concat(pto->args, args); + if (args2 == NULL) { + Py_XDECREF(kwargs2); + return NULL; } + + PyObject *res = PyObject_Call(pto->fn, args2, kwargs2); + Py_DECREF(args2); Py_XDECREF(kwargs2); return res; } @@ -365,17 +403,19 @@ partial_setstate(partialobject *pto, PyObject *state) Py_INCREF(dict); Py_INCREF(fn); - pto->use_fastcall = (_PyVectorcall_Function(fn) != NULL); Py_SETREF(pto->fn, fn); Py_SETREF(pto->args, fnargs); Py_SETREF(pto->kw, kw); Py_XSETREF(pto->dict, dict); + partial_setvectorcall(pto); Py_RETURN_NONE; } static PyMethodDef partial_methods[] = { {"__reduce__", (PyCFunction)partial_reduce, METH_NOARGS}, {"__setstate__", (PyCFunction)partial_setstate, METH_O}, + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* sentinel */ }; @@ -386,7 +426,7 @@ static PyTypeObject partial_type = { 0, /* tp_itemsize */ /* methods */ (destructor)partial_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ + offsetof(partialobject, vectorcall),/* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ @@ -401,7 +441,8 @@ static PyTypeObject partial_type = { PyObject_GenericSetAttr, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | - Py_TPFLAGS_BASETYPE, /* tp_flags */ + Py_TPFLAGS_BASETYPE | + Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ partial_doc, /* tp_doc */ (traverseproc)partial_traverse, /* tp_traverse */ 0, /* tp_clear */ @@ -534,7 +575,7 @@ keyobject_richcompare(PyObject *ko, PyObject *other, int op) PyObject *answer; PyObject* stack[2]; - if (Py_TYPE(other) != &keyobject_type){ + if (!Py_IS_TYPE(other, &keyobject_type)) { PyErr_Format(PyExc_TypeError, "other argument must be K instance"); return NULL; } @@ -610,7 +651,7 @@ functools_reduce(PyObject *self, PyObject *args) for (;;) { PyObject *op2; - if (args->ob_refcnt > 1) { + if (Py_REFCNT(args) > 1) { Py_DECREF(args); if ((args = PyTuple_New(2)) == NULL) goto Fail; @@ -627,12 +668,17 @@ functools_reduce(PyObject *self, PyObject *args) result = op2; else { /* Update the args tuple in-place */ - assert(args->ob_refcnt == 1); + assert(Py_REFCNT(args) == 1); Py_XSETREF(_PyTuple_ITEMS(args)[0], result); Py_XSETREF(_PyTuple_ITEMS(args)[1], op2); if ((result = PyObject_Call(func, args, NULL)) == NULL) { goto Fail; } + // bpo-42536: The GC may have untracked this args tuple. Since we're + // recycling it, make sure it's tracked again: + if (!_PyObject_GC_IS_TRACKED(args)) { + _PyObject_GC_TRACK(args); + } } } @@ -743,6 +789,7 @@ typedef struct lru_cache_object { Py_ssize_t misses; PyObject *cache_info_type; PyObject *dict; + PyObject *weakreflist; } lru_cache_object; static PyTypeObject lru_cache_type; @@ -1155,6 +1202,8 @@ lru_cache_new(PyTypeObject *type, PyObject *args, PyObject *kw) obj->maxsize = maxsize; Py_INCREF(cache_info_type); obj->cache_info_type = cache_info_type; + obj->dict = NULL; + obj->weakreflist = NULL; return (PyObject *)obj; } @@ -1186,6 +1235,8 @@ lru_cache_dealloc(lru_cache_object *obj) lru_list_elem *list; /* bpo-31095: UnTrack is needed before calling any callbacks */ PyObject_GC_UnTrack(obj); + if (obj->weakreflist != NULL) + PyObject_ClearWeakRefs((PyObject*)obj); list = lru_cache_unlink_list(obj); Py_XDECREF(obj->cache); @@ -1343,7 +1394,8 @@ static PyTypeObject lru_cache_type = { (traverseproc)lru_cache_tp_traverse,/* tp_traverse */ (inquiry)lru_cache_tp_clear, /* tp_clear */ 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ + offsetof(lru_cache_object, weakreflist), + /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ lru_cache_methods, /* tp_methods */ @@ -1361,10 +1413,10 @@ static PyTypeObject lru_cache_type = { /* module level code ********************************************************/ -PyDoc_STRVAR(module_doc, +PyDoc_STRVAR(_functools_doc, "Tools that operate on functions."); -static PyMethodDef module_methods[] = { +static PyMethodDef _functools_methods[] = { {"reduce", functools_reduce, METH_VARARGS, functools_reduce_doc}, {"cmp_to_key", (PyCFunction)(void(*)(void))functools_cmp_to_key, METH_VARARGS | METH_KEYWORDS, functools_cmp_to_key_doc}, @@ -1372,53 +1424,56 @@ static PyMethodDef module_methods[] = { }; static void -module_free(void *m) +_functools_free(void *m) { - Py_CLEAR(kwd_mark); + // FIXME: Do not clear kwd_mark to avoid NULL pointer dereferencing if we have + // other modules instances that could use it. Will fix when PEP-573 land + // and we could move kwd_mark to a per-module state. + // Py_CLEAR(kwd_mark); } -static struct PyModuleDef _functoolsmodule = { - PyModuleDef_HEAD_INIT, - "_functools", - module_doc, - -1, - module_methods, - NULL, - NULL, - NULL, - module_free, -}; - -PyMODINIT_FUNC -PyInit__functools(void) +static int +_functools_exec(PyObject *module) { - int i; - PyObject *m; - const char *name; PyTypeObject *typelist[] = { &partial_type, - &lru_cache_type, - NULL + &lru_cache_type }; - m = PyModule_Create(&_functoolsmodule); - if (m == NULL) - return NULL; - - kwd_mark = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type); if (!kwd_mark) { - Py_DECREF(m); - return NULL; + kwd_mark = _PyObject_CallNoArg((PyObject *)&PyBaseObject_Type); + if (!kwd_mark) { + return -1; + } } - for (i=0 ; typelist[i] != NULL ; i++) { - if (PyType_Ready(typelist[i]) < 0) { - Py_DECREF(m); - return NULL; + for (size_t i = 0; i < Py_ARRAY_LENGTH(typelist); i++) { + if (PyModule_AddType(module, typelist[i]) < 0) { + return -1; } - name = _PyType_Name(typelist[i]); - Py_INCREF(typelist[i]); - PyModule_AddObject(m, name, (PyObject *)typelist[i]); } - return m; + return 0; +} + +static struct PyModuleDef_Slot _functools_slots[] = { + {Py_mod_exec, _functools_exec}, + {0, NULL} +}; + +static struct PyModuleDef _functools_module = { + PyModuleDef_HEAD_INIT, + "_functools", + _functools_doc, + 0, + _functools_methods, + _functools_slots, + NULL, + NULL, + _functools_free, +}; + +PyMODINIT_FUNC +PyInit__functools(void) +{ + return PyModuleDef_Init(&_functools_module); } diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c index 77e7887525069a3b407b21331f5300aefda79303..dd4c6b16f745cf01ef1c3ffbb4912e07a1eaa22d 100644 --- a/Modules/_gdbmmodule.c +++ b/Modules/_gdbmmodule.c @@ -36,7 +36,7 @@ values() methods are not supported."); typedef struct { PyObject_HEAD - int di_size; /* -1 means recompute */ + Py_ssize_t di_size; /* -1 means recompute */ GDBM_FILE di_dbm; } dbmobject; @@ -44,7 +44,7 @@ static PyTypeObject Dbmtype; #include "clinic/_gdbmmodule.c.h" -#define is_dbmobject(v) (Py_TYPE(v) == &Dbmtype) +#define is_dbmobject(v) Py_IS_TYPE(v, &Dbmtype) #define check_dbmobject_open(v) if ((v)->di_dbm == NULL) \ { PyErr_SetString(DbmError, "GDBM object has already been closed"); \ return NULL; } @@ -102,19 +102,39 @@ dbm_length(dbmobject *dp) return -1; } if (dp->di_size < 0) { +#if GDBM_VERSION_MAJOR >= 1 && GDBM_VERSION_MINOR >= 11 + errno = 0; + gdbm_count_t count; + if (gdbm_count(dp->di_dbm, &count) == -1) { + if (errno != 0) { + PyErr_SetFromErrno(DbmError); + } + else { + PyErr_SetString(DbmError, gdbm_strerror(gdbm_errno)); + } + return -1; + } + if (count > PY_SSIZE_T_MAX) { + PyErr_SetString(PyExc_OverflowError, "count exceeds PY_SSIZE_T_MAX"); + return -1; + } + dp->di_size = count; +#else datum key,okey; - int size; okey.dsize=0; okey.dptr=NULL; - size = 0; - for (key=gdbm_firstkey(dp->di_dbm); key.dptr; + Py_ssize_t size = 0; + for (key = gdbm_firstkey(dp->di_dbm); key.dptr; key = gdbm_nextkey(dp->di_dbm,okey)) { size++; - if(okey.dsize) free(okey.dptr); + if (okey.dsize) { + free(okey.dptr); + } okey=key; } dp->di_size = size; +#endif } return dp->di_size; } @@ -349,7 +369,7 @@ dbm_contains(PyObject *self, PyObject *arg) else if (!PyBytes_Check(arg)) { PyErr_Format(PyExc_TypeError, "gdbm key must be bytes or string, not %.100s", - arg->ob_type->tp_name); + Py_TYPE(arg)->tp_name); return -1; } else { @@ -497,7 +517,7 @@ static PyObject * dbm__exit__(PyObject *self, PyObject *args) { _Py_IDENTIFIER(close); - return _PyObject_CallMethodId(self, &PyId_close, NULL); + return _PyObject_CallMethodIdNoArgs(self, &PyId_close); } static PyMethodDef dbm_methods[] = { diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c index edadbcb3933c13917a2f5d0143c36aeffb25df20..adc865377325024a9aa61ee39e9cdad8de479c72 100644 --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -14,7 +14,6 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" #include "hashlib.h" #include "pystrhex.h" @@ -22,10 +21,13 @@ /* EVP is the preferred interface to hashing in OpenSSL */ #include #include +#include /* We use the object interface to discover what hashes OpenSSL supports. */ #include #include "openssl/err.h" +#include // FIPS_mode() + #ifndef OPENSSL_THREADS # error "OPENSSL_THREADS is not defined, Python requires thread-safe OpenSSL" #endif @@ -34,6 +36,32 @@ /* OpenSSL < 1.1.0 */ #define EVP_MD_CTX_new EVP_MD_CTX_create #define EVP_MD_CTX_free EVP_MD_CTX_destroy + +HMAC_CTX * +HMAC_CTX_new(void) +{ + HMAC_CTX *ctx = OPENSSL_malloc(sizeof(HMAC_CTX)); + if (ctx != NULL) { + memset(ctx, 0, sizeof(HMAC_CTX)); + HMAC_CTX_init(ctx); + } + return ctx; +} + +void +HMAC_CTX_free(HMAC_CTX *ctx) +{ + if (ctx != NULL) { + HMAC_CTX_cleanup(ctx); + OPENSSL_free(ctx); + } +} + +const EVP_MD * +HMAC_CTX_get_md(const HMAC_CTX *ctx) +{ + return ctx->md; +} #endif #define MUNCH_SIZE INT_MAX @@ -50,21 +78,44 @@ #define PY_OPENSSL_HAS_BLAKE2 1 #endif +static PyModuleDef _hashlibmodule; + +typedef struct { + PyTypeObject *EVPtype; + PyTypeObject *HMACtype; +#ifdef PY_OPENSSL_HAS_SHAKE + PyTypeObject *EVPXOFtype; +#endif +} _hashlibstate; + +static inline _hashlibstate* +get_hashlib_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_hashlibstate *)state; +} + typedef struct { PyObject_HEAD EVP_MD_CTX *ctx; /* OpenSSL message digest context */ PyThread_type_lock lock; /* OpenSSL context lock */ } EVPobject; - -static PyTypeObject EVPtype; +typedef struct { + PyObject_HEAD + HMAC_CTX *ctx; /* OpenSSL hmac context */ + PyThread_type_lock lock; /* HMAC context lock */ +} HMACobject; #include "clinic/_hashopenssl.c.h" /*[clinic input] module _hashlib -class _hashlib.HASH "EVPobject *" "&EVPtype" +class _hashlib.HASH "EVPobject *" "((_hashlibstate *)PyModule_GetState(module))->EVPtype" +class _hashlib.HASHXOF "EVPobject *" "((_hashlibstate *)PyModule_GetState(module))->EVPXOFtype" +class _hashlib.HMAC "HMACobject *" "((_hashlibstate *)PyModule_GetState(module))->HMACtype" [clinic start generated code]*/ -/*[clinic end generated code: output=da39a3ee5e6b4b0d input=a881a5092eecad28]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=7df1bcf6f75cb8ef]*/ /* LCOV_EXCL_START */ @@ -98,6 +149,15 @@ _setException(PyObject *exc) } /* LCOV_EXCL_STOP */ +/* {Py_tp_new, NULL} doesn't block __new__ */ +static PyObject * +_disabled_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) +{ + PyErr_Format(PyExc_TypeError, + "cannot create '%.100s' instances", _PyType_Name(type)); + return NULL; +} + static PyObject* py_digest_name(const EVP_MD *md) { @@ -233,9 +293,9 @@ py_digest_by_name(const char *name) } static EVPobject * -newEVPobject(void) +newEVPobject(PyTypeObject *type) { - EVPobject *retval = (EVPobject *)PyObject_New(EVPobject, &EVPtype); + EVPobject *retval = (EVPobject *)PyObject_New(EVPobject, type); if (retval == NULL) { return NULL; } @@ -277,10 +337,12 @@ EVP_hash(EVPobject *self, const void *vp, Py_ssize_t len) static void EVP_dealloc(EVPobject *self) { + PyTypeObject *tp = Py_TYPE(self); if (self->lock != NULL) PyThread_free_lock(self->lock); EVP_MD_CTX_free(self->ctx); PyObject_Del(self); + Py_DECREF(tp); } static int @@ -307,7 +369,7 @@ EVP_copy_impl(EVPobject *self) { EVPobject *newobj; - if ( (newobj = newEVPobject())==NULL) + if ((newobj = newEVPobject(Py_TYPE(self))) == NULL) return NULL; if (!locked_EVP_MD_CTX_copy(newobj->ctx, self)) { @@ -482,7 +544,8 @@ EVP_repr(EVPobject *self) if (!name_obj) { return NULL; } - repr = PyUnicode_FromFormat("<%U HASH object @ %p>", name_obj, self); + repr = PyUnicode_FromFormat("<%U %s object @ %p>", + name_obj, Py_TYPE(self)->tp_name, self); Py_DECREF(name_obj); return repr; } @@ -505,61 +568,206 @@ PyDoc_STRVAR(hashtype_doc, "name -- the hash algorithm being used by this object\n" "digest_size -- number of bytes in this hashes output"); -static PyTypeObject EVPtype = { - PyVarObject_HEAD_INIT(NULL, 0) +static PyType_Slot EVPtype_slots[] = { + {Py_tp_dealloc, EVP_dealloc}, + {Py_tp_repr, EVP_repr}, + {Py_tp_doc, (char *)hashtype_doc}, + {Py_tp_methods, EVP_methods}, + {Py_tp_getset, EVP_getseters}, + {Py_tp_new, _disabled_new}, + {0, 0}, +}; + +static PyType_Spec EVPtype_spec = { "_hashlib.HASH", /*tp_name*/ sizeof(EVPobject), /*tp_basicsize*/ 0, /*tp_itemsize*/ - /* methods */ - (destructor)EVP_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - (reprfunc)EVP_repr, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - hashtype_doc, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - EVP_methods, /* tp_methods */ - NULL, /* tp_members */ - EVP_getseters, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + EVPtype_slots +}; + +#ifdef PY_OPENSSL_HAS_SHAKE + +/*[clinic input] +_hashlib.HASHXOF.digest as EVPXOF_digest + + length: Py_ssize_t + +Return the digest value as a bytes object. +[clinic start generated code]*/ + +static PyObject * +EVPXOF_digest_impl(EVPobject *self, Py_ssize_t length) +/*[clinic end generated code: output=ef9320c23280efad input=816a6537cea3d1db]*/ +{ + EVP_MD_CTX *temp_ctx; + PyObject *retval = PyBytes_FromStringAndSize(NULL, length); + + if (retval == NULL) { + return NULL; + } + + temp_ctx = EVP_MD_CTX_new(); + if (temp_ctx == NULL) { + Py_DECREF(retval); + PyErr_NoMemory(); + return NULL; + } + + if (!locked_EVP_MD_CTX_copy(temp_ctx, self)) { + Py_DECREF(retval); + EVP_MD_CTX_free(temp_ctx); + return _setException(PyExc_ValueError); + } + if (!EVP_DigestFinalXOF(temp_ctx, + (unsigned char*)PyBytes_AS_STRING(retval), + length)) { + Py_DECREF(retval); + EVP_MD_CTX_free(temp_ctx); + _setException(PyExc_ValueError); + return NULL; + } + + EVP_MD_CTX_free(temp_ctx); + return retval; +} + +/*[clinic input] +_hashlib.HASHXOF.hexdigest as EVPXOF_hexdigest + + length: Py_ssize_t + +Return the digest value as a string of hexadecimal digits. +[clinic start generated code]*/ + +static PyObject * +EVPXOF_hexdigest_impl(EVPobject *self, Py_ssize_t length) +/*[clinic end generated code: output=eb3e6ee7788bf5b2 input=5f9d6a8f269e34df]*/ +{ + unsigned char *digest; + EVP_MD_CTX *temp_ctx; + PyObject *retval; + + digest = (unsigned char*)PyMem_Malloc(length); + if (digest == NULL) { + PyErr_NoMemory(); + return NULL; + } + + temp_ctx = EVP_MD_CTX_new(); + if (temp_ctx == NULL) { + PyMem_Free(digest); + PyErr_NoMemory(); + return NULL; + } + + /* Get the raw (binary) digest value */ + if (!locked_EVP_MD_CTX_copy(temp_ctx, self)) { + PyMem_Free(digest); + EVP_MD_CTX_free(temp_ctx); + return _setException(PyExc_ValueError); + } + if (!EVP_DigestFinalXOF(temp_ctx, digest, length)) { + PyMem_Free(digest); + EVP_MD_CTX_free(temp_ctx); + _setException(PyExc_ValueError); + return NULL; + } + + EVP_MD_CTX_free(temp_ctx); + + retval = _Py_strhex((const char *)digest, length); + PyMem_Free(digest); + return retval; +} + +static PyMethodDef EVPXOF_methods[] = { + EVPXOF_DIGEST_METHODDEF + EVPXOF_HEXDIGEST_METHODDEF + {NULL, NULL} /* sentinel */ +}; + + +static PyObject * +EVPXOF_get_digest_size(EVPobject *self, void *closure) +{ + return PyLong_FromLong(0); +} + +static PyGetSetDef EVPXOF_getseters[] = { + {"digest_size", + (getter)EVPXOF_get_digest_size, NULL, + NULL, + NULL}, + {NULL} /* Sentinel */ +}; + +PyDoc_STRVAR(hashxoftype_doc, +"HASHXOF(name, string=b\'\')\n" +"--\n" +"\n" +"A hash is an object used to calculate a checksum of a string of information.\n" +"\n" +"Methods:\n" +"\n" +"update() -- updates the current digest with an additional string\n" +"digest(length) -- return the current digest value\n" +"hexdigest(length) -- return the current digest as a string of hexadecimal digits\n" +"copy() -- return a copy of the current hash object\n" +"\n" +"Attributes:\n" +"\n" +"name -- the hash algorithm being used by this object\n" +"digest_size -- number of bytes in this hashes output"); + +static PyType_Slot EVPXOFtype_slots[] = { + {Py_tp_doc, (char *)hashxoftype_doc}, + {Py_tp_methods, EVPXOF_methods}, + {Py_tp_getset, EVPXOF_getseters}, + {Py_tp_new, _disabled_new}, + {0, 0}, +}; + +static PyType_Spec EVPXOFtype_spec = { + "_hashlib.HASHXOF", /*tp_name*/ + sizeof(EVPobject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + EVPXOFtype_slots }; -\ + +#endif + static PyObject * -EVPnew(const EVP_MD *digest, - const unsigned char *cp, Py_ssize_t len) +EVPnew(PyObject *module, const EVP_MD *digest, + const unsigned char *cp, Py_ssize_t len, int usedforsecurity) { int result = 0; EVPobject *self; + PyTypeObject *type = get_hashlib_state(module)->EVPtype; if (!digest) { PyErr_SetString(PyExc_ValueError, "unsupported hash type"); return NULL; } - if ((self = newEVPobject()) == NULL) +#ifdef PY_OPENSSL_HAS_SHAKE + if ((EVP_MD_flags(digest) & EVP_MD_FLAG_XOF) == EVP_MD_FLAG_XOF) { + type = get_hashlib_state(module)->EVPXOFtype; + } +#endif + + if ((self = newEVPobject(type)) == NULL) return NULL; + if (!usedforsecurity) { +#ifdef EVP_MD_CTX_FLAG_NON_FIPS_ALLOW + EVP_MD_CTX_set_flags(self->ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW); +#endif + } + + if (!EVP_DigestInit_ex(self->ctx, digest, NULL)) { _setException(PyExc_ValueError); Py_DECREF(self); @@ -591,6 +799,8 @@ _hashlib.new as EVP_new name as name_obj: object string as data_obj: object(c_default="NULL") = b'' + * + usedforsecurity: bool = True Return a new hash object using the named algorithm. @@ -601,13 +811,14 @@ The MD5 and SHA1 algorithms are always supported. [clinic start generated code]*/ static PyObject * -EVP_new_impl(PyObject *module, PyObject *name_obj, PyObject *data_obj) -/*[clinic end generated code: output=9e7cf664e04b0226 input=7eb79bf30058bd02]*/ +EVP_new_impl(PyObject *module, PyObject *name_obj, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=ddd5053f92dffe90 input=c24554d0337be1b0]*/ { Py_buffer view = { 0 }; PyObject *ret_obj; char *name; - const EVP_MD *digest; + const EVP_MD *digest = NULL; if (!PyArg_Parse(name_obj, "s", &name)) { PyErr_SetString(PyExc_TypeError, "name must be a string"); @@ -619,7 +830,9 @@ EVP_new_impl(PyObject *module, PyObject *name_obj, PyObject *data_obj) digest = py_digest_by_name(name); - ret_obj = EVPnew(digest, (unsigned char*)view.buf, view.len); + ret_obj = EVPnew(module, digest, + (unsigned char*)view.buf, view.len, + usedforsecurity); if (data_obj) PyBuffer_Release(&view); @@ -627,7 +840,8 @@ EVP_new_impl(PyObject *module, PyObject *name_obj, PyObject *data_obj) } static PyObject* -EVP_fast_new(PyObject *module, PyObject *data_obj, const EVP_MD *digest) +EVP_fast_new(PyObject *module, PyObject *data_obj, const EVP_MD *digest, + int usedforsecurity) { Py_buffer view = { 0 }; PyObject *ret_obj; @@ -635,7 +849,9 @@ EVP_fast_new(PyObject *module, PyObject *data_obj, const EVP_MD *digest) if (data_obj) GET_BUFFER_VIEW_OR_ERROUT(data_obj, &view); - ret_obj = EVPnew(digest, (unsigned char*)view.buf, view.len); + ret_obj = EVPnew(module, digest, + (unsigned char*)view.buf, view.len, + usedforsecurity); if (data_obj) PyBuffer_Release(&view); @@ -647,16 +863,19 @@ EVP_fast_new(PyObject *module, PyObject *data_obj, const EVP_MD *digest) _hashlib.openssl_md5 string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True Returns a md5 hash object; optionally initialized with a string [clinic start generated code]*/ static PyObject * -_hashlib_openssl_md5_impl(PyObject *module, PyObject *data_obj) -/*[clinic end generated code: output=6caae75b73e22c3f input=52010d3869e1b1a7]*/ +_hashlib_openssl_md5_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=87b0186440a44f8c input=990e36d5e689b16e]*/ { - return EVP_fast_new(module, data_obj, EVP_md5()); + return EVP_fast_new(module, data_obj, EVP_md5(), usedforsecurity); } @@ -664,16 +883,19 @@ _hashlib_openssl_md5_impl(PyObject *module, PyObject *data_obj) _hashlib.openssl_sha1 string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True Returns a sha1 hash object; optionally initialized with a string [clinic start generated code]*/ static PyObject * -_hashlib_openssl_sha1_impl(PyObject *module, PyObject *data_obj) -/*[clinic end generated code: output=07606d8f75153e61 input=16807d30e4aa8ae9]*/ +_hashlib_openssl_sha1_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=6813024cf690670d input=948f2f4b6deabc10]*/ { - return EVP_fast_new(module, data_obj, EVP_sha1()); + return EVP_fast_new(module, data_obj, EVP_sha1(), usedforsecurity); } @@ -681,16 +903,19 @@ _hashlib_openssl_sha1_impl(PyObject *module, PyObject *data_obj) _hashlib.openssl_sha224 string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True Returns a sha224 hash object; optionally initialized with a string [clinic start generated code]*/ static PyObject * -_hashlib_openssl_sha224_impl(PyObject *module, PyObject *data_obj) -/*[clinic end generated code: output=55e848761bcef0c9 input=5dbc2f1d84eb459b]*/ +_hashlib_openssl_sha224_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=a2dfe7cc4eb14ebb input=f9272821fadca505]*/ { - return EVP_fast_new(module, data_obj, EVP_sha224()); + return EVP_fast_new(module, data_obj, EVP_sha224(), usedforsecurity); } @@ -698,16 +923,19 @@ _hashlib_openssl_sha224_impl(PyObject *module, PyObject *data_obj) _hashlib.openssl_sha256 string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True Returns a sha256 hash object; optionally initialized with a string [clinic start generated code]*/ static PyObject * -_hashlib_openssl_sha256_impl(PyObject *module, PyObject *data_obj) -/*[clinic end generated code: output=05851d7cce34ac65 input=a68a5d21cda5a80f]*/ +_hashlib_openssl_sha256_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=1f874a34870f0a68 input=549fad9d2930d4c5]*/ { - return EVP_fast_new(module, data_obj, EVP_sha256()); + return EVP_fast_new(module, data_obj, EVP_sha256(), usedforsecurity); } @@ -715,16 +943,19 @@ _hashlib_openssl_sha256_impl(PyObject *module, PyObject *data_obj) _hashlib.openssl_sha384 string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True Returns a sha384 hash object; optionally initialized with a string [clinic start generated code]*/ static PyObject * -_hashlib_openssl_sha384_impl(PyObject *module, PyObject *data_obj) -/*[clinic end generated code: output=5101a4704a932c2f input=6bdfa006622b64ea]*/ +_hashlib_openssl_sha384_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=58529eff9ca457b2 input=48601a6e3bf14ad7]*/ { - return EVP_fast_new(module, data_obj, EVP_sha384()); + return EVP_fast_new(module, data_obj, EVP_sha384(), usedforsecurity); } @@ -732,18 +963,140 @@ _hashlib_openssl_sha384_impl(PyObject *module, PyObject *data_obj) _hashlib.openssl_sha512 string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True Returns a sha512 hash object; optionally initialized with a string [clinic start generated code]*/ static PyObject * -_hashlib_openssl_sha512_impl(PyObject *module, PyObject *data_obj) -/*[clinic end generated code: output=20c8e63ee560a5cb input=ece50182ad4b76a6]*/ +_hashlib_openssl_sha512_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=2c744c9e4a40d5f6 input=c5c46a2a817aa98f]*/ +{ + return EVP_fast_new(module, data_obj, EVP_sha512(), usedforsecurity); +} + + +#ifdef PY_OPENSSL_HAS_SHA3 + +/*[clinic input] +_hashlib.openssl_sha3_224 + + string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True + +Returns a sha3-224 hash object; optionally initialized with a string + +[clinic start generated code]*/ + +static PyObject * +_hashlib_openssl_sha3_224_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=144641c1d144b974 input=e3a01b2888916157]*/ +{ + return EVP_fast_new(module, data_obj, EVP_sha3_224(), usedforsecurity); +} + +/*[clinic input] +_hashlib.openssl_sha3_256 + + string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True + +Returns a sha3-256 hash object; optionally initialized with a string + +[clinic start generated code]*/ + +static PyObject * +_hashlib_openssl_sha3_256_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=c61f1ab772d06668 input=e2908126c1b6deed]*/ +{ + return EVP_fast_new(module, data_obj, EVP_sha3_256(), usedforsecurity); +} + +/*[clinic input] +_hashlib.openssl_sha3_384 + + string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True + +Returns a sha3-384 hash object; optionally initialized with a string + +[clinic start generated code]*/ + +static PyObject * +_hashlib_openssl_sha3_384_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=f68e4846858cf0ee input=ec0edf5c792f8252]*/ +{ + return EVP_fast_new(module, data_obj, EVP_sha3_384(), usedforsecurity); +} + +/*[clinic input] +_hashlib.openssl_sha3_512 + + string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True + +Returns a sha3-512 hash object; optionally initialized with a string + +[clinic start generated code]*/ + +static PyObject * +_hashlib_openssl_sha3_512_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=2eede478c159354a input=64e2cc0c094d56f4]*/ +{ + return EVP_fast_new(module, data_obj, EVP_sha3_512(), usedforsecurity); +} +#endif /* PY_OPENSSL_HAS_SHA3 */ + +#ifdef PY_OPENSSL_HAS_SHAKE +/*[clinic input] +_hashlib.openssl_shake_128 + + string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True + +Returns a shake-128 variable hash object; optionally initialized with a string + +[clinic start generated code]*/ + +static PyObject * +_hashlib_openssl_shake_128_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=bc49cdd8ada1fa97 input=6c9d67440eb33ec8]*/ { - return EVP_fast_new(module, data_obj, EVP_sha512()); + return EVP_fast_new(module, data_obj, EVP_shake128(), usedforsecurity); } +/*[clinic input] +_hashlib.openssl_shake_256 + + string as data_obj: object(py_default="b''") = NULL + * + usedforsecurity: bool = True + +Returns a shake-256 variable hash object; optionally initialized with a string + +[clinic start generated code]*/ + +static PyObject * +_hashlib_openssl_shake_256_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity) +/*[clinic end generated code: output=358d213be8852df7 input=479cbe9fefd4a9f8]*/ +{ + return EVP_fast_new(module, data_obj, EVP_shake256(), usedforsecurity); +} +#endif /* PY_OPENSSL_HAS_SHAKE */ /*[clinic input] _hashlib.pbkdf2_hmac as pbkdf2_hmac @@ -769,7 +1122,7 @@ pbkdf2_hmac_impl(PyObject *module, const char *hash_name, int retval; const EVP_MD *digest; - digest = EVP_get_digestbyname(hash_name); + digest = py_digest_by_name(hash_name); if (digest == NULL) { PyErr_SetString(PyExc_ValueError, "unsupported hash type"); goto end; @@ -971,7 +1324,7 @@ _hashlib_scrypt_impl(PyObject *module, Py_buffer *password, Py_buffer *salt, */ /*[clinic input] -_hashlib.hmac_digest +_hashlib.hmac_digest as _hashlib_hmac_singleshot key: Py_buffer msg: Py_buffer @@ -981,16 +1334,16 @@ Single-shot HMAC. [clinic start generated code]*/ static PyObject * -_hashlib_hmac_digest_impl(PyObject *module, Py_buffer *key, Py_buffer *msg, - const char *digest) -/*[clinic end generated code: output=75630e684cdd8762 input=562d2f4249511bd3]*/ +_hashlib_hmac_singleshot_impl(PyObject *module, Py_buffer *key, + Py_buffer *msg, const char *digest) +/*[clinic end generated code: output=15658ede5ab98185 input=019dffc571909a46]*/ { unsigned char md[EVP_MAX_MD_SIZE] = {0}; unsigned int md_len = 0; unsigned char *result; const EVP_MD *evp; - evp = EVP_get_digestbyname(digest); + evp = py_digest_by_name(digest); if (evp == NULL) { PyErr_SetString(PyExc_ValueError, "unsupported hash type"); return NULL; @@ -1022,54 +1375,577 @@ _hashlib_hmac_digest_impl(PyObject *module, Py_buffer *key, Py_buffer *msg, return PyBytes_FromStringAndSize((const char*)md, md_len); } -/* State for our callback function so that it can accumulate a result. */ -typedef struct _internal_name_mapper_state { - PyObject *set; - int error; -} _InternalNameMapperState; +/* OpenSSL-based HMAC implementation + */ +static int _hmac_update(HMACobject*, PyObject*); -/* A callback function to pass to OpenSSL's OBJ_NAME_do_all(...) */ -static void -_openssl_hash_name_mapper(const EVP_MD *md, const char *from, - const char *to, void *arg) -{ - _InternalNameMapperState *state = (_InternalNameMapperState *)arg; - PyObject *py_name; +/*[clinic input] +_hashlib.hmac_new - assert(state != NULL); - if (md == NULL) - return; + key: Py_buffer + msg as msg_obj: object(c_default="NULL") = b'' + digestmod: str(c_default="NULL") = None - py_name = py_digest_name(md); - if (py_name == NULL) { - state->error = 1; - } else { - if (PySet_Add(state->set, py_name) != 0) { - state->error = 1; - } - Py_DECREF(py_name); +Return a new hmac object. +[clinic start generated code]*/ + +static PyObject * +_hashlib_hmac_new_impl(PyObject *module, Py_buffer *key, PyObject *msg_obj, + const char *digestmod) +/*[clinic end generated code: output=9a35673be0cbea1b input=a0878868eb190134]*/ +{ + PyTypeObject *type = get_hashlib_state(module)->HMACtype; + const EVP_MD *digest; + HMAC_CTX *ctx = NULL; + HMACobject *self = NULL; + int r; + + if (key->len > INT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "key is too long."); + return NULL; + } + + if ((digestmod == NULL) || !strlen(digestmod)) { + PyErr_SetString( + PyExc_TypeError, "Missing required parameter 'digestmod'."); + return NULL; + } + + digest = py_digest_by_name(digestmod); + if (!digest) { + PyErr_SetString(PyExc_ValueError, "unknown hash function"); + return NULL; + } + + ctx = HMAC_CTX_new(); + if (ctx == NULL) { + _setException(PyExc_ValueError); + goto error; + } + + r = HMAC_Init_ex( + ctx, + (const char*)key->buf, + (int)key->len, + digest, + NULL /*impl*/); + if (r == 0) { + _setException(PyExc_ValueError); + goto error; } + + self = (HMACobject *)PyObject_New(HMACobject, type); + if (self == NULL) { + goto error; + } + + self->ctx = ctx; + self->lock = NULL; + + if ((msg_obj != NULL) && (msg_obj != Py_None)) { + if (!_hmac_update(self, msg_obj)) + goto error; + } + + return (PyObject*)self; + +error: + if (ctx) HMAC_CTX_free(ctx); + if (self) PyObject_Del(self); + return NULL; } +/* helper functions */ +static int +locked_HMAC_CTX_copy(HMAC_CTX *new_ctx_p, HMACobject *self) +{ + int result; + ENTER_HASHLIB(self); + result = HMAC_CTX_copy(new_ctx_p, self->ctx); + LEAVE_HASHLIB(self); + return result; +} -/* Ask OpenSSL for a list of supported ciphers, filling in a Python set. */ -static PyObject* -generate_hash_name_list(void) +static unsigned int +_hmac_digest_size(HMACobject *self) { - _InternalNameMapperState state; - state.set = PyFrozenSet_New(NULL); - if (state.set == NULL) + unsigned int digest_size = EVP_MD_size(HMAC_CTX_get_md(self->ctx)); + assert(digest_size <= EVP_MAX_MD_SIZE); + return digest_size; +} + +static int +_hmac_update(HMACobject *self, PyObject *obj) +{ + int r; + Py_buffer view = {0}; + + GET_BUFFER_VIEW_OR_ERROR(obj, &view, return 0); + + if (self->lock == NULL && view.len >= HASHLIB_GIL_MINSIZE) { + self->lock = PyThread_allocate_lock(); + /* fail? lock = NULL and we fail over to non-threaded code. */ + } + + if (self->lock != NULL) { + ENTER_HASHLIB(self); + r = HMAC_Update(self->ctx, (const unsigned char*)view.buf, view.len); + LEAVE_HASHLIB(self); + } else { + r = HMAC_Update(self->ctx, (const unsigned char*)view.buf, view.len); + } + + PyBuffer_Release(&view); + + if (r == 0) { + _setException(PyExc_ValueError); + return 0; + } + return 1; +} + +/*[clinic input] +_hashlib.HMAC.copy + +Return a copy ("clone") of the HMAC object. +[clinic start generated code]*/ + +static PyObject * +_hashlib_HMAC_copy_impl(HMACobject *self) +/*[clinic end generated code: output=29aa28b452833127 input=e2fa6a05db61a4d6]*/ +{ + HMACobject *retval; + + HMAC_CTX *ctx = HMAC_CTX_new(); + if (ctx == NULL) { + return _setException(PyExc_ValueError); + } + if (!locked_HMAC_CTX_copy(ctx, self)) { + HMAC_CTX_free(ctx); + return _setException(PyExc_ValueError); + } + + retval = (HMACobject *)PyObject_New(HMACobject, Py_TYPE(self)); + if (retval == NULL) { + HMAC_CTX_free(ctx); return NULL; - state.error = 0; + } + retval->ctx = ctx; + retval->lock = NULL; + + return (PyObject *)retval; +} + +static void +_hmac_dealloc(HMACobject *self) +{ + PyTypeObject *tp = Py_TYPE(self); + if (self->lock != NULL) { + PyThread_free_lock(self->lock); + } + HMAC_CTX_free(self->ctx); + PyObject_Del(self); + Py_DECREF(tp); +} + +static PyObject * +_hmac_repr(HMACobject *self) +{ + PyObject *digest_name = py_digest_name(HMAC_CTX_get_md(self->ctx)); + if (digest_name == NULL) { + return NULL; + } + PyObject *repr = PyUnicode_FromFormat( + "<%U HMAC object @ %p>", digest_name, self + ); + Py_DECREF(digest_name); + return repr; +} + +/*[clinic input] +_hashlib.HMAC.update + msg: object + +Update the HMAC object with msg. +[clinic start generated code]*/ + +static PyObject * +_hashlib_HMAC_update_impl(HMACobject *self, PyObject *msg) +/*[clinic end generated code: output=f31f0ace8c625b00 input=1829173bb3cfd4e6]*/ +{ + if (!_hmac_update(self, msg)) { + return NULL; + } + Py_RETURN_NONE; +} + +static int +_hmac_digest(HMACobject *self, unsigned char *buf, unsigned int len) +{ + HMAC_CTX *temp_ctx = HMAC_CTX_new(); + if (temp_ctx == NULL) { + PyErr_NoMemory(); + return 0; + } + if (!locked_HMAC_CTX_copy(temp_ctx, self)) { + _setException(PyExc_ValueError); + return 0; + } + int r = HMAC_Final(temp_ctx, buf, &len); + HMAC_CTX_free(temp_ctx); + if (r == 0) { + _setException(PyExc_ValueError); + return 0; + } + return 1; +} + +/*[clinic input] +_hashlib.HMAC.digest +Return the digest of the bytes passed to the update() method so far. +[clinic start generated code]*/ + +static PyObject * +_hashlib_HMAC_digest_impl(HMACobject *self) +/*[clinic end generated code: output=1b1424355af7a41e input=bff07f74da318fb4]*/ +{ + unsigned char digest[EVP_MAX_MD_SIZE]; + unsigned int digest_size = _hmac_digest_size(self); + if (digest_size == 0) { + return _setException(PyExc_ValueError); + } + int r = _hmac_digest(self, digest, digest_size); + if (r == 0) { + return NULL; + } + return PyBytes_FromStringAndSize((const char *)digest, digest_size); +} + +/*[clinic input] +_hashlib.HMAC.hexdigest + +Return hexadecimal digest of the bytes passed to the update() method so far. + +This may be used to exchange the value safely in email or other non-binary +environments. +[clinic start generated code]*/ + +static PyObject * +_hashlib_HMAC_hexdigest_impl(HMACobject *self) +/*[clinic end generated code: output=80d825be1eaae6a7 input=5abc42702874ddcf]*/ +{ + unsigned char digest[EVP_MAX_MD_SIZE]; + unsigned int digest_size = _hmac_digest_size(self); + if (digest_size == 0) { + return _setException(PyExc_ValueError); + } + int r = _hmac_digest(self, digest, digest_size); + if (r == 0) { + return NULL; + } + return _Py_strhex((const char *)digest, digest_size); +} + +static PyObject * +_hashlib_hmac_get_digest_size(HMACobject *self, void *closure) +{ + unsigned int digest_size = _hmac_digest_size(self); + if (digest_size == 0) { + return _setException(PyExc_ValueError); + } + return PyLong_FromLong(digest_size); +} + +static PyObject * +_hashlib_hmac_get_block_size(HMACobject *self, void *closure) +{ + const EVP_MD *md = HMAC_CTX_get_md(self->ctx); + if (md == NULL) { + return _setException(PyExc_ValueError); + } + return PyLong_FromLong(EVP_MD_block_size(md)); +} + +static PyObject * +_hashlib_hmac_get_name(HMACobject *self, void *closure) +{ + PyObject *digest_name = py_digest_name(HMAC_CTX_get_md(self->ctx)); + if (digest_name == NULL) { + return NULL; + } + PyObject *name = PyUnicode_FromFormat("hmac-%U", digest_name); + Py_DECREF(digest_name); + return name; +} + +static PyMethodDef HMAC_methods[] = { + _HASHLIB_HMAC_UPDATE_METHODDEF + _HASHLIB_HMAC_DIGEST_METHODDEF + _HASHLIB_HMAC_HEXDIGEST_METHODDEF + _HASHLIB_HMAC_COPY_METHODDEF + {NULL, NULL} /* sentinel */ +}; + +static PyGetSetDef HMAC_getset[] = { + {"digest_size", (getter)_hashlib_hmac_get_digest_size, NULL, NULL, NULL}, + {"block_size", (getter)_hashlib_hmac_get_block_size, NULL, NULL, NULL}, + {"name", (getter)_hashlib_hmac_get_name, NULL, NULL, NULL}, + {NULL} /* Sentinel */ +}; + + +PyDoc_STRVAR(hmactype_doc, +"The object used to calculate HMAC of a message.\n\ +\n\ +Methods:\n\ +\n\ +update() -- updates the current digest with an additional string\n\ +digest() -- return the current digest value\n\ +hexdigest() -- return the current digest as a string of hexadecimal digits\n\ +copy() -- return a copy of the current hash object\n\ +\n\ +Attributes:\n\ +\n\ +name -- the name, including the hash algorithm used by this object\n\ +digest_size -- number of bytes in digest() output\n"); + +static PyType_Slot HMACtype_slots[] = { + {Py_tp_doc, (char *)hmactype_doc}, + {Py_tp_repr, (reprfunc)_hmac_repr}, + {Py_tp_dealloc,(destructor)_hmac_dealloc}, + {Py_tp_methods, HMAC_methods}, + {Py_tp_getset, HMAC_getset}, + {Py_tp_new, _disabled_new}, + {0, NULL} +}; + +PyType_Spec HMACtype_spec = { + "_hashlib.HMAC", /* name */ + sizeof(HMACobject), /* basicsize */ + .flags = Py_TPFLAGS_DEFAULT, + .slots = HMACtype_slots, +}; + + +/* State for our callback function so that it can accumulate a result. */ +typedef struct _internal_name_mapper_state { + PyObject *set; + int error; +} _InternalNameMapperState; + + +/* A callback function to pass to OpenSSL's OBJ_NAME_do_all(...) */ +static void +_openssl_hash_name_mapper(const EVP_MD *md, const char *from, + const char *to, void *arg) +{ + _InternalNameMapperState *state = (_InternalNameMapperState *)arg; + PyObject *py_name; + + assert(state != NULL); + if (md == NULL) + return; + + py_name = py_digest_name(md); + if (py_name == NULL) { + state->error = 1; + } else { + if (PySet_Add(state->set, py_name) != 0) { + state->error = 1; + } + Py_DECREF(py_name); + } +} + + +/* Ask OpenSSL for a list of supported ciphers, filling in a Python set. */ +static int +hashlib_md_meth_names(PyObject *module) +{ + _InternalNameMapperState state = { + .set = PyFrozenSet_New(NULL), + .error = 0 + }; + if (state.set == NULL) { + return -1; + } EVP_MD_do_all(&_openssl_hash_name_mapper, &state); if (state.error) { Py_DECREF(state.set); - return NULL; + return -1; + } + + if (PyModule_AddObject(module, "openssl_md_meth_names", state.set) < 0) { + Py_DECREF(state.set); + return -1; + } + + return 0; +} + +/* LibreSSL doesn't support FIPS: + https://marc.info/?l=openbsd-misc&m=139819485423701&w=2 + + Ted Unangst wrote: "I figured I should mention our current libressl policy + wrt FIPS mode. It's gone and it's not coming back." */ +#ifndef LIBRESSL_VERSION_NUMBER +/*[clinic input] +_hashlib.get_fips_mode -> int + +Determine the OpenSSL FIPS mode of operation. + +For OpenSSL 3.0.0 and newer it returns the state of the default provider +in the default OSSL context. It's not quite the same as FIPS_mode() but good +enough for unittests. + +Effectively any non-zero return value indicates FIPS mode; +values other than 1 may have additional significance. +[clinic start generated code]*/ + +static int +_hashlib_get_fips_mode_impl(PyObject *module) +/*[clinic end generated code: output=87eece1bab4d3fa9 input=2db61538c41c6fef]*/ + +{ + int result; +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + result = EVP_default_properties_is_fips_enabled(NULL); +#else + ERR_clear_error(); + result = FIPS_mode(); + if (result == 0) { + // "If the library was built without support of the FIPS Object Module, + // then the function will return 0 with an error code of + // CRYPTO_R_FIPS_MODE_NOT_SUPPORTED (0x0f06d065)." + // But 0 is also a valid result value. + unsigned long errcode = ERR_peek_last_error(); + if (errcode) { + _setException(PyExc_ValueError); + return -1; + } + } + return result; +#endif +} +#endif // !LIBRESSL_VERSION_NUMBER + + +static int +_tscmp(const unsigned char *a, const unsigned char *b, + Py_ssize_t len_a, Py_ssize_t len_b) +{ + /* loop count depends on length of b. Might leak very little timing + * information if sizes are different. + */ + Py_ssize_t length = len_b; + const void *left = a; + const void *right = b; + int result = 0; + + if (len_a != length) { + left = b; + result = 1; + } + + result |= CRYPTO_memcmp(left, right, length); + + return (result == 0); +} + +/* NOTE: Keep in sync with _operator.c implementation. */ + +/*[clinic input] +_hashlib.compare_digest + + a: object + b: object + / + +Return 'a == b'. + +This function uses an approach designed to prevent +timing analysis, making it appropriate for cryptography. + +a and b must both be of the same type: either str (ASCII only), +or any bytes-like object. + +Note: If a and b are of different lengths, or if an error occurs, +a timing attack could theoretically reveal information about the +types and lengths of a and b--but not their values. +[clinic start generated code]*/ + +static PyObject * +_hashlib_compare_digest_impl(PyObject *module, PyObject *a, PyObject *b) +/*[clinic end generated code: output=6f1c13927480aed9 input=9c40c6e566ca12f5]*/ +{ + int rc; + + /* ASCII unicode string */ + if(PyUnicode_Check(a) && PyUnicode_Check(b)) { + if (PyUnicode_READY(a) == -1 || PyUnicode_READY(b) == -1) { + return NULL; + } + if (!PyUnicode_IS_ASCII(a) || !PyUnicode_IS_ASCII(b)) { + PyErr_SetString(PyExc_TypeError, + "comparing strings with non-ASCII characters is " + "not supported"); + return NULL; + } + + rc = _tscmp(PyUnicode_DATA(a), + PyUnicode_DATA(b), + PyUnicode_GET_LENGTH(a), + PyUnicode_GET_LENGTH(b)); + } + /* fallback to buffer interface for bytes, bytesarray and other */ + else { + Py_buffer view_a; + Py_buffer view_b; + + if (PyObject_CheckBuffer(a) == 0 && PyObject_CheckBuffer(b) == 0) { + PyErr_Format(PyExc_TypeError, + "unsupported operand types(s) or combination of types: " + "'%.100s' and '%.100s'", + Py_TYPE(a)->tp_name, Py_TYPE(b)->tp_name); + return NULL; + } + + if (PyObject_GetBuffer(a, &view_a, PyBUF_SIMPLE) == -1) { + return NULL; + } + if (view_a.ndim > 1) { + PyErr_SetString(PyExc_BufferError, + "Buffer must be single dimension"); + PyBuffer_Release(&view_a); + return NULL; + } + + if (PyObject_GetBuffer(b, &view_b, PyBUF_SIMPLE) == -1) { + PyBuffer_Release(&view_a); + return NULL; + } + if (view_b.ndim > 1) { + PyErr_SetString(PyExc_BufferError, + "Buffer must be single dimension"); + PyBuffer_Release(&view_a); + PyBuffer_Release(&view_b); + return NULL; + } + + rc = _tscmp((const unsigned char*)view_a.buf, + (const unsigned char*)view_b.buf, + view_a.len, + view_b.len); + + PyBuffer_Release(&view_a); + PyBuffer_Release(&view_b); } - return state.set; + + return PyBool_FromLong(rc); } /* List of functions exported by this module */ @@ -1078,68 +1954,188 @@ static struct PyMethodDef EVP_functions[] = { EVP_NEW_METHODDEF PBKDF2_HMAC_METHODDEF _HASHLIB_SCRYPT_METHODDEF - _HASHLIB_HMAC_DIGEST_METHODDEF + _HASHLIB_GET_FIPS_MODE_METHODDEF + _HASHLIB_COMPARE_DIGEST_METHODDEF + _HASHLIB_HMAC_SINGLESHOT_METHODDEF + _HASHLIB_HMAC_NEW_METHODDEF _HASHLIB_OPENSSL_MD5_METHODDEF _HASHLIB_OPENSSL_SHA1_METHODDEF _HASHLIB_OPENSSL_SHA224_METHODDEF _HASHLIB_OPENSSL_SHA256_METHODDEF _HASHLIB_OPENSSL_SHA384_METHODDEF _HASHLIB_OPENSSL_SHA512_METHODDEF + _HASHLIB_OPENSSL_SHA3_224_METHODDEF + _HASHLIB_OPENSSL_SHA3_256_METHODDEF + _HASHLIB_OPENSSL_SHA3_384_METHODDEF + _HASHLIB_OPENSSL_SHA3_512_METHODDEF + _HASHLIB_OPENSSL_SHAKE_128_METHODDEF + _HASHLIB_OPENSSL_SHAKE_256_METHODDEF {NULL, NULL} /* Sentinel */ }; /* Initialize this module. */ +static int +hashlib_traverse(PyObject *m, visitproc visit, void *arg) +{ + _hashlibstate *state = get_hashlib_state(m); + Py_VISIT(state->EVPtype); + Py_VISIT(state->HMACtype); +#ifdef PY_OPENSSL_HAS_SHAKE + Py_VISIT(state->EVPXOFtype); +#endif + return 0; +} -static struct PyModuleDef _hashlibmodule = { - PyModuleDef_HEAD_INIT, - "_hashlib", - NULL, - -1, - EVP_functions, - NULL, - NULL, - NULL, - NULL -}; +static int +hashlib_clear(PyObject *m) +{ + _hashlibstate *state = get_hashlib_state(m); + Py_CLEAR(state->EVPtype); + Py_CLEAR(state->HMACtype); +#ifdef PY_OPENSSL_HAS_SHAKE + Py_CLEAR(state->EVPXOFtype); +#endif + return 0; +} -PyMODINIT_FUNC -PyInit__hashlib(void) +static void +hashlib_free(void *m) { - PyObject *m, *openssl_md_meth_names; + hashlib_clear((PyObject *)m); +} +/* Py_mod_exec functions */ +static int +hashlib_openssl_legacy_init(PyObject *module) +{ #if (OPENSSL_VERSION_NUMBER < 0x10100000L) || defined(LIBRESSL_VERSION_NUMBER) /* Load all digest algorithms and initialize cpuid */ OPENSSL_add_all_algorithms_noconf(); ERR_load_crypto_strings(); #endif + return 0; +} - /* TODO build EVP_functions openssl_* entries dynamically based - * on what hashes are supported rather than listing many - * but having some be unsupported. Only init appropriate - * constants. */ +static int +hashlib_init_evptype(PyObject *module) +{ + _hashlibstate *state = get_hashlib_state(module); - Py_TYPE(&EVPtype) = &PyType_Type; - if (PyType_Ready(&EVPtype) < 0) - return NULL; + state->EVPtype = (PyTypeObject *)PyType_FromSpec(&EVPtype_spec); + if (state->EVPtype == NULL) { + return -1; + } + if (PyModule_AddType(module, state->EVPtype) < 0) { + return -1; + } + return 0; +} + +static int +hashlib_init_evpxoftype(PyObject *module) +{ +#ifdef PY_OPENSSL_HAS_SHAKE + _hashlibstate *state = get_hashlib_state(module); + PyObject *bases; + + if (state->EVPtype == NULL) { + return -1; + } + + bases = PyTuple_Pack(1, state->EVPtype); + if (bases == NULL) { + return -1; + } + + state->EVPXOFtype = (PyTypeObject *)PyType_FromSpecWithBases( + &EVPXOFtype_spec, bases + ); + Py_DECREF(bases); + if (state->EVPXOFtype == NULL) { + return -1; + } + if (PyModule_AddType(module, state->EVPXOFtype) < 0) { + return -1; + } +#endif + return 0; +} + +static int +hashlib_init_hmactype(PyObject *module) +{ + _hashlibstate *state = get_hashlib_state(module); + + state->HMACtype = (PyTypeObject *)PyType_FromSpec(&HMACtype_spec); + if (state->HMACtype == NULL) { + return -1; + } + if (PyModule_AddType(module, state->HMACtype) < 0) { + return -1; + } + return 0; +} + +#if 0 +static PyModuleDef_Slot hashlib_slots[] = { + /* OpenSSL 1.0.2 and LibreSSL */ + {Py_mod_exec, hashlib_openssl_legacy_init}, + {Py_mod_exec, hashlib_init_evptype}, + {Py_mod_exec, hashlib_init_evpxoftype}, + {Py_mod_exec, hashlib_init_hmactype}, + {Py_mod_exec, hashlib_md_meth_names}, + {0, NULL} +}; +#endif + +static struct PyModuleDef _hashlibmodule = { + PyModuleDef_HEAD_INIT, + .m_name = "_hashlib", + .m_doc = "OpenSSL interface for hashlib module", + .m_size = sizeof(_hashlibstate), + .m_methods = EVP_functions, + .m_slots = NULL, + .m_traverse = hashlib_traverse, + .m_clear = hashlib_clear, + .m_free = hashlib_free +}; + +PyMODINIT_FUNC +PyInit__hashlib(void) +{ + PyObject *m = PyState_FindModule(&_hashlibmodule); + if (m != NULL) { + Py_INCREF(m); + return m; + } m = PyModule_Create(&_hashlibmodule); - if (m == NULL) + if (m == NULL) { return NULL; + } - openssl_md_meth_names = generate_hash_name_list(); - if (openssl_md_meth_names == NULL) { + if (hashlib_openssl_legacy_init(m) < 0) { Py_DECREF(m); return NULL; } - if (PyModule_AddObject(m, "openssl_md_meth_names", openssl_md_meth_names)) { + if (hashlib_init_evptype(m) < 0) { + Py_DECREF(m); + return NULL; + } + if (hashlib_init_evpxoftype(m) < 0) { + Py_DECREF(m); + return NULL; + } + if (hashlib_init_hmactype(m) < 0) { + Py_DECREF(m); + return NULL; + } + if (hashlib_md_meth_names(m) == -1) { Py_DECREF(m); return NULL; } - - Py_INCREF((PyObject *)&EVPtype); - PyModule_AddObject(m, "HASH", (PyObject *)&EVPtype); return m; } diff --git a/Modules/_heapqmodule.c b/Modules/_heapqmodule.c index 6bc18b5f82fb82db52cec8b6a90256db928196b9..4e85e046d385a7a1d3da7926d28079efc25888ef 100644 --- a/Modules/_heapqmodule.c +++ b/Modules/_heapqmodule.c @@ -555,7 +555,6 @@ _heapq__heapify_max(PyObject *module, PyObject *heap) return heapify_internal(heap, siftup_max); } - static PyMethodDef heapq_methods[] = { _HEAPQ_HEAPPUSH_METHODDEF _HEAPQ_HEAPPUSHPOP_METHODDEF @@ -694,13 +693,29 @@ Believe me, real good tape sorts were quite spectacular to watch!\n\ From all times, sorting has always been a Great Art! :-)\n"); +static int +heapq_exec(PyObject *m) +{ + PyObject *about = PyUnicode_FromString(__about__); + if (PyModule_AddObject(m, "__about__", about) < 0) { + Py_DECREF(about); + return -1; + } + return 0; +} + +static struct PyModuleDef_Slot heapq_slots[] = { + {Py_mod_exec, heapq_exec}, + {0, NULL} +}; + static struct PyModuleDef _heapqmodule = { PyModuleDef_HEAD_INIT, "_heapq", module_doc, - -1, + 0, heapq_methods, - NULL, + heapq_slots, NULL, NULL, NULL @@ -709,13 +724,5 @@ static struct PyModuleDef _heapqmodule = { PyMODINIT_FUNC PyInit__heapq(void) { - PyObject *m, *about; - - m = PyModule_Create(&_heapqmodule); - if (m == NULL) - return NULL; - about = PyUnicode_DecodeUTF8(__about__, strlen(__about__), NULL); - PyModule_AddObject(m, "__about__", about); - return m; + return PyModuleDef_Init(&_heapqmodule); } - diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c index 49ed2cb00de52fcad6325c449ea89782454e7896..d7cadacea1b5b02dbf2bf21482922898562a9a21 100644 --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -9,8 +9,6 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "pycore_pystate.h" /* _PyInterpreterState_GET_UNSAFE() */ -#include "structmember.h" #include "_iomodule.h" #ifdef HAVE_SYS_TYPES_H @@ -377,14 +375,16 @@ _io_open_impl(PyObject *module, PyObject *file, const char *mode, { PyObject *RawIO_class = (PyObject *)&PyFileIO_Type; #ifdef MS_WINDOWS - PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; + const PyConfig *config = _Py_GetConfig(); if (!config->legacy_windows_stdio && _PyIO_get_console_type(path_or_fd) != '\0') { RawIO_class = (PyObject *)&PyWindowsConsoleIO_Type; encoding = "utf-8"; } #endif - raw = PyObject_CallFunction(RawIO_class, - "OsiO", path_or_fd, rawmode, closefd, opener); + raw = PyObject_CallFunction(RawIO_class, "OsOO", + path_or_fd, rawmode, + closefd ? Py_True : Py_False, + opener); } if (raw == NULL) @@ -400,7 +400,7 @@ _io_open_impl(PyObject *module, PyObject *file, const char *mode, /* buffering */ if (buffering < 0) { - PyObject *res = _PyObject_CallMethodId(raw, &PyId_isatty, NULL); + PyObject *res = _PyObject_CallMethodIdNoArgs(raw, &PyId_isatty); if (res == NULL) goto error; isatty = PyLong_AsLong(res); @@ -476,10 +476,10 @@ _io_open_impl(PyObject *module, PyObject *file, const char *mode, /* wraps into a TextIOWrapper */ wrapper = PyObject_CallFunction((PyObject *)&PyTextIOWrapper_Type, - "Osssi", + "OsssO", buffer, encoding, errors, newline, - line_buffering); + line_buffering ? Py_True : Py_False); if (wrapper == NULL) goto error; result = wrapper; @@ -494,7 +494,7 @@ _io_open_impl(PyObject *module, PyObject *file, const char *mode, if (result != NULL) { PyObject *exc, *val, *tb, *close_result; PyErr_Fetch(&exc, &val, &tb); - close_result = _PyObject_CallMethodId(result, &PyId_close, NULL); + close_result = _PyObject_CallMethodIdNoArgs(result, &PyId_close); _PyErr_ChainExceptions(exc, val, tb); Py_XDECREF(close_result); Py_DECREF(result); @@ -563,7 +563,7 @@ PyNumber_AsOff_t(PyObject *item, PyObject *err) /* Otherwise replace the error with caller's error object. */ PyErr_Format(err, "cannot fit '%.200s' into an offset-sized integer", - item->ob_type->tp_name); + Py_TYPE(item)->tp_name); } finish: @@ -571,13 +571,20 @@ PyNumber_AsOff_t(PyObject *item, PyObject *err) return result; } +static inline _PyIO_State* +get_io_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_PyIO_State *)state; +} _PyIO_State * _PyIO_get_module_state(void) { PyObject *mod = PyState_FindModule(&_PyIO_Module); _PyIO_State *state; - if (mod == NULL || (state = IO_MOD_STATE(mod)) == NULL) { + if (mod == NULL || (state = get_io_state(mod)) == NULL) { PyErr_SetString(PyExc_RuntimeError, "could not find io module state " "(interpreter shutdown?)"); @@ -613,7 +620,7 @@ _PyIO_get_locale_module(_PyIO_State *state) static int iomodule_traverse(PyObject *mod, visitproc visit, void *arg) { - _PyIO_State *state = IO_MOD_STATE(mod); + _PyIO_State *state = get_io_state(mod); if (!state->initialized) return 0; if (state->locale_module != NULL) { @@ -626,7 +633,7 @@ iomodule_traverse(PyObject *mod, visitproc visit, void *arg) { static int iomodule_clear(PyObject *mod) { - _PyIO_State *state = IO_MOD_STATE(mod); + _PyIO_State *state = get_io_state(mod); if (!state->initialized) return 0; if (state->locale_module != NULL) @@ -672,15 +679,11 @@ PyInit__io(void) _PyIO_State *state = NULL; if (m == NULL) return NULL; - state = IO_MOD_STATE(m); + state = get_io_state(m); state->initialized = 0; -#define ADD_TYPE(type, name) \ - if (PyType_Ready(type) < 0) \ - goto fail; \ - Py_INCREF(type); \ - if (PyModule_AddObject(m, name, (PyObject *)type) < 0) { \ - Py_DECREF(type); \ +#define ADD_TYPE(type) \ + if (PyModule_AddType(m, type) < 0) { \ goto fail; \ } @@ -708,54 +711,54 @@ PyInit__io(void) /* Concrete base types of the IO ABCs. (the ABCs themselves are declared through inheritance in io.py) */ - ADD_TYPE(&PyIOBase_Type, "_IOBase"); - ADD_TYPE(&PyRawIOBase_Type, "_RawIOBase"); - ADD_TYPE(&PyBufferedIOBase_Type, "_BufferedIOBase"); - ADD_TYPE(&PyTextIOBase_Type, "_TextIOBase"); + ADD_TYPE(&PyIOBase_Type); + ADD_TYPE(&PyRawIOBase_Type); + ADD_TYPE(&PyBufferedIOBase_Type); + ADD_TYPE(&PyTextIOBase_Type); /* Implementation of concrete IO objects. */ /* FileIO */ PyFileIO_Type.tp_base = &PyRawIOBase_Type; - ADD_TYPE(&PyFileIO_Type, "FileIO"); + ADD_TYPE(&PyFileIO_Type); /* BytesIO */ PyBytesIO_Type.tp_base = &PyBufferedIOBase_Type; - ADD_TYPE(&PyBytesIO_Type, "BytesIO"); + ADD_TYPE(&PyBytesIO_Type); if (PyType_Ready(&_PyBytesIOBuffer_Type) < 0) goto fail; /* StringIO */ PyStringIO_Type.tp_base = &PyTextIOBase_Type; - ADD_TYPE(&PyStringIO_Type, "StringIO"); + ADD_TYPE(&PyStringIO_Type); #ifdef MS_WINDOWS /* WindowsConsoleIO */ PyWindowsConsoleIO_Type.tp_base = &PyRawIOBase_Type; - ADD_TYPE(&PyWindowsConsoleIO_Type, "_WindowsConsoleIO"); + ADD_TYPE(&PyWindowsConsoleIO_Type); #endif /* BufferedReader */ PyBufferedReader_Type.tp_base = &PyBufferedIOBase_Type; - ADD_TYPE(&PyBufferedReader_Type, "BufferedReader"); + ADD_TYPE(&PyBufferedReader_Type); /* BufferedWriter */ PyBufferedWriter_Type.tp_base = &PyBufferedIOBase_Type; - ADD_TYPE(&PyBufferedWriter_Type, "BufferedWriter"); + ADD_TYPE(&PyBufferedWriter_Type); /* BufferedRWPair */ PyBufferedRWPair_Type.tp_base = &PyBufferedIOBase_Type; - ADD_TYPE(&PyBufferedRWPair_Type, "BufferedRWPair"); + ADD_TYPE(&PyBufferedRWPair_Type); /* BufferedRandom */ PyBufferedRandom_Type.tp_base = &PyBufferedIOBase_Type; - ADD_TYPE(&PyBufferedRandom_Type, "BufferedRandom"); + ADD_TYPE(&PyBufferedRandom_Type); /* TextIOWrapper */ PyTextIOWrapper_Type.tp_base = &PyTextIOBase_Type; - ADD_TYPE(&PyTextIOWrapper_Type, "TextIOWrapper"); + ADD_TYPE(&PyTextIOWrapper_Type); /* IncrementalNewlineDecoder */ - ADD_TYPE(&PyIncrementalNewlineDecoder_Type, "IncrementalNewlineDecoder"); + ADD_TYPE(&PyIncrementalNewlineDecoder_Type); /* Interned strings */ #define ADD_INTERNED(name) \ diff --git a/Modules/_io/_iomodule.h b/Modules/_io/_iomodule.h index 4d318acd0b3f8dee79ef95f2a9d28b340bf5d013..a8f3951e57febdca47be4e288d01772443540f89 100644 --- a/Modules/_io/_iomodule.h +++ b/Modules/_io/_iomodule.h @@ -2,6 +2,8 @@ * Declarations shared between the different parts of the io module */ +#include "exports.h" + /* ABCs */ extern PyTypeObject PyIOBase_Type; extern PyTypeObject PyRawIOBase_Type; @@ -183,4 +185,4 @@ extern PyObject *_PyIO_str_write; extern PyObject *_PyIO_empty_str; extern PyObject *_PyIO_empty_bytes; -extern PyTypeObject _PyBytesIOBuffer_Type; +extern Py_EXPORTED_SYMBOL PyTypeObject _PyBytesIOBuffer_Type; diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index ad7a8c9d264270acd0ef605c0fd5d5fa7f589427..f8e21f206f316ad647c7d42ba8d470323b16a21c 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -10,9 +10,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" #include "pycore_object.h" -#include "pycore_pystate.h" -#include "structmember.h" -#include "pythread.h" +#include "structmember.h" // PyMemberDef #include "_iomodule.h" /*[clinic input] @@ -292,12 +290,11 @@ _enter_buffered_busy(buffered *self) } Py_END_ALLOW_THREADS if (relax_locking && st != PY_LOCK_ACQUIRED) { - PyObject *msgobj = PyUnicode_FromFormat( - "could not acquire lock for %A at interpreter " + PyObject *ascii = PyObject_ASCII((PyObject*)self); + _Py_FatalErrorFormat(__func__, + "could not acquire lock for %s at interpreter " "shutdown, possibly due to daemon threads", - (PyObject *) self); - const char *msg = PyUnicode_AsUTF8(msgobj); - Py_FatalError(msg); + ascii ? PyUnicode_AsUTF8(ascii) : ""); } return 1; } @@ -439,8 +436,8 @@ buffered_dealloc_warn(buffered *self, PyObject *source) { if (self->ok && self->raw) { PyObject *r; - r = _PyObject_CallMethodIdObjArgs(self->raw, &PyId__dealloc_warn, - source, NULL); + r = _PyObject_CallMethodIdOneArg(self->raw, &PyId__dealloc_warn, + source); if (r) Py_DECREF(r); else @@ -461,7 +458,7 @@ static PyObject * buffered_simple_flush(buffered *self, PyObject *args) { CHECK_INITIALIZED(self) - return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_flush, NULL); + return PyObject_CallMethodNoArgs(self->raw, _PyIO_str_flush); } static int @@ -513,7 +510,7 @@ buffered_close(buffered *self, PyObject *args) } /* flush() will most probably re-take the lock, so drop it first */ LEAVE_BUFFERED(self) - res = PyObject_CallMethodObjArgs((PyObject *)self, _PyIO_str_flush, NULL); + res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (!ENTER_BUFFERED(self)) return NULL; if (res == NULL) @@ -521,7 +518,7 @@ buffered_close(buffered *self, PyObject *args) else Py_DECREF(res); - res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_close, NULL); + res = PyObject_CallMethodNoArgs(self->raw, _PyIO_str_close); if (self->buffer) { PyMem_Free(self->buffer); @@ -545,7 +542,7 @@ buffered_detach(buffered *self, PyObject *Py_UNUSED(ignored)) { PyObject *raw, *res; CHECK_INITIALIZED(self) - res = PyObject_CallMethodObjArgs((PyObject *)self, _PyIO_str_flush, NULL); + res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (res == NULL) return NULL; Py_DECREF(res); @@ -562,21 +559,21 @@ static PyObject * buffered_seekable(buffered *self, PyObject *Py_UNUSED(ignored)) { CHECK_INITIALIZED(self) - return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_seekable, NULL); + return PyObject_CallMethodNoArgs(self->raw, _PyIO_str_seekable); } static PyObject * buffered_readable(buffered *self, PyObject *Py_UNUSED(ignored)) { CHECK_INITIALIZED(self) - return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_readable, NULL); + return PyObject_CallMethodNoArgs(self->raw, _PyIO_str_readable); } static PyObject * buffered_writable(buffered *self, PyObject *Py_UNUSED(ignored)) { CHECK_INITIALIZED(self) - return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_writable, NULL); + return PyObject_CallMethodNoArgs(self->raw, _PyIO_str_writable); } static PyObject * @@ -599,14 +596,14 @@ static PyObject * buffered_fileno(buffered *self, PyObject *Py_UNUSED(ignored)) { CHECK_INITIALIZED(self) - return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_fileno, NULL); + return PyObject_CallMethodNoArgs(self->raw, _PyIO_str_fileno); } static PyObject * buffered_isatty(buffered *self, PyObject *Py_UNUSED(ignored)) { CHECK_INITIALIZED(self) - return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_isatty, NULL); + return PyObject_CallMethodNoArgs(self->raw, _PyIO_str_isatty); } /* Forward decls */ @@ -670,7 +667,7 @@ _buffered_raw_tell(buffered *self) { Py_off_t n; PyObject *res; - res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_tell, NULL); + res = PyObject_CallMethodNoArgs(self->raw, _PyIO_str_tell); if (res == NULL) return -1; n = PyNumber_AsOff_t(res, PyExc_ValueError); @@ -1315,16 +1312,20 @@ _io__Buffered_truncate_impl(buffered *self, PyObject *pos) PyObject *res = NULL; CHECK_INITIALIZED(self) + CHECK_CLOSED(self, "truncate of closed file") + if (!self->writable) { + return bufferediobase_unsupported("truncate"); + } if (!ENTER_BUFFERED(self)) return NULL; - if (self->writable) { - res = buffered_flush_and_rewind_unlocked(self); - if (res == NULL) - goto end; - Py_CLEAR(res); + res = buffered_flush_and_rewind_unlocked(self); + if (res == NULL) { + goto end; } - res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_truncate, pos, NULL); + Py_CLEAR(res); + + res = PyObject_CallMethodOneArg(self->raw, _PyIO_str_truncate, pos); if (res == NULL) goto end; /* Reset cached position */ @@ -1351,8 +1352,8 @@ buffered_iternext(buffered *self) line = _buffered_readline(self, -1); } else { - line = PyObject_CallMethodObjArgs((PyObject *)self, - _PyIO_str_readline, NULL); + line = PyObject_CallMethodNoArgs((PyObject *)self, + _PyIO_str_readline); if (line && !PyBytes_Check(line)) { PyErr_Format(PyExc_OSError, "readline() should have returned a bytes object, " @@ -1445,8 +1446,8 @@ _io_BufferedReader___init___impl(buffered *self, PyObject *raw, return -1; _bufferedreader_reset_buf(self); - self->fast_closed_checks = (Py_TYPE(self) == &PyBufferedReader_Type && - Py_TYPE(raw) == &PyFileIO_Type); + self->fast_closed_checks = (Py_IS_TYPE(self, &PyBufferedReader_Type) && + Py_IS_TYPE(raw, &PyFileIO_Type)); self->ok = 1; return 0; @@ -1470,7 +1471,7 @@ _bufferedreader_raw_read(buffered *self, char *start, Py_ssize_t len) raised (see issue #10956). */ do { - res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_readinto, memobj, NULL); + res = PyObject_CallMethodOneArg(self->raw, _PyIO_str_readinto, memobj); } while (res == NULL && _PyIO_trap_eintr()); Py_DECREF(memobj); if (res == NULL) @@ -1569,7 +1570,7 @@ _bufferedreader_read_all(buffered *self) } /* Read until EOF or until read() would block. */ - data = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_read, NULL); + data = PyObject_CallMethodNoArgs(self->raw, _PyIO_str_read); if (data == NULL) goto cleanup; if (data != Py_None && !PyBytes_Check(data)) { @@ -1791,8 +1792,8 @@ _io_BufferedWriter___init___impl(buffered *self, PyObject *raw, _bufferedwriter_reset_buf(self); self->pos = 0; - self->fast_closed_checks = (Py_TYPE(self) == &PyBufferedWriter_Type && - Py_TYPE(raw) == &PyFileIO_Type); + self->fast_closed_checks = (Py_IS_TYPE(self, &PyBufferedWriter_Type) && + Py_IS_TYPE(raw, &PyFileIO_Type)); self->ok = 1; return 0; @@ -1818,7 +1819,7 @@ _bufferedwriter_raw_write(buffered *self, char *start, Py_ssize_t len) */ do { errno = 0; - res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_write, memobj, NULL); + res = PyObject_CallMethodOneArg(self->raw, _PyIO_str_write, memobj); errnum = errno; } while (res == NULL && _PyIO_trap_eintr()); Py_DECREF(memobj); @@ -2305,8 +2306,8 @@ _io_BufferedRandom___init___impl(buffered *self, PyObject *raw, _bufferedwriter_reset_buf(self); self->pos = 0; - self->fast_closed_checks = (Py_TYPE(self) == &PyBufferedRandom_Type && - Py_TYPE(raw) == &PyFileIO_Type); + self->fast_closed_checks = (Py_IS_TYPE(self, &PyBufferedRandom_Type) && + Py_IS_TYPE(raw, &PyFileIO_Type)); self->ok = 1; return 0; diff --git a/Modules/_io/bytesio.c b/Modules/_io/bytesio.c index 3cf6402e75f7d5c4505bb10c65518dfafcb01c63..2468f45f941e2ec6b6e553d019501024cb6492c3 100644 --- a/Modules/_io/bytesio.c +++ b/Modules/_io/bytesio.c @@ -1,6 +1,6 @@ #include "Python.h" #include "pycore_object.h" -#include "structmember.h" /* for offsetof() */ +#include // offsetof() #include "_iomodule.h" /*[clinic input] @@ -31,17 +31,34 @@ typedef struct { * exports > 0. Py_REFCNT(buf) == 1, any modifications are forbidden. */ +static int +check_closed(bytesio *self) +{ + if (self->buf == NULL) { + PyErr_SetString(PyExc_ValueError, "I/O operation on closed file."); + return 1; + } + return 0; +} + +static int +check_exports(bytesio *self) +{ + if (self->exports > 0) { + PyErr_SetString(PyExc_BufferError, + "Existing exports of data: object cannot be re-sized"); + return 1; + } + return 0; +} + #define CHECK_CLOSED(self) \ - if ((self)->buf == NULL) { \ - PyErr_SetString(PyExc_ValueError, \ - "I/O operation on closed file."); \ + if (check_closed(self)) { \ return NULL; \ } #define CHECK_EXPORTS(self) \ - if ((self)->exports > 0) { \ - PyErr_SetString(PyExc_BufferError, \ - "Existing exports of data: object cannot be re-sized"); \ + if (check_exports(self)) { \ return NULL; \ } @@ -156,23 +173,41 @@ resize_buffer(bytesio *self, size_t size) } /* Internal routine for writing a string of bytes to the buffer of a BytesIO - object. Returns the number of bytes written, or -1 on error. */ -static Py_ssize_t -write_bytes(bytesio *self, const char *bytes, Py_ssize_t len) + object. Returns the number of bytes written, or -1 on error. + Inlining is disabled because it's significantly decreases performance + of writelines() in PGO build. */ +_Py_NO_INLINE static Py_ssize_t +write_bytes(bytesio *self, PyObject *b) { - size_t endpos; - assert(self->buf != NULL); - assert(self->pos >= 0); - assert(len >= 0); + if (check_closed(self)) { + return -1; + } + if (check_exports(self)) { + return -1; + } - endpos = (size_t)self->pos + len; + Py_buffer buf; + if (PyObject_GetBuffer(b, &buf, PyBUF_CONTIG_RO) < 0) { + return -1; + } + Py_ssize_t len = buf.len; + if (len == 0) { + goto done; + } + + assert(self->pos >= 0); + size_t endpos = (size_t)self->pos + len; if (endpos > (size_t)PyBytes_GET_SIZE(self->buf)) { - if (resize_buffer(self, endpos) < 0) - return -1; + if (resize_buffer(self, endpos) < 0) { + len = -1; + goto done; + } } else if (SHARED_BUF(self)) { - if (unshare_buffer(self, Py_MAX(endpos, (size_t)self->string_size)) < 0) - return -1; + if (unshare_buffer(self, Py_MAX(endpos, (size_t)self->string_size)) < 0) { + len = -1; + goto done; + } } if (self->pos > self->string_size) { @@ -190,7 +225,7 @@ write_bytes(bytesio *self, const char *bytes, Py_ssize_t len) /* Copy the data to the internal buffer, overwriting some of the existing data if self->pos < self->string_size. */ - memcpy(PyBytes_AS_STRING(self->buf) + self->pos, bytes, len); + memcpy(PyBytes_AS_STRING(self->buf) + self->pos, buf.buf, len); self->pos = endpos; /* Set the new length of the internal string if it has changed. */ @@ -198,6 +233,8 @@ write_bytes(bytesio *self, const char *bytes, Py_ssize_t len) self->string_size = endpos; } + done: + PyBuffer_Release(&buf); return len; } @@ -356,7 +393,7 @@ _io_BytesIO_tell_impl(bytesio *self) static PyObject * read_bytes(bytesio *self, Py_ssize_t size) { - char *output; + const char *output; assert(self->buf != NULL); assert(size <= self->string_size); @@ -465,7 +502,7 @@ _io_BytesIO_readlines_impl(bytesio *self, PyObject *arg) { Py_ssize_t maxsize, size, n; PyObject *result, *line; - char *output; + const char *output; CHECK_CLOSED(self); @@ -669,19 +706,7 @@ static PyObject * _io_BytesIO_write(bytesio *self, PyObject *b) /*[clinic end generated code: output=53316d99800a0b95 input=f5ec7c8c64ed720a]*/ { - Py_ssize_t n = 0; - Py_buffer buf; - - CHECK_CLOSED(self); - CHECK_EXPORTS(self); - - if (PyObject_GetBuffer(b, &buf, PyBUF_CONTIG_RO) < 0) - return NULL; - - if (buf.len != 0) - n = write_bytes(self, buf.buf, buf.len); - - PyBuffer_Release(&buf); + Py_ssize_t n = write_bytes(self, b); return n >= 0 ? PyLong_FromSsize_t(n) : NULL; } @@ -702,7 +727,6 @@ _io_BytesIO_writelines(bytesio *self, PyObject *lines) /*[clinic end generated code: output=7f33aa3271c91752 input=e972539176fc8fc1]*/ { PyObject *it, *item; - PyObject *ret; CHECK_CLOSED(self); @@ -711,13 +735,12 @@ _io_BytesIO_writelines(bytesio *self, PyObject *lines) return NULL; while ((item = PyIter_Next(it)) != NULL) { - ret = _io_BytesIO_write(self, item); + Py_ssize_t ret = write_bytes(self, item); Py_DECREF(item); - if (ret == NULL) { + if (ret < 0) { Py_DECREF(it); return NULL; } - Py_DECREF(ret); } Py_DECREF(it); @@ -1101,7 +1124,7 @@ static PyBufferProcs bytesiobuf_as_buffer = { (releasebufferproc) bytesiobuf_releasebuffer, }; -PyTypeObject _PyBytesIOBuffer_Type = { +Py_EXPORTED_SYMBOL PyTypeObject _PyBytesIOBuffer_Type = { PyVarObject_HEAD_INIT(NULL, 0) "_io._BytesIOBuffer", /*tp_name*/ sizeof(bytesiobuf), /*tp_basicsize*/ diff --git a/Modules/_io/clinic/bufferedio.c.h b/Modules/_io/clinic/bufferedio.c.h index 72841fcb6779c7f872c643926ff068022da7f5ef..56d6332a25058bae1d4e6e884cbf1fd78c347441 100644 --- a/Modules/_io/clinic/bufferedio.c.h +++ b/Modules/_io/clinic/bufferedio.c.h @@ -578,7 +578,7 @@ _io_BufferedRWPair___init__(PyObject *self, PyObject *args, PyObject *kwargs) PyObject *writer; Py_ssize_t buffer_size = DEFAULT_BUFFER_SIZE; - if ((Py_TYPE(self) == &PyBufferedRWPair_Type) && + if (Py_IS_TYPE(self, &PyBufferedRWPair_Type) && !_PyArg_NoKeywords("BufferedRWPair", kwargs)) { goto exit; } @@ -672,4 +672,4 @@ skip_optional_pos: exit: return return_value; } -/*[clinic end generated code: output=7246104f6c7d3167 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=7d9ad40c95bdd808 input=a9049054013a1b77]*/ diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c index 482d08f9f23b2af2a1da95171622a487dcbd8e43..caf91dfdb749e68ec5d1f95492cdcb7fb478a6b5 100644 --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -3,7 +3,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" #include "pycore_object.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include #ifdef HAVE_SYS_TYPES_H #include @@ -146,8 +146,8 @@ _io_FileIO_close_impl(fileio *self) PyObject *exc, *val, *tb; int rc; _Py_IDENTIFIER(close); - res = _PyObject_CallMethodIdObjArgs((PyObject*)&PyRawIOBase_Type, - &PyId_close, self, NULL); + res = _PyObject_CallMethodIdOneArg((PyObject*)&PyRawIOBase_Type, + &PyId_close, (PyObject *)self); if (!self->closefd) { self->fd = -1; return res; diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index fab450977ffa7cc4bb0ed8ad0dc96813be39dc72..a8e55c34799bd5b02728461c0f2755a741930c77 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -11,7 +11,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" #include "pycore_object.h" -#include "structmember.h" +#include // offsetof() #include "_iomodule.h" /*[clinic input] @@ -235,7 +235,7 @@ _io__IOBase_close_impl(PyObject *self) Py_RETURN_NONE; } - res = PyObject_CallMethodObjArgs(self, _PyIO_str_flush, NULL); + res = PyObject_CallMethodNoArgs(self, _PyIO_str_flush); PyErr_Fetch(&exc, &val, &tb); rc = _PyObject_SetAttrId(self, &PyId___IOBase_closed, Py_True); @@ -281,15 +281,13 @@ iobase_finalize(PyObject *self) finalization process. */ if (_PyObject_SetAttrId(self, &PyId__finalizing, Py_True)) PyErr_Clear(); - res = PyObject_CallMethodObjArgs((PyObject *) self, _PyIO_str_close, - NULL); + res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_close); /* Silencing I/O errors is bad, but printing spurious tracebacks is equally as bad, and potentially more frequent (because of shutdown issues). */ if (res == NULL) { #ifndef Py_DEBUG - const PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; - if (config->dev_mode) { + if (_Py_GetConfig()->dev_mode) { PyErr_WriteUnraisable(self); } else { @@ -383,7 +381,7 @@ _io__IOBase_seekable_impl(PyObject *self) PyObject * _PyIOBase_check_seekable(PyObject *self, PyObject *args) { - PyObject *res = PyObject_CallMethodObjArgs(self, _PyIO_str_seekable, NULL); + PyObject *res = PyObject_CallMethodNoArgs(self, _PyIO_str_seekable); if (res == NULL) return NULL; if (res != Py_True) { @@ -416,7 +414,7 @@ _io__IOBase_readable_impl(PyObject *self) PyObject * _PyIOBase_check_readable(PyObject *self, PyObject *args) { - PyObject *res = PyObject_CallMethodObjArgs(self, _PyIO_str_readable, NULL); + PyObject *res = PyObject_CallMethodNoArgs(self, _PyIO_str_readable); if (res == NULL) return NULL; if (res != Py_True) { @@ -449,7 +447,7 @@ _io__IOBase_writable_impl(PyObject *self) PyObject * _PyIOBase_check_writable(PyObject *self, PyObject *args) { - PyObject *res = PyObject_CallMethodObjArgs(self, _PyIO_str_writable, NULL); + PyObject *res = PyObject_CallMethodNoArgs(self, _PyIO_str_writable); if (res == NULL) return NULL; if (res != Py_True) { @@ -478,7 +476,7 @@ iobase_enter(PyObject *self, PyObject *args) static PyObject * iobase_exit(PyObject *self, PyObject *args) { - return PyObject_CallMethodObjArgs(self, _PyIO_str_close, NULL); + return PyObject_CallMethodNoArgs(self, _PyIO_str_close); } /* Lower-level APIs */ @@ -557,7 +555,7 @@ _io__IOBase_readline_impl(PyObject *self, Py_ssize_t limit) PyObject *b; if (peek != NULL) { - PyObject *readahead = PyObject_CallFunctionObjArgs(peek, _PyLong_One, NULL); + PyObject *readahead = PyObject_CallOneArg(peek, _PyLong_One); if (readahead == NULL) { /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals() when EINTR occurs so we needn't do it ourselves. */ @@ -656,7 +654,7 @@ iobase_iter(PyObject *self) static PyObject * iobase_iternext(PyObject *self) { - PyObject *line = PyObject_CallMethodObjArgs(self, _PyIO_str_readline, NULL); + PyObject *line = PyObject_CallMethodNoArgs(self, _PyIO_str_readline); if (line == NULL) return NULL; @@ -921,7 +919,7 @@ _io__RawIOBase_read_impl(PyObject *self, Py_ssize_t n) if (n < 0) { _Py_IDENTIFIER(readall); - return _PyObject_CallMethodId(self, &PyId_readall, NULL); + return _PyObject_CallMethodIdNoArgs(self, &PyId_readall); } /* TODO: allocate a bytes object directly instead and manually construct diff --git a/Modules/_io/stringio.c b/Modules/_io/stringio.c index 8b5fa7a369f38ca1bec765a9c7f9dd14e79aa383..e76152e617bdc570a6141e02c01a71db5ba298c6 100644 --- a/Modules/_io/stringio.c +++ b/Modules/_io/stringio.c @@ -1,6 +1,6 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" +#include // offsetof() #include "pycore_accu.h" #include "pycore_object.h" #include "_iomodule.h" @@ -402,14 +402,14 @@ stringio_iternext(stringio *self) CHECK_CLOSED(self); ENSURE_REALIZED(self); - if (Py_TYPE(self) == &PyStringIO_Type) { + if (Py_IS_TYPE(self, &PyStringIO_Type)) { /* Skip method call overhead for speed */ line = _stringio_readline(self, -1); } else { /* XXX is subclassing StringIO really supported? */ - line = PyObject_CallMethodObjArgs((PyObject *)self, - _PyIO_str_readline, NULL); + line = PyObject_CallMethodNoArgs((PyObject *)self, + _PyIO_str_readline); if (line && !PyUnicode_Check(line)) { PyErr_Format(PyExc_OSError, "readline() should have returned a str object, " @@ -714,9 +714,9 @@ _io_StringIO___init___impl(stringio *self, PyObject *value, } if (self->readuniversal) { - self->decoder = PyObject_CallFunction( + self->decoder = PyObject_CallFunctionObjArgs( (PyObject *)&PyIncrementalNewlineDecoder_Type, - "Oi", Py_None, (int) self->readtranslate); + Py_None, self->readtranslate ? Py_True : Py_False, NULL); if (self->decoder == NULL) return -1; } diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index a4bf7cd1076707e9e1602f2824d3dda93ac73dec..f2c72ebd516589a0b838d925a156d11c8c0e9c67 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -8,8 +8,10 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" +#include "pycore_interp.h" // PyInterpreterState.fs_codec #include "pycore_object.h" -#include "structmember.h" +#include "pycore_pystate.h" // _PyInterpreterState_GET() +#include "structmember.h" // PyMemberDef #include "_iomodule.h" /*[clinic input] @@ -340,7 +342,7 @@ _PyIncrementalNewlineDecoder_decode(PyObject *myself, goto error; kind = PyUnicode_KIND(modified); out = PyUnicode_DATA(modified); - PyUnicode_WRITE(kind, PyUnicode_DATA(modified), 0, '\r'); + PyUnicode_WRITE(kind, out, 0, '\r'); memcpy(out + kind, PyUnicode_DATA(output), kind * output_len); Py_DECREF(output); output = modified; /* output remains ready */ @@ -367,7 +369,7 @@ _PyIncrementalNewlineDecoder_decode(PyObject *myself, /* Record which newlines are read and do newline translation if desired, all in one pass. */ { - void *in_str; + const void *in_str; Py_ssize_t len; int seennl = self->seennl; int only_lf = 0; @@ -447,7 +449,7 @@ _PyIncrementalNewlineDecoder_decode(PyObject *myself, else { void *translated; int kind = PyUnicode_KIND(output); - void *in_str = PyUnicode_DATA(output); + const void *in_str = PyUnicode_DATA(output); Py_ssize_t in, out; /* XXX: Previous in-place translation here is disabled as resizing is not possible anymore */ @@ -527,8 +529,8 @@ _io_IncrementalNewlineDecoder_getstate_impl(nldecoder_object *self) unsigned long long flag; if (self->decoder != Py_None) { - PyObject *state = PyObject_CallMethodObjArgs(self->decoder, - _PyIO_str_getstate, NULL); + PyObject *state = PyObject_CallMethodNoArgs(self->decoder, + _PyIO_str_getstate); if (state == NULL) return NULL; if (!PyTuple_Check(state)) { @@ -601,7 +603,7 @@ _io_IncrementalNewlineDecoder_reset_impl(nldecoder_object *self) self->seennl = 0; self->pendingcr = 0; if (self->decoder != Py_None) - return PyObject_CallMethodObjArgs(self->decoder, _PyIO_str_reset, NULL); + return PyObject_CallMethodNoArgs(self->decoder, _PyIO_str_reset); else Py_RETURN_NONE; } @@ -862,7 +864,7 @@ _textiowrapper_set_decoder(textio *self, PyObject *codec_info, PyObject *res; int r; - res = _PyObject_CallMethodId(self->buffer, &PyId_readable, NULL); + res = _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_readable); if (res == NULL) return -1; @@ -880,9 +882,9 @@ _textiowrapper_set_decoder(textio *self, PyObject *codec_info, return -1; if (self->readuniversal) { - PyObject *incrementalDecoder = PyObject_CallFunction( + PyObject *incrementalDecoder = PyObject_CallFunctionObjArgs( (PyObject *)&PyIncrementalNewlineDecoder_Type, - "Oi", self->decoder, (int)self->readtranslate); + self->decoder, self->readtranslate ? Py_True : Py_False, NULL); if (incrementalDecoder == NULL) return -1; Py_CLEAR(self->decoder); @@ -897,7 +899,7 @@ _textiowrapper_decode(PyObject *decoder, PyObject *bytes, int eof) { PyObject *chars; - if (Py_TYPE(decoder) == &PyIncrementalNewlineDecoder_Type) + if (Py_IS_TYPE(decoder, &PyIncrementalNewlineDecoder_Type)) chars = _PyIncrementalNewlineDecoder_decode(decoder, bytes, eof); else chars = PyObject_CallMethodObjArgs(decoder, _PyIO_str_decode, bytes, @@ -917,7 +919,7 @@ _textiowrapper_set_encoder(textio *self, PyObject *codec_info, PyObject *res; int r; - res = _PyObject_CallMethodId(self->buffer, &PyId_writable, NULL); + res = _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_writable); if (res == NULL) return -1; @@ -963,8 +965,8 @@ _textiowrapper_fix_encoder_state(textio *self) self->encoding_start_of_stream = 1; - PyObject *cookieObj = PyObject_CallMethodObjArgs( - self->buffer, _PyIO_str_tell, NULL); + PyObject *cookieObj = PyObject_CallMethodNoArgs( + self->buffer, _PyIO_str_tell); if (cookieObj == NULL) { return -1; } @@ -977,8 +979,8 @@ _textiowrapper_fix_encoder_state(textio *self) if (cmp == 0) { self->encoding_start_of_stream = 0; - PyObject *res = PyObject_CallMethodObjArgs( - self->encoder, _PyIO_str_setstate, _PyLong_Zero, NULL); + PyObject *res = PyObject_CallMethodOneArg( + self->encoder, _PyIO_str_setstate, _PyLong_Zero); if (res == NULL) { return -1; } @@ -988,6 +990,46 @@ _textiowrapper_fix_encoder_state(textio *self) return 0; } +static int +io_check_errors(PyObject *errors) +{ + assert(errors != NULL && errors != Py_None); + + PyInterpreterState *interp = _PyInterpreterState_GET(); +#ifndef Py_DEBUG + /* In release mode, only check in development mode (-X dev) */ + if (!_PyInterpreterState_GetConfig(interp)->dev_mode) { + return 0; + } +#else + /* Always check in debug mode */ +#endif + + /* Avoid calling PyCodec_LookupError() before the codec registry is ready: + before_PyUnicode_InitEncodings() is called. */ + if (!interp->unicode.fs_codec.encoding) { + return 0; + } + + Py_ssize_t name_length; + const char *name = PyUnicode_AsUTF8AndSize(errors, &name_length); + if (name == NULL) { + return -1; + } + if (strlen(name) != (size_t)name_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character in errors"); + return -1; + } + PyObject *handler = PyCodec_LookupError(name); + if (handler != NULL) { + Py_DECREF(handler); + return 0; + } + return -1; +} + + + /*[clinic input] _io.TextIOWrapper.__init__ buffer: object @@ -1054,7 +1096,10 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer, PyErr_Format( PyExc_TypeError, "TextIOWrapper() argument 'errors' must be str or None, not %.50s", - errors->ob_type->tp_name); + Py_TYPE(errors)->tp_name); + return -1; + } + else if (io_check_errors(errors)) { return -1; } @@ -1083,7 +1128,7 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer, state = IO_STATE(); if (state == NULL) goto error; - fileno = _PyObject_CallMethodId(buffer, &PyId_fileno, NULL); + fileno = _PyObject_CallMethodIdNoArgs(buffer, &PyId_fileno); /* Ignore only AttributeError and UnsupportedOperation */ if (fileno == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError) || @@ -1112,8 +1157,8 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer, PyObject *locale_module = _PyIO_get_locale_module(state); if (locale_module == NULL) goto catch_ImportError; - self->encoding = _PyObject_CallMethodIdObjArgs( - locale_module, &PyId_getpreferredencoding, Py_False, NULL); + self->encoding = _PyObject_CallMethodIdOneArg( + locale_module, &PyId_getpreferredencoding, Py_False); Py_DECREF(locale_module); if (self->encoding == NULL) { catch_ImportError: @@ -1183,22 +1228,22 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer, /* Finished sorting out the codec details */ Py_CLEAR(codec_info); - if (Py_TYPE(buffer) == &PyBufferedReader_Type || - Py_TYPE(buffer) == &PyBufferedWriter_Type || - Py_TYPE(buffer) == &PyBufferedRandom_Type) + if (Py_IS_TYPE(buffer, &PyBufferedReader_Type) || + Py_IS_TYPE(buffer, &PyBufferedWriter_Type) || + Py_IS_TYPE(buffer, &PyBufferedRandom_Type)) { if (_PyObject_LookupAttrId(buffer, &PyId_raw, &raw) < 0) goto error; /* Cache the raw FileIO object to speed up 'closed' checks */ if (raw != NULL) { - if (Py_TYPE(raw) == &PyFileIO_Type) + if (Py_IS_TYPE(raw, &PyFileIO_Type)) self->raw = raw; else Py_DECREF(raw); } } - res = _PyObject_CallMethodId(buffer, &PyId_seekable, NULL); + res = _PyObject_CallMethodIdNoArgs(buffer, &PyId_seekable); if (res == NULL) goto error; r = PyObject_IsTrue(res); @@ -1343,7 +1388,7 @@ _io_TextIOWrapper_reconfigure_impl(textio *self, PyObject *encoding, return NULL; } - PyObject *res = PyObject_CallMethodObjArgs((PyObject *)self, _PyIO_str_flush, NULL); + PyObject *res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (res == NULL) { return NULL; } @@ -1423,7 +1468,7 @@ textiowrapper_closed_get(textio *self, void *context); do { \ int r; \ PyObject *_res; \ - if (Py_TYPE(self) == &PyTextIOWrapper_Type) { \ + if (Py_IS_TYPE(self, &PyTextIOWrapper_Type)) { \ if (self->raw != NULL) \ r = _PyFileIO_closed(self->raw); \ else { \ @@ -1482,7 +1527,7 @@ _io_TextIOWrapper_detach_impl(textio *self) { PyObject *buffer, *res; CHECK_ATTACHED(self); - res = PyObject_CallMethodObjArgs((PyObject *)self, _PyIO_str_flush, NULL); + res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (res == NULL) return NULL; Py_DECREF(res); @@ -1554,8 +1599,7 @@ _textiowrapper_writeflush(textio *self) PyObject *ret; do { - ret = PyObject_CallMethodObjArgs(self->buffer, - _PyIO_str_write, b, NULL); + ret = PyObject_CallMethodOneArg(self->buffer, _PyIO_str_write, b); } while (ret == NULL && _PyIO_trap_eintr()); Py_DECREF(b); if (ret == NULL) @@ -1625,8 +1669,7 @@ _io_TextIOWrapper_write_impl(textio *self, PyObject *text) self->encoding_start_of_stream = 0; } else - b = PyObject_CallMethodObjArgs(self->encoder, - _PyIO_str_encode, text, NULL); + b = PyObject_CallMethodOneArg(self->encoder, _PyIO_str_encode, text); Py_DECREF(text); if (b == NULL) @@ -1677,7 +1720,7 @@ _io_TextIOWrapper_write_impl(textio *self, PyObject *text) } if (needflush) { - ret = PyObject_CallMethodObjArgs(self->buffer, _PyIO_str_flush, NULL); + ret = PyObject_CallMethodNoArgs(self->buffer, _PyIO_str_flush); if (ret == NULL) return NULL; Py_DECREF(ret); @@ -1687,7 +1730,7 @@ _io_TextIOWrapper_write_impl(textio *self, PyObject *text) Py_CLEAR(self->snapshot); if (self->decoder) { - ret = _PyObject_CallMethodId(self->decoder, &PyId_reset, NULL); + ret = _PyObject_CallMethodIdNoArgs(self->decoder, &PyId_reset); if (ret == NULL) return NULL; Py_DECREF(ret); @@ -1767,9 +1810,8 @@ textiowrapper_read_chunk(textio *self, Py_ssize_t size_hint) /* To prepare for tell(), we need to snapshot a point in the file * where the decoder's input buffer is empty. */ - - PyObject *state = PyObject_CallMethodObjArgs(self->decoder, - _PyIO_str_getstate, NULL); + PyObject *state = PyObject_CallMethodNoArgs(self->decoder, + _PyIO_str_getstate); if (state == NULL) return -1; /* Given this, we know there was a valid snapshot point @@ -1809,9 +1851,9 @@ textiowrapper_read_chunk(textio *self, Py_ssize_t size_hint) if (chunk_size == NULL) goto fail; - input_chunk = PyObject_CallMethodObjArgs(self->buffer, + input_chunk = PyObject_CallMethodOneArg(self->buffer, (self->has_read1 ? _PyIO_str_read1: _PyIO_str_read), - chunk_size, NULL); + chunk_size); Py_DECREF(chunk_size); if (input_chunk == NULL) goto fail; @@ -1892,12 +1934,12 @@ _io_TextIOWrapper_read_impl(textio *self, Py_ssize_t n) if (n < 0) { /* Read everything */ - PyObject *bytes = _PyObject_CallMethodId(self->buffer, &PyId_read, NULL); + PyObject *bytes = _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_read); PyObject *decoded; if (bytes == NULL) goto fail; - if (Py_TYPE(self->decoder) == &PyIncrementalNewlineDecoder_Type) + if (Py_IS_TYPE(self->decoder, &PyIncrementalNewlineDecoder_Type)) decoded = _PyIncrementalNewlineDecoder_decode(self->decoder, bytes, 1); else @@ -2045,7 +2087,7 @@ _PyIO_find_line_ending( else { /* Non-universal mode. */ Py_ssize_t readnl_len = PyUnicode_GET_LENGTH(readnl); - Py_UCS1 *nl = PyUnicode_1BYTE_DATA(readnl); + const Py_UCS1 *nl = PyUnicode_1BYTE_DATA(readnl); /* Assume that readnl is an ASCII character. */ assert(PyUnicode_KIND(readnl) == PyUnicode_1BYTE_KIND); if (readnl_len == 1) { @@ -2099,7 +2141,7 @@ _textiowrapper_readline(textio *self, Py_ssize_t limit) chunked = 0; while (1) { - char *ptr; + const char *ptr; Py_ssize_t line_len; int kind; Py_ssize_t consumed = 0; @@ -2353,7 +2395,7 @@ _textiowrapper_decoder_setstate(textio *self, cookie_type *cookie) utf-16, that we are expecting a BOM). */ if (cookie->start_pos == 0 && cookie->dec_flags == 0) - res = PyObject_CallMethodObjArgs(self->decoder, _PyIO_str_reset, NULL); + res = PyObject_CallMethodNoArgs(self->decoder, _PyIO_str_reset); else res = _PyObject_CallMethodId(self->decoder, &PyId_setstate, "((yi))", "", cookie->dec_flags); @@ -2368,12 +2410,12 @@ _textiowrapper_encoder_reset(textio *self, int start_of_stream) { PyObject *res; if (start_of_stream) { - res = PyObject_CallMethodObjArgs(self->encoder, _PyIO_str_reset, NULL); + res = PyObject_CallMethodNoArgs(self->encoder, _PyIO_str_reset); self->encoding_start_of_stream = 1; } else { - res = PyObject_CallMethodObjArgs(self->encoder, _PyIO_str_setstate, - _PyLong_Zero, NULL); + res = PyObject_CallMethodOneArg(self->encoder, _PyIO_str_setstate, + _PyLong_Zero); self->encoding_start_of_stream = 0; } if (res == NULL) @@ -2433,7 +2475,7 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) * sync the underlying buffer with the current position. */ Py_DECREF(cookieObj); - cookieObj = _PyObject_CallMethodId((PyObject *)self, &PyId_tell, NULL); + cookieObj = _PyObject_CallMethodIdNoArgs((PyObject *)self, &PyId_tell); if (cookieObj == NULL) goto fail; break; @@ -2449,7 +2491,7 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) goto fail; } - res = _PyObject_CallMethodId((PyObject *)self, &PyId_flush, NULL); + res = _PyObject_CallMethodIdNoArgs((PyObject *)self, &PyId_flush); if (res == NULL) goto fail; Py_DECREF(res); @@ -2457,7 +2499,7 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) textiowrapper_set_decoded_chars(self, NULL); Py_CLEAR(self->snapshot); if (self->decoder) { - res = _PyObject_CallMethodId(self->decoder, &PyId_reset, NULL); + res = _PyObject_CallMethodIdNoArgs(self->decoder, &PyId_reset); if (res == NULL) goto fail; Py_DECREF(res); @@ -2497,7 +2539,7 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) goto fail; } - res = PyObject_CallMethodObjArgs((PyObject *)self, _PyIO_str_flush, NULL); + res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (res == NULL) goto fail; Py_DECREF(res); @@ -2512,8 +2554,7 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) posobj = PyLong_FromOff_t(cookie.start_pos); if (posobj == NULL) goto fail; - res = PyObject_CallMethodObjArgs(self->buffer, - _PyIO_str_seek, posobj, NULL); + res = PyObject_CallMethodOneArg(self->buffer, _PyIO_str_seek, posobj); Py_DECREF(posobj); if (res == NULL) goto fail; @@ -2552,8 +2593,8 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) } Py_XSETREF(self->snapshot, snapshot); - decoded = _PyObject_CallMethodId(self->decoder, &PyId_decode, - "Oi", input_chunk, (int)cookie.need_eof); + decoded = _PyObject_CallMethodIdObjArgs(self->decoder, &PyId_decode, + input_chunk, cookie.need_eof ? Py_True : Py_False, NULL); if (check_decoded(decoded) < 0) goto fail; @@ -2601,7 +2642,7 @@ _io_TextIOWrapper_tell_impl(textio *self) Py_ssize_t chars_to_skip, chars_decoded; Py_ssize_t skip_bytes, skip_back; PyObject *saved_state = NULL; - char *input, *input_end; + const char *input, *input_end; Py_ssize_t dec_buffer_len; int dec_flags; @@ -2620,12 +2661,12 @@ _io_TextIOWrapper_tell_impl(textio *self) if (_textiowrapper_writeflush(self) < 0) return NULL; - res = _PyObject_CallMethodId((PyObject *)self, &PyId_flush, NULL); + res = _PyObject_CallMethodIdNoArgs((PyObject *)self, &PyId_flush); if (res == NULL) goto fail; Py_DECREF(res); - posobj = _PyObject_CallMethodId(self->buffer, &PyId_tell, NULL); + posobj = _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_tell); if (posobj == NULL) goto fail; @@ -2661,15 +2702,15 @@ _io_TextIOWrapper_tell_impl(textio *self) chars_to_skip = self->decoded_chars_used; /* Decoder state will be restored at the end */ - saved_state = PyObject_CallMethodObjArgs(self->decoder, - _PyIO_str_getstate, NULL); + saved_state = PyObject_CallMethodNoArgs(self->decoder, + _PyIO_str_getstate); if (saved_state == NULL) goto fail; #define DECODER_GETSTATE() do { \ PyObject *dec_buffer; \ - PyObject *_state = PyObject_CallMethodObjArgs(self->decoder, \ - _PyIO_str_getstate, NULL); \ + PyObject *_state = PyObject_CallMethodNoArgs(self->decoder, \ + _PyIO_str_getstate); \ if (_state == NULL) \ goto fail; \ if (!PyTuple_Check(_state)) { \ @@ -2780,7 +2821,7 @@ _io_TextIOWrapper_tell_impl(textio *self) if (input == input_end) { /* We didn't get enough decoded data; signal EOF to get more. */ PyObject *decoded = _PyObject_CallMethodId( - self->decoder, &PyId_decode, "yi", "", /* final = */ 1); + self->decoder, &PyId_decode, "yO", "", /* final = */ Py_True); if (check_decoded(decoded) < 0) goto fail; chars_decoded += PyUnicode_GET_LENGTH(decoded); @@ -2795,7 +2836,7 @@ _io_TextIOWrapper_tell_impl(textio *self) } finally: - res = _PyObject_CallMethodIdObjArgs(self->decoder, &PyId_setstate, saved_state, NULL); + res = _PyObject_CallMethodIdOneArg(self->decoder, &PyId_setstate, saved_state); Py_DECREF(saved_state); if (res == NULL) return NULL; @@ -2809,7 +2850,7 @@ _io_TextIOWrapper_tell_impl(textio *self) if (saved_state) { PyObject *type, *value, *traceback; PyErr_Fetch(&type, &value, &traceback); - res = _PyObject_CallMethodIdObjArgs(self->decoder, &PyId_setstate, saved_state, NULL); + res = _PyObject_CallMethodIdOneArg(self->decoder, &PyId_setstate, saved_state); _PyErr_ChainExceptions(type, value, traceback); Py_DECREF(saved_state); Py_XDECREF(res); @@ -2831,12 +2872,12 @@ _io_TextIOWrapper_truncate_impl(textio *self, PyObject *pos) CHECK_ATTACHED(self) - res = PyObject_CallMethodObjArgs((PyObject *) self, _PyIO_str_flush, NULL); + res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (res == NULL) return NULL; Py_DECREF(res); - return PyObject_CallMethodObjArgs(self->buffer, _PyIO_str_truncate, pos, NULL); + return PyObject_CallMethodOneArg(self->buffer, _PyIO_str_truncate, pos); } static PyObject * @@ -2916,7 +2957,7 @@ _io_TextIOWrapper_fileno_impl(textio *self) /*[clinic end generated code: output=21490a4c3da13e6c input=c488ca83d0069f9b]*/ { CHECK_ATTACHED(self); - return _PyObject_CallMethodId(self->buffer, &PyId_fileno, NULL); + return _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_fileno); } /*[clinic input] @@ -2928,7 +2969,7 @@ _io_TextIOWrapper_seekable_impl(textio *self) /*[clinic end generated code: output=ab223dbbcffc0f00 input=8b005ca06e1fca13]*/ { CHECK_ATTACHED(self); - return _PyObject_CallMethodId(self->buffer, &PyId_seekable, NULL); + return _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_seekable); } /*[clinic input] @@ -2940,7 +2981,7 @@ _io_TextIOWrapper_readable_impl(textio *self) /*[clinic end generated code: output=72ff7ba289a8a91b input=0704ea7e01b0d3eb]*/ { CHECK_ATTACHED(self); - return _PyObject_CallMethodId(self->buffer, &PyId_readable, NULL); + return _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_readable); } /*[clinic input] @@ -2952,7 +2993,7 @@ _io_TextIOWrapper_writable_impl(textio *self) /*[clinic end generated code: output=a728c71790d03200 input=c41740bc9d8636e8]*/ { CHECK_ATTACHED(self); - return _PyObject_CallMethodId(self->buffer, &PyId_writable, NULL); + return _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_writable); } /*[clinic input] @@ -2964,7 +3005,7 @@ _io_TextIOWrapper_isatty_impl(textio *self) /*[clinic end generated code: output=12be1a35bace882e input=fb68d9f2c99bbfff]*/ { CHECK_ATTACHED(self); - return _PyObject_CallMethodId(self->buffer, &PyId_isatty, NULL); + return _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_isatty); } /*[clinic input] @@ -2980,7 +3021,7 @@ _io_TextIOWrapper_flush_impl(textio *self) self->telling = self->seekable; if (_textiowrapper_writeflush(self) < 0) return NULL; - return _PyObject_CallMethodId(self->buffer, &PyId_flush, NULL); + return _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_flush); } /*[clinic input] @@ -3009,21 +3050,21 @@ _io_TextIOWrapper_close_impl(textio *self) else { PyObject *exc = NULL, *val, *tb; if (self->finalizing) { - res = _PyObject_CallMethodIdObjArgs(self->buffer, - &PyId__dealloc_warn, - self, NULL); + res = _PyObject_CallMethodIdOneArg(self->buffer, + &PyId__dealloc_warn, + (PyObject *)self); if (res) Py_DECREF(res); else PyErr_Clear(); } - res = _PyObject_CallMethodId((PyObject *)self, &PyId_flush, NULL); + res = _PyObject_CallMethodIdNoArgs((PyObject *)self, &PyId_flush); if (res == NULL) PyErr_Fetch(&exc, &val, &tb); else Py_DECREF(res); - res = _PyObject_CallMethodId(self->buffer, &PyId_close, NULL); + res = _PyObject_CallMethodIdNoArgs(self->buffer, &PyId_close); if (exc != NULL) { _PyErr_ChainExceptions(exc, val, tb); Py_CLEAR(res); @@ -3040,13 +3081,13 @@ textiowrapper_iternext(textio *self) CHECK_ATTACHED(self); self->telling = 0; - if (Py_TYPE(self) == &PyTextIOWrapper_Type) { + if (Py_IS_TYPE(self, &PyTextIOWrapper_Type)) { /* Skip method call overhead for speed */ line = _textiowrapper_readline(self, -1); } else { - line = PyObject_CallMethodObjArgs((PyObject *)self, - _PyIO_str_readline, NULL); + line = PyObject_CallMethodNoArgs((PyObject *)self, + _PyIO_str_readline); if (line && !PyUnicode_Check(line)) { PyErr_Format(PyExc_OSError, "readline() should have returned a str object, " diff --git a/Modules/_io/winconsoleio.c b/Modules/_io/winconsoleio.c index ea5d24f950a1e24f79a5b21c595ce1bba3f3e0d8..a83ef37a1fcf739bec52dccc6539e6bf5fdfea55 100644 --- a/Modules/_io/winconsoleio.c +++ b/Modules/_io/winconsoleio.c @@ -12,7 +12,7 @@ #ifdef MS_WINDOWS -#include "structmember.h" +#include "structmember.h" // PyMemberDef #ifdef HAVE_SYS_TYPES_H #include #endif @@ -204,8 +204,8 @@ _io__WindowsConsoleIO_close_impl(winconsoleio *self) PyObject *exc, *val, *tb; int rc; _Py_IDENTIFIER(close); - res = _PyObject_CallMethodIdObjArgs((PyObject*)&PyRawIOBase_Type, - &PyId_close, self, NULL); + res = _PyObject_CallMethodIdOneArg((PyObject*)&PyRawIOBase_Type, + &PyId_close, (PyObject*)self); if (!self->closehandle) { self->handle = INVALID_HANDLE_VALUE; return res; diff --git a/Modules/_json.c b/Modules/_json.c index 048a9654ce18cab84ae8b8c2ad96792a6b2be8fe..faa3944eedd74c60f6f46f3eeb64baebd9eeb7f3 100644 --- a/Modules/_json.c +++ b/Modules/_json.c @@ -9,22 +9,22 @@ #endif #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include "pycore_accu.h" -#ifdef __GNUC__ -#define UNUSED __attribute__((__unused__)) -#else -#define UNUSED -#endif +typedef struct { + PyObject *PyScannerType; + PyObject *PyEncoderType; +} _jsonmodulestate; -#define PyScanner_Check(op) PyObject_TypeCheck(op, &PyScannerType) -#define PyScanner_CheckExact(op) (Py_TYPE(op) == &PyScannerType) -#define PyEncoder_Check(op) PyObject_TypeCheck(op, &PyEncoderType) -#define PyEncoder_CheckExact(op) (Py_TYPE(op) == &PyEncoderType) +static inline _jsonmodulestate* +get_json_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_jsonmodulestate *)state; +} -static PyTypeObject PyScannerType; -static PyTypeObject PyEncoderType; typedef struct _PyScannerObject { PyObject_HEAD @@ -73,25 +73,12 @@ static PyMemberDef encoder_members[] = { {NULL} }; -static PyObject * -join_list_unicode(PyObject *lst) -{ - /* return u''.join(lst) */ - static PyObject *sep = NULL; - if (sep == NULL) { - sep = PyUnicode_FromStringAndSize("", 0); - if (sep == NULL) - return NULL; - } - return PyUnicode_Join(sep, lst); -} - /* Forward decls */ static PyObject * ascii_escape_unicode(PyObject *pystr); static PyObject * -py_encode_basestring_ascii(PyObject* self UNUSED, PyObject *pystr); +py_encode_basestring_ascii(PyObject* Py_UNUSED(self), PyObject *pystr); void init_json(void); static PyObject * scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr); @@ -102,13 +89,13 @@ scanner_new(PyTypeObject *type, PyObject *args, PyObject *kwds); static void scanner_dealloc(PyObject *self); static int -scanner_clear(PyObject *self); +scanner_clear(PyScannerObject *self); static PyObject * encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds); static void encoder_dealloc(PyObject *self); static int -encoder_clear(PyObject *self); +encoder_clear(PyEncoderObject *self); static int encoder_listencode_list(PyEncoderObject *s, _PyAccu *acc, PyObject *seq, Py_ssize_t indent_level); static int @@ -172,8 +159,8 @@ ascii_escape_unicode(PyObject *pystr) Py_ssize_t output_size; Py_ssize_t chars; PyObject *rval; - void *input; - unsigned char *output; + const void *input; + Py_UCS1 *output; int kind; if (PyUnicode_READY(pystr) == -1) @@ -238,7 +225,7 @@ escape_unicode(PyObject *pystr) Py_ssize_t output_size; Py_ssize_t chars; PyObject *rval; - void *input; + const void *input; int kind; Py_UCS4 maxchar; @@ -385,21 +372,6 @@ _build_rval_index_tuple(PyObject *rval, Py_ssize_t idx) { return tpl; } -#define APPEND_OLD_CHUNK \ - if (chunk != NULL) { \ - if (chunks == NULL) { \ - chunks = PyList_New(0); \ - if (chunks == NULL) { \ - goto bail; \ - } \ - } \ - if (PyList_Append(chunks, chunk)) { \ - Py_CLEAR(chunk); \ - goto bail; \ - } \ - Py_CLEAR(chunk); \ - } - static PyObject * scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next_end_ptr) { @@ -417,12 +389,14 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next Py_ssize_t next /* = begin */; const void *buf; int kind; - PyObject *chunks = NULL; - PyObject *chunk = NULL; if (PyUnicode_READY(pystr) == -1) return 0; + _PyUnicodeWriter writer; + _PyUnicodeWriter_Init(&writer); + writer.overallocate = 1; + len = PyUnicode_GET_LENGTH(pystr); buf = PyUnicode_DATA(pystr); kind = PyUnicode_KIND(pystr); @@ -433,29 +407,42 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next } while (1) { /* Find the end of the string or the next escape */ - Py_UCS4 c = 0; - for (next = end; next < len; next++) { - c = PyUnicode_READ(kind, buf, next); - if (c == '"' || c == '\\') { - break; + Py_UCS4 c; + { + // Use tight scope variable to help register allocation. + Py_UCS4 d = 0; + for (next = end; next < len; next++) { + d = PyUnicode_READ(kind, buf, next); + if (d == '"' || d == '\\') { + break; + } + if (d <= 0x1f && strict) { + raise_errmsg("Invalid control character at", pystr, next); + goto bail; + } } - else if (c <= 0x1f && strict) { - raise_errmsg("Invalid control character at", pystr, next); - goto bail; + c = d; + } + + if (c == '"') { + // Fast path for simple case. + if (writer.buffer == NULL) { + PyObject *ret = PyUnicode_Substring(pystr, end, next); + if (ret == NULL) { + goto bail; + } + *next_end_ptr = next + 1;; + return ret; } } - if (!(c == '"' || c == '\\')) { + else if (c != '\\') { raise_errmsg("Unterminated string starting at", pystr, begin); goto bail; } + /* Pick up this chunk if it's not zero length */ if (next != end) { - APPEND_OLD_CHUNK - chunk = PyUnicode_FromKindAndData( - kind, - (char*)buf + kind * end, - next - end); - if (chunk == NULL) { + if (_PyUnicodeWriter_WriteSubstring(&writer, pystr, end, next) < 0) { goto bail; } } @@ -546,34 +533,18 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next end -= 6; } } - APPEND_OLD_CHUNK - chunk = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, &c, 1); - if (chunk == NULL) { + if (_PyUnicodeWriter_WriteChar(&writer, c) < 0) { goto bail; } } - if (chunks == NULL) { - if (chunk != NULL) - rval = chunk; - else - rval = PyUnicode_FromStringAndSize("", 0); - } - else { - APPEND_OLD_CHUNK - rval = join_list_unicode(chunks); - if (rval == NULL) { - goto bail; - } - Py_CLEAR(chunks); - } - + rval = _PyUnicodeWriter_Finish(&writer); *next_end_ptr = end; return rval; + bail: *next_end_ptr = -1; - Py_XDECREF(chunks); - Py_XDECREF(chunk); + _PyUnicodeWriter_Dealloc(&writer); return NULL; } @@ -591,7 +562,7 @@ PyDoc_STRVAR(pydoc_scanstring, ); static PyObject * -py_scanstring(PyObject* self UNUSED, PyObject *args) +py_scanstring(PyObject* Py_UNUSED(self), PyObject *args) { PyObject *pystr; PyObject *rval; @@ -620,7 +591,7 @@ PyDoc_STRVAR(pydoc_encode_basestring_ascii, ); static PyObject * -py_encode_basestring_ascii(PyObject* self UNUSED, PyObject *pystr) +py_encode_basestring_ascii(PyObject* Py_UNUSED(self), PyObject *pystr) { PyObject *rval; /* Return an ASCII-only JSON representation of a Python string */ @@ -645,7 +616,7 @@ PyDoc_STRVAR(pydoc_encode_basestring, ); static PyObject * -py_encode_basestring(PyObject* self UNUSED, PyObject *pystr) +py_encode_basestring(PyObject* Py_UNUSED(self), PyObject *pystr) { PyObject *rval; /* Return a JSON representation of a Python string */ @@ -665,38 +636,36 @@ py_encode_basestring(PyObject* self UNUSED, PyObject *pystr) static void scanner_dealloc(PyObject *self) { + PyTypeObject *tp = Py_TYPE(self); /* bpo-31095: UnTrack is needed before calling any callbacks */ PyObject_GC_UnTrack(self); - scanner_clear(self); - Py_TYPE(self)->tp_free(self); + scanner_clear((PyScannerObject *)self); + tp->tp_free(self); + Py_DECREF(tp); } static int -scanner_traverse(PyObject *self, visitproc visit, void *arg) +scanner_traverse(PyScannerObject *self, visitproc visit, void *arg) { - PyScannerObject *s; - assert(PyScanner_Check(self)); - s = (PyScannerObject *)self; - Py_VISIT(s->object_hook); - Py_VISIT(s->object_pairs_hook); - Py_VISIT(s->parse_float); - Py_VISIT(s->parse_int); - Py_VISIT(s->parse_constant); + Py_VISIT(Py_TYPE(self)); + Py_VISIT(self->object_hook); + Py_VISIT(self->object_pairs_hook); + Py_VISIT(self->parse_float); + Py_VISIT(self->parse_int); + Py_VISIT(self->parse_constant); + Py_VISIT(self->memo); return 0; } static int -scanner_clear(PyObject *self) +scanner_clear(PyScannerObject *self) { - PyScannerObject *s; - assert(PyScanner_Check(self)); - s = (PyScannerObject *)self; - Py_CLEAR(s->object_hook); - Py_CLEAR(s->object_pairs_hook); - Py_CLEAR(s->parse_float); - Py_CLEAR(s->parse_int); - Py_CLEAR(s->parse_constant); - Py_CLEAR(s->memo); + Py_CLEAR(self->object_hook); + Py_CLEAR(self->object_pairs_hook); + Py_CLEAR(self->parse_float); + Py_CLEAR(self->parse_int); + Py_CLEAR(self->parse_constant); + Py_CLEAR(self->memo); return 0; } @@ -710,7 +679,7 @@ _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ss Returns a new PyObject (usually a dict, but object_hook can change that) */ - void *str; + const void *str; int kind; Py_ssize_t end_idx; PyObject *val = NULL; @@ -749,19 +718,13 @@ _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ss key = scanstring_unicode(pystr, idx + 1, s->strict, &next_idx); if (key == NULL) goto bail; - memokey = PyDict_GetItemWithError(s->memo, key); - if (memokey != NULL) { - Py_INCREF(memokey); - Py_DECREF(key); - key = memokey; - } - else if (PyErr_Occurred()) { + memokey = PyDict_SetDefault(s->memo, key, key); + if (memokey == NULL) { goto bail; } - else { - if (PyDict_SetItem(s->memo, key, key) < 0) - goto bail; - } + Py_INCREF(memokey); + Py_DECREF(key); + key = memokey; idx = next_idx; /* skip whitespace between key and : delimiter, read :, skip whitespace */ @@ -818,14 +781,14 @@ _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ss *next_idx_ptr = idx + 1; if (has_pairs_hook) { - val = PyObject_CallFunctionObjArgs(s->object_pairs_hook, rval, NULL); + val = PyObject_CallOneArg(s->object_pairs_hook, rval); Py_DECREF(rval); return val; } /* if object_hook is not None: rval = object_hook(rval) */ if (s->object_hook != Py_None) { - val = PyObject_CallFunctionObjArgs(s->object_hook, rval, NULL); + val = PyObject_CallOneArg(s->object_hook, rval); Py_DECREF(rval); return val; } @@ -846,7 +809,7 @@ _parse_array_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssi Returns a new PyList */ - void *str; + const void *str; int kind; Py_ssize_t end_idx; PyObject *val = NULL; @@ -931,7 +894,7 @@ _parse_constant(PyScannerObject *s, const char *constant, Py_ssize_t idx, Py_ssi return NULL; /* rval = parse_constant(constant) */ - rval = PyObject_CallFunctionObjArgs(s->parse_constant, cstr, NULL); + rval = PyObject_CallOneArg(s->parse_constant, cstr); idx += PyUnicode_GET_LENGTH(cstr); Py_DECREF(cstr); *next_idx_ptr = idx; @@ -949,7 +912,7 @@ _match_number_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_ PyLong, or PyFloat. May return other types if parse_int or parse_float are set */ - void *str; + const void *str; int kind; Py_ssize_t end_idx; Py_ssize_t idx = start; @@ -1030,7 +993,7 @@ _match_number_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_ idx - start); if (numstr == NULL) return NULL; - rval = PyObject_CallFunctionObjArgs(custom_func, numstr, NULL); + rval = PyObject_CallOneArg(custom_func, numstr); } else { Py_ssize_t i, n; @@ -1066,7 +1029,7 @@ scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_ Returns a new PyObject representation of the term. */ PyObject *res; - void *str; + const void *str; int kind; Py_ssize_t length; @@ -1168,7 +1131,7 @@ scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_ } static PyObject * -scanner_call(PyObject *self, PyObject *args, PyObject *kwds) +scanner_call(PyScannerObject *self, PyObject *args, PyObject *kwds) { /* Python callable interface to scan_once_{str,unicode} */ PyObject *pystr; @@ -1176,14 +1139,11 @@ scanner_call(PyObject *self, PyObject *args, PyObject *kwds) Py_ssize_t idx; Py_ssize_t next_idx = -1; static char *kwlist[] = {"string", "idx", NULL}; - PyScannerObject *s; - assert(PyScanner_Check(self)); - s = (PyScannerObject *)self; if (!PyArg_ParseTupleAndKeywords(args, kwds, "On:scan_once", kwlist, &pystr, &idx)) return NULL; if (PyUnicode_Check(pystr)) { - rval = scan_once_unicode(s, pystr, idx, &next_idx); + rval = scan_once_unicode(self, pystr, idx, &next_idx); } else { PyErr_Format(PyExc_TypeError, @@ -1191,7 +1151,7 @@ scanner_call(PyObject *self, PyObject *args, PyObject *kwds) Py_TYPE(pystr)->tp_name); return NULL; } - PyDict_Clear(s->memo); + PyDict_Clear(self->memo); if (rval == NULL) return NULL; return _build_rval_index_tuple(rval, next_idx); @@ -1250,47 +1210,23 @@ scanner_new(PyTypeObject *type, PyObject *args, PyObject *kwds) PyDoc_STRVAR(scanner_doc, "JSON scanner object"); -static -PyTypeObject PyScannerType = { - PyVarObject_HEAD_INIT(NULL, 0) - "_json.Scanner", /* tp_name */ - sizeof(PyScannerObject), /* tp_basicsize */ - 0, /* tp_itemsize */ - scanner_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - scanner_call, /* tp_call */ - 0, /* tp_str */ - 0,/* PyObject_GenericGetAttr, */ /* tp_getattro */ - 0,/* PyObject_GenericSetAttr, */ /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ - scanner_doc, /* tp_doc */ - scanner_traverse, /* tp_traverse */ - scanner_clear, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - scanner_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0,/* PyType_GenericAlloc, */ /* tp_alloc */ - scanner_new, /* tp_new */ - 0,/* PyObject_GC_Del, */ /* tp_free */ +static PyType_Slot PyScannerType_slots[] = { + {Py_tp_doc, (void *)scanner_doc}, + {Py_tp_dealloc, scanner_dealloc}, + {Py_tp_call, scanner_call}, + {Py_tp_traverse, scanner_traverse}, + {Py_tp_clear, scanner_clear}, + {Py_tp_members, scanner_members}, + {Py_tp_new, scanner_new}, + {0, 0} +}; + +static PyType_Spec PyScannerType_spec = { + .name = "_json.Scanner", + .basicsize = sizeof(PyScannerObject), + .itemsize = 0, + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + .slots = PyScannerType_slots, }; static PyObject * @@ -1348,23 +1284,19 @@ encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds) } static PyObject * -encoder_call(PyObject *self, PyObject *args, PyObject *kwds) +encoder_call(PyEncoderObject *self, PyObject *args, PyObject *kwds) { /* Python callable interface to encode_listencode_obj */ static char *kwlist[] = {"obj", "_current_indent_level", NULL}; PyObject *obj; Py_ssize_t indent_level; - PyEncoderObject *s; _PyAccu acc; - - assert(PyEncoder_Check(self)); - s = (PyEncoderObject *)self; if (!PyArg_ParseTupleAndKeywords(args, kwds, "On:_iterencode", kwlist, &obj, &indent_level)) return NULL; if (_PyAccu_Init(&acc)) return NULL; - if (encoder_listencode_obj(s, &acc, obj, indent_level)) { + if (encoder_listencode_obj(self, &acc, obj, indent_level)) { _PyAccu_Destroy(&acc); return NULL; } @@ -1440,7 +1372,7 @@ encoder_encode_string(PyEncoderObject *s, PyObject *obj) if (s->fast_encode) { return s->fast_encode(NULL, obj); } - encoded = PyObject_CallFunctionObjArgs(s->encoder, obj, NULL); + encoded = PyObject_CallOneArg(s->encoder, obj); if (encoded != NULL && !PyUnicode_Check(encoded)) { PyErr_Format(PyExc_TypeError, "encoder() must return a string, not %.80s", @@ -1526,7 +1458,7 @@ encoder_listencode_obj(PyEncoderObject *s, _PyAccu *acc, return -1; } } - newobj = PyObject_CallFunctionObjArgs(s->defaultfn, obj, NULL); + newobj = PyObject_CallOneArg(s->defaultfn, obj); if (newobj == NULL) { Py_XDECREF(ident); return -1; @@ -1658,7 +1590,7 @@ encoder_listencode_dict(PyEncoderObject *s, _PyAccu *acc, else { PyErr_Format(PyExc_TypeError, "keys must be str, int, float, bool or None, " - "not %.100s", key->ob_type->tp_name); + "not %.100s", Py_TYPE(key)->tp_name); goto bail; } @@ -1803,86 +1735,59 @@ encoder_listencode_list(PyEncoderObject *s, _PyAccu *acc, static void encoder_dealloc(PyObject *self) { + PyTypeObject *tp = Py_TYPE(self); /* bpo-31095: UnTrack is needed before calling any callbacks */ PyObject_GC_UnTrack(self); - encoder_clear(self); - Py_TYPE(self)->tp_free(self); + encoder_clear((PyEncoderObject *)self); + tp->tp_free(self); + Py_DECREF(tp); } static int -encoder_traverse(PyObject *self, visitproc visit, void *arg) +encoder_traverse(PyEncoderObject *self, visitproc visit, void *arg) { - PyEncoderObject *s; - assert(PyEncoder_Check(self)); - s = (PyEncoderObject *)self; - Py_VISIT(s->markers); - Py_VISIT(s->defaultfn); - Py_VISIT(s->encoder); - Py_VISIT(s->indent); - Py_VISIT(s->key_separator); - Py_VISIT(s->item_separator); + Py_VISIT(Py_TYPE(self)); + Py_VISIT(self->markers); + Py_VISIT(self->defaultfn); + Py_VISIT(self->encoder); + Py_VISIT(self->indent); + Py_VISIT(self->key_separator); + Py_VISIT(self->item_separator); return 0; } static int -encoder_clear(PyObject *self) +encoder_clear(PyEncoderObject *self) { /* Deallocate Encoder */ - PyEncoderObject *s; - assert(PyEncoder_Check(self)); - s = (PyEncoderObject *)self; - Py_CLEAR(s->markers); - Py_CLEAR(s->defaultfn); - Py_CLEAR(s->encoder); - Py_CLEAR(s->indent); - Py_CLEAR(s->key_separator); - Py_CLEAR(s->item_separator); + Py_CLEAR(self->markers); + Py_CLEAR(self->defaultfn); + Py_CLEAR(self->encoder); + Py_CLEAR(self->indent); + Py_CLEAR(self->key_separator); + Py_CLEAR(self->item_separator); return 0; } PyDoc_STRVAR(encoder_doc, "_iterencode(obj, _current_indent_level) -> iterable"); -static -PyTypeObject PyEncoderType = { - PyVarObject_HEAD_INIT(NULL, 0) - "_json.Encoder", /* tp_name */ - sizeof(PyEncoderObject), /* tp_basicsize */ - 0, /* tp_itemsize */ - encoder_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - encoder_call, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ - encoder_doc, /* tp_doc */ - encoder_traverse, /* tp_traverse */ - encoder_clear, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - encoder_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - encoder_new, /* tp_new */ - 0, /* tp_free */ +static PyType_Slot PyEncoderType_slots[] = { + {Py_tp_doc, (void *)encoder_doc}, + {Py_tp_dealloc, encoder_dealloc}, + {Py_tp_call, encoder_call}, + {Py_tp_traverse, encoder_traverse}, + {Py_tp_clear, encoder_clear}, + {Py_tp_members, encoder_members}, + {Py_tp_new, encoder_new}, + {0, 0} +}; + +static PyType_Spec PyEncoderType_spec = { + .name = "_json.Encoder", + .basicsize = sizeof(PyEncoderObject), + .itemsize = 0, + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + .slots = PyEncoderType_slots }; static PyMethodDef speedups_methods[] = { @@ -1904,40 +1809,77 @@ static PyMethodDef speedups_methods[] = { PyDoc_STRVAR(module_doc, "json speedups\n"); +static int +_json_exec(PyObject *module) +{ + _jsonmodulestate *state = get_json_state(module); + + state->PyScannerType = PyType_FromSpec(&PyScannerType_spec); + if (state->PyScannerType == NULL) { + return -1; + } + Py_INCREF(state->PyScannerType); + if (PyModule_AddObject(module, "make_scanner", state->PyScannerType) < 0) { + Py_DECREF(state->PyScannerType); + return -1; + } + + state->PyEncoderType = PyType_FromSpec(&PyEncoderType_spec); + if (state->PyEncoderType == NULL) { + return -1; + } + Py_INCREF(state->PyEncoderType); + if (PyModule_AddObject(module, "make_encoder", state->PyEncoderType) < 0) { + Py_DECREF(state->PyEncoderType); + return -1; + } + + return 0; +} + +static int +_jsonmodule_traverse(PyObject *module, visitproc visit, void *arg) +{ + _jsonmodulestate *state = get_json_state(module); + Py_VISIT(state->PyScannerType); + Py_VISIT(state->PyEncoderType); + return 0; +} + +static int +_jsonmodule_clear(PyObject *module) +{ + _jsonmodulestate *state = get_json_state(module); + Py_CLEAR(state->PyScannerType); + Py_CLEAR(state->PyEncoderType); + return 0; +} + +static void +_jsonmodule_free(void *module) +{ + _jsonmodule_clear((PyObject *)module); +} + +static PyModuleDef_Slot _json_slots[] = { + {Py_mod_exec, _json_exec}, + {0, NULL} +}; + static struct PyModuleDef jsonmodule = { PyModuleDef_HEAD_INIT, "_json", module_doc, - -1, + sizeof(_jsonmodulestate), speedups_methods, - NULL, - NULL, - NULL, - NULL + _json_slots, + _jsonmodule_traverse, + _jsonmodule_clear, + _jsonmodule_free, }; PyMODINIT_FUNC PyInit__json(void) { - PyObject *m = PyModule_Create(&jsonmodule); - if (!m) - return NULL; - if (PyType_Ready(&PyScannerType) < 0) - goto fail; - if (PyType_Ready(&PyEncoderType) < 0) - goto fail; - Py_INCREF((PyObject*)&PyScannerType); - if (PyModule_AddObject(m, "make_scanner", (PyObject*)&PyScannerType) < 0) { - Py_DECREF((PyObject*)&PyScannerType); - goto fail; - } - Py_INCREF((PyObject*)&PyEncoderType); - if (PyModule_AddObject(m, "make_encoder", (PyObject*)&PyEncoderType) < 0) { - Py_DECREF((PyObject*)&PyEncoderType); - goto fail; - } - return m; - fail: - Py_DECREF(m); - return NULL; + return PyModuleDef_Init(&jsonmodule); } diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c index 036bdb301f3203306aa010d461454d4884624ea8..2e353bba00bf35bc038f01a8ffebb1ffcb9e4799 100644 --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -41,7 +41,17 @@ This software comes with no warranty. Use at your own risk. PyDoc_STRVAR(locale__doc__, "Support for POSIX locales."); -static PyObject *Error; +typedef struct _locale_state { + PyObject *Error; +} _locale_state; + +static inline _locale_state* +get_locale_state(PyObject *m) +{ + void *state = PyModule_GetState(m); + assert(state != NULL); + return (_locale_state *)state; +} /* support functions for formatting floating point numbers */ @@ -94,7 +104,8 @@ PyLocale_setlocale(PyObject* self, PyObject* args) #if defined(MS_WINDOWS) if (category < LC_MIN || category > LC_MAX) { - PyErr_SetString(Error, "invalid locale category"); + PyErr_SetString(get_locale_state(self)->Error, + "invalid locale category"); return NULL; } #endif @@ -104,7 +115,8 @@ PyLocale_setlocale(PyObject* self, PyObject* args) result = setlocale(category, locale); if (!result) { /* operation failed, no setting was changed */ - PyErr_SetString(Error, "unsupported locale setting"); + PyErr_SetString(get_locale_state(self)->Error, + "unsupported locale setting"); return NULL; } result_object = PyUnicode_DecodeLocale(result, NULL); @@ -114,7 +126,8 @@ PyLocale_setlocale(PyObject* self, PyObject* args) /* get locale */ result = setlocale(category, NULL); if (!result) { - PyErr_SetString(Error, "locale query failed"); + PyErr_SetString(get_locale_state(self)->Error, + "locale query failed"); return NULL; } result_object = PyUnicode_DecodeLocale(result, NULL); @@ -131,6 +144,7 @@ locale_is_ascii(const char *str) static int locale_decode_monetary(PyObject *dict, struct lconv *lc) { +#ifndef MS_WINDOWS int change_locale; change_locale = (!locale_is_ascii(lc->int_curr_symbol) || !locale_is_ascii(lc->currency_symbol) @@ -166,12 +180,18 @@ locale_decode_monetary(PyObject *dict, struct lconv *lc) } } +#define GET_LOCALE_STRING(ATTR) PyUnicode_DecodeLocale(lc->ATTR, NULL) +#else /* MS_WINDOWS */ +/* Use _W_* fields of Windows struct lconv */ +#define GET_LOCALE_STRING(ATTR) PyUnicode_FromWideChar(lc->_W_ ## ATTR, -1) +#endif /* MS_WINDOWS */ + int res = -1; #define RESULT_STRING(ATTR) \ do { \ PyObject *obj; \ - obj = PyUnicode_DecodeLocale(lc->ATTR, NULL); \ + obj = GET_LOCALE_STRING(ATTR); \ if (obj == NULL) { \ goto done; \ } \ @@ -187,14 +207,17 @@ locale_decode_monetary(PyObject *dict, struct lconv *lc) RESULT_STRING(mon_decimal_point); RESULT_STRING(mon_thousands_sep); #undef RESULT_STRING +#undef GET_LOCALE_STRING res = 0; done: +#ifndef MS_WINDOWS if (loc != NULL) { setlocale(LC_CTYPE, oldloc); } PyMem_Free(oldloc); +#endif return res; } @@ -230,9 +253,15 @@ PyLocale_localeconv(PyObject* self, PyObject *Py_UNUSED(ignored)) Py_DECREF(obj); \ } while (0) +#ifdef MS_WINDOWS +/* Use _W_* fields of Windows struct lconv */ +#define GET_LOCALE_STRING(ATTR) PyUnicode_FromWideChar(lc->_W_ ## ATTR, -1) +#else +#define GET_LOCALE_STRING(ATTR) PyUnicode_DecodeLocale(lc->ATTR, NULL) +#endif #define RESULT_STRING(s)\ do { \ - x = PyUnicode_DecodeLocale(lc->s, NULL); \ + x = GET_LOCALE_STRING(s); \ RESULT(#s, x); \ } while (0) @@ -261,8 +290,10 @@ PyLocale_localeconv(PyObject* self, PyObject *Py_UNUSED(ignored)) RESULT_INT(n_sign_posn); /* Numeric information: LC_NUMERIC encoding */ - PyObject *decimal_point, *thousands_sep; + PyObject *decimal_point = NULL, *thousands_sep = NULL; if (_Py_GetLocaleconvNumeric(lc, &decimal_point, &thousands_sep) < 0) { + Py_XDECREF(decimal_point); + Py_XDECREF(thousands_sep); goto failed; } @@ -291,6 +322,7 @@ PyLocale_localeconv(PyObject* self, PyObject *Py_UNUSED(ignored)) #undef RESULT #undef RESULT_STRING #undef RESULT_INT +#undef GET_LOCALE_STRING } #if defined(HAVE_WCSCOLL) @@ -622,14 +654,16 @@ PyDoc_STRVAR(bindtextdomain__doc__, "Bind the C library's domain to dir."); static PyObject* -PyIntl_bindtextdomain(PyObject* self,PyObject*args) +PyIntl_bindtextdomain(PyObject* self, PyObject*args) { - char *domain, *dirname, *current_dirname; + const char *domain, *dirname, *current_dirname; PyObject *dirname_obj, *dirname_bytes = NULL, *result; + if (!PyArg_ParseTuple(args, "sO", &domain, &dirname_obj)) return 0; if (!strlen(domain)) { - PyErr_SetString(Error, "domain must be a non-empty string"); + PyErr_SetString(get_locale_state(self)->Error, + "domain must be a non-empty string"); return 0; } if (dirname_obj != Py_None) { @@ -710,63 +744,104 @@ static struct PyMethodDef PyLocale_Methods[] = { {NULL, NULL} }; - -static struct PyModuleDef _localemodule = { - PyModuleDef_HEAD_INIT, - "_locale", - locale__doc__, - -1, - PyLocale_Methods, - NULL, - NULL, - NULL, - NULL -}; - -PyMODINIT_FUNC -PyInit__locale(void) +static int +_locale_exec(PyObject *module) { - PyObject *m; #ifdef HAVE_LANGINFO_H int i; #endif +#define ADD_INT(module, value) \ + do { \ + if (PyModule_AddIntConstant(module, #value, value) < 0) { \ + return -1; \ + } \ + } while (0) - m = PyModule_Create(&_localemodule); - if (m == NULL) - return NULL; - - PyModule_AddIntMacro(m, LC_CTYPE); - PyModule_AddIntMacro(m, LC_TIME); - PyModule_AddIntMacro(m, LC_COLLATE); - PyModule_AddIntMacro(m, LC_MONETARY); + ADD_INT(module, LC_CTYPE); + ADD_INT(module, LC_TIME); + ADD_INT(module, LC_COLLATE); + ADD_INT(module, LC_MONETARY); #ifdef LC_MESSAGES - PyModule_AddIntMacro(m, LC_MESSAGES); + ADD_INT(module, LC_MESSAGES); #endif /* LC_MESSAGES */ - PyModule_AddIntMacro(m, LC_NUMERIC); - PyModule_AddIntMacro(m, LC_ALL); - PyModule_AddIntMacro(m, CHAR_MAX); + ADD_INT(module, LC_NUMERIC); + ADD_INT(module, LC_ALL); + ADD_INT(module, CHAR_MAX); - Error = PyErr_NewException("locale.Error", NULL, NULL); - if (Error == NULL) { - Py_DECREF(m); - return NULL; + _locale_state *state = get_locale_state(module); + state->Error = PyErr_NewException("locale.Error", NULL, NULL); + if (state->Error == NULL) { + return -1; + } + Py_INCREF(get_locale_state(module)->Error); + if (PyModule_AddObject(module, "Error", get_locale_state(module)->Error) < 0) { + Py_DECREF(get_locale_state(module)->Error); + return -1; } - PyModule_AddObject(m, "Error", Error); #ifdef HAVE_LANGINFO_H for (i = 0; langinfo_constants[i].name; i++) { - PyModule_AddIntConstant(m, langinfo_constants[i].name, - langinfo_constants[i].value); + if (PyModule_AddIntConstant(module, + langinfo_constants[i].name, + langinfo_constants[i].value) < 0) { + return -1; + } } #endif if (PyErr_Occurred()) { - Py_DECREF(m); - return NULL; + return -1; } - return m; + return 0; + +#undef ADD_INT +} + +static struct PyModuleDef_Slot _locale_slots[] = { + {Py_mod_exec, _locale_exec}, + {0, NULL} +}; + +static int +locale_traverse(PyObject *module, visitproc visit, void *arg) +{ + _locale_state *state = get_locale_state(module); + Py_VISIT(state->Error); + return 0; +} + +static int +locale_clear(PyObject *module) +{ + _locale_state *state = get_locale_state(module); + Py_CLEAR(state->Error); + return 0; +} + +static void +locale_free(PyObject *module) +{ + locale_clear(module); +} + +static struct PyModuleDef _localemodule = { + PyModuleDef_HEAD_INIT, + "_locale", + locale__doc__, + sizeof(_locale_state), + PyLocale_Methods, + _locale_slots, + locale_traverse, + locale_clear, + (freefunc)locale_free, +}; + +PyMODINIT_FUNC +PyInit__locale(void) +{ + return PyModuleDef_Init(&_localemodule); } /* diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c index c5a6f4445872cad30b35b14f53c11aedc41623a7..5e53d839640d994f01e15309a698f98dc2b1193e 100644 --- a/Modules/_lsprof.c +++ b/Modules/_lsprof.c @@ -1,5 +1,4 @@ #include "Python.h" -#include "frameobject.h" #include "rotatingtree.h" /************************************************************/ @@ -54,7 +53,7 @@ typedef struct { static PyTypeObject PyProfiler_Type; #define PyProfiler_Check(op) PyObject_TypeCheck(op, &PyProfiler_Type) -#define PyProfiler_CheckExact(op) (Py_TYPE(op) == &PyProfiler_Type) +#define PyProfiler_CheckExact(op) Py_IS_TYPE(op, &PyProfiler_Type) /*** External Timers ***/ @@ -388,15 +387,22 @@ profiler_callback(PyObject *self, PyFrameObject *frame, int what, /* the 'frame' of a called function is about to start its execution */ case PyTrace_CALL: - ptrace_enter_call(self, (void *)frame->f_code, - (PyObject *)frame->f_code); + { + PyCodeObject *code = PyFrame_GetCode(frame); + ptrace_enter_call(self, (void *)code, (PyObject *)code); + Py_DECREF(code); break; + } /* the 'frame' of a called function is about to finish (either normally or with an exception) */ case PyTrace_RETURN: - ptrace_leave_call(self, (void *)frame->f_code); + { + PyCodeObject *code = PyFrame_GetCode(frame); + ptrace_leave_call(self, (void *)code); + Py_DECREF(code); break; + } /* case PyTrace_EXCEPTION: If the exception results in the function exiting, a @@ -578,8 +584,9 @@ static PyObject* profiler_getstats(ProfilerObject *pObj, PyObject* noarg) { statscollector_t collect; - if (pending_exception(pObj)) + if (pending_exception(pObj)) { return NULL; + } if (!pObj->externalTimer || pObj->externalTimerUnit == 0.0) { _PyTime_t onesec = _PyTime_FromSeconds(1); collect.factor = (double)1 / onesec; @@ -639,9 +646,15 @@ profiler_enable(ProfilerObject *self, PyObject *args, PyObject *kwds) if (!PyArg_ParseTupleAndKeywords(args, kwds, "|ii:enable", kwlist, &subcalls, &builtins)) return NULL; - if (setSubcalls(self, subcalls) < 0 || setBuiltins(self, builtins) < 0) + if (setSubcalls(self, subcalls) < 0 || setBuiltins(self, builtins) < 0) { + return NULL; + } + + PyThreadState *tstate = PyThreadState_GET(); + if (_PyEval_SetProfile(tstate, profiler_callback, (PyObject*)self) < 0) { return NULL; - PyEval_SetProfile(profiler_callback, (PyObject*)self); + } + self->flags |= POF_ENABLED; Py_RETURN_NONE; } @@ -671,11 +684,16 @@ Stop collecting profiling information.\n\ static PyObject* profiler_disable(ProfilerObject *self, PyObject* noarg) { + PyThreadState *tstate = PyThreadState_GET(); + if (_PyEval_SetProfile(tstate, NULL, NULL) < 0) { + return NULL; + } self->flags &= ~POF_ENABLED; - PyEval_SetProfile(NULL, NULL); + flush_unmatched(self); - if (pending_exception(self)) + if (pending_exception(self)) { return NULL; + } Py_RETURN_NONE; } @@ -695,8 +713,13 @@ profiler_clear(ProfilerObject *pObj, PyObject* noarg) static void profiler_dealloc(ProfilerObject *op) { - if (op->flags & POF_ENABLED) - PyEval_SetProfile(NULL, NULL); + if (op->flags & POF_ENABLED) { + PyThreadState *tstate = PyThreadState_GET(); + if (_PyEval_SetProfile(tstate, NULL, NULL) < 0) { + PyErr_WriteUnraisable((PyObject *)op); + } + } + flush_unmatched(op); clearEntries(op); Py_XDECREF(op->externalTimer); diff --git a/Modules/_lzmamodule.c b/Modules/_lzmamodule.c index 1ab67f306b73a0dcd2b6c46ccab67ba0ffc7472c..2a62a6835685059a6cba78c4e655c886bccd0838 100644 --- a/Modules/_lzmamodule.c +++ b/Modules/_lzmamodule.c @@ -8,8 +8,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" -#include "pythread.h" +#include "structmember.h" // PyMemberDef #include #include @@ -212,10 +211,9 @@ parse_filter_spec_lzma(PyObject *spec) return NULL; } - options = (lzma_options_lzma *)PyMem_Malloc(sizeof *options); + options = (lzma_options_lzma *)PyMem_Calloc(1, sizeof *options); if (options == NULL) return PyErr_NoMemory(); - memset(options, 0, sizeof *options); if (lzma_lzma_preset(options, preset)) { PyMem_Free(options); @@ -257,10 +255,9 @@ parse_filter_spec_delta(PyObject *spec) return NULL; } - options = (lzma_options_delta *)PyMem_Malloc(sizeof *options); + options = (lzma_options_delta *)PyMem_Calloc(1, sizeof *options); if (options == NULL) return PyErr_NoMemory(); - memset(options, 0, sizeof *options); options->type = LZMA_DELTA_TYPE_BYTE; options->dist = dist; return options; @@ -281,10 +278,9 @@ parse_filter_spec_bcj(PyObject *spec) return NULL; } - options = (lzma_options_bcj *)PyMem_Malloc(sizeof *options); + options = (lzma_options_bcj *)PyMem_Calloc(1, sizeof *options); if (options == NULL) return PyErr_NoMemory(); - memset(options, 0, sizeof *options); options->start_offset = start_offset; return options; } @@ -1486,19 +1482,13 @@ PyInit__lzma(void) if (PyModule_AddObject(m, "LZMAError", Error) == -1) return NULL; - if (PyType_Ready(&Compressor_type) == -1) - return NULL; - Py_INCREF(&Compressor_type); - if (PyModule_AddObject(m, "LZMACompressor", - (PyObject *)&Compressor_type) == -1) + if (PyModule_AddType(m, &Compressor_type) < 0) { return NULL; + } - if (PyType_Ready(&Decompressor_type) == -1) - return NULL; - Py_INCREF(&Decompressor_type); - if (PyModule_AddObject(m, "LZMADecompressor", - (PyObject *)&Decompressor_type) == -1) + if (PyModule_AddType(m, &Decompressor_type) < 0) { return NULL; + } return m; } diff --git a/Modules/_multiprocessing/multiprocessing.h b/Modules/_multiprocessing/multiprocessing.h index 512bc17f23d46b7c2a536a274905ac930c24a984..fe78135d4669ece63ecd0e3c110dce17e7bf86ab 100644 --- a/Modules/_multiprocessing/multiprocessing.h +++ b/Modules/_multiprocessing/multiprocessing.h @@ -27,14 +27,6 @@ # include typedef sem_t *SEM_HANDLE; # endif -# define HANDLE int -# define SOCKET int -# define BOOL int -# define UINT32 uint32_t -# define INT32 int32_t -# define TRUE 1 -# define FALSE 0 -# define INVALID_HANDLE_VALUE (-1) #endif /* @@ -72,8 +64,6 @@ # define T_HANDLE T_POINTER # define F_SEM_HANDLE F_HANDLE # define T_SEM_HANDLE T_HANDLE -# define F_DWORD "k" -# define T_DWORD T_ULONG #else # define F_HANDLE "i" # define T_HANDLE T_INT diff --git a/Modules/_multiprocessing/posixshmem.c b/Modules/_multiprocessing/posixshmem.c index 2049dbbc6fa83baf595f61052595a5c576ce272a..436ac6d6b39f49b7d5a271794d0fbd4f4dbfa93e 100644 --- a/Modules/_multiprocessing/posixshmem.c +++ b/Modules/_multiprocessing/posixshmem.c @@ -5,7 +5,6 @@ posixshmem - A Python extension that provides shm_open() and shm_unlink() #define PY_SSIZE_T_CLEAN #include -#include "structmember.h" // for shm_open() and shm_unlink() #ifdef HAVE_SYS_MMAN_H diff --git a/Modules/_multiprocessing/semaphore.c b/Modules/_multiprocessing/semaphore.c index 4be2deae377504bf2e2f7fbba95c1504eb74356a..ee490256d2a27e1ef3f2b3458a847af55f69c680 100644 --- a/Modules/_multiprocessing/semaphore.c +++ b/Modules/_multiprocessing/semaphore.c @@ -268,11 +268,8 @@ static PyObject * semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds) { int blocking = 1, res, err = 0; - double timeout; PyObject *timeout_obj = Py_None; struct timespec deadline = {0}; - struct timeval now; - long sec, nsec; static char *kwlist[] = {"block", "timeout", NULL}; @@ -285,19 +282,23 @@ semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds) Py_RETURN_TRUE; } - if (timeout_obj != Py_None) { - timeout = PyFloat_AsDouble(timeout_obj); - if (PyErr_Occurred()) + int use_deadline = (timeout_obj != Py_None); + if (use_deadline) { + double timeout = PyFloat_AsDouble(timeout_obj); + if (PyErr_Occurred()) { return NULL; - if (timeout < 0.0) + } + if (timeout < 0.0) { timeout = 0.0; + } + struct timeval now; if (gettimeofday(&now, NULL) < 0) { PyErr_SetFromErrno(PyExc_OSError); return NULL; } - sec = (long) timeout; - nsec = (long) (1e9 * (timeout - sec) + 0.5); + long sec = (long) timeout; + long nsec = (long) (1e9 * (timeout - sec) + 0.5); deadline.tv_sec = now.tv_sec + sec; deadline.tv_nsec = now.tv_usec * 1000 + nsec; deadline.tv_sec += (deadline.tv_nsec / 1000000000); @@ -315,7 +316,7 @@ semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds) /* Couldn't acquire immediately, need to block */ do { Py_BEGIN_ALLOW_THREADS - if (timeout_obj == Py_None) { + if (!use_deadline) { res = sem_wait(self->handle); } else { diff --git a/Modules/_operator.c b/Modules/_operator.c index 5aa229fa781ebb134310b5068f504fc00b424222..6f8f68f4599e4f2d69665aa3294c7da528926386 100644 --- a/Modules/_operator.c +++ b/Modules/_operator.c @@ -735,7 +735,7 @@ _tscmp(const unsigned char *a, const unsigned char *b, volatile const unsigned char *left; volatile const unsigned char *right; Py_ssize_t i; - unsigned char result; + volatile unsigned char result; /* loop count depends on length of b */ length = len_b; @@ -785,6 +785,8 @@ _operator_length_hint_impl(PyObject *module, PyObject *obj, return PyObject_LengthHint(obj, default_value); } +/* NOTE: Keep in sync with _hashopenssl.c implementation. */ + /*[clinic input] _operator._compare_digest = _operator.eq @@ -1170,7 +1172,7 @@ attrgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) for (idx = 0; idx < nattrs; ++idx) { PyObject *item = PyTuple_GET_ITEM(args, idx); Py_ssize_t item_len; - void *data; + const void *data; unsigned int kind; int dot_count; @@ -1682,7 +1684,7 @@ methodcaller_reduce(methodcallerobject *mc, PyObject *Py_UNUSED(ignored)) newargs[0] = (PyObject *)Py_TYPE(mc); newargs[1] = mc->name; - constructor = _PyObject_FastCallDict(partial, newargs, 2, mc->kwds); + constructor = PyObject_VectorcallDict(partial, newargs, 2, mc->kwds); Py_DECREF(partial); return Py_BuildValue("NO", constructor, mc->args); @@ -1746,16 +1748,38 @@ static PyTypeObject methodcaller_type = { }; -/* Initialization function for the module (*must* be called PyInit__operator) */ +static int +operator_exec(PyObject *module) +{ + PyTypeObject *types[] = { + &itemgetter_type, + &attrgetter_type, + &methodcaller_type + }; + + for (size_t i = 0; i < Py_ARRAY_LENGTH(types); i++) { + if (PyModule_AddType(module, types[i]) < 0) { + return -1; + } + } + + return 0; +} + + +static struct PyModuleDef_Slot operator_slots[] = { + {Py_mod_exec, operator_exec}, + {0, NULL} +}; static struct PyModuleDef operatormodule = { PyModuleDef_HEAD_INIT, "_operator", operator_doc, - -1, + 0, operator_methods, - NULL, + operator_slots, NULL, NULL, NULL @@ -1764,26 +1788,5 @@ static struct PyModuleDef operatormodule = { PyMODINIT_FUNC PyInit__operator(void) { - PyObject *m; - - /* Create the module and add the functions */ - m = PyModule_Create(&operatormodule); - if (m == NULL) - return NULL; - - if (PyType_Ready(&itemgetter_type) < 0) - return NULL; - Py_INCREF(&itemgetter_type); - PyModule_AddObject(m, "itemgetter", (PyObject *)&itemgetter_type); - - if (PyType_Ready(&attrgetter_type) < 0) - return NULL; - Py_INCREF(&attrgetter_type); - PyModule_AddObject(m, "attrgetter", (PyObject *)&attrgetter_type); - - if (PyType_Ready(&methodcaller_type) < 0) - return NULL; - Py_INCREF(&methodcaller_type); - PyModule_AddObject(m, "methodcaller", (PyObject *)&methodcaller_type); - return m; + return PyModuleDef_Init(&operatormodule); } diff --git a/Modules/_peg_parser.c b/Modules/_peg_parser.c new file mode 100644 index 0000000000000000000000000000000000000000..ca2a3cf7b5fd8078c5cc25978c097a63889b7f2f --- /dev/null +++ b/Modules/_peg_parser.c @@ -0,0 +1,153 @@ +#include +#include "pegen_interface.h" + +static int +_mode_str_to_int(char *mode_str) +{ + int mode; + if (strcmp(mode_str, "exec") == 0) { + mode = Py_file_input; + } + else if (strcmp(mode_str, "eval") == 0) { + mode = Py_eval_input; + } + else if (strcmp(mode_str, "single") == 0) { + mode = Py_single_input; + } + else { + mode = -1; + } + return mode; +} + +static mod_ty +_run_parser(char *str, char *filename, int mode, PyCompilerFlags *flags, PyArena *arena, int oldparser) +{ + mod_ty mod; + if (!oldparser) { + mod = PyPegen_ASTFromString(str, filename, mode, flags, arena); + } + else { + mod = PyParser_ASTFromString(str, filename, mode, flags, arena); + } + return mod; +} + +PyObject * +_Py_compile_string(PyObject *self, PyObject *args, PyObject *kwds) +{ + static char *keywords[] = {"string", "filename", "mode", "oldparser", NULL}; + char *the_string; + char *filename = ""; + char *mode_str = "exec"; + int oldparser = 0; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|ssp", keywords, + &the_string, &filename, &mode_str, &oldparser)) { + return NULL; + } + + int mode = _mode_str_to_int(mode_str); + if (mode == -1) { + return PyErr_Format(PyExc_ValueError, "mode must be either 'exec' or 'eval' or 'single'"); + } + + PyCompilerFlags flags = _PyCompilerFlags_INIT; + flags.cf_flags = PyCF_IGNORE_COOKIE; + + PyArena *arena = PyArena_New(); + if (arena == NULL) { + return NULL; + } + + mod_ty mod = _run_parser(the_string, filename, mode, &flags, arena, oldparser); + if (mod == NULL) { + PyArena_Free(arena); + return NULL; + } + + PyObject *filename_ob = PyUnicode_DecodeFSDefault(filename); + if (filename_ob == NULL) { + PyArena_Free(arena); + return NULL; + } + PyCodeObject *result = PyAST_CompileObject(mod, filename_ob, &flags, -1, arena); + Py_XDECREF(filename_ob); + PyArena_Free(arena); + return (PyObject *)result; +} + +PyObject * +_Py_parse_string(PyObject *self, PyObject *args, PyObject *kwds) +{ + static char *keywords[] = {"string", "filename", "mode", "oldparser", "ast", NULL}; + char *the_string; + char *filename = ""; + char *mode_str = "exec"; + int oldparser = 0; + int ast = 1; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|sspp", keywords, + &the_string, &filename, &mode_str, &oldparser, &ast)) { + return NULL; + } + + int mode = _mode_str_to_int(mode_str); + if (mode == -1) { + return PyErr_Format(PyExc_ValueError, "mode must be either 'exec' or 'eval' or 'single'"); + } + + PyCompilerFlags flags = _PyCompilerFlags_INIT; + flags.cf_flags = PyCF_IGNORE_COOKIE; + + PyArena *arena = PyArena_New(); + if (arena == NULL) { + return NULL; + } + + mod_ty mod = _run_parser(the_string, filename, mode, &flags, arena, oldparser); + if (mod == NULL) { + PyArena_Free(arena); + return NULL; + } + + PyObject *result; + if (ast) { + result = PyAST_mod2obj(mod); + } + else { + Py_INCREF(Py_None); + result = Py_None; + } + PyArena_Free(arena); + return result; +} + +static PyMethodDef ParseMethods[] = { + { + "parse_string", + (PyCFunction)(void (*)(void))_Py_parse_string, + METH_VARARGS|METH_KEYWORDS, + "Parse a string, return an AST." + }, + { + "compile_string", + (PyCFunction)(void (*)(void))_Py_compile_string, + METH_VARARGS|METH_KEYWORDS, + "Compile a string, return a code object." + }, + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + +static struct PyModuleDef parsemodule = { + PyModuleDef_HEAD_INIT, + .m_name = "peg_parser", + .m_doc = "A parser.", + .m_methods = ParseMethods, +}; + +PyMODINIT_FUNC +PyInit__peg_parser(void) +{ + return PyModule_Create(&parsemodule); +} diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 42ce62fc7cdf4e18e3af6d18a256e1df15b96221..8dea2c6ea0c203e92c05c3aef48ffe95fe1953cf 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -9,7 +9,7 @@ #endif #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef PyDoc_STRVAR(pickle_module_doc, "Optimized C implementation for the Python pickle module."); @@ -359,7 +359,7 @@ _Pickle_FastCall(PyObject *func, PyObject *obj) { PyObject *result; - result = PyObject_CallFunctionObjArgs(func, obj, NULL); + result = PyObject_CallOneArg(func, obj); Py_DECREF(obj); return result; } @@ -420,7 +420,7 @@ call_method(PyObject *func, PyObject *self, PyObject *obj) return PyObject_CallFunctionObjArgs(func, self, obj, NULL); } else { - return PyObject_CallFunctionObjArgs(func, obj, NULL); + return PyObject_CallOneArg(func, obj); } } @@ -461,7 +461,7 @@ Pdata_New(void) if (!(self = PyObject_New(Pdata, &Pdata_Type))) return NULL; - Py_SIZE(self) = 0; + Py_SET_SIZE(self, 0); self->mark_set = 0; self->fence = 0; self->allocated = 8; @@ -488,7 +488,7 @@ Pdata_clear(Pdata *self, Py_ssize_t clearto) while (--i >= clearto) { Py_CLEAR(self->data[i]); } - Py_SIZE(self) = clearto; + Py_SET_SIZE(self, clearto); return 0; } @@ -539,7 +539,8 @@ Pdata_pop(Pdata *self) Pdata_stack_underflow(self); return NULL; } - return self->data[--Py_SIZE(self)]; + Py_SET_SIZE(self, Py_SIZE(self) - 1); + return self->data[Py_SIZE(self)]; } #define PDATA_POP(D, V) do { (V) = Pdata_pop((D)); } while (0) @@ -549,7 +550,8 @@ Pdata_push(Pdata *self, PyObject *obj) if (Py_SIZE(self) == self->allocated && Pdata_grow(self) < 0) { return -1; } - self->data[Py_SIZE(self)++] = obj; + self->data[Py_SIZE(self)] = obj; + Py_SET_SIZE(self, Py_SIZE(self) + 1); return 0; } @@ -579,7 +581,7 @@ Pdata_poptuple(Pdata *self, Py_ssize_t start) for (i = start, j = 0; j < len; i++, j++) PyTuple_SET_ITEM(tuple, j, self->data[i]); - Py_SIZE(self) = start; + Py_SET_SIZE(self, start); return tuple; } @@ -596,7 +598,7 @@ Pdata_poplist(Pdata *self, Py_ssize_t start) for (i = start, j = 0; j < len; i++, j++) PyList_SET_ITEM(list, j, self->data[i]); - Py_SIZE(self) = start; + Py_SET_SIZE(self, start); return list; } @@ -1274,7 +1276,7 @@ _Unpickler_ReadFromFile(UnpicklerObject *self, Py_ssize_t n) return -1; if (n == READ_WHOLE_LINE) { - data = _PyObject_CallNoArg(self->readline); + data = PyObject_CallNoArgs(self->readline); } else { PyObject *len; @@ -2007,7 +2009,7 @@ fast_save_enter(PicklerObject *self, PyObject *obj) PyErr_Format(PyExc_ValueError, "fast mode: can't pickle cyclic objects " "including object type %.200s at %p", - obj->ob_type->tp_name, obj); + Py_TYPE(obj)->tp_name, obj); self->fast_nesting = -1; return 0; } @@ -2327,7 +2329,7 @@ _Pickler_write_bytes(PicklerObject *self, return -1; } } - result = PyObject_CallFunctionObjArgs(self->write, payload, NULL); + result = PyObject_CallOneArg(self->write, payload); Py_XDECREF(mem); if (result == NULL) { return -1; @@ -2535,8 +2537,7 @@ save_picklebuffer(PicklerObject *self, PyObject *obj) } int in_band = 1; if (self->buffer_callback != NULL) { - PyObject *ret = PyObject_CallFunctionObjArgs(self->buffer_callback, - obj, NULL); + PyObject *ret = PyObject_CallOneArg(self->buffer_callback, obj); if (ret == NULL) { return -1; } @@ -2580,7 +2581,7 @@ raw_unicode_escape(PyObject *obj) { char *p; Py_ssize_t i, size; - void *data; + const void *data; unsigned int kind; _PyBytesWriter writer; @@ -3337,7 +3338,7 @@ save_dict(PicklerObject *self, PyObject *obj) } else { _Py_IDENTIFIER(items); - items = _PyObject_CallMethodId(obj, &PyId_items, NULL); + items = _PyObject_CallMethodIdNoArgs(obj, &PyId_items); if (items == NULL) goto error; iter = PyObject_GetIter(items); @@ -4353,8 +4354,7 @@ save(PicklerObject *self, PyObject *obj, int pers_save) * regular reduction mechanism. */ if (self->reducer_override != NULL) { - reduce_value = PyObject_CallFunctionObjArgs(self->reducer_override, - obj, NULL); + reduce_value = PyObject_CallOneArg(self->reducer_override, obj); if (reduce_value == NULL) { goto error; } @@ -4441,7 +4441,7 @@ save(PicklerObject *self, PyObject *obj, int pers_save) goto error; } if (reduce_func != NULL) { - reduce_value = _PyObject_CallNoArg(reduce_func); + reduce_value = PyObject_CallNoArgs(reduce_func); } else { PickleState *st = _Pickle_GetGlobalState(); @@ -4974,7 +4974,7 @@ Pickler_set_memo(PicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored)) return -1; } - if (Py_TYPE(obj) == &PicklerMemoProxyType) { + if (Py_IS_TYPE(obj, &PicklerMemoProxyType)) { PicklerObject *pickler = ((PicklerMemoProxyObject *)obj)->pickler; @@ -5821,7 +5821,7 @@ instantiate(PyObject *cls, PyObject *args) return NULL; } if (func == NULL) { - return _PyObject_CallMethodIdObjArgs(cls, &PyId___new__, cls, NULL); + return _PyObject_CallMethodIdOneArg(cls, &PyId___new__, cls); } Py_DECREF(func); } @@ -6180,7 +6180,7 @@ load_pop(UnpicklerObject *self) else { len--; Py_DECREF(self->stack->data[len]); - Py_SIZE(self->stack) = len; + Py_SET_SIZE(self->stack, len); } return 0; } @@ -6235,8 +6235,10 @@ load_get(UnpicklerObject *self) value = _Unpickler_MemoGet(self, idx); if (value == NULL) { - if (!PyErr_Occurred()) - PyErr_SetObject(PyExc_KeyError, key); + if (!PyErr_Occurred()) { + PickleState *st = _Pickle_GetGlobalState(); + PyErr_Format(st->UnpicklingError, "Memo value not found at index %ld", idx); + } Py_DECREF(key); return -1; } @@ -6262,7 +6264,8 @@ load_binget(UnpicklerObject *self) if (value == NULL) { PyObject *key = PyLong_FromSsize_t(idx); if (key != NULL) { - PyErr_SetObject(PyExc_KeyError, key); + PickleState *st = _Pickle_GetGlobalState(); + PyErr_Format(st->UnpicklingError, "Memo value not found at index %ld", idx); Py_DECREF(key); } return -1; @@ -6288,7 +6291,8 @@ load_long_binget(UnpicklerObject *self) if (value == NULL) { PyObject *key = PyLong_FromSsize_t(idx); if (key != NULL) { - PyErr_SetObject(PyExc_KeyError, key); + PickleState *st = _Pickle_GetGlobalState(); + PyErr_Format(st->UnpicklingError, "Memo value not found at index %ld", idx); Py_DECREF(key); } return -1; @@ -6537,13 +6541,13 @@ do_append(UnpicklerObject *self, Py_ssize_t x) result = _Pickle_FastCall(append_func, value); if (result == NULL) { Pdata_clear(self->stack, i + 1); - Py_SIZE(self->stack) = x; + Py_SET_SIZE(self->stack, x); Py_DECREF(append_func); return -1; } Py_DECREF(result); } - Py_SIZE(self->stack) = x; + Py_SET_SIZE(self->stack, x); Py_DECREF(append_func); } } @@ -6665,12 +6669,12 @@ load_additems(UnpicklerObject *self) result = _Pickle_FastCall(add_func, item); if (result == NULL) { Pdata_clear(self->stack, i + 1); - Py_SIZE(self->stack) = mark; + Py_SET_SIZE(self->stack, mark); return -1; } Py_DECREF(result); } - Py_SIZE(self->stack) = mark; + Py_SET_SIZE(self->stack, mark); } return 0; @@ -7528,7 +7532,7 @@ Unpickler_set_memo(UnpicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored return -1; } - if (Py_TYPE(obj) == &UnpicklerMemoProxyType) { + if (Py_IS_TYPE(obj, &UnpicklerMemoProxyType)) { UnpicklerObject *unpickler = ((UnpicklerMemoProxyObject *)obj)->unpickler; @@ -7882,6 +7886,7 @@ _pickle_load_impl(PyObject *module, PyObject *file, int fix_imports, _pickle.loads data: object + / * fix_imports: bool = True encoding: str = 'ASCII' @@ -7908,7 +7913,7 @@ static PyObject * _pickle_loads_impl(PyObject *module, PyObject *data, int fix_imports, const char *encoding, const char *errors, PyObject *buffers) -/*[clinic end generated code: output=82ac1e6b588e6d02 input=9c2ab6a0960185ea]*/ +/*[clinic end generated code: output=82ac1e6b588e6d02 input=b3615540d0535087]*/ { PyObject *result; UnpicklerObject *unpickler = _Unpickler_New(); @@ -8002,10 +8007,6 @@ PyInit__pickle(void) return m; } - if (PyType_Ready(&Unpickler_Type) < 0) - return NULL; - if (PyType_Ready(&Pickler_Type) < 0) - return NULL; if (PyType_Ready(&Pdata_Type) < 0) return NULL; if (PyType_Ready(&PicklerMemoProxyType) < 0) @@ -8019,16 +8020,15 @@ PyInit__pickle(void) return NULL; /* Add types */ - Py_INCREF(&Pickler_Type); - if (PyModule_AddObject(m, "Pickler", (PyObject *)&Pickler_Type) < 0) + if (PyModule_AddType(m, &Pickler_Type) < 0) { return NULL; - Py_INCREF(&Unpickler_Type); - if (PyModule_AddObject(m, "Unpickler", (PyObject *)&Unpickler_Type) < 0) + } + if (PyModule_AddType(m, &Unpickler_Type) < 0) { return NULL; - Py_INCREF(&PyPickleBuffer_Type); - if (PyModule_AddObject(m, "PickleBuffer", - (PyObject *)&PyPickleBuffer_Type) < 0) + } + if (PyModule_AddType(m, &PyPickleBuffer_Type) < 0) { return NULL; + } st = _Pickle_GetState(m); diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index e693e532069079b47eb32c7942d085f11c6f29d4..d64e0a1cfa06d6176d465fc0c91d1e389b47437d 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -8,7 +8,7 @@ #ifdef HAVE_SYS_TYPES_H #include #endif -#if defined(HAVE_SYS_STAT_H) && defined(__FreeBSD__) +#if defined(HAVE_SYS_STAT_H) #include #endif #ifdef HAVE_SYS_SYSCALL_H @@ -20,6 +20,11 @@ #ifdef HAVE_DIRENT_H #include #endif +#ifdef HAVE_GRP_H +#include +#endif /* HAVE_GRP_H */ + +#include "posixmodule.h" #ifdef _Py_MEMORY_SANITIZER # include @@ -41,26 +46,49 @@ # endif #endif -#if defined(__FreeBSD__) || (defined(__APPLE__) && defined(__MACH__)) +#if defined(__FreeBSD__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__DragonFly__) # define FD_DIR "/dev/fd" #else # define FD_DIR "/proc/self/fd" #endif +#ifdef NGROUPS_MAX +#define MAX_GROUPS NGROUPS_MAX +#else +#define MAX_GROUPS 64 +#endif + #define POSIX_CALL(call) do { if ((call) == -1) goto error; } while (0) +typedef struct { + PyObject* disable; + PyObject* enable; + PyObject* isenabled; +} _posixsubprocessstate; + +static struct PyModuleDef _posixsubprocessmodule; + +static inline _posixsubprocessstate* +get_posixsubprocess_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_posixsubprocessstate *)state; +} + +#define _posixsubprocessstate_global get_posixsubprocess_state(PyState_FindModule(&_posixsubprocessmodule)) /* If gc was disabled, call gc.enable(). Return 0 on success. */ static int _enable_gc(int need_to_reenable_gc, PyObject *gc_module) { PyObject *result; - _Py_IDENTIFIER(enable); PyObject *exctype, *val, *tb; if (need_to_reenable_gc) { PyErr_Fetch(&exctype, &val, &tb); - result = _PyObject_CallMethodId(gc_module, &PyId_enable, NULL); + result = PyObject_CallMethodNoArgs( + gc_module, _posixsubprocessstate_global->enable); if (exctype != NULL) { PyErr_Restore(exctype, val, tb); } @@ -88,9 +116,9 @@ _pos_int_from_ascii(const char *name) } -#if defined(__FreeBSD__) +#if defined(__FreeBSD__) || defined(__DragonFly__) /* When /dev/fd isn't mounted it is often a static directory populated - * with 0 1 2 or entries for 0 .. 63 on FreeBSD, NetBSD and OpenBSD. + * with 0 1 2 or entries for 0 .. 63 on FreeBSD, NetBSD, OpenBSD and DragonFlyBSD. * NetBSD and OpenBSD have a /proc fs available (though not necessarily * mounted) and do not have fdescfs for /dev/fd. MacOS X has a devfs * that properly supports /dev/fd. @@ -236,9 +264,15 @@ _close_fds_by_brute_force(long start_fd, PyObject *py_fds_to_keep) start_fd = keep_fd + 1; } if (start_fd <= end_fd) { +#if defined(__FreeBSD__) + /* Any errors encountered while closing file descriptors are ignored */ + closefrom(start_fd); +#else for (fd_num = start_fd; fd_num < end_fd; ++fd_num) { - close(fd_num); + /* Ignore errors */ + (void)close(fd_num); } +#endif } } @@ -343,7 +377,7 @@ _close_open_fds_maybe_unsafe(long start_fd, PyObject* py_fds_to_keep) ++start_fd; #endif -#if defined(__FreeBSD__) +#if defined(__FreeBSD__) || defined(__DragonFly__) if (!_is_fdescfs_mounted_on_dev_fd()) proc_fd_dir = NULL; else @@ -405,6 +439,9 @@ child_exec(char *const exec_array[], int errpipe_read, int errpipe_write, int close_fds, int restore_signals, int call_setsid, + int call_setgid, gid_t gid, + int call_setgroups, size_t groups_size, const gid_t *groups, + int call_setuid, uid_t uid, int child_umask, PyObject *py_fds_to_keep, PyObject *preexec_fn, PyObject *preexec_fn_args_tuple) @@ -474,6 +511,9 @@ child_exec(char *const exec_array[], if (cwd) POSIX_CALL(chdir(cwd)); + if (child_umask >= 0) + umask(child_umask); /* umask() always succeeds. */ + if (restore_signals) _Py_RestoreSignals(); @@ -482,6 +522,22 @@ child_exec(char *const exec_array[], POSIX_CALL(setsid()); #endif +#ifdef HAVE_SETGROUPS + if (call_setgroups) + POSIX_CALL(setgroups(groups_size, groups)); +#endif /* HAVE_SETGROUPS */ + +#ifdef HAVE_SETREGID + if (call_setgid) + POSIX_CALL(setregid(gid, gid)); +#endif /* HAVE_SETREGID */ + +#ifdef HAVE_SETREUID + if (call_setuid) + POSIX_CALL(setreuid(uid, uid)); +#endif /* HAVE_SETREUID */ + + reached_preexec = 1; if (preexec_fn != Py_None && preexec_fn_args_tuple) { /* This is where the user has asked us to deadlock their program. */ @@ -561,30 +617,38 @@ subprocess_fork_exec(PyObject* self, PyObject *args) PyObject *env_list, *preexec_fn; PyObject *process_args, *converted_args = NULL, *fast_args = NULL; PyObject *preexec_fn_args_tuple = NULL; + PyObject *groups_list; + PyObject *uid_object, *gid_object; int p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite; int errpipe_read, errpipe_write, close_fds, restore_signals; int call_setsid; - PyObject *cwd_obj, *cwd_obj2; + int call_setgid = 0, call_setgroups = 0, call_setuid = 0; + uid_t uid; + gid_t gid, *groups = NULL; + int child_umask; + PyObject *cwd_obj, *cwd_obj2 = NULL; const char *cwd; pid_t pid; int need_to_reenable_gc = 0; char *const *exec_array, *const *argv = NULL, *const *envp = NULL; - Py_ssize_t arg_num; + Py_ssize_t arg_num, num_groups = 0; int need_after_fork = 0; int saved_errno = 0; if (!PyArg_ParseTuple( - args, "OOpO!OOiiiiiiiiiiO:fork_exec", + args, "OOpO!OOiiiiiiiiiiOOOiO:fork_exec", &process_args, &executable_list, &close_fds, &PyTuple_Type, &py_fds_to_keep, &cwd_obj, &env_list, &p2cread, &p2cwrite, &c2pread, &c2pwrite, &errread, &errwrite, &errpipe_read, &errpipe_write, - &restore_signals, &call_setsid, &preexec_fn)) + &restore_signals, &call_setsid, + &gid_object, &groups_list, &uid_object, &child_umask, + &preexec_fn)) return NULL; if ((preexec_fn != Py_None) && - (_PyInterpreterState_Get() != PyInterpreterState_Main())) { + (PyInterpreterState_Get() != PyInterpreterState_Main())) { PyErr_SetString(PyExc_RuntimeError, "preexec_fn not supported within subinterpreters"); return NULL; @@ -599,16 +663,23 @@ subprocess_fork_exec(PyObject* self, PyObject *args) return NULL; } + PyInterpreterState *interp = PyInterpreterState_Get(); + const PyConfig *config = _PyInterpreterState_GetConfig(interp); + if (config->_isolated_interpreter) { + PyErr_SetString(PyExc_RuntimeError, + "subprocess not supported for isolated subinterpreters"); + return NULL; + } + /* We need to call gc.disable() when we'll be calling preexec_fn */ if (preexec_fn != Py_None) { PyObject *result; - _Py_IDENTIFIER(isenabled); - _Py_IDENTIFIER(disable); gc_module = PyImport_ImportModule("gc"); if (gc_module == NULL) return NULL; - result = _PyObject_CallMethodId(gc_module, &PyId_isenabled, NULL); + result = PyObject_CallMethodNoArgs( + gc_module, _posixsubprocessstate_global->isenabled); if (result == NULL) { Py_DECREF(gc_module); return NULL; @@ -619,7 +690,8 @@ subprocess_fork_exec(PyObject* self, PyObject *args) Py_DECREF(gc_module); return NULL; } - result = _PyObject_CallMethodId(gc_module, &PyId_disable, NULL); + result = PyObject_CallMethodNoArgs( + gc_module, _posixsubprocessstate_global->disable); if (result == NULL) { Py_DECREF(gc_module); return NULL; @@ -676,7 +748,86 @@ subprocess_fork_exec(PyObject* self, PyObject *args) cwd = PyBytes_AsString(cwd_obj2); } else { cwd = NULL; - cwd_obj2 = NULL; + } + + if (groups_list != Py_None) { +#ifdef HAVE_SETGROUPS + Py_ssize_t i; + gid_t gid; + + if (!PyList_Check(groups_list)) { + PyErr_SetString(PyExc_TypeError, + "setgroups argument must be a list"); + goto cleanup; + } + num_groups = PySequence_Size(groups_list); + + if (num_groups < 0) + goto cleanup; + + if (num_groups > MAX_GROUPS) { + PyErr_SetString(PyExc_ValueError, "too many groups"); + goto cleanup; + } + + if ((groups = PyMem_RawMalloc(num_groups * sizeof(gid_t))) == NULL) { + PyErr_SetString(PyExc_MemoryError, + "failed to allocate memory for group list"); + goto cleanup; + } + + for (i = 0; i < num_groups; i++) { + PyObject *elem; + elem = PySequence_GetItem(groups_list, i); + if (!elem) + goto cleanup; + if (!PyLong_Check(elem)) { + PyErr_SetString(PyExc_TypeError, + "groups must be integers"); + Py_DECREF(elem); + goto cleanup; + } else { + if (!_Py_Gid_Converter(elem, &gid)) { + Py_DECREF(elem); + PyErr_SetString(PyExc_ValueError, "invalid group id"); + goto cleanup; + } + groups[i] = gid; + } + Py_DECREF(elem); + } + call_setgroups = 1; + +#else /* HAVE_SETGROUPS */ + PyErr_BadInternalCall(); + goto cleanup; +#endif /* HAVE_SETGROUPS */ + } + + if (gid_object != Py_None) { +#ifdef HAVE_SETREGID + if (!_Py_Gid_Converter(gid_object, &gid)) + goto cleanup; + + call_setgid = 1; + +#else /* HAVE_SETREGID */ + PyErr_BadInternalCall(); + goto cleanup; +#endif /* HAVE_SETREUID */ + } + + if (uid_object != Py_None) { +#ifdef HAVE_SETREUID + if (!_Py_Uid_Converter(uid_object, &uid)) + goto cleanup; + + call_setuid = 1; + +#else /* HAVE_SETREUID */ + PyErr_BadInternalCall(); + goto cleanup; +#endif /* HAVE_SETREUID */ } /* This must be the last thing done before fork() because we do not @@ -711,6 +862,8 @@ subprocess_fork_exec(PyObject* self, PyObject *args) p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, close_fds, restore_signals, call_setsid, + call_setgid, gid, call_setgroups, num_groups, groups, + call_setuid, uid, child_umask, py_fds_to_keep, preexec_fn, preexec_fn_args_tuple); _exit(255); return NULL; /* Dead code to avoid a potential compiler warning. */ @@ -735,6 +888,7 @@ subprocess_fork_exec(PyObject* self, PyObject *args) if (_enable_gc(need_to_reenable_gc, gc_module)) { pid = -1; } + PyMem_RawFree(groups); Py_XDECREF(preexec_fn_args_tuple); Py_XDECREF(gc_module); @@ -749,12 +903,15 @@ subprocess_fork_exec(PyObject* self, PyObject *args) return PyLong_FromPid(pid); cleanup: + Py_XDECREF(cwd_obj2); if (envp) _Py_FreeCharPArray(envp); if (argv) _Py_FreeCharPArray(argv); if (exec_array) _Py_FreeCharPArray(exec_array); + + PyMem_RawFree(groups); Py_XDECREF(converted_args); Py_XDECREF(fast_args); Py_XDECREF(preexec_fn_args_tuple); @@ -765,16 +922,22 @@ subprocess_fork_exec(PyObject* self, PyObject *args) PyDoc_STRVAR(subprocess_fork_exec_doc, -"fork_exec(args, executable_list, close_fds, cwd, env,\n\ +"fork_exec(args, executable_list, close_fds, pass_fds, cwd, env,\n\ p2cread, p2cwrite, c2pread, c2pwrite,\n\ errread, errwrite, errpipe_read, errpipe_write,\n\ - restore_signals, call_setsid, preexec_fn)\n\ + restore_signals, call_setsid,\n\ + gid, groups_list, uid,\n\ + preexec_fn)\n\ \n\ Forks a child process, closes parent file descriptors as appropriate in the\n\ child and dups the few that are needed before calling exec() in the child\n\ process.\n\ \n\ -The preexec_fn, if supplied, will be called immediately before exec.\n\ +If close_fds is true, close file descriptors 3 and higher, except those listed\n\ +in the sorted tuple pass_fds.\n\ +\n\ +The preexec_fn, if supplied, will be called immediately before closing file\n\ +descriptors and exec.\n\ WARNING: preexec_fn is NOT SAFE if your application uses threads.\n\ It may trigger infrequent, difficult to debug deadlocks.\n\ \n\ @@ -798,16 +961,56 @@ static PyMethodDef module_methods[] = { }; +static int _posixsubprocess_traverse(PyObject *m, visitproc visit, void *arg) { + Py_VISIT(get_posixsubprocess_state(m)->disable); + Py_VISIT(get_posixsubprocess_state(m)->enable); + Py_VISIT(get_posixsubprocess_state(m)->isenabled); + return 0; +} + +static int _posixsubprocess_clear(PyObject *m) { + Py_CLEAR(get_posixsubprocess_state(m)->disable); + Py_CLEAR(get_posixsubprocess_state(m)->enable); + Py_CLEAR(get_posixsubprocess_state(m)->isenabled); + return 0; +} + +static void _posixsubprocess_free(void *m) { + _posixsubprocess_clear((PyObject *)m); +} + static struct PyModuleDef _posixsubprocessmodule = { PyModuleDef_HEAD_INIT, "_posixsubprocess", module_doc, - -1, /* No memory is needed. */ + sizeof(_posixsubprocessstate), module_methods, + NULL, + _posixsubprocess_traverse, + _posixsubprocess_clear, + _posixsubprocess_free, }; PyMODINIT_FUNC PyInit__posixsubprocess(void) { - return PyModule_Create(&_posixsubprocessmodule); + PyObject* m; + + m = PyState_FindModule(&_posixsubprocessmodule); + if (m != NULL) { + Py_INCREF(m); + return m; + } + + m = PyModule_Create(&_posixsubprocessmodule); + if (m == NULL) { + return NULL; + } + + get_posixsubprocess_state(m)->disable = PyUnicode_InternFromString("disable"); + get_posixsubprocess_state(m)->enable = PyUnicode_InternFromString("enable"); + get_posixsubprocess_state(m)->isenabled = PyUnicode_InternFromString("isenabled"); + + PyState_AddModule(m, &_posixsubprocessmodule); + return m; } diff --git a/Modules/_queuemodule.c b/Modules/_queuemodule.c index e033da50a5ee3b47addf3b6c63515426ae27e83a..b155ea942398b4a2dd6b91b77fce5a48d86d39ac 100644 --- a/Modules/_queuemodule.c +++ b/Modules/_queuemodule.c @@ -1,6 +1,5 @@ #include "Python.h" -#include "structmember.h" /* offsetof */ -#include "pythread.h" +#include // offsetof() /*[clinic input] module _queue @@ -302,6 +301,8 @@ static PyMethodDef simplequeue_methods[] = { _QUEUE_SIMPLEQUEUE_PUT_METHODDEF _QUEUE_SIMPLEQUEUE_PUT_NOWAIT_METHODDEF _QUEUE_SIMPLEQUEUE_QSIZE_METHODDEF + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* sentinel */ }; @@ -390,11 +391,9 @@ PyInit__queue(void) if (PyModule_AddObject(m, "Empty", EmptyError) < 0) return NULL; - if (PyType_Ready(&PySimpleQueueType) < 0) - return NULL; - Py_INCREF(&PySimpleQueueType); - if (PyModule_AddObject(m, "SimpleQueue", (PyObject *)&PySimpleQueueType) < 0) + if (PyModule_AddType(m, &PySimpleQueueType) < 0) { return NULL; + } return m; } diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c index 4e9ac4073c77740925f27cbeaaedaa8e6b2b2558..a402b937f70af82a7235d7fadec041ca67cd9fb3 100644 --- a/Modules/_randommodule.c +++ b/Modules/_randommodule.c @@ -11,7 +11,7 @@ * renamed genrand_res53() to random_random() and wrapped in python calling/return code. - * genrand_int32() and the helper functions, init_genrand() + * genrand_uint32() and the helper functions, init_genrand() and init_by_array(), were declared static, wrapped in Python calling/return code. also, their global data references were replaced with structure references. @@ -67,9 +67,9 @@ /* ---------------------------------------------------------------*/ #include "Python.h" -#include /* for seeding to current time */ +#include "pycore_byteswap.h" // _Py_bswap32() #ifdef HAVE_PROCESS_H -# include /* needed for getpid() */ +# include // getpid() #endif /* Period parameters -- These are all magic. Don't change. */ @@ -79,15 +79,29 @@ #define UPPER_MASK 0x80000000U /* most significant w-r bits */ #define LOWER_MASK 0x7fffffffU /* least significant r bits */ +typedef struct { + PyObject *Random_Type; + PyObject *Long___abs__; +} _randomstate; + +static inline _randomstate* +get_random_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_randomstate *)state; +} + +static struct PyModuleDef _randommodule; + +#define _randomstate_global get_random_state(PyState_FindModule(&_randommodule)) + typedef struct { PyObject_HEAD int index; uint32_t state[N]; } RandomObject; -static PyTypeObject Random_Type; - -#define RandomObject_Check(v) (Py_TYPE(v) == &Random_Type) #include "clinic/_randommodule.c.h" @@ -102,7 +116,7 @@ class _random.Random "RandomObject *" "&Random_Type" /* generates a random number on [0,0xffffffff]-interval */ static uint32_t -genrand_int32(RandomObject *self) +genrand_uint32(RandomObject *self) { uint32_t y; static const uint32_t mag01[2] = {0x0U, MATRIX_A}; @@ -157,7 +171,7 @@ static PyObject * _random_Random_random_impl(RandomObject *self) /*[clinic end generated code: output=117ff99ee53d755c input=afb2a59cbbb00349]*/ { - uint32_t a=genrand_int32(self)>>5, b=genrand_int32(self)>>6; + uint32_t a=genrand_uint32(self)>>5, b=genrand_uint32(self)>>6; return PyFloat_FromDouble((a*67108864.0+b)*(1.0/9007199254740992.0)); } @@ -220,7 +234,7 @@ init_by_array(RandomObject *self, uint32_t init_key[], size_t key_length) static int random_seed_urandom(RandomObject *self) { - PY_UINT32_T key[N]; + uint32_t key[N]; if (_PyOS_URandomNonblock(key, sizeof(key)) < 0) { return -1; @@ -236,14 +250,14 @@ random_seed_time_pid(RandomObject *self) uint32_t key[5]; now = _PyTime_GetSystemClock(); - key[0] = (PY_UINT32_T)(now & 0xffffffffU); - key[1] = (PY_UINT32_T)(now >> 32); + key[0] = (uint32_t)(now & 0xffffffffU); + key[1] = (uint32_t)(now >> 32); - key[2] = (PY_UINT32_T)getpid(); + key[2] = (uint32_t)getpid(); now = _PyTime_GetMonotonicClock(); - key[3] = (PY_UINT32_T)(now & 0xffffffffU); - key[4] = (PY_UINT32_T)(now >> 32); + key[3] = (uint32_t)(now & 0xffffffffU); + key[4] = (uint32_t)(now >> 32); init_by_array(self, key, Py_ARRAY_LENGTH(key)); } @@ -272,10 +286,12 @@ random_seed(RandomObject *self, PyObject *arg) * So: if the arg is a PyLong, use its absolute value. * Otherwise use its hash value, cast to unsigned. */ - if (PyLong_Check(arg)) { + if (PyLong_CheckExact(arg)) { + n = PyNumber_Absolute(arg); + } else if (PyLong_Check(arg)) { /* Calling int.__abs__() prevents calling arg.__abs__(), which might return an invalid value. See issue #31478. */ - n = PyLong_Type.tp_as_number->nb_absolute(arg); + n = PyObject_CallOneArg(_randomstate_global->Long___abs__, arg); } else { Py_hash_t hash = PyObject_Hash(arg); @@ -458,14 +474,17 @@ _random_Random_getrandbits_impl(RandomObject *self, int k) uint32_t *wordarray; PyObject *result; - if (k <= 0) { + if (k < 0) { PyErr_SetString(PyExc_ValueError, - "number of bits must be greater than zero"); + "number of bits must be non-negative"); return NULL; } + if (k == 0) + return PyLong_FromLong(0); + if (k <= 32) /* Fast path */ - return PyLong_FromUnsignedLong(genrand_int32(self) >> (32 - k)); + return PyLong_FromUnsignedLong(genrand_uint32(self) >> (32 - k)); words = (k - 1) / 32 + 1; wordarray = (uint32_t *)PyMem_Malloc(words * 4); @@ -482,7 +501,7 @@ _random_Random_getrandbits_impl(RandomObject *self, int k) for (i = words - 1; i >= 0; i--, k -= 32) #endif { - r = genrand_int32(self); + r = genrand_uint32(self); if (k < 32) r >>= (32 - k); /* Drop least significant bits */ wordarray[i] = r; @@ -500,10 +519,12 @@ random_new(PyTypeObject *type, PyObject *args, PyObject *kwds) RandomObject *self; PyObject *tmp; - if (type == &Random_Type && !_PyArg_NoKeywords("Random", kwds)) + if (type == (PyTypeObject*)_randomstate_global->Random_Type && + !_PyArg_NoKeywords("Random()", kwds)) { return NULL; + } - self = (RandomObject *)type->tp_alloc(type, 0); + self = (RandomObject *)PyType_GenericAlloc(type, 0); if (self == NULL) return NULL; tmp = random_seed(self, args); @@ -515,6 +536,7 @@ random_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return (PyObject *)self; } + static PyMethodDef random_methods[] = { _RANDOM_RANDOM_RANDOM_METHODDEF _RANDOM_RANDOM_SEED_METHODDEF @@ -527,64 +549,56 @@ static PyMethodDef random_methods[] = { PyDoc_STRVAR(random_doc, "Random() -> create a random number generator with its own internal state."); -static PyTypeObject Random_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "_random.Random", /*tp_name*/ - sizeof(RandomObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - 0, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - PyObject_GenericGetAttr, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - random_doc, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - random_methods, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - random_new, /*tp_new*/ - PyObject_Free, /*tp_free*/ - 0, /*tp_is_gc*/ +static PyType_Slot Random_Type_slots[] = { + {Py_tp_doc, (void *)random_doc}, + {Py_tp_methods, random_methods}, + {Py_tp_new, random_new}, + {Py_tp_free, PyObject_Free}, + {0, 0}, +}; + +static PyType_Spec Random_Type_spec = { + "_random.Random", + sizeof(RandomObject), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + Random_Type_slots }; PyDoc_STRVAR(module_doc, "Module implements the Mersenne Twister random number generator."); +static int +_random_traverse(PyObject *module, visitproc visit, void *arg) +{ + Py_VISIT(get_random_state(module)->Random_Type); + return 0; +} + +static int +_random_clear(PyObject *module) +{ + Py_CLEAR(get_random_state(module)->Random_Type); + Py_CLEAR(get_random_state(module)->Long___abs__); + return 0; +} + +static void +_random_free(void *module) +{ + _random_clear((PyObject *)module); +} static struct PyModuleDef _randommodule = { PyModuleDef_HEAD_INIT, "_random", module_doc, - -1, - NULL, - NULL, + sizeof(_randomstate), NULL, NULL, - NULL + _random_traverse, + _random_clear, + _random_free, }; PyMODINIT_FUNC @@ -592,12 +606,41 @@ PyInit__random(void) { PyObject *m; - if (PyType_Ready(&Random_Type) < 0) + PyObject *Random_Type = PyType_FromSpec(&Random_Type_spec); + if (Random_Type == NULL) { return NULL; + } + m = PyModule_Create(&_randommodule); - if (m == NULL) + if (m == NULL) { + Py_DECREF(Random_Type); return NULL; - Py_INCREF(&Random_Type); - PyModule_AddObject(m, "Random", (PyObject *)&Random_Type); + } + get_random_state(m)->Random_Type = Random_Type; + + Py_INCREF(Random_Type); + PyModule_AddObject(m, "Random", Random_Type); + + /* Look up and save int.__abs__, which is needed in random_seed(). */ + PyObject *longval = NULL, *longtype = NULL; + longval = PyLong_FromLong(0); + if (longval == NULL) goto fail; + + longtype = PyObject_Type(longval); + if (longtype == NULL) goto fail; + + PyObject *abs = PyObject_GetAttrString(longtype, "__abs__"); + if (abs == NULL) goto fail; + + Py_DECREF(longtype); + Py_DECREF(longval); + get_random_state(m)->Long___abs__ = abs; + return m; + +fail: + Py_XDECREF(longtype); + Py_XDECREF(longval); + Py_DECREF(m); + return NULL; } diff --git a/Modules/_sha3/clinic/sha3module.c.h b/Modules/_sha3/clinic/sha3module.c.h index 554442df0ec28667288fe80298963c8d570b5908..1c79c269391ca2330a0bfa09eec742a4f7cb7f6e 100644 --- a/Modules/_sha3/clinic/sha3module.c.h +++ b/Modules/_sha3/clinic/sha3module.c.h @@ -2,6 +2,52 @@ preserve [clinic start generated code]*/ +PyDoc_STRVAR(py_sha3_new__doc__, +"sha3_224(data=b\'\', /, *, usedforsecurity=True)\n" +"--\n" +"\n" +"Return a new BLAKE2b hash object."); + +static PyObject * +py_sha3_new_impl(PyTypeObject *type, PyObject *data, int usedforsecurity); + +static PyObject * +py_sha3_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "sha3_224", 0}; + PyObject *argsbuf[2]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0; + PyObject *data = NULL; + int usedforsecurity = 1; + + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 1, 0, argsbuf); + if (!fastargs) { + goto exit; + } + if (nargs < 1) { + goto skip_optional_posonly; + } + noptargs--; + data = fastargs[0]; +skip_optional_posonly: + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(fastargs[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = py_sha3_new_impl(type, data, usedforsecurity); + +exit: + return return_value; +} + PyDoc_STRVAR(_sha3_sha3_224_copy__doc__, "copy($self, /)\n" "--\n" @@ -118,4 +164,4 @@ _sha3_shake_128_hexdigest(SHA3object *self, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=5b3e99b9a96471e8 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=c8a97b34e80def62 input=a9049054013a1b77]*/ diff --git a/Modules/_sha3/sha3module.c b/Modules/_sha3/sha3module.c index c1fb6185e243daf302f79bac42556c0b5ea13acb..c826b42df13f92f7f026cc3b00230786d78147a5 100644 --- a/Modules/_sha3/sha3module.c +++ b/Modules/_sha3/sha3module.c @@ -40,7 +40,7 @@ #elif PY_BIG_ENDIAN /* opt64 is not yet supported on big endian platforms */ #define KeccakOpt 32 -#elif SIZEOF_VOID_P == 8 && defined(PY_UINT64_T) +#elif SIZEOF_VOID_P == 8 /* opt64 works only on little-endian 64bit platforms with unsigned int64 */ #define KeccakOpt 64 #else @@ -48,9 +48,9 @@ #define KeccakOpt 32 #endif -#if KeccakOpt == 64 && defined(PY_UINT64_T) +#if KeccakOpt == 64 /* 64bit platforms with unsigned int64 */ - typedef PY_UINT64_T UINT64; + typedef uint64_t UINT64; typedef unsigned char UINT8; #endif @@ -169,21 +169,24 @@ newSHA3object(PyTypeObject *type) return newobj; } +/*[clinic input] +@classmethod +_sha3.sha3_224.__new__ as py_sha3_new + data: object(c_default="NULL") = b'' + / + * + usedforsecurity: bool = True + +Return a new BLAKE2b hash object. +[clinic start generated code]*/ static PyObject * -py_sha3_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) +py_sha3_new_impl(PyTypeObject *type, PyObject *data, int usedforsecurity) +/*[clinic end generated code: output=90409addc5d5e8b0 input=bcfcdf2e4368347a]*/ { SHA3object *self = NULL; Py_buffer buf = {NULL, NULL}; HashReturn res; - PyObject *data = NULL; - - if (!_PyArg_NoKeywords(_PyType_Name(type), kwargs)) { - return NULL; - } - if (!PyArg_UnpackTuple(args, _PyType_Name(type), 0, 1, &data)) { - return NULL; - } self = newSHA3object(type); if (self == NULL) { @@ -529,22 +532,22 @@ static PyGetSetDef SHA3_getseters[] = { } PyDoc_STRVAR(sha3_224__doc__, -"sha3_224([data]) -> SHA3 object\n\ +"sha3_224([data], *, usedforsecurity=True) -> SHA3 object\n\ \n\ Return a new SHA3 hash object with a hashbit length of 28 bytes."); PyDoc_STRVAR(sha3_256__doc__, -"sha3_256([data]) -> SHA3 object\n\ +"sha3_256([data], *, usedforsecurity=True) -> SHA3 object\n\ \n\ Return a new SHA3 hash object with a hashbit length of 32 bytes."); PyDoc_STRVAR(sha3_384__doc__, -"sha3_384([data]) -> SHA3 object\n\ +"sha3_384([data], *, usedforsecurity=True) -> SHA3 object\n\ \n\ Return a new SHA3 hash object with a hashbit length of 48 bytes."); PyDoc_STRVAR(sha3_512__doc__, -"sha3_512([data]) -> SHA3 object\n\ +"sha3_512([data], *, usedforsecurity=True) -> SHA3 object\n\ \n\ Return a new SHA3 hash object with a hashbit length of 64 bytes."); @@ -555,22 +558,22 @@ SHA3_TYPE(SHA3_512type, "_sha3.sha3_512", sha3_512__doc__, SHA3_methods); #ifdef PY_WITH_KECCAK PyDoc_STRVAR(keccak_224__doc__, -"keccak_224([data]) -> Keccak object\n\ +"keccak_224([data], *, usedforsecurity=True) -> Keccak object\n\ \n\ Return a new Keccak hash object with a hashbit length of 28 bytes."); PyDoc_STRVAR(keccak_256__doc__, -"keccak_256([data]) -> Keccak object\n\ +"keccak_256([data], *, usedforsecurity=True) -> Keccak object\n\ \n\ Return a new Keccak hash object with a hashbit length of 32 bytes."); PyDoc_STRVAR(keccak_384__doc__, -"keccak_384([data]) -> Keccak object\n\ +"keccak_384([data], *, usedforsecurity=True) -> Keccak object\n\ \n\ Return a new Keccak hash object with a hashbit length of 48 bytes."); PyDoc_STRVAR(keccak_512__doc__, -"keccak_512([data]) -> Keccak object\n\ +"keccak_512([data], *, usedforsecurity=True) -> Keccak object\n\ \n\ Return a new Keccak hash object with a hashbit length of 64 bytes."); @@ -672,12 +675,12 @@ static PyMethodDef SHAKE_methods[] = { }; PyDoc_STRVAR(shake_128__doc__, -"shake_128([data]) -> SHAKE object\n\ +"shake_128([data], *, usedforsecurity=True) -> SHAKE object\n\ \n\ Return a new SHAKE hash object."); PyDoc_STRVAR(shake_256__doc__, -"shake_256([data]) -> SHAKE object\n\ +"shake_256([data], *, usedforsecurity=True) -> SHAKE object\n\ \n\ Return a new SHAKE hash object."); @@ -710,7 +713,7 @@ PyInit__sha3(void) #define init_sha3type(name, type) \ do { \ - Py_TYPE(type) = &PyType_Type; \ + Py_SET_TYPE(type, &PyType_Type); \ if (PyType_Ready(type) < 0) { \ goto error; \ } \ diff --git a/Modules/_sqlite/cache.c b/Modules/_sqlite/cache.c index 4d4180421871de21ae82004ac58bc009ed224f0e..758fc022f7810871286b71fce740fa946ab58667 100644 --- a/Modules/_sqlite/cache.c +++ b/Modules/_sqlite/cache.c @@ -112,9 +112,8 @@ void pysqlite_cache_dealloc(pysqlite_Cache* self) Py_TYPE(self)->tp_free((PyObject*)self); } -PyObject* pysqlite_cache_get(pysqlite_Cache* self, PyObject* args) +PyObject* pysqlite_cache_get(pysqlite_Cache* self, PyObject* key) { - PyObject* key = args; pysqlite_Node* node; pysqlite_Node* ptr; PyObject* data; @@ -184,6 +183,9 @@ PyObject* pysqlite_cache_get(pysqlite_Cache* self, PyObject* args) } } + /* We cannot replace this by PyObject_CallOneArg() since + * PyObject_CallFunction() has a special case when using a + * single tuple as argument. */ data = PyObject_CallFunction(self->factory, "O", key); if (!data) { diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index ebe073f644aa50d77f8dd41484cbdd5d2f183743..d20339ca3f7dfdce5aca06dd1d34cb570a1474cb 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -23,15 +23,13 @@ #include "cache.h" #include "module.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include "connection.h" #include "statement.h" #include "cursor.h" #include "prepare_protocol.h" #include "util.h" -#include "pythread.h" - #define ACTION_FINALIZE 1 #define ACTION_RESET 2 @@ -79,7 +77,7 @@ int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject NULL }; - char* database; + const char* database; PyObject* database_obj; int detect_types = 0; PyObject* isolation_level = NULL; @@ -308,7 +306,7 @@ PyObject* pysqlite_connection_cursor(pysqlite_Connection* self, PyObject* args, factory = (PyObject*)&pysqlite_CursorType; } - cursor = PyObject_CallFunctionObjArgs(factory, (PyObject *)self, NULL); + cursor = PyObject_CallOneArg(factory, (PyObject *)self); if (cursor == NULL) return NULL; if (!PyObject_TypeCheck(cursor, &pysqlite_CursorType)) { @@ -550,7 +548,7 @@ PyObject* _pysqlite_build_py_params(sqlite3_context *context, int argc, sqlite3_ cur_value = argv[i]; switch (sqlite3_value_type(argv[i])) { case SQLITE_INTEGER: - cur_py_value = _pysqlite_long_from_int64(sqlite3_value_int64(cur_value)); + cur_py_value = PyLong_FromLongLong(sqlite3_value_int64(cur_value)); break; case SQLITE_FLOAT: cur_py_value = PyFloat_FromDouble(sqlite3_value_double(cur_value)); @@ -709,7 +707,7 @@ void _pysqlite_final_callback(sqlite3_context* context) PyErr_Fetch(&exception, &value, &tb); restore = 1; - function_result = _PyObject_CallMethodId(*aggregate_instance, &PyId_finalize, NULL); + function_result = _PyObject_CallMethodIdNoArgs(*aggregate_instance, &PyId_finalize); Py_DECREF(*aggregate_instance); @@ -975,7 +973,7 @@ static void _trace_callback(void* user_arg, const char* statement_string) py_statement = PyUnicode_DecodeUTF8(statement_string, strlen(statement_string), "replace"); if (py_statement) { - ret = PyObject_CallFunctionObjArgs((PyObject*)user_arg, py_statement, NULL); + ret = PyObject_CallOneArg((PyObject*)user_arg, py_statement); Py_DECREF(py_statement); } @@ -1192,9 +1190,9 @@ pysqlite_connection_set_isolation_level(pysqlite_Connection* self, PyObject* iso return -1; } - uppercase_level = _PyObject_CallMethodIdObjArgs( + uppercase_level = _PyObject_CallMethodIdOneArg( (PyObject *)&PyUnicode_Type, &PyId_upper, - isolation_level, NULL); + isolation_level); if (!uppercase_level) { return -1; } @@ -1230,7 +1228,7 @@ PyObject* pysqlite_connection_call(pysqlite_Connection* self, PyObject* args, Py if (!_PyArg_NoKeywords(MODULE_NAME ".Connection", kwargs)) return NULL; - if (!PyArg_ParseTuple(args, "O", &sql)) + if (!PyArg_ParseTuple(args, "U", &sql)) return NULL; _pysqlite_drop_unused_statement_references(self); @@ -1282,7 +1280,7 @@ PyObject* pysqlite_connection_execute(pysqlite_Connection* self, PyObject* args) PyObject* result = 0; PyObject* method = 0; - cursor = _PyObject_CallMethodId((PyObject*)self, &PyId_cursor, NULL); + cursor = _PyObject_CallMethodIdNoArgs((PyObject*)self, &PyId_cursor); if (!cursor) { goto error; } @@ -1311,7 +1309,7 @@ PyObject* pysqlite_connection_executemany(pysqlite_Connection* self, PyObject* a PyObject* result = 0; PyObject* method = 0; - cursor = _PyObject_CallMethodId((PyObject*)self, &PyId_cursor, NULL); + cursor = _PyObject_CallMethodIdNoArgs((PyObject*)self, &PyId_cursor); if (!cursor) { goto error; } @@ -1340,7 +1338,7 @@ PyObject* pysqlite_connection_executescript(pysqlite_Connection* self, PyObject* PyObject* result = 0; PyObject* method = 0; - cursor = _PyObject_CallMethodId((PyObject*)self, &PyId_cursor, NULL); + cursor = _PyObject_CallMethodIdNoArgs((PyObject*)self, &PyId_cursor); if (!cursor) { goto error; } @@ -1472,16 +1470,9 @@ pysqlite_connection_iterdump(pysqlite_Connection* self, PyObject* args) goto finally; } - args = PyTuple_New(1); - if (!args) { - goto finally; - } - Py_INCREF(self); - PyTuple_SetItem(args, 0, (PyObject*)self); - retval = PyObject_CallObject(pyfn_iterdump, args); + retval = PyObject_CallOneArg(pyfn_iterdump, (PyObject *)self); finally: - Py_XDECREF(args); Py_XDECREF(module); return retval; } @@ -1523,6 +1514,10 @@ pysqlite_connection_backup(pysqlite_Connection *self, PyObject *args, PyObject * sleep_ms = (int)ms; } + if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { + return NULL; + } + if (!pysqlite_check_connection((pysqlite_Connection *)target)) { return NULL; } @@ -1651,7 +1646,7 @@ pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args) const char *uppercase_name_str; int rc; unsigned int kind; - void *data; + const void *data; if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) { goto finally; @@ -1662,8 +1657,8 @@ pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args) goto finally; } - uppercase_name = _PyObject_CallMethodIdObjArgs((PyObject *)&PyUnicode_Type, - &PyId_upper, name, NULL); + uppercase_name = _PyObject_CallMethodIdOneArg((PyObject *)&PyUnicode_Type, + &PyId_upper, name); if (!uppercase_name) { goto finally; } @@ -1709,7 +1704,11 @@ pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args) (callable != Py_None) ? callable : NULL, (callable != Py_None) ? pysqlite_collation_callback : NULL); if (rc != SQLITE_OK) { - PyDict_DelItem(self->collations, uppercase_name); + if (callable != Py_None) { + if (PyDict_DelItem(self->collations, uppercase_name) < 0) { + PyErr_Clear(); + } + } _pysqlite_seterror(self->db, NULL); goto finally; } diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 8cfa6e50e822250a8efd4854d7ba2cdc6367fa1e..dd0ce7e1ea6a3368d3e892bcc1c437f4f6f741ca 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -106,7 +106,7 @@ _pysqlite_get_converter(const char *keystr, Py_ssize_t keylen) if (!key) { return NULL; } - upcase_key = _PyObject_CallMethodId(key, &PyId_upper, NULL); + upcase_key = _PyObject_CallMethodIdNoArgs(key, &PyId_upper); Py_DECREF(key); if (!upcase_key) { return NULL; @@ -274,7 +274,7 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self) item = PyBytes_FromStringAndSize(val_str, nbytes); if (!item) goto error; - converted = PyObject_CallFunction(converter, "O", item); + converted = PyObject_CallOneArg(converter, item); Py_DECREF(item); } } else { @@ -285,7 +285,7 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self) Py_INCREF(Py_None); converted = Py_None; } else if (coltype == SQLITE_INTEGER) { - converted = _pysqlite_long_from_int64(sqlite3_column_int64(self->statement->st, i)); + converted = PyLong_FromLongLong(sqlite3_column_int64(self->statement->st, i)); } else if (coltype == SQLITE_FLOAT) { converted = PyFloat_FromDouble(sqlite3_column_double(self->statement->st, i)); } else if (coltype == SQLITE_TEXT) { @@ -393,12 +393,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* args) if (multiple) { /* executemany() */ - if (!PyArg_ParseTuple(args, "OO", &operation, &second_argument)) { - goto error; - } - - if (!PyUnicode_Check(operation)) { - PyErr_SetString(PyExc_ValueError, "operation parameter must be str"); + if (!PyArg_ParseTuple(args, "UO", &operation, &second_argument)) { goto error; } @@ -415,12 +410,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* args) } } else { /* execute() */ - if (!PyArg_ParseTuple(args, "O|O", &operation, &second_argument)) { - goto error; - } - - if (!PyUnicode_Check(operation)) { - PyErr_SetString(PyExc_ValueError, "operation parameter must be str"); + if (!PyArg_ParseTuple(args, "U|O", &operation, &second_argument)) { goto error; } @@ -579,11 +569,13 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* args) } if (!multiple) { - Py_DECREF(self->lastrowid); Py_BEGIN_ALLOW_THREADS lastrowid = sqlite3_last_insert_rowid(self->connection->db); Py_END_ALLOW_THREADS - self->lastrowid = _pysqlite_long_from_int64(lastrowid); + Py_SETREF(self->lastrowid, PyLong_FromLongLong(lastrowid)); + if (self->lastrowid == NULL) { + goto error; + } } if (rc == SQLITE_ROW) { @@ -636,7 +628,6 @@ static PyObject * pysqlite_cursor_executescript(pysqlite_Cursor* self, PyObject* args) { PyObject* script_obj; - PyObject* script_str = NULL; const char* script_cstr; sqlite3_stmt* statement; int rc; @@ -710,8 +701,6 @@ pysqlite_cursor_executescript(pysqlite_Cursor* self, PyObject* args) } error: - Py_XDECREF(script_str); - if (PyErr_Occurred()) { return NULL; } else { @@ -798,7 +787,7 @@ PyObject* pysqlite_cursor_fetchone(pysqlite_Cursor* self, PyObject* args) PyObject* pysqlite_cursor_fetchmany(pysqlite_Cursor* self, PyObject* args, PyObject* kwargs) { - static char *kwlist[] = {"size", NULL, NULL}; + static char *kwlist[] = {"size", NULL}; PyObject* row; PyObject* list; @@ -814,17 +803,12 @@ PyObject* pysqlite_cursor_fetchmany(pysqlite_Cursor* self, PyObject* args, PyObj return NULL; } - /* just make sure we enter the loop */ - row = Py_None; - - while (row) { - row = pysqlite_cursor_iternext(self); - if (row) { - PyList_Append(list, row); + while ((row = pysqlite_cursor_iternext(self))) { + if (PyList_Append(list, row) < 0) { Py_DECREF(row); - } else { break; } + Py_DECREF(row); if (++counter == maxrows) { break; @@ -849,15 +833,12 @@ PyObject* pysqlite_cursor_fetchall(pysqlite_Cursor* self, PyObject* args) return NULL; } - /* just make sure we enter the loop */ - row = (PyObject*)Py_None; - - while (row) { - row = pysqlite_cursor_iternext(self); - if (row) { - PyList_Append(list, row); + while ((row = pysqlite_cursor_iternext(self))) { + if (PyList_Append(list, row) < 0) { Py_DECREF(row); + break; } + Py_DECREF(row); } if (PyErr_Occurred()) { diff --git a/Modules/_sqlite/microprotocols.c b/Modules/_sqlite/microprotocols.c index c23b09f56b5bd1cb4deebc0906057728dcab338e..3b2d7f42b87353d1f541db84b27e9219aaa3506c 100644 --- a/Modules/_sqlite/microprotocols.c +++ b/Modules/_sqlite/microprotocols.c @@ -24,7 +24,6 @@ */ #include -#include #include "cursor.h" #include "microprotocols.h" @@ -84,7 +83,7 @@ pysqlite_microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt) way to get a quotable object to be its instance */ /* look for an adapter in the registry */ - key = Py_BuildValue("(OO)", (PyObject*)obj->ob_type, proto); + key = Py_BuildValue("(OO)", (PyObject*)Py_TYPE(obj), proto); if (!key) { return NULL; } @@ -92,7 +91,7 @@ pysqlite_microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt) Py_DECREF(key); if (adapter) { Py_INCREF(adapter); - adapted = PyObject_CallFunctionObjArgs(adapter, obj, NULL); + adapted = PyObject_CallOneArg(adapter, obj); Py_DECREF(adapter); return adapted; } @@ -105,7 +104,7 @@ pysqlite_microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt) return NULL; } if (adapter) { - adapted = PyObject_CallFunctionObjArgs(adapter, obj, NULL); + adapted = PyObject_CallOneArg(adapter, obj); Py_DECREF(adapter); if (adapted == Py_None) { @@ -124,7 +123,7 @@ pysqlite_microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt) return NULL; } if (adapter) { - adapted = PyObject_CallFunctionObjArgs(adapter, proto, NULL); + adapted = PyObject_CallOneArg(adapter, proto); Py_DECREF(adapter); if (adapted == Py_None) { diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index 9fe0dc952f0b82b9a20a81b56a50cee9014c1ed5..71d951ee887e47773a0e62f38650028062f21d2b 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -105,7 +105,7 @@ RAM instead of on disk."); static PyObject* module_complete(PyObject* self, PyObject* args, PyObject* kwargs) { - static char *kwlist[] = {"statement", NULL, NULL}; + static char *kwlist[] = {"statement", NULL}; char* statement; PyObject* result; @@ -135,7 +135,7 @@ Checks if a string contains a complete SQL statement. Non-standard."); static PyObject* module_enable_shared_cache(PyObject* self, PyObject* args, PyObject* kwargs) { - static char *kwlist[] = {"do_enable", NULL, NULL}; + static char *kwlist[] = {"do_enable", NULL}; int do_enable; int rc; @@ -203,7 +203,7 @@ static PyObject* module_register_converter(PyObject* self, PyObject* args) } /* convert the name to upper case */ - name = _PyObject_CallMethodId(orig_name, &PyId_upper, NULL); + name = _PyObject_CallMethodIdNoArgs(orig_name, &PyId_upper); if (!name) { goto error; } @@ -346,6 +346,14 @@ static struct PyModuleDef _sqlite3module = { NULL }; +#define ADD_TYPE(module, type) \ +do { \ + if (PyModule_AddType(module, &type) < 0) { \ + Py_DECREF(module); \ + return NULL; \ + } \ +} while (0) + PyMODINIT_FUNC PyInit__sqlite3(void) { PyObject *module, *dict; @@ -366,14 +374,10 @@ PyMODINIT_FUNC PyInit__sqlite3(void) return NULL; } - Py_INCREF(&pysqlite_ConnectionType); - PyModule_AddObject(module, "Connection", (PyObject*) &pysqlite_ConnectionType); - Py_INCREF(&pysqlite_CursorType); - PyModule_AddObject(module, "Cursor", (PyObject*) &pysqlite_CursorType); - Py_INCREF(&pysqlite_PrepareProtocolType); - PyModule_AddObject(module, "PrepareProtocol", (PyObject*) &pysqlite_PrepareProtocolType); - Py_INCREF(&pysqlite_RowType); - PyModule_AddObject(module, "Row", (PyObject*) &pysqlite_RowType); + ADD_TYPE(module, pysqlite_ConnectionType); + ADD_TYPE(module, pysqlite_CursorType); + ADD_TYPE(module, pysqlite_PrepareProtocolType); + ADD_TYPE(module, pysqlite_RowType); if (!(dict = PyModule_GetDict(module))) { goto error; diff --git a/Modules/_sqlite/prepare_protocol.c b/Modules/_sqlite/prepare_protocol.c index 181c7edf96b45c386010da0fcdbdad6007071261..05a2ca5a652f5e3b74ef7852772e46c8964d4bd7 100644 --- a/Modules/_sqlite/prepare_protocol.c +++ b/Modules/_sqlite/prepare_protocol.c @@ -78,6 +78,6 @@ PyTypeObject pysqlite_PrepareProtocolType= { extern int pysqlite_prepare_protocol_setup_types(void) { pysqlite_PrepareProtocolType.tp_new = PyType_GenericNew; - Py_TYPE(&pysqlite_PrepareProtocolType)= &PyType_Type; + Py_SET_TYPE(&pysqlite_PrepareProtocolType, &PyType_Type); return PyType_Ready(&pysqlite_PrepareProtocolType); } diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c index 491294b0209cca99b8cd31ae492b6cad85c597c3..23c204e7521f00813696ca18442941d67743ca34 100644 --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -59,6 +59,8 @@ int pysqlite_statement_create(pysqlite_Statement* self, pysqlite_Connection* con self->st = NULL; self->in_use = 0; + assert(PyUnicode_Check(sql)); + sql_cstr = PyUnicode_AsUTF8AndSize(sql, &sql_cstr_len); if (sql_cstr == NULL) { rc = PYSQLITE_SQL_WRONG_TYPE; @@ -225,6 +227,9 @@ void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* para num_params = PyList_GET_SIZE(parameters); } else { num_params = PySequence_Size(parameters); + if (num_params == -1) { + return; + } } if (num_params != num_params_needed) { PyErr_Format(pysqlite_ProgrammingError, @@ -236,9 +241,9 @@ void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* para for (i = 0; i < num_params; i++) { if (PyTuple_CheckExact(parameters)) { current_param = PyTuple_GET_ITEM(parameters, i); - Py_XINCREF(current_param); + Py_INCREF(current_param); } else if (PyList_CheckExact(parameters)) { - current_param = PyList_GET_ITEM(parameters, i); + current_param = PyList_GetItem(parameters, i); Py_XINCREF(current_param); } else { current_param = PySequence_GetItem(parameters, i); diff --git a/Modules/_sqlite/util.c b/Modules/_sqlite/util.c index 3fa671d052b0d83c28cdbb6491e5f60300da11d9..1dbabcdd94a811fe6beef0653a146009dff4a518 100644 --- a/Modules/_sqlite/util.c +++ b/Modules/_sqlite/util.c @@ -103,22 +103,6 @@ int _pysqlite_seterror(sqlite3* db, sqlite3_stmt* st) # define IS_LITTLE_ENDIAN 1 #endif -PyObject * -_pysqlite_long_from_int64(sqlite_int64 value) -{ -# if SIZEOF_LONG_LONG < 8 - if (value > PY_LLONG_MAX || value < PY_LLONG_MIN) { - return _PyLong_FromByteArray(&value, sizeof(value), - IS_LITTLE_ENDIAN, 1 /* signed */); - } -# endif -# if SIZEOF_LONG < SIZEOF_LONG_LONG - if (value > LONG_MAX || value < LONG_MIN) - return PyLong_FromLongLong(value); -# endif - return PyLong_FromLong(Py_SAFE_DOWNCAST(value, sqlite_int64, long)); -} - sqlite_int64 _pysqlite_long_as_int64(PyObject * py_val) { diff --git a/Modules/_sqlite/util.h b/Modules/_sqlite/util.h index 626191118f9257c0734c9dfd76c520e38fd4a2ed..c5a220e9b0aa7206e4c91a1f15b2a6eafb6260ea 100644 --- a/Modules/_sqlite/util.h +++ b/Modules/_sqlite/util.h @@ -37,7 +37,6 @@ int pysqlite_step(sqlite3_stmt* statement, pysqlite_Connection* connection); */ int _pysqlite_seterror(sqlite3* db, sqlite3_stmt* st); -PyObject * _pysqlite_long_from_int64(sqlite_int64 value); sqlite_int64 _pysqlite_long_as_int64(PyObject * value); #if SQLITE_VERSION_NUMBER >= 3007014 diff --git a/Modules/_sre.c b/Modules/_sre.c index d4fe588cbe27c601cbd8ba4138bedd3e6e4ec371..244e4f1f84dfff9e7b49778ac3fdfcb60a107c01 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -41,7 +41,7 @@ static const char copyright[] = #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" /* offsetof */ +#include "structmember.h" // PyMemberDef #include "sre.h" @@ -351,7 +351,7 @@ state_reset(SRE_STATE* state) data_stack_dealloc(state); } -static void* +static const void* getstring(PyObject* string, Py_ssize_t* p_length, int* p_isbytes, int* p_charsize, Py_buffer *view) @@ -398,11 +398,11 @@ state_init(SRE_STATE* state, PatternObject* pattern, PyObject* string, Py_ssize_t length; int isbytes, charsize; - void* ptr; + const void* ptr; memset(state, 0, sizeof(SRE_STATE)); - state->mark = PyMem_New(void *, pattern->groups * 2); + state->mark = PyMem_New(const void *, pattern->groups * 2); if (!state->mark) { PyErr_NoMemory(); goto err; @@ -891,7 +891,7 @@ _sre_SRE_Pattern_split_impl(PatternObject *self, PyObject *string, Py_ssize_t status; Py_ssize_t n; Py_ssize_t i; - void* last; + const void* last; assert(self->codesize != 0); @@ -984,7 +984,7 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string, PyObject* item; PyObject* filter; PyObject* match; - void* ptr; + const void* ptr; Py_ssize_t status; Py_ssize_t n; Py_ssize_t i, b, e; @@ -1002,7 +1002,6 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string, int literal; view.buf = NULL; ptr = getstring(ptemplate, &n, &isbytes, &charsize, &view); - b = charsize; if (ptr) { if (charsize == 1) literal = memchr(ptr, '\\', n) == NULL; @@ -1082,7 +1081,7 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string, match = pattern_new_match(self, &state, 1); if (!match) goto error; - item = PyObject_CallFunctionObjArgs(filter, match, NULL); + item = PyObject_CallOneArg(filter, match); Py_DECREF(match); if (!item) goto error; @@ -1339,7 +1338,7 @@ _sre_compile_impl(PyObject *module, PyObject *pattern, int flags, n = PyList_GET_SIZE(code); /* coverity[ampersand_in_size] */ - self = PyObject_NEW_VAR(PatternObject, &Pattern_Type, n); + self = PyObject_NewVar(PatternObject, &Pattern_Type, n); if (!self) return NULL; self->weakreflist = NULL; @@ -1896,7 +1895,7 @@ match_getslice_by_index(MatchObject* self, Py_ssize_t index, PyObject* def) int isbytes, charsize; Py_buffer view; PyObject *result; - void* ptr; + const void* ptr; Py_ssize_t i, j; assert(0 <= index && index < self->groups); @@ -2328,8 +2327,8 @@ pattern_new_match(PatternObject* pattern, SRE_STATE* state, Py_ssize_t status) /* create match object (with room for extra group marks) */ /* coverity[ampersand_in_size] */ - match = PyObject_NEW_VAR(MatchObject, &Match_Type, - 2*(pattern->groups+1)); + match = PyObject_NewVar(MatchObject, &Match_Type, + 2*(pattern->groups+1)); if (!match) return NULL; @@ -2469,7 +2468,7 @@ pattern_scanner(PatternObject *self, PyObject *string, Py_ssize_t pos, Py_ssize_ ScannerObject* scanner; /* create scanner object */ - scanner = PyObject_NEW(ScannerObject, &Scanner_Type); + scanner = PyObject_New(ScannerObject, &Scanner_Type); if (!scanner) return NULL; scanner->pattern = NULL; @@ -2519,7 +2518,7 @@ pattern_richcompare(PyObject *lefto, PyObject *righto, int op) Py_RETURN_NOTIMPLEMENTED; } - if (Py_TYPE(lefto) != &Pattern_Type || Py_TYPE(righto) != &Pattern_Type) { + if (!Py_IS_TYPE(lefto, &Pattern_Type) || !Py_IS_TYPE(righto, &Pattern_Type)) { Py_RETURN_NOTIMPLEMENTED; } @@ -2569,6 +2568,8 @@ static PyMethodDef pattern_methods[] = { _SRE_SRE_PATTERN_SCANNER_METHODDEF _SRE_SRE_PATTERN___COPY___METHODDEF _SRE_SRE_PATTERN___DEEPCOPY___METHODDEF + {"__class_getitem__", (PyCFunction)Py_GenericAlias, METH_O|METH_CLASS, + PyDoc_STR("See PEP 585")}, {NULL, NULL} }; @@ -2639,6 +2640,8 @@ static PyMethodDef match_methods[] = { _SRE_SRE_MATCH_EXPAND_METHODDEF _SRE_SRE_MATCH___COPY___METHODDEF _SRE_SRE_MATCH___DEEPCOPY___METHODDEF + {"__class_getitem__", (PyCFunction)Py_GenericAlias, METH_O|METH_CLASS, + PyDoc_STR("See PEP 585")}, {NULL, NULL} }; diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 1944393e548908675f774b472f95d4a44a93c191..7bdde452513fdc3072332c183714b70ac5311fbb 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -18,8 +18,6 @@ #include "Python.h" -#include "pythread.h" - /* Redefined below for Windows debug builds after important #includes */ #define _PySSL_FIX_ERRNO @@ -523,9 +521,9 @@ static int PySSL_select(PySocketSockObject *s, int writing, _PyTime_t timeout); static int PySSL_set_owner(PySSLSocket *, PyObject *, void *); static int PySSL_set_session(PySSLSocket *, PyObject *, void *); -#define PySSLSocket_Check(v) (Py_TYPE(v) == &PySSLSocket_Type) -#define PySSLMemoryBIO_Check(v) (Py_TYPE(v) == &PySSLMemoryBIO_Type) -#define PySSLSession_Check(v) (Py_TYPE(v) == &PySSLSession_Type) +#define PySSLSocket_Check(v) Py_IS_TYPE(v, &PySSLSocket_Type) +#define PySSLMemoryBIO_Check(v) Py_IS_TYPE(v, &PySSLMemoryBIO_Type) +#define PySSLSession_Check(v) Py_IS_TYPE(v, &PySSLSession_Type) typedef enum { SOCKET_IS_NONBLOCKING, @@ -807,10 +805,11 @@ PySSL_SetError(PySSLSocket *sslsock, int ret, const char *filename, int lineno) errno = err.c; return PyErr_SetFromErrno(PyExc_OSError); } - Py_INCREF(s); - s->errorhandler(); - Py_DECREF(s); - return NULL; + else { + p = PY_SSL_ERROR_EOF; + type = PySSLEOFErrorObject; + errstr = "EOF occurred in violation of protocol"; + } } else { /* possible? */ p = PY_SSL_ERROR_SYSCALL; type = PySSLSyscallErrorObject; @@ -900,6 +899,7 @@ _ssl_configure_hostname(PySSLSocket *self, const char* server_hostname) if (ip == NULL) { if (!SSL_set_tlsext_host_name(self->ssl, server_hostname)) { _setSSLError(NULL, 0, __FILE__, __LINE__); + goto error; } } if (self->ctx->check_hostname) { @@ -4068,7 +4068,7 @@ _ssl__SSLContext_load_cert_chain_impl(PySSLContext *self, PyObject *certfile, /* internal helper function, returns -1 on error */ static int -_add_ca_certs(PySSLContext *self, void *data, Py_ssize_t len, +_add_ca_certs(PySSLContext *self, const void *data, Py_ssize_t len, int filetype) { BIO *biobuf = NULL; @@ -4254,7 +4254,6 @@ _ssl__SSLContext_load_verify_locations_impl(PySSLContext *self, r = SSL_CTX_load_verify_locations(self->ctx, cafile_buf, capath_buf); PySSL_END_ALLOW_THREADS if (r != 1) { - ok = 0; if (errno != 0) { ERR_clear_error(); PyErr_SetFromErrno(PyExc_OSError); diff --git a/Modules/_stat.c b/Modules/_stat.c index 7a799af0cada26e7329336e5b79c67ac06b657a5..546e6a5f94ca15a49d0264d9569021ed042f9748 100644 --- a/Modules/_stat.c +++ b/Modules/_stat.c @@ -496,113 +496,140 @@ ST_CTIME\n\ "); +static int +stat_exec(PyObject *module) +{ +#define ADD_INT_MACRO(module, macro) \ + do { \ + if (PyModule_AddIntConstant(module, #macro, macro) < 0) { \ + return -1; \ + } \ + } while (0) + + ADD_INT_MACRO(module, S_IFDIR); + ADD_INT_MACRO(module, S_IFCHR); + ADD_INT_MACRO(module, S_IFBLK); + ADD_INT_MACRO(module, S_IFREG); + ADD_INT_MACRO(module, S_IFIFO); + ADD_INT_MACRO(module, S_IFLNK); + ADD_INT_MACRO(module, S_IFSOCK); + ADD_INT_MACRO(module, S_IFDOOR); + ADD_INT_MACRO(module, S_IFPORT); + ADD_INT_MACRO(module, S_IFWHT); + + ADD_INT_MACRO(module, S_ISUID); + ADD_INT_MACRO(module, S_ISGID); + ADD_INT_MACRO(module, S_ISVTX); + ADD_INT_MACRO(module, S_ENFMT); + + ADD_INT_MACRO(module, S_IREAD); + ADD_INT_MACRO(module, S_IWRITE); + ADD_INT_MACRO(module, S_IEXEC); + + ADD_INT_MACRO(module, S_IRWXU); + ADD_INT_MACRO(module, S_IRUSR); + ADD_INT_MACRO(module, S_IWUSR); + ADD_INT_MACRO(module, S_IXUSR); + + ADD_INT_MACRO(module, S_IRWXG); + ADD_INT_MACRO(module, S_IRGRP); + ADD_INT_MACRO(module, S_IWGRP); + ADD_INT_MACRO(module, S_IXGRP); + + ADD_INT_MACRO(module, S_IRWXO); + ADD_INT_MACRO(module, S_IROTH); + ADD_INT_MACRO(module, S_IWOTH); + ADD_INT_MACRO(module, S_IXOTH); + + ADD_INT_MACRO(module, UF_NODUMP); + ADD_INT_MACRO(module, UF_IMMUTABLE); + ADD_INT_MACRO(module, UF_APPEND); + ADD_INT_MACRO(module, UF_OPAQUE); + ADD_INT_MACRO(module, UF_NOUNLINK); + ADD_INT_MACRO(module, UF_COMPRESSED); + ADD_INT_MACRO(module, UF_HIDDEN); + ADD_INT_MACRO(module, SF_ARCHIVED); + ADD_INT_MACRO(module, SF_IMMUTABLE); + ADD_INT_MACRO(module, SF_APPEND); + ADD_INT_MACRO(module, SF_NOUNLINK); + ADD_INT_MACRO(module, SF_SNAPSHOT); + + const char* st_constants[] = { + "ST_MODE", + "ST_INO", + "ST_DEV", + "ST_NLINK", + "ST_UID", + "ST_GID", + "ST_SIZE", + "ST_ATIME", + "ST_MTIME", + "ST_CTIME" + }; + + for (int i = 0; i < (int)Py_ARRAY_LENGTH(st_constants); i++) { + if (PyModule_AddIntConstant(module, st_constants[i], i) < 0) { + return -1; + } + } + +#ifdef MS_WINDOWS + ADD_INT_MACRO(module, FILE_ATTRIBUTE_ARCHIVE); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_COMPRESSED); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_DEVICE); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_DIRECTORY); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_ENCRYPTED); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_HIDDEN); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_INTEGRITY_STREAM); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_NORMAL); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_NOT_CONTENT_INDEXED); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_NO_SCRUB_DATA); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_OFFLINE); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_READONLY); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_REPARSE_POINT); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_SPARSE_FILE); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_SYSTEM); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_TEMPORARY); + ADD_INT_MACRO(module, FILE_ATTRIBUTE_VIRTUAL); + + if (PyModule_AddObject(module, "IO_REPARSE_TAG_SYMLINK", + PyLong_FromUnsignedLong(IO_REPARSE_TAG_SYMLINK)) < 0) { + return -1; + } + if (PyModule_AddObject(module, "IO_REPARSE_TAG_MOUNT_POINT", + PyLong_FromUnsignedLong(IO_REPARSE_TAG_MOUNT_POINT)) < 0) { + return -1; + } + if (PyModule_AddObject(module, "IO_REPARSE_TAG_APPEXECLINK", + PyLong_FromUnsignedLong(IO_REPARSE_TAG_APPEXECLINK)) < 0) { + return -1; + } +#endif + + return 0; +} + + +static PyModuleDef_Slot stat_slots[] = { + {Py_mod_exec, stat_exec}, + {0, NULL} +}; + + static struct PyModuleDef statmodule = { PyModuleDef_HEAD_INIT, - "_stat", - module_doc, - -1, - stat_methods, - NULL, - NULL, - NULL, - NULL + .m_name = "_stat", + .m_doc = module_doc, + .m_size = 0, + .m_methods = stat_methods, + .m_slots = stat_slots, }; + PyMODINIT_FUNC PyInit__stat(void) { - PyObject *m; - m = PyModule_Create(&statmodule); - if (m == NULL) - return NULL; - - if (PyModule_AddIntMacro(m, S_IFDIR)) return NULL; - if (PyModule_AddIntMacro(m, S_IFCHR)) return NULL; - if (PyModule_AddIntMacro(m, S_IFBLK)) return NULL; - if (PyModule_AddIntMacro(m, S_IFREG)) return NULL; - if (PyModule_AddIntMacro(m, S_IFIFO)) return NULL; - if (PyModule_AddIntMacro(m, S_IFLNK)) return NULL; - if (PyModule_AddIntMacro(m, S_IFSOCK)) return NULL; - if (PyModule_AddIntMacro(m, S_IFDOOR)) return NULL; - if (PyModule_AddIntMacro(m, S_IFPORT)) return NULL; - if (PyModule_AddIntMacro(m, S_IFWHT)) return NULL; - - if (PyModule_AddIntMacro(m, S_ISUID)) return NULL; - if (PyModule_AddIntMacro(m, S_ISGID)) return NULL; - if (PyModule_AddIntMacro(m, S_ISVTX)) return NULL; - if (PyModule_AddIntMacro(m, S_ENFMT)) return NULL; - - if (PyModule_AddIntMacro(m, S_IREAD)) return NULL; - if (PyModule_AddIntMacro(m, S_IWRITE)) return NULL; - if (PyModule_AddIntMacro(m, S_IEXEC)) return NULL; - - if (PyModule_AddIntMacro(m, S_IRWXU)) return NULL; - if (PyModule_AddIntMacro(m, S_IRUSR)) return NULL; - if (PyModule_AddIntMacro(m, S_IWUSR)) return NULL; - if (PyModule_AddIntMacro(m, S_IXUSR)) return NULL; - - if (PyModule_AddIntMacro(m, S_IRWXG)) return NULL; - if (PyModule_AddIntMacro(m, S_IRGRP)) return NULL; - if (PyModule_AddIntMacro(m, S_IWGRP)) return NULL; - if (PyModule_AddIntMacro(m, S_IXGRP)) return NULL; - - if (PyModule_AddIntMacro(m, S_IRWXO)) return NULL; - if (PyModule_AddIntMacro(m, S_IROTH)) return NULL; - if (PyModule_AddIntMacro(m, S_IWOTH)) return NULL; - if (PyModule_AddIntMacro(m, S_IXOTH)) return NULL; - - if (PyModule_AddIntMacro(m, UF_NODUMP)) return NULL; - if (PyModule_AddIntMacro(m, UF_IMMUTABLE)) return NULL; - if (PyModule_AddIntMacro(m, UF_APPEND)) return NULL; - if (PyModule_AddIntMacro(m, UF_OPAQUE)) return NULL; - if (PyModule_AddIntMacro(m, UF_NOUNLINK)) return NULL; - if (PyModule_AddIntMacro(m, UF_COMPRESSED)) return NULL; - if (PyModule_AddIntMacro(m, UF_HIDDEN)) return NULL; - if (PyModule_AddIntMacro(m, SF_ARCHIVED)) return NULL; - if (PyModule_AddIntMacro(m, SF_IMMUTABLE)) return NULL; - if (PyModule_AddIntMacro(m, SF_APPEND)) return NULL; - if (PyModule_AddIntMacro(m, SF_NOUNLINK)) return NULL; - if (PyModule_AddIntMacro(m, SF_SNAPSHOT)) return NULL; - - if (PyModule_AddIntConstant(m, "ST_MODE", 0)) return NULL; - if (PyModule_AddIntConstant(m, "ST_INO", 1)) return NULL; - if (PyModule_AddIntConstant(m, "ST_DEV", 2)) return NULL; - if (PyModule_AddIntConstant(m, "ST_NLINK", 3)) return NULL; - if (PyModule_AddIntConstant(m, "ST_UID", 4)) return NULL; - if (PyModule_AddIntConstant(m, "ST_GID", 5)) return NULL; - if (PyModule_AddIntConstant(m, "ST_SIZE", 6)) return NULL; - if (PyModule_AddIntConstant(m, "ST_ATIME", 7)) return NULL; - if (PyModule_AddIntConstant(m, "ST_MTIME", 8)) return NULL; - if (PyModule_AddIntConstant(m, "ST_CTIME", 9)) return NULL; - -#ifdef MS_WINDOWS - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_ARCHIVE)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_COMPRESSED)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_DEVICE)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_DIRECTORY)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_ENCRYPTED)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_HIDDEN)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_INTEGRITY_STREAM)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_NORMAL)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_NO_SCRUB_DATA)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_OFFLINE)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_READONLY)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_REPARSE_POINT)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_SPARSE_FILE)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_SYSTEM)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_TEMPORARY)) return NULL; - if (PyModule_AddIntMacro(m, FILE_ATTRIBUTE_VIRTUAL)) return NULL; - - if (PyModule_AddObject(m, "IO_REPARSE_TAG_SYMLINK", - PyLong_FromUnsignedLong(IO_REPARSE_TAG_SYMLINK))) return NULL; - if (PyModule_AddObject(m, "IO_REPARSE_TAG_MOUNT_POINT", - PyLong_FromUnsignedLong(IO_REPARSE_TAG_MOUNT_POINT))) return NULL; - if (PyModule_AddObject(m, "IO_REPARSE_TAG_APPEXECLINK", - PyLong_FromUnsignedLong(IO_REPARSE_TAG_APPEXECLINK))) return NULL; -#endif - - return m; + return PyModuleDef_Init(&statmodule); } #ifdef __cplusplus diff --git a/Modules/_statisticsmodule.c b/Modules/_statisticsmodule.c index a646e96d0165c084e621e711e5d9bb03e0529f46..78c0676a01f027b95be93463bb71938f84b4bc85 100644 --- a/Modules/_statisticsmodule.c +++ b/Modules/_statisticsmodule.c @@ -1,7 +1,6 @@ /* statistics accelerator C extension: _statistics module. */ #include "Python.h" -#include "structmember.h" #include "clinic/_statisticsmodule.c.h" /*[clinic input] @@ -129,13 +128,17 @@ static PyMethodDef statistics_methods[] = { PyDoc_STRVAR(statistics_doc, "Accelerators for the statistics module.\n"); +static struct PyModuleDef_Slot _statisticsmodule_slots[] = { + {0, NULL} +}; + static struct PyModuleDef statisticsmodule = { PyModuleDef_HEAD_INIT, "_statistics", statistics_doc, - -1, + 0, statistics_methods, - NULL, + _statisticsmodule_slots, NULL, NULL, NULL @@ -144,7 +147,5 @@ static struct PyModuleDef statisticsmodule = { PyMODINIT_FUNC PyInit__statistics(void) { - PyObject *m = PyModule_Create(&statisticsmodule); - if (!m) return NULL; - return m; + return PyModuleDef_Init(&statisticsmodule); } diff --git a/Modules/_struct.c b/Modules/_struct.c index 64a9827e83aaeed473493518ce0231de4ae0a176..f759f0b169418445291109fcabbb98be4ab3ec88 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -6,7 +6,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include /*[clinic input] @@ -14,7 +14,23 @@ class Struct "PyStructObject *" "&PyStructType" [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=9b032058a83ed7c3]*/ -static PyTypeObject PyStructType; +typedef struct { + PyObject *PyStructType; + PyObject *unpackiter_type; + PyObject *StructError; +} _structmodulestate; + +static inline _structmodulestate* +get_struct_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_structmodulestate *)state; +} + +static struct PyModuleDef _structmodule; + +#define _structmodulestate_global get_struct_state(PyState_FindModule(&_structmodule)) /* The translation function for each format character is table driven */ typedef struct _formatdef { @@ -46,13 +62,8 @@ typedef struct { } PyStructObject; -#define PyStruct_Check(op) PyObject_TypeCheck(op, &PyStructType) -#define PyStruct_CheckExact(op) (Py_TYPE(op) == &PyStructType) - - -/* Exception */ - -static PyObject *StructError; +#define PyStruct_Check(op) PyObject_TypeCheck(op, (PyTypeObject *)_structmodulestate_global->PyStructType) +#define PyStruct_CheckExact(op) Py_IS_TYPE(op, (PyTypeObject *)_structmodulestate_global->PyStructType) /* Define various structs to figure out the alignments of types */ @@ -115,7 +126,7 @@ get_pylong(PyObject *v) return NULL; } else { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "required argument is not an integer"); return NULL; } @@ -143,7 +154,7 @@ get_long(PyObject *v, long *p) Py_DECREF(v); if (x == (long)-1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "argument out of range"); return -1; } @@ -167,7 +178,7 @@ get_ulong(PyObject *v, unsigned long *p) Py_DECREF(v); if (x == (unsigned long)-1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "argument out of range"); return -1; } @@ -190,7 +201,7 @@ get_longlong(PyObject *v, long long *p) Py_DECREF(v); if (x == (long long)-1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "argument out of range"); return -1; } @@ -213,7 +224,7 @@ get_ulonglong(PyObject *v, unsigned long long *p) Py_DECREF(v); if (x == (unsigned long long)-1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "argument out of range"); return -1; } @@ -236,7 +247,7 @@ get_ssize_t(PyObject *v, Py_ssize_t *p) Py_DECREF(v); if (x == (Py_ssize_t)-1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "argument out of range"); return -1; } @@ -259,7 +270,7 @@ get_size_t(PyObject *v, size_t *p) Py_DECREF(v); if (x == (size_t)-1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "argument out of range"); return -1; } @@ -293,7 +304,7 @@ pack_halffloat(char *p, /* start of 2-byte string */ { double x = PyFloat_AsDouble(v); if (x == -1.0 && PyErr_Occurred()) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "required argument is not a float"); return -1; } @@ -339,13 +350,13 @@ _range_error(const formatdef *f, int is_unsigned) const size_t ulargest = (size_t)-1 >> ((SIZEOF_SIZE_T - f->size)*8); assert(f->size >= 1 && f->size <= SIZEOF_SIZE_T); if (is_unsigned) - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "'%c' format requires 0 <= number <= %zu", f->format, ulargest); else { const Py_ssize_t largest = (Py_ssize_t)(ulargest >> 1); - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "'%c' format requires %zd <= number <= %zd", f->format, ~ largest, @@ -361,8 +372,8 @@ _range_error(const formatdef *f, int is_unsigned) [bln][up]_TYPE - [bln] distiguishes among big-endian, little-endian and native. - [pu] distiguishes between pack (to struct) and unpack (from struct). + [bln] distinguishes among big-endian, little-endian and native. + [pu] distinguishes between pack (to struct) and unpack (from struct). TYPE is one of char, byte, ubyte, etc. */ @@ -524,7 +535,7 @@ np_byte(char *p, PyObject *v, const formatdef *f) if (get_long(v, &x) < 0) return -1; if (x < -128 || x > 127) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "byte format requires -128 <= number <= 127"); return -1; } @@ -539,7 +550,7 @@ np_ubyte(char *p, PyObject *v, const formatdef *f) if (get_long(v, &x) < 0) return -1; if (x < 0 || x > 255) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "ubyte format requires 0 <= number <= 255"); return -1; } @@ -550,8 +561,8 @@ np_ubyte(char *p, PyObject *v, const formatdef *f) static int np_char(char *p, PyObject *v, const formatdef *f) { - if (!PyBytes_Check(v) || PyBytes_GET_SIZE(v) != 1) { - PyErr_SetString(StructError, + if (!PyBytes_Check(v) || PyBytes_Size(v) != 1) { + PyErr_SetString(_structmodulestate_global->StructError, "char format requires a bytes object of length 1"); return -1; } @@ -567,7 +578,7 @@ np_short(char *p, PyObject *v, const formatdef *f) if (get_long(v, &x) < 0) return -1; if (x < SHRT_MIN || x > SHRT_MAX) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "short format requires " Py_STRINGIFY(SHRT_MIN) " <= number <= " Py_STRINGIFY(SHRT_MAX)); return -1; @@ -585,7 +596,7 @@ np_ushort(char *p, PyObject *v, const formatdef *f) if (get_long(v, &x) < 0) return -1; if (x < 0 || x > USHRT_MAX) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "ushort format requires 0 <= number <= " Py_STRINGIFY(USHRT_MAX)); return -1; @@ -716,7 +727,7 @@ np_float(char *p, PyObject *v, const formatdef *f) { float x = (float)PyFloat_AsDouble(v); if (x == -1 && PyErr_Occurred()) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "required argument is not a float"); return -1; } @@ -729,7 +740,7 @@ np_double(char *p, PyObject *v, const formatdef *f) { double x = PyFloat_AsDouble(v); if (x == -1 && PyErr_Occurred()) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "required argument is not a float"); return -1; } @@ -948,7 +959,7 @@ bp_float(char *p, PyObject *v, const formatdef *f) { double x = PyFloat_AsDouble(v); if (x == -1 && PyErr_Occurred()) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "required argument is not a float"); return -1; } @@ -960,7 +971,7 @@ bp_double(char *p, PyObject *v, const formatdef *f) { double x = PyFloat_AsDouble(v); if (x == -1 && PyErr_Occurred()) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "required argument is not a float"); return -1; } @@ -1163,7 +1174,7 @@ lp_float(char *p, PyObject *v, const formatdef *f) { double x = PyFloat_AsDouble(v); if (x == -1 && PyErr_Occurred()) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "required argument is not a float"); return -1; } @@ -1175,7 +1186,7 @@ lp_double(char *p, PyObject *v, const formatdef *f) { double x = PyFloat_AsDouble(v); if (x == -1 && PyErr_Occurred()) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "required argument is not a float"); return -1; } @@ -1242,7 +1253,7 @@ getentry(int c, const formatdef *f) return f; } } - PyErr_SetString(StructError, "bad char in struct format"); + PyErr_SetString(_structmodulestate_global->StructError, "bad char in struct format"); return NULL; } @@ -1286,7 +1297,8 @@ prepare_s(PyStructObject *self) fmt = PyBytes_AS_STRING(self->s_format); if (strlen(fmt) != (size_t)PyBytes_GET_SIZE(self->s_format)) { - PyErr_SetString(StructError, "embedded null character"); + PyErr_SetString(_structmodulestate_global->StructError, + "embedded null character"); return -1; } @@ -1297,7 +1309,7 @@ prepare_s(PyStructObject *self) len = 0; ncodes = 0; while ((c = *s++) != '\0') { - if (Py_ISSPACE(Py_CHARMASK(c))) + if (Py_ISSPACE(c)) continue; if ('0' <= c && c <= '9') { num = c - '0'; @@ -1311,7 +1323,7 @@ prepare_s(PyStructObject *self) num = num*10 + (c - '0'); } if (c == '\0') { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "repeat count given without format specifier"); return -1; } @@ -1362,7 +1374,7 @@ prepare_s(PyStructObject *self) s = fmt; size = 0; while ((c = *s++) != '\0') { - if (Py_ISSPACE(Py_CHARMASK(c))) + if (Py_ISSPACE(c)) continue; if ('0' <= c && c <= '9') { num = c - '0'; @@ -1401,7 +1413,7 @@ prepare_s(PyStructObject *self) return 0; overflow: - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "total struct size too long"); return -1; } @@ -1411,9 +1423,11 @@ s_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *self; - assert(type != NULL && type->tp_alloc != NULL); + assert(type != NULL); + allocfunc alloc_func = PyType_GetSlot(type, Py_tp_alloc); + assert(alloc_func != NULL); - self = type->tp_alloc(type, 0); + self = alloc_func(type, 0); if (self != NULL) { PyStructObject *s = (PyStructObject*)self; Py_INCREF(Py_None); @@ -1459,7 +1473,7 @@ Struct___init___impl(PyStructObject *self, PyObject *format) PyErr_Format(PyExc_TypeError, "Struct() argument 1 must be a str or bytes object, " "not %.200s", - Py_TYPE(format)->tp_name); + _PyType_Name(Py_TYPE(format))); return -1; } @@ -1472,13 +1486,16 @@ Struct___init___impl(PyStructObject *self, PyObject *format) static void s_dealloc(PyStructObject *s) { + PyTypeObject *tp = Py_TYPE(s); if (s->weakreflist != NULL) PyObject_ClearWeakRefs((PyObject *)s); if (s->s_codes != NULL) { PyMem_FREE(s->s_codes); } - Py_DECREF(s->s_format); - Py_TYPE(s)->tp_free((PyObject *)s); + Py_XDECREF(s->s_format); + freefunc free_func = PyType_GetSlot(Py_TYPE(s), Py_tp_free); + free_func(s); + Py_DECREF(tp); } static PyObject * @@ -1539,7 +1556,7 @@ Struct_unpack_impl(PyStructObject *self, Py_buffer *buffer) { assert(self->s_codes != NULL); if (buffer->len != self->s_size) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "unpack requires a buffer of %zd bytes", self->s_size); return NULL; @@ -1572,7 +1589,7 @@ Struct_unpack_from_impl(PyStructObject *self, Py_buffer *buffer, if (offset < 0) { if (offset + self->s_size > 0) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "not enough data to unpack %zd bytes at offset %zd", self->s_size, offset); @@ -1580,7 +1597,7 @@ Struct_unpack_from_impl(PyStructObject *self, Py_buffer *buffer, } if (offset + buffer->len < 0) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "offset %zd out of range for %zd-byte buffer", offset, buffer->len); @@ -1590,7 +1607,7 @@ Struct_unpack_from_impl(PyStructObject *self, Py_buffer *buffer, } if ((buffer->len - offset) < self->s_size) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "unpack_from requires a buffer of at least %zu bytes for " "unpacking %zd bytes at offset %zd " "(actual buffer size is %zd)", @@ -1618,15 +1635,18 @@ static void unpackiter_dealloc(unpackiterobject *self) { /* bpo-31095: UnTrack is needed before calling any callbacks */ + PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); Py_XDECREF(self->so); PyBuffer_Release(&self->buf); PyObject_GC_Del(self); + Py_DECREF(tp); } static int unpackiter_traverse(unpackiterobject *self, visitproc visit, void *arg) { + Py_VISIT(Py_TYPE(self)); Py_VISIT(self->so); Py_VISIT(self->buf.obj); return 0; @@ -1667,35 +1687,28 @@ unpackiter_iternext(unpackiterobject *self) return result; } -static PyTypeObject unpackiter_type = { - PyVarObject_HEAD_INIT(NULL, 0) - "unpack_iterator", /* tp_name */ - sizeof(unpackiterobject), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)unpackiter_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ - 0, /* tp_doc */ - (traverseproc)unpackiter_traverse, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - PyObject_SelfIter, /* tp_iter */ - (iternextfunc)unpackiter_iternext, /* tp_iternext */ - unpackiter_methods /* tp_methods */ +PyObject *unpackiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { + PyErr_Format(PyExc_TypeError, "Cannot create '%.200s objects", _PyType_Name(type)); + return NULL; +} + +static PyType_Slot unpackiter_type_slots[] = { + {Py_tp_dealloc, unpackiter_dealloc}, + {Py_tp_getattro, PyObject_GenericGetAttr}, + {Py_tp_traverse, unpackiter_traverse}, + {Py_tp_iter, PyObject_SelfIter}, + {Py_tp_iternext, unpackiter_iternext}, + {Py_tp_methods, unpackiter_methods}, + {Py_tp_new, unpackiter_new}, + {0, 0}, +}; + +static PyType_Spec unpackiter_type_spec = { + "_struct.unpack_iterator", + sizeof(unpackiterobject), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, + unpackiter_type_slots }; /*[clinic input] @@ -1721,12 +1734,12 @@ Struct_iter_unpack(PyStructObject *self, PyObject *buffer) assert(self->s_codes != NULL); if (self->s_size == 0) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "cannot iteratively unpack with a struct of length 0"); return NULL; } - iter = (unpackiterobject *) PyType_GenericAlloc(&unpackiter_type, 0); + iter = (unpackiterobject *) PyType_GenericAlloc((PyTypeObject *)_structmodulestate_global->unpackiter_type, 0); if (iter == NULL) return NULL; @@ -1735,7 +1748,7 @@ Struct_iter_unpack(PyStructObject *self, PyObject *buffer) return NULL; } if (iter->buf.len % self->s_size != 0) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "iterative unpacking requires a buffer of " "a multiple of %zd bytes", self->s_size); @@ -1778,10 +1791,10 @@ s_pack_internal(PyStructObject *soself, PyObject *const *args, int offset, char* if (e->format == 's') { Py_ssize_t n; int isstring; - void *p; + const void *p; isstring = PyBytes_Check(v); if (!isstring && !PyByteArray_Check(v)) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "argument for 's' must be a bytes object"); return -1; } @@ -1800,10 +1813,10 @@ s_pack_internal(PyStructObject *soself, PyObject *const *args, int offset, char* } else if (e->format == 'p') { Py_ssize_t n; int isstring; - void *p; + const void *p; isstring = PyBytes_Check(v); if (!isstring && !PyByteArray_Check(v)) { - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "argument for 'p' must be a bytes object"); return -1; } @@ -1825,7 +1838,7 @@ s_pack_internal(PyStructObject *soself, PyObject *const *args, int offset, char* } else { if (e->pack(res, v, e) < 0) { if (PyLong_Check(v) && PyErr_ExceptionMatches(PyExc_OverflowError)) - PyErr_SetString(StructError, + PyErr_SetString(_structmodulestate_global->StructError, "int too large to convert"); return -1; } @@ -1849,8 +1862,8 @@ strings."); static PyObject * s_pack(PyObject *self, PyObject *const *args, Py_ssize_t nargs) { + char *buf; PyStructObject *soself; - PyObject *result; /* Validate arguments. */ soself = (PyStructObject *)self; @@ -1858,23 +1871,27 @@ s_pack(PyObject *self, PyObject *const *args, Py_ssize_t nargs) assert(soself->s_codes != NULL); if (nargs != soself->s_len) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "pack expected %zd items for packing (got %zd)", soself->s_len, nargs); return NULL; } - /* Allocate a new buffer */ - result = PyBytes_FromStringAndSize((char *)NULL, soself->s_size); - if (result == NULL) + /* Allocate a new string */ + _PyBytesWriter writer; + _PyBytesWriter_Init(&writer); + buf = _PyBytesWriter_Alloc(&writer, soself->s_size); + if (buf == NULL) { + _PyBytesWriter_Dealloc(&writer); return NULL; + } /* Call the guts */ - if ( s_pack_internal(soself, args, 0, PyBytes_AS_STRING(result)) != 0 ) { - Py_DECREF(result); + if ( s_pack_internal(soself, args, 0, buf) != 0 ) { + _PyBytesWriter_Dealloc(&writer); return NULL; } - return result; + return _PyBytesWriter_Finish(&writer, buf + soself->s_size); } PyDoc_STRVAR(s_pack_into__doc__, @@ -1899,15 +1916,15 @@ s_pack_into(PyObject *self, PyObject *const *args, Py_ssize_t nargs) if (nargs != (soself->s_len + 2)) { if (nargs == 0) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "pack_into expected buffer argument"); } else if (nargs == 1) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "pack_into expected offset argument"); } else { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "pack_into expected %zd items for packing (got %zd)", soself->s_len, (nargs - 2)); } @@ -1930,7 +1947,7 @@ s_pack_into(PyObject *self, PyObject *const *args, Py_ssize_t nargs) if (offset < 0) { /* Check that negative offset is low enough to fit data */ if (offset + soself->s_size > 0) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "no space to pack %zd bytes at offset %zd", soself->s_size, offset); @@ -1940,7 +1957,7 @@ s_pack_into(PyObject *self, PyObject *const *args, Py_ssize_t nargs) /* Check that negative offset is not crossing buffer boundary */ if (offset + buffer.len < 0) { - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "offset %zd out of range for %zd-byte buffer", offset, buffer.len); @@ -1956,7 +1973,7 @@ s_pack_into(PyObject *self, PyObject *const *args, Py_ssize_t nargs) assert(offset >= 0); assert(soself->s_size >= 0); - PyErr_Format(StructError, + PyErr_Format(_structmodulestate_global->StructError, "pack_into requires a buffer of at least %zu bytes for " "packing %zd bytes at offset %zd " "(actual buffer size is %zd)", @@ -2018,6 +2035,11 @@ static struct PyMethodDef s_methods[] = { {NULL, NULL} /* sentinel */ }; +static PyMemberDef s_members[] = { + {"__weaklistoffset__", T_PYSSIZET, offsetof(PyStructObject, weakreflist), READONLY}, + {NULL} /* sentinel */ +}; + #define OFF(x) offsetof(PyStructObject, x) static PyGetSetDef s_getsetlist[] = { @@ -2026,47 +2048,32 @@ static PyGetSetDef s_getsetlist[] = { {NULL} /* sentinel */ }; -static -PyTypeObject PyStructType = { - PyVarObject_HEAD_INIT(NULL, 0) - "Struct", +PyDoc_STRVAR(s__doc__, +"Struct(fmt) --> compiled struct object\n" +"\n" +); + +static PyType_Slot PyStructType_slots[] = { + {Py_tp_dealloc, s_dealloc}, + {Py_tp_getattro, PyObject_GenericGetAttr}, + {Py_tp_setattro, PyObject_GenericSetAttr}, + {Py_tp_doc, (void*)s__doc__}, + {Py_tp_methods, s_methods}, + {Py_tp_members, s_members}, + {Py_tp_getset, s_getsetlist}, + {Py_tp_init, Struct___init__}, + {Py_tp_alloc, PyType_GenericAlloc}, + {Py_tp_new, s_new}, + {Py_tp_free, PyObject_Del}, + {0, 0}, +}; + +static PyType_Spec PyStructType_spec = { + "_struct.Struct", sizeof(PyStructObject), 0, - (destructor)s_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - PyObject_GenericSetAttr, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - Struct___init____doc__, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - offsetof(PyStructObject, weakreflist), /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - s_methods, /* tp_methods */ - NULL, /* tp_members */ - s_getsetlist, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - Struct___init__, /* tp_init */ - PyType_GenericAlloc, /* tp_alloc */ - s_new, /* tp_new */ - PyObject_Del, /* tp_free */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + PyStructType_slots }; @@ -2102,7 +2109,7 @@ cache_struct_converter(PyObject *fmt, PyStructObject **ptr) return 0; } - s_object = PyObject_CallFunctionObjArgs((PyObject *)(&PyStructType), fmt, NULL); + s_object = PyObject_CallOneArg(_structmodulestate_global->PyStructType, fmt); if (s_object != NULL) { if (PyDict_GET_SIZE(cache) >= MAXCACHE) PyDict_Clear(cache); @@ -2312,16 +2319,46 @@ Whitespace between formats is ignored.\n\ The variable struct.error is an exception raised on errors.\n"); +static int +_structmodule_traverse(PyObject *module, visitproc visit, void *arg) +{ + _structmodulestate *state = (_structmodulestate *)PyModule_GetState(module); + if (state) { + Py_VISIT(state->PyStructType); + Py_VISIT(state->unpackiter_type); + Py_VISIT(state->StructError); + } + return 0; +} + +static int +_structmodule_clear(PyObject *module) +{ + _structmodulestate *state = (_structmodulestate *)PyModule_GetState(module); + if (state) { + Py_CLEAR(state->PyStructType); + Py_CLEAR(state->unpackiter_type); + Py_CLEAR(state->StructError); + } + return 0; +} + +static void +_structmodule_free(void *module) +{ + _structmodule_clear((PyObject *)module); +} + static struct PyModuleDef _structmodule = { PyModuleDef_HEAD_INIT, "_struct", module_doc, - -1, + sizeof(_structmodulestate), module_functions, NULL, - NULL, - NULL, - NULL + _structmodule_traverse, + _structmodule_clear, + _structmodule_free, }; PyMODINIT_FUNC @@ -2333,12 +2370,19 @@ PyInit__struct(void) if (m == NULL) return NULL; - Py_TYPE(&PyStructType) = &PyType_Type; - if (PyType_Ready(&PyStructType) < 0) + PyObject *PyStructType = PyType_FromSpec(&PyStructType_spec); + if (PyStructType == NULL) { return NULL; + } + Py_INCREF(PyStructType); + PyModule_AddObject(m, "Struct", PyStructType); + get_struct_state(m)->PyStructType = PyStructType; - if (PyType_Ready(&unpackiter_type) < 0) + PyObject *unpackiter_type = PyType_FromSpec(&unpackiter_type_spec); + if (unpackiter_type == NULL) { return NULL; + } + get_struct_state(m)->unpackiter_type = unpackiter_type; /* Check endian and swap in faster functions */ { @@ -2383,17 +2427,12 @@ PyInit__struct(void) } /* Add some symbolic constants to the module */ - if (StructError == NULL) { - StructError = PyErr_NewException("struct.error", NULL, NULL); - if (StructError == NULL) - return NULL; - } - + PyObject *StructError = PyErr_NewException("struct.error", NULL, NULL); + if (StructError == NULL) + return NULL; Py_INCREF(StructError); PyModule_AddObject(m, "error", StructError); - - Py_INCREF((PyObject*)&PyStructType); - PyModule_AddObject(m, "Struct", (PyObject*)&PyStructType); + get_struct_state(m)->StructError = StructError; return m; } diff --git a/Modules/_testbuffer.c b/Modules/_testbuffer.c index d7d3cc8d0d53a67d4c76fb51a185d5e30622c15a..d8321768bc9729cea99b88a0947082500140fbee 100644 --- a/Modules/_testbuffer.c +++ b/Modules/_testbuffer.c @@ -24,7 +24,7 @@ static PyObject *simple_format = NULL; /**************************************************************************/ static PyTypeObject NDArray_Type; -#define NDArray_Check(v) (Py_TYPE(v) == &NDArray_Type) +#define NDArray_Check(v) Py_IS_TYPE(v, &NDArray_Type) #define CHECK_LIST_OR_TUPLE(v) \ if (!PyList_Check(v) && !PyTuple_Check(v)) { \ @@ -1854,7 +1854,7 @@ ndarray_subscript(NDArrayObject *self, PyObject *key) type_error: PyErr_Format(PyExc_TypeError, "cannot index memory using \"%.200s\"", - key->ob_type->tp_name); + Py_TYPE(key)->tp_name); err_occurred: Py_DECREF(nd); return NULL; @@ -2050,7 +2050,7 @@ static PyObject * ndarray_get_format(NDArrayObject *self, void *closure) { Py_buffer *base = &self->head->base; - char *fmt = base->format ? base->format : ""; + const char *fmt = base->format ? base->format : ""; return PyUnicode_FromString(fmt); } @@ -2835,11 +2835,11 @@ PyInit__testbuffer(void) if (m == NULL) return NULL; - Py_TYPE(&NDArray_Type) = &PyType_Type; + Py_SET_TYPE(&NDArray_Type, &PyType_Type); Py_INCREF(&NDArray_Type); PyModule_AddObject(m, "ndarray", (PyObject *)&NDArray_Type); - Py_TYPE(&StaticArray_Type) = &PyType_Type; + Py_SET_TYPE(&StaticArray_Type, &PyType_Type); Py_INCREF(&StaticArray_Type); PyModule_AddObject(m, "staticarray", (PyObject *)&StaticArray_Type); diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index af28af50c06501f0e13ace7e436a3456455f9fd8..54c1e62a282414d60c7b78c465fb67a9f29db873 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -5,18 +5,22 @@ * standard Python regression test, via Lib/test/test_capi.py. */ -/* The Visual Studio projects builds _testcapi with Py_BUILD_CORE_MODULE - define, but we only want to test the public C API, not the internal - C API. */ +/* This module tests the public (Include/ and Include/cpython/) C API. + The internal C API must not be used here: use _testinternalcapi for that. + + The Visual Studio projects builds _testcapi with Py_BUILD_CORE_MODULE + macro defined, but only the public C API must be tested here. */ + #undef Py_BUILD_CORE_MODULE +/* Always enable assertions */ +#undef NDEBUG #define PY_SSIZE_T_CLEAN #include "Python.h" #include "datetime.h" #include "marshal.h" -#include "pythread.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include #include @@ -274,7 +278,7 @@ dict_hassplittable(PyObject *self, PyObject *arg) if (!PyDict_Check(arg)) { PyErr_Format(PyExc_TypeError, "dict_hassplittable() argument must be dict, not '%s'", - arg->ob_type->tp_name); + Py_TYPE(arg)->tp_name); return NULL; } @@ -639,7 +643,7 @@ test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) int overflow; /* Test that overflow is set properly for a large value. */ - /* num is a number larger than PY_LLONG_MAX on a typical machine. */ + /* num is a number larger than LLONG_MAX on a typical machine. */ num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16); if (num == NULL) return NULL; @@ -655,8 +659,8 @@ test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) return raiseTestError("test_long_long_and_overflow", "overflow was not set to 1"); - /* Same again, with num = PY_LLONG_MAX + 1 */ - num = PyLong_FromLongLong(PY_LLONG_MAX); + /* Same again, with num = LLONG_MAX + 1 */ + num = PyLong_FromLongLong(LLONG_MAX); if (num == NULL) return NULL; one = PyLong_FromLong(1L); @@ -683,7 +687,7 @@ test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) "overflow was not set to 1"); /* Test that overflow is set properly for a large negative value. */ - /* num is a number smaller than PY_LLONG_MIN on a typical platform */ + /* num is a number smaller than LLONG_MIN on a typical platform */ num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16); if (num == NULL) return NULL; @@ -699,8 +703,8 @@ test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) return raiseTestError("test_long_long_and_overflow", "overflow was not set to -1"); - /* Same again, with num = PY_LLONG_MIN - 1 */ - num = PyLong_FromLongLong(PY_LLONG_MIN); + /* Same again, with num = LLONG_MIN - 1 */ + num = PyLong_FromLongLong(LLONG_MIN); if (num == NULL) return NULL; one = PyLong_FromLong(1L); @@ -757,7 +761,7 @@ test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) return raiseTestError("test_long_long_and_overflow", "overflow was set incorrectly"); - num = PyLong_FromLongLong(PY_LLONG_MAX); + num = PyLong_FromLongLong(LLONG_MAX); if (num == NULL) return NULL; overflow = 1234; @@ -765,14 +769,14 @@ test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) Py_DECREF(num); if (value == -1 && PyErr_Occurred()) return NULL; - if (value != PY_LLONG_MAX) + if (value != LLONG_MAX) return raiseTestError("test_long_long_and_overflow", - "expected return value PY_LLONG_MAX"); + "expected return value LLONG_MAX"); if (overflow != 0) return raiseTestError("test_long_long_and_overflow", "overflow was not cleared"); - num = PyLong_FromLongLong(PY_LLONG_MIN); + num = PyLong_FromLongLong(LLONG_MIN); if (num == NULL) return NULL; overflow = 0; @@ -780,9 +784,9 @@ test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) Py_DECREF(num); if (value == -1 && PyErr_Occurred()) return NULL; - if (value != PY_LLONG_MIN) + if (value != LLONG_MIN) return raiseTestError("test_long_long_and_overflow", - "expected return value PY_LLONG_MIN"); + "expected return value LLONG_MIN"); if (overflow != 0) return raiseTestError("test_long_long_and_overflow", "overflow was not cleared"); @@ -1664,6 +1668,10 @@ parse_tuple_and_keywords(PyObject *self, PyObject *args) static volatile int x; +/* Ignore use of deprecated APIs */ +_Py_COMP_DIAG_PUSH +_Py_COMP_DIAG_IGNORE_DEPR_DECLS + /* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case of an error. */ @@ -1840,6 +1848,7 @@ test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored)) Py_RETURN_NONE; } +_Py_COMP_DIAG_POP static PyObject * unicode_aswidechar(PyObject *self, PyObject *args) @@ -1923,6 +1932,48 @@ unicode_asucs4(PyObject *self, PyObject *args) return result; } +static PyObject * +unicode_asutf8(PyObject *self, PyObject *args) +{ + PyObject *unicode; + const char *buffer; + + if (!PyArg_ParseTuple(args, "U", &unicode)) { + return NULL; + } + + buffer = PyUnicode_AsUTF8(unicode); + if (buffer == NULL) { + return NULL; + } + + return PyBytes_FromString(buffer); +} + +static PyObject * +unicode_asutf8andsize(PyObject *self, PyObject *args) +{ + PyObject *unicode, *result; + const char *buffer; + Py_ssize_t utf8_len; + + if(!PyArg_ParseTuple(args, "U", &unicode)) { + return NULL; + } + + buffer = PyUnicode_AsUTF8AndSize(unicode, &utf8_len); + if (buffer == NULL) { + return NULL; + } + + result = PyBytes_FromString(buffer); + if (result == NULL) { + return NULL; + } + + return Py_BuildValue("(Nn)", result, utf8_len); +} + static PyObject * unicode_findchar(PyObject *self, PyObject *args) { @@ -1973,6 +2024,10 @@ unicode_copycharacters(PyObject *self, PyObject *args) return Py_BuildValue("(Nn)", to_copy, copied); } +/* Ignore use of deprecated APIs */ +_Py_COMP_DIAG_PUSH +_Py_COMP_DIAG_IGNORE_DEPR_DECLS + static PyObject * unicode_encodedecimal(PyObject *self, PyObject *args) { @@ -2040,6 +2095,7 @@ unicode_legacy_string(PyObject *self, PyObject *args) return u; } +_Py_COMP_DIAG_POP static PyObject * getargs_w_star(PyObject *self, PyObject *args) @@ -2589,6 +2645,55 @@ get_datetime_fromtimestamp(PyObject* self, PyObject *args) return rv; } +static PyObject * +test_PyDateTime_GET(PyObject *self, PyObject *obj) +{ + int year, month, day; + + year = PyDateTime_GET_YEAR(obj); + month = PyDateTime_GET_MONTH(obj); + day = PyDateTime_GET_DAY(obj); + + return Py_BuildValue("(lll)", year, month, day); +} + +static PyObject * +test_PyDateTime_DATE_GET(PyObject *self, PyObject *obj) +{ + int hour, minute, second, microsecond; + + hour = PyDateTime_DATE_GET_HOUR(obj); + minute = PyDateTime_DATE_GET_MINUTE(obj); + second = PyDateTime_DATE_GET_SECOND(obj); + microsecond = PyDateTime_DATE_GET_MICROSECOND(obj); + + return Py_BuildValue("(llll)", hour, minute, second, microsecond); +} + +static PyObject * +test_PyDateTime_TIME_GET(PyObject *self, PyObject *obj) +{ + int hour, minute, second, microsecond; + + hour = PyDateTime_TIME_GET_HOUR(obj); + minute = PyDateTime_TIME_GET_MINUTE(obj); + second = PyDateTime_TIME_GET_SECOND(obj); + microsecond = PyDateTime_TIME_GET_MICROSECOND(obj); + + return Py_BuildValue("(llll)", hour, minute, second, microsecond); +} + +static PyObject * +test_PyDateTime_DELTA_GET(PyObject *self, PyObject *obj) +{ + int days, seconds, microseconds; + + days = PyDateTime_DELTA_GET_DAYS(obj); + seconds = PyDateTime_DELTA_GET_SECONDS(obj); + microseconds = PyDateTime_DELTA_GET_MICROSECONDS(obj); + + return Py_BuildValue("(lll)", days, seconds, microseconds); +} /* test_thread_state spawns a thread of its own, and that thread releases * `thread_done` when it's finished. The driver code has to know when the @@ -2633,12 +2738,10 @@ test_thread_state(PyObject *self, PyObject *args) if (!PyCallable_Check(fn)) { PyErr_Format(PyExc_TypeError, "'%s' object is not callable", - fn->ob_type->tp_name); + Py_TYPE(fn)->tp_name); return NULL; } - /* Ensure Python is set up for threading */ - PyEval_InitThreads(); thread_done = PyThread_allocate_lock(); if (thread_done == NULL) return PyErr_NoMemory(); @@ -3323,6 +3426,26 @@ getbuffer_with_null_view(PyObject* self, PyObject *obj) Py_RETURN_NONE; } +/* PyBuffer_SizeFromFormat() */ +static PyObject * +test_PyBuffer_SizeFromFormat(PyObject *self, PyObject *args) +{ + const char *format; + Py_ssize_t result; + + if (!PyArg_ParseTuple(args, "s:test_PyBuffer_SizeFromFormat", + &format)) { + return NULL; + } + + result = PyBuffer_SizeFromFormat(format); + if (result == -1) { + return NULL; + } + + return PyLong_FromSsize_t(result); +} + /* Test that the fatal error from not having a current thread doesn't cause an infinite loop. Run via Lib/test/test_capi.py */ static PyObject * @@ -3441,8 +3564,8 @@ slot_tp_del(PyObject *self) PyObject *error_type, *error_value, *error_traceback; /* Temporarily resurrect the object. */ - assert(self->ob_refcnt == 0); - self->ob_refcnt = 1; + assert(Py_REFCNT(self) == 0); + Py_SET_REFCNT(self, 1); /* Save the current exception, if any. */ PyErr_Fetch(&error_type, &error_value, &error_traceback); @@ -3464,31 +3587,26 @@ slot_tp_del(PyObject *self) /* Undo the temporary resurrection; can't use DECREF here, it would * cause a recursive call. */ - assert(self->ob_refcnt > 0); - if (--self->ob_refcnt == 0) - return; /* this is the normal path out */ + assert(Py_REFCNT(self) > 0); + Py_SET_REFCNT(self, Py_REFCNT(self) - 1); + if (Py_REFCNT(self) == 0) { + /* this is the normal path out */ + return; + } /* __del__ resurrected it! Make it look like the original Py_DECREF * never happened. */ { - Py_ssize_t refcnt = self->ob_refcnt; + Py_ssize_t refcnt = Py_REFCNT(self); _Py_NewReference(self); - self->ob_refcnt = refcnt; - } - assert(!PyType_IS_GC(Py_TYPE(self)) || _PyObject_GC_IS_TRACKED(self)); - /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so - * we need to undo that. */ - _Py_DEC_REFTOTAL; - /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object - * chain, so no more to do there. - * If COUNT_ALLOCS, the original decref bumped tp_frees, and - * _Py_NewReference bumped tp_allocs: both of those need to be - * undone. - */ -#ifdef COUNT_ALLOCS - --Py_TYPE(self)->tp_frees; - --Py_TYPE(self)->tp_allocs; + Py_SET_REFCNT(self, refcnt); + } + assert(!PyType_IS_GC(Py_TYPE(self)) || PyObject_GC_IsTracked(self)); + /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased + _Py_RefTotal, so we need to undo that. */ +#ifdef Py_REF_DEBUG + _Py_RefTotal--; #endif } @@ -3511,6 +3629,25 @@ with_tp_del(PyObject *self, PyObject *args) return obj; } +static PyObject * +without_gc(PyObject *Py_UNUSED(self), PyObject *obj) +{ + PyTypeObject *tp = (PyTypeObject*)obj; + if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) { + return PyErr_Format(PyExc_TypeError, "heap type expected, got %R", obj); + } + if (PyType_IS_GC(tp)) { + // Don't try this at home, kids: + tp->tp_flags -= Py_TPFLAGS_HAVE_GC; + tp->tp_free = PyObject_Del; + tp->tp_traverse = NULL; + tp->tp_clear = NULL; + } + assert(!PyType_IS_GC(tp)); + Py_INCREF(obj); + return obj; +} + static PyMethodDef ml; static PyObject * @@ -4071,8 +4208,6 @@ call_in_temporary_c_thread(PyObject *self, PyObject *callback) test_c_thread_t test_c_thread; long thread; - PyEval_InitThreads(); - test_c_thread.start_event = PyThread_allocate_lock(); test_c_thread.exit_event = PyThread_allocate_lock(); test_c_thread.callback = NULL; @@ -4121,15 +4256,15 @@ static PyObject* pymarshal_write_long_to_file(PyObject* self, PyObject *args) { long value; - char *filename; + PyObject *filename; int version; FILE *fp; - if (!PyArg_ParseTuple(args, "lsi:pymarshal_write_long_to_file", + if (!PyArg_ParseTuple(args, "lOi:pymarshal_write_long_to_file", &value, &filename, &version)) return NULL; - fp = fopen(filename, "wb"); + fp = _Py_fopen_obj(filename, "wb"); if (fp == NULL) { PyErr_SetFromErrno(PyExc_OSError); return NULL; @@ -4147,15 +4282,15 @@ static PyObject* pymarshal_write_object_to_file(PyObject* self, PyObject *args) { PyObject *obj; - char *filename; + PyObject *filename; int version; FILE *fp; - if (!PyArg_ParseTuple(args, "Osi:pymarshal_write_object_to_file", + if (!PyArg_ParseTuple(args, "OOi:pymarshal_write_object_to_file", &obj, &filename, &version)) return NULL; - fp = fopen(filename, "wb"); + fp = _Py_fopen_obj(filename, "wb"); if (fp == NULL) { PyErr_SetFromErrno(PyExc_OSError); return NULL; @@ -4174,13 +4309,13 @@ pymarshal_read_short_from_file(PyObject* self, PyObject *args) { int value; long pos; - char *filename; + PyObject *filename; FILE *fp; - if (!PyArg_ParseTuple(args, "s:pymarshal_read_short_from_file", &filename)) + if (!PyArg_ParseTuple(args, "O:pymarshal_read_short_from_file", &filename)) return NULL; - fp = fopen(filename, "rb"); + fp = _Py_fopen_obj(filename, "rb"); if (fp == NULL) { PyErr_SetFromErrno(PyExc_OSError); return NULL; @@ -4199,13 +4334,13 @@ static PyObject* pymarshal_read_long_from_file(PyObject* self, PyObject *args) { long value, pos; - char *filename; + PyObject *filename; FILE *fp; - if (!PyArg_ParseTuple(args, "s:pymarshal_read_long_from_file", &filename)) + if (!PyArg_ParseTuple(args, "O:pymarshal_read_long_from_file", &filename)) return NULL; - fp = fopen(filename, "rb"); + fp = _Py_fopen_obj(filename, "rb"); if (fp == NULL) { PyErr_SetFromErrno(PyExc_OSError); return NULL; @@ -4225,13 +4360,13 @@ pymarshal_read_last_object_from_file(PyObject* self, PyObject *args) { PyObject *obj; long pos; - char *filename; + PyObject *filename; FILE *fp; - if (!PyArg_ParseTuple(args, "s:pymarshal_read_last_object_from_file", &filename)) + if (!PyArg_ParseTuple(args, "O:pymarshal_read_last_object_from_file", &filename)) return NULL; - fp = fopen(filename, "rb"); + fp = _Py_fopen_obj(filename, "rb"); if (fp == NULL) { PyErr_SetFromErrno(PyExc_OSError); return NULL; @@ -4249,13 +4384,13 @@ pymarshal_read_object_from_file(PyObject* self, PyObject *args) { PyObject *obj; long pos; - char *filename; + PyObject *filename; FILE *fp; - if (!PyArg_ParseTuple(args, "s:pymarshal_read_object_from_file", &filename)) + if (!PyArg_ParseTuple(args, "O:pymarshal_read_object_from_file", &filename)) return NULL; - fp = fopen(filename, "rb"); + fp = _Py_fopen_obj(filename, "rb"); if (fp == NULL) { PyErr_SetFromErrno(PyExc_OSError); return NULL; @@ -4423,15 +4558,6 @@ test_PyTime_AsMicroseconds(PyObject *self, PyObject *args) return _PyTime_AsNanosecondsObject(ms); } -static PyObject* -get_recursion_depth(PyObject *self, PyObject *args) -{ - PyThreadState *tstate = PyThreadState_Get(); - - /* subtract one to ignore the frame of the get_recursion_depth() call */ - return PyLong_FromLong(tstate->recursion_depth - 1); -} - static PyObject* pymem_buffer_overflow(PyObject *self, PyObject *args) { @@ -4518,7 +4644,7 @@ check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args)) return NULL; } /* Initialize reference count to avoid early crash in ceval or GC */ - Py_REFCNT(op) = 1; + Py_SET_REFCNT(op, 1); /* object fields like ob_type are uninitialized! */ return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op); } @@ -4533,7 +4659,7 @@ check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args return NULL; } /* Initialize reference count to avoid early crash in ceval or GC */ - Py_REFCNT(op) = 1; + Py_SET_REFCNT(op, 1); /* ob_type field is after the memory block: part of "forbidden bytes" when using debug hooks on memory allocators! */ return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op); @@ -4549,7 +4675,7 @@ check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args)) } Py_TYPE(op)->tp_dealloc(op); /* Reset reference count to avoid early crash in ceval or GC */ - Py_REFCNT(op) = 1; + Py_SET_REFCNT(op, 1); /* object memory is freed! */ return test_pyobject_is_freed("check_pyobject_freed_is_freed", op); } @@ -4654,8 +4780,8 @@ dict_get_version(PyObject *self, PyObject *args) version = dict->ma_version_tag; - Py_BUILD_ASSERT(sizeof(unsigned PY_LONG_LONG) >= sizeof(version)); - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)version); + Py_BUILD_ASSERT(sizeof(unsigned long long) >= sizeof(version)); + return PyLong_FromUnsignedLongLong((unsigned long long)version); } @@ -4742,7 +4868,7 @@ test_pyobject_fastcalldict(PyObject *self, PyObject *args) return NULL; } - return _PyObject_FastCallDict(func, stack, nargs, kwargs); + return PyObject_VectorcallDict(func, stack, nargs, kwargs); } @@ -4776,7 +4902,7 @@ test_pyobject_vectorcall(PyObject *self, PyObject *args) PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple"); return NULL; } - return _PyObject_Vectorcall(func, stack, nargs, kwnames); + return PyObject_Vectorcall(func, stack, nargs, kwnames); } @@ -4919,7 +5045,7 @@ bad_get(PyObject *module, PyObject *const *args, Py_ssize_t nargs) return NULL; } - PyObject *res = PyObject_CallObject(cls, NULL); + PyObject *res = _PyObject_CallNoArg(cls); if (res == NULL) { return NULL; } @@ -5031,7 +5157,7 @@ negative_refcount(PyObject *self, PyObject *Py_UNUSED(args)) } assert(Py_REFCNT(obj) == 1); - Py_REFCNT(obj) = 0; + Py_SET_REFCNT(obj, 0); /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */ Py_DECREF(obj); @@ -5065,6 +5191,96 @@ test_write_unraisable_exc(PyObject *self, PyObject *args) } +static PyObject * +sequence_getitem(PyObject *self, PyObject *args) +{ + PyObject *seq; + Py_ssize_t i; + if (!PyArg_ParseTuple(args, "On", &seq, &i)) { + return NULL; + } + return PySequence_GetItem(seq, i); +} + + +/* Functions for testing C calling conventions (METH_*) are named meth_*, + * e.g. "meth_varargs" for METH_VARARGS. + * + * They all return a tuple of their C-level arguments, with None instead + * of NULL and Python tuples instead of C arrays. + */ + + +static PyObject* +_null_to_none(PyObject* obj) +{ + if (obj == NULL) { + Py_RETURN_NONE; + } + Py_INCREF(obj); + return obj; +} + +static PyObject* +meth_varargs(PyObject* self, PyObject* args) +{ + return Py_BuildValue("NO", _null_to_none(self), args); +} + +static PyObject* +meth_varargs_keywords(PyObject* self, PyObject* args, PyObject* kwargs) +{ + return Py_BuildValue("NON", _null_to_none(self), args, _null_to_none(kwargs)); +} + +static PyObject* +meth_o(PyObject* self, PyObject* obj) +{ + return Py_BuildValue("NO", _null_to_none(self), obj); +} + +static PyObject* +meth_noargs(PyObject* self, PyObject* ignored) +{ + return _null_to_none(self); +} + +static PyObject* +_fastcall_to_tuple(PyObject* const* args, Py_ssize_t nargs) +{ + PyObject *tuple = PyTuple_New(nargs); + if (tuple == NULL) { + return NULL; + } + for (Py_ssize_t i=0; i < nargs; i++) { + Py_INCREF(args[i]); + PyTuple_SET_ITEM(tuple, i, args[i]); + } + return tuple; +} + +static PyObject* +meth_fastcall(PyObject* self, PyObject* const* args, Py_ssize_t nargs) +{ + return Py_BuildValue( + "NN", _null_to_none(self), _fastcall_to_tuple(args, nargs) + ); +} + +static PyObject* +meth_fastcall_keywords(PyObject* self, PyObject* const* args, + Py_ssize_t nargs, PyObject* kwargs) +{ + PyObject *pyargs = _fastcall_to_tuple(args, nargs); + if (pyargs == NULL) { + return NULL; + } + PyObject *pykwargs = PyObject_Vectorcall((PyObject*)&PyDict_Type, + args + nargs, 0, kwargs); + return Py_BuildValue("NNN", _null_to_none(self), pyargs, pykwargs); +} + + static PyObject* pynumber_tobase(PyObject *module, PyObject *args) { @@ -5103,6 +5319,10 @@ static PyMethodDef TestMethods[] = { {"get_delta_fromdsu", get_delta_fromdsu, METH_VARARGS}, {"get_date_fromtimestamp", get_date_fromtimestamp, METH_VARARGS}, {"get_datetime_fromtimestamp", get_datetime_fromtimestamp, METH_VARARGS}, + {"PyDateTime_GET", test_PyDateTime_GET, METH_O}, + {"PyDateTime_DATE_GET", test_PyDateTime_DATE_GET, METH_O}, + {"PyDateTime_TIME_GET", test_PyDateTime_TIME_GET, METH_O}, + {"PyDateTime_DELTA_GET", test_PyDateTime_DELTA_GET, METH_O}, {"test_list_api", test_list_api, METH_NOARGS}, {"test_dict_iteration", test_dict_iteration, METH_NOARGS}, {"dict_getitem_knownhash", dict_getitem_knownhash, METH_VARARGS}, @@ -5138,6 +5358,7 @@ static PyMethodDef TestMethods[] = { {"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS}, #endif {"getbuffer_with_null_view", getbuffer_with_null_view, METH_O}, + {"PyBuffer_SizeFromFormat", test_PyBuffer_SizeFromFormat, METH_VARARGS}, {"test_buildvalue_N", test_buildvalue_N, METH_NOARGS}, {"test_buildvalue_issue38913", test_buildvalue_issue38913, METH_NOARGS}, {"get_args", get_args, METH_VARARGS}, @@ -5202,6 +5423,8 @@ static PyMethodDef TestMethods[] = { {"unicode_aswidechar", unicode_aswidechar, METH_VARARGS}, {"unicode_aswidecharstring",unicode_aswidecharstring, METH_VARARGS}, {"unicode_asucs4", unicode_asucs4, METH_VARARGS}, + {"unicode_asutf8", unicode_asutf8, METH_VARARGS}, + {"unicode_asutf8andsize", unicode_asutf8andsize, METH_VARARGS}, {"unicode_findchar", unicode_findchar, METH_VARARGS}, {"unicode_copycharacters", unicode_copycharacters, METH_VARARGS}, {"unicode_encodedecimal", unicode_encodedecimal, METH_VARARGS}, @@ -5289,7 +5512,6 @@ static PyMethodDef TestMethods[] = { #endif {"PyTime_AsMilliseconds", test_PyTime_AsMilliseconds, METH_VARARGS}, {"PyTime_AsMicroseconds", test_PyTime_AsMicroseconds, METH_VARARGS}, - {"get_recursion_depth", get_recursion_depth, METH_NOARGS}, {"pymem_buffer_overflow", pymem_buffer_overflow, METH_NOARGS}, {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS}, {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS}, @@ -5324,7 +5546,15 @@ static PyMethodDef TestMethods[] = { {"negative_refcount", negative_refcount, METH_NOARGS}, #endif {"write_unraisable_exc", test_write_unraisable_exc, METH_VARARGS}, + {"sequence_getitem", sequence_getitem, METH_VARARGS}, + {"meth_varargs", meth_varargs, METH_VARARGS}, + {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS}, + {"meth_o", meth_o, METH_O}, + {"meth_noargs", meth_noargs, METH_NOARGS}, + {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL}, + {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS}, {"pynumber_tobase", pynumber_tobase, METH_VARARGS}, + {"without_gc", without_gc, METH_O}, {NULL, NULL} /* sentinel */ }; @@ -5943,7 +6173,7 @@ static PyTypeObject MethodDescriptorBase_Type = { .tp_call = PyVectorcall_Call, .tp_vectorcall_offset = offsetof(MethodDescriptorObject, vectorcall), .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | - Py_TPFLAGS_METHOD_DESCRIPTOR | _Py_TPFLAGS_HAVE_VECTORCALL, + Py_TPFLAGS_METHOD_DESCRIPTOR | Py_TPFLAGS_HAVE_VECTORCALL, .tp_descr_get = func_descr_get, }; @@ -5982,7 +6212,7 @@ static PyTypeObject MethodDescriptor2_Type = { .tp_new = MethodDescriptor2_new, .tp_call = PyVectorcall_Call, .tp_vectorcall_offset = offsetof(MethodDescriptor2Object, vectorcall), - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | _Py_TPFLAGS_HAVE_VECTORCALL, + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_VECTORCALL, }; PyDoc_STRVAR(heapgctype__doc__, @@ -6100,6 +6330,47 @@ static PyType_Spec HeapCTypeSubclass_spec = { HeapCTypeSubclass_slots }; +PyDoc_STRVAR(heapctypewithbuffer__doc__, +"Heap type with buffer support.\n\n" +"The buffer is set to [b'1', b'2', b'3', b'4']"); + +typedef struct { + HeapCTypeObject base; + char buffer[4]; +} HeapCTypeWithBufferObject; + +static int +heapctypewithbuffer_getbuffer(HeapCTypeWithBufferObject *self, Py_buffer *view, int flags) +{ + self->buffer[0] = '1'; + self->buffer[1] = '2'; + self->buffer[2] = '3'; + self->buffer[3] = '4'; + return PyBuffer_FillInfo( + view, (PyObject*)self, (void *)self->buffer, 4, 1, flags); +} + +static void +heapctypewithbuffer_releasebuffer(HeapCTypeWithBufferObject *self, Py_buffer *view) +{ + assert(view->obj == (void*) self); +} + +static PyType_Slot HeapCTypeWithBuffer_slots[] = { + {Py_bf_getbuffer, heapctypewithbuffer_getbuffer}, + {Py_bf_releasebuffer, heapctypewithbuffer_releasebuffer}, + {Py_tp_doc, (char*)heapctypewithbuffer__doc__}, + {0, 0}, +}; + +static PyType_Spec HeapCTypeWithBuffer_spec = { + "_testcapi.HeapCTypeWithBuffer", + sizeof(HeapCTypeWithBufferObject), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + HeapCTypeWithBuffer_slots +}; + PyDoc_STRVAR(heapctypesubclasswithfinalizer__doc__, "Subclass of HeapCType with a finalizer that reassigns __class__.\n\n" "__class__ is set to plain HeapCTypeSubclass during finalization.\n" @@ -6177,6 +6448,106 @@ static PyType_Spec HeapCTypeSubclassWithFinalizer_spec = { HeapCTypeSubclassWithFinalizer_slots }; +typedef struct { + PyObject_HEAD + PyObject *dict; +} HeapCTypeWithDictObject; + +static void +heapctypewithdict_dealloc(HeapCTypeWithDictObject* self) +{ + + PyTypeObject *tp = Py_TYPE(self); + Py_XDECREF(self->dict); + PyObject_DEL(self); + Py_DECREF(tp); +} + +static PyGetSetDef heapctypewithdict_getsetlist[] = { + {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict}, + {NULL} /* Sentinel */ +}; + +static struct PyMemberDef heapctypewithdict_members[] = { + {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)}, + {"__dictoffset__", T_PYSSIZET, offsetof(HeapCTypeWithDictObject, dict), READONLY}, + {NULL} /* Sentinel */ +}; + +static PyType_Slot HeapCTypeWithDict_slots[] = { + {Py_tp_members, heapctypewithdict_members}, + {Py_tp_getset, heapctypewithdict_getsetlist}, + {Py_tp_dealloc, heapctypewithdict_dealloc}, + {0, 0}, +}; + +static PyType_Spec HeapCTypeWithDict_spec = { + "_testcapi.HeapCTypeWithDict", + sizeof(HeapCTypeWithDictObject), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + HeapCTypeWithDict_slots +}; + +static struct PyMemberDef heapctypewithnegativedict_members[] = { + {"dictobj", T_OBJECT, offsetof(HeapCTypeWithDictObject, dict)}, + {"__dictoffset__", T_PYSSIZET, -(Py_ssize_t)sizeof(void*), READONLY}, + {NULL} /* Sentinel */ +}; + +static PyType_Slot HeapCTypeWithNegativeDict_slots[] = { + {Py_tp_members, heapctypewithnegativedict_members}, + {Py_tp_getset, heapctypewithdict_getsetlist}, + {Py_tp_dealloc, heapctypewithdict_dealloc}, + {0, 0}, +}; + +static PyType_Spec HeapCTypeWithNegativeDict_spec = { + "_testcapi.HeapCTypeWithNegativeDict", + sizeof(HeapCTypeWithDictObject), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + HeapCTypeWithNegativeDict_slots +}; + +typedef struct { + PyObject_HEAD + PyObject *weakreflist; +} HeapCTypeWithWeakrefObject; + +static struct PyMemberDef heapctypewithweakref_members[] = { + {"weakreflist", T_OBJECT, offsetof(HeapCTypeWithWeakrefObject, weakreflist)}, + {"__weaklistoffset__", T_PYSSIZET, + offsetof(HeapCTypeWithWeakrefObject, weakreflist), READONLY}, + {NULL} /* Sentinel */ +}; + +static void +heapctypewithweakref_dealloc(HeapCTypeWithWeakrefObject* self) +{ + + PyTypeObject *tp = Py_TYPE(self); + if (self->weakreflist != NULL) + PyObject_ClearWeakRefs((PyObject *) self); + Py_XDECREF(self->weakreflist); + PyObject_DEL(self); + Py_DECREF(tp); +} + +static PyType_Slot HeapCTypeWithWeakref_slots[] = { + {Py_tp_members, heapctypewithweakref_members}, + {Py_tp_dealloc, heapctypewithweakref_dealloc}, + {0, 0}, +}; + +static PyType_Spec HeapCTypeWithWeakref_spec = { + "_testcapi.HeapCTypeWithWeakref", + sizeof(HeapCTypeWithWeakrefObject), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + HeapCTypeWithWeakref_slots +}; + PyDoc_STRVAR(heapctypesetattr__doc__, "A heap type without GC, but with overridden __setattr__.\n\n" "The 'value' attribute is set to 10 in __init__ and updated via attribute setting."); @@ -6251,6 +6622,120 @@ static PyType_Spec HeapCTypeSetattr_spec = { HeapCTypeSetattr_slots }; +static PyMethodDef meth_instance_methods[] = { + {"meth_varargs", meth_varargs, METH_VARARGS}, + {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS}, + {"meth_o", meth_o, METH_O}, + {"meth_noargs", meth_noargs, METH_NOARGS}, + {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL}, + {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS}, + {NULL, NULL} /* sentinel */ +}; + + +static PyTypeObject MethInstance_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "MethInstance", + sizeof(PyObject), + .tp_new = PyType_GenericNew, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_methods = meth_instance_methods, + .tp_doc = (char*)PyDoc_STR( + "Class with normal (instance) methods to test calling conventions"), +}; + +static PyMethodDef meth_class_methods[] = { + {"meth_varargs", meth_varargs, METH_VARARGS|METH_CLASS}, + {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_CLASS}, + {"meth_o", meth_o, METH_O|METH_CLASS}, + {"meth_noargs", meth_noargs, METH_NOARGS|METH_CLASS}, + {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_CLASS}, + {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_CLASS}, + {NULL, NULL} /* sentinel */ +}; + + +static PyTypeObject MethClass_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "MethClass", + sizeof(PyObject), + .tp_new = PyType_GenericNew, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_methods = meth_class_methods, + .tp_doc = PyDoc_STR( + "Class with class methods to test calling conventions"), +}; + +static PyMethodDef meth_static_methods[] = { + {"meth_varargs", meth_varargs, METH_VARARGS|METH_STATIC}, + {"meth_varargs_keywords", (PyCFunction)(void(*)(void))meth_varargs_keywords, METH_VARARGS|METH_KEYWORDS|METH_STATIC}, + {"meth_o", meth_o, METH_O|METH_STATIC}, + {"meth_noargs", meth_noargs, METH_NOARGS|METH_STATIC}, + {"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL|METH_STATIC}, + {"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS|METH_STATIC}, + {NULL, NULL} /* sentinel */ +}; + + +static PyTypeObject MethStatic_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "MethStatic", + sizeof(PyObject), + .tp_new = PyType_GenericNew, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_methods = meth_static_methods, + .tp_doc = PyDoc_STR( + "Class with static methods to test calling conventions"), +}; + +/* ContainerNoGC -- a simple container without GC methods */ + +typedef struct { + PyObject_HEAD + PyObject *value; +} ContainerNoGCobject; + +static PyObject * +ContainerNoGC_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) +{ + PyObject *value; + char *names[] = {"value", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", names, &value)) { + return NULL; + } + PyObject *self = type->tp_alloc(type, 0); + if (self == NULL) { + return NULL; + } + Py_INCREF(value); + ((ContainerNoGCobject *)self)->value = value; + return self; +} + +static void +ContainerNoGC_dealloc(ContainerNoGCobject *self) +{ + Py_DECREF(self->value); + Py_TYPE(self)->tp_free((PyObject *)self); +} + +static PyMemberDef ContainerNoGC_members[] = { + {"value", T_OBJECT, offsetof(ContainerNoGCobject, value), READONLY, + PyDoc_STR("a container value for test purposes")}, + {0} +}; + +static PyTypeObject ContainerNoGC_type = { + PyVarObject_HEAD_INIT(NULL, 0) + "_testcapi.ContainerNoGC", + sizeof(ContainerNoGCobject), + .tp_dealloc = (destructor)ContainerNoGC_dealloc, + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + .tp_members = ContainerNoGC_members, + .tp_new = ContainerNoGC_new, +}; + + static struct PyModuleDef _testcapimodule = { PyModuleDef_HEAD_INIT, "_testcapi", @@ -6275,9 +6760,9 @@ PyInit__testcapi(void) if (m == NULL) return NULL; - Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type; + Py_SET_TYPE(&_HashInheritanceTester_Type, &PyType_Type); - Py_TYPE(&test_structmembersType)=&PyType_Type; + Py_SET_TYPE(&test_structmembersType, &PyType_Type); Py_INCREF(&test_structmembersType); /* don't use a name starting with "test", since we don't want test_capi to automatically call this */ @@ -6303,10 +6788,6 @@ PyInit__testcapi(void) Py_INCREF(&MyList_Type); PyModule_AddObject(m, "MyList", (PyObject *)&MyList_Type); - /* bpo-37250: old Cython code sets tp_print to 0, we check that - * this doesn't break anything. */ - MyList_Type.tp_print = 0; - if (PyType_Ready(&MethodDescriptorBase_Type) < 0) return NULL; Py_INCREF(&MethodDescriptorBase_Type); @@ -6340,6 +6821,21 @@ PyInit__testcapi(void) Py_INCREF(&Generic_Type); PyModule_AddObject(m, "Generic", (PyObject *)&Generic_Type); + if (PyType_Ready(&MethInstance_Type) < 0) + return NULL; + Py_INCREF(&MethInstance_Type); + PyModule_AddObject(m, "MethInstance", (PyObject *)&MethInstance_Type); + + if (PyType_Ready(&MethClass_Type) < 0) + return NULL; + Py_INCREF(&MethClass_Type); + PyModule_AddObject(m, "MethClass", (PyObject *)&MethClass_Type); + + if (PyType_Ready(&MethStatic_Type) < 0) + return NULL; + Py_INCREF(&MethStatic_Type); + PyModule_AddObject(m, "MethStatic", (PyObject *)&MethStatic_Type); + PyRecursingInfinitelyError_Type.tp_base = (PyTypeObject *)PyExc_Exception; if (PyType_Ready(&PyRecursingInfinitelyError_Type) < 0) { return NULL; @@ -6364,12 +6860,11 @@ PyInit__testcapi(void) PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN)); PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX)); PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN)); - PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX)); - PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN)); - PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX)); + PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(LLONG_MAX)); + PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(LLONG_MIN)); + PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(ULLONG_MAX)); PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX)); PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN)); - PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head))); PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t))); Py_INCREF(&PyInstanceMethod_Type); PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type); @@ -6409,6 +6904,30 @@ PyInit__testcapi(void) Py_DECREF(subclass_bases); PyModule_AddObject(m, "HeapCTypeSubclass", HeapCTypeSubclass); + PyObject *HeapCTypeWithDict = PyType_FromSpec(&HeapCTypeWithDict_spec); + if (HeapCTypeWithDict == NULL) { + return NULL; + } + PyModule_AddObject(m, "HeapCTypeWithDict", HeapCTypeWithDict); + + PyObject *HeapCTypeWithNegativeDict = PyType_FromSpec(&HeapCTypeWithNegativeDict_spec); + if (HeapCTypeWithNegativeDict == NULL) { + return NULL; + } + PyModule_AddObject(m, "HeapCTypeWithNegativeDict", HeapCTypeWithNegativeDict); + + PyObject *HeapCTypeWithWeakref = PyType_FromSpec(&HeapCTypeWithWeakref_spec); + if (HeapCTypeWithWeakref == NULL) { + return NULL; + } + PyModule_AddObject(m, "HeapCTypeWithWeakref", HeapCTypeWithWeakref); + + PyObject *HeapCTypeWithBuffer = PyType_FromSpec(&HeapCTypeWithBuffer_spec); + if (HeapCTypeWithBuffer == NULL) { + return NULL; + } + PyModule_AddObject(m, "HeapCTypeWithBuffer", HeapCTypeWithBuffer); + PyObject *HeapCTypeSetattr = PyType_FromSpec(&HeapCTypeSetattr_spec); if (HeapCTypeSetattr == NULL) { return NULL; @@ -6427,6 +6946,14 @@ PyInit__testcapi(void) Py_DECREF(subclass_with_finalizer_bases); PyModule_AddObject(m, "HeapCTypeSubclassWithFinalizer", HeapCTypeSubclassWithFinalizer); + if (PyType_Ready(&ContainerNoGC_type) < 0) { + return NULL; + } + Py_INCREF(&ContainerNoGC_type); + if (PyModule_AddObject(m, "ContainerNoGC", + (PyObject *) &ContainerNoGC_type) < 0) + return NULL; + PyState_AddModule(m, &_testcapimodule); return m; } diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index 3a931cae1fc2eec6b3e58f5e197750511ad6fb65..4445d2e5c624a6053fe33514e02a23a1dff23c7b 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -6,10 +6,16 @@ # error "Py_BUILD_CORE_BUILTIN or Py_BUILD_CORE_MODULE must be defined" #endif +/* Always enable assertions */ +#undef NDEBUG + #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "pycore_initconfig.h" +#include "pycore_byteswap.h" // _Py_bswap32() +#include "pycore_initconfig.h" // _Py_GetConfigsAsDict() +#include "pycore_hashtable.h" // _Py_hashtable_new() +#include "pycore_gc.h" // PyGC_Head #ifdef MS_WINDOWS @@ -62,8 +68,139 @@ get_configs(PyObject *self, PyObject *Py_UNUSED(args)) } +static PyObject* +get_recursion_depth(PyObject *self, PyObject *Py_UNUSED(args)) +{ + PyThreadState *tstate = PyThreadState_Get(); + + /* subtract one to ignore the frame of the get_recursion_depth() call */ + return PyLong_FromLong(tstate->recursion_depth - 1); +} + + +static PyObject* +test_bswap(PyObject *self, PyObject *Py_UNUSED(args)) +{ + uint16_t u16 = _Py_bswap16(UINT16_C(0x3412)); + if (u16 != UINT16_C(0x1234)) { + PyErr_Format(PyExc_AssertionError, + "_Py_bswap16(0x3412) returns %u", u16); + return NULL; + } + + uint32_t u32 = _Py_bswap32(UINT32_C(0x78563412)); + if (u32 != UINT32_C(0x12345678)) { + PyErr_Format(PyExc_AssertionError, + "_Py_bswap32(0x78563412) returns %lu", u32); + return NULL; + } + + uint64_t u64 = _Py_bswap64(UINT64_C(0xEFCDAB9078563412)); + if (u64 != UINT64_C(0x1234567890ABCDEF)) { + PyErr_Format(PyExc_AssertionError, + "_Py_bswap64(0xEFCDAB9078563412) returns %llu", u64); + return NULL; + } + + Py_RETURN_NONE; +} + + +#define TO_PTR(ch) ((void*)(uintptr_t)ch) +#define FROM_PTR(ptr) ((uintptr_t)ptr) +#define VALUE(key) (1 + ((int)(key) - 'a')) + +static Py_uhash_t +hash_char(const void *key) +{ + char ch = (char)FROM_PTR(key); + return ch; +} + + +static int +hashtable_cb(_Py_hashtable_t *table, + const void *key_ptr, const void *value_ptr, + void *user_data) +{ + int *count = (int *)user_data; + char key = (char)FROM_PTR(key_ptr); + int value = (int)FROM_PTR(value_ptr); + assert(value == VALUE(key)); + *count += 1; + return 0; +} + + +static PyObject* +test_hashtable(PyObject *self, PyObject *Py_UNUSED(args)) +{ + _Py_hashtable_t *table = _Py_hashtable_new(hash_char, + _Py_hashtable_compare_direct); + if (table == NULL) { + return PyErr_NoMemory(); + } + + // Using an newly allocated table must not crash + assert(table->nentries == 0); + assert(table->nbuckets > 0); + assert(_Py_hashtable_get(table, TO_PTR('x')) == NULL); + + // Test _Py_hashtable_set() + char key; + for (key='a'; key <= 'z'; key++) { + int value = VALUE(key); + if (_Py_hashtable_set(table, TO_PTR(key), TO_PTR(value)) < 0) { + _Py_hashtable_destroy(table); + return PyErr_NoMemory(); + } + } + assert(table->nentries == 26); + assert(table->nbuckets > table->nentries); + + // Test _Py_hashtable_get_entry() + for (key='a'; key <= 'z'; key++) { + _Py_hashtable_entry_t *entry = _Py_hashtable_get_entry(table, TO_PTR(key)); + assert(entry != NULL); + assert(entry->key == TO_PTR(key)); + assert(entry->value == TO_PTR(VALUE(key))); + } + + // Test _Py_hashtable_get() + for (key='a'; key <= 'z'; key++) { + void *value_ptr = _Py_hashtable_get(table, TO_PTR(key)); + assert((int)FROM_PTR(value_ptr) == VALUE(key)); + } + + // Test _Py_hashtable_steal() + key = 'p'; + void *value_ptr = _Py_hashtable_steal(table, TO_PTR(key)); + assert((int)FROM_PTR(value_ptr) == VALUE(key)); + assert(table->nentries == 25); + assert(_Py_hashtable_get_entry(table, TO_PTR(key)) == NULL); + + // Test _Py_hashtable_foreach() + int count = 0; + int res = _Py_hashtable_foreach(table, hashtable_cb, &count); + assert(res == 0); + assert(count == 25); + + // Test _Py_hashtable_clear() + _Py_hashtable_clear(table); + assert(table->nentries == 0); + assert(table->nbuckets > 0); + assert(_Py_hashtable_get(table, TO_PTR('x')) == NULL); + + _Py_hashtable_destroy(table); + Py_RETURN_NONE; +} + + static PyMethodDef TestMethods[] = { {"get_configs", get_configs, METH_NOARGS}, + {"get_recursion_depth", get_recursion_depth, METH_NOARGS}, + {"test_bswap", test_bswap, METH_NOARGS}, + {"test_hashtable", test_hashtable, METH_NOARGS}, {NULL, NULL} /* sentinel */ }; @@ -84,5 +221,19 @@ static struct PyModuleDef _testcapimodule = { PyMODINIT_FUNC PyInit__testinternalcapi(void) { - return PyModule_Create(&_testcapimodule); + PyObject *module = PyModule_Create(&_testcapimodule); + if (module == NULL) { + return NULL; + } + + if (PyModule_AddObject(module, "SIZEOF_PYGC_HEAD", + PyLong_FromSsize_t(sizeof(PyGC_Head))) < 0) { + goto error; + } + + return module; + +error: + Py_DECREF(module); + return NULL; } diff --git a/Modules/_testmultiphase.c b/Modules/_testmultiphase.c index 4933abbabbe307e6178df2db7df8100d22439aec..d69ae628fa7a40d3fc82a7baa3d25a5641a78fc3 100644 --- a/Modules/_testmultiphase.c +++ b/Modules/_testmultiphase.c @@ -4,6 +4,19 @@ #include "Python.h" +/* State for testing module state access from methods */ + +typedef struct { + int counter; +} meth_state; + +/*[clinic input] +module _testmultiphase + +class _testmultiphase.StateAccessType "StateAccessTypeObject *" "!StateAccessType" +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=bab9f2fe3bd312ff]*/ + /* Example objects */ typedef struct { PyObject_HEAD @@ -14,6 +27,10 @@ typedef struct { PyObject *integer; } testmultiphase_state; +typedef struct { + PyObject_HEAD +} StateAccessTypeObject; + /* Example methods */ static int @@ -42,6 +59,7 @@ Example_demo(ExampleObject *self, PyObject *args) Py_RETURN_NONE; } +#include "clinic/_testmultiphase.c.h" static PyMethodDef Example_methods[] = { {"demo", (PyCFunction)Example_demo, METH_VARARGS, @@ -102,6 +120,150 @@ static PyType_Spec Example_Type_spec = { Example_Type_slots }; + +/*[clinic input] +_testmultiphase.StateAccessType.get_defining_module + + cls: defining_class + +Return the module of the defining class. +[clinic start generated code]*/ + +static PyObject * +_testmultiphase_StateAccessType_get_defining_module_impl(StateAccessTypeObject *self, + PyTypeObject *cls) +/*[clinic end generated code: output=ba2a14284a5d0921 input=946149f91cf72c0d]*/ +{ + PyObject *retval; + retval = PyType_GetModule(cls); + if (retval == NULL) { + return NULL; + } + Py_INCREF(retval); + return retval; +} + +/*[clinic input] +_testmultiphase.StateAccessType.increment_count_clinic + + cls: defining_class + / + n: int = 1 + * + twice: bool = False + +Add 'n' from the module-state counter. + +Pass 'twice' to double that amount. + +This tests Argument Clinic support for defining_class. +[clinic start generated code]*/ + +static PyObject * +_testmultiphase_StateAccessType_increment_count_clinic_impl(StateAccessTypeObject *self, + PyTypeObject *cls, + int n, int twice) +/*[clinic end generated code: output=3b34f86bc5473204 input=551d482e1fe0b8f5]*/ +{ + meth_state *m_state = PyType_GetModuleState(cls); + if (twice) { + n *= 2; + } + m_state->counter += n; + + Py_RETURN_NONE; +} + +PyDoc_STRVAR(_StateAccessType_decrement_count__doc__, +"decrement_count($self, /, n=1, *, twice=None)\n" +"--\n" +"\n" +"Add 'n' from the module-state counter.\n" +"Pass 'twice' to double that amount.\n" +"(This is to test both positional and keyword arguments."); + +// Intentionally does not use Argument Clinic +static PyObject * +_StateAccessType_increment_count_noclinic(StateAccessTypeObject *self, + PyTypeObject *defining_class, + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwnames) +{ + if (!_PyArg_CheckPositional("StateAccessTypeObject.decrement_count", nargs, 0, 1)) { + return NULL; + } + long n = 1; + if (nargs) { + n = PyLong_AsLong(args[0]); + if (PyErr_Occurred()) { + return NULL; + } + } + if (kwnames && PyTuple_Check(kwnames)) { + if (PyTuple_GET_SIZE(kwnames) > 1 || + PyUnicode_CompareWithASCIIString( + PyTuple_GET_ITEM(kwnames, 0), + "twice" + )) { + PyErr_SetString( + PyExc_TypeError, + "decrement_count only takes 'twice' keyword argument" + ); + return NULL; + } + n *= 2; + } + meth_state *m_state = PyType_GetModuleState(defining_class); + m_state->counter += n; + + Py_RETURN_NONE; +} + +/*[clinic input] +_testmultiphase.StateAccessType.get_count + + cls: defining_class + +Return the value of the module-state counter. +[clinic start generated code]*/ + +static PyObject * +_testmultiphase_StateAccessType_get_count_impl(StateAccessTypeObject *self, + PyTypeObject *cls) +/*[clinic end generated code: output=64600f95b499a319 input=d5d181f12384849f]*/ +{ + meth_state *m_state = PyType_GetModuleState(cls); + return PyLong_FromLong(m_state->counter); +} + +static PyMethodDef StateAccessType_methods[] = { + _TESTMULTIPHASE_STATEACCESSTYPE_GET_DEFINING_MODULE_METHODDEF + _TESTMULTIPHASE_STATEACCESSTYPE_GET_COUNT_METHODDEF + _TESTMULTIPHASE_STATEACCESSTYPE_INCREMENT_COUNT_CLINIC_METHODDEF + { + "increment_count_noclinic", + (PyCFunction)(void(*)(void))_StateAccessType_increment_count_noclinic, + METH_METHOD|METH_FASTCALL|METH_KEYWORDS, + _StateAccessType_decrement_count__doc__ + }, + {NULL, NULL} /* sentinel */ +}; + +static PyType_Slot StateAccessType_Type_slots[] = { + {Py_tp_doc, "Type for testing per-module state access from methods."}, + {Py_tp_methods, StateAccessType_methods}, + {0, NULL} +}; + +static PyType_Spec StateAccessType_spec = { + "_testimportexec.StateAccessType", + sizeof(StateAccessTypeObject), + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE | Py_TPFLAGS_BASETYPE, + StateAccessType_Type_slots +}; + /* Function of two integers returning integer */ PyDoc_STRVAR(testexport_foo_doc, @@ -193,30 +355,39 @@ static int execfunc(PyObject *m) /* Add a custom type */ temp = PyType_FromSpec(&Example_Type_spec); - if (temp == NULL) + if (temp == NULL) { goto fail; - if (PyModule_AddObject(m, "Example", temp) != 0) + } + if (PyModule_AddObject(m, "Example", temp) != 0) { goto fail; + } + /* Add an exception type */ temp = PyErr_NewException("_testimportexec.error", NULL, NULL); - if (temp == NULL) + if (temp == NULL) { goto fail; - if (PyModule_AddObject(m, "error", temp) != 0) + } + if (PyModule_AddObject(m, "error", temp) != 0) { goto fail; + } /* Add Str */ temp = PyType_FromSpec(&Str_Type_spec); - if (temp == NULL) + if (temp == NULL) { goto fail; - if (PyModule_AddObject(m, "Str", temp) != 0) + } + if (PyModule_AddObject(m, "Str", temp) != 0) { goto fail; + } - if (PyModule_AddIntConstant(m, "int_const", 1969) != 0) + if (PyModule_AddIntConstant(m, "int_const", 1969) != 0) { goto fail; + } - if (PyModule_AddStringConstant(m, "str_const", "something different") != 0) + if (PyModule_AddStringConstant(m, "str_const", "something different") != 0) { goto fail; + } return 0; fail: @@ -225,20 +396,18 @@ static int execfunc(PyObject *m) /* Helper for module definitions; there'll be a lot of them */ -#define TEST_MODULE_DEF_EX(name, slots, methods, statesize, traversefunc) { \ +#define TEST_MODULE_DEF(name, slots, methods) { \ PyModuleDef_HEAD_INIT, /* m_base */ \ name, /* m_name */ \ PyDoc_STR("Test module " name), /* m_doc */ \ - statesize, /* m_size */ \ + 0, /* m_size */ \ methods, /* m_methods */ \ slots, /* m_slots */ \ - traversefunc, /* m_traverse */ \ + NULL, /* m_traverse */ \ NULL, /* m_clear */ \ NULL, /* m_free */ \ } -#define TEST_MODULE_DEF(name, slots, methods) TEST_MODULE_DEF_EX(name, slots, methods, 0, NULL) - static PyModuleDef_Slot main_slots[] = { {Py_mod_exec, execfunc}, {0, NULL}, @@ -623,51 +792,49 @@ PyInit__testmultiphase_exec_unreported_exception(PyObject *spec) } static int -bad_traverse(PyObject *self, visitproc visit, void *arg) { - testmultiphase_state *m_state; - - m_state = PyModule_GetState(self); - - /* The following assertion mimics any traversal function that doesn't correctly handle - * the case during module creation where the module state hasn't been created yet. - * - * The check that it is used to test only runs in debug mode, so it is OK that the - * assert() will get compiled out in fully optimised release builds. - */ - assert(m_state != NULL); - Py_VISIT(m_state->integer); - return 0; -} - -static int -execfunc_with_bad_traverse(PyObject *mod) { - testmultiphase_state *m_state; +meth_state_access_exec(PyObject *m) +{ + PyObject *temp; + meth_state *m_state; - m_state = PyModule_GetState(mod); + m_state = PyModule_GetState(m); if (m_state == NULL) { return -1; } - m_state->integer = PyLong_FromLong(0x7fffffff); - Py_INCREF(m_state->integer); + temp = PyType_FromModuleAndSpec(m, &StateAccessType_spec, NULL); + if (temp == NULL) { + return -1; + } + if (PyModule_AddObject(m, "StateAccessType", temp) != 0) { + return -1; + } + return 0; } -static PyModuleDef_Slot slots_with_bad_traverse[] = { - {Py_mod_exec, execfunc_with_bad_traverse}, +static PyModuleDef_Slot meth_state_access_slots[] = { + {Py_mod_exec, meth_state_access_exec}, {0, NULL} }; -static PyModuleDef def_with_bad_traverse = TEST_MODULE_DEF_EX( - "_testmultiphase_with_bad_traverse", slots_with_bad_traverse, NULL, - sizeof(testmultiphase_state), bad_traverse); +static PyModuleDef def_meth_state_access = { + PyModuleDef_HEAD_INIT, + .m_name = "_testmultiphase_meth_state_access", + .m_doc = PyDoc_STR("Module testing access" + " to state from methods."), + .m_size = sizeof(meth_state), + .m_slots = meth_state_access_slots, +}; PyMODINIT_FUNC -PyInit__testmultiphase_with_bad_traverse(PyObject *spec) { - return PyModuleDef_Init(&def_with_bad_traverse); +PyInit__testmultiphase_meth_state_access(PyObject *spec) +{ + return PyModuleDef_Init(&def_meth_state_access); } + /*** Helper for imp test ***/ static PyModuleDef imp_dummy_def = TEST_MODULE_DEF("imp_dummy", main_slots, testexport_methods); diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index fadf57aaa762e1b1e899c495fceccc87c8abd4dd..77baba4847897b08c89b67ce00fb9d349d18ba52 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -4,9 +4,9 @@ #include "Python.h" #include "pycore_pylifecycle.h" -#include "pycore_pystate.h" -#include "structmember.h" /* offsetof */ -#include "pythread.h" +#include "pycore_interp.h" // _PyInterpreterState.num_threads +#include "pycore_pystate.h" // _PyThreadState_Init() +#include // offsetof() static PyObject *ThreadError; static PyObject *str_dict; @@ -205,6 +205,22 @@ lock_repr(lockobject *self) self->locked ? "locked" : "unlocked", Py_TYPE(self)->tp_name, self); } +#ifdef HAVE_FORK +static PyObject * +lock__at_fork_reinit(lockobject *self, PyObject *Py_UNUSED(args)) +{ + if (_PyThread_at_fork_reinit(&self->lock_lock) < 0) { + PyErr_SetString(ThreadError, "failed to reinitialize lock at fork"); + return NULL; + } + + self->locked = 0; + + Py_RETURN_NONE; +} +#endif /* HAVE_FORK */ + + static PyMethodDef lock_methods[] = { {"acquire_lock", (PyCFunction)(void(*)(void))lock_PyThread_acquire_lock, METH_VARARGS | METH_KEYWORDS, acquire_doc}, @@ -222,6 +238,10 @@ static PyMethodDef lock_methods[] = { METH_VARARGS | METH_KEYWORDS, acquire_doc}, {"__exit__", (PyCFunction)lock_PyThread_release_lock, METH_VARARGS, release_doc}, +#ifdef HAVE_FORK + {"_at_fork_reinit", (PyCFunction)lock__at_fork_reinit, + METH_NOARGS, NULL}, +#endif {NULL, NULL} /* sentinel */ }; @@ -438,22 +458,20 @@ For internal use by `threading.Condition`."); static PyObject * rlock_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { - rlockobject *self; - - self = (rlockobject *) type->tp_alloc(type, 0); - if (self != NULL) { - self->in_weakreflist = NULL; - self->rlock_owner = 0; - self->rlock_count = 0; - - self->rlock_lock = PyThread_allocate_lock(); - if (self->rlock_lock == NULL) { - Py_DECREF(self); - PyErr_SetString(ThreadError, "can't allocate lock"); - return NULL; - } + rlockobject *self = (rlockobject *) type->tp_alloc(type, 0); + if (self == NULL) { + return NULL; } + self->in_weakreflist = NULL; + self->rlock_owner = 0; + self->rlock_count = 0; + self->rlock_lock = PyThread_allocate_lock(); + if (self->rlock_lock == NULL) { + Py_DECREF(self); + PyErr_SetString(ThreadError, "can't allocate lock"); + return NULL; + } return (PyObject *) self; } @@ -467,6 +485,23 @@ rlock_repr(rlockobject *self) } +#ifdef HAVE_FORK +static PyObject * +rlock__at_fork_reinit(rlockobject *self, PyObject *Py_UNUSED(args)) +{ + if (_PyThread_at_fork_reinit(&self->rlock_lock) < 0) { + PyErr_SetString(ThreadError, "failed to reinitialize lock at fork"); + return NULL; + } + + self->rlock_owner = 0; + self->rlock_count = 0; + + Py_RETURN_NONE; +} +#endif /* HAVE_FORK */ + + static PyMethodDef rlock_methods[] = { {"acquire", (PyCFunction)(void(*)(void))rlock_acquire, METH_VARARGS | METH_KEYWORDS, rlock_acquire_doc}, @@ -482,6 +517,10 @@ static PyMethodDef rlock_methods[] = { METH_VARARGS | METH_KEYWORDS, rlock_acquire_doc}, {"__exit__", (PyCFunction)rlock_release, METH_VARARGS, rlock_release_doc}, +#ifdef HAVE_FORK + {"_at_fork_reinit", (PyCFunction)rlock__at_fork_reinit, + METH_NOARGS, NULL}, +#endif {NULL, NULL} /* sentinel */ }; @@ -548,8 +587,6 @@ newlockobject(void) /* Thread-local objects */ -#include "structmember.h" - /* Quick overview: We need to be able to reclaim reference cycles as soon as possible @@ -836,7 +873,7 @@ _ldict(localobject *self) } } else { - assert(Py_TYPE(dummy) == &localdummytype); + assert(Py_IS_TYPE(dummy, &localdummytype)); ldict = ((localdummyobject *) dummy)->localdict; } @@ -930,7 +967,7 @@ local_getattro(localobject *self, PyObject *name) if (r == -1) return NULL; - if (Py_TYPE(self) != &localtype) + if (!Py_IS_TYPE(self, &localtype)) /* use generic lookup for subtypes */ return _PyObject_GenericGetAttrWithDict( (PyObject *)self, name, ldict, 0); @@ -985,6 +1022,7 @@ struct bootstate { PyObject *args; PyObject *keyw; PyThreadState *tstate; + _PyRuntimeState *runtime; }; static void @@ -996,7 +1034,7 @@ t_bootstrap(void *boot_raw) tstate = boot->tstate; tstate->thread_id = PyThread_get_thread_ident(); - _PyThreadState_Init(&_PyRuntime, tstate); + _PyThreadState_Init(tstate); PyEval_AcquireThread(tstate); tstate->interp->num_threads++; res = PyObject_Call(boot->func, boot->args, boot->keyw); @@ -1017,13 +1055,14 @@ t_bootstrap(void *boot_raw) PyMem_DEL(boot_raw); tstate->interp->num_threads--; PyThreadState_Clear(tstate); - PyThreadState_DeleteCurrent(); + _PyThreadState_DeleteCurrent(tstate); PyThread_exit_thread(); } static PyObject * thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) { + _PyRuntimeState *runtime = &_PyRuntime; PyObject *func, *args, *keyw = NULL; struct bootstate *boot; unsigned long ident; @@ -1046,14 +1085,23 @@ thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) "optional 3rd arg must be a dictionary"); return NULL; } + + PyInterpreterState *interp = _PyInterpreterState_GET(); + if (interp->config._isolated_interpreter) { + PyErr_SetString(PyExc_RuntimeError, + "thread is not supported for isolated subinterpreters"); + return NULL; + } + boot = PyMem_NEW(struct bootstate, 1); if (boot == NULL) return PyErr_NoMemory(); - boot->interp = _PyInterpreterState_Get(); + boot->interp = _PyInterpreterState_GET(); boot->func = func; boot->args = args; boot->keyw = keyw; boot->tstate = _PyThreadState_Prealloc(boot->interp); + boot->runtime = runtime; if (boot->tstate == NULL) { PyMem_DEL(boot); return PyErr_NoMemory(); @@ -1061,7 +1109,7 @@ thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs) Py_INCREF(func); Py_INCREF(args); Py_XINCREF(keyw); - PyEval_InitThreads(); /* Start the interpreter's thread-awareness */ + ident = PyThread_start_new_thread(t_bootstrap, (void*) boot); if (ident == PYTHREAD_INVALID_THREAD_ID) { PyErr_SetString(ThreadError, "can't start new thread"); @@ -1170,7 +1218,7 @@ particular thread within a system."); static PyObject * thread__count(PyObject *self, PyObject *Py_UNUSED(ignored)) { - PyInterpreterState *interp = _PyInterpreterState_Get(); + PyInterpreterState *interp = _PyInterpreterState_GET(); return PyLong_FromLong(interp->num_threads); } @@ -1196,7 +1244,7 @@ release_sentinel(void *wr_raw) PyObject *obj = PyWeakref_GET_OBJECT(wr); lockobject *lock; if (obj != Py_None) { - assert(Py_TYPE(obj) == &Locktype); + assert(Py_IS_TYPE(obj, &Locktype)); lock = (lockobject *) obj; if (lock->locked) { PyThread_release_lock(lock->lock_lock); @@ -1351,7 +1399,7 @@ thread_excepthook_file(PyObject *file, PyObject *exc_type, PyObject *exc_value, _PyErr_Display(file, exc_type, exc_value, exc_traceback); /* Call file.flush() */ - PyObject *res = _PyObject_CallMethodId(file, &PyId_flush, NULL); + PyObject *res = _PyObject_CallMethodIdNoArgs(file, &PyId_flush); if (!res) { return -1; } @@ -1387,7 +1435,7 @@ static PyStructSequence_Desc ExceptHookArgs_desc = { static PyObject * thread_excepthook(PyObject *self, PyObject *args) { - if (Py_TYPE(args) != &ExceptHookArgsType) { + if (!Py_IS_TYPE(args, &ExceptHookArgsType)) { PyErr_SetString(PyExc_TypeError, "_thread.excepthook argument type " "must be ExceptHookArgs"); @@ -1513,7 +1561,7 @@ PyInit__thread(void) PyObject *m, *d, *v; double time_max; double timeout_max; - PyInterpreterState *interp = _PyInterpreterState_Get(); + PyInterpreterState *interp = _PyInterpreterState_GET(); /* Initialize types: */ if (PyType_Ready(&localdummytype) < 0) diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index a1071e5a5812f2dd12ef7e3deb568a7637dc1386..b30141d4497bda320b3f0d89d8092362ef6abf59 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -26,8 +26,6 @@ Copyright (C) 1994 Steen Lumholt. #include "Python.h" #include -#include "pythread.h" - #ifdef MS_WINDOWS #include #endif @@ -56,7 +54,7 @@ Copyright (C) 1994 Steen Lumholt. #if TK_HEX_VERSION >= 0x08050208 && TK_HEX_VERSION < 0x08060000 || \ TK_HEX_VERSION >= 0x08060200 -#define HAVE_LIBTOMMAMTH +#define HAVE_LIBTOMMATH #include #endif @@ -397,7 +395,8 @@ unicodeFromTclStringAndSize(const char *s, Py_ssize_t size) char *buf = NULL; PyErr_Clear(); - /* Tcl encodes null character as \xc0\x80 */ + /* Tcl encodes null character as \xc0\x80. + https://en.wikipedia.org/wiki/UTF-8#Modified_UTF-8 */ if (memchr(s, '\xc0', size)) { char *q; const char *e = s + size; @@ -421,6 +420,57 @@ unicodeFromTclStringAndSize(const char *s, Py_ssize_t size) if (buf != NULL) { PyMem_Free(buf); } + if (r == NULL || PyUnicode_KIND(r) == PyUnicode_1BYTE_KIND) { + return r; + } + + /* In CESU-8 non-BMP characters are represented as a surrogate pair, + like in UTF-16, and then each surrogate code point is encoded in UTF-8. + https://en.wikipedia.org/wiki/CESU-8 */ + Py_ssize_t len = PyUnicode_GET_LENGTH(r); + Py_ssize_t i, j; + /* All encoded surrogate characters start with \xED. */ + i = PyUnicode_FindChar(r, 0xdcED, 0, len, 1); + if (i == -2) { + Py_DECREF(r); + return NULL; + } + if (i == -1) { + return r; + } + Py_UCS4 *u = PyUnicode_AsUCS4Copy(r); + Py_DECREF(r); + if (u == NULL) { + return NULL; + } + Py_UCS4 ch; + for (j = i; i < len; i++, u[j++] = ch) { + Py_UCS4 ch1, ch2, ch3, high, low; + /* Low surrogates U+D800 - U+DBFF are encoded as + \xED\xA0\x80 - \xED\xAF\xBF. */ + ch1 = ch = u[i]; + if (ch1 != 0xdcED) continue; + ch2 = u[i + 1]; + if (!(0xdcA0 <= ch2 && ch2 <= 0xdcAF)) continue; + ch3 = u[i + 2]; + if (!(0xdc80 <= ch3 && ch3 <= 0xdcBF)) continue; + high = 0xD000 | ((ch2 & 0x3F) << 6) | (ch3 & 0x3F); + assert(Py_UNICODE_IS_HIGH_SURROGATE(high)); + /* High surrogates U+DC00 - U+DFFF are encoded as + \xED\xB0\x80 - \xED\xBF\xBF. */ + ch1 = u[i + 3]; + if (ch1 != 0xdcED) continue; + ch2 = u[i + 4]; + if (!(0xdcB0 <= ch2 && ch2 <= 0xdcBF)) continue; + ch3 = u[i + 5]; + if (!(0xdc80 <= ch3 && ch3 <= 0xdcBF)) continue; + low = 0xD000 | ((ch2 & 0x3F) << 6) | (ch3 & 0x3F); + assert(Py_UNICODE_IS_HIGH_SURROGATE(high)); + ch = Py_UNICODE_JOIN_SURROGATES(high, low); + i += 5; + } + r = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, u, j); + PyMem_Free(u); return r; } @@ -574,9 +624,9 @@ SplitObj(PyObject *arg) else if (PyBytes_Check(arg)) { int argc; const char **argv; - char *list = PyBytes_AS_STRING(arg); + const char *list = PyBytes_AS_STRING(arg); - if (Tcl_SplitList((Tcl_Interp *)NULL, list, &argc, &argv) != TCL_OK) { + if (Tcl_SplitList((Tcl_Interp *)NULL, (char *)list, &argc, &argv) != TCL_OK) { Py_INCREF(arg); return arg; } @@ -712,8 +762,8 @@ Tkapp_New(const char *screenName, const char *className, } strcpy(argv0, className); - if (Py_ISUPPER(Py_CHARMASK(argv0[0]))) - argv0[0] = Py_TOLOWER(Py_CHARMASK(argv0[0])); + if (Py_ISUPPER(argv0[0])) + argv0[0] = Py_TOLOWER(argv0[0]); Tcl_SetVar(v->interp, "argv0", argv0, TCL_GLOBAL_ONLY); PyMem_Free(argv0); @@ -833,7 +883,7 @@ typedef struct { } PyTclObject; static PyObject *PyTclObject_Type; -#define PyTclObject_Check(v) ((v)->ob_type == (PyTypeObject *) PyTclObject_Type) +#define PyTclObject_Check(v) Py_IS_TYPE(v, (PyTypeObject *) PyTclObject_Type) static PyObject * newPyTclObject(Tcl_Obj *arg) @@ -967,7 +1017,7 @@ static PyType_Spec PyTclObject_Type_spec = { #define CHECK_STRING_LENGTH(s) #endif -#ifdef HAVE_LIBTOMMAMTH +#ifdef HAVE_LIBTOMMATH static Tcl_Obj* asBignumObj(PyObject *value) { @@ -1047,7 +1097,7 @@ AsObj(PyObject *value) #endif /* If there is an overflow in the wideInt conversion, fall through to bignum handling. */ -#ifdef HAVE_LIBTOMMAMTH +#ifdef HAVE_LIBTOMMATH return asBignumObj(value); #endif /* If there is no wideInt or bignum support, @@ -1169,7 +1219,7 @@ fromWideIntObj(TkappObject *tkapp, Tcl_Obj *value) return NULL; } -#ifdef HAVE_LIBTOMMAMTH +#ifdef HAVE_LIBTOMMATH static PyObject* fromBignumObj(TkappObject *tkapp, Tcl_Obj *value) { @@ -1249,7 +1299,7 @@ FromObj(TkappObject *tkapp, Tcl_Obj *value) fall through to bignum handling. */ } -#ifdef HAVE_LIBTOMMAMTH +#ifdef HAVE_LIBTOMMATH if (value->typePtr == tkapp->IntType || value->typePtr == tkapp->WideIntType || value->typePtr == tkapp->BignumType) { @@ -1302,7 +1352,7 @@ FromObj(TkappObject *tkapp, Tcl_Obj *value) } #endif -#ifdef HAVE_LIBTOMMAMTH +#ifdef HAVE_LIBTOMMATH if (tkapp->BignumType == NULL && strcmp(value->typePtr->name, "bignum") == 0) { /* bignum type is not registered in Tcl */ @@ -1734,7 +1784,7 @@ varname_converter(PyObject *in, void *_out) } PyErr_Format(PyExc_TypeError, "must be str, bytes or Tcl_Obj, not %.50s", - in->ob_type->tp_name); + Py_TYPE(in)->tp_name); return 0; } @@ -2003,7 +2053,7 @@ _tkinter_tkapp_getint(TkappObject *self, PyObject *arg) Prefer bignum because Tcl_GetWideIntFromObj returns ambiguous result for value in ranges -2**64..-2**63-1 and 2**63..2**64-1 (on 32-bit platform). */ -#ifdef HAVE_LIBTOMMAMTH +#ifdef HAVE_LIBTOMMATH result = fromBignumObj(self, value); #else result = fromWideIntObj(self, value); @@ -2166,11 +2216,9 @@ _tkinter_tkapp_exprdouble_impl(TkappObject *self, const char *s) CHECK_STRING_LENGTH(s); CHECK_TCL_APPARTMENT; - PyFPE_START_PROTECT("Tkapp_ExprDouble", return 0) ENTER_TCL retval = Tcl_ExprDouble(Tkapp_Interp(self), s, &v); ENTER_OVERLAP - PyFPE_END_PROTECT(retval) if (retval == TCL_ERROR) res = Tkinter_Error(self); else @@ -2304,6 +2352,12 @@ _tkinter_tkapp_split(TkappObject *self, PyObject *arg) PyObject *v; char *list; + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "split() is deprecated; consider using splitlist() instead", 1)) + { + return NULL; + } + if (PyTclObject_Check(arg)) { Tcl_Obj *value = ((PyTclObject*)arg)->value; int objc; @@ -2798,7 +2852,7 @@ TimerHandler(ClientData clientData) ENTER_PYTHON - res = _PyObject_CallNoArg(func); + res = PyObject_CallNoArgs(func); Py_DECREF(func); Py_DECREF(v); /* See Tktt_New() */ diff --git a/Modules/_tracemalloc.c b/Modules/_tracemalloc.c index cbcf55f817435f5e173da494e98a5f3c706a0af2..04f6c243b5ca4d1fdb539ffadb4ba8244846f875 100644 --- a/Modules/_tracemalloc.c +++ b/Modules/_tracemalloc.c @@ -1,9 +1,9 @@ #include "Python.h" +#include "pycore_gc.h" // PyGC_Head +#include "pycore_pymem.h" // _Py_tracemalloc_config #include "pycore_traceback.h" -#include "hashtable.h" -#include "frameobject.h" -#include "pythread.h" -#include "osdefs.h" +#include "pycore_hashtable.h" +#include "frameobject.h" // PyFrame_GetBack() #include "clinic/_tracemalloc.c.h" /*[clinic input] @@ -23,6 +23,9 @@ static void raw_free(void *ptr); # define TRACE_DEBUG #endif +#define TO_PTR(key) ((const void *)(uintptr_t)(key)) +#define FROM_PTR(key) ((uintptr_t)(key)) + /* Protected by the GIL */ static struct { PyMemAllocatorEx mem; @@ -34,7 +37,7 @@ static struct { #if defined(TRACE_RAW_MALLOC) /* This lock is needed because tracemalloc_free() is called without the GIL held from PyMem_RawFree(). It cannot acquire the lock because it - would introduce a deadlock in PyThreadState_DeleteCurrent(). */ + would introduce a deadlock in _PyThreadState_DeleteCurrent(). */ static PyThread_type_lock tables_lock; # define TABLES_LOCK() PyThread_acquire_lock(tables_lock, 1) # define TABLES_UNLOCK() PyThread_release_lock(tables_lock) @@ -47,16 +50,6 @@ static PyThread_type_lock tables_lock; #define DEFAULT_DOMAIN 0 -/* Pack the frame_t structure to reduce the memory footprint. */ -typedef struct -#ifdef __GNUC__ -__attribute__((packed)) -#endif -{ - uintptr_t ptr; - unsigned int domain; -} pointer_t; - /* Pack the frame_t structure to reduce the memory footprint on 64-bit architectures: 12 bytes instead of 16. */ typedef struct @@ -78,15 +71,20 @@ __attribute__((packed)) typedef struct { Py_uhash_t hash; - int nframe; + /* Number of frames stored */ + uint16_t nframe; + /* Total number of frames the traceback had */ + uint16_t total_nframe; frame_t frames[1]; } traceback_t; #define TRACEBACK_SIZE(NFRAME) \ (sizeof(traceback_t) + sizeof(frame_t) * (NFRAME - 1)) -#define MAX_NFRAME \ - ((INT_MAX - (int)sizeof(traceback_t)) / (int)sizeof(frame_t) + 1) +/* The maximum number of frames is either: + - The maximum number of frames we can store in `traceback_t.nframe` + - The maximum memory size_t we can allocate */ +static const unsigned long MAX_NFRAME = Py_MIN(UINT16_MAX, ((SIZE_MAX - sizeof(traceback_t)) / sizeof(frame_t) + 1)); static PyObject *unknown_filename = NULL; @@ -124,10 +122,14 @@ static traceback_t *tracemalloc_traceback = NULL; Protected by the GIL */ static _Py_hashtable_t *tracemalloc_tracebacks = NULL; -/* pointer (void*) => trace (trace_t). +/* pointer (void*) => trace (trace_t*). Protected by TABLES_LOCK(). */ static _Py_hashtable_t *tracemalloc_traces = NULL; +/* domain (unsigned int) => traces (_Py_hashtable_t). + Protected by TABLES_LOCK(). */ +static _Py_hashtable_t *tracemalloc_domains = NULL; + #ifdef TRACE_DEBUG static void @@ -204,69 +206,44 @@ set_reentrant(int reentrant) static Py_uhash_t -hashtable_hash_pyobject(_Py_hashtable_t *ht, const void *pkey) +hashtable_hash_pyobject(const void *key) { - PyObject *obj; - - _Py_HASHTABLE_READ_KEY(ht, pkey, obj); + PyObject *obj = (PyObject *)key; return PyObject_Hash(obj); } static int -hashtable_compare_unicode(_Py_hashtable_t *ht, const void *pkey, - const _Py_hashtable_entry_t *entry) +hashtable_compare_unicode(const void *key1, const void *key2) { - PyObject *key1, *key2; - - _Py_HASHTABLE_READ_KEY(ht, pkey, key1); - _Py_HASHTABLE_ENTRY_READ_KEY(ht, entry, key2); - - if (key1 != NULL && key2 != NULL) - return (PyUnicode_Compare(key1, key2) == 0); - else - return key1 == key2; + PyObject *obj1 = (PyObject *)key1; + PyObject *obj2 = (PyObject *)key2; + if (obj1 != NULL && obj2 != NULL) { + return (PyUnicode_Compare(obj1, obj2) == 0); + } + else { + return obj1 == obj2; + } } static Py_uhash_t -hashtable_hash_pointer_t(_Py_hashtable_t *ht, const void *pkey) +hashtable_hash_uint(const void *key_raw) { - pointer_t ptr; - Py_uhash_t hash; - - _Py_HASHTABLE_READ_KEY(ht, pkey, ptr); - - hash = (Py_uhash_t)_Py_HashPointer((void*)ptr.ptr); - hash ^= ptr.domain; - return hash; -} - - -static int -hashtable_compare_pointer_t(_Py_hashtable_t *ht, const void *pkey, - const _Py_hashtable_entry_t *entry) -{ - pointer_t ptr1, ptr2; - - _Py_HASHTABLE_READ_KEY(ht, pkey, ptr1); - _Py_HASHTABLE_ENTRY_READ_KEY(ht, entry, ptr2); - - /* compare pointer before domain, because pointer is more likely to be - different */ - return (ptr1.ptr == ptr2.ptr && ptr1.domain == ptr2.domain); - + unsigned int key = (unsigned int)FROM_PTR(key_raw); + return (Py_uhash_t)key; } static _Py_hashtable_t * -hashtable_new(size_t key_size, size_t data_size, - _Py_hashtable_hash_func hash_func, - _Py_hashtable_compare_func compare_func) +hashtable_new(_Py_hashtable_hash_func hash_func, + _Py_hashtable_compare_func compare_func, + _Py_hashtable_destroy_func key_destroy_func, + _Py_hashtable_destroy_func value_destroy_func) { _Py_hashtable_allocator_t hashtable_alloc = {malloc, free}; - return _Py_hashtable_new_full(key_size, data_size, 0, - hash_func, compare_func, + return _Py_hashtable_new_full(hash_func, compare_func, + key_destroy_func, value_destroy_func, &hashtable_alloc); } @@ -285,36 +262,33 @@ raw_free(void *ptr) static Py_uhash_t -hashtable_hash_traceback(_Py_hashtable_t *ht, const void *pkey) +hashtable_hash_traceback(const void *key) { - traceback_t *traceback; - - _Py_HASHTABLE_READ_KEY(ht, pkey, traceback); + const traceback_t *traceback = (const traceback_t *)key; return traceback->hash; } static int -hashtable_compare_traceback(_Py_hashtable_t *ht, const void *pkey, - const _Py_hashtable_entry_t *entry) +hashtable_compare_traceback(const void *key1, const void *key2) { - traceback_t *traceback1, *traceback2; - const frame_t *frame1, *frame2; - int i; - - _Py_HASHTABLE_READ_KEY(ht, pkey, traceback1); - _Py_HASHTABLE_ENTRY_READ_KEY(ht, entry, traceback2); + const traceback_t *traceback1 = (const traceback_t *)key1; + const traceback_t *traceback2 = (const traceback_t *)key2; - if (traceback1->nframe != traceback2->nframe) + if (traceback1->nframe != traceback2->nframe) { + return 0; + } + if (traceback1->total_nframe != traceback2->total_nframe) { return 0; + } - for (i=0; i < traceback1->nframe; i++) { - frame1 = &traceback1->frames[i]; - frame2 = &traceback2->frames[i]; + for (int i=0; i < traceback1->nframe; i++) { + const frame_t *frame1 = &traceback1->frames[i]; + const frame_t *frame2 = &traceback2->frames[i]; - if (frame1->lineno != frame2->lineno) + if (frame1->lineno != frame2->lineno) { return 0; - + } if (frame1->filename != frame2->filename) { assert(PyUnicode_Compare(frame1->filename, frame2->filename) != 0); return 0; @@ -327,37 +301,24 @@ hashtable_compare_traceback(_Py_hashtable_t *ht, const void *pkey, static void tracemalloc_get_frame(PyFrameObject *pyframe, frame_t *frame) { - PyCodeObject *code; - PyObject *filename; - _Py_hashtable_entry_t *entry; - int lineno; - frame->filename = unknown_filename; - lineno = PyFrame_GetLineNumber(pyframe); - if (lineno < 0) + int lineno = PyFrame_GetLineNumber(pyframe); + if (lineno < 0) { lineno = 0; + } frame->lineno = (unsigned int)lineno; - code = pyframe->f_code; - if (code == NULL) { -#ifdef TRACE_DEBUG - tracemalloc_error("failed to get the code object of the frame"); -#endif - return; - } + PyCodeObject *code = PyFrame_GetCode(pyframe); + PyObject *filename = code->co_filename; + Py_DECREF(code); - if (code->co_filename == NULL) { + if (filename == NULL) { #ifdef TRACE_DEBUG tracemalloc_error("failed to get the filename of the code object"); #endif return; } - filename = code->co_filename; - assert(filename != NULL); - if (filename == NULL) - return; - if (!PyUnicode_Check(filename)) { #ifdef TRACE_DEBUG tracemalloc_error("filename is not a unicode string"); @@ -374,15 +335,16 @@ tracemalloc_get_frame(PyFrameObject *pyframe, frame_t *frame) } /* intern the filename */ - entry = _Py_HASHTABLE_GET_ENTRY(tracemalloc_filenames, filename); + _Py_hashtable_entry_t *entry; + entry = _Py_hashtable_get_entry(tracemalloc_filenames, filename); if (entry != NULL) { - _Py_HASHTABLE_ENTRY_READ_KEY(tracemalloc_filenames, entry, filename); + filename = (PyObject *)entry->key; } else { /* tracemalloc_filenames is responsible to keep a reference to the filename */ Py_INCREF(filename); - if (_Py_HASHTABLE_SET_NODATA(tracemalloc_filenames, filename) < 0) { + if (_Py_hashtable_set(tracemalloc_filenames, filename, NULL) < 0) { Py_DECREF(filename); #ifdef TRACE_DEBUG tracemalloc_error("failed to intern the filename"); @@ -416,6 +378,7 @@ traceback_hash(traceback_t *traceback) /* the cast might truncate len; that doesn't change hash stability */ mult += (Py_uhash_t)(82520UL + len + len); } + x ^= traceback->total_nframe; x += 97531UL; return x; } @@ -424,10 +387,7 @@ traceback_hash(traceback_t *traceback) static void traceback_get_frames(traceback_t *traceback) { - PyThreadState *tstate; - PyFrameObject *pyframe; - - tstate = PyGILState_GetThisThreadState(); + PyThreadState *tstate = PyGILState_GetThisThreadState(); if (tstate == NULL) { #ifdef TRACE_DEBUG tracemalloc_error("failed to get the current thread state"); @@ -435,12 +395,20 @@ traceback_get_frames(traceback_t *traceback) return; } - for (pyframe = tstate->frame; pyframe != NULL; pyframe = pyframe->f_back) { - tracemalloc_get_frame(pyframe, &traceback->frames[traceback->nframe]); - assert(traceback->frames[traceback->nframe].filename != NULL); - traceback->nframe++; - if (traceback->nframe == _Py_tracemalloc_config.max_nframe) - break; + PyFrameObject *pyframe = PyThreadState_GetFrame(tstate); + for (; pyframe != NULL;) { + if (traceback->nframe < _Py_tracemalloc_config.max_nframe) { + tracemalloc_get_frame(pyframe, &traceback->frames[traceback->nframe]); + assert(traceback->frames[traceback->nframe].filename != NULL); + traceback->nframe++; + } + if (traceback->total_nframe < UINT16_MAX) { + traceback->total_nframe++; + } + + PyFrameObject *back = PyFrame_GetBack(pyframe); + Py_DECREF(pyframe); + pyframe = back; } } @@ -456,15 +424,16 @@ traceback_new(void) /* get frames */ traceback = tracemalloc_traceback; traceback->nframe = 0; + traceback->total_nframe = 0; traceback_get_frames(traceback); if (traceback->nframe == 0) return &tracemalloc_empty_traceback; traceback->hash = traceback_hash(traceback); /* intern the traceback */ - entry = _Py_HASHTABLE_GET_ENTRY(tracemalloc_tracebacks, traceback); + entry = _Py_hashtable_get_entry(tracemalloc_tracebacks, traceback); if (entry != NULL) { - _Py_HASHTABLE_ENTRY_READ_KEY(tracemalloc_tracebacks, entry, traceback); + traceback = (traceback_t *)entry->key; } else { traceback_t *copy; @@ -481,7 +450,7 @@ traceback_new(void) } memcpy(copy, traceback, traceback_size); - if (_Py_HASHTABLE_SET_NODATA(tracemalloc_tracebacks, copy) < 0) { + if (_Py_hashtable_set(tracemalloc_tracebacks, copy, NULL) < 0) { raw_free(copy); #ifdef TRACE_DEBUG tracemalloc_error("failed to intern the traceback: putdata failed"); @@ -494,79 +463,54 @@ traceback_new(void) } -static int -tracemalloc_use_domain_cb(_Py_hashtable_t *old_traces, - _Py_hashtable_entry_t *entry, void *user_data) +static _Py_hashtable_t* +tracemalloc_create_traces_table(void) { - uintptr_t ptr; - pointer_t key; - _Py_hashtable_t *new_traces = (_Py_hashtable_t *)user_data; - const void *pdata = _Py_HASHTABLE_ENTRY_PDATA(old_traces, entry); - - _Py_HASHTABLE_ENTRY_READ_KEY(old_traces, entry, ptr); - key.ptr = ptr; - key.domain = DEFAULT_DOMAIN; - - return _Py_hashtable_set(new_traces, - sizeof(key), &key, - old_traces->data_size, pdata); + return hashtable_new(_Py_hashtable_hash_ptr, + _Py_hashtable_compare_direct, + NULL, raw_free); } -/* Convert tracemalloc_traces from compact key (uintptr_t) to pointer_t key. - * Return 0 on success, -1 on error. */ -static int -tracemalloc_use_domain(void) +static _Py_hashtable_t* +tracemalloc_create_domains_table(void) { - _Py_hashtable_t *new_traces = NULL; + return hashtable_new(hashtable_hash_uint, + _Py_hashtable_compare_direct, + NULL, + (_Py_hashtable_destroy_func)_Py_hashtable_destroy); +} - assert(!_Py_tracemalloc_config.use_domain); - new_traces = hashtable_new(sizeof(pointer_t), - sizeof(trace_t), - hashtable_hash_pointer_t, - hashtable_compare_pointer_t); - if (new_traces == NULL) { - return -1; +static _Py_hashtable_t* +tracemalloc_get_traces_table(unsigned int domain) +{ + if (domain == DEFAULT_DOMAIN) { + return tracemalloc_traces; } - - if (_Py_hashtable_foreach(tracemalloc_traces, tracemalloc_use_domain_cb, - new_traces) < 0) - { - _Py_hashtable_destroy(new_traces); - return -1; + else { + return _Py_hashtable_get(tracemalloc_domains, TO_PTR(domain)); } - - _Py_hashtable_destroy(tracemalloc_traces); - tracemalloc_traces = new_traces; - - _Py_tracemalloc_config.use_domain = 1; - - return 0; } static void tracemalloc_remove_trace(unsigned int domain, uintptr_t ptr) { - trace_t trace; - int removed; - assert(_Py_tracemalloc_config.tracing); - if (_Py_tracemalloc_config.use_domain) { - pointer_t key = {ptr, domain}; - removed = _Py_HASHTABLE_POP(tracemalloc_traces, key, trace); - } - else { - removed = _Py_HASHTABLE_POP(tracemalloc_traces, ptr, trace); - } - if (!removed) { + _Py_hashtable_t *traces = tracemalloc_get_traces_table(domain); + if (!traces) { return; } - assert(tracemalloc_traced_memory >= trace.size); - tracemalloc_traced_memory -= trace.size; + trace_t *trace = _Py_hashtable_steal(traces, TO_PTR(ptr)); + if (!trace) { + return; + } + assert(tracemalloc_traced_memory >= trace->size); + tracemalloc_traced_memory -= trace->size; + raw_free(trace); } #define REMOVE_TRACE(ptr) \ @@ -577,63 +521,55 @@ static int tracemalloc_add_trace(unsigned int domain, uintptr_t ptr, size_t size) { - pointer_t key = {ptr, domain}; - traceback_t *traceback; - trace_t trace; - _Py_hashtable_entry_t* entry; - int res; - assert(_Py_tracemalloc_config.tracing); - traceback = traceback_new(); + traceback_t *traceback = traceback_new(); if (traceback == NULL) { return -1; } - if (!_Py_tracemalloc_config.use_domain && domain != DEFAULT_DOMAIN) { - /* first trace using a non-zero domain whereas traces use compact - (uintptr_t) keys: switch to pointer_t keys. */ - if (tracemalloc_use_domain() < 0) { + _Py_hashtable_t *traces = tracemalloc_get_traces_table(domain); + if (traces == NULL) { + traces = tracemalloc_create_traces_table(); + if (traces == NULL) { return -1; } - } - if (_Py_tracemalloc_config.use_domain) { - entry = _Py_HASHTABLE_GET_ENTRY(tracemalloc_traces, key); - } - else { - entry = _Py_HASHTABLE_GET_ENTRY(tracemalloc_traces, ptr); + if (_Py_hashtable_set(tracemalloc_domains, TO_PTR(domain), traces) < 0) { + _Py_hashtable_destroy(traces); + return -1; + } } - if (entry != NULL) { + trace_t *trace = _Py_hashtable_get(traces, TO_PTR(ptr)); + if (trace != NULL) { /* the memory block is already tracked */ - _Py_HASHTABLE_ENTRY_READ_DATA(tracemalloc_traces, entry, trace); - assert(tracemalloc_traced_memory >= trace.size); - tracemalloc_traced_memory -= trace.size; + assert(tracemalloc_traced_memory >= trace->size); + tracemalloc_traced_memory -= trace->size; - trace.size = size; - trace.traceback = traceback; - _Py_HASHTABLE_ENTRY_WRITE_DATA(tracemalloc_traces, entry, trace); + trace->size = size; + trace->traceback = traceback; } else { - trace.size = size; - trace.traceback = traceback; - - if (_Py_tracemalloc_config.use_domain) { - res = _Py_HASHTABLE_SET(tracemalloc_traces, key, trace); - } - else { - res = _Py_HASHTABLE_SET(tracemalloc_traces, ptr, trace); + trace = raw_malloc(sizeof(trace_t)); + if (trace == NULL) { + return -1; } + trace->size = size; + trace->traceback = traceback; + + int res = _Py_hashtable_set(traces, TO_PTR(ptr), trace); if (res != 0) { + raw_free(trace); return res; } } assert(tracemalloc_traced_memory <= SIZE_MAX - size); tracemalloc_traced_memory += size; - if (tracemalloc_traced_memory > tracemalloc_peak_traced_memory) + if (tracemalloc_traced_memory > tracemalloc_peak_traced_memory) { tracemalloc_peak_traced_memory = tracemalloc_traced_memory; + } return 0; } @@ -684,7 +620,7 @@ tracemalloc_realloc(void *ctx, void *ptr, size_t new_size) TABLES_LOCK(); /* tracemalloc_add_trace() updates the trace if there is already - a trace at address (domain, ptr2) */ + a trace at address ptr2 */ if (ptr2 != ptr) { REMOVE_TRACE(ptr); } @@ -699,7 +635,7 @@ tracemalloc_realloc(void *ctx, void *ptr, size_t new_size) The GIL and the table lock ensures that only one thread is allocating memory. */ - Py_UNREACHABLE(); + Py_FatalError("tracemalloc_realloc() failed to allocate a trace"); } TABLES_UNLOCK(); } @@ -728,7 +664,7 @@ tracemalloc_free(void *ctx, void *ptr) return; /* GIL cannot be locked in PyMem_RawFree() because it would introduce - a deadlock in PyThreadState_DeleteCurrent(). */ + a deadlock in _PyThreadState_DeleteCurrent(). */ alloc->free(alloc->ctx, ptr); @@ -888,27 +824,11 @@ tracemalloc_raw_realloc(void *ctx, void *ptr, size_t new_size) #endif /* TRACE_RAW_MALLOC */ -static int -tracemalloc_clear_filename(_Py_hashtable_t *ht, _Py_hashtable_entry_t *entry, - void *user_data) +static void +tracemalloc_clear_filename(void *value) { - PyObject *filename; - - _Py_HASHTABLE_ENTRY_READ_KEY(ht, entry, filename); + PyObject *filename = (PyObject *)value; Py_DECREF(filename); - return 0; -} - - -static int -traceback_free_traceback(_Py_hashtable_t *ht, _Py_hashtable_entry_t *entry, - void *user_data) -{ - traceback_t *traceback; - - _Py_HASHTABLE_ENTRY_READ_KEY(ht, entry, traceback); - raw_free(traceback); - return 0; } @@ -921,14 +841,13 @@ tracemalloc_clear_traces(void) TABLES_LOCK(); _Py_hashtable_clear(tracemalloc_traces); + _Py_hashtable_clear(tracemalloc_domains); tracemalloc_traced_memory = 0; tracemalloc_peak_traced_memory = 0; TABLES_UNLOCK(); - _Py_hashtable_foreach(tracemalloc_tracebacks, traceback_free_traceback, NULL); _Py_hashtable_clear(tracemalloc_tracebacks); - _Py_hashtable_foreach(tracemalloc_filenames, tracemalloc_clear_filename, NULL); _Py_hashtable_clear(tracemalloc_filenames); } @@ -968,29 +887,19 @@ tracemalloc_init(void) } #endif - tracemalloc_filenames = hashtable_new(sizeof(PyObject *), 0, - hashtable_hash_pyobject, - hashtable_compare_unicode); + tracemalloc_filenames = hashtable_new(hashtable_hash_pyobject, + hashtable_compare_unicode, + tracemalloc_clear_filename, NULL); - tracemalloc_tracebacks = hashtable_new(sizeof(traceback_t *), 0, - hashtable_hash_traceback, - hashtable_compare_traceback); + tracemalloc_tracebacks = hashtable_new(hashtable_hash_traceback, + hashtable_compare_traceback, + NULL, raw_free); - if (_Py_tracemalloc_config.use_domain) { - tracemalloc_traces = hashtable_new(sizeof(pointer_t), - sizeof(trace_t), - hashtable_hash_pointer_t, - hashtable_compare_pointer_t); - } - else { - tracemalloc_traces = hashtable_new(sizeof(uintptr_t), - sizeof(trace_t), - _Py_hashtable_hash_ptr, - _Py_hashtable_compare_direct); - } + tracemalloc_traces = tracemalloc_create_traces_table(); + tracemalloc_domains = tracemalloc_create_domains_table(); if (tracemalloc_filenames == NULL || tracemalloc_tracebacks == NULL - || tracemalloc_traces == NULL) { + || tracemalloc_traces == NULL || tracemalloc_domains == NULL) { PyErr_NoMemory(); return -1; } @@ -1001,6 +910,7 @@ tracemalloc_init(void) PyUnicode_InternInPlace(&unknown_filename); tracemalloc_empty_traceback.nframe = 1; + tracemalloc_empty_traceback.total_nframe = 1; /* borrowed reference */ tracemalloc_empty_traceback.frames[0].filename = unknown_filename; tracemalloc_empty_traceback.frames[0].lineno = 0; @@ -1021,9 +931,10 @@ tracemalloc_deinit(void) tracemalloc_stop(); /* destroy hash tables */ + _Py_hashtable_destroy(tracemalloc_domains); + _Py_hashtable_destroy(tracemalloc_traces); _Py_hashtable_destroy(tracemalloc_tracebacks); _Py_hashtable_destroy(tracemalloc_filenames); - _Py_hashtable_destroy(tracemalloc_traces); #if defined(TRACE_RAW_MALLOC) if (tables_lock != NULL) { @@ -1046,10 +957,10 @@ tracemalloc_start(int max_nframe) PyMemAllocatorEx alloc; size_t size; - if (max_nframe < 1 || max_nframe > MAX_NFRAME) { + if (max_nframe < 1 || (unsigned long) max_nframe > MAX_NFRAME) { PyErr_Format(PyExc_ValueError, - "the number of frames must be in range [1; %i]", - (int)MAX_NFRAME); + "the number of frames must be in range [1; %lu]", + MAX_NFRAME); return -1; } @@ -1062,7 +973,6 @@ tracemalloc_start(int max_nframe) return 0; } - assert(1 <= max_nframe && max_nframe <= MAX_NFRAME); _Py_tracemalloc_config.max_nframe = max_nframe; /* allocate a buffer to store a new traceback */ @@ -1191,11 +1101,11 @@ frame_to_pyobject(frame_t *frame) static PyObject* traceback_to_pyobject(traceback_t *traceback, _Py_hashtable_t *intern_table) { - int i; - PyObject *frames, *frame; + PyObject *frames; if (intern_table != NULL) { - if (_Py_HASHTABLE_GET(intern_table, traceback, frames)) { + frames = _Py_hashtable_get(intern_table, (const void *)traceback); + if (frames) { Py_INCREF(frames); return frames; } @@ -1205,8 +1115,8 @@ traceback_to_pyobject(traceback_t *traceback, _Py_hashtable_t *intern_table) if (frames == NULL) return NULL; - for (i=0; i < traceback->nframe; i++) { - frame = frame_to_pyobject(&traceback->frames[i]); + for (int i=0; i < traceback->nframe; i++) { + PyObject *frame = frame_to_pyobject(&traceback->frames[i]); if (frame == NULL) { Py_DECREF(frames); return NULL; @@ -1215,7 +1125,7 @@ traceback_to_pyobject(traceback_t *traceback, _Py_hashtable_t *intern_table) } if (intern_table != NULL) { - if (_Py_HASHTABLE_SET(intern_table, traceback, frames) < 0) { + if (_Py_hashtable_set(intern_table, traceback, frames) < 0) { Py_DECREF(frames); PyErr_NoMemory(); return NULL; @@ -1228,13 +1138,13 @@ traceback_to_pyobject(traceback_t *traceback, _Py_hashtable_t *intern_table) static PyObject* -trace_to_pyobject(unsigned int domain, trace_t *trace, +trace_to_pyobject(unsigned int domain, const trace_t *trace, _Py_hashtable_t *intern_tracebacks) { PyObject *trace_obj = NULL; PyObject *obj; - trace_obj = PyTuple_New(3); + trace_obj = PyTuple_New(4); if (trace_obj == NULL) return NULL; @@ -1259,58 +1169,152 @@ trace_to_pyobject(unsigned int domain, trace_t *trace, } PyTuple_SET_ITEM(trace_obj, 2, obj); + obj = PyLong_FromUnsignedLong(trace->traceback->total_nframe); + if (obj == NULL) { + Py_DECREF(trace_obj); + return NULL; + } + PyTuple_SET_ITEM(trace_obj, 3, obj); + return trace_obj; } typedef struct { _Py_hashtable_t *traces; + _Py_hashtable_t *domains; _Py_hashtable_t *tracebacks; PyObject *list; + unsigned int domain; } get_traces_t; + static int -tracemalloc_get_traces_fill(_Py_hashtable_t *traces, _Py_hashtable_entry_t *entry, - void *user_data) +tracemalloc_copy_trace(_Py_hashtable_t *traces, + const void *key, const void *value, + void *user_data) { - get_traces_t *get_traces = user_data; - unsigned int domain; - trace_t trace; - PyObject *tracemalloc_obj; - int res; + _Py_hashtable_t *traces2 = (_Py_hashtable_t *)user_data; + + trace_t *trace = (trace_t *)value; - if (_Py_tracemalloc_config.use_domain) { - pointer_t key; - _Py_HASHTABLE_ENTRY_READ_KEY(traces, entry, key); - domain = key.domain; + trace_t *trace2 = raw_malloc(sizeof(trace_t)); + if (trace2 == NULL) { + return -1; } - else { - domain = DEFAULT_DOMAIN; + *trace2 = *trace; + if (_Py_hashtable_set(traces2, key, trace2) < 0) { + raw_free(trace2); + return -1; + } + return 0; +} + + +static _Py_hashtable_t* +tracemalloc_copy_traces(_Py_hashtable_t *traces) +{ + _Py_hashtable_t *traces2 = tracemalloc_create_traces_table(); + if (traces2 == NULL) { + return NULL; + } + + int err = _Py_hashtable_foreach(traces, + tracemalloc_copy_trace, + traces2); + if (err) { + _Py_hashtable_destroy(traces2); + return NULL; + } + return traces2; +} + + +static int +tracemalloc_copy_domain(_Py_hashtable_t *domains, + const void *key, const void *value, + void *user_data) +{ + _Py_hashtable_t *domains2 = (_Py_hashtable_t *)user_data; + + unsigned int domain = (unsigned int)FROM_PTR(key); + _Py_hashtable_t *traces = (_Py_hashtable_t *)value; + + _Py_hashtable_t *traces2 = tracemalloc_copy_traces(traces); + if (_Py_hashtable_set(domains2, TO_PTR(domain), traces2) < 0) { + _Py_hashtable_destroy(traces2); + return -1; } - _Py_HASHTABLE_ENTRY_READ_DATA(traces, entry, trace); + return 0; +} + - tracemalloc_obj = trace_to_pyobject(domain, &trace, get_traces->tracebacks); - if (tracemalloc_obj == NULL) +static _Py_hashtable_t* +tracemalloc_copy_domains(_Py_hashtable_t *domains) +{ + _Py_hashtable_t *domains2 = tracemalloc_create_domains_table(); + if (domains2 == NULL) { + return NULL; + } + + int err = _Py_hashtable_foreach(domains, + tracemalloc_copy_domain, + domains2); + if (err) { + _Py_hashtable_destroy(domains2); + return NULL; + } + return domains2; +} + + +static int +tracemalloc_get_traces_fill(_Py_hashtable_t *traces, + const void *key, const void *value, + void *user_data) +{ + get_traces_t *get_traces = user_data; + + const trace_t *trace = (const trace_t *)value; + + PyObject *tuple = trace_to_pyobject(get_traces->domain, trace, + get_traces->tracebacks); + if (tuple == NULL) { return 1; + } - res = PyList_Append(get_traces->list, tracemalloc_obj); - Py_DECREF(tracemalloc_obj); - if (res < 0) + int res = PyList_Append(get_traces->list, tuple); + Py_DECREF(tuple); + if (res < 0) { return 1; + } return 0; } static int -tracemalloc_pyobject_decref_cb(_Py_hashtable_t *tracebacks, - _Py_hashtable_entry_t *entry, - void *user_data) +tracemalloc_get_traces_domain(_Py_hashtable_t *domains, + const void *key, const void *value, + void *user_data) { - PyObject *obj; - _Py_HASHTABLE_ENTRY_READ_DATA(tracebacks, entry, obj); + get_traces_t *get_traces = user_data; + + unsigned int domain = (unsigned int)FROM_PTR(key); + _Py_hashtable_t *traces = (_Py_hashtable_t *)value; + + get_traces->domain = domain; + return _Py_hashtable_foreach(traces, + tracemalloc_get_traces_fill, + get_traces); +} + + +static void +tracemalloc_pyobject_decref(void *value) +{ + PyObject *obj = (PyObject *)value; Py_DECREF(obj); - return 0; } @@ -1331,9 +1335,9 @@ _tracemalloc__get_traces_impl(PyObject *module) /*[clinic end generated code: output=e9929876ced4b5cc input=6c7d2230b24255aa]*/ { get_traces_t get_traces; - int err; - + get_traces.domain = DEFAULT_DOMAIN; get_traces.traces = NULL; + get_traces.domains = NULL; get_traces.tracebacks = NULL; get_traces.list = PyList_New(0); if (get_traces.list == NULL) @@ -1344,45 +1348,65 @@ _tracemalloc__get_traces_impl(PyObject *module) /* the traceback hash table is used temporarily to intern traceback tuple of (filename, lineno) tuples */ - get_traces.tracebacks = hashtable_new(sizeof(traceback_t *), - sizeof(PyObject *), - _Py_hashtable_hash_ptr, - _Py_hashtable_compare_direct); + get_traces.tracebacks = hashtable_new(_Py_hashtable_hash_ptr, + _Py_hashtable_compare_direct, + NULL, tracemalloc_pyobject_decref); if (get_traces.tracebacks == NULL) { - PyErr_NoMemory(); - goto error; + goto no_memory; } + // Copy all traces so tracemalloc_get_traces_fill() doesn't have to disable + // temporarily tracemalloc which would impact other threads and so would + // miss allocations while get_traces() is called. TABLES_LOCK(); - get_traces.traces = _Py_hashtable_copy(tracemalloc_traces); + get_traces.traces = tracemalloc_copy_traces(tracemalloc_traces); TABLES_UNLOCK(); if (get_traces.traces == NULL) { - PyErr_NoMemory(); - goto error; + goto no_memory; + } + + TABLES_LOCK(); + get_traces.domains = tracemalloc_copy_domains(tracemalloc_domains); + TABLES_UNLOCK(); + + if (get_traces.domains == NULL) { + goto no_memory; } + // Convert traces to a list of tuples set_reentrant(1); - err = _Py_hashtable_foreach(get_traces.traces, - tracemalloc_get_traces_fill, &get_traces); + int err = _Py_hashtable_foreach(get_traces.traces, + tracemalloc_get_traces_fill, + &get_traces); + if (!err) { + err = _Py_hashtable_foreach(get_traces.domains, + tracemalloc_get_traces_domain, + &get_traces); + } set_reentrant(0); - if (err) + if (err) { goto error; + } goto finally; +no_memory: + PyErr_NoMemory(); + error: Py_CLEAR(get_traces.list); finally: if (get_traces.tracebacks != NULL) { - _Py_hashtable_foreach(get_traces.tracebacks, - tracemalloc_pyobject_decref_cb, NULL); _Py_hashtable_destroy(get_traces.tracebacks); } if (get_traces.traces != NULL) { _Py_hashtable_destroy(get_traces.traces); } + if (get_traces.domains != NULL) { + _Py_hashtable_destroy(get_traces.domains); + } return get_traces.list; } @@ -1391,26 +1415,26 @@ _tracemalloc__get_traces_impl(PyObject *module) static traceback_t* tracemalloc_get_traceback(unsigned int domain, uintptr_t ptr) { - trace_t trace; - int found; if (!_Py_tracemalloc_config.tracing) return NULL; + trace_t *trace; TABLES_LOCK(); - if (_Py_tracemalloc_config.use_domain) { - pointer_t key = {ptr, domain}; - found = _Py_HASHTABLE_GET(tracemalloc_traces, key, trace); + _Py_hashtable_t *traces = tracemalloc_get_traces_table(domain); + if (traces) { + trace = _Py_hashtable_get(traces, TO_PTR(ptr)); } else { - found = _Py_HASHTABLE_GET(tracemalloc_traces, ptr, trace); + trace = NULL; } TABLES_UNLOCK(); - if (!found) + if (!trace) { return NULL; + } - return trace.traceback; + return trace->traceback; } @@ -1550,6 +1574,17 @@ _tracemalloc_get_traceback_limit_impl(PyObject *module) } +static int +tracemalloc_get_tracemalloc_memory_cb(_Py_hashtable_t *domains, + const void *key, const void *value, + void *user_data) +{ + const _Py_hashtable_t *traces = value; + size_t *size = (size_t*)user_data; + *size += _Py_hashtable_size(traces); + return 0; +} + /*[clinic input] _tracemalloc.get_tracemalloc_memory @@ -1570,6 +1605,8 @@ _tracemalloc_get_tracemalloc_memory_impl(PyObject *module) TABLES_LOCK(); size += _Py_hashtable_size(tracemalloc_traces); + _Py_hashtable_foreach(tracemalloc_domains, + tracemalloc_get_tracemalloc_memory_cb, &size); TABLES_UNLOCK(); return PyLong_FromSize_t(size); @@ -1602,6 +1639,30 @@ _tracemalloc_get_traced_memory_impl(PyObject *module) return Py_BuildValue("nn", size, peak_size); } +/*[clinic input] +_tracemalloc.reset_peak + +Set the peak size of memory blocks traced by tracemalloc to the current size. + +Do nothing if the tracemalloc module is not tracing memory allocations. + +[clinic start generated code]*/ + +static PyObject * +_tracemalloc_reset_peak_impl(PyObject *module) +/*[clinic end generated code: output=140c2870f691dbb2 input=18afd0635066e9ce]*/ +{ + if (!_Py_tracemalloc_config.tracing) { + Py_RETURN_NONE; + } + + TABLES_LOCK(); + tracemalloc_peak_traced_memory = tracemalloc_traced_memory; + TABLES_UNLOCK(); + + Py_RETURN_NONE; +} + static PyMethodDef module_methods[] = { _TRACEMALLOC_IS_TRACING_METHODDEF @@ -1613,6 +1674,7 @@ static PyMethodDef module_methods[] = { _TRACEMALLOC_GET_TRACEBACK_LIMIT_METHODDEF _TRACEMALLOC_GET_TRACEMALLOC_MEMORY_METHODDEF _TRACEMALLOC_GET_TRACED_MEMORY_METHODDEF + _TRACEMALLOC_RESET_PEAK_METHODDEF /* sentinel */ {NULL, NULL} }; @@ -1727,26 +1789,15 @@ _PyTraceMalloc_NewReference(PyObject *op) ptr = (uintptr_t)op; } - _Py_hashtable_entry_t* entry; int res = -1; TABLES_LOCK(); - if (_Py_tracemalloc_config.use_domain) { - pointer_t key = {ptr, DEFAULT_DOMAIN}; - entry = _Py_HASHTABLE_GET_ENTRY(tracemalloc_traces, key); - } - else { - entry = _Py_HASHTABLE_GET_ENTRY(tracemalloc_traces, ptr); - } - - if (entry != NULL) { + trace_t *trace = _Py_hashtable_get(tracemalloc_traces, TO_PTR(ptr)); + if (trace != NULL) { /* update the traceback of the memory block */ traceback_t *traceback = traceback_new(); if (traceback != NULL) { - trace_t trace; - _Py_HASHTABLE_ENTRY_READ_DATA(tracemalloc_traces, entry, trace); - trace.traceback = traceback; - _Py_HASHTABLE_ENTRY_WRITE_DATA(tracemalloc_traces, entry, trace); + trace->traceback = traceback; res = 0; } } diff --git a/Modules/_uuidmodule.c b/Modules/_uuidmodule.c index 0b7aa72e91a1c9cb5893eb7d988875f5a2029066..3f33e22a055c6dc61181e913d7b03437907a2f8b 100644 --- a/Modules/_uuidmodule.c +++ b/Modules/_uuidmodule.c @@ -1,5 +1,5 @@ /* - * Python UUID module that wraps libuuid - + * Python UUID module that wraps libuuid or Windows rpcrt4.dll. * DCE compatible Universally Unique Identifier library. */ @@ -12,6 +12,12 @@ #include #endif +#ifdef MS_WINDOWS +#include +#endif + +#ifndef MS_WINDOWS + static PyObject * py_uuid_generate_time_safe(PyObject *Py_UNUSED(context), PyObject *Py_UNUSED(ignored)) @@ -31,45 +37,86 @@ py_uuid_generate_time_safe(PyObject *Py_UNUSED(context), return Py_BuildValue("y#i", buf, sizeof(uuid), (int) status); # else return Py_BuildValue("y#i", (const char *) &uuid, sizeof(uuid), (int) status); -# endif -#else +# endif /* HAVE_UUID_CREATE */ +#else /* HAVE_UUID_GENERATE_TIME_SAFE */ uuid_generate_time(uuid); return Py_BuildValue("y#O", (const char *) uuid, sizeof(uuid), Py_None); -#endif +#endif /* HAVE_UUID_GENERATE_TIME_SAFE */ } +#else /* MS_WINDOWS */ + +static PyObject * +py_UuidCreate(PyObject *Py_UNUSED(context), + PyObject *Py_UNUSED(ignored)) +{ + UUID uuid; + RPC_STATUS res; + + Py_BEGIN_ALLOW_THREADS + res = UuidCreateSequential(&uuid); + Py_END_ALLOW_THREADS + + switch (res) { + case RPC_S_OK: + case RPC_S_UUID_LOCAL_ONLY: + case RPC_S_UUID_NO_ADDRESS: + /* + All success codes, but the latter two indicate that the UUID is random + rather than based on the MAC address. If the OS can't figure this out, + neither can we, so we'll take it anyway. + */ + return Py_BuildValue("y#", (const char *)&uuid, sizeof(uuid)); + } + PyErr_SetFromWindowsErr(res); + return NULL; +} + +#endif /* MS_WINDOWS */ + + +static int +uuid_exec(PyObject *module) { + assert(sizeof(uuid_t) == 16); +#if defined(MS_WINDOWS) + int has_uuid_generate_time_safe = 0; +#elif defined(HAVE_UUID_GENERATE_TIME_SAFE) + int has_uuid_generate_time_safe = 1; +#else + int has_uuid_generate_time_safe = 0; +#endif + if (PyModule_AddIntConstant(module, "has_uuid_generate_time_safe", + has_uuid_generate_time_safe) < 0) { + return -1; + } + return 0; +} static PyMethodDef uuid_methods[] = { +#if defined(HAVE_UUID_UUID_H) || defined(HAVE_UUID_H) {"generate_time_safe", py_uuid_generate_time_safe, METH_NOARGS, NULL}, +#endif +#if defined(MS_WINDOWS) + {"UuidCreate", py_UuidCreate, METH_NOARGS, NULL}, +#endif {NULL, NULL, 0, NULL} /* sentinel */ }; +static PyModuleDef_Slot uuid_slots[] = { + {Py_mod_exec, uuid_exec}, + {0, NULL} +}; + static struct PyModuleDef uuidmodule = { PyModuleDef_HEAD_INIT, .m_name = "_uuid", - .m_size = -1, + .m_size = 0, .m_methods = uuid_methods, + .m_slots = uuid_slots, }; PyMODINIT_FUNC PyInit__uuid(void) { - PyObject *mod; - assert(sizeof(uuid_t) == 16); -#ifdef HAVE_UUID_GENERATE_TIME_SAFE - int has_uuid_generate_time_safe = 1; -#else - int has_uuid_generate_time_safe = 0; -#endif - mod = PyModule_Create(&uuidmodule); - if (mod == NULL) { - return NULL; - } - if (PyModule_AddIntConstant(mod, "has_uuid_generate_time_safe", - has_uuid_generate_time_safe) < 0) { - Py_DECREF(mod); - return NULL; - } - - return mod; + return PyModuleDef_Init(&uuidmodule); } diff --git a/Modules/_weakref.c b/Modules/_weakref.c index c1238e00d35f4aa8315cd8d29790a1663a24dbc2..e33cba2a3dd81f2cd0de04d1ca7d4e5afafdafb9 100644 --- a/Modules/_weakref.c +++ b/Modules/_weakref.c @@ -1,8 +1,9 @@ #include "Python.h" +#include "pycore_object.h" // _PyObject_GET_WEAKREFS_LISTPTR #define GET_WEAKREFS_LISTPTR(o) \ - ((PyWeakReference **) PyObject_GET_WEAKREFS_LISTPTR(o)) + ((PyWeakReference **) _PyObject_GET_WEAKREFS_LISTPTR(o)) /*[clinic input] module _weakref @@ -136,14 +137,48 @@ weakref_functions[] = { {NULL, NULL, 0, NULL} }; +static int +weakref_exec(PyObject *module) +{ + Py_INCREF(&_PyWeakref_RefType); + if (PyModule_AddObject(module, "ref", (PyObject *) &_PyWeakref_RefType) < 0) { + Py_DECREF(&_PyWeakref_RefType); + return -1; + } + Py_INCREF(&_PyWeakref_RefType); + if (PyModule_AddObject(module, "ReferenceType", + (PyObject *) &_PyWeakref_RefType) < 0) { + Py_DECREF(&_PyWeakref_RefType); + return -1; + } + Py_INCREF(&_PyWeakref_ProxyType); + if (PyModule_AddObject(module, "ProxyType", + (PyObject *) &_PyWeakref_ProxyType) < 0) { + Py_DECREF(&_PyWeakref_ProxyType); + return -1; + } + Py_INCREF(&_PyWeakref_CallableProxyType); + if (PyModule_AddObject(module, "CallableProxyType", + (PyObject *) &_PyWeakref_CallableProxyType) < 0) { + Py_DECREF(&_PyWeakref_CallableProxyType); + return -1; + } + + return 0; +} + +static struct PyModuleDef_Slot weakref_slots[] = { + {Py_mod_exec, weakref_exec}, + {0, NULL} +}; static struct PyModuleDef weakrefmodule = { PyModuleDef_HEAD_INIT, "_weakref", "Weak-reference support module.", - -1, + 0, weakref_functions, - NULL, + weakref_slots, NULL, NULL, NULL @@ -152,23 +187,5 @@ static struct PyModuleDef weakrefmodule = { PyMODINIT_FUNC PyInit__weakref(void) { - PyObject *m; - - m = PyModule_Create(&weakrefmodule); - - if (m != NULL) { - Py_INCREF(&_PyWeakref_RefType); - PyModule_AddObject(m, "ref", - (PyObject *) &_PyWeakref_RefType); - Py_INCREF(&_PyWeakref_RefType); - PyModule_AddObject(m, "ReferenceType", - (PyObject *) &_PyWeakref_RefType); - Py_INCREF(&_PyWeakref_ProxyType); - PyModule_AddObject(m, "ProxyType", - (PyObject *) &_PyWeakref_ProxyType); - Py_INCREF(&_PyWeakref_CallableProxyType); - PyModule_AddObject(m, "CallableProxyType", - (PyObject *) &_PyWeakref_CallableProxyType); - } - return m; + return PyModuleDef_Init(&weakrefmodule); } diff --git a/Modules/_winapi.c b/Modules/_winapi.c index 647075cdb1788cdf07584ce29be84f904be9eed9..e1672c478522e874e4560fed10828a8b4a4212db 100644 --- a/Modules/_winapi.c +++ b/Modules/_winapi.c @@ -35,7 +35,7 @@ /* See http://www.python.org/2.4/license for licensing details. */ #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #define WINDOWS_LEAN_AND_MEAN #include "windows.h" @@ -603,11 +603,10 @@ _winapi_CreateJunction_impl(PyObject *module, LPWSTR src_path, sizeof(rdb->MountPointReparseBuffer.PathBuffer) + /* Two +1's for NUL terminators. */ (prefix_len + print_len + 1 + print_len + 1) * sizeof(WCHAR); - rdb = (_Py_PREPARSE_DATA_BUFFER)PyMem_RawMalloc(rdb_size); + rdb = (_Py_PREPARSE_DATA_BUFFER)PyMem_RawCalloc(1, rdb_size); if (rdb == NULL) goto cleanup; - memset(rdb, 0, rdb_size); rdb->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT; rdb->ReparseDataLength = rdb_size - _Py_REPARSE_DATA_BUFFER_HEADER_SIZE; rdb->MountPointReparseBuffer.SubstituteNameOffset = 0; @@ -1081,6 +1080,14 @@ _winapi_CreateProcess_impl(PyObject *module, return NULL; } + PyInterpreterState *interp = PyInterpreterState_Get(); + const PyConfig *config = _PyInterpreterState_GetConfig(interp); + if (config->_isolated_interpreter) { + PyErr_SetString(PyExc_RuntimeError, + "subprocess not supported for isolated subinterpreters"); + return NULL; + } + ZeroMemory(&si, sizeof(si)); si.StartupInfo.cb = sizeof(si); @@ -1111,8 +1118,8 @@ _winapi_CreateProcess_impl(PyObject *module, } } else if (command_line != Py_None) { - PyErr_Format(PyExc_TypeError, - "CreateProcess() argument 2 must be str or None, not %s", + PyErr_Format(PyExc_TypeError, + "CreateProcess() argument 2 must be str or None, not %s", Py_TYPE(command_line)->tp_name); goto cleanup; } diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c index db1116ac6e352dcb7ea4a41f5f046fea89909679..de11c090870f94a29f1cb8bddbefd3b91ba57864 100644 --- a/Modules/_xxsubinterpretersmodule.c +++ b/Modules/_xxsubinterpretersmodule.c @@ -26,9 +26,9 @@ _copy_raw_string(PyObject *strobj) static PyInterpreterState * _get_current(void) { - // _PyInterpreterState_Get() aborts if lookup fails, so don't need + // PyInterpreterState_Get() aborts if lookup fails, so don't need // to check the result for NULL. - return _PyInterpreterState_Get(); + return PyInterpreterState_Get(); } @@ -538,7 +538,7 @@ _channelend_find(_channelend *first, int64_t interp, _channelend **pprev) typedef struct _channelassociations { // Note that the list entries are never removed for interpreter - // for which the channel is closed. This should be a problem in + // for which the channel is closed. This should not be a problem in // practice. Also, a channel isn't automatically closed when an // interpreter is destroyed. int64_t numsendopen; @@ -1179,11 +1179,6 @@ _channels_list_all(_channels *channels, int64_t *count) { int64_t *cids = NULL; PyThread_acquire_lock(channels->mutex, WAIT_LOCK); - int64_t numopen = channels->numopen; - if (numopen >= PY_SSIZE_T_MAX) { - PyErr_SetString(PyExc_RuntimeError, "too many channels open"); - goto done; - } int64_t *ids = PyMem_NEW(int64_t, (Py_ssize_t)(channels->numopen)); if (ids == NULL) { goto done; @@ -1350,19 +1345,16 @@ _channel_recv(_channels *channels, int64_t id) _PyCrossInterpreterData *data = _channel_next(chan, PyInterpreterState_GetID(interp)); PyThread_release_lock(mutex); if (data == NULL) { - if (!PyErr_Occurred()) { - PyErr_Format(ChannelEmptyError, "channel %" PRId64 " is empty", id); - } return NULL; } // Convert the data back to an object. PyObject *obj = _PyCrossInterpreterData_NewObject(data); + _PyCrossInterpreterData_Release(data); + PyMem_Free(data); if (obj == NULL) { return NULL; } - _PyCrossInterpreterData_Release(data); - PyMem_Free(data); return obj; } @@ -1395,6 +1387,24 @@ _channel_close(_channels *channels, int64_t id, int end, int force) return _channels_close(channels, id, NULL, end, force); } +static int +_channel_is_associated(_channels *channels, int64_t cid, int64_t interp, + int send) +{ + _PyChannelState *chan = _channels_lookup(channels, cid, NULL); + if (chan == NULL) { + return -1; + } else if (send && chan->closing != NULL) { + PyErr_Format(ChannelClosedError, "channel %" PRId64 " closed", cid); + return -1; + } + + _channelend *end = _channelend_find(send ? chan->ends->send : chan->ends->recv, + interp, NULL); + + return (end != NULL && end->open); +} + /* ChannelID class */ static PyTypeObject ChannelIDtype; @@ -1428,7 +1438,7 @@ channel_id_converter(PyObject *arg, void *ptr) else { PyErr_Format(PyExc_TypeError, "channel ID must be an int, got %.100s", - arg->ob_type->tp_name); + Py_TYPE(arg)->tp_name); return 0; } *(int64_t *)ptr = cid; @@ -1830,14 +1840,17 @@ _is_running(PyInterpreterState *interp) "interpreter has more than one thread"); return -1; } - PyFrameObject *frame = tstate->frame; + + assert(!PyErr_Occurred()); + PyFrameObject *frame = PyThreadState_GetFrame(tstate); if (frame == NULL) { - if (PyErr_Occurred() != NULL) { - return -1; - } return 0; } - return (int)(frame->f_executing); + + int executing = (int)(frame->f_executing); + Py_DECREF(frame); + + return executing; } static int @@ -1928,7 +1941,7 @@ _run_script_in_interpreter(PyInterpreterState *interp, const char *codestr, // Switch to interpreter. PyThreadState *save_tstate = NULL; - if (interp != _PyInterpreterState_Get()) { + if (interp != PyInterpreterState_Get()) { // XXX Using the "head" thread isn't strictly correct. PyThreadState *tstate = PyInterpreterState_ThreadHead(interp); // XXX Possible GILState issues? @@ -1986,16 +1999,20 @@ _global_channels(void) { } static PyObject * -interp_create(PyObject *self, PyObject *args) +interp_create(PyObject *self, PyObject *args, PyObject *kwds) { - if (!PyArg_UnpackTuple(args, "create", 0, 0)) { + + static char *kwlist[] = {"isolated", NULL}; + int isolated = 1; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|$i:create", kwlist, + &isolated)) { return NULL; } // Create and initialize the new interpreter. PyThreadState *save_tstate = PyThreadState_Swap(NULL); // XXX Possible GILState issues? - PyThreadState *tstate = Py_NewInterpreter(); + PyThreadState *tstate = _Py_NewInterpreter(isolated); PyThreadState_Swap(save_tstate); if (tstate == NULL) { /* Since no new thread state was created, there is no exception to @@ -2004,7 +2021,8 @@ interp_create(PyObject *self, PyObject *args) PyErr_SetString(PyExc_RuntimeError, "interpreter creation failed"); return NULL; } - PyObject *idobj = _PyInterpreterState_GetIDObject(tstate->interp); + PyInterpreterState *interp = PyThreadState_GetInterpreter(tstate); + PyObject *idobj = _PyInterpreterState_GetIDObject(interp); if (idobj == NULL) { // XXX Possible GILState issues? save_tstate = PyThreadState_Swap(tstate); @@ -2012,7 +2030,7 @@ interp_create(PyObject *self, PyObject *args) PyThreadState_Swap(save_tstate); return NULL; } - _PyInterpreterState_RequireIDRef(tstate->interp, 1); + _PyInterpreterState_RequireIDRef(interp, 1); return idobj; } @@ -2058,7 +2076,6 @@ interp_destroy(PyObject *self, PyObject *args, PyObject *kwds) } // Destroy the interpreter. - //PyInterpreterState_Delete(interp); PyThreadState *tstate = PyInterpreterState_ThreadHead(interp); // XXX Possible GILState issues? PyThreadState *save_tstate = PyThreadState_Swap(tstate); @@ -2135,7 +2152,7 @@ static PyObject * interp_get_main(PyObject *self, PyObject *Py_UNUSED(ignored)) { // Currently, 0 is always the main interpreter. - PY_INT64_T id = 0; + int64_t id = 0; return _PyInterpreterID_New(id); } @@ -2326,6 +2343,68 @@ PyDoc_STRVAR(channel_list_all_doc, \n\ Return the list of all IDs for active channels."); +static PyObject * +channel_list_interpreters(PyObject *self, PyObject *args, PyObject *kwds) +{ + static char *kwlist[] = {"cid", "send", NULL}; + int64_t cid; /* Channel ID */ + int send = 0; /* Send or receive end? */ + int64_t id; + PyObject *ids, *id_obj; + PyInterpreterState *interp; + + if (!PyArg_ParseTupleAndKeywords( + args, kwds, "O&$p:channel_list_interpreters", + kwlist, channel_id_converter, &cid, &send)) { + return NULL; + } + + ids = PyList_New(0); + if (ids == NULL) { + goto except; + } + + interp = PyInterpreterState_Head(); + while (interp != NULL) { + id = PyInterpreterState_GetID(interp); + assert(id >= 0); + int res = _channel_is_associated(&_globals.channels, cid, id, send); + if (res < 0) { + goto except; + } + if (res) { + id_obj = _PyInterpreterState_GetIDObject(interp); + if (id_obj == NULL) { + goto except; + } + res = PyList_Insert(ids, 0, id_obj); + Py_DECREF(id_obj); + if (res < 0) { + goto except; + } + } + interp = PyInterpreterState_Next(interp); + } + + goto finally; + +except: + Py_XDECREF(ids); + ids = NULL; + +finally: + return ids; +} + +PyDoc_STRVAR(channel_list_interpreters_doc, +"channel_list_interpreters(cid, *, send) -> [id]\n\ +\n\ +Return the list of all interpreter IDs associated with an end of the channel.\n\ +\n\ +The 'send' argument should be a boolean indicating whether to use the send or\n\ +receive end."); + + static PyObject * channel_send(PyObject *self, PyObject *args, PyObject *kwds) { @@ -2351,20 +2430,37 @@ Add the object's data to the channel's queue."); static PyObject * channel_recv(PyObject *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = {"cid", NULL}; + static char *kwlist[] = {"cid", "default", NULL}; int64_t cid; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&:channel_recv", kwlist, - channel_id_converter, &cid)) { + PyObject *dflt = NULL; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&|O:channel_recv", kwlist, + channel_id_converter, &cid, &dflt)) { return NULL; } + Py_XINCREF(dflt); - return _channel_recv(&_globals.channels, cid); + PyObject *obj = _channel_recv(&_globals.channels, cid); + if (obj != NULL) { + Py_XDECREF(dflt); + return obj; + } else if (PyErr_Occurred()) { + Py_XDECREF(dflt); + return NULL; + } else if (dflt != NULL) { + return dflt; + } else { + PyErr_Format(ChannelEmptyError, "channel %" PRId64 " is empty", cid); + return NULL; + } } PyDoc_STRVAR(channel_recv_doc, -"channel_recv(cid) -> obj\n\ +"channel_recv(cid, [default]) -> obj\n\ +\n\ +Return a new object from the data at the front of the channel's queue.\n\ \n\ -Return a new object from the data at the from of the channel's queue."); +If there is nothing to receive then raise ChannelEmptyError, unless\n\ +a default value is provided. In that case return it."); static PyObject * channel_close(PyObject *self, PyObject *args, PyObject *kwds) @@ -2455,8 +2551,8 @@ channel__channel_id(PyObject *self, PyObject *args, PyObject *kwds) } static PyMethodDef module_functions[] = { - {"create", (PyCFunction)interp_create, - METH_VARARGS, create_doc}, + {"create", (PyCFunction)(void(*)(void))interp_create, + METH_VARARGS | METH_KEYWORDS, create_doc}, {"destroy", (PyCFunction)(void(*)(void))interp_destroy, METH_VARARGS | METH_KEYWORDS, destroy_doc}, {"list_all", interp_list_all, @@ -2479,6 +2575,8 @@ static PyMethodDef module_functions[] = { METH_VARARGS | METH_KEYWORDS, channel_destroy_doc}, {"channel_list_all", channel_list_all, METH_NOARGS, channel_list_all_doc}, + {"channel_list_interpreters", (PyCFunction)(void(*)(void))channel_list_interpreters, + METH_VARARGS | METH_KEYWORDS, channel_list_interpreters_doc}, {"channel_send", (PyCFunction)(void(*)(void))channel_send, METH_VARARGS | METH_KEYWORDS, channel_send_doc}, {"channel_recv", (PyCFunction)(void(*)(void))channel_recv, diff --git a/Modules/_xxtestfuzz/_xxtestfuzz.c b/Modules/_xxtestfuzz/_xxtestfuzz.c index 781dd23500a29ed006394015deaa9ae0de7b6977..e0694de6719df081df8865efb51e9c465eab20a7 100644 --- a/Modules/_xxtestfuzz/_xxtestfuzz.c +++ b/Modules/_xxtestfuzz/_xxtestfuzz.c @@ -44,10 +44,5 @@ static struct PyModuleDef _fuzzmodule = { PyMODINIT_FUNC PyInit__xxtestfuzz(void) { - PyObject *m = NULL; - - if ((m = PyModule_Create(&_fuzzmodule)) == NULL) { - return NULL; - } - return m; + return PyModule_Create(&_fuzzmodule); } diff --git a/Modules/_xxtestfuzz/fuzz_struct_unpack_corpus/hello_string b/Modules/_xxtestfuzz/fuzz_struct_unpack_corpus/hello_string new file mode 100644 index 0000000000000000000000000000000000000000..92d47cd358eef5344f89d9e8d94f8eb3c350533e Binary files /dev/null and b/Modules/_xxtestfuzz/fuzz_struct_unpack_corpus/hello_string differ diff --git a/Modules/_xxtestfuzz/fuzz_struct_unpack_corpus/long_zero b/Modules/_xxtestfuzz/fuzz_struct_unpack_corpus/long_zero new file mode 100644 index 0000000000000000000000000000000000000000..d952225c3a6e00393c7290c7309216b4a32bcbbe Binary files /dev/null and b/Modules/_xxtestfuzz/fuzz_struct_unpack_corpus/long_zero differ diff --git a/Modules/_xxtestfuzz/fuzz_struct_unpack_corpus/varied_format_string b/Modules/_xxtestfuzz/fuzz_struct_unpack_corpus/varied_format_string new file mode 100644 index 0000000000000000000000000000000000000000..a150dc087adfe846323b3d46c20421a4dda574a9 Binary files /dev/null and b/Modules/_xxtestfuzz/fuzz_struct_unpack_corpus/varied_format_string differ diff --git a/Modules/_xxtestfuzz/fuzz_tests.txt b/Modules/_xxtestfuzz/fuzz_tests.txt index 9d330a668ee88b6fe22c5cb2ab9ae3604f38dd54..053b77b41b111a0f53e34e947450c79994c7565e 100644 --- a/Modules/_xxtestfuzz/fuzz_tests.txt +++ b/Modules/_xxtestfuzz/fuzz_tests.txt @@ -5,3 +5,4 @@ fuzz_json_loads fuzz_sre_compile fuzz_sre_match fuzz_csv_reader +fuzz_struct_unpack diff --git a/Modules/_xxtestfuzz/fuzzer.c b/Modules/_xxtestfuzz/fuzzer.c index 1821eb2a0f017b1765460473ad9698d60138f5b6..6bd2c3aedccc94be9b87df47a74c63082aeda5bc 100644 --- a/Modules/_xxtestfuzz/fuzzer.c +++ b/Modules/_xxtestfuzz/fuzzer.c @@ -79,6 +79,69 @@ static int fuzz_builtin_unicode(const char* data, size_t size) { return 0; } + +PyObject* struct_unpack_method = NULL; +PyObject* struct_error = NULL; +/* Called by LLVMFuzzerTestOneInput for initialization */ +static int init_struct_unpack() { + /* Import struct.unpack */ + PyObject* struct_module = PyImport_ImportModule("struct"); + if (struct_module == NULL) { + return 0; + } + struct_error = PyObject_GetAttrString(struct_module, "error"); + if (struct_error == NULL) { + return 0; + } + struct_unpack_method = PyObject_GetAttrString(struct_module, "unpack"); + return struct_unpack_method != NULL; +} +/* Fuzz struct.unpack(x, y) */ +static int fuzz_struct_unpack(const char* data, size_t size) { + /* Everything up to the first null byte is considered the + format. Everything after is the buffer */ + const char* first_null = memchr(data, '\0', size); + if (first_null == NULL) { + return 0; + } + + size_t format_length = first_null - data; + size_t buffer_length = size - format_length - 1; + + PyObject* pattern = PyBytes_FromStringAndSize(data, format_length); + if (pattern == NULL) { + return 0; + } + PyObject* buffer = PyBytes_FromStringAndSize(first_null + 1, buffer_length); + if (buffer == NULL) { + Py_DECREF(pattern); + return 0; + } + + PyObject* unpacked = PyObject_CallFunctionObjArgs( + struct_unpack_method, pattern, buffer, NULL); + /* Ignore any overflow errors, these are easily triggered accidentally */ + if (unpacked == NULL && PyErr_ExceptionMatches(PyExc_OverflowError)) { + PyErr_Clear(); + } + /* The pascal format string will throw a negative size when passing 0 + like: struct.unpack('0p', b'') */ + if (unpacked == NULL && PyErr_ExceptionMatches(PyExc_SystemError)) { + PyErr_Clear(); + } + /* Ignore any struct.error exceptions, these can be caused by invalid + formats or incomplete buffers both of which are common. */ + if (unpacked == NULL && PyErr_ExceptionMatches(struct_error)) { + PyErr_Clear(); + } + + Py_XDECREF(unpacked); + Py_DECREF(pattern); + Py_DECREF(buffer); + return 0; +} + + #define MAX_JSON_TEST_SIZE 0x10000 PyObject* json_loads_method = NULL; @@ -104,7 +167,7 @@ static int fuzz_json_loads(const char* data, size_t size) { if (input_bytes == NULL) { return 0; } - PyObject* parsed = PyObject_CallFunctionObjArgs(json_loads_method, input_bytes, NULL); + PyObject* parsed = PyObject_CallOneArg(json_loads_method, input_bytes); if (parsed == NULL) { /* Ignore ValueError as the fuzzer will more than likely generate some invalid json and values */ @@ -190,9 +253,10 @@ static int fuzz_sre_compile(const char* data, size_t size) { PyErr_Clear(); } /* Ignore some common errors thrown by sre_parse: - Overflow, Assertion and Index */ + Overflow, Assertion, Recursion and Index */ if (compiled == NULL && (PyErr_ExceptionMatches(PyExc_OverflowError) || PyErr_ExceptionMatches(PyExc_AssertionError) || + PyErr_ExceptionMatches(PyExc_RecursionError) || PyErr_ExceptionMatches(PyExc_IndexError)) ) { PyErr_Clear(); @@ -263,7 +327,7 @@ static int fuzz_sre_match(const char* data, size_t size) { PyObject* pattern = compiled_patterns[idx]; PyObject* match_callable = PyObject_GetAttrString(pattern, "match"); - PyObject* matches = PyObject_CallFunctionObjArgs(match_callable, to_match, NULL); + PyObject* matches = PyObject_CallOneArg(match_callable, to_match); Py_XDECREF(matches); Py_DECREF(match_callable); @@ -378,6 +442,16 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { #if !defined(_Py_FUZZ_ONE) || defined(_Py_FUZZ_fuzz_builtin_unicode) rv |= _run_fuzz(data, size, fuzz_builtin_unicode); #endif +#if !defined(_Py_FUZZ_ONE) || defined(_Py_FUZZ_fuzz_struct_unpack) + static int STRUCT_UNPACK_INITIALIZED = 0; + if (!STRUCT_UNPACK_INITIALIZED && !init_struct_unpack()) { + PyErr_Print(); + abort(); + } else { + STRUCT_UNPACK_INITIALIZED = 1; + } + rv |= _run_fuzz(data, size, fuzz_struct_unpack); +#endif #if !defined(_Py_FUZZ_ONE) || defined(_Py_FUZZ_fuzz_json_loads) static int JSON_LOADS_INITIALIZED = 0; if (!JSON_LOADS_INITIALIZED && !init_json_loads()) { diff --git a/Modules/_zoneinfo.c b/Modules/_zoneinfo.c new file mode 100644 index 0000000000000000000000000000000000000000..f655768496e132ac0e5e92e55e3b5e58ca977092 --- /dev/null +++ b/Modules/_zoneinfo.c @@ -0,0 +1,2724 @@ +#include "Python.h" +#include "structmember.h" + +#include +#include +#include + +#include "datetime.h" + +// Imports +static PyObject *io_open = NULL; +static PyObject *_tzpath_find_tzfile = NULL; +static PyObject *_common_mod = NULL; + +typedef struct TransitionRuleType TransitionRuleType; +typedef struct StrongCacheNode StrongCacheNode; + +typedef struct { + PyObject *utcoff; + PyObject *dstoff; + PyObject *tzname; + long utcoff_seconds; +} _ttinfo; + +typedef struct { + _ttinfo std; + _ttinfo dst; + int dst_diff; + TransitionRuleType *start; + TransitionRuleType *end; + unsigned char std_only; +} _tzrule; + +typedef struct { + PyDateTime_TZInfo base; + PyObject *key; + PyObject *file_repr; + PyObject *weakreflist; + size_t num_transitions; + size_t num_ttinfos; + int64_t *trans_list_utc; + int64_t *trans_list_wall[2]; + _ttinfo **trans_ttinfos; // References to the ttinfo for each transition + _ttinfo *ttinfo_before; + _tzrule tzrule_after; + _ttinfo *_ttinfos; // Unique array of ttinfos for ease of deallocation + unsigned char fixed_offset; + unsigned char source; +} PyZoneInfo_ZoneInfo; + +struct TransitionRuleType { + int64_t (*year_to_timestamp)(TransitionRuleType *, int); +}; + +typedef struct { + TransitionRuleType base; + uint8_t month; + uint8_t week; + uint8_t day; + int8_t hour; + int8_t minute; + int8_t second; +} CalendarRule; + +typedef struct { + TransitionRuleType base; + uint8_t julian; + unsigned int day; + int8_t hour; + int8_t minute; + int8_t second; +} DayRule; + +struct StrongCacheNode { + StrongCacheNode *next; + StrongCacheNode *prev; + PyObject *key; + PyObject *zone; +}; + +static PyTypeObject PyZoneInfo_ZoneInfoType; + +// Globals +static PyObject *TIMEDELTA_CACHE = NULL; +static PyObject *ZONEINFO_WEAK_CACHE = NULL; +static StrongCacheNode *ZONEINFO_STRONG_CACHE = NULL; +static size_t ZONEINFO_STRONG_CACHE_MAX_SIZE = 8; + +static _ttinfo NO_TTINFO = {NULL, NULL, NULL, 0}; + +// Constants +static const int EPOCHORDINAL = 719163; +static int DAYS_IN_MONTH[] = { + -1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, +}; + +static int DAYS_BEFORE_MONTH[] = { + -1, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, +}; + +static const int SOURCE_NOCACHE = 0; +static const int SOURCE_CACHE = 1; +static const int SOURCE_FILE = 2; + +// Forward declarations +static int +load_data(PyZoneInfo_ZoneInfo *self, PyObject *file_obj); +static void +utcoff_to_dstoff(size_t *trans_idx, long *utcoffs, long *dstoffs, + unsigned char *isdsts, size_t num_transitions, + size_t num_ttinfos); +static int +ts_to_local(size_t *trans_idx, int64_t *trans_utc, long *utcoff, + int64_t *trans_local[2], size_t num_ttinfos, + size_t num_transitions); + +static int +parse_tz_str(PyObject *tz_str_obj, _tzrule *out); + +static Py_ssize_t +parse_abbr(const char *const p, PyObject **abbr); +static Py_ssize_t +parse_tz_delta(const char *const p, long *total_seconds); +static Py_ssize_t +parse_transition_time(const char *const p, int8_t *hour, int8_t *minute, + int8_t *second); +static Py_ssize_t +parse_transition_rule(const char *const p, TransitionRuleType **out); + +static _ttinfo * +find_tzrule_ttinfo(_tzrule *rule, int64_t ts, unsigned char fold, int year); +static _ttinfo * +find_tzrule_ttinfo_fromutc(_tzrule *rule, int64_t ts, int year, + unsigned char *fold); + +static int +build_ttinfo(long utcoffset, long dstoffset, PyObject *tzname, _ttinfo *out); +static void +xdecref_ttinfo(_ttinfo *ttinfo); +static int +ttinfo_eq(const _ttinfo *const tti0, const _ttinfo *const tti1); + +static int +build_tzrule(PyObject *std_abbr, PyObject *dst_abbr, long std_offset, + long dst_offset, TransitionRuleType *start, + TransitionRuleType *end, _tzrule *out); +static void +free_tzrule(_tzrule *tzrule); + +static PyObject * +load_timedelta(long seconds); + +static int +get_local_timestamp(PyObject *dt, int64_t *local_ts); +static _ttinfo * +find_ttinfo(PyZoneInfo_ZoneInfo *self, PyObject *dt); + +static int +ymd_to_ord(int y, int m, int d); +static int +is_leap_year(int year); + +static size_t +_bisect(const int64_t value, const int64_t *arr, size_t size); + +static int +eject_from_strong_cache(const PyTypeObject *const type, PyObject *key); +static void +clear_strong_cache(const PyTypeObject *const type); +static void +update_strong_cache(const PyTypeObject *const type, PyObject *key, + PyObject *zone); +static PyObject * +zone_from_strong_cache(const PyTypeObject *const type, PyObject *const key); + +static PyObject * +zoneinfo_new_instance(PyTypeObject *type, PyObject *key) +{ + PyObject *file_obj = NULL; + PyObject *file_path = NULL; + + file_path = PyObject_CallFunctionObjArgs(_tzpath_find_tzfile, key, NULL); + if (file_path == NULL) { + return NULL; + } + else if (file_path == Py_None) { + file_obj = PyObject_CallMethod(_common_mod, "load_tzdata", "O", key); + if (file_obj == NULL) { + Py_DECREF(file_path); + return NULL; + } + } + + PyObject *self = (PyObject *)(type->tp_alloc(type, 0)); + if (self == NULL) { + goto error; + } + + if (file_obj == NULL) { + file_obj = PyObject_CallFunction(io_open, "Os", file_path, "rb"); + if (file_obj == NULL) { + goto error; + } + } + + if (load_data((PyZoneInfo_ZoneInfo *)self, file_obj)) { + goto error; + } + + PyObject *rv = PyObject_CallMethod(file_obj, "close", NULL); + Py_DECREF(file_obj); + file_obj = NULL; + if (rv == NULL) { + goto error; + } + Py_DECREF(rv); + + ((PyZoneInfo_ZoneInfo *)self)->key = key; + Py_INCREF(key); + + goto cleanup; +error: + Py_XDECREF(self); + self = NULL; +cleanup: + if (file_obj != NULL) { + PyObject *exc, *val, *tb; + PyErr_Fetch(&exc, &val, &tb); + PyObject *tmp = PyObject_CallMethod(file_obj, "close", NULL); + _PyErr_ChainExceptions(exc, val, tb); + if (tmp == NULL) { + Py_CLEAR(self); + } + Py_XDECREF(tmp); + Py_DECREF(file_obj); + } + Py_DECREF(file_path); + return self; +} + +static PyObject * +get_weak_cache(PyTypeObject *type) +{ + if (type == &PyZoneInfo_ZoneInfoType) { + return ZONEINFO_WEAK_CACHE; + } + else { + PyObject *cache = + PyObject_GetAttrString((PyObject *)type, "_weak_cache"); + // We are assuming that the type lives at least as long as the function + // that calls get_weak_cache, and that it holds a reference to the + // cache, so we'll return a "borrowed reference". + Py_XDECREF(cache); + return cache; + } +} + +static PyObject * +zoneinfo_new(PyTypeObject *type, PyObject *args, PyObject *kw) +{ + PyObject *key = NULL; + static char *kwlist[] = {"key", NULL}; + if (PyArg_ParseTupleAndKeywords(args, kw, "O", kwlist, &key) == 0) { + return NULL; + } + + PyObject *instance = zone_from_strong_cache(type, key); + if (instance != NULL || PyErr_Occurred()) { + return instance; + } + + PyObject *weak_cache = get_weak_cache(type); + instance = PyObject_CallMethod(weak_cache, "get", "O", key, Py_None); + if (instance == NULL) { + return NULL; + } + + if (instance == Py_None) { + Py_DECREF(instance); + PyObject *tmp = zoneinfo_new_instance(type, key); + if (tmp == NULL) { + return NULL; + } + + instance = + PyObject_CallMethod(weak_cache, "setdefault", "OO", key, tmp); + Py_DECREF(tmp); + if (instance == NULL) { + return NULL; + } + ((PyZoneInfo_ZoneInfo *)instance)->source = SOURCE_CACHE; + } + + update_strong_cache(type, key, instance); + return instance; +} + +static void +zoneinfo_dealloc(PyObject *obj_self) +{ + PyZoneInfo_ZoneInfo *self = (PyZoneInfo_ZoneInfo *)obj_self; + + if (self->weakreflist != NULL) { + PyObject_ClearWeakRefs(obj_self); + } + + if (self->trans_list_utc != NULL) { + PyMem_Free(self->trans_list_utc); + } + + for (size_t i = 0; i < 2; i++) { + if (self->trans_list_wall[i] != NULL) { + PyMem_Free(self->trans_list_wall[i]); + } + } + + if (self->_ttinfos != NULL) { + for (size_t i = 0; i < self->num_ttinfos; ++i) { + xdecref_ttinfo(&(self->_ttinfos[i])); + } + PyMem_Free(self->_ttinfos); + } + + if (self->trans_ttinfos != NULL) { + PyMem_Free(self->trans_ttinfos); + } + + free_tzrule(&(self->tzrule_after)); + + Py_XDECREF(self->key); + Py_XDECREF(self->file_repr); + + Py_TYPE(self)->tp_free((PyObject *)self); +} + +static PyObject * +zoneinfo_from_file(PyTypeObject *type, PyObject *args, PyObject *kwargs) +{ + PyObject *file_obj = NULL; + PyObject *file_repr = NULL; + PyObject *key = Py_None; + PyZoneInfo_ZoneInfo *self = NULL; + + static char *kwlist[] = {"", "key", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|O", kwlist, &file_obj, + &key)) { + return NULL; + } + + PyObject *obj_self = (PyObject *)(type->tp_alloc(type, 0)); + self = (PyZoneInfo_ZoneInfo *)obj_self; + if (self == NULL) { + return NULL; + } + + file_repr = PyUnicode_FromFormat("%R", file_obj); + if (file_repr == NULL) { + goto error; + } + + if (load_data(self, file_obj)) { + goto error; + } + + self->source = SOURCE_FILE; + self->file_repr = file_repr; + self->key = key; + Py_INCREF(key); + + return obj_self; +error: + Py_XDECREF(file_repr); + Py_XDECREF(self); + return NULL; +} + +static PyObject * +zoneinfo_no_cache(PyTypeObject *cls, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = {"key", NULL}; + PyObject *key = NULL; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", kwlist, &key)) { + return NULL; + } + + PyObject *out = zoneinfo_new_instance(cls, key); + if (out != NULL) { + ((PyZoneInfo_ZoneInfo *)out)->source = SOURCE_NOCACHE; + } + + return out; +} + +static PyObject * +zoneinfo_clear_cache(PyObject *cls, PyObject *args, PyObject *kwargs) +{ + PyObject *only_keys = NULL; + static char *kwlist[] = {"only_keys", NULL}; + + if (!(PyArg_ParseTupleAndKeywords(args, kwargs, "|$O", kwlist, + &only_keys))) { + return NULL; + } + + PyTypeObject *type = (PyTypeObject *)cls; + PyObject *weak_cache = get_weak_cache(type); + + if (only_keys == NULL || only_keys == Py_None) { + PyObject *rv = PyObject_CallMethod(weak_cache, "clear", NULL); + if (rv != NULL) { + Py_DECREF(rv); + } + + clear_strong_cache(type); + } + else { + PyObject *item = NULL; + PyObject *pop = PyUnicode_FromString("pop"); + if (pop == NULL) { + return NULL; + } + + PyObject *iter = PyObject_GetIter(only_keys); + if (iter == NULL) { + Py_DECREF(pop); + return NULL; + } + + while ((item = PyIter_Next(iter))) { + // Remove from strong cache + if (eject_from_strong_cache(type, item) < 0) { + Py_DECREF(item); + break; + } + + // Remove from weak cache + PyObject *tmp = PyObject_CallMethodObjArgs(weak_cache, pop, item, + Py_None, NULL); + + Py_DECREF(item); + if (tmp == NULL) { + break; + } + Py_DECREF(tmp); + } + Py_DECREF(iter); + Py_DECREF(pop); + } + + if (PyErr_Occurred()) { + return NULL; + } + + Py_RETURN_NONE; +} + +static PyObject * +zoneinfo_utcoffset(PyObject *self, PyObject *dt) +{ + _ttinfo *tti = find_ttinfo((PyZoneInfo_ZoneInfo *)self, dt); + if (tti == NULL) { + return NULL; + } + Py_INCREF(tti->utcoff); + return tti->utcoff; +} + +static PyObject * +zoneinfo_dst(PyObject *self, PyObject *dt) +{ + _ttinfo *tti = find_ttinfo((PyZoneInfo_ZoneInfo *)self, dt); + if (tti == NULL) { + return NULL; + } + Py_INCREF(tti->dstoff); + return tti->dstoff; +} + +static PyObject * +zoneinfo_tzname(PyObject *self, PyObject *dt) +{ + _ttinfo *tti = find_ttinfo((PyZoneInfo_ZoneInfo *)self, dt); + if (tti == NULL) { + return NULL; + } + Py_INCREF(tti->tzname); + return tti->tzname; +} + +#define HASTZINFO(p) (((_PyDateTime_BaseTZInfo *)(p))->hastzinfo) +#define GET_DT_TZINFO(p) \ + (HASTZINFO(p) ? ((PyDateTime_DateTime *)(p))->tzinfo : Py_None) + +static PyObject * +zoneinfo_fromutc(PyObject *obj_self, PyObject *dt) +{ + if (!PyDateTime_Check(dt)) { + PyErr_SetString(PyExc_TypeError, + "fromutc: argument must be a datetime"); + return NULL; + } + if (GET_DT_TZINFO(dt) != obj_self) { + PyErr_SetString(PyExc_ValueError, + "fromutc: dt.tzinfo " + "is not self"); + return NULL; + } + + PyZoneInfo_ZoneInfo *self = (PyZoneInfo_ZoneInfo *)obj_self; + + int64_t timestamp; + if (get_local_timestamp(dt, ×tamp)) { + return NULL; + } + size_t num_trans = self->num_transitions; + + _ttinfo *tti = NULL; + unsigned char fold = 0; + + if (num_trans >= 1 && timestamp < self->trans_list_utc[0]) { + tti = self->ttinfo_before; + } + else if (num_trans == 0 || + timestamp > self->trans_list_utc[num_trans - 1]) { + tti = find_tzrule_ttinfo_fromutc(&(self->tzrule_after), timestamp, + PyDateTime_GET_YEAR(dt), &fold); + + // Immediately after the last manual transition, the fold/gap is + // between self->trans_ttinfos[num_transitions - 1] and whatever + // ttinfo applies immediately after the last transition, not between + // the STD and DST rules in the tzrule_after, so we may need to + // adjust the fold value. + if (num_trans) { + _ttinfo *tti_prev = NULL; + if (num_trans == 1) { + tti_prev = self->ttinfo_before; + } + else { + tti_prev = self->trans_ttinfos[num_trans - 2]; + } + int64_t diff = tti_prev->utcoff_seconds - tti->utcoff_seconds; + if (diff > 0 && + timestamp < (self->trans_list_utc[num_trans - 1] + diff)) { + fold = 1; + } + } + } + else { + size_t idx = _bisect(timestamp, self->trans_list_utc, num_trans); + _ttinfo *tti_prev = NULL; + + if (idx >= 2) { + tti_prev = self->trans_ttinfos[idx - 2]; + tti = self->trans_ttinfos[idx - 1]; + } + else { + tti_prev = self->ttinfo_before; + tti = self->trans_ttinfos[0]; + } + + // Detect fold + int64_t shift = + (int64_t)(tti_prev->utcoff_seconds - tti->utcoff_seconds); + if (shift > (timestamp - self->trans_list_utc[idx - 1])) { + fold = 1; + } + } + + PyObject *tmp = PyNumber_Add(dt, tti->utcoff); + if (tmp == NULL) { + return NULL; + } + + if (fold) { + if (PyDateTime_CheckExact(tmp)) { + ((PyDateTime_DateTime *)tmp)->fold = 1; + dt = tmp; + } + else { + PyObject *replace = PyObject_GetAttrString(tmp, "replace"); + PyObject *args = PyTuple_New(0); + PyObject *kwargs = PyDict_New(); + + Py_DECREF(tmp); + if (args == NULL || kwargs == NULL || replace == NULL) { + Py_XDECREF(args); + Py_XDECREF(kwargs); + Py_XDECREF(replace); + return NULL; + } + + dt = NULL; + if (!PyDict_SetItemString(kwargs, "fold", _PyLong_One)) { + dt = PyObject_Call(replace, args, kwargs); + } + + Py_DECREF(args); + Py_DECREF(kwargs); + Py_DECREF(replace); + + if (dt == NULL) { + return NULL; + } + } + } + else { + dt = tmp; + } + return dt; +} + +static PyObject * +zoneinfo_repr(PyZoneInfo_ZoneInfo *self) +{ + PyObject *rv = NULL; + const char *type_name = Py_TYPE((PyObject *)self)->tp_name; + if (!(self->key == Py_None)) { + rv = PyUnicode_FromFormat("%s(key=%R)", type_name, self->key); + } + else { + assert(PyUnicode_Check(self->file_repr)); + rv = PyUnicode_FromFormat("%s.from_file(%U)", type_name, + self->file_repr); + } + + return rv; +} + +static PyObject * +zoneinfo_str(PyZoneInfo_ZoneInfo *self) +{ + if (!(self->key == Py_None)) { + Py_INCREF(self->key); + return self->key; + } + else { + return zoneinfo_repr(self); + } +} + +/* Pickles the ZoneInfo object by key and source. + * + * ZoneInfo objects are pickled by reference to the TZif file that they came + * from, which means that the exact transitions may be different or the file + * may not un-pickle if the data has changed on disk in the interim. + * + * It is necessary to include a bit indicating whether or not the object + * was constructed from the cache, because from-cache objects will hit the + * unpickling process's cache, whereas no-cache objects will bypass it. + * + * Objects constructed from ZoneInfo.from_file cannot be pickled. + */ +static PyObject * +zoneinfo_reduce(PyObject *obj_self, PyObject *unused) +{ + PyZoneInfo_ZoneInfo *self = (PyZoneInfo_ZoneInfo *)obj_self; + if (self->source == SOURCE_FILE) { + // Objects constructed from files cannot be pickled. + PyObject *pickle = PyImport_ImportModule("pickle"); + if (pickle == NULL) { + return NULL; + } + + PyObject *pickle_error = + PyObject_GetAttrString(pickle, "PicklingError"); + Py_DECREF(pickle); + if (pickle_error == NULL) { + return NULL; + } + + PyErr_Format(pickle_error, + "Cannot pickle a ZoneInfo file from a file stream."); + Py_DECREF(pickle_error); + return NULL; + } + + unsigned char from_cache = self->source == SOURCE_CACHE ? 1 : 0; + PyObject *constructor = PyObject_GetAttrString(obj_self, "_unpickle"); + + if (constructor == NULL) { + return NULL; + } + + PyObject *rv = Py_BuildValue("O(OB)", constructor, self->key, from_cache); + Py_DECREF(constructor); + return rv; +} + +static PyObject * +zoneinfo__unpickle(PyTypeObject *cls, PyObject *args) +{ + PyObject *key; + unsigned char from_cache; + if (!PyArg_ParseTuple(args, "OB", &key, &from_cache)) { + return NULL; + } + + if (from_cache) { + PyObject *val_args = Py_BuildValue("(O)", key); + if (val_args == NULL) { + return NULL; + } + + PyObject *rv = zoneinfo_new(cls, val_args, NULL); + + Py_DECREF(val_args); + return rv; + } + else { + return zoneinfo_new_instance(cls, key); + } +} + +/* It is relatively expensive to construct new timedelta objects, and in most + * cases we're looking at a relatively small number of timedeltas, such as + * integer number of hours, etc. We will keep a cache so that we construct + * a minimal number of these. + * + * Possibly this should be replaced with an LRU cache so that it's not possible + * for the memory usage to explode from this, but in order for this to be a + * serious problem, one would need to deliberately craft a malicious time zone + * file with many distinct offsets. As of tzdb 2019c, loading every single zone + * fills the cache with ~450 timedeltas for a total size of ~12kB. + * + * This returns a new reference to the timedelta. + */ +static PyObject * +load_timedelta(long seconds) +{ + PyObject *rv = NULL; + PyObject *pyoffset = PyLong_FromLong(seconds); + if (pyoffset == NULL) { + return NULL; + } + int contains = PyDict_Contains(TIMEDELTA_CACHE, pyoffset); + if (contains == -1) { + goto error; + } + + if (!contains) { + PyObject *tmp = PyDateTimeAPI->Delta_FromDelta( + 0, seconds, 0, 1, PyDateTimeAPI->DeltaType); + + if (tmp == NULL) { + goto error; + } + + rv = PyDict_SetDefault(TIMEDELTA_CACHE, pyoffset, tmp); + Py_DECREF(tmp); + } + else { + rv = PyDict_GetItem(TIMEDELTA_CACHE, pyoffset); + } + + Py_DECREF(pyoffset); + Py_INCREF(rv); + return rv; +error: + Py_DECREF(pyoffset); + return NULL; +} + +/* Constructor for _ttinfo object - this starts by initializing the _ttinfo + * to { NULL, NULL, NULL }, so that Py_XDECREF will work on partially + * initialized _ttinfo objects. + */ +static int +build_ttinfo(long utcoffset, long dstoffset, PyObject *tzname, _ttinfo *out) +{ + out->utcoff = NULL; + out->dstoff = NULL; + out->tzname = NULL; + + out->utcoff_seconds = utcoffset; + out->utcoff = load_timedelta(utcoffset); + if (out->utcoff == NULL) { + return -1; + } + + out->dstoff = load_timedelta(dstoffset); + if (out->dstoff == NULL) { + return -1; + } + + out->tzname = tzname; + Py_INCREF(tzname); + + return 0; +} + +/* Decrease reference count on any non-NULL members of a _ttinfo */ +static void +xdecref_ttinfo(_ttinfo *ttinfo) +{ + if (ttinfo != NULL) { + Py_XDECREF(ttinfo->utcoff); + Py_XDECREF(ttinfo->dstoff); + Py_XDECREF(ttinfo->tzname); + } +} + +/* Equality function for _ttinfo. */ +static int +ttinfo_eq(const _ttinfo *const tti0, const _ttinfo *const tti1) +{ + int rv; + if ((rv = PyObject_RichCompareBool(tti0->utcoff, tti1->utcoff, Py_EQ)) < + 1) { + goto end; + } + + if ((rv = PyObject_RichCompareBool(tti0->dstoff, tti1->dstoff, Py_EQ)) < + 1) { + goto end; + } + + if ((rv = PyObject_RichCompareBool(tti0->tzname, tti1->tzname, Py_EQ)) < + 1) { + goto end; + } +end: + return rv; +} + +/* Given a file-like object, this populates a ZoneInfo object + * + * The current version calls into a Python function to read the data from + * file into Python objects, and this translates those Python objects into + * C values and calculates derived values (e.g. dstoff) in C. + * + * This returns 0 on success and -1 on failure. + * + * The function will never return while `self` is partially initialized — + * the object only needs to be freed / deallocated if this succeeds. + */ +static int +load_data(PyZoneInfo_ZoneInfo *self, PyObject *file_obj) +{ + PyObject *data_tuple = NULL; + + long *utcoff = NULL; + long *dstoff = NULL; + size_t *trans_idx = NULL; + unsigned char *isdst = NULL; + + self->trans_list_utc = NULL; + self->trans_list_wall[0] = NULL; + self->trans_list_wall[1] = NULL; + self->trans_ttinfos = NULL; + self->_ttinfos = NULL; + self->file_repr = NULL; + + size_t ttinfos_allocated = 0; + + data_tuple = PyObject_CallMethod(_common_mod, "load_data", "O", file_obj); + + if (data_tuple == NULL) { + goto error; + } + + if (!PyTuple_CheckExact(data_tuple)) { + PyErr_Format(PyExc_TypeError, "Invalid data result type: %r", + data_tuple); + goto error; + } + + // Unpack the data tuple + PyObject *trans_idx_list = PyTuple_GetItem(data_tuple, 0); + if (trans_idx_list == NULL) { + goto error; + } + + PyObject *trans_utc = PyTuple_GetItem(data_tuple, 1); + if (trans_utc == NULL) { + goto error; + } + + PyObject *utcoff_list = PyTuple_GetItem(data_tuple, 2); + if (utcoff_list == NULL) { + goto error; + } + + PyObject *isdst_list = PyTuple_GetItem(data_tuple, 3); + if (isdst_list == NULL) { + goto error; + } + + PyObject *abbr = PyTuple_GetItem(data_tuple, 4); + if (abbr == NULL) { + goto error; + } + + PyObject *tz_str = PyTuple_GetItem(data_tuple, 5); + if (tz_str == NULL) { + goto error; + } + + // Load the relevant sizes + Py_ssize_t num_transitions = PyTuple_Size(trans_utc); + if (num_transitions < 0) { + goto error; + } + + Py_ssize_t num_ttinfos = PyTuple_Size(utcoff_list); + if (num_ttinfos < 0) { + goto error; + } + + self->num_transitions = (size_t)num_transitions; + self->num_ttinfos = (size_t)num_ttinfos; + + // Load the transition indices and list + self->trans_list_utc = + PyMem_Malloc(self->num_transitions * sizeof(int64_t)); + if (self->trans_list_utc == NULL) { + goto error; + } + trans_idx = PyMem_Malloc(self->num_transitions * sizeof(Py_ssize_t)); + if (trans_idx == NULL) { + goto error; + } + + for (size_t i = 0; i < self->num_transitions; ++i) { + PyObject *num = PyTuple_GetItem(trans_utc, i); + if (num == NULL) { + goto error; + } + self->trans_list_utc[i] = PyLong_AsLongLong(num); + if (self->trans_list_utc[i] == -1 && PyErr_Occurred()) { + goto error; + } + + num = PyTuple_GetItem(trans_idx_list, i); + if (num == NULL) { + goto error; + } + + Py_ssize_t cur_trans_idx = PyLong_AsSsize_t(num); + if (cur_trans_idx == -1) { + goto error; + } + + trans_idx[i] = (size_t)cur_trans_idx; + if (trans_idx[i] > self->num_ttinfos) { + PyErr_Format( + PyExc_ValueError, + "Invalid transition index found while reading TZif: %zd", + cur_trans_idx); + + goto error; + } + } + + // Load UTC offsets and isdst (size num_ttinfos) + utcoff = PyMem_Malloc(self->num_ttinfos * sizeof(long)); + isdst = PyMem_Malloc(self->num_ttinfos * sizeof(unsigned char)); + + if (utcoff == NULL || isdst == NULL) { + goto error; + } + for (size_t i = 0; i < self->num_ttinfos; ++i) { + PyObject *num = PyTuple_GetItem(utcoff_list, i); + if (num == NULL) { + goto error; + } + + utcoff[i] = PyLong_AsLong(num); + if (utcoff[i] == -1 && PyErr_Occurred()) { + goto error; + } + + num = PyTuple_GetItem(isdst_list, i); + if (num == NULL) { + goto error; + } + + int isdst_with_error = PyObject_IsTrue(num); + if (isdst_with_error == -1) { + goto error; + } + else { + isdst[i] = (unsigned char)isdst_with_error; + } + } + + dstoff = PyMem_Calloc(self->num_ttinfos, sizeof(long)); + if (dstoff == NULL) { + goto error; + } + + // Derive dstoff and trans_list_wall from the information we've loaded + utcoff_to_dstoff(trans_idx, utcoff, dstoff, isdst, self->num_transitions, + self->num_ttinfos); + + if (ts_to_local(trans_idx, self->trans_list_utc, utcoff, + self->trans_list_wall, self->num_ttinfos, + self->num_transitions)) { + goto error; + } + + // Build _ttinfo objects from utcoff, dstoff and abbr + self->_ttinfos = PyMem_Malloc(self->num_ttinfos * sizeof(_ttinfo)); + if (self->_ttinfos == NULL) { + goto error; + } + for (size_t i = 0; i < self->num_ttinfos; ++i) { + PyObject *tzname = PyTuple_GetItem(abbr, i); + if (tzname == NULL) { + goto error; + } + + ttinfos_allocated++; + if (build_ttinfo(utcoff[i], dstoff[i], tzname, &(self->_ttinfos[i]))) { + goto error; + } + } + + // Build our mapping from transition to the ttinfo that applies + self->trans_ttinfos = + PyMem_Calloc(self->num_transitions, sizeof(_ttinfo *)); + if (self->trans_ttinfos == NULL) { + goto error; + } + for (size_t i = 0; i < self->num_transitions; ++i) { + size_t ttinfo_idx = trans_idx[i]; + assert(ttinfo_idx < self->num_ttinfos); + self->trans_ttinfos[i] = &(self->_ttinfos[ttinfo_idx]); + } + + // Set ttinfo_before to the first non-DST transition + for (size_t i = 0; i < self->num_ttinfos; ++i) { + if (!isdst[i]) { + self->ttinfo_before = &(self->_ttinfos[i]); + break; + } + } + + // If there are only DST ttinfos, pick the first one, if there are no + // ttinfos at all, set ttinfo_before to NULL + if (self->ttinfo_before == NULL && self->num_ttinfos > 0) { + self->ttinfo_before = &(self->_ttinfos[0]); + } + + if (tz_str != Py_None && PyObject_IsTrue(tz_str)) { + if (parse_tz_str(tz_str, &(self->tzrule_after))) { + goto error; + } + } + else { + if (!self->num_ttinfos) { + PyErr_Format(PyExc_ValueError, "No time zone information found."); + goto error; + } + + size_t idx; + if (!self->num_transitions) { + idx = self->num_ttinfos - 1; + } + else { + idx = trans_idx[self->num_transitions - 1]; + } + + _ttinfo *tti = &(self->_ttinfos[idx]); + build_tzrule(tti->tzname, NULL, tti->utcoff_seconds, 0, NULL, NULL, + &(self->tzrule_after)); + + // We've abused the build_tzrule constructor to construct an STD-only + // rule mimicking whatever ttinfo we've picked up, but it's possible + // that the one we've picked up is a DST zone, so we need to make sure + // that the dstoff is set correctly in that case. + if (PyObject_IsTrue(tti->dstoff)) { + _ttinfo *tti_after = &(self->tzrule_after.std); + Py_DECREF(tti_after->dstoff); + tti_after->dstoff = tti->dstoff; + Py_INCREF(tti_after->dstoff); + } + } + + // Determine if this is a "fixed offset" zone, meaning that the output of + // the utcoffset, dst and tzname functions does not depend on the specific + // datetime passed. + // + // We make three simplifying assumptions here: + // + // 1. If tzrule_after is not std_only, it has transitions that might occur + // (it is possible to construct TZ strings that specify STD and DST but + // no transitions ever occur, such as AAA0BBB,0/0,J365/25). + // 2. If self->_ttinfos contains more than one _ttinfo object, the objects + // represent different offsets. + // 3. self->ttinfos contains no unused _ttinfos (in which case an otherwise + // fixed-offset zone with extra _ttinfos defined may appear to *not* be + // a fixed offset zone). + // + // Violations to these assumptions would be fairly exotic, and exotic + // zones should almost certainly not be used with datetime.time (the + // only thing that would be affected by this). + if (self->num_ttinfos > 1 || !self->tzrule_after.std_only) { + self->fixed_offset = 0; + } + else if (self->num_ttinfos == 0) { + self->fixed_offset = 1; + } + else { + int constant_offset = + ttinfo_eq(&(self->_ttinfos[0]), &self->tzrule_after.std); + if (constant_offset < 0) { + goto error; + } + else { + self->fixed_offset = constant_offset; + } + } + + int rv = 0; + goto cleanup; +error: + // These resources only need to be freed if we have failed, if we succeed + // in initializing a PyZoneInfo_ZoneInfo object, we can rely on its dealloc + // method to free the relevant resources. + if (self->trans_list_utc != NULL) { + PyMem_Free(self->trans_list_utc); + self->trans_list_utc = NULL; + } + + for (size_t i = 0; i < 2; ++i) { + if (self->trans_list_wall[i] != NULL) { + PyMem_Free(self->trans_list_wall[i]); + self->trans_list_wall[i] = NULL; + } + } + + if (self->_ttinfos != NULL) { + for (size_t i = 0; i < ttinfos_allocated; ++i) { + xdecref_ttinfo(&(self->_ttinfos[i])); + } + PyMem_Free(self->_ttinfos); + self->_ttinfos = NULL; + } + + if (self->trans_ttinfos != NULL) { + PyMem_Free(self->trans_ttinfos); + self->trans_ttinfos = NULL; + } + + rv = -1; +cleanup: + Py_XDECREF(data_tuple); + + if (utcoff != NULL) { + PyMem_Free(utcoff); + } + + if (dstoff != NULL) { + PyMem_Free(dstoff); + } + + if (isdst != NULL) { + PyMem_Free(isdst); + } + + if (trans_idx != NULL) { + PyMem_Free(trans_idx); + } + + return rv; +} + +/* Function to calculate the local timestamp of a transition from the year. */ +int64_t +calendarrule_year_to_timestamp(TransitionRuleType *base_self, int year) +{ + CalendarRule *self = (CalendarRule *)base_self; + + // We want (year, month, day of month); we have year and month, but we + // need to turn (week, day-of-week) into day-of-month + // + // Week 1 is the first week in which day `day` (where 0 = Sunday) appears. + // Week 5 represents the last occurrence of day `day`, so we need to know + // the first weekday of the month and the number of days in the month. + int8_t first_day = (ymd_to_ord(year, self->month, 1) + 6) % 7; + uint8_t days_in_month = DAYS_IN_MONTH[self->month]; + if (self->month == 2 && is_leap_year(year)) { + days_in_month += 1; + } + + // This equation seems magical, so I'll break it down: + // 1. calendar says 0 = Monday, POSIX says 0 = Sunday so we need first_day + // + 1 to get 1 = Monday -> 7 = Sunday, which is still equivalent + // because this math is mod 7 + // 2. Get first day - desired day mod 7 (adjusting by 7 for negative + // numbers so that -1 % 7 = 6). + // 3. Add 1 because month days are a 1-based index. + int8_t month_day = ((int8_t)(self->day) - (first_day + 1)) % 7; + if (month_day < 0) { + month_day += 7; + } + month_day += 1; + + // Now use a 0-based index version of `week` to calculate the w-th + // occurrence of `day` + month_day += ((int8_t)(self->week) - 1) * 7; + + // month_day will only be > days_in_month if w was 5, and `w` means "last + // occurrence of `d`", so now we just check if we over-shot the end of the + // month and if so knock off 1 week. + if (month_day > days_in_month) { + month_day -= 7; + } + + int64_t ordinal = ymd_to_ord(year, self->month, month_day) - EPOCHORDINAL; + return ((ordinal * 86400) + (int64_t)(self->hour * 3600) + + (int64_t)(self->minute * 60) + (int64_t)(self->second)); +} + +/* Constructor for CalendarRule. */ +int +calendarrule_new(uint8_t month, uint8_t week, uint8_t day, int8_t hour, + int8_t minute, int8_t second, CalendarRule *out) +{ + // These bounds come from the POSIX standard, which describes an Mm.n.d + // rule as: + // + // The d'th day (0 <= d <= 6) of week n of month m of the year (1 <= n <= + // 5, 1 <= m <= 12, where week 5 means "the last d day in month m" which + // may occur in either the fourth or the fifth week). Week 1 is the first + // week in which the d'th day occurs. Day zero is Sunday. + if (month <= 0 || month > 12) { + PyErr_Format(PyExc_ValueError, "Month must be in (0, 12]"); + return -1; + } + + if (week <= 0 || week > 5) { + PyErr_Format(PyExc_ValueError, "Week must be in (0, 5]"); + return -1; + } + + // If the 'day' parameter type is changed to a signed type, + // "day < 0" check must be added. + if (/* day < 0 || */ day > 6) { + PyErr_Format(PyExc_ValueError, "Day must be in [0, 6]"); + return -1; + } + + TransitionRuleType base = {&calendarrule_year_to_timestamp}; + + CalendarRule new_offset = { + .base = base, + .month = month, + .week = week, + .day = day, + .hour = hour, + .minute = minute, + .second = second, + }; + + *out = new_offset; + return 0; +} + +/* Function to calculate the local timestamp of a transition from the year. + * + * This translates the day of the year into a local timestamp — either a + * 1-based Julian day, not including leap days, or the 0-based year-day, + * including leap days. + * */ +int64_t +dayrule_year_to_timestamp(TransitionRuleType *base_self, int year) +{ + // The function signature requires a TransitionRuleType pointer, but this + // function is only applicable to DayRule* objects. + DayRule *self = (DayRule *)base_self; + + // ymd_to_ord calculates the number of days since 0001-01-01, but we want + // to know the number of days since 1970-01-01, so we must subtract off + // the equivalent of ymd_to_ord(1970, 1, 1). + // + // We subtract off an additional 1 day to account for January 1st (we want + // the number of full days *before* the date of the transition - partial + // days are accounted for in the hour, minute and second portions. + int64_t days_before_year = ymd_to_ord(year, 1, 1) - EPOCHORDINAL - 1; + + // The Julian day specification skips over February 29th in leap years, + // from the POSIX standard: + // + // Leap days shall not be counted. That is, in all years-including leap + // years-February 28 is day 59 and March 1 is day 60. It is impossible to + // refer explicitly to the occasional February 29. + // + // This is actually more useful than you'd think — if you want a rule that + // always transitions on a given calendar day (other than February 29th), + // you would use a Julian day, e.g. J91 always refers to April 1st and J365 + // always refers to December 31st. + unsigned int day = self->day; + if (self->julian && day >= 59 && is_leap_year(year)) { + day += 1; + } + + return ((days_before_year + day) * 86400) + (self->hour * 3600) + + (self->minute * 60) + self->second; +} + +/* Constructor for DayRule. */ +static int +dayrule_new(uint8_t julian, unsigned int day, int8_t hour, int8_t minute, + int8_t second, DayRule *out) +{ + // The POSIX standard specifies that Julian days must be in the range (1 <= + // n <= 365) and that non-Julian (they call it "0-based Julian") days must + // be in the range (0 <= n <= 365). + if (day < julian || day > 365) { + PyErr_Format(PyExc_ValueError, "day must be in [%u, 365], not: %u", + julian, day); + return -1; + } + + TransitionRuleType base = { + &dayrule_year_to_timestamp, + }; + + DayRule tmp = { + .base = base, + .julian = julian, + .day = day, + .hour = hour, + .minute = minute, + .second = second, + }; + + *out = tmp; + + return 0; +} + +/* Calculate the start and end rules for a _tzrule in the given year. */ +static void +tzrule_transitions(_tzrule *rule, int year, int64_t *start, int64_t *end) +{ + assert(rule->start != NULL); + assert(rule->end != NULL); + *start = rule->start->year_to_timestamp(rule->start, year); + *end = rule->end->year_to_timestamp(rule->end, year); +} + +/* Calculate the _ttinfo that applies at a given local time from a _tzrule. + * + * This takes a local timestamp and fold for disambiguation purposes; the year + * could technically be calculated from the timestamp, but given that the + * callers of this function already have the year information accessible from + * the datetime struct, it is taken as an additional parameter to reduce + * unncessary calculation. + * */ +static _ttinfo * +find_tzrule_ttinfo(_tzrule *rule, int64_t ts, unsigned char fold, int year) +{ + if (rule->std_only) { + return &(rule->std); + } + + int64_t start, end; + uint8_t isdst; + + tzrule_transitions(rule, year, &start, &end); + + // With fold = 0, the period (denominated in local time) with the smaller + // offset starts at the end of the gap and ends at the end of the fold; + // with fold = 1, it runs from the start of the gap to the beginning of the + // fold. + // + // So in order to determine the DST boundaries we need to know both the + // fold and whether DST is positive or negative (rare), and it turns out + // that this boils down to fold XOR is_positive. + if (fold == (rule->dst_diff >= 0)) { + end -= rule->dst_diff; + } + else { + start += rule->dst_diff; + } + + if (start < end) { + isdst = (ts >= start) && (ts < end); + } + else { + isdst = (ts < end) || (ts >= start); + } + + if (isdst) { + return &(rule->dst); + } + else { + return &(rule->std); + } +} + +/* Calculate the ttinfo and fold that applies for a _tzrule at an epoch time. + * + * This function can determine the _ttinfo that applies at a given epoch time, + * (analogous to trans_list_utc), and whether or not the datetime is in a fold. + * This is to be used in the .fromutc() function. + * + * The year is technically a redundant parameter, because it can be calculated + * from the timestamp, but all callers of this function should have the year + * in the datetime struct anyway, so taking it as a parameter saves unnecessary + * calculation. + **/ +static _ttinfo * +find_tzrule_ttinfo_fromutc(_tzrule *rule, int64_t ts, int year, + unsigned char *fold) +{ + if (rule->std_only) { + *fold = 0; + return &(rule->std); + } + + int64_t start, end; + uint8_t isdst; + tzrule_transitions(rule, year, &start, &end); + start -= rule->std.utcoff_seconds; + end -= rule->dst.utcoff_seconds; + + if (start < end) { + isdst = (ts >= start) && (ts < end); + } + else { + isdst = (ts < end) || (ts >= start); + } + + // For positive DST, the ambiguous period is one dst_diff after the end of + // DST; for negative DST, the ambiguous period is one dst_diff before the + // start of DST. + int64_t ambig_start, ambig_end; + if (rule->dst_diff > 0) { + ambig_start = end; + ambig_end = end + rule->dst_diff; + } + else { + ambig_start = start; + ambig_end = start - rule->dst_diff; + } + + *fold = (ts >= ambig_start) && (ts < ambig_end); + + if (isdst) { + return &(rule->dst); + } + else { + return &(rule->std); + } +} + +/* Parse a TZ string in the format specified by the POSIX standard: + * + * std offset[dst[offset],start[/time],end[/time]] + * + * std and dst must be 3 or more characters long and must not contain a + * leading colon, embedded digits, commas, nor a plus or minus signs; The + * spaces between "std" and "offset" are only for display and are not actually + * present in the string. + * + * The format of the offset is ``[+|-]hh[:mm[:ss]]`` + * + * See the POSIX.1 spec: IEE Std 1003.1-2018 §8.3: + * + * https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html + */ +static int +parse_tz_str(PyObject *tz_str_obj, _tzrule *out) +{ + PyObject *std_abbr = NULL; + PyObject *dst_abbr = NULL; + TransitionRuleType *start = NULL; + TransitionRuleType *end = NULL; + // Initialize offsets to invalid value (> 24 hours) + long std_offset = 1 << 20; + long dst_offset = 1 << 20; + + char *tz_str = PyBytes_AsString(tz_str_obj); + if (tz_str == NULL) { + return -1; + } + char *p = tz_str; + + // Read the `std` abbreviation, which must be at least 3 characters long. + Py_ssize_t num_chars = parse_abbr(p, &std_abbr); + if (num_chars < 1) { + PyErr_Format(PyExc_ValueError, "Invalid STD format in %R", tz_str_obj); + goto error; + } + + p += num_chars; + + // Now read the STD offset, which is required + num_chars = parse_tz_delta(p, &std_offset); + if (num_chars < 0) { + PyErr_Format(PyExc_ValueError, "Invalid STD offset in %R", tz_str_obj); + goto error; + } + p += num_chars; + + // If the string ends here, there is no DST, otherwise we must parse the + // DST abbreviation and start and end dates and times. + if (*p == '\0') { + goto complete; + } + + num_chars = parse_abbr(p, &dst_abbr); + if (num_chars < 1) { + PyErr_Format(PyExc_ValueError, "Invalid DST format in %R", tz_str_obj); + goto error; + } + p += num_chars; + + if (*p == ',') { + // From the POSIX standard: + // + // If no offset follows dst, the alternative time is assumed to be one + // hour ahead of standard time. + dst_offset = std_offset + 3600; + } + else { + num_chars = parse_tz_delta(p, &dst_offset); + if (num_chars < 0) { + PyErr_Format(PyExc_ValueError, "Invalid DST offset in %R", + tz_str_obj); + goto error; + } + + p += num_chars; + } + + TransitionRuleType **transitions[2] = {&start, &end}; + for (size_t i = 0; i < 2; ++i) { + if (*p != ',') { + PyErr_Format(PyExc_ValueError, + "Missing transition rules in TZ string: %R", + tz_str_obj); + goto error; + } + p++; + + num_chars = parse_transition_rule(p, transitions[i]); + if (num_chars < 0) { + PyErr_Format(PyExc_ValueError, + "Malformed transition rule in TZ string: %R", + tz_str_obj); + goto error; + } + p += num_chars; + } + + if (*p != '\0') { + PyErr_Format(PyExc_ValueError, + "Extraneous characters at end of TZ string: %R", + tz_str_obj); + goto error; + } + +complete: + build_tzrule(std_abbr, dst_abbr, std_offset, dst_offset, start, end, out); + Py_DECREF(std_abbr); + Py_XDECREF(dst_abbr); + + return 0; +error: + Py_XDECREF(std_abbr); + if (dst_abbr != NULL && dst_abbr != Py_None) { + Py_DECREF(dst_abbr); + } + + if (start != NULL) { + PyMem_Free(start); + } + + if (end != NULL) { + PyMem_Free(end); + } + + return -1; +} + +static int +parse_uint(const char *const p, uint8_t *value) +{ + if (!isdigit(*p)) { + return -1; + } + + *value = (*p) - '0'; + return 0; +} + +/* Parse the STD and DST abbreviations from a TZ string. */ +static Py_ssize_t +parse_abbr(const char *const p, PyObject **abbr) +{ + const char *ptr = p; + char buff = *ptr; + const char *str_start; + const char *str_end; + + if (*ptr == '<') { + ptr++; + str_start = ptr; + while ((buff = *ptr) != '>') { + // From the POSIX standard: + // + // In the quoted form, the first character shall be the less-than + // ( '<' ) character and the last character shall be the + // greater-than ( '>' ) character. All characters between these + // quoting characters shall be alphanumeric characters from the + // portable character set in the current locale, the plus-sign ( + // '+' ) character, or the minus-sign ( '-' ) character. The std + // and dst fields in this case shall not include the quoting + // characters. + if (!isalpha(buff) && !isdigit(buff) && buff != '+' && + buff != '-') { + return -1; + } + ptr++; + } + str_end = ptr; + ptr++; + } + else { + str_start = p; + // From the POSIX standard: + // + // In the unquoted form, all characters in these fields shall be + // alphabetic characters from the portable character set in the + // current locale. + while (isalpha(*ptr)) { + ptr++; + } + str_end = ptr; + } + + *abbr = PyUnicode_FromStringAndSize(str_start, str_end - str_start); + if (*abbr == NULL) { + return -1; + } + + return ptr - p; +} + +/* Parse a UTC offset from a TZ str. */ +static Py_ssize_t +parse_tz_delta(const char *const p, long *total_seconds) +{ + // From the POSIX spec: + // + // Indicates the value added to the local time to arrive at Coordinated + // Universal Time. The offset has the form: + // + // hh[:mm[:ss]] + // + // One or more digits may be used; the value is always interpreted as a + // decimal number. + // + // The POSIX spec says that the values for `hour` must be between 0 and 24 + // hours, but RFC 8536 §3.3.1 specifies that the hours part of the + // transition times may be signed and range from -167 to 167. + long sign = -1; + long hours = 0; + long minutes = 0; + long seconds = 0; + + const char *ptr = p; + char buff = *ptr; + if (buff == '-' || buff == '+') { + // Negative numbers correspond to *positive* offsets, from the spec: + // + // If preceded by a '-', the timezone shall be east of the Prime + // Meridian; otherwise, it shall be west (which may be indicated by + // an optional preceding '+' ). + if (buff == '-') { + sign = 1; + } + + ptr++; + } + + // The hour can be 1 or 2 numeric characters + for (size_t i = 0; i < 2; ++i) { + buff = *ptr; + if (!isdigit(buff)) { + if (i == 0) { + return -1; + } + else { + break; + } + } + + hours *= 10; + hours += buff - '0'; + ptr++; + } + + if (hours > 24 || hours < 0) { + return -1; + } + + // Minutes and seconds always of the format ":dd" + long *outputs[2] = {&minutes, &seconds}; + for (size_t i = 0; i < 2; ++i) { + if (*ptr != ':') { + goto complete; + } + ptr++; + + for (size_t j = 0; j < 2; ++j) { + buff = *ptr; + if (!isdigit(buff)) { + return -1; + } + *(outputs[i]) *= 10; + *(outputs[i]) += buff - '0'; + ptr++; + } + } + +complete: + *total_seconds = sign * ((hours * 3600) + (minutes * 60) + seconds); + + return ptr - p; +} + +/* Parse the date portion of a transition rule. */ +static Py_ssize_t +parse_transition_rule(const char *const p, TransitionRuleType **out) +{ + // The full transition rule indicates when to change back and forth between + // STD and DST, and has the form: + // + // date[/time],date[/time] + // + // This function parses an individual date[/time] section, and returns + // the number of characters that contributed to the transition rule. This + // does not include the ',' at the end of the first rule. + // + // The POSIX spec states that if *time* is not given, the default is 02:00. + const char *ptr = p; + int8_t hour = 2; + int8_t minute = 0; + int8_t second = 0; + + // Rules come in one of three flavors: + // + // 1. Jn: Julian day n, with no leap days. + // 2. n: Day of year (0-based, with leap days) + // 3. Mm.n.d: Specifying by month, week and day-of-week. + + if (*ptr == 'M') { + uint8_t month, week, day; + ptr++; + if (parse_uint(ptr, &month)) { + return -1; + } + ptr++; + if (*ptr != '.') { + uint8_t tmp; + if (parse_uint(ptr, &tmp)) { + return -1; + } + + month *= 10; + month += tmp; + ptr++; + } + + uint8_t *values[2] = {&week, &day}; + for (size_t i = 0; i < 2; ++i) { + if (*ptr != '.') { + return -1; + } + ptr++; + + if (parse_uint(ptr, values[i])) { + return -1; + } + ptr++; + } + + if (*ptr == '/') { + ptr++; + Py_ssize_t num_chars = + parse_transition_time(ptr, &hour, &minute, &second); + if (num_chars < 0) { + return -1; + } + ptr += num_chars; + } + + CalendarRule *rv = PyMem_Calloc(1, sizeof(CalendarRule)); + if (rv == NULL) { + return -1; + } + + if (calendarrule_new(month, week, day, hour, minute, second, rv)) { + PyMem_Free(rv); + return -1; + } + + *out = (TransitionRuleType *)rv; + } + else { + uint8_t julian = 0; + unsigned int day = 0; + if (*ptr == 'J') { + julian = 1; + ptr++; + } + + for (size_t i = 0; i < 3; ++i) { + if (!isdigit(*ptr)) { + if (i == 0) { + return -1; + } + break; + } + day *= 10; + day += (*ptr) - '0'; + ptr++; + } + + if (*ptr == '/') { + ptr++; + Py_ssize_t num_chars = + parse_transition_time(ptr, &hour, &minute, &second); + if (num_chars < 0) { + return -1; + } + ptr += num_chars; + } + + DayRule *rv = PyMem_Calloc(1, sizeof(DayRule)); + if (rv == NULL) { + return -1; + } + + if (dayrule_new(julian, day, hour, minute, second, rv)) { + PyMem_Free(rv); + return -1; + } + *out = (TransitionRuleType *)rv; + } + + return ptr - p; +} + +/* Parse the time portion of a transition rule (e.g. following an /) */ +static Py_ssize_t +parse_transition_time(const char *const p, int8_t *hour, int8_t *minute, + int8_t *second) +{ + // From the spec: + // + // The time has the same format as offset except that no leading sign + // ( '-' or '+' ) is allowed. + // + // The format for the offset is: + // + // h[h][:mm[:ss]] + // + // RFC 8536 also allows transition times to be signed and to range from + // -167 to +167, but the current version only supports [0, 99]. + // + // TODO: Support the full range of transition hours. + int8_t *components[3] = {hour, minute, second}; + const char *ptr = p; + int8_t sign = 1; + + if (*ptr == '-' || *ptr == '+') { + if (*ptr == '-') { + sign = -1; + } + ptr++; + } + + for (size_t i = 0; i < 3; ++i) { + if (i > 0) { + if (*ptr != ':') { + break; + } + ptr++; + } + + uint8_t buff = 0; + for (size_t j = 0; j < 2; j++) { + if (!isdigit(*ptr)) { + if (i == 0 && j > 0) { + break; + } + return -1; + } + + buff *= 10; + buff += (*ptr) - '0'; + ptr++; + } + + *(components[i]) = sign * buff; + } + + return ptr - p; +} + +/* Constructor for a _tzrule. + * + * If `dst_abbr` is NULL, this will construct an "STD-only" _tzrule, in which + * case `dst_offset` will be ignored and `start` and `end` are expected to be + * NULL as well. + * + * Returns 0 on success. + */ +static int +build_tzrule(PyObject *std_abbr, PyObject *dst_abbr, long std_offset, + long dst_offset, TransitionRuleType *start, + TransitionRuleType *end, _tzrule *out) +{ + _tzrule rv = {{0}}; + + rv.start = start; + rv.end = end; + + if (build_ttinfo(std_offset, 0, std_abbr, &rv.std)) { + goto error; + } + + if (dst_abbr != NULL) { + rv.dst_diff = dst_offset - std_offset; + if (build_ttinfo(dst_offset, rv.dst_diff, dst_abbr, &rv.dst)) { + goto error; + } + } + else { + rv.std_only = 1; + } + + *out = rv; + + return 0; +error: + xdecref_ttinfo(&rv.std); + xdecref_ttinfo(&rv.dst); + return -1; +} + +/* Destructor for _tzrule. */ +static void +free_tzrule(_tzrule *tzrule) +{ + xdecref_ttinfo(&(tzrule->std)); + if (!tzrule->std_only) { + xdecref_ttinfo(&(tzrule->dst)); + } + + if (tzrule->start != NULL) { + PyMem_Free(tzrule->start); + } + + if (tzrule->end != NULL) { + PyMem_Free(tzrule->end); + } +} + +/* Calculate DST offsets from transitions and UTC offsets + * + * This is necessary because each C `ttinfo` only contains the UTC offset, + * time zone abbreviation and an isdst boolean - it does not include the + * amount of the DST offset, but we need the amount for the dst() function. + * + * Thus function uses heuristics to infer what the offset should be, so it + * is not guaranteed that this will work for all zones. If we cannot assign + * a value for a given DST offset, we'll assume it's 1H rather than 0H, so + * bool(dt.dst()) will always match ttinfo.isdst. + */ +static void +utcoff_to_dstoff(size_t *trans_idx, long *utcoffs, long *dstoffs, + unsigned char *isdsts, size_t num_transitions, + size_t num_ttinfos) +{ + size_t dst_count = 0; + size_t dst_found = 0; + for (size_t i = 0; i < num_ttinfos; ++i) { + dst_count++; + } + + for (size_t i = 1; i < num_transitions; ++i) { + if (dst_count == dst_found) { + break; + } + + size_t idx = trans_idx[i]; + size_t comp_idx = trans_idx[i - 1]; + + // Only look at DST offsets that have nto been assigned already + if (!isdsts[idx] || dstoffs[idx] != 0) { + continue; + } + + long dstoff = 0; + long utcoff = utcoffs[idx]; + + if (!isdsts[comp_idx]) { + dstoff = utcoff - utcoffs[comp_idx]; + } + + if (!dstoff && idx < (num_ttinfos - 1)) { + comp_idx = trans_idx[i + 1]; + + // If the following transition is also DST and we couldn't find + // the DST offset by this point, we're going to have to skip it + // and hope this transition gets assigned later + if (isdsts[comp_idx]) { + continue; + } + + dstoff = utcoff - utcoffs[comp_idx]; + } + + if (dstoff) { + dst_found++; + dstoffs[idx] = dstoff; + } + } + + if (dst_found < dst_count) { + // If there are time zones we didn't find a value for, we'll end up + // with dstoff = 0 for something where isdst=1. This is obviously + // wrong — one hour will be a much better guess than 0. + for (size_t idx = 0; idx < num_ttinfos; ++idx) { + if (isdsts[idx] && !dstoffs[idx]) { + dstoffs[idx] = 3600; + } + } + } +} + +#define _swap(x, y, buffer) \ + buffer = x; \ + x = y; \ + y = buffer; + +/* Calculate transitions in local time from UTC time and offsets. + * + * We want to know when each transition occurs, denominated in the number of + * nominal wall-time seconds between 1970-01-01T00:00:00 and the transition in + * *local time* (note: this is *not* equivalent to the output of + * datetime.timestamp, which is the total number of seconds actual elapsed + * since 1970-01-01T00:00:00Z in UTC). + * + * This is an ambiguous question because "local time" can be ambiguous — but it + * is disambiguated by the `fold` parameter, so we allocate two arrays: + * + * trans_local[0]: The wall-time transitions for fold=0 + * trans_local[1]: The wall-time transitions for fold=1 + * + * This returns 0 on success and a negative number of failure. The trans_local + * arrays must be freed if they are not NULL. + */ +static int +ts_to_local(size_t *trans_idx, int64_t *trans_utc, long *utcoff, + int64_t *trans_local[2], size_t num_ttinfos, + size_t num_transitions) +{ + if (num_transitions == 0) { + return 0; + } + + // Copy the UTC transitions into each array to be modified in place later + for (size_t i = 0; i < 2; ++i) { + trans_local[i] = PyMem_Malloc(num_transitions * sizeof(int64_t)); + if (trans_local[i] == NULL) { + return -1; + } + + memcpy(trans_local[i], trans_utc, num_transitions * sizeof(int64_t)); + } + + int64_t offset_0, offset_1, buff; + if (num_ttinfos > 1) { + offset_0 = utcoff[0]; + offset_1 = utcoff[trans_idx[0]]; + + if (offset_1 > offset_0) { + _swap(offset_0, offset_1, buff); + } + } + else { + offset_0 = utcoff[0]; + offset_1 = utcoff[0]; + } + + trans_local[0][0] += offset_0; + trans_local[1][0] += offset_1; + + for (size_t i = 1; i < num_transitions; ++i) { + offset_0 = utcoff[trans_idx[i - 1]]; + offset_1 = utcoff[trans_idx[i]]; + + if (offset_1 > offset_0) { + _swap(offset_1, offset_0, buff); + } + + trans_local[0][i] += offset_0; + trans_local[1][i] += offset_1; + } + + return 0; +} + +/* Simple bisect_right binary search implementation */ +static size_t +_bisect(const int64_t value, const int64_t *arr, size_t size) +{ + size_t lo = 0; + size_t hi = size; + size_t m; + + while (lo < hi) { + m = (lo + hi) / 2; + if (arr[m] > value) { + hi = m; + } + else { + lo = m + 1; + } + } + + return hi; +} + +/* Find the ttinfo rules that apply at a given local datetime. */ +static _ttinfo * +find_ttinfo(PyZoneInfo_ZoneInfo *self, PyObject *dt) +{ + // datetime.time has a .tzinfo attribute that passes None as the dt + // argument; it only really has meaning for fixed-offset zones. + if (dt == Py_None) { + if (self->fixed_offset) { + return &(self->tzrule_after.std); + } + else { + return &NO_TTINFO; + } + } + + int64_t ts; + if (get_local_timestamp(dt, &ts)) { + return NULL; + } + + unsigned char fold = PyDateTime_DATE_GET_FOLD(dt); + assert(fold < 2); + int64_t *local_transitions = self->trans_list_wall[fold]; + size_t num_trans = self->num_transitions; + + if (num_trans && ts < local_transitions[0]) { + return self->ttinfo_before; + } + else if (!num_trans || ts > local_transitions[self->num_transitions - 1]) { + return find_tzrule_ttinfo(&(self->tzrule_after), ts, fold, + PyDateTime_GET_YEAR(dt)); + } + else { + size_t idx = _bisect(ts, local_transitions, self->num_transitions) - 1; + assert(idx < self->num_transitions); + return self->trans_ttinfos[idx]; + } +} + +static int +is_leap_year(int year) +{ + const unsigned int ayear = (unsigned int)year; + return ayear % 4 == 0 && (ayear % 100 != 0 || ayear % 400 == 0); +} + +/* Calculates ordinal datetime from year, month and day. */ +static int +ymd_to_ord(int y, int m, int d) +{ + y -= 1; + int days_before_year = (y * 365) + (y / 4) - (y / 100) + (y / 400); + int yearday = DAYS_BEFORE_MONTH[m]; + if (m > 2 && is_leap_year(y + 1)) { + yearday += 1; + } + + return days_before_year + yearday + d; +} + +/* Calculate the number of seconds since 1970-01-01 in local time. + * + * This gets a datetime in the same "units" as self->trans_list_wall so that we + * can easily determine which transitions a datetime falls between. See the + * comment above ts_to_local for more information. + * */ +static int +get_local_timestamp(PyObject *dt, int64_t *local_ts) +{ + assert(local_ts != NULL); + + int hour, minute, second; + int ord; + if (PyDateTime_CheckExact(dt)) { + int y = PyDateTime_GET_YEAR(dt); + int m = PyDateTime_GET_MONTH(dt); + int d = PyDateTime_GET_DAY(dt); + hour = PyDateTime_DATE_GET_HOUR(dt); + minute = PyDateTime_DATE_GET_MINUTE(dt); + second = PyDateTime_DATE_GET_SECOND(dt); + + ord = ymd_to_ord(y, m, d); + } + else { + PyObject *num = PyObject_CallMethod(dt, "toordinal", NULL); + if (num == NULL) { + return -1; + } + + ord = PyLong_AsLong(num); + Py_DECREF(num); + if (ord == -1 && PyErr_Occurred()) { + return -1; + } + + num = PyObject_GetAttrString(dt, "hour"); + if (num == NULL) { + return -1; + } + hour = PyLong_AsLong(num); + Py_DECREF(num); + if (hour == -1) { + return -1; + } + + num = PyObject_GetAttrString(dt, "minute"); + if (num == NULL) { + return -1; + } + minute = PyLong_AsLong(num); + Py_DECREF(num); + if (minute == -1) { + return -1; + } + + num = PyObject_GetAttrString(dt, "second"); + if (num == NULL) { + return -1; + } + second = PyLong_AsLong(num); + Py_DECREF(num); + if (second == -1) { + return -1; + } + } + + *local_ts = (int64_t)(ord - EPOCHORDINAL) * 86400 + + (int64_t)(hour * 3600 + minute * 60 + second); + + return 0; +} + +///// +// Functions for cache handling + +/* Constructor for StrongCacheNode */ +static StrongCacheNode * +strong_cache_node_new(PyObject *key, PyObject *zone) +{ + StrongCacheNode *node = PyMem_Malloc(sizeof(StrongCacheNode)); + if (node == NULL) { + return NULL; + } + + Py_INCREF(key); + Py_INCREF(zone); + + node->next = NULL; + node->prev = NULL; + node->key = key; + node->zone = zone; + + return node; +} + +/* Destructor for StrongCacheNode */ +void +strong_cache_node_free(StrongCacheNode *node) +{ + Py_XDECREF(node->key); + Py_XDECREF(node->zone); + + PyMem_Free(node); +} + +/* Frees all nodes at or after a specified root in the strong cache. + * + * This can be used on the root node to free the entire cache or it can be used + * to clear all nodes that have been expired (which, if everything is going + * right, will actually only be 1 node at a time). + */ +void +strong_cache_free(StrongCacheNode *root) +{ + StrongCacheNode *node = root; + StrongCacheNode *next_node; + while (node != NULL) { + next_node = node->next; + strong_cache_node_free(node); + + node = next_node; + } +} + +/* Removes a node from the cache and update its neighbors. + * + * This is used both when ejecting a node from the cache and when moving it to + * the front of the cache. + */ +static void +remove_from_strong_cache(StrongCacheNode *node) +{ + if (ZONEINFO_STRONG_CACHE == node) { + ZONEINFO_STRONG_CACHE = node->next; + } + + if (node->prev != NULL) { + node->prev->next = node->next; + } + + if (node->next != NULL) { + node->next->prev = node->prev; + } + + node->next = NULL; + node->prev = NULL; +} + +/* Retrieves the node associated with a key, if it exists. + * + * This traverses the strong cache until it finds a matching key and returns a + * pointer to the relevant node if found. Returns NULL if no node is found. + * + * root may be NULL, indicating an empty cache. + */ +static StrongCacheNode * +find_in_strong_cache(const StrongCacheNode *const root, PyObject *const key) +{ + const StrongCacheNode *node = root; + while (node != NULL) { + int rv = PyObject_RichCompareBool(key, node->key, Py_EQ); + if (rv < 0) { + return NULL; + } + if (rv) { + return (StrongCacheNode *)node; + } + + node = node->next; + } + + return NULL; +} + +/* Ejects a given key from the class's strong cache, if applicable. + * + * This function is used to enable the per-key functionality in clear_cache. + */ +static int +eject_from_strong_cache(const PyTypeObject *const type, PyObject *key) +{ + if (type != &PyZoneInfo_ZoneInfoType) { + return 0; + } + + StrongCacheNode *node = find_in_strong_cache(ZONEINFO_STRONG_CACHE, key); + if (node != NULL) { + remove_from_strong_cache(node); + + strong_cache_node_free(node); + } + else if (PyErr_Occurred()) { + return -1; + } + return 0; +} + +/* Moves a node to the front of the LRU cache. + * + * The strong cache is an LRU cache, so whenever a given node is accessed, if + * it is not at the front of the cache, it needs to be moved there. + */ +static void +move_strong_cache_node_to_front(StrongCacheNode **root, StrongCacheNode *node) +{ + StrongCacheNode *root_p = *root; + if (root_p == node) { + return; + } + + remove_from_strong_cache(node); + + node->prev = NULL; + node->next = root_p; + + if (root_p != NULL) { + root_p->prev = node; + } + + *root = node; +} + +/* Retrieves a ZoneInfo from the strong cache if it's present. + * + * This function finds the ZoneInfo by key and if found will move the node to + * the front of the LRU cache and return a new reference to it. It returns NULL + * if the key is not in the cache. + * + * The strong cache is currently only implemented for the base class, so this + * always returns a cache miss for subclasses. + */ +static PyObject * +zone_from_strong_cache(const PyTypeObject *const type, PyObject *const key) +{ + if (type != &PyZoneInfo_ZoneInfoType) { + return NULL; // Strong cache currently only implemented for base class + } + + StrongCacheNode *node = find_in_strong_cache(ZONEINFO_STRONG_CACHE, key); + + if (node != NULL) { + move_strong_cache_node_to_front(&ZONEINFO_STRONG_CACHE, node); + Py_INCREF(node->zone); + return node->zone; + } + + return NULL; // Cache miss +} + +/* Inserts a new key into the strong LRU cache. + * + * This function is only to be used after a cache miss — it creates a new node + * at the front of the cache and ejects any stale entries (keeping the size of + * the cache to at most ZONEINFO_STRONG_CACHE_MAX_SIZE). + */ +static void +update_strong_cache(const PyTypeObject *const type, PyObject *key, + PyObject *zone) +{ + if (type != &PyZoneInfo_ZoneInfoType) { + return; + } + + StrongCacheNode *new_node = strong_cache_node_new(key, zone); + + move_strong_cache_node_to_front(&ZONEINFO_STRONG_CACHE, new_node); + + StrongCacheNode *node = new_node->next; + for (size_t i = 1; i < ZONEINFO_STRONG_CACHE_MAX_SIZE; ++i) { + if (node == NULL) { + return; + } + node = node->next; + } + + // Everything beyond this point needs to be freed + if (node != NULL) { + if (node->prev != NULL) { + node->prev->next = NULL; + } + strong_cache_free(node); + } +} + +/* Clears all entries into a type's strong cache. + * + * Because the strong cache is not implemented for subclasses, this is a no-op + * for everything except the base class. + */ +void +clear_strong_cache(const PyTypeObject *const type) +{ + if (type != &PyZoneInfo_ZoneInfoType) { + return; + } + + strong_cache_free(ZONEINFO_STRONG_CACHE); + ZONEINFO_STRONG_CACHE = NULL; +} + +static PyObject * +new_weak_cache(void) +{ + PyObject *weakref_module = PyImport_ImportModule("weakref"); + if (weakref_module == NULL) { + return NULL; + } + + PyObject *weak_cache = + PyObject_CallMethod(weakref_module, "WeakValueDictionary", ""); + Py_DECREF(weakref_module); + return weak_cache; +} + +static int +initialize_caches(void) +{ + // TODO: Move to a PyModule_GetState / PEP 573 based caching system. + if (TIMEDELTA_CACHE == NULL) { + TIMEDELTA_CACHE = PyDict_New(); + } + else { + Py_INCREF(TIMEDELTA_CACHE); + } + + if (TIMEDELTA_CACHE == NULL) { + return -1; + } + + if (ZONEINFO_WEAK_CACHE == NULL) { + ZONEINFO_WEAK_CACHE = new_weak_cache(); + } + else { + Py_INCREF(ZONEINFO_WEAK_CACHE); + } + + if (ZONEINFO_WEAK_CACHE == NULL) { + return -1; + } + + return 0; +} + +static PyObject * +zoneinfo_init_subclass(PyTypeObject *cls, PyObject *args, PyObject **kwargs) +{ + PyObject *weak_cache = new_weak_cache(); + if (weak_cache == NULL) { + return NULL; + } + + if (PyObject_SetAttrString((PyObject *)cls, "_weak_cache", + weak_cache) < 0) { + Py_DECREF(weak_cache); + return NULL; + } + Py_DECREF(weak_cache); + Py_RETURN_NONE; +} + +///// +// Specify the ZoneInfo type +static PyMethodDef zoneinfo_methods[] = { + {"clear_cache", (PyCFunction)(void (*)(void))zoneinfo_clear_cache, + METH_VARARGS | METH_KEYWORDS | METH_CLASS, + PyDoc_STR("Clear the ZoneInfo cache.")}, + {"no_cache", (PyCFunction)(void (*)(void))zoneinfo_no_cache, + METH_VARARGS | METH_KEYWORDS | METH_CLASS, + PyDoc_STR("Get a new instance of ZoneInfo, bypassing the cache.")}, + {"from_file", (PyCFunction)(void (*)(void))zoneinfo_from_file, + METH_VARARGS | METH_KEYWORDS | METH_CLASS, + PyDoc_STR("Create a ZoneInfo file from a file object.")}, + {"utcoffset", (PyCFunction)zoneinfo_utcoffset, METH_O, + PyDoc_STR("Retrieve a timedelta representing the UTC offset in a zone at " + "the given datetime.")}, + {"dst", (PyCFunction)zoneinfo_dst, METH_O, + PyDoc_STR("Retrieve a timedelta representing the amount of DST applied " + "in a zone at the given datetime.")}, + {"tzname", (PyCFunction)zoneinfo_tzname, METH_O, + PyDoc_STR("Retrieve a string containing the abbreviation for the time " + "zone that applies in a zone at a given datetime.")}, + {"fromutc", (PyCFunction)zoneinfo_fromutc, METH_O, + PyDoc_STR("Given a datetime with local time in UTC, retrieve an adjusted " + "datetime in local time.")}, + {"__reduce__", (PyCFunction)zoneinfo_reduce, METH_NOARGS, + PyDoc_STR("Function for serialization with the pickle protocol.")}, + {"_unpickle", (PyCFunction)zoneinfo__unpickle, METH_VARARGS | METH_CLASS, + PyDoc_STR("Private method used in unpickling.")}, + {"__init_subclass__", (PyCFunction)(void (*)(void))zoneinfo_init_subclass, + METH_VARARGS | METH_KEYWORDS | METH_CLASS, + PyDoc_STR("Function to initialize subclasses.")}, + {NULL} /* Sentinel */ +}; + +static PyMemberDef zoneinfo_members[] = { + {.name = "key", + .offset = offsetof(PyZoneInfo_ZoneInfo, key), + .type = T_OBJECT_EX, + .flags = READONLY, + .doc = NULL}, + {NULL}, /* Sentinel */ +}; + +static PyTypeObject PyZoneInfo_ZoneInfoType = { + PyVarObject_HEAD_INIT(NULL, 0) // + .tp_name = "zoneinfo.ZoneInfo", + .tp_basicsize = sizeof(PyZoneInfo_ZoneInfo), + .tp_weaklistoffset = offsetof(PyZoneInfo_ZoneInfo, weakreflist), + .tp_repr = (reprfunc)zoneinfo_repr, + .tp_str = (reprfunc)zoneinfo_str, + .tp_getattro = PyObject_GenericGetAttr, + .tp_flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE), + /* .tp_doc = zoneinfo_doc, */ + .tp_methods = zoneinfo_methods, + .tp_members = zoneinfo_members, + .tp_new = zoneinfo_new, + .tp_dealloc = zoneinfo_dealloc, +}; + +///// +// Specify the _zoneinfo module +static PyMethodDef module_methods[] = {{NULL, NULL}}; +static void +module_free() +{ + Py_XDECREF(_tzpath_find_tzfile); + _tzpath_find_tzfile = NULL; + + Py_XDECREF(_common_mod); + _common_mod = NULL; + + Py_XDECREF(io_open); + io_open = NULL; + + xdecref_ttinfo(&NO_TTINFO); + + if (TIMEDELTA_CACHE != NULL && Py_REFCNT(TIMEDELTA_CACHE) > 1) { + Py_DECREF(TIMEDELTA_CACHE); + } else { + Py_CLEAR(TIMEDELTA_CACHE); + } + + if (ZONEINFO_WEAK_CACHE != NULL && Py_REFCNT(ZONEINFO_WEAK_CACHE) > 1) { + Py_DECREF(ZONEINFO_WEAK_CACHE); + } else { + Py_CLEAR(ZONEINFO_WEAK_CACHE); + } + + clear_strong_cache(&PyZoneInfo_ZoneInfoType); +} + +static int +zoneinfomodule_exec(PyObject *m) +{ + PyDateTime_IMPORT; + if (PyDateTimeAPI == NULL) { + goto error; + } + PyZoneInfo_ZoneInfoType.tp_base = PyDateTimeAPI->TZInfoType; + if (PyType_Ready(&PyZoneInfo_ZoneInfoType) < 0) { + goto error; + } + + Py_INCREF(&PyZoneInfo_ZoneInfoType); + PyModule_AddObject(m, "ZoneInfo", (PyObject *)&PyZoneInfo_ZoneInfoType); + + /* Populate imports */ + PyObject *_tzpath_module = PyImport_ImportModule("zoneinfo._tzpath"); + if (_tzpath_module == NULL) { + goto error; + } + + _tzpath_find_tzfile = + PyObject_GetAttrString(_tzpath_module, "find_tzfile"); + Py_DECREF(_tzpath_module); + if (_tzpath_find_tzfile == NULL) { + goto error; + } + + PyObject *io_module = PyImport_ImportModule("io"); + if (io_module == NULL) { + goto error; + } + + io_open = PyObject_GetAttrString(io_module, "open"); + Py_DECREF(io_module); + if (io_open == NULL) { + goto error; + } + + _common_mod = PyImport_ImportModule("zoneinfo._common"); + if (_common_mod == NULL) { + goto error; + } + + if (NO_TTINFO.utcoff == NULL) { + NO_TTINFO.utcoff = Py_None; + NO_TTINFO.dstoff = Py_None; + NO_TTINFO.tzname = Py_None; + + for (size_t i = 0; i < 3; ++i) { + Py_INCREF(Py_None); + } + } + + if (initialize_caches()) { + goto error; + } + + return 0; + +error: + return -1; +} + +static PyModuleDef_Slot zoneinfomodule_slots[] = { + {Py_mod_exec, zoneinfomodule_exec}, {0, NULL}}; + +static struct PyModuleDef zoneinfomodule = { + PyModuleDef_HEAD_INIT, + .m_name = "_zoneinfo", + .m_doc = "C implementation of the zoneinfo module", + .m_size = 0, + .m_methods = module_methods, + .m_slots = zoneinfomodule_slots, + .m_free = (freefunc)module_free}; + +PyMODINIT_FUNC +PyInit__zoneinfo(void) +{ + return PyModuleDef_Init(&zoneinfomodule); +} diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index abcdd1e8a6e53e77f81e05d472698b597e38f81d..724c503eba289b3cb995859c2c21acb755e07fa5 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -5,7 +5,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" +#include // offsetof() #ifdef STDC_HEADERS #include @@ -43,7 +43,7 @@ typedef struct arrayobject { Py_ssize_t allocated; const struct arraydescr *ob_descr; PyObject *weakreflist; /* List of weak references */ - int ob_exports; /* Number of exported buffers */ + Py_ssize_t ob_exports; /* Number of exported buffers */ } arrayobject; static PyTypeObject Arraytype; @@ -106,7 +106,7 @@ enum machine_format_code { #include "clinic/arraymodule.c.h" #define array_Check(op) PyObject_TypeCheck(op, &Arraytype) -#define array_CheckExact(op) (Py_TYPE(op) == &Arraytype) +#define array_CheckExact(op) Py_IS_TYPE(op, &Arraytype) static int array_resize(arrayobject *self, Py_ssize_t newsize) @@ -128,14 +128,14 @@ array_resize(arrayobject *self, Py_ssize_t newsize) if (self->allocated >= newsize && Py_SIZE(self) < newsize + 16 && self->ob_item != NULL) { - Py_SIZE(self) = newsize; + Py_SET_SIZE(self, newsize); return 0; } if (newsize == 0) { PyMem_FREE(self->ob_item); self->ob_item = NULL; - Py_SIZE(self) = 0; + Py_SET_SIZE(self, 0); self->allocated = 0; return 0; } @@ -165,7 +165,7 @@ array_resize(arrayobject *self, Py_ssize_t newsize) return -1; } self->ob_item = items; - Py_SIZE(self) = newsize; + Py_SET_SIZE(self, newsize); self->allocated = _new_size; return 0; } @@ -185,9 +185,7 @@ in bounds; that's the responsibility of the caller. static PyObject * b_getitem(arrayobject *ap, Py_ssize_t i) { - long x = ((char *)ap->ob_item)[i]; - if (x >= 128) - x -= 256; + long x = ((signed char *)ap->ob_item)[i]; return PyLong_FromLong(x); } @@ -237,24 +235,31 @@ BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) static PyObject * u_getitem(arrayobject *ap, Py_ssize_t i) { - return PyUnicode_FromOrdinal(((Py_UNICODE *) ap->ob_item)[i]); + return PyUnicode_FromOrdinal(((wchar_t *) ap->ob_item)[i]); } static int u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) { - Py_UNICODE *p; - Py_ssize_t len; - - if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len)) + PyObject *u; + if (!PyArg_Parse(v, "U;array item must be unicode character", &u)) { return -1; - if (len != 1) { + } + + Py_ssize_t len = PyUnicode_AsWideChar(u, NULL, 0); + if (len != 2) { PyErr_SetString(PyExc_TypeError, "array item must be unicode character"); return -1; } - if (i >= 0) - ((Py_UNICODE *)ap->ob_item)[i] = p[0]; + + wchar_t w; + len = PyUnicode_AsWideChar(u, &w, 1); + assert(len == 1); + + if (i >= 0) { + ((wchar_t *)ap->ob_item)[i] = w; + } return 0; } @@ -532,7 +537,7 @@ d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) DEFINE_COMPAREITEMS(b, signed char) DEFINE_COMPAREITEMS(BB, unsigned char) -DEFINE_COMPAREITEMS(u, Py_UNICODE) +DEFINE_COMPAREITEMS(u, wchar_t) DEFINE_COMPAREITEMS(h, short) DEFINE_COMPAREITEMS(HH, unsigned short) DEFINE_COMPAREITEMS(i, int) @@ -550,7 +555,7 @@ DEFINE_COMPAREITEMS(QQ, unsigned long long) static const struct arraydescr descriptors[] = { {'b', 1, b_getitem, b_setitem, b_compareitems, "b", 1, 1}, {'B', 1, BB_getitem, BB_setitem, BB_compareitems, "B", 1, 0}, - {'u', sizeof(Py_UNICODE), u_getitem, u_setitem, u_compareitems, "u", 0, 0}, + {'u', sizeof(wchar_t), u_getitem, u_setitem, u_compareitems, "u", 0, 0}, {'h', sizeof(short), h_getitem, h_setitem, h_compareitems, "h", 1, 1}, {'H', sizeof(short), HH_getitem, HH_setitem, HH_compareitems, "H", 1, 0}, {'i', sizeof(int), i_getitem, i_setitem, i_compareitems, "i", 1, 1}, @@ -595,7 +600,7 @@ newarrayobject(PyTypeObject *type, Py_ssize_t size, const struct arraydescr *des op->ob_descr = descr; op->allocated = size; op->weakreflist = NULL; - Py_SIZE(op) = size; + Py_SET_SIZE(op, size); if (size <= 0) { op->ob_item = NULL; } @@ -1507,7 +1512,7 @@ array_array_tofile(arrayobject *self, PyObject *f) bytes = PyBytes_FromStringAndSize(ptr, size); if (bytes == NULL) return NULL; - res = _PyObject_CallMethodIdObjArgs(f, &PyId_write, bytes, NULL); + res = _PyObject_CallMethodIdOneArg(f, &PyId_write, bytes); Py_DECREF(bytes); if (res == NULL) return NULL; @@ -1625,27 +1630,6 @@ frombytes(arrayobject *self, Py_buffer *buffer) Py_RETURN_NONE; } -/*[clinic input] -array.array.fromstring - - buffer: Py_buffer(accept={str, buffer}) - / - -Appends items from the string, interpreting it as an array of machine values, as if it had been read from a file using the fromfile() method). - -This method is deprecated. Use frombytes instead. -[clinic start generated code]*/ - -static PyObject * -array_array_fromstring_impl(arrayobject *self, Py_buffer *buffer) -/*[clinic end generated code: output=31c4baa779df84ce input=a3341a512e11d773]*/ -{ - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "fromstring() is deprecated. Use frombytes() instead.", 2) != 0) - return NULL; - return frombytes(self, buffer); -} - /*[clinic input] array.array.frombytes @@ -1680,28 +1664,10 @@ array_array_tobytes_impl(arrayobject *self) } } -/*[clinic input] -array.array.tostring - -Convert the array to an array of machine values and return the bytes representation. - -This method is deprecated. Use tobytes instead. -[clinic start generated code]*/ - -static PyObject * -array_array_tostring_impl(arrayobject *self) -/*[clinic end generated code: output=7d6bd92745a2c8f3 input=b6c0ddee7b30457e]*/ -{ - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "tostring() is deprecated. Use tobytes() instead.", 2) != 0) - return NULL; - return array_array_tobytes_impl(self); -} - /*[clinic input] array.array.fromunicode - ustr: Py_UNICODE(zeroes=True) + ustr: unicode / Extends this array with data from the unicode string ustr. @@ -1712,25 +1678,28 @@ some other type. [clinic start generated code]*/ static PyObject * -array_array_fromunicode_impl(arrayobject *self, const Py_UNICODE *ustr, - Py_ssize_clean_t ustr_length) -/*[clinic end generated code: output=cf2f662908e2befc input=150f00566ffbca6e]*/ +array_array_fromunicode_impl(arrayobject *self, PyObject *ustr) +/*[clinic end generated code: output=24359f5e001a7f2b input=025db1fdade7a4ce]*/ { - char typecode; - - typecode = self->ob_descr->typecode; - if (typecode != 'u') { + if (self->ob_descr->typecode != 'u') { PyErr_SetString(PyExc_ValueError, "fromunicode() may only be called on " "unicode type arrays"); return NULL; } - if (ustr_length > 0) { + + Py_ssize_t ustr_length = PyUnicode_AsWideChar(ustr, NULL, 0); + assert(ustr_length > 0); + if (ustr_length > 1) { + ustr_length--; /* trim trailing NUL character */ Py_ssize_t old_size = Py_SIZE(self); - if (array_resize(self, old_size + ustr_length) == -1) + if (array_resize(self, old_size + ustr_length) == -1) { return NULL; - memcpy(self->ob_item + old_size * sizeof(Py_UNICODE), - ustr, ustr_length * sizeof(Py_UNICODE)); + } + + // must not fail + PyUnicode_AsWideChar( + ustr, ((wchar_t *)self->ob_item) + old_size, ustr_length); } Py_RETURN_NONE; @@ -1750,14 +1719,12 @@ static PyObject * array_array_tounicode_impl(arrayobject *self) /*[clinic end generated code: output=08e442378336e1ef input=127242eebe70b66d]*/ { - char typecode; - typecode = self->ob_descr->typecode; - if (typecode != 'u') { + if (self->ob_descr->typecode != 'u') { PyErr_SetString(PyExc_ValueError, "tounicode() may only be called on unicode type arrays"); return NULL; } - return PyUnicode_FromWideChar((Py_UNICODE *) self->ob_item, Py_SIZE(self)); + return PyUnicode_FromWideChar((wchar_t *) self->ob_item, Py_SIZE(self)); } /*[clinic input] @@ -2285,7 +2252,6 @@ static PyMethodDef array_methods[] = { ARRAY_ARRAY_EXTEND_METHODDEF ARRAY_ARRAY_FROMFILE_METHODDEF ARRAY_ARRAY_FROMLIST_METHODDEF - ARRAY_ARRAY_FROMSTRING_METHODDEF ARRAY_ARRAY_FROMBYTES_METHODDEF ARRAY_ARRAY_FROMUNICODE_METHODDEF ARRAY_ARRAY_INDEX_METHODDEF @@ -2296,7 +2262,6 @@ static PyMethodDef array_methods[] = { ARRAY_ARRAY_REVERSE_METHODDEF ARRAY_ARRAY_TOFILE_METHODDEF ARRAY_ARRAY_TOLIST_METHODDEF - ARRAY_ARRAY_TOSTRING_METHODDEF ARRAY_ARRAY_TOBYTES_METHODDEF ARRAY_ARRAY_TOUNICODE_METHODDEF ARRAY_ARRAY___SIZEOF___METHODDEF @@ -2718,30 +2683,20 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds) Py_DECREF(v); } else if (initial != NULL && PyUnicode_Check(initial)) { - Py_UNICODE *ustr; Py_ssize_t n; - - ustr = PyUnicode_AsUnicode(initial); + wchar_t *ustr = PyUnicode_AsWideCharString(initial, &n); if (ustr == NULL) { - PyErr_NoMemory(); Py_DECREF(a); return NULL; } - n = PyUnicode_GET_DATA_SIZE(initial); if (n > 0) { arrayobject *self = (arrayobject *)a; - char *item = self->ob_item; - item = (char *)PyMem_Realloc(item, n); - if (item == NULL) { - PyErr_NoMemory(); - Py_DECREF(a); - return NULL; - } - self->ob_item = item; - Py_SIZE(self) = n / sizeof(Py_UNICODE); - memcpy(item, ustr, n); - self->allocated = Py_SIZE(self); + // self->ob_item may be NULL but it is safe. + PyMem_Free(self->ob_item); + self->ob_item = (char *)ustr; + Py_SET_SIZE(self, n); + self->allocated = n; } } else if (initial != NULL && array_Check(initial) && len > 0) { @@ -3034,12 +2989,11 @@ array_modexec(PyObject *m) { char buffer[Py_ARRAY_LENGTH(descriptors)], *p; PyObject *typecodes; - Py_ssize_t size = 0; const struct arraydescr *descr; if (PyType_Ready(&Arraytype) < 0) return -1; - Py_TYPE(&PyArrayIter_Type) = &PyType_Type; + Py_SET_TYPE(&PyArrayIter_Type, &PyType_Type); Py_INCREF((PyObject *)&Arraytype); if (PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype) < 0) { @@ -3052,10 +3006,6 @@ array_modexec(PyObject *m) return -1; } - for (descr=descriptors; descr->typecode != '\0'; descr++) { - size++; - } - p = buffer; for (descr = descriptors; descr->typecode != '\0'; descr++) { *p++ = (char)descr->typecode; diff --git a/Modules/atexitmodule.c b/Modules/atexitmodule.c index 1d6d6e53cfbfbe8bb7b312bc7f253095dec67511..8cef64ceb9b6bffb584674d3fb782980c2524f41 100644 --- a/Modules/atexitmodule.c +++ b/Modules/atexitmodule.c @@ -28,7 +28,13 @@ typedef struct { int callback_len; } atexitmodule_state; -#define GET_ATEXIT_STATE(mod) ((atexitmodule_state*)PyModule_GetState(mod)) +static inline atexitmodule_state* +get_atexit_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (atexitmodule_state *)state; +} static void @@ -72,7 +78,7 @@ atexit_callfuncs(PyObject *module) if (module == NULL) return; - modstate = GET_ATEXIT_STATE(module); + modstate = get_atexit_state(module); if (modstate->ncallbacks == 0) return; @@ -130,7 +136,7 @@ atexit_register(PyObject *self, PyObject *args, PyObject *kwargs) atexit_callback *new_callback; PyObject *func = NULL; - modstate = GET_ATEXIT_STATE(self); + modstate = get_atexit_state(self); if (modstate->ncallbacks >= modstate->callback_len) { atexit_callback **r; @@ -197,7 +203,7 @@ Clear the list of previously registered exit functions."); static PyObject * atexit_clear(PyObject *self, PyObject *unused) { - atexit_cleanup(GET_ATEXIT_STATE(self)); + atexit_cleanup(get_atexit_state(self)); Py_RETURN_NONE; } @@ -211,7 +217,7 @@ atexit_ncallbacks(PyObject *self, PyObject *unused) { atexitmodule_state *modstate; - modstate = GET_ATEXIT_STATE(self); + modstate = get_atexit_state(self); return PyLong_FromSsize_t(modstate->ncallbacks); } @@ -222,16 +228,15 @@ atexit_m_traverse(PyObject *self, visitproc visit, void *arg) int i; atexitmodule_state *modstate; - modstate = GET_ATEXIT_STATE(self); - if (modstate != NULL) { - for (i = 0; i < modstate->ncallbacks; i++) { - atexit_callback *cb = modstate->atexit_callbacks[i]; - if (cb == NULL) - continue; - Py_VISIT(cb->func); - Py_VISIT(cb->args); - Py_VISIT(cb->kwargs); - } + modstate = (atexitmodule_state *)PyModule_GetState(self); + + for (i = 0; i < modstate->ncallbacks; i++) { + atexit_callback *cb = modstate->atexit_callbacks[i]; + if (cb == NULL) + continue; + Py_VISIT(cb->func); + Py_VISIT(cb->args); + Py_VISIT(cb->kwargs); } return 0; } @@ -240,10 +245,8 @@ static int atexit_m_clear(PyObject *self) { atexitmodule_state *modstate; - modstate = GET_ATEXIT_STATE(self); - if (modstate != NULL) { - atexit_cleanup(modstate); - } + modstate = (atexitmodule_state *)PyModule_GetState(self); + atexit_cleanup(modstate); return 0; } @@ -251,11 +254,9 @@ static void atexit_free(PyObject *m) { atexitmodule_state *modstate; - modstate = GET_ATEXIT_STATE(m); - if (modstate != NULL) { - atexit_cleanup(modstate); - PyMem_Free(modstate->atexit_callbacks); - } + modstate = (atexitmodule_state *)PyModule_GetState(m); + atexit_cleanup(modstate); + PyMem_Free(modstate->atexit_callbacks); } PyDoc_STRVAR(atexit_unregister__doc__, @@ -273,7 +274,7 @@ atexit_unregister(PyObject *self, PyObject *func) atexit_callback *cb; int i, eq; - modstate = GET_ATEXIT_STATE(self); + modstate = get_atexit_state(self); for (i = 0; i < modstate->ncallbacks; i++) { @@ -318,7 +319,7 @@ static int atexit_exec(PyObject *m) { atexitmodule_state *modstate; - modstate = GET_ATEXIT_STATE(m); + modstate = get_atexit_state(m); modstate->callback_len = 32; modstate->ncallbacks = 0; modstate->atexit_callbacks = PyMem_New(atexit_callback*, diff --git a/Modules/audioop.c b/Modules/audioop.c index f4fdeb23ffa95a2c7abc0dd24dba513b752c6608..3aeb6f04f13cbb6b2e40b058d835676bbc08d9f5 100644 --- a/Modules/audioop.c +++ b/Modules/audioop.c @@ -371,14 +371,26 @@ static const int stepsizeTable[89] = { SETINT32((cp), (i), (val)); \ } while(0) +static PyModuleDef audioopmodule; -static PyObject *AudioopError; +typedef struct { + PyObject *AudioopError; +} audioop_state; + +static inline audioop_state * +get_audioop_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (audioop_state *)state; +} static int -audioop_check_size(int size) +audioop_check_size(PyObject *module, int size) { if (size < 1 || size > 4) { - PyErr_SetString(AudioopError, "Size should be 1, 2, 3 or 4"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "Size should be 1, 2, 3 or 4"); return 0; } else @@ -386,12 +398,13 @@ audioop_check_size(int size) } static int -audioop_check_parameters(Py_ssize_t len, int size) +audioop_check_parameters(PyObject *module, Py_ssize_t len, int size) { - if (!audioop_check_size(size)) + if (!audioop_check_size(module, size)) return 0; if (len % size != 0) { - PyErr_SetString(AudioopError, "not a whole number of frames"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "not a whole number of frames"); return 0; } return 1; @@ -420,10 +433,11 @@ audioop_getsample_impl(PyObject *module, Py_buffer *fragment, int width, { int val; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; if (index < 0 || index >= fragment->len/width) { - PyErr_SetString(AudioopError, "Index out of range"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "Index out of range"); return NULL; } val = GETRAWSAMPLE(width, fragment->buf, index*width); @@ -447,7 +461,7 @@ audioop_max_impl(PyObject *module, Py_buffer *fragment, int width) Py_ssize_t i; unsigned int absval, max = 0; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; for (i = 0; i < fragment->len; i += width) { int val = GETRAWSAMPLE(width, fragment->buf, i); @@ -479,7 +493,7 @@ audioop_minmax_impl(PyObject *module, Py_buffer *fragment, int width) a warning */ int min = 0x7fffffff, max = -0x7FFFFFFF-1; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; for (i = 0; i < fragment->len; i += width) { int val = GETRAWSAMPLE(width, fragment->buf, i); @@ -507,7 +521,7 @@ audioop_avg_impl(PyObject *module, Py_buffer *fragment, int width) int avg; double sum = 0.0; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; for (i = 0; i < fragment->len; i += width) sum += GETRAWSAMPLE(width, fragment->buf, i); @@ -536,7 +550,7 @@ audioop_rms_impl(PyObject *module, Py_buffer *fragment, int width) unsigned int res; double sum_squares = 0.0; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; for (i = 0; i < fragment->len; i += width) { double val = GETRAWSAMPLE(width, fragment->buf, i); @@ -614,7 +628,8 @@ audioop_findfit_impl(PyObject *module, Py_buffer *fragment, double sum_ri_2, sum_aij_2, sum_aij_ri, result, best_result, factor; if (fragment->len & 1 || reference->len & 1) { - PyErr_SetString(AudioopError, "Strings should be even-sized"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "Strings should be even-sized"); return NULL; } cp1 = (const int16_t *)fragment->buf; @@ -623,7 +638,8 @@ audioop_findfit_impl(PyObject *module, Py_buffer *fragment, len2 = reference->len >> 1; if (len1 < len2) { - PyErr_SetString(AudioopError, "First sample should be longer"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "First sample should be longer"); return NULL; } sum_ri_2 = _sum2(cp2, cp2, len2); @@ -681,11 +697,13 @@ audioop_findfactor_impl(PyObject *module, Py_buffer *fragment, double sum_ri_2, sum_aij_ri, result; if (fragment->len & 1 || reference->len & 1) { - PyErr_SetString(AudioopError, "Strings should be even-sized"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "Strings should be even-sized"); return NULL; } if (fragment->len != reference->len) { - PyErr_SetString(AudioopError, "Samples should be same size"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "Samples should be same size"); return NULL; } cp1 = (const int16_t *)fragment->buf; @@ -725,14 +743,16 @@ audioop_findmax_impl(PyObject *module, Py_buffer *fragment, double result, best_result; if (fragment->len & 1) { - PyErr_SetString(AudioopError, "Strings should be even-sized"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "Strings should be even-sized"); return NULL; } cp1 = (const int16_t *)fragment->buf; len1 = fragment->len >> 1; if (length < 0 || len1 < length) { - PyErr_SetString(AudioopError, "Input sample should be longer"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "Input sample should be longer"); return NULL; } @@ -777,7 +797,7 @@ audioop_avgpp_impl(PyObject *module, Py_buffer *fragment, int width) unsigned int avg; int diff, prevdiff, nextreme = 0; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; if (fragment->len <= width) return PyLong_FromLong(0); @@ -833,7 +853,7 @@ audioop_maxpp_impl(PyObject *module, Py_buffer *fragment, int width) unsigned int max = 0, extremediff; int diff, prevdiff; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; if (fragment->len <= width) return PyLong_FromLong(0); @@ -885,7 +905,7 @@ audioop_cross_impl(PyObject *module, Py_buffer *fragment, int width) int prevval; Py_ssize_t ncross; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; ncross = -1; prevval = 17; /* Anything <> 0,1 */ @@ -918,7 +938,7 @@ audioop_mul_impl(PyObject *module, Py_buffer *fragment, int width, double maxval, minval; PyObject *rv; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; maxval = (double) maxvals[width]; @@ -961,10 +981,11 @@ audioop_tomono_impl(PyObject *module, Py_buffer *fragment, int width, cp = fragment->buf; len = fragment->len; - if (!audioop_check_parameters(len, width)) + if (!audioop_check_parameters(module, len, width)) return NULL; if (((len / width) & 1) != 0) { - PyErr_SetString(AudioopError, "not a whole number of frames"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "not a whole number of frames"); return NULL; } @@ -1008,7 +1029,7 @@ audioop_tostereo_impl(PyObject *module, Py_buffer *fragment, int width, double maxval, minval; PyObject *rv; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; maxval = (double) maxvals[width]; @@ -1056,10 +1077,11 @@ audioop_add_impl(PyObject *module, Py_buffer *fragment1, int minval, maxval, newval; PyObject *rv; - if (!audioop_check_parameters(fragment1->len, width)) + if (!audioop_check_parameters(module, fragment1->len, width)) return NULL; if (fragment1->len != fragment2->len) { - PyErr_SetString(AudioopError, "Lengths should be the same"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "Lengths should be the same"); return NULL; } @@ -1114,7 +1136,7 @@ audioop_bias_impl(PyObject *module, Py_buffer *fragment, int width, int bias) unsigned int val = 0, mask; PyObject *rv; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; rv = PyBytes_FromStringAndSize(NULL, fragment->len); @@ -1172,7 +1194,7 @@ audioop_reverse_impl(PyObject *module, Py_buffer *fragment, int width) Py_ssize_t i; PyObject *rv; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; rv = PyBytes_FromStringAndSize(NULL, fragment->len); @@ -1205,7 +1227,7 @@ audioop_byteswap_impl(PyObject *module, Py_buffer *fragment, int width) Py_ssize_t i; PyObject *rv; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; rv = PyBytes_FromStringAndSize(NULL, fragment->len); @@ -1241,9 +1263,9 @@ audioop_lin2lin_impl(PyObject *module, Py_buffer *fragment, int width, Py_ssize_t i, j; PyObject *rv; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; - if (!audioop_check_size(newwidth)) + if (!audioop_check_size(module, newwidth)) return NULL; if (fragment->len/width > PY_SSIZE_T_MAX/newwidth) { @@ -1302,10 +1324,11 @@ audioop_ratecv_impl(PyObject *module, Py_buffer *fragment, int width, PyObject *samps, *str, *rv = NULL, *channel; int bytes_per_frame; - if (!audioop_check_size(width)) + if (!audioop_check_size(module, width)) return NULL; if (nchannels < 1) { - PyErr_SetString(AudioopError, "# of channels should be >= 1"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "# of channels should be >= 1"); return NULL; } if (width > INT_MAX / nchannels) { @@ -1318,17 +1341,19 @@ audioop_ratecv_impl(PyObject *module, Py_buffer *fragment, int width, } bytes_per_frame = width * nchannels; if (weightA < 1 || weightB < 0) { - PyErr_SetString(AudioopError, + PyErr_SetString(get_audioop_state(module)->AudioopError, "weightA should be >= 1, weightB should be >= 0"); return NULL; } assert(fragment->len >= 0); if (fragment->len % bytes_per_frame != 0) { - PyErr_SetString(AudioopError, "not a whole number of frames"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "not a whole number of frames"); return NULL; } if (inrate <= 0 || outrate <= 0) { - PyErr_SetString(AudioopError, "sampling rate not > 0"); + PyErr_SetString(get_audioop_state(module)->AudioopError, + "sampling rate not > 0"); return NULL; } /* divide inrate and outrate by their greatest common divisor */ @@ -1369,7 +1394,7 @@ audioop_ratecv_impl(PyObject *module, Py_buffer *fragment, int width, &d, &PyTuple_Type, &samps)) goto exit; if (PyTuple_Size(samps) != nchannels) { - PyErr_SetString(AudioopError, + PyErr_SetString(get_audioop_state(module)->AudioopError, "illegal state argument"); goto exit; } @@ -1491,7 +1516,7 @@ audioop_lin2ulaw_impl(PyObject *module, Py_buffer *fragment, int width) Py_ssize_t i; PyObject *rv; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; rv = PyBytes_FromStringAndSize(NULL, fragment->len/width); @@ -1525,7 +1550,7 @@ audioop_ulaw2lin_impl(PyObject *module, Py_buffer *fragment, int width) Py_ssize_t i; PyObject *rv; - if (!audioop_check_size(width)) + if (!audioop_check_size(module, width)) return NULL; if (fragment->len > PY_SSIZE_T_MAX/width) { @@ -1564,7 +1589,7 @@ audioop_lin2alaw_impl(PyObject *module, Py_buffer *fragment, int width) Py_ssize_t i; PyObject *rv; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; rv = PyBytes_FromStringAndSize(NULL, fragment->len/width); @@ -1599,7 +1624,7 @@ audioop_alaw2lin_impl(PyObject *module, Py_buffer *fragment, int width) int val; PyObject *rv; - if (!audioop_check_size(width)) + if (!audioop_check_size(module, width)) return NULL; if (fragment->len > PY_SSIZE_T_MAX/width) { @@ -1643,7 +1668,7 @@ audioop_lin2adpcm_impl(PyObject *module, Py_buffer *fragment, int width, PyObject *rv = NULL, *str; int outputbuffer = 0, bufferstep; - if (!audioop_check_parameters(fragment->len, width)) + if (!audioop_check_parameters(module, fragment->len, width)) return NULL; /* Decode state, should have (value, step) */ @@ -1773,7 +1798,7 @@ audioop_adpcm2lin_impl(PyObject *module, Py_buffer *fragment, int width, PyObject *rv, *str; int inputbuffer = 0, bufferstep; - if (!audioop_check_size(width)) + if (!audioop_check_size(module, width)) return NULL; /* Decode state, should have (value, step) */ @@ -1897,31 +1922,65 @@ static PyMethodDef audioop_methods[] = { { 0, 0 } }; +static int +audioop_traverse(PyObject *module, visitproc visit, void *arg) +{ + audioop_state *state = get_audioop_state(module); + Py_VISIT(state->AudioopError); + return 0; +} + +static int +audioop_clear(PyObject *module) +{ + audioop_state *state = get_audioop_state(module); + Py_CLEAR(state->AudioopError); + return 0; +} + +static void +audioop_free(void *module) { + audioop_clear((PyObject *)module); +} + +static int +audioop_exec(PyObject* module) +{ + audioop_state *state = get_audioop_state(module); + + state->AudioopError = PyErr_NewException("audioop.error", NULL, NULL); + if (state->AudioopError == NULL) { + return -1; + } + + Py_INCREF(state->AudioopError); + if (PyModule_AddObject(module, "error", state->AudioopError) < 0) { + Py_DECREF(state->AudioopError); + return -1; + } + + return 0; +} + +static PyModuleDef_Slot audioop_slots[] = { + {Py_mod_exec, audioop_exec}, + {0, NULL} +}; static struct PyModuleDef audioopmodule = { PyModuleDef_HEAD_INIT, "audioop", NULL, - -1, + sizeof(audioop_state), audioop_methods, - NULL, - NULL, - NULL, - NULL + audioop_slots, + audioop_traverse, + audioop_clear, + audioop_free }; PyMODINIT_FUNC PyInit_audioop(void) { - PyObject *m, *d; - m = PyModule_Create(&audioopmodule); - if (m == NULL) - return NULL; - d = PyModule_GetDict(m); - if (d == NULL) - return NULL; - AudioopError = PyErr_NewException("audioop.error", NULL, NULL); - if (AudioopError != NULL) - PyDict_SetItemString(d,"error",AudioopError); - return m; + return PyModuleDef_Init(&audioopmodule); } diff --git a/Modules/binascii.c b/Modules/binascii.c index 1c7dc35882dee6ddc5beafdad35f2517ad2a0a73..1f3248b6049b31e98328e8962d21b95b33c98e22 100644 --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -66,6 +66,12 @@ typedef struct binascii_state { PyObject *Incomplete; } binascii_state; +static binascii_state * +get_binascii_state(PyObject *module) +{ + return (binascii_state *)PyModule_GetState(module); +} + /* ** hqx lookup table, ascii->binary. */ @@ -130,7 +136,7 @@ static const unsigned char table_a2b_hqx[256] = { static const unsigned char table_b2a_hqx[] = "!\"#$%&'()*+,-012345689@ABCDEFGHIJKLMNPQRSTUVXYZ[`abcdefhijklmpqr"; -static const char table_a2b_base64[] = { +static const unsigned char table_a2b_base64[] = { -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63, @@ -138,7 +144,16 @@ static const char table_a2b_base64[] = { -1, 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,-1, -1,-1,-1,-1, -1,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,-1, -1,-1,-1,-1 + 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1, + + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, }; #define BASE64_PAD '=' @@ -413,32 +428,6 @@ binascii_b2a_uu_impl(PyObject *module, Py_buffer *data, int backtick) return _PyBytesWriter_Finish(&writer, ascii_data); } - -static int -binascii_find_valid(const unsigned char *s, Py_ssize_t slen, int num) -{ - /* Finds & returns the (num+1)th - ** valid character for base64, or -1 if none. - */ - - int ret = -1; - unsigned char c, b64val; - - while ((slen > 0) && (ret == -1)) { - c = *s; - b64val = table_a2b_base64[c & 0x7f]; - if ( ((c <= 0x7f) && (b64val != (unsigned char)-1)) ) { - if (num == 0) - ret = *s; - num--; - } - - s++; - slen--; - } - return ret; -} - /*[clinic input] binascii.a2b_base64 @@ -452,88 +441,74 @@ static PyObject * binascii_a2b_base64_impl(PyObject *module, Py_buffer *data) /*[clinic end generated code: output=0628223f19fd3f9b input=5872acf6e1cac243]*/ { - const unsigned char *ascii_data; - unsigned char *bin_data; - unsigned char *bin_data_start; - int leftbits = 0; - unsigned char this_ch; - unsigned int leftchar = 0; - Py_ssize_t ascii_len, bin_len; - int quad_pos = 0; - _PyBytesWriter writer; - binascii_state *state; - - ascii_data = data->buf; - ascii_len = data->len; - - assert(ascii_len >= 0); + assert(data->len >= 0); - if (ascii_len > PY_SSIZE_T_MAX - 3) - return PyErr_NoMemory(); - - bin_len = ((ascii_len+3)/4)*3; /* Upper bound, corrected later */ - - _PyBytesWriter_Init(&writer); + const unsigned char *ascii_data = data->buf; + size_t ascii_len = data->len; /* Allocate the buffer */ - bin_data = _PyBytesWriter_Alloc(&writer, bin_len); + Py_ssize_t bin_len = ((ascii_len+3)/4)*3; /* Upper bound, corrected later */ + _PyBytesWriter writer; + _PyBytesWriter_Init(&writer); + unsigned char *bin_data = _PyBytesWriter_Alloc(&writer, bin_len); if (bin_data == NULL) return NULL; - bin_data_start = bin_data; + unsigned char *bin_data_start = bin_data; - for( ; ascii_len > 0; ascii_len--, ascii_data++) { - this_ch = *ascii_data; - - if (this_ch > 0x7f || - this_ch == '\r' || this_ch == '\n' || this_ch == ' ') - continue; + int quad_pos = 0; + unsigned char leftchar = 0; + int pads = 0; + for (size_t i = 0; i < ascii_len; i++) { + unsigned char this_ch = ascii_data[i]; /* Check for pad sequences and ignore ** the invalid ones. */ if (this_ch == BASE64_PAD) { - if ( (quad_pos < 2) || - ((quad_pos == 2) && - (binascii_find_valid(ascii_data, ascii_len, 1) - != BASE64_PAD)) ) - { - continue; - } - else { + if (quad_pos >= 2 && quad_pos + ++pads >= 4) { /* A pad sequence means no more input. ** We've already interpreted the data ** from the quad at this point. */ - leftbits = 0; - break; + goto done; } + continue; } - this_ch = table_a2b_base64[*ascii_data]; - if ( this_ch == (unsigned char) -1 ) + this_ch = table_a2b_base64[this_ch]; + if (this_ch >= 64) { continue; + } + pads = 0; - /* - ** Shift it in on the low end, and see if there's - ** a byte ready for output. - */ - quad_pos = (quad_pos + 1) & 0x03; - leftchar = (leftchar << 6) | (this_ch); - leftbits += 6; - - if ( leftbits >= 8 ) { - leftbits -= 8; - *bin_data++ = (leftchar >> leftbits) & 0xff; - leftchar &= ((1 << leftbits) - 1); + switch (quad_pos) { + case 0: + quad_pos = 1; + leftchar = this_ch; + break; + case 1: + quad_pos = 2; + *bin_data++ = (leftchar << 2) | (this_ch >> 4); + leftchar = this_ch & 0x0f; + break; + case 2: + quad_pos = 3; + *bin_data++ = (leftchar << 4) | (this_ch >> 2); + leftchar = this_ch & 0x03; + break; + case 3: + quad_pos = 0; + *bin_data++ = (leftchar << 6) | (this_ch); + leftchar = 0; + break; } } - if (leftbits != 0) { - state = PyModule_GetState(module); + if (quad_pos != 0) { + binascii_state *state = PyModule_GetState(module); if (state == NULL) { - return NULL; - } - if (leftbits == 6) { + /* error already set, from PyModule_GetState */ + } else if (quad_pos == 1) { /* ** There is exactly one extra valid, non-padding, base64 character. ** This is an invalid length, as there is no possible input that @@ -551,6 +526,7 @@ binascii_a2b_base64_impl(PyObject *module, Py_buffer *data) return NULL; } +done: return _PyBytesWriter_Finish(&writer, bin_data); } @@ -643,6 +619,11 @@ static PyObject * binascii_a2b_hqx_impl(PyObject *module, Py_buffer *data) /*[clinic end generated code: output=4d6d8c54d54ea1c1 input=0d914c680e0eed55]*/ { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "binascii.a2b_hqx() is deprecated", 1) < 0) { + return NULL; + } + const unsigned char *ascii_data; unsigned char *bin_data; int leftbits = 0; @@ -731,6 +712,11 @@ static PyObject * binascii_rlecode_hqx_impl(PyObject *module, Py_buffer *data) /*[clinic end generated code: output=393d79338f5f5629 input=e1f1712447a82b09]*/ { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "binascii.rlecode_hqx() is deprecated", 1) < 0) { + return NULL; + } + const unsigned char *in_data; unsigned char *out_data; unsigned char ch; @@ -793,6 +779,11 @@ static PyObject * binascii_b2a_hqx_impl(PyObject *module, Py_buffer *data) /*[clinic end generated code: output=d0aa5a704bc9f7de input=9596ebe019fe12ba]*/ { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "binascii.b2a_hqx() is deprecated", 1) < 0) { + return NULL; + } + unsigned char *ascii_data; const unsigned char *bin_data; int leftbits = 0; @@ -848,6 +839,11 @@ static PyObject * binascii_rledecode_hqx_impl(PyObject *module, Py_buffer *data) /*[clinic end generated code: output=9826619565de1c6c input=54cdd49fc014402c]*/ { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "binascii.rledecode_hqx() is deprecated", 1) < 0) { + return NULL; + } + const unsigned char *in_data; unsigned char *out_data; unsigned char in_byte, in_repeat; @@ -962,7 +958,7 @@ binascii_rledecode_hqx_impl(PyObject *module, Py_buffer *data) /*[clinic input] -binascii.crc_hqx -> unsigned_int +binascii.crc_hqx data: Py_buffer crc: unsigned_int(bitwise=True) @@ -971,9 +967,9 @@ binascii.crc_hqx -> unsigned_int Compute CRC-CCITT incrementally. [clinic start generated code]*/ -static unsigned int +static PyObject * binascii_crc_hqx_impl(PyObject *module, Py_buffer *data, unsigned int crc) -/*[clinic end generated code: output=8ec2a78590d19170 input=f18240ff8c705b79]*/ +/*[clinic end generated code: output=2fde213d0f547a98 input=56237755370a951c]*/ { const unsigned char *bin_data; Py_ssize_t len; @@ -986,7 +982,7 @@ binascii_crc_hqx_impl(PyObject *module, Py_buffer *data, unsigned int crc) crc = ((crc<<8)&0xff00) ^ crctab_hqx[(crc>>8)^*bin_data++]; } - return crc; + return PyLong_FromUnsignedLong(crc); } #ifndef USE_ZLIB_CRC32 @@ -1315,15 +1311,12 @@ binascii_a2b_qp_impl(PyObject *module, Py_buffer *data, int header) datalen = data->len; /* We allocate the output same size as input, this is overkill. - * The previous implementation used calloc() so we'll zero out the - * memory here too, since PyMem_Malloc() does not guarantee that. */ - odata = (unsigned char *) PyMem_Malloc(datalen); + odata = (unsigned char *) PyMem_Calloc(1, datalen); if (odata == NULL) { PyErr_NoMemory(); return NULL; } - memset(odata, 0, datalen); in = out = 0; while (in < datalen) { @@ -1503,15 +1496,12 @@ binascii_b2a_qp_impl(PyObject *module, Py_buffer *data, int quotetabs, } /* We allocate the output same size as input, this is overkill. - * The previous implementation used calloc() so we'll zero out the - * memory here too, since PyMem_Malloc() does not guarantee that. */ - odata = (unsigned char *) PyMem_Malloc(odatalen); + odata = (unsigned char *) PyMem_Calloc(1, odatalen); if (odata == NULL) { PyErr_NoMemory(); return NULL; } - memset(odata, 0, odatalen); in = out = linelen = 0; while (in < datalen) { @@ -1616,9 +1606,9 @@ static struct PyMethodDef binascii_module_methods[] = { PyDoc_STRVAR(doc_binascii, "Conversion between binary data and ASCII"); static int -binascii_exec(PyObject *m) { +binascii_exec(PyObject *module) { int result; - binascii_state *state = PyModule_GetState(m); + binascii_state *state = PyModule_GetState(module); if (state == NULL) { return -1; } @@ -1627,8 +1617,10 @@ binascii_exec(PyObject *m) { if (state->Error == NULL) { return -1; } - result = PyModule_AddObject(m, "Error", state->Error); + Py_INCREF(state->Error); + result = PyModule_AddObject(module, "Error", state->Error); if (result == -1) { + Py_DECREF(state->Error); return -1; } @@ -1636,8 +1628,10 @@ binascii_exec(PyObject *m) { if (state->Incomplete == NULL) { return -1; } - result = PyModule_AddObject(m, "Incomplete", state->Incomplete); + Py_INCREF(state->Incomplete); + result = PyModule_AddObject(module, "Incomplete", state->Incomplete); if (result == -1) { + Py_DECREF(state->Incomplete); return -1; } @@ -1649,6 +1643,30 @@ static PyModuleDef_Slot binascii_slots[] = { {0, NULL} }; +static int +binascii_traverse(PyObject *module, visitproc visit, void *arg) +{ + binascii_state *state = get_binascii_state(module); + Py_VISIT(state->Error); + Py_VISIT(state->Incomplete); + return 0; +} + +static int +binascii_clear(PyObject *module) +{ + binascii_state *state = get_binascii_state(module); + Py_CLEAR(state->Error); + Py_CLEAR(state->Incomplete); + return 0; +} + +static void +binascii_free(void *module) +{ + binascii_clear((PyObject *)module); +} + static struct PyModuleDef binasciimodule = { PyModuleDef_HEAD_INIT, "binascii", @@ -1656,9 +1674,9 @@ static struct PyModuleDef binasciimodule = { sizeof(binascii_state), binascii_module_methods, binascii_slots, - NULL, - NULL, - NULL + binascii_traverse, + binascii_clear, + binascii_free }; PyMODINIT_FUNC diff --git a/Modules/cjkcodecs/README b/Modules/cjkcodecs/README index b2370bc298f771090fb947c036887d530147a487..165ae7aded6a02882425da1760968e4fe604c3bd 100644 --- a/Modules/cjkcodecs/README +++ b/Modules/cjkcodecs/README @@ -1,12 +1,10 @@ To generate or modify mapping headers ------------------------------------- -Mapping headers are imported from CJKCodecs as pre-generated form. -If you need to tweak or add something on it, please look at tools/ -subdirectory of CJKCodecs' distribution. +Mapping headers are generated from Tools/unicode/genmap_*.py -Notes on implmentation characteristics of each codecs +Notes on implementation characteristics of each codecs ----------------------------------------------------- 1) Big5 codec diff --git a/Modules/cjkcodecs/cjkcodecs.h b/Modules/cjkcodecs/cjkcodecs.h index b67f3482faf8dac7d3ea8986a586ea1cc88d47cd..e41755b197ffcab5156a87efadde6f9f97945882 100644 --- a/Modules/cjkcodecs/cjkcodecs.h +++ b/Modules/cjkcodecs/cjkcodecs.h @@ -72,7 +72,7 @@ static const struct dbcs_map *mapping_list; #define ENCODER(encoding) \ static Py_ssize_t encoding##_encode( \ MultibyteCodec_State *state, const void *config, \ - int kind, void *data, \ + int kind, const void *data, \ Py_ssize_t *inpos, Py_ssize_t inlen, \ unsigned char **outbuf, Py_ssize_t outleft, int flags) #define ENCODER_RESET(encoding) \ @@ -291,7 +291,7 @@ getcodec(PyObject *self, PyObject *encoding) if (codecobj == NULL) return NULL; - r = PyObject_CallFunctionObjArgs(cofunc, codecobj, NULL); + r = PyObject_CallOneArg(cofunc, codecobj); Py_DECREF(codecobj); return r; diff --git a/Modules/cjkcodecs/mappings_cn.h b/Modules/cjkcodecs/mappings_cn.h index 1f8c299d24239ace6efed8f642b6a9f14bb95b59..87ca0de784a804883309beed8f74a7e50a227b30 100644 --- a/Modules/cjkcodecs/mappings_cn.h +++ b/Modules/cjkcodecs/mappings_cn.h @@ -1,3 +1,4 @@ +// AUTO-GENERATED FILE FROM genmap_schinese.py: DO NOT EDIT static const ucs2_t __gb2312_decmap[7482] = { 12288,12289,12290,12539,713,711,168,12291,12293,8213,65374,8214,8230,8216, 8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303, diff --git a/Modules/cjkcodecs/mappings_jisx0213_pair.h b/Modules/cjkcodecs/mappings_jisx0213_pair.h index 729e4bcbe66f13c4212365b37133cd9bfe291132..c96f20142b7aee01ea25a367471db434835b0b92 100644 --- a/Modules/cjkcodecs/mappings_jisx0213_pair.h +++ b/Modules/cjkcodecs/mappings_jisx0213_pair.h @@ -1,3 +1,4 @@ +// AUTO-GENERATED FILE FROM genmap_japanese.py: DO NOT EDIT #define JISX0213_ENCPAIRS 46 #ifdef EXTERN_JISX0213_PAIR static const struct widedbcs_index *jisx0213_pair_decmap; diff --git a/Modules/cjkcodecs/mappings_jp.h b/Modules/cjkcodecs/mappings_jp.h index c6dae3daa7df26e6efe4d82e2e1740d3c7c7fcc3..409aeae25c964a5bf64ca2a3fe4f627faba3f408 100644 --- a/Modules/cjkcodecs/mappings_jp.h +++ b/Modules/cjkcodecs/mappings_jp.h @@ -1,3 +1,4 @@ +// AUTO-GENERATED FILE FROM genmap_japanese.py: DO NOT EDIT static const ucs2_t __jisx0208_decmap[6956] = { 12288,12289,12290,65292,65294,12539,65306,65307,65311,65281,12443,12444,180, 65344,168,65342,65507,65343,12541,12542,12445,12446,12291,20189,12293,12294, diff --git a/Modules/cjkcodecs/mappings_kr.h b/Modules/cjkcodecs/mappings_kr.h index 7e6fdd2701bddf68d2f5163f3522f1382e094bfe..bb59acccc1ee9677b28f898c6cc8de2a04062ec7 100644 --- a/Modules/cjkcodecs/mappings_kr.h +++ b/Modules/cjkcodecs/mappings_kr.h @@ -1,3 +1,4 @@ +// AUTO-GENERATED FILE FROM genmap_korean.py: DO NOT EDIT static const ucs2_t __ksx1001_decmap[8264] = { 12288,12289,12290,183,8229,8230,168,12291,173,8213,8741,65340,8764,8216,8217, 8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12304, @@ -3249,3 +3250,4 @@ __cp949_encmap+31959,0,255},{__cp949_encmap+32215,0,255},{__cp949_encmap+32471 __cp949_encmap+32891,0,11},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__cp949_encmap+ 32903,1,230}, }; + diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index 4a751f7ca55566ad0e0d2ca70cd78c688603e845..86402768b6ee67cbd2ec1f5b2070f4dc5a06e928 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -6,7 +6,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include "multibytecodec.h" #include "clinic/multibytecodec.c.h" @@ -81,7 +81,7 @@ internal_error_callback(const char *errors) static PyObject * call_error_callback(PyObject *errors, PyObject *exc) { - PyObject *args, *cb, *r; + PyObject *cb, *r; const char *str; assert(PyUnicode_Check(errors)); @@ -92,17 +92,7 @@ call_error_callback(PyObject *errors, PyObject *exc) if (cb == NULL) return NULL; - args = PyTuple_New(1); - if (args == NULL) { - Py_DECREF(cb); - return NULL; - } - - PyTuple_SET_ITEM(args, 0, exc); - Py_INCREF(exc); - - r = PyObject_CallObject(cb, args); - Py_DECREF(args); + r = PyObject_CallOneArg(cb, exc); Py_DECREF(cb); return r; } @@ -238,7 +228,7 @@ multibytecodec_encerror(MultibyteCodec *codec, Py_ssize_t r; Py_ssize_t inpos; int kind; - void *data; + const void *data; replchar = PyUnicode_FromOrdinal('?'); if (replchar == NULL) @@ -467,7 +457,7 @@ multibytecodec_encode(MultibyteCodec *codec, Py_ssize_t finalsize, r = 0; Py_ssize_t datalen; int kind; - void *data; + const void *data; if (PyUnicode_READY(text) < 0) return NULL; @@ -1256,7 +1246,7 @@ _multibytecodec_MultibyteIncrementalDecoder_setstate_impl(MultibyteIncrementalDe PyObject *buffer; PyLongObject *statelong; Py_ssize_t buffersize; - char *bufferstr; + const char *bufferstr; unsigned char statebytes[8]; if (!PyArg_ParseTuple(state, "SO!;setstate(): illegal state argument", @@ -1460,7 +1450,7 @@ mbstreamreader_iread(MultibyteStreamReaderObject *self, PyErr_Format(PyExc_TypeError, "stream function returned a " "non-bytes object (%.100s)", - cres->ob_type->tp_name); + Py_TYPE(cres)->tp_name); goto errorexit; } @@ -1786,7 +1776,7 @@ mbstreamwriter_iwrite(MultibyteStreamWriterObject *self, if (str == NULL) return -1; - wr = _PyObject_CallMethodIdObjArgs(self->stream, &PyId_write, str, NULL); + wr = _PyObject_CallMethodIdOneArg(self->stream, &PyId_write, str); Py_DECREF(str); if (wr == NULL) return -1; @@ -1880,7 +1870,7 @@ _multibytecodec_MultibyteStreamWriter_reset_impl(MultibyteStreamWriterObject *se if (PyBytes_Size(pwrt) > 0) { PyObject *wr; - wr = _PyObject_CallMethodIdObjArgs(self->stream, &PyId_write, pwrt); + wr = _PyObject_CallMethodIdOneArg(self->stream, &PyId_write, pwrt); if (wr == NULL) { Py_DECREF(pwrt); return NULL; @@ -2069,14 +2059,12 @@ static struct PyModuleDef _multibytecodecmodule = { PyMODINIT_FUNC PyInit__multibytecodec(void) { - int i; PyObject *m; PyTypeObject *typelist[] = { &MultibyteIncrementalEncoder_Type, &MultibyteIncrementalDecoder_Type, &MultibyteStreamReader_Type, - &MultibyteStreamWriter_Type, - NULL + &MultibyteStreamWriter_Type }; if (PyType_Ready(&MultibyteCodec_Type) < 0) @@ -2086,16 +2074,13 @@ PyInit__multibytecodec(void) if (m == NULL) return NULL; - for (i = 0; typelist[i] != NULL; i++) { - if (PyType_Ready(typelist[i]) < 0) + for (size_t i = 0; i < Py_ARRAY_LENGTH(typelist); i++) { + if (PyModule_AddType(m, typelist[i]) < 0) { return NULL; - Py_INCREF(typelist[i]); - PyModule_AddObject(m, typelist[i]->tp_name, - (PyObject *)typelist[i]); + } } if (PyErr_Occurred()) { - Py_FatalError("can't initialize the _multibytecodec module"); Py_DECREF(m); m = NULL; } diff --git a/Modules/cjkcodecs/multibytecodec.h b/Modules/cjkcodecs/multibytecodec.h index 6d34534ee685b1199ca5e8d269a04cf8dc8747f9..59468210b970c828134044414fac64674d0a53d5 100644 --- a/Modules/cjkcodecs/multibytecodec.h +++ b/Modules/cjkcodecs/multibytecodec.h @@ -30,7 +30,7 @@ typedef struct { typedef int (*mbcodec_init)(const void *config); typedef Py_ssize_t (*mbencode_func)(MultibyteCodec_State *state, const void *config, - int kind, void *data, + int kind, const void *data, Py_ssize_t *inpos, Py_ssize_t inlen, unsigned char **outbuf, Py_ssize_t outleft, int flags); @@ -65,7 +65,7 @@ typedef struct { MultibyteCodec *codec; } MultibyteCodecObject; -#define MultibyteCodec_Check(op) ((op)->ob_type == &MultibyteCodec_Type) +#define MultibyteCodec_Check(op) Py_IS_TYPE((op), &MultibyteCodec_Type) #define _MultibyteStatefulCodec_HEAD \ PyObject_HEAD \ diff --git a/Modules/clinic/_asynciomodule.c.h b/Modules/clinic/_asynciomodule.c.h index 17eb77334d0a73e514eedb7951b51f7676cf0fe3..a071efc1e2be3a7a80d319460d6f0a421cc73185 100644 --- a/Modules/clinic/_asynciomodule.c.h +++ b/Modules/clinic/_asynciomodule.c.h @@ -174,7 +174,7 @@ PyDoc_STRVAR(_asyncio_Future_remove_done_callback__doc__, {"remove_done_callback", (PyCFunction)_asyncio_Future_remove_done_callback, METH_O, _asyncio_Future_remove_done_callback__doc__}, PyDoc_STRVAR(_asyncio_Future_cancel__doc__, -"cancel($self, /)\n" +"cancel($self, /, msg=None)\n" "--\n" "\n" "Cancel the future and schedule callbacks.\n" @@ -184,15 +184,34 @@ PyDoc_STRVAR(_asyncio_Future_cancel__doc__, "return True."); #define _ASYNCIO_FUTURE_CANCEL_METHODDEF \ - {"cancel", (PyCFunction)_asyncio_Future_cancel, METH_NOARGS, _asyncio_Future_cancel__doc__}, + {"cancel", (PyCFunction)(void(*)(void))_asyncio_Future_cancel, METH_FASTCALL|METH_KEYWORDS, _asyncio_Future_cancel__doc__}, static PyObject * -_asyncio_Future_cancel_impl(FutureObj *self); +_asyncio_Future_cancel_impl(FutureObj *self, PyObject *msg); static PyObject * -_asyncio_Future_cancel(FutureObj *self, PyObject *Py_UNUSED(ignored)) +_asyncio_Future_cancel(FutureObj *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return _asyncio_Future_cancel_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = {"msg", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "cancel", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *msg = Py_None; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + msg = args[0]; +skip_optional_pos: + return_value = _asyncio_Future_cancel_impl(self, msg); + +exit: + return return_value; } PyDoc_STRVAR(_asyncio_Future_cancelled__doc__, @@ -252,6 +271,27 @@ _asyncio_Future_get_loop(FutureObj *self, PyObject *Py_UNUSED(ignored)) return _asyncio_Future_get_loop_impl(self); } +PyDoc_STRVAR(_asyncio_Future__make_cancelled_error__doc__, +"_make_cancelled_error($self, /)\n" +"--\n" +"\n" +"Create the CancelledError to raise if the Future is cancelled.\n" +"\n" +"This should only be called once when handling a cancellation since\n" +"it erases the context exception value."); + +#define _ASYNCIO_FUTURE__MAKE_CANCELLED_ERROR_METHODDEF \ + {"_make_cancelled_error", (PyCFunction)_asyncio_Future__make_cancelled_error, METH_NOARGS, _asyncio_Future__make_cancelled_error__doc__}, + +static PyObject * +_asyncio_Future__make_cancelled_error_impl(FutureObj *self); + +static PyObject * +_asyncio_Future__make_cancelled_error(FutureObj *self, PyObject *Py_UNUSED(ignored)) +{ + return _asyncio_Future__make_cancelled_error_impl(self); +} + PyDoc_STRVAR(_asyncio_Future__repr_info__doc__, "_repr_info($self, /)\n" "--\n" @@ -315,84 +355,25 @@ exit: return return_value; } -PyDoc_STRVAR(_asyncio_Task_current_task__doc__, -"current_task($type, /, loop=None)\n" +PyDoc_STRVAR(_asyncio_Task__make_cancelled_error__doc__, +"_make_cancelled_error($self, /)\n" "--\n" "\n" -"Return the currently running task in an event loop or None.\n" +"Create the CancelledError to raise if the Task is cancelled.\n" "\n" -"By default the current task for the current event loop is returned.\n" -"\n" -"None is returned when called not in the context of a Task."); +"This should only be called once when handling a cancellation since\n" +"it erases the context exception value."); -#define _ASYNCIO_TASK_CURRENT_TASK_METHODDEF \ - {"current_task", (PyCFunction)(void(*)(void))_asyncio_Task_current_task, METH_FASTCALL|METH_KEYWORDS|METH_CLASS, _asyncio_Task_current_task__doc__}, +#define _ASYNCIO_TASK__MAKE_CANCELLED_ERROR_METHODDEF \ + {"_make_cancelled_error", (PyCFunction)_asyncio_Task__make_cancelled_error, METH_NOARGS, _asyncio_Task__make_cancelled_error__doc__}, static PyObject * -_asyncio_Task_current_task_impl(PyTypeObject *type, PyObject *loop); +_asyncio_Task__make_cancelled_error_impl(TaskObj *self); static PyObject * -_asyncio_Task_current_task(PyTypeObject *type, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_asyncio_Task__make_cancelled_error(TaskObj *self, PyObject *Py_UNUSED(ignored)) { - PyObject *return_value = NULL; - static const char * const _keywords[] = {"loop", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "current_task", 0}; - PyObject *argsbuf[1]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; - PyObject *loop = Py_None; - - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); - if (!args) { - goto exit; - } - if (!noptargs) { - goto skip_optional_pos; - } - loop = args[0]; -skip_optional_pos: - return_value = _asyncio_Task_current_task_impl(type, loop); - -exit: - return return_value; -} - -PyDoc_STRVAR(_asyncio_Task_all_tasks__doc__, -"all_tasks($type, /, loop=None)\n" -"--\n" -"\n" -"Return a set of all tasks for an event loop.\n" -"\n" -"By default all tasks for the current event loop are returned."); - -#define _ASYNCIO_TASK_ALL_TASKS_METHODDEF \ - {"all_tasks", (PyCFunction)(void(*)(void))_asyncio_Task_all_tasks, METH_FASTCALL|METH_KEYWORDS|METH_CLASS, _asyncio_Task_all_tasks__doc__}, - -static PyObject * -_asyncio_Task_all_tasks_impl(PyTypeObject *type, PyObject *loop); - -static PyObject * -_asyncio_Task_all_tasks(PyTypeObject *type, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) -{ - PyObject *return_value = NULL; - static const char * const _keywords[] = {"loop", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "all_tasks", 0}; - PyObject *argsbuf[1]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; - PyObject *loop = Py_None; - - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); - if (!args) { - goto exit; - } - if (!noptargs) { - goto skip_optional_pos; - } - loop = args[0]; -skip_optional_pos: - return_value = _asyncio_Task_all_tasks_impl(type, loop); - -exit: - return return_value; + return _asyncio_Task__make_cancelled_error_impl(self); } PyDoc_STRVAR(_asyncio_Task__repr_info__doc__, @@ -413,7 +394,7 @@ _asyncio_Task__repr_info(TaskObj *self, PyObject *Py_UNUSED(ignored)) } PyDoc_STRVAR(_asyncio_Task_cancel__doc__, -"cancel($self, /)\n" +"cancel($self, /, msg=None)\n" "--\n" "\n" "Request that this task cancel itself.\n" @@ -436,15 +417,34 @@ PyDoc_STRVAR(_asyncio_Task_cancel__doc__, "was not called)."); #define _ASYNCIO_TASK_CANCEL_METHODDEF \ - {"cancel", (PyCFunction)_asyncio_Task_cancel, METH_NOARGS, _asyncio_Task_cancel__doc__}, + {"cancel", (PyCFunction)(void(*)(void))_asyncio_Task_cancel, METH_FASTCALL|METH_KEYWORDS, _asyncio_Task_cancel__doc__}, static PyObject * -_asyncio_Task_cancel_impl(TaskObj *self); +_asyncio_Task_cancel_impl(TaskObj *self, PyObject *msg); static PyObject * -_asyncio_Task_cancel(TaskObj *self, PyObject *Py_UNUSED(ignored)) +_asyncio_Task_cancel(TaskObj *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { - return _asyncio_Task_cancel_impl(self); + PyObject *return_value = NULL; + static const char * const _keywords[] = {"msg", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "cancel", 0}; + PyObject *argsbuf[1]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *msg = Py_None; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + msg = args[0]; +skip_optional_pos: + return_value = _asyncio_Task_cancel_impl(self, msg); + +exit: + return return_value; } PyDoc_STRVAR(_asyncio_Task_get_stack__doc__, @@ -832,4 +832,4 @@ _asyncio__leave_task(PyObject *module, PyObject *const *args, Py_ssize_t nargs, exit: return return_value; } -/*[clinic end generated code: output=585ba1f8de5b4103 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=d0fc522bcbff9d61 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_bisectmodule.c.h b/Modules/clinic/_bisectmodule.c.h new file mode 100644 index 0000000000000000000000000000000000000000..80ab7048f14288b6b3cd79787d58a2b9773dc924 --- /dev/null +++ b/Modules/clinic/_bisectmodule.c.h @@ -0,0 +1,306 @@ +/*[clinic input] +preserve +[clinic start generated code]*/ + +PyDoc_STRVAR(_bisect_bisect_right__doc__, +"bisect_right($module, /, a, x, lo=0, hi=None)\n" +"--\n" +"\n" +"Return the index where to insert item x in list a, assuming a is sorted.\n" +"\n" +"The return value i is such that all e in a[:i] have e <= x, and all e in\n" +"a[i:] have e > x. So if x already appears in the list, i points just\n" +"beyond the rightmost x already there\n" +"\n" +"Optional args lo (default 0) and hi (default len(a)) bound the\n" +"slice of a to be searched."); + +#define _BISECT_BISECT_RIGHT_METHODDEF \ + {"bisect_right", (PyCFunction)(void(*)(void))_bisect_bisect_right, METH_FASTCALL|METH_KEYWORDS, _bisect_bisect_right__doc__}, + +static Py_ssize_t +_bisect_bisect_right_impl(PyObject *module, PyObject *a, PyObject *x, + Py_ssize_t lo, Py_ssize_t hi); + +static PyObject * +_bisect_bisect_right(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"a", "x", "lo", "hi", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "bisect_right", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; + PyObject *a; + PyObject *x; + Py_ssize_t lo = 0; + Py_ssize_t hi = -1; + Py_ssize_t _return_value; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 4, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + x = args[1]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[2]) { + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + lo = ival; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (!_Py_convert_optional_to_ssize_t(args[3], &hi)) { + goto exit; + } +skip_optional_pos: + _return_value = _bisect_bisect_right_impl(module, a, x, lo, hi); + if ((_return_value == -1) && PyErr_Occurred()) { + goto exit; + } + return_value = PyLong_FromSsize_t(_return_value); + +exit: + return return_value; +} + +PyDoc_STRVAR(_bisect_insort_right__doc__, +"insort_right($module, /, a, x, lo=0, hi=None)\n" +"--\n" +"\n" +"Insert item x in list a, and keep it sorted assuming a is sorted.\n" +"\n" +"If x is already in a, insert it to the right of the rightmost x.\n" +"\n" +"Optional args lo (default 0) and hi (default len(a)) bound the\n" +"slice of a to be searched."); + +#define _BISECT_INSORT_RIGHT_METHODDEF \ + {"insort_right", (PyCFunction)(void(*)(void))_bisect_insort_right, METH_FASTCALL|METH_KEYWORDS, _bisect_insort_right__doc__}, + +static PyObject * +_bisect_insort_right_impl(PyObject *module, PyObject *a, PyObject *x, + Py_ssize_t lo, Py_ssize_t hi); + +static PyObject * +_bisect_insort_right(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"a", "x", "lo", "hi", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "insort_right", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; + PyObject *a; + PyObject *x; + Py_ssize_t lo = 0; + Py_ssize_t hi = -1; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 4, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + x = args[1]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[2]) { + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + lo = ival; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (!_Py_convert_optional_to_ssize_t(args[3], &hi)) { + goto exit; + } +skip_optional_pos: + return_value = _bisect_insort_right_impl(module, a, x, lo, hi); + +exit: + return return_value; +} + +PyDoc_STRVAR(_bisect_bisect_left__doc__, +"bisect_left($module, /, a, x, lo=0, hi=None)\n" +"--\n" +"\n" +"Return the index where to insert item x in list a, assuming a is sorted.\n" +"\n" +"The return value i is such that all e in a[:i] have e < x, and all e in\n" +"a[i:] have e >= x. So if x already appears in the list, i points just\n" +"before the leftmost x already there.\n" +"\n" +"Optional args lo (default 0) and hi (default len(a)) bound the\n" +"slice of a to be searched."); + +#define _BISECT_BISECT_LEFT_METHODDEF \ + {"bisect_left", (PyCFunction)(void(*)(void))_bisect_bisect_left, METH_FASTCALL|METH_KEYWORDS, _bisect_bisect_left__doc__}, + +static Py_ssize_t +_bisect_bisect_left_impl(PyObject *module, PyObject *a, PyObject *x, + Py_ssize_t lo, Py_ssize_t hi); + +static PyObject * +_bisect_bisect_left(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"a", "x", "lo", "hi", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "bisect_left", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; + PyObject *a; + PyObject *x; + Py_ssize_t lo = 0; + Py_ssize_t hi = -1; + Py_ssize_t _return_value; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 4, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + x = args[1]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[2]) { + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + lo = ival; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (!_Py_convert_optional_to_ssize_t(args[3], &hi)) { + goto exit; + } +skip_optional_pos: + _return_value = _bisect_bisect_left_impl(module, a, x, lo, hi); + if ((_return_value == -1) && PyErr_Occurred()) { + goto exit; + } + return_value = PyLong_FromSsize_t(_return_value); + +exit: + return return_value; +} + +PyDoc_STRVAR(_bisect_insort_left__doc__, +"insort_left($module, /, a, x, lo=0, hi=None)\n" +"--\n" +"\n" +"Insert item x in list a, and keep it sorted assuming a is sorted.\n" +"\n" +"If x is already in a, insert it to the left of the leftmost x.\n" +"\n" +"Optional args lo (default 0) and hi (default len(a)) bound the\n" +"slice of a to be searched."); + +#define _BISECT_INSORT_LEFT_METHODDEF \ + {"insort_left", (PyCFunction)(void(*)(void))_bisect_insort_left, METH_FASTCALL|METH_KEYWORDS, _bisect_insort_left__doc__}, + +static PyObject * +_bisect_insort_left_impl(PyObject *module, PyObject *a, PyObject *x, + Py_ssize_t lo, Py_ssize_t hi); + +static PyObject * +_bisect_insort_left(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"a", "x", "lo", "hi", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "insort_left", 0}; + PyObject *argsbuf[4]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; + PyObject *a; + PyObject *x; + Py_ssize_t lo = 0; + Py_ssize_t hi = -1; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 4, 0, argsbuf); + if (!args) { + goto exit; + } + a = args[0]; + x = args[1]; + if (!noptargs) { + goto skip_optional_pos; + } + if (args[2]) { + if (PyFloat_Check(args[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[2]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + lo = ival; + } + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (!_Py_convert_optional_to_ssize_t(args[3], &hi)) { + goto exit; + } +skip_optional_pos: + return_value = _bisect_insort_left_impl(module, a, x, lo, hi); + +exit: + return return_value; +} +/*[clinic end generated code: output=bcbd6c77331a08f0 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_bz2module.c.h b/Modules/clinic/_bz2module.c.h index ac826bd9b5986fe894eb8c2ab4ea9ec14295e647..0eb6280d6e0298e5766b063aa7fa30d8cf63ad52 100644 --- a/Modules/clinic/_bz2module.c.h +++ b/Modules/clinic/_bz2module.c.h @@ -85,7 +85,7 @@ _bz2_BZ2Compressor___init__(PyObject *self, PyObject *args, PyObject *kwargs) int return_value = -1; int compresslevel = 9; - if ((Py_TYPE(self) == &BZ2Compressor_Type) && + if (Py_IS_TYPE(self, &BZ2Compressor_Type) && !_PyArg_NoKeywords("BZ2Compressor", kwargs)) { goto exit; } @@ -207,11 +207,11 @@ _bz2_BZ2Decompressor___init__(PyObject *self, PyObject *args, PyObject *kwargs) { int return_value = -1; - if ((Py_TYPE(self) == &BZ2Decompressor_Type) && + if (Py_IS_TYPE(self, &BZ2Decompressor_Type) && !_PyArg_NoPositional("BZ2Decompressor", args)) { goto exit; } - if ((Py_TYPE(self) == &BZ2Decompressor_Type) && + if (Py_IS_TYPE(self, &BZ2Decompressor_Type) && !_PyArg_NoKeywords("BZ2Decompressor", kwargs)) { goto exit; } @@ -220,4 +220,4 @@ _bz2_BZ2Decompressor___init__(PyObject *self, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=ec3d1b3652c98823 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=3f3f1e788fe28ee1 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_cursesmodule.c.h b/Modules/clinic/_cursesmodule.c.h index ad93e6a0ca0220a65148ebfcee86ff6c80f6bc66..66ffcdfdb3f99baac2a4850471d5d6a2db746b3c 100644 --- a/Modules/clinic/_cursesmodule.c.h +++ b/Modules/clinic/_cursesmodule.c.h @@ -2028,7 +2028,7 @@ PyDoc_STRVAR(_curses_color_content__doc__, "Return the red, green, and blue (RGB) components of the specified color.\n" "\n" " color_number\n" -" The number of the color (0 - COLORS).\n" +" The number of the color (0 - (COLORS-1)).\n" "\n" "A 3-tuple is returned, containing the R, G, B values for the given color,\n" "which will be between 0 (no component) and 1000 (maximum amount of component)."); @@ -2076,13 +2076,13 @@ exit: } PyDoc_STRVAR(_curses_color_pair__doc__, -"color_pair($module, color_number, /)\n" +"color_pair($module, pair_number, /)\n" "--\n" "\n" "Return the attribute value for displaying text in the specified color.\n" "\n" -" color_number\n" -" The number of the color (0 - COLORS).\n" +" pair_number\n" +" The number of the color pair.\n" "\n" "This attribute value can be combined with A_STANDOUT, A_REVERSE, and the\n" "other A_* attributes. pair_number() is the counterpart to this function."); @@ -2091,13 +2091,13 @@ PyDoc_STRVAR(_curses_color_pair__doc__, {"color_pair", (PyCFunction)_curses_color_pair, METH_O, _curses_color_pair__doc__}, static PyObject * -_curses_color_pair_impl(PyObject *module, short color_number); +_curses_color_pair_impl(PyObject *module, short pair_number); static PyObject * _curses_color_pair(PyObject *module, PyObject *arg) { PyObject *return_value = NULL; - short color_number; + short pair_number; if (PyFloat_Check(arg)) { PyErr_SetString(PyExc_TypeError, @@ -2120,10 +2120,10 @@ _curses_color_pair(PyObject *module, PyObject *arg) goto exit; } else { - color_number = (short) ival; + pair_number = (short) ival; } } - return_value = _curses_color_pair_impl(module, color_number); + return_value = _curses_color_pair_impl(module, pair_number); exit: return return_value; @@ -2699,7 +2699,7 @@ PyDoc_STRVAR(_curses_init_color__doc__, "Change the definition of a color.\n" "\n" " color_number\n" -" The number of the color to be changed (0 - COLORS).\n" +" The number of the color to be changed (0 - (COLORS-1)).\n" " r\n" " Red component (0 - 1000).\n" " g\n" @@ -2709,7 +2709,7 @@ PyDoc_STRVAR(_curses_init_color__doc__, "\n" "When init_color() is used, all occurrences of that color on the screen\n" "immediately change to the new definition. This function is a no-op on\n" -"most terminals; it is active only if can_change_color() returns 1."); +"most terminals; it is active only if can_change_color() returns true."); #define _CURSES_INIT_COLOR_METHODDEF \ {"init_color", (PyCFunction)(void(*)(void))_curses_init_color, METH_FASTCALL, _curses_init_color__doc__}, @@ -2841,9 +2841,9 @@ PyDoc_STRVAR(_curses_init_pair__doc__, " pair_number\n" " The number of the color-pair to be changed (1 - (COLOR_PAIRS-1)).\n" " fg\n" -" Foreground color number (0 - COLORS).\n" +" Foreground color number (-1 - (COLORS-1)).\n" " bg\n" -" Background color number (0 - COLORS).\n" +" Background color number (-1 - (COLORS-1)).\n" "\n" "If the color-pair was previously initialized, the screen is refreshed and\n" "all occurrences of that color-pair are changed to the new definition."); @@ -3040,6 +3040,144 @@ exit: return return_value; } +#if (defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102) + +PyDoc_STRVAR(_curses_get_escdelay__doc__, +"get_escdelay($module, /)\n" +"--\n" +"\n" +"Gets the curses ESCDELAY setting.\n" +"\n" +"Gets the number of milliseconds to wait after reading an escape character,\n" +"to distinguish between an individual escape character entered on the\n" +"keyboard from escape sequences sent by cursor and function keys."); + +#define _CURSES_GET_ESCDELAY_METHODDEF \ + {"get_escdelay", (PyCFunction)_curses_get_escdelay, METH_NOARGS, _curses_get_escdelay__doc__}, + +static PyObject * +_curses_get_escdelay_impl(PyObject *module); + +static PyObject * +_curses_get_escdelay(PyObject *module, PyObject *Py_UNUSED(ignored)) +{ + return _curses_get_escdelay_impl(module); +} + +#endif /* (defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102) */ + +#if (defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102) + +PyDoc_STRVAR(_curses_set_escdelay__doc__, +"set_escdelay($module, ms, /)\n" +"--\n" +"\n" +"Sets the curses ESCDELAY setting.\n" +"\n" +" ms\n" +" length of the delay in milliseconds.\n" +"\n" +"Sets the number of milliseconds to wait after reading an escape character,\n" +"to distinguish between an individual escape character entered on the\n" +"keyboard from escape sequences sent by cursor and function keys."); + +#define _CURSES_SET_ESCDELAY_METHODDEF \ + {"set_escdelay", (PyCFunction)_curses_set_escdelay, METH_O, _curses_set_escdelay__doc__}, + +static PyObject * +_curses_set_escdelay_impl(PyObject *module, int ms); + +static PyObject * +_curses_set_escdelay(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + int ms; + + if (PyFloat_Check(arg)) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + ms = _PyLong_AsInt(arg); + if (ms == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = _curses_set_escdelay_impl(module, ms); + +exit: + return return_value; +} + +#endif /* (defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102) */ + +#if (defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102) + +PyDoc_STRVAR(_curses_get_tabsize__doc__, +"get_tabsize($module, /)\n" +"--\n" +"\n" +"Gets the curses TABSIZE setting.\n" +"\n" +"Gets the number of columns used by the curses library when converting a tab\n" +"character to spaces as it adds the tab to a window."); + +#define _CURSES_GET_TABSIZE_METHODDEF \ + {"get_tabsize", (PyCFunction)_curses_get_tabsize, METH_NOARGS, _curses_get_tabsize__doc__}, + +static PyObject * +_curses_get_tabsize_impl(PyObject *module); + +static PyObject * +_curses_get_tabsize(PyObject *module, PyObject *Py_UNUSED(ignored)) +{ + return _curses_get_tabsize_impl(module); +} + +#endif /* (defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102) */ + +#if (defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102) + +PyDoc_STRVAR(_curses_set_tabsize__doc__, +"set_tabsize($module, size, /)\n" +"--\n" +"\n" +"Sets the curses TABSIZE setting.\n" +"\n" +" size\n" +" rendered cell width of a tab character.\n" +"\n" +"Sets the number of columns used by the curses library when converting a tab\n" +"character to spaces as it adds the tab to a window."); + +#define _CURSES_SET_TABSIZE_METHODDEF \ + {"set_tabsize", (PyCFunction)_curses_set_tabsize, METH_O, _curses_set_tabsize__doc__}, + +static PyObject * +_curses_set_tabsize_impl(PyObject *module, int size); + +static PyObject * +_curses_set_tabsize(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + int size; + + if (PyFloat_Check(arg)) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + size = _PyLong_AsInt(arg); + if (size == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = _curses_set_tabsize_impl(module, size); + +exit: + return return_value; +} + +#endif /* (defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102) */ + PyDoc_STRVAR(_curses_intrflush__doc__, "intrflush($module, flag, /)\n" "--\n" @@ -3799,23 +3937,13 @@ PyDoc_STRVAR(_curses_update_lines_cols__doc__, #define _CURSES_UPDATE_LINES_COLS_METHODDEF \ {"update_lines_cols", (PyCFunction)_curses_update_lines_cols, METH_NOARGS, _curses_update_lines_cols__doc__}, -static int +static PyObject * _curses_update_lines_cols_impl(PyObject *module); static PyObject * _curses_update_lines_cols(PyObject *module, PyObject *Py_UNUSED(ignored)) { - PyObject *return_value = NULL; - int _return_value; - - _return_value = _curses_update_lines_cols_impl(module); - if ((_return_value == -1) && PyErr_Occurred()) { - goto exit; - } - return_value = PyLong_FromLong((long)_return_value); - -exit: - return return_value; + return _curses_update_lines_cols_impl(module); } #endif /* (defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)) */ @@ -4526,6 +4654,22 @@ _curses_use_default_colors(PyObject *module, PyObject *Py_UNUSED(ignored)) #define _CURSES_HAS_KEY_METHODDEF #endif /* !defined(_CURSES_HAS_KEY_METHODDEF) */ +#ifndef _CURSES_GET_ESCDELAY_METHODDEF + #define _CURSES_GET_ESCDELAY_METHODDEF +#endif /* !defined(_CURSES_GET_ESCDELAY_METHODDEF) */ + +#ifndef _CURSES_SET_ESCDELAY_METHODDEF + #define _CURSES_SET_ESCDELAY_METHODDEF +#endif /* !defined(_CURSES_SET_ESCDELAY_METHODDEF) */ + +#ifndef _CURSES_GET_TABSIZE_METHODDEF + #define _CURSES_GET_TABSIZE_METHODDEF +#endif /* !defined(_CURSES_GET_TABSIZE_METHODDEF) */ + +#ifndef _CURSES_SET_TABSIZE_METHODDEF + #define _CURSES_SET_TABSIZE_METHODDEF +#endif /* !defined(_CURSES_SET_TABSIZE_METHODDEF) */ + #ifndef _CURSES_IS_TERM_RESIZED_METHODDEF #define _CURSES_IS_TERM_RESIZED_METHODDEF #endif /* !defined(_CURSES_IS_TERM_RESIZED_METHODDEF) */ @@ -4569,4 +4713,4 @@ _curses_use_default_colors(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef _CURSES_USE_DEFAULT_COLORS_METHODDEF #define _CURSES_USE_DEFAULT_COLORS_METHODDEF #endif /* !defined(_CURSES_USE_DEFAULT_COLORS_METHODDEF) */ -/*[clinic end generated code: output=e5b3502f1d38dff0 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=5e739120041df368 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_datetimemodule.c.h b/Modules/clinic/_datetimemodule.c.h index 447036ca03814c8116b1f858103d03328a857c83..973a4ea025347f75478eaadf36998bb6f89de56d 100644 --- a/Modules/clinic/_datetimemodule.c.h +++ b/Modules/clinic/_datetimemodule.c.h @@ -14,6 +14,60 @@ PyDoc_STRVAR(datetime_date_fromtimestamp__doc__, #define DATETIME_DATE_FROMTIMESTAMP_METHODDEF \ {"fromtimestamp", (PyCFunction)datetime_date_fromtimestamp, METH_O|METH_CLASS, datetime_date_fromtimestamp__doc__}, +static PyObject * +iso_calendar_date_new_impl(PyTypeObject *type, int year, int week, + int weekday); + +static PyObject * +iso_calendar_date_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"year", "week", "weekday", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "IsoCalendarDate", 0}; + PyObject *argsbuf[3]; + PyObject * const *fastargs; + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + int year; + int week; + int weekday; + + fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 3, 3, 0, argsbuf); + if (!fastargs) { + goto exit; + } + if (PyFloat_Check(fastargs[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + year = _PyLong_AsInt(fastargs[0]); + if (year == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyFloat_Check(fastargs[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + week = _PyLong_AsInt(fastargs[1]); + if (week == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyFloat_Check(fastargs[2])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + weekday = _PyLong_AsInt(fastargs[2]); + if (weekday == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = iso_calendar_date_new_impl(type, year, week, weekday); + +exit: + return return_value; +} + PyDoc_STRVAR(datetime_datetime_now__doc__, "now($type, /, tz=None)\n" "--\n" @@ -55,4 +109,4 @@ skip_optional_pos: exit: return return_value; } -/*[clinic end generated code: output=aae916ab728ca85b input=a9049054013a1b77]*/ +/*[clinic end generated code: output=5e17549f29a439a5 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_elementtree.c.h b/Modules/clinic/_elementtree.c.h index 0bc4bb5d15ce7e1fac3bb32378f07f562dc546b3..825416f4a3982dfcbc41745493ef036697247166 100644 --- a/Modules/clinic/_elementtree.c.h +++ b/Modules/clinic/_elementtree.c.h @@ -355,23 +355,6 @@ exit: return return_value; } -PyDoc_STRVAR(_elementtree_Element_getchildren__doc__, -"getchildren($self, /)\n" -"--\n" -"\n"); - -#define _ELEMENTTREE_ELEMENT_GETCHILDREN_METHODDEF \ - {"getchildren", (PyCFunction)_elementtree_Element_getchildren, METH_NOARGS, _elementtree_Element_getchildren__doc__}, - -static PyObject * -_elementtree_Element_getchildren_impl(ElementObject *self); - -static PyObject * -_elementtree_Element_getchildren(ElementObject *self, PyObject *Py_UNUSED(ignored)) -{ - return _elementtree_Element_getchildren_impl(self); -} - PyDoc_STRVAR(_elementtree_Element_iter__doc__, "iter($self, /, tag=None)\n" "--\n" @@ -408,42 +391,6 @@ exit: return return_value; } -PyDoc_STRVAR(_elementtree_Element_getiterator__doc__, -"getiterator($self, /, tag=None)\n" -"--\n" -"\n"); - -#define _ELEMENTTREE_ELEMENT_GETITERATOR_METHODDEF \ - {"getiterator", (PyCFunction)(void(*)(void))_elementtree_Element_getiterator, METH_FASTCALL|METH_KEYWORDS, _elementtree_Element_getiterator__doc__}, - -static PyObject * -_elementtree_Element_getiterator_impl(ElementObject *self, PyObject *tag); - -static PyObject * -_elementtree_Element_getiterator(ElementObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) -{ - PyObject *return_value = NULL; - static const char * const _keywords[] = {"tag", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "getiterator", 0}; - PyObject *argsbuf[1]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; - PyObject *tag = Py_None; - - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); - if (!args) { - goto exit; - } - if (!noptargs) { - goto skip_optional_pos; - } - tag = args[0]; -skip_optional_pos: - return_value = _elementtree_Element_getiterator_impl(self, tag); - -exit: - return return_value; -} - PyDoc_STRVAR(_elementtree_Element_itertext__doc__, "itertext($self, /)\n" "--\n" @@ -568,6 +515,10 @@ _elementtree_Element_makeelement(ElementObject *self, PyObject *const *args, Py_ goto exit; } tag = args[0]; + if (!PyDict_Check(args[1])) { + _PyArg_BadArgument("makeelement", "argument 2", "dict", args[1]); + goto exit; + } attrib = args[1]; return_value = _elementtree_Element_makeelement_impl(self, tag, attrib); @@ -814,7 +765,7 @@ _elementtree_TreeBuilder_close(TreeBuilderObject *self, PyObject *Py_UNUSED(igno } PyDoc_STRVAR(_elementtree_TreeBuilder_start__doc__, -"start($self, tag, attrs=None, /)\n" +"start($self, tag, attrs, /)\n" "--\n" "\n"); @@ -830,17 +781,17 @@ _elementtree_TreeBuilder_start(TreeBuilderObject *self, PyObject *const *args, P { PyObject *return_value = NULL; PyObject *tag; - PyObject *attrs = Py_None; + PyObject *attrs; - if (!_PyArg_CheckPositional("start", nargs, 1, 2)) { + if (!_PyArg_CheckPositional("start", nargs, 2, 2)) { goto exit; } tag = args[0]; - if (nargs < 2) { - goto skip_optional; + if (!PyDict_Check(args[1])) { + _PyArg_BadArgument("start", "argument 2", "dict", args[1]); + goto exit; } attrs = args[1]; -skip_optional: return_value = _elementtree_TreeBuilder_start_impl(self, tag, attrs); exit: @@ -969,4 +920,4 @@ skip_optional: exit: return return_value; } -/*[clinic end generated code: output=1443ed7bb9f9e03e input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b7f6a32462fc42a9 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_hashopenssl.c.h b/Modules/clinic/_hashopenssl.c.h index 9aaea47e8328edd512f129c16809186f6b37754d..68aa765e529aefcf83b9bd3b9581d580b45d9626 100644 --- a/Modules/clinic/_hashopenssl.c.h +++ b/Modules/clinic/_hashopenssl.c.h @@ -65,8 +65,112 @@ PyDoc_STRVAR(EVP_update__doc__, #define EVP_UPDATE_METHODDEF \ {"update", (PyCFunction)EVP_update, METH_O, EVP_update__doc__}, +#if defined(PY_OPENSSL_HAS_SHAKE) + +PyDoc_STRVAR(EVPXOF_digest__doc__, +"digest($self, /, length)\n" +"--\n" +"\n" +"Return the digest value as a bytes object."); + +#define EVPXOF_DIGEST_METHODDEF \ + {"digest", (PyCFunction)(void(*)(void))EVPXOF_digest, METH_FASTCALL|METH_KEYWORDS, EVPXOF_digest__doc__}, + +static PyObject * +EVPXOF_digest_impl(EVPobject *self, Py_ssize_t length); + +static PyObject * +EVPXOF_digest(EVPobject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"length", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "digest", 0}; + PyObject *argsbuf[1]; + Py_ssize_t length; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[0]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + length = ival; + } + return_value = EVPXOF_digest_impl(self, length); + +exit: + return return_value; +} + +#endif /* defined(PY_OPENSSL_HAS_SHAKE) */ + +#if defined(PY_OPENSSL_HAS_SHAKE) + +PyDoc_STRVAR(EVPXOF_hexdigest__doc__, +"hexdigest($self, /, length)\n" +"--\n" +"\n" +"Return the digest value as a string of hexadecimal digits."); + +#define EVPXOF_HEXDIGEST_METHODDEF \ + {"hexdigest", (PyCFunction)(void(*)(void))EVPXOF_hexdigest, METH_FASTCALL|METH_KEYWORDS, EVPXOF_hexdigest__doc__}, + +static PyObject * +EVPXOF_hexdigest_impl(EVPobject *self, Py_ssize_t length); + +static PyObject * +EVPXOF_hexdigest(EVPobject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"length", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "hexdigest", 0}; + PyObject *argsbuf[1]; + Py_ssize_t length; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[0]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + length = ival; + } + return_value = EVPXOF_hexdigest_impl(self, length); + +exit: + return return_value; +} + +#endif /* defined(PY_OPENSSL_HAS_SHAKE) */ + PyDoc_STRVAR(EVP_new__doc__, -"new($module, /, name, string=b\'\')\n" +"new($module, /, name, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" "Return a new hash object using the named algorithm.\n" @@ -80,18 +184,20 @@ PyDoc_STRVAR(EVP_new__doc__, {"new", (PyCFunction)(void(*)(void))EVP_new, METH_FASTCALL|METH_KEYWORDS, EVP_new__doc__}, static PyObject * -EVP_new_impl(PyObject *module, PyObject *name_obj, PyObject *data_obj); +EVP_new_impl(PyObject *module, PyObject *name_obj, PyObject *data_obj, + int usedforsecurity); static PyObject * EVP_new(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"name", "string", NULL}; + static const char * const _keywords[] = {"name", "string", "usedforsecurity", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "new", 0}; - PyObject *argsbuf[2]; + PyObject *argsbuf[3]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; PyObject *name_obj; PyObject *data_obj = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf); if (!args) { @@ -101,16 +207,29 @@ EVP_new(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwn if (!noptargs) { goto skip_optional_pos; } - data_obj = args[1]; + if (args[1]) { + data_obj = args[1]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = EVP_new_impl(module, name_obj, data_obj); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[2]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = EVP_new_impl(module, name_obj, data_obj, usedforsecurity); exit: return return_value; } PyDoc_STRVAR(_hashlib_openssl_md5__doc__, -"openssl_md5($module, /, string=b\'\')\n" +"openssl_md5($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" "Returns a md5 hash object; optionally initialized with a string"); @@ -119,54 +238,389 @@ PyDoc_STRVAR(_hashlib_openssl_md5__doc__, {"openssl_md5", (PyCFunction)(void(*)(void))_hashlib_openssl_md5, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_md5__doc__}, static PyObject * -_hashlib_openssl_md5_impl(PyObject *module, PyObject *data_obj); +_hashlib_openssl_md5_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); static PyObject * _hashlib_openssl_md5(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "openssl_md5", 0}; - PyObject *argsbuf[1]; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *data_obj = NULL; + int usedforsecurity = 1; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_md5_impl(module, data_obj, usedforsecurity); + +exit: + return return_value; +} + +PyDoc_STRVAR(_hashlib_openssl_sha1__doc__, +"openssl_sha1($module, /, string=b\'\', *, usedforsecurity=True)\n" +"--\n" +"\n" +"Returns a sha1 hash object; optionally initialized with a string"); + +#define _HASHLIB_OPENSSL_SHA1_METHODDEF \ + {"openssl_sha1", (PyCFunction)(void(*)(void))_hashlib_openssl_sha1, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha1__doc__}, + +static PyObject * +_hashlib_openssl_sha1_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); + +static PyObject * +_hashlib_openssl_sha1(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha1", 0}; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *data_obj = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { goto exit; } if (!noptargs) { - goto skip_optional_pos; + goto skip_optional_pos; + } + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_sha1_impl(module, data_obj, usedforsecurity); + +exit: + return return_value; +} + +PyDoc_STRVAR(_hashlib_openssl_sha224__doc__, +"openssl_sha224($module, /, string=b\'\', *, usedforsecurity=True)\n" +"--\n" +"\n" +"Returns a sha224 hash object; optionally initialized with a string"); + +#define _HASHLIB_OPENSSL_SHA224_METHODDEF \ + {"openssl_sha224", (PyCFunction)(void(*)(void))_hashlib_openssl_sha224, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha224__doc__}, + +static PyObject * +_hashlib_openssl_sha224_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); + +static PyObject * +_hashlib_openssl_sha224(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha224", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *data_obj = NULL; + int usedforsecurity = 1; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_sha224_impl(module, data_obj, usedforsecurity); + +exit: + return return_value; +} + +PyDoc_STRVAR(_hashlib_openssl_sha256__doc__, +"openssl_sha256($module, /, string=b\'\', *, usedforsecurity=True)\n" +"--\n" +"\n" +"Returns a sha256 hash object; optionally initialized with a string"); + +#define _HASHLIB_OPENSSL_SHA256_METHODDEF \ + {"openssl_sha256", (PyCFunction)(void(*)(void))_hashlib_openssl_sha256, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha256__doc__}, + +static PyObject * +_hashlib_openssl_sha256_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); + +static PyObject * +_hashlib_openssl_sha256(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha256", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *data_obj = NULL; + int usedforsecurity = 1; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_sha256_impl(module, data_obj, usedforsecurity); + +exit: + return return_value; +} + +PyDoc_STRVAR(_hashlib_openssl_sha384__doc__, +"openssl_sha384($module, /, string=b\'\', *, usedforsecurity=True)\n" +"--\n" +"\n" +"Returns a sha384 hash object; optionally initialized with a string"); + +#define _HASHLIB_OPENSSL_SHA384_METHODDEF \ + {"openssl_sha384", (PyCFunction)(void(*)(void))_hashlib_openssl_sha384, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha384__doc__}, + +static PyObject * +_hashlib_openssl_sha384_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); + +static PyObject * +_hashlib_openssl_sha384(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha384", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *data_obj = NULL; + int usedforsecurity = 1; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_sha384_impl(module, data_obj, usedforsecurity); + +exit: + return return_value; +} + +PyDoc_STRVAR(_hashlib_openssl_sha512__doc__, +"openssl_sha512($module, /, string=b\'\', *, usedforsecurity=True)\n" +"--\n" +"\n" +"Returns a sha512 hash object; optionally initialized with a string"); + +#define _HASHLIB_OPENSSL_SHA512_METHODDEF \ + {"openssl_sha512", (PyCFunction)(void(*)(void))_hashlib_openssl_sha512, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha512__doc__}, + +static PyObject * +_hashlib_openssl_sha512_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); + +static PyObject * +_hashlib_openssl_sha512(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha512", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *data_obj = NULL; + int usedforsecurity = 1; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_sha512_impl(module, data_obj, usedforsecurity); + +exit: + return return_value; +} + +#if defined(PY_OPENSSL_HAS_SHA3) + +PyDoc_STRVAR(_hashlib_openssl_sha3_224__doc__, +"openssl_sha3_224($module, /, string=b\'\', *, usedforsecurity=True)\n" +"--\n" +"\n" +"Returns a sha3-224 hash object; optionally initialized with a string"); + +#define _HASHLIB_OPENSSL_SHA3_224_METHODDEF \ + {"openssl_sha3_224", (PyCFunction)(void(*)(void))_hashlib_openssl_sha3_224, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha3_224__doc__}, + +static PyObject * +_hashlib_openssl_sha3_224_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); + +static PyObject * +_hashlib_openssl_sha3_224(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha3_224", 0}; + PyObject *argsbuf[2]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + PyObject *data_obj = NULL; + int usedforsecurity = 1; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } +skip_optional_pos: + if (!noptargs) { + goto skip_optional_kwonly; } - data_obj = args[0]; -skip_optional_pos: - return_value = _hashlib_openssl_md5_impl(module, data_obj); + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_sha3_224_impl(module, data_obj, usedforsecurity); exit: return return_value; } -PyDoc_STRVAR(_hashlib_openssl_sha1__doc__, -"openssl_sha1($module, /, string=b\'\')\n" +#endif /* defined(PY_OPENSSL_HAS_SHA3) */ + +#if defined(PY_OPENSSL_HAS_SHA3) + +PyDoc_STRVAR(_hashlib_openssl_sha3_256__doc__, +"openssl_sha3_256($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" -"Returns a sha1 hash object; optionally initialized with a string"); +"Returns a sha3-256 hash object; optionally initialized with a string"); -#define _HASHLIB_OPENSSL_SHA1_METHODDEF \ - {"openssl_sha1", (PyCFunction)(void(*)(void))_hashlib_openssl_sha1, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha1__doc__}, +#define _HASHLIB_OPENSSL_SHA3_256_METHODDEF \ + {"openssl_sha3_256", (PyCFunction)(void(*)(void))_hashlib_openssl_sha3_256, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha3_256__doc__}, static PyObject * -_hashlib_openssl_sha1_impl(PyObject *module, PyObject *data_obj); +_hashlib_openssl_sha3_256_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); static PyObject * -_hashlib_openssl_sha1(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_hashlib_openssl_sha3_256(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha1", 0}; - PyObject *argsbuf[1]; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha3_256", 0}; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *data_obj = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -175,35 +629,54 @@ _hashlib_openssl_sha1(PyObject *module, PyObject *const *args, Py_ssize_t nargs, if (!noptargs) { goto skip_optional_pos; } - data_obj = args[0]; + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _hashlib_openssl_sha1_impl(module, data_obj); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_sha3_256_impl(module, data_obj, usedforsecurity); exit: return return_value; } -PyDoc_STRVAR(_hashlib_openssl_sha224__doc__, -"openssl_sha224($module, /, string=b\'\')\n" +#endif /* defined(PY_OPENSSL_HAS_SHA3) */ + +#if defined(PY_OPENSSL_HAS_SHA3) + +PyDoc_STRVAR(_hashlib_openssl_sha3_384__doc__, +"openssl_sha3_384($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" -"Returns a sha224 hash object; optionally initialized with a string"); +"Returns a sha3-384 hash object; optionally initialized with a string"); -#define _HASHLIB_OPENSSL_SHA224_METHODDEF \ - {"openssl_sha224", (PyCFunction)(void(*)(void))_hashlib_openssl_sha224, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha224__doc__}, +#define _HASHLIB_OPENSSL_SHA3_384_METHODDEF \ + {"openssl_sha3_384", (PyCFunction)(void(*)(void))_hashlib_openssl_sha3_384, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha3_384__doc__}, static PyObject * -_hashlib_openssl_sha224_impl(PyObject *module, PyObject *data_obj); +_hashlib_openssl_sha3_384_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); static PyObject * -_hashlib_openssl_sha224(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_hashlib_openssl_sha3_384(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha224", 0}; - PyObject *argsbuf[1]; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha3_384", 0}; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *data_obj = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -212,35 +685,54 @@ _hashlib_openssl_sha224(PyObject *module, PyObject *const *args, Py_ssize_t narg if (!noptargs) { goto skip_optional_pos; } - data_obj = args[0]; + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _hashlib_openssl_sha224_impl(module, data_obj); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_sha3_384_impl(module, data_obj, usedforsecurity); exit: return return_value; } -PyDoc_STRVAR(_hashlib_openssl_sha256__doc__, -"openssl_sha256($module, /, string=b\'\')\n" +#endif /* defined(PY_OPENSSL_HAS_SHA3) */ + +#if defined(PY_OPENSSL_HAS_SHA3) + +PyDoc_STRVAR(_hashlib_openssl_sha3_512__doc__, +"openssl_sha3_512($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" -"Returns a sha256 hash object; optionally initialized with a string"); +"Returns a sha3-512 hash object; optionally initialized with a string"); -#define _HASHLIB_OPENSSL_SHA256_METHODDEF \ - {"openssl_sha256", (PyCFunction)(void(*)(void))_hashlib_openssl_sha256, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha256__doc__}, +#define _HASHLIB_OPENSSL_SHA3_512_METHODDEF \ + {"openssl_sha3_512", (PyCFunction)(void(*)(void))_hashlib_openssl_sha3_512, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha3_512__doc__}, static PyObject * -_hashlib_openssl_sha256_impl(PyObject *module, PyObject *data_obj); +_hashlib_openssl_sha3_512_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); static PyObject * -_hashlib_openssl_sha256(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_hashlib_openssl_sha3_512(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha256", 0}; - PyObject *argsbuf[1]; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha3_512", 0}; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *data_obj = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -249,35 +741,54 @@ _hashlib_openssl_sha256(PyObject *module, PyObject *const *args, Py_ssize_t narg if (!noptargs) { goto skip_optional_pos; } - data_obj = args[0]; + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _hashlib_openssl_sha256_impl(module, data_obj); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_sha3_512_impl(module, data_obj, usedforsecurity); exit: return return_value; } -PyDoc_STRVAR(_hashlib_openssl_sha384__doc__, -"openssl_sha384($module, /, string=b\'\')\n" +#endif /* defined(PY_OPENSSL_HAS_SHA3) */ + +#if defined(PY_OPENSSL_HAS_SHAKE) + +PyDoc_STRVAR(_hashlib_openssl_shake_128__doc__, +"openssl_shake_128($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" -"Returns a sha384 hash object; optionally initialized with a string"); +"Returns a shake-128 variable hash object; optionally initialized with a string"); -#define _HASHLIB_OPENSSL_SHA384_METHODDEF \ - {"openssl_sha384", (PyCFunction)(void(*)(void))_hashlib_openssl_sha384, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha384__doc__}, +#define _HASHLIB_OPENSSL_SHAKE_128_METHODDEF \ + {"openssl_shake_128", (PyCFunction)(void(*)(void))_hashlib_openssl_shake_128, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_shake_128__doc__}, static PyObject * -_hashlib_openssl_sha384_impl(PyObject *module, PyObject *data_obj); +_hashlib_openssl_shake_128_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); static PyObject * -_hashlib_openssl_sha384(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_hashlib_openssl_shake_128(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha384", 0}; - PyObject *argsbuf[1]; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_shake_128", 0}; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *data_obj = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -286,35 +797,54 @@ _hashlib_openssl_sha384(PyObject *module, PyObject *const *args, Py_ssize_t narg if (!noptargs) { goto skip_optional_pos; } - data_obj = args[0]; + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _hashlib_openssl_sha384_impl(module, data_obj); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_shake_128_impl(module, data_obj, usedforsecurity); exit: return return_value; } -PyDoc_STRVAR(_hashlib_openssl_sha512__doc__, -"openssl_sha512($module, /, string=b\'\')\n" +#endif /* defined(PY_OPENSSL_HAS_SHAKE) */ + +#if defined(PY_OPENSSL_HAS_SHAKE) + +PyDoc_STRVAR(_hashlib_openssl_shake_256__doc__, +"openssl_shake_256($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" -"Returns a sha512 hash object; optionally initialized with a string"); +"Returns a shake-256 variable hash object; optionally initialized with a string"); -#define _HASHLIB_OPENSSL_SHA512_METHODDEF \ - {"openssl_sha512", (PyCFunction)(void(*)(void))_hashlib_openssl_sha512, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_sha512__doc__}, +#define _HASHLIB_OPENSSL_SHAKE_256_METHODDEF \ + {"openssl_shake_256", (PyCFunction)(void(*)(void))_hashlib_openssl_shake_256, METH_FASTCALL|METH_KEYWORDS, _hashlib_openssl_shake_256__doc__}, static PyObject * -_hashlib_openssl_sha512_impl(PyObject *module, PyObject *data_obj); +_hashlib_openssl_shake_256_impl(PyObject *module, PyObject *data_obj, + int usedforsecurity); static PyObject * -_hashlib_openssl_sha512(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_hashlib_openssl_shake_256(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "openssl_sha512", 0}; - PyObject *argsbuf[1]; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "openssl_shake_256", 0}; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *data_obj = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -323,14 +853,29 @@ _hashlib_openssl_sha512(PyObject *module, PyObject *const *args, Py_ssize_t narg if (!noptargs) { goto skip_optional_pos; } - data_obj = args[0]; + if (args[0]) { + data_obj = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _hashlib_openssl_sha512_impl(module, data_obj); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _hashlib_openssl_shake_256_impl(module, data_obj, usedforsecurity); exit: return return_value; } +#endif /* defined(PY_OPENSSL_HAS_SHAKE) */ + PyDoc_STRVAR(pbkdf2_hmac__doc__, "pbkdf2_hmac($module, /, hash_name, password, salt, iterations,\n" " dklen=None)\n" @@ -550,21 +1095,21 @@ exit: #endif /* (OPENSSL_VERSION_NUMBER > 0x10100000L && !defined(OPENSSL_NO_SCRYPT) && !defined(LIBRESSL_VERSION_NUMBER)) */ -PyDoc_STRVAR(_hashlib_hmac_digest__doc__, +PyDoc_STRVAR(_hashlib_hmac_singleshot__doc__, "hmac_digest($module, /, key, msg, digest)\n" "--\n" "\n" "Single-shot HMAC."); -#define _HASHLIB_HMAC_DIGEST_METHODDEF \ - {"hmac_digest", (PyCFunction)(void(*)(void))_hashlib_hmac_digest, METH_FASTCALL|METH_KEYWORDS, _hashlib_hmac_digest__doc__}, +#define _HASHLIB_HMAC_SINGLESHOT_METHODDEF \ + {"hmac_digest", (PyCFunction)(void(*)(void))_hashlib_hmac_singleshot, METH_FASTCALL|METH_KEYWORDS, _hashlib_hmac_singleshot__doc__}, static PyObject * -_hashlib_hmac_digest_impl(PyObject *module, Py_buffer *key, Py_buffer *msg, - const char *digest); +_hashlib_hmac_singleshot_impl(PyObject *module, Py_buffer *key, + Py_buffer *msg, const char *digest); static PyObject * -_hashlib_hmac_digest(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +_hashlib_hmac_singleshot(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; static const char * const _keywords[] = {"key", "msg", "digest", NULL}; @@ -605,7 +1150,7 @@ _hashlib_hmac_digest(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyErr_SetString(PyExc_ValueError, "embedded null character"); goto exit; } - return_value = _hashlib_hmac_digest_impl(module, &key, &msg, digest); + return_value = _hashlib_hmac_singleshot_impl(module, &key, &msg, digest); exit: /* Cleanup for key */ @@ -620,7 +1165,281 @@ exit: return return_value; } +PyDoc_STRVAR(_hashlib_hmac_new__doc__, +"hmac_new($module, /, key, msg=b\'\', digestmod=None)\n" +"--\n" +"\n" +"Return a new hmac object."); + +#define _HASHLIB_HMAC_NEW_METHODDEF \ + {"hmac_new", (PyCFunction)(void(*)(void))_hashlib_hmac_new, METH_FASTCALL|METH_KEYWORDS, _hashlib_hmac_new__doc__}, + +static PyObject * +_hashlib_hmac_new_impl(PyObject *module, Py_buffer *key, PyObject *msg_obj, + const char *digestmod); + +static PyObject * +_hashlib_hmac_new(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"key", "msg", "digestmod", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "hmac_new", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; + Py_buffer key = {NULL, NULL}; + PyObject *msg_obj = NULL; + const char *digestmod = NULL; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyObject_GetBuffer(args[0], &key, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&key, 'C')) { + _PyArg_BadArgument("hmac_new", "argument 'key'", "contiguous buffer", args[0]); + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[1]) { + msg_obj = args[1]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (!PyUnicode_Check(args[2])) { + _PyArg_BadArgument("hmac_new", "argument 'digestmod'", "str", args[2]); + goto exit; + } + Py_ssize_t digestmod_length; + digestmod = PyUnicode_AsUTF8AndSize(args[2], &digestmod_length); + if (digestmod == NULL) { + goto exit; + } + if (strlen(digestmod) != (size_t)digestmod_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } +skip_optional_pos: + return_value = _hashlib_hmac_new_impl(module, &key, msg_obj, digestmod); + +exit: + /* Cleanup for key */ + if (key.obj) { + PyBuffer_Release(&key); + } + + return return_value; +} + +PyDoc_STRVAR(_hashlib_HMAC_copy__doc__, +"copy($self, /)\n" +"--\n" +"\n" +"Return a copy (\"clone\") of the HMAC object."); + +#define _HASHLIB_HMAC_COPY_METHODDEF \ + {"copy", (PyCFunction)_hashlib_HMAC_copy, METH_NOARGS, _hashlib_HMAC_copy__doc__}, + +static PyObject * +_hashlib_HMAC_copy_impl(HMACobject *self); + +static PyObject * +_hashlib_HMAC_copy(HMACobject *self, PyObject *Py_UNUSED(ignored)) +{ + return _hashlib_HMAC_copy_impl(self); +} + +PyDoc_STRVAR(_hashlib_HMAC_update__doc__, +"update($self, /, msg)\n" +"--\n" +"\n" +"Update the HMAC object with msg."); + +#define _HASHLIB_HMAC_UPDATE_METHODDEF \ + {"update", (PyCFunction)(void(*)(void))_hashlib_HMAC_update, METH_FASTCALL|METH_KEYWORDS, _hashlib_HMAC_update__doc__}, + +static PyObject * +_hashlib_HMAC_update_impl(HMACobject *self, PyObject *msg); + +static PyObject * +_hashlib_HMAC_update(HMACobject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"msg", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "update", 0}; + PyObject *argsbuf[1]; + PyObject *msg; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + msg = args[0]; + return_value = _hashlib_HMAC_update_impl(self, msg); + +exit: + return return_value; +} + +PyDoc_STRVAR(_hashlib_HMAC_digest__doc__, +"digest($self, /)\n" +"--\n" +"\n" +"Return the digest of the bytes passed to the update() method so far."); + +#define _HASHLIB_HMAC_DIGEST_METHODDEF \ + {"digest", (PyCFunction)_hashlib_HMAC_digest, METH_NOARGS, _hashlib_HMAC_digest__doc__}, + +static PyObject * +_hashlib_HMAC_digest_impl(HMACobject *self); + +static PyObject * +_hashlib_HMAC_digest(HMACobject *self, PyObject *Py_UNUSED(ignored)) +{ + return _hashlib_HMAC_digest_impl(self); +} + +PyDoc_STRVAR(_hashlib_HMAC_hexdigest__doc__, +"hexdigest($self, /)\n" +"--\n" +"\n" +"Return hexadecimal digest of the bytes passed to the update() method so far.\n" +"\n" +"This may be used to exchange the value safely in email or other non-binary\n" +"environments."); + +#define _HASHLIB_HMAC_HEXDIGEST_METHODDEF \ + {"hexdigest", (PyCFunction)_hashlib_HMAC_hexdigest, METH_NOARGS, _hashlib_HMAC_hexdigest__doc__}, + +static PyObject * +_hashlib_HMAC_hexdigest_impl(HMACobject *self); + +static PyObject * +_hashlib_HMAC_hexdigest(HMACobject *self, PyObject *Py_UNUSED(ignored)) +{ + return _hashlib_HMAC_hexdigest_impl(self); +} + +#if !defined(LIBRESSL_VERSION_NUMBER) + +PyDoc_STRVAR(_hashlib_get_fips_mode__doc__, +"get_fips_mode($module, /)\n" +"--\n" +"\n" +"Determine the OpenSSL FIPS mode of operation.\n" +"\n" +"For OpenSSL 3.0.0 and newer it returns the state of the default provider\n" +"in the default OSSL context. It\'s not quite the same as FIPS_mode() but good\n" +"enough for unittests.\n" +"\n" +"Effectively any non-zero return value indicates FIPS mode;\n" +"values other than 1 may have additional significance."); + +#define _HASHLIB_GET_FIPS_MODE_METHODDEF \ + {"get_fips_mode", (PyCFunction)_hashlib_get_fips_mode, METH_NOARGS, _hashlib_get_fips_mode__doc__}, + +static int +_hashlib_get_fips_mode_impl(PyObject *module); + +static PyObject * +_hashlib_get_fips_mode(PyObject *module, PyObject *Py_UNUSED(ignored)) +{ + PyObject *return_value = NULL; + int _return_value; + + _return_value = _hashlib_get_fips_mode_impl(module); + if ((_return_value == -1) && PyErr_Occurred()) { + goto exit; + } + return_value = PyLong_FromLong((long)_return_value); + +exit: + return return_value; +} + +#endif /* !defined(LIBRESSL_VERSION_NUMBER) */ + +PyDoc_STRVAR(_hashlib_compare_digest__doc__, +"compare_digest($module, a, b, /)\n" +"--\n" +"\n" +"Return \'a == b\'.\n" +"\n" +"This function uses an approach designed to prevent\n" +"timing analysis, making it appropriate for cryptography.\n" +"\n" +"a and b must both be of the same type: either str (ASCII only),\n" +"or any bytes-like object.\n" +"\n" +"Note: If a and b are of different lengths, or if an error occurs,\n" +"a timing attack could theoretically reveal information about the\n" +"types and lengths of a and b--but not their values."); + +#define _HASHLIB_COMPARE_DIGEST_METHODDEF \ + {"compare_digest", (PyCFunction)(void(*)(void))_hashlib_compare_digest, METH_FASTCALL, _hashlib_compare_digest__doc__}, + +static PyObject * +_hashlib_compare_digest_impl(PyObject *module, PyObject *a, PyObject *b); + +static PyObject * +_hashlib_compare_digest(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyObject *a; + PyObject *b; + + if (!_PyArg_CheckPositional("compare_digest", nargs, 2, 2)) { + goto exit; + } + a = args[0]; + b = args[1]; + return_value = _hashlib_compare_digest_impl(module, a, b); + +exit: + return return_value; +} + +#ifndef EVPXOF_DIGEST_METHODDEF + #define EVPXOF_DIGEST_METHODDEF +#endif /* !defined(EVPXOF_DIGEST_METHODDEF) */ + +#ifndef EVPXOF_HEXDIGEST_METHODDEF + #define EVPXOF_HEXDIGEST_METHODDEF +#endif /* !defined(EVPXOF_HEXDIGEST_METHODDEF) */ + +#ifndef _HASHLIB_OPENSSL_SHA3_224_METHODDEF + #define _HASHLIB_OPENSSL_SHA3_224_METHODDEF +#endif /* !defined(_HASHLIB_OPENSSL_SHA3_224_METHODDEF) */ + +#ifndef _HASHLIB_OPENSSL_SHA3_256_METHODDEF + #define _HASHLIB_OPENSSL_SHA3_256_METHODDEF +#endif /* !defined(_HASHLIB_OPENSSL_SHA3_256_METHODDEF) */ + +#ifndef _HASHLIB_OPENSSL_SHA3_384_METHODDEF + #define _HASHLIB_OPENSSL_SHA3_384_METHODDEF +#endif /* !defined(_HASHLIB_OPENSSL_SHA3_384_METHODDEF) */ + +#ifndef _HASHLIB_OPENSSL_SHA3_512_METHODDEF + #define _HASHLIB_OPENSSL_SHA3_512_METHODDEF +#endif /* !defined(_HASHLIB_OPENSSL_SHA3_512_METHODDEF) */ + +#ifndef _HASHLIB_OPENSSL_SHAKE_128_METHODDEF + #define _HASHLIB_OPENSSL_SHAKE_128_METHODDEF +#endif /* !defined(_HASHLIB_OPENSSL_SHAKE_128_METHODDEF) */ + +#ifndef _HASHLIB_OPENSSL_SHAKE_256_METHODDEF + #define _HASHLIB_OPENSSL_SHAKE_256_METHODDEF +#endif /* !defined(_HASHLIB_OPENSSL_SHAKE_256_METHODDEF) */ + #ifndef _HASHLIB_SCRYPT_METHODDEF #define _HASHLIB_SCRYPT_METHODDEF #endif /* !defined(_HASHLIB_SCRYPT_METHODDEF) */ -/*[clinic end generated code: output=38c2637f67e9bb79 input=a9049054013a1b77]*/ + +#ifndef _HASHLIB_GET_FIPS_MODE_METHODDEF + #define _HASHLIB_GET_FIPS_MODE_METHODDEF +#endif /* !defined(_HASHLIB_GET_FIPS_MODE_METHODDEF) */ +/*[clinic end generated code: output=b6b280e46bf0b139 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_pickle.c.h b/Modules/clinic/_pickle.c.h index 0457a433e79fb04c725975eca730fee8d5663b50..136524b6a7134e1ad05134cd9e61c4d2c0b30b70 100644 --- a/Modules/clinic/_pickle.c.h +++ b/Modules/clinic/_pickle.c.h @@ -735,7 +735,7 @@ exit: } PyDoc_STRVAR(_pickle_loads__doc__, -"loads($module, /, data, *, fix_imports=True, encoding=\'ASCII\',\n" +"loads($module, data, /, *, fix_imports=True, encoding=\'ASCII\',\n" " errors=\'strict\', buffers=())\n" "--\n" "\n" @@ -766,7 +766,7 @@ static PyObject * _pickle_loads(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"data", "fix_imports", "encoding", "errors", "buffers", NULL}; + static const char * const _keywords[] = {"", "fix_imports", "encoding", "errors", "buffers", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "loads", 0}; PyObject *argsbuf[5]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1; @@ -836,4 +836,4 @@ skip_optional_kwonly: exit: return return_value; } -/*[clinic end generated code: output=e2506823be1960c5 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=324aad69644beda2 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_testmultiphase.c.h b/Modules/clinic/_testmultiphase.c.h new file mode 100644 index 0000000000000000000000000000000000000000..0d38c230f71865fb9440dcfba55cdd36b0830fa3 --- /dev/null +++ b/Modules/clinic/_testmultiphase.c.h @@ -0,0 +1,101 @@ +/*[clinic input] +preserve +[clinic start generated code]*/ + +PyDoc_STRVAR(_testmultiphase_StateAccessType_get_defining_module__doc__, +"get_defining_module($self, /)\n" +"--\n" +"\n" +"Return the module of the defining class."); + +#define _TESTMULTIPHASE_STATEACCESSTYPE_GET_DEFINING_MODULE_METHODDEF \ + {"get_defining_module", (PyCFunction)(void(*)(void))_testmultiphase_StateAccessType_get_defining_module, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _testmultiphase_StateAccessType_get_defining_module__doc__}, + +static PyObject * +_testmultiphase_StateAccessType_get_defining_module_impl(StateAccessTypeObject *self, + PyTypeObject *cls); + +static PyObject * +_testmultiphase_StateAccessType_get_defining_module(StateAccessTypeObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":get_defining_module", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = _testmultiphase_StateAccessType_get_defining_module_impl(self, cls); + +exit: + return return_value; +} + +PyDoc_STRVAR(_testmultiphase_StateAccessType_increment_count_clinic__doc__, +"increment_count_clinic($self, /, n=1, *, twice=False)\n" +"--\n" +"\n" +"Add \'n\' from the module-state counter.\n" +"\n" +"Pass \'twice\' to double that amount.\n" +"\n" +"This tests Argument Clinic support for defining_class."); + +#define _TESTMULTIPHASE_STATEACCESSTYPE_INCREMENT_COUNT_CLINIC_METHODDEF \ + {"increment_count_clinic", (PyCFunction)(void(*)(void))_testmultiphase_StateAccessType_increment_count_clinic, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _testmultiphase_StateAccessType_increment_count_clinic__doc__}, + +static PyObject * +_testmultiphase_StateAccessType_increment_count_clinic_impl(StateAccessTypeObject *self, + PyTypeObject *cls, + int n, int twice); + +static PyObject * +_testmultiphase_StateAccessType_increment_count_clinic(StateAccessTypeObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"n", "twice", NULL}; + static _PyArg_Parser _parser = {"|i$p:increment_count_clinic", _keywords, 0}; + int n = 1; + int twice = 0; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &n, &twice)) { + goto exit; + } + return_value = _testmultiphase_StateAccessType_increment_count_clinic_impl(self, cls, n, twice); + +exit: + return return_value; +} + +PyDoc_STRVAR(_testmultiphase_StateAccessType_get_count__doc__, +"get_count($self, /)\n" +"--\n" +"\n" +"Return the value of the module-state counter."); + +#define _TESTMULTIPHASE_STATEACCESSTYPE_GET_COUNT_METHODDEF \ + {"get_count", (PyCFunction)(void(*)(void))_testmultiphase_StateAccessType_get_count, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _testmultiphase_StateAccessType_get_count__doc__}, + +static PyObject * +_testmultiphase_StateAccessType_get_count_impl(StateAccessTypeObject *self, + PyTypeObject *cls); + +static PyObject * +_testmultiphase_StateAccessType_get_count(StateAccessTypeObject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":get_count", _keywords, 0}; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + return_value = _testmultiphase_StateAccessType_get_count_impl(self, cls); + +exit: + return return_value; +} +/*[clinic end generated code: output=39eea487e94e7f5d input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_tracemalloc.c.h b/Modules/clinic/_tracemalloc.c.h index 68fafdc3833d2e3a3da6921849159725d264e1a7..049cacd8326638d5b18cf6faef745ca62531fd9b 100644 --- a/Modules/clinic/_tracemalloc.c.h +++ b/Modules/clinic/_tracemalloc.c.h @@ -197,4 +197,24 @@ _tracemalloc_get_traced_memory(PyObject *module, PyObject *Py_UNUSED(ignored)) { return _tracemalloc_get_traced_memory_impl(module); } -/*[clinic end generated code: output=1bc96dc569706afa input=a9049054013a1b77]*/ + +PyDoc_STRVAR(_tracemalloc_reset_peak__doc__, +"reset_peak($module, /)\n" +"--\n" +"\n" +"Set the peak size of memory blocks traced by tracemalloc to the current size.\n" +"\n" +"Do nothing if the tracemalloc module is not tracing memory allocations."); + +#define _TRACEMALLOC_RESET_PEAK_METHODDEF \ + {"reset_peak", (PyCFunction)_tracemalloc_reset_peak, METH_NOARGS, _tracemalloc_reset_peak__doc__}, + +static PyObject * +_tracemalloc_reset_peak_impl(PyObject *module); + +static PyObject * +_tracemalloc_reset_peak(PyObject *module, PyObject *Py_UNUSED(ignored)) +{ + return _tracemalloc_reset_peak_impl(module); +} +/*[clinic end generated code: output=a130117b1af821da input=a9049054013a1b77]*/ diff --git a/Modules/clinic/arraymodule.c.h b/Modules/clinic/arraymodule.c.h index 33f82d4da8b6c90cf34ff5fd1bd2d9fbb90804af..b9245ca91d5fa9ca98ff96785aa11571dc04e3e7 100644 --- a/Modules/clinic/arraymodule.c.h +++ b/Modules/clinic/arraymodule.c.h @@ -312,54 +312,6 @@ array_array_tolist(arrayobject *self, PyObject *Py_UNUSED(ignored)) return array_array_tolist_impl(self); } -PyDoc_STRVAR(array_array_fromstring__doc__, -"fromstring($self, buffer, /)\n" -"--\n" -"\n" -"Appends items from the string, interpreting it as an array of machine values, as if it had been read from a file using the fromfile() method).\n" -"\n" -"This method is deprecated. Use frombytes instead."); - -#define ARRAY_ARRAY_FROMSTRING_METHODDEF \ - {"fromstring", (PyCFunction)array_array_fromstring, METH_O, array_array_fromstring__doc__}, - -static PyObject * -array_array_fromstring_impl(arrayobject *self, Py_buffer *buffer); - -static PyObject * -array_array_fromstring(arrayobject *self, PyObject *arg) -{ - PyObject *return_value = NULL; - Py_buffer buffer = {NULL, NULL}; - - if (PyUnicode_Check(arg)) { - Py_ssize_t len; - const char *ptr = PyUnicode_AsUTF8AndSize(arg, &len); - if (ptr == NULL) { - goto exit; - } - PyBuffer_FillInfo(&buffer, arg, (void *)ptr, len, 1, 0); - } - else { /* any bytes-like object */ - if (PyObject_GetBuffer(arg, &buffer, PyBUF_SIMPLE) != 0) { - goto exit; - } - if (!PyBuffer_IsContiguous(&buffer, 'C')) { - _PyArg_BadArgument("fromstring", "argument", "contiguous buffer", arg); - goto exit; - } - } - return_value = array_array_fromstring_impl(self, &buffer); - -exit: - /* Cleanup for buffer */ - if (buffer.obj) { - PyBuffer_Release(&buffer); - } - - return return_value; -} - PyDoc_STRVAR(array_array_frombytes__doc__, "frombytes($self, buffer, /)\n" "--\n" @@ -414,26 +366,6 @@ array_array_tobytes(arrayobject *self, PyObject *Py_UNUSED(ignored)) return array_array_tobytes_impl(self); } -PyDoc_STRVAR(array_array_tostring__doc__, -"tostring($self, /)\n" -"--\n" -"\n" -"Convert the array to an array of machine values and return the bytes representation.\n" -"\n" -"This method is deprecated. Use tobytes instead."); - -#define ARRAY_ARRAY_TOSTRING_METHODDEF \ - {"tostring", (PyCFunction)array_array_tostring, METH_NOARGS, array_array_tostring__doc__}, - -static PyObject * -array_array_tostring_impl(arrayobject *self); - -static PyObject * -array_array_tostring(arrayobject *self, PyObject *Py_UNUSED(ignored)) -{ - return array_array_tostring_impl(self); -} - PyDoc_STRVAR(array_array_fromunicode__doc__, "fromunicode($self, ustr, /)\n" "--\n" @@ -448,20 +380,23 @@ PyDoc_STRVAR(array_array_fromunicode__doc__, {"fromunicode", (PyCFunction)array_array_fromunicode, METH_O, array_array_fromunicode__doc__}, static PyObject * -array_array_fromunicode_impl(arrayobject *self, const Py_UNICODE *ustr, - Py_ssize_clean_t ustr_length); +array_array_fromunicode_impl(arrayobject *self, PyObject *ustr); static PyObject * array_array_fromunicode(arrayobject *self, PyObject *arg) { PyObject *return_value = NULL; - const Py_UNICODE *ustr; - Py_ssize_clean_t ustr_length; + PyObject *ustr; - if (!PyArg_Parse(arg, "u#:fromunicode", &ustr, &ustr_length)) { + if (!PyUnicode_Check(arg)) { + _PyArg_BadArgument("fromunicode", "argument", "str", arg); + goto exit; + } + if (PyUnicode_READY(arg) == -1) { goto exit; } - return_value = array_array_fromunicode_impl(self, ustr, ustr_length); + ustr = arg; + return_value = array_array_fromunicode_impl(self, ustr); exit: return return_value; @@ -599,4 +534,4 @@ PyDoc_STRVAR(array_arrayiterator___setstate____doc__, #define ARRAY_ARRAYITERATOR___SETSTATE___METHODDEF \ {"__setstate__", (PyCFunction)array_arrayiterator___setstate__, METH_O, array_arrayiterator___setstate____doc__}, -/*[clinic end generated code: output=6aa421571e2c0756 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=9f70748dd3bc532f input=a9049054013a1b77]*/ diff --git a/Modules/clinic/binascii.c.h b/Modules/clinic/binascii.c.h index 82942f08a68681fe98f4b8d7735ab9247373c061..4d02c72c472e1d89a7fd59cc4129169cc2034a42 100644 --- a/Modules/clinic/binascii.c.h +++ b/Modules/clinic/binascii.c.h @@ -328,7 +328,7 @@ PyDoc_STRVAR(binascii_crc_hqx__doc__, #define BINASCII_CRC_HQX_METHODDEF \ {"crc_hqx", (PyCFunction)(void(*)(void))binascii_crc_hqx, METH_FASTCALL, binascii_crc_hqx__doc__}, -static unsigned int +static PyObject * binascii_crc_hqx_impl(PyObject *module, Py_buffer *data, unsigned int crc); static PyObject * @@ -337,7 +337,6 @@ binascii_crc_hqx(PyObject *module, PyObject *const *args, Py_ssize_t nargs) PyObject *return_value = NULL; Py_buffer data = {NULL, NULL}; unsigned int crc; - unsigned int _return_value; if (!_PyArg_CheckPositional("crc_hqx", nargs, 2, 2)) { goto exit; @@ -358,11 +357,7 @@ binascii_crc_hqx(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (crc == (unsigned int)-1 && PyErr_Occurred()) { goto exit; } - _return_value = binascii_crc_hqx_impl(module, &data, crc); - if ((_return_value == (unsigned int)-1) && PyErr_Occurred()) { - goto exit; - } - return_value = PyLong_FromUnsignedLong((unsigned long)_return_value); + return_value = binascii_crc_hqx_impl(module, &data, crc); exit: /* Cleanup for data */ @@ -801,4 +796,4 @@ exit: return return_value; } -/*[clinic end generated code: output=ec26d03c2007eaac input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a1e878d3963b615e input=a9049054013a1b77]*/ diff --git a/Modules/clinic/cmathmodule.c.h b/Modules/clinic/cmathmodule.c.h index 81a8437c3a7d17936bc9a5ed29c4d3ee3f6e8045..4b6653aa219422607f14cd32e3d57aeb94b06623 100644 --- a/Modules/clinic/cmathmodule.c.h +++ b/Modules/clinic/cmathmodule.c.h @@ -26,9 +26,8 @@ cmath_acos(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_acos_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -69,9 +68,8 @@ cmath_acosh(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_acosh_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -112,9 +110,8 @@ cmath_asin(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_asin_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -155,9 +152,8 @@ cmath_asinh(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_asinh_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -198,9 +194,8 @@ cmath_atan(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_atan_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -241,9 +236,8 @@ cmath_atanh(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_atanh_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -284,9 +278,8 @@ cmath_cos(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_cos_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -327,9 +320,8 @@ cmath_cosh(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_cosh_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -370,9 +362,8 @@ cmath_exp(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_exp_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -413,9 +404,8 @@ cmath_log10(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_log10_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -456,9 +446,8 @@ cmath_sin(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_sin_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -499,9 +488,8 @@ cmath_sinh(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_sinh_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -542,9 +530,8 @@ cmath_sqrt(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_sqrt_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -585,9 +572,8 @@ cmath_tan(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_tan_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -628,9 +614,8 @@ cmath_tanh(PyObject *module, PyObject *arg) goto exit; } /* modifications for z */ - errno = 0; PyFPE_START_PROTECT("complex function", goto exit); + errno = 0; _return_value = cmath_tanh_impl(module, z); - PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -968,4 +953,4 @@ skip_optional_kwonly: exit: return return_value; } -/*[clinic end generated code: output=3edc4484b10ae752 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=353347db2e808e0d input=a9049054013a1b77]*/ diff --git a/Modules/clinic/gcmodule.c.h b/Modules/clinic/gcmodule.c.h index 22d2aa4a87bcd0a4fbf1b909b20e11f95d645228..72795c66bf7284d8a666e37ae804a5756d8d02f9 100644 --- a/Modules/clinic/gcmodule.c.h +++ b/Modules/clinic/gcmodule.c.h @@ -304,6 +304,15 @@ PyDoc_STRVAR(gc_is_tracked__doc__, #define GC_IS_TRACKED_METHODDEF \ {"is_tracked", (PyCFunction)gc_is_tracked, METH_O, gc_is_tracked__doc__}, +PyDoc_STRVAR(gc_is_finalized__doc__, +"is_finalized($module, obj, /)\n" +"--\n" +"\n" +"Returns true if the object has been already finalized by the GC."); + +#define GC_IS_FINALIZED_METHODDEF \ + {"is_finalized", (PyCFunction)gc_is_finalized, METH_O, gc_is_finalized__doc__}, + PyDoc_STRVAR(gc_freeze__doc__, "freeze($module, /)\n" "--\n" @@ -373,4 +382,4 @@ gc_get_freeze_count(PyObject *module, PyObject *Py_UNUSED(ignored)) exit: return return_value; } -/*[clinic end generated code: output=e40d384b1f0d513c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=bd6a8056989e2e69 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/mathmodule.c.h b/Modules/clinic/mathmodule.c.h index 95d68ee55ae5bab4461f6b0344ac82afcec7866f..65f3dd4f520aeb172e454402cf7bf3e5239fe341 100644 --- a/Modules/clinic/mathmodule.c.h +++ b/Modules/clinic/mathmodule.c.h @@ -2,36 +2,6 @@ preserve [clinic start generated code]*/ -PyDoc_STRVAR(math_gcd__doc__, -"gcd($module, x, y, /)\n" -"--\n" -"\n" -"greatest common divisor of x and y"); - -#define MATH_GCD_METHODDEF \ - {"gcd", (PyCFunction)(void(*)(void))math_gcd, METH_FASTCALL, math_gcd__doc__}, - -static PyObject * -math_gcd_impl(PyObject *module, PyObject *a, PyObject *b); - -static PyObject * -math_gcd(PyObject *module, PyObject *const *args, Py_ssize_t nargs) -{ - PyObject *return_value = NULL; - PyObject *a; - PyObject *b; - - if (!_PyArg_CheckPositional("gcd", nargs, 2, 2)) { - goto exit; - } - a = args[0]; - b = args[1]; - return_value = math_gcd_impl(module, a, b); - -exit: - return return_value; -} - PyDoc_STRVAR(math_ceil__doc__, "ceil($module, x, /)\n" "--\n" @@ -808,4 +778,91 @@ math_comb(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=9a2b3dc91eb9aadd input=a9049054013a1b77]*/ + +PyDoc_STRVAR(math_nextafter__doc__, +"nextafter($module, x, y, /)\n" +"--\n" +"\n" +"Return the next floating-point value after x towards y."); + +#define MATH_NEXTAFTER_METHODDEF \ + {"nextafter", (PyCFunction)(void(*)(void))math_nextafter, METH_FASTCALL, math_nextafter__doc__}, + +static PyObject * +math_nextafter_impl(PyObject *module, double x, double y); + +static PyObject * +math_nextafter(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + double x; + double y; + + if (!_PyArg_CheckPositional("nextafter", nargs, 2, 2)) { + goto exit; + } + if (PyFloat_CheckExact(args[0])) { + x = PyFloat_AS_DOUBLE(args[0]); + } + else + { + x = PyFloat_AsDouble(args[0]); + if (x == -1.0 && PyErr_Occurred()) { + goto exit; + } + } + if (PyFloat_CheckExact(args[1])) { + y = PyFloat_AS_DOUBLE(args[1]); + } + else + { + y = PyFloat_AsDouble(args[1]); + if (y == -1.0 && PyErr_Occurred()) { + goto exit; + } + } + return_value = math_nextafter_impl(module, x, y); + +exit: + return return_value; +} + +PyDoc_STRVAR(math_ulp__doc__, +"ulp($module, x, /)\n" +"--\n" +"\n" +"Return the value of the least significant bit of the float x."); + +#define MATH_ULP_METHODDEF \ + {"ulp", (PyCFunction)math_ulp, METH_O, math_ulp__doc__}, + +static double +math_ulp_impl(PyObject *module, double x); + +static PyObject * +math_ulp(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + double x; + double _return_value; + + if (PyFloat_CheckExact(arg)) { + x = PyFloat_AS_DOUBLE(arg); + } + else + { + x = PyFloat_AsDouble(arg); + if (x == -1.0 && PyErr_Occurred()) { + goto exit; + } + } + _return_value = math_ulp_impl(module, x); + if ((_return_value == -1.0) && PyErr_Occurred()) { + goto exit; + } + return_value = PyFloat_FromDouble(_return_value); + +exit: + return return_value; +} +/*[clinic end generated code: output=1eae2b3ef19568fa input=a9049054013a1b77]*/ diff --git a/Modules/clinic/md5module.c.h b/Modules/clinic/md5module.c.h index 12484cc0e3dd88c5a0df39359c3b21af624bf38c..c109f9efec6b604ad3a9eafd644983159a86100c 100644 --- a/Modules/clinic/md5module.c.h +++ b/Modules/clinic/md5module.c.h @@ -66,7 +66,7 @@ PyDoc_STRVAR(MD5Type_update__doc__, {"update", (PyCFunction)MD5Type_update, METH_O, MD5Type_update__doc__}, PyDoc_STRVAR(_md5_md5__doc__, -"md5($module, /, string=b\'\')\n" +"md5($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" "Return a new MD5 hash object; optionally initialized with a string."); @@ -75,17 +75,18 @@ PyDoc_STRVAR(_md5_md5__doc__, {"md5", (PyCFunction)(void(*)(void))_md5_md5, METH_FASTCALL|METH_KEYWORDS, _md5_md5__doc__}, static PyObject * -_md5_md5_impl(PyObject *module, PyObject *string); +_md5_md5_impl(PyObject *module, PyObject *string, int usedforsecurity); static PyObject * _md5_md5(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "md5", 0}; - PyObject *argsbuf[1]; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *string = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -94,11 +95,24 @@ _md5_md5(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw if (!noptargs) { goto skip_optional_pos; } - string = args[0]; + if (args[0]) { + string = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _md5_md5_impl(module, string); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _md5_md5_impl(module, string, usedforsecurity); exit: return return_value; } -/*[clinic end generated code: output=53133f08cf9095fc input=a9049054013a1b77]*/ +/*[clinic end generated code: output=dbe3abc60086f3ef input=a9049054013a1b77]*/ diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index 09ecdb358e27dc3df6f6327e765102e0f270226b..41baa455739797fb7bdad3709054876d6d2eeaab 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -2805,7 +2805,7 @@ PyDoc_STRVAR(os_sched_getscheduler__doc__, "sched_getscheduler($module, pid, /)\n" "--\n" "\n" -"Get the scheduling policy for the process identifiedy by pid.\n" +"Get the scheduling policy for the process identified by pid.\n" "\n" "Passing 0 for pid returns the scheduling policy for the calling process."); @@ -2838,7 +2838,7 @@ PyDoc_STRVAR(os_sched_param__doc__, "sched_param(sched_priority)\n" "--\n" "\n" -"Current has only one field: sched_priority\");\n" +"Currently has only one field: sched_priority\n" "\n" " sched_priority\n" " A scheduling parameter."); @@ -2886,7 +2886,7 @@ PyDoc_STRVAR(os_sched_setscheduler__doc__, static PyObject * os_sched_setscheduler_impl(PyObject *module, pid_t pid, int policy, - struct sched_param *param); + PyObject *param_obj); static PyObject * os_sched_setscheduler(PyObject *module, PyObject *const *args, Py_ssize_t nargs) @@ -2894,13 +2894,13 @@ os_sched_setscheduler(PyObject *module, PyObject *const *args, Py_ssize_t nargs) PyObject *return_value = NULL; pid_t pid; int policy; - struct sched_param param; + PyObject *param_obj; - if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "iO&:sched_setscheduler", - &pid, &policy, convert_sched_param, ¶m)) { + if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "iO:sched_setscheduler", + &pid, &policy, ¶m_obj)) { goto exit; } - return_value = os_sched_setscheduler_impl(module, pid, policy, ¶m); + return_value = os_sched_setscheduler_impl(module, pid, policy, param_obj); exit: return return_value; @@ -2957,21 +2957,20 @@ PyDoc_STRVAR(os_sched_setparam__doc__, {"sched_setparam", (PyCFunction)(void(*)(void))os_sched_setparam, METH_FASTCALL, os_sched_setparam__doc__}, static PyObject * -os_sched_setparam_impl(PyObject *module, pid_t pid, - struct sched_param *param); +os_sched_setparam_impl(PyObject *module, pid_t pid, PyObject *param_obj); static PyObject * os_sched_setparam(PyObject *module, PyObject *const *args, Py_ssize_t nargs) { PyObject *return_value = NULL; pid_t pid; - struct sched_param param; + PyObject *param_obj; - if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "O&:sched_setparam", - &pid, convert_sched_param, ¶m)) { + if (!_PyArg_ParseStack(args, nargs, "" _Py_PARSE_PID "O:sched_setparam", + &pid, ¶m_obj)) { goto exit; } - return_value = os_sched_setparam_impl(module, pid, ¶m); + return_value = os_sched_setparam_impl(module, pid, param_obj); exit: return return_value; @@ -3247,6 +3246,118 @@ os_getpid(PyObject *module, PyObject *Py_UNUSED(ignored)) #endif /* defined(HAVE_GETPID) */ +#if defined(HAVE_GETGROUPLIST) && defined(__APPLE__) + +PyDoc_STRVAR(os_getgrouplist__doc__, +"getgrouplist($module, user, group, /)\n" +"--\n" +"\n" +"Returns a list of groups to which a user belongs.\n" +"\n" +" user\n" +" username to lookup\n" +" group\n" +" base group id of the user"); + +#define OS_GETGROUPLIST_METHODDEF \ + {"getgrouplist", (PyCFunction)(void(*)(void))os_getgrouplist, METH_FASTCALL, os_getgrouplist__doc__}, + +static PyObject * +os_getgrouplist_impl(PyObject *module, const char *user, int basegid); + +static PyObject * +os_getgrouplist(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + const char *user; + int basegid; + + if (!_PyArg_CheckPositional("getgrouplist", nargs, 2, 2)) { + goto exit; + } + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("getgrouplist", "argument 1", "str", args[0]); + goto exit; + } + Py_ssize_t user_length; + user = PyUnicode_AsUTF8AndSize(args[0], &user_length); + if (user == NULL) { + goto exit; + } + if (strlen(user) != (size_t)user_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + basegid = _PyLong_AsInt(args[1]); + if (basegid == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = os_getgrouplist_impl(module, user, basegid); + +exit: + return return_value; +} + +#endif /* defined(HAVE_GETGROUPLIST) && defined(__APPLE__) */ + +#if defined(HAVE_GETGROUPLIST) && !defined(__APPLE__) + +PyDoc_STRVAR(os_getgrouplist__doc__, +"getgrouplist($module, user, group, /)\n" +"--\n" +"\n" +"Returns a list of groups to which a user belongs.\n" +"\n" +" user\n" +" username to lookup\n" +" group\n" +" base group id of the user"); + +#define OS_GETGROUPLIST_METHODDEF \ + {"getgrouplist", (PyCFunction)(void(*)(void))os_getgrouplist, METH_FASTCALL, os_getgrouplist__doc__}, + +static PyObject * +os_getgrouplist_impl(PyObject *module, const char *user, gid_t basegid); + +static PyObject * +os_getgrouplist(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + const char *user; + gid_t basegid; + + if (!_PyArg_CheckPositional("getgrouplist", nargs, 2, 2)) { + goto exit; + } + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("getgrouplist", "argument 1", "str", args[0]); + goto exit; + } + Py_ssize_t user_length; + user = PyUnicode_AsUTF8AndSize(args[0], &user_length); + if (user == NULL) { + goto exit; + } + if (strlen(user) != (size_t)user_length) { + PyErr_SetString(PyExc_ValueError, "embedded null character"); + goto exit; + } + if (!_Py_Gid_Converter(args[1], &basegid)) { + goto exit; + } + return_value = os_getgrouplist_impl(module, user, basegid); + +exit: + return return_value; +} + +#endif /* defined(HAVE_GETGROUPLIST) && !defined(__APPLE__) */ + #if defined(HAVE_GETGROUPS) PyDoc_STRVAR(os_getgroups__doc__, @@ -3269,6 +3380,102 @@ os_getgroups(PyObject *module, PyObject *Py_UNUSED(ignored)) #endif /* defined(HAVE_GETGROUPS) */ +#if defined(HAVE_INITGROUPS) && defined(__APPLE__) + +PyDoc_STRVAR(os_initgroups__doc__, +"initgroups($module, username, gid, /)\n" +"--\n" +"\n" +"Initialize the group access list.\n" +"\n" +"Call the system initgroups() to initialize the group access list with all of\n" +"the groups of which the specified username is a member, plus the specified\n" +"group id."); + +#define OS_INITGROUPS_METHODDEF \ + {"initgroups", (PyCFunction)(void(*)(void))os_initgroups, METH_FASTCALL, os_initgroups__doc__}, + +static PyObject * +os_initgroups_impl(PyObject *module, PyObject *oname, int gid); + +static PyObject * +os_initgroups(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyObject *oname = NULL; + int gid; + + if (!_PyArg_CheckPositional("initgroups", nargs, 2, 2)) { + goto exit; + } + if (!PyUnicode_FSConverter(args[0], &oname)) { + goto exit; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + gid = _PyLong_AsInt(args[1]); + if (gid == -1 && PyErr_Occurred()) { + goto exit; + } + return_value = os_initgroups_impl(module, oname, gid); + +exit: + /* Cleanup for oname */ + Py_XDECREF(oname); + + return return_value; +} + +#endif /* defined(HAVE_INITGROUPS) && defined(__APPLE__) */ + +#if defined(HAVE_INITGROUPS) && !defined(__APPLE__) + +PyDoc_STRVAR(os_initgroups__doc__, +"initgroups($module, username, gid, /)\n" +"--\n" +"\n" +"Initialize the group access list.\n" +"\n" +"Call the system initgroups() to initialize the group access list with all of\n" +"the groups of which the specified username is a member, plus the specified\n" +"group id."); + +#define OS_INITGROUPS_METHODDEF \ + {"initgroups", (PyCFunction)(void(*)(void))os_initgroups, METH_FASTCALL, os_initgroups__doc__}, + +static PyObject * +os_initgroups_impl(PyObject *module, PyObject *oname, gid_t gid); + +static PyObject * +os_initgroups(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyObject *oname = NULL; + gid_t gid; + + if (!_PyArg_CheckPositional("initgroups", nargs, 2, 2)) { + goto exit; + } + if (!PyUnicode_FSConverter(args[0], &oname)) { + goto exit; + } + if (!_Py_Gid_Converter(args[1], &gid)) { + goto exit; + } + return_value = os_initgroups_impl(module, oname, gid); + +exit: + /* Cleanup for oname */ + Py_XDECREF(oname); + + return return_value; +} + +#endif /* defined(HAVE_INITGROUPS) && !defined(__APPLE__) */ + #if defined(HAVE_GETPGID) PyDoc_STRVAR(os_getpgid__doc__, @@ -3963,6 +4170,44 @@ os_wait(PyObject *module, PyObject *Py_UNUSED(ignored)) #endif /* defined(HAVE_WAIT) */ +#if (defined(__linux__) && defined(__NR_pidfd_open)) + +PyDoc_STRVAR(os_pidfd_open__doc__, +"pidfd_open($module, /, pid, flags=0)\n" +"--\n" +"\n" +"Return a file descriptor referring to the process *pid*.\n" +"\n" +"The descriptor can be used to perform process management without races and\n" +"signals."); + +#define OS_PIDFD_OPEN_METHODDEF \ + {"pidfd_open", (PyCFunction)(void(*)(void))os_pidfd_open, METH_FASTCALL|METH_KEYWORDS, os_pidfd_open__doc__}, + +static PyObject * +os_pidfd_open_impl(PyObject *module, pid_t pid, unsigned int flags); + +static PyObject * +os_pidfd_open(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"pid", "flags", NULL}; + static _PyArg_Parser _parser = {"" _Py_PARSE_PID "|O&:pidfd_open", _keywords, 0}; + pid_t pid; + unsigned int flags = 0; + + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &pid, _PyLong_UnsignedInt_Converter, &flags)) { + goto exit; + } + return_value = os_pidfd_open_impl(module, pid, flags); + +exit: + return return_value; +} + +#endif /* (defined(__linux__) && defined(__NR_pidfd_open)) */ + #if (defined(HAVE_READLINK) || defined(MS_WINDOWS)) PyDoc_STRVAR(os_readlink__doc__, @@ -4799,14 +5044,14 @@ PyDoc_STRVAR(os_pread__doc__, {"pread", (PyCFunction)(void(*)(void))os_pread, METH_FASTCALL, os_pread__doc__}, static PyObject * -os_pread_impl(PyObject *module, int fd, int length, Py_off_t offset); +os_pread_impl(PyObject *module, int fd, Py_ssize_t length, Py_off_t offset); static PyObject * os_pread(PyObject *module, PyObject *const *args, Py_ssize_t nargs) { PyObject *return_value = NULL; int fd; - int length; + Py_ssize_t length; Py_off_t offset; if (!_PyArg_CheckPositional("pread", nargs, 3, 3)) { @@ -4826,9 +5071,17 @@ os_pread(PyObject *module, PyObject *const *args, Py_ssize_t nargs) "integer argument expected, got float" ); goto exit; } - length = _PyLong_AsInt(args[1]); - if (length == -1 && PyErr_Occurred()) { - goto exit; + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[1]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + length = ival; } if (!Py_off_t_converter(args[2], &offset)) { goto exit; @@ -4975,10 +5228,287 @@ exit: return return_value; } +#if defined(HAVE_SENDFILE) && defined(__APPLE__) + +PyDoc_STRVAR(os_sendfile__doc__, +"sendfile($module, /, out_fd, in_fd, offset, count, headers=(),\n" +" trailers=(), flags=0)\n" +"--\n" +"\n" +"Copy count bytes from file descriptor in_fd to file descriptor out_fd."); + +#define OS_SENDFILE_METHODDEF \ + {"sendfile", (PyCFunction)(void(*)(void))os_sendfile, METH_FASTCALL|METH_KEYWORDS, os_sendfile__doc__}, + +static PyObject * +os_sendfile_impl(PyObject *module, int out_fd, int in_fd, Py_off_t offset, + Py_off_t sbytes, PyObject *headers, PyObject *trailers, + int flags); + +static PyObject * +os_sendfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"out_fd", "in_fd", "offset", "count", "headers", "trailers", "flags", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "sendfile", 0}; + PyObject *argsbuf[7]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 4; + int out_fd; + int in_fd; + Py_off_t offset; + Py_off_t sbytes; + PyObject *headers = NULL; + PyObject *trailers = NULL; + int flags = 0; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 4, 7, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + out_fd = _PyLong_AsInt(args[0]); + if (out_fd == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + in_fd = _PyLong_AsInt(args[1]); + if (in_fd == -1 && PyErr_Occurred()) { + goto exit; + } + if (!Py_off_t_converter(args[2], &offset)) { + goto exit; + } + if (!Py_off_t_converter(args[3], &sbytes)) { + goto exit; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[4]) { + headers = args[4]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[5]) { + trailers = args[5]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[6])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + flags = _PyLong_AsInt(args[6]); + if (flags == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: + return_value = os_sendfile_impl(module, out_fd, in_fd, offset, sbytes, headers, trailers, flags); + +exit: + return return_value; +} + +#endif /* defined(HAVE_SENDFILE) && defined(__APPLE__) */ + +#if defined(HAVE_SENDFILE) && !defined(__APPLE__) && (defined(__FreeBSD__) || defined(__DragonFly__)) + +PyDoc_STRVAR(os_sendfile__doc__, +"sendfile($module, /, out_fd, in_fd, offset, count, headers=(),\n" +" trailers=(), flags=0)\n" +"--\n" +"\n" +"Copy count bytes from file descriptor in_fd to file descriptor out_fd."); + +#define OS_SENDFILE_METHODDEF \ + {"sendfile", (PyCFunction)(void(*)(void))os_sendfile, METH_FASTCALL|METH_KEYWORDS, os_sendfile__doc__}, + +static PyObject * +os_sendfile_impl(PyObject *module, int out_fd, int in_fd, Py_off_t offset, + Py_ssize_t count, PyObject *headers, PyObject *trailers, + int flags); + +static PyObject * +os_sendfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"out_fd", "in_fd", "offset", "count", "headers", "trailers", "flags", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "sendfile", 0}; + PyObject *argsbuf[7]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 4; + int out_fd; + int in_fd; + Py_off_t offset; + Py_ssize_t count; + PyObject *headers = NULL; + PyObject *trailers = NULL; + int flags = 0; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 4, 7, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + out_fd = _PyLong_AsInt(args[0]); + if (out_fd == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + in_fd = _PyLong_AsInt(args[1]); + if (in_fd == -1 && PyErr_Occurred()) { + goto exit; + } + if (!Py_off_t_converter(args[2], &offset)) { + goto exit; + } + if (PyFloat_Check(args[3])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[3]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + count = ival; + } + if (!noptargs) { + goto skip_optional_pos; + } + if (args[4]) { + headers = args[4]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (args[5]) { + trailers = args[5]; + if (!--noptargs) { + goto skip_optional_pos; + } + } + if (PyFloat_Check(args[6])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + flags = _PyLong_AsInt(args[6]); + if (flags == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional_pos: + return_value = os_sendfile_impl(module, out_fd, in_fd, offset, count, headers, trailers, flags); + +exit: + return return_value; +} + +#endif /* defined(HAVE_SENDFILE) && !defined(__APPLE__) && (defined(__FreeBSD__) || defined(__DragonFly__)) */ + +#if defined(HAVE_SENDFILE) && !defined(__APPLE__) && !(defined(__FreeBSD__) || defined(__DragonFly__)) + +PyDoc_STRVAR(os_sendfile__doc__, +"sendfile($module, /, out_fd, in_fd, offset, count)\n" +"--\n" +"\n" +"Copy count bytes from file descriptor in_fd to file descriptor out_fd."); + +#define OS_SENDFILE_METHODDEF \ + {"sendfile", (PyCFunction)(void(*)(void))os_sendfile, METH_FASTCALL|METH_KEYWORDS, os_sendfile__doc__}, + +static PyObject * +os_sendfile_impl(PyObject *module, int out_fd, int in_fd, PyObject *offobj, + Py_ssize_t count); + +static PyObject * +os_sendfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"out_fd", "in_fd", "offset", "count", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "sendfile", 0}; + PyObject *argsbuf[4]; + int out_fd; + int in_fd; + PyObject *offobj; + Py_ssize_t count; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 4, 4, 0, argsbuf); + if (!args) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + out_fd = _PyLong_AsInt(args[0]); + if (out_fd == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + in_fd = _PyLong_AsInt(args[1]); + if (in_fd == -1 && PyErr_Occurred()) { + goto exit; + } + offobj = args[2]; + if (PyFloat_Check(args[3])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + { + Py_ssize_t ival = -1; + PyObject *iobj = PyNumber_Index(args[3]); + if (iobj != NULL) { + ival = PyLong_AsSsize_t(iobj); + Py_DECREF(iobj); + } + if (ival == -1 && PyErr_Occurred()) { + goto exit; + } + count = ival; + } + return_value = os_sendfile_impl(module, out_fd, in_fd, offobj, count); + +exit: + return return_value; +} + +#endif /* defined(HAVE_SENDFILE) && !defined(__APPLE__) && !(defined(__FreeBSD__) || defined(__DragonFly__)) */ + #if defined(__APPLE__) PyDoc_STRVAR(os__fcopyfile__doc__, -"_fcopyfile($module, infd, outfd, flags, /)\n" +"_fcopyfile($module, in_fd, out_fd, flags, /)\n" "--\n" "\n" "Efficiently copy content or metadata of 2 regular file descriptors (macOS)."); @@ -4987,14 +5517,14 @@ PyDoc_STRVAR(os__fcopyfile__doc__, {"_fcopyfile", (PyCFunction)(void(*)(void))os__fcopyfile, METH_FASTCALL, os__fcopyfile__doc__}, static PyObject * -os__fcopyfile_impl(PyObject *module, int infd, int outfd, int flags); +os__fcopyfile_impl(PyObject *module, int in_fd, int out_fd, int flags); static PyObject * os__fcopyfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs) { PyObject *return_value = NULL; - int infd; - int outfd; + int in_fd; + int out_fd; int flags; if (!_PyArg_CheckPositional("_fcopyfile", nargs, 3, 3)) { @@ -5005,8 +5535,8 @@ os__fcopyfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs) "integer argument expected, got float" ); goto exit; } - infd = _PyLong_AsInt(args[0]); - if (infd == -1 && PyErr_Occurred()) { + in_fd = _PyLong_AsInt(args[0]); + if (in_fd == -1 && PyErr_Occurred()) { goto exit; } if (PyFloat_Check(args[1])) { @@ -5014,8 +5544,8 @@ os__fcopyfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs) "integer argument expected, got float" ); goto exit; } - outfd = _PyLong_AsInt(args[1]); - if (outfd == -1 && PyErr_Occurred()) { + out_fd = _PyLong_AsInt(args[1]); + if (out_fd == -1 && PyErr_Occurred()) { goto exit; } if (PyFloat_Check(args[2])) { @@ -5027,7 +5557,7 @@ os__fcopyfile(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (flags == -1 && PyErr_Occurred()) { goto exit; } - return_value = os__fcopyfile_impl(module, infd, outfd, flags); + return_value = os__fcopyfile_impl(module, in_fd, out_fd, flags); exit: return return_value; @@ -5988,7 +6518,7 @@ exit: #endif /* (defined(HAVE_POSIX_FADVISE) && !defined(POSIX_FADVISE_AIX_BUG)) */ -#if defined(HAVE_PUTENV) && defined(MS_WINDOWS) +#if defined(MS_WINDOWS) PyDoc_STRVAR(os_putenv__doc__, "putenv($module, name, value, /)\n" @@ -6034,9 +6564,9 @@ exit: return return_value; } -#endif /* defined(HAVE_PUTENV) && defined(MS_WINDOWS) */ +#endif /* defined(MS_WINDOWS) */ -#if defined(HAVE_PUTENV) && !defined(MS_WINDOWS) +#if !defined(MS_WINDOWS) PyDoc_STRVAR(os_putenv__doc__, "putenv($module, name, value, /)\n" @@ -6077,9 +6607,45 @@ exit: return return_value; } -#endif /* defined(HAVE_PUTENV) && !defined(MS_WINDOWS) */ +#endif /* !defined(MS_WINDOWS) */ -#if defined(HAVE_UNSETENV) +#if defined(MS_WINDOWS) + +PyDoc_STRVAR(os_unsetenv__doc__, +"unsetenv($module, name, /)\n" +"--\n" +"\n" +"Delete an environment variable."); + +#define OS_UNSETENV_METHODDEF \ + {"unsetenv", (PyCFunction)os_unsetenv, METH_O, os_unsetenv__doc__}, + +static PyObject * +os_unsetenv_impl(PyObject *module, PyObject *name); + +static PyObject * +os_unsetenv(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + PyObject *name; + + if (!PyUnicode_Check(arg)) { + _PyArg_BadArgument("unsetenv", "argument", "str", arg); + goto exit; + } + if (PyUnicode_READY(arg) == -1) { + goto exit; + } + name = arg; + return_value = os_unsetenv_impl(module, name); + +exit: + return return_value; +} + +#endif /* defined(MS_WINDOWS) */ + +#if !defined(MS_WINDOWS) PyDoc_STRVAR(os_unsetenv__doc__, "unsetenv($module, name, /)\n" @@ -6111,7 +6677,7 @@ exit: return return_value; } -#endif /* defined(HAVE_UNSETENV) */ +#endif /* !defined(MS_WINDOWS) */ PyDoc_STRVAR(os_strerror__doc__, "strerror($module, code, /)\n" @@ -7486,6 +8052,62 @@ exit: #endif /* defined(HAVE_MEMFD_CREATE) */ +#if (defined(TERMSIZE_USE_CONIO) || defined(TERMSIZE_USE_IOCTL)) + +PyDoc_STRVAR(os_get_terminal_size__doc__, +"get_terminal_size($module, fd=, /)\n" +"--\n" +"\n" +"Return the size of the terminal window as (columns, lines).\n" +"\n" +"The optional argument fd (default standard output) specifies\n" +"which file descriptor should be queried.\n" +"\n" +"If the file descriptor is not connected to a terminal, an OSError\n" +"is thrown.\n" +"\n" +"This function will only be defined if an implementation is\n" +"available for this system.\n" +"\n" +"shutil.get_terminal_size is the high-level function which should\n" +"normally be used, os.get_terminal_size is the low-level implementation."); + +#define OS_GET_TERMINAL_SIZE_METHODDEF \ + {"get_terminal_size", (PyCFunction)(void(*)(void))os_get_terminal_size, METH_FASTCALL, os_get_terminal_size__doc__}, + +static PyObject * +os_get_terminal_size_impl(PyObject *module, int fd); + +static PyObject * +os_get_terminal_size(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + int fd = fileno(stdout); + + if (!_PyArg_CheckPositional("get_terminal_size", nargs, 0, 1)) { + goto exit; + } + if (nargs < 1) { + goto skip_optional; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + fd = _PyLong_AsInt(args[0]); + if (fd == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional: + return_value = os_get_terminal_size_impl(module, fd); + +exit: + return return_value; +} + +#endif /* (defined(TERMSIZE_USE_CONIO) || defined(TERMSIZE_USE_IOCTL)) */ + PyDoc_STRVAR(os_cpu_count__doc__, "cpu_count($module, /)\n" "--\n" @@ -7766,18 +8388,24 @@ PyDoc_STRVAR(os_DirEntry_is_symlink__doc__, "Return True if the entry is a symbolic link; cached per entry."); #define OS_DIRENTRY_IS_SYMLINK_METHODDEF \ - {"is_symlink", (PyCFunction)os_DirEntry_is_symlink, METH_NOARGS, os_DirEntry_is_symlink__doc__}, + {"is_symlink", (PyCFunction)(void(*)(void))os_DirEntry_is_symlink, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_symlink__doc__}, static int -os_DirEntry_is_symlink_impl(DirEntry *self); +os_DirEntry_is_symlink_impl(DirEntry *self, PyTypeObject *defining_class); static PyObject * -os_DirEntry_is_symlink(DirEntry *self, PyObject *Py_UNUSED(ignored)) +os_DirEntry_is_symlink(DirEntry *self, PyTypeObject *defining_class, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; + static const char * const _keywords[] = { NULL}; + static _PyArg_Parser _parser = {":is_symlink", _keywords, 0}; int _return_value; - _return_value = os_DirEntry_is_symlink_impl(self); + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser + )) { + goto exit; + } + _return_value = os_DirEntry_is_symlink_impl(self, defining_class); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; } @@ -7794,34 +8422,25 @@ PyDoc_STRVAR(os_DirEntry_stat__doc__, "Return stat_result object for the entry; cached per entry."); #define OS_DIRENTRY_STAT_METHODDEF \ - {"stat", (PyCFunction)(void(*)(void))os_DirEntry_stat, METH_FASTCALL|METH_KEYWORDS, os_DirEntry_stat__doc__}, + {"stat", (PyCFunction)(void(*)(void))os_DirEntry_stat, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, os_DirEntry_stat__doc__}, static PyObject * -os_DirEntry_stat_impl(DirEntry *self, int follow_symlinks); +os_DirEntry_stat_impl(DirEntry *self, PyTypeObject *defining_class, + int follow_symlinks); static PyObject * -os_DirEntry_stat(DirEntry *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +os_DirEntry_stat(DirEntry *self, PyTypeObject *defining_class, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; static const char * const _keywords[] = {"follow_symlinks", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "stat", 0}; - PyObject *argsbuf[1]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + static _PyArg_Parser _parser = {"|$p:stat", _keywords, 0}; int follow_symlinks = 1; - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); - if (!args) { - goto exit; - } - if (!noptargs) { - goto skip_optional_kwonly; - } - follow_symlinks = PyObject_IsTrue(args[0]); - if (follow_symlinks < 0) { + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &follow_symlinks)) { goto exit; } -skip_optional_kwonly: - return_value = os_DirEntry_stat_impl(self, follow_symlinks); + return_value = os_DirEntry_stat_impl(self, defining_class, follow_symlinks); exit: return return_value; @@ -7834,35 +8453,26 @@ PyDoc_STRVAR(os_DirEntry_is_dir__doc__, "Return True if the entry is a directory; cached per entry."); #define OS_DIRENTRY_IS_DIR_METHODDEF \ - {"is_dir", (PyCFunction)(void(*)(void))os_DirEntry_is_dir, METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_dir__doc__}, + {"is_dir", (PyCFunction)(void(*)(void))os_DirEntry_is_dir, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_dir__doc__}, static int -os_DirEntry_is_dir_impl(DirEntry *self, int follow_symlinks); +os_DirEntry_is_dir_impl(DirEntry *self, PyTypeObject *defining_class, + int follow_symlinks); static PyObject * -os_DirEntry_is_dir(DirEntry *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +os_DirEntry_is_dir(DirEntry *self, PyTypeObject *defining_class, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; static const char * const _keywords[] = {"follow_symlinks", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "is_dir", 0}; - PyObject *argsbuf[1]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + static _PyArg_Parser _parser = {"|$p:is_dir", _keywords, 0}; int follow_symlinks = 1; int _return_value; - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); - if (!args) { - goto exit; - } - if (!noptargs) { - goto skip_optional_kwonly; - } - follow_symlinks = PyObject_IsTrue(args[0]); - if (follow_symlinks < 0) { + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &follow_symlinks)) { goto exit; } -skip_optional_kwonly: - _return_value = os_DirEntry_is_dir_impl(self, follow_symlinks); + _return_value = os_DirEntry_is_dir_impl(self, defining_class, follow_symlinks); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; } @@ -7879,35 +8489,26 @@ PyDoc_STRVAR(os_DirEntry_is_file__doc__, "Return True if the entry is a file; cached per entry."); #define OS_DIRENTRY_IS_FILE_METHODDEF \ - {"is_file", (PyCFunction)(void(*)(void))os_DirEntry_is_file, METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_file__doc__}, + {"is_file", (PyCFunction)(void(*)(void))os_DirEntry_is_file, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, os_DirEntry_is_file__doc__}, static int -os_DirEntry_is_file_impl(DirEntry *self, int follow_symlinks); +os_DirEntry_is_file_impl(DirEntry *self, PyTypeObject *defining_class, + int follow_symlinks); static PyObject * -os_DirEntry_is_file(DirEntry *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +os_DirEntry_is_file(DirEntry *self, PyTypeObject *defining_class, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; static const char * const _keywords[] = {"follow_symlinks", NULL}; - static _PyArg_Parser _parser = {NULL, _keywords, "is_file", 0}; - PyObject *argsbuf[1]; - Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; + static _PyArg_Parser _parser = {"|$p:is_file", _keywords, 0}; int follow_symlinks = 1; int _return_value; - args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf); - if (!args) { - goto exit; - } - if (!noptargs) { - goto skip_optional_kwonly; - } - follow_symlinks = PyObject_IsTrue(args[0]); - if (follow_symlinks < 0) { + if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser, + &follow_symlinks)) { goto exit; } -skip_optional_kwonly: - _return_value = os_DirEntry_is_file_impl(self, follow_symlinks); + _return_value = os_DirEntry_is_file_impl(self, defining_class, follow_symlinks); if ((_return_value == -1) && PyErr_Occurred()) { goto exit; } @@ -8192,6 +8793,54 @@ exit: #endif /* defined(MS_WINDOWS) */ +#if (defined(WIFEXITED) || defined(MS_WINDOWS)) + +PyDoc_STRVAR(os_waitstatus_to_exitcode__doc__, +"waitstatus_to_exitcode($module, /, status)\n" +"--\n" +"\n" +"Convert a wait status to an exit code.\n" +"\n" +"On Unix:\n" +"\n" +"* If WIFEXITED(status) is true, return WEXITSTATUS(status).\n" +"* If WIFSIGNALED(status) is true, return -WTERMSIG(status).\n" +"* Otherwise, raise a ValueError.\n" +"\n" +"On Windows, return status shifted right by 8 bits.\n" +"\n" +"On Unix, if the process is being traced or if waitpid() was called with\n" +"WUNTRACED option, the caller must first check if WIFSTOPPED(status) is true.\n" +"This function must not be called if WIFSTOPPED(status) is true."); + +#define OS_WAITSTATUS_TO_EXITCODE_METHODDEF \ + {"waitstatus_to_exitcode", (PyCFunction)(void(*)(void))os_waitstatus_to_exitcode, METH_FASTCALL|METH_KEYWORDS, os_waitstatus_to_exitcode__doc__}, + +static PyObject * +os_waitstatus_to_exitcode_impl(PyObject *module, PyObject *status_obj); + +static PyObject * +os_waitstatus_to_exitcode(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"status", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "waitstatus_to_exitcode", 0}; + PyObject *argsbuf[1]; + PyObject *status_obj; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + status_obj = args[0]; + return_value = os_waitstatus_to_exitcode_impl(module, status_obj); + +exit: + return return_value; +} + +#endif /* (defined(WIFEXITED) || defined(MS_WINDOWS)) */ + #ifndef OS_TTYNAME_METHODDEF #define OS_TTYNAME_METHODDEF #endif /* !defined(OS_TTYNAME_METHODDEF) */ @@ -8384,10 +9033,18 @@ exit: #define OS_GETPID_METHODDEF #endif /* !defined(OS_GETPID_METHODDEF) */ +#ifndef OS_GETGROUPLIST_METHODDEF + #define OS_GETGROUPLIST_METHODDEF +#endif /* !defined(OS_GETGROUPLIST_METHODDEF) */ + #ifndef OS_GETGROUPS_METHODDEF #define OS_GETGROUPS_METHODDEF #endif /* !defined(OS_GETGROUPS_METHODDEF) */ +#ifndef OS_INITGROUPS_METHODDEF + #define OS_INITGROUPS_METHODDEF +#endif /* !defined(OS_INITGROUPS_METHODDEF) */ + #ifndef OS_GETPGID_METHODDEF #define OS_GETPGID_METHODDEF #endif /* !defined(OS_GETPGID_METHODDEF) */ @@ -8472,6 +9129,10 @@ exit: #define OS_WAIT_METHODDEF #endif /* !defined(OS_WAIT_METHODDEF) */ +#ifndef OS_PIDFD_OPEN_METHODDEF + #define OS_PIDFD_OPEN_METHODDEF +#endif /* !defined(OS_PIDFD_OPEN_METHODDEF) */ + #ifndef OS_READLINK_METHODDEF #define OS_READLINK_METHODDEF #endif /* !defined(OS_READLINK_METHODDEF) */ @@ -8520,6 +9181,10 @@ exit: #define OS_PREADV_METHODDEF #endif /* !defined(OS_PREADV_METHODDEF) */ +#ifndef OS_SENDFILE_METHODDEF + #define OS_SENDFILE_METHODDEF +#endif /* !defined(OS_SENDFILE_METHODDEF) */ + #ifndef OS__FCOPYFILE_METHODDEF #define OS__FCOPYFILE_METHODDEF #endif /* !defined(OS__FCOPYFILE_METHODDEF) */ @@ -8696,6 +9361,10 @@ exit: #define OS_MEMFD_CREATE_METHODDEF #endif /* !defined(OS_MEMFD_CREATE_METHODDEF) */ +#ifndef OS_GET_TERMINAL_SIZE_METHODDEF + #define OS_GET_TERMINAL_SIZE_METHODDEF +#endif /* !defined(OS_GET_TERMINAL_SIZE_METHODDEF) */ + #ifndef OS_GET_HANDLE_INHERITABLE_METHODDEF #define OS_GET_HANDLE_INHERITABLE_METHODDEF #endif /* !defined(OS_GET_HANDLE_INHERITABLE_METHODDEF) */ @@ -8723,4 +9392,8 @@ exit: #ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF #define OS__REMOVE_DLL_DIRECTORY_METHODDEF #endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */ -/*[clinic end generated code: output=edb5a840b51fcaa8 input=a9049054013a1b77]*/ + +#ifndef OS_WAITSTATUS_TO_EXITCODE_METHODDEF + #define OS_WAITSTATUS_TO_EXITCODE_METHODDEF +#endif /* !defined(OS_WAITSTATUS_TO_EXITCODE_METHODDEF) */ +/*[clinic end generated code: output=005919eaaef3f8e6 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/selectmodule.c.h b/Modules/clinic/selectmodule.c.h index a9e14840710c7a1f441d4fc1f208c5542553401e..c1072e6ef94304acf5f71c32c349a601575bc22b 100644 --- a/Modules/clinic/selectmodule.c.h +++ b/Modules/clinic/selectmodule.c.h @@ -963,11 +963,11 @@ select_kqueue(PyTypeObject *type, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; - if ((type == &kqueue_queue_Type) && + if ((type == _selectstate_global->kqueue_queue_Type) && !_PyArg_NoPositional("kqueue", args)) { goto exit; } - if ((type == &kqueue_queue_Type) && + if ((type == _selectstate_global->kqueue_queue_Type) && !_PyArg_NoKeywords("kqueue", kwargs)) { goto exit; } @@ -1219,4 +1219,4 @@ exit: #ifndef SELECT_KQUEUE_CONTROL_METHODDEF #define SELECT_KQUEUE_CONTROL_METHODDEF #endif /* !defined(SELECT_KQUEUE_CONTROL_METHODDEF) */ -/*[clinic end generated code: output=86010dde10ca89c6 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=ef42c3485a8fe3a0 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/sha1module.c.h b/Modules/clinic/sha1module.c.h index 001c6af73782effa0c2f4718e81e255cd4a179f7..fc37b1ab880ffa0582a189db77b5053bf2c13f98 100644 --- a/Modules/clinic/sha1module.c.h +++ b/Modules/clinic/sha1module.c.h @@ -66,7 +66,7 @@ PyDoc_STRVAR(SHA1Type_update__doc__, {"update", (PyCFunction)SHA1Type_update, METH_O, SHA1Type_update__doc__}, PyDoc_STRVAR(_sha1_sha1__doc__, -"sha1($module, /, string=b\'\')\n" +"sha1($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" "Return a new SHA1 hash object; optionally initialized with a string."); @@ -75,17 +75,18 @@ PyDoc_STRVAR(_sha1_sha1__doc__, {"sha1", (PyCFunction)(void(*)(void))_sha1_sha1, METH_FASTCALL|METH_KEYWORDS, _sha1_sha1__doc__}, static PyObject * -_sha1_sha1_impl(PyObject *module, PyObject *string); +_sha1_sha1_impl(PyObject *module, PyObject *string, int usedforsecurity); static PyObject * _sha1_sha1(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "sha1", 0}; - PyObject *argsbuf[1]; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *string = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -94,11 +95,24 @@ _sha1_sha1(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject * if (!noptargs) { goto skip_optional_pos; } - string = args[0]; + if (args[0]) { + string = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _sha1_sha1_impl(module, string); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _sha1_sha1_impl(module, string, usedforsecurity); exit: return return_value; } -/*[clinic end generated code: output=1ae7e73ec84a27d5 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=3ddd637ae17e14b3 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/sha256module.c.h b/Modules/clinic/sha256module.c.h index 658abb15cf309dfdc0b2ce694b76a0bc0b0acaff..2a788ea98499f3953c85b35a542efcfefc313125 100644 --- a/Modules/clinic/sha256module.c.h +++ b/Modules/clinic/sha256module.c.h @@ -66,7 +66,7 @@ PyDoc_STRVAR(SHA256Type_update__doc__, {"update", (PyCFunction)SHA256Type_update, METH_O, SHA256Type_update__doc__}, PyDoc_STRVAR(_sha256_sha256__doc__, -"sha256($module, /, string=b\'\')\n" +"sha256($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" "Return a new SHA-256 hash object; optionally initialized with a string."); @@ -75,17 +75,18 @@ PyDoc_STRVAR(_sha256_sha256__doc__, {"sha256", (PyCFunction)(void(*)(void))_sha256_sha256, METH_FASTCALL|METH_KEYWORDS, _sha256_sha256__doc__}, static PyObject * -_sha256_sha256_impl(PyObject *module, PyObject *string); +_sha256_sha256_impl(PyObject *module, PyObject *string, int usedforsecurity); static PyObject * _sha256_sha256(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "sha256", 0}; - PyObject *argsbuf[1]; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *string = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -94,16 +95,29 @@ _sha256_sha256(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje if (!noptargs) { goto skip_optional_pos; } - string = args[0]; + if (args[0]) { + string = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _sha256_sha256_impl(module, string); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _sha256_sha256_impl(module, string, usedforsecurity); exit: return return_value; } PyDoc_STRVAR(_sha256_sha224__doc__, -"sha224($module, /, string=b\'\')\n" +"sha224($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" "Return a new SHA-224 hash object; optionally initialized with a string."); @@ -112,17 +126,18 @@ PyDoc_STRVAR(_sha256_sha224__doc__, {"sha224", (PyCFunction)(void(*)(void))_sha256_sha224, METH_FASTCALL|METH_KEYWORDS, _sha256_sha224__doc__}, static PyObject * -_sha256_sha224_impl(PyObject *module, PyObject *string); +_sha256_sha224_impl(PyObject *module, PyObject *string, int usedforsecurity); static PyObject * _sha256_sha224(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "sha224", 0}; - PyObject *argsbuf[1]; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *string = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -131,11 +146,24 @@ _sha256_sha224(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje if (!noptargs) { goto skip_optional_pos; } - string = args[0]; + if (args[0]) { + string = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _sha256_sha224_impl(module, string); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _sha256_sha224_impl(module, string, usedforsecurity); exit: return return_value; } -/*[clinic end generated code: output=c54d0956ec88409d input=a9049054013a1b77]*/ +/*[clinic end generated code: output=c8cca8adbe72ec9a input=a9049054013a1b77]*/ diff --git a/Modules/clinic/sha512module.c.h b/Modules/clinic/sha512module.c.h index 459a9341cfc5bc48d0d956571f016cde3442cadd..b8185b62bb66961028519d33149d90be337beef8 100644 --- a/Modules/clinic/sha512module.c.h +++ b/Modules/clinic/sha512module.c.h @@ -66,7 +66,7 @@ PyDoc_STRVAR(SHA512Type_update__doc__, {"update", (PyCFunction)SHA512Type_update, METH_O, SHA512Type_update__doc__}, PyDoc_STRVAR(_sha512_sha512__doc__, -"sha512($module, /, string=b\'\')\n" +"sha512($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" "Return a new SHA-512 hash object; optionally initialized with a string."); @@ -75,17 +75,18 @@ PyDoc_STRVAR(_sha512_sha512__doc__, {"sha512", (PyCFunction)(void(*)(void))_sha512_sha512, METH_FASTCALL|METH_KEYWORDS, _sha512_sha512__doc__}, static PyObject * -_sha512_sha512_impl(PyObject *module, PyObject *string); +_sha512_sha512_impl(PyObject *module, PyObject *string, int usedforsecurity); static PyObject * _sha512_sha512(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "sha512", 0}; - PyObject *argsbuf[1]; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *string = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -94,16 +95,29 @@ _sha512_sha512(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje if (!noptargs) { goto skip_optional_pos; } - string = args[0]; + if (args[0]) { + string = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _sha512_sha512_impl(module, string); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _sha512_sha512_impl(module, string, usedforsecurity); exit: return return_value; } PyDoc_STRVAR(_sha512_sha384__doc__, -"sha384($module, /, string=b\'\')\n" +"sha384($module, /, string=b\'\', *, usedforsecurity=True)\n" "--\n" "\n" "Return a new SHA-384 hash object; optionally initialized with a string."); @@ -112,17 +126,18 @@ PyDoc_STRVAR(_sha512_sha384__doc__, {"sha384", (PyCFunction)(void(*)(void))_sha512_sha384, METH_FASTCALL|METH_KEYWORDS, _sha512_sha384__doc__}, static PyObject * -_sha512_sha384_impl(PyObject *module, PyObject *string); +_sha512_sha384_impl(PyObject *module, PyObject *string, int usedforsecurity); static PyObject * _sha512_sha384(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - static const char * const _keywords[] = {"string", NULL}; + static const char * const _keywords[] = {"string", "usedforsecurity", NULL}; static _PyArg_Parser _parser = {NULL, _keywords, "sha384", 0}; - PyObject *argsbuf[1]; + PyObject *argsbuf[2]; Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0; PyObject *string = NULL; + int usedforsecurity = 1; args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf); if (!args) { @@ -131,11 +146,24 @@ _sha512_sha384(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObje if (!noptargs) { goto skip_optional_pos; } - string = args[0]; + if (args[0]) { + string = args[0]; + if (!--noptargs) { + goto skip_optional_pos; + } + } skip_optional_pos: - return_value = _sha512_sha384_impl(module, string); + if (!noptargs) { + goto skip_optional_kwonly; + } + usedforsecurity = PyObject_IsTrue(args[1]); + if (usedforsecurity < 0) { + goto exit; + } +skip_optional_kwonly: + return_value = _sha512_sha384_impl(module, string, usedforsecurity); exit: return return_value; } -/*[clinic end generated code: output=580df4b667084a7e input=a9049054013a1b77]*/ +/*[clinic end generated code: output=bbfa72d8703c82b5 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/signalmodule.c.h b/Modules/clinic/signalmodule.c.h index 3cb1db14878c5670192374eac3fa0dfa2b280066..7f60e28a3a28a203fa35dc7fa175859567e59fa4 100644 --- a/Modules/clinic/signalmodule.c.h +++ b/Modules/clinic/signalmodule.c.h @@ -611,6 +611,76 @@ exit: #endif /* defined(HAVE_PTHREAD_KILL) */ +#if (defined(__linux__) && defined(__NR_pidfd_send_signal)) + +PyDoc_STRVAR(signal_pidfd_send_signal__doc__, +"pidfd_send_signal($module, pidfd, signalnum, siginfo=None, flags=0, /)\n" +"--\n" +"\n" +"Send a signal to a process referred to by a pid file descriptor."); + +#define SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF \ + {"pidfd_send_signal", (PyCFunction)(void(*)(void))signal_pidfd_send_signal, METH_FASTCALL, signal_pidfd_send_signal__doc__}, + +static PyObject * +signal_pidfd_send_signal_impl(PyObject *module, int pidfd, int signalnum, + PyObject *siginfo, int flags); + +static PyObject * +signal_pidfd_send_signal(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + int pidfd; + int signalnum; + PyObject *siginfo = Py_None; + int flags = 0; + + if (!_PyArg_CheckPositional("pidfd_send_signal", nargs, 2, 4)) { + goto exit; + } + if (PyFloat_Check(args[0])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + pidfd = _PyLong_AsInt(args[0]); + if (pidfd == -1 && PyErr_Occurred()) { + goto exit; + } + if (PyFloat_Check(args[1])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + signalnum = _PyLong_AsInt(args[1]); + if (signalnum == -1 && PyErr_Occurred()) { + goto exit; + } + if (nargs < 3) { + goto skip_optional; + } + siginfo = args[2]; + if (nargs < 4) { + goto skip_optional; + } + if (PyFloat_Check(args[3])) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + goto exit; + } + flags = _PyLong_AsInt(args[3]); + if (flags == -1 && PyErr_Occurred()) { + goto exit; + } +skip_optional: + return_value = signal_pidfd_send_signal_impl(module, pidfd, signalnum, siginfo, flags); + +exit: + return return_value; +} + +#endif /* (defined(__linux__) && defined(__NR_pidfd_send_signal)) */ + #ifndef SIGNAL_ALARM_METHODDEF #define SIGNAL_ALARM_METHODDEF #endif /* !defined(SIGNAL_ALARM_METHODDEF) */ @@ -658,4 +728,8 @@ exit: #ifndef SIGNAL_PTHREAD_KILL_METHODDEF #define SIGNAL_PTHREAD_KILL_METHODDEF #endif /* !defined(SIGNAL_PTHREAD_KILL_METHODDEF) */ -/*[clinic end generated code: output=3320b8f73c20ba60 input=a9049054013a1b77]*/ + +#ifndef SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF + #define SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF +#endif /* !defined(SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF) */ +/*[clinic end generated code: output=b41b4b6bd9ad4da2 input=a9049054013a1b77]*/ diff --git a/Modules/cmathmodule.c b/Modules/cmathmodule.c index 02c09bbea48ac3b63246d6ac4ccf1605228cf148..5eac4b4940bea4dbb004097df4eababba35b58a6 100644 --- a/Modules/cmathmodule.c +++ b/Modules/cmathmodule.c @@ -3,6 +3,7 @@ /* much code borrowed from mathmodule.c */ #include "Python.h" +#include "pycore_dtoa.h" #include "_math.h" /* we need DBL_MAX, DBL_MIN, DBL_EPSILON, DBL_MANT_DIG and FLT_RADIX from float.h. We assume that FLT_RADIX is either 2 or 16. */ @@ -17,7 +18,7 @@ module cmath /*[python input] class Py_complex_protected_converter(Py_complex_converter): def modify(self): - return 'errno = 0; PyFPE_START_PROTECT("complex function", goto exit);' + return 'errno = 0;' class Py_complex_protected_return_converter(CReturnConverter): @@ -26,7 +27,6 @@ class Py_complex_protected_return_converter(CReturnConverter): def render(self, function, data): self.declare(data) data.return_conversion.append(""" -PyFPE_END_PROTECT(_return_value); if (errno == EDOM) { PyErr_SetString(PyExc_ValueError, "math domain error"); goto exit; @@ -40,7 +40,7 @@ else { } """.strip()) [python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=345daa075b1028e7]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=8b27adb674c08321]*/ #if (FLT_RADIX != 2 && FLT_RADIX != 16) #error "Modules/cmathmodule.c expects FLT_RADIX to be 2 or 16" @@ -960,7 +960,6 @@ cmath_log_impl(PyObject *module, Py_complex x, PyObject *y_obj) Py_complex y; errno = 0; - PyFPE_START_PROTECT("complex function", return 0) x = c_log(x); if (y_obj != NULL) { y = PyComplex_AsCComplex(y_obj); @@ -970,7 +969,6 @@ cmath_log_impl(PyObject *module, Py_complex x, PyObject *y_obj) y = c_log(y); x = _Py_c_quot(x, y); } - PyFPE_END_PROTECT(x) if (errno != 0) return math_error(); return PyComplex_FromCComplex(x); @@ -1008,9 +1006,7 @@ cmath_phase_impl(PyObject *module, Py_complex z) double phi; errno = 0; - PyFPE_START_PROTECT("arg function", return 0) phi = c_atan2(z); - PyFPE_END_PROTECT(phi) if (errno != 0) return math_error(); else @@ -1035,10 +1031,8 @@ cmath_polar_impl(PyObject *module, Py_complex z) double r, phi; errno = 0; - PyFPE_START_PROTECT("polar function", return 0) phi = c_atan2(z); /* should not cause any exception */ r = _Py_c_abs(z); /* sets errno to ERANGE on overflow */ - PyFPE_END_PROTECT(r) if (errno != 0) return math_error(); else @@ -1074,7 +1068,6 @@ cmath_rect_impl(PyObject *module, double r, double phi) { Py_complex z; errno = 0; - PyFPE_START_PROTECT("rect function", return 0) /* deal with special values */ if (!Py_IS_FINITE(r) || !Py_IS_FINITE(phi)) { @@ -1116,7 +1109,6 @@ cmath_rect_impl(PyObject *module, double r, double phi) errno = 0; } - PyFPE_END_PROTECT(z) if (errno != 0) return math_error(); else diff --git a/Modules/errnomodule.c b/Modules/errnomodule.c index 06ed53a64dbdc1835cd53fb4d473430c3fdfb9dd..d99bed45bd6a23987fc8d0c6ed9ca021be9dbb75 100644 --- a/Modules/errnomodule.c +++ b/Modules/errnomodule.c @@ -46,66 +46,57 @@ static PyMethodDef errno_methods[] = { /* Helper function doing the dictionary inserting */ -static void -_inscode(PyObject *d, PyObject *de, const char *name, int code) +static int +_add_errcode(PyObject *module_dict, PyObject *error_dict, const char *name_str, int code_int) { - PyObject *u = PyUnicode_FromString(name); - PyObject *v = PyLong_FromLong((long) code); - - /* Don't bother checking for errors; they'll be caught at the end - * of the module initialization function by the caller of - * initerrno(). - */ - if (u && v) { - /* insert in modules dict */ - PyDict_SetItem(d, u, v); - /* insert in errorcode dict */ - PyDict_SetItem(de, v, u); + PyObject *name = PyUnicode_FromString(name_str); + if (!name) { + return -1; } - Py_XDECREF(u); - Py_XDECREF(v); -} -PyDoc_STRVAR(errno__doc__, -"This module makes available standard errno system symbols.\n\ -\n\ -The value of each symbol is the corresponding integer value,\n\ -e.g., on most systems, errno.ENOENT equals the integer 2.\n\ -\n\ -The dictionary errno.errorcode maps numeric codes to symbol names,\n\ -e.g., errno.errorcode[2] could be the string 'ENOENT'.\n\ -\n\ -Symbols that are not relevant to the underlying system are not defined.\n\ -\n\ -To map error codes to error messages, use the function os.strerror(),\n\ -e.g. os.strerror(2) could return 'No such file or directory'."); + PyObject *code = PyLong_FromLong(code_int); + if (!code) { + Py_DECREF(name); + return -1; + } -static struct PyModuleDef errnomodule = { - PyModuleDef_HEAD_INIT, - "errno", - errno__doc__, - -1, - errno_methods, - NULL, - NULL, - NULL, - NULL -}; + int ret = -1; + /* insert in modules dict */ + if (PyDict_SetItem(module_dict, name, code) < 0) { + goto end; + } + /* insert in errorcode dict */ + if (PyDict_SetItem(error_dict, code, name) < 0) { + goto end; + } + ret = 0; +end: + Py_DECREF(name); + Py_DECREF(code); + return ret; +} -PyMODINIT_FUNC -PyInit_errno(void) +static int +errno_exec(PyObject *module) { - PyObject *m, *d, *de; - m = PyModule_Create(&errnomodule); - if (m == NULL) - return NULL; - d = PyModule_GetDict(m); - de = PyDict_New(); - if (!d || !de || PyDict_SetItemString(d, "errorcode", de) < 0) - return NULL; + PyObject *module_dict = PyModule_GetDict(module); + PyObject *error_dict = PyDict_New(); + if (!module_dict || !error_dict) { + return -1; + } + if (PyDict_SetItemString(module_dict, "errorcode", error_dict) < 0) { + Py_DECREF(error_dict); + return -1; + } /* Macro so I don't have to edit each and every line below... */ -#define inscode(d, ds, de, name, code, comment) _inscode(d, de, name, code) +#define add_errcode(name, code, comment) \ + do { \ + if (_add_errcode(module_dict, error_dict, name, code) < 0) { \ + Py_DECREF(error_dict); \ + return -1; \ + } \ + } while (0); /* * The names and comments are borrowed from linux/include/errno.h, @@ -116,820 +107,854 @@ PyInit_errno(void) */ #ifdef ENODEV - inscode(d, ds, de, "ENODEV", ENODEV, "No such device"); + add_errcode("ENODEV", ENODEV, "No such device"); #endif #ifdef ENOCSI - inscode(d, ds, de, "ENOCSI", ENOCSI, "No CSI structure available"); + add_errcode("ENOCSI", ENOCSI, "No CSI structure available"); #endif #ifdef EHOSTUNREACH - inscode(d, ds, de, "EHOSTUNREACH", EHOSTUNREACH, "No route to host"); + add_errcode("EHOSTUNREACH", EHOSTUNREACH, "No route to host"); #else #ifdef WSAEHOSTUNREACH - inscode(d, ds, de, "EHOSTUNREACH", WSAEHOSTUNREACH, "No route to host"); + add_errcode("EHOSTUNREACH", WSAEHOSTUNREACH, "No route to host"); #endif #endif #ifdef ENOMSG - inscode(d, ds, de, "ENOMSG", ENOMSG, "No message of desired type"); + add_errcode("ENOMSG", ENOMSG, "No message of desired type"); #endif #ifdef EUCLEAN - inscode(d, ds, de, "EUCLEAN", EUCLEAN, "Structure needs cleaning"); + add_errcode("EUCLEAN", EUCLEAN, "Structure needs cleaning"); #endif #ifdef EL2NSYNC - inscode(d, ds, de, "EL2NSYNC", EL2NSYNC, "Level 2 not synchronized"); + add_errcode("EL2NSYNC", EL2NSYNC, "Level 2 not synchronized"); #endif #ifdef EL2HLT - inscode(d, ds, de, "EL2HLT", EL2HLT, "Level 2 halted"); + add_errcode("EL2HLT", EL2HLT, "Level 2 halted"); #endif #ifdef ENODATA - inscode(d, ds, de, "ENODATA", ENODATA, "No data available"); + add_errcode("ENODATA", ENODATA, "No data available"); #endif #ifdef ENOTBLK - inscode(d, ds, de, "ENOTBLK", ENOTBLK, "Block device required"); + add_errcode("ENOTBLK", ENOTBLK, "Block device required"); #endif #ifdef ENOSYS - inscode(d, ds, de, "ENOSYS", ENOSYS, "Function not implemented"); + add_errcode("ENOSYS", ENOSYS, "Function not implemented"); #endif #ifdef EPIPE - inscode(d, ds, de, "EPIPE", EPIPE, "Broken pipe"); + add_errcode("EPIPE", EPIPE, "Broken pipe"); #endif #ifdef EINVAL - inscode(d, ds, de, "EINVAL", EINVAL, "Invalid argument"); + add_errcode("EINVAL", EINVAL, "Invalid argument"); #else #ifdef WSAEINVAL - inscode(d, ds, de, "EINVAL", WSAEINVAL, "Invalid argument"); + add_errcode("EINVAL", WSAEINVAL, "Invalid argument"); #endif #endif #ifdef EOVERFLOW - inscode(d, ds, de, "EOVERFLOW", EOVERFLOW, "Value too large for defined data type"); + add_errcode("EOVERFLOW", EOVERFLOW, "Value too large for defined data type"); #endif #ifdef EADV - inscode(d, ds, de, "EADV", EADV, "Advertise error"); + add_errcode("EADV", EADV, "Advertise error"); #endif #ifdef EINTR - inscode(d, ds, de, "EINTR", EINTR, "Interrupted system call"); + add_errcode("EINTR", EINTR, "Interrupted system call"); #else #ifdef WSAEINTR - inscode(d, ds, de, "EINTR", WSAEINTR, "Interrupted system call"); + add_errcode("EINTR", WSAEINTR, "Interrupted system call"); #endif #endif #ifdef EUSERS - inscode(d, ds, de, "EUSERS", EUSERS, "Too many users"); + add_errcode("EUSERS", EUSERS, "Too many users"); #else #ifdef WSAEUSERS - inscode(d, ds, de, "EUSERS", WSAEUSERS, "Too many users"); + add_errcode("EUSERS", WSAEUSERS, "Too many users"); #endif #endif #ifdef ENOTEMPTY - inscode(d, ds, de, "ENOTEMPTY", ENOTEMPTY, "Directory not empty"); + add_errcode("ENOTEMPTY", ENOTEMPTY, "Directory not empty"); #else #ifdef WSAENOTEMPTY - inscode(d, ds, de, "ENOTEMPTY", WSAENOTEMPTY, "Directory not empty"); + add_errcode("ENOTEMPTY", WSAENOTEMPTY, "Directory not empty"); #endif #endif #ifdef ENOBUFS - inscode(d, ds, de, "ENOBUFS", ENOBUFS, "No buffer space available"); + add_errcode("ENOBUFS", ENOBUFS, "No buffer space available"); #else #ifdef WSAENOBUFS - inscode(d, ds, de, "ENOBUFS", WSAENOBUFS, "No buffer space available"); + add_errcode("ENOBUFS", WSAENOBUFS, "No buffer space available"); #endif #endif #ifdef EPROTO - inscode(d, ds, de, "EPROTO", EPROTO, "Protocol error"); + add_errcode("EPROTO", EPROTO, "Protocol error"); #endif #ifdef EREMOTE - inscode(d, ds, de, "EREMOTE", EREMOTE, "Object is remote"); + add_errcode("EREMOTE", EREMOTE, "Object is remote"); #else #ifdef WSAEREMOTE - inscode(d, ds, de, "EREMOTE", WSAEREMOTE, "Object is remote"); + add_errcode("EREMOTE", WSAEREMOTE, "Object is remote"); #endif #endif #ifdef ENAVAIL - inscode(d, ds, de, "ENAVAIL", ENAVAIL, "No XENIX semaphores available"); + add_errcode("ENAVAIL", ENAVAIL, "No XENIX semaphores available"); #endif #ifdef ECHILD - inscode(d, ds, de, "ECHILD", ECHILD, "No child processes"); + add_errcode("ECHILD", ECHILD, "No child processes"); #endif #ifdef ELOOP - inscode(d, ds, de, "ELOOP", ELOOP, "Too many symbolic links encountered"); + add_errcode("ELOOP", ELOOP, "Too many symbolic links encountered"); #else #ifdef WSAELOOP - inscode(d, ds, de, "ELOOP", WSAELOOP, "Too many symbolic links encountered"); + add_errcode("ELOOP", WSAELOOP, "Too many symbolic links encountered"); #endif #endif #ifdef EXDEV - inscode(d, ds, de, "EXDEV", EXDEV, "Cross-device link"); + add_errcode("EXDEV", EXDEV, "Cross-device link"); #endif #ifdef E2BIG - inscode(d, ds, de, "E2BIG", E2BIG, "Arg list too long"); + add_errcode("E2BIG", E2BIG, "Arg list too long"); #endif #ifdef ESRCH - inscode(d, ds, de, "ESRCH", ESRCH, "No such process"); + add_errcode("ESRCH", ESRCH, "No such process"); #endif #ifdef EMSGSIZE - inscode(d, ds, de, "EMSGSIZE", EMSGSIZE, "Message too long"); + add_errcode("EMSGSIZE", EMSGSIZE, "Message too long"); #else #ifdef WSAEMSGSIZE - inscode(d, ds, de, "EMSGSIZE", WSAEMSGSIZE, "Message too long"); + add_errcode("EMSGSIZE", WSAEMSGSIZE, "Message too long"); #endif #endif #ifdef EAFNOSUPPORT - inscode(d, ds, de, "EAFNOSUPPORT", EAFNOSUPPORT, "Address family not supported by protocol"); + add_errcode("EAFNOSUPPORT", EAFNOSUPPORT, "Address family not supported by protocol"); #else #ifdef WSAEAFNOSUPPORT - inscode(d, ds, de, "EAFNOSUPPORT", WSAEAFNOSUPPORT, "Address family not supported by protocol"); + add_errcode("EAFNOSUPPORT", WSAEAFNOSUPPORT, "Address family not supported by protocol"); #endif #endif #ifdef EBADR - inscode(d, ds, de, "EBADR", EBADR, "Invalid request descriptor"); + add_errcode("EBADR", EBADR, "Invalid request descriptor"); #endif #ifdef EHOSTDOWN - inscode(d, ds, de, "EHOSTDOWN", EHOSTDOWN, "Host is down"); + add_errcode("EHOSTDOWN", EHOSTDOWN, "Host is down"); #else #ifdef WSAEHOSTDOWN - inscode(d, ds, de, "EHOSTDOWN", WSAEHOSTDOWN, "Host is down"); + add_errcode("EHOSTDOWN", WSAEHOSTDOWN, "Host is down"); #endif #endif #ifdef EPFNOSUPPORT - inscode(d, ds, de, "EPFNOSUPPORT", EPFNOSUPPORT, "Protocol family not supported"); + add_errcode("EPFNOSUPPORT", EPFNOSUPPORT, "Protocol family not supported"); #else #ifdef WSAEPFNOSUPPORT - inscode(d, ds, de, "EPFNOSUPPORT", WSAEPFNOSUPPORT, "Protocol family not supported"); + add_errcode("EPFNOSUPPORT", WSAEPFNOSUPPORT, "Protocol family not supported"); #endif #endif #ifdef ENOPROTOOPT - inscode(d, ds, de, "ENOPROTOOPT", ENOPROTOOPT, "Protocol not available"); + add_errcode("ENOPROTOOPT", ENOPROTOOPT, "Protocol not available"); #else #ifdef WSAENOPROTOOPT - inscode(d, ds, de, "ENOPROTOOPT", WSAENOPROTOOPT, "Protocol not available"); + add_errcode("ENOPROTOOPT", WSAENOPROTOOPT, "Protocol not available"); #endif #endif #ifdef EBUSY - inscode(d, ds, de, "EBUSY", EBUSY, "Device or resource busy"); + add_errcode("EBUSY", EBUSY, "Device or resource busy"); #endif #ifdef EWOULDBLOCK - inscode(d, ds, de, "EWOULDBLOCK", EWOULDBLOCK, "Operation would block"); + add_errcode("EWOULDBLOCK", EWOULDBLOCK, "Operation would block"); #else #ifdef WSAEWOULDBLOCK - inscode(d, ds, de, "EWOULDBLOCK", WSAEWOULDBLOCK, "Operation would block"); + add_errcode("EWOULDBLOCK", WSAEWOULDBLOCK, "Operation would block"); #endif #endif #ifdef EBADFD - inscode(d, ds, de, "EBADFD", EBADFD, "File descriptor in bad state"); + add_errcode("EBADFD", EBADFD, "File descriptor in bad state"); #endif #ifdef EDOTDOT - inscode(d, ds, de, "EDOTDOT", EDOTDOT, "RFS specific error"); + add_errcode("EDOTDOT", EDOTDOT, "RFS specific error"); #endif #ifdef EISCONN - inscode(d, ds, de, "EISCONN", EISCONN, "Transport endpoint is already connected"); + add_errcode("EISCONN", EISCONN, "Transport endpoint is already connected"); #else #ifdef WSAEISCONN - inscode(d, ds, de, "EISCONN", WSAEISCONN, "Transport endpoint is already connected"); + add_errcode("EISCONN", WSAEISCONN, "Transport endpoint is already connected"); #endif #endif #ifdef ENOANO - inscode(d, ds, de, "ENOANO", ENOANO, "No anode"); + add_errcode("ENOANO", ENOANO, "No anode"); #endif #ifdef ESHUTDOWN - inscode(d, ds, de, "ESHUTDOWN", ESHUTDOWN, "Cannot send after transport endpoint shutdown"); + add_errcode("ESHUTDOWN", ESHUTDOWN, "Cannot send after transport endpoint shutdown"); #else #ifdef WSAESHUTDOWN - inscode(d, ds, de, "ESHUTDOWN", WSAESHUTDOWN, "Cannot send after transport endpoint shutdown"); + add_errcode("ESHUTDOWN", WSAESHUTDOWN, "Cannot send after transport endpoint shutdown"); #endif #endif #ifdef ECHRNG - inscode(d, ds, de, "ECHRNG", ECHRNG, "Channel number out of range"); + add_errcode("ECHRNG", ECHRNG, "Channel number out of range"); #endif #ifdef ELIBBAD - inscode(d, ds, de, "ELIBBAD", ELIBBAD, "Accessing a corrupted shared library"); + add_errcode("ELIBBAD", ELIBBAD, "Accessing a corrupted shared library"); #endif #ifdef ENONET - inscode(d, ds, de, "ENONET", ENONET, "Machine is not on the network"); + add_errcode("ENONET", ENONET, "Machine is not on the network"); #endif #ifdef EBADE - inscode(d, ds, de, "EBADE", EBADE, "Invalid exchange"); + add_errcode("EBADE", EBADE, "Invalid exchange"); #endif #ifdef EBADF - inscode(d, ds, de, "EBADF", EBADF, "Bad file number"); + add_errcode("EBADF", EBADF, "Bad file number"); #else #ifdef WSAEBADF - inscode(d, ds, de, "EBADF", WSAEBADF, "Bad file number"); + add_errcode("EBADF", WSAEBADF, "Bad file number"); #endif #endif #ifdef EMULTIHOP - inscode(d, ds, de, "EMULTIHOP", EMULTIHOP, "Multihop attempted"); + add_errcode("EMULTIHOP", EMULTIHOP, "Multihop attempted"); #endif #ifdef EIO - inscode(d, ds, de, "EIO", EIO, "I/O error"); + add_errcode("EIO", EIO, "I/O error"); #endif #ifdef EUNATCH - inscode(d, ds, de, "EUNATCH", EUNATCH, "Protocol driver not attached"); + add_errcode("EUNATCH", EUNATCH, "Protocol driver not attached"); #endif #ifdef EPROTOTYPE - inscode(d, ds, de, "EPROTOTYPE", EPROTOTYPE, "Protocol wrong type for socket"); + add_errcode("EPROTOTYPE", EPROTOTYPE, "Protocol wrong type for socket"); #else #ifdef WSAEPROTOTYPE - inscode(d, ds, de, "EPROTOTYPE", WSAEPROTOTYPE, "Protocol wrong type for socket"); + add_errcode("EPROTOTYPE", WSAEPROTOTYPE, "Protocol wrong type for socket"); #endif #endif #ifdef ENOSPC - inscode(d, ds, de, "ENOSPC", ENOSPC, "No space left on device"); + add_errcode("ENOSPC", ENOSPC, "No space left on device"); #endif #ifdef ENOEXEC - inscode(d, ds, de, "ENOEXEC", ENOEXEC, "Exec format error"); + add_errcode("ENOEXEC", ENOEXEC, "Exec format error"); #endif #ifdef EALREADY - inscode(d, ds, de, "EALREADY", EALREADY, "Operation already in progress"); + add_errcode("EALREADY", EALREADY, "Operation already in progress"); #else #ifdef WSAEALREADY - inscode(d, ds, de, "EALREADY", WSAEALREADY, "Operation already in progress"); + add_errcode("EALREADY", WSAEALREADY, "Operation already in progress"); #endif #endif #ifdef ENETDOWN - inscode(d, ds, de, "ENETDOWN", ENETDOWN, "Network is down"); + add_errcode("ENETDOWN", ENETDOWN, "Network is down"); #else #ifdef WSAENETDOWN - inscode(d, ds, de, "ENETDOWN", WSAENETDOWN, "Network is down"); + add_errcode("ENETDOWN", WSAENETDOWN, "Network is down"); #endif #endif #ifdef ENOTNAM - inscode(d, ds, de, "ENOTNAM", ENOTNAM, "Not a XENIX named type file"); + add_errcode("ENOTNAM", ENOTNAM, "Not a XENIX named type file"); #endif #ifdef EACCES - inscode(d, ds, de, "EACCES", EACCES, "Permission denied"); + add_errcode("EACCES", EACCES, "Permission denied"); #else #ifdef WSAEACCES - inscode(d, ds, de, "EACCES", WSAEACCES, "Permission denied"); + add_errcode("EACCES", WSAEACCES, "Permission denied"); #endif #endif #ifdef ELNRNG - inscode(d, ds, de, "ELNRNG", ELNRNG, "Link number out of range"); + add_errcode("ELNRNG", ELNRNG, "Link number out of range"); #endif #ifdef EILSEQ - inscode(d, ds, de, "EILSEQ", EILSEQ, "Illegal byte sequence"); + add_errcode("EILSEQ", EILSEQ, "Illegal byte sequence"); #endif #ifdef ENOTDIR - inscode(d, ds, de, "ENOTDIR", ENOTDIR, "Not a directory"); + add_errcode("ENOTDIR", ENOTDIR, "Not a directory"); #endif #ifdef ENOTUNIQ - inscode(d, ds, de, "ENOTUNIQ", ENOTUNIQ, "Name not unique on network"); + add_errcode("ENOTUNIQ", ENOTUNIQ, "Name not unique on network"); #endif #ifdef EPERM - inscode(d, ds, de, "EPERM", EPERM, "Operation not permitted"); + add_errcode("EPERM", EPERM, "Operation not permitted"); #endif #ifdef EDOM - inscode(d, ds, de, "EDOM", EDOM, "Math argument out of domain of func"); + add_errcode("EDOM", EDOM, "Math argument out of domain of func"); #endif #ifdef EXFULL - inscode(d, ds, de, "EXFULL", EXFULL, "Exchange full"); + add_errcode("EXFULL", EXFULL, "Exchange full"); #endif #ifdef ECONNREFUSED - inscode(d, ds, de, "ECONNREFUSED", ECONNREFUSED, "Connection refused"); + add_errcode("ECONNREFUSED", ECONNREFUSED, "Connection refused"); #else #ifdef WSAECONNREFUSED - inscode(d, ds, de, "ECONNREFUSED", WSAECONNREFUSED, "Connection refused"); + add_errcode("ECONNREFUSED", WSAECONNREFUSED, "Connection refused"); #endif #endif #ifdef EISDIR - inscode(d, ds, de, "EISDIR", EISDIR, "Is a directory"); + add_errcode("EISDIR", EISDIR, "Is a directory"); #endif #ifdef EPROTONOSUPPORT - inscode(d, ds, de, "EPROTONOSUPPORT", EPROTONOSUPPORT, "Protocol not supported"); + add_errcode("EPROTONOSUPPORT", EPROTONOSUPPORT, "Protocol not supported"); #else #ifdef WSAEPROTONOSUPPORT - inscode(d, ds, de, "EPROTONOSUPPORT", WSAEPROTONOSUPPORT, "Protocol not supported"); + add_errcode("EPROTONOSUPPORT", WSAEPROTONOSUPPORT, "Protocol not supported"); #endif #endif #ifdef EROFS - inscode(d, ds, de, "EROFS", EROFS, "Read-only file system"); + add_errcode("EROFS", EROFS, "Read-only file system"); #endif #ifdef EADDRNOTAVAIL - inscode(d, ds, de, "EADDRNOTAVAIL", EADDRNOTAVAIL, "Cannot assign requested address"); + add_errcode("EADDRNOTAVAIL", EADDRNOTAVAIL, "Cannot assign requested address"); #else #ifdef WSAEADDRNOTAVAIL - inscode(d, ds, de, "EADDRNOTAVAIL", WSAEADDRNOTAVAIL, "Cannot assign requested address"); + add_errcode("EADDRNOTAVAIL", WSAEADDRNOTAVAIL, "Cannot assign requested address"); #endif #endif #ifdef EIDRM - inscode(d, ds, de, "EIDRM", EIDRM, "Identifier removed"); + add_errcode("EIDRM", EIDRM, "Identifier removed"); #endif #ifdef ECOMM - inscode(d, ds, de, "ECOMM", ECOMM, "Communication error on send"); + add_errcode("ECOMM", ECOMM, "Communication error on send"); #endif #ifdef ESRMNT - inscode(d, ds, de, "ESRMNT", ESRMNT, "Srmount error"); + add_errcode("ESRMNT", ESRMNT, "Srmount error"); #endif #ifdef EREMOTEIO - inscode(d, ds, de, "EREMOTEIO", EREMOTEIO, "Remote I/O error"); + add_errcode("EREMOTEIO", EREMOTEIO, "Remote I/O error"); #endif #ifdef EL3RST - inscode(d, ds, de, "EL3RST", EL3RST, "Level 3 reset"); + add_errcode("EL3RST", EL3RST, "Level 3 reset"); #endif #ifdef EBADMSG - inscode(d, ds, de, "EBADMSG", EBADMSG, "Not a data message"); + add_errcode("EBADMSG", EBADMSG, "Not a data message"); #endif #ifdef ENFILE - inscode(d, ds, de, "ENFILE", ENFILE, "File table overflow"); + add_errcode("ENFILE", ENFILE, "File table overflow"); #endif #ifdef ELIBMAX - inscode(d, ds, de, "ELIBMAX", ELIBMAX, "Attempting to link in too many shared libraries"); + add_errcode("ELIBMAX", ELIBMAX, "Attempting to link in too many shared libraries"); #endif #ifdef ESPIPE - inscode(d, ds, de, "ESPIPE", ESPIPE, "Illegal seek"); + add_errcode("ESPIPE", ESPIPE, "Illegal seek"); #endif #ifdef ENOLINK - inscode(d, ds, de, "ENOLINK", ENOLINK, "Link has been severed"); + add_errcode("ENOLINK", ENOLINK, "Link has been severed"); #endif #ifdef ENETRESET - inscode(d, ds, de, "ENETRESET", ENETRESET, "Network dropped connection because of reset"); + add_errcode("ENETRESET", ENETRESET, "Network dropped connection because of reset"); #else #ifdef WSAENETRESET - inscode(d, ds, de, "ENETRESET", WSAENETRESET, "Network dropped connection because of reset"); + add_errcode("ENETRESET", WSAENETRESET, "Network dropped connection because of reset"); #endif #endif #ifdef ETIMEDOUT - inscode(d, ds, de, "ETIMEDOUT", ETIMEDOUT, "Connection timed out"); + add_errcode("ETIMEDOUT", ETIMEDOUT, "Connection timed out"); #else #ifdef WSAETIMEDOUT - inscode(d, ds, de, "ETIMEDOUT", WSAETIMEDOUT, "Connection timed out"); + add_errcode("ETIMEDOUT", WSAETIMEDOUT, "Connection timed out"); #endif #endif #ifdef ENOENT - inscode(d, ds, de, "ENOENT", ENOENT, "No such file or directory"); + add_errcode("ENOENT", ENOENT, "No such file or directory"); #endif #ifdef EEXIST - inscode(d, ds, de, "EEXIST", EEXIST, "File exists"); + add_errcode("EEXIST", EEXIST, "File exists"); #endif #ifdef EDQUOT - inscode(d, ds, de, "EDQUOT", EDQUOT, "Quota exceeded"); + add_errcode("EDQUOT", EDQUOT, "Quota exceeded"); #else #ifdef WSAEDQUOT - inscode(d, ds, de, "EDQUOT", WSAEDQUOT, "Quota exceeded"); + add_errcode("EDQUOT", WSAEDQUOT, "Quota exceeded"); #endif #endif #ifdef ENOSTR - inscode(d, ds, de, "ENOSTR", ENOSTR, "Device not a stream"); + add_errcode("ENOSTR", ENOSTR, "Device not a stream"); #endif #ifdef EBADSLT - inscode(d, ds, de, "EBADSLT", EBADSLT, "Invalid slot"); + add_errcode("EBADSLT", EBADSLT, "Invalid slot"); #endif #ifdef EBADRQC - inscode(d, ds, de, "EBADRQC", EBADRQC, "Invalid request code"); + add_errcode("EBADRQC", EBADRQC, "Invalid request code"); #endif #ifdef ELIBACC - inscode(d, ds, de, "ELIBACC", ELIBACC, "Can not access a needed shared library"); + add_errcode("ELIBACC", ELIBACC, "Can not access a needed shared library"); #endif #ifdef EFAULT - inscode(d, ds, de, "EFAULT", EFAULT, "Bad address"); + add_errcode("EFAULT", EFAULT, "Bad address"); #else #ifdef WSAEFAULT - inscode(d, ds, de, "EFAULT", WSAEFAULT, "Bad address"); + add_errcode("EFAULT", WSAEFAULT, "Bad address"); #endif #endif #ifdef EFBIG - inscode(d, ds, de, "EFBIG", EFBIG, "File too large"); + add_errcode("EFBIG", EFBIG, "File too large"); #endif #ifdef EDEADLK - inscode(d, ds, de, "EDEADLK", EDEADLK, "Resource deadlock would occur"); + add_errcode("EDEADLK", EDEADLK, "Resource deadlock would occur"); #endif #ifdef ENOTCONN - inscode(d, ds, de, "ENOTCONN", ENOTCONN, "Transport endpoint is not connected"); + add_errcode("ENOTCONN", ENOTCONN, "Transport endpoint is not connected"); #else #ifdef WSAENOTCONN - inscode(d, ds, de, "ENOTCONN", WSAENOTCONN, "Transport endpoint is not connected"); + add_errcode("ENOTCONN", WSAENOTCONN, "Transport endpoint is not connected"); #endif #endif #ifdef EDESTADDRREQ - inscode(d, ds, de, "EDESTADDRREQ", EDESTADDRREQ, "Destination address required"); + add_errcode("EDESTADDRREQ", EDESTADDRREQ, "Destination address required"); #else #ifdef WSAEDESTADDRREQ - inscode(d, ds, de, "EDESTADDRREQ", WSAEDESTADDRREQ, "Destination address required"); + add_errcode("EDESTADDRREQ", WSAEDESTADDRREQ, "Destination address required"); #endif #endif #ifdef ELIBSCN - inscode(d, ds, de, "ELIBSCN", ELIBSCN, ".lib section in a.out corrupted"); + add_errcode("ELIBSCN", ELIBSCN, ".lib section in a.out corrupted"); #endif #ifdef ENOLCK - inscode(d, ds, de, "ENOLCK", ENOLCK, "No record locks available"); + add_errcode("ENOLCK", ENOLCK, "No record locks available"); #endif #ifdef EISNAM - inscode(d, ds, de, "EISNAM", EISNAM, "Is a named type file"); + add_errcode("EISNAM", EISNAM, "Is a named type file"); #endif #ifdef ECONNABORTED - inscode(d, ds, de, "ECONNABORTED", ECONNABORTED, "Software caused connection abort"); + add_errcode("ECONNABORTED", ECONNABORTED, "Software caused connection abort"); #else #ifdef WSAECONNABORTED - inscode(d, ds, de, "ECONNABORTED", WSAECONNABORTED, "Software caused connection abort"); + add_errcode("ECONNABORTED", WSAECONNABORTED, "Software caused connection abort"); #endif #endif #ifdef ENETUNREACH - inscode(d, ds, de, "ENETUNREACH", ENETUNREACH, "Network is unreachable"); + add_errcode("ENETUNREACH", ENETUNREACH, "Network is unreachable"); #else #ifdef WSAENETUNREACH - inscode(d, ds, de, "ENETUNREACH", WSAENETUNREACH, "Network is unreachable"); + add_errcode("ENETUNREACH", WSAENETUNREACH, "Network is unreachable"); #endif #endif #ifdef ESTALE - inscode(d, ds, de, "ESTALE", ESTALE, "Stale NFS file handle"); + add_errcode("ESTALE", ESTALE, "Stale NFS file handle"); #else #ifdef WSAESTALE - inscode(d, ds, de, "ESTALE", WSAESTALE, "Stale NFS file handle"); + add_errcode("ESTALE", WSAESTALE, "Stale NFS file handle"); #endif #endif #ifdef ENOSR - inscode(d, ds, de, "ENOSR", ENOSR, "Out of streams resources"); + add_errcode("ENOSR", ENOSR, "Out of streams resources"); #endif #ifdef ENOMEM - inscode(d, ds, de, "ENOMEM", ENOMEM, "Out of memory"); + add_errcode("ENOMEM", ENOMEM, "Out of memory"); #endif #ifdef ENOTSOCK - inscode(d, ds, de, "ENOTSOCK", ENOTSOCK, "Socket operation on non-socket"); + add_errcode("ENOTSOCK", ENOTSOCK, "Socket operation on non-socket"); #else #ifdef WSAENOTSOCK - inscode(d, ds, de, "ENOTSOCK", WSAENOTSOCK, "Socket operation on non-socket"); + add_errcode("ENOTSOCK", WSAENOTSOCK, "Socket operation on non-socket"); #endif #endif #ifdef ESTRPIPE - inscode(d, ds, de, "ESTRPIPE", ESTRPIPE, "Streams pipe error"); + add_errcode("ESTRPIPE", ESTRPIPE, "Streams pipe error"); #endif #ifdef EMLINK - inscode(d, ds, de, "EMLINK", EMLINK, "Too many links"); + add_errcode("EMLINK", EMLINK, "Too many links"); #endif #ifdef ERANGE - inscode(d, ds, de, "ERANGE", ERANGE, "Math result not representable"); + add_errcode("ERANGE", ERANGE, "Math result not representable"); #endif #ifdef ELIBEXEC - inscode(d, ds, de, "ELIBEXEC", ELIBEXEC, "Cannot exec a shared library directly"); + add_errcode("ELIBEXEC", ELIBEXEC, "Cannot exec a shared library directly"); #endif #ifdef EL3HLT - inscode(d, ds, de, "EL3HLT", EL3HLT, "Level 3 halted"); + add_errcode("EL3HLT", EL3HLT, "Level 3 halted"); #endif #ifdef ECONNRESET - inscode(d, ds, de, "ECONNRESET", ECONNRESET, "Connection reset by peer"); + add_errcode("ECONNRESET", ECONNRESET, "Connection reset by peer"); #else #ifdef WSAECONNRESET - inscode(d, ds, de, "ECONNRESET", WSAECONNRESET, "Connection reset by peer"); + add_errcode("ECONNRESET", WSAECONNRESET, "Connection reset by peer"); #endif #endif #ifdef EADDRINUSE - inscode(d, ds, de, "EADDRINUSE", EADDRINUSE, "Address already in use"); + add_errcode("EADDRINUSE", EADDRINUSE, "Address already in use"); #else #ifdef WSAEADDRINUSE - inscode(d, ds, de, "EADDRINUSE", WSAEADDRINUSE, "Address already in use"); + add_errcode("EADDRINUSE", WSAEADDRINUSE, "Address already in use"); #endif #endif #ifdef EOPNOTSUPP - inscode(d, ds, de, "EOPNOTSUPP", EOPNOTSUPP, "Operation not supported on transport endpoint"); + add_errcode("EOPNOTSUPP", EOPNOTSUPP, "Operation not supported on transport endpoint"); #else #ifdef WSAEOPNOTSUPP - inscode(d, ds, de, "EOPNOTSUPP", WSAEOPNOTSUPP, "Operation not supported on transport endpoint"); + add_errcode("EOPNOTSUPP", WSAEOPNOTSUPP, "Operation not supported on transport endpoint"); #endif #endif #ifdef EREMCHG - inscode(d, ds, de, "EREMCHG", EREMCHG, "Remote address changed"); + add_errcode("EREMCHG", EREMCHG, "Remote address changed"); #endif #ifdef EAGAIN - inscode(d, ds, de, "EAGAIN", EAGAIN, "Try again"); + add_errcode("EAGAIN", EAGAIN, "Try again"); #endif #ifdef ENAMETOOLONG - inscode(d, ds, de, "ENAMETOOLONG", ENAMETOOLONG, "File name too long"); + add_errcode("ENAMETOOLONG", ENAMETOOLONG, "File name too long"); #else #ifdef WSAENAMETOOLONG - inscode(d, ds, de, "ENAMETOOLONG", WSAENAMETOOLONG, "File name too long"); + add_errcode("ENAMETOOLONG", WSAENAMETOOLONG, "File name too long"); #endif #endif #ifdef ENOTTY - inscode(d, ds, de, "ENOTTY", ENOTTY, "Not a typewriter"); + add_errcode("ENOTTY", ENOTTY, "Not a typewriter"); #endif #ifdef ERESTART - inscode(d, ds, de, "ERESTART", ERESTART, "Interrupted system call should be restarted"); + add_errcode("ERESTART", ERESTART, "Interrupted system call should be restarted"); #endif #ifdef ESOCKTNOSUPPORT - inscode(d, ds, de, "ESOCKTNOSUPPORT", ESOCKTNOSUPPORT, "Socket type not supported"); + add_errcode("ESOCKTNOSUPPORT", ESOCKTNOSUPPORT, "Socket type not supported"); #else #ifdef WSAESOCKTNOSUPPORT - inscode(d, ds, de, "ESOCKTNOSUPPORT", WSAESOCKTNOSUPPORT, "Socket type not supported"); + add_errcode("ESOCKTNOSUPPORT", WSAESOCKTNOSUPPORT, "Socket type not supported"); #endif #endif #ifdef ETIME - inscode(d, ds, de, "ETIME", ETIME, "Timer expired"); + add_errcode("ETIME", ETIME, "Timer expired"); #endif #ifdef EBFONT - inscode(d, ds, de, "EBFONT", EBFONT, "Bad font file format"); + add_errcode("EBFONT", EBFONT, "Bad font file format"); #endif #ifdef EDEADLOCK - inscode(d, ds, de, "EDEADLOCK", EDEADLOCK, "Error EDEADLOCK"); + add_errcode("EDEADLOCK", EDEADLOCK, "Error EDEADLOCK"); #endif #ifdef ETOOMANYREFS - inscode(d, ds, de, "ETOOMANYREFS", ETOOMANYREFS, "Too many references: cannot splice"); + add_errcode("ETOOMANYREFS", ETOOMANYREFS, "Too many references: cannot splice"); #else #ifdef WSAETOOMANYREFS - inscode(d, ds, de, "ETOOMANYREFS", WSAETOOMANYREFS, "Too many references: cannot splice"); + add_errcode("ETOOMANYREFS", WSAETOOMANYREFS, "Too many references: cannot splice"); #endif #endif #ifdef EMFILE - inscode(d, ds, de, "EMFILE", EMFILE, "Too many open files"); + add_errcode("EMFILE", EMFILE, "Too many open files"); #else #ifdef WSAEMFILE - inscode(d, ds, de, "EMFILE", WSAEMFILE, "Too many open files"); + add_errcode("EMFILE", WSAEMFILE, "Too many open files"); #endif #endif #ifdef ETXTBSY - inscode(d, ds, de, "ETXTBSY", ETXTBSY, "Text file busy"); + add_errcode("ETXTBSY", ETXTBSY, "Text file busy"); #endif #ifdef EINPROGRESS - inscode(d, ds, de, "EINPROGRESS", EINPROGRESS, "Operation now in progress"); + add_errcode("EINPROGRESS", EINPROGRESS, "Operation now in progress"); #else #ifdef WSAEINPROGRESS - inscode(d, ds, de, "EINPROGRESS", WSAEINPROGRESS, "Operation now in progress"); + add_errcode("EINPROGRESS", WSAEINPROGRESS, "Operation now in progress"); #endif #endif #ifdef ENXIO - inscode(d, ds, de, "ENXIO", ENXIO, "No such device or address"); + add_errcode("ENXIO", ENXIO, "No such device or address"); #endif #ifdef ENOPKG - inscode(d, ds, de, "ENOPKG", ENOPKG, "Package not installed"); + add_errcode("ENOPKG", ENOPKG, "Package not installed"); #endif #ifdef WSASY - inscode(d, ds, de, "WSASY", WSASY, "Error WSASY"); + add_errcode("WSASY", WSASY, "Error WSASY"); #endif #ifdef WSAEHOSTDOWN - inscode(d, ds, de, "WSAEHOSTDOWN", WSAEHOSTDOWN, "Host is down"); + add_errcode("WSAEHOSTDOWN", WSAEHOSTDOWN, "Host is down"); #endif #ifdef WSAENETDOWN - inscode(d, ds, de, "WSAENETDOWN", WSAENETDOWN, "Network is down"); + add_errcode("WSAENETDOWN", WSAENETDOWN, "Network is down"); #endif #ifdef WSAENOTSOCK - inscode(d, ds, de, "WSAENOTSOCK", WSAENOTSOCK, "Socket operation on non-socket"); + add_errcode("WSAENOTSOCK", WSAENOTSOCK, "Socket operation on non-socket"); #endif #ifdef WSAEHOSTUNREACH - inscode(d, ds, de, "WSAEHOSTUNREACH", WSAEHOSTUNREACH, "No route to host"); + add_errcode("WSAEHOSTUNREACH", WSAEHOSTUNREACH, "No route to host"); #endif #ifdef WSAELOOP - inscode(d, ds, de, "WSAELOOP", WSAELOOP, "Too many symbolic links encountered"); + add_errcode("WSAELOOP", WSAELOOP, "Too many symbolic links encountered"); #endif #ifdef WSAEMFILE - inscode(d, ds, de, "WSAEMFILE", WSAEMFILE, "Too many open files"); + add_errcode("WSAEMFILE", WSAEMFILE, "Too many open files"); #endif #ifdef WSAESTALE - inscode(d, ds, de, "WSAESTALE", WSAESTALE, "Stale NFS file handle"); + add_errcode("WSAESTALE", WSAESTALE, "Stale NFS file handle"); #endif #ifdef WSAVERNOTSUPPORTED - inscode(d, ds, de, "WSAVERNOTSUPPORTED", WSAVERNOTSUPPORTED, "Error WSAVERNOTSUPPORTED"); + add_errcode("WSAVERNOTSUPPORTED", WSAVERNOTSUPPORTED, "Error WSAVERNOTSUPPORTED"); #endif #ifdef WSAENETUNREACH - inscode(d, ds, de, "WSAENETUNREACH", WSAENETUNREACH, "Network is unreachable"); + add_errcode("WSAENETUNREACH", WSAENETUNREACH, "Network is unreachable"); #endif #ifdef WSAEPROCLIM - inscode(d, ds, de, "WSAEPROCLIM", WSAEPROCLIM, "Error WSAEPROCLIM"); + add_errcode("WSAEPROCLIM", WSAEPROCLIM, "Error WSAEPROCLIM"); #endif #ifdef WSAEFAULT - inscode(d, ds, de, "WSAEFAULT", WSAEFAULT, "Bad address"); + add_errcode("WSAEFAULT", WSAEFAULT, "Bad address"); #endif #ifdef WSANOTINITIALISED - inscode(d, ds, de, "WSANOTINITIALISED", WSANOTINITIALISED, "Error WSANOTINITIALISED"); + add_errcode("WSANOTINITIALISED", WSANOTINITIALISED, "Error WSANOTINITIALISED"); #endif #ifdef WSAEUSERS - inscode(d, ds, de, "WSAEUSERS", WSAEUSERS, "Too many users"); + add_errcode("WSAEUSERS", WSAEUSERS, "Too many users"); #endif #ifdef WSAMAKEASYNCREPL - inscode(d, ds, de, "WSAMAKEASYNCREPL", WSAMAKEASYNCREPL, "Error WSAMAKEASYNCREPL"); + add_errcode("WSAMAKEASYNCREPL", WSAMAKEASYNCREPL, "Error WSAMAKEASYNCREPL"); #endif #ifdef WSAENOPROTOOPT - inscode(d, ds, de, "WSAENOPROTOOPT", WSAENOPROTOOPT, "Protocol not available"); + add_errcode("WSAENOPROTOOPT", WSAENOPROTOOPT, "Protocol not available"); #endif #ifdef WSAECONNABORTED - inscode(d, ds, de, "WSAECONNABORTED", WSAECONNABORTED, "Software caused connection abort"); + add_errcode("WSAECONNABORTED", WSAECONNABORTED, "Software caused connection abort"); #endif #ifdef WSAENAMETOOLONG - inscode(d, ds, de, "WSAENAMETOOLONG", WSAENAMETOOLONG, "File name too long"); + add_errcode("WSAENAMETOOLONG", WSAENAMETOOLONG, "File name too long"); #endif #ifdef WSAENOTEMPTY - inscode(d, ds, de, "WSAENOTEMPTY", WSAENOTEMPTY, "Directory not empty"); + add_errcode("WSAENOTEMPTY", WSAENOTEMPTY, "Directory not empty"); #endif #ifdef WSAESHUTDOWN - inscode(d, ds, de, "WSAESHUTDOWN", WSAESHUTDOWN, "Cannot send after transport endpoint shutdown"); + add_errcode("WSAESHUTDOWN", WSAESHUTDOWN, "Cannot send after transport endpoint shutdown"); #endif #ifdef WSAEAFNOSUPPORT - inscode(d, ds, de, "WSAEAFNOSUPPORT", WSAEAFNOSUPPORT, "Address family not supported by protocol"); + add_errcode("WSAEAFNOSUPPORT", WSAEAFNOSUPPORT, "Address family not supported by protocol"); #endif #ifdef WSAETOOMANYREFS - inscode(d, ds, de, "WSAETOOMANYREFS", WSAETOOMANYREFS, "Too many references: cannot splice"); + add_errcode("WSAETOOMANYREFS", WSAETOOMANYREFS, "Too many references: cannot splice"); #endif #ifdef WSAEACCES - inscode(d, ds, de, "WSAEACCES", WSAEACCES, "Permission denied"); + add_errcode("WSAEACCES", WSAEACCES, "Permission denied"); #endif #ifdef WSATR - inscode(d, ds, de, "WSATR", WSATR, "Error WSATR"); + add_errcode("WSATR", WSATR, "Error WSATR"); #endif #ifdef WSABASEERR - inscode(d, ds, de, "WSABASEERR", WSABASEERR, "Error WSABASEERR"); + add_errcode("WSABASEERR", WSABASEERR, "Error WSABASEERR"); #endif #ifdef WSADESCRIPTIO - inscode(d, ds, de, "WSADESCRIPTIO", WSADESCRIPTIO, "Error WSADESCRIPTIO"); + add_errcode("WSADESCRIPTIO", WSADESCRIPTIO, "Error WSADESCRIPTIO"); #endif #ifdef WSAEMSGSIZE - inscode(d, ds, de, "WSAEMSGSIZE", WSAEMSGSIZE, "Message too long"); + add_errcode("WSAEMSGSIZE", WSAEMSGSIZE, "Message too long"); #endif #ifdef WSAEBADF - inscode(d, ds, de, "WSAEBADF", WSAEBADF, "Bad file number"); + add_errcode("WSAEBADF", WSAEBADF, "Bad file number"); #endif #ifdef WSAECONNRESET - inscode(d, ds, de, "WSAECONNRESET", WSAECONNRESET, "Connection reset by peer"); + add_errcode("WSAECONNRESET", WSAECONNRESET, "Connection reset by peer"); #endif #ifdef WSAGETSELECTERRO - inscode(d, ds, de, "WSAGETSELECTERRO", WSAGETSELECTERRO, "Error WSAGETSELECTERRO"); + add_errcode("WSAGETSELECTERRO", WSAGETSELECTERRO, "Error WSAGETSELECTERRO"); #endif #ifdef WSAETIMEDOUT - inscode(d, ds, de, "WSAETIMEDOUT", WSAETIMEDOUT, "Connection timed out"); + add_errcode("WSAETIMEDOUT", WSAETIMEDOUT, "Connection timed out"); #endif #ifdef WSAENOBUFS - inscode(d, ds, de, "WSAENOBUFS", WSAENOBUFS, "No buffer space available"); + add_errcode("WSAENOBUFS", WSAENOBUFS, "No buffer space available"); #endif #ifdef WSAEDISCON - inscode(d, ds, de, "WSAEDISCON", WSAEDISCON, "Error WSAEDISCON"); + add_errcode("WSAEDISCON", WSAEDISCON, "Error WSAEDISCON"); #endif #ifdef WSAEINTR - inscode(d, ds, de, "WSAEINTR", WSAEINTR, "Interrupted system call"); + add_errcode("WSAEINTR", WSAEINTR, "Interrupted system call"); #endif #ifdef WSAEPROTOTYPE - inscode(d, ds, de, "WSAEPROTOTYPE", WSAEPROTOTYPE, "Protocol wrong type for socket"); + add_errcode("WSAEPROTOTYPE", WSAEPROTOTYPE, "Protocol wrong type for socket"); #endif #ifdef WSAHOS - inscode(d, ds, de, "WSAHOS", WSAHOS, "Error WSAHOS"); + add_errcode("WSAHOS", WSAHOS, "Error WSAHOS"); #endif #ifdef WSAEADDRINUSE - inscode(d, ds, de, "WSAEADDRINUSE", WSAEADDRINUSE, "Address already in use"); + add_errcode("WSAEADDRINUSE", WSAEADDRINUSE, "Address already in use"); #endif #ifdef WSAEADDRNOTAVAIL - inscode(d, ds, de, "WSAEADDRNOTAVAIL", WSAEADDRNOTAVAIL, "Cannot assign requested address"); + add_errcode("WSAEADDRNOTAVAIL", WSAEADDRNOTAVAIL, "Cannot assign requested address"); #endif #ifdef WSAEALREADY - inscode(d, ds, de, "WSAEALREADY", WSAEALREADY, "Operation already in progress"); + add_errcode("WSAEALREADY", WSAEALREADY, "Operation already in progress"); #endif #ifdef WSAEPROTONOSUPPORT - inscode(d, ds, de, "WSAEPROTONOSUPPORT", WSAEPROTONOSUPPORT, "Protocol not supported"); + add_errcode("WSAEPROTONOSUPPORT", WSAEPROTONOSUPPORT, "Protocol not supported"); #endif #ifdef WSASYSNOTREADY - inscode(d, ds, de, "WSASYSNOTREADY", WSASYSNOTREADY, "Error WSASYSNOTREADY"); + add_errcode("WSASYSNOTREADY", WSASYSNOTREADY, "Error WSASYSNOTREADY"); #endif #ifdef WSAEWOULDBLOCK - inscode(d, ds, de, "WSAEWOULDBLOCK", WSAEWOULDBLOCK, "Operation would block"); + add_errcode("WSAEWOULDBLOCK", WSAEWOULDBLOCK, "Operation would block"); #endif #ifdef WSAEPFNOSUPPORT - inscode(d, ds, de, "WSAEPFNOSUPPORT", WSAEPFNOSUPPORT, "Protocol family not supported"); + add_errcode("WSAEPFNOSUPPORT", WSAEPFNOSUPPORT, "Protocol family not supported"); #endif #ifdef WSAEOPNOTSUPP - inscode(d, ds, de, "WSAEOPNOTSUPP", WSAEOPNOTSUPP, "Operation not supported on transport endpoint"); + add_errcode("WSAEOPNOTSUPP", WSAEOPNOTSUPP, "Operation not supported on transport endpoint"); #endif #ifdef WSAEISCONN - inscode(d, ds, de, "WSAEISCONN", WSAEISCONN, "Transport endpoint is already connected"); + add_errcode("WSAEISCONN", WSAEISCONN, "Transport endpoint is already connected"); #endif #ifdef WSAEDQUOT - inscode(d, ds, de, "WSAEDQUOT", WSAEDQUOT, "Quota exceeded"); + add_errcode("WSAEDQUOT", WSAEDQUOT, "Quota exceeded"); #endif #ifdef WSAENOTCONN - inscode(d, ds, de, "WSAENOTCONN", WSAENOTCONN, "Transport endpoint is not connected"); + add_errcode("WSAENOTCONN", WSAENOTCONN, "Transport endpoint is not connected"); #endif #ifdef WSAEREMOTE - inscode(d, ds, de, "WSAEREMOTE", WSAEREMOTE, "Object is remote"); + add_errcode("WSAEREMOTE", WSAEREMOTE, "Object is remote"); #endif #ifdef WSAEINVAL - inscode(d, ds, de, "WSAEINVAL", WSAEINVAL, "Invalid argument"); + add_errcode("WSAEINVAL", WSAEINVAL, "Invalid argument"); #endif #ifdef WSAEINPROGRESS - inscode(d, ds, de, "WSAEINPROGRESS", WSAEINPROGRESS, "Operation now in progress"); + add_errcode("WSAEINPROGRESS", WSAEINPROGRESS, "Operation now in progress"); #endif #ifdef WSAGETSELECTEVEN - inscode(d, ds, de, "WSAGETSELECTEVEN", WSAGETSELECTEVEN, "Error WSAGETSELECTEVEN"); + add_errcode("WSAGETSELECTEVEN", WSAGETSELECTEVEN, "Error WSAGETSELECTEVEN"); #endif #ifdef WSAESOCKTNOSUPPORT - inscode(d, ds, de, "WSAESOCKTNOSUPPORT", WSAESOCKTNOSUPPORT, "Socket type not supported"); + add_errcode("WSAESOCKTNOSUPPORT", WSAESOCKTNOSUPPORT, "Socket type not supported"); #endif #ifdef WSAGETASYNCERRO - inscode(d, ds, de, "WSAGETASYNCERRO", WSAGETASYNCERRO, "Error WSAGETASYNCERRO"); + add_errcode("WSAGETASYNCERRO", WSAGETASYNCERRO, "Error WSAGETASYNCERRO"); #endif #ifdef WSAMAKESELECTREPL - inscode(d, ds, de, "WSAMAKESELECTREPL", WSAMAKESELECTREPL, "Error WSAMAKESELECTREPL"); + add_errcode("WSAMAKESELECTREPL", WSAMAKESELECTREPL, "Error WSAMAKESELECTREPL"); #endif #ifdef WSAGETASYNCBUFLE - inscode(d, ds, de, "WSAGETASYNCBUFLE", WSAGETASYNCBUFLE, "Error WSAGETASYNCBUFLE"); + add_errcode("WSAGETASYNCBUFLE", WSAGETASYNCBUFLE, "Error WSAGETASYNCBUFLE"); #endif #ifdef WSAEDESTADDRREQ - inscode(d, ds, de, "WSAEDESTADDRREQ", WSAEDESTADDRREQ, "Destination address required"); + add_errcode("WSAEDESTADDRREQ", WSAEDESTADDRREQ, "Destination address required"); #endif #ifdef WSAECONNREFUSED - inscode(d, ds, de, "WSAECONNREFUSED", WSAECONNREFUSED, "Connection refused"); + add_errcode("WSAECONNREFUSED", WSAECONNREFUSED, "Connection refused"); #endif #ifdef WSAENETRESET - inscode(d, ds, de, "WSAENETRESET", WSAENETRESET, "Network dropped connection because of reset"); + add_errcode("WSAENETRESET", WSAENETRESET, "Network dropped connection because of reset"); #endif #ifdef WSAN - inscode(d, ds, de, "WSAN", WSAN, "Error WSAN"); + add_errcode("WSAN", WSAN, "Error WSAN"); #endif #ifdef ENOMEDIUM - inscode(d, ds, de, "ENOMEDIUM", ENOMEDIUM, "No medium found"); + add_errcode("ENOMEDIUM", ENOMEDIUM, "No medium found"); #endif #ifdef EMEDIUMTYPE - inscode(d, ds, de, "EMEDIUMTYPE", EMEDIUMTYPE, "Wrong medium type"); + add_errcode("EMEDIUMTYPE", EMEDIUMTYPE, "Wrong medium type"); #endif #ifdef ECANCELED - inscode(d, ds, de, "ECANCELED", ECANCELED, "Operation Canceled"); + add_errcode("ECANCELED", ECANCELED, "Operation Canceled"); #endif #ifdef ENOKEY - inscode(d, ds, de, "ENOKEY", ENOKEY, "Required key not available"); + add_errcode("ENOKEY", ENOKEY, "Required key not available"); #endif #ifdef EKEYEXPIRED - inscode(d, ds, de, "EKEYEXPIRED", EKEYEXPIRED, "Key has expired"); + add_errcode("EKEYEXPIRED", EKEYEXPIRED, "Key has expired"); #endif #ifdef EKEYREVOKED - inscode(d, ds, de, "EKEYREVOKED", EKEYREVOKED, "Key has been revoked"); + add_errcode("EKEYREVOKED", EKEYREVOKED, "Key has been revoked"); #endif #ifdef EKEYREJECTED - inscode(d, ds, de, "EKEYREJECTED", EKEYREJECTED, "Key was rejected by service"); + add_errcode("EKEYREJECTED", EKEYREJECTED, "Key was rejected by service"); #endif #ifdef EOWNERDEAD - inscode(d, ds, de, "EOWNERDEAD", EOWNERDEAD, "Owner died"); + add_errcode("EOWNERDEAD", EOWNERDEAD, "Owner died"); #endif #ifdef ENOTRECOVERABLE - inscode(d, ds, de, "ENOTRECOVERABLE", ENOTRECOVERABLE, "State not recoverable"); + add_errcode("ENOTRECOVERABLE", ENOTRECOVERABLE, "State not recoverable"); #endif #ifdef ERFKILL - inscode(d, ds, de, "ERFKILL", ERFKILL, "Operation not possible due to RF-kill"); + add_errcode("ERFKILL", ERFKILL, "Operation not possible due to RF-kill"); #endif /* Solaris-specific errnos */ #ifdef ECANCELED - inscode(d, ds, de, "ECANCELED", ECANCELED, "Operation canceled"); + add_errcode("ECANCELED", ECANCELED, "Operation canceled"); #endif #ifdef ENOTSUP - inscode(d, ds, de, "ENOTSUP", ENOTSUP, "Operation not supported"); + add_errcode("ENOTSUP", ENOTSUP, "Operation not supported"); #endif #ifdef EOWNERDEAD - inscode(d, ds, de, "EOWNERDEAD", EOWNERDEAD, "Process died with the lock"); + add_errcode("EOWNERDEAD", EOWNERDEAD, "Process died with the lock"); #endif #ifdef ENOTRECOVERABLE - inscode(d, ds, de, "ENOTRECOVERABLE", ENOTRECOVERABLE, "Lock is not recoverable"); + add_errcode("ENOTRECOVERABLE", ENOTRECOVERABLE, "Lock is not recoverable"); #endif #ifdef ELOCKUNMAPPED - inscode(d, ds, de, "ELOCKUNMAPPED", ELOCKUNMAPPED, "Locked lock was unmapped"); + add_errcode("ELOCKUNMAPPED", ELOCKUNMAPPED, "Locked lock was unmapped"); #endif #ifdef ENOTACTIVE - inscode(d, ds, de, "ENOTACTIVE", ENOTACTIVE, "Facility is not active"); + add_errcode("ENOTACTIVE", ENOTACTIVE, "Facility is not active"); #endif /* MacOSX specific errnos */ #ifdef EAUTH - inscode(d, ds, de, "EAUTH", EAUTH, "Authentication error"); + add_errcode("EAUTH", EAUTH, "Authentication error"); #endif #ifdef EBADARCH - inscode(d, ds, de, "EBADARCH", EBADARCH, "Bad CPU type in executable"); + add_errcode("EBADARCH", EBADARCH, "Bad CPU type in executable"); #endif #ifdef EBADEXEC - inscode(d, ds, de, "EBADEXEC", EBADEXEC, "Bad executable (or shared library)"); + add_errcode("EBADEXEC", EBADEXEC, "Bad executable (or shared library)"); #endif #ifdef EBADMACHO - inscode(d, ds, de, "EBADMACHO", EBADMACHO, "Malformed Mach-o file"); + add_errcode("EBADMACHO", EBADMACHO, "Malformed Mach-o file"); #endif #ifdef EBADRPC - inscode(d, ds, de, "EBADRPC", EBADRPC, "RPC struct is bad"); + add_errcode("EBADRPC", EBADRPC, "RPC struct is bad"); #endif #ifdef EDEVERR - inscode(d, ds, de, "EDEVERR", EDEVERR, "Device error"); + add_errcode("EDEVERR", EDEVERR, "Device error"); #endif #ifdef EFTYPE - inscode(d, ds, de, "EFTYPE", EFTYPE, "Inappropriate file type or format"); + add_errcode("EFTYPE", EFTYPE, "Inappropriate file type or format"); #endif #ifdef ENEEDAUTH - inscode(d, ds, de, "ENEEDAUTH", ENEEDAUTH, "Need authenticator"); + add_errcode("ENEEDAUTH", ENEEDAUTH, "Need authenticator"); #endif #ifdef ENOATTR - inscode(d, ds, de, "ENOATTR", ENOATTR, "Attribute not found"); + add_errcode("ENOATTR", ENOATTR, "Attribute not found"); #endif #ifdef ENOPOLICY - inscode(d, ds, de, "ENOPOLICY", ENOPOLICY, "Policy not found"); + add_errcode("ENOPOLICY", ENOPOLICY, "Policy not found"); #endif #ifdef EPROCLIM - inscode(d, ds, de, "EPROCLIM", EPROCLIM, "Too many processes"); + add_errcode("EPROCLIM", EPROCLIM, "Too many processes"); #endif #ifdef EPROCUNAVAIL - inscode(d, ds, de, "EPROCUNAVAIL", EPROCUNAVAIL, "Bad procedure for program"); + add_errcode("EPROCUNAVAIL", EPROCUNAVAIL, "Bad procedure for program"); #endif #ifdef EPROGMISMATCH - inscode(d, ds, de, "EPROGMISMATCH", EPROGMISMATCH, "Program version wrong"); + add_errcode("EPROGMISMATCH", EPROGMISMATCH, "Program version wrong"); #endif #ifdef EPROGUNAVAIL - inscode(d, ds, de, "EPROGUNAVAIL", EPROGUNAVAIL, "RPC prog. not avail"); + add_errcode("EPROGUNAVAIL", EPROGUNAVAIL, "RPC prog. not avail"); #endif #ifdef EPWROFF - inscode(d, ds, de, "EPWROFF", EPWROFF, "Device power is off"); + add_errcode("EPWROFF", EPWROFF, "Device power is off"); #endif #ifdef ERPCMISMATCH - inscode(d, ds, de, "ERPCMISMATCH", ERPCMISMATCH, "RPC version wrong"); + add_errcode("ERPCMISMATCH", ERPCMISMATCH, "RPC version wrong"); #endif #ifdef ESHLIBVERS - inscode(d, ds, de, "ESHLIBVERS", ESHLIBVERS, "Shared library version mismatch"); + add_errcode("ESHLIBVERS", ESHLIBVERS, "Shared library version mismatch"); #endif - Py_DECREF(de); - return m; + Py_DECREF(error_dict); + return 0; +} + +static PyModuleDef_Slot errno_slots[] = { + {Py_mod_exec, errno_exec}, + {0, NULL} +}; + +PyDoc_STRVAR(errno__doc__, +"This module makes available standard errno system symbols.\n\ +\n\ +The value of each symbol is the corresponding integer value,\n\ +e.g., on most systems, errno.ENOENT equals the integer 2.\n\ +\n\ +The dictionary errno.errorcode maps numeric codes to symbol names,\n\ +e.g., errno.errorcode[2] could be the string 'ENOENT'.\n\ +\n\ +Symbols that are not relevant to the underlying system are not defined.\n\ +\n\ +To map error codes to error messages, use the function os.strerror(),\n\ +e.g. os.strerror(2) could return 'No such file or directory'."); + +static struct PyModuleDef errnomodule = { + PyModuleDef_HEAD_INIT, + .m_name = "errno", + .m_doc = errno__doc__, + .m_size = 0, + .m_methods = errno_methods, + .m_slots = errno_slots, +}; + +PyMODINIT_FUNC +PyInit_errno(void) +{ + return PyModuleDef_Init(&errnomodule); } diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index 230cde4934fd437eb6f30880ee9d5fe3ff2af1af..e7a285033051dfc511440574f7f255ef325b1573 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -1,7 +1,6 @@ #include "Python.h" #include "pycore_initconfig.h" #include "pycore_traceback.h" -#include "pythread.h" #include #include #include @@ -19,8 +18,6 @@ /* Allocate at maximum 100 MiB of the stack to raise the stack overflow */ #define STACK_OVERFLOW_MAX_SIZE (100 * 1024 * 1024) -#define FAULTHANDLER_LATER - #ifndef MS_WINDOWS /* register() is useless on Windows, because only SIGSEGV, SIGABRT and SIGILL can be handled by the process, and these signals can only be used @@ -60,7 +57,6 @@ static struct { #endif } fatal_error = {0, NULL, -1, 0}; -#ifdef FAULTHANDLER_LATER static struct { PyObject *file; int fd; @@ -77,7 +73,6 @@ static struct { /* released by child thread when joined */ PyThread_type_lock running; } thread; -#endif #ifdef FAULTHANDLER_USER typedef struct { @@ -125,7 +120,13 @@ static fault_handler_t faulthandler_handlers[] = { static const size_t faulthandler_nsignals = \ Py_ARRAY_LENGTH(faulthandler_handlers); -#ifdef HAVE_SIGALTSTACK +/* Using an alternative stack requires sigaltstack() + and sigaction() SA_ONSTACK */ +#if defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGACTION) +# define FAULTHANDLER_USE_ALT_STACK +#endif + +#ifdef FAULTHANDLER_USE_ALT_STACK static stack_t stack; static stack_t old_stack; #endif @@ -172,7 +173,7 @@ faulthandler_get_fileno(PyObject **file_ptr) return fd; } - result = _PyObject_CallMethodId(file, &PyId_fileno, NULL); + result = _PyObject_CallMethodIdNoArgs(file, &PyId_fileno); if (result == NULL) return -1; @@ -190,7 +191,7 @@ faulthandler_get_fileno(PyObject **file_ptr) return -1; } - result = _PyObject_CallMethodId(file, &PyId_flush, NULL); + result = _PyObject_CallMethodIdNoArgs(file, &PyId_flush); if (result != NULL) Py_DECREF(result); else { @@ -427,6 +428,36 @@ faulthandler_exc_handler(struct _EXCEPTION_POINTERS *exc_info) } #endif + +#ifdef FAULTHANDLER_USE_ALT_STACK +static int +faulthandler_allocate_stack(void) +{ + if (stack.ss_sp != NULL) { + return 0; + } + /* Allocate an alternate stack for faulthandler() signal handler + to be able to execute a signal handler on a stack overflow error */ + stack.ss_sp = PyMem_Malloc(stack.ss_size); + if (stack.ss_sp == NULL) { + PyErr_NoMemory(); + return -1; + } + + int err = sigaltstack(&stack, &old_stack); + if (err) { + /* Release the stack to retry sigaltstack() next time */ + PyMem_Free(stack.ss_sp); + stack.ss_sp = NULL; + + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + return 0; +} +#endif + + /* Install the handler for fatal signals, faulthandler_fatal_error(). */ static int @@ -437,32 +468,35 @@ faulthandler_enable(void) } fatal_error.enabled = 1; +#ifdef FAULTHANDLER_USE_ALT_STACK + if (faulthandler_allocate_stack() < 0) { + return -1; + } +#endif + for (size_t i=0; i < faulthandler_nsignals; i++) { fault_handler_t *handler; -#ifdef HAVE_SIGACTION - struct sigaction action; -#endif int err; handler = &faulthandler_handlers[i]; assert(!handler->enabled); #ifdef HAVE_SIGACTION + struct sigaction action; action.sa_handler = faulthandler_fatal_error; sigemptyset(&action.sa_mask); /* Do not prevent the signal from being received from within its own signal handler */ action.sa_flags = SA_NODEFER; -#ifdef HAVE_SIGALTSTACK - if (stack.ss_sp != NULL) { - /* Call the signal handler on an alternate signal stack - provided by sigaltstack() */ - action.sa_flags |= SA_ONSTACK; - } +#ifdef FAULTHANDLER_USE_ALT_STACK + assert(stack.ss_sp != NULL); + /* Call the signal handler on an alternate signal stack + provided by sigaltstack() */ + action.sa_flags |= SA_ONSTACK; #endif err = sigaction(handler->signum, &action, &handler->previous); #else handler->previous = signal(handler->signum, - faulthandler_fatal_error); + faulthandler_fatal_error); err = (handler->previous == SIG_ERR); #endif if (err) { @@ -505,7 +539,7 @@ faulthandler_py_enable(PyObject *self, PyObject *args, PyObject *kwargs) Py_XSETREF(fatal_error.file, file); fatal_error.fd = fd; fatal_error.all_threads = all_threads; - fatal_error.interp = tstate->interp; + fatal_error.interp = PyThreadState_GetInterpreter(tstate); if (faulthandler_enable() < 0) { return NULL; @@ -550,8 +584,6 @@ faulthandler_is_enabled(PyObject *self, PyObject *Py_UNUSED(ignored)) return PyBool_FromLong(fatal_error.enabled); } -#ifdef FAULTHANDLER_LATER - static void faulthandler_thread(void *unused) { @@ -592,6 +624,11 @@ faulthandler_thread(void *unused) static void cancel_dump_traceback_later(void) { + /* If not scheduled, nothing to cancel */ + if (!thread.cancel_event) { + return; + } + /* Notify cancellation */ PyThread_release_lock(thread.cancel_event); @@ -676,17 +713,37 @@ faulthandler_dump_traceback_later(PyObject *self, } tstate = get_thread_state(); - if (tstate == NULL) + if (tstate == NULL) { return NULL; + } fd = faulthandler_get_fileno(&file); - if (fd < 0) + if (fd < 0) { return NULL; + } + + if (!thread.running) { + thread.running = PyThread_allocate_lock(); + if (!thread.running) { + return PyErr_NoMemory(); + } + } + if (!thread.cancel_event) { + thread.cancel_event = PyThread_allocate_lock(); + if (!thread.cancel_event || !thread.running) { + return PyErr_NoMemory(); + } + + /* cancel_event starts to be acquired: it's only released to cancel + the thread. */ + PyThread_acquire_lock(thread.cancel_event, 1); + } /* format the timeout */ header = format_timeout(timeout_us); - if (header == NULL) + if (header == NULL) { return PyErr_NoMemory(); + } header_len = strlen(header); /* Cancel previous thread, if running */ @@ -698,7 +755,7 @@ faulthandler_dump_traceback_later(PyObject *self, /* the downcast is safe: we check that 0 < timeout_us < PY_TIMEOUT_MAX */ thread.timeout_us = (PY_TIMEOUT_T)timeout_us; thread.repeat = repeat; - thread.interp = tstate->interp; + thread.interp = PyThreadState_GetInterpreter(tstate); thread.exit = exit; thread.header = header; thread.header_len = header_len; @@ -726,11 +783,11 @@ faulthandler_cancel_dump_traceback_later_py(PyObject *self, cancel_dump_traceback_later(); Py_RETURN_NONE; } -#endif /* FAULTHANDLER_LATER */ + #ifdef FAULTHANDLER_USER static int -faulthandler_register(int signum, int chain, _Py_sighandler_t *p_previous) +faulthandler_register(int signum, int chain, _Py_sighandler_t *previous_p) { #ifdef HAVE_SIGACTION struct sigaction action; @@ -745,19 +802,19 @@ faulthandler_register(int signum, int chain, _Py_sighandler_t *p_previous) own signal handler */ action.sa_flags = SA_NODEFER; } -#ifdef HAVE_SIGALTSTACK - if (stack.ss_sp != NULL) { - /* Call the signal handler on an alternate signal stack - provided by sigaltstack() */ - action.sa_flags |= SA_ONSTACK; - } +#ifdef FAULTHANDLER_USE_ALT_STACK + assert(stack.ss_sp != NULL); + /* Call the signal handler on an alternate signal stack + provided by sigaltstack() */ + action.sa_flags |= SA_ONSTACK; #endif - return sigaction(signum, &action, p_previous); + return sigaction(signum, &action, previous_p); #else _Py_sighandler_t previous; previous = signal(signum, faulthandler_user); - if (p_previous != NULL) - *p_previous = previous; + if (previous_p != NULL) { + *previous_p = previous; + } return (previous == SIG_ERR); #endif } @@ -853,14 +910,19 @@ faulthandler_register_py(PyObject *self, return NULL; if (user_signals == NULL) { - user_signals = PyMem_Malloc(NSIG * sizeof(user_signal_t)); + user_signals = PyMem_Calloc(NSIG, sizeof(user_signal_t)); if (user_signals == NULL) return PyErr_NoMemory(); - memset(user_signals, 0, NSIG * sizeof(user_signal_t)); } user = &user_signals[signum]; if (!user->enabled) { +#ifdef FAULTHANDLER_USE_ALT_STACK + if (faulthandler_allocate_stack() < 0) { + return NULL; + } +#endif + err = faulthandler_register(signum, chain, &previous); if (err) { PyErr_SetFromErrno(PyExc_OSError); @@ -875,7 +937,7 @@ faulthandler_register_py(PyObject *self, user->fd = fd; user->all_threads = all_threads; user->chain = chain; - user->interp = tstate->interp; + user->interp = PyThreadState_GetInterpreter(tstate); user->enabled = 1; Py_RETURN_NONE; @@ -1001,24 +1063,10 @@ faulthandler_sigsegv(PyObject *self, PyObject *args) Py_RETURN_NONE; } -static void +static void _Py_NO_RETURN faulthandler_fatal_error_thread(void *plock) { -#ifndef __clang__ - PyThread_type_lock *lock = (PyThread_type_lock *)plock; -#endif - Py_FatalError("in new thread"); - -#ifndef __clang__ - /* Issue #28152: Py_FatalError() is declared with - __attribute__((__noreturn__)). GCC emits a warning without - "PyThread_release_lock()" (compiler bug?), but Clang is smarter and - emits a warning on the return. */ - - /* notify the caller that we are done */ - PyThread_release_lock(lock); -#endif } static PyObject * @@ -1094,7 +1142,7 @@ faulthandler_fatal_error_py(PyObject *self, PyObject *args) Py_RETURN_NONE; } -#if defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGACTION) +#if defined(FAULTHANDLER_USE_ALT_STACK) #define FAULTHANDLER_STACK_OVERFLOW static uintptr_t @@ -1149,15 +1197,13 @@ faulthandler_stack_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) size, depth); return NULL; } -#endif /* defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGACTION) */ +#endif /* defined(FAULTHANDLER_USE_ALT_STACK) && defined(HAVE_SIGACTION) */ static int faulthandler_traverse(PyObject *module, visitproc visit, void *arg) { -#ifdef FAULTHANDLER_LATER Py_VISIT(thread.file); -#endif #ifdef FAULTHANDLER_USER if (user_signals != NULL) { for (size_t signum=0; signum < NSIG; signum++) @@ -1198,7 +1244,6 @@ static PyMethodDef module_methods[] = { PyDoc_STR("dump_traceback(file=sys.stderr, all_threads=True): " "dump the traceback of the current thread, or of all threads " "if all_threads is True, into file")}, -#ifdef FAULTHANDLER_LATER {"dump_traceback_later", (PyCFunction)(void(*)(void))faulthandler_dump_traceback_later, METH_VARARGS|METH_KEYWORDS, PyDoc_STR("dump_traceback_later(timeout, repeat=False, file=sys.stderrn, exit=False):\n" @@ -1209,8 +1254,6 @@ static PyMethodDef module_methods[] = { faulthandler_cancel_dump_traceback_later_py, METH_NOARGS, PyDoc_STR("cancel_dump_traceback_later():\ncancel the previous call " "to dump_traceback_later().")}, -#endif - #ifdef FAULTHANDLER_USER {"register", (PyCFunction)(void(*)(void))faulthandler_register_py, METH_VARARGS|METH_KEYWORDS, @@ -1223,7 +1266,6 @@ static PyMethodDef module_methods[] = { PyDoc_STR("unregister(signum): unregister the handler of the signal " "'signum' registered by register()")}, #endif - {"_read_null", faulthandler_read_null, METH_NOARGS, PyDoc_STR("_read_null(): read from NULL, raise " "a SIGSEGV or SIGBUS signal depending on the platform")}, @@ -1312,7 +1354,7 @@ faulthandler_init_enable(void) return -1; } - PyObject *res = _PyObject_CallMethodId(module, &PyId_enable, NULL); + PyObject *res = _PyObject_CallMethodIdNoArgs(module, &PyId_enable); Py_DECREF(module); if (res == NULL) { return -1; @@ -1325,37 +1367,18 @@ faulthandler_init_enable(void) PyStatus _PyFaulthandler_Init(int enable) { -#ifdef HAVE_SIGALTSTACK - int err; - - /* Try to allocate an alternate stack for faulthandler() signal handler to - * be able to allocate memory on the stack, even on a stack overflow. If it - * fails, ignore the error. */ +#ifdef FAULTHANDLER_USE_ALT_STACK + memset(&stack, 0, sizeof(stack)); stack.ss_flags = 0; /* bpo-21131: allocate dedicated stack of SIGSTKSZ*2 bytes, instead of just SIGSTKSZ bytes. Calling the previous signal handler in faulthandler signal handler uses more than SIGSTKSZ bytes of stack memory on some platforms. */ stack.ss_size = SIGSTKSZ * 2; - stack.ss_sp = PyMem_Malloc(stack.ss_size); - if (stack.ss_sp != NULL) { - err = sigaltstack(&stack, &old_stack); - if (err) { - PyMem_Free(stack.ss_sp); - stack.ss_sp = NULL; - } - } -#endif -#ifdef FAULTHANDLER_LATER - thread.file = NULL; - thread.cancel_event = PyThread_allocate_lock(); - thread.running = PyThread_allocate_lock(); - if (!thread.cancel_event || !thread.running) { - return _PyStatus_ERR("failed to allocate locks for faulthandler"); - } - PyThread_acquire_lock(thread.cancel_event, 1); #endif + memset(&thread, 0, sizeof(thread)); + if (enable) { if (faulthandler_init_enable() < 0) { return _PyStatus_ERR("failed to enable faulthandler"); @@ -1366,7 +1389,6 @@ _PyFaulthandler_Init(int enable) void _PyFaulthandler_Fini(void) { -#ifdef FAULTHANDLER_LATER /* later */ if (thread.cancel_event) { cancel_dump_traceback_later(); @@ -1378,7 +1400,6 @@ void _PyFaulthandler_Fini(void) PyThread_free_lock(thread.running); thread.running = NULL; } -#endif #ifdef FAULTHANDLER_USER /* user */ @@ -1393,7 +1414,8 @@ void _PyFaulthandler_Fini(void) /* fatal */ faulthandler_disable(); -#ifdef HAVE_SIGALTSTACK + +#ifdef FAULTHANDLER_USE_ALT_STACK if (stack.ss_sp != NULL) { /* Fetch the current alt stack */ stack_t current_stack; diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c index a7d2193022e982b0b1712346166c11730fd135c6..43f9b22f67207015938cac59f475dcc40aa6fa3e 100644 --- a/Modules/fcntlmodule.c +++ b/Modules/fcntlmodule.c @@ -513,12 +513,24 @@ all_ins(PyObject* m) #ifdef F_SETLKW if (PyModule_AddIntMacro(m, F_SETLKW)) return -1; #endif +#ifdef F_OFD_GETLK + if (PyModule_AddIntMacro(m, F_OFD_GETLK)) return -1; +#endif +#ifdef F_OFD_SETLK + if (PyModule_AddIntMacro(m, F_OFD_SETLK)) return -1; +#endif +#ifdef F_OFD_SETLKW + if (PyModule_AddIntMacro(m, F_OFD_SETLKW)) return -1; +#endif #ifdef F_GETOWN if (PyModule_AddIntMacro(m, F_GETOWN)) return -1; #endif #ifdef F_SETOWN if (PyModule_AddIntMacro(m, F_SETOWN)) return -1; #endif +#ifdef F_GETPATH + if (PyModule_AddIntMacro(m, F_GETPATH)) return -1; +#endif #ifdef F_GETSIG if (PyModule_AddIntMacro(m, F_GETSIG)) return -1; #endif @@ -674,8 +686,10 @@ PyInit_fcntl(void) return NULL; /* Add some symbolic constants to the module */ - if (all_ins(m) < 0) + if (all_ins(m) < 0) { + Py_DECREF(m); return NULL; + } return m; } diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 5a6a81d81364d7bd739398f66e46019903ad2860..56dcb101e0005e55b0f1ca132b218d1c9f8c2cc8 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -25,19 +25,25 @@ #include "Python.h" #include "pycore_context.h" +#include "pycore_initconfig.h" +#include "pycore_interp.h" // PyInterpreterState.gc #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" -#include "frameobject.h" /* for PyFrame_ClearFreeList */ +#include "pycore_pyerrors.h" +#include "pycore_pystate.h" // _PyThreadState_GET() #include "pydtrace.h" -#include "pytime.h" /* for _PyTime_GetMonotonicClock() */ +#include "pytime.h" // _PyTime_GetMonotonicClock() + +typedef struct _gc_runtime_state GCState; /*[clinic input] module gc [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=b5c9690ecc842d79]*/ -#define GC_DEBUG (0) /* Enable more asserts */ + +#ifdef Py_DEBUG +# define GC_DEBUG +#endif #define GC_NEXT _PyGCHead_NEXT #define GC_PREV _PyGCHead_PREV @@ -111,9 +117,6 @@ gc_decref(PyGC_Head *g) g->_gc_prev -= 1 << _PyGC_PREV_SHIFT; } -/* Python string to use if unhandled exception occurs */ -static PyObject *gc_str = NULL; - /* set for debugging information */ #define DEBUG_STATS (1<<0) /* print collection statistics */ #define DEBUG_COLLECTABLE (1<<1) /* print collectable objects */ @@ -123,14 +126,14 @@ static PyObject *gc_str = NULL; DEBUG_UNCOLLECTABLE | \ DEBUG_SAVEALL -#define GEN_HEAD(state, n) (&(state)->generations[n].head) +#define GEN_HEAD(gcstate, n) (&(gcstate)->generations[n].head) void -_PyGC_Initialize(struct _gc_runtime_state *state) +_PyGC_InitState(GCState *gcstate) { - state->enabled = 1; /* automatic collection enabled? */ + gcstate->enabled = 1; /* automatic collection enabled? */ -#define _GEN_HEAD(n) GEN_HEAD(state, n) +#define _GEN_HEAD(n) GEN_HEAD(gcstate, n) struct gc_generation generations[NUM_GENERATIONS] = { /* PyGC_Head, threshold, count */ {{(uintptr_t)_GEN_HEAD(0), (uintptr_t)_GEN_HEAD(0)}, 700, 0}, @@ -138,16 +141,31 @@ _PyGC_Initialize(struct _gc_runtime_state *state) {{(uintptr_t)_GEN_HEAD(2), (uintptr_t)_GEN_HEAD(2)}, 10, 0}, }; for (int i = 0; i < NUM_GENERATIONS; i++) { - state->generations[i] = generations[i]; + gcstate->generations[i] = generations[i]; }; - state->generation0 = GEN_HEAD(state, 0); + gcstate->generation0 = GEN_HEAD(gcstate, 0); struct gc_generation permanent_generation = { - {(uintptr_t)&state->permanent_generation.head, - (uintptr_t)&state->permanent_generation.head}, 0, 0 + {(uintptr_t)&gcstate->permanent_generation.head, + (uintptr_t)&gcstate->permanent_generation.head}, 0, 0 }; - state->permanent_generation = permanent_generation; + gcstate->permanent_generation = permanent_generation; } + +PyStatus +_PyGC_Init(PyThreadState *tstate) +{ + GCState *gcstate = &tstate->interp->gc; + if (gcstate->garbage == NULL) { + gcstate->garbage = PyList_New(0); + if (gcstate->garbage == NULL) { + return _PyStatus_NO_MEMORY(); + } + } + return _PyStatus_OK(); +} + + /* _gc_prev values --------------- @@ -298,8 +316,18 @@ gc_list_size(PyGC_Head *list) return n; } +/* Walk the list and mark all objects as non-collecting */ +static inline void +gc_list_clear_collecting(PyGC_Head *collectable) +{ + PyGC_Head *gc; + for (gc = GC_NEXT(collectable); gc != collectable; gc = GC_NEXT(gc)) { + gc_clear_collecting(gc); + } +} + /* Append objects in a GC list to a Python list. - * Return 0 if all OK, < 0 if error (out of memory for list). + * Return 0 if all OK, < 0 if error (out of memory for list) */ static int append_objects(PyObject *py_list, PyGC_Head *gc_list) @@ -316,25 +344,60 @@ append_objects(PyObject *py_list, PyGC_Head *gc_list) return 0; } -#if GC_DEBUG +// Constants for validate_list's flags argument. +enum flagstates {collecting_clear_unreachable_clear, + collecting_clear_unreachable_set, + collecting_set_unreachable_clear, + collecting_set_unreachable_set}; + +#ifdef GC_DEBUG // validate_list checks list consistency. And it works as document -// describing when expected_mask is set / unset. +// describing when flags are expected to be set / unset. +// `head` must be a doubly-linked gc list, although it's fine (expected!) if +// the prev and next pointers are "polluted" with flags. +// What's checked: +// - The `head` pointers are not polluted. +// - The objects' PREV_MASK_COLLECTING and NEXT_MASK_UNREACHABLE flags are all +// `set or clear, as specified by the 'flags' argument. +// - The prev and next pointers are mutually consistent. static void -validate_list(PyGC_Head *head, uintptr_t expected_mask) +validate_list(PyGC_Head *head, enum flagstates flags) { + assert((head->_gc_prev & PREV_MASK_COLLECTING) == 0); + assert((head->_gc_next & NEXT_MASK_UNREACHABLE) == 0); + uintptr_t prev_value = 0, next_value = 0; + switch (flags) { + case collecting_clear_unreachable_clear: + break; + case collecting_set_unreachable_clear: + prev_value = PREV_MASK_COLLECTING; + break; + case collecting_clear_unreachable_set: + next_value = NEXT_MASK_UNREACHABLE; + break; + case collecting_set_unreachable_set: + prev_value = PREV_MASK_COLLECTING; + next_value = NEXT_MASK_UNREACHABLE; + break; + default: + assert(! "bad internal flags argument"); + } PyGC_Head *prev = head; PyGC_Head *gc = GC_NEXT(head); while (gc != head) { - assert(GC_NEXT(gc) != NULL); - assert(GC_PREV(gc) == prev); - assert((gc->_gc_prev & PREV_MASK_COLLECTING) == expected_mask); + PyGC_Head *trueprev = GC_PREV(gc); + PyGC_Head *truenext = (PyGC_Head *)(gc->_gc_next & ~NEXT_MASK_UNREACHABLE); + assert(truenext != NULL); + assert(trueprev == prev); + assert((gc->_gc_prev & PREV_MASK_COLLECTING) == prev_value); + assert((gc->_gc_next & NEXT_MASK_UNREACHABLE) == next_value); prev = gc; - gc = GC_NEXT(gc); + gc = truenext; } assert(prev == GC_PREV(head)); } #else -#define validate_list(x,y) do{}while(0) +#define validate_list(x, y) do{}while(0) #endif /*** end of list stuff ***/ @@ -377,7 +440,7 @@ visit_decref(PyObject *op, void *parent) { _PyObject_ASSERT(_PyObject_CAST(parent), !_PyObject_IsFreed(op)); - if (PyObject_IS_GC(op)) { + if (_PyObject_IS_GC(op)) { PyGC_Head *gc = AS_GC(op); /* We're only interested in gc_refs for objects in the * generation being collected, which can be recognized @@ -413,17 +476,23 @@ subtract_refs(PyGC_Head *containers) static int visit_reachable(PyObject *op, PyGC_Head *reachable) { - if (!PyObject_IS_GC(op)) { + if (!_PyObject_IS_GC(op)) { return 0; } PyGC_Head *gc = AS_GC(op); const Py_ssize_t gc_refs = gc_get_refs(gc); - // Ignore untracked objects and objects in other generation. - if (gc->_gc_next == 0 || !gc_is_collecting(gc)) { + // Ignore objects in other generation. + // This also skips objects "to the left" of the current position in + // move_unreachable's scan of the 'young' list - they've already been + // traversed, and no longer have the PREV_MASK_COLLECTING flag. + if (! gc_is_collecting(gc)) { return 0; } + // It would be a logic error elsewhere if the collecting flag were set on + // an untracked object. + assert(gc->_gc_next != 0); if (gc->_gc_next & NEXT_MASK_UNREACHABLE) { /* This had gc_refs = 0 when move_unreachable got @@ -432,7 +501,8 @@ visit_reachable(PyObject *op, PyGC_Head *reachable) * and move_unreachable will eventually get to it * again. */ - // Manually unlink gc from unreachable list because + // Manually unlink gc from unreachable list because the list functions + // don't work right in the presence of NEXT_MASK_UNREACHABLE flags. PyGC_Head *prev = GC_PREV(gc); PyGC_Head *next = (PyGC_Head*)(gc->_gc_next & ~NEXT_MASK_UNREACHABLE); _PyObject_ASSERT(FROM_GC(prev), @@ -533,8 +603,9 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable) PyGC_Head *last = GC_PREV(unreachable); // NOTE: Since all objects in unreachable set has // NEXT_MASK_UNREACHABLE flag, we set it unconditionally. - // But this may set the flat to unreachable too. - // move_legacy_finalizers() should care about it. + // But this may pollute the unreachable list head's 'next' pointer + // too. That's semantically senseless but expedient here - the + // damage is repaired when this function ends. last->_gc_next = (NEXT_MASK_UNREACHABLE | (uintptr_t)gc); _PyGCHead_SET_PREV(gc, last); gc->_gc_next = (NEXT_MASK_UNREACHABLE | (uintptr_t)unreachable); @@ -544,6 +615,8 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable) } // young->_gc_prev must be last element remained in the list. young->_gc_prev = (uintptr_t)prev; + // don't let the pollution of the list head's next pointer leak + unreachable->_gc_next &= ~NEXT_MASK_UNREACHABLE; } static void @@ -579,7 +652,7 @@ untrack_dicts(PyGC_Head *head) static int has_legacy_finalizer(PyObject *op) { - return op->ob_type->tp_del != NULL; + return Py_TYPE(op)->tp_del != NULL; } /* Move the objects in unreachable with tp_del slots into `finalizers`. @@ -591,7 +664,7 @@ static void move_legacy_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers) { PyGC_Head *gc, *next; - unreachable->_gc_next &= ~NEXT_MASK_UNREACHABLE; + assert((unreachable->_gc_next & NEXT_MASK_UNREACHABLE) == 0); /* March over unreachable. Move objects with finalizers into * `finalizers`. @@ -610,11 +683,27 @@ move_legacy_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers) } } +static inline void +clear_unreachable_mask(PyGC_Head *unreachable) +{ + /* Check that the list head does not have the unreachable bit set */ + assert(((uintptr_t)unreachable & NEXT_MASK_UNREACHABLE) == 0); + + PyGC_Head *gc, *next; + assert((unreachable->_gc_next & NEXT_MASK_UNREACHABLE) == 0); + for (gc = GC_NEXT(unreachable); gc != unreachable; gc = next) { + _PyObject_ASSERT((PyObject*)FROM_GC(gc), gc->_gc_next & NEXT_MASK_UNREACHABLE); + gc->_gc_next &= ~NEXT_MASK_UNREACHABLE; + next = (PyGC_Head*)gc->_gc_next; + } + validate_list(unreachable, collecting_set_unreachable_clear); +} + /* A traversal callback for move_legacy_finalizer_reachable. */ static int visit_move(PyObject *op, PyGC_Head *tolist) { - if (PyObject_IS_GC(op)) { + if (_PyObject_IS_GC(op)) { PyGC_Head *gc = AS_GC(op); if (gc_is_collecting(gc)) { gc_list_move(gc, tolist); @@ -698,7 +787,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old) /* It supports weakrefs. Does it have any? */ wrlist = (PyWeakReference **) - PyObject_GET_WEAKREFS_LISTPTR(op); + _PyObject_GET_WEAKREFS_LISTPTR(op); /* `op` may have some weakrefs. March over the list, clear * all the weakrefs, and move the weakrefs with callbacks @@ -782,7 +871,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old) _PyObject_ASSERT(op, callback != NULL); /* copy-paste of weakrefobject.c's handle_callback() */ - temp = PyObject_CallFunctionObjArgs(callback, wr, NULL); + temp = PyObject_CallOneArg(callback, (PyObject *)wr); if (temp == NULL) PyErr_WriteUnraisable(callback); else @@ -827,23 +916,20 @@ debug_cycle(const char *msg, PyObject *op) * merged into the old list regardless. */ static void -handle_legacy_finalizers(struct _gc_runtime_state *state, +handle_legacy_finalizers(PyThreadState *tstate, + GCState *gcstate, PyGC_Head *finalizers, PyGC_Head *old) { - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); + assert(gcstate->garbage != NULL); PyGC_Head *gc = GC_NEXT(finalizers); - if (state->garbage == NULL) { - state->garbage = PyList_New(0); - if (state->garbage == NULL) - Py_FatalError("gc couldn't create gc.garbage list"); - } for (; gc != finalizers; gc = GC_NEXT(gc)) { PyObject *op = FROM_GC(gc); - if ((state->debug & DEBUG_SAVEALL) || has_legacy_finalizer(op)) { - if (PyList_Append(state->garbage, op) < 0) { - PyErr_Clear(); + if ((gcstate->debug & DEBUG_SAVEALL) || has_legacy_finalizer(op)) { + if (PyList_Append(gcstate->garbage, op) < 0) { + _PyErr_Clear(tstate); break; } } @@ -857,7 +943,7 @@ handle_legacy_finalizers(struct _gc_runtime_state *state, * list, due to refcounts falling to 0. */ static void -finalize_garbage(PyGC_Head *collectable) +finalize_garbage(PyThreadState *tstate, PyGC_Head *collectable) { destructor finalize; PyGC_Head seen; @@ -881,52 +967,22 @@ finalize_garbage(PyGC_Head *collectable) _PyGCHead_SET_FINALIZED(gc); Py_INCREF(op); finalize(op); - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); Py_DECREF(op); } } gc_list_merge(&seen, collectable); } -/* Walk the collectable list and check that they are really unreachable - from the outside (some objects could have been resurrected by a - finalizer). */ -static int -check_garbage(PyGC_Head *collectable) -{ - int ret = 0; - PyGC_Head *gc; - for (gc = GC_NEXT(collectable); gc != collectable; gc = GC_NEXT(gc)) { - // Use gc_refs and break gc_prev again. - gc_set_refs(gc, Py_REFCNT(FROM_GC(gc))); - _PyObject_ASSERT(FROM_GC(gc), gc_get_refs(gc) != 0); - } - subtract_refs(collectable); - PyGC_Head *prev = collectable; - for (gc = GC_NEXT(collectable); gc != collectable; gc = GC_NEXT(gc)) { - _PyObject_ASSERT_WITH_MSG(FROM_GC(gc), - gc_get_refs(gc) >= 0, - "refcount is too small"); - if (gc_get_refs(gc) != 0) { - ret = -1; - } - // Restore gc_prev here. - _PyGCHead_SET_PREV(gc, prev); - gc_clear_collecting(gc); - prev = gc; - } - return ret; -} - /* Break reference cycles by clearing the containers involved. This is * tricky business as the lists can be changing and we don't know which * objects may be freed. It is possible I screwed something up here. */ static void -delete_garbage(struct _gc_runtime_state *state, +delete_garbage(PyThreadState *tstate, GCState *gcstate, PyGC_Head *collectable, PyGC_Head *old) { - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); while (!gc_list_is_empty(collectable)) { PyGC_Head *gc = GC_NEXT(collectable); @@ -935,10 +991,10 @@ delete_garbage(struct _gc_runtime_state *state, _PyObject_ASSERT_WITH_MSG(op, Py_REFCNT(op) > 0, "refcount is too small"); - if (state->debug & DEBUG_SAVEALL) { - assert(state->garbage != NULL); - if (PyList_Append(state->garbage, op) < 0) { - PyErr_Clear(); + if (gcstate->debug & DEBUG_SAVEALL) { + assert(gcstate->garbage != NULL); + if (PyList_Append(gcstate->garbage, op) < 0) { + _PyErr_Clear(tstate); } } else { @@ -946,7 +1002,7 @@ delete_garbage(struct _gc_runtime_state *state, if ((clear = Py_TYPE(op)->tp_clear) != NULL) { Py_INCREF(op); (void) clear(op); - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { _PyErr_WriteUnraisableMsg("in tp_clear of", (PyObject*)Py_TYPE(op)); } @@ -955,6 +1011,7 @@ delete_garbage(struct _gc_runtime_state *state, } if (GC_NEXT(collectable) == gc) { /* object is still alive, move it, it may die later */ + gc_clear_collecting(gc); gc_list_move(gc, old); } } @@ -968,22 +1025,18 @@ delete_garbage(struct _gc_runtime_state *state, static void clear_freelists(void) { - (void)PyMethod_ClearFreeList(); - (void)PyFrame_ClearFreeList(); - (void)PyCFunction_ClearFreeList(); - (void)PyTuple_ClearFreeList(); - (void)PyUnicode_ClearFreeList(); - (void)PyFloat_ClearFreeList(); - (void)PyList_ClearFreeList(); - (void)PyDict_ClearFreeList(); - (void)PySet_ClearFreeList(); - (void)PyAsyncGen_ClearFreeLists(); - (void)PyContext_ClearFreeList(); + _PyFrame_ClearFreeList(); + _PyTuple_ClearFreeList(); + _PyFloat_ClearFreeList(); + _PyList_ClearFreeList(); + _PyDict_ClearFreeList(); + _PyAsyncGen_ClearFreeLists(); + _PyContext_ClearFreeList(); } -// Show stats for objects in each gennerations. +// Show stats for objects in each generations static void -show_stats_each_generations(struct _gc_runtime_state *state) +show_stats_each_generations(GCState *gcstate) { char buf[100]; size_t pos = 0; @@ -991,19 +1044,130 @@ show_stats_each_generations(struct _gc_runtime_state *state) for (int i = 0; i < NUM_GENERATIONS && pos < sizeof(buf); i++) { pos += PyOS_snprintf(buf+pos, sizeof(buf)-pos, " %"PY_FORMAT_SIZE_T"d", - gc_list_size(GEN_HEAD(state, i))); + gc_list_size(GEN_HEAD(gcstate, i))); } PySys_FormatStderr( "gc: objects in each generation:%s\n" "gc: objects in permanent generation: %zd\n", - buf, gc_list_size(&state->permanent_generation.head)); + buf, gc_list_size(&gcstate->permanent_generation.head)); +} + +/* Deduce which objects among "base" are unreachable from outside the list + and move them to 'unreachable'. The process consist in the following steps: + +1. Copy all reference counts to a different field (gc_prev is used to hold + this copy to save memory). +2. Traverse all objects in "base" and visit all referred objects using + "tp_traverse" and for every visited object, subtract 1 to the reference + count (the one that we copied in the previous step). After this step, all + objects that can be reached directly from outside must have strictly positive + reference count, while all unreachable objects must have a count of exactly 0. +3. Identify all unreachable objects (the ones with 0 reference count) and move + them to the "unreachable" list. This step also needs to move back to "base" all + objects that were initially marked as unreachable but are referred transitively + by the reachable objects (the ones with strictly positive reference count). + +Contracts: + + * The "base" has to be a valid list with no mask set. + + * The "unreachable" list must be uninitialized (this function calls + gc_list_init over 'unreachable'). + +IMPORTANT: This function leaves 'unreachable' with the NEXT_MASK_UNREACHABLE +flag set but it does not clear it to skip unnecessary iteration. Before the +flag is cleared (for example, by using 'clear_unreachable_mask' function or +by a call to 'move_legacy_finalizers'), the 'unreachable' list is not a normal +list and we can not use most gc_list_* functions for it. */ +static inline void +deduce_unreachable(PyGC_Head *base, PyGC_Head *unreachable) { + validate_list(base, collecting_clear_unreachable_clear); + /* Using ob_refcnt and gc_refs, calculate which objects in the + * container set are reachable from outside the set (i.e., have a + * refcount greater than 0 when all the references within the + * set are taken into account). + */ + update_refs(base); // gc_prev is used for gc_refs + subtract_refs(base); + + /* Leave everything reachable from outside base in base, and move + * everything else (in base) to unreachable. + * + * NOTE: This used to move the reachable objects into a reachable + * set instead. But most things usually turn out to be reachable, + * so it's more efficient to move the unreachable things. It "sounds slick" + * to move the unreachable objects, until you think about it - the reason it + * pays isn't actually obvious. + * + * Suppose we create objects A, B, C in that order. They appear in the young + * generation in the same order. If B points to A, and C to B, and C is + * reachable from outside, then the adjusted refcounts will be 0, 0, and 1 + * respectively. + * + * When move_unreachable finds A, A is moved to the unreachable list. The + * same for B when it's first encountered. Then C is traversed, B is moved + * _back_ to the reachable list. B is eventually traversed, and then A is + * moved back to the reachable list. + * + * So instead of not moving at all, the reachable objects B and A are moved + * twice each. Why is this a win? A straightforward algorithm to move the + * reachable objects instead would move A, B, and C once each. + * + * The key is that this dance leaves the objects in order C, B, A - it's + * reversed from the original order. On all _subsequent_ scans, none of + * them will move. Since most objects aren't in cycles, this can save an + * unbounded number of moves across an unbounded number of later collections. + * It can cost more only the first time the chain is scanned. + * + * Drawback: move_unreachable is also used to find out what's still trash + * after finalizers may resurrect objects. In _that_ case most unreachable + * objects will remain unreachable, so it would be more efficient to move + * the reachable objects instead. But this is a one-time cost, probably not + * worth complicating the code to speed just a little. + */ + gc_list_init(unreachable); + move_unreachable(base, unreachable); // gc_prev is pointer again + validate_list(base, collecting_clear_unreachable_clear); + validate_list(unreachable, collecting_set_unreachable_set); +} + +/* Handle objects that may have resurrected after a call to 'finalize_garbage', moving + them to 'old_generation' and placing the rest on 'still_unreachable'. + + Contracts: + * After this function 'unreachable' must not be used anymore and 'still_unreachable' + will contain the objects that did not resurrect. + + * The "still_unreachable" list must be uninitialized (this function calls + gc_list_init over 'still_unreachable'). + +IMPORTANT: After a call to this function, the 'still_unreachable' set will have the +PREV_MARK_COLLECTING set, but the objects in this set are going to be removed so +we can skip the expense of clearing the flag to avoid extra iteration. */ +static inline void +handle_resurrected_objects(PyGC_Head *unreachable, PyGC_Head* still_unreachable, + PyGC_Head *old_generation) +{ + // Remove the PREV_MASK_COLLECTING from unreachable + // to prepare it for a new call to 'deduce_unreachable' + gc_list_clear_collecting(unreachable); + + // After the call to deduce_unreachable, the 'still_unreachable' set will + // have the PREV_MARK_COLLECTING set, but the objects are going to be + // removed so we can skip the expense of clearing the flag. + PyGC_Head* resurrected = unreachable; + deduce_unreachable(resurrected, still_unreachable); + clear_unreachable_mask(still_unreachable); + + // Move the resurrected objects to the old generation for future collection. + gc_list_merge(resurrected, old_generation); } /* This is the main function. Read this to understand how the * collection process works. */ static Py_ssize_t -collect(struct _gc_runtime_state *state, int generation, +collect(PyThreadState *tstate, int generation, Py_ssize_t *n_collected, Py_ssize_t *n_uncollectable, int nofail) { int i; @@ -1015,10 +1179,11 @@ collect(struct _gc_runtime_state *state, int generation, PyGC_Head finalizers; /* objects with, & reachable from, __del__ */ PyGC_Head *gc; _PyTime_t t1 = 0; /* initialize to prevent a compiler warning */ + GCState *gcstate = &tstate->interp->gc; - if (state->debug & DEBUG_STATS) { + if (gcstate->debug & DEBUG_STATS) { PySys_WriteStderr("gc: collecting generation %d...\n", generation); - show_stats_each_generations(state); + show_stats_each_generations(gcstate); t1 = _PyTime_GetMonotonicClock(); } @@ -1027,56 +1192,39 @@ collect(struct _gc_runtime_state *state, int generation, /* update collection and allocation counters */ if (generation+1 < NUM_GENERATIONS) - state->generations[generation+1].count += 1; + gcstate->generations[generation+1].count += 1; for (i = 0; i <= generation; i++) - state->generations[i].count = 0; + gcstate->generations[i].count = 0; /* merge younger generations with one we are currently collecting */ for (i = 0; i < generation; i++) { - gc_list_merge(GEN_HEAD(state, i), GEN_HEAD(state, generation)); + gc_list_merge(GEN_HEAD(gcstate, i), GEN_HEAD(gcstate, generation)); } /* handy references */ - young = GEN_HEAD(state, generation); + young = GEN_HEAD(gcstate, generation); if (generation < NUM_GENERATIONS-1) - old = GEN_HEAD(state, generation+1); + old = GEN_HEAD(gcstate, generation+1); else old = young; + validate_list(old, collecting_clear_unreachable_clear); - validate_list(young, 0); - validate_list(old, 0); - /* Using ob_refcnt and gc_refs, calculate which objects in the - * container set are reachable from outside the set (i.e., have a - * refcount greater than 0 when all the references within the - * set are taken into account). - */ - update_refs(young); // gc_prev is used for gc_refs - subtract_refs(young); - - /* Leave everything reachable from outside young in young, and move - * everything else (in young) to unreachable. - * NOTE: This used to move the reachable objects into a reachable - * set instead. But most things usually turn out to be reachable, - * so it's more efficient to move the unreachable things. - */ - gc_list_init(&unreachable); - move_unreachable(young, &unreachable); // gc_prev is pointer again - validate_list(young, 0); + deduce_unreachable(young, &unreachable); untrack_tuples(young); /* Move reachable objects to next generation. */ if (young != old) { if (generation == NUM_GENERATIONS - 2) { - state->long_lived_pending += gc_list_size(young); + gcstate->long_lived_pending += gc_list_size(young); } gc_list_merge(young, old); } else { - /* We only untrack dicts in full collections, to avoid quadratic + /* We only un-track dicts in full collections, to avoid quadratic dict build-up. See issue #14775. */ untrack_dicts(young); - state->long_lived_pending = 0; - state->long_lived_total = gc_list_size(young); + gcstate->long_lived_pending = 0; + gcstate->long_lived_total = gc_list_size(young); } /* All objects in unreachable are trash, but objects reachable from @@ -1092,11 +1240,11 @@ collect(struct _gc_runtime_state *state, int generation, */ move_legacy_finalizer_reachable(&finalizers); - validate_list(&finalizers, 0); - validate_list(&unreachable, PREV_MASK_COLLECTING); + validate_list(&finalizers, collecting_clear_unreachable_clear); + validate_list(&unreachable, collecting_set_unreachable_clear); /* Print debugging information. */ - if (state->debug & DEBUG_COLLECTABLE) { + if (gcstate->debug & DEBUG_COLLECTABLE) { for (gc = GC_NEXT(&unreachable); gc != &unreachable; gc = GC_NEXT(gc)) { debug_cycle("collectable", FROM_GC(gc)); } @@ -1105,32 +1253,33 @@ collect(struct _gc_runtime_state *state, int generation, /* Clear weakrefs and invoke callbacks as necessary. */ m += handle_weakrefs(&unreachable, old); - validate_list(old, 0); - validate_list(&unreachable, PREV_MASK_COLLECTING); + validate_list(old, collecting_clear_unreachable_clear); + validate_list(&unreachable, collecting_set_unreachable_clear); /* Call tp_finalize on objects which have one. */ - finalize_garbage(&unreachable); + finalize_garbage(tstate, &unreachable); - if (check_garbage(&unreachable)) { // clear PREV_MASK_COLLECTING here - gc_list_merge(&unreachable, old); - } - else { - /* Call tp_clear on objects in the unreachable set. This will cause - * the reference cycles to be broken. It may also cause some objects - * in finalizers to be freed. - */ - m += gc_list_size(&unreachable); - delete_garbage(state, &unreachable, old); - } + /* Handle any objects that may have resurrected after the call + * to 'finalize_garbage' and continue the collection with the + * objects that are still unreachable */ + PyGC_Head final_unreachable; + handle_resurrected_objects(&unreachable, &final_unreachable, old); + + /* Call tp_clear on objects in the final_unreachable set. This will cause + * the reference cycles to be broken. It may also cause some objects + * in finalizers to be freed. + */ + m += gc_list_size(&final_unreachable); + delete_garbage(tstate, gcstate, &final_unreachable, old); /* Collect statistics on uncollectable objects found and print * debugging information. */ for (gc = GC_NEXT(&finalizers); gc != &finalizers; gc = GC_NEXT(gc)) { n++; - if (state->debug & DEBUG_UNCOLLECTABLE) + if (gcstate->debug & DEBUG_UNCOLLECTABLE) debug_cycle("uncollectable", FROM_GC(gc)); } - if (state->debug & DEBUG_STATS) { + if (gcstate->debug & DEBUG_STATS) { double d = _PyTime_AsSecondsDouble(_PyTime_GetMonotonicClock() - t1); PySys_WriteStderr( "gc: done, %" PY_FORMAT_SIZE_T "d unreachable, " @@ -1142,8 +1291,8 @@ collect(struct _gc_runtime_state *state, int generation, * reachable list of garbage. The programmer has to deal with * this if they insist on creating this type of structure. */ - handle_legacy_finalizers(state, &finalizers, old); - validate_list(old, 0); + handle_legacy_finalizers(tstate, gcstate, &finalizers, old); + validate_list(old, collecting_clear_unreachable_clear); /* Clear free list only during the collection of the highest * generation */ @@ -1151,15 +1300,12 @@ collect(struct _gc_runtime_state *state, int generation, clear_freelists(); } - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { if (nofail) { - PyErr_Clear(); + _PyErr_Clear(tstate); } else { - if (gc_str == NULL) - gc_str = PyUnicode_FromString("garbage collection"); - PyErr_WriteUnraisable(gc_str); - Py_FatalError("unexpected exception during garbage collection"); + _PyErr_WriteUnraisableMsg("in garbage collection", NULL); } } @@ -1171,38 +1317,39 @@ collect(struct _gc_runtime_state *state, int generation, *n_uncollectable = n; } - struct gc_generation_stats *stats = &state->generation_stats[generation]; + struct gc_generation_stats *stats = &gcstate->generation_stats[generation]; stats->collections++; stats->collected += m; stats->uncollectable += n; if (PyDTrace_GC_DONE_ENABLED()) { - PyDTrace_GC_DONE(n+m); + PyDTrace_GC_DONE(n + m); } - assert(!PyErr_Occurred()); - return n+m; + assert(!_PyErr_Occurred(tstate)); + return n + m; } /* Invoke progress callbacks to notify clients that garbage collection * is starting or stopping */ static void -invoke_gc_callback(struct _gc_runtime_state *state, const char *phase, +invoke_gc_callback(PyThreadState *tstate, const char *phase, int generation, Py_ssize_t collected, Py_ssize_t uncollectable) { - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); /* we may get called very early */ - if (state->callbacks == NULL) { + GCState *gcstate = &tstate->interp->gc; + if (gcstate->callbacks == NULL) { return; } /* The local variable cannot be rebound, check it for sanity */ - assert(PyList_CheckExact(state->callbacks)); + assert(PyList_CheckExact(gcstate->callbacks)); PyObject *info = NULL; - if (PyList_GET_SIZE(state->callbacks) != 0) { + if (PyList_GET_SIZE(gcstate->callbacks) != 0) { info = Py_BuildValue("{sisnsn}", "generation", generation, "collected", collected, @@ -1212,8 +1359,8 @@ invoke_gc_callback(struct _gc_runtime_state *state, const char *phase, return; } } - for (Py_ssize_t i=0; icallbacks); i++) { - PyObject *r, *cb = PyList_GET_ITEM(state->callbacks, i); + for (Py_ssize_t i=0; icallbacks); i++) { + PyObject *r, *cb = PyList_GET_ITEM(gcstate->callbacks, i); Py_INCREF(cb); /* make sure cb doesn't go away */ r = PyObject_CallFunction(cb, "sO", phase, info); if (r == NULL) { @@ -1225,41 +1372,74 @@ invoke_gc_callback(struct _gc_runtime_state *state, const char *phase, Py_DECREF(cb); } Py_XDECREF(info); - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); } /* Perform garbage collection of a generation and invoke * progress callbacks. */ static Py_ssize_t -collect_with_callback(struct _gc_runtime_state *state, int generation) +collect_with_callback(PyThreadState *tstate, int generation) { - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); Py_ssize_t result, collected, uncollectable; - invoke_gc_callback(state, "start", generation, 0, 0); - result = collect(state, generation, &collected, &uncollectable, 0); - invoke_gc_callback(state, "stop", generation, collected, uncollectable); - assert(!PyErr_Occurred()); + invoke_gc_callback(tstate, "start", generation, 0, 0); + result = collect(tstate, generation, &collected, &uncollectable, 0); + invoke_gc_callback(tstate, "stop", generation, collected, uncollectable); + assert(!_PyErr_Occurred(tstate)); return result; } static Py_ssize_t -collect_generations(struct _gc_runtime_state *state) +collect_generations(PyThreadState *tstate) { + GCState *gcstate = &tstate->interp->gc; /* Find the oldest generation (highest numbered) where the count * exceeds the threshold. Objects in the that generation and * generations younger than it will be collected. */ Py_ssize_t n = 0; for (int i = NUM_GENERATIONS-1; i >= 0; i--) { - if (state->generations[i].count > state->generations[i].threshold) { + if (gcstate->generations[i].count > gcstate->generations[i].threshold) { /* Avoid quadratic performance degradation in number - of tracked objects. See comments at the beginning - of this file, and issue #4074. + of tracked objects (see also issue #4074): + + To limit the cost of garbage collection, there are two strategies; + - make each collection faster, e.g. by scanning fewer objects + - do less collections + This heuristic is about the latter strategy. + + In addition to the various configurable thresholds, we only trigger a + full collection if the ratio + + long_lived_pending / long_lived_total + + is above a given value (hardwired to 25%). + + The reason is that, while "non-full" collections (i.e., collections of + the young and middle generations) will always examine roughly the same + number of objects -- determined by the aforementioned thresholds --, + the cost of a full collection is proportional to the total number of + long-lived objects, which is virtually unbounded. + + Indeed, it has been remarked that doing a full collection every + of object creations entails a dramatic performance + degradation in workloads which consist in creating and storing lots of + long-lived objects (e.g. building a large list of GC-tracked objects would + show quadratic performance, instead of linear as expected: see issue #4074). + + Using the above ratio, instead, yields amortized linear performance in + the total number of objects (the effect of which can be summarized + thusly: "each full garbage collection is more and more costly as the + number of objects grows, but we do fewer and fewer of them"). + + This heuristic was suggested by Martin von Löwis on python-dev in + June 2008. His original analysis and proposal can be found at: + http://mail.python.org/pipermail/python-dev/2008-June/080579.html */ if (i == NUM_GENERATIONS - 1 - && state->long_lived_pending < state->long_lived_total / 4) + && gcstate->long_lived_pending < gcstate->long_lived_total / 4) continue; - n = collect_with_callback(state, i); + n = collect_with_callback(tstate, i); break; } } @@ -1278,7 +1458,9 @@ static PyObject * gc_enable_impl(PyObject *module) /*[clinic end generated code: output=45a427e9dce9155c input=81ac4940ca579707]*/ { - _PyRuntime.gc.enabled = 1; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; + gcstate->enabled = 1; Py_RETURN_NONE; } @@ -1292,7 +1474,9 @@ static PyObject * gc_disable_impl(PyObject *module) /*[clinic end generated code: output=97d1030f7aa9d279 input=8c2e5a14e800d83b]*/ { - _PyRuntime.gc.enabled = 0; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; + gcstate->enabled = 0; Py_RETURN_NONE; } @@ -1306,7 +1490,9 @@ static int gc_isenabled_impl(PyObject *module) /*[clinic end generated code: output=1874298331c49130 input=30005e0422373b31]*/ { - return _PyRuntime.gc.enabled; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; + return gcstate->enabled; } /*[clinic input] @@ -1327,22 +1513,23 @@ static Py_ssize_t gc_collect_impl(PyObject *module, int generation) /*[clinic end generated code: output=b697e633043233c7 input=40720128b682d879]*/ { + PyThreadState *tstate = _PyThreadState_GET(); if (generation < 0 || generation >= NUM_GENERATIONS) { - PyErr_SetString(PyExc_ValueError, "invalid generation"); + _PyErr_SetString(tstate, PyExc_ValueError, "invalid generation"); return -1; } - struct _gc_runtime_state *state = &_PyRuntime.gc; + GCState *gcstate = &tstate->interp->gc; Py_ssize_t n; - if (state->collecting) { + if (gcstate->collecting) { /* already collecting, don't do anything */ n = 0; } else { - state->collecting = 1; - n = collect_with_callback(state, generation); - state->collecting = 0; + gcstate->collecting = 1; + n = collect_with_callback(tstate, generation); + gcstate->collecting = 0; } return n; } @@ -1369,8 +1556,9 @@ static PyObject * gc_set_debug_impl(PyObject *module, int flags) /*[clinic end generated code: output=7c8366575486b228 input=5e5ce15e84fbed15]*/ { - _PyRuntime.gc.debug = flags; - + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; + gcstate->debug = flags; Py_RETURN_NONE; } @@ -1384,7 +1572,9 @@ static int gc_get_debug_impl(PyObject *module) /*[clinic end generated code: output=91242f3506cd1e50 input=91a101e1c3b98366]*/ { - return _PyRuntime.gc.debug; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; + return gcstate->debug; } PyDoc_STRVAR(gc_set_thresh__doc__, @@ -1396,15 +1586,16 @@ PyDoc_STRVAR(gc_set_thresh__doc__, static PyObject * gc_set_threshold(PyObject *self, PyObject *args) { - struct _gc_runtime_state *state = &_PyRuntime.gc; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; if (!PyArg_ParseTuple(args, "i|ii:set_threshold", - &state->generations[0].threshold, - &state->generations[1].threshold, - &state->generations[2].threshold)) + &gcstate->generations[0].threshold, + &gcstate->generations[1].threshold, + &gcstate->generations[2].threshold)) return NULL; for (int i = 3; i < NUM_GENERATIONS; i++) { /* generations higher than 2 get the same threshold */ - state->generations[i].threshold = state->generations[2].threshold; + gcstate->generations[i].threshold = gcstate->generations[2].threshold; } Py_RETURN_NONE; } @@ -1419,11 +1610,12 @@ static PyObject * gc_get_threshold_impl(PyObject *module) /*[clinic end generated code: output=7902bc9f41ecbbd8 input=286d79918034d6e6]*/ { - struct _gc_runtime_state *state = &_PyRuntime.gc; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; return Py_BuildValue("(iii)", - state->generations[0].threshold, - state->generations[1].threshold, - state->generations[2].threshold); + gcstate->generations[0].threshold, + gcstate->generations[1].threshold, + gcstate->generations[2].threshold); } /*[clinic input] @@ -1436,11 +1628,12 @@ static PyObject * gc_get_count_impl(PyObject *module) /*[clinic end generated code: output=354012e67b16398f input=a392794a08251751]*/ { - struct _gc_runtime_state *state = &_PyRuntime.gc; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; return Py_BuildValue("(iii)", - state->generations[0].count, - state->generations[1].count, - state->generations[2].count); + gcstate->generations[0].count, + gcstate->generations[1].count, + gcstate->generations[2].count); } static int @@ -1479,13 +1672,16 @@ Return the list of objects that directly refer to any of objs."); static PyObject * gc_get_referrers(PyObject *self, PyObject *args) { + PyThreadState *tstate = _PyThreadState_GET(); int i; PyObject *result = PyList_New(0); - if (!result) return NULL; + if (!result) { + return NULL; + } - struct _gc_runtime_state *state = &_PyRuntime.gc; + GCState *gcstate = &tstate->interp->gc; for (i = 0; i < NUM_GENERATIONS; i++) { - if (!(gc_referrers_for(args, GEN_HEAD(state, i), result))) { + if (!(gc_referrers_for(args, GEN_HEAD(gcstate, i), result))) { Py_DECREF(result); return NULL; } @@ -1517,7 +1713,7 @@ gc_get_referents(PyObject *self, PyObject *args) traverseproc traverse; PyObject *obj = PyTuple_GET_ITEM(args, i); - if (! PyObject_IS_GC(obj)) + if (!_PyObject_IS_GC(obj)) continue; traverse = Py_TYPE(obj)->tp_traverse; if (! traverse) @@ -1545,9 +1741,10 @@ static PyObject * gc_get_objects_impl(PyObject *module, Py_ssize_t generation) /*[clinic end generated code: output=48b35fea4ba6cb0e input=ef7da9df9806754c]*/ { + PyThreadState *tstate = _PyThreadState_GET(); int i; PyObject* result; - struct _gc_runtime_state *state = &_PyRuntime.gc; + GCState *gcstate = &tstate->interp->gc; result = PyList_New(0); if (result == NULL) { @@ -1557,20 +1754,20 @@ gc_get_objects_impl(PyObject *module, Py_ssize_t generation) /* If generation is passed, we extract only that generation */ if (generation != -1) { if (generation >= NUM_GENERATIONS) { - PyErr_Format(PyExc_ValueError, - "generation parameter must be less than the number of " - "available generations (%i)", - NUM_GENERATIONS); + _PyErr_Format(tstate, PyExc_ValueError, + "generation parameter must be less than the number of " + "available generations (%i)", + NUM_GENERATIONS); goto error; } if (generation < 0) { - PyErr_SetString(PyExc_ValueError, - "generation parameter cannot be negative"); + _PyErr_SetString(tstate, PyExc_ValueError, + "generation parameter cannot be negative"); goto error; } - if (append_objects(result, GEN_HEAD(state, generation))) { + if (append_objects(result, GEN_HEAD(gcstate, generation))) { goto error; } @@ -1579,7 +1776,7 @@ gc_get_objects_impl(PyObject *module, Py_ssize_t generation) /* If generation is not passed or None, get all objects from all generations */ for (i = 0; i < NUM_GENERATIONS; i++) { - if (append_objects(result, GEN_HEAD(state, i))) { + if (append_objects(result, GEN_HEAD(gcstate, i))) { goto error; } } @@ -1602,12 +1799,13 @@ gc_get_stats_impl(PyObject *module) { int i; struct gc_generation_stats stats[NUM_GENERATIONS], *st; + PyThreadState *tstate = _PyThreadState_GET(); /* To get consistent values despite allocations while constructing the result list, we use a snapshot of the running stats. */ - struct _gc_runtime_state *state = &_PyRuntime.gc; + GCState *gcstate = &tstate->interp->gc; for (i = 0; i < NUM_GENERATIONS; i++) { - stats[i] = state->generation_stats[i]; + stats[i] = gcstate->generation_stats[i]; } PyObject *result = PyList_New(0); @@ -1655,7 +1853,7 @@ gc_is_tracked(PyObject *module, PyObject *obj) { PyObject *result; - if (PyObject_IS_GC(obj) && _PyObject_GC_IS_TRACKED(obj)) + if (_PyObject_IS_GC(obj) && _PyObject_GC_IS_TRACKED(obj)) result = Py_True; else result = Py_False; @@ -1663,6 +1861,25 @@ gc_is_tracked(PyObject *module, PyObject *obj) return result; } +/*[clinic input] +gc.is_finalized + + obj: object + / + +Returns true if the object has been already finalized by the GC. +[clinic start generated code]*/ + +static PyObject * +gc_is_finalized(PyObject *module, PyObject *obj) +/*[clinic end generated code: output=e1516ac119a918ed input=201d0c58f69ae390]*/ +{ + if (_PyObject_IS_GC(obj) && _PyGCHead_FINALIZED(AS_GC(obj))) { + Py_RETURN_TRUE; + } + Py_RETURN_FALSE; +} + /*[clinic input] gc.freeze @@ -1677,10 +1894,11 @@ static PyObject * gc_freeze_impl(PyObject *module) /*[clinic end generated code: output=502159d9cdc4c139 input=b602b16ac5febbe5]*/ { - struct _gc_runtime_state *state = &_PyRuntime.gc; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; for (int i = 0; i < NUM_GENERATIONS; ++i) { - gc_list_merge(GEN_HEAD(state, i), &state->permanent_generation.head); - state->generations[i].count = 0; + gc_list_merge(GEN_HEAD(gcstate, i), &gcstate->permanent_generation.head); + gcstate->generations[i].count = 0; } Py_RETURN_NONE; } @@ -1697,8 +1915,10 @@ static PyObject * gc_unfreeze_impl(PyObject *module) /*[clinic end generated code: output=1c15f2043b25e169 input=2dd52b170f4cef6c]*/ { - struct _gc_runtime_state *state = &_PyRuntime.gc; - gc_list_merge(&state->permanent_generation.head, GEN_HEAD(state, NUM_GENERATIONS-1)); + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; + gc_list_merge(&gcstate->permanent_generation.head, + GEN_HEAD(gcstate, NUM_GENERATIONS-1)); Py_RETURN_NONE; } @@ -1712,7 +1932,9 @@ static Py_ssize_t gc_get_freeze_count_impl(PyObject *module) /*[clinic end generated code: output=61cbd9f43aa032e1 input=45ffbc65cfe2a6ed]*/ { - return gc_list_size(&_PyRuntime.gc.permanent_generation.head); + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; + return gc_list_size(&gcstate->permanent_generation.head); } @@ -1731,6 +1953,7 @@ PyDoc_STRVAR(gc__doc__, "get_threshold() -- Return the current the collection thresholds.\n" "get_objects() -- Return a list of all objects tracked by the collector.\n" "is_tracked() -- Returns true if a given object is tracked.\n" +"is_finalized() -- Returns true if a given object has been already finalized.\n" "get_referrers() -- Return the list of objects that refer to an object.\n" "get_referents() -- Return the list of objects that an object refers to.\n" "freeze() -- Freeze all tracked objects and ignore them for future collections.\n" @@ -1750,6 +1973,7 @@ static PyMethodDef GcMethods[] = { GC_GET_OBJECTS_METHODDEF GC_GET_STATS_METHODDEF GC_IS_TRACKED_METHODDEF + GC_IS_FINALIZED_METHODDEF {"get_referrers", gc_get_referrers, METH_VARARGS, gc_get_referrers__doc__}, {"get_referents", gc_get_referents, METH_VARARGS, @@ -1775,34 +1999,38 @@ static struct PyModuleDef gcmodule = { PyMODINIT_FUNC PyInit_gc(void) { - PyObject *m; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; - m = PyModule_Create(&gcmodule); + PyObject *m = PyModule_Create(&gcmodule); if (m == NULL) { return NULL; } - struct _gc_runtime_state *state = &_PyRuntime.gc; - if (state->garbage == NULL) { - state->garbage = PyList_New(0); - if (state->garbage == NULL) + if (gcstate->garbage == NULL) { + gcstate->garbage = PyList_New(0); + if (gcstate->garbage == NULL) { return NULL; + } } - Py_INCREF(state->garbage); - if (PyModule_AddObject(m, "garbage", state->garbage) < 0) + Py_INCREF(gcstate->garbage); + if (PyModule_AddObject(m, "garbage", gcstate->garbage) < 0) { return NULL; + } - if (state->callbacks == NULL) { - state->callbacks = PyList_New(0); - if (state->callbacks == NULL) + if (gcstate->callbacks == NULL) { + gcstate->callbacks = PyList_New(0); + if (gcstate->callbacks == NULL) { return NULL; + } } - Py_INCREF(state->callbacks); - if (PyModule_AddObject(m, "callbacks", state->callbacks) < 0) + Py_INCREF(gcstate->callbacks); + if (PyModule_AddObject(m, "callbacks", gcstate->callbacks) < 0) { return NULL; + } -#define ADD_INT(NAME) if (PyModule_AddIntConstant(m, #NAME, NAME) < 0) return NULL +#define ADD_INT(NAME) if (PyModule_AddIntConstant(m, #NAME, NAME) < 0) { return NULL; } ADD_INT(DEBUG_STATS); ADD_INT(DEBUG_COLLECTABLE); ADD_INT(DEBUG_UNCOLLECTABLE); @@ -1816,23 +2044,25 @@ PyInit_gc(void) Py_ssize_t PyGC_Collect(void) { - struct _gc_runtime_state *state = &_PyRuntime.gc; - if (!state->enabled) { + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; + + if (!gcstate->enabled) { return 0; } Py_ssize_t n; - if (state->collecting) { + if (gcstate->collecting) { /* already collecting, don't do anything */ n = 0; } else { PyObject *exc, *value, *tb; - state->collecting = 1; - PyErr_Fetch(&exc, &value, &tb); - n = collect_with_callback(state, NUM_GENERATIONS - 1); - PyErr_Restore(exc, value, tb); - state->collecting = 0; + gcstate->collecting = 1; + _PyErr_Fetch(tstate, &exc, &value, &tb); + n = collect_with_callback(tstate, NUM_GENERATIONS - 1); + _PyErr_Restore(tstate, exc, value, tb); + gcstate->collecting = 0; } return n; @@ -1847,9 +2077,10 @@ _PyGC_CollectIfEnabled(void) Py_ssize_t _PyGC_CollectNoFail(void) { - assert(!PyErr_Occurred()); + PyThreadState *tstate = _PyThreadState_GET(); + assert(!_PyErr_Occurred(tstate)); - struct _gc_runtime_state *state = &_PyRuntime.gc; + GCState *gcstate = &tstate->interp->gc; Py_ssize_t n; /* Ideally, this function is only called on interpreter shutdown, @@ -1858,25 +2089,25 @@ _PyGC_CollectNoFail(void) during interpreter shutdown (and then never finish it). See http://bugs.python.org/issue8713#msg195178 for an example. */ - if (state->collecting) { + if (gcstate->collecting) { n = 0; } else { - state->collecting = 1; - n = collect(state, NUM_GENERATIONS - 1, NULL, NULL, 1); - state->collecting = 0; + gcstate->collecting = 1; + n = collect(tstate, NUM_GENERATIONS - 1, NULL, NULL, 1); + gcstate->collecting = 0; } return n; } void -_PyGC_DumpShutdownStats(_PyRuntimeState *runtime) +_PyGC_DumpShutdownStats(PyThreadState *tstate) { - struct _gc_runtime_state *state = &runtime->gc; - if (!(state->debug & DEBUG_SAVEALL) - && state->garbage != NULL && PyList_GET_SIZE(state->garbage) > 0) { + GCState *gcstate = &tstate->interp->gc; + if (!(gcstate->debug & DEBUG_SAVEALL) + && gcstate->garbage != NULL && PyList_GET_SIZE(gcstate->garbage) > 0) { const char *message; - if (state->debug & DEBUG_UNCOLLECTABLE) + if (gcstate->debug & DEBUG_UNCOLLECTABLE) message = "gc: %zd uncollectable objects at " \ "shutdown"; else @@ -1887,13 +2118,13 @@ _PyGC_DumpShutdownStats(_PyRuntimeState *runtime) already. */ if (PyErr_WarnExplicitFormat(PyExc_ResourceWarning, "gc", 0, "gc", NULL, message, - PyList_GET_SIZE(state->garbage))) + PyList_GET_SIZE(gcstate->garbage))) PyErr_WriteUnraisable(NULL); - if (state->debug & DEBUG_UNCOLLECTABLE) { + if (gcstate->debug & DEBUG_UNCOLLECTABLE) { PyObject *repr = NULL, *bytes = NULL; - repr = PyObject_Repr(state->garbage); + repr = PyObject_Repr(gcstate->garbage); if (!repr || !(bytes = PyUnicode_EncodeFSDefault(repr))) - PyErr_WriteUnraisable(state->garbage); + PyErr_WriteUnraisable(gcstate->garbage); else { PySys_WriteStderr( " %s\n", @@ -1907,11 +2138,11 @@ _PyGC_DumpShutdownStats(_PyRuntimeState *runtime) } void -_PyGC_Fini(_PyRuntimeState *runtime) +_PyGC_Fini(PyThreadState *tstate) { - struct _gc_runtime_state *state = &runtime->gc; - Py_CLEAR(state->garbage); - Py_CLEAR(state->callbacks); + GCState *gcstate = &tstate->interp->gc; + Py_CLEAR(gcstate->garbage); + Py_CLEAR(gcstate->callbacks); } /* for debugging */ @@ -1921,6 +2152,21 @@ _PyGC_Dump(PyGC_Head *g) _PyObject_Dump(FROM_GC(g)); } + +#ifdef Py_DEBUG +static int +visit_validate(PyObject *op, void *parent_raw) +{ + PyObject *parent = _PyObject_CAST(parent_raw); + if (_PyObject_IsFreed(op)) { + _PyObject_ASSERT_FAILED_MSG(parent, + "PyObject_GC_Track() object is not valid"); + } + return 0; +} +#endif + + /* extension modules might be compiled with GC support so these functions must always be available */ @@ -1934,6 +2180,13 @@ PyObject_GC_Track(void *op_raw) "by the garbage collector"); } _PyObject_GC_TRACK(op); + +#ifdef Py_DEBUG + /* Check that the object is valid: validate objects traversed + by tp_traverse() */ + traverseproc traverse = Py_TYPE(op)->tp_traverse; + (void)traverse(op, visit_validate, op); +#endif } void @@ -1948,36 +2201,48 @@ PyObject_GC_UnTrack(void *op_raw) } } +int +PyObject_IS_GC(PyObject *obj) +{ + return _PyObject_IS_GC(obj); +} + static PyObject * _PyObject_GC_Alloc(int use_calloc, size_t basicsize) { - struct _gc_runtime_state *state = &_PyRuntime.gc; - PyObject *op; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; + if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head)) { + return _PyErr_NoMemory(tstate); + } + size_t size = sizeof(PyGC_Head) + basicsize; + PyGC_Head *g; - size_t size; - if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head)) - return PyErr_NoMemory(); - size = sizeof(PyGC_Head) + basicsize; - if (use_calloc) + if (use_calloc) { g = (PyGC_Head *)PyObject_Calloc(1, size); - else + } + else { g = (PyGC_Head *)PyObject_Malloc(size); - if (g == NULL) - return PyErr_NoMemory(); + } + if (g == NULL) { + return _PyErr_NoMemory(tstate); + } assert(((uintptr_t)g & 3) == 0); // g must be aligned 4bytes boundary + g->_gc_next = 0; g->_gc_prev = 0; - state->generations[0].count++; /* number of allocated GC objects */ - if (state->generations[0].count > state->generations[0].threshold && - state->enabled && - state->generations[0].threshold && - !state->collecting && - !PyErr_Occurred()) { - state->collecting = 1; - collect_generations(state); - state->collecting = 0; - } - op = FROM_GC(g); + gcstate->generations[0].count++; /* number of allocated GC objects */ + if (gcstate->generations[0].count > gcstate->generations[0].threshold && + gcstate->enabled && + gcstate->generations[0].threshold && + !gcstate->collecting && + !_PyErr_Occurred(tstate)) + { + gcstate->collecting = 1; + collect_generations(tstate); + gcstate->collecting = 0; + } + PyObject *op = FROM_GC(g); return op; } @@ -2033,7 +2298,7 @@ _PyObject_GC_Resize(PyVarObject *op, Py_ssize_t nitems) if (g == NULL) return (PyVarObject *)PyErr_NoMemory(); op = (PyVarObject *) FROM_GC(g); - Py_SIZE(op) = nitems; + Py_SET_SIZE(op, nitems); return op; } @@ -2044,9 +2309,28 @@ PyObject_GC_Del(void *op) if (_PyObject_GC_IS_TRACKED(op)) { gc_list_remove(g); } - struct _gc_runtime_state *state = &_PyRuntime.gc; - if (state->generations[0].count > 0) { - state->generations[0].count--; + PyThreadState *tstate = _PyThreadState_GET(); + GCState *gcstate = &tstate->interp->gc; + if (gcstate->generations[0].count > 0) { + gcstate->generations[0].count--; } PyObject_FREE(g); } + +int +PyObject_GC_IsTracked(PyObject* obj) +{ + if (_PyObject_IS_GC(obj) && _PyObject_GC_IS_TRACKED(obj)) { + return 1; + } + return 0; +} + +int +PyObject_GC_IsFinalized(PyObject *obj) +{ + if (_PyObject_IS_GC(obj) && _PyGCHead_FINALIZED(AS_GC(obj))) { + return 1; + } + return 0; +} diff --git a/Modules/getpath.c b/Modules/getpath.c index b727f66953b4606dbcadf9bd62e6a1553558991b..40358190a71b875379f0c8cca9583ddec0b942a3 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -1,11 +1,10 @@ /* Return the initial module search path. */ #include "Python.h" -#include "pycore_initconfig.h" -#include "osdefs.h" #include "pycore_fileutils.h" +#include "pycore_initconfig.h" #include "pycore_pathconfig.h" -#include "pycore_pystate.h" +#include "osdefs.h" // DELIM #include #include @@ -95,7 +94,7 @@ * process to find the installed Python tree. * * An embedding application can use Py_SetPath() to override all of - * these authomatic path computations. + * these automatic path computations. * * NOTE: Windows MSVC builds use PC/getpathp.c instead! */ @@ -105,14 +104,17 @@ extern "C" { #endif -#if !defined(PREFIX) || !defined(EXEC_PREFIX) || !defined(VERSION) || !defined(VPATH) -#error "PREFIX, EXEC_PREFIX, VERSION, and VPATH must be constant defined" +#if (!defined(PREFIX) || !defined(EXEC_PREFIX) \ + || !defined(VERSION) || !defined(VPATH)) +#error "PREFIX, EXEC_PREFIX, VERSION and VPATH macros must be defined" #endif #ifndef LANDMARK #define LANDMARK L"os.py" #endif +#define BUILD_LANDMARK L"Modules/Setup.local" + #define DECODE_LOCALE_ERR(NAME, LEN) \ ((LEN) == (size_t)-2) \ ? _PyStatus_ERR("cannot decode " NAME) \ @@ -123,17 +125,24 @@ extern "C" { typedef struct { wchar_t *path_env; /* PATH environment variable */ - wchar_t *pythonpath; /* PYTHONPATH macro */ - wchar_t *prefix; /* PREFIX macro */ - wchar_t *exec_prefix; /* EXEC_PREFIX macro */ + wchar_t *pythonpath_macro; /* PYTHONPATH macro */ + wchar_t *prefix_macro; /* PREFIX macro */ + wchar_t *exec_prefix_macro; /* EXEC_PREFIX macro */ + wchar_t *vpath_macro; /* VPATH macro */ - wchar_t *lib_python; /* "lib/pythonX.Y" */ + wchar_t *lib_python; /* / "pythonX.Y" */ int prefix_found; /* found platform independent libraries? */ int exec_prefix_found; /* found the platform dependent libraries? */ int warnings; const wchar_t *pythonpath_env; + const wchar_t *platlibdir; + + wchar_t *argv0_path; + wchar_t *zip_path; + wchar_t *prefix; + wchar_t *exec_prefix; } PyCalculatePath; static const wchar_t delimiter[2] = {DELIM, '\0'}; @@ -183,25 +192,6 @@ isfile(const wchar_t *filename) } -/* Is module -- check for .pyc too */ -static int -ismodule(wchar_t *filename, size_t filename_len) -{ - if (isfile(filename)) { - return 1; - } - - /* Check for the compiled version of prefix. */ - if (wcslen(filename) + 2 <= filename_len) { - wcscat(filename, L"c"); - if (isfile(filename)) { - return 1; - } - } - return 0; -} - - /* Is executable file */ static int isxfile(const wchar_t *filename) @@ -222,7 +212,7 @@ isxfile(const wchar_t *filename) /* Is directory */ static int -isdir(wchar_t *filename) +isdir(const wchar_t *filename) { struct stat buf; if (_Py_wstat(filename, &buf) != 0) { @@ -236,36 +226,83 @@ isdir(wchar_t *filename) /* Add a path component, by appending stuff to buffer. - buflen: 'buffer' length in characters including trailing NUL. */ + buflen: 'buffer' length in characters including trailing NUL. + + If path2 is empty: + + - if path doesn't end with SEP and is not empty, add SEP to path + - otherwise, do nothing. */ static PyStatus -joinpath(wchar_t *buffer, const wchar_t *stuff, size_t buflen) +joinpath(wchar_t *path, const wchar_t *path2, size_t path_len) { - size_t n, k; - if (stuff[0] != SEP) { - n = wcslen(buffer); - if (n >= buflen) { + size_t n; + if (!_Py_isabs(path2)) { + n = wcslen(path); + if (n >= path_len) { return PATHLEN_ERR(); } - if (n > 0 && buffer[n-1] != SEP) { - buffer[n++] = SEP; + if (n > 0 && path[n-1] != SEP) { + path[n++] = SEP; } } else { n = 0; } - k = wcslen(stuff); - if (n + k >= buflen) { + size_t k = wcslen(path2); + if (n + k >= path_len) { return PATHLEN_ERR(); } - wcsncpy(buffer+n, stuff, k); - buffer[n+k] = '\0'; + wcsncpy(path + n, path2, k); + path[n + k] = '\0'; return _PyStatus_OK(); } +static wchar_t* +substring(const wchar_t *str, size_t len) +{ + wchar_t *substr = PyMem_RawMalloc((len + 1) * sizeof(wchar_t)); + if (substr == NULL) { + return NULL; + } + + if (len) { + memcpy(substr, str, len * sizeof(wchar_t)); + } + substr[len] = L'\0'; + return substr; +} + + +static wchar_t* +joinpath2(const wchar_t *path, const wchar_t *path2) +{ + if (_Py_isabs(path2)) { + return _PyMem_RawWcsdup(path2); + } + + size_t len = wcslen(path); + int add_sep = (len > 0 && path[len - 1] != SEP); + len += add_sep; + len += wcslen(path2); + + wchar_t *new_path = PyMem_RawMalloc((len + 1) * sizeof(wchar_t)); + if (new_path == NULL) { + return NULL; + } + + wcscpy(new_path, path); + if (add_sep) { + wcscat(new_path, separator); + } + wcscat(new_path, path2); + return new_path; +} + + static inline int safe_wcscpy(wchar_t *dst, const wchar_t *src, size_t n) { @@ -280,27 +317,27 @@ safe_wcscpy(wchar_t *dst, const wchar_t *src, size_t n) /* copy_absolute requires that path be allocated at least - 'pathlen' characters (including trailing NUL). */ + 'abs_path_len' characters (including trailing NUL). */ static PyStatus -copy_absolute(wchar_t *path, const wchar_t *p, size_t pathlen) +copy_absolute(wchar_t *abs_path, const wchar_t *path, size_t abs_path_len) { - if (p[0] == SEP) { - if (safe_wcscpy(path, p, pathlen) < 0) { + if (_Py_isabs(path)) { + if (safe_wcscpy(abs_path, path, abs_path_len) < 0) { return PATHLEN_ERR(); } } else { - if (!_Py_wgetcwd(path, pathlen)) { + if (!_Py_wgetcwd(abs_path, abs_path_len)) { /* unable to get the current directory */ - if (safe_wcscpy(path, p, pathlen) < 0) { + if (safe_wcscpy(abs_path, path, abs_path_len) < 0) { return PATHLEN_ERR(); } return _PyStatus_OK(); } - if (p[0] == '.' && p[1] == SEP) { - p += 2; + if (path[0] == '.' && path[1] == SEP) { + path += 2; } - PyStatus status = joinpath(path, p, pathlen); + PyStatus status = joinpath(abs_path, path, abs_path_len); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -311,21 +348,58 @@ copy_absolute(wchar_t *path, const wchar_t *p, size_t pathlen) /* path_len: path length in characters including trailing NUL */ static PyStatus -absolutize(wchar_t *path, size_t path_len) +absolutize(wchar_t **path_p) { - if (path[0] == SEP) { - return _PyStatus_OK(); - } + assert(!_Py_isabs(*path_p)); wchar_t abs_path[MAXPATHLEN+1]; + wchar_t *path = *path_p; + PyStatus status = copy_absolute(abs_path, path, Py_ARRAY_LENGTH(abs_path)); if (_PyStatus_EXCEPTION(status)) { return status; } - if (safe_wcscpy(path, abs_path, path_len) < 0) { - return PATHLEN_ERR(); + PyMem_RawFree(*path_p); + *path_p = _PyMem_RawWcsdup(abs_path); + if (*path_p == NULL) { + return _PyStatus_NO_MEMORY(); + } + return _PyStatus_OK(); +} + + +/* Is module -- check for .pyc too */ +static PyStatus +ismodule(const wchar_t *path, int *result) +{ + wchar_t *filename = joinpath2(path, LANDMARK); + if (filename == NULL) { + return _PyStatus_NO_MEMORY(); + } + + if (isfile(filename)) { + PyMem_RawFree(filename); + *result = 1; + return _PyStatus_OK(); } + + /* Check for the compiled version of prefix. */ + size_t len = wcslen(filename); + wchar_t *pyc = PyMem_RawMalloc((len + 2) * sizeof(wchar_t)); + if (pyc == NULL) { + PyMem_RawFree(filename); + return _PyStatus_NO_MEMORY(); + } + + memcpy(pyc, filename, len * sizeof(wchar_t)); + pyc[len] = L'c'; + pyc[len + 1] = L'\0'; + *result = isfile(pyc); + + PyMem_RawFree(filename); + PyMem_RawFree(pyc); + return _PyStatus_OK(); } @@ -337,8 +411,10 @@ absolutize(wchar_t *path, size_t path_len) /* pathlen: 'path' length in characters including trailing NUL */ static PyStatus -add_exe_suffix(wchar_t *progpath, size_t progpathlen) +add_exe_suffix(wchar_t **progpath_p) { + wchar_t *progpath = *progpath_p; + /* Check for already have an executable suffix */ size_t n = wcslen(progpath); size_t s = wcslen(EXE_SUFFIX); @@ -346,17 +422,22 @@ add_exe_suffix(wchar_t *progpath, size_t progpathlen) return _PyStatus_OK(); } - if (n + s >= progpathlen) { - return PATHLEN_ERR(); + wchar_t *progpath2 = PyMem_RawMalloc((n + s + 1) * sizeof(wchar_t)); + if (progpath2 == NULL) { + return _PyStatus_NO_MEMORY(); } - wcsncpy(progpath + n, EXE_SUFFIX, s); - progpath[n+s] = '\0'; - if (!isxfile(progpath)) { - /* Path that added suffix is invalid: truncate (remove suffix) */ - progpath[n] = '\0'; - } + memcpy(progpath2, progpath, n * sizeof(wchar_t)); + memcpy(progpath2 + n, EXE_SUFFIX, s * sizeof(wchar_t)); + progpath2[n+s] = L'\0'; + if (isxfile(progpath2)) { + PyMem_RawFree(*progpath_p); + *progpath_p = progpath2; + } + else { + PyMem_RawFree(progpath2); + } return _PyStatus_OK(); } #endif @@ -367,13 +448,8 @@ add_exe_suffix(wchar_t *progpath, size_t progpathlen) */ static PyStatus search_for_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, - const wchar_t *argv0_path, wchar_t *prefix, size_t prefix_len, int *found) { - wchar_t path[MAXPATHLEN+1]; - memset(path, 0, sizeof(path)); - size_t path_len = Py_ARRAY_LENGTH(path); - PyStatus status; /* If PYTHONHOME is set, we believe it unconditionally */ @@ -394,49 +470,51 @@ search_for_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, return _PyStatus_OK(); } - /* Check to see if argv[0] is in the build directory */ - if (safe_wcscpy(path, argv0_path, path_len) < 0) { - return PATHLEN_ERR(); - } - status = joinpath(path, L"Modules/Setup.local", path_len); - if (_PyStatus_EXCEPTION(status)) { - return status; + /* Check to see if argv0_path is in the build directory + + Path: / */ + wchar_t *path = joinpath2(calculate->argv0_path, BUILD_LANDMARK); + if (path == NULL) { + return _PyStatus_NO_MEMORY(); } - if (isfile(path)) { - /* Check VPATH to see if argv0_path is in the build directory. - VPATH can be empty. */ - wchar_t *vpath = Py_DecodeLocale(VPATH, NULL); - if (vpath != NULL) { - /* Path: / / Lib / LANDMARK */ - if (safe_wcscpy(prefix, argv0_path, prefix_len) < 0) { - return PATHLEN_ERR(); - } - status = joinpath(prefix, vpath, prefix_len); - PyMem_RawFree(vpath); - if (_PyStatus_EXCEPTION(status)) { - return status; - } + int is_build_dir = isfile(path); + PyMem_RawFree(path); - status = joinpath(prefix, L"Lib", prefix_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - status = joinpath(prefix, LANDMARK, prefix_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } + if (is_build_dir) { + /* argv0_path is the build directory (BUILD_LANDMARK exists), + now also check LANDMARK using ismodule(). */ - if (ismodule(prefix, prefix_len)) { - *found = -1; - reduce(prefix); - return _PyStatus_OK(); - } + /* Path: / / Lib */ + /* or if VPATH is empty: / Lib */ + if (safe_wcscpy(prefix, calculate->argv0_path, prefix_len) < 0) { + return PATHLEN_ERR(); + } + + status = joinpath(prefix, calculate->vpath_macro, prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + + status = joinpath(prefix, L"Lib", prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + + int module; + status = ismodule(prefix, &module); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + if (module) { + /* BUILD_LANDMARK and LANDMARK found */ + *found = -1; + return _PyStatus_OK(); } } /* Search from argv0_path, until root is found */ - status = copy_absolute(prefix, argv0_path, prefix_len); + status = copy_absolute(prefix, calculate->argv0_path, prefix_len); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -448,14 +526,14 @@ search_for_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, if (_PyStatus_EXCEPTION(status)) { return status; } - status = joinpath(prefix, LANDMARK, prefix_len); + + int module; + status = ismodule(prefix, &module); if (_PyStatus_EXCEPTION(status)) { return status; } - - if (ismodule(prefix, prefix_len)) { + if (module) { *found = 1; - reduce(prefix); return _PyStatus_OK(); } prefix[n] = L'\0'; @@ -464,21 +542,21 @@ search_for_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, /* Look at configure's PREFIX. Path: / / LANDMARK */ - if (safe_wcscpy(prefix, calculate->prefix, prefix_len) < 0) { + if (safe_wcscpy(prefix, calculate->prefix_macro, prefix_len) < 0) { return PATHLEN_ERR(); } status = joinpath(prefix, calculate->lib_python, prefix_len); if (_PyStatus_EXCEPTION(status)) { return status; } - status = joinpath(prefix, LANDMARK, prefix_len); + + int module; + status = ismodule(prefix, &module); if (_PyStatus_EXCEPTION(status)) { return status; } - - if (ismodule(prefix, prefix_len)) { + if (module) { *found = 1; - reduce(prefix); return _PyStatus_OK(); } @@ -489,13 +567,14 @@ search_for_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, static PyStatus -calculate_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, - const wchar_t *argv0_path, - wchar_t *prefix, size_t prefix_len) +calculate_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig) { - PyStatus status; + wchar_t prefix[MAXPATHLEN+1]; + memset(prefix, 0, sizeof(prefix)); + size_t prefix_len = Py_ARRAY_LENGTH(prefix); - status = search_for_prefix(calculate, pathconfig, argv0_path, + PyStatus status; + status = search_for_prefix(calculate, pathconfig, prefix, prefix_len, &calculate->prefix_found); if (_PyStatus_EXCEPTION(status)) { @@ -507,21 +586,23 @@ calculate_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, fprintf(stderr, "Could not find platform independent libraries \n"); } - if (safe_wcscpy(prefix, calculate->prefix, prefix_len) < 0) { - return PATHLEN_ERR(); - } - status = joinpath(prefix, calculate->lib_python, prefix_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } + + calculate->prefix = joinpath2(calculate->prefix_macro, + calculate->lib_python); + } + else { + calculate->prefix = _PyMem_RawWcsdup(prefix); + } + + if (calculate->prefix == NULL) { + return _PyStatus_NO_MEMORY(); } return _PyStatus_OK(); } static PyStatus -calculate_set_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, - wchar_t *prefix) +calculate_set_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig) { /* Reduce prefix and exec_prefix to their essence, * e.g. /usr/local/lib/python1.5 is reduced to /usr/local. @@ -529,21 +610,32 @@ calculate_set_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, * return the compiled-in defaults instead. */ if (calculate->prefix_found > 0) { + wchar_t *prefix = _PyMem_RawWcsdup(calculate->prefix); + if (prefix == NULL) { + return _PyStatus_NO_MEMORY(); + } + reduce(prefix); reduce(prefix); - /* The prefix is the root directory, but reduce() chopped - * off the "/". */ - if (!prefix[0]) { - wcscpy(prefix, separator); + if (prefix[0]) { + pathconfig->prefix = prefix; + } + else { + PyMem_RawFree(prefix); + + /* The prefix is the root directory, but reduce() chopped + off the "/". */ + pathconfig->prefix = _PyMem_RawWcsdup(separator); + if (pathconfig->prefix == NULL) { + return _PyStatus_NO_MEMORY(); + } } - pathconfig->prefix = _PyMem_RawWcsdup(prefix); } else { - pathconfig->prefix = _PyMem_RawWcsdup(calculate->prefix); - } - - if (pathconfig->prefix == NULL) { - return _PyStatus_NO_MEMORY(); + pathconfig->prefix = _PyMem_RawWcsdup(calculate->prefix_macro); + if (pathconfig->prefix == NULL) { + return _PyStatus_NO_MEMORY(); + } } return _PyStatus_OK(); } @@ -556,28 +648,18 @@ calculate_pybuilddir(const wchar_t *argv0_path, { PyStatus status; - wchar_t filename[MAXPATHLEN+1]; - memset(filename, 0, sizeof(filename)); - size_t filename_len = Py_ARRAY_LENGTH(filename); - /* Check to see if argv[0] is in the build directory. "pybuilddir.txt" is written by setup.py and contains the relative path to the location of shared library modules. Filename: / "pybuilddir.txt" */ - if (safe_wcscpy(filename, argv0_path, filename_len) < 0) { - return PATHLEN_ERR(); - } - status = joinpath(filename, L"pybuilddir.txt", filename_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - if (!isfile(filename)) { - return _PyStatus_OK(); + wchar_t *filename = joinpath2(argv0_path, L"pybuilddir.txt"); + if (filename == NULL) { + return _PyStatus_NO_MEMORY(); } FILE *fp = _Py_wfopen(filename, L"rb"); + PyMem_RawFree(filename); if (fp == NULL) { errno = 0; return _PyStatus_OK(); @@ -615,7 +697,6 @@ calculate_pybuilddir(const wchar_t *argv0_path, */ static PyStatus search_for_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, - const wchar_t *argv0_path, wchar_t *exec_prefix, size_t exec_prefix_len, int *found) { @@ -649,8 +730,8 @@ search_for_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, /* Check for pybuilddir.txt */ assert(*found == 0); - status = calculate_pybuilddir(argv0_path, exec_prefix, exec_prefix_len, - found); + status = calculate_pybuilddir(calculate->argv0_path, + exec_prefix, exec_prefix_len, found); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -659,7 +740,7 @@ search_for_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, } /* Search from argv0_path, until root is found */ - status = copy_absolute(exec_prefix, argv0_path, exec_prefix_len); + status = copy_absolute(exec_prefix, calculate->argv0_path, exec_prefix_len); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -686,7 +767,7 @@ search_for_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, /* Look at configure's EXEC_PREFIX. Path: / / "lib-dynload" */ - if (safe_wcscpy(exec_prefix, calculate->exec_prefix, exec_prefix_len) < 0) { + if (safe_wcscpy(exec_prefix, calculate->exec_prefix_macro, exec_prefix_len) < 0) { return PATHLEN_ERR(); } status = joinpath(exec_prefix, calculate->lib_python, exec_prefix_len); @@ -709,13 +790,14 @@ search_for_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, static PyStatus -calculate_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, - const wchar_t *argv0_path, - wchar_t *exec_prefix, size_t exec_prefix_len) +calculate_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig) { PyStatus status; + wchar_t exec_prefix[MAXPATHLEN+1]; + memset(exec_prefix, 0, sizeof(exec_prefix)); + size_t exec_prefix_len = Py_ARRAY_LENGTH(exec_prefix); - status = search_for_exec_prefix(calculate, pathconfig, argv0_path, + status = search_for_exec_prefix(calculate, pathconfig, exec_prefix, exec_prefix_len, &calculate->exec_prefix_found); if (_PyStatus_EXCEPTION(status)) { @@ -727,62 +809,155 @@ calculate_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig, fprintf(stderr, "Could not find platform dependent libraries \n"); } - if (safe_wcscpy(exec_prefix, calculate->exec_prefix, exec_prefix_len) < 0) { - return PATHLEN_ERR(); + + /* / "lib-dynload" */ + wchar_t *lib_dynload = joinpath2(calculate->platlibdir, + L"lib-dynload"); + if (lib_dynload == NULL) { + return _PyStatus_NO_MEMORY(); } - status = joinpath(exec_prefix, L"lib/lib-dynload", exec_prefix_len); - if (_PyStatus_EXCEPTION(status)) { - return status; + + calculate->exec_prefix = joinpath2(calculate->exec_prefix_macro, + lib_dynload); + PyMem_RawFree(lib_dynload); + + if (calculate->exec_prefix == NULL) { + return _PyStatus_NO_MEMORY(); + } + } + else { + /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */ + calculate->exec_prefix = _PyMem_RawWcsdup(exec_prefix); + if (calculate->exec_prefix == NULL) { + return _PyStatus_NO_MEMORY(); } } - /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */ return _PyStatus_OK(); } static PyStatus calculate_set_exec_prefix(PyCalculatePath *calculate, - _PyPathConfig *pathconfig, - wchar_t *exec_prefix) + _PyPathConfig *pathconfig) { if (calculate->exec_prefix_found > 0) { + wchar_t *exec_prefix = _PyMem_RawWcsdup(calculate->exec_prefix); + if (exec_prefix == NULL) { + return _PyStatus_NO_MEMORY(); + } + reduce(exec_prefix); reduce(exec_prefix); reduce(exec_prefix); - if (!exec_prefix[0]) { - wcscpy(exec_prefix, separator); - } - pathconfig->exec_prefix = _PyMem_RawWcsdup(exec_prefix); + if (exec_prefix[0]) { + pathconfig->exec_prefix = exec_prefix; + } + else { + /* empty string: use SEP instead */ + PyMem_RawFree(exec_prefix); + + /* The exec_prefix is the root directory, but reduce() chopped + off the "/". */ + pathconfig->exec_prefix = _PyMem_RawWcsdup(separator); + if (pathconfig->exec_prefix == NULL) { + return _PyStatus_NO_MEMORY(); + } + } } else { - pathconfig->exec_prefix = _PyMem_RawWcsdup(calculate->exec_prefix); + pathconfig->exec_prefix = _PyMem_RawWcsdup(calculate->exec_prefix_macro); + if (pathconfig->exec_prefix == NULL) { + return _PyStatus_NO_MEMORY(); + } } + return _PyStatus_OK(); +} - if (pathconfig->exec_prefix == NULL) { - return _PyStatus_NO_MEMORY(); + +/* Similar to shutil.which(). + If found, write the path into *abs_path_p. */ +static PyStatus +calculate_which(const wchar_t *path_env, wchar_t *program_name, + wchar_t **abs_path_p) +{ + while (1) { + wchar_t *delim = wcschr(path_env, DELIM); + wchar_t *abs_path; + + if (delim) { + wchar_t *path = substring(path_env, delim - path_env); + if (path == NULL) { + return _PyStatus_NO_MEMORY(); + } + abs_path = joinpath2(path, program_name); + PyMem_RawFree(path); + } + else { + abs_path = joinpath2(path_env, program_name); + } + + if (abs_path == NULL) { + return _PyStatus_NO_MEMORY(); + } + + if (isxfile(abs_path)) { + *abs_path_p = abs_path; + return _PyStatus_OK(); + } + PyMem_RawFree(abs_path); + + if (!delim) { + break; + } + path_env = delim + 1; } + /* not found */ return _PyStatus_OK(); } +#ifdef __APPLE__ static PyStatus -calculate_program_full_path(PyCalculatePath *calculate, _PyPathConfig *pathconfig) +calculate_program_macos(wchar_t **abs_path_p) { - PyStatus status; - wchar_t program_full_path[MAXPATHLEN + 1]; - const size_t program_full_path_len = Py_ARRAY_LENGTH(program_full_path); - memset(program_full_path, 0, sizeof(program_full_path)); - -#ifdef __APPLE__ char execpath[MAXPATHLEN + 1]; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 uint32_t nsexeclength = Py_ARRAY_LENGTH(execpath) - 1; -#else - unsigned long nsexeclength = Py_ARRAY_LENGTH(execpath) - 1; -#endif -#endif + + /* On Mac OS X, if a script uses an interpreter of the form + "#!/opt/python2.3/bin/python", the kernel only passes "python" + as argv[0], which falls through to the $PATH search below. + If /opt/python2.3/bin isn't in your path, or is near the end, + this algorithm may incorrectly find /usr/bin/python. To work + around this, we can use _NSGetExecutablePath to get a better + hint of what the intended interpreter was, although this + will fail if a relative path was used. but in that case, + absolutize() should help us out below + */ + if (_NSGetExecutablePath(execpath, &nsexeclength) != 0 + || (wchar_t)execpath[0] != SEP) + { + /* _NSGetExecutablePath() failed or the path is relative */ + return _PyStatus_OK(); + } + + size_t len; + *abs_path_p = Py_DecodeLocale(execpath, &len); + if (*abs_path_p == NULL) { + return DECODE_LOCALE_ERR("executable path", len); + } + return _PyStatus_OK(); +} +#endif /* __APPLE__ */ + + +static PyStatus +calculate_program_impl(PyCalculatePath *calculate, _PyPathConfig *pathconfig) +{ + assert(pathconfig->program_full_path == NULL); + + PyStatus status; /* If there is no slash in the argv0 path, then we have to * assume python is on the user's $PATH, since there's no @@ -790,98 +965,40 @@ calculate_program_full_path(PyCalculatePath *calculate, _PyPathConfig *pathconfi * $PATH isn't exported, you lose. */ if (wcschr(pathconfig->program_name, SEP)) { - if (safe_wcscpy(program_full_path, pathconfig->program_name, - program_full_path_len) < 0) { - return PATHLEN_ERR(); + pathconfig->program_full_path = _PyMem_RawWcsdup(pathconfig->program_name); + if (pathconfig->program_full_path == NULL) { + return _PyStatus_NO_MEMORY(); } + return _PyStatus_OK(); } + #ifdef __APPLE__ - /* On Mac OS X, if a script uses an interpreter of the form - * "#!/opt/python2.3/bin/python", the kernel only passes "python" - * as argv[0], which falls through to the $PATH search below. - * If /opt/python2.3/bin isn't in your path, or is near the end, - * this algorithm may incorrectly find /usr/bin/python. To work - * around this, we can use _NSGetExecutablePath to get a better - * hint of what the intended interpreter was, although this - * will fail if a relative path was used. but in that case, - * absolutize() should help us out below - */ - else if(0 == _NSGetExecutablePath(execpath, &nsexeclength) && - execpath[0] == SEP) - { - size_t len; - wchar_t *path = Py_DecodeLocale(execpath, &len); - if (path == NULL) { - return DECODE_LOCALE_ERR("executable path", len); - } - if (safe_wcscpy(program_full_path, path, program_full_path_len) < 0) { - PyMem_RawFree(path); - return PATHLEN_ERR(); - } - PyMem_RawFree(path); + wchar_t *abs_path = NULL; + status = calculate_program_macos(&abs_path); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + if (abs_path) { + pathconfig->program_full_path = abs_path; + return _PyStatus_OK(); } #endif /* __APPLE__ */ - else if (calculate->path_env) { - wchar_t *path = calculate->path_env; - while (1) { - wchar_t *delim = wcschr(path, DELIM); - - if (delim) { - size_t len = delim - path; - if (len >= program_full_path_len) { - return PATHLEN_ERR(); - } - wcsncpy(program_full_path, path, len); - program_full_path[len] = '\0'; - } - else { - if (safe_wcscpy(program_full_path, path, - program_full_path_len) < 0) { - return PATHLEN_ERR(); - } - } - - status = joinpath(program_full_path, pathconfig->program_name, - program_full_path_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - if (isxfile(program_full_path)) { - break; - } - - if (!delim) { - program_full_path[0] = L'\0'; - break; - } - path = delim + 1; - } - } - else { - program_full_path[0] = '\0'; - } - if (program_full_path[0] != SEP && program_full_path[0] != '\0') { - status = absolutize(program_full_path, program_full_path_len); + if (calculate->path_env) { + wchar_t *abs_path = NULL; + status = calculate_which(calculate->path_env, pathconfig->program_name, + &abs_path); if (_PyStatus_EXCEPTION(status)) { return status; } - } -#if defined(__CYGWIN__) || defined(__MINGW32__) - /* For these platforms it is necessary to ensure that the .exe suffix - * is appended to the filename, otherwise there is potential for - * sys.executable to return the name of a directory under the same - * path (bpo-28441). - */ - if (program_full_path[0] != '\0') { - status = add_exe_suffix(program_full_path, program_full_path_len); - if (_PyStatus_EXCEPTION(status)) { - return status; + if (abs_path) { + pathconfig->program_full_path = abs_path; + return _PyStatus_OK(); } } -#endif - pathconfig->program_full_path = _PyMem_RawWcsdup(program_full_path); + /* In the last resort, use an empty string */ + pathconfig->program_full_path = _PyMem_RawWcsdup(L""); if (pathconfig->program_full_path == NULL) { return _PyStatus_NO_MEMORY(); } @@ -889,159 +1006,281 @@ calculate_program_full_path(PyCalculatePath *calculate, _PyPathConfig *pathconfi } +/* Calculate pathconfig->program_full_path */ static PyStatus -calculate_argv0_path(PyCalculatePath *calculate, const wchar_t *program_full_path, - wchar_t *argv0_path, size_t argv0_path_len) +calculate_program(PyCalculatePath *calculate, _PyPathConfig *pathconfig) { - if (safe_wcscpy(argv0_path, program_full_path, argv0_path_len) < 0) { - return PATHLEN_ERR(); + PyStatus status; + + status = calculate_program_impl(calculate, pathconfig); + if (_PyStatus_EXCEPTION(status)) { + return status; } -#ifdef WITH_NEXT_FRAMEWORK - NSModule pythonModule; + if (pathconfig->program_full_path[0] != '\0') { + /* program_full_path is not empty */ - /* On Mac OS X we have a special case if we're running from a framework. - ** This is because the python home should be set relative to the library, - ** which is in the framework, not relative to the executable, which may - ** be outside of the framework. Except when we're in the build directory... - */ - pythonModule = NSModuleForSymbol(NSLookupAndBindSymbol("_Py_Initialize")); - /* Use dylib functions to find out where the framework was loaded from */ - const char* modPath = NSLibraryNameForModule(pythonModule); - if (modPath != NULL) { - /* We're in a framework. */ - /* See if we might be in the build directory. The framework in the - ** build directory is incomplete, it only has the .dylib and a few - ** needed symlinks, it doesn't have the Lib directories and such. - ** If we're running with the framework from the build directory we must - ** be running the interpreter in the build directory, so we use the - ** build-directory-specific logic to find Lib and such. - */ - PyStatus status; - size_t len; - wchar_t* wbuf = Py_DecodeLocale(modPath, &len); - if (wbuf == NULL) { - return DECODE_LOCALE_ERR("framework location", len); - } - - if (safe_wcscpy(argv0_path, wbuf, argv0_path_len) < 0) { - return PATHLEN_ERR(); - } - reduce(argv0_path); - status = joinpath(argv0_path, calculate->lib_python, argv0_path_len); - if (_PyStatus_EXCEPTION(status)) { - PyMem_RawFree(wbuf); - return status; + /* Make sure that program_full_path is an absolute path */ + if (!_Py_isabs(pathconfig->program_full_path)) { + status = absolutize(&pathconfig->program_full_path); + if (_PyStatus_EXCEPTION(status)) { + return status; + } } - status = joinpath(argv0_path, LANDMARK, argv0_path_len); + +#if defined(__CYGWIN__) || defined(__MINGW32__) + /* For these platforms it is necessary to ensure that the .exe suffix + * is appended to the filename, otherwise there is potential for + * sys.executable to return the name of a directory under the same + * path (bpo-28441). + */ + status = add_exe_suffix(&pathconfig->program_full_path); if (_PyStatus_EXCEPTION(status)) { - PyMem_RawFree(wbuf); return status; } - if (!ismodule(argv0_path, Py_ARRAY_LENGTH(argv0_path))) { - /* We are in the build directory so use the name of the - executable - we know that the absolute path is passed */ - if (safe_wcscpy(argv0_path, program_full_path, - argv0_path_len) < 0) { - return PATHLEN_ERR(); - } - } - else { - /* Use the location of the library as the program_full_path */ - if (safe_wcscpy(argv0_path, wbuf, argv0_path_len) < 0) { - return PATHLEN_ERR(); - } - } - PyMem_RawFree(wbuf); - } #endif + } + return _PyStatus_OK(); +} + #if HAVE_READLINK - wchar_t tmpbuffer[MAXPATHLEN + 1]; - const size_t buflen = Py_ARRAY_LENGTH(tmpbuffer); - int linklen = _Py_wreadlink(program_full_path, tmpbuffer, buflen); - while (linklen != -1) { - if (tmpbuffer[0] == SEP) { - /* tmpbuffer should never be longer than MAXPATHLEN, - but extra check does not hurt */ - if (safe_wcscpy(argv0_path, tmpbuffer, argv0_path_len) < 0) { - return PATHLEN_ERR(); +static PyStatus +resolve_symlinks(wchar_t **path_p) +{ + wchar_t new_path[MAXPATHLEN + 1]; + const size_t new_path_len = Py_ARRAY_LENGTH(new_path); + unsigned int nlink = 0; + + while (1) { + int linklen = _Py_wreadlink(*path_p, new_path, new_path_len); + if (linklen == -1) { + /* not a symbolic link: we are done */ + break; + } + + if (_Py_isabs(new_path)) { + PyMem_RawFree(*path_p); + *path_p = _PyMem_RawWcsdup(new_path); + if (*path_p == NULL) { + return _PyStatus_NO_MEMORY(); } } else { - /* Interpret relative to program_full_path */ - PyStatus status; - reduce(argv0_path); - status = joinpath(argv0_path, tmpbuffer, argv0_path_len); - if (_PyStatus_EXCEPTION(status)) { - return status; + /* new_path is relative to path */ + reduce(*path_p); + + wchar_t *abs_path = joinpath2(*path_p, new_path); + if (abs_path == NULL) { + return _PyStatus_NO_MEMORY(); } + + PyMem_RawFree(*path_p); + *path_p = abs_path; + } + + nlink++; + /* 40 is the Linux kernel 4.2 limit */ + if (nlink >= 40) { + return _PyStatus_ERR("maximum number of symbolic links reached"); } - linklen = _Py_wreadlink(argv0_path, tmpbuffer, buflen); } + return _PyStatus_OK(); +} #endif /* HAVE_READLINK */ - reduce(argv0_path); - /* At this point, argv0_path is guaranteed to be less than - MAXPATHLEN bytes long. */ + +#ifdef WITH_NEXT_FRAMEWORK +static PyStatus +calculate_argv0_path_framework(PyCalculatePath *calculate, _PyPathConfig *pathconfig) +{ + NSModule pythonModule; + + /* On Mac OS X we have a special case if we're running from a framework. + This is because the python home should be set relative to the library, + which is in the framework, not relative to the executable, which may + be outside of the framework. Except when we're in the build + directory... */ + pythonModule = NSModuleForSymbol(NSLookupAndBindSymbol("_Py_Initialize")); + + /* Use dylib functions to find out where the framework was loaded from */ + const char* modPath = NSLibraryNameForModule(pythonModule); + if (modPath == NULL) { + return _PyStatus_OK(); + } + + /* We're in a framework. + See if we might be in the build directory. The framework in the + build directory is incomplete, it only has the .dylib and a few + needed symlinks, it doesn't have the Lib directories and such. + If we're running with the framework from the build directory we must + be running the interpreter in the build directory, so we use the + build-directory-specific logic to find Lib and such. */ + size_t len; + wchar_t* wbuf = Py_DecodeLocale(modPath, &len); + if (wbuf == NULL) { + return DECODE_LOCALE_ERR("framework location", len); + } + + /* Path: reduce(modPath) / lib_python / LANDMARK */ + PyStatus status; + + wchar_t *parent = _PyMem_RawWcsdup(wbuf); + if (parent == NULL) { + status = _PyStatus_NO_MEMORY(); + goto done; + } + + reduce(parent); + wchar_t *lib_python = joinpath2(parent, calculate->lib_python); + PyMem_RawFree(parent); + + if (lib_python == NULL) { + status = _PyStatus_NO_MEMORY(); + goto done; + } + + int module; + status = ismodule(lib_python, &module); + PyMem_RawFree(lib_python); + + if (_PyStatus_EXCEPTION(status)) { + goto done; + } + if (!module) { + /* We are in the build directory so use the name of the + executable - we know that the absolute path is passed */ + PyMem_RawFree(calculate->argv0_path); + calculate->argv0_path = _PyMem_RawWcsdup(pathconfig->program_full_path); + if (calculate->argv0_path == NULL) { + status = _PyStatus_NO_MEMORY(); + goto done; + } + + status = _PyStatus_OK(); + goto done; + } + + /* Use the location of the library as argv0_path */ + PyMem_RawFree(calculate->argv0_path); + calculate->argv0_path = wbuf; return _PyStatus_OK(); + +done: + PyMem_RawFree(wbuf); + return status; } +#endif -/* Search for an "pyvenv.cfg" environment configuration file, first in the - executable's directory and then in the parent directory. - If found, open it for use when searching for prefixes. -*/ static PyStatus -calculate_read_pyenv(PyCalculatePath *calculate, - wchar_t *argv0_path, size_t argv0_path_len) +calculate_argv0_path(PyCalculatePath *calculate, + _PyPathConfig *pathconfig) { PyStatus status; - const wchar_t *env_cfg = L"pyvenv.cfg"; - FILE *env_file; - wchar_t filename[MAXPATHLEN+1]; - const size_t filename_len = Py_ARRAY_LENGTH(filename); - memset(filename, 0, sizeof(filename)); + calculate->argv0_path = _PyMem_RawWcsdup(pathconfig->program_full_path); + if (calculate->argv0_path == NULL) { + return _PyStatus_NO_MEMORY(); + } - /* Filename: / "pyvenv.cfg" */ - if (safe_wcscpy(filename, argv0_path, filename_len) < 0) { - return PATHLEN_ERR(); +#ifdef WITH_NEXT_FRAMEWORK + status = calculate_argv0_path_framework(calculate, pathconfig); + if (_PyStatus_EXCEPTION(status)) { + return status; } +#endif - status = joinpath(filename, env_cfg, filename_len); + status = resolve_symlinks(&calculate->argv0_path); if (_PyStatus_EXCEPTION(status)) { return status; } - env_file = _Py_wfopen(filename, L"r"); - if (env_file == NULL) { + + reduce(calculate->argv0_path); + + return _PyStatus_OK(); +} + + +static PyStatus +calculate_open_pyenv(PyCalculatePath *calculate, FILE **env_file_p) +{ + *env_file_p = NULL; + + const wchar_t *env_cfg = L"pyvenv.cfg"; + + /* Filename: / "pyvenv.cfg" */ + wchar_t *filename = joinpath2(calculate->argv0_path, env_cfg); + if (filename == NULL) { + return _PyStatus_NO_MEMORY(); + } + + *env_file_p = _Py_wfopen(filename, L"r"); + PyMem_RawFree(filename); + + if (*env_file_p != NULL) { + return _PyStatus_OK(); + + } + + /* fopen() failed: reset errno */ + errno = 0; + + /* Path: / "pyvenv.cfg" */ + wchar_t *parent = _PyMem_RawWcsdup(calculate->argv0_path); + if (parent == NULL) { + return _PyStatus_NO_MEMORY(); + } + reduce(parent); + + filename = joinpath2(parent, env_cfg); + PyMem_RawFree(parent); + if (filename == NULL) { + return _PyStatus_NO_MEMORY(); + } + + *env_file_p = _Py_wfopen(filename, L"r"); + PyMem_RawFree(filename); + + if (*env_file_p == NULL) { + /* fopen() failed: reset errno */ errno = 0; + } + return _PyStatus_OK(); +} - /* Filename: / "pyvenv.cfg" */ - reduce(filename); - reduce(filename); - status = joinpath(filename, env_cfg, filename_len); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - env_file = _Py_wfopen(filename, L"r"); - if (env_file == NULL) { - errno = 0; - return _PyStatus_OK(); - } +/* Search for an "pyvenv.cfg" environment configuration file, first in the + executable's directory and then in the parent directory. + If found, open it for use when searching for prefixes. + + Write the 'home' variable of pyvenv.cfg into calculate->argv0_path. */ +static PyStatus +calculate_read_pyenv(PyCalculatePath *calculate) +{ + PyStatus status; + FILE *env_file = NULL; + + status = calculate_open_pyenv(calculate, &env_file); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + if (env_file == NULL) { + /* pyvenv.cfg not found */ + return _PyStatus_OK(); } /* Look for a 'home' variable and set argv0_path to it, if found */ - wchar_t home[MAXPATHLEN+1]; - memset(home, 0, sizeof(home)); + wchar_t *home = NULL; + status = _Py_FindEnvConfigValue(env_file, L"home", &home); + if (_PyStatus_EXCEPTION(status)) { + fclose(env_file); + return status; + } - if (_Py_FindEnvConfigValue(env_file, L"home", - home, Py_ARRAY_LENGTH(home))) { - if (safe_wcscpy(argv0_path, home, argv0_path_len) < 0) { - fclose(env_file); - return PATHLEN_ERR(); - } + if (home) { + PyMem_RawFree(calculate->argv0_path); + calculate->argv0_path = home; } fclose(env_file); return _PyStatus_OK(); @@ -1049,43 +1288,57 @@ calculate_read_pyenv(PyCalculatePath *calculate, static PyStatus -calculate_zip_path(PyCalculatePath *calculate, const wchar_t *prefix, - wchar_t *zip_path, size_t zip_path_len) +calculate_zip_path(PyCalculatePath *calculate) { - PyStatus status; + PyStatus res; + + /* Path: / "pythonXY.zip" */ + wchar_t *path = joinpath2(calculate->platlibdir, + L"python" Py_STRINGIFY(PY_MAJOR_VERSION) Py_STRINGIFY(PY_MINOR_VERSION) + L".zip"); + if (path == NULL) { + return _PyStatus_NO_MEMORY(); + } if (calculate->prefix_found > 0) { - /* Use the reduced prefix returned by Py_GetPrefix() */ - if (safe_wcscpy(zip_path, prefix, zip_path_len) < 0) { - return PATHLEN_ERR(); + /* Use the reduced prefix returned by Py_GetPrefix() + + Path: / / "pythonXY.zip" */ + wchar_t *parent = _PyMem_RawWcsdup(calculate->prefix); + if (parent == NULL) { + res = _PyStatus_NO_MEMORY(); + goto done; } - reduce(zip_path); - reduce(zip_path); + reduce(parent); + reduce(parent); + calculate->zip_path = joinpath2(parent, path); + PyMem_RawFree(parent); } else { - if (safe_wcscpy(zip_path, calculate->prefix, zip_path_len) < 0) { - return PATHLEN_ERR(); - } + calculate->zip_path = joinpath2(calculate->prefix_macro, path); } - status = joinpath(zip_path, L"lib/python00.zip", zip_path_len); - if (_PyStatus_EXCEPTION(status)) { - return status; + + if (calculate->zip_path == NULL) { + res = _PyStatus_NO_MEMORY(); + goto done; } /* Replace "00" with version */ - size_t bufsz = wcslen(zip_path); - zip_path[bufsz - 6] = VERSION[0]; - zip_path[bufsz - 5] = VERSION[2]; - return _PyStatus_OK(); + size_t len = wcslen(calculate->zip_path); + calculate->zip_path[len - 6] = VERSION[0]; + calculate->zip_path[len - 5] = VERSION[2]; + + res = _PyStatus_OK(); + +done: + PyMem_RawFree(path); + return res; } static PyStatus calculate_module_search_path(PyCalculatePath *calculate, - _PyPathConfig *pathconfig, - const wchar_t *prefix, - const wchar_t *exec_prefix, - const wchar_t *zip_path) + _PyPathConfig *pathconfig) { /* Calculate size of return buffer */ size_t bufsz = 0; @@ -1093,12 +1346,12 @@ calculate_module_search_path(PyCalculatePath *calculate, bufsz += wcslen(calculate->pythonpath_env) + 1; } - wchar_t *defpath = calculate->pythonpath; - size_t prefixsz = wcslen(prefix) + 1; + wchar_t *defpath = calculate->pythonpath_macro; + size_t prefixsz = wcslen(calculate->prefix) + 1; while (1) { wchar_t *delim = wcschr(defpath, DELIM); - if (defpath[0] != SEP) { + if (!_Py_isabs(defpath)) { /* Paths are relative to prefix */ bufsz += prefixsz; } @@ -1113,8 +1366,8 @@ calculate_module_search_path(PyCalculatePath *calculate, defpath = delim + 1; } - bufsz += wcslen(zip_path) + 1; - bufsz += wcslen(exec_prefix) + 1; + bufsz += wcslen(calculate->zip_path) + 1; + bufsz += wcslen(calculate->exec_prefix) + 1; /* Allocate the buffer */ wchar_t *buf = PyMem_RawMalloc(bufsz * sizeof(wchar_t)); @@ -1130,19 +1383,19 @@ calculate_module_search_path(PyCalculatePath *calculate, } /* Next is the default zip path */ - wcscat(buf, zip_path); + wcscat(buf, calculate->zip_path); wcscat(buf, delimiter); /* Next goes merge of compile-time $PYTHONPATH with * dynamically located prefix. */ - defpath = calculate->pythonpath; + defpath = calculate->pythonpath_macro; while (1) { wchar_t *delim = wcschr(defpath, DELIM); - if (defpath[0] != SEP) { - wcscat(buf, prefix); - if (prefixsz >= 2 && prefix[prefixsz - 2] != SEP && + if (!_Py_isabs(defpath)) { + wcscat(buf, calculate->prefix); + if (prefixsz >= 2 && calculate->prefix[prefixsz - 2] != SEP && defpath[0] != (delim ? DELIM : L'\0')) { /* not empty */ @@ -1165,7 +1418,7 @@ calculate_module_search_path(PyCalculatePath *calculate, wcscat(buf, delimiter); /* Finally, on goes the directory for dynamic-load modules */ - wcscat(buf, exec_prefix); + wcscat(buf, calculate->exec_prefix); pathconfig->module_search_path = buf; return _PyStatus_OK(); @@ -1176,6 +1429,11 @@ static PyStatus calculate_init(PyCalculatePath *calculate, const PyConfig *config) { size_t len; + + calculate->warnings = config->pathconfig_warnings; + calculate->pythonpath_env = config->pythonpath_env; + calculate->platlibdir = config->platlibdir; + const char *path = getenv("PATH"); if (path) { calculate->path_env = Py_DecodeLocale(path, &len); @@ -1184,26 +1442,34 @@ calculate_init(PyCalculatePath *calculate, const PyConfig *config) } } - calculate->pythonpath = Py_DecodeLocale(PYTHONPATH, &len); - if (!calculate->pythonpath) { - return DECODE_LOCALE_ERR("PYTHONPATH define", len); + /* Decode macros */ + calculate->pythonpath_macro = Py_DecodeLocale(PYTHONPATH, &len); + if (!calculate->pythonpath_macro) { + return DECODE_LOCALE_ERR("PYTHONPATH macro", len); } - - calculate->prefix = Py_DecodeLocale(PREFIX, &len); - if (!calculate->prefix) { - return DECODE_LOCALE_ERR("PREFIX define", len); + calculate->prefix_macro = Py_DecodeLocale(PREFIX, &len); + if (!calculate->prefix_macro) { + return DECODE_LOCALE_ERR("PREFIX macro", len); } - calculate->exec_prefix = Py_DecodeLocale(EXEC_PREFIX, &len); - if (!calculate->exec_prefix) { - return DECODE_LOCALE_ERR("EXEC_PREFIX define", len); + calculate->exec_prefix_macro = Py_DecodeLocale(EXEC_PREFIX, &len); + if (!calculate->exec_prefix_macro) { + return DECODE_LOCALE_ERR("EXEC_PREFIX macro", len); } - calculate->lib_python = Py_DecodeLocale("lib/python" VERSION, &len); - if (!calculate->lib_python) { - return DECODE_LOCALE_ERR("EXEC_PREFIX define", len); + calculate->vpath_macro = Py_DecodeLocale(VPATH, &len); + if (!calculate->vpath_macro) { + return DECODE_LOCALE_ERR("VPATH macro", len); } - calculate->warnings = config->pathconfig_warnings; - calculate->pythonpath_env = config->pythonpath_env; + // / "pythonX.Y" + wchar_t *pyversion = Py_DecodeLocale("python" VERSION, &len); + if (!pyversion) { + return DECODE_LOCALE_ERR("VERSION macro", len); + } + calculate->lib_python = joinpath2(config->platlibdir, pyversion); + PyMem_RawFree(pyversion); + if (calculate->lib_python == NULL) { + return _PyStatus_NO_MEMORY(); + } return _PyStatus_OK(); } @@ -1212,11 +1478,16 @@ calculate_init(PyCalculatePath *calculate, const PyConfig *config) static void calculate_free(PyCalculatePath *calculate) { - PyMem_RawFree(calculate->pythonpath); - PyMem_RawFree(calculate->prefix); - PyMem_RawFree(calculate->exec_prefix); + PyMem_RawFree(calculate->pythonpath_macro); + PyMem_RawFree(calculate->prefix_macro); + PyMem_RawFree(calculate->exec_prefix_macro); + PyMem_RawFree(calculate->vpath_macro); PyMem_RawFree(calculate->lib_python); PyMem_RawFree(calculate->path_env); + PyMem_RawFree(calculate->zip_path); + PyMem_RawFree(calculate->argv0_path); + PyMem_RawFree(calculate->prefix); + PyMem_RawFree(calculate->exec_prefix); } @@ -1226,84 +1497,66 @@ calculate_path(PyCalculatePath *calculate, _PyPathConfig *pathconfig) PyStatus status; if (pathconfig->program_full_path == NULL) { - status = calculate_program_full_path(calculate, pathconfig); + status = calculate_program(calculate, pathconfig); if (_PyStatus_EXCEPTION(status)) { return status; } } - wchar_t argv0_path[MAXPATHLEN+1]; - memset(argv0_path, 0, sizeof(argv0_path)); - - status = calculate_argv0_path(calculate, pathconfig->program_full_path, - argv0_path, Py_ARRAY_LENGTH(argv0_path)); + status = calculate_argv0_path(calculate, pathconfig); if (_PyStatus_EXCEPTION(status)) { return status; } /* If a pyvenv.cfg configure file is found, argv0_path is overriden with its 'home' variable. */ - status = calculate_read_pyenv(calculate, - argv0_path, Py_ARRAY_LENGTH(argv0_path)); + status = calculate_read_pyenv(calculate); if (_PyStatus_EXCEPTION(status)) { return status; } - wchar_t prefix[MAXPATHLEN+1]; - memset(prefix, 0, sizeof(prefix)); - status = calculate_prefix(calculate, pathconfig, - argv0_path, - prefix, Py_ARRAY_LENGTH(prefix)); + status = calculate_prefix(calculate, pathconfig); if (_PyStatus_EXCEPTION(status)) { return status; } - wchar_t zip_path[MAXPATHLEN+1]; /* ".../lib/pythonXY.zip" */ - memset(zip_path, 0, sizeof(zip_path)); - - status = calculate_zip_path(calculate, prefix, - zip_path, Py_ARRAY_LENGTH(zip_path)); + status = calculate_zip_path(calculate); if (_PyStatus_EXCEPTION(status)) { return status; } - wchar_t exec_prefix[MAXPATHLEN+1]; - memset(exec_prefix, 0, sizeof(exec_prefix)); - status = calculate_exec_prefix(calculate, pathconfig, argv0_path, - exec_prefix, Py_ARRAY_LENGTH(exec_prefix)); + status = calculate_exec_prefix(calculate, pathconfig); if (_PyStatus_EXCEPTION(status)) { return status; } - if ((!calculate->prefix_found || !calculate->exec_prefix_found) && - calculate->warnings) + if ((!calculate->prefix_found || !calculate->exec_prefix_found) + && calculate->warnings) { fprintf(stderr, "Consider setting $PYTHONHOME to [:]\n"); } if (pathconfig->module_search_path == NULL) { - status = calculate_module_search_path(calculate, pathconfig, - prefix, exec_prefix, zip_path); + status = calculate_module_search_path(calculate, pathconfig); if (_PyStatus_EXCEPTION(status)) { return status; } } if (pathconfig->prefix == NULL) { - status = calculate_set_prefix(calculate, pathconfig, prefix); + status = calculate_set_prefix(calculate, pathconfig); if (_PyStatus_EXCEPTION(status)) { return status; } } if (pathconfig->exec_prefix == NULL) { - status = calculate_set_exec_prefix(calculate, pathconfig, exec_prefix); + status = calculate_set_exec_prefix(calculate, pathconfig); if (_PyStatus_EXCEPTION(status)) { return status; } } - return _PyStatus_OK(); } @@ -1355,6 +1608,10 @@ _PyPathConfig_Calculate(_PyPathConfig *pathconfig, const PyConfig *config) goto done; } + /* program_full_path must an either an empty string or an absolute path */ + assert(wcslen(pathconfig->program_full_path) == 0 + || _Py_isabs(pathconfig->program_full_path)); + status = _PyStatus_OK(); done: diff --git a/Modules/grpmodule.c b/Modules/grpmodule.c index ab766b9850936dd9e7b292b157060cfc570aa893..cdb3ae859b3893fff505dd5ab38768f9723a0b6a 100644 --- a/Modules/grpmodule.c +++ b/Modules/grpmodule.c @@ -34,8 +34,21 @@ static PyStructSequence_Desc struct_group_type_desc = { }; -static int initialized; -static PyTypeObject StructGrpType; +typedef struct { + PyTypeObject *StructGrpType; +} grpmodulestate; + +static inline grpmodulestate* +get_grp_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (grpmodulestate *)state; +} + +#define modulestate_global get_grp_state(PyState_FindModule(&grpmodule)) + +static struct PyModuleDef grpmodule; #define DEFAULT_BUFFER_SIZE 1024 @@ -43,10 +56,10 @@ static PyObject * mkgrent(struct group *p) { int setIndex = 0; - PyObject *v = PyStructSequence_New(&StructGrpType), *w; + PyObject *v, *w; char **member; - if (v == NULL) + if ((v = PyStructSequence_New(modulestate_global->StructGrpType)) == NULL) return NULL; if ((w = PyList_New(0)) == NULL) { @@ -111,7 +124,7 @@ grp_getgrgid_impl(PyObject *module, PyObject *id) PyErr_Clear(); if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, "group id must be int, not %.200", - id->ob_type->tp_name) < 0) { + Py_TYPE(id)->tp_name) < 0) { return NULL; } py_int_id = PyNumber_Long(id); @@ -314,36 +327,52 @@ users are not explicitly listed as members of the groups they are in\n\ according to the password database. Check both databases to get\n\ complete membership information.)"); +static int grpmodule_traverse(PyObject *m, visitproc visit, void *arg) { + Py_VISIT(get_grp_state(m)->StructGrpType); + return 0; +} + +static int grpmodule_clear(PyObject *m) { + Py_CLEAR(get_grp_state(m)->StructGrpType); + return 0; +} +static void grpmodule_free(void *m) { + grpmodule_clear((PyObject *)m); +} static struct PyModuleDef grpmodule = { PyModuleDef_HEAD_INIT, "grp", grp__doc__, - -1, + sizeof(grpmodulestate), grp_methods, NULL, - NULL, - NULL, - NULL + grpmodule_traverse, + grpmodule_clear, + grpmodule_free, }; PyMODINIT_FUNC PyInit_grp(void) { - PyObject *m, *d; - m = PyModule_Create(&grpmodule); - if (m == NULL) + PyObject *m; + if ((m = PyState_FindModule(&grpmodule)) != NULL) { + Py_INCREF(m); + return m; + } + + if ((m = PyModule_Create(&grpmodule)) == NULL) { return NULL; - d = PyModule_GetDict(m); - if (!initialized) { - if (PyStructSequence_InitType2(&StructGrpType, - &struct_group_type_desc) < 0) - return NULL; } - if (PyDict_SetItemString(d, "struct_group", - (PyObject *)&StructGrpType) < 0) + + grpmodulestate *state = PyModule_GetState(m); + state->StructGrpType = PyStructSequence_NewType(&struct_group_type_desc); + if (state->StructGrpType == NULL) { return NULL; - initialized = 1; + } + + Py_INCREF(state->StructGrpType); + PyModule_AddObject(m, "struct_group", (PyObject *) state->StructGrpType); return m; } diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index eba59ba1b880342bb151fdcf3909f28d2f31dc07..95ef8d79a1653388503c69275dbecc52893b7a8d 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -2,7 +2,8 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" #include "pycore_tupleobject.h" -#include "structmember.h" +#include "pycore_object.h" // _PyObject_GC_TRACK() +#include // offsetof() /* Itertools module written and maintained by Raymond D. Hettinger @@ -134,7 +135,7 @@ groupby_step(groupbyobject *gbo) newkey = newvalue; Py_INCREF(newvalue); } else { - newkey = PyObject_CallFunctionObjArgs(gbo->keyfunc, newvalue, NULL); + newkey = PyObject_CallOneArg(gbo->keyfunc, newvalue); if (newkey == NULL) { Py_DECREF(newvalue); return -1; @@ -455,8 +456,6 @@ typedef struct { PyObject *weakreflist; } teeobject; -static PyTypeObject teedataobject_type; - static PyObject * teedataobject_newinternal(PyObject *it) { @@ -527,7 +526,7 @@ teedataobject_traverse(teedataobject *tdo, visitproc visit, void * arg) static void teedataobject_safe_decref(PyObject *obj) { - while (obj && Py_TYPE(obj) == &teedataobject_type && + while (obj && Py_IS_TYPE(obj, &teedataobject_type) && Py_REFCNT(obj) == 1) { PyObject *nextlink = ((teedataobject *)obj)->nextlink; ((teedataobject *)obj)->nextlink = NULL; @@ -614,7 +613,7 @@ itertools_teedataobject_impl(PyTypeObject *type, PyObject *it, if (len == LINKCELLS) { if (next != Py_None) { - if (Py_TYPE(next) != &teedataobject_type) + if (!Py_IS_TYPE(next, &teedataobject_type)) goto err; assert(tdo->nextlink == NULL); Py_INCREF(next); @@ -682,8 +681,6 @@ static PyTypeObject teedataobject_type = { }; -static PyTypeObject tee_type; - static PyObject * tee_next(teeobject *to) { @@ -949,8 +946,6 @@ typedef struct { int firstpass; } cycleobject; -static PyTypeObject cycle_type; - /*[clinic input] @classmethod itertools.cycle.__new__ @@ -1060,10 +1055,10 @@ cycle_reduce(cycleobject *lz, PyObject *Py_UNUSED(ignored)) } Py_DECREF(res); } - return Py_BuildValue("O(N)(Oi)", Py_TYPE(lz), it, lz->saved, 1); + return Py_BuildValue("O(N)(OO)", Py_TYPE(lz), it, lz->saved, Py_True); } - return Py_BuildValue("O(O)(Oi)", Py_TYPE(lz), lz->it, lz->saved, - lz->firstpass); + return Py_BuildValue("O(O)(OO)", Py_TYPE(lz), lz->it, lz->saved, + lz->firstpass ? Py_True : Py_False); } static PyObject * @@ -1147,8 +1142,6 @@ typedef struct { long start; } dropwhileobject; -static PyTypeObject dropwhile_type; - /*[clinic input] @classmethod itertools.dropwhile.__new__ @@ -1219,7 +1212,7 @@ dropwhile_next(dropwhileobject *lz) if (lz->start == 1) return item; - good = PyObject_CallFunctionObjArgs(lz->func, item, NULL); + good = PyObject_CallOneArg(lz->func, item); if (good == NULL) { Py_DECREF(item); return NULL; @@ -1314,8 +1307,6 @@ typedef struct { long stop; } takewhileobject; -static PyTypeObject takewhile_type; - /*[clinic input] @classmethod itertools.takewhile.__new__ @@ -1382,7 +1373,7 @@ takewhile_next(takewhileobject *lz) if (item == NULL) return NULL; - good = PyObject_CallFunctionObjArgs(lz->func, item, NULL); + good = PyObject_CallOneArg(lz->func, item); if (good == NULL) { Py_DECREF(item); return NULL; @@ -1734,8 +1725,6 @@ typedef struct { PyObject *it; } starmapobject; -static PyTypeObject starmap_type; - /*[clinic input] @classmethod itertools.starmap.__new__ @@ -2040,6 +2029,8 @@ static PyMethodDef chain_methods[] = { reduce_doc}, {"__setstate__", (PyCFunction)chain_setstate, METH_O, setstate_doc}, + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* sentinel */ }; @@ -2255,6 +2246,11 @@ product_next(productobject *lz) lz->result = result; Py_DECREF(old_result); } + // bpo-42536: The GC may have untracked this result tuple. Since we're + // recycling it, make sure it's tracked again: + else if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } /* Now, we've got the only copy so we can update it in-place */ assert (npools==0 || Py_REFCNT(result) == 1); @@ -2452,8 +2448,6 @@ typedef struct { int stopped; /* set to 1 when the iterator is exhausted */ } combinationsobject; -static PyTypeObject combinations_type; - /*[clinic input] @classmethod @@ -2580,6 +2574,11 @@ combinations_next(combinationsobject *co) co->result = result; Py_DECREF(old_result); } + // bpo-42536: The GC may have untracked this result tuple. Since we're + // recycling it, make sure it's tracked again: + else if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } /* Now, we've got the only copy so we can update it in-place * CPython's empty tuple is a singleton and cached in * PyTuple's freelist. @@ -2786,8 +2785,6 @@ typedef struct { int stopped; /* set to 1 when the cwr iterator is exhausted */ } cwrobject; -static PyTypeObject cwr_type; - /*[clinic input] @classmethod itertools.combinations_with_replacement.__new__ @@ -2916,6 +2913,11 @@ cwr_next(cwrobject *co) co->result = result; Py_DECREF(old_result); } + // bpo-42536: The GC may have untracked this result tuple. Since we're + // recycling it, make sure it's tracked again: + else if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } /* Now, we've got the only copy so we can update it in-place CPython's empty tuple is a singleton and cached in PyTuple's freelist. */ assert(r == 0 || Py_REFCNT(result) == 1); @@ -3076,12 +3078,15 @@ static PyTypeObject cwr_type = { /* permutations object ******************************************************** def permutations(iterable, r=None): - 'permutations(range(3), 2) --> (0,1) (0,2) (1,0) (1,2) (2,0) (2,1)' + # permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC + # permutations(range(3)) --> 012 021 102 120 201 210 pool = tuple(iterable) n = len(pool) r = n if r is None else r - indices = range(n) - cycles = range(n-r+1, n+1)[::-1] + if r > n: + return + indices = list(range(n)) + cycles = list(range(n, n-r, -1)) yield tuple(pool[i] for i in indices[:r]) while n: for i in reversed(range(r)): @@ -3108,8 +3113,6 @@ typedef struct { int stopped; /* set to 1 when the iterator is exhausted */ } permutationsobject; -static PyTypeObject permutations_type; - /*[clinic input] @classmethod itertools.permutations.__new__ @@ -3259,6 +3262,11 @@ permutations_next(permutationsobject *po) po->result = result; Py_DECREF(old_result); } + // bpo-42536: The GC may have untracked this result tuple. Since we're + // recycling it, make sure it's tracked again: + else if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } /* Now, we've got the only copy so we can update it in-place */ assert(r == 0 || Py_REFCNT(result) == 1); @@ -3469,8 +3477,6 @@ typedef struct { PyObject *initial; } accumulateobject; -static PyTypeObject accumulate_type; - /*[clinic input] @classmethod itertools.accumulate.__new__ @@ -3682,8 +3688,6 @@ typedef struct { PyObject *selectors; } compressobject; -static PyTypeObject compress_type; - /*[clinic input] @classmethod itertools.compress.__new__ @@ -3842,8 +3846,6 @@ typedef struct { PyObject *it; } filterfalseobject; -static PyTypeObject filterfalse_type; - /*[clinic input] @classmethod itertools.filterfalse.__new__ @@ -3915,7 +3917,7 @@ filterfalse_next(filterfalseobject *lz) ok = PyObject_IsTrue(item); } else { PyObject *good; - good = PyObject_CallFunctionObjArgs(lz->func, item, NULL); + good = PyObject_CallOneArg(lz->func, item); if (good == NULL) { Py_DECREF(item); return NULL; @@ -4014,8 +4016,6 @@ slow_mode: when cnt == PY_SSIZE_T_MAX, step is not int(1), or cnt is a float. Either long_cnt or long_step may be a float, Fraction, or Decimal. */ -static PyTypeObject count_type; - /*[clinic input] @classmethod itertools.count.__new__ @@ -4253,17 +4253,17 @@ repeat_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { repeatobject *ro; PyObject *element; - Py_ssize_t cnt = -1, n_kwds = 0; + Py_ssize_t cnt = -1, n_args; static char *kwargs[] = {"object", "times", NULL}; + n_args = PyTuple_GET_SIZE(args); + if (kwds != NULL) + n_args += PyDict_GET_SIZE(kwds); if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|n:repeat", kwargs, &element, &cnt)) return NULL; - - if (kwds != NULL) - n_kwds = PyDict_GET_SIZE(kwds); /* Does user supply times argument? */ - if ((PyTuple_Size(args) + n_kwds == 2) && cnt < 0) + if (n_args == 2 && cnt < 0) cnt = 0; ro = (repeatobject *)type->tp_alloc(type, 0); @@ -4536,6 +4536,11 @@ zip_longest_next(ziplongestobject *lz) PyTuple_SET_ITEM(result, i, item); Py_DECREF(olditem); } + // bpo-42536: The GC may have untracked this result tuple. Since we're + // recycling it, make sure it's tracked again: + if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } } else { result = PyTuple_New(tuplesize); if (result == NULL) @@ -4698,31 +4703,9 @@ combinations(p, r)\n\ combinations_with_replacement(p, r)\n\ "); - -static PyMethodDef module_methods[] = { - ITERTOOLS_TEE_METHODDEF - {NULL, NULL} /* sentinel */ -}; - - -static struct PyModuleDef itertoolsmodule = { - PyModuleDef_HEAD_INIT, - "itertools", - module_doc, - -1, - module_methods, - NULL, - NULL, - NULL, - NULL -}; - -PyMODINIT_FUNC -PyInit_itertools(void) +static int +itertoolsmodule_exec(PyObject *m) { - int i; - PyObject *m; - const char *name; PyTypeObject *typelist[] = { &accumulate_type, &combinations_type, @@ -4743,22 +4726,45 @@ PyInit_itertools(void) &groupby_type, &_grouper_type, &tee_type, - &teedataobject_type, - NULL + &teedataobject_type }; - Py_TYPE(&teedataobject_type) = &PyType_Type; - m = PyModule_Create(&itertoolsmodule); - if (m == NULL) - return NULL; + Py_SET_TYPE(&teedataobject_type, &PyType_Type); - for (i=0 ; typelist[i] != NULL ; i++) { - if (PyType_Ready(typelist[i]) < 0) - return NULL; - name = _PyType_Name(typelist[i]); - Py_INCREF(typelist[i]); - PyModule_AddObject(m, name, (PyObject *)typelist[i]); + for (size_t i = 0; i < Py_ARRAY_LENGTH(typelist); i++) { + if (PyModule_AddType(m, typelist[i]) < 0) { + return -1; + } } - return m; + return 0; +} + +static struct PyModuleDef_Slot itertoolsmodule_slots[] = { + {Py_mod_exec, itertoolsmodule_exec}, + {0, NULL} +}; + +static PyMethodDef module_methods[] = { + ITERTOOLS_TEE_METHODDEF + {NULL, NULL} /* sentinel */ +}; + + +static struct PyModuleDef itertoolsmodule = { + PyModuleDef_HEAD_INIT, + "itertools", + module_doc, + 0, + module_methods, + itertoolsmodule_slots, + NULL, + NULL, + NULL +}; + +PyMODINIT_FUNC +PyInit_itertools(void) +{ + return PyModuleDef_Init(&itertoolsmodule); } diff --git a/Modules/main.c b/Modules/main.c index 70be4cfacbf824e794f1c6f66869b461eaecfa0c..2cc891f61aadd1b3ecf99efd35e8fc0979b3bd57 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -1,25 +1,22 @@ /* Python interpreter main program */ #include "Python.h" -#include "pycore_initconfig.h" -#include "pycore_pylifecycle.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" - -#ifdef __FreeBSD__ -# include /* fedisableexcept() */ -#endif +#include "pycore_initconfig.h" // _PyArgv +#include "pycore_interp.h" // _PyInterpreterState.sysdict +#include "pycore_pathconfig.h" // _PyPathConfig_ComputeSysPath0() +#include "pycore_pylifecycle.h" // _Py_PreInitializeFromPyArgv() +#include "pycore_pystate.h" // _PyInterpreterState_GET() /* Includes for exit_sigint() */ -#include /* perror() */ +#include // perror() #ifdef HAVE_SIGNAL_H -# include /* SIGINT */ +# include // SIGINT #endif #if defined(HAVE_GETPID) && defined(HAVE_UNISTD_H) -# include /* getpid() */ +# include // getpid() #endif #ifdef MS_WINDOWS -# include /* STATUS_CONTROL_C_EXIT */ +# include // STATUS_CONTROL_C_EXIT #endif /* End of includes for exit_sigint() */ @@ -43,15 +40,6 @@ pymain_init(const _PyArgv *args) return status; } - /* 754 requires that FP exceptions run in "no stop" mode by default, - * and until C vendors implement C99's ways to control FP exceptions, - * Python requires non-stop mode. Alas, some platforms enable FP - * exceptions by default. Here we disable them. - */ -#ifdef __FreeBSD__ - fedisableexcept(FE_OVERFLOW); -#endif - PyPreConfig preconfig; PyPreConfig_InitPythonConfig(&preconfig); @@ -290,7 +278,7 @@ pymain_run_module(const wchar_t *modname, int set_argv0) Py_DECREF(runmodule); return pymain_exit_err_print(); } - runargs = Py_BuildValue("(Oi)", module, set_argv0); + runargs = PyTuple_Pack(2, module, set_argv0 ? Py_True : Py_False); if (runargs == NULL) { fprintf(stderr, "Could not create arguments for runpy._run_module_as_main\n"); @@ -299,7 +287,11 @@ pymain_run_module(const wchar_t *modname, int set_argv0) Py_DECREF(module); return pymain_exit_err_print(); } + _Py_UnhandledKeyboardInterrupt = 0; result = PyObject_Call(runmodule, runargs, NULL); + if (!result && PyErr_Occurred() == PyExc_KeyboardInterrupt) { + _Py_UnhandledKeyboardInterrupt = 1; + } Py_DECREF(runpy); Py_DECREF(runmodule); Py_DECREF(module); @@ -313,7 +305,7 @@ pymain_run_module(const wchar_t *modname, int set_argv0) static int -pymain_run_file(PyConfig *config, PyCompilerFlags *cf) +pymain_run_file(const PyConfig *config, PyCompilerFlags *cf) { const wchar_t *filename = config->run_filename; if (PySys_Audit("cpython.run_file", "u", filename) < 0) { @@ -550,9 +542,9 @@ pymain_repl(PyConfig *config, PyCompilerFlags *cf, int *exitcode) static void pymain_run_python(int *exitcode) { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); + PyInterpreterState *interp = _PyInterpreterState_GET(); /* pymain_run_stdin() modify the config */ - PyConfig *config = &interp->config; + PyConfig *config = (PyConfig*)_PyInterpreterState_GetConfig(interp); PyObject *main_importer_path = NULL; if (config->run_filename != NULL) { diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index b78fcedd03de5fd2c0cda356c39ef0c89da6e9d1..4aa7e6559af557e754bb0e8321549a38092a292f 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -53,6 +53,7 @@ raised for division by zero and mod by zero. */ #include "Python.h" +#include "pycore_dtoa.h" #include "_math.h" #include "clinic/mathmodule.c.h" @@ -646,7 +647,7 @@ m_remainder(double x, double y) Warning: some subtlety here. What we *want* to know at this point is whether the remainder m is less than, equal to, or greater than half of absy. However, we can't do that comparison directly because we - can't be sure that 0.5*absy is representable (the mutiplication + can't be sure that 0.5*absy is representable (the multiplication might incur precision loss due to underflow). So instead we compare m with the complement c = absy - m: m < 0.5*absy if and only if m < c, and so on. The catch is that absy - m might also not be @@ -825,37 +826,125 @@ m_log10(double x) } -/*[clinic input] -math.gcd +static PyObject * +math_gcd(PyObject *module, PyObject * const *args, Py_ssize_t nargs) +{ + PyObject *res, *x; + Py_ssize_t i; - x as a: object - y as b: object - / + if (nargs == 0) { + return PyLong_FromLong(0); + } + res = PyNumber_Index(args[0]); + if (res == NULL) { + return NULL; + } + if (nargs == 1) { + Py_SETREF(res, PyNumber_Absolute(res)); + return res; + } + for (i = 1; i < nargs; i++) { + x = PyNumber_Index(args[i]); + if (x == NULL) { + Py_DECREF(res); + return NULL; + } + if (res == _PyLong_One) { + /* Fast path: just check arguments. + It is okay to use identity comparison here. */ + Py_DECREF(x); + continue; + } + Py_SETREF(res, _PyLong_GCD(res, x)); + Py_DECREF(x); + if (res == NULL) { + return NULL; + } + } + return res; +} + +PyDoc_STRVAR(math_gcd_doc, +"gcd($module, *integers)\n" +"--\n" +"\n" +"Greatest Common Divisor."); -greatest common divisor of x and y -[clinic start generated code]*/ static PyObject * -math_gcd_impl(PyObject *module, PyObject *a, PyObject *b) -/*[clinic end generated code: output=7b2e0c151bd7a5d8 input=c2691e57fb2a98fa]*/ +long_lcm(PyObject *a, PyObject *b) { - PyObject *g; + PyObject *g, *m, *f, *ab; - a = PyNumber_Index(a); - if (a == NULL) + if (Py_SIZE(a) == 0 || Py_SIZE(b) == 0) { + return PyLong_FromLong(0); + } + g = _PyLong_GCD(a, b); + if (g == NULL) { return NULL; - b = PyNumber_Index(b); - if (b == NULL) { - Py_DECREF(a); + } + f = PyNumber_FloorDivide(a, g); + Py_DECREF(g); + if (f == NULL) { return NULL; } - g = _PyLong_GCD(a, b); - Py_DECREF(a); - Py_DECREF(b); - return g; + m = PyNumber_Multiply(f, b); + Py_DECREF(f); + if (m == NULL) { + return NULL; + } + ab = PyNumber_Absolute(m); + Py_DECREF(m); + return ab; +} + + +static PyObject * +math_lcm(PyObject *module, PyObject * const *args, Py_ssize_t nargs) +{ + PyObject *res, *x; + Py_ssize_t i; + + if (nargs == 0) { + return PyLong_FromLong(1); + } + res = PyNumber_Index(args[0]); + if (res == NULL) { + return NULL; + } + if (nargs == 1) { + Py_SETREF(res, PyNumber_Absolute(res)); + return res; + } + for (i = 1; i < nargs; i++) { + x = PyNumber_Index(args[i]); + if (x == NULL) { + Py_DECREF(res); + return NULL; + } + if (res == _PyLong_Zero) { + /* Fast path: just check arguments. + It is okay to use identity comparison here. */ + Py_DECREF(x); + continue; + } + Py_SETREF(res, long_lcm(res, x)); + Py_DECREF(x); + if (res == NULL) { + return NULL; + } + } + return res; } +PyDoc_STRVAR(math_lcm_doc, +"lcm($module, *integers)\n" +"--\n" +"\n" +"Least Common Multiple."); + + /* Call is_error when errno != 0, and where x is the result libm * returned. is_error will usually set up an exception and return * true (1), but may return false (0) without setting up an exception. @@ -936,9 +1025,7 @@ math_1_to_whatever(PyObject *arg, double (*func) (double), if (x == -1.0 && PyErr_Occurred()) return NULL; errno = 0; - PyFPE_START_PROTECT("in math_1", return 0); r = (*func)(x); - PyFPE_END_PROTECT(r); if (Py_IS_NAN(r) && !Py_IS_NAN(x)) { PyErr_SetString(PyExc_ValueError, "math domain error"); /* invalid arg */ @@ -972,9 +1059,7 @@ math_1a(PyObject *arg, double (*func) (double)) if (x == -1.0 && PyErr_Occurred()) return NULL; errno = 0; - PyFPE_START_PROTECT("in math_1a", return 0); r = (*func)(x); - PyFPE_END_PROTECT(r); if (errno && is_error(r)) return NULL; return PyFloat_FromDouble(r); @@ -1013,12 +1098,6 @@ math_1(PyObject *arg, double (*func) (double), int can_overflow) return math_1_to_whatever(arg, func, PyFloat_FromDouble, can_overflow); } -static PyObject * -math_1_to_int(PyObject *arg, double (*func) (double), int can_overflow) -{ - return math_1_to_whatever(arg, func, PyLong_FromDouble, can_overflow); -} - static PyObject * math_2(PyObject *const *args, Py_ssize_t nargs, double (*func) (double, double), const char *funcname) @@ -1035,9 +1114,7 @@ math_2(PyObject *const *args, Py_ssize_t nargs, return NULL; } errno = 0; - PyFPE_START_PROTECT("in math_2", return 0); r = (*func)(x, y); - PyFPE_END_PROTECT(r); if (Py_IS_NAN(r)) { if (!Py_IS_NAN(x) && !Py_IS_NAN(y)) errno = EDOM; @@ -1076,19 +1153,22 @@ math_2(PyObject *const *args, Py_ssize_t nargs, FUNC1(acos, acos, 0, "acos($module, x, /)\n--\n\n" - "Return the arc cosine (measured in radians) of x.") + "Return the arc cosine (measured in radians) of x.\n\n" + "The result is between 0 and pi.") FUNC1(acosh, m_acosh, 0, "acosh($module, x, /)\n--\n\n" "Return the inverse hyperbolic cosine of x.") FUNC1(asin, asin, 0, "asin($module, x, /)\n--\n\n" - "Return the arc sine (measured in radians) of x.") + "Return the arc sine (measured in radians) of x.\n\n" + "The result is between -pi/2 and pi/2.") FUNC1(asinh, m_asinh, 0, "asinh($module, x, /)\n--\n\n" "Return the inverse hyperbolic sine of x.") FUNC1(atan, atan, 0, "atan($module, x, /)\n--\n\n" - "Return the arc tangent (measured in radians) of x.") + "Return the arc tangent (measured in radians) of x.\n\n" + "The result is between -pi/2 and pi/2.") FUNC2(atan2, m_atan2, "atan2($module, y, x, /)\n--\n\n" "Return the arc tangent (measured in radians) of y/x.\n\n" @@ -1113,17 +1193,22 @@ math_ceil(PyObject *module, PyObject *number) /*[clinic end generated code: output=6c3b8a78bc201c67 input=2725352806399cab]*/ { _Py_IDENTIFIER(__ceil__); - PyObject *method, *result; - method = _PyObject_LookupSpecial(number, &PyId___ceil__); - if (method == NULL) { + if (!PyFloat_CheckExact(number)) { + PyObject *method = _PyObject_LookupSpecial(number, &PyId___ceil__); + if (method != NULL) { + PyObject *result = _PyObject_CallNoArg(method); + Py_DECREF(method); + return result; + } if (PyErr_Occurred()) return NULL; - return math_1_to_int(number, ceil, 0); } - result = _PyObject_CallNoArg(method); - Py_DECREF(method); - return result; + double x = PyFloat_AsDouble(number); + if (x == -1.0 && PyErr_Occurred()) + return NULL; + + return PyLong_FromDouble(ceil(x)); } FUNC2(copysign, copysign, @@ -1170,18 +1255,28 @@ static PyObject * math_floor(PyObject *module, PyObject *number) /*[clinic end generated code: output=c6a65c4884884b8a input=63af6b5d7ebcc3d6]*/ { + double x; + _Py_IDENTIFIER(__floor__); - PyObject *method, *result; - method = _PyObject_LookupSpecial(number, &PyId___floor__); - if (method == NULL) { + if (PyFloat_CheckExact(number)) { + x = PyFloat_AS_DOUBLE(number); + } + else + { + PyObject *method = _PyObject_LookupSpecial(number, &PyId___floor__); + if (method != NULL) { + PyObject *result = _PyObject_CallNoArg(method); + Py_DECREF(method); + return result; + } if (PyErr_Occurred()) return NULL; - return math_1_to_int(number, floor, 0); + x = PyFloat_AsDouble(number); + if (x == -1.0 && PyErr_Occurred()) + return NULL; } - result = _PyObject_CallNoArg(method); - Py_DECREF(method); - return result; + return PyLong_FromDouble(floor(x)); } FUNC1A(gamma, m_tgamma, @@ -1337,8 +1432,6 @@ math_fsum(PyObject *module, PyObject *seq) if (iter == NULL) return NULL; - PyFPE_START_PROTECT("fsum", Py_DECREF(iter); return NULL) - for(;;) { /* for x in iterable */ assert(0 <= n && n <= m); assert((m == NUM_PARTIALS && p == ps) || @@ -1433,7 +1526,6 @@ math_fsum(PyObject *module, PyObject *seq) sum = PyFloat_FromDouble(hi); _fsum_error: - PyFPE_END_PROTECT(hi) Py_DECREF(iter); if (p != ps) PyMem_Free(p); @@ -1447,28 +1539,6 @@ math_fsum(PyObject *module, PyObject *seq) #undef NUM_PARTIALS -/* Return the smallest integer k such that n < 2**k, or 0 if n == 0. - * Equivalent to floor(lg(x))+1. Also equivalent to: bitwidth_of_type - - * count_leading_zero_bits(x) - */ - -/* XXX: This routine does more or less the same thing as - * bits_in_digit() in Objects/longobject.c. Someday it would be nice to - * consolidate them. On BSD, there's a library function called fls() - * that we could use, and GCC provides __builtin_clz(). - */ - -static unsigned long -bit_length(unsigned long n) -{ - unsigned long len = 0; - while (n != 0) { - ++len; - n >>= 1; - } - return len; -} - static unsigned long count_set_bits(unsigned long n) { @@ -1883,7 +1953,7 @@ factorial_partial_product(unsigned long start, unsigned long stop, /* find midpoint of range(start, stop), rounded up to next odd number. */ midpoint = (start + num_operands) | 1; left = factorial_partial_product(start, midpoint, - bit_length(midpoint - 2)); + _Py_bit_length(midpoint - 2)); if (left == NULL) goto error; right = factorial_partial_product(midpoint, stop, max_bits); @@ -1913,7 +1983,7 @@ factorial_odd_part(unsigned long n) Py_INCREF(outer); upper = 3; - for (i = bit_length(n) - 2; i >= 0; i--) { + for (i = _Py_bit_length(n) - 2; i >= 0; i--) { v = n >> i; if (v <= 2) continue; @@ -1923,7 +1993,7 @@ factorial_odd_part(unsigned long n) /* Here inner is the product of all odd integers j in the range (0, n/2**(i+1)]. The factorial_partial_product call below gives the product of all odd integers j in the range (n/2**(i+1), n/2**i]. */ - partial = factorial_partial_product(lower, upper, bit_length(upper-2)); + partial = factorial_partial_product(lower, upper, _Py_bit_length(upper-2)); /* inner *= partial */ if (partial == NULL) goto error; @@ -1985,6 +2055,12 @@ math_factorial(PyObject *module, PyObject *arg) PyObject *result, *odd_part, *pyint_form; if (PyFloat_Check(arg)) { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "Using factorial() with floats is deprecated", + 1) < 0) + { + return NULL; + } PyObject *lx; double dx = PyFloat_AS_DOUBLE((PyFloatObject *)arg); if (!(Py_IS_FINITE(dx) && dx == floor(dx))) { @@ -2056,6 +2132,10 @@ math_trunc(PyObject *module, PyObject *x) _Py_IDENTIFIER(__trunc__); PyObject *trunc, *result; + if (PyFloat_CheckExact(x)) { + return PyFloat_Type.tp_as_number->nb_int(x); + } + if (Py_TYPE(x)->tp_dict == NULL) { if (PyType_Ready(Py_TYPE(x)) < 0) return NULL; @@ -2098,9 +2178,7 @@ math_frexp_impl(PyObject *module, double x) i = 0; } else { - PyFPE_START_PROTECT("in math_frexp", return 0); x = frexp(x, &i); - PyFPE_END_PROTECT(x); } return Py_BuildValue("(di)", x, i); } @@ -2155,9 +2233,7 @@ math_ldexp_impl(PyObject *module, double x, PyObject *i) errno = 0; } else { errno = 0; - PyFPE_START_PROTECT("in math_ldexp", return 0); r = ldexp(x, (int)exp); - PyFPE_END_PROTECT(r); if (Py_IS_INFINITY(r)) errno = ERANGE; } @@ -2194,9 +2270,7 @@ math_modf_impl(PyObject *module, double x) } errno = 0; - PyFPE_START_PROTECT("in math_modf", return 0); x = modf(x, &y); - PyFPE_END_PROTECT(x); return Py_BuildValue("(dd)", x, y); } @@ -2343,9 +2417,7 @@ math_fmod_impl(PyObject *module, double x, double y) if (Py_IS_INFINITY(y) && Py_IS_FINITE(x)) return PyFloat_FromDouble(x); errno = 0; - PyFPE_START_PROTECT("in math_fmod", return 0); r = fmod(x, y); - PyFPE_END_PROTECT(r); if (Py_IS_NAN(r)) { if (!Py_IS_NAN(x) && !Py_IS_NAN(y)) errno = EDOM; @@ -2633,9 +2705,7 @@ math_pow_impl(PyObject *module, double x, double y) else { /* let libm handle finite**finite */ errno = 0; - PyFPE_START_PROTECT("in math_pow", return 0); r = pow(x, y); - PyFPE_END_PROTECT(r); /* a NaN result should arise only from (-ve)**(finite non-integer); in this case we want to raise ValueError. */ if (!Py_IS_FINITE(r)) { @@ -3301,6 +3371,85 @@ math_comb_impl(PyObject *module, PyObject *n, PyObject *k) } +/*[clinic input] +math.nextafter + + x: double + y: double + / + +Return the next floating-point value after x towards y. +[clinic start generated code]*/ + +static PyObject * +math_nextafter_impl(PyObject *module, double x, double y) +/*[clinic end generated code: output=750c8266c1c540ce input=02b2d50cd1d9f9b6]*/ +{ +#if defined(_AIX) + if (x == y) { + /* On AIX 7.1, libm nextafter(-0.0, +0.0) returns -0.0. + Bug fixed in bos.adt.libm 7.2.2.0 by APAR IV95512. */ + return PyFloat_FromDouble(y); + } +#endif + return PyFloat_FromDouble(nextafter(x, y)); +} + + +/*[clinic input] +math.ulp -> double + + x: double + / + +Return the value of the least significant bit of the float x. +[clinic start generated code]*/ + +static double +math_ulp_impl(PyObject *module, double x) +/*[clinic end generated code: output=f5207867a9384dd4 input=31f9bfbbe373fcaa]*/ +{ + if (Py_IS_NAN(x)) { + return x; + } + x = fabs(x); + if (Py_IS_INFINITY(x)) { + return x; + } + double inf = m_inf(); + double x2 = nextafter(x, inf); + if (Py_IS_INFINITY(x2)) { + /* special case: x is the largest positive representable float */ + x2 = nextafter(x, -inf); + return x - x2; + } + return x2 - x; +} + +static int +math_exec(PyObject *module) +{ + if (PyModule_AddObject(module, "pi", PyFloat_FromDouble(Py_MATH_PI)) < 0) { + return -1; + } + if (PyModule_AddObject(module, "e", PyFloat_FromDouble(Py_MATH_E)) < 0) { + return -1; + } + // 2pi + if (PyModule_AddObject(module, "tau", PyFloat_FromDouble(Py_MATH_TAU)) < 0) { + return -1; + } + if (PyModule_AddObject(module, "inf", PyFloat_FromDouble(m_inf())) < 0) { + return -1; + } +#if !defined(PY_NO_SHORT_FLOAT_REPR) || defined(Py_NAN) + if (PyModule_AddObject(module, "nan", PyFloat_FromDouble(m_nan())) < 0) { + return -1; + } +#endif + return 0; +} + static PyMethodDef math_methods[] = { {"acos", math_acos, METH_O, math_acos_doc}, {"acosh", math_acosh, METH_O, math_acosh_doc}, @@ -3326,13 +3475,14 @@ static PyMethodDef math_methods[] = { MATH_FREXP_METHODDEF MATH_FSUM_METHODDEF {"gamma", math_gamma, METH_O, math_gamma_doc}, - MATH_GCD_METHODDEF + {"gcd", (PyCFunction)(void(*)(void))math_gcd, METH_FASTCALL, math_gcd_doc}, {"hypot", (PyCFunction)(void(*)(void))math_hypot, METH_FASTCALL, math_hypot_doc}, MATH_ISCLOSE_METHODDEF MATH_ISFINITE_METHODDEF MATH_ISINF_METHODDEF MATH_ISNAN_METHODDEF MATH_ISQRT_METHODDEF + {"lcm", (PyCFunction)(void(*)(void))math_lcm, METH_FASTCALL, math_lcm_doc}, MATH_LDEXP_METHODDEF {"lgamma", math_lgamma, METH_O, math_lgamma_doc}, MATH_LOG_METHODDEF @@ -3352,44 +3502,31 @@ static PyMethodDef math_methods[] = { MATH_PROD_METHODDEF MATH_PERM_METHODDEF MATH_COMB_METHODDEF + MATH_NEXTAFTER_METHODDEF + MATH_ULP_METHODDEF {NULL, NULL} /* sentinel */ }; +static PyModuleDef_Slot math_slots[] = { + {Py_mod_exec, math_exec}, + {0, NULL} +}; PyDoc_STRVAR(module_doc, "This module provides access to the mathematical functions\n" "defined by the C standard."); - static struct PyModuleDef mathmodule = { PyModuleDef_HEAD_INIT, - "math", - module_doc, - -1, - math_methods, - NULL, - NULL, - NULL, - NULL + .m_name = "math", + .m_doc = module_doc, + .m_size = 0, + .m_methods = math_methods, + .m_slots = math_slots, }; PyMODINIT_FUNC PyInit_math(void) { - PyObject *m; - - m = PyModule_Create(&mathmodule); - if (m == NULL) - goto finally; - - PyModule_AddObject(m, "pi", PyFloat_FromDouble(Py_MATH_PI)); - PyModule_AddObject(m, "e", PyFloat_FromDouble(Py_MATH_E)); - PyModule_AddObject(m, "tau", PyFloat_FromDouble(Py_MATH_TAU)); /* 2pi */ - PyModule_AddObject(m, "inf", PyFloat_FromDouble(m_inf())); -#if !defined(PY_NO_SHORT_FLOAT_REPR) || defined(Py_NAN) - PyModule_AddObject(m, "nan", PyFloat_FromDouble(m_nan())); -#endif - - finally: - return m; + return PyModuleDef_Init(&mathmodule); } diff --git a/Modules/md5module.c b/Modules/md5module.c index c2ebaaf61f91c6926d6170a85ab69df6805c03a4..6ed843376ae784fd7fa6ae6402d8bc463e337748 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -74,7 +74,7 @@ typedef struct { * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + * Tom St Denis, tomstdenis@gmail.com, https://www.libtom.net */ /* rotate the hard way (platform optimizations could be done) */ @@ -503,13 +503,15 @@ static PyTypeObject MD5type = { _md5.md5 string: object(c_default="NULL") = b'' + * + usedforsecurity: bool = True Return a new MD5 hash object; optionally initialized with a string. [clinic start generated code]*/ static PyObject * -_md5_md5_impl(PyObject *module, PyObject *string) -/*[clinic end generated code: output=2cfd0f8c091b97e6 input=d12ef8f72d684f7b]*/ +_md5_md5_impl(PyObject *module, PyObject *string, int usedforsecurity) +/*[clinic end generated code: output=587071f76254a4ac input=7a144a1905636985]*/ { MD5object *new; Py_buffer buf; @@ -550,9 +552,6 @@ static struct PyMethodDef MD5_functions[] = { /* Initialize this module. */ -#define insint(n,v) { PyModule_AddIntConstant(m,n,v); } - - static struct PyModuleDef _md5module = { PyModuleDef_HEAD_INIT, "_md5", @@ -570,13 +569,15 @@ PyInit__md5(void) { PyObject *m; - Py_TYPE(&MD5type) = &PyType_Type; - if (PyType_Ready(&MD5type) < 0) + Py_SET_TYPE(&MD5type, &PyType_Type); + if (PyType_Ready(&MD5type) < 0) { return NULL; + } m = PyModule_Create(&_md5module); - if (m == NULL) + if (m == NULL) { return NULL; + } Py_INCREF((PyObject *)&MD5type); PyModule_AddObject(m, "MD5Type", (PyObject *)&MD5type); diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index 18758861a62e9c0d8c4a81cdfc5205a96125ffed..a3e22d0a5110da23117f20c668b602a7c176c7a1 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -20,7 +20,7 @@ #define PY_SSIZE_T_CLEAN #include -#include "structmember.h" +#include // offsetof() #ifndef MS_WINDOWS #define UNIX @@ -97,7 +97,7 @@ typedef struct { #else off_t offset; #endif - int exports; + Py_ssize_t exports; #ifdef MS_WINDOWS HANDLE map_handle; @@ -692,7 +692,52 @@ mmap__exit__method(PyObject *self, PyObject *args) { _Py_IDENTIFIER(close); - return _PyObject_CallMethodId(self, &PyId_close, NULL); + return _PyObject_CallMethodIdNoArgs(self, &PyId_close); +} + +static PyObject * +mmap__repr__method(PyObject *self) +{ + mmap_object *mobj = (mmap_object *)self; + +#ifdef MS_WINDOWS +#define _Py_FORMAT_OFFSET "lld" + if (mobj->map_handle == NULL) +#elif defined(UNIX) +# ifdef HAVE_LARGEFILE_SUPPORT +# define _Py_FORMAT_OFFSET "lld" +# else +# define _Py_FORMAT_OFFSET "ld" +# endif + if (mobj->data == NULL) +#endif + { + return PyUnicode_FromFormat("<%s closed=True>", Py_TYPE(self)->tp_name); + } else { + const char *access_str; + + switch (mobj->access) { + case ACCESS_DEFAULT: + access_str = "ACCESS_DEFAULT"; + break; + case ACCESS_READ: + access_str = "ACCESS_READ"; + break; + case ACCESS_WRITE: + access_str = "ACCESS_WRITE"; + break; + case ACCESS_COPY: + access_str = "ACCESS_COPY"; + break; + default: + Py_UNREACHABLE(); + } + + return PyUnicode_FromFormat("<%s closed=False, access=%s, length=%zd, " + "pos=%zd, offset=%" _Py_FORMAT_OFFSET ">", + Py_TYPE(self)->tp_name, access_str, + mobj->size, mobj->pos, mobj->offset); + } } #ifdef MS_WINDOWS @@ -1044,23 +1089,23 @@ static PyTypeObject mmap_object_type = { sizeof(mmap_object), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ - (destructor) mmap_object_dealloc, /* tp_dealloc */ + (destructor)mmap_object_dealloc, /* tp_dealloc */ 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ - 0, /* tp_repr */ + (reprfunc)mmap__repr__method, /* tp_repr */ 0, /* tp_as_number */ - &mmap_as_sequence, /*tp_as_sequence*/ - &mmap_as_mapping, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - PyObject_GenericGetAttr, /*tp_getattro*/ - 0, /*tp_setattro*/ - &mmap_as_buffer, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - mmap_doc, /*tp_doc*/ + &mmap_as_sequence, /* tp_as_sequence */ + &mmap_as_mapping, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + PyObject_GenericGetAttr, /* tp_getattro */ + 0, /* tp_setattro */ + &mmap_as_buffer, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + mmap_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ diff --git a/Modules/ossaudiodev.c b/Modules/ossaudiodev.c index f7712d97c2d724f1c1f95e783d7a79fac4f88f56..2a1ac10814a698870ea01b7f01e592ec72c4e1df 100644 --- a/Modules/ossaudiodev.c +++ b/Modules/ossaudiodev.c @@ -14,14 +14,12 @@ * (c) 2002 Gregory P. Ward. All Rights Reserved. * (c) 2002 Python Software Foundation. All Rights Reserved. * - * XXX need a license statement - * * $Id$ */ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #ifdef HAVE_FCNTL_H #include @@ -539,7 +537,7 @@ oss_exit(PyObject *self, PyObject *unused) { _Py_IDENTIFIER(close); - PyObject *ret = _PyObject_CallMethodId(self, &PyId_close, NULL); + PyObject *ret = _PyObject_CallMethodIdNoArgs(self, &PyId_close); if (!ret) return NULL; Py_DECREF(ret); diff --git a/Modules/overlapped.c b/Modules/overlapped.c index 27aac70f06ff01378a9861b0f6114ac90491d448..cd7869fa8aab0ab370cf379ae18767b9ec521954 100644 --- a/Modules/overlapped.c +++ b/Modules/overlapped.c @@ -8,7 +8,7 @@ Check itemsize */ #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #define WINDOWS_LEAN_AND_MEAN #include @@ -1856,12 +1856,10 @@ PyInit__overlapped(void) if (initialize_function_pointers() < 0) return NULL; - if (PyType_Ready(&OverlappedType) < 0) - return NULL; - m = PyModule_Create(&overlapped_module); - if (PyModule_AddObject(m, "Overlapped", (PyObject *)&OverlappedType) < 0) + if (PyModule_AddType(m, &OverlappedType) < 0) { return NULL; + } d = PyModule_GetDict(m); diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c index 079d00f32aa6cd3bbed2bcd12dc41d37e7c4e532..24b0ffbe36a7d1522fc49a93cdeb5e1ccf2f2a70 100644 --- a/Modules/parsermodule.c +++ b/Modules/parsermodule.c @@ -256,7 +256,7 @@ PyTypeObject PyST_Type = { /* PyST_Type isn't subclassable, so just check ob_type */ -#define PyST_Object_Check(v) ((v)->ob_type == &PyST_Type) +#define PyST_Object_Check(v) Py_IS_TYPE(v, &PyST_Type) static int parser_compare_nodes(node *left, node *right) @@ -1080,25 +1080,20 @@ parser__pickler(PyObject *self, PyObject *args) NOTE(ARGUNUSED(self)) PyObject *result = NULL; PyObject *st = NULL; - PyObject *empty_dict = NULL; if (PyArg_ParseTuple(args, "O!:_pickler", &PyST_Type, &st)) { PyObject *newargs; PyObject *tuple; - if ((empty_dict = PyDict_New()) == NULL) - goto finally; - if ((newargs = Py_BuildValue("Oi", st, 1)) == NULL) - goto finally; - tuple = parser_st2tuple((PyST_Object*)NULL, newargs, empty_dict); + if ((newargs = PyTuple_Pack(2, st, Py_True)) == NULL) + return NULL; + tuple = parser_st2tuple((PyST_Object*)NULL, newargs, NULL); if (tuple != NULL) { result = Py_BuildValue("O(O)", pickle_constructor, tuple); Py_DECREF(tuple); } Py_DECREF(newargs); } - finally: - Py_XDECREF(empty_dict); return (result); } @@ -1158,6 +1153,12 @@ PyInit_parser(void) { PyObject *module, *copyreg; + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "The parser module is deprecated and will be removed " + "in future versions of Python", 7) != 0) { + return NULL; + } + if (PyType_Ready(&PyST_Type) < 0) return NULL; module = PyModule_Create(&parsermodule); diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 726e3723f99d396a50cacd88fa1aa9a1e537af7f..5e33502721c1929bd1d2a6f0567a3fabfce0d3c1 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -1,4 +1,3 @@ - /* POSIX module implementation */ /* This file is also used for Windows NT/MS-Win. In that case the @@ -8,20 +7,6 @@ of the compiler used. Different compilers define their own feature test macro, e.g. '_MSC_VER'. */ - - -#ifdef __APPLE__ - /* - * Step 1 of support for weak-linking a number of symbols existing on - * OSX 10.4 and later, see the comment in the #ifdef __APPLE__ block - * at the end of this file for more information. - */ -# pragma weak lchown -# pragma weak statvfs -# pragma weak fstatvfs - -#endif /* __APPLE__ */ - #define PY_SSIZE_T_CLEAN #include "Python.h" @@ -35,10 +20,10 @@ # include #endif -#include "pycore_ceval.h" /* _PyEval_ReInitThreads() */ -#include "pycore_pystate.h" /* _PyRuntime */ -#include "pythread.h" -#include "structmember.h" +#include "pycore_ceval.h" // _PyEval_ReInitThreads() +#include "pycore_import.h" // _PyImport_ReInitLock() +#include "pycore_pystate.h" // _PyInterpreterState_GET() +#include "structmember.h" // PyMemberDef #ifndef MS_WINDOWS # include "posixmodule.h" #else @@ -48,11 +33,138 @@ /* On android API level 21, 'AT_EACCESS' is not declared although * HAVE_FACCESSAT is defined. */ #ifdef __ANDROID__ -#undef HAVE_FACCESSAT +# undef HAVE_FACCESSAT #endif #include /* needed for ctermid() */ +/* + * A number of APIs are available on macOS from a certain macOS version. + * To support building with a new SDK while deploying to older versions + * the availability test is split into two: + * - HAVE_: The configure check for compile time availability + * - HAVE__RUNTIME: Runtime check for availability + * + * The latter is always true when not on macOS, or when using a compiler + * that does not support __has_builtin (older versions of Xcode). + * + * Due to compiler restrictions there is one valid use of HAVE__RUNTIME: + * if (HAVE__RUNTIME) { ... } + * + * In mixing the test with other tests or using negations will result in compile + * errors. + */ +#if defined(__APPLE__) + +#if defined(__has_builtin) +#if __has_builtin(__builtin_available) +#define HAVE_BUILTIN_AVAILABLE 1 +#endif +#endif + +#ifdef HAVE_BUILTIN_AVAILABLE +# define HAVE_FSTATAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_FACCESSAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_FCHMODAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_FCHOWNAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_LINKAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_FDOPENDIR_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_MKDIRAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_RENAMEAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_UNLINKAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_OPENAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_READLINKAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_SYMLINKAT_RUNTIME __builtin_available(macOS 10.10, iOS 8.0, *) +# define HAVE_FUTIMENS_RUNTIME __builtin_available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *) +# define HAVE_UTIMENSAT_RUNTIME __builtin_available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *) +# define HAVE_PWRITEV_RUNTIME __builtin_available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) + +# define HAVE_POSIX_SPAWN_SETSID_RUNTIME __builtin_available(macOS 10.15, *) + +#else /* Xcode 8 or earlier */ + + /* __builtin_available is not present in these compilers, but + * some of the symbols might be weak linked (10.10 SDK or later + * deploying on 10.9. + * + * Fall back to the older style of availability checking for + * symbols introduced in macOS 10.10. + */ + +# ifdef HAVE_FSTATAT +# define HAVE_FSTATAT_RUNTIME (fstatat != NULL) +# endif + +# ifdef HAVE_FACCESSAT +# define HAVE_FACCESSAT_RUNTIME (faccessat != NULL) +# endif + +# ifdef HAVE_FCHMODAT +# define HAVE_FCHMODAT_RUNTIME (fchmodat != NULL) +# endif + +# ifdef HAVE_FCHOWNAT +# define HAVE_FCHOWNAT_RUNTIME (fchownat != NULL) +# endif + +# ifdef HAVE_LINKAT +# define HAVE_LINKAT_RUNTIME (linkat != NULL) +# endif + +# ifdef HAVE_FDOPENDIR +# define HAVE_FDOPENDIR_RUNTIME (fdopendir != NULL) +# endif + +# ifdef HAVE_MKDIRAT +# define HAVE_MKDIRAT_RUNTIME (mkdirat != NULL) +# endif + +# ifdef HAVE_RENAMEAT +# define HAVE_RENAMEAT_RUNTIME (renameat != NULL) +# endif + +# ifdef HAVE_UNLINKAT +# define HAVE_UNLINKAT_RUNTIME (unlinkat != NULL) +# endif + +# ifdef HAVE_OPENAT +# define HAVE_OPENAT_RUNTIME (openat != NULL) +# endif + +# ifdef HAVE_READLINKAT +# define HAVE_READLINKAT_RUNTIME (readlinkat != NULL) +# endif + +# ifdef HAVE_SYMLINKAT +# define HAVE_SYMLINKAT_RUNTIME (symlinkat != NULL) +# endif + +#endif + +#ifdef HAVE_FUTIMESAT +/* Some of the logic for weak linking depends on this assertion */ +# error "HAVE_FUTIMESAT unexpectedly defined" +#endif + +#else +# define HAVE_FSTATAT_RUNTIME 1 +# define HAVE_FACCESSAT_RUNTIME 1 +# define HAVE_FCHMODAT_RUNTIME 1 +# define HAVE_FCHOWNAT_RUNTIME 1 +# define HAVE_LINKAT_RUNTIME 1 +# define HAVE_FDOPENDIR_RUNTIME 1 +# define HAVE_MKDIRAT_RUNTIME 1 +# define HAVE_RENAMEAT_RUNTIME 1 +# define HAVE_UNLINKAT_RUNTIME 1 +# define HAVE_OPENAT_RUNTIME 1 +# define HAVE_READLINKAT_RUNTIME 1 +# define HAVE_SYMLINKAT_RUNTIME 1 +# define HAVE_FUTIMENS_RUNTIME 1 +# define HAVE_UTIMENSAT_RUNTIME 1 +# define HAVE_PWRITEV_RUNTIME 1 +#endif + + #ifdef __cplusplus extern "C" { #endif @@ -65,86 +177,89 @@ corresponding Unix manual entries for more information on calls."); #ifdef HAVE_SYS_UIO_H -#include +# include #endif #ifdef HAVE_SYS_SYSMACROS_H /* GNU C Library: major(), minor(), makedev() */ -#include +# include #endif #ifdef HAVE_SYS_TYPES_H -#include +# include #endif /* HAVE_SYS_TYPES_H */ #ifdef HAVE_SYS_STAT_H -#include +# include #endif /* HAVE_SYS_STAT_H */ #ifdef HAVE_SYS_WAIT_H -#include /* For WNOHANG */ +# include // WNOHANG +#endif +#ifdef HAVE_LINUX_WAIT_H +# include // P_PIDFD #endif #ifdef HAVE_SIGNAL_H -#include +# include #endif #ifdef HAVE_FCNTL_H -#include -#endif /* HAVE_FCNTL_H */ +# include +#endif #ifdef HAVE_GRP_H -#include +# include #endif #ifdef HAVE_SYSEXITS_H -#include -#endif /* HAVE_SYSEXITS_H */ +# include +#endif #ifdef HAVE_SYS_LOADAVG_H -#include +# include #endif #ifdef HAVE_SYS_SENDFILE_H -#include +# include #endif #if defined(__APPLE__) -#include +# include #endif #ifdef HAVE_SCHED_H -#include +# include #endif #ifdef HAVE_COPY_FILE_RANGE -#include +# include #endif #if !defined(CPU_ALLOC) && defined(HAVE_SCHED_SETAFFINITY) -#undef HAVE_SCHED_SETAFFINITY +# undef HAVE_SCHED_SETAFFINITY #endif #if defined(HAVE_SYS_XATTR_H) && defined(__GLIBC__) && !defined(__FreeBSD_kernel__) && !defined(__GNU__) -#define USE_XATTRS +# define USE_XATTRS #endif #ifdef USE_XATTRS -#include +# include #endif #if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__APPLE__) -#ifdef HAVE_SYS_SOCKET_H -#include -#endif +# ifdef HAVE_SYS_SOCKET_H +# include +# endif #endif #ifdef HAVE_DLFCN_H -#include +# include #endif #ifdef __hpux -#include +# include #endif #if defined(__DragonFly__) || \ @@ -152,7 +267,7 @@ corresponding Unix manual entries for more information on calls."); defined(__FreeBSD__) || \ defined(__NetBSD__) || \ defined(__APPLE__) -#include +# include #endif #ifdef HAVE_LINUX_RANDOM_H @@ -177,45 +292,47 @@ corresponding Unix manual entries for more information on calls."); /* Various compilers have only certain posix functions */ /* XXX Gosh I wish these were all moved into pyconfig.h */ #if defined(__WATCOMC__) && !defined(__QNX__) /* Watcom compiler */ -#define HAVE_OPENDIR 1 -#define HAVE_SYSTEM 1 -#include -#else -#ifdef _MSC_VER /* Microsoft compiler */ -#define HAVE_GETPPID 1 -#define HAVE_GETLOGIN 1 -#define HAVE_SPAWNV 1 -#define HAVE_EXECV 1 -#define HAVE_WSPAWNV 1 -#define HAVE_WEXECV 1 -#define HAVE_PIPE 1 -#define HAVE_SYSTEM 1 -#define HAVE_CWAIT 1 -#define HAVE_FSYNC 1 -#define fsync _commit -#else -/* Unix functions that the configure script doesn't check for */ -#ifndef __VXWORKS__ -#define HAVE_EXECV 1 -#define HAVE_FORK 1 -#if defined(__USLC__) && defined(__SCO_VERSION__) /* SCO UDK Compiler */ -#define HAVE_FORK1 1 -#endif -#endif -#define HAVE_GETEGID 1 -#define HAVE_GETEUID 1 -#define HAVE_GETGID 1 -#define HAVE_GETPPID 1 -#define HAVE_GETUID 1 -#define HAVE_KILL 1 -#define HAVE_OPENDIR 1 -#define HAVE_PIPE 1 -#define HAVE_SYSTEM 1 -#define HAVE_WAIT 1 -#define HAVE_TTYNAME 1 -#endif /* _MSC_VER */ +# define HAVE_OPENDIR 1 +# define HAVE_SYSTEM 1 +# include +#else +# ifdef _MSC_VER + /* Microsoft compiler */ +# define HAVE_GETPPID 1 +# define HAVE_GETLOGIN 1 +# define HAVE_SPAWNV 1 +# define HAVE_EXECV 1 +# define HAVE_WSPAWNV 1 +# define HAVE_WEXECV 1 +# define HAVE_PIPE 1 +# define HAVE_SYSTEM 1 +# define HAVE_CWAIT 1 +# define HAVE_FSYNC 1 +# define fsync _commit +# else + /* Unix functions that the configure script doesn't check for */ +# ifndef __VXWORKS__ +# define HAVE_EXECV 1 +# define HAVE_FORK 1 +# if defined(__USLC__) && defined(__SCO_VERSION__) /* SCO UDK Compiler */ +# define HAVE_FORK1 1 +# endif +# endif +# define HAVE_GETEGID 1 +# define HAVE_GETEUID 1 +# define HAVE_GETGID 1 +# define HAVE_GETPPID 1 +# define HAVE_GETUID 1 +# define HAVE_KILL 1 +# define HAVE_OPENDIR 1 +# define HAVE_PIPE 1 +# define HAVE_SYSTEM 1 +# define HAVE_WAIT 1 +# define HAVE_TTYNAME 1 +# endif /* _MSC_VER */ #endif /* ! __WATCOMC__ || __QNX__ */ +_Py_IDENTIFIER(__fspath__); /*[clinic input] # one of the few times we lie about this name! @@ -234,123 +351,119 @@ extern char *ctermid_r(char *); #endif /* !_MSC_VER */ #if defined(__VXWORKS__) -#include -#include -#include -#include -#ifndef _P_WAIT -#define _P_WAIT 0 -#define _P_NOWAIT 1 -#define _P_NOWAITO 1 -#endif +# include +# include +# include +# include +# ifndef _P_WAIT +# define _P_WAIT 0 +# define _P_NOWAIT 1 +# define _P_NOWAITO 1 +# endif #endif /* __VXWORKS__ */ #ifdef HAVE_POSIX_SPAWN -#include +# include #endif #ifdef HAVE_UTIME_H -#include +# include #endif /* HAVE_UTIME_H */ #ifdef HAVE_SYS_UTIME_H -#include -#define HAVE_UTIME_H /* pretend we do for the rest of this file */ +# include +# define HAVE_UTIME_H /* pretend we do for the rest of this file */ #endif /* HAVE_SYS_UTIME_H */ #ifdef HAVE_SYS_TIMES_H -#include +# include #endif /* HAVE_SYS_TIMES_H */ #ifdef HAVE_SYS_PARAM_H -#include +# include #endif /* HAVE_SYS_PARAM_H */ #ifdef HAVE_SYS_UTSNAME_H -#include +# include #endif /* HAVE_SYS_UTSNAME_H */ #ifdef HAVE_DIRENT_H -#include -#define NAMLEN(dirent) strlen((dirent)->d_name) -#else -#if defined(__WATCOMC__) && !defined(__QNX__) -#include -#define NAMLEN(dirent) strlen((dirent)->d_name) +# include +# define NAMLEN(dirent) strlen((dirent)->d_name) #else -#define dirent direct -#define NAMLEN(dirent) (dirent)->d_namlen -#endif -#ifdef HAVE_SYS_NDIR_H -#include -#endif -#ifdef HAVE_SYS_DIR_H -#include -#endif -#ifdef HAVE_NDIR_H -#include -#endif +# if defined(__WATCOMC__) && !defined(__QNX__) +# include +# define NAMLEN(dirent) strlen((dirent)->d_name) +# else +# define dirent direct +# define NAMLEN(dirent) (dirent)->d_namlen +# endif +# ifdef HAVE_SYS_NDIR_H +# include +# endif +# ifdef HAVE_SYS_DIR_H +# include +# endif +# ifdef HAVE_NDIR_H +# include +# endif #endif #ifdef _MSC_VER -#ifdef HAVE_DIRECT_H -#include -#endif -#ifdef HAVE_IO_H -#include -#endif -#ifdef HAVE_PROCESS_H -#include -#endif -#ifndef IO_REPARSE_TAG_SYMLINK -#define IO_REPARSE_TAG_SYMLINK (0xA000000CL) -#endif -#ifndef IO_REPARSE_TAG_MOUNT_POINT -#define IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L) -#endif -#include "osdefs.h" -#include -#include -#include /* for ShellExecute() */ -#include /* for UNLEN */ -#define HAVE_SYMLINK +# ifdef HAVE_DIRECT_H +# include +# endif +# ifdef HAVE_IO_H +# include +# endif +# ifdef HAVE_PROCESS_H +# include +# endif +# ifndef IO_REPARSE_TAG_SYMLINK +# define IO_REPARSE_TAG_SYMLINK (0xA000000CL) +# endif +# ifndef IO_REPARSE_TAG_MOUNT_POINT +# define IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L) +# endif +# include "osdefs.h" // SEP +# include +# include +# include // ShellExecute() +# include // UNLEN +# define HAVE_SYMLINK #endif /* _MSC_VER */ #ifndef MAXPATHLEN -#if defined(PATH_MAX) && PATH_MAX > 1024 -#define MAXPATHLEN PATH_MAX -#else -#define MAXPATHLEN 1024 -#endif +# if defined(PATH_MAX) && PATH_MAX > 1024 +# define MAXPATHLEN PATH_MAX +# else +# define MAXPATHLEN 1024 +# endif #endif /* MAXPATHLEN */ #ifdef UNION_WAIT -/* Emulate some macros on systems that have a union instead of macros */ - -#ifndef WIFEXITED -#define WIFEXITED(u_wait) (!(u_wait).w_termsig && !(u_wait).w_coredump) -#endif - -#ifndef WEXITSTATUS -#define WEXITSTATUS(u_wait) (WIFEXITED(u_wait)?((u_wait).w_retcode):-1) -#endif - -#ifndef WTERMSIG -#define WTERMSIG(u_wait) ((u_wait).w_termsig) -#endif - -#define WAIT_TYPE union wait -#define WAIT_STATUS_INT(s) (s.w_status) - -#else /* !UNION_WAIT */ -#define WAIT_TYPE int -#define WAIT_STATUS_INT(s) (s) + /* Emulate some macros on systems that have a union instead of macros */ +# ifndef WIFEXITED +# define WIFEXITED(u_wait) (!(u_wait).w_termsig && !(u_wait).w_coredump) +# endif +# ifndef WEXITSTATUS +# define WEXITSTATUS(u_wait) (WIFEXITED(u_wait)?((u_wait).w_retcode):-1) +# endif +# ifndef WTERMSIG +# define WTERMSIG(u_wait) ((u_wait).w_termsig) +# endif +# define WAIT_TYPE union wait +# define WAIT_STATUS_INT(s) (s.w_status) +#else + /* !UNION_WAIT */ +# define WAIT_TYPE int +# define WAIT_STATUS_INT(s) (s) #endif /* UNION_WAIT */ /* Don't use the "_r" form if we don't need it (also, won't have a prototype for it, at least on Solaris -- maybe others as well?). */ #if defined(HAVE_CTERMID_R) -#define USE_CTERMID_R +# define USE_CTERMID_R #endif /* choose the appropriate stat and fstat functions and return structs */ @@ -358,56 +471,56 @@ extern char *ctermid_r(char *); #undef FSTAT #undef STRUCT_STAT #ifdef MS_WINDOWS -# define STAT win32_stat -# define LSTAT win32_lstat -# define FSTAT _Py_fstat_noraise -# define STRUCT_STAT struct _Py_stat_struct +# define STAT win32_stat +# define LSTAT win32_lstat +# define FSTAT _Py_fstat_noraise +# define STRUCT_STAT struct _Py_stat_struct #else -# define STAT stat -# define LSTAT lstat -# define FSTAT fstat -# define STRUCT_STAT struct stat +# define STAT stat +# define LSTAT lstat +# define FSTAT fstat +# define STRUCT_STAT struct stat #endif #if defined(MAJOR_IN_MKDEV) -#include +# include #else -#if defined(MAJOR_IN_SYSMACROS) -#include -#endif -#if defined(HAVE_MKNOD) && defined(HAVE_SYS_MKDEV_H) -#include -#endif +# if defined(MAJOR_IN_SYSMACROS) +# include +# endif +# if defined(HAVE_MKNOD) && defined(HAVE_SYS_MKDEV_H) +# include +# endif #endif #ifdef MS_WINDOWS -#define INITFUNC PyInit_nt -#define MODNAME "nt" +# define INITFUNC PyInit_nt +# define MODNAME "nt" #else -#define INITFUNC PyInit_posix -#define MODNAME "posix" +# define INITFUNC PyInit_posix +# define MODNAME "posix" #endif #if defined(__sun) /* Something to implement in autoconf, not present in autoconf 2.69 */ -#define HAVE_STRUCT_STAT_ST_FSTYPE 1 +# define HAVE_STRUCT_STAT_ST_FSTYPE 1 #endif /* memfd_create is either defined in sys/mman.h or sys/memfd.h * linux/memfd.h defines additional flags */ #ifdef HAVE_SYS_MMAN_H -#include +# include #endif #ifdef HAVE_SYS_MEMFD_H -#include +# include #endif #ifdef HAVE_LINUX_MEMFD_H -#include +# include #endif #ifdef _Py_MEMORY_SANITIZER -# include +# include #endif #ifdef HAVE_FORK @@ -432,7 +545,7 @@ run_at_forkers(PyObject *lst, int reverse) for (i = 0; i < PyList_GET_SIZE(cpy); i++) { PyObject *func, *res; func = PyList_GET_ITEM(cpy, i); - res = PyObject_CallObject(func, NULL); + res = _PyObject_CallNoArg(func); if (res == NULL) PyErr_WriteUnraisable(func); else @@ -446,7 +559,7 @@ run_at_forkers(PyObject *lst, int reverse) void PyOS_BeforeFork(void) { - run_at_forkers(_PyInterpreterState_Get()->before_forkers, 1); + run_at_forkers(_PyInterpreterState_GET()->before_forkers, 1); _PyImport_AcquireLock(); } @@ -457,7 +570,7 @@ PyOS_AfterFork_Parent(void) if (_PyImport_ReleaseLock() <= 0) Py_FatalError("failed releasing import lock after fork"); - run_at_forkers(_PyInterpreterState_Get()->after_forkers_parent, 0); + run_at_forkers(_PyInterpreterState_GET()->after_forkers_parent, 0); } void @@ -471,7 +584,7 @@ PyOS_AfterFork_Child(void) _PyRuntimeState_ReInitThreads(runtime); _PyInterpreterState_DeleteExceptMain(runtime); - run_at_forkers(_PyInterpreterState_Get()->after_forkers_child, 0); + run_at_forkers(_PyInterpreterState_GET()->after_forkers_child, 0); } static int @@ -486,7 +599,8 @@ register_at_forker(PyObject **lst, PyObject *func) } return PyList_Append(*lst, func); } -#endif +#endif /* HAVE_FORK */ + /* Legacy wrapper */ void @@ -524,7 +638,7 @@ _PyLong_FromGid(gid_t gid) } int -_Py_Uid_Converter(PyObject *obj, void *p) +_Py_Uid_Converter(PyObject *obj, uid_t *p) { uid_t uid; PyObject *index; @@ -536,7 +650,7 @@ _Py_Uid_Converter(PyObject *obj, void *p) if (index == NULL) { PyErr_Format(PyExc_TypeError, "uid should be integer, not %.200s", - Py_TYPE(obj)->tp_name); + _PyType_Name(Py_TYPE(obj))); return 0; } @@ -611,7 +725,7 @@ _Py_Uid_Converter(PyObject *obj, void *p) success: Py_DECREF(index); - *(uid_t *)p = uid; + *p = uid; return 1; underflow: @@ -630,7 +744,7 @@ _Py_Uid_Converter(PyObject *obj, void *p) } int -_Py_Gid_Converter(PyObject *obj, void *p) +_Py_Gid_Converter(PyObject *obj, gid_t *p) { gid_t gid; PyObject *index; @@ -642,7 +756,7 @@ _Py_Gid_Converter(PyObject *obj, void *p) if (index == NULL) { PyErr_Format(PyExc_TypeError, "gid should be integer, not %.200s", - Py_TYPE(obj)->tp_name); + _PyType_Name(Py_TYPE(obj))); return 0; } @@ -718,7 +832,7 @@ _Py_Gid_Converter(PyObject *obj, void *p) success: Py_DECREF(index); - *(gid_t *)p = gid; + *p = gid; return 1; underflow: @@ -809,11 +923,40 @@ dir_fd_converter(PyObject *o, void *p) else { PyErr_Format(PyExc_TypeError, "argument should be integer or None, not %.200s", - Py_TYPE(o)->tp_name); + _PyType_Name(Py_TYPE(o))); return 0; } } +typedef struct { + PyObject *billion; + PyObject *DirEntryType; + PyObject *ScandirIteratorType; +#if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) + PyObject *SchedParamType; +#endif + PyObject *StatResultType; + PyObject *StatVFSResultType; + PyObject *TerminalSizeType; + PyObject *TimesResultType; + PyObject *UnameResultType; +#if defined(HAVE_WAITID) && !defined(__APPLE__) + PyObject *WaitidResultType; +#endif +#if defined(HAVE_WAIT3) || defined(HAVE_WAIT4) + PyObject *struct_rusage; +#endif + PyObject *st_mode; +} _posixstate; + + +static inline _posixstate* +get_posix_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_posixstate *)state; +} /* * A PyArg_ParseTuple "converter" function @@ -983,7 +1126,6 @@ path_converter(PyObject *o, void *p) if (!is_index && !is_buffer && !is_unicode && !is_bytes) { /* Inline PyOS_FSPath() for better error messages. */ - _Py_IDENTIFIER(__fspath__); PyObject *func, *res; func = _PyObject_LookupSpecial(o, &PyId___fspath__); @@ -1004,8 +1146,8 @@ path_converter(PyObject *o, void *p) else { PyErr_Format(PyExc_TypeError, "expected %.200s.__fspath__() to return str or bytes, " - "not %.200s", Py_TYPE(o)->tp_name, - Py_TYPE(res)->tp_name); + "not %.200s", _PyType_Name(Py_TYPE(o)), + _PyType_Name(Py_TYPE(res))); Py_DECREF(res); goto error_exit; } @@ -1057,7 +1199,7 @@ path_converter(PyObject *o, void *p) path->allow_fd ? "string, bytes, os.PathLike or integer" : path->nullable ? "string, bytes, os.PathLike or None" : "string, bytes or os.PathLike", - Py_TYPE(o)->tp_name)) { + _PyType_Name(Py_TYPE(o)))) { goto error_exit; } bytes = PyBytes_FromObject(o); @@ -1088,7 +1230,7 @@ path_converter(PyObject *o, void *p) path->allow_fd ? "string, bytes, os.PathLike or integer" : path->nullable ? "string, bytes, os.PathLike or None" : "string, bytes or os.PathLike", - Py_TYPE(o)->tp_name); + _PyType_Name(Py_TYPE(o))); goto error_exit; } @@ -2046,14 +2188,6 @@ static PyStructSequence_Desc waitid_result_desc = { waitid_result_fields, 5 }; -static PyTypeObject* WaitidResultType; -#endif - -static int initialized; -static PyTypeObject* StatResultType; -static PyTypeObject* StatVFSResultType; -#if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) -static PyTypeObject* SchedParamType; #endif static newfunc structseq_new; @@ -2079,11 +2213,64 @@ statresult_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return (PyObject*)result; } +static int +_posix_clear(PyObject *module) +{ + _posixstate *state = get_posix_state(module); + Py_CLEAR(state->billion); + Py_CLEAR(state->DirEntryType); + Py_CLEAR(state->ScandirIteratorType); +#if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) + Py_CLEAR(state->SchedParamType); +#endif + Py_CLEAR(state->StatResultType); + Py_CLEAR(state->StatVFSResultType); + Py_CLEAR(state->TerminalSizeType); + Py_CLEAR(state->TimesResultType); + Py_CLEAR(state->UnameResultType); +#if defined(HAVE_WAITID) && !defined(__APPLE__) + Py_CLEAR(state->WaitidResultType); +#endif +#if defined(HAVE_WAIT3) || defined(HAVE_WAIT4) + Py_CLEAR(state->struct_rusage); +#endif + Py_CLEAR(state->st_mode); + return 0; +} + +static int +_posix_traverse(PyObject *module, visitproc visit, void *arg) +{ + _posixstate *state = get_posix_state(module); + Py_VISIT(state->billion); + Py_VISIT(state->DirEntryType); + Py_VISIT(state->ScandirIteratorType); +#if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) + Py_VISIT(state->SchedParamType); +#endif + Py_VISIT(state->StatResultType); + Py_VISIT(state->StatVFSResultType); + Py_VISIT(state->TerminalSizeType); + Py_VISIT(state->TimesResultType); + Py_VISIT(state->UnameResultType); +#if defined(HAVE_WAITID) && !defined(__APPLE__) + Py_VISIT(state->WaitidResultType); +#endif +#if defined(HAVE_WAIT3) || defined(HAVE_WAIT4) + Py_VISIT(state->struct_rusage); +#endif + Py_VISIT(state->st_mode); + return 0; +} -static PyObject *billion = NULL; +static void +_posix_free(void *module) +{ + _posix_clear((PyObject *)module); +} static void -fill_time(PyObject *v, int index, time_t sec, unsigned long nsec) +fill_time(PyObject *module, PyObject *v, int index, time_t sec, unsigned long nsec) { PyObject *s = _PyLong_FromTime_t(sec); PyObject *ns_fractional = PyLong_FromUnsignedLong(nsec); @@ -2094,7 +2281,7 @@ fill_time(PyObject *v, int index, time_t sec, unsigned long nsec) if (!(s && ns_fractional)) goto exit; - s_in_ns = PyNumber_Multiply(s, billion); + s_in_ns = PyNumber_Multiply(s, get_posix_state(module)->billion); if (!s_in_ns) goto exit; @@ -2124,10 +2311,11 @@ fill_time(PyObject *v, int index, time_t sec, unsigned long nsec) /* pack a system stat C structure into the Python stat tuple (used by posix_stat() and posix_fstat()) */ static PyObject* -_pystat_fromstructstat(STRUCT_STAT *st) +_pystat_fromstructstat(PyObject *module, STRUCT_STAT *st) { unsigned long ansec, mnsec, cnsec; - PyObject *v = PyStructSequence_New(StatResultType); + PyObject *StatResultType = get_posix_state(module)->StatResultType; + PyObject *v = PyStructSequence_New((PyTypeObject *)StatResultType); if (v == NULL) return NULL; @@ -2165,9 +2353,9 @@ _pystat_fromstructstat(STRUCT_STAT *st) #else ansec = mnsec = cnsec = 0; #endif - fill_time(v, 7, st->st_atime, ansec); - fill_time(v, 8, st->st_mtime, mnsec); - fill_time(v, 9, st->st_ctime, cnsec); + fill_time(module, v, 7, st->st_atime, ansec); + fill_time(module, v, 8, st->st_mtime, mnsec); + fill_time(module, v, 9, st->st_ctime, cnsec); #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE PyStructSequence_SET_ITEM(v, ST_BLKSIZE_IDX, @@ -2229,12 +2417,16 @@ _pystat_fromstructstat(STRUCT_STAT *st) static PyObject * -posix_do_stat(const char *function_name, path_t *path, +posix_do_stat(PyObject *module, const char *function_name, path_t *path, int dir_fd, int follow_symlinks) { STRUCT_STAT st; int result; +#ifdef HAVE_FSTATAT + int fstatat_unavailable = 0; +#endif + #if !defined(MS_WINDOWS) && !defined(HAVE_FSTATAT) && !defined(HAVE_LSTAT) if (follow_symlinks_specified(function_name, follow_symlinks)) return NULL; @@ -2261,20 +2453,32 @@ posix_do_stat(const char *function_name, path_t *path, else #endif /* HAVE_LSTAT */ #ifdef HAVE_FSTATAT - if ((dir_fd != DEFAULT_DIR_FD) || !follow_symlinks) - result = fstatat(dir_fd, path->narrow, &st, + if ((dir_fd != DEFAULT_DIR_FD) || !follow_symlinks) { + if (HAVE_FSTATAT_RUNTIME) { + result = fstatat(dir_fd, path->narrow, &st, follow_symlinks ? 0 : AT_SYMLINK_NOFOLLOW); - else + + } else { + fstatat_unavailable = 1; + } + } else #endif /* HAVE_FSTATAT */ result = STAT(path->narrow, &st); #endif /* MS_WINDOWS */ Py_END_ALLOW_THREADS +#ifdef HAVE_FSTATAT + if (fstatat_unavailable) { + argument_unavailable_error("stat", "dir_fd"); + return NULL; + } +#endif + if (result != 0) { return path_error(path); } - return _pystat_fromstructstat(&st); + return _pystat_fromstructstat(module, &st); } /*[python input] @@ -2569,13 +2773,8 @@ class confstr_confname_converter(path_confname_converter): class sysconf_confname_converter(path_confname_converter): converter="conv_sysconf_confname" -class sched_param_converter(CConverter): - type = 'struct sched_param' - converter = 'convert_sched_param' - impl_by_reference = True; - [python start generated code]*/ -/*[python end generated code: output=da39a3ee5e6b4b0d input=418fce0e01144461]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=f1c8ae8d744f6c8b]*/ /*[clinic input] @@ -2612,7 +2811,7 @@ static PyObject * os_stat_impl(PyObject *module, path_t *path, int dir_fd, int follow_symlinks) /*[clinic end generated code: output=7d4976e6f18a59c5 input=01d362ebcc06996b]*/ { - return posix_do_stat("stat", path, dir_fd, follow_symlinks); + return posix_do_stat(module, "stat", path, dir_fd, follow_symlinks); } @@ -2636,7 +2835,7 @@ os_lstat_impl(PyObject *module, path_t *path, int dir_fd) /*[clinic end generated code: output=ef82a5d35ce8ab37 input=0b7474765927b925]*/ { int follow_symlinks = 0; - return posix_do_stat("lstat", path, dir_fd, follow_symlinks); + return posix_do_stat(module, "lstat", path, dir_fd, follow_symlinks); } @@ -2692,6 +2891,10 @@ os_access_impl(PyObject *module, path_t *path, int mode, int dir_fd, int result; #endif +#ifdef HAVE_FACCESSAT + int faccessat_unavailable = 0; +#endif + #ifndef HAVE_FACCESSAT if (follow_symlinks_specified("access", follow_symlinks)) return -1; @@ -2726,17 +2929,40 @@ os_access_impl(PyObject *module, path_t *path, int mode, int dir_fd, if ((dir_fd != DEFAULT_DIR_FD) || effective_ids || !follow_symlinks) { - int flags = 0; - if (!follow_symlinks) - flags |= AT_SYMLINK_NOFOLLOW; - if (effective_ids) - flags |= AT_EACCESS; - result = faccessat(dir_fd, path->narrow, mode, flags); + + if (HAVE_FACCESSAT_RUNTIME) { + int flags = 0; + if (!follow_symlinks) + flags |= AT_SYMLINK_NOFOLLOW; + if (effective_ids) + flags |= AT_EACCESS; + result = faccessat(dir_fd, path->narrow, mode, flags); + } else { + faccessat_unavailable = 1; + } } else #endif result = access(path->narrow, mode); Py_END_ALLOW_THREADS + +#ifdef HAVE_FACCESSAT + if (faccessat_unavailable) { + if (dir_fd != DEFAULT_DIR_FD) { + argument_unavailable_error("access", "dir_fd"); + return -1; + } + if (follow_symlinks_specified("access", follow_symlinks)) + return -1; + + if (effective_ids) { + argument_unavailable_error("access", "effective_ids"); + return -1; + } + /* should be unreachable */ + return -1; + } +#endif return_value = !result; #endif @@ -2773,13 +2999,24 @@ static PyObject * os_ttyname_impl(PyObject *module, int fd) /*[clinic end generated code: output=c424d2e9d1cd636a input=9ff5a58b08115c55]*/ { - char *ret; - ret = ttyname(fd); - if (ret == NULL) { + long size = sysconf(_SC_TTY_NAME_MAX); + if (size == -1) { + return posix_error(); + } + char *buffer = (char *)PyMem_RawMalloc(size); + if (buffer == NULL) { + return PyErr_NoMemory(); + } + int ret = ttyname_r(fd, buffer, size); + if (ret != 0) { + PyMem_RawFree(buffer); + errno = ret; return posix_error(); } - return PyUnicode_DecodeFSDefault(ret); + PyObject *res = PyUnicode_DecodeFSDefault(buffer); + PyMem_RawFree(buffer); + return res; } #endif @@ -2923,6 +3160,7 @@ os_chmod_impl(PyObject *module, path_t *path, int mode, int dir_fd, #ifdef HAVE_FCHMODAT int fchmodat_nofollow_unsupported = 0; + int fchmodat_unsupported = 0; #endif #if !(defined(HAVE_FCHMODAT) || defined(HAVE_LCHMOD)) @@ -2958,42 +3196,56 @@ os_chmod_impl(PyObject *module, path_t *path, int mode, int dir_fd, if (path->fd != -1) result = fchmod(path->fd, mode); else -#endif +#endif /* HAVE_CHMOD */ #ifdef HAVE_LCHMOD if ((!follow_symlinks) && (dir_fd == DEFAULT_DIR_FD)) result = lchmod(path->narrow, mode); else -#endif +#endif /* HAVE_LCHMOD */ #ifdef HAVE_FCHMODAT if ((dir_fd != DEFAULT_DIR_FD) || !follow_symlinks) { - /* - * fchmodat() doesn't currently support AT_SYMLINK_NOFOLLOW! - * The documentation specifically shows how to use it, - * and then says it isn't implemented yet. - * (true on linux with glibc 2.15, and openindiana 3.x) - * - * Once it is supported, os.chmod will automatically - * support dir_fd and follow_symlinks=False. (Hopefully.) - * Until then, we need to be careful what exception we raise. - */ - result = fchmodat(dir_fd, path->narrow, mode, - follow_symlinks ? 0 : AT_SYMLINK_NOFOLLOW); - /* - * But wait! We can't throw the exception without allowing threads, - * and we can't do that in this nested scope. (Macro trickery, sigh.) - */ - fchmodat_nofollow_unsupported = - result && - ((errno == ENOTSUP) || (errno == EOPNOTSUPP)) && - !follow_symlinks; + if (HAVE_FCHMODAT_RUNTIME) { + /* + * fchmodat() doesn't currently support AT_SYMLINK_NOFOLLOW! + * The documentation specifically shows how to use it, + * and then says it isn't implemented yet. + * (true on linux with glibc 2.15, and openindiana 3.x) + * + * Once it is supported, os.chmod will automatically + * support dir_fd and follow_symlinks=False. (Hopefully.) + * Until then, we need to be careful what exception we raise. + */ + result = fchmodat(dir_fd, path->narrow, mode, + follow_symlinks ? 0 : AT_SYMLINK_NOFOLLOW); + /* + * But wait! We can't throw the exception without allowing threads, + * and we can't do that in this nested scope. (Macro trickery, sigh.) + */ + fchmodat_nofollow_unsupported = + result && + ((errno == ENOTSUP) || (errno == EOPNOTSUPP)) && + !follow_symlinks; + } else { + fchmodat_unsupported = 1; + fchmodat_nofollow_unsupported = 1; + + result = -1; + } } else -#endif +#endif /* HAVE_FHCMODAT */ result = chmod(path->narrow, mode); Py_END_ALLOW_THREADS if (result) { #ifdef HAVE_FCHMODAT + if (fchmodat_unsupported) { + if (dir_fd != DEFAULT_DIR_FD) { + argument_unavailable_error("chmod", "dir_fd"); + return NULL; + } + } + if (fchmodat_nofollow_unsupported) { if (dir_fd != DEFAULT_DIR_FD) dir_fd_and_follow_symlinks_invalid("chmod", @@ -3003,10 +3255,10 @@ os_chmod_impl(PyObject *module, path_t *path, int mode, int dir_fd, return NULL; } else -#endif +#endif /* HAVE_FCHMODAT */ return path_error(path); } -#endif +#endif /* MS_WINDOWS */ Py_RETURN_NONE; } @@ -3294,6 +3546,10 @@ os_chown_impl(PyObject *module, path_t *path, uid_t uid, gid_t gid, { int result; +#if defined(HAVE_FCHOWNAT) + int fchownat_unsupported = 0; +#endif + #if !(defined(HAVE_LCHOWN) || defined(HAVE_FCHOWNAT)) if (follow_symlinks_specified("chown", follow_symlinks)) return NULL; @@ -3302,19 +3558,6 @@ os_chown_impl(PyObject *module, path_t *path, uid_t uid, gid_t gid, fd_and_follow_symlinks_invalid("chown", path->fd, follow_symlinks)) return NULL; -#ifdef __APPLE__ - /* - * This is for Mac OS X 10.3, which doesn't have lchown. - * (But we still have an lchown symbol because of weak-linking.) - * It doesn't have fchownat either. So there's no possibility - * of a graceful failover. - */ - if ((!follow_symlinks) && (lchown == NULL)) { - follow_symlinks_specified("chown", follow_symlinks); - return NULL; - } -#endif - if (PySys_Audit("os.chown", "OIIi", path->object, uid, gid, dir_fd == DEFAULT_DIR_FD ? -1 : dir_fd) < 0) { return NULL; @@ -3332,14 +3575,28 @@ os_chown_impl(PyObject *module, path_t *path, uid_t uid, gid_t gid, else #endif #ifdef HAVE_FCHOWNAT - if ((dir_fd != DEFAULT_DIR_FD) || (!follow_symlinks)) + if ((dir_fd != DEFAULT_DIR_FD) || (!follow_symlinks)) { + if (HAVE_FCHOWNAT_RUNTIME) { result = fchownat(dir_fd, path->narrow, uid, gid, follow_symlinks ? 0 : AT_SYMLINK_NOFOLLOW); - else + } else { + fchownat_unsupported = 1; + } + } else #endif result = chown(path->narrow, uid, gid); Py_END_ALLOW_THREADS +#ifdef HAVE_FCHOWNAT + if (fchownat_unsupported) { + /* This would be incorrect if the current platform + * doesn't support lchown. + */ + argument_unavailable_error(NULL, "dir_fd"); + return NULL; + } +#endif + if (result) return path_error(path); @@ -3585,6 +3842,9 @@ os_link_impl(PyObject *module, path_t *src, path_t *dst, int src_dir_fd, #else int result; #endif +#if defined(HAVE_LINKAT) + int linkat_unavailable = 0; +#endif #ifndef HAVE_LINKAT if ((src_dir_fd != DEFAULT_DIR_FD) || (dst_dir_fd != DEFAULT_DIR_FD)) { @@ -3619,15 +3879,43 @@ os_link_impl(PyObject *module, path_t *src, path_t *dst, int src_dir_fd, #ifdef HAVE_LINKAT if ((src_dir_fd != DEFAULT_DIR_FD) || (dst_dir_fd != DEFAULT_DIR_FD) || - (!follow_symlinks)) - result = linkat(src_dir_fd, src->narrow, - dst_dir_fd, dst->narrow, - follow_symlinks ? AT_SYMLINK_FOLLOW : 0); + (!follow_symlinks)) { + + if (HAVE_LINKAT_RUNTIME) { + + result = linkat(src_dir_fd, src->narrow, + dst_dir_fd, dst->narrow, + follow_symlinks ? AT_SYMLINK_FOLLOW : 0); + + } +#ifdef __APPLE__ + else { + if (src_dir_fd == DEFAULT_DIR_FD && dst_dir_fd == DEFAULT_DIR_FD) { + /* See issue 41355: This matches the behaviour of !HAVE_LINKAT */ + result = link(src->narrow, dst->narrow); + } else { + linkat_unavailable = 1; + } + } +#endif + } else #endif /* HAVE_LINKAT */ result = link(src->narrow, dst->narrow); Py_END_ALLOW_THREADS +#ifdef HAVE_LINKAT + if (linkat_unavailable) { + /* Either or both dir_fd arguments were specified */ + if (src_dir_fd != DEFAULT_DIR_FD) { + argument_unavailable_error("link", "src_dir_fd"); + } else { + argument_unavailable_error("link", "dst_dir_fd"); + } + return NULL; + } +#endif + if (result) return path_error2(src, dst); #endif /* MS_WINDOWS */ @@ -3750,6 +4038,7 @@ _posix_listdir(path_t *path, PyObject *list) errno = 0; #ifdef HAVE_FDOPENDIR if (path->fd != -1) { + if (HAVE_FDOPENDIR_RUNTIME) { /* closedir() closes the FD, so we duplicate it */ fd = _Py_dup(path->fd); if (fd == -1) @@ -3760,6 +4049,11 @@ _posix_listdir(path_t *path, PyObject *list) Py_BEGIN_ALLOW_THREADS dirp = fdopendir(fd); Py_END_ALLOW_THREADS + } else { + PyErr_SetString(PyExc_TypeError, + "listdir: path should be string, bytes, os.PathLike or None, not int"); + return NULL; + } } else #endif @@ -3894,34 +4188,30 @@ static PyObject * os__getfullpathname_impl(PyObject *module, path_t *path) /*[clinic end generated code: output=bb8679d56845bc9b input=332ed537c29d0a3e]*/ { - wchar_t woutbuf[MAX_PATH], *woutbufp = woutbuf; - wchar_t *wtemp; - DWORD result; - PyObject *v; + wchar_t *abspath; - result = GetFullPathNameW(path->wide, - Py_ARRAY_LENGTH(woutbuf), - woutbuf, &wtemp); - if (result > Py_ARRAY_LENGTH(woutbuf)) { - woutbufp = PyMem_New(wchar_t, result); - if (!woutbufp) - return PyErr_NoMemory(); - result = GetFullPathNameW(path->wide, result, woutbufp, &wtemp); + /* _Py_abspath() is implemented with GetFullPathNameW() on Windows */ + if (_Py_abspath(path->wide, &abspath) < 0) { + return win32_error_object("GetFullPathNameW", path->object); + } + if (abspath == NULL) { + return PyErr_NoMemory(); } - if (result) { - v = PyUnicode_FromWideChar(woutbufp, wcslen(woutbufp)); - if (path->narrow) - Py_SETREF(v, PyUnicode_EncodeFSDefault(v)); - } else - v = win32_error_object("GetFullPathNameW", path->object); - if (woutbufp != woutbuf) - PyMem_Free(woutbufp); - return v; -} - -/*[clinic input] -os._getfinalpathname + PyObject *str = PyUnicode_FromWideChar(abspath, wcslen(abspath)); + PyMem_RawFree(abspath); + if (str == NULL) { + return NULL; + } + if (path->narrow) { + Py_SETREF(str, PyUnicode_EncodeFSDefault(str)); + } + return str; +} + + +/*[clinic input] +os._getfinalpathname path: path_t / @@ -4077,6 +4367,9 @@ os_mkdir_impl(PyObject *module, path_t *path, int mode, int dir_fd) /*[clinic end generated code: output=a70446903abe821f input=e965f68377e9b1ce]*/ { int result; +#ifdef HAVE_MKDIRAT + int mkdirat_unavailable = 0; +#endif if (PySys_Audit("os.mkdir", "Oii", path->object, mode, dir_fd == DEFAULT_DIR_FD ? -1 : dir_fd) < 0) { @@ -4093,9 +4386,14 @@ os_mkdir_impl(PyObject *module, path_t *path, int mode, int dir_fd) #else Py_BEGIN_ALLOW_THREADS #if HAVE_MKDIRAT - if (dir_fd != DEFAULT_DIR_FD) + if (dir_fd != DEFAULT_DIR_FD) { + if (HAVE_MKDIRAT_RUNTIME) { result = mkdirat(dir_fd, path->narrow, mode); - else + + } else { + mkdirat_unavailable = 1; + } + } else #endif #if defined(__WATCOMC__) && !defined(__QNX__) result = mkdir(path->narrow); @@ -4103,6 +4401,14 @@ os_mkdir_impl(PyObject *module, path_t *path, int mode, int dir_fd) result = mkdir(path->narrow, mode); #endif Py_END_ALLOW_THREADS + +#if HAVE_MKDIRAT + if (mkdirat_unavailable) { + argument_unavailable_error(NULL, "dir_fd"); + return NULL; + } +#endif + if (result < 0) return path_error(path); #endif /* MS_WINDOWS */ @@ -4212,6 +4518,10 @@ internal_rename(path_t *src, path_t *dst, int src_dir_fd, int dst_dir_fd, int is const char *function_name = is_replace ? "replace" : "rename"; int dir_fd_specified; +#ifdef HAVE_RENAMEAT + int renameat_unavailable = 0; +#endif + #ifdef MS_WINDOWS BOOL result; int flags = is_replace ? MOVEFILE_REPLACE_EXISTING : 0; @@ -4251,13 +4561,25 @@ internal_rename(path_t *src, path_t *dst, int src_dir_fd, int dst_dir_fd, int is Py_BEGIN_ALLOW_THREADS #ifdef HAVE_RENAMEAT - if (dir_fd_specified) - result = renameat(src_dir_fd, src->narrow, dst_dir_fd, dst->narrow); - else + if (dir_fd_specified) { + if (HAVE_RENAMEAT_RUNTIME) { + result = renameat(src_dir_fd, src->narrow, dst_dir_fd, dst->narrow); + } else { + renameat_unavailable = 1; + } + } else #endif result = rename(src->narrow, dst->narrow); Py_END_ALLOW_THREADS + +#ifdef HAVE_RENAMEAT + if (renameat_unavailable) { + argument_unavailable_error(function_name, "src_dir_fd and dst_dir_fd"); + return NULL; + } +#endif + if (result) return path_error2(src, dst); #endif @@ -4333,6 +4655,9 @@ os_rmdir_impl(PyObject *module, path_t *path, int dir_fd) /*[clinic end generated code: output=080eb54f506e8301 input=38c8b375ca34a7e2]*/ { int result; +#ifdef HAVE_UNLINKAT + int unlinkat_unavailable = 0; +#endif if (PySys_Audit("os.rmdir", "Oi", path->object, dir_fd == DEFAULT_DIR_FD ? -1 : dir_fd) < 0) { @@ -4345,14 +4670,26 @@ os_rmdir_impl(PyObject *module, path_t *path, int dir_fd) result = !RemoveDirectoryW(path->wide); #else #ifdef HAVE_UNLINKAT - if (dir_fd != DEFAULT_DIR_FD) + if (dir_fd != DEFAULT_DIR_FD) { + if (HAVE_UNLINKAT_RUNTIME) { result = unlinkat(dir_fd, path->narrow, AT_REMOVEDIR); - else + } else { + unlinkat_unavailable = 1; + result = -1; + } + } else #endif result = rmdir(path->narrow); #endif Py_END_ALLOW_THREADS +#ifdef HAVE_UNLINKAT + if (unlinkat_unavailable) { + argument_unavailable_error("rmdir", "dir_fd"); + return NULL; + } +#endif + if (result) return path_error(path); @@ -4496,6 +4833,9 @@ os_unlink_impl(PyObject *module, path_t *path, int dir_fd) /*[clinic end generated code: output=621797807b9963b1 input=d7bcde2b1b2a2552]*/ { int result; +#ifdef HAVE_UNLINKAT + int unlinkat_unavailable = 0; +#endif if (PySys_Audit("os.remove", "Oi", path->object, dir_fd == DEFAULT_DIR_FD ? -1 : dir_fd) < 0) { @@ -4509,15 +4849,27 @@ os_unlink_impl(PyObject *module, path_t *path, int dir_fd) result = !Py_DeleteFileW(path->wide); #else #ifdef HAVE_UNLINKAT - if (dir_fd != DEFAULT_DIR_FD) + if (dir_fd != DEFAULT_DIR_FD) { + if (HAVE_UNLINKAT_RUNTIME) { + result = unlinkat(dir_fd, path->narrow, 0); - else + } else { + unlinkat_unavailable = 1; + } + } else #endif /* HAVE_UNLINKAT */ result = unlink(path->narrow); #endif _Py_END_SUPPRESS_IPH Py_END_ALLOW_THREADS +#ifdef HAVE_UNLINKAT + if (unlinkat_unavailable) { + argument_unavailable_error(NULL, "dir_fd"); + return NULL; + } +#endif + if (result) return path_error(path); @@ -4562,15 +4914,12 @@ or via the attributes sysname, nodename, release, version, and machine.\n\ See os.uname for more information."); static PyStructSequence_Desc uname_result_desc = { - "uname_result", /* name */ + MODNAME ".uname_result", /* name */ uname_result__doc__, /* doc */ uname_result_fields, 5 }; -static PyTypeObject* UnameResultType; - - #ifdef HAVE_UNAME /*[clinic input] os.uname @@ -4596,7 +4945,8 @@ os_uname_impl(PyObject *module) if (res < 0) return posix_error(); - value = PyStructSequence_New(UnameResultType); + PyObject *UnameResultType = get_posix_state(module)->UnameResultType; + value = PyStructSequence_New((PyTypeObject *)UnameResultType); if (value == NULL) return NULL; @@ -4690,7 +5040,16 @@ typedef struct { static int utime_dir_fd(utime_t *ut, int dir_fd, const char *path, int follow_symlinks) { -#ifdef HAVE_UTIMENSAT +#if defined(__APPLE__) && defined(HAVE_UTIMENSAT) + if (HAVE_UTIMENSAT_RUNTIME) { + int flags = follow_symlinks ? 0 : AT_SYMLINK_NOFOLLOW; + UTIME_TO_TIMESPEC; + return utimensat(dir_fd, path, time, flags); + } else { + errno = ENOSYS; + return -1; + } +#elif defined(HAVE_UTIMENSAT) int flags = follow_symlinks ? 0 : AT_SYMLINK_NOFOLLOW; UTIME_TO_TIMESPEC; return utimensat(dir_fd, path, time, flags); @@ -4717,11 +5076,30 @@ static int utime_fd(utime_t *ut, int fd) { #ifdef HAVE_FUTIMENS + + if (HAVE_FUTIMENS_RUNTIME) { + UTIME_TO_TIMESPEC; return futimens(fd, time); -#else + + } else +#ifndef HAVE_FUTIMES + { + /* Not sure if this can happen */ + PyErr_SetString( + PyExc_RuntimeError, + "neither futimens nor futimes are supported" + " on this system"); + return -1; + } +#endif + +#endif +#ifdef HAVE_FUTIMES + { UTIME_TO_TIMEVAL; return futimes(fd, time); + } #endif } @@ -4740,11 +5118,27 @@ static int utime_nofollow_symlinks(utime_t *ut, const char *path) { #ifdef HAVE_UTIMENSAT - UTIME_TO_TIMESPEC; - return utimensat(DEFAULT_DIR_FD, path, time, AT_SYMLINK_NOFOLLOW); -#else + if (HAVE_UTIMENSAT_RUNTIME) { + UTIME_TO_TIMESPEC; + return utimensat(DEFAULT_DIR_FD, path, time, AT_SYMLINK_NOFOLLOW); + } else +#ifndef HAVE_LUTIMES + { + /* Not sure if this can happen */ + PyErr_SetString( + PyExc_RuntimeError, + "neither utimensat nor lutimes are supported" + " on this system"); + return -1; + } +#endif +#endif + +#ifdef HAVE_LUTIMES + { UTIME_TO_TIMEVAL; return lutimes(path, time); + } #endif } @@ -4755,7 +5149,15 @@ utime_nofollow_symlinks(utime_t *ut, const char *path) static int utime_default(utime_t *ut, const char *path) { -#ifdef HAVE_UTIMENSAT +#if defined(__APPLE__) && defined(HAVE_UTIMENSAT) + if (HAVE_UTIMENSAT_RUNTIME) { + UTIME_TO_TIMESPEC; + return utimensat(DEFAULT_DIR_FD, path, time, 0); + } else { + UTIME_TO_TIMEVAL; + return utimes(path, time); + } +#elif defined(HAVE_UTIMENSAT) UTIME_TO_TIMESPEC; return utimensat(DEFAULT_DIR_FD, path, time, 0); #elif defined(HAVE_UTIMES) @@ -4773,17 +5175,17 @@ utime_default(utime_t *ut, const char *path) #endif static int -split_py_long_to_s_and_ns(PyObject *py_long, time_t *s, long *ns) +split_py_long_to_s_and_ns(PyObject *module, PyObject *py_long, time_t *s, long *ns) { int result = 0; PyObject *divmod; - divmod = PyNumber_Divmod(py_long, billion); + divmod = PyNumber_Divmod(py_long, get_posix_state(module)->billion); if (!divmod) goto exit; if (!PyTuple_Check(divmod) || PyTuple_GET_SIZE(divmod) != 2) { PyErr_Format(PyExc_TypeError, "%.200s.__divmod__() must return a 2-tuple, not %.200s", - Py_TYPE(py_long)->tp_name, Py_TYPE(divmod)->tp_name); + _PyType_Name(Py_TYPE(py_long)), _PyType_Name(Py_TYPE(divmod))); goto exit; } *s = _PyLong_AsTime_t(PyTuple_GET_ITEM(divmod, 0)); @@ -4889,9 +5291,9 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns, return NULL; } utime.now = 0; - if (!split_py_long_to_s_and_ns(PyTuple_GET_ITEM(ns, 0), + if (!split_py_long_to_s_and_ns(module, PyTuple_GET_ITEM(ns, 0), &utime.atime_s, &utime.atime_ns) || - !split_py_long_to_s_and_ns(PyTuple_GET_ITEM(ns, 1), + !split_py_long_to_s_and_ns(module, PyTuple_GET_ITEM(ns, 1), &utime.mtime_s, &utime.mtime_ns)) { return NULL; } @@ -4964,9 +5366,10 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns, #endif #if defined(HAVE_FUTIMESAT) || defined(HAVE_UTIMENSAT) - if ((dir_fd != DEFAULT_DIR_FD) || (!follow_symlinks)) + if ((dir_fd != DEFAULT_DIR_FD) || (!follow_symlinks)) { result = utime_dir_fd(&utime, dir_fd, path->narrow, follow_symlinks); - else + + } else #endif #if defined(HAVE_FUTIMES) || defined(HAVE_FUTIMENS) @@ -4979,6 +5382,14 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns, Py_END_ALLOW_THREADS +#if defined(__APPLE__) && defined(HAVE_UTIMENSAT) + /* See utime_dir_fd implementation */ + if (result == -1 && errno == ENOSYS) { + argument_unavailable_error(NULL, "dir_fd"); + return NULL; + } +#endif + if (result < 0) { /* see previous comment about not putting filename in error here */ posix_error(); @@ -5342,11 +5753,11 @@ enum posix_spawn_file_actions_identifier { #if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) static int -convert_sched_param(PyObject *param, struct sched_param *res); +convert_sched_param(PyObject *module, PyObject *param, struct sched_param *res); #endif static int -parse_posix_spawn_flags(const char *func_name, PyObject *setpgroup, +parse_posix_spawn_flags(PyObject *module, const char *func_name, PyObject *setpgroup, int resetids, int setsid, PyObject *setsigmask, PyObject *setsigdef, PyObject *scheduler, posix_spawnattr_t *attrp) @@ -5377,6 +5788,9 @@ parse_posix_spawn_flags(const char *func_name, PyObject *setpgroup, } if (setsid) { +#ifdef HAVE_POSIX_SPAWN_SETSID_RUNTIME + if (HAVE_POSIX_SPAWN_SETSID_RUNTIME) { +#endif #ifdef POSIX_SPAWN_SETSID all_flags |= POSIX_SPAWN_SETSID; #elif defined(POSIX_SPAWN_SETSID_NP) @@ -5385,6 +5799,14 @@ parse_posix_spawn_flags(const char *func_name, PyObject *setpgroup, argument_unavailable_error(func_name, "setsid"); return -1; #endif + +#ifdef HAVE_POSIX_SPAWN_SETSID_RUNTIME + } else { + argument_unavailable_error(func_name, "setsid"); + return -1; + } +#endif /* HAVE_POSIX_SPAWN_SETSID_RUNTIME */ + } if (setsigmask) { @@ -5416,11 +5838,15 @@ parse_posix_spawn_flags(const char *func_name, PyObject *setpgroup, if (scheduler) { #ifdef POSIX_SPAWN_SETSCHEDULER PyObject *py_schedpolicy; + PyObject *schedparam_obj; struct sched_param schedparam; - if (!PyArg_ParseTuple(scheduler, "OO&" + if (!PyArg_ParseTuple(scheduler, "OO" ";A scheduler tuple must have two elements", - &py_schedpolicy, convert_sched_param, &schedparam)) { + &py_schedpolicy, &schedparam_obj)) { + goto fail; + } + if (!convert_sched_param(module, schedparam_obj, &schedparam)) { goto fail; } if (py_schedpolicy != Py_None) { @@ -5649,7 +6075,7 @@ py_posix_spawn(int use_posix_spawnp, PyObject *module, path_t *path, PyObject *a file_actionsp = &file_actions_buf; } - if (parse_posix_spawn_flags(func_name, setpgroup, resetids, setsid, + if (parse_posix_spawn_flags(module, func_name, setpgroup, resetids, setsid, setsigmask, setsigdef, scheduler, &attr)) { goto exit; } @@ -6059,7 +6485,7 @@ check_null_or_callable(PyObject *obj, const char* obj_name) { if (obj && !PyCallable_Check(obj)) { PyErr_Format(PyExc_TypeError, "'%s' must be callable, not %s", - obj_name, Py_TYPE(obj)->tp_name); + obj_name, _PyType_Name(Py_TYPE(obj))); return -1; } return 0; @@ -6099,7 +6525,7 @@ os_register_at_fork_impl(PyObject *module, PyObject *before, check_null_or_callable(after_in_parent, "after_in_parent")) { return NULL; } - interp = _PyInterpreterState_Get(); + interp = _PyInterpreterState_GET(); if (register_at_forker(&interp->before_forkers, before)) { return NULL; @@ -6130,7 +6556,7 @@ os_fork1_impl(PyObject *module) { pid_t pid; - if (_PyInterpreterState_Get() != PyInterpreterState_Main()) { + if (_PyInterpreterState_GET() != PyInterpreterState_Main()) { PyErr_SetString(PyExc_RuntimeError, "fork not supported for subinterpreters"); return NULL; } @@ -6164,9 +6590,10 @@ os_fork_impl(PyObject *module) /*[clinic end generated code: output=3626c81f98985d49 input=13c956413110eeaa]*/ { pid_t pid; - - if (_PyInterpreterState_Get() != PyInterpreterState_Main()) { - PyErr_SetString(PyExc_RuntimeError, "fork not supported for subinterpreters"); + PyInterpreterState *interp = _PyInterpreterState_GET(); + if (interp->config._isolated_interpreter) { + PyErr_SetString(PyExc_RuntimeError, + "fork not supported for isolated subinterpreters"); return NULL; } if (PySys_Audit("os.fork", NULL) < 0) { @@ -6237,14 +6664,14 @@ os.sched_getscheduler pid: pid_t / -Get the scheduling policy for the process identifiedy by pid. +Get the scheduling policy for the process identified by pid. Passing 0 for pid returns the scheduling policy for the calling process. [clinic start generated code]*/ static PyObject * os_sched_getscheduler_impl(PyObject *module, pid_t pid) -/*[clinic end generated code: output=dce4c0bd3f1b34c8 input=5f14cfd1f189e1a0]*/ +/*[clinic end generated code: output=dce4c0bd3f1b34c8 input=8d99dac505485ac8]*/ { int policy; @@ -6266,12 +6693,12 @@ os.sched_param.__new__ sched_priority: object A scheduling parameter. -Current has only one field: sched_priority"); +Currently has only one field: sched_priority [clinic start generated code]*/ static PyObject * os_sched_param_impl(PyTypeObject *type, PyObject *sched_priority) -/*[clinic end generated code: output=48f4067d60f48c13 input=ab4de35a9a7811f2]*/ +/*[clinic end generated code: output=48f4067d60f48c13 input=eb42909a2c0e3e6c]*/ { PyObject *res; @@ -6283,7 +6710,6 @@ os_sched_param_impl(PyTypeObject *type, PyObject *sched_priority) return res; } - PyDoc_VAR(os_sched_param__doc__); static PyStructSequence_Field sched_param_fields[] = { @@ -6299,11 +6725,11 @@ static PyStructSequence_Desc sched_param_desc = { }; static int -convert_sched_param(PyObject *param, struct sched_param *res) +convert_sched_param(PyObject *module, PyObject *param, struct sched_param *res) { long priority; - if (Py_TYPE(param) != SchedParamType) { + if (!Py_IS_TYPE(param, (PyTypeObject *)get_posix_state(module)->SchedParamType)) { PyErr_SetString(PyExc_TypeError, "must have a sched_param object"); return 0; } @@ -6326,7 +6752,7 @@ os.sched_setscheduler pid: pid_t policy: int - param: sched_param + param as param_obj: object / Set the scheduling policy for the process identified by pid. @@ -6337,15 +6763,20 @@ param is an instance of sched_param. static PyObject * os_sched_setscheduler_impl(PyObject *module, pid_t pid, int policy, - struct sched_param *param) -/*[clinic end generated code: output=b0ac0a70d3b1d705 input=c581f9469a5327dd]*/ + PyObject *param_obj) +/*[clinic end generated code: output=cde27faa55dc993e input=73013d731bd8fbe9]*/ { + struct sched_param param; + if (!convert_sched_param(module, param_obj, ¶m)) { + return NULL; + } + /* ** sched_setscheduler() returns 0 in Linux, but the previous ** scheduling policy under Solaris/Illumos, and others. ** On error, -1 is returned in all Operating Systems. */ - if (sched_setscheduler(pid, policy, param) == -1) + if (sched_setscheduler(pid, policy, ¶m) == -1) return posix_error(); Py_RETURN_NONE; } @@ -6374,7 +6805,8 @@ os_sched_getparam_impl(PyObject *module, pid_t pid) if (sched_getparam(pid, ¶m)) return posix_error(); - result = PyStructSequence_New(SchedParamType); + PyObject *SchedParamType = get_posix_state(module)->SchedParamType; + result = PyStructSequence_New((PyTypeObject *)SchedParamType); if (!result) return NULL; priority = PyLong_FromLong(param.sched_priority); @@ -6390,7 +6822,7 @@ os_sched_getparam_impl(PyObject *module, pid_t pid) /*[clinic input] os.sched_setparam pid: pid_t - param: sched_param + param as param_obj: object / Set scheduling parameters for the process identified by pid. @@ -6400,11 +6832,15 @@ param should be an instance of sched_param. [clinic start generated code]*/ static PyObject * -os_sched_setparam_impl(PyObject *module, pid_t pid, - struct sched_param *param) -/*[clinic end generated code: output=8af013f78a32b591 input=6b8d6dfcecdc21bd]*/ +os_sched_setparam_impl(PyObject *module, pid_t pid, PyObject *param_obj) +/*[clinic end generated code: output=f19fe020a53741c1 input=27b98337c8b2dcc7]*/ { - if (sched_setparam(pid, param)) + struct sched_param param; + if (!convert_sched_param(module, param_obj, ¶m)) { + return NULL; + } + + if (sched_setparam(pid, ¶m)) return posix_error(); Py_RETURN_NONE; } @@ -6773,7 +7209,7 @@ os_forkpty_impl(PyObject *module) int master_fd = -1; pid_t pid; - if (_PyInterpreterState_Get() != PyInterpreterState_Main()) { + if (_PyInterpreterState_GET() != PyInterpreterState_Main()) { PyErr_SetString(PyExc_RuntimeError, "fork not supported for subinterpreters"); return NULL; } @@ -6868,23 +7304,46 @@ os_getpid_impl(PyObject *module) #ifdef HAVE_GETGROUPLIST -/* AC 3.5: funny apple logic below */ -PyDoc_STRVAR(posix_getgrouplist__doc__, -"getgrouplist(user, group) -> list of groups to which a user belongs\n\n\ -Returns a list of groups to which a user belongs.\n\n\ - user: username to lookup\n\ - group: base group id of the user"); +#ifdef __APPLE__ +/*[clinic input] +os.getgrouplist + + user: str + username to lookup + group as basegid: int + base group id of the user + / + +Returns a list of groups to which a user belongs. +[clinic start generated code]*/ + +static PyObject * +os_getgrouplist_impl(PyObject *module, const char *user, int basegid) +/*[clinic end generated code: output=6e734697b8c26de0 input=f8d870374b09a490]*/ +#else +/*[clinic input] +os.getgrouplist + + user: str + username to lookup + group as basegid: gid_t + base group id of the user + / + +Returns a list of groups to which a user belongs. +[clinic start generated code]*/ static PyObject * -posix_getgrouplist(PyObject *self, PyObject *args) +os_getgrouplist_impl(PyObject *module, const char *user, gid_t basegid) +/*[clinic end generated code: output=0ebd7fb70115575b input=cc61d5c20b08958d]*/ +#endif { - const char *user; int i, ngroups; PyObject *list; #ifdef __APPLE__ - int *groups, basegid; + int *groups; #else - gid_t *groups, basegid; + gid_t *groups; #endif /* @@ -6897,15 +7356,6 @@ posix_getgrouplist(PyObject *self, PyObject *args) */ ngroups = 1 + MAX_GROUPS; -#ifdef __APPLE__ - if (!PyArg_ParseTuple(args, "si:getgrouplist", &user, &basegid)) - return NULL; -#else - if (!PyArg_ParseTuple(args, "sO&:getgrouplist", &user, - _Py_Gid_Converter, &basegid)) - return NULL; -#endif - while (1) { #ifdef __APPLE__ groups = PyMem_New(int, ngroups); @@ -7076,40 +7526,47 @@ os_getgroups_impl(PyObject *module) #endif /* HAVE_GETGROUPS */ #ifdef HAVE_INITGROUPS -PyDoc_STRVAR(posix_initgroups__doc__, -"initgroups(username, gid) -> None\n\n\ -Call the system initgroups() to initialize the group access list with all of\n\ -the groups of which the specified username is a member, plus the specified\n\ -group id."); +#ifdef __APPLE__ +/*[clinic input] +os.initgroups + + username as oname: FSConverter + gid: int + / + +Initialize the group access list. + +Call the system initgroups() to initialize the group access list with all of +the groups of which the specified username is a member, plus the specified +group id. +[clinic start generated code]*/ -/* AC 3.5: funny apple logic */ static PyObject * -posix_initgroups(PyObject *self, PyObject *args) -{ - PyObject *oname; - const char *username; - int res; -#ifdef __APPLE__ - int gid; +os_initgroups_impl(PyObject *module, PyObject *oname, int gid) +/*[clinic end generated code: output=7f074d30a425fd3a input=df3d54331b0af204]*/ #else - gid_t gid; -#endif +/*[clinic input] +os.initgroups -#ifdef __APPLE__ - if (!PyArg_ParseTuple(args, "O&i:initgroups", - PyUnicode_FSConverter, &oname, - &gid)) -#else - if (!PyArg_ParseTuple(args, "O&O&:initgroups", - PyUnicode_FSConverter, &oname, - _Py_Gid_Converter, &gid)) + username as oname: FSConverter + gid: gid_t + / + +Initialize the group access list. + +Call the system initgroups() to initialize the group access list with all of +the groups of which the specified username is a member, plus the specified +group id. +[clinic start generated code]*/ + +static PyObject * +os_initgroups_impl(PyObject *module, PyObject *oname, gid_t gid) +/*[clinic end generated code: output=59341244521a9e3f input=0cb91bdc59a4c564]*/ #endif - return NULL; - username = PyBytes_AS_STRING(oname); +{ + const char *username = PyBytes_AS_STRING(oname); - res = initgroups(username, gid); - Py_DECREF(oname); - if (res == -1) + if (initgroups(username, gid) == -1) return PyErr_SetFromErrno(PyExc_OSError); Py_RETURN_NONE; @@ -7609,27 +8066,31 @@ os_setgroups(PyObject *module, PyObject *groups) #if defined(HAVE_WAIT3) || defined(HAVE_WAIT4) static PyObject * -wait_helper(pid_t pid, int status, struct rusage *ru) +wait_helper(PyObject *module, pid_t pid, int status, struct rusage *ru) { PyObject *result; - static PyObject *struct_rusage; - _Py_IDENTIFIER(struct_rusage); + PyObject *struct_rusage; if (pid == -1) return posix_error(); - if (struct_rusage == NULL) { - PyObject *m = PyImport_ImportModuleNoBlock("resource"); - if (m == NULL) - return NULL; - struct_rusage = _PyObject_GetAttrId(m, &PyId_struct_rusage); - Py_DECREF(m); - if (struct_rusage == NULL) - return NULL; + // If wait succeeded but no child was ready to report status, ru will not + // have been populated. + if (pid == 0) { + memset(ru, 0, sizeof(*ru)); } + PyObject *m = PyImport_ImportModuleNoBlock("resource"); + if (m == NULL) + return NULL; + struct_rusage = PyObject_GetAttr(m, get_posix_state(module)->struct_rusage); + Py_DECREF(m); + if (struct_rusage == NULL) + return NULL; + /* XXX(nnorwitz): Copied (w/mods) from resource.c, there should be only one. */ result = PyStructSequence_New((PyTypeObject*) struct_rusage); + Py_DECREF(struct_rusage); if (!result) return NULL; @@ -7698,7 +8159,7 @@ os_wait3_impl(PyObject *module, int options) if (pid < 0) return (!async_err) ? posix_error() : NULL; - return wait_helper(pid, WAIT_STATUS_INT(status), &ru); + return wait_helper(module, pid, WAIT_STATUS_INT(status), &ru); } #endif /* HAVE_WAIT3 */ @@ -7735,7 +8196,7 @@ os_wait4_impl(PyObject *module, pid_t pid, int options) if (res < 0) return (!async_err) ? posix_error() : NULL; - return wait_helper(res, WAIT_STATUS_INT(status), &ru); + return wait_helper(module, res, WAIT_STATUS_INT(status), &ru); } #endif /* HAVE_WAIT4 */ @@ -7780,7 +8241,8 @@ os_waitid_impl(PyObject *module, idtype_t idtype, id_t id, int options) if (si.si_pid == 0) Py_RETURN_NONE; - result = PyStructSequence_New(WaitidResultType); + PyObject *WaitidResultType = get_posix_state(module)->WaitidResultType; + result = PyStructSequence_New((PyTypeObject *)WaitidResultType); if (!result) return NULL; @@ -7906,6 +8368,30 @@ os_wait_impl(PyObject *module) } #endif /* HAVE_WAIT */ +#if defined(__linux__) && defined(__NR_pidfd_open) +/*[clinic input] +os.pidfd_open + pid: pid_t + flags: unsigned_int = 0 + +Return a file descriptor referring to the process *pid*. + +The descriptor can be used to perform process management without races and +signals. +[clinic start generated code]*/ + +static PyObject * +os_pidfd_open_impl(PyObject *module, pid_t pid, unsigned int flags) +/*[clinic end generated code: output=5c7252698947dc41 input=c3fd99ce947ccfef]*/ +{ + int fd = syscall(__NR_pidfd_open, pid, flags); + if (fd < 0) { + return posix_error(); + } + return PyLong_FromLong(fd); +} +#endif + #if defined(HAVE_READLINK) || defined(MS_WINDOWS) /*[clinic input] @@ -7931,16 +8417,30 @@ os_readlink_impl(PyObject *module, path_t *path, int dir_fd) #if defined(HAVE_READLINK) char buffer[MAXPATHLEN+1]; ssize_t length; +#ifdef HAVE_READLINKAT + int readlinkat_unavailable = 0; +#endif Py_BEGIN_ALLOW_THREADS #ifdef HAVE_READLINKAT - if (dir_fd != DEFAULT_DIR_FD) - length = readlinkat(dir_fd, path->narrow, buffer, MAXPATHLEN); - else + if (dir_fd != DEFAULT_DIR_FD) { + if (HAVE_READLINKAT_RUNTIME) { + length = readlinkat(dir_fd, path->narrow, buffer, MAXPATHLEN); + } else { + readlinkat_unavailable = 1; + } + } else #endif length = readlink(path->narrow, buffer, MAXPATHLEN); Py_END_ALLOW_THREADS +#ifdef HAVE_READLINKAT + if (readlinkat_unavailable) { + argument_unavailable_error(NULL, "dir_fd"); + return NULL; + } +#endif + if (length < 0) { return path_error(path); } @@ -8136,6 +8636,9 @@ os_symlink_impl(PyObject *module, path_t *src, path_t *dst, static int windows_has_symlink_unprivileged_flag = TRUE; #else int result; +#ifdef HAVE_SYMLINKAT + int symlinkat_unavailable = 0; +#endif #endif if (PySys_Audit("os.symlink", "OOi", src->object, dst->object, @@ -8198,14 +8701,25 @@ os_symlink_impl(PyObject *module, path_t *src, path_t *dst, } Py_BEGIN_ALLOW_THREADS -#if HAVE_SYMLINKAT - if (dir_fd != DEFAULT_DIR_FD) - result = symlinkat(src->narrow, dir_fd, dst->narrow); - else +#ifdef HAVE_SYMLINKAT + if (dir_fd != DEFAULT_DIR_FD) { + if (HAVE_SYMLINKAT_RUNTIME) { + result = symlinkat(src->narrow, dir_fd, dst->narrow); + } else { + symlinkat_unavailable = 1; + } + } else #endif result = symlink(src->narrow, dst->narrow); Py_END_ALLOW_THREADS +#ifdef HAVE_SYMLINKAT + if (symlinkat_unavailable) { + argument_unavailable_error(NULL, "dir_fd"); + return NULL; + } +#endif + if (result) return path_error2(src, dst); #endif @@ -8242,8 +8756,6 @@ static PyStructSequence_Desc times_result_desc = { 5 }; -static PyTypeObject* TimesResultType; - #ifdef MS_WINDOWS #define HAVE_TIMES /* mandatory, for the method table */ #endif @@ -8251,11 +8763,12 @@ static PyTypeObject* TimesResultType; #ifdef HAVE_TIMES static PyObject * -build_times_result(double user, double system, +build_times_result(PyObject *module, double user, double system, double children_user, double children_system, double elapsed) { - PyObject *value = PyStructSequence_New(TimesResultType); + PyObject *TimesResultType = get_posix_state(module)->TimesResultType; + PyObject *value = PyStructSequence_New((PyTypeObject *)TimesResultType); if (value == NULL) return NULL; @@ -8310,7 +8823,7 @@ os_times_impl(PyObject *module) 1e7 is one second in such units; 1e-7 the inverse. 429.4967296 is 2**32 / 1e7 or 2**32 * 1e-7. */ - return build_times_result( + return build_times_result(module, (double)(user.dwHighDateTime*429.4967296 + user.dwLowDateTime*1e-7), (double)(kernel.dwHighDateTime*429.4967296 + @@ -8329,7 +8842,7 @@ os_times_impl(PyObject *module) c = times(&t); if (c == (clock_t) -1) return posix_error(); - return build_times_result( + return build_times_result(module, (double)t.tms_utime / ticks_per_second, (double)t.tms_stime / ticks_per_second, (double)t.tms_cutime / ticks_per_second, @@ -8477,6 +8990,9 @@ os_open_impl(PyObject *module, path_t *path, int flags, int mode, int dir_fd) { int fd; int async_err = 0; +#ifdef HAVE_OPENAT + int openat_unavailable = 0; +#endif #ifdef O_CLOEXEC int *atomic_flag_works = &_Py_open_cloexec_works; @@ -8501,9 +9017,15 @@ os_open_impl(PyObject *module, path_t *path, int flags, int mode, int dir_fd) fd = _wopen(path->wide, flags, mode); #else #ifdef HAVE_OPENAT - if (dir_fd != DEFAULT_DIR_FD) - fd = openat(dir_fd, path->narrow, flags, mode); - else + if (dir_fd != DEFAULT_DIR_FD) { + if (HAVE_OPENAT_RUNTIME) { + fd = openat(dir_fd, path->narrow, flags, mode); + + } else { + openat_unavailable = 1; + fd = -1; + } + } else #endif /* HAVE_OPENAT */ fd = open(path->narrow, flags, mode); #endif /* !MS_WINDOWS */ @@ -8511,6 +9033,13 @@ os_open_impl(PyObject *module, path_t *path, int flags, int mode, int dir_fd) } while (fd < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); _Py_END_SUPPRESS_IPH +#ifdef HAVE_OPENAT + if (openat_unavailable) { + argument_unavailable_error(NULL, "dir_fd"); + return -1; + } +#endif + if (fd < 0) { if (!async_err) PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, path->object); @@ -8563,10 +9092,13 @@ _fdwalk_close_func(void *lohi, int fd) int lo = ((int *)lohi)[0]; int hi = ((int *)lohi)[1]; - if (fd >= hi) + if (fd >= hi) { return 1; - else if (fd >= lo) - close(fd); + } + else if (fd >= lo) { + /* Ignore errors */ + (void)close(fd); + } return 0; } #endif /* HAVE_FDWALK */ @@ -8587,8 +9119,6 @@ os_closerange_impl(PyObject *module, int fd_low, int fd_high) { #ifdef HAVE_FDWALK int lohi[2]; -#else - int i; #endif Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH @@ -8597,8 +9127,20 @@ os_closerange_impl(PyObject *module, int fd_low, int fd_high) lohi[1] = fd_high; fdwalk(_fdwalk_close_func, lohi); #else - for (i = Py_MAX(fd_low, 0); i < fd_high; i++) - close(i); + fd_low = Py_MAX(fd_low, 0); +#ifdef __FreeBSD__ + if (fd_high >= sysconf(_SC_OPEN_MAX)) { + /* Any errors encountered while closing file descriptors are ignored */ + closefrom(fd_low); + } + else +#endif + { + for (int i = fd_low; i < fd_high; i++) { + /* Ignore errors */ + (void)close(i); + } + } #endif _Py_END_SUPPRESS_IPH Py_END_ALLOW_THREADS @@ -8965,11 +9507,10 @@ os_readv_impl(PyObject *module, int fd, PyObject *buffers) #ifdef HAVE_PREAD /*[clinic input] -# TODO length should be size_t! but Python doesn't support parsing size_t yet. os.pread fd: int - length: int + length: Py_ssize_t offset: Py_off_t / @@ -8980,8 +9521,8 @@ the beginning of the file. The file offset remains unchanged. [clinic start generated code]*/ static PyObject * -os_pread_impl(PyObject *module, int fd, int length, Py_off_t offset) -/*[clinic end generated code: output=435b29ee32b54a78 input=084948dcbaa35d4c]*/ +os_pread_impl(PyObject *module, int fd, Py_ssize_t length, Py_off_t offset) +/*[clinic end generated code: output=3f875c1eef82e32f input=85cb4a5589627144]*/ { Py_ssize_t n; int async_err = 0; @@ -9081,12 +9622,25 @@ os_preadv_impl(PyObject *module, int fd, PyObject *buffers, Py_off_t offset, } while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); #else do { +#ifdef __APPLE__ +/* This entire function will be removed from the module dict when the API + * is not available. + */ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability" +#pragma clang diagnostic ignored "-Wunguarded-availability-new" +#endif Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH n = preadv(fd, iov, cnt, offset); _Py_END_SUPPRESS_IPH Py_END_ALLOW_THREADS } while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); + +#ifdef __APPLE__ +#pragma clang diagnostic pop +#endif + #endif iov_cleanup(iov, buf, cnt); @@ -9120,47 +9674,77 @@ os_write_impl(PyObject *module, int fd, Py_buffer *data) } #ifdef HAVE_SENDFILE -PyDoc_STRVAR(posix_sendfile__doc__, -"sendfile(out, in, offset, count) -> byteswritten\n\ -sendfile(out, in, offset, count[, headers][, trailers], flags=0)\n\ - -> byteswritten\n\ -Copy count bytes from file descriptor in to file descriptor out."); +#ifdef __APPLE__ +/*[clinic input] +os.sendfile -/* AC 3.5: don't bother converting, has optional group*/ -static PyObject * -posix_sendfile(PyObject *self, PyObject *args, PyObject *kwdict) -{ - int in, out; - Py_ssize_t ret; - int async_err = 0; - off_t offset; + out_fd: int + in_fd: int + offset: Py_off_t + count as sbytes: Py_off_t + headers: object(c_default="NULL") = () + trailers: object(c_default="NULL") = () + flags: int = 0 -#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__APPLE__) -#ifndef __APPLE__ - Py_ssize_t len; +Copy count bytes from file descriptor in_fd to file descriptor out_fd. +[clinic start generated code]*/ + +static PyObject * +os_sendfile_impl(PyObject *module, int out_fd, int in_fd, Py_off_t offset, + Py_off_t sbytes, PyObject *headers, PyObject *trailers, + int flags) +/*[clinic end generated code: output=81c4bcd143f5c82b input=b0d72579d4c69afa]*/ +#elif defined(__FreeBSD__) || defined(__DragonFly__) +/*[clinic input] +os.sendfile + + out_fd: int + in_fd: int + offset: Py_off_t + count: Py_ssize_t + headers: object(c_default="NULL") = () + trailers: object(c_default="NULL") = () + flags: int = 0 + +Copy count bytes from file descriptor in_fd to file descriptor out_fd. +[clinic start generated code]*/ + +static PyObject * +os_sendfile_impl(PyObject *module, int out_fd, int in_fd, Py_off_t offset, + Py_ssize_t count, PyObject *headers, PyObject *trailers, + int flags) +/*[clinic end generated code: output=329ea009bdd55afc input=338adb8ff84ae8cd]*/ +#else +/*[clinic input] +os.sendfile + + out_fd: int + in_fd: int + offset as offobj: object + count: Py_ssize_t + +Copy count bytes from file descriptor in_fd to file descriptor out_fd. +[clinic start generated code]*/ + +static PyObject * +os_sendfile_impl(PyObject *module, int out_fd, int in_fd, PyObject *offobj, + Py_ssize_t count) +/*[clinic end generated code: output=ae81216e40f167d8 input=76d64058c74477ba]*/ #endif - PyObject *headers = NULL, *trailers = NULL; - Py_buffer *hbuf, *tbuf; +{ + Py_ssize_t ret; + int async_err = 0; + +#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__APPLE__) +#ifndef __APPLE__ off_t sbytes; +#endif + Py_buffer *hbuf, *tbuf; struct sf_hdtr sf; - int flags = 0; - /* Beware that "in" clashes with Python's own "in" operator keyword */ - static char *keywords[] = {"out", "in", - "offset", "count", - "headers", "trailers", "flags", NULL}; sf.headers = NULL; sf.trailers = NULL; -#ifdef __APPLE__ - if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iiO&O&|OOi:sendfile", - keywords, &out, &in, Py_off_t_converter, &offset, Py_off_t_converter, &sbytes, -#else - if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iiO&n|OOi:sendfile", - keywords, &out, &in, Py_off_t_converter, &offset, &len, -#endif - &headers, &trailers, &flags)) - return NULL; if (headers != NULL) { if (!PySequence_Check(headers)) { PyErr_SetString(PyExc_TypeError, @@ -9222,9 +9806,9 @@ posix_sendfile(PyObject *self, PyObject *args, PyObject *kwdict) do { Py_BEGIN_ALLOW_THREADS #ifdef __APPLE__ - ret = sendfile(in, out, offset, &sbytes, &sf, flags); + ret = sendfile(in_fd, out_fd, offset, &sbytes, &sf, flags); #else - ret = sendfile(in, out, offset, len, &sf, &sbytes, flags); + ret = sendfile(in_fd, out_fd, offset, count, &sf, &sbytes, flags); #endif Py_END_ALLOW_THREADS } while (ret < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); @@ -9259,18 +9843,11 @@ posix_sendfile(PyObject *self, PyObject *args, PyObject *kwdict) #endif #else - Py_ssize_t count; - PyObject *offobj; - static char *keywords[] = {"out", "in", - "offset", "count", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iiOn:sendfile", - keywords, &out, &in, &offobj, &count)) - return NULL; #ifdef __linux__ if (offobj == Py_None) { do { Py_BEGIN_ALLOW_THREADS - ret = sendfile(out, in, NULL, count); + ret = sendfile(out_fd, in_fd, NULL, count); Py_END_ALLOW_THREADS } while (ret < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); if (ret < 0) @@ -9278,12 +9855,46 @@ posix_sendfile(PyObject *self, PyObject *args, PyObject *kwdict) return Py_BuildValue("n", ret); } #endif + off_t offset; if (!Py_off_t_converter(offobj, &offset)) return NULL; +#if defined(__sun) && defined(__SVR4) + // On Solaris, sendfile raises EINVAL rather than returning 0 + // when the offset is equal or bigger than the in_fd size. + struct stat st; + + do { + Py_BEGIN_ALLOW_THREADS + ret = fstat(in_fd, &st); + Py_END_ALLOW_THREADS + } while (ret != 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); + if (ret < 0) + return (!async_err) ? posix_error() : NULL; + + if (offset >= st.st_size) { + return Py_BuildValue("i", 0); + } + + // On illumos specifically sendfile() may perform a partial write but + // return -1/an error (in one confirmed case the destination socket + // had a 5 second timeout set and errno was EAGAIN) and it's on the client + // code to check if the offset parameter was modified by sendfile(). + // + // We need this variable to track said change. + off_t original_offset = offset; +#endif + do { Py_BEGIN_ALLOW_THREADS - ret = sendfile(out, in, &offset, count); + ret = sendfile(out_fd, in_fd, &offset, count); +#if defined(__sun) && defined(__SVR4) + // This handles illumos-specific sendfile() partial write behavior, + // see a comment above for more details. + if (ret < 0 && offset != original_offset) { + ret = offset - original_offset; + } +#endif Py_END_ALLOW_THREADS } while (ret < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); if (ret < 0) @@ -9298,8 +9909,8 @@ posix_sendfile(PyObject *self, PyObject *args, PyObject *kwdict) /*[clinic input] os._fcopyfile - infd: int - outfd: int + in_fd: int + out_fd: int flags: int / @@ -9307,13 +9918,13 @@ Efficiently copy content or metadata of 2 regular file descriptors (macOS). [clinic start generated code]*/ static PyObject * -os__fcopyfile_impl(PyObject *module, int infd, int outfd, int flags) -/*[clinic end generated code: output=8e8885c721ec38e3 input=69e0770e600cb44f]*/ +os__fcopyfile_impl(PyObject *module, int in_fd, int out_fd, int flags) +/*[clinic end generated code: output=c9d1a35a992e401b input=1e34638a86948795]*/ { int ret; Py_BEGIN_ALLOW_THREADS - ret = fcopyfile(infd, outfd, NULL, flags); + ret = fcopyfile(in_fd, out_fd, NULL, flags); Py_END_ALLOW_THREADS if (ret < 0) return posix_error(); @@ -9354,7 +9965,7 @@ os_fstat_impl(PyObject *module, int fd) #endif } - return _pystat_fromstructstat(&st); + return _pystat_fromstructstat(module, &st); } @@ -9651,6 +10262,15 @@ os_pwritev_impl(PyObject *module, int fd, PyObject *buffers, Py_off_t offset, Py_END_ALLOW_THREADS } while (result < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); #else + +#ifdef __APPLE__ +/* This entire function will be removed from the module dict when the API + * is not available. + */ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability" +#pragma clang diagnostic ignored "-Wunguarded-availability-new" +#endif do { Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH @@ -9658,6 +10278,11 @@ os_pwritev_impl(PyObject *module, int fd, PyObject *buffers, Py_off_t offset, _Py_END_SUPPRESS_IPH Py_END_ALLOW_THREADS } while (result < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); + +#ifdef __APPLE__ +#pragma clang diagnostic pop +#endif + #endif iov_cleanup(iov, buf, cnt); @@ -10080,45 +10705,11 @@ os_posix_fadvise_impl(PyObject *module, int fd, Py_off_t offset, } #endif /* HAVE_POSIX_FADVISE && !POSIX_FADVISE_AIX_BUG */ -#ifdef HAVE_PUTENV - -/* Save putenv() parameters as values here, so we can collect them when they - * get re-set with another call for the same key. */ -static PyObject *posix_putenv_garbage; - -static void -posix_putenv_garbage_setitem(PyObject *name, PyObject *value) -{ - /* Install the first arg and newstr in posix_putenv_garbage; - * this will cause previous value to be collected. This has to - * happen after the real putenv() call because the old value - * was still accessible until then. */ - if (PyDict_SetItem(posix_putenv_garbage, name, value)) - /* really not much we can do; just leak */ - PyErr_Clear(); - else - Py_DECREF(value); -} - #ifdef MS_WINDOWS -/*[clinic input] -os.putenv - - name: unicode - value: unicode - / - -Change or add an environment variable. -[clinic start generated code]*/ - -static PyObject * -os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) -/*[clinic end generated code: output=d29a567d6b2327d2 input=ba586581c2e6105f]*/ +static PyObject* +win32_putenv(PyObject *name, PyObject *value) { - const wchar_t *env; - Py_ssize_t size; - /* Search from index 1 because on Windows starting '=' is allowed for defining hidden environment variables. */ if (PyUnicode_GET_LENGTH(name) == 0 || @@ -10127,38 +10718,73 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) PyErr_SetString(PyExc_ValueError, "illegal environment variable name"); return NULL; } - PyObject *unicode = PyUnicode_FromFormat("%U=%U", name, value); + PyObject *unicode; + if (value != NULL) { + unicode = PyUnicode_FromFormat("%U=%U", name, value); + } + else { + unicode = PyUnicode_FromFormat("%U=", name); + } if (unicode == NULL) { return NULL; } - env = PyUnicode_AsUnicodeAndSize(unicode, &size); - if (env == NULL) - goto error; + Py_ssize_t size; + /* PyUnicode_AsWideCharString() rejects embedded null characters */ + wchar_t *env = PyUnicode_AsWideCharString(unicode, &size); + Py_DECREF(unicode); + + if (env == NULL) { + return NULL; + } if (size > _MAX_ENV) { PyErr_Format(PyExc_ValueError, "the environment variable is longer than %u characters", _MAX_ENV); - goto error; - } - if (wcslen(env) != (size_t)size) { - PyErr_SetString(PyExc_ValueError, "embedded null character"); - goto error; + PyMem_Free(env); + return NULL; } - if (_wputenv(env)) { + /* _wputenv() and SetEnvironmentVariableW() update the environment in the + Process Environment Block (PEB). _wputenv() also updates CRT 'environ' + and '_wenviron' variables, whereas SetEnvironmentVariableW() does not. + + Prefer _wputenv() to be compatible with C libraries using CRT + variables and CRT functions using these variables (ex: getenv()). */ + int err = _wputenv(env); + PyMem_Free(env); + + if (err) { posix_error(); - goto error; + return NULL; } - posix_putenv_garbage_setitem(name, unicode); Py_RETURN_NONE; +} +#endif -error: - Py_DECREF(unicode); - return NULL; + +#ifdef MS_WINDOWS +/*[clinic input] +os.putenv + + name: unicode + value: unicode + / + +Change or add an environment variable. +[clinic start generated code]*/ + +static PyObject * +os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) +/*[clinic end generated code: output=d29a567d6b2327d2 input=ba586581c2e6105f]*/ +{ + if (PySys_Audit("os.putenv", "OO", name, value) < 0) { + return NULL; + } + return win32_putenv(name, value); } -#else /* MS_WINDOWS */ +#else /*[clinic input] os.putenv @@ -10173,8 +10799,6 @@ static PyObject * os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) /*[clinic end generated code: output=d29a567d6b2327d2 input=a97bc6152f688d31]*/ { - PyObject *bytes = NULL; - char *env; const char *name_string = PyBytes_AS_STRING(name); const char *value_string = PyBytes_AS_STRING(value); @@ -10182,28 +10806,38 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) PyErr_SetString(PyExc_ValueError, "illegal environment variable name"); return NULL; } + if (PySys_Audit("os.putenv", "OO", name, value) < 0) { return NULL; } - bytes = PyBytes_FromFormat("%s=%s", name_string, value_string); - if (bytes == NULL) { - return NULL; - } - env = PyBytes_AS_STRING(bytes); - if (putenv(env)) { - Py_DECREF(bytes); + if (setenv(name_string, value_string, 1)) { return posix_error(); } - - posix_putenv_garbage_setitem(name, bytes); Py_RETURN_NONE; } -#endif /* MS_WINDOWS */ -#endif /* HAVE_PUTENV */ +#endif /* !defined(MS_WINDOWS) */ -#ifdef HAVE_UNSETENV +#ifdef MS_WINDOWS +/*[clinic input] +os.unsetenv + name: unicode + / + +Delete an environment variable. +[clinic start generated code]*/ + +static PyObject * +os_unsetenv_impl(PyObject *module, PyObject *name) +/*[clinic end generated code: output=54c4137ab1834f02 input=4d6a1747cc526d2f]*/ +{ + if (PySys_Audit("os.unsetenv", "(O)", name) < 0) { + return NULL; + } + return win32_putenv(name, NULL); +} +#else /*[clinic input] os.unsetenv name: FSConverter @@ -10216,37 +10850,21 @@ static PyObject * os_unsetenv_impl(PyObject *module, PyObject *name) /*[clinic end generated code: output=54c4137ab1834f02 input=2bb5288a599c7107]*/ { -#ifndef HAVE_BROKEN_UNSETENV - int err; -#endif - if (PySys_Audit("os.unsetenv", "(O)", name) < 0) { return NULL; } - #ifdef HAVE_BROKEN_UNSETENV unsetenv(PyBytes_AS_STRING(name)); #else - err = unsetenv(PyBytes_AS_STRING(name)); - if (err) + int err = unsetenv(PyBytes_AS_STRING(name)); + if (err) { return posix_error(); + } #endif - /* Remove the key from posix_putenv_garbage; - * this will cause it to be collected. This has to - * happen after the real unsetenv() call because the - * old value was still accessible until then. - */ - if (PyDict_DelItem(posix_putenv_garbage, name)) { - /* really not much we can do; just leak */ - if (!PyErr_ExceptionMatches(PyExc_KeyError)) { - return NULL; - } - PyErr_Clear(); - } Py_RETURN_NONE; } -#endif /* HAVE_UNSETENV */ +#endif /* !MS_WINDOWS */ /*[clinic input] @@ -10447,8 +11065,9 @@ os_WSTOPSIG_impl(PyObject *module, int status) #include static PyObject* -_pystatvfs_fromstructstatvfs(struct statvfs st) { - PyObject *v = PyStructSequence_New(StatVFSResultType); +_pystatvfs_fromstructstatvfs(PyObject *module, struct statvfs st) { + PyObject *StatVFSResultType = get_posix_state(module)->StatVFSResultType; + PyObject *v = PyStructSequence_New((PyTypeObject *)StatVFSResultType); if (v == NULL) return NULL; @@ -10524,7 +11143,7 @@ os_fstatvfs_impl(PyObject *module, int fd) if (result != 0) return (!async_err) ? posix_error() : NULL; - return _pystatvfs_fromstructstatvfs(st); + return _pystatvfs_fromstructstatvfs(module, st); } #endif /* defined(HAVE_FSTATVFS) && defined(HAVE_SYS_STATVFS_H) */ @@ -10553,13 +11172,6 @@ os_statvfs_impl(PyObject *module, path_t *path) Py_BEGIN_ALLOW_THREADS #ifdef HAVE_FSTATVFS if (path->fd != -1) { -#ifdef __APPLE__ - /* handle weak-linking on Mac OS X 10.3 */ - if (fstatvfs == NULL) { - fd_specified("statvfs", path->fd); - return NULL; - } -#endif result = fstatvfs(path->fd, &st); } else @@ -10571,7 +11183,7 @@ os_statvfs_impl(PyObject *module, path_t *path) return path_error(path); } - return _pystatvfs_fromstructstatvfs(st); + return _pystatvfs_fromstructstatvfs(module, st); } #endif /* defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H) */ @@ -11325,6 +11937,9 @@ static struct constdef posix_constants_sysconf[] = { #ifdef _SC_PAGE_SIZE {"SC_PAGE_SIZE", _SC_PAGE_SIZE}, #endif +#ifdef _SC_AIX_REALMEM + {"SC_AIX_REALMEM", _SC_AIX_REALMEM}, +#endif #ifdef _SC_PASS_MAX {"SC_PASS_MAX", _SC_PASS_MAX}, #endif @@ -12247,8 +12862,6 @@ os_memfd_create_impl(PyObject *module, PyObject *name, unsigned int flags) /* Terminal size querying */ -static PyTypeObject* TerminalSizeType; - PyDoc_STRVAR(TerminalSize_docstring, "A tuple of (columns, lines) for holding terminal window size"); @@ -12266,29 +12879,34 @@ static PyStructSequence_Desc TerminalSize_desc = { }; #if defined(TERMSIZE_USE_CONIO) || defined(TERMSIZE_USE_IOCTL) -/* AC 3.5: fd should accept None */ -PyDoc_STRVAR(termsize__doc__, - "Return the size of the terminal window as (columns, lines).\n" \ - "\n" \ - "The optional argument fd (default standard output) specifies\n" \ - "which file descriptor should be queried.\n" \ - "\n" \ - "If the file descriptor is not connected to a terminal, an OSError\n" \ - "is thrown.\n" \ - "\n" \ - "This function will only be defined if an implementation is\n" \ - "available for this system.\n" \ - "\n" \ - "shutil.get_terminal_size is the high-level function which should\n" \ - "normally be used, os.get_terminal_size is the low-level implementation."); +/*[clinic input] +os.get_terminal_size -static PyObject* -get_terminal_size(PyObject *self, PyObject *args) + fd: int(c_default="fileno(stdout)", py_default="") = -1 + / + +Return the size of the terminal window as (columns, lines). + +The optional argument fd (default standard output) specifies +which file descriptor should be queried. + +If the file descriptor is not connected to a terminal, an OSError +is thrown. + +This function will only be defined if an implementation is +available for this system. + +shutil.get_terminal_size is the high-level function which should +normally be used, os.get_terminal_size is the low-level implementation. +[clinic start generated code]*/ + +static PyObject * +os_get_terminal_size_impl(PyObject *module, int fd) +/*[clinic end generated code: output=fbab93acef980508 input=ead5679b82ddb920]*/ { int columns, lines; PyObject *termsize; - int fd = fileno(stdout); /* Under some conditions stdout may not be connected and * fileno(stdout) may point to an invalid file descriptor. For example * GUI apps don't have valid standard streams by default. @@ -12297,9 +12915,6 @@ get_terminal_size(PyObject *self, PyObject *args) * the ioctl below will fail returning EBADF. This is what we want. */ - if (!PyArg_ParseTuple(args, "|i", &fd)) - return NULL; - #ifdef TERMSIZE_USE_IOCTL { struct winsize w; @@ -12339,7 +12954,8 @@ get_terminal_size(PyObject *self, PyObject *args) } #endif /* TERMSIZE_USE_CONIO */ - termsize = PyStructSequence_New(TerminalSizeType); + PyObject *TerminalSizeType = get_posix_state(module)->TerminalSizeType; + termsize = PyStructSequence_New((PyTypeObject *)TerminalSizeType); if (termsize == NULL) return NULL; PyStructSequence_SET_ITEM(termsize, 0, PyLong_FromLong(columns)); @@ -12369,8 +12985,6 @@ os_cpu_count_impl(PyObject *module) { int ncpu = 0; #ifdef MS_WINDOWS - /* Declare prototype here to avoid pulling in all of the Win7 APIs in 3.8 */ - DWORD WINAPI GetActiveProcessorCount(WORD group); ncpu = GetActiveProcessorCount(ALL_PROCESSOR_GROUPS); #elif defined(__hpux) ncpu = mpctl(MPC_GETNUMSPUS, NULL, NULL); @@ -12539,9 +13153,9 @@ os_set_blocking_impl(PyObject *module, int fd, int blocking) /*[clinic input] -class os.DirEntry "DirEntry *" "&DirEntryType" +class os.DirEntry "DirEntry *" "DirEntryType" [clinic start generated code]*/ -/*[clinic end generated code: output=da39a3ee5e6b4b0d input=3138f09f7c683f1d]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=3c18c7a448247980]*/ typedef struct { PyObject_HEAD @@ -12562,29 +13176,43 @@ typedef struct { #endif } DirEntry; +static PyObject * +_disabled_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) +{ + PyErr_Format(PyExc_TypeError, + "cannot create '%.100s' instances", _PyType_Name(type)); + return NULL; +} + static void DirEntry_dealloc(DirEntry *entry) { + PyTypeObject *tp = Py_TYPE(entry); Py_XDECREF(entry->name); Py_XDECREF(entry->path); Py_XDECREF(entry->stat); Py_XDECREF(entry->lstat); - Py_TYPE(entry)->tp_free((PyObject *)entry); + freefunc free_func = PyType_GetSlot(tp, Py_tp_free); + free_func(entry); + Py_DECREF(tp); } /* Forward reference */ static int -DirEntry_test_mode(DirEntry *self, int follow_symlinks, unsigned short mode_bits); +DirEntry_test_mode(PyTypeObject *defining_class, DirEntry *self, + int follow_symlinks, unsigned short mode_bits); /*[clinic input] os.DirEntry.is_symlink -> bool + defining_class: defining_class + / Return True if the entry is a symbolic link; cached per entry. [clinic start generated code]*/ static int -os_DirEntry_is_symlink_impl(DirEntry *self) -/*[clinic end generated code: output=42244667d7bcfc25 input=1605a1b4b96976c3]*/ +os_DirEntry_is_symlink_impl(DirEntry *self, PyTypeObject *defining_class) +/*[clinic end generated code: output=293096d589b6d47c input=e9acc5ee4d511113]*/ { #ifdef MS_WINDOWS return (self->win32_lstat.st_mode & S_IFMT) == S_IFLNK; @@ -12593,15 +13221,15 @@ os_DirEntry_is_symlink_impl(DirEntry *self) if (self->d_type != DT_UNKNOWN) return self->d_type == DT_LNK; else - return DirEntry_test_mode(self, 0, S_IFLNK); + return DirEntry_test_mode(defining_class, self, 0, S_IFLNK); #else /* POSIX without d_type */ - return DirEntry_test_mode(self, 0, S_IFLNK); + return DirEntry_test_mode(defining_class, self, 0, S_IFLNK); #endif } static PyObject * -DirEntry_fetch_stat(DirEntry *self, int follow_symlinks) +DirEntry_fetch_stat(PyObject *module, DirEntry *self, int follow_symlinks) { int result; STRUCT_STAT st; @@ -12617,12 +13245,17 @@ DirEntry_fetch_stat(DirEntry *self, int follow_symlinks) const char *path = PyBytes_AS_STRING(ub); if (self->dir_fd != DEFAULT_DIR_FD) { #ifdef HAVE_FSTATAT + if (HAVE_FSTATAT_RUNTIME) { result = fstatat(self->dir_fd, path, &st, follow_symlinks ? 0 : AT_SYMLINK_NOFOLLOW); -#else + } else + +#endif /* HAVE_FSTATAT */ + { + Py_DECREF(ub); PyErr_SetString(PyExc_NotImplementedError, "can't fetch stat"); return NULL; -#endif /* HAVE_FSTATAT */ + } } else #endif @@ -12637,17 +13270,18 @@ DirEntry_fetch_stat(DirEntry *self, int follow_symlinks) if (result != 0) return path_object_error(self->path); - return _pystat_fromstructstat(&st); + return _pystat_fromstructstat(module, &st); } static PyObject * -DirEntry_get_lstat(DirEntry *self) +DirEntry_get_lstat(PyTypeObject *defining_class, DirEntry *self) { if (!self->lstat) { + PyObject *module = PyType_GetModule(defining_class); #ifdef MS_WINDOWS - self->lstat = _pystat_fromstructstat(&self->win32_lstat); + self->lstat = _pystat_fromstructstat(module, &self->win32_lstat); #else /* POSIX */ - self->lstat = DirEntry_fetch_stat(self, 0); + self->lstat = DirEntry_fetch_stat(module, self, 0); #endif } Py_XINCREF(self->lstat); @@ -12656,6 +13290,8 @@ DirEntry_get_lstat(DirEntry *self) /*[clinic input] os.DirEntry.stat + defining_class: defining_class + / * follow_symlinks: bool = True @@ -12663,20 +13299,26 @@ Return stat_result object for the entry; cached per entry. [clinic start generated code]*/ static PyObject * -os_DirEntry_stat_impl(DirEntry *self, int follow_symlinks) -/*[clinic end generated code: output=008593b3a6d01305 input=280d14c1d6f1d00d]*/ +os_DirEntry_stat_impl(DirEntry *self, PyTypeObject *defining_class, + int follow_symlinks) +/*[clinic end generated code: output=23f803e19c3e780e input=e816273c4e67ee98]*/ { - if (!follow_symlinks) - return DirEntry_get_lstat(self); + if (!follow_symlinks) { + return DirEntry_get_lstat(defining_class, self); + } if (!self->stat) { - int result = os_DirEntry_is_symlink_impl(self); - if (result == -1) + int result = os_DirEntry_is_symlink_impl(self, defining_class); + if (result == -1) { return NULL; - else if (result) - self->stat = DirEntry_fetch_stat(self, 1); - else - self->stat = DirEntry_get_lstat(self); + } + if (result) { + PyObject *module = PyType_GetModule(defining_class); + self->stat = DirEntry_fetch_stat(module, self, 1); + } + else { + self->stat = DirEntry_get_lstat(defining_class, self); + } } Py_XINCREF(self->stat); @@ -12685,7 +13327,8 @@ os_DirEntry_stat_impl(DirEntry *self, int follow_symlinks) /* Set exception and return -1 on error, 0 for False, 1 for True */ static int -DirEntry_test_mode(DirEntry *self, int follow_symlinks, unsigned short mode_bits) +DirEntry_test_mode(PyTypeObject *defining_class, DirEntry *self, + int follow_symlinks, unsigned short mode_bits) { PyObject *stat = NULL; PyObject *st_mode = NULL; @@ -12698,7 +13341,6 @@ DirEntry_test_mode(DirEntry *self, int follow_symlinks, unsigned short mode_bits #ifdef MS_WINDOWS unsigned long dir_bits; #endif - _Py_IDENTIFIER(st_mode); #ifdef MS_WINDOWS is_symlink = (self->win32_lstat.st_mode & S_IFMT) == S_IFLNK; @@ -12711,7 +13353,7 @@ DirEntry_test_mode(DirEntry *self, int follow_symlinks, unsigned short mode_bits #if defined(MS_WINDOWS) || defined(HAVE_DIRENT_D_TYPE) if (need_stat) { #endif - stat = os_DirEntry_stat_impl(self, follow_symlinks); + stat = os_DirEntry_stat_impl(self, defining_class, follow_symlinks); if (!stat) { if (PyErr_ExceptionMatches(PyExc_FileNotFoundError)) { /* If file doesn't exist (anymore), then return False @@ -12721,7 +13363,8 @@ DirEntry_test_mode(DirEntry *self, int follow_symlinks, unsigned short mode_bits } goto error; } - st_mode = _PyObject_GetAttrId(stat, &PyId_st_mode); + _posixstate* state = get_posix_state(PyType_GetModule(defining_class)); + st_mode = PyObject_GetAttr(stat, state->st_mode); if (!st_mode) goto error; @@ -12764,6 +13407,8 @@ DirEntry_test_mode(DirEntry *self, int follow_symlinks, unsigned short mode_bits /*[clinic input] os.DirEntry.is_dir -> bool + defining_class: defining_class + / * follow_symlinks: bool = True @@ -12771,14 +13416,17 @@ Return True if the entry is a directory; cached per entry. [clinic start generated code]*/ static int -os_DirEntry_is_dir_impl(DirEntry *self, int follow_symlinks) -/*[clinic end generated code: output=ad2e8d54365da287 input=0135232766f53f58]*/ +os_DirEntry_is_dir_impl(DirEntry *self, PyTypeObject *defining_class, + int follow_symlinks) +/*[clinic end generated code: output=0cd453b9c0987fdf input=1a4ffd6dec9920cb]*/ { - return DirEntry_test_mode(self, follow_symlinks, S_IFDIR); + return DirEntry_test_mode(defining_class, self, follow_symlinks, S_IFDIR); } /*[clinic input] os.DirEntry.is_file -> bool + defining_class: defining_class + / * follow_symlinks: bool = True @@ -12786,10 +13434,11 @@ Return True if the entry is a file; cached per entry. [clinic start generated code]*/ static int -os_DirEntry_is_file_impl(DirEntry *self, int follow_symlinks) -/*[clinic end generated code: output=8462ade481d8a476 input=0dc90be168b041ee]*/ +os_DirEntry_is_file_impl(DirEntry *self, PyTypeObject *defining_class, + int follow_symlinks) +/*[clinic end generated code: output=f7c277ab5ba80908 input=0a64c5a12e802e3b]*/ { - return DirEntry_test_mode(self, follow_symlinks, S_IFREG); + return DirEntry_test_mode(defining_class, self, follow_symlinks, S_IFREG); } /*[clinic input] @@ -12866,42 +13515,29 @@ static PyMethodDef DirEntry_methods[] = { OS_DIRENTRY_STAT_METHODDEF OS_DIRENTRY_INODE_METHODDEF OS_DIRENTRY___FSPATH___METHODDEF + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL} }; -static PyTypeObject DirEntryType = { - PyVarObject_HEAD_INIT(NULL, 0) - MODNAME ".DirEntry", /* tp_name */ - sizeof(DirEntry), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - (destructor)DirEntry_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - (reprfunc)DirEntry_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - DirEntry_methods, /* tp_methods */ - DirEntry_members, /* tp_members */ +static PyType_Slot DirEntryType_slots[] = { + {Py_tp_new, _disabled_new}, + {Py_tp_dealloc, DirEntry_dealloc}, + {Py_tp_repr, DirEntry_repr}, + {Py_tp_methods, DirEntry_methods}, + {Py_tp_members, DirEntry_members}, + {0, 0}, +}; + +static PyType_Spec DirEntryType_spec = { + MODNAME ".DirEntry", + sizeof(DirEntry), + 0, + Py_TPFLAGS_DEFAULT, + DirEntryType_slots }; + #ifdef MS_WINDOWS static wchar_t * @@ -12938,14 +13574,15 @@ join_path_filenameW(const wchar_t *path_wide, const wchar_t *filename) } static PyObject * -DirEntry_from_find_data(path_t *path, WIN32_FIND_DATAW *dataW) +DirEntry_from_find_data(PyObject *module, path_t *path, WIN32_FIND_DATAW *dataW) { DirEntry *entry; BY_HANDLE_FILE_INFORMATION file_info; ULONG reparse_tag; wchar_t *joined_path; - entry = PyObject_New(DirEntry, &DirEntryType); + PyObject *DirEntryType = get_posix_state(module)->DirEntryType; + entry = PyObject_New(DirEntry, (PyTypeObject *)DirEntryType); if (!entry) return NULL; entry->name = NULL; @@ -13022,8 +13659,8 @@ join_path_filename(const char *path_narrow, const char* filename, Py_ssize_t fil } static PyObject * -DirEntry_from_posix_info(path_t *path, const char *name, Py_ssize_t name_len, - ino_t d_ino +DirEntry_from_posix_info(PyObject *module, path_t *path, const char *name, + Py_ssize_t name_len, ino_t d_ino #ifdef HAVE_DIRENT_D_TYPE , unsigned char d_type #endif @@ -13032,7 +13669,8 @@ DirEntry_from_posix_info(path_t *path, const char *name, Py_ssize_t name_len, DirEntry *entry; char *joined_path; - entry = PyObject_New(DirEntry, &DirEntryType); + PyObject *DirEntryType = get_posix_state(module)->DirEntryType; + entry = PyObject_New(DirEntry, (PyTypeObject *)DirEntryType); if (!entry) return NULL; entry->name = NULL; @@ -13151,8 +13789,10 @@ ScandirIterator_iternext(ScandirIterator *iterator) /* Skip over . and .. */ if (wcscmp(file_data->cFileName, L".") != 0 && - wcscmp(file_data->cFileName, L"..") != 0) { - entry = DirEntry_from_find_data(&iterator->path, file_data); + wcscmp(file_data->cFileName, L"..") != 0) + { + PyObject *module = PyType_GetModule(Py_TYPE(iterator)); + entry = DirEntry_from_find_data(module, &iterator->path, file_data); if (!entry) break; return entry; @@ -13223,10 +13863,12 @@ ScandirIterator_iternext(ScandirIterator *iterator) is_dot = direntp->d_name[0] == '.' && (name_len == 1 || (direntp->d_name[1] == '.' && name_len == 2)); if (!is_dot) { - entry = DirEntry_from_posix_info(&iterator->path, direntp->d_name, - name_len, direntp->d_ino + PyObject *module = PyType_GetModule(Py_TYPE(iterator)); + entry = DirEntry_from_posix_info(module, + &iterator->path, direntp->d_name, + name_len, direntp->d_ino #ifdef HAVE_DIRENT_D_TYPE - , direntp->d_type + , direntp->d_type #endif ); if (!entry) @@ -13294,10 +13936,13 @@ ScandirIterator_finalize(ScandirIterator *iterator) static void ScandirIterator_dealloc(ScandirIterator *iterator) { + PyTypeObject *tp = Py_TYPE(iterator); if (PyObject_CallFinalizerFromDealloc((PyObject *)iterator) < 0) return; - Py_TYPE(iterator)->tp_free((PyObject *)iterator); + freefunc free_func = PyType_GetSlot(tp, Py_tp_free); + free_func(iterator); + Py_DECREF(tp); } static PyMethodDef ScandirIterator_methods[] = { @@ -13307,56 +13952,24 @@ static PyMethodDef ScandirIterator_methods[] = { {NULL} }; -static PyTypeObject ScandirIteratorType = { - PyVarObject_HEAD_INIT(NULL, 0) - MODNAME ".ScandirIterator", /* tp_name */ - sizeof(ScandirIterator), /* tp_basicsize */ - 0, /* tp_itemsize */ - /* methods */ - (destructor)ScandirIterator_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - PyObject_SelfIter, /* tp_iter */ - (iternextfunc)ScandirIterator_iternext, /* tp_iternext */ - ScandirIterator_methods, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0, /* tp_free */ - 0, /* tp_is_gc */ - 0, /* tp_bases */ - 0, /* tp_mro */ - 0, /* tp_cache */ - 0, /* tp_subclasses */ - 0, /* tp_weaklist */ - 0, /* tp_del */ - 0, /* tp_version_tag */ - (destructor)ScandirIterator_finalize, /* tp_finalize */ +static PyType_Slot ScandirIteratorType_slots[] = { + {Py_tp_new, _disabled_new}, + {Py_tp_dealloc, ScandirIterator_dealloc}, + {Py_tp_finalize, ScandirIterator_finalize}, + {Py_tp_iter, PyObject_SelfIter}, + {Py_tp_iternext, ScandirIterator_iternext}, + {Py_tp_methods, ScandirIterator_methods}, + {0, 0}, +}; + +static PyType_Spec ScandirIteratorType_spec = { + MODNAME ".ScandirIterator", + sizeof(ScandirIterator), + 0, + // bpo-40549: Py_TPFLAGS_BASETYPE should not be used, since + // PyType_GetModule(Py_TYPE(self)) doesn't work on a subclass instance. + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE, + ScandirIteratorType_slots }; /*[clinic input] @@ -13392,7 +14005,8 @@ os_scandir_impl(PyObject *module, path_t *path) return NULL; } - iterator = PyObject_New(ScandirIterator, &ScandirIteratorType); + PyObject *ScandirIteratorType = get_posix_state(module)->ScandirIteratorType; + iterator = PyObject_New(ScandirIterator, (PyTypeObject *)ScandirIteratorType); if (!iterator) return NULL; @@ -13427,7 +14041,8 @@ os_scandir_impl(PyObject *module, path_t *path) #else /* POSIX */ errno = 0; #ifdef HAVE_FDOPENDIR - if (path->fd != -1) { + if (iterator->path.fd != -1) { + if (HAVE_FDOPENDIR_RUNTIME) { /* closedir() closes the FD, so we duplicate it */ fd = _Py_dup(path->fd); if (fd == -1) @@ -13436,6 +14051,11 @@ os_scandir_impl(PyObject *module, path_t *path) Py_BEGIN_ALLOW_THREADS iterator->dirp = fdopendir(fd); Py_END_ALLOW_THREADS + } else { + PyErr_SetString(PyExc_TypeError, + "scandir: path should be string, bytes, os.PathLike or None, not int"); + return NULL; + } } else #endif @@ -13482,7 +14102,6 @@ PyOS_FSPath(PyObject *path) { /* For error message reasons, this function is manually inlined in path_converter(). */ - _Py_IDENTIFIER(__fspath__); PyObject *func = NULL; PyObject *path_repr = NULL; @@ -13496,7 +14115,7 @@ PyOS_FSPath(PyObject *path) return PyErr_Format(PyExc_TypeError, "expected str, bytes or os.PathLike object, " "not %.200s", - Py_TYPE(path)->tp_name); + _PyType_Name(Py_TYPE(path))); } path_repr = _PyObject_CallNoArg(func); @@ -13508,8 +14127,8 @@ PyOS_FSPath(PyObject *path) if (!(PyUnicode_Check(path_repr) || PyBytes_Check(path_repr))) { PyErr_Format(PyExc_TypeError, "expected %.200s.__fspath__() to return str or bytes, " - "not %.200s", Py_TYPE(path)->tp_name, - Py_TYPE(path_repr)->tp_name); + "not %.200s", _PyType_Name(Py_TYPE(path)), + _PyType_Name(Py_TYPE(path_repr))); Py_DECREF(path_repr); return NULL; } @@ -13709,6 +14328,105 @@ os__remove_dll_directory_impl(PyObject *module, PyObject *cookie) #endif + +/* Only check if WIFEXITED is available: expect that it comes + with WEXITSTATUS, WIFSIGNALED, etc. + + os.waitstatus_to_exitcode() is implemented in C and not in Python, so + subprocess can safely call it during late Python finalization without + risking that used os attributes were set to None by _PyImport_Cleanup(). */ +#if defined(WIFEXITED) || defined(MS_WINDOWS) +/*[clinic input] +os.waitstatus_to_exitcode + + status as status_obj: object + +Convert a wait status to an exit code. + +On Unix: + +* If WIFEXITED(status) is true, return WEXITSTATUS(status). +* If WIFSIGNALED(status) is true, return -WTERMSIG(status). +* Otherwise, raise a ValueError. + +On Windows, return status shifted right by 8 bits. + +On Unix, if the process is being traced or if waitpid() was called with +WUNTRACED option, the caller must first check if WIFSTOPPED(status) is true. +This function must not be called if WIFSTOPPED(status) is true. +[clinic start generated code]*/ + +static PyObject * +os_waitstatus_to_exitcode_impl(PyObject *module, PyObject *status_obj) +/*[clinic end generated code: output=db50b1b0ba3c7153 input=7fe2d7fdaea3db42]*/ +{ + if (PyFloat_Check(status_obj)) { + PyErr_SetString(PyExc_TypeError, + "integer argument expected, got float" ); + return NULL; + } +#ifndef MS_WINDOWS + int status = _PyLong_AsInt(status_obj); + if (status == -1 && PyErr_Occurred()) { + return NULL; + } + + WAIT_TYPE wait_status; + WAIT_STATUS_INT(wait_status) = status; + int exitcode; + if (WIFEXITED(wait_status)) { + exitcode = WEXITSTATUS(wait_status); + /* Sanity check to provide warranty on the function behavior. + It should not occur in practice */ + if (exitcode < 0) { + PyErr_Format(PyExc_ValueError, "invalid WEXITSTATUS: %i", exitcode); + return NULL; + } + } + else if (WIFSIGNALED(wait_status)) { + int signum = WTERMSIG(wait_status); + /* Sanity check to provide warranty on the function behavior. + It should not occurs in practice */ + if (signum <= 0) { + PyErr_Format(PyExc_ValueError, "invalid WTERMSIG: %i", signum); + return NULL; + } + exitcode = -signum; + } else if (WIFSTOPPED(wait_status)) { + /* Status only received if the process is being traced + or if waitpid() was called with WUNTRACED option. */ + int signum = WSTOPSIG(wait_status); + PyErr_Format(PyExc_ValueError, + "process stopped by delivery of signal %i", + signum); + return NULL; + } + else { + PyErr_Format(PyExc_ValueError, "invalid wait status: %i", status); + return NULL; + } + return PyLong_FromLong(exitcode); +#else + /* Windows implementation: see os.waitpid() implementation + which uses _cwait(). */ + unsigned long long status = PyLong_AsUnsignedLongLong(status_obj); + if (status == (unsigned long long)-1 && PyErr_Occurred()) { + return NULL; + } + + unsigned long long exitcode = (status >> 8); + /* ExitProcess() accepts an UINT type: + reject exit code which doesn't fit in an UINT */ + if (exitcode > UINT_MAX) { + PyErr_Format(PyExc_ValueError, "invalid exit code: %llu", exitcode); + return NULL; + } + return PyLong_FromUnsignedLong((unsigned long)exitcode); +#endif +} +#endif + + static PyMethodDef posix_methods[] = { OS_STAT_METHODDEF @@ -13773,9 +14491,7 @@ static PyMethodDef posix_methods[] = { OS_GETEGID_METHODDEF OS_GETEUID_METHODDEF OS_GETGID_METHODDEF -#ifdef HAVE_GETGROUPLIST - {"getgrouplist", posix_getgrouplist, METH_VARARGS, posix_getgrouplist__doc__}, -#endif + OS_GETGROUPLIST_METHODDEF OS_GETGROUPS_METHODDEF OS_GETPID_METHODDEF OS_GETPGRP_METHODDEF @@ -13785,9 +14501,7 @@ static PyMethodDef posix_methods[] = { OS_KILL_METHODDEF OS_KILLPG_METHODDEF OS_PLOCK_METHODDEF -#ifdef MS_WINDOWS OS_STARTFILE_METHODDEF -#endif OS_SETUID_METHODDEF OS_SETEUID_METHODDEF OS_SETREUID_METHODDEF @@ -13795,9 +14509,7 @@ static PyMethodDef posix_methods[] = { OS_SETEGID_METHODDEF OS_SETREGID_METHODDEF OS_SETGROUPS_METHODDEF -#ifdef HAVE_INITGROUPS - {"initgroups", posix_initgroups, METH_VARARGS, posix_initgroups__doc__}, -#endif /* HAVE_INITGROUPS */ + OS_INITGROUPS_METHODDEF OS_GETPGID_METHODDEF OS_SETPGRP_METHODDEF OS_WAIT_METHODDEF @@ -13805,6 +14517,7 @@ static PyMethodDef posix_methods[] = { OS_WAIT4_METHODDEF OS_WAITID_METHODDEF OS_WAITPID_METHODDEF + OS_PIDFD_OPEN_METHODDEF OS_GETSID_METHODDEF OS_SETSID_METHODDEF OS_SETPGID_METHODDEF @@ -13826,10 +14539,7 @@ static PyMethodDef posix_methods[] = { OS_WRITEV_METHODDEF OS_PWRITE_METHODDEF OS_PWRITEV_METHODDEF -#ifdef HAVE_SENDFILE - {"sendfile", (PyCFunction)(void(*)(void))posix_sendfile, METH_VARARGS | METH_KEYWORDS, - posix_sendfile__doc__}, -#endif + OS_SENDFILE_METHODDEF OS_FSTAT_METHODDEF OS_ISATTY_METHODDEF OS_PIPE_METHODDEF @@ -13881,26 +14591,21 @@ static PyMethodDef posix_methods[] = { OS_REMOVEXATTR_METHODDEF OS_LISTXATTR_METHODDEF -#if defined(TERMSIZE_USE_CONIO) || defined(TERMSIZE_USE_IOCTL) - {"get_terminal_size", get_terminal_size, METH_VARARGS, termsize__doc__}, -#endif + OS_GET_TERMINAL_SIZE_METHODDEF OS_CPU_COUNT_METHODDEF OS_GET_INHERITABLE_METHODDEF OS_SET_INHERITABLE_METHODDEF OS_GET_HANDLE_INHERITABLE_METHODDEF OS_SET_HANDLE_INHERITABLE_METHODDEF -#ifndef MS_WINDOWS OS_GET_BLOCKING_METHODDEF OS_SET_BLOCKING_METHODDEF -#endif OS_SCANDIR_METHODDEF OS_FSPATH_METHODDEF OS_GETRANDOM_METHODDEF OS_MEMFD_CREATE_METHODDEF -#ifdef MS_WINDOWS OS__ADD_DLL_DIRECTORY_METHODDEF OS__REMOVE_DLL_DIRECTORY_METHODDEF -#endif + OS_WAITSTATUS_TO_EXITCODE_METHODDEF {NULL, NULL} /* Sentinel */ }; @@ -14208,6 +14913,9 @@ all_ins(PyObject *m) if (PyModule_AddIntMacro(m, P_PID)) return -1; if (PyModule_AddIntMacro(m, P_PGID)) return -1; if (PyModule_AddIntMacro(m, P_ALL)) return -1; +#ifdef P_PIDFD + if (PyModule_AddIntMacro(m, P_PIDFD)) return -1; +#endif #endif #ifdef WEXITED if (PyModule_AddIntMacro(m, WEXITED)) return -1; @@ -14221,12 +14929,18 @@ all_ins(PyObject *m) #ifdef CLD_EXITED if (PyModule_AddIntMacro(m, CLD_EXITED)) return -1; #endif +#ifdef CLD_KILLED + if (PyModule_AddIntMacro(m, CLD_KILLED)) return -1; +#endif #ifdef CLD_DUMPED if (PyModule_AddIntMacro(m, CLD_DUMPED)) return -1; #endif #ifdef CLD_TRAPPED if (PyModule_AddIntMacro(m, CLD_TRAPPED)) return -1; #endif +#ifdef CLD_STOPPED + if (PyModule_AddIntMacro(m, CLD_STOPPED)) return -1; +#endif #ifdef CLD_CONTINUED if (PyModule_AddIntMacro(m, CLD_CONTINUED)) return -1; #endif @@ -14412,314 +15126,357 @@ all_ins(PyObject *m) } -static struct PyModuleDef posixmodule = { - PyModuleDef_HEAD_INIT, - MODNAME, - posix__doc__, - -1, - posix_methods, - NULL, - NULL, - NULL, - NULL -}; + +#define PROBE(name, test) \ + static int name(void) \ + { \ + if (test) { \ + return 1; \ + } else { \ + return 0; \ + } \ + } + +#ifdef HAVE_FSTATAT +PROBE(probe_fstatat, HAVE_FSTATAT_RUNTIME) +#endif + +#ifdef HAVE_FACCESSAT +PROBE(probe_faccessat, HAVE_FACCESSAT_RUNTIME) +#endif + +#ifdef HAVE_FCHMODAT +PROBE(probe_fchmodat, HAVE_FCHMODAT_RUNTIME) +#endif + +#ifdef HAVE_FCHOWNAT +PROBE(probe_fchownat, HAVE_FCHOWNAT_RUNTIME) +#endif + +#ifdef HAVE_LINKAT +PROBE(probe_linkat, HAVE_LINKAT_RUNTIME) +#endif + +#ifdef HAVE_FDOPENDIR +PROBE(probe_fdopendir, HAVE_FDOPENDIR_RUNTIME) +#endif + +#ifdef HAVE_MKDIRAT +PROBE(probe_mkdirat, HAVE_MKDIRAT_RUNTIME) +#endif + +#ifdef HAVE_RENAMEAT +PROBE(probe_renameat, HAVE_RENAMEAT_RUNTIME) +#endif + +#ifdef HAVE_UNLINKAT +PROBE(probe_unlinkat, HAVE_UNLINKAT_RUNTIME) +#endif + +#ifdef HAVE_OPENAT +PROBE(probe_openat, HAVE_OPENAT_RUNTIME) +#endif + +#ifdef HAVE_READLINKAT +PROBE(probe_readlinkat, HAVE_READLINKAT_RUNTIME) +#endif + +#ifdef HAVE_SYMLINKAT +PROBE(probe_symlinkat, HAVE_SYMLINKAT_RUNTIME) +#endif + +#ifdef HAVE_FUTIMENS +PROBE(probe_futimens, HAVE_FUTIMENS_RUNTIME) +#endif + +#ifdef HAVE_UTIMENSAT +PROBE(probe_utimensat, HAVE_UTIMENSAT_RUNTIME) +#endif + + -static const char * const have_functions[] = { +static const struct have_function { + const char * const label; + int (*probe)(void); +} have_functions[] = { #ifdef HAVE_FACCESSAT - "HAVE_FACCESSAT", + { "HAVE_FACCESSAT", probe_faccessat }, #endif #ifdef HAVE_FCHDIR - "HAVE_FCHDIR", + { "HAVE_FCHDIR", NULL }, #endif #ifdef HAVE_FCHMOD - "HAVE_FCHMOD", + { "HAVE_FCHMOD", NULL }, #endif #ifdef HAVE_FCHMODAT - "HAVE_FCHMODAT", + { "HAVE_FCHMODAT", probe_fchmodat }, #endif #ifdef HAVE_FCHOWN - "HAVE_FCHOWN", + { "HAVE_FCHOWN", NULL }, #endif #ifdef HAVE_FCHOWNAT - "HAVE_FCHOWNAT", + { "HAVE_FCHOWNAT", probe_fchownat }, #endif #ifdef HAVE_FEXECVE - "HAVE_FEXECVE", + { "HAVE_FEXECVE", NULL }, #endif #ifdef HAVE_FDOPENDIR - "HAVE_FDOPENDIR", + { "HAVE_FDOPENDIR", probe_fdopendir }, #endif #ifdef HAVE_FPATHCONF - "HAVE_FPATHCONF", + { "HAVE_FPATHCONF", NULL }, #endif #ifdef HAVE_FSTATAT - "HAVE_FSTATAT", + { "HAVE_FSTATAT", probe_fstatat }, #endif #ifdef HAVE_FSTATVFS - "HAVE_FSTATVFS", + { "HAVE_FSTATVFS", NULL }, #endif #if defined HAVE_FTRUNCATE || defined MS_WINDOWS - "HAVE_FTRUNCATE", + { "HAVE_FTRUNCATE", NULL }, #endif #ifdef HAVE_FUTIMENS - "HAVE_FUTIMENS", + { "HAVE_FUTIMENS", probe_futimens }, #endif #ifdef HAVE_FUTIMES - "HAVE_FUTIMES", + { "HAVE_FUTIMES", NULL }, #endif #ifdef HAVE_FUTIMESAT - "HAVE_FUTIMESAT", + { "HAVE_FUTIMESAT", NULL }, #endif #ifdef HAVE_LINKAT - "HAVE_LINKAT", + { "HAVE_LINKAT", probe_linkat }, #endif #ifdef HAVE_LCHFLAGS - "HAVE_LCHFLAGS", + { "HAVE_LCHFLAGS", NULL }, #endif #ifdef HAVE_LCHMOD - "HAVE_LCHMOD", + { "HAVE_LCHMOD", NULL }, #endif #ifdef HAVE_LCHOWN - "HAVE_LCHOWN", + { "HAVE_LCHOWN", NULL }, #endif #ifdef HAVE_LSTAT - "HAVE_LSTAT", + { "HAVE_LSTAT", NULL }, #endif #ifdef HAVE_LUTIMES - "HAVE_LUTIMES", + { "HAVE_LUTIMES", NULL }, #endif #ifdef HAVE_MEMFD_CREATE - "HAVE_MEMFD_CREATE", + { "HAVE_MEMFD_CREATE", NULL }, #endif #ifdef HAVE_MKDIRAT - "HAVE_MKDIRAT", + { "HAVE_MKDIRAT", probe_mkdirat }, #endif #ifdef HAVE_MKFIFOAT - "HAVE_MKFIFOAT", + { "HAVE_MKFIFOAT", NULL }, #endif #ifdef HAVE_MKNODAT - "HAVE_MKNODAT", + { "HAVE_MKNODAT", NULL }, #endif #ifdef HAVE_OPENAT - "HAVE_OPENAT", + { "HAVE_OPENAT", probe_openat }, #endif #ifdef HAVE_READLINKAT - "HAVE_READLINKAT", + { "HAVE_READLINKAT", probe_readlinkat }, #endif #ifdef HAVE_RENAMEAT - "HAVE_RENAMEAT", + { "HAVE_RENAMEAT", probe_renameat }, #endif #ifdef HAVE_SYMLINKAT - "HAVE_SYMLINKAT", + { "HAVE_SYMLINKAT", probe_symlinkat }, #endif #ifdef HAVE_UNLINKAT - "HAVE_UNLINKAT", + { "HAVE_UNLINKAT", probe_unlinkat }, #endif #ifdef HAVE_UTIMENSAT - "HAVE_UTIMENSAT", + { "HAVE_UTIMENSAT", probe_utimensat }, #endif #ifdef MS_WINDOWS - "MS_WINDOWS", + { "MS_WINDOWS", NULL }, #endif - NULL + { NULL, NULL } }; -PyMODINIT_FUNC -INITFUNC(void) +static int +posixmodule_exec(PyObject *m) { - PyObject *m, *v; - PyObject *list; - const char * const *trace; + _posixstate *state = get_posix_state(m); - m = PyModule_Create(&posixmodule); - if (m == NULL) - return NULL; +#if defined(HAVE_PWRITEV) + if (HAVE_PWRITEV_RUNTIME) {} else { + PyObject* dct = PyModule_GetDict(m); + + if (dct == NULL) { + return -1; + } + + if (PyDict_DelItemString(dct, "pwritev") == -1) { + PyErr_Clear(); + } + if (PyDict_DelItemString(dct, "preadv") == -1) { + PyErr_Clear(); + } + } +#endif /* Initialize environ dictionary */ - v = convertenviron(); + PyObject *v = convertenviron(); Py_XINCREF(v); if (v == NULL || PyModule_AddObject(m, "environ", v) != 0) - return NULL; + return -1; Py_DECREF(v); if (all_ins(m)) - return NULL; + return -1; if (setup_confname_tables(m)) - return NULL; + return -1; Py_INCREF(PyExc_OSError); PyModule_AddObject(m, "error", PyExc_OSError); -#ifdef HAVE_PUTENV - if (posix_putenv_garbage == NULL) - posix_putenv_garbage = PyDict_New(); -#endif - - if (!initialized) { #if defined(HAVE_WAITID) && !defined(__APPLE__) - waitid_result_desc.name = MODNAME ".waitid_result"; - WaitidResultType = PyStructSequence_NewType(&waitid_result_desc); - if (WaitidResultType == NULL) { - return NULL; - } + waitid_result_desc.name = MODNAME ".waitid_result"; + PyObject *WaitidResultType = (PyObject *)PyStructSequence_NewType(&waitid_result_desc); + if (WaitidResultType == NULL) { + return -1; + } + Py_INCREF(WaitidResultType); + PyModule_AddObject(m, "waitid_result", WaitidResultType); + state->WaitidResultType = WaitidResultType; #endif - stat_result_desc.name = "os.stat_result"; /* see issue #19209 */ - stat_result_desc.fields[7].name = PyStructSequence_UnnamedField; - stat_result_desc.fields[8].name = PyStructSequence_UnnamedField; - stat_result_desc.fields[9].name = PyStructSequence_UnnamedField; - StatResultType = PyStructSequence_NewType(&stat_result_desc); - if (StatResultType == NULL) { - return NULL; - } - structseq_new = StatResultType->tp_new; - StatResultType->tp_new = statresult_new; + stat_result_desc.name = "os.stat_result"; /* see issue #19209 */ + stat_result_desc.fields[7].name = PyStructSequence_UnnamedField; + stat_result_desc.fields[8].name = PyStructSequence_UnnamedField; + stat_result_desc.fields[9].name = PyStructSequence_UnnamedField; + PyObject *StatResultType = (PyObject *)PyStructSequence_NewType(&stat_result_desc); + if (StatResultType == NULL) { + return -1; + } + Py_INCREF(StatResultType); + PyModule_AddObject(m, "stat_result", StatResultType); + state->StatResultType = StatResultType; + structseq_new = ((PyTypeObject *)StatResultType)->tp_new; + ((PyTypeObject *)StatResultType)->tp_new = statresult_new; - statvfs_result_desc.name = "os.statvfs_result"; /* see issue #19209 */ - StatVFSResultType = PyStructSequence_NewType(&statvfs_result_desc); - if (StatVFSResultType == NULL) { - return NULL; - } + statvfs_result_desc.name = "os.statvfs_result"; /* see issue #19209 */ + PyObject *StatVFSResultType = (PyObject *)PyStructSequence_NewType(&statvfs_result_desc); + if (StatVFSResultType == NULL) { + return -1; + } + Py_INCREF(StatVFSResultType); + PyModule_AddObject(m, "statvfs_result", StatVFSResultType); + state->StatVFSResultType = StatVFSResultType; #ifdef NEED_TICKS_PER_SECOND # if defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK) - ticks_per_second = sysconf(_SC_CLK_TCK); + ticks_per_second = sysconf(_SC_CLK_TCK); # elif defined(HZ) - ticks_per_second = HZ; + ticks_per_second = HZ; # else - ticks_per_second = 60; /* magic fallback value; may be bogus */ + ticks_per_second = 60; /* magic fallback value; may be bogus */ # endif #endif #if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) - sched_param_desc.name = MODNAME ".sched_param"; - SchedParamType = PyStructSequence_NewType(&sched_param_desc); - if (SchedParamType == NULL) { - return NULL; - } - SchedParamType->tp_new = os_sched_param; -#endif - - /* initialize TerminalSize_info */ - TerminalSizeType = PyStructSequence_NewType(&TerminalSize_desc); - if (TerminalSizeType == NULL) { - return NULL; - } - - /* initialize scandir types */ - if (PyType_Ready(&ScandirIteratorType) < 0) - return NULL; - if (PyType_Ready(&DirEntryType) < 0) - return NULL; + sched_param_desc.name = MODNAME ".sched_param"; + PyObject *SchedParamType = (PyObject *)PyStructSequence_NewType(&sched_param_desc); + if (SchedParamType == NULL) { + return -1; } -#if defined(HAVE_WAITID) && !defined(__APPLE__) - Py_INCREF((PyObject*) WaitidResultType); - PyModule_AddObject(m, "waitid_result", (PyObject*) WaitidResultType); -#endif - Py_INCREF((PyObject*) StatResultType); - PyModule_AddObject(m, "stat_result", (PyObject*) StatResultType); - Py_INCREF((PyObject*) StatVFSResultType); - PyModule_AddObject(m, "statvfs_result", - (PyObject*) StatVFSResultType); - -#if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) Py_INCREF(SchedParamType); - PyModule_AddObject(m, "sched_param", (PyObject *)SchedParamType); + PyModule_AddObject(m, "sched_param", SchedParamType); + state->SchedParamType = SchedParamType; + ((PyTypeObject *)SchedParamType)->tp_new = os_sched_param; #endif - times_result_desc.name = MODNAME ".times_result"; - TimesResultType = PyStructSequence_NewType(×_result_desc); - if (TimesResultType == NULL) { - return NULL; + /* initialize TerminalSize_info */ + PyObject *TerminalSizeType = (PyObject *)PyStructSequence_NewType(&TerminalSize_desc); + if (TerminalSizeType == NULL) { + return -1; } - PyModule_AddObject(m, "times_result", (PyObject *)TimesResultType); + Py_INCREF(TerminalSizeType); + PyModule_AddObject(m, "terminal_size", TerminalSizeType); + state->TerminalSizeType = TerminalSizeType; - uname_result_desc.name = MODNAME ".uname_result"; - UnameResultType = PyStructSequence_NewType(&uname_result_desc); - if (UnameResultType == NULL) { - return NULL; + /* initialize scandir types */ + PyObject *ScandirIteratorType = PyType_FromModuleAndSpec(m, &ScandirIteratorType_spec, NULL); + if (ScandirIteratorType == NULL) { + return -1; } - PyModule_AddObject(m, "uname_result", (PyObject *)UnameResultType); + state->ScandirIteratorType = ScandirIteratorType; -#ifdef __APPLE__ - /* - * Step 2 of weak-linking support on Mac OS X. - * - * The code below removes functions that are not available on the - * currently active platform. - * - * This block allow one to use a python binary that was build on - * OSX 10.4 on OSX 10.3, without losing access to new APIs on - * OSX 10.4. - */ -#ifdef HAVE_FSTATVFS - if (fstatvfs == NULL) { - if (PyObject_DelAttrString(m, "fstatvfs") == -1) { - return NULL; - } + PyObject *DirEntryType = PyType_FromModuleAndSpec(m, &DirEntryType_spec, NULL); + if (DirEntryType == NULL) { + return -1; } -#endif /* HAVE_FSTATVFS */ + Py_INCREF(DirEntryType); + PyModule_AddObject(m, "DirEntry", DirEntryType); + state->DirEntryType = DirEntryType; -#ifdef HAVE_STATVFS - if (statvfs == NULL) { - if (PyObject_DelAttrString(m, "statvfs") == -1) { - return NULL; - } + times_result_desc.name = MODNAME ".times_result"; + PyObject *TimesResultType = (PyObject *)PyStructSequence_NewType(×_result_desc); + if (TimesResultType == NULL) { + return -1; } -#endif /* HAVE_STATVFS */ + Py_INCREF(TimesResultType); + PyModule_AddObject(m, "times_result", TimesResultType); + state->TimesResultType = TimesResultType; -# ifdef HAVE_LCHOWN - if (lchown == NULL) { - if (PyObject_DelAttrString(m, "lchown") == -1) { - return NULL; - } + PyTypeObject *UnameResultType = PyStructSequence_NewType(&uname_result_desc); + if (UnameResultType == NULL) { + return -1; } -#endif /* HAVE_LCHOWN */ - - -#endif /* __APPLE__ */ - - Py_INCREF(TerminalSizeType); - PyModule_AddObject(m, "terminal_size", (PyObject*)TerminalSizeType); + Py_INCREF(UnameResultType); + PyModule_AddObject(m, "uname_result", (PyObject *)UnameResultType); + state->UnameResultType = (PyObject *)UnameResultType; - billion = PyLong_FromLong(1000000000); - if (!billion) - return NULL; + if ((state->billion = PyLong_FromLong(1000000000)) == NULL) + return -1; +#if defined(HAVE_WAIT3) || defined(HAVE_WAIT4) + state->struct_rusage = PyUnicode_InternFromString("struct_rusage"); + if (state->struct_rusage == NULL) + return -1; +#endif + state->st_mode = PyUnicode_InternFromString("st_mode"); + if (state->st_mode == NULL) + return -1; /* suppress "function not used" warnings */ { @@ -14735,25 +15492,48 @@ INITFUNC(void) * provide list of locally available functions * so os.py can populate support_* lists */ - list = PyList_New(0); - if (!list) - return NULL; - for (trace = have_functions; *trace; trace++) { - PyObject *unicode = PyUnicode_DecodeASCII(*trace, strlen(*trace), NULL); + PyObject *list = PyList_New(0); + if (!list) { + return -1; + } + for (const struct have_function *trace = have_functions; trace->label; trace++) { + PyObject *unicode; + if (trace->probe && !trace->probe()) continue; + unicode = PyUnicode_DecodeASCII(trace->label, strlen(trace->label), NULL); if (!unicode) - return NULL; + return -1; if (PyList_Append(list, unicode)) - return NULL; + return -1; Py_DECREF(unicode); } + PyModule_AddObject(m, "_have_functions", list); - Py_INCREF((PyObject *) &DirEntryType); - PyModule_AddObject(m, "DirEntry", (PyObject *)&DirEntryType); + return 0; +} - initialized = 1; - return m; +static PyModuleDef_Slot posixmodile_slots[] = { + {Py_mod_exec, posixmodule_exec}, + {0, NULL} +}; + +static struct PyModuleDef posixmodule = { + PyModuleDef_HEAD_INIT, + .m_name = MODNAME, + .m_doc = posix__doc__, + .m_size = sizeof(_posixstate), + .m_methods = posix_methods, + .m_slots = posixmodile_slots, + .m_traverse = _posix_traverse, + .m_clear = _posix_clear, + .m_free = _posix_free, +}; + +PyMODINIT_FUNC +INITFUNC(void) +{ + return PyModuleDef_Init(&posixmodule); } #ifdef __cplusplus diff --git a/Modules/posixmodule.h b/Modules/posixmodule.h index 1e00562abc3370eb44631b6c065f47e2d995fdd7..711ac686934b0285282c0c43c90ec7828652800c 100644 --- a/Modules/posixmodule.h +++ b/Modules/posixmodule.h @@ -14,8 +14,8 @@ extern "C" { #ifndef MS_WINDOWS PyAPI_FUNC(PyObject *) _PyLong_FromUid(uid_t); PyAPI_FUNC(PyObject *) _PyLong_FromGid(gid_t); -PyAPI_FUNC(int) _Py_Uid_Converter(PyObject *, void *); -PyAPI_FUNC(int) _Py_Gid_Converter(PyObject *, void *); +PyAPI_FUNC(int) _Py_Uid_Converter(PyObject *, uid_t *); +PyAPI_FUNC(int) _Py_Gid_Converter(PyObject *, gid_t *); #endif /* MS_WINDOWS */ #if defined(PYPTHREAD_SIGMASK) || defined(HAVE_SIGWAIT) || \ diff --git a/Modules/pwdmodule.c b/Modules/pwdmodule.c index e0232b8d589baa844f40b21ceda194ac1c20871e..901a3ed9a2e378b9ead06b818043b62daafb9993 100644 --- a/Modules/pwdmodule.c +++ b/Modules/pwdmodule.c @@ -47,8 +47,21 @@ The uid and gid items are integers, all others are strings. An\n\ exception is raised if the entry asked for cannot be found."); -static int initialized; -static PyTypeObject StructPwdType; +typedef struct { + PyTypeObject *StructPwdType; +} pwdmodulestate; + +static inline pwdmodulestate* +get_pwd_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (pwdmodulestate *)state; +} + +#define modulestate_global get_pwd_state(PyState_FindModule(&pwdmodule)) + +static struct PyModuleDef pwdmodule; #define DEFAULT_BUFFER_SIZE 1024 @@ -69,7 +82,7 @@ static PyObject * mkpwent(struct passwd *p) { int setIndex = 0; - PyObject *v = PyStructSequence_New(&StructPwdType); + PyObject *v = PyStructSequence_New(modulestate_global->StructPwdType); if (v == NULL) return NULL; @@ -310,16 +323,28 @@ static PyMethodDef pwd_methods[] = { {NULL, NULL} /* sentinel */ }; +static int pwdmodule_traverse(PyObject *m, visitproc visit, void *arg) { + Py_VISIT(get_pwd_state(m)->StructPwdType); + return 0; +} +static int pwdmodule_clear(PyObject *m) { + Py_CLEAR(get_pwd_state(m)->StructPwdType); + return 0; +} +static void pwdmodule_free(void *m) { + pwdmodule_clear((PyObject *)m); +} + static struct PyModuleDef pwdmodule = { PyModuleDef_HEAD_INIT, "pwd", pwd__doc__, - -1, + sizeof(pwdmodulestate), pwd_methods, NULL, - NULL, - NULL, - NULL + pwdmodule_traverse, + pwdmodule_clear, + pwdmodule_free, }; @@ -327,17 +352,19 @@ PyMODINIT_FUNC PyInit_pwd(void) { PyObject *m; - m = PyModule_Create(&pwdmodule); - if (m == NULL) + if ((m = PyState_FindModule(&pwdmodule)) != NULL) { + Py_INCREF(m); + return m; + } + if ((m = PyModule_Create(&pwdmodule)) == NULL) return NULL; - if (!initialized) { - if (PyStructSequence_InitType2(&StructPwdType, - &struct_pwd_type_desc) < 0) - return NULL; - initialized = 1; + pwdmodulestate *state = PyModule_GetState(m); + state->StructPwdType = PyStructSequence_NewType(&struct_pwd_type_desc); + if (state->StructPwdType == NULL) { + return NULL; } - Py_INCREF((PyObject *) &StructPwdType); - PyModule_AddObject(m, "struct_passwd", (PyObject *) &StructPwdType); + Py_INCREF(state->StructPwdType); + PyModule_AddObject(m, "struct_passwd", (PyObject *) state->StructPwdType); return m; } diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index df1a69b653b3534bca322db8c4f4e440caa34456..12ae66d945bda8cb6b85944fd3de9e02f35245ac 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -1,7 +1,7 @@ #include "Python.h" #include -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include "frameobject.h" #include "expat.h" @@ -119,7 +119,7 @@ set_error(xmlparseobject *self, enum XML_Error code) XML_ErrorString(code), lineno, column); if (buffer == NULL) return NULL; - err = PyObject_CallFunctionObjArgs(ErrorObject, buffer, NULL); + err = PyObject_CallOneArg(ErrorObject, buffer); Py_DECREF(buffer); if ( err != NULL && set_error_attr(err, "code", code) @@ -208,7 +208,7 @@ call_with_frame(const char *funcname, int lineno, PyObject* func, PyObject* args { PyObject *res; - res = PyEval_CallObject(func, args); + res = PyObject_Call(func, args, NULL); if (res == NULL) { _PyTraceback_Add(funcname, __FILE__, lineno); XML_StopParser(self->itself, XML_FALSE); @@ -938,7 +938,6 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self, new_parser->handlers = 0; new_parser->intern = self->intern; Py_XINCREF(new_parser->intern); - PyObject_GC_Track(new_parser); if (self->buffer != NULL) { new_parser->buffer = PyMem_Malloc(new_parser->buffer_size); @@ -975,6 +974,8 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self, handler_info[i].handler); } } + + PyObject_GC_Track(new_parser); return (PyObject *)new_parser; } @@ -1059,7 +1060,7 @@ PyUnknownEncodingHandler(void *encodingHandlerData, static unsigned char template_buffer[256] = {0}; PyObject* u; int i; - void *data; + const void *data; unsigned int kind; if (PyErr_Occurred()) @@ -1122,7 +1123,6 @@ newxmlparseobject(const char *encoding, const char *namespace_separator, PyObjec self->handlers = NULL; self->intern = intern; Py_XINCREF(self->intern); - PyObject_GC_Track(self); /* namespace_separator is either NULL or contains one char + \0 */ self->itself = XML_ParserCreate_MM(encoding, &ExpatMemoryHandler, @@ -1152,6 +1152,7 @@ newxmlparseobject(const char *encoding, const char *namespace_separator, PyObjec } clear_handlers(self, 1); + PyObject_GC_Track(self); return (PyObject*)self; } diff --git a/Modules/readline.c b/Modules/readline.c index 081657fb236991537eaa9027a6b2aa93974c2543..1e74f997b071129d5760e5d2dc99b85c150e8a52 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -86,13 +86,18 @@ typedef struct { PyObject *endidx; } readlinestate; - -#define readline_state(o) ((readlinestate *)PyModule_GetState(o)) +static inline readlinestate* +get_readline_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (readlinestate *)state; +} static int readline_clear(PyObject *m) { - readlinestate *state = readline_state(m); + readlinestate *state = get_readline_state(m); Py_CLEAR(state->completion_display_matches_hook); Py_CLEAR(state->startup_hook); Py_CLEAR(state->pre_input_hook); @@ -105,7 +110,7 @@ readline_clear(PyObject *m) static int readline_traverse(PyObject *m, visitproc visit, void *arg) { - readlinestate *state = readline_state(m); + readlinestate *state = get_readline_state(m); Py_VISIT(state->completion_display_matches_hook); Py_VISIT(state->startup_hook); Py_VISIT(state->pre_input_hook); @@ -141,6 +146,26 @@ decode(const char *s) } +/* +Explicitly disable bracketed paste in the interactive interpreter, even if it's +set in the inputrc, is enabled by default (eg GNU Readline 8.1), or a user calls +readline.read_init_file(). The Python REPL has not implemented bracketed +paste support. Also, bracketed mode writes the "\x1b[?2004h" escape sequence +into stdout which causes test failures in applications that don't support it. +It can still be explicitly enabled by calling readline.parse_and_bind("set +enable-bracketed-paste on"). See bpo-42819 for more details. + +This should be removed if bracketed paste mode is implemented (bpo-39820). +*/ + +static void +disable_bracketed_paste(void) +{ + if (!using_libedit_emulation) { + rl_variable_bind ("enable-bracketed-paste", "off"); + } +} + /* Exported function to send one line to readline's init file parser */ static PyObject * @@ -187,6 +212,7 @@ read_init_file(PyObject *self, PyObject *args) errno = rl_read_init_file(NULL); if (errno) return PyErr_SetFromErrno(PyExc_OSError); + disable_bracketed_paste(); Py_RETURN_NONE; } @@ -229,7 +255,7 @@ static PyObject * write_history_file(PyObject *self, PyObject *args) { PyObject *filename_obj = Py_None, *filename_bytes; - char *filename; + const char *filename; int err; if (!PyArg_ParseTuple(args, "|O:write_history_file", &filename_obj)) return NULL; @@ -265,7 +291,7 @@ append_history_file(PyObject *self, PyObject *args) { int nelements; PyObject *filename_obj = Py_None, *filename_bytes; - char *filename; + const char *filename; int err; if (!PyArg_ParseTuple(args, "i|O:append_history_file", &nelements, &filename_obj)) return NULL; @@ -864,7 +890,7 @@ on_hook(PyObject *func) int result = 0; if (func != NULL) { PyObject *r; - r = _PyObject_CallNoArg(func); + r = PyObject_CallNoArgs(func); if (r == NULL) goto error; if (r == Py_None) @@ -1063,15 +1089,16 @@ flex_complete(const char *text, int start, int end) } -/* Helper to initialize GNU readline properly. */ - -static void +/* Helper to initialize GNU readline properly. + Return -1 on memory allocation failure, return 0 on success. */ +static int setup_readline(readlinestate *mod_state) { #ifdef SAVE_LOCALE char *saved_locale = strdup(setlocale(LC_CTYPE, NULL)); - if (!saved_locale) - Py_FatalError("not enough memory to save locale"); + if (!saved_locale) { + return -1; + } #endif /* The name must be defined before initialization */ @@ -1146,7 +1173,10 @@ setup_readline(readlinestate *mod_state) else rl_initialize(); + disable_bracketed_paste(); + RESTORE_LOCALE(saved_locale) + return 0; } /* Wrapper around GNU readline that handles signals differently. */ @@ -1354,7 +1384,10 @@ PyInit_readline(void) mod_state = (readlinestate *) PyModule_GetState(m); PyOS_ReadlineFunctionPointer = call_readline; - setup_readline(mod_state); + if (setup_readline(mod_state) < 0) { + PyErr_NoMemory(); + goto error; + } return m; diff --git a/Modules/resource.c b/Modules/resource.c index afde03c6c7e55983ff3f8fa615e8d840a453de2b..ddbf80be9c69eb0c51802049a82de87d74246bc5 100644 --- a/Modules/resource.c +++ b/Modules/resource.c @@ -340,155 +340,174 @@ resource_methods[] = { /* Module initialization */ -static struct PyModuleDef resourcemodule = { - PyModuleDef_HEAD_INIT, - "resource", - NULL, - -1, - resource_methods, - NULL, - NULL, - NULL, - NULL -}; - -PyMODINIT_FUNC -PyInit_resource(void) +static int +resource_exec(PyObject *module) { - PyObject *m, *v; - - /* Create the module and add the functions */ - m = PyModule_Create(&resourcemodule); - if (m == NULL) - return NULL; +#define ADD_INT(module, value) \ + do { \ + if (PyModule_AddIntConstant(module, #value, value) < 0) { \ + return -1; \ + } \ + } while (0) /* Add some symbolic constants to the module */ Py_INCREF(PyExc_OSError); - PyModule_AddObject(m, "error", PyExc_OSError); + if (PyModule_AddObject(module, "error", PyExc_OSError) < 0) { + Py_DECREF(PyExc_OSError); + return -1; + } if (!initialized) { if (PyStructSequence_InitType2(&StructRUsageType, &struct_rusage_desc) < 0) - return NULL; + return -1; } - Py_INCREF(&StructRUsageType); - PyModule_AddObject(m, "struct_rusage", - (PyObject*) &StructRUsageType); + if(PyModule_AddType(module, &StructRUsageType) < 0) { + return -1; + } /* insert constants */ #ifdef RLIMIT_CPU - PyModule_AddIntMacro(m, RLIMIT_CPU); + ADD_INT(module, RLIMIT_CPU); #endif #ifdef RLIMIT_FSIZE - PyModule_AddIntMacro(m, RLIMIT_FSIZE); + ADD_INT(module, RLIMIT_FSIZE); #endif #ifdef RLIMIT_DATA - PyModule_AddIntMacro(m, RLIMIT_DATA); + ADD_INT(module, RLIMIT_DATA); #endif #ifdef RLIMIT_STACK - PyModule_AddIntMacro(m, RLIMIT_STACK); + ADD_INT(module, RLIMIT_STACK); #endif #ifdef RLIMIT_CORE - PyModule_AddIntMacro(m, RLIMIT_CORE); + ADD_INT(module, RLIMIT_CORE); #endif #ifdef RLIMIT_NOFILE - PyModule_AddIntMacro(m, RLIMIT_NOFILE); + ADD_INT(module, RLIMIT_NOFILE); #endif #ifdef RLIMIT_OFILE - PyModule_AddIntMacro(m, RLIMIT_OFILE); + ADD_INT(module, RLIMIT_OFILE); #endif #ifdef RLIMIT_VMEM - PyModule_AddIntMacro(m, RLIMIT_VMEM); + ADD_INT(module, RLIMIT_VMEM); #endif #ifdef RLIMIT_AS - PyModule_AddIntMacro(m, RLIMIT_AS); + ADD_INT(module, RLIMIT_AS); #endif #ifdef RLIMIT_RSS - PyModule_AddIntMacro(m, RLIMIT_RSS); + ADD_INT(module, RLIMIT_RSS); #endif #ifdef RLIMIT_NPROC - PyModule_AddIntMacro(m, RLIMIT_NPROC); + ADD_INT(module, RLIMIT_NPROC); #endif #ifdef RLIMIT_MEMLOCK - PyModule_AddIntMacro(m, RLIMIT_MEMLOCK); + ADD_INT(module, RLIMIT_MEMLOCK); #endif #ifdef RLIMIT_SBSIZE - PyModule_AddIntMacro(m, RLIMIT_SBSIZE); + ADD_INT(module, RLIMIT_SBSIZE); #endif /* Linux specific */ #ifdef RLIMIT_MSGQUEUE - PyModule_AddIntMacro(m, RLIMIT_MSGQUEUE); + ADD_INT(module, RLIMIT_MSGQUEUE); #endif #ifdef RLIMIT_NICE - PyModule_AddIntMacro(m, RLIMIT_NICE); + ADD_INT(module, RLIMIT_NICE); #endif #ifdef RLIMIT_RTPRIO - PyModule_AddIntMacro(m, RLIMIT_RTPRIO); + ADD_INT(module, RLIMIT_RTPRIO); #endif #ifdef RLIMIT_RTTIME - PyModule_AddIntMacro(m, RLIMIT_RTTIME); + ADD_INT(module, RLIMIT_RTTIME); #endif #ifdef RLIMIT_SIGPENDING - PyModule_AddIntMacro(m, RLIMIT_SIGPENDING); + ADD_INT(module, RLIMIT_SIGPENDING); #endif /* target */ #ifdef RUSAGE_SELF - PyModule_AddIntMacro(m, RUSAGE_SELF); + ADD_INT(module, RUSAGE_SELF); #endif #ifdef RUSAGE_CHILDREN - PyModule_AddIntMacro(m, RUSAGE_CHILDREN); + ADD_INT(module, RUSAGE_CHILDREN); #endif #ifdef RUSAGE_BOTH - PyModule_AddIntMacro(m, RUSAGE_BOTH); + ADD_INT(module, RUSAGE_BOTH); #endif #ifdef RUSAGE_THREAD - PyModule_AddIntMacro(m, RUSAGE_THREAD); + ADD_INT(module, RUSAGE_THREAD); #endif /* FreeBSD specific */ #ifdef RLIMIT_SWAP - PyModule_AddIntMacro(m, RLIMIT_SWAP); + ADD_INT(module, RLIMIT_SWAP); #endif #ifdef RLIMIT_SBSIZE - PyModule_AddIntMacro(m, RLIMIT_SBSIZE); + ADD_INT(module, RLIMIT_SBSIZE); #endif #ifdef RLIMIT_NPTS - PyModule_AddIntMacro(m, RLIMIT_NPTS); + ADD_INT(module, RLIMIT_NPTS); #endif + PyObject *v; if (sizeof(RLIM_INFINITY) > sizeof(long)) { v = PyLong_FromLongLong((long long) RLIM_INFINITY); } else { v = PyLong_FromLong((long) RLIM_INFINITY); } - if (v) { - PyModule_AddObject(m, "RLIM_INFINITY", v); + if (!v) { + return -1; + } + + if (PyModule_AddObject(module, "RLIM_INFINITY", v) < 0) { + Py_DECREF(v); + return -1; } + initialized = 1; - return m; + return 0; + +#undef ADD_INT +} + +static struct PyModuleDef_Slot resource_slots[] = { + {Py_mod_exec, resource_exec}, + {0, NULL} +}; + +static struct PyModuleDef resourcemodule = { + PyModuleDef_HEAD_INIT, + .m_name = "resource", + .m_size = 0, + .m_methods = resource_methods, + .m_slots = resource_slots, +}; + +PyMODINIT_FUNC +PyInit_resource(void) +{ + return PyModuleDef_Init(&resourcemodule); } diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index a71b64223d049a8a48c900d4b2b9bd4794a12b3e..fb71e9196f32a0b4c9f60d73dbf149452c39859d 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -9,7 +9,7 @@ #endif #include "Python.h" -#include +#include "structmember.h" // PyMemberDef #ifdef HAVE_SYS_DEVPOLL_H #include @@ -58,14 +58,35 @@ extern void bzero(void *, int); # define SOCKET int #endif +typedef struct { + PyObject *close; + PyTypeObject *poll_Type; + PyTypeObject *devpoll_Type; + PyTypeObject *pyEpoll_Type; + PyTypeObject *kqueue_event_Type; + PyTypeObject *kqueue_queue_Type; +} _selectstate; + +static struct PyModuleDef selectmodule; + +static inline _selectstate* +get_select_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_selectstate *)state; +} + +#define _selectstate_global get_select_state(PyState_FindModule(&selectmodule)) + /*[clinic input] module select class select.poll "pollObject *" "&poll_Type" class select.devpoll "devpollObject *" "&devpoll_Type" class select.epoll "pyEpoll_Object *" "&pyEpoll_Type" -class select.kqueue "kqueue_queue_Object *" "&kqueue_queue_Type" +class select.kqueue "kqueue_queue_Object *" "_selectstate_global->kqueue_queue_Type" [clinic start generated code]*/ -/*[clinic end generated code: output=da39a3ee5e6b4b0d input=ded80abdad2b7552]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=41071028e0ede093]*/ static int fildes_converter(PyObject *o, void *p) @@ -400,8 +421,6 @@ typedef struct { int poll_running; } pollObject; -static PyTypeObject poll_Type; - /* Update the malloc'ed array of pollfds to match the dictionary contained within a pollObject. Return 1 on success, 0 on an error. */ @@ -709,7 +728,7 @@ static pollObject * newPollObject(void) { pollObject *self; - self = PyObject_New(pollObject, &poll_Type); + self = PyObject_New(pollObject, _selectstate_global->poll_Type); if (self == NULL) return NULL; /* ufd_uptodate is a Boolean, denoting whether the @@ -725,17 +744,28 @@ newPollObject(void) return self; } +static PyObject * +poll_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) +{ + PyErr_Format(PyExc_TypeError, "Cannot create '%.200s' instances", _PyType_Name(type)); + return NULL; +} + static void poll_dealloc(pollObject *self) { + PyObject* type = (PyObject *)Py_TYPE(self); if (self->ufds != NULL) PyMem_DEL(self->ufds); Py_XDECREF(self->dict); PyObject_Del(self); + Py_DECREF(type); } #ifdef HAVE_SYS_DEVPOLL_H +static PyMethodDef devpoll_methods[]; + typedef struct { PyObject_HEAD int fd_devpoll; @@ -744,8 +774,6 @@ typedef struct { struct pollfd *fds; } devpollObject; -static PyTypeObject devpoll_Type; - static PyObject * devpoll_err_closed(void) { @@ -1091,7 +1119,7 @@ newDevPollObject(void) return NULL; } - self = PyObject_New(devpollObject, &devpoll_Type); + self = PyObject_New(devpollObject, _selectstate_global->devpoll_Type); if (self == NULL) { close(fd_devpoll); PyMem_DEL(fds); @@ -1105,14 +1133,39 @@ newDevPollObject(void) return self; } +static PyObject * +devpoll_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) +{ + PyErr_Format(PyExc_TypeError, "Cannot create '%.200s' instances", _PyType_Name(type)); + return NULL; +} + static void devpoll_dealloc(devpollObject *self) { + PyObject *type = (PyObject *)Py_TYPE(self); (void)devpoll_internal_close(self); PyMem_DEL(self->fds); PyObject_Del(self); + Py_DECREF(type); } +static PyType_Slot devpoll_Type_slots[] = { + {Py_tp_dealloc, devpoll_dealloc}, + {Py_tp_getset, devpoll_getsetlist}, + {Py_tp_methods, devpoll_methods}, + {Py_tp_new, devpoll_new}, + {0, 0}, +}; + +static PyType_Spec devpoll_Type_spec = { + "select.devpoll", + sizeof(devpollObject), + 0, + Py_TPFLAGS_DEFAULT, + devpoll_Type_slots +}; + #endif /* HAVE_SYS_DEVPOLL_H */ @@ -1201,8 +1254,7 @@ typedef struct { SOCKET epfd; /* epoll control file descriptor */ } pyEpoll_Object; -static PyTypeObject pyEpoll_Type; -#define pyepoll_CHECK(op) (PyObject_TypeCheck((op), &pyEpoll_Type)) +#define pyepoll_CHECK(op) (PyObject_TypeCheck((op), _selectstate_global->pyEpoll_Type)) static PyObject * pyepoll_err_closed(void) @@ -1230,9 +1282,10 @@ static PyObject * newPyEpoll_Object(PyTypeObject *type, int sizehint, SOCKET fd) { pyEpoll_Object *self; - - assert(type != NULL && type->tp_alloc != NULL); - self = (pyEpoll_Object *) type->tp_alloc(type, 0); + assert(type != NULL); + allocfunc epoll_alloc = PyType_GetSlot(type, Py_tp_alloc); + assert(epoll_alloc != NULL); + self = (pyEpoll_Object *) epoll_alloc(type, 0); if (self == NULL) return NULL; @@ -1307,8 +1360,11 @@ select_epoll_impl(PyTypeObject *type, int sizehint, int flags) static void pyepoll_dealloc(pyEpoll_Object *self) { + PyTypeObject* type = Py_TYPE(self); (void)pyepoll_internal_close(self); - Py_TYPE(self)->tp_free(self); + freefunc epoll_free = PyType_GetSlot(type, Py_tp_free); + epoll_free((PyObject *)self); + Py_DECREF((PyObject *)type); } /*[clinic input] @@ -1400,11 +1456,6 @@ pyepoll_internal_ctl(int epfd, int op, int fd, unsigned int events) * though this argument is ignored. */ Py_BEGIN_ALLOW_THREADS result = epoll_ctl(epfd, op, fd, &ev); - if (errno == EBADF) { - /* fd already closed */ - result = 0; - errno = 0; - } Py_END_ALLOW_THREADS break; default: @@ -1632,9 +1683,7 @@ select_epoll___exit___impl(pyEpoll_Object *self, PyObject *exc_type, PyObject *exc_value, PyObject *exc_tb) /*[clinic end generated code: output=c480f38ce361748e input=7ae81a5a4c1a98d8]*/ { - _Py_IDENTIFIER(close); - - return _PyObject_CallMethodId((PyObject *)self, &PyId_close, NULL); + return PyObject_CallMethodObjArgs((PyObject *)self, _selectstate_global->close, NULL); } static PyGetSetDef pyepoll_getsetlist[] = { @@ -1643,6 +1692,15 @@ static PyGetSetDef pyepoll_getsetlist[] = { {0}, }; +PyDoc_STRVAR(pyepoll_doc, +"select.epoll(sizehint=-1, flags=0)\n\ +\n\ +Returns an epolling object\n\ +\n\ +sizehint must be a positive integer or -1 for the default size. The\n\ +sizehint is used to optimize internal data structures. It doesn't limit\n\ +the maximum number of monitored events."); + #endif /* HAVE_EPOLL */ #ifdef HAVE_KQUEUE @@ -1699,18 +1757,14 @@ typedef struct { struct kevent e; } kqueue_event_Object; -static PyTypeObject kqueue_event_Type; - -#define kqueue_event_Check(op) (PyObject_TypeCheck((op), &kqueue_event_Type)) +#define kqueue_event_Check(op) (PyObject_TypeCheck((op), _selectstate_global->kqueue_event_Type)) typedef struct { PyObject_HEAD SOCKET kqfd; /* kqueue control fd */ } kqueue_queue_Object; -static PyTypeObject kqueue_queue_Type; - -#define kqueue_queue_Check(op) (PyObject_TypeCheck((op), &kqueue_queue_Type)) +#define kqueue_queue_Check(op) (PyObject_TypeCheck((op), _selectstate_global->kqueue_queue_Type)) #if (SIZEOF_UINTPTR_T != SIZEOF_VOID_P) # error uintptr_t does not match void *! @@ -1870,6 +1924,24 @@ kqueue_event_richcompare(kqueue_event_Object *s, kqueue_event_Object *o, Py_RETURN_RICHCOMPARE(result, 0, op); } +static PyType_Slot kqueue_event_Type_slots[] = { + {Py_tp_doc, (void*)kqueue_event_doc}, + {Py_tp_init, kqueue_event_init}, + {Py_tp_members, kqueue_event_members}, + {Py_tp_new, PyType_GenericNew}, + {Py_tp_repr, kqueue_event_repr}, + {Py_tp_richcompare, kqueue_event_richcompare}, + {0, 0}, +}; + +static PyType_Spec kqueue_event_Type_spec = { + "select.kevent", + sizeof(kqueue_event_Object), + 0, + Py_TPFLAGS_DEFAULT, + kqueue_event_Type_slots +}; + static PyObject * kqueue_queue_err_closed(void) { @@ -1896,8 +1968,10 @@ static PyObject * newKqueue_Object(PyTypeObject *type, SOCKET fd) { kqueue_queue_Object *self; - assert(type != NULL && type->tp_alloc != NULL); - self = (kqueue_queue_Object *) type->tp_alloc(type, 0); + assert(type != NULL); + allocfunc queue_alloc = PyType_GetSlot(type, Py_tp_alloc); + assert(queue_alloc != NULL); + self = (kqueue_queue_Object *) queue_alloc(type, 0); if (self == NULL) { return NULL; } @@ -1954,8 +2028,11 @@ select_kqueue_impl(PyTypeObject *type) static void kqueue_queue_dealloc(kqueue_queue_Object *self) { + PyTypeObject* type = Py_TYPE(self); kqueue_queue_internal_close(self); - Py_TYPE(self)->tp_free(self); + freefunc kqueue_free = PyType_GetSlot(type, Py_tp_free); + kqueue_free((PyObject *)self); + Py_DECREF((PyObject *)type); } /*[clinic input] @@ -2072,7 +2149,7 @@ select_kqueue_control_impl(kqueue_queue_Object *self, PyObject *changelist, PyErr_Format(PyExc_TypeError, "timeout argument must be a number " "or None, got %.200s", - Py_TYPE(otimeout)->tp_name); + _PyType_Name(Py_TYPE(otimeout))); return NULL; } @@ -2168,7 +2245,7 @@ select_kqueue_control_impl(kqueue_queue_Object *self, PyObject *changelist, for (i = 0; i < gotevents; i++) { kqueue_event_Object *ch; - ch = PyObject_New(kqueue_event_Object, &kqueue_event_Type); + ch = PyObject_New(kqueue_event_Object, _selectstate_global->kqueue_event_Type); if (ch == NULL) { goto error; } @@ -2210,38 +2287,20 @@ static PyMethodDef poll_methods[] = { {NULL, NULL} /* sentinel */ }; -static PyTypeObject poll_Type = { - /* The ob_type field must be initialized in the module init function - * to be portable to Windows without using C++. */ - PyVarObject_HEAD_INIT(NULL, 0) - "select.poll", /*tp_name*/ - sizeof(pollObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)poll_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - poll_methods, /*tp_methods*/ + +static PyType_Slot poll_Type_slots[] = { + {Py_tp_dealloc, poll_dealloc}, + {Py_tp_methods, poll_methods}, + {Py_tp_new, poll_new}, + {0, 0}, +}; + +static PyType_Spec poll_Type_spec = { + "select.poll", + sizeof(pollObject), + 0, + Py_TPFLAGS_DEFAULT, + poll_Type_slots }; #ifdef HAVE_SYS_DEVPOLL_H @@ -2256,42 +2315,6 @@ static PyMethodDef devpoll_methods[] = { {NULL, NULL} /* sentinel */ }; -static PyTypeObject devpoll_Type = { - /* The ob_type field must be initialized in the module init function - * to be portable to Windows without using C++. */ - PyVarObject_HEAD_INIT(NULL, 0) - "select.devpoll", /*tp_name*/ - sizeof(devpollObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)devpoll_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - devpoll_methods, /*tp_methods*/ - 0, /* tp_members */ - devpoll_getsetlist, /* tp_getset */ -}; - #endif /* HAVE_SYS_DEVPOLL_H */ #endif /* HAVE_POLL */ @@ -2311,94 +2334,28 @@ static PyMethodDef pyepoll_methods[] = { {NULL, NULL}, }; -static PyTypeObject pyEpoll_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "select.epoll", /* tp_name */ - sizeof(pyEpoll_Object), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)pyepoll_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - select_epoll__doc__, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - pyepoll_methods, /* tp_methods */ - 0, /* tp_members */ - pyepoll_getsetlist, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - select_epoll, /* tp_new */ - 0, /* tp_free */ +static PyType_Slot pyEpoll_Type_slots[] = { + {Py_tp_dealloc, pyepoll_dealloc}, + {Py_tp_doc, (void*)pyepoll_doc}, + {Py_tp_getattro, PyObject_GenericGetAttr}, + {Py_tp_getset, pyepoll_getsetlist}, + {Py_tp_methods, pyepoll_methods}, + {Py_tp_new, select_epoll}, + {0, 0}, +}; + +static PyType_Spec pyEpoll_Type_spec = { + "select.epoll", + sizeof(pyEpoll_Object), + 0, + Py_TPFLAGS_DEFAULT, + pyEpoll_Type_slots }; #endif /* HAVE_EPOLL */ #ifdef HAVE_KQUEUE -static PyTypeObject kqueue_event_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "select.kevent", /* tp_name */ - sizeof(kqueue_event_Object), /* tp_basicsize */ - 0, /* tp_itemsize */ - 0, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - (reprfunc)kqueue_event_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - kqueue_event_doc, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - (richcmpfunc)kqueue_event_richcompare, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - kqueue_event_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)kqueue_event_init, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0, /* tp_free */ -}; - static PyMethodDef kqueue_queue_methods[] = { SELECT_KQUEUE_FROMFD_METHODDEF SELECT_KQUEUE_CLOSE_METHODDEF @@ -2407,46 +2364,21 @@ static PyMethodDef kqueue_queue_methods[] = { {NULL, NULL}, }; -static PyTypeObject kqueue_queue_Type = { - PyVarObject_HEAD_INIT(NULL, 0) - "select.kqueue", /* tp_name */ - sizeof(kqueue_queue_Object), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)kqueue_queue_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - select_kqueue__doc__, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - kqueue_queue_methods, /* tp_methods */ - 0, /* tp_members */ - kqueue_queue_getsetlist, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - select_kqueue, /* tp_new */ - 0, /* tp_free */ +static PyType_Slot kqueue_queue_Type_slots[] = { + {Py_tp_dealloc, kqueue_queue_dealloc}, + {Py_tp_doc, (void*)select_kqueue__doc__}, + {Py_tp_getset, kqueue_queue_getsetlist}, + {Py_tp_methods, kqueue_queue_methods}, + {Py_tp_new, select_kqueue}, + {0, 0}, +}; + +static PyType_Spec kqueue_queue_Type_spec = { + "select.kqueue", + sizeof(kqueue_queue_Object), + 0, + Py_TPFLAGS_DEFAULT, + kqueue_queue_Type_slots }; #endif /* HAVE_KQUEUE */ @@ -2472,21 +2404,49 @@ PyDoc_STRVAR(module_doc, On Windows, only sockets are supported; on Unix, all file descriptors."); + +static int +_select_traverse(PyObject *module, visitproc visit, void *arg) +{ + Py_VISIT(get_select_state(module)->close); + Py_VISIT(get_select_state(module)->poll_Type); + Py_VISIT(get_select_state(module)->devpoll_Type); + Py_VISIT(get_select_state(module)->pyEpoll_Type); + Py_VISIT(get_select_state(module)->kqueue_event_Type); + Py_VISIT(get_select_state(module)->kqueue_queue_Type); + return 0; +} + +static int +_select_clear(PyObject *module) +{ + Py_CLEAR(get_select_state(module)->close); + Py_CLEAR(get_select_state(module)->poll_Type); + Py_CLEAR(get_select_state(module)->devpoll_Type); + Py_CLEAR(get_select_state(module)->pyEpoll_Type); + Py_CLEAR(get_select_state(module)->kqueue_event_Type); + Py_CLEAR(get_select_state(module)->kqueue_queue_Type); + return 0; +} + +static void +_select_free(void *module) +{ + _select_clear((PyObject *)module); +} + static struct PyModuleDef selectmodule = { PyModuleDef_HEAD_INIT, "select", module_doc, - -1, + sizeof(_selectstate), select_methods, NULL, - NULL, - NULL, - NULL + _select_traverse, + _select_clear, + _select_free, }; - - - PyMODINIT_FUNC PyInit_select(void) { @@ -2495,6 +2455,8 @@ PyInit_select(void) if (m == NULL) return NULL; + get_select_state(m)->close = PyUnicode_InternFromString("close"); + Py_INCREF(PyExc_OSError); PyModule_AddObject(m, "error", PyExc_OSError); @@ -2516,8 +2478,12 @@ PyInit_select(void) #else { #endif - if (PyType_Ready(&poll_Type) < 0) + PyObject *poll_Type = PyType_FromSpec(&poll_Type_spec); + if (poll_Type == NULL) return NULL; + get_select_state(m)->poll_Type = (PyTypeObject *)poll_Type; + Py_INCREF(poll_Type); + PyModule_AddIntMacro(m, POLLIN); PyModule_AddIntMacro(m, POLLPRI); PyModule_AddIntMacro(m, POLLOUT); @@ -2548,17 +2514,20 @@ PyInit_select(void) #endif /* HAVE_POLL */ #ifdef HAVE_SYS_DEVPOLL_H - if (PyType_Ready(&devpoll_Type) < 0) + PyObject *devpoll_Type = PyType_FromSpec(&devpoll_Type_spec); + if (devpoll_Type == NULL) return NULL; + get_select_state(m)->devpoll_Type = (PyTypeObject *)devpoll_Type; + Py_INCREF(devpoll_Type); #endif #ifdef HAVE_EPOLL - Py_TYPE(&pyEpoll_Type) = &PyType_Type; - if (PyType_Ready(&pyEpoll_Type) < 0) + PyObject *pyEpoll_Type = PyType_FromSpec(&pyEpoll_Type_spec); + if (pyEpoll_Type == NULL) return NULL; - - Py_INCREF(&pyEpoll_Type); - PyModule_AddObject(m, "epoll", (PyObject *) &pyEpoll_Type); + get_select_state(m)->pyEpoll_Type = (PyTypeObject *)pyEpoll_Type; + Py_INCREF(pyEpoll_Type); + PyModule_AddObject(m, "epoll", (PyObject *)get_select_state(m)->pyEpoll_Type); PyModule_AddIntMacro(m, EPOLLIN); PyModule_AddIntMacro(m, EPOLLOUT); @@ -2600,19 +2569,19 @@ PyInit_select(void) #endif /* HAVE_EPOLL */ #ifdef HAVE_KQUEUE - kqueue_event_Type.tp_new = PyType_GenericNew; - Py_TYPE(&kqueue_event_Type) = &PyType_Type; - if(PyType_Ready(&kqueue_event_Type) < 0) + PyObject *kqueue_event_Type = PyType_FromSpec(&kqueue_event_Type_spec); + if (kqueue_event_Type == NULL) return NULL; + get_select_state(m)->kqueue_event_Type = (PyTypeObject *)kqueue_event_Type; + Py_INCREF(get_select_state(m)->kqueue_event_Type); + PyModule_AddObject(m, "kevent", kqueue_event_Type); - Py_INCREF(&kqueue_event_Type); - PyModule_AddObject(m, "kevent", (PyObject *)&kqueue_event_Type); - - Py_TYPE(&kqueue_queue_Type) = &PyType_Type; - if(PyType_Ready(&kqueue_queue_Type) < 0) + PyObject *kqueue_queue_Type = PyType_FromSpec(&kqueue_queue_Type_spec); + if (kqueue_queue_Type == NULL) return NULL; - Py_INCREF(&kqueue_queue_Type); - PyModule_AddObject(m, "kqueue", (PyObject *)&kqueue_queue_Type); + get_select_state(m)->kqueue_queue_Type = (PyTypeObject *)kqueue_queue_Type; + Py_INCREF(get_select_state(m)->kqueue_queue_Type); + PyModule_AddObject(m, "kqueue", kqueue_queue_Type); /* event filters */ PyModule_AddIntConstant(m, "KQ_FILTER_READ", EVFILT_READ); diff --git a/Modules/sha1module.c b/Modules/sha1module.c index ce2ad267e775b70d293f94dcfc2896877b6be13e..9c75cc99dba77130dcf8b7b67679641a89d06b11 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -74,7 +74,7 @@ typedef struct { * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + * Tom St Denis, tomstdenis@gmail.com, https://www.libtom.net */ /* rotate the hard way (platform optimizations could be done) */ @@ -480,13 +480,15 @@ static PyTypeObject SHA1type = { _sha1.sha1 string: object(c_default="NULL") = b'' + * + usedforsecurity: bool = True Return a new SHA1 hash object; optionally initialized with a string. [clinic start generated code]*/ static PyObject * -_sha1_sha1_impl(PyObject *module, PyObject *string) -/*[clinic end generated code: output=e5982830d1dece51 input=27ea54281d995ec2]*/ +_sha1_sha1_impl(PyObject *module, PyObject *string, int usedforsecurity) +/*[clinic end generated code: output=6f8b3af05126e18e input=bd54b68e2bf36a8a]*/ { SHA1object *new; Py_buffer buf; @@ -527,9 +529,6 @@ static struct PyMethodDef SHA1_functions[] = { /* Initialize this module. */ -#define insint(n,v) { PyModule_AddIntConstant(m,n,v); } - - static struct PyModuleDef _sha1module = { PyModuleDef_HEAD_INIT, "_sha1", @@ -547,13 +546,15 @@ PyInit__sha1(void) { PyObject *m; - Py_TYPE(&SHA1type) = &PyType_Type; - if (PyType_Ready(&SHA1type) < 0) + Py_SET_TYPE(&SHA1type, &PyType_Type); + if (PyType_Ready(&SHA1type) < 0) { return NULL; + } m = PyModule_Create(&_sha1module); - if (m == NULL) + if (m == NULL) { return NULL; + } Py_INCREF((PyObject *)&SHA1type); PyModule_AddObject(m, "SHA1Type", (PyObject *)&SHA1type); diff --git a/Modules/sha256module.c b/Modules/sha256module.c index b8d6c4cf8006a1f18c0ef4b481ffb6494a16ab01..9b885c72553081a672416c0bee60163a1355a274 100644 --- a/Modules/sha256module.c +++ b/Modules/sha256module.c @@ -17,7 +17,8 @@ /* SHA objects */ #include "Python.h" -#include "structmember.h" +#include "pycore_byteswap.h" // _Py_bswap32() +#include "structmember.h" // PyMemberDef #include "hashlib.h" #include "pystrhex.h" @@ -30,12 +31,7 @@ class SHA256Type "SHAobject *" "&PyType_Type" /* Some useful types */ typedef unsigned char SHA_BYTE; - -#if SIZEOF_INT == 4 -typedef unsigned int SHA_INT32; /* 32-bit integer */ -#else -/* not defined. compilation will die. */ -#endif +typedef uint32_t SHA_INT32; /* 32-bit integer */ /* The SHA block size and message digest sizes, in bytes */ @@ -61,14 +57,9 @@ typedef struct { #if PY_LITTLE_ENDIAN static void longReverse(SHA_INT32 *buffer, int byteCount) { - SHA_INT32 value; - byteCount /= sizeof(*buffer); - while (byteCount--) { - value = *buffer; - value = ( ( value & 0xFF00FF00L ) >> 8 ) | \ - ( ( value & 0x00FF00FFL ) << 8 ); - *buffer++ = ( value << 16 ) | ( value >> 16 ); + for (; byteCount--; buffer++) { + *buffer = _Py_bswap32(*buffer); } } #endif @@ -102,7 +93,7 @@ static void SHAcopy(SHAobject *src, SHAobject *dest) * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@iahu.ca, http://libtom.org + * Tom St Denis, tomstdenis@iahu.ca, https://www.libtom.net */ @@ -413,7 +404,7 @@ SHA256Type_copy_impl(SHAobject *self) { SHAobject *newobj; - if (Py_TYPE(self) == &SHA256type) { + if (Py_IS_TYPE(self, &SHA256type)) { if ( (newobj = newSHA256object())==NULL) return NULL; } else { @@ -601,13 +592,15 @@ static PyTypeObject SHA256type = { _sha256.sha256 string: object(c_default="NULL") = b'' + * + usedforsecurity: bool = True Return a new SHA-256 hash object; optionally initialized with a string. [clinic start generated code]*/ static PyObject * -_sha256_sha256_impl(PyObject *module, PyObject *string) -/*[clinic end generated code: output=fa644436dcea5c31 input=09cce3fb855056b2]*/ +_sha256_sha256_impl(PyObject *module, PyObject *string, int usedforsecurity) +/*[clinic end generated code: output=a1de327e8e1185cf input=9be86301aeb14ea5]*/ { SHAobject *new; Py_buffer buf; @@ -641,13 +634,15 @@ _sha256_sha256_impl(PyObject *module, PyObject *string) _sha256.sha224 string: object(c_default="NULL") = b'' + * + usedforsecurity: bool = True Return a new SHA-224 hash object; optionally initialized with a string. [clinic start generated code]*/ static PyObject * -_sha256_sha224_impl(PyObject *module, PyObject *string) -/*[clinic end generated code: output=21e3ba22c3404f93 input=27a04ba24c353a73]*/ +_sha256_sha224_impl(PyObject *module, PyObject *string, int usedforsecurity) +/*[clinic end generated code: output=08be6b36569bc69c input=9fcfb46e460860ac]*/ { SHAobject *new; Py_buffer buf; @@ -689,9 +684,6 @@ static struct PyMethodDef SHA_functions[] = { /* Initialize this module. */ -#define insint(n,v) { PyModule_AddIntConstant(m,n,v); } - - static struct PyModuleDef _sha256module = { PyModuleDef_HEAD_INIT, "_sha256", @@ -709,12 +701,14 @@ PyInit__sha256(void) { PyObject *m; - Py_TYPE(&SHA224type) = &PyType_Type; - if (PyType_Ready(&SHA224type) < 0) + Py_SET_TYPE(&SHA224type, &PyType_Type); + if (PyType_Ready(&SHA224type) < 0) { return NULL; - Py_TYPE(&SHA256type) = &PyType_Type; - if (PyType_Ready(&SHA256type) < 0) + } + Py_SET_TYPE(&SHA256type, &PyType_Type); + if (PyType_Ready(&SHA256type) < 0) { return NULL; + } m = PyModule_Create(&_sha256module); if (m == NULL) diff --git a/Modules/sha512module.c b/Modules/sha512module.c index 98b97917f4caf874a1b56e73672a20f1957a49e3..831160c324d5593ce7729c41f433f792852495aa 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -17,7 +17,8 @@ /* SHA objects */ #include "Python.h" -#include "structmember.h" +#include "pycore_byteswap.h" // _Py_bswap32() +#include "structmember.h" // PyMemberDef #include "hashlib.h" #include "pystrhex.h" @@ -30,13 +31,8 @@ class SHA512Type "SHAobject *" "&PyType_Type" /* Some useful types */ typedef unsigned char SHA_BYTE; - -#if SIZEOF_INT == 4 -typedef unsigned int SHA_INT32; /* 32-bit integer */ -typedef unsigned long long SHA_INT64; /* 64-bit integer */ -#else -/* not defined. compilation will die. */ -#endif +typedef uint32_t SHA_INT32; /* 32-bit integer */ +typedef uint64_t SHA_INT64; /* 64-bit integer */ /* The SHA block size and message digest sizes, in bytes */ @@ -62,22 +58,9 @@ typedef struct { #if PY_LITTLE_ENDIAN static void longReverse(SHA_INT64 *buffer, int byteCount) { - SHA_INT64 value; - byteCount /= sizeof(*buffer); - while (byteCount--) { - value = *buffer; - - ((unsigned char*)buffer)[0] = (unsigned char)(value >> 56) & 0xff; - ((unsigned char*)buffer)[1] = (unsigned char)(value >> 48) & 0xff; - ((unsigned char*)buffer)[2] = (unsigned char)(value >> 40) & 0xff; - ((unsigned char*)buffer)[3] = (unsigned char)(value >> 32) & 0xff; - ((unsigned char*)buffer)[4] = (unsigned char)(value >> 24) & 0xff; - ((unsigned char*)buffer)[5] = (unsigned char)(value >> 16) & 0xff; - ((unsigned char*)buffer)[6] = (unsigned char)(value >> 8) & 0xff; - ((unsigned char*)buffer)[7] = (unsigned char)(value ) & 0xff; - - buffer++; + for (; byteCount--; buffer++) { + *buffer = _Py_bswap64(*buffer); } } #endif @@ -111,7 +94,7 @@ static void SHAcopy(SHAobject *src, SHAobject *dest) * The library is free for all purposes without any express * guarantee it works. * - * Tom St Denis, tomstdenis@iahu.ca, http://libtom.org + * Tom St Denis, tomstdenis@iahu.ca, https://www.libtom.net */ @@ -478,7 +461,7 @@ SHA512Type_copy_impl(SHAobject *self) { SHAobject *newobj; - if (((PyObject*)self)->ob_type == &SHA512type) { + if (Py_IS_TYPE((PyObject*)self, &SHA512type)) { if ( (newobj = newSHA512object())==NULL) return NULL; } else { @@ -666,13 +649,15 @@ static PyTypeObject SHA512type = { _sha512.sha512 string: object(c_default="NULL") = b'' + * + usedforsecurity: bool = True Return a new SHA-512 hash object; optionally initialized with a string. [clinic start generated code]*/ static PyObject * -_sha512_sha512_impl(PyObject *module, PyObject *string) -/*[clinic end generated code: output=8b865a2df73bd387 input=e69bad9ae9b6a308]*/ +_sha512_sha512_impl(PyObject *module, PyObject *string, int usedforsecurity) +/*[clinic end generated code: output=a8d9e5f9e6a0831c input=23b4daebc2ebb9c9]*/ { SHAobject *new; Py_buffer buf; @@ -706,13 +691,15 @@ _sha512_sha512_impl(PyObject *module, PyObject *string) _sha512.sha384 string: object(c_default="NULL") = b'' + * + usedforsecurity: bool = True Return a new SHA-384 hash object; optionally initialized with a string. [clinic start generated code]*/ static PyObject * -_sha512_sha384_impl(PyObject *module, PyObject *string) -/*[clinic end generated code: output=ae4b2e26decf81e8 input=c9327788d4ea4545]*/ +_sha512_sha384_impl(PyObject *module, PyObject *string, int usedforsecurity) +/*[clinic end generated code: output=da7d594a08027ac3 input=59ef72f039a6b431]*/ { SHAobject *new; Py_buffer buf; @@ -754,9 +741,6 @@ static struct PyMethodDef SHA_functions[] = { /* Initialize this module. */ -#define insint(n,v) { PyModule_AddIntConstant(m,n,v); } - - static struct PyModuleDef _sha512module = { PyModuleDef_HEAD_INIT, "_sha512", @@ -774,16 +758,19 @@ PyInit__sha512(void) { PyObject *m; - Py_TYPE(&SHA384type) = &PyType_Type; - if (PyType_Ready(&SHA384type) < 0) + Py_SET_TYPE(&SHA384type, &PyType_Type); + if (PyType_Ready(&SHA384type) < 0) { return NULL; - Py_TYPE(&SHA512type) = &PyType_Type; - if (PyType_Ready(&SHA512type) < 0) + } + Py_SET_TYPE(&SHA512type, &PyType_Type); + if (PyType_Ready(&SHA512type) < 0) { return NULL; + } m = PyModule_Create(&_sha512module); - if (m == NULL) + if (m == NULL) { return NULL; + } Py_INCREF((PyObject *)&SHA384type); PyModule_AddObject(m, "SHA384Type", (PyObject *)&SHA384type); diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 119fc355ff1fd5d3b21c3de9bdcef29a1635c679..540e2d90448044c992065ca7a6e46626db0a7136 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -5,8 +5,10 @@ #include "Python.h" #include "pycore_atomic.h" +#include "pycore_call.h" #include "pycore_ceval.h" -#include "pycore_pystate.h" +#include "pycore_pyerrors.h" +#include "pycore_pystate.h" // _PyThreadState_GET() #ifndef MS_WINDOWS #include "posixmodule.h" @@ -25,6 +27,9 @@ #ifdef HAVE_SIGNAL_H #include #endif +#ifdef HAVE_SYS_SYSCALL_H +#include +#endif #ifdef HAVE_SYS_STAT_H #include #endif @@ -99,8 +104,6 @@ class sigset_t_converter(CConverter): may not be the thread that received the signal. */ -#include "pythread.h" - static volatile struct { _Py_atomic_int tripped; PyObject *func; @@ -186,21 +189,6 @@ itimer_retval(struct itimerval *iv) } #endif -static int -is_main_interp(_PyRuntimeState *runtime, PyInterpreterState *interp) -{ - unsigned long thread = PyThread_get_thread_ident(); - return (thread == runtime->main_thread - && interp == runtime->interpreters.main); -} - -static int -is_main(_PyRuntimeState *runtime) -{ - PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp; - return is_main_interp(runtime, interp); -} - static PyObject * signal_default_int_handler(PyObject *self, PyObject *args) { @@ -262,10 +250,11 @@ trip_signal(int sig_num) cleared in PyErr_CheckSignals() before .tripped. */ _Py_atomic_store(&is_tripped, 1); + /* Signals are always handled by the main interpreter */ + PyInterpreterState *interp = _PyRuntime.interpreters.main; + /* Notify ceval.c */ - _PyRuntimeState *runtime = &_PyRuntime; - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - _PyEval_SignalReceived(&runtime->ceval); + _PyEval_SignalReceived(interp); /* And then write to the wakeup fd *after* setting all the globals and doing the _PyEval_SignalReceived. We used to write to the wakeup fd @@ -303,9 +292,9 @@ trip_signal(int sig_num) if (wakeup.warn_on_full_buffer || last_error != WSAEWOULDBLOCK) { - /* Py_AddPendingCall() isn't signal-safe, but we + /* _PyEval_AddPendingCall() isn't signal-safe, but we still use it for this exceptional case. */ - _PyEval_AddPendingCall(tstate, &runtime->ceval, + _PyEval_AddPendingCall(interp, report_wakeup_send_error, (void *)(intptr_t) last_error); } @@ -322,9 +311,9 @@ trip_signal(int sig_num) if (wakeup.warn_on_full_buffer || (errno != EWOULDBLOCK && errno != EAGAIN)) { - /* Py_AddPendingCall() isn't signal-safe, but we + /* _PyEval_AddPendingCall() isn't signal-safe, but we still use it for this exceptional case. */ - _PyEval_AddPendingCall(tstate, &runtime->ceval, + _PyEval_AddPendingCall(interp, report_wakeup_write_error, (void *)(intptr_t)errno); } @@ -481,43 +470,53 @@ signal_signal_impl(PyObject *module, int signalnum, PyObject *handler) } #endif - _PyRuntimeState *runtime = &_PyRuntime; - if (!is_main(runtime)) { - PyErr_SetString(PyExc_ValueError, - "signal only works in main thread"); + PyThreadState *tstate = _PyThreadState_GET(); + if (!_Py_ThreadCanHandleSignals(tstate->interp)) { + _PyErr_SetString(tstate, PyExc_ValueError, + "signal only works in main thread " + "of the main interpreter"); return NULL; } if (signalnum < 1 || signalnum >= NSIG) { - PyErr_SetString(PyExc_ValueError, - "signal number out of range"); + _PyErr_SetString(tstate, PyExc_ValueError, + "signal number out of range"); return NULL; } - if (handler == IgnoreHandler) + if (handler == IgnoreHandler) { func = SIG_IGN; - else if (handler == DefaultHandler) + } + else if (handler == DefaultHandler) { func = SIG_DFL; + } else if (!PyCallable_Check(handler)) { - PyErr_SetString(PyExc_TypeError, -"signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object"); - return NULL; + _PyErr_SetString(tstate, PyExc_TypeError, + "signal handler must be signal.SIG_IGN, " + "signal.SIG_DFL, or a callable object"); + return NULL; } - else + else { func = signal_handler; + } + /* Check for pending signals before changing signal handler */ - if (_PyErr_CheckSignals()) { + if (_PyErr_CheckSignalsTstate(tstate)) { return NULL; } if (PyOS_setsig(signalnum, func) == SIG_ERR) { PyErr_SetFromErrno(PyExc_OSError); return NULL; } + old_handler = Handlers[signalnum].func; Py_INCREF(handler); Handlers[signalnum].func = handler; - if (old_handler != NULL) + + if (old_handler != NULL) { return old_handler; - else + } + else { Py_RETURN_NONE; + } } @@ -699,10 +698,11 @@ signal_set_wakeup_fd(PyObject *self, PyObject *args, PyObject *kwds) return NULL; #endif - _PyRuntimeState *runtime = &_PyRuntime; - if (!is_main(runtime)) { - PyErr_SetString(PyExc_ValueError, - "set_wakeup_fd only works in main thread"); + PyThreadState *tstate = _PyThreadState_GET(); + if (!_Py_ThreadCanHandleSignals(tstate->interp)) { + _PyErr_SetString(tstate, PyExc_ValueError, + "set_wakeup_fd only works in main thread " + "of the main interpreter"); return NULL; } @@ -728,12 +728,13 @@ signal_set_wakeup_fd(PyObject *self, PyObject *args, PyObject *kwds) fd = (int)sockfd; if ((SOCKET_T)fd != sockfd) { - PyErr_SetString(PyExc_ValueError, "invalid fd"); + _PyErr_SetString(tstate, PyExc_ValueError, "invalid fd"); return NULL; } - if (_Py_fstat(fd, &status) != 0) + if (_Py_fstat(fd, &status) != 0) { return NULL; + } /* on Windows, a file cannot be set to non-blocking mode */ } @@ -765,9 +766,9 @@ signal_set_wakeup_fd(PyObject *self, PyObject *args, PyObject *kwds) if (blocking < 0) return NULL; if (blocking) { - PyErr_Format(PyExc_ValueError, - "the fd %i must be in non-blocking mode", - fd); + _PyErr_Format(tstate, PyExc_ValueError, + "the fd %i must be in non-blocking mode", + fd); return NULL; } } @@ -1260,6 +1261,38 @@ signal_pthread_kill_impl(PyObject *module, unsigned long thread_id, #endif /* #if defined(HAVE_PTHREAD_KILL) */ +#if defined(__linux__) && defined(__NR_pidfd_send_signal) +/*[clinic input] +signal.pidfd_send_signal + + pidfd: int + signalnum: int + siginfo: object = None + flags: int = 0 + / + +Send a signal to a process referred to by a pid file descriptor. +[clinic start generated code]*/ + +static PyObject * +signal_pidfd_send_signal_impl(PyObject *module, int pidfd, int signalnum, + PyObject *siginfo, int flags) +/*[clinic end generated code: output=2d59f04a75d9cbdf input=2a6543a1f4ac2000]*/ + +{ + if (siginfo != Py_None) { + PyErr_SetString(PyExc_TypeError, "siginfo must be None"); + return NULL; + } + if (syscall(__NR_pidfd_send_signal, pidfd, signalnum, NULL, flags) < 0) { + PyErr_SetFromErrno(PyExc_OSError); + return NULL; + } + Py_RETURN_NONE; +} +#endif + + /* List of functions defined in the module -- some of the methoddefs are defined to nothing if the corresponding C function is not available. */ @@ -1275,6 +1308,7 @@ static PyMethodDef signal_methods[] = { {"set_wakeup_fd", (PyCFunction)(void(*)(void))signal_set_wakeup_fd, METH_VARARGS | METH_KEYWORDS, set_wakeup_fd_doc}, SIGNAL_SIGINTERRUPT_METHODDEF SIGNAL_PAUSE_METHODDEF + SIGNAL_PIDFD_SEND_SIGNAL_METHODDEF SIGNAL_PTHREAD_KILL_METHODDEF SIGNAL_PTHREAD_SIGMASK_METHODDEF SIGNAL_SIGPENDING_METHODDEF @@ -1598,11 +1632,6 @@ PyInit__signal(void) goto finally; #endif -#ifdef MS_WINDOWS - /* Create manual-reset event, initially unset */ - sigint_event = CreateEvent(NULL, TRUE, FALSE, FALSE); -#endif - if (PyErr_Occurred()) { Py_DECREF(m); m = NULL; @@ -1641,24 +1670,22 @@ finisignal(void) int PyErr_CheckSignals(void) { - _PyRuntimeState *runtime = &_PyRuntime; - if (!is_main(runtime)) { + PyThreadState *tstate = _PyThreadState_GET(); + if (!_Py_ThreadCanHandleSignals(tstate->interp)) { return 0; } - return _PyErr_CheckSignals(); + return _PyErr_CheckSignalsTstate(tstate); } /* Declared in cpython/pyerrors.h */ int -_PyErr_CheckSignals(void) +_PyErr_CheckSignalsTstate(PyThreadState *tstate) { - int i; - PyObject *f; - - if (!_Py_atomic_load(&is_tripped)) + if (!_Py_atomic_load(&is_tripped)) { return 0; + } /* * The is_tripped variable is meant to speed up the calls to @@ -1676,33 +1703,48 @@ _PyErr_CheckSignals(void) */ _Py_atomic_store(&is_tripped, 0); - if (!(f = (PyObject *)PyEval_GetFrame())) - f = Py_None; + PyObject *frame = (PyObject *)tstate->frame; + if (!frame) { + frame = Py_None; + } - for (i = 1; i < NSIG; i++) { - if (_Py_atomic_load_relaxed(&Handlers[i].tripped)) { - PyObject *result = NULL; - PyObject *arglist = Py_BuildValue("(iO)", i, f); - _Py_atomic_store_relaxed(&Handlers[i].tripped, 0); - - if (arglist) { - result = PyEval_CallObject(Handlers[i].func, - arglist); - Py_DECREF(arglist); - } - if (!result) { - _Py_atomic_store(&is_tripped, 1); - return -1; - } + for (int i = 1; i < NSIG; i++) { + if (!_Py_atomic_load_relaxed(&Handlers[i].tripped)) { + continue; + } + _Py_atomic_store_relaxed(&Handlers[i].tripped, 0); - Py_DECREF(result); + PyObject *arglist = Py_BuildValue("(iO)", i, frame); + PyObject *result; + if (arglist) { + result = _PyObject_Call(tstate, Handlers[i].func, arglist, NULL); + Py_DECREF(arglist); + } + else { + result = NULL; } + if (!result) { + /* On error, re-schedule a call to _PyErr_CheckSignalsTstate() */ + _Py_atomic_store(&is_tripped, 1); + return -1; + } + + Py_DECREF(result); } return 0; } + +int +_PyErr_CheckSignals(void) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return _PyErr_CheckSignalsTstate(tstate); +} + + /* Simulate the effect of a signal.SIGINT signal arriving. The next time PyErr_CheckSignals is called, the Python SIGINT signal handler will be raised. @@ -1726,6 +1768,53 @@ PyOS_InitInterrupts(void) } } + +static int +signal_install_handlers(void) +{ +#ifdef SIGPIPE + PyOS_setsig(SIGPIPE, SIG_IGN); +#endif +#ifdef SIGXFZ + PyOS_setsig(SIGXFZ, SIG_IGN); +#endif +#ifdef SIGXFSZ + PyOS_setsig(SIGXFSZ, SIG_IGN); +#endif + + // Import _signal to install the Python SIGINT handler + PyObject *module = PyImport_ImportModule("_signal"); + if (!module) { + return -1; + } + Py_DECREF(module); + + return 0; +} + + +int +_PySignal_Init(int install_signal_handlers) +{ +#ifdef MS_WINDOWS + /* Create manual-reset event, initially unset */ + sigint_event = CreateEvent(NULL, TRUE, FALSE, FALSE); + if (sigint_event == NULL) { + PyErr_SetFromWindowsErr(0); + return -1; + } +#endif + + if (install_signal_handlers) { + if (signal_install_handlers() < 0) { + return -1; + } + } + + return 0; +} + + void PyOS_FiniInterrupts(void) { @@ -1737,15 +1826,17 @@ PyOS_FiniInterrupts(void) int _PyOS_InterruptOccurred(PyThreadState *tstate) { - if (_Py_atomic_load_relaxed(&Handlers[SIGINT].tripped)) { - _PyRuntimeState *runtime = &_PyRuntime; - if (!is_main_interp(runtime, tstate->interp)) { - return 0; - } - _Py_atomic_store_relaxed(&Handlers[SIGINT].tripped, 0); - return 1; + _Py_EnsureTstateNotNULL(tstate); + if (!_Py_ThreadCanHandleSignals(tstate->interp)) { + return 0; } - return 0; + + if (!_Py_atomic_load_relaxed(&Handlers[SIGINT].tripped)) { + return 0; + } + + _Py_atomic_store_relaxed(&Handlers[SIGINT].tripped, 0); + return 1; } @@ -1782,8 +1873,8 @@ _PySignal_AfterFork(void) int _PyOS_IsMainThread(void) { - _PyRuntimeState *runtime = &_PyRuntime; - return is_main(runtime); + PyInterpreterState *interp = _PyInterpreterState_GET(); + return _Py_ThreadCanHandleSignals(interp); } #ifdef MS_WINDOWS diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 5dc5f4e0d397b4e0c91beb1c6af6f8c73ca240c5..be75e681d45d99c5ab4b133deb8a469d0fdcf431 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -101,7 +101,7 @@ Local naming conventions: #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #ifdef _Py_MEMORY_SANITIZER # include @@ -146,7 +146,7 @@ recvfrom_into(buffer[, nbytes, [, flags])\n\ sendall(data[, flags]) -- send all data\n\ send(data[, flags]) -- send data, may not send all of it\n\ sendto(data[, flags], addr) -- send data to a given address\n\ -setblocking(0 | 1) -- set or clear the blocking I/O flag\n\ +setblocking(bool) -- set or clear the blocking I/O flag\n\ getblocking() -- return True if socket is blocking, False if non-blocking\n\ setsockopt(level, optname, value[, optlen]) -- set socket options\n\ settimeout(None | float) -- set or clear the timeout\n\ @@ -234,13 +234,8 @@ if_indextoname(index) -- return the corresponding interface name\n\ #define RELEASE_GETADDRINFO_LOCK #endif -#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK) -# include "pythread.h" -#endif - - #if defined(__APPLE__) || defined(__CYGWIN__) || defined(__NetBSD__) -# include +# include #endif @@ -478,13 +473,12 @@ remove_unusable_flags(PyObject *m) #endif #ifdef MS_WIN32 -#undef EAFNOSUPPORT -#define EAFNOSUPPORT WSAEAFNOSUPPORT -#define snprintf _snprintf +# undef EAFNOSUPPORT +# define EAFNOSUPPORT WSAEAFNOSUPPORT #endif #ifndef SOCKETCLOSE -#define SOCKETCLOSE close +# define SOCKETCLOSE close #endif #if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__) @@ -520,6 +514,15 @@ remove_unusable_flags(PyObject *m) #endif #endif +#ifdef MS_WINDOWS +#define sockaddr_rc SOCKADDR_BTH_REDEF + +#define USE_BLUETOOTH 1 +#define AF_BLUETOOTH AF_BTH +#define BTPROTO_RFCOMM BTHPROTO_RFCOMM +#define _BT_RC_MEMB(sa, memb) ((sa)->memb) +#endif + /* Convert "sock_addr_t *" to "struct sockaddr *". */ #define SAS2SA(x) (&((x)->sa)) @@ -649,7 +652,7 @@ set_herror(int h_error) PyObject *v; #ifdef HAVE_HSTRERROR - v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error)); + v = Py_BuildValue("(is)", h_error, hstrerror(h_error)); #else v = Py_BuildValue("(is)", h_error, "host not found"); #endif @@ -1267,12 +1270,23 @@ setbdaddr(const char *name, bdaddr_t *bdaddr) n = sscanf(name, "%X:%X:%X:%X:%X:%X%c", &b5, &b4, &b3, &b2, &b1, &b0, &ch); if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) { + +#ifdef MS_WINDOWS + *bdaddr = (ULONGLONG)(b0 & 0xFF); + *bdaddr |= ((ULONGLONG)(b1 & 0xFF) << 8); + *bdaddr |= ((ULONGLONG)(b2 & 0xFF) << 16); + *bdaddr |= ((ULONGLONG)(b3 & 0xFF) << 24); + *bdaddr |= ((ULONGLONG)(b4 & 0xFF) << 32); + *bdaddr |= ((ULONGLONG)(b5 & 0xFF) << 40); +#else bdaddr->b[0] = b0; bdaddr->b[1] = b1; bdaddr->b[2] = b2; bdaddr->b[3] = b3; bdaddr->b[4] = b4; bdaddr->b[5] = b5; +#endif + return 6; } else { PyErr_SetString(PyExc_OSError, "bad bluetooth address"); @@ -1289,9 +1303,23 @@ makebdaddr(bdaddr_t *bdaddr) { char buf[(6 * 2) + 5 + 1]; +#ifdef MS_WINDOWS + int i; + unsigned int octets[6]; + + for (i = 0; i < 6; ++i) { + octets[i] = ((*bdaddr) >> (8 * i)) & 0xFF; + } + + sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", + octets[5], octets[4], octets[3], + octets[2], octets[1], octets[0]); +#else sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", bdaddr->b[5], bdaddr->b[4], bdaddr->b[3], bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]); +#endif + return PyUnicode_FromString(buf); } #endif @@ -1389,6 +1417,7 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) case AF_BLUETOOTH: switch (proto) { +#ifdef BTPROTO_L2CAP case BTPROTO_L2CAP: { struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr; @@ -1403,6 +1432,8 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) return ret; } +#endif /* BTPROTO_L2CAP */ + case BTPROTO_RFCOMM: { struct sockaddr_rc *a = (struct sockaddr_rc *) addr; @@ -1417,6 +1448,7 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) return ret; } +#ifdef BTPROTO_HCI case BTPROTO_HCI: { struct sockaddr_hci *a = (struct sockaddr_hci *) addr; @@ -1436,6 +1468,7 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) return makebdaddr(&_BT_SCO_MEMB(a, bdaddr)); } #endif /* !__FreeBSD__ */ +#endif /* BTPROTO_HCI */ default: PyErr_SetString(PyExc_ValueError, @@ -1522,6 +1555,16 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) a->can_addr.tp.tx_id); } #endif /* CAN_ISOTP */ +#ifdef CAN_J1939 + case CAN_J1939: + { + return Py_BuildValue("O&KkB", PyUnicode_DecodeFSDefault, + ifname, + a->can_addr.j1939.name, + a->can_addr.j1939.pgn, + a->can_addr.j1939.addr); + } +#endif /* CAN_J1939 */ default: { return Py_BuildValue("(O&)", PyUnicode_DecodeFSDefault, @@ -1631,7 +1674,7 @@ idna_converter(PyObject *obj, struct maybe_idna *data) } else { PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s", - obj->ob_type->tp_name); + Py_TYPE(obj)->tp_name); return 0; } if (strlen(data->buf) != len) { @@ -1649,14 +1692,13 @@ idna_converter(PyObject *obj, struct maybe_idna *data) static int getsockaddrarg(PySocketSockObject *s, PyObject *args, - struct sockaddr *addr_ret, int *len_ret, const char *caller) + sock_addr_t *addrbuf, int *len_ret, const char *caller) { switch (s->sock_family) { #if defined(AF_UNIX) case AF_UNIX: { - struct sockaddr_un* addr; Py_buffer path; int retval = 0; @@ -1674,7 +1716,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, } assert(path.len >= 0); - addr = (struct sockaddr_un*)addr_ret; + struct sockaddr_un* addr = &addrbuf->un; #ifdef __linux__ if (path.len > 0 && *(const char *)path.buf == 0) { /* Linux abstract namespace extension */ @@ -1709,9 +1751,8 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, #if defined(AF_NETLINK) case AF_NETLINK: { - struct sockaddr_nl* addr; int pid, groups; - addr = (struct sockaddr_nl *)addr_ret; + struct sockaddr_nl* addr = &addrbuf->nl; if (!PyTuple_Check(args)) { PyErr_Format( PyExc_TypeError, @@ -1737,9 +1778,8 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, #if defined(AF_QIPCRTR) case AF_QIPCRTR: { - struct sockaddr_qrtr* addr; unsigned int node, port; - addr = (struct sockaddr_qrtr *)addr_ret; + struct sockaddr_qrtr* addr = &addrbuf->sq; if (!PyTuple_Check(args)) { PyErr_Format( PyExc_TypeError, @@ -1761,9 +1801,8 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, #if defined(AF_VSOCK) case AF_VSOCK: { - struct sockaddr_vm* addr; + struct sockaddr_vm* addr = &addrbuf->vm; int port, cid; - addr = (struct sockaddr_vm *)addr_ret; memset(addr, 0, sizeof(struct sockaddr_vm)); if (!PyTuple_Check(args)) { PyErr_Format( @@ -1791,7 +1830,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, case AF_INET: { - struct sockaddr_in* addr; struct maybe_idna host = {NULL, NULL}; int port, result; if (!PyTuple_Check(args)) { @@ -1813,7 +1851,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, } return 0; } - addr=(struct sockaddr_in*)addr_ret; + struct sockaddr_in* addr = &addrbuf->in; result = setipaddr(host.buf, (struct sockaddr *)addr, sizeof(*addr), AF_INET); idna_cleanup(&host); @@ -1834,7 +1872,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, #ifdef ENABLE_IPV6 case AF_INET6: { - struct sockaddr_in6* addr; struct maybe_idna host = {NULL, NULL}; int port, result; unsigned int flowinfo, scope_id; @@ -1859,7 +1896,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, } return 0; } - addr = (struct sockaddr_in6*)addr_ret; + struct sockaddr_in6* addr = &addrbuf->in6; result = setipaddr(host.buf, (struct sockaddr *)addr, sizeof(*addr), AF_INET6); idna_cleanup(&host); @@ -1890,12 +1927,12 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, case AF_BLUETOOTH: { switch (s->sock_proto) { +#ifdef BTPROTO_L2CAP case BTPROTO_L2CAP: { - struct sockaddr_l2 *addr; const char *straddr; - addr = (struct sockaddr_l2 *)addr_ret; + struct sockaddr_l2 *addr = &addrbuf->bt_l2; memset(addr, 0, sizeof(struct sockaddr_l2)); _BT_L2_MEMB(addr, family) = AF_BLUETOOTH; if (!PyArg_ParseTuple(args, "si", &straddr, @@ -1910,12 +1947,11 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, *len_ret = sizeof *addr; return 1; } +#endif /* BTPROTO_L2CAP */ case BTPROTO_RFCOMM: { - struct sockaddr_rc *addr; const char *straddr; - - addr = (struct sockaddr_rc *)addr_ret; + struct sockaddr_rc *addr = &addrbuf->bt_rc; _BT_RC_MEMB(addr, family) = AF_BLUETOOTH; if (!PyArg_ParseTuple(args, "si", &straddr, &_BT_RC_MEMB(addr, channel))) { @@ -1929,9 +1965,10 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, *len_ret = sizeof *addr; return 1; } +#ifdef BTPROTO_HCI case BTPROTO_HCI: { - struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret; + struct sockaddr_hci *addr = &addrbuf->bt_hci; #if defined(__NetBSD__) || defined(__DragonFly__) const char *straddr; _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH; @@ -1957,10 +1994,9 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, #if !defined(__FreeBSD__) case BTPROTO_SCO: { - struct sockaddr_sco *addr; const char *straddr; - addr = (struct sockaddr_sco *)addr_ret; + struct sockaddr_sco *addr = &addrbuf->bt_sco; _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH; if (!PyBytes_Check(args)) { PyErr_Format(PyExc_OSError, @@ -1975,6 +2011,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, return 1; } #endif /* !__FreeBSD__ */ +#endif /* BTPROTO_HCI */ default: PyErr_Format(PyExc_OSError, "%s(): unknown Bluetooth protocol", caller); @@ -1986,7 +2023,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, #if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX) case AF_PACKET: { - struct sockaddr_ll* addr; struct ifreq ifr; const char *interfaceName; int protoNumber; @@ -2037,7 +2073,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, PyBuffer_Release(&haddr); return 0; } - addr = (struct sockaddr_ll*)addr_ret; + struct sockaddr_ll* addr = &addrbuf->ll; addr->sll_family = AF_PACKET; addr->sll_protocol = htons((short)protoNumber); addr->sll_ifindex = ifr.ifr_ifindex; @@ -2060,7 +2096,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, { unsigned int atype, v1, v2, v3; unsigned int scope = TIPC_CLUSTER_SCOPE; - struct sockaddr_tipc *addr; if (!PyTuple_Check(args)) { PyErr_Format( @@ -2078,7 +2113,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, return 0; } - addr = (struct sockaddr_tipc *) addr_ret; + struct sockaddr_tipc *addr = &addrbuf->tipc; memset(addr, 0, sizeof(struct sockaddr_tipc)); addr->family = AF_TIPC; @@ -2119,11 +2154,10 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, #endif #if defined(CAN_RAW) || defined(CAN_BCM) { - struct sockaddr_can *addr; PyObject *interfaceName; struct ifreq ifr; Py_ssize_t len; - addr = (struct sockaddr_can *)addr_ret; + struct sockaddr_can *addr = &addrbuf->can; if (!PyTuple_Check(args)) { PyErr_Format(PyExc_TypeError, @@ -2170,13 +2204,12 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, #ifdef CAN_ISOTP case CAN_ISOTP: { - struct sockaddr_can *addr; PyObject *interfaceName; struct ifreq ifr; Py_ssize_t len; unsigned long int rx_id, tx_id; - addr = (struct sockaddr_can *)addr_ret; + struct sockaddr_can *addr = &addrbuf->can; if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter, &interfaceName, @@ -2213,6 +2246,55 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, return 1; } #endif /* CAN_ISOTP */ +#ifdef CAN_J1939 + case CAN_J1939: + { + PyObject *interfaceName; + struct ifreq ifr; + Py_ssize_t len; + uint64_t j1939_name; + uint32_t j1939_pgn; + uint8_t j1939_addr; + + struct sockaddr_can *addr = &addrbuf->can; + + if (!PyArg_ParseTuple(args, "O&KkB", PyUnicode_FSConverter, + &interfaceName, + &j1939_name, + &j1939_pgn, + &j1939_addr)) + return 0; + + len = PyBytes_GET_SIZE(interfaceName); + + if (len == 0) { + ifr.ifr_ifindex = 0; + } else if ((size_t)len < sizeof(ifr.ifr_name)) { + strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name)); + ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0'; + if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) { + s->errorhandler(); + Py_DECREF(interfaceName); + return 0; + } + } else { + PyErr_SetString(PyExc_OSError, + "AF_CAN interface name too long"); + Py_DECREF(interfaceName); + return 0; + } + + addr->can_family = AF_CAN; + addr->can_ifindex = ifr.ifr_ifindex; + addr->can_addr.j1939.name = j1939_name; + addr->can_addr.j1939.pgn = j1939_pgn; + addr->can_addr.j1939.addr = j1939_addr; + + *len_ret = sizeof(*addr); + Py_DECREF(interfaceName); + return 1; + } +#endif /* CAN_J1939 */ default: PyErr_Format(PyExc_OSError, "%s(): unsupported CAN protocol", caller); @@ -2226,9 +2308,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, #ifdef SYSPROTO_CONTROL case SYSPROTO_CONTROL: { - struct sockaddr_ctl *addr; - - addr = (struct sockaddr_ctl *)addr_ret; + struct sockaddr_ctl *addr = &addrbuf->ctl; addr->sc_family = AF_SYSTEM; addr->ss_sysaddr = AF_SYS_CONTROL; @@ -2280,10 +2360,9 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, #ifdef HAVE_SOCKADDR_ALG case AF_ALG: { - struct sockaddr_alg *sa; const char *type; const char *name; - sa = (struct sockaddr_alg *)addr_ret; + struct sockaddr_alg *sa = &addrbuf->alg; memset(sa, 0, sizeof(*sa)); sa->salg_family = AF_ALG; @@ -2396,12 +2475,15 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret) switch(s->sock_proto) { +#ifdef BTPROTO_L2CAP case BTPROTO_L2CAP: *len_ret = sizeof (struct sockaddr_l2); return 1; +#endif /* BTPROTO_L2CAP */ case BTPROTO_RFCOMM: *len_ret = sizeof (struct sockaddr_rc); return 1; +#ifdef BTPROTO_HCI case BTPROTO_HCI: *len_ret = sizeof (struct sockaddr_hci); return 1; @@ -2410,6 +2492,7 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret) *len_ret = sizeof (struct sockaddr_sco); return 1; #endif /* !__FreeBSD__ */ +#endif /* BTPROTO_HCI */ default: PyErr_SetString(PyExc_OSError, "getsockaddrlen: " "unknown BT protocol"); @@ -3063,7 +3146,7 @@ sock_bind(PySocketSockObject *s, PyObject *addro) int addrlen; int res; - if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "bind")) { + if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "bind")) { return NULL; } @@ -3233,7 +3316,7 @@ sock_connect(PySocketSockObject *s, PyObject *addro) int addrlen; int res; - if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "connect")) { + if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect")) { return NULL; } @@ -3264,7 +3347,7 @@ sock_connect_ex(PySocketSockObject *s, PyObject *addro) int addrlen; int res; - if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "connect_ex")) { + if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect_ex")) { return NULL; } @@ -3324,8 +3407,9 @@ sock_getsockname(PySocketSockObject *s, PyObject *Py_UNUSED(ignored)) PyDoc_STRVAR(getsockname_doc, "getsockname() -> address info\n\ \n\ -Return the address of the local endpoint. For IP sockets, the address\n\ -info is a pair (hostaddr, port)."); +Return the address of the local endpoint. The format depends on the\n\ +address family. For IPv4 sockets, the address info is a pair\n\ +(hostaddr, port)."); #ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */ @@ -4269,7 +4353,7 @@ sock_sendto(PySocketSockObject *s, PyObject *args) return select_error(); } - if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "sendto")) { + if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "sendto")) { PyBuffer_Release(&pbuf); return NULL; } @@ -4404,7 +4488,7 @@ sock_sendmsg(PySocketSockObject *s, PyObject *args) /* Parse destination address. */ if (addr_arg != NULL && addr_arg != Py_None) { - if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen, + if (!getsockaddrarg(s, addr_arg, &addrbuf, &addrlen, "sendmsg")) { goto finally; @@ -7071,7 +7155,7 @@ PyInit__socket(void) } #endif - Py_TYPE(&sock_type) = &PyType_Type; + Py_SET_TYPE(&sock_type, &PyType_Type); m = PyModule_Create(&socketmodule); if (m == NULL) return NULL; @@ -7285,23 +7369,29 @@ PyInit__socket(void) #ifdef USE_BLUETOOTH PyModule_AddIntMacro(m, AF_BLUETOOTH); +#ifdef BTPROTO_L2CAP PyModule_AddIntMacro(m, BTPROTO_L2CAP); +#endif /* BTPROTO_L2CAP */ +#ifdef BTPROTO_HCI PyModule_AddIntMacro(m, BTPROTO_HCI); PyModule_AddIntMacro(m, SOL_HCI); #if !defined(__NetBSD__) && !defined(__DragonFly__) PyModule_AddIntMacro(m, HCI_FILTER); -#endif #if !defined(__FreeBSD__) -#if !defined(__NetBSD__) && !defined(__DragonFly__) PyModule_AddIntMacro(m, HCI_TIME_STAMP); -#endif PyModule_AddIntMacro(m, HCI_DATA_DIR); - PyModule_AddIntMacro(m, BTPROTO_SCO); -#endif +#endif /* !__FreeBSD__ */ +#endif /* !__NetBSD__ && !__DragonFly__ */ +#endif /* BTPROTO_HCI */ +#ifdef BTPROTO_RFCOMM PyModule_AddIntMacro(m, BTPROTO_RFCOMM); +#endif /* BTPROTO_RFCOMM */ PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00"); PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF"); -#endif +#ifdef BTPROTO_SCO + PyModule_AddIntMacro(m, BTPROTO_SCO); +#endif /* BTPROTO_SCO */ +#endif /* USE_BLUETOOTH */ #ifdef AF_CAN /* Controller Area Network */ @@ -7656,6 +7746,9 @@ PyInit__socket(void) #ifdef CAN_ISOTP PyModule_AddIntMacro(m, CAN_ISOTP); #endif +#ifdef CAN_J1939 + PyModule_AddIntMacro(m, CAN_J1939); +#endif #endif #ifdef HAVE_LINUX_CAN_RAW_H PyModule_AddIntMacro(m, CAN_RAW_FILTER); @@ -7666,6 +7759,9 @@ PyInit__socket(void) #ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES); #endif +#ifdef HAVE_LINUX_CAN_RAW_JOIN_FILTERS + PyModule_AddIntMacro(m, CAN_RAW_JOIN_FILTERS); +#endif #ifdef HAVE_LINUX_CAN_BCM_H PyModule_AddIntMacro(m, CAN_BCM); @@ -7700,6 +7796,37 @@ PyInit__socket(void) PyModule_AddIntConstant(m, "CAN_BCM_CAN_FD_FRAME", CAN_FD_FRAME); #endif #endif +#ifdef HAVE_LINUX_CAN_J1939_H + PyModule_AddIntMacro(m, J1939_MAX_UNICAST_ADDR); + PyModule_AddIntMacro(m, J1939_IDLE_ADDR); + PyModule_AddIntMacro(m, J1939_NO_ADDR); + PyModule_AddIntMacro(m, J1939_NO_NAME); + PyModule_AddIntMacro(m, J1939_PGN_REQUEST); + PyModule_AddIntMacro(m, J1939_PGN_ADDRESS_CLAIMED); + PyModule_AddIntMacro(m, J1939_PGN_ADDRESS_COMMANDED); + PyModule_AddIntMacro(m, J1939_PGN_PDU1_MAX); + PyModule_AddIntMacro(m, J1939_PGN_MAX); + PyModule_AddIntMacro(m, J1939_NO_PGN); + + /* J1939 socket options */ + PyModule_AddIntMacro(m, SO_J1939_FILTER); + PyModule_AddIntMacro(m, SO_J1939_PROMISC); + PyModule_AddIntMacro(m, SO_J1939_SEND_PRIO); + PyModule_AddIntMacro(m, SO_J1939_ERRQUEUE); + + PyModule_AddIntMacro(m, SCM_J1939_DEST_ADDR); + PyModule_AddIntMacro(m, SCM_J1939_DEST_NAME); + PyModule_AddIntMacro(m, SCM_J1939_PRIO); + PyModule_AddIntMacro(m, SCM_J1939_ERRQUEUE); + + PyModule_AddIntMacro(m, J1939_NLA_PAD); + PyModule_AddIntMacro(m, J1939_NLA_BYTES_ACKED); + + PyModule_AddIntMacro(m, J1939_EE_INFO_NONE); + PyModule_AddIntMacro(m, J1939_EE_INFO_TX_ABORT); + + PyModule_AddIntMacro(m, J1939_FILTER_MAX); +#endif #ifdef SOL_RDS PyModule_AddIntMacro(m, SOL_RDS); #endif @@ -7768,6 +7895,17 @@ PyInit__socket(void) #else PyModule_AddIntConstant(m, "IPPROTO_UDP", 17); #endif +#ifdef IPPROTO_UDPLITE + PyModule_AddIntMacro(m, IPPROTO_UDPLITE); + #ifndef UDPLITE_SEND_CSCOV + #define UDPLITE_SEND_CSCOV 10 + #endif + PyModule_AddIntMacro(m, UDPLITE_SEND_CSCOV); + #ifndef UDPLITE_RECV_CSCOV + #define UDPLITE_RECV_CSCOV 11 + #endif + PyModule_AddIntMacro(m, UDPLITE_RECV_CSCOV); +#endif #ifdef IPPROTO_IDP PyModule_AddIntMacro(m, IPPROTO_IDP); #endif diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h index dff1f8f4e9ce4a884b2e0f2b62ce07ee2d26eeec..ba2c9f5c31c3b1eaf1abad1fdd0304f5772fdb6a 100644 --- a/Modules/socketmodule.h +++ b/Modules/socketmodule.h @@ -14,6 +14,47 @@ #else /* MS_WINDOWS */ # include + +/* + * If Windows has bluetooth support, include bluetooth constants. + */ +#ifdef AF_BTH +# include +# include + +/* + * The current implementation assumes the bdaddr in the sockaddr structs + * will be a bdaddr_t. We treat this as an opaque type: on *nix systems, it + * will be a struct with a single member (an array of six bytes). On windows, + * we typedef this to ULONGLONG to match the Windows definition. + */ +typedef ULONGLONG bdaddr_t; + +/* + * Redefine SOCKADDR_BTH to provide names compatible with _BT_RC_MEMB() macros. + */ +struct SOCKADDR_BTH_REDEF { + union { + USHORT addressFamily; + USHORT family; + }; + + union { + ULONGLONG btAddr; + bdaddr_t bdaddr; + }; + + GUID serviceClassId; + + union { + ULONG port; + ULONG channel; + }; + +}; +# include +#endif + /* Windows 'supports' CMSG_LEN, but does not follow the POSIX standard * interface at all, so there is no point including the code that * attempts to use it. @@ -103,6 +144,10 @@ typedef int socklen_t; #include #endif +#ifdef HAVE_LINUX_CAN_J1939_H +#include +#endif + #ifdef HAVE_SYS_SYS_DOMAIN_H #include #endif @@ -194,11 +239,18 @@ typedef union sock_addr { struct sockaddr_in6 in6; struct sockaddr_storage storage; #endif -#ifdef HAVE_BLUETOOTH_BLUETOOTH_H +#if defined(HAVE_BLUETOOTH_H) && defined(__FreeBSD__) + struct sockaddr_l2cap bt_l2; + struct sockaddr_rfcomm bt_rc; + struct sockaddr_sco bt_sco; + struct sockaddr_hci bt_hci; +#elif defined(HAVE_BLUETOOTH_BLUETOOTH_H) struct sockaddr_l2 bt_l2; struct sockaddr_rc bt_rc; struct sockaddr_sco bt_sco; struct sockaddr_hci bt_hci; +#elif defined(MS_WINDOWS) + struct SOCKADDR_BTH_REDEF bt_rc; #endif #ifdef HAVE_NETPACKET_PACKET_H struct sockaddr_ll ll; @@ -218,6 +270,9 @@ typedef union sock_addr { #ifdef AF_VSOCK struct sockaddr_vm vm; #endif +#ifdef HAVE_LINUX_TIPC_H + struct sockaddr_tipc tipc; +#endif } sock_addr_t; /* The object holding a socket. It holds some extra information, diff --git a/Modules/sre.h b/Modules/sre.h index a7284881457c3b1865e0c9b9503cecf01a17eea9..9b0d8b190426acf96d431de8ee9c6bd94e5a352c 100644 --- a/Modules/sre.h +++ b/Modules/sre.h @@ -54,17 +54,17 @@ typedef struct { typedef struct SRE_REPEAT_T { Py_ssize_t count; - SRE_CODE* pattern; /* points to REPEAT operator arguments */ - void* last_ptr; /* helper to check for infinite loops */ + const SRE_CODE* pattern; /* points to REPEAT operator arguments */ + const void* last_ptr; /* helper to check for infinite loops */ struct SRE_REPEAT_T *prev; /* points to previous repeat context */ } SRE_REPEAT; typedef struct { /* string pointers */ - void* ptr; /* current position (also end of current slice) */ - void* beginning; /* start of original string */ - void* start; /* start of current slice */ - void* end; /* end of original string */ + const void* ptr; /* current position (also end of current slice) */ + const void* beginning; /* start of original string */ + const void* start; /* start of current slice */ + const void* end; /* end of original string */ /* attributes for the match object */ PyObject* string; Py_buffer buffer; @@ -74,7 +74,7 @@ typedef struct { /* registers */ Py_ssize_t lastindex; Py_ssize_t lastmark; - void** mark; + const void** mark; int match_all; int must_advance; /* dynamically allocated stuff */ diff --git a/Modules/sre_lib.h b/Modules/sre_lib.h index 437ab43f434a62ab5b3fdd892c52c1df24b40f32..9cc786321c560a7c8cca22f22855ad8cd030fd8c 100644 --- a/Modules/sre_lib.h +++ b/Modules/sre_lib.h @@ -13,7 +13,7 @@ /* This file is included three times, with different character settings */ LOCAL(int) -SRE(at)(SRE_STATE* state, SRE_CHAR* ptr, SRE_CODE at) +SRE(at)(SRE_STATE* state, const SRE_CHAR* ptr, SRE_CODE at) { /* check if pointer is at given position */ @@ -101,7 +101,7 @@ SRE(at)(SRE_STATE* state, SRE_CHAR* ptr, SRE_CODE at) } LOCAL(int) -SRE(charset)(SRE_STATE* state, SRE_CODE* set, SRE_CODE ch) +SRE(charset)(SRE_STATE* state, const SRE_CODE* set, SRE_CODE ch) { /* check if character is a member of the given set */ @@ -188,7 +188,7 @@ SRE(charset)(SRE_STATE* state, SRE_CODE* set, SRE_CODE ch) } LOCAL(int) -SRE(charset_loc_ignore)(SRE_STATE* state, SRE_CODE* set, SRE_CODE ch) +SRE(charset_loc_ignore)(SRE_STATE* state, const SRE_CODE* set, SRE_CODE ch) { SRE_CODE lo, up; lo = sre_lower_locale(ch); @@ -199,15 +199,15 @@ SRE(charset_loc_ignore)(SRE_STATE* state, SRE_CODE* set, SRE_CODE ch) return up != lo && SRE(charset)(state, set, up); } -LOCAL(Py_ssize_t) SRE(match)(SRE_STATE* state, SRE_CODE* pattern, int toplevel); +LOCAL(Py_ssize_t) SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel); LOCAL(Py_ssize_t) -SRE(count)(SRE_STATE* state, SRE_CODE* pattern, Py_ssize_t maxcount) +SRE(count)(SRE_STATE* state, const SRE_CODE* pattern, Py_ssize_t maxcount) { SRE_CODE chr; SRE_CHAR c; - SRE_CHAR* ptr = (SRE_CHAR *)state->ptr; - SRE_CHAR* end = (SRE_CHAR *)state->end; + const SRE_CHAR* ptr = (const SRE_CHAR *)state->ptr; + const SRE_CHAR* end = (const SRE_CHAR *)state->end; Py_ssize_t i; /* adjust end */ @@ -335,14 +335,14 @@ SRE(count)(SRE_STATE* state, SRE_CODE* pattern, Py_ssize_t maxcount) #if 0 /* not used in this release */ LOCAL(int) -SRE(info)(SRE_STATE* state, SRE_CODE* pattern) +SRE(info)(SRE_STATE* state, const SRE_CODE* pattern) { /* check if an SRE_OP_INFO block matches at the current position. returns the number of SRE_CODE objects to skip if successful, 0 if no match */ - SRE_CHAR* end = (SRE_CHAR*) state->end; - SRE_CHAR* ptr = (SRE_CHAR*) state->ptr; + const SRE_CHAR* end = (const SRE_CHAR*) state->end; + const SRE_CHAR* ptr = (const SRE_CHAR*) state->ptr; Py_ssize_t i; /* check minimal length */ @@ -531,8 +531,8 @@ do { \ typedef struct { Py_ssize_t last_ctx_pos; Py_ssize_t jump; - SRE_CHAR* ptr; - SRE_CODE* pattern; + const SRE_CHAR* ptr; + const SRE_CODE* pattern; Py_ssize_t count; Py_ssize_t lastmark; Py_ssize_t lastindex; @@ -546,9 +546,9 @@ typedef struct { /* check if string matches the given pattern. returns <0 for error, 0 for failure, and 1 for success */ LOCAL(Py_ssize_t) -SRE(match)(SRE_STATE* state, SRE_CODE* pattern, int toplevel) +SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel) { - SRE_CHAR* end = (SRE_CHAR *)state->end; + const SRE_CHAR* end = (const SRE_CHAR *)state->end; Py_ssize_t alloc_pos, ctx_pos = -1; Py_ssize_t i, ret = 0; Py_ssize_t jump; diff --git a/Modules/syslogmodule.c b/Modules/syslogmodule.c index 66ea2703fc84a7e8bdd5b271d4cdc1cd021ff080..cdc94a60a373d78c6b1aa2515437001ac1735423 100644 --- a/Modules/syslogmodule.c +++ b/Modules/syslogmodule.c @@ -50,7 +50,7 @@ Revision history: /* syslog module */ #include "Python.h" -#include "osdefs.h" +#include "osdefs.h" // SEP #include @@ -99,7 +99,7 @@ syslog_get_argv(void) if (slash == -2) return NULL; if (slash != -1) { - return PyUnicode_Substring(scriptobj, slash, scriptlen); + return PyUnicode_Substring(scriptobj, slash + 1, scriptlen); } else { Py_INCREF(scriptobj); return(scriptobj); @@ -261,72 +261,55 @@ static PyMethodDef syslog_methods[] = { {NULL, NULL, 0} }; -/* Initialization function for the module */ - - -static struct PyModuleDef syslogmodule = { - PyModuleDef_HEAD_INIT, - "syslog", - NULL, - -1, - syslog_methods, - NULL, - NULL, - NULL, - NULL -}; -PyMODINIT_FUNC -PyInit_syslog(void) +static int +syslog_exec(PyObject *module) { - PyObject *m; - - /* Create the module and add the functions */ - m = PyModule_Create(&syslogmodule); - if (m == NULL) - return NULL; - - /* Add some symbolic constants to the module */ - +#define ADD_INT_MACRO(module, macro) \ + do { \ + if (PyModule_AddIntConstant(module, #macro, macro) < 0) { \ + return -1; \ + } \ + } while (0) /* Priorities */ - PyModule_AddIntMacro(m, LOG_EMERG); - PyModule_AddIntMacro(m, LOG_ALERT); - PyModule_AddIntMacro(m, LOG_CRIT); - PyModule_AddIntMacro(m, LOG_ERR); - PyModule_AddIntMacro(m, LOG_WARNING); - PyModule_AddIntMacro(m, LOG_NOTICE); - PyModule_AddIntMacro(m, LOG_INFO); - PyModule_AddIntMacro(m, LOG_DEBUG); + ADD_INT_MACRO(module, LOG_EMERG); + ADD_INT_MACRO(module, LOG_ALERT); + ADD_INT_MACRO(module, LOG_CRIT); + ADD_INT_MACRO(module, LOG_ERR); + ADD_INT_MACRO(module, LOG_WARNING); + ADD_INT_MACRO(module, LOG_NOTICE); + ADD_INT_MACRO(module, LOG_INFO); + ADD_INT_MACRO(module, LOG_DEBUG); /* openlog() option flags */ - PyModule_AddIntMacro(m, LOG_PID); - PyModule_AddIntMacro(m, LOG_CONS); - PyModule_AddIntMacro(m, LOG_NDELAY); + ADD_INT_MACRO(module, LOG_PID); + ADD_INT_MACRO(module, LOG_CONS); + ADD_INT_MACRO(module, LOG_NDELAY); #ifdef LOG_ODELAY - PyModule_AddIntMacro(m, LOG_ODELAY); + ADD_INT_MACRO(module, LOG_ODELAY); #endif #ifdef LOG_NOWAIT - PyModule_AddIntMacro(m, LOG_NOWAIT); + ADD_INT_MACRO(module, LOG_NOWAIT); #endif #ifdef LOG_PERROR - PyModule_AddIntMacro(m, LOG_PERROR); + ADD_INT_MACRO(module, LOG_PERROR); #endif /* Facilities */ - PyModule_AddIntMacro(m, LOG_KERN); - PyModule_AddIntMacro(m, LOG_USER); - PyModule_AddIntMacro(m, LOG_MAIL); - PyModule_AddIntMacro(m, LOG_DAEMON); - PyModule_AddIntMacro(m, LOG_AUTH); - PyModule_AddIntMacro(m, LOG_LPR); - PyModule_AddIntMacro(m, LOG_LOCAL0); - PyModule_AddIntMacro(m, LOG_LOCAL1); - PyModule_AddIntMacro(m, LOG_LOCAL2); - PyModule_AddIntMacro(m, LOG_LOCAL3); - PyModule_AddIntMacro(m, LOG_LOCAL4); - PyModule_AddIntMacro(m, LOG_LOCAL5); - PyModule_AddIntMacro(m, LOG_LOCAL6); - PyModule_AddIntMacro(m, LOG_LOCAL7); + ADD_INT_MACRO(module, LOG_KERN); + ADD_INT_MACRO(module, LOG_USER); + ADD_INT_MACRO(module, LOG_MAIL); + ADD_INT_MACRO(module, LOG_DAEMON); + ADD_INT_MACRO(module, LOG_AUTH); + ADD_INT_MACRO(module, LOG_LPR); + ADD_INT_MACRO(module, LOG_LOCAL0); + ADD_INT_MACRO(module, LOG_LOCAL1); + ADD_INT_MACRO(module, LOG_LOCAL2); + ADD_INT_MACRO(module, LOG_LOCAL3); + ADD_INT_MACRO(module, LOG_LOCAL4); + ADD_INT_MACRO(module, LOG_LOCAL5); + ADD_INT_MACRO(module, LOG_LOCAL6); + ADD_INT_MACRO(module, LOG_LOCAL7); #ifndef LOG_SYSLOG #define LOG_SYSLOG LOG_DAEMON @@ -341,14 +324,35 @@ PyInit_syslog(void) #define LOG_CRON LOG_DAEMON #endif - PyModule_AddIntMacro(m, LOG_SYSLOG); - PyModule_AddIntMacro(m, LOG_CRON); - PyModule_AddIntMacro(m, LOG_UUCP); - PyModule_AddIntMacro(m, LOG_NEWS); + ADD_INT_MACRO(module, LOG_SYSLOG); + ADD_INT_MACRO(module, LOG_CRON); + ADD_INT_MACRO(module, LOG_UUCP); + ADD_INT_MACRO(module, LOG_NEWS); #ifdef LOG_AUTHPRIV - PyModule_AddIntMacro(m, LOG_AUTHPRIV); + ADD_INT_MACRO(module, LOG_AUTHPRIV); #endif - return m; + return 0; } + +static PyModuleDef_Slot syslog_slots[] = { + {Py_mod_exec, syslog_exec}, + {0, NULL} +}; + +/* Initialization function for the module */ + +static struct PyModuleDef syslogmodule = { + PyModuleDef_HEAD_INIT, + .m_name = "syslog", + .m_size = 0, + .m_methods = syslog_methods, + .m_slots = syslog_slots, +}; + +PyMODINIT_FUNC +PyInit_syslog(void) +{ + return PyModuleDef_Init(&syslogmodule); +} \ No newline at end of file diff --git a/Modules/termios.c b/Modules/termios.c index aee7f12c57cab5757e7c23eb06d6eeb06d6f3faa..75e5e523206f418eef009c0a54f3adf6a1c90e77 100644 --- a/Modules/termios.c +++ b/Modules/termios.c @@ -39,7 +39,19 @@ All functions in this module take a file descriptor fd as their first\n\ argument. This can be an integer file descriptor, such as returned by\n\ sys.stdin.fileno(), or a file object, such as sys.stdin itself."); -static PyObject *TermiosError; +typedef struct { + PyObject *TermiosError; +} termiosmodulestate; + +static inline termiosmodulestate* +get_termios_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (termiosmodulestate *)state; +} + +#define modulestate_global get_termios_state(PyState_FindModule(&termiosmodule)) static int fdconv(PyObject* obj, void* p) { @@ -53,6 +65,8 @@ static int fdconv(PyObject* obj, void* p) return 0; } +static struct PyModuleDef termiosmodule; + PyDoc_STRVAR(termios_tcgetattr__doc__, "tcgetattr(fd) -> list_of_attrs\n\ \n\ @@ -80,7 +94,7 @@ termios_tcgetattr(PyObject *self, PyObject *args) return NULL; if (tcgetattr(fd, &mode) == -1) - return PyErr_SetFromErrno(TermiosError); + return PyErr_SetFromErrno(modulestate_global->TermiosError); ispeed = cfgetispeed(&mode); ospeed = cfgetospeed(&mode); @@ -160,8 +174,9 @@ termios_tcsetattr(PyObject *self, PyObject *args) } /* Get the old mode, in case there are any hidden fields... */ + termiosmodulestate *state = modulestate_global; if (tcgetattr(fd, &mode) == -1) - return PyErr_SetFromErrno(TermiosError); + return PyErr_SetFromErrno(state->TermiosError); mode.c_iflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 0)); mode.c_oflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 1)); mode.c_cflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 2)); @@ -194,11 +209,11 @@ termios_tcsetattr(PyObject *self, PyObject *args) } if (cfsetispeed(&mode, (speed_t) ispeed) == -1) - return PyErr_SetFromErrno(TermiosError); + return PyErr_SetFromErrno(state->TermiosError); if (cfsetospeed(&mode, (speed_t) ospeed) == -1) - return PyErr_SetFromErrno(TermiosError); + return PyErr_SetFromErrno(state->TermiosError); if (tcsetattr(fd, when, &mode) == -1) - return PyErr_SetFromErrno(TermiosError); + return PyErr_SetFromErrno(state->TermiosError); Py_RETURN_NONE; } @@ -219,7 +234,7 @@ termios_tcsendbreak(PyObject *self, PyObject *args) fdconv, &fd, &duration)) return NULL; if (tcsendbreak(fd, duration) == -1) - return PyErr_SetFromErrno(TermiosError); + return PyErr_SetFromErrno(modulestate_global->TermiosError); Py_RETURN_NONE; } @@ -238,7 +253,7 @@ termios_tcdrain(PyObject *self, PyObject *args) fdconv, &fd)) return NULL; if (tcdrain(fd) == -1) - return PyErr_SetFromErrno(TermiosError); + return PyErr_SetFromErrno(modulestate_global->TermiosError); Py_RETURN_NONE; } @@ -260,7 +275,7 @@ termios_tcflush(PyObject *self, PyObject *args) fdconv, &fd, &queue)) return NULL; if (tcflush(fd, queue) == -1) - return PyErr_SetFromErrno(TermiosError); + return PyErr_SetFromErrno(modulestate_global->TermiosError); Py_RETURN_NONE; } @@ -282,7 +297,7 @@ termios_tcflow(PyObject *self, PyObject *args) fdconv, &fd, &action)) return NULL; if (tcflow(fd, action) == -1) - return PyErr_SetFromErrno(TermiosError); + return PyErr_SetFromErrno(modulestate_global->TermiosError); Py_RETURN_NONE; } @@ -606,6 +621,39 @@ static struct constant { #ifdef B460800 {"B460800", B460800}, #endif +#ifdef B500000 + {"B500000", B500000}, +#endif +#ifdef B576000 + { "B576000", B576000}, +#endif +#ifdef B921600 + { "B921600", B921600}, +#endif +#ifdef B1000000 + { "B1000000", B1000000}, +#endif +#ifdef B1152000 + { "B1152000", B1152000}, +#endif +#ifdef B1500000 + { "B1500000", B1500000}, +#endif +#ifdef B2000000 + { "B2000000", B2000000}, +#endif +#ifdef B2500000 + { "B2500000", B2500000}, +#endif +#ifdef B3000000 + { "B3000000", B3000000}, +#endif +#ifdef B3500000 + { "B3500000", B3500000}, +#endif +#ifdef B4000000 + { "B4000000", B4000000}, +#endif #ifdef CBAUD {"CBAUD", CBAUD}, #endif @@ -935,17 +983,30 @@ static struct constant { {NULL, 0} }; +static int termiosmodule_traverse(PyObject *m, visitproc visit, void *arg) { + Py_VISIT(get_termios_state(m)->TermiosError); + return 0; +} + +static int termiosmodule_clear(PyObject *m) { + Py_CLEAR(get_termios_state(m)->TermiosError); + return 0; +} + +static void termiosmodule_free(void *m) { + termiosmodule_clear((PyObject *)m); +} static struct PyModuleDef termiosmodule = { PyModuleDef_HEAD_INIT, "termios", termios__doc__, - -1, + sizeof(termiosmodulestate), termios_methods, NULL, - NULL, - NULL, - NULL + termiosmodule_traverse, + termiosmodule_clear, + termiosmodule_free, }; PyMODINIT_FUNC @@ -954,15 +1015,22 @@ PyInit_termios(void) PyObject *m; struct constant *constant = termios_constants; - m = PyModule_Create(&termiosmodule); - if (m == NULL) + if ((m = PyState_FindModule(&termiosmodule)) != NULL) { + Py_INCREF(m); + return m; + } + + if ((m = PyModule_Create(&termiosmodule)) == NULL) { return NULL; + } - if (TermiosError == NULL) { - TermiosError = PyErr_NewException("termios.error", NULL, NULL); + termiosmodulestate *state = get_termios_state(m); + state->TermiosError = PyErr_NewException("termios.error", NULL, NULL); + if (state->TermiosError == NULL) { + return NULL; } - Py_INCREF(TermiosError); - PyModule_AddObject(m, "error", TermiosError); + Py_INCREF(state->TermiosError); + PyModule_AddObject(m, "error", state->TermiosError); while (constant->name != NULL) { PyModule_AddIntConstant(m, constant->name, constant->value); diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 5e0010c8a81996534ba210d388fd0d0c3a17281c..80eab30c95d6f034356970569cd795d613055277 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -24,14 +24,17 @@ # include #endif +#if defined(_AIX) +# include +#endif + #if defined(__WATCOMC__) && !defined(__QNX__) -#include +# include #else -#ifdef MS_WINDOWS -#define WIN32_LEAN_AND_MEAN -#include -#include "pythread.h" -#endif /* MS_WINDOWS */ +# ifdef MS_WINDOWS +# define WIN32_LEAN_AND_MEAN +# include +# endif /* MS_WINDOWS */ #endif /* !__WATCOMC__ || __QNX__ */ #ifdef _Py_MEMORY_SANITIZER @@ -48,6 +51,15 @@ #define _Py_tzname tzname #endif +#if defined(__APPLE__ ) && defined(__has_builtin) +# if __has_builtin(__builtin_available) +# define HAVE_CLOCK_GETTIME_RUNTIME __builtin_available(macOS 10.12, iOS 10.0, tvOS 10.0, watchOS 3.0, *) +# endif +#endif +#ifndef HAVE_CLOCK_GETTIME_RUNTIME +# define HAVE_CLOCK_GETTIME_RUNTIME 1 +#endif + #define SEC_TO_NS (1000 * 1000 * 1000) /* Forward declarations */ @@ -146,6 +158,16 @@ perf_counter(_Py_clock_info_t *info) } #ifdef HAVE_CLOCK_GETTIME + +#ifdef __APPLE__ +/* + * The clock_* functions will be removed from the module + * dict entirely when the C API is not available. + */ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability" +#endif + static PyObject * time_clock_gettime(PyObject *self, PyObject *args) { @@ -294,6 +316,11 @@ PyDoc_STRVAR(clock_getres_doc, "clock_getres(clk_id) -> floating point number\n\ \n\ Return the resolution (precision) of the specified clock clk_id."); + +#ifdef __APPLE__ +#pragma clang diagnostic pop +#endif + #endif /* HAVE_CLOCK_GETRES */ #ifdef HAVE_PTHREAD_GETCPUCLOCKID @@ -550,7 +577,7 @@ gettmarg(PyObject *args, struct tm *p, const char *format) p->tm_wday = (p->tm_wday + 1) % 7; p->tm_yday--; #ifdef HAVE_STRUCT_TM_TM_ZONE - if (Py_TYPE(args) == &StructTimeType) { + if (Py_IS_TYPE(args, &StructTimeType)) { PyObject *item; item = PyStructSequence_GET_ITEM(args, 9); if (item != Py_None) { @@ -1159,31 +1186,35 @@ _PyTime_GetProcessTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) #if defined(HAVE_CLOCK_GETTIME) \ && (defined(CLOCK_PROCESS_CPUTIME_ID) || defined(CLOCK_PROF)) struct timespec ts; + + if (HAVE_CLOCK_GETTIME_RUNTIME) { + #ifdef CLOCK_PROF - const clockid_t clk_id = CLOCK_PROF; - const char *function = "clock_gettime(CLOCK_PROF)"; + const clockid_t clk_id = CLOCK_PROF; + const char *function = "clock_gettime(CLOCK_PROF)"; #else - const clockid_t clk_id = CLOCK_PROCESS_CPUTIME_ID; - const char *function = "clock_gettime(CLOCK_PROCESS_CPUTIME_ID)"; + const clockid_t clk_id = CLOCK_PROCESS_CPUTIME_ID; + const char *function = "clock_gettime(CLOCK_PROCESS_CPUTIME_ID)"; #endif - if (clock_gettime(clk_id, &ts) == 0) { - if (info) { - struct timespec res; - info->implementation = function; - info->monotonic = 1; - info->adjustable = 0; - if (clock_getres(clk_id, &res)) { - PyErr_SetFromErrno(PyExc_OSError); - return -1; + if (clock_gettime(clk_id, &ts) == 0) { + if (info) { + struct timespec res; + info->implementation = function; + info->monotonic = 1; + info->adjustable = 0; + if (clock_getres(clk_id, &res)) { + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + info->resolution = res.tv_sec + res.tv_nsec * 1e-9; } - info->resolution = res.tv_sec + res.tv_nsec * 1e-9; - } - if (_PyTime_FromTimespec(tp, &ts) < 0) { - return -1; + if (_PyTime_FromTimespec(tp, &ts) < 0) { + return -1; + } + return 0; } - return 0; } #endif @@ -1344,8 +1375,59 @@ _PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) return 0; } +#elif defined(_AIX) +#define HAVE_THREAD_TIME +static int +_PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) +{ + /* bpo-40192: On AIX, thread_cputime() is preferred: it has nanosecond + resolution, whereas clock_gettime(CLOCK_THREAD_CPUTIME_ID) + has a resolution of 10 ms. */ + thread_cputime_t tc; + if (thread_cputime(-1, &tc) != 0) { + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + + if (info) { + info->implementation = "thread_cputime()"; + info->monotonic = 1; + info->adjustable = 0; + info->resolution = 1e-9; + } + *tp = _PyTime_FromNanoseconds(tc.stime + tc.utime); + return 0; +} + +#elif defined(__sun) && defined(__SVR4) +#define HAVE_THREAD_TIME +static int +_PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) +{ + /* bpo-35455: On Solaris, CLOCK_THREAD_CPUTIME_ID clock is not always + available; use gethrvtime() to substitute this functionality. */ + if (info) { + info->implementation = "gethrvtime()"; + info->resolution = 1e-9; + info->monotonic = 1; + info->adjustable = 0; + } + *tp = _PyTime_FromNanoseconds(gethrvtime()); + return 0; +} + #elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_PROCESS_CPUTIME_ID) #define HAVE_THREAD_TIME + +#if defined(__APPLE__) && defined(__has_attribute) && __has_attribute(availability) +static int +_PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) + __attribute__((availability(macos, introduced=10.12))) + __attribute__((availability(ios, introduced=10.0))) + __attribute__((availability(tvos, introduced=10.0))) + __attribute__((availability(watchos, introduced=3.0))); +#endif + static int _PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) { @@ -1377,6 +1459,15 @@ _PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info) #endif #ifdef HAVE_THREAD_TIME +#ifdef __APPLE__ +/* + * The clock_* functions will be removed from the module + * dict entirely when the C API is not available. + */ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability" +#endif + static PyObject * time_thread_time(PyObject *self, PyObject *unused) { @@ -1407,6 +1498,11 @@ PyDoc_STRVAR(thread_time_ns_doc, \n\ Thread time for profiling as nanoseconds:\n\ sum of the kernel and user-space CPU time."); + +#ifdef __APPLE__ +#pragma clang diagnostic pop +#endif + #endif @@ -1456,9 +1552,19 @@ time_get_clock_info(PyObject *self, PyObject *args) } #ifdef HAVE_THREAD_TIME else if (strcmp(name, "thread_time") == 0) { - if (_PyTime_GetThreadTimeWithInfo(&t, &info) < 0) { + +#ifdef __APPLE__ + if (HAVE_CLOCK_GETTIME_RUNTIME) { +#endif + if (_PyTime_GetThreadTimeWithInfo(&t, &info) < 0) { + return NULL; + } +#ifdef __APPLE__ + } else { + PyErr_SetString(PyExc_ValueError, "unknown clock"); return NULL; } +#endif } #endif else { @@ -1736,75 +1842,136 @@ if it is 1, the time is given in the DST time zone;\n\ if it is -1, mktime() should guess based on the date and time.\n"); - -static struct PyModuleDef timemodule = { - PyModuleDef_HEAD_INIT, - "time", - module_doc, - -1, - time_methods, - NULL, - NULL, - NULL, - NULL -}; - -PyMODINIT_FUNC -PyInit_time(void) +static int +time_exec(PyObject *module) { - PyObject *m; - m = PyModule_Create(&timemodule); - if (m == NULL) - return NULL; +#if defined(__APPLE__) && defined(HAVE_CLOCK_GETTIME) + if (HAVE_CLOCK_GETTIME_RUNTIME) { + /* pass: ^^^ cannot use '!' here */ + } else { + PyObject* dct = PyModule_GetDict(module); + if (dct == NULL) { + return -1; + } + if (PyDict_DelItemString(dct, "clock_gettime") == -1) { + PyErr_Clear(); + } + if (PyDict_DelItemString(dct, "clock_gettime_ns") == -1) { + PyErr_Clear(); + } + if (PyDict_DelItemString(dct, "clock_settime") == -1) { + PyErr_Clear(); + } + if (PyDict_DelItemString(dct, "clock_settime_ns") == -1) { + PyErr_Clear(); + } + if (PyDict_DelItemString(dct, "clock_getres") == -1) { + PyErr_Clear(); + } + } +#endif +#if defined(__APPLE__) && defined(HAVE_THREAD_TIME) + if (HAVE_CLOCK_GETTIME_RUNTIME) { + /* pass: ^^^ cannot use '!' here */ + } else { + PyObject* dct = PyModule_GetDict(module); + + if (PyDict_DelItemString(dct, "thread_time") == -1) { + PyErr_Clear(); + } + if (PyDict_DelItemString(dct, "thread_time_ns") == -1) { + PyErr_Clear(); + } + } +#endif /* Set, or reset, module variables like time.timezone */ - if (init_timezone(m) < 0) { - return NULL; + if (init_timezone(module) < 0) { + return -1; } #if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_CLOCK_SETTIME) || defined(HAVE_CLOCK_GETRES) + if (HAVE_CLOCK_GETTIME_RUNTIME) { #ifdef CLOCK_REALTIME - PyModule_AddIntMacro(m, CLOCK_REALTIME); + if (PyModule_AddIntMacro(module, CLOCK_REALTIME) < 0) { + return -1; + } #endif + #ifdef CLOCK_MONOTONIC - PyModule_AddIntMacro(m, CLOCK_MONOTONIC); + + if (PyModule_AddIntMacro(module, CLOCK_MONOTONIC) < 0) { + return -1; + } + #endif #ifdef CLOCK_MONOTONIC_RAW - PyModule_AddIntMacro(m, CLOCK_MONOTONIC_RAW); + if (PyModule_AddIntMacro(module, CLOCK_MONOTONIC_RAW) < 0) { + return -1; + } #endif + #ifdef CLOCK_HIGHRES - PyModule_AddIntMacro(m, CLOCK_HIGHRES); + if (PyModule_AddIntMacro(module, CLOCK_HIGHRES) < 0) { + return -1; + } #endif #ifdef CLOCK_PROCESS_CPUTIME_ID - PyModule_AddIntMacro(m, CLOCK_PROCESS_CPUTIME_ID); + if (PyModule_AddIntMacro(module, CLOCK_PROCESS_CPUTIME_ID) < 0) { + return -1; + } #endif + #ifdef CLOCK_THREAD_CPUTIME_ID - PyModule_AddIntMacro(m, CLOCK_THREAD_CPUTIME_ID); + if (PyModule_AddIntMacro(module, CLOCK_THREAD_CPUTIME_ID) < 0) { + return -1; + } #endif #ifdef CLOCK_PROF - PyModule_AddIntMacro(m, CLOCK_PROF); + if (PyModule_AddIntMacro(module, CLOCK_PROF) < 0) { + return -1; + } #endif #ifdef CLOCK_BOOTTIME - PyModule_AddIntMacro(m, CLOCK_BOOTTIME); + if (PyModule_AddIntMacro(module, CLOCK_BOOTTIME) < 0) { + return -1; + } +#endif +#ifdef CLOCK_TAI + if (PyModule_AddIntMacro(module, CLOCK_TAI) < 0) { + return -1; + } #endif #ifdef CLOCK_UPTIME - PyModule_AddIntMacro(m, CLOCK_UPTIME); + if (PyModule_AddIntMacro(module, CLOCK_UPTIME) < 0) { + return -1; + } #endif #ifdef CLOCK_UPTIME_RAW - PyModule_AddIntMacro(m, CLOCK_UPTIME_RAW); + + if (PyModule_AddIntMacro(module, CLOCK_UPTIME_RAW) < 0) { + return -1; + } #endif + } #endif /* defined(HAVE_CLOCK_GETTIME) || defined(HAVE_CLOCK_SETTIME) || defined(HAVE_CLOCK_GETRES) */ if (!initialized) { if (PyStructSequence_InitType2(&StructTimeType, - &struct_time_type_desc) < 0) - return NULL; + &struct_time_type_desc) < 0) { + return -1; + } + } + if (PyModule_AddIntConstant(module, "_STRUCT_TM_ITEMS", 11)) { + return -1; } Py_INCREF(&StructTimeType); - PyModule_AddIntConstant(m, "_STRUCT_TM_ITEMS", 11); - PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType); + if (PyModule_AddObject(module, "struct_time", (PyObject*) &StructTimeType)) { + Py_DECREF(&StructTimeType); + return -1; + } initialized = 1; #if defined(__linux__) && !defined(__GLIBC__) @@ -1814,10 +1981,30 @@ PyInit_time(void) utc_string = tm.tm_zone; #endif - if (PyErr_Occurred()) { - return NULL; - } - return m; + return 0; +} + +static struct PyModuleDef_Slot time_slots[] = { + {Py_mod_exec, time_exec}, + {0, NULL} +}; + +static struct PyModuleDef timemodule = { + PyModuleDef_HEAD_INIT, + "time", + module_doc, + 0, + time_methods, + time_slots, + NULL, + NULL, + NULL +}; + +PyMODINIT_FUNC +PyInit_time(void) +{ + return PyModuleDef_Init(&timemodule); } /* Implement pysleep() for various platforms. diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c index 5e8ba602d6684825f2f97497ef8c310fe781fd68..8a1198a2b712d931d6c209e4a02678d284fa317a 100644 --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -17,7 +17,7 @@ #include "Python.h" #include "ucnhash.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include @@ -92,7 +92,7 @@ static PyMemberDef DB_members[] = { /* forward declaration */ static PyTypeObject UCD_Type; -#define UCD_Check(o) (Py_TYPE(o)==&UCD_Type) +#define UCD_Check(o) Py_IS_TYPE(o, &UCD_Type) static PyObject* new_previous_version(const char*name, const change_record* (*getrecord)(Py_UCS4), @@ -496,7 +496,7 @@ nfd_nfkd(PyObject *self, PyObject *input, int k) Py_UCS4 *output; Py_ssize_t i, o, osize; int kind; - void *data; + const void *data; /* Longest decomposition in Unicode 3.2: U+FDFA */ Py_UCS4 stack[20]; Py_ssize_t space, isize; @@ -623,7 +623,7 @@ nfd_nfkd(PyObject *self, PyObject *input, int k) } static int -find_nfc_index(PyObject *self, struct reindex* nfc, Py_UCS4 code) +find_nfc_index(const struct reindex* nfc, Py_UCS4 code) { unsigned int index; for (index = 0; nfc[index].start; index++) { @@ -643,7 +643,7 @@ nfc_nfkc(PyObject *self, PyObject *input, int k) { PyObject *result; int kind; - void *data; + const void *data; Py_UCS4 *output; Py_ssize_t i, i1, o, len; int f,l,index,index1,comb; @@ -709,7 +709,7 @@ nfc_nfkc(PyObject *self, PyObject *input, int k) } /* code is still input[i] here */ - f = find_nfc_index(self, nfc_first, code); + f = find_nfc_index(nfc_first, code); if (f == -1) { output[o++] = code; i++; @@ -732,7 +732,7 @@ nfc_nfkc(PyObject *self, PyObject *input, int k) continue; } } - l = find_nfc_index(self, nfc_last, code1); + l = find_nfc_index(nfc_last, code1); /* i1 cannot be combined with i. If i1 is a starter, we don't need to look further. Otherwise, record the combining class. */ @@ -757,7 +757,7 @@ nfc_nfkc(PyObject *self, PyObject *input, int k) assert(cskipped < 20); skipped[cskipped++] = i1; i1++; - f = find_nfc_index(self, nfc_first, output[o]); + f = find_nfc_index(nfc_first, output[o]); if (f == -1) break; } @@ -795,7 +795,7 @@ typedef enum {YES = 0, MAYBE = 1, NO = 2} QuickcheckResult; */ static QuickcheckResult is_normalized_quickcheck(PyObject *self, PyObject *input, - int nfc, int k, bool yes_only) + bool nfc, bool k, bool yes_only) { /* An older version of the database is requested, quickchecks must be disabled. */ @@ -804,7 +804,7 @@ is_normalized_quickcheck(PyObject *self, PyObject *input, Py_ssize_t i, len; int kind; - void *data; + const void *data; unsigned char prev_combining = 0; /* The two quickcheck bits at this shift have type QuickcheckResult. */ @@ -869,25 +869,25 @@ unicodedata_UCD_is_normalized_impl(PyObject *self, PyObject *form, } PyObject *result; - int nfc = 0; - int k = 0; + bool nfc = false; + bool k = false; QuickcheckResult m; PyObject *cmp; int match = 0; if (_PyUnicode_EqualToASCIIId(form, &PyId_NFC)) { - nfc = 1; + nfc = true; } else if (_PyUnicode_EqualToASCIIId(form, &PyId_NFKC)) { - nfc = 1; - k = 1; + nfc = true; + k = true; } else if (_PyUnicode_EqualToASCIIId(form, &PyId_NFD)) { /* matches default values for `nfc` and `k` */ } else if (_PyUnicode_EqualToASCIIId(form, &PyId_NFKD)) { - k = 1; + k = true; } else { PyErr_SetString(PyExc_ValueError, "invalid normalization form"); @@ -940,28 +940,28 @@ unicodedata_UCD_normalize_impl(PyObject *self, PyObject *form, } if (_PyUnicode_EqualToASCIIId(form, &PyId_NFC)) { - if (is_normalized_quickcheck(self, input, 1, 0, true) == YES) { + if (is_normalized_quickcheck(self, input, true, false, true) == YES) { Py_INCREF(input); return input; } return nfc_nfkc(self, input, 0); } if (_PyUnicode_EqualToASCIIId(form, &PyId_NFKC)) { - if (is_normalized_quickcheck(self, input, 1, 1, true) == YES) { + if (is_normalized_quickcheck(self, input, true, true, true) == YES) { Py_INCREF(input); return input; } return nfc_nfkc(self, input, 1); } if (_PyUnicode_EqualToASCIIId(form, &PyId_NFD)) { - if (is_normalized_quickcheck(self, input, 0, 0, true) == YES) { + if (is_normalized_quickcheck(self, input, false, false, true) == YES) { Py_INCREF(input); return input; } return nfd_nfkd(self, input, 0); } if (_PyUnicode_EqualToASCIIId(form, &PyId_NFKD)) { - if (is_normalized_quickcheck(self, input, 0, 1, true) == YES) { + if (is_normalized_quickcheck(self, input, false, true, true) == YES) { Py_INCREF(input); return input; } @@ -987,7 +987,7 @@ _gethash(const char *s, int len, int scale) unsigned long h = 0; unsigned long ix; for (i = 0; i < len; i++) { - h = (h * scale) + (unsigned char) Py_TOUPPER(Py_CHARMASK(s[i])); + h = (h * scale) + (unsigned char) Py_TOUPPER(s[i]); ix = h & 0xff000000; if (ix) h = (h ^ ((ix>>24) & 0xff)) & 0x00ffffff; @@ -1031,13 +1031,14 @@ static int is_unified_ideograph(Py_UCS4 code) { return - (0x3400 <= code && code <= 0x4DB5) || /* CJK Ideograph Extension A */ - (0x4E00 <= code && code <= 0x9FEF) || /* CJK Ideograph */ - (0x20000 <= code && code <= 0x2A6D6) || /* CJK Ideograph Extension B */ + (0x3400 <= code && code <= 0x4DBF) || /* CJK Ideograph Extension A */ + (0x4E00 <= code && code <= 0x9FFC) || /* CJK Ideograph */ + (0x20000 <= code && code <= 0x2A6DD) || /* CJK Ideograph Extension B */ (0x2A700 <= code && code <= 0x2B734) || /* CJK Ideograph Extension C */ (0x2B740 <= code && code <= 0x2B81D) || /* CJK Ideograph Extension D */ (0x2B820 <= code && code <= 0x2CEA1) || /* CJK Ideograph Extension E */ - (0x2CEB0 <= code && code <= 0x2EBEF); /* CJK Ideograph Extension F */ + (0x2CEB0 <= code && code <= 0x2EBE0) || /* CJK Ideograph Extension F */ + (0x30000 <= code && code <= 0x3134A); /* CJK Ideograph Extension G */ } /* macros used to determine if the given code point is in the PUA range that @@ -1157,7 +1158,7 @@ _cmpname(PyObject *self, int code, const char* name, int namelen) if (!_getucname(self, code, buffer, NAME_MAXLEN, 1)) return 0; for (i = 0; i < namelen; i++) { - if (Py_TOUPPER(Py_CHARMASK(name[i])) != buffer[i]) + if (Py_TOUPPER(name[i]) != buffer[i]) return 0; } return buffer[namelen] == '\0'; @@ -1455,7 +1456,7 @@ PyInit_unicodedata(void) { PyObject *m, *v; - Py_TYPE(&UCD_Type) = &PyType_Type; + Py_SET_TYPE(&UCD_Type, &PyType_Type); m = PyModule_Create(&unicodedatamodule); if (!m) diff --git a/Modules/unicodedata_db.h b/Modules/unicodedata_db.h index 286287d047ca983822b050f82d4cb88ba9251a6d..da938761563a5cd3e289ba7f28a997cf643fba09 100644 --- a/Modules/unicodedata_db.h +++ b/Modules/unicodedata_db.h @@ -1,6 +1,6 @@ /* this file was generated by Tools/unicode/makeunicodedata.py 3.3 */ -#define UNIDATA_VERSION "12.1.0" +#define UNIDATA_VERSION "13.0.0" /* a list of unique database records */ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = { {0, 0, 0, 0, 0, 0}, @@ -335,6 +335,8 @@ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = { {9, 0, 12, 0, 5, 0}, {9, 0, 5, 0, 5, 0}, {4, 9, 1, 0, 5, 0}, + {4, 0, 14, 0, 2, 0}, + {5, 6, 1, 0, 2, 0}, {30, 0, 1, 0, 5, 170}, {5, 216, 1, 0, 5, 0}, {5, 226, 1, 0, 5, 0}, @@ -346,8 +348,8 @@ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = { }; /* Reindexing of NFC first characters. */ -#define TOTAL_FIRST 376 -#define TOTAL_LAST 62 +#define TOTAL_FIRST 377 +#define TOTAL_LAST 63 struct reindex{int start;short count,index;}; static struct reindex nfc_first[] = { { 60, 2, 0}, @@ -560,6 +562,7 @@ static struct reindex nfc_first[] = { { 70471, 0, 372}, { 70841, 0, 373}, { 71096, 1, 374}, + { 71989, 0, 376}, {0,0,0} }; @@ -603,6 +606,7 @@ static struct reindex nfc_last[] = { { 70842, 0, 59}, { 70845, 0, 60}, { 71087, 0, 61}, + { 71984, 0, 62}, {0,0,0} }; @@ -736,40 +740,40 @@ static const unsigned short index1[] = { 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 123, 124, 125, 126, 127, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 138, 41, 41, 145, 138, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 138, 157, 138, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 138, 167, 168, 138, 169, 170, 171, 172, - 138, 173, 174, 138, 175, 176, 177, 138, 138, 178, 179, 180, 181, 138, - 182, 138, 183, 41, 41, 41, 41, 41, 41, 41, 184, 185, 41, 186, 138, 138, + 149, 150, 151, 152, 153, 154, 155, 156, 138, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 138, 168, 169, 138, 170, 171, 172, 173, + 138, 174, 175, 176, 177, 178, 179, 138, 138, 180, 181, 182, 183, 138, + 184, 138, 185, 41, 41, 41, 41, 41, 41, 41, 186, 187, 41, 188, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 41, 41, 41, 41, 41, 41, 41, 41, 187, 138, 138, + 138, 138, 138, 138, 138, 41, 41, 41, 41, 41, 41, 41, 41, 189, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 41, 41, 41, 41, 188, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 41, 41, 41, 41, 190, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 41, 41, 41, 41, 189, 190, 191, 192, 138, 138, 138, 138, 193, - 194, 195, 196, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 138, 138, 41, 41, 41, 41, 191, 192, 193, 194, 138, 138, 138, 138, 195, + 196, 197, 198, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 101, 197, 101, 101, 101, 101, 101, - 198, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 101, 101, 101, 101, 101, 101, 101, 101, 199, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 200, 201, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 101, 101, 199, 101, 101, 200, 138, 138, 138, + 138, 138, 138, 138, 138, 101, 101, 202, 101, 101, 203, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 201, 202, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 204, 205, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 78, 203, - 204, 205, 206, 207, 208, 138, 209, 210, 211, 212, 213, 214, 215, 216, 78, - 78, 78, 78, 217, 218, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 219, 138, 220, 138, 138, 221, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 222, 223, 224, 138, 138, 138, 138, 138, 225, 226, 227, 138, - 228, 229, 138, 138, 230, 231, 232, 233, 234, 138, 235, 236, 237, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 78, 206, + 207, 208, 209, 210, 211, 138, 212, 213, 214, 215, 216, 217, 218, 219, 78, + 78, 78, 78, 220, 221, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 222, 138, 223, 138, 138, 224, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 225, 226, 227, 138, 138, 138, 138, 138, 228, 229, 230, 138, + 231, 232, 138, 138, 233, 234, 235, 236, 237, 138, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 138, 138, 138, 138, 138, 138, 138, 138, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, @@ -794,22 +798,22 @@ static const unsigned short index1[] = { 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 251, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 256, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 252, 101, 253, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 257, 101, 258, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 254, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 259, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 255, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 122, 122, 122, 122, 256, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 101, 101, 101, 260, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 122, 122, 122, 122, 261, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 262, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, @@ -1209,7 +1213,7 @@ static const unsigned short index1[] = { 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 257, 138, 258, 259, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 263, 138, 264, 265, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, @@ -1282,7 +1286,7 @@ static const unsigned short index1[] = { 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, - 121, 121, 121, 121, 121, 121, 121, 260, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 266, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, @@ -1319,7 +1323,7 @@ static const unsigned short index1[] = { 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, - 121, 260, + 121, 266, }; static const unsigned short index2[] = { @@ -1452,172 +1456,171 @@ static const unsigned short index2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 0, 118, 118, 118, 118, 118, 118, 118, 118, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 108, 86, 81, 81, 86, 81, 81, 86, 81, 81, 81, - 86, 86, 86, 121, 122, 123, 81, 81, 81, 86, 81, 81, 86, 86, 81, 81, 81, - 81, 81, 135, 135, 135, 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 141, 48, 48, 48, 48, 48, 48, 48, 141, 48, - 48, 141, 48, 48, 48, 48, 48, 135, 140, 142, 48, 140, 140, 140, 135, 135, - 135, 135, 135, 135, 135, 135, 140, 140, 140, 140, 143, 140, 140, 48, 81, - 86, 81, 81, 135, 135, 135, 144, 144, 144, 144, 144, 144, 144, 144, 48, - 48, 135, 135, 83, 83, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 83, 53, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, - 140, 140, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 0, 0, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 0, 0, 48, 48, 48, 48, 0, - 0, 146, 48, 147, 140, 140, 135, 135, 135, 135, 0, 0, 140, 140, 0, 0, 148, - 148, 143, 48, 0, 0, 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 144, 144, 0, 144, - 48, 48, 135, 135, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 48, 48, 85, 85, 149, 149, 149, 149, 149, 149, 80, 85, 48, 83, 81, 0, 0, - 135, 135, 140, 0, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 48, 48, 0, 0, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 144, 0, 48, 144, 0, 48, - 48, 0, 0, 146, 0, 140, 140, 140, 135, 135, 0, 0, 0, 0, 135, 135, 0, 0, - 135, 135, 143, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 144, 144, 144, 48, 0, - 144, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 145, 135, 135, 48, 48, 48, 135, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, - 135, 140, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, - 48, 0, 0, 146, 48, 140, 140, 140, 135, 135, 135, 135, 135, 0, 135, 135, - 140, 0, 140, 140, 143, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 48, 48, 135, 135, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, - 145, 145, 83, 85, 0, 0, 0, 0, 0, 0, 0, 48, 135, 135, 135, 135, 135, 135, - 0, 135, 140, 140, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 0, 0, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, - 48, 48, 0, 0, 146, 48, 147, 135, 140, 135, 135, 135, 135, 0, 0, 140, 148, - 0, 0, 148, 148, 143, 0, 0, 0, 0, 0, 0, 0, 0, 150, 147, 0, 0, 0, 0, 144, - 144, 0, 48, 48, 48, 135, 135, 0, 0, 145, 145, 145, 145, 145, 145, 145, - 145, 145, 145, 80, 48, 149, 149, 149, 149, 149, 149, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 135, 48, 0, 48, 48, 48, 48, 48, 48, 0, 0, 0, 48, 48, 48, 0, 48, - 48, 141, 48, 0, 0, 0, 48, 48, 0, 48, 0, 48, 48, 0, 0, 0, 48, 48, 0, 0, 0, - 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, - 0, 0, 0, 147, 140, 135, 140, 140, 0, 0, 0, 140, 140, 140, 0, 148, 148, - 148, 143, 0, 0, 48, 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 149, 149, - 149, 26, 26, 26, 26, 26, 26, 85, 26, 0, 0, 0, 0, 0, 135, 140, 140, 140, - 135, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, - 0, 0, 48, 135, 135, 135, 140, 140, 140, 140, 0, 135, 135, 151, 0, 135, - 135, 135, 143, 0, 0, 0, 0, 0, 0, 0, 152, 153, 0, 48, 48, 48, 0, 0, 0, 0, - 0, 48, 48, 135, 135, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 145, 0, 0, 0, 0, 0, 0, 0, 83, 154, 154, 154, 154, 154, 154, 154, 80, 48, - 135, 140, 140, 83, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, - 48, 48, 0, 0, 146, 48, 140, 155, 148, 140, 147, 140, 140, 0, 155, 148, - 148, 0, 148, 148, 135, 143, 0, 0, 0, 0, 0, 0, 0, 147, 147, 0, 0, 0, 0, 0, - 0, 0, 48, 0, 48, 48, 135, 135, 0, 0, 145, 145, 145, 145, 145, 145, 145, - 145, 145, 145, 0, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, - 135, 140, 140, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 143, 143, 48, 147, 140, 140, 135, 135, 135, 135, 0, 140, - 140, 140, 0, 148, 148, 148, 143, 48, 80, 0, 0, 0, 0, 48, 48, 48, 147, - 149, 149, 149, 149, 149, 149, 149, 48, 48, 48, 135, 135, 0, 0, 145, 145, - 145, 145, 145, 145, 145, 145, 145, 145, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 80, 48, 48, 48, 48, 48, 48, 0, 0, 140, 140, 0, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 0, - 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 156, 0, 0, 0, 0, 147, 140, 140, 135, - 135, 135, 0, 135, 0, 140, 140, 148, 140, 148, 148, 148, 147, 0, 0, 0, 0, - 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 140, 140, - 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 135, 48, 157, 135, 135, 135, 135, 158, 158, 143, 0, 0, 0, - 0, 85, 48, 48, 48, 48, 48, 48, 53, 135, 159, 159, 159, 159, 135, 135, - 135, 83, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 83, 83, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 48, 0, 48, 48, 48, 48, 48, 0, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 0, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 135, 48, 157, 135, 135, 135, 135, 160, 160, 143, 135, 135, 48, 0, 0, 48, - 48, 48, 48, 48, 0, 53, 0, 161, 161, 161, 161, 135, 135, 0, 0, 145, 145, - 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 157, 157, 48, 48, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 48, 80, 80, 80, 83, 83, 83, 83, 83, 83, 83, 83, 162, 83, - 83, 83, 83, 83, 83, 80, 83, 80, 80, 80, 86, 86, 80, 80, 80, 80, 80, 80, - 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 80, 86, 80, 86, 80, 163, 164, 165, 164, - 165, 140, 140, 48, 48, 48, 144, 48, 48, 48, 48, 0, 48, 48, 48, 48, 144, + 118, 118, 0, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 108, 86, 81, 81, 86, + 81, 81, 86, 81, 81, 81, 86, 86, 86, 121, 122, 123, 81, 81, 81, 86, 81, + 81, 86, 86, 81, 81, 81, 81, 81, 135, 135, 135, 140, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 141, 48, 48, 48, + 48, 48, 48, 48, 141, 48, 48, 141, 48, 48, 48, 48, 48, 135, 140, 142, 48, + 140, 140, 140, 135, 135, 135, 135, 135, 135, 135, 135, 140, 140, 140, + 140, 143, 140, 140, 48, 81, 86, 81, 81, 135, 135, 135, 144, 144, 144, + 144, 144, 144, 144, 144, 48, 48, 135, 135, 83, 83, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 83, 53, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 135, 140, 140, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, + 0, 0, 0, 48, 48, 48, 48, 0, 0, 146, 48, 147, 140, 140, 135, 135, 135, + 135, 0, 0, 140, 140, 0, 0, 148, 148, 143, 48, 0, 0, 0, 0, 0, 0, 0, 0, + 147, 0, 0, 0, 0, 144, 144, 0, 144, 48, 48, 135, 135, 0, 0, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 48, 48, 85, 85, 149, 149, 149, 149, + 149, 149, 80, 85, 48, 83, 81, 0, 0, 135, 135, 140, 0, 48, 48, 48, 48, 48, + 48, 0, 0, 0, 0, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, + 48, 0, 48, 144, 0, 48, 144, 0, 48, 48, 0, 0, 146, 0, 140, 140, 140, 135, + 135, 0, 0, 0, 0, 135, 135, 0, 0, 135, 135, 143, 0, 0, 0, 135, 0, 0, 0, 0, + 0, 0, 0, 144, 144, 144, 48, 0, 144, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 135, 135, 48, 48, 48, 135, 83, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, 140, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 0, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, + 48, 0, 48, 48, 48, 48, 48, 0, 0, 146, 48, 140, 140, 140, 135, 135, 135, + 135, 135, 0, 135, 135, 140, 0, 140, 140, 143, 0, 0, 48, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 135, 135, 0, 0, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 83, 85, 0, 0, 0, 0, 0, 0, 0, 48, 135, 135, + 135, 135, 135, 135, 0, 135, 140, 140, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, + 48, 0, 48, 48, 48, 48, 48, 0, 0, 146, 48, 147, 135, 140, 135, 135, 135, + 135, 0, 0, 140, 148, 0, 0, 148, 148, 143, 0, 0, 0, 0, 0, 0, 0, 135, 150, + 147, 0, 0, 0, 0, 144, 144, 0, 48, 48, 48, 135, 135, 0, 0, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 80, 48, 149, 149, 149, 149, 149, 149, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 48, 0, 48, 48, 48, 48, 48, 48, 0, 0, + 0, 48, 48, 48, 0, 48, 48, 141, 48, 0, 0, 0, 48, 48, 0, 48, 0, 48, 48, 0, + 0, 0, 48, 48, 0, 0, 0, 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 0, 0, 0, 0, 147, 140, 135, 140, 140, 0, 0, 0, 140, + 140, 140, 0, 148, 148, 148, 143, 0, 0, 48, 0, 0, 0, 0, 0, 0, 147, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 149, 149, 149, 26, 26, 26, 26, 26, 26, 85, 26, 0, 0, 0, 0, + 0, 135, 140, 140, 140, 135, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, + 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 0, 0, 0, 48, 135, 135, 135, 140, 140, 140, 140, + 0, 135, 135, 151, 0, 135, 135, 135, 143, 0, 0, 0, 0, 0, 0, 0, 152, 153, + 0, 48, 48, 48, 0, 0, 0, 0, 0, 48, 48, 135, 135, 0, 0, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 0, 83, 154, 154, 154, + 154, 154, 154, 154, 80, 48, 135, 140, 140, 83, 48, 48, 48, 48, 48, 48, + 48, 48, 0, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 0, 0, 146, 48, 140, 155, 148, 140, + 147, 140, 140, 0, 155, 148, 148, 0, 148, 148, 135, 143, 0, 0, 0, 0, 0, 0, + 0, 147, 147, 0, 0, 0, 0, 0, 0, 0, 48, 0, 48, 48, 135, 135, 0, 0, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 48, 48, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 135, 135, 140, 140, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 0, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 143, 143, 48, 147, 140, 140, 135, + 135, 135, 135, 0, 140, 140, 140, 0, 148, 148, 148, 143, 48, 80, 0, 0, 0, + 0, 48, 48, 48, 147, 149, 149, 149, 149, 149, 149, 149, 48, 48, 48, 135, + 135, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 80, 48, 48, 48, 48, 48, 48, 0, 135, + 140, 140, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 0, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 156, 0, 0, + 0, 0, 147, 140, 140, 135, 135, 135, 0, 135, 0, 140, 140, 148, 140, 148, + 148, 148, 147, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 0, 0, 140, 140, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 48, 157, 135, 135, 135, 135, + 158, 158, 143, 0, 0, 0, 0, 85, 48, 48, 48, 48, 48, 48, 53, 135, 159, 159, + 159, 159, 135, 135, 135, 83, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 48, 0, 48, + 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 135, 48, 157, 135, 135, 135, 135, 160, 160, 143, 135, + 135, 48, 0, 0, 48, 48, 48, 48, 48, 0, 53, 0, 161, 161, 161, 161, 135, + 135, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 157, + 157, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 80, 80, 80, 83, 83, 83, 83, 83, + 83, 83, 83, 162, 83, 83, 83, 83, 83, 83, 80, 83, 80, 80, 80, 86, 86, 80, + 80, 80, 80, 80, 80, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 80, 86, 80, 86, 80, + 163, 164, 165, 164, 165, 140, 140, 48, 48, 48, 144, 48, 48, 48, 48, 0, 48, 48, 48, 48, 144, 48, 48, 48, 48, 144, 48, 48, 48, 48, 144, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 144, 48, 48, 48, 0, 0, 0, 0, 166, - 167, 168, 169, 168, 168, 170, 168, 170, 167, 167, 167, 167, 135, 140, - 167, 168, 81, 81, 143, 83, 81, 81, 48, 48, 48, 48, 48, 135, 135, 135, - 135, 135, 135, 168, 135, 135, 135, 135, 0, 135, 135, 135, 135, 168, 135, - 135, 135, 135, 168, 135, 135, 135, 135, 168, 135, 135, 135, 135, 168, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 168, 135, - 135, 135, 0, 80, 80, 80, 80, 80, 80, 80, 80, 86, 80, 80, 80, 80, 80, 80, - 0, 80, 80, 83, 83, 83, 83, 83, 80, 80, 80, 80, 83, 83, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 141, 48, 48, 48, 48, 140, 140, 135, 150, 135, - 135, 140, 135, 135, 135, 135, 135, 146, 140, 143, 143, 140, 140, 135, - 135, 48, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 83, 83, 83, - 83, 83, 83, 48, 48, 48, 48, 48, 48, 140, 140, 135, 135, 48, 48, 48, 48, - 135, 135, 135, 48, 140, 140, 140, 48, 48, 140, 140, 140, 140, 140, 140, - 140, 48, 48, 48, 135, 135, 135, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 135, 140, 140, 135, 135, 140, 140, 140, 140, 140, 140, - 86, 48, 140, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 140, 140, - 140, 135, 80, 80, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 48, 48, 144, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 144, 48, 48, + 48, 0, 0, 0, 0, 166, 167, 168, 169, 168, 168, 170, 168, 170, 167, 167, + 167, 167, 135, 140, 167, 168, 81, 81, 143, 83, 81, 81, 48, 48, 48, 48, + 48, 135, 135, 135, 135, 135, 135, 168, 135, 135, 135, 135, 0, 135, 135, + 135, 135, 168, 135, 135, 135, 135, 168, 135, 135, 135, 135, 168, 135, + 135, 135, 135, 168, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 168, 135, 135, 135, 0, 80, 80, 80, 80, 80, 80, 80, 80, 86, 80, + 80, 80, 80, 80, 80, 0, 80, 80, 83, 83, 83, 83, 83, 80, 80, 80, 80, 83, + 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 141, 48, 48, 48, 48, 140, + 140, 135, 150, 135, 135, 140, 135, 135, 135, 135, 135, 146, 140, 143, + 143, 140, 140, 135, 135, 48, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 83, 83, 83, 83, 83, 83, 48, 48, 48, 48, 48, 48, 140, 140, 135, 135, + 48, 48, 48, 48, 135, 135, 135, 48, 140, 140, 140, 48, 48, 140, 140, 140, + 140, 140, 140, 140, 48, 48, 48, 135, 135, 135, 135, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 135, 140, 140, 135, 135, 140, 140, 140, + 140, 140, 140, 86, 48, 140, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 140, 140, 140, 135, 80, 80, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 0, 44, 0, 0, 0, 0, 0, 44, 0, 0, 47, 47, 47, 47, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 44, 0, 0, 0, 0, 0, 44, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 83, 51, 47, 47, 47, 171, 171, 171, 171, 171, 171, 171, 171, + 47, 47, 47, 47, 47, 47, 47, 83, 51, 47, 47, 47, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 48, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 48, 48, 48, 48, + 171, 171, 171, 171, 171, 171, 171, 48, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 172, 172, 172, 172, 172, 172, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, - 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 48, 48, 48, - 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, + 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 48, + 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, - 48, 48, 48, 48, 48, 0, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, - 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, + 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 81, 81, - 81, 83, 83, 83, 83, 83, 83, 83, 83, 83, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, - 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, + 81, 81, 81, 83, 83, 83, 83, 83, 83, 83, 83, 83, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 47, 47, 47, 47, 47, 47, 0, 0, - 84, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 47, 47, 47, 47, 47, 47, + 0, 0, 84, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, @@ -1636,45 +1639,46 @@ static const unsigned short index2[] = { 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 80, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 173, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 164, 165, 0, - 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 80, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 173, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 164, 165, + 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 83, 83, 83, 174, 174, 174, 48, 48, 48, 48, 48, 48, 48, - 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 0, 48, 48, 48, 48, 135, 135, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 135, 135, 143, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 0, 48, 48, 48, 0, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, + 48, 48, 48, 48, 48, 83, 83, 83, 174, 174, 174, 48, 48, 48, 48, 48, 48, + 48, 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 0, 48, 48, 48, 48, 135, 135, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 135, 135, 143, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 0, 48, 48, 48, 0, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 140, - 135, 135, 135, 135, 135, 135, 135, 140, 140, 140, 140, 140, 140, 140, - 140, 135, 140, 140, 135, 135, 135, 135, 135, 135, 135, 135, 135, 143, - 135, 83, 83, 83, 53, 83, 83, 83, 85, 48, 81, 0, 0, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 0, 0, 0, 0, 0, 0, 138, 138, 138, 138, 138, 138, - 84, 138, 138, 138, 138, 135, 135, 135, 175, 0, 145, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, + 140, 135, 135, 135, 135, 135, 135, 135, 140, 140, 140, 140, 140, 140, + 140, 140, 135, 140, 140, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 143, 135, 83, 83, 83, 53, 83, 83, 83, 85, 48, 81, 0, 0, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 0, 0, 0, 0, 0, 0, 138, 138, 138, 138, 138, + 138, 84, 138, 138, 138, 138, 135, 135, 135, 175, 0, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, - 48, 48, 135, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, + 48, 48, 48, 135, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 88, 48, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 88, 48, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 0, 135, 135, 135, 140, 140, 140, 140, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 135, 135, 135, 140, 140, 140, 140, 135, 135, 140, 140, 140, 0, 0, 0, 0, 140, 140, 135, 140, 140, 140, 140, 140, 140, 87, 81, 86, 0, 0, 0, 0, 26, 0, 0, 0, 138, 138, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 48, 48, 48, 48, 48, 48, 48, 48, 48, @@ -1698,37 +1702,37 @@ static const unsigned short index2[] = { 145, 145, 145, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 83, 83, 83, 83, 83, 83, 83, 53, 83, 83, 83, 83, 83, 83, 0, 0, 81, 81, 81, 81, 81, 86, 86, 86, 86, 86, 86, 81, 81, 86, - 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 82, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, 135, - 140, 48, 141, 48, 141, 48, 141, 48, 141, 48, 141, 48, 48, 48, 141, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, + 135, 140, 48, 141, 48, 141, 48, 141, 48, 141, 48, 141, 48, 48, 48, 141, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 146, 147, 135, - 135, 135, 135, 135, 148, 135, 148, 140, 140, 148, 148, 135, 148, 176, 48, - 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, - 145, 145, 145, 83, 83, 83, 83, 83, 83, 83, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 81, 86, 81, 81, 81, 81, 81, 81, 81, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 0, 0, 0, 135, 135, 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 146, 147, + 135, 135, 135, 135, 135, 148, 135, 148, 140, 140, 148, 148, 135, 148, + 176, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 83, 83, 83, 83, 83, 83, 83, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 81, 86, 81, 81, 81, 81, 81, 81, 81, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 0, 0, 0, 135, 135, 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 140, 135, 135, 135, 135, 140, 140, 135, 135, 176, 143, 135, - 135, 48, 48, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 48, 48, + 48, 48, 48, 48, 48, 140, 135, 135, 135, 135, 140, 140, 135, 135, 176, + 143, 135, 135, 48, 48, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 146, 140, 135, 135, 140, 140, 140, 135, 140, 135, - 135, 135, 176, 176, 0, 0, 0, 0, 0, 0, 0, 0, 83, 83, 83, 83, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 146, 140, 135, 135, 140, 140, 140, 135, + 140, 135, 135, 135, 176, 176, 0, 0, 0, 0, 0, 0, 0, 0, 83, 83, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, - 140, 140, 140, 140, 140, 140, 135, 135, 135, 135, 135, 135, 135, 135, - 140, 140, 135, 146, 0, 0, 0, 83, 83, 83, 83, 83, 145, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 0, 0, 0, 48, 48, 48, 145, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, + 140, 140, 140, 140, 140, 140, 140, 135, 135, 135, 135, 135, 135, 135, + 135, 140, 140, 135, 146, 0, 0, 0, 83, 83, 83, 83, 83, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 0, 0, 0, 48, 48, 48, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 53, 53, 53, 53, 53, 53, 83, 83, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, - 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 48, 53, 53, 53, 53, 53, 53, 83, 83, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 44, 44, 44, 83, 83, 83, - 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 81, 83, 177, 86, 86, - 86, 86, 86, 81, 81, 86, 86, 86, 86, 81, 140, 177, 177, 177, 177, 177, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 44, 44, 44, 83, 83, + 83, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 81, 83, 177, 86, + 86, 86, 86, 86, 81, 81, 86, 86, 86, 86, 81, 140, 177, 177, 177, 177, 177, 177, 177, 48, 48, 48, 48, 86, 48, 48, 48, 48, 48, 48, 81, 48, 48, 140, 81, 81, 48, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, @@ -1941,33 +1945,33 @@ static const unsigned short index2[] = { 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 248, 26, 44, 44, 44, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 248, 26, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 0, 44, 47, 44, 44, 44, 47, 47, 44, 47, 44, 47, 44, 47, 44, 44, - 44, 44, 47, 44, 47, 47, 44, 47, 47, 47, 47, 47, 47, 51, 51, 44, 44, 44, - 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 47, 44, 47, 44, 47, 47, 26, 26, 26, 26, 26, 26, 44, 47, - 44, 47, 81, 81, 81, 44, 47, 0, 0, 0, 0, 0, 138, 138, 138, 138, 154, 138, - 138, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 0, 44, 47, 44, 44, 44, 47, 47, 44, 47, 44, 47, 44, 47, 44, + 44, 44, 44, 47, 44, 47, 47, 44, 47, 47, 47, 47, 47, 47, 51, 51, 44, 44, + 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, + 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, + 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, + 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, + 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, + 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 47, 26, 26, 26, 26, 26, 26, 44, + 47, 44, 47, 81, 81, 81, 44, 47, 0, 0, 0, 0, 0, 138, 138, 138, 138, 154, + 138, 138, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 0, 47, 0, 0, 0, 0, 0, 47, 0, 0, 48, 48, 48, 48, 48, 48, 48, + 47, 47, 47, 47, 0, 47, 0, 0, 0, 0, 0, 47, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, - 51, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, + 0, 51, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, @@ -1979,9 +1983,9 @@ static const unsigned short index2[] = { 138, 84, 138, 138, 84, 138, 28, 36, 138, 138, 28, 36, 164, 165, 164, 165, 164, 165, 164, 165, 138, 138, 138, 138, 138, 52, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 84, 84, 138, 138, 138, 138, 84, 138, 197, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 0, 0, 0, 0, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 26, 26, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, 241, 241, 241, 241, 249, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, @@ -2039,26 +2043,27 @@ static const unsigned short index2[] = { 269, 0, 270, 270, 271, 271, 271, 271, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 171, 171, 171, 171, 171, 171, 171, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 272, 272, 272, 272, 272, 272, 272, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 249, 249, 0, 271, + 271, 271, 271, 271, 271, 271, 271, 271, 271, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 249, 249, 0, 271, 271, 271, 271, - 271, 271, 271, 271, 271, 271, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 273, 273, 273, + 273, 273, 273, 273, 273, 249, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 273, 273, 273, 273, 273, 273, - 273, 273, 249, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 249, 249, 249, 270, 271, 271, 271, + 271, 271, 271, 271, 271, 271, 271, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 249, 249, 249, 270, 271, 271, 271, 271, 271, 271, - 271, 271, 271, 271, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 249, 249, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 249, 249, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, @@ -2069,17 +2074,17 @@ static const unsigned short index2[] = { 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 249, 249, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 249, 249, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 249, 249, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 249, + 272, 272, 249, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -2092,11 +2097,11 @@ static const unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 171, + 26, 26, 26, 26, 26, 26, 26, 26, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -2104,10 +2109,9 @@ static const unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 252, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 252, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -2115,44 +2119,45 @@ static const unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 241, 241, 241, 241, 241, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, + 241, 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 53, 53, 53, 53, 53, 53, 83, 83, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 53, 138, 138, 138, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 145, 145, 145, 145, 145, 145, 145, 145, - 145, 145, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 48, 53, 53, 53, 53, 53, 53, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 53, 138, 138, 138, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 48, 81, 82, 82, 82, 138, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 138, 52, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 48, 81, 82, 82, 82, 138, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 138, 52, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, - 47, 44, 47, 51, 51, 81, 81, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 47, 51, 51, 81, 81, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 81, - 81, 83, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 54, 54, 44, 47, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 47, 44, 47, 47, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 48, 48, 48, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 81, 81, 83, + 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 54, 54, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 47, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 51, - 47, 47, 47, 47, 47, 47, 47, 47, 44, 47, 44, 47, 44, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 47, 52, 275, 275, 44, 47, 44, 47, 48, 44, 47, 44, 47, 47, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 51, 47, 47, + 47, 47, 47, 47, 47, 47, 44, 47, 44, 47, 44, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 52, 275, 275, 44, 47, 44, 47, 48, 44, 47, 44, 47, 47, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 44, 44, 44, 44, 47, 44, 44, 44, 44, 44, 47, 44, 47, 44, - 47, 44, 47, 44, 47, 44, 47, 0, 0, 44, 47, 44, 44, 44, 0, 0, 0, 0, 0, 0, + 47, 44, 44, 44, 44, 44, 47, 44, 44, 44, 44, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 0, 0, 44, 47, 44, 44, 44, 44, 47, 44, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 51, 51, 47, 48, - 48, 48, 48, 48, 48, 48, 135, 48, 48, 48, 143, 48, 48, 48, 48, 135, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 47, 48, 51, 51, 47, 48, 48, + 48, 48, 48, 48, 48, 135, 48, 48, 48, 143, 48, 48, 48, 48, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 140, 140, 135, 135, 140, 26, 26, 26, 26, 0, 0, 0, 0, 149, + 48, 48, 48, 140, 140, 135, 135, 140, 26, 26, 26, 26, 143, 0, 0, 0, 149, 149, 149, 149, 149, 149, 80, 80, 85, 227, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, @@ -2199,15 +2204,15 @@ static const unsigned short index2[] = { 48, 48, 48, 48, 48, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 275, 51, 51, 51, 51, - 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 51, 54, 54, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 140, 140, 135, 140, 140, 135, 140, 140, 83, 140, 143, 0, 0, - 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 265, + 48, 48, 48, 48, 140, 140, 135, 140, 140, 135, 140, 140, 83, 140, 143, 0, + 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, @@ -2219,12 +2224,12 @@ static const unsigned short index2[] = { 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 0, 0, 0, 0, 276, 276, 276, 276, 276, 276, 276, 276, + 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, @@ -2233,7 +2238,7 @@ static const unsigned short index2[] = { 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 277, 277, 277, 277, 277, 277, + 276, 276, 276, 276, 276, 276, 276, 276, 276, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, @@ -2242,7 +2247,7 @@ static const unsigned short index2[] = { 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 278, 278, 278, 278, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, @@ -2252,14 +2257,14 @@ static const unsigned short index2[] = { 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 171, 171, - 278, 171, 278, 171, 171, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 171, 278, 171, 278, 171, 171, 278, 278, 171, 171, 171, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 171, + 171, 278, 171, 278, 171, 171, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 171, 278, 171, 278, 171, 171, 278, 278, 171, 171, 171, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 0, 0, 278, 278, 278, + 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 0, 0, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, @@ -2267,22 +2272,22 @@ static const unsigned short index2[] = { 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, - 35, 35, 35, 35, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 35, 35, - 35, 0, 0, 0, 0, 0, 279, 280, 279, 281, 281, 281, 281, 281, 281, 281, 281, - 281, 217, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, - 279, 0, 279, 279, 279, 279, 279, 0, 279, 0, 279, 279, 0, 279, 279, 0, - 279, 279, 279, 279, 279, 279, 279, 279, 279, 281, 131, 131, 131, 131, + 278, 278, 278, 278, 278, 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, + 35, 35, 35, 0, 0, 0, 0, 0, 279, 280, 279, 281, 281, 281, 281, 281, 281, + 281, 281, 281, 217, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, + 279, 279, 279, 0, 279, 279, 279, 279, 279, 0, 279, 0, 279, 279, 0, 279, + 279, 0, 279, 279, 279, 279, 279, 279, 279, 279, 279, 281, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, @@ -2299,8 +2304,8 @@ static const unsigned short index2[] = { 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 283, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 283, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, @@ -2369,9 +2374,9 @@ static const unsigned short index2[] = { 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 154, 154, 154, 154, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 154, 154, 26, 80, 80, 0, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2520,188 +2525,202 @@ static const unsigned short index2[] = { 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 325, 325, 325, 325, 325, 325, - 325, 325, 325, 325, 107, 0, 0, 0, 0, 0, 0, 0, 0, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 86, 86, 81, 81, 81, 86, 81, 86, 86, 86, 86, 330, 330, 330, - 330, 113, 113, 113, 113, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 0, 81, 81, 102, 0, 0, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 107, 0, + 0, 0, 0, 0, 0, 0, 0, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 86, 86, 81, + 81, 81, 86, 81, 86, 86, 86, 86, 330, 330, 330, 330, 113, 113, 113, 113, + 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 140, 135, 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 107, 107, 325, 325, 325, 325, 325, 325, 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 135, 140, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 143, 83, 83, 83, 83, 83, 83, 83, + 0, 0, 0, 0, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, + 135, 135, 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 141, 48, 141, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 141, 48, 48, 48, 48, 140, 140, 140, 135, + 135, 135, 135, 140, 140, 143, 142, 83, 83, 190, 83, 83, 83, 83, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 190, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, + 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, + 0, 0, 81, 81, 81, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 143, 83, 83, 83, 83, 83, 83, 83, 0, 0, 0, 0, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 135, 135, 140, 48, 48, 48, 48, + 48, 48, 48, 48, 150, 135, 135, 135, 135, 140, 135, 151, 151, 135, 135, + 135, 143, 143, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 83, + 83, 83, 83, 48, 140, 140, 48, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 141, 48, 141, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 141, 48, 48, 48, 48, 140, 140, 140, 135, 135, 135, 135, 140, 140, 143, - 142, 83, 83, 190, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 190, - 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 81, 81, 81, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 146, 83, 83, 48, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 135, 135, 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 150, 135, - 135, 135, 135, 140, 135, 151, 151, 135, 135, 135, 143, 143, 0, 145, 145, - 145, 145, 145, 145, 145, 145, 145, 145, 83, 83, 83, 83, 48, 140, 140, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 146, 83, 83, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, - 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 140, 140, 140, 135, 135, 135, 135, 135, 135, 135, 135, 135, 140, + 176, 48, 48, 48, 48, 83, 83, 83, 83, 135, 146, 135, 135, 83, 140, 135, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 48, 83, 48, 83, 83, 83, + 0, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, 140, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 140, 176, 48, 48, 48, 48, 83, 83, - 83, 83, 135, 146, 135, 135, 83, 0, 0, 145, 145, 145, 145, 145, 145, 145, - 145, 145, 145, 48, 83, 48, 83, 83, 83, 0, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, - 140, 135, 135, 135, 140, 140, 135, 176, 146, 135, 83, 83, 83, 83, 83, 83, - 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 140, 140, 140, 135, 135, 135, 140, 140, 135, 176, + 146, 135, 83, 83, 83, 83, 83, 83, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, - 48, 48, 0, 48, 0, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 83, 0, - 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 140, - 140, 140, 135, 135, 135, 135, 135, 135, 146, 143, 0, 0, 0, 0, 0, 145, - 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 135, 135, - 140, 140, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 0, 0, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, - 0, 146, 146, 48, 147, 140, 135, 140, 140, 140, 140, 0, 0, 140, 140, 0, 0, - 148, 148, 176, 0, 0, 48, 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 48, 48, - 48, 48, 48, 140, 140, 0, 0, 81, 81, 81, 81, 81, 81, 81, 0, 0, 0, 81, 81, - 81, 81, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 48, 48, 48, 48, + 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 83, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, 140, 135, 135, 135, - 135, 135, 135, 135, 135, 140, 140, 143, 135, 135, 140, 146, 48, 48, 48, - 48, 83, 83, 83, 83, 83, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 0, 83, 0, 83, 81, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 135, 140, 140, 140, 135, 135, 135, 135, 135, 135, + 146, 143, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 0, 0, 0, 0, 0, 0, 135, 135, 140, 140, 0, 48, 48, 48, 48, 48, 48, 48, + 48, 0, 0, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, + 48, 48, 0, 48, 48, 48, 48, 48, 0, 146, 146, 48, 147, 140, 135, 140, 140, + 140, 140, 0, 0, 140, 140, 0, 0, 148, 148, 176, 0, 0, 48, 0, 0, 0, 0, 0, + 0, 147, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 140, 140, 0, 0, 81, 81, 81, + 81, 81, 81, 81, 0, 0, 0, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 147, 140, 140, 135, 135, 135, 135, 135, 135, 140, - 150, 148, 148, 147, 148, 135, 135, 140, 143, 146, 48, 48, 83, 48, 0, 0, - 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, + 140, 140, 140, 135, 135, 135, 135, 135, 135, 135, 135, 140, 140, 143, + 135, 135, 140, 146, 48, 48, 48, 48, 83, 83, 83, 83, 83, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 83, 83, 0, 83, 81, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 147, 140, 140, 135, 135, 135, 135, 0, 0, 140, 140, 148, 148, 135, - 135, 140, 143, 146, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 48, 48, 48, 48, 135, 135, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 147, 140, + 140, 135, 135, 135, 135, 135, 135, 140, 150, 148, 148, 147, 148, 135, + 135, 140, 143, 146, 48, 48, 83, 48, 0, 0, 0, 0, 0, 0, 0, 0, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 147, 140, 140, 135, + 135, 135, 135, 0, 0, 140, 140, 148, 148, 135, 135, 140, 143, 146, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 48, 48, 48, 48, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 140, 140, 140, 135, 135, 135, 135, 135, 135, 135, 135, 140, 140, 135, - 140, 143, 135, 83, 83, 83, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 145, - 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 140, - 135, 140, 140, 135, 135, 135, 135, 135, 135, 176, 146, 48, 0, 0, 0, 0, 0, - 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, 140, 135, 135, 135, + 135, 135, 135, 135, 135, 140, 140, 135, 140, 143, 135, 83, 83, 83, 48, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 0, 0, 0, 0, 0, 0, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 135, 140, 135, 140, 140, 135, 135, 135, + 135, 135, 135, 176, 146, 48, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 135, 135, 135, 140, 140, 135, - 135, 135, 135, 140, 135, 135, 135, 135, 143, 0, 0, 0, 0, 145, 145, 145, - 145, 145, 145, 145, 145, 145, 145, 149, 149, 83, 83, 83, 80, 0, 0, 0, 0, + 48, 48, 48, 0, 0, 135, 135, 135, 140, 140, 135, 135, 135, 135, 140, 135, + 135, 135, 135, 143, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 149, 149, 83, 83, 83, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, - 140, 140, 135, 135, 135, 135, 135, 135, 135, 135, 135, 140, 143, 146, 83, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, 140, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 140, 143, 146, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 47, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 145, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, - 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, 140, 135, 135, 135, - 135, 0, 0, 135, 135, 140, 140, 140, 140, 143, 48, 83, 48, 140, 0, 0, 0, + 47, 47, 47, 47, 47, 47, 47, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, 0, 0, 48, 48, 48, + 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 147, 140, 140, + 140, 140, 140, 0, 140, 148, 0, 0, 135, 135, 176, 143, 48, 140, 48, 140, + 146, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 48, 135, 135, 135, 135, 135, 135, 155, 155, 135, 135, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, - 143, 135, 135, 135, 135, 140, 48, 135, 135, 135, 135, 83, 83, 83, 83, 83, - 83, 83, 83, 143, 0, 0, 0, 0, 0, 0, 0, 0, 48, 135, 135, 135, 135, 135, - 135, 140, 140, 135, 135, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 140, 135, - 143, 83, 83, 83, 48, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, + 140, 135, 135, 135, 135, 0, 0, 135, 135, 140, 140, 140, 140, 143, 48, 83, + 48, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 48, 135, 135, 135, 135, 135, 135, 155, 155, 135, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, - 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 135, 143, 135, 135, 135, 135, 140, 48, 135, 135, 135, + 135, 83, 83, 83, 83, 83, 83, 83, 83, 143, 0, 0, 0, 0, 0, 0, 0, 0, 48, + 135, 135, 135, 135, 135, 135, 140, 140, 135, 135, 135, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 135, 135, - 135, 135, 135, 135, 135, 0, 135, 135, 135, 135, 135, 135, 140, 331, 48, - 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 145, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, 0, 0, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 0, 140, 135, 135, 135, 135, 135, 135, 135, 140, 135, - 135, 140, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 140, 135, 143, 83, 83, 83, 48, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, + 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 135, 135, 135, 135, 135, 135, 0, 0, 0, 135, 0, 135, 135, 0, 135, 135, - 135, 146, 135, 143, 143, 48, 135, 0, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, - 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, - 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 140, 140, 140, 140, 140, 0, 135, 135, 0, 140, 140, 135, 140, 143, 48, 0, - 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 140, 135, 135, 135, 135, 135, 135, 135, 0, 135, 135, 135, + 135, 135, 135, 140, 331, 48, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 0, 0, 0, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 0, 0, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 0, 140, 135, 135, 135, + 135, 135, 135, 135, 140, 135, 135, 140, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, + 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 135, 135, 135, 135, 135, 135, 0, 0, 0, 135, + 0, 135, 135, 0, 135, 135, 135, 146, 135, 143, 143, 48, 135, 0, 0, 0, 0, + 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, + 0, 0, 48, 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 140, 140, 140, 140, 140, 0, 135, 135, 0, 140, + 140, 135, 140, 143, 48, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 140, 140, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 26, 26, 26, 26, 26, 26, 26, 26, 85, 85, 85, 85, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, + 135, 140, 140, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 26, 26, 26, 26, 26, 26, + 26, 26, 85, 85, 85, 85, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, @@ -2709,78 +2728,78 @@ static const unsigned short index2[] = { 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, - 174, 0, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, + 174, 174, 174, 174, 174, 174, 174, 0, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 190, 190, 190, 190, - 190, 190, 190, 190, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 0, 190, 190, 190, 190, 190, 190, 190, 190, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 145, 145, 145, - 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 83, 83, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, + 0, 0, 0, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 0, 0, 177, 177, 177, 177, 177, 83, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, + 177, 177, 177, 177, 177, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 81, - 81, 81, 81, 81, 81, 81, 83, 83, 83, 83, 83, 80, 80, 80, 80, 53, 53, 53, - 53, 83, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 145, 145, 145, 145, 145, - 145, 145, 145, 145, 0, 149, 149, 149, 149, 149, 149, 149, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 81, 81, 81, 81, 81, 81, 81, 83, 83, + 83, 83, 83, 80, 80, 80, 80, 53, 53, 53, 53, 83, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 149, 149, + 149, 149, 149, 149, 149, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 0, 0, 0, 0, 135, 48, 140, 140, 140, 140, 140, 140, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, + 0, 135, 48, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, - 135, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 0, 0, 0, 0, 0, + 140, 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, 135, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 252, 251, 252, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 252, 252, 251, 252, 332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, 333, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -2788,22 +2807,27 @@ static const unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 0, 0, 0, 0, - 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, + 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -2813,79 +2837,88 @@ static const unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, - 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 80, 135, 177, 83, - 175, 175, 175, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 80, 135, 177, 83, 175, 175, 175, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 334, 334, 334, 334, 334, 334, 334, + 335, 335, 177, 177, 177, 80, 80, 80, 336, 335, 335, 335, 335, 335, 175, + 175, 175, 175, 175, 175, 175, 175, 86, 86, 86, 86, 86, 86, 86, 86, 80, + 80, 81, 81, 81, 81, 81, 86, 86, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 332, 332, 332, 332, 332, 332, 332, 333, 333, 177, 177, 177, - 80, 80, 80, 334, 333, 333, 333, 333, 333, 175, 175, 175, 175, 175, 175, - 175, 175, 86, 86, 86, 86, 86, 86, 86, 86, 80, 80, 81, 81, 81, 81, 81, 86, - 86, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 332, 332, 332, 332, 332, - 332, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 81, 81, 81, 81, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 334, 334, 334, 334, 334, 334, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 81, 81, - 81, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 26, 26, 26, 26, 81, 81, 81, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 0, 0, 0, 0, 0, 0, 0, 49, 49, 49, 49, 49, 49, 49, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 0, 0, 0, 0, 0, 0, + 0, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, - 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 49, 0, 49, 49, 0, 0, 49, 0, 0, 49, 49, 0, 0, 49, 49, - 49, 49, 0, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 0, 35, 0, 35, - 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 0, 49, 49, 0, 0, + 49, 0, 0, 49, 49, 0, 0, 49, 49, 49, 49, 0, 49, 49, 49, 49, 49, 49, 49, + 49, 35, 35, 35, 35, 0, 35, 0, 35, 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 49, 49, 0, 49, 49, 49, 49, 0, 0, 49, 49, 49, 49, + 49, 49, 49, 49, 0, 49, 49, 49, 49, 49, 49, 49, 0, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 49, 49, 0, 49, 49, 49, 49, 0, 49, 49, 49, 49, 49, 0, 49, 0, 0, 0, + 49, 49, 49, 49, 49, 49, 49, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, - 0, 49, 49, 49, 49, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, 0, 49, 49, 49, - 49, 49, 49, 49, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 0, 49, 49, - 49, 49, 0, 49, 49, 49, 49, 49, 0, 49, 0, 0, 0, 49, 49, 49, 49, 49, 49, - 49, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, @@ -2895,69 +2928,60 @@ static const unsigned short index2[] = { 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 337, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 228, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 335, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 337, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 228, 35, 35, 35, 35, 35, 35, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 337, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 228, 35, 35, 35, 35, 35, + 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 337, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 228, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 335, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 228, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 335, 35, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 337, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 228, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 335, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 228, 35, 35, 35, 35, 35, 35, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 335, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 228, 35, 35, 35, - 35, 35, 35, 49, 35, 0, 0, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, - 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 135, + 35, 35, 228, 35, 35, 35, 35, 35, 35, 49, 35, 0, 0, 338, 338, 338, 338, + 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, + 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, + 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, + 338, 338, 338, 338, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 80, 80, 80, - 80, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 80, 80, 80, 80, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 80, 80, 80, 80, 80, 80, 80, 80, - 135, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 135, 80, 80, - 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, - 135, 135, 135, 135, 0, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 80, + 80, 80, 80, 80, 80, 80, 80, 135, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 135, 80, 80, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, 135, 135, 0, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 81, 81, 81, 81, - 81, 0, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 0, 0, 81, 81, 81, 81, 81, 81, 81, 0, 81, 81, 0, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 81, 81, 81, 81, 81, 81, 81, 0, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 0, 0, 81, 81, 81, 81, 81, 81, 81, 0, 81, 81, + 0, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 0, 0, 0, 81, 81, 81, 81, 81, 81, 81, 53, 53, 53, 53, 53, 53, 53, 0, - 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 0, 0, 0, 48, 80, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 0, 0, 0, 81, 81, 81, 81, 81, 81, 81, 53, 53, 53, + 53, 53, 53, 53, 0, 0, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 0, 0, 0, 0, 48, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 81, 81, 81, 81, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 0, 0, 0, 0, 0, 85, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 48, 48, 48, 48, 48, 48, 81, 81, 81, 81, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 0, 0, 0, 0, 0, 85, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, @@ -2971,110 +2995,111 @@ static const unsigned short index2[] = { 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 0, 0, 325, 325, 325, 325, 325, 325, 325, 325, 325, - 86, 86, 86, 86, 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 86, 86, 86, 86, 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, - 327, 327, 327, 327, 327, 327, 327, 328, 328, 328, 328, 328, 328, 328, + 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 328, 328, 328, + 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, - 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 81, 81, - 81, 81, 81, 81, 146, 137, 0, 0, 0, 0, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 0, 0, 0, 0, 104, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 328, 328, 328, 81, 81, 81, 81, 81, 81, 146, 137, 0, 0, 0, 0, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, 0, 0, 0, 0, 104, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 330, 330, 330, 330, 330, 330, 330, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, - 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 133, 330, 330, 330, - 111, 330, 330, 330, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + 330, 133, 330, 330, 330, 111, 330, 330, 330, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 330, 330, 330, 330, 330, 330, 330, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, - 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 133, 330, 330, 330, - 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + 330, 133, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + 330, 330, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 0, 131, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, + 131, 131, 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 131, 131, - 0, 131, 0, 0, 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 0, 131, 131, 131, 131, 0, 131, 0, 131, 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, 0, - 131, 0, 131, 0, 131, 0, 131, 131, 131, 0, 131, 131, 0, 131, 0, 0, 131, 0, - 131, 0, 131, 0, 131, 0, 131, 0, 131, 131, 0, 131, 0, 0, 131, 131, 131, - 131, 0, 131, 131, 131, 131, 131, 131, 131, 0, 131, 131, 131, 131, 0, 131, - 131, 131, 131, 0, 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 0, 0, 0, 0, 0, 131, 131, 131, 0, 131, 131, 131, 131, - 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 26, 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 26, 26, 26, 26, 26, + 131, 131, 0, 131, 131, 0, 131, 0, 0, 131, 0, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 0, 131, 131, 131, 131, 0, 131, 0, 131, 0, 0, 0, + 0, 0, 0, 131, 0, 0, 0, 0, 131, 0, 131, 0, 131, 0, 131, 131, 131, 0, 131, + 131, 0, 131, 0, 0, 131, 0, 131, 0, 131, 0, 131, 0, 131, 0, 131, 131, 0, + 131, 0, 0, 131, 131, 131, 131, 0, 131, 131, 131, 131, 131, 131, 131, 0, + 131, 131, 131, 131, 0, 131, 131, 131, 131, 0, 131, 0, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 0, 0, 0, 131, 131, + 131, 0, 131, 131, 131, 131, 131, 0, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 78, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, + 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 241, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 154, 154, 0, 0, 0, 244, 244, 244, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 154, 154, + 26, 26, 26, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 337, 26, + 244, 244, 244, 244, 339, 26, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, - 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, - 338, 338, 224, 224, 224, 0, 0, 0, 338, 338, 338, 338, 338, 338, 338, 338, - 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, - 338, 338, 338, 338, 338, 338, 338, 338, 270, 338, 244, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 338, 338, 338, 338, 338, 338, 338, - 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 272, 272, 272, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 340, 340, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 224, 224, 224, 26, 26, 26, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 270, 340, 244, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 340, 340, 340, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 272, 272, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 0, 0, 0, 0, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 0, 0, 0, 0, 0, 0, 0, 272, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, 241, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 0, 0, 0, 0, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 0, 0, 0, 0, 0, 0, 0, 272, + 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, + 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, 26, 241, 241, - 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 26, 26, 26, 241, 26, 26, 26, 241, 241, 241, 339, 339, 339, 339, 339, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, + 26, 26, 26, 241, 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 26, 26, 26, 241, 26, 26, 26, 241, 241, 241, 341, + 341, 341, 341, 341, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 26, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, @@ -3087,116 +3112,130 @@ static const unsigned short index2[] = { 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, - 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 241, 241, 241, 241, 26, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, + 241, 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 26, 26, 26, 26, 26, 26, 241, 26, 26, 26, 241, 241, 241, 26, 26, - 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 241, 241, 0, 0, 0, 26, 26, 26, 26, 241, 241, 241, 241, 241, 241, - 241, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 241, 241, 241, 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 241, 26, 26, + 26, 241, 241, 241, 26, 26, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 0, 0, 0, 26, 26, 26, 26, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, - 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, + 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 0, 241, 241, 241, 241, 241, 241, 241, 241, + 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 26, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, 241, 241, 241, 241, 0, 0, - 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, - 241, 241, 241, 241, 241, 241, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 0, 0, 241, 241, 241, 241, 0, 0, 0, 0, 241, 241, 241, 0, 0, 0, - 0, 0, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, - 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, + 0, 241, 241, 241, 241, 241, 0, 0, 0, 241, 241, 241, 0, 0, 0, 0, 0, 241, + 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 241, 241, + 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 338, 338, 338, 338, 338, 338, 338, 338, + 338, 338, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -3204,9 +3243,9 @@ static const unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, @@ -3217,23 +3256,31 @@ static const unsigned short index2[] = { 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 0, 0, 0, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, - 278, 278, 278, 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 278, 278, 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 175, 175, 175, 175, - 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, - 175, 175, 175, 175, 175, 175, 175, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, @@ -3246,8 +3293,8 @@ static const unsigned short index2[] = { 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277, 277, 277, 277, 277, 277, 277, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, @@ -3256,7 +3303,7 @@ static const unsigned short index2[] = { 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 0, 0, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 0, 0, }; /* decomposition data */ @@ -3744,375 +3791,355 @@ static const unsigned int decomp_data[] = { 50, 52, 26085, 770, 50, 53, 26085, 770, 50, 54, 26085, 770, 50, 55, 26085, 770, 50, 56, 26085, 770, 50, 57, 26085, 770, 51, 48, 26085, 770, 51, 49, 26085, 778, 103, 97, 108, 259, 1098, 259, 1100, 259, 42863, 259, - 294, 259, 339, 259, 42791, 259, 43831, 259, 619, 259, 43858, 256, 35912, - 256, 26356, 256, 36554, 256, 36040, 256, 28369, 256, 20018, 256, 21477, - 256, 40860, 256, 40860, 256, 22865, 256, 37329, 256, 21895, 256, 22856, - 256, 25078, 256, 30313, 256, 32645, 256, 34367, 256, 34746, 256, 35064, - 256, 37007, 256, 27138, 256, 27931, 256, 28889, 256, 29662, 256, 33853, - 256, 37226, 256, 39409, 256, 20098, 256, 21365, 256, 27396, 256, 29211, - 256, 34349, 256, 40478, 256, 23888, 256, 28651, 256, 34253, 256, 35172, - 256, 25289, 256, 33240, 256, 34847, 256, 24266, 256, 26391, 256, 28010, - 256, 29436, 256, 37070, 256, 20358, 256, 20919, 256, 21214, 256, 25796, - 256, 27347, 256, 29200, 256, 30439, 256, 32769, 256, 34310, 256, 34396, - 256, 36335, 256, 38706, 256, 39791, 256, 40442, 256, 30860, 256, 31103, - 256, 32160, 256, 33737, 256, 37636, 256, 40575, 256, 35542, 256, 22751, - 256, 24324, 256, 31840, 256, 32894, 256, 29282, 256, 30922, 256, 36034, - 256, 38647, 256, 22744, 256, 23650, 256, 27155, 256, 28122, 256, 28431, - 256, 32047, 256, 32311, 256, 38475, 256, 21202, 256, 32907, 256, 20956, - 256, 20940, 256, 31260, 256, 32190, 256, 33777, 256, 38517, 256, 35712, - 256, 25295, 256, 27138, 256, 35582, 256, 20025, 256, 23527, 256, 24594, - 256, 29575, 256, 30064, 256, 21271, 256, 30971, 256, 20415, 256, 24489, - 256, 19981, 256, 27852, 256, 25976, 256, 32034, 256, 21443, 256, 22622, - 256, 30465, 256, 33865, 256, 35498, 256, 27578, 256, 36784, 256, 27784, - 256, 25342, 256, 33509, 256, 25504, 256, 30053, 256, 20142, 256, 20841, - 256, 20937, 256, 26753, 256, 31975, 256, 33391, 256, 35538, 256, 37327, - 256, 21237, 256, 21570, 256, 22899, 256, 24300, 256, 26053, 256, 28670, - 256, 31018, 256, 38317, 256, 39530, 256, 40599, 256, 40654, 256, 21147, - 256, 26310, 256, 27511, 256, 36706, 256, 24180, 256, 24976, 256, 25088, - 256, 25754, 256, 28451, 256, 29001, 256, 29833, 256, 31178, 256, 32244, - 256, 32879, 256, 36646, 256, 34030, 256, 36899, 256, 37706, 256, 21015, - 256, 21155, 256, 21693, 256, 28872, 256, 35010, 256, 35498, 256, 24265, - 256, 24565, 256, 25467, 256, 27566, 256, 31806, 256, 29557, 256, 20196, - 256, 22265, 256, 23527, 256, 23994, 256, 24604, 256, 29618, 256, 29801, - 256, 32666, 256, 32838, 256, 37428, 256, 38646, 256, 38728, 256, 38936, - 256, 20363, 256, 31150, 256, 37300, 256, 38584, 256, 24801, 256, 20102, - 256, 20698, 256, 23534, 256, 23615, 256, 26009, 256, 27138, 256, 29134, - 256, 30274, 256, 34044, 256, 36988, 256, 40845, 256, 26248, 256, 38446, - 256, 21129, 256, 26491, 256, 26611, 256, 27969, 256, 28316, 256, 29705, - 256, 30041, 256, 30827, 256, 32016, 256, 39006, 256, 20845, 256, 25134, - 256, 38520, 256, 20523, 256, 23833, 256, 28138, 256, 36650, 256, 24459, - 256, 24900, 256, 26647, 256, 29575, 256, 38534, 256, 21033, 256, 21519, - 256, 23653, 256, 26131, 256, 26446, 256, 26792, 256, 27877, 256, 29702, - 256, 30178, 256, 32633, 256, 35023, 256, 35041, 256, 37324, 256, 38626, - 256, 21311, 256, 28346, 256, 21533, 256, 29136, 256, 29848, 256, 34298, - 256, 38563, 256, 40023, 256, 40607, 256, 26519, 256, 28107, 256, 33256, - 256, 31435, 256, 31520, 256, 31890, 256, 29376, 256, 28825, 256, 35672, - 256, 20160, 256, 33590, 256, 21050, 256, 20999, 256, 24230, 256, 25299, - 256, 31958, 256, 23429, 256, 27934, 256, 26292, 256, 36667, 256, 34892, - 256, 38477, 256, 35211, 256, 24275, 256, 20800, 256, 21952, 256, 22618, - 256, 26228, 256, 20958, 256, 29482, 256, 30410, 256, 31036, 256, 31070, - 256, 31077, 256, 31119, 256, 38742, 256, 31934, 256, 32701, 256, 34322, - 256, 35576, 256, 36920, 256, 37117, 256, 39151, 256, 39164, 256, 39208, - 256, 40372, 256, 37086, 256, 38583, 256, 20398, 256, 20711, 256, 20813, - 256, 21193, 256, 21220, 256, 21329, 256, 21917, 256, 22022, 256, 22120, - 256, 22592, 256, 22696, 256, 23652, 256, 23662, 256, 24724, 256, 24936, - 256, 24974, 256, 25074, 256, 25935, 256, 26082, 256, 26257, 256, 26757, - 256, 28023, 256, 28186, 256, 28450, 256, 29038, 256, 29227, 256, 29730, - 256, 30865, 256, 31038, 256, 31049, 256, 31048, 256, 31056, 256, 31062, - 256, 31069, 256, 31117, 256, 31118, 256, 31296, 256, 31361, 256, 31680, - 256, 32244, 256, 32265, 256, 32321, 256, 32626, 256, 32773, 256, 33261, - 256, 33401, 256, 33401, 256, 33879, 256, 35088, 256, 35222, 256, 35585, - 256, 35641, 256, 36051, 256, 36104, 256, 36790, 256, 36920, 256, 38627, - 256, 38911, 256, 38971, 256, 24693, 256, 148206, 256, 33304, 256, 20006, - 256, 20917, 256, 20840, 256, 20352, 256, 20805, 256, 20864, 256, 21191, - 256, 21242, 256, 21917, 256, 21845, 256, 21913, 256, 21986, 256, 22618, - 256, 22707, 256, 22852, 256, 22868, 256, 23138, 256, 23336, 256, 24274, - 256, 24281, 256, 24425, 256, 24493, 256, 24792, 256, 24910, 256, 24840, - 256, 24974, 256, 24928, 256, 25074, 256, 25140, 256, 25540, 256, 25628, - 256, 25682, 256, 25942, 256, 26228, 256, 26391, 256, 26395, 256, 26454, - 256, 27513, 256, 27578, 256, 27969, 256, 28379, 256, 28363, 256, 28450, - 256, 28702, 256, 29038, 256, 30631, 256, 29237, 256, 29359, 256, 29482, - 256, 29809, 256, 29958, 256, 30011, 256, 30237, 256, 30239, 256, 30410, - 256, 30427, 256, 30452, 256, 30538, 256, 30528, 256, 30924, 256, 31409, - 256, 31680, 256, 31867, 256, 32091, 256, 32244, 256, 32574, 256, 32773, - 256, 33618, 256, 33775, 256, 34681, 256, 35137, 256, 35206, 256, 35222, - 256, 35519, 256, 35576, 256, 35531, 256, 35585, 256, 35582, 256, 35565, - 256, 35641, 256, 35722, 256, 36104, 256, 36664, 256, 36978, 256, 37273, - 256, 37494, 256, 38524, 256, 38627, 256, 38742, 256, 38875, 256, 38911, - 256, 38923, 256, 38971, 256, 39698, 256, 40860, 256, 141386, 256, 141380, - 256, 144341, 256, 15261, 256, 16408, 256, 16441, 256, 152137, 256, - 154832, 256, 163539, 256, 40771, 256, 40846, 514, 102, 102, 514, 102, - 105, 514, 102, 108, 770, 102, 102, 105, 770, 102, 102, 108, 514, 383, - 116, 514, 115, 116, 514, 1396, 1398, 514, 1396, 1381, 514, 1396, 1387, - 514, 1406, 1398, 514, 1396, 1389, 512, 1497, 1460, 512, 1522, 1463, 262, - 1506, 262, 1488, 262, 1491, 262, 1492, 262, 1499, 262, 1500, 262, 1501, - 262, 1512, 262, 1514, 262, 43, 512, 1513, 1473, 512, 1513, 1474, 512, - 64329, 1473, 512, 64329, 1474, 512, 1488, 1463, 512, 1488, 1464, 512, - 1488, 1468, 512, 1489, 1468, 512, 1490, 1468, 512, 1491, 1468, 512, 1492, - 1468, 512, 1493, 1468, 512, 1494, 1468, 512, 1496, 1468, 512, 1497, 1468, - 512, 1498, 1468, 512, 1499, 1468, 512, 1500, 1468, 512, 1502, 1468, 512, - 1504, 1468, 512, 1505, 1468, 512, 1507, 1468, 512, 1508, 1468, 512, 1510, - 1468, 512, 1511, 1468, 512, 1512, 1468, 512, 1513, 1468, 512, 1514, 1468, - 512, 1493, 1465, 512, 1489, 1471, 512, 1499, 1471, 512, 1508, 1471, 514, - 1488, 1500, 267, 1649, 268, 1649, 267, 1659, 268, 1659, 269, 1659, 270, - 1659, 267, 1662, 268, 1662, 269, 1662, 270, 1662, 267, 1664, 268, 1664, - 269, 1664, 270, 1664, 267, 1658, 268, 1658, 269, 1658, 270, 1658, 267, - 1663, 268, 1663, 269, 1663, 270, 1663, 267, 1657, 268, 1657, 269, 1657, - 270, 1657, 267, 1700, 268, 1700, 269, 1700, 270, 1700, 267, 1702, 268, - 1702, 269, 1702, 270, 1702, 267, 1668, 268, 1668, 269, 1668, 270, 1668, - 267, 1667, 268, 1667, 269, 1667, 270, 1667, 267, 1670, 268, 1670, 269, - 1670, 270, 1670, 267, 1671, 268, 1671, 269, 1671, 270, 1671, 267, 1677, - 268, 1677, 267, 1676, 268, 1676, 267, 1678, 268, 1678, 267, 1672, 268, - 1672, 267, 1688, 268, 1688, 267, 1681, 268, 1681, 267, 1705, 268, 1705, - 269, 1705, 270, 1705, 267, 1711, 268, 1711, 269, 1711, 270, 1711, 267, - 1715, 268, 1715, 269, 1715, 270, 1715, 267, 1713, 268, 1713, 269, 1713, - 270, 1713, 267, 1722, 268, 1722, 267, 1723, 268, 1723, 269, 1723, 270, - 1723, 267, 1728, 268, 1728, 267, 1729, 268, 1729, 269, 1729, 270, 1729, - 267, 1726, 268, 1726, 269, 1726, 270, 1726, 267, 1746, 268, 1746, 267, - 1747, 268, 1747, 267, 1709, 268, 1709, 269, 1709, 270, 1709, 267, 1735, - 268, 1735, 267, 1734, 268, 1734, 267, 1736, 268, 1736, 267, 1655, 267, - 1739, 268, 1739, 267, 1733, 268, 1733, 267, 1737, 268, 1737, 267, 1744, - 268, 1744, 269, 1744, 270, 1744, 269, 1609, 270, 1609, 523, 1574, 1575, - 524, 1574, 1575, 523, 1574, 1749, 524, 1574, 1749, 523, 1574, 1608, 524, - 1574, 1608, 523, 1574, 1735, 524, 1574, 1735, 523, 1574, 1734, 524, 1574, - 1734, 523, 1574, 1736, 524, 1574, 1736, 523, 1574, 1744, 524, 1574, 1744, - 525, 1574, 1744, 523, 1574, 1609, 524, 1574, 1609, 525, 1574, 1609, 267, - 1740, 268, 1740, 269, 1740, 270, 1740, 523, 1574, 1580, 523, 1574, 1581, - 523, 1574, 1605, 523, 1574, 1609, 523, 1574, 1610, 523, 1576, 1580, 523, - 1576, 1581, 523, 1576, 1582, 523, 1576, 1605, 523, 1576, 1609, 523, 1576, - 1610, 523, 1578, 1580, 523, 1578, 1581, 523, 1578, 1582, 523, 1578, 1605, - 523, 1578, 1609, 523, 1578, 1610, 523, 1579, 1580, 523, 1579, 1605, 523, - 1579, 1609, 523, 1579, 1610, 523, 1580, 1581, 523, 1580, 1605, 523, 1581, - 1580, 523, 1581, 1605, 523, 1582, 1580, 523, 1582, 1581, 523, 1582, 1605, - 523, 1587, 1580, 523, 1587, 1581, 523, 1587, 1582, 523, 1587, 1605, 523, - 1589, 1581, 523, 1589, 1605, 523, 1590, 1580, 523, 1590, 1581, 523, 1590, - 1582, 523, 1590, 1605, 523, 1591, 1581, 523, 1591, 1605, 523, 1592, 1605, - 523, 1593, 1580, 523, 1593, 1605, 523, 1594, 1580, 523, 1594, 1605, 523, - 1601, 1580, 523, 1601, 1581, 523, 1601, 1582, 523, 1601, 1605, 523, 1601, - 1609, 523, 1601, 1610, 523, 1602, 1581, 523, 1602, 1605, 523, 1602, 1609, - 523, 1602, 1610, 523, 1603, 1575, 523, 1603, 1580, 523, 1603, 1581, 523, - 1603, 1582, 523, 1603, 1604, 523, 1603, 1605, 523, 1603, 1609, 523, 1603, - 1610, 523, 1604, 1580, 523, 1604, 1581, 523, 1604, 1582, 523, 1604, 1605, - 523, 1604, 1609, 523, 1604, 1610, 523, 1605, 1580, 523, 1605, 1581, 523, - 1605, 1582, 523, 1605, 1605, 523, 1605, 1609, 523, 1605, 1610, 523, 1606, - 1580, 523, 1606, 1581, 523, 1606, 1582, 523, 1606, 1605, 523, 1606, 1609, - 523, 1606, 1610, 523, 1607, 1580, 523, 1607, 1605, 523, 1607, 1609, 523, - 1607, 1610, 523, 1610, 1580, 523, 1610, 1581, 523, 1610, 1582, 523, 1610, - 1605, 523, 1610, 1609, 523, 1610, 1610, 523, 1584, 1648, 523, 1585, 1648, - 523, 1609, 1648, 779, 32, 1612, 1617, 779, 32, 1613, 1617, 779, 32, 1614, - 1617, 779, 32, 1615, 1617, 779, 32, 1616, 1617, 779, 32, 1617, 1648, 524, - 1574, 1585, 524, 1574, 1586, 524, 1574, 1605, 524, 1574, 1606, 524, 1574, - 1609, 524, 1574, 1610, 524, 1576, 1585, 524, 1576, 1586, 524, 1576, 1605, - 524, 1576, 1606, 524, 1576, 1609, 524, 1576, 1610, 524, 1578, 1585, 524, - 1578, 1586, 524, 1578, 1605, 524, 1578, 1606, 524, 1578, 1609, 524, 1578, - 1610, 524, 1579, 1585, 524, 1579, 1586, 524, 1579, 1605, 524, 1579, 1606, - 524, 1579, 1609, 524, 1579, 1610, 524, 1601, 1609, 524, 1601, 1610, 524, - 1602, 1609, 524, 1602, 1610, 524, 1603, 1575, 524, 1603, 1604, 524, 1603, - 1605, 524, 1603, 1609, 524, 1603, 1610, 524, 1604, 1605, 524, 1604, 1609, - 524, 1604, 1610, 524, 1605, 1575, 524, 1605, 1605, 524, 1606, 1585, 524, - 1606, 1586, 524, 1606, 1605, 524, 1606, 1606, 524, 1606, 1609, 524, 1606, - 1610, 524, 1609, 1648, 524, 1610, 1585, 524, 1610, 1586, 524, 1610, 1605, - 524, 1610, 1606, 524, 1610, 1609, 524, 1610, 1610, 525, 1574, 1580, 525, - 1574, 1581, 525, 1574, 1582, 525, 1574, 1605, 525, 1574, 1607, 525, 1576, - 1580, 525, 1576, 1581, 525, 1576, 1582, 525, 1576, 1605, 525, 1576, 1607, - 525, 1578, 1580, 525, 1578, 1581, 525, 1578, 1582, 525, 1578, 1605, 525, - 1578, 1607, 525, 1579, 1605, 525, 1580, 1581, 525, 1580, 1605, 525, 1581, - 1580, 525, 1581, 1605, 525, 1582, 1580, 525, 1582, 1605, 525, 1587, 1580, - 525, 1587, 1581, 525, 1587, 1582, 525, 1587, 1605, 525, 1589, 1581, 525, - 1589, 1582, 525, 1589, 1605, 525, 1590, 1580, 525, 1590, 1581, 525, 1590, - 1582, 525, 1590, 1605, 525, 1591, 1581, 525, 1592, 1605, 525, 1593, 1580, - 525, 1593, 1605, 525, 1594, 1580, 525, 1594, 1605, 525, 1601, 1580, 525, - 1601, 1581, 525, 1601, 1582, 525, 1601, 1605, 525, 1602, 1581, 525, 1602, - 1605, 525, 1603, 1580, 525, 1603, 1581, 525, 1603, 1582, 525, 1603, 1604, - 525, 1603, 1605, 525, 1604, 1580, 525, 1604, 1581, 525, 1604, 1582, 525, - 1604, 1605, 525, 1604, 1607, 525, 1605, 1580, 525, 1605, 1581, 525, 1605, - 1582, 525, 1605, 1605, 525, 1606, 1580, 525, 1606, 1581, 525, 1606, 1582, - 525, 1606, 1605, 525, 1606, 1607, 525, 1607, 1580, 525, 1607, 1605, 525, - 1607, 1648, 525, 1610, 1580, 525, 1610, 1581, 525, 1610, 1582, 525, 1610, - 1605, 525, 1610, 1607, 526, 1574, 1605, 526, 1574, 1607, 526, 1576, 1605, - 526, 1576, 1607, 526, 1578, 1605, 526, 1578, 1607, 526, 1579, 1605, 526, - 1579, 1607, 526, 1587, 1605, 526, 1587, 1607, 526, 1588, 1605, 526, 1588, - 1607, 526, 1603, 1604, 526, 1603, 1605, 526, 1604, 1605, 526, 1606, 1605, - 526, 1606, 1607, 526, 1610, 1605, 526, 1610, 1607, 782, 1600, 1614, 1617, - 782, 1600, 1615, 1617, 782, 1600, 1616, 1617, 523, 1591, 1609, 523, 1591, - 1610, 523, 1593, 1609, 523, 1593, 1610, 523, 1594, 1609, 523, 1594, 1610, - 523, 1587, 1609, 523, 1587, 1610, 523, 1588, 1609, 523, 1588, 1610, 523, - 1581, 1609, 523, 1581, 1610, 523, 1580, 1609, 523, 1580, 1610, 523, 1582, - 1609, 523, 1582, 1610, 523, 1589, 1609, 523, 1589, 1610, 523, 1590, 1609, - 523, 1590, 1610, 523, 1588, 1580, 523, 1588, 1581, 523, 1588, 1582, 523, - 1588, 1605, 523, 1588, 1585, 523, 1587, 1585, 523, 1589, 1585, 523, 1590, - 1585, 524, 1591, 1609, 524, 1591, 1610, 524, 1593, 1609, 524, 1593, 1610, - 524, 1594, 1609, 524, 1594, 1610, 524, 1587, 1609, 524, 1587, 1610, 524, - 1588, 1609, 524, 1588, 1610, 524, 1581, 1609, 524, 1581, 1610, 524, 1580, - 1609, 524, 1580, 1610, 524, 1582, 1609, 524, 1582, 1610, 524, 1589, 1609, - 524, 1589, 1610, 524, 1590, 1609, 524, 1590, 1610, 524, 1588, 1580, 524, - 1588, 1581, 524, 1588, 1582, 524, 1588, 1605, 524, 1588, 1585, 524, 1587, - 1585, 524, 1589, 1585, 524, 1590, 1585, 525, 1588, 1580, 525, 1588, 1581, - 525, 1588, 1582, 525, 1588, 1605, 525, 1587, 1607, 525, 1588, 1607, 525, - 1591, 1605, 526, 1587, 1580, 526, 1587, 1581, 526, 1587, 1582, 526, 1588, - 1580, 526, 1588, 1581, 526, 1588, 1582, 526, 1591, 1605, 526, 1592, 1605, - 524, 1575, 1611, 523, 1575, 1611, 781, 1578, 1580, 1605, 780, 1578, 1581, - 1580, 781, 1578, 1581, 1580, 781, 1578, 1581, 1605, 781, 1578, 1582, - 1605, 781, 1578, 1605, 1580, 781, 1578, 1605, 1581, 781, 1578, 1605, - 1582, 780, 1580, 1605, 1581, 781, 1580, 1605, 1581, 780, 1581, 1605, - 1610, 780, 1581, 1605, 1609, 781, 1587, 1581, 1580, 781, 1587, 1580, - 1581, 780, 1587, 1580, 1609, 780, 1587, 1605, 1581, 781, 1587, 1605, - 1581, 781, 1587, 1605, 1580, 780, 1587, 1605, 1605, 781, 1587, 1605, - 1605, 780, 1589, 1581, 1581, 781, 1589, 1581, 1581, 780, 1589, 1605, - 1605, 780, 1588, 1581, 1605, 781, 1588, 1581, 1605, 780, 1588, 1580, - 1610, 780, 1588, 1605, 1582, 781, 1588, 1605, 1582, 780, 1588, 1605, - 1605, 781, 1588, 1605, 1605, 780, 1590, 1581, 1609, 780, 1590, 1582, - 1605, 781, 1590, 1582, 1605, 780, 1591, 1605, 1581, 781, 1591, 1605, - 1581, 781, 1591, 1605, 1605, 780, 1591, 1605, 1610, 780, 1593, 1580, - 1605, 780, 1593, 1605, 1605, 781, 1593, 1605, 1605, 780, 1593, 1605, - 1609, 780, 1594, 1605, 1605, 780, 1594, 1605, 1610, 780, 1594, 1605, - 1609, 780, 1601, 1582, 1605, 781, 1601, 1582, 1605, 780, 1602, 1605, - 1581, 780, 1602, 1605, 1605, 780, 1604, 1581, 1605, 780, 1604, 1581, - 1610, 780, 1604, 1581, 1609, 781, 1604, 1580, 1580, 780, 1604, 1580, - 1580, 780, 1604, 1582, 1605, 781, 1604, 1582, 1605, 780, 1604, 1605, - 1581, 781, 1604, 1605, 1581, 781, 1605, 1581, 1580, 781, 1605, 1581, - 1605, 780, 1605, 1581, 1610, 781, 1605, 1580, 1581, 781, 1605, 1580, - 1605, 781, 1605, 1582, 1580, 781, 1605, 1582, 1605, 781, 1605, 1580, - 1582, 781, 1607, 1605, 1580, 781, 1607, 1605, 1605, 781, 1606, 1581, - 1605, 780, 1606, 1581, 1609, 780, 1606, 1580, 1605, 781, 1606, 1580, - 1605, 780, 1606, 1580, 1609, 780, 1606, 1605, 1610, 780, 1606, 1605, - 1609, 780, 1610, 1605, 1605, 781, 1610, 1605, 1605, 780, 1576, 1582, - 1610, 780, 1578, 1580, 1610, 780, 1578, 1580, 1609, 780, 1578, 1582, - 1610, 780, 1578, 1582, 1609, 780, 1578, 1605, 1610, 780, 1578, 1605, - 1609, 780, 1580, 1605, 1610, 780, 1580, 1581, 1609, 780, 1580, 1605, - 1609, 780, 1587, 1582, 1609, 780, 1589, 1581, 1610, 780, 1588, 1581, - 1610, 780, 1590, 1581, 1610, 780, 1604, 1580, 1610, 780, 1604, 1605, - 1610, 780, 1610, 1581, 1610, 780, 1610, 1580, 1610, 780, 1610, 1605, - 1610, 780, 1605, 1605, 1610, 780, 1602, 1605, 1610, 780, 1606, 1581, - 1610, 781, 1602, 1605, 1581, 781, 1604, 1581, 1605, 780, 1593, 1605, - 1610, 780, 1603, 1605, 1610, 781, 1606, 1580, 1581, 780, 1605, 1582, - 1610, 781, 1604, 1580, 1605, 780, 1603, 1605, 1605, 780, 1604, 1580, - 1605, 780, 1606, 1580, 1581, 780, 1580, 1581, 1610, 780, 1581, 1580, - 1610, 780, 1605, 1580, 1610, 780, 1601, 1605, 1610, 780, 1576, 1581, - 1610, 781, 1603, 1605, 1605, 781, 1593, 1580, 1605, 781, 1589, 1605, - 1605, 780, 1587, 1582, 1610, 780, 1606, 1580, 1610, 779, 1589, 1604, - 1746, 779, 1602, 1604, 1746, 1035, 1575, 1604, 1604, 1607, 1035, 1575, - 1603, 1576, 1585, 1035, 1605, 1581, 1605, 1583, 1035, 1589, 1604, 1593, - 1605, 1035, 1585, 1587, 1608, 1604, 1035, 1593, 1604, 1610, 1607, 1035, - 1608, 1587, 1604, 1605, 779, 1589, 1604, 1609, 4619, 1589, 1604, 1609, - 32, 1575, 1604, 1604, 1607, 32, 1593, 1604, 1610, 1607, 32, 1608, 1587, - 1604, 1605, 2059, 1580, 1604, 32, 1580, 1604, 1575, 1604, 1607, 1035, - 1585, 1740, 1575, 1604, 265, 44, 265, 12289, 265, 12290, 265, 58, 265, - 59, 265, 33, 265, 63, 265, 12310, 265, 12311, 265, 8230, 265, 8229, 265, - 8212, 265, 8211, 265, 95, 265, 95, 265, 40, 265, 41, 265, 123, 265, 125, - 265, 12308, 265, 12309, 265, 12304, 265, 12305, 265, 12298, 265, 12299, - 265, 12296, 265, 12297, 265, 12300, 265, 12301, 265, 12302, 265, 12303, - 265, 91, 265, 93, 258, 8254, 258, 8254, 258, 8254, 258, 8254, 258, 95, - 258, 95, 258, 95, 271, 44, 271, 12289, 271, 46, 271, 59, 271, 58, 271, - 63, 271, 33, 271, 8212, 271, 40, 271, 41, 271, 123, 271, 125, 271, 12308, - 271, 12309, 271, 35, 271, 38, 271, 42, 271, 43, 271, 45, 271, 60, 271, - 62, 271, 61, 271, 92, 271, 36, 271, 37, 271, 64, 523, 32, 1611, 526, - 1600, 1611, 523, 32, 1612, 523, 32, 1613, 523, 32, 1614, 526, 1600, 1614, - 523, 32, 1615, 526, 1600, 1615, 523, 32, 1616, 526, 1600, 1616, 523, 32, - 1617, 526, 1600, 1617, 523, 32, 1618, 526, 1600, 1618, 267, 1569, 267, - 1570, 268, 1570, 267, 1571, 268, 1571, 267, 1572, 268, 1572, 267, 1573, - 268, 1573, 267, 1574, 268, 1574, 269, 1574, 270, 1574, 267, 1575, 268, - 1575, 267, 1576, 268, 1576, 269, 1576, 270, 1576, 267, 1577, 268, 1577, - 267, 1578, 268, 1578, 269, 1578, 270, 1578, 267, 1579, 268, 1579, 269, - 1579, 270, 1579, 267, 1580, 268, 1580, 269, 1580, 270, 1580, 267, 1581, - 268, 1581, 269, 1581, 270, 1581, 267, 1582, 268, 1582, 269, 1582, 270, - 1582, 267, 1583, 268, 1583, 267, 1584, 268, 1584, 267, 1585, 268, 1585, - 267, 1586, 268, 1586, 267, 1587, 268, 1587, 269, 1587, 270, 1587, 267, - 1588, 268, 1588, 269, 1588, 270, 1588, 267, 1589, 268, 1589, 269, 1589, - 270, 1589, 267, 1590, 268, 1590, 269, 1590, 270, 1590, 267, 1591, 268, - 1591, 269, 1591, 270, 1591, 267, 1592, 268, 1592, 269, 1592, 270, 1592, - 267, 1593, 268, 1593, 269, 1593, 270, 1593, 267, 1594, 268, 1594, 269, - 1594, 270, 1594, 267, 1601, 268, 1601, 269, 1601, 270, 1601, 267, 1602, - 268, 1602, 269, 1602, 270, 1602, 267, 1603, 268, 1603, 269, 1603, 270, - 1603, 267, 1604, 268, 1604, 269, 1604, 270, 1604, 267, 1605, 268, 1605, - 269, 1605, 270, 1605, 267, 1606, 268, 1606, 269, 1606, 270, 1606, 267, - 1607, 268, 1607, 269, 1607, 270, 1607, 267, 1608, 268, 1608, 267, 1609, - 268, 1609, 267, 1610, 268, 1610, 269, 1610, 270, 1610, 523, 1604, 1570, - 524, 1604, 1570, 523, 1604, 1571, 524, 1604, 1571, 523, 1604, 1573, 524, - 1604, 1573, 523, 1604, 1575, 524, 1604, 1575, 264, 33, 264, 34, 264, 35, - 264, 36, 264, 37, 264, 38, 264, 39, 264, 40, 264, 41, 264, 42, 264, 43, - 264, 44, 264, 45, 264, 46, 264, 47, 264, 48, 264, 49, 264, 50, 264, 51, - 264, 52, 264, 53, 264, 54, 264, 55, 264, 56, 264, 57, 264, 58, 264, 59, - 264, 60, 264, 61, 264, 62, 264, 63, 264, 64, 264, 65, 264, 66, 264, 67, - 264, 68, 264, 69, 264, 70, 264, 71, 264, 72, 264, 73, 264, 74, 264, 75, - 264, 76, 264, 77, 264, 78, 264, 79, 264, 80, 264, 81, 264, 82, 264, 83, - 264, 84, 264, 85, 264, 86, 264, 87, 264, 88, 264, 89, 264, 90, 264, 91, - 264, 92, 264, 93, 264, 94, 264, 95, 264, 96, 264, 97, 264, 98, 264, 99, - 264, 100, 264, 101, 264, 102, 264, 103, 264, 104, 264, 105, 264, 106, - 264, 107, 264, 108, 264, 109, 264, 110, 264, 111, 264, 112, 264, 113, - 264, 114, 264, 115, 264, 116, 264, 117, 264, 118, 264, 119, 264, 120, - 264, 121, 264, 122, 264, 123, 264, 124, 264, 125, 264, 126, 264, 10629, - 264, 10630, 272, 12290, 272, 12300, 272, 12301, 272, 12289, 272, 12539, - 272, 12530, 272, 12449, 272, 12451, 272, 12453, 272, 12455, 272, 12457, - 272, 12515, 272, 12517, 272, 12519, 272, 12483, 272, 12540, 272, 12450, - 272, 12452, 272, 12454, 272, 12456, 272, 12458, 272, 12459, 272, 12461, - 272, 12463, 272, 12465, 272, 12467, 272, 12469, 272, 12471, 272, 12473, - 272, 12475, 272, 12477, 272, 12479, 272, 12481, 272, 12484, 272, 12486, - 272, 12488, 272, 12490, 272, 12491, 272, 12492, 272, 12493, 272, 12494, - 272, 12495, 272, 12498, 272, 12501, 272, 12504, 272, 12507, 272, 12510, - 272, 12511, 272, 12512, 272, 12513, 272, 12514, 272, 12516, 272, 12518, - 272, 12520, 272, 12521, 272, 12522, 272, 12523, 272, 12524, 272, 12525, - 272, 12527, 272, 12531, 272, 12441, 272, 12442, 272, 12644, 272, 12593, - 272, 12594, 272, 12595, 272, 12596, 272, 12597, 272, 12598, 272, 12599, - 272, 12600, 272, 12601, 272, 12602, 272, 12603, 272, 12604, 272, 12605, - 272, 12606, 272, 12607, 272, 12608, 272, 12609, 272, 12610, 272, 12611, - 272, 12612, 272, 12613, 272, 12614, 272, 12615, 272, 12616, 272, 12617, - 272, 12618, 272, 12619, 272, 12620, 272, 12621, 272, 12622, 272, 12623, - 272, 12624, 272, 12625, 272, 12626, 272, 12627, 272, 12628, 272, 12629, - 272, 12630, 272, 12631, 272, 12632, 272, 12633, 272, 12634, 272, 12635, - 272, 12636, 272, 12637, 272, 12638, 272, 12639, 272, 12640, 272, 12641, - 272, 12642, 272, 12643, 264, 162, 264, 163, 264, 172, 264, 175, 264, 166, - 264, 165, 264, 8361, 272, 9474, 272, 8592, 272, 8593, 272, 8594, 272, - 8595, 272, 9632, 272, 9675, 512, 69785, 69818, 512, 69787, 69818, 512, - 69797, 69818, 512, 69937, 69927, 512, 69938, 69927, 512, 70471, 70462, - 512, 70471, 70487, 512, 70841, 70842, 512, 70841, 70832, 512, 70841, - 70845, 512, 71096, 71087, 512, 71097, 71087, 512, 119127, 119141, 512, - 119128, 119141, 512, 119135, 119150, 512, 119135, 119151, 512, 119135, - 119152, 512, 119135, 119153, 512, 119135, 119154, 512, 119225, 119141, - 512, 119226, 119141, 512, 119227, 119150, 512, 119228, 119150, 512, - 119227, 119151, 512, 119228, 119151, 262, 65, 262, 66, 262, 67, 262, 68, - 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, - 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, - 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, - 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, - 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, - 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, - 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, - 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, - 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, - 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, - 262, 100, 262, 101, 262, 102, 262, 103, 262, 105, 262, 106, 262, 107, + 294, 259, 339, 259, 42791, 259, 43831, 259, 619, 259, 43858, 259, 653, + 256, 35912, 256, 26356, 256, 36554, 256, 36040, 256, 28369, 256, 20018, + 256, 21477, 256, 40860, 256, 40860, 256, 22865, 256, 37329, 256, 21895, + 256, 22856, 256, 25078, 256, 30313, 256, 32645, 256, 34367, 256, 34746, + 256, 35064, 256, 37007, 256, 27138, 256, 27931, 256, 28889, 256, 29662, + 256, 33853, 256, 37226, 256, 39409, 256, 20098, 256, 21365, 256, 27396, + 256, 29211, 256, 34349, 256, 40478, 256, 23888, 256, 28651, 256, 34253, + 256, 35172, 256, 25289, 256, 33240, 256, 34847, 256, 24266, 256, 26391, + 256, 28010, 256, 29436, 256, 37070, 256, 20358, 256, 20919, 256, 21214, + 256, 25796, 256, 27347, 256, 29200, 256, 30439, 256, 32769, 256, 34310, + 256, 34396, 256, 36335, 256, 38706, 256, 39791, 256, 40442, 256, 30860, + 256, 31103, 256, 32160, 256, 33737, 256, 37636, 256, 40575, 256, 35542, + 256, 22751, 256, 24324, 256, 31840, 256, 32894, 256, 29282, 256, 30922, + 256, 36034, 256, 38647, 256, 22744, 256, 23650, 256, 27155, 256, 28122, + 256, 28431, 256, 32047, 256, 32311, 256, 38475, 256, 21202, 256, 32907, + 256, 20956, 256, 20940, 256, 31260, 256, 32190, 256, 33777, 256, 38517, + 256, 35712, 256, 25295, 256, 27138, 256, 35582, 256, 20025, 256, 23527, + 256, 24594, 256, 29575, 256, 30064, 256, 21271, 256, 30971, 256, 20415, + 256, 24489, 256, 19981, 256, 27852, 256, 25976, 256, 32034, 256, 21443, + 256, 22622, 256, 30465, 256, 33865, 256, 35498, 256, 27578, 256, 36784, + 256, 27784, 256, 25342, 256, 33509, 256, 25504, 256, 30053, 256, 20142, + 256, 20841, 256, 20937, 256, 26753, 256, 31975, 256, 33391, 256, 35538, + 256, 37327, 256, 21237, 256, 21570, 256, 22899, 256, 24300, 256, 26053, + 256, 28670, 256, 31018, 256, 38317, 256, 39530, 256, 40599, 256, 40654, + 256, 21147, 256, 26310, 256, 27511, 256, 36706, 256, 24180, 256, 24976, + 256, 25088, 256, 25754, 256, 28451, 256, 29001, 256, 29833, 256, 31178, + 256, 32244, 256, 32879, 256, 36646, 256, 34030, 256, 36899, 256, 37706, + 256, 21015, 256, 21155, 256, 21693, 256, 28872, 256, 35010, 256, 35498, + 256, 24265, 256, 24565, 256, 25467, 256, 27566, 256, 31806, 256, 29557, + 256, 20196, 256, 22265, 256, 23527, 256, 23994, 256, 24604, 256, 29618, + 256, 29801, 256, 32666, 256, 32838, 256, 37428, 256, 38646, 256, 38728, + 256, 38936, 256, 20363, 256, 31150, 256, 37300, 256, 38584, 256, 24801, + 256, 20102, 256, 20698, 256, 23534, 256, 23615, 256, 26009, 256, 27138, + 256, 29134, 256, 30274, 256, 34044, 256, 36988, 256, 40845, 256, 26248, + 256, 38446, 256, 21129, 256, 26491, 256, 26611, 256, 27969, 256, 28316, + 256, 29705, 256, 30041, 256, 30827, 256, 32016, 256, 39006, 256, 20845, + 256, 25134, 256, 38520, 256, 20523, 256, 23833, 256, 28138, 256, 36650, + 256, 24459, 256, 24900, 256, 26647, 256, 29575, 256, 38534, 256, 21033, + 256, 21519, 256, 23653, 256, 26131, 256, 26446, 256, 26792, 256, 27877, + 256, 29702, 256, 30178, 256, 32633, 256, 35023, 256, 35041, 256, 37324, + 256, 38626, 256, 21311, 256, 28346, 256, 21533, 256, 29136, 256, 29848, + 256, 34298, 256, 38563, 256, 40023, 256, 40607, 256, 26519, 256, 28107, + 256, 33256, 256, 31435, 256, 31520, 256, 31890, 256, 29376, 256, 28825, + 256, 35672, 256, 20160, 256, 33590, 256, 21050, 256, 20999, 256, 24230, + 256, 25299, 256, 31958, 256, 23429, 256, 27934, 256, 26292, 256, 36667, + 256, 34892, 256, 38477, 256, 35211, 256, 24275, 256, 20800, 256, 21952, + 256, 22618, 256, 26228, 256, 20958, 256, 29482, 256, 30410, 256, 31036, + 256, 31070, 256, 31077, 256, 31119, 256, 38742, 256, 31934, 256, 32701, + 256, 34322, 256, 35576, 256, 36920, 256, 37117, 256, 39151, 256, 39164, + 256, 39208, 256, 40372, 256, 37086, 256, 38583, 256, 20398, 256, 20711, + 256, 20813, 256, 21193, 256, 21220, 256, 21329, 256, 21917, 256, 22022, + 256, 22120, 256, 22592, 256, 22696, 256, 23652, 256, 23662, 256, 24724, + 256, 24936, 256, 24974, 256, 25074, 256, 25935, 256, 26082, 256, 26257, + 256, 26757, 256, 28023, 256, 28186, 256, 28450, 256, 29038, 256, 29227, + 256, 29730, 256, 30865, 256, 31038, 256, 31049, 256, 31048, 256, 31056, + 256, 31062, 256, 31069, 256, 31117, 256, 31118, 256, 31296, 256, 31361, + 256, 31680, 256, 32244, 256, 32265, 256, 32321, 256, 32626, 256, 32773, + 256, 33261, 256, 33401, 256, 33401, 256, 33879, 256, 35088, 256, 35222, + 256, 35585, 256, 35641, 256, 36051, 256, 36104, 256, 36790, 256, 36920, + 256, 38627, 256, 38911, 256, 38971, 256, 24693, 256, 148206, 256, 33304, + 256, 20006, 256, 20917, 256, 20840, 256, 20352, 256, 20805, 256, 20864, + 256, 21191, 256, 21242, 256, 21917, 256, 21845, 256, 21913, 256, 21986, + 256, 22618, 256, 22707, 256, 22852, 256, 22868, 256, 23138, 256, 23336, + 256, 24274, 256, 24281, 256, 24425, 256, 24493, 256, 24792, 256, 24910, + 256, 24840, 256, 24974, 256, 24928, 256, 25074, 256, 25140, 256, 25540, + 256, 25628, 256, 25682, 256, 25942, 256, 26228, 256, 26391, 256, 26395, + 256, 26454, 256, 27513, 256, 27578, 256, 27969, 256, 28379, 256, 28363, + 256, 28450, 256, 28702, 256, 29038, 256, 30631, 256, 29237, 256, 29359, + 256, 29482, 256, 29809, 256, 29958, 256, 30011, 256, 30237, 256, 30239, + 256, 30410, 256, 30427, 256, 30452, 256, 30538, 256, 30528, 256, 30924, + 256, 31409, 256, 31680, 256, 31867, 256, 32091, 256, 32244, 256, 32574, + 256, 32773, 256, 33618, 256, 33775, 256, 34681, 256, 35137, 256, 35206, + 256, 35222, 256, 35519, 256, 35576, 256, 35531, 256, 35585, 256, 35582, + 256, 35565, 256, 35641, 256, 35722, 256, 36104, 256, 36664, 256, 36978, + 256, 37273, 256, 37494, 256, 38524, 256, 38627, 256, 38742, 256, 38875, + 256, 38911, 256, 38923, 256, 38971, 256, 39698, 256, 40860, 256, 141386, + 256, 141380, 256, 144341, 256, 15261, 256, 16408, 256, 16441, 256, + 152137, 256, 154832, 256, 163539, 256, 40771, 256, 40846, 514, 102, 102, + 514, 102, 105, 514, 102, 108, 770, 102, 102, 105, 770, 102, 102, 108, + 514, 383, 116, 514, 115, 116, 514, 1396, 1398, 514, 1396, 1381, 514, + 1396, 1387, 514, 1406, 1398, 514, 1396, 1389, 512, 1497, 1460, 512, 1522, + 1463, 262, 1506, 262, 1488, 262, 1491, 262, 1492, 262, 1499, 262, 1500, + 262, 1501, 262, 1512, 262, 1514, 262, 43, 512, 1513, 1473, 512, 1513, + 1474, 512, 64329, 1473, 512, 64329, 1474, 512, 1488, 1463, 512, 1488, + 1464, 512, 1488, 1468, 512, 1489, 1468, 512, 1490, 1468, 512, 1491, 1468, + 512, 1492, 1468, 512, 1493, 1468, 512, 1494, 1468, 512, 1496, 1468, 512, + 1497, 1468, 512, 1498, 1468, 512, 1499, 1468, 512, 1500, 1468, 512, 1502, + 1468, 512, 1504, 1468, 512, 1505, 1468, 512, 1507, 1468, 512, 1508, 1468, + 512, 1510, 1468, 512, 1511, 1468, 512, 1512, 1468, 512, 1513, 1468, 512, + 1514, 1468, 512, 1493, 1465, 512, 1489, 1471, 512, 1499, 1471, 512, 1508, + 1471, 514, 1488, 1500, 267, 1649, 268, 1649, 267, 1659, 268, 1659, 269, + 1659, 270, 1659, 267, 1662, 268, 1662, 269, 1662, 270, 1662, 267, 1664, + 268, 1664, 269, 1664, 270, 1664, 267, 1658, 268, 1658, 269, 1658, 270, + 1658, 267, 1663, 268, 1663, 269, 1663, 270, 1663, 267, 1657, 268, 1657, + 269, 1657, 270, 1657, 267, 1700, 268, 1700, 269, 1700, 270, 1700, 267, + 1702, 268, 1702, 269, 1702, 270, 1702, 267, 1668, 268, 1668, 269, 1668, + 270, 1668, 267, 1667, 268, 1667, 269, 1667, 270, 1667, 267, 1670, 268, + 1670, 269, 1670, 270, 1670, 267, 1671, 268, 1671, 269, 1671, 270, 1671, + 267, 1677, 268, 1677, 267, 1676, 268, 1676, 267, 1678, 268, 1678, 267, + 1672, 268, 1672, 267, 1688, 268, 1688, 267, 1681, 268, 1681, 267, 1705, + 268, 1705, 269, 1705, 270, 1705, 267, 1711, 268, 1711, 269, 1711, 270, + 1711, 267, 1715, 268, 1715, 269, 1715, 270, 1715, 267, 1713, 268, 1713, + 269, 1713, 270, 1713, 267, 1722, 268, 1722, 267, 1723, 268, 1723, 269, + 1723, 270, 1723, 267, 1728, 268, 1728, 267, 1729, 268, 1729, 269, 1729, + 270, 1729, 267, 1726, 268, 1726, 269, 1726, 270, 1726, 267, 1746, 268, + 1746, 267, 1747, 268, 1747, 267, 1709, 268, 1709, 269, 1709, 270, 1709, + 267, 1735, 268, 1735, 267, 1734, 268, 1734, 267, 1736, 268, 1736, 267, + 1655, 267, 1739, 268, 1739, 267, 1733, 268, 1733, 267, 1737, 268, 1737, + 267, 1744, 268, 1744, 269, 1744, 270, 1744, 269, 1609, 270, 1609, 523, + 1574, 1575, 524, 1574, 1575, 523, 1574, 1749, 524, 1574, 1749, 523, 1574, + 1608, 524, 1574, 1608, 523, 1574, 1735, 524, 1574, 1735, 523, 1574, 1734, + 524, 1574, 1734, 523, 1574, 1736, 524, 1574, 1736, 523, 1574, 1744, 524, + 1574, 1744, 525, 1574, 1744, 523, 1574, 1609, 524, 1574, 1609, 525, 1574, + 1609, 267, 1740, 268, 1740, 269, 1740, 270, 1740, 523, 1574, 1580, 523, + 1574, 1581, 523, 1574, 1605, 523, 1574, 1609, 523, 1574, 1610, 523, 1576, + 1580, 523, 1576, 1581, 523, 1576, 1582, 523, 1576, 1605, 523, 1576, 1609, + 523, 1576, 1610, 523, 1578, 1580, 523, 1578, 1581, 523, 1578, 1582, 523, + 1578, 1605, 523, 1578, 1609, 523, 1578, 1610, 523, 1579, 1580, 523, 1579, + 1605, 523, 1579, 1609, 523, 1579, 1610, 523, 1580, 1581, 523, 1580, 1605, + 523, 1581, 1580, 523, 1581, 1605, 523, 1582, 1580, 523, 1582, 1581, 523, + 1582, 1605, 523, 1587, 1580, 523, 1587, 1581, 523, 1587, 1582, 523, 1587, + 1605, 523, 1589, 1581, 523, 1589, 1605, 523, 1590, 1580, 523, 1590, 1581, + 523, 1590, 1582, 523, 1590, 1605, 523, 1591, 1581, 523, 1591, 1605, 523, + 1592, 1605, 523, 1593, 1580, 523, 1593, 1605, 523, 1594, 1580, 523, 1594, + 1605, 523, 1601, 1580, 523, 1601, 1581, 523, 1601, 1582, 523, 1601, 1605, + 523, 1601, 1609, 523, 1601, 1610, 523, 1602, 1581, 523, 1602, 1605, 523, + 1602, 1609, 523, 1602, 1610, 523, 1603, 1575, 523, 1603, 1580, 523, 1603, + 1581, 523, 1603, 1582, 523, 1603, 1604, 523, 1603, 1605, 523, 1603, 1609, + 523, 1603, 1610, 523, 1604, 1580, 523, 1604, 1581, 523, 1604, 1582, 523, + 1604, 1605, 523, 1604, 1609, 523, 1604, 1610, 523, 1605, 1580, 523, 1605, + 1581, 523, 1605, 1582, 523, 1605, 1605, 523, 1605, 1609, 523, 1605, 1610, + 523, 1606, 1580, 523, 1606, 1581, 523, 1606, 1582, 523, 1606, 1605, 523, + 1606, 1609, 523, 1606, 1610, 523, 1607, 1580, 523, 1607, 1605, 523, 1607, + 1609, 523, 1607, 1610, 523, 1610, 1580, 523, 1610, 1581, 523, 1610, 1582, + 523, 1610, 1605, 523, 1610, 1609, 523, 1610, 1610, 523, 1584, 1648, 523, + 1585, 1648, 523, 1609, 1648, 779, 32, 1612, 1617, 779, 32, 1613, 1617, + 779, 32, 1614, 1617, 779, 32, 1615, 1617, 779, 32, 1616, 1617, 779, 32, + 1617, 1648, 524, 1574, 1585, 524, 1574, 1586, 524, 1574, 1605, 524, 1574, + 1606, 524, 1574, 1609, 524, 1574, 1610, 524, 1576, 1585, 524, 1576, 1586, + 524, 1576, 1605, 524, 1576, 1606, 524, 1576, 1609, 524, 1576, 1610, 524, + 1578, 1585, 524, 1578, 1586, 524, 1578, 1605, 524, 1578, 1606, 524, 1578, + 1609, 524, 1578, 1610, 524, 1579, 1585, 524, 1579, 1586, 524, 1579, 1605, + 524, 1579, 1606, 524, 1579, 1609, 524, 1579, 1610, 524, 1601, 1609, 524, + 1601, 1610, 524, 1602, 1609, 524, 1602, 1610, 524, 1603, 1575, 524, 1603, + 1604, 524, 1603, 1605, 524, 1603, 1609, 524, 1603, 1610, 524, 1604, 1605, + 524, 1604, 1609, 524, 1604, 1610, 524, 1605, 1575, 524, 1605, 1605, 524, + 1606, 1585, 524, 1606, 1586, 524, 1606, 1605, 524, 1606, 1606, 524, 1606, + 1609, 524, 1606, 1610, 524, 1609, 1648, 524, 1610, 1585, 524, 1610, 1586, + 524, 1610, 1605, 524, 1610, 1606, 524, 1610, 1609, 524, 1610, 1610, 525, + 1574, 1580, 525, 1574, 1581, 525, 1574, 1582, 525, 1574, 1605, 525, 1574, + 1607, 525, 1576, 1580, 525, 1576, 1581, 525, 1576, 1582, 525, 1576, 1605, + 525, 1576, 1607, 525, 1578, 1580, 525, 1578, 1581, 525, 1578, 1582, 525, + 1578, 1605, 525, 1578, 1607, 525, 1579, 1605, 525, 1580, 1581, 525, 1580, + 1605, 525, 1581, 1580, 525, 1581, 1605, 525, 1582, 1580, 525, 1582, 1605, + 525, 1587, 1580, 525, 1587, 1581, 525, 1587, 1582, 525, 1587, 1605, 525, + 1589, 1581, 525, 1589, 1582, 525, 1589, 1605, 525, 1590, 1580, 525, 1590, + 1581, 525, 1590, 1582, 525, 1590, 1605, 525, 1591, 1581, 525, 1592, 1605, + 525, 1593, 1580, 525, 1593, 1605, 525, 1594, 1580, 525, 1594, 1605, 525, + 1601, 1580, 525, 1601, 1581, 525, 1601, 1582, 525, 1601, 1605, 525, 1602, + 1581, 525, 1602, 1605, 525, 1603, 1580, 525, 1603, 1581, 525, 1603, 1582, + 525, 1603, 1604, 525, 1603, 1605, 525, 1604, 1580, 525, 1604, 1581, 525, + 1604, 1582, 525, 1604, 1605, 525, 1604, 1607, 525, 1605, 1580, 525, 1605, + 1581, 525, 1605, 1582, 525, 1605, 1605, 525, 1606, 1580, 525, 1606, 1581, + 525, 1606, 1582, 525, 1606, 1605, 525, 1606, 1607, 525, 1607, 1580, 525, + 1607, 1605, 525, 1607, 1648, 525, 1610, 1580, 525, 1610, 1581, 525, 1610, + 1582, 525, 1610, 1605, 525, 1610, 1607, 526, 1574, 1605, 526, 1574, 1607, + 526, 1576, 1605, 526, 1576, 1607, 526, 1578, 1605, 526, 1578, 1607, 526, + 1579, 1605, 526, 1579, 1607, 526, 1587, 1605, 526, 1587, 1607, 526, 1588, + 1605, 526, 1588, 1607, 526, 1603, 1604, 526, 1603, 1605, 526, 1604, 1605, + 526, 1606, 1605, 526, 1606, 1607, 526, 1610, 1605, 526, 1610, 1607, 782, + 1600, 1614, 1617, 782, 1600, 1615, 1617, 782, 1600, 1616, 1617, 523, + 1591, 1609, 523, 1591, 1610, 523, 1593, 1609, 523, 1593, 1610, 523, 1594, + 1609, 523, 1594, 1610, 523, 1587, 1609, 523, 1587, 1610, 523, 1588, 1609, + 523, 1588, 1610, 523, 1581, 1609, 523, 1581, 1610, 523, 1580, 1609, 523, + 1580, 1610, 523, 1582, 1609, 523, 1582, 1610, 523, 1589, 1609, 523, 1589, + 1610, 523, 1590, 1609, 523, 1590, 1610, 523, 1588, 1580, 523, 1588, 1581, + 523, 1588, 1582, 523, 1588, 1605, 523, 1588, 1585, 523, 1587, 1585, 523, + 1589, 1585, 523, 1590, 1585, 524, 1591, 1609, 524, 1591, 1610, 524, 1593, + 1609, 524, 1593, 1610, 524, 1594, 1609, 524, 1594, 1610, 524, 1587, 1609, + 524, 1587, 1610, 524, 1588, 1609, 524, 1588, 1610, 524, 1581, 1609, 524, + 1581, 1610, 524, 1580, 1609, 524, 1580, 1610, 524, 1582, 1609, 524, 1582, + 1610, 524, 1589, 1609, 524, 1589, 1610, 524, 1590, 1609, 524, 1590, 1610, + 524, 1588, 1580, 524, 1588, 1581, 524, 1588, 1582, 524, 1588, 1605, 524, + 1588, 1585, 524, 1587, 1585, 524, 1589, 1585, 524, 1590, 1585, 525, 1588, + 1580, 525, 1588, 1581, 525, 1588, 1582, 525, 1588, 1605, 525, 1587, 1607, + 525, 1588, 1607, 525, 1591, 1605, 526, 1587, 1580, 526, 1587, 1581, 526, + 1587, 1582, 526, 1588, 1580, 526, 1588, 1581, 526, 1588, 1582, 526, 1591, + 1605, 526, 1592, 1605, 524, 1575, 1611, 523, 1575, 1611, 781, 1578, 1580, + 1605, 780, 1578, 1581, 1580, 781, 1578, 1581, 1580, 781, 1578, 1581, + 1605, 781, 1578, 1582, 1605, 781, 1578, 1605, 1580, 781, 1578, 1605, + 1581, 781, 1578, 1605, 1582, 780, 1580, 1605, 1581, 781, 1580, 1605, + 1581, 780, 1581, 1605, 1610, 780, 1581, 1605, 1609, 781, 1587, 1581, + 1580, 781, 1587, 1580, 1581, 780, 1587, 1580, 1609, 780, 1587, 1605, + 1581, 781, 1587, 1605, 1581, 781, 1587, 1605, 1580, 780, 1587, 1605, + 1605, 781, 1587, 1605, 1605, 780, 1589, 1581, 1581, 781, 1589, 1581, + 1581, 780, 1589, 1605, 1605, 780, 1588, 1581, 1605, 781, 1588, 1581, + 1605, 780, 1588, 1580, 1610, 780, 1588, 1605, 1582, 781, 1588, 1605, + 1582, 780, 1588, 1605, 1605, 781, 1588, 1605, 1605, 780, 1590, 1581, + 1609, 780, 1590, 1582, 1605, 781, 1590, 1582, 1605, 780, 1591, 1605, + 1581, 781, 1591, 1605, 1581, 781, 1591, 1605, 1605, 780, 1591, 1605, + 1610, 780, 1593, 1580, 1605, 780, 1593, 1605, 1605, 781, 1593, 1605, + 1605, 780, 1593, 1605, 1609, 780, 1594, 1605, 1605, 780, 1594, 1605, + 1610, 780, 1594, 1605, 1609, 780, 1601, 1582, 1605, 781, 1601, 1582, + 1605, 780, 1602, 1605, 1581, 780, 1602, 1605, 1605, 780, 1604, 1581, + 1605, 780, 1604, 1581, 1610, 780, 1604, 1581, 1609, 781, 1604, 1580, + 1580, 780, 1604, 1580, 1580, 780, 1604, 1582, 1605, 781, 1604, 1582, + 1605, 780, 1604, 1605, 1581, 781, 1604, 1605, 1581, 781, 1605, 1581, + 1580, 781, 1605, 1581, 1605, 780, 1605, 1581, 1610, 781, 1605, 1580, + 1581, 781, 1605, 1580, 1605, 781, 1605, 1582, 1580, 781, 1605, 1582, + 1605, 781, 1605, 1580, 1582, 781, 1607, 1605, 1580, 781, 1607, 1605, + 1605, 781, 1606, 1581, 1605, 780, 1606, 1581, 1609, 780, 1606, 1580, + 1605, 781, 1606, 1580, 1605, 780, 1606, 1580, 1609, 780, 1606, 1605, + 1610, 780, 1606, 1605, 1609, 780, 1610, 1605, 1605, 781, 1610, 1605, + 1605, 780, 1576, 1582, 1610, 780, 1578, 1580, 1610, 780, 1578, 1580, + 1609, 780, 1578, 1582, 1610, 780, 1578, 1582, 1609, 780, 1578, 1605, + 1610, 780, 1578, 1605, 1609, 780, 1580, 1605, 1610, 780, 1580, 1581, + 1609, 780, 1580, 1605, 1609, 780, 1587, 1582, 1609, 780, 1589, 1581, + 1610, 780, 1588, 1581, 1610, 780, 1590, 1581, 1610, 780, 1604, 1580, + 1610, 780, 1604, 1605, 1610, 780, 1610, 1581, 1610, 780, 1610, 1580, + 1610, 780, 1610, 1605, 1610, 780, 1605, 1605, 1610, 780, 1602, 1605, + 1610, 780, 1606, 1581, 1610, 781, 1602, 1605, 1581, 781, 1604, 1581, + 1605, 780, 1593, 1605, 1610, 780, 1603, 1605, 1610, 781, 1606, 1580, + 1581, 780, 1605, 1582, 1610, 781, 1604, 1580, 1605, 780, 1603, 1605, + 1605, 780, 1604, 1580, 1605, 780, 1606, 1580, 1581, 780, 1580, 1581, + 1610, 780, 1581, 1580, 1610, 780, 1605, 1580, 1610, 780, 1601, 1605, + 1610, 780, 1576, 1581, 1610, 781, 1603, 1605, 1605, 781, 1593, 1580, + 1605, 781, 1589, 1605, 1605, 780, 1587, 1582, 1610, 780, 1606, 1580, + 1610, 779, 1589, 1604, 1746, 779, 1602, 1604, 1746, 1035, 1575, 1604, + 1604, 1607, 1035, 1575, 1603, 1576, 1585, 1035, 1605, 1581, 1605, 1583, + 1035, 1589, 1604, 1593, 1605, 1035, 1585, 1587, 1608, 1604, 1035, 1593, + 1604, 1610, 1607, 1035, 1608, 1587, 1604, 1605, 779, 1589, 1604, 1609, + 4619, 1589, 1604, 1609, 32, 1575, 1604, 1604, 1607, 32, 1593, 1604, 1610, + 1607, 32, 1608, 1587, 1604, 1605, 2059, 1580, 1604, 32, 1580, 1604, 1575, + 1604, 1607, 1035, 1585, 1740, 1575, 1604, 265, 44, 265, 12289, 265, + 12290, 265, 58, 265, 59, 265, 33, 265, 63, 265, 12310, 265, 12311, 265, + 8230, 265, 8229, 265, 8212, 265, 8211, 265, 95, 265, 95, 265, 40, 265, + 41, 265, 123, 265, 125, 265, 12308, 265, 12309, 265, 12304, 265, 12305, + 265, 12298, 265, 12299, 265, 12296, 265, 12297, 265, 12300, 265, 12301, + 265, 12302, 265, 12303, 265, 91, 265, 93, 258, 8254, 258, 8254, 258, + 8254, 258, 8254, 258, 95, 258, 95, 258, 95, 271, 44, 271, 12289, 271, 46, + 271, 59, 271, 58, 271, 63, 271, 33, 271, 8212, 271, 40, 271, 41, 271, + 123, 271, 125, 271, 12308, 271, 12309, 271, 35, 271, 38, 271, 42, 271, + 43, 271, 45, 271, 60, 271, 62, 271, 61, 271, 92, 271, 36, 271, 37, 271, + 64, 523, 32, 1611, 526, 1600, 1611, 523, 32, 1612, 523, 32, 1613, 523, + 32, 1614, 526, 1600, 1614, 523, 32, 1615, 526, 1600, 1615, 523, 32, 1616, + 526, 1600, 1616, 523, 32, 1617, 526, 1600, 1617, 523, 32, 1618, 526, + 1600, 1618, 267, 1569, 267, 1570, 268, 1570, 267, 1571, 268, 1571, 267, + 1572, 268, 1572, 267, 1573, 268, 1573, 267, 1574, 268, 1574, 269, 1574, + 270, 1574, 267, 1575, 268, 1575, 267, 1576, 268, 1576, 269, 1576, 270, + 1576, 267, 1577, 268, 1577, 267, 1578, 268, 1578, 269, 1578, 270, 1578, + 267, 1579, 268, 1579, 269, 1579, 270, 1579, 267, 1580, 268, 1580, 269, + 1580, 270, 1580, 267, 1581, 268, 1581, 269, 1581, 270, 1581, 267, 1582, + 268, 1582, 269, 1582, 270, 1582, 267, 1583, 268, 1583, 267, 1584, 268, + 1584, 267, 1585, 268, 1585, 267, 1586, 268, 1586, 267, 1587, 268, 1587, + 269, 1587, 270, 1587, 267, 1588, 268, 1588, 269, 1588, 270, 1588, 267, + 1589, 268, 1589, 269, 1589, 270, 1589, 267, 1590, 268, 1590, 269, 1590, + 270, 1590, 267, 1591, 268, 1591, 269, 1591, 270, 1591, 267, 1592, 268, + 1592, 269, 1592, 270, 1592, 267, 1593, 268, 1593, 269, 1593, 270, 1593, + 267, 1594, 268, 1594, 269, 1594, 270, 1594, 267, 1601, 268, 1601, 269, + 1601, 270, 1601, 267, 1602, 268, 1602, 269, 1602, 270, 1602, 267, 1603, + 268, 1603, 269, 1603, 270, 1603, 267, 1604, 268, 1604, 269, 1604, 270, + 1604, 267, 1605, 268, 1605, 269, 1605, 270, 1605, 267, 1606, 268, 1606, + 269, 1606, 270, 1606, 267, 1607, 268, 1607, 269, 1607, 270, 1607, 267, + 1608, 268, 1608, 267, 1609, 268, 1609, 267, 1610, 268, 1610, 269, 1610, + 270, 1610, 523, 1604, 1570, 524, 1604, 1570, 523, 1604, 1571, 524, 1604, + 1571, 523, 1604, 1573, 524, 1604, 1573, 523, 1604, 1575, 524, 1604, 1575, + 264, 33, 264, 34, 264, 35, 264, 36, 264, 37, 264, 38, 264, 39, 264, 40, + 264, 41, 264, 42, 264, 43, 264, 44, 264, 45, 264, 46, 264, 47, 264, 48, + 264, 49, 264, 50, 264, 51, 264, 52, 264, 53, 264, 54, 264, 55, 264, 56, + 264, 57, 264, 58, 264, 59, 264, 60, 264, 61, 264, 62, 264, 63, 264, 64, + 264, 65, 264, 66, 264, 67, 264, 68, 264, 69, 264, 70, 264, 71, 264, 72, + 264, 73, 264, 74, 264, 75, 264, 76, 264, 77, 264, 78, 264, 79, 264, 80, + 264, 81, 264, 82, 264, 83, 264, 84, 264, 85, 264, 86, 264, 87, 264, 88, + 264, 89, 264, 90, 264, 91, 264, 92, 264, 93, 264, 94, 264, 95, 264, 96, + 264, 97, 264, 98, 264, 99, 264, 100, 264, 101, 264, 102, 264, 103, 264, + 104, 264, 105, 264, 106, 264, 107, 264, 108, 264, 109, 264, 110, 264, + 111, 264, 112, 264, 113, 264, 114, 264, 115, 264, 116, 264, 117, 264, + 118, 264, 119, 264, 120, 264, 121, 264, 122, 264, 123, 264, 124, 264, + 125, 264, 126, 264, 10629, 264, 10630, 272, 12290, 272, 12300, 272, + 12301, 272, 12289, 272, 12539, 272, 12530, 272, 12449, 272, 12451, 272, + 12453, 272, 12455, 272, 12457, 272, 12515, 272, 12517, 272, 12519, 272, + 12483, 272, 12540, 272, 12450, 272, 12452, 272, 12454, 272, 12456, 272, + 12458, 272, 12459, 272, 12461, 272, 12463, 272, 12465, 272, 12467, 272, + 12469, 272, 12471, 272, 12473, 272, 12475, 272, 12477, 272, 12479, 272, + 12481, 272, 12484, 272, 12486, 272, 12488, 272, 12490, 272, 12491, 272, + 12492, 272, 12493, 272, 12494, 272, 12495, 272, 12498, 272, 12501, 272, + 12504, 272, 12507, 272, 12510, 272, 12511, 272, 12512, 272, 12513, 272, + 12514, 272, 12516, 272, 12518, 272, 12520, 272, 12521, 272, 12522, 272, + 12523, 272, 12524, 272, 12525, 272, 12527, 272, 12531, 272, 12441, 272, + 12442, 272, 12644, 272, 12593, 272, 12594, 272, 12595, 272, 12596, 272, + 12597, 272, 12598, 272, 12599, 272, 12600, 272, 12601, 272, 12602, 272, + 12603, 272, 12604, 272, 12605, 272, 12606, 272, 12607, 272, 12608, 272, + 12609, 272, 12610, 272, 12611, 272, 12612, 272, 12613, 272, 12614, 272, + 12615, 272, 12616, 272, 12617, 272, 12618, 272, 12619, 272, 12620, 272, + 12621, 272, 12622, 272, 12623, 272, 12624, 272, 12625, 272, 12626, 272, + 12627, 272, 12628, 272, 12629, 272, 12630, 272, 12631, 272, 12632, 272, + 12633, 272, 12634, 272, 12635, 272, 12636, 272, 12637, 272, 12638, 272, + 12639, 272, 12640, 272, 12641, 272, 12642, 272, 12643, 264, 162, 264, + 163, 264, 172, 264, 175, 264, 166, 264, 165, 264, 8361, 272, 9474, 272, + 8592, 272, 8593, 272, 8594, 272, 8595, 272, 9632, 272, 9675, 512, 69785, + 69818, 512, 69787, 69818, 512, 69797, 69818, 512, 69937, 69927, 512, + 69938, 69927, 512, 70471, 70462, 512, 70471, 70487, 512, 70841, 70842, + 512, 70841, 70832, 512, 70841, 70845, 512, 71096, 71087, 512, 71097, + 71087, 512, 71989, 71984, 512, 119127, 119141, 512, 119128, 119141, 512, + 119135, 119150, 512, 119135, 119151, 512, 119135, 119152, 512, 119135, + 119153, 512, 119135, 119154, 512, 119225, 119141, 512, 119226, 119141, + 512, 119227, 119150, 512, 119228, 119150, 512, 119227, 119151, 512, + 119228, 119151, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, + 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, + 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, + 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, + 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, + 262, 102, 262, 103, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, + 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, + 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, + 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, + 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, + 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, + 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, + 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, + 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, + 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 67, 262, + 68, 262, 71, 262, 74, 262, 75, 262, 78, 262, 79, 262, 80, 262, 81, 262, + 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, + 97, 262, 98, 262, 99, 262, 100, 262, 102, 262, 104, 262, 105, 262, 106, + 262, 107, 262, 108, 262, 109, 262, 110, 262, 112, 262, 113, 262, 114, + 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, + 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, + 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, + 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, + 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, - 262, 65, 262, 67, 262, 68, 262, 71, 262, 74, 262, 75, 262, 78, 262, 79, - 262, 80, 262, 81, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, - 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 102, 262, - 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, - 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, - 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, - 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, - 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, - 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, - 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, - 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, - 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, - 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 68, 262, 69, 262, 70, - 262, 71, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, - 262, 81, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, - 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, - 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, - 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, - 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 68, - 262, 69, 262, 70, 262, 71, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, - 262, 79, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, - 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, - 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, - 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, - 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, - 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, - 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, - 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, - 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, - 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, - 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, - 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, - 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, - 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, - 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, - 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, - 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, - 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, - 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, - 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, - 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, - 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, + 262, 65, 262, 66, 262, 68, 262, 69, 262, 70, 262, 71, 262, 74, 262, 75, + 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 83, 262, 84, + 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 97, 262, 98, 262, 99, + 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, + 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, + 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, + 262, 121, 262, 122, 262, 65, 262, 66, 262, 68, 262, 69, 262, 70, 262, 71, + 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 79, 262, 83, 262, 84, + 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, @@ -4136,24 +4163,28 @@ static const unsigned int decomp_data[] = { 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, - 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, - 305, 262, 567, 262, 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, - 918, 262, 919, 262, 920, 262, 921, 262, 922, 262, 923, 262, 924, 262, - 925, 262, 926, 262, 927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, - 932, 262, 933, 262, 934, 262, 935, 262, 936, 262, 937, 262, 8711, 262, - 945, 262, 946, 262, 947, 262, 948, 262, 949, 262, 950, 262, 951, 262, - 952, 262, 953, 262, 954, 262, 955, 262, 956, 262, 957, 262, 958, 262, - 959, 262, 960, 262, 961, 262, 962, 262, 963, 262, 964, 262, 965, 262, - 966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, 1013, 262, 977, 262, - 1008, 262, 981, 262, 1009, 262, 982, 262, 913, 262, 914, 262, 915, 262, - 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, 921, 262, 922, 262, - 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, 928, 262, 929, 262, - 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, 935, 262, 936, 262, - 937, 262, 8711, 262, 945, 262, 946, 262, 947, 262, 948, 262, 949, 262, - 950, 262, 951, 262, 952, 262, 953, 262, 954, 262, 955, 262, 956, 262, - 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, 962, 262, 963, 262, - 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, - 1013, 262, 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, 913, 262, + 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, + 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, + 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, + 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, + 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, + 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, + 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, + 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, + 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, + 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, + 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, + 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, + 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, + 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, + 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, + 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, + 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, + 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, + 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, + 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, + 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, + 119, 262, 120, 262, 121, 262, 122, 262, 305, 262, 567, 262, 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, 921, 262, 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, @@ -4178,152 +4209,170 @@ static const unsigned int decomp_data[] = { 951, 262, 952, 262, 953, 262, 954, 262, 955, 262, 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, 962, 262, 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, 1013, 262, - 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, 988, 262, 989, 262, - 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, - 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, - 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, - 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, - 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, - 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, - 56, 262, 57, 262, 1575, 262, 1576, 262, 1580, 262, 1583, 262, 1608, 262, - 1586, 262, 1581, 262, 1591, 262, 1610, 262, 1603, 262, 1604, 262, 1605, - 262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262, 1602, 262, - 1585, 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1584, 262, 1590, - 262, 1592, 262, 1594, 262, 1646, 262, 1722, 262, 1697, 262, 1647, 262, - 1576, 262, 1580, 262, 1607, 262, 1581, 262, 1610, 262, 1603, 262, 1604, + 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, 913, 262, 914, 262, + 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, 921, 262, + 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, 928, 262, + 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, 935, 262, + 936, 262, 937, 262, 8711, 262, 945, 262, 946, 262, 947, 262, 948, 262, + 949, 262, 950, 262, 951, 262, 952, 262, 953, 262, 954, 262, 955, 262, + 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, 962, 262, + 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, 969, 262, + 8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, + 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, + 920, 262, 921, 262, 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, + 927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, + 934, 262, 935, 262, 936, 262, 937, 262, 8711, 262, 945, 262, 946, 262, + 947, 262, 948, 262, 949, 262, 950, 262, 951, 262, 952, 262, 953, 262, + 954, 262, 955, 262, 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, + 961, 262, 962, 262, 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, + 968, 262, 969, 262, 8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, + 1009, 262, 982, 262, 988, 262, 989, 262, 48, 262, 49, 262, 50, 262, 51, + 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, + 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, + 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, + 262, 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, + 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, + 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 1575, 262, + 1576, 262, 1580, 262, 1583, 262, 1608, 262, 1586, 262, 1581, 262, 1591, + 262, 1610, 262, 1603, 262, 1604, 262, 1605, 262, 1606, 262, 1587, 262, + 1593, 262, 1601, 262, 1589, 262, 1602, 262, 1585, 262, 1588, 262, 1578, + 262, 1579, 262, 1582, 262, 1584, 262, 1590, 262, 1592, 262, 1594, 262, + 1646, 262, 1722, 262, 1697, 262, 1647, 262, 1576, 262, 1580, 262, 1607, + 262, 1581, 262, 1610, 262, 1603, 262, 1604, 262, 1605, 262, 1606, 262, + 1587, 262, 1593, 262, 1601, 262, 1589, 262, 1602, 262, 1588, 262, 1578, + 262, 1579, 262, 1582, 262, 1590, 262, 1594, 262, 1580, 262, 1581, 262, + 1610, 262, 1604, 262, 1606, 262, 1587, 262, 1593, 262, 1589, 262, 1602, + 262, 1588, 262, 1582, 262, 1590, 262, 1594, 262, 1722, 262, 1647, 262, + 1576, 262, 1580, 262, 1607, 262, 1581, 262, 1591, 262, 1610, 262, 1603, 262, 1605, 262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262, - 1602, 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1590, 262, 1594, - 262, 1580, 262, 1581, 262, 1610, 262, 1604, 262, 1606, 262, 1587, 262, - 1593, 262, 1589, 262, 1602, 262, 1588, 262, 1582, 262, 1590, 262, 1594, - 262, 1722, 262, 1647, 262, 1576, 262, 1580, 262, 1607, 262, 1581, 262, - 1591, 262, 1610, 262, 1603, 262, 1605, 262, 1606, 262, 1587, 262, 1593, - 262, 1601, 262, 1589, 262, 1602, 262, 1588, 262, 1578, 262, 1579, 262, - 1582, 262, 1590, 262, 1592, 262, 1594, 262, 1646, 262, 1697, 262, 1575, - 262, 1576, 262, 1580, 262, 1583, 262, 1607, 262, 1608, 262, 1586, 262, - 1581, 262, 1591, 262, 1610, 262, 1604, 262, 1605, 262, 1606, 262, 1587, - 262, 1593, 262, 1601, 262, 1589, 262, 1602, 262, 1585, 262, 1588, 262, - 1578, 262, 1579, 262, 1582, 262, 1584, 262, 1590, 262, 1592, 262, 1594, - 262, 1576, 262, 1580, 262, 1583, 262, 1608, 262, 1586, 262, 1581, 262, - 1591, 262, 1610, 262, 1604, 262, 1605, 262, 1606, 262, 1587, 262, 1593, - 262, 1601, 262, 1589, 262, 1602, 262, 1585, 262, 1588, 262, 1578, 262, - 1579, 262, 1582, 262, 1584, 262, 1590, 262, 1592, 262, 1594, 514, 48, 46, - 514, 48, 44, 514, 49, 44, 514, 50, 44, 514, 51, 44, 514, 52, 44, 514, 53, - 44, 514, 54, 44, 514, 55, 44, 514, 56, 44, 514, 57, 44, 770, 40, 65, 41, - 770, 40, 66, 41, 770, 40, 67, 41, 770, 40, 68, 41, 770, 40, 69, 41, 770, - 40, 70, 41, 770, 40, 71, 41, 770, 40, 72, 41, 770, 40, 73, 41, 770, 40, - 74, 41, 770, 40, 75, 41, 770, 40, 76, 41, 770, 40, 77, 41, 770, 40, 78, - 41, 770, 40, 79, 41, 770, 40, 80, 41, 770, 40, 81, 41, 770, 40, 82, 41, - 770, 40, 83, 41, 770, 40, 84, 41, 770, 40, 85, 41, 770, 40, 86, 41, 770, - 40, 87, 41, 770, 40, 88, 41, 770, 40, 89, 41, 770, 40, 90, 41, 770, - 12308, 83, 12309, 263, 67, 263, 82, 519, 67, 68, 519, 87, 90, 266, 65, - 266, 66, 266, 67, 266, 68, 266, 69, 266, 70, 266, 71, 266, 72, 266, 73, - 266, 74, 266, 75, 266, 76, 266, 77, 266, 78, 266, 79, 266, 80, 266, 81, - 266, 82, 266, 83, 266, 84, 266, 85, 266, 86, 266, 87, 266, 88, 266, 89, - 266, 90, 522, 72, 86, 522, 77, 86, 522, 83, 68, 522, 83, 83, 778, 80, 80, - 86, 522, 87, 67, 515, 77, 67, 515, 77, 68, 515, 77, 82, 522, 68, 74, 522, - 12411, 12363, 522, 12467, 12467, 266, 12469, 266, 25163, 266, 23383, 266, - 21452, 266, 12487, 266, 20108, 266, 22810, 266, 35299, 266, 22825, 266, - 20132, 266, 26144, 266, 28961, 266, 26009, 266, 21069, 266, 24460, 266, - 20877, 266, 26032, 266, 21021, 266, 32066, 266, 29983, 266, 36009, 266, - 22768, 266, 21561, 266, 28436, 266, 25237, 266, 25429, 266, 19968, 266, - 19977, 266, 36938, 266, 24038, 266, 20013, 266, 21491, 266, 25351, 266, - 36208, 266, 25171, 266, 31105, 266, 31354, 266, 21512, 266, 28288, 266, - 26377, 266, 26376, 266, 30003, 266, 21106, 266, 21942, 266, 37197, 770, - 12308, 26412, 12309, 770, 12308, 19977, 12309, 770, 12308, 20108, 12309, - 770, 12308, 23433, 12309, 770, 12308, 28857, 12309, 770, 12308, 25171, - 12309, 770, 12308, 30423, 12309, 770, 12308, 21213, 12309, 770, 12308, - 25943, 12309, 263, 24471, 263, 21487, 256, 20029, 256, 20024, 256, 20033, - 256, 131362, 256, 20320, 256, 20398, 256, 20411, 256, 20482, 256, 20602, - 256, 20633, 256, 20711, 256, 20687, 256, 13470, 256, 132666, 256, 20813, - 256, 20820, 256, 20836, 256, 20855, 256, 132380, 256, 13497, 256, 20839, - 256, 20877, 256, 132427, 256, 20887, 256, 20900, 256, 20172, 256, 20908, - 256, 20917, 256, 168415, 256, 20981, 256, 20995, 256, 13535, 256, 21051, - 256, 21062, 256, 21106, 256, 21111, 256, 13589, 256, 21191, 256, 21193, - 256, 21220, 256, 21242, 256, 21253, 256, 21254, 256, 21271, 256, 21321, - 256, 21329, 256, 21338, 256, 21363, 256, 21373, 256, 21375, 256, 21375, - 256, 21375, 256, 133676, 256, 28784, 256, 21450, 256, 21471, 256, 133987, - 256, 21483, 256, 21489, 256, 21510, 256, 21662, 256, 21560, 256, 21576, - 256, 21608, 256, 21666, 256, 21750, 256, 21776, 256, 21843, 256, 21859, - 256, 21892, 256, 21892, 256, 21913, 256, 21931, 256, 21939, 256, 21954, - 256, 22294, 256, 22022, 256, 22295, 256, 22097, 256, 22132, 256, 20999, - 256, 22766, 256, 22478, 256, 22516, 256, 22541, 256, 22411, 256, 22578, - 256, 22577, 256, 22700, 256, 136420, 256, 22770, 256, 22775, 256, 22790, - 256, 22810, 256, 22818, 256, 22882, 256, 136872, 256, 136938, 256, 23020, - 256, 23067, 256, 23079, 256, 23000, 256, 23142, 256, 14062, 256, 14076, - 256, 23304, 256, 23358, 256, 23358, 256, 137672, 256, 23491, 256, 23512, - 256, 23527, 256, 23539, 256, 138008, 256, 23551, 256, 23558, 256, 24403, - 256, 23586, 256, 14209, 256, 23648, 256, 23662, 256, 23744, 256, 23693, - 256, 138724, 256, 23875, 256, 138726, 256, 23918, 256, 23915, 256, 23932, - 256, 24033, 256, 24034, 256, 14383, 256, 24061, 256, 24104, 256, 24125, - 256, 24169, 256, 14434, 256, 139651, 256, 14460, 256, 24240, 256, 24243, - 256, 24246, 256, 24266, 256, 172946, 256, 24318, 256, 140081, 256, - 140081, 256, 33281, 256, 24354, 256, 24354, 256, 14535, 256, 144056, 256, - 156122, 256, 24418, 256, 24427, 256, 14563, 256, 24474, 256, 24525, 256, - 24535, 256, 24569, 256, 24705, 256, 14650, 256, 14620, 256, 24724, 256, - 141012, 256, 24775, 256, 24904, 256, 24908, 256, 24910, 256, 24908, 256, - 24954, 256, 24974, 256, 25010, 256, 24996, 256, 25007, 256, 25054, 256, - 25074, 256, 25078, 256, 25104, 256, 25115, 256, 25181, 256, 25265, 256, - 25300, 256, 25424, 256, 142092, 256, 25405, 256, 25340, 256, 25448, 256, - 25475, 256, 25572, 256, 142321, 256, 25634, 256, 25541, 256, 25513, 256, - 14894, 256, 25705, 256, 25726, 256, 25757, 256, 25719, 256, 14956, 256, - 25935, 256, 25964, 256, 143370, 256, 26083, 256, 26360, 256, 26185, 256, - 15129, 256, 26257, 256, 15112, 256, 15076, 256, 20882, 256, 20885, 256, - 26368, 256, 26268, 256, 32941, 256, 17369, 256, 26391, 256, 26395, 256, - 26401, 256, 26462, 256, 26451, 256, 144323, 256, 15177, 256, 26618, 256, - 26501, 256, 26706, 256, 26757, 256, 144493, 256, 26766, 256, 26655, 256, - 26900, 256, 15261, 256, 26946, 256, 27043, 256, 27114, 256, 27304, 256, - 145059, 256, 27355, 256, 15384, 256, 27425, 256, 145575, 256, 27476, 256, - 15438, 256, 27506, 256, 27551, 256, 27578, 256, 27579, 256, 146061, 256, - 138507, 256, 146170, 256, 27726, 256, 146620, 256, 27839, 256, 27853, - 256, 27751, 256, 27926, 256, 27966, 256, 28023, 256, 27969, 256, 28009, - 256, 28024, 256, 28037, 256, 146718, 256, 27956, 256, 28207, 256, 28270, - 256, 15667, 256, 28363, 256, 28359, 256, 147153, 256, 28153, 256, 28526, - 256, 147294, 256, 147342, 256, 28614, 256, 28729, 256, 28702, 256, 28699, - 256, 15766, 256, 28746, 256, 28797, 256, 28791, 256, 28845, 256, 132389, - 256, 28997, 256, 148067, 256, 29084, 256, 148395, 256, 29224, 256, 29237, - 256, 29264, 256, 149000, 256, 29312, 256, 29333, 256, 149301, 256, - 149524, 256, 29562, 256, 29579, 256, 16044, 256, 29605, 256, 16056, 256, - 16056, 256, 29767, 256, 29788, 256, 29809, 256, 29829, 256, 29898, 256, - 16155, 256, 29988, 256, 150582, 256, 30014, 256, 150674, 256, 30064, 256, - 139679, 256, 30224, 256, 151457, 256, 151480, 256, 151620, 256, 16380, - 256, 16392, 256, 30452, 256, 151795, 256, 151794, 256, 151833, 256, - 151859, 256, 30494, 256, 30495, 256, 30495, 256, 30538, 256, 16441, 256, - 30603, 256, 16454, 256, 16534, 256, 152605, 256, 30798, 256, 30860, 256, - 30924, 256, 16611, 256, 153126, 256, 31062, 256, 153242, 256, 153285, - 256, 31119, 256, 31211, 256, 16687, 256, 31296, 256, 31306, 256, 31311, - 256, 153980, 256, 154279, 256, 154279, 256, 31470, 256, 16898, 256, - 154539, 256, 31686, 256, 31689, 256, 16935, 256, 154752, 256, 31954, 256, - 17056, 256, 31976, 256, 31971, 256, 32000, 256, 155526, 256, 32099, 256, - 17153, 256, 32199, 256, 32258, 256, 32325, 256, 17204, 256, 156200, 256, - 156231, 256, 17241, 256, 156377, 256, 32634, 256, 156478, 256, 32661, - 256, 32762, 256, 32773, 256, 156890, 256, 156963, 256, 32864, 256, - 157096, 256, 32880, 256, 144223, 256, 17365, 256, 32946, 256, 33027, 256, - 17419, 256, 33086, 256, 23221, 256, 157607, 256, 157621, 256, 144275, - 256, 144284, 256, 33281, 256, 33284, 256, 36766, 256, 17515, 256, 33425, - 256, 33419, 256, 33437, 256, 21171, 256, 33457, 256, 33459, 256, 33469, - 256, 33510, 256, 158524, 256, 33509, 256, 33565, 256, 33635, 256, 33709, - 256, 33571, 256, 33725, 256, 33767, 256, 33879, 256, 33619, 256, 33738, - 256, 33740, 256, 33756, 256, 158774, 256, 159083, 256, 158933, 256, - 17707, 256, 34033, 256, 34035, 256, 34070, 256, 160714, 256, 34148, 256, - 159532, 256, 17757, 256, 17761, 256, 159665, 256, 159954, 256, 17771, - 256, 34384, 256, 34396, 256, 34407, 256, 34409, 256, 34473, 256, 34440, - 256, 34574, 256, 34530, 256, 34681, 256, 34600, 256, 34667, 256, 34694, - 256, 17879, 256, 34785, 256, 34817, 256, 17913, 256, 34912, 256, 34915, - 256, 161383, 256, 35031, 256, 35038, 256, 17973, 256, 35066, 256, 13499, - 256, 161966, 256, 162150, 256, 18110, 256, 18119, 256, 35488, 256, 35565, - 256, 35722, 256, 35925, 256, 162984, 256, 36011, 256, 36033, 256, 36123, - 256, 36215, 256, 163631, 256, 133124, 256, 36299, 256, 36284, 256, 36336, - 256, 133342, 256, 36564, 256, 36664, 256, 165330, 256, 165357, 256, - 37012, 256, 37105, 256, 37137, 256, 165678, 256, 37147, 256, 37432, 256, - 37591, 256, 37592, 256, 37500, 256, 37881, 256, 37909, 256, 166906, 256, - 38283, 256, 18837, 256, 38327, 256, 167287, 256, 18918, 256, 38595, 256, - 23986, 256, 38691, 256, 168261, 256, 168474, 256, 19054, 256, 19062, 256, - 38880, 256, 168970, 256, 19122, 256, 169110, 256, 38923, 256, 38923, 256, - 38953, 256, 169398, 256, 39138, 256, 19251, 256, 39209, 256, 39335, 256, - 39362, 256, 39422, 256, 19406, 256, 170800, 256, 39698, 256, 40000, 256, - 40189, 256, 19662, 256, 19693, 256, 40295, 256, 172238, 256, 19704, 256, - 172293, 256, 172558, 256, 172689, 256, 40635, 256, 19798, 256, 40697, - 256, 40702, 256, 40709, 256, 40719, 256, 40726, 256, 40763, 256, 173568, + 1602, 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1590, 262, 1592, + 262, 1594, 262, 1646, 262, 1697, 262, 1575, 262, 1576, 262, 1580, 262, + 1583, 262, 1607, 262, 1608, 262, 1586, 262, 1581, 262, 1591, 262, 1610, + 262, 1604, 262, 1605, 262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, + 1589, 262, 1602, 262, 1585, 262, 1588, 262, 1578, 262, 1579, 262, 1582, + 262, 1584, 262, 1590, 262, 1592, 262, 1594, 262, 1576, 262, 1580, 262, + 1583, 262, 1608, 262, 1586, 262, 1581, 262, 1591, 262, 1610, 262, 1604, + 262, 1605, 262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262, + 1602, 262, 1585, 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1584, + 262, 1590, 262, 1592, 262, 1594, 514, 48, 46, 514, 48, 44, 514, 49, 44, + 514, 50, 44, 514, 51, 44, 514, 52, 44, 514, 53, 44, 514, 54, 44, 514, 55, + 44, 514, 56, 44, 514, 57, 44, 770, 40, 65, 41, 770, 40, 66, 41, 770, 40, + 67, 41, 770, 40, 68, 41, 770, 40, 69, 41, 770, 40, 70, 41, 770, 40, 71, + 41, 770, 40, 72, 41, 770, 40, 73, 41, 770, 40, 74, 41, 770, 40, 75, 41, + 770, 40, 76, 41, 770, 40, 77, 41, 770, 40, 78, 41, 770, 40, 79, 41, 770, + 40, 80, 41, 770, 40, 81, 41, 770, 40, 82, 41, 770, 40, 83, 41, 770, 40, + 84, 41, 770, 40, 85, 41, 770, 40, 86, 41, 770, 40, 87, 41, 770, 40, 88, + 41, 770, 40, 89, 41, 770, 40, 90, 41, 770, 12308, 83, 12309, 263, 67, + 263, 82, 519, 67, 68, 519, 87, 90, 266, 65, 266, 66, 266, 67, 266, 68, + 266, 69, 266, 70, 266, 71, 266, 72, 266, 73, 266, 74, 266, 75, 266, 76, + 266, 77, 266, 78, 266, 79, 266, 80, 266, 81, 266, 82, 266, 83, 266, 84, + 266, 85, 266, 86, 266, 87, 266, 88, 266, 89, 266, 90, 522, 72, 86, 522, + 77, 86, 522, 83, 68, 522, 83, 83, 778, 80, 80, 86, 522, 87, 67, 515, 77, + 67, 515, 77, 68, 515, 77, 82, 522, 68, 74, 522, 12411, 12363, 522, 12467, + 12467, 266, 12469, 266, 25163, 266, 23383, 266, 21452, 266, 12487, 266, + 20108, 266, 22810, 266, 35299, 266, 22825, 266, 20132, 266, 26144, 266, + 28961, 266, 26009, 266, 21069, 266, 24460, 266, 20877, 266, 26032, 266, + 21021, 266, 32066, 266, 29983, 266, 36009, 266, 22768, 266, 21561, 266, + 28436, 266, 25237, 266, 25429, 266, 19968, 266, 19977, 266, 36938, 266, + 24038, 266, 20013, 266, 21491, 266, 25351, 266, 36208, 266, 25171, 266, + 31105, 266, 31354, 266, 21512, 266, 28288, 266, 26377, 266, 26376, 266, + 30003, 266, 21106, 266, 21942, 266, 37197, 770, 12308, 26412, 12309, 770, + 12308, 19977, 12309, 770, 12308, 20108, 12309, 770, 12308, 23433, 12309, + 770, 12308, 28857, 12309, 770, 12308, 25171, 12309, 770, 12308, 30423, + 12309, 770, 12308, 21213, 12309, 770, 12308, 25943, 12309, 263, 24471, + 263, 21487, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, + 54, 262, 55, 262, 56, 262, 57, 256, 20029, 256, 20024, 256, 20033, 256, + 131362, 256, 20320, 256, 20398, 256, 20411, 256, 20482, 256, 20602, 256, + 20633, 256, 20711, 256, 20687, 256, 13470, 256, 132666, 256, 20813, 256, + 20820, 256, 20836, 256, 20855, 256, 132380, 256, 13497, 256, 20839, 256, + 20877, 256, 132427, 256, 20887, 256, 20900, 256, 20172, 256, 20908, 256, + 20917, 256, 168415, 256, 20981, 256, 20995, 256, 13535, 256, 21051, 256, + 21062, 256, 21106, 256, 21111, 256, 13589, 256, 21191, 256, 21193, 256, + 21220, 256, 21242, 256, 21253, 256, 21254, 256, 21271, 256, 21321, 256, + 21329, 256, 21338, 256, 21363, 256, 21373, 256, 21375, 256, 21375, 256, + 21375, 256, 133676, 256, 28784, 256, 21450, 256, 21471, 256, 133987, 256, + 21483, 256, 21489, 256, 21510, 256, 21662, 256, 21560, 256, 21576, 256, + 21608, 256, 21666, 256, 21750, 256, 21776, 256, 21843, 256, 21859, 256, + 21892, 256, 21892, 256, 21913, 256, 21931, 256, 21939, 256, 21954, 256, + 22294, 256, 22022, 256, 22295, 256, 22097, 256, 22132, 256, 20999, 256, + 22766, 256, 22478, 256, 22516, 256, 22541, 256, 22411, 256, 22578, 256, + 22577, 256, 22700, 256, 136420, 256, 22770, 256, 22775, 256, 22790, 256, + 22810, 256, 22818, 256, 22882, 256, 136872, 256, 136938, 256, 23020, 256, + 23067, 256, 23079, 256, 23000, 256, 23142, 256, 14062, 256, 14076, 256, + 23304, 256, 23358, 256, 23358, 256, 137672, 256, 23491, 256, 23512, 256, + 23527, 256, 23539, 256, 138008, 256, 23551, 256, 23558, 256, 24403, 256, + 23586, 256, 14209, 256, 23648, 256, 23662, 256, 23744, 256, 23693, 256, + 138724, 256, 23875, 256, 138726, 256, 23918, 256, 23915, 256, 23932, 256, + 24033, 256, 24034, 256, 14383, 256, 24061, 256, 24104, 256, 24125, 256, + 24169, 256, 14434, 256, 139651, 256, 14460, 256, 24240, 256, 24243, 256, + 24246, 256, 24266, 256, 172946, 256, 24318, 256, 140081, 256, 140081, + 256, 33281, 256, 24354, 256, 24354, 256, 14535, 256, 144056, 256, 156122, + 256, 24418, 256, 24427, 256, 14563, 256, 24474, 256, 24525, 256, 24535, + 256, 24569, 256, 24705, 256, 14650, 256, 14620, 256, 24724, 256, 141012, + 256, 24775, 256, 24904, 256, 24908, 256, 24910, 256, 24908, 256, 24954, + 256, 24974, 256, 25010, 256, 24996, 256, 25007, 256, 25054, 256, 25074, + 256, 25078, 256, 25104, 256, 25115, 256, 25181, 256, 25265, 256, 25300, + 256, 25424, 256, 142092, 256, 25405, 256, 25340, 256, 25448, 256, 25475, + 256, 25572, 256, 142321, 256, 25634, 256, 25541, 256, 25513, 256, 14894, + 256, 25705, 256, 25726, 256, 25757, 256, 25719, 256, 14956, 256, 25935, + 256, 25964, 256, 143370, 256, 26083, 256, 26360, 256, 26185, 256, 15129, + 256, 26257, 256, 15112, 256, 15076, 256, 20882, 256, 20885, 256, 26368, + 256, 26268, 256, 32941, 256, 17369, 256, 26391, 256, 26395, 256, 26401, + 256, 26462, 256, 26451, 256, 144323, 256, 15177, 256, 26618, 256, 26501, + 256, 26706, 256, 26757, 256, 144493, 256, 26766, 256, 26655, 256, 26900, + 256, 15261, 256, 26946, 256, 27043, 256, 27114, 256, 27304, 256, 145059, + 256, 27355, 256, 15384, 256, 27425, 256, 145575, 256, 27476, 256, 15438, + 256, 27506, 256, 27551, 256, 27578, 256, 27579, 256, 146061, 256, 138507, + 256, 146170, 256, 27726, 256, 146620, 256, 27839, 256, 27853, 256, 27751, + 256, 27926, 256, 27966, 256, 28023, 256, 27969, 256, 28009, 256, 28024, + 256, 28037, 256, 146718, 256, 27956, 256, 28207, 256, 28270, 256, 15667, + 256, 28363, 256, 28359, 256, 147153, 256, 28153, 256, 28526, 256, 147294, + 256, 147342, 256, 28614, 256, 28729, 256, 28702, 256, 28699, 256, 15766, + 256, 28746, 256, 28797, 256, 28791, 256, 28845, 256, 132389, 256, 28997, + 256, 148067, 256, 29084, 256, 148395, 256, 29224, 256, 29237, 256, 29264, + 256, 149000, 256, 29312, 256, 29333, 256, 149301, 256, 149524, 256, + 29562, 256, 29579, 256, 16044, 256, 29605, 256, 16056, 256, 16056, 256, + 29767, 256, 29788, 256, 29809, 256, 29829, 256, 29898, 256, 16155, 256, + 29988, 256, 150582, 256, 30014, 256, 150674, 256, 30064, 256, 139679, + 256, 30224, 256, 151457, 256, 151480, 256, 151620, 256, 16380, 256, + 16392, 256, 30452, 256, 151795, 256, 151794, 256, 151833, 256, 151859, + 256, 30494, 256, 30495, 256, 30495, 256, 30538, 256, 16441, 256, 30603, + 256, 16454, 256, 16534, 256, 152605, 256, 30798, 256, 30860, 256, 30924, + 256, 16611, 256, 153126, 256, 31062, 256, 153242, 256, 153285, 256, + 31119, 256, 31211, 256, 16687, 256, 31296, 256, 31306, 256, 31311, 256, + 153980, 256, 154279, 256, 154279, 256, 31470, 256, 16898, 256, 154539, + 256, 31686, 256, 31689, 256, 16935, 256, 154752, 256, 31954, 256, 17056, + 256, 31976, 256, 31971, 256, 32000, 256, 155526, 256, 32099, 256, 17153, + 256, 32199, 256, 32258, 256, 32325, 256, 17204, 256, 156200, 256, 156231, + 256, 17241, 256, 156377, 256, 32634, 256, 156478, 256, 32661, 256, 32762, + 256, 32773, 256, 156890, 256, 156963, 256, 32864, 256, 157096, 256, + 32880, 256, 144223, 256, 17365, 256, 32946, 256, 33027, 256, 17419, 256, + 33086, 256, 23221, 256, 157607, 256, 157621, 256, 144275, 256, 144284, + 256, 33281, 256, 33284, 256, 36766, 256, 17515, 256, 33425, 256, 33419, + 256, 33437, 256, 21171, 256, 33457, 256, 33459, 256, 33469, 256, 33510, + 256, 158524, 256, 33509, 256, 33565, 256, 33635, 256, 33709, 256, 33571, + 256, 33725, 256, 33767, 256, 33879, 256, 33619, 256, 33738, 256, 33740, + 256, 33756, 256, 158774, 256, 159083, 256, 158933, 256, 17707, 256, + 34033, 256, 34035, 256, 34070, 256, 160714, 256, 34148, 256, 159532, 256, + 17757, 256, 17761, 256, 159665, 256, 159954, 256, 17771, 256, 34384, 256, + 34396, 256, 34407, 256, 34409, 256, 34473, 256, 34440, 256, 34574, 256, + 34530, 256, 34681, 256, 34600, 256, 34667, 256, 34694, 256, 17879, 256, + 34785, 256, 34817, 256, 17913, 256, 34912, 256, 34915, 256, 161383, 256, + 35031, 256, 35038, 256, 17973, 256, 35066, 256, 13499, 256, 161966, 256, + 162150, 256, 18110, 256, 18119, 256, 35488, 256, 35565, 256, 35722, 256, + 35925, 256, 162984, 256, 36011, 256, 36033, 256, 36123, 256, 36215, 256, + 163631, 256, 133124, 256, 36299, 256, 36284, 256, 36336, 256, 133342, + 256, 36564, 256, 36664, 256, 165330, 256, 165357, 256, 37012, 256, 37105, + 256, 37137, 256, 165678, 256, 37147, 256, 37432, 256, 37591, 256, 37592, + 256, 37500, 256, 37881, 256, 37909, 256, 166906, 256, 38283, 256, 18837, + 256, 38327, 256, 167287, 256, 18918, 256, 38595, 256, 23986, 256, 38691, + 256, 168261, 256, 168474, 256, 19054, 256, 19062, 256, 38880, 256, + 168970, 256, 19122, 256, 169110, 256, 38923, 256, 38923, 256, 38953, 256, + 169398, 256, 39138, 256, 19251, 256, 39209, 256, 39335, 256, 39362, 256, + 39422, 256, 19406, 256, 170800, 256, 39698, 256, 40000, 256, 40189, 256, + 19662, 256, 19693, 256, 40295, 256, 172238, 256, 19704, 256, 172293, 256, + 172558, 256, 172689, 256, 40635, 256, 19798, 256, 40697, 256, 40702, 256, + 40709, 256, 40719, 256, 40726, 256, 40763, 256, 173568, }; /* index tables for the decomposition data */ @@ -4353,8 +4402,7 @@ static const unsigned char decomp_index1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 78, 0, 0, 0, 79, 0, 0, 80, 0, - 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 81, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4368,11 +4416,12 @@ static const unsigned char decomp_index1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 83, 0, 0, 0, 0, 84, 85, - 86, 87, 88, 89, 90, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 92, 93, 0, 0, 0, 0, 94, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 85, 86, + 87, 88, 89, 90, 91, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 93, 94, 0, 0, 0, 0, 95, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4393,7 +4442,7 @@ static const unsigned char decomp_index1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 98, 99, 100, 101, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 100, 101, 102, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4692,7 +4741,7 @@ static const unsigned char decomp_index1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static const unsigned short decomp_index2[] = { @@ -5124,802 +5173,821 @@ static const unsigned short decomp_index2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6659, 6661, 6663, 6665, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 6667, 6669, 6671, 6673, 6675, 6677, 6679, 6681, - 6683, 6685, 6687, 6689, 6691, 6693, 6695, 6697, 6699, 6701, 6703, 6705, - 6707, 6709, 6711, 6713, 6715, 6717, 6719, 6721, 6723, 6725, 6727, 6729, - 6731, 6733, 6735, 6737, 6739, 6741, 6743, 6745, 6747, 6749, 6751, 6753, - 6755, 6757, 6759, 6761, 6763, 6765, 6767, 6769, 6771, 6773, 6775, 6777, - 6779, 6781, 6783, 6785, 6787, 6789, 6791, 6793, 6795, 6797, 6799, 6801, - 6803, 6805, 6807, 6809, 6811, 6813, 6815, 6817, 6819, 6821, 6823, 6825, - 6827, 6829, 6831, 6833, 6835, 6837, 6839, 6841, 6843, 6845, 6847, 6849, - 6851, 6853, 6855, 6857, 6859, 6861, 6863, 6865, 6867, 6869, 6871, 6873, - 6875, 6877, 6879, 6881, 6883, 6885, 6887, 6889, 6891, 6893, 6895, 6897, - 6899, 6901, 6903, 6905, 6907, 6909, 6911, 6913, 6915, 6917, 6919, 6921, - 6923, 6925, 6927, 6929, 6931, 6933, 6935, 6937, 6939, 6941, 6943, 6945, - 6947, 6949, 6951, 6953, 6955, 6957, 6959, 6961, 6963, 6965, 6967, 6969, - 6971, 6973, 6975, 6977, 6979, 6981, 6983, 6985, 6987, 6989, 6991, 6993, - 6995, 6997, 6999, 7001, 7003, 7005, 7007, 7009, 7011, 7013, 7015, 7017, - 7019, 7021, 7023, 7025, 7027, 7029, 7031, 7033, 7035, 7037, 7039, 7041, - 7043, 7045, 7047, 7049, 7051, 7053, 7055, 7057, 7059, 7061, 7063, 7065, - 7067, 7069, 7071, 7073, 7075, 7077, 7079, 7081, 7083, 7085, 7087, 7089, - 7091, 7093, 7095, 7097, 7099, 7101, 7103, 7105, 7107, 7109, 7111, 7113, - 7115, 7117, 7119, 7121, 7123, 7125, 7127, 7129, 7131, 7133, 7135, 7137, - 7139, 7141, 7143, 7145, 7147, 7149, 7151, 7153, 7155, 7157, 7159, 7161, - 7163, 7165, 7167, 7169, 7171, 7173, 7175, 7177, 7179, 7181, 7183, 7185, - 7187, 7189, 7191, 7193, 7195, 7197, 7199, 7201, 7203, 7205, 0, 0, 7207, - 0, 7209, 0, 0, 7211, 7213, 7215, 7217, 7219, 7221, 7223, 7225, 7227, - 7229, 0, 7231, 0, 7233, 0, 0, 7235, 7237, 0, 0, 0, 7239, 7241, 7243, - 7245, 7247, 7249, 7251, 7253, 7255, 7257, 7259, 7261, 7263, 7265, 7267, - 7269, 7271, 7273, 7275, 7277, 7279, 7281, 7283, 7285, 7287, 7289, 7291, - 7293, 7295, 7297, 7299, 7301, 7303, 7305, 7307, 7309, 7311, 7313, 7315, - 7317, 7319, 7321, 7323, 7325, 7327, 7329, 7331, 7333, 7335, 7337, 7339, - 7341, 7343, 7345, 7347, 7349, 7351, 7353, 7355, 7357, 7359, 7361, 7363, - 7365, 7367, 7369, 7371, 7373, 0, 0, 7375, 7377, 7379, 7381, 7383, 7385, - 7387, 7389, 7391, 7393, 7395, 7397, 7399, 7401, 7403, 7405, 7407, 7409, - 7411, 7413, 7415, 7417, 7419, 7421, 7423, 7425, 7427, 7429, 7431, 7433, - 7435, 7437, 7439, 7441, 7443, 7445, 7447, 7449, 7451, 7453, 7455, 7457, - 7459, 7461, 7463, 7465, 7467, 7469, 7471, 7473, 7475, 7477, 7479, 7481, - 7483, 7485, 7487, 7489, 7491, 7493, 7495, 7497, 7499, 7501, 7503, 7505, - 7507, 7509, 7511, 7513, 7515, 7517, 7519, 7521, 7523, 7525, 7527, 7529, - 7531, 7533, 7535, 7537, 7539, 7541, 7543, 7545, 7547, 7549, 7551, 7553, - 7555, 7557, 7559, 7561, 7563, 7565, 7567, 7569, 7571, 7573, 7575, 7577, - 7579, 7581, 7583, 7585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7587, - 7590, 7593, 7596, 7600, 7604, 7607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7610, 7613, 7616, 7619, 7622, 0, 0, 0, 0, 0, 7625, 0, 7628, 7631, 7633, - 7635, 7637, 7639, 7641, 7643, 7645, 7647, 7649, 7651, 7654, 7657, 7660, - 7663, 7666, 7669, 7672, 7675, 7678, 7681, 7684, 7687, 0, 7690, 7693, - 7696, 7699, 7702, 0, 7705, 0, 7708, 7711, 0, 7714, 7717, 0, 7720, 7723, - 7726, 7729, 7732, 7735, 7738, 7741, 7744, 7747, 7750, 7752, 7754, 7756, - 7758, 7760, 7762, 7764, 7766, 7768, 7770, 7772, 7774, 7776, 7778, 7780, - 7782, 7784, 7786, 7788, 7790, 7792, 7794, 7796, 7798, 7800, 7802, 7804, - 7806, 7808, 7810, 7812, 7814, 7816, 7818, 7820, 7822, 7824, 7826, 7828, - 7830, 7832, 7834, 7836, 7838, 7840, 7842, 7844, 7846, 7848, 7850, 7852, - 7854, 7856, 7858, 7860, 7862, 7864, 7866, 7868, 7870, 7872, 7874, 7876, - 7878, 7880, 7882, 7884, 7886, 7888, 7890, 7892, 7894, 7896, 7898, 7900, - 7902, 7904, 7906, 7908, 7910, 7912, 7914, 7916, 7918, 7920, 7922, 7924, - 7926, 7928, 7930, 7932, 7934, 7936, 7938, 7940, 7942, 7944, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 7946, 7948, 7950, 7952, 7954, 7956, 7958, 7960, 7962, - 7964, 7966, 7968, 7970, 7972, 7974, 7976, 7978, 7980, 7982, 7984, 7986, - 7988, 7990, 7992, 7995, 7998, 8001, 8004, 8007, 8010, 8013, 8016, 8019, - 8022, 8025, 8028, 8031, 8034, 8037, 8040, 8043, 8046, 8048, 8050, 8052, - 8054, 8057, 8060, 8063, 8066, 8069, 8072, 8075, 8078, 8081, 8084, 8087, - 8090, 8093, 8096, 8099, 8102, 8105, 8108, 8111, 8114, 8117, 8120, 8123, - 8126, 8129, 8132, 8135, 8138, 8141, 8144, 8147, 8150, 8153, 8156, 8159, - 8162, 8165, 8168, 8171, 8174, 8177, 8180, 8183, 8186, 8189, 8192, 8195, - 8198, 8201, 8204, 8207, 8210, 8213, 8216, 8219, 8222, 8225, 8228, 8231, - 8234, 8237, 8240, 8243, 8246, 8249, 8252, 8255, 8258, 8261, 8264, 8267, - 8270, 8273, 8276, 8279, 8282, 8285, 8288, 8291, 8294, 8297, 8300, 8303, - 8306, 8309, 8312, 8315, 8318, 8321, 8324, 8327, 8330, 8333, 8336, 8340, - 8344, 8348, 8352, 8356, 8360, 8363, 8366, 8369, 8372, 8375, 8378, 8381, - 8384, 8387, 8390, 8393, 8396, 8399, 8402, 8405, 8408, 8411, 8414, 8417, - 8420, 8423, 8426, 8429, 8432, 8435, 8438, 8441, 8444, 8447, 8450, 8453, - 8456, 8459, 8462, 8465, 8468, 8471, 8474, 8477, 8480, 8483, 8486, 8489, - 8492, 8495, 8498, 8501, 8504, 8507, 8510, 8513, 8516, 8519, 8522, 8525, - 8528, 8531, 8534, 8537, 8540, 8543, 8546, 8549, 8552, 8555, 8558, 8561, - 8564, 8567, 8570, 8573, 8576, 8579, 8582, 8585, 8588, 8591, 8594, 8597, - 8600, 8603, 8606, 8609, 8612, 8615, 8618, 8621, 8624, 8627, 8630, 8633, - 8636, 8639, 8642, 8645, 8648, 8651, 8654, 8657, 8660, 8663, 8666, 8669, - 8672, 8675, 8678, 8681, 8684, 8687, 8690, 8693, 8696, 8699, 8702, 8705, - 8708, 8711, 8714, 8717, 8720, 8723, 8726, 8729, 8732, 8735, 8738, 8741, - 8744, 8747, 8750, 8753, 8756, 8759, 8762, 8765, 8768, 8771, 8774, 8777, - 8780, 8783, 8786, 8790, 8794, 8798, 8801, 8804, 8807, 8810, 8813, 8816, - 8819, 8822, 8825, 8828, 8831, 8834, 8837, 8840, 8843, 8846, 8849, 8852, - 8855, 8858, 8861, 8864, 8867, 8870, 8873, 8876, 8879, 8882, 8885, 8888, - 8891, 8894, 8897, 8900, 8903, 8906, 8909, 8912, 8915, 8918, 8921, 8924, - 8927, 8930, 8933, 8936, 8939, 8942, 8945, 8948, 8951, 8954, 8957, 8960, - 8963, 8966, 8969, 8972, 8975, 8978, 8981, 8984, 8987, 8990, 8993, 8996, - 8999, 9002, 9005, 9008, 9011, 9014, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9017, 9021, 9025, 9029, 9033, 9037, 9041, 9045, 9049, - 9053, 9057, 9061, 9065, 9069, 9073, 9077, 9081, 9085, 9089, 9093, 9097, - 9101, 9105, 9109, 9113, 9117, 9121, 9125, 9129, 9133, 9137, 9141, 9145, - 9149, 9153, 9157, 9161, 9165, 9169, 9173, 9177, 9181, 9185, 9189, 9193, - 9197, 9201, 9205, 9209, 9213, 9217, 9221, 9225, 9229, 9233, 9237, 9241, - 9245, 9249, 9253, 9257, 9261, 9265, 9269, 0, 0, 9273, 9277, 9281, 9285, - 9289, 9293, 9297, 9301, 9305, 9309, 9313, 9317, 9321, 9325, 9329, 9333, - 9337, 9341, 9345, 9349, 9353, 9357, 9361, 9365, 9369, 9373, 9377, 9381, - 9385, 9389, 9393, 9397, 9401, 9405, 9409, 9413, 9417, 9421, 9425, 9429, - 9433, 9437, 9441, 9445, 9449, 9453, 9457, 9461, 9465, 9469, 9473, 9477, - 9481, 9485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9489, 9493, - 9497, 9502, 9507, 9512, 9517, 9522, 9527, 9532, 9536, 9555, 9564, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9569, 9571, 9573, - 9575, 9577, 9579, 9581, 9583, 9585, 9587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9589, 9591, 9593, 9595, 9597, 9599, - 9601, 9603, 9605, 9607, 9609, 9611, 9613, 9615, 9617, 9619, 9621, 9623, - 9625, 9627, 9629, 0, 0, 9631, 9633, 9635, 9637, 9639, 9641, 9643, 9645, - 9647, 9649, 9651, 9653, 0, 9655, 9657, 9659, 9661, 9663, 9665, 9667, - 9669, 9671, 9673, 9675, 9677, 9679, 9681, 9683, 9685, 9687, 9689, 9691, - 0, 9693, 9695, 9697, 9699, 0, 0, 0, 0, 9701, 9704, 9707, 0, 9710, 0, - 9713, 9716, 9719, 9722, 9725, 9728, 9731, 9734, 9737, 9740, 9743, 9745, - 9747, 9749, 9751, 9753, 9755, 9757, 9759, 9761, 9763, 9765, 9767, 9769, - 9771, 9773, 9775, 9777, 9779, 9781, 9783, 9785, 9787, 9789, 9791, 9793, - 9795, 9797, 9799, 9801, 9803, 9805, 9807, 9809, 9811, 9813, 9815, 9817, - 9819, 9821, 9823, 9825, 9827, 9829, 9831, 9833, 9835, 9837, 9839, 9841, - 9843, 9845, 9847, 9849, 9851, 9853, 9855, 9857, 9859, 9861, 9863, 9865, - 9867, 9869, 9871, 9873, 9875, 9877, 9879, 9881, 9883, 9885, 9887, 9889, - 9891, 9893, 9895, 9897, 9899, 9901, 9903, 9905, 9907, 9909, 9911, 9913, - 9915, 9917, 9919, 9921, 9923, 9925, 9927, 9929, 9931, 9933, 9935, 9937, - 9939, 9941, 9943, 9945, 9947, 9949, 9951, 9953, 9955, 9957, 9959, 9961, - 9963, 9965, 9967, 9969, 9971, 9973, 9975, 9977, 9980, 9983, 9986, 9989, - 9992, 9995, 9998, 0, 0, 0, 0, 10001, 10003, 10005, 10007, 10009, 10011, - 10013, 10015, 10017, 10019, 10021, 10023, 10025, 10027, 10029, 10031, - 10033, 10035, 10037, 10039, 10041, 10043, 10045, 10047, 10049, 10051, - 10053, 10055, 10057, 10059, 10061, 10063, 10065, 10067, 10069, 10071, - 10073, 10075, 10077, 10079, 10081, 10083, 10085, 10087, 10089, 10091, - 10093, 10095, 10097, 10099, 10101, 10103, 10105, 10107, 10109, 10111, - 10113, 10115, 10117, 10119, 10121, 10123, 10125, 10127, 10129, 10131, - 10133, 10135, 10137, 10139, 10141, 10143, 10145, 10147, 10149, 10151, - 10153, 10155, 10157, 10159, 10161, 10163, 10165, 10167, 10169, 10171, - 10173, 10175, 10177, 10179, 10181, 10183, 10185, 10187, 10189, 10191, - 10193, 10195, 10197, 10199, 10201, 10203, 10205, 10207, 10209, 10211, - 10213, 10215, 10217, 10219, 10221, 10223, 10225, 10227, 10229, 10231, - 10233, 10235, 10237, 10239, 10241, 10243, 10245, 10247, 10249, 10251, - 10253, 10255, 10257, 10259, 10261, 10263, 10265, 10267, 10269, 10271, - 10273, 10275, 10277, 10279, 10281, 10283, 10285, 10287, 10289, 10291, - 10293, 10295, 10297, 10299, 10301, 10303, 10305, 10307, 10309, 10311, - 10313, 10315, 10317, 10319, 10321, 10323, 10325, 10327, 10329, 10331, - 10333, 10335, 10337, 10339, 10341, 10343, 10345, 10347, 10349, 10351, - 10353, 10355, 10357, 10359, 10361, 10363, 10365, 10367, 10369, 10371, - 10373, 10375, 10377, 10379, 0, 0, 0, 10381, 10383, 10385, 10387, 10389, - 10391, 0, 0, 10393, 10395, 10397, 10399, 10401, 10403, 0, 0, 10405, - 10407, 10409, 10411, 10413, 10415, 0, 0, 10417, 10419, 10421, 0, 0, 0, - 10423, 10425, 10427, 10429, 10431, 10433, 10435, 0, 10437, 10439, 10441, - 10443, 10445, 10447, 10449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 10451, 0, 10454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 10457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10460, 10463, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 10466, 10469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10472, - 10475, 0, 10478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 10481, 10484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 10487, 10490, 10493, 10496, 10499, 10502, 10505, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10508, 10511, 10514, 10517, 10520, - 10523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10526, 10528, 10530, - 10532, 10534, 10536, 10538, 10540, 10542, 10544, 10546, 10548, 10550, - 10552, 10554, 10556, 10558, 10560, 10562, 10564, 10566, 10568, 10570, - 10572, 10574, 10576, 10578, 10580, 10582, 10584, 10586, 10588, 10590, - 10592, 10594, 10596, 10598, 10600, 10602, 10604, 10606, 10608, 10610, - 10612, 10614, 10616, 10618, 10620, 10622, 10624, 10626, 10628, 10630, - 10632, 10634, 10636, 10638, 10640, 10642, 10644, 10646, 10648, 10650, - 10652, 10654, 10656, 10658, 10660, 10662, 10664, 10666, 10668, 10670, - 10672, 10674, 10676, 10678, 10680, 10682, 10684, 10686, 10688, 10690, - 10692, 10694, 0, 10696, 10698, 10700, 10702, 10704, 10706, 10708, 10710, - 10712, 10714, 10716, 10718, 10720, 10722, 10724, 10726, 10728, 10730, - 10732, 10734, 10736, 10738, 10740, 10742, 10744, 10746, 10748, 10750, - 10752, 10754, 10756, 10758, 10760, 10762, 10764, 10766, 10768, 10770, - 10772, 10774, 10776, 10778, 10780, 10782, 10784, 10786, 10788, 10790, - 10792, 10794, 10796, 10798, 10800, 10802, 10804, 10806, 10808, 10810, - 10812, 10814, 10816, 10818, 10820, 10822, 10824, 10826, 10828, 10830, - 10832, 10834, 10836, 0, 10838, 10840, 0, 0, 10842, 0, 0, 10844, 10846, 0, - 0, 10848, 10850, 10852, 10854, 0, 10856, 10858, 10860, 10862, 10864, - 10866, 10868, 10870, 10872, 10874, 10876, 10878, 0, 10880, 0, 10882, - 10884, 10886, 10888, 10890, 10892, 10894, 0, 10896, 10898, 10900, 10902, - 10904, 10906, 10908, 10910, 10912, 10914, 10916, 10918, 10920, 10922, - 10924, 10926, 10928, 10930, 10932, 10934, 10936, 10938, 10940, 10942, - 10944, 10946, 10948, 10950, 10952, 10954, 10956, 10958, 10960, 10962, - 10964, 10966, 10968, 10970, 10972, 10974, 10976, 10978, 10980, 10982, - 10984, 10986, 10988, 10990, 10992, 10994, 10996, 10998, 11000, 11002, - 11004, 11006, 11008, 11010, 11012, 11014, 11016, 11018, 11020, 11022, - 11024, 0, 11026, 11028, 11030, 11032, 0, 0, 11034, 11036, 11038, 11040, - 11042, 11044, 11046, 11048, 0, 11050, 11052, 11054, 11056, 11058, 11060, - 11062, 0, 11064, 11066, 11068, 11070, 11072, 11074, 11076, 11078, 11080, - 11082, 11084, 11086, 11088, 11090, 11092, 11094, 11096, 11098, 11100, - 11102, 11104, 11106, 11108, 11110, 11112, 11114, 11116, 11118, 0, 11120, - 11122, 11124, 11126, 0, 11128, 11130, 11132, 11134, 11136, 0, 11138, 0, - 0, 0, 11140, 11142, 11144, 11146, 11148, 11150, 11152, 0, 11154, 11156, - 11158, 11160, 11162, 11164, 11166, 11168, 11170, 11172, 11174, 11176, - 11178, 11180, 11182, 11184, 11186, 11188, 11190, 11192, 11194, 11196, - 11198, 11200, 11202, 11204, 11206, 11208, 11210, 11212, 11214, 11216, - 11218, 11220, 11222, 11224, 11226, 11228, 11230, 11232, 11234, 11236, - 11238, 11240, 11242, 11244, 11246, 11248, 11250, 11252, 11254, 11256, - 11258, 11260, 11262, 11264, 11266, 11268, 11270, 11272, 11274, 11276, - 11278, 11280, 11282, 11284, 11286, 11288, 11290, 11292, 11294, 11296, - 11298, 11300, 11302, 11304, 11306, 11308, 11310, 11312, 11314, 11316, - 11318, 11320, 11322, 11324, 11326, 11328, 11330, 11332, 11334, 11336, - 11338, 11340, 11342, 11344, 11346, 11348, 11350, 11352, 11354, 11356, - 11358, 11360, 11362, 11364, 11366, 11368, 11370, 11372, 11374, 11376, - 11378, 11380, 11382, 11384, 11386, 11388, 11390, 11392, 11394, 11396, - 11398, 11400, 11402, 11404, 11406, 11408, 11410, 11412, 11414, 11416, - 11418, 11420, 11422, 11424, 11426, 11428, 11430, 11432, 11434, 11436, - 11438, 11440, 11442, 11444, 11446, 11448, 11450, 11452, 11454, 11456, - 11458, 11460, 11462, 11464, 11466, 11468, 11470, 11472, 11474, 11476, - 11478, 11480, 11482, 11484, 11486, 11488, 11490, 11492, 11494, 11496, - 11498, 11500, 11502, 11504, 11506, 11508, 11510, 11512, 11514, 11516, - 11518, 11520, 11522, 11524, 11526, 11528, 11530, 11532, 11534, 11536, - 11538, 11540, 11542, 11544, 11546, 11548, 11550, 11552, 11554, 11556, - 11558, 11560, 11562, 11564, 11566, 11568, 11570, 11572, 11574, 11576, - 11578, 11580, 11582, 11584, 11586, 11588, 11590, 11592, 11594, 11596, - 11598, 11600, 11602, 11604, 11606, 11608, 11610, 11612, 11614, 11616, - 11618, 11620, 11622, 11624, 11626, 11628, 11630, 11632, 11634, 11636, - 11638, 11640, 11642, 11644, 11646, 11648, 11650, 11652, 11654, 11656, - 11658, 11660, 11662, 11664, 11666, 11668, 11670, 11672, 11674, 11676, - 11678, 11680, 11682, 11684, 11686, 11688, 11690, 11692, 11694, 11696, - 11698, 11700, 11702, 11704, 11706, 11708, 11710, 11712, 11714, 11716, - 11718, 11720, 11722, 11724, 11726, 11728, 11730, 11732, 11734, 11736, - 11738, 11740, 11742, 11744, 11746, 11748, 11750, 11752, 11754, 11756, - 11758, 11760, 11762, 11764, 11766, 11768, 11770, 11772, 11774, 11776, - 11778, 11780, 11782, 11784, 11786, 11788, 11790, 11792, 11794, 11796, - 11798, 11800, 11802, 11804, 11806, 11808, 11810, 11812, 11814, 11816, - 11818, 11820, 11822, 11824, 11826, 11828, 11830, 11832, 0, 0, 11834, - 11836, 11838, 11840, 11842, 11844, 11846, 11848, 11850, 11852, 11854, - 11856, 11858, 11860, 11862, 11864, 11866, 11868, 11870, 11872, 11874, - 11876, 11878, 11880, 11882, 11884, 11886, 11888, 11890, 11892, 11894, - 11896, 11898, 11900, 11902, 11904, 11906, 11908, 11910, 11912, 11914, - 11916, 11918, 11920, 11922, 11924, 11926, 11928, 11930, 11932, 11934, - 11936, 11938, 11940, 11942, 11944, 11946, 11948, 11950, 11952, 11954, - 11956, 11958, 11960, 11962, 11964, 11966, 11968, 11970, 11972, 11974, - 11976, 11978, 11980, 11982, 11984, 11986, 11988, 11990, 11992, 11994, - 11996, 11998, 12000, 12002, 12004, 12006, 12008, 12010, 12012, 12014, - 12016, 12018, 12020, 12022, 12024, 12026, 12028, 12030, 12032, 12034, - 12036, 12038, 12040, 12042, 12044, 12046, 12048, 12050, 12052, 12054, - 12056, 12058, 12060, 12062, 12064, 12066, 12068, 12070, 12072, 12074, - 12076, 12078, 12080, 12082, 12084, 12086, 12088, 12090, 12092, 12094, - 12096, 12098, 12100, 12102, 12104, 12106, 12108, 12110, 12112, 12114, - 12116, 12118, 12120, 12122, 12124, 12126, 12128, 12130, 12132, 12134, - 12136, 12138, 12140, 12142, 12144, 12146, 12148, 12150, 12152, 12154, - 12156, 12158, 12160, 12162, 12164, 12166, 12168, 12170, 12172, 12174, - 12176, 12178, 12180, 12182, 12184, 12186, 12188, 12190, 12192, 12194, - 12196, 12198, 12200, 12202, 12204, 12206, 12208, 12210, 12212, 12214, - 12216, 12218, 12220, 12222, 12224, 12226, 12228, 12230, 12232, 12234, - 12236, 12238, 12240, 12242, 12244, 12246, 12248, 12250, 12252, 12254, - 12256, 12258, 12260, 12262, 12264, 12266, 12268, 12270, 12272, 12274, - 12276, 12278, 12280, 12282, 12284, 12286, 12288, 12290, 12292, 12294, - 12296, 12298, 12300, 12302, 12304, 12306, 12308, 12310, 12312, 12314, - 12316, 12318, 12320, 12322, 12324, 12326, 12328, 12330, 12332, 12334, - 12336, 12338, 12340, 12342, 12344, 12346, 12348, 12350, 12352, 12354, - 12356, 12358, 12360, 12362, 12364, 12366, 12368, 12370, 12372, 12374, - 12376, 12378, 12380, 12382, 12384, 12386, 12388, 12390, 12392, 12394, - 12396, 12398, 12400, 12402, 12404, 12406, 12408, 12410, 12412, 12414, - 12416, 0, 0, 12418, 12420, 12422, 12424, 12426, 12428, 12430, 12432, - 12434, 12436, 12438, 12440, 12442, 12444, 12446, 12448, 12450, 12452, - 12454, 12456, 12458, 12460, 12462, 12464, 12466, 12468, 12470, 12472, - 12474, 12476, 12478, 12480, 12482, 12484, 12486, 12488, 12490, 12492, - 12494, 12496, 12498, 12500, 12502, 12504, 12506, 12508, 12510, 12512, - 12514, 12516, 12518, 12520, 12522, 12524, 0, 12526, 12528, 12530, 12532, - 12534, 12536, 12538, 12540, 12542, 12544, 12546, 12548, 12550, 12552, - 12554, 12556, 12558, 12560, 12562, 12564, 12566, 12568, 12570, 12572, - 12574, 12576, 12578, 0, 12580, 12582, 0, 12584, 0, 0, 12586, 0, 12588, - 12590, 12592, 12594, 12596, 12598, 12600, 12602, 12604, 12606, 0, 12608, - 12610, 12612, 12614, 0, 12616, 0, 12618, 0, 0, 0, 0, 0, 0, 12620, 0, 0, - 0, 0, 12622, 0, 12624, 0, 12626, 0, 12628, 12630, 12632, 0, 12634, 12636, - 0, 12638, 0, 0, 12640, 0, 12642, 0, 12644, 0, 12646, 0, 12648, 0, 12650, - 12652, 0, 12654, 0, 0, 12656, 12658, 12660, 12662, 0, 12664, 12666, - 12668, 12670, 12672, 12674, 12676, 0, 12678, 12680, 12682, 12684, 0, - 12686, 12688, 12690, 12692, 0, 12694, 0, 12696, 12698, 12700, 12702, - 12704, 12706, 12708, 12710, 12712, 12714, 0, 12716, 12718, 12720, 12722, - 12724, 12726, 12728, 12730, 12732, 12734, 12736, 12738, 12740, 12742, - 12744, 12746, 12748, 0, 0, 0, 0, 0, 12750, 12752, 12754, 0, 12756, 12758, - 12760, 12762, 12764, 0, 12766, 12768, 12770, 12772, 12774, 12776, 12778, - 12780, 12782, 12784, 12786, 12788, 12790, 12792, 12794, 12796, 12798, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12800, 12803, - 12806, 12809, 12812, 12815, 12818, 12821, 12824, 12827, 12830, 0, 0, 0, - 0, 0, 12833, 12837, 12841, 12845, 12849, 12853, 12857, 12861, 12865, - 12869, 12873, 12877, 12881, 12885, 12889, 12893, 12897, 12901, 12905, - 12909, 12913, 12917, 12921, 12925, 12929, 12933, 12937, 12941, 12943, - 12945, 12948, 0, 12951, 12953, 12955, 12957, 12959, 12961, 12963, 12965, - 12967, 12969, 12971, 12973, 12975, 12977, 12979, 12981, 12983, 12985, - 12987, 12989, 12991, 12993, 12995, 12997, 12999, 13001, 13003, 13006, - 13009, 13012, 13015, 13019, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13022, 13025, 13028, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 13031, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13034, - 13037, 13040, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13042, 13044, 13046, - 13048, 13050, 13052, 13054, 13056, 13058, 13060, 13062, 13064, 13066, - 13068, 13070, 13072, 13074, 13076, 13078, 13080, 13082, 13084, 13086, - 13088, 13090, 13092, 13094, 13096, 13098, 13100, 13102, 13104, 13106, - 13108, 13110, 13112, 13114, 13116, 13118, 13120, 13122, 13124, 13126, - 13128, 0, 0, 0, 0, 13130, 13134, 13138, 13142, 13146, 13150, 13154, - 13158, 13162, 0, 0, 0, 0, 0, 0, 0, 13166, 13168, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13170, 13172, 13174, 13176, - 13178, 13180, 13182, 13184, 13186, 13188, 13190, 13192, 13194, 13196, - 13198, 13200, 13202, 13204, 13206, 13208, 13210, 13212, 13214, 13216, - 13218, 13220, 13222, 13224, 13226, 13228, 13230, 13232, 13234, 13236, - 13238, 13240, 13242, 13244, 13246, 13248, 13250, 13252, 13254, 13256, - 13258, 13260, 13262, 13264, 13266, 13268, 13270, 13272, 13274, 13276, - 13278, 13280, 13282, 13284, 13286, 13288, 13290, 13292, 13294, 13296, - 13298, 13300, 13302, 13304, 13306, 13308, 13310, 13312, 13314, 13316, - 13318, 13320, 13322, 13324, 13326, 13328, 13330, 13332, 13334, 13336, - 13338, 13340, 13342, 13344, 13346, 13348, 13350, 13352, 13354, 13356, - 13358, 13360, 13362, 13364, 13366, 13368, 13370, 13372, 13374, 13376, - 13378, 13380, 13382, 13384, 13386, 13388, 13390, 13392, 13394, 13396, - 13398, 13400, 13402, 13404, 13406, 13408, 13410, 13412, 13414, 13416, - 13418, 13420, 13422, 13424, 13426, 13428, 13430, 13432, 13434, 13436, - 13438, 13440, 13442, 13444, 13446, 13448, 13450, 13452, 13454, 13456, - 13458, 13460, 13462, 13464, 13466, 13468, 13470, 13472, 13474, 13476, - 13478, 13480, 13482, 13484, 13486, 13488, 13490, 13492, 13494, 13496, - 13498, 13500, 13502, 13504, 13506, 13508, 13510, 13512, 13514, 13516, - 13518, 13520, 13522, 13524, 13526, 13528, 13530, 13532, 13534, 13536, - 13538, 13540, 13542, 13544, 13546, 13548, 13550, 13552, 13554, 13556, - 13558, 13560, 13562, 13564, 13566, 13568, 13570, 13572, 13574, 13576, - 13578, 13580, 13582, 13584, 13586, 13588, 13590, 13592, 13594, 13596, - 13598, 13600, 13602, 13604, 13606, 13608, 13610, 13612, 13614, 13616, - 13618, 13620, 13622, 13624, 13626, 13628, 13630, 13632, 13634, 13636, - 13638, 13640, 13642, 13644, 13646, 13648, 13650, 13652, 13654, 13656, - 13658, 13660, 13662, 13664, 13666, 13668, 13670, 13672, 13674, 13676, - 13678, 13680, 13682, 13684, 13686, 13688, 13690, 13692, 13694, 13696, - 13698, 13700, 13702, 13704, 13706, 13708, 13710, 13712, 13714, 13716, - 13718, 13720, 13722, 13724, 13726, 13728, 13730, 13732, 13734, 13736, - 13738, 13740, 13742, 13744, 13746, 13748, 13750, 13752, 13754, 13756, - 13758, 13760, 13762, 13764, 13766, 13768, 13770, 13772, 13774, 13776, - 13778, 13780, 13782, 13784, 13786, 13788, 13790, 13792, 13794, 13796, - 13798, 13800, 13802, 13804, 13806, 13808, 13810, 13812, 13814, 13816, - 13818, 13820, 13822, 13824, 13826, 13828, 13830, 13832, 13834, 13836, - 13838, 13840, 13842, 13844, 13846, 13848, 13850, 13852, 13854, 13856, - 13858, 13860, 13862, 13864, 13866, 13868, 13870, 13872, 13874, 13876, - 13878, 13880, 13882, 13884, 13886, 13888, 13890, 13892, 13894, 13896, - 13898, 13900, 13902, 13904, 13906, 13908, 13910, 13912, 13914, 13916, - 13918, 13920, 13922, 13924, 13926, 13928, 13930, 13932, 13934, 13936, - 13938, 13940, 13942, 13944, 13946, 13948, 13950, 13952, 13954, 13956, - 13958, 13960, 13962, 13964, 13966, 13968, 13970, 13972, 13974, 13976, - 13978, 13980, 13982, 13984, 13986, 13988, 13990, 13992, 13994, 13996, - 13998, 14000, 14002, 14004, 14006, 14008, 14010, 14012, 14014, 14016, - 14018, 14020, 14022, 14024, 14026, 14028, 14030, 14032, 14034, 14036, - 14038, 14040, 14042, 14044, 14046, 14048, 14050, 14052, 14054, 14056, - 14058, 14060, 14062, 14064, 14066, 14068, 14070, 14072, 14074, 14076, - 14078, 14080, 14082, 14084, 14086, 14088, 14090, 14092, 14094, 14096, - 14098, 14100, 14102, 14104, 14106, 14108, 14110, 14112, 14114, 14116, - 14118, 14120, 14122, 14124, 14126, 14128, 14130, 14132, 14134, 14136, - 14138, 14140, 14142, 14144, 14146, 14148, 14150, 14152, 14154, 14156, - 14158, 14160, 14162, 14164, 14166, 14168, 14170, 14172, 14174, 14176, - 14178, 14180, 14182, 14184, 14186, 14188, 14190, 14192, 14194, 14196, - 14198, 14200, 14202, 14204, 14206, 14208, 14210, 14212, 14214, 14216, - 14218, 14220, 14222, 14224, 14226, 14228, 14230, 14232, 14234, 14236, - 14238, 14240, 14242, 14244, 14246, 14248, 14250, 14252, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6669, 6671, 6673, 6675, 6677, 6679, 6681, 6683, + 6685, 6687, 6689, 6691, 6693, 6695, 6697, 6699, 6701, 6703, 6705, 6707, + 6709, 6711, 6713, 6715, 6717, 6719, 6721, 6723, 6725, 6727, 6729, 6731, + 6733, 6735, 6737, 6739, 6741, 6743, 6745, 6747, 6749, 6751, 6753, 6755, + 6757, 6759, 6761, 6763, 6765, 6767, 6769, 6771, 6773, 6775, 6777, 6779, + 6781, 6783, 6785, 6787, 6789, 6791, 6793, 6795, 6797, 6799, 6801, 6803, + 6805, 6807, 6809, 6811, 6813, 6815, 6817, 6819, 6821, 6823, 6825, 6827, + 6829, 6831, 6833, 6835, 6837, 6839, 6841, 6843, 6845, 6847, 6849, 6851, + 6853, 6855, 6857, 6859, 6861, 6863, 6865, 6867, 6869, 6871, 6873, 6875, + 6877, 6879, 6881, 6883, 6885, 6887, 6889, 6891, 6893, 6895, 6897, 6899, + 6901, 6903, 6905, 6907, 6909, 6911, 6913, 6915, 6917, 6919, 6921, 6923, + 6925, 6927, 6929, 6931, 6933, 6935, 6937, 6939, 6941, 6943, 6945, 6947, + 6949, 6951, 6953, 6955, 6957, 6959, 6961, 6963, 6965, 6967, 6969, 6971, + 6973, 6975, 6977, 6979, 6981, 6983, 6985, 6987, 6989, 6991, 6993, 6995, + 6997, 6999, 7001, 7003, 7005, 7007, 7009, 7011, 7013, 7015, 7017, 7019, + 7021, 7023, 7025, 7027, 7029, 7031, 7033, 7035, 7037, 7039, 7041, 7043, + 7045, 7047, 7049, 7051, 7053, 7055, 7057, 7059, 7061, 7063, 7065, 7067, + 7069, 7071, 7073, 7075, 7077, 7079, 7081, 7083, 7085, 7087, 7089, 7091, + 7093, 7095, 7097, 7099, 7101, 7103, 7105, 7107, 7109, 7111, 7113, 7115, + 7117, 7119, 7121, 7123, 7125, 7127, 7129, 7131, 7133, 7135, 7137, 7139, + 7141, 7143, 7145, 7147, 7149, 7151, 7153, 7155, 7157, 7159, 7161, 7163, + 7165, 7167, 7169, 7171, 7173, 7175, 7177, 7179, 7181, 7183, 7185, 7187, + 7189, 7191, 7193, 7195, 7197, 7199, 7201, 7203, 7205, 7207, 0, 0, 7209, + 0, 7211, 0, 0, 7213, 7215, 7217, 7219, 7221, 7223, 7225, 7227, 7229, + 7231, 0, 7233, 0, 7235, 0, 0, 7237, 7239, 0, 0, 0, 7241, 7243, 7245, + 7247, 7249, 7251, 7253, 7255, 7257, 7259, 7261, 7263, 7265, 7267, 7269, + 7271, 7273, 7275, 7277, 7279, 7281, 7283, 7285, 7287, 7289, 7291, 7293, + 7295, 7297, 7299, 7301, 7303, 7305, 7307, 7309, 7311, 7313, 7315, 7317, + 7319, 7321, 7323, 7325, 7327, 7329, 7331, 7333, 7335, 7337, 7339, 7341, + 7343, 7345, 7347, 7349, 7351, 7353, 7355, 7357, 7359, 7361, 7363, 7365, + 7367, 7369, 7371, 7373, 7375, 0, 0, 7377, 7379, 7381, 7383, 7385, 7387, + 7389, 7391, 7393, 7395, 7397, 7399, 7401, 7403, 7405, 7407, 7409, 7411, + 7413, 7415, 7417, 7419, 7421, 7423, 7425, 7427, 7429, 7431, 7433, 7435, + 7437, 7439, 7441, 7443, 7445, 7447, 7449, 7451, 7453, 7455, 7457, 7459, + 7461, 7463, 7465, 7467, 7469, 7471, 7473, 7475, 7477, 7479, 7481, 7483, + 7485, 7487, 7489, 7491, 7493, 7495, 7497, 7499, 7501, 7503, 7505, 7507, + 7509, 7511, 7513, 7515, 7517, 7519, 7521, 7523, 7525, 7527, 7529, 7531, + 7533, 7535, 7537, 7539, 7541, 7543, 7545, 7547, 7549, 7551, 7553, 7555, + 7557, 7559, 7561, 7563, 7565, 7567, 7569, 7571, 7573, 7575, 7577, 7579, + 7581, 7583, 7585, 7587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7589, + 7592, 7595, 7598, 7602, 7606, 7609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7612, 7615, 7618, 7621, 7624, 0, 0, 0, 0, 0, 7627, 0, 7630, 7633, 7635, + 7637, 7639, 7641, 7643, 7645, 7647, 7649, 7651, 7653, 7656, 7659, 7662, + 7665, 7668, 7671, 7674, 7677, 7680, 7683, 7686, 7689, 0, 7692, 7695, + 7698, 7701, 7704, 0, 7707, 0, 7710, 7713, 0, 7716, 7719, 0, 7722, 7725, + 7728, 7731, 7734, 7737, 7740, 7743, 7746, 7749, 7752, 7754, 7756, 7758, + 7760, 7762, 7764, 7766, 7768, 7770, 7772, 7774, 7776, 7778, 7780, 7782, + 7784, 7786, 7788, 7790, 7792, 7794, 7796, 7798, 7800, 7802, 7804, 7806, + 7808, 7810, 7812, 7814, 7816, 7818, 7820, 7822, 7824, 7826, 7828, 7830, + 7832, 7834, 7836, 7838, 7840, 7842, 7844, 7846, 7848, 7850, 7852, 7854, + 7856, 7858, 7860, 7862, 7864, 7866, 7868, 7870, 7872, 7874, 7876, 7878, + 7880, 7882, 7884, 7886, 7888, 7890, 7892, 7894, 7896, 7898, 7900, 7902, + 7904, 7906, 7908, 7910, 7912, 7914, 7916, 7918, 7920, 7922, 7924, 7926, + 7928, 7930, 7932, 7934, 7936, 7938, 7940, 7942, 7944, 7946, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7948, 7950, 7952, 7954, 7956, 7958, 7960, 7962, 7964, + 7966, 7968, 7970, 7972, 7974, 7976, 7978, 7980, 7982, 7984, 7986, 7988, + 7990, 7992, 7994, 7997, 8000, 8003, 8006, 8009, 8012, 8015, 8018, 8021, + 8024, 8027, 8030, 8033, 8036, 8039, 8042, 8045, 8048, 8050, 8052, 8054, + 8056, 8059, 8062, 8065, 8068, 8071, 8074, 8077, 8080, 8083, 8086, 8089, + 8092, 8095, 8098, 8101, 8104, 8107, 8110, 8113, 8116, 8119, 8122, 8125, + 8128, 8131, 8134, 8137, 8140, 8143, 8146, 8149, 8152, 8155, 8158, 8161, + 8164, 8167, 8170, 8173, 8176, 8179, 8182, 8185, 8188, 8191, 8194, 8197, + 8200, 8203, 8206, 8209, 8212, 8215, 8218, 8221, 8224, 8227, 8230, 8233, + 8236, 8239, 8242, 8245, 8248, 8251, 8254, 8257, 8260, 8263, 8266, 8269, + 8272, 8275, 8278, 8281, 8284, 8287, 8290, 8293, 8296, 8299, 8302, 8305, + 8308, 8311, 8314, 8317, 8320, 8323, 8326, 8329, 8332, 8335, 8338, 8342, + 8346, 8350, 8354, 8358, 8362, 8365, 8368, 8371, 8374, 8377, 8380, 8383, + 8386, 8389, 8392, 8395, 8398, 8401, 8404, 8407, 8410, 8413, 8416, 8419, + 8422, 8425, 8428, 8431, 8434, 8437, 8440, 8443, 8446, 8449, 8452, 8455, + 8458, 8461, 8464, 8467, 8470, 8473, 8476, 8479, 8482, 8485, 8488, 8491, + 8494, 8497, 8500, 8503, 8506, 8509, 8512, 8515, 8518, 8521, 8524, 8527, + 8530, 8533, 8536, 8539, 8542, 8545, 8548, 8551, 8554, 8557, 8560, 8563, + 8566, 8569, 8572, 8575, 8578, 8581, 8584, 8587, 8590, 8593, 8596, 8599, + 8602, 8605, 8608, 8611, 8614, 8617, 8620, 8623, 8626, 8629, 8632, 8635, + 8638, 8641, 8644, 8647, 8650, 8653, 8656, 8659, 8662, 8665, 8668, 8671, + 8674, 8677, 8680, 8683, 8686, 8689, 8692, 8695, 8698, 8701, 8704, 8707, + 8710, 8713, 8716, 8719, 8722, 8725, 8728, 8731, 8734, 8737, 8740, 8743, + 8746, 8749, 8752, 8755, 8758, 8761, 8764, 8767, 8770, 8773, 8776, 8779, + 8782, 8785, 8788, 8792, 8796, 8800, 8803, 8806, 8809, 8812, 8815, 8818, + 8821, 8824, 8827, 8830, 8833, 8836, 8839, 8842, 8845, 8848, 8851, 8854, + 8857, 8860, 8863, 8866, 8869, 8872, 8875, 8878, 8881, 8884, 8887, 8890, + 8893, 8896, 8899, 8902, 8905, 8908, 8911, 8914, 8917, 8920, 8923, 8926, + 8929, 8932, 8935, 8938, 8941, 8944, 8947, 8950, 8953, 8956, 8959, 8962, + 8965, 8968, 8971, 8974, 8977, 8980, 8983, 8986, 8989, 8992, 8995, 8998, + 9001, 9004, 9007, 9010, 9013, 9016, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9019, 9023, 9027, 9031, 9035, 9039, 9043, 9047, 9051, + 9055, 9059, 9063, 9067, 9071, 9075, 9079, 9083, 9087, 9091, 9095, 9099, + 9103, 9107, 9111, 9115, 9119, 9123, 9127, 9131, 9135, 9139, 9143, 9147, + 9151, 9155, 9159, 9163, 9167, 9171, 9175, 9179, 9183, 9187, 9191, 9195, + 9199, 9203, 9207, 9211, 9215, 9219, 9223, 9227, 9231, 9235, 9239, 9243, + 9247, 9251, 9255, 9259, 9263, 9267, 9271, 0, 0, 9275, 9279, 9283, 9287, + 9291, 9295, 9299, 9303, 9307, 9311, 9315, 9319, 9323, 9327, 9331, 9335, + 9339, 9343, 9347, 9351, 9355, 9359, 9363, 9367, 9371, 9375, 9379, 9383, + 9387, 9391, 9395, 9399, 9403, 9407, 9411, 9415, 9419, 9423, 9427, 9431, + 9435, 9439, 9443, 9447, 9451, 9455, 9459, 9463, 9467, 9471, 9475, 9479, + 9483, 9487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9491, 9495, + 9499, 9504, 9509, 9514, 9519, 9524, 9529, 9534, 9538, 9557, 9566, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9571, 9573, 9575, + 9577, 9579, 9581, 9583, 9585, 9587, 9589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9591, 9593, 9595, 9597, 9599, 9601, + 9603, 9605, 9607, 9609, 9611, 9613, 9615, 9617, 9619, 9621, 9623, 9625, + 9627, 9629, 9631, 0, 0, 9633, 9635, 9637, 9639, 9641, 9643, 9645, 9647, + 9649, 9651, 9653, 9655, 0, 9657, 9659, 9661, 9663, 9665, 9667, 9669, + 9671, 9673, 9675, 9677, 9679, 9681, 9683, 9685, 9687, 9689, 9691, 9693, + 0, 9695, 9697, 9699, 9701, 0, 0, 0, 0, 9703, 9706, 9709, 0, 9712, 0, + 9715, 9718, 9721, 9724, 9727, 9730, 9733, 9736, 9739, 9742, 9745, 9747, + 9749, 9751, 9753, 9755, 9757, 9759, 9761, 9763, 9765, 9767, 9769, 9771, + 9773, 9775, 9777, 9779, 9781, 9783, 9785, 9787, 9789, 9791, 9793, 9795, + 9797, 9799, 9801, 9803, 9805, 9807, 9809, 9811, 9813, 9815, 9817, 9819, + 9821, 9823, 9825, 9827, 9829, 9831, 9833, 9835, 9837, 9839, 9841, 9843, + 9845, 9847, 9849, 9851, 9853, 9855, 9857, 9859, 9861, 9863, 9865, 9867, + 9869, 9871, 9873, 9875, 9877, 9879, 9881, 9883, 9885, 9887, 9889, 9891, + 9893, 9895, 9897, 9899, 9901, 9903, 9905, 9907, 9909, 9911, 9913, 9915, + 9917, 9919, 9921, 9923, 9925, 9927, 9929, 9931, 9933, 9935, 9937, 9939, + 9941, 9943, 9945, 9947, 9949, 9951, 9953, 9955, 9957, 9959, 9961, 9963, + 9965, 9967, 9969, 9971, 9973, 9975, 9977, 9979, 9982, 9985, 9988, 9991, + 9994, 9997, 10000, 0, 0, 0, 0, 10003, 10005, 10007, 10009, 10011, 10013, + 10015, 10017, 10019, 10021, 10023, 10025, 10027, 10029, 10031, 10033, + 10035, 10037, 10039, 10041, 10043, 10045, 10047, 10049, 10051, 10053, + 10055, 10057, 10059, 10061, 10063, 10065, 10067, 10069, 10071, 10073, + 10075, 10077, 10079, 10081, 10083, 10085, 10087, 10089, 10091, 10093, + 10095, 10097, 10099, 10101, 10103, 10105, 10107, 10109, 10111, 10113, + 10115, 10117, 10119, 10121, 10123, 10125, 10127, 10129, 10131, 10133, + 10135, 10137, 10139, 10141, 10143, 10145, 10147, 10149, 10151, 10153, + 10155, 10157, 10159, 10161, 10163, 10165, 10167, 10169, 10171, 10173, + 10175, 10177, 10179, 10181, 10183, 10185, 10187, 10189, 10191, 10193, + 10195, 10197, 10199, 10201, 10203, 10205, 10207, 10209, 10211, 10213, + 10215, 10217, 10219, 10221, 10223, 10225, 10227, 10229, 10231, 10233, + 10235, 10237, 10239, 10241, 10243, 10245, 10247, 10249, 10251, 10253, + 10255, 10257, 10259, 10261, 10263, 10265, 10267, 10269, 10271, 10273, + 10275, 10277, 10279, 10281, 10283, 10285, 10287, 10289, 10291, 10293, + 10295, 10297, 10299, 10301, 10303, 10305, 10307, 10309, 10311, 10313, + 10315, 10317, 10319, 10321, 10323, 10325, 10327, 10329, 10331, 10333, + 10335, 10337, 10339, 10341, 10343, 10345, 10347, 10349, 10351, 10353, + 10355, 10357, 10359, 10361, 10363, 10365, 10367, 10369, 10371, 10373, + 10375, 10377, 10379, 10381, 0, 0, 0, 10383, 10385, 10387, 10389, 10391, + 10393, 0, 0, 10395, 10397, 10399, 10401, 10403, 10405, 0, 0, 10407, + 10409, 10411, 10413, 10415, 10417, 0, 0, 10419, 10421, 10423, 0, 0, 0, + 10425, 10427, 10429, 10431, 10433, 10435, 10437, 0, 10439, 10441, 10443, + 10445, 10447, 10449, 10451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10453, 0, 10456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10459, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10462, 10465, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10468, 10471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10474, + 10477, 0, 10480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10483, 10486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10489, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10492, 10495, 10498, 10501, + 10504, 10507, 10510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10513, + 10516, 10519, 10522, 10525, 10528, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10531, 10533, 10535, 10537, 10539, 10541, 10543, 10545, 10547, + 10549, 10551, 10553, 10555, 10557, 10559, 10561, 10563, 10565, 10567, + 10569, 10571, 10573, 10575, 10577, 10579, 10581, 10583, 10585, 10587, + 10589, 10591, 10593, 10595, 10597, 10599, 10601, 10603, 10605, 10607, + 10609, 10611, 10613, 10615, 10617, 10619, 10621, 10623, 10625, 10627, + 10629, 10631, 10633, 10635, 10637, 10639, 10641, 10643, 10645, 10647, + 10649, 10651, 10653, 10655, 10657, 10659, 10661, 10663, 10665, 10667, + 10669, 10671, 10673, 10675, 10677, 10679, 10681, 10683, 10685, 10687, + 10689, 10691, 10693, 10695, 10697, 10699, 0, 10701, 10703, 10705, 10707, + 10709, 10711, 10713, 10715, 10717, 10719, 10721, 10723, 10725, 10727, + 10729, 10731, 10733, 10735, 10737, 10739, 10741, 10743, 10745, 10747, + 10749, 10751, 10753, 10755, 10757, 10759, 10761, 10763, 10765, 10767, + 10769, 10771, 10773, 10775, 10777, 10779, 10781, 10783, 10785, 10787, + 10789, 10791, 10793, 10795, 10797, 10799, 10801, 10803, 10805, 10807, + 10809, 10811, 10813, 10815, 10817, 10819, 10821, 10823, 10825, 10827, + 10829, 10831, 10833, 10835, 10837, 10839, 10841, 0, 10843, 10845, 0, 0, + 10847, 0, 0, 10849, 10851, 0, 0, 10853, 10855, 10857, 10859, 0, 10861, + 10863, 10865, 10867, 10869, 10871, 10873, 10875, 10877, 10879, 10881, + 10883, 0, 10885, 0, 10887, 10889, 10891, 10893, 10895, 10897, 10899, 0, + 10901, 10903, 10905, 10907, 10909, 10911, 10913, 10915, 10917, 10919, + 10921, 10923, 10925, 10927, 10929, 10931, 10933, 10935, 10937, 10939, + 10941, 10943, 10945, 10947, 10949, 10951, 10953, 10955, 10957, 10959, + 10961, 10963, 10965, 10967, 10969, 10971, 10973, 10975, 10977, 10979, + 10981, 10983, 10985, 10987, 10989, 10991, 10993, 10995, 10997, 10999, + 11001, 11003, 11005, 11007, 11009, 11011, 11013, 11015, 11017, 11019, + 11021, 11023, 11025, 11027, 11029, 0, 11031, 11033, 11035, 11037, 0, 0, + 11039, 11041, 11043, 11045, 11047, 11049, 11051, 11053, 0, 11055, 11057, + 11059, 11061, 11063, 11065, 11067, 0, 11069, 11071, 11073, 11075, 11077, + 11079, 11081, 11083, 11085, 11087, 11089, 11091, 11093, 11095, 11097, + 11099, 11101, 11103, 11105, 11107, 11109, 11111, 11113, 11115, 11117, + 11119, 11121, 11123, 0, 11125, 11127, 11129, 11131, 0, 11133, 11135, + 11137, 11139, 11141, 0, 11143, 0, 0, 0, 11145, 11147, 11149, 11151, + 11153, 11155, 11157, 0, 11159, 11161, 11163, 11165, 11167, 11169, 11171, + 11173, 11175, 11177, 11179, 11181, 11183, 11185, 11187, 11189, 11191, + 11193, 11195, 11197, 11199, 11201, 11203, 11205, 11207, 11209, 11211, + 11213, 11215, 11217, 11219, 11221, 11223, 11225, 11227, 11229, 11231, + 11233, 11235, 11237, 11239, 11241, 11243, 11245, 11247, 11249, 11251, + 11253, 11255, 11257, 11259, 11261, 11263, 11265, 11267, 11269, 11271, + 11273, 11275, 11277, 11279, 11281, 11283, 11285, 11287, 11289, 11291, + 11293, 11295, 11297, 11299, 11301, 11303, 11305, 11307, 11309, 11311, + 11313, 11315, 11317, 11319, 11321, 11323, 11325, 11327, 11329, 11331, + 11333, 11335, 11337, 11339, 11341, 11343, 11345, 11347, 11349, 11351, + 11353, 11355, 11357, 11359, 11361, 11363, 11365, 11367, 11369, 11371, + 11373, 11375, 11377, 11379, 11381, 11383, 11385, 11387, 11389, 11391, + 11393, 11395, 11397, 11399, 11401, 11403, 11405, 11407, 11409, 11411, + 11413, 11415, 11417, 11419, 11421, 11423, 11425, 11427, 11429, 11431, + 11433, 11435, 11437, 11439, 11441, 11443, 11445, 11447, 11449, 11451, + 11453, 11455, 11457, 11459, 11461, 11463, 11465, 11467, 11469, 11471, + 11473, 11475, 11477, 11479, 11481, 11483, 11485, 11487, 11489, 11491, + 11493, 11495, 11497, 11499, 11501, 11503, 11505, 11507, 11509, 11511, + 11513, 11515, 11517, 11519, 11521, 11523, 11525, 11527, 11529, 11531, + 11533, 11535, 11537, 11539, 11541, 11543, 11545, 11547, 11549, 11551, + 11553, 11555, 11557, 11559, 11561, 11563, 11565, 11567, 11569, 11571, + 11573, 11575, 11577, 11579, 11581, 11583, 11585, 11587, 11589, 11591, + 11593, 11595, 11597, 11599, 11601, 11603, 11605, 11607, 11609, 11611, + 11613, 11615, 11617, 11619, 11621, 11623, 11625, 11627, 11629, 11631, + 11633, 11635, 11637, 11639, 11641, 11643, 11645, 11647, 11649, 11651, + 11653, 11655, 11657, 11659, 11661, 11663, 11665, 11667, 11669, 11671, + 11673, 11675, 11677, 11679, 11681, 11683, 11685, 11687, 11689, 11691, + 11693, 11695, 11697, 11699, 11701, 11703, 11705, 11707, 11709, 11711, + 11713, 11715, 11717, 11719, 11721, 11723, 11725, 11727, 11729, 11731, + 11733, 11735, 11737, 11739, 11741, 11743, 11745, 11747, 11749, 11751, + 11753, 11755, 11757, 11759, 11761, 11763, 11765, 11767, 11769, 11771, + 11773, 11775, 11777, 11779, 11781, 11783, 11785, 11787, 11789, 11791, + 11793, 11795, 11797, 11799, 11801, 11803, 11805, 11807, 11809, 11811, + 11813, 11815, 11817, 11819, 11821, 11823, 11825, 11827, 11829, 11831, + 11833, 11835, 11837, 0, 0, 11839, 11841, 11843, 11845, 11847, 11849, + 11851, 11853, 11855, 11857, 11859, 11861, 11863, 11865, 11867, 11869, + 11871, 11873, 11875, 11877, 11879, 11881, 11883, 11885, 11887, 11889, + 11891, 11893, 11895, 11897, 11899, 11901, 11903, 11905, 11907, 11909, + 11911, 11913, 11915, 11917, 11919, 11921, 11923, 11925, 11927, 11929, + 11931, 11933, 11935, 11937, 11939, 11941, 11943, 11945, 11947, 11949, + 11951, 11953, 11955, 11957, 11959, 11961, 11963, 11965, 11967, 11969, + 11971, 11973, 11975, 11977, 11979, 11981, 11983, 11985, 11987, 11989, + 11991, 11993, 11995, 11997, 11999, 12001, 12003, 12005, 12007, 12009, + 12011, 12013, 12015, 12017, 12019, 12021, 12023, 12025, 12027, 12029, + 12031, 12033, 12035, 12037, 12039, 12041, 12043, 12045, 12047, 12049, + 12051, 12053, 12055, 12057, 12059, 12061, 12063, 12065, 12067, 12069, + 12071, 12073, 12075, 12077, 12079, 12081, 12083, 12085, 12087, 12089, + 12091, 12093, 12095, 12097, 12099, 12101, 12103, 12105, 12107, 12109, + 12111, 12113, 12115, 12117, 12119, 12121, 12123, 12125, 12127, 12129, + 12131, 12133, 12135, 12137, 12139, 12141, 12143, 12145, 12147, 12149, + 12151, 12153, 12155, 12157, 12159, 12161, 12163, 12165, 12167, 12169, + 12171, 12173, 12175, 12177, 12179, 12181, 12183, 12185, 12187, 12189, + 12191, 12193, 12195, 12197, 12199, 12201, 12203, 12205, 12207, 12209, + 12211, 12213, 12215, 12217, 12219, 12221, 12223, 12225, 12227, 12229, + 12231, 12233, 12235, 12237, 12239, 12241, 12243, 12245, 12247, 12249, + 12251, 12253, 12255, 12257, 12259, 12261, 12263, 12265, 12267, 12269, + 12271, 12273, 12275, 12277, 12279, 12281, 12283, 12285, 12287, 12289, + 12291, 12293, 12295, 12297, 12299, 12301, 12303, 12305, 12307, 12309, + 12311, 12313, 12315, 12317, 12319, 12321, 12323, 12325, 12327, 12329, + 12331, 12333, 12335, 12337, 12339, 12341, 12343, 12345, 12347, 12349, + 12351, 12353, 12355, 12357, 12359, 12361, 12363, 12365, 12367, 12369, + 12371, 12373, 12375, 12377, 12379, 12381, 12383, 12385, 12387, 12389, + 12391, 12393, 12395, 12397, 12399, 12401, 12403, 12405, 12407, 12409, + 12411, 12413, 12415, 12417, 12419, 12421, 0, 0, 12423, 12425, 12427, + 12429, 12431, 12433, 12435, 12437, 12439, 12441, 12443, 12445, 12447, + 12449, 12451, 12453, 12455, 12457, 12459, 12461, 12463, 12465, 12467, + 12469, 12471, 12473, 12475, 12477, 12479, 12481, 12483, 12485, 12487, + 12489, 12491, 12493, 12495, 12497, 12499, 12501, 12503, 12505, 12507, + 12509, 12511, 12513, 12515, 12517, 12519, 12521, 12523, 12525, 12527, + 12529, 0, 12531, 12533, 12535, 12537, 12539, 12541, 12543, 12545, 12547, + 12549, 12551, 12553, 12555, 12557, 12559, 12561, 12563, 12565, 12567, + 12569, 12571, 12573, 12575, 12577, 12579, 12581, 12583, 0, 12585, 12587, + 0, 12589, 0, 0, 12591, 0, 12593, 12595, 12597, 12599, 12601, 12603, + 12605, 12607, 12609, 12611, 0, 12613, 12615, 12617, 12619, 0, 12621, 0, + 12623, 0, 0, 0, 0, 0, 0, 12625, 0, 0, 0, 0, 12627, 0, 12629, 0, 12631, 0, + 12633, 12635, 12637, 0, 12639, 12641, 0, 12643, 0, 0, 12645, 0, 12647, 0, + 12649, 0, 12651, 0, 12653, 0, 12655, 12657, 0, 12659, 0, 0, 12661, 12663, + 12665, 12667, 0, 12669, 12671, 12673, 12675, 12677, 12679, 12681, 0, + 12683, 12685, 12687, 12689, 0, 12691, 12693, 12695, 12697, 0, 12699, 0, + 12701, 12703, 12705, 12707, 12709, 12711, 12713, 12715, 12717, 12719, 0, + 12721, 12723, 12725, 12727, 12729, 12731, 12733, 12735, 12737, 12739, + 12741, 12743, 12745, 12747, 12749, 12751, 12753, 0, 0, 0, 0, 0, 12755, + 12757, 12759, 0, 12761, 12763, 12765, 12767, 12769, 0, 12771, 12773, + 12775, 12777, 12779, 12781, 12783, 12785, 12787, 12789, 12791, 12793, + 12795, 12797, 12799, 12801, 12803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 12805, 12808, 12811, 12814, 12817, 12820, 12823, + 12826, 12829, 12832, 12835, 0, 0, 0, 0, 0, 12838, 12842, 12846, 12850, + 12854, 12858, 12862, 12866, 12870, 12874, 12878, 12882, 12886, 12890, + 12894, 12898, 12902, 12906, 12910, 12914, 12918, 12922, 12926, 12930, + 12934, 12938, 12942, 12946, 12948, 12950, 12953, 0, 12956, 12958, 12960, + 12962, 12964, 12966, 12968, 12970, 12972, 12974, 12976, 12978, 12980, + 12982, 12984, 12986, 12988, 12990, 12992, 12994, 12996, 12998, 13000, + 13002, 13004, 13006, 13008, 13011, 13014, 13017, 13020, 13024, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13027, 13030, 13033, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13036, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13039, 13042, 13045, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13047, 13049, 13051, 13053, 13055, 13057, 13059, + 13061, 13063, 13065, 13067, 13069, 13071, 13073, 13075, 13077, 13079, + 13081, 13083, 13085, 13087, 13089, 13091, 13093, 13095, 13097, 13099, + 13101, 13103, 13105, 13107, 13109, 13111, 13113, 13115, 13117, 13119, + 13121, 13123, 13125, 13127, 13129, 13131, 13133, 0, 0, 0, 0, 13135, + 13139, 13143, 13147, 13151, 13155, 13159, 13163, 13167, 0, 0, 0, 0, 0, 0, + 0, 13171, 13173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13175, 13177, + 13179, 13181, 13183, 13185, 13187, 13189, 13191, 13193, 0, 0, 0, 0, 0, 0, + 13195, 13197, 13199, 13201, 13203, 13205, 13207, 13209, 13211, 13213, + 13215, 13217, 13219, 13221, 13223, 13225, 13227, 13229, 13231, 13233, + 13235, 13237, 13239, 13241, 13243, 13245, 13247, 13249, 13251, 13253, + 13255, 13257, 13259, 13261, 13263, 13265, 13267, 13269, 13271, 13273, + 13275, 13277, 13279, 13281, 13283, 13285, 13287, 13289, 13291, 13293, + 13295, 13297, 13299, 13301, 13303, 13305, 13307, 13309, 13311, 13313, + 13315, 13317, 13319, 13321, 13323, 13325, 13327, 13329, 13331, 13333, + 13335, 13337, 13339, 13341, 13343, 13345, 13347, 13349, 13351, 13353, + 13355, 13357, 13359, 13361, 13363, 13365, 13367, 13369, 13371, 13373, + 13375, 13377, 13379, 13381, 13383, 13385, 13387, 13389, 13391, 13393, + 13395, 13397, 13399, 13401, 13403, 13405, 13407, 13409, 13411, 13413, + 13415, 13417, 13419, 13421, 13423, 13425, 13427, 13429, 13431, 13433, + 13435, 13437, 13439, 13441, 13443, 13445, 13447, 13449, 13451, 13453, + 13455, 13457, 13459, 13461, 13463, 13465, 13467, 13469, 13471, 13473, + 13475, 13477, 13479, 13481, 13483, 13485, 13487, 13489, 13491, 13493, + 13495, 13497, 13499, 13501, 13503, 13505, 13507, 13509, 13511, 13513, + 13515, 13517, 13519, 13521, 13523, 13525, 13527, 13529, 13531, 13533, + 13535, 13537, 13539, 13541, 13543, 13545, 13547, 13549, 13551, 13553, + 13555, 13557, 13559, 13561, 13563, 13565, 13567, 13569, 13571, 13573, + 13575, 13577, 13579, 13581, 13583, 13585, 13587, 13589, 13591, 13593, + 13595, 13597, 13599, 13601, 13603, 13605, 13607, 13609, 13611, 13613, + 13615, 13617, 13619, 13621, 13623, 13625, 13627, 13629, 13631, 13633, + 13635, 13637, 13639, 13641, 13643, 13645, 13647, 13649, 13651, 13653, + 13655, 13657, 13659, 13661, 13663, 13665, 13667, 13669, 13671, 13673, + 13675, 13677, 13679, 13681, 13683, 13685, 13687, 13689, 13691, 13693, + 13695, 13697, 13699, 13701, 13703, 13705, 13707, 13709, 13711, 13713, + 13715, 13717, 13719, 13721, 13723, 13725, 13727, 13729, 13731, 13733, + 13735, 13737, 13739, 13741, 13743, 13745, 13747, 13749, 13751, 13753, + 13755, 13757, 13759, 13761, 13763, 13765, 13767, 13769, 13771, 13773, + 13775, 13777, 13779, 13781, 13783, 13785, 13787, 13789, 13791, 13793, + 13795, 13797, 13799, 13801, 13803, 13805, 13807, 13809, 13811, 13813, + 13815, 13817, 13819, 13821, 13823, 13825, 13827, 13829, 13831, 13833, + 13835, 13837, 13839, 13841, 13843, 13845, 13847, 13849, 13851, 13853, + 13855, 13857, 13859, 13861, 13863, 13865, 13867, 13869, 13871, 13873, + 13875, 13877, 13879, 13881, 13883, 13885, 13887, 13889, 13891, 13893, + 13895, 13897, 13899, 13901, 13903, 13905, 13907, 13909, 13911, 13913, + 13915, 13917, 13919, 13921, 13923, 13925, 13927, 13929, 13931, 13933, + 13935, 13937, 13939, 13941, 13943, 13945, 13947, 13949, 13951, 13953, + 13955, 13957, 13959, 13961, 13963, 13965, 13967, 13969, 13971, 13973, + 13975, 13977, 13979, 13981, 13983, 13985, 13987, 13989, 13991, 13993, + 13995, 13997, 13999, 14001, 14003, 14005, 14007, 14009, 14011, 14013, + 14015, 14017, 14019, 14021, 14023, 14025, 14027, 14029, 14031, 14033, + 14035, 14037, 14039, 14041, 14043, 14045, 14047, 14049, 14051, 14053, + 14055, 14057, 14059, 14061, 14063, 14065, 14067, 14069, 14071, 14073, + 14075, 14077, 14079, 14081, 14083, 14085, 14087, 14089, 14091, 14093, + 14095, 14097, 14099, 14101, 14103, 14105, 14107, 14109, 14111, 14113, + 14115, 14117, 14119, 14121, 14123, 14125, 14127, 14129, 14131, 14133, + 14135, 14137, 14139, 14141, 14143, 14145, 14147, 14149, 14151, 14153, + 14155, 14157, 14159, 14161, 14163, 14165, 14167, 14169, 14171, 14173, + 14175, 14177, 14179, 14181, 14183, 14185, 14187, 14189, 14191, 14193, + 14195, 14197, 14199, 14201, 14203, 14205, 14207, 14209, 14211, 14213, + 14215, 14217, 14219, 14221, 14223, 14225, 14227, 14229, 14231, 14233, + 14235, 14237, 14239, 14241, 14243, 14245, 14247, 14249, 14251, 14253, + 14255, 14257, 14259, 14261, 14263, 14265, 14267, 14269, 14271, 14273, + 14275, 14277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, }; /* NFC pairs */ #define COMP_SHIFT 2 static const unsigned short comp_index[] = { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, - 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 12, 0, 13, 0, 0, - 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 19, 20, 0, 21, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 29, - 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 32, 33, 34, 35, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 38, 39, 0, - 40, 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 46, 47, 0, 48, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, - 51, 52, 53, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 56, 0, 57, 58, 59, 0, - 0, 0, 0, 0, 0, 0, 0, 60, 0, 61, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 63, 64, 65, 0, 66, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 69, 70, 71, 72, 73, 0, - 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 77, 0, 78, 79, 80, 81, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 85, - 0, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 89, 90, 91, 92, 93, 0, 0, - 0, 0, 0, 0, 0, 0, 94, 95, 96, 97, 98, 99, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 101, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 104, 0, 0, 105, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 107, 108, 109, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 112, 113, - 114, 115, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 0, 124, 0, 0, 125, 0, 0, 0, 0, - 0, 0, 0, 0, 126, 127, 128, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 130, 131, 132, 133, 134, 135, 0, 0, 0, 0, 0, 0, 0, 0, 136, 137, 138, 139, - 140, 141, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 144, 145, 146, 0, 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 148, 149, 150, 151, 152, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, - 158, 159, 160, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 0, 163, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 164, 0, 165, 0, 166, 167, 168, 0, 0, 0, 0, 0, 0, - 0, 0, 169, 0, 0, 170, 171, 172, 173, 174, 0, 0, 0, 0, 0, 0, 0, 0, 175, - 176, 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, 179, 180, 181, 182, - 183, 184, 185, 0, 0, 0, 0, 0, 0, 0, 0, 186, 187, 188, 189, 190, 191, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 192, 0, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 194, 195, 196, 197, 198, 199, 200, 0, 0, 0, 0, 0, 0, 0, 0, 201, 202, - 203, 204, 205, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 208, 0, 209, - 210, 211, 0, 0, 0, 0, 0, 0, 0, 0, 212, 213, 214, 215, 216, 217, 218, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 221, 222, 223, 0, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 227, 228, 0, 229, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 230, 231, 232, 0, 233, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 235, - 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, 238, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 242, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 244, 245, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 247, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 249, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 251, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 255, 256, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 258, 0, - 259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, - 263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 264, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 265, 266, 267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 269, 270, 271, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 277, 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 279, 0, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 282, - 283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 286, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 290, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 292, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 297, 298, 299, 0, 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 301, 0, 302, 0, 303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 304, 305, 306, 0, 307, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 308, 0, 309, 0, 310, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 315, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 318, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, 322, 0, 0, - 323, 0, 0, 324, 0, 0, 0, 0, 0, 0, 0, 0, 325, 0, 0, 326, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 327, 0, 0, 0, 328, 0, 0, 329, 0, 0, 0, 0, 0, 0, 0, 0, 330, - 331, 0, 332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, 0, 0, 0, 334, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 336, 337, 338, 0, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 340, 0, 0, 341, - 0, 0, 0, 342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 343, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 344, 0, 0, 0, 0, 0, 0, 0, 345, 346, 0, - 0, 347, 0, 0, 348, 0, 0, 0, 0, 0, 0, 0, 0, 349, 0, 0, 350, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 351, 0, 0, 0, 352, 0, 0, 353, 0, 0, 0, 0, 0, 0, 0, 0, - 354, 355, 0, 356, 0, 0, 0, 357, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 359, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 361, 362, 363, 0, 364, 0, 0, 365, 0, 0, 0, 0, 0, 0, 0, 0, 366, 0, - 0, 367, 0, 0, 0, 368, 0, 0, 0, 0, 0, 0, 0, 369, 0, 0, 0, 0, 0, 0, 370, 0, - 0, 0, 0, 0, 0, 0, 0, 371, 0, 0, 0, 0, 0, 0, 372, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 373, 0, 0, 0, 0, 0, 0, 0, 0, 374, 375, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 378, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 379, 380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 381, 382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 383, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 384, 385, 386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 388, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 389, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 394, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 395, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 396, 397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 398, 399, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 400, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 401, 402, 403, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 406, 407, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 410, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 413, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 11, 0, 12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 17, 18, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, 26, 27, + 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 32, 33, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 36, + 37, 38, 39, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 49, 0, 50, 0, 51, 52, 53, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 64, 65, 0, 66, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 69, 70, 71, + 72, 73, 74, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 77, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 78, 79, 0, 80, 81, 82, 83, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 84, 85, 86, 0, 87, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 90, 0, 91, + 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, 94, 95, 96, 97, 98, 99, 100, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 101, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, + 104, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 107, 108, 109, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 111, 112, 0, 113, 114, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, + 118, 119, 120, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 0, 0, 123, 0, + 124, 0, 0, 0, 0, 0, 0, 0, 0, 125, 126, 127, 128, 0, 129, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 130, 0, 131, 132, 133, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 135, 136, 137, 138, 139, 140, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 144, 145, 146, 0, 147, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 148, 149, 150, 151, 152, 153, 154, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 155, 156, 157, 158, 159, 160, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 162, 0, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 0, 0, 165, 166, + 167, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0, 169, 0, 0, 170, 171, 172, 173, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 174, 175, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 177, 178, 179, 180, 0, 181, 182, 183, 0, 0, 0, 0, 0, 0, 0, 0, 184, 185, + 186, 187, 188, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 190, 191, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, 194, 195, 196, 197, 198, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 199, 200, 201, 0, 202, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 204, 205, 206, 207, 208, 209, 0, 0, 0, 0, 0, 0, 0, 0, 210, 211, + 212, 213, 214, 215, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, 0, 0, 218, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 220, 221, 222, 0, 223, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 226, + 227, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 230, 231, 0, 232, 0, + 233, 0, 0, 0, 0, 0, 0, 0, 0, 234, 235, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, + 0, 0, 0, 237, 238, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245, 246, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, + 249, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 252, 253, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 256, 257, 0, 258, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 260, 261, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 263, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 264, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 266, + 267, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 270, 271, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 273, 274, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 278, 279, 0, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 282, + 283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 285, 286, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 288, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 290, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 298, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 299, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 301, 302, 303, 0, 0, 304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 305, 306, + 307, 0, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 310, 311, 0, 312, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 313, 0, 314, 0, 315, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 317, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 320, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 322, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 323, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, + 0, 328, 329, 0, 0, 330, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 332, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, 335, 0, 0, 0, 336, 0, 0, 0, 0, 0, + 0, 0, 337, 338, 339, 0, 340, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 341, 0, 0, + 342, 343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 344, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 345, 346, 347, 0, 348, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 349, 0, 0, 0, 350, 0, 0, 351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 353, 0, 0, 0, 0, 0, + 0, 0, 354, 355, 356, 0, 357, 0, 0, 358, 359, 0, 0, 0, 0, 0, 0, 0, 360, 0, + 0, 0, 361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 0, 363, 364, 0, 0, + 365, 0, 0, 0, 0, 0, 0, 0, 0, 366, 367, 0, 368, 0, 0, 0, 369, 0, 0, 0, 0, + 0, 0, 0, 370, 371, 0, 0, 372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 374, 375, 376, 377, 378, 0, 0, + 379, 0, 0, 0, 0, 0, 0, 0, 0, 380, 0, 0, 381, 0, 0, 0, 382, 0, 0, 0, 0, 0, + 0, 0, 383, 384, 0, 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, 0, + 0, 0, 0, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 388, 0, 0, 0, + 0, 0, 0, 0, 0, 389, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 393, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 394, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 395, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 397, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 399, 400, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 404, 405, 406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 407, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 410, 411, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 413, 414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 422, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 423, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 425, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 428, - 429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 430, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 433, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 436, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 437, 438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 440, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 443, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 446, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 448, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 449, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 452, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 453, 0, 0, 0, 454, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 456, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 459, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 461, 462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 463, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 466, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 467, 0, 0, 0, 0, 0, 0, 468, 0, 0, 0, - 0, 0, 0, 0, 0, 469, 0, 0, 0, 0, 0, 0, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 472, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 475, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 476, 0, 0, 0, 0, 0, 0, 0, 477, 0, 0, - 0, 0, 0, 0, 478, 0, 0, 0, 0, 0, 0, 0, 0, 479, 0, 0, 0, 0, 0, 0, 480, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 483, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 486, 0, 0, - 0, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 488, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 491, 0, 0, - 0, 0, 0, 0, 492, 0, 0, 0, 0, 0, 0, 0, 0, 493, 0, 0, 0, 0, 0, 0, 494, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 495, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 497, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 500, 0, 0, - 0, 0, 0, 0, 0, 501, 0, 0, 0, 0, 0, 0, 502, 0, 0, 0, 0, 0, 0, 0, 0, 503, - 0, 0, 0, 0, 0, 0, 504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 505, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 506, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 508, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 510, 0, 0, 0, 0, 0, 0, 0, 511, 0, 0, 0, 0, 0, 0, 512, 0, - 0, 0, 0, 0, 0, 0, 0, 513, 0, 0, 0, 0, 0, 0, 514, 0, 0, 0, 0, 0, 0, 0, - 515, 0, 0, 0, 0, 0, 0, 516, 0, 0, 0, 0, 0, 0, 0, 0, 517, 0, 0, 0, 0, 0, - 0, 518, 0, 0, 0, 0, 0, 0, 0, 519, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 521, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 522, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 523, 0, 0, 0, 0, 0, 0, 524, 0, 0, 0, 0, 0, 0, 0, 0, 525, 0, 0, 0, 0, - 0, 0, 526, 0, 0, 0, 0, 0, 0, 0, 527, 0, 0, 0, 0, 0, 0, 528, 0, 0, 0, 0, - 0, 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, 530, 0, 0, 0, 0, 0, 0, 0, 531, 0, 0, - 0, 0, 0, 0, 532, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 533, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 535, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 536, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 538, 0, 0, 0, 0, 0, 0, 0, 0, 539, 0, 0, 0, 0, 0, 0, 540, 0, 0, - 0, 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, 0, 542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 543, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 544, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 547, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 550, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 552, 0, 0, 0, 0, 0, 0, 0, 0, 553, 0, 0, 0, 0, 0, 0, 554, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 556, 0, 0, 0, 0, 0, 0, 0, 557, 0, 0, 0, 0, 0, 0, 558, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 561, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 563, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 564, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 567, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 569, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 570, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 571, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 575, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 576, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 579, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 582, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 583, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 585, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 588, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 593, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 594, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 597, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 598, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 599, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 600, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 601, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 602, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 603, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 604, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 605, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 606, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 607, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 609, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 610, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 612, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 614, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 615, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 618, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 620, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 621, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 624, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 626, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 628, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 630, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 633, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 635, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 636, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 639, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 642, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 645, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 646, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 650, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 651, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 654, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 656, + 0, 0, 0, 0, 0, 0, 0, 417, 418, 419, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 422, 423, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 426, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 428, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 429, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 430, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 432, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 433, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 436, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 439, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 442, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 445, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 446, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 448, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 452, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 455, 456, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 459, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 462, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 465, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 468, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 469, 0, 0, 0, 470, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 473, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 476, 477, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 480, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 483, 0, 0, 0, 0, + 0, 0, 484, 0, 0, 0, 0, 0, 0, 0, 0, 485, 0, 0, 0, 0, 0, 0, 486, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 489, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 492, 0, 0, 0, + 0, 0, 0, 0, 0, 493, 0, 0, 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 495, + 0, 0, 0, 0, 0, 0, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 497, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 498, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 500, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 501, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 502, 0, 0, 0, 0, 0, 0, 0, 0, 503, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 505, 506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 507, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 508, 0, 0, 0, 0, 0, 0, 509, 0, 0, 0, 0, 0, + 0, 0, 0, 510, 0, 0, 0, 0, 0, 0, 511, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 513, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 516, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 517, 0, 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 0, 0, 0, 0, 519, 0, 0, 0, 0, 0, 0, 0, 0, 520, 0, 0, 0, 0, 0, 0, 521, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 522, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 524, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 525, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 527, 0, + 0, 0, 0, 0, 0, 0, 0, 528, 0, 0, 0, 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 530, 0, 0, 0, 0, 0, 0, 531, 0, 0, 0, 0, 0, 0, 0, 532, 533, 0, 0, 0, 0, 0, + 534, 0, 0, 0, 0, 0, 0, 0, 0, 535, 0, 0, 0, 0, 0, 0, 536, 0, 0, 0, 0, 0, + 0, 0, 0, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 538, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 539, 540, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 542, 0, 0, + 0, 0, 0, 0, 543, 0, 0, 0, 0, 0, 0, 0, 0, 544, 0, 0, 0, 0, 0, 0, 545, 0, + 0, 0, 0, 0, 0, 0, 546, 547, 0, 0, 0, 0, 0, 548, 0, 0, 0, 0, 0, 0, 0, 0, + 549, 0, 0, 0, 0, 0, 0, 550, 0, 0, 0, 0, 0, 0, 0, 0, 551, 0, 0, 0, 0, 0, + 0, 552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 553, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 554, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 556, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 557, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 558, 0, 0, 0, 0, 0, 0, 0, 559, 0, 0, 0, 0, 0, 0, 560, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 0, 0, 0, 0, 0, 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 563, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 564, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 567, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 569, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 570, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 571, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 572, 0, 0, 0, 0, 0, 0, 0, 573, 0, 0, 0, 0, 0, 0, 574, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 575, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 576, 0, 0, 0, 0, 0, 0, 0, 577, 578, 0, 0, 0, 0, 0, 579, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 580, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 582, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 583, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 588, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 589, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 592, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 593, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 594, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 595, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 597, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 598, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 599, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 601, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 602, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 603, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 604, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 605, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 606, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 607, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 610, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 613, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 614, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 616, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 618, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 619, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 620, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 621, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 623, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 626, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 628, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 629, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 630, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 632, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 635, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 636, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 638, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 639, 640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 642, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 645, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 646, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 650, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 651, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 654, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 656, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 658, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 659, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 660, 661, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 662, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 664, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 665, 666, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 669, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 670, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 672, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 673, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 674, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 675, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 678, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 681, }; static const unsigned int comp_data[] = { - 0, 0, 0, 0, 0, 0, 0, 8814, 0, 8800, 0, 0, 0, 0, 0, 8815, 0, 0, 192, 193, + 0, 0, 0, 0, 0, 0, 0, 8814, 0, 0, 8800, 0, 0, 8815, 0, 0, 0, 192, 193, 194, 195, 256, 258, 550, 196, 7842, 197, 0, 461, 512, 514, 0, 0, 0, 7840, - 0, 7680, 0, 0, 260, 0, 0, 0, 0, 0, 7682, 0, 0, 7684, 0, 0, 0, 0, 7686, 0, - 0, 0, 0, 262, 264, 0, 0, 0, 266, 0, 0, 0, 0, 268, 0, 0, 0, 0, 0, 199, 0, - 0, 7690, 0, 0, 0, 0, 270, 0, 7692, 0, 0, 0, 7696, 0, 7698, 0, 0, 7694, 0, - 0, 0, 200, 201, 202, 7868, 274, 276, 278, 203, 7866, 0, 0, 282, 516, 518, - 0, 0, 0, 7864, 0, 0, 0, 552, 280, 7704, 0, 7706, 0, 0, 7710, 0, 0, 0, 0, - 500, 284, 0, 7712, 286, 288, 0, 0, 0, 0, 486, 0, 0, 0, 0, 0, 290, 0, 0, - 292, 0, 0, 0, 7714, 7718, 0, 0, 0, 542, 0, 7716, 0, 0, 0, 7720, 0, 0, - 7722, 0, 0, 0, 0, 0, 204, 205, 206, 296, 298, 300, 304, 207, 7880, 0, 0, - 463, 520, 522, 0, 0, 0, 7882, 302, 0, 0, 7724, 0, 0, 308, 0, 0, 0, 0, - 7728, 0, 488, 0, 0, 0, 0, 0, 7730, 0, 0, 0, 310, 7732, 0, 0, 0, 0, 313, - 0, 0, 0, 0, 0, 317, 0, 7734, 0, 0, 0, 315, 0, 7740, 0, 0, 7738, 0, 0, 0, - 0, 7742, 7744, 0, 0, 0, 0, 0, 0, 7746, 504, 323, 0, 209, 0, 0, 7748, 0, - 0, 0, 0, 327, 0, 7750, 0, 0, 0, 325, 0, 7754, 0, 0, 7752, 0, 0, 0, 210, - 211, 212, 213, 332, 334, 558, 214, 7886, 0, 336, 465, 524, 526, 0, 0, - 416, 7884, 490, 0, 0, 0, 0, 7764, 0, 0, 0, 0, 7766, 0, 0, 0, 0, 340, - 7768, 0, 0, 0, 0, 344, 528, 530, 0, 0, 0, 7770, 0, 0, 0, 342, 7774, 0, 0, - 0, 0, 346, 348, 0, 0, 0, 7776, 0, 0, 0, 0, 352, 0, 7778, 0, 0, 536, 350, - 0, 0, 7786, 0, 0, 0, 0, 356, 0, 0, 0, 0, 0, 7788, 0, 0, 538, 354, 0, - 7792, 0, 0, 7790, 0, 0, 0, 217, 218, 219, 360, 362, 364, 0, 220, 7910, + 0, 7680, 0, 0, 260, 0, 0, 7682, 0, 0, 7684, 0, 0, 0, 0, 7686, 0, 262, + 264, 0, 0, 0, 266, 0, 0, 0, 0, 268, 0, 199, 0, 0, 0, 7690, 0, 0, 0, 0, + 270, 0, 0, 0, 0, 0, 7692, 0, 0, 0, 7696, 0, 7698, 0, 0, 7694, 0, 0, 0, 0, + 200, 201, 202, 7868, 274, 276, 278, 203, 7866, 0, 0, 282, 516, 518, 0, 0, + 0, 7864, 0, 0, 0, 552, 280, 7704, 0, 7706, 0, 0, 0, 7710, 0, 500, 284, 0, + 7712, 286, 288, 0, 0, 0, 0, 486, 0, 290, 0, 0, 0, 292, 0, 0, 0, 7714, + 7718, 0, 0, 0, 542, 0, 0, 0, 0, 0, 7716, 0, 0, 0, 7720, 0, 0, 7722, 0, 0, + 204, 205, 206, 296, 298, 300, 304, 207, 7880, 0, 0, 463, 520, 522, 0, 0, + 0, 7882, 0, 0, 0, 0, 302, 0, 0, 7724, 0, 0, 0, 308, 0, 7728, 0, 0, 0, 0, + 0, 488, 0, 7730, 0, 0, 0, 310, 0, 0, 0, 0, 7732, 0, 0, 0, 0, 0, 313, 0, + 317, 0, 0, 0, 0, 0, 7734, 0, 0, 0, 315, 0, 7740, 0, 0, 7738, 0, 0, 0, 0, + 0, 7742, 0, 0, 0, 0, 7744, 0, 0, 7746, 0, 504, 323, 0, 209, 0, 0, 7748, + 0, 0, 0, 0, 327, 0, 7750, 0, 0, 0, 325, 0, 7754, 0, 0, 7752, 0, 0, 0, 0, + 210, 211, 212, 213, 332, 334, 558, 214, 7886, 0, 336, 465, 524, 526, 0, + 0, 416, 7884, 0, 0, 0, 0, 490, 0, 0, 0, 0, 0, 7764, 7766, 0, 0, 0, 0, 0, + 340, 0, 0, 0, 0, 7768, 344, 528, 530, 0, 0, 0, 7770, 0, 0, 0, 342, 0, 0, + 0, 0, 7774, 0, 346, 348, 0, 0, 0, 7776, 0, 0, 0, 0, 352, 0, 7778, 0, 0, + 536, 350, 0, 0, 0, 7786, 0, 0, 0, 0, 356, 0, 7788, 0, 0, 538, 354, 0, + 7792, 0, 0, 7790, 0, 0, 0, 0, 217, 218, 219, 360, 362, 364, 0, 220, 7910, 366, 368, 467, 532, 534, 0, 0, 431, 7908, 7794, 0, 0, 0, 370, 7798, 0, - 7796, 0, 0, 0, 7804, 0, 0, 0, 0, 0, 7806, 7808, 7810, 372, 0, 0, 0, 7814, - 7812, 0, 7816, 0, 0, 7818, 7820, 0, 0, 7922, 221, 374, 7928, 562, 0, - 7822, 376, 7926, 0, 0, 0, 0, 7924, 0, 0, 0, 0, 0, 377, 7824, 0, 0, 0, - 379, 0, 0, 0, 0, 381, 0, 0, 0, 0, 0, 7826, 7828, 0, 0, 0, 224, 225, 226, - 227, 257, 259, 551, 228, 7843, 229, 0, 462, 513, 515, 0, 0, 0, 7841, 0, - 7681, 0, 0, 261, 0, 7683, 0, 0, 0, 0, 0, 0, 7685, 7687, 0, 0, 0, 0, 263, - 265, 0, 0, 0, 267, 0, 0, 0, 0, 269, 0, 231, 0, 0, 7691, 0, 0, 0, 0, 271, - 0, 0, 0, 0, 0, 7693, 0, 0, 0, 7697, 0, 7699, 0, 0, 7695, 0, 0, 0, 232, - 233, 234, 7869, 275, 277, 279, 235, 7867, 0, 0, 283, 517, 519, 0, 0, 0, - 7865, 0, 0, 0, 553, 281, 7705, 0, 7707, 0, 0, 7711, 0, 0, 0, 0, 501, 285, - 0, 7713, 287, 289, 0, 0, 0, 0, 487, 0, 291, 0, 0, 293, 0, 0, 0, 7715, + 7796, 7804, 0, 0, 0, 0, 0, 7806, 0, 7808, 7810, 372, 0, 0, 0, 7814, 7812, + 0, 7816, 0, 0, 0, 7818, 7820, 0, 0, 0, 7922, 221, 374, 7928, 562, 0, + 7822, 376, 7926, 0, 0, 0, 0, 7924, 0, 0, 377, 7824, 0, 0, 0, 379, 381, 0, + 0, 0, 0, 0, 7826, 0, 0, 0, 0, 7828, 224, 225, 226, 227, 257, 259, 551, + 228, 7843, 229, 0, 462, 513, 515, 0, 0, 0, 7841, 0, 7681, 0, 0, 261, 0, + 0, 7683, 0, 0, 7685, 0, 0, 0, 0, 7687, 0, 0, 0, 0, 0, 263, 265, 0, 0, 0, + 267, 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, 231, 0, 0, 0, 7691, 271, 0, 0, 0, 0, + 0, 7693, 0, 0, 0, 7697, 0, 7699, 0, 0, 7695, 232, 233, 234, 7869, 275, + 277, 279, 235, 7867, 0, 0, 283, 517, 519, 0, 0, 0, 7865, 0, 0, 0, 553, + 281, 7705, 0, 7707, 0, 0, 0, 7711, 0, 0, 0, 0, 0, 501, 285, 0, 7713, 287, + 289, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, 291, 0, 0, 0, 293, 0, 0, 0, 7715, 7719, 0, 0, 0, 543, 0, 0, 0, 0, 0, 7717, 0, 0, 0, 7721, 0, 0, 7723, 0, - 7830, 0, 0, 0, 236, 237, 238, 297, 299, 301, 0, 239, 7881, 0, 0, 464, - 521, 523, 0, 0, 0, 7883, 0, 0, 0, 0, 303, 0, 0, 7725, 0, 0, 309, 0, 0, 0, - 0, 496, 0, 0, 0, 7729, 0, 0, 0, 0, 0, 489, 0, 7731, 0, 0, 0, 311, 0, 0, - 0, 0, 7733, 0, 0, 0, 0, 314, 0, 318, 0, 0, 0, 0, 0, 7735, 0, 0, 0, 316, - 0, 7741, 0, 0, 7739, 0, 0, 0, 0, 7743, 0, 0, 0, 0, 7745, 0, 0, 7747, 0, - 0, 0, 0, 505, 324, 0, 241, 0, 0, 7749, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, - 7751, 0, 0, 0, 326, 0, 7755, 0, 0, 7753, 0, 0, 0, 242, 243, 244, 245, - 333, 335, 559, 246, 7887, 0, 337, 466, 525, 527, 0, 0, 417, 7885, 0, 0, - 0, 0, 491, 0, 0, 0, 0, 7765, 7767, 0, 0, 0, 0, 341, 0, 0, 0, 0, 7769, 0, - 0, 0, 0, 345, 529, 531, 0, 0, 0, 7771, 0, 0, 0, 343, 0, 0, 0, 0, 7775, 0, - 0, 0, 0, 347, 349, 0, 0, 0, 7777, 0, 0, 0, 0, 353, 0, 0, 0, 0, 0, 7779, - 0, 0, 537, 351, 0, 0, 7787, 7831, 0, 0, 0, 357, 0, 7789, 0, 0, 539, 355, - 0, 7793, 0, 0, 7791, 0, 0, 0, 249, 250, 251, 361, 363, 365, 0, 252, 7911, - 367, 369, 468, 533, 535, 0, 0, 432, 7909, 7795, 0, 0, 0, 371, 7799, 0, - 7797, 0, 0, 0, 7805, 0, 7807, 0, 0, 0, 0, 7809, 7811, 373, 0, 0, 0, 7815, - 7813, 0, 7832, 0, 0, 0, 7817, 0, 0, 7819, 7821, 0, 0, 7923, 253, 375, - 7929, 563, 0, 7823, 255, 7927, 7833, 0, 0, 0, 7925, 0, 378, 7825, 0, 0, - 0, 380, 0, 0, 0, 0, 382, 0, 7827, 0, 0, 0, 0, 7829, 0, 0, 0, 8173, 901, - 0, 0, 8129, 0, 7846, 7844, 0, 7850, 7848, 0, 0, 0, 0, 0, 478, 0, 0, 506, - 0, 0, 0, 0, 0, 508, 0, 0, 482, 0, 0, 7688, 0, 0, 0, 0, 7872, 7870, 0, - 7876, 0, 0, 0, 0, 7874, 0, 0, 7726, 0, 0, 0, 0, 7890, 7888, 0, 7894, 0, - 0, 0, 0, 7892, 0, 0, 7756, 0, 0, 556, 0, 0, 7758, 0, 0, 554, 0, 0, 510, - 0, 0, 0, 0, 475, 471, 0, 0, 469, 0, 0, 473, 0, 0, 7847, 7845, 0, 7851, - 7849, 0, 0, 0, 0, 0, 479, 0, 0, 507, 0, 0, 0, 0, 0, 509, 0, 0, 483, 0, 0, - 7689, 0, 0, 0, 0, 7873, 7871, 0, 7877, 0, 0, 0, 0, 7875, 0, 0, 7727, 0, - 0, 0, 0, 7891, 7889, 0, 7895, 0, 0, 0, 0, 7893, 0, 0, 7757, 0, 0, 557, 0, - 0, 7759, 0, 0, 555, 0, 0, 511, 0, 0, 0, 0, 476, 472, 0, 0, 470, 0, 0, - 474, 0, 0, 7856, 7854, 0, 7860, 7858, 0, 0, 0, 0, 0, 7857, 7855, 0, 7861, - 0, 0, 0, 0, 7859, 0, 7700, 7702, 0, 0, 0, 0, 7701, 7703, 7760, 7762, 0, - 0, 0, 0, 7761, 7763, 0, 0, 7780, 0, 7781, 0, 0, 0, 0, 0, 7782, 0, 7783, - 0, 0, 0, 0, 7800, 0, 0, 0, 0, 0, 7801, 0, 0, 0, 7802, 0, 7803, 0, 0, 0, - 0, 7835, 0, 0, 0, 7900, 7898, 0, 7904, 0, 0, 0, 0, 7902, 0, 0, 0, 0, - 7906, 7901, 7899, 0, 7905, 7903, 0, 0, 0, 0, 7907, 0, 0, 0, 0, 7914, - 7912, 0, 7918, 0, 0, 0, 0, 7916, 0, 0, 0, 0, 7920, 7915, 7913, 0, 7919, - 7917, 0, 0, 0, 0, 7921, 0, 0, 0, 494, 0, 0, 492, 0, 0, 0, 0, 0, 493, 0, - 480, 0, 0, 0, 0, 0, 481, 0, 0, 7708, 0, 0, 0, 0, 0, 7709, 560, 0, 0, 0, - 0, 0, 561, 0, 0, 0, 0, 495, 0, 0, 8122, 902, 0, 0, 8121, 8120, 7944, - 7945, 0, 0, 0, 0, 0, 8124, 8136, 904, 0, 0, 0, 0, 7960, 7961, 0, 0, 8138, - 905, 7976, 7977, 0, 0, 0, 0, 0, 8140, 8154, 906, 0, 0, 8153, 8152, 0, - 938, 0, 0, 7992, 7993, 0, 0, 8184, 908, 8008, 8009, 0, 0, 0, 0, 0, 8172, - 0, 0, 8170, 910, 0, 0, 8169, 8168, 0, 939, 0, 0, 0, 8025, 0, 0, 8186, - 911, 0, 0, 0, 0, 8040, 8041, 0, 8188, 0, 0, 0, 0, 0, 8116, 0, 8132, 0, 0, - 0, 0, 8048, 940, 0, 0, 8113, 8112, 7936, 7937, 0, 0, 0, 0, 8118, 8115, - 8050, 941, 0, 0, 0, 0, 7952, 7953, 0, 0, 8052, 942, 7968, 7969, 0, 0, 0, - 0, 8134, 8131, 8054, 943, 0, 0, 8145, 8144, 0, 970, 0, 0, 7984, 7985, - 8150, 0, 0, 0, 0, 0, 8056, 972, 8000, 8001, 0, 0, 0, 0, 8164, 8165, 0, 0, - 8058, 973, 0, 0, 8161, 8160, 0, 971, 0, 0, 8016, 8017, 0, 0, 0, 0, 8166, - 0, 8060, 974, 0, 0, 0, 0, 8032, 8033, 8182, 8179, 0, 0, 0, 0, 8146, 912, - 0, 0, 8151, 0, 8162, 944, 0, 0, 8167, 0, 0, 0, 0, 0, 0, 8180, 0, 979, 0, - 0, 0, 0, 0, 980, 0, 1031, 0, 0, 0, 1232, 0, 1234, 0, 0, 0, 1027, 1024, 0, - 0, 0, 0, 1238, 0, 1025, 0, 0, 0, 1217, 0, 1244, 0, 0, 0, 0, 0, 1246, 0, - 0, 1037, 0, 0, 0, 1250, 1049, 0, 1252, 0, 0, 0, 1036, 0, 0, 0, 1254, 0, - 0, 1262, 1038, 0, 1264, 0, 0, 1266, 0, 0, 1268, 0, 0, 0, 0, 0, 1272, 0, - 1260, 0, 0, 0, 1233, 0, 1235, 0, 0, 0, 1107, 1104, 0, 0, 0, 0, 1239, 0, - 1105, 0, 0, 0, 1218, 0, 1245, 0, 0, 0, 0, 0, 1247, 0, 0, 1117, 0, 0, 0, - 1251, 1081, 0, 1253, 0, 0, 0, 1116, 0, 0, 0, 1255, 0, 0, 1263, 1118, 0, - 1265, 0, 0, 1267, 0, 0, 1269, 0, 0, 0, 0, 0, 1273, 0, 1261, 0, 0, 0, 0, - 0, 1111, 0, 0, 1142, 0, 1143, 0, 0, 0, 0, 1242, 0, 0, 0, 0, 0, 1243, 0, - 1258, 0, 0, 0, 0, 0, 1259, 1570, 1571, 1573, 0, 0, 0, 0, 1572, 0, 1574, - 0, 0, 0, 0, 0, 1730, 0, 1747, 0, 0, 0, 0, 0, 1728, 0, 0, 0, 2345, 0, - 2353, 0, 0, 0, 0, 0, 2356, 0, 0, 2507, 2508, 0, 0, 2891, 2888, 2892, 0, - 0, 0, 2964, 0, 0, 0, 0, 3018, 3020, 0, 0, 0, 0, 3019, 0, 0, 0, 3144, 0, - 0, 0, 3264, 3274, 3271, 3272, 0, 0, 0, 0, 3275, 0, 0, 0, 3402, 3404, 0, - 0, 0, 0, 3403, 0, 0, 0, 3546, 3548, 3550, 0, 0, 0, 3549, 4134, 0, 0, 0, - 0, 0, 0, 6918, 0, 6920, 0, 0, 0, 0, 0, 6922, 0, 6924, 0, 0, 0, 0, 0, - 6926, 0, 6930, 0, 0, 0, 0, 0, 6971, 0, 6973, 0, 0, 0, 0, 0, 6976, 0, - 6977, 0, 0, 0, 0, 0, 6979, 0, 0, 7736, 0, 7737, 0, 0, 0, 0, 0, 7772, 0, - 7773, 0, 0, 0, 7784, 0, 0, 0, 0, 0, 7785, 0, 7852, 0, 0, 7862, 0, 0, - 7853, 0, 0, 7863, 0, 0, 7878, 0, 0, 0, 0, 0, 7879, 0, 7896, 0, 0, 0, 0, - 0, 7897, 0, 0, 0, 7938, 7940, 0, 0, 7942, 8064, 7939, 7941, 0, 0, 7943, - 8065, 0, 0, 0, 0, 0, 8066, 0, 8067, 0, 0, 0, 0, 0, 8068, 0, 8069, 0, 0, - 0, 0, 0, 8070, 0, 8071, 0, 0, 0, 0, 7946, 7948, 0, 0, 7950, 8072, 7947, - 7949, 0, 0, 7951, 8073, 0, 0, 0, 0, 0, 8074, 0, 8075, 0, 0, 0, 0, 0, - 8076, 0, 8077, 0, 0, 0, 0, 0, 8078, 0, 8079, 0, 0, 0, 0, 7954, 7956, - 7955, 7957, 0, 0, 0, 0, 7962, 7964, 7963, 7965, 0, 0, 0, 0, 7970, 7972, - 0, 0, 7974, 8080, 7971, 7973, 0, 0, 7975, 8081, 0, 0, 0, 0, 0, 8082, 0, - 8083, 0, 0, 0, 0, 0, 8084, 0, 8085, 0, 0, 0, 0, 0, 8086, 0, 8087, 0, 0, - 0, 0, 7978, 7980, 0, 0, 7982, 8088, 7979, 7981, 0, 0, 7983, 8089, 0, 0, - 0, 0, 0, 8090, 0, 8091, 0, 0, 0, 0, 0, 8092, 0, 8093, 0, 0, 0, 0, 0, - 8094, 0, 8095, 0, 0, 0, 0, 7986, 7988, 0, 0, 7990, 0, 7987, 7989, 0, 0, - 7991, 0, 0, 0, 0, 0, 7994, 7996, 0, 0, 7998, 0, 7995, 7997, 0, 0, 7999, - 0, 0, 0, 0, 0, 8002, 8004, 8003, 8005, 0, 0, 0, 0, 8010, 8012, 8011, - 8013, 0, 0, 0, 0, 8018, 8020, 0, 0, 8022, 0, 8019, 8021, 0, 0, 8023, 0, - 0, 0, 0, 0, 8027, 8029, 0, 0, 8031, 0, 8034, 8036, 0, 0, 8038, 8096, 0, - 0, 0, 0, 8035, 8037, 0, 0, 8039, 8097, 0, 8098, 0, 0, 0, 0, 0, 8099, 0, - 8100, 0, 0, 0, 0, 0, 8101, 0, 8102, 0, 0, 0, 0, 0, 8103, 8042, 8044, 0, - 0, 8046, 8104, 0, 0, 0, 0, 8043, 8045, 0, 0, 8047, 8105, 0, 8106, 0, 0, - 0, 0, 0, 8107, 0, 8108, 0, 0, 0, 0, 0, 8109, 0, 8110, 0, 0, 0, 0, 0, - 8111, 0, 8114, 0, 0, 0, 0, 0, 8130, 0, 8178, 0, 0, 0, 0, 0, 8119, 8141, - 8142, 0, 0, 8143, 0, 0, 0, 0, 0, 0, 8135, 0, 8183, 0, 0, 0, 0, 8157, - 8158, 0, 0, 8159, 0, 0, 0, 0, 8602, 0, 8603, 0, 0, 0, 0, 0, 8622, 0, - 8653, 0, 0, 0, 0, 0, 8655, 0, 8654, 0, 0, 0, 0, 0, 8708, 0, 8713, 0, 0, - 0, 0, 0, 8716, 0, 8740, 0, 0, 0, 0, 0, 8742, 0, 8769, 0, 0, 0, 0, 0, - 8772, 0, 8775, 0, 0, 0, 0, 0, 8777, 0, 8813, 0, 0, 0, 0, 0, 8802, 0, - 8816, 0, 0, 0, 0, 0, 8817, 0, 8820, 0, 0, 0, 0, 0, 8821, 0, 8824, 0, 0, - 0, 0, 0, 8825, 0, 8832, 0, 0, 0, 0, 0, 8833, 0, 8928, 0, 0, 0, 0, 0, - 8929, 0, 8836, 0, 0, 0, 0, 0, 8837, 0, 8840, 0, 0, 0, 0, 0, 8841, 0, - 8930, 0, 0, 0, 0, 0, 8931, 0, 8876, 0, 0, 0, 0, 0, 8877, 0, 8878, 0, 0, - 0, 0, 0, 8879, 0, 8938, 0, 0, 0, 0, 0, 8939, 0, 8940, 0, 0, 0, 0, 0, - 8941, 0, 0, 12436, 0, 12364, 0, 0, 0, 0, 0, 12366, 0, 12368, 0, 0, 0, 0, - 0, 12370, 0, 12372, 0, 0, 0, 0, 0, 12374, 0, 12376, 0, 0, 0, 0, 0, 12378, - 0, 12380, 0, 0, 0, 0, 0, 12382, 0, 12384, 0, 0, 0, 0, 0, 12386, 0, 12389, - 0, 0, 0, 0, 0, 12391, 0, 12393, 0, 0, 0, 0, 0, 12400, 12401, 12403, - 12404, 0, 0, 0, 0, 12406, 12407, 12409, 12410, 0, 0, 0, 0, 12412, 12413, - 12446, 0, 0, 0, 0, 0, 12532, 0, 12460, 0, 0, 0, 0, 0, 12462, 0, 12464, 0, - 0, 0, 0, 0, 12466, 0, 12468, 0, 0, 0, 0, 0, 12470, 0, 12472, 0, 0, 0, 0, - 0, 12474, 0, 12476, 0, 0, 0, 0, 0, 12478, 0, 12480, 0, 0, 0, 0, 0, 12482, - 0, 12485, 0, 0, 0, 0, 0, 12487, 0, 12489, 0, 0, 0, 0, 0, 12496, 12497, - 12499, 12500, 0, 0, 0, 0, 12502, 12503, 12505, 12506, 0, 0, 0, 0, 12508, - 12509, 12535, 0, 0, 0, 0, 0, 12536, 0, 12537, 0, 0, 0, 0, 0, 12538, 0, - 12542, 0, 0, 0, 69786, 0, 0, 0, 0, 0, 69788, 0, 69803, 0, 0, 0, 0, 0, 0, - 69934, 0, 69935, 0, 0, 70475, 70476, 0, 0, 70844, 70843, 70846, 0, 0, - 71098, 0, 0, 0, 0, 0, 71099, + 7830, 236, 237, 238, 297, 299, 301, 0, 239, 7881, 0, 0, 464, 521, 523, 0, + 0, 0, 7883, 0, 0, 0, 0, 303, 0, 0, 7725, 0, 0, 0, 309, 0, 0, 0, 0, 496, + 0, 0, 0, 0, 7729, 0, 489, 0, 0, 0, 0, 0, 7731, 0, 0, 0, 311, 7733, 0, 0, + 0, 0, 0, 314, 0, 318, 0, 0, 0, 0, 0, 7735, 0, 0, 0, 316, 0, 7741, 0, 0, + 7739, 0, 7743, 0, 0, 0, 0, 7745, 0, 0, 7747, 0, 0, 0, 0, 0, 505, 324, 0, + 241, 0, 0, 7749, 0, 0, 0, 0, 328, 0, 7751, 0, 0, 0, 326, 0, 7755, 0, 0, + 7753, 0, 0, 0, 0, 242, 243, 244, 245, 333, 335, 559, 246, 7887, 0, 337, + 466, 525, 527, 0, 0, 417, 7885, 491, 0, 0, 0, 0, 0, 7765, 0, 0, 0, 0, + 7767, 0, 341, 0, 0, 0, 0, 7769, 0, 0, 0, 0, 345, 529, 531, 0, 0, 0, 7771, + 0, 0, 0, 343, 0, 0, 0, 0, 7775, 0, 347, 349, 0, 0, 0, 7777, 0, 0, 0, 0, + 353, 0, 7779, 0, 0, 537, 351, 0, 0, 0, 7787, 7831, 0, 0, 0, 357, 0, 0, 0, + 0, 0, 7789, 0, 0, 539, 355, 0, 7793, 0, 0, 7791, 0, 0, 0, 0, 249, 250, + 251, 361, 363, 365, 0, 252, 7911, 367, 369, 468, 533, 535, 0, 0, 432, + 7909, 7795, 0, 0, 0, 371, 7799, 0, 7797, 0, 0, 0, 0, 7805, 0, 7807, 0, 0, + 0, 0, 0, 7809, 7811, 373, 0, 0, 0, 7815, 7813, 0, 7832, 0, 0, 0, 7817, 0, + 0, 0, 7819, 7821, 0, 0, 0, 7923, 253, 375, 7929, 563, 0, 7823, 255, 7927, + 7833, 0, 0, 0, 7925, 0, 0, 378, 7825, 0, 0, 0, 380, 0, 0, 0, 0, 382, 0, + 7827, 0, 0, 0, 0, 7829, 0, 0, 0, 0, 8173, 901, 0, 0, 0, 0, 0, 0, 8129, 0, + 0, 7846, 7844, 0, 7850, 0, 0, 0, 0, 7848, 0, 0, 478, 0, 0, 0, 506, 0, 0, + 508, 0, 0, 482, 0, 0, 0, 7688, 0, 7872, 7870, 0, 7876, 0, 0, 0, 0, 7874, + 0, 0, 0, 7726, 0, 0, 0, 0, 0, 7890, 7888, 0, 7894, 0, 0, 0, 0, 7892, 0, + 0, 0, 7756, 0, 0, 556, 0, 0, 7758, 0, 0, 0, 554, 0, 0, 0, 510, 0, 0, 0, + 0, 0, 475, 471, 0, 0, 469, 0, 0, 473, 0, 0, 0, 7847, 7845, 0, 7851, 0, 0, + 0, 0, 7849, 0, 0, 479, 0, 0, 0, 507, 0, 0, 509, 0, 0, 483, 0, 0, 0, 7689, + 0, 7873, 7871, 0, 7877, 0, 0, 0, 0, 7875, 0, 0, 0, 7727, 0, 0, 0, 0, 0, + 7891, 7889, 0, 7895, 0, 0, 0, 0, 7893, 0, 0, 0, 7757, 0, 0, 557, 0, 0, + 7759, 0, 0, 0, 555, 0, 0, 0, 511, 0, 0, 0, 0, 0, 476, 472, 0, 0, 470, 0, + 0, 474, 0, 0, 0, 7856, 7854, 0, 7860, 0, 0, 0, 0, 7858, 0, 0, 7857, 7855, + 0, 7861, 0, 0, 0, 0, 7859, 0, 0, 7700, 7702, 0, 0, 0, 0, 0, 7701, 7703, + 0, 0, 0, 0, 0, 7760, 7762, 0, 7761, 7763, 0, 0, 0, 7780, 0, 0, 7781, 0, + 0, 7782, 0, 0, 0, 0, 0, 0, 7783, 0, 7800, 0, 0, 7801, 0, 0, 0, 0, 7802, + 0, 0, 7803, 0, 0, 0, 0, 0, 7835, 0, 0, 0, 0, 7900, 7898, 0, 7904, 0, 0, + 0, 0, 7902, 7906, 0, 0, 0, 0, 0, 7901, 7899, 0, 7905, 0, 0, 0, 0, 7903, + 0, 0, 0, 0, 7907, 0, 7914, 7912, 0, 7918, 0, 0, 0, 0, 7916, 0, 0, 0, 0, + 7920, 0, 7915, 7913, 0, 7919, 7917, 0, 0, 0, 0, 7921, 0, 0, 0, 0, 494, 0, + 0, 0, 492, 0, 0, 493, 0, 0, 480, 0, 0, 0, 0, 0, 0, 481, 0, 0, 0, 7708, 0, + 0, 7709, 0, 560, 0, 0, 0, 0, 0, 0, 561, 0, 495, 0, 0, 0, 8122, 902, 0, 0, + 8121, 8120, 0, 0, 0, 0, 7944, 7945, 0, 0, 0, 0, 0, 8124, 0, 8136, 904, 0, + 0, 0, 0, 7960, 7961, 0, 0, 0, 8138, 905, 0, 0, 0, 0, 7976, 7977, 0, 8140, + 0, 0, 0, 0, 0, 8154, 906, 0, 0, 8153, 8152, 0, 938, 0, 0, 7992, 7993, 0, + 0, 0, 8184, 908, 0, 0, 0, 0, 8008, 8009, 0, 0, 0, 0, 0, 0, 8172, 0, 0, 0, + 8170, 910, 0, 0, 8169, 8168, 0, 939, 0, 0, 0, 8025, 0, 0, 0, 8186, 911, + 8040, 8041, 0, 0, 0, 0, 0, 8188, 0, 0, 8116, 0, 0, 8132, 0, 0, 0, 0, 0, + 8048, 940, 0, 0, 8113, 8112, 0, 0, 0, 0, 7936, 7937, 0, 0, 0, 0, 8118, + 8115, 0, 0, 0, 0, 0, 8050, 941, 7952, 7953, 0, 0, 0, 8052, 942, 0, 0, 0, + 0, 7968, 7969, 0, 0, 0, 0, 8134, 8131, 0, 8054, 943, 0, 0, 8145, 8144, 0, + 970, 0, 0, 7984, 7985, 8150, 0, 0, 0, 0, 0, 0, 8056, 972, 0, 0, 0, 0, + 8000, 8001, 0, 8164, 8165, 0, 0, 0, 8058, 973, 0, 0, 8161, 8160, 0, 971, + 0, 0, 0, 0, 0, 0, 8016, 8017, 0, 0, 0, 0, 8166, 0, 0, 8060, 974, 0, 0, 0, + 0, 8032, 8033, 8182, 8179, 0, 0, 0, 0, 0, 8146, 912, 0, 0, 0, 0, 0, 0, + 8151, 0, 0, 8162, 944, 0, 0, 8167, 0, 0, 0, 8180, 0, 0, 979, 0, 0, 0, 0, + 0, 980, 0, 0, 1031, 0, 0, 0, 0, 1232, 0, 1234, 0, 0, 0, 0, 1027, 0, 1024, + 0, 0, 0, 0, 1238, 0, 1025, 1217, 0, 1244, 0, 0, 1246, 0, 0, 0, 1037, 0, + 0, 0, 1250, 1049, 0, 1252, 0, 0, 0, 0, 1036, 0, 0, 0, 0, 1254, 0, 0, 0, + 1262, 1038, 0, 1264, 0, 0, 1266, 0, 0, 0, 1268, 0, 0, 0, 0, 0, 0, 1272, + 0, 0, 1260, 0, 0, 0, 0, 1233, 0, 1235, 0, 0, 0, 0, 1107, 0, 1104, 0, 0, + 0, 0, 1239, 0, 1105, 1218, 0, 1245, 0, 0, 1247, 0, 0, 0, 1117, 0, 0, 0, + 1251, 1081, 0, 1253, 0, 0, 0, 0, 1116, 0, 0, 0, 0, 1255, 0, 0, 0, 1263, + 1118, 0, 1265, 0, 0, 1267, 0, 0, 0, 1269, 0, 0, 0, 0, 0, 0, 1273, 0, 0, + 1261, 0, 0, 1111, 0, 0, 0, 1142, 0, 0, 1143, 0, 0, 0, 0, 0, 1242, 0, 0, + 1243, 0, 0, 1258, 0, 0, 0, 0, 0, 0, 1259, 0, 1570, 1571, 1573, 0, 1572, + 0, 0, 1574, 0, 0, 0, 0, 0, 0, 1730, 0, 0, 1747, 0, 0, 1728, 0, 0, 0, 0, + 2345, 0, 0, 2353, 0, 0, 2356, 0, 0, 0, 2507, 2508, 0, 0, 0, 2891, 2888, + 2892, 2964, 0, 0, 0, 0, 0, 3018, 3020, 0, 3019, 0, 0, 0, 0, 3144, 0, 0, + 0, 0, 3264, 0, 3274, 3271, 3272, 0, 3275, 0, 0, 0, 0, 3402, 3404, 0, + 3403, 0, 0, 0, 0, 3546, 3548, 3550, 0, 0, 0, 0, 3549, 0, 0, 0, 0, 0, + 4134, 0, 0, 0, 6918, 0, 0, 6920, 0, 0, 6922, 0, 0, 6924, 0, 0, 0, 0, 0, + 0, 6926, 0, 0, 6930, 0, 0, 6971, 0, 0, 6973, 0, 0, 0, 0, 0, 0, 6976, 0, + 0, 6977, 0, 0, 6979, 0, 0, 0, 7736, 0, 0, 7737, 0, 0, 0, 0, 0, 0, 7772, + 0, 0, 7773, 0, 0, 0, 0, 7784, 0, 0, 7785, 0, 0, 7852, 0, 0, 7862, 0, 0, + 0, 7853, 0, 0, 7863, 0, 0, 0, 7878, 0, 0, 7879, 0, 0, 7896, 0, 0, 7897, + 0, 0, 0, 0, 7938, 7940, 0, 0, 7942, 8064, 0, 7939, 7941, 0, 0, 7943, + 8065, 0, 0, 8066, 0, 0, 0, 0, 0, 0, 8067, 0, 0, 8068, 0, 0, 8069, 0, 0, + 8070, 0, 0, 0, 0, 0, 0, 8071, 0, 7946, 7948, 0, 0, 7950, 8072, 0, 7947, + 7949, 0, 0, 7951, 8073, 0, 0, 8074, 0, 0, 0, 0, 0, 0, 8075, 0, 0, 8076, + 0, 0, 8077, 0, 0, 8078, 0, 0, 0, 0, 0, 0, 8079, 0, 7954, 7956, 0, 7955, + 7957, 0, 0, 0, 0, 0, 7962, 7964, 0, 0, 0, 0, 0, 7963, 7965, 0, 7970, + 7972, 0, 0, 7974, 8080, 0, 7971, 7973, 0, 0, 7975, 8081, 0, 0, 8082, 0, + 0, 0, 0, 0, 0, 8083, 0, 0, 8084, 0, 0, 8085, 0, 0, 8086, 0, 0, 0, 0, 0, + 0, 8087, 0, 7978, 7980, 0, 0, 7982, 8088, 0, 7979, 7981, 0, 0, 7983, + 8089, 0, 0, 8090, 0, 0, 0, 0, 0, 0, 8091, 0, 0, 8092, 0, 0, 8093, 0, 0, + 8094, 0, 0, 0, 0, 0, 0, 8095, 0, 7986, 7988, 0, 0, 7990, 0, 0, 7987, + 7989, 0, 0, 7991, 0, 0, 0, 0, 0, 0, 7994, 7996, 0, 0, 0, 0, 0, 0, 7998, + 0, 0, 7995, 7997, 0, 0, 7999, 0, 0, 8002, 8004, 0, 8003, 8005, 0, 0, 0, + 0, 0, 8010, 8012, 0, 0, 0, 0, 0, 8011, 8013, 0, 8018, 8020, 0, 0, 8022, + 0, 0, 8019, 8021, 0, 0, 8023, 0, 0, 0, 0, 0, 0, 8027, 8029, 0, 0, 0, 0, + 0, 0, 8031, 0, 0, 8034, 8036, 0, 0, 8038, 8096, 0, 8035, 8037, 0, 0, + 8039, 8097, 0, 0, 8098, 0, 0, 8099, 0, 0, 0, 0, 0, 0, 8100, 0, 0, 8101, + 0, 0, 8102, 0, 0, 8103, 0, 0, 0, 0, 0, 8042, 8044, 0, 0, 8046, 8104, 0, + 8043, 8045, 0, 0, 8047, 8105, 0, 0, 8106, 0, 0, 8107, 0, 0, 0, 0, 0, 0, + 8108, 0, 0, 8109, 0, 0, 8110, 0, 0, 8111, 0, 0, 0, 0, 0, 0, 8114, 0, 0, + 8130, 0, 0, 8178, 0, 0, 8119, 0, 0, 0, 0, 0, 8141, 8142, 0, 0, 8143, 0, + 0, 0, 8135, 0, 0, 8183, 0, 0, 0, 0, 0, 8157, 8158, 0, 0, 0, 0, 0, 0, + 8159, 0, 8602, 0, 0, 8603, 0, 0, 0, 0, 0, 0, 8622, 0, 0, 8653, 0, 0, + 8655, 0, 0, 8654, 0, 0, 0, 0, 0, 0, 8708, 0, 0, 8713, 0, 0, 8716, 0, 0, + 8740, 0, 0, 0, 0, 0, 0, 8742, 0, 0, 8769, 0, 0, 8772, 0, 0, 8775, 0, 0, + 0, 0, 0, 0, 8777, 0, 0, 8813, 0, 0, 8802, 0, 0, 8816, 0, 0, 0, 0, 0, 0, + 8817, 0, 0, 8820, 0, 0, 8821, 0, 0, 8824, 0, 0, 0, 0, 0, 0, 8825, 0, 0, + 8832, 0, 0, 8833, 0, 0, 8928, 0, 0, 0, 0, 0, 0, 8929, 0, 0, 8836, 0, 0, + 8837, 0, 0, 8840, 0, 0, 0, 0, 0, 0, 8841, 0, 0, 8930, 0, 0, 8931, 0, 0, + 8876, 0, 0, 0, 0, 0, 0, 8877, 0, 0, 8878, 0, 0, 8879, 0, 0, 8938, 0, 0, + 0, 0, 0, 0, 8939, 0, 0, 8940, 0, 0, 8941, 0, 0, 0, 12436, 0, 0, 12364, 0, + 0, 0, 0, 0, 0, 12366, 0, 0, 12368, 0, 0, 12370, 0, 0, 12372, 0, 0, 0, 0, + 0, 0, 12374, 0, 0, 12376, 0, 0, 12378, 0, 0, 12380, 0, 0, 0, 0, 0, 0, + 12382, 0, 0, 12384, 0, 0, 12386, 0, 0, 12389, 0, 0, 0, 0, 0, 0, 12391, 0, + 0, 12393, 0, 0, 12400, 12401, 0, 12403, 12404, 0, 0, 0, 0, 0, 12406, + 12407, 0, 0, 0, 0, 0, 12409, 12410, 0, 12412, 12413, 0, 12446, 0, 0, 0, + 0, 0, 0, 12532, 0, 0, 12460, 0, 0, 12462, 0, 0, 12464, 0, 0, 0, 0, 0, 0, + 12466, 0, 0, 12468, 0, 0, 12470, 0, 0, 12472, 0, 0, 0, 0, 0, 0, 12474, 0, + 0, 12476, 0, 0, 12478, 0, 0, 12480, 0, 0, 0, 0, 0, 0, 12482, 0, 0, 12485, + 0, 0, 12487, 0, 0, 12489, 0, 0, 0, 0, 0, 0, 12496, 12497, 0, 0, 0, 0, 0, + 12499, 12500, 0, 12502, 12503, 0, 12505, 12506, 0, 0, 0, 0, 0, 12508, + 12509, 0, 0, 0, 0, 0, 12535, 0, 0, 12536, 0, 0, 12537, 0, 0, 0, 0, 0, 0, + 12538, 0, 0, 12542, 0, 0, 0, 0, 69786, 0, 0, 69788, 0, 0, 69803, 0, 0, 0, + 69934, 0, 0, 69935, 0, 0, 0, 70475, 70476, 0, 0, 0, 70844, 70843, 70846, + 0, 0, 0, 71098, 0, 0, 71099, 0, 0, 0, 71992, }; static const change_record change_records_3_2_0[] = { @@ -6008,53 +6076,56 @@ static const unsigned char changes_3_2_0_index[] = { 2, 2, 2, 2, 2, 2, 2, 114, 115, 116, 117, 118, 119, 2, 2, 120, 121, 122, 2, 123, 124, 125, 126, 127, 128, 2, 129, 130, 131, 132, 133, 134, 2, 51, 51, 135, 2, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 2, - 147, 2, 148, 149, 150, 151, 152, 153, 154, 155, 156, 2, 157, 158, 2, 159, - 160, 161, 162, 2, 163, 164, 2, 165, 166, 167, 2, 2, 168, 169, 170, 171, - 2, 172, 2, 173, 51, 51, 51, 51, 51, 51, 51, 174, 175, 51, 176, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, 51, - 51, 51, 51, 177, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, 178, 2, 2, 2, 2, 2, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 2, 158, 159, 2, + 160, 161, 162, 163, 2, 164, 165, 166, 167, 168, 169, 2, 2, 170, 171, 172, + 173, 2, 174, 2, 175, 51, 51, 51, 51, 51, 51, 51, 176, 177, 51, 178, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, + 51, 51, 51, 51, 179, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, 180, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, 179, 180, 181, - 182, 2, 2, 2, 2, 89, 183, 184, 185, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, 181, 182, + 183, 184, 2, 2, 2, 2, 185, 186, 187, 188, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 103, 51, 51, 51, 51, 51, 186, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 51, 51, 51, 103, 51, 51, 51, 51, 51, 51, 51, 51, 51, 189, 190, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 187, 51, 51, 188, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 189, 190, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 191, 51, + 51, 192, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 193, 194, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 191, 192, 193, 194, 195, 2, 2, 196, 2, - 2, 2, 197, 198, 199, 51, 51, 51, 51, 51, 200, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 201, 2, 202, 2, 2, 203, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 204, 205, 2, - 2, 2, 2, 2, 206, 207, 208, 2, 209, 210, 2, 2, 211, 212, 213, 214, 215, 2, - 51, 51, 51, 51, 51, 51, 51, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 225, 226, 98, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 87, 227, 2, 228, 229, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 195, 196, 197, 198, 199, + 2, 2, 200, 2, 2, 2, 201, 202, 203, 51, 51, 51, 51, 51, 204, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 205, 2, 206, 2, 2, 207, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 51, 208, 209, 2, 2, 2, 2, 2, 210, 211, 212, 2, 213, 214, 2, 2, 215, 216, + 51, 217, 218, 2, 51, 51, 51, 51, 51, 51, 51, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 51, 228, 2, 2, 2, 2, 2, 2, 2, 2, 229, 230, 98, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 87, 231, 2, 232, 233, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 230, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 231, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 232, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 234, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 235, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 236, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 233, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 237, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 238, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 239, 51, 240, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 234, 51, 235, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 236, 51, 51, + 51, 51, 51, 51, 241, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 242, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 234, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 237, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 230, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 51, 51, 51, 51, 51, 243, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -6287,9 +6358,9 @@ static const unsigned char changes_3_2_0_index[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 244, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 51, 238, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -6351,9 +6422,7 @@ static const unsigned char changes_3_2_0_index[] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static const unsigned char changes_3_2_0_data[] = { @@ -6439,8 +6508,8 @@ static const unsigned char changes_3_2_0_data[] = { 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6467,7 +6536,7 @@ static const unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6485,12 +6554,12 @@ static const unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 20, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6607,7 +6676,7 @@ static const unsigned char changes_3_2_0_data[] = { 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -6741,7 +6810,7 @@ static const unsigned char changes_3_2_0_data[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -6770,7 +6839,7 @@ static const unsigned char changes_3_2_0_data[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6790,8 +6859,8 @@ static const unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, @@ -6838,8 +6907,8 @@ static const unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, @@ -6894,7 +6963,7 @@ static const unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6919,11 +6988,11 @@ static const unsigned char changes_3_2_0_data[] = { 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, @@ -6958,7 +7027,7 @@ static const unsigned char changes_3_2_0_data[] = { 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -7045,7 +7114,7 @@ static const unsigned char changes_3_2_0_data[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 0, + 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -7152,192 +7221,208 @@ static const unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, - 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, - 9, 9, 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, - 0, 9, 9, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 0, 9, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 9, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 9, 0, 0, + 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, - 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, - 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 0, 9, 9, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7352,160 +7437,160 @@ static const unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, + 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 57, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, - 9, 0, 9, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, - 0, 9, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 9, 0, 9, 0, 9, 0, 9, 9, 9, 0, 9, - 9, 0, 9, 0, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 9, 0, 9, 0, 0, 9, 9, 9, - 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 9, 9, 9, 9, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 9, 0, 9, + 0, 9, 0, 9, 9, 9, 0, 9, 9, 0, 9, 0, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, + 9, 0, 9, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, + 9, 9, 9, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, @@ -7517,9 +7602,9 @@ static const unsigned char changes_3_2_0_data[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -7537,54 +7622,65 @@ static const unsigned char changes_3_2_0_data[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, - 9, 9, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, - 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7594,42 +7690,47 @@ static const unsigned char changes_3_2_0_data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, diff --git a/Modules/unicodename_db.h b/Modules/unicodename_db.h index 60521106b18963a941d000858fc853888ead281f..793d5109ee80f5a678b5bbe1224081fa96c3c431 100644 --- a/Modules/unicodename_db.h +++ b/Modules/unicodename_db.h @@ -4,8 +4,8 @@ /* lexicon */ static const unsigned char lexicon[] = { - 76, 69, 84, 84, 69, 210, 83, 73, 71, 206, 87, 73, 84, 200, 83, 77, 65, - 76, 204, 83, 89, 76, 76, 65, 66, 76, 197, 67, 65, 80, 73, 84, 65, 204, + 76, 69, 84, 84, 69, 210, 83, 77, 65, 76, 204, 83, 73, 71, 206, 87, 73, + 84, 200, 83, 89, 76, 76, 65, 66, 76, 197, 67, 65, 80, 73, 84, 65, 204, 72, 73, 69, 82, 79, 71, 76, 89, 80, 200, 76, 65, 84, 73, 206, 65, 82, 65, 66, 73, 195, 67, 85, 78, 69, 73, 70, 79, 82, 205, 89, 201, 67, 74, 203, 77, 65, 84, 72, 69, 77, 65, 84, 73, 67, 65, 204, 69, 71, 89, 80, 84, 73, @@ -13,942 +13,946 @@ static const unsigned char lexicon[] = { 66, 79, 204, 68, 73, 71, 73, 212, 86, 79, 87, 69, 204, 84, 65, 78, 71, 85, 212, 70, 79, 82, 77, 128, 67, 65, 78, 65, 68, 73, 65, 206, 83, 89, 76, 76, 65, 66, 73, 67, 211, 83, 73, 71, 78, 87, 82, 73, 84, 73, 78, 199, - 84, 73, 77, 69, 211, 66, 65, 77, 85, 205, 65, 78, 196, 66, 79, 76, 196, - 65, 78, 65, 84, 79, 76, 73, 65, 206, 72, 65, 78, 71, 85, 204, 76, 73, 78, - 69, 65, 210, 78, 85, 77, 66, 69, 210, 71, 82, 69, 69, 203, 76, 73, 71, - 65, 84, 85, 82, 197, 77, 85, 83, 73, 67, 65, 204, 69, 84, 72, 73, 79, 80, - 73, 195, 70, 79, 210, 67, 79, 77, 66, 73, 78, 73, 78, 199, 193, 67, 89, - 82, 73, 76, 76, 73, 195, 73, 84, 65, 76, 73, 195, 84, 65, 77, 73, 204, - 78, 85, 83, 72, 213, 82, 65, 68, 73, 67, 65, 204, 83, 65, 78, 83, 45, 83, - 69, 82, 73, 198, 67, 73, 82, 67, 76, 69, 196, 83, 81, 85, 65, 82, 197, - 70, 73, 78, 65, 204, 84, 65, 201, 76, 69, 70, 212, 65, 82, 82, 79, 87, - 128, 68, 79, 85, 66, 76, 197, 82, 73, 71, 72, 212, 86, 65, 201, 83, 73, - 71, 78, 128, 72, 69, 78, 84, 65, 73, 71, 65, 78, 193, 65, 66, 79, 86, 69, - 128, 66, 76, 65, 67, 203, 87, 72, 73, 84, 197, 66, 69, 76, 79, 87, 128, - 65, 82, 82, 79, 215, 86, 65, 82, 73, 65, 84, 73, 79, 206, 65, 128, 66, - 82, 65, 73, 76, 76, 197, 80, 65, 84, 84, 69, 82, 206, 85, 128, 66, 89, - 90, 65, 78, 84, 73, 78, 197, 73, 128, 73, 83, 79, 76, 65, 84, 69, 196, - 75, 65, 84, 65, 75, 65, 78, 193, 79, 128, 77, 79, 68, 73, 70, 73, 69, - 210, 194, 77, 89, 65, 78, 77, 65, 210, 68, 79, 212, 79, 198, 77, 65, 82, - 75, 128, 75, 65, 78, 71, 88, 201, 75, 73, 75, 65, 75, 85, 201, 77, 69, - 78, 68, 197, 84, 73, 66, 69, 84, 65, 206, 86, 69, 82, 84, 73, 67, 65, - 204, 73, 78, 73, 84, 73, 65, 204, 72, 69, 65, 86, 217, 72, 77, 79, 78, - 199, 77, 69, 69, 205, 67, 79, 80, 84, 73, 195, 75, 72, 77, 69, 210, 65, - 66, 79, 86, 197, 82, 73, 71, 72, 84, 87, 65, 82, 68, 211, 67, 65, 82, 82, - 73, 69, 210, 89, 69, 200, 71, 69, 79, 82, 71, 73, 65, 206, 67, 72, 69, - 82, 79, 75, 69, 197, 77, 79, 78, 71, 79, 76, 73, 65, 206, 79, 78, 197, - 80, 76, 85, 211, 84, 87, 207, 79, 78, 69, 128, 68, 69, 86, 65, 78, 65, - 71, 65, 82, 201, 84, 87, 79, 128, 83, 81, 85, 65, 82, 69, 196, 80, 72, - 65, 83, 69, 45, 197, 83, 89, 77, 66, 79, 76, 128, 83, 84, 82, 79, 75, 69, - 128, 76, 69, 70, 84, 87, 65, 82, 68, 211, 67, 79, 78, 83, 79, 78, 65, 78, - 212, 77, 73, 65, 207, 86, 79, 67, 65, 76, 73, 195, 66, 79, 216, 77, 73, - 68, 68, 76, 197, 84, 73, 76, 197, 68, 85, 80, 76, 79, 89, 65, 206, 84, - 72, 82, 69, 197, 74, 79, 78, 71, 83, 69, 79, 78, 199, 77, 65, 82, 203, - 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 90, 69, 196, 84, 72, 65, 205, 71, - 79, 78, 68, 201, 72, 79, 79, 75, 128, 72, 69, 66, 82, 69, 215, 85, 208, - 71, 76, 65, 71, 79, 76, 73, 84, 73, 195, 76, 79, 215, 79, 86, 69, 210, - 83, 73, 89, 65, 209, 68, 82, 65, 87, 73, 78, 71, 211, 72, 73, 71, 200, - 77, 65, 76, 65, 89, 65, 76, 65, 205, 73, 78, 68, 69, 216, 80, 65, 72, 65, - 87, 200, 84, 72, 82, 69, 69, 128, 68, 79, 87, 206, 70, 79, 85, 82, 128, - 67, 72, 79, 83, 69, 79, 78, 199, 72, 65, 76, 70, 87, 73, 68, 84, 200, 72, - 65, 78, 68, 45, 70, 73, 83, 212, 77, 69, 82, 79, 73, 84, 73, 195, 66, 65, - 76, 73, 78, 69, 83, 197, 72, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 73, 195, 83, 67, 82, 73, 80, 212, 70, 73, 86, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 205, 80, 72, 65, 83, 69, 45, 196, 84, 79, 128, 65, 76, 67, - 72, 69, 77, 73, 67, 65, 204, 65, 76, 69, 198, 84, 79, 78, 197, 83, 73, - 78, 72, 65, 76, 193, 66, 65, 82, 128, 75, 65, 128, 78, 85, 77, 69, 82, - 73, 195, 72, 65, 76, 198, 66, 82, 65, 72, 77, 201, 72, 85, 78, 71, 65, - 82, 73, 65, 206, 80, 65, 128, 84, 72, 85, 77, 194, 84, 85, 82, 78, 69, - 196, 89, 65, 128, 66, 65, 82, 194, 77, 65, 128, 83, 73, 88, 128, 72, 65, - 200, 82, 65, 128, 84, 72, 79, 85, 83, 65, 78, 68, 128, 69, 73, 71, 72, - 84, 128, 76, 65, 128, 78, 79, 82, 84, 200, 70, 85, 76, 76, 87, 73, 68, - 84, 200, 76, 73, 71, 72, 212, 78, 65, 128, 83, 69, 86, 69, 78, 128, 66, - 82, 65, 67, 75, 69, 84, 128, 69, 81, 85, 65, 204, 76, 79, 78, 199, 78, - 73, 78, 69, 128, 83, 65, 128, 84, 65, 199, 68, 79, 77, 73, 78, 207, 65, - 67, 85, 84, 69, 128, 70, 82, 65, 75, 84, 85, 210, 72, 73, 82, 65, 71, 65, - 78, 193, 84, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 210, 70, 82, 65, - 67, 84, 73, 79, 206, 79, 80, 69, 206, 80, 72, 65, 83, 69, 45, 195, 84, - 69, 76, 85, 71, 213, 90, 90, 89, 88, 128, 90, 90, 89, 84, 128, 90, 90, - 89, 82, 88, 128, 90, 90, 89, 82, 128, 90, 90, 89, 80, 128, 90, 90, 89, - 65, 128, 90, 90, 89, 128, 90, 90, 85, 88, 128, 90, 90, 85, 82, 88, 128, - 90, 90, 85, 82, 128, 90, 90, 85, 80, 128, 90, 90, 85, 128, 90, 90, 83, - 89, 65, 128, 90, 90, 83, 65, 128, 90, 90, 79, 88, 128, 90, 90, 79, 80, - 128, 90, 90, 79, 128, 90, 90, 73, 88, 128, 90, 90, 73, 84, 128, 90, 90, - 73, 80, 128, 90, 90, 73, 69, 88, 128, 90, 90, 73, 69, 84, 128, 90, 90, - 73, 69, 80, 128, 90, 90, 73, 69, 128, 90, 90, 73, 128, 90, 90, 69, 88, - 128, 90, 90, 69, 80, 128, 90, 90, 69, 69, 128, 90, 90, 69, 128, 90, 90, - 65, 88, 128, 90, 90, 65, 84, 128, 90, 90, 65, 80, 128, 90, 90, 65, 65, - 128, 90, 90, 65, 128, 90, 89, 71, 79, 83, 128, 90, 87, 83, 80, 128, 90, - 87, 78, 74, 128, 90, 87, 78, 66, 83, 80, 128, 90, 87, 74, 128, 90, 87, - 202, 90, 87, 65, 82, 65, 75, 65, 89, 128, 90, 87, 65, 128, 90, 85, 84, - 128, 90, 85, 79, 88, 128, 90, 85, 79, 80, 128, 90, 85, 79, 128, 90, 85, - 77, 128, 90, 85, 66, 85, 82, 128, 90, 85, 53, 128, 90, 85, 181, 90, 213, - 90, 83, 72, 65, 128, 90, 82, 65, 128, 90, 81, 65, 80, 72, 193, 90, 79, - 84, 128, 90, 79, 79, 128, 90, 79, 77, 66, 73, 69, 128, 90, 79, 65, 128, - 90, 76, 65, 77, 193, 90, 76, 65, 128, 90, 76, 193, 90, 74, 69, 128, 90, - 73, 90, 50, 128, 90, 73, 81, 65, 65, 128, 90, 73, 80, 80, 69, 82, 45, 77, - 79, 85, 84, 200, 90, 73, 78, 79, 82, 128, 90, 73, 76, 68, 69, 128, 90, - 73, 71, 90, 65, 199, 90, 73, 71, 128, 90, 73, 68, 193, 90, 73, 66, 128, - 90, 73, 194, 90, 73, 51, 128, 90, 201, 90, 72, 89, 88, 128, 90, 72, 89, - 84, 128, 90, 72, 89, 82, 88, 128, 90, 72, 89, 82, 128, 90, 72, 89, 80, - 128, 90, 72, 89, 128, 90, 72, 87, 69, 128, 90, 72, 87, 65, 128, 90, 72, - 85, 88, 128, 90, 72, 85, 84, 128, 90, 72, 85, 82, 88, 128, 90, 72, 85, - 82, 128, 90, 72, 85, 80, 128, 90, 72, 85, 79, 88, 128, 90, 72, 85, 79, - 80, 128, 90, 72, 85, 79, 128, 90, 72, 85, 128, 90, 72, 79, 88, 128, 90, - 72, 79, 84, 128, 90, 72, 79, 80, 128, 90, 72, 79, 79, 128, 90, 72, 79, - 73, 128, 90, 72, 79, 128, 90, 72, 73, 86, 69, 84, 69, 128, 90, 72, 73, - 76, 128, 90, 72, 73, 128, 90, 72, 69, 88, 128, 90, 72, 69, 84, 128, 90, - 72, 69, 80, 128, 90, 72, 69, 69, 128, 90, 72, 69, 128, 90, 72, 197, 90, - 72, 65, 89, 73, 78, 128, 90, 72, 65, 88, 128, 90, 72, 65, 84, 128, 90, - 72, 65, 82, 128, 90, 72, 65, 80, 128, 90, 72, 65, 73, 78, 128, 90, 72, - 65, 65, 128, 90, 72, 65, 128, 90, 72, 128, 90, 69, 85, 83, 128, 90, 69, - 84, 65, 128, 90, 69, 82, 79, 128, 90, 69, 82, 207, 90, 69, 78, 128, 90, - 69, 77, 76, 89, 65, 128, 90, 69, 77, 76, 74, 65, 128, 90, 69, 66, 82, - 193, 90, 69, 50, 128, 90, 197, 90, 65, 89, 78, 128, 90, 65, 89, 73, 78, - 45, 89, 79, 68, 72, 128, 90, 65, 89, 73, 78, 128, 90, 65, 89, 73, 206, - 90, 65, 86, 73, 89, 65, 78, 73, 128, 90, 65, 84, 65, 128, 90, 65, 82, 81, - 65, 128, 90, 65, 82, 76, 128, 90, 65, 81, 69, 198, 90, 65, 78, 65, 66, - 65, 90, 65, 210, 90, 65, 77, 88, 128, 90, 65, 76, 128, 90, 65, 204, 90, - 65, 73, 78, 128, 90, 65, 73, 206, 90, 65, 73, 128, 90, 65, 72, 128, 90, - 65, 200, 90, 65, 71, 128, 90, 65, 69, 70, 128, 90, 65, 55, 128, 90, 193, - 90, 48, 49, 54, 72, 128, 90, 48, 49, 54, 71, 128, 90, 48, 49, 54, 70, - 128, 90, 48, 49, 54, 69, 128, 90, 48, 49, 54, 68, 128, 90, 48, 49, 54, - 67, 128, 90, 48, 49, 54, 66, 128, 90, 48, 49, 54, 65, 128, 90, 48, 49, - 54, 128, 90, 48, 49, 53, 73, 128, 90, 48, 49, 53, 72, 128, 90, 48, 49, - 53, 71, 128, 90, 48, 49, 53, 70, 128, 90, 48, 49, 53, 69, 128, 90, 48, - 49, 53, 68, 128, 90, 48, 49, 53, 67, 128, 90, 48, 49, 53, 66, 128, 90, - 48, 49, 53, 65, 128, 90, 48, 49, 53, 128, 90, 48, 49, 52, 128, 90, 48, - 49, 51, 128, 90, 48, 49, 50, 128, 90, 48, 49, 49, 128, 90, 48, 49, 48, - 128, 90, 48, 48, 57, 128, 90, 48, 48, 56, 128, 90, 48, 48, 55, 128, 90, - 48, 48, 54, 128, 90, 48, 48, 53, 65, 128, 90, 48, 48, 53, 128, 90, 48, - 48, 52, 65, 128, 90, 48, 48, 52, 128, 90, 48, 48, 51, 66, 128, 90, 48, - 48, 51, 65, 128, 90, 48, 48, 51, 128, 90, 48, 48, 50, 68, 128, 90, 48, - 48, 50, 67, 128, 90, 48, 48, 50, 66, 128, 90, 48, 48, 50, 65, 128, 90, - 48, 48, 50, 128, 90, 48, 48, 49, 128, 90, 128, 218, 89, 89, 88, 128, 89, - 89, 84, 128, 89, 89, 82, 88, 128, 89, 89, 82, 128, 89, 89, 80, 128, 89, - 89, 69, 128, 89, 89, 65, 65, 128, 89, 89, 65, 128, 89, 89, 128, 89, 87, - 79, 79, 128, 89, 87, 79, 128, 89, 87, 73, 73, 128, 89, 87, 73, 128, 89, - 87, 69, 128, 89, 87, 65, 65, 128, 89, 87, 65, 128, 89, 86, 128, 89, 85, - 88, 128, 89, 85, 87, 79, 81, 128, 89, 85, 85, 75, 65, 76, 69, 65, 80, 73, - 78, 84, 85, 128, 89, 85, 85, 128, 89, 85, 84, 128, 89, 85, 83, 128, 89, - 85, 211, 89, 85, 82, 88, 128, 89, 85, 82, 128, 89, 85, 81, 128, 89, 85, - 209, 89, 85, 80, 128, 89, 85, 79, 88, 128, 89, 85, 79, 84, 128, 89, 85, - 79, 80, 128, 89, 85, 79, 77, 128, 89, 85, 79, 128, 89, 85, 78, 128, 89, - 85, 77, 128, 89, 85, 74, 128, 89, 85, 73, 128, 89, 85, 69, 81, 128, 89, - 85, 69, 128, 89, 85, 68, 72, 128, 89, 85, 68, 200, 89, 85, 65, 78, 128, - 89, 85, 65, 69, 78, 128, 89, 85, 45, 89, 69, 79, 128, 89, 85, 45, 89, 69, - 128, 89, 85, 45, 85, 128, 89, 85, 45, 79, 128, 89, 85, 45, 73, 128, 89, - 85, 45, 69, 79, 128, 89, 85, 45, 69, 128, 89, 85, 45, 65, 69, 128, 89, - 85, 45, 65, 128, 89, 85, 45, 52, 128, 89, 85, 45, 51, 128, 89, 85, 45, - 50, 128, 89, 85, 45, 49, 128, 89, 85, 128, 89, 213, 89, 82, 89, 128, 89, - 80, 83, 73, 76, 73, 128, 89, 80, 79, 82, 82, 79, 73, 128, 89, 80, 79, 75, - 82, 73, 83, 73, 83, 128, 89, 80, 79, 75, 82, 73, 83, 73, 211, 89, 80, 79, - 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, 89, 79, 89, 128, 89, 79, 88, - 128, 89, 79, 87, 68, 128, 89, 79, 85, 84, 72, 70, 85, 76, 78, 69, 83, 83, - 128, 89, 79, 85, 84, 72, 70, 85, 204, 89, 79, 213, 89, 79, 84, 128, 89, - 79, 82, 73, 128, 89, 79, 81, 128, 89, 79, 209, 89, 79, 80, 128, 89, 79, - 79, 128, 89, 79, 77, 79, 128, 89, 79, 71, 72, 128, 89, 79, 68, 128, 89, - 79, 196, 89, 79, 65, 128, 89, 79, 45, 89, 79, 128, 89, 79, 45, 89, 69, - 79, 128, 89, 79, 45, 89, 65, 69, 128, 89, 79, 45, 89, 65, 128, 89, 79, - 45, 79, 128, 89, 79, 45, 73, 128, 89, 79, 45, 69, 79, 128, 89, 79, 45, - 65, 69, 128, 89, 79, 45, 65, 128, 89, 79, 45, 54, 128, 89, 79, 45, 53, - 128, 89, 79, 45, 52, 128, 89, 79, 45, 51, 128, 89, 79, 45, 50, 128, 89, - 79, 45, 49, 128, 89, 207, 89, 73, 90, 69, 84, 128, 89, 73, 88, 128, 89, - 73, 87, 78, 128, 89, 73, 84, 128, 89, 73, 80, 128, 89, 73, 78, 71, 128, - 89, 73, 73, 128, 89, 73, 72, 128, 89, 73, 199, 89, 73, 69, 88, 128, 89, - 73, 69, 84, 128, 89, 73, 69, 80, 128, 89, 73, 69, 69, 128, 89, 73, 69, - 128, 89, 73, 68, 68, 73, 83, 200, 89, 73, 45, 85, 128, 89, 73, 128, 89, - 72, 69, 128, 89, 70, 69, 83, 73, 83, 128, 89, 70, 69, 83, 73, 211, 89, - 70, 69, 206, 89, 69, 89, 128, 89, 69, 87, 128, 89, 69, 85, 88, 128, 89, - 69, 85, 82, 65, 69, 128, 89, 69, 85, 81, 128, 89, 69, 85, 77, 128, 89, - 69, 85, 65, 69, 84, 128, 89, 69, 85, 65, 69, 128, 89, 69, 84, 73, 86, - 128, 89, 69, 83, 84, 85, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 83, 83, - 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 89, 69, 83, 73, 69, 85, 78, 71, - 45, 83, 73, 79, 83, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 80, 65, 78, - 83, 73, 79, 83, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 77, 73, 69, 85, - 77, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 75, 73, 89, 69, 79, 75, 128, - 89, 69, 83, 73, 69, 85, 78, 71, 45, 75, 72, 73, 69, 85, 75, 72, 128, 89, - 69, 83, 73, 69, 85, 78, 71, 45, 72, 73, 69, 85, 72, 128, 89, 69, 83, 73, - 69, 85, 78, 71, 128, 89, 69, 82, 85, 128, 89, 69, 82, 213, 89, 69, 82, - 73, 128, 89, 69, 82, 65, 200, 89, 69, 82, 128, 89, 69, 79, 82, 73, 78, - 72, 73, 69, 85, 72, 128, 89, 69, 79, 45, 89, 65, 128, 89, 69, 79, 45, 85, - 128, 89, 69, 79, 45, 79, 128, 89, 69, 78, 73, 83, 69, 201, 89, 69, 78, - 65, 80, 128, 89, 69, 78, 128, 89, 69, 206, 89, 69, 76, 76, 79, 87, 128, - 89, 69, 76, 76, 79, 215, 89, 69, 73, 78, 128, 89, 69, 72, 128, 89, 69, - 69, 71, 128, 89, 69, 69, 128, 89, 69, 65, 210, 89, 69, 65, 128, 89, 65, - 90, 90, 128, 89, 65, 90, 72, 128, 89, 65, 90, 128, 89, 65, 89, 68, 128, - 89, 65, 89, 65, 78, 78, 65, 128, 89, 65, 89, 128, 89, 65, 87, 78, 73, 78, - 199, 89, 65, 87, 78, 128, 89, 65, 87, 128, 89, 65, 86, 128, 89, 65, 85, - 128, 89, 65, 84, 84, 128, 89, 65, 84, 73, 128, 89, 65, 84, 72, 128, 89, - 65, 84, 128, 89, 65, 83, 83, 128, 89, 65, 83, 72, 128, 89, 65, 83, 128, - 89, 65, 82, 82, 128, 89, 65, 82, 78, 128, 89, 65, 82, 128, 89, 65, 210, - 89, 65, 81, 128, 89, 65, 80, 128, 89, 65, 78, 83, 65, 89, 65, 128, 89, - 65, 78, 71, 128, 89, 65, 78, 199, 89, 65, 78, 128, 89, 65, 77, 79, 75, - 128, 89, 65, 77, 65, 75, 75, 65, 78, 128, 89, 65, 77, 128, 89, 65, 76, - 128, 89, 65, 75, 72, 72, 128, 89, 65, 75, 72, 128, 89, 65, 75, 65, 83, - 72, 128, 89, 65, 75, 128, 89, 65, 74, 85, 82, 86, 69, 68, 73, 195, 89, - 65, 74, 128, 89, 65, 73, 128, 89, 65, 72, 72, 128, 89, 65, 72, 128, 89, - 65, 71, 78, 128, 89, 65, 71, 72, 72, 128, 89, 65, 71, 72, 128, 89, 65, - 71, 128, 89, 65, 70, 213, 89, 65, 70, 128, 89, 65, 69, 77, 77, 65, 69, - 128, 89, 65, 68, 72, 128, 89, 65, 68, 68, 72, 128, 89, 65, 68, 68, 128, - 89, 65, 68, 128, 89, 65, 67, 72, 128, 89, 65, 66, 72, 128, 89, 65, 66, - 128, 89, 65, 65, 82, 85, 128, 89, 65, 65, 73, 128, 89, 65, 65, 68, 79, - 128, 89, 65, 45, 89, 79, 128, 89, 65, 45, 85, 128, 89, 65, 45, 79, 128, - 89, 65, 45, 53, 128, 89, 65, 45, 52, 128, 89, 65, 45, 51, 128, 89, 65, - 45, 50, 128, 89, 65, 45, 49, 128, 89, 48, 48, 56, 128, 89, 48, 48, 55, - 128, 89, 48, 48, 54, 128, 89, 48, 48, 53, 128, 89, 48, 48, 52, 128, 89, - 48, 48, 51, 128, 89, 48, 48, 50, 128, 89, 48, 48, 49, 65, 128, 89, 48, - 48, 49, 128, 89, 45, 67, 82, 69, 197, 88, 89, 88, 128, 88, 89, 85, 128, - 88, 89, 84, 128, 88, 89, 82, 88, 128, 88, 89, 82, 128, 88, 89, 80, 128, - 88, 89, 79, 79, 74, 128, 88, 89, 79, 79, 128, 88, 89, 79, 128, 88, 89, - 73, 128, 88, 89, 69, 69, 205, 88, 89, 69, 69, 128, 88, 89, 69, 128, 88, - 89, 65, 65, 128, 88, 89, 65, 128, 88, 89, 128, 88, 87, 73, 128, 88, 87, - 69, 69, 128, 88, 87, 69, 128, 88, 87, 65, 65, 128, 88, 87, 65, 128, 88, - 87, 128, 88, 215, 88, 86, 69, 128, 88, 86, 65, 128, 88, 85, 79, 88, 128, - 88, 85, 79, 128, 88, 85, 128, 88, 83, 72, 65, 65, 89, 65, 84, 72, 73, 89, - 65, 128, 88, 79, 88, 128, 88, 79, 84, 128, 88, 79, 82, 128, 88, 79, 80, - 72, 128, 88, 79, 80, 128, 88, 79, 65, 128, 88, 79, 128, 88, 73, 88, 128, - 88, 73, 84, 128, 88, 73, 82, 79, 206, 88, 73, 80, 128, 88, 73, 69, 88, - 128, 88, 73, 69, 84, 128, 88, 73, 69, 80, 128, 88, 73, 69, 128, 88, 73, - 65, 78, 71, 81, 201, 88, 73, 65, 66, 128, 88, 73, 128, 88, 71, 128, 88, - 69, 89, 78, 128, 88, 69, 83, 84, 69, 211, 88, 69, 72, 128, 88, 69, 69, - 128, 88, 69, 128, 88, 65, 85, 83, 128, 88, 65, 85, 128, 88, 65, 80, 72, - 128, 88, 65, 78, 128, 88, 65, 65, 128, 88, 65, 128, 88, 48, 48, 56, 65, - 128, 88, 48, 48, 56, 128, 88, 48, 48, 55, 128, 88, 48, 48, 54, 65, 128, - 88, 48, 48, 54, 128, 88, 48, 48, 53, 128, 88, 48, 48, 52, 66, 128, 88, - 48, 48, 52, 65, 128, 88, 48, 48, 52, 128, 88, 48, 48, 51, 128, 88, 48, - 48, 50, 128, 88, 48, 48, 49, 128, 88, 45, 216, 87, 90, 128, 87, 89, 78, - 78, 128, 87, 89, 78, 206, 87, 86, 73, 128, 87, 86, 69, 128, 87, 86, 65, - 128, 87, 86, 128, 87, 85, 80, 128, 87, 85, 79, 88, 128, 87, 85, 79, 80, - 128, 87, 85, 79, 128, 87, 85, 78, 74, 207, 87, 85, 78, 128, 87, 85, 76, - 85, 128, 87, 85, 76, 213, 87, 85, 73, 128, 87, 85, 69, 128, 87, 85, 65, - 69, 84, 128, 87, 85, 65, 69, 78, 128, 87, 85, 128, 87, 82, 217, 87, 82, - 79, 78, 71, 128, 87, 82, 73, 83, 212, 87, 82, 73, 78, 75, 76, 69, 83, - 128, 87, 82, 73, 78, 75, 76, 69, 211, 87, 82, 73, 78, 75, 76, 69, 68, - 128, 87, 82, 69, 83, 84, 76, 69, 82, 83, 128, 87, 82, 69, 78, 67, 72, - 128, 87, 82, 69, 65, 84, 200, 87, 82, 65, 80, 80, 69, 196, 87, 82, 65, - 80, 128, 87, 79, 88, 128, 87, 79, 87, 128, 87, 79, 82, 83, 72, 73, 80, - 128, 87, 79, 82, 82, 73, 69, 196, 87, 79, 82, 76, 196, 87, 79, 82, 75, - 69, 82, 128, 87, 79, 82, 75, 128, 87, 79, 82, 203, 87, 79, 82, 68, 83, - 80, 65, 67, 69, 128, 87, 79, 82, 196, 87, 79, 80, 128, 87, 79, 79, 78, - 128, 87, 79, 79, 76, 128, 87, 79, 79, 68, 83, 45, 67, 82, 69, 197, 87, - 79, 79, 68, 128, 87, 79, 78, 128, 87, 79, 206, 87, 79, 77, 69, 78, 211, - 87, 79, 77, 69, 206, 87, 79, 77, 65, 78, 211, 87, 79, 77, 65, 78, 128, - 87, 79, 77, 65, 206, 87, 79, 76, 79, 83, 79, 128, 87, 79, 76, 198, 87, - 79, 69, 128, 87, 79, 65, 128, 87, 79, 45, 55, 128, 87, 79, 45, 54, 128, - 87, 79, 45, 53, 128, 87, 79, 45, 52, 128, 87, 79, 45, 51, 128, 87, 79, - 45, 50, 128, 87, 79, 45, 49, 128, 87, 73, 84, 72, 79, 85, 212, 87, 73, - 84, 72, 73, 78, 128, 87, 73, 84, 72, 73, 206, 87, 73, 82, 69, 196, 87, - 73, 78, 84, 69, 82, 128, 87, 73, 78, 75, 73, 78, 199, 87, 73, 78, 75, - 128, 87, 73, 78, 74, 65, 128, 87, 73, 78, 71, 83, 128, 87, 73, 78, 69, - 128, 87, 73, 78, 197, 87, 73, 78, 68, 85, 128, 87, 73, 78, 68, 79, 87, - 128, 87, 73, 78, 68, 128, 87, 73, 78, 196, 87, 73, 78, 128, 87, 73, 76, - 84, 69, 196, 87, 73, 71, 78, 89, 65, 78, 128, 87, 73, 71, 71, 76, 217, - 87, 73, 71, 71, 76, 69, 83, 128, 87, 73, 68, 84, 72, 128, 87, 73, 68, 69, - 78, 73, 78, 199, 87, 73, 68, 69, 45, 72, 69, 65, 68, 69, 196, 87, 73, 68, - 197, 87, 73, 65, 78, 71, 87, 65, 65, 75, 128, 87, 73, 65, 78, 71, 128, - 87, 73, 45, 53, 128, 87, 73, 45, 52, 128, 87, 73, 45, 51, 128, 87, 73, - 45, 50, 128, 87, 73, 45, 49, 128, 87, 72, 79, 76, 197, 87, 72, 73, 84, - 69, 45, 70, 69, 65, 84, 72, 69, 82, 69, 196, 87, 72, 73, 84, 69, 128, 87, - 72, 69, 69, 76, 69, 196, 87, 72, 69, 69, 76, 67, 72, 65, 73, 82, 128, 87, - 72, 69, 69, 76, 67, 72, 65, 73, 210, 87, 72, 69, 69, 76, 128, 87, 72, 69, - 69, 204, 87, 72, 69, 65, 84, 128, 87, 72, 65, 76, 69, 128, 87, 72, 128, - 87, 71, 128, 87, 69, 88, 128, 87, 69, 85, 88, 128, 87, 69, 212, 87, 69, - 83, 84, 69, 82, 206, 87, 69, 83, 84, 45, 67, 82, 69, 197, 87, 69, 83, 84, - 128, 87, 69, 83, 212, 87, 69, 80, 128, 87, 69, 79, 128, 87, 69, 78, 128, - 87, 69, 76, 76, 128, 87, 69, 73, 71, 72, 212, 87, 69, 73, 69, 82, 83, 84, - 82, 65, 83, 211, 87, 69, 73, 128, 87, 69, 69, 78, 128, 87, 69, 68, 71, - 69, 45, 84, 65, 73, 76, 69, 196, 87, 69, 68, 71, 69, 128, 87, 69, 68, 68, - 73, 78, 71, 128, 87, 69, 66, 128, 87, 69, 65, 82, 217, 87, 69, 65, 80, - 79, 78, 128, 87, 69, 45, 52, 128, 87, 69, 45, 51, 128, 87, 69, 45, 50, - 128, 87, 69, 45, 49, 128, 87, 67, 128, 87, 66, 128, 87, 65, 89, 128, 87, - 65, 217, 87, 65, 88, 73, 78, 199, 87, 65, 88, 128, 87, 65, 87, 45, 65, - 89, 73, 78, 45, 82, 69, 83, 72, 128, 87, 65, 87, 128, 87, 65, 215, 87, - 65, 86, 217, 87, 65, 86, 73, 78, 199, 87, 65, 86, 69, 83, 128, 87, 65, - 86, 69, 128, 87, 65, 86, 197, 87, 65, 85, 128, 87, 65, 84, 84, 79, 128, - 87, 65, 84, 69, 82, 77, 69, 76, 79, 78, 128, 87, 65, 84, 69, 82, 128, 87, - 65, 84, 69, 210, 87, 65, 84, 67, 72, 128, 87, 65, 84, 128, 87, 65, 83, - 84, 73, 78, 71, 128, 87, 65, 83, 84, 69, 66, 65, 83, 75, 69, 84, 128, 87, - 65, 83, 83, 65, 76, 76, 65, 77, 128, 87, 65, 83, 76, 65, 128, 87, 65, 83, - 76, 193, 87, 65, 83, 65, 76, 76, 65, 77, 128, 87, 65, 83, 65, 76, 76, 65, - 205, 87, 65, 82, 78, 73, 78, 199, 87, 65, 82, 65, 78, 199, 87, 65, 81, - 70, 65, 128, 87, 65, 80, 128, 87, 65, 78, 73, 78, 199, 87, 65, 78, 71, - 75, 85, 79, 81, 128, 87, 65, 78, 68, 69, 82, 69, 82, 128, 87, 65, 78, 67, - 72, 207, 87, 65, 78, 128, 87, 65, 76, 76, 80, 76, 65, 78, 197, 87, 65, - 76, 76, 128, 87, 65, 76, 204, 87, 65, 76, 75, 128, 87, 65, 76, 203, 87, - 65, 73, 84, 73, 78, 71, 128, 87, 65, 73, 83, 84, 128, 87, 65, 73, 128, - 87, 65, 70, 70, 76, 69, 128, 87, 65, 69, 78, 128, 87, 65, 69, 128, 87, - 65, 68, 68, 65, 128, 87, 65, 65, 86, 85, 128, 87, 65, 45, 53, 128, 87, - 65, 45, 52, 128, 87, 65, 45, 51, 128, 87, 65, 45, 50, 128, 87, 65, 45, - 49, 128, 87, 48, 50, 53, 128, 87, 48, 50, 52, 65, 128, 87, 48, 50, 52, - 128, 87, 48, 50, 51, 128, 87, 48, 50, 50, 128, 87, 48, 50, 49, 128, 87, - 48, 50, 48, 128, 87, 48, 49, 57, 128, 87, 48, 49, 56, 65, 128, 87, 48, - 49, 56, 128, 87, 48, 49, 55, 65, 128, 87, 48, 49, 55, 128, 87, 48, 49, - 54, 128, 87, 48, 49, 53, 128, 87, 48, 49, 52, 65, 128, 87, 48, 49, 52, - 128, 87, 48, 49, 51, 128, 87, 48, 49, 50, 128, 87, 48, 49, 49, 128, 87, - 48, 49, 48, 65, 128, 87, 48, 49, 48, 128, 87, 48, 48, 57, 65, 128, 87, - 48, 48, 57, 128, 87, 48, 48, 56, 128, 87, 48, 48, 55, 128, 87, 48, 48, - 54, 128, 87, 48, 48, 53, 128, 87, 48, 48, 52, 128, 87, 48, 48, 51, 65, - 128, 87, 48, 48, 51, 128, 87, 48, 48, 50, 128, 87, 48, 48, 49, 128, 86, - 90, 77, 69, 84, 128, 86, 89, 88, 128, 86, 89, 84, 128, 86, 89, 82, 88, - 128, 86, 89, 82, 128, 86, 89, 80, 128, 86, 89, 128, 86, 87, 74, 128, 86, - 87, 65, 128, 86, 87, 128, 86, 85, 88, 128, 86, 85, 85, 128, 86, 85, 84, - 128, 86, 85, 82, 88, 128, 86, 85, 82, 128, 86, 85, 80, 128, 86, 85, 76, - 71, 65, 210, 86, 85, 76, 67, 65, 78, 85, 83, 128, 86, 85, 69, 81, 128, - 86, 84, 83, 128, 86, 84, 128, 86, 83, 57, 57, 128, 86, 83, 57, 56, 128, - 86, 83, 57, 55, 128, 86, 83, 57, 54, 128, 86, 83, 57, 53, 128, 86, 83, - 57, 52, 128, 86, 83, 57, 51, 128, 86, 83, 57, 50, 128, 86, 83, 57, 49, - 128, 86, 83, 57, 48, 128, 86, 83, 57, 128, 86, 83, 56, 57, 128, 86, 83, - 56, 56, 128, 86, 83, 56, 55, 128, 86, 83, 56, 54, 128, 86, 83, 56, 53, - 128, 86, 83, 56, 52, 128, 86, 83, 56, 51, 128, 86, 83, 56, 50, 128, 86, - 83, 56, 49, 128, 86, 83, 56, 48, 128, 86, 83, 56, 128, 86, 83, 55, 57, - 128, 86, 83, 55, 56, 128, 86, 83, 55, 55, 128, 86, 83, 55, 54, 128, 86, - 83, 55, 53, 128, 86, 83, 55, 52, 128, 86, 83, 55, 51, 128, 86, 83, 55, - 50, 128, 86, 83, 55, 49, 128, 86, 83, 55, 48, 128, 86, 83, 55, 128, 86, - 83, 54, 57, 128, 86, 83, 54, 56, 128, 86, 83, 54, 55, 128, 86, 83, 54, - 54, 128, 86, 83, 54, 53, 128, 86, 83, 54, 52, 128, 86, 83, 54, 51, 128, - 86, 83, 54, 50, 128, 86, 83, 54, 49, 128, 86, 83, 54, 48, 128, 86, 83, - 54, 128, 86, 83, 53, 57, 128, 86, 83, 53, 56, 128, 86, 83, 53, 55, 128, - 86, 83, 53, 54, 128, 86, 83, 53, 53, 128, 86, 83, 53, 52, 128, 86, 83, - 53, 51, 128, 86, 83, 53, 50, 128, 86, 83, 53, 49, 128, 86, 83, 53, 48, - 128, 86, 83, 53, 128, 86, 83, 52, 57, 128, 86, 83, 52, 56, 128, 86, 83, - 52, 55, 128, 86, 83, 52, 54, 128, 86, 83, 52, 53, 128, 86, 83, 52, 52, - 128, 86, 83, 52, 51, 128, 86, 83, 52, 50, 128, 86, 83, 52, 49, 128, 86, - 83, 52, 48, 128, 86, 83, 52, 128, 86, 83, 51, 57, 128, 86, 83, 51, 56, - 128, 86, 83, 51, 55, 128, 86, 83, 51, 54, 128, 86, 83, 51, 53, 128, 86, - 83, 51, 52, 128, 86, 83, 51, 51, 128, 86, 83, 51, 50, 128, 86, 83, 51, - 49, 128, 86, 83, 51, 48, 128, 86, 83, 51, 128, 86, 83, 50, 57, 128, 86, - 83, 50, 56, 128, 86, 83, 50, 55, 128, 86, 83, 50, 54, 128, 86, 83, 50, - 53, 54, 128, 86, 83, 50, 53, 53, 128, 86, 83, 50, 53, 52, 128, 86, 83, - 50, 53, 51, 128, 86, 83, 50, 53, 50, 128, 86, 83, 50, 53, 49, 128, 86, - 83, 50, 53, 48, 128, 86, 83, 50, 53, 128, 86, 83, 50, 52, 57, 128, 86, - 83, 50, 52, 56, 128, 86, 83, 50, 52, 55, 128, 86, 83, 50, 52, 54, 128, - 86, 83, 50, 52, 53, 128, 86, 83, 50, 52, 52, 128, 86, 83, 50, 52, 51, - 128, 86, 83, 50, 52, 50, 128, 86, 83, 50, 52, 49, 128, 86, 83, 50, 52, - 48, 128, 86, 83, 50, 52, 128, 86, 83, 50, 51, 57, 128, 86, 83, 50, 51, - 56, 128, 86, 83, 50, 51, 55, 128, 86, 83, 50, 51, 54, 128, 86, 83, 50, - 51, 53, 128, 86, 83, 50, 51, 52, 128, 86, 83, 50, 51, 51, 128, 86, 83, - 50, 51, 50, 128, 86, 83, 50, 51, 49, 128, 86, 83, 50, 51, 48, 128, 86, - 83, 50, 51, 128, 86, 83, 50, 50, 57, 128, 86, 83, 50, 50, 56, 128, 86, - 83, 50, 50, 55, 128, 86, 83, 50, 50, 54, 128, 86, 83, 50, 50, 53, 128, - 86, 83, 50, 50, 52, 128, 86, 83, 50, 50, 51, 128, 86, 83, 50, 50, 50, - 128, 86, 83, 50, 50, 49, 128, 86, 83, 50, 50, 48, 128, 86, 83, 50, 50, - 128, 86, 83, 50, 49, 57, 128, 86, 83, 50, 49, 56, 128, 86, 83, 50, 49, - 55, 128, 86, 83, 50, 49, 54, 128, 86, 83, 50, 49, 53, 128, 86, 83, 50, - 49, 52, 128, 86, 83, 50, 49, 51, 128, 86, 83, 50, 49, 50, 128, 86, 83, - 50, 49, 49, 128, 86, 83, 50, 49, 48, 128, 86, 83, 50, 49, 128, 86, 83, - 50, 48, 57, 128, 86, 83, 50, 48, 56, 128, 86, 83, 50, 48, 55, 128, 86, - 83, 50, 48, 54, 128, 86, 83, 50, 48, 53, 128, 86, 83, 50, 48, 52, 128, - 86, 83, 50, 48, 51, 128, 86, 83, 50, 48, 50, 128, 86, 83, 50, 48, 49, - 128, 86, 83, 50, 48, 48, 128, 86, 83, 50, 48, 128, 86, 83, 50, 128, 86, - 83, 49, 57, 57, 128, 86, 83, 49, 57, 56, 128, 86, 83, 49, 57, 55, 128, - 86, 83, 49, 57, 54, 128, 86, 83, 49, 57, 53, 128, 86, 83, 49, 57, 52, - 128, 86, 83, 49, 57, 51, 128, 86, 83, 49, 57, 50, 128, 86, 83, 49, 57, - 49, 128, 86, 83, 49, 57, 48, 128, 86, 83, 49, 57, 128, 86, 83, 49, 56, - 57, 128, 86, 83, 49, 56, 56, 128, 86, 83, 49, 56, 55, 128, 86, 83, 49, - 56, 54, 128, 86, 83, 49, 56, 53, 128, 86, 83, 49, 56, 52, 128, 86, 83, - 49, 56, 51, 128, 86, 83, 49, 56, 50, 128, 86, 83, 49, 56, 49, 128, 86, - 83, 49, 56, 48, 128, 86, 83, 49, 56, 128, 86, 83, 49, 55, 57, 128, 86, - 83, 49, 55, 56, 128, 86, 83, 49, 55, 55, 128, 86, 83, 49, 55, 54, 128, - 86, 83, 49, 55, 53, 128, 86, 83, 49, 55, 52, 128, 86, 83, 49, 55, 51, - 128, 86, 83, 49, 55, 50, 128, 86, 83, 49, 55, 49, 128, 86, 83, 49, 55, - 48, 128, 86, 83, 49, 55, 128, 86, 83, 49, 54, 57, 128, 86, 83, 49, 54, - 56, 128, 86, 83, 49, 54, 55, 128, 86, 83, 49, 54, 54, 128, 86, 83, 49, - 54, 53, 128, 86, 83, 49, 54, 52, 128, 86, 83, 49, 54, 51, 128, 86, 83, - 49, 54, 50, 128, 86, 83, 49, 54, 49, 128, 86, 83, 49, 54, 48, 128, 86, - 83, 49, 54, 128, 86, 83, 49, 53, 57, 128, 86, 83, 49, 53, 56, 128, 86, - 83, 49, 53, 55, 128, 86, 83, 49, 53, 54, 128, 86, 83, 49, 53, 53, 128, - 86, 83, 49, 53, 52, 128, 86, 83, 49, 53, 51, 128, 86, 83, 49, 53, 50, - 128, 86, 83, 49, 53, 49, 128, 86, 83, 49, 53, 48, 128, 86, 83, 49, 53, - 128, 86, 83, 49, 52, 57, 128, 86, 83, 49, 52, 56, 128, 86, 83, 49, 52, - 55, 128, 86, 83, 49, 52, 54, 128, 86, 83, 49, 52, 53, 128, 86, 83, 49, - 52, 52, 128, 86, 83, 49, 52, 51, 128, 86, 83, 49, 52, 50, 128, 86, 83, - 49, 52, 49, 128, 86, 83, 49, 52, 48, 128, 86, 83, 49, 52, 128, 86, 83, - 49, 51, 57, 128, 86, 83, 49, 51, 56, 128, 86, 83, 49, 51, 55, 128, 86, - 83, 49, 51, 54, 128, 86, 83, 49, 51, 53, 128, 86, 83, 49, 51, 52, 128, - 86, 83, 49, 51, 51, 128, 86, 83, 49, 51, 50, 128, 86, 83, 49, 51, 49, - 128, 86, 83, 49, 51, 48, 128, 86, 83, 49, 51, 128, 86, 83, 49, 50, 57, - 128, 86, 83, 49, 50, 56, 128, 86, 83, 49, 50, 55, 128, 86, 83, 49, 50, - 54, 128, 86, 83, 49, 50, 53, 128, 86, 83, 49, 50, 52, 128, 86, 83, 49, - 50, 51, 128, 86, 83, 49, 50, 50, 128, 86, 83, 49, 50, 49, 128, 86, 83, - 49, 50, 48, 128, 86, 83, 49, 50, 128, 86, 83, 49, 49, 57, 128, 86, 83, - 49, 49, 56, 128, 86, 83, 49, 49, 55, 128, 86, 83, 49, 49, 54, 128, 86, - 83, 49, 49, 53, 128, 86, 83, 49, 49, 52, 128, 86, 83, 49, 49, 51, 128, - 86, 83, 49, 49, 50, 128, 86, 83, 49, 49, 49, 128, 86, 83, 49, 49, 48, - 128, 86, 83, 49, 49, 128, 86, 83, 49, 48, 57, 128, 86, 83, 49, 48, 56, - 128, 86, 83, 49, 48, 55, 128, 86, 83, 49, 48, 54, 128, 86, 83, 49, 48, - 53, 128, 86, 83, 49, 48, 52, 128, 86, 83, 49, 48, 51, 128, 86, 83, 49, - 48, 50, 128, 86, 83, 49, 48, 49, 128, 86, 83, 49, 48, 48, 128, 86, 83, - 49, 48, 128, 86, 83, 49, 128, 86, 83, 128, 86, 82, 65, 67, 72, 89, 128, - 86, 79, 88, 128, 86, 79, 87, 69, 76, 45, 67, 65, 82, 82, 73, 69, 210, 86, - 79, 87, 128, 86, 79, 85, 128, 86, 79, 84, 128, 86, 79, 211, 86, 79, 80, - 128, 86, 79, 79, 73, 128, 86, 79, 79, 128, 86, 79, 77, 73, 84, 73, 78, - 71, 128, 86, 79, 77, 128, 86, 79, 76, 85, 77, 197, 86, 79, 76, 84, 65, - 71, 197, 86, 79, 76, 76, 69, 89, 66, 65, 76, 76, 128, 86, 79, 76, 67, 65, - 78, 79, 128, 86, 79, 76, 65, 80, 85, 203, 86, 79, 73, 196, 86, 79, 73, - 67, 73, 78, 71, 128, 86, 79, 73, 67, 69, 76, 69, 83, 211, 86, 79, 73, 67, - 69, 196, 86, 79, 68, 128, 86, 79, 67, 65, 76, 73, 90, 65, 84, 73, 79, - 206, 86, 79, 67, 65, 204, 86, 79, 128, 86, 73, 89, 79, 128, 86, 73, 88, - 128, 86, 73, 84, 82, 73, 79, 76, 45, 50, 128, 86, 73, 84, 82, 73, 79, 76, - 128, 86, 73, 84, 65, 69, 45, 50, 128, 86, 73, 84, 65, 69, 128, 86, 73, - 84, 128, 86, 73, 83, 73, 71, 79, 84, 72, 73, 195, 86, 73, 83, 65, 82, 71, - 65, 89, 65, 128, 86, 73, 83, 65, 82, 71, 65, 128, 86, 73, 83, 65, 82, 71, - 193, 86, 73, 82, 73, 65, 77, 128, 86, 73, 82, 71, 79, 128, 86, 73, 82, - 71, 65, 128, 86, 73, 82, 65, 77, 65, 128, 86, 73, 80, 128, 86, 73, 79, - 76, 73, 78, 128, 86, 73, 78, 69, 71, 65, 82, 45, 51, 128, 86, 73, 78, 69, - 71, 65, 82, 45, 50, 128, 86, 73, 78, 69, 71, 65, 82, 128, 86, 73, 78, 69, - 71, 65, 210, 86, 73, 78, 69, 128, 86, 73, 78, 197, 86, 73, 78, 128, 86, - 73, 76, 76, 65, 71, 69, 128, 86, 73, 73, 128, 86, 73, 71, 73, 78, 84, 73, - 76, 69, 128, 86, 73, 69, 88, 128, 86, 73, 69, 87, 73, 78, 199, 86, 73, - 69, 87, 68, 65, 84, 193, 86, 73, 69, 84, 128, 86, 73, 69, 212, 86, 73, - 69, 80, 128, 86, 73, 69, 128, 86, 73, 68, 74, 45, 50, 128, 86, 73, 68, - 74, 128, 86, 73, 68, 69, 79, 67, 65, 83, 83, 69, 84, 84, 69, 128, 86, 73, - 68, 69, 207, 86, 73, 68, 65, 128, 86, 73, 67, 84, 79, 82, 217, 86, 73, - 66, 82, 65, 84, 73, 79, 206, 86, 72, 65, 128, 86, 70, 65, 128, 86, 69, - 89, 90, 128, 86, 69, 88, 128, 86, 69, 87, 128, 86, 69, 215, 86, 69, 85, - 88, 128, 86, 69, 85, 77, 128, 86, 69, 85, 65, 69, 80, 69, 78, 128, 86, - 69, 85, 65, 69, 128, 86, 69, 83, 84, 65, 128, 86, 69, 83, 84, 128, 86, - 69, 83, 83, 69, 204, 86, 69, 82, 217, 86, 69, 82, 84, 73, 67, 65, 76, 76, - 89, 128, 86, 69, 82, 84, 73, 67, 65, 76, 76, 217, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 54, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 54, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, - 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 51, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 50, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 54, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 53, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, - 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 52, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 51, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 53, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 53, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, - 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 53, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 52, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 52, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 52, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, - 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 54, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 53, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 51, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 51, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, - 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 48, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 54, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 50, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 50, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, - 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 49, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 48, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 49, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 49, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, - 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 50, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 49, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 48, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 48, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, - 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 51, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 50, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 48, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 128, - 86, 69, 82, 83, 73, 67, 76, 69, 128, 86, 69, 82, 83, 197, 86, 69, 82, 71, - 69, 128, 86, 69, 82, 68, 73, 71, 82, 73, 83, 128, 86, 69, 82, 128, 86, - 69, 80, 128, 86, 69, 78, 68, 128, 86, 69, 76, 73, 128, 86, 69, 73, 76, - 128, 86, 69, 72, 73, 67, 76, 69, 128, 86, 69, 72, 128, 86, 69, 200, 86, - 69, 69, 128, 86, 69, 197, 86, 69, 68, 69, 128, 86, 69, 67, 84, 79, 210, - 86, 65, 89, 65, 78, 78, 65, 128, 86, 65, 88, 128, 86, 65, 86, 128, 86, - 65, 214, 86, 65, 85, 128, 86, 65, 84, 72, 89, 128, 86, 65, 84, 128, 86, - 65, 83, 84, 78, 69, 83, 211, 86, 65, 83, 73, 83, 128, 86, 65, 82, 89, - 211, 86, 65, 82, 73, 75, 65, 128, 86, 65, 82, 73, 65, 78, 84, 128, 86, - 65, 82, 73, 65, 78, 212, 86, 65, 82, 73, 65, 128, 86, 65, 82, 73, 193, - 86, 65, 82, 69, 73, 65, 201, 86, 65, 82, 69, 73, 193, 86, 65, 82, 65, 65, - 75, 65, 78, 128, 86, 65, 80, 79, 85, 82, 83, 128, 86, 65, 80, 128, 86, - 65, 78, 69, 128, 86, 65, 77, 80, 73, 82, 69, 128, 86, 65, 77, 65, 71, 79, - 77, 85, 75, 72, 65, 128, 86, 65, 77, 65, 71, 79, 77, 85, 75, 72, 193, 86, - 65, 76, 76, 69, 89, 128, 86, 65, 75, 65, 73, 89, 65, 82, 65, 65, 128, 86, - 65, 74, 128, 86, 65, 73, 128, 86, 65, 72, 128, 86, 65, 200, 86, 65, 65, - 86, 85, 128, 86, 65, 65, 128, 86, 48, 52, 48, 65, 128, 86, 48, 52, 48, - 128, 86, 48, 51, 57, 128, 86, 48, 51, 56, 128, 86, 48, 51, 55, 65, 128, - 86, 48, 51, 55, 128, 86, 48, 51, 54, 128, 86, 48, 51, 53, 128, 86, 48, - 51, 52, 128, 86, 48, 51, 51, 65, 128, 86, 48, 51, 51, 128, 86, 48, 51, - 50, 128, 86, 48, 51, 49, 65, 128, 86, 48, 51, 49, 128, 86, 48, 51, 48, - 65, 128, 86, 48, 51, 48, 128, 86, 48, 50, 57, 65, 128, 86, 48, 50, 57, - 128, 86, 48, 50, 56, 65, 128, 86, 48, 50, 56, 128, 86, 48, 50, 55, 128, - 86, 48, 50, 54, 128, 86, 48, 50, 53, 128, 86, 48, 50, 52, 128, 86, 48, - 50, 51, 65, 128, 86, 48, 50, 51, 128, 86, 48, 50, 50, 128, 86, 48, 50, - 49, 128, 86, 48, 50, 48, 76, 128, 86, 48, 50, 48, 75, 128, 86, 48, 50, - 48, 74, 128, 86, 48, 50, 48, 73, 128, 86, 48, 50, 48, 72, 128, 86, 48, - 50, 48, 71, 128, 86, 48, 50, 48, 70, 128, 86, 48, 50, 48, 69, 128, 86, - 48, 50, 48, 68, 128, 86, 48, 50, 48, 67, 128, 86, 48, 50, 48, 66, 128, - 86, 48, 50, 48, 65, 128, 86, 48, 50, 48, 128, 86, 48, 49, 57, 128, 86, - 48, 49, 56, 128, 86, 48, 49, 55, 128, 86, 48, 49, 54, 128, 86, 48, 49, - 53, 128, 86, 48, 49, 52, 128, 86, 48, 49, 51, 128, 86, 48, 49, 50, 66, - 128, 86, 48, 49, 50, 65, 128, 86, 48, 49, 50, 128, 86, 48, 49, 49, 67, - 128, 86, 48, 49, 49, 66, 128, 86, 48, 49, 49, 65, 128, 86, 48, 49, 49, - 128, 86, 48, 49, 48, 128, 86, 48, 48, 57, 128, 86, 48, 48, 56, 128, 86, - 48, 48, 55, 66, 128, 86, 48, 48, 55, 65, 128, 86, 48, 48, 55, 128, 86, - 48, 48, 54, 128, 86, 48, 48, 53, 128, 86, 48, 48, 52, 128, 86, 48, 48, - 51, 128, 86, 48, 48, 50, 65, 128, 86, 48, 48, 50, 128, 86, 48, 48, 49, - 73, 128, 86, 48, 48, 49, 72, 128, 86, 48, 48, 49, 71, 128, 86, 48, 48, - 49, 70, 128, 86, 48, 48, 49, 69, 128, 86, 48, 48, 49, 68, 128, 86, 48, - 48, 49, 67, 128, 86, 48, 48, 49, 66, 128, 86, 48, 48, 49, 65, 128, 86, - 48, 48, 49, 128, 85, 90, 85, 128, 85, 90, 72, 65, 75, 75, 85, 128, 85, - 90, 51, 128, 85, 90, 179, 85, 89, 65, 78, 78, 65, 128, 85, 89, 128, 85, - 87, 85, 128, 85, 85, 89, 65, 78, 78, 65, 128, 85, 85, 85, 85, 128, 85, - 85, 85, 51, 128, 85, 85, 85, 50, 128, 85, 85, 69, 128, 85, 84, 85, 75, - 73, 128, 85, 83, 83, 85, 51, 128, 85, 83, 83, 85, 128, 85, 83, 72, 88, - 128, 85, 83, 72, 85, 77, 88, 128, 85, 83, 72, 69, 78, 78, 65, 128, 85, - 83, 72, 50, 128, 85, 83, 72, 128, 85, 83, 200, 85, 83, 69, 196, 85, 83, - 69, 45, 50, 128, 85, 83, 69, 45, 49, 128, 85, 83, 69, 128, 85, 83, 197, - 85, 82, 85, 218, 85, 82, 85, 83, 128, 85, 82, 85, 68, 65, 128, 85, 82, - 85, 68, 193, 85, 82, 85, 128, 85, 82, 213, 85, 82, 78, 128, 85, 82, 73, - 78, 69, 128, 85, 82, 73, 51, 128, 85, 82, 73, 128, 85, 82, 65, 78, 85, - 83, 128, 85, 82, 65, 128, 85, 82, 52, 128, 85, 82, 50, 128, 85, 82, 178, - 85, 80, 87, 65, 82, 68, 83, 128, 85, 80, 87, 65, 82, 68, 211, 85, 80, 87, - 65, 82, 68, 128, 85, 80, 87, 65, 82, 196, 85, 80, 84, 85, 82, 78, 128, - 85, 80, 83, 73, 76, 79, 78, 128, 85, 80, 83, 73, 76, 79, 206, 85, 80, 83, - 73, 68, 69, 45, 68, 79, 87, 206, 85, 80, 82, 73, 71, 72, 212, 85, 80, 80, - 69, 82, 128, 85, 80, 80, 69, 210, 85, 80, 65, 68, 72, 77, 65, 78, 73, 89, - 65, 128, 85, 80, 45, 80, 79, 73, 78, 84, 73, 78, 199, 85, 79, 78, 128, - 85, 79, 71, 128, 85, 78, 78, 128, 85, 78, 77, 65, 82, 82, 73, 69, 196, - 85, 78, 75, 78, 79, 87, 78, 128, 85, 78, 75, 128, 85, 78, 73, 86, 69, 82, - 83, 65, 204, 85, 78, 73, 84, 89, 128, 85, 78, 73, 84, 69, 196, 85, 78, - 73, 84, 128, 85, 78, 73, 212, 85, 78, 73, 79, 78, 128, 85, 78, 73, 79, - 206, 85, 78, 73, 70, 79, 82, 77, 128, 85, 78, 73, 70, 73, 69, 196, 85, - 78, 73, 67, 79, 82, 206, 85, 78, 69, 86, 69, 206, 85, 78, 68, 207, 85, - 78, 68, 69, 82, 84, 73, 69, 128, 85, 78, 68, 69, 82, 76, 73, 78, 197, 85, - 78, 68, 69, 82, 68, 79, 84, 128, 85, 78, 68, 69, 82, 66, 65, 82, 128, 85, - 78, 68, 69, 82, 128, 85, 78, 68, 69, 210, 85, 78, 67, 73, 193, 85, 78, - 67, 69, 82, 84, 65, 73, 78, 84, 217, 85, 78, 66, 76, 69, 78, 68, 69, 196, - 85, 78, 65, 83, 80, 73, 82, 65, 84, 69, 68, 128, 85, 78, 65, 80, 128, 85, - 78, 65, 77, 85, 83, 69, 196, 85, 78, 65, 128, 85, 206, 85, 77, 85, 77, - 128, 85, 77, 85, 205, 85, 77, 66, 82, 69, 76, 76, 65, 128, 85, 77, 66, - 82, 69, 76, 76, 193, 85, 77, 66, 73, 78, 128, 85, 75, 85, 128, 85, 75, - 82, 65, 73, 78, 73, 65, 206, 85, 75, 65, 82, 65, 128, 85, 75, 65, 82, - 193, 85, 75, 128, 85, 73, 76, 76, 69, 65, 78, 78, 128, 85, 73, 71, 72, - 85, 210, 85, 72, 68, 128, 85, 71, 65, 82, 73, 84, 73, 195, 85, 69, 89, - 128, 85, 69, 78, 128, 85, 69, 73, 128, 85, 69, 69, 128, 85, 69, 65, 128, - 85, 68, 85, 71, 128, 85, 68, 65, 84, 84, 65, 128, 85, 68, 65, 84, 84, - 193, 85, 68, 65, 65, 84, 128, 85, 68, 128, 85, 196, 85, 67, 128, 85, 66, - 85, 70, 73, 76, 73, 128, 85, 66, 72, 65, 89, 65, 84, 207, 85, 66, 65, 68, - 65, 77, 65, 128, 85, 66, 128, 85, 65, 84, 72, 128, 85, 65, 78, 71, 128, - 85, 65, 128, 85, 178, 85, 48, 52, 50, 128, 85, 48, 52, 49, 128, 85, 48, - 52, 48, 128, 85, 48, 51, 57, 128, 85, 48, 51, 56, 128, 85, 48, 51, 55, - 128, 85, 48, 51, 54, 128, 85, 48, 51, 53, 128, 85, 48, 51, 52, 128, 85, - 48, 51, 51, 128, 85, 48, 51, 50, 65, 128, 85, 48, 51, 50, 128, 85, 48, - 51, 49, 128, 85, 48, 51, 48, 128, 85, 48, 50, 57, 65, 128, 85, 48, 50, - 57, 128, 85, 48, 50, 56, 128, 85, 48, 50, 55, 128, 85, 48, 50, 54, 128, - 85, 48, 50, 53, 128, 85, 48, 50, 52, 128, 85, 48, 50, 51, 65, 128, 85, - 48, 50, 51, 128, 85, 48, 50, 50, 128, 85, 48, 50, 49, 128, 85, 48, 50, - 48, 128, 85, 48, 49, 57, 128, 85, 48, 49, 56, 128, 85, 48, 49, 55, 128, - 85, 48, 49, 54, 128, 85, 48, 49, 53, 128, 85, 48, 49, 52, 128, 85, 48, - 49, 51, 128, 85, 48, 49, 50, 128, 85, 48, 49, 49, 128, 85, 48, 49, 48, - 128, 85, 48, 48, 57, 128, 85, 48, 48, 56, 128, 85, 48, 48, 55, 128, 85, - 48, 48, 54, 66, 128, 85, 48, 48, 54, 65, 128, 85, 48, 48, 54, 128, 85, - 48, 48, 53, 128, 85, 48, 48, 52, 128, 85, 48, 48, 51, 128, 85, 48, 48, - 50, 128, 85, 48, 48, 49, 128, 85, 45, 83, 72, 65, 80, 69, 196, 85, 45, - 73, 45, 73, 128, 85, 45, 69, 79, 45, 69, 85, 128, 85, 45, 66, 82, 74, 71, - 85, 128, 85, 45, 53, 128, 84, 90, 85, 128, 84, 90, 79, 65, 128, 84, 90, - 79, 128, 84, 90, 73, 210, 84, 90, 73, 128, 84, 90, 69, 69, 128, 84, 90, - 69, 128, 84, 90, 65, 65, 128, 84, 90, 65, 128, 84, 90, 128, 84, 89, 210, - 84, 89, 80, 69, 45, 183, 84, 89, 80, 69, 45, 54, 128, 84, 89, 80, 69, 45, - 182, 84, 89, 80, 69, 45, 53, 128, 84, 89, 80, 69, 45, 181, 84, 89, 80, - 69, 45, 52, 128, 84, 89, 80, 69, 45, 180, 84, 89, 80, 69, 45, 51, 128, - 84, 89, 80, 69, 45, 179, 84, 89, 80, 69, 45, 178, 84, 89, 80, 69, 45, 49, - 45, 50, 128, 84, 89, 80, 69, 45, 177, 84, 89, 80, 197, 84, 89, 79, 128, - 84, 89, 73, 128, 84, 89, 69, 128, 84, 89, 65, 89, 128, 84, 89, 65, 128, - 84, 88, 87, 86, 128, 84, 88, 87, 214, 84, 88, 72, 69, 69, 202, 84, 88, - 65, 128, 84, 87, 79, 79, 128, 84, 87, 79, 45, 87, 65, 217, 84, 87, 79, - 45, 84, 72, 73, 82, 84, 89, 128, 84, 87, 79, 45, 76, 73, 78, 197, 84, 87, - 79, 45, 72, 69, 65, 68, 69, 196, 84, 87, 79, 45, 69, 205, 84, 87, 79, 45, - 67, 73, 82, 67, 76, 197, 84, 87, 73, 83, 84, 73, 78, 71, 128, 84, 87, 73, - 83, 84, 69, 196, 84, 87, 73, 73, 128, 84, 87, 73, 128, 84, 87, 69, 78, - 84, 89, 45, 84, 87, 79, 128, 84, 87, 69, 78, 84, 89, 45, 84, 87, 207, 84, - 87, 69, 78, 84, 89, 45, 84, 72, 82, 69, 69, 128, 84, 87, 69, 78, 84, 89, - 45, 83, 73, 88, 128, 84, 87, 69, 78, 84, 89, 45, 83, 69, 86, 69, 78, 128, - 84, 87, 69, 78, 84, 89, 45, 79, 78, 69, 128, 84, 87, 69, 78, 84, 89, 45, - 78, 73, 78, 69, 128, 84, 87, 69, 78, 84, 89, 45, 70, 79, 85, 82, 128, 84, - 87, 69, 78, 84, 89, 45, 70, 73, 86, 69, 128, 84, 87, 69, 78, 84, 89, 45, - 70, 73, 86, 197, 84, 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, 84, 200, 84, - 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, 84, 128, 84, 87, 69, 78, 84, 89, - 128, 84, 87, 69, 78, 84, 217, 84, 87, 69, 78, 84, 73, 69, 84, 72, 83, - 128, 84, 87, 69, 78, 84, 73, 69, 84, 72, 128, 84, 87, 69, 76, 86, 69, 45, - 84, 72, 73, 82, 84, 89, 128, 84, 87, 69, 76, 86, 69, 128, 84, 87, 69, 76, - 86, 197, 84, 87, 69, 76, 70, 84, 72, 83, 128, 84, 87, 69, 76, 70, 84, 72, - 128, 84, 87, 69, 128, 84, 87, 65, 65, 128, 84, 87, 65, 128, 84, 86, 82, - 73, 68, 79, 128, 84, 86, 73, 77, 65, 68, 85, 210, 84, 85, 88, 69, 68, 79, - 128, 84, 85, 88, 128, 84, 85, 85, 77, 85, 128, 84, 85, 85, 128, 84, 85, - 84, 84, 89, 128, 84, 85, 84, 69, 89, 65, 83, 65, 84, 128, 84, 85, 84, + 84, 73, 77, 69, 211, 66, 65, 77, 85, 205, 65, 78, 196, 83, 67, 82, 73, + 80, 212, 66, 79, 76, 196, 65, 78, 65, 84, 79, 76, 73, 65, 206, 72, 65, + 78, 71, 85, 204, 78, 85, 77, 66, 69, 210, 76, 73, 78, 69, 65, 210, 71, + 82, 69, 69, 203, 76, 73, 71, 65, 84, 85, 82, 197, 77, 85, 83, 73, 67, 65, + 204, 69, 84, 72, 73, 79, 80, 73, 195, 75, 72, 73, 84, 65, 206, 67, 79, + 77, 66, 73, 78, 73, 78, 199, 70, 79, 210, 193, 67, 89, 82, 73, 76, 76, + 73, 195, 73, 84, 65, 76, 73, 195, 84, 65, 77, 73, 204, 78, 85, 83, 72, + 213, 76, 69, 70, 212, 67, 73, 82, 67, 76, 69, 196, 82, 65, 68, 73, 67, + 65, 204, 83, 65, 78, 83, 45, 83, 69, 82, 73, 198, 83, 81, 85, 65, 82, + 197, 82, 73, 71, 72, 212, 70, 73, 78, 65, 204, 84, 65, 201, 65, 82, 82, + 79, 87, 128, 68, 79, 85, 66, 76, 197, 86, 65, 201, 83, 73, 71, 78, 128, + 65, 66, 79, 86, 69, 128, 72, 69, 78, 84, 65, 73, 71, 65, 78, 193, 66, 76, + 65, 67, 203, 65, 82, 82, 79, 215, 87, 72, 73, 84, 197, 66, 69, 76, 79, + 87, 128, 65, 128, 86, 65, 82, 73, 65, 84, 73, 79, 206, 66, 82, 65, 73, + 76, 76, 197, 80, 65, 84, 84, 69, 82, 206, 85, 128, 66, 89, 90, 65, 78, + 84, 73, 78, 197, 73, 128, 73, 83, 79, 76, 65, 84, 69, 196, 77, 79, 68, + 73, 70, 73, 69, 210, 79, 128, 75, 65, 84, 65, 75, 65, 78, 193, 194, 77, + 65, 82, 75, 128, 68, 79, 212, 77, 89, 65, 78, 77, 65, 210, 79, 198, 75, + 65, 78, 71, 88, 201, 75, 73, 75, 65, 75, 85, 201, 77, 69, 78, 68, 197, + 86, 69, 82, 84, 73, 67, 65, 204, 77, 73, 68, 68, 76, 197, 84, 73, 66, 69, + 84, 65, 206, 72, 69, 65, 86, 217, 73, 78, 73, 84, 73, 65, 204, 72, 77, + 79, 78, 199, 79, 78, 197, 77, 69, 69, 205, 67, 79, 80, 84, 73, 195, 75, + 72, 77, 69, 210, 82, 73, 71, 72, 84, 87, 65, 82, 68, 211, 65, 66, 79, 86, + 197, 67, 65, 82, 82, 73, 69, 210, 89, 69, 200, 71, 69, 79, 82, 71, 73, + 65, 206, 67, 72, 69, 82, 79, 75, 69, 197, 77, 79, 78, 71, 79, 76, 73, 65, + 206, 79, 78, 69, 128, 80, 76, 85, 211, 84, 87, 207, 84, 87, 79, 128, 66, + 79, 216, 76, 79, 87, 69, 210, 68, 69, 86, 65, 78, 65, 71, 65, 82, 201, + 83, 81, 85, 65, 82, 69, 196, 83, 89, 77, 66, 79, 76, 128, 80, 72, 65, 83, + 69, 45, 197, 83, 84, 82, 79, 75, 69, 128, 84, 72, 82, 69, 197, 85, 80, + 80, 69, 210, 76, 69, 70, 84, 87, 65, 82, 68, 211, 84, 207, 67, 79, 78, + 83, 79, 78, 65, 78, 212, 77, 73, 65, 207, 86, 79, 67, 65, 76, 73, 195, + 68, 82, 65, 87, 73, 78, 71, 211, 84, 73, 76, 197, 68, 85, 80, 76, 79, 89, + 65, 206, 77, 65, 82, 203, 74, 79, 78, 71, 83, 69, 79, 78, 199, 80, 65, + 82, 69, 78, 84, 72, 69, 83, 73, 90, 69, 196, 84, 72, 65, 205, 71, 79, 78, + 68, 201, 72, 79, 79, 75, 128, 72, 69, 66, 82, 69, 215, 85, 208, 71, 76, + 65, 71, 79, 76, 73, 84, 73, 195, 76, 79, 215, 84, 72, 82, 69, 69, 128, + 70, 79, 85, 82, 128, 77, 65, 76, 65, 89, 65, 76, 65, 205, 79, 86, 69, + 210, 83, 73, 89, 65, 209, 72, 65, 76, 198, 72, 73, 71, 200, 73, 78, 68, + 69, 216, 80, 65, 72, 65, 87, 200, 68, 79, 87, 206, 67, 72, 79, 83, 69, + 79, 78, 199, 72, 65, 128, 72, 65, 76, 70, 87, 73, 68, 84, 200, 72, 65, + 78, 68, 45, 70, 73, 83, 212, 77, 69, 82, 79, 73, 84, 73, 195, 66, 65, 76, + 73, 78, 69, 83, 197, 73, 68, 69, 79, 71, 82, 65, 80, 72, 73, 195, 70, 73, + 86, 69, 128, 76, 73, 71, 72, 212, 73, 68, 69, 79, 71, 82, 65, 205, 80, + 72, 65, 83, 69, 45, 196, 84, 79, 128, 65, 76, 67, 72, 69, 77, 73, 67, 65, + 204, 65, 76, 69, 198, 84, 79, 78, 197, 83, 73, 78, 72, 65, 76, 193, 75, + 65, 128, 66, 65, 82, 128, 78, 85, 77, 69, 82, 73, 195, 84, 85, 82, 78, + 69, 196, 66, 82, 65, 72, 77, 201, 80, 65, 128, 82, 65, 128, 89, 65, 128, + 72, 85, 78, 71, 65, 82, 73, 65, 206, 83, 73, 88, 128, 84, 72, 85, 77, + 194, 77, 65, 128, 66, 65, 82, 194, 69, 73, 71, 72, 84, 128, 66, 76, 79, + 67, 203, 72, 65, 200, 76, 65, 128, 78, 79, 82, 84, 200, 83, 69, 86, 69, + 78, 128, 84, 72, 79, 85, 83, 65, 78, 68, 128, 78, 65, 128, 78, 73, 78, + 69, 128, 70, 85, 76, 76, 87, 73, 68, 84, 200, 76, 79, 78, 199, 66, 82, + 65, 67, 75, 69, 84, 128, 69, 81, 85, 65, 204, 83, 65, 128, 84, 65, 128, + 84, 65, 199, 68, 79, 77, 73, 78, 207, 90, 90, 89, 88, 128, 90, 90, 89, + 84, 128, 90, 90, 89, 82, 88, 128, 90, 90, 89, 82, 128, 90, 90, 89, 80, + 128, 90, 90, 89, 65, 128, 90, 90, 89, 128, 90, 90, 85, 88, 128, 90, 90, + 85, 82, 88, 128, 90, 90, 85, 82, 128, 90, 90, 85, 80, 128, 90, 90, 85, + 128, 90, 90, 83, 89, 65, 128, 90, 90, 83, 65, 128, 90, 90, 79, 88, 128, + 90, 90, 79, 80, 128, 90, 90, 79, 128, 90, 90, 73, 88, 128, 90, 90, 73, + 84, 128, 90, 90, 73, 80, 128, 90, 90, 73, 69, 88, 128, 90, 90, 73, 69, + 84, 128, 90, 90, 73, 69, 80, 128, 90, 90, 73, 69, 128, 90, 90, 73, 128, + 90, 90, 69, 88, 128, 90, 90, 69, 80, 128, 90, 90, 69, 69, 128, 90, 90, + 69, 128, 90, 90, 65, 88, 128, 90, 90, 65, 84, 128, 90, 90, 65, 80, 128, + 90, 90, 65, 65, 128, 90, 90, 65, 128, 90, 89, 71, 79, 83, 128, 90, 87, + 83, 80, 128, 90, 87, 78, 74, 128, 90, 87, 78, 66, 83, 80, 128, 90, 87, + 74, 128, 90, 87, 202, 90, 87, 65, 82, 65, 75, 65, 89, 128, 90, 87, 65, + 128, 90, 85, 84, 128, 90, 85, 79, 88, 128, 90, 85, 79, 80, 128, 90, 85, + 79, 128, 90, 85, 77, 128, 90, 85, 66, 85, 82, 128, 90, 85, 53, 128, 90, + 85, 181, 90, 213, 90, 83, 72, 65, 128, 90, 82, 65, 128, 90, 81, 65, 80, + 72, 193, 90, 79, 84, 128, 90, 79, 79, 128, 90, 79, 77, 66, 73, 69, 128, + 90, 79, 65, 128, 90, 76, 65, 77, 193, 90, 76, 65, 128, 90, 76, 193, 90, + 74, 69, 128, 90, 73, 90, 50, 128, 90, 73, 81, 65, 65, 128, 90, 73, 80, + 80, 69, 82, 45, 77, 79, 85, 84, 200, 90, 73, 78, 79, 82, 128, 90, 73, 76, + 68, 69, 128, 90, 73, 71, 90, 65, 199, 90, 73, 71, 128, 90, 73, 68, 193, + 90, 73, 66, 128, 90, 73, 194, 90, 73, 51, 128, 90, 201, 90, 72, 89, 88, + 128, 90, 72, 89, 84, 128, 90, 72, 89, 82, 88, 128, 90, 72, 89, 82, 128, + 90, 72, 89, 80, 128, 90, 72, 89, 128, 90, 72, 87, 69, 128, 90, 72, 87, + 65, 128, 90, 72, 85, 88, 128, 90, 72, 85, 84, 128, 90, 72, 85, 82, 88, + 128, 90, 72, 85, 82, 128, 90, 72, 85, 80, 128, 90, 72, 85, 79, 88, 128, + 90, 72, 85, 79, 80, 128, 90, 72, 85, 79, 128, 90, 72, 85, 128, 90, 72, + 79, 88, 128, 90, 72, 79, 84, 128, 90, 72, 79, 80, 128, 90, 72, 79, 79, + 128, 90, 72, 79, 73, 128, 90, 72, 79, 128, 90, 72, 73, 86, 69, 84, 69, + 128, 90, 72, 73, 76, 128, 90, 72, 73, 128, 90, 72, 69, 88, 128, 90, 72, + 69, 84, 128, 90, 72, 69, 80, 128, 90, 72, 69, 69, 128, 90, 72, 69, 128, + 90, 72, 197, 90, 72, 65, 89, 73, 78, 128, 90, 72, 65, 88, 128, 90, 72, + 65, 84, 128, 90, 72, 65, 82, 128, 90, 72, 65, 80, 128, 90, 72, 65, 73, + 78, 128, 90, 72, 65, 65, 128, 90, 72, 65, 128, 90, 72, 128, 90, 69, 85, + 83, 128, 90, 69, 84, 65, 128, 90, 69, 82, 79, 128, 90, 69, 82, 207, 90, + 69, 78, 128, 90, 69, 77, 76, 89, 65, 128, 90, 69, 77, 76, 74, 65, 128, + 90, 69, 66, 82, 193, 90, 69, 50, 128, 90, 197, 90, 65, 89, 78, 128, 90, + 65, 89, 73, 78, 45, 89, 79, 68, 72, 128, 90, 65, 89, 73, 78, 128, 90, 65, + 89, 73, 206, 90, 65, 86, 73, 89, 65, 78, 73, 128, 90, 65, 84, 65, 128, + 90, 65, 82, 81, 65, 128, 90, 65, 82, 76, 128, 90, 65, 81, 69, 198, 90, + 65, 78, 65, 66, 65, 90, 65, 210, 90, 65, 77, 88, 128, 90, 65, 76, 128, + 90, 65, 204, 90, 65, 73, 78, 128, 90, 65, 73, 206, 90, 65, 73, 128, 90, + 65, 72, 128, 90, 65, 200, 90, 65, 71, 128, 90, 65, 69, 70, 128, 90, 65, + 55, 128, 90, 193, 90, 48, 49, 54, 72, 128, 90, 48, 49, 54, 71, 128, 90, + 48, 49, 54, 70, 128, 90, 48, 49, 54, 69, 128, 90, 48, 49, 54, 68, 128, + 90, 48, 49, 54, 67, 128, 90, 48, 49, 54, 66, 128, 90, 48, 49, 54, 65, + 128, 90, 48, 49, 54, 128, 90, 48, 49, 53, 73, 128, 90, 48, 49, 53, 72, + 128, 90, 48, 49, 53, 71, 128, 90, 48, 49, 53, 70, 128, 90, 48, 49, 53, + 69, 128, 90, 48, 49, 53, 68, 128, 90, 48, 49, 53, 67, 128, 90, 48, 49, + 53, 66, 128, 90, 48, 49, 53, 65, 128, 90, 48, 49, 53, 128, 90, 48, 49, + 52, 128, 90, 48, 49, 51, 128, 90, 48, 49, 50, 128, 90, 48, 49, 49, 128, + 90, 48, 49, 48, 128, 90, 48, 48, 57, 128, 90, 48, 48, 56, 128, 90, 48, + 48, 55, 128, 90, 48, 48, 54, 128, 90, 48, 48, 53, 65, 128, 90, 48, 48, + 53, 128, 90, 48, 48, 52, 65, 128, 90, 48, 48, 52, 128, 90, 48, 48, 51, + 66, 128, 90, 48, 48, 51, 65, 128, 90, 48, 48, 51, 128, 90, 48, 48, 50, + 68, 128, 90, 48, 48, 50, 67, 128, 90, 48, 48, 50, 66, 128, 90, 48, 48, + 50, 65, 128, 90, 48, 48, 50, 128, 90, 48, 48, 49, 128, 90, 128, 218, 89, + 89, 88, 128, 89, 89, 84, 128, 89, 89, 82, 88, 128, 89, 89, 82, 128, 89, + 89, 80, 128, 89, 89, 69, 128, 89, 89, 65, 65, 128, 89, 89, 65, 128, 89, + 89, 128, 89, 87, 79, 79, 128, 89, 87, 79, 128, 89, 87, 73, 73, 128, 89, + 87, 73, 128, 89, 87, 69, 128, 89, 87, 65, 65, 128, 89, 87, 65, 128, 89, + 86, 128, 89, 85, 88, 128, 89, 85, 87, 79, 81, 128, 89, 85, 85, 75, 65, + 76, 69, 65, 80, 73, 78, 84, 85, 128, 89, 85, 85, 128, 89, 85, 84, 128, + 89, 85, 83, 128, 89, 85, 211, 89, 85, 82, 88, 128, 89, 85, 82, 128, 89, + 85, 81, 128, 89, 85, 209, 89, 85, 80, 128, 89, 85, 79, 88, 128, 89, 85, + 79, 84, 128, 89, 85, 79, 80, 128, 89, 85, 79, 77, 128, 89, 85, 79, 128, + 89, 85, 78, 128, 89, 85, 77, 128, 89, 85, 74, 128, 89, 85, 73, 128, 89, + 85, 69, 81, 128, 89, 85, 69, 128, 89, 85, 68, 72, 128, 89, 85, 68, 200, + 89, 85, 65, 78, 128, 89, 85, 65, 69, 78, 128, 89, 85, 45, 89, 69, 79, + 128, 89, 85, 45, 89, 69, 128, 89, 85, 45, 85, 128, 89, 85, 45, 79, 128, + 89, 85, 45, 73, 128, 89, 85, 45, 69, 79, 128, 89, 85, 45, 69, 128, 89, + 85, 45, 65, 69, 128, 89, 85, 45, 65, 128, 89, 85, 45, 52, 128, 89, 85, + 45, 51, 128, 89, 85, 45, 50, 128, 89, 85, 45, 49, 128, 89, 85, 128, 89, + 213, 89, 82, 89, 128, 89, 80, 83, 73, 76, 73, 128, 89, 80, 79, 82, 82, + 79, 73, 128, 89, 80, 79, 75, 82, 73, 83, 73, 83, 128, 89, 80, 79, 75, 82, + 73, 83, 73, 211, 89, 80, 79, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, + 89, 79, 89, 128, 89, 79, 88, 128, 89, 79, 87, 68, 128, 89, 79, 85, 84, + 72, 70, 85, 76, 78, 69, 83, 83, 128, 89, 79, 85, 84, 72, 70, 85, 204, 89, + 79, 213, 89, 79, 84, 128, 89, 79, 212, 89, 79, 82, 73, 128, 89, 79, 81, + 128, 89, 79, 209, 89, 79, 80, 128, 89, 79, 79, 128, 89, 79, 77, 79, 128, + 89, 79, 71, 72, 128, 89, 79, 68, 128, 89, 79, 196, 89, 79, 65, 128, 89, + 79, 45, 89, 79, 128, 89, 79, 45, 89, 69, 79, 128, 89, 79, 45, 89, 65, 69, + 128, 89, 79, 45, 89, 65, 128, 89, 79, 45, 79, 128, 89, 79, 45, 73, 128, + 89, 79, 45, 69, 79, 128, 89, 79, 45, 65, 69, 128, 89, 79, 45, 65, 128, + 89, 79, 45, 54, 128, 89, 79, 45, 53, 128, 89, 79, 45, 52, 128, 89, 79, + 45, 51, 128, 89, 79, 45, 50, 128, 89, 79, 45, 49, 128, 89, 207, 89, 73, + 90, 69, 84, 128, 89, 73, 88, 128, 89, 73, 87, 78, 128, 89, 73, 84, 128, + 89, 73, 80, 128, 89, 73, 78, 71, 128, 89, 73, 73, 128, 89, 73, 72, 128, + 89, 73, 199, 89, 73, 69, 88, 128, 89, 73, 69, 84, 128, 89, 73, 69, 80, + 128, 89, 73, 69, 69, 128, 89, 73, 69, 128, 89, 73, 68, 68, 73, 83, 200, + 89, 73, 45, 85, 128, 89, 73, 128, 89, 72, 69, 128, 89, 72, 65, 128, 89, + 70, 69, 83, 73, 83, 128, 89, 70, 69, 83, 73, 211, 89, 70, 69, 206, 89, + 69, 90, 73, 68, 201, 89, 69, 89, 128, 89, 69, 87, 128, 89, 69, 85, 88, + 128, 89, 69, 85, 82, 65, 69, 128, 89, 69, 85, 81, 128, 89, 69, 85, 77, + 128, 89, 69, 85, 65, 69, 84, 128, 89, 69, 85, 65, 69, 128, 89, 69, 84, + 73, 86, 128, 89, 69, 83, 84, 85, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, + 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 89, 69, 83, 73, 69, 85, + 78, 71, 45, 83, 73, 79, 83, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 80, + 65, 78, 83, 73, 79, 83, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 77, 73, + 69, 85, 77, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 75, 73, 89, 69, 79, + 75, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 75, 72, 73, 69, 85, 75, 72, + 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 72, 73, 69, 85, 72, 128, 89, 69, + 83, 73, 69, 85, 78, 71, 128, 89, 69, 82, 85, 128, 89, 69, 82, 213, 89, + 69, 82, 73, 128, 89, 69, 82, 65, 200, 89, 69, 82, 128, 89, 69, 79, 82, + 73, 78, 72, 73, 69, 85, 72, 128, 89, 69, 79, 45, 89, 65, 128, 89, 69, 79, + 45, 85, 128, 89, 69, 79, 45, 79, 128, 89, 69, 78, 73, 83, 69, 201, 89, + 69, 78, 65, 80, 128, 89, 69, 78, 128, 89, 69, 206, 89, 69, 76, 76, 79, + 87, 128, 89, 69, 76, 76, 79, 215, 89, 69, 73, 78, 128, 89, 69, 72, 128, + 89, 69, 69, 71, 128, 89, 69, 69, 128, 89, 69, 65, 210, 89, 69, 65, 128, + 89, 65, 90, 90, 128, 89, 65, 90, 72, 128, 89, 65, 90, 128, 89, 65, 89, + 68, 128, 89, 65, 89, 65, 78, 78, 65, 128, 89, 65, 89, 128, 89, 65, 87, + 78, 73, 78, 199, 89, 65, 87, 78, 128, 89, 65, 87, 128, 89, 65, 86, 128, + 89, 65, 85, 128, 89, 65, 84, 84, 128, 89, 65, 84, 73, 128, 89, 65, 84, + 72, 128, 89, 65, 84, 128, 89, 65, 83, 83, 128, 89, 65, 83, 72, 128, 89, + 65, 83, 128, 89, 65, 82, 82, 128, 89, 65, 82, 78, 128, 89, 65, 82, 128, + 89, 65, 210, 89, 65, 81, 128, 89, 65, 80, 128, 89, 65, 78, 83, 65, 89, + 65, 128, 89, 65, 78, 71, 128, 89, 65, 78, 199, 89, 65, 78, 128, 89, 65, + 77, 79, 75, 128, 89, 65, 77, 65, 75, 75, 65, 78, 128, 89, 65, 77, 128, + 89, 65, 76, 128, 89, 65, 75, 72, 72, 128, 89, 65, 75, 72, 128, 89, 65, + 75, 65, 83, 72, 128, 89, 65, 75, 128, 89, 65, 74, 85, 82, 86, 69, 68, 73, + 195, 89, 65, 74, 128, 89, 65, 73, 128, 89, 65, 72, 72, 128, 89, 65, 72, + 128, 89, 65, 71, 78, 128, 89, 65, 71, 72, 72, 128, 89, 65, 71, 72, 128, + 89, 65, 71, 128, 89, 65, 70, 213, 89, 65, 70, 128, 89, 65, 69, 77, 77, + 65, 69, 128, 89, 65, 68, 72, 128, 89, 65, 68, 68, 72, 128, 89, 65, 68, + 68, 128, 89, 65, 68, 128, 89, 65, 67, 72, 128, 89, 65, 66, 72, 128, 89, + 65, 66, 128, 89, 65, 65, 82, 85, 128, 89, 65, 65, 73, 128, 89, 65, 65, + 68, 79, 128, 89, 65, 45, 89, 79, 128, 89, 65, 45, 85, 128, 89, 65, 45, + 79, 128, 89, 65, 45, 53, 128, 89, 65, 45, 52, 128, 89, 65, 45, 51, 128, + 89, 65, 45, 50, 128, 89, 65, 45, 49, 128, 89, 48, 48, 56, 128, 89, 48, + 48, 55, 128, 89, 48, 48, 54, 128, 89, 48, 48, 53, 128, 89, 48, 48, 52, + 128, 89, 48, 48, 51, 128, 89, 48, 48, 50, 128, 89, 48, 48, 49, 65, 128, + 89, 48, 48, 49, 128, 89, 45, 67, 82, 69, 197, 88, 89, 88, 128, 88, 89, + 85, 128, 88, 89, 84, 128, 88, 89, 82, 88, 128, 88, 89, 82, 128, 88, 89, + 80, 128, 88, 89, 79, 79, 74, 128, 88, 89, 79, 79, 128, 88, 89, 79, 128, + 88, 89, 73, 128, 88, 89, 69, 69, 205, 88, 89, 69, 69, 128, 88, 89, 69, + 128, 88, 89, 65, 65, 128, 88, 89, 65, 128, 88, 89, 128, 88, 87, 73, 128, + 88, 87, 69, 69, 128, 88, 87, 69, 128, 88, 87, 65, 65, 128, 88, 87, 65, + 128, 88, 87, 128, 88, 215, 88, 86, 69, 128, 88, 86, 65, 128, 88, 85, 79, + 88, 128, 88, 85, 79, 128, 88, 85, 128, 88, 83, 72, 65, 65, 89, 65, 84, + 72, 73, 89, 65, 128, 88, 79, 88, 128, 88, 79, 84, 128, 88, 79, 82, 128, + 88, 79, 80, 72, 128, 88, 79, 80, 128, 88, 79, 65, 128, 88, 79, 128, 88, + 73, 88, 128, 88, 73, 84, 128, 88, 73, 82, 79, 206, 88, 73, 80, 128, 88, + 73, 69, 88, 128, 88, 73, 69, 84, 128, 88, 73, 69, 80, 128, 88, 73, 69, + 128, 88, 73, 65, 78, 71, 81, 201, 88, 73, 65, 66, 128, 88, 73, 128, 88, + 72, 69, 89, 78, 128, 88, 71, 128, 88, 69, 89, 78, 128, 88, 69, 83, 84, + 69, 211, 88, 69, 72, 128, 88, 69, 69, 128, 88, 69, 128, 88, 65, 85, 83, + 128, 88, 65, 85, 128, 88, 65, 80, 72, 128, 88, 65, 78, 128, 88, 65, 65, + 128, 88, 65, 128, 88, 48, 48, 56, 65, 128, 88, 48, 48, 56, 128, 88, 48, + 48, 55, 128, 88, 48, 48, 54, 65, 128, 88, 48, 48, 54, 128, 88, 48, 48, + 53, 128, 88, 48, 48, 52, 66, 128, 88, 48, 48, 52, 65, 128, 88, 48, 48, + 52, 128, 88, 48, 48, 51, 128, 88, 48, 48, 50, 128, 88, 48, 48, 49, 128, + 88, 45, 216, 87, 90, 128, 87, 89, 78, 78, 128, 87, 89, 78, 206, 87, 86, + 73, 128, 87, 86, 69, 128, 87, 86, 65, 128, 87, 86, 128, 87, 85, 80, 128, + 87, 85, 79, 88, 128, 87, 85, 79, 80, 128, 87, 85, 79, 128, 87, 85, 78, + 74, 207, 87, 85, 78, 128, 87, 85, 76, 85, 128, 87, 85, 76, 213, 87, 85, + 73, 128, 87, 85, 69, 128, 87, 85, 65, 69, 84, 128, 87, 85, 65, 69, 78, + 128, 87, 85, 128, 87, 82, 217, 87, 82, 79, 78, 71, 128, 87, 82, 73, 83, + 212, 87, 82, 73, 78, 75, 76, 69, 83, 128, 87, 82, 73, 78, 75, 76, 69, + 211, 87, 82, 73, 78, 75, 76, 69, 68, 128, 87, 82, 69, 83, 84, 76, 69, 82, + 83, 128, 87, 82, 69, 78, 67, 72, 128, 87, 82, 69, 65, 84, 200, 87, 82, + 65, 80, 80, 69, 196, 87, 82, 65, 80, 128, 87, 79, 88, 128, 87, 79, 87, + 128, 87, 79, 82, 83, 72, 73, 80, 128, 87, 79, 82, 82, 73, 69, 196, 87, + 79, 82, 77, 128, 87, 79, 82, 76, 196, 87, 79, 82, 75, 69, 82, 128, 87, + 79, 82, 75, 128, 87, 79, 82, 203, 87, 79, 82, 68, 83, 80, 65, 67, 69, + 128, 87, 79, 82, 196, 87, 79, 80, 128, 87, 79, 79, 78, 128, 87, 79, 79, + 76, 128, 87, 79, 79, 68, 83, 45, 67, 82, 69, 197, 87, 79, 79, 68, 128, + 87, 79, 78, 128, 87, 79, 206, 87, 79, 77, 69, 78, 211, 87, 79, 77, 69, + 206, 87, 79, 77, 65, 78, 211, 87, 79, 77, 65, 78, 128, 87, 79, 77, 65, + 206, 87, 79, 76, 79, 83, 79, 128, 87, 79, 76, 198, 87, 79, 69, 128, 87, + 79, 65, 128, 87, 79, 45, 55, 128, 87, 79, 45, 54, 128, 87, 79, 45, 53, + 128, 87, 79, 45, 52, 128, 87, 79, 45, 51, 128, 87, 79, 45, 50, 128, 87, + 79, 45, 49, 128, 87, 73, 84, 72, 79, 85, 212, 87, 73, 84, 72, 73, 78, + 128, 87, 73, 84, 72, 73, 206, 87, 73, 82, 69, 196, 87, 73, 78, 84, 69, + 82, 128, 87, 73, 78, 75, 73, 78, 199, 87, 73, 78, 75, 128, 87, 73, 78, + 74, 65, 128, 87, 73, 78, 71, 83, 128, 87, 73, 78, 69, 128, 87, 73, 78, + 197, 87, 73, 78, 68, 85, 128, 87, 73, 78, 68, 79, 87, 128, 87, 73, 78, + 68, 128, 87, 73, 78, 196, 87, 73, 78, 128, 87, 73, 76, 84, 69, 196, 87, + 73, 71, 78, 89, 65, 78, 128, 87, 73, 71, 71, 76, 217, 87, 73, 71, 71, 76, + 69, 83, 128, 87, 73, 68, 84, 72, 128, 87, 73, 68, 69, 78, 73, 78, 199, + 87, 73, 68, 69, 45, 72, 69, 65, 68, 69, 196, 87, 73, 68, 197, 87, 73, 65, + 78, 71, 87, 65, 65, 75, 128, 87, 73, 65, 78, 71, 128, 87, 73, 45, 53, + 128, 87, 73, 45, 52, 128, 87, 73, 45, 51, 128, 87, 73, 45, 50, 128, 87, + 73, 45, 49, 128, 87, 72, 79, 76, 197, 87, 72, 73, 84, 69, 45, 70, 69, 65, + 84, 72, 69, 82, 69, 196, 87, 72, 73, 84, 69, 128, 87, 72, 69, 69, 76, 69, + 196, 87, 72, 69, 69, 76, 67, 72, 65, 73, 82, 128, 87, 72, 69, 69, 76, 67, + 72, 65, 73, 210, 87, 72, 69, 69, 76, 128, 87, 72, 69, 69, 204, 87, 72, + 69, 65, 84, 128, 87, 72, 65, 76, 69, 128, 87, 72, 128, 87, 71, 128, 87, + 69, 88, 128, 87, 69, 85, 88, 128, 87, 69, 212, 87, 69, 83, 84, 69, 82, + 206, 87, 69, 83, 84, 45, 67, 82, 69, 197, 87, 69, 83, 84, 128, 87, 69, + 83, 212, 87, 69, 80, 128, 87, 69, 79, 128, 87, 69, 78, 128, 87, 69, 76, + 76, 128, 87, 69, 73, 71, 72, 212, 87, 69, 73, 69, 82, 83, 84, 82, 65, 83, + 211, 87, 69, 73, 128, 87, 69, 69, 78, 128, 87, 69, 68, 71, 69, 45, 84, + 65, 73, 76, 69, 196, 87, 69, 68, 71, 69, 128, 87, 69, 68, 68, 73, 78, 71, + 128, 87, 69, 66, 128, 87, 69, 65, 82, 217, 87, 69, 65, 80, 79, 78, 128, + 87, 69, 45, 52, 128, 87, 69, 45, 51, 128, 87, 69, 45, 50, 128, 87, 69, + 45, 49, 128, 87, 67, 128, 87, 66, 128, 87, 65, 89, 128, 87, 65, 217, 87, + 65, 88, 73, 78, 199, 87, 65, 88, 128, 87, 65, 87, 45, 65, 89, 73, 78, 45, + 82, 69, 83, 72, 128, 87, 65, 87, 128, 87, 65, 215, 87, 65, 86, 217, 87, + 65, 86, 73, 78, 199, 87, 65, 86, 69, 83, 128, 87, 65, 86, 69, 128, 87, + 65, 86, 197, 87, 65, 85, 128, 87, 65, 84, 84, 79, 128, 87, 65, 84, 69, + 82, 77, 69, 76, 79, 78, 128, 87, 65, 84, 69, 82, 128, 87, 65, 84, 69, + 210, 87, 65, 84, 67, 72, 128, 87, 65, 84, 128, 87, 65, 83, 84, 73, 78, + 71, 128, 87, 65, 83, 84, 69, 66, 65, 83, 75, 69, 84, 128, 87, 65, 83, 83, + 65, 76, 76, 65, 77, 128, 87, 65, 83, 76, 65, 128, 87, 65, 83, 76, 193, + 87, 65, 83, 65, 76, 76, 65, 77, 128, 87, 65, 83, 65, 76, 76, 65, 205, 87, + 65, 82, 78, 73, 78, 199, 87, 65, 82, 65, 78, 199, 87, 65, 81, 70, 65, + 128, 87, 65, 80, 128, 87, 65, 78, 73, 78, 199, 87, 65, 78, 71, 75, 85, + 79, 81, 128, 87, 65, 78, 68, 69, 82, 69, 82, 128, 87, 65, 78, 68, 128, + 87, 65, 78, 67, 72, 207, 87, 65, 78, 128, 87, 65, 76, 76, 80, 76, 65, 78, + 197, 87, 65, 76, 76, 128, 87, 65, 76, 204, 87, 65, 76, 75, 128, 87, 65, + 76, 203, 87, 65, 73, 84, 73, 78, 71, 128, 87, 65, 73, 83, 84, 128, 87, + 65, 73, 128, 87, 65, 70, 70, 76, 69, 128, 87, 65, 69, 78, 128, 87, 65, + 69, 128, 87, 65, 68, 68, 65, 128, 87, 65, 65, 86, 85, 128, 87, 65, 45, + 53, 128, 87, 65, 45, 52, 128, 87, 65, 45, 51, 128, 87, 65, 45, 50, 128, + 87, 65, 45, 49, 128, 87, 48, 50, 53, 128, 87, 48, 50, 52, 65, 128, 87, + 48, 50, 52, 128, 87, 48, 50, 51, 128, 87, 48, 50, 50, 128, 87, 48, 50, + 49, 128, 87, 48, 50, 48, 128, 87, 48, 49, 57, 128, 87, 48, 49, 56, 65, + 128, 87, 48, 49, 56, 128, 87, 48, 49, 55, 65, 128, 87, 48, 49, 55, 128, + 87, 48, 49, 54, 128, 87, 48, 49, 53, 128, 87, 48, 49, 52, 65, 128, 87, + 48, 49, 52, 128, 87, 48, 49, 51, 128, 87, 48, 49, 50, 128, 87, 48, 49, + 49, 128, 87, 48, 49, 48, 65, 128, 87, 48, 49, 48, 128, 87, 48, 48, 57, + 65, 128, 87, 48, 48, 57, 128, 87, 48, 48, 56, 128, 87, 48, 48, 55, 128, + 87, 48, 48, 54, 128, 87, 48, 48, 53, 128, 87, 48, 48, 52, 128, 87, 48, + 48, 51, 65, 128, 87, 48, 48, 51, 128, 87, 48, 48, 50, 128, 87, 48, 48, + 49, 128, 86, 90, 77, 69, 84, 128, 86, 89, 88, 128, 86, 89, 84, 128, 86, + 89, 82, 88, 128, 86, 89, 82, 128, 86, 89, 80, 128, 86, 89, 128, 86, 87, + 74, 128, 86, 87, 65, 128, 86, 87, 128, 86, 85, 88, 128, 86, 85, 85, 128, + 86, 85, 84, 128, 86, 85, 82, 88, 128, 86, 85, 82, 128, 86, 85, 80, 128, + 86, 85, 76, 71, 65, 210, 86, 85, 76, 67, 65, 78, 85, 83, 128, 86, 85, 69, + 81, 128, 86, 84, 83, 128, 86, 84, 128, 86, 83, 57, 57, 128, 86, 83, 57, + 56, 128, 86, 83, 57, 55, 128, 86, 83, 57, 54, 128, 86, 83, 57, 53, 128, + 86, 83, 57, 52, 128, 86, 83, 57, 51, 128, 86, 83, 57, 50, 128, 86, 83, + 57, 49, 128, 86, 83, 57, 48, 128, 86, 83, 57, 128, 86, 83, 56, 57, 128, + 86, 83, 56, 56, 128, 86, 83, 56, 55, 128, 86, 83, 56, 54, 128, 86, 83, + 56, 53, 128, 86, 83, 56, 52, 128, 86, 83, 56, 51, 128, 86, 83, 56, 50, + 128, 86, 83, 56, 49, 128, 86, 83, 56, 48, 128, 86, 83, 56, 128, 86, 83, + 55, 57, 128, 86, 83, 55, 56, 128, 86, 83, 55, 55, 128, 86, 83, 55, 54, + 128, 86, 83, 55, 53, 128, 86, 83, 55, 52, 128, 86, 83, 55, 51, 128, 86, + 83, 55, 50, 128, 86, 83, 55, 49, 128, 86, 83, 55, 48, 128, 86, 83, 55, + 128, 86, 83, 54, 57, 128, 86, 83, 54, 56, 128, 86, 83, 54, 55, 128, 86, + 83, 54, 54, 128, 86, 83, 54, 53, 128, 86, 83, 54, 52, 128, 86, 83, 54, + 51, 128, 86, 83, 54, 50, 128, 86, 83, 54, 49, 128, 86, 83, 54, 48, 128, + 86, 83, 54, 128, 86, 83, 53, 57, 128, 86, 83, 53, 56, 128, 86, 83, 53, + 55, 128, 86, 83, 53, 54, 128, 86, 83, 53, 53, 128, 86, 83, 53, 52, 128, + 86, 83, 53, 51, 128, 86, 83, 53, 50, 128, 86, 83, 53, 49, 128, 86, 83, + 53, 48, 128, 86, 83, 53, 128, 86, 83, 52, 57, 128, 86, 83, 52, 56, 128, + 86, 83, 52, 55, 128, 86, 83, 52, 54, 128, 86, 83, 52, 53, 128, 86, 83, + 52, 52, 128, 86, 83, 52, 51, 128, 86, 83, 52, 50, 128, 86, 83, 52, 49, + 128, 86, 83, 52, 48, 128, 86, 83, 52, 128, 86, 83, 51, 57, 128, 86, 83, + 51, 56, 128, 86, 83, 51, 55, 128, 86, 83, 51, 54, 128, 86, 83, 51, 53, + 128, 86, 83, 51, 52, 128, 86, 83, 51, 51, 128, 86, 83, 51, 50, 128, 86, + 83, 51, 49, 128, 86, 83, 51, 48, 128, 86, 83, 51, 128, 86, 83, 50, 57, + 128, 86, 83, 50, 56, 128, 86, 83, 50, 55, 128, 86, 83, 50, 54, 128, 86, + 83, 50, 53, 54, 128, 86, 83, 50, 53, 53, 128, 86, 83, 50, 53, 52, 128, + 86, 83, 50, 53, 51, 128, 86, 83, 50, 53, 50, 128, 86, 83, 50, 53, 49, + 128, 86, 83, 50, 53, 48, 128, 86, 83, 50, 53, 128, 86, 83, 50, 52, 57, + 128, 86, 83, 50, 52, 56, 128, 86, 83, 50, 52, 55, 128, 86, 83, 50, 52, + 54, 128, 86, 83, 50, 52, 53, 128, 86, 83, 50, 52, 52, 128, 86, 83, 50, + 52, 51, 128, 86, 83, 50, 52, 50, 128, 86, 83, 50, 52, 49, 128, 86, 83, + 50, 52, 48, 128, 86, 83, 50, 52, 128, 86, 83, 50, 51, 57, 128, 86, 83, + 50, 51, 56, 128, 86, 83, 50, 51, 55, 128, 86, 83, 50, 51, 54, 128, 86, + 83, 50, 51, 53, 128, 86, 83, 50, 51, 52, 128, 86, 83, 50, 51, 51, 128, + 86, 83, 50, 51, 50, 128, 86, 83, 50, 51, 49, 128, 86, 83, 50, 51, 48, + 128, 86, 83, 50, 51, 128, 86, 83, 50, 50, 57, 128, 86, 83, 50, 50, 56, + 128, 86, 83, 50, 50, 55, 128, 86, 83, 50, 50, 54, 128, 86, 83, 50, 50, + 53, 128, 86, 83, 50, 50, 52, 128, 86, 83, 50, 50, 51, 128, 86, 83, 50, + 50, 50, 128, 86, 83, 50, 50, 49, 128, 86, 83, 50, 50, 48, 128, 86, 83, + 50, 50, 128, 86, 83, 50, 49, 57, 128, 86, 83, 50, 49, 56, 128, 86, 83, + 50, 49, 55, 128, 86, 83, 50, 49, 54, 128, 86, 83, 50, 49, 53, 128, 86, + 83, 50, 49, 52, 128, 86, 83, 50, 49, 51, 128, 86, 83, 50, 49, 50, 128, + 86, 83, 50, 49, 49, 128, 86, 83, 50, 49, 48, 128, 86, 83, 50, 49, 128, + 86, 83, 50, 48, 57, 128, 86, 83, 50, 48, 56, 128, 86, 83, 50, 48, 55, + 128, 86, 83, 50, 48, 54, 128, 86, 83, 50, 48, 53, 128, 86, 83, 50, 48, + 52, 128, 86, 83, 50, 48, 51, 128, 86, 83, 50, 48, 50, 128, 86, 83, 50, + 48, 49, 128, 86, 83, 50, 48, 48, 128, 86, 83, 50, 48, 128, 86, 83, 50, + 128, 86, 83, 49, 57, 57, 128, 86, 83, 49, 57, 56, 128, 86, 83, 49, 57, + 55, 128, 86, 83, 49, 57, 54, 128, 86, 83, 49, 57, 53, 128, 86, 83, 49, + 57, 52, 128, 86, 83, 49, 57, 51, 128, 86, 83, 49, 57, 50, 128, 86, 83, + 49, 57, 49, 128, 86, 83, 49, 57, 48, 128, 86, 83, 49, 57, 128, 86, 83, + 49, 56, 57, 128, 86, 83, 49, 56, 56, 128, 86, 83, 49, 56, 55, 128, 86, + 83, 49, 56, 54, 128, 86, 83, 49, 56, 53, 128, 86, 83, 49, 56, 52, 128, + 86, 83, 49, 56, 51, 128, 86, 83, 49, 56, 50, 128, 86, 83, 49, 56, 49, + 128, 86, 83, 49, 56, 48, 128, 86, 83, 49, 56, 128, 86, 83, 49, 55, 57, + 128, 86, 83, 49, 55, 56, 128, 86, 83, 49, 55, 55, 128, 86, 83, 49, 55, + 54, 128, 86, 83, 49, 55, 53, 128, 86, 83, 49, 55, 52, 128, 86, 83, 49, + 55, 51, 128, 86, 83, 49, 55, 50, 128, 86, 83, 49, 55, 49, 128, 86, 83, + 49, 55, 48, 128, 86, 83, 49, 55, 128, 86, 83, 49, 54, 57, 128, 86, 83, + 49, 54, 56, 128, 86, 83, 49, 54, 55, 128, 86, 83, 49, 54, 54, 128, 86, + 83, 49, 54, 53, 128, 86, 83, 49, 54, 52, 128, 86, 83, 49, 54, 51, 128, + 86, 83, 49, 54, 50, 128, 86, 83, 49, 54, 49, 128, 86, 83, 49, 54, 48, + 128, 86, 83, 49, 54, 128, 86, 83, 49, 53, 57, 128, 86, 83, 49, 53, 56, + 128, 86, 83, 49, 53, 55, 128, 86, 83, 49, 53, 54, 128, 86, 83, 49, 53, + 53, 128, 86, 83, 49, 53, 52, 128, 86, 83, 49, 53, 51, 128, 86, 83, 49, + 53, 50, 128, 86, 83, 49, 53, 49, 128, 86, 83, 49, 53, 48, 128, 86, 83, + 49, 53, 128, 86, 83, 49, 52, 57, 128, 86, 83, 49, 52, 56, 128, 86, 83, + 49, 52, 55, 128, 86, 83, 49, 52, 54, 128, 86, 83, 49, 52, 53, 128, 86, + 83, 49, 52, 52, 128, 86, 83, 49, 52, 51, 128, 86, 83, 49, 52, 50, 128, + 86, 83, 49, 52, 49, 128, 86, 83, 49, 52, 48, 128, 86, 83, 49, 52, 128, + 86, 83, 49, 51, 57, 128, 86, 83, 49, 51, 56, 128, 86, 83, 49, 51, 55, + 128, 86, 83, 49, 51, 54, 128, 86, 83, 49, 51, 53, 128, 86, 83, 49, 51, + 52, 128, 86, 83, 49, 51, 51, 128, 86, 83, 49, 51, 50, 128, 86, 83, 49, + 51, 49, 128, 86, 83, 49, 51, 48, 128, 86, 83, 49, 51, 128, 86, 83, 49, + 50, 57, 128, 86, 83, 49, 50, 56, 128, 86, 83, 49, 50, 55, 128, 86, 83, + 49, 50, 54, 128, 86, 83, 49, 50, 53, 128, 86, 83, 49, 50, 52, 128, 86, + 83, 49, 50, 51, 128, 86, 83, 49, 50, 50, 128, 86, 83, 49, 50, 49, 128, + 86, 83, 49, 50, 48, 128, 86, 83, 49, 50, 128, 86, 83, 49, 49, 57, 128, + 86, 83, 49, 49, 56, 128, 86, 83, 49, 49, 55, 128, 86, 83, 49, 49, 54, + 128, 86, 83, 49, 49, 53, 128, 86, 83, 49, 49, 52, 128, 86, 83, 49, 49, + 51, 128, 86, 83, 49, 49, 50, 128, 86, 83, 49, 49, 49, 128, 86, 83, 49, + 49, 48, 128, 86, 83, 49, 49, 128, 86, 83, 49, 48, 57, 128, 86, 83, 49, + 48, 56, 128, 86, 83, 49, 48, 55, 128, 86, 83, 49, 48, 54, 128, 86, 83, + 49, 48, 53, 128, 86, 83, 49, 48, 52, 128, 86, 83, 49, 48, 51, 128, 86, + 83, 49, 48, 50, 128, 86, 83, 49, 48, 49, 128, 86, 83, 49, 48, 48, 128, + 86, 83, 49, 48, 128, 86, 83, 49, 128, 86, 83, 128, 86, 82, 65, 67, 72, + 89, 128, 86, 79, 88, 128, 86, 79, 87, 69, 76, 45, 67, 65, 82, 82, 73, 69, + 210, 86, 79, 87, 128, 86, 79, 85, 128, 86, 79, 84, 128, 86, 79, 211, 86, + 79, 80, 128, 86, 79, 79, 73, 128, 86, 79, 79, 128, 86, 79, 77, 73, 84, + 73, 78, 71, 128, 86, 79, 77, 128, 86, 79, 76, 85, 77, 197, 86, 79, 76, + 84, 65, 71, 197, 86, 79, 76, 76, 69, 89, 66, 65, 76, 76, 128, 86, 79, 76, + 67, 65, 78, 79, 128, 86, 79, 76, 65, 80, 85, 203, 86, 79, 73, 68, 69, + 196, 86, 79, 73, 196, 86, 79, 73, 67, 73, 78, 71, 128, 86, 79, 73, 67, + 69, 76, 69, 83, 211, 86, 79, 73, 67, 69, 196, 86, 79, 68, 128, 86, 79, + 67, 65, 76, 73, 90, 65, 84, 73, 79, 206, 86, 79, 67, 65, 204, 86, 79, + 128, 86, 73, 89, 79, 128, 86, 73, 88, 128, 86, 73, 84, 82, 73, 79, 76, + 45, 50, 128, 86, 73, 84, 82, 73, 79, 76, 128, 86, 73, 84, 65, 69, 45, 50, + 128, 86, 73, 84, 65, 69, 128, 86, 73, 84, 128, 86, 73, 83, 73, 71, 79, + 84, 72, 73, 195, 86, 73, 83, 65, 82, 71, 65, 89, 65, 128, 86, 73, 83, 65, + 82, 71, 65, 128, 86, 73, 83, 65, 82, 71, 193, 86, 73, 82, 73, 65, 77, + 128, 86, 73, 82, 71, 79, 128, 86, 73, 82, 71, 65, 128, 86, 73, 82, 65, + 77, 65, 128, 86, 73, 80, 128, 86, 73, 79, 76, 73, 78, 128, 86, 73, 78, + 69, 71, 65, 82, 45, 51, 128, 86, 73, 78, 69, 71, 65, 82, 45, 50, 128, 86, + 73, 78, 69, 71, 65, 82, 128, 86, 73, 78, 69, 71, 65, 210, 86, 73, 78, 69, + 128, 86, 73, 78, 197, 86, 73, 78, 128, 86, 73, 76, 76, 65, 71, 69, 128, + 86, 73, 73, 128, 86, 73, 71, 73, 78, 84, 73, 76, 69, 128, 86, 73, 69, 88, + 128, 86, 73, 69, 87, 73, 78, 199, 86, 73, 69, 87, 68, 65, 84, 193, 86, + 73, 69, 84, 78, 65, 77, 69, 83, 197, 86, 73, 69, 84, 128, 86, 73, 69, + 212, 86, 73, 69, 80, 128, 86, 73, 69, 128, 86, 73, 68, 74, 45, 50, 128, + 86, 73, 68, 74, 128, 86, 73, 68, 69, 79, 67, 65, 83, 83, 69, 84, 84, 69, + 128, 86, 73, 68, 69, 207, 86, 73, 68, 65, 128, 86, 73, 67, 84, 79, 82, + 217, 86, 73, 66, 82, 65, 84, 73, 79, 206, 86, 72, 65, 128, 86, 70, 65, + 128, 86, 69, 89, 90, 128, 86, 69, 88, 128, 86, 69, 87, 128, 86, 69, 215, + 86, 69, 85, 88, 128, 86, 69, 85, 77, 128, 86, 69, 85, 65, 69, 80, 69, 78, + 128, 86, 69, 85, 65, 69, 128, 86, 69, 83, 84, 65, 128, 86, 69, 83, 84, + 128, 86, 69, 83, 83, 69, 204, 86, 69, 82, 217, 86, 69, 82, 84, 73, 67, + 65, 76, 76, 89, 128, 86, 69, 82, 84, 73, 67, 65, 76, 76, 217, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 54, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 54, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, + 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 50, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 49, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 53, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 53, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, + 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 51, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 50, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 53, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 52, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, + 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 52, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 51, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 52, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 52, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, + 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 53, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 52, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 51, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 51, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, + 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 54, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 53, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 50, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 50, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, + 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 48, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 54, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 49, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 49, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, + 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 49, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 48, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 45, 48, 48, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, + 48, 48, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, + 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 50, 128, + 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 49, 128, 86, 69, 82, + 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 128, 86, 69, 82, 83, 73, 67, 76, 69, 128, 86, 69, 82, 83, 197, + 86, 69, 82, 71, 69, 128, 86, 69, 82, 68, 73, 71, 82, 73, 83, 128, 86, 69, + 82, 128, 86, 69, 80, 128, 86, 69, 78, 68, 128, 86, 69, 76, 73, 128, 86, + 69, 73, 76, 128, 86, 69, 72, 73, 67, 76, 69, 128, 86, 69, 72, 128, 86, + 69, 200, 86, 69, 69, 128, 86, 69, 197, 86, 69, 68, 69, 128, 86, 69, 67, + 84, 79, 210, 86, 65, 89, 65, 78, 78, 65, 128, 86, 65, 88, 128, 86, 65, + 86, 128, 86, 65, 214, 86, 65, 85, 128, 86, 65, 84, 72, 89, 128, 86, 65, + 84, 128, 86, 65, 83, 84, 78, 69, 83, 211, 86, 65, 83, 73, 83, 128, 86, + 65, 82, 89, 211, 86, 65, 82, 73, 75, 65, 128, 86, 65, 82, 73, 65, 78, 84, + 128, 86, 65, 82, 73, 65, 78, 212, 86, 65, 82, 73, 65, 128, 86, 65, 82, + 73, 193, 86, 65, 82, 69, 73, 65, 201, 86, 65, 82, 69, 73, 193, 86, 65, + 82, 65, 65, 75, 65, 78, 128, 86, 65, 80, 79, 85, 82, 83, 128, 86, 65, 80, + 128, 86, 65, 78, 69, 128, 86, 65, 77, 80, 73, 82, 69, 128, 86, 65, 77, + 65, 71, 79, 77, 85, 75, 72, 65, 128, 86, 65, 77, 65, 71, 79, 77, 85, 75, + 72, 193, 86, 65, 76, 76, 69, 89, 128, 86, 65, 75, 65, 73, 89, 65, 82, 65, + 65, 128, 86, 65, 74, 128, 86, 65, 73, 128, 86, 65, 72, 128, 86, 65, 200, + 86, 65, 65, 86, 85, 128, 86, 65, 65, 128, 86, 193, 86, 48, 52, 48, 65, + 128, 86, 48, 52, 48, 128, 86, 48, 51, 57, 128, 86, 48, 51, 56, 128, 86, + 48, 51, 55, 65, 128, 86, 48, 51, 55, 128, 86, 48, 51, 54, 128, 86, 48, + 51, 53, 128, 86, 48, 51, 52, 128, 86, 48, 51, 51, 65, 128, 86, 48, 51, + 51, 128, 86, 48, 51, 50, 128, 86, 48, 51, 49, 65, 128, 86, 48, 51, 49, + 128, 86, 48, 51, 48, 65, 128, 86, 48, 51, 48, 128, 86, 48, 50, 57, 65, + 128, 86, 48, 50, 57, 128, 86, 48, 50, 56, 65, 128, 86, 48, 50, 56, 128, + 86, 48, 50, 55, 128, 86, 48, 50, 54, 128, 86, 48, 50, 53, 128, 86, 48, + 50, 52, 128, 86, 48, 50, 51, 65, 128, 86, 48, 50, 51, 128, 86, 48, 50, + 50, 128, 86, 48, 50, 49, 128, 86, 48, 50, 48, 76, 128, 86, 48, 50, 48, + 75, 128, 86, 48, 50, 48, 74, 128, 86, 48, 50, 48, 73, 128, 86, 48, 50, + 48, 72, 128, 86, 48, 50, 48, 71, 128, 86, 48, 50, 48, 70, 128, 86, 48, + 50, 48, 69, 128, 86, 48, 50, 48, 68, 128, 86, 48, 50, 48, 67, 128, 86, + 48, 50, 48, 66, 128, 86, 48, 50, 48, 65, 128, 86, 48, 50, 48, 128, 86, + 48, 49, 57, 128, 86, 48, 49, 56, 128, 86, 48, 49, 55, 128, 86, 48, 49, + 54, 128, 86, 48, 49, 53, 128, 86, 48, 49, 52, 128, 86, 48, 49, 51, 128, + 86, 48, 49, 50, 66, 128, 86, 48, 49, 50, 65, 128, 86, 48, 49, 50, 128, + 86, 48, 49, 49, 67, 128, 86, 48, 49, 49, 66, 128, 86, 48, 49, 49, 65, + 128, 86, 48, 49, 49, 128, 86, 48, 49, 48, 128, 86, 48, 48, 57, 128, 86, + 48, 48, 56, 128, 86, 48, 48, 55, 66, 128, 86, 48, 48, 55, 65, 128, 86, + 48, 48, 55, 128, 86, 48, 48, 54, 128, 86, 48, 48, 53, 128, 86, 48, 48, + 52, 128, 86, 48, 48, 51, 128, 86, 48, 48, 50, 65, 128, 86, 48, 48, 50, + 128, 86, 48, 48, 49, 73, 128, 86, 48, 48, 49, 72, 128, 86, 48, 48, 49, + 71, 128, 86, 48, 48, 49, 70, 128, 86, 48, 48, 49, 69, 128, 86, 48, 48, + 49, 68, 128, 86, 48, 48, 49, 67, 128, 86, 48, 48, 49, 66, 128, 86, 48, + 48, 49, 65, 128, 86, 48, 48, 49, 128, 85, 90, 85, 128, 85, 90, 72, 65, + 75, 75, 85, 128, 85, 90, 51, 128, 85, 90, 179, 85, 89, 65, 78, 78, 65, + 128, 85, 89, 128, 85, 87, 85, 128, 85, 85, 89, 65, 78, 78, 65, 128, 85, + 85, 85, 85, 128, 85, 85, 85, 51, 128, 85, 85, 85, 50, 128, 85, 85, 69, + 128, 85, 84, 85, 75, 73, 128, 85, 83, 83, 85, 51, 128, 85, 83, 83, 85, + 128, 85, 83, 72, 88, 128, 85, 83, 72, 85, 77, 88, 128, 85, 83, 72, 69, + 78, 78, 65, 128, 85, 83, 72, 50, 128, 85, 83, 72, 128, 85, 83, 200, 85, + 83, 69, 196, 85, 83, 69, 45, 50, 128, 85, 83, 69, 45, 49, 128, 85, 83, + 69, 128, 85, 83, 197, 85, 82, 85, 218, 85, 82, 85, 83, 128, 85, 82, 85, + 68, 65, 128, 85, 82, 85, 68, 193, 85, 82, 85, 128, 85, 82, 213, 85, 82, + 78, 128, 85, 82, 73, 78, 69, 128, 85, 82, 73, 51, 128, 85, 82, 73, 128, + 85, 82, 65, 78, 85, 83, 128, 85, 82, 65, 128, 85, 82, 52, 128, 85, 82, + 50, 128, 85, 82, 178, 85, 210, 85, 80, 87, 65, 82, 68, 83, 128, 85, 80, + 87, 65, 82, 68, 211, 85, 80, 87, 65, 82, 68, 128, 85, 80, 87, 65, 82, + 196, 85, 80, 84, 85, 82, 78, 128, 85, 80, 83, 73, 76, 79, 78, 128, 85, + 80, 83, 73, 76, 79, 206, 85, 80, 83, 73, 68, 69, 45, 68, 79, 87, 206, 85, + 80, 82, 73, 71, 72, 212, 85, 80, 80, 69, 82, 128, 85, 80, 65, 68, 72, 77, + 65, 78, 73, 89, 65, 128, 85, 80, 45, 80, 79, 73, 78, 84, 73, 78, 199, 85, + 79, 78, 128, 85, 79, 71, 128, 85, 78, 78, 128, 85, 78, 77, 65, 82, 82, + 73, 69, 196, 85, 78, 75, 78, 79, 87, 78, 128, 85, 78, 75, 128, 85, 78, + 73, 86, 69, 82, 83, 65, 204, 85, 78, 73, 84, 89, 128, 85, 78, 73, 84, 69, + 196, 85, 78, 73, 84, 128, 85, 78, 73, 212, 85, 78, 73, 79, 78, 128, 85, + 78, 73, 79, 206, 85, 78, 73, 70, 79, 82, 77, 128, 85, 78, 73, 70, 73, 69, + 196, 85, 78, 73, 67, 79, 82, 206, 85, 78, 69, 86, 69, 206, 85, 78, 68, + 207, 85, 78, 68, 69, 82, 84, 73, 69, 128, 85, 78, 68, 69, 82, 76, 73, 78, + 197, 85, 78, 68, 69, 82, 68, 79, 84, 128, 85, 78, 68, 69, 82, 66, 65, 82, + 128, 85, 78, 68, 69, 82, 128, 85, 78, 68, 69, 210, 85, 78, 67, 73, 193, + 85, 78, 67, 69, 82, 84, 65, 73, 78, 84, 217, 85, 78, 66, 76, 69, 78, 68, + 69, 196, 85, 78, 65, 83, 80, 73, 82, 65, 84, 69, 68, 128, 85, 78, 65, 80, + 128, 85, 78, 65, 77, 85, 83, 69, 196, 85, 78, 65, 128, 85, 206, 85, 77, + 85, 77, 128, 85, 77, 85, 205, 85, 77, 66, 82, 69, 76, 76, 65, 128, 85, + 77, 66, 82, 69, 76, 76, 193, 85, 77, 66, 73, 78, 128, 85, 75, 85, 128, + 85, 75, 82, 65, 73, 78, 73, 65, 206, 85, 75, 65, 82, 65, 128, 85, 75, 65, + 82, 193, 85, 75, 128, 85, 73, 76, 76, 69, 65, 78, 78, 128, 85, 73, 71, + 72, 85, 210, 85, 72, 68, 128, 85, 71, 65, 82, 73, 84, 73, 195, 85, 69, + 89, 128, 85, 69, 78, 128, 85, 69, 73, 128, 85, 69, 69, 128, 85, 69, 65, + 128, 85, 68, 85, 71, 128, 85, 68, 65, 84, 84, 65, 128, 85, 68, 65, 84, + 84, 193, 85, 68, 65, 65, 84, 128, 85, 68, 128, 85, 196, 85, 67, 128, 85, + 66, 85, 70, 73, 76, 73, 128, 85, 66, 72, 65, 89, 65, 84, 207, 85, 66, 65, + 68, 65, 77, 65, 128, 85, 66, 128, 85, 65, 84, 72, 128, 85, 65, 78, 71, + 128, 85, 65, 128, 85, 178, 85, 48, 52, 50, 128, 85, 48, 52, 49, 128, 85, + 48, 52, 48, 128, 85, 48, 51, 57, 128, 85, 48, 51, 56, 128, 85, 48, 51, + 55, 128, 85, 48, 51, 54, 128, 85, 48, 51, 53, 128, 85, 48, 51, 52, 128, + 85, 48, 51, 51, 128, 85, 48, 51, 50, 65, 128, 85, 48, 51, 50, 128, 85, + 48, 51, 49, 128, 85, 48, 51, 48, 128, 85, 48, 50, 57, 65, 128, 85, 48, + 50, 57, 128, 85, 48, 50, 56, 128, 85, 48, 50, 55, 128, 85, 48, 50, 54, + 128, 85, 48, 50, 53, 128, 85, 48, 50, 52, 128, 85, 48, 50, 51, 65, 128, + 85, 48, 50, 51, 128, 85, 48, 50, 50, 128, 85, 48, 50, 49, 128, 85, 48, + 50, 48, 128, 85, 48, 49, 57, 128, 85, 48, 49, 56, 128, 85, 48, 49, 55, + 128, 85, 48, 49, 54, 128, 85, 48, 49, 53, 128, 85, 48, 49, 52, 128, 85, + 48, 49, 51, 128, 85, 48, 49, 50, 128, 85, 48, 49, 49, 128, 85, 48, 49, + 48, 128, 85, 48, 48, 57, 128, 85, 48, 48, 56, 128, 85, 48, 48, 55, 128, + 85, 48, 48, 54, 66, 128, 85, 48, 48, 54, 65, 128, 85, 48, 48, 54, 128, + 85, 48, 48, 53, 128, 85, 48, 48, 52, 128, 85, 48, 48, 51, 128, 85, 48, + 48, 50, 128, 85, 48, 48, 49, 128, 85, 45, 83, 72, 65, 80, 69, 196, 85, + 45, 73, 45, 73, 128, 85, 45, 69, 79, 45, 69, 85, 128, 85, 45, 66, 82, 74, + 71, 85, 128, 85, 45, 53, 128, 84, 90, 85, 128, 84, 90, 79, 65, 128, 84, + 90, 79, 128, 84, 90, 73, 210, 84, 90, 73, 128, 84, 90, 69, 69, 128, 84, + 90, 69, 128, 84, 90, 65, 65, 128, 84, 90, 65, 128, 84, 90, 128, 84, 89, + 210, 84, 89, 80, 69, 45, 183, 84, 89, 80, 69, 45, 54, 128, 84, 89, 80, + 69, 45, 182, 84, 89, 80, 69, 45, 53, 128, 84, 89, 80, 69, 45, 181, 84, + 89, 80, 69, 45, 52, 128, 84, 89, 80, 69, 45, 180, 84, 89, 80, 69, 45, 51, + 128, 84, 89, 80, 69, 45, 179, 84, 89, 80, 69, 45, 178, 84, 89, 80, 69, + 45, 49, 45, 50, 128, 84, 89, 80, 69, 45, 177, 84, 89, 80, 197, 84, 89, + 79, 128, 84, 89, 73, 128, 84, 89, 69, 128, 84, 89, 65, 89, 128, 84, 89, + 65, 128, 84, 88, 87, 86, 128, 84, 88, 87, 214, 84, 88, 72, 69, 69, 202, + 84, 88, 65, 128, 84, 87, 79, 79, 128, 84, 87, 79, 45, 87, 65, 217, 84, + 87, 79, 45, 84, 72, 73, 82, 84, 89, 128, 84, 87, 79, 45, 76, 73, 78, 197, + 84, 87, 79, 45, 72, 69, 65, 68, 69, 196, 84, 87, 79, 45, 69, 205, 84, 87, + 79, 45, 67, 73, 82, 67, 76, 197, 84, 87, 73, 83, 84, 73, 78, 71, 128, 84, + 87, 73, 83, 84, 69, 196, 84, 87, 73, 73, 128, 84, 87, 73, 128, 84, 87, + 69, 78, 84, 89, 45, 84, 87, 79, 128, 84, 87, 69, 78, 84, 89, 45, 84, 87, + 207, 84, 87, 69, 78, 84, 89, 45, 84, 72, 82, 69, 69, 128, 84, 87, 69, 78, + 84, 89, 45, 83, 73, 88, 128, 84, 87, 69, 78, 84, 89, 45, 83, 69, 86, 69, + 78, 128, 84, 87, 69, 78, 84, 89, 45, 79, 78, 69, 128, 84, 87, 69, 78, 84, + 89, 45, 78, 73, 78, 69, 128, 84, 87, 69, 78, 84, 89, 45, 70, 79, 85, 82, + 128, 84, 87, 69, 78, 84, 89, 45, 70, 73, 86, 69, 128, 84, 87, 69, 78, 84, + 89, 45, 70, 73, 86, 197, 84, 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, 84, + 200, 84, 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, 84, 128, 84, 87, 69, 78, + 84, 89, 128, 84, 87, 69, 78, 84, 217, 84, 87, 69, 78, 84, 73, 69, 84, 72, + 83, 128, 84, 87, 69, 78, 84, 73, 69, 84, 72, 128, 84, 87, 69, 76, 86, 69, + 45, 84, 72, 73, 82, 84, 89, 128, 84, 87, 69, 76, 86, 69, 128, 84, 87, 69, + 76, 86, 197, 84, 87, 69, 76, 70, 84, 72, 83, 128, 84, 87, 69, 76, 70, 84, + 72, 128, 84, 87, 69, 128, 84, 87, 65, 65, 128, 84, 87, 65, 128, 84, 86, + 82, 73, 68, 79, 128, 84, 86, 73, 77, 65, 68, 85, 210, 84, 85, 88, 69, 68, + 79, 128, 84, 85, 88, 128, 84, 85, 85, 77, 85, 128, 84, 85, 85, 128, 84, + 85, 84, 84, 89, 128, 84, 85, 84, 69, 89, 65, 83, 65, 84, 128, 84, 85, 84, 128, 84, 85, 82, 88, 128, 84, 85, 82, 85, 128, 84, 85, 82, 84, 76, 69, 128, 84, 85, 82, 79, 50, 128, 84, 85, 82, 78, 83, 84, 73, 76, 69, 128, 84, 85, 82, 206, 84, 85, 82, 75, 73, 83, 200, 84, 85, 82, 75, 73, 195, 84, 85, 82, 75, 69, 89, 128, 84, 85, 82, 66, 65, 78, 128, 84, 85, 82, - 128, 84, 85, 80, 78, 73, 128, 84, 85, 80, 128, 84, 85, 79, 88, 128, 84, - 85, 79, 84, 128, 84, 85, 79, 80, 128, 84, 85, 79, 128, 84, 85, 78, 78, - 89, 128, 84, 85, 77, 69, 84, 69, 83, 128, 84, 85, 77, 66, 76, 69, 210, - 84, 85, 77, 65, 69, 128, 84, 85, 77, 128, 84, 85, 205, 84, 85, 76, 73, - 80, 128, 84, 85, 75, 87, 69, 78, 84, 73, 83, 128, 84, 85, 75, 128, 84, - 85, 71, 82, 73, 203, 84, 85, 71, 50, 128, 84, 85, 71, 178, 84, 85, 66, - 69, 128, 84, 85, 66, 128, 84, 85, 65, 82, 69, 199, 84, 85, 65, 69, 80, - 128, 84, 85, 65, 69, 128, 84, 85, 45, 84, 79, 128, 84, 85, 45, 52, 128, - 84, 85, 45, 51, 128, 84, 85, 45, 50, 128, 84, 85, 45, 49, 128, 84, 213, - 84, 84, 85, 85, 128, 84, 84, 85, 68, 68, 65, 71, 128, 84, 84, 85, 68, 68, - 65, 65, 71, 128, 84, 84, 85, 128, 84, 84, 84, 72, 65, 128, 84, 84, 84, - 65, 128, 84, 84, 83, 85, 128, 84, 84, 83, 79, 128, 84, 84, 83, 73, 128, - 84, 84, 83, 69, 69, 128, 84, 84, 83, 69, 128, 84, 84, 83, 65, 128, 84, - 84, 79, 79, 128, 84, 84, 73, 73, 128, 84, 84, 73, 128, 84, 84, 72, 87, - 69, 128, 84, 84, 72, 85, 128, 84, 84, 72, 79, 79, 128, 84, 84, 72, 79, - 128, 84, 84, 72, 73, 128, 84, 84, 72, 69, 69, 128, 84, 84, 72, 69, 128, - 84, 84, 72, 65, 65, 128, 84, 84, 72, 128, 84, 84, 69, 72, 69, 72, 128, - 84, 84, 69, 72, 69, 200, 84, 84, 69, 72, 128, 84, 84, 69, 200, 84, 84, - 69, 69, 128, 84, 84, 65, 89, 65, 78, 78, 65, 128, 84, 84, 65, 85, 128, - 84, 84, 65, 73, 128, 84, 84, 65, 65, 128, 84, 84, 50, 128, 84, 83, 87, - 69, 128, 84, 83, 87, 66, 128, 84, 83, 87, 65, 128, 84, 83, 86, 128, 84, - 83, 83, 69, 128, 84, 83, 83, 65, 128, 84, 83, 79, 214, 84, 83, 73, 85, - 128, 84, 83, 72, 85, 71, 83, 128, 84, 83, 72, 79, 79, 75, 128, 84, 83, - 72, 79, 79, 203, 84, 83, 72, 79, 79, 74, 128, 84, 83, 72, 69, 83, 128, - 84, 83, 72, 69, 71, 128, 84, 83, 72, 69, 199, 84, 83, 72, 69, 69, 74, - 128, 84, 83, 72, 69, 128, 84, 83, 72, 65, 194, 84, 83, 72, 65, 128, 84, - 83, 69, 82, 69, 128, 84, 83, 69, 69, 66, 128, 84, 83, 65, 68, 73, 128, - 84, 83, 65, 68, 201, 84, 83, 65, 66, 128, 84, 83, 65, 65, 68, 73, 89, - 128, 84, 83, 65, 65, 128, 84, 83, 193, 84, 211, 84, 82, 89, 66, 76, 73, - 79, 206, 84, 82, 85, 84, 72, 128, 84, 82, 85, 78, 75, 128, 84, 82, 85, - 78, 67, 65, 84, 69, 196, 84, 82, 85, 77, 80, 69, 84, 128, 84, 82, 85, 77, - 80, 45, 57, 128, 84, 82, 85, 77, 80, 45, 56, 128, 84, 82, 85, 77, 80, 45, - 55, 128, 84, 82, 85, 77, 80, 45, 54, 128, 84, 82, 85, 77, 80, 45, 53, - 128, 84, 82, 85, 77, 80, 45, 52, 128, 84, 82, 85, 77, 80, 45, 51, 128, - 84, 82, 85, 77, 80, 45, 50, 49, 128, 84, 82, 85, 77, 80, 45, 50, 48, 128, - 84, 82, 85, 77, 80, 45, 50, 128, 84, 82, 85, 77, 80, 45, 49, 57, 128, 84, - 82, 85, 77, 80, 45, 49, 56, 128, 84, 82, 85, 77, 80, 45, 49, 55, 128, 84, - 82, 85, 77, 80, 45, 49, 54, 128, 84, 82, 85, 77, 80, 45, 49, 53, 128, 84, - 82, 85, 77, 80, 45, 49, 52, 128, 84, 82, 85, 77, 80, 45, 49, 51, 128, 84, - 82, 85, 77, 80, 45, 49, 50, 128, 84, 82, 85, 77, 80, 45, 49, 49, 128, 84, - 82, 85, 77, 80, 45, 49, 48, 128, 84, 82, 85, 77, 80, 45, 49, 128, 84, 82, - 85, 69, 128, 84, 82, 85, 197, 84, 82, 85, 67, 75, 128, 84, 82, 79, 80, - 73, 67, 65, 204, 84, 82, 79, 80, 72, 89, 128, 84, 82, 79, 77, 73, 75, 79, - 83, 89, 78, 65, 71, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79, 80, 83, 73, - 70, 73, 83, 84, 79, 78, 128, 84, 82, 79, 77, 73, 75, 79, 80, 65, 82, 65, - 75, 65, 76, 69, 83, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79, 78, 128, 84, - 82, 79, 77, 73, 75, 79, 206, 84, 82, 79, 77, 73, 75, 79, 76, 89, 71, 73, - 83, 77, 65, 128, 84, 82, 79, 76, 76, 69, 89, 66, 85, 83, 128, 84, 82, 79, - 76, 76, 69, 89, 128, 84, 82, 79, 75, 85, 84, 65, 83, 84, 201, 84, 82, 79, - 69, 90, 69, 78, 73, 65, 206, 84, 82, 73, 85, 77, 80, 72, 128, 84, 82, 73, - 84, 79, 211, 84, 82, 73, 84, 73, 77, 79, 82, 73, 79, 78, 128, 84, 82, 73, - 83, 73, 77, 79, 85, 128, 84, 82, 73, 83, 69, 77, 69, 128, 84, 82, 73, 80, - 79, 68, 128, 84, 82, 73, 80, 76, 73, 128, 84, 82, 73, 80, 76, 69, 128, - 84, 82, 73, 80, 76, 197, 84, 82, 73, 79, 206, 84, 82, 73, 76, 76, 73, 79, - 78, 83, 128, 84, 82, 73, 73, 83, 65, 80, 128, 84, 82, 73, 71, 82, 65, 77, - 77, 79, 211, 84, 82, 73, 71, 82, 65, 205, 84, 82, 73, 71, 79, 82, 71, 79, - 78, 128, 84, 82, 73, 70, 79, 78, 73, 65, 83, 128, 84, 82, 73, 70, 79, 76, - 73, 65, 84, 197, 84, 82, 73, 68, 69, 78, 84, 128, 84, 82, 73, 68, 69, 78, - 212, 84, 82, 73, 67, 79, 76, 79, 78, 128, 84, 82, 73, 65, 78, 71, 85, 76, - 65, 210, 84, 82, 73, 65, 78, 71, 76, 69, 45, 82, 79, 85, 78, 196, 84, 82, - 73, 65, 78, 71, 76, 69, 45, 72, 69, 65, 68, 69, 196, 84, 82, 73, 65, 78, - 71, 76, 69, 128, 84, 82, 73, 65, 78, 71, 76, 197, 84, 82, 73, 65, 128, - 84, 82, 73, 128, 84, 82, 69, 83, 73, 76, 76, 79, 128, 84, 82, 69, 78, 68, - 128, 84, 82, 69, 78, 196, 84, 82, 69, 77, 79, 76, 79, 45, 51, 128, 84, - 82, 69, 77, 79, 76, 79, 45, 50, 128, 84, 82, 69, 77, 79, 76, 79, 45, 49, - 128, 84, 82, 69, 69, 128, 84, 82, 69, 197, 84, 82, 69, 68, 69, 67, 73, - 76, 69, 128, 84, 82, 69, 65, 68, 73, 78, 71, 128, 84, 82, 65, 89, 128, - 84, 82, 65, 86, 69, 76, 45, 87, 65, 76, 76, 80, 76, 65, 78, 197, 84, 82, - 65, 86, 69, 76, 45, 70, 76, 79, 79, 82, 80, 76, 65, 78, 197, 84, 82, 65, - 80, 69, 90, 73, 85, 77, 128, 84, 82, 65, 78, 83, 86, 69, 82, 83, 65, 204, - 84, 82, 65, 78, 83, 80, 79, 83, 73, 84, 73, 79, 206, 84, 82, 65, 78, 83, - 80, 76, 85, 84, 79, 128, 84, 82, 65, 78, 83, 77, 73, 212, 84, 82, 65, 78, - 83, 77, 73, 83, 83, 73, 79, 78, 128, 84, 82, 65, 78, 83, 77, 73, 83, 83, - 73, 79, 206, 84, 82, 65, 77, 87, 65, 89, 128, 84, 82, 65, 77, 128, 84, - 82, 65, 205, 84, 82, 65, 73, 78, 128, 84, 82, 65, 73, 206, 84, 82, 65, - 73, 76, 73, 78, 199, 84, 82, 65, 70, 70, 73, 67, 128, 84, 82, 65, 70, 70, - 73, 195, 84, 82, 65, 68, 73, 84, 73, 79, 78, 65, 204, 84, 82, 65, 68, - 197, 84, 82, 65, 67, 84, 79, 82, 128, 84, 82, 65, 67, 75, 66, 65, 76, 76, - 128, 84, 82, 65, 67, 75, 128, 84, 82, 65, 128, 84, 82, 128, 84, 79, 88, - 128, 84, 79, 87, 69, 82, 128, 84, 79, 87, 65, 82, 68, 211, 84, 79, 86, - 128, 84, 79, 85, 82, 78, 79, 73, 211, 84, 79, 85, 67, 72, 84, 79, 78, - 197, 84, 79, 85, 67, 72, 73, 78, 199, 84, 79, 85, 67, 72, 69, 211, 84, - 79, 85, 67, 200, 84, 79, 84, 65, 204, 84, 79, 84, 128, 84, 79, 83, 128, - 84, 79, 82, 84, 79, 73, 83, 197, 84, 79, 82, 83, 79, 45, 87, 65, 76, 76, - 80, 76, 65, 78, 197, 84, 79, 82, 83, 79, 45, 70, 76, 79, 79, 82, 80, 76, - 65, 78, 197, 84, 79, 82, 83, 79, 128, 84, 79, 82, 78, 65, 68, 79, 128, - 84, 79, 82, 67, 85, 76, 85, 83, 128, 84, 79, 82, 67, 85, 76, 85, 211, 84, - 79, 82, 67, 72, 128, 84, 79, 81, 128, 84, 79, 80, 66, 65, 82, 128, 84, - 79, 80, 45, 76, 73, 71, 72, 84, 69, 196, 84, 79, 80, 128, 84, 79, 208, - 84, 79, 79, 84, 72, 128, 84, 79, 79, 78, 128, 84, 79, 79, 76, 66, 79, 88, - 128, 84, 79, 78, 79, 83, 128, 84, 79, 78, 71, 85, 69, 128, 84, 79, 78, - 71, 85, 197, 84, 79, 78, 71, 128, 84, 79, 78, 69, 45, 86, 128, 84, 79, - 78, 69, 45, 83, 128, 84, 79, 78, 69, 45, 77, 128, 84, 79, 78, 69, 45, 74, - 128, 84, 79, 78, 69, 45, 71, 128, 84, 79, 78, 69, 45, 68, 128, 84, 79, - 78, 69, 45, 66, 128, 84, 79, 78, 69, 45, 56, 128, 84, 79, 78, 69, 45, 55, - 128, 84, 79, 78, 69, 45, 54, 128, 84, 79, 78, 69, 45, 53, 128, 84, 79, - 78, 69, 45, 52, 128, 84, 79, 78, 69, 45, 51, 128, 84, 79, 78, 69, 45, 50, - 128, 84, 79, 78, 69, 45, 49, 128, 84, 79, 78, 69, 128, 84, 79, 78, 65, - 204, 84, 79, 77, 80, 73, 128, 84, 79, 77, 65, 84, 79, 128, 84, 79, 76, - 79, 78, 71, 128, 84, 79, 75, 89, 207, 84, 79, 73, 76, 69, 84, 128, 84, - 79, 71, 69, 84, 72, 69, 82, 128, 84, 79, 68, 207, 84, 79, 65, 78, 68, 65, - 75, 72, 73, 65, 84, 128, 84, 79, 65, 128, 84, 79, 45, 82, 65, 128, 84, - 79, 45, 54, 128, 84, 79, 45, 53, 128, 84, 79, 45, 52, 128, 84, 79, 45, - 51, 128, 84, 79, 45, 50, 128, 84, 79, 45, 49, 128, 84, 78, 128, 84, 76, - 86, 128, 84, 76, 85, 128, 84, 76, 79, 128, 84, 76, 73, 128, 84, 76, 72, - 89, 65, 128, 84, 76, 72, 87, 69, 128, 84, 76, 72, 85, 128, 84, 76, 72, - 79, 79, 128, 84, 76, 72, 79, 128, 84, 76, 72, 73, 128, 84, 76, 72, 69, - 69, 128, 84, 76, 72, 69, 128, 84, 76, 72, 65, 128, 84, 76, 69, 69, 128, - 84, 76, 65, 128, 84, 74, 69, 128, 84, 73, 88, 128, 84, 73, 87, 82, 128, - 84, 73, 87, 78, 128, 84, 73, 87, 65, 218, 84, 73, 84, 85, 65, 69, 80, - 128, 84, 73, 84, 76, 79, 128, 84, 73, 84, 76, 207, 84, 73, 84, 193, 84, - 73, 84, 128, 84, 73, 82, 89, 65, 75, 128, 84, 73, 82, 84, 193, 84, 73, - 82, 79, 78, 73, 65, 206, 84, 73, 82, 72, 85, 84, 193, 84, 73, 82, 69, - 196, 84, 73, 82, 128, 84, 73, 210, 84, 73, 80, 80, 73, 128, 84, 73, 80, - 69, 72, 65, 128, 84, 73, 80, 128, 84, 73, 208, 84, 73, 78, 89, 128, 84, - 73, 78, 217, 84, 73, 78, 78, 69, 128, 84, 73, 78, 67, 84, 85, 82, 69, - 128, 84, 73, 78, 65, 71, 77, 65, 128, 84, 73, 77, 69, 83, 128, 84, 73, - 77, 69, 210, 84, 73, 77, 69, 128, 84, 73, 76, 84, 73, 78, 71, 128, 84, - 73, 76, 84, 73, 78, 199, 84, 73, 76, 84, 128, 84, 73, 76, 69, 83, 128, - 84, 73, 76, 68, 69, 128, 84, 73, 76, 68, 197, 84, 73, 76, 128, 84, 73, - 204, 84, 73, 75, 69, 85, 84, 45, 84, 72, 73, 69, 85, 84, 72, 128, 84, 73, - 75, 69, 85, 84, 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 84, - 73, 75, 69, 85, 84, 45, 83, 73, 79, 83, 128, 84, 73, 75, 69, 85, 84, 45, - 82, 73, 69, 85, 76, 128, 84, 73, 75, 69, 85, 84, 45, 80, 73, 69, 85, 80, - 128, 84, 73, 75, 69, 85, 84, 45, 77, 73, 69, 85, 77, 128, 84, 73, 75, 69, - 85, 84, 45, 75, 73, 89, 69, 79, 75, 128, 84, 73, 75, 69, 85, 84, 45, 67, - 73, 69, 85, 67, 128, 84, 73, 75, 69, 85, 84, 45, 67, 72, 73, 69, 85, 67, - 72, 128, 84, 73, 75, 69, 85, 84, 128, 84, 73, 75, 69, 85, 212, 84, 73, - 71, 72, 84, 76, 89, 45, 67, 76, 79, 83, 69, 196, 84, 73, 71, 72, 212, 84, - 73, 71, 69, 82, 128, 84, 73, 71, 69, 210, 84, 73, 70, 73, 78, 65, 71, - 200, 84, 73, 69, 88, 128, 84, 73, 69, 80, 128, 84, 73, 197, 84, 73, 67, - 75, 69, 84, 83, 128, 84, 73, 67, 75, 69, 84, 128, 84, 73, 67, 75, 128, - 84, 73, 67, 203, 84, 73, 65, 82, 65, 128, 84, 73, 50, 128, 84, 73, 45, - 55, 128, 84, 73, 45, 54, 128, 84, 73, 45, 53, 128, 84, 73, 45, 52, 128, - 84, 73, 45, 51, 128, 84, 73, 45, 50, 128, 84, 73, 45, 49, 128, 84, 72, - 90, 128, 84, 72, 89, 79, 79, 205, 84, 72, 87, 79, 79, 128, 84, 72, 87, - 79, 128, 84, 72, 87, 73, 73, 128, 84, 72, 87, 73, 128, 84, 72, 87, 69, - 69, 128, 84, 72, 87, 65, 65, 128, 84, 72, 87, 65, 128, 84, 72, 85, 82, - 211, 84, 72, 85, 82, 73, 83, 65, 218, 84, 72, 85, 78, 71, 128, 84, 72, - 85, 78, 68, 69, 82, 83, 84, 79, 82, 77, 128, 84, 72, 85, 78, 68, 69, 82, - 128, 84, 72, 85, 78, 68, 69, 210, 84, 72, 85, 77, 66, 211, 84, 72, 85, - 77, 66, 128, 84, 72, 82, 79, 87, 73, 78, 199, 84, 72, 82, 79, 85, 71, 72, - 128, 84, 72, 82, 79, 85, 71, 200, 84, 72, 82, 69, 69, 45, 84, 72, 73, 82, - 84, 89, 128, 84, 72, 82, 69, 69, 45, 81, 85, 65, 82, 84, 69, 210, 84, 72, - 82, 69, 69, 45, 80, 69, 82, 45, 69, 205, 84, 72, 82, 69, 69, 45, 76, 73, - 78, 197, 84, 72, 82, 69, 69, 45, 76, 69, 71, 71, 69, 196, 84, 72, 82, 69, - 69, 45, 72, 85, 78, 68, 82, 69, 68, 45, 65, 78, 68, 45, 84, 87, 69, 78, - 84, 73, 69, 84, 72, 128, 84, 72, 82, 69, 69, 45, 69, 205, 84, 72, 82, 69, - 69, 45, 68, 79, 212, 84, 72, 82, 69, 69, 45, 196, 84, 72, 82, 69, 69, 45, - 67, 73, 82, 67, 76, 197, 84, 72, 82, 69, 65, 68, 128, 84, 72, 79, 85, 83, - 65, 78, 68, 83, 128, 84, 72, 79, 85, 83, 65, 78, 68, 211, 84, 72, 79, 85, - 83, 65, 78, 196, 84, 72, 79, 85, 71, 72, 212, 84, 72, 79, 85, 128, 84, - 72, 79, 82, 78, 128, 84, 72, 79, 82, 206, 84, 72, 79, 78, 71, 128, 84, - 72, 79, 77, 128, 84, 72, 79, 74, 128, 84, 72, 79, 65, 128, 84, 72, 207, - 84, 72, 73, 85, 84, 72, 128, 84, 72, 73, 84, 65, 128, 84, 72, 73, 82, 84, - 89, 45, 83, 69, 67, 79, 78, 68, 128, 84, 72, 73, 82, 84, 89, 45, 83, 69, - 67, 79, 78, 196, 84, 72, 73, 82, 84, 89, 45, 79, 78, 69, 128, 84, 72, 73, - 82, 84, 89, 45, 70, 73, 86, 197, 84, 72, 73, 82, 84, 217, 84, 72, 73, 82, - 84, 69, 69, 78, 128, 84, 72, 73, 82, 84, 69, 69, 206, 84, 72, 73, 82, 68, - 83, 128, 84, 72, 73, 82, 68, 211, 84, 72, 73, 82, 68, 45, 83, 84, 65, 71, - 197, 84, 72, 73, 82, 68, 128, 84, 72, 73, 82, 196, 84, 72, 73, 78, 75, - 73, 78, 199, 84, 72, 73, 78, 71, 128, 84, 72, 73, 73, 128, 84, 72, 73, - 71, 72, 128, 84, 72, 73, 69, 85, 84, 200, 84, 72, 73, 67, 203, 84, 72, - 73, 65, 66, 128, 84, 72, 69, 89, 128, 84, 72, 69, 84, 72, 69, 128, 84, - 72, 69, 84, 72, 128, 84, 72, 69, 84, 65, 128, 84, 72, 69, 84, 193, 84, - 72, 69, 83, 80, 73, 65, 206, 84, 72, 69, 83, 69, 79, 83, 128, 84, 72, 69, - 83, 69, 79, 211, 84, 72, 69, 211, 84, 72, 69, 82, 77, 79, 77, 69, 84, 69, - 82, 128, 84, 72, 69, 82, 77, 79, 68, 89, 78, 65, 77, 73, 67, 128, 84, 72, - 69, 82, 69, 70, 79, 82, 69, 128, 84, 72, 69, 82, 197, 84, 72, 69, 206, - 84, 72, 69, 77, 65, 84, 73, 83, 77, 79, 211, 84, 72, 69, 77, 65, 128, 84, - 72, 69, 77, 193, 84, 72, 69, 72, 128, 84, 72, 69, 200, 84, 72, 69, 65, - 128, 84, 72, 197, 84, 72, 65, 87, 128, 84, 72, 65, 78, 84, 72, 65, 75, - 72, 65, 84, 128, 84, 72, 65, 78, 78, 65, 128, 84, 72, 65, 78, 128, 84, - 72, 65, 206, 84, 72, 65, 77, 69, 68, 72, 128, 84, 72, 65, 76, 128, 84, - 72, 65, 204, 84, 72, 65, 74, 128, 84, 72, 65, 201, 84, 72, 65, 72, 65, - 78, 128, 84, 72, 65, 65, 78, 193, 84, 72, 65, 65, 76, 85, 128, 84, 72, - 45, 67, 82, 69, 197, 84, 69, 88, 84, 128, 84, 69, 88, 212, 84, 69, 88, - 128, 84, 69, 86, 73, 82, 128, 84, 69, 85, 84, 69, 85, 88, 128, 84, 69, - 85, 84, 69, 85, 87, 69, 78, 128, 84, 69, 85, 84, 128, 84, 69, 85, 78, - 128, 84, 69, 85, 65, 69, 81, 128, 84, 69, 85, 65, 69, 78, 128, 84, 69, - 85, 128, 84, 69, 84, 82, 65, 83, 73, 77, 79, 85, 128, 84, 69, 84, 82, 65, - 83, 69, 77, 69, 128, 84, 69, 84, 82, 65, 80, 76, 73, 128, 84, 69, 84, 82, - 65, 71, 82, 65, 205, 84, 69, 84, 82, 65, 70, 79, 78, 73, 65, 83, 128, 84, - 69, 84, 72, 128, 84, 69, 84, 200, 84, 69, 84, 65, 82, 84, 79, 211, 84, - 69, 84, 65, 82, 84, 73, 77, 79, 82, 73, 79, 78, 128, 84, 69, 84, 128, 84, - 69, 212, 84, 69, 83, 212, 84, 69, 83, 83, 69, 82, 65, 128, 84, 69, 83, - 83, 69, 82, 193, 84, 69, 83, 83, 65, 82, 79, 206, 84, 69, 83, 200, 84, - 69, 82, 77, 73, 78, 65, 84, 79, 82, 128, 84, 69, 82, 77, 73, 78, 65, 204, - 84, 69, 80, 128, 84, 69, 78, 85, 84, 79, 128, 84, 69, 78, 85, 128, 84, - 69, 78, 213, 84, 69, 78, 84, 72, 128, 84, 69, 78, 84, 128, 84, 69, 78, - 83, 69, 128, 84, 69, 78, 83, 197, 84, 69, 78, 83, 128, 84, 69, 78, 211, - 84, 69, 78, 78, 73, 211, 84, 69, 78, 71, 197, 84, 69, 78, 45, 84, 72, 73, - 82, 84, 89, 128, 84, 69, 78, 128, 84, 69, 206, 84, 69, 77, 80, 85, 211, - 84, 69, 77, 80, 76, 69, 128, 84, 69, 76, 85, 128, 84, 69, 76, 79, 85, - 211, 84, 69, 76, 76, 69, 210, 84, 69, 76, 73, 83, 72, 193, 84, 69, 76, - 69, 86, 73, 83, 73, 79, 78, 128, 84, 69, 76, 69, 83, 67, 79, 80, 69, 128, - 84, 69, 76, 69, 80, 72, 79, 78, 69, 128, 84, 69, 76, 69, 80, 72, 79, 78, - 197, 84, 69, 76, 69, 73, 65, 128, 84, 69, 76, 69, 71, 82, 65, 80, 200, - 84, 69, 75, 128, 84, 69, 73, 87, 83, 128, 84, 69, 71, 69, 72, 128, 84, - 69, 69, 84, 72, 128, 84, 69, 69, 84, 200, 84, 69, 69, 78, 83, 128, 84, - 69, 69, 69, 69, 128, 84, 69, 197, 84, 69, 68, 85, 78, 71, 128, 84, 69, - 68, 68, 217, 84, 69, 65, 82, 211, 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, - 80, 79, 75, 69, 196, 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, 72, 65, 78, - 75, 69, 196, 84, 69, 65, 82, 68, 82, 79, 80, 45, 66, 65, 82, 66, 69, 196, - 84, 69, 65, 82, 45, 79, 70, 198, 84, 69, 65, 67, 85, 208, 84, 69, 45, 85, - 128, 84, 69, 45, 57, 128, 84, 69, 45, 56, 128, 84, 69, 45, 55, 128, 84, - 69, 45, 54, 128, 84, 69, 45, 53, 128, 84, 69, 45, 52, 128, 84, 69, 45, - 51, 128, 84, 69, 45, 50, 128, 84, 69, 45, 49, 128, 84, 67, 72, 69, 72, - 69, 72, 128, 84, 67, 72, 69, 72, 69, 200, 84, 67, 72, 69, 72, 128, 84, - 67, 72, 69, 200, 84, 67, 72, 69, 128, 84, 195, 84, 65, 89, 128, 84, 65, - 88, 73, 128, 84, 65, 88, 128, 84, 65, 87, 69, 76, 76, 69, 77, 69, 212, - 84, 65, 87, 65, 128, 84, 65, 87, 128, 84, 65, 215, 84, 65, 86, 73, 89, - 65, 78, 73, 128, 84, 65, 86, 128, 84, 65, 214, 84, 65, 85, 82, 85, 83, - 128, 84, 65, 85, 77, 128, 84, 65, 213, 84, 65, 84, 87, 69, 69, 76, 128, - 84, 65, 84, 87, 69, 69, 204, 84, 65, 84, 84, 79, 79, 69, 196, 84, 65, 84, - 128, 84, 65, 83, 83, 73, 128, 84, 65, 83, 128, 84, 65, 82, 85, 78, 71, - 128, 84, 65, 82, 84, 65, 82, 45, 50, 128, 84, 65, 82, 84, 65, 82, 128, - 84, 65, 82, 71, 69, 84, 128, 84, 65, 81, 128, 84, 65, 80, 69, 82, 128, - 84, 65, 80, 197, 84, 65, 80, 128, 84, 65, 79, 128, 84, 65, 78, 78, 69, - 196, 84, 65, 78, 71, 69, 82, 73, 78, 69, 128, 84, 65, 78, 71, 69, 78, 84, - 128, 84, 65, 78, 71, 69, 78, 212, 84, 65, 78, 199, 84, 65, 78, 65, 66, - 65, 84, 193, 84, 65, 78, 65, 128, 84, 65, 78, 128, 84, 65, 77, 73, 78, - 71, 128, 84, 65, 77, 65, 206, 84, 65, 77, 128, 84, 65, 76, 76, 217, 84, - 65, 76, 76, 128, 84, 65, 76, 204, 84, 65, 76, 73, 78, 71, 128, 84, 65, - 76, 73, 78, 199, 84, 65, 76, 69, 78, 84, 83, 128, 84, 65, 76, 69, 78, - 212, 84, 65, 75, 82, 201, 84, 65, 75, 72, 65, 76, 76, 85, 83, 128, 84, - 65, 75, 69, 79, 85, 212, 84, 65, 75, 69, 128, 84, 65, 75, 52, 128, 84, - 65, 75, 180, 84, 65, 75, 128, 84, 65, 73, 83, 89, 79, 85, 128, 84, 65, - 73, 76, 76, 69, 83, 211, 84, 65, 73, 76, 128, 84, 65, 73, 204, 84, 65, - 72, 65, 76, 65, 128, 84, 65, 72, 128, 84, 65, 200, 84, 65, 71, 66, 65, - 78, 87, 193, 84, 65, 71, 65, 76, 79, 199, 84, 65, 71, 128, 84, 65, 69, - 206, 84, 65, 67, 79, 128, 84, 65, 67, 75, 128, 84, 65, 67, 203, 84, 65, - 66, 85, 76, 65, 84, 73, 79, 78, 128, 84, 65, 66, 85, 76, 65, 84, 73, 79, - 206, 84, 65, 66, 83, 128, 84, 65, 66, 76, 69, 128, 84, 65, 66, 76, 197, - 84, 65, 66, 128, 84, 65, 194, 84, 65, 65, 83, 72, 65, 69, 128, 84, 65, - 65, 81, 128, 84, 65, 65, 77, 128, 84, 65, 65, 76, 85, 74, 193, 84, 65, - 65, 73, 128, 84, 65, 65, 70, 128, 84, 65, 50, 128, 84, 65, 45, 82, 79, - 76, 128, 84, 65, 45, 52, 128, 84, 65, 45, 51, 128, 84, 65, 45, 50, 128, - 84, 65, 45, 49, 128, 84, 48, 51, 54, 128, 84, 48, 51, 53, 128, 84, 48, - 51, 52, 128, 84, 48, 51, 51, 65, 128, 84, 48, 51, 51, 128, 84, 48, 51, - 50, 65, 128, 84, 48, 51, 50, 128, 84, 48, 51, 49, 128, 84, 48, 51, 48, - 128, 84, 48, 50, 57, 128, 84, 48, 50, 56, 128, 84, 48, 50, 55, 128, 84, - 48, 50, 54, 128, 84, 48, 50, 53, 128, 84, 48, 50, 52, 128, 84, 48, 50, - 51, 128, 84, 48, 50, 50, 128, 84, 48, 50, 49, 128, 84, 48, 50, 48, 128, - 84, 48, 49, 57, 128, 84, 48, 49, 56, 128, 84, 48, 49, 55, 128, 84, 48, - 49, 54, 65, 128, 84, 48, 49, 54, 128, 84, 48, 49, 53, 128, 84, 48, 49, - 52, 128, 84, 48, 49, 51, 128, 84, 48, 49, 50, 128, 84, 48, 49, 49, 65, - 128, 84, 48, 49, 49, 128, 84, 48, 49, 48, 128, 84, 48, 48, 57, 65, 128, - 84, 48, 48, 57, 128, 84, 48, 48, 56, 65, 128, 84, 48, 48, 56, 128, 84, - 48, 48, 55, 65, 128, 84, 48, 48, 55, 128, 84, 48, 48, 54, 128, 84, 48, - 48, 53, 128, 84, 48, 48, 52, 128, 84, 48, 48, 51, 65, 128, 84, 48, 48, - 51, 128, 84, 48, 48, 50, 128, 84, 48, 48, 49, 128, 84, 45, 83, 72, 73, - 82, 84, 128, 84, 45, 82, 69, 88, 128, 83, 90, 90, 128, 83, 90, 87, 71, - 128, 83, 90, 87, 65, 128, 83, 90, 85, 128, 83, 90, 79, 128, 83, 90, 73, - 128, 83, 90, 69, 69, 128, 83, 90, 69, 128, 83, 90, 65, 65, 128, 83, 90, - 65, 128, 83, 90, 128, 83, 89, 88, 128, 83, 89, 84, 128, 83, 89, 83, 84, - 69, 205, 83, 89, 82, 88, 128, 83, 89, 82, 77, 65, 84, 73, 75, 73, 128, - 83, 89, 82, 77, 65, 128, 83, 89, 82, 73, 78, 71, 69, 128, 83, 89, 82, 73, - 65, 195, 83, 89, 82, 128, 83, 89, 80, 128, 83, 89, 79, 85, 87, 65, 128, - 83, 89, 78, 69, 86, 77, 65, 128, 83, 89, 78, 68, 69, 83, 77, 79, 211, 83, - 89, 78, 67, 72, 82, 79, 78, 79, 85, 211, 83, 89, 78, 65, 71, 79, 71, 85, - 69, 128, 83, 89, 78, 65, 71, 77, 193, 83, 89, 78, 65, 70, 73, 128, 83, - 89, 78, 128, 83, 89, 77, 77, 69, 84, 82, 89, 128, 83, 89, 77, 77, 69, 84, - 82, 73, 195, 83, 89, 77, 66, 79, 76, 83, 128, 83, 89, 77, 66, 79, 76, - 211, 83, 89, 77, 66, 79, 76, 45, 57, 128, 83, 89, 77, 66, 79, 76, 45, 56, - 128, 83, 89, 77, 66, 79, 76, 45, 55, 128, 83, 89, 77, 66, 79, 76, 45, 54, - 128, 83, 89, 77, 66, 79, 76, 45, 53, 52, 128, 83, 89, 77, 66, 79, 76, 45, - 53, 51, 128, 83, 89, 77, 66, 79, 76, 45, 53, 50, 128, 83, 89, 77, 66, 79, - 76, 45, 53, 49, 128, 83, 89, 77, 66, 79, 76, 45, 53, 48, 128, 83, 89, 77, - 66, 79, 76, 45, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, 57, 128, 83, 89, - 77, 66, 79, 76, 45, 52, 56, 128, 83, 89, 77, 66, 79, 76, 45, 52, 55, 128, - 83, 89, 77, 66, 79, 76, 45, 52, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, - 51, 128, 83, 89, 77, 66, 79, 76, 45, 52, 50, 128, 83, 89, 77, 66, 79, 76, - 45, 52, 48, 128, 83, 89, 77, 66, 79, 76, 45, 52, 128, 83, 89, 77, 66, 79, - 76, 45, 51, 57, 128, 83, 89, 77, 66, 79, 76, 45, 51, 56, 128, 83, 89, 77, - 66, 79, 76, 45, 51, 55, 128, 83, 89, 77, 66, 79, 76, 45, 51, 54, 128, 83, - 89, 77, 66, 79, 76, 45, 51, 50, 128, 83, 89, 77, 66, 79, 76, 45, 51, 48, - 128, 83, 89, 77, 66, 79, 76, 45, 51, 128, 83, 89, 77, 66, 79, 76, 45, 50, - 57, 128, 83, 89, 77, 66, 79, 76, 45, 50, 55, 128, 83, 89, 77, 66, 79, 76, - 45, 50, 54, 128, 83, 89, 77, 66, 79, 76, 45, 50, 53, 128, 83, 89, 77, 66, - 79, 76, 45, 50, 52, 128, 83, 89, 77, 66, 79, 76, 45, 50, 51, 128, 83, 89, - 77, 66, 79, 76, 45, 50, 50, 128, 83, 89, 77, 66, 79, 76, 45, 50, 49, 128, - 83, 89, 77, 66, 79, 76, 45, 50, 48, 128, 83, 89, 77, 66, 79, 76, 45, 50, - 128, 83, 89, 77, 66, 79, 76, 45, 49, 57, 128, 83, 89, 77, 66, 79, 76, 45, - 49, 56, 128, 83, 89, 77, 66, 79, 76, 45, 49, 55, 128, 83, 89, 77, 66, 79, - 76, 45, 49, 54, 128, 83, 89, 77, 66, 79, 76, 45, 49, 53, 128, 83, 89, 77, - 66, 79, 76, 45, 49, 52, 128, 83, 89, 77, 66, 79, 76, 45, 49, 51, 128, 83, - 89, 77, 66, 79, 76, 45, 49, 50, 128, 83, 89, 77, 66, 79, 76, 45, 49, 49, - 128, 83, 89, 77, 66, 79, 76, 45, 49, 48, 128, 83, 89, 77, 66, 79, 76, 45, - 49, 128, 83, 89, 76, 79, 84, 201, 83, 89, 73, 128, 83, 89, 128, 83, 87, - 90, 128, 83, 87, 85, 78, 199, 83, 87, 79, 82, 68, 83, 128, 83, 87, 79, - 82, 68, 128, 83, 87, 79, 79, 128, 83, 87, 79, 128, 83, 87, 73, 82, 204, - 83, 87, 73, 77, 83, 85, 73, 84, 128, 83, 87, 73, 77, 77, 73, 78, 71, 128, - 83, 87, 73, 77, 77, 69, 82, 128, 83, 87, 73, 73, 128, 83, 87, 73, 128, - 83, 87, 71, 128, 83, 87, 69, 69, 84, 128, 83, 87, 69, 69, 212, 83, 87, - 69, 65, 84, 128, 83, 87, 69, 65, 212, 83, 87, 65, 83, 200, 83, 87, 65, - 80, 80, 73, 78, 71, 128, 83, 87, 65, 78, 128, 83, 87, 65, 65, 128, 83, - 87, 128, 83, 86, 65, 83, 84, 201, 83, 86, 65, 82, 73, 84, 65, 128, 83, - 86, 65, 82, 73, 84, 193, 83, 85, 88, 128, 83, 85, 85, 128, 83, 85, 84, - 82, 193, 83, 85, 84, 128, 83, 85, 83, 80, 69, 78, 83, 73, 79, 206, 83, - 85, 83, 72, 73, 128, 83, 85, 82, 89, 65, 128, 83, 85, 82, 88, 128, 83, - 85, 82, 82, 79, 85, 78, 68, 128, 83, 85, 82, 82, 79, 85, 78, 196, 83, 85, - 82, 70, 69, 82, 128, 83, 85, 82, 70, 65, 67, 197, 83, 85, 82, 69, 128, - 83, 85, 82, 65, 78, 71, 128, 83, 85, 82, 57, 128, 83, 85, 82, 128, 83, - 85, 210, 83, 85, 80, 82, 65, 76, 73, 78, 69, 65, 210, 83, 85, 80, 69, 82, - 86, 73, 83, 69, 128, 83, 85, 80, 69, 82, 86, 73, 76, 76, 65, 73, 78, 128, - 83, 85, 80, 69, 82, 83, 69, 84, 128, 83, 85, 80, 69, 82, 83, 69, 212, 83, - 85, 80, 69, 82, 83, 67, 82, 73, 80, 212, 83, 85, 80, 69, 82, 73, 77, 80, - 79, 83, 69, 196, 83, 85, 80, 69, 82, 72, 69, 82, 79, 128, 83, 85, 80, 69, - 82, 70, 73, 88, 69, 196, 83, 85, 80, 69, 210, 83, 85, 80, 128, 83, 85, - 79, 88, 128, 83, 85, 79, 80, 128, 83, 85, 79, 128, 83, 85, 78, 83, 69, - 212, 83, 85, 78, 82, 73, 83, 69, 128, 83, 85, 78, 82, 73, 83, 197, 83, - 85, 78, 71, 76, 65, 83, 83, 69, 83, 128, 83, 85, 78, 71, 128, 83, 85, 78, - 70, 76, 79, 87, 69, 82, 128, 83, 85, 78, 68, 65, 78, 69, 83, 197, 83, 85, - 78, 128, 83, 85, 206, 83, 85, 77, 77, 69, 82, 128, 83, 85, 77, 77, 65, - 84, 73, 79, 78, 128, 83, 85, 77, 77, 65, 84, 73, 79, 206, 83, 85, 77, 65, - 83, 72, 128, 83, 85, 77, 128, 83, 85, 76, 70, 85, 82, 128, 83, 85, 75, - 85, 78, 128, 83, 85, 75, 85, 206, 83, 85, 75, 85, 128, 83, 85, 75, 213, - 83, 85, 73, 84, 65, 66, 76, 69, 128, 83, 85, 73, 212, 83, 85, 72, 85, 82, - 128, 83, 85, 69, 128, 83, 85, 68, 50, 128, 83, 85, 68, 128, 83, 85, 67, - 75, 73, 78, 199, 83, 85, 67, 75, 69, 68, 128, 83, 85, 67, 203, 83, 85, - 67, 67, 69, 69, 68, 83, 128, 83, 85, 67, 67, 69, 69, 68, 211, 83, 85, 67, - 67, 69, 69, 68, 128, 83, 85, 67, 67, 69, 69, 196, 83, 85, 66, 85, 78, 73, - 84, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 73, 79, 206, 83, 85, 66, 83, - 84, 73, 84, 85, 84, 69, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 197, 83, - 85, 66, 83, 69, 84, 128, 83, 85, 66, 83, 69, 212, 83, 85, 66, 83, 67, 82, - 73, 80, 212, 83, 85, 66, 80, 85, 78, 67, 84, 73, 83, 128, 83, 85, 66, 76, - 73, 78, 69, 65, 210, 83, 85, 66, 76, 73, 77, 65, 84, 73, 79, 78, 128, 83, - 85, 66, 76, 73, 77, 65, 84, 69, 45, 51, 128, 83, 85, 66, 76, 73, 77, 65, - 84, 69, 45, 50, 128, 83, 85, 66, 76, 73, 77, 65, 84, 69, 128, 83, 85, 66, - 76, 73, 77, 65, 84, 197, 83, 85, 66, 74, 79, 73, 78, 69, 82, 128, 83, 85, - 66, 74, 79, 73, 78, 69, 196, 83, 85, 66, 74, 69, 67, 84, 128, 83, 85, 66, - 73, 84, 79, 128, 83, 85, 66, 71, 82, 79, 85, 80, 128, 83, 85, 66, 71, 82, - 79, 85, 208, 83, 85, 66, 128, 83, 85, 65, 77, 128, 83, 85, 65, 69, 84, - 128, 83, 85, 65, 69, 78, 128, 83, 85, 65, 69, 128, 83, 85, 65, 66, 128, - 83, 85, 65, 128, 83, 85, 45, 56, 128, 83, 85, 45, 55, 128, 83, 85, 45, - 54, 128, 83, 85, 45, 53, 128, 83, 85, 45, 52, 128, 83, 85, 45, 51, 128, - 83, 85, 45, 50, 128, 83, 85, 45, 49, 128, 83, 213, 83, 84, 88, 128, 83, - 84, 87, 65, 128, 83, 84, 85, 80, 65, 128, 83, 84, 85, 70, 70, 69, 196, - 83, 84, 85, 68, 89, 128, 83, 84, 85, 68, 73, 207, 83, 84, 85, 67, 75, 45, - 79, 85, 212, 83, 84, 83, 128, 83, 84, 82, 79, 78, 199, 83, 84, 82, 79, - 75, 69, 83, 128, 83, 84, 82, 79, 75, 69, 211, 83, 84, 82, 79, 75, 69, 45, - 57, 128, 83, 84, 82, 79, 75, 69, 45, 56, 128, 83, 84, 82, 79, 75, 69, 45, - 55, 128, 83, 84, 82, 79, 75, 69, 45, 54, 128, 83, 84, 82, 79, 75, 69, 45, - 53, 128, 83, 84, 82, 79, 75, 69, 45, 52, 128, 83, 84, 82, 79, 75, 69, 45, - 51, 128, 83, 84, 82, 79, 75, 69, 45, 50, 128, 83, 84, 82, 79, 75, 69, 45, - 49, 49, 128, 83, 84, 82, 79, 75, 69, 45, 49, 48, 128, 83, 84, 82, 79, 75, - 69, 45, 49, 128, 83, 84, 82, 79, 75, 197, 83, 84, 82, 73, 80, 69, 128, - 83, 84, 82, 73, 78, 71, 128, 83, 84, 82, 73, 78, 199, 83, 84, 82, 73, 75, - 69, 84, 72, 82, 79, 85, 71, 72, 128, 83, 84, 82, 73, 75, 197, 83, 84, 82, - 73, 68, 69, 128, 83, 84, 82, 73, 67, 84, 76, 217, 83, 84, 82, 69, 84, 67, - 72, 69, 196, 83, 84, 82, 69, 84, 67, 72, 128, 83, 84, 82, 69, 83, 211, - 83, 84, 82, 69, 78, 71, 84, 72, 128, 83, 84, 82, 69, 65, 77, 69, 82, 128, - 83, 84, 82, 65, 87, 66, 69, 82, 82, 89, 128, 83, 84, 82, 65, 87, 128, 83, - 84, 82, 65, 84, 85, 77, 45, 50, 128, 83, 84, 82, 65, 84, 85, 77, 128, 83, - 84, 82, 65, 84, 85, 205, 83, 84, 82, 65, 84, 73, 65, 206, 83, 84, 82, 65, - 73, 78, 69, 82, 128, 83, 84, 82, 65, 73, 71, 72, 84, 78, 69, 83, 83, 128, - 83, 84, 82, 65, 73, 71, 72, 84, 128, 83, 84, 82, 65, 73, 71, 72, 212, 83, - 84, 82, 65, 73, 70, 128, 83, 84, 82, 65, 71, 71, 73, 83, 77, 65, 84, 65, - 128, 83, 84, 79, 86, 69, 128, 83, 84, 79, 82, 69, 128, 83, 84, 79, 80, - 87, 65, 84, 67, 72, 128, 83, 84, 79, 80, 80, 73, 78, 71, 128, 83, 84, 79, - 80, 80, 65, 71, 69, 128, 83, 84, 79, 80, 128, 83, 84, 79, 208, 83, 84, - 79, 78, 69, 128, 83, 84, 79, 67, 75, 128, 83, 84, 79, 67, 203, 83, 84, - 73, 82, 82, 85, 208, 83, 84, 73, 77, 77, 69, 128, 83, 84, 73, 76, 204, - 83, 84, 73, 76, 197, 83, 84, 73, 71, 77, 65, 128, 83, 84, 73, 67, 75, 73, - 78, 199, 83, 84, 73, 67, 203, 83, 84, 69, 84, 72, 79, 83, 67, 79, 80, 69, + 128, 84, 85, 210, 84, 85, 80, 78, 73, 128, 84, 85, 80, 128, 84, 85, 79, + 88, 128, 84, 85, 79, 84, 128, 84, 85, 79, 80, 128, 84, 85, 79, 128, 84, + 85, 78, 78, 89, 128, 84, 85, 77, 69, 84, 69, 83, 128, 84, 85, 77, 66, 76, + 69, 210, 84, 85, 77, 65, 69, 128, 84, 85, 77, 128, 84, 85, 205, 84, 85, + 76, 73, 80, 128, 84, 85, 75, 87, 69, 78, 84, 73, 83, 128, 84, 85, 75, + 128, 84, 85, 71, 82, 73, 203, 84, 85, 71, 50, 128, 84, 85, 71, 178, 84, + 85, 66, 69, 128, 84, 85, 66, 128, 84, 85, 65, 82, 69, 199, 84, 85, 65, + 69, 80, 128, 84, 85, 65, 69, 128, 84, 85, 45, 84, 79, 128, 84, 85, 45, + 52, 128, 84, 85, 45, 51, 128, 84, 85, 45, 50, 128, 84, 85, 45, 49, 128, + 84, 213, 84, 84, 85, 85, 128, 84, 84, 85, 68, 68, 65, 71, 128, 84, 84, + 85, 68, 68, 65, 65, 71, 128, 84, 84, 85, 128, 84, 84, 84, 72, 65, 128, + 84, 84, 84, 65, 128, 84, 84, 83, 85, 128, 84, 84, 83, 79, 128, 84, 84, + 83, 73, 128, 84, 84, 83, 69, 69, 128, 84, 84, 83, 69, 128, 84, 84, 83, + 65, 128, 84, 84, 79, 79, 128, 84, 84, 73, 73, 128, 84, 84, 73, 128, 84, + 84, 72, 87, 69, 128, 84, 84, 72, 85, 128, 84, 84, 72, 79, 79, 128, 84, + 84, 72, 79, 128, 84, 84, 72, 73, 128, 84, 84, 72, 69, 69, 128, 84, 84, + 72, 69, 128, 84, 84, 72, 65, 65, 128, 84, 84, 72, 128, 84, 84, 69, 72, + 69, 72, 128, 84, 84, 69, 72, 69, 200, 84, 84, 69, 72, 128, 84, 84, 69, + 200, 84, 84, 69, 69, 128, 84, 84, 65, 89, 65, 78, 78, 65, 128, 84, 84, + 65, 85, 128, 84, 84, 65, 73, 128, 84, 84, 65, 65, 128, 84, 84, 50, 128, + 84, 83, 87, 69, 128, 84, 83, 87, 66, 128, 84, 83, 87, 65, 128, 84, 83, + 86, 128, 84, 83, 83, 69, 128, 84, 83, 83, 65, 128, 84, 83, 79, 214, 84, + 83, 73, 85, 128, 84, 83, 72, 85, 71, 83, 128, 84, 83, 72, 79, 79, 75, + 128, 84, 83, 72, 79, 79, 203, 84, 83, 72, 79, 79, 74, 128, 84, 83, 72, + 69, 83, 128, 84, 83, 72, 69, 71, 128, 84, 83, 72, 69, 199, 84, 83, 72, + 69, 69, 74, 128, 84, 83, 72, 69, 128, 84, 83, 72, 65, 194, 84, 83, 72, + 65, 128, 84, 83, 69, 82, 69, 128, 84, 83, 69, 69, 66, 128, 84, 83, 65, + 68, 73, 128, 84, 83, 65, 68, 201, 84, 83, 65, 66, 128, 84, 83, 65, 65, + 68, 73, 89, 128, 84, 83, 65, 65, 128, 84, 83, 193, 84, 211, 84, 82, 89, + 66, 76, 73, 79, 206, 84, 82, 85, 84, 72, 128, 84, 82, 85, 78, 75, 128, + 84, 82, 85, 78, 67, 65, 84, 69, 196, 84, 82, 85, 77, 80, 69, 84, 128, 84, + 82, 85, 77, 80, 45, 57, 128, 84, 82, 85, 77, 80, 45, 56, 128, 84, 82, 85, + 77, 80, 45, 55, 128, 84, 82, 85, 77, 80, 45, 54, 128, 84, 82, 85, 77, 80, + 45, 53, 128, 84, 82, 85, 77, 80, 45, 52, 128, 84, 82, 85, 77, 80, 45, 51, + 128, 84, 82, 85, 77, 80, 45, 50, 49, 128, 84, 82, 85, 77, 80, 45, 50, 48, + 128, 84, 82, 85, 77, 80, 45, 50, 128, 84, 82, 85, 77, 80, 45, 49, 57, + 128, 84, 82, 85, 77, 80, 45, 49, 56, 128, 84, 82, 85, 77, 80, 45, 49, 55, + 128, 84, 82, 85, 77, 80, 45, 49, 54, 128, 84, 82, 85, 77, 80, 45, 49, 53, + 128, 84, 82, 85, 77, 80, 45, 49, 52, 128, 84, 82, 85, 77, 80, 45, 49, 51, + 128, 84, 82, 85, 77, 80, 45, 49, 50, 128, 84, 82, 85, 77, 80, 45, 49, 49, + 128, 84, 82, 85, 77, 80, 45, 49, 48, 128, 84, 82, 85, 77, 80, 45, 49, + 128, 84, 82, 85, 69, 128, 84, 82, 85, 197, 84, 82, 85, 67, 75, 128, 84, + 82, 79, 80, 73, 67, 65, 204, 84, 82, 79, 80, 72, 89, 128, 84, 82, 79, 77, + 73, 75, 79, 83, 89, 78, 65, 71, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79, + 80, 83, 73, 70, 73, 83, 84, 79, 78, 128, 84, 82, 79, 77, 73, 75, 79, 80, + 65, 82, 65, 75, 65, 76, 69, 83, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79, + 78, 128, 84, 82, 79, 77, 73, 75, 79, 206, 84, 82, 79, 77, 73, 75, 79, 76, + 89, 71, 73, 83, 77, 65, 128, 84, 82, 79, 76, 76, 69, 89, 66, 85, 83, 128, + 84, 82, 79, 76, 76, 69, 89, 128, 84, 82, 79, 75, 85, 84, 65, 83, 84, 201, + 84, 82, 79, 69, 90, 69, 78, 73, 65, 206, 84, 82, 73, 85, 77, 80, 72, 128, + 84, 82, 73, 84, 79, 211, 84, 82, 73, 84, 73, 77, 79, 82, 73, 79, 78, 128, + 84, 82, 73, 83, 73, 77, 79, 85, 128, 84, 82, 73, 83, 69, 77, 69, 128, 84, + 82, 73, 80, 79, 68, 128, 84, 82, 73, 80, 76, 73, 128, 84, 82, 73, 80, 76, + 69, 128, 84, 82, 73, 80, 76, 197, 84, 82, 73, 79, 206, 84, 82, 73, 76, + 76, 73, 79, 78, 83, 128, 84, 82, 73, 73, 83, 65, 80, 128, 84, 82, 73, 71, + 82, 65, 77, 77, 79, 211, 84, 82, 73, 71, 82, 65, 205, 84, 82, 73, 71, 79, + 82, 71, 79, 78, 128, 84, 82, 73, 70, 79, 78, 73, 65, 83, 128, 84, 82, 73, + 70, 79, 76, 73, 65, 84, 197, 84, 82, 73, 68, 69, 78, 84, 128, 84, 82, 73, + 68, 69, 78, 212, 84, 82, 73, 67, 79, 76, 79, 78, 128, 84, 82, 73, 65, 78, + 71, 85, 76, 65, 210, 84, 82, 73, 65, 78, 71, 76, 69, 45, 82, 79, 85, 78, + 196, 84, 82, 73, 65, 78, 71, 76, 69, 45, 72, 69, 65, 68, 69, 196, 84, 82, + 73, 65, 78, 71, 76, 69, 128, 84, 82, 73, 65, 78, 71, 76, 197, 84, 82, 73, + 65, 128, 84, 82, 73, 128, 84, 82, 69, 83, 73, 76, 76, 79, 128, 84, 82, + 69, 78, 68, 128, 84, 82, 69, 78, 196, 84, 82, 69, 77, 79, 76, 79, 45, 51, + 128, 84, 82, 69, 77, 79, 76, 79, 45, 50, 128, 84, 82, 69, 77, 79, 76, 79, + 45, 49, 128, 84, 82, 69, 69, 128, 84, 82, 69, 197, 84, 82, 69, 68, 69, + 67, 73, 76, 69, 128, 84, 82, 69, 65, 68, 73, 78, 71, 128, 84, 82, 65, 89, + 128, 84, 82, 65, 86, 69, 76, 45, 87, 65, 76, 76, 80, 76, 65, 78, 197, 84, + 82, 65, 86, 69, 76, 45, 70, 76, 79, 79, 82, 80, 76, 65, 78, 197, 84, 82, + 65, 80, 69, 90, 73, 85, 77, 128, 84, 82, 65, 80, 128, 84, 82, 65, 78, 83, + 86, 69, 82, 83, 65, 204, 84, 82, 65, 78, 83, 80, 79, 83, 73, 84, 73, 79, + 206, 84, 82, 65, 78, 83, 80, 76, 85, 84, 79, 128, 84, 82, 65, 78, 83, 77, + 73, 212, 84, 82, 65, 78, 83, 77, 73, 83, 83, 73, 79, 78, 128, 84, 82, 65, + 78, 83, 77, 73, 83, 83, 73, 79, 206, 84, 82, 65, 77, 87, 65, 89, 128, 84, + 82, 65, 77, 128, 84, 82, 65, 205, 84, 82, 65, 73, 78, 128, 84, 82, 65, + 73, 206, 84, 82, 65, 73, 76, 73, 78, 199, 84, 82, 65, 70, 70, 73, 67, + 128, 84, 82, 65, 70, 70, 73, 195, 84, 82, 65, 68, 73, 84, 73, 79, 78, 65, + 204, 84, 82, 65, 68, 197, 84, 82, 65, 67, 84, 79, 82, 128, 84, 82, 65, + 67, 75, 66, 65, 76, 76, 128, 84, 82, 65, 67, 75, 128, 84, 82, 65, 128, + 84, 82, 128, 84, 79, 88, 128, 84, 79, 87, 69, 82, 128, 84, 79, 87, 65, + 82, 68, 211, 84, 79, 86, 128, 84, 79, 85, 82, 78, 79, 73, 211, 84, 79, + 85, 67, 72, 84, 79, 78, 197, 84, 79, 85, 67, 72, 73, 78, 199, 84, 79, 85, + 67, 72, 69, 211, 84, 79, 85, 67, 200, 84, 79, 84, 65, 204, 84, 79, 84, + 128, 84, 79, 83, 128, 84, 79, 82, 84, 79, 73, 83, 197, 84, 79, 82, 83, + 79, 45, 87, 65, 76, 76, 80, 76, 65, 78, 197, 84, 79, 82, 83, 79, 45, 70, + 76, 79, 79, 82, 80, 76, 65, 78, 197, 84, 79, 82, 83, 79, 128, 84, 79, 82, + 78, 65, 68, 79, 128, 84, 79, 82, 67, 85, 76, 85, 83, 128, 84, 79, 82, 67, + 85, 76, 85, 211, 84, 79, 82, 67, 72, 128, 84, 79, 81, 128, 84, 79, 80, + 66, 65, 82, 128, 84, 79, 80, 45, 76, 73, 71, 72, 84, 69, 196, 84, 79, 80, + 128, 84, 79, 208, 84, 79, 79, 84, 72, 66, 82, 85, 83, 72, 128, 84, 79, + 79, 84, 72, 128, 84, 79, 79, 78, 128, 84, 79, 79, 76, 66, 79, 88, 128, + 84, 79, 78, 79, 83, 128, 84, 79, 78, 71, 85, 69, 128, 84, 79, 78, 71, 85, + 197, 84, 79, 78, 71, 128, 84, 79, 78, 69, 45, 86, 128, 84, 79, 78, 69, + 45, 83, 128, 84, 79, 78, 69, 45, 77, 128, 84, 79, 78, 69, 45, 74, 128, + 84, 79, 78, 69, 45, 71, 128, 84, 79, 78, 69, 45, 68, 128, 84, 79, 78, 69, + 45, 66, 128, 84, 79, 78, 69, 45, 56, 128, 84, 79, 78, 69, 45, 55, 128, + 84, 79, 78, 69, 45, 54, 128, 84, 79, 78, 69, 45, 53, 128, 84, 79, 78, 69, + 45, 52, 128, 84, 79, 78, 69, 45, 51, 128, 84, 79, 78, 69, 45, 50, 128, + 84, 79, 78, 69, 45, 49, 128, 84, 79, 78, 69, 128, 84, 79, 78, 65, 204, + 84, 79, 77, 80, 73, 128, 84, 79, 77, 65, 84, 79, 128, 84, 79, 76, 79, 78, + 71, 128, 84, 79, 75, 89, 207, 84, 79, 73, 76, 69, 84, 128, 84, 79, 71, + 69, 84, 72, 69, 82, 128, 84, 79, 68, 207, 84, 79, 65, 78, 68, 65, 75, 72, + 73, 65, 84, 128, 84, 79, 65, 128, 84, 79, 45, 82, 65, 128, 84, 79, 45, + 54, 128, 84, 79, 45, 53, 128, 84, 79, 45, 52, 128, 84, 79, 45, 51, 128, + 84, 79, 45, 50, 128, 84, 79, 45, 49, 128, 84, 78, 128, 84, 76, 86, 128, + 84, 76, 85, 128, 84, 76, 79, 128, 84, 76, 73, 128, 84, 76, 72, 89, 65, + 128, 84, 76, 72, 87, 69, 128, 84, 76, 72, 85, 128, 84, 76, 72, 79, 79, + 128, 84, 76, 72, 79, 128, 84, 76, 72, 73, 128, 84, 76, 72, 69, 69, 128, + 84, 76, 72, 69, 128, 84, 76, 72, 65, 128, 84, 76, 69, 69, 128, 84, 76, + 65, 128, 84, 74, 69, 128, 84, 73, 88, 128, 84, 73, 87, 82, 128, 84, 73, + 87, 78, 128, 84, 73, 87, 65, 218, 84, 73, 84, 85, 65, 69, 80, 128, 84, + 73, 84, 76, 79, 128, 84, 73, 84, 76, 207, 84, 73, 84, 193, 84, 73, 84, + 128, 84, 73, 82, 89, 65, 75, 128, 84, 73, 82, 84, 193, 84, 73, 82, 79, + 78, 73, 65, 206, 84, 73, 82, 72, 85, 84, 193, 84, 73, 82, 69, 196, 84, + 73, 82, 128, 84, 73, 210, 84, 73, 80, 80, 73, 128, 84, 73, 80, 69, 72, + 65, 128, 84, 73, 80, 128, 84, 73, 208, 84, 73, 78, 89, 128, 84, 73, 78, + 217, 84, 73, 78, 78, 69, 128, 84, 73, 78, 67, 84, 85, 82, 69, 128, 84, + 73, 78, 65, 71, 77, 65, 128, 84, 73, 77, 69, 83, 128, 84, 73, 77, 69, + 210, 84, 73, 77, 69, 128, 84, 73, 76, 84, 73, 78, 71, 128, 84, 73, 76, + 84, 73, 78, 199, 84, 73, 76, 84, 128, 84, 73, 76, 69, 83, 128, 84, 73, + 76, 68, 69, 128, 84, 73, 76, 68, 197, 84, 73, 76, 128, 84, 73, 204, 84, + 73, 75, 69, 85, 84, 45, 84, 72, 73, 69, 85, 84, 72, 128, 84, 73, 75, 69, + 85, 84, 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 84, 73, 75, + 69, 85, 84, 45, 83, 73, 79, 83, 128, 84, 73, 75, 69, 85, 84, 45, 82, 73, + 69, 85, 76, 128, 84, 73, 75, 69, 85, 84, 45, 80, 73, 69, 85, 80, 128, 84, + 73, 75, 69, 85, 84, 45, 77, 73, 69, 85, 77, 128, 84, 73, 75, 69, 85, 84, + 45, 75, 73, 89, 69, 79, 75, 128, 84, 73, 75, 69, 85, 84, 45, 67, 73, 69, + 85, 67, 128, 84, 73, 75, 69, 85, 84, 45, 67, 72, 73, 69, 85, 67, 72, 128, + 84, 73, 75, 69, 85, 84, 128, 84, 73, 75, 69, 85, 212, 84, 73, 71, 72, 84, + 76, 89, 45, 67, 76, 79, 83, 69, 196, 84, 73, 71, 72, 212, 84, 73, 71, 69, + 82, 128, 84, 73, 71, 69, 210, 84, 73, 70, 73, 78, 65, 71, 200, 84, 73, + 69, 88, 128, 84, 73, 69, 80, 128, 84, 73, 197, 84, 73, 67, 75, 69, 84, + 83, 128, 84, 73, 67, 75, 69, 84, 128, 84, 73, 67, 75, 128, 84, 73, 67, + 203, 84, 73, 65, 82, 65, 128, 84, 73, 50, 128, 84, 73, 45, 55, 128, 84, + 73, 45, 54, 128, 84, 73, 45, 53, 128, 84, 73, 45, 52, 128, 84, 73, 45, + 51, 128, 84, 73, 45, 50, 128, 84, 73, 45, 49, 128, 84, 72, 90, 128, 84, + 72, 89, 79, 79, 205, 84, 72, 87, 79, 79, 128, 84, 72, 87, 79, 128, 84, + 72, 87, 73, 73, 128, 84, 72, 87, 73, 128, 84, 72, 87, 69, 69, 128, 84, + 72, 87, 65, 65, 128, 84, 72, 87, 65, 128, 84, 72, 85, 82, 211, 84, 72, + 85, 82, 73, 83, 65, 218, 84, 72, 85, 78, 71, 128, 84, 72, 85, 78, 68, 69, + 82, 83, 84, 79, 82, 77, 128, 84, 72, 85, 78, 68, 69, 82, 128, 84, 72, 85, + 78, 68, 69, 210, 84, 72, 85, 77, 66, 211, 84, 72, 85, 77, 66, 128, 84, + 72, 82, 79, 87, 73, 78, 199, 84, 72, 82, 79, 85, 71, 72, 128, 84, 72, 82, + 79, 85, 71, 200, 84, 72, 82, 69, 69, 45, 84, 72, 73, 82, 84, 89, 128, 84, + 72, 82, 69, 69, 45, 81, 85, 65, 82, 84, 69, 210, 84, 72, 82, 69, 69, 45, + 80, 69, 82, 45, 69, 205, 84, 72, 82, 69, 69, 45, 76, 73, 78, 197, 84, 72, + 82, 69, 69, 45, 76, 69, 71, 71, 69, 196, 84, 72, 82, 69, 69, 45, 72, 85, + 78, 68, 82, 69, 68, 45, 65, 78, 68, 45, 84, 87, 69, 78, 84, 73, 69, 84, + 72, 128, 84, 72, 82, 69, 69, 45, 69, 205, 84, 72, 82, 69, 69, 45, 68, 79, + 212, 84, 72, 82, 69, 69, 45, 196, 84, 72, 82, 69, 69, 45, 67, 73, 82, 67, + 76, 197, 84, 72, 82, 69, 65, 68, 128, 84, 72, 79, 85, 83, 65, 78, 68, 83, + 128, 84, 72, 79, 85, 83, 65, 78, 68, 211, 84, 72, 79, 85, 83, 65, 78, + 196, 84, 72, 79, 85, 71, 72, 212, 84, 72, 79, 85, 128, 84, 72, 79, 82, + 78, 128, 84, 72, 79, 82, 206, 84, 72, 79, 78, 71, 128, 84, 72, 79, 78, + 199, 84, 72, 79, 77, 128, 84, 72, 79, 74, 128, 84, 72, 79, 65, 128, 84, + 72, 207, 84, 72, 73, 85, 84, 72, 128, 84, 72, 73, 84, 65, 128, 84, 72, + 73, 82, 84, 89, 45, 83, 69, 67, 79, 78, 68, 128, 84, 72, 73, 82, 84, 89, + 45, 83, 69, 67, 79, 78, 196, 84, 72, 73, 82, 84, 89, 45, 79, 78, 69, 128, + 84, 72, 73, 82, 84, 89, 45, 70, 73, 86, 197, 84, 72, 73, 82, 84, 217, 84, + 72, 73, 82, 84, 69, 69, 78, 128, 84, 72, 73, 82, 84, 69, 69, 206, 84, 72, + 73, 82, 68, 83, 128, 84, 72, 73, 82, 68, 211, 84, 72, 73, 82, 68, 45, 83, + 84, 65, 71, 197, 84, 72, 73, 82, 68, 128, 84, 72, 73, 82, 196, 84, 72, + 73, 78, 75, 73, 78, 199, 84, 72, 73, 78, 71, 128, 84, 72, 73, 73, 128, + 84, 72, 73, 71, 72, 128, 84, 72, 73, 69, 85, 84, 200, 84, 72, 73, 67, + 203, 84, 72, 73, 65, 66, 128, 84, 72, 69, 89, 128, 84, 72, 69, 84, 72, + 69, 128, 84, 72, 69, 84, 72, 128, 84, 72, 69, 84, 65, 128, 84, 72, 69, + 84, 193, 84, 72, 69, 83, 80, 73, 65, 206, 84, 72, 69, 83, 69, 79, 83, + 128, 84, 72, 69, 83, 69, 79, 211, 84, 72, 69, 211, 84, 72, 69, 82, 77, + 79, 77, 69, 84, 69, 82, 128, 84, 72, 69, 82, 77, 79, 68, 89, 78, 65, 77, + 73, 67, 128, 84, 72, 69, 82, 69, 70, 79, 82, 69, 128, 84, 72, 69, 82, + 197, 84, 72, 69, 206, 84, 72, 69, 77, 65, 84, 73, 83, 77, 79, 211, 84, + 72, 69, 77, 65, 128, 84, 72, 69, 77, 193, 84, 72, 69, 72, 128, 84, 72, + 69, 200, 84, 72, 69, 65, 128, 84, 72, 197, 84, 72, 65, 87, 128, 84, 72, + 65, 78, 84, 72, 65, 75, 72, 65, 84, 128, 84, 72, 65, 78, 78, 65, 128, 84, + 72, 65, 78, 128, 84, 72, 65, 206, 84, 72, 65, 77, 69, 68, 72, 128, 84, + 72, 65, 76, 128, 84, 72, 65, 204, 84, 72, 65, 74, 128, 84, 72, 65, 201, + 84, 72, 65, 72, 65, 78, 128, 84, 72, 65, 65, 78, 193, 84, 72, 65, 65, 76, + 85, 128, 84, 72, 45, 67, 82, 69, 197, 84, 69, 88, 84, 128, 84, 69, 88, + 212, 84, 69, 88, 128, 84, 69, 86, 73, 82, 128, 84, 69, 85, 84, 69, 85, + 88, 128, 84, 69, 85, 84, 69, 85, 87, 69, 78, 128, 84, 69, 85, 84, 128, + 84, 69, 85, 78, 128, 84, 69, 85, 65, 69, 81, 128, 84, 69, 85, 65, 69, 78, + 128, 84, 69, 85, 128, 84, 69, 84, 82, 65, 83, 73, 77, 79, 85, 128, 84, + 69, 84, 82, 65, 83, 69, 77, 69, 128, 84, 69, 84, 82, 65, 80, 76, 73, 128, + 84, 69, 84, 82, 65, 71, 82, 65, 205, 84, 69, 84, 82, 65, 70, 79, 78, 73, + 65, 83, 128, 84, 69, 84, 72, 128, 84, 69, 84, 200, 84, 69, 84, 65, 82, + 84, 79, 211, 84, 69, 84, 65, 82, 84, 73, 77, 79, 82, 73, 79, 78, 128, 84, + 69, 84, 128, 84, 69, 212, 84, 69, 83, 212, 84, 69, 83, 83, 69, 82, 65, + 128, 84, 69, 83, 83, 69, 82, 193, 84, 69, 83, 83, 65, 82, 79, 206, 84, + 69, 83, 200, 84, 69, 82, 77, 73, 78, 65, 84, 79, 82, 128, 84, 69, 82, 77, + 73, 78, 65, 204, 84, 69, 80, 128, 84, 69, 78, 85, 84, 79, 128, 84, 69, + 78, 85, 128, 84, 69, 78, 213, 84, 69, 78, 84, 72, 128, 84, 69, 78, 84, + 128, 84, 69, 78, 83, 69, 128, 84, 69, 78, 83, 197, 84, 69, 78, 83, 128, + 84, 69, 78, 211, 84, 69, 78, 78, 73, 211, 84, 69, 78, 71, 197, 84, 69, + 78, 45, 84, 72, 73, 82, 84, 89, 128, 84, 69, 78, 128, 84, 69, 206, 84, + 69, 77, 80, 85, 211, 84, 69, 77, 80, 76, 69, 128, 84, 69, 76, 85, 71, + 213, 84, 69, 76, 85, 128, 84, 69, 76, 79, 85, 211, 84, 69, 76, 76, 69, + 210, 84, 69, 76, 73, 83, 72, 193, 84, 69, 76, 69, 86, 73, 83, 73, 79, 78, + 128, 84, 69, 76, 69, 83, 67, 79, 80, 69, 128, 84, 69, 76, 69, 80, 72, 79, + 78, 69, 128, 84, 69, 76, 69, 80, 72, 79, 78, 197, 84, 69, 76, 69, 73, 65, + 128, 84, 69, 76, 69, 71, 82, 65, 80, 200, 84, 69, 75, 128, 84, 69, 73, + 87, 83, 128, 84, 69, 71, 69, 72, 128, 84, 69, 69, 84, 72, 128, 84, 69, + 69, 84, 200, 84, 69, 69, 78, 83, 128, 84, 69, 69, 69, 69, 128, 84, 69, + 197, 84, 69, 68, 85, 78, 71, 128, 84, 69, 68, 68, 217, 84, 69, 65, 82, + 211, 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, 80, 79, 75, 69, 196, 84, 69, + 65, 82, 68, 82, 79, 80, 45, 83, 72, 65, 78, 75, 69, 196, 84, 69, 65, 82, + 68, 82, 79, 80, 45, 66, 65, 82, 66, 69, 196, 84, 69, 65, 82, 45, 79, 70, + 198, 84, 69, 65, 82, 128, 84, 69, 65, 80, 79, 84, 128, 84, 69, 65, 67, + 85, 208, 84, 69, 65, 128, 84, 69, 45, 85, 128, 84, 69, 45, 57, 128, 84, + 69, 45, 56, 128, 84, 69, 45, 55, 128, 84, 69, 45, 54, 128, 84, 69, 45, + 53, 128, 84, 69, 45, 52, 128, 84, 69, 45, 51, 128, 84, 69, 45, 50, 128, + 84, 69, 45, 49, 128, 84, 67, 72, 69, 72, 69, 72, 128, 84, 67, 72, 69, 72, + 69, 200, 84, 67, 72, 69, 72, 128, 84, 67, 72, 69, 200, 84, 67, 72, 69, + 128, 84, 195, 84, 65, 89, 128, 84, 65, 88, 73, 128, 84, 65, 88, 128, 84, + 65, 87, 69, 76, 76, 69, 77, 69, 212, 84, 65, 87, 65, 128, 84, 65, 87, + 128, 84, 65, 215, 84, 65, 86, 73, 89, 65, 78, 73, 128, 84, 65, 86, 128, + 84, 65, 214, 84, 65, 85, 82, 85, 83, 128, 84, 65, 85, 77, 128, 84, 65, + 213, 84, 65, 84, 87, 69, 69, 76, 128, 84, 65, 84, 87, 69, 69, 204, 84, + 65, 84, 84, 79, 79, 69, 196, 84, 65, 84, 128, 84, 65, 83, 83, 73, 128, + 84, 65, 83, 128, 84, 65, 82, 85, 78, 71, 128, 84, 65, 82, 84, 65, 82, 45, + 50, 128, 84, 65, 82, 84, 65, 82, 128, 84, 65, 82, 71, 69, 84, 128, 84, + 65, 81, 128, 84, 65, 80, 69, 82, 128, 84, 65, 80, 197, 84, 65, 80, 128, + 84, 65, 79, 128, 84, 65, 78, 78, 69, 196, 84, 65, 78, 71, 69, 82, 73, 78, + 69, 128, 84, 65, 78, 71, 69, 78, 84, 128, 84, 65, 78, 71, 69, 78, 212, + 84, 65, 78, 199, 84, 65, 78, 65, 66, 65, 84, 193, 84, 65, 78, 65, 128, + 84, 65, 78, 128, 84, 65, 77, 73, 78, 71, 128, 84, 65, 77, 65, 206, 84, + 65, 77, 65, 76, 69, 128, 84, 65, 77, 128, 84, 65, 76, 76, 217, 84, 65, + 76, 76, 128, 84, 65, 76, 204, 84, 65, 76, 73, 78, 71, 128, 84, 65, 76, + 73, 78, 199, 84, 65, 76, 69, 78, 84, 83, 128, 84, 65, 76, 69, 78, 212, + 84, 65, 75, 82, 201, 84, 65, 75, 72, 65, 76, 76, 85, 83, 128, 84, 65, 75, + 69, 79, 85, 212, 84, 65, 75, 69, 128, 84, 65, 75, 52, 128, 84, 65, 75, + 180, 84, 65, 75, 128, 84, 65, 73, 83, 89, 79, 85, 128, 84, 65, 73, 76, + 76, 69, 83, 211, 84, 65, 73, 76, 128, 84, 65, 73, 204, 84, 65, 72, 65, + 76, 65, 128, 84, 65, 72, 128, 84, 65, 200, 84, 65, 71, 66, 65, 78, 87, + 193, 84, 65, 71, 65, 76, 79, 199, 84, 65, 71, 128, 84, 65, 69, 206, 84, + 65, 67, 79, 128, 84, 65, 67, 75, 128, 84, 65, 67, 203, 84, 65, 66, 85, + 76, 65, 84, 73, 79, 78, 128, 84, 65, 66, 85, 76, 65, 84, 73, 79, 206, 84, + 65, 66, 83, 128, 84, 65, 66, 76, 69, 128, 84, 65, 66, 76, 197, 84, 65, + 66, 128, 84, 65, 194, 84, 65, 65, 83, 72, 65, 69, 128, 84, 65, 65, 81, + 128, 84, 65, 65, 77, 128, 84, 65, 65, 76, 85, 74, 193, 84, 65, 65, 73, + 128, 84, 65, 65, 70, 128, 84, 65, 50, 128, 84, 65, 45, 82, 79, 76, 128, + 84, 65, 45, 52, 128, 84, 65, 45, 51, 128, 84, 65, 45, 50, 128, 84, 65, + 45, 49, 128, 84, 48, 51, 54, 128, 84, 48, 51, 53, 128, 84, 48, 51, 52, + 128, 84, 48, 51, 51, 65, 128, 84, 48, 51, 51, 128, 84, 48, 51, 50, 65, + 128, 84, 48, 51, 50, 128, 84, 48, 51, 49, 128, 84, 48, 51, 48, 128, 84, + 48, 50, 57, 128, 84, 48, 50, 56, 128, 84, 48, 50, 55, 128, 84, 48, 50, + 54, 128, 84, 48, 50, 53, 128, 84, 48, 50, 52, 128, 84, 48, 50, 51, 128, + 84, 48, 50, 50, 128, 84, 48, 50, 49, 128, 84, 48, 50, 48, 128, 84, 48, + 49, 57, 128, 84, 48, 49, 56, 128, 84, 48, 49, 55, 128, 84, 48, 49, 54, + 65, 128, 84, 48, 49, 54, 128, 84, 48, 49, 53, 128, 84, 48, 49, 52, 128, + 84, 48, 49, 51, 128, 84, 48, 49, 50, 128, 84, 48, 49, 49, 65, 128, 84, + 48, 49, 49, 128, 84, 48, 49, 48, 128, 84, 48, 48, 57, 65, 128, 84, 48, + 48, 57, 128, 84, 48, 48, 56, 65, 128, 84, 48, 48, 56, 128, 84, 48, 48, + 55, 65, 128, 84, 48, 48, 55, 128, 84, 48, 48, 54, 128, 84, 48, 48, 53, + 128, 84, 48, 48, 52, 128, 84, 48, 48, 51, 65, 128, 84, 48, 48, 51, 128, + 84, 48, 48, 50, 128, 84, 48, 48, 49, 128, 84, 45, 83, 72, 73, 82, 84, + 128, 84, 45, 82, 69, 88, 128, 83, 90, 90, 128, 83, 90, 87, 71, 128, 83, + 90, 87, 65, 128, 83, 90, 85, 128, 83, 90, 79, 128, 83, 90, 73, 128, 83, + 90, 69, 69, 128, 83, 90, 69, 128, 83, 90, 65, 65, 128, 83, 90, 65, 128, + 83, 90, 128, 83, 89, 88, 128, 83, 89, 84, 128, 83, 89, 83, 84, 69, 205, + 83, 89, 82, 88, 128, 83, 89, 82, 77, 65, 84, 73, 75, 73, 128, 83, 89, 82, + 77, 65, 128, 83, 89, 82, 73, 78, 71, 69, 128, 83, 89, 82, 73, 65, 195, + 83, 89, 82, 128, 83, 89, 80, 128, 83, 89, 79, 85, 87, 65, 128, 83, 89, + 78, 69, 86, 77, 65, 128, 83, 89, 78, 68, 69, 83, 77, 79, 211, 83, 89, 78, + 67, 72, 82, 79, 78, 79, 85, 211, 83, 89, 78, 65, 71, 79, 71, 85, 69, 128, + 83, 89, 78, 65, 71, 77, 193, 83, 89, 78, 65, 70, 73, 128, 83, 89, 78, + 128, 83, 89, 77, 77, 69, 84, 82, 89, 128, 83, 89, 77, 77, 69, 84, 82, 73, + 195, 83, 89, 77, 66, 79, 76, 83, 128, 83, 89, 77, 66, 79, 76, 211, 83, + 89, 77, 66, 79, 76, 45, 57, 128, 83, 89, 77, 66, 79, 76, 45, 56, 128, 83, + 89, 77, 66, 79, 76, 45, 55, 128, 83, 89, 77, 66, 79, 76, 45, 54, 128, 83, + 89, 77, 66, 79, 76, 45, 53, 52, 128, 83, 89, 77, 66, 79, 76, 45, 53, 51, + 128, 83, 89, 77, 66, 79, 76, 45, 53, 50, 128, 83, 89, 77, 66, 79, 76, 45, + 53, 49, 128, 83, 89, 77, 66, 79, 76, 45, 53, 48, 128, 83, 89, 77, 66, 79, + 76, 45, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, 57, 128, 83, 89, 77, 66, + 79, 76, 45, 52, 56, 128, 83, 89, 77, 66, 79, 76, 45, 52, 55, 128, 83, 89, + 77, 66, 79, 76, 45, 52, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, 51, 128, + 83, 89, 77, 66, 79, 76, 45, 52, 50, 128, 83, 89, 77, 66, 79, 76, 45, 52, + 48, 128, 83, 89, 77, 66, 79, 76, 45, 52, 128, 83, 89, 77, 66, 79, 76, 45, + 51, 57, 128, 83, 89, 77, 66, 79, 76, 45, 51, 56, 128, 83, 89, 77, 66, 79, + 76, 45, 51, 55, 128, 83, 89, 77, 66, 79, 76, 45, 51, 54, 128, 83, 89, 77, + 66, 79, 76, 45, 51, 50, 128, 83, 89, 77, 66, 79, 76, 45, 51, 48, 128, 83, + 89, 77, 66, 79, 76, 45, 51, 128, 83, 89, 77, 66, 79, 76, 45, 50, 57, 128, + 83, 89, 77, 66, 79, 76, 45, 50, 55, 128, 83, 89, 77, 66, 79, 76, 45, 50, + 54, 128, 83, 89, 77, 66, 79, 76, 45, 50, 53, 128, 83, 89, 77, 66, 79, 76, + 45, 50, 52, 128, 83, 89, 77, 66, 79, 76, 45, 50, 51, 128, 83, 89, 77, 66, + 79, 76, 45, 50, 50, 128, 83, 89, 77, 66, 79, 76, 45, 50, 49, 128, 83, 89, + 77, 66, 79, 76, 45, 50, 48, 128, 83, 89, 77, 66, 79, 76, 45, 50, 128, 83, + 89, 77, 66, 79, 76, 45, 49, 57, 128, 83, 89, 77, 66, 79, 76, 45, 49, 56, + 128, 83, 89, 77, 66, 79, 76, 45, 49, 55, 128, 83, 89, 77, 66, 79, 76, 45, + 49, 54, 128, 83, 89, 77, 66, 79, 76, 45, 49, 53, 128, 83, 89, 77, 66, 79, + 76, 45, 49, 52, 128, 83, 89, 77, 66, 79, 76, 45, 49, 51, 128, 83, 89, 77, + 66, 79, 76, 45, 49, 50, 128, 83, 89, 77, 66, 79, 76, 45, 49, 49, 128, 83, + 89, 77, 66, 79, 76, 45, 49, 48, 128, 83, 89, 77, 66, 79, 76, 45, 49, 128, + 83, 89, 76, 79, 84, 201, 83, 89, 73, 128, 83, 89, 128, 83, 87, 90, 128, + 83, 87, 85, 78, 199, 83, 87, 79, 82, 68, 83, 128, 83, 87, 79, 82, 68, + 128, 83, 87, 79, 79, 128, 83, 87, 79, 128, 83, 87, 73, 82, 204, 83, 87, + 73, 77, 83, 85, 73, 84, 128, 83, 87, 73, 77, 77, 73, 78, 71, 128, 83, 87, + 73, 77, 77, 69, 82, 128, 83, 87, 73, 73, 128, 83, 87, 73, 128, 83, 87, + 71, 128, 83, 87, 69, 69, 84, 128, 83, 87, 69, 69, 212, 83, 87, 69, 65, + 84, 128, 83, 87, 69, 65, 212, 83, 87, 65, 83, 200, 83, 87, 65, 80, 80, + 73, 78, 71, 128, 83, 87, 65, 78, 128, 83, 87, 65, 65, 128, 83, 87, 128, + 83, 86, 65, 83, 84, 201, 83, 86, 65, 82, 73, 84, 65, 128, 83, 86, 65, 82, + 73, 84, 193, 83, 85, 88, 128, 83, 85, 85, 128, 83, 85, 84, 82, 193, 83, + 85, 84, 128, 83, 85, 83, 80, 69, 78, 83, 73, 79, 206, 83, 85, 83, 72, 73, + 128, 83, 85, 82, 89, 65, 128, 83, 85, 82, 88, 128, 83, 85, 82, 82, 79, + 85, 78, 68, 128, 83, 85, 82, 82, 79, 85, 78, 196, 83, 85, 82, 70, 69, 82, + 128, 83, 85, 82, 70, 65, 67, 197, 83, 85, 82, 69, 128, 83, 85, 82, 65, + 78, 71, 128, 83, 85, 82, 57, 128, 83, 85, 82, 128, 83, 85, 210, 83, 85, + 80, 82, 65, 76, 73, 78, 69, 65, 210, 83, 85, 80, 69, 82, 86, 73, 83, 69, + 128, 83, 85, 80, 69, 82, 86, 73, 76, 76, 65, 73, 78, 128, 83, 85, 80, 69, + 82, 83, 69, 84, 128, 83, 85, 80, 69, 82, 83, 69, 212, 83, 85, 80, 69, 82, + 83, 67, 82, 73, 80, 212, 83, 85, 80, 69, 82, 73, 77, 80, 79, 83, 69, 196, + 83, 85, 80, 69, 82, 72, 69, 82, 79, 128, 83, 85, 80, 69, 82, 70, 73, 88, + 69, 196, 83, 85, 80, 69, 210, 83, 85, 80, 128, 83, 85, 79, 88, 128, 83, + 85, 79, 80, 128, 83, 85, 79, 128, 83, 85, 78, 83, 69, 212, 83, 85, 78, + 82, 73, 83, 69, 128, 83, 85, 78, 82, 73, 83, 197, 83, 85, 78, 71, 76, 65, + 83, 83, 69, 83, 128, 83, 85, 78, 71, 128, 83, 85, 78, 70, 76, 79, 87, 69, + 82, 128, 83, 85, 78, 68, 65, 78, 69, 83, 197, 83, 85, 78, 128, 83, 85, + 206, 83, 85, 77, 77, 69, 82, 128, 83, 85, 77, 77, 65, 84, 73, 79, 78, + 128, 83, 85, 77, 77, 65, 84, 73, 79, 206, 83, 85, 77, 65, 83, 72, 128, + 83, 85, 77, 128, 83, 85, 76, 70, 85, 82, 128, 83, 85, 75, 85, 78, 128, + 83, 85, 75, 85, 206, 83, 85, 75, 85, 128, 83, 85, 75, 213, 83, 85, 73, + 84, 65, 66, 76, 69, 128, 83, 85, 73, 212, 83, 85, 72, 85, 82, 128, 83, + 85, 69, 128, 83, 85, 68, 50, 128, 83, 85, 68, 128, 83, 85, 67, 75, 73, + 78, 199, 83, 85, 67, 75, 69, 68, 128, 83, 85, 67, 203, 83, 85, 67, 67, + 69, 69, 68, 83, 128, 83, 85, 67, 67, 69, 69, 68, 211, 83, 85, 67, 67, 69, + 69, 68, 128, 83, 85, 67, 67, 69, 69, 196, 83, 85, 66, 85, 78, 73, 84, + 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 73, 79, 206, 83, 85, 66, 83, 84, + 73, 84, 85, 84, 69, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 197, 83, 85, + 66, 83, 69, 84, 128, 83, 85, 66, 83, 69, 212, 83, 85, 66, 83, 67, 82, 73, + 80, 212, 83, 85, 66, 80, 85, 78, 67, 84, 73, 83, 128, 83, 85, 66, 76, 73, + 78, 69, 65, 210, 83, 85, 66, 76, 73, 77, 65, 84, 73, 79, 78, 128, 83, 85, + 66, 76, 73, 77, 65, 84, 69, 45, 51, 128, 83, 85, 66, 76, 73, 77, 65, 84, + 69, 45, 50, 128, 83, 85, 66, 76, 73, 77, 65, 84, 69, 128, 83, 85, 66, 76, + 73, 77, 65, 84, 197, 83, 85, 66, 74, 79, 73, 78, 69, 82, 128, 83, 85, 66, + 74, 79, 73, 78, 69, 196, 83, 85, 66, 74, 69, 67, 84, 128, 83, 85, 66, 73, + 84, 79, 128, 83, 85, 66, 71, 82, 79, 85, 80, 128, 83, 85, 66, 71, 82, 79, + 85, 208, 83, 85, 66, 128, 83, 85, 65, 77, 128, 83, 85, 65, 69, 84, 128, + 83, 85, 65, 69, 78, 128, 83, 85, 65, 69, 128, 83, 85, 65, 66, 128, 83, + 85, 65, 128, 83, 85, 45, 56, 128, 83, 85, 45, 55, 128, 83, 85, 45, 54, + 128, 83, 85, 45, 53, 128, 83, 85, 45, 52, 128, 83, 85, 45, 51, 128, 83, + 85, 45, 50, 128, 83, 85, 45, 49, 128, 83, 213, 83, 84, 88, 128, 83, 84, + 87, 65, 128, 83, 84, 85, 80, 65, 128, 83, 84, 85, 70, 70, 69, 196, 83, + 84, 85, 68, 89, 128, 83, 84, 85, 68, 73, 207, 83, 84, 85, 67, 75, 45, 79, + 85, 212, 83, 84, 83, 128, 83, 84, 82, 79, 78, 199, 83, 84, 82, 79, 75, + 69, 83, 128, 83, 84, 82, 79, 75, 69, 211, 83, 84, 82, 79, 75, 69, 45, 57, + 128, 83, 84, 82, 79, 75, 69, 45, 56, 128, 83, 84, 82, 79, 75, 69, 45, 55, + 128, 83, 84, 82, 79, 75, 69, 45, 54, 128, 83, 84, 82, 79, 75, 69, 45, 53, + 128, 83, 84, 82, 79, 75, 69, 45, 52, 128, 83, 84, 82, 79, 75, 69, 45, 51, + 128, 83, 84, 82, 79, 75, 69, 45, 50, 128, 83, 84, 82, 79, 75, 69, 45, 49, + 49, 128, 83, 84, 82, 79, 75, 69, 45, 49, 48, 128, 83, 84, 82, 79, 75, 69, + 45, 49, 128, 83, 84, 82, 79, 75, 197, 83, 84, 82, 73, 80, 69, 128, 83, + 84, 82, 73, 78, 71, 128, 83, 84, 82, 73, 78, 199, 83, 84, 82, 73, 75, 69, + 84, 72, 82, 79, 85, 71, 72, 128, 83, 84, 82, 73, 75, 197, 83, 84, 82, 73, + 68, 69, 128, 83, 84, 82, 73, 67, 84, 76, 217, 83, 84, 82, 69, 84, 67, 72, + 69, 196, 83, 84, 82, 69, 84, 67, 72, 128, 83, 84, 82, 69, 83, 211, 83, + 84, 82, 69, 78, 71, 84, 72, 128, 83, 84, 82, 69, 65, 77, 69, 82, 128, 83, + 84, 82, 65, 87, 66, 69, 82, 82, 89, 128, 83, 84, 82, 65, 87, 128, 83, 84, + 82, 65, 84, 85, 77, 45, 50, 128, 83, 84, 82, 65, 84, 85, 77, 128, 83, 84, + 82, 65, 84, 85, 205, 83, 84, 82, 65, 84, 73, 65, 206, 83, 84, 82, 65, 73, + 78, 69, 82, 128, 83, 84, 82, 65, 73, 71, 72, 84, 78, 69, 83, 83, 128, 83, + 84, 82, 65, 73, 71, 72, 84, 128, 83, 84, 82, 65, 73, 71, 72, 212, 83, 84, + 82, 65, 73, 70, 128, 83, 84, 82, 65, 71, 71, 73, 83, 77, 65, 84, 65, 128, + 83, 84, 79, 86, 69, 128, 83, 84, 79, 82, 69, 128, 83, 84, 79, 80, 87, 65, + 84, 67, 72, 128, 83, 84, 79, 80, 80, 73, 78, 71, 128, 83, 84, 79, 80, 80, + 65, 71, 69, 128, 83, 84, 79, 80, 128, 83, 84, 79, 208, 83, 84, 79, 78, + 69, 128, 83, 84, 79, 67, 75, 128, 83, 84, 79, 67, 203, 83, 84, 73, 82, + 82, 85, 208, 83, 84, 73, 77, 77, 69, 128, 83, 84, 73, 76, 204, 83, 84, + 73, 76, 197, 83, 84, 73, 71, 77, 65, 128, 83, 84, 73, 67, 75, 73, 78, + 199, 83, 84, 73, 67, 203, 83, 84, 69, 84, 72, 79, 83, 67, 79, 80, 69, 128, 83, 84, 69, 82, 69, 79, 128, 83, 84, 69, 80, 128, 83, 84, 69, 78, 79, 71, 82, 65, 80, 72, 73, 195, 83, 84, 69, 77, 128, 83, 84, 69, 65, 77, 217, 83, 84, 69, 65, 77, 73, 78, 199, 83, 84, 69, 65, 77, 128, 83, 84, @@ -1080,95 +1084,136 @@ static const unsigned char lexicon[] = { 69, 45, 83, 72, 73, 70, 84, 45, 51, 128, 83, 73, 78, 71, 76, 69, 45, 83, 72, 73, 70, 84, 45, 50, 128, 83, 73, 78, 71, 76, 69, 45, 76, 73, 78, 197, 83, 73, 78, 71, 76, 69, 128, 83, 73, 78, 71, 76, 197, 83, 73, 78, 71, 65, - 65, 84, 128, 83, 73, 78, 197, 83, 73, 78, 68, 72, 201, 83, 73, 206, 83, - 73, 77, 85, 76, 84, 65, 78, 69, 79, 85, 83, 128, 83, 73, 77, 85, 76, 84, - 65, 78, 69, 79, 85, 211, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 83, 73, - 77, 73, 76, 65, 82, 128, 83, 73, 77, 73, 76, 65, 210, 83, 73, 77, 65, 78, - 83, 73, 211, 83, 73, 77, 65, 76, 85, 78, 71, 85, 206, 83, 73, 77, 65, - 128, 83, 73, 76, 86, 69, 82, 128, 83, 73, 76, 75, 128, 83, 73, 76, 73, - 81, 85, 193, 83, 73, 76, 72, 79, 85, 69, 84, 84, 69, 128, 83, 73, 76, 72, - 79, 85, 69, 84, 84, 197, 83, 73, 76, 65, 51, 128, 83, 73, 75, 73, 128, - 83, 73, 75, 50, 128, 83, 73, 75, 178, 83, 73, 71, 78, 83, 128, 83, 73, - 71, 77, 65, 128, 83, 73, 71, 77, 193, 83, 73, 71, 69, 204, 83, 73, 71, - 52, 128, 83, 73, 71, 180, 83, 73, 71, 128, 83, 73, 69, 69, 128, 83, 73, - 68, 69, 87, 65, 89, 211, 83, 73, 68, 69, 128, 83, 73, 68, 197, 83, 73, - 68, 68, 72, 73, 128, 83, 73, 68, 68, 72, 65, 77, 128, 83, 73, 68, 68, 72, - 65, 205, 83, 73, 67, 75, 78, 69, 83, 83, 128, 83, 73, 67, 75, 76, 69, - 128, 83, 73, 66, 197, 83, 73, 65, 128, 83, 73, 45, 54, 128, 83, 73, 45, - 53, 128, 83, 73, 45, 52, 128, 83, 73, 45, 51, 128, 83, 73, 45, 50, 128, - 83, 73, 45, 49, 128, 83, 201, 83, 72, 89, 88, 128, 83, 72, 89, 84, 128, - 83, 72, 89, 82, 88, 128, 83, 72, 89, 82, 128, 83, 72, 89, 80, 128, 83, - 72, 89, 69, 128, 83, 72, 89, 65, 128, 83, 72, 89, 128, 83, 72, 87, 79, - 89, 128, 83, 72, 87, 79, 79, 128, 83, 72, 87, 79, 128, 83, 72, 87, 73, - 73, 128, 83, 72, 87, 73, 128, 83, 72, 87, 69, 128, 83, 72, 87, 197, 83, - 72, 87, 65, 65, 128, 83, 72, 87, 65, 128, 83, 72, 86, 128, 83, 72, 85, - 88, 128, 83, 72, 85, 85, 128, 83, 72, 85, 84, 84, 76, 69, 67, 79, 67, 75, - 128, 83, 72, 85, 84, 128, 83, 72, 85, 82, 88, 128, 83, 72, 85, 82, 128, - 83, 72, 85, 80, 128, 83, 72, 85, 79, 88, 128, 83, 72, 85, 79, 80, 128, - 83, 72, 85, 79, 128, 83, 72, 85, 77, 128, 83, 72, 85, 76, 128, 83, 72, - 85, 70, 70, 76, 197, 83, 72, 85, 69, 81, 128, 83, 72, 85, 69, 78, 83, 72, - 85, 69, 84, 128, 83, 72, 85, 66, 85, 82, 128, 83, 72, 85, 65, 78, 71, 88, - 73, 128, 83, 72, 85, 50, 128, 83, 72, 85, 178, 83, 72, 85, 128, 83, 72, - 84, 65, 80, 73, 67, 128, 83, 72, 84, 65, 128, 83, 72, 82, 85, 71, 128, - 83, 72, 82, 73, 78, 69, 128, 83, 72, 82, 73, 77, 80, 128, 83, 72, 82, 73, - 73, 128, 83, 72, 82, 73, 128, 83, 72, 79, 89, 128, 83, 72, 79, 88, 128, - 83, 72, 79, 87, 69, 82, 128, 83, 72, 79, 85, 76, 68, 69, 82, 69, 196, 83, - 72, 79, 85, 76, 68, 69, 210, 83, 72, 79, 85, 128, 83, 72, 79, 84, 128, - 83, 72, 79, 82, 84, 83, 128, 83, 72, 79, 82, 84, 211, 83, 72, 79, 82, 84, - 72, 65, 78, 196, 83, 72, 79, 82, 84, 69, 78, 69, 82, 128, 83, 72, 79, 82, - 84, 67, 65, 75, 69, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 89, - 82, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 84, 89, 210, 83, 72, - 79, 82, 84, 45, 84, 87, 73, 71, 45, 83, 79, 204, 83, 72, 79, 82, 84, 45, - 84, 87, 73, 71, 45, 79, 83, 211, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, - 45, 78, 65, 85, 196, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 77, 65, - 68, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 72, 65, 71, 65, 76, - 204, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 66, 74, 65, 82, 75, 65, - 206, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 65, 210, 83, 72, 79, 82, - 84, 128, 83, 72, 79, 82, 212, 83, 72, 79, 81, 128, 83, 72, 79, 209, 83, - 72, 79, 80, 80, 73, 78, 199, 83, 72, 79, 80, 128, 83, 72, 79, 79, 84, 73, - 78, 199, 83, 72, 79, 79, 84, 128, 83, 72, 79, 79, 73, 128, 83, 72, 79, - 79, 128, 83, 72, 79, 71, 201, 83, 72, 79, 199, 83, 72, 79, 69, 83, 128, - 83, 72, 79, 69, 128, 83, 72, 79, 197, 83, 72, 79, 67, 75, 69, 196, 83, - 72, 79, 65, 128, 83, 72, 79, 128, 83, 72, 73, 89, 89, 65, 65, 76, 65, 65, - 128, 83, 72, 73, 84, 65, 128, 83, 72, 73, 84, 193, 83, 72, 73, 82, 212, - 83, 72, 73, 82, 65, 69, 128, 83, 72, 73, 82, 128, 83, 72, 73, 210, 83, - 72, 73, 81, 128, 83, 72, 73, 78, 84, 207, 83, 72, 73, 78, 73, 71, 128, - 83, 72, 73, 78, 68, 193, 83, 72, 73, 206, 83, 72, 73, 77, 65, 128, 83, - 72, 73, 77, 193, 83, 72, 73, 77, 128, 83, 72, 73, 205, 83, 72, 73, 73, - 78, 128, 83, 72, 73, 73, 128, 83, 72, 73, 70, 212, 83, 72, 73, 69, 76, - 68, 128, 83, 72, 73, 68, 128, 83, 72, 73, 196, 83, 72, 72, 65, 128, 83, - 72, 72, 193, 83, 72, 69, 88, 128, 83, 72, 69, 86, 65, 128, 83, 72, 69, - 85, 88, 128, 83, 72, 69, 85, 79, 81, 128, 83, 72, 69, 85, 65, 69, 81, 84, - 85, 128, 83, 72, 69, 85, 65, 69, 81, 128, 83, 72, 69, 85, 65, 69, 128, - 83, 72, 69, 84, 128, 83, 72, 69, 212, 83, 72, 69, 83, 72, 76, 65, 77, - 128, 83, 72, 69, 83, 72, 73, 71, 128, 83, 72, 69, 83, 72, 73, 199, 83, - 72, 69, 83, 72, 50, 128, 83, 72, 69, 83, 72, 128, 83, 72, 69, 83, 200, - 83, 72, 69, 81, 69, 204, 83, 72, 69, 80, 128, 83, 72, 69, 78, 128, 83, - 72, 69, 76, 76, 128, 83, 72, 69, 76, 204, 83, 72, 69, 76, 70, 128, 83, - 72, 69, 73, 128, 83, 72, 69, 71, 57, 128, 83, 72, 69, 69, 80, 128, 83, - 72, 69, 69, 78, 85, 128, 83, 72, 69, 69, 78, 128, 83, 72, 69, 69, 206, - 83, 72, 69, 69, 128, 83, 72, 69, 45, 71, 79, 65, 84, 128, 83, 72, 197, - 83, 72, 67, 72, 79, 79, 73, 128, 83, 72, 67, 72, 65, 128, 83, 72, 65, 89, - 128, 83, 72, 65, 88, 128, 83, 72, 65, 86, 73, 89, 65, 78, 73, 128, 83, - 72, 65, 86, 73, 65, 206, 83, 72, 65, 86, 69, 196, 83, 72, 65, 85, 128, - 83, 72, 65, 84, 128, 83, 72, 65, 82, 85, 128, 83, 72, 65, 82, 213, 83, - 72, 65, 82, 80, 128, 83, 72, 65, 82, 208, 83, 72, 65, 82, 75, 128, 83, - 72, 65, 82, 65, 68, 193, 83, 72, 65, 82, 65, 128, 83, 72, 65, 82, 50, - 128, 83, 72, 65, 82, 178, 83, 72, 65, 80, 73, 78, 71, 128, 83, 72, 65, - 80, 69, 83, 128, 83, 72, 65, 80, 197, 83, 72, 65, 80, 128, 83, 72, 65, - 78, 71, 128, 83, 72, 65, 78, 128, 83, 72, 65, 206, 83, 72, 65, 77, 82, - 79, 67, 75, 128, 83, 72, 65, 76, 83, 72, 69, 76, 69, 84, 128, 83, 72, 65, - 76, 76, 79, 215, 83, 72, 65, 75, 84, 73, 128, 83, 72, 65, 75, 73, 78, 71, - 128, 83, 72, 65, 75, 73, 78, 199, 83, 72, 65, 75, 69, 82, 128, 83, 72, - 65, 75, 128, 83, 72, 65, 73, 128, 83, 72, 65, 70, 84, 128, 83, 72, 65, - 70, 212, 83, 72, 65, 68, 79, 87, 69, 196, 83, 72, 65, 68, 69, 196, 83, - 72, 65, 68, 69, 128, 83, 72, 65, 68, 68, 65, 128, 83, 72, 65, 68, 68, - 193, 83, 72, 65, 68, 128, 83, 72, 65, 196, 83, 72, 65, 66, 54, 128, 83, - 72, 65, 65, 128, 83, 72, 65, 54, 128, 83, 72, 65, 182, 83, 72, 65, 51, - 128, 83, 72, 65, 179, 83, 71, 82, 193, 83, 71, 79, 210, 83, 71, 67, 128, - 83, 71, 65, 215, 83, 71, 65, 194, 83, 71, 128, 83, 69, 89, 75, 128, 83, - 69, 88, 84, 85, 76, 193, 83, 69, 88, 84, 73, 76, 69, 128, 83, 69, 88, 84, - 65, 78, 211, 83, 69, 86, 69, 82, 65, 78, 67, 69, 128, 83, 69, 86, 69, 78, + 65, 84, 128, 83, 73, 78, 197, 83, 73, 78, 68, 72, 201, 83, 73, 78, 128, + 83, 73, 206, 83, 73, 77, 85, 76, 84, 65, 78, 69, 79, 85, 83, 128, 83, 73, + 77, 85, 76, 84, 65, 78, 69, 79, 85, 211, 83, 73, 77, 80, 76, 73, 70, 73, + 69, 196, 83, 73, 77, 73, 76, 65, 82, 128, 83, 73, 77, 73, 76, 65, 210, + 83, 73, 77, 65, 78, 83, 73, 211, 83, 73, 77, 65, 76, 85, 78, 71, 85, 206, + 83, 73, 77, 65, 128, 83, 73, 76, 86, 69, 82, 128, 83, 73, 76, 75, 128, + 83, 73, 76, 73, 81, 85, 193, 83, 73, 76, 72, 79, 85, 69, 84, 84, 69, 128, + 83, 73, 76, 72, 79, 85, 69, 84, 84, 197, 83, 73, 76, 65, 51, 128, 83, 73, + 75, 73, 128, 83, 73, 75, 50, 128, 83, 73, 75, 178, 83, 73, 71, 78, 83, + 128, 83, 73, 71, 77, 65, 128, 83, 73, 71, 77, 193, 83, 73, 71, 69, 204, + 83, 73, 71, 52, 128, 83, 73, 71, 180, 83, 73, 71, 128, 83, 73, 69, 69, + 128, 83, 73, 68, 69, 87, 65, 89, 211, 83, 73, 68, 69, 128, 83, 73, 68, + 197, 83, 73, 68, 68, 72, 73, 128, 83, 73, 68, 68, 72, 65, 77, 128, 83, + 73, 68, 68, 72, 65, 205, 83, 73, 67, 75, 78, 69, 83, 83, 128, 83, 73, 67, + 75, 76, 69, 128, 83, 73, 66, 197, 83, 73, 65, 128, 83, 73, 45, 54, 128, + 83, 73, 45, 53, 128, 83, 73, 45, 52, 128, 83, 73, 45, 51, 128, 83, 73, + 45, 50, 128, 83, 73, 45, 49, 128, 83, 201, 83, 72, 89, 88, 128, 83, 72, + 89, 84, 128, 83, 72, 89, 82, 88, 128, 83, 72, 89, 82, 128, 83, 72, 89, + 80, 128, 83, 72, 89, 69, 128, 83, 72, 89, 65, 128, 83, 72, 89, 128, 83, + 72, 87, 79, 89, 128, 83, 72, 87, 79, 79, 128, 83, 72, 87, 79, 128, 83, + 72, 87, 73, 73, 128, 83, 72, 87, 73, 128, 83, 72, 87, 69, 128, 83, 72, + 87, 197, 83, 72, 87, 65, 65, 128, 83, 72, 87, 65, 128, 83, 72, 86, 128, + 83, 72, 85, 88, 128, 83, 72, 85, 85, 128, 83, 72, 85, 84, 84, 76, 69, 67, + 79, 67, 75, 128, 83, 72, 85, 84, 128, 83, 72, 85, 82, 88, 128, 83, 72, + 85, 82, 128, 83, 72, 85, 80, 128, 83, 72, 85, 79, 88, 128, 83, 72, 85, + 79, 80, 128, 83, 72, 85, 79, 128, 83, 72, 85, 77, 128, 83, 72, 85, 76, + 128, 83, 72, 85, 70, 70, 76, 197, 83, 72, 85, 69, 81, 128, 83, 72, 85, + 69, 78, 83, 72, 85, 69, 84, 128, 83, 72, 85, 66, 85, 82, 128, 83, 72, 85, + 65, 78, 71, 88, 73, 128, 83, 72, 85, 50, 128, 83, 72, 85, 178, 83, 72, + 85, 128, 83, 72, 84, 65, 80, 73, 67, 128, 83, 72, 84, 65, 128, 83, 72, + 82, 85, 71, 128, 83, 72, 82, 73, 78, 69, 128, 83, 72, 82, 73, 77, 80, + 128, 83, 72, 82, 73, 73, 128, 83, 72, 82, 73, 128, 83, 72, 79, 89, 128, + 83, 72, 79, 88, 128, 83, 72, 79, 87, 69, 82, 128, 83, 72, 79, 85, 76, 68, + 69, 82, 69, 196, 83, 72, 79, 85, 76, 68, 69, 210, 83, 72, 79, 85, 128, + 83, 72, 79, 84, 128, 83, 72, 79, 82, 84, 83, 128, 83, 72, 79, 82, 84, + 211, 83, 72, 79, 82, 84, 72, 65, 78, 196, 83, 72, 79, 82, 84, 69, 78, 69, + 82, 128, 83, 72, 79, 82, 84, 67, 65, 75, 69, 128, 83, 72, 79, 82, 84, 45, + 84, 87, 73, 71, 45, 89, 82, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, + 45, 84, 89, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 83, 79, 204, + 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 79, 83, 211, 83, 72, 79, 82, + 84, 45, 84, 87, 73, 71, 45, 78, 65, 85, 196, 83, 72, 79, 82, 84, 45, 84, + 87, 73, 71, 45, 77, 65, 68, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, + 45, 72, 65, 71, 65, 76, 204, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, + 66, 74, 65, 82, 75, 65, 206, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, + 65, 210, 83, 72, 79, 82, 84, 128, 83, 72, 79, 82, 212, 83, 72, 79, 81, + 128, 83, 72, 79, 209, 83, 72, 79, 80, 80, 73, 78, 199, 83, 72, 79, 80, + 128, 83, 72, 79, 79, 84, 73, 78, 199, 83, 72, 79, 79, 84, 128, 83, 72, + 79, 79, 73, 128, 83, 72, 79, 79, 128, 83, 72, 79, 71, 201, 83, 72, 79, + 199, 83, 72, 79, 69, 83, 128, 83, 72, 79, 69, 128, 83, 72, 79, 197, 83, + 72, 79, 67, 75, 69, 196, 83, 72, 79, 65, 128, 83, 72, 79, 128, 83, 72, + 73, 89, 89, 65, 65, 76, 65, 65, 128, 83, 72, 73, 84, 65, 128, 83, 72, 73, + 84, 193, 83, 72, 73, 82, 212, 83, 72, 73, 82, 65, 69, 128, 83, 72, 73, + 82, 128, 83, 72, 73, 210, 83, 72, 73, 81, 128, 83, 72, 73, 78, 84, 207, + 83, 72, 73, 78, 73, 71, 128, 83, 72, 73, 78, 68, 193, 83, 72, 73, 206, + 83, 72, 73, 77, 65, 128, 83, 72, 73, 77, 193, 83, 72, 73, 77, 128, 83, + 72, 73, 205, 83, 72, 73, 73, 78, 128, 83, 72, 73, 73, 128, 83, 72, 73, + 70, 212, 83, 72, 73, 69, 76, 68, 128, 83, 72, 73, 68, 128, 83, 72, 73, + 196, 83, 72, 72, 65, 128, 83, 72, 72, 193, 83, 72, 69, 88, 128, 83, 72, + 69, 86, 65, 128, 83, 72, 69, 85, 88, 128, 83, 72, 69, 85, 79, 81, 128, + 83, 72, 69, 85, 65, 69, 81, 84, 85, 128, 83, 72, 69, 85, 65, 69, 81, 128, + 83, 72, 69, 85, 65, 69, 128, 83, 72, 69, 84, 128, 83, 72, 69, 212, 83, + 72, 69, 83, 72, 76, 65, 77, 128, 83, 72, 69, 83, 72, 73, 71, 128, 83, 72, + 69, 83, 72, 73, 199, 83, 72, 69, 83, 72, 50, 128, 83, 72, 69, 83, 72, + 128, 83, 72, 69, 83, 200, 83, 72, 69, 81, 69, 204, 83, 72, 69, 80, 128, + 83, 72, 69, 78, 128, 83, 72, 69, 76, 76, 128, 83, 72, 69, 76, 204, 83, + 72, 69, 76, 70, 128, 83, 72, 69, 73, 128, 83, 72, 69, 71, 57, 128, 83, + 72, 69, 69, 80, 128, 83, 72, 69, 69, 78, 85, 128, 83, 72, 69, 69, 78, + 128, 83, 72, 69, 69, 206, 83, 72, 69, 69, 128, 83, 72, 69, 45, 71, 79, + 65, 84, 128, 83, 72, 197, 83, 72, 67, 72, 79, 79, 73, 128, 83, 72, 67, + 72, 65, 128, 83, 72, 65, 89, 128, 83, 72, 65, 88, 128, 83, 72, 65, 86, + 73, 89, 65, 78, 73, 128, 83, 72, 65, 86, 73, 65, 206, 83, 72, 65, 86, 69, + 196, 83, 72, 65, 85, 128, 83, 72, 65, 84, 128, 83, 72, 65, 82, 85, 128, + 83, 72, 65, 82, 213, 83, 72, 65, 82, 80, 128, 83, 72, 65, 82, 208, 83, + 72, 65, 82, 75, 128, 83, 72, 65, 82, 65, 68, 193, 83, 72, 65, 82, 65, + 128, 83, 72, 65, 82, 50, 128, 83, 72, 65, 82, 178, 83, 72, 65, 80, 73, + 78, 71, 128, 83, 72, 65, 80, 69, 83, 128, 83, 72, 65, 80, 197, 83, 72, + 65, 80, 128, 83, 72, 65, 78, 71, 128, 83, 72, 65, 78, 128, 83, 72, 65, + 206, 83, 72, 65, 77, 82, 79, 67, 75, 128, 83, 72, 65, 76, 83, 72, 69, 76, + 69, 84, 128, 83, 72, 65, 76, 76, 79, 215, 83, 72, 65, 75, 84, 73, 128, + 83, 72, 65, 75, 73, 78, 71, 128, 83, 72, 65, 75, 73, 78, 199, 83, 72, 65, + 75, 69, 82, 128, 83, 72, 65, 75, 128, 83, 72, 65, 73, 128, 83, 72, 65, + 70, 84, 128, 83, 72, 65, 70, 212, 83, 72, 65, 68, 79, 87, 69, 196, 83, + 72, 65, 68, 69, 196, 83, 72, 65, 68, 69, 128, 83, 72, 65, 68, 197, 83, + 72, 65, 68, 68, 65, 128, 83, 72, 65, 68, 68, 193, 83, 72, 65, 68, 128, + 83, 72, 65, 196, 83, 72, 65, 66, 54, 128, 83, 72, 65, 65, 128, 83, 72, + 65, 54, 128, 83, 72, 65, 182, 83, 72, 65, 51, 128, 83, 72, 65, 179, 83, + 71, 82, 193, 83, 71, 79, 210, 83, 71, 67, 128, 83, 71, 65, 215, 83, 71, + 65, 194, 83, 71, 128, 83, 69, 89, 75, 128, 83, 69, 88, 84, 85, 76, 193, + 83, 69, 88, 84, 73, 76, 69, 128, 83, 69, 88, 84, 65, 78, 84, 45, 54, 128, + 83, 69, 88, 84, 65, 78, 84, 45, 53, 54, 128, 83, 69, 88, 84, 65, 78, 84, + 45, 53, 128, 83, 69, 88, 84, 65, 78, 84, 45, 52, 54, 128, 83, 69, 88, 84, + 65, 78, 84, 45, 52, 53, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 52, 53, + 128, 83, 69, 88, 84, 65, 78, 84, 45, 52, 128, 83, 69, 88, 84, 65, 78, 84, + 45, 51, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 51, 53, 54, 128, 83, 69, + 88, 84, 65, 78, 84, 45, 51, 53, 128, 83, 69, 88, 84, 65, 78, 84, 45, 51, + 52, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 51, 52, 53, 54, 128, 83, 69, + 88, 84, 65, 78, 84, 45, 51, 52, 53, 128, 83, 69, 88, 84, 65, 78, 84, 45, + 51, 52, 128, 83, 69, 88, 84, 65, 78, 84, 45, 51, 128, 83, 69, 88, 84, 65, + 78, 84, 45, 50, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 50, 53, 54, 128, + 83, 69, 88, 84, 65, 78, 84, 45, 50, 53, 128, 83, 69, 88, 84, 65, 78, 84, + 45, 50, 52, 53, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 50, 52, 53, 128, + 83, 69, 88, 84, 65, 78, 84, 45, 50, 52, 128, 83, 69, 88, 84, 65, 78, 84, + 45, 50, 51, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 50, 51, 53, 54, 128, + 83, 69, 88, 84, 65, 78, 84, 45, 50, 51, 53, 128, 83, 69, 88, 84, 65, 78, + 84, 45, 50, 51, 52, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 50, 51, 52, + 53, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 50, 51, 52, 53, 128, 83, 69, + 88, 84, 65, 78, 84, 45, 50, 51, 52, 128, 83, 69, 88, 84, 65, 78, 84, 45, + 50, 51, 128, 83, 69, 88, 84, 65, 78, 84, 45, 50, 128, 83, 69, 88, 84, 65, + 78, 84, 45, 49, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 53, 54, 128, + 83, 69, 88, 84, 65, 78, 84, 45, 49, 53, 128, 83, 69, 88, 84, 65, 78, 84, + 45, 49, 52, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 52, 53, 54, 128, + 83, 69, 88, 84, 65, 78, 84, 45, 49, 52, 53, 128, 83, 69, 88, 84, 65, 78, + 84, 45, 49, 52, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 51, 54, 128, 83, + 69, 88, 84, 65, 78, 84, 45, 49, 51, 53, 54, 128, 83, 69, 88, 84, 65, 78, + 84, 45, 49, 51, 52, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 51, 52, + 53, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 51, 52, 53, 128, 83, 69, + 88, 84, 65, 78, 84, 45, 49, 51, 52, 128, 83, 69, 88, 84, 65, 78, 84, 45, + 49, 51, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 50, 54, 128, 83, 69, 88, + 84, 65, 78, 84, 45, 49, 50, 53, 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, + 49, 50, 53, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 50, 52, 54, 128, 83, + 69, 88, 84, 65, 78, 84, 45, 49, 50, 52, 53, 54, 128, 83, 69, 88, 84, 65, + 78, 84, 45, 49, 50, 52, 53, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 50, + 52, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 50, 51, 54, 128, 83, 69, 88, + 84, 65, 78, 84, 45, 49, 50, 51, 53, 54, 128, 83, 69, 88, 84, 65, 78, 84, + 45, 49, 50, 51, 53, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 50, 51, 52, + 54, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 50, 51, 52, 53, 128, 83, 69, + 88, 84, 65, 78, 84, 45, 49, 50, 51, 52, 128, 83, 69, 88, 84, 65, 78, 84, + 45, 49, 50, 51, 128, 83, 69, 88, 84, 65, 78, 84, 45, 49, 50, 128, 83, 69, + 88, 84, 65, 78, 84, 45, 49, 128, 83, 69, 88, 84, 65, 78, 211, 83, 69, 87, + 73, 78, 199, 83, 69, 86, 69, 82, 65, 78, 67, 69, 128, 83, 69, 86, 69, 78, 84, 89, 128, 83, 69, 86, 69, 78, 84, 217, 83, 69, 86, 69, 78, 84, 72, 128, 83, 69, 86, 69, 78, 84, 69, 69, 78, 128, 83, 69, 86, 69, 78, 84, 69, 69, 206, 83, 69, 86, 69, 78, 45, 84, 72, 73, 82, 84, 89, 128, 83, 69, 86, @@ -1372,425 +1417,430 @@ static const unsigned char lexicon[] = { 76, 69, 67, 84, 79, 82, 45, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 128, 83, 69, 76, 69, 67, 84, 79, 210, 83, 69, 76, 69, 67, 84, 69, 196, 83, 69, 73, 83, 77, 65, 128, 83, 69, 73, 83, 77, 193, 83, 69, 72, 128, 83, 69, - 71, 79, 76, 128, 83, 69, 71, 78, 79, 128, 83, 69, 71, 77, 69, 78, 84, - 128, 83, 69, 69, 86, 128, 83, 69, 69, 78, 85, 128, 83, 69, 69, 78, 128, - 83, 69, 69, 206, 83, 69, 69, 68, 76, 73, 78, 71, 128, 83, 69, 69, 45, 78, - 79, 45, 69, 86, 73, 204, 83, 69, 68, 78, 65, 128, 83, 69, 67, 84, 79, 82, - 128, 83, 69, 67, 84, 73, 79, 78, 128, 83, 69, 67, 84, 73, 79, 206, 83, - 69, 67, 82, 69, 84, 128, 83, 69, 67, 65, 78, 84, 128, 83, 69, 66, 65, 84, - 66, 69, 73, 212, 83, 69, 65, 84, 128, 83, 69, 65, 76, 128, 83, 69, 65, - 71, 85, 76, 204, 83, 69, 45, 53, 128, 83, 69, 45, 52, 128, 83, 69, 45, - 51, 128, 83, 68, 79, 78, 199, 83, 68, 128, 83, 67, 87, 65, 128, 83, 67, - 82, 85, 80, 76, 69, 128, 83, 67, 82, 79, 76, 76, 128, 83, 67, 82, 73, 80, - 84, 128, 83, 67, 82, 69, 69, 78, 128, 83, 67, 82, 69, 69, 206, 83, 67, - 82, 69, 65, 77, 73, 78, 199, 83, 67, 79, 82, 80, 73, 85, 83, 128, 83, 67, - 79, 82, 80, 73, 79, 78, 128, 83, 67, 79, 82, 69, 128, 83, 67, 79, 79, 84, - 69, 82, 128, 83, 67, 73, 83, 83, 79, 82, 83, 128, 83, 67, 73, 128, 83, - 67, 72, 87, 65, 128, 83, 67, 72, 87, 193, 83, 67, 72, 82, 79, 69, 68, 69, - 82, 128, 83, 67, 72, 79, 79, 76, 128, 83, 67, 72, 79, 79, 204, 83, 67, - 72, 79, 76, 65, 82, 128, 83, 67, 72, 69, 77, 193, 83, 67, 69, 80, 84, 69, - 210, 83, 67, 65, 82, 70, 128, 83, 67, 65, 78, 68, 73, 67, 85, 83, 128, - 83, 67, 65, 78, 68, 73, 67, 85, 211, 83, 67, 65, 206, 83, 67, 65, 76, 69, - 83, 128, 83, 66, 85, 194, 83, 66, 82, 85, 204, 83, 65, 89, 73, 83, 201, - 83, 65, 89, 65, 78, 78, 65, 128, 83, 65, 89, 128, 83, 65, 88, 79, 80, 72, - 79, 78, 69, 128, 83, 65, 88, 73, 77, 65, 84, 65, 128, 83, 65, 87, 65, 78, - 128, 83, 65, 87, 128, 83, 65, 86, 79, 85, 82, 73, 78, 199, 83, 65, 85, - 82, 79, 80, 79, 68, 128, 83, 65, 85, 82, 65, 83, 72, 84, 82, 193, 83, 65, - 85, 73, 76, 128, 83, 65, 85, 67, 69, 82, 128, 83, 65, 84, 85, 82, 78, - 128, 83, 65, 84, 75, 65, 65, 78, 75, 85, 85, 128, 83, 65, 84, 75, 65, 65, - 78, 128, 83, 65, 84, 69, 76, 76, 73, 84, 69, 128, 83, 65, 84, 69, 76, 76, - 73, 84, 197, 83, 65, 84, 67, 72, 69, 76, 128, 83, 65, 84, 65, 78, 71, 65, - 128, 83, 65, 83, 72, 128, 83, 65, 83, 65, 75, 128, 83, 65, 82, 73, 128, - 83, 65, 82, 193, 83, 65, 82, 128, 83, 65, 81, 128, 83, 65, 80, 65, 128, - 83, 65, 78, 89, 79, 79, 71, 193, 83, 65, 78, 89, 65, 75, 193, 83, 65, 78, - 84, 73, 73, 77, 85, 128, 83, 65, 78, 83, 75, 82, 73, 212, 83, 65, 78, 78, - 89, 65, 128, 83, 65, 78, 71, 65, 50, 128, 83, 65, 78, 68, 87, 73, 67, 72, - 128, 83, 65, 78, 68, 72, 201, 83, 65, 78, 68, 65, 76, 128, 83, 65, 78, - 65, 72, 128, 83, 65, 78, 128, 83, 65, 77, 89, 79, 203, 83, 65, 77, 86, - 65, 84, 128, 83, 65, 77, 80, 73, 128, 83, 65, 77, 80, 72, 65, 79, 128, - 83, 65, 77, 75, 65, 128, 83, 65, 77, 69, 75, 72, 128, 83, 65, 77, 69, 75, - 200, 83, 65, 77, 66, 65, 128, 83, 65, 77, 65, 82, 73, 84, 65, 206, 83, - 65, 77, 128, 83, 65, 76, 84, 73, 82, 69, 128, 83, 65, 76, 84, 73, 76, 76, - 79, 128, 83, 65, 76, 84, 45, 50, 128, 83, 65, 76, 84, 128, 83, 65, 76, - 212, 83, 65, 76, 76, 65, 76, 76, 65, 72, 79, 213, 83, 65, 76, 76, 193, - 83, 65, 76, 65, 205, 83, 65, 76, 65, 68, 128, 83, 65, 76, 65, 128, 83, - 65, 76, 45, 65, 77, 77, 79, 78, 73, 65, 67, 128, 83, 65, 76, 128, 83, 65, - 75, 84, 65, 128, 83, 65, 75, 79, 84, 128, 83, 65, 75, 73, 78, 128, 83, - 65, 75, 72, 193, 83, 65, 75, 69, 85, 65, 69, 128, 83, 65, 75, 197, 83, - 65, 74, 68, 65, 72, 128, 83, 65, 73, 76, 66, 79, 65, 84, 128, 83, 65, 73, - 76, 128, 83, 65, 73, 75, 85, 82, 85, 128, 83, 65, 72, 128, 83, 65, 71, - 73, 84, 84, 65, 82, 73, 85, 83, 128, 83, 65, 71, 65, 128, 83, 65, 71, - 128, 83, 65, 199, 83, 65, 70, 72, 65, 128, 83, 65, 70, 69, 84, 217, 83, - 65, 68, 72, 69, 128, 83, 65, 68, 72, 197, 83, 65, 68, 69, 128, 83, 65, - 68, 128, 83, 65, 196, 83, 65, 67, 82, 73, 70, 73, 67, 73, 65, 204, 83, - 65, 65, 73, 128, 83, 65, 65, 68, 72, 85, 128, 83, 65, 45, 73, 128, 83, - 65, 45, 56, 128, 83, 65, 45, 55, 128, 83, 65, 45, 54, 128, 83, 65, 45, - 53, 128, 83, 65, 45, 52, 128, 83, 65, 45, 51, 128, 83, 65, 45, 50, 128, - 83, 65, 45, 49, 128, 83, 48, 52, 54, 128, 83, 48, 52, 53, 128, 83, 48, - 52, 52, 128, 83, 48, 52, 51, 128, 83, 48, 52, 50, 128, 83, 48, 52, 49, - 128, 83, 48, 52, 48, 128, 83, 48, 51, 57, 128, 83, 48, 51, 56, 128, 83, - 48, 51, 55, 128, 83, 48, 51, 54, 128, 83, 48, 51, 53, 65, 128, 83, 48, - 51, 53, 128, 83, 48, 51, 52, 128, 83, 48, 51, 51, 128, 83, 48, 51, 50, - 128, 83, 48, 51, 49, 128, 83, 48, 51, 48, 128, 83, 48, 50, 57, 128, 83, - 48, 50, 56, 128, 83, 48, 50, 55, 128, 83, 48, 50, 54, 66, 128, 83, 48, - 50, 54, 65, 128, 83, 48, 50, 54, 128, 83, 48, 50, 53, 128, 83, 48, 50, - 52, 128, 83, 48, 50, 51, 128, 83, 48, 50, 50, 128, 83, 48, 50, 49, 128, - 83, 48, 50, 48, 128, 83, 48, 49, 57, 128, 83, 48, 49, 56, 128, 83, 48, - 49, 55, 65, 128, 83, 48, 49, 55, 128, 83, 48, 49, 54, 128, 83, 48, 49, - 53, 128, 83, 48, 49, 52, 66, 128, 83, 48, 49, 52, 65, 128, 83, 48, 49, - 52, 128, 83, 48, 49, 51, 128, 83, 48, 49, 50, 128, 83, 48, 49, 49, 128, - 83, 48, 49, 48, 128, 83, 48, 48, 57, 128, 83, 48, 48, 56, 128, 83, 48, - 48, 55, 128, 83, 48, 48, 54, 65, 128, 83, 48, 48, 54, 128, 83, 48, 48, - 53, 128, 83, 48, 48, 52, 128, 83, 48, 48, 51, 128, 83, 48, 48, 50, 65, - 128, 83, 48, 48, 50, 128, 83, 48, 48, 49, 128, 83, 45, 87, 128, 83, 45, - 83, 72, 65, 80, 69, 196, 82, 89, 89, 128, 82, 89, 88, 128, 82, 89, 84, - 128, 82, 89, 82, 88, 128, 82, 89, 82, 128, 82, 89, 80, 128, 82, 87, 79, - 79, 128, 82, 87, 79, 128, 82, 87, 73, 73, 128, 82, 87, 73, 128, 82, 87, - 69, 69, 128, 82, 87, 69, 128, 82, 87, 65, 72, 65, 128, 82, 87, 65, 65, - 128, 82, 87, 65, 128, 82, 85, 88, 128, 82, 85, 85, 66, 85, 82, 85, 128, - 82, 85, 85, 128, 82, 85, 84, 128, 82, 85, 83, 83, 73, 65, 206, 82, 85, - 83, 73, 128, 82, 85, 82, 88, 128, 82, 85, 82, 128, 82, 85, 80, 73, 73, - 128, 82, 85, 80, 69, 197, 82, 85, 80, 128, 82, 85, 79, 88, 128, 82, 85, - 79, 80, 128, 82, 85, 79, 128, 82, 85, 78, 79, 85, 84, 128, 82, 85, 78, - 78, 73, 78, 199, 82, 85, 78, 78, 69, 82, 128, 82, 85, 78, 73, 195, 82, - 85, 78, 128, 82, 85, 77, 201, 82, 85, 77, 65, 201, 82, 85, 77, 128, 82, - 85, 205, 82, 85, 76, 69, 82, 128, 82, 85, 76, 69, 45, 68, 69, 76, 65, 89, - 69, 68, 128, 82, 85, 76, 69, 128, 82, 85, 76, 65, 73, 128, 82, 85, 75, - 75, 65, 75, 72, 65, 128, 82, 85, 73, 83, 128, 82, 85, 71, 66, 217, 82, - 85, 68, 73, 77, 69, 78, 84, 193, 82, 85, 66, 76, 197, 82, 85, 194, 82, - 85, 65, 128, 82, 85, 45, 54, 128, 82, 85, 45, 53, 128, 82, 85, 45, 52, - 128, 82, 85, 45, 51, 128, 82, 85, 45, 50, 128, 82, 85, 45, 49, 128, 82, - 84, 72, 65, 78, 199, 82, 84, 69, 128, 82, 84, 65, 71, 83, 128, 82, 84, - 65, 71, 211, 82, 82, 89, 88, 128, 82, 82, 89, 84, 128, 82, 82, 89, 82, - 88, 128, 82, 82, 89, 82, 128, 82, 82, 89, 80, 128, 82, 82, 85, 88, 128, - 82, 82, 85, 85, 128, 82, 82, 85, 84, 128, 82, 82, 85, 82, 88, 128, 82, - 82, 85, 82, 128, 82, 82, 85, 80, 128, 82, 82, 85, 79, 88, 128, 82, 82, - 85, 79, 128, 82, 82, 85, 128, 82, 82, 82, 65, 128, 82, 82, 79, 88, 128, - 82, 82, 79, 84, 128, 82, 82, 79, 80, 128, 82, 82, 79, 79, 128, 82, 82, - 79, 128, 82, 82, 73, 73, 128, 82, 82, 73, 128, 82, 82, 69, 88, 128, 82, - 82, 69, 84, 128, 82, 82, 69, 80, 128, 82, 82, 69, 72, 128, 82, 82, 69, - 200, 82, 82, 69, 69, 128, 82, 82, 69, 128, 82, 82, 65, 88, 128, 82, 82, - 65, 85, 128, 82, 82, 65, 73, 128, 82, 82, 65, 65, 128, 82, 79, 87, 66, - 79, 65, 84, 128, 82, 79, 85, 78, 68, 69, 196, 82, 79, 85, 78, 68, 45, 84, - 73, 80, 80, 69, 196, 82, 79, 84, 85, 78, 68, 65, 128, 82, 79, 84, 65, 84, - 73, 79, 78, 83, 128, 82, 79, 84, 65, 84, 73, 79, 78, 45, 87, 65, 76, 76, - 80, 76, 65, 78, 197, 82, 79, 84, 65, 84, 73, 79, 78, 45, 70, 76, 79, 79, - 82, 80, 76, 65, 78, 197, 82, 79, 84, 65, 84, 73, 79, 78, 128, 82, 79, 84, - 65, 84, 73, 79, 206, 82, 79, 84, 65, 84, 69, 196, 82, 79, 83, 72, 128, - 82, 79, 83, 69, 84, 84, 69, 128, 82, 79, 83, 69, 128, 82, 79, 79, 84, - 128, 82, 79, 79, 83, 84, 69, 82, 128, 82, 79, 79, 77, 128, 82, 79, 79, - 75, 128, 82, 79, 79, 203, 82, 79, 79, 70, 128, 82, 79, 77, 65, 78, 73, - 65, 206, 82, 79, 77, 65, 206, 82, 79, 77, 128, 82, 79, 76, 76, 73, 78, - 199, 82, 79, 76, 76, 69, 210, 82, 79, 76, 76, 69, 68, 45, 85, 208, 82, - 79, 76, 204, 82, 79, 72, 73, 78, 71, 89, 193, 82, 79, 71, 128, 82, 79, - 196, 82, 79, 67, 75, 69, 84, 128, 82, 79, 67, 203, 82, 79, 67, 128, 82, - 79, 66, 79, 212, 82, 79, 66, 65, 84, 128, 82, 79, 65, 83, 84, 69, 196, - 82, 79, 65, 82, 128, 82, 79, 65, 128, 82, 79, 45, 54, 128, 82, 79, 45, - 53, 128, 82, 79, 45, 52, 128, 82, 79, 45, 51, 128, 82, 79, 45, 50, 128, - 82, 79, 45, 49, 128, 82, 78, 89, 73, 78, 199, 82, 78, 79, 79, 78, 128, - 82, 78, 79, 79, 206, 82, 78, 65, 205, 82, 77, 84, 128, 82, 76, 79, 128, - 82, 76, 77, 128, 82, 76, 73, 128, 82, 76, 69, 128, 82, 74, 69, 211, 82, - 74, 69, 128, 82, 74, 197, 82, 73, 86, 69, 82, 128, 82, 73, 84, 85, 65, - 76, 128, 82, 73, 84, 84, 79, 82, 85, 128, 82, 73, 84, 83, 73, 128, 82, - 73, 83, 73, 78, 199, 82, 73, 83, 72, 128, 82, 73, 82, 65, 128, 82, 73, - 80, 80, 76, 197, 82, 73, 80, 128, 82, 73, 78, 71, 211, 82, 73, 78, 71, - 73, 78, 199, 82, 73, 78, 71, 69, 196, 82, 73, 78, 70, 79, 82, 90, 65, 78, - 68, 79, 128, 82, 73, 206, 82, 73, 77, 71, 66, 65, 128, 82, 73, 77, 128, - 82, 73, 75, 82, 73, 75, 128, 82, 73, 71, 86, 69, 68, 73, 195, 82, 73, 71, - 72, 84, 87, 65, 82, 68, 83, 128, 82, 73, 71, 72, 84, 72, 65, 78, 196, 82, - 73, 71, 72, 84, 45, 84, 79, 45, 76, 69, 70, 212, 82, 73, 71, 72, 84, 45, - 83, 73, 68, 197, 82, 73, 71, 72, 84, 45, 83, 72, 65, 68, 79, 87, 69, 196, - 82, 73, 71, 72, 84, 45, 83, 72, 65, 68, 69, 196, 82, 73, 71, 72, 84, 45, - 80, 79, 73, 78, 84, 73, 78, 199, 82, 73, 71, 72, 84, 45, 76, 73, 71, 72, - 84, 69, 196, 82, 73, 71, 72, 84, 45, 72, 65, 78, 68, 69, 196, 82, 73, 71, - 72, 84, 45, 72, 65, 78, 196, 82, 73, 71, 72, 84, 45, 70, 65, 67, 73, 78, - 199, 82, 73, 71, 72, 84, 128, 82, 73, 70, 76, 69, 128, 82, 73, 69, 85, - 76, 45, 89, 69, 83, 73, 69, 85, 78, 71, 128, 82, 73, 69, 85, 76, 45, 89, - 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 45, 72, 73, 69, 85, 72, 128, 82, - 73, 69, 85, 76, 45, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, 82, - 73, 69, 85, 76, 45, 84, 73, 75, 69, 85, 84, 45, 72, 73, 69, 85, 72, 128, - 82, 73, 69, 85, 76, 45, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, - 45, 84, 72, 73, 69, 85, 84, 72, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, - 78, 71, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, - 78, 71, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, - 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 75, - 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, 83, 73, 79, 83, 128, 82, - 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 84, 73, 75, 69, 85, 84, 128, - 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 128, 82, - 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 80, 72, 73, 69, 85, 80, 72, - 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 72, 73, 69, 85, 72, - 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, 76, - 45, 80, 72, 73, 69, 85, 80, 72, 128, 82, 73, 69, 85, 76, 45, 80, 65, 78, - 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 78, 73, 69, 85, 78, 128, 82, - 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 83, 73, 79, 83, 128, 82, 73, - 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 75, 73, 89, 69, 79, 75, 128, 82, - 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 72, 73, 69, 85, 72, 128, 82, - 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 128, 82, 73, 69, 85, 76, 45, 75, - 73, 89, 69, 79, 75, 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 75, - 73, 89, 69, 79, 75, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, - 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, 75, 65, 80, 89, 69, - 79, 85, 78, 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, 76, 45, 72, 73, 69, - 85, 72, 128, 82, 73, 69, 85, 76, 45, 67, 73, 69, 85, 67, 128, 82, 73, 69, - 85, 204, 82, 73, 69, 76, 128, 82, 73, 69, 69, 128, 82, 73, 67, 75, 83, - 72, 65, 87, 128, 82, 73, 67, 69, 77, 128, 82, 73, 67, 69, 128, 82, 73, - 67, 197, 82, 73, 66, 66, 79, 78, 128, 82, 73, 66, 66, 79, 206, 82, 73, - 65, 204, 82, 73, 45, 55, 128, 82, 73, 45, 54, 128, 82, 73, 45, 53, 128, - 82, 73, 45, 52, 128, 82, 73, 45, 51, 128, 82, 73, 45, 50, 128, 82, 73, - 45, 49, 128, 82, 72, 79, 84, 73, 195, 82, 72, 79, 128, 82, 72, 207, 82, - 72, 73, 78, 79, 67, 69, 82, 79, 83, 128, 82, 72, 65, 128, 82, 72, 128, - 82, 71, 89, 73, 78, 71, 83, 128, 82, 71, 89, 65, 78, 128, 82, 71, 89, - 193, 82, 69, 86, 79, 76, 86, 73, 78, 199, 82, 69, 86, 79, 76, 85, 84, 73, - 79, 78, 128, 82, 69, 86, 77, 65, 128, 82, 69, 86, 73, 65, 128, 82, 69, - 86, 69, 82, 83, 69, 68, 45, 83, 67, 72, 87, 65, 128, 82, 69, 86, 69, 82, - 83, 69, 68, 128, 82, 69, 86, 69, 82, 83, 69, 196, 82, 69, 86, 69, 82, 83, - 197, 82, 69, 85, 88, 128, 82, 69, 85, 128, 82, 69, 84, 85, 82, 78, 128, - 82, 69, 84, 85, 82, 206, 82, 69, 84, 82, 79, 70, 76, 69, 216, 82, 69, 84, - 82, 69, 65, 84, 128, 82, 69, 84, 79, 82, 84, 128, 82, 69, 83, 85, 80, 73, - 78, 85, 83, 128, 82, 69, 83, 84, 82, 79, 79, 77, 128, 82, 69, 83, 84, 82, - 73, 67, 84, 69, 196, 82, 69, 83, 84, 128, 82, 69, 83, 80, 79, 78, 83, 69, - 128, 82, 69, 83, 79, 85, 82, 67, 69, 128, 82, 69, 83, 79, 76, 85, 84, 73, - 79, 78, 128, 82, 69, 83, 73, 83, 84, 65, 78, 67, 69, 128, 82, 69, 83, 73, - 68, 69, 78, 67, 69, 128, 82, 69, 83, 72, 45, 65, 89, 73, 78, 45, 68, 65, - 76, 69, 84, 72, 128, 82, 69, 83, 72, 45, 65, 89, 73, 78, 128, 82, 69, 83, - 200, 82, 69, 82, 69, 78, 71, 71, 65, 78, 128, 82, 69, 82, 69, 75, 65, 78, - 128, 82, 69, 80, 82, 69, 83, 69, 78, 84, 128, 82, 69, 80, 76, 65, 67, 69, - 77, 69, 78, 212, 82, 69, 80, 72, 65, 128, 82, 69, 80, 72, 128, 82, 69, - 80, 69, 84, 73, 84, 73, 79, 206, 82, 69, 80, 69, 65, 84, 69, 196, 82, 69, - 80, 69, 65, 84, 128, 82, 69, 80, 69, 65, 212, 82, 69, 80, 65, 89, 65, - 128, 82, 69, 80, 65, 128, 82, 69, 80, 193, 82, 69, 78, 84, 79, 71, 69, - 78, 128, 82, 69, 78, 128, 82, 69, 206, 82, 69, 77, 85, 128, 82, 69, 77, - 73, 78, 68, 69, 210, 82, 69, 77, 69, 68, 89, 128, 82, 69, 76, 73, 71, 73, - 79, 78, 128, 82, 69, 76, 73, 69, 86, 69, 196, 82, 69, 76, 69, 65, 83, 69, - 128, 82, 69, 76, 65, 88, 69, 68, 128, 82, 69, 76, 65, 84, 73, 79, 78, 65, - 204, 82, 69, 76, 65, 84, 73, 79, 78, 128, 82, 69, 76, 65, 65, 128, 82, - 69, 74, 65, 78, 199, 82, 69, 73, 87, 65, 128, 82, 69, 73, 196, 82, 69, - 73, 128, 82, 69, 71, 85, 76, 85, 83, 45, 52, 128, 82, 69, 71, 85, 76, 85, - 83, 45, 51, 128, 82, 69, 71, 85, 76, 85, 83, 45, 50, 128, 82, 69, 71, 85, - 76, 85, 83, 128, 82, 69, 71, 85, 76, 85, 211, 82, 69, 71, 73, 83, 84, 69, - 82, 69, 196, 82, 69, 71, 73, 79, 78, 65, 204, 82, 69, 71, 73, 65, 45, 50, - 128, 82, 69, 71, 73, 65, 128, 82, 69, 70, 79, 82, 77, 69, 196, 82, 69, - 70, 69, 82, 69, 78, 67, 197, 82, 69, 68, 85, 80, 76, 73, 67, 65, 84, 73, - 79, 78, 128, 82, 69, 67, 89, 67, 76, 73, 78, 199, 82, 69, 67, 89, 67, 76, - 69, 196, 82, 69, 67, 84, 73, 76, 73, 78, 69, 65, 210, 82, 69, 67, 84, 65, - 78, 71, 85, 76, 65, 210, 82, 69, 67, 84, 65, 78, 71, 76, 69, 128, 82, 69, - 67, 84, 65, 78, 71, 76, 197, 82, 69, 67, 82, 69, 65, 84, 73, 79, 78, 65, - 204, 82, 69, 67, 79, 82, 68, 73, 78, 199, 82, 69, 67, 79, 82, 68, 69, 82, - 128, 82, 69, 67, 79, 82, 68, 128, 82, 69, 67, 79, 82, 196, 82, 69, 67, - 73, 84, 65, 84, 73, 86, 197, 82, 69, 67, 69, 80, 84, 73, 86, 197, 82, 69, - 67, 69, 73, 86, 69, 82, 128, 82, 69, 67, 69, 73, 86, 69, 210, 82, 69, 67, - 69, 73, 80, 84, 128, 82, 69, 65, 76, 71, 65, 82, 45, 50, 128, 82, 69, 65, - 76, 71, 65, 82, 128, 82, 69, 65, 72, 77, 85, 75, 128, 82, 69, 65, 67, 72, - 128, 82, 69, 45, 52, 128, 82, 69, 45, 51, 128, 82, 69, 45, 50, 128, 82, - 69, 45, 49, 128, 82, 68, 207, 82, 68, 69, 204, 82, 66, 65, 83, 193, 82, - 65, 90, 79, 82, 128, 82, 65, 89, 83, 128, 82, 65, 89, 211, 82, 65, 89, - 65, 78, 78, 65, 128, 82, 65, 84, 73, 79, 128, 82, 65, 84, 72, 65, 128, - 82, 65, 84, 72, 193, 82, 65, 84, 65, 128, 82, 65, 84, 128, 82, 65, 83, - 87, 65, 68, 73, 128, 82, 65, 83, 79, 85, 204, 82, 65, 83, 72, 65, 128, - 82, 65, 81, 128, 82, 65, 80, 73, 83, 77, 65, 128, 82, 65, 78, 71, 197, - 82, 65, 78, 65, 128, 82, 65, 78, 128, 82, 65, 77, 211, 82, 65, 77, 66, - 65, 84, 128, 82, 65, 75, 72, 65, 78, 71, 128, 82, 65, 75, 65, 65, 82, 65, - 65, 78, 83, 65, 89, 65, 128, 82, 65, 73, 83, 73, 78, 199, 82, 65, 73, 83, - 69, 68, 128, 82, 65, 73, 83, 69, 196, 82, 65, 73, 78, 66, 79, 87, 128, - 82, 65, 73, 76, 87, 65, 89, 128, 82, 65, 73, 76, 87, 65, 217, 82, 65, 73, - 76, 128, 82, 65, 73, 68, 207, 82, 65, 73, 68, 65, 128, 82, 65, 72, 77, - 65, 84, 85, 76, 76, 65, 200, 82, 65, 72, 128, 82, 65, 70, 69, 128, 82, - 65, 69, 77, 128, 82, 65, 68, 73, 79, 65, 67, 84, 73, 86, 197, 82, 65, 68, - 73, 79, 128, 82, 65, 68, 73, 207, 82, 65, 68, 201, 82, 65, 68, 128, 82, - 65, 196, 82, 65, 67, 81, 85, 69, 212, 82, 65, 67, 73, 78, 71, 128, 82, - 65, 67, 73, 78, 199, 82, 65, 67, 67, 79, 79, 78, 128, 82, 65, 66, 66, 73, - 84, 128, 82, 65, 66, 66, 73, 212, 82, 65, 66, 128, 82, 65, 65, 73, 128, - 82, 65, 51, 128, 82, 65, 50, 128, 82, 65, 45, 75, 65, 82, 65, 128, 82, - 65, 45, 52, 128, 82, 65, 45, 51, 128, 82, 65, 45, 50, 128, 82, 65, 45, - 49, 128, 82, 48, 50, 57, 128, 82, 48, 50, 56, 128, 82, 48, 50, 55, 128, - 82, 48, 50, 54, 128, 82, 48, 50, 53, 128, 82, 48, 50, 52, 128, 82, 48, - 50, 51, 128, 82, 48, 50, 50, 128, 82, 48, 50, 49, 128, 82, 48, 50, 48, - 128, 82, 48, 49, 57, 128, 82, 48, 49, 56, 128, 82, 48, 49, 55, 128, 82, - 48, 49, 54, 65, 128, 82, 48, 49, 54, 128, 82, 48, 49, 53, 128, 82, 48, - 49, 52, 128, 82, 48, 49, 51, 128, 82, 48, 49, 50, 128, 82, 48, 49, 49, - 128, 82, 48, 49, 48, 65, 128, 82, 48, 49, 48, 128, 82, 48, 48, 57, 128, - 82, 48, 48, 56, 128, 82, 48, 48, 55, 128, 82, 48, 48, 54, 128, 82, 48, - 48, 53, 128, 82, 48, 48, 52, 128, 82, 48, 48, 51, 66, 128, 82, 48, 48, - 51, 65, 128, 82, 48, 48, 51, 128, 82, 48, 48, 50, 65, 128, 82, 48, 48, - 50, 128, 82, 48, 48, 49, 128, 82, 45, 67, 82, 69, 197, 81, 89, 88, 128, - 81, 89, 85, 128, 81, 89, 84, 128, 81, 89, 82, 88, 128, 81, 89, 82, 128, - 81, 89, 80, 128, 81, 89, 79, 128, 81, 89, 73, 128, 81, 89, 69, 69, 128, - 81, 89, 69, 128, 81, 89, 65, 65, 128, 81, 89, 65, 128, 81, 89, 128, 81, - 87, 73, 128, 81, 87, 69, 69, 128, 81, 87, 69, 128, 81, 87, 65, 65, 128, - 81, 87, 65, 128, 81, 85, 88, 128, 81, 85, 86, 128, 81, 85, 85, 86, 128, - 81, 85, 85, 128, 81, 85, 84, 128, 81, 85, 83, 72, 83, 72, 65, 89, 65, - 128, 81, 85, 82, 88, 128, 81, 85, 82, 128, 81, 85, 80, 128, 81, 85, 79, - 88, 128, 81, 85, 79, 84, 197, 81, 85, 79, 84, 65, 84, 73, 79, 206, 81, - 85, 79, 84, 128, 81, 85, 79, 80, 128, 81, 85, 79, 128, 81, 85, 75, 128, - 81, 85, 73, 78, 84, 73, 76, 69, 128, 81, 85, 73, 78, 84, 69, 83, 83, 69, - 78, 67, 69, 128, 81, 85, 73, 78, 68, 73, 67, 69, 83, 73, 77, 193, 81, 85, - 73, 78, 67, 85, 78, 88, 128, 81, 85, 73, 78, 65, 82, 73, 85, 211, 81, 85, - 73, 76, 212, 81, 85, 73, 76, 76, 128, 81, 85, 73, 67, 203, 81, 85, 73, - 128, 81, 85, 70, 128, 81, 85, 69, 83, 84, 73, 79, 78, 69, 196, 81, 85, - 69, 83, 84, 73, 79, 78, 128, 81, 85, 69, 83, 84, 73, 79, 206, 81, 85, 69, - 69, 78, 128, 81, 85, 69, 69, 206, 81, 85, 69, 128, 81, 85, 66, 85, 84, - 83, 128, 81, 85, 65, 84, 69, 82, 78, 73, 79, 206, 81, 85, 65, 82, 84, 69, - 82, 83, 128, 81, 85, 65, 82, 84, 69, 82, 211, 81, 85, 65, 82, 84, 69, 82, - 128, 81, 85, 65, 78, 84, 73, 84, 217, 81, 85, 65, 68, 82, 85, 80, 76, - 197, 81, 85, 65, 68, 82, 65, 78, 84, 128, 81, 85, 65, 68, 82, 65, 78, - 212, 81, 85, 65, 68, 67, 79, 76, 79, 78, 128, 81, 85, 65, 68, 128, 81, - 85, 65, 196, 81, 85, 65, 128, 81, 85, 128, 81, 208, 81, 79, 88, 128, 81, - 79, 84, 128, 81, 79, 80, 72, 128, 81, 79, 80, 65, 128, 81, 79, 80, 128, - 81, 79, 79, 128, 81, 79, 207, 81, 79, 70, 128, 81, 79, 198, 81, 79, 65, - 128, 81, 79, 128, 81, 78, 128, 81, 73, 88, 128, 81, 73, 84, 83, 65, 128, - 81, 73, 84, 128, 81, 73, 80, 128, 81, 73, 73, 128, 81, 73, 70, 128, 81, - 73, 69, 88, 128, 81, 73, 69, 84, 128, 81, 73, 69, 80, 128, 81, 73, 69, - 128, 81, 73, 128, 81, 72, 87, 73, 128, 81, 72, 87, 69, 69, 128, 81, 72, - 87, 69, 128, 81, 72, 87, 65, 65, 128, 81, 72, 87, 65, 128, 81, 72, 85, - 128, 81, 72, 79, 80, 72, 128, 81, 72, 79, 128, 81, 72, 73, 128, 81, 72, - 69, 69, 128, 81, 72, 69, 128, 81, 72, 65, 85, 128, 81, 72, 65, 65, 128, - 81, 72, 65, 128, 81, 71, 65, 128, 81, 69, 84, 65, 78, 65, 128, 81, 69, - 69, 128, 81, 69, 128, 81, 65, 89, 128, 81, 65, 85, 128, 81, 65, 84, 65, - 78, 128, 81, 65, 82, 78, 69, 217, 81, 65, 82, 128, 81, 65, 81, 128, 81, - 65, 80, 72, 128, 81, 65, 77, 65, 84, 83, 128, 81, 65, 77, 65, 84, 211, - 81, 65, 76, 193, 81, 65, 73, 82, 84, 72, 82, 65, 128, 81, 65, 73, 128, - 81, 65, 70, 128, 81, 65, 198, 81, 65, 68, 77, 65, 128, 81, 65, 65, 73, - 128, 81, 65, 65, 70, 85, 128, 81, 65, 65, 70, 128, 81, 48, 48, 55, 128, - 81, 48, 48, 54, 128, 81, 48, 48, 53, 128, 81, 48, 48, 52, 128, 81, 48, - 48, 51, 128, 81, 48, 48, 50, 128, 81, 48, 48, 49, 128, 80, 90, 128, 80, - 89, 88, 128, 80, 89, 84, 128, 80, 89, 82, 88, 128, 80, 89, 82, 128, 80, - 89, 80, 128, 80, 87, 79, 89, 128, 80, 87, 79, 79, 128, 80, 87, 79, 128, - 80, 87, 207, 80, 87, 73, 73, 128, 80, 87, 73, 128, 80, 87, 69, 69, 128, - 80, 87, 69, 128, 80, 87, 65, 65, 128, 80, 87, 128, 80, 86, 128, 80, 85, - 90, 90, 76, 197, 80, 85, 88, 128, 80, 85, 85, 84, 128, 80, 85, 85, 128, - 80, 85, 84, 82, 69, 70, 65, 67, 84, 73, 79, 78, 128, 80, 85, 84, 128, 80, - 85, 212, 80, 85, 83, 72, 80, 73, 78, 128, 80, 85, 83, 72, 80, 73, 75, 65, - 128, 80, 85, 83, 72, 73, 78, 199, 80, 85, 82, 88, 128, 80, 85, 82, 83, - 69, 128, 80, 85, 82, 80, 76, 197, 80, 85, 82, 78, 65, 77, 65, 128, 80, - 85, 82, 73, 84, 89, 128, 80, 85, 82, 73, 70, 89, 128, 80, 85, 82, 128, - 80, 85, 81, 128, 80, 85, 80, 128, 80, 85, 79, 88, 128, 80, 85, 79, 80, - 128, 80, 85, 79, 128, 80, 85, 78, 71, 65, 65, 77, 128, 80, 85, 78, 71, - 128, 80, 85, 78, 67, 84, 85, 211, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, - 78, 128, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, 206, 80, 85, 77, 80, - 128, 80, 85, 77, 128, 80, 85, 70, 70, 69, 68, 128, 80, 85, 69, 128, 80, - 85, 67, 75, 128, 80, 85, 66, 76, 73, 195, 80, 85, 194, 80, 85, 65, 81, - 128, 80, 85, 65, 69, 128, 80, 85, 65, 67, 72, 85, 197, 80, 85, 50, 128, - 80, 85, 49, 128, 80, 85, 128, 80, 84, 72, 65, 72, 193, 80, 84, 69, 128, - 80, 83, 73, 76, 201, 80, 83, 73, 70, 73, 83, 84, 79, 83, 89, 78, 65, 71, - 77, 65, 128, 80, 83, 73, 70, 73, 83, 84, 79, 80, 65, 82, 65, 75, 65, 76, - 69, 83, 77, 65, 128, 80, 83, 73, 70, 73, 83, 84, 79, 206, 80, 83, 73, 70, - 73, 83, 84, 79, 76, 89, 71, 73, 83, 77, 65, 128, 80, 83, 73, 128, 80, 83, - 65, 76, 84, 69, 210, 80, 83, 128, 80, 82, 79, 86, 69, 128, 80, 82, 79, - 84, 79, 86, 65, 82, 89, 211, 80, 82, 79, 84, 79, 211, 80, 82, 79, 84, 69, - 67, 84, 69, 196, 80, 82, 79, 83, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, - 128, 80, 82, 79, 83, 69, 82, 80, 73, 78, 65, 128, 80, 82, 79, 80, 79, 82, - 84, 73, 79, 78, 65, 204, 80, 82, 79, 80, 79, 82, 84, 73, 79, 78, 128, 80, - 82, 79, 80, 69, 82, 84, 217, 80, 82, 79, 80, 69, 76, 76, 69, 210, 80, 82, - 79, 79, 70, 128, 80, 82, 79, 76, 79, 78, 71, 69, 196, 80, 82, 79, 76, 65, - 84, 73, 79, 78, 197, 80, 82, 79, 74, 69, 67, 84, 79, 82, 128, 80, 82, 79, - 74, 69, 67, 84, 73, 86, 69, 128, 80, 82, 79, 74, 69, 67, 84, 73, 79, 78, - 128, 80, 82, 79, 72, 73, 66, 73, 84, 69, 196, 80, 82, 79, 71, 82, 69, 83, - 83, 128, 80, 82, 79, 71, 82, 65, 205, 80, 82, 79, 70, 79, 85, 78, 68, - 128, 80, 82, 79, 68, 85, 67, 84, 128, 80, 82, 79, 68, 85, 67, 212, 80, - 82, 79, 66, 73, 78, 199, 80, 82, 73, 86, 65, 84, 69, 128, 80, 82, 73, 86, - 65, 84, 197, 80, 82, 73, 86, 65, 67, 217, 80, 82, 73, 83, 72, 84, 72, 65, - 77, 65, 84, 82, 193, 80, 82, 73, 78, 84, 83, 128, 80, 82, 73, 78, 84, 69, - 82, 128, 80, 82, 73, 78, 84, 69, 210, 80, 82, 73, 78, 84, 128, 80, 82, - 73, 78, 212, 80, 82, 73, 78, 67, 69, 83, 83, 128, 80, 82, 73, 78, 67, 69, - 128, 80, 82, 73, 77, 69, 128, 80, 82, 73, 77, 197, 80, 82, 69, 86, 73, - 79, 85, 211, 80, 82, 69, 84, 90, 69, 76, 128, 80, 82, 69, 83, 83, 69, - 196, 80, 82, 69, 83, 69, 84, 128, 80, 82, 69, 83, 69, 78, 84, 65, 84, 73, - 79, 206, 80, 82, 69, 83, 67, 82, 73, 80, 84, 73, 79, 206, 80, 82, 69, 80, - 79, 78, 68, 69, 82, 65, 78, 67, 69, 128, 80, 82, 69, 78, 75, 72, 65, 128, - 80, 82, 69, 71, 78, 65, 78, 212, 80, 82, 69, 70, 73, 88, 69, 196, 80, 82, - 69, 70, 65, 67, 197, 80, 82, 69, 67, 73, 80, 73, 84, 65, 84, 69, 128, 80, - 82, 69, 67, 69, 68, 73, 78, 199, 80, 82, 69, 67, 69, 68, 69, 83, 128, 80, - 82, 69, 67, 69, 68, 69, 211, 80, 82, 69, 67, 69, 68, 69, 196, 80, 82, 69, - 67, 69, 68, 69, 128, 80, 82, 69, 67, 69, 68, 197, 80, 82, 65, 89, 69, - 210, 80, 82, 65, 77, 45, 80, 73, 73, 128, 80, 82, 65, 77, 45, 80, 73, - 201, 80, 82, 65, 77, 45, 77, 85, 79, 89, 128, 80, 82, 65, 77, 45, 77, 85, - 79, 217, 80, 82, 65, 77, 45, 66, 85, 79, 78, 128, 80, 82, 65, 77, 45, 66, - 85, 79, 206, 80, 82, 65, 77, 45, 66, 69, 73, 128, 80, 82, 65, 77, 45, 66, - 69, 201, 80, 82, 65, 77, 128, 80, 82, 65, 205, 80, 82, 128, 80, 80, 86, - 128, 80, 80, 77, 128, 80, 80, 65, 128, 80, 79, 89, 128, 80, 79, 88, 128, - 80, 79, 87, 69, 82, 211, 80, 79, 87, 69, 82, 128, 80, 79, 87, 69, 210, - 80, 79, 87, 68, 69, 82, 69, 196, 80, 79, 87, 68, 69, 82, 128, 80, 79, 85, - 78, 196, 80, 79, 85, 76, 84, 82, 217, 80, 79, 85, 67, 72, 128, 80, 79, - 84, 65, 84, 79, 128, 80, 79, 84, 65, 66, 76, 197, 80, 79, 212, 80, 79, - 83, 84, 80, 79, 83, 73, 84, 73, 79, 206, 80, 79, 83, 84, 66, 79, 88, 128, - 80, 79, 83, 84, 65, 204, 80, 79, 83, 84, 128, 80, 79, 83, 212, 80, 79, - 83, 83, 69, 83, 83, 73, 79, 78, 128, 80, 79, 83, 83, 69, 83, 83, 73, 79, - 206, 80, 79, 83, 73, 84, 73, 79, 78, 83, 128, 80, 79, 83, 73, 84, 73, 79, - 78, 128, 80, 79, 83, 69, 73, 68, 79, 78, 128, 80, 79, 82, 84, 65, 66, 76, - 197, 80, 79, 82, 82, 69, 67, 84, 85, 83, 128, 80, 79, 82, 82, 69, 67, 84, - 85, 211, 80, 79, 80, 80, 73, 78, 199, 80, 79, 80, 80, 69, 82, 128, 80, - 79, 80, 67, 79, 82, 78, 128, 80, 79, 80, 128, 80, 79, 208, 80, 79, 79, - 68, 76, 69, 128, 80, 79, 79, 128, 80, 79, 78, 68, 79, 128, 80, 79, 206, - 80, 79, 77, 77, 69, 69, 128, 80, 79, 77, 77, 69, 197, 80, 79, 76, 79, - 128, 80, 79, 76, 73, 83, 72, 128, 80, 79, 76, 73, 67, 197, 80, 79, 76, - 201, 80, 79, 76, 69, 128, 80, 79, 76, 197, 80, 79, 75, 82, 89, 84, 73, - 69, 128, 80, 79, 75, 79, 74, 73, 128, 80, 79, 73, 78, 84, 211, 80, 79, - 73, 78, 84, 79, 128, 80, 79, 73, 78, 84, 69, 82, 128, 80, 79, 73, 78, 84, - 69, 196, 80, 79, 73, 78, 84, 128, 80, 79, 73, 78, 212, 80, 79, 69, 84, - 82, 217, 80, 79, 69, 84, 73, 195, 80, 79, 68, 65, 84, 85, 83, 128, 80, - 79, 67, 75, 69, 212, 80, 79, 65, 128, 80, 79, 128, 80, 207, 80, 78, 69, - 85, 77, 65, 84, 65, 128, 80, 76, 85, 84, 207, 80, 76, 85, 84, 65, 128, - 80, 76, 85, 83, 45, 77, 73, 78, 85, 211, 80, 76, 85, 83, 128, 80, 76, 85, - 82, 65, 76, 128, 80, 76, 85, 77, 69, 196, 80, 76, 85, 77, 128, 80, 76, - 85, 75, 128, 80, 76, 85, 71, 128, 80, 76, 85, 128, 80, 76, 79, 87, 128, - 80, 76, 79, 80, 72, 85, 128, 80, 76, 72, 65, 85, 128, 80, 76, 69, 84, 72, - 82, 79, 78, 128, 80, 76, 69, 65, 68, 73, 78, 199, 80, 76, 68, 128, 80, - 76, 65, 89, 73, 78, 199, 80, 76, 65, 84, 69, 128, 80, 76, 65, 83, 84, 73, - 67, 83, 128, 80, 76, 65, 78, 69, 84, 128, 80, 76, 65, 78, 69, 128, 80, - 76, 65, 78, 67, 203, 80, 76, 65, 75, 128, 80, 76, 65, 71, 73, 79, 211, - 80, 76, 65, 67, 69, 72, 79, 76, 68, 69, 82, 128, 80, 76, 65, 67, 69, 72, - 79, 76, 68, 69, 210, 80, 76, 65, 67, 197, 80, 76, 65, 128, 80, 73, 90, - 90, 73, 67, 65, 84, 79, 128, 80, 73, 90, 90, 65, 128, 80, 73, 88, 128, - 80, 73, 87, 82, 128, 80, 73, 84, 67, 72, 70, 79, 82, 75, 128, 80, 73, 84, - 67, 72, 70, 79, 82, 203, 80, 73, 84, 128, 80, 73, 83, 84, 79, 76, 128, - 80, 73, 83, 69, 76, 69, 72, 128, 80, 73, 83, 67, 69, 83, 128, 80, 73, 82, - 73, 71, 128, 80, 73, 82, 73, 199, 80, 73, 82, 73, 69, 69, 78, 128, 80, - 73, 82, 65, 67, 89, 128, 80, 73, 82, 50, 128, 80, 73, 80, 73, 78, 71, - 128, 80, 73, 80, 65, 69, 77, 71, 66, 73, 69, 69, 128, 80, 73, 80, 65, 69, - 77, 66, 65, 128, 80, 73, 80, 128, 80, 73, 78, 87, 72, 69, 69, 204, 80, - 73, 78, 69, 65, 80, 80, 76, 69, 128, 80, 73, 78, 197, 80, 73, 78, 67, 72, - 73, 78, 199, 80, 73, 78, 65, 82, 66, 79, 82, 65, 83, 128, 80, 73, 76, 76, - 128, 80, 73, 76, 197, 80, 73, 76, 67, 82, 79, 215, 80, 73, 75, 85, 82, - 85, 128, 80, 73, 75, 79, 128, 80, 73, 71, 128, 80, 73, 199, 80, 73, 69, - 88, 128, 80, 73, 69, 85, 80, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, - 69, 85, 80, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 80, 73, 69, 85, - 80, 45, 83, 73, 79, 83, 45, 84, 73, 75, 69, 85, 84, 128, 80, 73, 69, 85, - 80, 45, 83, 73, 79, 83, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, - 85, 80, 45, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 80, 73, 69, 85, - 80, 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 80, 73, 69, 85, - 80, 45, 83, 73, 79, 83, 45, 67, 73, 69, 85, 67, 128, 80, 73, 69, 85, 80, - 45, 82, 73, 69, 85, 76, 45, 80, 72, 73, 69, 85, 80, 72, 128, 80, 73, 69, - 85, 80, 45, 82, 73, 69, 85, 76, 128, 80, 73, 69, 85, 80, 45, 78, 73, 69, - 85, 78, 128, 80, 73, 69, 85, 80, 45, 77, 73, 69, 85, 77, 128, 80, 73, 69, - 85, 80, 45, 75, 72, 73, 69, 85, 75, 72, 128, 80, 73, 69, 85, 80, 45, 67, - 73, 69, 85, 67, 128, 80, 73, 69, 85, 80, 45, 67, 72, 73, 69, 85, 67, 72, - 128, 80, 73, 69, 85, 208, 80, 73, 69, 84, 128, 80, 73, 69, 80, 128, 80, - 73, 69, 69, 84, 128, 80, 73, 69, 69, 81, 128, 80, 73, 69, 67, 69, 128, - 80, 73, 69, 128, 80, 73, 67, 84, 85, 82, 69, 128, 80, 73, 67, 75, 69, 84, - 128, 80, 73, 67, 75, 128, 80, 73, 65, 83, 85, 84, 79, 82, 85, 128, 80, - 73, 65, 83, 77, 193, 80, 73, 65, 78, 79, 128, 80, 201, 80, 72, 87, 65, - 128, 80, 72, 85, 84, 72, 65, 79, 128, 80, 72, 85, 210, 80, 72, 85, 78, - 71, 128, 80, 72, 82, 65, 83, 69, 128, 80, 72, 79, 78, 69, 83, 128, 80, - 72, 79, 76, 85, 83, 128, 80, 72, 79, 69, 78, 73, 67, 73, 65, 206, 80, 72, - 79, 65, 128, 80, 72, 79, 128, 80, 72, 207, 80, 72, 78, 65, 69, 203, 80, - 72, 73, 78, 84, 72, 85, 128, 80, 72, 73, 76, 79, 83, 79, 80, 72, 69, 82, - 211, 80, 72, 73, 76, 73, 80, 80, 73, 78, 197, 80, 72, 73, 69, 85, 80, 72, - 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 72, 73, 69, 85, 80, 72, 45, 83, - 73, 79, 83, 128, 80, 72, 73, 69, 85, 80, 72, 45, 80, 73, 69, 85, 80, 128, - 80, 72, 73, 69, 85, 80, 72, 45, 72, 73, 69, 85, 72, 128, 80, 72, 73, 69, - 85, 80, 200, 80, 72, 73, 128, 80, 72, 201, 80, 72, 69, 69, 128, 80, 72, - 69, 128, 80, 72, 65, 83, 69, 45, 198, 80, 72, 65, 83, 69, 45, 194, 80, - 72, 65, 83, 69, 45, 193, 80, 72, 65, 82, 89, 78, 71, 69, 65, 204, 80, 72, - 65, 82, 128, 80, 72, 65, 78, 128, 80, 72, 65, 77, 128, 80, 72, 65, 73, - 83, 84, 79, 211, 80, 72, 65, 71, 83, 45, 80, 193, 80, 72, 65, 66, 128, - 80, 72, 65, 65, 82, 75, 65, 65, 128, 80, 72, 65, 65, 128, 80, 71, 128, - 80, 70, 128, 80, 69, 85, 88, 128, 80, 69, 85, 84, 65, 69, 128, 80, 69, - 85, 84, 128, 80, 69, 84, 82, 201, 80, 69, 84, 65, 83, 84, 79, 75, 79, 85, - 70, 73, 83, 77, 65, 128, 80, 69, 84, 65, 83, 84, 73, 128, 80, 69, 84, 65, - 83, 77, 65, 128, 80, 69, 84, 65, 76, 76, 69, 196, 80, 69, 83, 79, 128, - 80, 69, 83, 207, 80, 69, 83, 72, 50, 128, 80, 69, 83, 72, 178, 80, 69, - 83, 69, 84, 193, 80, 69, 211, 80, 69, 82, 84, 72, 207, 80, 69, 82, 83, - 80, 69, 67, 84, 73, 86, 69, 128, 80, 69, 82, 83, 79, 78, 65, 204, 80, 69, - 82, 83, 79, 78, 128, 80, 69, 82, 83, 79, 206, 80, 69, 82, 83, 73, 65, + 71, 79, 76, 128, 83, 69, 71, 78, 79, 128, 83, 69, 71, 77, 69, 78, 84, 69, + 196, 83, 69, 71, 77, 69, 78, 84, 128, 83, 69, 69, 86, 128, 83, 69, 69, + 78, 85, 128, 83, 69, 69, 78, 128, 83, 69, 69, 206, 83, 69, 69, 68, 76, + 73, 78, 71, 128, 83, 69, 69, 45, 78, 79, 45, 69, 86, 73, 204, 83, 69, 68, + 78, 65, 128, 83, 69, 67, 84, 79, 82, 128, 83, 69, 67, 84, 73, 79, 78, + 128, 83, 69, 67, 84, 73, 79, 206, 83, 69, 67, 82, 69, 84, 128, 83, 69, + 67, 65, 78, 84, 128, 83, 69, 66, 65, 84, 66, 69, 73, 212, 83, 69, 65, 84, + 128, 83, 69, 65, 76, 128, 83, 69, 65, 71, 85, 76, 204, 83, 69, 45, 53, + 128, 83, 69, 45, 52, 128, 83, 69, 45, 51, 128, 83, 68, 79, 78, 199, 83, + 68, 128, 83, 67, 87, 65, 128, 83, 67, 82, 85, 80, 76, 69, 128, 83, 67, + 82, 79, 76, 76, 128, 83, 67, 82, 73, 80, 84, 128, 83, 67, 82, 69, 87, 68, + 82, 73, 86, 69, 82, 128, 83, 67, 82, 69, 69, 78, 128, 83, 67, 82, 69, 69, + 206, 83, 67, 82, 69, 65, 77, 73, 78, 199, 83, 67, 79, 82, 80, 73, 85, 83, + 128, 83, 67, 79, 82, 80, 73, 79, 78, 128, 83, 67, 79, 82, 69, 128, 83, + 67, 79, 79, 84, 69, 82, 128, 83, 67, 73, 83, 83, 79, 82, 83, 128, 83, 67, + 73, 128, 83, 67, 72, 87, 65, 128, 83, 67, 72, 87, 193, 83, 67, 72, 82, + 79, 69, 68, 69, 82, 128, 83, 67, 72, 79, 79, 76, 128, 83, 67, 72, 79, 79, + 204, 83, 67, 72, 79, 76, 65, 82, 128, 83, 67, 72, 69, 77, 193, 83, 67, + 69, 80, 84, 69, 210, 83, 67, 65, 82, 70, 128, 83, 67, 65, 78, 68, 73, 67, + 85, 83, 128, 83, 67, 65, 78, 68, 73, 67, 85, 211, 83, 67, 65, 206, 83, + 67, 65, 76, 69, 83, 128, 83, 66, 85, 194, 83, 66, 82, 85, 204, 83, 65, + 89, 73, 83, 201, 83, 65, 89, 65, 78, 78, 65, 128, 83, 65, 89, 128, 83, + 65, 88, 79, 80, 72, 79, 78, 69, 128, 83, 65, 88, 73, 77, 65, 84, 65, 128, + 83, 65, 87, 65, 78, 128, 83, 65, 87, 128, 83, 65, 86, 79, 85, 82, 73, 78, + 199, 83, 65, 85, 82, 79, 80, 79, 68, 128, 83, 65, 85, 82, 65, 83, 72, 84, + 82, 193, 83, 65, 85, 73, 76, 128, 83, 65, 85, 67, 69, 82, 128, 83, 65, + 84, 85, 82, 78, 128, 83, 65, 84, 75, 65, 65, 78, 75, 85, 85, 128, 83, 65, + 84, 75, 65, 65, 78, 128, 83, 65, 84, 69, 76, 76, 73, 84, 69, 128, 83, 65, + 84, 69, 76, 76, 73, 84, 197, 83, 65, 84, 67, 72, 69, 76, 128, 83, 65, 84, + 65, 78, 71, 65, 128, 83, 65, 83, 72, 128, 83, 65, 83, 65, 75, 128, 83, + 65, 82, 73, 128, 83, 65, 82, 193, 83, 65, 82, 128, 83, 65, 81, 128, 83, + 65, 80, 65, 128, 83, 65, 78, 89, 79, 79, 71, 193, 83, 65, 78, 89, 65, 75, + 193, 83, 65, 78, 84, 73, 73, 77, 85, 128, 83, 65, 78, 83, 75, 82, 73, + 212, 83, 65, 78, 78, 89, 65, 128, 83, 65, 78, 71, 65, 50, 128, 83, 65, + 78, 68, 87, 73, 67, 72, 128, 83, 65, 78, 68, 72, 201, 83, 65, 78, 68, 65, + 76, 128, 83, 65, 78, 65, 72, 128, 83, 65, 78, 128, 83, 65, 77, 89, 79, + 203, 83, 65, 77, 86, 65, 84, 128, 83, 65, 77, 80, 73, 128, 83, 65, 77, + 80, 72, 65, 79, 128, 83, 65, 77, 75, 65, 128, 83, 65, 77, 69, 75, 72, + 128, 83, 65, 77, 69, 75, 200, 83, 65, 77, 66, 65, 128, 83, 65, 77, 65, + 82, 73, 84, 65, 206, 83, 65, 77, 128, 83, 65, 76, 84, 73, 82, 69, 128, + 83, 65, 76, 84, 73, 82, 197, 83, 65, 76, 84, 73, 76, 76, 79, 128, 83, 65, + 76, 84, 45, 50, 128, 83, 65, 76, 84, 128, 83, 65, 76, 212, 83, 65, 76, + 76, 65, 76, 76, 65, 72, 79, 213, 83, 65, 76, 76, 193, 83, 65, 76, 65, + 205, 83, 65, 76, 65, 68, 128, 83, 65, 76, 65, 128, 83, 65, 76, 45, 65, + 77, 77, 79, 78, 73, 65, 67, 128, 83, 65, 76, 128, 83, 65, 75, 84, 65, + 128, 83, 65, 75, 79, 84, 128, 83, 65, 75, 73, 78, 128, 83, 65, 75, 72, + 193, 83, 65, 75, 69, 85, 65, 69, 128, 83, 65, 75, 197, 83, 65, 74, 68, + 65, 72, 128, 83, 65, 73, 76, 66, 79, 65, 84, 128, 83, 65, 73, 76, 128, + 83, 65, 73, 75, 85, 82, 85, 128, 83, 65, 72, 128, 83, 65, 71, 73, 84, 84, + 65, 82, 73, 85, 83, 128, 83, 65, 71, 65, 128, 83, 65, 71, 128, 83, 65, + 199, 83, 65, 70, 72, 65, 128, 83, 65, 70, 69, 84, 217, 83, 65, 68, 72, + 69, 128, 83, 65, 68, 72, 197, 83, 65, 68, 69, 128, 83, 65, 68, 128, 83, + 65, 196, 83, 65, 67, 82, 73, 70, 73, 67, 73, 65, 204, 83, 65, 65, 73, + 128, 83, 65, 65, 68, 72, 85, 128, 83, 65, 45, 73, 128, 83, 65, 45, 56, + 128, 83, 65, 45, 55, 128, 83, 65, 45, 54, 128, 83, 65, 45, 53, 128, 83, + 65, 45, 52, 128, 83, 65, 45, 51, 128, 83, 65, 45, 50, 128, 83, 65, 45, + 49, 128, 83, 48, 52, 54, 128, 83, 48, 52, 53, 128, 83, 48, 52, 52, 128, + 83, 48, 52, 51, 128, 83, 48, 52, 50, 128, 83, 48, 52, 49, 128, 83, 48, + 52, 48, 128, 83, 48, 51, 57, 128, 83, 48, 51, 56, 128, 83, 48, 51, 55, + 128, 83, 48, 51, 54, 128, 83, 48, 51, 53, 65, 128, 83, 48, 51, 53, 128, + 83, 48, 51, 52, 128, 83, 48, 51, 51, 128, 83, 48, 51, 50, 128, 83, 48, + 51, 49, 128, 83, 48, 51, 48, 128, 83, 48, 50, 57, 128, 83, 48, 50, 56, + 128, 83, 48, 50, 55, 128, 83, 48, 50, 54, 66, 128, 83, 48, 50, 54, 65, + 128, 83, 48, 50, 54, 128, 83, 48, 50, 53, 128, 83, 48, 50, 52, 128, 83, + 48, 50, 51, 128, 83, 48, 50, 50, 128, 83, 48, 50, 49, 128, 83, 48, 50, + 48, 128, 83, 48, 49, 57, 128, 83, 48, 49, 56, 128, 83, 48, 49, 55, 65, + 128, 83, 48, 49, 55, 128, 83, 48, 49, 54, 128, 83, 48, 49, 53, 128, 83, + 48, 49, 52, 66, 128, 83, 48, 49, 52, 65, 128, 83, 48, 49, 52, 128, 83, + 48, 49, 51, 128, 83, 48, 49, 50, 128, 83, 48, 49, 49, 128, 83, 48, 49, + 48, 128, 83, 48, 48, 57, 128, 83, 48, 48, 56, 128, 83, 48, 48, 55, 128, + 83, 48, 48, 54, 65, 128, 83, 48, 48, 54, 128, 83, 48, 48, 53, 128, 83, + 48, 48, 52, 128, 83, 48, 48, 51, 128, 83, 48, 48, 50, 65, 128, 83, 48, + 48, 50, 128, 83, 48, 48, 49, 128, 83, 45, 87, 128, 83, 45, 83, 72, 65, + 80, 69, 196, 82, 89, 89, 128, 82, 89, 88, 128, 82, 89, 84, 128, 82, 89, + 82, 88, 128, 82, 89, 82, 128, 82, 89, 80, 128, 82, 87, 79, 79, 128, 82, + 87, 79, 128, 82, 87, 73, 73, 128, 82, 87, 73, 128, 82, 87, 69, 69, 128, + 82, 87, 69, 128, 82, 87, 65, 72, 65, 128, 82, 87, 65, 65, 128, 82, 87, + 65, 128, 82, 85, 88, 128, 82, 85, 85, 66, 85, 82, 85, 128, 82, 85, 85, + 128, 82, 85, 84, 128, 82, 85, 83, 83, 73, 65, 206, 82, 85, 83, 73, 128, + 82, 85, 82, 88, 128, 82, 85, 82, 128, 82, 85, 80, 73, 73, 128, 82, 85, + 80, 69, 197, 82, 85, 80, 128, 82, 85, 79, 88, 128, 82, 85, 79, 80, 128, + 82, 85, 79, 128, 82, 85, 78, 79, 85, 84, 128, 82, 85, 78, 78, 73, 78, + 199, 82, 85, 78, 78, 69, 82, 128, 82, 85, 78, 73, 195, 82, 85, 78, 128, + 82, 85, 77, 201, 82, 85, 77, 65, 201, 82, 85, 77, 128, 82, 85, 205, 82, + 85, 76, 69, 82, 128, 82, 85, 76, 69, 45, 68, 69, 76, 65, 89, 69, 68, 128, + 82, 85, 76, 69, 128, 82, 85, 76, 65, 73, 128, 82, 85, 75, 75, 65, 75, 72, + 65, 128, 82, 85, 73, 83, 128, 82, 85, 71, 66, 217, 82, 85, 68, 73, 77, + 69, 78, 84, 193, 82, 85, 66, 76, 197, 82, 85, 194, 82, 85, 65, 128, 82, + 85, 45, 54, 128, 82, 85, 45, 53, 128, 82, 85, 45, 52, 128, 82, 85, 45, + 51, 128, 82, 85, 45, 50, 128, 82, 85, 45, 49, 128, 82, 84, 72, 65, 78, + 199, 82, 84, 69, 128, 82, 84, 65, 71, 83, 128, 82, 84, 65, 71, 211, 82, + 82, 89, 88, 128, 82, 82, 89, 84, 128, 82, 82, 89, 82, 88, 128, 82, 82, + 89, 82, 128, 82, 82, 89, 80, 128, 82, 82, 85, 88, 128, 82, 82, 85, 85, + 128, 82, 82, 85, 84, 128, 82, 82, 85, 82, 88, 128, 82, 82, 85, 82, 128, + 82, 82, 85, 80, 128, 82, 82, 85, 79, 88, 128, 82, 82, 85, 79, 128, 82, + 82, 85, 128, 82, 82, 82, 65, 128, 82, 82, 79, 88, 128, 82, 82, 79, 84, + 128, 82, 82, 79, 80, 128, 82, 82, 79, 79, 128, 82, 82, 79, 128, 82, 82, + 73, 73, 128, 82, 82, 73, 128, 82, 82, 69, 88, 128, 82, 82, 69, 84, 128, + 82, 82, 69, 80, 128, 82, 82, 69, 72, 128, 82, 82, 69, 200, 82, 82, 69, + 69, 128, 82, 82, 69, 128, 82, 82, 65, 88, 128, 82, 82, 65, 85, 128, 82, + 82, 65, 73, 128, 82, 82, 65, 65, 128, 82, 79, 87, 66, 79, 65, 84, 128, + 82, 79, 85, 78, 68, 69, 196, 82, 79, 85, 78, 68, 45, 84, 73, 80, 80, 69, + 196, 82, 79, 84, 85, 78, 68, 65, 128, 82, 79, 84, 65, 84, 73, 79, 78, 83, + 128, 82, 79, 84, 65, 84, 73, 79, 78, 45, 87, 65, 76, 76, 80, 76, 65, 78, + 197, 82, 79, 84, 65, 84, 73, 79, 78, 45, 70, 76, 79, 79, 82, 80, 76, 65, + 78, 197, 82, 79, 84, 65, 84, 73, 79, 78, 128, 82, 79, 84, 65, 84, 73, 79, + 206, 82, 79, 84, 65, 84, 69, 196, 82, 79, 83, 72, 128, 82, 79, 83, 69, + 84, 84, 69, 128, 82, 79, 83, 69, 128, 82, 79, 79, 84, 128, 82, 79, 79, + 83, 84, 69, 82, 128, 82, 79, 79, 77, 128, 82, 79, 79, 75, 128, 82, 79, + 79, 203, 82, 79, 79, 70, 128, 82, 79, 77, 65, 78, 73, 65, 206, 82, 79, + 77, 65, 206, 82, 79, 77, 128, 82, 79, 76, 76, 73, 78, 199, 82, 79, 76, + 76, 69, 210, 82, 79, 76, 76, 69, 68, 45, 85, 208, 82, 79, 76, 204, 82, + 79, 72, 73, 78, 71, 89, 193, 82, 79, 71, 128, 82, 79, 196, 82, 79, 67, + 75, 69, 84, 128, 82, 79, 67, 203, 82, 79, 67, 128, 82, 79, 66, 79, 212, + 82, 79, 66, 65, 84, 128, 82, 79, 65, 83, 84, 69, 196, 82, 79, 65, 82, + 128, 82, 79, 65, 128, 82, 79, 45, 54, 128, 82, 79, 45, 53, 128, 82, 79, + 45, 52, 128, 82, 79, 45, 51, 128, 82, 79, 45, 50, 128, 82, 79, 45, 49, + 128, 82, 78, 89, 73, 78, 199, 82, 78, 79, 79, 78, 128, 82, 78, 79, 79, + 206, 82, 78, 65, 205, 82, 77, 84, 128, 82, 76, 79, 128, 82, 76, 77, 128, + 82, 76, 73, 128, 82, 76, 69, 128, 82, 74, 69, 211, 82, 74, 69, 128, 82, + 74, 197, 82, 73, 84, 85, 65, 76, 128, 82, 73, 84, 84, 79, 82, 85, 128, + 82, 73, 84, 83, 73, 128, 82, 73, 83, 73, 78, 199, 82, 73, 83, 72, 128, + 82, 73, 82, 65, 128, 82, 73, 80, 80, 76, 197, 82, 73, 80, 128, 82, 73, + 78, 71, 211, 82, 73, 78, 71, 73, 78, 199, 82, 73, 78, 71, 69, 196, 82, + 73, 78, 70, 79, 82, 90, 65, 78, 68, 79, 128, 82, 73, 206, 82, 73, 77, 71, + 66, 65, 128, 82, 73, 77, 128, 82, 73, 75, 82, 73, 75, 128, 82, 73, 71, + 86, 69, 68, 73, 195, 82, 73, 71, 72, 84, 87, 65, 82, 68, 83, 128, 82, 73, + 71, 72, 84, 72, 65, 78, 196, 82, 73, 71, 72, 84, 45, 84, 79, 45, 76, 69, + 70, 212, 82, 73, 71, 72, 84, 45, 83, 73, 68, 197, 82, 73, 71, 72, 84, 45, + 83, 72, 65, 68, 79, 87, 69, 196, 82, 73, 71, 72, 84, 45, 83, 72, 65, 68, + 69, 196, 82, 73, 71, 72, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 82, 73, + 71, 72, 84, 45, 76, 73, 71, 72, 84, 69, 196, 82, 73, 71, 72, 84, 45, 72, + 65, 78, 68, 69, 196, 82, 73, 71, 72, 84, 45, 72, 65, 78, 196, 82, 73, 71, + 72, 84, 45, 70, 65, 67, 73, 78, 199, 82, 73, 71, 72, 84, 128, 82, 73, 70, + 76, 69, 128, 82, 73, 69, 85, 76, 45, 89, 69, 83, 73, 69, 85, 78, 71, 128, + 82, 73, 69, 85, 76, 45, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 45, + 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 89, 69, 79, 82, 73, 78, + 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 84, 73, 75, 69, 85, 84, + 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 84, 73, 75, 69, 85, + 84, 128, 82, 73, 69, 85, 76, 45, 84, 72, 73, 69, 85, 84, 72, 128, 82, 73, + 69, 85, 76, 45, 83, 83, 65, 78, 71, 84, 73, 75, 69, 85, 84, 128, 82, 73, + 69, 85, 76, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 82, 73, 69, 85, + 76, 45, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, 76, + 45, 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, + 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, + 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, + 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, + 80, 72, 73, 69, 85, 80, 72, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, + 80, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, + 80, 128, 82, 73, 69, 85, 76, 45, 80, 72, 73, 69, 85, 80, 72, 128, 82, 73, + 69, 85, 76, 45, 80, 65, 78, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, + 78, 73, 69, 85, 78, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, + 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 75, + 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, + 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 128, + 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 45, 83, 73, 79, 83, 128, + 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 45, 72, 73, 69, 85, 72, + 128, 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, + 76, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, 82, 73, + 69, 85, 76, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 67, 73, + 69, 85, 67, 128, 82, 73, 69, 85, 204, 82, 73, 69, 76, 128, 82, 73, 69, + 69, 128, 82, 73, 67, 75, 83, 72, 65, 87, 128, 82, 73, 67, 69, 77, 128, + 82, 73, 67, 69, 128, 82, 73, 67, 197, 82, 73, 66, 66, 79, 78, 128, 82, + 73, 66, 66, 79, 206, 82, 73, 65, 204, 82, 73, 45, 55, 128, 82, 73, 45, + 54, 128, 82, 73, 45, 53, 128, 82, 73, 45, 52, 128, 82, 73, 45, 51, 128, + 82, 73, 45, 50, 128, 82, 73, 45, 49, 128, 82, 72, 79, 84, 73, 195, 82, + 72, 79, 128, 82, 72, 207, 82, 72, 73, 78, 79, 67, 69, 82, 79, 83, 128, + 82, 72, 65, 128, 82, 72, 128, 82, 71, 89, 73, 78, 71, 83, 128, 82, 71, + 89, 65, 78, 128, 82, 71, 89, 193, 82, 69, 86, 79, 76, 86, 73, 78, 199, + 82, 69, 86, 79, 76, 85, 84, 73, 79, 78, 128, 82, 69, 86, 77, 65, 128, 82, + 69, 86, 73, 65, 128, 82, 69, 86, 69, 82, 83, 69, 68, 45, 83, 67, 72, 87, + 65, 128, 82, 69, 86, 69, 82, 83, 69, 68, 128, 82, 69, 86, 69, 82, 83, 69, + 196, 82, 69, 86, 69, 82, 83, 197, 82, 69, 85, 88, 128, 82, 69, 85, 128, + 82, 69, 84, 85, 82, 78, 128, 82, 69, 84, 85, 82, 206, 82, 69, 84, 82, 79, + 70, 76, 69, 216, 82, 69, 84, 82, 69, 65, 84, 128, 82, 69, 84, 79, 82, 84, + 128, 82, 69, 83, 85, 80, 73, 78, 85, 83, 128, 82, 69, 83, 84, 82, 79, 79, + 77, 128, 82, 69, 83, 84, 82, 73, 67, 84, 69, 196, 82, 69, 83, 84, 128, + 82, 69, 83, 80, 79, 78, 83, 69, 128, 82, 69, 83, 79, 85, 82, 67, 69, 128, + 82, 69, 83, 79, 76, 85, 84, 73, 79, 78, 128, 82, 69, 83, 73, 83, 84, 65, + 78, 67, 69, 128, 82, 69, 83, 73, 68, 69, 78, 67, 69, 128, 82, 69, 83, 72, + 45, 65, 89, 73, 78, 45, 68, 65, 76, 69, 84, 72, 128, 82, 69, 83, 72, 45, + 65, 89, 73, 78, 128, 82, 69, 83, 200, 82, 69, 82, 69, 78, 71, 71, 65, 78, + 128, 82, 69, 82, 69, 75, 65, 78, 128, 82, 69, 80, 82, 69, 83, 69, 78, 84, + 128, 82, 69, 80, 76, 65, 67, 69, 77, 69, 78, 212, 82, 69, 80, 72, 65, + 128, 82, 69, 80, 72, 128, 82, 69, 80, 69, 84, 73, 84, 73, 79, 206, 82, + 69, 80, 69, 65, 84, 69, 196, 82, 69, 80, 69, 65, 84, 128, 82, 69, 80, 69, + 65, 212, 82, 69, 80, 65, 89, 65, 128, 82, 69, 80, 65, 128, 82, 69, 80, + 193, 82, 69, 78, 84, 79, 71, 69, 78, 128, 82, 69, 78, 128, 82, 69, 206, + 82, 69, 77, 85, 128, 82, 69, 77, 73, 78, 68, 69, 210, 82, 69, 77, 69, 68, + 89, 128, 82, 69, 76, 73, 71, 73, 79, 78, 128, 82, 69, 76, 73, 69, 86, 69, + 196, 82, 69, 76, 69, 65, 83, 69, 128, 82, 69, 76, 65, 88, 69, 68, 128, + 82, 69, 76, 65, 84, 73, 79, 78, 65, 204, 82, 69, 76, 65, 84, 73, 79, 78, + 128, 82, 69, 76, 65, 65, 128, 82, 69, 74, 65, 78, 199, 82, 69, 73, 87, + 65, 128, 82, 69, 73, 196, 82, 69, 73, 128, 82, 69, 71, 85, 76, 85, 83, + 45, 52, 128, 82, 69, 71, 85, 76, 85, 83, 45, 51, 128, 82, 69, 71, 85, 76, + 85, 83, 45, 50, 128, 82, 69, 71, 85, 76, 85, 83, 128, 82, 69, 71, 85, 76, + 85, 211, 82, 69, 71, 73, 83, 84, 69, 82, 69, 196, 82, 69, 71, 73, 79, 78, + 65, 204, 82, 69, 71, 73, 65, 45, 50, 128, 82, 69, 71, 73, 65, 128, 82, + 69, 70, 79, 82, 77, 69, 196, 82, 69, 70, 69, 82, 69, 78, 67, 197, 82, 69, + 68, 85, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 82, 69, 67, 89, 67, 76, + 73, 78, 199, 82, 69, 67, 89, 67, 76, 69, 196, 82, 69, 67, 84, 73, 76, 73, + 78, 69, 65, 210, 82, 69, 67, 84, 65, 78, 71, 85, 76, 65, 210, 82, 69, 67, + 84, 65, 78, 71, 76, 69, 128, 82, 69, 67, 84, 65, 78, 71, 76, 197, 82, 69, + 67, 82, 69, 65, 84, 73, 79, 78, 65, 204, 82, 69, 67, 79, 82, 68, 73, 78, + 199, 82, 69, 67, 79, 82, 68, 69, 82, 128, 82, 69, 67, 79, 82, 68, 128, + 82, 69, 67, 79, 82, 196, 82, 69, 67, 73, 84, 65, 84, 73, 86, 197, 82, 69, + 67, 69, 80, 84, 73, 86, 197, 82, 69, 67, 69, 73, 86, 69, 82, 128, 82, 69, + 67, 69, 73, 86, 69, 210, 82, 69, 67, 69, 73, 80, 84, 128, 82, 69, 65, 76, + 71, 65, 82, 45, 50, 128, 82, 69, 65, 76, 71, 65, 82, 128, 82, 69, 65, 72, + 77, 85, 75, 128, 82, 69, 65, 68, 73, 78, 199, 82, 69, 65, 67, 72, 128, + 82, 69, 45, 52, 128, 82, 69, 45, 51, 128, 82, 69, 45, 50, 128, 82, 69, + 45, 49, 128, 82, 68, 207, 82, 68, 69, 204, 82, 66, 65, 83, 193, 82, 65, + 90, 79, 82, 128, 82, 65, 89, 83, 128, 82, 65, 89, 211, 82, 65, 89, 65, + 78, 78, 65, 128, 82, 65, 84, 73, 79, 128, 82, 65, 84, 72, 65, 128, 82, + 65, 84, 72, 193, 82, 65, 84, 65, 128, 82, 65, 84, 128, 82, 65, 83, 87, + 65, 68, 73, 128, 82, 65, 83, 79, 85, 204, 82, 65, 83, 72, 65, 128, 82, + 65, 81, 128, 82, 65, 80, 73, 83, 77, 65, 128, 82, 65, 78, 71, 197, 82, + 65, 78, 65, 128, 82, 65, 78, 128, 82, 65, 77, 211, 82, 65, 77, 66, 65, + 84, 128, 82, 65, 75, 72, 65, 78, 71, 128, 82, 65, 75, 65, 65, 82, 65, 65, + 78, 83, 65, 89, 65, 128, 82, 65, 73, 83, 73, 78, 199, 82, 65, 73, 83, 69, + 68, 128, 82, 65, 73, 83, 69, 196, 82, 65, 73, 78, 66, 79, 87, 128, 82, + 65, 73, 76, 87, 65, 89, 128, 82, 65, 73, 76, 87, 65, 217, 82, 65, 73, 76, + 128, 82, 65, 73, 68, 207, 82, 65, 73, 68, 65, 128, 82, 65, 72, 77, 65, + 84, 85, 76, 76, 65, 200, 82, 65, 72, 128, 82, 65, 70, 69, 128, 82, 65, + 69, 77, 128, 82, 65, 68, 73, 79, 65, 67, 84, 73, 86, 197, 82, 65, 68, 73, + 79, 128, 82, 65, 68, 73, 207, 82, 65, 68, 201, 82, 65, 68, 128, 82, 65, + 196, 82, 65, 67, 81, 85, 69, 212, 82, 65, 67, 73, 78, 71, 128, 82, 65, + 67, 73, 78, 199, 82, 65, 67, 67, 79, 79, 78, 128, 82, 65, 66, 66, 73, 84, + 128, 82, 65, 66, 66, 73, 212, 82, 65, 66, 128, 82, 65, 65, 73, 128, 82, + 65, 51, 128, 82, 65, 50, 128, 82, 65, 45, 75, 65, 82, 65, 128, 82, 65, + 45, 52, 128, 82, 65, 45, 51, 128, 82, 65, 45, 50, 128, 82, 65, 45, 49, + 128, 82, 48, 50, 57, 128, 82, 48, 50, 56, 128, 82, 48, 50, 55, 128, 82, + 48, 50, 54, 128, 82, 48, 50, 53, 128, 82, 48, 50, 52, 128, 82, 48, 50, + 51, 128, 82, 48, 50, 50, 128, 82, 48, 50, 49, 128, 82, 48, 50, 48, 128, + 82, 48, 49, 57, 128, 82, 48, 49, 56, 128, 82, 48, 49, 55, 128, 82, 48, + 49, 54, 65, 128, 82, 48, 49, 54, 128, 82, 48, 49, 53, 128, 82, 48, 49, + 52, 128, 82, 48, 49, 51, 128, 82, 48, 49, 50, 128, 82, 48, 49, 49, 128, + 82, 48, 49, 48, 65, 128, 82, 48, 49, 48, 128, 82, 48, 48, 57, 128, 82, + 48, 48, 56, 128, 82, 48, 48, 55, 128, 82, 48, 48, 54, 128, 82, 48, 48, + 53, 128, 82, 48, 48, 52, 128, 82, 48, 48, 51, 66, 128, 82, 48, 48, 51, + 65, 128, 82, 48, 48, 51, 128, 82, 48, 48, 50, 65, 128, 82, 48, 48, 50, + 128, 82, 48, 48, 49, 128, 82, 45, 67, 82, 69, 197, 81, 89, 88, 128, 81, + 89, 85, 128, 81, 89, 84, 128, 81, 89, 82, 88, 128, 81, 89, 82, 128, 81, + 89, 80, 128, 81, 89, 79, 128, 81, 89, 73, 128, 81, 89, 69, 69, 128, 81, + 89, 69, 128, 81, 89, 65, 65, 128, 81, 89, 65, 128, 81, 89, 128, 81, 87, + 73, 128, 81, 87, 69, 69, 128, 81, 87, 69, 128, 81, 87, 65, 65, 128, 81, + 87, 65, 128, 81, 85, 88, 128, 81, 85, 86, 128, 81, 85, 85, 86, 128, 81, + 85, 85, 128, 81, 85, 84, 128, 81, 85, 83, 72, 83, 72, 65, 89, 65, 128, + 81, 85, 82, 88, 128, 81, 85, 82, 128, 81, 85, 80, 128, 81, 85, 79, 88, + 128, 81, 85, 79, 84, 197, 81, 85, 79, 84, 65, 84, 73, 79, 206, 81, 85, + 79, 84, 128, 81, 85, 79, 80, 128, 81, 85, 79, 128, 81, 85, 75, 128, 81, + 85, 73, 78, 84, 73, 76, 69, 128, 81, 85, 73, 78, 84, 69, 83, 83, 69, 78, + 67, 69, 128, 81, 85, 73, 78, 68, 73, 67, 69, 83, 73, 77, 193, 81, 85, 73, + 78, 67, 85, 78, 88, 128, 81, 85, 73, 78, 65, 82, 73, 85, 211, 81, 85, 73, + 76, 212, 81, 85, 73, 76, 76, 128, 81, 85, 73, 67, 203, 81, 85, 73, 128, + 81, 85, 70, 128, 81, 85, 69, 83, 84, 73, 79, 78, 69, 196, 81, 85, 69, 83, + 84, 73, 79, 78, 128, 81, 85, 69, 83, 84, 73, 79, 206, 81, 85, 69, 69, 78, + 128, 81, 85, 69, 69, 206, 81, 85, 69, 128, 81, 85, 66, 85, 84, 83, 128, + 81, 85, 65, 84, 69, 82, 78, 73, 79, 206, 81, 85, 65, 82, 84, 69, 82, 83, + 128, 81, 85, 65, 82, 84, 69, 82, 211, 81, 85, 65, 82, 84, 69, 82, 128, + 81, 85, 65, 78, 84, 73, 84, 217, 81, 85, 65, 68, 82, 85, 80, 76, 197, 81, + 85, 65, 68, 82, 65, 78, 84, 128, 81, 85, 65, 68, 82, 65, 78, 212, 81, 85, + 65, 68, 67, 79, 76, 79, 78, 128, 81, 85, 65, 68, 128, 81, 85, 65, 196, + 81, 85, 65, 128, 81, 85, 128, 81, 208, 81, 79, 88, 128, 81, 79, 84, 128, + 81, 79, 80, 72, 128, 81, 79, 80, 65, 128, 81, 79, 80, 128, 81, 79, 79, + 128, 81, 79, 207, 81, 79, 70, 128, 81, 79, 198, 81, 79, 65, 128, 81, 79, + 128, 81, 78, 128, 81, 73, 88, 128, 81, 73, 84, 83, 65, 128, 81, 73, 84, + 128, 81, 73, 80, 128, 81, 73, 73, 128, 81, 73, 70, 128, 81, 73, 69, 88, + 128, 81, 73, 69, 84, 128, 81, 73, 69, 80, 128, 81, 73, 69, 128, 81, 73, + 128, 81, 72, 87, 73, 128, 81, 72, 87, 69, 69, 128, 81, 72, 87, 69, 128, + 81, 72, 87, 65, 65, 128, 81, 72, 87, 65, 128, 81, 72, 85, 128, 81, 72, + 79, 80, 72, 128, 81, 72, 79, 128, 81, 72, 73, 128, 81, 72, 69, 69, 128, + 81, 72, 69, 128, 81, 72, 65, 85, 128, 81, 72, 65, 65, 128, 81, 72, 65, + 128, 81, 71, 65, 128, 81, 69, 84, 65, 78, 65, 128, 81, 69, 69, 128, 81, + 69, 128, 81, 65, 89, 128, 81, 65, 85, 128, 81, 65, 84, 65, 78, 128, 81, + 65, 82, 78, 69, 217, 81, 65, 82, 128, 81, 65, 81, 128, 81, 65, 80, 72, + 128, 81, 65, 77, 65, 84, 83, 128, 81, 65, 77, 65, 84, 211, 81, 65, 76, + 193, 81, 65, 73, 82, 84, 72, 82, 65, 128, 81, 65, 73, 128, 81, 65, 70, + 128, 81, 65, 198, 81, 65, 68, 77, 65, 128, 81, 65, 65, 73, 128, 81, 65, + 65, 70, 85, 128, 81, 65, 65, 70, 128, 81, 48, 48, 55, 128, 81, 48, 48, + 54, 128, 81, 48, 48, 53, 128, 81, 48, 48, 52, 128, 81, 48, 48, 51, 128, + 81, 48, 48, 50, 128, 81, 48, 48, 49, 128, 80, 90, 128, 80, 89, 88, 128, + 80, 89, 84, 128, 80, 89, 82, 88, 128, 80, 89, 82, 128, 80, 89, 80, 128, + 80, 87, 79, 89, 128, 80, 87, 79, 79, 128, 80, 87, 79, 128, 80, 87, 207, + 80, 87, 73, 73, 128, 80, 87, 73, 128, 80, 87, 69, 69, 128, 80, 87, 69, + 128, 80, 87, 65, 65, 128, 80, 87, 128, 80, 86, 128, 80, 85, 90, 90, 76, + 197, 80, 85, 88, 128, 80, 85, 85, 84, 128, 80, 85, 85, 128, 80, 85, 84, + 82, 69, 70, 65, 67, 84, 73, 79, 78, 128, 80, 85, 84, 128, 80, 85, 212, + 80, 85, 83, 72, 80, 73, 78, 128, 80, 85, 83, 72, 80, 73, 75, 65, 128, 80, + 85, 83, 72, 73, 78, 199, 80, 85, 82, 88, 128, 80, 85, 82, 83, 69, 128, + 80, 85, 82, 80, 76, 197, 80, 85, 82, 78, 65, 77, 65, 128, 80, 85, 82, 73, + 84, 89, 128, 80, 85, 82, 73, 70, 89, 128, 80, 85, 82, 128, 80, 85, 81, + 128, 80, 85, 80, 128, 80, 85, 79, 88, 128, 80, 85, 79, 80, 128, 80, 85, + 79, 128, 80, 85, 78, 71, 65, 65, 77, 128, 80, 85, 78, 71, 128, 80, 85, + 78, 67, 84, 85, 211, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, 78, 128, 80, + 85, 78, 67, 84, 85, 65, 84, 73, 79, 206, 80, 85, 77, 80, 128, 80, 85, 77, + 128, 80, 85, 70, 70, 69, 68, 128, 80, 85, 69, 128, 80, 85, 67, 75, 128, + 80, 85, 66, 76, 73, 195, 80, 85, 194, 80, 85, 65, 81, 128, 80, 85, 65, + 69, 128, 80, 85, 65, 67, 72, 85, 197, 80, 85, 50, 128, 80, 85, 49, 128, + 80, 85, 128, 80, 84, 72, 65, 72, 193, 80, 84, 69, 128, 80, 83, 73, 76, + 201, 80, 83, 73, 70, 73, 83, 84, 79, 83, 89, 78, 65, 71, 77, 65, 128, 80, + 83, 73, 70, 73, 83, 84, 79, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 65, + 128, 80, 83, 73, 70, 73, 83, 84, 79, 206, 80, 83, 73, 70, 73, 83, 84, 79, + 76, 89, 71, 73, 83, 77, 65, 128, 80, 83, 73, 128, 80, 83, 65, 76, 84, 69, + 210, 80, 83, 128, 80, 82, 79, 86, 69, 128, 80, 82, 79, 84, 79, 86, 65, + 82, 89, 211, 80, 82, 79, 84, 79, 211, 80, 82, 79, 84, 69, 67, 84, 69, + 196, 80, 82, 79, 83, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, 80, 82, + 79, 83, 69, 82, 80, 73, 78, 65, 128, 80, 82, 79, 80, 79, 82, 84, 73, 79, + 78, 65, 204, 80, 82, 79, 80, 79, 82, 84, 73, 79, 78, 128, 80, 82, 79, 80, + 69, 82, 84, 217, 80, 82, 79, 80, 69, 76, 76, 69, 210, 80, 82, 79, 79, 70, + 128, 80, 82, 79, 76, 79, 78, 71, 69, 196, 80, 82, 79, 76, 65, 84, 73, 79, + 78, 197, 80, 82, 79, 74, 69, 67, 84, 79, 82, 128, 80, 82, 79, 74, 69, 67, + 84, 73, 86, 69, 128, 80, 82, 79, 74, 69, 67, 84, 73, 79, 78, 128, 80, 82, + 79, 72, 73, 66, 73, 84, 69, 196, 80, 82, 79, 71, 82, 69, 83, 83, 128, 80, + 82, 79, 71, 82, 65, 205, 80, 82, 79, 70, 79, 85, 78, 68, 128, 80, 82, 79, + 68, 85, 67, 84, 128, 80, 82, 79, 68, 85, 67, 212, 80, 82, 79, 66, 73, 78, + 199, 80, 82, 73, 86, 65, 84, 69, 128, 80, 82, 73, 86, 65, 84, 197, 80, + 82, 73, 86, 65, 67, 217, 80, 82, 73, 83, 72, 84, 72, 65, 77, 65, 84, 82, + 193, 80, 82, 73, 78, 84, 83, 128, 80, 82, 73, 78, 84, 69, 82, 128, 80, + 82, 73, 78, 84, 69, 210, 80, 82, 73, 78, 84, 128, 80, 82, 73, 78, 212, + 80, 82, 73, 78, 67, 69, 83, 83, 128, 80, 82, 73, 78, 67, 69, 128, 80, 82, + 73, 77, 69, 128, 80, 82, 73, 77, 197, 80, 82, 69, 86, 73, 79, 85, 211, + 80, 82, 69, 84, 90, 69, 76, 128, 80, 82, 69, 83, 83, 69, 196, 80, 82, 69, + 83, 69, 84, 128, 80, 82, 69, 83, 69, 78, 84, 65, 84, 73, 79, 206, 80, 82, + 69, 83, 67, 82, 73, 80, 84, 73, 79, 206, 80, 82, 69, 80, 79, 78, 68, 69, + 82, 65, 78, 67, 69, 128, 80, 82, 69, 78, 75, 72, 65, 128, 80, 82, 69, 71, + 78, 65, 78, 212, 80, 82, 69, 70, 73, 88, 69, 196, 80, 82, 69, 70, 65, 67, + 197, 80, 82, 69, 67, 73, 80, 73, 84, 65, 84, 69, 128, 80, 82, 69, 67, 69, + 68, 73, 78, 199, 80, 82, 69, 67, 69, 68, 69, 83, 128, 80, 82, 69, 67, 69, + 68, 69, 211, 80, 82, 69, 67, 69, 68, 69, 196, 80, 82, 69, 67, 69, 68, 69, + 128, 80, 82, 69, 67, 69, 68, 197, 80, 82, 65, 89, 69, 210, 80, 82, 65, + 77, 45, 80, 73, 73, 128, 80, 82, 65, 77, 45, 80, 73, 201, 80, 82, 65, 77, + 45, 77, 85, 79, 89, 128, 80, 82, 65, 77, 45, 77, 85, 79, 217, 80, 82, 65, + 77, 45, 66, 85, 79, 78, 128, 80, 82, 65, 77, 45, 66, 85, 79, 206, 80, 82, + 65, 77, 45, 66, 69, 73, 128, 80, 82, 65, 77, 45, 66, 69, 201, 80, 82, 65, + 77, 128, 80, 82, 65, 205, 80, 82, 128, 80, 80, 86, 128, 80, 80, 77, 128, + 80, 80, 65, 128, 80, 79, 89, 128, 80, 79, 88, 128, 80, 79, 87, 69, 82, + 211, 80, 79, 87, 69, 82, 128, 80, 79, 87, 69, 210, 80, 79, 87, 68, 69, + 82, 69, 196, 80, 79, 87, 68, 69, 82, 128, 80, 79, 85, 78, 196, 80, 79, + 85, 76, 84, 82, 217, 80, 79, 85, 67, 72, 128, 80, 79, 84, 84, 69, 196, + 80, 79, 84, 65, 84, 79, 128, 80, 79, 84, 65, 66, 76, 197, 80, 79, 212, + 80, 79, 83, 84, 80, 79, 83, 73, 84, 73, 79, 206, 80, 79, 83, 84, 66, 79, + 88, 128, 80, 79, 83, 84, 65, 204, 80, 79, 83, 84, 128, 80, 79, 83, 212, + 80, 79, 83, 83, 69, 83, 83, 73, 79, 78, 128, 80, 79, 83, 83, 69, 83, 83, + 73, 79, 206, 80, 79, 83, 73, 84, 73, 79, 78, 83, 128, 80, 79, 83, 73, 84, + 73, 79, 78, 128, 80, 79, 83, 69, 73, 68, 79, 78, 128, 80, 79, 82, 84, 65, + 66, 76, 197, 80, 79, 82, 82, 69, 67, 84, 85, 83, 128, 80, 79, 82, 82, 69, + 67, 84, 85, 211, 80, 79, 80, 80, 73, 78, 199, 80, 79, 80, 80, 69, 82, + 128, 80, 79, 80, 67, 79, 82, 78, 128, 80, 79, 80, 128, 80, 79, 208, 80, + 79, 79, 68, 76, 69, 128, 80, 79, 79, 128, 80, 79, 78, 68, 79, 128, 80, + 79, 206, 80, 79, 77, 77, 69, 69, 128, 80, 79, 77, 77, 69, 197, 80, 79, + 76, 79, 128, 80, 79, 76, 73, 83, 72, 128, 80, 79, 76, 73, 67, 197, 80, + 79, 76, 201, 80, 79, 76, 69, 128, 80, 79, 76, 197, 80, 79, 75, 82, 89, + 84, 73, 69, 128, 80, 79, 75, 79, 74, 73, 128, 80, 79, 73, 78, 84, 211, + 80, 79, 73, 78, 84, 79, 128, 80, 79, 73, 78, 84, 69, 82, 128, 80, 79, 73, + 78, 84, 69, 196, 80, 79, 73, 78, 84, 128, 80, 79, 73, 78, 212, 80, 79, + 69, 84, 82, 217, 80, 79, 69, 84, 73, 195, 80, 79, 68, 65, 84, 85, 83, + 128, 80, 79, 67, 75, 69, 212, 80, 79, 65, 128, 80, 79, 128, 80, 207, 80, + 78, 69, 85, 77, 65, 84, 65, 128, 80, 76, 85, 84, 207, 80, 76, 85, 84, 65, + 128, 80, 76, 85, 83, 45, 77, 73, 78, 85, 211, 80, 76, 85, 83, 128, 80, + 76, 85, 82, 65, 76, 128, 80, 76, 85, 78, 71, 69, 82, 128, 80, 76, 85, 77, + 69, 196, 80, 76, 85, 77, 128, 80, 76, 85, 75, 128, 80, 76, 85, 71, 128, + 80, 76, 85, 128, 80, 76, 79, 87, 128, 80, 76, 79, 80, 72, 85, 128, 80, + 76, 72, 65, 85, 128, 80, 76, 69, 84, 72, 82, 79, 78, 128, 80, 76, 69, 65, + 68, 73, 78, 199, 80, 76, 68, 128, 80, 76, 65, 89, 73, 78, 199, 80, 76, + 65, 84, 69, 128, 80, 76, 65, 83, 84, 73, 67, 83, 128, 80, 76, 65, 78, 84, + 128, 80, 76, 65, 78, 69, 84, 128, 80, 76, 65, 78, 69, 128, 80, 76, 65, + 78, 67, 203, 80, 76, 65, 75, 128, 80, 76, 65, 71, 73, 79, 211, 80, 76, + 65, 67, 69, 72, 79, 76, 68, 69, 82, 128, 80, 76, 65, 67, 69, 72, 79, 76, + 68, 69, 210, 80, 76, 65, 67, 197, 80, 76, 65, 67, 65, 82, 68, 128, 80, + 76, 65, 128, 80, 73, 90, 90, 73, 67, 65, 84, 79, 128, 80, 73, 90, 90, 65, + 128, 80, 73, 88, 128, 80, 73, 87, 82, 128, 80, 73, 84, 67, 72, 70, 79, + 82, 75, 128, 80, 73, 84, 67, 72, 70, 79, 82, 203, 80, 73, 84, 128, 80, + 73, 83, 84, 79, 76, 128, 80, 73, 83, 69, 76, 69, 72, 128, 80, 73, 83, 67, + 69, 83, 128, 80, 73, 82, 73, 71, 128, 80, 73, 82, 73, 199, 80, 73, 82, + 73, 69, 69, 78, 128, 80, 73, 82, 65, 67, 89, 128, 80, 73, 82, 50, 128, + 80, 73, 80, 73, 78, 71, 128, 80, 73, 80, 65, 69, 77, 71, 66, 73, 69, 69, + 128, 80, 73, 80, 65, 69, 77, 66, 65, 128, 80, 73, 80, 128, 80, 73, 78, + 87, 72, 69, 69, 204, 80, 73, 78, 69, 65, 80, 80, 76, 69, 128, 80, 73, 78, + 197, 80, 73, 78, 67, 72, 73, 78, 199, 80, 73, 78, 67, 72, 69, 196, 80, + 73, 78, 65, 84, 65, 128, 80, 73, 78, 65, 82, 66, 79, 82, 65, 83, 128, 80, + 73, 76, 76, 128, 80, 73, 76, 197, 80, 73, 76, 67, 82, 79, 215, 80, 73, + 75, 85, 82, 85, 128, 80, 73, 75, 79, 128, 80, 73, 71, 128, 80, 73, 199, + 80, 73, 69, 88, 128, 80, 73, 69, 85, 80, 45, 84, 72, 73, 69, 85, 84, 72, + 128, 80, 73, 69, 85, 80, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 80, + 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 84, 73, 75, 69, 85, 84, 128, 80, + 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 84, 72, 73, 69, 85, 84, 72, 128, + 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 80, + 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 80, + 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 67, 73, 69, 85, 67, 128, 80, 73, + 69, 85, 80, 45, 82, 73, 69, 85, 76, 45, 80, 72, 73, 69, 85, 80, 72, 128, + 80, 73, 69, 85, 80, 45, 82, 73, 69, 85, 76, 128, 80, 73, 69, 85, 80, 45, + 78, 73, 69, 85, 78, 128, 80, 73, 69, 85, 80, 45, 77, 73, 69, 85, 77, 128, + 80, 73, 69, 85, 80, 45, 75, 72, 73, 69, 85, 75, 72, 128, 80, 73, 69, 85, + 80, 45, 67, 73, 69, 85, 67, 128, 80, 73, 69, 85, 80, 45, 67, 72, 73, 69, + 85, 67, 72, 128, 80, 73, 69, 85, 208, 80, 73, 69, 84, 128, 80, 73, 69, + 80, 128, 80, 73, 69, 69, 84, 128, 80, 73, 69, 69, 81, 128, 80, 73, 69, + 67, 69, 128, 80, 73, 69, 128, 80, 73, 67, 84, 85, 82, 69, 128, 80, 73, + 67, 75, 85, 208, 80, 73, 67, 75, 69, 84, 128, 80, 73, 67, 75, 128, 80, + 73, 65, 83, 85, 84, 79, 82, 85, 128, 80, 73, 65, 83, 77, 193, 80, 73, 65, + 78, 79, 128, 80, 201, 80, 72, 87, 65, 128, 80, 72, 85, 84, 72, 65, 79, + 128, 80, 72, 85, 210, 80, 72, 85, 78, 71, 128, 80, 72, 82, 65, 83, 69, + 128, 80, 72, 79, 78, 69, 83, 128, 80, 72, 79, 76, 85, 83, 128, 80, 72, + 79, 69, 78, 73, 67, 73, 65, 206, 80, 72, 79, 65, 128, 80, 72, 79, 128, + 80, 72, 207, 80, 72, 78, 65, 69, 203, 80, 72, 73, 78, 84, 72, 85, 128, + 80, 72, 73, 76, 79, 83, 79, 80, 72, 69, 82, 211, 80, 72, 73, 76, 73, 80, + 80, 73, 78, 197, 80, 72, 73, 69, 85, 80, 72, 45, 84, 72, 73, 69, 85, 84, + 72, 128, 80, 72, 73, 69, 85, 80, 72, 45, 83, 73, 79, 83, 128, 80, 72, 73, + 69, 85, 80, 72, 45, 80, 73, 69, 85, 80, 128, 80, 72, 73, 69, 85, 80, 72, + 45, 72, 73, 69, 85, 72, 128, 80, 72, 73, 69, 85, 80, 200, 80, 72, 73, + 128, 80, 72, 201, 80, 72, 69, 69, 128, 80, 72, 69, 128, 80, 72, 65, 83, + 69, 45, 198, 80, 72, 65, 83, 69, 45, 195, 80, 72, 65, 83, 69, 45, 194, + 80, 72, 65, 83, 69, 45, 193, 80, 72, 65, 82, 89, 78, 71, 69, 65, 204, 80, + 72, 65, 82, 128, 80, 72, 65, 78, 128, 80, 72, 65, 77, 128, 80, 72, 65, + 73, 83, 84, 79, 211, 80, 72, 65, 71, 83, 45, 80, 193, 80, 72, 65, 66, + 128, 80, 72, 65, 65, 82, 75, 65, 65, 128, 80, 72, 65, 65, 128, 80, 71, + 128, 80, 70, 128, 80, 69, 85, 88, 128, 80, 69, 85, 84, 65, 69, 128, 80, + 69, 85, 84, 128, 80, 69, 84, 82, 201, 80, 69, 84, 65, 83, 84, 79, 75, 79, + 85, 70, 73, 83, 77, 65, 128, 80, 69, 84, 65, 83, 84, 73, 128, 80, 69, 84, + 65, 83, 77, 65, 128, 80, 69, 84, 65, 76, 76, 69, 196, 80, 69, 83, 79, + 128, 80, 69, 83, 207, 80, 69, 83, 72, 50, 128, 80, 69, 83, 72, 178, 80, + 69, 83, 69, 84, 193, 80, 69, 211, 80, 69, 82, 84, 72, 207, 80, 69, 82, + 83, 80, 69, 67, 84, 73, 86, 69, 128, 80, 69, 82, 83, 79, 78, 65, 204, 80, + 69, 82, 83, 79, 78, 128, 80, 69, 82, 83, 79, 206, 80, 69, 82, 83, 73, 65, 206, 80, 69, 82, 83, 69, 86, 69, 82, 73, 78, 199, 80, 69, 82, 80, 69, 78, 68, 73, 67, 85, 76, 65, 82, 128, 80, 69, 82, 80, 69, 78, 68, 73, 67, 85, 76, 65, 210, 80, 69, 82, 78, 73, 206, 80, 69, 82, 77, 73, 84, 84, 69, @@ -1801,849 +1851,853 @@ static const unsigned char lexicon[] = { 69, 67, 84, 193, 80, 69, 82, 67, 85, 83, 83, 73, 86, 69, 128, 80, 69, 82, 67, 69, 78, 212, 80, 69, 80, 80, 69, 82, 128, 80, 69, 80, 69, 84, 128, 80, 69, 80, 69, 212, 80, 69, 79, 82, 84, 200, 80, 69, 79, 80, 76, 69, - 128, 80, 69, 78, 84, 65, 84, 72, 76, 79, 78, 128, 80, 69, 78, 84, 65, 83, - 69, 77, 69, 128, 80, 69, 78, 84, 65, 71, 82, 65, 77, 128, 80, 69, 78, 84, - 65, 71, 79, 78, 128, 80, 69, 78, 83, 85, 128, 80, 69, 78, 83, 73, 86, - 197, 80, 69, 78, 78, 217, 80, 69, 78, 78, 65, 78, 84, 128, 80, 69, 78, - 73, 72, 73, 128, 80, 69, 78, 71, 85, 73, 78, 128, 80, 69, 78, 71, 75, 65, - 76, 128, 80, 69, 78, 69, 84, 82, 65, 84, 73, 79, 78, 128, 80, 69, 78, 67, - 73, 76, 128, 80, 69, 76, 65, 83, 84, 79, 78, 128, 80, 69, 76, 65, 83, 84, - 79, 206, 80, 69, 73, 84, 72, 128, 80, 69, 72, 69, 72, 128, 80, 69, 72, - 69, 200, 80, 69, 72, 128, 80, 69, 200, 80, 69, 69, 90, 73, 128, 80, 69, - 69, 83, 72, 73, 128, 80, 69, 69, 80, 128, 80, 69, 69, 77, 128, 80, 69, - 69, 73, 128, 80, 69, 69, 128, 80, 69, 68, 69, 83, 84, 82, 73, 65, 78, 83, - 128, 80, 69, 68, 69, 83, 84, 82, 73, 65, 78, 128, 80, 69, 68, 69, 83, 84, - 65, 76, 128, 80, 69, 68, 69, 83, 84, 65, 204, 80, 69, 68, 65, 204, 80, - 69, 65, 78, 85, 84, 83, 128, 80, 69, 65, 75, 211, 80, 69, 65, 67, 79, 67, - 75, 128, 80, 69, 65, 67, 72, 128, 80, 69, 65, 67, 69, 128, 80, 69, 65, - 67, 197, 80, 68, 73, 128, 80, 68, 70, 128, 80, 68, 128, 80, 67, 128, 80, - 65, 90, 69, 82, 128, 80, 65, 89, 69, 82, 79, 75, 128, 80, 65, 89, 65, 78, - 78, 65, 128, 80, 65, 89, 128, 80, 65, 88, 128, 80, 65, 87, 78, 128, 80, - 65, 87, 206, 80, 65, 215, 80, 65, 86, 73, 89, 65, 78, 73, 128, 80, 65, - 85, 83, 197, 80, 65, 85, 128, 80, 65, 213, 80, 65, 84, 84, 69, 82, 78, - 128, 80, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 80, 65, 84, 72, 65, 75, - 75, 85, 128, 80, 65, 84, 200, 80, 65, 84, 65, 75, 128, 80, 65, 84, 65, - 72, 128, 80, 65, 84, 128, 80, 65, 83, 85, 81, 128, 80, 65, 83, 83, 80, - 79, 82, 212, 80, 65, 83, 83, 73, 86, 69, 45, 80, 85, 76, 76, 45, 85, 80, - 45, 79, 85, 84, 80, 85, 212, 80, 65, 83, 83, 73, 86, 69, 45, 80, 85, 76, - 76, 45, 68, 79, 87, 78, 45, 79, 85, 84, 80, 85, 212, 80, 65, 83, 83, 73, - 77, 66, 65, 78, 71, 128, 80, 65, 83, 83, 69, 78, 71, 69, 210, 80, 65, 83, - 83, 69, 196, 80, 65, 83, 72, 84, 65, 128, 80, 65, 83, 72, 65, 69, 128, - 80, 65, 83, 69, 81, 128, 80, 65, 83, 65, 78, 71, 65, 206, 80, 65, 82, 85, - 77, 128, 80, 65, 82, 84, 217, 80, 65, 82, 84, 78, 69, 82, 83, 72, 73, - 208, 80, 65, 82, 84, 73, 65, 76, 76, 89, 45, 82, 69, 67, 89, 67, 76, 69, - 196, 80, 65, 82, 84, 73, 65, 204, 80, 65, 82, 84, 72, 73, 65, 206, 80, - 65, 82, 212, 80, 65, 82, 82, 79, 84, 128, 80, 65, 82, 75, 128, 80, 65, - 82, 73, 67, 72, 79, 78, 128, 80, 65, 82, 69, 83, 84, 73, 71, 77, 69, 78, - 79, 206, 80, 65, 82, 69, 82, 69, 78, 128, 80, 65, 82, 69, 78, 84, 72, 69, - 83, 73, 83, 128, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 211, 80, 65, 82, - 69, 78, 84, 72, 69, 83, 69, 211, 80, 65, 82, 65, 80, 72, 82, 65, 83, 197, - 80, 65, 82, 65, 76, 76, 69, 76, 79, 71, 82, 65, 77, 128, 80, 65, 82, 65, - 76, 76, 69, 76, 128, 80, 65, 82, 65, 76, 76, 69, 204, 80, 65, 82, 65, 75, - 76, 73, 84, 73, 75, 73, 128, 80, 65, 82, 65, 75, 76, 73, 84, 73, 75, 201, - 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 193, 80, 65, 82, 65, 71, 82, 65, - 80, 72, 85, 211, 80, 65, 82, 65, 71, 82, 65, 80, 72, 79, 83, 128, 80, 65, - 82, 65, 71, 82, 65, 80, 72, 128, 80, 65, 82, 65, 71, 82, 65, 80, 200, 80, - 65, 82, 65, 67, 72, 85, 84, 69, 128, 80, 65, 82, 65, 128, 80, 65, 82, - 128, 80, 65, 80, 89, 82, 85, 83, 128, 80, 65, 80, 69, 82, 67, 76, 73, 80, - 83, 128, 80, 65, 80, 69, 82, 67, 76, 73, 80, 128, 80, 65, 80, 69, 82, - 128, 80, 65, 80, 69, 210, 80, 65, 80, 128, 80, 65, 208, 80, 65, 207, 80, - 65, 78, 89, 85, 75, 85, 128, 80, 65, 78, 89, 73, 75, 85, 128, 80, 65, 78, - 89, 69, 67, 69, 75, 128, 80, 65, 78, 89, 65, 78, 71, 71, 65, 128, 80, 65, - 78, 89, 65, 75, 82, 65, 128, 80, 65, 78, 84, 73, 128, 80, 65, 78, 83, 73, - 79, 83, 45, 80, 73, 69, 85, 80, 128, 80, 65, 78, 83, 73, 79, 83, 45, 75, - 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, 80, 65, 78, 79, 78, - 71, 79, 78, 65, 78, 128, 80, 65, 78, 79, 76, 79, 78, 71, 128, 80, 65, 78, - 71, 87, 73, 83, 65, 68, 128, 80, 65, 78, 71, 82, 65, 78, 71, 75, 69, 80, - 128, 80, 65, 78, 71, 79, 76, 65, 84, 128, 80, 65, 78, 71, 76, 79, 78, 71, - 128, 80, 65, 78, 71, 76, 65, 89, 65, 82, 128, 80, 65, 78, 71, 75, 79, 78, - 128, 80, 65, 78, 71, 75, 65, 84, 128, 80, 65, 78, 71, 72, 85, 76, 85, - 128, 80, 65, 78, 71, 128, 80, 65, 78, 69, 85, 76, 69, 85, 78, 71, 128, - 80, 65, 78, 68, 193, 80, 65, 78, 67, 65, 75, 69, 83, 128, 80, 65, 78, 65, - 77, 128, 80, 65, 78, 65, 69, 76, 65, 69, 78, 71, 128, 80, 65, 78, 128, - 80, 65, 206, 80, 65, 77, 85, 78, 71, 75, 65, 72, 128, 80, 65, 77, 85, 68, - 80, 79, 68, 128, 80, 65, 77, 83, 72, 65, 69, 128, 80, 65, 77, 80, 72, 89, - 76, 73, 65, 206, 80, 65, 77, 73, 78, 71, 75, 65, 76, 128, 80, 65, 77, 69, - 80, 69, 84, 128, 80, 65, 77, 69, 78, 69, 78, 71, 128, 80, 65, 77, 65, 68, - 65, 128, 80, 65, 77, 65, 65, 69, 72, 128, 80, 65, 76, 85, 84, 65, 128, - 80, 65, 76, 79, 67, 72, 75, 65, 128, 80, 65, 76, 77, 89, 82, 69, 78, 197, - 80, 65, 76, 77, 211, 80, 65, 76, 77, 128, 80, 65, 76, 205, 80, 65, 76, - 76, 65, 87, 65, 128, 80, 65, 76, 76, 65, 83, 128, 80, 65, 76, 201, 80, - 65, 76, 69, 84, 84, 69, 128, 80, 65, 76, 65, 85, 78, 199, 80, 65, 76, 65, - 84, 65, 76, 73, 90, 69, 196, 80, 65, 76, 65, 84, 65, 76, 73, 90, 65, 84, - 73, 79, 78, 128, 80, 65, 76, 65, 84, 65, 204, 80, 65, 75, 80, 65, 203, - 80, 65, 73, 89, 65, 78, 78, 79, 73, 128, 80, 65, 73, 82, 84, 72, 82, 65, - 128, 80, 65, 73, 82, 69, 196, 80, 65, 73, 78, 84, 66, 82, 85, 83, 72, - 128, 80, 65, 73, 128, 80, 65, 72, 76, 65, 86, 201, 80, 65, 72, 128, 80, - 65, 71, 79, 68, 65, 128, 80, 65, 71, 69, 83, 128, 80, 65, 71, 69, 82, - 128, 80, 65, 71, 197, 80, 65, 68, 77, 193, 80, 65, 68, 68, 76, 197, 80, - 65, 68, 68, 73, 78, 199, 80, 65, 68, 193, 80, 65, 68, 128, 80, 65, 67, - 75, 73, 78, 71, 128, 80, 65, 67, 75, 65, 71, 69, 128, 80, 65, 65, 84, 85, - 128, 80, 65, 65, 83, 69, 78, 84, 79, 128, 80, 65, 65, 82, 65, 77, 128, - 80, 65, 65, 82, 65, 69, 128, 80, 65, 65, 77, 128, 80, 65, 65, 73, 128, - 80, 65, 65, 45, 80, 73, 76, 76, 65, 128, 80, 65, 65, 128, 80, 50, 128, - 80, 48, 49, 49, 128, 80, 48, 49, 48, 128, 80, 48, 48, 57, 128, 80, 48, - 48, 56, 128, 80, 48, 48, 55, 128, 80, 48, 48, 54, 128, 80, 48, 48, 53, - 128, 80, 48, 48, 52, 128, 80, 48, 48, 51, 65, 128, 80, 48, 48, 51, 128, - 80, 48, 48, 50, 128, 80, 48, 48, 49, 65, 128, 80, 48, 48, 49, 128, 79, - 89, 83, 84, 69, 82, 128, 79, 89, 82, 65, 78, 73, 83, 77, 193, 79, 89, 65, - 78, 78, 65, 128, 79, 88, 73, 65, 128, 79, 88, 73, 193, 79, 88, 69, 73, - 65, 201, 79, 88, 69, 73, 193, 79, 87, 76, 128, 79, 86, 69, 82, 82, 73, - 68, 69, 128, 79, 86, 69, 82, 76, 79, 78, 199, 79, 86, 69, 82, 76, 73, 78, - 69, 128, 79, 86, 69, 82, 76, 65, 89, 128, 79, 86, 69, 82, 76, 65, 217, - 79, 86, 69, 82, 76, 65, 80, 80, 73, 78, 199, 79, 86, 69, 82, 76, 65, 80, - 128, 79, 86, 69, 82, 76, 65, 73, 68, 128, 79, 86, 69, 82, 72, 69, 65, 84, - 69, 196, 79, 86, 69, 82, 66, 65, 82, 128, 79, 86, 65, 76, 128, 79, 86, - 65, 204, 79, 85, 84, 76, 73, 78, 69, 196, 79, 85, 84, 76, 73, 78, 69, - 128, 79, 85, 84, 69, 210, 79, 85, 84, 66, 79, 216, 79, 85, 78, 75, 73, - 193, 79, 85, 78, 67, 69, 128, 79, 85, 78, 67, 197, 79, 84, 85, 128, 79, - 84, 84, 79, 77, 65, 206, 79, 84, 84, 69, 82, 128, 79, 84, 84, 65, 86, - 193, 79, 84, 84, 128, 79, 84, 72, 69, 82, 211, 79, 84, 72, 69, 210, 79, - 84, 72, 65, 76, 65, 206, 79, 84, 72, 65, 76, 128, 79, 83, 77, 65, 78, 89, - 193, 79, 83, 67, 128, 79, 83, 65, 71, 197, 79, 82, 84, 72, 79, 71, 79, - 78, 65, 204, 79, 82, 84, 72, 79, 68, 79, 216, 79, 82, 78, 65, 84, 197, - 79, 82, 78, 65, 77, 69, 78, 84, 83, 128, 79, 82, 78, 65, 77, 69, 78, 84, - 128, 79, 82, 78, 65, 77, 69, 78, 212, 79, 82, 75, 72, 79, 206, 79, 82, - 73, 89, 193, 79, 82, 73, 71, 73, 78, 65, 204, 79, 82, 73, 71, 73, 78, - 128, 79, 82, 69, 45, 50, 128, 79, 82, 68, 73, 78, 65, 204, 79, 82, 68, - 69, 210, 79, 82, 67, 72, 73, 68, 128, 79, 82, 65, 78, 71, 85, 84, 65, 78, - 128, 79, 82, 65, 78, 71, 197, 79, 80, 84, 73, 79, 206, 79, 80, 84, 73, - 67, 65, 204, 79, 80, 80, 82, 69, 83, 83, 73, 79, 78, 128, 79, 80, 80, 79, - 83, 73, 84, 73, 79, 78, 128, 79, 80, 80, 79, 83, 73, 78, 199, 79, 80, 80, - 79, 83, 69, 128, 79, 80, 72, 73, 85, 67, 72, 85, 83, 128, 79, 80, 69, 82, - 65, 84, 79, 82, 128, 79, 80, 69, 82, 65, 84, 79, 210, 79, 80, 69, 82, 65, - 84, 73, 78, 199, 79, 80, 69, 78, 73, 78, 199, 79, 80, 69, 78, 45, 80, - 128, 79, 80, 69, 78, 45, 79, 85, 84, 76, 73, 78, 69, 196, 79, 80, 69, 78, - 45, 79, 128, 79, 80, 69, 78, 45, 207, 79, 80, 69, 78, 45, 72, 69, 65, 68, - 69, 196, 79, 80, 69, 78, 45, 67, 73, 82, 67, 85, 73, 84, 45, 79, 85, 84, - 80, 85, 212, 79, 80, 69, 78, 128, 79, 79, 90, 69, 128, 79, 79, 89, 65, - 78, 78, 65, 128, 79, 79, 85, 128, 79, 79, 77, 85, 128, 79, 79, 72, 128, - 79, 79, 69, 128, 79, 79, 66, 79, 79, 70, 73, 76, 73, 128, 79, 78, 85, - 128, 79, 78, 83, 85, 128, 79, 78, 78, 128, 79, 78, 75, 65, 82, 128, 79, - 78, 73, 79, 78, 128, 79, 78, 69, 83, 69, 76, 70, 128, 79, 78, 69, 45, 87, - 65, 217, 79, 78, 69, 45, 84, 72, 73, 82, 84, 89, 128, 79, 78, 69, 45, 80, - 73, 69, 67, 197, 79, 78, 69, 45, 76, 73, 78, 197, 79, 78, 69, 45, 72, 85, - 78, 68, 82, 69, 68, 45, 65, 78, 68, 45, 83, 73, 88, 84, 73, 69, 84, 72, - 128, 79, 78, 67, 79, 77, 73, 78, 199, 79, 78, 65, 80, 128, 79, 78, 45, - 79, 70, 198, 79, 77, 73, 83, 83, 73, 79, 206, 79, 77, 73, 67, 82, 79, 78, - 128, 79, 77, 73, 67, 82, 79, 206, 79, 77, 69, 71, 65, 128, 79, 77, 69, - 71, 193, 79, 77, 65, 76, 79, 78, 128, 79, 76, 73, 86, 69, 128, 79, 76, - 73, 71, 79, 206, 79, 76, 68, 128, 79, 75, 84, 207, 79, 75, 65, 82, 65, - 128, 79, 75, 65, 82, 193, 79, 74, 73, 66, 87, 65, 217, 79, 74, 69, 79, - 78, 128, 79, 73, 78, 128, 79, 73, 76, 128, 79, 73, 204, 79, 72, 77, 128, - 79, 72, 205, 79, 71, 82, 69, 128, 79, 71, 79, 78, 69, 75, 128, 79, 71, - 79, 78, 69, 203, 79, 71, 72, 65, 205, 79, 70, 70, 73, 67, 69, 82, 128, - 79, 70, 70, 73, 67, 69, 128, 79, 70, 70, 73, 67, 197, 79, 70, 70, 128, - 79, 69, 89, 128, 79, 69, 82, 128, 79, 69, 75, 128, 79, 69, 69, 128, 79, - 68, 69, 78, 128, 79, 68, 68, 128, 79, 68, 196, 79, 67, 84, 79, 80, 85, - 83, 128, 79, 67, 84, 79, 66, 69, 82, 128, 79, 67, 84, 69, 212, 79, 67, - 84, 65, 71, 79, 78, 65, 204, 79, 67, 84, 65, 71, 79, 78, 128, 79, 67, - 210, 79, 67, 76, 79, 67, 75, 128, 79, 67, 67, 76, 85, 83, 73, 79, 78, - 128, 79, 66, 83, 84, 82, 85, 67, 84, 73, 79, 78, 128, 79, 66, 83, 69, 82, - 86, 69, 210, 79, 66, 79, 76, 211, 79, 66, 79, 204, 79, 66, 79, 70, 73, - 76, 73, 128, 79, 66, 76, 73, 81, 85, 197, 79, 66, 74, 69, 67, 212, 79, - 66, 69, 76, 85, 83, 128, 79, 66, 69, 76, 79, 83, 128, 79, 66, 128, 79, - 65, 89, 128, 79, 65, 75, 128, 79, 65, 66, 79, 65, 70, 73, 76, 73, 128, - 79, 193, 79, 48, 53, 49, 128, 79, 48, 53, 48, 66, 128, 79, 48, 53, 48, - 65, 128, 79, 48, 53, 48, 128, 79, 48, 52, 57, 128, 79, 48, 52, 56, 128, - 79, 48, 52, 55, 128, 79, 48, 52, 54, 128, 79, 48, 52, 53, 128, 79, 48, - 52, 52, 128, 79, 48, 52, 51, 128, 79, 48, 52, 50, 128, 79, 48, 52, 49, - 128, 79, 48, 52, 48, 128, 79, 48, 51, 57, 128, 79, 48, 51, 56, 128, 79, - 48, 51, 55, 128, 79, 48, 51, 54, 68, 128, 79, 48, 51, 54, 67, 128, 79, - 48, 51, 54, 66, 128, 79, 48, 51, 54, 65, 128, 79, 48, 51, 54, 128, 79, - 48, 51, 53, 128, 79, 48, 51, 52, 128, 79, 48, 51, 51, 65, 128, 79, 48, - 51, 51, 128, 79, 48, 51, 50, 128, 79, 48, 51, 49, 128, 79, 48, 51, 48, - 65, 128, 79, 48, 51, 48, 128, 79, 48, 50, 57, 65, 128, 79, 48, 50, 57, - 128, 79, 48, 50, 56, 128, 79, 48, 50, 55, 128, 79, 48, 50, 54, 128, 79, - 48, 50, 53, 65, 128, 79, 48, 50, 53, 128, 79, 48, 50, 52, 65, 128, 79, - 48, 50, 52, 128, 79, 48, 50, 51, 128, 79, 48, 50, 50, 128, 79, 48, 50, - 49, 128, 79, 48, 50, 48, 65, 128, 79, 48, 50, 48, 128, 79, 48, 49, 57, - 65, 128, 79, 48, 49, 57, 128, 79, 48, 49, 56, 128, 79, 48, 49, 55, 128, - 79, 48, 49, 54, 128, 79, 48, 49, 53, 128, 79, 48, 49, 52, 128, 79, 48, - 49, 51, 128, 79, 48, 49, 50, 128, 79, 48, 49, 49, 128, 79, 48, 49, 48, - 67, 128, 79, 48, 49, 48, 66, 128, 79, 48, 49, 48, 65, 128, 79, 48, 49, - 48, 128, 79, 48, 48, 57, 128, 79, 48, 48, 56, 128, 79, 48, 48, 55, 128, - 79, 48, 48, 54, 70, 128, 79, 48, 48, 54, 69, 128, 79, 48, 48, 54, 68, - 128, 79, 48, 48, 54, 67, 128, 79, 48, 48, 54, 66, 128, 79, 48, 48, 54, - 65, 128, 79, 48, 48, 54, 128, 79, 48, 48, 53, 65, 128, 79, 48, 48, 53, - 128, 79, 48, 48, 52, 128, 79, 48, 48, 51, 128, 79, 48, 48, 50, 128, 79, - 48, 48, 49, 65, 128, 79, 48, 48, 49, 128, 79, 45, 89, 69, 128, 79, 45, - 79, 45, 73, 128, 79, 45, 69, 128, 78, 90, 89, 88, 128, 78, 90, 89, 84, - 128, 78, 90, 89, 82, 88, 128, 78, 90, 89, 82, 128, 78, 90, 89, 80, 128, - 78, 90, 89, 128, 78, 90, 85, 88, 128, 78, 90, 85, 82, 88, 128, 78, 90, - 85, 82, 128, 78, 90, 85, 81, 128, 78, 90, 85, 80, 128, 78, 90, 85, 79, - 88, 128, 78, 90, 85, 79, 128, 78, 90, 85, 206, 78, 90, 85, 128, 78, 90, - 79, 88, 128, 78, 90, 79, 80, 128, 78, 90, 73, 88, 128, 78, 90, 73, 84, - 128, 78, 90, 73, 80, 128, 78, 90, 73, 69, 88, 128, 78, 90, 73, 69, 80, - 128, 78, 90, 73, 69, 128, 78, 90, 73, 128, 78, 90, 69, 88, 128, 78, 90, - 69, 85, 77, 128, 78, 90, 69, 128, 78, 90, 65, 88, 128, 78, 90, 65, 84, - 128, 78, 90, 65, 81, 128, 78, 90, 65, 80, 128, 78, 90, 65, 128, 78, 90, - 193, 78, 89, 87, 65, 128, 78, 89, 85, 88, 128, 78, 89, 85, 85, 128, 78, - 89, 85, 84, 128, 78, 89, 85, 80, 128, 78, 89, 85, 79, 88, 128, 78, 89, - 85, 79, 80, 128, 78, 89, 85, 79, 128, 78, 89, 85, 78, 128, 78, 89, 85, - 69, 128, 78, 89, 85, 128, 78, 89, 79, 88, 128, 78, 89, 79, 84, 128, 78, - 89, 79, 80, 128, 78, 89, 79, 79, 128, 78, 89, 79, 78, 128, 78, 89, 79, - 65, 128, 78, 89, 79, 128, 78, 89, 74, 65, 128, 78, 89, 73, 88, 128, 78, - 89, 73, 84, 128, 78, 89, 73, 212, 78, 89, 73, 211, 78, 89, 73, 210, 78, - 89, 73, 80, 128, 78, 89, 73, 78, 45, 68, 79, 128, 78, 89, 73, 78, 128, - 78, 89, 73, 73, 128, 78, 89, 73, 69, 88, 128, 78, 89, 73, 69, 84, 128, - 78, 89, 73, 69, 80, 128, 78, 89, 73, 69, 128, 78, 89, 73, 65, 75, 69, 78, - 199, 78, 89, 73, 128, 78, 89, 201, 78, 89, 72, 65, 128, 78, 89, 69, 84, - 128, 78, 89, 69, 212, 78, 89, 69, 78, 128, 78, 89, 69, 72, 128, 78, 89, - 69, 200, 78, 89, 69, 69, 128, 78, 89, 69, 128, 78, 89, 196, 78, 89, 67, - 65, 128, 78, 89, 65, 85, 128, 78, 89, 65, 74, 128, 78, 89, 65, 73, 128, - 78, 89, 65, 72, 128, 78, 89, 65, 69, 77, 65, 69, 128, 78, 89, 65, 65, - 128, 78, 87, 79, 79, 128, 78, 87, 79, 128, 78, 87, 73, 73, 128, 78, 87, - 73, 128, 78, 87, 69, 128, 78, 87, 65, 65, 128, 78, 87, 65, 128, 78, 87, - 128, 78, 86, 128, 78, 85, 88, 128, 78, 85, 85, 78, 128, 78, 85, 85, 128, - 78, 85, 84, 73, 76, 76, 85, 128, 78, 85, 84, 128, 78, 85, 212, 78, 85, - 82, 88, 128, 78, 85, 82, 128, 78, 85, 80, 128, 78, 85, 79, 88, 128, 78, - 85, 79, 80, 128, 78, 85, 79, 128, 78, 85, 78, 85, 90, 128, 78, 85, 78, - 85, 218, 78, 85, 78, 71, 128, 78, 85, 78, 65, 86, 85, 212, 78, 85, 78, - 65, 86, 73, 203, 78, 85, 78, 128, 78, 85, 206, 78, 85, 77, 69, 82, 207, - 78, 85, 77, 69, 82, 65, 84, 79, 210, 78, 85, 77, 69, 82, 65, 204, 78, 85, - 77, 66, 69, 82, 83, 128, 78, 85, 77, 66, 69, 82, 128, 78, 85, 77, 128, - 78, 85, 76, 76, 128, 78, 85, 76, 204, 78, 85, 76, 128, 78, 85, 75, 84, - 65, 128, 78, 85, 75, 84, 193, 78, 85, 69, 78, 71, 128, 78, 85, 69, 128, - 78, 85, 66, 73, 65, 206, 78, 85, 65, 69, 128, 78, 85, 49, 49, 128, 78, - 85, 49, 177, 78, 85, 48, 50, 50, 65, 128, 78, 85, 48, 50, 50, 128, 78, - 85, 48, 50, 49, 128, 78, 85, 48, 50, 48, 128, 78, 85, 48, 49, 57, 128, - 78, 85, 48, 49, 56, 65, 128, 78, 85, 48, 49, 56, 128, 78, 85, 48, 49, 55, - 128, 78, 85, 48, 49, 54, 128, 78, 85, 48, 49, 53, 128, 78, 85, 48, 49, - 52, 128, 78, 85, 48, 49, 51, 128, 78, 85, 48, 49, 50, 128, 78, 85, 48, - 49, 49, 65, 128, 78, 85, 48, 49, 49, 128, 78, 85, 48, 49, 48, 65, 128, - 78, 85, 48, 49, 48, 128, 78, 85, 48, 48, 57, 128, 78, 85, 48, 48, 56, - 128, 78, 85, 48, 48, 55, 128, 78, 85, 48, 48, 54, 128, 78, 85, 48, 48, - 53, 128, 78, 85, 48, 48, 52, 128, 78, 85, 48, 48, 51, 128, 78, 85, 48, - 48, 50, 128, 78, 85, 48, 48, 49, 128, 78, 85, 45, 51, 128, 78, 85, 45, - 50, 128, 78, 85, 45, 49, 128, 78, 84, 88, 73, 86, 128, 78, 84, 88, 65, - 128, 78, 84, 85, 85, 128, 78, 84, 85, 77, 128, 78, 84, 85, 74, 128, 78, - 84, 213, 78, 84, 83, 65, 85, 128, 78, 84, 83, 65, 128, 78, 84, 79, 81, - 80, 69, 78, 128, 78, 84, 79, 71, 128, 78, 84, 79, 199, 78, 84, 73, 69, - 197, 78, 84, 72, 65, 85, 128, 78, 84, 69, 85, 78, 71, 66, 65, 128, 78, - 84, 69, 85, 77, 128, 78, 84, 69, 78, 128, 78, 84, 69, 69, 128, 78, 84, - 65, 80, 128, 78, 84, 65, 208, 78, 84, 65, 65, 128, 78, 84, 65, 128, 78, - 83, 85, 79, 212, 78, 83, 85, 78, 128, 78, 83, 85, 77, 128, 78, 83, 79, - 77, 128, 78, 83, 73, 69, 69, 84, 128, 78, 83, 73, 69, 69, 80, 128, 78, - 83, 73, 69, 69, 128, 78, 83, 72, 85, 84, 128, 78, 83, 72, 85, 212, 78, - 83, 72, 85, 79, 80, 128, 78, 83, 72, 85, 69, 128, 78, 83, 72, 73, 69, 69, - 128, 78, 83, 72, 69, 69, 128, 78, 83, 72, 65, 81, 128, 78, 83, 72, 65, - 128, 78, 83, 69, 85, 65, 69, 78, 128, 78, 83, 69, 78, 128, 78, 83, 65, - 128, 78, 82, 89, 88, 128, 78, 82, 89, 84, 128, 78, 82, 89, 82, 88, 128, - 78, 82, 89, 82, 128, 78, 82, 89, 80, 128, 78, 82, 89, 128, 78, 82, 85, - 88, 128, 78, 82, 85, 84, 128, 78, 82, 85, 82, 88, 128, 78, 82, 85, 82, - 128, 78, 82, 85, 80, 128, 78, 82, 85, 65, 128, 78, 82, 85, 128, 78, 82, - 79, 88, 128, 78, 82, 79, 80, 128, 78, 82, 79, 128, 78, 82, 69, 88, 128, - 78, 82, 69, 84, 128, 78, 82, 69, 211, 78, 82, 69, 80, 128, 78, 82, 69, - 128, 78, 82, 65, 88, 128, 78, 82, 65, 84, 128, 78, 82, 65, 80, 128, 78, - 82, 65, 128, 78, 81, 73, 71, 128, 78, 81, 65, 128, 78, 80, 76, 65, 128, - 78, 80, 65, 128, 78, 79, 89, 128, 78, 79, 88, 128, 78, 79, 87, 67, 128, - 78, 79, 86, 73, 76, 69, 128, 78, 79, 86, 69, 77, 66, 69, 82, 128, 78, 79, - 84, 84, 79, 128, 78, 79, 84, 69, 83, 128, 78, 79, 84, 69, 72, 69, 65, 68, - 128, 78, 79, 84, 69, 72, 69, 65, 196, 78, 79, 84, 69, 66, 79, 79, 75, - 128, 78, 79, 84, 69, 66, 79, 79, 203, 78, 79, 84, 69, 128, 78, 79, 84, - 197, 78, 79, 84, 67, 72, 69, 196, 78, 79, 84, 67, 72, 128, 78, 79, 84, - 65, 84, 73, 79, 206, 78, 79, 84, 128, 78, 79, 212, 78, 79, 83, 69, 128, - 78, 79, 83, 197, 78, 79, 82, 84, 72, 87, 69, 83, 212, 78, 79, 82, 84, 72, - 69, 82, 206, 78, 79, 82, 84, 72, 69, 65, 83, 84, 45, 80, 79, 73, 78, 84, - 73, 78, 199, 78, 79, 82, 77, 65, 204, 78, 79, 82, 68, 73, 195, 78, 79, - 210, 78, 79, 80, 128, 78, 79, 79, 78, 85, 128, 78, 79, 79, 128, 78, 79, - 78, 70, 79, 82, 75, 73, 78, 71, 128, 78, 79, 78, 45, 80, 79, 84, 65, 66, - 76, 197, 78, 79, 78, 45, 74, 79, 73, 78, 69, 82, 128, 78, 79, 78, 45, 66, - 82, 69, 65, 75, 73, 78, 199, 78, 79, 78, 128, 78, 79, 77, 73, 83, 77, - 193, 78, 79, 77, 73, 78, 65, 204, 78, 79, 75, 72, 85, 75, 128, 78, 79, - 68, 69, 128, 78, 79, 65, 128, 78, 79, 45, 66, 82, 69, 65, 203, 78, 79, - 45, 53, 128, 78, 79, 45, 52, 128, 78, 79, 45, 51, 128, 78, 79, 45, 50, - 128, 78, 79, 45, 49, 128, 78, 78, 85, 85, 128, 78, 78, 85, 128, 78, 78, - 79, 79, 128, 78, 78, 79, 128, 78, 78, 78, 85, 85, 128, 78, 78, 78, 85, - 128, 78, 78, 78, 79, 79, 128, 78, 78, 78, 79, 128, 78, 78, 78, 73, 73, - 128, 78, 78, 78, 73, 128, 78, 78, 78, 69, 69, 128, 78, 78, 78, 69, 128, - 78, 78, 78, 65, 85, 128, 78, 78, 78, 65, 73, 128, 78, 78, 78, 65, 65, - 128, 78, 78, 78, 65, 128, 78, 78, 78, 128, 78, 78, 72, 65, 128, 78, 78, - 71, 79, 79, 128, 78, 78, 71, 79, 128, 78, 78, 71, 73, 73, 128, 78, 78, - 71, 73, 128, 78, 78, 71, 65, 65, 128, 78, 78, 71, 65, 128, 78, 78, 71, - 128, 78, 78, 66, 83, 80, 128, 78, 77, 128, 78, 76, 65, 85, 128, 78, 76, - 48, 50, 48, 128, 78, 76, 48, 49, 57, 128, 78, 76, 48, 49, 56, 128, 78, - 76, 48, 49, 55, 65, 128, 78, 76, 48, 49, 55, 128, 78, 76, 48, 49, 54, - 128, 78, 76, 48, 49, 53, 128, 78, 76, 48, 49, 52, 128, 78, 76, 48, 49, - 51, 128, 78, 76, 48, 49, 50, 128, 78, 76, 48, 49, 49, 128, 78, 76, 48, - 49, 48, 128, 78, 76, 48, 48, 57, 128, 78, 76, 48, 48, 56, 128, 78, 76, - 48, 48, 55, 128, 78, 76, 48, 48, 54, 128, 78, 76, 48, 48, 53, 65, 128, - 78, 76, 48, 48, 53, 128, 78, 76, 48, 48, 52, 128, 78, 76, 48, 48, 51, - 128, 78, 76, 48, 48, 50, 128, 78, 76, 48, 48, 49, 128, 78, 76, 128, 78, - 75, 79, 77, 128, 78, 75, 207, 78, 75, 73, 78, 68, 73, 128, 78, 75, 65, - 85, 128, 78, 75, 65, 65, 82, 65, 69, 128, 78, 75, 65, 128, 78, 74, 89, - 88, 128, 78, 74, 89, 84, 128, 78, 74, 89, 82, 88, 128, 78, 74, 89, 82, - 128, 78, 74, 89, 80, 128, 78, 74, 89, 128, 78, 74, 85, 88, 128, 78, 74, - 85, 82, 88, 128, 78, 74, 85, 82, 128, 78, 74, 85, 81, 65, 128, 78, 74, - 85, 80, 128, 78, 74, 85, 79, 88, 128, 78, 74, 85, 79, 128, 78, 74, 85, - 69, 81, 128, 78, 74, 85, 65, 69, 128, 78, 74, 85, 128, 78, 74, 79, 88, - 128, 78, 74, 79, 84, 128, 78, 74, 79, 80, 128, 78, 74, 79, 79, 128, 78, - 74, 79, 128, 78, 74, 73, 88, 128, 78, 74, 73, 84, 128, 78, 74, 73, 80, - 128, 78, 74, 73, 69, 88, 128, 78, 74, 73, 69, 84, 128, 78, 74, 73, 69, - 80, 128, 78, 74, 73, 69, 69, 128, 78, 74, 73, 69, 128, 78, 74, 73, 128, - 78, 74, 201, 78, 74, 69, 85, 88, 128, 78, 74, 69, 85, 84, 128, 78, 74, - 69, 85, 65, 69, 78, 65, 128, 78, 74, 69, 85, 65, 69, 77, 128, 78, 74, 69, - 69, 69, 69, 128, 78, 74, 69, 69, 128, 78, 74, 69, 197, 78, 74, 69, 128, - 78, 74, 65, 81, 128, 78, 74, 65, 80, 128, 78, 74, 65, 69, 77, 76, 73, - 128, 78, 74, 65, 69, 77, 128, 78, 74, 65, 65, 128, 78, 73, 88, 128, 78, - 73, 84, 82, 69, 128, 78, 73, 83, 65, 71, 128, 78, 73, 82, 85, 71, 85, - 128, 78, 73, 80, 128, 78, 73, 78, 84, 72, 128, 78, 73, 78, 69, 84, 89, - 128, 78, 73, 78, 69, 84, 217, 78, 73, 78, 69, 84, 69, 69, 78, 128, 78, - 73, 78, 69, 84, 69, 69, 206, 78, 73, 78, 69, 45, 84, 72, 73, 82, 84, 89, - 128, 78, 73, 78, 197, 78, 73, 78, 68, 65, 50, 128, 78, 73, 78, 68, 65, - 178, 78, 73, 78, 57, 128, 78, 73, 78, 128, 78, 73, 77, 128, 78, 73, 205, - 78, 73, 75, 79, 76, 83, 66, 85, 82, 199, 78, 73, 75, 72, 65, 72, 73, 84, - 128, 78, 73, 75, 65, 72, 73, 84, 128, 78, 73, 75, 65, 128, 78, 73, 72, - 83, 72, 86, 65, 83, 65, 128, 78, 73, 71, 73, 68, 65, 77, 73, 78, 128, 78, - 73, 71, 73, 68, 65, 69, 83, 72, 128, 78, 73, 71, 72, 84, 128, 78, 73, 71, - 72, 212, 78, 73, 71, 71, 65, 72, 73, 84, 65, 128, 78, 73, 69, 88, 128, - 78, 73, 69, 85, 78, 45, 84, 73, 75, 69, 85, 84, 128, 78, 73, 69, 85, 78, - 45, 84, 72, 73, 69, 85, 84, 72, 128, 78, 73, 69, 85, 78, 45, 83, 73, 79, - 83, 128, 78, 73, 69, 85, 78, 45, 82, 73, 69, 85, 76, 128, 78, 73, 69, 85, - 78, 45, 80, 73, 69, 85, 80, 128, 78, 73, 69, 85, 78, 45, 80, 65, 78, 83, - 73, 79, 83, 128, 78, 73, 69, 85, 78, 45, 75, 73, 89, 69, 79, 75, 128, 78, - 73, 69, 85, 78, 45, 72, 73, 69, 85, 72, 128, 78, 73, 69, 85, 78, 45, 67, - 73, 69, 85, 67, 128, 78, 73, 69, 85, 78, 45, 67, 72, 73, 69, 85, 67, 72, - 128, 78, 73, 69, 85, 206, 78, 73, 69, 80, 128, 78, 73, 69, 128, 78, 73, - 66, 128, 78, 73, 65, 128, 78, 73, 50, 128, 78, 73, 45, 84, 69, 128, 78, - 73, 45, 55, 128, 78, 73, 45, 54, 128, 78, 73, 45, 53, 128, 78, 73, 45, - 52, 128, 78, 73, 45, 51, 128, 78, 73, 45, 50, 128, 78, 73, 45, 49, 128, - 78, 72, 85, 69, 128, 78, 72, 74, 65, 128, 78, 72, 128, 78, 71, 89, 69, - 128, 78, 71, 86, 69, 128, 78, 71, 85, 85, 128, 78, 71, 85, 79, 88, 128, - 78, 71, 85, 79, 84, 128, 78, 71, 85, 79, 128, 78, 71, 85, 65, 78, 128, - 78, 71, 85, 65, 69, 84, 128, 78, 71, 85, 65, 69, 128, 78, 71, 79, 88, - 128, 78, 71, 79, 85, 128, 78, 71, 79, 213, 78, 71, 79, 84, 128, 78, 71, - 79, 81, 128, 78, 71, 79, 80, 128, 78, 71, 79, 78, 128, 78, 71, 79, 77, - 128, 78, 71, 79, 69, 72, 128, 78, 71, 79, 69, 200, 78, 71, 207, 78, 71, - 75, 89, 69, 69, 128, 78, 71, 75, 87, 65, 69, 78, 128, 78, 71, 75, 85, 80, - 128, 78, 71, 75, 85, 78, 128, 78, 71, 75, 85, 77, 128, 78, 71, 75, 85, - 69, 78, 90, 69, 85, 77, 128, 78, 71, 75, 85, 197, 78, 71, 75, 73, 78, 68, - 201, 78, 71, 75, 73, 69, 69, 128, 78, 71, 75, 69, 85, 88, 128, 78, 71, - 75, 69, 85, 82, 73, 128, 78, 71, 75, 69, 85, 65, 69, 81, 128, 78, 71, 75, - 69, 85, 65, 69, 77, 128, 78, 71, 75, 65, 81, 128, 78, 71, 75, 65, 80, - 128, 78, 71, 75, 65, 65, 77, 73, 128, 78, 71, 75, 65, 128, 78, 71, 73, - 69, 88, 128, 78, 71, 73, 69, 80, 128, 78, 71, 73, 69, 128, 78, 71, 72, - 65, 128, 78, 71, 71, 87, 65, 69, 78, 128, 78, 71, 71, 85, 82, 65, 69, - 128, 78, 71, 71, 85, 80, 128, 78, 71, 71, 85, 79, 81, 128, 78, 71, 71, - 85, 79, 209, 78, 71, 71, 85, 79, 78, 128, 78, 71, 71, 85, 79, 77, 128, - 78, 71, 71, 85, 77, 128, 78, 71, 71, 85, 69, 69, 84, 128, 78, 71, 71, 85, - 65, 69, 83, 72, 65, 197, 78, 71, 71, 85, 65, 69, 206, 78, 71, 71, 85, 65, - 128, 78, 71, 71, 85, 128, 78, 71, 71, 79, 79, 128, 78, 71, 71, 79, 128, - 78, 71, 71, 73, 128, 78, 71, 71, 69, 85, 88, 128, 78, 71, 71, 69, 85, 65, - 69, 84, 128, 78, 71, 71, 69, 85, 65, 69, 128, 78, 71, 71, 69, 213, 78, - 71, 71, 69, 78, 128, 78, 71, 71, 69, 69, 84, 128, 78, 71, 71, 69, 69, 69, - 69, 128, 78, 71, 71, 69, 69, 128, 78, 71, 71, 69, 128, 78, 71, 71, 65, - 80, 128, 78, 71, 71, 65, 65, 77, 65, 69, 128, 78, 71, 71, 65, 65, 77, - 128, 78, 71, 71, 65, 65, 128, 78, 71, 71, 128, 78, 71, 69, 88, 128, 78, - 71, 69, 85, 82, 69, 85, 84, 128, 78, 71, 69, 80, 128, 78, 71, 69, 78, - 128, 78, 71, 69, 69, 128, 78, 71, 69, 65, 68, 65, 76, 128, 78, 71, 65, - 88, 128, 78, 71, 65, 85, 128, 78, 71, 65, 84, 128, 78, 71, 65, 211, 78, - 71, 65, 81, 128, 78, 71, 65, 80, 128, 78, 71, 65, 78, 71, 85, 128, 78, - 71, 65, 78, 128, 78, 71, 65, 73, 128, 78, 71, 65, 72, 128, 78, 71, 65, - 65, 73, 128, 78, 71, 193, 78, 70, 128, 78, 69, 88, 212, 78, 69, 88, 128, - 78, 69, 87, 83, 80, 65, 80, 69, 82, 128, 78, 69, 87, 76, 73, 78, 69, 128, - 78, 69, 87, 76, 73, 78, 197, 78, 69, 87, 193, 78, 69, 87, 128, 78, 69, - 215, 78, 69, 85, 84, 82, 65, 76, 128, 78, 69, 85, 84, 82, 65, 204, 78, - 69, 85, 84, 69, 82, 128, 78, 69, 84, 87, 79, 82, 75, 69, 196, 78, 69, - 212, 78, 69, 83, 84, 69, 196, 78, 69, 83, 83, 85, 83, 128, 78, 69, 82, + 128, 80, 69, 79, 80, 76, 197, 80, 69, 78, 84, 65, 84, 72, 76, 79, 78, + 128, 80, 69, 78, 84, 65, 83, 69, 77, 69, 128, 80, 69, 78, 84, 65, 71, 82, + 65, 77, 128, 80, 69, 78, 84, 65, 71, 79, 78, 128, 80, 69, 78, 83, 85, + 128, 80, 69, 78, 83, 73, 86, 197, 80, 69, 78, 78, 217, 80, 69, 78, 78, + 65, 78, 84, 128, 80, 69, 78, 73, 72, 73, 128, 80, 69, 78, 71, 85, 73, 78, + 128, 80, 69, 78, 71, 75, 65, 76, 128, 80, 69, 78, 69, 84, 82, 65, 84, 73, + 79, 78, 128, 80, 69, 78, 67, 73, 76, 128, 80, 69, 206, 80, 69, 76, 65, + 83, 84, 79, 78, 128, 80, 69, 76, 65, 83, 84, 79, 206, 80, 69, 73, 84, 72, + 128, 80, 69, 72, 69, 72, 128, 80, 69, 72, 69, 200, 80, 69, 72, 128, 80, + 69, 200, 80, 69, 69, 90, 73, 128, 80, 69, 69, 83, 72, 73, 128, 80, 69, + 69, 80, 128, 80, 69, 69, 77, 128, 80, 69, 69, 73, 128, 80, 69, 69, 128, + 80, 69, 68, 69, 83, 84, 82, 73, 65, 78, 83, 128, 80, 69, 68, 69, 83, 84, + 82, 73, 65, 78, 128, 80, 69, 68, 69, 83, 84, 65, 76, 128, 80, 69, 68, 69, + 83, 84, 65, 204, 80, 69, 68, 65, 204, 80, 69, 65, 78, 85, 84, 83, 128, + 80, 69, 65, 75, 211, 80, 69, 65, 67, 79, 67, 75, 128, 80, 69, 65, 67, 72, + 128, 80, 69, 65, 67, 69, 128, 80, 69, 65, 67, 197, 80, 68, 73, 128, 80, + 68, 70, 128, 80, 68, 128, 80, 67, 128, 80, 65, 90, 69, 82, 128, 80, 65, + 89, 69, 82, 79, 75, 128, 80, 65, 89, 65, 78, 78, 65, 128, 80, 65, 89, + 128, 80, 65, 88, 128, 80, 65, 87, 78, 128, 80, 65, 87, 206, 80, 65, 215, + 80, 65, 86, 73, 89, 65, 78, 73, 128, 80, 65, 85, 83, 197, 80, 65, 85, + 128, 80, 65, 213, 80, 65, 84, 84, 217, 80, 65, 84, 84, 69, 82, 78, 128, + 80, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 80, 65, 84, 72, 65, 75, 75, + 85, 128, 80, 65, 84, 200, 80, 65, 84, 65, 75, 128, 80, 65, 84, 65, 72, + 128, 80, 65, 84, 128, 80, 65, 83, 85, 81, 128, 80, 65, 83, 83, 80, 79, + 82, 212, 80, 65, 83, 83, 73, 86, 69, 45, 80, 85, 76, 76, 45, 85, 80, 45, + 79, 85, 84, 80, 85, 212, 80, 65, 83, 83, 73, 86, 69, 45, 80, 85, 76, 76, + 45, 68, 79, 87, 78, 45, 79, 85, 84, 80, 85, 212, 80, 65, 83, 83, 73, 77, + 66, 65, 78, 71, 128, 80, 65, 83, 83, 69, 78, 71, 69, 210, 80, 65, 83, 83, + 69, 196, 80, 65, 83, 72, 84, 65, 128, 80, 65, 83, 72, 65, 69, 128, 80, + 65, 83, 69, 81, 128, 80, 65, 83, 65, 78, 71, 65, 206, 80, 65, 82, 85, 77, + 128, 80, 65, 82, 84, 217, 80, 65, 82, 84, 78, 69, 82, 83, 72, 73, 208, + 80, 65, 82, 84, 73, 65, 76, 76, 89, 45, 82, 69, 67, 89, 67, 76, 69, 196, + 80, 65, 82, 84, 73, 65, 204, 80, 65, 82, 84, 72, 73, 65, 206, 80, 65, 82, + 212, 80, 65, 82, 82, 79, 84, 128, 80, 65, 82, 75, 128, 80, 65, 82, 73, + 67, 72, 79, 78, 128, 80, 65, 82, 69, 83, 84, 73, 71, 77, 69, 78, 79, 206, + 80, 65, 82, 69, 82, 69, 78, 128, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, + 83, 128, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 211, 80, 65, 82, 69, 78, + 84, 72, 69, 83, 69, 211, 80, 65, 82, 65, 80, 72, 82, 65, 83, 197, 80, 65, + 82, 65, 76, 76, 69, 76, 79, 71, 82, 65, 77, 128, 80, 65, 82, 65, 76, 76, + 69, 76, 128, 80, 65, 82, 65, 76, 76, 69, 204, 80, 65, 82, 65, 75, 76, 73, + 84, 73, 75, 73, 128, 80, 65, 82, 65, 75, 76, 73, 84, 73, 75, 201, 80, 65, + 82, 65, 75, 65, 76, 69, 83, 77, 193, 80, 65, 82, 65, 71, 82, 65, 80, 72, + 85, 211, 80, 65, 82, 65, 71, 82, 65, 80, 72, 79, 83, 128, 80, 65, 82, 65, + 71, 82, 65, 80, 72, 128, 80, 65, 82, 65, 71, 82, 65, 80, 200, 80, 65, 82, + 65, 67, 72, 85, 84, 69, 128, 80, 65, 82, 65, 128, 80, 65, 82, 128, 80, + 65, 80, 89, 82, 85, 83, 128, 80, 65, 80, 69, 82, 67, 76, 73, 80, 83, 128, + 80, 65, 80, 69, 82, 67, 76, 73, 80, 128, 80, 65, 80, 69, 82, 128, 80, 65, + 80, 69, 210, 80, 65, 80, 128, 80, 65, 208, 80, 65, 207, 80, 65, 78, 89, + 85, 75, 85, 128, 80, 65, 78, 89, 73, 75, 85, 128, 80, 65, 78, 89, 69, 67, + 69, 75, 128, 80, 65, 78, 89, 65, 78, 71, 71, 65, 128, 80, 65, 78, 89, 65, + 75, 82, 65, 128, 80, 65, 78, 84, 73, 128, 80, 65, 78, 83, 73, 79, 83, 45, + 80, 73, 69, 85, 80, 128, 80, 65, 78, 83, 73, 79, 83, 45, 75, 65, 80, 89, + 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, 80, 65, 78, 79, 78, 71, 79, 78, + 65, 78, 128, 80, 65, 78, 79, 76, 79, 78, 71, 128, 80, 65, 78, 71, 87, 73, + 83, 65, 68, 128, 80, 65, 78, 71, 82, 65, 78, 71, 75, 69, 80, 128, 80, 65, + 78, 71, 79, 76, 65, 84, 128, 80, 65, 78, 71, 76, 79, 78, 71, 128, 80, 65, + 78, 71, 76, 65, 89, 65, 82, 128, 80, 65, 78, 71, 75, 79, 78, 128, 80, 65, + 78, 71, 75, 65, 84, 128, 80, 65, 78, 71, 72, 85, 76, 85, 128, 80, 65, 78, + 71, 128, 80, 65, 78, 69, 85, 76, 69, 85, 78, 71, 128, 80, 65, 78, 68, + 193, 80, 65, 78, 67, 65, 75, 69, 83, 128, 80, 65, 78, 65, 77, 128, 80, + 65, 78, 65, 69, 76, 65, 69, 78, 71, 128, 80, 65, 78, 128, 80, 65, 206, + 80, 65, 77, 85, 78, 71, 75, 65, 72, 128, 80, 65, 77, 85, 68, 80, 79, 68, + 128, 80, 65, 77, 83, 72, 65, 69, 128, 80, 65, 77, 80, 72, 89, 76, 73, 65, + 206, 80, 65, 77, 73, 78, 71, 75, 65, 76, 128, 80, 65, 77, 69, 80, 69, 84, + 128, 80, 65, 77, 69, 78, 69, 78, 71, 128, 80, 65, 77, 65, 68, 65, 128, + 80, 65, 77, 65, 65, 69, 72, 128, 80, 65, 76, 85, 84, 65, 128, 80, 65, 76, + 79, 67, 72, 75, 65, 128, 80, 65, 76, 77, 89, 82, 69, 78, 197, 80, 65, 76, + 77, 211, 80, 65, 76, 77, 128, 80, 65, 76, 205, 80, 65, 76, 76, 65, 87, + 65, 128, 80, 65, 76, 76, 65, 83, 128, 80, 65, 76, 201, 80, 65, 76, 69, + 84, 84, 69, 128, 80, 65, 76, 65, 85, 78, 199, 80, 65, 76, 65, 84, 65, 76, + 73, 90, 69, 196, 80, 65, 76, 65, 84, 65, 76, 73, 90, 65, 84, 73, 79, 78, + 128, 80, 65, 76, 65, 84, 65, 204, 80, 65, 75, 80, 65, 203, 80, 65, 73, + 89, 65, 78, 78, 79, 73, 128, 80, 65, 73, 82, 84, 72, 82, 65, 128, 80, 65, + 73, 82, 69, 196, 80, 65, 73, 78, 84, 66, 82, 85, 83, 72, 128, 80, 65, 73, + 128, 80, 65, 72, 76, 65, 86, 201, 80, 65, 72, 128, 80, 65, 71, 79, 68, + 65, 128, 80, 65, 71, 69, 83, 128, 80, 65, 71, 69, 82, 128, 80, 65, 71, + 197, 80, 65, 68, 77, 193, 80, 65, 68, 68, 76, 197, 80, 65, 68, 68, 73, + 78, 199, 80, 65, 68, 193, 80, 65, 68, 128, 80, 65, 67, 75, 73, 78, 71, + 128, 80, 65, 67, 75, 65, 71, 69, 128, 80, 65, 65, 84, 85, 128, 80, 65, + 65, 83, 69, 78, 84, 79, 128, 80, 65, 65, 82, 65, 77, 128, 80, 65, 65, 82, + 65, 69, 128, 80, 65, 65, 77, 128, 80, 65, 65, 73, 128, 80, 65, 65, 45, + 80, 73, 76, 76, 65, 128, 80, 65, 65, 128, 80, 50, 128, 80, 48, 49, 49, + 128, 80, 48, 49, 48, 128, 80, 48, 48, 57, 128, 80, 48, 48, 56, 128, 80, + 48, 48, 55, 128, 80, 48, 48, 54, 128, 80, 48, 48, 53, 128, 80, 48, 48, + 52, 128, 80, 48, 48, 51, 65, 128, 80, 48, 48, 51, 128, 80, 48, 48, 50, + 128, 80, 48, 48, 49, 65, 128, 80, 48, 48, 49, 128, 79, 89, 83, 84, 69, + 82, 128, 79, 89, 82, 65, 78, 73, 83, 77, 193, 79, 89, 65, 78, 78, 65, + 128, 79, 88, 73, 65, 128, 79, 88, 73, 193, 79, 88, 69, 73, 65, 201, 79, + 88, 69, 73, 193, 79, 87, 76, 128, 79, 86, 69, 82, 82, 73, 68, 69, 128, + 79, 86, 69, 82, 76, 79, 78, 199, 79, 86, 69, 82, 76, 73, 78, 69, 128, 79, + 86, 69, 82, 76, 65, 89, 128, 79, 86, 69, 82, 76, 65, 217, 79, 86, 69, 82, + 76, 65, 80, 80, 73, 78, 199, 79, 86, 69, 82, 76, 65, 80, 128, 79, 86, 69, + 82, 76, 65, 73, 68, 128, 79, 86, 69, 82, 76, 65, 73, 196, 79, 86, 69, 82, + 72, 69, 65, 84, 69, 196, 79, 86, 69, 82, 66, 65, 82, 128, 79, 86, 65, 76, + 128, 79, 86, 65, 204, 79, 85, 84, 76, 73, 78, 69, 196, 79, 85, 84, 76, + 73, 78, 69, 128, 79, 85, 84, 69, 210, 79, 85, 84, 66, 79, 216, 79, 85, + 78, 75, 73, 193, 79, 85, 78, 67, 69, 128, 79, 85, 78, 67, 197, 79, 84, + 85, 128, 79, 84, 84, 79, 77, 65, 206, 79, 84, 84, 69, 82, 128, 79, 84, + 84, 65, 86, 193, 79, 84, 84, 128, 79, 84, 72, 69, 82, 211, 79, 84, 72, + 69, 210, 79, 84, 72, 65, 76, 65, 206, 79, 84, 72, 65, 76, 128, 79, 83, + 77, 65, 78, 89, 193, 79, 83, 67, 128, 79, 83, 65, 71, 197, 79, 82, 84, + 72, 79, 71, 79, 78, 65, 204, 79, 82, 84, 72, 79, 68, 79, 216, 79, 82, 78, + 65, 84, 197, 79, 82, 78, 65, 77, 69, 78, 84, 83, 128, 79, 82, 78, 65, 77, + 69, 78, 84, 128, 79, 82, 78, 65, 77, 69, 78, 212, 79, 82, 75, 72, 79, + 206, 79, 82, 73, 89, 193, 79, 82, 73, 71, 73, 78, 65, 204, 79, 82, 73, + 71, 73, 78, 128, 79, 82, 69, 45, 50, 128, 79, 82, 68, 73, 78, 65, 204, + 79, 82, 68, 69, 210, 79, 82, 67, 72, 73, 68, 128, 79, 82, 65, 78, 71, 85, + 84, 65, 78, 128, 79, 82, 65, 78, 71, 197, 79, 80, 84, 73, 79, 206, 79, + 80, 84, 73, 67, 65, 204, 79, 80, 80, 82, 69, 83, 83, 73, 79, 78, 128, 79, + 80, 80, 79, 83, 73, 84, 73, 79, 78, 128, 79, 80, 80, 79, 83, 73, 78, 199, + 79, 80, 80, 79, 83, 69, 128, 79, 80, 72, 73, 85, 67, 72, 85, 83, 128, 79, + 80, 69, 82, 65, 84, 79, 82, 128, 79, 80, 69, 82, 65, 84, 79, 210, 79, 80, + 69, 82, 65, 84, 73, 78, 199, 79, 80, 69, 78, 73, 78, 199, 79, 80, 69, 78, + 45, 80, 128, 79, 80, 69, 78, 45, 79, 85, 84, 76, 73, 78, 69, 196, 79, 80, + 69, 78, 45, 79, 128, 79, 80, 69, 78, 45, 207, 79, 80, 69, 78, 45, 72, 69, + 65, 68, 69, 196, 79, 80, 69, 78, 45, 67, 73, 82, 67, 85, 73, 84, 45, 79, + 85, 84, 80, 85, 212, 79, 80, 69, 78, 128, 79, 80, 69, 206, 79, 79, 90, + 69, 128, 79, 79, 89, 65, 78, 78, 65, 128, 79, 79, 85, 128, 79, 79, 77, + 85, 128, 79, 79, 72, 128, 79, 79, 69, 128, 79, 79, 66, 79, 79, 70, 73, + 76, 73, 128, 79, 78, 85, 128, 79, 78, 83, 85, 128, 79, 78, 78, 128, 79, + 78, 75, 65, 82, 128, 79, 78, 73, 79, 78, 128, 79, 78, 69, 83, 69, 76, 70, + 128, 79, 78, 69, 45, 87, 65, 217, 79, 78, 69, 45, 84, 72, 73, 82, 84, 89, + 128, 79, 78, 69, 45, 80, 73, 69, 67, 197, 79, 78, 69, 45, 76, 73, 78, + 197, 79, 78, 69, 45, 72, 85, 78, 68, 82, 69, 68, 45, 65, 78, 68, 45, 83, + 73, 88, 84, 73, 69, 84, 72, 128, 79, 78, 67, 79, 77, 73, 78, 199, 79, 78, + 65, 80, 128, 79, 78, 45, 79, 70, 198, 79, 77, 73, 83, 83, 73, 79, 206, + 79, 77, 73, 67, 82, 79, 78, 128, 79, 77, 73, 67, 82, 79, 206, 79, 77, 69, + 71, 65, 128, 79, 77, 69, 71, 193, 79, 77, 65, 76, 79, 78, 128, 79, 76, + 73, 86, 69, 128, 79, 76, 73, 71, 79, 206, 79, 76, 68, 128, 79, 75, 84, + 207, 79, 75, 65, 82, 65, 128, 79, 75, 65, 82, 193, 79, 74, 73, 66, 87, + 65, 217, 79, 74, 69, 79, 78, 128, 79, 73, 78, 128, 79, 73, 76, 128, 79, + 73, 204, 79, 72, 77, 128, 79, 72, 205, 79, 71, 82, 69, 128, 79, 71, 79, + 78, 69, 75, 128, 79, 71, 79, 78, 69, 203, 79, 71, 72, 65, 205, 79, 70, + 70, 73, 67, 69, 82, 128, 79, 70, 70, 73, 67, 69, 128, 79, 70, 70, 73, 67, + 197, 79, 70, 70, 128, 79, 69, 89, 128, 79, 69, 82, 128, 79, 69, 75, 128, + 79, 69, 69, 128, 79, 68, 69, 78, 128, 79, 68, 68, 128, 79, 68, 196, 79, + 67, 84, 79, 80, 85, 83, 128, 79, 67, 84, 79, 66, 69, 82, 128, 79, 67, 84, + 69, 212, 79, 67, 84, 65, 71, 79, 78, 65, 204, 79, 67, 84, 65, 71, 79, 78, + 128, 79, 67, 210, 79, 67, 76, 79, 67, 75, 128, 79, 67, 67, 76, 85, 83, + 73, 79, 78, 128, 79, 66, 83, 84, 82, 85, 67, 84, 73, 79, 78, 128, 79, 66, + 83, 69, 82, 86, 69, 210, 79, 66, 79, 76, 211, 79, 66, 79, 204, 79, 66, + 79, 70, 73, 76, 73, 128, 79, 66, 76, 73, 81, 85, 197, 79, 66, 74, 69, 67, + 212, 79, 66, 69, 76, 85, 83, 128, 79, 66, 69, 76, 79, 83, 128, 79, 66, + 128, 79, 65, 89, 128, 79, 65, 75, 128, 79, 65, 66, 79, 65, 70, 73, 76, + 73, 128, 79, 193, 79, 48, 53, 49, 128, 79, 48, 53, 48, 66, 128, 79, 48, + 53, 48, 65, 128, 79, 48, 53, 48, 128, 79, 48, 52, 57, 128, 79, 48, 52, + 56, 128, 79, 48, 52, 55, 128, 79, 48, 52, 54, 128, 79, 48, 52, 53, 128, + 79, 48, 52, 52, 128, 79, 48, 52, 51, 128, 79, 48, 52, 50, 128, 79, 48, + 52, 49, 128, 79, 48, 52, 48, 128, 79, 48, 51, 57, 128, 79, 48, 51, 56, + 128, 79, 48, 51, 55, 128, 79, 48, 51, 54, 68, 128, 79, 48, 51, 54, 67, + 128, 79, 48, 51, 54, 66, 128, 79, 48, 51, 54, 65, 128, 79, 48, 51, 54, + 128, 79, 48, 51, 53, 128, 79, 48, 51, 52, 128, 79, 48, 51, 51, 65, 128, + 79, 48, 51, 51, 128, 79, 48, 51, 50, 128, 79, 48, 51, 49, 128, 79, 48, + 51, 48, 65, 128, 79, 48, 51, 48, 128, 79, 48, 50, 57, 65, 128, 79, 48, + 50, 57, 128, 79, 48, 50, 56, 128, 79, 48, 50, 55, 128, 79, 48, 50, 54, + 128, 79, 48, 50, 53, 65, 128, 79, 48, 50, 53, 128, 79, 48, 50, 52, 65, + 128, 79, 48, 50, 52, 128, 79, 48, 50, 51, 128, 79, 48, 50, 50, 128, 79, + 48, 50, 49, 128, 79, 48, 50, 48, 65, 128, 79, 48, 50, 48, 128, 79, 48, + 49, 57, 65, 128, 79, 48, 49, 57, 128, 79, 48, 49, 56, 128, 79, 48, 49, + 55, 128, 79, 48, 49, 54, 128, 79, 48, 49, 53, 128, 79, 48, 49, 52, 128, + 79, 48, 49, 51, 128, 79, 48, 49, 50, 128, 79, 48, 49, 49, 128, 79, 48, + 49, 48, 67, 128, 79, 48, 49, 48, 66, 128, 79, 48, 49, 48, 65, 128, 79, + 48, 49, 48, 128, 79, 48, 48, 57, 128, 79, 48, 48, 56, 128, 79, 48, 48, + 55, 128, 79, 48, 48, 54, 70, 128, 79, 48, 48, 54, 69, 128, 79, 48, 48, + 54, 68, 128, 79, 48, 48, 54, 67, 128, 79, 48, 48, 54, 66, 128, 79, 48, + 48, 54, 65, 128, 79, 48, 48, 54, 128, 79, 48, 48, 53, 65, 128, 79, 48, + 48, 53, 128, 79, 48, 48, 52, 128, 79, 48, 48, 51, 128, 79, 48, 48, 50, + 128, 79, 48, 48, 49, 65, 128, 79, 48, 48, 49, 128, 79, 45, 89, 69, 128, + 79, 45, 79, 45, 73, 128, 79, 45, 69, 128, 78, 90, 89, 88, 128, 78, 90, + 89, 84, 128, 78, 90, 89, 82, 88, 128, 78, 90, 89, 82, 128, 78, 90, 89, + 80, 128, 78, 90, 89, 128, 78, 90, 85, 88, 128, 78, 90, 85, 82, 88, 128, + 78, 90, 85, 82, 128, 78, 90, 85, 81, 128, 78, 90, 85, 80, 128, 78, 90, + 85, 79, 88, 128, 78, 90, 85, 79, 128, 78, 90, 85, 206, 78, 90, 85, 128, + 78, 90, 79, 88, 128, 78, 90, 79, 80, 128, 78, 90, 73, 88, 128, 78, 90, + 73, 84, 128, 78, 90, 73, 80, 128, 78, 90, 73, 69, 88, 128, 78, 90, 73, + 69, 80, 128, 78, 90, 73, 69, 128, 78, 90, 73, 128, 78, 90, 69, 88, 128, + 78, 90, 69, 85, 77, 128, 78, 90, 69, 128, 78, 90, 65, 88, 128, 78, 90, + 65, 84, 128, 78, 90, 65, 81, 128, 78, 90, 65, 80, 128, 78, 90, 65, 128, + 78, 90, 193, 78, 89, 87, 65, 128, 78, 89, 85, 88, 128, 78, 89, 85, 85, + 128, 78, 89, 85, 84, 128, 78, 89, 85, 80, 128, 78, 89, 85, 79, 88, 128, + 78, 89, 85, 79, 80, 128, 78, 89, 85, 79, 128, 78, 89, 85, 78, 128, 78, + 89, 85, 69, 128, 78, 89, 85, 128, 78, 89, 79, 88, 128, 78, 89, 79, 84, + 128, 78, 89, 79, 80, 128, 78, 89, 79, 79, 128, 78, 89, 79, 78, 128, 78, + 89, 79, 65, 128, 78, 89, 79, 128, 78, 89, 74, 65, 128, 78, 89, 73, 88, + 128, 78, 89, 73, 84, 128, 78, 89, 73, 212, 78, 89, 73, 211, 78, 89, 73, + 210, 78, 89, 73, 80, 128, 78, 89, 73, 78, 45, 68, 79, 128, 78, 89, 73, + 78, 128, 78, 89, 73, 73, 128, 78, 89, 73, 69, 88, 128, 78, 89, 73, 69, + 84, 128, 78, 89, 73, 69, 80, 128, 78, 89, 73, 69, 128, 78, 89, 73, 65, + 75, 69, 78, 199, 78, 89, 73, 128, 78, 89, 201, 78, 89, 72, 65, 128, 78, + 89, 69, 84, 128, 78, 89, 69, 212, 78, 89, 69, 78, 128, 78, 89, 69, 72, + 128, 78, 89, 69, 200, 78, 89, 69, 69, 128, 78, 89, 69, 128, 78, 89, 196, + 78, 89, 67, 65, 128, 78, 89, 65, 85, 128, 78, 89, 65, 74, 128, 78, 89, + 65, 73, 128, 78, 89, 65, 72, 128, 78, 89, 65, 69, 77, 65, 69, 128, 78, + 89, 65, 65, 128, 78, 87, 79, 79, 128, 78, 87, 79, 128, 78, 87, 73, 73, + 128, 78, 87, 73, 128, 78, 87, 69, 128, 78, 87, 65, 65, 128, 78, 87, 65, + 128, 78, 87, 128, 78, 86, 128, 78, 85, 88, 128, 78, 85, 85, 78, 128, 78, + 85, 85, 128, 78, 85, 84, 73, 76, 76, 85, 128, 78, 85, 84, 128, 78, 85, + 212, 78, 85, 82, 88, 128, 78, 85, 82, 128, 78, 85, 80, 128, 78, 85, 79, + 88, 128, 78, 85, 79, 80, 128, 78, 85, 79, 128, 78, 85, 78, 85, 90, 128, + 78, 85, 78, 85, 218, 78, 85, 78, 71, 128, 78, 85, 78, 65, 86, 85, 212, + 78, 85, 78, 65, 86, 73, 203, 78, 85, 78, 128, 78, 85, 206, 78, 85, 77, + 69, 82, 207, 78, 85, 77, 69, 82, 65, 84, 79, 210, 78, 85, 77, 69, 82, 65, + 204, 78, 85, 77, 66, 69, 82, 83, 128, 78, 85, 77, 66, 69, 82, 128, 78, + 85, 77, 128, 78, 85, 76, 76, 128, 78, 85, 76, 204, 78, 85, 76, 128, 78, + 85, 75, 84, 65, 128, 78, 85, 75, 84, 193, 78, 85, 69, 78, 71, 128, 78, + 85, 69, 128, 78, 85, 66, 73, 65, 206, 78, 85, 65, 69, 128, 78, 85, 49, + 49, 128, 78, 85, 49, 177, 78, 85, 48, 50, 50, 65, 128, 78, 85, 48, 50, + 50, 128, 78, 85, 48, 50, 49, 128, 78, 85, 48, 50, 48, 128, 78, 85, 48, + 49, 57, 128, 78, 85, 48, 49, 56, 65, 128, 78, 85, 48, 49, 56, 128, 78, + 85, 48, 49, 55, 128, 78, 85, 48, 49, 54, 128, 78, 85, 48, 49, 53, 128, + 78, 85, 48, 49, 52, 128, 78, 85, 48, 49, 51, 128, 78, 85, 48, 49, 50, + 128, 78, 85, 48, 49, 49, 65, 128, 78, 85, 48, 49, 49, 128, 78, 85, 48, + 49, 48, 65, 128, 78, 85, 48, 49, 48, 128, 78, 85, 48, 48, 57, 128, 78, + 85, 48, 48, 56, 128, 78, 85, 48, 48, 55, 128, 78, 85, 48, 48, 54, 128, + 78, 85, 48, 48, 53, 128, 78, 85, 48, 48, 52, 128, 78, 85, 48, 48, 51, + 128, 78, 85, 48, 48, 50, 128, 78, 85, 48, 48, 49, 128, 78, 85, 45, 51, + 128, 78, 85, 45, 50, 128, 78, 85, 45, 49, 128, 78, 84, 88, 73, 86, 128, + 78, 84, 88, 65, 128, 78, 84, 85, 85, 128, 78, 84, 85, 77, 128, 78, 84, + 85, 74, 128, 78, 84, 213, 78, 84, 83, 65, 85, 128, 78, 84, 83, 65, 128, + 78, 84, 79, 81, 80, 69, 78, 128, 78, 84, 79, 71, 128, 78, 84, 79, 199, + 78, 84, 73, 69, 197, 78, 84, 72, 65, 85, 128, 78, 84, 69, 85, 78, 71, 66, + 65, 128, 78, 84, 69, 85, 77, 128, 78, 84, 69, 78, 128, 78, 84, 69, 69, + 128, 78, 84, 65, 80, 128, 78, 84, 65, 208, 78, 84, 65, 65, 128, 78, 84, + 65, 128, 78, 83, 85, 79, 212, 78, 83, 85, 78, 128, 78, 83, 85, 77, 128, + 78, 83, 79, 77, 128, 78, 83, 73, 69, 69, 84, 128, 78, 83, 73, 69, 69, 80, + 128, 78, 83, 73, 69, 69, 128, 78, 83, 72, 85, 84, 128, 78, 83, 72, 85, + 212, 78, 83, 72, 85, 79, 80, 128, 78, 83, 72, 85, 69, 128, 78, 83, 72, + 73, 69, 69, 128, 78, 83, 72, 69, 69, 128, 78, 83, 72, 65, 81, 128, 78, + 83, 72, 65, 128, 78, 83, 69, 85, 65, 69, 78, 128, 78, 83, 69, 78, 128, + 78, 83, 65, 128, 78, 82, 89, 88, 128, 78, 82, 89, 84, 128, 78, 82, 89, + 82, 88, 128, 78, 82, 89, 82, 128, 78, 82, 89, 80, 128, 78, 82, 89, 128, + 78, 82, 85, 88, 128, 78, 82, 85, 84, 128, 78, 82, 85, 82, 88, 128, 78, + 82, 85, 82, 128, 78, 82, 85, 80, 128, 78, 82, 85, 65, 128, 78, 82, 85, + 128, 78, 82, 79, 88, 128, 78, 82, 79, 80, 128, 78, 82, 79, 128, 78, 82, + 69, 88, 128, 78, 82, 69, 84, 128, 78, 82, 69, 211, 78, 82, 69, 80, 128, + 78, 82, 69, 128, 78, 82, 65, 88, 128, 78, 82, 65, 84, 128, 78, 82, 65, + 80, 128, 78, 82, 65, 128, 78, 81, 73, 71, 128, 78, 81, 65, 128, 78, 80, + 76, 65, 128, 78, 80, 65, 128, 78, 79, 89, 128, 78, 79, 88, 128, 78, 79, + 87, 67, 128, 78, 79, 86, 73, 76, 69, 128, 78, 79, 86, 69, 77, 66, 69, 82, + 128, 78, 79, 84, 84, 79, 128, 78, 79, 84, 69, 83, 128, 78, 79, 84, 69, + 72, 69, 65, 68, 128, 78, 79, 84, 69, 72, 69, 65, 196, 78, 79, 84, 69, 66, + 79, 79, 75, 128, 78, 79, 84, 69, 66, 79, 79, 203, 78, 79, 84, 69, 128, + 78, 79, 84, 197, 78, 79, 84, 67, 72, 69, 196, 78, 79, 84, 67, 72, 128, + 78, 79, 84, 65, 84, 73, 79, 206, 78, 79, 84, 128, 78, 79, 212, 78, 79, + 83, 69, 128, 78, 79, 83, 197, 78, 79, 82, 84, 72, 87, 69, 83, 212, 78, + 79, 82, 84, 72, 69, 82, 206, 78, 79, 82, 84, 72, 69, 65, 83, 84, 45, 80, + 79, 73, 78, 84, 73, 78, 199, 78, 79, 82, 77, 65, 204, 78, 79, 82, 68, 73, + 195, 78, 79, 210, 78, 79, 80, 128, 78, 79, 79, 78, 85, 128, 78, 79, 79, + 128, 78, 79, 78, 70, 79, 82, 75, 73, 78, 71, 128, 78, 79, 78, 45, 80, 79, + 84, 65, 66, 76, 197, 78, 79, 78, 45, 74, 79, 73, 78, 69, 82, 128, 78, 79, + 78, 45, 66, 82, 69, 65, 75, 73, 78, 199, 78, 79, 78, 128, 78, 79, 77, 73, + 83, 77, 193, 78, 79, 77, 73, 78, 65, 204, 78, 79, 75, 72, 85, 75, 128, + 78, 79, 68, 69, 128, 78, 79, 65, 128, 78, 79, 45, 66, 82, 69, 65, 203, + 78, 79, 45, 53, 128, 78, 79, 45, 52, 128, 78, 79, 45, 51, 128, 78, 79, + 45, 50, 128, 78, 79, 45, 49, 128, 78, 78, 85, 85, 128, 78, 78, 85, 128, + 78, 78, 79, 79, 128, 78, 78, 79, 128, 78, 78, 78, 85, 85, 128, 78, 78, + 78, 85, 128, 78, 78, 78, 79, 79, 128, 78, 78, 78, 79, 128, 78, 78, 78, + 73, 73, 128, 78, 78, 78, 73, 128, 78, 78, 78, 69, 69, 128, 78, 78, 78, + 69, 128, 78, 78, 78, 65, 85, 128, 78, 78, 78, 65, 73, 128, 78, 78, 78, + 65, 65, 128, 78, 78, 78, 65, 128, 78, 78, 78, 128, 78, 78, 72, 65, 128, + 78, 78, 71, 79, 79, 128, 78, 78, 71, 79, 128, 78, 78, 71, 73, 73, 128, + 78, 78, 71, 73, 128, 78, 78, 71, 65, 65, 128, 78, 78, 71, 65, 128, 78, + 78, 71, 128, 78, 78, 66, 83, 80, 128, 78, 77, 128, 78, 76, 65, 85, 128, + 78, 76, 48, 50, 48, 128, 78, 76, 48, 49, 57, 128, 78, 76, 48, 49, 56, + 128, 78, 76, 48, 49, 55, 65, 128, 78, 76, 48, 49, 55, 128, 78, 76, 48, + 49, 54, 128, 78, 76, 48, 49, 53, 128, 78, 76, 48, 49, 52, 128, 78, 76, + 48, 49, 51, 128, 78, 76, 48, 49, 50, 128, 78, 76, 48, 49, 49, 128, 78, + 76, 48, 49, 48, 128, 78, 76, 48, 48, 57, 128, 78, 76, 48, 48, 56, 128, + 78, 76, 48, 48, 55, 128, 78, 76, 48, 48, 54, 128, 78, 76, 48, 48, 53, 65, + 128, 78, 76, 48, 48, 53, 128, 78, 76, 48, 48, 52, 128, 78, 76, 48, 48, + 51, 128, 78, 76, 48, 48, 50, 128, 78, 76, 48, 48, 49, 128, 78, 76, 128, + 78, 75, 79, 77, 128, 78, 75, 207, 78, 75, 73, 78, 68, 73, 128, 78, 75, + 65, 85, 128, 78, 75, 65, 65, 82, 65, 69, 128, 78, 75, 65, 128, 78, 74, + 89, 88, 128, 78, 74, 89, 84, 128, 78, 74, 89, 82, 88, 128, 78, 74, 89, + 82, 128, 78, 74, 89, 80, 128, 78, 74, 89, 128, 78, 74, 85, 88, 128, 78, + 74, 85, 82, 88, 128, 78, 74, 85, 82, 128, 78, 74, 85, 81, 65, 128, 78, + 74, 85, 80, 128, 78, 74, 85, 79, 88, 128, 78, 74, 85, 79, 128, 78, 74, + 85, 69, 81, 128, 78, 74, 85, 65, 69, 128, 78, 74, 85, 128, 78, 74, 79, + 88, 128, 78, 74, 79, 84, 128, 78, 74, 79, 80, 128, 78, 74, 79, 79, 128, + 78, 74, 79, 128, 78, 74, 73, 88, 128, 78, 74, 73, 84, 128, 78, 74, 73, + 80, 128, 78, 74, 73, 69, 88, 128, 78, 74, 73, 69, 84, 128, 78, 74, 73, + 69, 80, 128, 78, 74, 73, 69, 69, 128, 78, 74, 73, 69, 128, 78, 74, 73, + 128, 78, 74, 201, 78, 74, 69, 85, 88, 128, 78, 74, 69, 85, 84, 128, 78, + 74, 69, 85, 65, 69, 78, 65, 128, 78, 74, 69, 85, 65, 69, 77, 128, 78, 74, + 69, 69, 69, 69, 128, 78, 74, 69, 69, 128, 78, 74, 69, 197, 78, 74, 69, + 128, 78, 74, 65, 81, 128, 78, 74, 65, 80, 128, 78, 74, 65, 69, 77, 76, + 73, 128, 78, 74, 65, 69, 77, 128, 78, 74, 65, 65, 128, 78, 73, 88, 128, + 78, 73, 84, 82, 69, 128, 78, 73, 83, 65, 71, 128, 78, 73, 82, 85, 71, 85, + 128, 78, 73, 80, 128, 78, 73, 78, 84, 72, 128, 78, 73, 78, 74, 65, 128, + 78, 73, 78, 69, 84, 89, 128, 78, 73, 78, 69, 84, 217, 78, 73, 78, 69, 84, + 69, 69, 78, 128, 78, 73, 78, 69, 84, 69, 69, 206, 78, 73, 78, 69, 45, 84, + 72, 73, 82, 84, 89, 128, 78, 73, 78, 197, 78, 73, 78, 68, 65, 50, 128, + 78, 73, 78, 68, 65, 178, 78, 73, 78, 57, 128, 78, 73, 78, 128, 78, 73, + 77, 128, 78, 73, 205, 78, 73, 75, 79, 76, 83, 66, 85, 82, 199, 78, 73, + 75, 72, 65, 72, 73, 84, 128, 78, 73, 75, 65, 72, 73, 84, 128, 78, 73, 75, + 65, 128, 78, 73, 72, 83, 72, 86, 65, 83, 65, 128, 78, 73, 71, 73, 68, 65, + 77, 73, 78, 128, 78, 73, 71, 73, 68, 65, 69, 83, 72, 128, 78, 73, 71, 72, + 84, 128, 78, 73, 71, 72, 212, 78, 73, 71, 71, 65, 72, 73, 84, 65, 128, + 78, 73, 69, 88, 128, 78, 73, 69, 85, 78, 45, 84, 73, 75, 69, 85, 84, 128, + 78, 73, 69, 85, 78, 45, 84, 72, 73, 69, 85, 84, 72, 128, 78, 73, 69, 85, + 78, 45, 83, 73, 79, 83, 128, 78, 73, 69, 85, 78, 45, 82, 73, 69, 85, 76, + 128, 78, 73, 69, 85, 78, 45, 80, 73, 69, 85, 80, 128, 78, 73, 69, 85, 78, + 45, 80, 65, 78, 83, 73, 79, 83, 128, 78, 73, 69, 85, 78, 45, 75, 73, 89, + 69, 79, 75, 128, 78, 73, 69, 85, 78, 45, 72, 73, 69, 85, 72, 128, 78, 73, + 69, 85, 78, 45, 67, 73, 69, 85, 67, 128, 78, 73, 69, 85, 78, 45, 67, 72, + 73, 69, 85, 67, 72, 128, 78, 73, 69, 85, 206, 78, 73, 69, 80, 128, 78, + 73, 69, 128, 78, 73, 66, 128, 78, 73, 65, 128, 78, 73, 50, 128, 78, 73, + 45, 84, 69, 128, 78, 73, 45, 55, 128, 78, 73, 45, 54, 128, 78, 73, 45, + 53, 128, 78, 73, 45, 52, 128, 78, 73, 45, 51, 128, 78, 73, 45, 50, 128, + 78, 73, 45, 49, 128, 78, 72, 85, 69, 128, 78, 72, 74, 65, 128, 78, 72, + 65, 89, 128, 78, 72, 128, 78, 71, 89, 69, 128, 78, 71, 86, 69, 128, 78, + 71, 85, 85, 128, 78, 71, 85, 79, 88, 128, 78, 71, 85, 79, 84, 128, 78, + 71, 85, 79, 128, 78, 71, 85, 65, 78, 128, 78, 71, 85, 65, 69, 84, 128, + 78, 71, 85, 65, 69, 128, 78, 71, 79, 88, 128, 78, 71, 79, 85, 128, 78, + 71, 79, 213, 78, 71, 79, 84, 128, 78, 71, 79, 81, 128, 78, 71, 79, 80, + 128, 78, 71, 79, 78, 128, 78, 71, 79, 77, 128, 78, 71, 79, 69, 72, 128, + 78, 71, 79, 69, 200, 78, 71, 207, 78, 71, 75, 89, 69, 69, 128, 78, 71, + 75, 87, 65, 69, 78, 128, 78, 71, 75, 85, 80, 128, 78, 71, 75, 85, 78, + 128, 78, 71, 75, 85, 77, 128, 78, 71, 75, 85, 69, 78, 90, 69, 85, 77, + 128, 78, 71, 75, 85, 197, 78, 71, 75, 73, 78, 68, 201, 78, 71, 75, 73, + 69, 69, 128, 78, 71, 75, 69, 85, 88, 128, 78, 71, 75, 69, 85, 82, 73, + 128, 78, 71, 75, 69, 85, 65, 69, 81, 128, 78, 71, 75, 69, 85, 65, 69, 77, + 128, 78, 71, 75, 65, 81, 128, 78, 71, 75, 65, 80, 128, 78, 71, 75, 65, + 65, 77, 73, 128, 78, 71, 75, 65, 128, 78, 71, 73, 69, 88, 128, 78, 71, + 73, 69, 80, 128, 78, 71, 73, 69, 128, 78, 71, 72, 65, 128, 78, 71, 71, + 87, 65, 69, 78, 128, 78, 71, 71, 85, 82, 65, 69, 128, 78, 71, 71, 85, 80, + 128, 78, 71, 71, 85, 79, 81, 128, 78, 71, 71, 85, 79, 209, 78, 71, 71, + 85, 79, 78, 128, 78, 71, 71, 85, 79, 77, 128, 78, 71, 71, 85, 77, 128, + 78, 71, 71, 85, 69, 69, 84, 128, 78, 71, 71, 85, 65, 69, 83, 72, 65, 197, + 78, 71, 71, 85, 65, 69, 206, 78, 71, 71, 85, 65, 128, 78, 71, 71, 85, + 128, 78, 71, 71, 79, 79, 128, 78, 71, 71, 79, 128, 78, 71, 71, 73, 128, + 78, 71, 71, 69, 85, 88, 128, 78, 71, 71, 69, 85, 65, 69, 84, 128, 78, 71, + 71, 69, 85, 65, 69, 128, 78, 71, 71, 69, 213, 78, 71, 71, 69, 78, 128, + 78, 71, 71, 69, 69, 84, 128, 78, 71, 71, 69, 69, 69, 69, 128, 78, 71, 71, + 69, 69, 128, 78, 71, 71, 69, 128, 78, 71, 71, 65, 80, 128, 78, 71, 71, + 65, 65, 77, 65, 69, 128, 78, 71, 71, 65, 65, 77, 128, 78, 71, 71, 65, 65, + 128, 78, 71, 71, 128, 78, 71, 69, 88, 128, 78, 71, 69, 85, 82, 69, 85, + 84, 128, 78, 71, 69, 80, 128, 78, 71, 69, 78, 128, 78, 71, 69, 69, 128, + 78, 71, 69, 65, 68, 65, 76, 128, 78, 71, 65, 88, 128, 78, 71, 65, 85, + 128, 78, 71, 65, 84, 128, 78, 71, 65, 211, 78, 71, 65, 81, 128, 78, 71, + 65, 80, 128, 78, 71, 65, 78, 71, 85, 128, 78, 71, 65, 78, 128, 78, 71, + 65, 73, 128, 78, 71, 65, 72, 128, 78, 71, 65, 65, 73, 128, 78, 71, 193, + 78, 70, 128, 78, 69, 88, 212, 78, 69, 88, 128, 78, 69, 87, 83, 80, 65, + 80, 69, 82, 128, 78, 69, 87, 76, 73, 78, 69, 128, 78, 69, 87, 76, 73, 78, + 197, 78, 69, 87, 193, 78, 69, 87, 128, 78, 69, 215, 78, 69, 85, 84, 82, + 65, 76, 128, 78, 69, 85, 84, 82, 65, 204, 78, 69, 85, 84, 69, 82, 128, + 78, 69, 84, 87, 79, 82, 75, 69, 196, 78, 69, 212, 78, 69, 83, 84, 73, 78, + 199, 78, 69, 83, 84, 69, 196, 78, 69, 83, 83, 85, 83, 128, 78, 69, 82, 196, 78, 69, 81, 85, 68, 65, 65, 128, 78, 69, 80, 84, 85, 78, 69, 128, 78, 69, 80, 84, 85, 78, 197, 78, 69, 80, 128, 78, 69, 79, 128, 78, 69, 207, 78, 69, 78, 79, 69, 128, 78, 69, 78, 65, 78, 79, 128, 78, 69, 78, 128, 78, 69, 76, 128, 78, 69, 73, 84, 72, 69, 210, 78, 69, 71, 65, 84, 73, 86, 197, 78, 69, 71, 65, 84, 73, 79, 206, 78, 69, 71, 65, 84, 69, - 196, 78, 69, 67, 75, 84, 73, 69, 128, 78, 69, 67, 75, 128, 78, 69, 66, - 69, 78, 83, 84, 73, 77, 77, 69, 128, 78, 69, 45, 75, 79, 128, 78, 68, 85, - 88, 128, 78, 68, 85, 84, 128, 78, 68, 85, 82, 88, 128, 78, 68, 85, 82, - 128, 78, 68, 85, 80, 128, 78, 68, 85, 78, 128, 78, 68, 213, 78, 68, 79, - 88, 128, 78, 68, 79, 84, 128, 78, 68, 79, 80, 128, 78, 68, 79, 79, 128, - 78, 68, 79, 78, 128, 78, 68, 79, 77, 66, 85, 128, 78, 68, 79, 76, 197, - 78, 68, 73, 88, 128, 78, 68, 73, 84, 128, 78, 68, 73, 81, 128, 78, 68, - 73, 80, 128, 78, 68, 73, 69, 88, 128, 78, 68, 73, 69, 128, 78, 68, 73, - 68, 65, 128, 78, 68, 73, 65, 81, 128, 78, 68, 69, 88, 128, 78, 68, 69, - 85, 88, 128, 78, 68, 69, 85, 84, 128, 78, 68, 69, 85, 65, 69, 82, 69, 69, - 128, 78, 68, 69, 80, 128, 78, 68, 69, 69, 128, 78, 68, 69, 128, 78, 68, - 65, 88, 128, 78, 68, 65, 84, 128, 78, 68, 65, 80, 128, 78, 68, 65, 77, - 128, 78, 68, 65, 65, 78, 71, 71, 69, 85, 65, 69, 84, 128, 78, 68, 65, 65, - 128, 78, 68, 65, 193, 78, 67, 72, 65, 85, 128, 78, 67, 65, 128, 78, 66, - 89, 88, 128, 78, 66, 89, 84, 128, 78, 66, 89, 82, 88, 128, 78, 66, 89, - 82, 128, 78, 66, 89, 80, 128, 78, 66, 89, 128, 78, 66, 85, 88, 128, 78, - 66, 85, 84, 128, 78, 66, 85, 82, 88, 128, 78, 66, 85, 82, 128, 78, 66, - 85, 80, 128, 78, 66, 85, 128, 78, 66, 79, 88, 128, 78, 66, 79, 84, 128, - 78, 66, 79, 80, 128, 78, 66, 79, 128, 78, 66, 73, 88, 128, 78, 66, 73, - 84, 128, 78, 66, 73, 80, 128, 78, 66, 73, 69, 88, 128, 78, 66, 73, 69, - 80, 128, 78, 66, 73, 69, 128, 78, 66, 73, 128, 78, 66, 72, 128, 78, 66, - 65, 88, 128, 78, 66, 65, 84, 128, 78, 66, 65, 80, 128, 78, 66, 65, 128, - 78, 65, 90, 65, 210, 78, 65, 89, 65, 78, 78, 65, 128, 78, 65, 89, 128, - 78, 65, 88, 73, 65, 206, 78, 65, 88, 128, 78, 65, 85, 84, 72, 83, 128, - 78, 65, 85, 83, 69, 65, 84, 69, 196, 78, 65, 85, 68, 73, 218, 78, 65, 84, - 85, 82, 65, 204, 78, 65, 84, 73, 79, 78, 65, 204, 78, 65, 83, 75, 65, 80, - 201, 78, 65, 83, 72, 73, 128, 78, 65, 83, 65, 76, 73, 90, 65, 84, 73, 79, - 78, 128, 78, 65, 83, 65, 76, 73, 90, 65, 84, 73, 79, 206, 78, 65, 83, 65, - 204, 78, 65, 82, 82, 79, 215, 78, 65, 82, 128, 78, 65, 81, 128, 78, 65, - 79, 211, 78, 65, 78, 83, 65, 78, 65, 81, 128, 78, 65, 78, 71, 77, 79, 78, - 84, 72, 79, 128, 78, 65, 78, 68, 73, 78, 65, 71, 65, 82, 201, 78, 65, 78, - 68, 128, 78, 65, 78, 65, 128, 78, 65, 77, 69, 128, 78, 65, 77, 197, 78, - 65, 77, 50, 128, 78, 65, 75, 128, 78, 65, 73, 82, 193, 78, 65, 73, 204, - 78, 65, 71, 82, 201, 78, 65, 71, 65, 82, 128, 78, 65, 71, 65, 128, 78, - 65, 71, 193, 78, 65, 71, 128, 78, 65, 199, 78, 65, 69, 128, 78, 65, 66, - 76, 65, 128, 78, 65, 66, 65, 84, 65, 69, 65, 206, 78, 65, 65, 83, 73, 75, - 89, 65, 89, 65, 128, 78, 65, 65, 75, 83, 73, 75, 89, 65, 89, 65, 128, 78, - 65, 65, 73, 128, 78, 65, 193, 78, 65, 52, 128, 78, 65, 50, 128, 78, 65, - 45, 57, 128, 78, 65, 45, 56, 128, 78, 65, 45, 55, 128, 78, 65, 45, 54, - 128, 78, 65, 45, 53, 128, 78, 65, 45, 52, 128, 78, 65, 45, 51, 128, 78, - 65, 45, 50, 128, 78, 65, 45, 49, 128, 78, 48, 52, 50, 128, 78, 48, 52, - 49, 128, 78, 48, 52, 48, 128, 78, 48, 51, 57, 128, 78, 48, 51, 56, 128, - 78, 48, 51, 55, 65, 128, 78, 48, 51, 55, 128, 78, 48, 51, 54, 128, 78, - 48, 51, 53, 65, 128, 78, 48, 51, 53, 128, 78, 48, 51, 52, 65, 128, 78, - 48, 51, 52, 128, 78, 48, 51, 51, 65, 128, 78, 48, 51, 51, 128, 78, 48, - 51, 50, 128, 78, 48, 51, 49, 128, 78, 48, 51, 48, 128, 78, 48, 50, 57, - 128, 78, 48, 50, 56, 128, 78, 48, 50, 55, 128, 78, 48, 50, 54, 128, 78, - 48, 50, 53, 65, 128, 78, 48, 50, 53, 128, 78, 48, 50, 52, 128, 78, 48, - 50, 51, 128, 78, 48, 50, 50, 128, 78, 48, 50, 49, 128, 78, 48, 50, 48, - 128, 78, 48, 49, 57, 128, 78, 48, 49, 56, 66, 128, 78, 48, 49, 56, 65, - 128, 78, 48, 49, 56, 128, 78, 48, 49, 55, 128, 78, 48, 49, 54, 128, 78, - 48, 49, 53, 128, 78, 48, 49, 52, 128, 78, 48, 49, 51, 128, 78, 48, 49, - 50, 128, 78, 48, 49, 49, 128, 78, 48, 49, 48, 128, 78, 48, 48, 57, 128, - 78, 48, 48, 56, 128, 78, 48, 48, 55, 128, 78, 48, 48, 54, 128, 78, 48, - 48, 53, 128, 78, 48, 48, 52, 128, 78, 48, 48, 51, 128, 78, 48, 48, 50, - 128, 78, 48, 48, 49, 128, 78, 45, 77, 85, 45, 77, 79, 45, 50, 128, 78, - 45, 77, 85, 45, 77, 79, 45, 49, 128, 78, 45, 67, 82, 69, 197, 78, 45, 65, - 82, 217, 77, 89, 88, 128, 77, 89, 84, 128, 77, 89, 83, 76, 73, 84, 69, - 128, 77, 89, 80, 128, 77, 89, 65, 128, 77, 89, 193, 77, 89, 128, 77, 87, - 79, 79, 128, 77, 87, 79, 128, 77, 87, 73, 73, 128, 77, 87, 73, 128, 77, - 87, 69, 69, 128, 77, 87, 69, 128, 77, 87, 65, 65, 128, 77, 87, 65, 128, - 77, 87, 128, 77, 215, 77, 86, 83, 128, 77, 86, 79, 80, 128, 77, 86, 73, - 128, 77, 86, 69, 85, 65, 69, 78, 71, 65, 77, 128, 77, 86, 128, 77, 214, - 77, 85, 88, 128, 77, 85, 85, 86, 85, 90, 72, 65, 75, 75, 85, 128, 77, 85, - 85, 83, 73, 75, 65, 84, 79, 65, 78, 128, 77, 85, 85, 82, 68, 72, 65, 74, - 193, 77, 85, 85, 128, 77, 85, 84, 72, 65, 76, 73, 89, 65, 128, 77, 85, - 84, 128, 77, 85, 83, 73, 67, 128, 77, 85, 83, 73, 195, 77, 85, 83, 72, - 82, 79, 79, 77, 128, 77, 85, 83, 72, 51, 128, 77, 85, 83, 72, 179, 77, - 85, 83, 72, 128, 77, 85, 83, 200, 77, 85, 83, 128, 77, 85, 82, 88, 128, - 77, 85, 82, 71, 85, 50, 128, 77, 85, 82, 69, 128, 77, 85, 82, 68, 65, - 128, 77, 85, 82, 68, 193, 77, 85, 82, 128, 77, 85, 81, 68, 65, 77, 128, - 77, 85, 80, 128, 77, 85, 79, 88, 128, 77, 85, 79, 84, 128, 77, 85, 79, - 80, 128, 77, 85, 79, 77, 65, 69, 128, 77, 85, 79, 128, 77, 85, 78, 83, - 85, 66, 128, 77, 85, 78, 65, 72, 128, 77, 85, 78, 128, 77, 85, 76, 84, - 73, 83, 69, 84, 128, 77, 85, 76, 84, 73, 83, 69, 212, 77, 85, 76, 84, 73, - 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 77, 85, 76, 84, 73, 80, 76, 73, - 67, 65, 84, 73, 79, 206, 77, 85, 76, 84, 73, 80, 76, 69, 128, 77, 85, 76, - 84, 73, 80, 76, 197, 77, 85, 76, 84, 73, 79, 67, 85, 76, 65, 210, 77, 85, - 76, 84, 73, 77, 65, 80, 128, 77, 85, 76, 84, 201, 77, 85, 76, 84, 65, 78, - 201, 77, 85, 75, 80, 72, 82, 69, 78, 71, 128, 77, 85, 75, 75, 85, 82, 85, - 78, 73, 128, 77, 85, 73, 78, 128, 77, 85, 71, 83, 128, 77, 85, 71, 128, - 77, 85, 199, 77, 85, 69, 78, 128, 77, 85, 69, 128, 77, 85, 67, 72, 128, - 77, 85, 67, 200, 77, 85, 67, 65, 65, 68, 128, 77, 85, 65, 83, 128, 77, - 85, 65, 78, 128, 77, 85, 65, 69, 128, 77, 85, 45, 71, 65, 65, 72, 76, 65, - 193, 77, 85, 45, 52, 128, 77, 85, 45, 51, 128, 77, 85, 45, 50, 128, 77, - 85, 45, 49, 128, 77, 213, 77, 84, 65, 86, 82, 85, 76, 201, 77, 83, 128, - 77, 82, 207, 77, 210, 77, 80, 65, 128, 77, 79, 89, 65, 73, 128, 77, 79, - 88, 128, 77, 79, 86, 73, 197, 77, 79, 86, 69, 211, 77, 79, 86, 69, 77, - 69, 78, 84, 45, 87, 65, 76, 76, 80, 76, 65, 78, 197, 77, 79, 86, 69, 77, - 69, 78, 84, 45, 72, 73, 78, 71, 197, 77, 79, 86, 69, 77, 69, 78, 84, 45, - 70, 76, 79, 79, 82, 80, 76, 65, 78, 197, 77, 79, 86, 69, 77, 69, 78, 84, - 45, 68, 73, 65, 71, 79, 78, 65, 204, 77, 79, 86, 69, 77, 69, 78, 84, 128, - 77, 79, 86, 69, 77, 69, 78, 212, 77, 79, 86, 69, 196, 77, 79, 86, 69, - 128, 77, 79, 85, 84, 72, 128, 77, 79, 85, 83, 69, 128, 77, 79, 85, 83, - 197, 77, 79, 85, 78, 84, 65, 73, 78, 83, 128, 77, 79, 85, 78, 84, 65, 73, - 78, 128, 77, 79, 85, 78, 84, 65, 73, 206, 77, 79, 85, 78, 212, 77, 79, - 85, 78, 68, 128, 77, 79, 85, 78, 196, 77, 79, 84, 79, 82, 87, 65, 89, - 128, 77, 79, 84, 79, 82, 73, 90, 69, 196, 77, 79, 84, 79, 82, 67, 89, 67, - 76, 69, 128, 77, 79, 84, 79, 210, 77, 79, 84, 72, 69, 82, 128, 77, 79, - 84, 72, 69, 210, 77, 79, 84, 128, 77, 79, 83, 81, 85, 73, 84, 79, 128, - 77, 79, 83, 81, 85, 69, 128, 77, 79, 82, 84, 85, 85, 77, 128, 77, 79, 82, - 84, 65, 82, 128, 77, 79, 82, 80, 72, 79, 76, 79, 71, 73, 67, 65, 204, 77, - 79, 82, 78, 73, 78, 71, 128, 77, 79, 80, 128, 77, 79, 79, 83, 69, 45, 67, - 82, 69, 197, 77, 79, 79, 78, 128, 77, 79, 79, 206, 77, 79, 79, 77, 80, - 85, 81, 128, 77, 79, 79, 77, 69, 85, 84, 128, 77, 79, 79, 68, 128, 77, - 79, 79, 196, 77, 79, 79, 128, 77, 79, 78, 84, 73, 69, 69, 78, 128, 77, - 79, 78, 84, 72, 128, 77, 79, 78, 84, 200, 77, 79, 78, 83, 84, 69, 82, - 128, 77, 79, 78, 79, 83, 84, 65, 66, 76, 197, 77, 79, 78, 79, 83, 80, 65, - 67, 197, 77, 79, 78, 79, 82, 65, 73, 76, 128, 77, 79, 78, 79, 71, 82, 65, - 80, 200, 77, 79, 78, 79, 71, 82, 65, 77, 77, 79, 211, 77, 79, 78, 79, 71, - 82, 65, 205, 77, 79, 78, 79, 70, 79, 78, 73, 65, 83, 128, 77, 79, 78, 79, - 67, 85, 76, 65, 210, 77, 79, 78, 79, 67, 76, 69, 128, 77, 79, 78, 75, 69, - 89, 128, 77, 79, 78, 75, 69, 217, 77, 79, 78, 73, 128, 77, 79, 78, 71, - 75, 69, 85, 65, 69, 81, 128, 77, 79, 78, 69, 89, 45, 77, 79, 85, 84, 200, - 77, 79, 78, 69, 217, 77, 79, 78, 128, 77, 79, 206, 77, 79, 76, 128, 77, - 79, 72, 65, 77, 77, 65, 196, 77, 79, 68, 85, 76, 207, 77, 79, 68, 73, 70, - 73, 69, 82, 45, 57, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 56, 128, 77, - 79, 68, 73, 70, 73, 69, 82, 45, 55, 128, 77, 79, 68, 73, 70, 73, 69, 82, - 45, 54, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 53, 128, 77, 79, 68, 73, - 70, 73, 69, 82, 45, 52, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 51, 128, - 77, 79, 68, 73, 70, 73, 69, 82, 45, 50, 128, 77, 79, 68, 73, 70, 73, 69, - 82, 45, 49, 54, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 49, 53, 128, 77, - 79, 68, 73, 70, 73, 69, 82, 45, 49, 52, 128, 77, 79, 68, 73, 70, 73, 69, - 82, 45, 49, 51, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 49, 50, 128, 77, - 79, 68, 73, 70, 73, 69, 82, 45, 49, 49, 128, 77, 79, 68, 73, 70, 73, 69, - 82, 45, 49, 48, 128, 77, 79, 68, 73, 70, 73, 69, 82, 128, 77, 79, 68, - 201, 77, 79, 68, 69, 83, 84, 89, 128, 77, 79, 68, 69, 82, 206, 77, 79, - 68, 69, 77, 128, 77, 79, 68, 69, 76, 83, 128, 77, 79, 68, 69, 76, 128, - 77, 79, 68, 69, 128, 77, 79, 66, 73, 76, 197, 77, 79, 65, 128, 77, 79, - 45, 54, 128, 77, 79, 45, 53, 128, 77, 79, 45, 52, 128, 77, 79, 45, 51, - 128, 77, 207, 77, 78, 89, 65, 205, 77, 78, 65, 83, 128, 77, 77, 83, 80, - 128, 77, 77, 128, 77, 205, 77, 76, 65, 128, 77, 76, 128, 77, 75, 80, 65, - 82, 65, 209, 77, 73, 88, 128, 77, 73, 84, 128, 77, 73, 83, 82, 65, 128, - 77, 73, 82, 73, 66, 65, 65, 82, 85, 128, 77, 73, 82, 73, 128, 77, 73, 82, - 69, 68, 128, 77, 73, 80, 128, 77, 73, 78, 89, 128, 77, 73, 78, 85, 83, - 45, 79, 82, 45, 80, 76, 85, 211, 77, 73, 78, 85, 83, 128, 77, 73, 78, 73, - 83, 84, 69, 82, 128, 77, 73, 78, 73, 77, 73, 90, 69, 128, 77, 73, 78, 73, - 77, 65, 128, 77, 73, 78, 73, 68, 73, 83, 67, 128, 77, 73, 78, 73, 66, 85, - 83, 128, 77, 73, 77, 69, 128, 77, 73, 77, 128, 77, 73, 76, 76, 73, 79, - 78, 83, 128, 77, 73, 76, 76, 73, 79, 78, 211, 77, 73, 76, 76, 69, 84, - 128, 77, 73, 76, 76, 197, 77, 73, 76, 204, 77, 73, 76, 75, 217, 77, 73, - 76, 75, 128, 77, 73, 76, 73, 84, 65, 82, 217, 77, 73, 76, 128, 77, 73, - 75, 85, 82, 79, 78, 128, 77, 73, 75, 82, 79, 206, 77, 73, 75, 82, 73, - 128, 77, 73, 73, 78, 128, 77, 73, 73, 77, 128, 77, 73, 73, 128, 77, 73, - 199, 77, 73, 69, 88, 128, 77, 73, 69, 85, 77, 45, 84, 73, 75, 69, 85, 84, - 128, 77, 73, 69, 85, 77, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 77, - 73, 69, 85, 77, 45, 83, 83, 65, 78, 71, 78, 73, 69, 85, 78, 128, 77, 73, - 69, 85, 77, 45, 82, 73, 69, 85, 76, 128, 77, 73, 69, 85, 77, 45, 80, 73, - 69, 85, 80, 45, 83, 73, 79, 83, 128, 77, 73, 69, 85, 77, 45, 80, 73, 69, - 85, 80, 128, 77, 73, 69, 85, 77, 45, 80, 65, 78, 83, 73, 79, 83, 128, 77, - 73, 69, 85, 77, 45, 78, 73, 69, 85, 78, 128, 77, 73, 69, 85, 77, 45, 67, - 73, 69, 85, 67, 128, 77, 73, 69, 85, 77, 45, 67, 72, 73, 69, 85, 67, 72, - 128, 77, 73, 69, 85, 205, 77, 73, 69, 80, 128, 77, 73, 69, 69, 128, 77, - 73, 69, 128, 77, 73, 68, 76, 73, 78, 197, 77, 73, 68, 68, 76, 69, 45, 87, - 69, 76, 83, 200, 77, 73, 68, 68, 76, 69, 128, 77, 73, 68, 45, 76, 69, 86, - 69, 204, 77, 73, 196, 77, 73, 67, 82, 79, 83, 67, 79, 80, 69, 128, 77, - 73, 67, 82, 79, 80, 72, 79, 78, 69, 128, 77, 73, 67, 82, 79, 66, 69, 128, - 77, 73, 67, 82, 207, 77, 73, 67, 210, 77, 73, 45, 55, 128, 77, 73, 45, - 54, 128, 77, 73, 45, 53, 128, 77, 73, 45, 52, 128, 77, 73, 45, 51, 128, - 77, 73, 45, 50, 128, 77, 73, 45, 49, 128, 77, 72, 90, 128, 77, 72, 65, - 128, 77, 72, 128, 77, 71, 85, 88, 128, 77, 71, 85, 84, 128, 77, 71, 85, - 82, 88, 128, 77, 71, 85, 82, 128, 77, 71, 85, 80, 128, 77, 71, 85, 79, - 88, 128, 77, 71, 85, 79, 80, 128, 77, 71, 85, 79, 128, 77, 71, 85, 128, - 77, 71, 79, 88, 128, 77, 71, 79, 84, 128, 77, 71, 79, 80, 128, 77, 71, - 79, 128, 77, 71, 207, 77, 71, 73, 69, 88, 128, 77, 71, 73, 69, 128, 77, - 71, 69, 88, 128, 77, 71, 69, 80, 128, 77, 71, 69, 128, 77, 71, 66, 85, - 128, 77, 71, 66, 79, 79, 128, 77, 71, 66, 79, 70, 85, 77, 128, 77, 71, - 66, 79, 128, 77, 71, 66, 73, 128, 77, 71, 66, 69, 85, 78, 128, 77, 71, - 66, 69, 78, 128, 77, 71, 66, 69, 69, 128, 77, 71, 66, 69, 128, 77, 71, - 66, 65, 83, 65, 81, 128, 77, 71, 66, 65, 83, 65, 128, 77, 71, 65, 88, - 128, 77, 71, 65, 84, 128, 77, 71, 65, 80, 128, 77, 71, 65, 128, 77, 71, - 128, 77, 70, 79, 78, 128, 77, 70, 79, 206, 77, 70, 79, 128, 77, 70, 73, - 89, 65, 81, 128, 77, 70, 73, 69, 69, 128, 77, 70, 69, 85, 84, 128, 77, - 70, 69, 85, 81, 128, 77, 70, 69, 85, 65, 69, 128, 77, 70, 65, 65, 128, - 77, 69, 90, 90, 79, 128, 77, 69, 88, 128, 77, 69, 85, 212, 77, 69, 85, - 81, 128, 77, 69, 85, 78, 74, 79, 77, 78, 68, 69, 85, 81, 128, 77, 69, 85, - 78, 128, 77, 69, 84, 82, 79, 128, 77, 69, 84, 82, 73, 67, 65, 204, 77, - 69, 84, 82, 73, 65, 128, 77, 69, 84, 82, 69, 84, 69, 211, 77, 69, 84, 79, - 66, 69, 76, 85, 83, 128, 77, 69, 84, 69, 75, 128, 77, 69, 84, 69, 71, - 128, 77, 69, 84, 65, 76, 128, 77, 69, 84, 193, 77, 69, 83, 83, 69, 78, - 73, 65, 206, 77, 69, 83, 83, 65, 71, 69, 128, 77, 69, 83, 83, 65, 71, - 197, 77, 69, 83, 79, 128, 77, 69, 83, 73, 128, 77, 69, 83, 72, 128, 77, - 69, 82, 80, 69, 82, 83, 79, 78, 128, 77, 69, 82, 75, 72, 65, 128, 77, 69, - 82, 75, 72, 193, 77, 69, 82, 73, 68, 73, 65, 78, 83, 128, 77, 69, 82, 73, - 128, 77, 69, 82, 71, 69, 128, 77, 69, 82, 67, 85, 82, 89, 128, 77, 69, - 82, 67, 85, 82, 217, 77, 69, 78, 79, 82, 65, 200, 77, 69, 78, 79, 69, - 128, 77, 69, 78, 68, 85, 84, 128, 77, 69, 78, 128, 77, 69, 77, 79, 128, - 77, 69, 77, 66, 69, 82, 83, 72, 73, 80, 128, 77, 69, 77, 66, 69, 82, 128, - 77, 69, 77, 66, 69, 210, 77, 69, 77, 45, 81, 79, 80, 72, 128, 77, 69, 77, - 128, 77, 69, 205, 77, 69, 76, 79, 68, 73, 195, 77, 69, 76, 73, 75, 128, - 77, 69, 73, 90, 73, 128, 77, 69, 71, 65, 84, 79, 78, 128, 77, 69, 71, 65, - 80, 72, 79, 78, 69, 128, 77, 69, 71, 65, 76, 73, 128, 77, 69, 69, 84, 79, - 82, 85, 128, 77, 69, 69, 84, 69, 201, 77, 69, 69, 84, 128, 77, 69, 69, - 77, 85, 128, 77, 69, 69, 77, 128, 77, 69, 69, 202, 77, 69, 69, 69, 69, - 128, 77, 69, 68, 73, 85, 77, 128, 77, 69, 68, 73, 85, 205, 77, 69, 68, - 73, 69, 86, 65, 204, 77, 69, 68, 73, 67, 73, 78, 69, 128, 77, 69, 68, 73, - 67, 65, 204, 77, 69, 68, 73, 65, 204, 77, 69, 68, 69, 70, 65, 73, 68, 82, - 73, 206, 77, 69, 68, 65, 76, 128, 77, 69, 67, 72, 65, 78, 73, 67, 65, - 204, 77, 69, 65, 84, 128, 77, 69, 65, 212, 77, 69, 65, 83, 85, 82, 69, - 196, 77, 69, 65, 83, 85, 82, 69, 128, 77, 69, 65, 83, 85, 82, 197, 77, - 69, 45, 77, 65, 128, 77, 69, 45, 50, 128, 77, 69, 45, 49, 128, 77, 68, - 85, 206, 77, 196, 77, 67, 72, 213, 77, 67, 72, 65, 206, 77, 195, 77, 66, - 85, 85, 128, 77, 66, 85, 79, 81, 128, 77, 66, 85, 79, 128, 77, 66, 85, - 69, 128, 77, 66, 85, 65, 69, 77, 128, 77, 66, 85, 65, 69, 128, 77, 66, - 79, 79, 128, 77, 66, 79, 128, 77, 66, 73, 84, 128, 77, 66, 73, 212, 77, - 66, 73, 82, 73, 69, 69, 78, 128, 77, 66, 73, 128, 77, 66, 69, 85, 88, - 128, 77, 66, 69, 85, 82, 73, 128, 77, 66, 69, 85, 77, 128, 77, 66, 69, - 82, 65, 69, 128, 77, 66, 69, 78, 128, 77, 66, 69, 69, 75, 69, 69, 84, - 128, 77, 66, 69, 69, 128, 77, 66, 69, 128, 77, 66, 65, 81, 128, 77, 66, - 65, 78, 89, 73, 128, 77, 66, 65, 65, 82, 65, 69, 128, 77, 66, 65, 65, 75, - 69, 84, 128, 77, 66, 65, 65, 128, 77, 66, 65, 193, 77, 66, 193, 77, 66, - 52, 128, 77, 66, 51, 128, 77, 66, 50, 128, 77, 65, 89, 69, 203, 77, 65, - 89, 65, 78, 78, 65, 128, 77, 65, 89, 65, 206, 77, 65, 89, 128, 77, 65, - 88, 73, 77, 73, 90, 69, 128, 77, 65, 88, 73, 77, 65, 128, 77, 65, 88, - 128, 77, 65, 85, 128, 77, 65, 84, 84, 79, 67, 75, 128, 77, 65, 84, 82, - 73, 88, 128, 77, 65, 84, 69, 82, 73, 65, 76, 83, 128, 77, 65, 84, 128, - 77, 65, 83, 213, 77, 65, 83, 83, 73, 78, 71, 128, 77, 65, 83, 83, 65, 71, - 69, 128, 77, 65, 83, 79, 82, 193, 77, 65, 83, 75, 128, 77, 65, 83, 72, - 70, 65, 65, 84, 128, 77, 65, 83, 72, 50, 128, 77, 65, 83, 67, 85, 76, 73, - 78, 197, 77, 65, 83, 65, 82, 65, 205, 77, 65, 82, 89, 128, 77, 65, 82, - 87, 65, 82, 201, 77, 65, 82, 85, 75, 85, 128, 77, 65, 82, 84, 89, 82, 73, - 193, 77, 65, 82, 84, 73, 65, 204, 77, 65, 82, 82, 89, 73, 78, 199, 77, - 65, 82, 82, 73, 65, 71, 197, 77, 65, 82, 82, 65, 84, 65, 78, 128, 77, 65, - 82, 75, 211, 77, 65, 82, 75, 69, 82, 128, 77, 65, 82, 75, 45, 52, 128, - 77, 65, 82, 75, 45, 51, 128, 77, 65, 82, 75, 45, 50, 128, 77, 65, 82, 75, - 45, 49, 128, 77, 65, 82, 69, 128, 77, 65, 82, 67, 72, 69, 206, 77, 65, - 82, 67, 72, 128, 77, 65, 82, 67, 65, 84, 79, 45, 83, 84, 65, 67, 67, 65, - 84, 79, 128, 77, 65, 82, 67, 65, 84, 79, 128, 77, 65, 82, 67, 65, 83, 73, - 84, 69, 128, 77, 65, 82, 66, 85, 84, 65, 128, 77, 65, 82, 66, 85, 84, - 193, 77, 65, 82, 128, 77, 65, 81, 65, 70, 128, 77, 65, 81, 128, 77, 65, - 80, 76, 197, 77, 65, 80, 73, 81, 128, 77, 65, 208, 77, 65, 79, 128, 77, - 65, 78, 85, 65, 204, 77, 65, 78, 84, 69, 76, 80, 73, 69, 67, 197, 77, 65, - 78, 83, 89, 79, 78, 128, 77, 65, 78, 83, 85, 65, 69, 128, 77, 65, 78, 78, - 65, 218, 77, 65, 78, 78, 65, 128, 77, 65, 78, 73, 67, 72, 65, 69, 65, - 206, 77, 65, 78, 71, 79, 128, 77, 65, 78, 71, 65, 76, 65, 77, 128, 77, - 65, 78, 68, 65, 82, 73, 78, 128, 77, 65, 78, 68, 65, 73, 76, 73, 78, 199, - 77, 65, 78, 68, 65, 73, 195, 77, 65, 78, 67, 72, 213, 77, 65, 78, 65, - 212, 77, 65, 78, 65, 67, 76, 69, 83, 128, 77, 65, 76, 84, 69, 83, 197, - 77, 65, 76, 69, 69, 82, 73, 128, 77, 65, 76, 69, 128, 77, 65, 76, 197, - 77, 65, 76, 65, 75, 79, 206, 77, 65, 75, 83, 85, 82, 65, 128, 77, 65, 75, - 83, 85, 82, 193, 77, 65, 75, 65, 83, 65, 210, 77, 65, 73, 90, 69, 128, - 77, 65, 73, 89, 65, 77, 79, 75, 128, 77, 65, 73, 84, 65, 73, 75, 72, 85, - 128, 77, 65, 73, 82, 85, 128, 77, 65, 73, 77, 85, 65, 78, 128, 77, 65, - 73, 77, 65, 76, 65, 73, 128, 77, 65, 73, 76, 66, 79, 216, 77, 65, 73, 75, - 85, 82, 79, 128, 77, 65, 73, 68, 69, 78, 128, 77, 65, 73, 128, 77, 65, - 72, 74, 79, 78, 199, 77, 65, 72, 72, 65, 128, 77, 65, 72, 65, 80, 82, 65, - 78, 65, 128, 77, 65, 72, 65, 80, 65, 75, 72, 128, 77, 65, 72, 65, 74, 65, - 78, 201, 77, 65, 72, 65, 65, 80, 82, 65, 65, 78, 193, 77, 65, 72, 128, - 77, 65, 71, 78, 73, 70, 89, 73, 78, 199, 77, 65, 71, 78, 69, 84, 128, 77, - 65, 71, 69, 128, 77, 65, 69, 83, 73, 128, 77, 65, 69, 78, 89, 73, 128, - 77, 65, 69, 78, 74, 69, 84, 128, 77, 65, 69, 77, 86, 69, 85, 88, 128, 77, - 65, 69, 77, 75, 80, 69, 78, 128, 77, 65, 69, 77, 71, 66, 73, 69, 69, 128, - 77, 65, 69, 77, 66, 71, 66, 73, 69, 69, 128, 77, 65, 69, 77, 66, 65, 128, - 77, 65, 69, 77, 128, 77, 65, 69, 76, 69, 69, 128, 77, 65, 69, 75, 69, 85, - 80, 128, 77, 65, 68, 89, 65, 128, 77, 65, 68, 85, 128, 77, 65, 68, 68, - 65, 72, 128, 77, 65, 68, 68, 65, 200, 77, 65, 68, 68, 65, 128, 77, 65, - 68, 68, 193, 77, 65, 67, 82, 79, 78, 45, 71, 82, 65, 86, 69, 128, 77, 65, - 67, 82, 79, 78, 45, 66, 82, 69, 86, 69, 128, 77, 65, 67, 82, 79, 78, 45, - 65, 67, 85, 84, 69, 128, 77, 65, 67, 82, 79, 78, 128, 77, 65, 67, 82, 79, - 206, 77, 65, 67, 72, 73, 78, 69, 128, 77, 65, 65, 89, 89, 65, 65, 128, - 77, 65, 65, 73, 128, 77, 65, 65, 128, 77, 65, 50, 128, 77, 65, 45, 55, - 128, 77, 65, 45, 54, 128, 77, 65, 45, 53, 128, 77, 65, 45, 52, 128, 77, - 65, 45, 51, 128, 77, 65, 45, 50, 128, 77, 65, 45, 49, 128, 77, 49, 57, - 183, 77, 49, 57, 182, 77, 49, 57, 181, 77, 49, 57, 180, 77, 49, 57, 179, - 77, 49, 57, 178, 77, 49, 57, 177, 77, 49, 57, 176, 77, 49, 56, 185, 77, - 49, 56, 184, 77, 49, 56, 183, 77, 49, 56, 182, 77, 49, 56, 181, 77, 49, - 56, 180, 77, 49, 56, 179, 77, 49, 56, 178, 77, 49, 56, 177, 77, 49, 56, - 176, 77, 49, 55, 185, 77, 49, 55, 184, 77, 49, 55, 183, 77, 49, 55, 182, - 77, 49, 55, 181, 77, 49, 55, 180, 77, 49, 55, 179, 77, 49, 55, 178, 77, - 49, 55, 177, 77, 49, 55, 176, 77, 49, 54, 185, 77, 49, 54, 184, 77, 49, - 54, 183, 77, 49, 54, 182, 77, 49, 54, 181, 77, 49, 54, 180, 77, 49, 54, - 179, 77, 49, 54, 178, 77, 49, 54, 177, 77, 49, 54, 176, 77, 49, 53, 185, - 77, 49, 53, 184, 77, 49, 53, 183, 77, 49, 53, 182, 77, 49, 53, 181, 77, - 49, 53, 180, 77, 49, 53, 179, 77, 49, 53, 178, 77, 49, 53, 177, 77, 49, - 53, 176, 77, 49, 52, 185, 77, 49, 52, 184, 77, 49, 52, 183, 77, 49, 52, - 182, 77, 49, 52, 181, 77, 49, 52, 180, 77, 49, 52, 179, 77, 49, 52, 178, - 77, 49, 52, 177, 77, 49, 52, 176, 77, 49, 51, 185, 77, 49, 51, 184, 77, - 49, 51, 183, 77, 49, 51, 182, 77, 49, 51, 181, 77, 49, 51, 180, 77, 49, - 51, 179, 77, 49, 51, 178, 77, 49, 51, 177, 77, 49, 51, 176, 77, 49, 50, - 185, 77, 49, 50, 184, 77, 49, 50, 183, 77, 49, 50, 182, 77, 49, 50, 181, - 77, 49, 50, 180, 77, 49, 50, 179, 77, 49, 50, 178, 77, 49, 50, 177, 77, - 49, 50, 176, 77, 49, 49, 185, 77, 49, 49, 184, 77, 49, 49, 183, 77, 49, - 49, 182, 77, 49, 49, 181, 77, 49, 49, 180, 77, 49, 49, 179, 77, 49, 49, - 178, 77, 49, 49, 177, 77, 49, 49, 176, 77, 49, 48, 185, 77, 49, 48, 184, - 77, 49, 48, 183, 77, 49, 48, 182, 77, 49, 48, 181, 77, 49, 48, 180, 77, - 49, 48, 179, 77, 49, 48, 178, 77, 49, 48, 177, 77, 49, 48, 176, 77, 48, - 57, 185, 77, 48, 57, 184, 77, 48, 57, 183, 77, 48, 57, 182, 77, 48, 57, - 181, 77, 48, 57, 180, 77, 48, 57, 179, 77, 48, 57, 178, 77, 48, 57, 177, - 77, 48, 57, 176, 77, 48, 56, 185, 77, 48, 56, 184, 77, 48, 56, 183, 77, - 48, 56, 182, 77, 48, 56, 181, 77, 48, 56, 180, 77, 48, 56, 179, 77, 48, - 56, 178, 77, 48, 56, 177, 77, 48, 56, 176, 77, 48, 55, 185, 77, 48, 55, - 184, 77, 48, 55, 183, 77, 48, 55, 182, 77, 48, 55, 181, 77, 48, 55, 180, - 77, 48, 55, 179, 77, 48, 55, 178, 77, 48, 55, 177, 77, 48, 55, 176, 77, - 48, 54, 185, 77, 48, 54, 184, 77, 48, 54, 183, 77, 48, 54, 182, 77, 48, - 54, 181, 77, 48, 54, 180, 77, 48, 54, 179, 77, 48, 54, 178, 77, 48, 54, - 177, 77, 48, 54, 176, 77, 48, 53, 185, 77, 48, 53, 184, 77, 48, 53, 183, - 77, 48, 53, 182, 77, 48, 53, 181, 77, 48, 53, 180, 77, 48, 53, 179, 77, - 48, 53, 178, 77, 48, 53, 177, 77, 48, 53, 176, 77, 48, 52, 185, 77, 48, - 52, 184, 77, 48, 52, 183, 77, 48, 52, 182, 77, 48, 52, 181, 77, 48, 52, - 52, 128, 77, 48, 52, 180, 77, 48, 52, 51, 128, 77, 48, 52, 179, 77, 48, - 52, 50, 128, 77, 48, 52, 178, 77, 48, 52, 49, 128, 77, 48, 52, 177, 77, - 48, 52, 48, 65, 128, 77, 48, 52, 48, 128, 77, 48, 52, 176, 77, 48, 51, - 57, 128, 77, 48, 51, 185, 77, 48, 51, 56, 128, 77, 48, 51, 184, 77, 48, - 51, 55, 128, 77, 48, 51, 183, 77, 48, 51, 54, 128, 77, 48, 51, 182, 77, - 48, 51, 53, 128, 77, 48, 51, 181, 77, 48, 51, 52, 128, 77, 48, 51, 180, - 77, 48, 51, 51, 66, 128, 77, 48, 51, 51, 65, 128, 77, 48, 51, 51, 128, - 77, 48, 51, 179, 77, 48, 51, 50, 128, 77, 48, 51, 178, 77, 48, 51, 49, - 65, 128, 77, 48, 51, 49, 128, 77, 48, 51, 177, 77, 48, 51, 48, 128, 77, - 48, 51, 176, 77, 48, 50, 57, 128, 77, 48, 50, 185, 77, 48, 50, 56, 65, - 128, 77, 48, 50, 56, 128, 77, 48, 50, 184, 77, 48, 50, 55, 128, 77, 48, - 50, 183, 77, 48, 50, 54, 128, 77, 48, 50, 182, 77, 48, 50, 53, 128, 77, - 48, 50, 181, 77, 48, 50, 52, 65, 128, 77, 48, 50, 52, 128, 77, 48, 50, - 180, 77, 48, 50, 51, 128, 77, 48, 50, 179, 77, 48, 50, 50, 65, 128, 77, - 48, 50, 50, 128, 77, 48, 50, 178, 77, 48, 50, 49, 128, 77, 48, 50, 177, - 77, 48, 50, 48, 128, 77, 48, 50, 176, 77, 48, 49, 57, 128, 77, 48, 49, - 185, 77, 48, 49, 56, 128, 77, 48, 49, 184, 77, 48, 49, 55, 65, 128, 77, - 48, 49, 55, 128, 77, 48, 49, 183, 77, 48, 49, 54, 65, 128, 77, 48, 49, - 54, 128, 77, 48, 49, 182, 77, 48, 49, 53, 65, 128, 77, 48, 49, 53, 128, - 77, 48, 49, 181, 77, 48, 49, 52, 128, 77, 48, 49, 180, 77, 48, 49, 51, - 128, 77, 48, 49, 179, 77, 48, 49, 50, 72, 128, 77, 48, 49, 50, 71, 128, - 77, 48, 49, 50, 70, 128, 77, 48, 49, 50, 69, 128, 77, 48, 49, 50, 68, - 128, 77, 48, 49, 50, 67, 128, 77, 48, 49, 50, 66, 128, 77, 48, 49, 50, - 65, 128, 77, 48, 49, 50, 128, 77, 48, 49, 178, 77, 48, 49, 49, 128, 77, - 48, 49, 177, 77, 48, 49, 48, 65, 128, 77, 48, 49, 48, 128, 77, 48, 49, - 176, 77, 48, 48, 57, 128, 77, 48, 48, 185, 77, 48, 48, 56, 128, 77, 48, - 48, 184, 77, 48, 48, 55, 128, 77, 48, 48, 183, 77, 48, 48, 54, 128, 77, - 48, 48, 182, 77, 48, 48, 53, 128, 77, 48, 48, 181, 77, 48, 48, 52, 128, - 77, 48, 48, 180, 77, 48, 48, 51, 65, 128, 77, 48, 48, 51, 128, 77, 48, - 48, 179, 77, 48, 48, 50, 128, 77, 48, 48, 178, 77, 48, 48, 49, 66, 128, - 77, 48, 48, 49, 65, 128, 77, 48, 48, 49, 128, 77, 48, 48, 177, 76, 218, - 76, 89, 89, 128, 76, 89, 88, 128, 76, 89, 84, 128, 76, 89, 82, 88, 128, - 76, 89, 82, 128, 76, 89, 80, 128, 76, 89, 73, 84, 128, 76, 89, 73, 78, - 199, 76, 89, 68, 73, 65, 206, 76, 89, 67, 73, 65, 206, 76, 88, 128, 76, - 87, 79, 79, 128, 76, 87, 79, 128, 76, 87, 73, 73, 128, 76, 87, 73, 128, - 76, 87, 69, 128, 76, 87, 65, 65, 128, 76, 87, 65, 128, 76, 85, 88, 128, - 76, 85, 85, 128, 76, 85, 84, 128, 76, 85, 82, 88, 128, 76, 85, 80, 128, - 76, 85, 79, 88, 128, 76, 85, 79, 84, 128, 76, 85, 79, 80, 128, 76, 85, - 79, 128, 76, 85, 78, 71, 83, 73, 128, 76, 85, 78, 65, 84, 197, 76, 85, - 205, 76, 85, 76, 128, 76, 85, 73, 83, 128, 76, 85, 72, 85, 82, 128, 76, - 85, 72, 128, 76, 85, 200, 76, 85, 71, 71, 65, 71, 69, 128, 76, 85, 71, - 65, 76, 128, 76, 85, 71, 65, 204, 76, 85, 69, 128, 76, 85, 197, 76, 85, - 66, 128, 76, 85, 65, 69, 80, 128, 76, 85, 51, 128, 76, 85, 50, 128, 76, - 85, 178, 76, 82, 79, 128, 76, 82, 77, 128, 76, 82, 73, 128, 76, 82, 69, - 128, 76, 79, 90, 69, 78, 71, 69, 128, 76, 79, 90, 69, 78, 71, 197, 76, - 79, 88, 128, 76, 79, 87, 69, 82, 69, 196, 76, 79, 87, 69, 210, 76, 79, - 87, 45, 82, 69, 86, 69, 82, 83, 69, 68, 45, 185, 76, 79, 87, 45, 77, 73, - 196, 76, 79, 87, 45, 70, 65, 76, 76, 73, 78, 199, 76, 79, 87, 45, 185, - 76, 79, 86, 197, 76, 79, 85, 82, 69, 128, 76, 79, 85, 68, 83, 80, 69, 65, - 75, 69, 82, 128, 76, 79, 85, 68, 76, 217, 76, 79, 84, 85, 83, 128, 76, - 79, 84, 85, 211, 76, 79, 84, 73, 79, 206, 76, 79, 84, 128, 76, 79, 83, - 83, 76, 69, 83, 83, 128, 76, 79, 82, 82, 89, 128, 76, 79, 82, 82, 65, 73, - 78, 69, 128, 76, 79, 81, 128, 76, 79, 80, 128, 76, 79, 79, 84, 128, 76, - 79, 79, 80, 69, 196, 76, 79, 79, 80, 128, 76, 79, 79, 208, 76, 79, 79, - 78, 128, 76, 79, 79, 203, 76, 79, 79, 128, 76, 79, 78, 83, 85, 77, 128, - 76, 79, 78, 71, 65, 128, 76, 79, 78, 71, 193, 76, 79, 78, 71, 45, 76, 69, - 71, 71, 69, 196, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 89, 82, - 128, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 83, 79, 204, 76, 79, - 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 79, 83, 211, 76, 79, 78, 71, 45, - 66, 82, 65, 78, 67, 72, 45, 77, 65, 68, 210, 76, 79, 78, 71, 45, 66, 82, - 65, 78, 67, 72, 45, 72, 65, 71, 65, 76, 204, 76, 79, 78, 71, 45, 66, 82, - 65, 78, 67, 72, 45, 65, 210, 76, 79, 77, 77, 65, 69, 128, 76, 79, 77, - 128, 76, 79, 205, 76, 79, 76, 76, 73, 80, 79, 80, 128, 76, 79, 76, 76, - 128, 76, 79, 71, 210, 76, 79, 71, 79, 84, 89, 80, 197, 76, 79, 71, 79, - 71, 82, 65, 205, 76, 79, 71, 128, 76, 79, 68, 69, 83, 84, 79, 78, 69, - 128, 76, 79, 67, 79, 77, 79, 84, 73, 86, 69, 128, 76, 79, 67, 75, 73, 78, - 71, 45, 83, 72, 73, 70, 212, 76, 79, 67, 203, 76, 79, 67, 65, 84, 73, 86, - 69, 128, 76, 79, 67, 65, 84, 73, 79, 78, 45, 87, 65, 76, 76, 80, 76, 65, - 78, 197, 76, 79, 67, 65, 84, 73, 79, 78, 45, 70, 76, 79, 79, 82, 80, 76, - 65, 78, 197, 76, 79, 67, 65, 84, 73, 79, 78, 128, 76, 79, 67, 65, 84, 73, - 79, 206, 76, 79, 66, 83, 84, 69, 82, 128, 76, 79, 65, 128, 76, 78, 128, - 76, 76, 85, 85, 128, 76, 76, 79, 79, 128, 76, 76, 76, 85, 85, 128, 76, - 76, 76, 85, 128, 76, 76, 76, 79, 79, 128, 76, 76, 76, 79, 128, 76, 76, - 76, 73, 73, 128, 76, 76, 76, 73, 128, 76, 76, 76, 69, 69, 128, 76, 76, - 76, 69, 128, 76, 76, 76, 65, 85, 128, 76, 76, 76, 65, 73, 128, 76, 76, - 76, 65, 65, 128, 76, 76, 76, 65, 128, 76, 76, 76, 128, 76, 76, 72, 65, - 128, 76, 76, 65, 77, 65, 128, 76, 74, 85, 68, 73, 74, 69, 128, 76, 74, - 69, 128, 76, 74, 128, 76, 73, 90, 65, 82, 68, 128, 76, 73, 88, 128, 76, - 73, 87, 78, 128, 76, 73, 86, 82, 197, 76, 73, 84, 84, 76, 69, 128, 76, - 73, 84, 84, 76, 197, 76, 73, 84, 84, 69, 210, 76, 73, 84, 82, 193, 76, - 73, 84, 200, 76, 73, 83, 213, 76, 73, 83, 128, 76, 73, 82, 193, 76, 73, - 81, 85, 73, 196, 76, 73, 81, 128, 76, 73, 80, 83, 84, 73, 67, 75, 128, - 76, 73, 80, 211, 76, 73, 208, 76, 73, 78, 75, 73, 78, 199, 76, 73, 78, - 75, 69, 196, 76, 73, 78, 203, 76, 73, 78, 71, 83, 65, 128, 76, 73, 78, - 69, 83, 128, 76, 73, 78, 69, 211, 76, 73, 78, 69, 45, 57, 128, 76, 73, - 78, 69, 45, 55, 128, 76, 73, 78, 69, 45, 51, 128, 76, 73, 78, 69, 45, 49, - 128, 76, 73, 77, 77, 85, 52, 128, 76, 73, 77, 77, 85, 50, 128, 76, 73, - 77, 77, 85, 128, 76, 73, 77, 77, 213, 76, 73, 77, 73, 84, 69, 196, 76, - 73, 77, 73, 84, 65, 84, 73, 79, 78, 128, 76, 73, 77, 73, 84, 128, 76, 73, - 77, 69, 128, 76, 73, 77, 66, 213, 76, 73, 77, 66, 211, 76, 73, 77, 194, - 76, 73, 76, 89, 128, 76, 73, 76, 73, 84, 72, 128, 76, 73, 76, 128, 76, - 73, 71, 72, 84, 78, 73, 78, 71, 128, 76, 73, 71, 72, 84, 78, 73, 78, 199, - 76, 73, 71, 72, 84, 72, 79, 85, 83, 69, 128, 76, 73, 71, 72, 84, 128, 76, - 73, 71, 65, 84, 73, 78, 199, 76, 73, 70, 84, 69, 82, 128, 76, 73, 70, 69, - 128, 76, 73, 69, 88, 128, 76, 73, 69, 84, 128, 76, 73, 69, 80, 128, 76, - 73, 69, 69, 128, 76, 73, 69, 128, 76, 73, 68, 128, 76, 73, 67, 75, 73, - 78, 199, 76, 73, 66, 82, 65, 128, 76, 73, 66, 69, 82, 84, 89, 128, 76, - 73, 65, 66, 73, 76, 73, 84, 217, 76, 72, 73, 73, 128, 76, 72, 65, 86, 73, - 89, 65, 78, 73, 128, 76, 72, 65, 199, 76, 72, 65, 65, 128, 76, 72, 128, - 76, 69, 90, 72, 128, 76, 69, 88, 128, 76, 69, 86, 73, 84, 65, 84, 73, 78, - 71, 128, 76, 69, 85, 77, 128, 76, 69, 85, 65, 69, 80, 128, 76, 69, 85, - 65, 69, 77, 128, 76, 69, 85, 128, 76, 69, 213, 76, 69, 84, 84, 69, 82, - 83, 128, 76, 69, 84, 84, 69, 82, 128, 76, 69, 212, 76, 69, 83, 83, 69, - 210, 76, 69, 83, 83, 45, 84, 72, 65, 78, 128, 76, 69, 83, 83, 45, 84, 72, - 65, 206, 76, 69, 83, 72, 128, 76, 69, 80, 67, 72, 193, 76, 69, 80, 128, - 76, 69, 79, 80, 65, 82, 68, 128, 76, 69, 79, 128, 76, 69, 78, 84, 73, 67, - 85, 76, 65, 210, 76, 69, 78, 73, 83, 128, 76, 69, 78, 73, 211, 76, 69, - 78, 71, 84, 72, 69, 78, 69, 82, 128, 76, 69, 78, 71, 84, 72, 45, 55, 128, - 76, 69, 78, 71, 84, 72, 45, 54, 128, 76, 69, 78, 71, 84, 72, 45, 53, 128, - 76, 69, 78, 71, 84, 72, 45, 52, 128, 76, 69, 78, 71, 84, 72, 45, 51, 128, - 76, 69, 78, 71, 84, 72, 45, 50, 128, 76, 69, 78, 71, 84, 72, 45, 49, 128, - 76, 69, 78, 71, 84, 200, 76, 69, 78, 71, 65, 128, 76, 69, 78, 71, 193, - 76, 69, 77, 79, 78, 128, 76, 69, 77, 79, 73, 128, 76, 69, 76, 69, 84, - 128, 76, 69, 76, 69, 212, 76, 69, 203, 76, 69, 73, 77, 77, 65, 128, 76, - 69, 73, 77, 77, 193, 76, 69, 73, 128, 76, 69, 71, 83, 128, 76, 69, 71, - 73, 79, 78, 128, 76, 69, 71, 69, 84, 79, 211, 76, 69, 71, 128, 76, 69, - 199, 76, 69, 70, 84, 87, 65, 82, 68, 83, 128, 76, 69, 70, 84, 45, 84, 79, - 45, 82, 73, 71, 72, 212, 76, 69, 70, 84, 45, 83, 84, 69, 205, 76, 69, 70, - 84, 45, 83, 73, 68, 197, 76, 69, 70, 84, 45, 83, 72, 65, 68, 69, 196, 76, - 69, 70, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 76, 69, 70, 84, 45, 76, - 73, 71, 72, 84, 69, 196, 76, 69, 70, 84, 45, 72, 65, 78, 68, 69, 196, 76, - 69, 70, 84, 45, 72, 65, 78, 196, 76, 69, 70, 84, 45, 70, 65, 67, 73, 78, - 199, 76, 69, 70, 84, 128, 76, 69, 69, 82, 65, 69, 87, 65, 128, 76, 69, - 69, 75, 128, 76, 69, 69, 69, 69, 128, 76, 69, 68, 71, 69, 82, 128, 76, - 69, 65, 84, 72, 69, 82, 128, 76, 69, 65, 70, 217, 76, 69, 65, 70, 128, - 76, 69, 65, 198, 76, 69, 65, 68, 69, 82, 128, 76, 69, 65, 196, 76, 68, - 65, 78, 128, 76, 68, 50, 128, 76, 67, 201, 76, 67, 197, 76, 65, 90, 217, - 76, 65, 89, 65, 78, 78, 65, 128, 76, 65, 88, 128, 76, 65, 87, 128, 76, - 65, 215, 76, 65, 85, 76, 65, 128, 76, 65, 85, 75, 65, 218, 76, 65, 85, - 74, 128, 76, 65, 85, 71, 72, 73, 78, 71, 128, 76, 65, 84, 73, 78, 65, 84, - 197, 76, 65, 84, 73, 75, 128, 76, 65, 84, 69, 82, 65, 204, 76, 65, 84, - 197, 76, 65, 83, 212, 76, 65, 82, 89, 78, 71, 69, 65, 204, 76, 65, 82, - 201, 76, 65, 82, 71, 69, 83, 84, 128, 76, 65, 82, 71, 69, 210, 76, 65, - 82, 71, 69, 128, 76, 65, 82, 71, 197, 76, 65, 81, 128, 76, 65, 80, 65, - 81, 128, 76, 65, 207, 76, 65, 78, 84, 69, 82, 78, 128, 76, 65, 78, 71, - 85, 65, 71, 197, 76, 65, 78, 69, 83, 128, 76, 65, 78, 196, 76, 65, 78, - 128, 76, 65, 77, 80, 128, 76, 65, 77, 69, 68, 72, 128, 76, 65, 77, 69, - 68, 128, 76, 65, 77, 69, 196, 76, 65, 77, 69, 128, 76, 65, 77, 197, 76, - 65, 77, 68, 65, 128, 76, 65, 77, 68, 128, 76, 65, 77, 66, 68, 193, 76, - 65, 77, 65, 68, 72, 128, 76, 65, 76, 128, 76, 65, 204, 76, 65, 75, 75, - 72, 65, 78, 71, 89, 65, 79, 128, 76, 65, 75, 72, 65, 78, 128, 76, 65, 75, - 72, 128, 76, 65, 75, 200, 76, 65, 75, 45, 55, 52, 57, 128, 76, 65, 75, - 45, 55, 50, 52, 128, 76, 65, 75, 45, 54, 54, 56, 128, 76, 65, 75, 45, 54, - 52, 56, 128, 76, 65, 75, 45, 54, 52, 184, 76, 65, 75, 45, 54, 51, 54, - 128, 76, 65, 75, 45, 54, 49, 55, 128, 76, 65, 75, 45, 54, 49, 183, 76, - 65, 75, 45, 54, 48, 56, 128, 76, 65, 75, 45, 53, 53, 48, 128, 76, 65, 75, - 45, 52, 57, 53, 128, 76, 65, 75, 45, 52, 57, 51, 128, 76, 65, 75, 45, 52, - 57, 50, 128, 76, 65, 75, 45, 52, 57, 48, 128, 76, 65, 75, 45, 52, 56, 51, - 128, 76, 65, 75, 45, 52, 55, 48, 128, 76, 65, 75, 45, 52, 53, 55, 128, - 76, 65, 75, 45, 52, 53, 48, 128, 76, 65, 75, 45, 52, 52, 57, 128, 76, 65, - 75, 45, 52, 52, 185, 76, 65, 75, 45, 52, 52, 49, 128, 76, 65, 75, 45, 51, - 57, 48, 128, 76, 65, 75, 45, 51, 56, 52, 128, 76, 65, 75, 45, 51, 56, 51, - 128, 76, 65, 75, 45, 51, 52, 56, 128, 76, 65, 75, 45, 51, 52, 55, 128, - 76, 65, 75, 45, 51, 52, 51, 128, 76, 65, 75, 45, 50, 54, 54, 128, 76, 65, - 75, 45, 50, 54, 53, 128, 76, 65, 75, 45, 50, 51, 56, 128, 76, 65, 75, 45, - 50, 50, 56, 128, 76, 65, 75, 45, 50, 50, 53, 128, 76, 65, 75, 45, 50, 50, - 48, 128, 76, 65, 75, 45, 50, 49, 57, 128, 76, 65, 75, 45, 50, 49, 48, - 128, 76, 65, 75, 45, 49, 52, 50, 128, 76, 65, 75, 45, 49, 51, 48, 128, - 76, 65, 75, 45, 48, 57, 50, 128, 76, 65, 75, 45, 48, 56, 49, 128, 76, 65, - 75, 45, 48, 56, 177, 76, 65, 75, 45, 48, 56, 48, 128, 76, 65, 75, 45, 48, - 55, 185, 76, 65, 75, 45, 48, 54, 50, 128, 76, 65, 75, 45, 48, 53, 49, - 128, 76, 65, 75, 45, 48, 53, 48, 128, 76, 65, 75, 45, 48, 51, 48, 128, - 76, 65, 75, 45, 48, 50, 53, 128, 76, 65, 75, 45, 48, 50, 49, 128, 76, 65, - 75, 45, 48, 50, 48, 128, 76, 65, 75, 45, 48, 48, 51, 128, 76, 65, 74, 65, - 78, 89, 65, 76, 65, 78, 128, 76, 65, 73, 78, 199, 76, 65, 201, 76, 65, - 72, 83, 72, 85, 128, 76, 65, 72, 128, 76, 65, 71, 85, 83, 128, 76, 65, - 71, 213, 76, 65, 71, 65, 82, 128, 76, 65, 71, 65, 210, 76, 65, 71, 65, - 66, 128, 76, 65, 71, 65, 194, 76, 65, 69, 86, 128, 76, 65, 69, 128, 76, - 65, 68, 217, 76, 65, 67, 82, 79, 83, 83, 197, 76, 65, 67, 75, 128, 76, - 65, 67, 65, 128, 76, 65, 66, 79, 85, 82, 73, 78, 71, 128, 76, 65, 66, 79, - 82, 128, 76, 65, 66, 73, 65, 76, 73, 90, 65, 84, 73, 79, 206, 76, 65, 66, - 73, 65, 204, 76, 65, 66, 69, 76, 128, 76, 65, 66, 65, 84, 128, 76, 65, - 194, 76, 65, 65, 78, 65, 69, 128, 76, 65, 65, 78, 128, 76, 65, 65, 77, - 85, 128, 76, 65, 65, 77, 128, 76, 65, 65, 73, 128, 76, 54, 128, 76, 52, - 128, 76, 51, 128, 76, 50, 128, 76, 48, 48, 54, 65, 128, 76, 48, 48, 50, - 65, 128, 76, 45, 84, 89, 80, 197, 76, 45, 83, 72, 65, 80, 69, 196, 75, - 89, 85, 82, 73, 73, 128, 75, 89, 85, 128, 75, 89, 79, 128, 75, 89, 76, - 73, 83, 77, 65, 128, 75, 89, 73, 128, 75, 89, 69, 128, 75, 89, 65, 84, - 72, 79, 211, 75, 89, 65, 65, 128, 75, 89, 65, 128, 75, 88, 87, 73, 128, - 75, 88, 87, 69, 69, 128, 75, 88, 87, 69, 128, 75, 88, 87, 65, 65, 128, - 75, 88, 87, 65, 128, 75, 88, 85, 128, 75, 88, 79, 128, 75, 88, 73, 128, - 75, 88, 69, 69, 128, 75, 88, 69, 128, 75, 88, 65, 65, 128, 75, 88, 65, - 128, 75, 87, 86, 128, 75, 87, 85, 51, 49, 56, 128, 75, 87, 79, 79, 128, - 75, 87, 79, 128, 75, 87, 77, 128, 75, 87, 73, 73, 128, 75, 87, 73, 128, - 75, 87, 69, 69, 128, 75, 87, 69, 128, 75, 87, 66, 128, 75, 87, 65, 89, - 128, 75, 87, 65, 69, 84, 128, 75, 87, 65, 65, 128, 75, 86, 65, 128, 75, - 86, 128, 75, 85, 90, 72, 73, 128, 75, 85, 88, 128, 75, 85, 86, 128, 75, - 85, 85, 72, 128, 75, 85, 84, 128, 75, 85, 83, 77, 65, 128, 75, 85, 83, - 72, 85, 50, 128, 75, 85, 83, 72, 85, 178, 75, 85, 82, 88, 128, 75, 85, - 82, 85, 90, 69, 73, 82, 79, 128, 75, 85, 82, 84, 128, 75, 85, 82, 79, 79, - 78, 69, 128, 75, 85, 82, 128, 75, 85, 210, 75, 85, 81, 128, 75, 85, 79, - 88, 128, 75, 85, 79, 80, 128, 75, 85, 79, 208, 75, 85, 79, 77, 128, 75, - 85, 79, 128, 75, 85, 78, 71, 128, 75, 85, 78, 68, 68, 65, 76, 73, 89, 65, + 196, 78, 69, 69, 68, 76, 69, 128, 78, 69, 67, 75, 84, 73, 69, 128, 78, + 69, 67, 75, 128, 78, 69, 66, 69, 78, 83, 84, 73, 77, 77, 69, 128, 78, 69, + 45, 75, 79, 128, 78, 68, 85, 88, 128, 78, 68, 85, 84, 128, 78, 68, 85, + 82, 88, 128, 78, 68, 85, 82, 128, 78, 68, 85, 80, 128, 78, 68, 85, 78, + 128, 78, 68, 213, 78, 68, 79, 88, 128, 78, 68, 79, 84, 128, 78, 68, 79, + 80, 128, 78, 68, 79, 79, 128, 78, 68, 79, 78, 128, 78, 68, 79, 77, 66, + 85, 128, 78, 68, 79, 76, 197, 78, 68, 73, 88, 128, 78, 68, 73, 84, 128, + 78, 68, 73, 81, 128, 78, 68, 73, 80, 128, 78, 68, 73, 69, 88, 128, 78, + 68, 73, 69, 128, 78, 68, 73, 68, 65, 128, 78, 68, 73, 65, 81, 128, 78, + 68, 69, 88, 128, 78, 68, 69, 85, 88, 128, 78, 68, 69, 85, 84, 128, 78, + 68, 69, 85, 65, 69, 82, 69, 69, 128, 78, 68, 69, 80, 128, 78, 68, 69, 69, + 128, 78, 68, 69, 128, 78, 68, 65, 88, 128, 78, 68, 65, 84, 128, 78, 68, + 65, 80, 128, 78, 68, 65, 77, 128, 78, 68, 65, 65, 78, 71, 71, 69, 85, 65, + 69, 84, 128, 78, 68, 65, 65, 128, 78, 68, 65, 193, 78, 67, 72, 65, 85, + 128, 78, 67, 65, 128, 78, 66, 89, 88, 128, 78, 66, 89, 84, 128, 78, 66, + 89, 82, 88, 128, 78, 66, 89, 82, 128, 78, 66, 89, 80, 128, 78, 66, 89, + 128, 78, 66, 85, 88, 128, 78, 66, 85, 84, 128, 78, 66, 85, 82, 88, 128, + 78, 66, 85, 82, 128, 78, 66, 85, 80, 128, 78, 66, 85, 128, 78, 66, 79, + 88, 128, 78, 66, 79, 84, 128, 78, 66, 79, 80, 128, 78, 66, 79, 128, 78, + 66, 73, 88, 128, 78, 66, 73, 84, 128, 78, 66, 73, 80, 128, 78, 66, 73, + 69, 88, 128, 78, 66, 73, 69, 80, 128, 78, 66, 73, 69, 128, 78, 66, 73, + 128, 78, 66, 72, 128, 78, 66, 65, 88, 128, 78, 66, 65, 84, 128, 78, 66, + 65, 80, 128, 78, 66, 65, 128, 78, 65, 90, 65, 210, 78, 65, 89, 65, 78, + 78, 65, 128, 78, 65, 89, 128, 78, 65, 88, 73, 65, 206, 78, 65, 88, 128, + 78, 65, 85, 84, 72, 83, 128, 78, 65, 85, 83, 69, 65, 84, 69, 196, 78, 65, + 85, 68, 73, 218, 78, 65, 84, 85, 82, 65, 204, 78, 65, 84, 73, 79, 78, 65, + 204, 78, 65, 83, 75, 65, 80, 201, 78, 65, 83, 72, 73, 128, 78, 65, 83, + 65, 76, 73, 90, 65, 84, 73, 79, 78, 128, 78, 65, 83, 65, 76, 73, 90, 65, + 84, 73, 79, 206, 78, 65, 83, 65, 204, 78, 65, 82, 82, 79, 215, 78, 65, + 82, 128, 78, 65, 81, 128, 78, 65, 79, 211, 78, 65, 78, 83, 65, 78, 65, + 81, 128, 78, 65, 78, 71, 77, 79, 78, 84, 72, 79, 128, 78, 65, 78, 68, 73, + 78, 65, 71, 65, 82, 201, 78, 65, 78, 68, 128, 78, 65, 78, 65, 128, 78, + 65, 77, 69, 128, 78, 65, 77, 197, 78, 65, 77, 50, 128, 78, 65, 75, 128, + 78, 65, 73, 82, 193, 78, 65, 73, 204, 78, 65, 71, 82, 201, 78, 65, 71, + 65, 82, 128, 78, 65, 71, 65, 128, 78, 65, 71, 193, 78, 65, 71, 128, 78, + 65, 199, 78, 65, 69, 128, 78, 65, 66, 76, 65, 128, 78, 65, 66, 65, 84, + 65, 69, 65, 206, 78, 65, 65, 83, 73, 75, 89, 65, 89, 65, 128, 78, 65, 65, + 75, 83, 73, 75, 89, 65, 89, 65, 128, 78, 65, 65, 73, 128, 78, 65, 193, + 78, 65, 52, 128, 78, 65, 50, 128, 78, 65, 45, 57, 128, 78, 65, 45, 56, + 128, 78, 65, 45, 55, 128, 78, 65, 45, 54, 128, 78, 65, 45, 53, 128, 78, + 65, 45, 52, 128, 78, 65, 45, 51, 128, 78, 65, 45, 50, 128, 78, 65, 45, + 49, 128, 78, 48, 52, 50, 128, 78, 48, 52, 49, 128, 78, 48, 52, 48, 128, + 78, 48, 51, 57, 128, 78, 48, 51, 56, 128, 78, 48, 51, 55, 65, 128, 78, + 48, 51, 55, 128, 78, 48, 51, 54, 128, 78, 48, 51, 53, 65, 128, 78, 48, + 51, 53, 128, 78, 48, 51, 52, 65, 128, 78, 48, 51, 52, 128, 78, 48, 51, + 51, 65, 128, 78, 48, 51, 51, 128, 78, 48, 51, 50, 128, 78, 48, 51, 49, + 128, 78, 48, 51, 48, 128, 78, 48, 50, 57, 128, 78, 48, 50, 56, 128, 78, + 48, 50, 55, 128, 78, 48, 50, 54, 128, 78, 48, 50, 53, 65, 128, 78, 48, + 50, 53, 128, 78, 48, 50, 52, 128, 78, 48, 50, 51, 128, 78, 48, 50, 50, + 128, 78, 48, 50, 49, 128, 78, 48, 50, 48, 128, 78, 48, 49, 57, 128, 78, + 48, 49, 56, 66, 128, 78, 48, 49, 56, 65, 128, 78, 48, 49, 56, 128, 78, + 48, 49, 55, 128, 78, 48, 49, 54, 128, 78, 48, 49, 53, 128, 78, 48, 49, + 52, 128, 78, 48, 49, 51, 128, 78, 48, 49, 50, 128, 78, 48, 49, 49, 128, + 78, 48, 49, 48, 128, 78, 48, 48, 57, 128, 78, 48, 48, 56, 128, 78, 48, + 48, 55, 128, 78, 48, 48, 54, 128, 78, 48, 48, 53, 128, 78, 48, 48, 52, + 128, 78, 48, 48, 51, 128, 78, 48, 48, 50, 128, 78, 48, 48, 49, 128, 78, + 45, 77, 85, 45, 77, 79, 45, 50, 128, 78, 45, 77, 85, 45, 77, 79, 45, 49, + 128, 78, 45, 67, 82, 69, 197, 78, 45, 65, 82, 217, 77, 89, 88, 128, 77, + 89, 84, 128, 77, 89, 83, 76, 73, 84, 69, 128, 77, 89, 80, 128, 77, 89, + 65, 128, 77, 89, 193, 77, 89, 128, 77, 87, 79, 79, 128, 77, 87, 79, 128, + 77, 87, 73, 73, 128, 77, 87, 73, 128, 77, 87, 69, 69, 128, 77, 87, 69, + 128, 77, 87, 65, 65, 128, 77, 87, 65, 128, 77, 87, 128, 77, 215, 77, 86, + 83, 128, 77, 86, 79, 80, 128, 77, 86, 73, 128, 77, 86, 69, 85, 65, 69, + 78, 71, 65, 77, 128, 77, 86, 128, 77, 214, 77, 85, 88, 128, 77, 85, 85, + 86, 85, 90, 72, 65, 75, 75, 85, 128, 77, 85, 85, 83, 73, 75, 65, 84, 79, + 65, 78, 128, 77, 85, 85, 82, 68, 72, 65, 74, 193, 77, 85, 85, 128, 77, + 85, 84, 72, 65, 76, 73, 89, 65, 128, 77, 85, 84, 128, 77, 85, 83, 73, 67, + 128, 77, 85, 83, 73, 195, 77, 85, 83, 72, 82, 79, 79, 77, 128, 77, 85, + 83, 72, 51, 128, 77, 85, 83, 72, 179, 77, 85, 83, 72, 128, 77, 85, 83, + 200, 77, 85, 83, 128, 77, 85, 82, 88, 128, 77, 85, 82, 71, 85, 50, 128, + 77, 85, 82, 69, 128, 77, 85, 82, 68, 65, 128, 77, 85, 82, 68, 193, 77, + 85, 82, 128, 77, 85, 81, 68, 65, 77, 128, 77, 85, 80, 128, 77, 85, 79, + 88, 128, 77, 85, 79, 84, 128, 77, 85, 79, 80, 128, 77, 85, 79, 77, 65, + 69, 128, 77, 85, 79, 128, 77, 85, 78, 83, 85, 66, 128, 77, 85, 78, 65, + 72, 128, 77, 85, 78, 128, 77, 85, 76, 84, 73, 83, 69, 84, 128, 77, 85, + 76, 84, 73, 83, 69, 212, 77, 85, 76, 84, 73, 80, 76, 73, 67, 65, 84, 73, + 79, 78, 128, 77, 85, 76, 84, 73, 80, 76, 73, 67, 65, 84, 73, 79, 206, 77, + 85, 76, 84, 73, 80, 76, 69, 128, 77, 85, 76, 84, 73, 80, 76, 197, 77, 85, + 76, 84, 73, 79, 67, 85, 76, 65, 210, 77, 85, 76, 84, 73, 77, 65, 80, 128, + 77, 85, 76, 84, 201, 77, 85, 76, 84, 65, 78, 201, 77, 85, 75, 80, 72, 82, + 69, 78, 71, 128, 77, 85, 75, 75, 85, 82, 85, 78, 73, 128, 77, 85, 73, 78, + 128, 77, 85, 71, 83, 128, 77, 85, 71, 128, 77, 85, 199, 77, 85, 69, 78, + 128, 77, 85, 69, 128, 77, 85, 67, 72, 128, 77, 85, 67, 200, 77, 85, 67, + 65, 65, 68, 128, 77, 85, 65, 83, 128, 77, 85, 65, 78, 128, 77, 85, 65, + 69, 128, 77, 85, 45, 71, 65, 65, 72, 76, 65, 193, 77, 85, 45, 52, 128, + 77, 85, 45, 51, 128, 77, 85, 45, 50, 128, 77, 85, 45, 49, 128, 77, 213, + 77, 84, 65, 86, 82, 85, 76, 201, 77, 83, 128, 77, 82, 207, 77, 210, 77, + 80, 65, 128, 77, 79, 89, 65, 73, 128, 77, 79, 88, 128, 77, 79, 86, 73, + 197, 77, 79, 86, 69, 211, 77, 79, 86, 69, 77, 69, 78, 84, 45, 87, 65, 76, + 76, 80, 76, 65, 78, 197, 77, 79, 86, 69, 77, 69, 78, 84, 45, 72, 73, 78, + 71, 197, 77, 79, 86, 69, 77, 69, 78, 84, 45, 70, 76, 79, 79, 82, 80, 76, + 65, 78, 197, 77, 79, 86, 69, 77, 69, 78, 84, 45, 68, 73, 65, 71, 79, 78, + 65, 204, 77, 79, 86, 69, 77, 69, 78, 84, 128, 77, 79, 86, 69, 77, 69, 78, + 212, 77, 79, 86, 69, 196, 77, 79, 86, 69, 128, 77, 79, 85, 84, 72, 128, + 77, 79, 85, 83, 69, 128, 77, 79, 85, 83, 197, 77, 79, 85, 78, 84, 65, 73, + 78, 83, 128, 77, 79, 85, 78, 84, 65, 73, 78, 128, 77, 79, 85, 78, 84, 65, + 73, 206, 77, 79, 85, 78, 212, 77, 79, 85, 78, 68, 128, 77, 79, 85, 78, + 196, 77, 79, 84, 79, 82, 87, 65, 89, 128, 77, 79, 84, 79, 82, 73, 90, 69, + 196, 77, 79, 84, 79, 82, 67, 89, 67, 76, 69, 128, 77, 79, 84, 79, 210, + 77, 79, 84, 72, 69, 82, 128, 77, 79, 84, 72, 69, 210, 77, 79, 84, 128, + 77, 79, 83, 81, 85, 73, 84, 79, 128, 77, 79, 83, 81, 85, 69, 128, 77, 79, + 82, 84, 85, 85, 77, 128, 77, 79, 82, 84, 65, 82, 128, 77, 79, 82, 80, 72, + 79, 76, 79, 71, 73, 67, 65, 204, 77, 79, 82, 78, 73, 78, 71, 128, 77, 79, + 80, 128, 77, 79, 79, 83, 69, 45, 67, 82, 69, 197, 77, 79, 79, 78, 128, + 77, 79, 79, 206, 77, 79, 79, 77, 80, 85, 81, 128, 77, 79, 79, 77, 69, 85, + 84, 128, 77, 79, 79, 68, 128, 77, 79, 79, 196, 77, 79, 79, 128, 77, 79, + 78, 84, 73, 69, 69, 78, 128, 77, 79, 78, 84, 72, 128, 77, 79, 78, 84, + 200, 77, 79, 78, 83, 84, 69, 82, 128, 77, 79, 78, 79, 83, 84, 65, 66, 76, + 197, 77, 79, 78, 79, 83, 80, 65, 67, 197, 77, 79, 78, 79, 82, 65, 73, 76, + 128, 77, 79, 78, 79, 71, 82, 65, 80, 200, 77, 79, 78, 79, 71, 82, 65, 77, + 77, 79, 211, 77, 79, 78, 79, 71, 82, 65, 205, 77, 79, 78, 79, 70, 79, 78, + 73, 65, 83, 128, 77, 79, 78, 79, 67, 85, 76, 65, 210, 77, 79, 78, 79, 67, + 76, 69, 128, 77, 79, 78, 75, 69, 89, 128, 77, 79, 78, 75, 69, 217, 77, + 79, 78, 73, 128, 77, 79, 78, 71, 75, 69, 85, 65, 69, 81, 128, 77, 79, 78, + 69, 89, 45, 77, 79, 85, 84, 200, 77, 79, 78, 69, 217, 77, 79, 78, 128, + 77, 79, 206, 77, 79, 76, 128, 77, 79, 72, 65, 77, 77, 65, 196, 77, 79, + 68, 85, 76, 207, 77, 79, 68, 73, 70, 73, 69, 82, 45, 57, 128, 77, 79, 68, + 73, 70, 73, 69, 82, 45, 56, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 55, + 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 54, 128, 77, 79, 68, 73, 70, 73, + 69, 82, 45, 53, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 52, 128, 77, 79, + 68, 73, 70, 73, 69, 82, 45, 51, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, + 50, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 49, 54, 128, 77, 79, 68, 73, + 70, 73, 69, 82, 45, 49, 53, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 49, + 52, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 49, 51, 128, 77, 79, 68, 73, + 70, 73, 69, 82, 45, 49, 50, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 49, + 49, 128, 77, 79, 68, 73, 70, 73, 69, 82, 45, 49, 48, 128, 77, 79, 68, 73, + 70, 73, 69, 82, 128, 77, 79, 68, 201, 77, 79, 68, 69, 83, 84, 89, 128, + 77, 79, 68, 69, 82, 206, 77, 79, 68, 69, 77, 128, 77, 79, 68, 69, 76, 83, + 128, 77, 79, 68, 69, 76, 128, 77, 79, 68, 69, 128, 77, 79, 66, 73, 76, + 197, 77, 79, 65, 128, 77, 79, 45, 54, 128, 77, 79, 45, 53, 128, 77, 79, + 45, 52, 128, 77, 79, 45, 51, 128, 77, 207, 77, 78, 89, 65, 205, 77, 78, + 65, 83, 128, 77, 77, 83, 80, 128, 77, 77, 128, 77, 205, 77, 76, 65, 128, + 77, 76, 128, 77, 75, 80, 65, 82, 65, 209, 77, 73, 88, 128, 77, 73, 84, + 128, 77, 73, 83, 82, 65, 128, 77, 73, 82, 82, 79, 82, 128, 77, 73, 82, + 73, 66, 65, 65, 82, 85, 128, 77, 73, 82, 73, 128, 77, 73, 82, 69, 68, + 128, 77, 73, 80, 128, 77, 73, 78, 89, 128, 77, 73, 78, 85, 83, 45, 79, + 82, 45, 80, 76, 85, 211, 77, 73, 78, 85, 83, 128, 77, 73, 78, 73, 83, 84, + 69, 82, 128, 77, 73, 78, 73, 77, 73, 90, 69, 128, 77, 73, 78, 73, 77, 65, + 128, 77, 73, 78, 73, 68, 73, 83, 67, 128, 77, 73, 78, 73, 66, 85, 83, + 128, 77, 73, 77, 69, 128, 77, 73, 77, 128, 77, 73, 76, 76, 73, 79, 78, + 83, 128, 77, 73, 76, 76, 73, 79, 78, 211, 77, 73, 76, 76, 69, 84, 128, + 77, 73, 76, 76, 197, 77, 73, 76, 204, 77, 73, 76, 75, 217, 77, 73, 76, + 75, 128, 77, 73, 76, 73, 84, 65, 82, 217, 77, 73, 76, 128, 77, 73, 75, + 85, 82, 79, 78, 128, 77, 73, 75, 82, 79, 206, 77, 73, 75, 82, 73, 128, + 77, 73, 73, 78, 128, 77, 73, 73, 77, 128, 77, 73, 73, 128, 77, 73, 199, + 77, 73, 69, 88, 128, 77, 73, 69, 85, 77, 45, 84, 73, 75, 69, 85, 84, 128, + 77, 73, 69, 85, 77, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 77, 73, + 69, 85, 77, 45, 83, 83, 65, 78, 71, 78, 73, 69, 85, 78, 128, 77, 73, 69, + 85, 77, 45, 82, 73, 69, 85, 76, 128, 77, 73, 69, 85, 77, 45, 80, 73, 69, + 85, 80, 45, 83, 73, 79, 83, 128, 77, 73, 69, 85, 77, 45, 80, 73, 69, 85, + 80, 128, 77, 73, 69, 85, 77, 45, 80, 65, 78, 83, 73, 79, 83, 128, 77, 73, + 69, 85, 77, 45, 78, 73, 69, 85, 78, 128, 77, 73, 69, 85, 77, 45, 67, 73, + 69, 85, 67, 128, 77, 73, 69, 85, 77, 45, 67, 72, 73, 69, 85, 67, 72, 128, + 77, 73, 69, 85, 205, 77, 73, 69, 80, 128, 77, 73, 69, 69, 128, 77, 73, + 69, 128, 77, 73, 68, 76, 73, 78, 197, 77, 73, 68, 68, 76, 69, 45, 87, 69, + 76, 83, 200, 77, 73, 68, 68, 76, 69, 128, 77, 73, 68, 45, 76, 69, 86, 69, + 204, 77, 73, 196, 77, 73, 67, 82, 79, 83, 67, 79, 80, 69, 128, 77, 73, + 67, 82, 79, 80, 72, 79, 78, 69, 128, 77, 73, 67, 82, 79, 66, 69, 128, 77, + 73, 67, 82, 207, 77, 73, 67, 210, 77, 73, 45, 55, 128, 77, 73, 45, 54, + 128, 77, 73, 45, 53, 128, 77, 73, 45, 52, 128, 77, 73, 45, 51, 128, 77, + 73, 45, 50, 128, 77, 73, 45, 49, 128, 77, 72, 90, 128, 77, 72, 65, 128, + 77, 72, 128, 77, 71, 85, 88, 128, 77, 71, 85, 84, 128, 77, 71, 85, 82, + 88, 128, 77, 71, 85, 82, 128, 77, 71, 85, 80, 128, 77, 71, 85, 79, 88, + 128, 77, 71, 85, 79, 80, 128, 77, 71, 85, 79, 128, 77, 71, 85, 128, 77, + 71, 79, 88, 128, 77, 71, 79, 84, 128, 77, 71, 79, 80, 128, 77, 71, 79, + 128, 77, 71, 207, 77, 71, 73, 69, 88, 128, 77, 71, 73, 69, 128, 77, 71, + 69, 88, 128, 77, 71, 69, 80, 128, 77, 71, 69, 128, 77, 71, 66, 85, 128, + 77, 71, 66, 79, 79, 128, 77, 71, 66, 79, 70, 85, 77, 128, 77, 71, 66, 79, + 128, 77, 71, 66, 73, 128, 77, 71, 66, 69, 85, 78, 128, 77, 71, 66, 69, + 78, 128, 77, 71, 66, 69, 69, 128, 77, 71, 66, 69, 128, 77, 71, 66, 65, + 83, 65, 81, 128, 77, 71, 66, 65, 83, 65, 128, 77, 71, 65, 88, 128, 77, + 71, 65, 84, 128, 77, 71, 65, 80, 128, 77, 71, 65, 128, 77, 71, 128, 77, + 70, 79, 78, 128, 77, 70, 79, 206, 77, 70, 79, 128, 77, 70, 73, 89, 65, + 81, 128, 77, 70, 73, 69, 69, 128, 77, 70, 69, 85, 84, 128, 77, 70, 69, + 85, 81, 128, 77, 70, 69, 85, 65, 69, 128, 77, 70, 65, 65, 128, 77, 69, + 90, 90, 79, 128, 77, 69, 88, 128, 77, 69, 85, 212, 77, 69, 85, 81, 128, + 77, 69, 85, 78, 74, 79, 77, 78, 68, 69, 85, 81, 128, 77, 69, 85, 78, 128, + 77, 69, 84, 82, 79, 128, 77, 69, 84, 82, 73, 67, 65, 204, 77, 69, 84, 82, + 73, 65, 128, 77, 69, 84, 82, 69, 84, 69, 211, 77, 69, 84, 79, 66, 69, 76, + 85, 83, 128, 77, 69, 84, 69, 75, 128, 77, 69, 84, 69, 71, 128, 77, 69, + 84, 65, 76, 128, 77, 69, 84, 193, 77, 69, 83, 83, 69, 78, 73, 65, 206, + 77, 69, 83, 83, 65, 71, 69, 128, 77, 69, 83, 83, 65, 71, 197, 77, 69, 83, + 79, 128, 77, 69, 83, 73, 128, 77, 69, 83, 72, 128, 77, 69, 82, 80, 69, + 82, 83, 79, 78, 128, 77, 69, 82, 75, 72, 65, 128, 77, 69, 82, 75, 72, + 193, 77, 69, 82, 73, 68, 73, 65, 78, 83, 128, 77, 69, 82, 73, 128, 77, + 69, 82, 71, 69, 128, 77, 69, 82, 67, 85, 82, 89, 128, 77, 69, 82, 67, 85, + 82, 217, 77, 69, 78, 79, 82, 65, 200, 77, 69, 78, 79, 69, 128, 77, 69, + 78, 68, 85, 84, 128, 77, 69, 78, 128, 77, 69, 77, 79, 128, 77, 69, 77, + 66, 69, 82, 83, 72, 73, 80, 128, 77, 69, 77, 66, 69, 82, 128, 77, 69, 77, + 66, 69, 210, 77, 69, 77, 45, 81, 79, 80, 72, 128, 77, 69, 77, 128, 77, + 69, 205, 77, 69, 76, 79, 68, 73, 195, 77, 69, 76, 73, 75, 128, 77, 69, + 73, 90, 73, 128, 77, 69, 71, 65, 84, 79, 78, 128, 77, 69, 71, 65, 80, 72, + 79, 78, 69, 128, 77, 69, 71, 65, 76, 73, 128, 77, 69, 69, 84, 79, 82, 85, + 128, 77, 69, 69, 84, 69, 201, 77, 69, 69, 84, 128, 77, 69, 69, 77, 85, + 128, 77, 69, 69, 77, 128, 77, 69, 69, 202, 77, 69, 69, 69, 69, 128, 77, + 69, 68, 73, 85, 77, 128, 77, 69, 68, 73, 85, 205, 77, 69, 68, 73, 69, 86, + 65, 204, 77, 69, 68, 73, 67, 73, 78, 69, 128, 77, 69, 68, 73, 67, 65, + 204, 77, 69, 68, 73, 65, 204, 77, 69, 68, 69, 70, 65, 73, 68, 82, 73, + 206, 77, 69, 68, 65, 76, 128, 77, 69, 67, 72, 65, 78, 73, 67, 65, 204, + 77, 69, 65, 84, 128, 77, 69, 65, 212, 77, 69, 65, 83, 85, 82, 69, 196, + 77, 69, 65, 83, 85, 82, 69, 128, 77, 69, 65, 83, 85, 82, 197, 77, 69, 45, + 77, 65, 128, 77, 69, 45, 50, 128, 77, 69, 45, 49, 128, 77, 68, 85, 206, + 77, 196, 77, 67, 72, 213, 77, 67, 72, 65, 206, 77, 195, 77, 66, 85, 85, + 128, 77, 66, 85, 79, 81, 128, 77, 66, 85, 79, 128, 77, 66, 85, 69, 128, + 77, 66, 85, 65, 69, 77, 128, 77, 66, 85, 65, 69, 128, 77, 66, 79, 79, + 128, 77, 66, 79, 128, 77, 66, 73, 84, 128, 77, 66, 73, 212, 77, 66, 73, + 82, 73, 69, 69, 78, 128, 77, 66, 73, 128, 77, 66, 69, 85, 88, 128, 77, + 66, 69, 85, 82, 73, 128, 77, 66, 69, 85, 77, 128, 77, 66, 69, 82, 65, 69, + 128, 77, 66, 69, 78, 128, 77, 66, 69, 69, 75, 69, 69, 84, 128, 77, 66, + 69, 69, 128, 77, 66, 69, 128, 77, 66, 65, 81, 128, 77, 66, 65, 78, 89, + 73, 128, 77, 66, 65, 65, 82, 65, 69, 128, 77, 66, 65, 65, 75, 69, 84, + 128, 77, 66, 65, 65, 128, 77, 66, 65, 193, 77, 66, 193, 77, 66, 52, 128, + 77, 66, 51, 128, 77, 66, 50, 128, 77, 65, 89, 69, 203, 77, 65, 89, 65, + 78, 78, 65, 128, 77, 65, 89, 65, 206, 77, 65, 89, 128, 77, 65, 88, 73, + 77, 73, 90, 69, 128, 77, 65, 88, 73, 77, 65, 128, 77, 65, 88, 128, 77, + 65, 85, 128, 77, 65, 84, 84, 79, 67, 75, 128, 77, 65, 84, 82, 73, 88, + 128, 77, 65, 84, 69, 82, 73, 65, 76, 83, 128, 77, 65, 84, 128, 77, 65, + 83, 213, 77, 65, 83, 83, 73, 78, 71, 128, 77, 65, 83, 83, 65, 71, 69, + 128, 77, 65, 83, 79, 82, 193, 77, 65, 83, 75, 128, 77, 65, 83, 203, 77, + 65, 83, 72, 70, 65, 65, 84, 128, 77, 65, 83, 72, 50, 128, 77, 65, 83, 67, + 85, 76, 73, 78, 197, 77, 65, 83, 65, 82, 65, 205, 77, 65, 82, 89, 128, + 77, 65, 82, 87, 65, 82, 201, 77, 65, 82, 85, 75, 85, 128, 77, 65, 82, 84, + 89, 82, 73, 193, 77, 65, 82, 84, 73, 65, 204, 77, 65, 82, 82, 89, 73, 78, + 199, 77, 65, 82, 82, 73, 65, 71, 197, 77, 65, 82, 82, 65, 84, 65, 78, + 128, 77, 65, 82, 75, 211, 77, 65, 82, 75, 69, 82, 128, 77, 65, 82, 75, + 45, 52, 128, 77, 65, 82, 75, 45, 51, 128, 77, 65, 82, 75, 45, 50, 128, + 77, 65, 82, 75, 45, 49, 128, 77, 65, 82, 69, 128, 77, 65, 82, 67, 72, 69, + 206, 77, 65, 82, 67, 72, 128, 77, 65, 82, 67, 65, 84, 79, 45, 83, 84, 65, + 67, 67, 65, 84, 79, 128, 77, 65, 82, 67, 65, 84, 79, 128, 77, 65, 82, 67, + 65, 83, 73, 84, 69, 128, 77, 65, 82, 66, 85, 84, 65, 128, 77, 65, 82, 66, + 85, 84, 193, 77, 65, 82, 128, 77, 65, 81, 65, 70, 128, 77, 65, 81, 128, + 77, 65, 80, 76, 197, 77, 65, 80, 73, 81, 128, 77, 65, 208, 77, 65, 79, + 128, 77, 65, 78, 85, 65, 204, 77, 65, 78, 84, 69, 76, 80, 73, 69, 67, + 197, 77, 65, 78, 83, 89, 79, 78, 128, 77, 65, 78, 83, 85, 65, 69, 128, + 77, 65, 78, 78, 65, 218, 77, 65, 78, 78, 65, 128, 77, 65, 78, 73, 67, 72, + 65, 69, 65, 206, 77, 65, 78, 71, 79, 128, 77, 65, 78, 71, 65, 76, 65, 77, + 128, 77, 65, 78, 68, 65, 82, 73, 78, 128, 77, 65, 78, 68, 65, 73, 76, 73, + 78, 199, 77, 65, 78, 68, 65, 73, 195, 77, 65, 78, 67, 72, 213, 77, 65, + 78, 65, 212, 77, 65, 78, 65, 67, 76, 69, 83, 128, 77, 65, 77, 77, 79, 84, + 72, 128, 77, 65, 76, 84, 69, 83, 197, 77, 65, 76, 69, 69, 82, 73, 128, + 77, 65, 76, 197, 77, 65, 76, 65, 75, 79, 206, 77, 65, 75, 83, 85, 82, 65, + 128, 77, 65, 75, 83, 85, 82, 193, 77, 65, 75, 65, 83, 65, 210, 77, 65, + 73, 90, 69, 128, 77, 65, 73, 89, 65, 77, 79, 75, 128, 77, 65, 73, 84, 65, + 73, 75, 72, 85, 128, 77, 65, 73, 82, 85, 128, 77, 65, 73, 77, 85, 65, 78, + 128, 77, 65, 73, 77, 65, 76, 65, 73, 128, 77, 65, 73, 76, 66, 79, 216, + 77, 65, 73, 75, 85, 82, 79, 128, 77, 65, 73, 68, 69, 78, 128, 77, 65, 73, + 128, 77, 65, 72, 74, 79, 78, 199, 77, 65, 72, 72, 65, 128, 77, 65, 72, + 65, 80, 82, 65, 78, 65, 128, 77, 65, 72, 65, 80, 65, 75, 72, 128, 77, 65, + 72, 65, 74, 65, 78, 201, 77, 65, 72, 65, 65, 80, 82, 65, 65, 78, 193, 77, + 65, 72, 128, 77, 65, 71, 78, 73, 70, 89, 73, 78, 199, 77, 65, 71, 78, 69, + 84, 128, 77, 65, 71, 73, 195, 77, 65, 71, 69, 128, 77, 65, 69, 83, 73, + 128, 77, 65, 69, 78, 89, 73, 128, 77, 65, 69, 78, 74, 69, 84, 128, 77, + 65, 69, 77, 86, 69, 85, 88, 128, 77, 65, 69, 77, 75, 80, 69, 78, 128, 77, + 65, 69, 77, 71, 66, 73, 69, 69, 128, 77, 65, 69, 77, 66, 71, 66, 73, 69, + 69, 128, 77, 65, 69, 77, 66, 65, 128, 77, 65, 69, 77, 128, 77, 65, 69, + 76, 69, 69, 128, 77, 65, 69, 75, 69, 85, 80, 128, 77, 65, 68, 89, 65, + 128, 77, 65, 68, 85, 128, 77, 65, 68, 68, 65, 72, 128, 77, 65, 68, 68, + 65, 200, 77, 65, 68, 68, 65, 128, 77, 65, 68, 68, 193, 77, 65, 67, 82, + 79, 78, 45, 71, 82, 65, 86, 69, 128, 77, 65, 67, 82, 79, 78, 45, 66, 82, + 69, 86, 69, 128, 77, 65, 67, 82, 79, 78, 45, 65, 67, 85, 84, 69, 128, 77, + 65, 67, 82, 79, 78, 128, 77, 65, 67, 82, 79, 206, 77, 65, 67, 72, 73, 78, + 69, 128, 77, 65, 65, 89, 89, 65, 65, 128, 77, 65, 65, 73, 128, 77, 65, + 65, 128, 77, 65, 50, 128, 77, 65, 45, 55, 128, 77, 65, 45, 54, 128, 77, + 65, 45, 53, 128, 77, 65, 45, 52, 128, 77, 65, 45, 51, 128, 77, 65, 45, + 50, 128, 77, 65, 45, 49, 128, 77, 49, 57, 183, 77, 49, 57, 182, 77, 49, + 57, 181, 77, 49, 57, 180, 77, 49, 57, 179, 77, 49, 57, 178, 77, 49, 57, + 177, 77, 49, 57, 176, 77, 49, 56, 185, 77, 49, 56, 184, 77, 49, 56, 183, + 77, 49, 56, 182, 77, 49, 56, 181, 77, 49, 56, 180, 77, 49, 56, 179, 77, + 49, 56, 178, 77, 49, 56, 177, 77, 49, 56, 176, 77, 49, 55, 185, 77, 49, + 55, 184, 77, 49, 55, 183, 77, 49, 55, 182, 77, 49, 55, 181, 77, 49, 55, + 180, 77, 49, 55, 179, 77, 49, 55, 178, 77, 49, 55, 177, 77, 49, 55, 176, + 77, 49, 54, 185, 77, 49, 54, 184, 77, 49, 54, 183, 77, 49, 54, 182, 77, + 49, 54, 181, 77, 49, 54, 180, 77, 49, 54, 179, 77, 49, 54, 178, 77, 49, + 54, 177, 77, 49, 54, 176, 77, 49, 53, 185, 77, 49, 53, 184, 77, 49, 53, + 183, 77, 49, 53, 182, 77, 49, 53, 181, 77, 49, 53, 180, 77, 49, 53, 179, + 77, 49, 53, 178, 77, 49, 53, 177, 77, 49, 53, 176, 77, 49, 52, 185, 77, + 49, 52, 184, 77, 49, 52, 183, 77, 49, 52, 182, 77, 49, 52, 181, 77, 49, + 52, 180, 77, 49, 52, 179, 77, 49, 52, 178, 77, 49, 52, 177, 77, 49, 52, + 176, 77, 49, 51, 185, 77, 49, 51, 184, 77, 49, 51, 183, 77, 49, 51, 182, + 77, 49, 51, 181, 77, 49, 51, 180, 77, 49, 51, 179, 77, 49, 51, 178, 77, + 49, 51, 177, 77, 49, 51, 176, 77, 49, 50, 185, 77, 49, 50, 184, 77, 49, + 50, 183, 77, 49, 50, 182, 77, 49, 50, 181, 77, 49, 50, 180, 77, 49, 50, + 179, 77, 49, 50, 178, 77, 49, 50, 177, 77, 49, 50, 176, 77, 49, 49, 185, + 77, 49, 49, 184, 77, 49, 49, 183, 77, 49, 49, 182, 77, 49, 49, 181, 77, + 49, 49, 180, 77, 49, 49, 179, 77, 49, 49, 178, 77, 49, 49, 177, 77, 49, + 49, 176, 77, 49, 48, 185, 77, 49, 48, 184, 77, 49, 48, 183, 77, 49, 48, + 182, 77, 49, 48, 181, 77, 49, 48, 180, 77, 49, 48, 179, 77, 49, 48, 178, + 77, 49, 48, 177, 77, 49, 48, 176, 77, 48, 57, 185, 77, 48, 57, 184, 77, + 48, 57, 183, 77, 48, 57, 182, 77, 48, 57, 181, 77, 48, 57, 180, 77, 48, + 57, 179, 77, 48, 57, 178, 77, 48, 57, 177, 77, 48, 57, 176, 77, 48, 56, + 185, 77, 48, 56, 184, 77, 48, 56, 183, 77, 48, 56, 182, 77, 48, 56, 181, + 77, 48, 56, 180, 77, 48, 56, 179, 77, 48, 56, 178, 77, 48, 56, 177, 77, + 48, 56, 176, 77, 48, 55, 185, 77, 48, 55, 184, 77, 48, 55, 183, 77, 48, + 55, 182, 77, 48, 55, 181, 77, 48, 55, 180, 77, 48, 55, 179, 77, 48, 55, + 178, 77, 48, 55, 177, 77, 48, 55, 176, 77, 48, 54, 185, 77, 48, 54, 184, + 77, 48, 54, 183, 77, 48, 54, 182, 77, 48, 54, 181, 77, 48, 54, 180, 77, + 48, 54, 179, 77, 48, 54, 178, 77, 48, 54, 177, 77, 48, 54, 176, 77, 48, + 53, 185, 77, 48, 53, 184, 77, 48, 53, 183, 77, 48, 53, 182, 77, 48, 53, + 181, 77, 48, 53, 180, 77, 48, 53, 179, 77, 48, 53, 178, 77, 48, 53, 177, + 77, 48, 53, 176, 77, 48, 52, 185, 77, 48, 52, 184, 77, 48, 52, 183, 77, + 48, 52, 182, 77, 48, 52, 181, 77, 48, 52, 52, 128, 77, 48, 52, 180, 77, + 48, 52, 51, 128, 77, 48, 52, 179, 77, 48, 52, 50, 128, 77, 48, 52, 178, + 77, 48, 52, 49, 128, 77, 48, 52, 177, 77, 48, 52, 48, 65, 128, 77, 48, + 52, 48, 128, 77, 48, 52, 176, 77, 48, 51, 57, 128, 77, 48, 51, 185, 77, + 48, 51, 56, 128, 77, 48, 51, 184, 77, 48, 51, 55, 128, 77, 48, 51, 183, + 77, 48, 51, 54, 128, 77, 48, 51, 182, 77, 48, 51, 53, 128, 77, 48, 51, + 181, 77, 48, 51, 52, 128, 77, 48, 51, 180, 77, 48, 51, 51, 66, 128, 77, + 48, 51, 51, 65, 128, 77, 48, 51, 51, 128, 77, 48, 51, 179, 77, 48, 51, + 50, 128, 77, 48, 51, 178, 77, 48, 51, 49, 65, 128, 77, 48, 51, 49, 128, + 77, 48, 51, 177, 77, 48, 51, 48, 128, 77, 48, 51, 176, 77, 48, 50, 57, + 128, 77, 48, 50, 185, 77, 48, 50, 56, 65, 128, 77, 48, 50, 56, 128, 77, + 48, 50, 184, 77, 48, 50, 55, 128, 77, 48, 50, 183, 77, 48, 50, 54, 128, + 77, 48, 50, 182, 77, 48, 50, 53, 128, 77, 48, 50, 181, 77, 48, 50, 52, + 65, 128, 77, 48, 50, 52, 128, 77, 48, 50, 180, 77, 48, 50, 51, 128, 77, + 48, 50, 179, 77, 48, 50, 50, 65, 128, 77, 48, 50, 50, 128, 77, 48, 50, + 178, 77, 48, 50, 49, 128, 77, 48, 50, 177, 77, 48, 50, 48, 128, 77, 48, + 50, 176, 77, 48, 49, 57, 128, 77, 48, 49, 185, 77, 48, 49, 56, 128, 77, + 48, 49, 184, 77, 48, 49, 55, 65, 128, 77, 48, 49, 55, 128, 77, 48, 49, + 183, 77, 48, 49, 54, 65, 128, 77, 48, 49, 54, 128, 77, 48, 49, 182, 77, + 48, 49, 53, 65, 128, 77, 48, 49, 53, 128, 77, 48, 49, 181, 77, 48, 49, + 52, 128, 77, 48, 49, 180, 77, 48, 49, 51, 128, 77, 48, 49, 179, 77, 48, + 49, 50, 72, 128, 77, 48, 49, 50, 71, 128, 77, 48, 49, 50, 70, 128, 77, + 48, 49, 50, 69, 128, 77, 48, 49, 50, 68, 128, 77, 48, 49, 50, 67, 128, + 77, 48, 49, 50, 66, 128, 77, 48, 49, 50, 65, 128, 77, 48, 49, 50, 128, + 77, 48, 49, 178, 77, 48, 49, 49, 128, 77, 48, 49, 177, 77, 48, 49, 48, + 65, 128, 77, 48, 49, 48, 128, 77, 48, 49, 176, 77, 48, 48, 57, 128, 77, + 48, 48, 185, 77, 48, 48, 56, 128, 77, 48, 48, 184, 77, 48, 48, 55, 128, + 77, 48, 48, 183, 77, 48, 48, 54, 128, 77, 48, 48, 182, 77, 48, 48, 53, + 128, 77, 48, 48, 181, 77, 48, 48, 52, 128, 77, 48, 48, 180, 77, 48, 48, + 51, 65, 128, 77, 48, 48, 51, 128, 77, 48, 48, 179, 77, 48, 48, 50, 128, + 77, 48, 48, 178, 77, 48, 48, 49, 66, 128, 77, 48, 48, 49, 65, 128, 77, + 48, 48, 49, 128, 77, 48, 48, 177, 76, 218, 76, 89, 89, 128, 76, 89, 88, + 128, 76, 89, 84, 128, 76, 89, 82, 88, 128, 76, 89, 82, 128, 76, 89, 80, + 128, 76, 89, 73, 84, 128, 76, 89, 73, 78, 199, 76, 89, 68, 73, 65, 206, + 76, 89, 67, 73, 65, 206, 76, 88, 128, 76, 87, 79, 79, 128, 76, 87, 79, + 128, 76, 87, 73, 73, 128, 76, 87, 73, 128, 76, 87, 69, 128, 76, 87, 65, + 65, 128, 76, 87, 65, 128, 76, 85, 88, 128, 76, 85, 85, 128, 76, 85, 84, + 128, 76, 85, 82, 88, 128, 76, 85, 80, 128, 76, 85, 79, 88, 128, 76, 85, + 79, 84, 128, 76, 85, 79, 80, 128, 76, 85, 79, 128, 76, 85, 78, 71, 83, + 73, 128, 76, 85, 78, 71, 83, 128, 76, 85, 78, 65, 84, 197, 76, 85, 205, + 76, 85, 76, 128, 76, 85, 73, 83, 128, 76, 85, 72, 85, 82, 128, 76, 85, + 72, 128, 76, 85, 200, 76, 85, 71, 71, 65, 71, 69, 128, 76, 85, 71, 65, + 76, 128, 76, 85, 71, 65, 204, 76, 85, 69, 128, 76, 85, 197, 76, 85, 66, + 128, 76, 85, 65, 69, 80, 128, 76, 85, 51, 128, 76, 85, 50, 128, 76, 85, + 178, 76, 82, 79, 128, 76, 82, 77, 128, 76, 82, 73, 128, 76, 82, 69, 128, + 76, 79, 90, 69, 78, 71, 69, 128, 76, 79, 90, 69, 78, 71, 197, 76, 79, 88, + 128, 76, 79, 87, 69, 82, 69, 196, 76, 79, 87, 45, 82, 69, 86, 69, 82, 83, + 69, 68, 45, 185, 76, 79, 87, 45, 77, 73, 196, 76, 79, 87, 45, 70, 65, 76, + 76, 73, 78, 199, 76, 79, 87, 45, 185, 76, 79, 86, 197, 76, 79, 85, 82, + 69, 128, 76, 79, 85, 68, 83, 80, 69, 65, 75, 69, 82, 128, 76, 79, 85, 68, + 76, 217, 76, 79, 84, 85, 83, 128, 76, 79, 84, 85, 211, 76, 79, 84, 73, + 79, 206, 76, 79, 84, 128, 76, 79, 83, 83, 76, 69, 83, 83, 128, 76, 79, + 82, 82, 89, 128, 76, 79, 82, 82, 65, 73, 78, 69, 128, 76, 79, 81, 128, + 76, 79, 80, 128, 76, 79, 79, 84, 128, 76, 79, 79, 80, 69, 196, 76, 79, + 79, 80, 128, 76, 79, 79, 208, 76, 79, 79, 78, 128, 76, 79, 79, 203, 76, + 79, 79, 128, 76, 79, 78, 83, 85, 77, 128, 76, 79, 78, 71, 65, 128, 76, + 79, 78, 71, 193, 76, 79, 78, 71, 45, 76, 69, 71, 71, 69, 196, 76, 79, 78, + 71, 45, 66, 82, 65, 78, 67, 72, 45, 89, 82, 128, 76, 79, 78, 71, 45, 66, + 82, 65, 78, 67, 72, 45, 83, 79, 204, 76, 79, 78, 71, 45, 66, 82, 65, 78, + 67, 72, 45, 79, 83, 211, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, + 77, 65, 68, 210, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 72, 65, + 71, 65, 76, 204, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 65, 210, + 76, 79, 77, 77, 65, 69, 128, 76, 79, 77, 128, 76, 79, 205, 76, 79, 76, + 76, 73, 80, 79, 80, 128, 76, 79, 76, 76, 128, 76, 79, 71, 210, 76, 79, + 71, 79, 84, 89, 80, 197, 76, 79, 71, 79, 71, 82, 65, 205, 76, 79, 71, + 128, 76, 79, 68, 69, 83, 84, 79, 78, 69, 128, 76, 79, 67, 79, 77, 79, 84, + 73, 86, 69, 128, 76, 79, 67, 75, 73, 78, 71, 45, 83, 72, 73, 70, 212, 76, + 79, 67, 65, 84, 73, 86, 69, 128, 76, 79, 67, 65, 84, 73, 79, 78, 45, 87, + 65, 76, 76, 80, 76, 65, 78, 197, 76, 79, 67, 65, 84, 73, 79, 78, 45, 70, + 76, 79, 79, 82, 80, 76, 65, 78, 197, 76, 79, 67, 65, 84, 73, 79, 78, 128, + 76, 79, 67, 65, 84, 73, 79, 206, 76, 79, 66, 83, 84, 69, 82, 128, 76, 79, + 65, 128, 76, 78, 128, 76, 76, 85, 85, 128, 76, 76, 79, 79, 128, 76, 76, + 76, 85, 85, 128, 76, 76, 76, 85, 128, 76, 76, 76, 79, 79, 128, 76, 76, + 76, 79, 128, 76, 76, 76, 73, 73, 128, 76, 76, 76, 73, 128, 76, 76, 76, + 69, 69, 128, 76, 76, 76, 69, 128, 76, 76, 76, 65, 85, 128, 76, 76, 76, + 65, 73, 128, 76, 76, 76, 65, 65, 128, 76, 76, 76, 65, 128, 76, 76, 76, + 128, 76, 76, 72, 65, 128, 76, 76, 65, 77, 65, 128, 76, 74, 85, 68, 73, + 74, 69, 128, 76, 74, 69, 128, 76, 74, 128, 76, 73, 90, 65, 82, 68, 128, + 76, 73, 88, 128, 76, 73, 87, 78, 128, 76, 73, 86, 82, 197, 76, 73, 84, + 84, 76, 69, 128, 76, 73, 84, 84, 76, 197, 76, 73, 84, 84, 69, 210, 76, + 73, 84, 82, 193, 76, 73, 84, 200, 76, 73, 83, 213, 76, 73, 83, 128, 76, + 73, 82, 193, 76, 73, 81, 85, 73, 196, 76, 73, 81, 128, 76, 73, 80, 83, + 84, 73, 67, 75, 128, 76, 73, 80, 211, 76, 73, 208, 76, 73, 78, 75, 73, + 78, 199, 76, 73, 78, 75, 69, 196, 76, 73, 78, 203, 76, 73, 78, 71, 83, + 65, 128, 76, 73, 78, 69, 83, 128, 76, 73, 78, 69, 211, 76, 73, 78, 69, + 45, 57, 128, 76, 73, 78, 69, 45, 55, 128, 76, 73, 78, 69, 45, 51, 128, + 76, 73, 78, 69, 45, 49, 128, 76, 73, 77, 77, 85, 52, 128, 76, 73, 77, 77, + 85, 50, 128, 76, 73, 77, 77, 85, 128, 76, 73, 77, 77, 213, 76, 73, 77, + 73, 84, 69, 196, 76, 73, 77, 73, 84, 65, 84, 73, 79, 78, 128, 76, 73, 77, + 73, 84, 128, 76, 73, 77, 69, 128, 76, 73, 77, 66, 213, 76, 73, 77, 66, + 211, 76, 73, 77, 194, 76, 73, 76, 89, 128, 76, 73, 76, 73, 84, 72, 128, + 76, 73, 76, 128, 76, 73, 71, 72, 84, 78, 73, 78, 71, 128, 76, 73, 71, 72, + 84, 78, 73, 78, 199, 76, 73, 71, 72, 84, 72, 79, 85, 83, 69, 128, 76, 73, + 71, 72, 84, 128, 76, 73, 71, 65, 84, 73, 78, 199, 76, 73, 70, 84, 69, 82, + 128, 76, 73, 70, 69, 128, 76, 73, 69, 88, 128, 76, 73, 69, 84, 128, 76, + 73, 69, 80, 128, 76, 73, 69, 69, 128, 76, 73, 69, 128, 76, 73, 68, 128, + 76, 73, 67, 75, 73, 78, 199, 76, 73, 66, 82, 65, 128, 76, 73, 66, 69, 82, + 84, 89, 128, 76, 73, 65, 66, 73, 76, 73, 84, 217, 76, 72, 73, 73, 128, + 76, 72, 65, 86, 73, 89, 65, 78, 73, 128, 76, 72, 65, 199, 76, 72, 65, 65, + 128, 76, 72, 128, 76, 69, 90, 72, 128, 76, 69, 88, 128, 76, 69, 86, 73, + 84, 65, 84, 73, 78, 71, 128, 76, 69, 85, 77, 128, 76, 69, 85, 65, 69, 80, + 128, 76, 69, 85, 65, 69, 77, 128, 76, 69, 85, 128, 76, 69, 213, 76, 69, + 84, 84, 69, 82, 83, 128, 76, 69, 84, 84, 69, 82, 128, 76, 69, 212, 76, + 69, 83, 83, 69, 210, 76, 69, 83, 83, 45, 84, 72, 65, 78, 128, 76, 69, 83, + 83, 45, 84, 72, 65, 206, 76, 69, 83, 72, 128, 76, 69, 80, 67, 72, 193, + 76, 69, 80, 128, 76, 69, 79, 80, 65, 82, 68, 128, 76, 69, 79, 128, 76, + 69, 78, 84, 73, 67, 85, 76, 65, 210, 76, 69, 78, 73, 83, 128, 76, 69, 78, + 73, 211, 76, 69, 78, 71, 84, 72, 69, 78, 69, 82, 128, 76, 69, 78, 71, 84, + 72, 45, 55, 128, 76, 69, 78, 71, 84, 72, 45, 54, 128, 76, 69, 78, 71, 84, + 72, 45, 53, 128, 76, 69, 78, 71, 84, 72, 45, 52, 128, 76, 69, 78, 71, 84, + 72, 45, 51, 128, 76, 69, 78, 71, 84, 72, 45, 50, 128, 76, 69, 78, 71, 84, + 72, 45, 49, 128, 76, 69, 78, 71, 84, 200, 76, 69, 78, 71, 65, 128, 76, + 69, 78, 71, 193, 76, 69, 77, 79, 78, 128, 76, 69, 77, 79, 73, 128, 76, + 69, 76, 69, 84, 128, 76, 69, 76, 69, 212, 76, 69, 203, 76, 69, 73, 77, + 77, 65, 128, 76, 69, 73, 77, 77, 193, 76, 69, 73, 128, 76, 69, 71, 83, + 128, 76, 69, 71, 73, 79, 78, 128, 76, 69, 71, 69, 84, 79, 211, 76, 69, + 71, 128, 76, 69, 199, 76, 69, 70, 84, 87, 65, 82, 68, 83, 128, 76, 69, + 70, 84, 45, 84, 79, 45, 82, 73, 71, 72, 212, 76, 69, 70, 84, 45, 83, 84, + 69, 205, 76, 69, 70, 84, 45, 83, 73, 68, 197, 76, 69, 70, 84, 45, 83, 72, + 65, 68, 69, 196, 76, 69, 70, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 76, + 69, 70, 84, 45, 76, 73, 71, 72, 84, 69, 196, 76, 69, 70, 84, 45, 72, 65, + 78, 68, 69, 196, 76, 69, 70, 84, 45, 72, 65, 78, 196, 76, 69, 70, 84, 45, + 70, 65, 67, 73, 78, 199, 76, 69, 70, 84, 128, 76, 69, 69, 82, 65, 69, 87, + 65, 128, 76, 69, 69, 75, 128, 76, 69, 69, 69, 69, 128, 76, 69, 68, 71, + 69, 82, 128, 76, 69, 65, 84, 72, 69, 82, 128, 76, 69, 65, 78, 73, 78, + 199, 76, 69, 65, 70, 217, 76, 69, 65, 70, 128, 76, 69, 65, 198, 76, 69, + 65, 68, 69, 82, 128, 76, 69, 65, 196, 76, 68, 65, 78, 128, 76, 68, 50, + 128, 76, 67, 201, 76, 67, 197, 76, 65, 90, 217, 76, 65, 89, 65, 78, 78, + 65, 128, 76, 65, 88, 128, 76, 65, 87, 128, 76, 65, 215, 76, 65, 85, 76, + 65, 128, 76, 65, 85, 75, 65, 218, 76, 65, 85, 74, 128, 76, 65, 85, 71, + 72, 73, 78, 71, 128, 76, 65, 84, 73, 78, 65, 84, 197, 76, 65, 84, 73, 75, + 128, 76, 65, 84, 69, 82, 65, 204, 76, 65, 84, 197, 76, 65, 83, 212, 76, + 65, 82, 89, 78, 71, 69, 65, 204, 76, 65, 82, 201, 76, 65, 82, 71, 69, 83, + 84, 128, 76, 65, 82, 71, 69, 210, 76, 65, 82, 71, 69, 128, 76, 65, 82, + 71, 197, 76, 65, 81, 128, 76, 65, 80, 65, 81, 128, 76, 65, 207, 76, 65, + 78, 84, 69, 82, 78, 128, 76, 65, 78, 71, 85, 65, 71, 197, 76, 65, 78, 69, + 83, 128, 76, 65, 78, 196, 76, 65, 78, 128, 76, 65, 77, 80, 128, 76, 65, + 77, 69, 68, 72, 128, 76, 65, 77, 69, 68, 128, 76, 65, 77, 69, 196, 76, + 65, 77, 69, 128, 76, 65, 77, 197, 76, 65, 77, 68, 65, 128, 76, 65, 77, + 68, 128, 76, 65, 77, 66, 68, 193, 76, 65, 77, 65, 68, 72, 128, 76, 65, + 76, 128, 76, 65, 204, 76, 65, 75, 75, 72, 65, 78, 71, 89, 65, 79, 128, + 76, 65, 75, 72, 65, 78, 128, 76, 65, 75, 72, 128, 76, 65, 75, 200, 76, + 65, 75, 45, 55, 52, 57, 128, 76, 65, 75, 45, 55, 50, 52, 128, 76, 65, 75, + 45, 54, 54, 56, 128, 76, 65, 75, 45, 54, 52, 56, 128, 76, 65, 75, 45, 54, + 52, 184, 76, 65, 75, 45, 54, 51, 54, 128, 76, 65, 75, 45, 54, 49, 55, + 128, 76, 65, 75, 45, 54, 49, 183, 76, 65, 75, 45, 54, 48, 56, 128, 76, + 65, 75, 45, 53, 53, 48, 128, 76, 65, 75, 45, 52, 57, 53, 128, 76, 65, 75, + 45, 52, 57, 51, 128, 76, 65, 75, 45, 52, 57, 50, 128, 76, 65, 75, 45, 52, + 57, 48, 128, 76, 65, 75, 45, 52, 56, 51, 128, 76, 65, 75, 45, 52, 55, 48, + 128, 76, 65, 75, 45, 52, 53, 55, 128, 76, 65, 75, 45, 52, 53, 48, 128, + 76, 65, 75, 45, 52, 52, 57, 128, 76, 65, 75, 45, 52, 52, 185, 76, 65, 75, + 45, 52, 52, 49, 128, 76, 65, 75, 45, 51, 57, 48, 128, 76, 65, 75, 45, 51, + 56, 52, 128, 76, 65, 75, 45, 51, 56, 51, 128, 76, 65, 75, 45, 51, 52, 56, + 128, 76, 65, 75, 45, 51, 52, 55, 128, 76, 65, 75, 45, 51, 52, 51, 128, + 76, 65, 75, 45, 50, 54, 54, 128, 76, 65, 75, 45, 50, 54, 53, 128, 76, 65, + 75, 45, 50, 51, 56, 128, 76, 65, 75, 45, 50, 50, 56, 128, 76, 65, 75, 45, + 50, 50, 53, 128, 76, 65, 75, 45, 50, 50, 48, 128, 76, 65, 75, 45, 50, 49, + 57, 128, 76, 65, 75, 45, 50, 49, 48, 128, 76, 65, 75, 45, 49, 52, 50, + 128, 76, 65, 75, 45, 49, 51, 48, 128, 76, 65, 75, 45, 48, 57, 50, 128, + 76, 65, 75, 45, 48, 56, 49, 128, 76, 65, 75, 45, 48, 56, 177, 76, 65, 75, + 45, 48, 56, 48, 128, 76, 65, 75, 45, 48, 55, 185, 76, 65, 75, 45, 48, 54, + 50, 128, 76, 65, 75, 45, 48, 53, 49, 128, 76, 65, 75, 45, 48, 53, 48, + 128, 76, 65, 75, 45, 48, 51, 48, 128, 76, 65, 75, 45, 48, 50, 53, 128, + 76, 65, 75, 45, 48, 50, 49, 128, 76, 65, 75, 45, 48, 50, 48, 128, 76, 65, + 75, 45, 48, 48, 51, 128, 76, 65, 74, 65, 78, 89, 65, 76, 65, 78, 128, 76, + 65, 73, 78, 199, 76, 65, 201, 76, 65, 72, 83, 72, 85, 128, 76, 65, 72, + 128, 76, 65, 71, 85, 83, 128, 76, 65, 71, 213, 76, 65, 71, 65, 82, 128, + 76, 65, 71, 65, 210, 76, 65, 71, 65, 66, 128, 76, 65, 71, 65, 194, 76, + 65, 69, 86, 128, 76, 65, 69, 128, 76, 65, 68, 217, 76, 65, 68, 68, 69, + 82, 128, 76, 65, 67, 82, 79, 83, 83, 197, 76, 65, 67, 75, 128, 76, 65, + 67, 65, 128, 76, 65, 66, 79, 85, 82, 73, 78, 71, 128, 76, 65, 66, 79, 82, + 128, 76, 65, 66, 73, 65, 76, 73, 90, 65, 84, 73, 79, 206, 76, 65, 66, 73, + 65, 204, 76, 65, 66, 69, 76, 128, 76, 65, 66, 65, 84, 128, 76, 65, 194, + 76, 65, 65, 78, 65, 69, 128, 76, 65, 65, 78, 128, 76, 65, 65, 77, 85, + 128, 76, 65, 65, 77, 128, 76, 65, 65, 73, 128, 76, 54, 128, 76, 52, 128, + 76, 51, 128, 76, 50, 128, 76, 48, 48, 54, 65, 128, 76, 48, 48, 50, 65, + 128, 76, 45, 84, 89, 80, 197, 76, 45, 83, 72, 65, 80, 69, 196, 75, 89, + 85, 82, 73, 73, 128, 75, 89, 85, 128, 75, 89, 79, 128, 75, 89, 76, 73, + 83, 77, 65, 128, 75, 89, 73, 128, 75, 89, 69, 128, 75, 89, 65, 84, 72, + 79, 211, 75, 89, 65, 65, 128, 75, 89, 65, 128, 75, 88, 87, 73, 128, 75, + 88, 87, 69, 69, 128, 75, 88, 87, 69, 128, 75, 88, 87, 65, 65, 128, 75, + 88, 87, 65, 128, 75, 88, 85, 128, 75, 88, 79, 128, 75, 88, 73, 128, 75, + 88, 69, 69, 128, 75, 88, 69, 128, 75, 88, 65, 65, 128, 75, 88, 65, 128, + 75, 87, 86, 128, 75, 87, 85, 51, 49, 56, 128, 75, 87, 79, 79, 128, 75, + 87, 79, 128, 75, 87, 77, 128, 75, 87, 73, 73, 128, 75, 87, 73, 128, 75, + 87, 69, 69, 128, 75, 87, 69, 128, 75, 87, 66, 128, 75, 87, 65, 89, 128, + 75, 87, 65, 69, 84, 128, 75, 87, 65, 65, 128, 75, 86, 65, 128, 75, 86, + 128, 75, 85, 90, 72, 73, 128, 75, 85, 88, 128, 75, 85, 86, 128, 75, 85, + 85, 72, 128, 75, 85, 84, 128, 75, 85, 83, 77, 65, 128, 75, 85, 83, 72, + 85, 50, 128, 75, 85, 83, 72, 85, 178, 75, 85, 82, 88, 128, 75, 85, 82, + 85, 90, 69, 73, 82, 79, 128, 75, 85, 82, 84, 128, 75, 85, 82, 79, 79, 78, + 69, 128, 75, 85, 82, 128, 75, 85, 210, 75, 85, 81, 128, 75, 85, 79, 88, + 128, 75, 85, 79, 80, 128, 75, 85, 79, 208, 75, 85, 79, 77, 128, 75, 85, + 79, 128, 75, 85, 78, 71, 128, 75, 85, 78, 68, 68, 65, 76, 73, 89, 65, 128, 75, 85, 76, 128, 75, 85, 204, 75, 85, 71, 128, 75, 85, 69, 84, 128, 75, 85, 66, 128, 75, 85, 65, 86, 128, 75, 85, 65, 66, 128, 75, 85, 65, 128, 75, 85, 55, 128, 75, 85, 52, 128, 75, 85, 180, 75, 85, 51, 128, 75, @@ -2674,1256 +2728,1257 @@ static const unsigned char lexicon[] = { 79, 77, 128, 75, 79, 69, 84, 128, 75, 79, 66, 128, 75, 79, 65, 76, 65, 128, 75, 79, 65, 128, 75, 79, 45, 75, 73, 128, 75, 79, 45, 51, 128, 75, 79, 45, 50, 128, 75, 79, 45, 49, 128, 75, 78, 85, 67, 75, 76, 69, 83, - 128, 75, 78, 85, 67, 75, 76, 69, 128, 75, 78, 79, 66, 83, 128, 75, 78, - 73, 71, 72, 84, 45, 82, 79, 79, 75, 128, 75, 78, 73, 71, 72, 84, 45, 81, - 85, 69, 69, 78, 128, 75, 78, 73, 71, 72, 84, 45, 66, 73, 83, 72, 79, 80, - 128, 75, 78, 73, 71, 72, 84, 128, 75, 78, 73, 71, 72, 212, 75, 78, 73, - 70, 69, 128, 75, 78, 73, 70, 197, 75, 78, 69, 69, 76, 73, 78, 199, 75, - 77, 128, 75, 205, 75, 76, 73, 84, 79, 78, 128, 75, 76, 65, 83, 77, 65, - 128, 75, 76, 65, 83, 77, 193, 75, 76, 65, 128, 75, 76, 128, 75, 75, 79, - 128, 75, 75, 73, 128, 75, 75, 69, 69, 128, 75, 75, 69, 128, 75, 75, 65, - 128, 75, 75, 128, 75, 74, 69, 128, 75, 73, 89, 69, 79, 75, 45, 84, 73, - 75, 69, 85, 84, 128, 75, 73, 89, 69, 79, 75, 45, 83, 73, 79, 83, 45, 75, - 73, 89, 69, 79, 75, 128, 75, 73, 89, 69, 79, 75, 45, 82, 73, 69, 85, 76, - 128, 75, 73, 89, 69, 79, 75, 45, 80, 73, 69, 85, 80, 128, 75, 73, 89, 69, - 79, 75, 45, 78, 73, 69, 85, 78, 128, 75, 73, 89, 69, 79, 75, 45, 75, 72, - 73, 69, 85, 75, 72, 128, 75, 73, 89, 69, 79, 75, 45, 67, 72, 73, 69, 85, - 67, 72, 128, 75, 73, 89, 69, 79, 203, 75, 73, 88, 128, 75, 73, 87, 73, - 70, 82, 85, 73, 84, 128, 75, 73, 87, 128, 75, 73, 86, 128, 75, 73, 84, - 69, 128, 75, 73, 84, 128, 75, 73, 83, 83, 73, 78, 199, 75, 73, 83, 83, - 128, 75, 73, 83, 211, 75, 73, 83, 73, 77, 53, 128, 75, 73, 83, 73, 77, - 181, 75, 73, 83, 72, 128, 75, 73, 83, 65, 76, 128, 75, 73, 82, 79, 87, - 65, 84, 84, 79, 128, 75, 73, 82, 79, 77, 69, 69, 84, 79, 82, 85, 128, 75, - 73, 82, 79, 71, 85, 82, 65, 77, 85, 128, 75, 73, 82, 79, 128, 75, 73, 82, - 71, 72, 73, 218, 75, 73, 81, 128, 75, 73, 80, 128, 75, 73, 208, 75, 73, - 78, 83, 72, 73, 80, 128, 75, 73, 78, 78, 193, 75, 73, 78, 68, 69, 82, 71, - 65, 82, 84, 69, 78, 128, 75, 73, 77, 79, 78, 79, 128, 75, 73, 76, 76, 69, - 82, 128, 75, 73, 73, 90, 72, 128, 75, 73, 73, 128, 75, 73, 72, 128, 75, - 73, 69, 88, 128, 75, 73, 69, 86, 65, 206, 75, 73, 69, 80, 128, 75, 73, - 69, 69, 77, 128, 75, 73, 69, 128, 75, 73, 68, 128, 75, 73, 196, 75, 73, - 67, 75, 128, 75, 73, 66, 128, 75, 73, 65, 86, 128, 75, 73, 65, 66, 128, - 75, 73, 45, 56, 128, 75, 73, 45, 55, 128, 75, 73, 45, 54, 128, 75, 73, - 45, 53, 128, 75, 73, 45, 52, 128, 75, 73, 45, 51, 128, 75, 73, 45, 50, - 128, 75, 73, 45, 49, 128, 75, 72, 90, 128, 75, 72, 87, 65, 73, 128, 75, - 72, 85, 69, 78, 45, 76, 85, 197, 75, 72, 85, 69, 206, 75, 72, 85, 68, 65, - 87, 65, 68, 201, 75, 72, 85, 68, 65, 77, 128, 75, 72, 85, 65, 84, 128, - 75, 72, 79, 85, 128, 75, 72, 79, 212, 75, 72, 79, 78, 78, 65, 128, 75, - 72, 79, 78, 128, 75, 72, 79, 77, 85, 84, 128, 75, 72, 79, 74, 75, 201, - 75, 72, 79, 128, 75, 72, 207, 75, 72, 77, 213, 75, 72, 73, 84, 128, 75, - 72, 73, 78, 89, 65, 128, 75, 72, 73, 69, 85, 75, 200, 75, 72, 73, 128, - 75, 72, 201, 75, 72, 72, 79, 128, 75, 72, 72, 65, 128, 75, 72, 69, 84, - 72, 128, 75, 72, 69, 73, 128, 75, 72, 69, 69, 128, 75, 72, 69, 128, 75, - 72, 65, 86, 128, 75, 72, 65, 82, 79, 83, 72, 84, 72, 201, 75, 72, 65, 82, - 128, 75, 72, 65, 80, 72, 128, 75, 72, 65, 78, 199, 75, 72, 65, 78, 68, - 193, 75, 72, 65, 77, 84, 201, 75, 72, 65, 75, 65, 83, 83, 73, 65, 206, - 75, 72, 65, 73, 128, 75, 72, 65, 72, 128, 75, 72, 65, 200, 75, 72, 65, - 66, 128, 75, 72, 65, 65, 128, 75, 71, 128, 75, 69, 89, 67, 65, 80, 128, - 75, 69, 89, 67, 65, 208, 75, 69, 89, 66, 79, 65, 82, 68, 128, 75, 69, 89, - 66, 79, 65, 82, 196, 75, 69, 88, 128, 75, 69, 86, 128, 75, 69, 85, 89, - 69, 85, 88, 128, 75, 69, 85, 83, 72, 69, 85, 65, 69, 80, 128, 75, 69, 85, - 83, 69, 85, 88, 128, 75, 69, 85, 80, 85, 81, 128, 75, 69, 85, 79, 212, - 75, 69, 85, 77, 128, 75, 69, 85, 75, 69, 85, 84, 78, 68, 65, 128, 75, 69, - 85, 75, 65, 81, 128, 75, 69, 85, 65, 69, 84, 77, 69, 85, 78, 128, 75, 69, - 85, 65, 69, 82, 73, 128, 75, 69, 84, 84, 201, 75, 69, 83, 72, 50, 128, - 75, 69, 82, 69, 84, 128, 75, 69, 79, 87, 128, 75, 69, 78, 84, 73, 77, 65, - 84, 65, 128, 75, 69, 78, 84, 73, 77, 65, 84, 193, 75, 69, 78, 84, 73, 77, - 193, 75, 69, 78, 65, 84, 128, 75, 69, 78, 128, 75, 69, 206, 75, 69, 77, - 80, 85, 76, 128, 75, 69, 77, 80, 85, 204, 75, 69, 77, 80, 76, 73, 128, - 75, 69, 77, 80, 76, 201, 75, 69, 77, 80, 72, 82, 69, 78, 71, 128, 75, 69, - 77, 66, 65, 78, 71, 128, 75, 69, 76, 86, 73, 206, 75, 69, 72, 69, 72, - 128, 75, 69, 72, 69, 200, 75, 69, 72, 128, 75, 69, 70, 85, 76, 65, 128, - 75, 69, 69, 86, 128, 75, 69, 69, 83, 85, 128, 75, 69, 69, 80, 73, 78, - 199, 75, 69, 69, 78, 71, 128, 75, 69, 69, 66, 128, 75, 69, 66, 128, 75, - 69, 65, 65, 69, 128, 75, 67, 65, 76, 128, 75, 66, 128, 75, 65, 90, 65, - 75, 200, 75, 65, 89, 65, 78, 78, 65, 128, 75, 65, 89, 65, 200, 75, 65, - 88, 128, 75, 65, 87, 86, 128, 75, 65, 87, 73, 128, 75, 65, 87, 66, 128, - 75, 65, 86, 89, 75, 65, 128, 75, 65, 86, 89, 75, 193, 75, 65, 86, 128, - 75, 65, 85, 86, 128, 75, 65, 85, 78, 65, 128, 75, 65, 85, 206, 75, 65, - 85, 66, 128, 75, 65, 84, 79, 128, 75, 65, 84, 72, 73, 83, 84, 73, 128, - 75, 65, 84, 72, 65, 75, 193, 75, 65, 84, 65, 86, 65, 83, 77, 65, 128, 75, - 65, 84, 65, 86, 193, 75, 65, 84, 65, 75, 65, 78, 65, 45, 72, 73, 82, 65, - 71, 65, 78, 193, 75, 65, 83, 82, 65, 84, 65, 78, 128, 75, 65, 83, 82, 65, - 84, 65, 206, 75, 65, 83, 82, 65, 128, 75, 65, 83, 82, 193, 75, 65, 83, - 75, 65, 76, 128, 75, 65, 83, 75, 65, 204, 75, 65, 83, 72, 77, 73, 82, - 201, 75, 65, 82, 83, 72, 65, 78, 65, 128, 75, 65, 82, 79, 82, 73, 73, - 128, 75, 65, 82, 79, 82, 65, 78, 128, 75, 65, 82, 79, 82, 128, 75, 65, - 82, 207, 75, 65, 82, 69, 206, 75, 65, 82, 65, 84, 84, 79, 128, 75, 65, - 82, 65, 78, 128, 75, 65, 80, 89, 69, 79, 85, 78, 83, 83, 65, 78, 71, 80, - 73, 69, 85, 80, 128, 75, 65, 80, 89, 69, 79, 85, 78, 82, 73, 69, 85, 76, - 128, 75, 65, 80, 89, 69, 79, 85, 78, 80, 72, 73, 69, 85, 80, 72, 128, 75, - 65, 80, 89, 69, 79, 85, 78, 77, 73, 69, 85, 77, 128, 75, 65, 80, 80, 65, - 128, 75, 65, 80, 80, 193, 75, 65, 80, 79, 128, 75, 65, 80, 72, 128, 75, - 65, 80, 65, 76, 128, 75, 65, 80, 65, 128, 75, 65, 208, 75, 65, 78, 84, - 65, 74, 193, 75, 65, 78, 78, 65, 68, 193, 75, 65, 78, 71, 65, 82, 79, 79, - 128, 75, 65, 78, 71, 128, 75, 65, 78, 199, 75, 65, 78, 65, 75, 79, 128, - 75, 65, 77, 52, 128, 75, 65, 77, 50, 128, 75, 65, 77, 128, 75, 65, 75, - 79, 128, 75, 65, 75, 65, 66, 65, 84, 128, 75, 65, 75, 128, 75, 65, 203, - 75, 65, 73, 86, 128, 75, 65, 73, 84, 72, 201, 75, 65, 73, 82, 73, 128, - 75, 65, 73, 66, 128, 75, 65, 73, 128, 75, 65, 201, 75, 65, 70, 65, 128, - 75, 65, 70, 128, 75, 65, 198, 75, 65, 68, 53, 128, 75, 65, 68, 181, 75, - 65, 68, 52, 128, 75, 65, 68, 51, 128, 75, 65, 68, 179, 75, 65, 68, 50, - 128, 75, 65, 68, 128, 75, 65, 66, 193, 75, 65, 66, 128, 75, 65, 65, 86, - 128, 75, 65, 65, 73, 128, 75, 65, 65, 70, 85, 128, 75, 65, 65, 70, 128, - 75, 65, 65, 67, 85, 128, 75, 65, 65, 66, 65, 128, 75, 65, 65, 66, 128, - 75, 65, 50, 128, 75, 65, 178, 75, 65, 45, 75, 69, 128, 75, 65, 45, 57, - 128, 75, 65, 45, 56, 128, 75, 65, 45, 55, 128, 75, 65, 45, 54, 128, 75, - 65, 45, 53, 128, 75, 65, 45, 52, 128, 75, 65, 45, 51, 128, 75, 65, 45, - 50, 128, 75, 65, 45, 49, 49, 128, 75, 65, 45, 49, 48, 128, 75, 65, 45, - 49, 128, 75, 48, 48, 56, 128, 75, 48, 48, 55, 128, 75, 48, 48, 54, 128, - 75, 48, 48, 53, 128, 75, 48, 48, 52, 128, 75, 48, 48, 51, 128, 75, 48, - 48, 50, 128, 75, 48, 48, 49, 128, 74, 87, 65, 128, 74, 85, 85, 128, 74, - 85, 84, 128, 74, 85, 83, 84, 73, 70, 73, 67, 65, 84, 73, 79, 78, 128, 74, - 85, 80, 73, 84, 69, 82, 128, 74, 85, 79, 84, 128, 74, 85, 79, 80, 128, - 74, 85, 78, 79, 128, 74, 85, 78, 71, 83, 69, 79, 78, 199, 74, 85, 78, 69, - 128, 74, 85, 76, 89, 128, 74, 85, 71, 71, 76, 73, 78, 71, 128, 74, 85, - 69, 85, 73, 128, 74, 85, 68, 85, 76, 128, 74, 85, 68, 71, 69, 128, 74, - 85, 68, 69, 79, 45, 83, 80, 65, 78, 73, 83, 200, 74, 79, 89, 83, 84, 73, - 67, 75, 128, 74, 79, 89, 79, 85, 211, 74, 79, 89, 128, 74, 79, 86, 69, - 128, 74, 79, 212, 74, 79, 78, 71, 128, 74, 79, 78, 193, 74, 79, 75, 69, - 82, 128, 74, 79, 73, 78, 84, 83, 128, 74, 79, 73, 78, 69, 68, 128, 74, - 79, 73, 78, 128, 74, 79, 65, 128, 74, 78, 89, 65, 128, 74, 74, 89, 88, - 128, 74, 74, 89, 84, 128, 74, 74, 89, 80, 128, 74, 74, 89, 128, 74, 74, - 85, 88, 128, 74, 74, 85, 84, 128, 74, 74, 85, 82, 88, 128, 74, 74, 85, - 82, 128, 74, 74, 85, 80, 128, 74, 74, 85, 79, 88, 128, 74, 74, 85, 79, - 80, 128, 74, 74, 85, 79, 128, 74, 74, 85, 128, 74, 74, 79, 88, 128, 74, - 74, 79, 84, 128, 74, 74, 79, 80, 128, 74, 74, 79, 128, 74, 74, 73, 88, - 128, 74, 74, 73, 84, 128, 74, 74, 73, 80, 128, 74, 74, 73, 69, 88, 128, - 74, 74, 73, 69, 84, 128, 74, 74, 73, 69, 80, 128, 74, 74, 73, 69, 128, - 74, 74, 73, 128, 74, 74, 69, 69, 128, 74, 74, 69, 128, 74, 74, 65, 128, - 74, 73, 76, 128, 74, 73, 73, 77, 128, 74, 73, 73, 128, 74, 73, 72, 86, - 65, 77, 85, 76, 73, 89, 65, 128, 74, 73, 71, 83, 65, 215, 74, 73, 65, - 128, 74, 72, 79, 88, 128, 74, 72, 79, 128, 74, 72, 69, 72, 128, 74, 72, - 65, 89, 73, 78, 128, 74, 72, 65, 78, 128, 74, 72, 65, 77, 128, 74, 72, - 65, 65, 128, 74, 72, 65, 128, 74, 69, 85, 128, 74, 69, 82, 85, 83, 65, - 76, 69, 77, 128, 74, 69, 82, 65, 206, 74, 69, 82, 65, 128, 74, 69, 82, - 128, 74, 69, 72, 128, 74, 69, 200, 74, 69, 71, 79, 71, 65, 78, 128, 74, - 69, 69, 77, 128, 74, 69, 69, 205, 74, 69, 65, 78, 83, 128, 74, 65, 89, - 78, 128, 74, 65, 89, 73, 78, 128, 74, 65, 89, 65, 78, 78, 65, 128, 74, - 65, 87, 128, 74, 65, 86, 73, 89, 65, 78, 73, 128, 74, 65, 86, 65, 78, 69, - 83, 197, 74, 65, 85, 128, 74, 65, 82, 128, 74, 65, 80, 65, 78, 69, 83, - 197, 74, 65, 80, 65, 78, 128, 74, 65, 78, 85, 65, 82, 89, 128, 74, 65, - 76, 76, 65, 74, 65, 76, 65, 76, 79, 85, 72, 79, 85, 128, 74, 65, 73, 206, - 74, 65, 73, 128, 74, 65, 72, 128, 74, 65, 68, 69, 128, 74, 65, 67, 75, - 83, 128, 74, 65, 67, 75, 45, 79, 45, 76, 65, 78, 84, 69, 82, 78, 128, 74, - 65, 67, 203, 74, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 73, 90, 72, - 73, 84, 83, 65, 128, 73, 90, 72, 73, 84, 83, 193, 73, 90, 72, 69, 128, - 73, 90, 65, 75, 65, 89, 193, 73, 89, 69, 75, 128, 73, 89, 65, 78, 78, 65, - 128, 73, 85, 74, 65, 128, 73, 84, 211, 73, 84, 69, 82, 65, 84, 73, 79, - 206, 73, 84, 69, 77, 128, 73, 83, 83, 72, 65, 82, 128, 73, 83, 79, 83, - 67, 69, 76, 69, 211, 73, 83, 79, 78, 128, 73, 83, 79, 206, 73, 83, 79, - 76, 65, 84, 69, 128, 73, 83, 76, 65, 78, 68, 128, 73, 83, 69, 78, 45, 73, - 83, 69, 78, 128, 73, 83, 65, 75, 73, 193, 73, 83, 45, 80, 73, 76, 76, 65, - 128, 73, 82, 85, 89, 65, 78, 78, 65, 128, 73, 82, 85, 85, 89, 65, 78, 78, - 65, 128, 73, 82, 79, 78, 45, 67, 79, 80, 80, 69, 210, 73, 82, 79, 78, - 128, 73, 82, 66, 128, 73, 79, 84, 73, 70, 73, 69, 196, 73, 79, 84, 65, - 84, 69, 196, 73, 79, 84, 65, 128, 73, 79, 84, 193, 73, 79, 82, 128, 73, - 79, 78, 71, 128, 73, 79, 68, 72, 65, 68, 72, 128, 73, 78, 86, 73, 83, 73, - 66, 76, 197, 73, 78, 86, 69, 82, 84, 69, 68, 128, 73, 78, 86, 69, 82, 84, - 69, 196, 73, 78, 86, 69, 82, 84, 69, 66, 82, 65, 84, 69, 128, 73, 78, 86, - 69, 82, 83, 197, 73, 78, 84, 82, 79, 68, 85, 67, 69, 82, 128, 73, 78, 84, - 73, 128, 73, 78, 84, 69, 82, 83, 89, 76, 76, 65, 66, 73, 195, 73, 78, 84, - 69, 82, 83, 69, 67, 84, 73, 79, 78, 128, 73, 78, 84, 69, 82, 83, 69, 67, - 84, 73, 79, 206, 73, 78, 84, 69, 82, 83, 69, 67, 84, 73, 78, 199, 73, 78, - 84, 69, 82, 82, 79, 66, 65, 78, 71, 128, 73, 78, 84, 69, 82, 82, 79, 66, - 65, 78, 199, 73, 78, 84, 69, 82, 80, 79, 76, 65, 84, 73, 79, 206, 73, 78, - 84, 69, 82, 76, 79, 67, 75, 69, 196, 73, 78, 84, 69, 82, 76, 73, 78, 69, - 65, 210, 73, 78, 84, 69, 82, 76, 65, 67, 69, 196, 73, 78, 84, 69, 82, 73, - 79, 210, 73, 78, 84, 69, 82, 69, 83, 212, 73, 78, 84, 69, 82, 67, 65, 76, - 65, 84, 69, 128, 73, 78, 84, 69, 71, 82, 65, 84, 73, 79, 78, 128, 73, 78, - 84, 69, 71, 82, 65, 84, 73, 79, 206, 73, 78, 84, 69, 71, 82, 65, 76, 128, - 73, 78, 84, 69, 71, 82, 65, 204, 73, 78, 83, 85, 76, 65, 210, 73, 78, 83, - 84, 82, 85, 77, 69, 78, 84, 65, 204, 73, 78, 83, 73, 68, 69, 128, 73, 78, - 83, 73, 68, 197, 73, 78, 83, 69, 82, 84, 73, 79, 206, 73, 78, 83, 69, 82, - 212, 73, 78, 83, 69, 67, 84, 128, 73, 78, 83, 67, 82, 73, 80, 84, 73, 79, - 78, 65, 204, 73, 78, 80, 85, 212, 73, 78, 78, 79, 67, 69, 78, 67, 69, - 128, 73, 78, 78, 78, 128, 73, 78, 78, 69, 82, 128, 73, 78, 78, 69, 210, - 73, 78, 78, 128, 73, 78, 73, 78, 71, 85, 128, 73, 78, 72, 73, 66, 73, - 212, 73, 78, 72, 69, 82, 69, 78, 212, 73, 78, 72, 65, 76, 69, 128, 73, - 78, 71, 87, 65, 90, 128, 73, 78, 70, 79, 82, 77, 65, 84, 73, 79, 206, 73, - 78, 70, 76, 85, 69, 78, 67, 69, 128, 73, 78, 70, 73, 78, 73, 84, 89, 128, - 73, 78, 70, 73, 78, 73, 84, 217, 73, 78, 68, 85, 83, 84, 82, 73, 65, 204, - 73, 78, 68, 73, 82, 69, 67, 212, 73, 78, 68, 73, 67, 84, 73, 79, 206, 73, - 78, 68, 73, 67, 65, 84, 79, 82, 128, 73, 78, 68, 73, 67, 65, 84, 79, 210, - 73, 78, 68, 73, 195, 73, 78, 68, 73, 65, 206, 73, 78, 68, 69, 88, 128, - 73, 78, 68, 69, 80, 69, 78, 68, 69, 78, 212, 73, 78, 67, 82, 69, 77, 69, - 78, 84, 128, 73, 78, 67, 82, 69, 65, 83, 69, 211, 73, 78, 67, 82, 69, 65, - 83, 69, 128, 73, 78, 67, 82, 69, 65, 83, 197, 73, 78, 67, 79, 77, 80, 76, - 69, 84, 197, 73, 78, 67, 79, 77, 73, 78, 199, 73, 78, 67, 76, 85, 68, 73, - 78, 199, 73, 78, 67, 72, 128, 73, 78, 66, 79, 216, 73, 78, 65, 80, 128, - 73, 78, 45, 65, 76, 65, 70, 128, 73, 77, 80, 69, 82, 73, 65, 204, 73, 77, - 80, 69, 82, 70, 69, 67, 84, 85, 205, 73, 77, 80, 69, 82, 70, 69, 67, 84, - 65, 128, 73, 77, 80, 69, 82, 70, 69, 67, 84, 193, 73, 77, 78, 128, 73, - 77, 73, 83, 69, 79, 211, 73, 77, 73, 78, 51, 128, 73, 77, 73, 78, 128, - 73, 77, 73, 206, 73, 77, 73, 70, 84, 72, 79, 82, 79, 78, 128, 73, 77, 73, - 70, 84, 72, 79, 82, 65, 128, 73, 77, 73, 70, 79, 78, 79, 78, 128, 73, 77, - 73, 68, 73, 65, 82, 71, 79, 78, 128, 73, 77, 65, 71, 197, 73, 76, 85, 89, - 65, 78, 78, 65, 128, 73, 76, 85, 89, 128, 73, 76, 85, 85, 89, 65, 78, 78, - 65, 128, 73, 76, 85, 84, 128, 73, 76, 73, 77, 77, 85, 52, 128, 73, 76, - 73, 77, 77, 85, 51, 128, 73, 76, 73, 77, 77, 85, 128, 73, 76, 73, 77, 77, - 213, 73, 76, 50, 128, 73, 75, 65, 82, 65, 128, 73, 75, 65, 82, 193, 73, - 74, 128, 73, 73, 89, 65, 78, 78, 65, 128, 73, 71, 73, 128, 73, 71, 201, - 73, 71, 71, 87, 83, 128, 73, 70, 73, 78, 128, 73, 69, 85, 78, 71, 45, 84, - 73, 75, 69, 85, 84, 128, 73, 69, 85, 78, 71, 45, 84, 72, 73, 69, 85, 84, - 72, 128, 73, 69, 85, 78, 71, 45, 82, 73, 69, 85, 76, 128, 73, 69, 85, 78, - 71, 45, 80, 73, 69, 85, 80, 128, 73, 69, 85, 78, 71, 45, 80, 72, 73, 69, - 85, 80, 72, 128, 73, 69, 85, 78, 71, 45, 67, 73, 69, 85, 67, 128, 73, 69, - 85, 78, 71, 45, 67, 72, 73, 69, 85, 67, 72, 128, 73, 69, 85, 78, 199, 73, - 68, 76, 69, 128, 73, 68, 73, 77, 128, 73, 68, 73, 205, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 65, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 65, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 65, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 70, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 70, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 70, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 69, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 69, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 68, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 67, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 57, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 54, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 50, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 70, 57, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 70, 57, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 70, 57, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 57, 49, 52, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 57, 48, 52, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 56, 68, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 56, 67, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 56, 57, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 68, 52, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 65, 55, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 57, 56, 49, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 55, 54, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 55, 53, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 55, 53, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 49, 50, - 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 48, 66, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 70, 49, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 54, 69, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 54, 55, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 54, 55, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 48, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 54, 50, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 53, 66, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 54, 53, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 54, 53, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 54, 51, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 51, 48, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 50, 57, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 50, 53, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 54, 50, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 53, 70, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 53, 68, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 66, 56, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 66, 53, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 57, 50, 57, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 53, 57, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 53, 56, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 53, 53, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 52, 51, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 52, 48, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 51, 70, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 53, 51, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 53, 50, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 53, 50, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 52, - 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 49, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 49, 56, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 52, 69, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 52, 69, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 52, 69, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 65, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 65, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 65, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 65, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, - 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 52, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 51, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 65, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 65, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 65, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 65, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, - 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 68, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 65, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 65, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 65, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 65, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, - 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 50, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 49, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 65, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 70, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 70, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 70, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 66, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 56, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 70, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 70, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 70, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 48, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 70, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 69, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 69, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 69, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 57, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 69, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 69, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 69, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 68, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 68, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 55, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 67, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 66, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 67, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 53, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 65, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 57, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 51, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 56, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 55, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 49, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 69, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 54, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 53, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 57, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 70, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 52, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 51, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 68, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 50, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 49, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 54, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 66, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 56, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 48, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 70, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 57, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 69, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 68, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 55, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 67, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 66, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 53, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 65, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 57, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 50, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 51, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 56, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 55, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 49, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 69, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 54, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 53, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 70, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 70, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 52, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 51, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 68, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 50, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 49, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 68, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 66, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 56, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 48, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 70, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 57, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 69, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 68, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 55, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 67, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 66, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 53, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 65, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 57, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 51, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 56, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 55, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 49, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 69, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 54, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 53, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 70, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 52, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 51, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 68, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 50, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 49, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 66, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 56, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 48, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 70, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 57, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 69, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 68, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 55, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 67, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 66, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 53, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 65, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 57, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 51, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 200, 73, 68, 69, 78, 84, 73, 70, 73, 67, 65, 84, 73, 79, 78, - 128, 73, 68, 69, 78, 84, 73, 67, 65, 204, 73, 67, 79, 78, 128, 73, 67, - 72, 79, 85, 128, 73, 67, 72, 79, 83, 128, 73, 67, 72, 73, 77, 65, 84, 79, - 83, 128, 73, 67, 72, 65, 68, 73, 78, 128, 73, 67, 69, 76, 65, 78, 68, 73, - 67, 45, 89, 82, 128, 73, 66, 73, 70, 73, 76, 73, 128, 73, 65, 85, 68, 65, - 128, 73, 48, 49, 53, 128, 73, 48, 49, 52, 128, 73, 48, 49, 51, 128, 73, - 48, 49, 50, 128, 73, 48, 49, 49, 65, 128, 73, 48, 49, 49, 128, 73, 48, - 49, 48, 65, 128, 73, 48, 49, 48, 128, 73, 48, 48, 57, 65, 128, 73, 48, - 48, 57, 128, 73, 48, 48, 56, 128, 73, 48, 48, 55, 128, 73, 48, 48, 54, - 128, 73, 48, 48, 53, 65, 128, 73, 48, 48, 53, 128, 73, 48, 48, 52, 128, - 73, 48, 48, 51, 128, 73, 48, 48, 50, 128, 73, 48, 48, 49, 128, 73, 45, - 89, 85, 128, 73, 45, 89, 79, 128, 73, 45, 89, 69, 79, 128, 73, 45, 89, - 69, 128, 73, 45, 89, 65, 69, 128, 73, 45, 89, 65, 45, 79, 128, 73, 45, - 89, 65, 128, 73, 45, 79, 45, 73, 128, 73, 45, 79, 128, 73, 45, 69, 85, - 128, 73, 45, 66, 69, 65, 77, 128, 73, 45, 65, 82, 65, 69, 65, 128, 73, - 45, 65, 128, 72, 90, 90, 90, 71, 128, 72, 90, 90, 90, 128, 72, 90, 90, - 80, 128, 72, 90, 90, 128, 72, 90, 87, 71, 128, 72, 90, 87, 128, 72, 90, - 84, 128, 72, 90, 71, 128, 72, 89, 83, 84, 69, 82, 69, 83, 73, 211, 72, - 89, 80, 79, 68, 73, 65, 83, 84, 79, 76, 69, 128, 72, 89, 80, 72, 69, 78, - 65, 84, 73, 79, 206, 72, 89, 80, 72, 69, 78, 45, 77, 73, 78, 85, 83, 128, - 72, 89, 80, 72, 69, 78, 128, 72, 89, 80, 72, 69, 206, 72, 89, 71, 73, 69, - 73, 65, 128, 72, 89, 71, 73, 69, 65, 128, 72, 88, 87, 71, 128, 72, 88, - 85, 79, 88, 128, 72, 88, 85, 79, 84, 128, 72, 88, 85, 79, 80, 128, 72, - 88, 85, 79, 128, 72, 88, 79, 88, 128, 72, 88, 79, 84, 128, 72, 88, 79, - 80, 128, 72, 88, 79, 128, 72, 88, 73, 88, 128, 72, 88, 73, 84, 128, 72, - 88, 73, 80, 128, 72, 88, 73, 69, 88, 128, 72, 88, 73, 69, 84, 128, 72, - 88, 73, 69, 80, 128, 72, 88, 73, 69, 128, 72, 88, 73, 128, 72, 88, 69, - 88, 128, 72, 88, 69, 80, 128, 72, 88, 69, 128, 72, 88, 65, 88, 128, 72, - 88, 65, 84, 128, 72, 88, 65, 80, 128, 72, 88, 65, 128, 72, 87, 85, 128, - 72, 87, 65, 73, 82, 128, 72, 87, 65, 72, 128, 72, 85, 86, 65, 128, 72, - 85, 83, 72, 69, 196, 72, 85, 83, 72, 128, 72, 85, 82, 65, 78, 128, 72, - 85, 79, 84, 128, 72, 85, 78, 68, 82, 69, 68, 83, 128, 72, 85, 78, 68, 82, - 69, 68, 211, 72, 85, 78, 68, 82, 69, 68, 128, 72, 85, 78, 68, 82, 69, - 196, 72, 85, 78, 128, 72, 85, 77, 208, 72, 85, 77, 65, 78, 128, 72, 85, - 77, 65, 206, 72, 85, 76, 50, 128, 72, 85, 73, 73, 84, 79, 128, 72, 85, - 71, 71, 73, 78, 199, 72, 85, 66, 50, 128, 72, 85, 66, 178, 72, 85, 66, - 128, 72, 85, 65, 82, 65, 68, 68, 79, 128, 72, 85, 65, 78, 128, 72, 85, - 45, 51, 128, 72, 85, 45, 50, 128, 72, 85, 45, 49, 128, 72, 84, 83, 128, - 72, 84, 74, 128, 72, 82, 89, 86, 78, 73, 193, 72, 80, 87, 71, 128, 72, - 80, 65, 128, 72, 80, 128, 72, 79, 85, 83, 197, 72, 79, 85, 82, 71, 76, - 65, 83, 83, 128, 72, 79, 85, 82, 71, 76, 65, 83, 211, 72, 79, 85, 82, - 128, 72, 79, 85, 210, 72, 79, 84, 69, 76, 128, 72, 79, 84, 65, 128, 72, - 79, 83, 80, 73, 84, 65, 76, 128, 72, 79, 82, 83, 69, 128, 72, 79, 82, 83, - 197, 72, 79, 82, 82, 128, 72, 79, 82, 78, 83, 128, 72, 79, 82, 73, 90, - 79, 78, 84, 65, 76, 76, 217, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, - 48, 54, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, - 54, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, - 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, - 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, - 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 49, - 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 48, 128, - 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 54, 128, 72, - 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 53, 128, 72, 79, - 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 52, 128, 72, 79, 82, - 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 51, 128, 72, 79, 82, 73, - 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 50, 128, 72, 79, 82, 73, 90, - 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, - 78, 84, 65, 76, 45, 48, 53, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, - 84, 65, 76, 45, 48, 52, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, - 65, 76, 45, 48, 52, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, - 76, 45, 48, 52, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, - 45, 48, 52, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, - 48, 52, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, - 52, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, - 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, - 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, - 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 52, - 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 51, 128, - 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 50, 128, 72, - 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 49, 128, 72, 79, - 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 48, 128, 72, 79, 82, - 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 54, 128, 72, 79, 82, 73, - 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 53, 128, 72, 79, 82, 73, 90, - 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, - 78, 84, 65, 76, 45, 48, 50, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, - 84, 65, 76, 45, 48, 50, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, - 65, 76, 45, 48, 50, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, - 76, 45, 48, 50, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, - 45, 48, 49, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, - 48, 49, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, - 49, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, - 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, - 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, - 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 48, - 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 54, 128, - 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 53, 128, 72, - 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 52, 128, 72, 79, - 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 51, 128, 72, 79, 82, - 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 50, 128, 72, 79, 82, 73, - 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 49, 128, 72, 79, 82, 73, 90, - 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, - 78, 84, 65, 76, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 204, 72, 79, 82, - 73, 128, 72, 79, 82, 193, 72, 79, 79, 85, 128, 72, 79, 79, 82, 85, 128, - 72, 79, 79, 80, 128, 72, 79, 79, 78, 128, 72, 79, 79, 75, 69, 68, 128, - 72, 79, 79, 75, 69, 196, 72, 79, 78, 69, 89, 66, 69, 69, 128, 72, 79, 78, - 69, 217, 72, 79, 77, 79, 84, 72, 69, 84, 73, 67, 128, 72, 79, 77, 79, 84, - 72, 69, 84, 73, 195, 72, 79, 76, 79, 128, 72, 79, 76, 76, 79, 215, 72, - 79, 76, 69, 128, 72, 79, 76, 68, 73, 78, 199, 72, 79, 76, 65, 77, 128, - 72, 79, 76, 65, 205, 72, 79, 75, 65, 128, 72, 79, 67, 75, 69, 217, 72, - 79, 67, 72, 79, 128, 72, 79, 45, 56, 128, 72, 79, 45, 55, 128, 72, 79, - 45, 54, 128, 72, 79, 45, 53, 128, 72, 79, 45, 52, 128, 72, 79, 45, 51, - 128, 72, 79, 45, 50, 128, 72, 79, 45, 49, 128, 72, 78, 85, 84, 128, 72, - 78, 85, 79, 88, 128, 72, 78, 85, 79, 128, 72, 78, 85, 66, 128, 72, 78, - 79, 88, 128, 72, 78, 79, 84, 128, 72, 78, 79, 80, 128, 72, 78, 73, 88, - 128, 72, 78, 73, 84, 128, 72, 78, 73, 80, 128, 72, 78, 73, 69, 88, 128, - 72, 78, 73, 69, 84, 128, 72, 78, 73, 69, 80, 128, 72, 78, 73, 69, 128, - 72, 78, 73, 128, 72, 78, 69, 88, 128, 72, 78, 69, 80, 128, 72, 78, 69, - 128, 72, 78, 65, 88, 128, 72, 78, 65, 85, 128, 72, 78, 65, 84, 128, 72, - 78, 65, 80, 128, 72, 78, 65, 128, 72, 77, 89, 88, 128, 72, 77, 89, 82, - 88, 128, 72, 77, 89, 82, 128, 72, 77, 89, 80, 128, 72, 77, 89, 128, 72, - 77, 85, 88, 128, 72, 77, 85, 84, 128, 72, 77, 85, 82, 88, 128, 72, 77, - 85, 82, 128, 72, 77, 85, 80, 128, 72, 77, 85, 79, 88, 128, 72, 77, 85, - 79, 80, 128, 72, 77, 85, 79, 128, 72, 77, 85, 128, 72, 77, 79, 88, 128, - 72, 77, 79, 84, 128, 72, 77, 79, 80, 128, 72, 77, 79, 128, 72, 77, 73, - 88, 128, 72, 77, 73, 84, 128, 72, 77, 73, 80, 128, 72, 77, 73, 69, 88, - 128, 72, 77, 73, 69, 80, 128, 72, 77, 73, 69, 128, 72, 77, 73, 128, 72, - 77, 69, 128, 72, 77, 65, 88, 128, 72, 77, 65, 84, 128, 72, 77, 65, 80, - 128, 72, 77, 65, 128, 72, 76, 89, 88, 128, 72, 76, 89, 84, 128, 72, 76, - 89, 82, 88, 128, 72, 76, 89, 82, 128, 72, 76, 89, 80, 128, 72, 76, 89, - 128, 72, 76, 85, 88, 128, 72, 76, 85, 84, 128, 72, 76, 85, 82, 88, 128, - 72, 76, 85, 82, 128, 72, 76, 85, 80, 128, 72, 76, 85, 79, 88, 128, 72, - 76, 85, 79, 80, 128, 72, 76, 85, 79, 128, 72, 76, 85, 128, 72, 76, 79, - 88, 128, 72, 76, 79, 80, 128, 72, 76, 79, 128, 72, 76, 73, 88, 128, 72, - 76, 73, 84, 128, 72, 76, 73, 80, 128, 72, 76, 73, 69, 88, 128, 72, 76, - 73, 69, 80, 128, 72, 76, 73, 69, 128, 72, 76, 73, 128, 72, 76, 69, 88, - 128, 72, 76, 69, 80, 128, 72, 76, 69, 128, 72, 76, 65, 88, 128, 72, 76, - 65, 85, 128, 72, 76, 65, 84, 128, 72, 76, 65, 80, 128, 72, 76, 65, 128, - 72, 76, 128, 72, 75, 128, 72, 73, 90, 66, 128, 72, 73, 89, 79, 128, 72, - 73, 84, 84, 73, 78, 199, 72, 73, 83, 84, 79, 82, 73, 195, 72, 73, 82, 73, - 81, 128, 72, 73, 80, 80, 79, 80, 79, 84, 65, 77, 85, 83, 128, 72, 73, 78, - 71, 69, 68, 128, 72, 73, 78, 71, 69, 196, 72, 73, 78, 71, 69, 128, 72, - 73, 78, 68, 213, 72, 73, 75, 73, 78, 199, 72, 73, 71, 72, 45, 83, 80, 69, - 69, 196, 72, 73, 71, 72, 45, 82, 69, 86, 69, 82, 83, 69, 68, 45, 185, 72, - 73, 71, 72, 45, 76, 79, 215, 72, 73, 71, 72, 45, 72, 69, 69, 76, 69, 196, - 72, 73, 69, 88, 128, 72, 73, 69, 85, 72, 45, 83, 73, 79, 83, 128, 72, 73, - 69, 85, 72, 45, 82, 73, 69, 85, 76, 128, 72, 73, 69, 85, 72, 45, 80, 73, - 69, 85, 80, 128, 72, 73, 69, 85, 72, 45, 78, 73, 69, 85, 78, 128, 72, 73, - 69, 85, 72, 45, 77, 73, 69, 85, 77, 128, 72, 73, 69, 85, 200, 72, 73, 69, - 82, 79, 71, 76, 89, 80, 72, 73, 195, 72, 73, 69, 128, 72, 73, 68, 73, 78, + 128, 75, 78, 85, 67, 75, 76, 69, 128, 75, 78, 79, 84, 128, 75, 78, 79, + 66, 83, 128, 75, 78, 73, 71, 72, 84, 45, 82, 79, 79, 75, 128, 75, 78, 73, + 71, 72, 84, 45, 81, 85, 69, 69, 78, 128, 75, 78, 73, 71, 72, 84, 45, 66, + 73, 83, 72, 79, 80, 128, 75, 78, 73, 71, 72, 84, 128, 75, 78, 73, 71, 72, + 212, 75, 78, 73, 70, 69, 128, 75, 78, 73, 70, 197, 75, 78, 69, 69, 76, + 73, 78, 199, 75, 77, 128, 75, 205, 75, 76, 73, 84, 79, 78, 128, 75, 76, + 65, 83, 77, 65, 128, 75, 76, 65, 83, 77, 193, 75, 76, 65, 128, 75, 76, + 128, 75, 75, 79, 128, 75, 75, 73, 128, 75, 75, 69, 69, 128, 75, 75, 69, + 128, 75, 75, 65, 128, 75, 75, 128, 75, 74, 69, 128, 75, 73, 89, 69, 79, + 75, 45, 84, 73, 75, 69, 85, 84, 128, 75, 73, 89, 69, 79, 75, 45, 83, 73, + 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 75, 73, 89, 69, 79, 75, 45, 82, + 73, 69, 85, 76, 128, 75, 73, 89, 69, 79, 75, 45, 80, 73, 69, 85, 80, 128, + 75, 73, 89, 69, 79, 75, 45, 78, 73, 69, 85, 78, 128, 75, 73, 89, 69, 79, + 75, 45, 75, 72, 73, 69, 85, 75, 72, 128, 75, 73, 89, 69, 79, 75, 45, 67, + 72, 73, 69, 85, 67, 72, 128, 75, 73, 89, 69, 79, 203, 75, 73, 88, 128, + 75, 73, 87, 73, 70, 82, 85, 73, 84, 128, 75, 73, 87, 128, 75, 73, 86, + 128, 75, 73, 84, 69, 128, 75, 73, 84, 128, 75, 73, 83, 83, 73, 78, 199, + 75, 73, 83, 83, 128, 75, 73, 83, 211, 75, 73, 83, 73, 77, 53, 128, 75, + 73, 83, 73, 77, 181, 75, 73, 83, 72, 128, 75, 73, 83, 65, 76, 128, 75, + 73, 82, 79, 87, 65, 84, 84, 79, 128, 75, 73, 82, 79, 77, 69, 69, 84, 79, + 82, 85, 128, 75, 73, 82, 79, 71, 85, 82, 65, 77, 85, 128, 75, 73, 82, 79, + 128, 75, 73, 82, 71, 72, 73, 218, 75, 73, 81, 128, 75, 73, 80, 128, 75, + 73, 208, 75, 73, 78, 83, 72, 73, 80, 128, 75, 73, 78, 78, 193, 75, 73, + 78, 68, 69, 82, 71, 65, 82, 84, 69, 78, 128, 75, 73, 77, 79, 78, 79, 128, + 75, 73, 76, 76, 69, 82, 128, 75, 73, 73, 90, 72, 128, 75, 73, 73, 128, + 75, 73, 72, 128, 75, 73, 69, 88, 128, 75, 73, 69, 86, 65, 206, 75, 73, + 69, 80, 128, 75, 73, 69, 69, 77, 128, 75, 73, 69, 128, 75, 73, 68, 128, + 75, 73, 196, 75, 73, 67, 75, 128, 75, 73, 66, 128, 75, 73, 65, 86, 128, + 75, 73, 65, 66, 128, 75, 73, 45, 56, 128, 75, 73, 45, 55, 128, 75, 73, + 45, 54, 128, 75, 73, 45, 53, 128, 75, 73, 45, 52, 128, 75, 73, 45, 51, + 128, 75, 73, 45, 50, 128, 75, 73, 45, 49, 128, 75, 72, 90, 128, 75, 72, + 87, 65, 73, 128, 75, 72, 85, 69, 78, 45, 76, 85, 197, 75, 72, 85, 69, + 206, 75, 72, 85, 68, 65, 87, 65, 68, 201, 75, 72, 85, 68, 65, 77, 128, + 75, 72, 85, 65, 84, 128, 75, 72, 79, 85, 128, 75, 72, 79, 212, 75, 72, + 79, 78, 78, 65, 128, 75, 72, 79, 78, 128, 75, 72, 79, 77, 85, 84, 128, + 75, 72, 79, 74, 75, 201, 75, 72, 79, 128, 75, 72, 207, 75, 72, 77, 213, + 75, 72, 73, 84, 128, 75, 72, 73, 78, 89, 65, 128, 75, 72, 73, 69, 85, 75, + 200, 75, 72, 73, 128, 75, 72, 201, 75, 72, 72, 79, 128, 75, 72, 72, 65, + 128, 75, 72, 69, 84, 72, 128, 75, 72, 69, 73, 128, 75, 72, 69, 69, 128, + 75, 72, 69, 128, 75, 72, 65, 86, 128, 75, 72, 65, 82, 79, 83, 72, 84, 72, + 201, 75, 72, 65, 82, 128, 75, 72, 65, 80, 72, 128, 75, 72, 65, 78, 199, + 75, 72, 65, 78, 68, 193, 75, 72, 65, 77, 84, 201, 75, 72, 65, 75, 65, 83, + 83, 73, 65, 206, 75, 72, 65, 73, 128, 75, 72, 65, 72, 128, 75, 72, 65, + 200, 75, 72, 65, 70, 128, 75, 72, 65, 66, 128, 75, 72, 65, 65, 128, 75, + 71, 128, 75, 69, 89, 67, 65, 80, 128, 75, 69, 89, 67, 65, 208, 75, 69, + 89, 66, 79, 65, 82, 68, 128, 75, 69, 89, 66, 79, 65, 82, 196, 75, 69, 88, + 128, 75, 69, 86, 128, 75, 69, 85, 89, 69, 85, 88, 128, 75, 69, 85, 83, + 72, 69, 85, 65, 69, 80, 128, 75, 69, 85, 83, 69, 85, 88, 128, 75, 69, 85, + 80, 85, 81, 128, 75, 69, 85, 79, 212, 75, 69, 85, 77, 128, 75, 69, 85, + 75, 69, 85, 84, 78, 68, 65, 128, 75, 69, 85, 75, 65, 81, 128, 75, 69, 85, + 65, 69, 84, 77, 69, 85, 78, 128, 75, 69, 85, 65, 69, 82, 73, 128, 75, 69, + 84, 84, 201, 75, 69, 83, 72, 50, 128, 75, 69, 82, 69, 84, 128, 75, 69, + 79, 87, 128, 75, 69, 78, 84, 73, 77, 65, 84, 65, 128, 75, 69, 78, 84, 73, + 77, 65, 84, 193, 75, 69, 78, 84, 73, 77, 193, 75, 69, 78, 65, 84, 128, + 75, 69, 78, 128, 75, 69, 206, 75, 69, 77, 80, 85, 76, 128, 75, 69, 77, + 80, 85, 204, 75, 69, 77, 80, 76, 73, 128, 75, 69, 77, 80, 76, 201, 75, + 69, 77, 80, 72, 82, 69, 78, 71, 128, 75, 69, 77, 66, 65, 78, 71, 128, 75, + 69, 76, 86, 73, 206, 75, 69, 72, 69, 72, 128, 75, 69, 72, 69, 200, 75, + 69, 72, 128, 75, 69, 70, 85, 76, 65, 128, 75, 69, 69, 86, 128, 75, 69, + 69, 83, 85, 128, 75, 69, 69, 80, 73, 78, 199, 75, 69, 69, 78, 71, 128, + 75, 69, 69, 66, 128, 75, 69, 66, 128, 75, 69, 65, 65, 69, 128, 75, 67, + 65, 76, 128, 75, 66, 128, 75, 65, 90, 65, 75, 200, 75, 65, 89, 65, 78, + 78, 65, 128, 75, 65, 89, 65, 200, 75, 65, 88, 128, 75, 65, 87, 86, 128, + 75, 65, 87, 73, 128, 75, 65, 87, 66, 128, 75, 65, 86, 89, 75, 65, 128, + 75, 65, 86, 89, 75, 193, 75, 65, 86, 128, 75, 65, 85, 86, 128, 75, 65, + 85, 78, 65, 128, 75, 65, 85, 206, 75, 65, 85, 66, 128, 75, 65, 84, 79, + 128, 75, 65, 84, 72, 73, 83, 84, 73, 128, 75, 65, 84, 72, 65, 75, 193, + 75, 65, 84, 65, 86, 65, 83, 77, 65, 128, 75, 65, 84, 65, 86, 193, 75, 65, + 84, 65, 75, 65, 78, 65, 45, 72, 73, 82, 65, 71, 65, 78, 193, 75, 65, 83, + 82, 65, 84, 65, 78, 128, 75, 65, 83, 82, 65, 84, 65, 206, 75, 65, 83, 82, + 65, 128, 75, 65, 83, 82, 193, 75, 65, 83, 75, 65, 76, 128, 75, 65, 83, + 75, 65, 204, 75, 65, 83, 72, 77, 73, 82, 201, 75, 65, 82, 83, 72, 65, 78, + 65, 128, 75, 65, 82, 79, 82, 73, 73, 128, 75, 65, 82, 79, 82, 65, 78, + 128, 75, 65, 82, 79, 82, 128, 75, 65, 82, 207, 75, 65, 82, 69, 206, 75, + 65, 82, 65, 84, 84, 79, 128, 75, 65, 82, 65, 78, 128, 75, 65, 80, 89, 69, + 79, 85, 78, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 75, 65, 80, 89, + 69, 79, 85, 78, 82, 73, 69, 85, 76, 128, 75, 65, 80, 89, 69, 79, 85, 78, + 80, 72, 73, 69, 85, 80, 72, 128, 75, 65, 80, 89, 69, 79, 85, 78, 77, 73, + 69, 85, 77, 128, 75, 65, 80, 80, 65, 128, 75, 65, 80, 80, 193, 75, 65, + 80, 79, 128, 75, 65, 80, 72, 128, 75, 65, 80, 65, 76, 128, 75, 65, 80, + 65, 128, 75, 65, 208, 75, 65, 78, 84, 65, 74, 193, 75, 65, 78, 78, 65, + 68, 193, 75, 65, 78, 71, 65, 82, 79, 79, 128, 75, 65, 78, 71, 128, 75, + 65, 78, 199, 75, 65, 78, 65, 75, 79, 128, 75, 65, 77, 52, 128, 75, 65, + 77, 50, 128, 75, 65, 77, 128, 75, 65, 75, 79, 128, 75, 65, 75, 65, 66, + 65, 84, 128, 75, 65, 75, 128, 75, 65, 203, 75, 65, 73, 86, 128, 75, 65, + 73, 84, 72, 201, 75, 65, 73, 82, 73, 128, 75, 65, 73, 66, 128, 75, 65, + 73, 128, 75, 65, 201, 75, 65, 70, 65, 128, 75, 65, 70, 128, 75, 65, 198, + 75, 65, 68, 53, 128, 75, 65, 68, 181, 75, 65, 68, 52, 128, 75, 65, 68, + 51, 128, 75, 65, 68, 179, 75, 65, 68, 50, 128, 75, 65, 68, 128, 75, 65, + 66, 193, 75, 65, 66, 128, 75, 65, 65, 86, 128, 75, 65, 65, 73, 128, 75, + 65, 65, 70, 85, 128, 75, 65, 65, 70, 128, 75, 65, 65, 67, 85, 128, 75, + 65, 65, 66, 65, 128, 75, 65, 65, 66, 128, 75, 65, 50, 128, 75, 65, 178, + 75, 65, 45, 75, 69, 128, 75, 65, 45, 57, 128, 75, 65, 45, 56, 128, 75, + 65, 45, 55, 128, 75, 65, 45, 54, 128, 75, 65, 45, 53, 128, 75, 65, 45, + 52, 128, 75, 65, 45, 51, 128, 75, 65, 45, 50, 128, 75, 65, 45, 49, 49, + 128, 75, 65, 45, 49, 48, 128, 75, 65, 45, 49, 128, 75, 48, 48, 56, 128, + 75, 48, 48, 55, 128, 75, 48, 48, 54, 128, 75, 48, 48, 53, 128, 75, 48, + 48, 52, 128, 75, 48, 48, 51, 128, 75, 48, 48, 50, 128, 75, 48, 48, 49, + 128, 74, 87, 65, 128, 74, 85, 85, 128, 74, 85, 84, 128, 74, 85, 83, 84, + 73, 70, 73, 67, 65, 84, 73, 79, 78, 128, 74, 85, 80, 73, 84, 69, 82, 128, + 74, 85, 79, 84, 128, 74, 85, 79, 80, 128, 74, 85, 78, 79, 128, 74, 85, + 78, 71, 83, 69, 79, 78, 199, 74, 85, 78, 69, 128, 74, 85, 76, 89, 128, + 74, 85, 71, 71, 76, 73, 78, 71, 128, 74, 85, 69, 85, 73, 128, 74, 85, 68, + 85, 76, 128, 74, 85, 68, 71, 69, 128, 74, 85, 68, 69, 79, 45, 83, 80, 65, + 78, 73, 83, 200, 74, 79, 89, 83, 84, 73, 67, 75, 128, 74, 79, 89, 79, 85, + 211, 74, 79, 89, 128, 74, 79, 86, 69, 128, 74, 79, 212, 74, 79, 78, 71, + 128, 74, 79, 78, 193, 74, 79, 75, 69, 82, 128, 74, 79, 73, 78, 84, 83, + 128, 74, 79, 73, 78, 69, 68, 128, 74, 79, 73, 78, 128, 74, 79, 65, 128, + 74, 78, 89, 65, 128, 74, 74, 89, 88, 128, 74, 74, 89, 84, 128, 74, 74, + 89, 80, 128, 74, 74, 89, 128, 74, 74, 85, 88, 128, 74, 74, 85, 84, 128, + 74, 74, 85, 82, 88, 128, 74, 74, 85, 82, 128, 74, 74, 85, 80, 128, 74, + 74, 85, 79, 88, 128, 74, 74, 85, 79, 80, 128, 74, 74, 85, 79, 128, 74, + 74, 85, 128, 74, 74, 79, 88, 128, 74, 74, 79, 84, 128, 74, 74, 79, 80, + 128, 74, 74, 79, 128, 74, 74, 73, 88, 128, 74, 74, 73, 84, 128, 74, 74, + 73, 80, 128, 74, 74, 73, 69, 88, 128, 74, 74, 73, 69, 84, 128, 74, 74, + 73, 69, 80, 128, 74, 74, 73, 69, 128, 74, 74, 73, 128, 74, 74, 69, 69, + 128, 74, 74, 69, 128, 74, 74, 65, 128, 74, 73, 76, 128, 74, 73, 73, 77, + 128, 74, 73, 73, 128, 74, 73, 72, 86, 65, 77, 85, 76, 73, 89, 65, 128, + 74, 73, 71, 83, 65, 215, 74, 73, 65, 128, 74, 72, 79, 88, 128, 74, 72, + 79, 128, 74, 72, 69, 72, 128, 74, 72, 65, 89, 73, 78, 128, 74, 72, 65, + 78, 128, 74, 72, 65, 77, 128, 74, 72, 65, 65, 128, 74, 72, 65, 128, 74, + 69, 85, 128, 74, 69, 82, 85, 83, 65, 76, 69, 77, 128, 74, 69, 82, 65, + 206, 74, 69, 82, 65, 128, 74, 69, 82, 128, 74, 69, 72, 128, 74, 69, 200, + 74, 69, 71, 79, 71, 65, 78, 128, 74, 69, 69, 77, 128, 74, 69, 69, 205, + 74, 69, 65, 78, 83, 128, 74, 65, 89, 78, 128, 74, 65, 89, 73, 78, 128, + 74, 65, 89, 65, 78, 78, 65, 128, 74, 65, 87, 128, 74, 65, 86, 73, 89, 65, + 78, 73, 128, 74, 65, 86, 65, 78, 69, 83, 197, 74, 65, 85, 128, 74, 65, + 82, 128, 74, 65, 80, 65, 78, 69, 83, 197, 74, 65, 80, 65, 78, 128, 74, + 65, 78, 85, 65, 82, 89, 128, 74, 65, 76, 76, 65, 74, 65, 76, 65, 76, 79, + 85, 72, 79, 85, 128, 74, 65, 73, 206, 74, 65, 73, 128, 74, 65, 72, 128, + 74, 65, 68, 69, 128, 74, 65, 67, 75, 83, 128, 74, 65, 67, 75, 45, 79, 45, + 76, 65, 78, 84, 69, 82, 78, 128, 74, 65, 67, 203, 74, 45, 83, 73, 77, 80, + 76, 73, 70, 73, 69, 196, 73, 90, 72, 73, 84, 83, 65, 128, 73, 90, 72, 73, + 84, 83, 193, 73, 90, 72, 69, 128, 73, 90, 65, 75, 65, 89, 193, 73, 89, + 69, 75, 128, 73, 89, 65, 78, 78, 65, 128, 73, 85, 74, 65, 128, 73, 84, + 211, 73, 84, 69, 82, 65, 84, 73, 79, 206, 73, 84, 69, 77, 128, 73, 83, + 83, 72, 65, 82, 128, 73, 83, 79, 83, 67, 69, 76, 69, 211, 73, 83, 79, 78, + 128, 73, 83, 79, 206, 73, 83, 79, 76, 65, 84, 69, 128, 73, 83, 76, 65, + 78, 68, 128, 73, 83, 69, 78, 45, 73, 83, 69, 78, 128, 73, 83, 65, 75, 73, + 193, 73, 83, 45, 80, 73, 76, 76, 65, 128, 73, 82, 85, 89, 65, 78, 78, 65, + 128, 73, 82, 85, 85, 89, 65, 78, 78, 65, 128, 73, 82, 79, 78, 45, 67, 79, + 80, 80, 69, 210, 73, 82, 79, 78, 128, 73, 82, 66, 128, 73, 79, 84, 73, + 70, 73, 69, 196, 73, 79, 84, 65, 84, 69, 196, 73, 79, 84, 65, 128, 73, + 79, 84, 193, 73, 79, 82, 128, 73, 79, 78, 71, 128, 73, 79, 68, 72, 65, + 68, 72, 128, 73, 78, 86, 73, 83, 73, 66, 76, 197, 73, 78, 86, 69, 82, 84, + 69, 68, 128, 73, 78, 86, 69, 82, 84, 69, 196, 73, 78, 86, 69, 82, 84, 69, + 66, 82, 65, 84, 69, 128, 73, 78, 86, 69, 82, 83, 197, 73, 78, 84, 82, 79, + 68, 85, 67, 69, 82, 128, 73, 78, 84, 73, 128, 73, 78, 84, 69, 82, 83, 89, + 76, 76, 65, 66, 73, 195, 73, 78, 84, 69, 82, 83, 69, 67, 84, 73, 79, 78, + 128, 73, 78, 84, 69, 82, 83, 69, 67, 84, 73, 79, 206, 73, 78, 84, 69, 82, + 83, 69, 67, 84, 73, 78, 199, 73, 78, 84, 69, 82, 82, 79, 66, 65, 78, 71, + 128, 73, 78, 84, 69, 82, 82, 79, 66, 65, 78, 199, 73, 78, 84, 69, 82, 80, + 79, 76, 65, 84, 73, 79, 206, 73, 78, 84, 69, 82, 76, 79, 67, 75, 69, 196, + 73, 78, 84, 69, 82, 76, 73, 78, 69, 65, 210, 73, 78, 84, 69, 82, 76, 65, + 67, 69, 196, 73, 78, 84, 69, 82, 73, 79, 210, 73, 78, 84, 69, 82, 69, 83, + 212, 73, 78, 84, 69, 82, 67, 65, 76, 65, 84, 69, 128, 73, 78, 84, 69, 71, + 82, 65, 84, 73, 79, 78, 128, 73, 78, 84, 69, 71, 82, 65, 84, 73, 79, 206, + 73, 78, 84, 69, 71, 82, 65, 76, 128, 73, 78, 84, 69, 71, 82, 65, 204, 73, + 78, 83, 85, 76, 65, 210, 73, 78, 83, 84, 82, 85, 77, 69, 78, 84, 65, 204, + 73, 78, 83, 73, 68, 69, 128, 73, 78, 83, 73, 68, 197, 73, 78, 83, 69, 82, + 84, 73, 79, 206, 73, 78, 83, 69, 82, 212, 73, 78, 83, 69, 67, 84, 128, + 73, 78, 83, 67, 82, 73, 80, 84, 73, 79, 78, 65, 204, 73, 78, 80, 85, 212, + 73, 78, 78, 79, 67, 69, 78, 67, 69, 128, 73, 78, 78, 78, 128, 73, 78, 78, + 69, 82, 128, 73, 78, 78, 69, 210, 73, 78, 78, 128, 73, 78, 73, 78, 71, + 85, 128, 73, 78, 72, 73, 66, 73, 212, 73, 78, 72, 69, 82, 69, 78, 212, + 73, 78, 72, 65, 76, 69, 128, 73, 78, 71, 87, 65, 90, 128, 73, 78, 70, 79, + 82, 77, 65, 84, 73, 79, 206, 73, 78, 70, 76, 85, 69, 78, 67, 69, 128, 73, + 78, 70, 73, 78, 73, 84, 89, 128, 73, 78, 70, 73, 78, 73, 84, 217, 73, 78, + 68, 85, 83, 84, 82, 73, 65, 204, 73, 78, 68, 73, 82, 69, 67, 212, 73, 78, + 68, 73, 67, 84, 73, 79, 206, 73, 78, 68, 73, 67, 65, 84, 79, 82, 128, 73, + 78, 68, 73, 67, 65, 84, 79, 210, 73, 78, 68, 73, 195, 73, 78, 68, 73, 65, + 206, 73, 78, 68, 69, 88, 128, 73, 78, 68, 69, 80, 69, 78, 68, 69, 78, + 212, 73, 78, 67, 82, 69, 77, 69, 78, 84, 128, 73, 78, 67, 82, 69, 65, 83, + 69, 211, 73, 78, 67, 82, 69, 65, 83, 69, 128, 73, 78, 67, 82, 69, 65, 83, + 197, 73, 78, 67, 79, 77, 80, 76, 69, 84, 197, 73, 78, 67, 79, 77, 73, 78, + 199, 73, 78, 67, 76, 85, 68, 73, 78, 199, 73, 78, 67, 72, 128, 73, 78, + 66, 79, 216, 73, 78, 65, 80, 128, 73, 78, 45, 65, 76, 65, 70, 128, 73, + 77, 80, 69, 82, 73, 65, 204, 73, 77, 80, 69, 82, 70, 69, 67, 84, 85, 205, + 73, 77, 80, 69, 82, 70, 69, 67, 84, 65, 128, 73, 77, 80, 69, 82, 70, 69, + 67, 84, 193, 73, 77, 78, 128, 73, 77, 73, 83, 69, 79, 211, 73, 77, 73, + 78, 51, 128, 73, 77, 73, 78, 128, 73, 77, 73, 206, 73, 77, 73, 70, 84, + 72, 79, 82, 79, 78, 128, 73, 77, 73, 70, 84, 72, 79, 82, 65, 128, 73, 77, + 73, 70, 79, 78, 79, 78, 128, 73, 77, 73, 68, 73, 65, 82, 71, 79, 78, 128, + 73, 77, 65, 71, 197, 73, 76, 85, 89, 65, 78, 78, 65, 128, 73, 76, 85, 89, + 128, 73, 76, 85, 85, 89, 65, 78, 78, 65, 128, 73, 76, 85, 84, 128, 73, + 76, 73, 77, 77, 85, 52, 128, 73, 76, 73, 77, 77, 85, 51, 128, 73, 76, 73, + 77, 77, 85, 128, 73, 76, 73, 77, 77, 213, 73, 76, 50, 128, 73, 75, 65, + 82, 65, 128, 73, 75, 65, 82, 193, 73, 74, 128, 73, 73, 89, 65, 78, 78, + 65, 128, 73, 71, 73, 128, 73, 71, 201, 73, 71, 71, 87, 83, 128, 73, 70, + 73, 78, 128, 73, 69, 85, 78, 71, 45, 84, 73, 75, 69, 85, 84, 128, 73, 69, + 85, 78, 71, 45, 84, 72, 73, 69, 85, 84, 72, 128, 73, 69, 85, 78, 71, 45, + 82, 73, 69, 85, 76, 128, 73, 69, 85, 78, 71, 45, 80, 73, 69, 85, 80, 128, + 73, 69, 85, 78, 71, 45, 80, 72, 73, 69, 85, 80, 72, 128, 73, 69, 85, 78, + 71, 45, 67, 73, 69, 85, 67, 128, 73, 69, 85, 78, 71, 45, 67, 72, 73, 69, + 85, 67, 72, 128, 73, 69, 85, 78, 199, 73, 68, 76, 69, 128, 73, 68, 73, + 77, 128, 73, 68, 73, 205, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 67, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 57, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, + 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 65, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 65, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 70, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 70, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 69, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 70, 57, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 70, 57, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, + 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 57, 49, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 57, 48, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 68, + 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 67, 65, 57, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 57, 69, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 55, 68, 52, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 55, 65, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 55, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 54, + 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 53, 51, 51, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 53, 49, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 55, 49, 50, 49, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 55, 48, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 54, 70, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 69, + 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 50, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 48, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 54, 55, 48, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 54, 54, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 54, 53, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 53, + 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 53, 53, 55, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 51, 53, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 54, 51, 48, 55, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 54, 50, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 54, 50, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 50, + 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 70, 56, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 68, 69, 54, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 53, 66, 56, 57, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 53, 66, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 53, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 57, + 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 56, 70, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 53, 66, 54, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 53, 52, 51, 57, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 53, 52, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 53, 51, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 51, + 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 68, 68, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 55, 50, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 53, 50, 52, 68, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 53, 50, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 53, 49, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, + 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 56, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 50, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, 57, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 52, 69, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 65, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 65, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, + 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 65, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 56, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 55, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 65, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 65, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 65, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 65, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, + 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 49, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 48, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 69, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 65, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 65, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 65, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 65, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, + 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 54, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 53, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 65, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 65, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 65, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 65, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, + 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 70, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 69, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 70, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 52, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 51, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 68, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 67, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 50, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 49, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 68, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 66, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 65, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 48, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 70, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 57, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 56, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 69, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 68, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 55, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 54, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 69, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 67, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 66, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 53, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 52, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 50, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 67, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 65, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 57, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 51, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 50, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 48, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 65, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 56, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 55, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 49, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 48, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 69, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 54, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 53, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 70, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 69, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 52, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 51, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 68, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 67, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 50, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 49, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 66, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 65, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 48, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 70, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 57, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 56, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 69, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 68, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 55, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 54, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 69, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 67, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 66, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 53, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 52, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 50, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 67, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 65, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 57, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 51, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 50, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 48, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 70, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 70, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 70, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 65, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 56, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 55, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 70, 54, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 70, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 70, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 49, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 48, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 69, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 69, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 69, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 69, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 54, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 53, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 69, 52, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 69, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 70, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 69, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 68, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 52, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 51, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 68, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 67, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 67, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 50, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 49, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 66, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 65, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 48, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 70, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 57, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 56, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 69, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 68, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 55, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 54, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 57, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 69, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 67, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 66, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 53, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 52, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 50, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 67, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 65, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 57, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 51, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 50, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 48, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 54, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 65, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 56, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 55, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 49, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 48, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 69, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 54, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 53, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 70, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 69, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 52, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 51, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 68, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 67, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 50, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 49, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 66, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 65, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 50, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 48, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 70, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 57, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 56, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 69, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 68, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 55, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 54, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 200, 73, 68, 69, 78, + 84, 73, 70, 73, 67, 65, 84, 73, 79, 78, 128, 73, 68, 69, 78, 84, 73, 67, + 65, 204, 73, 67, 79, 78, 128, 73, 67, 72, 79, 85, 128, 73, 67, 72, 79, + 83, 128, 73, 67, 72, 73, 77, 65, 84, 79, 83, 128, 73, 67, 72, 65, 68, 73, + 78, 128, 73, 67, 69, 76, 65, 78, 68, 73, 67, 45, 89, 82, 128, 73, 66, 73, + 70, 73, 76, 73, 128, 73, 65, 85, 68, 65, 128, 73, 48, 49, 53, 128, 73, + 48, 49, 52, 128, 73, 48, 49, 51, 128, 73, 48, 49, 50, 128, 73, 48, 49, + 49, 65, 128, 73, 48, 49, 49, 128, 73, 48, 49, 48, 65, 128, 73, 48, 49, + 48, 128, 73, 48, 48, 57, 65, 128, 73, 48, 48, 57, 128, 73, 48, 48, 56, + 128, 73, 48, 48, 55, 128, 73, 48, 48, 54, 128, 73, 48, 48, 53, 65, 128, + 73, 48, 48, 53, 128, 73, 48, 48, 52, 128, 73, 48, 48, 51, 128, 73, 48, + 48, 50, 128, 73, 48, 48, 49, 128, 73, 45, 89, 85, 128, 73, 45, 89, 79, + 128, 73, 45, 89, 69, 79, 128, 73, 45, 89, 69, 128, 73, 45, 89, 65, 69, + 128, 73, 45, 89, 65, 45, 79, 128, 73, 45, 89, 65, 128, 73, 45, 79, 45, + 73, 128, 73, 45, 79, 128, 73, 45, 69, 85, 128, 73, 45, 66, 69, 65, 77, + 128, 73, 45, 65, 82, 65, 69, 65, 128, 73, 45, 65, 128, 72, 90, 90, 90, + 71, 128, 72, 90, 90, 90, 128, 72, 90, 90, 80, 128, 72, 90, 90, 128, 72, + 90, 87, 71, 128, 72, 90, 87, 128, 72, 90, 84, 128, 72, 90, 71, 128, 72, + 89, 83, 84, 69, 82, 69, 83, 73, 211, 72, 89, 80, 79, 68, 73, 65, 83, 84, + 79, 76, 69, 128, 72, 89, 80, 72, 69, 78, 65, 84, 73, 79, 206, 72, 89, 80, + 72, 69, 78, 45, 77, 73, 78, 85, 83, 128, 72, 89, 80, 72, 69, 78, 128, 72, + 89, 80, 72, 69, 206, 72, 89, 71, 73, 69, 73, 65, 128, 72, 89, 71, 73, 69, + 65, 128, 72, 88, 87, 71, 128, 72, 88, 85, 79, 88, 128, 72, 88, 85, 79, + 84, 128, 72, 88, 85, 79, 80, 128, 72, 88, 85, 79, 128, 72, 88, 79, 88, + 128, 72, 88, 79, 84, 128, 72, 88, 79, 80, 128, 72, 88, 79, 128, 72, 88, + 73, 88, 128, 72, 88, 73, 84, 128, 72, 88, 73, 80, 128, 72, 88, 73, 69, + 88, 128, 72, 88, 73, 69, 84, 128, 72, 88, 73, 69, 80, 128, 72, 88, 73, + 69, 128, 72, 88, 73, 128, 72, 88, 69, 88, 128, 72, 88, 69, 80, 128, 72, + 88, 69, 128, 72, 88, 65, 88, 128, 72, 88, 65, 84, 128, 72, 88, 65, 80, + 128, 72, 88, 65, 128, 72, 87, 85, 128, 72, 87, 65, 73, 82, 128, 72, 87, + 65, 72, 128, 72, 85, 86, 65, 128, 72, 85, 83, 72, 69, 196, 72, 85, 83, + 72, 128, 72, 85, 82, 65, 78, 128, 72, 85, 79, 84, 128, 72, 85, 78, 68, + 82, 69, 68, 83, 128, 72, 85, 78, 68, 82, 69, 68, 211, 72, 85, 78, 68, 82, + 69, 68, 128, 72, 85, 78, 68, 82, 69, 196, 72, 85, 78, 128, 72, 85, 77, + 208, 72, 85, 77, 65, 78, 128, 72, 85, 77, 65, 206, 72, 85, 76, 50, 128, + 72, 85, 73, 73, 84, 79, 128, 72, 85, 71, 71, 73, 78, 71, 128, 72, 85, 71, + 71, 73, 78, 199, 72, 85, 66, 50, 128, 72, 85, 66, 178, 72, 85, 66, 128, + 72, 85, 65, 82, 65, 68, 68, 79, 128, 72, 85, 65, 78, 128, 72, 85, 45, 51, + 128, 72, 85, 45, 50, 128, 72, 85, 45, 49, 128, 72, 84, 83, 128, 72, 84, + 74, 128, 72, 82, 89, 86, 78, 73, 193, 72, 80, 87, 71, 128, 72, 80, 65, + 128, 72, 80, 128, 72, 79, 85, 83, 197, 72, 79, 85, 82, 71, 76, 65, 83, + 83, 128, 72, 79, 85, 82, 71, 76, 65, 83, 211, 72, 79, 85, 82, 128, 72, + 79, 85, 210, 72, 79, 84, 69, 76, 128, 72, 79, 84, 65, 128, 72, 79, 83, + 80, 73, 84, 65, 76, 128, 72, 79, 82, 83, 69, 128, 72, 79, 82, 83, 197, + 72, 79, 82, 82, 128, 72, 79, 82, 78, 83, 128, 72, 79, 82, 73, 90, 79, 78, + 84, 65, 76, 76, 217, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, + 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, + 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, + 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 51, + 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 50, 128, + 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 49, 128, 72, + 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 48, 128, 72, 79, + 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 54, 128, 72, 79, 82, + 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 53, 128, 72, 79, 82, 73, + 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 52, 128, 72, 79, 82, 73, 90, + 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, + 78, 84, 65, 76, 45, 48, 53, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, + 84, 65, 76, 45, 48, 53, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, + 65, 76, 45, 48, 53, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, + 76, 45, 48, 52, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, + 45, 48, 52, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, + 48, 52, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, + 52, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, + 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, + 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, + 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 54, + 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 53, 128, + 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 52, 128, 72, + 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 51, 128, 72, 79, + 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 50, 128, 72, 79, 82, + 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 49, 128, 72, 79, 82, 73, + 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 48, 128, 72, 79, 82, 73, 90, + 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, + 78, 84, 65, 76, 45, 48, 50, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, + 84, 65, 76, 45, 48, 50, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, + 65, 76, 45, 48, 50, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, + 76, 45, 48, 50, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, + 45, 48, 50, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, + 48, 50, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, + 49, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, + 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, + 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, + 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 50, + 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 49, 128, + 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 48, 128, 72, + 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 54, 128, 72, 79, + 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 53, 128, 72, 79, 82, + 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 52, 128, 72, 79, 82, 73, + 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 51, 128, 72, 79, 82, 73, 90, + 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, + 78, 84, 65, 76, 45, 48, 48, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, + 84, 65, 76, 45, 48, 48, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, + 65, 76, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 204, 72, 79, 82, 73, + 128, 72, 79, 82, 193, 72, 79, 79, 85, 128, 72, 79, 79, 82, 85, 128, 72, + 79, 79, 80, 128, 72, 79, 79, 78, 128, 72, 79, 79, 75, 69, 68, 128, 72, + 79, 79, 75, 69, 196, 72, 79, 78, 69, 89, 66, 69, 69, 128, 72, 79, 78, 69, + 217, 72, 79, 77, 79, 84, 72, 69, 84, 73, 67, 128, 72, 79, 77, 79, 84, 72, + 69, 84, 73, 195, 72, 79, 76, 79, 128, 72, 79, 76, 76, 79, 215, 72, 79, + 76, 69, 128, 72, 79, 76, 68, 73, 78, 199, 72, 79, 76, 65, 77, 128, 72, + 79, 76, 65, 205, 72, 79, 75, 65, 128, 72, 79, 67, 75, 69, 217, 72, 79, + 67, 72, 79, 128, 72, 79, 45, 56, 128, 72, 79, 45, 55, 128, 72, 79, 45, + 54, 128, 72, 79, 45, 53, 128, 72, 79, 45, 52, 128, 72, 79, 45, 51, 128, + 72, 79, 45, 50, 128, 72, 79, 45, 49, 128, 72, 78, 85, 84, 128, 72, 78, + 85, 79, 88, 128, 72, 78, 85, 79, 128, 72, 78, 85, 66, 128, 72, 78, 79, + 88, 128, 72, 78, 79, 84, 128, 72, 78, 79, 80, 128, 72, 78, 73, 88, 128, + 72, 78, 73, 84, 128, 72, 78, 73, 80, 128, 72, 78, 73, 69, 88, 128, 72, + 78, 73, 69, 84, 128, 72, 78, 73, 69, 80, 128, 72, 78, 73, 69, 128, 72, + 78, 73, 128, 72, 78, 69, 88, 128, 72, 78, 69, 80, 128, 72, 78, 69, 128, + 72, 78, 65, 88, 128, 72, 78, 65, 85, 128, 72, 78, 65, 84, 128, 72, 78, + 65, 80, 128, 72, 78, 65, 128, 72, 77, 89, 88, 128, 72, 77, 89, 82, 88, + 128, 72, 77, 89, 82, 128, 72, 77, 89, 80, 128, 72, 77, 89, 128, 72, 77, + 85, 88, 128, 72, 77, 85, 84, 128, 72, 77, 85, 82, 88, 128, 72, 77, 85, + 82, 128, 72, 77, 85, 80, 128, 72, 77, 85, 79, 88, 128, 72, 77, 85, 79, + 80, 128, 72, 77, 85, 79, 128, 72, 77, 85, 128, 72, 77, 79, 88, 128, 72, + 77, 79, 84, 128, 72, 77, 79, 80, 128, 72, 77, 79, 128, 72, 77, 73, 88, + 128, 72, 77, 73, 84, 128, 72, 77, 73, 80, 128, 72, 77, 73, 69, 88, 128, + 72, 77, 73, 69, 80, 128, 72, 77, 73, 69, 128, 72, 77, 73, 128, 72, 77, + 69, 128, 72, 77, 65, 88, 128, 72, 77, 65, 84, 128, 72, 77, 65, 80, 128, + 72, 77, 65, 128, 72, 76, 89, 88, 128, 72, 76, 89, 84, 128, 72, 76, 89, + 82, 88, 128, 72, 76, 89, 82, 128, 72, 76, 89, 80, 128, 72, 76, 89, 128, + 72, 76, 85, 88, 128, 72, 76, 85, 84, 128, 72, 76, 85, 82, 88, 128, 72, + 76, 85, 82, 128, 72, 76, 85, 80, 128, 72, 76, 85, 79, 88, 128, 72, 76, + 85, 79, 80, 128, 72, 76, 85, 79, 128, 72, 76, 85, 128, 72, 76, 79, 88, + 128, 72, 76, 79, 80, 128, 72, 76, 79, 128, 72, 76, 73, 88, 128, 72, 76, + 73, 84, 128, 72, 76, 73, 80, 128, 72, 76, 73, 69, 88, 128, 72, 76, 73, + 69, 80, 128, 72, 76, 73, 69, 128, 72, 76, 73, 128, 72, 76, 69, 88, 128, + 72, 76, 69, 80, 128, 72, 76, 69, 128, 72, 76, 65, 88, 128, 72, 76, 65, + 85, 128, 72, 76, 65, 84, 128, 72, 76, 65, 80, 128, 72, 76, 65, 128, 72, + 76, 128, 72, 75, 128, 72, 73, 90, 66, 128, 72, 73, 89, 79, 128, 72, 73, + 84, 84, 73, 78, 199, 72, 73, 83, 84, 79, 82, 73, 195, 72, 73, 82, 73, 81, + 128, 72, 73, 80, 80, 79, 80, 79, 84, 65, 77, 85, 83, 128, 72, 73, 78, 71, + 69, 68, 128, 72, 73, 78, 71, 69, 196, 72, 73, 78, 71, 69, 128, 72, 73, + 78, 68, 213, 72, 73, 75, 73, 78, 199, 72, 73, 71, 72, 45, 83, 80, 69, 69, + 196, 72, 73, 71, 72, 45, 82, 69, 86, 69, 82, 83, 69, 68, 45, 185, 72, 73, + 71, 72, 45, 76, 79, 215, 72, 73, 71, 72, 45, 72, 69, 69, 76, 69, 196, 72, + 73, 69, 88, 128, 72, 73, 69, 85, 72, 45, 83, 73, 79, 83, 128, 72, 73, 69, + 85, 72, 45, 82, 73, 69, 85, 76, 128, 72, 73, 69, 85, 72, 45, 80, 73, 69, + 85, 80, 128, 72, 73, 69, 85, 72, 45, 78, 73, 69, 85, 78, 128, 72, 73, 69, + 85, 72, 45, 77, 73, 69, 85, 77, 128, 72, 73, 69, 85, 200, 72, 73, 69, 82, + 79, 71, 76, 89, 80, 72, 73, 195, 72, 73, 69, 128, 72, 73, 68, 73, 78, 199, 72, 73, 68, 69, 84, 128, 72, 73, 68, 69, 128, 72, 73, 66, 73, 83, 67, 85, 83, 128, 72, 73, 45, 82, 69, 83, 128, 72, 73, 45, 55, 128, 72, 73, 45, 54, 128, 72, 73, 45, 53, 128, 72, 73, 45, 52, 128, 72, 73, 45, @@ -3945,128 +4000,129 @@ static const unsigned char lexicon[] = { 65, 82, 84, 45, 83, 72, 65, 80, 69, 196, 72, 69, 65, 82, 84, 128, 72, 69, 65, 82, 212, 72, 69, 65, 82, 73, 78, 199, 72, 69, 65, 82, 45, 78, 79, 45, 69, 86, 73, 204, 72, 69, 65, 68, 83, 84, 82, 79, 75, 69, 128, 72, 69, 65, - 68, 83, 84, 79, 78, 197, 72, 69, 65, 68, 83, 67, 65, 82, 70, 128, 72, 69, - 65, 68, 80, 72, 79, 78, 69, 128, 72, 69, 65, 68, 73, 78, 71, 128, 72, 69, - 65, 68, 45, 66, 65, 78, 68, 65, 71, 69, 128, 72, 69, 45, 55, 128, 72, 69, - 45, 54, 128, 72, 69, 45, 53, 128, 72, 69, 45, 52, 128, 72, 69, 45, 51, - 128, 72, 69, 45, 50, 128, 72, 69, 45, 49, 128, 72, 68, 82, 128, 72, 67, - 128, 72, 66, 65, 83, 65, 45, 69, 83, 65, 83, 193, 72, 66, 65, 83, 193, - 72, 65, 89, 65, 78, 78, 65, 128, 72, 65, 87, 74, 128, 72, 65, 86, 69, - 128, 72, 65, 85, 80, 84, 83, 84, 73, 77, 77, 69, 128, 72, 65, 213, 72, - 65, 84, 82, 65, 206, 72, 65, 84, 72, 73, 128, 72, 65, 84, 69, 128, 72, - 65, 84, 67, 72, 73, 78, 199, 72, 65, 84, 65, 198, 72, 65, 83, 69, 210, - 72, 65, 83, 65, 78, 84, 65, 128, 72, 65, 82, 80, 79, 79, 78, 128, 72, 65, - 82, 80, 79, 79, 206, 72, 65, 82, 77, 79, 78, 73, 67, 128, 72, 65, 82, 75, - 76, 69, 65, 206, 72, 65, 82, 68, 78, 69, 83, 83, 128, 72, 65, 82, 196, - 72, 65, 82, 66, 65, 72, 65, 89, 128, 72, 65, 80, 80, 217, 72, 65, 78, 85, - 78, 79, 207, 72, 65, 78, 73, 70, 201, 72, 65, 78, 71, 90, 72, 79, 213, - 72, 65, 78, 68, 83, 72, 65, 75, 69, 128, 72, 65, 78, 68, 83, 128, 72, 65, - 78, 68, 211, 72, 65, 78, 68, 76, 69, 83, 128, 72, 65, 78, 68, 76, 69, - 128, 72, 65, 78, 68, 66, 65, 76, 76, 128, 72, 65, 78, 68, 66, 65, 71, - 128, 72, 65, 78, 68, 45, 79, 86, 65, 76, 128, 72, 65, 78, 68, 45, 79, 86, - 65, 204, 72, 65, 78, 68, 45, 72, 79, 79, 75, 128, 72, 65, 78, 68, 45, 72, - 79, 79, 203, 72, 65, 78, 68, 45, 72, 73, 78, 71, 69, 128, 72, 65, 78, 68, - 45, 72, 73, 78, 71, 197, 72, 65, 78, 68, 45, 70, 76, 65, 84, 128, 72, 65, - 78, 68, 45, 70, 76, 65, 212, 72, 65, 78, 68, 45, 70, 73, 83, 84, 128, 72, - 65, 78, 68, 45, 67, 85, 82, 76, 73, 67, 85, 69, 128, 72, 65, 78, 68, 45, - 67, 85, 82, 76, 73, 67, 85, 197, 72, 65, 78, 68, 45, 67, 85, 80, 128, 72, - 65, 78, 68, 45, 67, 85, 208, 72, 65, 78, 68, 45, 67, 76, 65, 87, 128, 72, - 65, 78, 68, 45, 67, 76, 65, 215, 72, 65, 78, 68, 45, 67, 73, 82, 67, 76, - 69, 128, 72, 65, 78, 68, 45, 67, 73, 82, 67, 76, 197, 72, 65, 78, 68, 45, - 65, 78, 71, 76, 69, 128, 72, 65, 78, 68, 45, 65, 78, 71, 76, 197, 72, 65, - 78, 68, 128, 72, 65, 78, 45, 65, 75, 65, 84, 128, 72, 65, 77, 90, 65, - 128, 72, 65, 77, 90, 193, 72, 65, 77, 83, 84, 69, 210, 72, 65, 77, 77, - 69, 82, 128, 72, 65, 77, 77, 69, 210, 72, 65, 77, 66, 85, 82, 71, 69, 82, - 128, 72, 65, 76, 81, 65, 128, 72, 65, 76, 79, 128, 72, 65, 76, 70, 45, - 67, 73, 82, 67, 76, 197, 72, 65, 76, 70, 45, 50, 128, 72, 65, 76, 70, 45, - 49, 128, 72, 65, 76, 70, 128, 72, 65, 76, 66, 69, 82, 68, 128, 72, 65, - 76, 65, 78, 84, 65, 128, 72, 65, 73, 84, 85, 128, 72, 65, 73, 211, 72, - 65, 73, 82, 67, 85, 84, 128, 72, 65, 71, 76, 65, 218, 72, 65, 71, 76, - 128, 72, 65, 70, 85, 75, 72, 65, 128, 72, 65, 70, 85, 75, 72, 128, 72, - 65, 69, 71, 204, 72, 65, 68, 69, 83, 128, 72, 65, 65, 82, 85, 128, 72, - 65, 65, 77, 128, 72, 65, 193, 72, 65, 45, 72, 65, 128, 72, 65, 45, 57, - 128, 72, 65, 45, 56, 128, 72, 65, 45, 55, 128, 72, 65, 45, 54, 128, 72, - 65, 45, 53, 128, 72, 65, 45, 52, 128, 72, 65, 45, 51, 128, 72, 65, 45, - 50, 128, 72, 65, 45, 49, 49, 128, 72, 65, 45, 49, 48, 128, 72, 65, 45, - 49, 128, 72, 48, 48, 56, 128, 72, 48, 48, 55, 128, 72, 48, 48, 54, 65, - 128, 72, 48, 48, 54, 128, 72, 48, 48, 53, 128, 72, 48, 48, 52, 128, 72, - 48, 48, 51, 128, 72, 48, 48, 50, 128, 72, 48, 48, 49, 128, 72, 45, 84, - 89, 80, 197, 71, 89, 85, 128, 71, 89, 79, 78, 128, 71, 89, 79, 128, 71, - 89, 73, 128, 71, 89, 70, 213, 71, 89, 69, 69, 128, 71, 89, 65, 83, 128, - 71, 89, 65, 65, 128, 71, 89, 65, 128, 71, 89, 128, 71, 87, 85, 128, 71, - 87, 73, 128, 71, 87, 69, 69, 128, 71, 87, 69, 128, 71, 87, 65, 65, 128, - 71, 87, 65, 128, 71, 86, 65, 78, 71, 128, 71, 86, 128, 71, 85, 82, 85, - 83, 72, 128, 71, 85, 82, 85, 78, 128, 71, 85, 82, 77, 85, 75, 72, 201, - 71, 85, 82, 65, 77, 85, 84, 79, 78, 128, 71, 85, 82, 55, 128, 71, 85, 78, - 85, 128, 71, 85, 78, 213, 71, 85, 78, 74, 65, 76, 193, 71, 85, 205, 71, - 85, 76, 128, 71, 85, 74, 65, 82, 65, 84, 201, 71, 85, 73, 84, 65, 82, - 128, 71, 85, 73, 68, 197, 71, 85, 199, 71, 85, 69, 73, 128, 71, 85, 69, - 72, 128, 71, 85, 69, 200, 71, 85, 68, 128, 71, 85, 196, 71, 85, 65, 82, - 68, 83, 77, 65, 78, 128, 71, 85, 65, 82, 68, 69, 68, 78, 69, 83, 83, 128, - 71, 85, 65, 82, 68, 69, 196, 71, 85, 65, 82, 68, 128, 71, 85, 65, 82, 65, - 78, 201, 71, 85, 193, 71, 85, 178, 71, 84, 69, 210, 71, 83, 85, 77, 128, - 71, 83, 85, 205, 71, 82, 213, 71, 82, 79, 87, 73, 78, 199, 71, 82, 79, - 85, 78, 68, 128, 71, 82, 79, 78, 84, 72, 73, 83, 77, 65, 84, 65, 128, 71, - 82, 73, 78, 78, 73, 78, 199, 71, 82, 73, 77, 65, 67, 73, 78, 199, 71, 82, - 69, 71, 79, 82, 73, 65, 206, 71, 82, 69, 69, 78, 128, 71, 82, 69, 69, - 206, 71, 82, 69, 65, 84, 78, 69, 83, 83, 128, 71, 82, 69, 65, 84, 69, 82, - 45, 84, 72, 65, 78, 128, 71, 82, 69, 65, 84, 69, 82, 45, 84, 72, 65, 206, - 71, 82, 69, 65, 84, 69, 210, 71, 82, 69, 65, 212, 71, 82, 65, 86, 69, 89, - 65, 82, 196, 71, 82, 65, 86, 69, 45, 77, 65, 67, 82, 79, 78, 128, 71, 82, - 65, 86, 69, 45, 65, 67, 85, 84, 69, 45, 71, 82, 65, 86, 69, 128, 71, 82, - 65, 86, 197, 71, 82, 65, 84, 69, 82, 128, 71, 82, 65, 83, 83, 128, 71, - 82, 65, 83, 211, 71, 82, 65, 83, 208, 71, 82, 65, 80, 72, 69, 77, 197, - 71, 82, 65, 80, 69, 83, 128, 71, 82, 65, 78, 84, 72, 193, 71, 82, 65, 77, - 77, 193, 71, 82, 65, 73, 78, 128, 71, 82, 65, 68, 85, 65, 84, 73, 79, - 206, 71, 82, 65, 68, 85, 65, 76, 128, 71, 82, 65, 67, 69, 128, 71, 82, - 65, 67, 197, 71, 80, 65, 128, 71, 79, 82, 84, 72, 77, 73, 75, 79, 206, - 71, 79, 82, 84, 128, 71, 79, 82, 73, 76, 76, 65, 128, 71, 79, 82, 71, 79, - 84, 69, 82, 73, 128, 71, 79, 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, - 78, 128, 71, 79, 82, 71, 79, 206, 71, 79, 82, 71, 73, 128, 71, 79, 82, - 65, 128, 71, 79, 79, 196, 71, 79, 78, 71, 128, 71, 79, 76, 70, 69, 82, - 128, 71, 79, 76, 68, 128, 71, 79, 75, 128, 71, 79, 73, 78, 199, 71, 79, - 71, 71, 76, 69, 83, 128, 71, 79, 66, 76, 73, 78, 128, 71, 79, 65, 76, - 128, 71, 79, 65, 204, 71, 79, 65, 128, 71, 78, 89, 73, 83, 128, 71, 78, - 65, 86, 73, 89, 65, 78, 73, 128, 71, 76, 79, 87, 73, 78, 199, 71, 76, 79, - 86, 69, 83, 128, 71, 76, 79, 86, 69, 128, 71, 76, 79, 84, 84, 65, 204, - 71, 76, 79, 66, 197, 71, 76, 73, 83, 83, 65, 78, 68, 207, 71, 76, 69, 73, - 67, 200, 71, 76, 65, 71, 79, 76, 73, 128, 71, 76, 65, 128, 71, 74, 69, - 128, 71, 73, 88, 128, 71, 73, 84, 128, 71, 73, 83, 72, 128, 71, 73, 83, - 200, 71, 73, 83, 65, 76, 128, 71, 73, 82, 85, 68, 65, 65, 128, 71, 73, - 82, 76, 211, 71, 73, 82, 76, 128, 71, 73, 82, 65, 70, 70, 197, 71, 73, - 82, 51, 128, 71, 73, 82, 179, 71, 73, 82, 50, 128, 71, 73, 82, 178, 71, - 73, 80, 128, 71, 73, 78, 73, 73, 128, 71, 73, 77, 69, 76, 128, 71, 73, - 77, 69, 204, 71, 73, 77, 128, 71, 73, 71, 65, 128, 71, 73, 71, 128, 71, - 73, 70, 212, 71, 73, 69, 84, 128, 71, 73, 68, 73, 77, 128, 71, 73, 66, - 66, 79, 85, 211, 71, 73, 66, 65, 128, 71, 73, 52, 128, 71, 73, 180, 71, - 72, 90, 128, 71, 72, 87, 65, 128, 71, 72, 85, 78, 78, 65, 128, 71, 72, - 85, 78, 78, 193, 71, 72, 85, 128, 71, 72, 79, 85, 128, 71, 72, 79, 83, - 84, 128, 71, 72, 79, 128, 71, 72, 73, 77, 69, 76, 128, 71, 72, 73, 128, - 71, 72, 72, 65, 128, 71, 72, 69, 89, 83, 128, 71, 72, 69, 85, 88, 128, - 71, 72, 69, 85, 78, 128, 71, 72, 69, 85, 71, 72, 69, 85, 65, 69, 77, 128, - 71, 72, 69, 85, 71, 72, 69, 78, 128, 71, 72, 69, 85, 65, 69, 82, 65, 69, - 128, 71, 72, 69, 85, 65, 69, 71, 72, 69, 85, 65, 69, 128, 71, 72, 69, 84, - 128, 71, 72, 69, 69, 128, 71, 72, 69, 128, 71, 72, 197, 71, 72, 65, 89, - 78, 128, 71, 72, 65, 82, 65, 69, 128, 71, 72, 65, 80, 128, 71, 72, 65, - 78, 128, 71, 72, 65, 77, 77, 65, 128, 71, 72, 65, 77, 65, 76, 128, 71, - 72, 65, 73, 78, 85, 128, 71, 72, 65, 73, 78, 128, 71, 72, 65, 73, 206, - 71, 72, 65, 68, 128, 71, 72, 65, 65, 77, 65, 69, 128, 71, 72, 65, 65, - 128, 71, 71, 87, 73, 128, 71, 71, 87, 69, 69, 128, 71, 71, 87, 69, 128, - 71, 71, 87, 65, 65, 128, 71, 71, 87, 65, 128, 71, 71, 85, 88, 128, 71, - 71, 85, 84, 128, 71, 71, 85, 82, 88, 128, 71, 71, 85, 82, 128, 71, 71, - 85, 79, 88, 128, 71, 71, 85, 79, 84, 128, 71, 71, 85, 79, 80, 128, 71, - 71, 85, 79, 128, 71, 71, 79, 88, 128, 71, 71, 79, 84, 128, 71, 71, 79, - 80, 128, 71, 71, 73, 88, 128, 71, 71, 73, 84, 128, 71, 71, 73, 69, 88, - 128, 71, 71, 73, 69, 80, 128, 71, 71, 73, 69, 128, 71, 71, 69, 88, 128, - 71, 71, 69, 84, 128, 71, 71, 69, 80, 128, 71, 71, 65, 88, 128, 71, 71, - 65, 84, 128, 71, 69, 84, 193, 71, 69, 83, 84, 85, 82, 69, 128, 71, 69, - 83, 72, 85, 128, 71, 69, 83, 72, 84, 73, 78, 128, 71, 69, 83, 72, 84, 73, - 206, 71, 69, 83, 72, 50, 128, 71, 69, 82, 83, 72, 65, 89, 73, 77, 128, - 71, 69, 82, 77, 65, 206, 71, 69, 82, 69, 83, 72, 128, 71, 69, 82, 69, 83, - 200, 71, 69, 79, 77, 69, 84, 82, 73, 67, 65, 76, 76, 217, 71, 69, 79, 77, - 69, 84, 82, 73, 195, 71, 69, 78, 84, 76, 197, 71, 69, 78, 73, 84, 73, 86, - 69, 128, 71, 69, 78, 73, 75, 201, 71, 69, 78, 73, 69, 128, 71, 69, 78, - 69, 82, 73, 195, 71, 69, 78, 69, 82, 65, 76, 128, 71, 69, 77, 73, 78, 73, + 68, 83, 84, 79, 78, 69, 128, 72, 69, 65, 68, 83, 84, 79, 78, 197, 72, 69, + 65, 68, 83, 67, 65, 82, 70, 128, 72, 69, 65, 68, 80, 72, 79, 78, 69, 128, + 72, 69, 65, 68, 73, 78, 71, 128, 72, 69, 65, 68, 45, 66, 65, 78, 68, 65, + 71, 69, 128, 72, 69, 45, 55, 128, 72, 69, 45, 54, 128, 72, 69, 45, 53, + 128, 72, 69, 45, 52, 128, 72, 69, 45, 51, 128, 72, 69, 45, 50, 128, 72, + 69, 45, 49, 128, 72, 68, 82, 128, 72, 67, 128, 72, 66, 65, 83, 65, 45, + 69, 83, 65, 83, 193, 72, 66, 65, 83, 193, 72, 65, 89, 65, 78, 78, 65, + 128, 72, 65, 87, 74, 128, 72, 65, 86, 69, 128, 72, 65, 85, 80, 84, 83, + 84, 73, 77, 77, 69, 128, 72, 65, 213, 72, 65, 84, 82, 65, 206, 72, 65, + 84, 72, 73, 128, 72, 65, 84, 69, 128, 72, 65, 84, 67, 72, 73, 78, 199, + 72, 65, 84, 65, 198, 72, 65, 83, 69, 210, 72, 65, 83, 65, 78, 84, 65, + 128, 72, 65, 82, 80, 79, 79, 78, 128, 72, 65, 82, 80, 79, 79, 206, 72, + 65, 82, 77, 79, 78, 73, 67, 128, 72, 65, 82, 75, 76, 69, 65, 206, 72, 65, + 82, 68, 78, 69, 83, 83, 128, 72, 65, 82, 196, 72, 65, 82, 66, 65, 72, 65, + 89, 128, 72, 65, 80, 80, 217, 72, 65, 78, 85, 78, 79, 207, 72, 65, 78, + 73, 70, 201, 72, 65, 78, 71, 90, 72, 79, 213, 72, 65, 78, 68, 83, 72, 65, + 75, 69, 128, 72, 65, 78, 68, 83, 128, 72, 65, 78, 68, 211, 72, 65, 78, + 68, 76, 69, 83, 128, 72, 65, 78, 68, 76, 69, 128, 72, 65, 78, 68, 66, 65, + 76, 76, 128, 72, 65, 78, 68, 66, 65, 71, 128, 72, 65, 78, 68, 45, 79, 86, + 65, 76, 128, 72, 65, 78, 68, 45, 79, 86, 65, 204, 72, 65, 78, 68, 45, 72, + 79, 79, 75, 128, 72, 65, 78, 68, 45, 72, 79, 79, 203, 72, 65, 78, 68, 45, + 72, 73, 78, 71, 69, 128, 72, 65, 78, 68, 45, 72, 73, 78, 71, 197, 72, 65, + 78, 68, 45, 70, 76, 65, 84, 128, 72, 65, 78, 68, 45, 70, 76, 65, 212, 72, + 65, 78, 68, 45, 70, 73, 83, 84, 128, 72, 65, 78, 68, 45, 67, 85, 82, 76, + 73, 67, 85, 69, 128, 72, 65, 78, 68, 45, 67, 85, 82, 76, 73, 67, 85, 197, + 72, 65, 78, 68, 45, 67, 85, 80, 128, 72, 65, 78, 68, 45, 67, 85, 208, 72, + 65, 78, 68, 45, 67, 76, 65, 87, 128, 72, 65, 78, 68, 45, 67, 76, 65, 215, + 72, 65, 78, 68, 45, 67, 73, 82, 67, 76, 69, 128, 72, 65, 78, 68, 45, 67, + 73, 82, 67, 76, 197, 72, 65, 78, 68, 45, 65, 78, 71, 76, 69, 128, 72, 65, + 78, 68, 45, 65, 78, 71, 76, 197, 72, 65, 78, 68, 128, 72, 65, 78, 45, 65, + 75, 65, 84, 128, 72, 65, 77, 90, 65, 128, 72, 65, 77, 90, 193, 72, 65, + 77, 83, 84, 69, 210, 72, 65, 77, 77, 69, 82, 128, 72, 65, 77, 77, 69, + 210, 72, 65, 77, 66, 85, 82, 71, 69, 82, 128, 72, 65, 76, 81, 65, 128, + 72, 65, 76, 79, 128, 72, 65, 76, 70, 45, 67, 73, 82, 67, 76, 197, 72, 65, + 76, 70, 45, 50, 128, 72, 65, 76, 70, 45, 49, 128, 72, 65, 76, 70, 128, + 72, 65, 76, 66, 69, 82, 68, 128, 72, 65, 76, 65, 78, 84, 65, 128, 72, 65, + 73, 84, 85, 128, 72, 65, 73, 211, 72, 65, 73, 82, 67, 85, 84, 128, 72, + 65, 71, 76, 65, 218, 72, 65, 71, 76, 128, 72, 65, 70, 85, 75, 72, 65, + 128, 72, 65, 70, 85, 75, 72, 128, 72, 65, 69, 71, 204, 72, 65, 68, 69, + 83, 128, 72, 65, 65, 82, 85, 128, 72, 65, 65, 77, 128, 72, 65, 193, 72, + 65, 45, 72, 65, 128, 72, 65, 45, 57, 128, 72, 65, 45, 56, 128, 72, 65, + 45, 55, 128, 72, 65, 45, 54, 128, 72, 65, 45, 53, 128, 72, 65, 45, 52, + 128, 72, 65, 45, 51, 128, 72, 65, 45, 50, 128, 72, 65, 45, 49, 49, 128, + 72, 65, 45, 49, 48, 128, 72, 65, 45, 49, 128, 72, 48, 48, 56, 128, 72, + 48, 48, 55, 128, 72, 48, 48, 54, 65, 128, 72, 48, 48, 54, 128, 72, 48, + 48, 53, 128, 72, 48, 48, 52, 128, 72, 48, 48, 51, 128, 72, 48, 48, 50, + 128, 72, 48, 48, 49, 128, 72, 45, 84, 89, 80, 197, 71, 89, 85, 128, 71, + 89, 79, 78, 128, 71, 89, 79, 128, 71, 89, 73, 128, 71, 89, 70, 213, 71, + 89, 69, 69, 128, 71, 89, 65, 83, 128, 71, 89, 65, 65, 128, 71, 89, 65, + 128, 71, 89, 128, 71, 87, 85, 128, 71, 87, 73, 128, 71, 87, 69, 69, 128, + 71, 87, 69, 128, 71, 87, 65, 65, 128, 71, 87, 65, 128, 71, 87, 128, 71, + 86, 65, 78, 71, 128, 71, 86, 128, 71, 85, 82, 85, 83, 72, 128, 71, 85, + 82, 85, 78, 128, 71, 85, 82, 77, 85, 75, 72, 201, 71, 85, 82, 65, 77, 85, + 84, 79, 78, 128, 71, 85, 82, 55, 128, 71, 85, 78, 85, 128, 71, 85, 78, + 213, 71, 85, 78, 74, 65, 76, 193, 71, 85, 205, 71, 85, 76, 128, 71, 85, + 74, 65, 82, 65, 84, 201, 71, 85, 73, 84, 65, 82, 128, 71, 85, 73, 68, + 197, 71, 85, 199, 71, 85, 69, 73, 128, 71, 85, 69, 72, 128, 71, 85, 69, + 200, 71, 85, 68, 128, 71, 85, 196, 71, 85, 65, 82, 68, 83, 77, 65, 78, + 128, 71, 85, 65, 82, 68, 69, 68, 78, 69, 83, 83, 128, 71, 85, 65, 82, 68, + 69, 196, 71, 85, 65, 82, 68, 128, 71, 85, 65, 82, 65, 78, 201, 71, 85, + 193, 71, 85, 178, 71, 84, 69, 210, 71, 83, 85, 77, 128, 71, 83, 85, 205, + 71, 82, 213, 71, 82, 79, 87, 73, 78, 199, 71, 82, 79, 85, 78, 68, 128, + 71, 82, 79, 78, 84, 72, 73, 83, 77, 65, 84, 65, 128, 71, 82, 73, 78, 78, + 73, 78, 199, 71, 82, 73, 77, 65, 67, 73, 78, 199, 71, 82, 69, 71, 79, 82, + 73, 65, 206, 71, 82, 69, 69, 78, 128, 71, 82, 69, 69, 206, 71, 82, 69, + 65, 84, 78, 69, 83, 83, 128, 71, 82, 69, 65, 84, 69, 82, 45, 84, 72, 65, + 78, 128, 71, 82, 69, 65, 84, 69, 82, 45, 84, 72, 65, 206, 71, 82, 69, 65, + 84, 69, 210, 71, 82, 69, 65, 212, 71, 82, 65, 86, 69, 89, 65, 82, 196, + 71, 82, 65, 86, 69, 45, 77, 65, 67, 82, 79, 78, 128, 71, 82, 65, 86, 69, + 45, 65, 67, 85, 84, 69, 45, 71, 82, 65, 86, 69, 128, 71, 82, 65, 86, 197, + 71, 82, 65, 84, 69, 82, 128, 71, 82, 65, 83, 83, 128, 71, 82, 65, 83, + 211, 71, 82, 65, 83, 208, 71, 82, 65, 80, 72, 69, 77, 197, 71, 82, 65, + 80, 69, 83, 128, 71, 82, 65, 78, 84, 72, 193, 71, 82, 65, 77, 77, 193, + 71, 82, 65, 73, 78, 128, 71, 82, 65, 68, 85, 65, 84, 73, 79, 206, 71, 82, + 65, 68, 85, 65, 76, 128, 71, 82, 65, 67, 69, 128, 71, 82, 65, 67, 197, + 71, 80, 65, 128, 71, 79, 82, 84, 72, 77, 73, 75, 79, 206, 71, 79, 82, 84, + 128, 71, 79, 82, 73, 76, 76, 65, 128, 71, 79, 82, 71, 79, 84, 69, 82, 73, + 128, 71, 79, 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, 78, 128, 71, 79, + 82, 71, 79, 206, 71, 79, 82, 71, 73, 128, 71, 79, 82, 65, 128, 71, 79, + 79, 196, 71, 79, 78, 71, 128, 71, 79, 76, 70, 69, 82, 128, 71, 79, 76, + 68, 128, 71, 79, 75, 128, 71, 79, 73, 78, 199, 71, 79, 71, 71, 76, 69, + 83, 128, 71, 79, 66, 76, 73, 78, 128, 71, 79, 65, 76, 128, 71, 79, 65, + 204, 71, 79, 65, 128, 71, 78, 89, 73, 83, 128, 71, 78, 65, 86, 73, 89, + 65, 78, 73, 128, 71, 76, 79, 87, 73, 78, 199, 71, 76, 79, 86, 69, 83, + 128, 71, 76, 79, 86, 69, 128, 71, 76, 79, 84, 84, 65, 204, 71, 76, 79, + 66, 197, 71, 76, 73, 83, 83, 65, 78, 68, 207, 71, 76, 69, 73, 67, 200, + 71, 76, 65, 71, 79, 76, 73, 128, 71, 76, 65, 128, 71, 74, 69, 128, 71, + 73, 88, 128, 71, 73, 84, 128, 71, 73, 83, 72, 128, 71, 73, 83, 200, 71, + 73, 83, 65, 76, 128, 71, 73, 82, 85, 68, 65, 65, 128, 71, 73, 82, 76, + 211, 71, 73, 82, 76, 128, 71, 73, 82, 65, 70, 70, 197, 71, 73, 82, 51, + 128, 71, 73, 82, 179, 71, 73, 82, 50, 128, 71, 73, 82, 178, 71, 73, 80, + 128, 71, 73, 78, 73, 73, 128, 71, 73, 77, 69, 76, 128, 71, 73, 77, 69, + 204, 71, 73, 77, 128, 71, 73, 71, 65, 128, 71, 73, 71, 128, 71, 73, 70, + 212, 71, 73, 69, 84, 128, 71, 73, 68, 73, 77, 128, 71, 73, 66, 66, 79, + 85, 211, 71, 73, 66, 65, 128, 71, 73, 52, 128, 71, 73, 180, 71, 72, 90, + 128, 71, 72, 87, 65, 128, 71, 72, 85, 78, 78, 65, 128, 71, 72, 85, 78, + 78, 193, 71, 72, 85, 128, 71, 72, 79, 85, 128, 71, 72, 79, 83, 84, 128, + 71, 72, 79, 128, 71, 72, 73, 77, 69, 76, 128, 71, 72, 73, 128, 71, 72, + 72, 65, 128, 71, 72, 69, 89, 83, 128, 71, 72, 69, 85, 88, 128, 71, 72, + 69, 85, 78, 128, 71, 72, 69, 85, 71, 72, 69, 85, 65, 69, 77, 128, 71, 72, + 69, 85, 71, 72, 69, 78, 128, 71, 72, 69, 85, 65, 69, 82, 65, 69, 128, 71, + 72, 69, 85, 65, 69, 71, 72, 69, 85, 65, 69, 128, 71, 72, 69, 84, 128, 71, + 72, 69, 69, 128, 71, 72, 69, 128, 71, 72, 197, 71, 72, 65, 89, 78, 128, + 71, 72, 65, 82, 65, 69, 128, 71, 72, 65, 80, 128, 71, 72, 65, 78, 128, + 71, 72, 65, 77, 77, 65, 128, 71, 72, 65, 77, 65, 76, 128, 71, 72, 65, 73, + 78, 85, 128, 71, 72, 65, 73, 78, 128, 71, 72, 65, 73, 206, 71, 72, 65, + 68, 128, 71, 72, 65, 65, 77, 65, 69, 128, 71, 72, 65, 65, 128, 71, 71, + 87, 73, 128, 71, 71, 87, 69, 69, 128, 71, 71, 87, 69, 128, 71, 71, 87, + 65, 65, 128, 71, 71, 87, 65, 128, 71, 71, 85, 88, 128, 71, 71, 85, 84, + 128, 71, 71, 85, 82, 88, 128, 71, 71, 85, 82, 128, 71, 71, 85, 79, 88, + 128, 71, 71, 85, 79, 84, 128, 71, 71, 85, 79, 80, 128, 71, 71, 85, 79, + 128, 71, 71, 79, 88, 128, 71, 71, 79, 84, 128, 71, 71, 79, 80, 128, 71, + 71, 73, 88, 128, 71, 71, 73, 84, 128, 71, 71, 73, 69, 88, 128, 71, 71, + 73, 69, 80, 128, 71, 71, 73, 69, 128, 71, 71, 69, 88, 128, 71, 71, 69, + 84, 128, 71, 71, 69, 80, 128, 71, 71, 65, 88, 128, 71, 71, 65, 84, 128, + 71, 69, 84, 193, 71, 69, 83, 84, 85, 82, 69, 128, 71, 69, 83, 72, 85, + 128, 71, 69, 83, 72, 84, 73, 78, 128, 71, 69, 83, 72, 84, 73, 206, 71, + 69, 83, 72, 50, 128, 71, 69, 82, 83, 72, 65, 89, 73, 77, 128, 71, 69, 82, + 77, 65, 206, 71, 69, 82, 69, 83, 72, 128, 71, 69, 82, 69, 83, 200, 71, + 69, 79, 77, 69, 84, 82, 73, 67, 65, 76, 76, 217, 71, 69, 79, 77, 69, 84, + 82, 73, 195, 71, 69, 78, 84, 76, 197, 71, 69, 78, 73, 84, 73, 86, 69, + 128, 71, 69, 78, 73, 75, 201, 71, 69, 78, 73, 69, 128, 71, 69, 78, 69, + 82, 73, 195, 71, 69, 78, 69, 82, 65, 76, 128, 71, 69, 77, 73, 78, 73, 128, 71, 69, 77, 73, 78, 65, 84, 73, 79, 206, 71, 69, 77, 73, 78, 65, 84, 197, 71, 69, 205, 71, 69, 69, 77, 128, 71, 69, 68, 79, 76, 65, 128, 71, 69, 68, 69, 128, 71, 69, 66, 207, 71, 69, 66, 193, 71, 69, 65, 82, 128, @@ -4125,12 +4181,13 @@ static const unsigned char lexicon[] = { 128, 70, 82, 69, 78, 67, 200, 70, 82, 69, 69, 90, 73, 78, 199, 70, 82, 69, 69, 128, 70, 82, 69, 197, 70, 82, 65, 78, 75, 211, 70, 82, 65, 78, 195, 70, 82, 65, 77, 69, 83, 128, 70, 82, 65, 77, 69, 128, 70, 82, 65, - 77, 197, 70, 82, 65, 71, 82, 65, 78, 84, 128, 70, 82, 65, 71, 77, 69, 78, - 84, 128, 70, 79, 88, 128, 70, 79, 216, 70, 79, 85, 82, 84, 69, 69, 78, - 128, 70, 79, 85, 82, 84, 69, 69, 206, 70, 79, 85, 82, 45, 84, 72, 73, 82, - 84, 89, 128, 70, 79, 85, 82, 45, 83, 84, 82, 73, 78, 199, 70, 79, 85, 82, - 45, 80, 69, 82, 45, 69, 205, 70, 79, 85, 82, 45, 76, 73, 78, 197, 70, 79, - 85, 210, 70, 79, 85, 78, 84, 65, 73, 78, 128, 70, 79, 85, 78, 84, 65, 73, + 77, 197, 70, 82, 65, 75, 84, 85, 210, 70, 82, 65, 71, 82, 65, 78, 84, + 128, 70, 82, 65, 71, 77, 69, 78, 84, 128, 70, 82, 65, 67, 84, 73, 79, + 206, 70, 79, 88, 128, 70, 79, 216, 70, 79, 85, 82, 84, 69, 69, 78, 128, + 70, 79, 85, 82, 84, 69, 69, 206, 70, 79, 85, 82, 45, 84, 72, 73, 82, 84, + 89, 128, 70, 79, 85, 82, 45, 83, 84, 82, 73, 78, 199, 70, 79, 85, 82, 45, + 80, 69, 82, 45, 69, 205, 70, 79, 85, 82, 45, 76, 73, 78, 197, 70, 79, 85, + 210, 70, 79, 85, 78, 84, 65, 73, 78, 128, 70, 79, 85, 78, 84, 65, 73, 206, 70, 79, 83, 84, 69, 82, 73, 78, 71, 128, 70, 79, 82, 87, 65, 82, 68, 128, 70, 79, 82, 87, 65, 82, 196, 70, 79, 82, 84, 89, 45, 70, 73, 86, 197, 70, 79, 82, 84, 89, 128, 70, 79, 82, 84, 217, 70, 79, 82, 84, 85, @@ -4143,163 +4200,165 @@ static const unsigned char lexicon[] = { 128, 70, 79, 79, 84, 78, 79, 84, 197, 70, 79, 79, 84, 66, 65, 76, 76, 128, 70, 79, 79, 84, 128, 70, 79, 79, 76, 128, 70, 79, 79, 68, 128, 70, 79, 79, 128, 70, 79, 78, 212, 70, 79, 78, 71, 77, 65, 78, 128, 70, 79, - 77, 128, 70, 79, 76, 76, 89, 128, 70, 79, 76, 76, 79, 87, 73, 78, 71, - 128, 70, 79, 76, 68, 69, 82, 128, 70, 79, 76, 68, 69, 196, 70, 79, 71, - 71, 89, 128, 70, 79, 71, 128, 70, 207, 70, 77, 128, 70, 76, 89, 73, 78, - 199, 70, 76, 89, 128, 70, 76, 85, 84, 84, 69, 82, 73, 78, 71, 128, 70, - 76, 85, 84, 84, 69, 82, 73, 78, 199, 70, 76, 85, 84, 69, 128, 70, 76, 85, - 83, 72, 69, 196, 70, 76, 79, 87, 73, 78, 199, 70, 76, 79, 87, 69, 82, 83, - 128, 70, 76, 79, 87, 69, 210, 70, 76, 79, 85, 82, 73, 83, 72, 128, 70, - 76, 79, 82, 69, 84, 84, 69, 128, 70, 76, 79, 82, 65, 204, 70, 76, 79, 80, - 80, 217, 70, 76, 79, 79, 82, 128, 70, 76, 79, 79, 210, 70, 76, 73, 80, - 128, 70, 76, 73, 71, 72, 84, 128, 70, 76, 73, 67, 203, 70, 76, 69, 88, - 85, 83, 128, 70, 76, 69, 88, 69, 196, 70, 76, 69, 88, 128, 70, 76, 69, - 85, 82, 79, 78, 128, 70, 76, 69, 85, 82, 45, 68, 69, 45, 76, 73, 83, 128, - 70, 76, 65, 84, 84, 69, 78, 69, 196, 70, 76, 65, 84, 78, 69, 83, 83, 128, - 70, 76, 65, 84, 66, 82, 69, 65, 68, 128, 70, 76, 65, 83, 72, 128, 70, 76, - 65, 77, 73, 78, 71, 79, 128, 70, 76, 65, 77, 69, 128, 70, 76, 65, 71, 83, - 128, 70, 76, 65, 71, 45, 53, 128, 70, 76, 65, 71, 45, 52, 128, 70, 76, - 65, 71, 45, 51, 128, 70, 76, 65, 71, 45, 50, 128, 70, 76, 65, 71, 45, 49, - 128, 70, 76, 65, 71, 128, 70, 76, 65, 199, 70, 76, 65, 128, 70, 76, 128, - 70, 73, 88, 69, 68, 45, 70, 79, 82, 205, 70, 73, 88, 128, 70, 73, 86, 69, - 45, 84, 72, 73, 82, 84, 89, 128, 70, 73, 86, 69, 45, 76, 73, 78, 197, 70, - 73, 84, 90, 80, 65, 84, 82, 73, 67, 203, 70, 73, 84, 65, 128, 70, 73, 84, - 128, 70, 73, 83, 84, 69, 196, 70, 73, 83, 72, 73, 78, 199, 70, 73, 83, - 72, 72, 79, 79, 75, 128, 70, 73, 83, 72, 72, 79, 79, 203, 70, 73, 83, 72, - 69, 89, 69, 128, 70, 73, 83, 72, 128, 70, 73, 83, 200, 70, 73, 82, 83, - 212, 70, 73, 82, 73, 128, 70, 73, 82, 69, 87, 79, 82, 75, 83, 128, 70, - 73, 82, 69, 87, 79, 82, 203, 70, 73, 82, 69, 67, 82, 65, 67, 75, 69, 82, - 128, 70, 73, 82, 69, 128, 70, 73, 82, 197, 70, 73, 80, 128, 70, 73, 78, - 73, 84, 197, 70, 73, 78, 71, 69, 82, 83, 128, 70, 73, 78, 71, 69, 82, - 211, 70, 73, 78, 71, 69, 82, 78, 65, 73, 76, 83, 128, 70, 73, 78, 71, 69, - 82, 69, 196, 70, 73, 78, 71, 69, 82, 45, 80, 79, 83, 212, 70, 73, 78, 71, - 69, 82, 128, 70, 73, 78, 71, 69, 210, 70, 73, 78, 65, 78, 67, 73, 65, 76, - 128, 70, 73, 78, 65, 76, 128, 70, 73, 76, 205, 70, 73, 76, 76, 69, 82, - 45, 50, 128, 70, 73, 76, 76, 69, 82, 45, 49, 128, 70, 73, 76, 76, 69, 82, - 128, 70, 73, 76, 76, 69, 196, 70, 73, 76, 76, 128, 70, 73, 76, 204, 70, - 73, 76, 197, 70, 73, 73, 128, 70, 73, 71, 85, 82, 69, 45, 51, 128, 70, - 73, 71, 85, 82, 69, 45, 50, 128, 70, 73, 71, 85, 82, 69, 45, 49, 128, 70, - 73, 71, 85, 82, 197, 70, 73, 71, 72, 84, 128, 70, 73, 70, 84, 89, 128, - 70, 73, 70, 84, 217, 70, 73, 70, 84, 72, 83, 128, 70, 73, 70, 84, 72, - 128, 70, 73, 70, 84, 69, 69, 78, 128, 70, 73, 70, 84, 69, 69, 206, 70, - 73, 69, 76, 68, 128, 70, 73, 69, 76, 196, 70, 72, 84, 79, 82, 193, 70, - 70, 76, 128, 70, 70, 73, 128, 70, 69, 85, 88, 128, 70, 69, 85, 70, 69, - 85, 65, 69, 84, 128, 70, 69, 84, 72, 128, 70, 69, 83, 84, 73, 86, 65, 76, - 128, 70, 69, 82, 82, 89, 128, 70, 69, 82, 82, 73, 211, 70, 69, 82, 77, - 65, 84, 65, 128, 70, 69, 82, 77, 65, 84, 193, 70, 69, 79, 200, 70, 69, - 78, 199, 70, 69, 78, 67, 69, 82, 128, 70, 69, 78, 67, 69, 128, 70, 69, - 77, 73, 78, 73, 78, 197, 70, 69, 77, 65, 76, 69, 128, 70, 69, 77, 65, 76, - 197, 70, 69, 76, 76, 79, 87, 83, 72, 73, 80, 128, 70, 69, 73, 128, 70, - 69, 72, 213, 70, 69, 72, 128, 70, 69, 200, 70, 69, 69, 78, 71, 128, 70, - 69, 69, 77, 128, 70, 69, 69, 68, 128, 70, 69, 69, 196, 70, 69, 69, 128, - 70, 69, 66, 82, 85, 65, 82, 89, 128, 70, 69, 65, 84, 72, 69, 82, 128, 70, - 69, 65, 84, 72, 69, 210, 70, 69, 65, 82, 78, 128, 70, 69, 65, 82, 70, 85, - 204, 70, 69, 65, 82, 128, 70, 65, 89, 65, 78, 78, 65, 128, 70, 65, 89, - 128, 70, 65, 88, 128, 70, 65, 216, 70, 65, 84, 73, 71, 85, 69, 128, 70, - 65, 84, 72, 69, 82, 128, 70, 65, 84, 72, 69, 210, 70, 65, 84, 72, 65, 84, - 65, 78, 128, 70, 65, 84, 72, 65, 84, 65, 206, 70, 65, 84, 72, 65, 128, - 70, 65, 84, 72, 193, 70, 65, 84, 128, 70, 65, 83, 84, 128, 70, 65, 82, - 83, 201, 70, 65, 82, 128, 70, 65, 81, 128, 70, 65, 80, 128, 70, 65, 78, - 71, 128, 70, 65, 78, 69, 82, 79, 83, 73, 211, 70, 65, 78, 128, 70, 65, - 77, 73, 76, 89, 128, 70, 65, 77, 128, 70, 65, 76, 76, 69, 206, 70, 65, - 76, 65, 70, 69, 76, 128, 70, 65, 74, 128, 70, 65, 73, 82, 89, 128, 70, - 65, 73, 76, 85, 82, 69, 128, 70, 65, 73, 72, 85, 128, 70, 65, 73, 66, - 128, 70, 65, 72, 82, 69, 78, 72, 69, 73, 84, 128, 70, 65, 67, 84, 79, 82, - 89, 128, 70, 65, 67, 84, 79, 210, 70, 65, 67, 83, 73, 77, 73, 76, 197, - 70, 65, 67, 73, 78, 71, 83, 128, 70, 65, 67, 69, 45, 54, 128, 70, 65, 67, - 69, 45, 53, 128, 70, 65, 67, 69, 45, 52, 128, 70, 65, 67, 69, 45, 51, - 128, 70, 65, 67, 69, 45, 50, 128, 70, 65, 67, 69, 45, 49, 128, 70, 65, - 65, 77, 65, 69, 128, 70, 65, 65, 73, 128, 70, 65, 65, 70, 85, 128, 70, - 48, 53, 51, 128, 70, 48, 53, 50, 128, 70, 48, 53, 49, 67, 128, 70, 48, - 53, 49, 66, 128, 70, 48, 53, 49, 65, 128, 70, 48, 53, 49, 128, 70, 48, - 53, 48, 128, 70, 48, 52, 57, 128, 70, 48, 52, 56, 128, 70, 48, 52, 55, - 65, 128, 70, 48, 52, 55, 128, 70, 48, 52, 54, 65, 128, 70, 48, 52, 54, - 128, 70, 48, 52, 53, 65, 128, 70, 48, 52, 53, 128, 70, 48, 52, 52, 128, - 70, 48, 52, 51, 128, 70, 48, 52, 50, 128, 70, 48, 52, 49, 128, 70, 48, - 52, 48, 128, 70, 48, 51, 57, 128, 70, 48, 51, 56, 65, 128, 70, 48, 51, - 56, 128, 70, 48, 51, 55, 65, 128, 70, 48, 51, 55, 128, 70, 48, 51, 54, - 128, 70, 48, 51, 53, 128, 70, 48, 51, 52, 128, 70, 48, 51, 51, 128, 70, - 48, 51, 50, 128, 70, 48, 51, 49, 65, 128, 70, 48, 51, 49, 128, 70, 48, - 51, 48, 128, 70, 48, 50, 57, 128, 70, 48, 50, 56, 128, 70, 48, 50, 55, - 128, 70, 48, 50, 54, 128, 70, 48, 50, 53, 128, 70, 48, 50, 52, 128, 70, - 48, 50, 51, 128, 70, 48, 50, 50, 128, 70, 48, 50, 49, 65, 128, 70, 48, - 50, 49, 128, 70, 48, 50, 48, 128, 70, 48, 49, 57, 128, 70, 48, 49, 56, - 128, 70, 48, 49, 55, 128, 70, 48, 49, 54, 128, 70, 48, 49, 53, 128, 70, - 48, 49, 52, 128, 70, 48, 49, 51, 65, 128, 70, 48, 49, 51, 128, 70, 48, - 49, 50, 128, 70, 48, 49, 49, 128, 70, 48, 49, 48, 128, 70, 48, 48, 57, - 128, 70, 48, 48, 56, 128, 70, 48, 48, 55, 128, 70, 48, 48, 54, 128, 70, - 48, 48, 53, 128, 70, 48, 48, 52, 128, 70, 48, 48, 51, 128, 70, 48, 48, - 50, 128, 70, 48, 48, 49, 65, 128, 70, 48, 48, 49, 128, 69, 90, 83, 128, - 69, 90, 200, 69, 90, 69, 78, 128, 69, 90, 69, 206, 69, 90, 128, 69, 89, - 89, 89, 128, 69, 89, 69, 83, 128, 69, 89, 69, 211, 69, 89, 69, 76, 65, - 83, 72, 69, 211, 69, 89, 69, 71, 76, 65, 83, 83, 69, 83, 128, 69, 89, 69, - 71, 65, 90, 69, 45, 87, 65, 76, 76, 80, 76, 65, 78, 197, 69, 89, 69, 71, - 65, 90, 69, 45, 70, 76, 79, 79, 82, 80, 76, 65, 78, 197, 69, 89, 69, 66, - 82, 79, 87, 211, 69, 89, 69, 66, 82, 79, 215, 69, 89, 197, 69, 89, 66, - 69, 89, 70, 73, 76, 73, 128, 69, 89, 65, 78, 78, 65, 128, 69, 88, 84, 82, - 69, 77, 69, 76, 217, 69, 88, 84, 82, 65, 84, 69, 82, 82, 69, 83, 84, 82, - 73, 65, 204, 69, 88, 84, 82, 65, 45, 76, 79, 215, 69, 88, 84, 82, 65, 45, - 72, 73, 71, 200, 69, 88, 84, 82, 193, 69, 88, 84, 73, 78, 71, 85, 73, 83, - 72, 69, 82, 128, 69, 88, 84, 69, 78, 83, 73, 79, 78, 128, 69, 88, 84, 69, - 78, 68, 69, 68, 128, 69, 88, 84, 69, 78, 68, 69, 196, 69, 88, 80, 82, 69, - 83, 83, 73, 79, 78, 76, 69, 83, 211, 69, 88, 80, 79, 78, 69, 78, 212, 69, - 88, 80, 76, 79, 68, 73, 78, 199, 69, 88, 79, 128, 69, 88, 207, 69, 88, - 73, 83, 84, 83, 128, 69, 88, 73, 83, 84, 128, 69, 88, 72, 65, 85, 83, 84, - 73, 79, 78, 128, 69, 88, 72, 65, 76, 69, 128, 69, 88, 67, 76, 65, 77, 65, - 84, 73, 79, 78, 128, 69, 88, 67, 76, 65, 77, 65, 84, 73, 79, 206, 69, 88, - 67, 73, 84, 69, 77, 69, 78, 84, 128, 69, 88, 67, 72, 65, 78, 71, 69, 128, - 69, 88, 67, 69, 83, 83, 128, 69, 88, 67, 69, 76, 76, 69, 78, 84, 128, 69, - 87, 69, 128, 69, 86, 69, 82, 217, 69, 86, 69, 82, 71, 82, 69, 69, 206, - 69, 86, 69, 78, 73, 78, 71, 128, 69, 85, 82, 79, 80, 69, 65, 206, 69, 85, - 82, 79, 80, 69, 45, 65, 70, 82, 73, 67, 65, 128, 69, 85, 82, 79, 45, 67, - 85, 82, 82, 69, 78, 67, 217, 69, 85, 82, 207, 69, 85, 76, 69, 210, 69, - 85, 45, 85, 128, 69, 85, 45, 79, 128, 69, 85, 45, 69, 85, 128, 69, 85, - 45, 69, 79, 128, 69, 85, 45, 69, 128, 69, 85, 45, 65, 128, 69, 84, 88, - 128, 69, 84, 78, 65, 72, 84, 65, 128, 69, 84, 72, 69, 204, 69, 84, 69, - 82, 79, 206, 69, 84, 69, 82, 78, 73, 84, 89, 128, 69, 84, 69, 82, 78, 73, - 84, 217, 69, 84, 66, 128, 69, 83, 90, 128, 69, 83, 85, 75, 85, 85, 68, - 79, 128, 69, 83, 84, 73, 77, 65, 84, 69, 83, 128, 69, 83, 84, 73, 77, 65, - 84, 69, 196, 69, 83, 72, 69, 51, 128, 69, 83, 72, 50, 49, 128, 69, 83, - 72, 49, 54, 128, 69, 83, 67, 65, 80, 69, 128, 69, 83, 67, 128, 69, 83, - 65, 128, 69, 83, 45, 84, 69, 128, 69, 83, 45, 51, 128, 69, 83, 45, 50, - 128, 69, 83, 45, 49, 128, 69, 82, 82, 79, 82, 45, 66, 65, 82, 82, 69, - 196, 69, 82, 82, 128, 69, 82, 73, 211, 69, 82, 73, 78, 50, 128, 69, 82, - 73, 78, 178, 69, 82, 71, 128, 69, 82, 65, 83, 197, 69, 81, 85, 73, 86, - 65, 76, 69, 78, 212, 69, 81, 85, 73, 76, 65, 84, 69, 82, 65, 204, 69, 81, - 85, 73, 72, 79, 80, 80, 69, 82, 128, 69, 81, 85, 73, 72, 79, 80, 80, 69, - 210, 69, 81, 85, 73, 68, 128, 69, 81, 85, 73, 65, 78, 71, 85, 76, 65, - 210, 69, 81, 85, 65, 76, 83, 128, 69, 81, 85, 65, 76, 211, 69, 81, 85, - 65, 76, 128, 69, 80, 83, 73, 76, 79, 78, 128, 69, 80, 83, 73, 76, 79, - 206, 69, 80, 79, 67, 72, 128, 69, 80, 73, 71, 82, 65, 80, 72, 73, 195, - 69, 80, 73, 68, 65, 85, 82, 69, 65, 206, 69, 80, 69, 78, 84, 72, 69, 84, - 73, 195, 69, 80, 69, 71, 69, 82, 77, 65, 128, 69, 80, 65, 67, 212, 69, - 79, 84, 128, 69, 79, 77, 128, 69, 79, 76, 72, 88, 128, 69, 79, 76, 128, - 69, 79, 72, 128, 69, 78, 89, 128, 69, 78, 86, 69, 76, 79, 80, 69, 128, - 69, 78, 86, 69, 76, 79, 80, 197, 69, 78, 85, 77, 69, 82, 65, 84, 73, 79, - 206, 69, 78, 84, 82, 89, 45, 50, 128, 69, 78, 84, 82, 89, 45, 49, 128, - 69, 78, 84, 82, 89, 128, 69, 78, 84, 82, 217, 69, 78, 84, 72, 85, 83, 73, - 65, 83, 77, 128, 69, 78, 84, 69, 82, 80, 82, 73, 83, 69, 128, 69, 78, 84, - 69, 82, 73, 78, 199, 69, 78, 84, 69, 82, 128, 69, 78, 84, 69, 210, 69, - 78, 84, 45, 83, 72, 65, 80, 69, 196, 69, 78, 81, 85, 73, 82, 89, 128, 69, - 78, 81, 128, 69, 78, 79, 211, 69, 78, 78, 73, 128, 69, 78, 78, 128, 69, - 78, 76, 65, 82, 71, 69, 77, 69, 78, 84, 128, 69, 78, 71, 73, 78, 69, 128, - 69, 78, 68, 79, 70, 79, 78, 79, 78, 128, 69, 78, 68, 73, 78, 199, 69, 78, - 68, 69, 80, 128, 69, 78, 68, 69, 65, 86, 79, 85, 82, 128, 69, 78, 67, 79, - 85, 78, 84, 69, 82, 83, 128, 69, 78, 67, 76, 79, 83, 85, 82, 69, 83, 128, - 69, 78, 67, 76, 79, 83, 85, 82, 69, 128, 69, 78, 67, 76, 79, 83, 73, 78, - 199, 69, 78, 67, 128, 69, 78, 65, 82, 88, 73, 211, 69, 78, 65, 82, 77, - 79, 78, 73, 79, 211, 69, 77, 80, 84, 217, 69, 77, 80, 72, 65, 84, 73, - 195, 69, 77, 80, 72, 65, 83, 73, 211, 69, 77, 79, 74, 201, 69, 77, 66, - 82, 79, 73, 68, 69, 82, 89, 128, 69, 77, 66, 76, 69, 77, 128, 69, 77, 66, - 69, 76, 76, 73, 83, 72, 77, 69, 78, 84, 128, 69, 77, 66, 69, 68, 68, 73, - 78, 71, 128, 69, 76, 89, 77, 65, 73, 195, 69, 76, 89, 128, 69, 76, 84, - 128, 69, 76, 76, 73, 80, 84, 73, 195, 69, 76, 76, 73, 80, 83, 73, 83, - 128, 69, 76, 76, 73, 80, 83, 69, 128, 69, 76, 73, 70, 73, 128, 69, 76, - 69, 86, 69, 78, 45, 84, 72, 73, 82, 84, 89, 128, 69, 76, 69, 86, 69, 78, - 128, 69, 76, 69, 86, 69, 206, 69, 76, 69, 86, 65, 84, 85, 211, 69, 76, - 69, 80, 72, 65, 78, 84, 128, 69, 76, 69, 77, 69, 78, 212, 69, 76, 69, 67, - 84, 82, 73, 67, 65, 204, 69, 76, 69, 67, 84, 82, 73, 195, 69, 76, 66, 65, - 83, 65, 206, 69, 76, 65, 77, 73, 84, 69, 128, 69, 76, 65, 77, 73, 84, + 78, 68, 85, 69, 128, 70, 79, 77, 128, 70, 79, 76, 76, 89, 128, 70, 79, + 76, 76, 79, 87, 73, 78, 71, 128, 70, 79, 76, 68, 69, 82, 128, 70, 79, 76, + 68, 69, 196, 70, 79, 71, 71, 89, 128, 70, 79, 71, 128, 70, 207, 70, 77, + 128, 70, 76, 89, 73, 78, 199, 70, 76, 89, 128, 70, 76, 85, 84, 84, 69, + 82, 73, 78, 71, 128, 70, 76, 85, 84, 84, 69, 82, 73, 78, 199, 70, 76, 85, + 84, 69, 128, 70, 76, 85, 83, 72, 69, 196, 70, 76, 79, 87, 73, 78, 199, + 70, 76, 79, 87, 69, 82, 83, 128, 70, 76, 79, 87, 69, 210, 70, 76, 79, 85, + 82, 73, 83, 72, 128, 70, 76, 79, 82, 69, 84, 84, 69, 128, 70, 76, 79, 82, + 65, 204, 70, 76, 79, 80, 80, 217, 70, 76, 79, 79, 82, 128, 70, 76, 79, + 79, 210, 70, 76, 73, 80, 128, 70, 76, 73, 71, 72, 84, 128, 70, 76, 73, + 67, 203, 70, 76, 69, 88, 85, 83, 128, 70, 76, 69, 88, 69, 196, 70, 76, + 69, 88, 128, 70, 76, 69, 85, 82, 79, 78, 128, 70, 76, 69, 85, 82, 45, 68, + 69, 45, 76, 73, 83, 128, 70, 76, 65, 84, 84, 69, 78, 69, 196, 70, 76, 65, + 84, 78, 69, 83, 83, 128, 70, 76, 65, 84, 66, 82, 69, 65, 68, 128, 70, 76, + 65, 83, 72, 128, 70, 76, 65, 77, 73, 78, 71, 79, 128, 70, 76, 65, 77, 69, + 128, 70, 76, 65, 71, 83, 128, 70, 76, 65, 71, 45, 53, 128, 70, 76, 65, + 71, 45, 52, 128, 70, 76, 65, 71, 45, 51, 128, 70, 76, 65, 71, 45, 50, + 128, 70, 76, 65, 71, 45, 49, 128, 70, 76, 65, 71, 128, 70, 76, 65, 199, + 70, 76, 65, 128, 70, 76, 128, 70, 73, 88, 69, 68, 45, 70, 79, 82, 205, + 70, 73, 88, 128, 70, 73, 86, 69, 45, 84, 72, 73, 82, 84, 89, 128, 70, 73, + 86, 69, 45, 76, 73, 78, 197, 70, 73, 84, 90, 80, 65, 84, 82, 73, 67, 203, + 70, 73, 84, 65, 128, 70, 73, 84, 128, 70, 73, 83, 84, 69, 196, 70, 73, + 83, 72, 73, 78, 199, 70, 73, 83, 72, 72, 79, 79, 75, 128, 70, 73, 83, 72, + 72, 79, 79, 203, 70, 73, 83, 72, 69, 89, 69, 128, 70, 73, 83, 72, 128, + 70, 73, 83, 200, 70, 73, 82, 83, 212, 70, 73, 82, 73, 128, 70, 73, 82, + 69, 87, 79, 82, 75, 83, 128, 70, 73, 82, 69, 87, 79, 82, 203, 70, 73, 82, + 69, 67, 82, 65, 67, 75, 69, 82, 128, 70, 73, 82, 69, 128, 70, 73, 82, + 197, 70, 73, 80, 128, 70, 73, 78, 73, 84, 197, 70, 73, 78, 71, 69, 82, + 83, 128, 70, 73, 78, 71, 69, 82, 211, 70, 73, 78, 71, 69, 82, 78, 65, 73, + 76, 83, 128, 70, 73, 78, 71, 69, 82, 69, 196, 70, 73, 78, 71, 69, 82, 45, + 80, 79, 83, 212, 70, 73, 78, 71, 69, 82, 128, 70, 73, 78, 71, 69, 210, + 70, 73, 78, 65, 78, 67, 73, 65, 76, 128, 70, 73, 78, 65, 76, 128, 70, 73, + 76, 205, 70, 73, 76, 76, 69, 82, 45, 50, 128, 70, 73, 76, 76, 69, 82, 45, + 49, 128, 70, 73, 76, 76, 69, 82, 128, 70, 73, 76, 76, 69, 196, 70, 73, + 76, 76, 128, 70, 73, 76, 204, 70, 73, 76, 197, 70, 73, 73, 128, 70, 73, + 71, 85, 82, 69, 45, 51, 128, 70, 73, 71, 85, 82, 69, 45, 50, 128, 70, 73, + 71, 85, 82, 69, 45, 49, 128, 70, 73, 71, 85, 82, 69, 128, 70, 73, 71, 85, + 82, 197, 70, 73, 71, 72, 84, 128, 70, 73, 70, 84, 89, 128, 70, 73, 70, + 84, 217, 70, 73, 70, 84, 72, 83, 128, 70, 73, 70, 84, 72, 128, 70, 73, + 70, 84, 69, 69, 78, 128, 70, 73, 70, 84, 69, 69, 206, 70, 73, 69, 76, 68, + 128, 70, 73, 69, 76, 196, 70, 72, 84, 79, 82, 193, 70, 70, 76, 128, 70, + 70, 73, 128, 70, 69, 85, 88, 128, 70, 69, 85, 70, 69, 85, 65, 69, 84, + 128, 70, 69, 84, 72, 128, 70, 69, 83, 84, 73, 86, 65, 76, 128, 70, 69, + 82, 82, 89, 128, 70, 69, 82, 82, 73, 211, 70, 69, 82, 77, 65, 84, 65, + 128, 70, 69, 82, 77, 65, 84, 193, 70, 69, 79, 200, 70, 69, 78, 199, 70, + 69, 78, 67, 69, 82, 128, 70, 69, 78, 67, 69, 128, 70, 69, 77, 73, 78, 73, + 78, 197, 70, 69, 77, 65, 76, 69, 128, 70, 69, 77, 65, 76, 197, 70, 69, + 76, 76, 79, 87, 83, 72, 73, 80, 128, 70, 69, 73, 128, 70, 69, 72, 213, + 70, 69, 72, 128, 70, 69, 200, 70, 69, 69, 78, 71, 128, 70, 69, 69, 77, + 128, 70, 69, 69, 68, 128, 70, 69, 69, 196, 70, 69, 69, 128, 70, 69, 66, + 82, 85, 65, 82, 89, 128, 70, 69, 65, 84, 72, 69, 82, 128, 70, 69, 65, 84, + 72, 69, 210, 70, 69, 65, 82, 78, 128, 70, 69, 65, 82, 70, 85, 204, 70, + 69, 65, 82, 128, 70, 65, 89, 65, 78, 78, 65, 128, 70, 65, 89, 128, 70, + 65, 88, 128, 70, 65, 216, 70, 65, 84, 73, 71, 85, 69, 128, 70, 65, 84, + 72, 69, 82, 128, 70, 65, 84, 72, 69, 210, 70, 65, 84, 72, 65, 84, 65, 78, + 128, 70, 65, 84, 72, 65, 84, 65, 206, 70, 65, 84, 72, 65, 128, 70, 65, + 84, 72, 193, 70, 65, 84, 128, 70, 65, 83, 84, 128, 70, 65, 82, 83, 201, + 70, 65, 82, 128, 70, 65, 81, 128, 70, 65, 80, 128, 70, 65, 78, 71, 128, + 70, 65, 78, 69, 82, 79, 83, 73, 211, 70, 65, 78, 128, 70, 65, 77, 73, 76, + 89, 128, 70, 65, 77, 128, 70, 65, 76, 76, 69, 206, 70, 65, 76, 65, 70, + 69, 76, 128, 70, 65, 74, 128, 70, 65, 73, 82, 89, 128, 70, 65, 73, 76, + 85, 82, 69, 128, 70, 65, 73, 72, 85, 128, 70, 65, 73, 66, 128, 70, 65, + 72, 82, 69, 78, 72, 69, 73, 84, 128, 70, 65, 67, 84, 79, 82, 89, 128, 70, + 65, 67, 84, 79, 210, 70, 65, 67, 83, 73, 77, 73, 76, 197, 70, 65, 67, 73, + 78, 71, 83, 128, 70, 65, 67, 69, 45, 54, 128, 70, 65, 67, 69, 45, 53, + 128, 70, 65, 67, 69, 45, 52, 128, 70, 65, 67, 69, 45, 51, 128, 70, 65, + 67, 69, 45, 50, 128, 70, 65, 67, 69, 45, 49, 128, 70, 65, 65, 77, 65, 69, + 128, 70, 65, 65, 73, 128, 70, 65, 65, 70, 85, 128, 70, 48, 53, 51, 128, + 70, 48, 53, 50, 128, 70, 48, 53, 49, 67, 128, 70, 48, 53, 49, 66, 128, + 70, 48, 53, 49, 65, 128, 70, 48, 53, 49, 128, 70, 48, 53, 48, 128, 70, + 48, 52, 57, 128, 70, 48, 52, 56, 128, 70, 48, 52, 55, 65, 128, 70, 48, + 52, 55, 128, 70, 48, 52, 54, 65, 128, 70, 48, 52, 54, 128, 70, 48, 52, + 53, 65, 128, 70, 48, 52, 53, 128, 70, 48, 52, 52, 128, 70, 48, 52, 51, + 128, 70, 48, 52, 50, 128, 70, 48, 52, 49, 128, 70, 48, 52, 48, 128, 70, + 48, 51, 57, 128, 70, 48, 51, 56, 65, 128, 70, 48, 51, 56, 128, 70, 48, + 51, 55, 65, 128, 70, 48, 51, 55, 128, 70, 48, 51, 54, 128, 70, 48, 51, + 53, 128, 70, 48, 51, 52, 128, 70, 48, 51, 51, 128, 70, 48, 51, 50, 128, + 70, 48, 51, 49, 65, 128, 70, 48, 51, 49, 128, 70, 48, 51, 48, 128, 70, + 48, 50, 57, 128, 70, 48, 50, 56, 128, 70, 48, 50, 55, 128, 70, 48, 50, + 54, 128, 70, 48, 50, 53, 128, 70, 48, 50, 52, 128, 70, 48, 50, 51, 128, + 70, 48, 50, 50, 128, 70, 48, 50, 49, 65, 128, 70, 48, 50, 49, 128, 70, + 48, 50, 48, 128, 70, 48, 49, 57, 128, 70, 48, 49, 56, 128, 70, 48, 49, + 55, 128, 70, 48, 49, 54, 128, 70, 48, 49, 53, 128, 70, 48, 49, 52, 128, + 70, 48, 49, 51, 65, 128, 70, 48, 49, 51, 128, 70, 48, 49, 50, 128, 70, + 48, 49, 49, 128, 70, 48, 49, 48, 128, 70, 48, 48, 57, 128, 70, 48, 48, + 56, 128, 70, 48, 48, 55, 128, 70, 48, 48, 54, 128, 70, 48, 48, 53, 128, + 70, 48, 48, 52, 128, 70, 48, 48, 51, 128, 70, 48, 48, 50, 128, 70, 48, + 48, 49, 65, 128, 70, 48, 48, 49, 128, 69, 90, 83, 128, 69, 90, 200, 69, + 90, 69, 78, 128, 69, 90, 69, 206, 69, 90, 128, 69, 89, 89, 89, 128, 69, + 89, 69, 83, 128, 69, 89, 69, 211, 69, 89, 69, 76, 65, 83, 72, 69, 211, + 69, 89, 69, 71, 76, 65, 83, 83, 69, 83, 128, 69, 89, 69, 71, 65, 90, 69, + 45, 87, 65, 76, 76, 80, 76, 65, 78, 197, 69, 89, 69, 71, 65, 90, 69, 45, + 70, 76, 79, 79, 82, 80, 76, 65, 78, 197, 69, 89, 69, 66, 82, 79, 87, 211, + 69, 89, 69, 66, 82, 79, 215, 69, 89, 197, 69, 89, 66, 69, 89, 70, 73, 76, + 73, 128, 69, 89, 65, 78, 78, 65, 128, 69, 88, 84, 82, 69, 77, 69, 76, + 217, 69, 88, 84, 82, 65, 84, 69, 82, 82, 69, 83, 84, 82, 73, 65, 204, 69, + 88, 84, 82, 65, 45, 76, 79, 215, 69, 88, 84, 82, 65, 45, 72, 73, 71, 200, + 69, 88, 84, 82, 193, 69, 88, 84, 73, 78, 71, 85, 73, 83, 72, 69, 82, 128, + 69, 88, 84, 69, 78, 83, 73, 79, 78, 128, 69, 88, 84, 69, 78, 68, 69, 68, + 128, 69, 88, 84, 69, 78, 68, 69, 196, 69, 88, 80, 82, 69, 83, 83, 73, 79, + 78, 76, 69, 83, 211, 69, 88, 80, 79, 78, 69, 78, 212, 69, 88, 80, 76, 79, + 68, 73, 78, 199, 69, 88, 79, 128, 69, 88, 207, 69, 88, 73, 83, 84, 83, + 128, 69, 88, 73, 83, 84, 128, 69, 88, 72, 65, 85, 83, 84, 73, 79, 78, + 128, 69, 88, 72, 65, 76, 69, 128, 69, 88, 67, 76, 65, 77, 65, 84, 73, 79, + 78, 128, 69, 88, 67, 76, 65, 77, 65, 84, 73, 79, 206, 69, 88, 67, 73, 84, + 69, 77, 69, 78, 84, 128, 69, 88, 67, 72, 65, 78, 71, 69, 128, 69, 88, 67, + 69, 83, 83, 128, 69, 88, 67, 69, 76, 76, 69, 78, 84, 128, 69, 87, 69, + 128, 69, 86, 69, 82, 217, 69, 86, 69, 82, 71, 82, 69, 69, 206, 69, 86, + 69, 78, 73, 78, 71, 128, 69, 85, 82, 79, 80, 69, 65, 206, 69, 85, 82, 79, + 80, 69, 45, 65, 70, 82, 73, 67, 65, 128, 69, 85, 82, 79, 45, 67, 85, 82, + 82, 69, 78, 67, 217, 69, 85, 82, 207, 69, 85, 76, 69, 210, 69, 85, 45, + 85, 128, 69, 85, 45, 79, 128, 69, 85, 45, 69, 85, 128, 69, 85, 45, 69, + 79, 128, 69, 85, 45, 69, 128, 69, 85, 45, 65, 128, 69, 84, 88, 128, 69, + 84, 78, 65, 72, 84, 65, 128, 69, 84, 72, 69, 204, 69, 84, 69, 82, 79, + 206, 69, 84, 69, 82, 78, 73, 84, 89, 128, 69, 84, 69, 82, 78, 73, 84, + 217, 69, 84, 66, 128, 69, 83, 90, 128, 69, 83, 85, 75, 85, 85, 68, 79, + 128, 69, 83, 84, 73, 77, 65, 84, 69, 83, 128, 69, 83, 84, 73, 77, 65, 84, + 69, 196, 69, 83, 72, 69, 51, 128, 69, 83, 72, 50, 49, 128, 69, 83, 72, + 49, 54, 128, 69, 83, 67, 65, 80, 69, 128, 69, 83, 67, 128, 69, 83, 65, + 128, 69, 83, 45, 84, 69, 128, 69, 83, 45, 51, 128, 69, 83, 45, 50, 128, + 69, 83, 45, 49, 128, 69, 82, 82, 79, 82, 45, 66, 65, 82, 82, 69, 196, 69, + 82, 82, 128, 69, 82, 73, 211, 69, 82, 73, 78, 50, 128, 69, 82, 73, 78, + 178, 69, 82, 71, 128, 69, 82, 65, 83, 197, 69, 81, 85, 73, 86, 65, 76, + 69, 78, 212, 69, 81, 85, 73, 76, 65, 84, 69, 82, 65, 204, 69, 81, 85, 73, + 72, 79, 80, 80, 69, 82, 128, 69, 81, 85, 73, 72, 79, 80, 80, 69, 210, 69, + 81, 85, 73, 68, 128, 69, 81, 85, 73, 65, 78, 71, 85, 76, 65, 210, 69, 81, + 85, 65, 76, 83, 128, 69, 81, 85, 65, 76, 211, 69, 81, 85, 65, 76, 128, + 69, 80, 83, 73, 76, 79, 78, 128, 69, 80, 83, 73, 76, 79, 206, 69, 80, 79, + 67, 72, 128, 69, 80, 73, 71, 82, 65, 80, 72, 73, 195, 69, 80, 73, 68, 65, + 85, 82, 69, 65, 206, 69, 80, 69, 78, 84, 72, 69, 84, 73, 195, 69, 80, 69, + 71, 69, 82, 77, 65, 128, 69, 80, 65, 67, 212, 69, 79, 84, 128, 69, 79, + 77, 128, 69, 79, 76, 72, 88, 128, 69, 79, 76, 128, 69, 79, 72, 128, 69, + 78, 89, 128, 69, 78, 86, 69, 76, 79, 80, 69, 128, 69, 78, 86, 69, 76, 79, + 80, 197, 69, 78, 85, 77, 69, 82, 65, 84, 73, 79, 206, 69, 78, 84, 82, 89, + 45, 50, 128, 69, 78, 84, 82, 89, 45, 49, 128, 69, 78, 84, 82, 89, 128, + 69, 78, 84, 82, 217, 69, 78, 84, 72, 85, 83, 73, 65, 83, 77, 128, 69, 78, + 84, 69, 82, 80, 82, 73, 83, 69, 128, 69, 78, 84, 69, 82, 73, 78, 199, 69, + 78, 84, 69, 82, 128, 69, 78, 84, 69, 210, 69, 78, 84, 45, 83, 72, 65, 80, + 69, 196, 69, 78, 81, 85, 73, 82, 89, 128, 69, 78, 81, 128, 69, 78, 79, + 211, 69, 78, 78, 73, 128, 69, 78, 78, 128, 69, 78, 76, 65, 82, 71, 69, + 77, 69, 78, 84, 128, 69, 78, 71, 73, 78, 69, 128, 69, 78, 68, 79, 70, 79, + 78, 79, 78, 128, 69, 78, 68, 73, 78, 199, 69, 78, 68, 69, 80, 128, 69, + 78, 68, 69, 65, 86, 79, 85, 82, 128, 69, 78, 67, 79, 85, 78, 84, 69, 82, + 83, 128, 69, 78, 67, 76, 79, 83, 85, 82, 69, 83, 128, 69, 78, 67, 76, 79, + 83, 85, 82, 69, 128, 69, 78, 67, 76, 79, 83, 73, 78, 199, 69, 78, 67, + 128, 69, 78, 65, 82, 88, 73, 211, 69, 78, 65, 82, 77, 79, 78, 73, 79, + 211, 69, 77, 80, 84, 217, 69, 77, 80, 72, 65, 84, 73, 195, 69, 77, 80, + 72, 65, 83, 73, 211, 69, 77, 79, 74, 201, 69, 77, 66, 82, 79, 73, 68, 69, + 82, 89, 128, 69, 77, 66, 76, 69, 77, 128, 69, 77, 66, 69, 76, 76, 73, 83, + 72, 77, 69, 78, 84, 128, 69, 77, 66, 69, 68, 68, 73, 78, 71, 128, 69, 76, + 89, 77, 65, 73, 195, 69, 76, 89, 128, 69, 76, 84, 128, 69, 76, 76, 73, + 80, 84, 73, 195, 69, 76, 76, 73, 80, 83, 73, 83, 128, 69, 76, 76, 73, 80, + 83, 69, 128, 69, 76, 73, 70, 73, 128, 69, 76, 73, 70, 128, 69, 76, 69, + 86, 69, 78, 45, 84, 72, 73, 82, 84, 89, 128, 69, 76, 69, 86, 69, 78, 128, + 69, 76, 69, 86, 69, 206, 69, 76, 69, 86, 65, 84, 85, 211, 69, 76, 69, 86, + 65, 84, 79, 82, 128, 69, 76, 69, 80, 72, 65, 78, 84, 128, 69, 76, 69, 77, + 69, 78, 212, 69, 76, 69, 67, 84, 82, 79, 78, 73, 67, 83, 128, 69, 76, 69, + 67, 84, 82, 73, 67, 65, 204, 69, 76, 69, 67, 84, 82, 73, 195, 69, 76, 66, + 65, 83, 65, 206, 69, 76, 65, 77, 73, 84, 69, 128, 69, 76, 65, 77, 73, 84, 197, 69, 76, 65, 70, 82, 79, 78, 128, 69, 75, 83, 84, 82, 69, 80, 84, 79, 78, 128, 69, 75, 83, 128, 69, 75, 70, 79, 78, 73, 84, 73, 75, 79, 78, 128, 69, 75, 65, 82, 65, 128, 69, 75, 65, 77, 128, 69, 74, 69, 67, 212, @@ -4518,26 +4577,27 @@ static const unsigned char lexicon[] = { 83, 128, 68, 79, 76, 76, 65, 210, 68, 79, 76, 73, 85, 77, 128, 68, 79, 75, 77, 65, 73, 128, 68, 79, 73, 84, 128, 68, 79, 73, 78, 199, 68, 79, 73, 128, 68, 79, 71, 82, 193, 68, 79, 71, 128, 68, 79, 199, 68, 79, 69, - 211, 68, 79, 68, 69, 75, 65, 84, 65, 128, 68, 79, 67, 85, 77, 69, 78, 84, - 128, 68, 79, 67, 85, 77, 69, 78, 212, 68, 79, 66, 82, 79, 128, 68, 79, - 65, 67, 72, 65, 83, 72, 77, 69, 69, 128, 68, 79, 65, 67, 72, 65, 83, 72, - 77, 69, 197, 68, 79, 65, 128, 68, 79, 45, 79, 128, 68, 78, 193, 68, 77, - 128, 68, 205, 68, 76, 85, 128, 68, 76, 79, 128, 68, 76, 73, 128, 68, 76, - 72, 89, 65, 128, 68, 76, 72, 65, 128, 68, 76, 69, 69, 128, 68, 76, 65, - 128, 68, 76, 128, 68, 75, 65, 82, 128, 68, 75, 65, 210, 68, 74, 69, 82, - 86, 73, 128, 68, 74, 69, 82, 86, 128, 68, 74, 69, 128, 68, 74, 65, 128, - 68, 73, 90, 90, 217, 68, 73, 89, 193, 68, 73, 86, 79, 82, 67, 197, 68, - 73, 86, 73, 83, 73, 79, 78, 128, 68, 73, 86, 73, 83, 73, 79, 206, 68, 73, - 86, 73, 78, 199, 68, 73, 86, 73, 78, 65, 84, 73, 79, 78, 128, 68, 73, 86, - 73, 68, 69, 83, 128, 68, 73, 86, 73, 68, 69, 82, 83, 128, 68, 73, 86, 73, - 68, 69, 82, 128, 68, 73, 86, 73, 68, 69, 196, 68, 73, 86, 73, 68, 69, - 128, 68, 73, 86, 73, 68, 197, 68, 73, 86, 69, 82, 71, 69, 78, 67, 69, - 128, 68, 73, 84, 84, 207, 68, 73, 83, 84, 79, 82, 84, 73, 79, 78, 128, - 68, 73, 83, 84, 73, 78, 71, 85, 73, 83, 72, 128, 68, 73, 83, 84, 73, 76, - 76, 128, 68, 73, 83, 83, 79, 76, 86, 69, 45, 50, 128, 68, 73, 83, 83, 79, - 76, 86, 69, 128, 68, 73, 83, 80, 85, 84, 69, 196, 68, 73, 83, 80, 69, 82, - 83, 73, 79, 78, 128, 68, 73, 83, 75, 128, 68, 73, 83, 73, 77, 79, 85, - 128, 68, 73, 83, 72, 128, 68, 73, 83, 67, 79, 78, 84, 73, 78, 85, 79, 85, + 211, 68, 79, 68, 79, 128, 68, 79, 68, 69, 75, 65, 84, 65, 128, 68, 79, + 67, 85, 77, 69, 78, 84, 128, 68, 79, 67, 85, 77, 69, 78, 212, 68, 79, 66, + 82, 79, 128, 68, 79, 65, 67, 72, 65, 83, 72, 77, 69, 69, 128, 68, 79, 65, + 67, 72, 65, 83, 72, 77, 69, 197, 68, 79, 65, 128, 68, 79, 45, 79, 128, + 68, 78, 193, 68, 77, 128, 68, 205, 68, 76, 85, 128, 68, 76, 79, 128, 68, + 76, 73, 128, 68, 76, 72, 89, 65, 128, 68, 76, 72, 65, 128, 68, 76, 69, + 69, 128, 68, 76, 65, 128, 68, 76, 128, 68, 75, 65, 82, 128, 68, 75, 65, + 210, 68, 74, 69, 82, 86, 73, 128, 68, 74, 69, 82, 86, 128, 68, 74, 69, + 128, 68, 74, 65, 128, 68, 73, 90, 90, 217, 68, 73, 89, 193, 68, 73, 86, + 79, 82, 67, 197, 68, 73, 86, 73, 83, 73, 79, 78, 128, 68, 73, 86, 73, 83, + 73, 79, 206, 68, 73, 86, 73, 78, 199, 68, 73, 86, 73, 78, 65, 84, 73, 79, + 78, 128, 68, 73, 86, 73, 68, 69, 83, 128, 68, 73, 86, 73, 68, 69, 82, 83, + 128, 68, 73, 86, 73, 68, 69, 82, 128, 68, 73, 86, 73, 68, 69, 196, 68, + 73, 86, 73, 68, 69, 128, 68, 73, 86, 73, 68, 197, 68, 73, 86, 69, 211, + 68, 73, 86, 69, 82, 71, 69, 78, 67, 69, 128, 68, 73, 84, 84, 207, 68, 73, + 83, 84, 79, 82, 84, 73, 79, 78, 128, 68, 73, 83, 84, 73, 78, 71, 85, 73, + 83, 72, 128, 68, 73, 83, 84, 73, 76, 76, 128, 68, 73, 83, 83, 79, 76, 86, + 69, 45, 50, 128, 68, 73, 83, 83, 79, 76, 86, 69, 128, 68, 73, 83, 80, 85, + 84, 69, 196, 68, 73, 83, 80, 69, 82, 83, 73, 79, 78, 128, 68, 73, 83, 75, + 128, 68, 73, 83, 73, 77, 79, 85, 128, 68, 73, 83, 72, 128, 68, 73, 83, + 71, 85, 73, 83, 69, 196, 68, 73, 83, 67, 79, 78, 84, 73, 78, 85, 79, 85, 211, 68, 73, 83, 195, 68, 73, 83, 65, 80, 80, 79, 73, 78, 84, 69, 196, 68, 73, 83, 65, 66, 76, 69, 196, 68, 73, 82, 71, 193, 68, 73, 82, 69, 67, 84, 76, 217, 68, 73, 82, 69, 67, 84, 73, 79, 78, 65, 204, 68, 73, 82, 69, @@ -4686,25 +4746,26 @@ static const unsigned char lexicon[] = { 85, 82, 86, 69, 196, 67, 85, 82, 86, 69, 128, 67, 85, 82, 86, 197, 67, 85, 82, 83, 73, 86, 197, 67, 85, 82, 82, 217, 67, 85, 82, 82, 69, 78, 84, 128, 67, 85, 82, 82, 69, 78, 212, 67, 85, 82, 76, 217, 67, 85, 82, 76, - 73, 78, 199, 67, 85, 82, 76, 128, 67, 85, 82, 128, 67, 85, 80, 80, 69, - 68, 128, 67, 85, 80, 80, 69, 196, 67, 85, 80, 73, 68, 79, 128, 67, 85, - 80, 67, 65, 75, 69, 128, 67, 85, 79, 88, 128, 67, 85, 79, 80, 128, 67, - 85, 79, 128, 67, 85, 205, 67, 85, 76, 84, 73, 86, 65, 84, 73, 79, 206, - 67, 85, 67, 85, 77, 66, 69, 82, 128, 67, 85, 66, 69, 68, 128, 67, 85, 66, - 69, 128, 67, 85, 66, 197, 67, 85, 65, 84, 82, 73, 76, 76, 79, 128, 67, - 85, 65, 84, 82, 73, 76, 76, 207, 67, 85, 65, 205, 67, 83, 73, 128, 67, - 82, 89, 83, 84, 65, 204, 67, 82, 89, 80, 84, 79, 71, 82, 65, 77, 77, 73, - 195, 67, 82, 89, 73, 78, 199, 67, 82, 85, 90, 69, 73, 82, 207, 67, 82, - 85, 67, 73, 70, 79, 82, 205, 67, 82, 85, 67, 73, 66, 76, 69, 45, 53, 128, - 67, 82, 85, 67, 73, 66, 76, 69, 45, 52, 128, 67, 82, 85, 67, 73, 66, 76, - 69, 45, 51, 128, 67, 82, 85, 67, 73, 66, 76, 69, 45, 50, 128, 67, 82, 85, - 67, 73, 66, 76, 69, 128, 67, 82, 79, 87, 78, 128, 67, 82, 79, 83, 83, 73, - 78, 71, 128, 67, 82, 79, 83, 83, 73, 78, 199, 67, 82, 79, 83, 83, 72, 65, - 84, 67, 200, 67, 82, 79, 83, 83, 69, 68, 45, 84, 65, 73, 76, 128, 67, 82, - 79, 83, 83, 69, 68, 128, 67, 82, 79, 83, 83, 69, 196, 67, 82, 79, 83, 83, - 66, 79, 78, 69, 83, 128, 67, 82, 79, 83, 83, 128, 67, 82, 79, 83, 211, - 67, 82, 79, 80, 128, 67, 82, 79, 73, 88, 128, 67, 82, 79, 73, 83, 83, 65, - 78, 84, 128, 67, 82, 79, 67, 85, 211, 67, 82, 79, 67, 79, 68, 73, 76, 69, + 73, 78, 199, 67, 85, 82, 76, 69, 196, 67, 85, 82, 76, 128, 67, 85, 82, + 128, 67, 85, 80, 80, 69, 68, 128, 67, 85, 80, 80, 69, 196, 67, 85, 80, + 73, 68, 79, 128, 67, 85, 80, 67, 65, 75, 69, 128, 67, 85, 79, 88, 128, + 67, 85, 79, 80, 128, 67, 85, 79, 128, 67, 85, 205, 67, 85, 76, 84, 73, + 86, 65, 84, 73, 79, 206, 67, 85, 67, 85, 77, 66, 69, 82, 128, 67, 85, 66, + 69, 68, 128, 67, 85, 66, 69, 128, 67, 85, 66, 197, 67, 85, 65, 84, 82, + 73, 76, 76, 79, 128, 67, 85, 65, 84, 82, 73, 76, 76, 207, 67, 85, 65, + 205, 67, 83, 73, 128, 67, 82, 89, 83, 84, 65, 204, 67, 82, 89, 80, 84, + 79, 71, 82, 65, 77, 77, 73, 195, 67, 82, 89, 73, 78, 199, 67, 82, 85, 90, + 69, 73, 82, 207, 67, 82, 85, 67, 73, 70, 79, 82, 205, 67, 82, 85, 67, 73, + 66, 76, 69, 45, 53, 128, 67, 82, 85, 67, 73, 66, 76, 69, 45, 52, 128, 67, + 82, 85, 67, 73, 66, 76, 69, 45, 51, 128, 67, 82, 85, 67, 73, 66, 76, 69, + 45, 50, 128, 67, 82, 85, 67, 73, 66, 76, 69, 128, 67, 82, 79, 87, 78, + 128, 67, 82, 79, 83, 83, 73, 78, 71, 128, 67, 82, 79, 83, 83, 73, 78, + 199, 67, 82, 79, 83, 83, 72, 65, 84, 67, 200, 67, 82, 79, 83, 83, 69, 68, + 45, 84, 65, 73, 76, 128, 67, 82, 79, 83, 83, 69, 68, 128, 67, 82, 79, 83, + 83, 69, 196, 67, 82, 79, 83, 83, 66, 79, 78, 69, 83, 128, 67, 82, 79, 83, + 83, 66, 65, 82, 128, 67, 82, 79, 83, 83, 128, 67, 82, 79, 83, 211, 67, + 82, 79, 80, 128, 67, 82, 79, 73, 88, 128, 67, 82, 79, 73, 83, 83, 65, 78, + 84, 128, 67, 82, 79, 67, 85, 211, 67, 82, 79, 67, 79, 68, 73, 76, 69, 128, 67, 82, 73, 67, 75, 69, 84, 128, 67, 82, 73, 67, 75, 69, 212, 67, 82, 69, 83, 67, 69, 78, 84, 83, 128, 67, 82, 69, 83, 67, 69, 78, 84, 128, 67, 82, 69, 83, 67, 69, 78, 212, 67, 82, 69, 68, 73, 212, 67, 82, 69, 65, @@ -4748,605 +4809,616 @@ static const unsigned char lexicon[] = { 85, 84, 69, 82, 128, 67, 79, 77, 80, 82, 69, 83, 83, 73, 79, 78, 128, 67, 79, 77, 80, 82, 69, 83, 83, 69, 196, 67, 79, 77, 80, 79, 83, 73, 84, 73, 79, 78, 128, 67, 79, 77, 80, 79, 83, 73, 84, 73, 79, 206, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 55, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 55, 53, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 55, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 55, 52, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 55, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 55, 52, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 55, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 55, 52, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 55, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 55, 51, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 55, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 55, 51, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 55, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 55, 50, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 55, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 55, 50, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 55, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 55, 49, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 55, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 55, 49, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 55, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 55, 48, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 55, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 55, 48, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 55, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 55, 48, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 57, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 57, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 56, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 56, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 55, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 55, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 54, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 54, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 53, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 54, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 54, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 54, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 54, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 57, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 57, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 56, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 56, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 55, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 55, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 55, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 54, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 54, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 53, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 52, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 51, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 51, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 50, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 49, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 53, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 53, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 53, 48, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 53, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 57, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 57, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 57, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 57, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 56, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 56, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 56, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 56, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 56, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 55, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 55, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 55, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 55, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 55, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 54, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 54, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 54, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 54, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 53, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 53, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 53, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 52, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 52, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 52, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 52, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 51, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 51, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 51, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 51, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 50, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 50, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 50, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 49, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 49, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 49, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 52, 48, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 52, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 52, 48, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 52, 48, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 57, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 57, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 57, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 57, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 57, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 56, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 56, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 56, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 56, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 56, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 55, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 55, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 55, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 55, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 54, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 54, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 54, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 54, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 53, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 53, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 53, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 53, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 52, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 52, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 52, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 52, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 51, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 51, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 51, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 50, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 50, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 50, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 49, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 49, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 49, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 48, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 51, 48, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 51, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 51, 48, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 51, 48, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 57, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 57, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 57, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 57, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 56, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 56, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 56, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 55, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 55, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 55, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 54, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 54, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 54, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 53, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 53, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 52, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 51, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 50, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 49, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 48, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 50, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 50, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 50, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 50, 48, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 57, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 57, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 56, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 56, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 55, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 55, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 55, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 54, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 54, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 49, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 49, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 49, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 49, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 57, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 57, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 57, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 48, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 56, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 56, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, - 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 54, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 53, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 56, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 50, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 49, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 56, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 55, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, - 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 55, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 54, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 55, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 51, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 50, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 55, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 55, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, - 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 56, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 55, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 54, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 52, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 51, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 54, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 54, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, - 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 57, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 56, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 53, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 53, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 52, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 53, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, - 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 48, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 57, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 52, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 54, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 53, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 52, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, - 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 49, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 48, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 51, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 55, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 54, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 51, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, - 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 50, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 49, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 51, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 56, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 55, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 50, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, - 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 51, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 50, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 50, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 57, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 56, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 49, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, - 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 52, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 51, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 49, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 48, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 57, 128, 67, 79, 77, 80, - 79, 78, 69, 78, 84, 45, 48, 48, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, - 84, 45, 48, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, - 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 53, 128, 67, 79, - 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 52, 128, 67, 79, 77, 80, 79, 78, - 69, 78, 84, 45, 48, 48, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, - 48, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 49, 128, - 67, 79, 77, 80, 79, 78, 69, 78, 212, 67, 79, 77, 80, 76, 73, 65, 78, 67, - 69, 128, 67, 79, 77, 80, 76, 69, 84, 73, 79, 78, 128, 67, 79, 77, 80, 76, - 69, 84, 69, 68, 128, 67, 79, 77, 80, 76, 69, 77, 69, 78, 84, 128, 67, 79, - 77, 80, 65, 83, 83, 128, 67, 79, 77, 80, 65, 82, 69, 128, 67, 79, 77, 77, - 79, 206, 67, 79, 77, 77, 69, 82, 67, 73, 65, 204, 67, 79, 77, 77, 65, 78, - 68, 128, 67, 79, 77, 77, 65, 128, 67, 79, 77, 77, 193, 67, 79, 77, 69, - 84, 128, 67, 79, 77, 66, 73, 78, 69, 68, 128, 67, 79, 77, 66, 73, 78, 65, - 84, 73, 79, 78, 128, 67, 79, 77, 66, 128, 67, 79, 76, 85, 77, 78, 128, - 67, 79, 76, 79, 82, 128, 67, 79, 76, 76, 73, 83, 73, 79, 206, 67, 79, 76, - 76, 128, 67, 79, 76, 196, 67, 79, 70, 70, 73, 78, 128, 67, 79, 69, 78, - 71, 128, 67, 79, 69, 78, 199, 67, 79, 68, 65, 128, 67, 79, 67, 79, 78, - 85, 84, 128, 67, 79, 67, 75, 84, 65, 73, 204, 67, 79, 65, 84, 128, 67, + 79, 78, 69, 78, 84, 45, 55, 54, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 54, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 54, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 54, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 54, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 54, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 55, 54, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 54, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 54, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 55, 53, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 53, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 53, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 55, 53, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 53, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 55, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 52, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 52, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 55, 52, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 52, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 55, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 52, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 51, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 55, 51, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 55, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 51, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 51, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 50, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 55, 50, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 55, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 50, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 50, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 49, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 55, 49, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 55, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 49, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 49, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 48, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 55, 48, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 55, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 55, 48, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 55, 48, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 55, 48, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 57, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 57, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 57, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 57, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 57, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 56, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 56, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 56, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 56, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 55, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 55, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 55, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 55, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 54, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 54, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 54, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 54, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 53, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 53, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 53, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 52, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 52, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 51, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 51, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 50, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 50, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 49, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 49, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 48, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 54, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 54, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 54, 48, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 54, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 54, 48, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 57, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 57, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 57, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 56, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 56, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 56, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 55, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 55, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 55, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 55, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 54, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 54, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 54, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 53, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 52, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 51, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 50, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 49, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 53, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 53, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 53, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 53, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 53, 48, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 57, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 57, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 57, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 57, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 56, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 56, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 56, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 56, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 56, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 55, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 55, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 55, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 55, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 55, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 54, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 54, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 54, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 54, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 53, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 53, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 53, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 52, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 52, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 52, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 51, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 51, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 51, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 51, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 50, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 50, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 50, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 49, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 49, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 49, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 52, 48, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 52, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 52, 48, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 52, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 52, 48, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 57, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 57, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 57, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 57, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 57, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 57, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 56, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 56, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 56, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 56, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 56, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 56, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 55, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 55, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 55, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 55, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 55, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 54, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 54, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 54, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 54, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 54, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 53, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 53, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 53, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 53, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 53, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 52, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 52, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 52, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 52, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 52, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 52, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 51, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 51, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 51, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 51, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 51, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 51, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 50, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 50, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 50, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 50, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 50, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 49, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 49, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 49, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 49, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 49, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 48, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 51, 48, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 51, 48, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 51, 48, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 51, 48, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 51, 48, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 57, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 57, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 57, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 57, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 57, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 57, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 56, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 56, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 56, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 56, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 56, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 55, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 55, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 55, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 55, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 55, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 54, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 54, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 54, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 54, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 54, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 53, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 53, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 53, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 53, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 52, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 52, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 52, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 52, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 51, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 51, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 51, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 50, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 50, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 50, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 49, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 49, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 49, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 48, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 50, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 50, 48, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 50, 48, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 50, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 50, 48, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 57, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 57, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 57, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 56, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 56, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 56, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 55, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 55, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 55, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 54, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 54, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 54, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 53, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 53, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 53, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 53, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 52, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 52, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 52, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 51, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 51, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 51, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 50, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 50, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 50, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 49, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 49, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 49, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 49, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 49, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 49, 48, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 49, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 49, 48, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 49, 48, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 57, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 57, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 57, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 57, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 57, 48, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 57, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 56, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 56, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 54, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 53, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 56, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 56, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, + 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 49, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 56, 48, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 55, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 55, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 55, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 54, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 55, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 55, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, + 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 50, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 55, 49, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 55, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 54, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 56, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 55, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 54, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 54, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, + 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 51, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 54, 50, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 54, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 54, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 57, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 56, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 53, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 53, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, + 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 52, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 51, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 53, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 53, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 53, 48, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 57, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 52, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 52, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, + 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 53, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 52, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 52, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 52, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 49, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 52, 48, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 51, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 51, 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, + 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 54, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 53, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 51, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 51, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 50, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 51, 49, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 51, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 50, 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, + 56, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 55, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 54, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 50, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 50, 52, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 51, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 50, 50, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 50, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 50, 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, + 57, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 56, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 55, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 49, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 49, 53, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 52, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, 51, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 49, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 49, 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 49, + 48, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 57, 128, 67, 79, + 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 56, 128, 67, 79, 77, 80, 79, 78, + 69, 78, 84, 45, 48, 48, 55, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, + 48, 48, 54, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 53, 128, + 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, 52, 128, 67, 79, 77, 80, + 79, 78, 69, 78, 84, 45, 48, 48, 51, 128, 67, 79, 77, 80, 79, 78, 69, 78, + 84, 45, 48, 48, 50, 128, 67, 79, 77, 80, 79, 78, 69, 78, 84, 45, 48, 48, + 49, 128, 67, 79, 77, 80, 79, 78, 69, 78, 212, 67, 79, 77, 80, 76, 73, 65, + 78, 67, 69, 128, 67, 79, 77, 80, 76, 69, 84, 73, 79, 78, 128, 67, 79, 77, + 80, 76, 69, 84, 69, 68, 128, 67, 79, 77, 80, 76, 69, 77, 69, 78, 84, 128, + 67, 79, 77, 80, 65, 83, 83, 128, 67, 79, 77, 80, 65, 82, 69, 128, 67, 79, + 77, 77, 79, 206, 67, 79, 77, 77, 69, 82, 67, 73, 65, 204, 67, 79, 77, 77, + 65, 78, 68, 128, 67, 79, 77, 77, 65, 128, 67, 79, 77, 77, 193, 67, 79, + 77, 69, 84, 128, 67, 79, 77, 66, 73, 78, 69, 68, 128, 67, 79, 77, 66, 73, + 78, 65, 84, 73, 79, 78, 128, 67, 79, 77, 66, 128, 67, 79, 76, 85, 77, 78, + 128, 67, 79, 76, 79, 82, 128, 67, 79, 76, 76, 73, 83, 73, 79, 206, 67, + 79, 76, 76, 128, 67, 79, 76, 196, 67, 79, 73, 78, 128, 67, 79, 70, 70, + 73, 78, 128, 67, 79, 69, 78, 71, 128, 67, 79, 69, 78, 199, 67, 79, 68, + 65, 128, 67, 79, 67, 79, 78, 85, 84, 128, 67, 79, 67, 75, 84, 65, 73, + 204, 67, 79, 67, 75, 82, 79, 65, 67, 72, 128, 67, 79, 65, 84, 128, 67, 79, 65, 83, 84, 69, 82, 128, 67, 79, 65, 128, 67, 77, 128, 67, 205, 67, 76, 85, 83, 84, 69, 82, 45, 73, 78, 73, 84, 73, 65, 204, 67, 76, 85, 83, 84, 69, 82, 45, 70, 73, 78, 65, 204, 67, 76, 85, 83, 84, 69, 210, 67, 76, @@ -5373,38 +5445,40 @@ static const unsigned char lexicon[] = { 73, 82, 67, 76, 73, 78, 199, 67, 73, 82, 67, 76, 69, 83, 128, 67, 73, 82, 67, 76, 69, 211, 67, 73, 82, 67, 76, 69, 68, 128, 67, 73, 80, 128, 67, 73, 78, 78, 65, 66, 65, 82, 128, 67, 73, 78, 69, 77, 65, 128, 67, 73, - 206, 67, 73, 205, 67, 73, 73, 128, 67, 73, 69, 88, 128, 67, 73, 69, 85, - 67, 45, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 67, 73, 69, 85, 67, - 45, 80, 73, 69, 85, 80, 128, 67, 73, 69, 85, 67, 45, 73, 69, 85, 78, 71, - 128, 67, 73, 69, 85, 195, 67, 73, 69, 84, 128, 67, 73, 69, 80, 128, 67, - 73, 69, 128, 67, 72, 89, 88, 128, 67, 72, 89, 84, 128, 67, 72, 89, 82, - 88, 128, 67, 72, 89, 82, 128, 67, 72, 89, 80, 128, 67, 72, 87, 86, 128, - 67, 72, 85, 88, 128, 67, 72, 85, 82, 88, 128, 67, 72, 85, 82, 67, 72, - 128, 67, 72, 85, 82, 128, 67, 72, 85, 80, 128, 67, 72, 85, 79, 88, 128, - 67, 72, 85, 79, 84, 128, 67, 72, 85, 79, 80, 128, 67, 72, 85, 79, 128, - 67, 72, 85, 76, 65, 128, 67, 72, 85, 128, 67, 72, 82, 89, 83, 65, 78, 84, - 72, 69, 77, 85, 77, 128, 67, 72, 82, 79, 78, 79, 85, 128, 67, 72, 82, 79, - 78, 79, 78, 128, 67, 72, 82, 79, 77, 193, 67, 72, 82, 79, 193, 67, 72, - 82, 73, 86, 73, 128, 67, 72, 82, 73, 83, 84, 77, 65, 83, 128, 67, 72, 82, - 73, 83, 84, 77, 65, 211, 67, 72, 79, 89, 128, 67, 72, 79, 88, 128, 67, - 72, 79, 84, 128, 67, 72, 79, 82, 69, 86, 77, 193, 67, 72, 79, 80, 83, 84, - 73, 67, 75, 83, 128, 67, 72, 79, 80, 128, 67, 72, 79, 75, 69, 128, 67, - 72, 79, 69, 128, 67, 72, 79, 67, 79, 76, 65, 84, 197, 67, 72, 79, 65, - 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 83, 73, 79, 83, - 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 67, 73, 69, 85, - 67, 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 73, 79, 83, 128, 67, 72, 73, - 84, 85, 69, 85, 77, 67, 73, 69, 85, 67, 128, 67, 72, 73, 84, 85, 69, 85, - 77, 67, 72, 73, 69, 85, 67, 72, 128, 67, 72, 73, 82, 79, 78, 128, 67, 72, - 73, 82, 69, 84, 128, 67, 72, 73, 80, 77, 85, 78, 75, 128, 67, 72, 73, 78, - 79, 79, 203, 67, 72, 73, 78, 71, 128, 67, 72, 73, 78, 69, 83, 197, 67, - 72, 73, 78, 128, 67, 72, 73, 77, 69, 128, 67, 72, 73, 76, 76, 213, 67, - 72, 73, 76, 68, 82, 69, 206, 67, 72, 73, 76, 68, 128, 67, 72, 73, 76, - 128, 67, 72, 73, 75, 201, 67, 72, 73, 69, 85, 67, 72, 45, 75, 72, 73, 69, - 85, 75, 72, 128, 67, 72, 73, 69, 85, 67, 72, 45, 72, 73, 69, 85, 72, 128, - 67, 72, 73, 69, 85, 67, 200, 67, 72, 73, 67, 75, 69, 78, 128, 67, 72, 73, - 67, 75, 128, 67, 72, 73, 128, 67, 72, 201, 67, 72, 72, 65, 128, 67, 72, - 69, 88, 128, 67, 72, 69, 86, 82, 79, 206, 67, 72, 69, 84, 128, 67, 72, - 69, 83, 84, 78, 85, 84, 128, 67, 72, 69, 83, 84, 128, 67, 72, 69, 83, + 206, 67, 73, 77, 128, 67, 73, 205, 67, 73, 73, 128, 67, 73, 69, 88, 128, + 67, 73, 69, 85, 67, 45, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 67, + 73, 69, 85, 67, 45, 80, 73, 69, 85, 80, 128, 67, 73, 69, 85, 67, 45, 73, + 69, 85, 78, 71, 128, 67, 73, 69, 85, 195, 67, 73, 69, 84, 128, 67, 73, + 69, 80, 128, 67, 73, 69, 128, 67, 72, 89, 88, 128, 67, 72, 89, 84, 128, + 67, 72, 89, 82, 88, 128, 67, 72, 89, 82, 128, 67, 72, 89, 80, 128, 67, + 72, 87, 86, 128, 67, 72, 85, 88, 128, 67, 72, 85, 82, 88, 128, 67, 72, + 85, 82, 67, 72, 128, 67, 72, 85, 82, 128, 67, 72, 85, 80, 128, 67, 72, + 85, 79, 88, 128, 67, 72, 85, 79, 84, 128, 67, 72, 85, 79, 80, 128, 67, + 72, 85, 79, 128, 67, 72, 85, 76, 65, 128, 67, 72, 85, 128, 67, 72, 82, + 89, 83, 65, 78, 84, 72, 69, 77, 85, 77, 128, 67, 72, 82, 79, 78, 79, 85, + 128, 67, 72, 82, 79, 78, 79, 78, 128, 67, 72, 82, 79, 77, 193, 67, 72, + 82, 79, 193, 67, 72, 82, 73, 86, 73, 128, 67, 72, 82, 73, 83, 84, 77, 65, + 83, 128, 67, 72, 82, 73, 83, 84, 77, 65, 211, 67, 72, 79, 89, 128, 67, + 72, 79, 88, 128, 67, 72, 79, 84, 128, 67, 72, 79, 82, 69, 86, 77, 193, + 67, 72, 79, 82, 65, 83, 77, 73, 65, 206, 67, 72, 79, 80, 83, 84, 73, 67, + 75, 83, 128, 67, 72, 79, 80, 128, 67, 72, 79, 75, 69, 128, 67, 72, 79, + 69, 128, 67, 72, 79, 67, 79, 76, 65, 84, 197, 67, 72, 79, 65, 128, 67, + 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 67, + 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, 128, + 67, 72, 73, 84, 85, 69, 85, 77, 83, 73, 79, 83, 128, 67, 72, 73, 84, 85, + 69, 85, 77, 67, 73, 69, 85, 67, 128, 67, 72, 73, 84, 85, 69, 85, 77, 67, + 72, 73, 69, 85, 67, 72, 128, 67, 72, 73, 82, 79, 78, 128, 67, 72, 73, 82, + 69, 84, 128, 67, 72, 73, 80, 77, 85, 78, 75, 128, 67, 72, 73, 78, 79, 79, + 203, 67, 72, 73, 78, 71, 128, 67, 72, 73, 78, 69, 83, 197, 67, 72, 73, + 78, 128, 67, 72, 73, 77, 69, 128, 67, 72, 73, 77, 128, 67, 72, 73, 76, + 76, 213, 67, 72, 73, 76, 68, 82, 69, 206, 67, 72, 73, 76, 68, 128, 67, + 72, 73, 76, 128, 67, 72, 73, 75, 201, 67, 72, 73, 69, 85, 67, 72, 45, 75, + 72, 73, 69, 85, 75, 72, 128, 67, 72, 73, 69, 85, 67, 72, 45, 72, 73, 69, + 85, 72, 128, 67, 72, 73, 69, 85, 67, 200, 67, 72, 73, 67, 75, 69, 78, + 128, 67, 72, 73, 67, 75, 128, 67, 72, 73, 128, 67, 72, 201, 67, 72, 72, + 73, 77, 128, 67, 72, 72, 65, 128, 67, 72, 69, 88, 128, 67, 72, 69, 86, + 82, 79, 78, 128, 67, 72, 69, 86, 82, 79, 206, 67, 72, 69, 84, 128, 67, + 72, 69, 83, 84, 78, 85, 84, 128, 67, 72, 69, 83, 84, 128, 67, 72, 69, 83, 211, 67, 72, 69, 82, 89, 128, 67, 72, 69, 82, 82, 217, 67, 72, 69, 82, 82, 73, 69, 83, 128, 67, 72, 69, 81, 85, 69, 82, 69, 196, 67, 72, 69, 80, 128, 67, 72, 69, 73, 78, 65, 80, 128, 67, 72, 69, 73, 75, 72, 69, 73, @@ -5768,350 +5842,774 @@ static const unsigned char lexicon[] = { 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 66, 49, 55, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 66, 49, 55, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 66, 49, 55, 48, 128, 67, 72, 65, 82, 65, 67, - 84, 69, 82, 128, 67, 72, 65, 82, 128, 67, 72, 65, 80, 84, 69, 82, 128, - 67, 72, 65, 80, 128, 67, 72, 65, 78, 71, 128, 67, 72, 65, 78, 128, 67, - 72, 65, 77, 75, 79, 128, 67, 72, 65, 77, 73, 76, 79, 78, 128, 67, 72, 65, - 77, 73, 76, 73, 128, 67, 72, 65, 205, 67, 72, 65, 75, 77, 193, 67, 72, - 65, 73, 78, 83, 128, 67, 72, 65, 68, 65, 128, 67, 72, 65, 196, 67, 72, - 65, 65, 128, 67, 71, 74, 128, 67, 69, 88, 128, 67, 69, 86, 73, 84, 85, - 128, 67, 69, 82, 69, 83, 128, 67, 69, 82, 69, 77, 79, 78, 89, 128, 67, - 69, 82, 69, 75, 128, 67, 69, 82, 45, 87, 65, 128, 67, 69, 80, 128, 67, - 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 83, 65, 78, 71, 83, 73, 79, - 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 83, 65, 78, 71, - 67, 73, 69, 85, 67, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, - 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 67, 73, 69, - 85, 67, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 67, 72, 73, 69, - 85, 67, 72, 128, 67, 69, 78, 84, 85, 82, 73, 65, 204, 67, 69, 78, 84, 82, - 69, 76, 73, 78, 197, 67, 69, 78, 84, 82, 69, 68, 128, 67, 69, 78, 84, 82, - 69, 196, 67, 69, 78, 84, 82, 69, 128, 67, 69, 78, 84, 82, 197, 67, 69, - 78, 84, 82, 65, 76, 73, 90, 65, 84, 73, 79, 206, 67, 69, 78, 128, 67, 69, - 76, 84, 73, 195, 67, 69, 76, 83, 73, 85, 83, 128, 67, 69, 76, 69, 66, 82, - 65, 84, 73, 79, 78, 128, 67, 69, 73, 82, 84, 128, 67, 69, 73, 76, 73, 78, - 71, 128, 67, 69, 73, 76, 73, 78, 199, 67, 69, 69, 86, 128, 67, 69, 69, - 66, 128, 67, 69, 69, 128, 67, 69, 68, 73, 76, 76, 65, 128, 67, 69, 68, - 73, 76, 76, 193, 67, 69, 68, 201, 67, 69, 67, 69, 75, 128, 67, 69, 67, - 65, 75, 128, 67, 69, 67, 65, 203, 67, 69, 65, 76, 67, 128, 67, 67, 85, - 128, 67, 67, 79, 128, 67, 67, 73, 128, 67, 67, 72, 85, 128, 67, 67, 72, - 79, 128, 67, 67, 72, 73, 128, 67, 67, 72, 72, 85, 128, 67, 67, 72, 72, - 79, 128, 67, 67, 72, 72, 73, 128, 67, 67, 72, 72, 69, 69, 128, 67, 67, - 72, 72, 69, 128, 67, 67, 72, 72, 65, 65, 128, 67, 67, 72, 72, 65, 128, - 67, 67, 72, 69, 69, 128, 67, 67, 72, 69, 128, 67, 67, 72, 65, 65, 128, - 67, 67, 72, 65, 128, 67, 67, 72, 128, 67, 67, 69, 69, 128, 67, 67, 69, - 128, 67, 67, 65, 65, 128, 67, 67, 65, 128, 67, 65, 89, 78, 128, 67, 65, - 89, 65, 78, 78, 65, 128, 67, 65, 88, 128, 67, 65, 86, 69, 128, 67, 65, - 85, 84, 73, 79, 206, 67, 65, 85, 76, 68, 82, 79, 78, 128, 67, 65, 85, 68, - 65, 128, 67, 65, 85, 67, 65, 83, 73, 65, 206, 67, 65, 85, 128, 67, 65, - 84, 65, 87, 65, 128, 67, 65, 84, 128, 67, 65, 212, 67, 65, 83, 84, 76, - 69, 128, 67, 65, 83, 75, 69, 212, 67, 65, 82, 89, 83, 84, 73, 65, 206, - 67, 65, 82, 84, 87, 72, 69, 69, 76, 128, 67, 65, 82, 84, 82, 73, 68, 71, - 69, 128, 67, 65, 82, 84, 128, 67, 65, 82, 211, 67, 65, 82, 82, 79, 84, - 128, 67, 65, 82, 82, 73, 65, 71, 197, 67, 65, 82, 80, 69, 78, 84, 82, - 217, 67, 65, 82, 208, 67, 65, 82, 79, 85, 83, 69, 204, 67, 65, 82, 79, - 78, 128, 67, 65, 82, 79, 206, 67, 65, 82, 73, 203, 67, 65, 82, 73, 65, - 206, 67, 65, 82, 69, 84, 128, 67, 65, 82, 69, 212, 67, 65, 82, 197, 67, - 65, 82, 68, 83, 128, 67, 65, 82, 68, 128, 67, 65, 82, 196, 67, 65, 82, - 128, 67, 65, 210, 67, 65, 80, 85, 212, 67, 65, 80, 84, 73, 86, 69, 128, - 67, 65, 80, 82, 73, 67, 79, 82, 78, 128, 67, 65, 80, 80, 69, 196, 67, 65, - 80, 79, 128, 67, 65, 80, 73, 84, 85, 76, 85, 77, 128, 67, 65, 80, 73, 84, - 65, 76, 128, 67, 65, 78, 84, 73, 76, 76, 65, 84, 73, 79, 206, 67, 65, 78, - 79, 69, 128, 67, 65, 78, 78, 79, 78, 128, 67, 65, 78, 78, 69, 196, 67, - 65, 78, 199, 67, 65, 78, 69, 128, 67, 65, 78, 68, 89, 128, 67, 65, 78, - 68, 82, 65, 66, 73, 78, 68, 85, 128, 67, 65, 78, 68, 82, 65, 66, 73, 78, - 68, 213, 67, 65, 78, 68, 82, 65, 128, 67, 65, 78, 68, 82, 193, 67, 65, - 78, 68, 76, 69, 128, 67, 65, 78, 67, 69, 82, 128, 67, 65, 78, 67, 69, 76, - 76, 65, 84, 73, 79, 206, 67, 65, 78, 67, 69, 76, 128, 67, 65, 78, 67, 69, - 204, 67, 65, 78, 128, 67, 65, 77, 80, 73, 78, 71, 128, 67, 65, 77, 78, - 85, 195, 67, 65, 77, 69, 82, 65, 128, 67, 65, 77, 69, 82, 193, 67, 65, - 77, 69, 76, 128, 67, 65, 76, 89, 65, 128, 67, 65, 76, 89, 193, 67, 65, - 76, 88, 128, 67, 65, 76, 76, 128, 67, 65, 76, 204, 67, 65, 76, 69, 78, - 68, 65, 82, 128, 67, 65, 76, 69, 78, 68, 65, 210, 67, 65, 76, 67, 85, 76, - 65, 84, 79, 82, 128, 67, 65, 76, 67, 128, 67, 65, 75, 82, 65, 128, 67, - 65, 75, 197, 67, 65, 73, 128, 67, 65, 72, 128, 67, 65, 69, 83, 85, 82, - 65, 128, 67, 65, 68, 85, 67, 69, 85, 83, 128, 67, 65, 68, 193, 67, 65, - 67, 84, 85, 83, 128, 67, 65, 66, 76, 69, 87, 65, 89, 128, 67, 65, 66, 73, - 78, 69, 84, 128, 67, 65, 66, 66, 65, 71, 69, 45, 84, 82, 69, 69, 128, 67, - 65, 65, 78, 71, 128, 67, 65, 65, 73, 128, 67, 193, 67, 48, 50, 52, 128, - 67, 48, 50, 51, 128, 67, 48, 50, 50, 128, 67, 48, 50, 49, 128, 67, 48, - 50, 48, 128, 67, 48, 49, 57, 128, 67, 48, 49, 56, 128, 67, 48, 49, 55, - 128, 67, 48, 49, 54, 128, 67, 48, 49, 53, 128, 67, 48, 49, 52, 128, 67, - 48, 49, 51, 128, 67, 48, 49, 50, 128, 67, 48, 49, 49, 128, 67, 48, 49, - 48, 65, 128, 67, 48, 49, 48, 128, 67, 48, 48, 57, 128, 67, 48, 48, 56, - 128, 67, 48, 48, 55, 128, 67, 48, 48, 54, 128, 67, 48, 48, 53, 128, 67, - 48, 48, 52, 128, 67, 48, 48, 51, 128, 67, 48, 48, 50, 67, 128, 67, 48, - 48, 50, 66, 128, 67, 48, 48, 50, 65, 128, 67, 48, 48, 50, 128, 67, 48, - 48, 49, 128, 67, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 67, 45, 51, - 57, 128, 67, 45, 49, 56, 128, 66, 90, 85, 78, 199, 66, 90, 72, 201, 66, - 89, 84, 197, 66, 89, 69, 76, 79, 82, 85, 83, 83, 73, 65, 78, 45, 85, 75, - 82, 65, 73, 78, 73, 65, 206, 66, 88, 71, 128, 66, 87, 73, 128, 66, 87, - 69, 69, 128, 66, 87, 69, 128, 66, 87, 65, 128, 66, 85, 85, 77, 73, 83, - 72, 128, 66, 85, 84, 84, 79, 78, 128, 66, 85, 84, 84, 79, 206, 66, 85, - 84, 84, 69, 82, 70, 76, 89, 128, 66, 85, 84, 84, 69, 82, 128, 66, 85, - 212, 66, 85, 83, 84, 211, 66, 85, 83, 212, 66, 85, 83, 83, 89, 69, 82, - 85, 128, 66, 85, 83, 73, 78, 69, 83, 211, 66, 85, 211, 66, 85, 82, 213, - 66, 85, 82, 82, 73, 84, 79, 128, 66, 85, 82, 50, 128, 66, 85, 210, 66, - 85, 79, 88, 128, 66, 85, 79, 80, 128, 66, 85, 78, 78, 217, 66, 85, 78, - 71, 128, 66, 85, 77, 80, 217, 66, 85, 76, 85, 71, 128, 66, 85, 76, 85, - 199, 66, 85, 76, 76, 83, 69, 89, 69, 128, 66, 85, 76, 76, 211, 66, 85, - 76, 76, 72, 79, 82, 78, 128, 66, 85, 76, 76, 72, 79, 82, 206, 66, 85, 76, - 76, 69, 84, 128, 66, 85, 76, 76, 69, 212, 66, 85, 76, 76, 128, 66, 85, - 76, 66, 128, 66, 85, 75, 89, 128, 66, 85, 73, 76, 68, 73, 78, 71, 83, - 128, 66, 85, 73, 76, 68, 73, 78, 71, 128, 66, 85, 73, 76, 68, 73, 78, - 199, 66, 85, 72, 73, 196, 66, 85, 71, 73, 78, 69, 83, 197, 66, 85, 71, - 128, 66, 85, 70, 70, 65, 76, 79, 128, 66, 85, 68, 128, 66, 85, 67, 75, - 76, 69, 128, 66, 85, 66, 66, 76, 69, 83, 128, 66, 85, 66, 66, 76, 69, - 128, 66, 83, 84, 65, 82, 128, 66, 83, 75, 85, 210, 66, 83, 75, 65, 173, - 66, 83, 68, 85, 211, 66, 82, 85, 83, 200, 66, 82, 79, 87, 206, 66, 82, - 79, 79, 77, 128, 66, 82, 79, 78, 90, 69, 128, 66, 82, 79, 75, 69, 206, - 66, 82, 79, 67, 67, 79, 76, 73, 128, 66, 82, 79, 65, 196, 66, 82, 73, 83, - 84, 76, 69, 128, 66, 82, 73, 71, 72, 84, 78, 69, 83, 211, 66, 82, 73, 69, - 70, 83, 128, 66, 82, 73, 69, 70, 67, 65, 83, 69, 128, 66, 82, 73, 68, 71, - 197, 66, 82, 73, 68, 197, 66, 82, 73, 67, 75, 128, 66, 82, 73, 128, 66, - 82, 69, 86, 73, 83, 128, 66, 82, 69, 86, 69, 45, 77, 65, 67, 82, 79, 78, - 128, 66, 82, 69, 86, 197, 66, 82, 69, 65, 84, 200, 66, 82, 69, 65, 83, - 84, 45, 70, 69, 69, 68, 73, 78, 71, 128, 66, 82, 69, 65, 75, 84, 72, 82, - 79, 85, 71, 72, 128, 66, 82, 68, 193, 66, 82, 65, 78, 67, 72, 73, 78, - 199, 66, 82, 65, 78, 67, 72, 69, 83, 128, 66, 82, 65, 78, 67, 72, 128, - 66, 82, 65, 78, 67, 200, 66, 82, 65, 75, 67, 69, 84, 128, 66, 82, 65, 73, - 78, 128, 66, 82, 65, 67, 75, 69, 84, 69, 196, 66, 82, 65, 67, 75, 69, - 212, 66, 82, 65, 67, 69, 128, 66, 81, 128, 66, 80, 72, 128, 66, 79, 89, - 211, 66, 79, 89, 128, 66, 79, 88, 73, 78, 199, 66, 79, 87, 84, 73, 69, - 128, 66, 79, 87, 84, 73, 197, 66, 79, 87, 76, 73, 78, 71, 128, 66, 79, - 87, 76, 128, 66, 79, 87, 204, 66, 79, 87, 73, 78, 199, 66, 79, 215, 66, - 79, 85, 81, 85, 69, 84, 128, 66, 79, 85, 81, 85, 69, 212, 66, 79, 85, 78, - 68, 65, 82, 217, 66, 79, 84, 84, 79, 77, 45, 83, 72, 65, 68, 69, 196, 66, - 79, 84, 84, 79, 77, 45, 76, 73, 71, 72, 84, 69, 196, 66, 79, 84, 84, 79, - 77, 128, 66, 79, 84, 84, 79, 205, 66, 79, 84, 84, 76, 69, 128, 66, 79, - 84, 84, 76, 197, 66, 79, 84, 200, 66, 79, 82, 85, 84, 79, 128, 66, 79, - 82, 65, 88, 45, 51, 128, 66, 79, 82, 65, 88, 45, 50, 128, 66, 79, 82, 65, - 88, 128, 66, 79, 80, 79, 77, 79, 70, 207, 66, 79, 79, 84, 83, 128, 66, - 79, 79, 84, 128, 66, 79, 79, 77, 69, 82, 65, 78, 71, 128, 66, 79, 79, 75, - 83, 128, 66, 79, 79, 75, 77, 65, 82, 75, 128, 66, 79, 79, 75, 77, 65, 82, - 203, 66, 79, 78, 69, 128, 66, 79, 77, 66, 128, 66, 79, 77, 128, 66, 79, - 76, 84, 128, 66, 79, 76, 212, 66, 79, 72, 65, 73, 82, 73, 195, 66, 79, - 68, 89, 128, 66, 79, 68, 217, 66, 79, 65, 82, 128, 66, 79, 65, 128, 66, - 76, 85, 69, 128, 66, 76, 85, 197, 66, 76, 79, 87, 73, 78, 199, 66, 76, - 79, 87, 70, 73, 83, 72, 128, 66, 76, 79, 215, 66, 76, 79, 83, 83, 79, 77, - 128, 66, 76, 79, 79, 68, 128, 66, 76, 79, 78, 196, 66, 76, 79, 67, 75, + 84, 69, 82, 45, 49, 56, 67, 68, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 68, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 68, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 68, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 68, + 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 68, 48, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 67, 70, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 67, 69, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 67, 68, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 67, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 67, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 67, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 67, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 67, + 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 67, 55, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 67, 54, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 67, 53, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 67, 52, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 67, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 67, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 67, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 67, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 66, + 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 66, 69, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 66, 68, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 66, 67, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 66, 66, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 66, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 66, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 66, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 66, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 66, + 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 66, 53, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 66, 52, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 66, 51, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 66, 50, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 66, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 66, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 65, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 65, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 65, + 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 65, 67, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 65, 66, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 65, 65, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 65, 57, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 65, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 65, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 65, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 65, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 65, + 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 65, 51, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 65, 50, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 65, 49, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 65, 48, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 57, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 57, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 57, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 57, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 57, + 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 57, 65, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 57, 57, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 57, 56, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 57, 55, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 57, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 57, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 57, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 57, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 57, + 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 57, 49, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 57, 48, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 56, 70, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 56, 69, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 56, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 56, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 56, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 56, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 56, + 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 56, 56, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 56, 55, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 56, 54, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 56, 53, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 56, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 56, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 56, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 56, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 56, + 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 55, 70, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 55, 69, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 55, 68, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 55, 67, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 55, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 55, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 55, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 55, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 55, + 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 55, 54, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 55, 53, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 55, 52, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 55, 51, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 55, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 55, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 55, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 54, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 54, + 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 54, 68, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 54, 67, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 54, 66, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 54, 65, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 54, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 54, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 54, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 54, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 54, + 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 54, 52, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 54, 51, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 54, 50, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 54, 49, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 54, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 53, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 53, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 53, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 53, + 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 53, 66, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 53, 65, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 53, 57, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 53, 56, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 53, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 53, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 53, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 53, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 53, + 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 53, 50, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 53, 49, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 53, 48, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 52, 70, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 52, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 52, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 52, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 52, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 52, + 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 52, 57, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 52, 56, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 52, 55, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 52, 54, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 52, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 52, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 52, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 52, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 52, + 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 52, 48, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 51, 70, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 51, 69, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 51, 68, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 51, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 51, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 51, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 51, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 51, + 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 51, 55, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 51, 54, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 51, 53, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 51, 52, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 51, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 51, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 51, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 51, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 50, + 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 50, 69, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 50, 68, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 50, 67, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 50, 66, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 50, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 50, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 50, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 50, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 50, + 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 50, 53, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 50, 52, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 50, 51, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 50, 50, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 50, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 50, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 49, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 49, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 49, + 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 49, 67, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 49, 66, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 49, 65, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 49, 57, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 49, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 49, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 49, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 49, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 49, + 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 49, 51, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 49, 50, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 49, 49, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 49, 48, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 48, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 48, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 48, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 48, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 48, + 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 48, 65, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 48, 57, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 48, 56, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 67, 48, 55, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 67, 48, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 67, 48, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 67, 48, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 67, 48, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 48, + 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 48, 49, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 67, 48, 48, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 70, 70, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 70, 69, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 70, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 70, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 70, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 70, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 70, + 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 70, 56, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 70, 55, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 70, 54, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 70, 53, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 70, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 70, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 70, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 70, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 70, + 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 69, 70, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 69, 69, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 69, 68, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 69, 67, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 69, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 69, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 69, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 69, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 69, + 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 69, 54, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 69, 53, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 69, 52, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 69, 51, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 69, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 69, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 69, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 68, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 68, + 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 68, 68, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 68, 67, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 68, 66, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 68, 65, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 68, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 68, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 68, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 68, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 68, + 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 68, 52, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 68, 51, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 68, 50, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 68, 49, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 68, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 67, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 67, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 67, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 67, + 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 67, 66, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 67, 65, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 67, 57, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 67, 56, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 67, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 67, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 67, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 67, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 67, + 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 67, 50, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 67, 49, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 67, 48, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 66, 70, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 66, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 66, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 66, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 66, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 66, + 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 66, 57, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 66, 56, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 66, 55, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 66, 54, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 66, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 66, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 66, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 66, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 66, + 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 66, 48, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 65, 70, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 65, 69, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 65, 68, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 65, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 65, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 65, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 65, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 65, + 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 65, 55, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 65, 54, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 65, 53, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 65, 52, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 65, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 65, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 65, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 65, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 57, + 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 57, 69, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 57, 68, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 57, 67, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 57, 66, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 57, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 57, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 57, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 57, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 57, + 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 57, 53, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 57, 52, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 57, 51, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 57, 50, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 57, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 57, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 56, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 56, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 56, + 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 56, 67, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 56, 66, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 56, 65, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 56, 57, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 56, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 56, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 56, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 56, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 56, + 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 56, 51, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 56, 50, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 56, 49, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 56, 48, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 55, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 55, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 55, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 55, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 55, + 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 55, 65, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 55, 57, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 55, 56, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 55, 55, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 55, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 55, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 55, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 55, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 55, + 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 55, 49, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 55, 48, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 54, 70, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 54, 69, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 54, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 54, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 54, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 54, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 54, + 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 54, 56, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 54, 55, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 54, 54, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 54, 53, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 54, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 54, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 54, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 54, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 54, + 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 53, 70, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 53, 69, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 53, 68, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 53, 67, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 53, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 53, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 53, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 53, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 53, + 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 53, 54, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 53, 53, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 53, 52, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 53, 51, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 53, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 53, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 53, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 52, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 52, + 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 52, 68, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 52, 67, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 52, 66, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 52, 65, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 52, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 52, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 52, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 52, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 52, + 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 52, 52, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 52, 51, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 52, 50, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 52, 49, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 52, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 51, 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 51, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 51, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 51, + 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 51, 66, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 51, 65, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 51, 57, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 51, 56, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 51, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 51, 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 51, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 51, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 51, + 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 51, 50, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 51, 49, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 51, 48, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 50, 70, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 50, 69, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 50, 68, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 50, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 50, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 50, + 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 50, 57, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 50, 56, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 50, 55, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 50, 54, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 50, 53, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 50, 52, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 50, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 50, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 50, + 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 50, 48, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 49, 70, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 49, 69, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 49, 68, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 49, 67, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 49, 66, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 49, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 49, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 49, + 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 49, 55, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 49, 54, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 49, 53, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 49, 52, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 49, 51, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 49, 50, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 49, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 49, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 48, + 70, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 48, 69, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 48, 68, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 48, 67, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 48, 66, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 48, 65, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 48, 57, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, + 49, 56, 66, 48, 56, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, + 66, 48, 55, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 48, + 54, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 48, 53, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 48, 52, 128, 67, 72, + 65, 82, 65, 67, 84, 69, 82, 45, 49, 56, 66, 48, 51, 128, 67, 72, 65, 82, + 65, 67, 84, 69, 82, 45, 49, 56, 66, 48, 50, 128, 67, 72, 65, 82, 65, 67, + 84, 69, 82, 45, 49, 56, 66, 48, 49, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 45, 49, 56, 66, 48, 48, 128, 67, 72, 65, 82, 65, 67, 84, 69, 82, 128, + 67, 72, 65, 82, 65, 67, 84, 69, 210, 67, 72, 65, 82, 128, 67, 72, 65, 80, + 84, 69, 82, 128, 67, 72, 65, 80, 128, 67, 72, 65, 78, 71, 128, 67, 72, + 65, 78, 128, 67, 72, 65, 77, 75, 79, 128, 67, 72, 65, 77, 73, 76, 79, 78, + 128, 67, 72, 65, 77, 73, 76, 73, 128, 67, 72, 65, 205, 67, 72, 65, 75, + 77, 193, 67, 72, 65, 73, 78, 83, 128, 67, 72, 65, 68, 65, 128, 67, 72, + 65, 196, 67, 72, 65, 65, 128, 67, 71, 74, 128, 67, 69, 88, 128, 67, 69, + 86, 73, 84, 85, 128, 67, 69, 82, 69, 83, 128, 67, 69, 82, 69, 77, 79, 78, + 89, 128, 67, 69, 82, 69, 75, 128, 67, 69, 82, 45, 87, 65, 128, 67, 69, + 80, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 83, 65, 78, 71, + 83, 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 83, + 65, 78, 71, 67, 73, 69, 85, 67, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, + 85, 77, 83, 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, + 67, 73, 69, 85, 67, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 67, + 72, 73, 69, 85, 67, 72, 128, 67, 69, 78, 84, 85, 82, 73, 65, 204, 67, 69, + 78, 84, 82, 69, 76, 73, 78, 197, 67, 69, 78, 84, 82, 69, 68, 128, 67, 69, + 78, 84, 82, 69, 196, 67, 69, 78, 84, 82, 69, 128, 67, 69, 78, 84, 82, + 197, 67, 69, 78, 84, 82, 65, 76, 73, 90, 65, 84, 73, 79, 206, 67, 69, 78, + 128, 67, 69, 76, 84, 73, 195, 67, 69, 76, 83, 73, 85, 83, 128, 67, 69, + 76, 69, 66, 82, 65, 84, 73, 79, 78, 128, 67, 69, 73, 82, 84, 128, 67, 69, + 73, 76, 73, 78, 71, 128, 67, 69, 73, 76, 73, 78, 199, 67, 69, 69, 86, + 128, 67, 69, 69, 66, 128, 67, 69, 69, 128, 67, 69, 68, 73, 76, 76, 65, + 128, 67, 69, 68, 73, 76, 76, 193, 67, 69, 68, 201, 67, 69, 67, 69, 75, + 128, 67, 69, 67, 65, 75, 128, 67, 69, 67, 65, 203, 67, 69, 65, 76, 67, + 128, 67, 67, 85, 128, 67, 67, 79, 128, 67, 67, 73, 128, 67, 67, 72, 85, + 128, 67, 67, 72, 79, 128, 67, 67, 72, 73, 128, 67, 67, 72, 72, 85, 128, + 67, 67, 72, 72, 79, 128, 67, 67, 72, 72, 73, 128, 67, 67, 72, 72, 69, 69, + 128, 67, 67, 72, 72, 69, 128, 67, 67, 72, 72, 65, 65, 128, 67, 67, 72, + 72, 65, 128, 67, 67, 72, 69, 69, 128, 67, 67, 72, 69, 128, 67, 67, 72, + 65, 65, 128, 67, 67, 72, 65, 128, 67, 67, 72, 128, 67, 67, 69, 69, 128, + 67, 67, 65, 65, 128, 67, 65, 89, 78, 128, 67, 65, 89, 65, 78, 78, 65, + 128, 67, 65, 88, 128, 67, 65, 86, 69, 128, 67, 65, 85, 84, 73, 79, 206, + 67, 65, 85, 76, 68, 82, 79, 78, 128, 67, 65, 85, 68, 65, 128, 67, 65, 85, + 67, 65, 83, 73, 65, 206, 67, 65, 85, 128, 67, 65, 84, 65, 87, 65, 128, + 67, 65, 84, 128, 67, 65, 212, 67, 65, 83, 84, 76, 69, 128, 67, 65, 83, + 75, 69, 212, 67, 65, 82, 89, 83, 84, 73, 65, 206, 67, 65, 82, 84, 87, 72, + 69, 69, 76, 128, 67, 65, 82, 84, 82, 73, 68, 71, 69, 128, 67, 65, 82, 84, + 128, 67, 65, 82, 211, 67, 65, 82, 82, 79, 84, 128, 67, 65, 82, 82, 73, + 65, 71, 197, 67, 65, 82, 80, 69, 78, 84, 82, 217, 67, 65, 82, 208, 67, + 65, 82, 79, 85, 83, 69, 204, 67, 65, 82, 79, 78, 128, 67, 65, 82, 79, + 206, 67, 65, 82, 73, 203, 67, 65, 82, 73, 65, 206, 67, 65, 82, 69, 84, + 128, 67, 65, 82, 69, 212, 67, 65, 82, 197, 67, 65, 82, 68, 83, 128, 67, + 65, 82, 196, 67, 65, 82, 128, 67, 65, 210, 67, 65, 80, 85, 212, 67, 65, + 80, 84, 73, 86, 69, 128, 67, 65, 80, 82, 73, 67, 79, 82, 78, 128, 67, 65, + 80, 80, 69, 196, 67, 65, 80, 79, 128, 67, 65, 80, 73, 84, 85, 76, 85, 77, + 128, 67, 65, 80, 73, 84, 65, 76, 128, 67, 65, 78, 84, 73, 76, 76, 65, 84, + 73, 79, 206, 67, 65, 78, 79, 69, 128, 67, 65, 78, 78, 79, 78, 128, 67, + 65, 78, 78, 69, 196, 67, 65, 78, 199, 67, 65, 78, 69, 128, 67, 65, 78, + 68, 89, 128, 67, 65, 78, 68, 82, 65, 66, 73, 78, 68, 85, 128, 67, 65, 78, + 68, 82, 65, 66, 73, 78, 68, 213, 67, 65, 78, 68, 82, 65, 128, 67, 65, 78, + 68, 82, 193, 67, 65, 78, 68, 76, 69, 128, 67, 65, 78, 67, 69, 82, 128, + 67, 65, 78, 67, 69, 76, 76, 65, 84, 73, 79, 206, 67, 65, 78, 67, 69, 76, + 128, 67, 65, 78, 67, 69, 204, 67, 65, 78, 128, 67, 65, 77, 80, 73, 78, + 71, 128, 67, 65, 77, 78, 85, 195, 67, 65, 77, 69, 82, 65, 128, 67, 65, + 77, 69, 82, 193, 67, 65, 77, 69, 76, 128, 67, 65, 76, 89, 65, 128, 67, + 65, 76, 89, 193, 67, 65, 76, 88, 128, 67, 65, 76, 76, 128, 67, 65, 76, + 204, 67, 65, 76, 69, 78, 68, 65, 82, 128, 67, 65, 76, 69, 78, 68, 65, + 210, 67, 65, 76, 67, 85, 76, 65, 84, 79, 82, 128, 67, 65, 76, 67, 128, + 67, 65, 75, 82, 65, 128, 67, 65, 75, 197, 67, 65, 73, 128, 67, 65, 72, + 128, 67, 65, 69, 83, 85, 82, 65, 128, 67, 65, 68, 85, 67, 69, 85, 83, + 128, 67, 65, 68, 193, 67, 65, 67, 84, 85, 83, 128, 67, 65, 66, 76, 69, + 87, 65, 89, 128, 67, 65, 66, 73, 78, 69, 84, 128, 67, 65, 66, 66, 65, 71, + 69, 45, 84, 82, 69, 69, 128, 67, 65, 65, 78, 71, 128, 67, 65, 65, 73, + 128, 67, 193, 67, 48, 50, 52, 128, 67, 48, 50, 51, 128, 67, 48, 50, 50, + 128, 67, 48, 50, 49, 128, 67, 48, 50, 48, 128, 67, 48, 49, 57, 128, 67, + 48, 49, 56, 128, 67, 48, 49, 55, 128, 67, 48, 49, 54, 128, 67, 48, 49, + 53, 128, 67, 48, 49, 52, 128, 67, 48, 49, 51, 128, 67, 48, 49, 50, 128, + 67, 48, 49, 49, 128, 67, 48, 49, 48, 65, 128, 67, 48, 49, 48, 128, 67, + 48, 48, 57, 128, 67, 48, 48, 56, 128, 67, 48, 48, 55, 128, 67, 48, 48, + 54, 128, 67, 48, 48, 53, 128, 67, 48, 48, 52, 128, 67, 48, 48, 51, 128, + 67, 48, 48, 50, 67, 128, 67, 48, 48, 50, 66, 128, 67, 48, 48, 50, 65, + 128, 67, 48, 48, 50, 128, 67, 48, 48, 49, 128, 67, 45, 83, 73, 77, 80, + 76, 73, 70, 73, 69, 196, 67, 45, 51, 57, 128, 67, 45, 49, 56, 128, 66, + 90, 85, 78, 199, 66, 90, 72, 201, 66, 89, 84, 197, 66, 89, 69, 76, 79, + 82, 85, 83, 83, 73, 65, 78, 45, 85, 75, 82, 65, 73, 78, 73, 65, 206, 66, + 88, 71, 128, 66, 87, 73, 128, 66, 87, 69, 69, 128, 66, 87, 69, 128, 66, + 87, 65, 128, 66, 85, 85, 77, 73, 83, 72, 128, 66, 85, 84, 84, 79, 78, + 128, 66, 85, 84, 84, 79, 206, 66, 85, 84, 84, 69, 82, 70, 76, 89, 128, + 66, 85, 84, 84, 69, 82, 128, 66, 85, 212, 66, 85, 83, 84, 211, 66, 85, + 83, 212, 66, 85, 83, 83, 89, 69, 82, 85, 128, 66, 85, 83, 73, 78, 69, 83, + 211, 66, 85, 211, 66, 85, 82, 213, 66, 85, 82, 82, 73, 84, 79, 128, 66, + 85, 82, 50, 128, 66, 85, 210, 66, 85, 79, 88, 128, 66, 85, 79, 80, 128, + 66, 85, 78, 78, 217, 66, 85, 78, 71, 128, 66, 85, 77, 80, 217, 66, 85, + 76, 85, 71, 128, 66, 85, 76, 85, 199, 66, 85, 76, 76, 83, 69, 89, 69, + 128, 66, 85, 76, 76, 211, 66, 85, 76, 76, 72, 79, 82, 78, 128, 66, 85, + 76, 76, 72, 79, 82, 206, 66, 85, 76, 76, 69, 84, 128, 66, 85, 76, 76, 69, + 212, 66, 85, 76, 76, 128, 66, 85, 76, 66, 128, 66, 85, 75, 89, 128, 66, + 85, 73, 76, 68, 73, 78, 71, 83, 128, 66, 85, 73, 76, 68, 73, 78, 71, 128, + 66, 85, 73, 76, 68, 73, 78, 199, 66, 85, 72, 73, 196, 66, 85, 71, 73, 78, + 69, 83, 197, 66, 85, 71, 128, 66, 85, 70, 70, 65, 76, 79, 128, 66, 85, + 68, 128, 66, 85, 67, 75, 76, 69, 128, 66, 85, 67, 75, 69, 84, 128, 66, + 85, 66, 66, 76, 69, 83, 128, 66, 85, 66, 66, 76, 69, 128, 66, 85, 66, 66, + 76, 197, 66, 83, 84, 65, 82, 128, 66, 83, 75, 85, 210, 66, 83, 75, 65, + 173, 66, 83, 68, 85, 211, 66, 82, 85, 83, 200, 66, 82, 79, 87, 206, 66, + 82, 79, 79, 77, 128, 66, 82, 79, 78, 90, 69, 128, 66, 82, 79, 75, 69, + 206, 66, 82, 79, 67, 67, 79, 76, 73, 128, 66, 82, 79, 65, 196, 66, 82, + 73, 83, 84, 76, 69, 128, 66, 82, 73, 71, 72, 84, 78, 69, 83, 211, 66, 82, + 73, 69, 70, 83, 128, 66, 82, 73, 69, 70, 67, 65, 83, 69, 128, 66, 82, 73, + 68, 71, 197, 66, 82, 73, 68, 197, 66, 82, 73, 67, 75, 128, 66, 82, 73, + 128, 66, 82, 69, 86, 73, 83, 128, 66, 82, 69, 86, 69, 45, 77, 65, 67, 82, + 79, 78, 128, 66, 82, 69, 86, 197, 66, 82, 69, 65, 84, 200, 66, 82, 69, + 65, 83, 84, 45, 70, 69, 69, 68, 73, 78, 71, 128, 66, 82, 69, 65, 75, 84, + 72, 82, 79, 85, 71, 72, 128, 66, 82, 68, 193, 66, 82, 65, 78, 67, 72, 73, + 78, 199, 66, 82, 65, 78, 67, 72, 69, 83, 128, 66, 82, 65, 78, 67, 72, + 128, 66, 82, 65, 78, 67, 200, 66, 82, 65, 75, 67, 69, 84, 128, 66, 82, + 65, 73, 78, 128, 66, 82, 65, 67, 75, 69, 84, 69, 196, 66, 82, 65, 67, 75, + 69, 212, 66, 82, 65, 67, 69, 128, 66, 81, 128, 66, 80, 72, 128, 66, 79, + 89, 211, 66, 79, 89, 128, 66, 79, 88, 73, 78, 199, 66, 79, 87, 84, 73, + 69, 128, 66, 79, 87, 84, 73, 197, 66, 79, 87, 76, 73, 78, 71, 128, 66, + 79, 87, 76, 128, 66, 79, 87, 204, 66, 79, 87, 73, 78, 199, 66, 79, 215, + 66, 79, 85, 81, 85, 69, 84, 128, 66, 79, 85, 81, 85, 69, 212, 66, 79, 85, + 78, 68, 65, 82, 217, 66, 79, 84, 84, 79, 77, 45, 83, 72, 65, 68, 69, 196, + 66, 79, 84, 84, 79, 77, 45, 76, 73, 71, 72, 84, 69, 196, 66, 79, 84, 84, + 79, 77, 128, 66, 79, 84, 84, 79, 205, 66, 79, 84, 84, 76, 69, 128, 66, + 79, 84, 84, 76, 197, 66, 79, 84, 200, 66, 79, 82, 85, 84, 79, 128, 66, + 79, 82, 65, 88, 45, 51, 128, 66, 79, 82, 65, 88, 45, 50, 128, 66, 79, 82, + 65, 88, 128, 66, 79, 80, 79, 77, 79, 70, 207, 66, 79, 79, 84, 83, 128, + 66, 79, 79, 84, 128, 66, 79, 79, 77, 69, 82, 65, 78, 71, 128, 66, 79, 79, + 75, 83, 128, 66, 79, 79, 75, 77, 65, 82, 75, 128, 66, 79, 79, 75, 77, 65, + 82, 203, 66, 79, 78, 69, 128, 66, 79, 77, 66, 128, 66, 79, 77, 128, 66, + 79, 76, 84, 128, 66, 79, 76, 212, 66, 79, 72, 65, 73, 82, 73, 195, 66, + 79, 68, 89, 128, 66, 79, 68, 217, 66, 79, 65, 82, 128, 66, 79, 65, 128, + 66, 76, 85, 69, 66, 69, 82, 82, 73, 69, 83, 128, 66, 76, 85, 69, 128, 66, + 76, 85, 197, 66, 76, 79, 87, 73, 78, 199, 66, 76, 79, 87, 70, 73, 83, 72, + 128, 66, 76, 79, 215, 66, 76, 79, 83, 83, 79, 77, 128, 66, 76, 79, 79, + 68, 128, 66, 76, 79, 78, 196, 66, 76, 79, 67, 75, 45, 55, 128, 66, 76, + 79, 67, 75, 45, 54, 128, 66, 76, 79, 67, 75, 45, 53, 128, 66, 76, 79, 67, + 75, 45, 52, 128, 66, 76, 79, 67, 75, 45, 51, 128, 66, 76, 79, 67, 75, 45, + 50, 128, 66, 76, 79, 67, 75, 45, 49, 51, 53, 56, 128, 66, 76, 79, 67, 75, 128, 66, 76, 73, 78, 203, 66, 76, 65, 78, 75, 128, 66, 76, 65, 78, 203, 66, 76, 65, 68, 197, 66, 76, 65, 67, 75, 76, 69, 84, 84, 69, 210, 66, 76, 65, 67, 75, 70, 79, 79, 212, 66, 76, 65, 67, 75, 45, 76, 69, 84, 84, 69, 210, 66, 76, 65, 67, 75, 45, 70, 69, 65, 84, 72, 69, 82, 69, 196, 66, 76, 65, 67, 75, 128, 66, 75, 65, 173, 66, 73, 84, 84, 69, 82, 128, 66, 73, 84, 73, 78, 199, 66, 73, 84, 197, 66, 73, 84, 67, 79, 73, 206, 66, 73, - 83, 77, 85, 84, 200, 66, 73, 83, 77, 73, 76, 76, 65, 200, 66, 73, 83, 72, - 79, 208, 66, 73, 83, 69, 67, 84, 73, 78, 199, 66, 73, 83, 65, 72, 128, - 66, 73, 82, 85, 128, 66, 73, 82, 84, 72, 68, 65, 217, 66, 73, 82, 71, 65, - 128, 66, 73, 82, 71, 193, 66, 73, 82, 68, 128, 66, 73, 79, 72, 65, 90, - 65, 82, 196, 66, 73, 78, 79, 86, 73, 76, 69, 128, 66, 73, 78, 79, 67, 85, - 76, 65, 210, 66, 73, 78, 68, 73, 78, 199, 66, 73, 78, 68, 73, 128, 66, - 73, 78, 65, 82, 217, 66, 73, 76, 76, 73, 79, 78, 83, 128, 66, 73, 76, 76, - 73, 65, 82, 68, 83, 128, 66, 73, 76, 76, 69, 196, 66, 73, 76, 65, 66, 73, - 65, 204, 66, 73, 75, 73, 78, 73, 128, 66, 73, 71, 128, 66, 73, 199, 66, - 73, 69, 84, 128, 66, 73, 68, 69, 78, 84, 65, 204, 66, 73, 68, 65, 75, 85, - 79, 206, 66, 73, 67, 89, 67, 76, 73, 83, 84, 128, 66, 73, 67, 89, 67, 76, - 69, 83, 128, 66, 73, 67, 89, 67, 76, 69, 128, 66, 73, 67, 69, 80, 83, - 128, 66, 73, 66, 76, 69, 45, 67, 82, 69, 197, 66, 73, 66, 128, 66, 201, - 66, 72, 85, 128, 66, 72, 79, 79, 128, 66, 72, 79, 128, 66, 72, 73, 128, - 66, 72, 69, 84, 72, 128, 66, 72, 69, 69, 128, 66, 72, 69, 128, 66, 72, - 65, 84, 84, 73, 80, 82, 79, 76, 213, 66, 72, 65, 77, 128, 66, 72, 65, 73, - 75, 83, 85, 75, 201, 66, 72, 65, 65, 128, 66, 72, 65, 128, 66, 69, 89, - 89, 65, 76, 128, 66, 69, 88, 128, 66, 69, 86, 69, 82, 65, 71, 69, 128, - 66, 69, 86, 69, 82, 65, 71, 197, 66, 69, 84, 87, 69, 69, 78, 128, 66, 69, - 84, 87, 69, 69, 206, 66, 69, 84, 72, 128, 66, 69, 84, 65, 128, 66, 69, - 84, 193, 66, 69, 212, 66, 69, 83, 73, 68, 197, 66, 69, 82, 75, 65, 78, - 65, 206, 66, 69, 82, 66, 69, 210, 66, 69, 80, 128, 66, 69, 79, 82, 195, - 66, 69, 78, 90, 69, 78, 197, 66, 69, 78, 84, 207, 66, 69, 78, 84, 128, - 66, 69, 78, 212, 66, 69, 78, 71, 65, 76, 201, 66, 69, 78, 68, 69, 128, - 66, 69, 78, 68, 128, 66, 69, 78, 196, 66, 69, 206, 66, 69, 76, 84, 128, - 66, 69, 76, 212, 66, 69, 76, 79, 215, 66, 69, 76, 76, 72, 79, 208, 66, - 69, 76, 76, 128, 66, 69, 76, 204, 66, 69, 76, 71, 84, 72, 79, 210, 66, - 69, 73, 84, 72, 128, 66, 69, 72, 73, 78, 196, 66, 69, 72, 69, 72, 128, - 66, 69, 72, 69, 200, 66, 69, 72, 128, 66, 69, 200, 66, 69, 71, 73, 78, - 78, 73, 78, 71, 128, 66, 69, 71, 73, 78, 78, 69, 82, 128, 66, 69, 71, 73, - 206, 66, 69, 70, 79, 82, 197, 66, 69, 69, 84, 76, 69, 128, 66, 69, 69, - 84, 65, 128, 66, 69, 69, 210, 66, 69, 69, 72, 73, 86, 69, 128, 66, 69, - 69, 72, 128, 66, 69, 69, 200, 66, 69, 67, 65, 85, 83, 69, 128, 66, 69, - 65, 86, 69, 210, 66, 69, 65, 84, 73, 78, 199, 66, 69, 65, 84, 128, 66, - 69, 65, 82, 68, 69, 196, 66, 69, 65, 82, 128, 66, 69, 65, 210, 66, 69, - 65, 78, 128, 66, 69, 65, 77, 69, 196, 66, 69, 65, 68, 83, 128, 66, 69, - 65, 67, 200, 66, 67, 65, 68, 128, 66, 67, 65, 196, 66, 66, 89, 88, 128, - 66, 66, 89, 84, 128, 66, 66, 89, 80, 128, 66, 66, 89, 128, 66, 66, 85, - 88, 128, 66, 66, 85, 84, 128, 66, 66, 85, 82, 88, 128, 66, 66, 85, 82, - 128, 66, 66, 85, 80, 128, 66, 66, 85, 79, 88, 128, 66, 66, 85, 79, 80, - 128, 66, 66, 85, 79, 128, 66, 66, 85, 128, 66, 66, 79, 88, 128, 66, 66, - 79, 84, 128, 66, 66, 79, 80, 128, 66, 66, 79, 128, 66, 66, 73, 88, 128, - 66, 66, 73, 80, 128, 66, 66, 73, 69, 88, 128, 66, 66, 73, 69, 84, 128, - 66, 66, 73, 69, 80, 128, 66, 66, 73, 69, 128, 66, 66, 73, 128, 66, 66, - 69, 88, 128, 66, 66, 69, 80, 128, 66, 66, 69, 69, 128, 66, 66, 69, 128, - 66, 66, 65, 88, 128, 66, 66, 65, 84, 128, 66, 66, 65, 80, 128, 66, 66, - 65, 65, 128, 66, 66, 65, 128, 66, 65, 89, 65, 78, 78, 65, 128, 66, 65, - 85, 128, 66, 65, 84, 84, 69, 82, 89, 128, 66, 65, 84, 72, 84, 85, 66, - 128, 66, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 66, 65, 84, 72, 128, - 66, 65, 84, 200, 66, 65, 84, 65, 203, 66, 65, 83, 83, 65, 128, 66, 65, - 83, 83, 193, 66, 65, 83, 75, 69, 84, 66, 65, 76, 204, 66, 65, 83, 72, 75, - 73, 210, 66, 65, 83, 72, 128, 66, 65, 83, 69, 76, 73, 78, 197, 66, 65, - 83, 69, 66, 65, 76, 76, 128, 66, 65, 83, 69, 128, 66, 65, 83, 197, 66, - 65, 82, 83, 128, 66, 65, 82, 211, 66, 65, 82, 82, 73, 69, 82, 128, 66, - 65, 82, 82, 69, 75, 72, 128, 66, 65, 82, 82, 69, 69, 128, 66, 65, 82, 82, - 69, 197, 66, 65, 82, 76, 73, 78, 69, 128, 66, 65, 82, 76, 69, 89, 128, - 66, 65, 82, 73, 89, 79, 79, 83, 65, 78, 128, 66, 65, 82, 66, 69, 210, 66, - 65, 82, 65, 50, 128, 66, 65, 210, 66, 65, 78, 84, 79, 67, 128, 66, 65, - 78, 75, 78, 79, 84, 197, 66, 65, 78, 75, 128, 66, 65, 78, 203, 66, 65, - 78, 74, 79, 128, 66, 65, 78, 68, 128, 66, 65, 78, 65, 78, 65, 128, 66, - 65, 78, 50, 128, 66, 65, 78, 178, 66, 65, 77, 66, 79, 79, 83, 128, 66, - 65, 77, 66, 79, 79, 128, 66, 65, 76, 85, 68, 65, 128, 66, 65, 76, 76, 80, - 79, 73, 78, 212, 66, 65, 76, 76, 79, 84, 128, 66, 65, 76, 76, 79, 212, - 66, 65, 76, 76, 79, 79, 78, 45, 83, 80, 79, 75, 69, 196, 66, 65, 76, 76, - 79, 79, 78, 128, 66, 65, 76, 76, 69, 212, 66, 65, 76, 68, 128, 66, 65, - 76, 65, 71, 128, 66, 65, 76, 128, 66, 65, 204, 66, 65, 73, 82, 75, 65, - 78, 128, 66, 65, 73, 77, 65, 73, 128, 66, 65, 72, 84, 128, 66, 65, 72, - 73, 82, 71, 79, 77, 85, 75, 72, 65, 128, 66, 65, 72, 65, 82, 50, 128, 66, - 65, 72, 65, 82, 178, 66, 65, 72, 128, 66, 65, 71, 85, 69, 84, 84, 197, - 66, 65, 71, 83, 128, 66, 65, 71, 71, 65, 71, 197, 66, 65, 71, 69, 76, - 128, 66, 65, 71, 65, 128, 66, 65, 71, 51, 128, 66, 65, 199, 66, 65, 68, - 77, 73, 78, 84, 79, 206, 66, 65, 68, 71, 69, 82, 128, 66, 65, 68, 71, 69, - 128, 66, 65, 68, 128, 66, 65, 196, 66, 65, 67, 84, 82, 73, 65, 206, 66, - 65, 67, 79, 78, 128, 66, 65, 67, 75, 87, 65, 82, 68, 128, 66, 65, 67, 75, - 83, 80, 65, 67, 69, 128, 66, 65, 67, 75, 83, 76, 65, 83, 72, 128, 66, 65, - 67, 75, 83, 76, 65, 83, 200, 66, 65, 67, 75, 83, 76, 65, 78, 84, 69, 196, - 66, 65, 67, 75, 72, 65, 78, 196, 66, 65, 67, 75, 45, 84, 73, 76, 84, 69, - 196, 66, 65, 67, 75, 128, 66, 65, 67, 203, 66, 65, 66, 89, 128, 66, 65, - 66, 217, 66, 65, 65, 82, 69, 82, 85, 128, 66, 65, 45, 50, 128, 66, 51, - 48, 53, 128, 66, 50, 53, 180, 66, 50, 52, 183, 66, 50, 52, 179, 66, 50, - 52, 178, 66, 50, 52, 177, 66, 50, 52, 176, 66, 50, 51, 179, 66, 50, 51, - 177, 66, 50, 51, 176, 66, 50, 50, 181, 66, 50, 50, 176, 66, 49, 57, 177, - 66, 49, 55, 182, 66, 49, 55, 179, 66, 49, 54, 57, 128, 66, 49, 54, 56, - 128, 66, 49, 54, 55, 128, 66, 49, 54, 54, 128, 66, 49, 54, 53, 128, 66, - 49, 54, 52, 128, 66, 49, 54, 179, 66, 49, 54, 178, 66, 49, 54, 49, 128, - 66, 49, 54, 48, 128, 66, 49, 53, 185, 66, 49, 53, 56, 128, 66, 49, 53, - 55, 128, 66, 49, 53, 182, 66, 49, 53, 53, 128, 66, 49, 53, 52, 128, 66, - 49, 53, 51, 128, 66, 49, 53, 50, 128, 66, 49, 53, 177, 66, 49, 53, 48, - 128, 66, 49, 52, 54, 128, 66, 49, 52, 181, 66, 49, 52, 50, 128, 66, 49, - 52, 177, 66, 49, 52, 176, 66, 49, 51, 181, 66, 49, 51, 179, 66, 49, 51, - 50, 128, 66, 49, 51, 177, 66, 49, 51, 176, 66, 49, 50, 184, 66, 49, 50, - 183, 66, 49, 50, 181, 66, 49, 50, 179, 66, 49, 50, 178, 66, 49, 50, 177, - 66, 49, 50, 176, 66, 49, 48, 57, 205, 66, 49, 48, 57, 198, 66, 49, 48, - 56, 205, 66, 49, 48, 56, 198, 66, 49, 48, 55, 205, 66, 49, 48, 55, 198, - 66, 49, 48, 54, 205, 66, 49, 48, 54, 198, 66, 49, 48, 53, 205, 66, 49, - 48, 53, 198, 66, 49, 48, 181, 66, 49, 48, 180, 66, 49, 48, 178, 66, 49, - 48, 176, 66, 48, 57, 177, 66, 48, 57, 176, 66, 48, 56, 57, 128, 66, 48, - 56, 183, 66, 48, 56, 54, 128, 66, 48, 56, 181, 66, 48, 56, 51, 128, 66, - 48, 56, 50, 128, 66, 48, 56, 177, 66, 48, 56, 176, 66, 48, 55, 57, 128, - 66, 48, 55, 184, 66, 48, 55, 183, 66, 48, 55, 182, 66, 48, 55, 181, 66, - 48, 55, 180, 66, 48, 55, 179, 66, 48, 55, 178, 66, 48, 55, 177, 66, 48, - 55, 176, 66, 48, 54, 185, 66, 48, 54, 184, 66, 48, 54, 183, 66, 48, 54, - 182, 66, 48, 54, 181, 66, 48, 54, 52, 128, 66, 48, 54, 51, 128, 66, 48, - 54, 178, 66, 48, 54, 177, 66, 48, 54, 176, 66, 48, 53, 185, 66, 48, 53, - 184, 66, 48, 53, 183, 66, 48, 53, 54, 128, 66, 48, 53, 181, 66, 48, 53, - 180, 66, 48, 53, 179, 66, 48, 53, 178, 66, 48, 53, 177, 66, 48, 53, 176, - 66, 48, 52, 57, 128, 66, 48, 52, 184, 66, 48, 52, 55, 128, 66, 48, 52, - 182, 66, 48, 52, 181, 66, 48, 52, 180, 66, 48, 52, 179, 66, 48, 52, 178, - 66, 48, 52, 177, 66, 48, 52, 176, 66, 48, 51, 185, 66, 48, 51, 184, 66, - 48, 51, 183, 66, 48, 51, 182, 66, 48, 51, 52, 128, 66, 48, 51, 179, 66, - 48, 51, 178, 66, 48, 51, 177, 66, 48, 51, 176, 66, 48, 50, 185, 66, 48, - 50, 184, 66, 48, 50, 183, 66, 48, 50, 182, 66, 48, 50, 181, 66, 48, 50, - 180, 66, 48, 50, 179, 66, 48, 50, 50, 128, 66, 48, 50, 177, 66, 48, 50, - 176, 66, 48, 49, 57, 128, 66, 48, 49, 56, 128, 66, 48, 49, 183, 66, 48, - 49, 182, 66, 48, 49, 181, 66, 48, 49, 180, 66, 48, 49, 179, 66, 48, 49, - 178, 66, 48, 49, 177, 66, 48, 49, 176, 66, 48, 48, 57, 128, 66, 48, 48, - 185, 66, 48, 48, 56, 128, 66, 48, 48, 184, 66, 48, 48, 55, 128, 66, 48, - 48, 183, 66, 48, 48, 54, 128, 66, 48, 48, 182, 66, 48, 48, 53, 65, 128, - 66, 48, 48, 53, 128, 66, 48, 48, 181, 66, 48, 48, 52, 128, 66, 48, 48, - 180, 66, 48, 48, 51, 128, 66, 48, 48, 179, 66, 48, 48, 50, 128, 66, 48, - 48, 178, 66, 48, 48, 49, 128, 66, 48, 48, 177, 65, 90, 85, 128, 65, 89, - 66, 128, 65, 89, 65, 72, 128, 65, 88, 69, 128, 65, 87, 69, 128, 65, 87, - 65, 217, 65, 86, 79, 67, 65, 68, 79, 128, 65, 86, 69, 83, 84, 65, 206, - 65, 86, 69, 82, 65, 71, 197, 65, 86, 65, 75, 82, 65, 72, 65, 83, 65, 78, - 89, 65, 128, 65, 86, 65, 71, 82, 65, 72, 65, 128, 65, 85, 89, 65, 78, 78, - 65, 128, 65, 85, 84, 85, 77, 78, 128, 65, 85, 84, 79, 77, 79, 66, 73, 76, - 69, 128, 65, 85, 84, 79, 77, 65, 84, 69, 196, 65, 85, 84, 207, 65, 85, - 83, 84, 82, 65, 204, 65, 85, 82, 73, 80, 73, 71, 77, 69, 78, 84, 128, 65, - 85, 82, 65, 77, 65, 90, 68, 65, 65, 72, 65, 128, 65, 85, 82, 65, 77, 65, - 90, 68, 65, 65, 45, 50, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, 128, - 65, 85, 78, 78, 128, 65, 85, 71, 85, 83, 84, 128, 65, 85, 71, 77, 69, 78, - 84, 65, 84, 73, 79, 206, 65, 85, 69, 128, 65, 85, 66, 69, 82, 71, 73, 78, - 69, 128, 65, 84, 84, 73, 195, 65, 84, 84, 72, 65, 67, 65, 78, 128, 65, - 84, 84, 69, 78, 84, 73, 79, 78, 128, 65, 84, 84, 65, 203, 65, 84, 84, 65, - 67, 72, 69, 196, 65, 84, 79, 205, 65, 84, 78, 65, 200, 65, 84, 77, 65, - 65, 85, 128, 65, 84, 73, 89, 65, 128, 65, 84, 73, 85, 128, 65, 84, 73, - 75, 82, 65, 77, 65, 128, 65, 84, 72, 76, 69, 84, 73, 195, 65, 84, 72, 65, - 82, 86, 65, 86, 69, 68, 73, 195, 65, 84, 72, 65, 80, 65, 83, 67, 65, 206, - 65, 84, 72, 45, 84, 72, 65, 76, 65, 84, 72, 65, 128, 65, 83, 90, 128, 65, - 83, 89, 85, 82, 193, 65, 83, 89, 77, 80, 84, 79, 84, 73, 67, 65, 76, 76, - 217, 65, 83, 84, 82, 79, 78, 79, 77, 73, 67, 65, 204, 65, 83, 84, 82, 79, - 76, 79, 71, 73, 67, 65, 204, 65, 83, 84, 82, 65, 69, 65, 128, 65, 83, 84, - 79, 78, 73, 83, 72, 69, 196, 65, 83, 84, 69, 82, 73, 83, 77, 128, 65, 83, - 84, 69, 82, 73, 83, 75, 211, 65, 83, 84, 69, 82, 73, 83, 75, 128, 65, 83, - 84, 69, 82, 73, 83, 203, 65, 83, 84, 69, 82, 73, 83, 67, 85, 83, 128, 65, - 83, 83, 89, 82, 73, 65, 206, 65, 83, 83, 69, 82, 84, 73, 79, 78, 128, 65, - 83, 80, 73, 82, 65, 84, 73, 79, 78, 128, 65, 83, 80, 73, 82, 65, 84, 69, - 196, 65, 83, 80, 69, 82, 128, 65, 83, 73, 65, 45, 65, 85, 83, 84, 82, 65, - 76, 73, 65, 128, 65, 83, 72, 71, 65, 66, 128, 65, 83, 72, 69, 83, 128, - 65, 83, 72, 57, 128, 65, 83, 72, 51, 128, 65, 83, 72, 178, 65, 83, 67, - 69, 78, 84, 128, 65, 83, 67, 69, 78, 68, 73, 78, 199, 65, 83, 65, 76, 50, - 128, 65, 83, 45, 83, 65, 74, 68, 65, 128, 65, 82, 85, 72, 85, 65, 128, - 65, 82, 84, 211, 65, 82, 84, 73, 83, 212, 65, 82, 84, 73, 67, 85, 76, 65, - 84, 69, 196, 65, 82, 84, 65, 66, 197, 65, 82, 84, 65, 128, 65, 82, 83, - 69, 79, 83, 128, 65, 82, 83, 69, 79, 211, 65, 82, 83, 69, 78, 73, 67, - 128, 65, 82, 82, 79, 87, 83, 128, 65, 82, 82, 79, 87, 211, 65, 82, 82, - 79, 87, 72, 69, 65, 68, 83, 128, 65, 82, 82, 79, 87, 72, 69, 65, 68, 128, - 65, 82, 82, 79, 87, 72, 69, 65, 196, 65, 82, 82, 79, 87, 45, 84, 65, 73, - 76, 128, 65, 82, 82, 73, 86, 73, 78, 71, 128, 65, 82, 82, 73, 86, 69, - 128, 65, 82, 82, 65, 89, 128, 65, 82, 80, 69, 71, 71, 73, 65, 84, 207, - 65, 82, 79, 85, 83, 73, 78, 199, 65, 82, 79, 85, 82, 193, 65, 82, 79, 85, - 78, 68, 45, 80, 82, 79, 70, 73, 76, 69, 128, 65, 82, 79, 85, 78, 196, 65, - 82, 77, 89, 128, 65, 82, 77, 79, 85, 82, 128, 65, 82, 77, 69, 78, 73, 65, - 206, 65, 82, 77, 128, 65, 82, 205, 65, 82, 76, 65, 85, 199, 65, 82, 75, - 84, 73, 75, 207, 65, 82, 75, 65, 66, 128, 65, 82, 75, 65, 65, 78, 85, - 128, 65, 82, 73, 83, 84, 69, 82, 65, 128, 65, 82, 73, 83, 84, 69, 82, - 193, 65, 82, 73, 69, 83, 128, 65, 82, 71, 79, 84, 69, 82, 73, 128, 65, - 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, 78, 128, 65, 82, 71, 73, 128, - 65, 82, 69, 80, 65, 128, 65, 82, 69, 65, 128, 65, 82, 68, 72, 65, 86, 73, - 83, 65, 82, 71, 65, 128, 65, 82, 68, 72, 65, 67, 65, 78, 68, 82, 65, 128, - 65, 82, 67, 72, 65, 73, 79, 78, 128, 65, 82, 67, 72, 65, 73, 79, 206, 65, - 82, 67, 72, 65, 73, 195, 65, 82, 67, 200, 65, 82, 67, 128, 65, 82, 195, - 65, 82, 65, 77, 65, 73, 195, 65, 82, 65, 69, 65, 69, 128, 65, 82, 65, 69, - 65, 45, 85, 128, 65, 82, 65, 69, 65, 45, 73, 128, 65, 82, 65, 69, 65, 45, - 69, 79, 128, 65, 82, 65, 69, 65, 45, 69, 128, 65, 82, 65, 69, 65, 45, 65, - 128, 65, 82, 65, 68, 128, 65, 82, 65, 196, 65, 82, 65, 66, 73, 67, 45, - 73, 78, 68, 73, 195, 65, 82, 65, 66, 73, 65, 206, 65, 82, 45, 82, 85, 66, - 128, 65, 82, 45, 82, 65, 72, 77, 65, 206, 65, 82, 45, 82, 65, 72, 69, 69, - 77, 128, 65, 81, 85, 65, 82, 73, 85, 83, 128, 65, 81, 85, 65, 70, 79, 82, - 84, 73, 83, 128, 65, 81, 85, 193, 65, 80, 85, 206, 65, 80, 82, 73, 76, - 128, 65, 80, 80, 82, 79, 88, 73, 77, 65, 84, 69, 76, 217, 65, 80, 80, 82, - 79, 88, 73, 77, 65, 84, 69, 128, 65, 80, 80, 82, 79, 65, 67, 72, 69, 211, - 65, 80, 80, 82, 79, 65, 67, 72, 128, 65, 80, 80, 76, 73, 67, 65, 84, 73, - 79, 78, 128, 65, 80, 80, 76, 73, 67, 65, 84, 73, 79, 206, 65, 80, 79, 84, - 72, 69, 83, 128, 65, 80, 79, 84, 72, 69, 77, 65, 128, 65, 80, 79, 83, 84, - 82, 79, 80, 72, 69, 128, 65, 80, 79, 83, 84, 82, 79, 70, 79, 83, 128, 65, - 80, 79, 83, 84, 82, 79, 70, 79, 211, 65, 80, 79, 83, 84, 82, 79, 70, 79, - 201, 65, 80, 79, 76, 76, 79, 78, 128, 65, 80, 79, 68, 69, 88, 73, 65, - 128, 65, 80, 79, 68, 69, 82, 77, 193, 65, 80, 76, 79, 85, 78, 128, 65, - 80, 76, 201, 65, 80, 204, 65, 80, 73, 78, 128, 65, 80, 69, 83, 207, 65, - 80, 67, 128, 65, 80, 65, 82, 84, 128, 65, 80, 65, 65, 84, 79, 128, 65, - 79, 85, 128, 65, 79, 82, 128, 65, 78, 85, 83, 86, 65, 82, 65, 89, 65, - 128, 65, 78, 85, 83, 86, 65, 82, 65, 128, 65, 78, 85, 83, 86, 65, 82, - 193, 65, 78, 85, 68, 65, 84, 84, 65, 128, 65, 78, 85, 68, 65, 84, 84, - 193, 65, 78, 84, 73, 82, 69, 83, 84, 82, 73, 67, 84, 73, 79, 78, 128, 65, - 78, 84, 73, 77, 79, 78, 89, 45, 50, 128, 65, 78, 84, 73, 77, 79, 78, 89, - 128, 65, 78, 84, 73, 77, 79, 78, 217, 65, 78, 84, 73, 77, 79, 78, 73, 65, - 84, 69, 128, 65, 78, 84, 73, 75, 69, 78, 79, 77, 65, 128, 65, 78, 84, 73, - 75, 69, 78, 79, 75, 89, 76, 73, 83, 77, 65, 128, 65, 78, 84, 73, 70, 79, - 78, 73, 65, 128, 65, 78, 84, 73, 67, 76, 79, 67, 75, 87, 73, 83, 69, 45, - 82, 79, 84, 65, 84, 69, 196, 65, 78, 84, 73, 67, 76, 79, 67, 75, 87, 73, - 83, 69, 128, 65, 78, 84, 73, 67, 76, 79, 67, 75, 87, 73, 83, 197, 65, 78, - 84, 69, 78, 78, 65, 128, 65, 78, 84, 69, 78, 78, 193, 65, 78, 84, 65, 82, - 71, 79, 77, 85, 75, 72, 65, 128, 65, 78, 83, 85, 218, 65, 78, 83, 72, 69, - 128, 65, 78, 80, 69, 65, 128, 65, 78, 207, 65, 78, 78, 85, 73, 84, 217, - 65, 78, 78, 79, 84, 65, 84, 73, 79, 206, 65, 78, 78, 65, 65, 85, 128, 65, - 78, 75, 72, 128, 65, 78, 74, 73, 128, 65, 78, 73, 77, 65, 76, 128, 65, - 78, 72, 85, 128, 65, 78, 71, 85, 76, 65, 82, 128, 65, 78, 71, 85, 73, 83, - 72, 69, 196, 65, 78, 71, 83, 84, 82, 79, 205, 65, 78, 71, 82, 217, 65, - 78, 71, 76, 73, 67, 65, 78, 193, 65, 78, 71, 76, 69, 68, 128, 65, 78, 71, - 76, 69, 196, 65, 78, 71, 75, 72, 65, 78, 75, 72, 85, 128, 65, 78, 71, 75, - 65, 128, 65, 78, 71, 69, 210, 65, 78, 71, 69, 76, 128, 65, 78, 71, 69, - 68, 128, 65, 78, 68, 65, 80, 128, 65, 78, 67, 79, 82, 65, 128, 65, 78, - 67, 72, 79, 82, 128, 65, 78, 65, 84, 82, 73, 67, 72, 73, 83, 77, 65, 128, + 83, 79, 78, 128, 66, 73, 83, 77, 85, 84, 200, 66, 73, 83, 77, 73, 76, 76, + 65, 200, 66, 73, 83, 72, 79, 208, 66, 73, 83, 69, 67, 84, 73, 78, 199, + 66, 73, 83, 65, 72, 128, 66, 73, 82, 85, 128, 66, 73, 82, 84, 72, 68, 65, + 217, 66, 73, 82, 71, 65, 128, 66, 73, 82, 71, 193, 66, 73, 82, 68, 128, + 66, 73, 79, 72, 65, 90, 65, 82, 196, 66, 73, 78, 79, 86, 73, 76, 69, 128, + 66, 73, 78, 79, 67, 85, 76, 65, 210, 66, 73, 78, 68, 73, 78, 199, 66, 73, + 78, 68, 73, 128, 66, 73, 78, 65, 82, 217, 66, 73, 76, 76, 73, 79, 78, 83, + 128, 66, 73, 76, 76, 73, 65, 82, 68, 83, 128, 66, 73, 76, 76, 69, 196, + 66, 73, 76, 65, 66, 73, 65, 204, 66, 73, 75, 73, 78, 73, 128, 66, 73, 71, + 128, 66, 73, 199, 66, 73, 69, 84, 128, 66, 73, 68, 69, 78, 84, 65, 204, + 66, 73, 68, 65, 75, 85, 79, 206, 66, 73, 67, 89, 67, 76, 73, 83, 84, 128, + 66, 73, 67, 89, 67, 76, 69, 83, 128, 66, 73, 67, 89, 67, 76, 69, 128, 66, + 73, 67, 69, 80, 83, 128, 66, 73, 66, 76, 69, 45, 67, 82, 69, 197, 66, 73, + 66, 128, 66, 201, 66, 72, 85, 128, 66, 72, 79, 79, 128, 66, 72, 79, 128, + 66, 72, 73, 128, 66, 72, 69, 84, 72, 128, 66, 72, 69, 69, 128, 66, 72, + 69, 128, 66, 72, 65, 84, 84, 73, 80, 82, 79, 76, 213, 66, 72, 65, 77, + 128, 66, 72, 65, 73, 75, 83, 85, 75, 201, 66, 72, 65, 65, 128, 66, 72, + 65, 128, 66, 69, 89, 89, 65, 76, 128, 66, 69, 88, 128, 66, 69, 86, 69, + 82, 65, 71, 69, 128, 66, 69, 86, 69, 82, 65, 71, 197, 66, 69, 84, 87, 69, + 69, 78, 128, 66, 69, 84, 87, 69, 69, 206, 66, 69, 84, 72, 128, 66, 69, + 84, 65, 128, 66, 69, 84, 193, 66, 69, 212, 66, 69, 83, 73, 68, 197, 66, + 69, 82, 75, 65, 78, 65, 206, 66, 69, 82, 66, 69, 210, 66, 69, 80, 128, + 66, 69, 79, 82, 195, 66, 69, 78, 90, 69, 78, 197, 66, 69, 78, 84, 207, + 66, 69, 78, 84, 128, 66, 69, 78, 212, 66, 69, 78, 71, 65, 76, 201, 66, + 69, 78, 68, 69, 128, 66, 69, 78, 68, 128, 66, 69, 78, 196, 66, 69, 206, + 66, 69, 76, 84, 128, 66, 69, 76, 212, 66, 69, 76, 79, 215, 66, 69, 76, + 76, 72, 79, 208, 66, 69, 76, 76, 128, 66, 69, 76, 204, 66, 69, 76, 71, + 84, 72, 79, 210, 66, 69, 73, 84, 72, 128, 66, 69, 72, 73, 78, 196, 66, + 69, 72, 69, 72, 128, 66, 69, 72, 69, 200, 66, 69, 72, 128, 66, 69, 200, + 66, 69, 71, 73, 78, 78, 73, 78, 71, 128, 66, 69, 71, 73, 78, 78, 69, 82, + 128, 66, 69, 71, 73, 206, 66, 69, 70, 79, 82, 197, 66, 69, 69, 84, 76, + 69, 128, 66, 69, 69, 84, 65, 128, 66, 69, 69, 210, 66, 69, 69, 72, 73, + 86, 69, 128, 66, 69, 69, 72, 128, 66, 69, 69, 200, 66, 69, 67, 65, 85, + 83, 69, 128, 66, 69, 65, 86, 69, 82, 128, 66, 69, 65, 86, 69, 210, 66, + 69, 65, 84, 73, 78, 199, 66, 69, 65, 84, 128, 66, 69, 65, 82, 68, 69, + 196, 66, 69, 65, 82, 128, 66, 69, 65, 210, 66, 69, 65, 78, 128, 66, 69, + 65, 77, 69, 196, 66, 69, 65, 68, 83, 128, 66, 69, 65, 67, 200, 66, 67, + 65, 68, 128, 66, 67, 65, 196, 66, 66, 89, 88, 128, 66, 66, 89, 84, 128, + 66, 66, 89, 80, 128, 66, 66, 89, 128, 66, 66, 85, 88, 128, 66, 66, 85, + 84, 128, 66, 66, 85, 82, 88, 128, 66, 66, 85, 82, 128, 66, 66, 85, 80, + 128, 66, 66, 85, 79, 88, 128, 66, 66, 85, 79, 80, 128, 66, 66, 85, 79, + 128, 66, 66, 85, 128, 66, 66, 79, 88, 128, 66, 66, 79, 84, 128, 66, 66, + 79, 80, 128, 66, 66, 79, 128, 66, 66, 73, 88, 128, 66, 66, 73, 80, 128, + 66, 66, 73, 69, 88, 128, 66, 66, 73, 69, 84, 128, 66, 66, 73, 69, 80, + 128, 66, 66, 73, 69, 128, 66, 66, 73, 128, 66, 66, 69, 88, 128, 66, 66, + 69, 80, 128, 66, 66, 69, 69, 128, 66, 66, 65, 88, 128, 66, 66, 65, 84, + 128, 66, 66, 65, 80, 128, 66, 66, 65, 65, 128, 66, 65, 89, 65, 78, 78, + 65, 128, 66, 65, 85, 128, 66, 65, 84, 84, 69, 82, 89, 128, 66, 65, 84, + 72, 84, 85, 66, 128, 66, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 66, 65, + 84, 72, 128, 66, 65, 84, 200, 66, 65, 84, 65, 203, 66, 65, 83, 83, 65, + 128, 66, 65, 83, 83, 193, 66, 65, 83, 75, 69, 84, 66, 65, 76, 204, 66, + 65, 83, 72, 75, 73, 210, 66, 65, 83, 72, 128, 66, 65, 83, 69, 76, 73, 78, + 197, 66, 65, 83, 69, 66, 65, 76, 76, 128, 66, 65, 83, 69, 128, 66, 65, + 83, 197, 66, 65, 82, 83, 128, 66, 65, 82, 211, 66, 65, 82, 82, 73, 69, + 82, 128, 66, 65, 82, 82, 69, 75, 72, 128, 66, 65, 82, 82, 69, 69, 128, + 66, 65, 82, 82, 69, 197, 66, 65, 82, 76, 73, 78, 69, 128, 66, 65, 82, 76, + 69, 89, 128, 66, 65, 82, 73, 89, 79, 79, 83, 65, 78, 128, 66, 65, 82, 66, + 69, 210, 66, 65, 82, 65, 50, 128, 66, 65, 210, 66, 65, 78, 84, 79, 67, + 128, 66, 65, 78, 75, 78, 79, 84, 197, 66, 65, 78, 75, 128, 66, 65, 78, + 203, 66, 65, 78, 74, 79, 128, 66, 65, 78, 68, 128, 66, 65, 78, 65, 78, + 65, 128, 66, 65, 78, 50, 128, 66, 65, 78, 178, 66, 65, 77, 66, 79, 79, + 83, 128, 66, 65, 77, 66, 79, 79, 128, 66, 65, 76, 85, 68, 65, 128, 66, + 65, 76, 76, 80, 79, 73, 78, 212, 66, 65, 76, 76, 79, 84, 128, 66, 65, 76, + 76, 79, 212, 66, 65, 76, 76, 79, 79, 78, 45, 83, 80, 79, 75, 69, 196, 66, + 65, 76, 76, 79, 79, 78, 128, 66, 65, 76, 76, 69, 212, 66, 65, 76, 68, + 128, 66, 65, 76, 65, 71, 128, 66, 65, 76, 128, 66, 65, 204, 66, 65, 73, + 82, 75, 65, 78, 128, 66, 65, 73, 77, 65, 73, 128, 66, 65, 72, 84, 128, + 66, 65, 72, 73, 82, 71, 79, 77, 85, 75, 72, 65, 128, 66, 65, 72, 65, 82, + 50, 128, 66, 65, 72, 65, 82, 178, 66, 65, 72, 128, 66, 65, 71, 85, 69, + 84, 84, 197, 66, 65, 71, 83, 128, 66, 65, 71, 71, 65, 71, 197, 66, 65, + 71, 69, 76, 128, 66, 65, 71, 65, 128, 66, 65, 71, 51, 128, 66, 65, 199, + 66, 65, 68, 77, 73, 78, 84, 79, 206, 66, 65, 68, 71, 69, 82, 128, 66, 65, + 68, 71, 69, 128, 66, 65, 196, 66, 65, 67, 84, 82, 73, 65, 206, 66, 65, + 67, 79, 78, 128, 66, 65, 67, 75, 87, 65, 82, 68, 128, 66, 65, 67, 75, 83, + 80, 65, 67, 69, 128, 66, 65, 67, 75, 83, 76, 65, 83, 72, 128, 66, 65, 67, + 75, 83, 76, 65, 83, 200, 66, 65, 67, 75, 83, 76, 65, 78, 84, 69, 196, 66, + 65, 67, 75, 72, 65, 78, 196, 66, 65, 67, 75, 45, 84, 73, 76, 84, 69, 196, + 66, 65, 67, 75, 128, 66, 65, 67, 203, 66, 65, 66, 89, 128, 66, 65, 66, + 217, 66, 65, 65, 82, 69, 82, 85, 128, 66, 65, 45, 50, 128, 66, 51, 48, + 53, 128, 66, 50, 53, 180, 66, 50, 52, 183, 66, 50, 52, 179, 66, 50, 52, + 178, 66, 50, 52, 177, 66, 50, 52, 176, 66, 50, 51, 179, 66, 50, 51, 177, + 66, 50, 51, 176, 66, 50, 50, 181, 66, 50, 50, 176, 66, 49, 57, 177, 66, + 49, 55, 182, 66, 49, 55, 179, 66, 49, 54, 57, 128, 66, 49, 54, 56, 128, + 66, 49, 54, 55, 128, 66, 49, 54, 54, 128, 66, 49, 54, 53, 128, 66, 49, + 54, 52, 128, 66, 49, 54, 179, 66, 49, 54, 178, 66, 49, 54, 49, 128, 66, + 49, 54, 48, 128, 66, 49, 53, 185, 66, 49, 53, 56, 128, 66, 49, 53, 55, + 128, 66, 49, 53, 182, 66, 49, 53, 53, 128, 66, 49, 53, 52, 128, 66, 49, + 53, 51, 128, 66, 49, 53, 50, 128, 66, 49, 53, 177, 66, 49, 53, 48, 128, + 66, 49, 52, 54, 128, 66, 49, 52, 181, 66, 49, 52, 50, 128, 66, 49, 52, + 177, 66, 49, 52, 176, 66, 49, 51, 181, 66, 49, 51, 179, 66, 49, 51, 50, + 128, 66, 49, 51, 177, 66, 49, 51, 176, 66, 49, 50, 184, 66, 49, 50, 183, + 66, 49, 50, 181, 66, 49, 50, 179, 66, 49, 50, 178, 66, 49, 50, 177, 66, + 49, 50, 176, 66, 49, 48, 57, 205, 66, 49, 48, 57, 198, 66, 49, 48, 56, + 205, 66, 49, 48, 56, 198, 66, 49, 48, 55, 205, 66, 49, 48, 55, 198, 66, + 49, 48, 54, 205, 66, 49, 48, 54, 198, 66, 49, 48, 53, 205, 66, 49, 48, + 53, 198, 66, 49, 48, 181, 66, 49, 48, 180, 66, 49, 48, 178, 66, 49, 48, + 176, 66, 48, 57, 177, 66, 48, 57, 176, 66, 48, 56, 57, 128, 66, 48, 56, + 183, 66, 48, 56, 54, 128, 66, 48, 56, 181, 66, 48, 56, 51, 128, 66, 48, + 56, 50, 128, 66, 48, 56, 177, 66, 48, 56, 176, 66, 48, 55, 57, 128, 66, + 48, 55, 184, 66, 48, 55, 183, 66, 48, 55, 182, 66, 48, 55, 181, 66, 48, + 55, 180, 66, 48, 55, 179, 66, 48, 55, 178, 66, 48, 55, 177, 66, 48, 55, + 176, 66, 48, 54, 185, 66, 48, 54, 184, 66, 48, 54, 183, 66, 48, 54, 182, + 66, 48, 54, 181, 66, 48, 54, 52, 128, 66, 48, 54, 51, 128, 66, 48, 54, + 178, 66, 48, 54, 177, 66, 48, 54, 176, 66, 48, 53, 185, 66, 48, 53, 184, + 66, 48, 53, 183, 66, 48, 53, 54, 128, 66, 48, 53, 181, 66, 48, 53, 180, + 66, 48, 53, 179, 66, 48, 53, 178, 66, 48, 53, 177, 66, 48, 53, 176, 66, + 48, 52, 57, 128, 66, 48, 52, 184, 66, 48, 52, 55, 128, 66, 48, 52, 182, + 66, 48, 52, 181, 66, 48, 52, 180, 66, 48, 52, 179, 66, 48, 52, 178, 66, + 48, 52, 177, 66, 48, 52, 176, 66, 48, 51, 185, 66, 48, 51, 184, 66, 48, + 51, 183, 66, 48, 51, 182, 66, 48, 51, 52, 128, 66, 48, 51, 179, 66, 48, + 51, 178, 66, 48, 51, 177, 66, 48, 51, 176, 66, 48, 50, 185, 66, 48, 50, + 184, 66, 48, 50, 183, 66, 48, 50, 182, 66, 48, 50, 181, 66, 48, 50, 180, + 66, 48, 50, 179, 66, 48, 50, 50, 128, 66, 48, 50, 177, 66, 48, 50, 176, + 66, 48, 49, 57, 128, 66, 48, 49, 56, 128, 66, 48, 49, 183, 66, 48, 49, + 182, 66, 48, 49, 181, 66, 48, 49, 180, 66, 48, 49, 179, 66, 48, 49, 178, + 66, 48, 49, 177, 66, 48, 49, 176, 66, 48, 48, 57, 128, 66, 48, 48, 185, + 66, 48, 48, 56, 128, 66, 48, 48, 184, 66, 48, 48, 55, 128, 66, 48, 48, + 183, 66, 48, 48, 54, 128, 66, 48, 48, 182, 66, 48, 48, 53, 65, 128, 66, + 48, 48, 53, 128, 66, 48, 48, 181, 66, 48, 48, 52, 128, 66, 48, 48, 180, + 66, 48, 48, 51, 128, 66, 48, 48, 179, 66, 48, 48, 50, 128, 66, 48, 48, + 178, 66, 48, 48, 49, 128, 66, 48, 48, 177, 65, 90, 85, 128, 65, 89, 66, + 128, 65, 89, 65, 72, 128, 65, 88, 69, 128, 65, 87, 69, 128, 65, 87, 65, + 217, 65, 86, 79, 67, 65, 68, 79, 128, 65, 86, 69, 83, 84, 65, 206, 65, + 86, 69, 82, 65, 71, 197, 65, 86, 65, 75, 82, 65, 72, 65, 83, 65, 78, 89, + 65, 128, 65, 86, 65, 71, 82, 65, 72, 65, 128, 65, 85, 89, 65, 78, 78, 65, + 128, 65, 85, 84, 85, 77, 78, 128, 65, 85, 84, 79, 77, 79, 66, 73, 76, 69, + 128, 65, 85, 84, 79, 77, 65, 84, 69, 196, 65, 85, 84, 207, 65, 85, 83, + 84, 82, 65, 204, 65, 85, 82, 73, 80, 73, 71, 77, 69, 78, 84, 128, 65, 85, + 82, 65, 77, 65, 90, 68, 65, 65, 72, 65, 128, 65, 85, 82, 65, 77, 65, 90, + 68, 65, 65, 45, 50, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, 128, 65, + 85, 78, 78, 128, 65, 85, 71, 85, 83, 84, 128, 65, 85, 71, 77, 69, 78, 84, + 65, 84, 73, 79, 206, 65, 85, 69, 128, 65, 85, 66, 69, 82, 71, 73, 78, 69, + 128, 65, 84, 84, 73, 195, 65, 84, 84, 72, 65, 67, 65, 78, 128, 65, 84, + 84, 69, 78, 84, 73, 79, 78, 128, 65, 84, 84, 65, 203, 65, 84, 84, 65, 67, + 72, 69, 196, 65, 84, 79, 205, 65, 84, 78, 65, 200, 65, 84, 77, 65, 65, + 85, 128, 65, 84, 73, 89, 65, 128, 65, 84, 73, 85, 128, 65, 84, 73, 75, + 82, 65, 77, 65, 128, 65, 84, 72, 76, 69, 84, 73, 195, 65, 84, 72, 65, 82, + 86, 65, 86, 69, 68, 73, 195, 65, 84, 72, 65, 80, 65, 83, 67, 65, 206, 65, + 84, 72, 45, 84, 72, 65, 76, 65, 84, 72, 65, 128, 65, 83, 90, 128, 65, 83, + 89, 85, 82, 193, 65, 83, 89, 77, 80, 84, 79, 84, 73, 67, 65, 76, 76, 217, + 65, 83, 84, 82, 79, 78, 79, 77, 73, 67, 65, 204, 65, 83, 84, 82, 79, 76, + 79, 71, 73, 67, 65, 204, 65, 83, 84, 82, 65, 69, 65, 128, 65, 83, 84, 79, + 78, 73, 83, 72, 69, 196, 65, 83, 84, 69, 82, 73, 83, 77, 128, 65, 83, 84, + 69, 82, 73, 83, 75, 211, 65, 83, 84, 69, 82, 73, 83, 75, 128, 65, 83, 84, + 69, 82, 73, 83, 203, 65, 83, 84, 69, 82, 73, 83, 67, 85, 83, 128, 65, 83, + 83, 89, 82, 73, 65, 206, 65, 83, 83, 69, 82, 84, 73, 79, 78, 128, 65, 83, + 80, 73, 82, 65, 84, 73, 79, 78, 128, 65, 83, 80, 73, 82, 65, 84, 69, 196, + 65, 83, 80, 69, 82, 128, 65, 83, 73, 65, 45, 65, 85, 83, 84, 82, 65, 76, + 73, 65, 128, 65, 83, 72, 71, 65, 66, 128, 65, 83, 72, 69, 83, 128, 65, + 83, 72, 57, 128, 65, 83, 72, 51, 128, 65, 83, 72, 178, 65, 83, 67, 73, + 193, 65, 83, 67, 69, 78, 84, 128, 65, 83, 67, 69, 78, 68, 73, 78, 199, + 65, 83, 65, 76, 50, 128, 65, 83, 45, 83, 65, 74, 68, 65, 128, 65, 82, 85, + 72, 85, 65, 128, 65, 82, 84, 211, 65, 82, 84, 73, 83, 212, 65, 82, 84, + 73, 67, 85, 76, 65, 84, 69, 196, 65, 82, 84, 65, 66, 197, 65, 82, 84, 65, + 128, 65, 82, 83, 69, 79, 83, 128, 65, 82, 83, 69, 79, 211, 65, 82, 83, + 69, 78, 73, 67, 128, 65, 82, 82, 79, 87, 83, 128, 65, 82, 82, 79, 87, + 211, 65, 82, 82, 79, 87, 72, 69, 65, 68, 83, 128, 65, 82, 82, 79, 87, 72, + 69, 65, 68, 45, 83, 72, 65, 80, 69, 196, 65, 82, 82, 79, 87, 72, 69, 65, + 68, 128, 65, 82, 82, 79, 87, 72, 69, 65, 196, 65, 82, 82, 79, 87, 45, 84, + 65, 73, 76, 128, 65, 82, 82, 73, 86, 73, 78, 71, 128, 65, 82, 82, 73, 86, + 69, 128, 65, 82, 82, 65, 89, 128, 65, 82, 80, 69, 71, 71, 73, 65, 84, + 207, 65, 82, 79, 85, 83, 73, 78, 199, 65, 82, 79, 85, 82, 193, 65, 82, + 79, 85, 78, 68, 45, 80, 82, 79, 70, 73, 76, 69, 128, 65, 82, 79, 85, 78, + 196, 65, 82, 77, 89, 128, 65, 82, 77, 211, 65, 82, 77, 79, 85, 82, 128, + 65, 82, 77, 69, 78, 73, 65, 206, 65, 82, 77, 128, 65, 82, 205, 65, 82, + 76, 65, 85, 199, 65, 82, 75, 84, 73, 75, 207, 65, 82, 75, 65, 66, 128, + 65, 82, 75, 65, 65, 78, 85, 128, 65, 82, 73, 83, 84, 69, 82, 65, 128, 65, + 82, 73, 83, 84, 69, 82, 193, 65, 82, 73, 69, 83, 128, 65, 82, 71, 79, 84, + 69, 82, 73, 128, 65, 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, 78, 128, + 65, 82, 71, 73, 128, 65, 82, 69, 80, 65, 128, 65, 82, 69, 65, 128, 65, + 82, 68, 72, 65, 86, 73, 83, 65, 82, 71, 65, 128, 65, 82, 68, 72, 65, 67, + 65, 78, 68, 82, 65, 128, 65, 82, 67, 72, 65, 73, 79, 78, 128, 65, 82, 67, + 72, 65, 73, 79, 206, 65, 82, 67, 72, 65, 73, 195, 65, 82, 67, 200, 65, + 82, 67, 128, 65, 82, 195, 65, 82, 65, 77, 65, 73, 195, 65, 82, 65, 69, + 65, 69, 128, 65, 82, 65, 69, 65, 45, 85, 128, 65, 82, 65, 69, 65, 45, 73, + 128, 65, 82, 65, 69, 65, 45, 69, 79, 128, 65, 82, 65, 69, 65, 45, 69, + 128, 65, 82, 65, 69, 65, 45, 65, 128, 65, 82, 65, 68, 128, 65, 82, 65, + 196, 65, 82, 65, 66, 73, 67, 45, 73, 78, 68, 73, 195, 65, 82, 65, 66, 73, + 65, 206, 65, 82, 45, 82, 85, 66, 128, 65, 82, 45, 82, 65, 72, 77, 65, + 206, 65, 82, 45, 82, 65, 72, 69, 69, 77, 128, 65, 81, 85, 65, 82, 73, 85, + 83, 128, 65, 81, 85, 65, 70, 79, 82, 84, 73, 83, 128, 65, 81, 85, 193, + 65, 80, 85, 206, 65, 80, 82, 73, 76, 128, 65, 80, 80, 82, 79, 88, 73, 77, + 65, 84, 69, 76, 217, 65, 80, 80, 82, 79, 88, 73, 77, 65, 84, 69, 128, 65, + 80, 80, 82, 79, 65, 67, 72, 69, 211, 65, 80, 80, 82, 79, 65, 67, 72, 128, + 65, 80, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 65, 80, 80, 76, 73, 67, + 65, 84, 73, 79, 206, 65, 80, 79, 84, 72, 69, 83, 128, 65, 80, 79, 84, 72, + 69, 77, 65, 128, 65, 80, 79, 83, 84, 82, 79, 80, 72, 69, 128, 65, 80, 79, + 83, 84, 82, 79, 70, 79, 83, 128, 65, 80, 79, 83, 84, 82, 79, 70, 79, 211, + 65, 80, 79, 83, 84, 82, 79, 70, 79, 201, 65, 80, 79, 76, 76, 79, 78, 128, + 65, 80, 79, 68, 69, 88, 73, 65, 128, 65, 80, 79, 68, 69, 82, 77, 193, 65, + 80, 76, 79, 85, 78, 128, 65, 80, 76, 201, 65, 80, 204, 65, 80, 73, 78, + 128, 65, 80, 69, 83, 207, 65, 80, 67, 128, 65, 80, 65, 82, 84, 128, 65, + 80, 65, 65, 84, 79, 128, 65, 79, 85, 128, 65, 79, 82, 128, 65, 78, 85, + 83, 86, 65, 82, 65, 89, 65, 128, 65, 78, 85, 83, 86, 65, 82, 65, 128, 65, + 78, 85, 83, 86, 65, 82, 193, 65, 78, 85, 68, 65, 84, 84, 65, 128, 65, 78, + 85, 68, 65, 84, 84, 193, 65, 78, 84, 73, 82, 69, 83, 84, 82, 73, 67, 84, + 73, 79, 78, 128, 65, 78, 84, 73, 77, 79, 78, 89, 45, 50, 128, 65, 78, 84, + 73, 77, 79, 78, 89, 128, 65, 78, 84, 73, 77, 79, 78, 217, 65, 78, 84, 73, + 77, 79, 78, 73, 65, 84, 69, 128, 65, 78, 84, 73, 75, 69, 78, 79, 77, 65, + 128, 65, 78, 84, 73, 75, 69, 78, 79, 75, 89, 76, 73, 83, 77, 65, 128, 65, + 78, 84, 73, 70, 79, 78, 73, 65, 128, 65, 78, 84, 73, 67, 76, 79, 67, 75, + 87, 73, 83, 69, 45, 82, 79, 84, 65, 84, 69, 196, 65, 78, 84, 73, 67, 76, + 79, 67, 75, 87, 73, 83, 69, 128, 65, 78, 84, 73, 67, 76, 79, 67, 75, 87, + 73, 83, 197, 65, 78, 84, 69, 78, 78, 65, 128, 65, 78, 84, 69, 78, 78, + 193, 65, 78, 84, 65, 82, 71, 79, 77, 85, 75, 72, 65, 128, 65, 78, 83, 85, + 218, 65, 78, 83, 72, 69, 128, 65, 78, 80, 69, 65, 128, 65, 78, 207, 65, + 78, 78, 85, 73, 84, 217, 65, 78, 78, 79, 84, 65, 84, 73, 79, 206, 65, 78, + 78, 65, 65, 85, 128, 65, 78, 75, 72, 128, 65, 78, 74, 73, 128, 65, 78, + 73, 77, 65, 76, 128, 65, 78, 72, 85, 128, 65, 78, 71, 85, 76, 65, 82, + 128, 65, 78, 71, 85, 73, 83, 72, 69, 196, 65, 78, 71, 83, 84, 82, 79, + 205, 65, 78, 71, 82, 217, 65, 78, 71, 76, 73, 67, 65, 78, 193, 65, 78, + 71, 76, 69, 68, 128, 65, 78, 71, 76, 69, 196, 65, 78, 71, 75, 72, 65, 78, + 75, 72, 85, 128, 65, 78, 71, 75, 65, 128, 65, 78, 71, 69, 210, 65, 78, + 71, 69, 76, 128, 65, 78, 71, 69, 68, 128, 65, 78, 68, 65, 80, 128, 65, + 78, 67, 79, 82, 65, 128, 65, 78, 67, 72, 79, 82, 128, 65, 78, 65, 84, 82, + 73, 67, 72, 73, 83, 77, 65, 128, 65, 78, 65, 84, 79, 77, 73, 67, 65, 204, 65, 78, 65, 80, 128, 65, 78, 45, 78, 73, 83, 70, 128, 65, 77, 85, 76, 69, 84, 128, 65, 77, 80, 83, 128, 65, 77, 80, 72, 79, 82, 65, 128, 65, 77, 80, 69, 82, 83, 65, 78, 68, 128, 65, 77, 80, 69, 82, 83, 65, 78, 196, 65, @@ -6134,13570 +6632,13634 @@ static const unsigned char lexicon[] = { 65, 76, 69, 82, 84, 128, 65, 76, 69, 80, 72, 128, 65, 76, 69, 77, 66, 73, 67, 128, 65, 76, 69, 70, 128, 65, 76, 66, 65, 78, 73, 65, 206, 65, 76, 65, 89, 72, 69, 128, 65, 76, 65, 89, 72, 197, 65, 76, 65, 82, 205, 65, - 76, 65, 80, 72, 128, 65, 76, 45, 76, 65, 75, 85, 78, 65, 128, 65, 75, 84, - 73, 69, 83, 69, 76, 83, 75, 65, 66, 128, 65, 75, 83, 65, 128, 65, 75, 72, - 77, 73, 77, 73, 195, 65, 75, 66, 65, 210, 65, 75, 65, 82, 65, 128, 65, - 75, 65, 82, 193, 65, 73, 89, 65, 78, 78, 65, 128, 65, 73, 86, 73, 76, 73, - 203, 65, 73, 86, 65, 128, 65, 73, 84, 79, 206, 65, 73, 82, 80, 76, 65, - 78, 69, 128, 65, 73, 82, 80, 76, 65, 78, 197, 65, 73, 78, 213, 65, 73, - 78, 78, 128, 65, 73, 76, 77, 128, 65, 73, 75, 65, 82, 65, 128, 65, 73, - 72, 86, 85, 83, 128, 65, 72, 83, 68, 65, 128, 65, 72, 83, 65, 128, 65, - 72, 79, 205, 65, 72, 65, 78, 199, 65, 72, 65, 71, 71, 65, 210, 65, 72, - 65, 68, 128, 65, 71, 85, 78, 71, 128, 65, 71, 79, 71, 201, 65, 71, 71, - 82, 65, 86, 65, 84, 73, 79, 78, 128, 65, 71, 71, 82, 65, 86, 65, 84, 69, - 196, 65, 71, 65, 73, 78, 83, 212, 65, 71, 65, 73, 78, 128, 65, 70, 84, - 69, 210, 65, 70, 83, 65, 65, 81, 128, 65, 70, 82, 73, 67, 65, 206, 65, - 70, 79, 82, 69, 77, 69, 78, 84, 73, 79, 78, 69, 68, 128, 65, 70, 71, 72, - 65, 78, 201, 65, 70, 70, 82, 73, 67, 65, 84, 73, 79, 206, 65, 70, 70, 73, - 216, 65, 69, 89, 65, 78, 78, 65, 128, 65, 69, 89, 128, 65, 69, 83, 67, - 85, 76, 65, 80, 73, 85, 83, 128, 65, 69, 83, 67, 128, 65, 69, 83, 128, - 65, 69, 82, 73, 65, 204, 65, 69, 82, 128, 65, 69, 76, 65, 45, 80, 73, 76, - 76, 65, 128, 65, 69, 76, 128, 65, 69, 75, 128, 65, 69, 71, 69, 65, 206, - 65, 69, 71, 128, 65, 69, 69, 89, 65, 78, 78, 65, 128, 65, 69, 69, 128, - 65, 69, 68, 65, 45, 80, 73, 76, 76, 65, 128, 65, 69, 68, 128, 65, 69, 66, - 128, 65, 68, 86, 65, 78, 84, 65, 71, 69, 128, 65, 68, 86, 65, 78, 67, 69, - 128, 65, 68, 85, 76, 84, 128, 65, 68, 77, 73, 83, 83, 73, 79, 206, 65, - 68, 77, 69, 84, 79, 83, 128, 65, 68, 76, 65, 205, 65, 68, 72, 69, 83, 73, - 86, 197, 65, 68, 69, 71, 128, 65, 68, 69, 199, 65, 68, 68, 82, 69, 83, - 83, 69, 196, 65, 68, 68, 82, 69, 83, 211, 65, 68, 68, 65, 75, 128, 65, - 68, 65, 203, 65, 67, 85, 84, 69, 45, 77, 65, 67, 82, 79, 78, 128, 65, 67, - 85, 84, 69, 45, 71, 82, 65, 86, 69, 45, 65, 67, 85, 84, 69, 128, 65, 67, - 85, 84, 197, 65, 67, 84, 85, 65, 76, 76, 217, 65, 67, 84, 73, 86, 65, 84, - 197, 65, 67, 82, 79, 80, 72, 79, 78, 73, 195, 65, 67, 75, 78, 79, 87, 76, - 69, 68, 71, 69, 128, 65, 67, 67, 85, 77, 85, 76, 65, 84, 73, 79, 78, 128, - 65, 67, 67, 79, 85, 78, 212, 65, 67, 67, 79, 77, 77, 79, 68, 65, 84, 73, - 79, 78, 128, 65, 67, 67, 69, 80, 84, 128, 65, 67, 67, 69, 78, 84, 45, 83, - 84, 65, 67, 67, 65, 84, 79, 128, 65, 67, 67, 69, 78, 84, 128, 65, 67, 67, - 69, 78, 212, 65, 67, 65, 68, 69, 77, 217, 65, 66, 89, 83, 77, 65, 204, - 65, 66, 85, 78, 68, 65, 78, 67, 69, 128, 65, 66, 75, 72, 65, 83, 73, 65, - 206, 65, 66, 66, 82, 69, 86, 73, 65, 84, 73, 79, 206, 65, 66, 65, 70, 73, - 76, 73, 128, 65, 66, 65, 67, 85, 83, 128, 65, 66, 178, 65, 66, 49, 57, - 49, 128, 65, 66, 49, 56, 56, 128, 65, 66, 49, 56, 48, 128, 65, 66, 49, - 55, 49, 128, 65, 66, 49, 54, 52, 128, 65, 66, 49, 51, 49, 66, 128, 65, - 66, 49, 51, 49, 65, 128, 65, 66, 49, 50, 51, 128, 65, 66, 49, 50, 50, - 128, 65, 66, 49, 50, 48, 128, 65, 66, 49, 49, 56, 128, 65, 66, 48, 56, - 55, 128, 65, 66, 48, 56, 54, 128, 65, 66, 48, 56, 53, 128, 65, 66, 48, - 56, 50, 128, 65, 66, 48, 56, 49, 128, 65, 66, 48, 56, 48, 128, 65, 66, - 48, 55, 57, 128, 65, 66, 48, 55, 56, 128, 65, 66, 48, 55, 55, 128, 65, - 66, 48, 55, 54, 128, 65, 66, 48, 55, 52, 128, 65, 66, 48, 55, 51, 128, - 65, 66, 48, 55, 48, 128, 65, 66, 48, 54, 57, 128, 65, 66, 48, 54, 55, - 128, 65, 66, 48, 54, 54, 128, 65, 66, 48, 54, 53, 128, 65, 66, 48, 54, - 49, 128, 65, 66, 48, 54, 48, 128, 65, 66, 48, 53, 57, 128, 65, 66, 48, - 53, 56, 128, 65, 66, 48, 53, 55, 128, 65, 66, 48, 53, 54, 128, 65, 66, - 48, 53, 53, 128, 65, 66, 48, 53, 52, 128, 65, 66, 48, 53, 51, 128, 65, - 66, 48, 53, 49, 128, 65, 66, 48, 53, 48, 128, 65, 66, 48, 52, 57, 128, - 65, 66, 48, 52, 56, 128, 65, 66, 48, 52, 55, 128, 65, 66, 48, 52, 54, - 128, 65, 66, 48, 52, 53, 128, 65, 66, 48, 52, 52, 128, 65, 66, 48, 52, - 49, 128, 65, 66, 48, 52, 48, 128, 65, 66, 48, 51, 57, 128, 65, 66, 48, - 51, 56, 128, 65, 66, 48, 51, 55, 128, 65, 66, 48, 51, 52, 128, 65, 66, - 48, 51, 49, 128, 65, 66, 48, 51, 48, 128, 65, 66, 48, 50, 57, 128, 65, - 66, 48, 50, 56, 128, 65, 66, 48, 50, 55, 128, 65, 66, 48, 50, 54, 128, - 65, 66, 48, 50, 52, 128, 65, 66, 48, 50, 51, 77, 128, 65, 66, 48, 50, 51, - 128, 65, 66, 48, 50, 50, 77, 128, 65, 66, 48, 50, 50, 70, 128, 65, 66, - 48, 50, 50, 128, 65, 66, 48, 50, 49, 77, 128, 65, 66, 48, 50, 49, 70, - 128, 65, 66, 48, 50, 49, 128, 65, 66, 48, 50, 48, 128, 65, 66, 48, 49, - 55, 128, 65, 66, 48, 49, 54, 128, 65, 66, 48, 49, 51, 128, 65, 66, 48, - 49, 49, 128, 65, 66, 48, 49, 48, 128, 65, 66, 48, 48, 57, 128, 65, 66, - 48, 48, 56, 128, 65, 66, 48, 48, 55, 128, 65, 66, 48, 48, 54, 128, 65, - 66, 48, 48, 53, 128, 65, 66, 48, 48, 52, 128, 65, 66, 48, 48, 51, 128, - 65, 66, 48, 48, 50, 128, 65, 66, 48, 48, 49, 128, 65, 65, 90, 72, 65, 65, - 75, 75, 85, 128, 65, 65, 89, 73, 78, 128, 65, 65, 89, 65, 78, 78, 65, - 128, 65, 65, 89, 128, 65, 65, 87, 128, 65, 65, 79, 128, 65, 65, 74, 128, - 65, 65, 66, 65, 65, 70, 73, 76, 73, 128, 65, 65, 48, 51, 50, 128, 65, 65, - 48, 51, 49, 128, 65, 65, 48, 51, 48, 128, 65, 65, 48, 50, 57, 128, 65, - 65, 48, 50, 56, 128, 65, 65, 48, 50, 55, 128, 65, 65, 48, 50, 54, 128, - 65, 65, 48, 50, 53, 128, 65, 65, 48, 50, 52, 128, 65, 65, 48, 50, 51, - 128, 65, 65, 48, 50, 50, 128, 65, 65, 48, 50, 49, 128, 65, 65, 48, 50, - 48, 128, 65, 65, 48, 49, 57, 128, 65, 65, 48, 49, 56, 128, 65, 65, 48, - 49, 55, 128, 65, 65, 48, 49, 54, 128, 65, 65, 48, 49, 53, 128, 65, 65, - 48, 49, 52, 128, 65, 65, 48, 49, 51, 128, 65, 65, 48, 49, 50, 128, 65, - 65, 48, 49, 49, 128, 65, 65, 48, 49, 48, 128, 65, 65, 48, 48, 57, 128, - 65, 65, 48, 48, 56, 128, 65, 65, 48, 48, 55, 66, 128, 65, 65, 48, 48, 55, - 65, 128, 65, 65, 48, 48, 55, 128, 65, 65, 48, 48, 54, 128, 65, 65, 48, - 48, 53, 128, 65, 65, 48, 48, 52, 128, 65, 65, 48, 48, 51, 128, 65, 65, - 48, 48, 50, 128, 65, 65, 48, 48, 49, 128, 65, 56, 48, 55, 128, 65, 56, - 48, 54, 128, 65, 56, 48, 53, 128, 65, 56, 48, 52, 128, 65, 56, 48, 51, - 128, 65, 56, 48, 50, 128, 65, 56, 48, 49, 128, 65, 56, 48, 48, 128, 65, - 55, 51, 178, 65, 55, 50, 182, 65, 55, 49, 183, 65, 55, 49, 181, 65, 55, - 49, 180, 65, 55, 49, 179, 65, 55, 49, 178, 65, 55, 49, 177, 65, 55, 49, - 176, 65, 55, 48, 57, 45, 182, 65, 55, 48, 57, 45, 180, 65, 55, 48, 57, - 45, 179, 65, 55, 48, 57, 45, 178, 65, 55, 48, 185, 65, 55, 48, 184, 65, - 55, 48, 183, 65, 55, 48, 182, 65, 55, 48, 181, 65, 55, 48, 180, 65, 55, - 48, 179, 65, 55, 48, 178, 65, 55, 48, 177, 65, 54, 54, 52, 128, 65, 54, - 54, 51, 128, 65, 54, 54, 50, 128, 65, 54, 54, 49, 128, 65, 54, 54, 48, - 128, 65, 54, 53, 57, 128, 65, 54, 53, 56, 128, 65, 54, 53, 55, 128, 65, - 54, 53, 54, 128, 65, 54, 53, 53, 128, 65, 54, 53, 52, 128, 65, 54, 53, - 51, 128, 65, 54, 53, 50, 128, 65, 54, 53, 49, 128, 65, 54, 52, 57, 128, - 65, 54, 52, 56, 128, 65, 54, 52, 54, 128, 65, 54, 52, 53, 128, 65, 54, - 52, 52, 128, 65, 54, 52, 51, 128, 65, 54, 52, 50, 128, 65, 54, 52, 48, - 128, 65, 54, 51, 56, 128, 65, 54, 51, 55, 128, 65, 54, 51, 52, 128, 65, - 54, 50, 57, 128, 65, 54, 50, 56, 128, 65, 54, 50, 55, 128, 65, 54, 50, - 54, 128, 65, 54, 50, 52, 128, 65, 54, 50, 51, 128, 65, 54, 50, 50, 128, - 65, 54, 50, 49, 128, 65, 54, 50, 48, 128, 65, 54, 49, 57, 128, 65, 54, - 49, 56, 128, 65, 54, 49, 55, 128, 65, 54, 49, 54, 128, 65, 54, 49, 53, - 128, 65, 54, 49, 52, 128, 65, 54, 49, 51, 128, 65, 54, 49, 50, 128, 65, - 54, 49, 49, 128, 65, 54, 49, 48, 128, 65, 54, 48, 57, 128, 65, 54, 48, - 56, 128, 65, 54, 48, 54, 128, 65, 54, 48, 52, 128, 65, 54, 48, 51, 128, - 65, 54, 48, 50, 128, 65, 54, 48, 49, 128, 65, 54, 48, 48, 128, 65, 53, - 57, 56, 128, 65, 53, 57, 54, 128, 65, 53, 57, 53, 128, 65, 53, 57, 52, - 128, 65, 53, 57, 50, 128, 65, 53, 57, 49, 128, 65, 53, 56, 57, 128, 65, - 53, 56, 56, 128, 65, 53, 56, 55, 128, 65, 53, 56, 54, 128, 65, 53, 56, - 53, 128, 65, 53, 56, 52, 128, 65, 53, 56, 51, 128, 65, 53, 56, 50, 128, - 65, 53, 56, 49, 128, 65, 53, 56, 48, 128, 65, 53, 55, 57, 128, 65, 53, - 55, 56, 128, 65, 53, 55, 55, 128, 65, 53, 55, 54, 128, 65, 53, 55, 53, - 128, 65, 53, 55, 52, 128, 65, 53, 55, 51, 128, 65, 53, 55, 50, 128, 65, - 53, 55, 49, 128, 65, 53, 55, 48, 128, 65, 53, 54, 57, 128, 65, 53, 54, - 56, 128, 65, 53, 54, 54, 128, 65, 53, 54, 53, 128, 65, 53, 54, 52, 128, - 65, 53, 54, 51, 128, 65, 53, 53, 57, 128, 65, 53, 53, 55, 128, 65, 53, - 53, 54, 128, 65, 53, 53, 53, 128, 65, 53, 53, 52, 128, 65, 53, 53, 51, - 128, 65, 53, 53, 50, 128, 65, 53, 53, 49, 128, 65, 53, 53, 48, 128, 65, - 53, 52, 57, 128, 65, 53, 52, 56, 128, 65, 53, 52, 55, 128, 65, 53, 52, - 53, 128, 65, 53, 52, 50, 128, 65, 53, 52, 49, 128, 65, 53, 52, 48, 128, - 65, 53, 51, 57, 128, 65, 53, 51, 56, 128, 65, 53, 51, 55, 128, 65, 53, - 51, 54, 128, 65, 53, 51, 53, 128, 65, 53, 51, 52, 128, 65, 53, 51, 50, - 128, 65, 53, 51, 49, 128, 65, 53, 51, 48, 128, 65, 53, 50, 57, 128, 65, - 53, 50, 56, 128, 65, 53, 50, 55, 128, 65, 53, 50, 54, 128, 65, 53, 50, - 53, 128, 65, 53, 50, 52, 128, 65, 53, 50, 51, 128, 65, 53, 50, 50, 128, - 65, 53, 50, 49, 128, 65, 53, 50, 48, 128, 65, 53, 49, 57, 128, 65, 53, - 49, 56, 128, 65, 53, 49, 55, 128, 65, 53, 49, 54, 128, 65, 53, 49, 53, - 128, 65, 53, 49, 52, 128, 65, 53, 49, 51, 128, 65, 53, 49, 50, 128, 65, - 53, 49, 49, 128, 65, 53, 49, 48, 128, 65, 53, 48, 57, 128, 65, 53, 48, - 56, 128, 65, 53, 48, 55, 128, 65, 53, 48, 54, 128, 65, 53, 48, 53, 128, - 65, 53, 48, 52, 128, 65, 53, 48, 51, 128, 65, 53, 48, 50, 128, 65, 53, - 48, 49, 128, 65, 52, 57, 55, 128, 65, 52, 57, 54, 128, 65, 52, 57, 53, - 128, 65, 52, 57, 52, 128, 65, 52, 57, 51, 128, 65, 52, 57, 50, 128, 65, - 52, 57, 49, 128, 65, 52, 57, 48, 128, 65, 52, 56, 57, 128, 65, 52, 56, - 56, 128, 65, 52, 56, 55, 128, 65, 52, 56, 54, 128, 65, 52, 56, 53, 128, - 65, 52, 56, 52, 128, 65, 52, 56, 51, 128, 65, 52, 56, 50, 128, 65, 52, - 56, 49, 128, 65, 52, 56, 48, 128, 65, 52, 55, 57, 128, 65, 52, 55, 56, - 128, 65, 52, 55, 55, 128, 65, 52, 55, 54, 128, 65, 52, 55, 53, 128, 65, - 52, 55, 52, 128, 65, 52, 55, 51, 128, 65, 52, 55, 50, 128, 65, 52, 55, - 49, 128, 65, 52, 55, 48, 128, 65, 52, 54, 57, 128, 65, 52, 54, 56, 128, - 65, 52, 54, 55, 128, 65, 52, 54, 54, 128, 65, 52, 54, 53, 128, 65, 52, - 54, 52, 128, 65, 52, 54, 51, 128, 65, 52, 54, 50, 128, 65, 52, 54, 49, - 128, 65, 52, 54, 48, 128, 65, 52, 53, 57, 128, 65, 52, 53, 56, 128, 65, - 52, 53, 55, 65, 128, 65, 52, 53, 55, 128, 65, 52, 53, 54, 128, 65, 52, - 53, 53, 128, 65, 52, 53, 52, 128, 65, 52, 53, 51, 128, 65, 52, 53, 50, - 128, 65, 52, 53, 49, 128, 65, 52, 53, 48, 65, 128, 65, 52, 53, 48, 128, - 65, 52, 52, 57, 128, 65, 52, 52, 56, 128, 65, 52, 52, 55, 128, 65, 52, - 52, 54, 128, 65, 52, 52, 53, 128, 65, 52, 52, 52, 128, 65, 52, 52, 51, - 128, 65, 52, 52, 50, 128, 65, 52, 52, 49, 128, 65, 52, 52, 48, 128, 65, - 52, 51, 57, 128, 65, 52, 51, 56, 128, 65, 52, 51, 55, 128, 65, 52, 51, - 54, 128, 65, 52, 51, 53, 128, 65, 52, 51, 52, 128, 65, 52, 51, 51, 128, - 65, 52, 51, 50, 128, 65, 52, 51, 49, 128, 65, 52, 51, 48, 128, 65, 52, - 50, 57, 128, 65, 52, 50, 56, 128, 65, 52, 50, 55, 128, 65, 52, 50, 54, - 128, 65, 52, 50, 53, 128, 65, 52, 50, 52, 128, 65, 52, 50, 51, 128, 65, - 52, 50, 50, 128, 65, 52, 50, 49, 128, 65, 52, 50, 48, 128, 65, 52, 49, - 57, 128, 65, 52, 49, 56, 45, 86, 65, 83, 128, 65, 52, 49, 56, 128, 65, - 52, 49, 55, 45, 86, 65, 83, 128, 65, 52, 49, 55, 128, 65, 52, 49, 54, 45, - 86, 65, 83, 128, 65, 52, 49, 54, 128, 65, 52, 49, 53, 45, 86, 65, 83, - 128, 65, 52, 49, 53, 128, 65, 52, 49, 52, 45, 86, 65, 83, 128, 65, 52, - 49, 52, 128, 65, 52, 49, 51, 45, 86, 65, 83, 128, 65, 52, 49, 51, 128, - 65, 52, 49, 50, 45, 86, 65, 83, 128, 65, 52, 49, 50, 128, 65, 52, 49, 49, - 45, 86, 65, 83, 128, 65, 52, 49, 49, 128, 65, 52, 49, 48, 193, 65, 52, - 49, 48, 45, 86, 65, 83, 128, 65, 52, 49, 176, 65, 52, 48, 57, 45, 86, 65, - 83, 128, 65, 52, 48, 57, 128, 65, 52, 48, 56, 45, 86, 65, 83, 128, 65, - 52, 48, 56, 128, 65, 52, 48, 55, 45, 86, 65, 83, 128, 65, 52, 48, 55, - 128, 65, 52, 48, 54, 45, 86, 65, 83, 128, 65, 52, 48, 54, 128, 65, 52, - 48, 53, 45, 86, 65, 83, 128, 65, 52, 48, 53, 128, 65, 52, 48, 52, 45, 86, - 65, 83, 128, 65, 52, 48, 52, 128, 65, 52, 48, 51, 45, 86, 65, 83, 128, - 65, 52, 48, 51, 128, 65, 52, 48, 50, 45, 86, 65, 83, 128, 65, 52, 48, 50, - 128, 65, 52, 48, 49, 45, 86, 65, 83, 128, 65, 52, 48, 49, 128, 65, 52, - 48, 48, 45, 86, 65, 83, 128, 65, 52, 48, 48, 128, 65, 51, 57, 57, 128, - 65, 51, 57, 56, 128, 65, 51, 57, 55, 128, 65, 51, 57, 54, 128, 65, 51, - 57, 53, 128, 65, 51, 57, 52, 128, 65, 51, 57, 179, 65, 51, 57, 50, 128, - 65, 51, 57, 49, 128, 65, 51, 57, 48, 128, 65, 51, 56, 57, 128, 65, 51, - 56, 56, 128, 65, 51, 56, 55, 128, 65, 51, 56, 54, 65, 128, 65, 51, 56, - 54, 128, 65, 51, 56, 53, 128, 65, 51, 56, 52, 128, 65, 51, 56, 51, 65, - 128, 65, 51, 56, 179, 65, 51, 56, 50, 128, 65, 51, 56, 49, 65, 128, 65, - 51, 56, 49, 128, 65, 51, 56, 48, 128, 65, 51, 55, 57, 128, 65, 51, 55, - 56, 128, 65, 51, 55, 55, 128, 65, 51, 55, 54, 128, 65, 51, 55, 53, 128, - 65, 51, 55, 52, 128, 65, 51, 55, 51, 128, 65, 51, 55, 50, 128, 65, 51, - 55, 49, 65, 128, 65, 51, 55, 49, 128, 65, 51, 55, 48, 128, 65, 51, 54, - 57, 128, 65, 51, 54, 56, 65, 128, 65, 51, 54, 56, 128, 65, 51, 54, 55, - 128, 65, 51, 54, 54, 128, 65, 51, 54, 53, 128, 65, 51, 54, 52, 65, 128, - 65, 51, 54, 52, 128, 65, 51, 54, 51, 128, 65, 51, 54, 50, 128, 65, 51, - 54, 49, 128, 65, 51, 54, 48, 128, 65, 51, 53, 57, 65, 128, 65, 51, 53, - 57, 128, 65, 51, 53, 56, 128, 65, 51, 53, 55, 128, 65, 51, 53, 54, 128, - 65, 51, 53, 53, 128, 65, 51, 53, 52, 128, 65, 51, 53, 51, 128, 65, 51, - 53, 50, 128, 65, 51, 53, 49, 128, 65, 51, 53, 48, 128, 65, 51, 52, 57, - 128, 65, 51, 52, 56, 128, 65, 51, 52, 55, 128, 65, 51, 52, 54, 128, 65, - 51, 52, 53, 128, 65, 51, 52, 52, 128, 65, 51, 52, 51, 128, 65, 51, 52, - 50, 128, 65, 51, 52, 49, 128, 65, 51, 52, 48, 128, 65, 51, 51, 57, 128, - 65, 51, 51, 56, 128, 65, 51, 51, 55, 128, 65, 51, 51, 54, 67, 128, 65, - 51, 51, 54, 66, 128, 65, 51, 51, 54, 65, 128, 65, 51, 51, 54, 128, 65, - 51, 51, 53, 128, 65, 51, 51, 52, 128, 65, 51, 51, 51, 128, 65, 51, 51, - 50, 67, 128, 65, 51, 51, 50, 66, 128, 65, 51, 51, 50, 65, 128, 65, 51, - 51, 50, 128, 65, 51, 51, 49, 128, 65, 51, 51, 48, 128, 65, 51, 50, 57, - 65, 128, 65, 51, 50, 57, 128, 65, 51, 50, 56, 128, 65, 51, 50, 55, 128, - 65, 51, 50, 54, 128, 65, 51, 50, 53, 128, 65, 51, 50, 52, 128, 65, 51, - 50, 51, 128, 65, 51, 50, 50, 128, 65, 51, 50, 49, 128, 65, 51, 50, 48, - 128, 65, 51, 49, 57, 128, 65, 51, 49, 56, 128, 65, 51, 49, 55, 128, 65, - 51, 49, 54, 128, 65, 51, 49, 53, 128, 65, 51, 49, 52, 128, 65, 51, 49, - 51, 67, 128, 65, 51, 49, 51, 66, 128, 65, 51, 49, 51, 65, 128, 65, 51, - 49, 51, 128, 65, 51, 49, 50, 128, 65, 51, 49, 49, 128, 65, 51, 49, 48, - 128, 65, 51, 48, 57, 67, 128, 65, 51, 48, 57, 66, 128, 65, 51, 48, 57, - 65, 128, 65, 51, 48, 57, 128, 65, 51, 48, 56, 128, 65, 51, 48, 55, 128, - 65, 51, 48, 54, 128, 65, 51, 48, 53, 128, 65, 51, 48, 52, 128, 65, 51, - 48, 51, 128, 65, 51, 48, 50, 128, 65, 51, 48, 49, 128, 65, 51, 48, 48, - 128, 65, 50, 57, 57, 65, 128, 65, 50, 57, 57, 128, 65, 50, 57, 56, 128, - 65, 50, 57, 55, 128, 65, 50, 57, 54, 128, 65, 50, 57, 53, 128, 65, 50, - 57, 52, 65, 128, 65, 50, 57, 52, 128, 65, 50, 57, 51, 128, 65, 50, 57, - 50, 128, 65, 50, 57, 49, 128, 65, 50, 57, 48, 128, 65, 50, 56, 57, 65, - 128, 65, 50, 56, 57, 128, 65, 50, 56, 56, 128, 65, 50, 56, 55, 128, 65, - 50, 56, 54, 128, 65, 50, 56, 53, 128, 65, 50, 56, 52, 128, 65, 50, 56, - 51, 128, 65, 50, 56, 50, 128, 65, 50, 56, 49, 128, 65, 50, 56, 48, 128, - 65, 50, 55, 57, 128, 65, 50, 55, 56, 128, 65, 50, 55, 55, 128, 65, 50, - 55, 54, 128, 65, 50, 55, 53, 128, 65, 50, 55, 52, 128, 65, 50, 55, 51, - 128, 65, 50, 55, 50, 128, 65, 50, 55, 49, 128, 65, 50, 55, 48, 128, 65, - 50, 54, 57, 128, 65, 50, 54, 56, 128, 65, 50, 54, 55, 65, 128, 65, 50, - 54, 55, 128, 65, 50, 54, 54, 128, 65, 50, 54, 53, 128, 65, 50, 54, 52, - 128, 65, 50, 54, 51, 128, 65, 50, 54, 50, 128, 65, 50, 54, 49, 128, 65, - 50, 54, 48, 128, 65, 50, 53, 57, 128, 65, 50, 53, 56, 128, 65, 50, 53, - 55, 128, 65, 50, 53, 54, 128, 65, 50, 53, 53, 128, 65, 50, 53, 52, 128, - 65, 50, 53, 51, 128, 65, 50, 53, 50, 128, 65, 50, 53, 49, 128, 65, 50, - 53, 48, 128, 65, 50, 52, 57, 128, 65, 50, 52, 56, 128, 65, 50, 52, 55, - 128, 65, 50, 52, 54, 128, 65, 50, 52, 53, 128, 65, 50, 52, 52, 128, 65, - 50, 52, 51, 128, 65, 50, 52, 50, 128, 65, 50, 52, 49, 128, 65, 50, 52, - 48, 128, 65, 50, 51, 57, 128, 65, 50, 51, 56, 128, 65, 50, 51, 55, 128, - 65, 50, 51, 54, 128, 65, 50, 51, 53, 128, 65, 50, 51, 52, 128, 65, 50, - 51, 51, 128, 65, 50, 51, 50, 128, 65, 50, 51, 49, 128, 65, 50, 51, 48, - 128, 65, 50, 50, 57, 128, 65, 50, 50, 56, 128, 65, 50, 50, 55, 65, 128, - 65, 50, 50, 55, 128, 65, 50, 50, 54, 128, 65, 50, 50, 53, 128, 65, 50, - 50, 52, 128, 65, 50, 50, 51, 128, 65, 50, 50, 50, 128, 65, 50, 50, 49, - 128, 65, 50, 50, 48, 128, 65, 50, 49, 57, 128, 65, 50, 49, 56, 128, 65, - 50, 49, 55, 128, 65, 50, 49, 54, 65, 128, 65, 50, 49, 54, 128, 65, 50, - 49, 53, 65, 128, 65, 50, 49, 53, 128, 65, 50, 49, 52, 128, 65, 50, 49, - 51, 128, 65, 50, 49, 50, 128, 65, 50, 49, 49, 128, 65, 50, 49, 48, 128, - 65, 50, 48, 57, 65, 128, 65, 50, 48, 57, 128, 65, 50, 48, 56, 128, 65, - 50, 48, 55, 65, 128, 65, 50, 48, 55, 128, 65, 50, 48, 54, 128, 65, 50, - 48, 53, 128, 65, 50, 48, 52, 128, 65, 50, 48, 51, 128, 65, 50, 48, 50, - 66, 128, 65, 50, 48, 50, 65, 128, 65, 50, 48, 50, 128, 65, 50, 48, 49, - 128, 65, 50, 48, 48, 128, 65, 49, 57, 57, 128, 65, 49, 57, 56, 128, 65, - 49, 57, 55, 128, 65, 49, 57, 54, 128, 65, 49, 57, 53, 128, 65, 49, 57, - 52, 128, 65, 49, 57, 51, 128, 65, 49, 57, 50, 128, 65, 49, 57, 49, 128, - 65, 49, 57, 48, 128, 65, 49, 56, 57, 128, 65, 49, 56, 56, 128, 65, 49, - 56, 55, 128, 65, 49, 56, 54, 128, 65, 49, 56, 53, 128, 65, 49, 56, 52, - 128, 65, 49, 56, 51, 128, 65, 49, 56, 50, 128, 65, 49, 56, 49, 128, 65, - 49, 56, 48, 128, 65, 49, 55, 57, 128, 65, 49, 55, 56, 128, 65, 49, 55, - 55, 128, 65, 49, 55, 54, 128, 65, 49, 55, 53, 128, 65, 49, 55, 52, 128, - 65, 49, 55, 51, 128, 65, 49, 55, 50, 128, 65, 49, 55, 49, 128, 65, 49, - 55, 48, 128, 65, 49, 54, 57, 128, 65, 49, 54, 56, 128, 65, 49, 54, 55, - 128, 65, 49, 54, 54, 128, 65, 49, 54, 53, 128, 65, 49, 54, 52, 128, 65, - 49, 54, 51, 128, 65, 49, 54, 50, 128, 65, 49, 54, 49, 128, 65, 49, 54, - 48, 128, 65, 49, 53, 57, 128, 65, 49, 53, 56, 128, 65, 49, 53, 55, 128, - 65, 49, 53, 54, 128, 65, 49, 53, 53, 128, 65, 49, 53, 52, 128, 65, 49, - 53, 51, 128, 65, 49, 53, 50, 128, 65, 49, 53, 49, 128, 65, 49, 53, 48, - 128, 65, 49, 52, 57, 128, 65, 49, 52, 56, 128, 65, 49, 52, 55, 128, 65, - 49, 52, 54, 128, 65, 49, 52, 53, 128, 65, 49, 52, 52, 128, 65, 49, 52, - 51, 128, 65, 49, 52, 50, 128, 65, 49, 52, 49, 128, 65, 49, 52, 48, 128, - 65, 49, 51, 57, 128, 65, 49, 51, 56, 128, 65, 49, 51, 55, 128, 65, 49, - 51, 54, 128, 65, 49, 51, 53, 65, 128, 65, 49, 51, 53, 128, 65, 49, 51, - 52, 128, 65, 49, 51, 51, 128, 65, 49, 51, 50, 128, 65, 49, 51, 49, 67, - 128, 65, 49, 51, 49, 128, 65, 49, 51, 48, 128, 65, 49, 50, 57, 128, 65, - 49, 50, 56, 128, 65, 49, 50, 55, 128, 65, 49, 50, 54, 128, 65, 49, 50, - 53, 65, 128, 65, 49, 50, 53, 128, 65, 49, 50, 52, 128, 65, 49, 50, 51, - 128, 65, 49, 50, 50, 128, 65, 49, 50, 49, 128, 65, 49, 50, 48, 66, 128, - 65, 49, 50, 48, 128, 65, 49, 49, 57, 128, 65, 49, 49, 56, 128, 65, 49, - 49, 55, 128, 65, 49, 49, 54, 128, 65, 49, 49, 53, 65, 128, 65, 49, 49, - 53, 128, 65, 49, 49, 52, 128, 65, 49, 49, 51, 128, 65, 49, 49, 50, 128, - 65, 49, 49, 49, 128, 65, 49, 49, 48, 66, 128, 65, 49, 49, 48, 65, 128, - 65, 49, 49, 48, 128, 65, 49, 48, 57, 128, 65, 49, 48, 56, 128, 65, 49, - 48, 55, 67, 128, 65, 49, 48, 55, 66, 128, 65, 49, 48, 55, 65, 128, 65, - 49, 48, 55, 128, 65, 49, 48, 54, 128, 65, 49, 48, 53, 66, 128, 65, 49, - 48, 53, 65, 128, 65, 49, 48, 53, 128, 65, 49, 48, 52, 67, 128, 65, 49, - 48, 52, 66, 128, 65, 49, 48, 52, 65, 128, 65, 49, 48, 52, 128, 65, 49, - 48, 51, 128, 65, 49, 48, 50, 65, 128, 65, 49, 48, 50, 128, 65, 49, 48, - 49, 65, 128, 65, 49, 48, 49, 128, 65, 49, 48, 48, 65, 128, 65, 49, 48, - 48, 45, 49, 48, 50, 128, 65, 49, 48, 48, 128, 65, 48, 57, 57, 128, 65, - 48, 57, 56, 65, 128, 65, 48, 57, 56, 128, 65, 48, 57, 55, 65, 128, 65, - 48, 57, 55, 128, 65, 48, 57, 54, 128, 65, 48, 57, 53, 128, 65, 48, 57, - 52, 128, 65, 48, 57, 51, 128, 65, 48, 57, 50, 128, 65, 48, 57, 49, 128, - 65, 48, 57, 48, 128, 65, 48, 56, 57, 128, 65, 48, 56, 56, 128, 65, 48, - 56, 55, 128, 65, 48, 56, 54, 128, 65, 48, 56, 53, 128, 65, 48, 56, 52, - 128, 65, 48, 56, 51, 128, 65, 48, 56, 50, 128, 65, 48, 56, 49, 128, 65, - 48, 56, 48, 128, 65, 48, 55, 57, 128, 65, 48, 55, 56, 128, 65, 48, 55, - 55, 128, 65, 48, 55, 54, 128, 65, 48, 55, 53, 128, 65, 48, 55, 52, 128, - 65, 48, 55, 51, 128, 65, 48, 55, 50, 128, 65, 48, 55, 49, 128, 65, 48, - 55, 48, 128, 65, 48, 54, 57, 128, 65, 48, 54, 56, 128, 65, 48, 54, 55, - 128, 65, 48, 54, 54, 67, 128, 65, 48, 54, 54, 66, 128, 65, 48, 54, 54, - 65, 128, 65, 48, 54, 54, 128, 65, 48, 54, 53, 128, 65, 48, 54, 52, 128, - 65, 48, 54, 51, 128, 65, 48, 54, 50, 128, 65, 48, 54, 49, 128, 65, 48, - 54, 48, 128, 65, 48, 53, 57, 128, 65, 48, 53, 56, 128, 65, 48, 53, 55, - 128, 65, 48, 53, 54, 128, 65, 48, 53, 53, 128, 65, 48, 53, 52, 128, 65, - 48, 53, 51, 128, 65, 48, 53, 50, 128, 65, 48, 53, 49, 128, 65, 48, 53, - 48, 128, 65, 48, 52, 57, 128, 65, 48, 52, 56, 128, 65, 48, 52, 55, 128, - 65, 48, 52, 54, 66, 128, 65, 48, 52, 54, 65, 128, 65, 48, 52, 54, 128, - 65, 48, 52, 53, 65, 128, 65, 48, 52, 53, 128, 65, 48, 52, 52, 128, 65, - 48, 52, 51, 65, 128, 65, 48, 52, 51, 128, 65, 48, 52, 50, 65, 128, 65, - 48, 52, 50, 128, 65, 48, 52, 49, 65, 128, 65, 48, 52, 49, 128, 65, 48, - 52, 48, 65, 128, 65, 48, 52, 48, 128, 65, 48, 51, 57, 65, 128, 65, 48, - 51, 57, 128, 65, 48, 51, 56, 128, 65, 48, 51, 55, 128, 65, 48, 51, 54, - 128, 65, 48, 51, 53, 128, 65, 48, 51, 52, 128, 65, 48, 51, 51, 128, 65, - 48, 51, 50, 65, 128, 65, 48, 50, 56, 66, 128, 65, 48, 50, 54, 65, 128, - 65, 48, 49, 55, 65, 128, 65, 48, 49, 52, 65, 128, 65, 48, 49, 48, 65, - 128, 65, 48, 48, 54, 66, 128, 65, 48, 48, 54, 65, 128, 65, 48, 48, 53, - 65, 128, 65, 45, 87, 79, 128, 65, 45, 69, 85, 128, 45, 85, 205, 45, 80, - 72, 82, 85, 128, 45, 75, 72, 89, 85, 196, 45, 75, 72, 89, 73, 76, 128, - 45, 68, 90, 85, 196, 45, 67, 72, 65, 210, 45, 67, 72, 65, 76, 128, + 76, 65, 80, 72, 128, 65, 76, 45, 76, 65, 75, 85, 78, 65, 128, 65, 75, 85, + 82, 213, 65, 75, 84, 73, 69, 83, 69, 76, 83, 75, 65, 66, 128, 65, 75, 83, + 65, 128, 65, 75, 72, 77, 73, 77, 73, 195, 65, 75, 66, 65, 210, 65, 75, + 65, 82, 65, 128, 65, 75, 65, 82, 193, 65, 73, 89, 65, 78, 78, 65, 128, + 65, 73, 86, 73, 76, 73, 203, 65, 73, 86, 65, 128, 65, 73, 84, 79, 206, + 65, 73, 82, 80, 76, 65, 78, 69, 128, 65, 73, 82, 80, 76, 65, 78, 197, 65, + 73, 78, 213, 65, 73, 78, 78, 128, 65, 73, 76, 77, 128, 65, 73, 75, 65, + 82, 65, 128, 65, 73, 72, 86, 85, 83, 128, 65, 72, 83, 68, 65, 128, 65, + 72, 83, 65, 128, 65, 72, 79, 205, 65, 72, 65, 78, 199, 65, 72, 65, 71, + 71, 65, 210, 65, 72, 65, 68, 128, 65, 71, 85, 78, 71, 128, 65, 71, 79, + 71, 201, 65, 71, 71, 82, 65, 86, 65, 84, 73, 79, 78, 128, 65, 71, 71, 82, + 65, 86, 65, 84, 69, 196, 65, 71, 65, 73, 78, 83, 212, 65, 71, 65, 73, 78, + 128, 65, 70, 84, 69, 210, 65, 70, 83, 65, 65, 81, 128, 65, 70, 82, 73, + 67, 65, 206, 65, 70, 79, 82, 69, 77, 69, 78, 84, 73, 79, 78, 69, 68, 128, + 65, 70, 71, 72, 65, 78, 201, 65, 70, 70, 82, 73, 67, 65, 84, 73, 79, 206, + 65, 70, 70, 73, 216, 65, 69, 89, 65, 78, 78, 65, 128, 65, 69, 89, 128, + 65, 69, 83, 67, 85, 76, 65, 80, 73, 85, 83, 128, 65, 69, 83, 67, 128, 65, + 69, 83, 128, 65, 69, 82, 73, 65, 204, 65, 69, 82, 128, 65, 69, 76, 65, + 45, 80, 73, 76, 76, 65, 128, 65, 69, 76, 128, 65, 69, 75, 128, 65, 69, + 71, 69, 65, 206, 65, 69, 71, 128, 65, 69, 69, 89, 65, 78, 78, 65, 128, + 65, 69, 69, 128, 65, 69, 68, 65, 45, 80, 73, 76, 76, 65, 128, 65, 69, 68, + 128, 65, 69, 66, 128, 65, 68, 86, 65, 78, 84, 65, 71, 69, 128, 65, 68, + 86, 65, 78, 67, 69, 128, 65, 68, 85, 76, 84, 128, 65, 68, 77, 73, 83, 83, + 73, 79, 206, 65, 68, 77, 69, 84, 79, 83, 128, 65, 68, 76, 65, 205, 65, + 68, 72, 69, 83, 73, 86, 197, 65, 68, 69, 71, 128, 65, 68, 69, 199, 65, + 68, 68, 82, 69, 83, 83, 69, 196, 65, 68, 68, 82, 69, 83, 211, 65, 68, 68, + 65, 75, 128, 65, 68, 65, 203, 65, 67, 85, 84, 69, 45, 77, 65, 67, 82, 79, + 78, 128, 65, 67, 85, 84, 69, 45, 71, 82, 65, 86, 69, 45, 65, 67, 85, 84, + 69, 128, 65, 67, 85, 84, 197, 65, 67, 84, 85, 65, 76, 76, 217, 65, 67, + 84, 73, 86, 65, 84, 197, 65, 67, 82, 79, 80, 72, 79, 78, 73, 195, 65, 67, + 75, 78, 79, 87, 76, 69, 68, 71, 69, 128, 65, 67, 67, 85, 77, 85, 76, 65, + 84, 73, 79, 78, 128, 65, 67, 67, 79, 85, 78, 212, 65, 67, 67, 79, 82, 68, + 73, 79, 78, 128, 65, 67, 67, 79, 77, 77, 79, 68, 65, 84, 73, 79, 78, 128, + 65, 67, 67, 69, 80, 84, 128, 65, 67, 67, 69, 78, 84, 45, 83, 84, 65, 67, + 67, 65, 84, 79, 128, 65, 67, 67, 69, 78, 84, 128, 65, 67, 67, 69, 78, + 212, 65, 67, 65, 68, 69, 77, 217, 65, 66, 89, 83, 77, 65, 204, 65, 66, + 85, 78, 68, 65, 78, 67, 69, 128, 65, 66, 75, 72, 65, 83, 73, 65, 206, 65, + 66, 66, 82, 69, 86, 73, 65, 84, 73, 79, 206, 65, 66, 65, 70, 73, 76, 73, + 128, 65, 66, 65, 67, 85, 83, 128, 65, 66, 178, 65, 66, 49, 57, 49, 128, + 65, 66, 49, 56, 56, 128, 65, 66, 49, 56, 48, 128, 65, 66, 49, 55, 49, + 128, 65, 66, 49, 54, 52, 128, 65, 66, 49, 51, 49, 66, 128, 65, 66, 49, + 51, 49, 65, 128, 65, 66, 49, 50, 51, 128, 65, 66, 49, 50, 50, 128, 65, + 66, 49, 50, 48, 128, 65, 66, 49, 49, 56, 128, 65, 66, 48, 56, 55, 128, + 65, 66, 48, 56, 54, 128, 65, 66, 48, 56, 53, 128, 65, 66, 48, 56, 50, + 128, 65, 66, 48, 56, 49, 128, 65, 66, 48, 56, 48, 128, 65, 66, 48, 55, + 57, 128, 65, 66, 48, 55, 56, 128, 65, 66, 48, 55, 55, 128, 65, 66, 48, + 55, 54, 128, 65, 66, 48, 55, 52, 128, 65, 66, 48, 55, 51, 128, 65, 66, + 48, 55, 48, 128, 65, 66, 48, 54, 57, 128, 65, 66, 48, 54, 55, 128, 65, + 66, 48, 54, 54, 128, 65, 66, 48, 54, 53, 128, 65, 66, 48, 54, 49, 128, + 65, 66, 48, 54, 48, 128, 65, 66, 48, 53, 57, 128, 65, 66, 48, 53, 56, + 128, 65, 66, 48, 53, 55, 128, 65, 66, 48, 53, 54, 128, 65, 66, 48, 53, + 53, 128, 65, 66, 48, 53, 52, 128, 65, 66, 48, 53, 51, 128, 65, 66, 48, + 53, 49, 128, 65, 66, 48, 53, 48, 128, 65, 66, 48, 52, 57, 128, 65, 66, + 48, 52, 56, 128, 65, 66, 48, 52, 55, 128, 65, 66, 48, 52, 54, 128, 65, + 66, 48, 52, 53, 128, 65, 66, 48, 52, 52, 128, 65, 66, 48, 52, 49, 128, + 65, 66, 48, 52, 48, 128, 65, 66, 48, 51, 57, 128, 65, 66, 48, 51, 56, + 128, 65, 66, 48, 51, 55, 128, 65, 66, 48, 51, 52, 128, 65, 66, 48, 51, + 49, 128, 65, 66, 48, 51, 48, 128, 65, 66, 48, 50, 57, 128, 65, 66, 48, + 50, 56, 128, 65, 66, 48, 50, 55, 128, 65, 66, 48, 50, 54, 128, 65, 66, + 48, 50, 52, 128, 65, 66, 48, 50, 51, 77, 128, 65, 66, 48, 50, 51, 128, + 65, 66, 48, 50, 50, 77, 128, 65, 66, 48, 50, 50, 70, 128, 65, 66, 48, 50, + 50, 128, 65, 66, 48, 50, 49, 77, 128, 65, 66, 48, 50, 49, 70, 128, 65, + 66, 48, 50, 49, 128, 65, 66, 48, 50, 48, 128, 65, 66, 48, 49, 55, 128, + 65, 66, 48, 49, 54, 128, 65, 66, 48, 49, 51, 128, 65, 66, 48, 49, 49, + 128, 65, 66, 48, 49, 48, 128, 65, 66, 48, 48, 57, 128, 65, 66, 48, 48, + 56, 128, 65, 66, 48, 48, 55, 128, 65, 66, 48, 48, 54, 128, 65, 66, 48, + 48, 53, 128, 65, 66, 48, 48, 52, 128, 65, 66, 48, 48, 51, 128, 65, 66, + 48, 48, 50, 128, 65, 66, 48, 48, 49, 128, 65, 65, 90, 72, 65, 65, 75, 75, + 85, 128, 65, 65, 89, 73, 78, 128, 65, 65, 89, 65, 78, 78, 65, 128, 65, + 65, 89, 128, 65, 65, 87, 128, 65, 65, 79, 128, 65, 65, 74, 128, 65, 65, + 66, 65, 65, 70, 73, 76, 73, 128, 65, 65, 48, 51, 50, 128, 65, 65, 48, 51, + 49, 128, 65, 65, 48, 51, 48, 128, 65, 65, 48, 50, 57, 128, 65, 65, 48, + 50, 56, 128, 65, 65, 48, 50, 55, 128, 65, 65, 48, 50, 54, 128, 65, 65, + 48, 50, 53, 128, 65, 65, 48, 50, 52, 128, 65, 65, 48, 50, 51, 128, 65, + 65, 48, 50, 50, 128, 65, 65, 48, 50, 49, 128, 65, 65, 48, 50, 48, 128, + 65, 65, 48, 49, 57, 128, 65, 65, 48, 49, 56, 128, 65, 65, 48, 49, 55, + 128, 65, 65, 48, 49, 54, 128, 65, 65, 48, 49, 53, 128, 65, 65, 48, 49, + 52, 128, 65, 65, 48, 49, 51, 128, 65, 65, 48, 49, 50, 128, 65, 65, 48, + 49, 49, 128, 65, 65, 48, 49, 48, 128, 65, 65, 48, 48, 57, 128, 65, 65, + 48, 48, 56, 128, 65, 65, 48, 48, 55, 66, 128, 65, 65, 48, 48, 55, 65, + 128, 65, 65, 48, 48, 55, 128, 65, 65, 48, 48, 54, 128, 65, 65, 48, 48, + 53, 128, 65, 65, 48, 48, 52, 128, 65, 65, 48, 48, 51, 128, 65, 65, 48, + 48, 50, 128, 65, 65, 48, 48, 49, 128, 65, 56, 48, 55, 128, 65, 56, 48, + 54, 128, 65, 56, 48, 53, 128, 65, 56, 48, 52, 128, 65, 56, 48, 51, 128, + 65, 56, 48, 50, 128, 65, 56, 48, 49, 128, 65, 56, 48, 48, 128, 65, 55, + 51, 178, 65, 55, 50, 182, 65, 55, 49, 183, 65, 55, 49, 181, 65, 55, 49, + 180, 65, 55, 49, 179, 65, 55, 49, 178, 65, 55, 49, 177, 65, 55, 49, 176, + 65, 55, 48, 57, 45, 182, 65, 55, 48, 57, 45, 180, 65, 55, 48, 57, 45, + 179, 65, 55, 48, 57, 45, 178, 65, 55, 48, 185, 65, 55, 48, 184, 65, 55, + 48, 183, 65, 55, 48, 182, 65, 55, 48, 181, 65, 55, 48, 180, 65, 55, 48, + 179, 65, 55, 48, 178, 65, 55, 48, 177, 65, 54, 54, 52, 128, 65, 54, 54, + 51, 128, 65, 54, 54, 50, 128, 65, 54, 54, 49, 128, 65, 54, 54, 48, 128, + 65, 54, 53, 57, 128, 65, 54, 53, 56, 128, 65, 54, 53, 55, 128, 65, 54, + 53, 54, 128, 65, 54, 53, 53, 128, 65, 54, 53, 52, 128, 65, 54, 53, 51, + 128, 65, 54, 53, 50, 128, 65, 54, 53, 49, 128, 65, 54, 52, 57, 128, 65, + 54, 52, 56, 128, 65, 54, 52, 54, 128, 65, 54, 52, 53, 128, 65, 54, 52, + 52, 128, 65, 54, 52, 51, 128, 65, 54, 52, 50, 128, 65, 54, 52, 48, 128, + 65, 54, 51, 56, 128, 65, 54, 51, 55, 128, 65, 54, 51, 52, 128, 65, 54, + 50, 57, 128, 65, 54, 50, 56, 128, 65, 54, 50, 55, 128, 65, 54, 50, 54, + 128, 65, 54, 50, 52, 128, 65, 54, 50, 51, 128, 65, 54, 50, 50, 128, 65, + 54, 50, 49, 128, 65, 54, 50, 48, 128, 65, 54, 49, 57, 128, 65, 54, 49, + 56, 128, 65, 54, 49, 55, 128, 65, 54, 49, 54, 128, 65, 54, 49, 53, 128, + 65, 54, 49, 52, 128, 65, 54, 49, 51, 128, 65, 54, 49, 50, 128, 65, 54, + 49, 49, 128, 65, 54, 49, 48, 128, 65, 54, 48, 57, 128, 65, 54, 48, 56, + 128, 65, 54, 48, 54, 128, 65, 54, 48, 52, 128, 65, 54, 48, 51, 128, 65, + 54, 48, 50, 128, 65, 54, 48, 49, 128, 65, 54, 48, 48, 128, 65, 53, 57, + 56, 128, 65, 53, 57, 54, 128, 65, 53, 57, 53, 128, 65, 53, 57, 52, 128, + 65, 53, 57, 50, 128, 65, 53, 57, 49, 128, 65, 53, 56, 57, 128, 65, 53, + 56, 56, 128, 65, 53, 56, 55, 128, 65, 53, 56, 54, 128, 65, 53, 56, 53, + 128, 65, 53, 56, 52, 128, 65, 53, 56, 51, 128, 65, 53, 56, 50, 128, 65, + 53, 56, 49, 128, 65, 53, 56, 48, 128, 65, 53, 55, 57, 128, 65, 53, 55, + 56, 128, 65, 53, 55, 55, 128, 65, 53, 55, 54, 128, 65, 53, 55, 53, 128, + 65, 53, 55, 52, 128, 65, 53, 55, 51, 128, 65, 53, 55, 50, 128, 65, 53, + 55, 49, 128, 65, 53, 55, 48, 128, 65, 53, 54, 57, 128, 65, 53, 54, 56, + 128, 65, 53, 54, 54, 128, 65, 53, 54, 53, 128, 65, 53, 54, 52, 128, 65, + 53, 54, 51, 128, 65, 53, 53, 57, 128, 65, 53, 53, 55, 128, 65, 53, 53, + 54, 128, 65, 53, 53, 53, 128, 65, 53, 53, 52, 128, 65, 53, 53, 51, 128, + 65, 53, 53, 50, 128, 65, 53, 53, 49, 128, 65, 53, 53, 48, 128, 65, 53, + 52, 57, 128, 65, 53, 52, 56, 128, 65, 53, 52, 55, 128, 65, 53, 52, 53, + 128, 65, 53, 52, 50, 128, 65, 53, 52, 49, 128, 65, 53, 52, 48, 128, 65, + 53, 51, 57, 128, 65, 53, 51, 56, 128, 65, 53, 51, 55, 128, 65, 53, 51, + 54, 128, 65, 53, 51, 53, 128, 65, 53, 51, 52, 128, 65, 53, 51, 50, 128, + 65, 53, 51, 49, 128, 65, 53, 51, 48, 128, 65, 53, 50, 57, 128, 65, 53, + 50, 56, 128, 65, 53, 50, 55, 128, 65, 53, 50, 54, 128, 65, 53, 50, 53, + 128, 65, 53, 50, 52, 128, 65, 53, 50, 51, 128, 65, 53, 50, 50, 128, 65, + 53, 50, 49, 128, 65, 53, 50, 48, 128, 65, 53, 49, 57, 128, 65, 53, 49, + 56, 128, 65, 53, 49, 55, 128, 65, 53, 49, 54, 128, 65, 53, 49, 53, 128, + 65, 53, 49, 52, 128, 65, 53, 49, 51, 128, 65, 53, 49, 50, 128, 65, 53, + 49, 49, 128, 65, 53, 49, 48, 128, 65, 53, 48, 57, 128, 65, 53, 48, 56, + 128, 65, 53, 48, 55, 128, 65, 53, 48, 54, 128, 65, 53, 48, 53, 128, 65, + 53, 48, 52, 128, 65, 53, 48, 51, 128, 65, 53, 48, 50, 128, 65, 53, 48, + 49, 128, 65, 52, 57, 55, 128, 65, 52, 57, 54, 128, 65, 52, 57, 53, 128, + 65, 52, 57, 52, 128, 65, 52, 57, 51, 128, 65, 52, 57, 50, 128, 65, 52, + 57, 49, 128, 65, 52, 57, 48, 128, 65, 52, 56, 57, 128, 65, 52, 56, 56, + 128, 65, 52, 56, 55, 128, 65, 52, 56, 54, 128, 65, 52, 56, 53, 128, 65, + 52, 56, 52, 128, 65, 52, 56, 51, 128, 65, 52, 56, 50, 128, 65, 52, 56, + 49, 128, 65, 52, 56, 48, 128, 65, 52, 55, 57, 128, 65, 52, 55, 56, 128, + 65, 52, 55, 55, 128, 65, 52, 55, 54, 128, 65, 52, 55, 53, 128, 65, 52, + 55, 52, 128, 65, 52, 55, 51, 128, 65, 52, 55, 50, 128, 65, 52, 55, 49, + 128, 65, 52, 55, 48, 128, 65, 52, 54, 57, 128, 65, 52, 54, 56, 128, 65, + 52, 54, 55, 128, 65, 52, 54, 54, 128, 65, 52, 54, 53, 128, 65, 52, 54, + 52, 128, 65, 52, 54, 51, 128, 65, 52, 54, 50, 128, 65, 52, 54, 49, 128, + 65, 52, 54, 48, 128, 65, 52, 53, 57, 128, 65, 52, 53, 56, 128, 65, 52, + 53, 55, 65, 128, 65, 52, 53, 55, 128, 65, 52, 53, 54, 128, 65, 52, 53, + 53, 128, 65, 52, 53, 52, 128, 65, 52, 53, 51, 128, 65, 52, 53, 50, 128, + 65, 52, 53, 49, 128, 65, 52, 53, 48, 65, 128, 65, 52, 53, 48, 128, 65, + 52, 52, 57, 128, 65, 52, 52, 56, 128, 65, 52, 52, 55, 128, 65, 52, 52, + 54, 128, 65, 52, 52, 53, 128, 65, 52, 52, 52, 128, 65, 52, 52, 51, 128, + 65, 52, 52, 50, 128, 65, 52, 52, 49, 128, 65, 52, 52, 48, 128, 65, 52, + 51, 57, 128, 65, 52, 51, 56, 128, 65, 52, 51, 55, 128, 65, 52, 51, 54, + 128, 65, 52, 51, 53, 128, 65, 52, 51, 52, 128, 65, 52, 51, 51, 128, 65, + 52, 51, 50, 128, 65, 52, 51, 49, 128, 65, 52, 51, 48, 128, 65, 52, 50, + 57, 128, 65, 52, 50, 56, 128, 65, 52, 50, 55, 128, 65, 52, 50, 54, 128, + 65, 52, 50, 53, 128, 65, 52, 50, 52, 128, 65, 52, 50, 51, 128, 65, 52, + 50, 50, 128, 65, 52, 50, 49, 128, 65, 52, 50, 48, 128, 65, 52, 49, 57, + 128, 65, 52, 49, 56, 45, 86, 65, 83, 128, 65, 52, 49, 56, 128, 65, 52, + 49, 55, 45, 86, 65, 83, 128, 65, 52, 49, 55, 128, 65, 52, 49, 54, 45, 86, + 65, 83, 128, 65, 52, 49, 54, 128, 65, 52, 49, 53, 45, 86, 65, 83, 128, + 65, 52, 49, 53, 128, 65, 52, 49, 52, 45, 86, 65, 83, 128, 65, 52, 49, 52, + 128, 65, 52, 49, 51, 45, 86, 65, 83, 128, 65, 52, 49, 51, 128, 65, 52, + 49, 50, 45, 86, 65, 83, 128, 65, 52, 49, 50, 128, 65, 52, 49, 49, 45, 86, + 65, 83, 128, 65, 52, 49, 49, 128, 65, 52, 49, 48, 193, 65, 52, 49, 48, + 45, 86, 65, 83, 128, 65, 52, 49, 176, 65, 52, 48, 57, 45, 86, 65, 83, + 128, 65, 52, 48, 57, 128, 65, 52, 48, 56, 45, 86, 65, 83, 128, 65, 52, + 48, 56, 128, 65, 52, 48, 55, 45, 86, 65, 83, 128, 65, 52, 48, 55, 128, + 65, 52, 48, 54, 45, 86, 65, 83, 128, 65, 52, 48, 54, 128, 65, 52, 48, 53, + 45, 86, 65, 83, 128, 65, 52, 48, 53, 128, 65, 52, 48, 52, 45, 86, 65, 83, + 128, 65, 52, 48, 52, 128, 65, 52, 48, 51, 45, 86, 65, 83, 128, 65, 52, + 48, 51, 128, 65, 52, 48, 50, 45, 86, 65, 83, 128, 65, 52, 48, 50, 128, + 65, 52, 48, 49, 45, 86, 65, 83, 128, 65, 52, 48, 49, 128, 65, 52, 48, 48, + 45, 86, 65, 83, 128, 65, 52, 48, 48, 128, 65, 51, 57, 57, 128, 65, 51, + 57, 56, 128, 65, 51, 57, 55, 128, 65, 51, 57, 54, 128, 65, 51, 57, 53, + 128, 65, 51, 57, 52, 128, 65, 51, 57, 179, 65, 51, 57, 50, 128, 65, 51, + 57, 49, 128, 65, 51, 57, 48, 128, 65, 51, 56, 57, 128, 65, 51, 56, 56, + 128, 65, 51, 56, 55, 128, 65, 51, 56, 54, 65, 128, 65, 51, 56, 54, 128, + 65, 51, 56, 53, 128, 65, 51, 56, 52, 128, 65, 51, 56, 51, 65, 128, 65, + 51, 56, 179, 65, 51, 56, 50, 128, 65, 51, 56, 49, 65, 128, 65, 51, 56, + 49, 128, 65, 51, 56, 48, 128, 65, 51, 55, 57, 128, 65, 51, 55, 56, 128, + 65, 51, 55, 55, 128, 65, 51, 55, 54, 128, 65, 51, 55, 53, 128, 65, 51, + 55, 52, 128, 65, 51, 55, 51, 128, 65, 51, 55, 50, 128, 65, 51, 55, 49, + 65, 128, 65, 51, 55, 49, 128, 65, 51, 55, 48, 128, 65, 51, 54, 57, 128, + 65, 51, 54, 56, 65, 128, 65, 51, 54, 56, 128, 65, 51, 54, 55, 128, 65, + 51, 54, 54, 128, 65, 51, 54, 53, 128, 65, 51, 54, 52, 65, 128, 65, 51, + 54, 52, 128, 65, 51, 54, 51, 128, 65, 51, 54, 50, 128, 65, 51, 54, 49, + 128, 65, 51, 54, 48, 128, 65, 51, 53, 57, 65, 128, 65, 51, 53, 57, 128, + 65, 51, 53, 56, 128, 65, 51, 53, 55, 128, 65, 51, 53, 54, 128, 65, 51, + 53, 53, 128, 65, 51, 53, 52, 128, 65, 51, 53, 51, 128, 65, 51, 53, 50, + 128, 65, 51, 53, 49, 128, 65, 51, 53, 48, 128, 65, 51, 52, 57, 128, 65, + 51, 52, 56, 128, 65, 51, 52, 55, 128, 65, 51, 52, 54, 128, 65, 51, 52, + 53, 128, 65, 51, 52, 52, 128, 65, 51, 52, 51, 128, 65, 51, 52, 50, 128, + 65, 51, 52, 49, 128, 65, 51, 52, 48, 128, 65, 51, 51, 57, 128, 65, 51, + 51, 56, 128, 65, 51, 51, 55, 128, 65, 51, 51, 54, 67, 128, 65, 51, 51, + 54, 66, 128, 65, 51, 51, 54, 65, 128, 65, 51, 51, 54, 128, 65, 51, 51, + 53, 128, 65, 51, 51, 52, 128, 65, 51, 51, 51, 128, 65, 51, 51, 50, 67, + 128, 65, 51, 51, 50, 66, 128, 65, 51, 51, 50, 65, 128, 65, 51, 51, 50, + 128, 65, 51, 51, 49, 128, 65, 51, 51, 48, 128, 65, 51, 50, 57, 65, 128, + 65, 51, 50, 57, 128, 65, 51, 50, 56, 128, 65, 51, 50, 55, 128, 65, 51, + 50, 54, 128, 65, 51, 50, 53, 128, 65, 51, 50, 52, 128, 65, 51, 50, 51, + 128, 65, 51, 50, 50, 128, 65, 51, 50, 49, 128, 65, 51, 50, 48, 128, 65, + 51, 49, 57, 128, 65, 51, 49, 56, 128, 65, 51, 49, 55, 128, 65, 51, 49, + 54, 128, 65, 51, 49, 53, 128, 65, 51, 49, 52, 128, 65, 51, 49, 51, 67, + 128, 65, 51, 49, 51, 66, 128, 65, 51, 49, 51, 65, 128, 65, 51, 49, 51, + 128, 65, 51, 49, 50, 128, 65, 51, 49, 49, 128, 65, 51, 49, 48, 128, 65, + 51, 48, 57, 67, 128, 65, 51, 48, 57, 66, 128, 65, 51, 48, 57, 65, 128, + 65, 51, 48, 57, 128, 65, 51, 48, 56, 128, 65, 51, 48, 55, 128, 65, 51, + 48, 54, 128, 65, 51, 48, 53, 128, 65, 51, 48, 52, 128, 65, 51, 48, 51, + 128, 65, 51, 48, 50, 128, 65, 51, 48, 49, 128, 65, 51, 48, 48, 128, 65, + 50, 57, 57, 65, 128, 65, 50, 57, 57, 128, 65, 50, 57, 56, 128, 65, 50, + 57, 55, 128, 65, 50, 57, 54, 128, 65, 50, 57, 53, 128, 65, 50, 57, 52, + 65, 128, 65, 50, 57, 52, 128, 65, 50, 57, 51, 128, 65, 50, 57, 50, 128, + 65, 50, 57, 49, 128, 65, 50, 57, 48, 128, 65, 50, 56, 57, 65, 128, 65, + 50, 56, 57, 128, 65, 50, 56, 56, 128, 65, 50, 56, 55, 128, 65, 50, 56, + 54, 128, 65, 50, 56, 53, 128, 65, 50, 56, 52, 128, 65, 50, 56, 51, 128, + 65, 50, 56, 50, 128, 65, 50, 56, 49, 128, 65, 50, 56, 48, 128, 65, 50, + 55, 57, 128, 65, 50, 55, 56, 128, 65, 50, 55, 55, 128, 65, 50, 55, 54, + 128, 65, 50, 55, 53, 128, 65, 50, 55, 52, 128, 65, 50, 55, 51, 128, 65, + 50, 55, 50, 128, 65, 50, 55, 49, 128, 65, 50, 55, 48, 128, 65, 50, 54, + 57, 128, 65, 50, 54, 56, 128, 65, 50, 54, 55, 65, 128, 65, 50, 54, 55, + 128, 65, 50, 54, 54, 128, 65, 50, 54, 53, 128, 65, 50, 54, 52, 128, 65, + 50, 54, 51, 128, 65, 50, 54, 50, 128, 65, 50, 54, 49, 128, 65, 50, 54, + 48, 128, 65, 50, 53, 57, 128, 65, 50, 53, 56, 128, 65, 50, 53, 55, 128, + 65, 50, 53, 54, 128, 65, 50, 53, 53, 128, 65, 50, 53, 52, 128, 65, 50, + 53, 51, 128, 65, 50, 53, 50, 128, 65, 50, 53, 49, 128, 65, 50, 53, 48, + 128, 65, 50, 52, 57, 128, 65, 50, 52, 56, 128, 65, 50, 52, 55, 128, 65, + 50, 52, 54, 128, 65, 50, 52, 53, 128, 65, 50, 52, 52, 128, 65, 50, 52, + 51, 128, 65, 50, 52, 50, 128, 65, 50, 52, 49, 128, 65, 50, 52, 48, 128, + 65, 50, 51, 57, 128, 65, 50, 51, 56, 128, 65, 50, 51, 55, 128, 65, 50, + 51, 54, 128, 65, 50, 51, 53, 128, 65, 50, 51, 52, 128, 65, 50, 51, 51, + 128, 65, 50, 51, 50, 128, 65, 50, 51, 49, 128, 65, 50, 51, 48, 128, 65, + 50, 50, 57, 128, 65, 50, 50, 56, 128, 65, 50, 50, 55, 65, 128, 65, 50, + 50, 55, 128, 65, 50, 50, 54, 128, 65, 50, 50, 53, 128, 65, 50, 50, 52, + 128, 65, 50, 50, 51, 128, 65, 50, 50, 50, 128, 65, 50, 50, 49, 128, 65, + 50, 50, 48, 128, 65, 50, 49, 57, 128, 65, 50, 49, 56, 128, 65, 50, 49, + 55, 128, 65, 50, 49, 54, 65, 128, 65, 50, 49, 54, 128, 65, 50, 49, 53, + 65, 128, 65, 50, 49, 53, 128, 65, 50, 49, 52, 128, 65, 50, 49, 51, 128, + 65, 50, 49, 50, 128, 65, 50, 49, 49, 128, 65, 50, 49, 48, 128, 65, 50, + 48, 57, 65, 128, 65, 50, 48, 57, 128, 65, 50, 48, 56, 128, 65, 50, 48, + 55, 65, 128, 65, 50, 48, 55, 128, 65, 50, 48, 54, 128, 65, 50, 48, 53, + 128, 65, 50, 48, 52, 128, 65, 50, 48, 51, 128, 65, 50, 48, 50, 66, 128, + 65, 50, 48, 50, 65, 128, 65, 50, 48, 50, 128, 65, 50, 48, 49, 128, 65, + 50, 48, 48, 128, 65, 49, 57, 57, 128, 65, 49, 57, 56, 128, 65, 49, 57, + 55, 128, 65, 49, 57, 54, 128, 65, 49, 57, 53, 128, 65, 49, 57, 52, 128, + 65, 49, 57, 51, 128, 65, 49, 57, 50, 128, 65, 49, 57, 49, 128, 65, 49, + 57, 48, 128, 65, 49, 56, 57, 128, 65, 49, 56, 56, 128, 65, 49, 56, 55, + 128, 65, 49, 56, 54, 128, 65, 49, 56, 53, 128, 65, 49, 56, 52, 128, 65, + 49, 56, 51, 128, 65, 49, 56, 50, 128, 65, 49, 56, 49, 128, 65, 49, 56, + 48, 128, 65, 49, 55, 57, 128, 65, 49, 55, 56, 128, 65, 49, 55, 55, 128, + 65, 49, 55, 54, 128, 65, 49, 55, 53, 128, 65, 49, 55, 52, 128, 65, 49, + 55, 51, 128, 65, 49, 55, 50, 128, 65, 49, 55, 49, 128, 65, 49, 55, 48, + 128, 65, 49, 54, 57, 128, 65, 49, 54, 56, 128, 65, 49, 54, 55, 128, 65, + 49, 54, 54, 128, 65, 49, 54, 53, 128, 65, 49, 54, 52, 128, 65, 49, 54, + 51, 128, 65, 49, 54, 50, 128, 65, 49, 54, 49, 128, 65, 49, 54, 48, 128, + 65, 49, 53, 57, 128, 65, 49, 53, 56, 128, 65, 49, 53, 55, 128, 65, 49, + 53, 54, 128, 65, 49, 53, 53, 128, 65, 49, 53, 52, 128, 65, 49, 53, 51, + 128, 65, 49, 53, 50, 128, 65, 49, 53, 49, 128, 65, 49, 53, 48, 128, 65, + 49, 52, 57, 128, 65, 49, 52, 56, 128, 65, 49, 52, 55, 128, 65, 49, 52, + 54, 128, 65, 49, 52, 53, 128, 65, 49, 52, 52, 128, 65, 49, 52, 51, 128, + 65, 49, 52, 50, 128, 65, 49, 52, 49, 128, 65, 49, 52, 48, 128, 65, 49, + 51, 57, 128, 65, 49, 51, 56, 128, 65, 49, 51, 55, 128, 65, 49, 51, 54, + 128, 65, 49, 51, 53, 65, 128, 65, 49, 51, 53, 128, 65, 49, 51, 52, 128, + 65, 49, 51, 51, 128, 65, 49, 51, 50, 128, 65, 49, 51, 49, 67, 128, 65, + 49, 51, 49, 128, 65, 49, 51, 48, 128, 65, 49, 50, 57, 128, 65, 49, 50, + 56, 128, 65, 49, 50, 55, 128, 65, 49, 50, 54, 128, 65, 49, 50, 53, 65, + 128, 65, 49, 50, 53, 128, 65, 49, 50, 52, 128, 65, 49, 50, 51, 128, 65, + 49, 50, 50, 128, 65, 49, 50, 49, 128, 65, 49, 50, 48, 66, 128, 65, 49, + 50, 48, 128, 65, 49, 49, 57, 128, 65, 49, 49, 56, 128, 65, 49, 49, 55, + 128, 65, 49, 49, 54, 128, 65, 49, 49, 53, 65, 128, 65, 49, 49, 53, 128, + 65, 49, 49, 52, 128, 65, 49, 49, 51, 128, 65, 49, 49, 50, 128, 65, 49, + 49, 49, 128, 65, 49, 49, 48, 66, 128, 65, 49, 49, 48, 65, 128, 65, 49, + 49, 48, 128, 65, 49, 48, 57, 128, 65, 49, 48, 56, 128, 65, 49, 48, 55, + 67, 128, 65, 49, 48, 55, 66, 128, 65, 49, 48, 55, 65, 128, 65, 49, 48, + 55, 128, 65, 49, 48, 54, 128, 65, 49, 48, 53, 66, 128, 65, 49, 48, 53, + 65, 128, 65, 49, 48, 53, 128, 65, 49, 48, 52, 67, 128, 65, 49, 48, 52, + 66, 128, 65, 49, 48, 52, 65, 128, 65, 49, 48, 52, 128, 65, 49, 48, 51, + 128, 65, 49, 48, 50, 65, 128, 65, 49, 48, 50, 128, 65, 49, 48, 49, 65, + 128, 65, 49, 48, 49, 128, 65, 49, 48, 48, 65, 128, 65, 49, 48, 48, 45, + 49, 48, 50, 128, 65, 49, 48, 48, 128, 65, 48, 57, 57, 128, 65, 48, 57, + 56, 65, 128, 65, 48, 57, 56, 128, 65, 48, 57, 55, 65, 128, 65, 48, 57, + 55, 128, 65, 48, 57, 54, 128, 65, 48, 57, 53, 128, 65, 48, 57, 52, 128, + 65, 48, 57, 51, 128, 65, 48, 57, 50, 128, 65, 48, 57, 49, 128, 65, 48, + 57, 48, 128, 65, 48, 56, 57, 128, 65, 48, 56, 56, 128, 65, 48, 56, 55, + 128, 65, 48, 56, 54, 128, 65, 48, 56, 53, 128, 65, 48, 56, 52, 128, 65, + 48, 56, 51, 128, 65, 48, 56, 50, 128, 65, 48, 56, 49, 128, 65, 48, 56, + 48, 128, 65, 48, 55, 57, 128, 65, 48, 55, 56, 128, 65, 48, 55, 55, 128, + 65, 48, 55, 54, 128, 65, 48, 55, 53, 128, 65, 48, 55, 52, 128, 65, 48, + 55, 51, 128, 65, 48, 55, 50, 128, 65, 48, 55, 49, 128, 65, 48, 55, 48, + 128, 65, 48, 54, 57, 128, 65, 48, 54, 56, 128, 65, 48, 54, 55, 128, 65, + 48, 54, 54, 67, 128, 65, 48, 54, 54, 66, 128, 65, 48, 54, 54, 65, 128, + 65, 48, 54, 54, 128, 65, 48, 54, 53, 128, 65, 48, 54, 52, 128, 65, 48, + 54, 51, 128, 65, 48, 54, 50, 128, 65, 48, 54, 49, 128, 65, 48, 54, 48, + 128, 65, 48, 53, 57, 128, 65, 48, 53, 56, 128, 65, 48, 53, 55, 128, 65, + 48, 53, 54, 128, 65, 48, 53, 53, 128, 65, 48, 53, 52, 128, 65, 48, 53, + 51, 128, 65, 48, 53, 50, 128, 65, 48, 53, 49, 128, 65, 48, 53, 48, 128, + 65, 48, 52, 57, 128, 65, 48, 52, 56, 128, 65, 48, 52, 55, 128, 65, 48, + 52, 54, 66, 128, 65, 48, 52, 54, 65, 128, 65, 48, 52, 54, 128, 65, 48, + 52, 53, 65, 128, 65, 48, 52, 53, 128, 65, 48, 52, 52, 128, 65, 48, 52, + 51, 65, 128, 65, 48, 52, 51, 128, 65, 48, 52, 50, 65, 128, 65, 48, 52, + 50, 128, 65, 48, 52, 49, 65, 128, 65, 48, 52, 49, 128, 65, 48, 52, 48, + 65, 128, 65, 48, 52, 48, 128, 65, 48, 51, 57, 65, 128, 65, 48, 51, 57, + 128, 65, 48, 51, 56, 128, 65, 48, 51, 55, 128, 65, 48, 51, 54, 128, 65, + 48, 51, 53, 128, 65, 48, 51, 52, 128, 65, 48, 51, 51, 128, 65, 48, 51, + 50, 65, 128, 65, 48, 50, 56, 66, 128, 65, 48, 50, 54, 65, 128, 65, 48, + 49, 55, 65, 128, 65, 48, 49, 52, 65, 128, 65, 48, 49, 48, 65, 128, 65, + 48, 48, 54, 66, 128, 65, 48, 48, 54, 65, 128, 65, 48, 48, 53, 65, 128, + 65, 45, 87, 79, 128, 65, 45, 69, 85, 128, 45, 85, 205, 45, 80, 72, 82, + 85, 128, 45, 75, 72, 89, 85, 196, 45, 75, 72, 89, 73, 76, 128, 45, 68, + 90, 85, 196, 45, 67, 72, 65, 210, 45, 67, 72, 65, 76, 128, }; static const unsigned int lexicon_offset[] = { - 0, 0, 6, 10, 14, 19, 27, 34, 44, 49, 55, 64, 66, 69, 81, 89, 102, 108, - 113, 118, 124, 129, 137, 146, 157, 162, 167, 170, 174, 183, 189, 195, - 201, 206, 214, 221, 229, 171, 232, 241, 242, 250, 256, 261, 266, 273, - 283, 290, 296, 301, 304, 308, 314, 320, 325, 328, 333, 343, 349, 354, - 359, 365, 370, 379, 381, 388, 395, 397, 406, 347, 408, 416, 424, 426, - 434, 435, 442, 445, 447, 452, 458, 465, 470, 477, 485, 492, 497, 502, - 506, 512, 517, 522, 532, 539, 542, 550, 558, 567, 570, 574, 577, 581, - 591, 595, 602, 609, 616, 623, 632, 641, 645, 652, 655, 661, 665, 673, - 678, 687, 265, 691, 704, 708, 713, 718, 724, 726, 736, 739, 743, 748, - 756, 760, 769, 774, 780, 786, 790, 795, 803, 812, 821, 829, 837, 840, - 793, 851, 857, 862, 870, 877, 880, 890, 894, 898, 905, 909, 912, 919, - 923, 614, 929, 938, 941, 946, 952, 955, 959, 962, 966, 969, 972, 981, - 987, 990, 995, 1004, 1009, 576, 1012, 1018, 1026, 1031, 1035, 1040, 1043, - 1046, 1052, 1058, 1065, 1073, 1076, 1085, 1093, 1097, 1104, 1110, 1115, - 1120, 1126, 1131, 1136, 1141, 1145, 1150, 1156, 1161, 1166, 1170, 1176, - 1181, 1186, 1191, 1195, 1200, 1205, 1210, 1216, 1222, 1228, 1233, 1237, - 1242, 1247, 1252, 1256, 1261, 1266, 1271, 1276, 1111, 1116, 1121, 1127, - 1132, 1280, 1142, 1286, 1291, 1296, 1303, 1307, 1310, 1319, 1146, 1323, - 1151, 1157, 1162, 1327, 1332, 1337, 1341, 1345, 1351, 1355, 1167, 1358, - 1360, 1177, 1365, 1369, 1182, 1375, 1187, 1379, 1383, 1390, 1192, 1394, - 1399, 1403, 1406, 1410, 1196, 1201, 1415, 1421, 1206, 1433, 1439, 1445, - 1451, 1211, 1223, 1229, 1455, 1459, 1463, 1466, 1234, 1470, 1472, 1477, - 1482, 1488, 1493, 1498, 1502, 1507, 1512, 1517, 1522, 1528, 1533, 1538, - 1544, 1550, 1555, 1559, 1564, 1569, 1574, 1579, 1584, 1588, 1596, 1601, - 1605, 1610, 1615, 1620, 1625, 1629, 1632, 1639, 1644, 1649, 1654, 1659, - 1665, 1670, 1674, 1238, 1677, 1682, 1687, 1692, 1243, 1696, 1700, 1707, - 1248, 1714, 1719, 1253, 1723, 1725, 1730, 1741, 1747, 1257, 1752, 1761, - 1262, 1766, 1772, 1777, 1267, 1782, 1791, 1796, 1800, 1803, 1808, 1812, - 1816, 1820, 1823, 1827, 1272, 1832, 1277, 1836, 1838, 1844, 1850, 1856, - 1862, 1868, 1874, 1880, 1886, 1891, 1897, 1903, 1909, 1915, 1921, 1927, - 1933, 1939, 1945, 1950, 1955, 1960, 1965, 1970, 1975, 1980, 1985, 1990, - 1995, 2001, 2006, 2012, 2017, 2023, 2029, 2034, 2040, 2046, 2052, 2058, - 2063, 2068, 2070, 2071, 2075, 2079, 2084, 2088, 2092, 2096, 2101, 2105, - 2108, 2113, 2117, 2122, 2126, 2130, 2135, 2139, 2142, 2146, 2152, 2166, - 2170, 2174, 2178, 2181, 2186, 2190, 2194, 2197, 2201, 2206, 2211, 2216, - 2221, 2225, 2229, 2233, 2237, 2241, 2246, 2250, 2255, 2259, 2264, 2270, - 2277, 2283, 2288, 2293, 2298, 2304, 2309, 2315, 2320, 2325, 2330, 2335, - 2340, 2343, 2345, 1128, 2349, 2356, 2364, 2374, 2383, 2397, 2401, 2405, - 2410, 2423, 2431, 2434, 2438, 2443, 2447, 2450, 2454, 2458, 2463, 1736, - 2468, 2472, 2475, 2479, 2485, 2492, 2499, 2505, 2510, 2515, 2521, 2527, - 2532, 2537, 2542, 2547, 2552, 2557, 2482, 2562, 1727, 2564, 2570, 2574, - 2579, 2583, 2587, 1635, 1749, 2592, 2596, 2600, 2603, 2608, 2613, 2618, - 2623, 2627, 2634, 2639, 2642, 2646, 2653, 2659, 2663, 2667, 2671, 2676, - 2683, 2688, 2693, 2700, 2706, 2712, 2718, 2739, 2753, 2770, 2785, 2801, - 2818, 2833, 2842, 2847, 2851, 2856, 2861, 2865, 2877, 2884, 2890, 2273, - 2896, 2903, 2909, 2913, 2916, 2923, 2929, 2934, 2938, 2943, 2947, 2951, - 2093, 2955, 2960, 2965, 2969, 2974, 2982, 2986, 2993, 2998, 3002, 3006, - 3010, 3015, 3020, 3025, 3029, 3034, 3039, 3043, 3048, 3053, 3057, 3060, - 3064, 3068, 3076, 3081, 3085, 3089, 3095, 3104, 3108, 3112, 3118, 3123, - 3130, 3134, 3144, 3148, 3152, 3157, 3161, 3166, 3172, 3177, 3181, 3185, - 3189, 2495, 3197, 3202, 3208, 3213, 3217, 3222, 3227, 3231, 3237, 3242, - 2097, 3248, 3254, 3259, 3264, 3269, 3274, 3279, 3284, 3289, 3294, 3299, - 3304, 3309, 3314, 3319, 3324, 3330, 3335, 1143, 101, 3341, 3345, 3349, - 3353, 3358, 3362, 3366, 3372, 3377, 3381, 3385, 3390, 3395, 3399, 3404, - 3408, 3411, 3415, 3420, 3424, 3429, 3433, 3436, 3438, 3442, 3446, 3451, - 3455, 3458, 3471, 3475, 3479, 3483, 3488, 3492, 3496, 3499, 3503, 3507, - 3512, 3516, 3521, 3526, 3531, 3535, 3542, 3547, 3550, 3553, 3558, 3564, - 3568, 3572, 3575, 3580, 3584, 3589, 3593, 3597, 3600, 3606, 3611, 3616, - 3622, 3627, 3632, 3638, 3644, 3649, 3654, 3659, 3664, 964, 654, 3667, - 3670, 3675, 3679, 3683, 3687, 3691, 3694, 3698, 3703, 3708, 3712, 3717, - 3721, 3726, 3730, 3734, 3738, 3744, 3750, 3753, 3756, 150, 3762, 3767, - 3776, 3784, 3793, 3803, 3810, 3816, 3823, 3828, 3832, 3836, 3844, 3851, - 3856, 3863, 3868, 3872, 3882, 3886, 3890, 3895, 3900, 3910, 2109, 3915, - 3919, 3922, 3928, 3933, 3939, 3945, 3950, 3957, 3961, 3965, 3969, 3974, - 3979, 3984, 3989, 3994, 3999, 592, 575, 1304, 4004, 4011, 4018, 4024, - 4029, 4036, 4043, 4048, 4054, 4060, 4065, 4069, 4075, 4082, 4087, 4091, - 4095, 2118, 4101, 4109, 4115, 4123, 807, 4129, 4137, 4148, 4152, 4162, - 4168, 4173, 4178, 4183, 4188, 2123, 4193, 4198, 4213, 4219, 4226, 4237, - 4247, 4253, 4258, 4264, 4270, 4273, 4276, 4280, 4285, 4288, 4295, 4304, - 4309, 4313, 4317, 4321, 4325, 4330, 4336, 4347, 4351, 3416, 4356, 4368, - 4374, 4382, 4386, 4391, 4398, 4403, 4408, 4413, 1504, 4418, 4421, 4424, - 4428, 4431, 4437, 4441, 4455, 4459, 4462, 4466, 4472, 4478, 4483, 4487, - 4491, 4497, 4508, 4514, 4519, 4525, 4529, 4537, 4549, 4559, 4565, 4570, - 4579, 4587, 4594, 4600, 4606, 4610, 4616, 4625, 4634, 4640, 4644, 4653, - 4658, 4662, 4667, 4671, 4679, 4685, 4689, 4696, 4701, 4705, 4711, 2131, - 4717, 4722, 4727, 4732, 4737, 1320, 4742, 4747, 4753, 4758, 4763, 4768, - 4773, 4778, 4783, 4789, 4794, 4800, 4805, 4810, 4815, 4821, 4826, 4831, - 4836, 4841, 4847, 4852, 4858, 4863, 4868, 4873, 4878, 4883, 4888, 4894, - 4899, 4904, 312, 369, 4909, 4915, 4919, 4923, 4928, 4932, 4936, 4939, - 4943, 4947, 4950, 4954, 4958, 4962, 4967, 4971, 4975, 4981, 4990, 4714, - 4995, 4999, 5002, 5007, 5012, 5017, 5022, 5027, 5032, 5037, 5042, 5047, - 5052, 5056, 5061, 5066, 5071, 5076, 5081, 5086, 5091, 5096, 5101, 5106, - 5110, 5115, 5120, 5125, 5130, 5135, 5140, 5145, 5150, 5155, 5160, 5164, - 5169, 5174, 5179, 5184, 5189, 5194, 5199, 5204, 5209, 5214, 5218, 5223, - 5228, 5233, 5238, 5243, 5248, 5253, 5258, 5263, 5268, 5272, 5277, 5282, - 5287, 5292, 5297, 5302, 5307, 5312, 5317, 5322, 5326, 5331, 5336, 5341, - 5346, 5351, 5356, 5361, 5366, 5371, 5376, 5380, 5385, 5390, 5395, 5400, - 5406, 5412, 5418, 5424, 5430, 5436, 5442, 5447, 5453, 5459, 5465, 5471, - 5477, 5483, 5489, 5495, 5501, 5507, 5512, 5518, 5524, 5530, 5536, 5542, - 5548, 5554, 5560, 5566, 5572, 5577, 5583, 5589, 5595, 5601, 5607, 5613, - 5619, 5625, 5631, 5637, 5642, 5648, 5654, 5660, 5666, 5672, 5678, 5684, - 5690, 5696, 5702, 5707, 5713, 5719, 5725, 5731, 5737, 5743, 5749, 5755, - 5761, 5767, 5772, 5776, 5782, 5788, 5794, 5800, 5806, 5812, 5818, 5824, - 5830, 5836, 5841, 5847, 5853, 5859, 5865, 5871, 5877, 5883, 5889, 5895, - 5901, 5906, 5912, 5918, 5924, 5930, 5936, 5942, 5948, 5954, 5960, 5966, - 5971, 5977, 5983, 5989, 5995, 6001, 6007, 6013, 6019, 6025, 6031, 6036, - 6042, 6048, 6054, 6060, 6066, 6072, 6078, 6084, 6090, 6096, 6101, 6107, - 6113, 6119, 6125, 6131, 6137, 6143, 6149, 6155, 6161, 6166, 6172, 6178, - 6184, 6190, 6196, 6202, 6208, 6214, 6220, 6226, 6231, 6237, 6243, 6249, - 6255, 6261, 6267, 6273, 6279, 6285, 6291, 6296, 6302, 6308, 6314, 6320, - 6326, 6332, 6338, 6344, 6350, 6356, 6361, 6367, 6373, 6379, 6385, 6391, - 6397, 6403, 6409, 6415, 6421, 6426, 6430, 6433, 6440, 6444, 6457, 6461, - 6465, 6469, 6472, 6476, 6481, 6485, 6494, 6498, 6504, 6511, 6522, 6530, - 6537, 6541, 6549, 6558, 6564, 6568, 6580, 6585, 6588, 6593, 6597, 6607, - 6615, 6623, 6629, 6633, 6643, 6653, 6661, 6668, 6675, 6681, 6687, 6694, - 6698, 6705, 6715, 6725, 6733, 6740, 6745, 6749, 6753, 6761, 6765, 6775, - 6780, 6787, 6795, 6800, 6804, 6809, 6813, 6820, 6825, 6839, 6844, 6849, - 6856, 3680, 6865, 6869, 6873, 6878, 6882, 6886, 6889, 6894, 6899, 6908, - 6914, 6920, 6925, 6931, 6935, 6946, 6956, 6971, 6986, 7001, 7016, 7031, - 7046, 7061, 7076, 7091, 7106, 7121, 7136, 7151, 7166, 7181, 7196, 7211, - 7226, 7241, 7256, 7271, 7286, 7301, 7316, 7331, 7346, 7361, 7376, 7391, - 7406, 7421, 7436, 7451, 7466, 7481, 7496, 7511, 7526, 7541, 7556, 7571, - 7586, 7601, 7616, 7631, 7646, 7661, 7676, 7691, 7700, 7709, 7714, 7720, - 7730, 7734, 7738, 7743, 7748, 7753, 7761, 7765, 7768, 7772, 3139, 7775, - 7780, 346, 520, 7786, 7794, 7798, 7802, 7805, 7809, 7815, 7819, 7827, - 7833, 7838, 7845, 7853, 7860, 7866, 7871, 7878, 7884, 7893, 7901, 7905, - 7910, 7918, 7930, 7941, 7948, 7959, 7963, 7967, 7971, 7974, 7980, 3443, - 7984, 7990, 7995, 8000, 8005, 8011, 8016, 8021, 8026, 8031, 8037, 8042, - 8047, 8053, 8058, 8064, 8069, 8075, 8080, 8086, 8091, 8096, 8101, 8106, - 8111, 8117, 8122, 8127, 8132, 8138, 8144, 8150, 8156, 8162, 8168, 8174, - 8180, 8186, 8192, 8198, 8204, 8209, 8214, 8219, 8224, 8229, 8234, 8239, - 8244, 8250, 8256, 8261, 8267, 8273, 8279, 8284, 8289, 8294, 8299, 8305, - 8311, 8316, 8321, 8326, 8331, 8336, 8342, 8347, 8353, 8359, 8365, 8371, - 8377, 8383, 8389, 8395, 8401, 2140, 7804, 8406, 8410, 8418, 8422, 8425, - 8432, 8435, 8439, 8447, 8452, 8457, 8448, 8462, 2167, 8466, 8472, 8478, - 8483, 8488, 8495, 8503, 8508, 8512, 8515, 8519, 8525, 8531, 8535, 1679, - 572, 8538, 8542, 8547, 8553, 8558, 8562, 8565, 8569, 8575, 8580, 8584, - 8591, 8595, 8599, 8603, 792, 1063, 8606, 8614, 8621, 8628, 8634, 8641, - 8649, 8656, 8667, 8674, 8680, 8685, 8697, 1163, 1328, 1333, 8708, 8712, - 1338, 8716, 8720, 8729, 8737, 8741, 8750, 8756, 8762, 8767, 8771, 8777, - 8782, 8790, 8797, 2838, 8804, 8810, 8814, 8823, 8832, 8841, 8850, 8856, - 8861, 8866, 8877, 8886, 8898, 8903, 8911, 2226, 8915, 8917, 8922, 8926, - 8935, 8943, 1342, 165, 3722, 3727, 8949, 8953, 8962, 8968, 8973, 8976, - 8985, 2238, 8991, 2830, 8995, 9003, 9007, 9011, 9015, 9019, 2247, 9023, - 9028, 9035, 9041, 9047, 9050, 9052, 9055, 9063, 9071, 9079, 9082, 9087, - 2260, 9092, 8459, 9095, 9097, 9102, 9107, 9112, 9117, 9122, 9127, 9132, - 9137, 9142, 9147, 9153, 9158, 9163, 9168, 9174, 9179, 9184, 9189, 9194, - 9199, 9204, 9210, 9215, 9220, 9225, 9230, 9235, 9240, 9245, 9250, 9255, - 9260, 9265, 9270, 9275, 9280, 9285, 9290, 9295, 9301, 9307, 9312, 9317, - 9322, 9327, 9332, 2271, 2278, 2284, 9337, 9345, 9351, 9359, 2310, 2316, - 9367, 2321, 2326, 2331, 2336, 9371, 9375, 9380, 9384, 9388, 9392, 9397, - 9401, 9406, 9410, 9413, 9416, 9422, 9429, 9435, 9442, 9448, 9455, 9461, - 9468, 9474, 9480, 9489, 9495, 9499, 9503, 9507, 9511, 9516, 9520, 9525, - 9529, 9535, 9539, 9544, 9551, 9562, 9570, 9580, 9586, 9596, 9605, 9612, - 9617, 9621, 9632, 9642, 9655, 9666, 9679, 9690, 9702, 9714, 9726, 9737, - 9750, 9763, 9770, 9776, 9787, 9797, 9811, 9818, 9824, 9833, 9841, 9845, - 9850, 9854, 9861, 9869, 9876, 9880, 9886, 9890, 9896, 9906, 9910, 9915, - 9920, 9927, 9933, 8636, 9943, 9947, 9954, 9960, 9967, 9974, 1062, 9978, - 9984, 9988, 9993, 9998, 10003, 10007, 10013, 10021, 10028, 10034, 10038, - 10041, 10047, 10057, 10061, 10067, 10072, 10076, 10081, 10085, 10091, - 10097, 10102, 10108, 10113, 10118, 10123, 2163, 10128, 10130, 10135, - 10143, 10152, 10156, 10162, 10167, 10172, 10177, 10182, 10188, 10193, - 10198, 4493, 10203, 10208, 10212, 10218, 10223, 10229, 10234, 10239, - 10245, 10250, 10157, 10256, 10260, 10267, 10273, 10278, 10282, 6835, - 10287, 10296, 10301, 10306, 9031, 9038, 10311, 3012, 10315, 10320, 10325, - 10330, 10168, 10334, 10339, 10344, 10173, 10348, 10178, 10353, 10360, - 10367, 10373, 10380, 10386, 10392, 10397, 10404, 10409, 10414, 10419, - 10425, 10183, 10189, 10431, 10437, 10442, 10447, 10455, 10194, 10460, - 10463, 10465, 10473, 10479, 10485, 10494, 10502, 10510, 10518, 10526, - 10534, 10542, 10550, 10558, 10567, 10576, 10584, 10593, 10602, 10611, - 10620, 10629, 10638, 10647, 10656, 10665, 10674, 10682, 10687, 10691, - 10697, 10705, 10712, 10727, 10744, 10763, 10772, 10780, 10795, 10806, - 10814, 10824, 10834, 10842, 10848, 10860, 10869, 10877, 10884, 10891, - 10898, 10904, 10909, 10919, 10927, 10937, 10944, 10954, 10964, 10974, - 10982, 10989, 10998, 11008, 11022, 11037, 11046, 11054, 11059, 11063, - 11072, 11078, 11083, 11093, 11103, 11113, 11118, 11122, 11132, 11141, - 11146, 11162, 11179, 11189, 11200, 11213, 11224, 11232, 11245, 11257, - 11265, 11270, 11274, 11280, 11285, 11293, 11301, 11308, 11319, 11324, - 11332, 11342, 11348, 11352, 11355, 11359, 11365, 11372, 11376, 11384, - 11393, 11401, 11408, 11413, 11418, 11422, 11426, 11434, 11449, 11465, - 11471, 11479, 11488, 11496, 11502, 11506, 11513, 11524, 11528, 11531, - 11537, 11542, 10199, 11550, 11556, 11563, 11569, 11574, 11581, 11588, - 11595, 11602, 11609, 11616, 11623, 11630, 11637, 11644, 11651, 11658, - 11665, 11672, 11679, 11684, 10740, 11689, 11695, 11702, 11709, 11714, - 11721, 11730, 11734, 11746, 11750, 11756, 11761, 11766, 11771, 11776, - 11781, 9069, 11786, 11789, 11793, 11797, 11801, 11805, 11811, 11817, - 11822, 11828, 11833, 11838, 11844, 11849, 11854, 9923, 11859, 11863, - 11867, 11871, 11876, 11881, 11886, 11894, 11900, 11905, 11909, 11913, - 11920, 11925, 11933, 11940, 11945, 11949, 11952, 11958, 11965, 11969, - 11972, 11977, 11981, 4532, 11987, 11996, 46, 12004, 12010, 12015, 12020, - 12028, 12035, 12040, 6770, 12046, 12052, 12057, 12061, 12064, 12079, - 12098, 12110, 12123, 12136, 12149, 12163, 12176, 12191, 12198, 10204, - 12204, 12218, 12223, 12229, 12234, 12242, 12247, 8819, 12252, 12255, - 12263, 12270, 12275, 12279, 12285, 12289, 12294, 12299, 12304, 12309, - 12314, 12319, 3017, 10822, 12324, 12328, 12334, 12340, 12345, 12351, - 12356, 10213, 12362, 12368, 12373, 12378, 12386, 12392, 12405, 12413, - 12420, 12426, 10219, 12432, 12440, 12448, 12455, 12468, 12481, 12493, - 12503, 12515, 12543, 12551, 12560, 12567, 12579, 12586, 12596, 12605, - 12613, 12620, 12625, 12631, 10224, 12636, 12642, 12647, 12652, 10230, - 12657, 12660, 12667, 12673, 12687, 12700, 12711, 9555, 12722, 12728, - 12737, 12745, 12752, 12758, 12769, 12775, 12780, 12788, 4020, 12794, - 12799, 12071, 12805, 12812, 12817, 10235, 12823, 12828, 12835, 12841, - 12847, 12852, 12860, 12868, 12875, 12879, 12891, 12905, 12915, 12920, - 12924, 12935, 12941, 12946, 12951, 10240, 12955, 10246, 12960, 12963, - 12968, 12980, 12987, 12992, 12996, 13004, 13009, 13013, 13018, 13022, - 13029, 13035, 10251, 10158, 13042, 3022, 12, 13049, 13054, 13058, 13062, - 13068, 13076, 13086, 13091, 13096, 13103, 13110, 13114, 13125, 13135, - 13144, 13153, 13165, 13170, 13174, 13182, 13196, 13200, 13203, 13207, - 13215, 13222, 13230, 13234, 13245, 13253, 13257, 13264, 13269, 13273, - 13279, 13284, 13290, 13295, 13300, 13304, 13310, 13315, 13326, 13330, - 13333, 13339, 13346, 13351, 13357, 13363, 13370, 13381, 13391, 13401, - 13410, 13417, 13426, 13430, 10261, 10268, 10274, 10279, 13436, 13442, - 13448, 13453, 13459, 10283, 13465, 13468, 13475, 13480, 13485, 13500, - 13516, 13531, 13539, 13545, 13550, 13555, 13560, 13565, 13570, 13575, - 13580, 13585, 13590, 1055, 357, 13595, 13603, 13610, 13616, 13621, 13626, - 10288, 13628, 13632, 13637, 13641, 13651, 13656, 13660, 13663, 13672, - 13676, 13679, 13686, 10297, 13691, 13694, 13702, 13709, 13717, 13721, - 13727, 13731, 13738, 13747, 13754, 13750, 13761, 13765, 13771, 13775, - 13779, 13783, 13789, 13799, 13807, 13814, 13818, 13826, 13831, 13835, - 13842, 13847, 13851, 13856, 13861, 13865, 13872, 13878, 13886, 13892, - 13897, 13907, 13914, 13919, 13924, 13928, 13932, 13940, 4362, 13948, - 13953, 10302, 13957, 13964, 13968, 13971, 13979, 13986, 13990, 6625, - 13994, 13999, 14004, 14008, 14019, 14029, 14034, 14040, 14045, 14049, - 14052, 14060, 14065, 14070, 14077, 14082, 10307, 14087, 14091, 14098, - 14103, 14108, 14113, 6793, 14118, 14123, 14128, 14133, 14139, 14144, - 14150, 14155, 14160, 14165, 14170, 14175, 14180, 14185, 14190, 14195, - 14200, 14205, 14210, 14215, 14220, 14225, 14230, 14236, 14241, 14246, - 14251, 14256, 14261, 14267, 14272, 14277, 14283, 14288, 14294, 14299, - 14305, 14310, 14315, 14320, 14325, 14331, 14336, 14341, 14346, 14354, - 985, 112, 14360, 14364, 14369, 14374, 14378, 14382, 14386, 14391, 14395, - 14400, 14404, 14407, 14411, 14415, 14421, 14426, 14436, 14442, 14450, - 14456, 14460, 14464, 14471, 14479, 14488, 14499, 14509, 14516, 14523, - 14527, 14536, 14545, 14553, 14560, 14569, 14578, 14587, 14596, 14606, - 14616, 14626, 14636, 14646, 14655, 14665, 14675, 14685, 14695, 14705, - 14715, 14725, 14734, 14744, 14754, 14764, 14774, 14784, 14794, 14803, - 14813, 14823, 14833, 14843, 14853, 14863, 14873, 14883, 14893, 14902, - 14912, 14922, 14932, 14942, 14952, 14962, 14972, 14982, 14992, 15002, - 15011, 15017, 1172, 15021, 15024, 15028, 15033, 15040, 15046, 15051, - 15055, 15060, 15069, 15078, 15086, 15091, 15095, 15099, 15105, 15110, - 15116, 10316, 15121, 15126, 15135, 15140, 10326, 15145, 15148, 15154, - 15162, 10331, 15169, 15173, 15177, 15182, 15186, 15196, 15202, 15208, - 15213, 15222, 15230, 15237, 15244, 15249, 15256, 15261, 15265, 15268, - 15279, 15289, 15302, 15311, 15319, 15330, 15342, 15352, 15362, 15367, - 15371, 15376, 15381, 15385, 15391, 15399, 15406, 15417, 15422, 15432, - 15441, 15445, 15448, 15455, 15465, 15474, 15481, 15485, 15492, 15498, - 15503, 15508, 15512, 15064, 15521, 15525, 15531, 15535, 15540, 15544, - 15551, 15558, 15562, 15571, 15579, 15587, 15594, 15602, 15614, 15625, - 15635, 15642, 15648, 15657, 15668, 15677, 15689, 15701, 15713, 15723, - 15732, 15742, 15751, 15759, 15766, 15775, 15783, 15787, 15792, 15798, - 15804, 15809, 15814, 15818, 15823, 15828, 15833, 15838, 15843, 15848, - 15853, 8480, 15858, 15860, 15864, 15869, 15875, 15882, 15888, 15894, - 15903, 15907, 15913, 15921, 15928, 15937, 15946, 15955, 15964, 15973, - 15982, 15991, 16000, 16010, 16020, 16029, 16035, 16042, 16049, 16055, - 16069, 16075, 16082, 16090, 16099, 16107, 16113, 16122, 16131, 16142, - 16148, 16158, 16166, 16173, 16181, 16190, 16203, 16212, 16220, 16227, - 16240, 16246, 16252, 16262, 16271, 16280, 16285, 16289, 16295, 16301, - 16306, 16313, 16320, 9937, 16325, 16330, 16337, 16345, 16350, 16362, - 16369, 16374, 16386, 14417, 16391, 16397, 16405, 16411, 16416, 16424, - 16432, 16439, 16447, 16453, 16461, 16469, 16475, 16483, 16489, 16494, - 16500, 16507, 16513, 16518, 16522, 16533, 16541, 16549, 16555, 16560, - 16567, 16576, 16582, 16587, 16595, 16602, 16611, 16625, 4306, 16629, - 16634, 16639, 16645, 16650, 16655, 16659, 16664, 16669, 16674, 8479, - 16679, 16684, 16689, 16694, 16699, 16703, 16708, 16713, 16718, 16723, - 16729, 16735, 13723, 16740, 16746, 16751, 16756, 16761, 10335, 16766, - 16771, 16776, 16781, 16786, 16800, 16817, 16835, 16847, 16860, 16877, - 16893, 16910, 16920, 16939, 16950, 16961, 16972, 2727, 16983, 16994, - 17005, 17022, 17033, 17044, 17049, 10340, 17054, 17058, 2420, 17062, - 17065, 17071, 17079, 17087, 17093, 17102, 17109, 17114, 17122, 17130, - 17137, 17141, 17146, 17152, 17159, 17167, 17174, 17186, 17193, 17199, - 17207, 17212, 17218, 17224, 17229, 13494, 17236, 17245, 17251, 17256, - 17264, 17273, 17281, 17288, 17294, 17302, 17309, 17315, 17321, 17328, - 17335, 17341, 17347, 17356, 17364, 17369, 17379, 17386, 17392, 17400, - 17406, 17414, 17422, 17429, 17442, 17449, 17458, 17467, 17476, 17484, - 17494, 17501, 17506, 3876, 17513, 17518, 1288, 17522, 17529, 16680, - 17533, 17539, 17543, 17551, 17563, 17568, 17575, 17581, 17586, 17593, - 16685, 17597, 17601, 17605, 16690, 17609, 16695, 17613, 17620, 17625, - 17629, 17636, 17640, 17648, 17655, 17660, 17668, 17672, 17679, 17696, - 17705, 17714, 17718, 17721, 17727, 17735, 17741, 17746, 17750, 17755, - 17760, 17765, 17770, 17775, 17780, 3954, 17785, 17787, 17795, 17802, - 17812, 17824, 17829, 17833, 17839, 17844, 17852, 17856, 17862, 17867, - 17873, 17876, 17883, 17891, 17898, 17904, 17909, 17915, 17920, 17927, - 17933, 17938, 17945, 17950, 17954, 17960, 17966, 17970, 17977, 17983, - 17988, 17994, 18002, 18010, 18017, 18023, 18028, 18034, 18040, 18048, - 18053, 18058, 18066, 18072, 18078, 18083, 18090, 18095, 18099, 18105, - 18111, 18116, 18123, 18128, 18134, 18137, 18143, 18154, 18160, 18163, - 18167, 18171, 18185, 18198, 18210, 18216, 18221, 18228, 18234, 18240, - 18251, 18263, 18275, 18285, 18294, 18302, 18309, 18320, 18330, 18340, - 18348, 18351, 16709, 18356, 18361, 16714, 16865, 18369, 18382, 18397, - 18408, 16882, 18426, 18439, 18452, 18463, 12086, 18474, 18487, 18506, - 18517, 18528, 18539, 2748, 18552, 18556, 18564, 18575, 18586, 18594, - 18609, 18624, 18635, 18642, 18648, 18656, 18660, 18666, 18669, 18682, - 18694, 18704, 18712, 18719, 18727, 18737, 18742, 18749, 18754, 18761, - 18772, 18782, 18788, 18793, 18798, 16719, 18802, 18808, 18814, 18819, - 18824, 18829, 18833, 16724, 16730, 18837, 16736, 18842, 18850, 18855, - 18859, 18866, 18874, 18881, 18890, 18897, 18901, 18905, 18910, 18915, - 18920, 18925, 18930, 10179, 18935, 18937, 18942, 18947, 18953, 18958, - 18963, 18968, 18973, 18977, 18983, 18989, 18994, 19000, 19005, 19010, - 19014, 19020, 19025, 19029, 19034, 19039, 19051, 19056, 19062, 19067, - 19072, 19078, 19084, 19089, 19094, 19099, 19106, 19112, 19123, 19130, - 19139, 19144, 19148, 263, 19152, 19160, 19165, 19171, 19178, 19185, - 19191, 19196, 19201, 19206, 19213, 19223, 19231, 19236, 19241, 19248, - 19254, 19263, 19273, 19283, 19297, 19311, 19325, 19339, 19354, 19369, - 19386, 19404, 19417, 19423, 19428, 19433, 19437, 19445, 19450, 19458, - 19464, 19470, 19475, 19480, 19484, 19490, 19495, 19499, 19506, 19511, - 19515, 19526, 19532, 19537, 19542, 19549, 19554, 19558, 3839, 19563, - 19569, 19576, 16741, 19582, 19586, 19592, 19597, 19602, 19606, 19612, - 19617, 19622, 19629, 19634, 15198, 19638, 19643, 19647, 19652, 19658, - 19664, 19671, 19681, 19689, 19696, 19701, 19705, 19714, 19722, 19729, - 19736, 19742, 19747, 19753, 19758, 19763, 19769, 19774, 19780, 19785, - 19791, 19797, 19804, 19810, 19815, 19820, 10405, 19829, 19832, 19840, - 19846, 19851, 19856, 19866, 19873, 19879, 19884, 19889, 19895, 19900, - 19906, 19911, 19917, 19924, 19930, 19936, 19941, 19949, 19956, 19961, - 19966, 19972, 19977, 19981, 19990, 20001, 20008, 20015, 20023, 20030, - 20037, 20042, 20047, 20053, 20058, 20066, 20072, 20078, 20085, 20091, - 20096, 20100, 20106, 20111, 20116, 20120, 20125, 1361, 8504, 3036, 20129, - 20133, 20137, 20141, 20145, 20149, 20152, 20157, 20164, 20172, 16752, - 20179, 20189, 20197, 20204, 20212, 20222, 20231, 20244, 20249, 20254, - 20262, 20269, 15307, 15316, 20276, 20286, 20301, 20307, 20314, 20321, - 20328, 20334, 20340, 20351, 20359, 20367, 20377, 20387, 20396, 16757, - 20405, 20411, 20417, 20426, 20434, 20442, 20447, 20456, 20464, 20476, - 20486, 20496, 20506, 20515, 20527, 20537, 20547, 20558, 20565, 20570, - 20577, 20589, 20601, 20613, 20625, 20637, 20649, 20661, 20673, 20685, - 20697, 20708, 20720, 20732, 20744, 20756, 20768, 20780, 20792, 20804, - 20816, 20828, 20839, 20851, 20863, 20875, 20887, 20899, 20911, 20923, - 20935, 20947, 20959, 20970, 20982, 20994, 21006, 21018, 21030, 21042, - 21054, 21066, 21078, 21090, 21101, 21113, 21125, 21137, 21149, 21161, - 21173, 21185, 21197, 21209, 21221, 21232, 21244, 21256, 21268, 21280, - 21292, 21304, 21316, 21328, 21340, 21352, 21363, 21375, 21387, 21399, - 21411, 21423, 21435, 21447, 21459, 21471, 21483, 21494, 21506, 21518, - 21530, 21542, 21555, 21568, 21581, 21594, 21607, 21620, 21633, 21645, - 21658, 21671, 21684, 21697, 21710, 21723, 21736, 21749, 21762, 21775, - 21787, 21800, 21813, 21826, 21839, 21852, 21865, 21878, 21891, 21904, - 21917, 21929, 21942, 21955, 21968, 21981, 21994, 22007, 22020, 22033, - 22046, 22059, 22071, 22084, 22097, 22110, 22123, 22136, 22149, 22162, - 22175, 22188, 22201, 22213, 22226, 22239, 22252, 22265, 22278, 22291, - 22304, 22317, 22330, 22343, 22355, 22366, 22379, 22392, 22405, 22418, - 22431, 22444, 22457, 22470, 22483, 22496, 22508, 22521, 22534, 22547, - 22560, 22573, 22586, 22599, 22612, 22625, 22638, 22650, 22663, 22676, - 22689, 22702, 22715, 22728, 22741, 22754, 22767, 22780, 22792, 22805, - 22818, 22831, 22844, 22857, 22870, 22883, 22896, 22909, 22922, 22934, - 22947, 22960, 22973, 22986, 22999, 23012, 23025, 23038, 23051, 23064, - 23076, 23089, 23102, 23115, 23128, 23141, 23154, 23167, 23180, 23193, - 23206, 23218, 23231, 23244, 23257, 23270, 23283, 23296, 23309, 23322, - 23335, 23348, 23360, 23373, 23386, 23399, 23412, 23425, 23438, 23451, - 23464, 23477, 23490, 23502, 23515, 23528, 23541, 23554, 23567, 23580, - 23593, 23606, 23619, 23632, 23644, 23657, 23670, 23683, 23696, 23709, - 23722, 23735, 23748, 23761, 23774, 23786, 23797, 23806, 23814, 23822, - 23829, 23835, 23839, 23845, 23851, 23859, 23864, 23870, 23875, 23879, - 23888, 10184, 23899, 23905, 23912, 23920, 23927, 12680, 12694, 23934, - 23941, 23950, 23955, 23960, 23967, 23972, 23977, 8520, 8526, 8532, 23982, - 23987, 23990, 23995, 24003, 24010, 24017, 24024, 24030, 24039, 24048, - 24057, 24063, 24071, 24080, 24084, 24090, 24095, 24105, 24112, 24118, - 24126, 24132, 24139, 24145, 24155, 24164, 24168, 24175, 24179, 24184, - 24190, 24198, 24202, 24212, 16767, 24221, 24227, 24231, 24240, 24249, - 24259, 24265, 16772, 24272, 24279, 24290, 24298, 24308, 24317, 24325, - 9902, 24333, 24338, 24344, 24349, 24353, 24357, 24361, 10923, 24366, - 24374, 24381, 24390, 24398, 24405, 24412, 24421, 24427, 976, 24434, - 24440, 24444, 24450, 24457, 24463, 24471, 24477, 24484, 24490, 24496, - 24505, 24509, 24517, 24526, 24533, 24538, 24542, 24553, 24558, 24563, - 24569, 24574, 24587, 8747, 24591, 24597, 24603, 24609, 24614, 24622, - 24626, 24633, 24642, 24647, 17045, 24655, 24659, 24671, 24676, 24680, - 24683, 24689, 24695, 24701, 24706, 24711, 24715, 24718, 24729, 24734, - 10456, 24741, 24746, 24751, 24756, 24761, 24766, 24771, 24776, 24781, - 10461, 24786, 24791, 24796, 24801, 24806, 24811, 24816, 24821, 24826, - 24831, 24836, 24841, 24847, 24852, 24857, 24862, 24867, 24872, 24877, - 24882, 24887, 24892, 24898, 24904, 24909, 24914, 24919, 24924, 24929, - 24934, 24939, 24944, 24949, 24955, 24960, 24965, 24970, 24976, 24982, - 24987, 24992, 24997, 25002, 25007, 25012, 25017, 25022, 25028, 25033, - 25038, 25043, 25048, 25054, 25059, 25064, 25068, 1284, 145, 25076, 25080, - 25084, 25088, 25093, 25097, 15204, 2346, 25101, 25106, 25110, 25115, - 25119, 25124, 25128, 25134, 25139, 25143, 25147, 25155, 25159, 25163, - 25170, 25175, 25180, 25184, 25190, 25195, 25199, 25204, 25209, 25213, - 25220, 25227, 25234, 25239, 25243, 25247, 25252, 25256, 25259, 25265, - 25278, 25283, 25289, 25298, 25303, 10683, 25308, 25317, 25322, 25325, - 25329, 25334, 25339, 25344, 25349, 25354, 2844, 2849, 25359, 25365, - 25369, 25375, 3800, 25380, 25385, 25390, 25396, 25401, 16138, 25406, - 25411, 25416, 25421, 25427, 25432, 25437, 25443, 25448, 25452, 25457, - 25462, 25467, 25472, 25477, 25481, 25486, 25490, 25495, 25500, 25505, - 25510, 25514, 25519, 25523, 25528, 25533, 25538, 25453, 3045, 25458, - 25543, 25551, 25558, 11017, 25570, 25578, 25588, 25606, 25625, 25634, - 25642, 25463, 25649, 25654, 25662, 25468, 25667, 25672, 25680, 25685, - 25690, 25694, 25473, 25699, 25707, 25712, 25716, 25723, 25729, 25738, - 25742, 25750, 25754, 25757, 25764, 25768, 25772, 25777, 25783, 25790, - 25795, 9929, 25799, 25804, 25809, 25814, 25819, 25824, 1689, 1694, 25829, - 25835, 25841, 25846, 25850, 25854, 25858, 25862, 25866, 25870, 25874, - 25878, 25881, 25887, 25894, 25902, 25908, 25914, 25919, 25924, 25930, - 25934, 25939, 25946, 16044, 16051, 25952, 25964, 25967, 25974, 25978, - 19187, 25985, 25993, 26004, 26013, 26026, 26036, 26050, 26062, 26076, - 26089, 26101, 26111, 26123, 26129, 26135, 26150, 26174, 26192, 26211, - 26224, 26238, 26256, 26272, 26289, 26307, 26318, 26337, 26354, 26374, - 26392, 26404, 26418, 26432, 26444, 26461, 26480, 26498, 26510, 26528, - 26547, 16925, 26560, 26580, 26592, 12117, 26604, 26609, 26614, 26619, - 26628, 26634, 26639, 26643, 26650, 26656, 26660, 26665, 26670, 26675, - 26680, 26685, 26690, 2440, 26695, 26701, 26705, 26708, 26719, 26723, - 26726, 26734, 26740, 14356, 26744, 26753, 26764, 26770, 26776, 26791, - 26800, 26808, 26815, 26820, 26824, 26831, 26837, 26846, 26854, 26861, - 26871, 26880, 26890, 26895, 26904, 26913, 26924, 26935, 26945, 26962, - 4450, 26972, 26976, 26986, 26994, 27004, 27015, 27021, 27026, 27036, - 27044, 27051, 27057, 27064, 27069, 25501, 27073, 27082, 27086, 27089, - 27094, 27102, 27109, 27118, 27126, 27134, 27142, 27152, 27161, 27167, - 27173, 27179, 27183, 25506, 25511, 27187, 27197, 27207, 27217, 27225, - 27232, 27242, 27250, 27258, 27264, 27272, 782, 27281, 17126, 599, 27295, - 27304, 27312, 27323, 27334, 27344, 27353, 27365, 27374, 27383, 27390, - 27396, 27406, 27415, 27424, 27432, 27440, 27450, 27458, 27466, 27472, - 27477, 27482, 27487, 7915, 27492, 27495, 27499, 27504, 27510, 27515, - 27519, 11142, 25524, 25529, 27527, 27533, 27539, 27544, 27549, 27553, - 27561, 27567, 27573, 27577, 3824, 27585, 27590, 27595, 27599, 27603, - 11266, 27610, 27618, 27632, 27639, 27646, 27652, 11275, 11281, 27660, - 27668, 27675, 27680, 27685, 25534, 27691, 27702, 27706, 27711, 2679, - 27716, 27727, 27733, 27738, 27742, 27746, 27749, 27756, 27763, 27769, - 27777, 27784, 27790, 27794, 7955, 27799, 27803, 27807, 27815, 27820, - 27825, 27830, 1717, 27835, 27840, 27845, 27850, 27855, 27860, 27865, - 27870, 27875, 27880, 27885, 27890, 27895, 27900, 27906, 27911, 27916, - 27921, 27926, 27931, 27936, 27942, 27947, 27952, 27957, 27962, 27967, - 27972, 27977, 27983, 27989, 27994, 28000, 28005, 28010, 5, 28016, 28020, - 28024, 28028, 28033, 28037, 28041, 28045, 28049, 28054, 28058, 28063, - 28067, 28070, 28074, 28079, 28083, 28088, 28092, 28096, 28100, 28105, - 28109, 28113, 28123, 28128, 28132, 28136, 28141, 28146, 28155, 28160, - 28165, 28169, 28173, 28182, 28195, 28207, 28216, 28225, 28230, 28236, - 28241, 28245, 28249, 28259, 28268, 28276, 28282, 28287, 28291, 28298, - 28308, 28317, 28325, 12474, 28333, 28341, 28350, 28359, 28367, 28377, - 28382, 28386, 28390, 28393, 28395, 28399, 28403, 28408, 28413, 28417, - 28421, 28424, 28428, 28431, 28435, 28438, 28441, 28445, 28451, 28455, - 28459, 28463, 28467, 28472, 28477, 28482, 28486, 28489, 28494, 28500, - 28505, 28511, 28516, 28520, 28526, 28530, 28534, 28539, 28543, 28548, - 28553, 28557, 28561, 28568, 28572, 28575, 28579, 28583, 28589, 28595, - 28599, 28603, 28608, 28615, 28621, 28625, 28634, 28638, 28642, 28645, - 28651, 28656, 28662, 1417, 1769, 28667, 28672, 28677, 28682, 28687, - 28692, 28697, 2150, 747, 28702, 28705, 28709, 28713, 28718, 28722, 17138, - 28726, 28731, 28736, 28740, 28743, 28748, 28752, 28757, 28761, 17142, - 28766, 28769, 28772, 28778, 28782, 28787, 28791, 28804, 28808, 28811, - 28819, 28828, 28835, 28840, 28846, 28852, 28860, 28867, 28874, 28878, - 28882, 28886, 28891, 28896, 28900, 28908, 28913, 28920, 28932, 28943, - 28948, 28952, 28959, 28963, 28968, 28974, 28977, 28982, 28987, 28994, - 28998, 29002, 29005, 29011, 8642, 2350, 29015, 29020, 29036, 10734, - 29056, 29065, 29081, 29085, 29092, 29095, 29101, 29111, 29117, 29126, - 29141, 29152, 29164, 29175, 29183, 29192, 29198, 29207, 29217, 29227, - 29238, 29249, 29259, 29268, 29275, 29284, 29292, 29299, 29306, 29314, - 29321, 29328, 29341, 29348, 29356, 29363, 29369, 29374, 29383, 29390, - 29396, 29401, 29409, 29417, 29424, 29431, 26996, 29443, 29455, 29469, - 29477, 29485, 29493, 29500, 29512, 29521, 29530, 29538, 29546, 29554, - 29561, 29567, 29576, 29584, 29594, 29603, 29613, 29622, 29631, 29639, - 29644, 29648, 29651, 29655, 29659, 29663, 29667, 29671, 29677, 29683, - 29688, 29696, 17200, 29703, 29708, 29715, 29721, 29728, 17208, 29735, - 29738, 29750, 29758, 29764, 29769, 29773, 29784, 29794, 29804, 11205, - 29813, 29822, 29830, 29840, 29849, 29856, 29863, 29871, 29875, 17219, - 29878, 29885, 29889, 4394, 29895, 29898, 29905, 29911, 29916, 29923, - 29929, 29933, 29938, 29942, 29951, 29958, 29964, 8700, 29971, 29979, - 29986, 29992, 29997, 30003, 30009, 30017, 30023, 30027, 30030, 30032, - 29656, 11218, 30041, 30046, 30052, 30062, 30067, 30074, 30080, 30085, - 30090, 30095, 30099, 30104, 30111, 30117, 30126, 30134, 30138, 30145, - 30151, 30160, 30167, 4648, 30173, 30179, 30184, 30191, 30203, 30214, - 30219, 30223, 30233, 30239, 30243, 30248, 30258, 30267, 30271, 30278, - 30286, 30293, 30299, 30304, 30312, 30319, 30324, 30331, 30343, 30352, - 30356, 15130, 30364, 30374, 30378, 30386, 28815, 30397, 30402, 30406, - 30413, 30420, 25186, 29581, 30425, 30429, 30432, 26324, 30437, 30451, - 30467, 30485, 30504, 30521, 30539, 26343, 30556, 30576, 26360, 30588, - 30600, 18413, 30612, 26380, 30626, 30638, 12130, 30652, 30657, 30662, - 30667, 30673, 30679, 30685, 30689, 30697, 30704, 30709, 30719, 30725, - 11692, 30731, 30733, 30738, 30746, 30750, 30107, 30756, 30763, 13395, - 13405, 30770, 30777, 30787, 30792, 30796, 30799, 30805, 30813, 30825, - 30835, 30851, 30864, 30878, 18431, 30892, 30899, 30903, 30906, 30911, - 30915, 30922, 30929, 30936, 30946, 30951, 30956, 30961, 30969, 30977, - 30982, 30991, 27017, 3485, 30996, 30999, 31002, 31007, 31014, 31019, - 31024, 31040, 31048, 31056, 10498, 31064, 31069, 31073, 31079, 31084, - 31090, 31093, 31099, 31111, 31119, 31126, 31132, 31139, 31150, 31164, - 31177, 31183, 31192, 31198, 31207, 31219, 31230, 31240, 31249, 31258, - 31266, 31277, 8682, 31284, 31291, 31297, 31302, 31308, 31315, 31326, - 31336, 31346, 31355, 31361, 31368, 31373, 31381, 31388, 31396, 31404, - 31416, 6904, 1094, 31423, 31432, 31440, 31446, 31452, 31457, 31461, - 31464, 31470, 31477, 31482, 31487, 31492, 31496, 31508, 31519, 31528, - 31536, 17401, 31541, 31549, 31554, 31562, 31568, 31574, 13388, 9497, - 31579, 31583, 31587, 31590, 31593, 31599, 31607, 31615, 31619, 31623, - 31628, 31632, 31635, 31644, 31649, 31653, 31656, 31664, 31675, 31684, - 31688, 31694, 31700, 31704, 31710, 31718, 31740, 31764, 31775, 31784, - 31790, 31797, 31804, 31810, 31818, 31824, 31829, 31840, 31858, 31865, - 31873, 31877, 31884, 31889, 31898, 31911, 31919, 31931, 31942, 31953, - 31963, 31977, 31986, 31994, 32006, 10751, 32017, 32028, 32039, 32051, - 32061, 32070, 32080, 32085, 32089, 32097, 32108, 32118, 32124, 32129, - 32133, 32136, 32139, 32147, 32155, 32164, 32174, 32183, 32189, 32203, - 2762, 32225, 32236, 32245, 32255, 32267, 32276, 32285, 32295, 32303, - 32311, 32320, 32325, 32336, 32341, 32350, 32356, 32367, 32371, 32374, - 32384, 32393, 32401, 32411, 32421, 32429, 32438, 32445, 32453, 32460, - 32469, 32478, 32483, 32488, 32492, 32500, 32507, 32511, 32519, 32526, - 32537, 32552, 32559, 32565, 32575, 32584, 32590, 32601, 32605, 32612, - 32616, 32623, 32629, 16275, 32635, 32639, 32644, 32650, 32657, 32661, - 32665, 32673, 32681, 32687, 32696, 32703, 32710, 32715, 32720, 32730, - 27071, 32734, 32737, 32742, 32747, 32752, 32757, 32762, 32767, 32772, - 32777, 32783, 32788, 32793, 32799, 1134, 725, 32804, 32811, 32820, 2398, - 32827, 32832, 32836, 32842, 1183, 653, 32847, 311, 32851, 32860, 32868, - 32877, 32885, 32892, 32903, 32911, 32920, 32930, 32938, 32943, 11373, - 32947, 32955, 32963, 32968, 17155, 4008, 32974, 32980, 32986, 6462, - 32991, 32995, 33002, 33008, 33014, 33018, 33024, 33029, 33036, 1376, - 33042, 33049, 33053, 1283, 6470, 33058, 33068, 33076, 33082, 33092, - 33101, 33109, 33115, 33120, 33128, 33135, 12911, 33141, 33148, 33153, - 33160, 33170, 1436, 230, 2149, 33176, 33182, 33189, 33200, 33211, 33219, - 33226, 33236, 33245, 33253, 33262, 33269, 33276, 33289, 33296, 33302, - 33313, 33332, 1188, 33337, 33342, 33350, 3891, 33354, 33359, 33363, - 33367, 1380, 28422, 33377, 33381, 33386, 33390, 33396, 3758, 33402, - 33410, 33417, 33428, 33437, 33445, 33470, 33478, 33483, 3892, 377, 33489, - 33497, 33505, 33512, 33518, 33523, 2218, 12332, 33530, 33536, 29934, - 30209, 33542, 613, 106, 33546, 33550, 33556, 715, 10371, 33561, 33568, - 33574, 33578, 33582, 1581, 33585, 33589, 17669, 33592, 33597, 33604, - 33610, 8713, 33615, 33623, 33630, 33636, 25696, 33640, 33644, 33648, - 33652, 3962, 19497, 33656, 33661, 33665, 33668, 33676, 33684, 33689, - 33698, 33706, 33709, 33716, 33726, 33738, 33746, 33751, 33755, 33763, - 33770, 33776, 33783, 33790, 33793, 33797, 33801, 1391, 33811, 33813, - 33818, 33824, 33830, 33835, 33840, 33845, 33850, 33855, 33860, 33865, - 33870, 33875, 33880, 33885, 33890, 33895, 33900, 33906, 33912, 33918, - 33924, 33929, 33934, 33939, 33945, 33950, 33955, 33960, 33966, 33971, - 33977, 33982, 33987, 33992, 33997, 34003, 34008, 34014, 34019, 34024, - 34029, 34034, 34040, 34045, 34051, 34056, 34061, 34066, 34071, 34076, - 34081, 34086, 34091, 34096, 34102, 34108, 34114, 34119, 34124, 34129, - 34134, 34140, 34146, 34152, 34158, 34164, 34170, 34175, 34181, 34186, - 34191, 34196, 34201, 34207, 2486, 34212, 2493, 2500, 2886, 34217, 2506, - 2516, 34223, 2548, 2553, 2558, 34227, 34232, 34237, 34243, 34248, 34253, - 34257, 34262, 34268, 34273, 34278, 34283, 34289, 34294, 34298, 34302, - 34307, 34312, 34317, 34322, 34327, 34333, 34339, 34344, 34348, 34353, - 34359, 34363, 34368, 34373, 34378, 34383, 34387, 34390, 34395, 34400, - 34405, 34410, 34415, 34421, 34427, 34432, 34437, 34442, 34446, 34451, - 34456, 34461, 34466, 34471, 34476, 34480, 34485, 34490, 34495, 34499, - 34503, 34507, 34512, 34520, 34525, 34530, 34536, 34542, 34548, 34553, - 34561, 34565, 34568, 34573, 34578, 34582, 34587, 34592, 34596, 34601, - 34605, 34608, 34613, 4104, 20257, 34618, 34623, 34628, 34633, 34641, - 24401, 33046, 10010, 34646, 34651, 34655, 34660, 34664, 34668, 34673, - 34677, 34680, 34683, 34687, 34692, 34696, 34704, 34708, 34711, 34716, - 34720, 34724, 34729, 34734, 34738, 34744, 34749, 34754, 34761, 34768, - 34772, 34775, 34781, 34790, 34797, 34805, 34812, 34816, 34821, 34825, - 34829, 34835, 34840, 34846, 34850, 34856, 34861, 34866, 34870, 34877, - 34883, 34889, 34895, 34901, 34908, 34914, 34920, 34926, 34932, 34938, - 34944, 34950, 34957, 34963, 34970, 34976, 34982, 34988, 34994, 35000, - 35006, 35012, 35018, 35024, 35030, 35035, 35040, 13266, 35045, 35051, - 35056, 35061, 35066, 35071, 35074, 35080, 35085, 35093, 35098, 35102, - 35107, 35113, 35122, 35128, 35133, 35138, 35143, 35147, 35152, 35156, - 35161, 35166, 35171, 35176, 35183, 35190, 35196, 35202, 35207, 19116, - 35214, 35220, 35227, 35233, 35239, 35244, 35252, 35257, 10916, 35261, - 35266, 35271, 35277, 35282, 35287, 35291, 35296, 35301, 35307, 35312, - 35317, 35322, 35326, 35331, 35336, 35340, 35345, 35350, 35354, 35359, - 35363, 35368, 35373, 35378, 35382, 35387, 35391, 35396, 35400, 35404, - 35408, 17825, 35413, 35420, 35429, 35435, 35441, 35450, 35458, 35467, - 35475, 35480, 35484, 35491, 35497, 35505, 35509, 35512, 35517, 35521, - 35530, 35538, 35556, 35562, 1435, 35568, 35571, 35575, 25836, 25842, - 35581, 35585, 35596, 35607, 35618, 35630, 35634, 35641, 35648, 35655, - 35660, 35664, 35672, 35677, 35682, 35687, 35692, 6527, 1050, 24400, - 35697, 35702, 35706, 35711, 35715, 35721, 35726, 35732, 35737, 35743, - 35748, 35754, 35759, 35765, 35771, 35777, 35782, 35738, 35744, 35786, - 35791, 35797, 35802, 35808, 35813, 35819, 35824, 35749, 11983, 35828, - 35760, 35766, 35772, 2978, 3672, 35834, 35837, 35842, 35848, 35854, - 35860, 35867, 35873, 35879, 35885, 35891, 35897, 35903, 35909, 35915, - 35921, 35927, 35933, 35939, 35946, 35952, 35958, 35964, 35970, 35976, - 35979, 35984, 35987, 35994, 35999, 36007, 36011, 36016, 36021, 36027, - 36032, 36037, 36041, 36046, 36052, 36057, 36063, 36068, 36074, 36079, - 36085, 36091, 36095, 36100, 36105, 36110, 36115, 36119, 36124, 36129, - 36134, 36140, 36146, 36152, 36158, 36163, 36167, 36170, 36176, 36182, - 36191, 36199, 36206, 36211, 36215, 36219, 36224, 17615, 36229, 36237, - 36243, 4050, 1293, 36248, 36252, 8763, 36258, 36264, 36271, 8772, 36275, - 36281, 36288, 36294, 36303, 36311, 36323, 36327, 36334, 36340, 36345, - 36349, 36353, 36356, 36366, 36375, 36383, 35739, 36388, 36398, 36408, - 36418, 36424, 36429, 36439, 36444, 36457, 36471, 36482, 36494, 36506, - 36520, 36533, 36545, 36557, 16966, 36571, 36576, 36581, 36585, 36589, - 36593, 36597, 36603, 36608, 36613, 36618, 36623, 36628, 36633, 1758, - 31228, 36638, 36643, 35787, 36648, 36651, 36656, 36661, 36666, 36672, - 36678, 18733, 11558, 36683, 36689, 36696, 18365, 36702, 36707, 36712, - 36716, 36721, 36726, 35792, 36731, 36736, 36741, 36747, 35798, 36752, - 36755, 36762, 36770, 36776, 36782, 36788, 36799, 36804, 36811, 36818, - 36825, 36833, 36842, 36851, 36857, 36863, 36871, 35803, 36876, 36882, - 36888, 35809, 36893, 36898, 36906, 36914, 36920, 36927, 36933, 36940, - 36947, 36953, 36961, 36971, 36978, 36984, 36989, 36995, 37000, 37005, - 37012, 37021, 37029, 37034, 37040, 37047, 37055, 37061, 37066, 37072, - 37081, 37088, 32169, 37094, 37098, 37103, 37112, 37117, 37122, 37127, - 14446, 37135, 37140, 37145, 37150, 37154, 37159, 37164, 37171, 37176, - 37181, 37186, 35814, 24329, 37192, 2589, 155, 37195, 37198, 37202, 37206, - 37216, 37224, 37231, 37235, 37239, 37242, 37250, 37257, 37264, 30163, - 37273, 37276, 37282, 37289, 37293, 37301, 37309, 37316, 37320, 37324, - 37327, 37333, 37340, 37344, 37348, 37355, 37363, 37371, 35750, 37378, - 37386, 37391, 37403, 11639, 11646, 11653, 11660, 11667, 11674, 578, 404, - 37409, 37414, 37419, 37425, 37430, 37435, 4071, 37440, 37443, 37448, - 37453, 37458, 37463, 37468, 37475, 25960, 37480, 37485, 37490, 37495, - 37500, 37506, 37511, 37517, 35990, 37523, 37528, 37534, 37540, 37550, - 37555, 37560, 37564, 37569, 37574, 37579, 37584, 37597, 37602, 25574, - 19579, 978, 37606, 37612, 37616, 37621, 37626, 37632, 37637, 37642, - 37646, 37651, 37656, 37662, 37667, 37672, 1298, 37676, 37681, 37686, - 37691, 37695, 37700, 37705, 37710, 37716, 37722, 37727, 37731, 37735, - 37740, 37745, 37750, 37754, 37759, 37767, 37771, 37777, 37781, 37788, - 37797, 19350, 35761, 37803, 37810, 37818, 37825, 37831, 37844, 37856, - 37861, 37867, 37871, 2905, 37875, 37879, 37335, 37888, 37899, 37910, - 37915, 32232, 37920, 37925, 37929, 32352, 25847, 37934, 37938, 37943, - 35767, 24436, 37947, 37952, 37958, 37963, 37967, 37971, 37974, 37978, - 37984, 37993, 38004, 38016, 35773, 38021, 38024, 38028, 38032, 38037, - 38042, 38047, 38052, 38057, 38062, 38067, 38072, 341, 38077, 38082, - 38087, 38092, 38097, 38102, 38108, 38113, 38118, 38124, 38129, 38135, - 38140, 38146, 38151, 38156, 38161, 38166, 38171, 38176, 38181, 38186, - 38192, 38197, 38202, 38207, 38212, 38217, 38222, 38227, 38233, 38239, - 38244, 38249, 38254, 38259, 38264, 38269, 38274, 38279, 38284, 38289, - 38294, 38299, 38304, 38309, 38314, 38319, 38324, 38329, 38339, 38349, - 38355, 331, 9, 38360, 38364, 38368, 38376, 38380, 38384, 38387, 16395, - 38390, 38395, 38399, 38404, 38408, 38413, 38417, 38422, 38426, 38429, - 38431, 38435, 38440, 38444, 38455, 38458, 38460, 38464, 38476, 38488, - 38497, 38501, 38511, 38515, 38521, 38526, 38535, 38541, 38546, 38551, - 38555, 38559, 38564, 38571, 38576, 38582, 38587, 38591, 38598, 29589, - 29599, 38602, 38607, 38612, 38617, 38624, 38628, 38635, 38641, 8918, - 38645, 38654, 38662, 38677, 38691, 38700, 38708, 38719, 38728, 38733, - 38740, 38750, 7924, 38760, 38765, 38770, 38774, 38777, 38782, 38786, - 38791, 38795, 38802, 38807, 38812, 38817, 38827, 38832, 38837, 38842, - 9883, 38847, 38849, 38857, 38860, 38863, 38865, 38869, 38875, 38879, - 38884, 38889, 38907, 38921, 38940, 38957, 38966, 38974, 38979, 38984, - 1428, 38990, 38996, 39001, 39011, 39020, 39028, 39033, 39039, 39044, - 39053, 39062, 39073, 39078, 39085, 39091, 39095, 39104, 39111, 39119, - 39126, 39139, 39147, 39151, 39161, 39166, 39170, 39178, 39186, 39191, - 39195, 39199, 39208, 39214, 39219, 39227, 39237, 39246, 39255, 39264, - 39275, 39283, 39294, 39303, 39311, 39318, 39324, 39329, 39340, 39351, - 39356, 39360, 39363, 39367, 39375, 39381, 39392, 39403, 39414, 39425, - 39436, 39447, 39458, 39469, 39481, 39493, 39505, 39517, 39529, 39541, - 39553, 39562, 39566, 39574, 39580, 39586, 39593, 39599, 39604, 39610, - 39614, 39619, 39624, 39629, 38334, 38344, 2460, 39634, 39636, 39641, - 39646, 39651, 39654, 39656, 39660, 39663, 39670, 39674, 11229, 39678, - 39684, 39694, 39699, 39705, 39709, 39714, 39727, 30057, 39733, 39742, - 39751, 20480, 39758, 39767, 36404, 39775, 39780, 39784, 39793, 39801, - 39808, 39813, 39817, 39822, 39827, 39835, 39839, 39847, 39853, 39859, - 39864, 39869, 39873, 39876, 39881, 39894, 39910, 26450, 39927, 39939, - 39956, 39968, 39982, 26467, 26486, 39994, 40006, 2779, 40020, 40025, - 40030, 40035, 40039, 40046, 40058, 40065, 40074, 40077, 40088, 40099, - 40107, 40112, 40116, 40121, 40126, 40131, 40136, 40141, 40146, 36868, - 927, 40151, 40155, 40159, 40162, 40167, 40172, 40178, 40183, 40188, - 40194, 40200, 40205, 40209, 40214, 40219, 40224, 40228, 40231, 40237, - 40242, 40247, 40252, 40256, 40261, 40267, 40275, 30336, 40280, 40285, - 40292, 40298, 40304, 40309, 40317, 25969, 40324, 40329, 40334, 40339, - 40343, 40346, 40351, 40355, 40359, 40366, 40372, 40378, 40384, 40391, - 40396, 40402, 39181, 40406, 40410, 40415, 40428, 40433, 40439, 40447, - 40454, 40462, 40472, 40478, 40484, 40490, 40494, 40503, 40511, 40518, - 40523, 40528, 12006, 40533, 40543, 40550, 40556, 40566, 40571, 40577, - 40585, 3924, 40592, 40599, 40605, 40612, 3930, 40616, 40621, 40632, - 40639, 40645, 40654, 40658, 4502, 40661, 40668, 40674, 40680, 40688, - 40698, 33513, 40705, 40713, 40719, 40724, 40730, 40735, 40739, 29901, - 40745, 40752, 40758, 40766, 40775, 40782, 40788, 40799, 27269, 40805, - 40815, 40820, 40824, 40832, 40840, 40847, 40853, 40858, 10874, 6502, - 40863, 40867, 40869, 40873, 40878, 40880, 40885, 40891, 40896, 40901, - 40908, 37471, 40914, 40919, 40923, 40928, 40932, 40941, 40945, 40951, - 40958, 40964, 40971, 40976, 40985, 40990, 40994, 40999, 41006, 41014, - 41022, 41027, 24492, 41031, 41034, 41038, 41042, 12429, 944, 41046, - 41051, 41059, 41064, 41068, 41077, 41084, 41088, 41092, 41100, 41107, - 15728, 41117, 41121, 41125, 41133, 41141, 41147, 41152, 41161, 15476, - 41167, 41176, 41183, 41188, 41195, 41202, 41210, 41217, 41225, 41233, - 41242, 41247, 41254, 41261, 41268, 41275, 41282, 41287, 41294, 41300, - 41317, 41325, 41335, 41343, 41350, 439, 41354, 41360, 41364, 41369, - 38724, 41375, 41378, 41382, 41388, 41399, 41407, 3935, 41415, 41421, - 41427, 41437, 41443, 41452, 41461, 41471, 41478, 41484, 41489, 3941, - 3947, 41498, 41505, 41513, 41518, 41522, 41529, 41537, 41544, 41551, - 41557, 41566, 41576, 41582, 41590, 41599, 41606, 41614, 41621, 25249, - 41625, 41632, 41638, 41648, 41657, 41665, 41676, 41680, 41690, 41697, - 41702, 41708, 41715, 41723, 41732, 41741, 41751, 41762, 41769, 41774, - 41781, 3193, 41789, 41795, 41800, 41807, 41813, 41819, 41824, 41837, - 41850, 41863, 41870, 41876, 41884, 41892, 41897, 41901, 41905, 41910, - 41915, 41920, 41925, 41930, 41935, 1397, 41940, 41944, 41948, 41952, - 41956, 41960, 41964, 41968, 41972, 41976, 41980, 41984, 41988, 41992, - 41996, 42000, 42004, 42008, 42012, 42016, 42020, 42024, 42028, 42032, - 42036, 42040, 42044, 42048, 42052, 42056, 42060, 42064, 42068, 42072, - 42076, 42080, 42084, 42088, 42092, 42096, 42100, 42104, 42108, 42112, - 42116, 42120, 42124, 42128, 42132, 42136, 42140, 42144, 42148, 42152, - 42156, 42160, 42164, 42168, 42172, 42176, 42180, 42184, 42188, 42192, - 42196, 42200, 42204, 42208, 42212, 42216, 42220, 42224, 42228, 42232, - 42236, 42240, 42244, 42248, 42252, 42256, 42260, 42264, 42268, 42272, - 42276, 42280, 42284, 42288, 42292, 42296, 42300, 42304, 42308, 42312, - 42316, 42320, 42324, 42328, 42332, 42336, 42340, 42344, 42348, 42352, - 42356, 42360, 42364, 42368, 42372, 42376, 42380, 42384, 42388, 42392, - 42396, 42400, 42404, 42408, 42412, 42416, 42420, 42424, 42428, 42432, - 42436, 42440, 42444, 42448, 42452, 42456, 42460, 42464, 42468, 42472, - 42476, 42480, 42484, 42488, 42492, 42496, 42500, 42504, 42508, 42512, - 42516, 42520, 42524, 42528, 42532, 42536, 42540, 42544, 42548, 42552, - 42557, 42561, 42566, 42570, 42575, 42579, 42584, 42588, 42594, 42599, - 42603, 42608, 42612, 42617, 42621, 42626, 42630, 42635, 42639, 42644, - 42648, 42653, 42657, 42663, 42669, 42674, 42678, 42683, 42687, 42693, - 42698, 42702, 42707, 42711, 42716, 42720, 42726, 42731, 42735, 42740, - 42744, 42749, 42753, 42758, 42762, 42768, 42773, 42777, 42782, 42786, - 42792, 42797, 42801, 42806, 42810, 42815, 42819, 42824, 42828, 42833, - 42837, 42843, 42848, 42852, 42858, 42863, 42867, 42873, 42878, 42882, - 42887, 42891, 42896, 42900, 42906, 42912, 42918, 42924, 42930, 42936, - 42942, 42948, 42953, 42957, 42962, 42966, 42972, 42977, 42981, 42986, - 42990, 42995, 42999, 43004, 43008, 43013, 43017, 43022, 43026, 43031, - 43035, 43041, 43046, 43050, 43055, 43059, 43065, 43071, 43076, 127, 63, - 43080, 43082, 43086, 43090, 43094, 43099, 43103, 43107, 43112, 10787, - 43117, 43123, 1703, 6943, 43129, 43132, 43137, 43141, 43146, 43150, - 43154, 43159, 11790, 43163, 43167, 43171, 571, 43175, 17934, 43180, - 43184, 43189, 43194, 43199, 43203, 43210, 30081, 43216, 43219, 43223, - 43228, 43234, 43238, 43241, 43249, 43255, 43260, 43264, 43267, 43271, - 43277, 43281, 43285, 3723, 3728, 14558, 43288, 43292, 43296, 43300, - 43304, 43312, 43319, 43323, 15426, 43330, 43335, 43349, 43356, 43367, - 361, 43372, 43376, 43382, 43394, 43400, 43406, 43411, 43417, 43421, - 33786, 43430, 43436, 43445, 43449, 43453, 43458, 43464, 43469, 43473, - 43478, 43482, 43486, 43493, 43499, 43504, 43515, 43530, 43545, 43560, - 43576, 43594, 11704, 43608, 43615, 43619, 43622, 43631, 43636, 43640, - 43648, 18568, 43656, 43660, 43670, 43681, 33711, 43694, 43698, 43707, - 43725, 43744, 43753, 43761, 43769, 11069, 11903, 43773, 25859, 43776, - 34700, 43781, 11068, 43786, 43792, 43797, 43803, 43808, 43814, 43819, - 43825, 43830, 43836, 43842, 43848, 43853, 43809, 43815, 43857, 43820, - 43826, 43831, 43862, 43837, 43843, 8931, 4327, 43868, 43876, 43880, - 43883, 43890, 43894, 43899, 43904, 43911, 43917, 43923, 43928, 17247, - 43932, 29918, 43936, 43940, 43944, 43950, 43954, 32103, 43963, 10043, - 43967, 10469, 43970, 43977, 43983, 43987, 13867, 43994, 44000, 44005, - 44012, 44019, 44026, 32872, 8828, 44033, 44040, 44047, 44053, 44058, - 44065, 44076, 44082, 44087, 44092, 44097, 44101, 44106, 44113, 43810, - 44117, 44127, 44136, 44147, 44153, 44161, 44168, 44173, 44178, 44183, - 44188, 44193, 44197, 44201, 44208, 44214, 44222, 2353, 29018, 11806, - 11818, 11823, 11829, 44231, 11834, 11839, 11845, 44236, 44246, 44250, - 11850, 44255, 19777, 44258, 44263, 44267, 40069, 44278, 44283, 44290, - 44297, 44301, 44304, 44312, 11717, 44319, 44322, 44328, 44338, 6554, - 44347, 44352, 44358, 44362, 44370, 44374, 44384, 44390, 44395, 44406, - 44415, 44424, 44433, 44442, 44451, 44460, 44469, 44475, 44481, 44486, - 44492, 44498, 44504, 44509, 44512, 44519, 44525, 44529, 44534, 44541, - 44548, 44552, 44555, 44565, 44578, 44587, 44596, 44607, 44620, 44632, - 44643, 44652, 44663, 44668, 44677, 44682, 11855, 44688, 44695, 44703, - 44708, 44713, 30127, 44717, 44724, 4267, 25, 44728, 44733, 19626, 44737, - 44740, 44743, 32289, 44747, 32881, 44755, 44759, 44763, 44766, 44772, - 44778, 44783, 35838, 44792, 44800, 44806, 44813, 32272, 44817, 32503, - 44821, 44830, 44834, 44842, 44848, 44854, 44859, 44863, 32907, 44869, - 44872, 44880, 44888, 4649, 44894, 44898, 44902, 44907, 44914, 44920, - 44925, 44930, 44934, 44940, 44945, 44951, 4555, 766, 44958, 44962, 44965, - 44977, 44984, 44989, 17807, 44993, 45001, 45009, 45017, 45025, 45032, - 45040, 45048, 45055, 45063, 45071, 45079, 45087, 45095, 45103, 45111, - 45119, 45127, 45135, 45143, 45150, 45158, 45166, 45174, 45182, 45190, - 45198, 45206, 45214, 45222, 45230, 45238, 45246, 45254, 45262, 45270, - 45278, 45286, 45294, 45302, 45309, 45317, 45324, 45332, 45340, 45348, - 45356, 45364, 45372, 45380, 45388, 45399, 25285, 45404, 45407, 45414, - 45418, 45424, 45428, 45434, 45439, 45445, 45450, 45455, 45459, 45463, - 45471, 45476, 45481, 45491, 45497, 45510, 45516, 45522, 45528, 45531, - 45538, 45543, 45549, 45554, 19522, 903, 45559, 45562, 45565, 45568, - 35922, 35928, 45571, 35934, 35947, 35953, 35959, 45577, 35965, 35971, - 45583, 45589, 18, 45597, 45604, 45608, 45612, 45620, 36757, 45624, 45628, - 45635, 45640, 45644, 45649, 45655, 45660, 45666, 45671, 45675, 45679, - 45683, 45688, 45692, 45697, 45701, 45705, 45712, 45717, 45721, 45725, - 45730, 45734, 45739, 45743, 45747, 45752, 45758, 18091, 18096, 45763, - 45767, 45770, 45776, 45780, 45784, 24286, 45789, 45793, 45799, 45806, - 45812, 45817, 38753, 45827, 45832, 45840, 45844, 45847, 36772, 45851, - 4620, 45856, 45861, 45865, 45870, 45874, 45879, 15494, 45890, 45894, - 45897, 45901, 45906, 45910, 45915, 45920, 45924, 45928, 45932, 45935, - 45939, 45942, 45947, 45952, 45957, 45962, 45967, 45972, 8415, 15510, - 45977, 45980, 45986, 45991, 45997, 46002, 46008, 46013, 46019, 46024, - 46030, 46036, 46042, 46047, 46051, 46055, 46062, 46071, 46087, 46103, - 46113, 32179, 46120, 46124, 46129, 46134, 46138, 46142, 41736, 46148, - 46153, 46157, 46164, 46169, 46174, 46178, 46181, 46185, 46191, 31031, - 46195, 24599, 46200, 46207, 46215, 46221, 46228, 46236, 46242, 46246, - 46251, 46257, 46265, 46270, 46274, 46283, 10768, 46291, 46295, 46303, - 46310, 46315, 46320, 46325, 46329, 46332, 46338, 46342, 46345, 46349, - 46356, 46361, 46365, 46371, 46375, 46381, 46386, 46391, 30422, 35985, - 46396, 46405, 46413, 46419, 46431, 46444, 46458, 46465, 46471, 46477, - 46482, 46490, 46493, 46495, 46502, 46509, 46515, 46519, 8414, 46522, - 46526, 46530, 46535, 46539, 46543, 46546, 46550, 46564, 26516, 46583, - 46596, 46609, 46622, 26534, 46637, 2732, 46652, 46658, 46662, 46672, - 46676, 46680, 46685, 46689, 46696, 46701, 46705, 46712, 46718, 46723, - 46729, 46739, 46751, 46762, 46767, 46774, 46778, 46782, 46785, 46793, - 18589, 4039, 46798, 18124, 46811, 46818, 46825, 46831, 46835, 46839, - 46844, 46850, 46855, 46861, 46865, 46869, 46872, 46877, 46881, 46886, - 46891, 46896, 46901, 46906, 46911, 46916, 46921, 46926, 8469, 18135, - 46931, 46935, 46941, 46950, 46955, 46964, 46971, 41572, 46977, 46982, - 46986, 46993, 46998, 47005, 47011, 47015, 47018, 47022, 47027, 2810, - 47034, 47041, 47045, 47048, 47053, 47058, 47064, 47069, 47074, 47078, - 47083, 47093, 47098, 47104, 47109, 44979, 47115, 47121, 47131, 47136, - 47141, 47145, 47150, 7926, 7938, 47155, 47158, 47165, 47171, 47180, 9963, - 39321, 47188, 47192, 47196, 36820, 47204, 47215, 47223, 41784, 47230, - 47235, 47240, 47251, 47258, 47269, 36844, 24616, 47277, 1022, 47282, - 15917, 47288, 32263, 47294, 47299, 47309, 47318, 47325, 47331, 47335, - 47338, 47345, 47351, 47358, 47364, 47374, 47382, 47388, 47394, 47399, - 47403, 47410, 47415, 47421, 47428, 47434, 46531, 47439, 47443, 15959, - 15968, 15977, 15986, 15995, 16024, 620, 16033, 47449, 47454, 47457, - 47463, 47471, 1315, 47476, 47480, 47485, 47490, 47495, 47502, 47508, - 47512, 47517, 47523, 47527, 35995, 47532, 47537, 47546, 47553, 47563, - 47569, 32307, 47586, 47595, 47603, 47609, 47614, 47621, 47627, 47635, - 47644, 47652, 47660, 47666, 47670, 47675, 47683, 33392, 36853, 47689, - 47708, 18492, 47722, 47738, 47752, 47758, 47763, 47768, 47773, 47779, - 36859, 47784, 47787, 47794, 47801, 47810, 47815, 47819, 420, 3100, 47826, - 47831, 47836, 31400, 47624, 47840, 47845, 47853, 47857, 47860, 47865, - 47871, 47877, 47882, 47886, 32380, 47889, 47894, 47898, 47901, 47906, - 47910, 47915, 47920, 47924, 47929, 47933, 47937, 47941, 24282, 24293, - 47946, 47951, 47957, 47962, 47968, 47974, 30987, 47979, 47983, 47986, - 47992, 47997, 48002, 48007, 48012, 48017, 48022, 48027, 48032, 48038, - 48044, 24379, 18795, 48049, 48054, 48059, 48064, 48069, 48074, 48079, - 48084, 450, 68, 36012, 36017, 36022, 36028, 36033, 36038, 48089, 36042, - 48093, 48097, 48101, 36047, 36053, 48115, 36064, 36069, 48123, 48128, - 36075, 48133, 48138, 48147, 48152, 48157, 48166, 48172, 48178, 48184, - 36092, 48197, 48206, 48212, 36096, 48216, 36101, 48221, 36106, 36111, - 48224, 48229, 48233, 48239, 15735, 48246, 15745, 48253, 48258, 36116, - 48262, 48267, 48272, 48277, 48282, 48286, 48291, 48296, 48302, 48307, - 48312, 48318, 48324, 48329, 48333, 48338, 48343, 48348, 48352, 48357, - 48362, 48367, 48373, 48379, 48385, 48390, 48394, 48399, 48403, 36120, - 36125, 36130, 48407, 48411, 48416, 48420, 48432, 36135, 36141, 36147, - 36159, 48438, 29955, 48442, 48447, 48451, 48456, 48463, 48468, 48473, - 48478, 48482, 48486, 48496, 48501, 48506, 48510, 48514, 48517, 48525, - 48530, 36207, 48534, 1407, 48540, 48545, 48551, 48559, 48563, 48572, - 48580, 48584, 48588, 48596, 48602, 48610, 48626, 48630, 48634, 48638, - 48643, 48649, 48664, 36244, 1711, 14075, 48668, 1294, 1309, 48680, 48688, - 48695, 48700, 48707, 48712, 10452, 963, 2575, 11882, 48719, 10350, 48724, - 48727, 48736, 1202, 48741, 46702, 48748, 48757, 48762, 48766, 48774, - 25915, 2631, 48781, 12382, 48791, 48797, 2371, 2381, 48806, 48815, 48825, - 48836, 3508, 39695, 48841, 4234, 4245, 19560, 1207, 48845, 48853, 48860, - 48865, 48869, 48873, 48878, 27530, 47029, 11973, 48886, 48895, 48904, - 48912, 48925, 48932, 48943, 48948, 48961, 48974, 48986, 48998, 49010, - 49021, 49034, 49045, 49056, 49066, 49074, 49082, 49094, 49106, 49117, - 49126, 49134, 49141, 49153, 49160, 49166, 49175, 49181, 49188, 49201, - 49206, 49216, 49221, 49227, 49232, 43984, 49236, 46334, 49243, 49250, - 49258, 49265, 2588, 49272, 49283, 49293, 49302, 49310, 49320, 49328, - 49337, 49347, 49356, 49361, 49367, 49373, 4083, 49384, 49394, 49403, - 49412, 49420, 49430, 49438, 49447, 49452, 49457, 49462, 1636, 47, 49470, - 49478, 49489, 49500, 19181, 49510, 49514, 49521, 49527, 49532, 49536, - 49547, 49557, 49566, 49577, 19599, 19604, 49582, 49591, 49596, 49606, - 49611, 49619, 49627, 49634, 49640, 1598, 259, 49644, 49650, 49655, 49658, - 2119, 2597, 49666, 49670, 49673, 1452, 49679, 16224, 1212, 49684, 49697, - 2721, 2742, 49711, 49723, 49735, 2756, 2773, 2788, 2804, 2821, 49749, - 49761, 2836, 49775, 1218, 1224, 1230, 12253, 49780, 49785, 49790, 49794, - 49809, 49824, 49839, 49854, 49869, 49884, 49899, 49914, 49929, 49944, - 49959, 49974, 49989, 50004, 50019, 50034, 50049, 50064, 50079, 50094, - 50109, 50124, 50139, 50154, 50169, 50184, 50199, 50214, 50229, 50244, - 50259, 50274, 50289, 50304, 50319, 50334, 50349, 50364, 50379, 50394, - 50409, 50424, 50439, 50454, 50469, 50484, 50499, 50514, 50529, 50544, - 50559, 50574, 50589, 50604, 50619, 50634, 50649, 50664, 50679, 50694, - 50709, 50724, 50739, 50754, 50769, 50784, 50799, 50814, 50829, 50844, - 50859, 50874, 50889, 50904, 50919, 50934, 50949, 50964, 50979, 50994, - 51009, 51024, 51039, 51054, 51069, 51084, 51099, 51114, 51129, 51144, - 51159, 51174, 51189, 51204, 51219, 51234, 51249, 51264, 51279, 51294, - 51309, 51324, 51339, 51354, 51369, 51384, 51399, 51414, 51429, 51444, - 51459, 51474, 51489, 51504, 51519, 51534, 51549, 51564, 51579, 51594, - 51609, 51624, 51639, 51654, 51669, 51684, 51699, 51714, 51729, 51744, - 51759, 51774, 51789, 51804, 51819, 51834, 51849, 51864, 51879, 51894, - 51909, 51924, 51939, 51954, 51969, 51984, 51999, 52014, 52029, 52044, - 52059, 52074, 52089, 52104, 52119, 52134, 52149, 52164, 52179, 52194, - 52209, 52224, 52239, 52254, 52269, 52284, 52299, 52314, 52329, 52344, - 52359, 52374, 52389, 52404, 52419, 52434, 52449, 52464, 52479, 52494, - 52509, 52524, 52539, 52554, 52569, 52584, 52599, 52614, 52629, 52644, - 52659, 52674, 52689, 52704, 52719, 52734, 52749, 52764, 52779, 52794, - 52809, 52824, 52839, 52854, 52869, 52884, 52899, 52914, 52929, 52944, - 52959, 52974, 52989, 53004, 53019, 53034, 53049, 53064, 53079, 53094, - 53109, 53124, 53139, 53154, 53169, 53184, 53199, 53214, 53229, 53244, - 53259, 53274, 53289, 53304, 53319, 53334, 53349, 53364, 53379, 53394, - 53409, 53424, 53439, 53454, 53469, 53484, 53499, 53514, 53529, 53544, - 53559, 53574, 53589, 53604, 53619, 53634, 53649, 53664, 53679, 53694, - 53709, 53724, 53739, 53754, 53769, 53784, 53799, 53814, 53829, 53844, - 53859, 53874, 53889, 53904, 53919, 53934, 53949, 53964, 53979, 53994, - 54009, 54024, 54039, 54054, 54069, 54084, 54099, 54114, 54129, 54144, - 54159, 54174, 54189, 54204, 54219, 54234, 54249, 54264, 54279, 54294, - 54309, 54324, 54339, 54354, 54369, 54384, 54399, 54414, 54429, 54444, - 54459, 54474, 54489, 54504, 54519, 54534, 54549, 54564, 54579, 54594, - 54609, 54624, 54639, 54654, 54669, 54684, 54699, 54714, 54729, 54744, - 54759, 54774, 54789, 54804, 54819, 54834, 54849, 54864, 54879, 54894, - 54909, 54924, 54939, 54954, 54969, 54984, 54999, 55014, 55029, 55044, - 55059, 55074, 55089, 55104, 55119, 55134, 55149, 55164, 55179, 55194, - 55209, 55224, 55239, 55254, 55269, 55284, 55299, 55314, 55329, 55344, - 55359, 55374, 55389, 55404, 55419, 55434, 55449, 55464, 55479, 55494, - 55509, 55524, 55539, 55554, 55569, 55584, 55599, 55614, 55629, 55644, - 55659, 55674, 55689, 55704, 55719, 55734, 55749, 55764, 55779, 55794, - 55809, 55824, 55839, 55854, 55869, 55884, 55899, 55914, 55929, 55944, - 55959, 55974, 55989, 56004, 56019, 56034, 56049, 56064, 56079, 56094, - 56109, 56124, 56139, 56154, 56169, 56184, 56199, 56214, 56229, 56244, - 56259, 56274, 56289, 56304, 56319, 56334, 56349, 56364, 56379, 56394, - 56409, 56424, 56439, 56454, 56469, 56484, 56499, 56514, 56529, 56544, - 56559, 56574, 56589, 56604, 56619, 56634, 56649, 56664, 56679, 56694, - 56709, 56724, 56739, 56754, 56769, 56784, 56799, 56814, 56829, 56844, - 56859, 56874, 56889, 56904, 56919, 56934, 56949, 56964, 56979, 56994, - 57009, 57024, 57039, 57054, 57069, 57084, 57099, 57114, 57129, 57144, - 57159, 57174, 57189, 57204, 57219, 57234, 57249, 57264, 57279, 57294, - 57309, 57324, 57339, 57354, 57369, 57384, 57399, 57414, 57429, 57444, - 57459, 57474, 57489, 57504, 57519, 57534, 57549, 57564, 57579, 57594, - 57609, 57625, 57641, 57657, 57673, 57689, 57705, 57721, 57737, 57753, - 57769, 57785, 57801, 57817, 57833, 57849, 57865, 57881, 57897, 57913, - 57929, 57945, 57961, 57977, 57993, 58009, 58025, 58041, 58057, 58073, - 58089, 58105, 58121, 58137, 58153, 58169, 58185, 58201, 58217, 58233, - 58249, 58265, 58281, 58297, 58313, 58329, 58345, 58361, 58377, 58393, - 58409, 58425, 58441, 58457, 58473, 58489, 58505, 58521, 58537, 58553, - 58569, 58585, 58601, 58617, 58633, 58649, 58665, 58681, 58697, 58713, - 58729, 58745, 58761, 58777, 58793, 58809, 58825, 58841, 58857, 58873, - 58889, 58905, 58921, 58937, 58953, 58969, 58985, 59001, 59017, 59033, - 59049, 59065, 59081, 59097, 59113, 59129, 59145, 59161, 59177, 59193, - 59209, 59225, 59241, 59257, 59273, 59289, 59305, 59321, 59337, 59353, - 59369, 59385, 59401, 59417, 59433, 59449, 59465, 59481, 59497, 59513, - 59529, 59545, 59561, 59577, 59593, 59609, 59625, 59641, 59657, 59673, - 59689, 59705, 59721, 59737, 59753, 59769, 59785, 59801, 59817, 59833, - 59849, 59865, 59881, 59897, 59913, 59929, 59945, 59961, 59977, 59993, - 60009, 60025, 60041, 60057, 60073, 60089, 60105, 60121, 60137, 60153, - 60169, 60185, 60201, 60217, 60233, 60249, 60265, 60281, 60297, 60313, - 60329, 60345, 60361, 60377, 60393, 60409, 60425, 60441, 60457, 60473, - 60489, 60505, 60521, 60537, 60553, 60569, 60585, 60601, 60617, 60633, - 60649, 60665, 60681, 60697, 60713, 60729, 60745, 60761, 60777, 60793, - 60809, 60825, 60841, 60857, 60873, 60889, 60905, 60921, 60937, 60953, - 60969, 60985, 61001, 61017, 61033, 61049, 61065, 61081, 61097, 61113, - 61129, 61145, 61161, 61177, 61193, 61209, 61225, 61241, 61257, 61273, - 61289, 61305, 61321, 61337, 61353, 61369, 61385, 61401, 61417, 61433, - 61449, 61465, 61481, 61497, 61513, 61529, 61545, 61561, 61577, 61593, - 61609, 61625, 61641, 61657, 61673, 61689, 61705, 61721, 61737, 61753, - 61769, 61785, 61801, 61817, 61833, 61849, 61865, 61881, 61897, 61913, - 61929, 61945, 61961, 61977, 61993, 62009, 62025, 62041, 62057, 62073, - 62089, 62105, 62121, 62137, 62153, 62169, 62185, 62201, 62217, 62233, - 62249, 62265, 62281, 62297, 62313, 62329, 62345, 62361, 62377, 62393, - 62409, 62425, 62441, 62457, 62473, 62489, 62505, 62521, 62537, 62553, - 62569, 62585, 62601, 62617, 62633, 62649, 62665, 62681, 62697, 62713, - 62729, 62745, 62761, 62777, 62793, 62809, 62825, 62841, 62857, 62873, - 62889, 62905, 62921, 62937, 62953, 62969, 62985, 63001, 63017, 63033, - 63049, 63065, 63081, 63097, 63113, 63129, 63145, 63161, 63177, 63193, - 63209, 63225, 63241, 63257, 63273, 63289, 63305, 63321, 63337, 63353, - 63369, 63385, 63401, 63417, 63433, 63449, 63465, 63481, 63497, 63513, - 63529, 63545, 63561, 63577, 63593, 63609, 63625, 63641, 63657, 63673, - 63689, 63705, 63721, 63737, 63753, 63769, 63785, 63801, 63817, 63833, - 63849, 63865, 63881, 63897, 63913, 63929, 63945, 63961, 63977, 63993, - 64009, 64025, 64041, 64057, 64073, 64089, 64105, 64121, 64137, 64153, - 64169, 64185, 64201, 64217, 64233, 64249, 64265, 64281, 64297, 64313, - 64329, 64345, 64361, 64377, 64393, 64409, 64425, 64441, 64457, 64473, - 64489, 64505, 64521, 64537, 64553, 64569, 64585, 64601, 64617, 64633, - 64649, 64665, 64681, 64697, 64713, 64729, 64745, 64761, 64777, 64793, - 64809, 64825, 64841, 64857, 64873, 64889, 64905, 64921, 64937, 64953, - 64969, 64985, 65001, 65017, 65033, 65049, 65065, 65081, 65097, 65113, - 65129, 65145, 65161, 65177, 65193, 65209, 65225, 65241, 65257, 65273, - 65289, 65305, 65321, 65337, 65353, 65369, 65385, 65401, 65417, 65433, - 65449, 65465, 65481, 65497, 65513, 65529, 65545, 65561, 65577, 65593, - 65609, 65625, 65641, 65657, 65673, 65689, 65705, 65721, 65737, 65753, - 65769, 65785, 65801, 65817, 65833, 65849, 65865, 65881, 65897, 65913, - 65929, 65945, 65961, 65977, 65993, 66009, 66025, 66041, 66057, 66073, - 66089, 66105, 66121, 66137, 66153, 66169, 66185, 66201, 66217, 66233, - 66249, 66265, 66281, 66290, 66305, 17090, 66314, 66319, 66325, 66331, - 66341, 66349, 17343, 18025, 11298, 66362, 1460, 1464, 66370, 4163, 31515, - 7863, 66376, 66381, 66386, 66391, 66396, 66402, 66407, 66413, 66418, - 66424, 66429, 66434, 66439, 66444, 66450, 66455, 66460, 66465, 66470, - 66475, 66480, 66485, 66491, 66496, 66502, 66509, 2635, 66514, 66520, - 9347, 66524, 66529, 66536, 66544, 4174, 4179, 4184, 4189, 65, 66548, - 66554, 66559, 66564, 66568, 66573, 66577, 66581, 12325, 66585, 66595, - 66608, 66619, 66632, 66639, 66645, 66653, 11807, 66660, 66665, 66671, - 66677, 66683, 66688, 66693, 66698, 66703, 66707, 66712, 66717, 66722, - 66728, 66734, 66740, 66745, 66749, 66754, 66759, 66763, 66768, 66773, - 66778, 66782, 12341, 12352, 12357, 1503, 66786, 66792, 1508, 19026, - 66797, 19035, 66802, 66808, 66813, 1539, 66819, 1545, 1551, 12387, 66824, - 66833, 66841, 66849, 66856, 66860, 66864, 66870, 66875, 35651, 66880, - 66887, 66894, 66899, 66903, 66907, 66916, 66921, 66926, 66931, 1556, 264, - 66936, 66940, 19161, 984, 66944, 66951, 66956, 66960, 19197, 1560, 44141, - 66963, 66968, 66978, 66987, 66992, 66996, 67002, 1565, 46983, 67007, - 67016, 67022, 67027, 67032, 12626, 12632, 67038, 67050, 67067, 67084, - 67101, 67118, 67135, 67152, 67169, 67186, 67203, 67220, 67237, 67254, - 67271, 67288, 67305, 67322, 67339, 67356, 67373, 67390, 67407, 67424, - 67441, 67458, 67475, 67492, 67509, 67526, 67543, 67560, 67577, 67594, - 67611, 67628, 67645, 67662, 67679, 67696, 67713, 67730, 67747, 67764, - 67781, 67798, 67815, 67832, 67849, 67866, 67883, 67894, 67904, 67909, - 1570, 67913, 67918, 67924, 67929, 67934, 67941, 10369, 1575, 67947, - 67956, 31894, 67961, 67972, 12643, 67982, 67987, 67993, 67998, 68005, - 68011, 68016, 1580, 19491, 68021, 68027, 12653, 68033, 68038, 68043, - 68048, 68053, 68058, 68063, 68068, 1585, 4638, 68073, 68078, 68084, - 68089, 68094, 68099, 68104, 68109, 68114, 68119, 68124, 68130, 68136, - 68142, 68147, 68151, 68156, 68161, 68165, 68170, 68175, 68180, 68185, - 68189, 68194, 68200, 68205, 68210, 68214, 68219, 68224, 68230, 68235, - 68240, 68246, 68252, 68257, 68261, 68266, 68271, 68276, 68280, 68285, - 68290, 68295, 68301, 68307, 68312, 68316, 68320, 68325, 68330, 68335, - 33586, 68339, 68344, 68349, 68355, 68360, 68365, 68369, 68374, 68379, - 68385, 68390, 68395, 68401, 68407, 68412, 68416, 68421, 68426, 68430, - 68435, 68440, 68445, 68451, 68457, 68462, 68466, 68471, 68476, 68480, - 68485, 68490, 68495, 68500, 68504, 68507, 68510, 68515, 68520, 36371, - 68527, 68535, 68541, 3840, 31837, 68554, 68561, 68567, 68573, 4014, - 68578, 12795, 68584, 68594, 68609, 68617, 12800, 68628, 68633, 68644, - 68656, 68668, 68680, 2827, 68692, 68697, 68709, 68713, 68719, 68725, - 68730, 68739, 68746, 68751, 68756, 68761, 68766, 68771, 68776, 1602, - 18664, 68781, 68786, 47049, 68790, 68794, 68799, 68803, 19639, 68808, - 68811, 68816, 68824, 68832, 1606, 12836, 12842, 1611, 68840, 68847, - 68852, 68861, 68871, 68878, 68883, 68888, 1616, 68895, 68900, 19759, - 68904, 68909, 68916, 68922, 68926, 68939, 68945, 68956, 68966, 68973, - 19781, 10263, 10270, 4248, 4254, 68980, 1621, 68985, 68994, 69000, 69008, - 69015, 69021, 69028, 69040, 69046, 69051, 69058, 69070, 69081, 69090, - 69100, 69110, 4142, 69118, 35445, 35454, 19821, 69131, 69136, 69141, - 69146, 69151, 69156, 69161, 1626, 1630, 69166, 69170, 69173, 69184, - 69189, 1640, 69197, 69202, 69207, 19880, 69219, 69222, 69228, 69234, - 69239, 69247, 1645, 69252, 69257, 69265, 69273, 69280, 69289, 69297, - 69306, 69310, 1650, 69319, 1655, 24467, 69324, 69331, 69337, 19967, - 69345, 69355, 69361, 69366, 69374, 69381, 69390, 69398, 69408, 69417, - 69427, 69436, 69447, 69457, 69467, 69476, 69486, 69500, 69513, 69522, - 69530, 69540, 69549, 69561, 69572, 69583, 69593, 19259, 69598, 12988, - 69607, 69613, 69618, 69625, 69632, 69638, 18870, 69648, 69654, 69659, - 69670, 69677, 69684, 69689, 69697, 13005, 13010, 69705, 69711, 69715, - 4232, 4243, 20043, 47137, 69723, 69729, 69734, 69742, 69749, 14056, - 69754, 69760, 69766, 1666, 69771, 69774, 69780, 69785, 69790, 69795, - 69800, 69805, 69810, 69815, 69820, 69826, 69832, 1373, 69837, 69842, - 69847, 69853, 69858, 69863, 69868, 69873, 69878, 69883, 1675, 13, 69889, - 69893, 69898, 69902, 69906, 69910, 36652, 69915, 26735, 69920, 69925, - 69929, 69932, 69936, 69940, 69945, 69949, 69954, 69958, 69964, 40163, - 40168, 40173, 69967, 69974, 69980, 69988, 46755, 69998, 40179, 36916, - 36667, 36673, 40195, 36679, 70003, 70008, 70012, 36949, 70019, 70022, - 70026, 70034, 70041, 70046, 70049, 70054, 70059, 70063, 70067, 70070, - 70080, 70092, 70099, 70105, 36684, 70112, 38567, 70115, 9364, 1108, - 70118, 70122, 70127, 4057, 70131, 70134, 15778, 70141, 70148, 70161, - 70169, 70178, 70187, 70193, 70198, 70208, 70221, 70233, 70240, 70245, - 70254, 70267, 41831, 70285, 70290, 70297, 70303, 70308, 844, 70313, - 70321, 70328, 70335, 31341, 866, 70341, 70347, 70357, 70365, 70371, - 70376, 36703, 6637, 36717, 70380, 70390, 70395, 70403, 70413, 70428, - 70434, 70440, 36727, 70445, 35793, 70449, 70454, 70461, 70466, 70470, - 70475, 70483, 19824, 70490, 70495, 70499, 6678, 36753, 70503, 70509, 330, - 70519, 70526, 70533, 70539, 70546, 70551, 70560, 15409, 66972, 66982, - 70566, 70574, 70578, 70582, 70586, 70590, 70595, 70599, 70605, 70613, - 70618, 70623, 70630, 70635, 70639, 70644, 70648, 70652, 70658, 70664, - 70669, 70673, 70678, 70682, 36877, 70686, 36883, 36889, 70691, 70697, - 70704, 70709, 70713, 35810, 19478, 70716, 70720, 70725, 70732, 70738, - 70742, 70747, 46351, 70753, 70757, 70764, 70768, 70773, 70779, 70785, - 70791, 70803, 70812, 70822, 70828, 70835, 70840, 70845, 70849, 70852, - 70858, 70865, 70870, 70875, 70882, 70889, 70896, 70902, 70907, 70912, - 70920, 36894, 2465, 70925, 70930, 70936, 70941, 70947, 70952, 70957, - 70962, 70968, 36915, 70973, 70979, 70985, 70991, 36985, 70996, 71001, - 71006, 36996, 71011, 71016, 71021, 71027, 71033, 37001, 71038, 71043, - 71048, 37056, 37062, 71053, 71058, 37067, 37089, 32170, 37095, 37099, - 71063, 13757, 71067, 71075, 71081, 71089, 71096, 71102, 71112, 71118, - 71125, 12225, 37113, 71131, 71144, 71153, 71159, 71168, 71174, 71180, - 71187, 27078, 71195, 71202, 71212, 71220, 71223, 37057, 71228, 71235, - 71240, 71244, 71248, 71253, 71257, 4371, 71262, 71267, 71272, 40257, - 40262, 71276, 40276, 71281, 40281, 71286, 71292, 40293, 40299, 40305, - 71297, 71303, 25970, 71314, 71317, 71329, 71337, 37136, 71341, 71350, - 71360, 71369, 37146, 71374, 71381, 71390, 71396, 71404, 71411, 71418, - 6729, 4978, 71423, 37068, 71429, 71432, 71438, 71445, 71450, 71455, - 26982, 71459, 71465, 71471, 71476, 71481, 71485, 71491, 71497, 38451, - 71502, 41446, 43251, 43257, 37177, 37182, 71506, 71510, 71514, 71517, - 71530, 71536, 71540, 71543, 71548, 38820, 71552, 35815, 24408, 71558, - 6658, 6666, 10069, 71561, 71566, 71571, 71576, 71581, 71586, 71591, - 71596, 71601, 71606, 71612, 71617, 71622, 71628, 71633, 71638, 71643, - 71648, 71653, 71658, 71664, 71669, 71675, 71680, 71685, 71690, 71695, - 71700, 71705, 71710, 71715, 71720, 71725, 71731, 71736, 71741, 71746, - 71751, 71756, 71761, 71767, 71772, 71777, 71782, 71787, 71792, 71797, - 71802, 71807, 71812, 71818, 71823, 71828, 71833, 71838, 71844, 71850, - 71855, 71861, 71866, 71871, 71876, 71881, 71886, 1453, 156, 71891, 71895, - 71899, 71903, 28871, 71907, 71911, 71916, 71920, 71925, 71929, 71934, - 71939, 71944, 71948, 71952, 71957, 71961, 15488, 71966, 71970, 71977, - 71987, 17688, 71996, 72005, 72009, 72014, 72019, 72023, 72027, 28659, - 3183, 72031, 72037, 20325, 72041, 72050, 72058, 72064, 72069, 72081, - 72093, 72098, 72102, 72107, 72111, 72117, 72123, 72128, 72138, 72148, - 72154, 72162, 72167, 72171, 72177, 72182, 72189, 72195, 72200, 72209, - 72218, 72222, 18204, 72225, 72234, 72242, 72254, 72265, 72276, 72285, - 72289, 72298, 72306, 72316, 72324, 72331, 72341, 72347, 72352, 72359, - 72368, 72374, 72379, 72386, 72392, 72403, 60, 35588, 72409, 30253, 30263, - 72415, 72423, 72430, 72436, 72440, 72450, 72461, 72469, 72478, 72483, - 72488, 72493, 72497, 72501, 20272, 72509, 72513, 72519, 72529, 72536, - 72542, 72548, 40356, 72552, 72554, 72557, 72563, 72567, 72578, 72588, - 72594, 72601, 72608, 15425, 72616, 72622, 72631, 72640, 72646, 11169, - 72652, 72658, 72663, 72668, 72675, 72680, 72687, 72693, 72698, 72706, - 72719, 72728, 72737, 69462, 69472, 72747, 72753, 72762, 72768, 72774, - 72781, 72788, 72795, 72802, 72809, 72814, 72818, 72822, 72825, 72835, - 72839, 72851, 9733, 72860, 72871, 72876, 72880, 69481, 72886, 72893, - 72902, 72910, 72918, 72923, 72927, 72932, 72937, 72947, 72955, 72967, - 72972, 72976, 72980, 72986, 72994, 73001, 73013, 73021, 73032, 73039, - 73045, 73055, 73061, 73065, 73074, 73083, 73090, 73096, 73101, 73105, - 73109, 73113, 73122, 73131, 73140, 73146, 73152, 73158, 73163, 73170, - 73176, 73184, 73191, 73197, 14520, 73202, 73208, 73212, 16579, 73216, - 73221, 73231, 73236, 73245, 73251, 73257, 73265, 73272, 73276, 73280, - 73287, 73293, 73301, 73308, 73314, 73325, 73329, 73333, 73337, 73340, - 73346, 73351, 73356, 73360, 73364, 73373, 73381, 73388, 73394, 73401, - 27708, 46480, 73406, 73414, 73418, 73422, 73425, 73433, 73440, 73446, - 73455, 73463, 73469, 73474, 73478, 73483, 73488, 73492, 73496, 73500, - 73505, 73514, 73518, 73525, 43360, 73529, 73535, 73543, 73547, 73553, - 73561, 73567, 73572, 73583, 73591, 73597, 73606, 26117, 73614, 73621, - 73628, 73635, 73642, 73649, 49969, 15240, 73656, 73663, 73668, 40392, - 4603, 73674, 73679, 73684, 73690, 73696, 73702, 73707, 73712, 73717, - 73722, 73728, 73733, 73739, 73744, 73750, 73755, 73760, 73765, 73770, - 73775, 73780, 73785, 73791, 73796, 73802, 73807, 73812, 73817, 73822, - 73827, 73832, 73838, 73843, 73848, 73853, 73858, 73863, 73868, 73873, - 73878, 73883, 73888, 73894, 73899, 73904, 73909, 73914, 73919, 73924, - 73929, 73934, 73940, 73945, 73950, 73955, 73960, 73965, 73970, 73975, - 73980, 73985, 73990, 73995, 74000, 74006, 1830, 282, 74011, 44259, 74015, - 74018, 74023, 74027, 74030, 3554, 74035, 74040, 74044, 74053, 74064, - 74081, 74099, 74107, 72914, 74114, 74117, 74127, 74134, 74143, 74159, - 74168, 74178, 74183, 74196, 74206, 74215, 74223, 74237, 74245, 74254, - 74258, 74261, 74268, 74274, 74285, 74292, 74304, 74315, 74326, 74335, - 74342, 1213, 772, 74352, 2668, 74356, 74361, 74370, 1013, 8806, 23861, - 74378, 74386, 74400, 74413, 74417, 74422, 74427, 74432, 74438, 74444, - 74449, 9356, 17731, 74454, 74458, 74466, 9793, 74471, 74477, 74486, - 74494, 1683, 12849, 1023, 4286, 74498, 74502, 74511, 74521, 2419, 31065, - 74530, 74536, 19731, 31080, 74542, 4451, 13231, 74548, 74555, 69179, - 74559, 74563, 74569, 74574, 74579, 3773, 160, 3799, 74584, 74596, 74600, - 74604, 74610, 74615, 31914, 74619, 13219, 2862, 4, 74624, 74634, 74645, - 74656, 74666, 74672, 74683, 74690, 74696, 74702, 74710, 74717, 74723, - 74733, 74743, 74753, 74762, 27065, 1225, 74767, 74771, 74775, 74781, - 74785, 2885, 2891, 9353, 2274, 74789, 74793, 74802, 74810, 74821, 74829, - 74837, 74843, 74848, 74859, 74870, 74878, 74884, 74889, 10978, 74899, - 74907, 74911, 74915, 74920, 74924, 74936, 32363, 17633, 74943, 74953, - 74959, 74965, 7739, 11080, 74975, 74986, 74997, 75007, 75016, 75020, - 75027, 1015, 1095, 75037, 75042, 75050, 68905, 75058, 75063, 75074, - 75081, 75095, 16388, 504, 75105, 75112, 75116, 75120, 75128, 75137, - 75145, 19776, 75151, 75165, 75172, 75178, 75186, 75195, 75202, 75212, - 75220, 75227, 75235, 75242, 4250, 116, 75250, 75261, 75265, 75277, 75283, - 13427, 204, 75288, 10401, 75293, 2930, 75297, 75304, 75310, 75321, 75331, - 75339, 75346, 9744, 75353, 75362, 75370, 4331, 75383, 4348, 75387, 75392, - 75398, 75403, 75408, 75413, 2935, 540, 75419, 75432, 75436, 75441, 2940, - 1829, 892, 75445, 4352, 75453, 75459, 75463, 783, 75473, 75482, 75487, - 3790, 75491, 17382, 17389, 53331, 75495, 4383, 4260, 15118, 75503, 75510, - 75515, 27129, 75519, 75526, 75532, 75537, 75542, 17402, 192, 75547, - 75559, 75565, 75573, 2952, 1720, 75581, 75583, 75588, 75593, 75598, - 75604, 75609, 75614, 75619, 75624, 75629, 75634, 75640, 75645, 75650, - 75655, 75660, 75665, 75670, 75675, 75680, 75686, 75691, 75696, 75701, - 75707, 75712, 75718, 75723, 75728, 75733, 75738, 75743, 75748, 75753, - 75759, 75764, 75770, 75775, 75780, 75785, 75790, 75795, 75800, 75805, - 75810, 9425, 9438, 4399, 4404, 4409, 4414, 26, 75816, 75822, 75827, - 75832, 75837, 75843, 75848, 75852, 75856, 75861, 75867, 75871, 75877, - 75882, 75887, 75893, 75898, 75902, 75907, 75912, 75916, 75919, 75921, - 75925, 75928, 75935, 75940, 75944, 75949, 75953, 75957, 75961, 75970, - 75974, 37410, 75977, 37415, 75984, 75989, 37420, 75998, 76007, 37426, - 76012, 37431, 76021, 76026, 13470, 76030, 76035, 76040, 37436, 76044, - 76053, 48174, 76057, 76060, 76064, 9024, 76070, 76073, 76078, 76083, - 76087, 4072, 37441, 76090, 76094, 76097, 76108, 76113, 76117, 76123, - 76131, 76144, 76148, 76156, 76165, 76171, 76176, 76182, 76186, 76192, - 76198, 76206, 76211, 76215, 76222, 76228, 76236, 76245, 76253, 37444, - 76260, 76270, 76279, 76287, 76298, 76311, 76316, 76321, 76325, 76334, - 76340, 76347, 76360, 76372, 76383, 76395, 76402, 76411, 76420, 76429, - 76436, 76442, 76449, 76457, 76464, 76472, 76481, 76489, 76496, 76504, - 76513, 76521, 76530, 76540, 76549, 76557, 76564, 76572, 76581, 76589, - 76598, 76608, 76617, 76625, 76634, 76644, 76653, 76663, 76674, 76684, - 76693, 76701, 76708, 76716, 76725, 76733, 76742, 76752, 76761, 76769, - 76778, 76788, 76797, 76807, 76818, 76828, 76837, 76845, 76854, 76864, - 76873, 76883, 76894, 76904, 76913, 76923, 76934, 76944, 76955, 76967, - 76978, 76988, 76997, 77005, 77012, 77020, 77029, 77037, 77046, 77056, - 77065, 77073, 77082, 77092, 77101, 77111, 77122, 77132, 77141, 77149, - 77158, 77168, 77177, 77187, 77198, 77208, 77217, 77227, 77238, 77248, - 77259, 77271, 77282, 77292, 77301, 77309, 77318, 77328, 77337, 77347, - 77358, 77368, 77377, 77387, 77398, 77408, 77419, 77431, 77442, 77452, - 77461, 77471, 77482, 77492, 77503, 77515, 77526, 77536, 77547, 77559, - 77570, 77582, 77595, 77607, 77618, 77628, 77637, 77645, 77652, 77660, - 77669, 77677, 77686, 77696, 77705, 77713, 77722, 77732, 77741, 77751, - 77762, 77772, 77781, 77789, 77798, 77808, 77817, 77827, 77838, 77848, - 77857, 77867, 77878, 77888, 77899, 77911, 77922, 77932, 77941, 77949, - 77958, 77968, 77977, 77987, 77998, 78008, 78017, 78027, 78038, 78048, - 78059, 78071, 78082, 78092, 78101, 78111, 78122, 78132, 78143, 78155, - 78166, 78176, 78187, 78199, 78210, 78222, 78235, 78247, 78258, 78268, - 78277, 78285, 78294, 78304, 78313, 78323, 78334, 78344, 78353, 78363, - 78374, 78384, 78395, 78407, 78418, 78428, 78437, 78447, 78458, 78468, - 78479, 78491, 78502, 78512, 78523, 78535, 78546, 78558, 78571, 78583, - 78594, 78604, 78613, 78623, 78634, 78644, 78655, 78667, 78678, 78688, - 78699, 78711, 78722, 78734, 78747, 78759, 78770, 78780, 78791, 78803, - 78814, 78826, 78839, 78851, 78862, 78874, 78887, 78899, 78912, 78926, - 78939, 78951, 78962, 78972, 78981, 78989, 78996, 79001, 79005, 8837, - 79012, 79017, 37454, 79023, 79028, 37459, 79034, 23983, 29818, 79039, - 79045, 79053, 79059, 79065, 79072, 79079, 79084, 79089, 79093, 79098, - 79102, 79105, 79109, 79118, 79127, 79135, 79141, 79153, 79164, 79168, - 3245, 8812, 79173, 79176, 79179, 79181, 79185, 79189, 79193, 79199, - 79204, 29881, 79209, 79213, 79216, 79221, 79225, 79232, 79238, 79242, - 6822, 79246, 79251, 37481, 79255, 79262, 79271, 79279, 79285, 79296, - 79304, 79313, 79321, 79328, 79335, 79341, 79352, 37486, 79357, 79368, - 79380, 79388, 79399, 79408, 79416, 79427, 79432, 79440, 2630, 79445, - 39762, 79458, 79462, 79474, 79482, 79487, 79495, 79506, 20490, 79515, - 79521, 79528, 79536, 79542, 37496, 79547, 4377, 66345, 79554, 79557, - 79565, 79578, 79591, 79604, 79617, 79624, 79635, 79644, 79649, 49786, - 49791, 79653, 79657, 79665, 79672, 79681, 79689, 79695, 79704, 79712, - 79719, 79727, 79731, 79740, 79749, 79759, 79772, 79785, 79795, 37501, - 79801, 79808, 79814, 79820, 37507, 79825, 79828, 79832, 79840, 79849, - 49569, 79857, 79866, 79874, 79881, 79889, 79899, 79908, 79917, 38949, - 79926, 79937, 79952, 79962, 10434, 24737, 79971, 79976, 79981, 79985, - 18862, 79990, 79995, 80001, 80006, 80011, 80017, 80022, 80027, 24697, - 80032, 80039, 80047, 80055, 80063, 80068, 80075, 80082, 80087, 1738, - 80091, 80095, 80103, 80111, 37524, 80117, 80123, 80135, 80141, 80148, - 80152, 80159, 80164, 80171, 80177, 80184, 80195, 80205, 80215, 80227, - 80233, 80241, 80247, 80257, 80267, 37551, 80276, 80285, 80291, 80303, - 80314, 80321, 80326, 80330, 80338, 80344, 80349, 80354, 80361, 80369, - 80381, 80391, 80400, 80409, 80417, 80424, 39595, 27496, 80430, 80435, - 80439, 80443, 80448, 80456, 80462, 80473, 80486, 80491, 80498, 37556, - 80503, 80515, 80524, 80532, 80542, 80553, 80566, 80573, 80582, 80591, - 80599, 80604, 80610, 80614, 1442, 80619, 80624, 80629, 80634, 80640, - 80645, 80650, 80656, 80662, 80667, 80671, 80676, 80681, 80686, 66912, - 80691, 80696, 80701, 80706, 80712, 80718, 80723, 80727, 80732, 18861, - 80737, 80743, 80748, 80754, 80759, 80764, 80769, 80774, 80778, 80784, - 80789, 80798, 80803, 80808, 80813, 80818, 80822, 80829, 80835, 4707, - 20088, 3210, 80840, 80844, 80849, 80853, 80857, 80861, 53586, 80865, - 80790, 80867, 80877, 37565, 80880, 80885, 80894, 80900, 6791, 37570, - 80904, 80910, 80915, 80921, 80926, 80930, 80937, 80942, 80952, 80961, - 80965, 80971, 80977, 80983, 80987, 80995, 81002, 81010, 81018, 37575, - 81025, 81028, 81039, 81046, 81052, 81057, 81061, 81067, 81075, 81082, - 81087, 81091, 81100, 81108, 81114, 81119, 37580, 81126, 26955, 81138, - 81144, 81149, 81155, 81162, 81168, 24430, 31538, 81174, 81179, 81185, - 81189, 81201, 80823, 80830, 24629, 81211, 81216, 81223, 81229, 81236, - 81242, 81253, 81258, 81266, 10139, 81271, 81274, 81280, 81284, 81288, - 81291, 81297, 81303, 37297, 4708, 1457, 15537, 81310, 81316, 81322, - 81328, 81334, 81340, 81346, 81352, 81358, 81363, 81368, 81373, 81378, - 81383, 81388, 81393, 81398, 81403, 81408, 81413, 81418, 81423, 81429, - 81434, 81439, 81445, 81450, 81455, 81461, 81467, 81473, 81479, 81485, - 81491, 81497, 81503, 81509, 81514, 81519, 81525, 81530, 81535, 81541, - 81546, 81551, 81556, 81561, 81566, 81571, 81576, 81581, 81586, 81591, - 81596, 81601, 81607, 81612, 81617, 81622, 81628, 81633, 81638, 81643, - 81648, 81654, 81659, 81664, 81669, 81674, 81679, 81684, 81689, 81694, - 81699, 81704, 81709, 81714, 81719, 81724, 81729, 81734, 81739, 81744, - 81749, 81755, 81760, 81765, 81770, 81775, 81780, 81785, 81790, 979, 169, - 81795, 81799, 81803, 81808, 81816, 81820, 81827, 81835, 81839, 81852, - 81860, 81865, 81870, 30316, 81874, 81879, 81883, 81888, 81892, 81900, - 81904, 23991, 81909, 81913, 69719, 81917, 81920, 81928, 81936, 81944, - 81949, 81954, 81961, 81968, 81974, 81980, 81985, 81992, 81997, 82005, - 74405, 82012, 82017, 69491, 82024, 82029, 82033, 82040, 82046, 82053, - 69518, 13542, 82061, 82066, 82071, 82075, 82078, 82089, 82098, 82104, - 82109, 82113, 82123, 82132, 47965, 82136, 82140, 82147, 82160, 82166, - 82174, 82183, 82194, 82205, 82216, 82227, 82236, 82242, 82251, 82259, - 82269, 82282, 82290, 82297, 82308, 82314, 82319, 82324, 82330, 82340, - 82346, 82356, 82364, 82371, 82381, 82390, 80505, 82398, 82404, 82412, - 82418, 72959, 82425, 82430, 82433, 82437, 82443, 82447, 82450, 82458, - 82464, 82470, 82478, 82490, 82502, 82509, 82514, 82518, 82529, 82537, - 82544, 82556, 82564, 82571, 82579, 82586, 82592, 82597, 82607, 82616, - 82624, 82629, 82639, 82648, 48830, 82655, 82659, 82664, 82672, 82679, - 82685, 82689, 82699, 82710, 82718, 82725, 82737, 82749, 82758, 79448, - 82765, 82775, 82787, 82798, 82812, 82820, 82830, 82837, 82845, 82858, - 82870, 82879, 82887, 82897, 82908, 82920, 82929, 82939, 82949, 82958, - 82965, 82974, 82989, 82997, 83007, 83016, 83024, 83037, 66315, 83052, - 83062, 83071, 83083, 83093, 83105, 83116, 83130, 83144, 83158, 83172, - 83186, 83200, 83214, 83228, 83242, 83256, 83270, 83284, 83298, 83312, - 83326, 83340, 83354, 83368, 83382, 83396, 83410, 83424, 83438, 83452, - 83466, 83480, 83494, 83508, 83522, 83536, 83550, 83564, 83578, 83592, - 83606, 83620, 83634, 83648, 83662, 83676, 83690, 83704, 83718, 83732, - 83746, 83760, 83774, 83788, 83802, 83816, 83830, 83844, 83858, 83872, - 83886, 83900, 83914, 83928, 83942, 83956, 83970, 83984, 83998, 84012, - 84026, 84040, 84054, 84068, 84082, 84096, 84110, 84124, 84138, 84152, - 84166, 84180, 84194, 84208, 84222, 84236, 84250, 84264, 84278, 84292, - 84306, 84320, 84334, 84348, 84362, 84376, 84390, 84404, 84418, 84432, - 84446, 84460, 84474, 84488, 84502, 84516, 84530, 84544, 84558, 84572, - 84586, 84600, 84614, 84628, 84642, 84656, 84670, 84684, 84698, 84712, - 84726, 84740, 84754, 84768, 84782, 84796, 84810, 84824, 84838, 84852, - 84866, 84880, 84894, 84908, 84922, 84936, 84950, 84964, 84978, 84992, - 85006, 85020, 85034, 85048, 85062, 85076, 85090, 85104, 85118, 85132, - 85146, 85160, 85174, 85188, 85202, 85216, 85230, 85244, 85258, 85272, - 85286, 85300, 85314, 85328, 85342, 85356, 85370, 85384, 85398, 85412, - 85426, 85440, 85454, 85468, 85482, 85496, 85510, 85524, 85538, 85552, - 85566, 85580, 85594, 85608, 85622, 85636, 85650, 85664, 85678, 85692, - 85706, 85720, 85734, 85748, 85762, 85776, 85790, 85804, 85818, 85832, - 85846, 85860, 85874, 85888, 85902, 85916, 85930, 85944, 85958, 85972, - 85986, 86000, 86014, 86028, 86042, 86056, 86070, 86084, 86098, 86112, - 86126, 86140, 86154, 86168, 86182, 86196, 86210, 86224, 86238, 86252, - 86266, 86280, 86294, 86308, 86322, 86336, 86350, 86364, 86378, 86392, - 86406, 86420, 86434, 86448, 86462, 86476, 86490, 86504, 86518, 86532, - 86546, 86560, 86574, 86588, 86602, 86616, 86630, 86644, 86658, 86672, - 86686, 86700, 86714, 86728, 86742, 86756, 86770, 86784, 86798, 86812, - 86826, 86840, 86854, 86868, 86882, 86896, 86910, 86924, 86938, 86952, - 86966, 86980, 86994, 87008, 87022, 87036, 87050, 87064, 87078, 87092, - 87106, 87120, 87134, 87148, 87162, 87176, 87190, 87204, 87218, 87232, - 87246, 87260, 87274, 87288, 87302, 87316, 87330, 87344, 87358, 87372, - 87386, 87400, 87414, 87428, 87442, 87456, 87470, 87484, 87498, 87512, - 87526, 87540, 87554, 87568, 87582, 87596, 87610, 87624, 87638, 87652, - 87666, 87680, 87694, 87708, 87722, 87736, 87750, 87764, 87778, 87792, - 87806, 87820, 87834, 87848, 87862, 87876, 87890, 87904, 87918, 87932, - 87946, 87960, 87974, 87988, 88002, 88016, 88030, 88044, 88058, 88072, - 88086, 88100, 88114, 88128, 88142, 88156, 88170, 88184, 88198, 88212, - 88226, 88240, 88254, 88268, 88282, 88296, 88310, 88324, 88338, 88352, - 88366, 88380, 88394, 88408, 88422, 88436, 88450, 88464, 88478, 88492, - 88506, 88520, 88534, 88548, 88562, 88576, 88590, 88604, 88618, 88632, - 88646, 88660, 88674, 88688, 88702, 88716, 88730, 88744, 88758, 88772, - 88786, 88800, 88814, 88828, 88842, 88856, 88870, 88884, 88898, 88912, - 88926, 88940, 88954, 88968, 88982, 88996, 89010, 89024, 89038, 89052, - 89066, 89080, 89094, 89108, 89122, 89136, 89150, 89164, 89178, 89192, - 89206, 89220, 89234, 89248, 89262, 89276, 89290, 89304, 89318, 89332, - 89346, 89360, 89374, 89388, 89402, 89416, 89430, 89444, 89458, 89472, - 89486, 89500, 89514, 89528, 89542, 89556, 89570, 89584, 89598, 89612, - 89626, 89640, 89654, 89668, 89682, 89696, 89710, 89724, 89738, 89752, - 89766, 89780, 89794, 89808, 89822, 89836, 89850, 89864, 89878, 89892, - 89906, 89920, 89934, 89948, 89962, 89976, 89990, 90004, 90018, 90032, - 90046, 90060, 90074, 90088, 90102, 90116, 90130, 90144, 90158, 90172, - 90186, 90200, 90214, 90228, 90242, 90256, 90270, 90284, 90298, 90312, - 90326, 90340, 90354, 90368, 90382, 90396, 90410, 90424, 90438, 90452, - 90466, 90480, 90494, 90508, 90522, 90536, 90550, 90564, 90578, 90592, - 90606, 90620, 90634, 90648, 90662, 90676, 90690, 90704, 90718, 90732, - 90746, 90760, 90774, 90788, 90802, 90816, 90830, 90844, 90858, 90872, - 90886, 90900, 90914, 90928, 90942, 90956, 90970, 90984, 90998, 91012, - 91026, 91040, 91054, 91068, 91082, 91096, 91110, 91124, 91138, 91152, - 91166, 91180, 91194, 91208, 91222, 91236, 91250, 91264, 91278, 91292, - 91306, 91320, 91334, 91348, 91362, 91376, 91390, 91404, 91418, 91432, - 91446, 91460, 91474, 91488, 91502, 91516, 91530, 91544, 91558, 91572, - 91586, 91600, 91614, 91628, 91642, 91656, 91670, 91684, 91698, 91712, - 91726, 91740, 91754, 91768, 91782, 91796, 91810, 91824, 91838, 91852, - 91866, 91880, 91894, 91908, 91922, 91936, 91950, 91964, 91978, 91992, - 92006, 92020, 92034, 92048, 92062, 92076, 92090, 92104, 92118, 92132, - 92146, 92160, 92174, 92188, 92202, 92216, 92230, 92244, 92258, 92272, - 92286, 92300, 92314, 92328, 92342, 92356, 92370, 92384, 92398, 92412, - 92426, 92440, 92454, 92468, 92482, 92496, 92510, 92524, 92538, 92552, - 92566, 92580, 92594, 92608, 92622, 92636, 92650, 92664, 92678, 92692, - 92706, 92720, 92734, 92748, 92762, 92776, 92790, 92804, 92818, 92832, - 92846, 92860, 92874, 92888, 92902, 92916, 92930, 92944, 92958, 92972, - 92986, 93000, 93014, 93028, 93042, 93056, 93070, 93084, 93098, 93112, - 93126, 93140, 93154, 93168, 93182, 93196, 93210, 93224, 93238, 93252, - 93266, 93280, 93294, 93308, 93322, 93336, 93350, 93364, 93378, 93392, - 93406, 93420, 93434, 93448, 93462, 93476, 93490, 93504, 93518, 93532, - 93546, 93560, 93574, 93588, 93602, 93616, 93630, 93644, 93658, 93672, - 93686, 93695, 93706, 93717, 93727, 93738, 93746, 93754, 93760, 93770, - 93778, 93784, 33472, 93789, 93795, 93804, 93816, 93821, 93828, 10992, - 20510, 93834, 93843, 93848, 93852, 93859, 93865, 93870, 93875, 93883, - 93891, 93896, 93904, 13996, 93908, 93911, 93913, 93928, 93941, 93948, - 93954, 93965, 93970, 93974, 93979, 93986, 93992, 93997, 94005, 74999, - 75009, 94011, 94018, 94028, 12212, 94035, 94040, 33710, 94049, 94054, - 94061, 94071, 94079, 94087, 94096, 94105, 94111, 94117, 94124, 94131, - 94136, 94140, 94148, 69535, 94153, 94162, 94170, 94177, 94182, 94186, - 94195, 94201, 94204, 94208, 94217, 94227, 81847, 94236, 94240, 94248, - 94252, 94258, 94269, 94279, 20519, 94290, 94299, 94307, 94315, 94322, - 69554, 9590, 94330, 94334, 94343, 94350, 94353, 31419, 94356, 94360, - 94365, 94382, 94394, 12170, 94406, 94411, 94416, 94421, 24081, 94425, - 94430, 94435, 94441, 94446, 6436, 94451, 24085, 94456, 94461, 94467, - 94474, 94479, 94484, 94490, 94496, 94502, 94507, 94513, 94517, 94531, - 94539, 94547, 94553, 94558, 94565, 94575, 94584, 94589, 94594, 94599, - 94607, 94618, 94623, 94629, 94634, 94643, 68029, 4637, 94648, 94666, - 94685, 94698, 94712, 94728, 94735, 94742, 94751, 94758, 94764, 94771, - 94776, 94782, 94788, 94796, 94802, 94807, 94812, 94828, 12183, 94842, - 94849, 94857, 94863, 94867, 94870, 94875, 94880, 94887, 94892, 94901, - 94907, 94912, 94918, 94924, 94933, 94942, 41290, 94947, 94955, 94964, - 13611, 94973, 94979, 94987, 94993, 94999, 95005, 95010, 95017, 95023, - 13622, 95028, 95031, 95036, 37607, 95046, 95055, 95060, 95066, 95071, - 95079, 95086, 95097, 95113, 95129, 95145, 95161, 95177, 95193, 95209, - 95225, 95241, 95257, 95273, 95289, 95305, 95321, 95337, 95353, 95369, - 95385, 95401, 95417, 95433, 95449, 95465, 95481, 95497, 95513, 95529, - 95545, 95561, 95577, 95593, 95609, 95625, 95641, 95657, 95673, 95689, - 95705, 95721, 95737, 95753, 95769, 95785, 95801, 95817, 95833, 95849, - 95865, 95881, 95897, 95913, 95929, 95945, 95961, 95977, 95993, 96009, - 96025, 96041, 96057, 96073, 96089, 96105, 96121, 96137, 96153, 96169, - 96185, 96201, 96217, 96233, 96249, 96265, 96281, 96297, 96313, 96329, - 96345, 96361, 96377, 96393, 96409, 96425, 96441, 96457, 96473, 96489, - 96505, 96521, 96537, 96553, 96569, 96585, 96601, 96617, 96633, 96649, - 96665, 96681, 96697, 96713, 96729, 96745, 96761, 96777, 96793, 96809, - 96825, 96841, 96857, 96873, 96889, 96905, 96921, 96937, 96953, 96969, - 96985, 97001, 97017, 97033, 97049, 97065, 97081, 97097, 97113, 97129, - 97145, 97161, 97177, 97193, 97209, 97225, 97241, 97257, 97273, 97289, - 97305, 97321, 97337, 97353, 97369, 97385, 97401, 97417, 97433, 97449, - 97465, 97481, 97497, 97513, 97529, 97545, 97561, 97577, 97593, 97609, - 97625, 97641, 97657, 97673, 97689, 97705, 97721, 97737, 97753, 97769, - 97785, 97801, 97817, 97833, 97849, 97865, 97881, 97897, 97913, 97929, - 97945, 97961, 97977, 97993, 98009, 98025, 98041, 98057, 98073, 98089, - 98105, 98121, 98137, 98153, 98169, 98185, 98201, 98217, 98233, 98249, - 98265, 98281, 98297, 98313, 98329, 98345, 98361, 98377, 98393, 98409, - 98425, 98441, 98457, 98473, 98489, 98505, 98521, 98537, 98553, 98569, - 98585, 98601, 98617, 98633, 98649, 98665, 98681, 98697, 98713, 98729, - 98745, 98761, 98777, 98793, 98809, 98825, 98841, 98857, 98873, 98889, - 98905, 98921, 98937, 98953, 98969, 98985, 99001, 99017, 99033, 99049, - 99065, 99081, 99097, 99113, 99129, 99145, 99161, 99177, 99193, 99209, - 99225, 99241, 99257, 99273, 99289, 99305, 99321, 99337, 99353, 99369, - 99385, 99401, 99417, 99433, 99449, 99465, 99481, 99497, 99513, 99529, - 99545, 99561, 99577, 99593, 99609, 99625, 99641, 99657, 99673, 99689, - 99705, 99721, 99737, 99753, 99769, 99785, 99801, 99817, 99833, 99849, - 99865, 99881, 99897, 99913, 99929, 99945, 99961, 99977, 99993, 100009, - 100025, 100041, 100057, 100073, 100089, 100105, 100121, 100137, 100153, - 100169, 100185, 100201, 100217, 100233, 100249, 100265, 100281, 100297, - 100313, 100329, 100345, 100361, 100377, 100393, 100409, 100425, 100441, - 100457, 100473, 100489, 100505, 100521, 100537, 100553, 100569, 100585, - 100601, 100617, 100633, 100649, 100665, 100681, 100697, 100713, 100729, - 100745, 100761, 100777, 100793, 100809, 100825, 100841, 100857, 100873, - 100889, 100905, 100921, 100937, 100953, 100969, 100985, 101001, 101017, - 101033, 101049, 101065, 101081, 101097, 101113, 101129, 101145, 101161, - 101177, 101193, 101209, 101225, 101241, 101257, 101273, 101289, 101305, - 101321, 101337, 101353, 101369, 101385, 101401, 101417, 101433, 101443, - 101448, 101456, 74328, 101461, 101467, 101472, 101479, 101488, 101496, - 101500, 4231, 101506, 101513, 101519, 101523, 19842, 44355, 3219, 101528, - 101532, 101536, 101543, 101549, 101558, 101564, 101571, 101575, 101596, - 101618, 101634, 101651, 101670, 101679, 101689, 101697, 101704, 101711, - 101717, 31280, 101731, 101735, 101741, 101749, 101761, 101767, 101775, - 101782, 101787, 101792, 101796, 101804, 101811, 101815, 101821, 101827, - 101832, 3879, 49986, 101838, 101842, 101846, 101850, 101855, 101860, - 101865, 101871, 101877, 101883, 101890, 101896, 101903, 101909, 101915, - 101920, 101926, 101931, 101935, 101940, 101944, 101949, 50001, 101953, - 101958, 101966, 101970, 101975, 101982, 101991, 101997, 102006, 102010, - 102017, 102021, 102024, 102031, 102037, 102046, 102056, 102066, 102071, - 102075, 102082, 102090, 102099, 102103, 102111, 102117, 102122, 102127, - 102133, 102139, 102144, 102148, 102154, 102159, 102163, 102167, 102170, - 102175, 102183, 102193, 102199, 102204, 102214, 47161, 102222, 102234, - 102240, 102247, 102253, 102257, 102262, 102268, 102280, 102291, 102298, - 102304, 102311, 102318, 102330, 102337, 102343, 24165, 102347, 102355, - 102361, 102368, 102374, 102380, 102386, 102391, 102396, 102401, 102405, - 102414, 102422, 102433, 7696, 102438, 19278, 102444, 102448, 102452, - 102456, 102464, 102473, 102477, 102484, 102493, 102501, 102514, 102520, - 101945, 34610, 102525, 102527, 102532, 102537, 102542, 102547, 102552, - 102557, 102562, 102567, 102572, 102577, 102582, 102587, 102592, 102597, - 102603, 102608, 102613, 102618, 102623, 102628, 102633, 102638, 102643, - 102649, 102655, 102661, 102666, 102671, 102683, 102688, 1872, 54, 102693, - 102698, 37617, 102702, 37622, 37627, 37633, 37638, 102706, 37643, 25306, - 102728, 102732, 102736, 102741, 102745, 37647, 102749, 102757, 102764, - 102770, 102780, 37652, 102787, 102790, 102795, 102799, 102808, 10802, - 102816, 37657, 25150, 102819, 102823, 102831, 1347, 102836, 37668, - 102839, 102844, 29608, 29618, 40892, 102849, 102854, 102859, 102864, - 102870, 102875, 102884, 102889, 102898, 102906, 102913, 102919, 102924, - 102929, 102934, 102944, 102953, 102961, 102966, 102974, 102978, 102986, - 102990, 102997, 103005, 37472, 44090, 103012, 103018, 103023, 103028, - 14031, 32595, 103033, 103038, 103043, 103049, 103056, 103062, 103071, - 103076, 103084, 103094, 103101, 103111, 103117, 103122, 103128, 103132, - 20541, 103139, 41844, 103152, 103157, 103163, 103178, 35667, 72741, - 103191, 103195, 103204, 103213, 103220, 103226, 103234, 103240, 103249, - 103256, 44210, 103262, 103265, 103269, 103273, 103277, 11546, 103283, - 103290, 103296, 103304, 103309, 103313, 27656, 103319, 103322, 103330, - 103337, 103345, 103358, 103372, 103379, 103385, 103392, 103398, 37682, - 103402, 103409, 103417, 103425, 103431, 37687, 103439, 103445, 103450, - 103460, 103466, 103475, 35462, 40263, 103483, 103488, 103493, 103497, - 103502, 103506, 103514, 103519, 17374, 18148, 103523, 103528, 37692, - 17527, 103532, 103537, 103541, 103548, 103557, 103561, 103569, 103575, - 103580, 103586, 8879, 103591, 103597, 103602, 103607, 103618, 103627, - 103639, 103654, 37980, 103660, 19397, 37696, 103664, 103671, 103677, - 103681, 27780, 103688, 103695, 46451, 103704, 103710, 103719, 103725, - 103730, 103738, 103744, 103749, 37706, 103754, 103763, 103772, 102286, - 103781, 103788, 103794, 103800, 103809, 103819, 103825, 103833, 103840, - 103844, 37711, 103847, 37717, 1386, 103852, 103860, 103868, 103878, - 103887, 103895, 103902, 103912, 37728, 103916, 103918, 103922, 103927, - 103931, 103935, 103941, 103946, 103950, 103961, 103966, 103975, 103980, - 3224, 103984, 103991, 103995, 104004, 104012, 104020, 104027, 104032, - 104037, 71293, 104041, 104044, 104050, 104058, 104064, 104068, 104073, - 104080, 104085, 104090, 104094, 104101, 104107, 104112, 40294, 104116, - 104119, 104124, 104128, 104133, 104140, 104145, 104149, 45518, 104157, - 29627, 29636, 104163, 104169, 104175, 104180, 104184, 104187, 104197, - 104206, 104211, 104217, 104224, 104230, 104234, 104242, 104247, 40300, - 82100, 104251, 104259, 104265, 104272, 104277, 104284, 104289, 104293, - 104298, 66531, 104304, 104310, 10078, 104315, 104320, 104324, 104329, - 104334, 104339, 104343, 104348, 104353, 104359, 104364, 104369, 104375, - 104381, 104386, 104390, 104395, 104400, 104405, 104409, 27779, 104414, - 104419, 104425, 104431, 104437, 104442, 104446, 104451, 104456, 104461, - 104465, 104470, 104475, 104480, 104485, 50256, 104489, 37736, 104497, - 104501, 104509, 104517, 104528, 104533, 104537, 25779, 79551, 104542, - 104548, 104553, 4542, 104563, 104570, 104575, 104583, 104592, 104597, - 104601, 104606, 104610, 104618, 104626, 104633, 74590, 104639, 104647, - 104654, 104665, 104671, 104677, 37746, 104680, 104687, 104695, 104700, - 104704, 31770, 69123, 104710, 104715, 104722, 104727, 9970, 104731, - 104739, 104746, 104753, 104762, 104769, 104775, 104789, 104797, 6517, - 104559, 104803, 104808, 104814, 104818, 104821, 104829, 104836, 104841, - 104854, 104861, 104867, 104871, 104879, 104884, 104891, 104897, 104902, - 69394, 104907, 104910, 104919, 104926, 104932, 104936, 104939, 104947, - 104953, 104962, 104972, 104982, 104991, 105002, 105010, 105021, 105026, - 105030, 105035, 105039, 41023, 105047, 24493, 41032, 105052, 97700, - 97716, 97732, 97748, 97764, 105057, 97796, 97812, 97828, 97844, 97956, - 97972, 105061, 98004, 98020, 105065, 105069, 105073, 105077, 98260, - 98292, 105081, 98324, 105085, 105089, 98468, 98484, 98500, 98516, 105093, - 98580, 98596, 105097, 98724, 98740, 98756, 98772, 98788, 98804, 98820, - 98836, 98852, 98868, 98980, 98996, 99012, 99028, 99044, 99060, 99076, - 99092, 99108, 99124, 105101, 100916, 101028, 101092, 101108, 101124, - 101140, 101156, 101172, 101284, 101300, 101316, 105105, 101364, 105109, - 101396, 101412, 101428, 105113, 105118, 105123, 105128, 105133, 105138, - 105143, 105147, 105151, 105156, 105161, 105165, 105170, 105175, 105179, - 105184, 105189, 105194, 105199, 105203, 105208, 105213, 105217, 105222, - 105226, 105230, 105234, 105238, 105243, 105247, 105251, 105255, 105259, - 105263, 105267, 105271, 105275, 105279, 105284, 105289, 105294, 105299, - 105304, 105309, 105314, 105319, 105324, 105329, 105333, 105337, 105341, - 105345, 105349, 105353, 105358, 105362, 105367, 105371, 105376, 105381, - 105385, 105389, 105394, 105398, 105402, 105406, 105410, 105414, 105418, - 105422, 105426, 105430, 105434, 105438, 105442, 105446, 105450, 105455, - 105460, 105464, 105468, 105472, 105476, 105480, 105484, 105489, 105493, - 105497, 105501, 105505, 105509, 105513, 105518, 105522, 105527, 105531, - 105535, 105539, 105543, 105547, 105551, 105555, 105559, 105563, 105567, - 105571, 105576, 105580, 105584, 105588, 105592, 105596, 105600, 105604, - 105608, 105612, 105616, 105620, 105625, 105629, 105633, 105638, 105643, - 105647, 105651, 105655, 105659, 105663, 105667, 105671, 105675, 105680, - 105684, 105689, 105693, 105698, 105702, 105707, 105711, 105717, 105722, - 105726, 105731, 105735, 105740, 105744, 105749, 105753, 105758, 1461, - 105762, 2966, 1726, 26950, 1634, 29563, 105766, 2975, 105770, 1316, - 105775, 1258, 105779, 105783, 2999, 105787, 105795, 105802, 105809, - 105823, 3003, 7803, 105832, 105840, 105847, 105858, 105867, 105871, - 105878, 105890, 105903, 105916, 105927, 105932, 105939, 105951, 105955, - 3007, 13692, 105965, 105970, 105979, 105989, 105994, 3011, 106002, - 106006, 106011, 106018, 106024, 106029, 106038, 106046, 106058, 106068, - 1263, 15119, 106081, 106085, 106091, 106105, 106117, 106129, 106137, - 106147, 106156, 106165, 106174, 106182, 106193, 106201, 4550, 106211, - 106222, 106231, 106237, 106252, 106259, 106265, 106270, 41162, 106275, - 3035, 15123, 106279, 106286, 9901, 106295, 106301, 3040, 37152, 106310, - 69023, 106317, 106321, 106327, 106338, 106344, 106349, 106356, 106362, - 106370, 106377, 106383, 106394, 106404, 106413, 106424, 106433, 106440, - 106446, 106456, 106464, 106470, 106485, 106491, 106496, 106503, 106511, - 106515, 106518, 106524, 106531, 106537, 106545, 106554, 106562, 106568, - 106577, 49571, 106591, 106596, 106602, 17133, 106607, 106620, 106632, - 106641, 106649, 106656, 106660, 106664, 106667, 106674, 106681, 106689, - 106697, 106706, 106714, 17038, 106722, 106727, 106731, 106743, 106750, - 106757, 106766, 906, 106776, 106785, 106796, 3061, 106800, 106804, - 106810, 106823, 106835, 106845, 106854, 106866, 30368, 106877, 106885, - 106894, 106905, 106916, 106926, 106936, 106944, 106953, 106961, 13139, - 106968, 106972, 106975, 106980, 106985, 106989, 106995, 1268, 107002, - 107006, 13780, 107010, 107021, 107030, 107038, 107047, 107055, 107071, - 107082, 107091, 107099, 107111, 107122, 107138, 107148, 107169, 107183, - 107196, 107204, 107211, 7849, 107224, 107229, 107235, 6526, 107241, - 107244, 107251, 107261, 8981, 107268, 107273, 107278, 107285, 107290, - 107298, 107307, 107315, 107320, 107329, 107336, 11040, 11049, 107342, - 107353, 107359, 107364, 107370, 3077, 3082, 107376, 977, 107382, 107389, - 107396, 107409, 107414, 2261, 87, 107422, 107429, 107434, 107442, 107452, - 107461, 107467, 107476, 107484, 107494, 107498, 107502, 107507, 107511, - 107523, 3105, 107531, 107539, 107544, 107555, 107566, 107578, 107589, - 107599, 107608, 24534, 107613, 107619, 107624, 107634, 107644, 107649, - 32484, 107655, 107660, 107669, 24546, 107673, 4654, 16, 107678, 107687, - 107694, 107701, 107707, 107712, 107716, 107722, 32508, 107727, 107732, - 69685, 107737, 107742, 107748, 107754, 107762, 107767, 107775, 107782, - 107788, 107793, 45394, 49465, 107799, 1797, 32, 107809, 107822, 107827, - 107835, 107840, 107846, 3131, 32563, 107851, 107859, 107866, 107871, - 107876, 107885, 4233, 4244, 70891, 107893, 107897, 1661, 1809, 107902, - 107907, 107914, 32916, 1813, 302, 107921, 107927, 107932, 3153, 107936, - 107941, 107948, 1817, 107953, 107959, 107964, 107976, 6757, 107986, - 107993, 1824, 107999, 108004, 108011, 108018, 108033, 108040, 108051, - 108056, 108064, 2696, 108068, 108080, 108085, 108089, 108095, 32362, - 2266, 108099, 108110, 108114, 108118, 108124, 108128, 108137, 108141, - 108152, 108156, 2312, 36969, 108160, 108170, 108178, 3244, 108184, - 108193, 108201, 10439, 108206, 108214, 108219, 108223, 108232, 108239, - 108245, 3214, 17197, 108249, 108262, 108280, 108285, 108293, 108301, - 108311, 11344, 15241, 108323, 108336, 108343, 108357, 108364, 108380, - 108387, 108393, 24584, 14454, 108400, 108407, 108417, 108426, 50255, - 108438, 108446, 50390, 108453, 108456, 108462, 108468, 108474, 108480, - 108486, 108493, 108500, 108506, 108512, 108518, 108524, 108530, 108536, - 108542, 108548, 108554, 108560, 108566, 108572, 108578, 108584, 108590, - 108596, 108602, 108608, 108614, 108620, 108626, 108632, 108638, 108644, - 108650, 108656, 108662, 108668, 108674, 108680, 108686, 108692, 108698, - 108704, 108710, 108716, 108722, 108728, 108734, 108740, 108746, 108752, - 108758, 108764, 108770, 108776, 108782, 108788, 108794, 108800, 108806, - 108813, 108819, 108826, 108833, 108839, 108846, 108853, 108859, 108865, - 108871, 108877, 108883, 108889, 108895, 108901, 108907, 108913, 108919, - 108925, 108931, 108937, 108943, 3228, 10412, 108949, 108959, 108965, - 108973, 108977, 106014, 3232, 108981, 102515, 24294, 14066, 4158, 108985, - 3238, 108989, 108999, 109005, 109011, 109017, 109023, 109029, 109035, - 109041, 109047, 109053, 109059, 109065, 109071, 109077, 109083, 109089, - 109095, 109101, 109107, 109113, 109119, 109125, 109131, 109137, 109143, - 109149, 109156, 109163, 109169, 109175, 109181, 109187, 109193, 109199, - 1273, 109205, 109210, 109215, 109220, 109225, 109230, 109235, 109240, - 109245, 109249, 109253, 109257, 109261, 109265, 109269, 109273, 109277, - 109281, 109287, 109293, 109299, 109305, 109309, 109313, 109317, 109321, - 109325, 109329, 109333, 109337, 109341, 109346, 109351, 109356, 109361, - 109366, 109371, 109376, 109381, 109386, 109391, 109396, 109401, 109406, - 109411, 109416, 109421, 109426, 109431, 109436, 109441, 109446, 109451, - 109456, 109461, 109466, 109471, 109476, 109481, 109486, 109491, 109496, - 109501, 109506, 109511, 109516, 109521, 109526, 109531, 109536, 109541, - 109546, 109551, 109556, 109561, 109566, 109571, 109576, 109581, 109586, - 109591, 109596, 109601, 109606, 109611, 109616, 109621, 109626, 109631, - 109636, 109641, 109646, 109651, 109656, 109661, 109666, 109671, 109676, - 109681, 109686, 109691, 109696, 109701, 109706, 109711, 109716, 109721, - 109726, 109731, 109736, 109741, 109746, 109751, 109756, 109761, 109766, - 109771, 109776, 109781, 109786, 109791, 109796, 109801, 109806, 109811, - 109816, 109821, 109826, 109831, 109836, 109841, 109846, 109851, 109856, - 109861, 109866, 109871, 109876, 109881, 109886, 109891, 109896, 109901, - 109906, 109911, 109916, 109921, 109926, 109931, 109936, 109941, 109946, - 109951, 109956, 109961, 109966, 109971, 109976, 109981, 109986, 109991, - 109996, 110001, 110006, 110011, 110016, 110021, 110026, 110031, 110036, - 110041, 110046, 110051, 110056, 110061, 110066, 110071, 110076, 110081, - 110086, 110091, 110096, 110101, 110106, 110111, 110116, 110121, 110126, - 110131, 110136, 110141, 110146, 110151, 110156, 110161, 110166, 110171, - 110176, 110181, 110186, 110191, 110196, 110201, 110206, 110211, 110216, - 110221, 110226, 110231, 110237, 110242, 110247, 110252, 110257, 110262, - 110267, 110272, 110278, 110283, 110288, 110293, 110298, 110303, 110308, - 110313, 110318, 110323, 110328, 110333, 110338, 110343, 110348, 110353, - 110358, 110363, 110368, 110373, 110378, 110383, 110388, 110393, 110398, - 110403, 110408, 110413, 110418, 110423, 110428, 110433, 110438, 110447, - 110452, 110461, 110466, 110475, 110480, 110489, 110494, 110503, 110508, - 110517, 110522, 110531, 110536, 110545, 110550, 110555, 110564, 110568, - 110577, 110582, 110591, 110596, 110605, 110610, 110619, 110624, 110633, - 110638, 110647, 110652, 110661, 110666, 110675, 110680, 110689, 110694, - 110703, 110708, 110713, 110718, 110723, 110728, 110733, 110738, 110742, - 110747, 110752, 110757, 110762, 110767, 110772, 110778, 110783, 110788, - 110793, 110799, 110803, 110808, 110814, 110819, 110824, 110829, 110834, - 110839, 110844, 110849, 110854, 110859, 110864, 110870, 110875, 110880, - 110885, 110891, 110896, 110901, 110906, 110911, 110917, 110922, 110927, - 110932, 110937, 110942, 110948, 110953, 110958, 110963, 110968, 110973, - 110978, 110983, 110988, 110993, 110998, 111003, 111008, 111013, 111018, - 111023, 111028, 111033, 111038, 111043, 111048, 111053, 111058, 111063, - 111069, 111075, 111081, 111086, 111091, 111096, 111101, 111107, 111113, - 111119, 111124, 111129, 111134, 111140, 111145, 111150, 111155, 111160, - 111165, 111170, 111175, 111180, 111185, 111190, 111195, 111200, 111205, - 111210, 111215, 111220, 111226, 111232, 111238, 111243, 111248, 111253, - 111258, 111264, 111270, 111276, 111281, 111286, 111291, 111296, 111301, - 111306, 111311, 111316, 111321, 18785, 111326, 111332, 111337, 111342, - 111347, 111352, 111357, 111363, 111368, 111373, 111378, 111383, 111388, - 111394, 111399, 111404, 111409, 111414, 111419, 111424, 111429, 111434, - 111439, 111444, 111449, 111454, 111459, 111464, 111469, 111474, 111479, - 111484, 111489, 111494, 111499, 111504, 111510, 111515, 111520, 111525, - 111530, 111535, 111540, 111545, 111550, 111555, 111560, 111565, 111570, - 111575, 111580, 111585, 111590, 111595, 111600, 111605, 111610, 111615, - 111620, 111625, 111630, 111635, 111640, 111645, 111650, 111655, 111660, - 111665, 111670, 111675, 111680, 111685, 111690, 111695, 111700, 111705, - 111710, 111716, 111721, 111726, 111731, 111736, 111741, 111746, 111751, - 111756, 111761, 111766, 111771, 111777, 111782, 111788, 111793, 111798, - 111803, 111808, 111813, 111818, 111824, 111829, 111834, 111840, 111845, - 111850, 111855, 111860, 111865, 111871, 111877, 111882, 111887, 14088, - 111892, 111897, 111902, 111907, 111912, 111917, 111922, 111927, 111932, - 111937, 111942, 111947, 111952, 111957, 111962, 111967, 111972, 111977, - 111982, 111987, 111992, 111997, 112002, 112007, 112012, 112017, 112022, - 112027, 112032, 112037, 112042, 112047, 112052, 112057, 112062, 112067, - 112072, 112077, 112082, 112087, 112092, 112097, 112102, 112107, 112112, - 112117, 112122, 112127, 112132, 112137, 112142, 112147, 112152, 112157, - 112162, 112167, 112172, 112177, 112182, 112187, 112192, 112197, 112202, - 112207, 112212, 112218, 112223, 112228, 112233, 112238, 112244, 112249, - 112254, 112259, 112264, 112269, 112274, 112280, 112285, 112290, 112295, - 112300, 112305, 112311, 112316, 112321, 112326, 112331, 112336, 112342, - 112347, 112352, 112357, 112362, 112367, 112373, 112379, 112384, 112389, - 112394, 112400, 112406, 112412, 112417, 112422, 112428, 112434, 112439, - 112445, 112451, 112457, 112462, 112467, 112473, 112478, 112484, 112489, - 112495, 112504, 112509, 112514, 112520, 112525, 112531, 112536, 112541, - 112546, 112551, 112556, 112561, 112566, 112571, 112576, 112581, 112586, - 112591, 112596, 112601, 112606, 112611, 112616, 112621, 112626, 112631, - 112636, 112641, 112646, 112651, 112656, 112661, 112666, 112671, 112676, - 112681, 112686, 112692, 112698, 112704, 112709, 112714, 112719, 112724, - 112729, 112734, 112739, 112744, 112749, 112754, 112759, 112764, 112769, - 112774, 112779, 112784, 112789, 112794, 112799, 112804, 112810, 112816, - 112821, 112827, 112832, 112837, 112843, 112848, 112854, 112859, 112865, - 112870, 112876, 112881, 112887, 112892, 112897, 112902, 112907, 112912, - 112917, 112922, 109000, 109006, 109012, 109018, 112928, 109024, 109030, - 112934, 109036, 109042, 109048, 109054, 109060, 109066, 109072, 109078, - 109084, 112940, 109090, 109096, 109102, 112946, 109108, 109114, 109120, - 109126, 112952, 109132, 109138, 109144, 109164, 112958, 112964, 109170, - 112970, 109176, 109182, 109188, 109194, 109200, 112976, 3255, 3260, - 112981, 3275, 3280, 3285, 112986, 112989, 112995, 113001, 113008, 113013, - 113018, 2317, + 0, 0, 6, 11, 15, 19, 27, 34, 44, 49, 55, 64, 66, 69, 81, 89, 102, 108, + 113, 118, 124, 129, 137, 146, 157, 162, 167, 170, 176, 180, 189, 195, + 201, 207, 212, 220, 227, 235, 241, 250, 177, 253, 254, 262, 268, 273, + 278, 282, 289, 296, 306, 312, 317, 322, 325, 331, 337, 340, 345, 351, + 361, 366, 371, 376, 382, 384, 393, 400, 407, 409, 418, 349, 420, 428, + 436, 438, 446, 447, 452, 455, 462, 464, 470, 477, 482, 490, 496, 503, + 508, 515, 520, 523, 527, 533, 538, 548, 553, 560, 563, 571, 579, 588, + 592, 596, 599, 603, 606, 611, 621, 628, 635, 642, 649, 654, 659, 668, + 670, 679, 683, 690, 698, 702, 710, 714, 277, 723, 736, 740, 745, 750, + 756, 758, 768, 771, 777, 782, 791, 795, 800, 804, 808, 813, 819, 823, + 831, 834, 843, 852, 860, 868, 780, 879, 884, 889, 897, 904, 907, 917, + 921, 925, 932, 935, 939, 946, 952, 633, 958, 961, 964, 967, 976, 980, + 985, 988, 992, 998, 1003, 1006, 1009, 1014, 1020, 1029, 1032, 1037, 1046, + 598, 1050, 1058, 1063, 1066, 1069, 1072, 1078, 1083, 1088, 1094, 1099, + 1104, 1109, 1113, 1118, 1124, 1129, 1134, 1138, 1144, 1149, 1154, 1159, + 1163, 1168, 1173, 1178, 1184, 1190, 1196, 1201, 1205, 1210, 1215, 1220, + 1224, 1229, 1234, 1239, 1244, 1079, 1084, 1089, 1095, 1100, 1248, 1110, + 1254, 1259, 1264, 1271, 1275, 1278, 1287, 1114, 1291, 1119, 1125, 1130, + 1295, 1300, 1305, 1309, 1313, 1319, 1323, 1135, 1326, 1328, 1145, 1333, + 1337, 1150, 1343, 1155, 1347, 1351, 1358, 1160, 1362, 1367, 1371, 1374, + 1378, 1164, 1169, 1383, 1389, 1174, 1401, 1407, 1413, 1419, 1179, 1191, + 1197, 1423, 1427, 1431, 1434, 1202, 1438, 1440, 1445, 1450, 1456, 1461, + 1466, 1470, 1475, 1480, 1485, 1490, 1496, 1501, 1506, 1512, 1518, 1523, + 1527, 1532, 1537, 1542, 1547, 1552, 1556, 1564, 1569, 1573, 1578, 1583, + 1588, 1593, 1597, 1600, 1607, 1612, 1617, 1622, 1627, 1633, 1638, 1642, + 1206, 1645, 1650, 1655, 1660, 1211, 1664, 1668, 1675, 1216, 1682, 1687, + 1221, 1691, 1693, 1698, 1709, 1715, 1225, 1720, 1729, 1230, 1734, 1740, + 1745, 1235, 1750, 1759, 1764, 1768, 1771, 1776, 1780, 1784, 1788, 1791, + 1795, 1240, 1800, 1245, 1804, 1806, 1812, 1818, 1824, 1830, 1836, 1842, + 1848, 1854, 1859, 1865, 1871, 1877, 1883, 1889, 1895, 1901, 1907, 1913, + 1918, 1923, 1928, 1933, 1938, 1943, 1948, 1953, 1958, 1963, 1969, 1974, + 1980, 1985, 1991, 1997, 2002, 2008, 2014, 2020, 2026, 2031, 2036, 2038, + 2039, 2043, 2047, 2052, 2056, 2060, 2064, 2069, 2073, 2076, 2081, 2085, + 2090, 2094, 2098, 2103, 2107, 2110, 2114, 2120, 2134, 2138, 2142, 2146, + 2149, 2154, 2158, 2162, 2165, 2169, 2174, 2179, 2184, 2189, 2193, 2197, + 2201, 2205, 2209, 2214, 2218, 2223, 2227, 2232, 2238, 2245, 2251, 2256, + 2261, 2266, 2272, 2277, 2283, 2288, 2293, 2298, 2303, 2308, 2311, 2313, + 1096, 2317, 2324, 2332, 2342, 2351, 2365, 2369, 2373, 2378, 2391, 2399, + 2402, 2406, 2409, 2414, 2418, 2421, 2425, 2429, 2434, 1704, 2439, 2443, + 2446, 2450, 2456, 2463, 2470, 2476, 2481, 2486, 2492, 2498, 2503, 2508, + 2513, 2518, 2523, 2528, 2453, 2533, 1695, 2535, 2541, 2545, 2550, 2554, + 2558, 1603, 1717, 2563, 2567, 2571, 2574, 2579, 2584, 2589, 2594, 2598, + 2605, 2610, 2613, 2617, 2621, 2628, 2634, 2638, 2644, 2648, 2652, 2657, + 2664, 2669, 2674, 2681, 2687, 2693, 2699, 2720, 2734, 2751, 2766, 2782, + 2799, 2814, 2823, 2828, 2832, 2837, 2842, 2846, 2858, 2865, 2871, 2241, + 2877, 2884, 2890, 2894, 2897, 2904, 2910, 2915, 2919, 2924, 2928, 2932, + 2061, 2936, 2941, 2946, 2950, 2955, 2963, 2967, 2974, 2979, 2983, 2987, + 2991, 2996, 3001, 3006, 3010, 3015, 3020, 3024, 3029, 3034, 3038, 3041, + 3045, 3049, 3057, 3062, 3066, 3070, 3076, 3085, 3089, 3093, 3099, 3104, + 3111, 3115, 3125, 3129, 3133, 3138, 3142, 3147, 3153, 3158, 3162, 3166, + 3170, 2466, 3178, 3183, 3189, 3194, 3198, 3203, 3208, 3212, 3218, 3223, + 2065, 3229, 3235, 3240, 3245, 3250, 3255, 3260, 3265, 3270, 3275, 3280, + 3285, 3290, 3295, 3300, 3305, 3311, 3316, 1111, 101, 3322, 3326, 3330, + 3334, 3339, 3343, 3347, 3353, 3358, 3362, 3366, 3371, 3376, 3380, 3385, + 3389, 3392, 3396, 3401, 3405, 3410, 3414, 3417, 3419, 3423, 3427, 3432, + 3436, 3439, 3452, 3456, 3460, 3464, 3469, 3473, 3477, 3480, 3484, 3488, + 3493, 3497, 3502, 3507, 3512, 3516, 3523, 3528, 3531, 3537, 3540, 3545, + 3551, 3555, 3559, 3562, 3567, 3571, 3576, 3580, 3584, 3587, 3593, 3598, + 3603, 3609, 3614, 3619, 3625, 3631, 3636, 3641, 3646, 3651, 978, 605, + 3654, 3657, 3662, 3666, 3670, 3674, 3678, 3681, 3685, 3690, 3695, 3699, + 3704, 3708, 3713, 3717, 3721, 3725, 3731, 3737, 3740, 3743, 150, 3749, + 3754, 3763, 3771, 3780, 3790, 3797, 3803, 3810, 3815, 3819, 3823, 3831, + 3838, 3843, 3848, 3855, 3860, 3864, 3874, 3878, 3882, 3887, 3892, 3902, + 2077, 3907, 3911, 3914, 3920, 3925, 3931, 3937, 3942, 3949, 3953, 3957, + 3961, 3966, 3971, 3976, 3981, 3986, 3991, 600, 597, 1272, 3996, 4003, + 4010, 4016, 4021, 4028, 4035, 4040, 4046, 4052, 4057, 4061, 4067, 4074, + 4079, 4083, 4087, 2086, 4093, 4101, 4107, 4115, 838, 4121, 4129, 4140, + 4144, 4154, 4160, 4165, 4170, 4175, 4180, 2091, 4185, 4190, 4205, 4211, + 4218, 4229, 4239, 4245, 4250, 4256, 4262, 4265, 4268, 4272, 4277, 4280, + 4287, 4296, 4301, 4305, 4309, 4313, 4317, 4322, 4328, 4339, 4343, 3397, + 4348, 4360, 4366, 4374, 4378, 4383, 4390, 4395, 4400, 4405, 1472, 4410, + 4413, 4416, 4420, 4423, 4429, 4433, 4447, 4451, 4454, 4458, 4464, 4470, + 4475, 4479, 4483, 4489, 4500, 4506, 4511, 4517, 4521, 4529, 4541, 4551, + 4557, 4562, 4571, 4579, 4586, 4592, 4598, 4602, 4608, 4617, 4626, 4631, + 4637, 4641, 4650, 4655, 4659, 4664, 4668, 4676, 4682, 4686, 4693, 4698, + 4702, 4708, 2099, 4714, 4719, 4724, 4729, 4734, 1288, 4739, 4744, 4750, + 4755, 4760, 4765, 4770, 4775, 4780, 4786, 4791, 4797, 4802, 4807, 4812, + 4818, 4823, 4828, 4833, 4838, 4844, 4849, 4855, 4860, 4865, 4870, 4875, + 4880, 4885, 4891, 4896, 4901, 329, 370, 4906, 4912, 4916, 4920, 4925, + 4929, 4933, 4936, 4940, 4944, 4947, 4951, 4955, 4959, 4964, 4968, 4972, + 4978, 4987, 4711, 4992, 4996, 4999, 5004, 5009, 5014, 5019, 5024, 5029, + 5034, 5039, 5044, 5049, 5053, 5058, 5063, 5068, 5073, 5078, 5083, 5088, + 5093, 5098, 5103, 5107, 5112, 5117, 5122, 5127, 5132, 5137, 5142, 5147, + 5152, 5157, 5161, 5166, 5171, 5176, 5181, 5186, 5191, 5196, 5201, 5206, + 5211, 5215, 5220, 5225, 5230, 5235, 5240, 5245, 5250, 5255, 5260, 5265, + 5269, 5274, 5279, 5284, 5289, 5294, 5299, 5304, 5309, 5314, 5319, 5323, + 5328, 5333, 5338, 5343, 5348, 5353, 5358, 5363, 5368, 5373, 5377, 5382, + 5387, 5392, 5397, 5403, 5409, 5415, 5421, 5427, 5433, 5439, 5444, 5450, + 5456, 5462, 5468, 5474, 5480, 5486, 5492, 5498, 5504, 5509, 5515, 5521, + 5527, 5533, 5539, 5545, 5551, 5557, 5563, 5569, 5574, 5580, 5586, 5592, + 5598, 5604, 5610, 5616, 5622, 5628, 5634, 5639, 5645, 5651, 5657, 5663, + 5669, 5675, 5681, 5687, 5693, 5699, 5704, 5710, 5716, 5722, 5728, 5734, + 5740, 5746, 5752, 5758, 5764, 5769, 5773, 5779, 5785, 5791, 5797, 5803, + 5809, 5815, 5821, 5827, 5833, 5838, 5844, 5850, 5856, 5862, 5868, 5874, + 5880, 5886, 5892, 5898, 5903, 5909, 5915, 5921, 5927, 5933, 5939, 5945, + 5951, 5957, 5963, 5968, 5974, 5980, 5986, 5992, 5998, 6004, 6010, 6016, + 6022, 6028, 6033, 6039, 6045, 6051, 6057, 6063, 6069, 6075, 6081, 6087, + 6093, 6098, 6104, 6110, 6116, 6122, 6128, 6134, 6140, 6146, 6152, 6158, + 6163, 6169, 6175, 6181, 6187, 6193, 6199, 6205, 6211, 6217, 6223, 6228, + 6234, 6240, 6246, 6252, 6258, 6264, 6270, 6276, 6282, 6288, 6293, 6299, + 6305, 6311, 6317, 6323, 6329, 6335, 6341, 6347, 6353, 6358, 6364, 6370, + 6376, 6382, 6388, 6394, 6400, 6406, 6412, 6418, 6423, 6427, 6430, 6437, + 6441, 6454, 6458, 6462, 6466, 6469, 6473, 6478, 6482, 6491, 6495, 6501, + 6508, 6519, 6527, 6534, 6540, 6544, 6552, 6561, 6567, 6571, 6583, 6588, + 6591, 6596, 6600, 6610, 6618, 6626, 6632, 6636, 6646, 6656, 6664, 6671, + 6678, 6684, 6690, 6697, 6701, 6708, 6718, 6728, 6736, 6743, 6748, 6752, + 6756, 6764, 6768, 6778, 6783, 6790, 6798, 6808, 6813, 6817, 6822, 6826, + 6833, 6838, 6852, 6857, 6862, 6869, 3667, 6878, 6882, 6886, 6891, 6895, + 6899, 6902, 6907, 6912, 6921, 6927, 6933, 6938, 6944, 6948, 6959, 6969, + 6984, 6999, 7014, 7029, 7044, 7059, 7074, 7089, 7104, 7119, 7134, 7149, + 7164, 7179, 7194, 7209, 7224, 7239, 7254, 7269, 7284, 7299, 7314, 7329, + 7344, 7359, 7374, 7389, 7404, 7419, 7434, 7449, 7464, 7479, 7494, 7509, + 7524, 7539, 7554, 7569, 7584, 7599, 7614, 7629, 7644, 7659, 7674, 7689, + 7704, 7713, 7722, 7727, 7733, 7743, 7747, 7751, 7756, 7761, 7766, 7774, + 7778, 7781, 7785, 3120, 7788, 7793, 348, 551, 7799, 7807, 7811, 7815, + 7818, 7822, 7828, 7832, 7840, 7846, 7851, 7858, 7866, 7873, 7879, 7884, + 7891, 7897, 7906, 7914, 7918, 7923, 7931, 7943, 7954, 7961, 7972, 7976, + 7980, 7984, 7987, 7993, 3424, 7997, 7999, 8005, 8010, 8015, 8020, 8026, + 8031, 8036, 8041, 8046, 8052, 8057, 8062, 8068, 8073, 8079, 8084, 8090, + 8095, 8101, 8106, 8111, 8116, 8121, 8126, 8132, 8137, 8142, 8147, 8153, + 8159, 8165, 8171, 8177, 8183, 8189, 8195, 8201, 8207, 8213, 8219, 8224, + 8229, 8234, 8239, 8244, 8249, 8254, 8259, 8265, 8271, 8276, 8282, 8288, + 8294, 8299, 8304, 8309, 8314, 8320, 8326, 8331, 8336, 8341, 8346, 8351, + 8357, 8362, 8368, 8374, 8380, 8386, 8392, 8398, 8404, 8410, 8416, 2108, + 7817, 8421, 8425, 8433, 8437, 8440, 8447, 8450, 8454, 8462, 8467, 8472, + 8463, 8477, 2135, 8481, 8487, 8493, 8498, 8503, 8510, 8518, 8523, 8527, + 8530, 8534, 8540, 8546, 8550, 1647, 594, 8553, 8557, 8562, 8568, 8573, + 8577, 8580, 8584, 8590, 8595, 8599, 8606, 8610, 8614, 8618, 779, 8621, + 8623, 8631, 8638, 8645, 8651, 8658, 8666, 8673, 8684, 8691, 8697, 8709, + 1131, 1296, 1301, 8720, 8724, 1306, 8728, 8732, 8741, 8749, 8753, 8762, + 8768, 8774, 8779, 8783, 8789, 8794, 8802, 8809, 2819, 8816, 8822, 8826, + 8835, 8844, 8853, 8862, 8868, 8873, 8878, 8889, 8898, 8910, 8915, 8923, + 2194, 8927, 8929, 8934, 8938, 8947, 8955, 1310, 165, 3709, 3714, 8961, + 8965, 8974, 8980, 8985, 8988, 8997, 2206, 9003, 2811, 9007, 9015, 9019, + 9023, 9027, 9031, 2215, 9035, 9040, 9047, 9053, 9059, 9062, 9064, 9067, + 9075, 9083, 9091, 9094, 9099, 2228, 9104, 8474, 9107, 9109, 9114, 9119, + 9124, 9129, 9134, 9139, 9144, 9149, 9154, 9159, 9165, 9170, 9175, 9180, + 9186, 9191, 9196, 9201, 9206, 9211, 9216, 9222, 9227, 9232, 9237, 9242, + 9247, 9252, 9257, 9262, 9267, 9272, 9277, 9282, 9287, 9292, 9297, 9302, + 9307, 9313, 9319, 9324, 9329, 9334, 9339, 9344, 2239, 2246, 2252, 9349, + 9357, 9363, 9371, 2278, 2284, 9379, 2289, 2294, 2299, 2304, 9383, 9387, + 9392, 9396, 9400, 9404, 9409, 9413, 9418, 9422, 9425, 9428, 9434, 9441, + 9447, 9454, 9460, 9467, 9473, 9480, 9486, 9492, 9501, 9507, 9511, 9515, + 9519, 9523, 9528, 9532, 9537, 9541, 9547, 9551, 9556, 9563, 9574, 9582, + 9592, 9598, 9608, 9617, 9624, 9629, 9633, 9644, 9654, 9667, 9678, 9691, + 9702, 9714, 9726, 9738, 9749, 9762, 9775, 9782, 9788, 9799, 9809, 9823, + 9830, 9836, 9845, 9853, 9857, 9862, 9866, 9873, 9881, 9888, 9892, 9898, + 9902, 9908, 9918, 9922, 9927, 9932, 9939, 9945, 8653, 9955, 9959, 9966, + 9972, 9979, 9986, 9990, 9993, 9999, 10003, 10008, 10013, 10018, 10022, + 10028, 10036, 10043, 10049, 10053, 10056, 10062, 10072, 10076, 10082, + 10087, 10091, 10096, 10100, 10106, 10112, 10117, 10123, 10128, 10133, + 10138, 2131, 10143, 10145, 10150, 10158, 10167, 10171, 10177, 10182, + 10187, 10192, 10197, 10203, 10208, 10213, 4485, 10218, 10223, 10227, + 10233, 10238, 10244, 10249, 10254, 10260, 10265, 10172, 10271, 10275, + 10282, 10288, 10293, 10297, 6848, 10302, 10311, 10316, 10321, 9043, 9050, + 10326, 2993, 10330, 10335, 10340, 10345, 10183, 10349, 10354, 10359, + 10188, 10363, 10193, 10368, 10375, 10382, 10388, 10395, 10401, 10407, + 10412, 10419, 10424, 10429, 10434, 10440, 10198, 10204, 10446, 10452, + 10457, 10462, 10470, 10209, 10475, 10478, 10480, 10488, 10494, 10500, + 10509, 10517, 10525, 10533, 10541, 10549, 10557, 10565, 10573, 10582, + 10591, 10599, 10608, 10617, 10626, 10635, 10644, 10653, 10662, 10671, + 10680, 10689, 10697, 10702, 10706, 10712, 10720, 10727, 10742, 10759, + 10778, 10787, 10795, 10810, 10821, 10829, 10839, 10849, 10857, 10863, + 10875, 10884, 10892, 10899, 10906, 10913, 10919, 10924, 10934, 10942, + 10952, 10959, 10969, 10979, 10989, 10997, 11004, 11013, 11023, 11037, + 11052, 11061, 11069, 11074, 11078, 11087, 11093, 11098, 11108, 11118, + 11128, 11133, 11137, 11147, 11156, 11161, 11177, 11194, 11204, 11209, + 11220, 11233, 11244, 11252, 11265, 11277, 11285, 11290, 11294, 11300, + 11305, 11313, 11321, 11328, 11339, 11344, 11352, 11362, 11368, 11372, + 11375, 11379, 11385, 11392, 11396, 11404, 11413, 11421, 11428, 11433, + 11438, 11442, 11446, 11454, 11469, 11485, 11491, 11499, 11508, 11516, + 11522, 11526, 11533, 11544, 11548, 11551, 11562, 11568, 11573, 10214, + 11581, 11587, 11594, 11600, 11605, 11612, 11619, 11626, 11633, 11640, + 11647, 11654, 11661, 11668, 11675, 11682, 11689, 11696, 11703, 11710, + 11715, 10755, 11720, 11726, 11733, 11740, 11745, 11752, 11761, 11765, + 11777, 11781, 11787, 11792, 11797, 11802, 11807, 11812, 11817, 11820, + 11824, 11828, 11832, 11836, 11842, 11848, 11853, 11859, 11864, 11869, + 11875, 11880, 11885, 9935, 11890, 11894, 11898, 11902, 11907, 11912, + 11917, 11925, 11931, 11936, 11940, 11944, 11951, 11956, 11964, 11971, + 11976, 11980, 11983, 11989, 11996, 12000, 12003, 12008, 12012, 4524, + 12018, 12027, 46, 12035, 12041, 12046, 12051, 12059, 12066, 12071, 6773, + 12077, 12083, 12088, 12092, 12095, 12110, 12129, 12141, 12154, 12167, + 12180, 12194, 12207, 12222, 12229, 10219, 12235, 12249, 12254, 12260, + 12265, 12273, 12278, 8831, 12283, 12286, 12294, 12301, 12306, 12310, + 12316, 12320, 12325, 12330, 12335, 12340, 12345, 12350, 2998, 10837, + 12355, 12359, 12365, 12371, 12376, 12382, 12387, 10228, 12393, 12399, + 12404, 12409, 12417, 12423, 12436, 12444, 12451, 12457, 10234, 12463, + 12471, 12479, 12486, 12499, 12512, 12524, 12534, 12546, 12574, 12582, + 12591, 12598, 12610, 12617, 12627, 12636, 12644, 12651, 12656, 12662, + 10239, 12667, 12673, 12678, 12683, 12688, 10245, 12693, 12696, 12703, + 12709, 12723, 12736, 12747, 9567, 12758, 12764, 12773, 12781, 12788, + 12794, 12805, 12811, 12816, 12824, 4012, 12830, 12835, 12102, 12841, + 12848, 12853, 10250, 12859, 12864, 12871, 12877, 12883, 12888, 12896, + 12904, 12911, 12915, 12927, 12941, 12951, 12956, 12960, 12971, 12977, + 12982, 12987, 10255, 12991, 10261, 12996, 12999, 13004, 13016, 13023, + 13028, 13032, 13040, 13045, 13049, 13054, 13058, 13065, 13071, 10266, + 10173, 13078, 3003, 17, 13085, 13090, 13094, 13098, 13104, 13112, 13122, + 13127, 13132, 13139, 13146, 13150, 13161, 13171, 13180, 13189, 13201, + 13206, 13210, 13218, 13232, 13236, 13239, 13243, 13251, 13258, 13266, + 13270, 13281, 13289, 13293, 13300, 13305, 13309, 13315, 13320, 13326, + 13331, 13336, 13340, 13346, 13351, 13362, 13366, 13369, 13375, 13382, + 13388, 13393, 13399, 13405, 13412, 13423, 13433, 13443, 13452, 13459, + 13468, 13472, 10276, 10283, 10289, 10294, 13478, 13484, 13490, 13495, + 13501, 10298, 13507, 13510, 13517, 13522, 13527, 13542, 13558, 13573, + 13581, 13586, 13593, 13599, 13603, 13608, 13613, 13618, 13623, 13628, + 13633, 13638, 13643, 13648, 1561, 374, 13653, 13661, 13668, 13674, 13679, + 13684, 10303, 13686, 13690, 13695, 13699, 13709, 13714, 13718, 13721, + 13730, 13734, 13737, 13744, 10312, 13749, 13752, 13760, 13767, 13775, + 13779, 13785, 13789, 13796, 13805, 13812, 13808, 13819, 13823, 13829, + 13833, 13837, 13841, 13847, 13857, 13865, 13872, 13876, 13884, 13889, + 13893, 13900, 13905, 13912, 13916, 13921, 13926, 13930, 13937, 13943, + 13951, 13957, 13962, 13972, 13979, 13984, 13989, 13993, 13997, 14005, + 4354, 14013, 14018, 10317, 14022, 14029, 14033, 14036, 14044, 14051, + 14055, 6628, 14059, 14064, 14069, 14073, 14084, 14094, 14099, 14105, + 14110, 14114, 14117, 14125, 14130, 14135, 14142, 14147, 10322, 14152, + 14156, 14163, 14168, 14173, 14178, 6796, 14183, 14188, 14193, 14198, + 14204, 14209, 14215, 14220, 14225, 14230, 14235, 14240, 14245, 14250, + 14255, 14260, 14265, 14270, 14275, 14280, 14285, 14290, 14295, 14301, + 14306, 14311, 14316, 14321, 14326, 14332, 14337, 14342, 14348, 14353, + 14359, 14364, 14370, 14375, 14380, 14385, 14390, 14396, 14401, 14406, + 14411, 14419, 996, 112, 14425, 14429, 14434, 14439, 14443, 14447, 14451, + 14456, 14460, 14465, 14469, 14472, 14476, 14480, 14486, 14491, 14501, + 14507, 14515, 14521, 14525, 14529, 14536, 14544, 14553, 14564, 14574, + 14581, 14588, 14592, 14601, 14610, 14618, 14625, 14634, 14643, 14652, + 14661, 14671, 14681, 14691, 14701, 14711, 14720, 14730, 14740, 14750, + 14760, 14770, 14780, 14790, 14799, 14809, 14819, 14829, 14839, 14849, + 14859, 14868, 14878, 14888, 14898, 14908, 14918, 14928, 14938, 14948, + 14958, 14967, 14977, 14987, 14997, 15007, 15017, 15027, 15037, 15047, + 15057, 15067, 15076, 15082, 1140, 15086, 15089, 15093, 15098, 15105, + 15111, 15116, 15120, 15125, 15134, 15143, 15151, 15156, 15160, 15164, + 15170, 15175, 15181, 10331, 15186, 15191, 15200, 15205, 10341, 15210, + 15213, 15219, 15227, 10346, 15234, 15238, 15242, 15247, 15251, 15261, + 15267, 15273, 15278, 15287, 15295, 15302, 15309, 15314, 15321, 15326, + 15330, 15333, 15344, 15354, 15367, 15376, 15384, 15395, 15407, 15417, + 15427, 15432, 15436, 15441, 15446, 15450, 15456, 15464, 15471, 15482, + 15487, 15497, 15506, 15510, 15513, 15520, 15530, 15539, 15546, 15550, + 15557, 15563, 15568, 15573, 15577, 15129, 15586, 15590, 15596, 15600, + 15605, 15609, 15616, 15623, 15627, 15636, 15644, 15652, 15659, 15667, + 15679, 15690, 15700, 15707, 15713, 15722, 15733, 15742, 15754, 15766, + 15778, 15788, 15797, 15807, 15816, 15824, 15831, 15840, 15848, 15852, + 15857, 15863, 15869, 15874, 15879, 15883, 15888, 15893, 15898, 15903, + 15908, 15913, 15918, 8495, 15923, 15925, 15929, 15934, 15940, 15947, + 15953, 15959, 15968, 15972, 15978, 15986, 15993, 16002, 16011, 16020, + 16029, 16038, 16047, 16056, 16065, 16075, 16085, 16094, 16100, 16107, + 16114, 16120, 16134, 16140, 16147, 16155, 16164, 16172, 16178, 16187, + 16196, 16207, 16213, 16223, 16231, 16238, 16246, 16255, 16268, 16277, + 16285, 16292, 16305, 16311, 16317, 16327, 16336, 16345, 16350, 16354, + 16360, 16366, 16371, 16378, 16385, 9949, 16390, 16395, 16402, 16410, + 16415, 16427, 16434, 16439, 16451, 14482, 16456, 16462, 16470, 16476, + 16481, 16489, 16497, 16504, 16512, 16518, 16526, 16534, 16540, 16548, + 16554, 16559, 16565, 16572, 16578, 16583, 16587, 16598, 16606, 16614, + 16620, 16625, 16632, 16641, 16647, 16652, 16660, 16667, 16676, 16690, + 4298, 16694, 16699, 16704, 16710, 16715, 16720, 16724, 16729, 16734, + 16739, 8494, 16744, 16749, 16754, 16759, 16764, 16768, 16773, 16778, + 16783, 16788, 16794, 16800, 13781, 16805, 16811, 16816, 16821, 16826, + 10350, 16831, 16836, 16841, 16846, 16851, 16865, 16882, 16900, 16912, + 16925, 16942, 16958, 16975, 16985, 17004, 17015, 17026, 17037, 2708, + 17048, 17059, 17070, 17087, 17098, 17109, 17114, 10355, 17119, 17123, + 2388, 17127, 17130, 17136, 17144, 17152, 17158, 17167, 17174, 17179, + 17187, 17195, 17202, 17206, 17211, 17217, 17224, 17232, 17239, 17251, + 17258, 17264, 17272, 17277, 17283, 17289, 17294, 13536, 17301, 17310, + 17316, 17321, 17329, 17338, 17346, 17353, 17359, 17367, 17374, 17380, + 17386, 17393, 17400, 17406, 17412, 17421, 17429, 17434, 17444, 17451, + 17457, 17465, 17471, 17479, 17487, 17494, 17507, 17514, 17523, 17532, + 17541, 17549, 17559, 17566, 17571, 3868, 17578, 17583, 1256, 17587, + 17594, 16745, 17598, 17604, 17608, 17616, 17628, 17633, 17640, 17646, + 17651, 17658, 16750, 17662, 17666, 17670, 16755, 17674, 16760, 17678, + 17685, 17690, 17694, 17701, 17705, 17713, 17720, 17725, 17733, 17737, + 17744, 17761, 17770, 17779, 17783, 17786, 17792, 17800, 17806, 17811, + 17815, 17820, 17825, 17830, 17835, 17840, 17845, 3946, 17850, 17852, + 17860, 17867, 17877, 17889, 17894, 17898, 17904, 17909, 17917, 17921, + 17927, 17932, 17938, 17941, 17948, 17956, 17963, 17969, 17974, 17980, + 17985, 17992, 17998, 18003, 18010, 18015, 18019, 18025, 18031, 18035, + 18042, 18048, 18053, 18059, 18067, 18075, 18082, 18088, 18093, 18099, + 18105, 18113, 18118, 18123, 18131, 18137, 18143, 18148, 18155, 18160, + 18164, 18170, 18176, 18181, 18188, 18193, 18199, 18202, 18208, 18219, + 18225, 18228, 18232, 18236, 18250, 18263, 18275, 18281, 18286, 18293, + 18299, 18305, 18316, 18328, 18340, 18350, 18359, 18367, 18374, 18385, + 18395, 18405, 18413, 18416, 16774, 18421, 18426, 16779, 16930, 18434, + 18447, 18462, 18473, 16947, 18491, 18504, 18517, 18528, 12117, 18539, + 18552, 18571, 18582, 18593, 18604, 2729, 18617, 18621, 18629, 18640, + 18651, 18659, 18674, 18689, 18700, 18707, 18713, 18721, 18725, 18731, + 18735, 18738, 18751, 18763, 18773, 18781, 18788, 18796, 18806, 18811, + 18818, 18823, 18830, 18841, 18851, 18857, 18862, 18867, 16784, 18871, + 18877, 18883, 18888, 18893, 18898, 18902, 16789, 16795, 18906, 16801, + 18911, 18919, 18924, 18928, 18935, 18943, 18950, 18959, 18966, 18970, + 18974, 18979, 18984, 18989, 18994, 18999, 10194, 19004, 19006, 19011, + 19016, 19022, 19027, 19032, 19037, 19042, 19046, 19052, 19058, 19063, + 19069, 19074, 19079, 19083, 19089, 19094, 19098, 19103, 19108, 19120, + 19125, 19131, 19136, 19141, 19147, 19153, 19158, 19163, 19168, 19175, + 19181, 19192, 19199, 19208, 19213, 19217, 275, 19221, 19229, 19234, + 19240, 19247, 19254, 19260, 19265, 19270, 19275, 19282, 19292, 19300, + 19305, 19310, 19317, 19323, 19332, 19342, 19352, 19366, 19380, 19394, + 19408, 19423, 19438, 19455, 19473, 19486, 19492, 19497, 19502, 19506, + 19514, 19519, 19527, 19533, 19539, 19544, 19549, 19553, 19559, 19564, + 19568, 19575, 19580, 19584, 19595, 19601, 19606, 19611, 19618, 19623, + 19627, 3826, 19632, 19638, 19645, 16806, 19651, 19655, 19661, 19666, + 19671, 19675, 19681, 19686, 19691, 19698, 19703, 15263, 19707, 19712, + 19716, 19721, 19727, 19733, 19740, 19750, 19758, 19765, 19770, 19774, + 19783, 19791, 19798, 19805, 19811, 19816, 19822, 19827, 19832, 19838, + 19843, 19849, 19854, 19860, 19866, 19873, 19879, 19884, 19889, 10420, + 19898, 19901, 19909, 19915, 19920, 19925, 19935, 19942, 19948, 19953, + 19958, 19964, 19969, 19975, 19980, 19986, 19993, 19999, 20005, 20010, + 20018, 20025, 20030, 20035, 20041, 20046, 20050, 20059, 20070, 20077, + 20084, 20092, 20099, 20106, 20111, 20116, 20122, 20127, 20135, 20141, + 20147, 20152, 20159, 20165, 20170, 20174, 20180, 20185, 20190, 20194, + 20199, 1329, 8519, 3017, 20203, 20207, 20211, 20215, 20219, 20223, 20226, + 20231, 20238, 20246, 20256, 20267, 20277, 20288, 20300, 20311, 20321, + 20332, 20344, 20355, 20367, 20380, 20392, 20403, 20413, 20424, 20436, + 20447, 20460, 20472, 20483, 20495, 20508, 20520, 20533, 20547, 20560, + 20572, 20583, 20593, 20604, 20616, 20627, 20639, 20652, 20664, 20675, + 20687, 20700, 20713, 20727, 20740, 20752, 20763, 20775, 20788, 20800, + 20813, 20827, 20840, 20852, 20865, 20879, 20892, 20906, 20920, 20933, + 20945, 20956, 20966, 16817, 20973, 20979, 20989, 20997, 21004, 21012, + 21022, 21031, 21044, 21049, 21054, 21062, 21069, 15372, 15381, 21076, + 21086, 21101, 21107, 21114, 21121, 21128, 21134, 21140, 21151, 21159, + 21167, 21177, 21187, 21196, 16822, 21205, 21211, 21217, 21226, 21234, + 21242, 21247, 21256, 21264, 21276, 21286, 21296, 21306, 21315, 21327, + 21337, 21347, 21358, 21365, 21370, 21377, 21389, 21401, 21413, 21425, + 21437, 21449, 21461, 21473, 21485, 21497, 21508, 21520, 21532, 21544, + 21556, 21568, 21580, 21592, 21604, 21616, 21628, 21639, 21651, 21663, + 21675, 21687, 21699, 21711, 21723, 21735, 21747, 21759, 21770, 21782, + 21794, 21806, 21818, 21830, 21842, 21854, 21866, 21878, 21890, 21901, + 21913, 21925, 21937, 21949, 21961, 21973, 21985, 21997, 22009, 22021, + 22032, 22044, 22056, 22068, 22080, 22092, 22104, 22116, 22128, 22140, + 22152, 22163, 22175, 22187, 22199, 22211, 22223, 22235, 22247, 22259, + 22271, 22283, 22294, 22306, 22318, 22330, 22342, 22355, 22368, 22381, + 22394, 22407, 22420, 22433, 22445, 22458, 22471, 22484, 22497, 22510, + 22523, 22536, 22549, 22562, 22575, 22587, 22600, 22613, 22626, 22639, + 22652, 22665, 22678, 22691, 22704, 22717, 22729, 22742, 22755, 22768, + 22781, 22794, 22807, 22820, 22833, 22846, 22859, 22871, 22884, 22897, + 22910, 22923, 22936, 22949, 22962, 22975, 22988, 23001, 23013, 23026, + 23039, 23052, 23065, 23078, 23091, 23104, 23117, 23130, 23143, 23155, + 23166, 23179, 23192, 23205, 23218, 23231, 23244, 23257, 23270, 23283, + 23296, 23308, 23321, 23334, 23347, 23360, 23373, 23386, 23399, 23412, + 23425, 23438, 23450, 23463, 23476, 23489, 23502, 23515, 23528, 23541, + 23554, 23567, 23580, 23592, 23605, 23618, 23631, 23644, 23657, 23670, + 23683, 23696, 23709, 23722, 23734, 23747, 23760, 23773, 23786, 23799, + 23812, 23825, 23838, 23851, 23864, 23876, 23889, 23902, 23915, 23928, + 23941, 23954, 23967, 23980, 23993, 24006, 24018, 24031, 24044, 24057, + 24070, 24083, 24096, 24109, 24122, 24135, 24148, 24160, 24173, 24186, + 24199, 24212, 24225, 24238, 24251, 24264, 24277, 24290, 24302, 24315, + 24328, 24341, 24354, 24367, 24380, 24393, 24406, 24419, 24432, 24444, + 24457, 24470, 24483, 24496, 24509, 24522, 24535, 24548, 24561, 24574, + 24586, 24597, 24606, 24614, 24622, 24629, 24635, 24639, 24645, 24651, + 24660, 24668, 24673, 24679, 24684, 24688, 24697, 10199, 24708, 24714, + 24721, 24729, 24736, 12716, 12730, 24743, 24750, 24759, 24764, 24769, + 24776, 24781, 24786, 8535, 8541, 8547, 24791, 24796, 24799, 24804, 24812, + 24819, 24826, 24838, 24845, 24851, 24860, 24869, 24878, 24884, 24892, + 24901, 24905, 24911, 24916, 24926, 24933, 24939, 24947, 24953, 24960, + 24966, 24976, 24985, 24989, 24996, 25000, 25005, 25011, 25019, 25023, + 25033, 16832, 25042, 25048, 25052, 25061, 25070, 25080, 25086, 16837, + 25093, 25100, 25111, 25119, 25129, 25138, 25146, 9914, 25154, 25159, + 25165, 25170, 25174, 25178, 25182, 10938, 25187, 25195, 25202, 25211, + 25219, 25226, 25233, 25242, 25248, 1024, 25255, 25261, 25265, 25271, + 25278, 25284, 25292, 25298, 25305, 25311, 25317, 25326, 25330, 25338, + 25345, 25354, 25361, 25366, 25370, 25381, 25386, 25391, 25397, 25402, + 25415, 8759, 25419, 25425, 25431, 25437, 25442, 25450, 25454, 25461, + 25470, 25475, 17110, 25483, 25487, 25499, 25504, 25508, 25511, 25517, + 25523, 25529, 25534, 25539, 25543, 25546, 25557, 25562, 10471, 25569, + 25574, 25579, 25584, 25589, 25594, 25599, 25604, 25609, 10476, 25614, + 25619, 25624, 25629, 25634, 25639, 25644, 25649, 25654, 25659, 25664, + 25669, 25675, 25680, 25685, 25690, 25695, 25700, 25705, 25710, 25715, + 25720, 25726, 25732, 25737, 25742, 25747, 25752, 25757, 25762, 25767, + 25772, 25777, 25783, 25788, 25793, 25798, 25804, 25810, 25815, 25820, + 25825, 25830, 25835, 25840, 25845, 25850, 25856, 25861, 25866, 25871, + 25876, 25882, 25887, 25892, 25896, 1252, 145, 25904, 25908, 25912, 25916, + 25921, 25925, 15269, 2314, 25929, 25934, 25938, 25943, 25947, 25952, + 25956, 25962, 25967, 25971, 25975, 25983, 25987, 25991, 25998, 26003, + 26008, 26012, 26018, 26023, 26027, 26032, 26037, 26041, 26048, 26055, + 26062, 26067, 26071, 26075, 26080, 26084, 26087, 26093, 26106, 26111, + 26117, 26126, 26131, 10698, 26136, 26145, 26150, 26153, 26157, 26162, + 26167, 26172, 26177, 26182, 2825, 2830, 26187, 26193, 26197, 26203, 3787, + 26208, 26213, 26218, 26224, 26229, 16203, 26234, 26239, 26244, 26249, + 26255, 26260, 26265, 26271, 26276, 26280, 26285, 26290, 26295, 26300, + 26305, 26309, 26314, 26318, 26323, 26328, 26333, 26338, 26342, 26347, + 26351, 26356, 26361, 26366, 26281, 3026, 26286, 26371, 26379, 26386, + 11032, 26398, 26406, 26416, 26434, 26453, 26462, 26470, 26291, 26477, + 26482, 26490, 26296, 26495, 26500, 26508, 26513, 26518, 26522, 26301, + 26527, 26535, 26540, 26544, 26551, 26557, 26566, 26570, 26578, 26582, + 26585, 20054, 26592, 26596, 26600, 26605, 26611, 26618, 26623, 9941, + 26627, 26632, 26637, 26642, 26647, 26652, 1657, 1662, 26657, 26663, + 26669, 26674, 26678, 26682, 26686, 26690, 26694, 26698, 26702, 26706, + 24832, 26709, 26716, 26724, 26730, 26736, 26741, 26746, 26752, 26756, + 26761, 26768, 16109, 16116, 26774, 26786, 26789, 26796, 26800, 19256, + 26807, 26815, 26826, 26835, 26848, 26858, 26872, 26884, 26898, 26911, + 26923, 26933, 26945, 26951, 26957, 26972, 26996, 27014, 27033, 27046, + 27060, 27078, 27094, 27111, 27129, 27140, 27159, 27176, 27196, 27214, + 27226, 27240, 27254, 27266, 27283, 27302, 27320, 27332, 27350, 27369, + 16990, 27382, 27402, 27414, 12148, 27426, 27431, 27436, 27441, 27450, + 27456, 27461, 27465, 27472, 27478, 27482, 27487, 27492, 27497, 27502, + 27507, 27512, 2411, 27517, 27523, 27527, 27530, 27541, 27545, 27548, + 27556, 27562, 14421, 27566, 27575, 27586, 27592, 27598, 27613, 27622, + 27630, 27637, 27642, 27646, 27653, 27659, 27668, 27676, 27683, 27693, + 27702, 27712, 27717, 27726, 27735, 27746, 27757, 27767, 27784, 4442, + 27794, 27798, 27808, 27816, 27826, 27837, 27843, 27848, 27858, 27866, + 27873, 27879, 27886, 27891, 26329, 27895, 27904, 27908, 27911, 27916, + 27924, 27931, 27940, 27948, 27956, 27964, 27974, 27983, 27989, 27995, + 28001, 28005, 26334, 26339, 28009, 28019, 28029, 28039, 28047, 28054, + 28064, 28072, 28080, 28086, 28094, 773, 28103, 17191, 625, 28117, 28126, + 28134, 28145, 28156, 28166, 28175, 28187, 28196, 28205, 28212, 28218, + 28228, 28237, 28246, 28254, 28262, 28272, 28280, 28288, 28295, 28301, + 28306, 28311, 28316, 7928, 28321, 28324, 28328, 28333, 28339, 28344, + 28348, 11157, 26352, 26357, 28356, 28362, 28368, 28373, 28378, 28382, + 28390, 28396, 28402, 28406, 3811, 28414, 28419, 28424, 28428, 28432, + 11286, 28439, 28447, 28461, 28468, 28475, 28481, 11295, 11301, 28489, + 28497, 28504, 28509, 28514, 26362, 28520, 28531, 28535, 28540, 2660, + 28545, 28556, 28562, 28567, 28571, 28575, 28578, 28585, 28592, 28598, + 28606, 28613, 28619, 28623, 7968, 28628, 28632, 28636, 28644, 28649, + 28654, 28659, 1685, 28664, 28669, 28674, 28679, 28684, 28689, 28694, + 28699, 28704, 28709, 28714, 28719, 28724, 28729, 28735, 28740, 28745, + 28750, 28755, 28760, 28765, 28771, 28776, 28781, 28786, 28791, 28796, + 28801, 28806, 28812, 28818, 28823, 28829, 28834, 28839, 5, 28845, 28849, + 28853, 28857, 28862, 28866, 28870, 28874, 28878, 28883, 28887, 28892, + 28896, 28899, 28903, 28908, 28912, 28917, 28921, 28925, 28929, 28934, + 28938, 28942, 28952, 28957, 28961, 28965, 28970, 28975, 28984, 28989, + 28994, 28998, 29002, 29011, 29024, 29036, 29045, 29054, 29059, 29065, + 29070, 29074, 29078, 29088, 29097, 29105, 29111, 29116, 29120, 29127, + 29137, 29146, 29154, 12505, 29162, 29170, 29179, 29188, 29196, 29206, + 29211, 29215, 29219, 29222, 29224, 29228, 29232, 29237, 29242, 29246, + 29250, 29253, 29257, 29260, 29264, 29267, 29270, 29274, 29280, 29284, + 29288, 29292, 29296, 29301, 29306, 29311, 29315, 29318, 29323, 29329, + 29334, 29340, 29345, 29349, 29355, 29359, 29363, 29368, 29372, 29377, + 29382, 29386, 29390, 29397, 29401, 29404, 29408, 29412, 29418, 29424, + 29428, 29432, 29437, 29444, 29450, 29454, 29463, 29467, 29471, 29474, + 29480, 29485, 29491, 1385, 1737, 29496, 29501, 29506, 29511, 29516, + 29521, 29526, 2118, 799, 29531, 29534, 29538, 29542, 29547, 29551, 17203, + 29555, 29560, 29565, 29569, 29572, 29577, 29581, 29586, 29590, 17207, + 29595, 29598, 29601, 29607, 29611, 29616, 29620, 29633, 29637, 29640, + 29648, 29657, 29664, 29669, 29675, 29681, 29689, 29696, 29703, 29707, + 29711, 29715, 29720, 29725, 29729, 29737, 29742, 29749, 29761, 29772, + 29777, 29781, 29788, 29792, 29797, 29803, 29806, 29811, 29816, 29823, + 29827, 29831, 29834, 29840, 8659, 2318, 29844, 29849, 29865, 10749, + 29885, 29894, 29910, 29914, 29921, 29924, 29930, 29940, 29946, 29955, + 29970, 29981, 29993, 30004, 30012, 30021, 30027, 30036, 30046, 30056, + 30067, 30078, 30088, 30097, 30104, 30113, 30121, 30128, 30135, 30143, + 30150, 30157, 30170, 30177, 30185, 30192, 30198, 30203, 30212, 30219, + 30225, 30230, 30238, 30246, 30253, 30260, 27818, 30272, 30284, 30298, + 30306, 30314, 30322, 30329, 30341, 30350, 30359, 30367, 30375, 30383, + 30390, 30396, 30405, 30413, 30423, 30432, 30442, 30451, 30460, 30468, + 30473, 30477, 30480, 30484, 30488, 30492, 30496, 30500, 30506, 30512, + 30517, 30525, 17265, 30532, 30537, 30544, 30550, 30556, 30563, 13589, + 30570, 30573, 30585, 30593, 30599, 30604, 30608, 30619, 30629, 30639, + 11225, 30648, 30657, 30665, 30675, 30684, 30691, 30698, 30706, 30710, + 17284, 30713, 30720, 30724, 4386, 30730, 30733, 30740, 30746, 30751, + 30758, 30764, 30768, 30773, 30777, 30786, 30793, 30799, 8712, 30806, + 30814, 30821, 30827, 30832, 30838, 30844, 30852, 30858, 30862, 30865, + 30867, 30485, 11238, 30876, 30881, 30887, 30897, 30902, 30909, 30917, + 30923, 30928, 30933, 30938, 30942, 30947, 30954, 30960, 30969, 30977, + 30981, 30988, 30994, 31003, 31009, 31016, 4645, 31022, 31028, 31033, + 31040, 31052, 31063, 31068, 31076, 31080, 31090, 31096, 31100, 31105, + 31115, 31124, 31128, 31135, 31143, 31150, 31156, 31161, 31169, 31176, + 31181, 31188, 31200, 31209, 31213, 15195, 31221, 31231, 31235, 31243, + 31250, 31257, 29644, 31268, 31273, 31277, 31284, 31291, 26014, 30410, + 31296, 31300, 31303, 27146, 31308, 31322, 31338, 31356, 31375, 31392, + 31410, 27165, 31427, 31447, 27182, 31459, 31471, 18478, 31483, 27202, + 31497, 31509, 12161, 31523, 31528, 31533, 31538, 31544, 31550, 31556, + 31560, 31568, 31574, 31581, 31586, 31596, 31602, 11723, 31608, 31610, + 31615, 31623, 31627, 30950, 31633, 31640, 13437, 13447, 31647, 31654, + 31664, 31669, 31673, 31676, 31682, 31690, 31702, 31712, 31728, 31741, + 31755, 18496, 31769, 31776, 31780, 31783, 31788, 31792, 31799, 31806, + 31813, 31820, 31830, 31835, 31840, 31845, 31853, 31861, 31866, 31875, + 27839, 3466, 31880, 31883, 31886, 31891, 31898, 31903, 31908, 31924, + 31932, 31940, 10513, 31948, 31953, 31957, 31963, 31968, 31974, 31977, + 31983, 31995, 32003, 32010, 32016, 32023, 32034, 32048, 32061, 32067, + 32076, 32082, 32091, 32103, 32114, 32124, 32133, 32142, 32150, 32161, + 656, 32168, 32175, 32181, 32186, 32192, 32199, 32205, 32216, 32226, + 32236, 32245, 32251, 32258, 32263, 32271, 32278, 32286, 32294, 32306, + 6917, 32313, 32316, 32325, 32333, 32339, 32345, 32350, 32354, 32357, + 32363, 32370, 32375, 32380, 32385, 32389, 32401, 32412, 32421, 32429, + 17466, 32434, 32442, 32447, 32455, 32461, 32467, 13430, 9509, 32472, + 32476, 32480, 32483, 32486, 32492, 32500, 32508, 32512, 32516, 32521, + 32525, 32528, 32537, 32542, 32546, 32549, 32554, 32562, 32573, 32582, + 32586, 32592, 32598, 32602, 32608, 32616, 32638, 32662, 32673, 32682, + 32688, 32695, 32702, 32708, 32716, 32722, 32727, 32738, 32756, 32763, + 32771, 32775, 32782, 32787, 32796, 32809, 32817, 32829, 32840, 32851, + 32861, 32875, 32884, 32892, 32904, 10766, 32915, 32926, 32937, 32949, + 32959, 32968, 32978, 32983, 32987, 32995, 33006, 33016, 33022, 33027, + 33031, 33034, 33037, 33045, 33053, 33062, 33072, 33081, 33087, 33101, + 2743, 33123, 33134, 33143, 33153, 33165, 33174, 33183, 33193, 33201, + 33209, 33218, 33223, 33234, 33239, 33248, 33254, 33265, 33269, 33272, + 33282, 33291, 33299, 33309, 33319, 33327, 33336, 33343, 33351, 33358, + 33367, 33376, 33381, 33386, 33390, 33398, 33405, 33409, 33417, 33424, + 33435, 33450, 33457, 33463, 33473, 33482, 33488, 33499, 33503, 33510, + 33514, 33521, 33527, 16340, 33533, 33537, 33542, 33548, 33555, 33559, + 33563, 33571, 33579, 33585, 33594, 33601, 33608, 33613, 33618, 33628, + 27893, 33632, 33635, 33640, 33645, 33650, 33655, 33660, 33665, 33670, + 33675, 33681, 33686, 33691, 33697, 1102, 757, 33702, 33709, 33718, 2366, + 33725, 33730, 33734, 33740, 1151, 604, 33745, 328, 33749, 33758, 33766, + 33775, 33783, 33790, 33801, 33809, 33818, 33826, 33836, 33844, 33849, + 11393, 33853, 33861, 33869, 33874, 17220, 4000, 33880, 33886, 33892, + 6459, 33897, 33901, 33908, 33914, 33920, 33924, 33930, 33935, 33942, + 1344, 33948, 33955, 33959, 1251, 6467, 33964, 33974, 33982, 33988, 33998, + 34007, 34015, 34021, 34026, 34034, 34041, 12947, 34047, 34054, 34059, + 34066, 34076, 1404, 251, 2117, 34082, 34088, 34095, 34106, 34117, 34125, + 34132, 34142, 34151, 34159, 34168, 34175, 34182, 34195, 34202, 34208, + 34219, 34238, 34243, 1156, 34247, 34252, 34260, 3883, 34264, 34269, + 34273, 34277, 1348, 29251, 34287, 34291, 34296, 34300, 34306, 3745, + 34312, 34320, 34327, 34338, 34347, 34355, 34380, 34388, 34393, 3884, 391, + 34399, 34407, 34415, 34422, 34428, 34433, 2186, 12363, 34440, 34446, + 30769, 31058, 34452, 632, 106, 34456, 34460, 34466, 747, 10386, 34471, + 34478, 34484, 34488, 34492, 1549, 34495, 34499, 17734, 34502, 34507, + 34514, 34520, 8725, 34525, 34533, 34540, 34546, 26524, 34550, 34554, + 34558, 34562, 3954, 19566, 34566, 34571, 34575, 34578, 34586, 34594, + 34599, 34608, 34616, 34619, 34626, 34636, 34648, 34656, 34661, 34665, + 34673, 34680, 34686, 34693, 34700, 34703, 34707, 34711, 1359, 34721, + 34723, 34728, 34734, 34740, 34745, 34750, 34755, 34760, 34765, 34770, + 34775, 34780, 34785, 34790, 34795, 34800, 34805, 34810, 34816, 34822, + 34828, 34834, 34839, 34844, 34849, 34855, 34860, 34865, 34870, 34876, + 34881, 34887, 34892, 34897, 34902, 34907, 34913, 34918, 34924, 34929, + 34934, 34939, 34944, 34950, 34955, 34961, 34966, 34971, 34976, 34981, + 34986, 34991, 34996, 35001, 35006, 35012, 35018, 35024, 35029, 35034, + 35039, 35044, 35050, 35056, 35062, 35068, 35074, 35080, 35085, 35091, + 35096, 35101, 35106, 35111, 35117, 2457, 35122, 2464, 2471, 2867, 35127, + 2477, 2487, 35133, 2519, 2524, 2529, 35137, 35142, 35147, 35153, 35158, + 35163, 35167, 35172, 35178, 35183, 35188, 35193, 35199, 35204, 35208, + 35212, 35217, 35222, 35227, 35232, 35237, 35243, 35249, 35254, 35258, + 35263, 35269, 35273, 35278, 35283, 35288, 35293, 35297, 35300, 35305, + 35310, 35315, 35320, 35325, 35331, 35337, 35342, 35347, 35352, 35356, + 35361, 35366, 35371, 35376, 35381, 35386, 35390, 35395, 35400, 35405, + 35409, 35413, 35417, 35422, 35430, 35435, 35440, 35446, 35452, 35458, + 35463, 35471, 35475, 35478, 35483, 35488, 35492, 35497, 35502, 35506, + 35511, 35515, 35518, 35523, 4096, 21057, 35528, 35533, 35538, 35543, + 35551, 25222, 33952, 10025, 35556, 35561, 35565, 35570, 35574, 35578, + 35583, 35587, 35590, 35593, 35597, 35602, 35606, 35614, 35618, 35621, + 35626, 35630, 35634, 35639, 35644, 35648, 35654, 35659, 35664, 35671, + 35678, 35682, 35685, 35691, 35700, 35707, 35715, 35722, 35726, 35731, + 35735, 35739, 35745, 35750, 35756, 35760, 35766, 35771, 35776, 35780, + 35787, 35793, 35799, 35805, 35811, 35818, 35824, 35830, 35836, 35842, + 35848, 35854, 35860, 35867, 35873, 35880, 35886, 35892, 35898, 35904, + 35910, 35916, 35922, 35928, 35934, 35940, 35945, 35950, 13302, 35955, + 35961, 35966, 35971, 35976, 35981, 35984, 35990, 35995, 36003, 36008, + 36012, 36017, 36023, 36032, 36038, 36043, 36048, 36053, 36057, 36062, + 36066, 36071, 36076, 36081, 36086, 36093, 36100, 36106, 36112, 36117, + 19185, 36124, 36130, 36137, 36143, 36149, 36154, 36162, 36167, 10931, + 36171, 36176, 36181, 36187, 36192, 36197, 36201, 36206, 36211, 36217, + 36222, 36227, 36232, 36236, 36241, 36246, 36250, 36255, 36260, 36264, + 36269, 36273, 36278, 36283, 36288, 36292, 36297, 36301, 36306, 36310, + 36314, 36318, 17890, 36323, 36330, 36339, 36345, 36351, 36360, 36368, + 36377, 36385, 36390, 36394, 36401, 36407, 36415, 36419, 36422, 36427, + 36431, 36440, 36448, 36466, 36472, 1403, 36478, 36481, 36485, 26664, + 26670, 36491, 36495, 36506, 36517, 36528, 36540, 36544, 36551, 36558, + 36565, 36570, 36574, 36582, 36587, 36592, 36597, 36602, 6524, 1076, + 25221, 36607, 36612, 36616, 36621, 36625, 36631, 36636, 36642, 36647, + 36653, 36658, 36664, 36669, 36675, 36681, 36687, 36692, 36648, 36654, + 36696, 36701, 36707, 36712, 36718, 36723, 36729, 36734, 36659, 12014, + 36738, 36670, 36676, 36682, 2959, 3659, 36744, 36747, 36752, 36758, + 36764, 36770, 36777, 36783, 36789, 36795, 36801, 36807, 36813, 36819, + 36825, 36831, 36837, 36843, 36849, 36856, 36862, 36868, 36874, 36880, + 36886, 36889, 36894, 36897, 36904, 36909, 36917, 36921, 36926, 36931, + 36937, 36942, 36947, 36951, 36956, 36962, 36967, 36973, 36978, 36984, + 36989, 36995, 37001, 37005, 37010, 37015, 37020, 37025, 37029, 37034, + 37039, 37044, 37050, 37056, 37062, 37068, 37073, 37077, 37080, 37086, + 37092, 37101, 37109, 37116, 37121, 37125, 37129, 37134, 17680, 37139, + 37147, 37153, 4042, 1261, 37158, 37162, 8775, 37168, 37174, 37181, 8784, + 37185, 37191, 37197, 37204, 37210, 37219, 37227, 37239, 37243, 37250, + 37256, 37261, 37265, 37269, 37272, 37282, 37291, 37299, 36649, 37304, + 37314, 37324, 37334, 37340, 37345, 37355, 37360, 37373, 37387, 37398, + 37410, 37422, 37436, 37449, 37461, 37473, 17031, 37487, 37492, 37497, + 37501, 37505, 37509, 37513, 37519, 37524, 37529, 37534, 37539, 37544, + 37549, 1726, 32112, 37554, 37559, 37564, 36697, 37569, 37572, 37577, + 37582, 37587, 37593, 37599, 18802, 11589, 37604, 37610, 37617, 18430, + 37623, 37628, 37633, 37637, 37642, 37647, 36702, 37652, 37657, 37662, + 37668, 36708, 37673, 37676, 37683, 37691, 37697, 37703, 37709, 37720, + 37725, 37732, 37739, 37746, 37754, 37763, 37772, 37778, 37784, 37792, + 36713, 37797, 37803, 37809, 36719, 37814, 37819, 37827, 37835, 37841, + 37848, 37854, 37861, 37868, 37874, 37882, 37892, 37899, 37905, 37910, + 37916, 37921, 37926, 37933, 37942, 37950, 37955, 37961, 37968, 37976, + 37982, 37987, 37993, 38002, 38009, 33067, 38015, 38019, 38024, 38033, + 38038, 38043, 38048, 14511, 38056, 38061, 38066, 38071, 38075, 38080, + 38085, 38092, 38097, 38102, 38107, 36724, 25150, 38113, 2560, 155, 38116, + 38119, 38123, 38127, 38137, 38145, 38152, 38156, 38160, 38163, 38171, + 38178, 38185, 31012, 38194, 38197, 38204, 38210, 38217, 38221, 38229, + 38237, 38244, 38248, 38252, 38255, 38261, 38268, 38272, 38276, 38283, + 38291, 38299, 38306, 36660, 38313, 38321, 38326, 38338, 11670, 11677, + 11684, 11691, 11698, 11705, 589, 416, 38344, 38349, 38354, 38360, 38365, + 38370, 4063, 38375, 38378, 38383, 38388, 38393, 38398, 38403, 38410, + 26782, 38415, 38420, 38425, 38430, 38435, 38441, 38446, 38452, 36900, + 38458, 38463, 38469, 38475, 38485, 38490, 38495, 38499, 38504, 38509, + 38514, 38519, 38532, 38537, 26402, 19648, 1026, 38541, 38547, 38551, + 38556, 38561, 38567, 38572, 38577, 38581, 38586, 38591, 38597, 38602, + 38607, 1266, 38611, 38616, 38621, 38626, 38630, 38635, 38640, 38645, + 38651, 38657, 38662, 38666, 38670, 38675, 38680, 38685, 38689, 38694, + 38702, 38706, 38712, 38716, 38723, 38732, 19419, 36671, 38738, 38745, + 38753, 38760, 38766, 38779, 38791, 38796, 38802, 38806, 2886, 38810, + 38814, 38263, 38823, 38834, 38845, 38850, 33130, 38855, 38860, 38864, + 33250, 26675, 38869, 38873, 38878, 36677, 25257, 38882, 38887, 38893, + 38898, 38902, 38906, 38909, 38913, 38919, 38928, 38939, 38951, 36683, + 38956, 38959, 38963, 38967, 38972, 38977, 38982, 38987, 38992, 38997, + 39002, 39007, 359, 39012, 39017, 39022, 39027, 39032, 39037, 39043, + 39048, 39053, 39059, 39064, 39070, 39075, 39081, 39086, 39091, 39096, + 39101, 39106, 39111, 39116, 39121, 39127, 39132, 39137, 39142, 39147, + 39152, 39157, 39162, 39168, 39174, 39179, 39184, 39189, 39194, 39199, + 39204, 39209, 39214, 39219, 39224, 39229, 39234, 39239, 39244, 39249, + 39254, 39259, 39264, 39274, 39284, 39290, 343, 14, 39295, 39299, 39303, + 39311, 39315, 39319, 39322, 16460, 39325, 39330, 39334, 39339, 39343, + 39348, 39352, 39357, 39361, 39364, 39366, 39370, 39375, 39379, 39390, + 39393, 39395, 39399, 39411, 39423, 39432, 39436, 39446, 39450, 39456, + 39461, 39470, 39476, 39481, 39486, 39490, 39494, 39499, 39506, 39511, + 39517, 39522, 39526, 39533, 30418, 30428, 39537, 39542, 39547, 39552, + 39559, 39563, 39570, 39576, 8930, 39580, 39589, 39597, 39612, 39626, + 39635, 39643, 39654, 39663, 39668, 39675, 39685, 7937, 39695, 39700, + 39705, 39709, 39712, 39717, 39721, 39726, 39730, 39737, 39742, 39747, + 39752, 39762, 39767, 39772, 39777, 9895, 39782, 39784, 39792, 39795, + 39798, 39800, 39804, 39810, 39814, 39819, 39824, 39842, 39856, 39875, + 39892, 39901, 39909, 39914, 39919, 1396, 39925, 39931, 39936, 39946, + 39955, 39963, 39968, 39974, 39979, 39988, 39997, 40008, 40013, 40020, + 40026, 40030, 40039, 40046, 40054, 40061, 40074, 40082, 40086, 40096, + 40101, 40105, 40113, 40121, 40126, 40130, 40134, 40143, 40149, 40154, + 40162, 40172, 40181, 40190, 40199, 40210, 40218, 40229, 40238, 40246, + 40253, 40259, 40264, 40275, 40286, 40291, 40295, 40298, 40302, 40310, + 40316, 40327, 40338, 40349, 40360, 40371, 40382, 40393, 40404, 40416, + 40428, 40440, 40452, 40464, 40476, 40488, 40497, 40501, 40509, 40515, + 40521, 40528, 40534, 40539, 40545, 40549, 40554, 40559, 40564, 39269, + 39279, 2431, 40569, 40571, 40576, 40581, 40586, 40589, 40591, 40595, + 40598, 40605, 40609, 11249, 40613, 40619, 40626, 40636, 40641, 40647, + 40651, 40656, 40669, 30892, 40675, 40684, 40693, 21280, 40700, 40709, + 37320, 40717, 40722, 40726, 40735, 40743, 40750, 40755, 40759, 40764, + 40769, 40777, 40781, 40789, 40795, 40801, 40806, 40811, 40815, 40818, + 40823, 40836, 40852, 27272, 40869, 40881, 40898, 40910, 40924, 27289, + 27308, 40936, 40948, 2760, 40962, 40967, 40972, 40977, 40981, 40988, + 41000, 41007, 41016, 41019, 41030, 41041, 41049, 41054, 41058, 41063, + 41068, 41073, 41078, 41083, 41088, 37789, 956, 41093, 41097, 41101, + 41104, 41109, 41114, 41120, 41125, 41130, 41136, 41142, 41147, 41151, + 41156, 41161, 41166, 41170, 41173, 41179, 41184, 41189, 41194, 41198, + 41203, 41209, 41217, 31193, 41222, 41227, 41234, 41240, 41246, 41251, + 41259, 26791, 41266, 41271, 41276, 41281, 41285, 41288, 41293, 41297, + 41301, 41308, 41314, 41320, 41326, 41333, 41338, 41344, 40116, 41348, + 41352, 41357, 41370, 41375, 41381, 41389, 41396, 41404, 41414, 41420, + 41426, 41432, 41436, 41445, 41453, 41460, 41465, 41470, 12037, 41475, + 41485, 41492, 41498, 41508, 41513, 41519, 41527, 3916, 41534, 41541, + 41547, 41554, 3922, 41558, 41563, 41574, 41581, 41587, 41596, 41600, + 4494, 41603, 41610, 41616, 41622, 41630, 41640, 34423, 41647, 41655, + 41661, 41666, 41672, 41677, 41681, 30736, 41687, 41694, 41700, 41708, + 41717, 41724, 41730, 41741, 28091, 41747, 41757, 41762, 41766, 41774, + 41782, 41789, 41795, 41800, 10889, 6499, 41805, 41809, 41811, 41815, + 41820, 41822, 41827, 41833, 41838, 41843, 41850, 38406, 41856, 41861, + 41865, 41870, 41874, 41883, 41887, 41893, 41900, 41906, 41913, 41918, + 41927, 41932, 41936, 41941, 41948, 41956, 41964, 41969, 25313, 41973, + 41976, 41980, 41984, 12460, 983, 41988, 41993, 42001, 42006, 42010, + 42019, 42026, 42030, 42034, 42042, 42049, 15793, 42059, 42063, 42067, + 42075, 42083, 42089, 42094, 42098, 42107, 15541, 42113, 42122, 42129, + 42134, 42141, 42148, 42156, 42163, 42171, 42179, 42188, 42193, 42200, + 42207, 42214, 42221, 42228, 42233, 42240, 42246, 42263, 42271, 42281, + 42289, 42296, 459, 42300, 42306, 42310, 42315, 39659, 42321, 42324, + 42328, 42334, 42345, 42353, 3927, 42361, 42367, 42373, 42383, 42389, + 42398, 42407, 42417, 42424, 42430, 42435, 3933, 3939, 42444, 42452, + 42459, 13907, 42467, 42471, 42478, 42486, 42493, 42500, 42506, 42515, + 42525, 42531, 42539, 42548, 42555, 42563, 42570, 26077, 42574, 42581, + 42587, 42597, 42606, 42614, 42625, 42629, 42639, 42646, 42651, 42656, + 42662, 42669, 42677, 42686, 42695, 42705, 42716, 42723, 42728, 42735, + 3174, 42743, 42749, 42754, 42761, 42767, 42773, 42778, 42791, 42804, + 42817, 42824, 42830, 42838, 42846, 42851, 42855, 42859, 42864, 42869, + 42874, 42879, 42884, 42889, 1365, 42894, 42898, 42902, 42906, 42910, + 42914, 42918, 42922, 42926, 42930, 42934, 42938, 42942, 42946, 42950, + 42954, 42958, 42962, 42966, 42970, 42974, 42978, 42982, 42986, 42990, + 42994, 42998, 43002, 43006, 43010, 43014, 43018, 43022, 43026, 43030, + 43034, 43038, 43042, 43046, 43050, 43054, 43058, 43062, 43066, 43070, + 43074, 43078, 43082, 43086, 43090, 43094, 43098, 43102, 43106, 43110, + 43114, 43118, 43122, 43126, 43130, 43134, 43138, 43142, 43146, 43150, + 43154, 43158, 43162, 43166, 43170, 43174, 43178, 43182, 43186, 43190, + 43194, 43198, 43202, 43206, 43210, 43214, 43218, 43222, 43226, 43230, + 43234, 43238, 43242, 43246, 43250, 43254, 43258, 43262, 43266, 43270, + 43274, 43278, 43282, 43286, 43290, 43294, 43298, 43302, 43306, 43310, + 43314, 43318, 43322, 43326, 43330, 43334, 43338, 43342, 43346, 43350, + 43354, 43358, 43362, 43366, 43370, 43374, 43378, 43382, 43386, 43390, + 43394, 43398, 43402, 43406, 43410, 43414, 43418, 43422, 43426, 43430, + 43434, 43438, 43442, 43446, 43450, 43454, 43458, 43462, 43466, 43470, + 43474, 43478, 43482, 43486, 43490, 43494, 43498, 43502, 43506, 43511, + 43515, 43520, 43524, 43529, 43533, 43538, 43542, 43548, 43553, 43557, + 43562, 43566, 43571, 43575, 43580, 43584, 43589, 43593, 43598, 43602, + 43607, 43611, 43617, 43623, 43628, 43632, 43637, 43641, 43647, 43652, + 43656, 43661, 43665, 43670, 43674, 43680, 43685, 43689, 43694, 43698, + 43703, 43707, 43712, 43716, 43722, 43727, 43731, 43736, 43740, 43746, + 43751, 43755, 43760, 43764, 43769, 43773, 43778, 43782, 43787, 43791, + 43797, 43802, 43806, 43812, 43817, 43821, 43827, 43832, 43836, 43841, + 43845, 43850, 43854, 43860, 43866, 43872, 43878, 43884, 43890, 43896, + 43902, 43907, 43911, 43916, 43920, 43926, 43931, 43935, 43940, 43944, + 43949, 43953, 43958, 43962, 43967, 43971, 43976, 43980, 43985, 43989, + 43995, 44000, 44004, 44009, 44013, 44019, 44025, 44030, 127, 63, 44034, + 44036, 44040, 44044, 44048, 44053, 44057, 44061, 44066, 10802, 44071, + 44077, 1671, 6956, 44083, 44086, 44091, 44095, 44100, 44104, 44108, + 44113, 11821, 44117, 44121, 44125, 593, 44129, 17999, 44134, 44138, + 44143, 44148, 44153, 44157, 44164, 44170, 30924, 44176, 44179, 44183, + 44188, 44194, 44198, 44201, 44209, 44215, 44220, 44224, 44227, 44231, + 44237, 44241, 44245, 3710, 3715, 14623, 44248, 44252, 44256, 44260, + 44264, 44272, 44279, 44283, 15491, 44290, 44304, 44311, 44322, 378, + 44327, 44331, 44337, 44349, 44355, 44361, 44366, 44372, 44376, 34696, + 44385, 44391, 44400, 44404, 44408, 44413, 44419, 44424, 44428, 44433, + 44437, 44441, 44448, 44454, 44459, 44470, 44485, 44500, 44515, 44531, + 44549, 11735, 44563, 44570, 44574, 44577, 44586, 44591, 44595, 44603, + 18633, 44611, 44615, 44625, 44636, 34621, 999, 44649, 44658, 44676, + 44695, 44704, 44712, 44720, 11084, 11934, 44724, 26687, 44727, 35610, + 44732, 11083, 44737, 44743, 44748, 44754, 44759, 44765, 44770, 44776, + 44781, 44787, 44793, 44799, 44804, 44760, 44766, 44808, 44771, 44777, + 44782, 44813, 44788, 44794, 8943, 4319, 44819, 44827, 44831, 44834, + 44841, 44845, 44850, 44855, 44862, 44868, 44874, 44879, 17312, 44883, + 30753, 44887, 44891, 44895, 44901, 44905, 33001, 44914, 10058, 44918, + 10484, 44921, 44928, 44934, 44938, 13932, 44945, 44951, 44956, 44963, + 44970, 44977, 33770, 8840, 44984, 44991, 44998, 45004, 45009, 45016, + 45027, 45033, 45038, 45043, 45048, 45052, 45057, 45064, 44761, 45068, + 45078, 45087, 45098, 45104, 45112, 45119, 45124, 45129, 45134, 45139, + 45144, 45148, 45152, 45159, 45165, 45173, 2321, 29847, 11837, 11849, + 11854, 11860, 45182, 11865, 11870, 11876, 45187, 45197, 45201, 11881, + 45206, 19846, 45209, 45214, 45218, 41011, 45229, 45234, 45241, 45248, + 45252, 45255, 45263, 11748, 45270, 45273, 45279, 45289, 6557, 45298, + 45303, 45309, 45313, 45321, 45325, 45335, 45341, 45346, 45357, 45366, + 45375, 45384, 45393, 45402, 45411, 45420, 45426, 45432, 45437, 45443, + 45449, 45455, 45460, 45463, 45470, 45476, 45480, 45485, 45492, 45499, + 45503, 45506, 45516, 45529, 45538, 45547, 45558, 45571, 45583, 45594, + 45603, 45614, 45619, 45628, 45633, 11886, 45639, 45646, 45654, 45661, + 45666, 45671, 30970, 45675, 45682, 4259, 25, 45686, 45691, 19695, 45695, + 45698, 45701, 33187, 45705, 33779, 45713, 45717, 45721, 45724, 45730, + 45736, 45741, 36748, 45750, 45758, 45764, 45771, 33170, 45775, 33401, + 45779, 45788, 45792, 45800, 45806, 45812, 45817, 45821, 33805, 45827, + 45830, 45838, 45846, 4646, 45852, 45856, 45860, 45865, 45872, 45878, + 45883, 45888, 45892, 45898, 45903, 45909, 4547, 788, 45916, 45920, 45923, + 45935, 45942, 45947, 17872, 45951, 45959, 45967, 45975, 45983, 45990, + 45998, 46006, 46013, 46021, 46029, 46037, 46045, 46053, 46061, 46069, + 46077, 46085, 46093, 46101, 46108, 46116, 46124, 46132, 46140, 46148, + 46156, 46164, 46172, 46180, 46188, 46196, 46204, 46212, 46220, 46228, + 46236, 46244, 46252, 46260, 46267, 46275, 46282, 46290, 46298, 46306, + 46314, 46322, 46330, 46338, 46346, 46357, 26113, 46362, 46365, 46372, + 46376, 46382, 46386, 46392, 46397, 46403, 46408, 46413, 46417, 46421, + 46428, 46436, 46441, 46446, 46456, 46462, 46475, 46481, 46487, 46493, + 46496, 46503, 46508, 46514, 46519, 19591, 930, 46524, 46527, 46530, + 46533, 36832, 36838, 46536, 36844, 36857, 36863, 36869, 46542, 36875, + 36881, 46548, 46554, 10, 46562, 46569, 46573, 46577, 46585, 37678, 46589, + 46593, 46600, 46605, 46609, 46614, 46620, 46625, 46631, 46636, 46640, + 46644, 46648, 46653, 46657, 46662, 46666, 46670, 46677, 46682, 46686, + 46690, 46695, 46699, 46704, 46708, 46712, 46717, 46723, 18156, 18161, + 46728, 46732, 46735, 46741, 46745, 46749, 25107, 46754, 46758, 46764, + 46771, 46777, 46782, 39688, 46792, 46797, 46805, 46809, 46812, 37693, + 46816, 4612, 46821, 46826, 46830, 46835, 46839, 46844, 15559, 46855, + 46859, 46862, 46866, 46871, 46875, 46880, 46885, 46889, 46893, 46897, + 46900, 46904, 46907, 46912, 46917, 46922, 46927, 46932, 46937, 8430, + 15575, 46942, 46945, 46951, 46956, 46962, 46967, 46973, 46978, 46984, + 46989, 46995, 47001, 47007, 47012, 47016, 47020, 47027, 47036, 47052, + 47068, 47078, 33077, 47085, 47089, 47094, 47099, 47103, 47107, 42690, + 47113, 47118, 47122, 47129, 47134, 47139, 47143, 47146, 47150, 47156, + 31915, 47160, 25427, 47165, 47172, 47180, 47186, 47193, 47201, 47207, + 47211, 47216, 47222, 47230, 47235, 47239, 47248, 10783, 47256, 47260, + 47268, 47275, 47280, 47285, 47290, 47294, 47297, 47303, 47307, 47310, + 47314, 47321, 47326, 47330, 47336, 47340, 47346, 47351, 47356, 31293, + 36895, 47361, 47370, 47378, 47383, 47389, 47401, 47414, 47428, 47435, + 47441, 47447, 47452, 47460, 47463, 47465, 47472, 47479, 47485, 47489, + 8429, 47492, 47496, 47500, 47505, 47509, 47513, 47516, 47520, 47534, + 27338, 47553, 47566, 47579, 47592, 27356, 47607, 2713, 47622, 47628, + 47632, 47642, 47646, 47650, 47655, 47659, 47666, 47671, 47675, 47682, + 47688, 47693, 47699, 47709, 47721, 47732, 47737, 47744, 47748, 47752, + 47755, 47763, 18654, 4031, 47768, 18189, 47781, 47788, 47795, 47801, + 47805, 47809, 47814, 47820, 47825, 47831, 47835, 47839, 47842, 47847, + 47851, 47856, 47861, 47866, 47871, 47876, 47881, 47886, 47891, 47896, + 8484, 18200, 47901, 47905, 47911, 47920, 47925, 47934, 47941, 42521, + 47947, 47952, 47956, 47963, 47968, 47975, 47981, 47985, 47988, 47992, + 47997, 2791, 48004, 48011, 48015, 48018, 48023, 48028, 48034, 48039, + 48044, 48048, 48053, 48063, 48068, 48074, 48079, 45937, 48085, 48091, + 48101, 48106, 48111, 48115, 48120, 48125, 7939, 7951, 48130, 48133, + 48140, 48146, 48155, 9975, 40256, 48163, 48167, 48171, 37741, 48179, + 48190, 48198, 42738, 48205, 48210, 48215, 48226, 48233, 48244, 37765, + 25444, 48252, 1054, 48257, 15982, 48263, 33161, 48269, 48274, 48284, + 48293, 48300, 48306, 48310, 48313, 48320, 48326, 48333, 48339, 48349, + 48357, 48363, 48369, 48374, 48378, 48385, 48390, 48396, 48403, 48409, + 47501, 48414, 48418, 16024, 16033, 16042, 16051, 16060, 16089, 646, + 16098, 48424, 48429, 48432, 48438, 48446, 1283, 48451, 48455, 48460, + 48465, 48470, 48477, 48483, 48487, 48492, 48498, 48502, 36905, 48507, + 48512, 48521, 48528, 48538, 48544, 33205, 48561, 48570, 48578, 48584, + 48589, 48596, 48602, 48610, 48619, 48627, 48635, 48641, 48645, 48650, + 48658, 34302, 37774, 48664, 48683, 18557, 48697, 48713, 48727, 48733, + 48738, 48743, 48748, 48754, 37780, 48759, 48762, 48769, 48776, 48785, + 48790, 48794, 442, 3081, 48801, 48806, 48811, 32290, 48599, 48815, 48820, + 48828, 48832, 48835, 48840, 48846, 48852, 48857, 48861, 33278, 48864, + 48869, 48873, 48876, 48881, 48885, 48890, 48895, 48899, 48904, 48908, + 48912, 48916, 25103, 25114, 48921, 48926, 48932, 48937, 48943, 48949, + 31871, 48954, 48958, 48961, 48967, 48972, 48977, 48982, 48987, 48992, + 48997, 49002, 49007, 49013, 49019, 25200, 18864, 49024, 49029, 49034, + 49039, 49044, 49049, 49054, 49059, 450, 68, 36922, 36927, 36932, 36938, + 36943, 36948, 49064, 36952, 49068, 49072, 49076, 36957, 36963, 49090, + 36974, 36979, 49098, 49103, 36985, 49108, 49113, 49122, 49127, 49132, + 49141, 49147, 49153, 49159, 37002, 49172, 49181, 49187, 37006, 49191, + 37011, 49196, 37016, 37021, 49199, 49204, 49208, 49214, 15800, 49221, + 15810, 49228, 49233, 37026, 49237, 49242, 49247, 49252, 49257, 49261, + 49266, 49271, 49277, 49282, 49287, 49293, 49299, 49304, 49308, 49313, + 49318, 49323, 49327, 49332, 49337, 49342, 49348, 49354, 49360, 49365, + 49369, 49374, 49378, 37030, 37035, 37040, 49382, 49386, 49391, 49395, + 49407, 37045, 37051, 37057, 37069, 49413, 30790, 49417, 49422, 49426, + 49431, 49438, 49443, 49448, 49453, 49457, 49461, 49471, 49476, 49481, + 49485, 49489, 49492, 49500, 49505, 37117, 49509, 1375, 49515, 49520, + 49526, 49534, 49538, 49547, 49555, 49559, 49563, 49571, 49577, 49585, + 49601, 49605, 49609, 49613, 49618, 49624, 49639, 37154, 1679, 14140, + 49643, 1262, 1277, 49655, 49663, 49670, 49675, 49682, 49687, 10467, 977, + 2546, 11913, 49694, 10365, 49699, 49702, 49711, 1170, 49716, 47672, + 49723, 49732, 49737, 49741, 49749, 26737, 2602, 49756, 12413, 49766, + 49772, 2339, 2349, 49781, 49790, 49800, 49811, 3489, 40637, 49816, 4226, + 4237, 19629, 1175, 49820, 49828, 49835, 49840, 49844, 49848, 49853, + 28359, 47999, 12004, 49861, 49870, 49879, 49887, 49900, 49907, 49918, + 49923, 49936, 49949, 49961, 49973, 49985, 49996, 50009, 50020, 50031, + 50041, 50049, 50057, 50069, 50081, 50092, 50101, 50109, 50116, 50128, + 50135, 50141, 50150, 50156, 50163, 50176, 50181, 50191, 50196, 50202, + 50207, 44935, 50211, 47299, 50218, 50225, 50233, 50240, 2559, 50247, + 50258, 50268, 50277, 50285, 50295, 50303, 50312, 50322, 50331, 50336, + 50342, 50348, 4075, 50359, 50369, 50378, 50387, 50395, 50405, 50413, + 50422, 50427, 50432, 50437, 1604, 47, 50445, 50453, 50464, 50475, 19250, + 50485, 50489, 50496, 50502, 50507, 50511, 50522, 50532, 50541, 50552, + 19668, 19673, 50557, 50566, 50571, 50581, 50586, 50594, 50602, 50609, + 50615, 1566, 271, 50619, 50625, 50630, 50633, 2087, 2568, 50641, 50645, + 50648, 1420, 50654, 16289, 1180, 50659, 50672, 2702, 2723, 50686, 50698, + 50710, 2737, 2754, 2769, 2785, 2802, 50724, 50736, 2817, 50750, 1186, + 1192, 1198, 12284, 50755, 50760, 50765, 50769, 50784, 50799, 50814, + 50829, 50844, 50859, 50874, 50889, 50904, 50919, 50934, 50949, 50964, + 50979, 50994, 51009, 51024, 51039, 51054, 51069, 51084, 51099, 51114, + 51129, 51144, 51159, 51174, 51189, 51204, 51219, 51234, 51249, 51264, + 51279, 51294, 51309, 51324, 51339, 51354, 51369, 51384, 51399, 51414, + 51429, 51444, 51459, 51474, 51489, 51504, 51519, 51534, 51549, 51564, + 51579, 51594, 51609, 51624, 51639, 51654, 51669, 51684, 51699, 51714, + 51729, 51744, 51759, 51774, 51789, 51804, 51819, 51834, 51849, 51864, + 51879, 51894, 51909, 51924, 51939, 51954, 51969, 51984, 51999, 52014, + 52029, 52044, 52059, 52074, 52089, 52104, 52119, 52134, 52149, 52164, + 52179, 52194, 52209, 52224, 52239, 52254, 52269, 52284, 52299, 52314, + 52329, 52344, 52359, 52374, 52389, 52404, 52419, 52434, 52449, 52464, + 52479, 52494, 52509, 52524, 52539, 52554, 52569, 52584, 52599, 52614, + 52629, 52644, 52659, 52674, 52689, 52704, 52719, 52734, 52749, 52764, + 52779, 52794, 52809, 52824, 52839, 52854, 52869, 52884, 52899, 52914, + 52929, 52944, 52959, 52974, 52989, 53004, 53019, 53034, 53049, 53064, + 53079, 53094, 53109, 53124, 53139, 53154, 53169, 53184, 53199, 53214, + 53229, 53244, 53259, 53274, 53289, 53304, 53319, 53334, 53349, 53364, + 53379, 53394, 53409, 53424, 53439, 53454, 53469, 53484, 53499, 53514, + 53529, 53544, 53559, 53574, 53589, 53604, 53619, 53634, 53649, 53664, + 53679, 53694, 53709, 53724, 53739, 53754, 53769, 53784, 53799, 53814, + 53829, 53844, 53859, 53874, 53889, 53904, 53919, 53934, 53949, 53964, + 53979, 53994, 54009, 54024, 54039, 54054, 54069, 54084, 54099, 54114, + 54129, 54144, 54159, 54174, 54189, 54204, 54219, 54234, 54249, 54264, + 54279, 54294, 54309, 54324, 54339, 54354, 54369, 54384, 54399, 54414, + 54429, 54444, 54459, 54474, 54489, 54504, 54519, 54534, 54549, 54564, + 54579, 54594, 54609, 54624, 54639, 54654, 54669, 54684, 54699, 54714, + 54729, 54744, 54759, 54774, 54789, 54804, 54819, 54834, 54849, 54864, + 54879, 54894, 54909, 54924, 54939, 54954, 54969, 54984, 54999, 55014, + 55029, 55044, 55059, 55074, 55089, 55104, 55119, 55134, 55149, 55164, + 55179, 55194, 55209, 55224, 55239, 55254, 55269, 55284, 55299, 55314, + 55329, 55344, 55359, 55374, 55389, 55404, 55419, 55434, 55449, 55464, + 55479, 55494, 55509, 55524, 55539, 55554, 55569, 55584, 55599, 55614, + 55629, 55644, 55659, 55674, 55689, 55704, 55719, 55734, 55749, 55764, + 55779, 55794, 55809, 55824, 55839, 55854, 55869, 55884, 55899, 55914, + 55929, 55944, 55959, 55974, 55989, 56004, 56019, 56034, 56049, 56064, + 56079, 56094, 56109, 56124, 56139, 56154, 56169, 56184, 56199, 56214, + 56229, 56244, 56259, 56274, 56289, 56304, 56319, 56334, 56349, 56364, + 56379, 56394, 56409, 56424, 56439, 56454, 56469, 56484, 56499, 56514, + 56529, 56544, 56559, 56574, 56589, 56604, 56619, 56634, 56649, 56664, + 56679, 56694, 56709, 56724, 56739, 56754, 56769, 56784, 56799, 56814, + 56829, 56844, 56859, 56874, 56889, 56904, 56919, 56934, 56949, 56964, + 56979, 56994, 57009, 57024, 57039, 57054, 57069, 57084, 57099, 57114, + 57129, 57144, 57159, 57174, 57189, 57204, 57219, 57234, 57249, 57264, + 57279, 57294, 57309, 57324, 57339, 57354, 57369, 57384, 57399, 57414, + 57429, 57444, 57459, 57474, 57489, 57504, 57519, 57534, 57549, 57564, + 57579, 57594, 57609, 57624, 57639, 57654, 57669, 57684, 57699, 57714, + 57729, 57744, 57759, 57774, 57789, 57804, 57819, 57834, 57849, 57864, + 57879, 57894, 57909, 57924, 57939, 57954, 57969, 57984, 57999, 58014, + 58029, 58044, 58059, 58074, 58089, 58104, 58119, 58134, 58149, 58164, + 58179, 58194, 58209, 58224, 58239, 58254, 58269, 58284, 58299, 58314, + 58329, 58344, 58359, 58374, 58389, 58404, 58419, 58434, 58449, 58464, + 58479, 58494, 58509, 58524, 58539, 58554, 58569, 58584, 58600, 58616, + 58632, 58648, 58664, 58680, 58696, 58712, 58728, 58744, 58760, 58776, + 58792, 58808, 58824, 58840, 58856, 58872, 58888, 58904, 58920, 58936, + 58952, 58968, 58984, 59000, 59016, 59032, 59048, 59064, 59080, 59096, + 59112, 59128, 59144, 59160, 59176, 59192, 59208, 59224, 59240, 59256, + 59272, 59288, 59304, 59320, 59336, 59352, 59368, 59384, 59400, 59416, + 59432, 59448, 59464, 59480, 59496, 59512, 59528, 59544, 59560, 59576, + 59592, 59608, 59624, 59640, 59656, 59672, 59688, 59704, 59720, 59736, + 59752, 59768, 59784, 59800, 59816, 59832, 59848, 59864, 59880, 59896, + 59912, 59928, 59944, 59960, 59976, 59992, 60008, 60024, 60040, 60056, + 60072, 60088, 60104, 60120, 60136, 60152, 60168, 60184, 60200, 60216, + 60232, 60248, 60264, 60280, 60296, 60312, 60328, 60344, 60360, 60376, + 60392, 60408, 60424, 60440, 60456, 60472, 60488, 60504, 60520, 60536, + 60552, 60568, 60584, 60600, 60616, 60632, 60648, 60664, 60680, 60696, + 60712, 60728, 60744, 60760, 60776, 60792, 60808, 60824, 60840, 60856, + 60872, 60888, 60904, 60920, 60936, 60952, 60968, 60984, 61000, 61016, + 61032, 61048, 61064, 61080, 61096, 61112, 61128, 61144, 61160, 61176, + 61192, 61208, 61224, 61240, 61256, 61272, 61288, 61304, 61320, 61336, + 61352, 61368, 61384, 61400, 61416, 61432, 61448, 61464, 61480, 61496, + 61512, 61528, 61544, 61560, 61576, 61592, 61608, 61624, 61640, 61656, + 61672, 61688, 61704, 61720, 61736, 61752, 61768, 61784, 61800, 61816, + 61832, 61848, 61864, 61880, 61896, 61912, 61928, 61944, 61960, 61976, + 61992, 62008, 62024, 62040, 62056, 62072, 62088, 62104, 62120, 62136, + 62152, 62168, 62184, 62200, 62216, 62232, 62248, 62264, 62280, 62296, + 62312, 62328, 62344, 62360, 62376, 62392, 62408, 62424, 62440, 62456, + 62472, 62488, 62504, 62520, 62536, 62552, 62568, 62584, 62600, 62616, + 62632, 62648, 62664, 62680, 62696, 62712, 62728, 62744, 62760, 62776, + 62792, 62808, 62824, 62840, 62856, 62872, 62888, 62904, 62920, 62936, + 62952, 62968, 62984, 63000, 63016, 63032, 63048, 63064, 63080, 63096, + 63112, 63128, 63144, 63160, 63176, 63192, 63208, 63224, 63240, 63256, + 63272, 63288, 63304, 63320, 63336, 63352, 63368, 63384, 63400, 63416, + 63432, 63448, 63464, 63480, 63496, 63512, 63528, 63544, 63560, 63576, + 63592, 63608, 63624, 63640, 63656, 63672, 63688, 63704, 63720, 63736, + 63752, 63768, 63784, 63800, 63816, 63832, 63848, 63864, 63880, 63896, + 63912, 63928, 63944, 63960, 63976, 63992, 64008, 64024, 64040, 64056, + 64072, 64088, 64104, 64120, 64136, 64152, 64168, 64184, 64200, 64216, + 64232, 64248, 64264, 64280, 64296, 64312, 64328, 64344, 64360, 64376, + 64392, 64408, 64424, 64440, 64456, 64472, 64488, 64504, 64520, 64536, + 64552, 64568, 64584, 64600, 64616, 64632, 64648, 64664, 64680, 64696, + 64712, 64728, 64744, 64760, 64776, 64792, 64808, 64824, 64840, 64856, + 64872, 64888, 64904, 64920, 64936, 64952, 64968, 64984, 65000, 65016, + 65032, 65048, 65064, 65080, 65096, 65112, 65128, 65144, 65160, 65176, + 65192, 65208, 65224, 65240, 65256, 65272, 65288, 65304, 65320, 65336, + 65352, 65368, 65384, 65400, 65416, 65432, 65448, 65464, 65480, 65496, + 65512, 65528, 65544, 65560, 65576, 65592, 65608, 65624, 65640, 65656, + 65672, 65688, 65704, 65720, 65736, 65752, 65768, 65784, 65800, 65816, + 65832, 65848, 65864, 65880, 65896, 65912, 65928, 65944, 65960, 65976, + 65992, 66008, 66024, 66040, 66056, 66072, 66088, 66104, 66120, 66136, + 66152, 66168, 66184, 66200, 66216, 66232, 66248, 66264, 66280, 66296, + 66312, 66328, 66344, 66360, 66376, 66392, 66408, 66424, 66440, 66456, + 66472, 66488, 66504, 66520, 66536, 66552, 66568, 66584, 66600, 66616, + 66632, 66648, 66664, 66680, 66696, 66712, 66728, 66744, 66760, 66776, + 66792, 66808, 66824, 66840, 66856, 66872, 66888, 66904, 66920, 66936, + 66952, 66968, 66984, 67000, 67016, 67032, 67048, 67064, 67080, 67096, + 67112, 67128, 67144, 67160, 67176, 67192, 67208, 67224, 67240, 67256, + 67265, 67280, 17155, 67289, 67294, 67300, 67306, 67316, 67324, 17408, + 18090, 11318, 67337, 1428, 1432, 67345, 4155, 32408, 7876, 67351, 67356, + 67361, 67366, 67371, 67377, 67382, 67388, 67393, 67399, 67404, 67409, + 67414, 67419, 67425, 67430, 67435, 67440, 67445, 67450, 67455, 67460, + 67466, 67471, 67477, 67484, 2606, 67489, 67495, 9359, 67499, 67504, + 67511, 67519, 4166, 4171, 4176, 4181, 65, 67523, 67529, 67534, 67539, + 67543, 67548, 67552, 67556, 12356, 67560, 67570, 67583, 67594, 67607, + 67614, 67620, 67628, 11838, 67635, 67640, 67646, 67652, 67658, 67663, + 67668, 67673, 67678, 67682, 67687, 67692, 67697, 67703, 67709, 67715, + 67720, 67724, 67729, 67734, 67738, 67743, 67748, 67753, 67757, 12372, + 12383, 12388, 1471, 67761, 67767, 1476, 19095, 67772, 19104, 1486, 67777, + 67783, 67788, 1507, 67794, 1513, 1519, 12418, 67799, 67808, 67816, 67824, + 67831, 67835, 67839, 67845, 67850, 36561, 67855, 67862, 67870, 67877, + 67882, 67886, 67890, 67899, 67904, 67909, 67914, 1524, 276, 67919, 67923, + 19230, 995, 67927, 67934, 67939, 67943, 19266, 1528, 45092, 67946, 67951, + 67961, 67970, 67975, 67979, 67985, 1533, 47953, 67990, 67999, 68005, + 68010, 68015, 12657, 12663, 68021, 68033, 68050, 68067, 68084, 68101, + 68118, 68135, 68152, 68169, 68186, 68203, 68220, 68237, 68254, 68271, + 68288, 68305, 68322, 68339, 68356, 68373, 68390, 68407, 68424, 68441, + 68458, 68475, 68492, 68509, 68526, 68543, 68560, 68577, 68594, 68611, + 68628, 68645, 68662, 68679, 68696, 68713, 68730, 68747, 68764, 68781, + 68798, 68815, 68832, 68849, 68866, 68877, 68887, 68892, 1538, 68896, + 68901, 68907, 68912, 68917, 68924, 10384, 1543, 68930, 68939, 32792, + 68944, 68955, 12679, 68965, 68970, 68976, 68981, 68988, 68994, 68999, + 1548, 19560, 69004, 69010, 12689, 69016, 69021, 69026, 69031, 69036, + 69041, 69046, 69051, 1553, 4635, 69056, 69061, 69067, 69072, 69077, + 69082, 69087, 69092, 69097, 69102, 69107, 69113, 69119, 69125, 69130, + 69134, 69139, 69144, 69148, 69153, 69158, 69163, 69168, 69172, 69177, + 69183, 69188, 69193, 69197, 69202, 69207, 69213, 69218, 69223, 69229, + 69235, 69240, 69244, 69249, 69254, 69259, 69263, 69268, 69273, 69278, + 69284, 69290, 69295, 69299, 69303, 69308, 69313, 69318, 34496, 69322, + 69327, 69332, 69338, 69343, 69348, 69352, 69357, 69362, 69368, 69373, + 69378, 69384, 69390, 69395, 69399, 69404, 69409, 69413, 69418, 69423, + 69428, 69434, 69440, 69445, 69449, 69454, 69459, 69463, 69468, 69473, + 69478, 69483, 69487, 69490, 69493, 69498, 69503, 37287, 69510, 69518, + 48553, 69524, 3827, 32735, 69537, 69544, 69550, 69556, 4006, 69561, + 12831, 69567, 69577, 69592, 69600, 12836, 69611, 69616, 69627, 69639, + 69651, 69663, 2808, 69675, 69680, 69692, 69696, 69702, 69708, 69713, + 69722, 69729, 69734, 69739, 69744, 69749, 69754, 69759, 1570, 18729, + 69764, 69769, 48019, 69773, 69777, 69782, 69786, 19708, 69791, 69794, + 69799, 69807, 69815, 1574, 12872, 12878, 1579, 69823, 69830, 69835, + 69844, 69854, 69861, 69866, 69871, 1584, 69878, 69883, 19828, 69887, + 69892, 69899, 69905, 69909, 69922, 69928, 69939, 69949, 69956, 19850, + 10278, 10285, 4240, 4246, 69963, 1589, 69968, 69977, 69983, 69991, 69998, + 70004, 70011, 70023, 70029, 70034, 70041, 70053, 70064, 70074, 70083, + 70093, 70103, 4134, 70111, 36355, 36364, 19890, 70124, 70129, 70134, + 70139, 70144, 70149, 70154, 1594, 1598, 70159, 70163, 70166, 70177, + 70182, 19916, 1608, 70190, 70195, 70200, 19949, 70212, 70215, 70221, + 70227, 70232, 70240, 1613, 70245, 70250, 70258, 70266, 70273, 70282, + 70290, 70299, 70303, 1618, 70312, 1623, 25288, 70317, 70324, 70330, + 20036, 70338, 70348, 70354, 70359, 70367, 70374, 70383, 70391, 70401, + 70410, 70420, 70429, 70440, 70450, 70460, 70469, 70479, 70493, 70506, + 70515, 70523, 70533, 70542, 70554, 70565, 70576, 70586, 19328, 70591, + 13024, 70600, 70606, 70611, 70618, 70625, 70631, 18939, 70641, 70647, + 70652, 70663, 70670, 70677, 70682, 70690, 13041, 13046, 70698, 70704, + 70708, 4224, 4235, 20112, 48107, 70716, 70722, 70727, 70735, 70742, + 14121, 70747, 70753, 70759, 1634, 70764, 70767, 70773, 70778, 70783, + 70788, 70793, 70798, 70803, 70808, 70813, 70819, 70825, 1341, 70830, + 70835, 70840, 70846, 70851, 70856, 70861, 70866, 70871, 70876, 1643, 18, + 70882, 70886, 70891, 70895, 70899, 70903, 37573, 70908, 27557, 70913, + 70918, 70922, 70925, 70929, 70933, 70938, 70942, 70947, 70951, 70954, + 70960, 41105, 41110, 41115, 70963, 70970, 70976, 70984, 47725, 70994, + 41121, 37837, 37588, 37594, 41137, 37600, 70999, 71004, 71008, 37870, + 71015, 71018, 71022, 71030, 71037, 71042, 71045, 71050, 71055, 71059, + 71063, 71066, 71076, 71088, 71095, 71101, 37605, 71108, 39502, 71111, + 9376, 13386, 71114, 71118, 71123, 4049, 71127, 71130, 15843, 71137, + 71144, 71157, 71165, 71174, 71183, 71189, 71194, 71204, 71217, 71229, + 71236, 71241, 71250, 71263, 42785, 71281, 71286, 71293, 71299, 71304, + 872, 71309, 71317, 71324, 71331, 32231, 893, 71337, 71343, 71353, 71361, + 71367, 71372, 37624, 6640, 37638, 71376, 71386, 71391, 71399, 71409, + 71424, 71430, 71436, 37648, 71441, 36703, 71445, 71450, 71457, 71462, + 71466, 71471, 71479, 19893, 71486, 71491, 71495, 6681, 37674, 71499, + 71505, 342, 71515, 71522, 71529, 71535, 71542, 71547, 71556, 15474, + 67955, 67965, 71562, 71570, 71574, 71578, 71582, 71586, 71591, 71595, + 71601, 71609, 71614, 71619, 71626, 71631, 71635, 71640, 71644, 71648, + 71654, 71660, 71665, 71669, 71674, 71678, 37798, 71682, 37804, 37810, + 71687, 71693, 71700, 71705, 71709, 36720, 19547, 71712, 71716, 71721, + 71728, 71734, 71738, 71743, 47316, 71749, 71753, 71760, 71764, 71769, + 71775, 71781, 71787, 71799, 71808, 71818, 71824, 71831, 71836, 71841, + 71845, 71848, 71854, 71861, 71866, 71871, 71878, 71885, 71892, 71898, + 71903, 71908, 71916, 37815, 2436, 71921, 71926, 71932, 71937, 71943, + 71948, 71953, 71958, 71964, 37836, 71969, 71975, 71981, 71987, 37906, + 71992, 71997, 72002, 37917, 72007, 72012, 72017, 72023, 72029, 37922, + 72034, 72039, 72044, 37977, 37983, 72049, 72054, 37988, 38010, 33068, + 38016, 38020, 72059, 13815, 72063, 72071, 72077, 72085, 72092, 72098, + 72108, 72114, 72121, 12256, 38034, 72127, 72140, 72149, 72155, 72164, + 72170, 72176, 72183, 27900, 72191, 72198, 72208, 72216, 72219, 37978, + 72224, 72231, 72236, 72240, 72244, 72249, 72253, 4363, 72258, 72263, + 72268, 41199, 41204, 72272, 41218, 72277, 41223, 72282, 72288, 41235, + 41241, 41247, 72293, 72299, 26792, 72310, 72313, 72325, 72333, 38057, + 72337, 72346, 72356, 72365, 38067, 72370, 72377, 72386, 72392, 72400, + 72407, 72414, 6732, 4975, 72419, 37989, 72425, 72428, 72434, 72441, + 72446, 72451, 27804, 72455, 72461, 72467, 72472, 72477, 72481, 72487, + 72493, 39386, 72498, 42392, 44211, 44217, 38098, 38103, 72502, 72506, + 72510, 72513, 72526, 72532, 72536, 72539, 72544, 39755, 72548, 36725, + 25229, 72554, 6661, 6669, 10084, 72557, 72562, 72567, 72572, 72577, + 72582, 72587, 72592, 72597, 72602, 72608, 72613, 72618, 72624, 72629, + 72634, 72639, 72644, 72649, 72654, 72660, 72665, 72671, 72676, 72681, + 72686, 72691, 72696, 72701, 72706, 72711, 72716, 72721, 72727, 72732, + 72737, 72742, 72747, 72752, 72757, 72763, 72768, 72773, 72778, 72783, + 72788, 72793, 72798, 72803, 72808, 72814, 72819, 72824, 72829, 72834, + 72840, 72846, 72851, 72857, 72862, 72867, 72872, 72877, 72882, 1421, 156, + 72887, 72891, 72895, 72899, 29700, 72903, 72907, 72912, 72916, 72921, + 72925, 72930, 72935, 72940, 72944, 72948, 72953, 72957, 15553, 72962, + 72966, 72973, 72983, 17753, 72992, 73001, 73005, 73010, 73015, 73019, + 73023, 29488, 3164, 73027, 73033, 21125, 73037, 73046, 73054, 73060, + 73065, 73077, 73089, 73094, 73098, 73103, 73107, 73113, 73119, 73124, + 73134, 73144, 73150, 73158, 73163, 73167, 73173, 73178, 73185, 73191, + 73196, 73203, 73212, 73221, 73229, 73233, 18269, 73236, 73245, 73253, + 73265, 73276, 73287, 73296, 73300, 73309, 73317, 73327, 73335, 73342, + 73352, 73358, 73363, 73370, 73379, 73385, 73390, 73397, 73403, 73414, 60, + 36498, 73420, 31110, 31120, 73426, 73434, 73441, 73447, 73451, 73461, + 73472, 73480, 73489, 73494, 73499, 73504, 73508, 73512, 73520, 21072, + 73527, 73531, 73537, 73547, 73554, 73560, 73566, 41298, 73570, 73572, + 73575, 73581, 73585, 73596, 73606, 73612, 73619, 73626, 15490, 73634, + 73640, 73649, 73658, 73664, 11184, 73670, 73676, 73681, 73686, 73693, + 73698, 73705, 73711, 73716, 73724, 73737, 73746, 73755, 70455, 70465, + 73765, 73771, 73780, 73786, 73792, 73799, 73806, 73813, 73820, 73827, + 73832, 73836, 73840, 73843, 73853, 73857, 73869, 9745, 73878, 73889, + 73894, 73898, 70474, 73904, 73911, 73920, 73928, 73936, 73941, 73945, + 73950, 73955, 73965, 73973, 73985, 73990, 73994, 73998, 74004, 74012, + 74019, 74031, 74039, 74050, 74057, 74063, 74073, 74079, 74083, 74092, + 74101, 74108, 74114, 74119, 74123, 74127, 74131, 74140, 74149, 74158, + 74165, 74171, 74177, 74183, 74188, 74195, 74201, 74209, 74216, 74222, + 14585, 74227, 74233, 74237, 16644, 74241, 74246, 74256, 74261, 74270, + 74276, 74282, 74290, 74297, 74301, 74305, 74312, 74318, 74326, 74333, + 74339, 74350, 74354, 74358, 74362, 74365, 74371, 74376, 74381, 74385, + 74389, 74398, 74406, 74413, 74419, 74426, 28537, 47450, 74431, 74439, + 74443, 74447, 74450, 74458, 74465, 74471, 74480, 74488, 74494, 74499, + 74503, 74508, 74513, 74517, 74521, 74525, 74530, 74539, 74543, 74550, + 44315, 74554, 74560, 74568, 74572, 74578, 74586, 74592, 74597, 74608, + 74616, 74622, 74631, 26939, 74639, 74646, 74653, 74660, 74667, 74674, + 50944, 15305, 74681, 74688, 74693, 41334, 4595, 74699, 74704, 74709, + 74715, 74721, 74727, 74732, 74737, 74742, 74747, 74753, 74758, 74764, + 74769, 74775, 74780, 74785, 74790, 74795, 74800, 74805, 74810, 74816, + 74821, 74827, 74832, 74837, 74842, 74847, 74852, 74857, 74863, 74868, + 74873, 74878, 74883, 74888, 74893, 74898, 74903, 74908, 74913, 74919, + 74924, 74929, 74934, 74939, 74944, 74949, 74954, 74959, 74965, 74970, + 74975, 74980, 74985, 74990, 74995, 75000, 75005, 75010, 75015, 75020, + 75025, 75031, 1798, 305, 75036, 45210, 75040, 75043, 75048, 75052, 75055, + 3533, 75060, 75065, 75069, 75078, 75089, 75106, 75124, 75132, 73932, + 75139, 75142, 75152, 75159, 75168, 75184, 75193, 75203, 75208, 75221, + 75231, 75240, 75248, 75262, 75270, 75279, 75283, 75286, 75293, 75299, + 75310, 75317, 75329, 75340, 75351, 75360, 75367, 1181, 811, 75377, 2649, + 75381, 75386, 75395, 1015, 8818, 24670, 75403, 75411, 75425, 75438, + 75442, 75447, 75452, 75457, 75463, 75469, 75474, 9368, 17796, 75479, + 75483, 75491, 9805, 75496, 75502, 75511, 75519, 1651, 12885, 1055, 4278, + 75523, 75527, 75536, 75546, 2387, 31949, 75555, 75561, 19800, 31964, + 75567, 4443, 13267, 75573, 75580, 70172, 75584, 75588, 75594, 75599, + 75604, 3760, 160, 3786, 75609, 75621, 75625, 75629, 75635, 75640, 32812, + 75644, 13255, 2843, 4, 75649, 75659, 75670, 75681, 75691, 75697, 75708, + 75715, 75721, 75727, 75735, 75742, 75748, 75758, 75768, 75778, 75787, + 27887, 1193, 75792, 75796, 75800, 75806, 75810, 2866, 2872, 9365, 2242, + 75814, 75818, 75827, 75835, 75846, 75854, 75862, 75868, 75873, 75884, + 75895, 75903, 75909, 75914, 10993, 75924, 75932, 75936, 75940, 75945, + 75949, 75961, 33261, 17698, 75968, 75978, 75984, 75990, 7752, 11095, + 76000, 76011, 76022, 76032, 76041, 76045, 76052, 1017, 2636, 76062, + 76067, 76075, 69888, 76083, 76088, 76099, 76106, 76120, 16453, 525, + 76130, 76137, 76141, 76145, 76153, 76162, 76170, 76176, 19845, 76181, + 76195, 76202, 76208, 76216, 76225, 76234, 76241, 76253, 76263, 76271, + 76278, 76286, 76293, 4242, 116, 76301, 76312, 76316, 76328, 76334, 13469, + 210, 76339, 10416, 76344, 2911, 76348, 76355, 76361, 76372, 76382, 76390, + 76397, 9756, 76404, 76413, 76421, 4323, 76434, 4340, 76438, 76443, 76449, + 76454, 76459, 76464, 2916, 561, 76470, 76483, 76487, 76492, 2921, 1797, + 919, 76496, 4344, 76504, 76510, 76514, 774, 76524, 76533, 76538, 3777, + 76542, 17447, 17454, 54306, 76546, 4375, 4252, 15183, 76554, 76561, + 76566, 27951, 76570, 76577, 76583, 76588, 76593, 13582, 204, 76598, + 76610, 76616, 76624, 2933, 1688, 76632, 76634, 76639, 76644, 76649, + 76655, 76660, 76665, 76670, 76675, 76680, 76685, 76691, 76696, 76701, + 76706, 76711, 76716, 76721, 76726, 76731, 76737, 76742, 76747, 76752, + 76758, 76763, 76769, 76774, 76779, 76784, 76789, 76794, 76799, 76804, + 76810, 76815, 76821, 76826, 76831, 76836, 76841, 76846, 76851, 76856, + 76861, 9437, 9450, 4391, 4396, 4401, 4406, 26, 76867, 76873, 76878, + 76883, 76888, 76894, 76899, 76903, 76907, 76912, 76918, 76922, 76928, + 76933, 76938, 76944, 76949, 76953, 76958, 76963, 76967, 76970, 76972, + 76976, 76979, 76986, 76991, 76995, 77000, 77004, 77008, 77012, 77021, + 77025, 38345, 77028, 38350, 77035, 77040, 38355, 77049, 77058, 38361, + 77063, 38366, 77072, 77077, 13512, 77081, 77086, 77091, 38371, 77095, + 77104, 49149, 77108, 77111, 77115, 9036, 77121, 77124, 77129, 77134, + 77138, 4064, 38376, 77141, 77145, 77148, 77159, 77164, 77168, 77174, + 77182, 77195, 77199, 77207, 77216, 77222, 77227, 77233, 77237, 77243, + 77249, 77257, 77262, 77266, 77273, 77279, 77287, 77296, 77304, 38379, + 77311, 77321, 77330, 77338, 77349, 77362, 77367, 77372, 77376, 77385, + 77391, 77398, 77411, 77423, 77434, 77446, 77453, 77462, 77471, 77480, + 77487, 77493, 77500, 77508, 77515, 77523, 77532, 77540, 77547, 77555, + 77564, 77572, 77581, 77591, 77600, 77608, 77615, 77623, 77632, 77640, + 77649, 77659, 77668, 77676, 77685, 77695, 77704, 77714, 77725, 77735, + 77744, 77752, 77759, 77767, 77776, 77784, 77793, 77803, 77812, 77820, + 77829, 77839, 77848, 77858, 77869, 77879, 77888, 77896, 77905, 77915, + 77924, 77934, 77945, 77955, 77964, 77974, 77985, 77995, 78006, 78018, + 78029, 78039, 78048, 78056, 78063, 78071, 78080, 78088, 78097, 78107, + 78116, 78124, 78133, 78143, 78152, 78162, 78173, 78183, 78192, 78200, + 78209, 78219, 78228, 78238, 78249, 78259, 78268, 78278, 78289, 78299, + 78310, 78322, 78333, 78343, 78352, 78360, 78369, 78379, 78388, 78398, + 78409, 78419, 78428, 78438, 78449, 78459, 78470, 78482, 78493, 78503, + 78512, 78522, 78533, 78543, 78554, 78566, 78577, 78587, 78598, 78610, + 78621, 78633, 78646, 78658, 78669, 78679, 78688, 78696, 78703, 78711, + 78720, 78728, 78737, 78747, 78756, 78764, 78773, 78783, 78792, 78802, + 78813, 78823, 78832, 78840, 78849, 78859, 78868, 78878, 78889, 78899, + 78908, 78918, 78929, 78939, 78950, 78962, 78973, 78983, 78992, 79000, + 79009, 79019, 79028, 79038, 79049, 79059, 79068, 79078, 79089, 79099, + 79110, 79122, 79133, 79143, 79152, 79162, 79173, 79183, 79194, 79206, + 79217, 79227, 79238, 79250, 79261, 79273, 79286, 79298, 79309, 79319, + 79328, 79336, 79345, 79355, 79364, 79374, 79385, 79395, 79404, 79414, + 79425, 79435, 79446, 79458, 79469, 79479, 79488, 79498, 79509, 79519, + 79530, 79542, 79553, 79563, 79574, 79586, 79597, 79609, 79622, 79634, + 79645, 79655, 79664, 79674, 79685, 79695, 79706, 79718, 79729, 79739, + 79750, 79762, 79773, 79785, 79798, 79810, 79821, 79831, 79842, 79854, + 79865, 79877, 79890, 79902, 79913, 79925, 79938, 79950, 79963, 79977, + 79990, 80002, 80013, 80023, 80032, 80040, 80047, 80052, 80056, 8849, + 80063, 80068, 38389, 80074, 80079, 38394, 80085, 24792, 30653, 80090, + 80096, 80104, 80110, 80116, 80123, 80130, 80135, 80140, 80144, 80149, + 80153, 80156, 80160, 80165, 80174, 80183, 80191, 80197, 80209, 80220, + 80224, 3226, 8824, 80229, 80232, 80235, 80237, 80241, 80245, 80249, + 80255, 80260, 30716, 80265, 80269, 80272, 80277, 80281, 80288, 80294, + 80298, 6835, 80302, 80307, 38416, 80311, 80318, 80327, 80335, 80341, + 80352, 80360, 80369, 80377, 80384, 80391, 80397, 80402, 80413, 38421, + 80418, 80429, 80441, 80449, 80460, 80469, 80477, 80488, 80493, 80501, + 2601, 80506, 80515, 40704, 80528, 80532, 80544, 80552, 80557, 80565, + 80576, 21290, 80585, 80591, 80598, 80606, 80612, 38431, 80617, 4369, + 67320, 80624, 80627, 80635, 80648, 80661, 80674, 80687, 80694, 80705, + 80714, 80719, 50761, 50766, 80723, 80727, 80735, 80742, 80751, 80759, + 80765, 80774, 80782, 80789, 80797, 80801, 80810, 80819, 80829, 80842, + 80855, 80865, 38436, 80871, 80878, 80884, 80890, 38442, 80895, 80898, + 80902, 80910, 80919, 50544, 80927, 80936, 80944, 80951, 80959, 80969, + 80978, 80987, 39884, 80996, 81007, 81022, 81032, 10449, 25565, 81041, + 81046, 81051, 81055, 18931, 81060, 81065, 81071, 81076, 81081, 81087, + 81092, 81097, 25525, 81102, 81109, 81117, 81125, 81133, 81138, 81145, + 81152, 81157, 1706, 81161, 81165, 81173, 81181, 38459, 81187, 81193, + 81205, 81211, 81218, 81222, 81229, 81234, 81241, 81247, 81254, 81265, + 81275, 81285, 81297, 81303, 81311, 81317, 81327, 81337, 38486, 81346, + 81355, 81361, 81373, 81384, 81391, 81396, 81400, 81408, 81414, 81419, + 81424, 81431, 81439, 81451, 81461, 81470, 81479, 81487, 81494, 40530, + 28325, 81500, 81505, 81509, 81513, 81518, 81526, 81532, 81543, 81556, + 81561, 81568, 38491, 81573, 81585, 81594, 81602, 81612, 81623, 81636, + 81643, 81652, 81661, 81669, 81674, 81680, 81684, 1410, 81689, 81694, + 81699, 81704, 81710, 81715, 81720, 81726, 81732, 81737, 81741, 81746, + 81751, 81756, 67895, 81761, 81766, 81771, 81776, 81782, 81788, 81793, + 81797, 81802, 18930, 81807, 81813, 81818, 81824, 81829, 81834, 81839, + 81844, 81848, 81854, 81859, 81868, 81873, 81878, 81883, 81888, 81892, + 81899, 81905, 4704, 20162, 3191, 81910, 81914, 81919, 81923, 81927, + 81931, 54561, 81935, 81860, 81937, 81947, 38500, 81950, 81955, 81964, + 81970, 6794, 38505, 81974, 81980, 81985, 81991, 81996, 82000, 82007, + 82012, 82022, 82031, 82035, 82041, 82047, 82053, 82057, 82065, 82072, + 82080, 82088, 38510, 82095, 82098, 82109, 82116, 82122, 82127, 82131, + 82137, 82145, 82152, 82157, 82161, 82170, 82178, 82184, 82189, 38515, + 82196, 27777, 82208, 82214, 82219, 82225, 82232, 82238, 25251, 32431, + 82244, 82249, 82255, 82259, 82271, 81893, 81900, 25457, 82281, 82286, + 82293, 82299, 82306, 82312, 82323, 82328, 82336, 10154, 82341, 82344, + 82350, 82354, 82358, 82361, 82367, 82373, 38225, 4705, 1425, 15602, + 82380, 82386, 82392, 82398, 82404, 82410, 82416, 82422, 82428, 82433, + 82438, 82443, 82448, 82453, 82458, 82463, 82468, 82473, 82478, 82483, + 82488, 82493, 82499, 82504, 82509, 82515, 82520, 82525, 82531, 82537, + 82543, 82549, 82555, 82561, 82567, 82573, 82579, 82584, 82589, 82595, + 82600, 82605, 82611, 82616, 82621, 82626, 82631, 82636, 82641, 82646, + 82651, 82656, 82661, 82666, 82671, 82677, 82682, 82687, 82692, 82698, + 82703, 82708, 82713, 82718, 82724, 82729, 82734, 82739, 82744, 82749, + 82754, 82759, 82764, 82769, 82774, 82779, 82784, 82789, 82794, 82799, + 82804, 82809, 82814, 82819, 82825, 82830, 82835, 82840, 82845, 82850, + 82855, 82860, 1027, 169, 82865, 82869, 82873, 82878, 82886, 82890, 82897, + 82905, 82909, 82922, 82930, 82935, 82940, 31173, 82944, 82949, 82953, + 82958, 82962, 82970, 82974, 24800, 82979, 82983, 70712, 82987, 82990, + 82998, 83006, 83014, 83019, 83024, 83031, 83038, 83044, 83050, 83055, + 83062, 83067, 83075, 75430, 83082, 83087, 70484, 83094, 83100, 83105, + 83109, 83116, 83122, 83129, 70511, 13596, 83137, 83142, 83147, 83151, + 83154, 83165, 83174, 83180, 83185, 83189, 83199, 83208, 48940, 83212, + 83216, 83223, 83236, 83242, 83250, 83259, 83270, 83281, 83292, 83303, + 83312, 83318, 83327, 83335, 83345, 83358, 83366, 83373, 83384, 83393, + 83399, 83404, 83409, 83415, 83425, 83431, 83441, 83449, 83456, 83466, + 83475, 81575, 83483, 83489, 83497, 83503, 73977, 83510, 83515, 83518, + 83522, 83528, 83532, 83535, 83543, 83549, 83555, 83563, 83575, 83587, + 83594, 83599, 83603, 83614, 83622, 83629, 83641, 83649, 83656, 83664, + 83671, 83677, 83682, 83692, 83701, 83709, 83714, 83724, 83733, 49805, + 83740, 83744, 83749, 83757, 83764, 83770, 83774, 83784, 83795, 83803, + 83810, 83822, 83834, 83843, 80518, 83850, 83860, 83872, 83883, 83897, + 83905, 83915, 83922, 83930, 83943, 83955, 83964, 83972, 83982, 83993, + 84005, 84014, 84024, 84034, 84043, 84050, 84059, 84074, 84082, 84092, + 84101, 84109, 84122, 67290, 84137, 84147, 84156, 84168, 84178, 84190, + 84201, 84215, 84229, 84243, 84257, 84271, 84285, 84299, 84313, 84327, + 84341, 84355, 84369, 84383, 84397, 84411, 84425, 84439, 84453, 84467, + 84481, 84495, 84509, 84523, 84537, 84551, 84565, 84579, 84593, 84607, + 84621, 84635, 84649, 84663, 84677, 84691, 84705, 84719, 84733, 84747, + 84761, 84775, 84789, 84803, 84817, 84831, 84845, 84859, 84873, 84887, + 84901, 84915, 84929, 84943, 84957, 84971, 84985, 84999, 85013, 85027, + 85041, 85055, 85069, 85083, 85097, 85111, 85125, 85139, 85153, 85167, + 85181, 85195, 85209, 85223, 85237, 85251, 85265, 85279, 85293, 85307, + 85321, 85335, 85349, 85363, 85377, 85391, 85405, 85419, 85433, 85447, + 85461, 85475, 85489, 85503, 85517, 85531, 85545, 85559, 85573, 85587, + 85601, 85615, 85629, 85643, 85657, 85671, 85685, 85699, 85713, 85727, + 85741, 85755, 85769, 85783, 85797, 85811, 85825, 85839, 85853, 85867, + 85881, 85895, 85909, 85923, 85937, 85951, 85965, 85979, 85993, 86007, + 86021, 86035, 86049, 86063, 86077, 86091, 86105, 86119, 86133, 86147, + 86161, 86175, 86189, 86203, 86217, 86231, 86245, 86259, 86273, 86287, + 86301, 86315, 86329, 86343, 86357, 86371, 86385, 86399, 86413, 86427, + 86441, 86455, 86469, 86483, 86497, 86511, 86525, 86539, 86553, 86567, + 86581, 86595, 86609, 86623, 86637, 86651, 86665, 86679, 86693, 86707, + 86721, 86735, 86749, 86763, 86777, 86791, 86805, 86819, 86833, 86847, + 86861, 86875, 86889, 86903, 86917, 86931, 86945, 86959, 86973, 86987, + 87001, 87015, 87029, 87043, 87057, 87071, 87085, 87099, 87113, 87127, + 87141, 87155, 87169, 87183, 87197, 87211, 87225, 87239, 87253, 87267, + 87281, 87295, 87309, 87323, 87337, 87351, 87365, 87379, 87393, 87407, + 87421, 87435, 87449, 87463, 87477, 87491, 87505, 87519, 87533, 87547, + 87561, 87575, 87589, 87603, 87617, 87631, 87645, 87659, 87673, 87687, + 87701, 87715, 87729, 87743, 87757, 87771, 87785, 87799, 87813, 87827, + 87841, 87855, 87869, 87883, 87897, 87911, 87925, 87939, 87953, 87967, + 87981, 87995, 88009, 88023, 88037, 88051, 88065, 88079, 88093, 88107, + 88121, 88135, 88149, 88163, 88177, 88191, 88205, 88219, 88233, 88247, + 88261, 88275, 88289, 88303, 88317, 88331, 88345, 88359, 88373, 88387, + 88401, 88415, 88429, 88443, 88457, 88471, 88485, 88499, 88513, 88527, + 88541, 88555, 88569, 88583, 88597, 88611, 88625, 88639, 88653, 88667, + 88681, 88695, 88709, 88723, 88737, 88751, 88765, 88779, 88793, 88807, + 88821, 88835, 88849, 88863, 88877, 88891, 88905, 88919, 88933, 88947, + 88961, 88975, 88989, 89003, 89017, 89031, 89045, 89059, 89073, 89087, + 89101, 89115, 89129, 89143, 89157, 89171, 89185, 89199, 89213, 89227, + 89241, 89255, 89269, 89283, 89297, 89311, 89325, 89339, 89353, 89367, + 89381, 89395, 89409, 89423, 89437, 89451, 89465, 89479, 89493, 89507, + 89521, 89535, 89549, 89563, 89577, 89591, 89605, 89619, 89633, 89647, + 89661, 89675, 89689, 89703, 89717, 89731, 89745, 89759, 89773, 89787, + 89801, 89815, 89829, 89843, 89857, 89871, 89885, 89899, 89913, 89927, + 89941, 89955, 89969, 89983, 89997, 90011, 90025, 90039, 90053, 90067, + 90081, 90095, 90109, 90123, 90137, 90151, 90165, 90179, 90193, 90207, + 90221, 90235, 90249, 90263, 90277, 90291, 90305, 90319, 90333, 90347, + 90361, 90375, 90389, 90403, 90417, 90431, 90445, 90459, 90473, 90487, + 90501, 90515, 90529, 90543, 90557, 90571, 90585, 90599, 90613, 90627, + 90641, 90655, 90669, 90683, 90697, 90711, 90725, 90739, 90753, 90767, + 90781, 90795, 90809, 90823, 90837, 90851, 90865, 90879, 90893, 90907, + 90921, 90935, 90949, 90963, 90977, 90991, 91005, 91019, 91033, 91047, + 91061, 91075, 91089, 91103, 91117, 91131, 91145, 91159, 91173, 91187, + 91201, 91215, 91229, 91243, 91257, 91271, 91285, 91299, 91313, 91327, + 91341, 91355, 91369, 91383, 91397, 91411, 91425, 91439, 91453, 91467, + 91481, 91495, 91509, 91523, 91537, 91551, 91565, 91579, 91593, 91607, + 91621, 91635, 91649, 91663, 91677, 91691, 91705, 91719, 91733, 91747, + 91761, 91775, 91789, 91803, 91817, 91831, 91845, 91859, 91873, 91887, + 91901, 91915, 91929, 91943, 91957, 91971, 91985, 91999, 92013, 92027, + 92041, 92055, 92069, 92083, 92097, 92111, 92125, 92139, 92153, 92167, + 92181, 92195, 92209, 92223, 92237, 92251, 92265, 92279, 92293, 92307, + 92321, 92335, 92349, 92363, 92377, 92391, 92405, 92419, 92433, 92447, + 92461, 92475, 92489, 92503, 92517, 92531, 92545, 92559, 92573, 92587, + 92601, 92615, 92629, 92643, 92657, 92671, 92685, 92699, 92713, 92727, + 92741, 92755, 92769, 92783, 92797, 92811, 92825, 92839, 92853, 92867, + 92881, 92895, 92909, 92923, 92937, 92951, 92965, 92979, 92993, 93007, + 93021, 93035, 93049, 93063, 93077, 93091, 93105, 93119, 93133, 93147, + 93161, 93175, 93189, 93203, 93217, 93231, 93245, 93259, 93273, 93287, + 93301, 93315, 93329, 93343, 93357, 93371, 93385, 93399, 93413, 93427, + 93441, 93455, 93469, 93483, 93497, 93511, 93525, 93539, 93553, 93567, + 93581, 93595, 93609, 93623, 93637, 93651, 93665, 93679, 93693, 93707, + 93721, 93735, 93749, 93763, 93777, 93791, 93805, 93819, 93833, 93847, + 93861, 93875, 93889, 93903, 93917, 93931, 93945, 93959, 93973, 93987, + 94001, 94015, 94029, 94043, 94057, 94071, 94085, 94099, 94113, 94127, + 94141, 94155, 94169, 94183, 94197, 94211, 94225, 94239, 94253, 94267, + 94281, 94295, 94309, 94323, 94337, 94351, 94365, 94379, 94393, 94407, + 94421, 94435, 94449, 94463, 94477, 94491, 94505, 94519, 94533, 94547, + 94561, 94575, 94589, 94603, 94617, 94631, 94645, 94659, 94673, 94687, + 94701, 94715, 94729, 94743, 94757, 94771, 94785, 94799, 94813, 94827, + 94841, 94855, 94869, 94883, 94897, 94911, 94925, 94939, 94953, 94962, + 94973, 94984, 94994, 95005, 95013, 95021, 95027, 95037, 95045, 95051, + 34382, 95056, 95062, 95071, 95083, 95088, 95095, 11007, 21310, 95101, + 95110, 95115, 95119, 95124, 95131, 95137, 95142, 95147, 95155, 95163, + 95173, 95178, 95186, 14061, 95190, 95193, 95195, 95210, 95223, 95230, + 95236, 95247, 95252, 95256, 95261, 95268, 95274, 95279, 95287, 76024, + 76034, 95293, 95300, 95310, 12243, 95317, 95322, 34620, 95331, 95336, + 95343, 95353, 95361, 95369, 95378, 95387, 95393, 95399, 95406, 95413, + 95418, 95422, 95430, 70528, 95435, 95444, 95452, 95459, 95464, 95468, + 95477, 95483, 95486, 95490, 95499, 95509, 82917, 95518, 95522, 95530, + 95534, 95540, 95551, 95561, 21319, 95572, 95581, 95589, 95597, 95604, + 70547, 9602, 95612, 95616, 95625, 95632, 95635, 95639, 32309, 95642, + 95646, 95651, 95668, 95680, 12201, 95692, 95697, 95702, 95707, 24902, + 95711, 95716, 95721, 95727, 95732, 6433, 95737, 24906, 95742, 95747, + 95753, 95760, 95765, 95770, 95776, 95782, 95788, 95793, 95799, 95803, + 95817, 95825, 95833, 95839, 95844, 95851, 95861, 95870, 95875, 95880, + 95885, 95893, 95903, 95914, 95919, 95925, 95930, 95939, 69012, 4634, + 95944, 95962, 95981, 95994, 96008, 96024, 96031, 96038, 96047, 96054, + 96060, 96067, 96072, 96078, 96083, 96089, 96097, 96103, 96108, 96113, + 96129, 12214, 96143, 96150, 96158, 96164, 96168, 96171, 96177, 96182, + 96187, 96195, 96202, 96207, 96216, 96222, 96227, 96233, 96239, 96248, + 96257, 42236, 96262, 96270, 96279, 13669, 96288, 96294, 96302, 96308, + 96314, 96320, 96325, 96332, 96338, 13680, 96343, 96346, 96351, 38542, + 96361, 96370, 96375, 96381, 96386, 96394, 96401, 96412, 96428, 96444, + 96460, 96476, 96492, 96508, 96524, 96540, 96556, 96572, 96588, 96604, + 96620, 96636, 96652, 96668, 96684, 96700, 96716, 96732, 96748, 96764, + 96780, 96796, 96812, 96828, 96844, 96860, 96876, 96892, 96908, 96924, + 96940, 96956, 96972, 96988, 97004, 97020, 97036, 97052, 97068, 97084, + 97100, 97116, 97132, 97148, 97164, 97180, 97196, 97212, 97228, 97244, + 97260, 97276, 97292, 97308, 97324, 97340, 97356, 97372, 97388, 97404, + 97420, 97436, 97452, 97468, 97484, 97500, 97516, 97532, 97548, 97564, + 97580, 97596, 97612, 97628, 97644, 97660, 97676, 97692, 97708, 97724, + 97740, 97756, 97772, 97788, 97804, 97820, 97836, 97852, 97868, 97884, + 97900, 97916, 97932, 97948, 97964, 97980, 97996, 98012, 98028, 98044, + 98060, 98076, 98092, 98108, 98124, 98140, 98156, 98172, 98188, 98204, + 98220, 98236, 98252, 98268, 98284, 98300, 98316, 98332, 98348, 98364, + 98380, 98396, 98412, 98428, 98444, 98460, 98476, 98492, 98508, 98524, + 98540, 98556, 98572, 98588, 98604, 98620, 98636, 98652, 98668, 98684, + 98700, 98716, 98732, 98748, 98764, 98780, 98796, 98812, 98828, 98844, + 98860, 98876, 98892, 98908, 98924, 98940, 98956, 98972, 98988, 99004, + 99020, 99036, 99052, 99068, 99084, 99100, 99116, 99132, 99148, 99164, + 99180, 99196, 99212, 99228, 99244, 99260, 99276, 99292, 99308, 99324, + 99340, 99356, 99372, 99388, 99404, 99420, 99436, 99452, 99468, 99484, + 99500, 99516, 99532, 99548, 99564, 99580, 99596, 99612, 99628, 99644, + 99660, 99676, 99692, 99708, 99724, 99740, 99756, 99772, 99788, 99804, + 99820, 99836, 99852, 99868, 99884, 99900, 99916, 99932, 99948, 99964, + 99980, 99996, 100012, 100028, 100044, 100060, 100076, 100092, 100108, + 100124, 100140, 100156, 100172, 100188, 100204, 100220, 100236, 100252, + 100268, 100284, 100300, 100316, 100332, 100348, 100364, 100380, 100396, + 100412, 100428, 100444, 100460, 100476, 100492, 100508, 100524, 100540, + 100556, 100572, 100588, 100604, 100620, 100636, 100652, 100668, 100684, + 100700, 100716, 100732, 100748, 100764, 100780, 100796, 100812, 100828, + 100844, 100860, 100876, 100892, 100908, 100924, 100940, 100956, 100972, + 100988, 101004, 101020, 101036, 101052, 101068, 101084, 101100, 101116, + 101132, 101148, 101164, 101180, 101196, 101212, 101228, 101244, 101260, + 101276, 101292, 101308, 101324, 101340, 101356, 101372, 101388, 101404, + 101420, 101436, 101452, 101468, 101484, 101500, 101516, 101532, 101548, + 101564, 101580, 101596, 101612, 101628, 101644, 101660, 101676, 101692, + 101708, 101724, 101740, 101756, 101772, 101788, 101804, 101820, 101836, + 101852, 101868, 101884, 101900, 101916, 101932, 101948, 101964, 101980, + 101996, 102012, 102028, 102044, 102060, 102076, 102092, 102108, 102124, + 102140, 102156, 102172, 102188, 102204, 102220, 102236, 102252, 102268, + 102284, 102300, 102316, 102332, 102348, 102364, 102380, 102396, 102412, + 102428, 102444, 102460, 102476, 102492, 102508, 102524, 102540, 102556, + 102572, 102588, 102604, 102620, 102636, 102652, 102668, 102684, 102700, + 102716, 102732, 102748, 102764, 102780, 102796, 102812, 102828, 102844, + 102860, 102876, 102892, 102908, 102924, 102940, 102956, 102972, 102988, + 103004, 103020, 103036, 103052, 103068, 103084, 103100, 103116, 103132, + 103148, 103164, 103180, 103196, 103212, 103228, 103244, 103260, 103276, + 103292, 103308, 103324, 103340, 103356, 103372, 103388, 103404, 103420, + 103436, 103452, 103468, 103484, 103500, 103516, 103532, 103548, 103564, + 103580, 103596, 103612, 103628, 103644, 103660, 103676, 103692, 103708, + 103724, 103740, 103756, 103772, 103788, 103804, 103820, 103836, 103852, + 103868, 103884, 103900, 103916, 103932, 103948, 103964, 103980, 103996, + 104012, 104028, 104044, 104060, 104076, 104092, 104108, 104124, 104140, + 104156, 104172, 104188, 104204, 104220, 104236, 104252, 104268, 104284, + 104300, 104316, 104332, 104348, 104364, 104380, 104396, 104412, 104428, + 104444, 104460, 104476, 104492, 104508, 104524, 104540, 104556, 104572, + 104588, 104604, 104620, 104636, 104652, 104668, 104684, 104700, 104716, + 104732, 104748, 104764, 104780, 104796, 104812, 104828, 104844, 104860, + 104876, 104892, 104908, 104924, 104940, 104956, 104972, 104988, 105004, + 105020, 105036, 105052, 105068, 105084, 105100, 105116, 105132, 105148, + 105164, 105180, 105196, 105212, 105228, 105244, 105260, 105276, 105292, + 105308, 105324, 105340, 105356, 105372, 105388, 105404, 105420, 105436, + 105452, 105468, 105484, 105500, 105516, 105532, 105548, 105564, 105580, + 105596, 105612, 105628, 105644, 105660, 105676, 105692, 105708, 105724, + 105740, 105756, 105772, 105788, 105804, 105820, 105836, 105852, 105868, + 105884, 105900, 105916, 105932, 105948, 105964, 105980, 105996, 106012, + 106028, 106044, 106060, 106076, 106092, 106108, 106124, 106140, 106156, + 106172, 106188, 106204, 106220, 106236, 106252, 106268, 106284, 106300, + 106316, 106332, 106348, 106364, 106380, 106396, 106412, 106428, 106444, + 106460, 106476, 106492, 106508, 106524, 106540, 106556, 106572, 106588, + 106604, 106620, 106636, 106652, 106668, 106684, 106700, 106716, 106732, + 106748, 106764, 106780, 106796, 106812, 106828, 106844, 106860, 106876, + 106892, 106908, 106924, 106940, 106956, 106972, 106988, 107004, 107020, + 107036, 107052, 107068, 107084, 107100, 107116, 107132, 107148, 107164, + 107180, 107196, 107212, 107228, 107244, 107260, 107276, 107292, 107308, + 107324, 107340, 107356, 107372, 107388, 107404, 107420, 107436, 107452, + 107468, 107484, 107500, 107516, 107532, 107548, 107564, 107580, 107596, + 107612, 107628, 107644, 107660, 107676, 107692, 107708, 107724, 107740, + 107756, 107772, 107788, 107804, 107820, 107836, 107852, 107868, 107884, + 107900, 107916, 107932, 107948, 107964, 107980, 107996, 108012, 108028, + 108044, 108060, 108076, 108092, 108108, 108124, 108140, 108156, 108172, + 108188, 108204, 108220, 108236, 108252, 108268, 108284, 108300, 108316, + 108332, 108348, 108364, 108380, 108396, 108412, 108428, 108444, 108460, + 108476, 108492, 108508, 108524, 108540, 108556, 108572, 108588, 108604, + 108620, 108636, 108652, 108668, 108684, 108700, 108716, 108732, 108748, + 108764, 108780, 108796, 108812, 108828, 108844, 108860, 108876, 108892, + 108908, 108924, 108940, 108956, 108972, 108988, 109004, 109020, 109036, + 109052, 109068, 109084, 109100, 109116, 109132, 109148, 109164, 109180, + 109196, 109212, 109228, 109244, 109260, 109276, 109292, 109308, 109324, + 109340, 109356, 109372, 109388, 109404, 109420, 109436, 109452, 109468, + 109484, 109500, 109516, 109532, 109548, 109564, 109580, 109596, 109612, + 109628, 109644, 109660, 109676, 109692, 109708, 109724, 109740, 109756, + 109772, 109788, 109804, 109820, 109836, 109852, 109868, 109884, 109900, + 109916, 109932, 109948, 109964, 109980, 109996, 110012, 110028, 110044, + 110060, 110076, 110092, 110108, 110124, 110140, 110156, 110172, 110188, + 110204, 110220, 110236, 110252, 110268, 110278, 110287, 110292, 110300, + 75353, 110305, 110311, 110316, 110323, 110332, 110340, 110344, 4223, + 110350, 110357, 110363, 110367, 19911, 45306, 3200, 110372, 110376, + 110380, 110387, 110393, 110402, 110408, 110415, 110419, 110440, 110462, + 110478, 110495, 110514, 110523, 110533, 110541, 110548, 110555, 110561, + 32164, 110575, 110579, 110585, 110593, 110605, 110611, 110619, 110626, + 110631, 110636, 110640, 110648, 110655, 110659, 110665, 110671, 110676, + 3871, 50961, 110682, 110686, 110690, 110694, 110699, 110704, 110709, + 110715, 110721, 110727, 110734, 110740, 110747, 110753, 110759, 110764, + 110770, 110775, 110779, 102872, 110784, 102936, 50976, 110789, 110794, + 110802, 110806, 110811, 110818, 110827, 110833, 110842, 110846, 110853, + 110857, 110860, 110867, 110873, 110882, 110892, 110902, 110907, 110911, + 110918, 110926, 110935, 110939, 110947, 110953, 110958, 110963, 110969, + 110975, 110980, 110984, 31071, 110990, 110994, 110998, 111001, 111006, + 111014, 111024, 111030, 111035, 111045, 48136, 111053, 111065, 111071, + 111078, 111084, 111088, 111093, 111099, 111111, 111122, 111129, 111135, + 111142, 111149, 111161, 111168, 111174, 24986, 111178, 111186, 111192, + 111199, 111205, 111211, 111217, 111222, 111227, 111232, 111236, 111245, + 111253, 111264, 7709, 111269, 19347, 111275, 111279, 111283, 111287, + 111295, 111304, 111308, 111315, 111324, 111332, 111345, 111351, 103448, + 35520, 111356, 111358, 111363, 111368, 111373, 111378, 111383, 111388, + 111393, 111398, 111403, 111408, 111413, 111418, 111423, 111428, 111434, + 111439, 111444, 111449, 111454, 111459, 111464, 111469, 111474, 111480, + 111486, 111492, 111497, 111502, 111514, 111519, 1840, 54, 111524, 111529, + 38552, 111533, 38557, 38562, 38568, 38573, 111537, 38578, 26134, 111559, + 111563, 111567, 111572, 111576, 38582, 111580, 111588, 111595, 111601, + 111611, 38587, 111618, 111621, 111626, 111630, 111639, 10817, 111647, + 38592, 25978, 111650, 111654, 111662, 1315, 111667, 38603, 111670, + 111675, 30437, 30447, 41834, 111680, 111685, 111690, 111695, 111701, + 111706, 111715, 111720, 111729, 111737, 111744, 111750, 111755, 111760, + 111765, 111775, 111784, 111792, 111797, 111805, 111809, 111817, 111821, + 111828, 111835, 111843, 111850, 38407, 45041, 111856, 111862, 111867, + 111872, 14096, 11556, 111877, 111882, 111887, 111893, 111900, 111906, + 111915, 111920, 111928, 111938, 111945, 111955, 111961, 111966, 111972, + 111976, 21341, 111983, 42798, 111996, 112001, 112007, 112022, 36577, + 73759, 112035, 112039, 112048, 112057, 112064, 112070, 112078, 112084, + 112093, 112100, 45161, 112106, 112109, 112113, 112117, 112121, 11577, + 112127, 112134, 112140, 112148, 112153, 112157, 28485, 112163, 112166, + 112174, 112181, 112189, 112202, 112216, 112223, 112229, 112236, 112242, + 38617, 112246, 112253, 112261, 112269, 112275, 38622, 112283, 112289, + 112294, 112304, 112310, 112319, 36372, 41205, 112327, 112332, 112337, + 112341, 112346, 112350, 112358, 112363, 17439, 18213, 48158, 112367, + 112372, 38627, 17592, 112376, 112388, 112393, 112397, 112404, 112413, + 112417, 112425, 112431, 112436, 112444, 112452, 112460, 112468, 112476, + 112484, 112495, 112501, 8891, 112506, 112512, 112517, 112522, 112533, + 112542, 112554, 112569, 38915, 112575, 19466, 38631, 112579, 112586, + 112592, 112596, 28609, 112603, 112609, 112616, 47421, 112625, 112631, + 112640, 112646, 112651, 112659, 112665, 112670, 38641, 112675, 112684, + 112693, 111117, 112702, 112709, 112715, 112721, 112730, 112740, 112746, + 112754, 112761, 112765, 38646, 112768, 38652, 1354, 112773, 112781, + 112789, 112799, 112808, 112816, 112823, 112833, 38663, 112837, 112839, + 112843, 112848, 112852, 112856, 112862, 112867, 112871, 112882, 112887, + 112896, 112901, 3205, 112905, 112912, 112916, 112925, 112933, 112941, + 112948, 112953, 112958, 72289, 112962, 112965, 112971, 112979, 112985, + 112989, 112994, 113001, 113006, 113011, 113015, 113022, 113028, 113033, + 41236, 113037, 113040, 113045, 113049, 113054, 113061, 113066, 113070, + 46483, 113078, 30456, 30465, 113084, 113090, 113096, 113101, 113105, + 113108, 113118, 113127, 113132, 113138, 113145, 113151, 113155, 113163, + 113168, 41242, 83176, 113172, 113180, 113187, 113193, 113200, 113205, + 113212, 113217, 113221, 113226, 67506, 113232, 113238, 10093, 113243, + 113248, 113252, 113257, 113262, 113267, 113271, 113276, 113281, 113287, + 113292, 113297, 113303, 113309, 113314, 113318, 113323, 113328, 113333, + 113337, 28608, 113342, 113347, 113353, 113359, 113365, 113370, 113374, + 113379, 113384, 107224, 113389, 113394, 113399, 113404, 107288, 51231, + 113409, 38671, 113417, 113421, 113429, 113437, 113448, 113453, 113457, + 26607, 80621, 113462, 113468, 113473, 4534, 113483, 113490, 113495, + 113503, 113512, 113517, 113521, 113526, 113530, 113538, 113546, 113553, + 75615, 113559, 113567, 113574, 113585, 113591, 113597, 38681, 113600, + 113607, 113615, 113620, 113624, 32668, 70116, 113630, 113635, 113642, + 113647, 9982, 113651, 113659, 113666, 113673, 113682, 113689, 113695, + 113709, 113717, 6514, 113479, 113723, 113728, 113734, 113738, 113741, + 113749, 113756, 113761, 113774, 113781, 113787, 113791, 113799, 113804, + 113811, 113817, 113822, 70387, 113827, 113830, 113839, 113846, 107496, + 113852, 113855, 113863, 113869, 113878, 113888, 113898, 113907, 113918, + 113926, 113937, 113942, 113946, 113951, 113955, 41965, 113963, 25314, + 41974, 113968, 99015, 99031, 99047, 99063, 99079, 113973, 99111, 99127, + 99143, 99159, 99271, 99287, 113977, 99319, 99335, 113981, 113985, 113989, + 113993, 99575, 99607, 113997, 99639, 114001, 114005, 99783, 99799, 99815, + 99831, 114009, 99895, 99911, 114013, 100039, 100055, 100071, 100087, + 100103, 100119, 100135, 100151, 100167, 100183, 100295, 100311, 100327, + 100343, 100359, 100375, 100391, 100407, 100423, 100439, 114017, 102231, + 102343, 102407, 102423, 102439, 102455, 102471, 102487, 102599, 102615, + 102631, 114021, 102679, 114025, 102711, 102727, 102743, 114029, 114034, + 114039, 114044, 114049, 114054, 114059, 114063, 114067, 114072, 114077, + 114081, 114086, 114091, 114095, 114100, 114105, 114110, 114115, 114119, + 114124, 114129, 114133, 114138, 114142, 114146, 114150, 114154, 114159, + 114163, 114167, 114171, 114175, 114179, 114183, 114187, 114191, 114195, + 114200, 114205, 114210, 114215, 114220, 114225, 114230, 114235, 114240, + 114245, 114249, 114253, 114257, 114261, 114265, 114269, 114274, 114278, + 114283, 114287, 114292, 114297, 114301, 114305, 114310, 114314, 114318, + 114322, 114326, 114330, 114334, 114338, 114342, 114346, 114350, 114354, + 114358, 114362, 114366, 114371, 114376, 114380, 114384, 114388, 114392, + 114396, 114400, 114405, 114409, 114413, 114417, 114421, 114425, 114429, + 114434, 114438, 114443, 114447, 114451, 114455, 114459, 114463, 114467, + 114471, 114475, 114479, 114483, 114487, 114492, 114496, 114500, 114504, + 114508, 114512, 114516, 114520, 114524, 114528, 114532, 114536, 114541, + 114545, 114549, 114554, 114559, 114563, 114567, 114571, 114575, 114579, + 114583, 114587, 114591, 114596, 114600, 114605, 114609, 114614, 114618, + 114623, 114627, 114633, 114638, 114642, 114647, 114651, 114656, 114660, + 114665, 114669, 114674, 1429, 114678, 2947, 1694, 27772, 1602, 30392, + 114682, 2956, 114686, 1284, 114691, 1226, 114695, 114699, 2980, 114703, + 114711, 114718, 114725, 114739, 2984, 7816, 114748, 114756, 114763, + 114774, 114783, 114787, 114794, 114806, 114819, 114832, 114843, 114848, + 114855, 114867, 114871, 2988, 13750, 114881, 114886, 114895, 114905, + 114910, 2992, 114918, 114922, 114927, 114934, 114940, 114945, 114954, + 114962, 114974, 114984, 1231, 15184, 114997, 115001, 115007, 115021, + 115033, 115045, 115053, 115063, 115072, 115081, 115090, 115098, 115109, + 115117, 4542, 115127, 115138, 115147, 115153, 115168, 115175, 115181, + 115186, 42108, 115191, 3016, 15188, 115195, 115200, 115207, 9913, 115216, + 115222, 3021, 38073, 115231, 70006, 115238, 115242, 115248, 115259, + 115265, 115270, 115277, 115283, 115291, 115298, 115304, 115315, 115331, + 115341, 115350, 115361, 115370, 115377, 115383, 115393, 115401, 115407, + 115422, 115428, 115433, 115437, 115444, 115452, 115456, 115459, 115465, + 115472, 115478, 115486, 115495, 115503, 115509, 115518, 50546, 115532, + 115537, 115543, 17198, 115548, 115561, 115573, 115582, 115590, 115597, + 115601, 115605, 115608, 115615, 115622, 115630, 115638, 115647, 115655, + 17103, 115663, 115668, 115672, 115684, 115691, 115698, 115707, 936, + 115717, 115726, 115737, 3042, 115741, 115745, 115751, 115764, 115776, + 115786, 115795, 115807, 31225, 115818, 115826, 115835, 115846, 115857, + 115867, 115877, 115885, 115894, 115902, 13175, 115909, 115913, 115916, + 115921, 115926, 115930, 115936, 1236, 115943, 115947, 13838, 115951, + 115962, 115971, 115979, 115988, 115996, 116012, 116023, 116032, 116040, + 116052, 116063, 116079, 116089, 116110, 116124, 116137, 116145, 116152, + 7862, 116165, 116170, 116176, 6523, 116182, 116185, 116192, 116202, 8993, + 116209, 116214, 116219, 116226, 116231, 116239, 116248, 116256, 116261, + 116270, 116277, 11055, 11064, 116283, 116294, 116300, 116305, 116311, + 3058, 3063, 116317, 1025, 116323, 116330, 116337, 116350, 116360, 116365, + 2229, 87, 116373, 116380, 116385, 116393, 116403, 116412, 116418, 116427, + 116435, 116445, 116449, 116453, 116458, 116462, 116474, 3086, 116482, + 116490, 116495, 116506, 116517, 116529, 116540, 116550, 116559, 25362, + 116564, 116570, 116575, 116585, 116595, 116600, 33382, 116606, 116611, + 116620, 25374, 116624, 4651, 8, 116629, 116638, 116645, 116652, 116658, + 116663, 116667, 116673, 33406, 116678, 116683, 70678, 116688, 116693, + 116699, 116705, 116713, 116718, 116726, 116733, 116739, 116744, 46352, + 50440, 116750, 1765, 32, 116760, 116765, 116778, 116783, 116791, 116796, + 116802, 3112, 33461, 116807, 116815, 116822, 116827, 116832, 116841, + 4225, 4236, 71887, 116849, 116853, 1629, 1777, 116858, 116863, 116870, + 33814, 1781, 323, 116877, 116883, 116888, 3134, 116892, 116897, 116904, + 1785, 116909, 116915, 116920, 116932, 6760, 116942, 116949, 1792, 116955, + 116960, 116967, 116974, 116989, 116996, 117007, 117012, 117020, 2677, + 117024, 117036, 117041, 117045, 117051, 33260, 2234, 117055, 117066, + 117070, 117074, 117080, 117084, 117093, 117097, 117108, 117112, 2280, + 37890, 117116, 117126, 117134, 3225, 117140, 117149, 117157, 10454, + 117162, 117170, 117175, 117179, 117188, 117195, 117201, 3195, 17262, + 117205, 117218, 42811, 117236, 117241, 117249, 117257, 117267, 11364, + 15306, 117279, 117292, 117299, 117309, 117323, 117330, 117346, 117353, + 117359, 25412, 14519, 117366, 117373, 117383, 117392, 51230, 117404, + 117412, 51365, 117419, 117422, 117428, 117434, 117440, 117446, 117452, + 117459, 117466, 117472, 117478, 117484, 117490, 117496, 117502, 117508, + 117514, 117520, 117526, 117532, 117538, 117544, 117550, 117556, 117562, + 117568, 117574, 117580, 117586, 117592, 117598, 117604, 117610, 117616, + 117622, 117628, 117634, 117640, 117646, 117652, 117658, 117664, 117670, + 117676, 117682, 117688, 117694, 117700, 117706, 117712, 117718, 117724, + 117730, 117736, 117742, 117748, 117754, 117760, 117766, 117772, 117779, + 117785, 117792, 117799, 117805, 117812, 117819, 117825, 117831, 117837, + 117843, 117849, 117855, 117861, 117867, 117873, 117879, 117885, 117891, + 117897, 117903, 117909, 3209, 10427, 117915, 117925, 117931, 117939, + 117943, 114930, 3213, 117947, 111346, 25115, 14131, 4150, 117951, 3219, + 117955, 117965, 117971, 117977, 117983, 117989, 117995, 118001, 118007, + 118013, 118019, 118025, 118031, 118037, 118043, 118049, 118055, 118061, + 118067, 118073, 118079, 118085, 118091, 118097, 118103, 118109, 118115, + 118122, 118129, 118135, 118141, 118147, 118153, 118159, 118165, 1241, + 118171, 118176, 118181, 118186, 118191, 118196, 118201, 118206, 118211, + 118215, 118219, 118223, 118227, 118231, 118235, 118239, 118243, 118247, + 118253, 118259, 118265, 118271, 118275, 118279, 118283, 118287, 118291, + 118295, 118299, 118303, 118307, 118312, 118317, 118322, 118327, 118332, + 118337, 118342, 118347, 118352, 118357, 118362, 118367, 118372, 118377, + 118382, 118387, 118392, 118397, 118402, 118407, 118412, 118417, 118422, + 118427, 118432, 118437, 118442, 118447, 118452, 118457, 118462, 118467, + 118472, 118477, 118482, 118487, 118492, 118497, 118502, 118507, 118512, + 118517, 118522, 118527, 118532, 118537, 118542, 118547, 118552, 118557, + 118562, 118567, 118572, 118577, 118582, 118587, 118592, 118597, 118602, + 118607, 118612, 118617, 118622, 118627, 118632, 118637, 118642, 118647, + 118652, 118657, 118662, 118667, 118672, 118677, 118682, 118687, 118692, + 118697, 118702, 118707, 118712, 118717, 118722, 118727, 118732, 118737, + 118742, 118747, 118752, 118757, 118762, 118767, 118772, 118777, 118782, + 118787, 118792, 118797, 118802, 118807, 118812, 118817, 118822, 118827, + 118832, 118837, 118842, 118847, 118852, 118857, 118862, 118867, 118872, + 118877, 118882, 118887, 118892, 118897, 118902, 118907, 118912, 118917, + 118922, 118927, 118932, 118937, 118942, 118947, 118952, 118957, 118962, + 118967, 118972, 118977, 118982, 118987, 118992, 118997, 119002, 119007, + 119012, 119017, 119022, 119027, 119032, 119037, 119042, 119047, 119052, + 119057, 119062, 119067, 119072, 119077, 119082, 119087, 119092, 119097, + 119102, 119107, 119112, 119117, 119122, 119127, 119132, 119137, 119142, + 119147, 119152, 119157, 119162, 119167, 119172, 119177, 119182, 119187, + 119192, 119197, 119203, 119208, 119213, 119218, 119223, 119228, 119233, + 119238, 119244, 119249, 119254, 119259, 119264, 119269, 119274, 119279, + 119284, 119289, 119294, 119299, 119304, 119309, 119314, 119319, 119324, + 119329, 119334, 119339, 119344, 119349, 119354, 119359, 119364, 119369, + 119374, 119379, 119384, 119389, 119394, 119399, 119404, 119413, 119418, + 119427, 119432, 119441, 119446, 119455, 119460, 119469, 119474, 119483, + 119488, 119497, 119502, 119511, 119516, 119521, 119530, 119534, 119543, + 119548, 119557, 119562, 119571, 119576, 119585, 119590, 119599, 119604, + 119613, 119618, 119627, 119632, 119641, 119646, 119655, 119660, 119669, + 119674, 119679, 119684, 119689, 119694, 119699, 119704, 119708, 119713, + 119718, 119723, 119728, 119733, 119738, 119744, 119749, 119754, 119759, + 119765, 119769, 119774, 119780, 119785, 119790, 119795, 119800, 119805, + 119810, 119815, 119820, 119825, 119830, 119836, 119841, 119846, 119851, + 119857, 119862, 119867, 119872, 119877, 119883, 119888, 119893, 119898, + 119903, 119908, 119914, 119919, 119924, 119929, 119934, 119939, 119944, + 119949, 119954, 119959, 119964, 119969, 119974, 119979, 119984, 119989, + 119994, 119999, 120004, 120009, 120014, 120019, 120024, 120029, 120035, + 120041, 120047, 120052, 120057, 120062, 120067, 120073, 120079, 120085, + 120090, 120095, 120100, 120106, 120111, 120116, 120121, 120126, 120131, + 120136, 120141, 120146, 120151, 120156, 120161, 120166, 120171, 120176, + 120181, 120186, 120192, 120198, 120204, 120209, 120214, 120219, 120224, + 120230, 120236, 120242, 120247, 120252, 120257, 120262, 120267, 120272, + 120277, 120282, 120287, 18854, 120292, 120298, 120303, 120308, 120313, + 120318, 120323, 120329, 120334, 120339, 120344, 120349, 120354, 120360, + 120365, 120370, 120375, 120380, 120385, 120390, 120395, 120400, 120405, + 120410, 120415, 120420, 120425, 120430, 120435, 120440, 120445, 120450, + 120455, 120460, 120465, 120470, 120476, 120481, 120486, 120491, 120496, + 120501, 120506, 120511, 120516, 120521, 120526, 120531, 120536, 120541, + 120546, 120551, 120556, 120561, 120566, 120571, 120576, 120581, 120586, + 120591, 120596, 120601, 120606, 120611, 120616, 120621, 120626, 120631, + 120636, 120641, 120646, 120651, 120656, 120661, 120666, 120671, 120676, + 120682, 120687, 120692, 120697, 120702, 120707, 120712, 120717, 120722, + 120727, 120732, 120737, 120743, 120748, 120754, 120759, 120764, 120769, + 120774, 120779, 120784, 120790, 120795, 120800, 120806, 120811, 120816, + 120821, 120826, 120831, 120837, 120843, 120848, 120853, 14153, 120858, + 120863, 120868, 120873, 120878, 120883, 120888, 120893, 120898, 120903, + 120908, 120913, 120918, 120923, 120928, 120933, 120938, 120943, 120948, + 120953, 120958, 120963, 120968, 120973, 120978, 120983, 120988, 120993, + 120998, 121003, 121008, 121013, 121018, 121023, 121028, 121033, 121038, + 121043, 121048, 121053, 121058, 121063, 121068, 121073, 121078, 121083, + 121088, 121093, 121098, 121103, 121108, 121113, 121118, 121123, 121128, + 121133, 121138, 121143, 121148, 121153, 121158, 121163, 121168, 121173, + 121178, 121184, 121189, 121194, 121199, 121204, 121210, 121215, 121220, + 121225, 121230, 121235, 121240, 121246, 121251, 121256, 121261, 121266, + 121271, 121277, 121282, 121287, 121292, 121297, 121302, 121308, 121313, + 121318, 121323, 121328, 121333, 121339, 121345, 121350, 121355, 121360, + 121366, 121372, 121378, 121383, 121388, 121394, 121400, 121405, 121411, + 121417, 121423, 121428, 121433, 121439, 121444, 121450, 121455, 121461, + 121470, 121475, 121480, 121486, 121491, 121497, 121502, 121507, 121512, + 121517, 121522, 121527, 121532, 121537, 121542, 121547, 121552, 121557, + 121562, 121567, 121572, 121577, 121582, 121587, 121592, 121597, 121602, + 121607, 121612, 121617, 121622, 121627, 121632, 121637, 121642, 121647, + 121652, 121658, 121664, 121670, 121675, 121680, 121685, 121690, 121695, + 121700, 121705, 121710, 121715, 121720, 121725, 121730, 121735, 121740, + 121745, 121750, 121755, 121760, 121765, 121770, 121776, 121782, 121787, + 121793, 121798, 121803, 121809, 121814, 121820, 121825, 121831, 121836, + 121842, 121847, 121853, 121858, 121863, 121868, 121873, 121878, 121883, + 121888, 117966, 117972, 117978, 117984, 121894, 117990, 117996, 121900, + 118002, 118008, 118014, 118020, 118026, 118032, 118038, 118044, 118050, + 121906, 118056, 118062, 118068, 121912, 118074, 118080, 118086, 118092, + 121918, 118098, 118104, 118110, 118130, 121924, 121930, 118136, 121936, + 118142, 118148, 118154, 118160, 118166, 121942, 3236, 3241, 121947, 3256, + 3261, 3266, 121952, 121955, 121961, 121967, 121974, 121979, 121984, 2285, }; /* code->name phrasebook */ -#define phrasebook_shift 7 -#define phrasebook_short 194 +#define phrasebook_shift 8 +#define phrasebook_short 191 static const unsigned char phrasebook[] = { - 0, 205, 148, 236, 90, 78, 211, 62, 78, 31, 55, 239, 10, 55, 213, 45, 55, - 251, 111, 251, 30, 50, 213, 140, 53, 213, 140, 250, 179, 98, 55, 244, - 159, 231, 6, 234, 217, 204, 226, 205, 177, 17, 195, 79, 17, 100, 17, 102, - 17, 134, 17, 136, 17, 146, 17, 167, 17, 178, 17, 171, 17, 182, 244, 168, - 207, 105, 222, 140, 55, 236, 172, 55, 233, 94, 55, 211, 79, 78, 244, 157, - 250, 168, 8, 6, 1, 63, 8, 6, 1, 250, 112, 8, 6, 1, 247, 207, 8, 6, 1, - 240, 231, 8, 6, 1, 69, 8, 6, 1, 236, 49, 8, 6, 1, 234, 190, 8, 6, 1, 233, - 15, 8, 6, 1, 68, 8, 6, 1, 225, 217, 8, 6, 1, 225, 80, 8, 6, 1, 159, 8, 6, - 1, 221, 136, 8, 6, 1, 218, 55, 8, 6, 1, 72, 8, 6, 1, 214, 3, 8, 6, 1, - 211, 167, 8, 6, 1, 144, 8, 6, 1, 209, 80, 8, 6, 1, 203, 216, 8, 6, 1, 66, - 8, 6, 1, 199, 230, 8, 6, 1, 197, 199, 8, 6, 1, 196, 222, 8, 6, 1, 196, - 148, 8, 6, 1, 195, 158, 50, 47, 179, 210, 90, 205, 177, 53, 47, 179, 244, - 241, 252, 22, 126, 222, 75, 233, 101, 252, 22, 8, 4, 1, 63, 8, 4, 1, 250, - 112, 8, 4, 1, 247, 207, 8, 4, 1, 240, 231, 8, 4, 1, 69, 8, 4, 1, 236, 49, - 8, 4, 1, 234, 190, 8, 4, 1, 233, 15, 8, 4, 1, 68, 8, 4, 1, 225, 217, 8, - 4, 1, 225, 80, 8, 4, 1, 159, 8, 4, 1, 221, 136, 8, 4, 1, 218, 55, 8, 4, - 1, 72, 8, 4, 1, 214, 3, 8, 4, 1, 211, 167, 8, 4, 1, 144, 8, 4, 1, 209, - 80, 8, 4, 1, 203, 216, 8, 4, 1, 66, 8, 4, 1, 199, 230, 8, 4, 1, 197, 199, - 8, 4, 1, 196, 222, 8, 4, 1, 196, 148, 8, 4, 1, 195, 158, 50, 241, 18, - 179, 83, 222, 75, 53, 241, 18, 179, 202, 84, 216, 44, 205, 148, 226, 17, - 236, 90, 78, 247, 39, 55, 212, 63, 55, 241, 17, 55, 196, 60, 55, 248, 33, - 154, 208, 133, 55, 239, 150, 241, 105, 55, 235, 170, 214, 67, 226, 68, - 222, 179, 52, 251, 91, 211, 62, 78, 216, 19, 55, 205, 186, 231, 7, 210, - 149, 55, 220, 114, 239, 231, 55, 212, 124, 55, 204, 95, 102, 204, 95, - 134, 252, 10, 252, 22, 219, 69, 55, 212, 179, 55, 112, 238, 253, 247, 50, - 204, 95, 100, 220, 13, 214, 67, 226, 68, 210, 17, 52, 251, 91, 211, 62, - 78, 197, 217, 191, 97, 211, 87, 197, 217, 191, 97, 232, 225, 197, 217, - 191, 115, 211, 85, 226, 17, 211, 79, 78, 8, 6, 1, 39, 3, 233, 100, 8, 6, - 1, 39, 3, 186, 8, 6, 1, 39, 3, 244, 240, 8, 6, 1, 39, 3, 202, 84, 8, 6, - 1, 39, 3, 239, 150, 8, 6, 1, 39, 3, 210, 3, 57, 8, 6, 1, 251, 245, 8, 6, - 1, 247, 208, 3, 247, 50, 8, 6, 1, 237, 136, 3, 233, 100, 8, 6, 1, 237, - 136, 3, 186, 8, 6, 1, 237, 136, 3, 244, 240, 8, 6, 1, 237, 136, 3, 239, - 150, 8, 6, 1, 230, 249, 3, 233, 100, 8, 6, 1, 230, 249, 3, 186, 8, 6, 1, - 230, 249, 3, 244, 240, 8, 6, 1, 230, 249, 3, 239, 150, 8, 6, 1, 236, 121, - 8, 6, 1, 218, 56, 3, 202, 84, 8, 6, 1, 177, 3, 233, 100, 8, 6, 1, 177, 3, - 186, 8, 6, 1, 177, 3, 244, 240, 8, 6, 1, 177, 3, 202, 84, 8, 6, 1, 177, - 3, 239, 150, 218, 118, 55, 8, 6, 1, 177, 3, 106, 8, 6, 1, 118, 3, 233, - 100, 8, 6, 1, 118, 3, 186, 8, 6, 1, 118, 3, 244, 240, 8, 6, 1, 118, 3, - 239, 150, 8, 6, 1, 196, 149, 3, 186, 8, 6, 1, 202, 162, 8, 4, 1, 207, 13, - 209, 80, 8, 4, 1, 39, 3, 233, 100, 8, 4, 1, 39, 3, 186, 8, 4, 1, 39, 3, - 244, 240, 8, 4, 1, 39, 3, 202, 84, 8, 4, 1, 39, 3, 239, 150, 8, 4, 1, 39, - 3, 210, 3, 57, 8, 4, 1, 251, 245, 8, 4, 1, 247, 208, 3, 247, 50, 8, 4, 1, - 237, 136, 3, 233, 100, 8, 4, 1, 237, 136, 3, 186, 8, 4, 1, 237, 136, 3, - 244, 240, 8, 4, 1, 237, 136, 3, 239, 150, 8, 4, 1, 230, 249, 3, 233, 100, - 8, 4, 1, 230, 249, 3, 186, 8, 4, 1, 230, 249, 3, 244, 240, 8, 4, 1, 230, - 249, 3, 239, 150, 8, 4, 1, 236, 121, 8, 4, 1, 218, 56, 3, 202, 84, 8, 4, - 1, 177, 3, 233, 100, 8, 4, 1, 177, 3, 186, 8, 4, 1, 177, 3, 244, 240, 8, - 4, 1, 177, 3, 202, 84, 8, 4, 1, 177, 3, 239, 150, 239, 54, 55, 8, 4, 1, - 177, 3, 106, 8, 4, 1, 118, 3, 233, 100, 8, 4, 1, 118, 3, 186, 8, 4, 1, - 118, 3, 244, 240, 8, 4, 1, 118, 3, 239, 150, 8, 4, 1, 196, 149, 3, 186, - 8, 4, 1, 202, 162, 8, 4, 1, 196, 149, 3, 239, 150, 8, 6, 1, 39, 3, 220, - 114, 8, 4, 1, 39, 3, 220, 114, 8, 6, 1, 39, 3, 248, 47, 8, 4, 1, 39, 3, - 248, 47, 8, 6, 1, 39, 3, 214, 151, 8, 4, 1, 39, 3, 214, 151, 8, 6, 1, - 247, 208, 3, 186, 8, 4, 1, 247, 208, 3, 186, 8, 6, 1, 247, 208, 3, 244, - 240, 8, 4, 1, 247, 208, 3, 244, 240, 8, 6, 1, 247, 208, 3, 76, 57, 8, 4, - 1, 247, 208, 3, 76, 57, 8, 6, 1, 247, 208, 3, 247, 106, 8, 4, 1, 247, - 208, 3, 247, 106, 8, 6, 1, 240, 232, 3, 247, 106, 8, 4, 1, 240, 232, 3, - 247, 106, 8, 6, 1, 240, 232, 3, 106, 8, 4, 1, 240, 232, 3, 106, 8, 6, 1, - 237, 136, 3, 220, 114, 8, 4, 1, 237, 136, 3, 220, 114, 8, 6, 1, 237, 136, - 3, 248, 47, 8, 4, 1, 237, 136, 3, 248, 47, 8, 6, 1, 237, 136, 3, 76, 57, - 8, 4, 1, 237, 136, 3, 76, 57, 8, 6, 1, 237, 136, 3, 214, 151, 8, 4, 1, - 237, 136, 3, 214, 151, 8, 6, 1, 237, 136, 3, 247, 106, 8, 4, 1, 237, 136, - 3, 247, 106, 8, 6, 1, 234, 191, 3, 244, 240, 8, 4, 1, 234, 191, 3, 244, - 240, 8, 6, 1, 234, 191, 3, 248, 47, 8, 4, 1, 234, 191, 3, 248, 47, 8, 6, - 1, 234, 191, 3, 76, 57, 8, 4, 1, 234, 191, 3, 76, 57, 8, 6, 1, 234, 191, - 3, 247, 50, 8, 4, 1, 234, 191, 3, 247, 50, 8, 6, 1, 233, 16, 3, 244, 240, - 8, 4, 1, 233, 16, 3, 244, 240, 8, 6, 1, 233, 16, 3, 106, 8, 4, 1, 233, - 16, 3, 106, 8, 6, 1, 230, 249, 3, 202, 84, 8, 4, 1, 230, 249, 3, 202, 84, - 8, 6, 1, 230, 249, 3, 220, 114, 8, 4, 1, 230, 249, 3, 220, 114, 8, 6, 1, - 230, 249, 3, 248, 47, 8, 4, 1, 230, 249, 3, 248, 47, 8, 6, 1, 230, 249, - 3, 214, 151, 8, 4, 1, 230, 249, 3, 214, 151, 8, 6, 1, 230, 249, 3, 76, - 57, 8, 4, 1, 238, 252, 68, 8, 6, 33, 226, 118, 8, 4, 33, 226, 118, 8, 6, - 1, 225, 218, 3, 244, 240, 8, 4, 1, 225, 218, 3, 244, 240, 8, 6, 1, 225, - 81, 3, 247, 50, 8, 4, 1, 225, 81, 3, 247, 50, 8, 4, 1, 223, 210, 8, 6, 1, - 223, 100, 3, 186, 8, 4, 1, 223, 100, 3, 186, 8, 6, 1, 223, 100, 3, 247, - 50, 8, 4, 1, 223, 100, 3, 247, 50, 8, 6, 1, 223, 100, 3, 247, 106, 8, 4, - 1, 223, 100, 3, 247, 106, 8, 6, 1, 223, 100, 3, 112, 238, 253, 8, 4, 1, - 223, 100, 3, 112, 238, 253, 8, 6, 1, 223, 100, 3, 106, 8, 4, 1, 223, 100, - 3, 106, 8, 6, 1, 218, 56, 3, 186, 8, 4, 1, 218, 56, 3, 186, 8, 6, 1, 218, - 56, 3, 247, 50, 8, 4, 1, 218, 56, 3, 247, 50, 8, 6, 1, 218, 56, 3, 247, - 106, 8, 4, 1, 218, 56, 3, 247, 106, 8, 4, 1, 218, 56, 212, 37, 247, 219, - 251, 30, 8, 6, 1, 236, 215, 8, 4, 1, 236, 215, 8, 6, 1, 177, 3, 220, 114, - 8, 4, 1, 177, 3, 220, 114, 8, 6, 1, 177, 3, 248, 47, 8, 4, 1, 177, 3, - 248, 47, 8, 6, 1, 177, 3, 52, 186, 8, 4, 1, 177, 3, 52, 186, 8, 6, 33, - 214, 164, 8, 4, 33, 214, 164, 8, 6, 1, 211, 32, 3, 186, 8, 4, 1, 211, 32, - 3, 186, 8, 6, 1, 211, 32, 3, 247, 50, 8, 4, 1, 211, 32, 3, 247, 50, 8, 6, - 1, 211, 32, 3, 247, 106, 8, 4, 1, 211, 32, 3, 247, 106, 8, 6, 1, 209, 81, - 3, 186, 8, 4, 1, 209, 81, 3, 186, 8, 6, 1, 209, 81, 3, 244, 240, 8, 4, 1, - 209, 81, 3, 244, 240, 8, 6, 1, 209, 81, 3, 247, 50, 8, 4, 1, 209, 81, 3, - 247, 50, 8, 6, 1, 209, 81, 3, 247, 106, 8, 4, 1, 209, 81, 3, 247, 106, 8, - 6, 1, 203, 217, 3, 247, 50, 8, 4, 1, 203, 217, 3, 247, 50, 8, 6, 1, 203, - 217, 3, 247, 106, 8, 4, 1, 203, 217, 3, 247, 106, 8, 6, 1, 203, 217, 3, - 106, 8, 4, 1, 203, 217, 3, 106, 8, 6, 1, 118, 3, 202, 84, 8, 4, 1, 118, - 3, 202, 84, 8, 6, 1, 118, 3, 220, 114, 8, 4, 1, 118, 3, 220, 114, 8, 6, - 1, 118, 3, 248, 47, 8, 4, 1, 118, 3, 248, 47, 8, 6, 1, 118, 3, 210, 3, - 57, 8, 4, 1, 118, 3, 210, 3, 57, 8, 6, 1, 118, 3, 52, 186, 8, 4, 1, 118, - 3, 52, 186, 8, 6, 1, 118, 3, 214, 151, 8, 4, 1, 118, 3, 214, 151, 8, 6, - 1, 197, 200, 3, 244, 240, 8, 4, 1, 197, 200, 3, 244, 240, 8, 6, 1, 196, - 149, 3, 244, 240, 8, 4, 1, 196, 149, 3, 244, 240, 8, 6, 1, 196, 149, 3, - 239, 150, 8, 6, 1, 195, 159, 3, 186, 8, 4, 1, 195, 159, 3, 186, 8, 6, 1, - 195, 159, 3, 76, 57, 8, 4, 1, 195, 159, 3, 76, 57, 8, 6, 1, 195, 159, 3, - 247, 106, 8, 4, 1, 195, 159, 3, 247, 106, 8, 4, 1, 181, 209, 80, 8, 4, 1, - 74, 3, 106, 8, 6, 1, 74, 3, 122, 8, 6, 1, 74, 3, 201, 240, 8, 4, 1, 74, - 3, 201, 240, 8, 6, 1, 152, 167, 8, 4, 1, 152, 167, 8, 6, 1, 192, 72, 8, - 6, 1, 247, 208, 3, 122, 8, 4, 1, 247, 208, 3, 122, 8, 6, 1, 251, 220, - 240, 231, 8, 6, 1, 240, 232, 3, 122, 8, 6, 1, 240, 232, 3, 201, 240, 8, - 4, 1, 240, 232, 3, 201, 240, 8, 4, 1, 163, 239, 212, 8, 6, 1, 210, 89, - 69, 8, 6, 1, 208, 163, 8, 6, 1, 192, 69, 8, 6, 1, 236, 50, 3, 122, 8, 4, - 1, 236, 50, 3, 122, 8, 6, 1, 234, 191, 3, 122, 8, 6, 1, 234, 94, 8, 4, 1, - 231, 44, 8, 6, 1, 226, 7, 8, 6, 1, 230, 249, 3, 106, 8, 6, 1, 225, 81, 3, - 122, 8, 4, 1, 225, 81, 3, 122, 8, 4, 1, 223, 100, 3, 154, 8, 4, 1, 222, - 247, 3, 106, 8, 6, 1, 163, 221, 136, 8, 6, 1, 218, 56, 3, 50, 122, 8, 4, - 1, 218, 56, 3, 181, 53, 222, 172, 8, 6, 1, 177, 3, 112, 202, 84, 8, 6, 1, - 177, 3, 231, 102, 8, 4, 1, 177, 3, 231, 102, 8, 6, 1, 214, 146, 8, 4, 1, - 214, 146, 8, 6, 1, 214, 4, 3, 122, 8, 4, 1, 214, 4, 3, 122, 8, 1, 195, - 220, 8, 6, 1, 152, 102, 8, 4, 1, 152, 102, 8, 6, 1, 236, 141, 8, 1, 210, - 89, 236, 142, 221, 225, 8, 4, 1, 203, 217, 3, 213, 215, 122, 8, 6, 1, - 203, 217, 3, 122, 8, 4, 1, 203, 217, 3, 122, 8, 6, 1, 203, 217, 3, 210, - 95, 122, 8, 6, 1, 118, 3, 231, 102, 8, 4, 1, 118, 3, 231, 102, 8, 6, 1, - 200, 28, 8, 6, 1, 199, 231, 3, 122, 8, 6, 1, 196, 149, 3, 122, 8, 4, 1, - 196, 149, 3, 122, 8, 6, 1, 195, 159, 3, 106, 8, 4, 1, 195, 159, 3, 106, - 8, 6, 1, 236, 52, 8, 6, 1, 236, 53, 210, 88, 8, 4, 1, 236, 53, 210, 88, - 8, 4, 1, 236, 53, 3, 203, 135, 8, 1, 99, 3, 106, 8, 6, 1, 152, 146, 8, 4, - 1, 152, 146, 8, 1, 226, 17, 233, 152, 204, 227, 3, 106, 8, 1, 196, 225, - 8, 1, 239, 205, 244, 215, 8, 1, 222, 218, 244, 215, 8, 1, 251, 124, 244, - 215, 8, 1, 210, 95, 244, 215, 8, 6, 1, 237, 158, 3, 247, 106, 8, 6, 1, - 240, 232, 3, 4, 1, 195, 159, 3, 247, 106, 8, 4, 1, 237, 158, 3, 247, 106, - 8, 6, 1, 222, 41, 8, 6, 1, 223, 100, 3, 4, 1, 225, 217, 8, 4, 1, 222, 41, - 8, 6, 1, 216, 165, 8, 6, 1, 218, 56, 3, 4, 1, 225, 217, 8, 4, 1, 216, - 165, 8, 6, 1, 39, 3, 247, 106, 8, 4, 1, 39, 3, 247, 106, 8, 6, 1, 230, - 249, 3, 247, 106, 8, 4, 1, 230, 249, 3, 247, 106, 8, 6, 1, 177, 3, 247, - 106, 8, 4, 1, 177, 3, 247, 106, 8, 6, 1, 118, 3, 247, 106, 8, 4, 1, 118, - 3, 247, 106, 8, 6, 1, 118, 3, 239, 151, 26, 220, 114, 8, 4, 1, 118, 3, - 239, 151, 26, 220, 114, 8, 6, 1, 118, 3, 239, 151, 26, 186, 8, 4, 1, 118, - 3, 239, 151, 26, 186, 8, 6, 1, 118, 3, 239, 151, 26, 247, 106, 8, 4, 1, - 118, 3, 239, 151, 26, 247, 106, 8, 6, 1, 118, 3, 239, 151, 26, 233, 100, - 8, 4, 1, 118, 3, 239, 151, 26, 233, 100, 8, 4, 1, 163, 69, 8, 6, 1, 39, - 3, 239, 151, 26, 220, 114, 8, 4, 1, 39, 3, 239, 151, 26, 220, 114, 8, 6, - 1, 39, 3, 76, 90, 26, 220, 114, 8, 4, 1, 39, 3, 76, 90, 26, 220, 114, 8, - 6, 1, 251, 246, 3, 220, 114, 8, 4, 1, 251, 246, 3, 220, 114, 8, 6, 1, - 234, 191, 3, 106, 8, 4, 1, 234, 191, 3, 106, 8, 6, 1, 234, 191, 3, 247, - 106, 8, 4, 1, 234, 191, 3, 247, 106, 8, 6, 1, 225, 81, 3, 247, 106, 8, 4, - 1, 225, 81, 3, 247, 106, 8, 6, 1, 177, 3, 214, 151, 8, 4, 1, 177, 3, 214, - 151, 8, 6, 1, 177, 3, 214, 152, 26, 220, 114, 8, 4, 1, 177, 3, 214, 152, - 26, 220, 114, 8, 6, 1, 236, 53, 3, 247, 106, 8, 4, 1, 236, 53, 3, 247, - 106, 8, 4, 1, 225, 218, 3, 247, 106, 8, 6, 1, 237, 157, 8, 6, 1, 240, - 232, 3, 4, 1, 195, 158, 8, 4, 1, 237, 157, 8, 6, 1, 234, 191, 3, 186, 8, - 4, 1, 234, 191, 3, 186, 8, 6, 1, 231, 41, 8, 6, 1, 196, 225, 8, 6, 1, - 218, 56, 3, 233, 100, 8, 4, 1, 218, 56, 3, 233, 100, 8, 6, 1, 39, 3, 210, - 3, 90, 26, 186, 8, 4, 1, 39, 3, 210, 3, 90, 26, 186, 8, 6, 1, 251, 246, - 3, 186, 8, 4, 1, 251, 246, 3, 186, 8, 6, 1, 177, 3, 204, 196, 26, 186, 8, - 4, 1, 177, 3, 204, 196, 26, 186, 8, 6, 1, 39, 3, 52, 233, 100, 8, 4, 1, - 39, 3, 52, 233, 100, 8, 6, 1, 39, 3, 226, 17, 248, 47, 8, 4, 1, 39, 3, - 226, 17, 248, 47, 8, 6, 1, 237, 136, 3, 52, 233, 100, 8, 4, 1, 237, 136, - 3, 52, 233, 100, 8, 6, 1, 237, 136, 3, 226, 17, 248, 47, 8, 4, 1, 237, - 136, 3, 226, 17, 248, 47, 8, 6, 1, 230, 249, 3, 52, 233, 100, 8, 4, 1, - 230, 249, 3, 52, 233, 100, 8, 6, 1, 230, 249, 3, 226, 17, 248, 47, 8, 4, - 1, 230, 249, 3, 226, 17, 248, 47, 8, 6, 1, 177, 3, 52, 233, 100, 8, 4, 1, - 177, 3, 52, 233, 100, 8, 6, 1, 177, 3, 226, 17, 248, 47, 8, 4, 1, 177, 3, - 226, 17, 248, 47, 8, 6, 1, 211, 32, 3, 52, 233, 100, 8, 4, 1, 211, 32, 3, - 52, 233, 100, 8, 6, 1, 211, 32, 3, 226, 17, 248, 47, 8, 4, 1, 211, 32, 3, - 226, 17, 248, 47, 8, 6, 1, 118, 3, 52, 233, 100, 8, 4, 1, 118, 3, 52, - 233, 100, 8, 6, 1, 118, 3, 226, 17, 248, 47, 8, 4, 1, 118, 3, 226, 17, - 248, 47, 8, 6, 1, 209, 81, 3, 244, 160, 60, 8, 4, 1, 209, 81, 3, 244, - 160, 60, 8, 6, 1, 203, 217, 3, 244, 160, 60, 8, 4, 1, 203, 217, 3, 244, - 160, 60, 8, 6, 1, 195, 239, 8, 4, 1, 195, 239, 8, 6, 1, 233, 16, 3, 247, - 106, 8, 4, 1, 233, 16, 3, 247, 106, 8, 6, 1, 218, 56, 3, 181, 53, 222, - 172, 8, 4, 1, 240, 232, 3, 241, 21, 8, 6, 1, 214, 39, 8, 4, 1, 214, 39, - 8, 6, 1, 195, 159, 3, 122, 8, 4, 1, 195, 159, 3, 122, 8, 6, 1, 39, 3, 76, - 57, 8, 4, 1, 39, 3, 76, 57, 8, 6, 1, 237, 136, 3, 247, 50, 8, 4, 1, 237, - 136, 3, 247, 50, 8, 6, 1, 177, 3, 239, 151, 26, 220, 114, 8, 4, 1, 177, - 3, 239, 151, 26, 220, 114, 8, 6, 1, 177, 3, 202, 85, 26, 220, 114, 8, 4, - 1, 177, 3, 202, 85, 26, 220, 114, 8, 6, 1, 177, 3, 76, 57, 8, 4, 1, 177, - 3, 76, 57, 8, 6, 1, 177, 3, 76, 90, 26, 220, 114, 8, 4, 1, 177, 3, 76, - 90, 26, 220, 114, 8, 6, 1, 196, 149, 3, 220, 114, 8, 4, 1, 196, 149, 3, - 220, 114, 8, 4, 1, 223, 100, 3, 241, 21, 8, 4, 1, 218, 56, 3, 241, 21, 8, - 4, 1, 203, 217, 3, 241, 21, 8, 4, 1, 238, 252, 225, 217, 8, 4, 1, 240, - 51, 239, 110, 8, 4, 1, 211, 98, 239, 110, 8, 6, 1, 39, 3, 106, 8, 6, 1, - 247, 208, 3, 106, 8, 4, 1, 247, 208, 3, 106, 8, 6, 1, 223, 100, 3, 154, - 8, 6, 1, 203, 217, 3, 239, 147, 106, 8, 4, 1, 209, 81, 3, 204, 63, 203, - 135, 8, 4, 1, 195, 159, 3, 204, 63, 203, 135, 8, 6, 1, 233, 152, 204, - 226, 8, 4, 1, 233, 152, 204, 226, 8, 6, 1, 74, 3, 106, 8, 6, 1, 118, 154, - 8, 6, 1, 163, 199, 230, 8, 6, 1, 237, 136, 3, 106, 8, 4, 1, 237, 136, 3, - 106, 8, 6, 1, 225, 218, 3, 106, 8, 4, 1, 225, 218, 3, 106, 8, 6, 1, 4, - 211, 168, 3, 231, 165, 203, 135, 8, 4, 1, 211, 168, 3, 231, 165, 203, - 135, 8, 6, 1, 211, 32, 3, 106, 8, 4, 1, 211, 32, 3, 106, 8, 6, 1, 196, - 149, 3, 106, 8, 4, 1, 196, 149, 3, 106, 8, 4, 1, 163, 63, 8, 4, 1, 251, - 134, 8, 4, 1, 163, 251, 134, 8, 4, 1, 74, 3, 122, 8, 4, 1, 192, 72, 8, 4, - 1, 247, 208, 3, 241, 21, 8, 4, 1, 240, 232, 3, 203, 135, 8, 4, 1, 240, - 232, 3, 122, 8, 4, 1, 210, 89, 69, 8, 4, 1, 208, 163, 8, 4, 1, 208, 164, - 3, 122, 8, 4, 1, 192, 69, 8, 4, 1, 210, 89, 192, 69, 8, 4, 1, 210, 89, - 192, 237, 136, 3, 122, 8, 4, 1, 244, 203, 210, 89, 192, 69, 8, 4, 1, 238, - 252, 225, 218, 3, 106, 8, 4, 1, 234, 191, 3, 122, 8, 4, 1, 145, 234, 190, - 8, 1, 4, 6, 234, 190, 8, 4, 1, 234, 94, 8, 4, 1, 210, 208, 231, 102, 8, - 4, 1, 163, 233, 15, 8, 4, 1, 233, 16, 3, 122, 8, 4, 1, 232, 100, 3, 122, - 8, 4, 1, 230, 249, 3, 106, 8, 4, 1, 226, 7, 8, 1, 4, 6, 68, 8, 4, 1, 223, - 100, 3, 112, 202, 84, 8, 4, 1, 223, 100, 3, 248, 225, 8, 4, 1, 223, 100, - 3, 210, 95, 122, 8, 4, 1, 222, 125, 8, 4, 1, 163, 221, 136, 8, 4, 1, 163, - 221, 137, 3, 181, 222, 172, 8, 4, 1, 221, 137, 3, 122, 8, 4, 1, 218, 56, - 3, 50, 122, 8, 4, 1, 218, 56, 3, 210, 95, 122, 8, 1, 4, 6, 218, 55, 8, 4, - 1, 249, 74, 72, 8, 1, 4, 6, 214, 164, 8, 4, 1, 244, 203, 214, 124, 8, 4, - 1, 212, 246, 8, 4, 1, 163, 144, 8, 4, 1, 163, 211, 32, 3, 181, 222, 172, - 8, 4, 1, 163, 211, 32, 3, 122, 8, 4, 1, 211, 32, 3, 181, 222, 172, 8, 4, - 1, 211, 32, 3, 203, 135, 8, 4, 1, 211, 32, 3, 235, 108, 8, 4, 1, 210, 89, - 211, 32, 3, 235, 108, 8, 1, 4, 6, 144, 8, 1, 4, 6, 226, 17, 144, 8, 4, 1, - 209, 81, 3, 122, 8, 4, 1, 236, 141, 8, 4, 1, 238, 252, 225, 218, 3, 204, - 196, 26, 122, 8, 4, 1, 205, 91, 210, 89, 236, 141, 8, 4, 1, 236, 142, 3, - 241, 21, 8, 4, 1, 163, 203, 216, 8, 4, 1, 203, 217, 3, 210, 95, 122, 8, - 4, 1, 118, 154, 8, 4, 1, 200, 28, 8, 4, 1, 199, 231, 3, 122, 8, 4, 1, - 163, 199, 230, 8, 4, 1, 163, 197, 199, 8, 4, 1, 163, 196, 148, 8, 1, 4, - 6, 196, 148, 8, 4, 1, 195, 159, 3, 210, 95, 122, 8, 4, 1, 195, 159, 3, - 241, 21, 8, 4, 1, 236, 52, 8, 4, 1, 236, 53, 3, 241, 21, 8, 1, 233, 152, - 204, 226, 8, 1, 212, 253, 198, 244, 234, 241, 8, 1, 226, 17, 233, 152, - 204, 226, 8, 1, 204, 204, 247, 207, 8, 1, 248, 168, 244, 215, 8, 1, 4, 6, - 250, 112, 8, 4, 1, 244, 203, 192, 69, 8, 1, 4, 6, 234, 191, 3, 122, 8, 1, - 4, 6, 233, 15, 8, 4, 1, 225, 218, 3, 241, 57, 8, 4, 1, 163, 225, 80, 8, - 1, 4, 6, 159, 8, 4, 1, 211, 168, 3, 122, 8, 1, 233, 152, 204, 227, 3, - 106, 8, 1, 210, 89, 233, 152, 204, 227, 3, 106, 8, 4, 1, 237, 158, 239, - 110, 8, 4, 1, 239, 178, 239, 110, 8, 4, 1, 237, 158, 239, 111, 3, 241, - 21, 8, 4, 1, 201, 115, 239, 110, 8, 4, 1, 203, 7, 239, 110, 8, 4, 1, 203, - 75, 239, 111, 3, 241, 21, 8, 4, 1, 235, 167, 239, 110, 8, 4, 1, 221, 193, - 239, 110, 8, 4, 1, 221, 138, 239, 110, 8, 1, 248, 168, 213, 44, 8, 1, - 248, 176, 213, 44, 8, 4, 1, 163, 233, 16, 3, 235, 108, 8, 4, 1, 163, 233, - 16, 3, 235, 109, 26, 203, 135, 73, 1, 4, 233, 15, 73, 1, 4, 233, 16, 3, - 122, 73, 1, 4, 225, 217, 73, 1, 4, 144, 73, 1, 4, 163, 144, 73, 1, 4, - 163, 211, 32, 3, 122, 73, 1, 4, 6, 226, 17, 144, 73, 1, 4, 197, 199, 73, - 1, 4, 196, 148, 73, 1, 212, 19, 73, 1, 52, 212, 19, 73, 1, 163, 244, 159, - 73, 1, 251, 30, 73, 1, 210, 89, 244, 159, 73, 1, 53, 157, 210, 2, 73, 1, - 50, 157, 210, 2, 73, 1, 233, 152, 204, 226, 73, 1, 210, 89, 233, 152, - 204, 226, 73, 1, 50, 250, 217, 73, 1, 53, 250, 217, 73, 1, 124, 250, 217, - 73, 1, 135, 250, 217, 73, 1, 244, 241, 252, 22, 247, 106, 73, 1, 83, 222, - 75, 73, 1, 220, 114, 73, 1, 252, 10, 252, 22, 73, 1, 233, 101, 252, 22, - 73, 1, 126, 83, 222, 75, 73, 1, 126, 220, 114, 73, 1, 126, 233, 101, 252, - 22, 73, 1, 126, 252, 10, 252, 22, 73, 1, 201, 177, 244, 168, 73, 1, 157, - 201, 177, 244, 168, 73, 1, 247, 35, 53, 157, 210, 2, 73, 1, 247, 35, 50, - 157, 210, 2, 73, 1, 124, 203, 147, 73, 1, 135, 203, 147, 73, 1, 98, 55, - 73, 1, 219, 16, 55, 248, 47, 76, 57, 210, 3, 57, 214, 151, 4, 202, 84, - 52, 252, 10, 252, 22, 73, 1, 210, 73, 122, 73, 1, 241, 62, 252, 22, 73, - 1, 4, 234, 94, 73, 1, 4, 159, 73, 1, 4, 209, 80, 73, 1, 4, 196, 222, 73, - 1, 4, 210, 89, 233, 152, 204, 226, 73, 1, 236, 74, 152, 154, 73, 1, 130, - 152, 154, 73, 1, 219, 65, 152, 154, 73, 1, 126, 152, 154, 73, 1, 236, 73, - 152, 154, 73, 1, 196, 13, 239, 202, 152, 78, 73, 1, 196, 96, 239, 202, - 152, 78, 73, 1, 198, 242, 73, 1, 200, 68, 73, 1, 52, 251, 30, 73, 1, 126, - 135, 250, 217, 73, 1, 126, 124, 250, 217, 73, 1, 126, 50, 250, 217, 73, - 1, 126, 53, 250, 217, 73, 1, 126, 210, 2, 73, 1, 112, 233, 101, 252, 22, - 73, 1, 112, 52, 233, 101, 252, 22, 73, 1, 112, 52, 252, 10, 252, 22, 73, - 1, 126, 202, 84, 73, 1, 210, 215, 244, 168, 73, 1, 248, 243, 130, 202, - 11, 73, 1, 236, 222, 130, 202, 11, 73, 1, 248, 243, 126, 202, 11, 73, 1, - 236, 222, 126, 202, 11, 73, 1, 206, 246, 73, 1, 192, 206, 246, 73, 1, - 126, 50, 51, 38, 233, 101, 252, 22, 38, 252, 10, 252, 22, 38, 244, 241, - 252, 22, 38, 202, 84, 38, 220, 114, 38, 214, 19, 38, 248, 47, 38, 76, 57, - 38, 239, 150, 38, 231, 165, 57, 38, 210, 3, 57, 38, 52, 252, 10, 252, 22, - 38, 247, 106, 38, 83, 222, 76, 57, 38, 52, 83, 222, 76, 57, 38, 52, 233, - 101, 252, 22, 38, 247, 133, 38, 226, 17, 248, 47, 38, 163, 244, 160, 57, - 38, 244, 160, 57, 38, 210, 89, 244, 160, 57, 38, 244, 160, 90, 210, 22, - 38, 233, 101, 252, 23, 60, 38, 252, 10, 252, 23, 60, 38, 50, 203, 148, - 60, 38, 53, 203, 148, 60, 38, 50, 251, 91, 57, 38, 231, 102, 38, 50, 157, - 210, 3, 60, 38, 124, 203, 148, 60, 38, 135, 203, 148, 60, 38, 98, 2, 60, - 38, 219, 16, 2, 60, 38, 213, 213, 231, 165, 60, 38, 210, 95, 231, 165, - 60, 38, 76, 60, 38, 239, 151, 60, 38, 210, 3, 60, 38, 244, 160, 60, 38, - 247, 50, 38, 214, 151, 38, 83, 222, 76, 60, 38, 248, 40, 60, 38, 226, 17, - 52, 250, 252, 60, 38, 247, 107, 60, 38, 244, 241, 252, 23, 60, 38, 248, - 48, 60, 38, 226, 17, 248, 48, 60, 38, 202, 85, 60, 38, 220, 115, 60, 38, - 126, 222, 75, 38, 52, 126, 222, 75, 38, 202, 85, 214, 20, 38, 206, 182, - 204, 196, 214, 20, 38, 181, 204, 196, 214, 20, 38, 206, 182, 205, 178, - 214, 20, 38, 181, 205, 178, 214, 20, 38, 53, 157, 210, 3, 60, 38, 226, - 17, 248, 40, 60, 38, 47, 60, 38, 208, 141, 60, 38, 196, 223, 57, 38, 83, - 202, 84, 38, 52, 214, 19, 38, 233, 101, 152, 78, 38, 252, 10, 152, 78, - 38, 32, 213, 38, 38, 32, 223, 232, 38, 32, 239, 144, 201, 248, 38, 32, - 195, 225, 38, 248, 40, 57, 38, 236, 172, 2, 60, 38, 52, 83, 222, 76, 60, - 38, 50, 251, 91, 60, 38, 216, 19, 202, 85, 57, 38, 231, 171, 57, 38, 251, - 139, 180, 202, 30, 57, 38, 50, 53, 61, 60, 38, 200, 24, 61, 60, 38, 233, - 107, 225, 124, 38, 53, 250, 218, 57, 38, 50, 157, 210, 3, 57, 38, 235, - 164, 38, 196, 223, 60, 38, 50, 250, 218, 60, 38, 53, 250, 218, 60, 38, - 53, 250, 218, 26, 124, 250, 218, 60, 38, 53, 157, 210, 3, 57, 38, 76, 90, - 210, 22, 38, 250, 180, 60, 38, 52, 210, 3, 60, 38, 195, 24, 57, 38, 52, - 248, 48, 60, 38, 52, 248, 47, 38, 52, 220, 114, 38, 52, 220, 115, 60, 38, - 52, 202, 84, 38, 52, 226, 17, 248, 47, 38, 52, 91, 61, 60, 38, 8, 4, 1, - 63, 38, 8, 4, 1, 69, 38, 8, 4, 1, 68, 38, 8, 4, 1, 72, 38, 8, 4, 1, 66, - 38, 8, 4, 1, 247, 207, 38, 8, 4, 1, 240, 231, 38, 8, 4, 1, 233, 15, 38, - 8, 4, 1, 221, 136, 38, 8, 4, 1, 144, 38, 8, 4, 1, 203, 216, 38, 8, 4, 1, - 199, 230, 38, 8, 4, 1, 196, 222, 32, 6, 1, 232, 88, 32, 4, 1, 232, 88, - 32, 6, 1, 250, 251, 208, 222, 32, 4, 1, 250, 251, 208, 222, 32, 215, 142, - 55, 32, 221, 203, 215, 142, 55, 32, 6, 1, 213, 196, 239, 118, 32, 4, 1, - 213, 196, 239, 118, 32, 195, 225, 32, 4, 210, 89, 221, 173, 206, 87, 105, - 32, 4, 237, 250, 221, 173, 206, 87, 105, 32, 4, 210, 89, 237, 250, 221, - 173, 206, 87, 105, 32, 211, 79, 78, 32, 6, 1, 195, 232, 32, 201, 248, 32, - 239, 144, 201, 248, 32, 6, 1, 251, 135, 3, 201, 248, 32, 251, 74, 203, - 35, 32, 6, 1, 236, 175, 3, 201, 248, 32, 6, 1, 236, 127, 3, 201, 248, 32, - 6, 1, 226, 8, 3, 201, 248, 32, 6, 1, 214, 123, 3, 201, 248, 32, 6, 1, - 200, 29, 3, 201, 248, 32, 6, 1, 214, 125, 3, 201, 248, 32, 4, 1, 226, 8, - 3, 239, 144, 26, 201, 248, 32, 6, 1, 251, 134, 32, 6, 1, 248, 206, 32, 6, - 1, 234, 94, 32, 6, 1, 239, 212, 32, 6, 1, 236, 174, 32, 6, 1, 195, 78, - 32, 6, 1, 236, 126, 32, 6, 1, 202, 199, 32, 6, 1, 226, 7, 32, 6, 1, 225, - 2, 32, 6, 1, 222, 245, 32, 6, 1, 218, 145, 32, 6, 1, 215, 186, 32, 6, 1, - 196, 196, 32, 6, 1, 214, 122, 32, 6, 1, 212, 220, 32, 6, 1, 210, 74, 32, - 6, 1, 206, 86, 32, 6, 1, 203, 89, 32, 6, 1, 200, 28, 32, 6, 1, 212, 246, - 32, 6, 1, 245, 75, 32, 6, 1, 211, 238, 32, 6, 1, 214, 124, 32, 6, 1, 226, - 8, 3, 239, 143, 32, 6, 1, 200, 29, 3, 239, 143, 32, 4, 1, 251, 135, 3, - 201, 248, 32, 4, 1, 236, 175, 3, 201, 248, 32, 4, 1, 236, 127, 3, 201, - 248, 32, 4, 1, 226, 8, 3, 201, 248, 32, 4, 1, 200, 29, 3, 239, 144, 26, - 201, 248, 32, 4, 1, 251, 134, 32, 4, 1, 248, 206, 32, 4, 1, 234, 94, 32, - 4, 1, 239, 212, 32, 4, 1, 236, 174, 32, 4, 1, 195, 78, 32, 4, 1, 236, - 126, 32, 4, 1, 202, 199, 32, 4, 1, 226, 7, 32, 4, 1, 225, 2, 32, 4, 1, - 222, 245, 32, 4, 1, 218, 145, 32, 4, 1, 215, 186, 32, 4, 1, 196, 196, 32, - 4, 1, 214, 122, 32, 4, 1, 212, 220, 32, 4, 1, 210, 74, 32, 4, 1, 48, 206, - 86, 32, 4, 1, 206, 86, 32, 4, 1, 203, 89, 32, 4, 1, 200, 28, 32, 4, 1, - 212, 246, 32, 4, 1, 245, 75, 32, 4, 1, 211, 238, 32, 4, 1, 214, 124, 32, - 4, 1, 226, 8, 3, 239, 143, 32, 4, 1, 200, 29, 3, 239, 143, 32, 4, 1, 214, - 123, 3, 201, 248, 32, 4, 1, 200, 29, 3, 201, 248, 32, 4, 1, 214, 125, 3, - 201, 248, 32, 6, 225, 32, 105, 32, 248, 207, 105, 32, 202, 200, 105, 32, - 200, 29, 3, 231, 165, 105, 32, 200, 29, 3, 252, 10, 26, 231, 165, 105, - 32, 200, 29, 3, 239, 151, 26, 231, 165, 105, 32, 212, 247, 105, 32, 212, - 221, 105, 32, 225, 32, 105, 32, 1, 250, 251, 223, 236, 32, 4, 1, 250, - 251, 223, 236, 32, 1, 204, 236, 32, 4, 1, 204, 236, 32, 1, 239, 118, 32, - 4, 1, 239, 118, 32, 1, 223, 236, 32, 4, 1, 223, 236, 32, 1, 208, 222, 32, - 4, 1, 208, 222, 88, 6, 1, 206, 247, 88, 4, 1, 206, 247, 88, 6, 1, 235, - 174, 88, 4, 1, 235, 174, 88, 6, 1, 224, 129, 88, 4, 1, 224, 129, 88, 6, - 1, 231, 156, 88, 4, 1, 231, 156, 88, 6, 1, 234, 89, 88, 4, 1, 234, 89, - 88, 6, 1, 206, 213, 88, 4, 1, 206, 213, 88, 6, 1, 239, 228, 88, 4, 1, - 239, 228, 32, 225, 3, 105, 32, 210, 75, 105, 32, 221, 173, 206, 87, 105, - 32, 1, 195, 232, 32, 6, 202, 200, 105, 32, 221, 173, 236, 175, 105, 32, - 210, 89, 221, 173, 236, 175, 105, 32, 6, 1, 206, 198, 32, 4, 1, 206, 198, - 32, 6, 221, 173, 206, 87, 105, 32, 6, 1, 208, 219, 32, 4, 1, 208, 219, - 32, 210, 75, 3, 204, 196, 105, 32, 6, 210, 89, 221, 173, 206, 87, 105, - 32, 6, 237, 250, 221, 173, 206, 87, 105, 32, 6, 210, 89, 237, 250, 221, - 173, 206, 87, 105, 40, 6, 1, 226, 148, 3, 233, 100, 40, 6, 1, 226, 12, - 40, 6, 1, 239, 46, 40, 6, 1, 233, 161, 40, 6, 1, 200, 84, 226, 147, 40, - 6, 1, 237, 153, 40, 6, 1, 247, 217, 68, 40, 6, 1, 196, 24, 40, 6, 1, 225, - 193, 40, 6, 1, 222, 40, 40, 6, 1, 216, 157, 40, 6, 1, 201, 101, 40, 6, 1, - 224, 38, 40, 6, 1, 230, 249, 3, 233, 100, 40, 6, 1, 206, 182, 66, 40, 6, - 1, 237, 149, 40, 6, 1, 63, 40, 6, 1, 249, 9, 40, 6, 1, 199, 118, 40, 6, - 1, 233, 216, 40, 6, 1, 239, 252, 40, 6, 1, 226, 147, 40, 6, 1, 195, 65, - 40, 6, 1, 195, 88, 40, 6, 1, 68, 40, 6, 1, 206, 182, 68, 40, 6, 1, 155, - 40, 6, 1, 237, 7, 40, 6, 1, 236, 241, 40, 6, 1, 236, 230, 40, 6, 1, 72, - 40, 6, 1, 213, 92, 40, 6, 1, 236, 163, 40, 6, 1, 236, 151, 40, 6, 1, 203, - 68, 40, 6, 1, 66, 40, 6, 1, 237, 47, 40, 6, 1, 142, 40, 6, 1, 201, 107, - 40, 6, 1, 245, 103, 40, 6, 1, 207, 50, 40, 6, 1, 207, 2, 40, 6, 1, 232, - 173, 55, 40, 6, 1, 196, 47, 40, 6, 1, 205, 186, 55, 40, 6, 1, 69, 40, 6, - 1, 195, 217, 40, 6, 1, 164, 40, 4, 1, 63, 40, 4, 1, 249, 9, 40, 4, 1, - 199, 118, 40, 4, 1, 233, 216, 40, 4, 1, 239, 252, 40, 4, 1, 226, 147, 40, - 4, 1, 195, 65, 40, 4, 1, 195, 88, 40, 4, 1, 68, 40, 4, 1, 206, 182, 68, - 40, 4, 1, 155, 40, 4, 1, 237, 7, 40, 4, 1, 236, 241, 40, 4, 1, 236, 230, - 40, 4, 1, 72, 40, 4, 1, 213, 92, 40, 4, 1, 236, 163, 40, 4, 1, 236, 151, - 40, 4, 1, 203, 68, 40, 4, 1, 66, 40, 4, 1, 237, 47, 40, 4, 1, 142, 40, 4, - 1, 201, 107, 40, 4, 1, 245, 103, 40, 4, 1, 207, 50, 40, 4, 1, 207, 2, 40, - 4, 1, 232, 173, 55, 40, 4, 1, 196, 47, 40, 4, 1, 205, 186, 55, 40, 4, 1, - 69, 40, 4, 1, 195, 217, 40, 4, 1, 164, 40, 4, 1, 226, 148, 3, 233, 100, - 40, 4, 1, 226, 12, 40, 4, 1, 239, 46, 40, 4, 1, 233, 161, 40, 4, 1, 200, - 84, 226, 147, 40, 4, 1, 237, 153, 40, 4, 1, 247, 217, 68, 40, 4, 1, 196, - 24, 40, 4, 1, 225, 193, 40, 4, 1, 222, 40, 40, 4, 1, 216, 157, 40, 4, 1, - 201, 101, 40, 4, 1, 224, 38, 40, 4, 1, 230, 249, 3, 233, 100, 40, 4, 1, - 206, 182, 66, 40, 4, 1, 237, 149, 40, 6, 1, 214, 124, 40, 4, 1, 214, 124, - 40, 6, 1, 196, 84, 40, 4, 1, 196, 84, 40, 6, 1, 226, 5, 69, 40, 4, 1, - 226, 5, 69, 40, 6, 1, 222, 47, 195, 182, 40, 4, 1, 222, 47, 195, 182, 40, - 6, 1, 226, 5, 222, 47, 195, 182, 40, 4, 1, 226, 5, 222, 47, 195, 182, 40, - 6, 1, 248, 171, 195, 182, 40, 4, 1, 248, 171, 195, 182, 40, 6, 1, 226, 5, - 248, 171, 195, 182, 40, 4, 1, 226, 5, 248, 171, 195, 182, 40, 6, 1, 223, - 203, 40, 4, 1, 223, 203, 40, 6, 1, 211, 238, 40, 4, 1, 211, 238, 40, 6, - 1, 235, 103, 40, 4, 1, 235, 103, 40, 6, 1, 225, 219, 40, 4, 1, 225, 219, - 40, 6, 1, 225, 220, 3, 52, 233, 101, 252, 22, 40, 4, 1, 225, 220, 3, 52, - 233, 101, 252, 22, 40, 6, 1, 200, 87, 40, 4, 1, 200, 87, 40, 6, 1, 209, - 187, 214, 124, 40, 4, 1, 209, 187, 214, 124, 40, 6, 1, 214, 125, 3, 202, - 54, 40, 4, 1, 214, 125, 3, 202, 54, 40, 6, 1, 214, 49, 40, 4, 1, 214, 49, - 40, 6, 1, 223, 236, 40, 4, 1, 223, 236, 40, 202, 158, 55, 38, 40, 202, - 54, 38, 40, 213, 214, 38, 40, 240, 63, 212, 119, 38, 40, 211, 232, 212, - 119, 38, 40, 212, 103, 38, 40, 231, 58, 202, 158, 55, 38, 40, 219, 27, - 55, 40, 6, 1, 206, 182, 230, 249, 3, 203, 135, 40, 4, 1, 206, 182, 230, - 249, 3, 203, 135, 40, 6, 1, 207, 101, 55, 40, 4, 1, 207, 101, 55, 40, 6, - 1, 236, 164, 3, 202, 111, 40, 4, 1, 236, 164, 3, 202, 111, 40, 6, 1, 233, - 217, 3, 200, 27, 40, 4, 1, 233, 217, 3, 200, 27, 40, 6, 1, 233, 217, 3, - 106, 40, 4, 1, 233, 217, 3, 106, 40, 6, 1, 233, 217, 3, 112, 122, 40, 4, - 1, 233, 217, 3, 112, 122, 40, 6, 1, 195, 66, 3, 239, 195, 40, 4, 1, 195, - 66, 3, 239, 195, 40, 6, 1, 195, 89, 3, 239, 195, 40, 4, 1, 195, 89, 3, - 239, 195, 40, 6, 1, 225, 70, 3, 239, 195, 40, 4, 1, 225, 70, 3, 239, 195, - 40, 6, 1, 225, 70, 3, 83, 106, 40, 4, 1, 225, 70, 3, 83, 106, 40, 6, 1, - 225, 70, 3, 106, 40, 4, 1, 225, 70, 3, 106, 40, 6, 1, 249, 62, 155, 40, - 4, 1, 249, 62, 155, 40, 6, 1, 236, 231, 3, 239, 195, 40, 4, 1, 236, 231, - 3, 239, 195, 40, 6, 33, 236, 231, 233, 216, 40, 4, 33, 236, 231, 233, - 216, 40, 6, 1, 213, 93, 3, 112, 122, 40, 4, 1, 213, 93, 3, 112, 122, 40, - 6, 1, 252, 29, 142, 40, 4, 1, 252, 29, 142, 40, 6, 1, 236, 152, 3, 239, - 195, 40, 4, 1, 236, 152, 3, 239, 195, 40, 6, 1, 203, 69, 3, 239, 195, 40, - 4, 1, 203, 69, 3, 239, 195, 40, 6, 1, 204, 218, 66, 40, 4, 1, 204, 218, - 66, 40, 6, 1, 204, 218, 118, 3, 106, 40, 4, 1, 204, 218, 118, 3, 106, 40, - 6, 1, 233, 4, 3, 239, 195, 40, 4, 1, 233, 4, 3, 239, 195, 40, 6, 33, 203, - 69, 201, 107, 40, 4, 33, 203, 69, 201, 107, 40, 6, 1, 245, 104, 3, 239, - 195, 40, 4, 1, 245, 104, 3, 239, 195, 40, 6, 1, 245, 104, 3, 83, 106, 40, - 4, 1, 245, 104, 3, 83, 106, 40, 6, 1, 206, 224, 40, 4, 1, 206, 224, 40, - 6, 1, 252, 29, 245, 103, 40, 4, 1, 252, 29, 245, 103, 40, 6, 1, 252, 29, - 245, 104, 3, 239, 195, 40, 4, 1, 252, 29, 245, 104, 3, 239, 195, 40, 1, - 213, 203, 40, 6, 1, 195, 66, 3, 248, 47, 40, 4, 1, 195, 66, 3, 248, 47, - 40, 6, 1, 225, 70, 3, 122, 40, 4, 1, 225, 70, 3, 122, 40, 6, 1, 237, 8, - 3, 203, 135, 40, 4, 1, 237, 8, 3, 203, 135, 40, 6, 1, 236, 231, 3, 122, - 40, 4, 1, 236, 231, 3, 122, 40, 6, 1, 236, 231, 3, 203, 135, 40, 4, 1, - 236, 231, 3, 203, 135, 40, 6, 1, 224, 140, 245, 103, 40, 4, 1, 224, 140, - 245, 103, 40, 6, 1, 236, 242, 3, 203, 135, 40, 4, 1, 236, 242, 3, 203, - 135, 40, 4, 1, 213, 203, 40, 6, 1, 39, 3, 248, 47, 40, 4, 1, 39, 3, 248, - 47, 40, 6, 1, 39, 3, 239, 150, 40, 4, 1, 39, 3, 239, 150, 40, 6, 33, 39, - 226, 147, 40, 4, 33, 39, 226, 147, 40, 6, 1, 226, 148, 3, 248, 47, 40, 4, - 1, 226, 148, 3, 248, 47, 40, 6, 1, 208, 163, 40, 4, 1, 208, 163, 40, 6, - 1, 208, 164, 3, 239, 150, 40, 4, 1, 208, 164, 3, 239, 150, 40, 6, 1, 195, - 66, 3, 239, 150, 40, 4, 1, 195, 66, 3, 239, 150, 40, 6, 1, 195, 89, 3, - 239, 150, 40, 4, 1, 195, 89, 3, 239, 150, 40, 6, 1, 252, 29, 237, 153, - 40, 4, 1, 252, 29, 237, 153, 40, 6, 1, 230, 249, 3, 220, 114, 40, 4, 1, - 230, 249, 3, 220, 114, 40, 6, 1, 230, 249, 3, 239, 150, 40, 4, 1, 230, - 249, 3, 239, 150, 40, 6, 1, 177, 3, 239, 150, 40, 4, 1, 177, 3, 239, 150, - 40, 6, 1, 249, 74, 72, 40, 4, 1, 249, 74, 72, 40, 6, 1, 249, 74, 177, 3, - 239, 150, 40, 4, 1, 249, 74, 177, 3, 239, 150, 40, 6, 1, 237, 136, 3, - 239, 150, 40, 4, 1, 237, 136, 3, 239, 150, 40, 6, 1, 118, 3, 220, 114, - 40, 4, 1, 118, 3, 220, 114, 40, 6, 1, 118, 3, 239, 150, 40, 4, 1, 118, 3, - 239, 150, 40, 6, 1, 118, 3, 52, 186, 40, 4, 1, 118, 3, 52, 186, 40, 6, 1, - 245, 104, 3, 239, 150, 40, 4, 1, 245, 104, 3, 239, 150, 40, 6, 1, 233, - 217, 3, 239, 195, 40, 4, 1, 233, 217, 3, 239, 195, 40, 6, 1, 196, 48, 3, - 239, 150, 40, 4, 1, 196, 48, 3, 239, 150, 40, 6, 1, 233, 217, 3, 204, - 196, 26, 122, 40, 4, 1, 233, 217, 3, 204, 196, 26, 122, 40, 6, 1, 233, 4, - 3, 122, 40, 4, 1, 233, 4, 3, 122, 40, 6, 1, 233, 4, 3, 106, 40, 4, 1, - 233, 4, 3, 106, 40, 6, 1, 223, 246, 239, 252, 40, 4, 1, 223, 246, 239, - 252, 40, 6, 1, 223, 246, 239, 46, 40, 4, 1, 223, 246, 239, 46, 40, 6, 1, - 223, 246, 195, 15, 40, 4, 1, 223, 246, 195, 15, 40, 6, 1, 223, 246, 237, - 145, 40, 4, 1, 223, 246, 237, 145, 40, 6, 1, 223, 246, 222, 40, 40, 4, 1, - 223, 246, 222, 40, 40, 6, 1, 223, 246, 216, 157, 40, 4, 1, 223, 246, 216, - 157, 40, 6, 1, 223, 246, 206, 8, 40, 4, 1, 223, 246, 206, 8, 40, 6, 1, - 223, 246, 202, 48, 40, 4, 1, 223, 246, 202, 48, 40, 6, 1, 210, 89, 195, - 88, 40, 4, 1, 210, 89, 195, 88, 40, 6, 1, 237, 8, 3, 122, 40, 4, 1, 237, - 8, 3, 122, 40, 6, 1, 222, 122, 40, 4, 1, 222, 122, 40, 6, 1, 210, 77, 40, - 4, 1, 210, 77, 40, 6, 1, 196, 118, 40, 4, 1, 196, 118, 40, 6, 1, 211, - 159, 40, 4, 1, 211, 159, 40, 6, 1, 197, 109, 40, 4, 1, 197, 109, 40, 6, - 1, 251, 160, 155, 40, 4, 1, 251, 160, 155, 40, 6, 1, 237, 8, 3, 112, 122, - 40, 4, 1, 237, 8, 3, 112, 122, 40, 6, 1, 236, 231, 3, 112, 122, 40, 4, 1, - 236, 231, 3, 112, 122, 40, 6, 1, 213, 93, 3, 239, 195, 40, 4, 1, 213, 93, - 3, 239, 195, 40, 6, 1, 206, 225, 3, 239, 195, 40, 4, 1, 206, 225, 3, 239, - 195, 40, 6, 1, 236, 231, 3, 50, 122, 40, 4, 1, 236, 231, 3, 50, 122, 40, - 6, 1, 237, 137, 40, 4, 1, 237, 137, 40, 6, 1, 240, 45, 40, 4, 1, 240, 45, - 40, 6, 1, 237, 8, 3, 239, 195, 40, 4, 1, 237, 8, 3, 239, 195, 250, 230, - 6, 1, 250, 119, 250, 230, 6, 1, 248, 223, 250, 230, 6, 1, 233, 179, 250, - 230, 6, 1, 240, 136, 250, 230, 6, 1, 237, 60, 250, 230, 6, 1, 195, 115, - 250, 230, 6, 1, 237, 40, 250, 230, 6, 1, 236, 128, 250, 230, 6, 1, 149, - 250, 230, 6, 1, 195, 65, 250, 230, 6, 1, 226, 55, 250, 230, 6, 1, 222, - 44, 250, 230, 6, 1, 196, 200, 250, 230, 6, 1, 247, 174, 250, 230, 6, 1, - 224, 182, 250, 230, 6, 1, 231, 193, 250, 230, 6, 1, 225, 214, 250, 230, - 6, 1, 233, 227, 250, 230, 6, 1, 245, 93, 250, 230, 6, 1, 219, 164, 250, - 230, 6, 1, 196, 24, 250, 230, 6, 1, 216, 4, 250, 230, 6, 1, 207, 50, 250, - 230, 6, 1, 198, 248, 250, 230, 6, 1, 247, 16, 250, 230, 6, 1, 213, 72, - 250, 230, 6, 1, 225, 175, 250, 230, 6, 1, 169, 250, 230, 6, 1, 208, 119, - 250, 230, 6, 1, 199, 39, 250, 230, 6, 1, 202, 51, 250, 230, 6, 1, 210, - 142, 250, 230, 6, 1, 244, 182, 250, 230, 6, 1, 196, 8, 250, 230, 6, 1, - 212, 154, 250, 230, 6, 1, 224, 193, 250, 230, 6, 1, 214, 149, 250, 230, - 6, 1, 235, 176, 250, 230, 73, 1, 50, 157, 210, 2, 250, 230, 251, 30, 250, - 230, 236, 234, 78, 250, 230, 236, 90, 78, 250, 230, 244, 159, 250, 230, - 211, 79, 78, 250, 230, 252, 30, 78, 250, 230, 4, 1, 163, 250, 119, 250, - 230, 4, 1, 250, 119, 250, 230, 4, 1, 248, 223, 250, 230, 4, 1, 233, 179, - 250, 230, 4, 1, 240, 136, 250, 230, 4, 1, 237, 60, 250, 230, 4, 1, 195, - 115, 250, 230, 4, 1, 237, 40, 250, 230, 4, 1, 236, 128, 250, 230, 4, 1, - 149, 250, 230, 4, 1, 195, 65, 250, 230, 4, 1, 226, 55, 250, 230, 4, 1, - 222, 44, 250, 230, 4, 1, 196, 200, 250, 230, 4, 1, 247, 174, 250, 230, 4, - 1, 224, 182, 250, 230, 4, 1, 231, 193, 250, 230, 4, 1, 225, 214, 250, - 230, 4, 1, 233, 227, 250, 230, 4, 1, 245, 93, 250, 230, 4, 1, 219, 164, - 250, 230, 4, 1, 196, 24, 250, 230, 4, 1, 216, 4, 250, 230, 4, 1, 207, 50, - 250, 230, 4, 1, 198, 248, 250, 230, 4, 1, 247, 16, 250, 230, 4, 1, 213, - 72, 250, 230, 4, 1, 225, 175, 250, 230, 4, 1, 169, 250, 230, 4, 1, 208, - 119, 250, 230, 4, 1, 199, 39, 250, 230, 4, 1, 202, 51, 250, 230, 4, 1, - 210, 142, 250, 230, 4, 1, 244, 182, 250, 230, 4, 1, 196, 8, 250, 230, 4, - 1, 212, 154, 250, 230, 4, 1, 224, 193, 250, 230, 4, 1, 214, 149, 250, - 230, 4, 1, 235, 176, 250, 230, 4, 33, 237, 61, 196, 8, 250, 230, 4, 1, - 11, 3, 106, 250, 230, 234, 217, 204, 226, 250, 230, 231, 7, 210, 21, 250, - 230, 236, 124, 55, 222, 183, 250, 230, 236, 124, 55, 250, 230, 237, 222, - 55, 123, 252, 23, 236, 119, 123, 252, 23, 208, 120, 123, 252, 23, 207, - 27, 123, 252, 23, 195, 100, 211, 142, 123, 252, 23, 195, 100, 234, 113, - 123, 252, 23, 202, 66, 123, 252, 23, 210, 86, 123, 252, 23, 195, 98, 123, - 252, 23, 213, 124, 123, 252, 23, 196, 37, 123, 252, 23, 202, 240, 123, - 252, 23, 234, 22, 123, 252, 23, 234, 23, 218, 102, 123, 252, 23, 234, 20, - 123, 252, 23, 211, 143, 213, 156, 123, 252, 23, 203, 30, 234, 41, 123, - 252, 23, 213, 98, 123, 252, 23, 250, 159, 232, 240, 123, 252, 23, 218, - 112, 123, 252, 23, 220, 86, 123, 252, 23, 219, 153, 123, 252, 23, 219, - 154, 224, 194, 123, 252, 23, 240, 72, 123, 252, 23, 211, 154, 123, 252, - 23, 203, 30, 211, 137, 123, 252, 23, 196, 50, 248, 224, 195, 238, 123, - 252, 23, 214, 131, 123, 252, 23, 226, 106, 123, 252, 23, 239, 229, 123, - 252, 23, 195, 22, 123, 117, 220, 8, 244, 249, 123, 212, 111, 206, 227, - 123, 212, 111, 232, 164, 208, 120, 123, 212, 111, 232, 164, 213, 115, - 123, 212, 111, 232, 164, 211, 147, 123, 212, 111, 232, 33, 123, 212, 111, - 201, 104, 123, 212, 111, 208, 120, 123, 212, 111, 213, 115, 123, 212, - 111, 211, 147, 123, 212, 111, 231, 177, 123, 212, 111, 231, 178, 232, - 166, 36, 199, 122, 123, 212, 111, 211, 83, 123, 212, 111, 240, 121, 214, - 73, 220, 42, 123, 212, 111, 219, 142, 123, 211, 214, 220, 39, 123, 212, - 111, 210, 227, 123, 211, 214, 213, 126, 123, 212, 111, 206, 212, 238, - 253, 123, 212, 111, 206, 66, 238, 253, 123, 211, 214, 205, 187, 213, 117, - 123, 117, 200, 33, 238, 253, 123, 117, 221, 203, 238, 253, 123, 211, 214, - 215, 139, 232, 239, 123, 212, 111, 211, 148, 211, 142, 123, 1, 251, 164, - 123, 1, 248, 208, 123, 1, 233, 177, 123, 1, 240, 101, 123, 1, 232, 147, - 123, 1, 199, 122, 123, 1, 195, 92, 123, 1, 232, 89, 123, 1, 203, 1, 123, - 1, 195, 241, 123, 1, 48, 225, 35, 123, 1, 225, 35, 123, 1, 222, 241, 123, - 1, 48, 219, 171, 123, 1, 219, 171, 123, 1, 48, 215, 138, 123, 1, 215, - 138, 123, 1, 208, 225, 123, 1, 250, 117, 123, 1, 48, 213, 92, 123, 1, - 213, 92, 123, 1, 48, 201, 108, 123, 1, 201, 108, 123, 1, 211, 106, 123, - 1, 210, 109, 123, 1, 206, 211, 123, 1, 203, 85, 123, 195, 242, 201, 180, - 123, 33, 196, 22, 52, 199, 122, 123, 33, 196, 22, 199, 123, 195, 241, - 123, 33, 196, 22, 52, 195, 241, 123, 211, 214, 234, 22, 123, 211, 214, - 234, 20, 9, 31, 55, 9, 2, 208, 218, 9, 235, 35, 220, 24, 9, 2, 209, 3, 9, - 2, 208, 221, 9, 31, 117, 57, 251, 9, 241, 37, 209, 200, 251, 9, 235, 0, - 209, 200, 9, 210, 191, 251, 9, 213, 46, 219, 29, 55, 251, 9, 213, 46, - 203, 24, 202, 159, 55, 251, 222, 55, 9, 244, 159, 9, 240, 59, 207, 90, 9, - 212, 113, 199, 102, 55, 9, 2, 219, 8, 9, 2, 208, 235, 251, 167, 197, 133, - 9, 2, 251, 167, 250, 184, 9, 2, 210, 225, 251, 166, 9, 2, 210, 233, 251, - 144, 251, 82, 9, 2, 203, 126, 9, 4, 130, 203, 139, 9, 4, 130, 33, 151, 3, - 222, 250, 3, 196, 64, 9, 4, 130, 195, 106, 9, 4, 235, 200, 9, 4, 240, 95, - 9, 4, 224, 238, 9, 207, 105, 9, 1, 78, 9, 201, 165, 76, 211, 214, 78, 9, - 211, 79, 78, 9, 1, 224, 242, 196, 64, 9, 1, 232, 213, 9, 1, 151, 3, 220, - 110, 57, 9, 1, 151, 3, 232, 214, 57, 9, 1, 197, 118, 3, 232, 214, 57, 9, - 1, 151, 3, 232, 214, 60, 9, 1, 93, 3, 232, 214, 57, 9, 1, 251, 164, 9, 1, - 248, 239, 9, 1, 203, 42, 220, 35, 9, 1, 203, 41, 9, 1, 202, 213, 9, 1, - 225, 189, 9, 1, 232, 236, 9, 1, 224, 142, 9, 1, 240, 107, 9, 1, 202, 225, - 9, 1, 210, 142, 9, 1, 195, 106, 9, 1, 208, 125, 9, 1, 206, 251, 9, 1, - 209, 8, 9, 1, 240, 130, 9, 1, 203, 139, 9, 1, 195, 109, 9, 1, 251, 194, - 9, 1, 233, 225, 9, 1, 224, 192, 3, 99, 238, 251, 57, 9, 1, 224, 192, 3, - 115, 238, 251, 60, 9, 1, 235, 204, 93, 3, 226, 17, 199, 230, 9, 1, 235, - 204, 93, 3, 99, 238, 251, 57, 9, 1, 235, 204, 93, 3, 115, 238, 251, 57, - 9, 203, 91, 9, 1, 235, 176, 9, 1, 211, 152, 9, 1, 225, 35, 9, 1, 222, - 249, 9, 1, 219, 185, 9, 1, 216, 31, 9, 1, 232, 113, 9, 1, 197, 117, 9, 1, - 151, 220, 69, 9, 1, 196, 64, 9, 235, 198, 9, 240, 93, 9, 224, 236, 9, - 235, 200, 9, 240, 95, 9, 224, 238, 9, 207, 40, 9, 204, 119, 9, 220, 108, - 57, 9, 232, 214, 57, 9, 232, 214, 60, 9, 204, 143, 251, 164, 9, 226, 17, - 240, 95, 9, 117, 216, 32, 233, 196, 9, 194, 241, 9, 18, 2, 4, 199, 231, - 57, 9, 18, 2, 226, 17, 4, 199, 231, 57, 9, 18, 2, 76, 60, 9, 210, 89, - 240, 95, 9, 235, 201, 3, 99, 238, 250, 9, 197, 119, 232, 214, 60, 251, 9, - 17, 195, 79, 251, 9, 17, 100, 251, 9, 17, 102, 251, 9, 17, 134, 251, 9, - 17, 136, 251, 9, 17, 146, 251, 9, 17, 167, 251, 9, 17, 178, 251, 9, 17, - 171, 251, 9, 17, 182, 9, 213, 45, 55, 9, 239, 244, 207, 90, 9, 202, 158, - 207, 90, 9, 235, 101, 212, 109, 205, 7, 9, 1, 238, 252, 248, 239, 9, 1, - 238, 252, 211, 152, 9, 1, 204, 95, 251, 164, 9, 1, 151, 197, 134, 9, 1, - 151, 3, 197, 119, 232, 214, 57, 9, 1, 151, 3, 197, 119, 232, 214, 60, 9, - 1, 130, 232, 213, 9, 1, 130, 232, 214, 251, 164, 9, 1, 130, 232, 214, - 197, 117, 9, 1, 118, 3, 232, 214, 57, 9, 1, 130, 232, 214, 196, 64, 9, 1, - 201, 70, 9, 1, 201, 68, 9, 1, 248, 249, 9, 1, 203, 42, 3, 210, 2, 9, 1, - 203, 42, 3, 115, 238, 251, 90, 237, 230, 9, 1, 213, 72, 9, 1, 203, 39, 9, - 1, 248, 237, 9, 1, 168, 3, 232, 214, 57, 9, 1, 168, 3, 99, 238, 251, 83, - 57, 9, 1, 215, 95, 9, 1, 237, 162, 9, 1, 168, 3, 115, 238, 251, 57, 9, 1, - 203, 72, 9, 1, 203, 70, 9, 1, 240, 36, 9, 1, 240, 108, 3, 210, 2, 9, 1, - 240, 108, 3, 76, 60, 9, 1, 240, 108, 3, 76, 248, 227, 26, 4, 203, 139, 9, - 1, 240, 114, 9, 1, 240, 38, 9, 1, 237, 191, 9, 1, 240, 108, 3, 115, 238, - 251, 90, 237, 230, 9, 1, 240, 108, 3, 235, 7, 238, 251, 57, 9, 1, 209, - 173, 9, 1, 210, 143, 3, 4, 199, 230, 9, 1, 210, 143, 3, 210, 2, 9, 1, - 210, 143, 3, 76, 60, 9, 1, 210, 143, 3, 4, 199, 231, 60, 9, 1, 210, 143, - 3, 76, 248, 227, 26, 76, 57, 9, 1, 210, 143, 3, 99, 238, 251, 57, 9, 1, - 225, 186, 9, 1, 210, 143, 3, 235, 7, 238, 251, 57, 9, 1, 208, 126, 3, 76, - 248, 227, 26, 76, 57, 9, 1, 208, 126, 3, 115, 238, 251, 60, 9, 1, 208, - 126, 3, 115, 238, 251, 248, 227, 26, 115, 238, 251, 57, 9, 1, 209, 9, 3, - 99, 238, 251, 60, 9, 1, 209, 9, 3, 115, 238, 251, 57, 9, 1, 203, 140, 3, - 115, 238, 251, 57, 9, 1, 251, 195, 3, 115, 238, 251, 57, 9, 1, 238, 252, - 235, 176, 9, 1, 235, 177, 3, 76, 218, 162, 60, 9, 1, 235, 177, 3, 76, 60, - 9, 1, 199, 111, 9, 1, 235, 177, 3, 115, 238, 251, 60, 9, 1, 213, 70, 9, - 1, 211, 153, 3, 76, 57, 9, 1, 211, 153, 3, 115, 238, 251, 57, 9, 1, 224, - 191, 9, 1, 204, 63, 225, 35, 9, 1, 225, 36, 3, 210, 2, 9, 1, 225, 36, 3, - 76, 57, 9, 1, 217, 73, 9, 1, 225, 36, 3, 115, 238, 251, 60, 9, 1, 234, - 110, 9, 1, 234, 111, 3, 210, 2, 9, 1, 216, 250, 9, 1, 234, 111, 3, 99, - 238, 251, 60, 9, 1, 233, 63, 9, 1, 234, 111, 3, 115, 238, 251, 57, 9, 1, - 222, 250, 3, 4, 199, 230, 9, 1, 222, 250, 3, 76, 57, 9, 1, 222, 250, 3, - 115, 238, 251, 57, 9, 1, 222, 250, 3, 115, 238, 251, 60, 9, 1, 216, 32, - 3, 76, 60, 9, 1, 216, 32, 233, 196, 9, 1, 209, 235, 9, 1, 216, 32, 3, - 210, 2, 9, 1, 216, 32, 3, 115, 238, 251, 57, 9, 1, 232, 114, 239, 24, 9, - 1, 203, 73, 3, 76, 57, 9, 1, 232, 114, 3, 93, 57, 9, 1, 232, 114, 233, - 141, 9, 1, 232, 114, 233, 142, 3, 232, 214, 57, 9, 1, 203, 42, 220, 36, - 233, 141, 9, 1, 197, 118, 3, 210, 2, 9, 1, 224, 67, 214, 164, 9, 1, 214, - 164, 9, 1, 66, 9, 1, 195, 217, 9, 1, 224, 67, 195, 217, 9, 1, 197, 118, - 3, 99, 238, 251, 57, 9, 1, 199, 118, 9, 1, 235, 204, 196, 64, 9, 1, 93, - 3, 203, 135, 9, 1, 93, 3, 4, 199, 230, 9, 1, 197, 118, 3, 76, 57, 9, 1, - 69, 9, 1, 93, 3, 115, 238, 251, 60, 9, 1, 93, 249, 72, 9, 1, 93, 249, 73, - 3, 232, 214, 57, 9, 234, 217, 204, 226, 9, 1, 251, 245, 9, 4, 130, 33, - 209, 9, 3, 222, 250, 3, 151, 220, 69, 9, 4, 130, 33, 211, 153, 3, 222, - 250, 3, 151, 220, 69, 9, 4, 130, 87, 84, 20, 9, 4, 130, 222, 250, 251, - 164, 9, 4, 130, 225, 189, 9, 4, 130, 115, 238, 250, 9, 4, 130, 208, 125, - 9, 236, 222, 77, 250, 121, 9, 205, 3, 77, 209, 132, 237, 8, 232, 28, 9, - 4, 130, 209, 185, 195, 79, 9, 4, 130, 200, 31, 210, 162, 195, 79, 9, 4, - 130, 238, 252, 232, 138, 77, 224, 142, 9, 4, 130, 87, 70, 20, 9, 4, 126, - 208, 125, 9, 4, 130, 220, 109, 9, 4, 197, 117, 9, 4, 196, 64, 9, 4, 130, - 196, 64, 9, 4, 130, 216, 31, 9, 212, 149, 77, 208, 249, 9, 236, 232, 247, - 37, 126, 204, 226, 9, 236, 232, 247, 37, 130, 204, 226, 9, 209, 185, 130, - 204, 227, 3, 235, 135, 247, 36, 9, 4, 126, 219, 185, 9, 1, 240, 108, 3, - 226, 17, 199, 230, 9, 1, 210, 143, 3, 226, 17, 199, 230, 236, 79, 251, 9, - 17, 195, 79, 236, 79, 251, 9, 17, 100, 236, 79, 251, 9, 17, 102, 236, 79, - 251, 9, 17, 134, 236, 79, 251, 9, 17, 136, 236, 79, 251, 9, 17, 146, 236, - 79, 251, 9, 17, 167, 236, 79, 251, 9, 17, 178, 236, 79, 251, 9, 17, 171, - 236, 79, 251, 9, 17, 182, 9, 1, 206, 252, 3, 76, 60, 9, 1, 240, 131, 3, - 76, 60, 9, 1, 233, 226, 3, 76, 60, 9, 2, 206, 65, 251, 111, 9, 2, 206, - 65, 212, 70, 219, 164, 9, 1, 232, 114, 3, 226, 17, 199, 230, 203, 236, - 236, 222, 77, 213, 153, 203, 236, 204, 90, 234, 217, 204, 226, 203, 236, - 204, 145, 234, 217, 204, 226, 203, 236, 204, 90, 244, 168, 203, 236, 204, - 145, 244, 168, 203, 236, 231, 155, 244, 168, 203, 236, 244, 169, 206, 4, - 222, 184, 203, 236, 244, 169, 206, 4, 210, 22, 203, 236, 204, 90, 244, - 169, 206, 4, 222, 184, 203, 236, 204, 145, 244, 169, 206, 4, 210, 22, - 203, 236, 241, 123, 203, 236, 232, 171, 214, 184, 203, 236, 232, 171, - 219, 140, 203, 236, 232, 171, 250, 181, 203, 236, 252, 30, 78, 203, 236, - 1, 251, 169, 203, 236, 1, 204, 95, 251, 169, 203, 236, 1, 248, 205, 203, - 236, 1, 234, 100, 203, 236, 1, 234, 101, 234, 77, 203, 236, 1, 240, 104, - 203, 236, 1, 238, 252, 240, 105, 209, 251, 203, 236, 1, 232, 147, 203, - 236, 1, 197, 117, 203, 236, 1, 195, 106, 203, 236, 1, 232, 87, 203, 236, - 1, 202, 253, 203, 236, 1, 202, 254, 234, 77, 203, 236, 1, 195, 200, 203, - 236, 1, 195, 201, 232, 147, 203, 236, 1, 225, 5, 203, 236, 1, 222, 248, - 203, 236, 1, 219, 25, 203, 236, 1, 215, 138, 203, 236, 1, 207, 98, 203, - 236, 1, 48, 207, 98, 203, 236, 1, 69, 203, 236, 1, 213, 92, 203, 236, 1, - 210, 89, 213, 92, 203, 236, 1, 209, 5, 203, 236, 1, 211, 146, 203, 236, - 1, 209, 251, 203, 236, 1, 206, 211, 203, 236, 1, 203, 82, 203, 236, 1, - 213, 30, 248, 190, 203, 236, 1, 213, 30, 233, 223, 203, 236, 1, 213, 30, - 239, 171, 203, 236, 211, 228, 57, 203, 236, 211, 228, 60, 203, 236, 211, - 228, 237, 249, 203, 236, 195, 4, 57, 203, 236, 195, 4, 60, 203, 236, 195, - 4, 237, 249, 203, 236, 210, 186, 57, 203, 236, 210, 186, 60, 203, 236, - 237, 250, 195, 12, 231, 154, 203, 236, 237, 250, 195, 12, 251, 83, 203, - 236, 232, 152, 57, 203, 236, 232, 152, 60, 203, 236, 232, 151, 237, 249, - 203, 236, 236, 145, 57, 203, 236, 236, 145, 60, 203, 236, 209, 96, 203, - 236, 235, 170, 238, 253, 203, 236, 211, 56, 203, 236, 209, 126, 203, 236, - 99, 83, 238, 251, 57, 203, 236, 99, 83, 238, 251, 60, 203, 236, 115, 238, - 251, 57, 203, 236, 115, 238, 251, 60, 203, 236, 214, 182, 222, 76, 57, - 203, 236, 214, 182, 222, 76, 60, 203, 236, 218, 88, 203, 236, 249, 71, - 203, 236, 1, 205, 182, 195, 72, 203, 236, 1, 205, 182, 224, 135, 203, - 236, 1, 205, 182, 235, 189, 9, 1, 248, 240, 3, 115, 238, 251, 231, 104, - 60, 9, 1, 248, 240, 3, 76, 248, 227, 26, 115, 238, 251, 57, 9, 1, 248, - 240, 3, 115, 238, 251, 212, 107, 200, 24, 60, 9, 1, 248, 240, 3, 115, - 238, 251, 212, 107, 200, 24, 248, 227, 26, 99, 238, 251, 57, 9, 1, 248, - 240, 3, 99, 238, 251, 248, 227, 26, 76, 57, 9, 1, 248, 240, 3, 226, 17, - 4, 199, 231, 60, 9, 1, 248, 240, 3, 4, 199, 230, 9, 1, 168, 3, 99, 238, - 251, 57, 9, 1, 168, 3, 115, 238, 251, 212, 107, 200, 24, 60, 9, 1, 240, - 108, 3, 99, 238, 251, 199, 50, 248, 227, 26, 4, 203, 139, 9, 1, 240, 108, - 3, 226, 17, 4, 199, 231, 60, 9, 1, 210, 143, 3, 106, 9, 1, 208, 126, 3, - 235, 7, 238, 251, 57, 9, 1, 251, 195, 3, 99, 238, 251, 57, 9, 1, 251, - 195, 3, 115, 238, 251, 212, 107, 237, 231, 57, 9, 1, 251, 195, 3, 99, - 238, 251, 199, 50, 57, 9, 1, 235, 177, 3, 99, 238, 251, 60, 9, 1, 235, - 177, 3, 115, 238, 251, 212, 107, 200, 24, 60, 9, 1, 224, 192, 3, 76, 57, - 9, 1, 224, 192, 3, 115, 238, 251, 57, 9, 1, 224, 192, 3, 115, 238, 251, - 212, 107, 200, 24, 60, 9, 1, 87, 3, 76, 57, 9, 1, 87, 3, 76, 60, 9, 1, - 216, 32, 3, 99, 238, 251, 60, 9, 1, 216, 32, 3, 4, 203, 139, 9, 1, 216, - 32, 3, 4, 199, 230, 9, 1, 222, 250, 3, 154, 9, 1, 210, 143, 3, 99, 238, - 251, 199, 50, 57, 9, 1, 210, 143, 3, 232, 214, 57, 9, 1, 208, 126, 3, 99, - 238, 251, 199, 50, 57, 9, 1, 168, 3, 4, 9, 1, 203, 140, 60, 9, 1, 168, 3, - 4, 9, 1, 203, 140, 26, 99, 238, 250, 9, 1, 208, 126, 3, 4, 9, 1, 203, - 140, 26, 99, 238, 250, 9, 1, 210, 143, 3, 4, 9, 1, 203, 140, 26, 99, 238, - 250, 9, 1, 168, 3, 4, 9, 1, 203, 140, 57, 9, 1, 151, 3, 236, 79, 251, 9, - 17, 99, 57, 9, 1, 151, 3, 236, 79, 251, 9, 17, 115, 57, 9, 1, 235, 204, - 93, 3, 236, 79, 251, 9, 17, 99, 57, 9, 1, 235, 204, 93, 3, 236, 79, 251, - 9, 17, 115, 57, 9, 1, 235, 204, 93, 3, 236, 79, 251, 9, 17, 235, 7, 60, - 9, 1, 197, 118, 3, 236, 79, 251, 9, 17, 99, 57, 9, 1, 197, 118, 3, 236, - 79, 251, 9, 17, 115, 57, 9, 1, 93, 249, 73, 3, 236, 79, 251, 9, 17, 99, - 57, 9, 1, 93, 249, 73, 3, 236, 79, 251, 9, 17, 115, 57, 9, 1, 168, 3, - 236, 79, 251, 9, 17, 235, 7, 60, 9, 1, 208, 126, 3, 236, 79, 251, 9, 17, - 235, 7, 57, 9, 1, 208, 126, 3, 226, 17, 199, 230, 9, 1, 225, 36, 3, 99, - 238, 251, 57, 202, 230, 1, 232, 246, 202, 230, 1, 207, 5, 202, 230, 1, - 216, 30, 202, 230, 1, 210, 244, 202, 230, 1, 249, 143, 202, 230, 1, 222, - 119, 202, 230, 1, 225, 50, 202, 230, 1, 251, 151, 202, 230, 1, 199, 150, - 202, 230, 1, 219, 184, 202, 230, 1, 235, 237, 202, 230, 1, 239, 174, 202, - 230, 1, 202, 232, 202, 230, 1, 223, 79, 202, 230, 1, 234, 119, 202, 230, - 1, 233, 147, 202, 230, 1, 208, 124, 202, 230, 1, 240, 57, 202, 230, 1, - 195, 95, 202, 230, 1, 203, 84, 202, 230, 1, 196, 129, 202, 230, 1, 213, - 106, 202, 230, 1, 225, 198, 202, 230, 1, 245, 106, 202, 230, 1, 201, 77, - 202, 230, 1, 232, 79, 202, 230, 1, 224, 145, 202, 230, 1, 202, 231, 202, - 230, 1, 195, 113, 202, 230, 1, 206, 250, 202, 230, 1, 209, 12, 202, 230, - 1, 240, 134, 202, 230, 1, 149, 202, 230, 1, 195, 11, 202, 230, 1, 251, - 191, 202, 230, 1, 233, 224, 202, 230, 1, 211, 156, 202, 230, 1, 197, 159, - 202, 230, 252, 32, 202, 230, 252, 133, 202, 230, 230, 204, 202, 230, 237, - 53, 202, 230, 200, 107, 202, 230, 214, 101, 202, 230, 237, 63, 202, 230, - 236, 69, 202, 230, 214, 181, 202, 230, 214, 189, 202, 230, 204, 119, 202, - 230, 1, 217, 244, 216, 114, 17, 195, 79, 216, 114, 17, 100, 216, 114, 17, - 102, 216, 114, 17, 134, 216, 114, 17, 136, 216, 114, 17, 146, 216, 114, - 17, 167, 216, 114, 17, 178, 216, 114, 17, 171, 216, 114, 17, 182, 216, - 114, 1, 63, 216, 114, 1, 237, 54, 216, 114, 1, 68, 216, 114, 1, 69, 216, - 114, 1, 66, 216, 114, 1, 214, 102, 216, 114, 1, 72, 216, 114, 1, 240, - 122, 216, 114, 1, 218, 55, 216, 114, 1, 249, 145, 216, 114, 1, 161, 216, - 114, 1, 189, 216, 114, 1, 225, 214, 216, 114, 1, 247, 16, 216, 114, 1, - 240, 136, 216, 114, 1, 169, 216, 114, 1, 209, 181, 216, 114, 1, 183, 216, - 114, 1, 234, 65, 216, 114, 1, 235, 239, 216, 114, 1, 155, 216, 114, 1, - 172, 216, 114, 1, 218, 1, 197, 23, 216, 114, 1, 166, 216, 114, 1, 215, - 109, 216, 114, 1, 176, 216, 114, 1, 142, 216, 114, 1, 197, 166, 216, 114, - 1, 164, 216, 114, 1, 215, 110, 197, 23, 216, 114, 1, 225, 121, 225, 214, - 216, 114, 1, 225, 121, 247, 16, 216, 114, 1, 225, 121, 169, 216, 114, 38, - 206, 182, 130, 202, 11, 216, 114, 38, 206, 182, 126, 202, 11, 216, 114, - 38, 206, 182, 209, 250, 202, 11, 216, 114, 38, 181, 239, 194, 202, 11, - 216, 114, 38, 181, 130, 202, 11, 216, 114, 38, 181, 126, 202, 11, 216, - 114, 38, 181, 209, 250, 202, 11, 216, 114, 38, 217, 208, 78, 216, 114, - 38, 52, 76, 57, 216, 114, 130, 152, 251, 30, 216, 114, 126, 152, 251, 30, - 216, 114, 16, 214, 103, 239, 208, 216, 114, 16, 234, 64, 216, 114, 244, - 159, 216, 114, 236, 90, 78, 216, 114, 223, 52, 216, 114, 240, 83, 216, - 114, 238, 255, 55, 216, 114, 203, 116, 55, 208, 228, 1, 251, 171, 208, - 228, 1, 248, 145, 208, 228, 1, 234, 99, 208, 228, 1, 240, 106, 208, 228, - 1, 225, 225, 208, 228, 1, 249, 143, 208, 228, 1, 195, 82, 208, 228, 1, - 225, 234, 208, 228, 1, 202, 57, 208, 228, 1, 195, 181, 208, 228, 1, 225, - 51, 208, 228, 1, 223, 75, 208, 228, 1, 219, 25, 208, 228, 1, 215, 138, - 208, 228, 1, 206, 63, 208, 228, 1, 226, 86, 208, 228, 1, 235, 153, 208, - 228, 1, 201, 111, 208, 228, 1, 211, 76, 208, 228, 1, 209, 251, 208, 228, - 1, 207, 24, 208, 228, 1, 203, 161, 208, 228, 117, 226, 86, 208, 228, 117, - 226, 85, 208, 228, 117, 214, 176, 208, 228, 117, 240, 120, 208, 228, 73, - 1, 236, 179, 195, 181, 208, 228, 117, 236, 179, 195, 181, 208, 228, 18, - 2, 181, 69, 208, 228, 18, 2, 69, 208, 228, 18, 2, 214, 18, 252, 168, 208, - 228, 18, 2, 181, 252, 168, 208, 228, 18, 2, 252, 168, 208, 228, 18, 2, - 214, 18, 63, 208, 228, 18, 2, 181, 63, 208, 228, 18, 2, 63, 208, 228, 73, - 1, 206, 182, 63, 208, 228, 18, 2, 206, 182, 63, 208, 228, 18, 2, 181, 66, - 208, 228, 18, 2, 66, 208, 228, 73, 1, 68, 208, 228, 18, 2, 181, 68, 208, - 228, 18, 2, 68, 208, 228, 18, 2, 72, 208, 228, 18, 2, 204, 119, 208, 228, - 117, 217, 93, 208, 228, 211, 214, 217, 93, 208, 228, 211, 214, 251, 219, - 208, 228, 211, 214, 251, 96, 208, 228, 211, 214, 249, 49, 208, 228, 211, - 214, 250, 160, 208, 228, 211, 214, 206, 199, 208, 228, 252, 30, 78, 208, - 228, 211, 214, 219, 174, 211, 112, 208, 228, 211, 214, 195, 19, 208, 228, - 211, 214, 211, 112, 208, 228, 211, 214, 195, 112, 208, 228, 211, 214, - 201, 0, 208, 228, 211, 214, 250, 236, 208, 228, 211, 214, 205, 187, 220, - 10, 208, 228, 211, 214, 251, 77, 220, 58, 1, 232, 220, 220, 58, 1, 252, - 117, 220, 58, 1, 251, 217, 220, 58, 1, 252, 6, 220, 58, 1, 251, 209, 220, - 58, 1, 199, 251, 220, 58, 1, 250, 114, 220, 58, 1, 225, 234, 220, 58, 1, - 250, 157, 220, 58, 1, 251, 176, 220, 58, 1, 251, 181, 220, 58, 1, 251, - 173, 220, 58, 1, 251, 123, 220, 58, 1, 251, 106, 220, 58, 1, 250, 202, - 220, 58, 1, 226, 86, 220, 58, 1, 251, 46, 220, 58, 1, 250, 170, 220, 58, - 1, 251, 18, 220, 58, 1, 251, 14, 220, 58, 1, 250, 195, 220, 58, 1, 250, - 168, 220, 58, 1, 237, 175, 220, 58, 1, 225, 43, 220, 58, 1, 251, 194, - 220, 58, 251, 223, 78, 220, 58, 198, 246, 78, 220, 58, 234, 36, 78, 220, - 58, 211, 213, 203, 236, 1, 131, 217, 71, 203, 236, 1, 131, 225, 214, 203, - 236, 1, 131, 215, 109, 203, 236, 1, 131, 201, 78, 203, 236, 1, 131, 216, - 86, 203, 236, 1, 131, 216, 68, 203, 236, 1, 131, 248, 197, 203, 236, 1, - 131, 169, 203, 236, 1, 131, 222, 37, 203, 236, 1, 131, 222, 26, 203, 236, - 1, 131, 205, 80, 9, 1, 248, 240, 3, 4, 199, 231, 60, 9, 1, 248, 240, 3, - 232, 214, 57, 9, 1, 225, 190, 3, 99, 238, 251, 57, 9, 1, 203, 140, 3, 99, - 238, 251, 57, 9, 1, 235, 177, 3, 76, 248, 227, 26, 115, 238, 251, 57, 9, - 1, 211, 153, 3, 76, 60, 9, 1, 222, 250, 3, 52, 154, 9, 1, 87, 3, 115, - 238, 251, 57, 9, 1, 93, 3, 99, 238, 251, 248, 227, 26, 232, 214, 57, 9, - 1, 93, 3, 99, 238, 251, 248, 227, 26, 76, 57, 9, 1, 210, 143, 3, 221, - 225, 9, 1, 197, 118, 3, 76, 197, 38, 9, 1, 209, 214, 196, 64, 9, 1, 126, - 251, 164, 9, 1, 240, 108, 3, 115, 238, 251, 60, 9, 1, 209, 9, 3, 115, - 238, 251, 60, 9, 1, 234, 111, 3, 226, 17, 106, 9, 1, 204, 218, 197, 117, - 9, 1, 195, 107, 3, 226, 17, 199, 231, 57, 9, 1, 251, 195, 3, 115, 238, - 251, 60, 9, 1, 225, 36, 3, 76, 60, 9, 1, 248, 240, 3, 4, 87, 57, 9, 1, - 213, 73, 3, 4, 87, 57, 9, 1, 203, 42, 3, 4, 203, 42, 57, 9, 1, 210, 143, - 3, 4, 216, 32, 57, 9, 1, 93, 3, 99, 238, 251, 248, 227, 26, 4, 216, 32, - 57, 9, 1, 251, 220, 235, 176, 9, 1, 251, 220, 211, 152, 9, 1, 251, 220, - 216, 31, 9, 4, 126, 197, 117, 9, 4, 130, 197, 9, 251, 11, 9, 4, 130, 209, - 8, 9, 4, 130, 251, 194, 9, 4, 130, 211, 152, 9, 4, 130, 216, 32, 3, 224, - 238, 9, 4, 126, 216, 32, 3, 224, 238, 9, 4, 130, 197, 9, 250, 167, 9, 4, - 130, 197, 9, 250, 201, 9, 4, 130, 197, 9, 251, 105, 9, 4, 130, 197, 9, - 208, 243, 9, 4, 130, 197, 9, 211, 116, 9, 4, 130, 197, 9, 197, 140, 9, 4, - 130, 235, 35, 220, 24, 9, 4, 130, 2, 209, 3, 9, 239, 71, 236, 222, 77, - 250, 121, 9, 163, 240, 96, 60, 9, 241, 18, 235, 200, 9, 241, 18, 240, 95, - 9, 241, 18, 224, 238, 9, 241, 18, 235, 198, 9, 241, 18, 240, 93, 9, 241, - 18, 224, 236, 9, 152, 97, 76, 57, 9, 152, 99, 238, 251, 57, 9, 152, 221, - 226, 57, 9, 152, 97, 76, 60, 9, 152, 99, 238, 251, 60, 9, 152, 221, 226, - 60, 9, 192, 235, 198, 9, 192, 240, 93, 9, 192, 224, 236, 9, 4, 130, 197, - 117, 9, 235, 201, 3, 210, 2, 9, 235, 201, 3, 76, 57, 9, 224, 239, 3, 76, - 60, 9, 50, 250, 218, 57, 9, 53, 250, 218, 57, 9, 50, 250, 218, 60, 9, 53, - 250, 218, 60, 9, 52, 53, 250, 218, 57, 9, 52, 53, 250, 218, 90, 3, 238, - 253, 9, 53, 250, 218, 90, 3, 238, 253, 9, 240, 96, 3, 238, 253, 9, 117, - 206, 96, 216, 32, 233, 196, 101, 2, 226, 17, 247, 133, 101, 2, 247, 133, - 101, 2, 251, 51, 101, 2, 199, 2, 101, 1, 206, 182, 63, 101, 1, 63, 101, - 1, 252, 168, 101, 1, 68, 101, 1, 226, 120, 101, 1, 66, 101, 1, 199, 245, - 101, 1, 110, 144, 101, 1, 110, 159, 101, 1, 247, 136, 69, 101, 1, 206, - 182, 69, 101, 1, 69, 101, 1, 251, 200, 101, 1, 247, 136, 72, 101, 1, 206, - 182, 72, 101, 1, 72, 101, 1, 250, 150, 101, 1, 155, 101, 1, 224, 146, - 101, 1, 234, 123, 101, 1, 233, 230, 101, 1, 217, 71, 101, 1, 247, 174, - 101, 1, 247, 16, 101, 1, 225, 214, 101, 1, 225, 180, 101, 1, 215, 109, - 101, 1, 201, 78, 101, 1, 201, 66, 101, 1, 240, 41, 101, 1, 240, 25, 101, - 1, 216, 86, 101, 1, 189, 101, 1, 202, 233, 101, 1, 240, 136, 101, 1, 239, - 176, 101, 1, 176, 101, 1, 216, 68, 101, 1, 161, 101, 1, 213, 6, 101, 1, - 249, 145, 101, 1, 248, 197, 101, 1, 166, 101, 1, 164, 101, 1, 169, 101, - 1, 209, 181, 101, 1, 172, 101, 1, 222, 37, 101, 1, 222, 26, 101, 1, 199, - 152, 101, 1, 207, 50, 101, 1, 205, 80, 101, 1, 183, 101, 1, 142, 101, 18, - 2, 214, 164, 101, 18, 2, 214, 100, 101, 2, 215, 149, 101, 2, 250, 132, - 101, 18, 2, 252, 168, 101, 18, 2, 68, 101, 18, 2, 226, 120, 101, 18, 2, - 66, 101, 18, 2, 199, 245, 101, 18, 2, 110, 144, 101, 18, 2, 110, 209, - 182, 101, 18, 2, 247, 136, 69, 101, 18, 2, 206, 182, 69, 101, 18, 2, 69, - 101, 18, 2, 251, 200, 101, 18, 2, 247, 136, 72, 101, 18, 2, 206, 182, 72, - 101, 18, 2, 72, 101, 18, 2, 250, 150, 101, 2, 199, 7, 101, 18, 2, 212, - 11, 69, 101, 18, 2, 250, 127, 101, 214, 127, 101, 204, 206, 2, 200, 101, - 101, 204, 206, 2, 251, 53, 101, 233, 101, 252, 22, 101, 252, 10, 252, 22, - 101, 18, 2, 247, 136, 181, 69, 101, 18, 2, 200, 99, 101, 18, 2, 199, 244, - 101, 1, 211, 159, 101, 1, 224, 127, 101, 1, 233, 205, 101, 1, 195, 115, - 101, 1, 240, 30, 101, 1, 210, 77, 101, 1, 235, 239, 101, 1, 195, 167, - 101, 1, 110, 209, 182, 101, 1, 110, 222, 38, 101, 18, 2, 110, 159, 101, - 18, 2, 110, 222, 38, 101, 240, 88, 101, 52, 240, 88, 101, 17, 195, 79, - 101, 17, 100, 101, 17, 102, 101, 17, 134, 101, 17, 136, 101, 17, 146, - 101, 17, 167, 101, 17, 178, 101, 17, 171, 101, 17, 182, 101, 252, 30, 55, - 101, 2, 130, 205, 147, 238, 253, 101, 1, 247, 136, 63, 101, 1, 214, 164, - 101, 1, 214, 100, 101, 1, 250, 127, 101, 1, 200, 99, 101, 1, 199, 244, - 101, 1, 220, 16, 240, 41, 101, 1, 195, 74, 101, 1, 85, 164, 101, 1, 234, - 10, 101, 1, 225, 158, 101, 1, 233, 152, 204, 226, 101, 1, 240, 31, 101, - 1, 249, 45, 248, 219, 251, 80, 248, 219, 2, 247, 133, 248, 219, 2, 251, - 51, 248, 219, 2, 199, 2, 248, 219, 1, 63, 248, 219, 1, 252, 168, 248, - 219, 1, 68, 248, 219, 1, 226, 120, 248, 219, 1, 66, 248, 219, 1, 199, - 245, 248, 219, 1, 110, 144, 248, 219, 1, 110, 159, 248, 219, 1, 69, 248, - 219, 1, 251, 200, 248, 219, 1, 72, 248, 219, 1, 250, 150, 248, 219, 1, - 155, 248, 219, 1, 224, 146, 248, 219, 1, 234, 123, 248, 219, 1, 233, 230, - 248, 219, 1, 217, 71, 248, 219, 1, 247, 174, 248, 219, 1, 247, 16, 248, - 219, 1, 225, 214, 248, 219, 1, 225, 180, 248, 219, 1, 215, 109, 248, 219, - 1, 201, 78, 248, 219, 1, 201, 66, 248, 219, 1, 240, 41, 248, 219, 1, 240, - 25, 248, 219, 1, 216, 86, 248, 219, 1, 189, 248, 219, 1, 202, 233, 248, - 219, 1, 240, 136, 248, 219, 1, 239, 176, 248, 219, 1, 176, 248, 219, 1, - 161, 248, 219, 1, 213, 6, 248, 219, 1, 249, 145, 248, 219, 1, 248, 197, - 248, 219, 1, 166, 248, 219, 1, 164, 248, 219, 1, 169, 248, 219, 1, 172, - 248, 219, 1, 207, 50, 248, 219, 1, 205, 80, 248, 219, 1, 183, 248, 219, - 1, 142, 248, 219, 2, 215, 149, 248, 219, 2, 250, 132, 248, 219, 18, 2, - 252, 168, 248, 219, 18, 2, 68, 248, 219, 18, 2, 226, 120, 248, 219, 18, - 2, 66, 248, 219, 18, 2, 199, 245, 248, 219, 18, 2, 110, 144, 248, 219, - 18, 2, 110, 209, 182, 248, 219, 18, 2, 69, 248, 219, 18, 2, 251, 200, - 248, 219, 18, 2, 72, 248, 219, 18, 2, 250, 150, 248, 219, 2, 199, 7, 248, - 219, 1, 224, 137, 189, 248, 219, 250, 151, 222, 158, 78, 248, 219, 1, - 209, 181, 248, 219, 1, 210, 77, 248, 219, 1, 195, 167, 248, 219, 1, 110, - 209, 182, 248, 219, 1, 110, 222, 38, 248, 219, 18, 2, 110, 159, 248, 219, - 18, 2, 110, 222, 38, 248, 219, 17, 195, 79, 248, 219, 17, 100, 248, 219, - 17, 102, 248, 219, 17, 134, 248, 219, 17, 136, 248, 219, 17, 146, 248, - 219, 17, 167, 248, 219, 17, 178, 248, 219, 17, 171, 248, 219, 17, 182, - 248, 219, 1, 210, 252, 3, 112, 239, 146, 248, 219, 1, 210, 252, 3, 221, - 203, 239, 146, 248, 219, 209, 108, 78, 248, 219, 209, 108, 55, 248, 219, - 241, 17, 215, 141, 100, 248, 219, 241, 17, 215, 141, 102, 248, 219, 241, - 17, 215, 141, 134, 248, 219, 241, 17, 215, 141, 136, 248, 219, 241, 17, - 215, 141, 97, 222, 141, 202, 223, 202, 218, 239, 206, 248, 219, 241, 17, - 239, 207, 206, 23, 248, 219, 225, 235, 248, 219, 234, 90, 78, 248, 219, - 1, 199, 115, 251, 51, 248, 219, 252, 30, 55, 248, 219, 208, 215, 78, 233, - 42, 2, 252, 5, 248, 163, 233, 42, 2, 248, 163, 233, 42, 2, 199, 2, 233, - 42, 1, 63, 233, 42, 1, 252, 168, 233, 42, 1, 68, 233, 42, 1, 226, 120, - 233, 42, 1, 66, 233, 42, 1, 199, 245, 233, 42, 1, 237, 54, 233, 42, 1, - 251, 200, 233, 42, 1, 214, 102, 233, 42, 1, 250, 150, 233, 42, 1, 155, - 233, 42, 1, 224, 146, 233, 42, 1, 234, 123, 233, 42, 1, 233, 230, 233, - 42, 1, 217, 71, 233, 42, 1, 247, 174, 233, 42, 1, 247, 16, 233, 42, 1, - 225, 214, 233, 42, 1, 225, 180, 233, 42, 1, 215, 109, 233, 42, 1, 201, - 78, 233, 42, 1, 201, 66, 233, 42, 1, 240, 41, 233, 42, 1, 240, 25, 233, - 42, 1, 216, 86, 233, 42, 1, 189, 233, 42, 1, 202, 233, 233, 42, 1, 240, - 136, 233, 42, 1, 239, 176, 233, 42, 1, 176, 233, 42, 1, 161, 233, 42, 1, - 213, 6, 233, 42, 1, 249, 145, 233, 42, 1, 248, 197, 233, 42, 1, 166, 233, - 42, 1, 164, 233, 42, 1, 169, 233, 42, 1, 172, 233, 42, 1, 222, 37, 233, - 42, 1, 199, 152, 233, 42, 1, 207, 50, 233, 42, 1, 183, 233, 42, 1, 142, - 233, 42, 2, 215, 149, 233, 42, 18, 2, 252, 168, 233, 42, 18, 2, 68, 233, - 42, 18, 2, 226, 120, 233, 42, 18, 2, 66, 233, 42, 18, 2, 199, 245, 233, - 42, 18, 2, 237, 54, 233, 42, 18, 2, 251, 200, 233, 42, 18, 2, 214, 102, - 233, 42, 18, 2, 250, 150, 233, 42, 2, 199, 7, 233, 42, 2, 200, 103, 233, - 42, 1, 224, 127, 233, 42, 1, 233, 205, 233, 42, 1, 195, 115, 233, 42, 1, - 209, 181, 233, 42, 1, 235, 239, 233, 42, 17, 195, 79, 233, 42, 17, 100, - 233, 42, 17, 102, 233, 42, 17, 134, 233, 42, 17, 136, 233, 42, 17, 146, - 233, 42, 17, 167, 233, 42, 17, 178, 233, 42, 17, 171, 233, 42, 17, 182, - 233, 42, 202, 65, 233, 42, 252, 4, 233, 42, 225, 255, 233, 42, 200, 17, - 233, 42, 237, 15, 214, 107, 233, 42, 2, 196, 104, 233, 42, 252, 30, 55, - 233, 58, 2, 247, 133, 233, 58, 2, 251, 51, 233, 58, 2, 199, 2, 233, 58, - 1, 63, 233, 58, 1, 252, 168, 233, 58, 1, 68, 233, 58, 1, 226, 120, 233, - 58, 1, 66, 233, 58, 1, 199, 245, 233, 58, 1, 110, 144, 233, 58, 1, 110, - 159, 233, 58, 18, 247, 136, 69, 233, 58, 1, 69, 233, 58, 1, 251, 200, - 233, 58, 18, 247, 136, 72, 233, 58, 1, 72, 233, 58, 1, 250, 150, 233, 58, - 1, 155, 233, 58, 1, 224, 146, 233, 58, 1, 234, 123, 233, 58, 1, 233, 230, - 233, 58, 1, 217, 71, 233, 58, 1, 247, 174, 233, 58, 1, 247, 16, 233, 58, - 1, 225, 214, 233, 58, 1, 225, 180, 233, 58, 1, 215, 109, 233, 58, 1, 201, - 78, 233, 58, 1, 201, 66, 233, 58, 1, 240, 41, 233, 58, 1, 240, 25, 233, - 58, 1, 216, 86, 233, 58, 1, 189, 233, 58, 1, 202, 233, 233, 58, 1, 240, - 136, 233, 58, 1, 239, 176, 233, 58, 1, 176, 233, 58, 1, 161, 233, 58, 1, - 213, 6, 233, 58, 1, 249, 145, 233, 58, 1, 248, 197, 233, 58, 1, 166, 233, - 58, 1, 164, 233, 58, 1, 169, 233, 58, 1, 172, 233, 58, 1, 222, 37, 233, - 58, 1, 199, 152, 233, 58, 1, 207, 50, 233, 58, 1, 205, 80, 233, 58, 1, - 183, 233, 58, 1, 142, 233, 58, 2, 215, 149, 233, 58, 2, 250, 132, 233, - 58, 18, 2, 252, 168, 233, 58, 18, 2, 68, 233, 58, 18, 2, 226, 120, 233, - 58, 18, 2, 66, 233, 58, 18, 2, 199, 245, 233, 58, 18, 2, 110, 144, 233, - 58, 18, 2, 110, 209, 182, 233, 58, 18, 2, 247, 136, 69, 233, 58, 18, 2, - 69, 233, 58, 18, 2, 251, 200, 233, 58, 18, 2, 247, 136, 72, 233, 58, 18, - 2, 72, 233, 58, 18, 2, 250, 150, 233, 58, 2, 199, 7, 233, 58, 214, 127, - 233, 58, 1, 110, 209, 182, 233, 58, 1, 110, 222, 38, 233, 58, 18, 2, 110, - 159, 233, 58, 18, 2, 110, 222, 38, 233, 58, 17, 195, 79, 233, 58, 17, - 100, 233, 58, 17, 102, 233, 58, 17, 134, 233, 58, 17, 136, 233, 58, 17, - 146, 233, 58, 17, 167, 233, 58, 17, 178, 233, 58, 17, 171, 233, 58, 17, - 182, 233, 58, 252, 30, 55, 233, 58, 209, 108, 55, 233, 58, 1, 195, 74, - 233, 58, 2, 204, 119, 233, 58, 2, 207, 40, 233, 58, 2, 220, 107, 233, 58, - 2, 202, 153, 215, 150, 57, 233, 58, 2, 244, 250, 215, 150, 57, 233, 58, - 2, 200, 217, 215, 150, 57, 214, 62, 2, 247, 133, 214, 62, 2, 251, 51, - 214, 62, 2, 199, 2, 214, 62, 1, 63, 214, 62, 1, 252, 168, 214, 62, 1, 68, - 214, 62, 1, 226, 120, 214, 62, 1, 66, 214, 62, 1, 199, 245, 214, 62, 1, - 110, 144, 214, 62, 1, 110, 159, 214, 62, 1, 69, 214, 62, 1, 251, 200, - 214, 62, 1, 72, 214, 62, 1, 250, 150, 214, 62, 1, 155, 214, 62, 1, 224, - 146, 214, 62, 1, 234, 123, 214, 62, 1, 233, 230, 214, 62, 1, 217, 71, - 214, 62, 1, 247, 174, 214, 62, 1, 247, 16, 214, 62, 1, 225, 214, 214, 62, - 1, 225, 180, 214, 62, 1, 215, 109, 214, 62, 1, 201, 78, 214, 62, 1, 201, - 66, 214, 62, 1, 240, 41, 214, 62, 1, 240, 25, 214, 62, 1, 216, 86, 214, - 62, 1, 189, 214, 62, 1, 202, 233, 214, 62, 1, 240, 136, 214, 62, 1, 239, - 176, 214, 62, 1, 176, 214, 62, 1, 161, 214, 62, 1, 213, 6, 214, 62, 1, - 249, 145, 214, 62, 1, 248, 197, 214, 62, 1, 166, 214, 62, 1, 164, 214, - 62, 1, 169, 214, 62, 1, 172, 214, 62, 1, 222, 37, 214, 62, 1, 199, 152, - 214, 62, 1, 207, 50, 214, 62, 1, 205, 80, 214, 62, 1, 183, 214, 62, 1, - 142, 214, 62, 2, 215, 149, 214, 62, 2, 250, 132, 214, 62, 18, 2, 252, - 168, 214, 62, 18, 2, 68, 214, 62, 18, 2, 226, 120, 214, 62, 18, 2, 66, - 214, 62, 18, 2, 199, 245, 214, 62, 18, 2, 110, 144, 214, 62, 18, 2, 110, - 209, 182, 214, 62, 18, 2, 69, 214, 62, 18, 2, 251, 200, 214, 62, 18, 2, - 72, 214, 62, 18, 2, 250, 150, 214, 62, 2, 199, 7, 214, 62, 251, 201, 222, - 158, 78, 214, 62, 250, 151, 222, 158, 78, 214, 62, 1, 209, 181, 214, 62, - 1, 210, 77, 214, 62, 1, 195, 167, 214, 62, 1, 110, 209, 182, 214, 62, 1, - 110, 222, 38, 214, 62, 18, 2, 110, 159, 214, 62, 18, 2, 110, 222, 38, - 214, 62, 17, 195, 79, 214, 62, 17, 100, 214, 62, 17, 102, 214, 62, 17, - 134, 214, 62, 17, 136, 214, 62, 17, 146, 214, 62, 17, 167, 214, 62, 17, - 178, 214, 62, 17, 171, 214, 62, 17, 182, 214, 62, 225, 235, 214, 62, 1, - 197, 166, 214, 62, 191, 97, 211, 87, 214, 62, 191, 97, 232, 225, 214, 62, - 191, 115, 211, 85, 214, 62, 191, 97, 206, 21, 214, 62, 191, 97, 237, 26, - 214, 62, 191, 115, 206, 18, 42, 2, 251, 51, 42, 2, 199, 2, 42, 1, 63, 42, - 1, 252, 168, 42, 1, 68, 42, 1, 226, 120, 42, 1, 66, 42, 1, 199, 245, 42, - 1, 69, 42, 1, 237, 54, 42, 1, 251, 200, 42, 1, 72, 42, 1, 214, 102, 42, - 1, 250, 150, 42, 1, 155, 42, 1, 217, 71, 42, 1, 247, 174, 42, 1, 225, - 214, 42, 1, 215, 109, 42, 1, 201, 78, 42, 1, 216, 86, 42, 1, 189, 42, 1, - 176, 42, 1, 216, 68, 42, 1, 161, 42, 1, 166, 42, 1, 164, 42, 1, 169, 42, - 1, 209, 181, 42, 1, 172, 42, 1, 222, 37, 42, 1, 222, 26, 42, 1, 199, 152, - 42, 1, 207, 50, 42, 1, 205, 80, 42, 1, 183, 42, 1, 142, 42, 18, 2, 252, - 168, 42, 18, 2, 68, 42, 18, 2, 226, 120, 42, 18, 2, 66, 42, 18, 2, 199, - 245, 42, 18, 2, 69, 42, 18, 2, 237, 54, 42, 18, 2, 251, 200, 42, 18, 2, - 72, 42, 18, 2, 214, 102, 42, 18, 2, 250, 150, 42, 2, 199, 7, 42, 214, - 127, 42, 250, 151, 222, 158, 78, 42, 17, 195, 79, 42, 17, 100, 42, 17, - 102, 42, 17, 134, 42, 17, 136, 42, 17, 146, 42, 17, 167, 42, 17, 178, 42, - 17, 171, 42, 17, 182, 42, 31, 203, 23, 42, 31, 97, 231, 57, 42, 31, 97, - 170, 42, 240, 54, 55, 42, 218, 198, 55, 42, 196, 67, 55, 42, 239, 248, - 55, 42, 241, 74, 55, 42, 250, 203, 90, 55, 42, 209, 108, 55, 42, 31, 55, - 194, 194, 2, 38, 247, 134, 57, 194, 194, 2, 247, 133, 194, 194, 2, 251, - 51, 194, 194, 2, 199, 2, 194, 194, 2, 38, 251, 52, 57, 194, 194, 1, 63, - 194, 194, 1, 252, 168, 194, 194, 1, 68, 194, 194, 1, 226, 120, 194, 194, - 1, 66, 194, 194, 1, 199, 245, 194, 194, 1, 110, 144, 194, 194, 1, 110, - 159, 194, 194, 1, 69, 194, 194, 1, 237, 54, 194, 194, 1, 251, 200, 194, - 194, 1, 72, 194, 194, 1, 214, 102, 194, 194, 1, 250, 150, 194, 194, 1, - 155, 194, 194, 1, 224, 146, 194, 194, 1, 234, 123, 194, 194, 1, 233, 230, - 194, 194, 1, 217, 71, 194, 194, 1, 247, 174, 194, 194, 1, 247, 16, 194, - 194, 1, 225, 214, 194, 194, 1, 225, 180, 194, 194, 1, 215, 109, 194, 194, - 1, 201, 78, 194, 194, 1, 201, 66, 194, 194, 1, 240, 41, 194, 194, 1, 240, - 25, 194, 194, 1, 216, 86, 194, 194, 1, 189, 194, 194, 1, 202, 233, 194, - 194, 1, 240, 136, 194, 194, 1, 239, 176, 194, 194, 1, 176, 194, 194, 1, - 161, 194, 194, 1, 213, 6, 194, 194, 1, 249, 145, 194, 194, 1, 248, 197, - 194, 194, 1, 166, 194, 194, 1, 164, 194, 194, 1, 169, 194, 194, 1, 209, - 181, 194, 194, 1, 172, 194, 194, 1, 222, 37, 194, 194, 1, 222, 26, 194, - 194, 1, 199, 152, 194, 194, 1, 207, 50, 194, 194, 1, 205, 80, 194, 194, - 1, 183, 194, 194, 1, 142, 194, 194, 2, 250, 132, 194, 194, 18, 2, 252, - 168, 194, 194, 18, 2, 68, 194, 194, 18, 2, 226, 120, 194, 194, 18, 2, 66, - 194, 194, 18, 2, 199, 245, 194, 194, 18, 2, 110, 144, 194, 194, 18, 2, - 110, 209, 182, 194, 194, 18, 2, 69, 194, 194, 18, 2, 237, 54, 194, 194, - 18, 2, 251, 200, 194, 194, 18, 2, 72, 194, 194, 18, 2, 214, 102, 194, - 194, 18, 2, 250, 150, 194, 194, 2, 199, 7, 194, 194, 222, 158, 78, 194, - 194, 251, 201, 222, 158, 78, 194, 194, 1, 201, 113, 194, 194, 1, 237, - 156, 194, 194, 1, 209, 162, 194, 194, 1, 110, 209, 182, 194, 194, 1, 110, - 222, 38, 194, 194, 18, 2, 110, 159, 194, 194, 18, 2, 110, 222, 38, 194, - 194, 17, 195, 79, 194, 194, 17, 100, 194, 194, 17, 102, 194, 194, 17, - 134, 194, 194, 17, 136, 194, 194, 17, 146, 194, 194, 17, 167, 194, 194, - 17, 178, 194, 194, 17, 171, 194, 194, 17, 182, 194, 194, 2, 206, 100, - 194, 194, 191, 17, 195, 80, 36, 214, 168, 212, 57, 77, 136, 194, 194, - 191, 17, 97, 36, 214, 168, 212, 57, 77, 136, 194, 194, 191, 17, 99, 36, - 214, 168, 212, 57, 77, 136, 194, 194, 191, 17, 115, 36, 214, 168, 212, - 57, 77, 136, 194, 194, 191, 17, 97, 36, 236, 103, 212, 57, 77, 136, 194, - 194, 191, 17, 99, 36, 236, 103, 212, 57, 77, 136, 194, 194, 191, 17, 115, - 36, 236, 103, 212, 57, 77, 136, 194, 194, 2, 200, 250, 225, 11, 2, 205, - 147, 247, 133, 225, 11, 2, 247, 133, 225, 11, 2, 251, 51, 225, 11, 2, - 199, 2, 225, 11, 2, 206, 100, 225, 11, 1, 63, 225, 11, 1, 252, 168, 225, - 11, 1, 68, 225, 11, 1, 226, 120, 225, 11, 1, 66, 225, 11, 1, 199, 245, - 225, 11, 1, 110, 144, 225, 11, 1, 110, 159, 225, 11, 1, 69, 225, 11, 1, - 237, 54, 225, 11, 1, 251, 200, 225, 11, 1, 72, 225, 11, 1, 214, 102, 225, - 11, 1, 250, 150, 225, 11, 1, 155, 225, 11, 1, 224, 146, 225, 11, 1, 234, - 123, 225, 11, 1, 233, 230, 225, 11, 1, 217, 71, 225, 11, 1, 247, 174, - 225, 11, 1, 247, 16, 225, 11, 1, 225, 214, 225, 11, 1, 225, 180, 225, 11, - 1, 215, 109, 225, 11, 1, 201, 78, 225, 11, 1, 201, 66, 225, 11, 1, 240, - 41, 225, 11, 1, 240, 25, 225, 11, 1, 216, 86, 225, 11, 1, 189, 225, 11, - 1, 202, 233, 225, 11, 1, 240, 136, 225, 11, 1, 239, 176, 225, 11, 1, 176, - 225, 11, 1, 161, 225, 11, 1, 213, 6, 225, 11, 1, 249, 145, 225, 11, 1, - 248, 197, 225, 11, 1, 166, 225, 11, 1, 164, 225, 11, 1, 169, 225, 11, 1, - 209, 181, 225, 11, 1, 172, 225, 11, 1, 222, 37, 225, 11, 1, 199, 152, - 225, 11, 1, 207, 50, 225, 11, 1, 205, 80, 225, 11, 1, 183, 225, 11, 1, - 142, 225, 11, 2, 215, 149, 225, 11, 2, 250, 132, 225, 11, 18, 2, 252, - 168, 225, 11, 18, 2, 68, 225, 11, 18, 2, 226, 120, 225, 11, 18, 2, 66, - 225, 11, 18, 2, 199, 245, 225, 11, 18, 2, 110, 144, 225, 11, 18, 2, 110, - 209, 182, 225, 11, 18, 2, 69, 225, 11, 18, 2, 237, 54, 225, 11, 18, 2, - 251, 200, 225, 11, 18, 2, 72, 225, 11, 18, 2, 214, 102, 225, 11, 18, 2, - 250, 150, 225, 11, 2, 199, 7, 225, 11, 222, 158, 78, 225, 11, 251, 201, - 222, 158, 78, 225, 11, 1, 235, 239, 225, 11, 1, 110, 209, 182, 225, 11, - 1, 110, 222, 38, 225, 11, 18, 2, 110, 159, 225, 11, 18, 2, 110, 222, 38, - 225, 11, 17, 195, 79, 225, 11, 17, 100, 225, 11, 17, 102, 225, 11, 17, - 134, 225, 11, 17, 136, 225, 11, 17, 146, 225, 11, 17, 167, 225, 11, 17, - 178, 225, 11, 17, 171, 225, 11, 17, 182, 225, 11, 2, 225, 165, 225, 11, - 2, 200, 34, 131, 2, 38, 251, 52, 57, 131, 2, 247, 133, 131, 2, 251, 51, - 131, 2, 199, 2, 131, 1, 63, 131, 1, 252, 168, 131, 1, 68, 131, 1, 226, - 120, 131, 1, 66, 131, 1, 199, 245, 131, 1, 110, 144, 131, 1, 110, 159, - 131, 1, 69, 131, 1, 237, 54, 131, 1, 251, 200, 131, 1, 72, 131, 1, 214, - 102, 131, 1, 250, 150, 131, 1, 155, 131, 1, 224, 146, 131, 1, 234, 123, - 131, 1, 233, 230, 131, 1, 217, 71, 131, 1, 247, 174, 131, 1, 247, 16, - 131, 1, 225, 214, 131, 1, 225, 180, 131, 1, 215, 109, 131, 1, 201, 78, - 131, 1, 201, 66, 131, 1, 240, 41, 131, 1, 240, 25, 131, 1, 216, 86, 131, - 1, 189, 131, 1, 202, 233, 131, 1, 240, 136, 131, 1, 239, 176, 131, 1, - 176, 131, 1, 216, 68, 131, 1, 161, 131, 1, 213, 6, 131, 1, 249, 145, 131, - 1, 248, 197, 131, 1, 166, 131, 1, 164, 131, 1, 169, 131, 1, 209, 181, - 131, 1, 172, 131, 1, 222, 37, 131, 1, 222, 26, 131, 1, 199, 152, 131, 1, - 207, 50, 131, 1, 205, 80, 131, 1, 183, 131, 1, 142, 131, 1, 201, 47, 131, - 2, 83, 249, 80, 199, 7, 131, 2, 244, 243, 199, 7, 131, 2, 250, 132, 131, - 18, 2, 252, 168, 131, 18, 2, 68, 131, 18, 2, 226, 120, 131, 18, 2, 66, - 131, 18, 2, 199, 245, 131, 18, 2, 110, 144, 131, 18, 2, 110, 209, 182, - 131, 18, 2, 69, 131, 18, 2, 237, 54, 131, 18, 2, 251, 200, 131, 18, 2, - 72, 131, 18, 2, 214, 102, 131, 18, 2, 250, 150, 131, 2, 199, 7, 131, 1, - 76, 210, 116, 131, 2, 213, 156, 131, 1, 245, 64, 221, 136, 131, 1, 245, - 64, 196, 148, 131, 1, 245, 64, 222, 27, 131, 250, 151, 222, 158, 78, 131, - 191, 97, 214, 115, 131, 191, 97, 235, 17, 131, 191, 115, 237, 22, 131, - 191, 97, 200, 237, 131, 191, 97, 203, 14, 131, 191, 115, 200, 236, 131, - 191, 97, 235, 148, 131, 1, 250, 251, 226, 120, 131, 1, 110, 209, 182, - 131, 1, 110, 222, 38, 131, 18, 2, 110, 159, 131, 18, 2, 110, 222, 38, - 131, 17, 195, 79, 131, 17, 100, 131, 17, 102, 131, 17, 134, 131, 17, 136, - 131, 17, 146, 131, 17, 167, 131, 17, 178, 131, 17, 171, 131, 17, 182, - 131, 31, 203, 23, 131, 31, 97, 231, 57, 131, 31, 97, 170, 131, 191, 97, - 211, 87, 131, 191, 97, 232, 225, 131, 191, 115, 211, 85, 131, 191, 97, - 206, 21, 131, 191, 97, 237, 26, 131, 191, 115, 206, 18, 131, 240, 59, 78, - 131, 1, 245, 64, 216, 87, 131, 1, 245, 64, 218, 55, 131, 1, 245, 64, 209, - 182, 131, 1, 245, 64, 159, 131, 1, 245, 64, 222, 38, 131, 1, 245, 64, - 225, 80, 153, 2, 251, 50, 153, 2, 199, 1, 153, 1, 250, 120, 153, 1, 252, - 121, 153, 1, 251, 225, 153, 1, 251, 240, 153, 1, 225, 224, 153, 1, 226, - 119, 153, 1, 199, 236, 153, 1, 199, 239, 153, 1, 225, 250, 153, 1, 225, - 251, 153, 1, 226, 105, 153, 1, 226, 107, 153, 1, 236, 70, 153, 1, 237, - 49, 153, 1, 251, 183, 153, 1, 214, 7, 153, 1, 214, 95, 153, 1, 250, 135, - 153, 1, 251, 137, 224, 214, 153, 1, 220, 88, 224, 214, 153, 1, 251, 137, - 234, 68, 153, 1, 220, 88, 234, 68, 153, 1, 225, 10, 217, 241, 153, 1, - 208, 209, 234, 68, 153, 1, 251, 137, 247, 83, 153, 1, 220, 88, 247, 83, - 153, 1, 251, 137, 225, 196, 153, 1, 220, 88, 225, 196, 153, 1, 203, 159, - 217, 241, 153, 1, 203, 159, 208, 208, 217, 242, 153, 1, 208, 209, 225, - 196, 153, 1, 251, 137, 201, 74, 153, 1, 220, 88, 201, 74, 153, 1, 251, - 137, 240, 32, 153, 1, 220, 88, 240, 32, 153, 1, 218, 84, 217, 194, 153, - 1, 208, 209, 240, 32, 153, 1, 251, 137, 203, 76, 153, 1, 220, 88, 203, - 76, 153, 1, 251, 137, 240, 52, 153, 1, 220, 88, 240, 52, 153, 1, 240, 84, - 217, 194, 153, 1, 208, 209, 240, 52, 153, 1, 251, 137, 213, 100, 153, 1, - 220, 88, 213, 100, 153, 1, 251, 137, 249, 47, 153, 1, 220, 88, 249, 47, - 153, 1, 219, 249, 153, 1, 251, 117, 249, 47, 153, 1, 196, 74, 153, 1, - 210, 190, 153, 1, 240, 84, 222, 206, 153, 1, 199, 120, 153, 1, 203, 159, - 208, 179, 153, 1, 218, 84, 208, 179, 153, 1, 240, 84, 208, 179, 153, 1, - 232, 153, 153, 1, 218, 84, 222, 206, 153, 1, 235, 191, 153, 2, 251, 172, - 153, 18, 2, 251, 235, 153, 18, 2, 224, 171, 251, 242, 153, 18, 2, 239, - 119, 251, 242, 153, 18, 2, 224, 171, 225, 247, 153, 18, 2, 239, 119, 225, - 247, 153, 18, 2, 224, 171, 213, 242, 153, 18, 2, 239, 119, 213, 242, 153, - 18, 2, 234, 112, 153, 18, 2, 223, 247, 153, 18, 2, 239, 119, 223, 247, - 153, 18, 2, 223, 249, 239, 226, 153, 18, 2, 223, 248, 232, 247, 251, 235, - 153, 18, 2, 223, 248, 232, 247, 239, 119, 251, 235, 153, 18, 2, 223, 248, - 232, 247, 234, 67, 153, 18, 2, 234, 67, 153, 222, 50, 17, 195, 79, 153, - 222, 50, 17, 100, 153, 222, 50, 17, 102, 153, 222, 50, 17, 134, 153, 222, - 50, 17, 136, 153, 222, 50, 17, 146, 153, 222, 50, 17, 167, 153, 222, 50, - 17, 178, 153, 222, 50, 17, 171, 153, 222, 50, 17, 182, 153, 18, 2, 239, - 119, 234, 112, 153, 18, 2, 239, 119, 234, 67, 153, 211, 214, 223, 165, - 202, 228, 190, 224, 12, 225, 31, 202, 228, 190, 224, 118, 224, 141, 202, - 228, 190, 224, 118, 224, 109, 202, 228, 190, 224, 118, 224, 104, 202, - 228, 190, 224, 118, 224, 114, 202, 228, 190, 224, 118, 210, 211, 202, - 228, 190, 216, 253, 216, 240, 202, 228, 190, 245, 50, 247, 5, 202, 228, - 190, 245, 50, 245, 60, 202, 228, 190, 245, 50, 247, 4, 202, 228, 190, - 205, 201, 205, 200, 202, 228, 190, 245, 50, 245, 46, 202, 228, 190, 196, - 4, 196, 11, 202, 228, 190, 239, 29, 247, 13, 202, 228, 190, 202, 30, 213, - 114, 202, 228, 190, 202, 170, 202, 222, 202, 228, 190, 202, 170, 217, - 217, 202, 228, 190, 202, 170, 212, 223, 202, 228, 190, 216, 51, 217, 101, - 202, 228, 190, 239, 29, 239, 227, 202, 228, 190, 202, 30, 203, 106, 202, - 228, 190, 202, 170, 202, 136, 202, 228, 190, 202, 170, 202, 229, 202, - 228, 190, 202, 170, 202, 165, 202, 228, 190, 216, 51, 215, 186, 202, 228, - 190, 248, 117, 249, 110, 202, 228, 190, 212, 118, 212, 150, 202, 228, - 190, 212, 235, 212, 225, 202, 228, 190, 235, 52, 235, 239, 202, 228, 190, - 212, 235, 212, 255, 202, 228, 190, 235, 52, 235, 210, 202, 228, 190, 212, - 235, 208, 223, 202, 228, 190, 218, 252, 166, 202, 228, 190, 196, 4, 196, - 105, 202, 228, 190, 209, 233, 209, 133, 202, 228, 190, 209, 140, 202, - 228, 190, 222, 8, 222, 68, 202, 228, 190, 221, 191, 202, 228, 190, 197, - 35, 197, 156, 202, 228, 190, 205, 201, 208, 239, 202, 228, 190, 205, 201, - 209, 104, 202, 228, 190, 205, 201, 204, 163, 202, 228, 190, 231, 194, - 232, 35, 202, 228, 190, 222, 8, 245, 29, 202, 228, 190, 177, 251, 97, - 202, 228, 190, 231, 194, 216, 41, 202, 228, 190, 213, 217, 202, 228, 190, - 208, 203, 63, 202, 228, 190, 220, 82, 232, 211, 202, 228, 190, 208, 203, - 252, 168, 202, 228, 190, 208, 203, 251, 123, 202, 228, 190, 208, 203, 68, - 202, 228, 190, 208, 203, 226, 120, 202, 228, 190, 208, 203, 200, 99, 202, - 228, 190, 208, 203, 200, 97, 202, 228, 190, 208, 203, 66, 202, 228, 190, - 208, 203, 199, 245, 202, 228, 190, 212, 237, 202, 228, 241, 17, 16, 249, - 111, 202, 228, 190, 208, 203, 69, 202, 228, 190, 208, 203, 251, 245, 202, - 228, 190, 208, 203, 72, 202, 228, 190, 208, 203, 251, 201, 220, 76, 202, - 228, 190, 208, 203, 251, 201, 220, 77, 202, 228, 190, 222, 253, 202, 228, - 190, 220, 73, 202, 228, 190, 220, 74, 202, 228, 190, 220, 82, 237, 14, - 202, 228, 190, 220, 82, 202, 169, 202, 228, 190, 220, 82, 201, 183, 202, - 228, 190, 220, 82, 245, 108, 202, 228, 190, 202, 220, 202, 228, 190, 216, - 187, 202, 228, 190, 196, 99, 202, 228, 190, 235, 42, 202, 228, 17, 195, - 79, 202, 228, 17, 100, 202, 228, 17, 102, 202, 228, 17, 134, 202, 228, - 17, 136, 202, 228, 17, 146, 202, 228, 17, 167, 202, 228, 17, 178, 202, - 228, 17, 171, 202, 228, 17, 182, 202, 228, 190, 251, 92, 202, 228, 190, - 224, 115, 222, 232, 1, 224, 11, 222, 232, 1, 224, 118, 204, 108, 222, - 232, 1, 224, 118, 203, 117, 222, 232, 1, 213, 210, 233, 230, 222, 232, 1, - 216, 252, 222, 232, 1, 244, 182, 222, 232, 1, 213, 210, 247, 16, 222, - 232, 1, 205, 201, 203, 117, 222, 232, 1, 213, 210, 225, 180, 222, 232, 1, - 215, 73, 222, 232, 1, 213, 210, 215, 109, 222, 232, 1, 213, 210, 201, 78, - 222, 232, 1, 213, 210, 201, 66, 222, 232, 1, 213, 210, 240, 41, 222, 232, - 1, 213, 210, 240, 25, 222, 232, 1, 213, 210, 216, 86, 222, 232, 1, 239, - 28, 222, 232, 1, 149, 222, 232, 1, 202, 170, 204, 108, 222, 232, 1, 202, - 170, 203, 117, 222, 232, 1, 213, 210, 239, 176, 222, 232, 1, 216, 50, - 222, 232, 1, 248, 116, 222, 232, 1, 212, 117, 222, 232, 1, 212, 235, 204, - 108, 222, 232, 1, 235, 52, 203, 117, 222, 232, 1, 212, 235, 203, 117, - 222, 232, 1, 235, 52, 204, 108, 222, 232, 1, 213, 210, 248, 197, 222, - 232, 1, 218, 251, 222, 232, 1, 196, 3, 222, 232, 1, 222, 8, 222, 68, 222, - 232, 1, 222, 8, 221, 223, 222, 232, 1, 197, 34, 222, 232, 1, 208, 211, - 207, 50, 222, 232, 1, 208, 211, 205, 80, 222, 232, 1, 205, 201, 204, 108, - 222, 232, 1, 231, 194, 204, 108, 222, 232, 1, 213, 210, 222, 37, 222, - 232, 1, 72, 222, 232, 1, 231, 194, 203, 117, 222, 232, 236, 247, 222, - 232, 18, 2, 63, 222, 232, 18, 2, 220, 82, 225, 17, 222, 232, 18, 2, 252, - 168, 222, 232, 18, 2, 251, 123, 222, 232, 18, 2, 68, 222, 232, 18, 2, - 226, 120, 222, 232, 18, 2, 196, 148, 222, 232, 18, 2, 195, 168, 222, 232, - 18, 2, 66, 222, 232, 18, 2, 199, 245, 222, 232, 2, 213, 210, 199, 7, 222, - 232, 18, 2, 220, 82, 223, 245, 222, 232, 207, 100, 2, 222, 7, 222, 232, - 207, 100, 2, 215, 73, 222, 232, 18, 2, 69, 222, 232, 18, 2, 237, 33, 222, - 232, 18, 2, 72, 222, 232, 18, 2, 250, 122, 222, 232, 18, 2, 251, 200, - 222, 232, 224, 12, 172, 222, 232, 152, 220, 82, 237, 14, 222, 232, 152, - 220, 82, 202, 169, 222, 232, 152, 220, 82, 202, 122, 222, 232, 152, 220, - 82, 247, 91, 222, 232, 247, 139, 78, 222, 232, 216, 196, 222, 232, 17, - 195, 79, 222, 232, 17, 100, 222, 232, 17, 102, 222, 232, 17, 134, 222, - 232, 17, 136, 222, 232, 17, 146, 222, 232, 17, 167, 222, 232, 17, 178, - 222, 232, 17, 171, 222, 232, 17, 182, 222, 232, 231, 194, 216, 50, 222, - 232, 231, 194, 218, 251, 222, 232, 1, 224, 119, 233, 144, 222, 232, 1, - 224, 119, 215, 73, 82, 5, 214, 127, 82, 117, 233, 78, 196, 16, 219, 96, - 201, 119, 63, 82, 117, 233, 78, 196, 16, 219, 96, 255, 169, 209, 237, - 249, 11, 166, 82, 117, 233, 78, 196, 16, 219, 96, 255, 169, 233, 78, 201, - 99, 166, 82, 117, 84, 196, 16, 219, 96, 219, 209, 166, 82, 117, 244, 199, - 196, 16, 219, 96, 207, 57, 166, 82, 117, 247, 111, 196, 16, 219, 96, 212, - 224, 207, 43, 166, 82, 117, 196, 16, 219, 96, 201, 99, 207, 43, 166, 82, - 117, 208, 177, 207, 42, 82, 117, 248, 24, 196, 16, 219, 95, 82, 117, 248, - 138, 206, 192, 196, 16, 219, 95, 82, 117, 226, 22, 201, 98, 82, 117, 239, - 219, 201, 99, 248, 23, 82, 117, 207, 42, 82, 117, 215, 78, 207, 42, 82, - 117, 201, 99, 207, 42, 82, 117, 215, 78, 201, 99, 207, 42, 82, 117, 210, - 5, 245, 89, 205, 97, 207, 42, 82, 117, 210, 81, 233, 112, 207, 42, 82, - 117, 247, 111, 255, 173, 209, 145, 219, 208, 181, 247, 142, 82, 117, 233, - 78, 201, 98, 82, 221, 247, 2, 247, 14, 209, 144, 82, 221, 247, 2, 222, - 120, 209, 144, 82, 250, 174, 2, 207, 53, 234, 51, 255, 174, 209, 144, 82, - 250, 174, 2, 255, 171, 161, 82, 250, 174, 2, 208, 148, 201, 93, 82, 2, - 210, 185, 239, 43, 234, 50, 82, 2, 210, 185, 239, 43, 233, 146, 82, 2, - 210, 185, 239, 43, 233, 79, 82, 2, 210, 185, 217, 237, 234, 50, 82, 2, - 210, 185, 217, 237, 233, 146, 82, 2, 210, 185, 239, 43, 210, 185, 217, - 236, 82, 17, 195, 79, 82, 17, 100, 82, 17, 102, 82, 17, 134, 82, 17, 136, - 82, 17, 146, 82, 17, 167, 82, 17, 178, 82, 17, 171, 82, 17, 182, 82, 17, - 157, 100, 82, 17, 157, 102, 82, 17, 157, 134, 82, 17, 157, 136, 82, 17, - 157, 146, 82, 17, 157, 167, 82, 17, 157, 178, 82, 17, 157, 171, 82, 17, - 157, 182, 82, 17, 157, 195, 79, 82, 117, 248, 26, 209, 144, 82, 117, 217, - 62, 247, 209, 215, 90, 195, 13, 82, 117, 247, 111, 255, 173, 209, 145, - 247, 210, 219, 41, 247, 142, 82, 117, 217, 62, 247, 209, 207, 54, 209, - 144, 82, 117, 245, 104, 219, 95, 82, 117, 201, 114, 255, 170, 82, 117, - 233, 61, 209, 145, 233, 18, 82, 117, 233, 61, 209, 145, 233, 24, 82, 117, - 251, 98, 224, 136, 233, 18, 82, 117, 251, 98, 224, 136, 233, 24, 82, 2, - 196, 91, 201, 97, 82, 2, 220, 38, 201, 97, 82, 1, 155, 82, 1, 224, 146, - 82, 1, 234, 123, 82, 1, 233, 230, 82, 1, 217, 71, 82, 1, 247, 174, 82, 1, - 247, 16, 82, 1, 225, 214, 82, 1, 215, 109, 82, 1, 201, 78, 82, 1, 201, - 66, 82, 1, 240, 41, 82, 1, 240, 25, 82, 1, 216, 86, 82, 1, 189, 82, 1, - 202, 233, 82, 1, 240, 136, 82, 1, 239, 176, 82, 1, 176, 82, 1, 161, 82, - 1, 213, 6, 82, 1, 249, 145, 82, 1, 248, 197, 82, 1, 166, 82, 1, 201, 113, - 82, 1, 201, 103, 82, 1, 237, 156, 82, 1, 237, 150, 82, 1, 197, 166, 82, - 1, 195, 74, 82, 1, 195, 115, 82, 1, 255, 176, 82, 1, 164, 82, 1, 169, 82, - 1, 172, 82, 1, 207, 50, 82, 1, 205, 80, 82, 1, 183, 82, 1, 142, 82, 1, - 63, 82, 1, 223, 201, 82, 1, 235, 97, 169, 82, 1, 224, 36, 82, 1, 209, - 181, 82, 18, 2, 252, 168, 82, 18, 2, 68, 82, 18, 2, 226, 120, 82, 18, 2, - 66, 82, 18, 2, 199, 245, 82, 18, 2, 110, 144, 82, 18, 2, 110, 209, 182, - 82, 18, 2, 110, 159, 82, 18, 2, 110, 222, 38, 82, 18, 2, 69, 82, 18, 2, - 237, 54, 82, 18, 2, 72, 82, 18, 2, 214, 102, 82, 2, 209, 243, 204, 173, - 217, 72, 209, 232, 82, 2, 209, 237, 249, 10, 82, 18, 2, 210, 89, 68, 82, - 18, 2, 210, 89, 226, 120, 82, 2, 215, 90, 195, 14, 217, 245, 240, 136, - 82, 2, 205, 215, 222, 199, 82, 117, 232, 227, 82, 117, 213, 202, 82, 2, - 222, 202, 209, 144, 82, 2, 196, 96, 209, 144, 82, 2, 222, 203, 201, 114, - 247, 142, 82, 2, 219, 211, 247, 142, 82, 2, 233, 82, 247, 143, 210, 79, - 82, 2, 233, 82, 219, 197, 210, 79, 82, 2, 226, 17, 219, 211, 247, 142, - 82, 204, 152, 2, 222, 203, 201, 114, 247, 142, 82, 204, 152, 2, 219, 211, - 247, 142, 82, 204, 152, 2, 226, 17, 219, 211, 247, 142, 82, 204, 152, 1, - 155, 82, 204, 152, 1, 224, 146, 82, 204, 152, 1, 234, 123, 82, 204, 152, - 1, 233, 230, 82, 204, 152, 1, 217, 71, 82, 204, 152, 1, 247, 174, 82, - 204, 152, 1, 247, 16, 82, 204, 152, 1, 225, 214, 82, 204, 152, 1, 215, - 109, 82, 204, 152, 1, 201, 78, 82, 204, 152, 1, 201, 66, 82, 204, 152, 1, - 240, 41, 82, 204, 152, 1, 240, 25, 82, 204, 152, 1, 216, 86, 82, 204, - 152, 1, 189, 82, 204, 152, 1, 202, 233, 82, 204, 152, 1, 240, 136, 82, - 204, 152, 1, 239, 176, 82, 204, 152, 1, 176, 82, 204, 152, 1, 161, 82, - 204, 152, 1, 213, 6, 82, 204, 152, 1, 249, 145, 82, 204, 152, 1, 248, - 197, 82, 204, 152, 1, 166, 82, 204, 152, 1, 201, 113, 82, 204, 152, 1, - 201, 103, 82, 204, 152, 1, 237, 156, 82, 204, 152, 1, 237, 150, 82, 204, - 152, 1, 197, 166, 82, 204, 152, 1, 195, 74, 82, 204, 152, 1, 195, 115, - 82, 204, 152, 1, 255, 176, 82, 204, 152, 1, 164, 82, 204, 152, 1, 169, - 82, 204, 152, 1, 172, 82, 204, 152, 1, 207, 50, 82, 204, 152, 1, 205, 80, - 82, 204, 152, 1, 183, 82, 204, 152, 1, 142, 82, 204, 152, 1, 63, 82, 204, - 152, 1, 223, 201, 82, 204, 152, 1, 235, 97, 197, 166, 82, 204, 152, 1, - 235, 97, 164, 82, 204, 152, 1, 235, 97, 169, 82, 223, 188, 209, 141, 224, - 146, 82, 223, 188, 209, 141, 224, 147, 247, 210, 219, 41, 247, 142, 82, - 247, 126, 2, 85, 249, 0, 82, 247, 126, 2, 175, 249, 0, 82, 247, 126, 2, - 247, 130, 203, 58, 82, 247, 126, 2, 208, 176, 255, 175, 82, 16, 237, 217, - 248, 21, 82, 16, 210, 184, 209, 244, 82, 16, 213, 229, 234, 49, 82, 16, - 210, 184, 209, 245, 210, 81, 233, 111, 82, 16, 212, 224, 161, 82, 16, - 216, 28, 248, 21, 82, 16, 216, 28, 248, 22, 215, 78, 255, 172, 82, 16, - 216, 28, 248, 22, 233, 80, 255, 172, 82, 16, 216, 28, 248, 22, 247, 210, - 255, 172, 82, 2, 210, 185, 217, 237, 210, 185, 239, 42, 82, 2, 210, 185, - 217, 237, 233, 79, 82, 117, 248, 25, 206, 192, 233, 193, 219, 96, 210, - 80, 82, 117, 218, 253, 196, 16, 233, 193, 219, 96, 210, 80, 82, 117, 215, - 78, 201, 98, 82, 117, 84, 248, 54, 209, 234, 196, 16, 219, 96, 219, 209, - 166, 82, 117, 244, 199, 248, 54, 209, 234, 196, 16, 219, 96, 207, 57, - 166, 210, 21, 204, 69, 55, 222, 183, 204, 69, 55, 210, 21, 204, 69, 2, 3, - 238, 250, 222, 183, 204, 69, 2, 3, 238, 250, 82, 117, 222, 194, 219, 212, - 209, 144, 82, 117, 201, 209, 219, 212, 209, 144, 75, 1, 155, 75, 1, 224, - 146, 75, 1, 234, 123, 75, 1, 233, 230, 75, 1, 217, 71, 75, 1, 247, 174, - 75, 1, 247, 16, 75, 1, 225, 214, 75, 1, 225, 180, 75, 1, 215, 109, 75, 1, - 216, 52, 75, 1, 201, 78, 75, 1, 201, 66, 75, 1, 240, 41, 75, 1, 240, 25, - 75, 1, 216, 86, 75, 1, 189, 75, 1, 202, 233, 75, 1, 240, 136, 75, 1, 239, - 176, 75, 1, 176, 75, 1, 161, 75, 1, 213, 6, 75, 1, 249, 145, 75, 1, 248, - 197, 75, 1, 166, 75, 1, 164, 75, 1, 169, 75, 1, 172, 75, 1, 197, 166, 75, - 1, 183, 75, 1, 142, 75, 1, 222, 37, 75, 1, 63, 75, 1, 207, 25, 63, 75, 1, - 68, 75, 1, 226, 120, 75, 1, 66, 75, 1, 199, 245, 75, 1, 69, 75, 1, 218, - 216, 69, 75, 1, 72, 75, 1, 250, 150, 75, 18, 2, 203, 120, 252, 168, 75, - 18, 2, 252, 168, 75, 18, 2, 68, 75, 18, 2, 226, 120, 75, 18, 2, 66, 75, - 18, 2, 199, 245, 75, 18, 2, 69, 75, 18, 2, 251, 200, 75, 18, 2, 218, 216, - 226, 120, 75, 18, 2, 218, 216, 72, 75, 18, 2, 237, 136, 57, 75, 2, 251, - 51, 75, 2, 76, 60, 75, 2, 199, 2, 75, 2, 199, 7, 75, 2, 250, 199, 75, - 108, 2, 219, 194, 164, 75, 108, 2, 219, 194, 169, 75, 108, 2, 219, 194, - 197, 166, 75, 108, 2, 219, 194, 142, 75, 1, 233, 96, 183, 75, 17, 195, - 79, 75, 17, 100, 75, 17, 102, 75, 17, 134, 75, 17, 136, 75, 17, 146, 75, - 17, 167, 75, 17, 178, 75, 17, 171, 75, 17, 182, 75, 2, 222, 47, 208, 132, - 75, 2, 208, 132, 75, 16, 222, 0, 75, 16, 244, 152, 75, 16, 251, 221, 75, - 16, 234, 29, 75, 1, 207, 50, 75, 1, 205, 80, 75, 1, 110, 144, 75, 1, 110, - 209, 182, 75, 1, 110, 159, 75, 1, 110, 222, 38, 75, 18, 2, 110, 144, 75, - 18, 2, 110, 209, 182, 75, 18, 2, 110, 159, 75, 18, 2, 110, 222, 38, 75, - 1, 218, 216, 217, 71, 75, 1, 218, 216, 225, 180, 75, 1, 218, 216, 249, - 45, 75, 1, 218, 216, 249, 40, 75, 108, 2, 218, 216, 219, 194, 176, 75, - 108, 2, 218, 216, 219, 194, 166, 75, 108, 2, 218, 216, 219, 194, 172, 75, - 1, 207, 56, 224, 248, 207, 50, 75, 18, 2, 207, 56, 224, 248, 236, 116, - 75, 152, 117, 207, 56, 224, 248, 232, 161, 75, 152, 117, 207, 56, 224, - 248, 224, 210, 212, 234, 75, 1, 197, 86, 211, 179, 224, 248, 202, 233, - 75, 1, 197, 86, 211, 179, 224, 248, 211, 185, 75, 18, 2, 197, 86, 211, - 179, 224, 248, 236, 116, 75, 18, 2, 197, 86, 211, 179, 224, 248, 200, 99, - 75, 2, 197, 86, 211, 179, 224, 248, 202, 10, 75, 2, 197, 86, 211, 179, - 224, 248, 202, 9, 75, 2, 197, 86, 211, 179, 224, 248, 202, 8, 75, 2, 197, - 86, 211, 179, 224, 248, 202, 7, 75, 2, 197, 86, 211, 179, 224, 248, 202, - 6, 75, 1, 237, 67, 211, 179, 224, 248, 216, 86, 75, 1, 237, 67, 211, 179, - 224, 248, 195, 175, 75, 1, 237, 67, 211, 179, 224, 248, 233, 195, 75, 18, - 2, 234, 44, 224, 248, 68, 75, 18, 2, 224, 215, 214, 164, 75, 18, 2, 224, - 215, 66, 75, 18, 2, 224, 215, 237, 54, 75, 1, 207, 25, 155, 75, 1, 207, - 25, 224, 146, 75, 1, 207, 25, 234, 123, 75, 1, 207, 25, 247, 174, 75, 1, - 207, 25, 195, 115, 75, 1, 207, 25, 215, 109, 75, 1, 207, 25, 240, 136, - 75, 1, 207, 25, 176, 75, 1, 207, 25, 213, 6, 75, 1, 207, 25, 235, 239, - 75, 1, 207, 25, 249, 145, 75, 1, 207, 25, 202, 233, 75, 1, 207, 25, 142, - 75, 108, 2, 207, 25, 219, 194, 197, 166, 75, 18, 2, 207, 25, 252, 168, - 75, 18, 2, 207, 25, 69, 75, 18, 2, 207, 25, 237, 136, 57, 75, 18, 2, 207, - 25, 48, 196, 148, 75, 2, 207, 25, 202, 9, 75, 2, 207, 25, 202, 8, 75, 2, - 207, 25, 202, 6, 75, 2, 207, 25, 202, 5, 75, 2, 207, 25, 241, 91, 202, 9, - 75, 2, 207, 25, 241, 91, 202, 8, 75, 2, 207, 25, 241, 91, 236, 233, 202, - 11, 75, 1, 209, 119, 213, 212, 235, 239, 75, 2, 209, 119, 213, 212, 202, - 6, 75, 207, 25, 17, 195, 79, 75, 207, 25, 17, 100, 75, 207, 25, 17, 102, - 75, 207, 25, 17, 134, 75, 207, 25, 17, 136, 75, 207, 25, 17, 146, 75, - 207, 25, 17, 167, 75, 207, 25, 17, 178, 75, 207, 25, 17, 171, 75, 207, - 25, 17, 182, 75, 2, 224, 139, 202, 10, 75, 2, 224, 139, 202, 8, 75, 18, - 2, 251, 186, 63, 75, 18, 2, 251, 186, 251, 200, 75, 16, 207, 25, 100, 75, - 16, 207, 25, 236, 89, 94, 6, 1, 251, 106, 94, 6, 1, 249, 93, 94, 6, 1, - 234, 93, 94, 6, 1, 239, 6, 94, 6, 1, 236, 230, 94, 6, 1, 199, 16, 94, 6, - 1, 195, 82, 94, 6, 1, 203, 114, 94, 6, 1, 226, 86, 94, 6, 1, 225, 17, 94, - 6, 1, 222, 222, 94, 6, 1, 220, 62, 94, 6, 1, 217, 211, 94, 6, 1, 214, - 119, 94, 6, 1, 213, 157, 94, 6, 1, 195, 70, 94, 6, 1, 210, 229, 94, 6, 1, - 208, 219, 94, 6, 1, 203, 101, 94, 6, 1, 200, 72, 94, 6, 1, 212, 254, 94, - 6, 1, 224, 134, 94, 6, 1, 233, 221, 94, 6, 1, 211, 144, 94, 6, 1, 206, - 211, 94, 6, 1, 245, 62, 94, 6, 1, 247, 142, 94, 6, 1, 225, 162, 94, 6, 1, - 245, 0, 94, 6, 1, 247, 0, 94, 6, 1, 196, 206, 94, 6, 1, 225, 177, 94, 6, - 1, 232, 242, 94, 6, 1, 232, 147, 94, 6, 1, 232, 58, 94, 6, 1, 197, 109, - 94, 6, 1, 232, 175, 94, 6, 1, 231, 181, 94, 6, 1, 196, 5, 94, 6, 1, 251, - 234, 94, 1, 251, 106, 94, 1, 249, 93, 94, 1, 234, 93, 94, 1, 239, 6, 94, - 1, 236, 230, 94, 1, 199, 16, 94, 1, 195, 82, 94, 1, 203, 114, 94, 1, 226, - 86, 94, 1, 225, 17, 94, 1, 222, 222, 94, 1, 220, 62, 94, 1, 217, 211, 94, - 1, 214, 119, 94, 1, 213, 157, 94, 1, 195, 70, 94, 1, 210, 229, 94, 1, - 208, 219, 94, 1, 203, 101, 94, 1, 200, 72, 94, 1, 212, 254, 94, 1, 224, - 134, 94, 1, 233, 221, 94, 1, 211, 144, 94, 1, 206, 211, 94, 1, 245, 62, - 94, 1, 247, 142, 94, 1, 225, 162, 94, 1, 245, 0, 94, 1, 247, 0, 94, 1, - 196, 206, 94, 1, 225, 177, 94, 1, 232, 242, 94, 1, 232, 147, 94, 1, 232, - 58, 94, 1, 197, 109, 94, 1, 232, 175, 94, 1, 231, 181, 94, 1, 235, 153, - 94, 1, 196, 5, 94, 1, 236, 249, 94, 1, 163, 234, 93, 94, 1, 251, 194, 94, - 213, 154, 207, 90, 73, 1, 94, 217, 211, 94, 1, 251, 234, 94, 1, 232, 173, - 55, 94, 1, 223, 73, 55, 29, 137, 224, 48, 29, 137, 205, 72, 29, 137, 216, - 208, 29, 137, 202, 97, 29, 137, 205, 61, 29, 137, 210, 54, 29, 137, 219, - 56, 29, 137, 212, 206, 29, 137, 205, 69, 29, 137, 206, 52, 29, 137, 205, - 66, 29, 137, 226, 143, 29, 137, 245, 6, 29, 137, 205, 76, 29, 137, 245, - 71, 29, 137, 224, 122, 29, 137, 202, 191, 29, 137, 212, 244, 29, 137, - 232, 55, 29, 137, 216, 204, 29, 137, 205, 70, 29, 137, 216, 198, 29, 137, - 216, 202, 29, 137, 202, 94, 29, 137, 210, 42, 29, 137, 205, 68, 29, 137, - 210, 52, 29, 137, 224, 254, 29, 137, 219, 49, 29, 137, 225, 1, 29, 137, - 212, 201, 29, 137, 212, 199, 29, 137, 212, 187, 29, 137, 212, 195, 29, - 137, 212, 193, 29, 137, 212, 190, 29, 137, 212, 192, 29, 137, 212, 189, - 29, 137, 212, 194, 29, 137, 212, 204, 29, 137, 212, 205, 29, 137, 212, - 188, 29, 137, 212, 198, 29, 137, 224, 255, 29, 137, 224, 253, 29, 137, - 206, 45, 29, 137, 206, 43, 29, 137, 206, 35, 29, 137, 206, 38, 29, 137, - 206, 44, 29, 137, 206, 40, 29, 137, 206, 39, 29, 137, 206, 37, 29, 137, - 206, 48, 29, 137, 206, 50, 29, 137, 206, 51, 29, 137, 206, 46, 29, 137, - 206, 36, 29, 137, 206, 41, 29, 137, 206, 49, 29, 137, 245, 53, 29, 137, - 245, 51, 29, 137, 247, 29, 29, 137, 247, 27, 29, 137, 213, 174, 29, 137, - 226, 138, 29, 137, 226, 129, 29, 137, 226, 137, 29, 137, 226, 134, 29, - 137, 226, 132, 29, 137, 226, 136, 29, 137, 205, 73, 29, 137, 226, 141, - 29, 137, 226, 142, 29, 137, 226, 130, 29, 137, 226, 135, 29, 137, 196, - 46, 29, 137, 245, 5, 29, 137, 245, 54, 29, 137, 245, 52, 29, 137, 247, - 30, 29, 137, 247, 28, 29, 137, 245, 69, 29, 137, 245, 70, 29, 137, 245, - 55, 29, 137, 247, 31, 29, 137, 212, 242, 29, 137, 225, 0, 29, 137, 205, - 74, 29, 137, 196, 52, 29, 137, 224, 39, 29, 137, 216, 200, 29, 137, 216, - 206, 29, 137, 216, 205, 29, 137, 202, 91, 29, 137, 235, 134, 29, 225, - 102, 235, 134, 29, 225, 102, 63, 29, 225, 102, 251, 245, 29, 225, 102, - 164, 29, 225, 102, 196, 118, 29, 225, 102, 236, 192, 29, 225, 102, 69, - 29, 225, 102, 196, 56, 29, 225, 102, 196, 69, 29, 225, 102, 72, 29, 225, - 102, 197, 166, 29, 225, 102, 197, 157, 29, 225, 102, 214, 164, 29, 225, - 102, 196, 3, 29, 225, 102, 66, 29, 225, 102, 197, 91, 29, 225, 102, 197, - 109, 29, 225, 102, 197, 70, 29, 225, 102, 195, 217, 29, 225, 102, 236, - 116, 29, 225, 102, 196, 24, 29, 225, 102, 68, 29, 225, 102, 255, 164, 29, - 225, 102, 255, 163, 29, 225, 102, 196, 132, 29, 225, 102, 196, 130, 29, - 225, 102, 236, 190, 29, 225, 102, 236, 189, 29, 225, 102, 236, 191, 29, - 225, 102, 196, 55, 29, 225, 102, 196, 54, 29, 225, 102, 215, 18, 29, 225, - 102, 215, 19, 29, 225, 102, 215, 12, 29, 225, 102, 215, 17, 29, 225, 102, - 215, 15, 29, 225, 102, 195, 247, 29, 225, 102, 195, 246, 29, 225, 102, - 195, 245, 29, 225, 102, 195, 248, 29, 225, 102, 195, 249, 29, 225, 102, - 200, 172, 29, 225, 102, 200, 171, 29, 225, 102, 200, 169, 29, 225, 102, - 200, 165, 29, 225, 102, 200, 166, 29, 225, 102, 195, 212, 29, 225, 102, - 195, 209, 29, 225, 102, 195, 210, 29, 225, 102, 195, 204, 29, 225, 102, - 195, 205, 29, 225, 102, 195, 206, 29, 225, 102, 195, 208, 29, 225, 102, - 236, 110, 29, 225, 102, 236, 112, 29, 225, 102, 196, 23, 29, 225, 102, - 230, 244, 29, 225, 102, 230, 236, 29, 225, 102, 230, 239, 29, 225, 102, - 230, 237, 29, 225, 102, 230, 241, 29, 225, 102, 230, 243, 29, 225, 102, - 251, 6, 29, 225, 102, 251, 3, 29, 225, 102, 251, 1, 29, 225, 102, 251, 2, - 29, 225, 102, 205, 77, 29, 225, 102, 255, 165, 29, 225, 102, 196, 131, - 29, 225, 102, 196, 53, 29, 225, 102, 215, 14, 29, 225, 102, 215, 13, 29, - 116, 224, 48, 29, 116, 205, 72, 29, 116, 224, 41, 29, 116, 216, 208, 29, - 116, 216, 206, 29, 116, 216, 205, 29, 116, 202, 97, 29, 116, 210, 54, 29, - 116, 210, 49, 29, 116, 210, 46, 29, 116, 210, 39, 29, 116, 210, 34, 29, - 116, 210, 29, 29, 116, 210, 40, 29, 116, 210, 52, 29, 116, 219, 56, 29, - 116, 212, 206, 29, 116, 212, 195, 29, 116, 206, 52, 29, 116, 205, 66, 29, - 116, 226, 143, 29, 116, 245, 6, 29, 116, 245, 71, 29, 116, 224, 122, 29, - 116, 202, 191, 29, 116, 212, 244, 29, 116, 232, 55, 29, 116, 224, 42, 29, - 116, 224, 40, 29, 116, 216, 204, 29, 116, 216, 198, 29, 116, 216, 200, - 29, 116, 216, 203, 29, 116, 216, 199, 29, 116, 202, 94, 29, 116, 202, 91, - 29, 116, 210, 47, 29, 116, 210, 42, 29, 116, 210, 28, 29, 116, 210, 27, - 29, 116, 205, 68, 29, 116, 210, 44, 29, 116, 210, 43, 29, 116, 210, 36, - 29, 116, 210, 38, 29, 116, 210, 51, 29, 116, 210, 31, 29, 116, 210, 41, - 29, 116, 210, 50, 29, 116, 210, 26, 29, 116, 219, 52, 29, 116, 219, 47, - 29, 116, 219, 49, 29, 116, 219, 46, 29, 116, 219, 44, 29, 116, 219, 50, - 29, 116, 219, 55, 29, 116, 219, 53, 29, 116, 225, 1, 29, 116, 212, 197, - 29, 116, 212, 198, 29, 116, 212, 203, 29, 116, 224, 255, 29, 116, 206, - 45, 29, 116, 206, 35, 29, 116, 206, 38, 29, 116, 206, 40, 29, 116, 213, - 174, 29, 116, 226, 138, 29, 116, 226, 131, 29, 116, 205, 73, 29, 116, - 226, 139, 29, 116, 196, 46, 29, 116, 196, 40, 29, 116, 196, 41, 29, 116, - 212, 242, 29, 116, 225, 0, 29, 116, 232, 53, 29, 116, 232, 51, 29, 116, - 232, 54, 29, 116, 232, 52, 29, 116, 196, 52, 29, 116, 224, 44, 29, 116, - 224, 43, 29, 116, 224, 47, 29, 116, 224, 45, 29, 116, 224, 46, 29, 116, - 205, 70, 35, 5, 142, 35, 5, 231, 75, 35, 5, 232, 71, 35, 5, 232, 246, 35, - 5, 232, 118, 35, 5, 232, 147, 35, 5, 231, 193, 35, 5, 231, 184, 35, 5, - 172, 35, 5, 221, 191, 35, 5, 222, 109, 35, 5, 223, 82, 35, 5, 222, 188, - 35, 5, 222, 197, 35, 5, 222, 7, 35, 5, 221, 159, 35, 5, 232, 80, 35, 5, - 232, 74, 35, 5, 232, 76, 35, 5, 232, 79, 35, 5, 232, 77, 35, 5, 232, 78, - 35, 5, 232, 75, 35, 5, 232, 73, 35, 5, 166, 35, 5, 218, 145, 35, 5, 219, - 78, 35, 5, 220, 119, 35, 5, 219, 188, 35, 5, 219, 207, 35, 5, 218, 251, - 35, 5, 218, 72, 35, 5, 203, 227, 35, 5, 203, 221, 35, 5, 203, 223, 35, 5, - 203, 226, 35, 5, 203, 224, 35, 5, 203, 225, 35, 5, 203, 222, 35, 5, 203, - 220, 35, 5, 169, 35, 5, 209, 140, 35, 5, 210, 72, 35, 5, 210, 244, 35, 5, - 210, 155, 35, 5, 210, 183, 35, 5, 209, 232, 35, 5, 209, 98, 35, 5, 183, - 35, 5, 204, 172, 35, 5, 206, 112, 35, 5, 209, 13, 35, 5, 208, 129, 35, 5, - 208, 147, 35, 5, 205, 200, 35, 5, 204, 67, 35, 5, 207, 50, 35, 5, 206, - 151, 35, 5, 206, 223, 35, 5, 207, 45, 35, 5, 206, 253, 35, 5, 206, 255, - 35, 5, 206, 198, 35, 5, 206, 130, 35, 5, 211, 159, 35, 5, 211, 97, 35, 5, - 211, 121, 35, 5, 211, 158, 35, 5, 211, 138, 35, 5, 211, 139, 35, 5, 211, - 109, 35, 5, 211, 108, 35, 5, 211, 50, 35, 5, 211, 46, 35, 5, 211, 49, 35, - 5, 211, 47, 35, 5, 211, 48, 35, 5, 211, 135, 35, 5, 211, 127, 35, 5, 211, - 130, 35, 5, 211, 134, 35, 5, 211, 131, 35, 5, 211, 132, 35, 5, 211, 129, - 35, 5, 211, 126, 35, 5, 211, 122, 35, 5, 211, 125, 35, 5, 211, 123, 35, - 5, 211, 124, 35, 5, 249, 145, 35, 5, 248, 21, 35, 5, 248, 184, 35, 5, - 249, 143, 35, 5, 248, 251, 35, 5, 249, 9, 35, 5, 248, 116, 35, 5, 247, - 224, 35, 5, 199, 152, 35, 5, 197, 220, 35, 5, 199, 34, 35, 5, 199, 151, - 35, 5, 199, 113, 35, 5, 199, 118, 35, 5, 198, 248, 35, 5, 197, 209, 35, - 5, 189, 35, 5, 201, 40, 35, 5, 202, 122, 35, 5, 203, 162, 35, 5, 203, 48, - 35, 5, 203, 68, 35, 5, 149, 35, 5, 200, 245, 35, 5, 247, 174, 35, 5, 241, - 41, 35, 5, 245, 11, 35, 5, 247, 173, 35, 5, 247, 49, 35, 5, 247, 57, 35, - 5, 244, 182, 35, 5, 240, 254, 35, 5, 196, 208, 35, 5, 196, 177, 35, 5, - 196, 196, 35, 5, 196, 207, 35, 5, 196, 201, 35, 5, 196, 202, 35, 5, 196, - 185, 35, 5, 196, 184, 35, 5, 196, 170, 35, 5, 196, 166, 35, 5, 196, 169, - 35, 5, 196, 167, 35, 5, 196, 168, 35, 5, 176, 35, 5, 215, 186, 35, 5, - 216, 223, 35, 5, 217, 244, 35, 5, 217, 107, 35, 5, 217, 118, 35, 5, 216, - 50, 35, 5, 215, 118, 35, 5, 215, 109, 35, 5, 215, 66, 35, 5, 215, 89, 35, - 5, 215, 108, 35, 5, 215, 97, 35, 5, 215, 98, 35, 5, 215, 73, 35, 5, 215, - 56, 35, 5, 233, 152, 63, 35, 5, 233, 152, 66, 35, 5, 233, 152, 68, 35, 5, - 233, 152, 252, 168, 35, 5, 233, 152, 237, 54, 35, 5, 233, 152, 69, 35, 5, - 233, 152, 72, 35, 5, 233, 152, 197, 166, 35, 5, 155, 35, 5, 223, 187, 35, - 5, 224, 101, 35, 5, 225, 55, 35, 5, 224, 200, 35, 5, 224, 209, 35, 5, - 224, 11, 35, 5, 224, 6, 35, 5, 223, 136, 35, 5, 223, 129, 35, 5, 223, - 135, 35, 5, 223, 130, 35, 5, 223, 131, 35, 5, 223, 122, 35, 5, 223, 116, - 35, 5, 223, 118, 35, 5, 223, 121, 35, 5, 223, 119, 35, 5, 223, 120, 35, - 5, 223, 117, 35, 5, 223, 115, 35, 5, 223, 111, 35, 5, 223, 114, 35, 5, - 223, 112, 35, 5, 223, 113, 35, 5, 197, 166, 35, 5, 196, 243, 35, 5, 197, - 70, 35, 5, 197, 160, 35, 5, 197, 98, 35, 5, 197, 109, 35, 5, 197, 34, 35, - 5, 197, 26, 35, 5, 212, 253, 63, 35, 5, 212, 253, 66, 35, 5, 212, 253, - 68, 35, 5, 212, 253, 252, 168, 35, 5, 212, 253, 237, 54, 35, 5, 212, 253, - 69, 35, 5, 212, 253, 72, 35, 5, 195, 115, 35, 5, 194, 255, 35, 5, 195, - 33, 35, 5, 195, 113, 35, 5, 195, 85, 35, 5, 195, 88, 35, 5, 195, 11, 35, - 5, 194, 242, 35, 5, 195, 74, 35, 5, 195, 51, 35, 5, 195, 60, 35, 5, 195, - 73, 35, 5, 195, 64, 35, 5, 195, 65, 35, 5, 195, 57, 35, 5, 195, 42, 35, - 5, 164, 35, 5, 195, 217, 35, 5, 196, 24, 35, 5, 196, 129, 35, 5, 196, 66, - 35, 5, 196, 69, 35, 5, 196, 3, 35, 5, 195, 243, 35, 5, 240, 136, 35, 5, - 237, 201, 35, 5, 239, 152, 35, 5, 240, 135, 35, 5, 239, 237, 35, 5, 239, - 252, 35, 5, 239, 28, 35, 5, 237, 167, 35, 5, 240, 41, 35, 5, 240, 6, 35, - 5, 240, 18, 35, 5, 240, 40, 35, 5, 240, 28, 35, 5, 240, 29, 35, 5, 240, - 11, 35, 5, 239, 253, 35, 5, 225, 214, 35, 5, 225, 110, 35, 5, 225, 172, - 35, 5, 225, 213, 35, 5, 225, 191, 35, 5, 225, 193, 35, 5, 225, 129, 35, - 5, 225, 88, 35, 5, 234, 123, 35, 5, 233, 76, 35, 5, 233, 192, 35, 5, 234, - 120, 35, 5, 234, 40, 35, 5, 234, 48, 35, 5, 233, 144, 35, 5, 233, 143, - 35, 5, 233, 34, 35, 5, 233, 30, 35, 5, 233, 33, 35, 5, 233, 31, 35, 5, - 233, 32, 35, 5, 234, 10, 35, 5, 233, 246, 35, 5, 234, 0, 35, 5, 234, 9, - 35, 5, 234, 4, 35, 5, 234, 5, 35, 5, 233, 250, 35, 5, 233, 235, 35, 5, - 202, 233, 35, 5, 202, 142, 35, 5, 202, 195, 35, 5, 202, 232, 35, 5, 202, - 215, 35, 5, 202, 217, 35, 5, 202, 169, 35, 5, 202, 133, 35, 5, 247, 16, - 35, 5, 245, 30, 35, 5, 245, 75, 35, 5, 247, 15, 35, 5, 245, 99, 35, 5, - 245, 103, 35, 5, 245, 49, 35, 5, 245, 19, 35, 5, 213, 6, 35, 5, 212, 226, - 35, 5, 212, 246, 35, 5, 213, 5, 35, 5, 212, 248, 35, 5, 212, 249, 35, 5, - 212, 234, 35, 5, 212, 222, 35, 5, 201, 113, 35, 5, 201, 86, 35, 5, 201, - 92, 35, 5, 201, 112, 35, 5, 201, 106, 35, 5, 201, 107, 35, 5, 201, 90, - 35, 5, 201, 84, 35, 5, 200, 186, 35, 5, 200, 178, 35, 5, 200, 182, 35, 5, - 200, 185, 35, 5, 200, 183, 35, 5, 200, 184, 35, 5, 200, 180, 35, 5, 200, - 179, 35, 5, 235, 239, 35, 5, 234, 223, 35, 5, 235, 153, 35, 5, 235, 238, - 35, 5, 235, 182, 35, 5, 235, 189, 35, 5, 235, 51, 35, 5, 234, 201, 35, 5, - 161, 35, 5, 211, 227, 35, 5, 212, 220, 35, 5, 213, 243, 35, 5, 213, 79, - 35, 5, 213, 92, 35, 5, 212, 117, 35, 5, 211, 185, 35, 5, 209, 88, 35, 5, - 218, 61, 35, 5, 234, 195, 35, 38, 234, 36, 26, 18, 222, 158, 78, 35, 38, - 18, 222, 158, 78, 35, 38, 234, 36, 78, 35, 208, 133, 78, 35, 197, 8, 35, - 234, 217, 204, 226, 35, 244, 159, 35, 207, 105, 35, 244, 168, 35, 212, - 32, 244, 168, 35, 211, 79, 78, 35, 213, 154, 207, 90, 35, 17, 100, 35, - 17, 102, 35, 17, 134, 35, 17, 136, 35, 17, 146, 35, 17, 167, 35, 17, 178, - 35, 17, 171, 35, 17, 182, 35, 31, 203, 23, 35, 31, 200, 234, 35, 31, 202, - 177, 35, 31, 235, 14, 35, 31, 235, 145, 35, 31, 206, 13, 35, 31, 207, 65, - 35, 31, 237, 20, 35, 31, 216, 174, 35, 31, 231, 57, 35, 31, 203, 24, 170, - 35, 5, 208, 138, 218, 72, 35, 5, 218, 68, 35, 5, 218, 69, 35, 5, 218, 70, - 35, 5, 208, 138, 247, 224, 35, 5, 247, 221, 35, 5, 247, 222, 35, 5, 247, - 223, 35, 5, 208, 138, 234, 201, 35, 5, 234, 197, 35, 5, 234, 198, 35, 5, - 234, 199, 35, 5, 208, 138, 211, 185, 35, 5, 211, 181, 35, 5, 211, 182, - 35, 5, 211, 183, 35, 202, 12, 117, 196, 6, 35, 202, 12, 117, 239, 197, - 35, 202, 12, 117, 210, 8, 35, 202, 12, 117, 206, 182, 210, 8, 35, 202, - 12, 117, 239, 126, 35, 202, 12, 117, 224, 181, 35, 202, 12, 117, 245, 57, - 35, 202, 12, 117, 232, 60, 35, 202, 12, 117, 239, 196, 35, 202, 12, 117, - 223, 152, 95, 1, 63, 95, 1, 69, 95, 1, 68, 95, 1, 72, 95, 1, 66, 95, 1, - 199, 230, 95, 1, 234, 123, 95, 1, 155, 95, 1, 234, 48, 95, 1, 233, 192, - 95, 1, 233, 144, 95, 1, 233, 76, 95, 1, 233, 36, 95, 1, 142, 95, 1, 232, - 147, 95, 1, 232, 71, 95, 1, 231, 193, 95, 1, 231, 75, 95, 1, 231, 44, 95, - 1, 172, 95, 1, 222, 197, 95, 1, 222, 109, 95, 1, 222, 7, 95, 1, 221, 191, - 95, 1, 221, 160, 95, 1, 166, 95, 1, 219, 207, 95, 1, 219, 78, 95, 1, 218, - 251, 95, 1, 218, 145, 95, 1, 176, 95, 1, 231, 217, 95, 1, 217, 231, 95, - 1, 217, 118, 95, 1, 216, 223, 95, 1, 216, 50, 95, 1, 215, 186, 95, 1, - 215, 120, 95, 1, 211, 96, 95, 1, 211, 82, 95, 1, 211, 75, 95, 1, 211, 65, - 95, 1, 211, 54, 95, 1, 211, 52, 95, 1, 183, 95, 1, 209, 80, 95, 1, 208, - 147, 95, 1, 206, 112, 95, 1, 205, 200, 95, 1, 204, 172, 95, 1, 204, 72, - 95, 1, 240, 136, 95, 1, 189, 95, 1, 239, 252, 95, 1, 203, 68, 95, 1, 239, - 152, 95, 1, 202, 122, 95, 1, 239, 28, 95, 1, 237, 201, 95, 1, 237, 170, - 95, 1, 239, 40, 95, 1, 202, 47, 95, 1, 202, 46, 95, 1, 202, 35, 95, 1, - 202, 34, 95, 1, 202, 33, 95, 1, 202, 32, 95, 1, 201, 113, 95, 1, 201, - 107, 95, 1, 201, 92, 95, 1, 201, 90, 95, 1, 201, 86, 95, 1, 201, 85, 95, - 1, 197, 166, 95, 1, 197, 109, 95, 1, 197, 70, 95, 1, 197, 34, 95, 1, 196, - 243, 95, 1, 196, 230, 95, 1, 164, 95, 1, 196, 69, 95, 1, 196, 24, 95, 1, - 196, 3, 95, 1, 195, 217, 95, 1, 195, 176, 95, 1, 218, 79, 95, 4, 1, 196, - 69, 95, 4, 1, 196, 24, 95, 4, 1, 196, 3, 95, 4, 1, 195, 217, 95, 4, 1, - 195, 176, 95, 4, 1, 218, 79, 21, 22, 231, 7, 21, 22, 69, 21, 22, 252, - 132, 21, 22, 68, 21, 22, 226, 120, 21, 22, 72, 21, 22, 214, 102, 21, 22, - 196, 147, 214, 102, 21, 22, 92, 237, 54, 21, 22, 92, 68, 21, 22, 63, 21, - 22, 252, 168, 21, 22, 197, 109, 21, 22, 197, 87, 197, 109, 21, 22, 197, - 70, 21, 22, 197, 87, 197, 70, 21, 22, 197, 54, 21, 22, 197, 87, 197, 54, - 21, 22, 197, 34, 21, 22, 197, 87, 197, 34, 21, 22, 197, 15, 21, 22, 197, - 87, 197, 15, 21, 22, 217, 205, 197, 15, 21, 22, 197, 166, 21, 22, 197, - 87, 197, 166, 21, 22, 197, 160, 21, 22, 197, 87, 197, 160, 21, 22, 217, - 205, 197, 160, 21, 22, 251, 200, 21, 22, 196, 147, 197, 199, 21, 22, 233, - 152, 204, 226, 21, 22, 48, 186, 21, 22, 48, 233, 100, 21, 22, 48, 248, - 85, 157, 210, 2, 21, 22, 48, 201, 243, 157, 210, 2, 21, 22, 48, 53, 157, - 210, 2, 21, 22, 48, 210, 2, 21, 22, 48, 52, 186, 21, 22, 48, 52, 206, - 182, 83, 204, 183, 21, 22, 48, 112, 238, 253, 21, 22, 48, 206, 182, 231, - 155, 106, 21, 22, 48, 212, 125, 21, 22, 48, 135, 203, 147, 21, 22, 236, - 230, 21, 22, 226, 86, 21, 22, 214, 119, 21, 22, 251, 106, 21, 22, 213, - 92, 21, 22, 213, 241, 21, 22, 212, 220, 21, 22, 212, 182, 21, 22, 212, - 117, 21, 22, 212, 91, 21, 22, 196, 147, 212, 91, 21, 22, 92, 232, 118, - 21, 22, 92, 232, 71, 21, 22, 161, 21, 22, 213, 243, 21, 22, 211, 183, 21, - 22, 197, 87, 211, 183, 21, 22, 211, 181, 21, 22, 197, 87, 211, 181, 21, - 22, 211, 180, 21, 22, 197, 87, 211, 180, 21, 22, 211, 178, 21, 22, 197, - 87, 211, 178, 21, 22, 211, 177, 21, 22, 197, 87, 211, 177, 21, 22, 211, - 185, 21, 22, 197, 87, 211, 185, 21, 22, 211, 184, 21, 22, 197, 87, 211, - 184, 21, 22, 196, 147, 211, 184, 21, 22, 214, 3, 21, 22, 197, 87, 214, 3, - 21, 22, 92, 233, 15, 21, 22, 203, 68, 21, 22, 203, 160, 21, 22, 202, 122, - 21, 22, 202, 99, 21, 22, 149, 21, 22, 201, 247, 21, 22, 196, 147, 201, - 247, 21, 22, 92, 239, 237, 21, 22, 92, 239, 152, 21, 22, 189, 21, 22, - 203, 162, 21, 22, 200, 243, 21, 22, 197, 87, 200, 243, 21, 22, 200, 221, - 21, 22, 197, 87, 200, 221, 21, 22, 200, 220, 21, 22, 197, 87, 200, 220, - 21, 22, 102, 21, 22, 197, 87, 102, 21, 22, 200, 211, 21, 22, 197, 87, - 200, 211, 21, 22, 200, 245, 21, 22, 197, 87, 200, 245, 21, 22, 200, 244, - 21, 22, 197, 87, 200, 244, 21, 22, 217, 205, 200, 244, 21, 22, 203, 216, - 21, 22, 201, 73, 21, 22, 201, 57, 21, 22, 201, 55, 21, 22, 201, 78, 21, - 22, 224, 209, 21, 22, 225, 49, 21, 22, 224, 101, 21, 22, 224, 80, 21, 22, - 224, 11, 21, 22, 223, 242, 21, 22, 196, 147, 223, 242, 21, 22, 155, 21, - 22, 225, 55, 21, 22, 223, 131, 21, 22, 197, 87, 223, 131, 21, 22, 223, - 129, 21, 22, 197, 87, 223, 129, 21, 22, 223, 128, 21, 22, 197, 87, 223, - 128, 21, 22, 223, 126, 21, 22, 197, 87, 223, 126, 21, 22, 223, 125, 21, - 22, 197, 87, 223, 125, 21, 22, 223, 136, 21, 22, 197, 87, 223, 136, 21, - 22, 223, 135, 21, 22, 197, 87, 223, 135, 21, 22, 217, 205, 223, 135, 21, - 22, 225, 80, 21, 22, 223, 137, 21, 22, 205, 158, 224, 193, 21, 22, 205, - 158, 224, 81, 21, 22, 205, 158, 224, 1, 21, 22, 205, 158, 225, 33, 21, - 22, 247, 57, 21, 22, 247, 172, 21, 22, 245, 11, 21, 22, 245, 1, 21, 22, - 244, 182, 21, 22, 241, 117, 21, 22, 196, 147, 241, 117, 21, 22, 247, 174, - 21, 22, 247, 173, 21, 22, 240, 252, 21, 22, 197, 87, 240, 252, 21, 22, - 240, 250, 21, 22, 197, 87, 240, 250, 21, 22, 240, 249, 21, 22, 197, 87, - 240, 249, 21, 22, 240, 248, 21, 22, 197, 87, 240, 248, 21, 22, 240, 247, - 21, 22, 197, 87, 240, 247, 21, 22, 240, 254, 21, 22, 197, 87, 240, 254, - 21, 22, 240, 253, 21, 22, 197, 87, 240, 253, 21, 22, 217, 205, 240, 253, - 21, 22, 247, 207, 21, 22, 208, 178, 202, 235, 21, 22, 219, 207, 21, 22, - 220, 118, 21, 22, 219, 78, 21, 22, 219, 40, 21, 22, 218, 251, 21, 22, - 218, 195, 21, 22, 196, 147, 218, 195, 21, 22, 166, 21, 22, 220, 119, 21, - 22, 218, 70, 21, 22, 197, 87, 218, 70, 21, 22, 218, 68, 21, 22, 197, 87, - 218, 68, 21, 22, 218, 67, 21, 22, 197, 87, 218, 67, 21, 22, 218, 66, 21, - 22, 197, 87, 218, 66, 21, 22, 218, 65, 21, 22, 197, 87, 218, 65, 21, 22, - 218, 72, 21, 22, 197, 87, 218, 72, 21, 22, 218, 71, 21, 22, 197, 87, 218, - 71, 21, 22, 217, 205, 218, 71, 21, 22, 221, 136, 21, 22, 197, 87, 221, - 136, 21, 22, 219, 82, 21, 22, 250, 166, 221, 136, 21, 22, 208, 178, 221, - 136, 21, 22, 217, 118, 21, 22, 217, 243, 21, 22, 216, 223, 21, 22, 216, - 190, 21, 22, 216, 50, 21, 22, 216, 33, 21, 22, 196, 147, 216, 33, 21, 22, - 176, 21, 22, 217, 244, 21, 22, 215, 116, 21, 22, 197, 87, 215, 116, 21, - 22, 215, 118, 21, 22, 197, 87, 215, 118, 21, 22, 215, 117, 21, 22, 197, - 87, 215, 117, 21, 22, 217, 205, 215, 117, 21, 22, 218, 55, 21, 22, 92, - 217, 73, 21, 22, 216, 228, 21, 22, 222, 197, 21, 22, 223, 81, 21, 22, - 222, 109, 21, 22, 222, 91, 21, 22, 222, 7, 21, 22, 221, 229, 21, 22, 196, - 147, 221, 229, 21, 22, 172, 21, 22, 223, 82, 21, 22, 221, 157, 21, 22, - 197, 87, 221, 157, 21, 22, 221, 156, 21, 22, 197, 87, 221, 156, 21, 22, - 221, 155, 21, 22, 197, 87, 221, 155, 21, 22, 221, 154, 21, 22, 197, 87, - 221, 154, 21, 22, 221, 153, 21, 22, 197, 87, 221, 153, 21, 22, 221, 159, - 21, 22, 197, 87, 221, 159, 21, 22, 221, 158, 21, 22, 197, 87, 221, 158, - 21, 22, 159, 21, 22, 197, 87, 159, 21, 22, 219, 194, 159, 21, 22, 208, - 147, 21, 22, 209, 11, 21, 22, 206, 112, 21, 22, 206, 84, 21, 22, 205, - 200, 21, 22, 205, 171, 21, 22, 196, 147, 205, 171, 21, 22, 183, 21, 22, - 209, 13, 21, 22, 204, 62, 21, 22, 197, 87, 204, 62, 21, 22, 204, 56, 21, - 22, 197, 87, 204, 56, 21, 22, 204, 55, 21, 22, 197, 87, 204, 55, 21, 22, - 204, 50, 21, 22, 197, 87, 204, 50, 21, 22, 204, 49, 21, 22, 197, 87, 204, - 49, 21, 22, 204, 67, 21, 22, 197, 87, 204, 67, 21, 22, 204, 66, 21, 22, - 197, 87, 204, 66, 21, 22, 217, 205, 204, 66, 21, 22, 209, 80, 21, 22, - 250, 166, 209, 80, 21, 22, 204, 68, 21, 22, 248, 133, 209, 80, 21, 22, - 218, 188, 206, 7, 21, 22, 217, 205, 205, 252, 21, 22, 217, 205, 209, 78, - 21, 22, 217, 205, 205, 96, 21, 22, 217, 205, 204, 175, 21, 22, 217, 205, - 205, 251, 21, 22, 217, 205, 208, 150, 21, 22, 206, 255, 21, 22, 206, 223, - 21, 22, 206, 218, 21, 22, 206, 198, 21, 22, 206, 190, 21, 22, 207, 50, - 21, 22, 207, 45, 21, 22, 206, 127, 21, 22, 197, 87, 206, 127, 21, 22, - 206, 126, 21, 22, 197, 87, 206, 126, 21, 22, 206, 125, 21, 22, 197, 87, - 206, 125, 21, 22, 206, 124, 21, 22, 197, 87, 206, 124, 21, 22, 206, 123, - 21, 22, 197, 87, 206, 123, 21, 22, 206, 130, 21, 22, 197, 87, 206, 130, - 21, 22, 206, 129, 21, 22, 197, 87, 206, 129, 21, 22, 207, 52, 21, 22, - 196, 69, 21, 22, 196, 127, 21, 22, 196, 24, 21, 22, 196, 14, 21, 22, 196, - 3, 21, 22, 195, 237, 21, 22, 196, 147, 195, 237, 21, 22, 164, 21, 22, - 196, 129, 21, 22, 195, 173, 21, 22, 197, 87, 195, 173, 21, 22, 195, 172, - 21, 22, 197, 87, 195, 172, 21, 22, 195, 171, 21, 22, 197, 87, 195, 171, - 21, 22, 195, 170, 21, 22, 197, 87, 195, 170, 21, 22, 195, 169, 21, 22, - 197, 87, 195, 169, 21, 22, 195, 175, 21, 22, 197, 87, 195, 175, 21, 22, - 195, 174, 21, 22, 197, 87, 195, 174, 21, 22, 217, 205, 195, 174, 21, 22, - 196, 148, 21, 22, 248, 182, 196, 148, 21, 22, 197, 87, 196, 148, 21, 22, - 208, 178, 196, 24, 21, 22, 210, 183, 21, 22, 211, 31, 210, 183, 21, 22, - 197, 87, 222, 197, 21, 22, 210, 243, 21, 22, 210, 72, 21, 22, 210, 9, 21, - 22, 209, 232, 21, 22, 209, 206, 21, 22, 197, 87, 222, 7, 21, 22, 169, 21, - 22, 210, 244, 21, 22, 197, 87, 172, 21, 22, 209, 97, 21, 22, 197, 87, - 209, 97, 21, 22, 144, 21, 22, 197, 87, 144, 21, 22, 219, 194, 144, 21, - 22, 235, 189, 21, 22, 235, 236, 21, 22, 235, 153, 21, 22, 235, 139, 21, - 22, 235, 51, 21, 22, 235, 40, 21, 22, 235, 239, 21, 22, 235, 238, 21, 22, - 234, 200, 21, 22, 197, 87, 234, 200, 21, 22, 236, 49, 21, 22, 202, 217, - 21, 22, 218, 53, 202, 217, 21, 22, 202, 195, 21, 22, 218, 53, 202, 195, - 21, 22, 202, 189, 21, 22, 218, 53, 202, 189, 21, 22, 202, 169, 21, 22, - 202, 164, 21, 22, 202, 233, 21, 22, 202, 232, 21, 22, 202, 132, 21, 22, - 197, 87, 202, 132, 21, 22, 202, 235, 21, 22, 201, 64, 21, 22, 201, 62, - 21, 22, 201, 61, 21, 22, 201, 66, 21, 22, 201, 67, 21, 22, 200, 204, 21, - 22, 200, 203, 21, 22, 200, 202, 21, 22, 200, 206, 21, 22, 215, 137, 232, - 147, 21, 22, 215, 137, 232, 71, 21, 22, 215, 137, 232, 43, 21, 22, 215, - 137, 231, 193, 21, 22, 215, 137, 231, 166, 21, 22, 215, 137, 142, 21, 22, - 215, 137, 232, 246, 21, 22, 215, 137, 233, 15, 21, 22, 215, 136, 233, 15, - 21, 22, 232, 27, 21, 22, 211, 155, 21, 22, 211, 121, 21, 22, 211, 115, - 21, 22, 211, 109, 21, 22, 211, 104, 21, 22, 211, 159, 21, 22, 211, 158, - 21, 22, 211, 167, 21, 22, 202, 43, 21, 22, 202, 41, 21, 22, 202, 40, 21, - 22, 202, 44, 21, 22, 197, 87, 210, 183, 21, 22, 197, 87, 210, 72, 21, 22, - 197, 87, 209, 232, 21, 22, 197, 87, 169, 21, 22, 217, 69, 21, 22, 217, - 19, 21, 22, 217, 15, 21, 22, 216, 252, 21, 22, 216, 247, 21, 22, 217, 71, - 21, 22, 217, 70, 21, 22, 217, 73, 21, 22, 216, 79, 21, 22, 208, 178, 206, - 255, 21, 22, 208, 178, 206, 223, 21, 22, 208, 178, 206, 198, 21, 22, 208, - 178, 207, 50, 21, 22, 197, 13, 202, 217, 21, 22, 197, 13, 202, 195, 21, - 22, 197, 13, 202, 169, 21, 22, 197, 13, 202, 233, 21, 22, 197, 13, 202, - 235, 21, 22, 222, 116, 21, 22, 222, 115, 21, 22, 222, 114, 21, 22, 222, - 113, 21, 22, 222, 122, 21, 22, 222, 121, 21, 22, 222, 123, 21, 22, 202, - 234, 202, 217, 21, 22, 202, 234, 202, 195, 21, 22, 202, 234, 202, 189, - 21, 22, 202, 234, 202, 169, 21, 22, 202, 234, 202, 164, 21, 22, 202, 234, - 202, 233, 21, 22, 202, 234, 202, 232, 21, 22, 202, 234, 202, 235, 21, 22, - 251, 184, 250, 112, 21, 22, 248, 133, 69, 21, 22, 248, 133, 68, 21, 22, - 248, 133, 72, 21, 22, 248, 133, 63, 21, 22, 248, 133, 197, 109, 21, 22, - 248, 133, 197, 70, 21, 22, 248, 133, 197, 34, 21, 22, 248, 133, 197, 166, - 21, 22, 248, 133, 217, 118, 21, 22, 248, 133, 216, 223, 21, 22, 248, 133, - 216, 50, 21, 22, 248, 133, 176, 21, 22, 248, 133, 224, 209, 21, 22, 248, - 133, 224, 101, 21, 22, 248, 133, 224, 11, 21, 22, 248, 133, 155, 21, 22, - 208, 178, 232, 147, 21, 22, 208, 178, 232, 71, 21, 22, 208, 178, 231, - 193, 21, 22, 208, 178, 142, 21, 22, 92, 233, 198, 21, 22, 92, 233, 202, - 21, 22, 92, 233, 216, 21, 22, 92, 233, 215, 21, 22, 92, 233, 204, 21, 22, - 92, 233, 230, 21, 22, 92, 209, 140, 21, 22, 92, 209, 232, 21, 22, 92, - 210, 183, 21, 22, 92, 210, 155, 21, 22, 92, 210, 72, 21, 22, 92, 169, 21, - 22, 92, 196, 243, 21, 22, 92, 197, 34, 21, 22, 92, 197, 109, 21, 22, 92, - 197, 98, 21, 22, 92, 197, 70, 21, 22, 92, 197, 166, 21, 22, 92, 231, 36, - 21, 22, 92, 231, 37, 21, 22, 92, 231, 40, 21, 22, 92, 231, 39, 21, 22, - 92, 231, 38, 21, 22, 92, 231, 43, 21, 22, 92, 202, 142, 21, 22, 92, 202, - 169, 21, 22, 92, 202, 217, 21, 22, 92, 202, 215, 21, 22, 92, 202, 195, - 21, 22, 92, 202, 233, 21, 22, 92, 201, 45, 21, 22, 92, 201, 55, 21, 22, - 92, 201, 73, 21, 22, 92, 201, 72, 21, 22, 92, 201, 57, 21, 22, 92, 201, - 78, 21, 22, 92, 211, 227, 21, 22, 92, 212, 117, 21, 22, 92, 213, 92, 21, - 22, 92, 213, 79, 21, 22, 92, 212, 220, 21, 22, 92, 161, 21, 22, 92, 214, - 3, 21, 22, 92, 233, 76, 21, 22, 92, 233, 144, 21, 22, 92, 234, 48, 21, - 22, 92, 234, 40, 21, 22, 92, 233, 192, 21, 22, 92, 234, 123, 21, 22, 92, - 224, 110, 21, 22, 92, 224, 117, 21, 22, 92, 224, 131, 21, 22, 92, 224, - 130, 21, 22, 92, 224, 124, 21, 22, 92, 224, 146, 21, 22, 92, 224, 31, 21, - 22, 92, 224, 32, 21, 22, 92, 224, 35, 21, 22, 92, 224, 34, 21, 22, 92, - 224, 33, 21, 22, 92, 224, 36, 21, 22, 92, 224, 37, 21, 22, 92, 215, 186, - 21, 22, 92, 216, 50, 21, 22, 92, 217, 118, 21, 22, 92, 217, 107, 21, 22, - 92, 216, 223, 21, 22, 92, 176, 21, 22, 92, 218, 145, 21, 22, 92, 218, - 251, 21, 22, 92, 219, 207, 21, 22, 92, 219, 188, 21, 22, 92, 219, 78, 21, - 22, 92, 166, 21, 22, 92, 195, 217, 21, 22, 92, 196, 3, 21, 22, 92, 196, - 69, 21, 22, 92, 196, 66, 21, 22, 92, 196, 24, 21, 22, 92, 164, 21, 22, - 92, 225, 110, 21, 22, 208, 178, 225, 110, 21, 22, 92, 225, 129, 21, 22, - 92, 225, 193, 21, 22, 92, 225, 191, 21, 22, 92, 225, 172, 21, 22, 208, - 178, 225, 172, 21, 22, 92, 225, 214, 21, 22, 92, 225, 143, 21, 22, 92, - 225, 147, 21, 22, 92, 225, 157, 21, 22, 92, 225, 156, 21, 22, 92, 225, - 155, 21, 22, 92, 225, 158, 21, 22, 92, 221, 191, 21, 22, 92, 222, 7, 21, - 22, 92, 222, 197, 21, 22, 92, 222, 188, 21, 22, 92, 222, 109, 21, 22, 92, - 172, 21, 22, 92, 239, 33, 21, 22, 92, 239, 34, 21, 22, 92, 239, 39, 21, - 22, 92, 239, 38, 21, 22, 92, 239, 35, 21, 22, 92, 239, 40, 21, 22, 92, - 222, 112, 21, 22, 92, 222, 114, 21, 22, 92, 222, 118, 21, 22, 92, 222, - 117, 21, 22, 92, 222, 116, 21, 22, 92, 222, 122, 21, 22, 92, 202, 38, 21, - 22, 92, 202, 40, 21, 22, 92, 202, 43, 21, 22, 92, 202, 42, 21, 22, 92, - 202, 41, 21, 22, 92, 202, 44, 21, 22, 92, 202, 33, 21, 22, 92, 202, 34, - 21, 22, 92, 202, 46, 21, 22, 92, 202, 45, 21, 22, 92, 202, 35, 21, 22, - 92, 202, 47, 21, 22, 92, 194, 255, 21, 22, 92, 195, 11, 21, 22, 92, 195, - 88, 21, 22, 92, 195, 85, 21, 22, 92, 195, 33, 21, 22, 92, 195, 115, 21, - 22, 92, 195, 158, 21, 22, 92, 84, 195, 158, 21, 22, 92, 237, 143, 21, 22, - 92, 237, 144, 21, 22, 92, 237, 153, 21, 22, 92, 237, 152, 21, 22, 92, - 237, 147, 21, 22, 92, 237, 156, 21, 22, 92, 204, 172, 21, 22, 92, 205, - 200, 21, 22, 92, 208, 147, 21, 22, 92, 208, 129, 21, 22, 92, 206, 112, - 21, 22, 92, 183, 21, 22, 92, 206, 151, 21, 22, 92, 206, 198, 21, 22, 92, - 206, 255, 21, 22, 92, 206, 253, 21, 22, 92, 206, 223, 21, 22, 92, 207, - 50, 21, 22, 92, 207, 52, 21, 22, 92, 201, 86, 21, 22, 92, 201, 90, 21, - 22, 92, 201, 107, 21, 22, 92, 201, 106, 21, 22, 92, 201, 92, 21, 22, 92, - 201, 113, 21, 22, 92, 245, 30, 21, 22, 92, 245, 49, 21, 22, 92, 245, 103, - 21, 22, 92, 245, 99, 21, 22, 92, 245, 75, 21, 22, 92, 247, 16, 21, 22, - 92, 201, 48, 21, 22, 92, 201, 49, 21, 22, 92, 201, 52, 21, 22, 92, 201, - 51, 21, 22, 92, 201, 50, 21, 22, 92, 201, 53, 21, 22, 245, 76, 55, 21, - 22, 234, 217, 204, 226, 21, 22, 211, 151, 21, 22, 217, 67, 21, 22, 216, - 76, 21, 22, 216, 75, 21, 22, 216, 74, 21, 22, 216, 73, 21, 22, 216, 78, - 21, 22, 216, 77, 21, 22, 197, 13, 202, 130, 21, 22, 197, 13, 202, 129, - 21, 22, 197, 13, 202, 128, 21, 22, 197, 13, 202, 127, 21, 22, 197, 13, - 202, 126, 21, 22, 197, 13, 202, 133, 21, 22, 197, 13, 202, 132, 21, 22, - 197, 13, 48, 202, 235, 21, 22, 248, 133, 197, 199, 214, 153, 205, 149, - 78, 214, 153, 1, 248, 233, 214, 153, 1, 221, 177, 214, 153, 1, 235, 186, - 214, 153, 1, 208, 251, 214, 153, 1, 216, 172, 214, 153, 1, 200, 111, 214, - 153, 1, 240, 109, 214, 153, 1, 202, 71, 214, 153, 1, 244, 171, 214, 153, - 1, 247, 44, 214, 153, 1, 218, 128, 214, 153, 1, 233, 123, 214, 153, 1, - 217, 57, 214, 153, 1, 204, 219, 214, 153, 1, 209, 127, 214, 153, 1, 251, - 196, 214, 153, 1, 214, 106, 214, 153, 1, 200, 21, 214, 153, 1, 237, 80, - 214, 153, 1, 226, 11, 214, 153, 1, 237, 81, 214, 153, 1, 214, 72, 214, - 153, 1, 200, 88, 214, 153, 1, 226, 126, 214, 153, 1, 237, 78, 214, 153, - 1, 213, 69, 214, 153, 235, 185, 78, 214, 153, 210, 89, 235, 185, 78, 209, - 116, 1, 235, 175, 235, 166, 235, 190, 236, 49, 209, 116, 1, 199, 230, - 209, 116, 1, 200, 6, 200, 22, 66, 209, 116, 1, 195, 220, 209, 116, 1, - 196, 148, 209, 116, 1, 197, 199, 209, 116, 1, 202, 135, 202, 134, 202, - 162, 209, 116, 1, 236, 121, 209, 116, 1, 251, 70, 63, 209, 116, 1, 214, - 54, 72, 209, 116, 1, 252, 26, 63, 209, 116, 1, 251, 229, 209, 116, 1, - 221, 236, 72, 209, 116, 1, 206, 175, 72, 209, 116, 1, 72, 209, 116, 1, - 214, 164, 209, 116, 1, 214, 119, 209, 116, 1, 210, 222, 210, 235, 210, - 140, 144, 209, 116, 1, 224, 225, 209, 116, 1, 247, 40, 209, 116, 1, 224, - 226, 225, 80, 209, 116, 1, 234, 190, 209, 116, 1, 236, 215, 209, 116, 1, - 234, 43, 233, 21, 234, 190, 209, 116, 1, 234, 83, 209, 116, 1, 196, 235, - 196, 226, 197, 199, 209, 116, 1, 232, 237, 233, 15, 209, 116, 1, 232, - 241, 233, 15, 209, 116, 1, 221, 238, 233, 15, 209, 116, 1, 206, 178, 233, - 15, 209, 116, 1, 217, 200, 215, 99, 217, 201, 218, 55, 209, 116, 1, 206, - 176, 218, 55, 209, 116, 1, 237, 247, 209, 116, 1, 225, 245, 225, 249, - 225, 236, 68, 209, 116, 1, 69, 209, 116, 1, 225, 183, 225, 217, 209, 116, - 1, 234, 24, 209, 116, 1, 221, 239, 251, 245, 209, 116, 1, 206, 180, 63, - 209, 116, 1, 225, 228, 236, 188, 209, 116, 1, 213, 25, 213, 50, 214, 3, - 209, 116, 1, 251, 157, 236, 186, 209, 116, 1, 205, 155, 209, 80, 209, - 116, 1, 206, 88, 221, 235, 209, 80, 209, 116, 1, 206, 174, 209, 80, 209, - 116, 1, 247, 207, 209, 116, 1, 195, 158, 209, 116, 1, 202, 52, 202, 64, - 200, 188, 203, 216, 209, 116, 1, 206, 173, 203, 216, 209, 116, 1, 240, - 231, 209, 116, 1, 248, 211, 248, 214, 248, 139, 250, 112, 209, 116, 1, - 206, 179, 250, 112, 209, 116, 1, 237, 246, 209, 116, 1, 214, 86, 209, - 116, 1, 237, 34, 237, 41, 69, 209, 116, 1, 220, 51, 220, 63, 221, 136, - 209, 116, 1, 221, 237, 221, 136, 209, 116, 1, 206, 177, 221, 136, 209, - 116, 1, 222, 212, 223, 59, 221, 246, 159, 209, 116, 1, 237, 248, 209, - 116, 1, 226, 59, 209, 116, 1, 226, 60, 209, 116, 1, 240, 123, 240, 129, - 240, 231, 209, 116, 1, 214, 47, 236, 120, 72, 209, 116, 1, 237, 76, 209, - 116, 1, 226, 9, 209, 116, 1, 240, 251, 209, 116, 1, 247, 157, 209, 116, - 1, 247, 56, 209, 116, 1, 205, 13, 209, 116, 1, 221, 234, 209, 116, 1, - 206, 172, 209, 116, 1, 230, 200, 209, 116, 1, 211, 167, 209, 116, 1, 196, - 222, 209, 116, 206, 62, 211, 213, 209, 116, 218, 120, 211, 213, 209, 116, - 241, 62, 211, 213, 209, 116, 250, 233, 105, 209, 116, 200, 247, 105, 209, - 116, 248, 231, 105, 209, 116, 1, 225, 80, 209, 116, 1, 207, 52, 209, 116, - 1, 214, 102, 209, 116, 1, 234, 247, 247, 95, 214, 53, 209, 116, 1, 234, - 247, 247, 95, 225, 248, 209, 116, 1, 234, 247, 247, 95, 237, 40, 209, - 116, 1, 234, 247, 247, 95, 252, 25, 209, 116, 1, 234, 247, 247, 95, 251, - 229, 203, 142, 1, 63, 203, 142, 1, 68, 203, 142, 1, 66, 203, 142, 1, 155, - 203, 142, 1, 234, 123, 203, 142, 1, 217, 71, 203, 142, 1, 189, 203, 142, - 1, 240, 136, 203, 142, 1, 176, 203, 142, 1, 161, 203, 142, 1, 249, 145, - 203, 142, 1, 166, 203, 142, 1, 164, 203, 142, 1, 172, 203, 142, 1, 197, - 166, 203, 142, 1, 183, 203, 142, 1, 142, 203, 142, 18, 2, 68, 203, 142, - 18, 2, 66, 203, 142, 2, 199, 7, 232, 179, 1, 63, 232, 179, 1, 68, 232, - 179, 1, 66, 232, 179, 1, 155, 232, 179, 1, 234, 123, 232, 179, 1, 217, - 71, 232, 179, 1, 189, 232, 179, 1, 240, 136, 232, 179, 1, 176, 232, 179, - 1, 161, 232, 179, 1, 249, 145, 232, 179, 1, 166, 232, 179, 1, 164, 232, - 179, 1, 169, 232, 179, 1, 172, 232, 179, 1, 197, 166, 232, 179, 1, 183, - 232, 179, 1, 142, 232, 179, 18, 2, 68, 232, 179, 18, 2, 66, 232, 179, 2, - 213, 194, 212, 239, 206, 62, 211, 213, 212, 239, 52, 211, 213, 248, 13, - 1, 63, 248, 13, 1, 68, 248, 13, 1, 66, 248, 13, 1, 155, 248, 13, 1, 234, - 123, 248, 13, 1, 217, 71, 248, 13, 1, 189, 248, 13, 1, 240, 136, 248, 13, - 1, 176, 248, 13, 1, 161, 248, 13, 1, 249, 145, 248, 13, 1, 166, 248, 13, - 1, 164, 248, 13, 1, 169, 248, 13, 1, 172, 248, 13, 1, 197, 166, 248, 13, - 1, 183, 248, 13, 1, 142, 248, 13, 18, 2, 68, 248, 13, 18, 2, 66, 203, - 141, 1, 63, 203, 141, 1, 68, 203, 141, 1, 66, 203, 141, 1, 155, 203, 141, - 1, 234, 123, 203, 141, 1, 217, 71, 203, 141, 1, 189, 203, 141, 1, 240, - 136, 203, 141, 1, 176, 203, 141, 1, 161, 203, 141, 1, 249, 145, 203, 141, - 1, 166, 203, 141, 1, 164, 203, 141, 1, 172, 203, 141, 1, 197, 166, 203, - 141, 1, 183, 203, 141, 18, 2, 68, 203, 141, 18, 2, 66, 89, 1, 155, 89, 1, - 224, 146, 89, 1, 224, 11, 89, 1, 224, 117, 89, 1, 216, 252, 89, 1, 247, - 174, 89, 1, 247, 16, 89, 1, 244, 182, 89, 1, 245, 49, 89, 1, 215, 73, 89, - 1, 240, 136, 89, 1, 201, 66, 89, 1, 239, 28, 89, 1, 201, 61, 89, 1, 216, - 56, 89, 1, 189, 89, 1, 202, 233, 89, 1, 149, 89, 1, 202, 169, 89, 1, 216, - 50, 89, 1, 249, 145, 89, 1, 213, 6, 89, 1, 212, 117, 89, 1, 212, 234, 89, - 1, 218, 251, 89, 1, 196, 3, 89, 1, 209, 232, 89, 1, 222, 7, 89, 1, 198, - 248, 89, 1, 207, 50, 89, 1, 205, 39, 89, 1, 183, 89, 1, 142, 89, 1, 172, - 89, 1, 211, 159, 89, 226, 73, 18, 211, 145, 89, 226, 73, 18, 211, 158, - 89, 226, 73, 18, 211, 121, 89, 226, 73, 18, 211, 115, 89, 226, 73, 18, - 211, 97, 89, 226, 73, 18, 211, 66, 89, 226, 73, 18, 211, 54, 89, 226, 73, - 18, 211, 53, 89, 226, 73, 18, 209, 89, 89, 226, 73, 18, 209, 82, 89, 226, - 73, 18, 221, 151, 89, 226, 73, 18, 221, 139, 89, 226, 73, 18, 211, 139, - 89, 226, 73, 18, 211, 151, 89, 226, 73, 18, 211, 105, 200, 201, 100, 89, - 226, 73, 18, 211, 105, 200, 201, 102, 89, 226, 73, 18, 211, 141, 89, 18, - 226, 57, 251, 18, 89, 18, 226, 57, 252, 168, 89, 18, 2, 252, 168, 89, 18, - 2, 68, 89, 18, 2, 226, 120, 89, 18, 2, 196, 148, 89, 18, 2, 195, 168, 89, - 18, 2, 66, 89, 18, 2, 199, 245, 89, 18, 2, 200, 114, 89, 18, 2, 214, 164, - 89, 18, 2, 164, 89, 18, 2, 226, 147, 89, 18, 2, 69, 89, 18, 2, 251, 245, - 89, 18, 2, 251, 200, 89, 18, 2, 214, 102, 89, 18, 2, 250, 150, 89, 2, - 216, 188, 89, 2, 210, 177, 89, 2, 195, 179, 89, 2, 218, 83, 89, 2, 201, - 168, 89, 2, 249, 82, 89, 2, 209, 221, 89, 2, 202, 21, 89, 2, 225, 24, 89, - 2, 251, 202, 89, 2, 208, 220, 208, 212, 89, 2, 199, 4, 89, 2, 244, 174, - 89, 2, 249, 52, 89, 2, 224, 138, 89, 2, 249, 77, 89, 2, 247, 145, 212, - 183, 223, 143, 89, 2, 222, 165, 201, 247, 89, 2, 248, 199, 89, 2, 212, - 236, 218, 138, 89, 2, 223, 240, 89, 241, 17, 16, 210, 56, 89, 2, 250, - 131, 89, 2, 250, 153, 89, 17, 195, 79, 89, 17, 100, 89, 17, 102, 89, 17, - 134, 89, 17, 136, 89, 17, 146, 89, 17, 167, 89, 17, 178, 89, 17, 171, 89, - 17, 182, 89, 16, 222, 165, 250, 155, 205, 174, 89, 16, 222, 165, 250, - 155, 218, 104, 89, 16, 222, 165, 250, 155, 212, 182, 89, 16, 222, 165, - 250, 155, 248, 234, 89, 16, 222, 165, 250, 155, 247, 249, 89, 16, 222, - 165, 250, 155, 212, 49, 89, 16, 222, 165, 250, 155, 212, 43, 89, 16, 222, - 165, 250, 155, 212, 41, 89, 16, 222, 165, 250, 155, 212, 47, 89, 16, 222, - 165, 250, 155, 212, 45, 96, 248, 154, 96, 236, 247, 96, 244, 159, 96, - 234, 217, 204, 226, 96, 244, 168, 96, 235, 7, 238, 250, 96, 202, 20, 205, - 186, 231, 7, 96, 206, 104, 5, 248, 81, 220, 24, 96, 220, 59, 244, 159, - 96, 220, 59, 234, 217, 204, 226, 96, 216, 170, 96, 234, 246, 62, 208, - 115, 100, 96, 234, 246, 62, 208, 115, 102, 96, 234, 246, 62, 208, 115, - 134, 96, 18, 207, 90, 96, 17, 195, 79, 96, 17, 100, 96, 17, 102, 96, 17, - 134, 96, 17, 136, 96, 17, 146, 96, 17, 167, 96, 17, 178, 96, 17, 171, 96, - 17, 182, 96, 1, 63, 96, 1, 69, 96, 1, 68, 96, 1, 72, 96, 1, 66, 96, 1, - 214, 164, 96, 1, 200, 99, 96, 1, 237, 54, 96, 1, 176, 96, 1, 251, 97, 96, - 1, 249, 145, 96, 1, 161, 96, 1, 211, 159, 96, 1, 234, 123, 96, 1, 166, - 96, 1, 172, 96, 1, 183, 96, 1, 207, 50, 96, 1, 189, 96, 1, 240, 136, 96, - 1, 247, 16, 96, 1, 225, 214, 96, 1, 164, 96, 1, 169, 96, 1, 197, 166, 96, - 1, 235, 239, 96, 1, 155, 96, 1, 224, 146, 96, 1, 201, 113, 96, 1, 195, - 115, 96, 1, 232, 246, 96, 1, 195, 3, 96, 1, 222, 122, 96, 1, 195, 60, 96, - 1, 245, 75, 96, 1, 202, 20, 181, 18, 55, 96, 1, 202, 20, 69, 96, 1, 202, - 20, 68, 96, 1, 202, 20, 72, 96, 1, 202, 20, 66, 96, 1, 202, 20, 214, 164, - 96, 1, 202, 20, 200, 99, 96, 1, 202, 20, 251, 97, 96, 1, 202, 20, 249, - 145, 96, 1, 202, 20, 161, 96, 1, 202, 20, 211, 159, 96, 1, 202, 20, 234, - 123, 96, 1, 202, 20, 166, 96, 1, 202, 20, 189, 96, 1, 202, 20, 240, 136, - 96, 1, 202, 20, 247, 16, 96, 1, 202, 20, 225, 214, 96, 1, 202, 20, 201, - 113, 96, 1, 202, 20, 164, 96, 1, 202, 20, 197, 166, 96, 1, 202, 20, 155, - 96, 1, 202, 20, 234, 120, 96, 1, 202, 20, 232, 246, 96, 1, 202, 20, 225, - 171, 96, 1, 202, 20, 216, 213, 96, 1, 202, 20, 237, 156, 96, 1, 206, 104, - 69, 96, 1, 206, 104, 68, 96, 1, 206, 104, 225, 225, 96, 1, 206, 104, 200, - 99, 96, 1, 206, 104, 66, 96, 1, 206, 104, 251, 97, 96, 1, 206, 104, 155, - 96, 1, 206, 104, 234, 123, 96, 1, 206, 104, 142, 96, 1, 206, 104, 161, - 96, 1, 206, 104, 207, 50, 96, 1, 206, 104, 189, 96, 1, 206, 104, 240, - 136, 96, 1, 206, 104, 225, 214, 96, 1, 206, 104, 235, 239, 96, 1, 206, - 104, 234, 120, 96, 1, 206, 104, 232, 246, 96, 1, 206, 104, 201, 113, 96, - 1, 206, 104, 195, 115, 96, 1, 206, 104, 210, 244, 96, 1, 206, 104, 247, - 16, 96, 1, 206, 104, 195, 74, 96, 1, 220, 59, 68, 96, 1, 220, 59, 155, - 96, 1, 220, 59, 169, 96, 1, 220, 59, 235, 239, 96, 1, 220, 59, 195, 74, - 96, 1, 247, 17, 3, 99, 238, 250, 96, 1, 251, 156, 234, 103, 251, 52, 100, - 96, 1, 251, 156, 234, 103, 199, 3, 100, 96, 1, 251, 156, 234, 103, 240, - 97, 96, 1, 251, 156, 234, 103, 200, 109, 96, 1, 251, 156, 234, 103, 226, - 17, 200, 109, 96, 1, 251, 156, 234, 103, 249, 96, 96, 1, 251, 156, 234, - 103, 115, 249, 96, 96, 1, 251, 156, 234, 103, 63, 96, 1, 251, 156, 234, - 103, 68, 96, 1, 251, 156, 234, 103, 155, 96, 1, 251, 156, 234, 103, 217, - 71, 96, 1, 251, 156, 234, 103, 247, 174, 96, 1, 251, 156, 234, 103, 201, - 78, 96, 1, 251, 156, 234, 103, 201, 66, 96, 1, 251, 156, 234, 103, 240, - 41, 96, 1, 251, 156, 234, 103, 216, 86, 96, 1, 251, 156, 234, 103, 189, - 96, 1, 251, 156, 234, 103, 240, 136, 96, 1, 251, 156, 234, 103, 161, 96, - 1, 251, 156, 234, 103, 213, 6, 96, 1, 251, 156, 234, 103, 205, 80, 96, 1, - 251, 156, 234, 103, 195, 74, 96, 1, 251, 156, 234, 103, 195, 115, 96, 1, - 251, 156, 234, 103, 251, 209, 96, 1, 202, 20, 251, 156, 234, 103, 189, - 96, 1, 202, 20, 251, 156, 234, 103, 195, 74, 96, 1, 220, 59, 251, 156, - 234, 103, 233, 230, 96, 1, 220, 59, 251, 156, 234, 103, 217, 71, 96, 1, - 220, 59, 251, 156, 234, 103, 247, 174, 96, 1, 220, 59, 251, 156, 234, - 103, 225, 180, 96, 1, 220, 59, 251, 156, 234, 103, 201, 78, 96, 1, 220, - 59, 251, 156, 234, 103, 240, 25, 96, 1, 220, 59, 251, 156, 234, 103, 189, - 96, 1, 220, 59, 251, 156, 234, 103, 239, 176, 96, 1, 220, 59, 251, 156, - 234, 103, 205, 80, 96, 1, 220, 59, 251, 156, 234, 103, 240, 245, 96, 1, - 220, 59, 251, 156, 234, 103, 195, 74, 96, 1, 220, 59, 251, 156, 234, 103, - 195, 115, 96, 1, 251, 156, 234, 103, 157, 66, 96, 1, 251, 156, 234, 103, - 157, 164, 96, 1, 220, 59, 251, 156, 234, 103, 248, 197, 96, 1, 251, 156, - 234, 103, 240, 124, 96, 1, 220, 59, 251, 156, 234, 103, 222, 122, 21, 22, - 214, 8, 21, 22, 250, 122, 21, 22, 252, 122, 21, 22, 197, 112, 21, 22, - 212, 55, 21, 22, 213, 101, 21, 22, 211, 176, 21, 22, 203, 77, 21, 22, - 224, 216, 21, 22, 223, 133, 21, 22, 219, 251, 21, 22, 216, 1, 21, 22, - 217, 195, 21, 22, 222, 207, 21, 22, 205, 153, 21, 22, 208, 180, 21, 22, - 206, 160, 21, 22, 207, 3, 21, 22, 206, 122, 21, 22, 195, 226, 21, 22, - 196, 75, 21, 22, 210, 191, 21, 22, 215, 115, 21, 22, 214, 141, 215, 115, - 21, 22, 215, 114, 21, 22, 214, 141, 215, 114, 21, 22, 215, 113, 21, 22, - 214, 141, 215, 113, 21, 22, 215, 112, 21, 22, 214, 141, 215, 112, 21, 22, - 209, 94, 21, 22, 209, 93, 21, 22, 209, 92, 21, 22, 209, 91, 21, 22, 209, - 90, 21, 22, 209, 98, 21, 22, 214, 141, 214, 3, 21, 22, 214, 141, 203, - 216, 21, 22, 214, 141, 225, 80, 21, 22, 214, 141, 247, 207, 21, 22, 214, - 141, 221, 136, 21, 22, 214, 141, 218, 55, 21, 22, 214, 141, 209, 80, 21, - 22, 214, 141, 207, 52, 21, 22, 237, 67, 197, 199, 21, 22, 197, 86, 197, - 199, 21, 22, 48, 4, 210, 2, 21, 22, 48, 210, 215, 238, 253, 21, 22, 211, - 31, 209, 95, 21, 22, 197, 87, 221, 229, 21, 22, 197, 87, 223, 82, 21, 22, - 202, 131, 21, 22, 202, 133, 21, 22, 201, 58, 21, 22, 201, 60, 21, 22, - 201, 65, 21, 22, 202, 37, 21, 22, 202, 39, 21, 22, 208, 178, 206, 127, - 21, 22, 208, 178, 206, 190, 21, 22, 208, 178, 231, 166, 21, 22, 92, 233, - 29, 21, 22, 92, 239, 210, 234, 40, 21, 22, 92, 234, 120, 21, 22, 92, 233, - 34, 21, 22, 208, 178, 225, 90, 21, 22, 92, 225, 88, 21, 22, 248, 254, - 239, 210, 159, 21, 22, 248, 254, 239, 210, 144, 21, 22, 92, 239, 205, - 209, 80, 222, 85, 198, 226, 222, 135, 222, 85, 1, 155, 222, 85, 1, 224, - 146, 222, 85, 1, 234, 123, 222, 85, 1, 233, 230, 222, 85, 1, 217, 71, - 222, 85, 1, 247, 174, 222, 85, 1, 247, 16, 222, 85, 1, 225, 214, 222, 85, - 1, 225, 180, 222, 85, 1, 196, 97, 222, 85, 1, 189, 222, 85, 1, 202, 233, - 222, 85, 1, 240, 136, 222, 85, 1, 239, 176, 222, 85, 1, 176, 222, 85, 1, - 161, 222, 85, 1, 213, 6, 222, 85, 1, 249, 145, 222, 85, 1, 248, 197, 222, - 85, 1, 166, 222, 85, 1, 164, 222, 85, 1, 169, 222, 85, 1, 172, 222, 85, - 1, 197, 166, 222, 85, 1, 207, 50, 222, 85, 1, 205, 80, 222, 85, 1, 183, - 222, 85, 1, 142, 222, 85, 1, 233, 25, 222, 85, 1, 201, 217, 222, 85, 18, - 2, 63, 222, 85, 18, 2, 68, 222, 85, 18, 2, 66, 222, 85, 18, 2, 237, 54, - 222, 85, 18, 2, 251, 200, 222, 85, 18, 2, 214, 102, 222, 85, 18, 2, 250, - 150, 222, 85, 18, 2, 69, 222, 85, 18, 2, 72, 222, 85, 204, 152, 1, 164, - 222, 85, 204, 152, 1, 169, 222, 85, 204, 152, 1, 197, 166, 222, 85, 4, 1, - 155, 222, 85, 4, 1, 217, 71, 222, 85, 4, 1, 251, 51, 222, 85, 4, 1, 189, - 222, 85, 4, 1, 176, 222, 85, 4, 1, 161, 222, 85, 4, 1, 166, 222, 85, 4, - 1, 169, 222, 85, 4, 1, 172, 222, 85, 2, 218, 125, 222, 85, 2, 224, 188, - 222, 85, 2, 209, 14, 222, 85, 2, 221, 229, 222, 85, 236, 90, 78, 222, 85, - 211, 79, 78, 222, 85, 17, 195, 79, 222, 85, 17, 100, 222, 85, 17, 102, - 222, 85, 17, 134, 222, 85, 17, 136, 222, 85, 17, 146, 222, 85, 17, 167, - 222, 85, 17, 178, 222, 85, 17, 171, 222, 85, 17, 182, 49, 222, 198, 1, - 155, 49, 222, 198, 1, 196, 208, 49, 222, 198, 1, 217, 71, 49, 222, 198, - 1, 201, 113, 49, 222, 198, 1, 183, 49, 222, 198, 1, 164, 49, 222, 198, 1, - 189, 49, 222, 198, 1, 202, 233, 49, 222, 198, 1, 172, 49, 222, 198, 1, - 161, 49, 222, 198, 1, 213, 6, 49, 222, 198, 1, 166, 49, 222, 198, 1, 235, - 239, 49, 222, 198, 1, 199, 152, 49, 222, 198, 1, 142, 49, 222, 198, 1, - 211, 159, 49, 222, 198, 1, 224, 146, 49, 222, 198, 1, 201, 103, 49, 222, - 198, 1, 176, 49, 222, 198, 1, 63, 49, 222, 198, 1, 68, 49, 222, 198, 1, - 237, 54, 49, 222, 198, 1, 237, 40, 49, 222, 198, 1, 66, 49, 222, 198, 1, - 214, 102, 49, 222, 198, 1, 72, 49, 222, 198, 1, 200, 99, 49, 222, 198, 1, - 69, 49, 222, 198, 1, 250, 148, 49, 222, 198, 1, 251, 200, 49, 222, 198, - 1, 202, 9, 49, 222, 198, 1, 202, 8, 49, 222, 198, 1, 202, 7, 49, 222, - 198, 1, 202, 6, 49, 222, 198, 1, 202, 5, 217, 83, 49, 221, 185, 1, 130, - 211, 159, 217, 83, 49, 221, 185, 1, 126, 211, 159, 217, 83, 49, 221, 185, - 1, 130, 155, 217, 83, 49, 221, 185, 1, 130, 196, 208, 217, 83, 49, 221, - 185, 1, 130, 217, 71, 217, 83, 49, 221, 185, 1, 126, 155, 217, 83, 49, - 221, 185, 1, 126, 196, 208, 217, 83, 49, 221, 185, 1, 126, 217, 71, 217, - 83, 49, 221, 185, 1, 130, 201, 113, 217, 83, 49, 221, 185, 1, 130, 183, - 217, 83, 49, 221, 185, 1, 130, 164, 217, 83, 49, 221, 185, 1, 126, 201, - 113, 217, 83, 49, 221, 185, 1, 126, 183, 217, 83, 49, 221, 185, 1, 126, - 164, 217, 83, 49, 221, 185, 1, 130, 189, 217, 83, 49, 221, 185, 1, 130, - 202, 233, 217, 83, 49, 221, 185, 1, 130, 176, 217, 83, 49, 221, 185, 1, - 126, 189, 217, 83, 49, 221, 185, 1, 126, 202, 233, 217, 83, 49, 221, 185, - 1, 126, 176, 217, 83, 49, 221, 185, 1, 130, 161, 217, 83, 49, 221, 185, - 1, 130, 213, 6, 217, 83, 49, 221, 185, 1, 130, 166, 217, 83, 49, 221, - 185, 1, 126, 161, 217, 83, 49, 221, 185, 1, 126, 213, 6, 217, 83, 49, - 221, 185, 1, 126, 166, 217, 83, 49, 221, 185, 1, 130, 235, 239, 217, 83, - 49, 221, 185, 1, 130, 199, 152, 217, 83, 49, 221, 185, 1, 130, 172, 217, - 83, 49, 221, 185, 1, 126, 235, 239, 217, 83, 49, 221, 185, 1, 126, 199, - 152, 217, 83, 49, 221, 185, 1, 126, 172, 217, 83, 49, 221, 185, 1, 130, - 142, 217, 83, 49, 221, 185, 1, 130, 240, 136, 217, 83, 49, 221, 185, 1, - 130, 249, 145, 217, 83, 49, 221, 185, 1, 126, 142, 217, 83, 49, 221, 185, - 1, 126, 240, 136, 217, 83, 49, 221, 185, 1, 126, 249, 145, 217, 83, 49, - 221, 185, 1, 130, 223, 138, 217, 83, 49, 221, 185, 1, 130, 196, 174, 217, - 83, 49, 221, 185, 1, 126, 223, 138, 217, 83, 49, 221, 185, 1, 126, 196, - 174, 217, 83, 49, 221, 185, 1, 130, 204, 163, 217, 83, 49, 221, 185, 1, - 126, 204, 163, 217, 83, 49, 221, 185, 18, 2, 18, 206, 170, 217, 83, 49, - 221, 185, 18, 2, 252, 168, 217, 83, 49, 221, 185, 18, 2, 226, 120, 217, - 83, 49, 221, 185, 18, 2, 66, 217, 83, 49, 221, 185, 18, 2, 199, 245, 217, - 83, 49, 221, 185, 18, 2, 69, 217, 83, 49, 221, 185, 18, 2, 251, 245, 217, - 83, 49, 221, 185, 18, 2, 72, 217, 83, 49, 221, 185, 18, 2, 214, 190, 217, - 83, 49, 221, 185, 18, 2, 200, 99, 217, 83, 49, 221, 185, 18, 2, 250, 122, - 217, 83, 49, 221, 185, 18, 2, 252, 122, 217, 83, 49, 221, 185, 18, 2, - 199, 237, 217, 83, 49, 221, 185, 18, 2, 214, 8, 217, 83, 49, 221, 185, - 18, 2, 214, 187, 217, 83, 49, 221, 185, 18, 2, 200, 94, 217, 83, 49, 221, - 185, 18, 2, 225, 225, 217, 83, 49, 221, 185, 1, 48, 199, 230, 217, 83, - 49, 221, 185, 1, 48, 217, 73, 217, 83, 49, 221, 185, 1, 48, 218, 55, 217, - 83, 49, 221, 185, 1, 48, 221, 136, 217, 83, 49, 221, 185, 1, 48, 225, 80, - 217, 83, 49, 221, 185, 1, 48, 240, 231, 217, 83, 49, 221, 185, 1, 48, - 250, 112, 217, 83, 49, 221, 185, 152, 220, 28, 217, 83, 49, 221, 185, - 152, 220, 27, 217, 83, 49, 221, 185, 17, 195, 79, 217, 83, 49, 221, 185, - 17, 100, 217, 83, 49, 221, 185, 17, 102, 217, 83, 49, 221, 185, 17, 134, - 217, 83, 49, 221, 185, 17, 136, 217, 83, 49, 221, 185, 17, 146, 217, 83, - 49, 221, 185, 17, 167, 217, 83, 49, 221, 185, 17, 178, 217, 83, 49, 221, - 185, 17, 171, 217, 83, 49, 221, 185, 17, 182, 217, 83, 49, 221, 185, 120, - 17, 100, 217, 83, 49, 221, 185, 2, 223, 65, 217, 83, 49, 221, 185, 2, - 223, 64, 89, 16, 213, 111, 89, 16, 218, 105, 224, 3, 89, 16, 212, 183, - 224, 3, 89, 16, 248, 235, 224, 3, 89, 16, 247, 250, 224, 3, 89, 16, 212, - 50, 224, 3, 89, 16, 212, 44, 224, 3, 89, 16, 212, 42, 224, 3, 89, 16, - 212, 48, 224, 3, 89, 16, 212, 46, 224, 3, 89, 16, 240, 82, 224, 3, 89, - 16, 240, 78, 224, 3, 89, 16, 240, 77, 224, 3, 89, 16, 240, 80, 224, 3, - 89, 16, 240, 79, 224, 3, 89, 16, 240, 76, 224, 3, 89, 16, 200, 253, 89, - 16, 218, 105, 209, 219, 89, 16, 212, 183, 209, 219, 89, 16, 248, 235, - 209, 219, 89, 16, 247, 250, 209, 219, 89, 16, 212, 50, 209, 219, 89, 16, - 212, 44, 209, 219, 89, 16, 212, 42, 209, 219, 89, 16, 212, 48, 209, 219, - 89, 16, 212, 46, 209, 219, 89, 16, 240, 82, 209, 219, 89, 16, 240, 78, - 209, 219, 89, 16, 240, 77, 209, 219, 89, 16, 240, 80, 209, 219, 89, 16, - 240, 79, 209, 219, 89, 16, 240, 76, 209, 219, 248, 14, 1, 155, 248, 14, - 1, 234, 123, 248, 14, 1, 217, 71, 248, 14, 1, 217, 14, 248, 14, 1, 161, - 248, 14, 1, 249, 145, 248, 14, 1, 166, 248, 14, 1, 218, 151, 248, 14, 1, - 189, 248, 14, 1, 240, 136, 248, 14, 1, 176, 248, 14, 1, 215, 252, 248, - 14, 1, 247, 174, 248, 14, 1, 225, 214, 248, 14, 1, 215, 109, 248, 14, 1, - 215, 100, 248, 14, 1, 164, 248, 14, 1, 169, 248, 14, 1, 172, 248, 14, 1, - 199, 152, 248, 14, 1, 183, 248, 14, 1, 63, 248, 14, 1, 142, 248, 14, 18, - 2, 68, 248, 14, 18, 2, 66, 248, 14, 18, 2, 69, 248, 14, 18, 2, 72, 248, - 14, 18, 2, 251, 245, 248, 14, 213, 208, 248, 14, 236, 222, 77, 208, 132, - 49, 120, 1, 130, 155, 49, 120, 1, 130, 224, 146, 49, 120, 1, 130, 223, - 122, 49, 120, 1, 126, 155, 49, 120, 1, 126, 223, 122, 49, 120, 1, 126, - 224, 146, 49, 120, 1, 217, 71, 49, 120, 1, 130, 247, 174, 49, 120, 1, - 130, 247, 16, 49, 120, 1, 126, 247, 174, 49, 120, 1, 126, 183, 49, 120, - 1, 126, 247, 16, 49, 120, 1, 215, 109, 49, 120, 1, 210, 197, 49, 120, 1, - 130, 210, 195, 49, 120, 1, 240, 136, 49, 120, 1, 126, 210, 195, 49, 120, - 1, 210, 206, 49, 120, 1, 130, 189, 49, 120, 1, 130, 202, 233, 49, 120, 1, - 126, 189, 49, 120, 1, 126, 202, 233, 49, 120, 1, 176, 49, 120, 1, 249, - 145, 49, 120, 1, 130, 161, 49, 120, 1, 130, 213, 6, 49, 120, 1, 130, 235, - 239, 49, 120, 1, 126, 161, 49, 120, 1, 126, 235, 239, 49, 120, 1, 126, - 213, 6, 49, 120, 1, 166, 49, 120, 1, 126, 164, 49, 120, 1, 130, 164, 49, - 120, 1, 169, 49, 120, 1, 209, 129, 49, 120, 1, 172, 49, 120, 1, 221, 184, - 49, 120, 1, 197, 166, 49, 120, 1, 130, 207, 50, 49, 120, 1, 130, 205, 80, - 49, 120, 1, 130, 183, 49, 120, 1, 130, 142, 49, 120, 1, 222, 37, 49, 120, - 1, 63, 49, 120, 1, 126, 142, 49, 120, 1, 68, 49, 120, 1, 226, 120, 49, - 120, 1, 66, 49, 120, 1, 199, 245, 49, 120, 1, 237, 54, 49, 120, 1, 214, - 102, 49, 120, 1, 223, 65, 49, 120, 1, 233, 96, 183, 49, 120, 108, 2, 219, - 194, 169, 49, 120, 108, 2, 219, 194, 172, 49, 120, 108, 2, 223, 83, 203, - 111, 223, 54, 49, 120, 2, 220, 82, 225, 14, 223, 54, 49, 120, 108, 2, 48, - 217, 71, 49, 120, 108, 2, 126, 161, 49, 120, 108, 2, 130, 210, 196, 214, - 73, 126, 161, 49, 120, 108, 2, 166, 49, 120, 108, 2, 249, 145, 49, 120, - 108, 2, 183, 49, 120, 2, 208, 244, 49, 120, 18, 2, 63, 49, 120, 18, 2, - 220, 82, 208, 199, 49, 120, 18, 2, 252, 168, 49, 120, 18, 2, 203, 120, - 252, 168, 49, 120, 18, 2, 68, 49, 120, 18, 2, 226, 120, 49, 120, 18, 2, - 200, 99, 49, 120, 18, 2, 199, 244, 49, 120, 18, 2, 66, 49, 120, 18, 2, - 199, 245, 49, 120, 18, 2, 72, 49, 120, 18, 2, 214, 191, 60, 49, 120, 18, - 2, 214, 8, 49, 120, 18, 2, 69, 49, 120, 18, 2, 251, 245, 49, 120, 18, 2, - 214, 102, 49, 120, 18, 2, 251, 200, 49, 120, 18, 2, 120, 251, 200, 49, - 120, 18, 2, 214, 191, 57, 49, 120, 2, 220, 82, 225, 13, 49, 120, 2, 202, - 10, 49, 120, 2, 202, 9, 49, 120, 2, 224, 106, 202, 8, 49, 120, 2, 224, - 106, 202, 7, 49, 120, 2, 224, 106, 202, 6, 49, 120, 2, 210, 252, 232, - 245, 49, 120, 2, 220, 82, 208, 229, 49, 120, 2, 224, 105, 224, 250, 49, - 120, 38, 241, 44, 238, 253, 49, 120, 231, 157, 17, 195, 79, 49, 120, 231, - 157, 17, 100, 49, 120, 231, 157, 17, 102, 49, 120, 231, 157, 17, 134, 49, - 120, 231, 157, 17, 136, 49, 120, 231, 157, 17, 146, 49, 120, 231, 157, - 17, 167, 49, 120, 231, 157, 17, 178, 49, 120, 231, 157, 17, 171, 49, 120, - 231, 157, 17, 182, 49, 120, 120, 17, 195, 79, 49, 120, 120, 17, 100, 49, - 120, 120, 17, 102, 49, 120, 120, 17, 134, 49, 120, 120, 17, 136, 49, 120, - 120, 17, 146, 49, 120, 120, 17, 167, 49, 120, 120, 17, 178, 49, 120, 120, - 17, 171, 49, 120, 120, 17, 182, 49, 120, 2, 197, 64, 49, 120, 2, 197, 63, - 49, 120, 2, 208, 184, 49, 120, 2, 224, 177, 49, 120, 2, 231, 85, 49, 120, - 2, 239, 12, 49, 120, 2, 210, 89, 209, 194, 210, 206, 49, 120, 2, 220, 82, - 196, 98, 49, 120, 2, 225, 48, 49, 120, 2, 225, 47, 49, 120, 2, 208, 194, - 49, 120, 2, 208, 193, 49, 120, 2, 232, 182, 49, 120, 2, 247, 171, 38, - 237, 240, 244, 241, 252, 22, 38, 239, 149, 38, 226, 63, 38, 237, 231, 51, - 38, 201, 165, 238, 253, 38, 196, 221, 60, 38, 197, 56, 222, 76, 60, 38, - 192, 117, 60, 38, 52, 192, 117, 60, 38, 175, 247, 38, 204, 196, 60, 38, - 204, 182, 247, 38, 204, 196, 60, 38, 213, 142, 57, 38, 52, 213, 142, 57, - 38, 213, 142, 60, 38, 213, 142, 214, 20, 141, 2, 200, 82, 210, 59, 141, - 2, 200, 82, 247, 135, 141, 2, 247, 53, 141, 2, 204, 86, 141, 2, 248, 151, - 141, 1, 251, 179, 141, 1, 251, 180, 203, 50, 141, 1, 226, 116, 141, 1, - 226, 117, 203, 50, 141, 1, 200, 85, 141, 1, 200, 86, 203, 50, 141, 1, - 210, 252, 210, 122, 141, 1, 210, 252, 210, 123, 203, 50, 141, 1, 223, 83, - 222, 159, 141, 1, 223, 83, 222, 160, 203, 50, 141, 1, 237, 12, 141, 1, - 251, 197, 141, 1, 214, 137, 141, 1, 214, 138, 203, 50, 141, 1, 155, 141, - 1, 225, 70, 220, 85, 141, 1, 234, 123, 141, 1, 234, 124, 233, 129, 141, - 1, 217, 71, 141, 1, 247, 174, 141, 1, 247, 175, 223, 69, 141, 1, 225, - 214, 141, 1, 225, 215, 225, 184, 141, 1, 215, 109, 141, 1, 203, 169, 222, - 217, 141, 1, 203, 169, 218, 100, 220, 85, 141, 1, 240, 137, 218, 100, - 251, 136, 141, 1, 240, 137, 218, 100, 220, 85, 141, 1, 218, 1, 210, 209, - 141, 1, 189, 141, 1, 203, 169, 203, 81, 141, 1, 240, 136, 141, 1, 240, - 137, 220, 106, 141, 1, 176, 141, 1, 161, 141, 1, 213, 244, 225, 6, 141, - 1, 249, 145, 141, 1, 249, 146, 224, 189, 141, 1, 166, 141, 1, 164, 141, - 1, 169, 141, 1, 172, 141, 1, 197, 166, 141, 1, 209, 23, 209, 0, 141, 1, - 209, 23, 208, 206, 141, 1, 183, 141, 1, 142, 141, 2, 210, 112, 141, 18, - 2, 203, 50, 141, 18, 2, 200, 81, 141, 18, 2, 200, 82, 208, 202, 141, 18, - 2, 204, 121, 141, 18, 2, 204, 122, 226, 108, 141, 18, 2, 210, 252, 210, - 122, 141, 18, 2, 210, 252, 210, 123, 203, 50, 141, 18, 2, 223, 83, 222, - 159, 141, 18, 2, 223, 83, 222, 160, 203, 50, 141, 18, 2, 203, 121, 141, - 18, 2, 203, 122, 210, 122, 141, 18, 2, 203, 122, 203, 50, 141, 18, 2, - 203, 122, 210, 123, 203, 50, 141, 18, 2, 213, 48, 141, 18, 2, 213, 49, - 203, 50, 141, 252, 1, 252, 0, 141, 1, 225, 36, 208, 201, 141, 1, 224, - 112, 208, 201, 141, 1, 200, 181, 208, 201, 141, 1, 237, 48, 208, 201, - 141, 1, 199, 119, 208, 201, 141, 1, 195, 105, 208, 201, 141, 1, 250, 171, - 208, 201, 141, 17, 195, 79, 141, 17, 100, 141, 17, 102, 141, 17, 134, - 141, 17, 136, 141, 17, 146, 141, 17, 167, 141, 17, 178, 141, 17, 171, - 141, 17, 182, 141, 213, 171, 141, 213, 200, 141, 197, 48, 141, 247, 108, - 213, 193, 141, 247, 108, 206, 81, 141, 247, 108, 213, 139, 141, 213, 199, - 141, 34, 16, 239, 4, 141, 34, 16, 239, 209, 141, 34, 16, 237, 184, 141, - 34, 16, 240, 86, 141, 34, 16, 240, 87, 204, 86, 141, 34, 16, 239, 94, - 141, 34, 16, 240, 128, 141, 34, 16, 239, 185, 141, 34, 16, 240, 110, 141, - 34, 16, 240, 87, 234, 42, 141, 34, 16, 38, 203, 43, 141, 34, 16, 38, 236, - 219, 141, 34, 16, 38, 224, 184, 141, 34, 16, 38, 224, 186, 141, 34, 16, - 38, 225, 188, 141, 34, 16, 38, 224, 185, 3, 225, 188, 141, 34, 16, 38, - 224, 187, 3, 225, 188, 141, 34, 16, 38, 248, 220, 141, 34, 16, 38, 233, - 133, 141, 34, 16, 210, 20, 192, 237, 195, 141, 34, 16, 210, 20, 192, 240, - 126, 141, 34, 16, 210, 20, 244, 203, 201, 26, 141, 34, 16, 210, 20, 244, - 203, 203, 131, 141, 34, 16, 222, 182, 192, 213, 185, 141, 34, 16, 222, - 182, 192, 211, 211, 141, 34, 16, 222, 182, 244, 203, 212, 145, 141, 34, - 16, 222, 182, 244, 203, 212, 129, 141, 34, 16, 222, 182, 192, 212, 171, - 204, 110, 2, 213, 168, 204, 110, 2, 213, 181, 204, 110, 2, 213, 177, 204, - 110, 1, 63, 204, 110, 1, 68, 204, 110, 1, 66, 204, 110, 1, 251, 245, 204, - 110, 1, 72, 204, 110, 1, 69, 204, 110, 1, 236, 116, 204, 110, 1, 155, - 204, 110, 1, 211, 159, 204, 110, 1, 234, 123, 204, 110, 1, 217, 71, 204, - 110, 1, 247, 174, 204, 110, 1, 225, 214, 204, 110, 1, 195, 115, 204, 110, - 1, 215, 109, 204, 110, 1, 189, 204, 110, 1, 240, 136, 204, 110, 1, 176, - 204, 110, 1, 161, 204, 110, 1, 235, 239, 204, 110, 1, 199, 152, 204, 110, - 1, 249, 145, 204, 110, 1, 166, 204, 110, 1, 164, 204, 110, 1, 169, 204, - 110, 1, 172, 204, 110, 1, 197, 166, 204, 110, 1, 183, 204, 110, 1, 196, - 208, 204, 110, 1, 142, 204, 110, 108, 2, 213, 197, 204, 110, 108, 2, 213, - 170, 204, 110, 108, 2, 213, 167, 204, 110, 18, 2, 213, 184, 204, 110, 18, - 2, 213, 166, 204, 110, 18, 2, 213, 190, 204, 110, 18, 2, 213, 176, 204, - 110, 18, 2, 213, 198, 204, 110, 18, 2, 213, 186, 204, 110, 2, 213, 201, - 204, 110, 2, 199, 7, 204, 110, 108, 2, 213, 127, 166, 204, 110, 108, 2, - 213, 127, 197, 166, 204, 110, 1, 224, 146, 204, 110, 1, 204, 43, 204, - 110, 17, 195, 79, 204, 110, 17, 100, 204, 110, 17, 102, 204, 110, 17, - 134, 204, 110, 17, 136, 204, 110, 17, 146, 204, 110, 17, 167, 204, 110, - 17, 178, 204, 110, 17, 171, 204, 110, 17, 182, 204, 110, 250, 132, 204, - 110, 1, 210, 92, 204, 110, 1, 222, 132, 204, 110, 1, 248, 197, 204, 110, - 1, 48, 225, 80, 204, 110, 1, 48, 221, 136, 249, 55, 1, 63, 249, 55, 1, - 206, 73, 63, 249, 55, 1, 142, 249, 55, 1, 206, 73, 142, 249, 55, 1, 220, - 57, 142, 249, 55, 1, 249, 145, 249, 55, 1, 224, 247, 249, 145, 249, 55, - 1, 161, 249, 55, 1, 206, 73, 161, 249, 55, 1, 176, 249, 55, 1, 220, 57, - 176, 249, 55, 1, 197, 166, 249, 55, 1, 206, 73, 197, 166, 249, 55, 1, - 213, 216, 197, 166, 249, 55, 1, 234, 123, 249, 55, 1, 206, 73, 234, 123, - 249, 55, 1, 225, 214, 249, 55, 1, 240, 136, 249, 55, 1, 169, 249, 55, 1, - 206, 73, 169, 249, 55, 1, 166, 249, 55, 1, 206, 73, 166, 249, 55, 1, 205, - 157, 189, 249, 55, 1, 216, 23, 189, 249, 55, 1, 183, 249, 55, 1, 206, 73, - 183, 249, 55, 1, 220, 57, 183, 249, 55, 1, 164, 249, 55, 1, 206, 73, 164, - 249, 55, 1, 217, 71, 249, 55, 1, 172, 249, 55, 1, 206, 73, 172, 249, 55, - 1, 215, 109, 249, 55, 1, 247, 174, 249, 55, 1, 217, 159, 249, 55, 1, 219, - 241, 249, 55, 1, 68, 249, 55, 1, 66, 249, 55, 2, 202, 14, 249, 55, 18, 2, - 69, 249, 55, 18, 2, 213, 216, 69, 249, 55, 18, 2, 237, 54, 249, 55, 18, - 2, 68, 249, 55, 18, 2, 224, 247, 68, 249, 55, 18, 2, 72, 249, 55, 18, 2, - 224, 247, 72, 249, 55, 18, 2, 66, 249, 55, 18, 2, 118, 36, 206, 73, 183, - 249, 55, 108, 2, 217, 73, 249, 55, 108, 2, 233, 15, 249, 55, 213, 179, - 249, 55, 213, 175, 249, 55, 16, 248, 161, 218, 1, 219, 141, 249, 55, 16, - 248, 161, 212, 175, 249, 55, 16, 248, 161, 225, 107, 249, 55, 16, 248, - 161, 213, 179, 222, 143, 1, 155, 222, 143, 1, 224, 29, 222, 143, 1, 224, - 146, 222, 143, 1, 234, 123, 222, 143, 1, 233, 160, 222, 143, 1, 217, 71, - 222, 143, 1, 247, 174, 222, 143, 1, 247, 16, 222, 143, 1, 225, 214, 222, - 143, 1, 215, 109, 222, 143, 1, 189, 222, 143, 1, 202, 233, 222, 143, 1, - 240, 136, 222, 143, 1, 176, 222, 143, 1, 161, 222, 143, 1, 212, 150, 222, - 143, 1, 213, 6, 222, 143, 1, 235, 239, 222, 143, 1, 235, 95, 222, 143, 1, - 249, 145, 222, 143, 1, 248, 137, 222, 143, 1, 166, 222, 143, 1, 219, 2, - 222, 143, 1, 201, 113, 222, 143, 1, 201, 103, 222, 143, 1, 237, 156, 222, - 143, 1, 164, 222, 143, 1, 169, 222, 143, 1, 172, 222, 143, 1, 142, 222, - 143, 1, 232, 25, 222, 143, 1, 199, 152, 222, 143, 1, 183, 222, 143, 1, - 207, 50, 222, 143, 1, 197, 166, 222, 143, 1, 63, 222, 143, 204, 152, 1, - 164, 222, 143, 204, 152, 1, 169, 222, 143, 18, 2, 252, 168, 222, 143, 18, - 2, 68, 222, 143, 18, 2, 72, 222, 143, 18, 2, 214, 102, 222, 143, 18, 2, - 66, 222, 143, 18, 2, 199, 245, 222, 143, 18, 2, 69, 222, 143, 108, 2, - 225, 80, 222, 143, 108, 2, 221, 136, 222, 143, 108, 2, 159, 222, 143, - 108, 2, 218, 55, 222, 143, 108, 2, 214, 3, 222, 143, 108, 2, 144, 222, - 143, 108, 2, 203, 216, 222, 143, 108, 2, 215, 81, 222, 143, 108, 2, 225, - 13, 222, 143, 2, 210, 207, 222, 143, 2, 215, 149, 222, 143, 211, 214, - 203, 164, 222, 143, 211, 214, 215, 93, 202, 125, 203, 164, 222, 143, 211, - 214, 247, 25, 222, 143, 211, 214, 201, 95, 247, 25, 222, 143, 211, 214, - 201, 94, 222, 143, 17, 195, 79, 222, 143, 17, 100, 222, 143, 17, 102, - 222, 143, 17, 134, 222, 143, 17, 136, 222, 143, 17, 146, 222, 143, 17, - 167, 222, 143, 17, 178, 222, 143, 17, 171, 222, 143, 17, 182, 222, 143, - 1, 201, 78, 222, 143, 1, 201, 66, 222, 143, 1, 240, 41, 214, 135, 245, - 68, 17, 195, 79, 214, 135, 245, 68, 17, 100, 214, 135, 245, 68, 17, 102, - 214, 135, 245, 68, 17, 134, 214, 135, 245, 68, 17, 136, 214, 135, 245, - 68, 17, 146, 214, 135, 245, 68, 17, 167, 214, 135, 245, 68, 17, 178, 214, - 135, 245, 68, 17, 171, 214, 135, 245, 68, 17, 182, 214, 135, 245, 68, 1, - 172, 214, 135, 245, 68, 1, 250, 168, 214, 135, 245, 68, 1, 251, 217, 214, - 135, 245, 68, 1, 251, 97, 214, 135, 245, 68, 1, 251, 173, 214, 135, 245, - 68, 1, 223, 82, 214, 135, 245, 68, 1, 252, 130, 214, 135, 245, 68, 1, - 252, 131, 214, 135, 245, 68, 1, 252, 129, 214, 135, 245, 68, 1, 252, 123, - 214, 135, 245, 68, 1, 222, 109, 214, 135, 245, 68, 1, 225, 248, 214, 135, - 245, 68, 1, 226, 121, 214, 135, 245, 68, 1, 226, 14, 214, 135, 245, 68, - 1, 226, 1, 214, 135, 245, 68, 1, 221, 191, 214, 135, 245, 68, 1, 200, - 106, 214, 135, 245, 68, 1, 200, 104, 214, 135, 245, 68, 1, 200, 42, 214, - 135, 245, 68, 1, 199, 237, 214, 135, 245, 68, 1, 222, 197, 214, 135, 245, - 68, 1, 236, 183, 214, 135, 245, 68, 1, 237, 57, 214, 135, 245, 68, 1, - 236, 230, 214, 135, 245, 68, 1, 236, 155, 214, 135, 245, 68, 1, 222, 7, - 214, 135, 245, 68, 1, 214, 44, 214, 135, 245, 68, 1, 214, 186, 214, 135, - 245, 68, 1, 214, 29, 214, 135, 245, 68, 1, 214, 149, 214, 135, 245, 68, - 218, 146, 201, 43, 214, 135, 245, 68, 234, 118, 201, 44, 214, 135, 245, - 68, 218, 140, 201, 44, 214, 135, 245, 68, 210, 137, 214, 135, 245, 68, - 213, 4, 214, 135, 245, 68, 251, 208, 214, 135, 245, 68, 211, 214, 218, - 136, 214, 135, 245, 68, 211, 214, 52, 218, 136, 40, 4, 1, 209, 185, 199, - 118, 40, 4, 1, 221, 233, 239, 252, 40, 4, 1, 217, 210, 72, 40, 4, 1, 197, - 62, 236, 151, 40, 4, 1, 203, 120, 203, 68, 40, 4, 1, 202, 150, 203, 68, - 40, 4, 1, 203, 120, 232, 173, 55, 40, 4, 1, 203, 120, 196, 84, 40, 4, 1, - 200, 67, 200, 87, 94, 218, 147, 6, 1, 251, 106, 94, 218, 147, 6, 1, 249, - 93, 94, 218, 147, 6, 1, 234, 93, 94, 218, 147, 6, 1, 239, 6, 94, 218, - 147, 6, 1, 236, 230, 94, 218, 147, 6, 1, 199, 16, 94, 218, 147, 6, 1, - 195, 82, 94, 218, 147, 6, 1, 203, 114, 94, 218, 147, 6, 1, 226, 86, 94, - 218, 147, 6, 1, 225, 17, 94, 218, 147, 6, 1, 222, 222, 94, 218, 147, 6, - 1, 220, 62, 94, 218, 147, 6, 1, 217, 211, 94, 218, 147, 6, 1, 214, 119, - 94, 218, 147, 6, 1, 213, 157, 94, 218, 147, 6, 1, 195, 70, 94, 218, 147, - 6, 1, 210, 229, 94, 218, 147, 6, 1, 208, 219, 94, 218, 147, 6, 1, 203, - 101, 94, 218, 147, 6, 1, 200, 72, 94, 218, 147, 6, 1, 212, 254, 94, 218, - 147, 6, 1, 224, 134, 94, 218, 147, 6, 1, 233, 221, 94, 218, 147, 6, 1, - 211, 144, 94, 218, 147, 6, 1, 206, 211, 94, 218, 147, 6, 1, 245, 62, 94, - 218, 147, 6, 1, 247, 142, 94, 218, 147, 6, 1, 225, 162, 94, 218, 147, 6, - 1, 245, 0, 94, 218, 147, 6, 1, 247, 0, 94, 218, 147, 6, 1, 196, 206, 94, - 218, 147, 6, 1, 225, 177, 94, 218, 147, 6, 1, 232, 242, 94, 218, 147, 6, - 1, 232, 147, 94, 218, 147, 6, 1, 232, 58, 94, 218, 147, 6, 1, 197, 109, - 94, 218, 147, 6, 1, 232, 175, 94, 218, 147, 6, 1, 231, 181, 94, 218, 147, - 6, 1, 235, 153, 94, 218, 147, 6, 1, 196, 5, 94, 218, 147, 6, 1, 236, 249, - 94, 218, 147, 6, 1, 163, 234, 93, 94, 218, 147, 6, 1, 251, 194, 94, 218, - 147, 6, 1, 251, 234, 94, 218, 147, 6, 1, 232, 173, 55, 94, 218, 147, 6, - 1, 223, 73, 55, 204, 110, 211, 214, 248, 161, 204, 79, 204, 110, 211, - 214, 248, 161, 213, 180, 204, 110, 211, 214, 248, 161, 211, 201, 204, - 110, 211, 214, 248, 161, 247, 159, 204, 110, 211, 214, 248, 161, 222, - 133, 208, 198, 204, 110, 211, 214, 248, 161, 225, 70, 208, 198, 204, 110, - 211, 214, 248, 161, 240, 137, 208, 198, 204, 110, 211, 214, 248, 161, - 249, 146, 208, 198, 199, 115, 152, 224, 243, 199, 115, 152, 207, 16, 199, - 115, 152, 212, 29, 199, 115, 2, 216, 191, 199, 115, 2, 196, 106, 219, 61, - 204, 70, 199, 115, 152, 196, 106, 251, 213, 226, 73, 204, 70, 199, 115, - 152, 196, 106, 226, 73, 204, 70, 199, 115, 152, 196, 106, 224, 231, 226, - 73, 204, 70, 199, 115, 152, 247, 136, 60, 199, 115, 152, 196, 106, 224, - 231, 226, 73, 204, 71, 208, 165, 199, 115, 152, 52, 204, 70, 199, 115, - 152, 201, 165, 204, 70, 199, 115, 152, 224, 231, 251, 53, 199, 115, 152, - 76, 60, 199, 115, 152, 99, 238, 251, 60, 199, 115, 152, 115, 238, 251, - 60, 199, 115, 152, 210, 10, 224, 242, 226, 73, 204, 70, 199, 115, 152, - 250, 165, 226, 73, 204, 70, 199, 115, 2, 199, 3, 204, 70, 199, 115, 2, - 199, 3, 200, 101, 199, 115, 2, 210, 89, 199, 3, 200, 101, 199, 115, 2, - 199, 3, 251, 53, 199, 115, 2, 210, 89, 199, 3, 251, 53, 199, 115, 2, 199, - 3, 200, 102, 3, 203, 135, 199, 115, 2, 199, 3, 251, 54, 3, 203, 135, 199, - 115, 2, 251, 52, 251, 68, 199, 115, 2, 251, 52, 249, 112, 199, 115, 2, - 251, 52, 199, 142, 199, 115, 2, 251, 52, 199, 143, 3, 203, 135, 199, 115, - 2, 202, 58, 199, 115, 2, 232, 83, 181, 251, 51, 199, 115, 2, 181, 251, - 51, 199, 115, 2, 209, 142, 181, 251, 51, 199, 115, 2, 251, 52, 200, 108, - 218, 127, 199, 115, 2, 250, 247, 199, 115, 2, 209, 194, 250, 247, 199, - 115, 152, 247, 136, 57, 199, 115, 2, 225, 165, 199, 115, 2, 200, 34, 199, - 115, 2, 250, 163, 199, 115, 152, 210, 3, 57, 199, 115, 152, 52, 210, 3, - 57, 199, 115, 2, 52, 251, 52, 251, 68, 8, 1, 4, 6, 63, 8, 1, 4, 6, 251, - 245, 8, 4, 1, 163, 251, 245, 8, 1, 4, 6, 249, 74, 250, 112, 8, 1, 4, 6, - 247, 207, 8, 1, 4, 6, 240, 231, 8, 1, 4, 6, 236, 121, 8, 1, 4, 6, 69, 8, - 4, 1, 163, 192, 69, 8, 4, 1, 163, 68, 8, 1, 4, 6, 225, 217, 8, 1, 4, 6, - 225, 80, 8, 1, 4, 6, 223, 100, 3, 106, 8, 1, 4, 6, 221, 136, 8, 1, 4, 6, - 210, 89, 218, 55, 8, 1, 4, 6, 72, 8, 1, 4, 6, 192, 72, 8, 4, 1, 206, 96, - 72, 8, 4, 1, 206, 96, 192, 72, 8, 4, 1, 206, 96, 177, 3, 106, 8, 4, 1, - 163, 214, 164, 8, 1, 4, 6, 214, 39, 8, 4, 1, 201, 243, 157, 72, 8, 4, 1, - 248, 85, 157, 72, 8, 1, 4, 6, 214, 3, 8, 1, 4, 6, 210, 89, 144, 8, 1, 4, - 6, 163, 144, 8, 1, 4, 6, 203, 216, 8, 1, 4, 6, 66, 8, 4, 1, 206, 96, 66, - 8, 4, 1, 206, 96, 239, 148, 66, 8, 4, 1, 206, 96, 163, 221, 136, 8, 1, 4, - 6, 199, 230, 8, 1, 4, 6, 197, 199, 8, 1, 4, 6, 195, 158, 8, 1, 4, 6, 236, - 52, 8, 1, 198, 244, 222, 223, 205, 119, 8, 1, 251, 194, 32, 1, 4, 6, 234, - 94, 32, 1, 4, 6, 222, 245, 32, 1, 4, 6, 212, 220, 32, 1, 4, 6, 210, 74, - 32, 1, 4, 6, 211, 238, 40, 1, 4, 6, 237, 7, 73, 1, 6, 63, 73, 1, 6, 251, - 245, 73, 1, 6, 250, 112, 73, 1, 6, 249, 74, 250, 112, 73, 1, 6, 240, 231, - 73, 1, 6, 69, 73, 1, 6, 210, 89, 69, 73, 1, 6, 234, 190, 73, 1, 6, 233, - 15, 73, 1, 6, 68, 73, 1, 6, 225, 217, 73, 1, 6, 225, 80, 73, 1, 6, 159, - 73, 1, 6, 221, 136, 73, 1, 6, 218, 55, 73, 1, 6, 210, 89, 218, 55, 73, 1, - 6, 72, 73, 1, 6, 214, 39, 73, 1, 6, 214, 3, 73, 1, 6, 144, 73, 1, 6, 203, - 216, 73, 1, 6, 66, 73, 1, 6, 197, 199, 73, 1, 4, 63, 73, 1, 4, 163, 63, - 73, 1, 4, 251, 134, 73, 1, 4, 163, 251, 245, 73, 1, 4, 250, 112, 73, 1, - 4, 240, 231, 73, 1, 4, 69, 73, 1, 4, 208, 163, 73, 1, 4, 192, 69, 73, 1, - 4, 163, 192, 69, 73, 1, 4, 234, 190, 73, 1, 4, 163, 68, 73, 1, 4, 225, - 80, 73, 1, 4, 221, 136, 73, 1, 4, 236, 215, 73, 1, 4, 72, 73, 1, 4, 192, - 72, 73, 1, 4, 201, 243, 157, 72, 73, 1, 4, 248, 85, 157, 72, 73, 1, 4, - 214, 3, 73, 1, 4, 203, 216, 73, 1, 4, 66, 73, 1, 4, 206, 96, 66, 73, 1, - 4, 163, 221, 136, 73, 1, 4, 199, 230, 73, 1, 4, 251, 194, 73, 1, 4, 248, - 206, 73, 1, 4, 32, 234, 94, 73, 1, 4, 239, 212, 73, 1, 4, 32, 212, 246, - 73, 1, 4, 245, 75, 8, 204, 143, 4, 1, 68, 8, 204, 143, 4, 1, 144, 8, 204, - 143, 4, 1, 66, 8, 204, 143, 4, 1, 199, 230, 32, 204, 143, 4, 1, 248, 206, - 32, 204, 143, 4, 1, 234, 94, 32, 204, 143, 4, 1, 210, 74, 32, 204, 143, - 4, 1, 212, 246, 32, 204, 143, 4, 1, 245, 75, 8, 4, 1, 200, 99, 8, 4, 1, - 74, 3, 112, 202, 84, 8, 4, 1, 240, 232, 3, 112, 202, 84, 8, 4, 1, 236, - 50, 3, 112, 202, 84, 8, 4, 1, 221, 137, 3, 112, 202, 84, 8, 4, 1, 218, - 56, 3, 112, 202, 84, 8, 4, 1, 214, 4, 3, 112, 202, 84, 8, 4, 1, 211, 32, - 3, 112, 202, 84, 8, 4, 1, 211, 32, 3, 235, 109, 26, 112, 202, 84, 8, 4, - 1, 209, 81, 3, 112, 202, 84, 8, 4, 1, 203, 217, 3, 112, 202, 84, 8, 4, 1, - 195, 159, 3, 112, 202, 84, 8, 4, 1, 163, 234, 190, 73, 1, 40, 236, 230, - 8, 4, 1, 226, 39, 234, 190, 8, 4, 1, 202, 236, 3, 204, 200, 8, 4, 6, 1, - 230, 249, 3, 106, 8, 4, 1, 226, 8, 3, 106, 8, 4, 1, 214, 4, 3, 106, 8, 4, - 6, 1, 118, 3, 106, 8, 4, 1, 200, 29, 3, 106, 8, 4, 1, 74, 3, 213, 215, - 122, 8, 4, 1, 240, 232, 3, 213, 215, 122, 8, 4, 1, 236, 50, 3, 213, 215, - 122, 8, 4, 1, 234, 191, 3, 213, 215, 122, 8, 4, 1, 225, 81, 3, 213, 215, - 122, 8, 4, 1, 223, 100, 3, 213, 215, 122, 8, 4, 1, 221, 137, 3, 213, 215, - 122, 8, 4, 1, 218, 56, 3, 213, 215, 122, 8, 4, 1, 214, 4, 3, 213, 215, - 122, 8, 4, 1, 211, 32, 3, 213, 215, 122, 8, 4, 1, 209, 81, 3, 213, 215, - 122, 8, 4, 1, 236, 142, 3, 213, 215, 122, 8, 4, 1, 199, 231, 3, 213, 215, - 122, 8, 4, 1, 196, 223, 3, 213, 215, 122, 8, 4, 1, 195, 159, 3, 213, 215, - 122, 8, 4, 1, 39, 3, 210, 95, 122, 8, 4, 1, 251, 135, 3, 210, 95, 122, 8, - 4, 1, 240, 232, 3, 231, 165, 26, 203, 135, 8, 4, 1, 237, 136, 3, 210, 95, - 122, 8, 4, 1, 192, 237, 136, 3, 210, 95, 122, 8, 4, 1, 210, 89, 192, 237, - 136, 3, 210, 95, 122, 8, 4, 1, 208, 164, 3, 210, 95, 122, 8, 4, 1, 230, - 249, 3, 210, 95, 122, 8, 4, 1, 192, 177, 3, 210, 95, 122, 8, 4, 1, 236, - 142, 3, 210, 95, 122, 8, 4, 1, 118, 3, 210, 95, 122, 8, 4, 1, 236, 53, 3, - 210, 95, 122, 73, 1, 4, 163, 251, 134, 73, 1, 4, 247, 207, 73, 1, 4, 247, - 208, 3, 241, 21, 73, 1, 4, 236, 121, 73, 1, 4, 210, 89, 192, 69, 73, 1, - 4, 236, 49, 73, 1, 4, 238, 252, 225, 218, 3, 106, 73, 1, 4, 145, 234, - 190, 73, 1, 4, 163, 233, 15, 73, 1, 4, 230, 249, 3, 106, 73, 1, 4, 226, - 7, 73, 1, 4, 6, 68, 73, 1, 4, 6, 230, 249, 3, 106, 73, 1, 4, 225, 218, 3, - 241, 57, 73, 1, 4, 223, 100, 3, 210, 95, 122, 73, 1, 4, 223, 100, 3, 213, - 215, 122, 73, 1, 4, 6, 159, 73, 1, 4, 221, 137, 3, 122, 73, 1, 4, 163, - 221, 137, 3, 181, 222, 172, 73, 1, 4, 218, 56, 3, 50, 122, 73, 1, 4, 218, - 56, 3, 210, 95, 122, 73, 1, 4, 6, 218, 55, 73, 1, 4, 249, 74, 72, 73, 1, - 4, 212, 246, 73, 1, 4, 209, 81, 3, 122, 73, 1, 4, 236, 141, 73, 1, 4, - 203, 217, 3, 213, 215, 122, 73, 1, 4, 118, 154, 73, 1, 4, 200, 28, 73, 1, - 4, 6, 66, 73, 1, 4, 199, 231, 3, 122, 73, 1, 4, 163, 199, 230, 73, 1, 4, - 195, 158, 73, 1, 4, 195, 159, 3, 210, 95, 122, 73, 1, 4, 195, 159, 3, - 241, 21, 73, 1, 4, 236, 52, 73, 1, 4, 202, 199, 38, 237, 250, 233, 101, - 252, 22, 38, 237, 250, 252, 10, 252, 22, 38, 205, 213, 60, 38, 204, 77, - 78, 38, 220, 113, 38, 233, 98, 38, 220, 111, 38, 252, 8, 38, 233, 99, 38, - 252, 9, 38, 8, 4, 1, 211, 32, 60, 38, 248, 46, 38, 220, 112, 38, 52, 244, - 241, 57, 38, 214, 152, 57, 38, 195, 24, 60, 38, 225, 249, 60, 38, 200, - 22, 57, 38, 200, 5, 57, 38, 8, 4, 1, 235, 79, 192, 39, 57, 38, 8, 4, 1, - 251, 245, 38, 8, 4, 1, 251, 49, 38, 8, 4, 1, 250, 133, 38, 8, 4, 1, 247, - 208, 247, 50, 38, 8, 4, 1, 226, 39, 240, 231, 38, 8, 4, 1, 236, 121, 38, - 8, 4, 1, 234, 190, 38, 8, 1, 4, 6, 234, 190, 38, 8, 4, 1, 225, 80, 38, 8, - 4, 1, 159, 38, 8, 1, 4, 6, 159, 38, 8, 1, 4, 6, 221, 136, 38, 8, 4, 1, - 218, 55, 38, 8, 1, 4, 6, 218, 55, 38, 8, 1, 4, 6, 144, 38, 8, 4, 1, 211, - 32, 209, 188, 38, 8, 4, 1, 209, 80, 38, 8, 4, 1, 181, 209, 80, 38, 8, 4, - 1, 195, 158, 38, 8, 4, 1, 251, 134, 38, 8, 4, 1, 250, 112, 38, 8, 4, 1, - 248, 206, 38, 8, 4, 1, 208, 163, 38, 8, 4, 1, 236, 49, 38, 8, 4, 1, 223, - 100, 3, 52, 112, 202, 84, 38, 8, 4, 1, 177, 3, 175, 247, 38, 106, 38, 8, - 4, 1, 214, 3, 38, 8, 4, 1, 236, 141, 38, 8, 4, 1, 118, 3, 175, 247, 38, - 106, 38, 8, 4, 1, 197, 199, 38, 8, 4, 1, 39, 3, 239, 150, 38, 8, 4, 1, - 177, 3, 239, 150, 38, 8, 4, 1, 118, 3, 239, 150, 38, 124, 203, 148, 57, - 38, 224, 222, 90, 210, 22, 38, 224, 222, 90, 222, 184, 38, 76, 90, 222, - 184, 38, 197, 62, 226, 17, 248, 40, 60, 38, 239, 221, 78, 38, 52, 226, - 17, 248, 48, 60, 38, 251, 139, 180, 202, 30, 60, 38, 50, 250, 218, 57, - 38, 53, 250, 218, 26, 135, 250, 218, 60, 8, 6, 1, 39, 3, 210, 3, 60, 8, - 4, 1, 39, 3, 210, 3, 60, 8, 6, 1, 74, 3, 76, 57, 8, 4, 1, 74, 3, 76, 57, - 8, 6, 1, 74, 3, 76, 60, 8, 4, 1, 74, 3, 76, 60, 8, 6, 1, 74, 3, 222, 76, - 60, 8, 4, 1, 74, 3, 222, 76, 60, 8, 6, 1, 247, 208, 3, 247, 51, 26, 186, - 8, 4, 1, 247, 208, 3, 247, 51, 26, 186, 8, 6, 1, 240, 232, 3, 76, 57, 8, - 4, 1, 240, 232, 3, 76, 57, 8, 6, 1, 240, 232, 3, 76, 60, 8, 4, 1, 240, - 232, 3, 76, 60, 8, 6, 1, 240, 232, 3, 222, 76, 60, 8, 4, 1, 240, 232, 3, - 222, 76, 60, 8, 6, 1, 240, 232, 3, 247, 50, 8, 4, 1, 240, 232, 3, 247, - 50, 8, 6, 1, 240, 232, 3, 244, 241, 60, 8, 4, 1, 240, 232, 3, 244, 241, - 60, 8, 6, 1, 237, 136, 3, 220, 115, 26, 233, 100, 8, 4, 1, 237, 136, 3, - 220, 115, 26, 233, 100, 8, 6, 1, 237, 136, 3, 220, 115, 26, 186, 8, 4, 1, - 237, 136, 3, 220, 115, 26, 186, 8, 6, 1, 237, 136, 3, 244, 241, 60, 8, 4, - 1, 237, 136, 3, 244, 241, 60, 8, 6, 1, 237, 136, 3, 202, 85, 60, 8, 4, 1, - 237, 136, 3, 202, 85, 60, 8, 6, 1, 237, 136, 3, 247, 51, 26, 248, 47, 8, - 4, 1, 237, 136, 3, 247, 51, 26, 248, 47, 8, 6, 1, 236, 50, 3, 76, 57, 8, - 4, 1, 236, 50, 3, 76, 57, 8, 6, 1, 234, 191, 3, 220, 114, 8, 4, 1, 234, - 191, 3, 220, 114, 8, 6, 1, 233, 16, 3, 76, 57, 8, 4, 1, 233, 16, 3, 76, - 57, 8, 6, 1, 233, 16, 3, 76, 60, 8, 4, 1, 233, 16, 3, 76, 60, 8, 6, 1, - 233, 16, 3, 239, 150, 8, 4, 1, 233, 16, 3, 239, 150, 8, 6, 1, 233, 16, 3, - 247, 50, 8, 4, 1, 233, 16, 3, 247, 50, 8, 6, 1, 233, 16, 3, 248, 48, 60, - 8, 4, 1, 233, 16, 3, 248, 48, 60, 8, 6, 1, 230, 249, 3, 202, 85, 60, 8, - 4, 1, 230, 249, 3, 202, 85, 60, 8, 6, 1, 230, 249, 3, 239, 151, 26, 186, - 8, 4, 1, 230, 249, 3, 239, 151, 26, 186, 8, 6, 1, 225, 81, 3, 186, 8, 4, - 1, 225, 81, 3, 186, 8, 6, 1, 225, 81, 3, 76, 60, 8, 4, 1, 225, 81, 3, 76, - 60, 8, 6, 1, 225, 81, 3, 222, 76, 60, 8, 4, 1, 225, 81, 3, 222, 76, 60, - 8, 6, 1, 223, 100, 3, 76, 60, 8, 4, 1, 223, 100, 3, 76, 60, 8, 6, 1, 223, - 100, 3, 76, 248, 227, 26, 220, 114, 8, 4, 1, 223, 100, 3, 76, 248, 227, - 26, 220, 114, 8, 6, 1, 223, 100, 3, 222, 76, 60, 8, 4, 1, 223, 100, 3, - 222, 76, 60, 8, 6, 1, 223, 100, 3, 244, 241, 60, 8, 4, 1, 223, 100, 3, - 244, 241, 60, 8, 6, 1, 221, 137, 3, 186, 8, 4, 1, 221, 137, 3, 186, 8, 6, - 1, 221, 137, 3, 76, 57, 8, 4, 1, 221, 137, 3, 76, 57, 8, 6, 1, 221, 137, - 3, 76, 60, 8, 4, 1, 221, 137, 3, 76, 60, 8, 6, 1, 218, 56, 3, 76, 57, 8, - 4, 1, 218, 56, 3, 76, 57, 8, 6, 1, 218, 56, 3, 76, 60, 8, 4, 1, 218, 56, - 3, 76, 60, 8, 6, 1, 218, 56, 3, 222, 76, 60, 8, 4, 1, 218, 56, 3, 222, - 76, 60, 8, 6, 1, 218, 56, 3, 244, 241, 60, 8, 4, 1, 218, 56, 3, 244, 241, - 60, 8, 6, 1, 177, 3, 202, 85, 26, 186, 8, 4, 1, 177, 3, 202, 85, 26, 186, - 8, 6, 1, 177, 3, 202, 85, 26, 239, 150, 8, 4, 1, 177, 3, 202, 85, 26, - 239, 150, 8, 6, 1, 177, 3, 220, 115, 26, 233, 100, 8, 4, 1, 177, 3, 220, - 115, 26, 233, 100, 8, 6, 1, 177, 3, 220, 115, 26, 186, 8, 4, 1, 177, 3, - 220, 115, 26, 186, 8, 6, 1, 214, 4, 3, 186, 8, 4, 1, 214, 4, 3, 186, 8, - 6, 1, 214, 4, 3, 76, 57, 8, 4, 1, 214, 4, 3, 76, 57, 8, 6, 1, 211, 32, 3, - 76, 57, 8, 4, 1, 211, 32, 3, 76, 57, 8, 6, 1, 211, 32, 3, 76, 60, 8, 4, - 1, 211, 32, 3, 76, 60, 8, 6, 1, 211, 32, 3, 76, 248, 227, 26, 220, 114, - 8, 4, 1, 211, 32, 3, 76, 248, 227, 26, 220, 114, 8, 6, 1, 211, 32, 3, - 222, 76, 60, 8, 4, 1, 211, 32, 3, 222, 76, 60, 8, 6, 1, 209, 81, 3, 76, - 57, 8, 4, 1, 209, 81, 3, 76, 57, 8, 6, 1, 209, 81, 3, 76, 60, 8, 4, 1, - 209, 81, 3, 76, 60, 8, 6, 1, 209, 81, 3, 252, 10, 26, 76, 57, 8, 4, 1, - 209, 81, 3, 252, 10, 26, 76, 57, 8, 6, 1, 209, 81, 3, 247, 107, 26, 76, - 57, 8, 4, 1, 209, 81, 3, 247, 107, 26, 76, 57, 8, 6, 1, 209, 81, 3, 76, - 248, 227, 26, 76, 57, 8, 4, 1, 209, 81, 3, 76, 248, 227, 26, 76, 57, 8, - 6, 1, 203, 217, 3, 76, 57, 8, 4, 1, 203, 217, 3, 76, 57, 8, 6, 1, 203, - 217, 3, 76, 60, 8, 4, 1, 203, 217, 3, 76, 60, 8, 6, 1, 203, 217, 3, 222, - 76, 60, 8, 4, 1, 203, 217, 3, 222, 76, 60, 8, 6, 1, 203, 217, 3, 244, - 241, 60, 8, 4, 1, 203, 217, 3, 244, 241, 60, 8, 6, 1, 118, 3, 239, 151, - 60, 8, 4, 1, 118, 3, 239, 151, 60, 8, 6, 1, 118, 3, 202, 85, 60, 8, 4, 1, - 118, 3, 202, 85, 60, 8, 6, 1, 118, 3, 244, 241, 60, 8, 4, 1, 118, 3, 244, - 241, 60, 8, 6, 1, 118, 3, 202, 85, 26, 186, 8, 4, 1, 118, 3, 202, 85, 26, - 186, 8, 6, 1, 118, 3, 220, 115, 26, 239, 150, 8, 4, 1, 118, 3, 220, 115, - 26, 239, 150, 8, 6, 1, 199, 231, 3, 202, 84, 8, 4, 1, 199, 231, 3, 202, - 84, 8, 6, 1, 199, 231, 3, 76, 60, 8, 4, 1, 199, 231, 3, 76, 60, 8, 6, 1, - 197, 200, 3, 233, 100, 8, 4, 1, 197, 200, 3, 233, 100, 8, 6, 1, 197, 200, - 3, 186, 8, 4, 1, 197, 200, 3, 186, 8, 6, 1, 197, 200, 3, 239, 150, 8, 4, - 1, 197, 200, 3, 239, 150, 8, 6, 1, 197, 200, 3, 76, 57, 8, 4, 1, 197, - 200, 3, 76, 57, 8, 6, 1, 197, 200, 3, 76, 60, 8, 4, 1, 197, 200, 3, 76, - 60, 8, 6, 1, 196, 223, 3, 76, 57, 8, 4, 1, 196, 223, 3, 76, 57, 8, 6, 1, - 196, 223, 3, 239, 150, 8, 4, 1, 196, 223, 3, 239, 150, 8, 6, 1, 196, 149, - 3, 76, 57, 8, 4, 1, 196, 149, 3, 76, 57, 8, 6, 1, 195, 159, 3, 244, 240, - 8, 4, 1, 195, 159, 3, 244, 240, 8, 6, 1, 195, 159, 3, 76, 60, 8, 4, 1, - 195, 159, 3, 76, 60, 8, 6, 1, 195, 159, 3, 222, 76, 60, 8, 4, 1, 195, - 159, 3, 222, 76, 60, 8, 4, 1, 233, 16, 3, 222, 76, 60, 8, 4, 1, 203, 217, - 3, 239, 150, 8, 4, 1, 197, 200, 3, 210, 3, 57, 8, 4, 1, 196, 149, 3, 210, - 3, 57, 8, 4, 1, 39, 3, 53, 157, 210, 2, 8, 4, 1, 181, 209, 81, 3, 76, 57, - 8, 4, 1, 181, 209, 81, 3, 239, 147, 106, 8, 4, 1, 181, 209, 81, 3, 130, - 106, 8, 6, 1, 207, 13, 209, 80, 8, 4, 1, 239, 212, 8, 6, 1, 39, 3, 76, - 60, 8, 4, 1, 39, 3, 76, 60, 8, 6, 1, 39, 3, 231, 165, 57, 8, 4, 1, 39, 3, - 231, 165, 57, 8, 6, 1, 39, 3, 244, 241, 26, 186, 8, 4, 1, 39, 3, 244, - 241, 26, 186, 8, 6, 1, 39, 3, 244, 241, 26, 233, 100, 8, 4, 1, 39, 3, - 244, 241, 26, 233, 100, 8, 6, 1, 39, 3, 244, 241, 26, 231, 165, 57, 8, 4, - 1, 39, 3, 244, 241, 26, 231, 165, 57, 8, 6, 1, 39, 3, 244, 241, 26, 202, - 84, 8, 4, 1, 39, 3, 244, 241, 26, 202, 84, 8, 6, 1, 39, 3, 244, 241, 26, - 76, 60, 8, 4, 1, 39, 3, 244, 241, 26, 76, 60, 8, 6, 1, 39, 3, 248, 48, - 26, 186, 8, 4, 1, 39, 3, 248, 48, 26, 186, 8, 6, 1, 39, 3, 248, 48, 26, - 233, 100, 8, 4, 1, 39, 3, 248, 48, 26, 233, 100, 8, 6, 1, 39, 3, 248, 48, - 26, 231, 165, 57, 8, 4, 1, 39, 3, 248, 48, 26, 231, 165, 57, 8, 6, 1, 39, - 3, 248, 48, 26, 202, 84, 8, 4, 1, 39, 3, 248, 48, 26, 202, 84, 8, 6, 1, - 39, 3, 248, 48, 26, 76, 60, 8, 4, 1, 39, 3, 248, 48, 26, 76, 60, 8, 6, 1, - 237, 136, 3, 76, 60, 8, 4, 1, 237, 136, 3, 76, 60, 8, 6, 1, 237, 136, 3, - 231, 165, 57, 8, 4, 1, 237, 136, 3, 231, 165, 57, 8, 6, 1, 237, 136, 3, - 202, 84, 8, 4, 1, 237, 136, 3, 202, 84, 8, 6, 1, 237, 136, 3, 244, 241, - 26, 186, 8, 4, 1, 237, 136, 3, 244, 241, 26, 186, 8, 6, 1, 237, 136, 3, - 244, 241, 26, 233, 100, 8, 4, 1, 237, 136, 3, 244, 241, 26, 233, 100, 8, - 6, 1, 237, 136, 3, 244, 241, 26, 231, 165, 57, 8, 4, 1, 237, 136, 3, 244, - 241, 26, 231, 165, 57, 8, 6, 1, 237, 136, 3, 244, 241, 26, 202, 84, 8, 4, - 1, 237, 136, 3, 244, 241, 26, 202, 84, 8, 6, 1, 237, 136, 3, 244, 241, - 26, 76, 60, 8, 4, 1, 237, 136, 3, 244, 241, 26, 76, 60, 8, 6, 1, 230, - 249, 3, 231, 165, 57, 8, 4, 1, 230, 249, 3, 231, 165, 57, 8, 6, 1, 230, - 249, 3, 76, 60, 8, 4, 1, 230, 249, 3, 76, 60, 8, 6, 1, 177, 3, 76, 60, 8, - 4, 1, 177, 3, 76, 60, 8, 6, 1, 177, 3, 231, 165, 57, 8, 4, 1, 177, 3, - 231, 165, 57, 8, 6, 1, 177, 3, 244, 241, 26, 186, 8, 4, 1, 177, 3, 244, - 241, 26, 186, 8, 6, 1, 177, 3, 244, 241, 26, 233, 100, 8, 4, 1, 177, 3, - 244, 241, 26, 233, 100, 8, 6, 1, 177, 3, 244, 241, 26, 231, 165, 57, 8, - 4, 1, 177, 3, 244, 241, 26, 231, 165, 57, 8, 6, 1, 177, 3, 244, 241, 26, - 202, 84, 8, 4, 1, 177, 3, 244, 241, 26, 202, 84, 8, 6, 1, 177, 3, 244, - 241, 26, 76, 60, 8, 4, 1, 177, 3, 244, 241, 26, 76, 60, 8, 6, 1, 177, 3, - 231, 103, 26, 186, 8, 4, 1, 177, 3, 231, 103, 26, 186, 8, 6, 1, 177, 3, - 231, 103, 26, 233, 100, 8, 4, 1, 177, 3, 231, 103, 26, 233, 100, 8, 6, 1, - 177, 3, 231, 103, 26, 231, 165, 57, 8, 4, 1, 177, 3, 231, 103, 26, 231, - 165, 57, 8, 6, 1, 177, 3, 231, 103, 26, 202, 84, 8, 4, 1, 177, 3, 231, - 103, 26, 202, 84, 8, 6, 1, 177, 3, 231, 103, 26, 76, 60, 8, 4, 1, 177, 3, - 231, 103, 26, 76, 60, 8, 6, 1, 118, 3, 76, 60, 8, 4, 1, 118, 3, 76, 60, - 8, 6, 1, 118, 3, 231, 165, 57, 8, 4, 1, 118, 3, 231, 165, 57, 8, 6, 1, - 118, 3, 231, 103, 26, 186, 8, 4, 1, 118, 3, 231, 103, 26, 186, 8, 6, 1, - 118, 3, 231, 103, 26, 233, 100, 8, 4, 1, 118, 3, 231, 103, 26, 233, 100, - 8, 6, 1, 118, 3, 231, 103, 26, 231, 165, 57, 8, 4, 1, 118, 3, 231, 103, - 26, 231, 165, 57, 8, 6, 1, 118, 3, 231, 103, 26, 202, 84, 8, 4, 1, 118, - 3, 231, 103, 26, 202, 84, 8, 6, 1, 118, 3, 231, 103, 26, 76, 60, 8, 4, 1, - 118, 3, 231, 103, 26, 76, 60, 8, 6, 1, 196, 149, 3, 233, 100, 8, 4, 1, - 196, 149, 3, 233, 100, 8, 6, 1, 196, 149, 3, 76, 60, 8, 4, 1, 196, 149, - 3, 76, 60, 8, 6, 1, 196, 149, 3, 231, 165, 57, 8, 4, 1, 196, 149, 3, 231, - 165, 57, 8, 6, 1, 196, 149, 3, 202, 84, 8, 4, 1, 196, 149, 3, 202, 84, 8, - 6, 1, 219, 62, 222, 38, 8, 4, 1, 219, 62, 222, 38, 8, 6, 1, 219, 62, 199, - 230, 8, 4, 1, 219, 62, 199, 230, 8, 6, 1, 196, 149, 3, 221, 225, 8, 4, 1, - 196, 149, 3, 221, 225, 32, 4, 1, 251, 135, 3, 211, 231, 32, 4, 1, 251, - 135, 3, 240, 62, 32, 4, 1, 251, 135, 3, 211, 232, 26, 199, 133, 32, 4, 1, - 251, 135, 3, 240, 63, 26, 199, 133, 32, 4, 1, 251, 135, 3, 211, 232, 26, - 214, 9, 32, 4, 1, 251, 135, 3, 240, 63, 26, 214, 9, 32, 4, 1, 251, 135, - 3, 211, 232, 26, 213, 38, 32, 4, 1, 251, 135, 3, 240, 63, 26, 213, 38, - 32, 6, 1, 251, 135, 3, 211, 231, 32, 6, 1, 251, 135, 3, 240, 62, 32, 6, - 1, 251, 135, 3, 211, 232, 26, 199, 133, 32, 6, 1, 251, 135, 3, 240, 63, - 26, 199, 133, 32, 6, 1, 251, 135, 3, 211, 232, 26, 214, 9, 32, 6, 1, 251, - 135, 3, 240, 63, 26, 214, 9, 32, 6, 1, 251, 135, 3, 211, 232, 26, 213, - 38, 32, 6, 1, 251, 135, 3, 240, 63, 26, 213, 38, 32, 4, 1, 236, 175, 3, - 211, 231, 32, 4, 1, 236, 175, 3, 240, 62, 32, 4, 1, 236, 175, 3, 211, - 232, 26, 199, 133, 32, 4, 1, 236, 175, 3, 240, 63, 26, 199, 133, 32, 4, - 1, 236, 175, 3, 211, 232, 26, 214, 9, 32, 4, 1, 236, 175, 3, 240, 63, 26, - 214, 9, 32, 6, 1, 236, 175, 3, 211, 231, 32, 6, 1, 236, 175, 3, 240, 62, - 32, 6, 1, 236, 175, 3, 211, 232, 26, 199, 133, 32, 6, 1, 236, 175, 3, - 240, 63, 26, 199, 133, 32, 6, 1, 236, 175, 3, 211, 232, 26, 214, 9, 32, - 6, 1, 236, 175, 3, 240, 63, 26, 214, 9, 32, 4, 1, 236, 127, 3, 211, 231, - 32, 4, 1, 236, 127, 3, 240, 62, 32, 4, 1, 236, 127, 3, 211, 232, 26, 199, - 133, 32, 4, 1, 236, 127, 3, 240, 63, 26, 199, 133, 32, 4, 1, 236, 127, 3, - 211, 232, 26, 214, 9, 32, 4, 1, 236, 127, 3, 240, 63, 26, 214, 9, 32, 4, - 1, 236, 127, 3, 211, 232, 26, 213, 38, 32, 4, 1, 236, 127, 3, 240, 63, - 26, 213, 38, 32, 6, 1, 236, 127, 3, 211, 231, 32, 6, 1, 236, 127, 3, 240, - 62, 32, 6, 1, 236, 127, 3, 211, 232, 26, 199, 133, 32, 6, 1, 236, 127, 3, - 240, 63, 26, 199, 133, 32, 6, 1, 236, 127, 3, 211, 232, 26, 214, 9, 32, - 6, 1, 236, 127, 3, 240, 63, 26, 214, 9, 32, 6, 1, 236, 127, 3, 211, 232, - 26, 213, 38, 32, 6, 1, 236, 127, 3, 240, 63, 26, 213, 38, 32, 4, 1, 226, - 8, 3, 211, 231, 32, 4, 1, 226, 8, 3, 240, 62, 32, 4, 1, 226, 8, 3, 211, - 232, 26, 199, 133, 32, 4, 1, 226, 8, 3, 240, 63, 26, 199, 133, 32, 4, 1, - 226, 8, 3, 211, 232, 26, 214, 9, 32, 4, 1, 226, 8, 3, 240, 63, 26, 214, - 9, 32, 4, 1, 226, 8, 3, 211, 232, 26, 213, 38, 32, 4, 1, 226, 8, 3, 240, - 63, 26, 213, 38, 32, 6, 1, 226, 8, 3, 211, 231, 32, 6, 1, 226, 8, 3, 240, - 62, 32, 6, 1, 226, 8, 3, 211, 232, 26, 199, 133, 32, 6, 1, 226, 8, 3, - 240, 63, 26, 199, 133, 32, 6, 1, 226, 8, 3, 211, 232, 26, 214, 9, 32, 6, - 1, 226, 8, 3, 240, 63, 26, 214, 9, 32, 6, 1, 226, 8, 3, 211, 232, 26, - 213, 38, 32, 6, 1, 226, 8, 3, 240, 63, 26, 213, 38, 32, 4, 1, 214, 123, - 3, 211, 231, 32, 4, 1, 214, 123, 3, 240, 62, 32, 4, 1, 214, 123, 3, 211, - 232, 26, 199, 133, 32, 4, 1, 214, 123, 3, 240, 63, 26, 199, 133, 32, 4, - 1, 214, 123, 3, 211, 232, 26, 214, 9, 32, 4, 1, 214, 123, 3, 240, 63, 26, - 214, 9, 32, 6, 1, 214, 123, 3, 211, 231, 32, 6, 1, 214, 123, 3, 240, 62, - 32, 6, 1, 214, 123, 3, 211, 232, 26, 199, 133, 32, 6, 1, 214, 123, 3, - 240, 63, 26, 199, 133, 32, 6, 1, 214, 123, 3, 211, 232, 26, 214, 9, 32, - 6, 1, 214, 123, 3, 240, 63, 26, 214, 9, 32, 4, 1, 200, 29, 3, 211, 231, - 32, 4, 1, 200, 29, 3, 240, 62, 32, 4, 1, 200, 29, 3, 211, 232, 26, 199, - 133, 32, 4, 1, 200, 29, 3, 240, 63, 26, 199, 133, 32, 4, 1, 200, 29, 3, - 211, 232, 26, 214, 9, 32, 4, 1, 200, 29, 3, 240, 63, 26, 214, 9, 32, 4, - 1, 200, 29, 3, 211, 232, 26, 213, 38, 32, 4, 1, 200, 29, 3, 240, 63, 26, - 213, 38, 32, 6, 1, 200, 29, 3, 240, 62, 32, 6, 1, 200, 29, 3, 240, 63, - 26, 199, 133, 32, 6, 1, 200, 29, 3, 240, 63, 26, 214, 9, 32, 6, 1, 200, - 29, 3, 240, 63, 26, 213, 38, 32, 4, 1, 214, 125, 3, 211, 231, 32, 4, 1, - 214, 125, 3, 240, 62, 32, 4, 1, 214, 125, 3, 211, 232, 26, 199, 133, 32, - 4, 1, 214, 125, 3, 240, 63, 26, 199, 133, 32, 4, 1, 214, 125, 3, 211, - 232, 26, 214, 9, 32, 4, 1, 214, 125, 3, 240, 63, 26, 214, 9, 32, 4, 1, - 214, 125, 3, 211, 232, 26, 213, 38, 32, 4, 1, 214, 125, 3, 240, 63, 26, - 213, 38, 32, 6, 1, 214, 125, 3, 211, 231, 32, 6, 1, 214, 125, 3, 240, 62, - 32, 6, 1, 214, 125, 3, 211, 232, 26, 199, 133, 32, 6, 1, 214, 125, 3, - 240, 63, 26, 199, 133, 32, 6, 1, 214, 125, 3, 211, 232, 26, 214, 9, 32, - 6, 1, 214, 125, 3, 240, 63, 26, 214, 9, 32, 6, 1, 214, 125, 3, 211, 232, - 26, 213, 38, 32, 6, 1, 214, 125, 3, 240, 63, 26, 213, 38, 32, 4, 1, 251, - 135, 3, 199, 133, 32, 4, 1, 251, 135, 3, 214, 9, 32, 4, 1, 236, 175, 3, - 199, 133, 32, 4, 1, 236, 175, 3, 214, 9, 32, 4, 1, 236, 127, 3, 199, 133, - 32, 4, 1, 236, 127, 3, 214, 9, 32, 4, 1, 226, 8, 3, 199, 133, 32, 4, 1, - 226, 8, 3, 214, 9, 32, 4, 1, 214, 123, 3, 199, 133, 32, 4, 1, 214, 123, - 3, 214, 9, 32, 4, 1, 200, 29, 3, 199, 133, 32, 4, 1, 200, 29, 3, 214, 9, - 32, 4, 1, 214, 125, 3, 199, 133, 32, 4, 1, 214, 125, 3, 214, 9, 32, 4, 1, - 251, 135, 3, 211, 232, 26, 195, 225, 32, 4, 1, 251, 135, 3, 240, 63, 26, - 195, 225, 32, 4, 1, 251, 135, 3, 211, 232, 26, 199, 134, 26, 195, 225, - 32, 4, 1, 251, 135, 3, 240, 63, 26, 199, 134, 26, 195, 225, 32, 4, 1, - 251, 135, 3, 211, 232, 26, 214, 10, 26, 195, 225, 32, 4, 1, 251, 135, 3, - 240, 63, 26, 214, 10, 26, 195, 225, 32, 4, 1, 251, 135, 3, 211, 232, 26, - 213, 39, 26, 195, 225, 32, 4, 1, 251, 135, 3, 240, 63, 26, 213, 39, 26, - 195, 225, 32, 6, 1, 251, 135, 3, 211, 232, 26, 211, 245, 32, 6, 1, 251, - 135, 3, 240, 63, 26, 211, 245, 32, 6, 1, 251, 135, 3, 211, 232, 26, 199, - 134, 26, 211, 245, 32, 6, 1, 251, 135, 3, 240, 63, 26, 199, 134, 26, 211, - 245, 32, 6, 1, 251, 135, 3, 211, 232, 26, 214, 10, 26, 211, 245, 32, 6, - 1, 251, 135, 3, 240, 63, 26, 214, 10, 26, 211, 245, 32, 6, 1, 251, 135, - 3, 211, 232, 26, 213, 39, 26, 211, 245, 32, 6, 1, 251, 135, 3, 240, 63, - 26, 213, 39, 26, 211, 245, 32, 4, 1, 236, 127, 3, 211, 232, 26, 195, 225, - 32, 4, 1, 236, 127, 3, 240, 63, 26, 195, 225, 32, 4, 1, 236, 127, 3, 211, - 232, 26, 199, 134, 26, 195, 225, 32, 4, 1, 236, 127, 3, 240, 63, 26, 199, - 134, 26, 195, 225, 32, 4, 1, 236, 127, 3, 211, 232, 26, 214, 10, 26, 195, - 225, 32, 4, 1, 236, 127, 3, 240, 63, 26, 214, 10, 26, 195, 225, 32, 4, 1, - 236, 127, 3, 211, 232, 26, 213, 39, 26, 195, 225, 32, 4, 1, 236, 127, 3, - 240, 63, 26, 213, 39, 26, 195, 225, 32, 6, 1, 236, 127, 3, 211, 232, 26, - 211, 245, 32, 6, 1, 236, 127, 3, 240, 63, 26, 211, 245, 32, 6, 1, 236, - 127, 3, 211, 232, 26, 199, 134, 26, 211, 245, 32, 6, 1, 236, 127, 3, 240, - 63, 26, 199, 134, 26, 211, 245, 32, 6, 1, 236, 127, 3, 211, 232, 26, 214, - 10, 26, 211, 245, 32, 6, 1, 236, 127, 3, 240, 63, 26, 214, 10, 26, 211, - 245, 32, 6, 1, 236, 127, 3, 211, 232, 26, 213, 39, 26, 211, 245, 32, 6, - 1, 236, 127, 3, 240, 63, 26, 213, 39, 26, 211, 245, 32, 4, 1, 214, 125, - 3, 211, 232, 26, 195, 225, 32, 4, 1, 214, 125, 3, 240, 63, 26, 195, 225, - 32, 4, 1, 214, 125, 3, 211, 232, 26, 199, 134, 26, 195, 225, 32, 4, 1, - 214, 125, 3, 240, 63, 26, 199, 134, 26, 195, 225, 32, 4, 1, 214, 125, 3, - 211, 232, 26, 214, 10, 26, 195, 225, 32, 4, 1, 214, 125, 3, 240, 63, 26, - 214, 10, 26, 195, 225, 32, 4, 1, 214, 125, 3, 211, 232, 26, 213, 39, 26, - 195, 225, 32, 4, 1, 214, 125, 3, 240, 63, 26, 213, 39, 26, 195, 225, 32, - 6, 1, 214, 125, 3, 211, 232, 26, 211, 245, 32, 6, 1, 214, 125, 3, 240, - 63, 26, 211, 245, 32, 6, 1, 214, 125, 3, 211, 232, 26, 199, 134, 26, 211, - 245, 32, 6, 1, 214, 125, 3, 240, 63, 26, 199, 134, 26, 211, 245, 32, 6, - 1, 214, 125, 3, 211, 232, 26, 214, 10, 26, 211, 245, 32, 6, 1, 214, 125, - 3, 240, 63, 26, 214, 10, 26, 211, 245, 32, 6, 1, 214, 125, 3, 211, 232, - 26, 213, 39, 26, 211, 245, 32, 6, 1, 214, 125, 3, 240, 63, 26, 213, 39, - 26, 211, 245, 32, 4, 1, 251, 135, 3, 198, 224, 32, 4, 1, 251, 135, 3, - 220, 114, 32, 4, 1, 251, 135, 3, 199, 134, 26, 195, 225, 32, 4, 1, 251, - 135, 3, 195, 225, 32, 4, 1, 251, 135, 3, 214, 10, 26, 195, 225, 32, 4, 1, - 251, 135, 3, 213, 38, 32, 4, 1, 251, 135, 3, 213, 39, 26, 195, 225, 32, - 6, 1, 251, 135, 3, 198, 224, 32, 6, 1, 251, 135, 3, 220, 114, 32, 6, 1, - 251, 135, 3, 199, 133, 32, 6, 1, 251, 135, 3, 214, 9, 32, 6, 1, 251, 135, - 3, 211, 245, 32, 223, 232, 32, 211, 245, 32, 211, 231, 32, 213, 38, 32, - 239, 144, 26, 213, 38, 32, 4, 1, 236, 127, 3, 199, 134, 26, 195, 225, 32, - 4, 1, 236, 127, 3, 195, 225, 32, 4, 1, 236, 127, 3, 214, 10, 26, 195, - 225, 32, 4, 1, 236, 127, 3, 213, 38, 32, 4, 1, 236, 127, 3, 213, 39, 26, - 195, 225, 32, 6, 1, 236, 175, 3, 199, 133, 32, 6, 1, 236, 175, 3, 214, 9, - 32, 6, 1, 236, 127, 3, 199, 133, 32, 6, 1, 236, 127, 3, 214, 9, 32, 6, 1, - 236, 127, 3, 211, 245, 32, 211, 232, 26, 199, 133, 32, 211, 232, 26, 214, - 9, 32, 211, 232, 26, 213, 38, 32, 4, 1, 226, 8, 3, 198, 224, 32, 4, 1, - 226, 8, 3, 220, 114, 32, 4, 1, 226, 8, 3, 239, 144, 26, 199, 133, 32, 4, - 1, 226, 8, 3, 239, 144, 26, 214, 9, 32, 4, 1, 226, 8, 3, 213, 38, 32, 4, - 1, 226, 8, 3, 239, 144, 26, 213, 38, 32, 6, 1, 226, 8, 3, 198, 224, 32, - 6, 1, 226, 8, 3, 220, 114, 32, 6, 1, 226, 8, 3, 199, 133, 32, 6, 1, 226, - 8, 3, 214, 9, 32, 240, 63, 26, 199, 133, 32, 240, 63, 26, 214, 9, 32, - 240, 63, 26, 213, 38, 32, 4, 1, 200, 29, 3, 198, 224, 32, 4, 1, 200, 29, - 3, 220, 114, 32, 4, 1, 200, 29, 3, 239, 144, 26, 199, 133, 32, 4, 1, 200, - 29, 3, 239, 144, 26, 214, 9, 32, 4, 1, 210, 75, 3, 211, 231, 32, 4, 1, - 210, 75, 3, 240, 62, 32, 4, 1, 200, 29, 3, 213, 38, 32, 4, 1, 200, 29, 3, - 239, 144, 26, 213, 38, 32, 6, 1, 200, 29, 3, 198, 224, 32, 6, 1, 200, 29, - 3, 220, 114, 32, 6, 1, 200, 29, 3, 199, 133, 32, 6, 1, 200, 29, 3, 214, - 9, 32, 6, 1, 210, 75, 3, 240, 62, 32, 239, 144, 26, 199, 133, 32, 239, - 144, 26, 214, 9, 32, 199, 133, 32, 4, 1, 214, 125, 3, 199, 134, 26, 195, - 225, 32, 4, 1, 214, 125, 3, 195, 225, 32, 4, 1, 214, 125, 3, 214, 10, 26, - 195, 225, 32, 4, 1, 214, 125, 3, 213, 38, 32, 4, 1, 214, 125, 3, 213, 39, - 26, 195, 225, 32, 6, 1, 214, 123, 3, 199, 133, 32, 6, 1, 214, 123, 3, - 214, 9, 32, 6, 1, 214, 125, 3, 199, 133, 32, 6, 1, 214, 125, 3, 214, 9, - 32, 6, 1, 214, 125, 3, 211, 245, 32, 214, 9, 32, 240, 62, 236, 231, 211, - 94, 236, 242, 211, 94, 236, 231, 205, 148, 236, 242, 205, 148, 202, 148, - 205, 148, 235, 5, 205, 148, 206, 27, 205, 148, 235, 143, 205, 148, 211, - 214, 205, 148, 202, 188, 205, 148, 232, 234, 205, 148, 195, 80, 197, 59, - 205, 148, 195, 80, 197, 59, 216, 36, 195, 80, 197, 59, 225, 124, 222, - 175, 78, 210, 13, 78, 231, 7, 216, 37, 231, 7, 235, 143, 240, 65, 236, - 231, 240, 65, 236, 242, 240, 65, 231, 155, 154, 52, 83, 222, 75, 52, 126, - 222, 75, 50, 206, 62, 211, 62, 78, 53, 206, 62, 211, 62, 78, 206, 62, - 221, 207, 211, 62, 78, 206, 62, 232, 45, 211, 62, 78, 50, 52, 211, 62, - 78, 53, 52, 211, 62, 78, 52, 221, 207, 211, 62, 78, 52, 232, 45, 211, 62, - 78, 240, 118, 52, 240, 118, 248, 5, 201, 177, 248, 5, 97, 76, 222, 195, - 99, 76, 222, 195, 231, 155, 236, 247, 231, 5, 212, 110, 222, 76, 207, 90, - 213, 154, 207, 90, 222, 175, 236, 240, 210, 13, 236, 240, 212, 88, 239, - 84, 235, 22, 222, 175, 214, 17, 210, 13, 214, 17, 217, 210, 216, 44, 205, - 148, 213, 46, 219, 29, 55, 213, 46, 203, 24, 202, 159, 55, 212, 19, 52, - 212, 19, 201, 165, 212, 19, 210, 89, 212, 19, 210, 89, 52, 212, 19, 210, - 89, 201, 165, 212, 19, 247, 110, 206, 62, 222, 179, 251, 91, 211, 62, 78, - 206, 62, 210, 17, 251, 91, 211, 62, 78, 210, 154, 78, 52, 236, 90, 78, - 226, 26, 214, 19, 200, 59, 190, 202, 107, 247, 111, 226, 43, 212, 110, - 250, 177, 231, 8, 248, 5, 191, 205, 248, 50, 47, 248, 62, 3, 211, 73, 53, - 47, 248, 62, 3, 211, 73, 52, 211, 79, 78, 211, 79, 236, 90, 78, 236, 90, - 211, 79, 78, 202, 60, 2, 236, 128, 210, 89, 212, 179, 55, 58, 107, 248, - 5, 58, 91, 248, 5, 126, 250, 179, 210, 89, 207, 105, 244, 204, 200, 36, - 99, 250, 178, 251, 150, 199, 49, 244, 157, 219, 16, 55, 204, 46, 240, 65, - 226, 17, 200, 59, 235, 63, 211, 214, 78, 115, 76, 211, 213, 211, 90, 212, - 19, 235, 7, 76, 211, 213, 235, 101, 76, 211, 213, 99, 76, 211, 213, 235, - 7, 76, 78, 237, 250, 241, 61, 201, 176, 83, 235, 7, 238, 250, 219, 190, - 13, 205, 148, 197, 9, 225, 124, 234, 215, 251, 25, 226, 15, 202, 76, 226, - 15, 207, 90, 226, 15, 212, 125, 222, 175, 225, 240, 210, 13, 225, 240, - 235, 113, 204, 182, 225, 240, 212, 88, 239, 84, 225, 240, 226, 56, 203, - 248, 204, 64, 252, 12, 203, 248, 204, 64, 226, 56, 9, 235, 24, 207, 19, - 252, 12, 9, 235, 24, 207, 19, 217, 204, 17, 207, 20, 216, 40, 17, 207, - 20, 204, 95, 195, 79, 204, 95, 8, 4, 1, 68, 204, 95, 136, 204, 95, 146, - 204, 95, 167, 204, 95, 178, 204, 95, 171, 204, 95, 182, 204, 95, 98, 55, - 204, 95, 219, 15, 204, 95, 236, 172, 55, 204, 95, 50, 213, 140, 204, 95, - 53, 213, 140, 204, 95, 8, 4, 1, 218, 55, 204, 143, 195, 79, 204, 143, - 100, 204, 143, 102, 204, 143, 134, 204, 143, 136, 204, 143, 146, 204, - 143, 167, 204, 143, 178, 204, 143, 171, 204, 143, 182, 204, 143, 98, 55, - 204, 143, 219, 15, 204, 143, 236, 172, 55, 204, 143, 50, 213, 140, 204, - 143, 53, 213, 140, 8, 204, 143, 4, 1, 63, 8, 204, 143, 4, 1, 69, 8, 204, - 143, 4, 1, 72, 8, 204, 143, 4, 1, 196, 222, 8, 204, 143, 4, 1, 208, 163, - 8, 204, 143, 4, 1, 233, 15, 8, 204, 143, 4, 1, 225, 80, 8, 204, 143, 4, - 1, 159, 8, 204, 143, 4, 1, 221, 136, 8, 204, 143, 4, 1, 218, 55, 8, 204, - 143, 4, 1, 214, 3, 8, 204, 143, 4, 1, 209, 80, 8, 204, 143, 4, 1, 203, - 216, 236, 107, 55, 244, 169, 55, 241, 46, 55, 234, 243, 234, 248, 55, - 222, 55, 55, 219, 30, 55, 217, 228, 55, 213, 23, 55, 209, 108, 55, 197, - 17, 55, 217, 83, 206, 241, 55, 239, 5, 55, 236, 108, 55, 224, 70, 55, - 201, 27, 55, 237, 228, 55, 234, 21, 213, 58, 55, 213, 20, 55, 233, 71, - 55, 250, 140, 55, 231, 81, 55, 247, 52, 55, 222, 45, 201, 223, 55, 205, - 128, 55, 203, 21, 55, 226, 71, 209, 108, 55, 201, 6, 222, 55, 55, 216, - 26, 117, 55, 220, 60, 55, 209, 131, 55, 222, 224, 55, 248, 144, 55, 38, - 50, 232, 169, 57, 38, 53, 232, 169, 57, 38, 181, 83, 222, 76, 214, 20, - 38, 206, 182, 83, 222, 76, 214, 20, 38, 251, 65, 61, 57, 38, 244, 205, - 61, 57, 38, 50, 61, 57, 38, 53, 61, 57, 38, 210, 3, 214, 20, 38, 244, - 205, 210, 3, 214, 20, 38, 251, 65, 210, 3, 214, 20, 38, 115, 238, 251, - 57, 38, 235, 7, 238, 251, 57, 38, 236, 226, 244, 249, 38, 236, 226, 205, - 94, 38, 236, 226, 239, 140, 38, 236, 226, 244, 250, 249, 133, 38, 50, 53, - 61, 57, 38, 236, 226, 208, 154, 38, 236, 226, 224, 149, 38, 236, 226, - 200, 26, 212, 107, 201, 180, 38, 210, 90, 205, 178, 214, 20, 38, 52, 83, - 204, 196, 214, 20, 38, 251, 75, 105, 38, 201, 165, 200, 61, 38, 197, 62, - 248, 40, 57, 38, 107, 61, 214, 20, 38, 181, 52, 205, 178, 214, 20, 38, - 91, 232, 169, 3, 165, 237, 230, 38, 107, 232, 169, 3, 165, 237, 230, 38, - 50, 61, 60, 38, 53, 61, 60, 38, 250, 180, 57, 252, 18, 214, 159, 252, 2, - 202, 30, 202, 218, 204, 153, 237, 241, 6, 247, 207, 239, 231, 247, 42, - 247, 37, 222, 76, 105, 247, 112, 214, 159, 247, 166, 200, 71, 236, 109, - 241, 137, 208, 151, 239, 231, 235, 221, 145, 4, 234, 190, 145, 6, 233, - 15, 248, 134, 6, 233, 15, 237, 241, 6, 233, 15, 212, 144, 241, 137, 212, - 144, 241, 138, 127, 99, 212, 220, 145, 6, 68, 248, 134, 6, 68, 145, 6, - 159, 145, 4, 159, 223, 100, 74, 249, 80, 105, 237, 241, 6, 218, 55, 215, - 140, 55, 205, 162, 210, 166, 241, 104, 145, 6, 214, 3, 237, 241, 6, 214, - 3, 237, 241, 6, 211, 167, 145, 6, 144, 248, 134, 6, 144, 237, 241, 6, - 144, 212, 27, 203, 128, 210, 102, 207, 81, 78, 203, 34, 55, 201, 213, - 117, 55, 199, 101, 237, 241, 6, 195, 158, 214, 38, 55, 214, 148, 55, 226, - 17, 214, 148, 55, 248, 134, 6, 195, 158, 163, 32, 4, 1, 226, 7, 224, 190, - 55, 251, 85, 55, 145, 6, 250, 112, 248, 134, 6, 247, 207, 236, 133, 105, - 145, 4, 69, 145, 6, 69, 145, 6, 236, 49, 163, 6, 236, 49, 145, 6, 221, - 136, 145, 4, 72, 151, 105, 248, 209, 105, 233, 178, 105, 240, 102, 105, - 226, 61, 205, 160, 209, 194, 6, 211, 167, 235, 224, 55, 237, 241, 4, 212, - 220, 237, 241, 4, 234, 94, 237, 241, 6, 234, 94, 237, 241, 6, 212, 220, - 237, 241, 218, 54, 204, 114, 163, 45, 6, 234, 190, 163, 45, 6, 159, 210, - 89, 45, 6, 159, 163, 45, 6, 196, 148, 237, 241, 41, 6, 240, 231, 237, - 241, 41, 4, 240, 231, 237, 241, 41, 4, 69, 237, 241, 41, 4, 68, 237, 241, - 41, 4, 225, 217, 211, 249, 222, 75, 163, 251, 111, 213, 46, 55, 251, 175, - 163, 4, 236, 49, 16, 36, 208, 228, 205, 160, 197, 217, 191, 97, 207, 67, - 197, 217, 191, 97, 216, 173, 197, 217, 191, 97, 203, 14, 197, 217, 191, - 97, 202, 184, 197, 217, 191, 99, 202, 181, 197, 217, 191, 97, 235, 148, - 197, 217, 191, 99, 235, 147, 197, 217, 191, 115, 235, 147, 197, 217, 191, - 235, 7, 235, 147, 197, 217, 191, 97, 206, 17, 197, 217, 191, 235, 101, - 206, 15, 197, 217, 191, 97, 237, 26, 197, 217, 191, 115, 237, 24, 197, - 217, 191, 235, 101, 237, 24, 197, 217, 191, 207, 71, 237, 24, 191, 215, - 141, 100, 209, 208, 215, 142, 100, 209, 208, 215, 142, 102, 209, 208, - 215, 142, 134, 209, 208, 215, 142, 136, 209, 208, 215, 142, 146, 209, - 208, 215, 142, 167, 209, 208, 215, 142, 178, 209, 208, 215, 142, 171, - 209, 208, 215, 142, 182, 209, 208, 215, 142, 203, 23, 209, 208, 215, 142, - 236, 252, 209, 208, 215, 142, 200, 239, 209, 208, 215, 142, 235, 145, - 209, 208, 215, 142, 97, 231, 57, 209, 208, 215, 142, 235, 101, 231, 57, - 209, 208, 215, 142, 97, 170, 4, 209, 208, 215, 142, 100, 4, 209, 208, - 215, 142, 102, 4, 209, 208, 215, 142, 134, 4, 209, 208, 215, 142, 136, 4, - 209, 208, 215, 142, 146, 4, 209, 208, 215, 142, 167, 4, 209, 208, 215, - 142, 178, 4, 209, 208, 215, 142, 171, 4, 209, 208, 215, 142, 182, 4, 209, - 208, 215, 142, 203, 23, 4, 209, 208, 215, 142, 236, 252, 4, 209, 208, - 215, 142, 200, 239, 4, 209, 208, 215, 142, 235, 145, 4, 209, 208, 215, - 142, 97, 231, 57, 4, 209, 208, 215, 142, 235, 101, 231, 57, 4, 209, 208, - 215, 142, 97, 170, 209, 208, 215, 142, 97, 202, 159, 247, 208, 240, 231, - 209, 208, 215, 142, 235, 101, 170, 209, 208, 215, 142, 203, 24, 170, 209, - 208, 215, 142, 210, 89, 97, 231, 57, 8, 4, 1, 210, 89, 247, 207, 209, - 208, 215, 142, 206, 29, 222, 219, 20, 209, 208, 215, 142, 235, 146, 237, - 75, 20, 209, 208, 215, 142, 235, 146, 170, 209, 208, 215, 142, 97, 231, - 58, 170, 197, 217, 191, 195, 80, 202, 181, 163, 17, 102, 163, 17, 134, - 107, 51, 200, 24, 51, 91, 51, 237, 231, 51, 50, 53, 51, 124, 135, 51, - 173, 197, 89, 51, 173, 237, 69, 51, 205, 159, 237, 69, 51, 205, 159, 197, - 89, 51, 107, 61, 3, 106, 91, 61, 3, 106, 107, 197, 123, 51, 91, 197, 123, - 51, 107, 99, 232, 135, 51, 200, 24, 99, 232, 135, 51, 91, 99, 232, 135, - 51, 237, 231, 99, 232, 135, 51, 107, 61, 3, 203, 135, 91, 61, 3, 203, - 135, 107, 61, 234, 235, 154, 200, 24, 61, 234, 235, 154, 91, 61, 234, - 235, 154, 237, 231, 61, 234, 235, 154, 124, 135, 61, 3, 249, 66, 107, 61, - 3, 122, 91, 61, 3, 122, 107, 61, 3, 221, 225, 91, 61, 3, 221, 225, 50, - 53, 197, 123, 51, 50, 53, 61, 3, 106, 237, 231, 195, 24, 51, 200, 24, 61, - 3, 202, 68, 222, 174, 200, 24, 61, 3, 202, 68, 210, 11, 237, 231, 61, 3, - 202, 68, 222, 174, 237, 231, 61, 3, 202, 68, 210, 11, 91, 61, 3, 241, - 102, 237, 230, 237, 231, 61, 3, 241, 102, 222, 174, 251, 65, 201, 243, - 207, 108, 51, 244, 205, 201, 243, 207, 108, 51, 173, 197, 89, 61, 202, - 30, 181, 154, 107, 61, 202, 30, 249, 80, 127, 91, 61, 202, 30, 154, 251, - 65, 192, 244, 250, 51, 244, 205, 192, 244, 250, 51, 107, 232, 169, 3, - 165, 200, 23, 107, 232, 169, 3, 165, 237, 230, 200, 24, 232, 169, 3, 165, - 210, 11, 200, 24, 232, 169, 3, 165, 222, 174, 91, 232, 169, 3, 165, 200, - 23, 91, 232, 169, 3, 165, 237, 230, 237, 231, 232, 169, 3, 165, 210, 11, - 237, 231, 232, 169, 3, 165, 222, 174, 91, 61, 127, 107, 51, 200, 24, 61, - 107, 77, 237, 231, 51, 107, 61, 127, 91, 51, 107, 213, 219, 250, 214, - 200, 24, 213, 219, 250, 214, 91, 213, 219, 250, 214, 237, 231, 213, 219, - 250, 214, 107, 232, 169, 127, 91, 232, 168, 91, 232, 169, 127, 107, 232, - 168, 107, 52, 61, 3, 106, 50, 53, 52, 61, 3, 106, 91, 52, 61, 3, 106, - 107, 52, 51, 200, 24, 52, 51, 91, 52, 51, 237, 231, 52, 51, 50, 53, 52, - 51, 124, 135, 52, 51, 173, 197, 89, 52, 51, 173, 237, 69, 52, 51, 205, - 159, 237, 69, 52, 51, 205, 159, 197, 89, 52, 51, 107, 201, 165, 51, 91, - 201, 165, 51, 107, 205, 87, 51, 91, 205, 87, 51, 200, 24, 61, 3, 52, 106, - 237, 231, 61, 3, 52, 106, 107, 240, 64, 51, 200, 24, 240, 64, 51, 91, - 240, 64, 51, 237, 231, 240, 64, 51, 107, 61, 202, 30, 154, 91, 61, 202, - 30, 154, 107, 59, 51, 200, 24, 59, 51, 91, 59, 51, 237, 231, 59, 51, 200, - 24, 59, 61, 234, 235, 154, 200, 24, 59, 61, 214, 120, 213, 82, 200, 24, - 59, 61, 214, 120, 213, 83, 3, 231, 155, 154, 200, 24, 59, 61, 214, 120, - 213, 83, 3, 83, 154, 200, 24, 59, 52, 51, 200, 24, 59, 52, 61, 214, 120, - 213, 82, 91, 59, 61, 234, 235, 197, 148, 173, 197, 89, 61, 202, 30, 241, - 101, 205, 159, 237, 69, 61, 202, 30, 241, 101, 124, 135, 59, 51, 53, 61, - 3, 4, 244, 249, 237, 231, 61, 107, 77, 200, 24, 51, 115, 91, 250, 214, - 107, 61, 3, 83, 106, 91, 61, 3, 83, 106, 50, 53, 61, 3, 83, 106, 107, 61, - 3, 52, 83, 106, 91, 61, 3, 52, 83, 106, 50, 53, 61, 3, 52, 83, 106, 107, - 214, 90, 51, 91, 214, 90, 51, 50, 53, 214, 90, 51, 36, 251, 146, 244, - 153, 213, 132, 239, 124, 202, 208, 236, 85, 202, 208, 239, 19, 216, 19, - 236, 86, 236, 232, 207, 76, 226, 75, 217, 239, 237, 0, 214, 159, 216, 19, - 251, 107, 237, 0, 214, 159, 4, 237, 0, 214, 159, 241, 131, 250, 203, 219, - 168, 239, 19, 216, 19, 241, 133, 250, 203, 219, 168, 4, 241, 131, 250, - 203, 219, 168, 236, 222, 77, 211, 251, 218, 54, 212, 5, 218, 54, 241, - 108, 218, 54, 204, 114, 219, 16, 55, 219, 14, 55, 76, 212, 125, 239, 54, - 205, 248, 207, 77, 219, 15, 250, 180, 214, 82, 210, 3, 214, 82, 248, 6, - 214, 82, 47, 209, 200, 241, 37, 209, 200, 235, 0, 209, 200, 211, 247, - 149, 226, 63, 53, 251, 90, 251, 90, 219, 201, 251, 90, 205, 127, 251, 90, - 239, 57, 239, 19, 216, 19, 239, 61, 213, 146, 149, 216, 19, 213, 146, - 149, 221, 249, 251, 100, 221, 249, 214, 72, 226, 23, 200, 51, 226, 37, - 52, 226, 37, 201, 165, 226, 37, 241, 125, 226, 37, 204, 84, 226, 37, 198, - 236, 226, 37, 244, 205, 226, 37, 244, 205, 241, 125, 226, 37, 251, 65, - 241, 125, 226, 37, 202, 207, 248, 253, 210, 194, 211, 248, 76, 219, 15, - 236, 93, 234, 27, 211, 248, 231, 170, 202, 85, 214, 82, 210, 89, 202, 84, - 226, 17, 222, 204, 209, 80, 206, 64, 197, 122, 196, 253, 212, 5, 216, 19, - 202, 84, 219, 16, 202, 84, 250, 172, 180, 149, 216, 19, 250, 172, 180, - 149, 251, 21, 180, 149, 251, 21, 247, 232, 216, 19, 252, 11, 180, 149, - 217, 103, 251, 21, 216, 28, 252, 11, 180, 149, 251, 139, 180, 149, 216, - 19, 251, 139, 180, 149, 251, 139, 180, 214, 73, 180, 149, 201, 165, 202, - 84, 251, 147, 180, 149, 236, 165, 149, 234, 26, 236, 165, 149, 239, 125, - 248, 203, 251, 23, 202, 218, 222, 83, 234, 26, 180, 149, 251, 21, 180, - 202, 30, 214, 73, 202, 218, 226, 102, 214, 159, 226, 102, 77, 214, 73, - 251, 21, 180, 149, 244, 169, 236, 171, 236, 172, 244, 168, 210, 3, 226, - 87, 180, 149, 210, 3, 180, 149, 241, 94, 149, 236, 132, 236, 170, 149, - 205, 8, 236, 171, 239, 213, 180, 149, 180, 202, 30, 247, 219, 239, 232, - 219, 201, 247, 218, 211, 77, 180, 149, 216, 19, 180, 149, 230, 193, 149, - 216, 19, 230, 193, 149, 204, 203, 236, 165, 149, 222, 140, 214, 73, 180, - 149, 233, 94, 214, 73, 180, 149, 222, 140, 127, 180, 149, 233, 94, 127, - 180, 149, 222, 140, 247, 232, 216, 19, 180, 149, 233, 94, 247, 232, 216, - 19, 180, 149, 218, 135, 222, 139, 218, 135, 233, 93, 248, 203, 216, 19, - 236, 165, 149, 216, 19, 222, 139, 216, 19, 233, 93, 217, 103, 222, 140, - 216, 28, 180, 149, 217, 103, 233, 94, 216, 28, 180, 149, 222, 140, 214, - 73, 236, 165, 149, 233, 94, 214, 73, 236, 165, 149, 217, 103, 222, 140, - 216, 28, 236, 165, 149, 217, 103, 233, 94, 216, 28, 236, 165, 149, 222, - 140, 214, 73, 233, 93, 233, 94, 214, 73, 222, 139, 217, 103, 222, 140, - 216, 28, 233, 93, 217, 103, 233, 94, 216, 28, 222, 139, 212, 35, 204, - 133, 212, 36, 214, 73, 180, 149, 204, 134, 214, 73, 180, 149, 212, 36, - 214, 73, 236, 165, 149, 204, 134, 214, 73, 236, 165, 149, 239, 19, 216, - 19, 212, 38, 239, 19, 216, 19, 204, 135, 204, 142, 214, 159, 204, 94, - 214, 159, 216, 19, 39, 204, 142, 214, 159, 216, 19, 39, 204, 94, 214, - 159, 204, 142, 77, 214, 73, 180, 149, 204, 94, 77, 214, 73, 180, 149, - 217, 103, 39, 204, 142, 77, 216, 28, 180, 149, 217, 103, 39, 204, 94, 77, - 216, 28, 180, 149, 204, 142, 77, 3, 216, 19, 180, 149, 204, 94, 77, 3, - 216, 19, 180, 149, 218, 115, 218, 116, 218, 117, 218, 116, 200, 51, 47, - 226, 102, 214, 159, 47, 214, 63, 214, 159, 47, 226, 102, 77, 214, 73, - 180, 149, 47, 214, 63, 77, 214, 73, 180, 149, 47, 247, 125, 47, 241, 27, - 46, 212, 125, 46, 219, 15, 46, 202, 76, 46, 239, 54, 205, 248, 46, 76, - 214, 82, 46, 210, 3, 214, 82, 46, 250, 180, 214, 82, 46, 236, 171, 46, - 240, 65, 103, 212, 125, 103, 219, 15, 103, 202, 76, 103, 76, 214, 82, 53, - 203, 147, 50, 203, 147, 135, 203, 147, 124, 203, 147, 250, 183, 218, 240, - 201, 142, 235, 30, 201, 165, 83, 249, 80, 53, 201, 3, 52, 83, 249, 80, - 52, 53, 201, 3, 239, 19, 216, 19, 211, 241, 216, 19, 201, 142, 239, 19, - 216, 19, 235, 31, 217, 106, 52, 83, 249, 80, 52, 53, 201, 3, 212, 36, - 200, 64, 210, 136, 204, 134, 200, 64, 210, 136, 216, 25, 204, 156, 214, - 159, 241, 131, 250, 203, 216, 25, 204, 155, 216, 25, 204, 156, 77, 214, - 73, 180, 149, 241, 131, 250, 203, 216, 25, 204, 156, 214, 73, 180, 149, - 214, 63, 214, 159, 226, 102, 214, 159, 218, 122, 232, 92, 241, 142, 220, - 1, 226, 34, 196, 181, 217, 219, 216, 27, 53, 251, 91, 3, 250, 253, 53, - 201, 180, 218, 54, 221, 249, 251, 100, 218, 54, 221, 249, 214, 72, 218, - 54, 226, 23, 218, 54, 200, 51, 239, 141, 214, 82, 76, 214, 82, 205, 8, - 214, 82, 239, 54, 202, 76, 248, 71, 50, 216, 25, 235, 223, 207, 104, 212, - 5, 53, 216, 25, 235, 223, 207, 104, 212, 5, 50, 207, 104, 212, 5, 53, - 207, 104, 212, 5, 210, 89, 202, 85, 236, 171, 241, 18, 221, 249, 214, 72, - 241, 18, 221, 249, 251, 100, 52, 204, 141, 52, 204, 93, 52, 226, 23, 52, - 200, 51, 212, 155, 180, 26, 213, 146, 149, 222, 140, 3, 238, 253, 233, - 94, 3, 238, 253, 199, 48, 218, 135, 222, 139, 199, 48, 218, 135, 233, 93, - 222, 140, 180, 202, 30, 214, 73, 233, 93, 233, 94, 180, 202, 30, 214, 73, - 222, 139, 180, 202, 30, 214, 73, 222, 139, 180, 202, 30, 214, 73, 233, - 93, 180, 202, 30, 214, 73, 212, 35, 180, 202, 30, 214, 73, 204, 133, 239, - 19, 216, 19, 212, 39, 214, 73, 236, 173, 239, 19, 216, 19, 204, 136, 214, - 73, 236, 173, 216, 19, 47, 226, 102, 77, 214, 73, 180, 149, 216, 19, 47, - 214, 63, 77, 214, 73, 180, 149, 47, 226, 102, 77, 214, 73, 216, 19, 180, - 149, 47, 214, 63, 77, 214, 73, 216, 19, 180, 149, 222, 140, 247, 232, - 216, 19, 236, 165, 149, 233, 94, 247, 232, 216, 19, 236, 165, 149, 212, - 36, 247, 232, 216, 19, 236, 165, 149, 204, 134, 247, 232, 216, 19, 236, - 165, 149, 216, 19, 216, 25, 204, 156, 214, 159, 239, 19, 216, 19, 241, - 133, 250, 203, 216, 25, 204, 155, 216, 19, 216, 25, 204, 156, 77, 214, - 73, 180, 149, 239, 19, 216, 19, 241, 133, 250, 203, 216, 25, 204, 156, - 214, 73, 236, 173, 83, 236, 247, 219, 61, 231, 155, 236, 247, 124, 53, - 239, 147, 236, 247, 135, 53, 239, 147, 236, 247, 237, 0, 77, 3, 181, 231, - 155, 106, 237, 0, 77, 3, 83, 249, 80, 250, 169, 236, 222, 77, 231, 155, - 106, 4, 237, 0, 77, 3, 83, 249, 80, 250, 169, 236, 222, 77, 231, 155, - 106, 237, 0, 77, 3, 76, 57, 237, 0, 77, 3, 214, 26, 4, 237, 0, 77, 3, - 214, 26, 237, 0, 77, 3, 200, 62, 237, 0, 77, 3, 99, 231, 155, 204, 183, - 241, 131, 3, 181, 231, 155, 106, 241, 131, 3, 83, 249, 80, 250, 169, 236, - 222, 77, 231, 155, 106, 4, 241, 131, 3, 83, 249, 80, 250, 169, 236, 222, - 77, 231, 155, 106, 241, 131, 3, 214, 26, 4, 241, 131, 3, 214, 26, 195, - 159, 216, 17, 249, 123, 219, 167, 239, 142, 55, 237, 2, 51, 231, 87, 124, - 250, 217, 135, 250, 217, 211, 255, 213, 26, 197, 119, 222, 75, 50, 247, - 45, 53, 247, 45, 50, 235, 69, 53, 235, 69, 248, 85, 53, 241, 63, 248, 85, - 50, 241, 63, 201, 243, 53, 241, 63, 201, 243, 50, 241, 63, 210, 89, 216, - 19, 55, 47, 221, 198, 250, 253, 208, 122, 208, 131, 203, 34, 210, 167, - 212, 79, 226, 68, 199, 22, 205, 94, 212, 149, 77, 226, 33, 55, 163, 216, - 19, 55, 197, 129, 231, 89, 201, 243, 50, 241, 101, 201, 243, 53, 241, - 101, 248, 85, 50, 241, 101, 248, 85, 53, 241, 101, 201, 243, 157, 226, - 37, 248, 85, 157, 226, 37, 234, 230, 205, 219, 124, 250, 218, 248, 204, - 99, 231, 155, 249, 68, 214, 75, 224, 153, 236, 161, 202, 30, 202, 218, - 210, 22, 196, 223, 226, 87, 39, 210, 164, 248, 70, 224, 151, 222, 179, - 251, 91, 179, 210, 17, 251, 91, 179, 236, 161, 202, 30, 202, 218, 222, - 184, 248, 215, 210, 2, 240, 241, 251, 147, 250, 226, 203, 247, 201, 228, - 209, 113, 239, 104, 214, 64, 241, 146, 203, 103, 205, 233, 241, 90, 241, - 89, 251, 40, 234, 213, 16, 230, 242, 251, 40, 234, 213, 16, 205, 85, 211, - 94, 251, 40, 234, 213, 16, 211, 95, 236, 173, 251, 40, 234, 213, 16, 211, - 95, 239, 61, 251, 40, 234, 213, 16, 211, 95, 239, 140, 251, 40, 234, 213, - 16, 211, 95, 225, 116, 251, 40, 234, 213, 16, 211, 95, 244, 249, 251, 40, - 234, 213, 16, 244, 250, 204, 234, 251, 40, 234, 213, 16, 244, 250, 225, - 116, 251, 40, 234, 213, 16, 205, 249, 154, 251, 40, 234, 213, 16, 249, - 134, 154, 251, 40, 234, 213, 16, 211, 95, 205, 248, 251, 40, 234, 213, - 16, 211, 95, 249, 133, 251, 40, 234, 213, 16, 211, 95, 222, 139, 251, 40, - 234, 213, 16, 211, 95, 233, 93, 251, 40, 234, 213, 16, 107, 199, 140, - 251, 40, 234, 213, 16, 91, 199, 140, 251, 40, 234, 213, 16, 211, 95, 107, - 51, 251, 40, 234, 213, 16, 211, 95, 91, 51, 251, 40, 234, 213, 16, 244, - 250, 249, 133, 251, 40, 234, 213, 16, 135, 203, 148, 200, 62, 251, 40, - 234, 213, 16, 239, 213, 204, 234, 251, 40, 234, 213, 16, 211, 95, 135, - 247, 110, 251, 40, 234, 213, 16, 211, 95, 239, 212, 251, 40, 234, 213, - 16, 135, 203, 148, 225, 116, 251, 40, 234, 213, 16, 200, 24, 199, 140, - 251, 40, 234, 213, 16, 211, 95, 200, 24, 51, 251, 40, 234, 213, 16, 124, - 203, 148, 214, 26, 251, 40, 234, 213, 16, 239, 225, 204, 234, 251, 40, - 234, 213, 16, 211, 95, 124, 247, 110, 251, 40, 234, 213, 16, 211, 95, - 239, 224, 251, 40, 234, 213, 16, 124, 203, 148, 225, 116, 251, 40, 234, - 213, 16, 237, 231, 199, 140, 251, 40, 234, 213, 16, 211, 95, 237, 231, - 51, 251, 40, 234, 213, 16, 211, 61, 200, 62, 251, 40, 234, 213, 16, 239, - 213, 200, 62, 251, 40, 234, 213, 16, 239, 141, 200, 62, 251, 40, 234, - 213, 16, 225, 117, 200, 62, 251, 40, 234, 213, 16, 244, 250, 200, 62, - 251, 40, 234, 213, 16, 124, 206, 195, 225, 116, 251, 40, 234, 213, 16, - 211, 61, 211, 94, 251, 40, 234, 213, 16, 244, 250, 205, 7, 251, 40, 234, - 213, 16, 211, 95, 244, 168, 251, 40, 234, 213, 16, 124, 203, 148, 239, - 150, 251, 40, 234, 213, 16, 239, 225, 239, 150, 251, 40, 234, 213, 16, - 205, 8, 239, 150, 251, 40, 234, 213, 16, 225, 117, 239, 150, 251, 40, - 234, 213, 16, 244, 250, 239, 150, 251, 40, 234, 213, 16, 135, 206, 195, - 204, 234, 251, 40, 234, 213, 16, 50, 206, 195, 204, 234, 251, 40, 234, - 213, 16, 202, 85, 239, 150, 251, 40, 234, 213, 16, 233, 94, 239, 150, - 251, 40, 234, 213, 16, 244, 160, 154, 251, 40, 234, 213, 16, 239, 225, - 202, 84, 251, 40, 234, 213, 16, 195, 23, 251, 40, 234, 213, 16, 204, 235, - 202, 84, 251, 40, 234, 213, 16, 207, 106, 200, 62, 251, 40, 234, 213, 16, - 211, 95, 216, 19, 236, 173, 251, 40, 234, 213, 16, 211, 95, 211, 78, 251, - 40, 234, 213, 16, 135, 247, 111, 202, 84, 251, 40, 234, 213, 16, 124, - 247, 111, 202, 84, 251, 40, 234, 213, 16, 226, 7, 251, 40, 234, 213, 16, - 210, 74, 251, 40, 234, 213, 16, 214, 124, 251, 40, 234, 213, 16, 251, - 135, 200, 62, 251, 40, 234, 213, 16, 236, 175, 200, 62, 251, 40, 234, - 213, 16, 226, 8, 200, 62, 251, 40, 234, 213, 16, 214, 125, 200, 62, 251, - 40, 234, 213, 16, 251, 134, 216, 19, 245, 102, 78, 53, 251, 91, 3, 237, - 231, 195, 24, 51, 206, 163, 192, 248, 70, 248, 230, 105, 83, 222, 76, 3, - 112, 238, 253, 226, 43, 105, 241, 126, 200, 60, 105, 239, 77, 200, 60, - 105, 236, 234, 105, 241, 161, 105, 59, 47, 3, 247, 37, 83, 222, 75, 236, - 205, 105, 251, 126, 224, 154, 105, 232, 105, 105, 46, 231, 155, 249, 80, - 3, 216, 16, 46, 201, 181, 237, 235, 248, 33, 244, 250, 3, 216, 22, 51, - 200, 58, 105, 218, 200, 105, 231, 3, 105, 214, 91, 233, 14, 105, 214, 91, - 223, 98, 105, 213, 120, 105, 213, 119, 105, 239, 86, 241, 16, 16, 235, - 24, 102, 205, 183, 105, 251, 40, 234, 213, 16, 211, 94, 239, 244, 207, - 91, 224, 154, 105, 212, 21, 213, 227, 217, 76, 213, 227, 212, 16, 208, - 155, 105, 244, 221, 208, 155, 105, 50, 213, 141, 200, 33, 122, 50, 213, - 141, 236, 77, 50, 213, 141, 221, 203, 122, 53, 213, 141, 200, 33, 122, - 53, 213, 141, 236, 77, 53, 213, 141, 221, 203, 122, 50, 47, 248, 62, 200, - 33, 241, 101, 50, 47, 248, 62, 236, 77, 50, 47, 248, 62, 221, 203, 241, - 101, 53, 47, 248, 62, 200, 33, 241, 101, 53, 47, 248, 62, 236, 77, 53, - 47, 248, 62, 221, 203, 241, 101, 50, 241, 18, 248, 62, 200, 33, 122, 50, - 241, 18, 248, 62, 112, 212, 212, 50, 241, 18, 248, 62, 221, 203, 122, - 241, 18, 248, 62, 236, 77, 53, 241, 18, 248, 62, 200, 33, 122, 53, 241, - 18, 248, 62, 112, 212, 212, 53, 241, 18, 248, 62, 221, 203, 122, 226, 38, - 236, 77, 231, 155, 222, 76, 236, 77, 200, 33, 50, 214, 73, 221, 203, 53, - 241, 18, 248, 62, 208, 132, 200, 33, 53, 214, 73, 221, 203, 50, 241, 18, - 248, 62, 208, 132, 204, 115, 201, 242, 204, 115, 248, 84, 201, 243, 47, - 179, 248, 85, 47, 179, 248, 85, 47, 248, 62, 127, 201, 243, 47, 179, 44, - 16, 248, 84, 50, 83, 111, 222, 75, 53, 83, 111, 222, 75, 231, 155, 208, - 174, 222, 74, 231, 155, 208, 174, 222, 73, 231, 155, 208, 174, 222, 72, - 231, 155, 208, 174, 222, 71, 239, 204, 16, 175, 83, 26, 201, 243, 210, - 22, 239, 204, 16, 175, 83, 26, 248, 85, 210, 22, 239, 204, 16, 175, 83, - 3, 244, 249, 239, 204, 16, 175, 135, 26, 231, 155, 3, 244, 249, 239, 204, - 16, 175, 124, 26, 231, 155, 3, 244, 249, 239, 204, 16, 175, 83, 3, 201, - 180, 239, 204, 16, 175, 135, 26, 231, 155, 3, 201, 180, 239, 204, 16, - 175, 124, 26, 231, 155, 3, 201, 180, 239, 204, 16, 175, 83, 26, 197, 122, - 239, 204, 16, 175, 135, 26, 231, 155, 3, 197, 122, 239, 204, 16, 175, - 124, 26, 231, 155, 3, 197, 122, 239, 204, 16, 175, 135, 26, 231, 154, - 239, 204, 16, 175, 124, 26, 231, 154, 239, 204, 16, 175, 83, 26, 201, - 243, 222, 184, 239, 204, 16, 175, 83, 26, 248, 85, 222, 184, 47, 235, 37, - 210, 94, 105, 237, 16, 105, 83, 222, 76, 236, 77, 219, 137, 248, 47, 219, - 137, 181, 127, 206, 181, 219, 137, 206, 182, 127, 221, 240, 219, 137, - 181, 127, 99, 206, 167, 219, 137, 99, 206, 168, 127, 221, 240, 219, 137, - 99, 206, 168, 225, 125, 219, 137, 201, 161, 219, 137, 202, 249, 219, 137, - 213, 53, 237, 73, 233, 85, 234, 207, 201, 243, 213, 140, 248, 85, 213, - 140, 201, 243, 241, 18, 179, 248, 85, 241, 18, 179, 201, 243, 201, 231, - 206, 245, 179, 248, 85, 201, 231, 206, 245, 179, 59, 201, 197, 248, 215, - 210, 3, 3, 244, 249, 204, 216, 235, 80, 252, 26, 241, 15, 237, 1, 226, - 23, 239, 244, 236, 81, 105, 58, 210, 17, 52, 201, 180, 58, 222, 179, 52, - 201, 180, 58, 200, 35, 52, 201, 180, 58, 237, 234, 52, 201, 180, 58, 210, - 17, 52, 201, 181, 3, 83, 154, 58, 222, 179, 52, 201, 181, 3, 83, 154, 58, - 210, 17, 201, 181, 3, 52, 83, 154, 251, 168, 244, 206, 204, 223, 202, 77, - 244, 206, 231, 90, 3, 235, 60, 208, 217, 58, 219, 190, 222, 179, 201, - 180, 58, 219, 190, 210, 17, 201, 180, 58, 219, 190, 200, 35, 201, 180, - 58, 219, 190, 237, 234, 201, 180, 52, 83, 154, 58, 47, 36, 204, 226, 58, - 244, 250, 36, 210, 168, 212, 59, 105, 212, 59, 214, 118, 105, 212, 59, - 214, 120, 105, 212, 59, 205, 244, 105, 214, 178, 236, 68, 105, 16, 36, - 215, 146, 16, 36, 205, 3, 77, 232, 134, 16, 36, 205, 3, 77, 202, 237, 16, - 36, 236, 222, 77, 202, 237, 16, 36, 236, 222, 77, 201, 202, 16, 36, 236, - 208, 16, 36, 252, 14, 16, 36, 248, 229, 16, 36, 249, 132, 16, 36, 231, - 155, 203, 149, 16, 36, 222, 76, 235, 180, 16, 36, 83, 203, 149, 16, 36, - 235, 24, 235, 180, 16, 36, 247, 102, 210, 93, 16, 36, 206, 219, 214, 34, - 16, 36, 206, 219, 226, 86, 16, 36, 240, 60, 222, 66, 236, 143, 16, 36, - 239, 183, 241, 121, 100, 16, 36, 239, 183, 241, 121, 102, 16, 36, 239, - 183, 241, 121, 134, 16, 36, 239, 183, 241, 121, 136, 16, 36, 217, 104, - 252, 14, 16, 36, 203, 242, 226, 149, 16, 36, 236, 222, 77, 201, 203, 248, - 126, 16, 36, 247, 140, 16, 36, 236, 222, 77, 219, 189, 16, 36, 204, 139, - 16, 36, 236, 143, 16, 36, 235, 138, 207, 90, 16, 36, 233, 84, 207, 90, - 16, 36, 210, 169, 207, 90, 16, 36, 200, 50, 207, 90, 16, 36, 205, 148, - 16, 36, 239, 222, 248, 130, 105, 192, 248, 70, 16, 36, 217, 79, 16, 36, - 239, 223, 235, 24, 102, 16, 36, 204, 140, 235, 24, 102, 214, 174, 122, - 214, 174, 247, 11, 214, 174, 235, 27, 214, 174, 226, 17, 235, 27, 214, - 174, 248, 226, 248, 18, 214, 174, 248, 78, 202, 107, 214, 174, 248, 58, - 249, 85, 230, 192, 214, 174, 251, 113, 77, 245, 101, 214, 174, 240, 65, - 214, 174, 241, 4, 252, 18, 215, 144, 214, 174, 52, 249, 133, 46, 17, 100, - 46, 17, 102, 46, 17, 134, 46, 17, 136, 46, 17, 146, 46, 17, 167, 46, 17, - 178, 46, 17, 171, 46, 17, 182, 46, 31, 203, 23, 46, 31, 236, 252, 46, 31, - 200, 239, 46, 31, 202, 179, 46, 31, 235, 1, 46, 31, 235, 149, 46, 31, - 206, 23, 46, 31, 207, 68, 46, 31, 237, 28, 46, 31, 216, 176, 46, 31, 200, - 234, 119, 17, 100, 119, 17, 102, 119, 17, 134, 119, 17, 136, 119, 17, - 146, 119, 17, 167, 119, 17, 178, 119, 17, 171, 119, 17, 182, 119, 31, - 203, 23, 119, 31, 236, 252, 119, 31, 200, 239, 119, 31, 202, 179, 119, - 31, 235, 1, 119, 31, 235, 149, 119, 31, 206, 23, 119, 31, 207, 68, 119, - 31, 237, 28, 119, 31, 216, 176, 119, 31, 200, 234, 17, 97, 234, 217, 204, - 226, 17, 99, 234, 217, 204, 226, 17, 115, 234, 217, 204, 226, 17, 235, 7, - 234, 217, 204, 226, 17, 235, 101, 234, 217, 204, 226, 17, 206, 29, 234, - 217, 204, 226, 17, 207, 71, 234, 217, 204, 226, 17, 237, 31, 234, 217, - 204, 226, 17, 216, 179, 234, 217, 204, 226, 31, 203, 24, 234, 217, 204, - 226, 31, 236, 253, 234, 217, 204, 226, 31, 200, 240, 234, 217, 204, 226, - 31, 202, 180, 234, 217, 204, 226, 31, 235, 2, 234, 217, 204, 226, 31, - 235, 150, 234, 217, 204, 226, 31, 206, 24, 234, 217, 204, 226, 31, 207, - 69, 234, 217, 204, 226, 31, 237, 29, 234, 217, 204, 226, 31, 216, 177, - 234, 217, 204, 226, 31, 200, 235, 234, 217, 204, 226, 119, 8, 4, 1, 63, - 119, 8, 4, 1, 250, 112, 119, 8, 4, 1, 247, 207, 119, 8, 4, 1, 240, 231, - 119, 8, 4, 1, 69, 119, 8, 4, 1, 236, 49, 119, 8, 4, 1, 234, 190, 119, 8, - 4, 1, 233, 15, 119, 8, 4, 1, 68, 119, 8, 4, 1, 225, 217, 119, 8, 4, 1, - 225, 80, 119, 8, 4, 1, 159, 119, 8, 4, 1, 221, 136, 119, 8, 4, 1, 218, - 55, 119, 8, 4, 1, 72, 119, 8, 4, 1, 214, 3, 119, 8, 4, 1, 211, 167, 119, - 8, 4, 1, 144, 119, 8, 4, 1, 209, 80, 119, 8, 4, 1, 203, 216, 119, 8, 4, - 1, 66, 119, 8, 4, 1, 199, 230, 119, 8, 4, 1, 197, 199, 119, 8, 4, 1, 196, - 222, 119, 8, 4, 1, 196, 148, 119, 8, 4, 1, 195, 158, 46, 8, 6, 1, 63, 46, - 8, 6, 1, 250, 112, 46, 8, 6, 1, 247, 207, 46, 8, 6, 1, 240, 231, 46, 8, - 6, 1, 69, 46, 8, 6, 1, 236, 49, 46, 8, 6, 1, 234, 190, 46, 8, 6, 1, 233, - 15, 46, 8, 6, 1, 68, 46, 8, 6, 1, 225, 217, 46, 8, 6, 1, 225, 80, 46, 8, - 6, 1, 159, 46, 8, 6, 1, 221, 136, 46, 8, 6, 1, 218, 55, 46, 8, 6, 1, 72, - 46, 8, 6, 1, 214, 3, 46, 8, 6, 1, 211, 167, 46, 8, 6, 1, 144, 46, 8, 6, - 1, 209, 80, 46, 8, 6, 1, 203, 216, 46, 8, 6, 1, 66, 46, 8, 6, 1, 199, - 230, 46, 8, 6, 1, 197, 199, 46, 8, 6, 1, 196, 222, 46, 8, 6, 1, 196, 148, - 46, 8, 6, 1, 195, 158, 46, 8, 4, 1, 63, 46, 8, 4, 1, 250, 112, 46, 8, 4, - 1, 247, 207, 46, 8, 4, 1, 240, 231, 46, 8, 4, 1, 69, 46, 8, 4, 1, 236, - 49, 46, 8, 4, 1, 234, 190, 46, 8, 4, 1, 233, 15, 46, 8, 4, 1, 68, 46, 8, - 4, 1, 225, 217, 46, 8, 4, 1, 225, 80, 46, 8, 4, 1, 159, 46, 8, 4, 1, 221, - 136, 46, 8, 4, 1, 218, 55, 46, 8, 4, 1, 72, 46, 8, 4, 1, 214, 3, 46, 8, - 4, 1, 211, 167, 46, 8, 4, 1, 144, 46, 8, 4, 1, 209, 80, 46, 8, 4, 1, 203, - 216, 46, 8, 4, 1, 66, 46, 8, 4, 1, 199, 230, 46, 8, 4, 1, 197, 199, 46, - 8, 4, 1, 196, 222, 46, 8, 4, 1, 196, 148, 46, 8, 4, 1, 195, 158, 46, 17, - 195, 79, 217, 104, 46, 31, 236, 252, 217, 104, 46, 31, 200, 239, 217, - 104, 46, 31, 202, 179, 217, 104, 46, 31, 235, 1, 217, 104, 46, 31, 235, - 149, 217, 104, 46, 31, 206, 23, 217, 104, 46, 31, 207, 68, 217, 104, 46, - 31, 237, 28, 217, 104, 46, 31, 216, 176, 217, 104, 46, 31, 200, 234, 52, - 46, 17, 100, 52, 46, 17, 102, 52, 46, 17, 134, 52, 46, 17, 136, 52, 46, - 17, 146, 52, 46, 17, 167, 52, 46, 17, 178, 52, 46, 17, 171, 52, 46, 17, - 182, 52, 46, 31, 203, 23, 217, 104, 46, 17, 195, 79, 111, 129, 175, 231, - 154, 111, 129, 85, 231, 154, 111, 129, 175, 199, 100, 111, 129, 85, 199, - 100, 111, 129, 175, 201, 165, 240, 66, 231, 154, 111, 129, 85, 201, 165, - 240, 66, 231, 154, 111, 129, 175, 201, 165, 240, 66, 199, 100, 111, 129, - 85, 201, 165, 240, 66, 199, 100, 111, 129, 175, 211, 90, 240, 66, 231, - 154, 111, 129, 85, 211, 90, 240, 66, 231, 154, 111, 129, 175, 211, 90, - 240, 66, 199, 100, 111, 129, 85, 211, 90, 240, 66, 199, 100, 111, 129, - 175, 135, 26, 210, 22, 111, 129, 135, 175, 26, 53, 232, 120, 111, 129, - 135, 85, 26, 53, 222, 95, 111, 129, 85, 135, 26, 210, 22, 111, 129, 175, - 135, 26, 222, 184, 111, 129, 135, 175, 26, 50, 232, 120, 111, 129, 135, - 85, 26, 50, 222, 95, 111, 129, 85, 135, 26, 222, 184, 111, 129, 175, 124, - 26, 210, 22, 111, 129, 124, 175, 26, 53, 232, 120, 111, 129, 124, 85, 26, - 53, 222, 95, 111, 129, 85, 124, 26, 210, 22, 111, 129, 175, 124, 26, 222, - 184, 111, 129, 124, 175, 26, 50, 232, 120, 111, 129, 124, 85, 26, 50, - 222, 95, 111, 129, 85, 124, 26, 222, 184, 111, 129, 175, 83, 26, 210, 22, - 111, 129, 83, 175, 26, 53, 232, 120, 111, 129, 124, 85, 26, 53, 135, 222, - 95, 111, 129, 135, 85, 26, 53, 124, 222, 95, 111, 129, 83, 85, 26, 53, - 222, 95, 111, 129, 135, 175, 26, 53, 124, 232, 120, 111, 129, 124, 175, - 26, 53, 135, 232, 120, 111, 129, 85, 83, 26, 210, 22, 111, 129, 175, 83, - 26, 222, 184, 111, 129, 83, 175, 26, 50, 232, 120, 111, 129, 124, 85, 26, - 50, 135, 222, 95, 111, 129, 135, 85, 26, 50, 124, 222, 95, 111, 129, 83, - 85, 26, 50, 222, 95, 111, 129, 135, 175, 26, 50, 124, 232, 120, 111, 129, - 124, 175, 26, 50, 135, 232, 120, 111, 129, 85, 83, 26, 222, 184, 111, - 129, 175, 135, 26, 231, 154, 111, 129, 50, 85, 26, 53, 135, 222, 95, 111, - 129, 53, 85, 26, 50, 135, 222, 95, 111, 129, 135, 175, 26, 231, 155, 232, - 120, 111, 129, 135, 85, 26, 231, 155, 222, 95, 111, 129, 53, 175, 26, 50, - 135, 232, 120, 111, 129, 50, 175, 26, 53, 135, 232, 120, 111, 129, 85, - 135, 26, 231, 154, 111, 129, 175, 124, 26, 231, 154, 111, 129, 50, 85, - 26, 53, 124, 222, 95, 111, 129, 53, 85, 26, 50, 124, 222, 95, 111, 129, - 124, 175, 26, 231, 155, 232, 120, 111, 129, 124, 85, 26, 231, 155, 222, - 95, 111, 129, 53, 175, 26, 50, 124, 232, 120, 111, 129, 50, 175, 26, 53, - 124, 232, 120, 111, 129, 85, 124, 26, 231, 154, 111, 129, 175, 83, 26, - 231, 154, 111, 129, 50, 85, 26, 53, 83, 222, 95, 111, 129, 53, 85, 26, - 50, 83, 222, 95, 111, 129, 83, 175, 26, 231, 155, 232, 120, 111, 129, - 124, 85, 26, 135, 231, 155, 222, 95, 111, 129, 135, 85, 26, 124, 231, - 155, 222, 95, 111, 129, 83, 85, 26, 231, 155, 222, 95, 111, 129, 50, 124, - 85, 26, 53, 135, 222, 95, 111, 129, 53, 124, 85, 26, 50, 135, 222, 95, - 111, 129, 50, 135, 85, 26, 53, 124, 222, 95, 111, 129, 53, 135, 85, 26, - 50, 124, 222, 95, 111, 129, 135, 175, 26, 124, 231, 155, 232, 120, 111, - 129, 124, 175, 26, 135, 231, 155, 232, 120, 111, 129, 53, 175, 26, 50, - 83, 232, 120, 111, 129, 50, 175, 26, 53, 83, 232, 120, 111, 129, 85, 83, - 26, 231, 154, 111, 129, 175, 52, 240, 66, 231, 154, 111, 129, 85, 52, - 240, 66, 231, 154, 111, 129, 175, 52, 240, 66, 199, 100, 111, 129, 85, - 52, 240, 66, 199, 100, 111, 129, 52, 231, 154, 111, 129, 52, 199, 100, - 111, 129, 135, 206, 62, 26, 53, 237, 245, 111, 129, 135, 52, 26, 53, 206, - 61, 111, 129, 52, 135, 26, 210, 22, 111, 129, 135, 206, 62, 26, 50, 237, - 245, 111, 129, 135, 52, 26, 50, 206, 61, 111, 129, 52, 135, 26, 222, 184, - 111, 129, 124, 206, 62, 26, 53, 237, 245, 111, 129, 124, 52, 26, 53, 206, - 61, 111, 129, 52, 124, 26, 210, 22, 111, 129, 124, 206, 62, 26, 50, 237, - 245, 111, 129, 124, 52, 26, 50, 206, 61, 111, 129, 52, 124, 26, 222, 184, - 111, 129, 83, 206, 62, 26, 53, 237, 245, 111, 129, 83, 52, 26, 53, 206, - 61, 111, 129, 52, 83, 26, 210, 22, 111, 129, 83, 206, 62, 26, 50, 237, - 245, 111, 129, 83, 52, 26, 50, 206, 61, 111, 129, 52, 83, 26, 222, 184, - 111, 129, 135, 206, 62, 26, 231, 155, 237, 245, 111, 129, 135, 52, 26, - 231, 155, 206, 61, 111, 129, 52, 135, 26, 231, 154, 111, 129, 124, 206, - 62, 26, 231, 155, 237, 245, 111, 129, 124, 52, 26, 231, 155, 206, 61, - 111, 129, 52, 124, 26, 231, 154, 111, 129, 83, 206, 62, 26, 231, 155, - 237, 245, 111, 129, 83, 52, 26, 231, 155, 206, 61, 111, 129, 52, 83, 26, - 231, 154, 111, 129, 175, 250, 254, 135, 26, 210, 22, 111, 129, 175, 250, - 254, 135, 26, 222, 184, 111, 129, 175, 250, 254, 124, 26, 222, 184, 111, - 129, 175, 250, 254, 124, 26, 210, 22, 111, 129, 175, 239, 147, 200, 33, - 53, 202, 30, 221, 203, 222, 184, 111, 129, 175, 239, 147, 200, 33, 50, - 202, 30, 221, 203, 210, 22, 111, 129, 175, 239, 147, 241, 61, 111, 129, - 175, 222, 184, 111, 129, 175, 200, 36, 111, 129, 175, 210, 22, 111, 129, - 175, 237, 235, 111, 129, 85, 222, 184, 111, 129, 85, 200, 36, 111, 129, - 85, 210, 22, 111, 129, 85, 237, 235, 111, 129, 175, 50, 26, 85, 210, 22, - 111, 129, 175, 124, 26, 85, 237, 235, 111, 129, 85, 50, 26, 175, 210, 22, - 111, 129, 85, 124, 26, 175, 237, 235, 200, 33, 157, 248, 126, 221, 203, - 97, 237, 27, 248, 126, 221, 203, 97, 211, 88, 248, 126, 221, 203, 115, - 237, 25, 248, 126, 221, 203, 157, 248, 126, 221, 203, 235, 101, 237, 25, - 248, 126, 221, 203, 115, 211, 86, 248, 126, 221, 203, 207, 71, 237, 25, - 248, 126, 234, 217, 248, 126, 50, 207, 71, 237, 25, 248, 126, 50, 115, - 211, 86, 248, 126, 50, 235, 101, 237, 25, 248, 126, 50, 157, 248, 126, - 50, 115, 237, 25, 248, 126, 50, 97, 211, 88, 248, 126, 50, 97, 237, 27, - 248, 126, 53, 157, 248, 126, 175, 207, 39, 219, 190, 207, 39, 240, 71, - 207, 39, 200, 33, 97, 237, 27, 248, 126, 53, 97, 237, 27, 248, 126, 211, - 92, 221, 203, 222, 184, 211, 92, 221, 203, 210, 22, 211, 92, 200, 33, - 222, 184, 211, 92, 200, 33, 50, 26, 221, 203, 50, 26, 221, 203, 210, 22, - 211, 92, 200, 33, 50, 26, 221, 203, 210, 22, 211, 92, 200, 33, 50, 26, - 200, 33, 53, 26, 221, 203, 222, 184, 211, 92, 200, 33, 50, 26, 200, 33, - 53, 26, 221, 203, 210, 22, 211, 92, 200, 33, 210, 22, 211, 92, 200, 33, - 53, 26, 221, 203, 222, 184, 211, 92, 200, 33, 53, 26, 221, 203, 50, 26, - 221, 203, 210, 22, 58, 205, 94, 59, 205, 94, 59, 47, 3, 209, 185, 241, - 100, 59, 47, 241, 132, 58, 4, 205, 94, 47, 3, 231, 155, 235, 136, 47, 3, - 83, 235, 136, 47, 3, 214, 55, 241, 56, 235, 136, 47, 3, 200, 33, 50, 202, - 30, 221, 203, 53, 235, 136, 47, 3, 200, 33, 53, 202, 30, 221, 203, 50, - 235, 136, 47, 3, 239, 147, 241, 56, 235, 136, 58, 4, 205, 94, 59, 4, 205, - 94, 58, 210, 163, 59, 210, 163, 58, 83, 210, 163, 59, 83, 210, 163, 58, - 213, 144, 59, 213, 144, 58, 200, 35, 201, 180, 59, 200, 35, 201, 180, 58, - 200, 35, 4, 201, 180, 59, 200, 35, 4, 201, 180, 58, 210, 17, 201, 180, - 59, 210, 17, 201, 180, 58, 210, 17, 4, 201, 180, 59, 210, 17, 4, 201, - 180, 58, 210, 17, 212, 108, 59, 210, 17, 212, 108, 58, 237, 234, 201, - 180, 59, 237, 234, 201, 180, 58, 237, 234, 4, 201, 180, 59, 237, 234, 4, - 201, 180, 58, 222, 179, 201, 180, 59, 222, 179, 201, 180, 58, 222, 179, - 4, 201, 180, 59, 222, 179, 4, 201, 180, 58, 222, 179, 212, 108, 59, 222, - 179, 212, 108, 58, 239, 140, 59, 239, 140, 59, 239, 141, 241, 132, 58, 4, - 239, 140, 235, 110, 221, 198, 59, 244, 249, 237, 250, 244, 249, 244, 250, - 3, 83, 235, 136, 248, 1, 58, 244, 249, 244, 250, 3, 50, 157, 248, 136, - 244, 250, 3, 53, 157, 248, 136, 244, 250, 3, 221, 203, 157, 248, 136, - 244, 250, 3, 200, 33, 157, 248, 136, 244, 250, 3, 200, 33, 53, 211, 92, - 248, 136, 244, 250, 3, 251, 147, 247, 232, 200, 33, 50, 211, 92, 248, - 136, 50, 157, 58, 244, 249, 53, 157, 58, 244, 249, 226, 19, 248, 5, 226, - 19, 59, 244, 249, 200, 33, 157, 226, 19, 59, 244, 249, 221, 203, 157, - 226, 19, 59, 244, 249, 200, 33, 50, 211, 92, 244, 243, 250, 253, 200, 33, - 53, 211, 92, 244, 243, 250, 253, 221, 203, 53, 211, 92, 244, 243, 250, - 253, 221, 203, 50, 211, 92, 244, 243, 250, 253, 200, 33, 157, 244, 249, - 221, 203, 157, 244, 249, 58, 221, 203, 53, 201, 180, 58, 221, 203, 50, - 201, 180, 58, 200, 33, 50, 201, 180, 58, 200, 33, 53, 201, 180, 59, 248, - 5, 47, 3, 50, 157, 248, 136, 47, 3, 53, 157, 248, 136, 47, 3, 200, 33, - 50, 239, 147, 157, 248, 136, 47, 3, 221, 203, 53, 239, 147, 157, 248, - 136, 59, 47, 3, 83, 248, 150, 222, 75, 59, 200, 35, 201, 181, 3, 238, - 253, 200, 35, 201, 181, 3, 50, 157, 248, 136, 200, 35, 201, 181, 3, 53, - 157, 248, 136, 222, 228, 244, 249, 59, 47, 3, 200, 33, 50, 211, 91, 59, - 47, 3, 221, 203, 50, 211, 91, 59, 47, 3, 221, 203, 53, 211, 91, 59, 47, - 3, 200, 33, 53, 211, 91, 59, 244, 250, 3, 200, 33, 50, 211, 91, 59, 244, - 250, 3, 221, 203, 50, 211, 91, 59, 244, 250, 3, 221, 203, 53, 211, 91, - 59, 244, 250, 3, 200, 33, 53, 211, 91, 200, 33, 50, 201, 180, 200, 33, - 53, 201, 180, 221, 203, 50, 201, 180, 59, 219, 190, 205, 94, 58, 219, - 190, 205, 94, 59, 219, 190, 4, 205, 94, 58, 219, 190, 4, 205, 94, 221, - 203, 53, 201, 180, 58, 204, 112, 3, 210, 188, 244, 194, 200, 76, 205, - 202, 244, 162, 58, 205, 7, 59, 205, 7, 222, 92, 202, 137, 204, 111, 250, - 198, 216, 42, 239, 194, 216, 42, 241, 141, 214, 78, 58, 203, 33, 59, 203, - 33, 249, 99, 248, 70, 249, 99, 111, 3, 245, 101, 249, 99, 111, 3, 196, - 222, 208, 230, 200, 77, 3, 210, 218, 237, 208, 231, 96, 248, 201, 59, - 206, 191, 212, 212, 58, 206, 191, 212, 212, 207, 26, 210, 89, 209, 194, - 235, 66, 232, 127, 248, 5, 58, 50, 212, 107, 226, 72, 58, 53, 212, 107, - 226, 72, 59, 50, 212, 107, 226, 72, 59, 124, 212, 107, 226, 72, 59, 53, - 212, 107, 226, 72, 59, 135, 212, 107, 226, 72, 205, 255, 26, 241, 60, - 247, 86, 55, 210, 230, 55, 248, 158, 55, 247, 165, 251, 79, 214, 56, 241, - 61, 245, 76, 210, 74, 241, 62, 77, 221, 220, 241, 62, 77, 225, 182, 205, - 8, 26, 241, 71, 235, 204, 105, 251, 254, 207, 29, 232, 217, 26, 206, 103, - 213, 91, 105, 196, 13, 196, 95, 201, 170, 36, 232, 122, 201, 170, 36, - 223, 1, 201, 170, 36, 235, 118, 201, 170, 36, 202, 138, 201, 170, 36, - 197, 50, 201, 170, 36, 197, 127, 201, 170, 36, 218, 169, 201, 170, 36, - 237, 72, 197, 78, 77, 239, 168, 59, 234, 229, 235, 233, 59, 205, 218, - 235, 233, 58, 205, 218, 235, 233, 59, 204, 112, 3, 210, 188, 235, 113, - 211, 88, 218, 189, 222, 221, 211, 88, 218, 189, 219, 158, 235, 172, 55, - 237, 72, 220, 67, 55, 225, 95, 208, 192, 200, 16, 217, 94, 212, 121, 250, - 239, 203, 87, 234, 35, 247, 138, 222, 146, 199, 5, 222, 106, 208, 157, - 208, 255, 247, 120, 251, 15, 212, 160, 59, 245, 83, 224, 73, 59, 245, 83, - 211, 80, 59, 245, 83, 209, 203, 59, 245, 83, 248, 148, 59, 245, 83, 224, - 19, 59, 245, 83, 213, 103, 58, 245, 83, 224, 73, 58, 245, 83, 211, 80, - 58, 245, 83, 209, 203, 58, 245, 83, 248, 148, 58, 245, 83, 224, 19, 58, - 245, 83, 213, 103, 58, 205, 146, 204, 124, 59, 232, 127, 204, 124, 59, - 239, 141, 204, 124, 58, 244, 191, 204, 124, 59, 205, 146, 204, 124, 58, - 232, 127, 204, 124, 58, 239, 141, 204, 124, 59, 244, 191, 204, 124, 231, - 96, 205, 99, 211, 88, 216, 13, 237, 27, 216, 13, 249, 5, 237, 27, 216, 8, - 249, 5, 206, 22, 216, 8, 218, 89, 235, 83, 55, 218, 89, 217, 203, 55, - 218, 89, 207, 13, 55, 197, 89, 203, 236, 241, 61, 237, 69, 203, 236, 241, - 61, 200, 46, 210, 159, 105, 210, 159, 16, 36, 200, 200, 212, 140, 210, - 159, 16, 36, 200, 198, 212, 140, 210, 159, 16, 36, 200, 197, 212, 140, - 210, 159, 16, 36, 200, 195, 212, 140, 210, 159, 16, 36, 200, 193, 212, - 140, 210, 159, 16, 36, 200, 191, 212, 140, 210, 159, 16, 36, 200, 189, - 212, 140, 210, 159, 16, 36, 234, 32, 220, 2, 58, 200, 46, 210, 159, 105, - 210, 160, 213, 162, 105, 213, 131, 213, 162, 105, 213, 37, 213, 162, 55, - 197, 76, 105, 239, 133, 235, 232, 239, 133, 235, 231, 239, 133, 235, 230, - 239, 133, 235, 229, 239, 133, 235, 228, 239, 133, 235, 227, 59, 244, 250, - 3, 76, 210, 22, 59, 244, 250, 3, 99, 238, 250, 58, 244, 250, 3, 59, 76, - 210, 22, 58, 244, 250, 3, 99, 59, 238, 250, 218, 205, 36, 196, 95, 218, - 205, 36, 196, 12, 239, 114, 36, 233, 95, 196, 95, 239, 114, 36, 222, 138, - 196, 12, 239, 114, 36, 222, 138, 196, 95, 239, 114, 36, 233, 95, 196, 12, - 59, 235, 93, 58, 235, 93, 232, 217, 26, 212, 216, 251, 102, 241, 59, 204, - 47, 205, 17, 77, 251, 228, 208, 175, 251, 163, 235, 62, 234, 45, 205, 17, - 77, 232, 94, 250, 158, 105, 235, 78, 214, 30, 59, 205, 7, 115, 222, 70, - 241, 118, 210, 22, 115, 222, 70, 241, 118, 222, 184, 197, 138, 55, 130, - 198, 237, 55, 237, 240, 235, 172, 55, 237, 240, 220, 67, 55, 226, 29, - 235, 172, 26, 220, 67, 55, 220, 67, 26, 235, 172, 55, 220, 67, 3, 204, - 196, 55, 220, 67, 3, 204, 196, 26, 220, 67, 26, 235, 172, 55, 83, 220, - 67, 3, 204, 196, 55, 231, 155, 220, 67, 3, 204, 196, 55, 219, 190, 59, - 244, 249, 219, 190, 58, 244, 249, 219, 190, 4, 59, 244, 249, 220, 21, - 105, 239, 52, 105, 200, 43, 213, 130, 105, 244, 173, 234, 212, 200, 12, - 217, 86, 247, 22, 213, 209, 225, 101, 199, 45, 245, 56, 58, 218, 190, - 222, 89, 207, 61, 207, 102, 211, 70, 207, 79, 205, 190, 249, 103, 249, - 65, 103, 224, 153, 59, 237, 220, 220, 62, 59, 237, 220, 224, 73, 58, 237, - 220, 220, 62, 58, 237, 220, 224, 73, 205, 203, 197, 37, 205, 206, 204, - 112, 248, 236, 244, 194, 210, 217, 58, 205, 202, 202, 139, 244, 195, 26, - 210, 217, 163, 59, 206, 191, 212, 212, 163, 58, 206, 191, 212, 212, 59, - 239, 141, 226, 87, 205, 94, 241, 55, 222, 235, 239, 81, 247, 116, 214, - 81, 212, 216, 247, 117, 205, 237, 232, 104, 3, 59, 241, 61, 46, 241, 55, - 222, 235, 247, 12, 216, 51, 236, 199, 251, 131, 214, 111, 50, 197, 113, - 201, 210, 58, 200, 212, 50, 197, 113, 201, 210, 59, 200, 212, 50, 197, - 113, 201, 210, 58, 50, 222, 236, 219, 157, 59, 50, 222, 236, 219, 157, - 237, 215, 205, 228, 55, 85, 59, 237, 234, 201, 180, 50, 244, 203, 236, - 199, 103, 208, 230, 235, 213, 239, 147, 226, 87, 59, 244, 250, 226, 87, - 58, 205, 94, 58, 201, 144, 210, 100, 50, 236, 198, 210, 100, 50, 236, - 197, 250, 173, 16, 36, 200, 16, 85, 244, 250, 3, 204, 196, 26, 99, 238, - 251, 57, 213, 54, 210, 19, 226, 31, 213, 54, 222, 181, 226, 31, 213, 54, - 226, 17, 213, 54, 58, 241, 62, 214, 120, 206, 220, 206, 208, 206, 156, - 245, 22, 247, 94, 232, 32, 206, 30, 234, 46, 197, 37, 231, 69, 234, 46, - 3, 232, 186, 220, 44, 16, 36, 222, 94, 218, 169, 200, 77, 214, 120, 233, - 85, 235, 8, 235, 94, 226, 87, 231, 175, 235, 162, 208, 250, 47, 235, 7, - 241, 100, 206, 2, 230, 202, 206, 6, 213, 29, 3, 249, 103, 203, 15, 225, - 202, 249, 85, 105, 232, 131, 233, 97, 105, 234, 220, 211, 215, 241, 28, - 214, 120, 58, 205, 94, 59, 235, 94, 3, 231, 155, 112, 58, 204, 197, 58, - 209, 4, 208, 161, 200, 33, 248, 131, 208, 161, 58, 208, 161, 221, 203, - 248, 131, 208, 161, 59, 208, 161, 59, 85, 245, 102, 78, 203, 34, 222, 4, - 55, 203, 104, 237, 214, 251, 187, 236, 194, 210, 215, 235, 106, 210, 215, - 232, 209, 199, 32, 232, 209, 196, 246, 232, 209, 221, 203, 53, 213, 64, - 213, 64, 200, 33, 53, 213, 64, 59, 216, 212, 58, 216, 212, 245, 102, 78, - 85, 245, 102, 78, 218, 118, 196, 222, 85, 218, 118, 196, 222, 249, 99, - 196, 222, 85, 249, 99, 196, 222, 214, 30, 32, 241, 61, 85, 32, 241, 61, - 192, 247, 37, 241, 61, 85, 192, 247, 37, 241, 61, 8, 241, 61, 207, 37, - 59, 8, 241, 61, 214, 30, 8, 241, 61, 220, 64, 241, 61, 205, 8, 77, 240, - 58, 235, 7, 203, 53, 250, 179, 235, 7, 249, 100, 250, 179, 85, 235, 7, - 249, 100, 250, 179, 235, 7, 244, 189, 250, 179, 58, 235, 7, 212, 109, - 205, 7, 59, 235, 7, 212, 109, 205, 7, 205, 141, 204, 206, 214, 30, 59, - 205, 7, 46, 59, 205, 7, 192, 247, 37, 58, 205, 7, 58, 247, 37, 59, 205, - 7, 214, 30, 58, 205, 7, 85, 214, 30, 58, 205, 7, 212, 170, 205, 7, 207, - 37, 59, 205, 7, 85, 250, 179, 192, 247, 37, 250, 179, 237, 31, 205, 110, - 250, 179, 237, 31, 212, 109, 58, 205, 7, 237, 31, 212, 109, 212, 170, - 205, 7, 206, 29, 212, 109, 58, 205, 7, 237, 31, 212, 109, 210, 161, 58, - 205, 7, 85, 237, 31, 212, 109, 210, 161, 58, 205, 7, 200, 240, 212, 109, - 58, 205, 7, 206, 24, 212, 109, 250, 179, 203, 53, 250, 179, 192, 247, 37, - 203, 53, 250, 179, 85, 203, 53, 250, 179, 206, 29, 213, 17, 58, 26, 59, - 235, 65, 58, 235, 65, 59, 235, 65, 237, 31, 213, 17, 214, 30, 58, 235, - 65, 46, 192, 247, 37, 237, 31, 212, 109, 205, 7, 85, 203, 53, 212, 170, - 250, 179, 205, 204, 202, 101, 201, 173, 205, 204, 85, 245, 79, 205, 204, - 205, 143, 85, 205, 143, 249, 100, 250, 179, 237, 31, 203, 53, 211, 250, - 250, 179, 85, 237, 31, 203, 53, 211, 250, 250, 179, 241, 62, 78, 207, 37, - 59, 244, 249, 217, 104, 103, 241, 62, 78, 221, 203, 53, 237, 210, 59, - 205, 94, 200, 33, 53, 237, 210, 59, 205, 94, 221, 203, 53, 207, 37, 59, - 205, 94, 200, 33, 53, 207, 37, 59, 205, 94, 58, 211, 79, 117, 214, 59, - 59, 211, 79, 117, 214, 59, 59, 236, 90, 117, 214, 59, 58, 239, 141, 219, - 16, 59, 196, 222, 85, 236, 90, 117, 105, 175, 83, 154, 219, 190, 83, 154, - 85, 83, 154, 85, 206, 62, 163, 244, 160, 211, 62, 117, 214, 59, 85, 206, - 62, 244, 160, 211, 62, 117, 214, 59, 85, 52, 163, 244, 160, 211, 62, 117, - 214, 59, 85, 52, 244, 160, 211, 62, 117, 214, 59, 85, 126, 206, 62, 244, - 160, 211, 62, 117, 214, 59, 85, 126, 52, 244, 160, 211, 62, 117, 214, 59, - 241, 10, 204, 244, 213, 154, 2, 214, 59, 85, 236, 90, 117, 214, 59, 85, - 232, 127, 236, 90, 117, 214, 59, 85, 58, 232, 126, 209, 194, 85, 58, 232, - 127, 248, 5, 235, 66, 232, 126, 209, 194, 235, 66, 232, 127, 248, 5, 219, - 190, 50, 213, 141, 214, 59, 219, 190, 53, 213, 141, 214, 59, 219, 190, - 235, 79, 50, 213, 141, 214, 59, 219, 190, 235, 79, 53, 213, 141, 214, 59, - 219, 190, 222, 179, 251, 91, 248, 62, 214, 59, 219, 190, 210, 17, 251, - 91, 248, 62, 214, 59, 85, 222, 179, 251, 91, 211, 62, 117, 214, 59, 85, - 210, 17, 251, 91, 211, 62, 117, 214, 59, 85, 222, 179, 251, 91, 248, 62, - 214, 59, 85, 210, 17, 251, 91, 248, 62, 214, 59, 175, 50, 201, 231, 206, - 245, 248, 62, 214, 59, 175, 53, 201, 231, 206, 245, 248, 62, 214, 59, - 219, 190, 50, 241, 18, 248, 62, 214, 59, 219, 190, 53, 241, 18, 248, 62, - 214, 59, 239, 93, 217, 104, 46, 17, 100, 239, 93, 217, 104, 46, 17, 102, - 239, 93, 217, 104, 46, 17, 134, 239, 93, 217, 104, 46, 17, 136, 239, 93, - 217, 104, 46, 17, 146, 239, 93, 217, 104, 46, 17, 167, 239, 93, 217, 104, - 46, 17, 178, 239, 93, 217, 104, 46, 17, 171, 239, 93, 217, 104, 46, 17, - 182, 239, 93, 217, 104, 46, 31, 203, 23, 239, 93, 46, 45, 17, 100, 239, - 93, 46, 45, 17, 102, 239, 93, 46, 45, 17, 134, 239, 93, 46, 45, 17, 136, - 239, 93, 46, 45, 17, 146, 239, 93, 46, 45, 17, 167, 239, 93, 46, 45, 17, - 178, 239, 93, 46, 45, 17, 171, 239, 93, 46, 45, 17, 182, 239, 93, 46, 45, - 31, 203, 23, 239, 93, 217, 104, 46, 45, 17, 100, 239, 93, 217, 104, 46, - 45, 17, 102, 239, 93, 217, 104, 46, 45, 17, 134, 239, 93, 217, 104, 46, - 45, 17, 136, 239, 93, 217, 104, 46, 45, 17, 146, 239, 93, 217, 104, 46, - 45, 17, 167, 239, 93, 217, 104, 46, 45, 17, 178, 239, 93, 217, 104, 46, - 45, 17, 171, 239, 93, 217, 104, 46, 45, 17, 182, 239, 93, 217, 104, 46, - 45, 31, 203, 23, 85, 197, 61, 91, 51, 85, 98, 55, 85, 219, 16, 55, 85, - 239, 54, 55, 85, 205, 159, 237, 69, 51, 85, 91, 51, 85, 173, 237, 69, 51, - 237, 225, 212, 111, 91, 51, 85, 209, 186, 91, 51, 201, 179, 91, 51, 85, - 201, 179, 91, 51, 240, 64, 201, 179, 91, 51, 85, 240, 64, 201, 179, 91, - 51, 58, 91, 51, 202, 154, 201, 241, 91, 250, 217, 202, 154, 248, 83, 91, - 250, 217, 58, 91, 250, 217, 85, 58, 241, 10, 237, 231, 26, 91, 51, 85, - 58, 241, 10, 200, 24, 26, 91, 51, 205, 91, 58, 91, 51, 85, 241, 154, 58, - 91, 51, 210, 16, 59, 91, 51, 222, 178, 59, 91, 51, 249, 137, 207, 37, 59, - 91, 51, 234, 232, 207, 37, 59, 91, 51, 85, 221, 203, 210, 15, 59, 91, 51, - 85, 200, 33, 210, 15, 59, 91, 51, 216, 15, 221, 203, 210, 15, 59, 91, 51, - 241, 18, 221, 225, 216, 15, 200, 33, 210, 15, 59, 91, 51, 46, 85, 59, 91, - 51, 197, 72, 91, 51, 248, 135, 205, 159, 237, 69, 51, 248, 135, 91, 51, - 248, 135, 173, 237, 69, 51, 85, 248, 135, 205, 159, 237, 69, 51, 85, 248, - 135, 91, 51, 85, 248, 135, 173, 237, 69, 51, 203, 55, 91, 51, 85, 203, - 54, 91, 51, 197, 99, 91, 51, 85, 197, 99, 91, 51, 214, 87, 91, 51, 52, - 241, 18, 221, 225, 115, 239, 103, 251, 90, 59, 201, 181, 241, 132, 4, 59, - 201, 180, 213, 32, 192, 204, 141, 192, 204, 93, 50, 209, 79, 249, 123, - 239, 218, 53, 209, 79, 249, 123, 239, 218, 214, 73, 3, 76, 226, 41, 210, - 90, 205, 178, 212, 34, 204, 141, 204, 94, 212, 34, 205, 177, 83, 249, 80, - 3, 231, 155, 106, 13, 209, 250, 239, 146, 181, 239, 53, 13, 235, 213, - 239, 146, 103, 221, 249, 251, 100, 103, 221, 249, 214, 72, 59, 239, 141, - 3, 247, 35, 238, 253, 26, 3, 238, 253, 237, 0, 77, 214, 85, 200, 23, 221, - 203, 53, 241, 102, 3, 238, 253, 200, 33, 50, 241, 102, 3, 238, 253, 50, - 214, 32, 225, 127, 53, 214, 32, 225, 127, 234, 217, 214, 32, 225, 127, - 222, 228, 124, 203, 147, 222, 228, 135, 203, 147, 50, 26, 53, 52, 201, 3, - 50, 26, 53, 203, 147, 50, 218, 122, 181, 53, 203, 147, 181, 50, 203, 147, - 124, 203, 148, 3, 244, 250, 57, 221, 199, 239, 60, 247, 219, 231, 155, - 209, 124, 59, 241, 153, 239, 140, 59, 241, 153, 239, 141, 3, 107, 202, - 111, 59, 241, 153, 239, 141, 3, 91, 202, 111, 59, 47, 3, 107, 202, 111, - 59, 47, 3, 91, 202, 111, 13, 50, 59, 47, 179, 13, 53, 59, 47, 179, 13, - 50, 251, 91, 179, 13, 53, 251, 91, 179, 13, 50, 52, 251, 91, 179, 13, 53, - 52, 251, 91, 179, 13, 50, 59, 201, 231, 206, 245, 179, 13, 53, 59, 201, - 231, 206, 245, 179, 13, 50, 235, 79, 213, 140, 13, 53, 235, 79, 213, 140, - 200, 24, 211, 90, 51, 237, 231, 211, 90, 51, 251, 65, 234, 85, 244, 250, - 51, 244, 205, 234, 85, 244, 250, 51, 53, 61, 3, 46, 212, 125, 181, 107, - 51, 181, 91, 51, 181, 50, 53, 51, 181, 107, 52, 51, 181, 91, 52, 51, 181, - 50, 53, 52, 51, 181, 107, 61, 234, 235, 154, 181, 91, 61, 234, 235, 154, - 181, 107, 52, 61, 234, 235, 154, 181, 91, 52, 61, 234, 235, 154, 181, 91, - 205, 87, 51, 64, 65, 248, 129, 64, 65, 238, 249, 64, 65, 238, 121, 64, - 65, 238, 248, 64, 65, 238, 57, 64, 65, 238, 184, 64, 65, 238, 120, 64, - 65, 238, 247, 64, 65, 238, 25, 64, 65, 238, 152, 64, 65, 238, 88, 64, 65, - 238, 215, 64, 65, 238, 56, 64, 65, 238, 183, 64, 65, 238, 119, 64, 65, - 238, 246, 64, 65, 238, 9, 64, 65, 238, 136, 64, 65, 238, 72, 64, 65, 238, - 199, 64, 65, 238, 40, 64, 65, 238, 167, 64, 65, 238, 103, 64, 65, 238, - 230, 64, 65, 238, 24, 64, 65, 238, 151, 64, 65, 238, 87, 64, 65, 238, - 214, 64, 65, 238, 55, 64, 65, 238, 182, 64, 65, 238, 118, 64, 65, 238, - 245, 64, 65, 238, 1, 64, 65, 238, 128, 64, 65, 238, 64, 64, 65, 238, 191, - 64, 65, 238, 32, 64, 65, 238, 159, 64, 65, 238, 95, 64, 65, 238, 222, 64, - 65, 238, 16, 64, 65, 238, 143, 64, 65, 238, 79, 64, 65, 238, 206, 64, 65, - 238, 47, 64, 65, 238, 174, 64, 65, 238, 110, 64, 65, 238, 237, 64, 65, - 238, 8, 64, 65, 238, 135, 64, 65, 238, 71, 64, 65, 238, 198, 64, 65, 238, - 39, 64, 65, 238, 166, 64, 65, 238, 102, 64, 65, 238, 229, 64, 65, 238, - 23, 64, 65, 238, 150, 64, 65, 238, 86, 64, 65, 238, 213, 64, 65, 238, 54, - 64, 65, 238, 181, 64, 65, 238, 117, 64, 65, 238, 244, 64, 65, 237, 253, - 64, 65, 238, 124, 64, 65, 238, 60, 64, 65, 238, 187, 64, 65, 238, 28, 64, - 65, 238, 155, 64, 65, 238, 91, 64, 65, 238, 218, 64, 65, 238, 12, 64, 65, - 238, 139, 64, 65, 238, 75, 64, 65, 238, 202, 64, 65, 238, 43, 64, 65, - 238, 170, 64, 65, 238, 106, 64, 65, 238, 233, 64, 65, 238, 4, 64, 65, - 238, 131, 64, 65, 238, 67, 64, 65, 238, 194, 64, 65, 238, 35, 64, 65, - 238, 162, 64, 65, 238, 98, 64, 65, 238, 225, 64, 65, 238, 19, 64, 65, - 238, 146, 64, 65, 238, 82, 64, 65, 238, 209, 64, 65, 238, 50, 64, 65, - 238, 177, 64, 65, 238, 113, 64, 65, 238, 240, 64, 65, 238, 0, 64, 65, - 238, 127, 64, 65, 238, 63, 64, 65, 238, 190, 64, 65, 238, 31, 64, 65, - 238, 158, 64, 65, 238, 94, 64, 65, 238, 221, 64, 65, 238, 15, 64, 65, - 238, 142, 64, 65, 238, 78, 64, 65, 238, 205, 64, 65, 238, 46, 64, 65, - 238, 173, 64, 65, 238, 109, 64, 65, 238, 236, 64, 65, 238, 7, 64, 65, - 238, 134, 64, 65, 238, 70, 64, 65, 238, 197, 64, 65, 238, 38, 64, 65, - 238, 165, 64, 65, 238, 101, 64, 65, 238, 228, 64, 65, 238, 22, 64, 65, - 238, 149, 64, 65, 238, 85, 64, 65, 238, 212, 64, 65, 238, 53, 64, 65, - 238, 180, 64, 65, 238, 116, 64, 65, 238, 243, 64, 65, 237, 251, 64, 65, - 238, 122, 64, 65, 238, 58, 64, 65, 238, 185, 64, 65, 238, 26, 64, 65, - 238, 153, 64, 65, 238, 89, 64, 65, 238, 216, 64, 65, 238, 10, 64, 65, - 238, 137, 64, 65, 238, 73, 64, 65, 238, 200, 64, 65, 238, 41, 64, 65, - 238, 168, 64, 65, 238, 104, 64, 65, 238, 231, 64, 65, 238, 2, 64, 65, - 238, 129, 64, 65, 238, 65, 64, 65, 238, 192, 64, 65, 238, 33, 64, 65, - 238, 160, 64, 65, 238, 96, 64, 65, 238, 223, 64, 65, 238, 17, 64, 65, - 238, 144, 64, 65, 238, 80, 64, 65, 238, 207, 64, 65, 238, 48, 64, 65, - 238, 175, 64, 65, 238, 111, 64, 65, 238, 238, 64, 65, 237, 254, 64, 65, - 238, 125, 64, 65, 238, 61, 64, 65, 238, 188, 64, 65, 238, 29, 64, 65, - 238, 156, 64, 65, 238, 92, 64, 65, 238, 219, 64, 65, 238, 13, 64, 65, - 238, 140, 64, 65, 238, 76, 64, 65, 238, 203, 64, 65, 238, 44, 64, 65, - 238, 171, 64, 65, 238, 107, 64, 65, 238, 234, 64, 65, 238, 5, 64, 65, - 238, 132, 64, 65, 238, 68, 64, 65, 238, 195, 64, 65, 238, 36, 64, 65, - 238, 163, 64, 65, 238, 99, 64, 65, 238, 226, 64, 65, 238, 20, 64, 65, - 238, 147, 64, 65, 238, 83, 64, 65, 238, 210, 64, 65, 238, 51, 64, 65, - 238, 178, 64, 65, 238, 114, 64, 65, 238, 241, 64, 65, 237, 252, 64, 65, - 238, 123, 64, 65, 238, 59, 64, 65, 238, 186, 64, 65, 238, 27, 64, 65, - 238, 154, 64, 65, 238, 90, 64, 65, 238, 217, 64, 65, 238, 11, 64, 65, - 238, 138, 64, 65, 238, 74, 64, 65, 238, 201, 64, 65, 238, 42, 64, 65, - 238, 169, 64, 65, 238, 105, 64, 65, 238, 232, 64, 65, 238, 3, 64, 65, - 238, 130, 64, 65, 238, 66, 64, 65, 238, 193, 64, 65, 238, 34, 64, 65, - 238, 161, 64, 65, 238, 97, 64, 65, 238, 224, 64, 65, 238, 18, 64, 65, - 238, 145, 64, 65, 238, 81, 64, 65, 238, 208, 64, 65, 238, 49, 64, 65, - 238, 176, 64, 65, 238, 112, 64, 65, 238, 239, 64, 65, 237, 255, 64, 65, - 238, 126, 64, 65, 238, 62, 64, 65, 238, 189, 64, 65, 238, 30, 64, 65, - 238, 157, 64, 65, 238, 93, 64, 65, 238, 220, 64, 65, 238, 14, 64, 65, - 238, 141, 64, 65, 238, 77, 64, 65, 238, 204, 64, 65, 238, 45, 64, 65, - 238, 172, 64, 65, 238, 108, 64, 65, 238, 235, 64, 65, 238, 6, 64, 65, - 238, 133, 64, 65, 238, 69, 64, 65, 238, 196, 64, 65, 238, 37, 64, 65, - 238, 164, 64, 65, 238, 100, 64, 65, 238, 227, 64, 65, 238, 21, 64, 65, - 238, 148, 64, 65, 238, 84, 64, 65, 238, 211, 64, 65, 238, 52, 64, 65, - 238, 179, 64, 65, 238, 115, 64, 65, 238, 242, 91, 200, 215, 61, 3, 83, - 106, 91, 200, 215, 61, 3, 52, 83, 106, 107, 52, 61, 3, 83, 106, 91, 52, - 61, 3, 83, 106, 50, 53, 52, 61, 3, 83, 106, 91, 200, 215, 61, 234, 235, - 154, 107, 52, 61, 234, 235, 154, 91, 52, 61, 234, 235, 154, 237, 231, 61, - 3, 231, 155, 106, 200, 24, 61, 3, 231, 155, 106, 200, 24, 201, 165, 51, - 237, 231, 201, 165, 51, 107, 52, 240, 66, 51, 91, 52, 240, 66, 51, 107, - 201, 165, 240, 66, 51, 91, 201, 165, 240, 66, 51, 91, 200, 215, 201, 165, - 240, 66, 51, 91, 61, 3, 237, 250, 204, 243, 200, 24, 61, 202, 30, 154, - 237, 231, 61, 202, 30, 154, 91, 61, 3, 203, 136, 3, 83, 106, 91, 61, 3, - 203, 136, 3, 52, 83, 106, 91, 200, 215, 61, 3, 203, 135, 91, 200, 215, - 61, 3, 203, 136, 3, 83, 106, 91, 200, 215, 61, 3, 203, 136, 3, 52, 83, - 106, 107, 250, 219, 91, 250, 219, 107, 52, 250, 219, 91, 52, 250, 219, - 107, 61, 202, 30, 58, 239, 140, 91, 61, 202, 30, 58, 239, 140, 107, 61, - 234, 235, 249, 80, 202, 30, 58, 239, 140, 91, 61, 234, 235, 249, 80, 202, - 30, 58, 239, 140, 173, 197, 89, 26, 205, 159, 237, 69, 51, 173, 237, 69, - 26, 205, 159, 197, 89, 51, 173, 197, 89, 61, 3, 122, 173, 237, 69, 61, 3, - 122, 205, 159, 237, 69, 61, 3, 122, 205, 159, 197, 89, 61, 3, 122, 173, - 197, 89, 61, 26, 173, 237, 69, 51, 173, 237, 69, 61, 26, 205, 159, 237, - 69, 51, 205, 159, 237, 69, 61, 26, 205, 159, 197, 89, 51, 205, 159, 197, - 89, 61, 26, 173, 197, 89, 51, 209, 250, 239, 147, 241, 55, 235, 213, 239, - 146, 235, 213, 239, 147, 241, 55, 209, 250, 239, 146, 205, 159, 237, 69, - 61, 241, 55, 173, 237, 69, 51, 173, 237, 69, 61, 241, 55, 205, 159, 237, - 69, 51, 235, 213, 239, 147, 241, 55, 173, 237, 69, 51, 209, 250, 239, - 147, 241, 55, 205, 159, 237, 69, 51, 173, 237, 69, 61, 241, 55, 173, 197, - 89, 51, 173, 197, 89, 61, 241, 55, 173, 237, 69, 51, 197, 123, 61, 212, - 107, 239, 83, 210, 22, 61, 212, 107, 91, 202, 209, 241, 8, 200, 23, 61, - 212, 107, 91, 202, 209, 241, 8, 237, 230, 61, 212, 107, 237, 231, 202, - 209, 241, 8, 222, 174, 61, 212, 107, 237, 231, 202, 209, 241, 8, 210, 11, - 210, 14, 250, 254, 244, 205, 51, 222, 177, 250, 254, 251, 65, 51, 201, - 243, 250, 254, 251, 65, 51, 248, 85, 250, 254, 251, 65, 51, 201, 243, - 250, 254, 244, 205, 61, 3, 219, 15, 201, 243, 250, 254, 251, 65, 61, 3, - 212, 125, 221, 203, 53, 207, 107, 244, 205, 51, 221, 203, 50, 207, 107, - 251, 65, 51, 251, 65, 244, 203, 244, 250, 51, 244, 205, 244, 203, 244, - 250, 51, 91, 61, 90, 206, 182, 107, 51, 107, 61, 90, 206, 182, 91, 51, - 206, 182, 91, 61, 90, 107, 51, 91, 61, 3, 98, 60, 107, 61, 3, 98, 60, 91, - 61, 202, 145, 196, 222, 50, 53, 61, 202, 145, 4, 244, 249, 200, 24, 200, - 215, 61, 234, 235, 4, 244, 249, 50, 165, 124, 53, 165, 135, 232, 168, 50, - 165, 135, 53, 165, 124, 232, 168, 124, 165, 53, 135, 165, 50, 232, 168, - 124, 165, 50, 135, 165, 53, 232, 168, 50, 165, 124, 53, 165, 124, 232, - 168, 124, 165, 53, 135, 165, 53, 232, 168, 50, 165, 135, 53, 165, 135, - 232, 168, 124, 165, 50, 135, 165, 50, 232, 168, 107, 232, 169, 3, 165, - 124, 202, 30, 154, 91, 232, 169, 3, 165, 124, 202, 30, 154, 200, 24, 232, - 169, 3, 165, 53, 202, 30, 154, 237, 231, 232, 169, 3, 165, 53, 202, 30, - 154, 107, 232, 169, 3, 165, 135, 202, 30, 154, 91, 232, 169, 3, 165, 135, - 202, 30, 154, 200, 24, 232, 169, 3, 165, 50, 202, 30, 154, 237, 231, 232, - 169, 3, 165, 50, 202, 30, 154, 107, 232, 169, 3, 165, 124, 234, 235, 154, - 91, 232, 169, 3, 165, 124, 234, 235, 154, 200, 24, 232, 169, 3, 165, 53, - 234, 235, 154, 237, 231, 232, 169, 3, 165, 53, 234, 235, 154, 107, 232, - 169, 3, 165, 135, 234, 235, 154, 91, 232, 169, 3, 165, 135, 234, 235, - 154, 200, 24, 232, 169, 3, 165, 50, 234, 235, 154, 237, 231, 232, 169, 3, - 165, 50, 234, 235, 154, 107, 232, 169, 3, 165, 124, 90, 107, 232, 169, 3, - 165, 237, 235, 200, 24, 232, 169, 3, 165, 50, 248, 210, 200, 24, 232, - 169, 3, 165, 210, 22, 91, 232, 169, 3, 165, 124, 90, 91, 232, 169, 3, - 165, 237, 235, 237, 231, 232, 169, 3, 165, 50, 248, 210, 237, 231, 232, - 169, 3, 165, 210, 22, 107, 232, 169, 3, 165, 124, 90, 91, 232, 169, 3, - 165, 200, 36, 107, 232, 169, 3, 165, 135, 90, 91, 232, 169, 3, 165, 237, - 235, 91, 232, 169, 3, 165, 124, 90, 107, 232, 169, 3, 165, 200, 36, 91, - 232, 169, 3, 165, 135, 90, 107, 232, 169, 3, 165, 237, 235, 107, 232, - 169, 3, 165, 124, 90, 181, 240, 65, 107, 232, 169, 3, 165, 135, 248, 227, - 181, 240, 65, 91, 232, 169, 3, 165, 124, 90, 181, 240, 65, 91, 232, 169, - 3, 165, 135, 248, 227, 181, 240, 65, 200, 24, 232, 169, 3, 165, 50, 248, - 210, 237, 231, 232, 169, 3, 165, 210, 22, 237, 231, 232, 169, 3, 165, 50, - 248, 210, 200, 24, 232, 169, 3, 165, 210, 22, 53, 52, 61, 3, 209, 185, - 232, 137, 236, 172, 2, 90, 91, 51, 202, 85, 214, 83, 90, 91, 51, 107, 61, - 90, 202, 85, 214, 82, 91, 61, 90, 202, 85, 214, 82, 91, 61, 90, 251, 139, - 180, 149, 222, 140, 90, 107, 51, 107, 61, 202, 145, 222, 139, 233, 94, - 90, 91, 51, 204, 142, 90, 91, 51, 107, 61, 202, 145, 204, 141, 204, 94, - 90, 107, 51, 50, 235, 112, 203, 135, 53, 235, 112, 203, 135, 124, 235, - 112, 203, 135, 135, 235, 112, 203, 135, 201, 165, 83, 249, 80, 239, 218, - 195, 159, 216, 17, 205, 105, 195, 159, 216, 17, 200, 201, 244, 168, 50, - 59, 241, 18, 179, 53, 59, 241, 18, 179, 50, 59, 213, 140, 53, 59, 213, - 140, 195, 159, 216, 17, 50, 226, 102, 179, 195, 159, 216, 17, 53, 226, - 102, 179, 195, 159, 216, 17, 50, 248, 162, 179, 195, 159, 216, 17, 53, - 248, 162, 179, 50, 47, 248, 62, 3, 200, 62, 53, 47, 248, 62, 3, 200, 62, - 50, 47, 248, 62, 3, 202, 112, 226, 87, 201, 243, 241, 101, 53, 47, 248, - 62, 3, 202, 112, 226, 87, 248, 85, 241, 101, 50, 47, 248, 62, 3, 202, - 112, 226, 87, 248, 85, 241, 101, 53, 47, 248, 62, 3, 202, 112, 226, 87, - 201, 243, 241, 101, 50, 251, 91, 248, 62, 3, 238, 253, 53, 251, 91, 248, - 62, 3, 238, 253, 50, 250, 254, 222, 140, 179, 53, 250, 254, 233, 94, 179, - 52, 50, 250, 254, 233, 94, 179, 52, 53, 250, 254, 222, 140, 179, 50, 58, - 201, 231, 206, 245, 179, 53, 58, 201, 231, 206, 245, 179, 237, 250, 235, - 169, 83, 195, 24, 222, 75, 219, 201, 251, 91, 214, 85, 222, 184, 53, 251, - 91, 199, 132, 3, 205, 94, 219, 201, 53, 251, 91, 3, 238, 253, 251, 91, 3, - 209, 81, 226, 41, 252, 10, 251, 90, 205, 127, 251, 91, 214, 85, 222, 184, - 205, 127, 251, 91, 214, 85, 200, 36, 163, 251, 90, 210, 89, 251, 90, 251, - 91, 3, 200, 62, 210, 89, 251, 91, 3, 200, 62, 214, 182, 251, 91, 214, 85, - 200, 36, 214, 182, 251, 91, 214, 85, 237, 235, 219, 201, 251, 91, 3, 192, - 250, 232, 236, 218, 226, 87, 61, 212, 107, 124, 26, 210, 22, 219, 201, - 251, 91, 3, 192, 250, 232, 236, 218, 226, 87, 61, 212, 107, 124, 26, 222, - 184, 219, 201, 251, 91, 3, 192, 250, 232, 236, 218, 226, 87, 61, 212, - 107, 135, 26, 210, 22, 219, 201, 251, 91, 3, 192, 250, 232, 236, 218, - 226, 87, 61, 212, 107, 135, 26, 222, 184, 219, 201, 251, 91, 3, 192, 250, - 232, 236, 218, 226, 87, 61, 212, 107, 53, 26, 200, 36, 219, 201, 251, 91, - 3, 192, 250, 232, 236, 218, 226, 87, 61, 212, 107, 50, 26, 200, 36, 219, - 201, 251, 91, 3, 192, 250, 232, 236, 218, 226, 87, 61, 212, 107, 53, 26, - 237, 235, 219, 201, 251, 91, 3, 192, 250, 232, 236, 218, 226, 87, 61, - 212, 107, 50, 26, 237, 235, 210, 89, 236, 232, 207, 76, 236, 232, 207, - 77, 3, 214, 26, 236, 232, 207, 77, 3, 4, 244, 250, 57, 236, 232, 207, 77, - 3, 53, 61, 57, 236, 232, 207, 77, 3, 50, 61, 57, 244, 250, 3, 231, 155, - 154, 46, 83, 154, 46, 213, 145, 46, 210, 90, 205, 177, 46, 213, 32, 244, - 250, 239, 60, 247, 219, 231, 155, 249, 80, 26, 201, 243, 157, 239, 60, - 247, 219, 83, 154, 244, 250, 3, 204, 96, 196, 222, 46, 251, 63, 239, 54, - 55, 124, 61, 202, 145, 244, 249, 46, 59, 248, 5, 46, 248, 5, 46, 222, - 139, 46, 233, 93, 244, 250, 3, 4, 244, 250, 202, 30, 202, 218, 210, 22, - 244, 250, 3, 99, 231, 155, 204, 184, 202, 30, 202, 218, 210, 22, 103, - 209, 250, 239, 147, 205, 248, 103, 235, 213, 239, 147, 205, 248, 103, - 250, 179, 103, 4, 244, 249, 103, 205, 94, 99, 225, 126, 205, 92, 201, - 181, 3, 76, 57, 201, 181, 3, 200, 62, 209, 81, 226, 87, 201, 180, 201, - 181, 3, 207, 84, 250, 169, 248, 84, 53, 201, 181, 90, 50, 201, 180, 50, - 201, 181, 248, 210, 83, 154, 83, 249, 80, 248, 210, 53, 201, 180, 248, - 72, 3, 50, 157, 248, 136, 248, 72, 3, 53, 157, 248, 136, 58, 248, 71, 24, - 3, 50, 157, 248, 136, 24, 3, 53, 157, 248, 136, 59, 231, 89, 58, 231, 89, - 50, 197, 56, 235, 169, 53, 197, 56, 235, 169, 50, 52, 197, 56, 235, 169, - 53, 52, 197, 56, 235, 169, 226, 79, 226, 63, 202, 108, 127, 226, 63, 226, - 64, 217, 106, 3, 83, 154, 237, 244, 218, 122, 47, 3, 241, 124, 214, 31, - 226, 76, 250, 202, 206, 144, 212, 5, 236, 172, 2, 26, 205, 250, 213, 145, - 236, 172, 2, 26, 205, 250, 213, 146, 3, 202, 85, 57, 230, 193, 202, 30, - 26, 205, 250, 213, 145, 233, 155, 205, 6, 202, 206, 237, 234, 201, 181, - 3, 50, 157, 248, 136, 237, 234, 201, 181, 3, 53, 157, 248, 136, 58, 239, - 141, 3, 135, 51, 58, 221, 198, 59, 244, 250, 3, 135, 51, 58, 244, 250, 3, - 135, 51, 236, 154, 59, 205, 94, 236, 154, 58, 205, 94, 236, 154, 59, 239, - 140, 236, 154, 58, 239, 140, 236, 154, 59, 244, 249, 236, 154, 58, 244, - 249, 209, 123, 210, 90, 205, 178, 214, 82, 205, 178, 3, 214, 26, 210, 90, - 205, 178, 3, 231, 155, 106, 248, 171, 205, 177, 248, 171, 210, 90, 205, - 177, 52, 212, 125, 201, 165, 212, 125, 222, 179, 241, 10, 251, 91, 179, - 210, 17, 241, 10, 251, 91, 179, 202, 69, 219, 13, 218, 54, 46, 76, 214, - 82, 218, 54, 46, 98, 214, 82, 218, 54, 46, 24, 214, 82, 218, 54, 200, 52, - 214, 83, 3, 238, 253, 218, 54, 200, 52, 214, 83, 3, 212, 125, 218, 54, - 47, 226, 24, 214, 82, 218, 54, 47, 200, 52, 214, 82, 99, 221, 249, 26, - 214, 82, 99, 221, 249, 214, 73, 214, 82, 218, 54, 24, 214, 82, 218, 219, - 99, 204, 117, 204, 115, 3, 226, 37, 211, 90, 226, 38, 214, 82, 235, 121, - 213, 134, 226, 37, 226, 38, 3, 52, 106, 226, 38, 250, 130, 3, 205, 248, - 244, 242, 234, 214, 251, 65, 226, 35, 222, 76, 226, 36, 3, 210, 162, 213, - 113, 250, 227, 212, 101, 222, 76, 226, 36, 3, 207, 107, 213, 113, 250, - 227, 212, 101, 222, 76, 226, 36, 216, 19, 226, 81, 202, 218, 212, 101, - 226, 38, 250, 227, 39, 212, 111, 214, 82, 211, 84, 226, 38, 214, 82, 226, - 38, 3, 107, 61, 3, 122, 226, 38, 3, 24, 55, 226, 38, 3, 226, 23, 226, 38, - 3, 200, 51, 226, 38, 3, 214, 26, 226, 38, 3, 200, 62, 225, 127, 222, 228, - 50, 201, 181, 214, 82, 195, 159, 216, 17, 208, 169, 241, 160, 195, 159, - 216, 17, 208, 169, 212, 166, 195, 159, 216, 17, 208, 169, 212, 0, 98, 2, - 3, 4, 244, 250, 57, 98, 2, 3, 244, 241, 252, 23, 57, 98, 2, 3, 202, 85, - 57, 98, 2, 3, 76, 60, 98, 2, 3, 202, 85, 60, 98, 2, 3, 204, 143, 102, 98, - 2, 3, 58, 201, 180, 219, 16, 2, 3, 244, 160, 57, 219, 16, 2, 3, 76, 60, - 219, 16, 2, 3, 235, 213, 238, 250, 219, 16, 2, 3, 209, 250, 238, 250, 98, - 2, 226, 87, 50, 157, 244, 249, 98, 2, 226, 87, 53, 157, 244, 249, 199, - 117, 214, 73, 241, 62, 212, 5, 218, 118, 2, 3, 76, 57, 218, 118, 2, 3, - 200, 62, 207, 104, 212, 6, 3, 248, 85, 244, 202, 205, 222, 212, 5, 218, - 118, 2, 226, 87, 50, 157, 244, 249, 218, 118, 2, 226, 87, 53, 157, 244, - 249, 46, 218, 118, 2, 3, 244, 241, 252, 22, 218, 118, 2, 226, 87, 52, - 244, 249, 46, 239, 54, 55, 98, 2, 226, 87, 201, 180, 219, 16, 2, 226, 87, - 201, 180, 218, 118, 2, 226, 87, 201, 180, 226, 32, 212, 5, 210, 12, 226, - 32, 212, 5, 195, 159, 216, 17, 210, 135, 241, 160, 251, 121, 214, 73, - 241, 108, 226, 24, 3, 238, 253, 200, 52, 3, 219, 16, 55, 200, 52, 3, 214, - 26, 226, 24, 3, 214, 26, 226, 24, 3, 221, 249, 251, 100, 200, 52, 3, 221, - 249, 214, 72, 200, 52, 90, 226, 23, 226, 24, 90, 200, 51, 200, 52, 90, - 249, 80, 90, 226, 23, 226, 24, 90, 249, 80, 90, 200, 51, 200, 52, 248, - 210, 26, 225, 126, 3, 200, 51, 226, 24, 248, 210, 26, 225, 126, 3, 226, - 23, 244, 203, 200, 52, 3, 207, 83, 244, 203, 226, 24, 3, 207, 83, 52, 47, - 226, 23, 52, 47, 200, 51, 244, 203, 200, 52, 3, 207, 84, 26, 205, 222, - 212, 5, 221, 249, 26, 3, 76, 57, 221, 249, 214, 73, 3, 76, 57, 52, 221, - 249, 251, 100, 52, 221, 249, 214, 72, 99, 226, 25, 221, 249, 251, 100, - 99, 226, 25, 221, 249, 214, 72, 205, 232, 222, 228, 214, 72, 205, 232, - 222, 228, 251, 100, 221, 249, 214, 73, 214, 22, 221, 249, 251, 100, 221, - 249, 26, 3, 112, 204, 243, 221, 249, 214, 73, 3, 112, 204, 243, 221, 249, - 26, 3, 231, 155, 240, 65, 221, 249, 214, 73, 3, 231, 155, 240, 65, 221, - 249, 26, 3, 52, 214, 26, 221, 249, 26, 3, 200, 62, 221, 249, 26, 3, 52, - 200, 62, 4, 199, 114, 3, 200, 62, 221, 249, 214, 73, 3, 52, 214, 26, 221, - 249, 214, 73, 3, 52, 200, 62, 195, 159, 216, 17, 239, 7, 251, 55, 195, - 159, 216, 17, 210, 205, 251, 55, 236, 172, 2, 3, 76, 60, 230, 193, 3, 76, - 57, 201, 165, 231, 155, 249, 80, 3, 52, 83, 106, 201, 165, 231, 155, 249, - 80, 3, 201, 165, 83, 106, 202, 85, 214, 83, 3, 76, 57, 202, 85, 214, 83, - 3, 209, 250, 238, 250, 206, 71, 219, 16, 206, 70, 241, 147, 3, 76, 57, - 236, 172, 3, 250, 179, 251, 139, 180, 202, 30, 3, 244, 241, 252, 22, 251, - 21, 180, 214, 73, 180, 149, 236, 172, 2, 90, 98, 55, 98, 2, 90, 236, 172, - 55, 236, 172, 2, 90, 202, 85, 214, 82, 52, 244, 169, 236, 173, 99, 241, - 140, 236, 172, 206, 85, 115, 241, 140, 236, 172, 206, 85, 236, 172, 2, 3, - 99, 238, 251, 90, 26, 99, 238, 251, 60, 236, 165, 3, 235, 7, 238, 251, - 57, 222, 140, 3, 244, 250, 226, 41, 233, 94, 3, 244, 250, 226, 41, 222, - 140, 3, 211, 79, 117, 57, 233, 94, 3, 211, 79, 117, 57, 222, 140, 214, - 73, 205, 250, 180, 149, 233, 94, 214, 73, 205, 250, 180, 149, 222, 140, - 214, 73, 205, 250, 180, 202, 30, 3, 76, 226, 41, 233, 94, 214, 73, 205, - 250, 180, 202, 30, 3, 76, 226, 41, 222, 140, 214, 73, 205, 250, 180, 202, - 30, 3, 76, 57, 233, 94, 214, 73, 205, 250, 180, 202, 30, 3, 76, 57, 222, - 140, 214, 73, 205, 250, 180, 202, 30, 3, 76, 90, 210, 22, 233, 94, 214, - 73, 205, 250, 180, 202, 30, 3, 76, 90, 222, 184, 222, 140, 214, 73, 251, - 22, 233, 94, 214, 73, 251, 22, 222, 140, 26, 206, 60, 216, 19, 180, 149, - 233, 94, 26, 206, 60, 216, 19, 180, 149, 222, 140, 26, 216, 19, 251, 22, - 233, 94, 26, 216, 19, 251, 22, 222, 140, 90, 237, 243, 180, 90, 233, 93, - 233, 94, 90, 237, 243, 180, 90, 222, 139, 222, 140, 90, 206, 71, 214, 73, - 236, 173, 233, 94, 90, 206, 71, 214, 73, 236, 173, 222, 140, 90, 206, 71, - 90, 233, 93, 233, 94, 90, 206, 71, 90, 222, 139, 222, 140, 90, 233, 94, - 90, 237, 243, 236, 173, 233, 94, 90, 222, 140, 90, 237, 243, 236, 173, - 222, 140, 90, 205, 250, 180, 90, 233, 94, 90, 205, 250, 236, 173, 233, - 94, 90, 205, 250, 180, 90, 222, 140, 90, 205, 250, 236, 173, 205, 250, - 180, 202, 30, 214, 73, 222, 139, 205, 250, 180, 202, 30, 214, 73, 233, - 93, 205, 250, 180, 202, 30, 214, 73, 222, 140, 3, 76, 226, 41, 205, 250, - 180, 202, 30, 214, 73, 233, 94, 3, 76, 226, 41, 237, 243, 180, 202, 30, - 214, 73, 222, 139, 237, 243, 180, 202, 30, 214, 73, 233, 93, 237, 243, - 205, 250, 180, 202, 30, 214, 73, 222, 139, 237, 243, 205, 250, 180, 202, - 30, 214, 73, 233, 93, 206, 71, 214, 73, 222, 139, 206, 71, 214, 73, 233, - 93, 206, 71, 90, 222, 140, 90, 236, 172, 55, 206, 71, 90, 233, 94, 90, - 236, 172, 55, 52, 217, 90, 222, 139, 52, 217, 90, 233, 93, 52, 217, 90, - 222, 140, 3, 200, 62, 233, 94, 214, 22, 222, 139, 233, 94, 248, 210, 222, - 139, 222, 140, 244, 203, 247, 219, 241, 11, 233, 94, 244, 203, 247, 219, - 241, 11, 222, 140, 244, 203, 247, 219, 241, 12, 90, 205, 250, 236, 173, - 233, 94, 244, 203, 247, 219, 241, 12, 90, 205, 250, 236, 173, 205, 223, - 202, 222, 222, 226, 202, 222, 205, 223, 202, 223, 214, 73, 180, 149, 222, - 226, 202, 223, 214, 73, 180, 149, 236, 172, 2, 3, 247, 254, 57, 212, 36, - 90, 206, 60, 236, 172, 55, 204, 134, 90, 206, 60, 236, 172, 55, 212, 36, - 90, 206, 60, 216, 19, 180, 149, 204, 134, 90, 206, 60, 216, 19, 180, 149, - 212, 36, 90, 236, 172, 55, 204, 134, 90, 236, 172, 55, 212, 36, 90, 216, - 19, 180, 149, 204, 134, 90, 216, 19, 180, 149, 212, 36, 90, 251, 139, - 180, 149, 204, 134, 90, 251, 139, 180, 149, 212, 36, 90, 216, 19, 251, - 139, 180, 149, 204, 134, 90, 216, 19, 251, 139, 180, 149, 52, 212, 35, - 52, 204, 133, 204, 142, 3, 238, 253, 204, 94, 3, 238, 253, 204, 142, 3, - 98, 2, 60, 204, 94, 3, 98, 2, 60, 204, 142, 3, 218, 118, 2, 60, 204, 94, - 3, 218, 118, 2, 60, 204, 142, 77, 214, 73, 180, 202, 30, 3, 76, 57, 204, - 94, 77, 214, 73, 180, 202, 30, 3, 76, 57, 204, 142, 77, 90, 236, 172, 55, - 204, 94, 77, 90, 236, 172, 55, 204, 142, 77, 90, 202, 85, 214, 82, 204, - 94, 77, 90, 202, 85, 214, 82, 204, 142, 77, 90, 251, 139, 180, 149, 204, - 94, 77, 90, 251, 139, 180, 149, 204, 142, 77, 90, 216, 19, 180, 149, 204, - 94, 77, 90, 216, 19, 180, 149, 47, 50, 192, 111, 214, 82, 47, 53, 192, - 111, 214, 82, 244, 203, 204, 141, 244, 203, 204, 93, 244, 203, 204, 142, - 214, 73, 180, 149, 244, 203, 204, 94, 214, 73, 180, 149, 204, 142, 90, - 204, 93, 204, 94, 90, 204, 141, 204, 142, 90, 204, 141, 204, 94, 90, 204, - 93, 204, 94, 248, 210, 204, 141, 204, 94, 248, 210, 26, 225, 126, 247, - 219, 240, 66, 3, 204, 141, 237, 0, 77, 214, 85, 237, 230, 212, 156, 3, - 203, 49, 201, 242, 201, 198, 226, 23, 235, 25, 216, 34, 206, 182, 50, - 203, 147, 206, 182, 135, 203, 147, 206, 182, 124, 203, 147, 213, 33, 3, - 209, 80, 83, 249, 80, 201, 165, 53, 201, 3, 52, 83, 249, 80, 50, 201, 3, - 83, 249, 80, 52, 50, 201, 3, 52, 83, 249, 80, 52, 50, 201, 3, 181, 240, - 66, 234, 235, 50, 219, 169, 77, 52, 199, 100, 206, 182, 135, 203, 148, 3, - 214, 26, 206, 182, 124, 203, 148, 3, 200, 62, 206, 182, 124, 203, 148, - 90, 206, 182, 135, 203, 147, 52, 135, 203, 147, 52, 124, 203, 147, 52, - 204, 196, 216, 19, 55, 210, 89, 52, 204, 196, 216, 19, 55, 239, 19, 216, - 19, 239, 62, 3, 210, 89, 217, 105, 205, 248, 83, 222, 76, 3, 244, 250, - 57, 83, 222, 76, 3, 244, 250, 60, 135, 203, 148, 3, 244, 250, 60, 213, - 146, 3, 231, 155, 106, 213, 146, 3, 202, 85, 214, 82, 201, 165, 83, 249, - 80, 248, 164, 210, 136, 201, 165, 83, 249, 80, 3, 231, 155, 106, 201, - 165, 244, 169, 214, 82, 201, 165, 217, 90, 222, 139, 201, 165, 217, 90, - 233, 93, 237, 243, 205, 250, 222, 140, 214, 73, 180, 149, 237, 243, 205, - 250, 233, 94, 214, 73, 180, 149, 201, 165, 205, 178, 248, 164, 210, 136, - 222, 228, 201, 165, 83, 249, 80, 214, 82, 52, 205, 178, 214, 82, 59, 83, - 154, 218, 54, 59, 83, 154, 173, 237, 69, 59, 51, 173, 197, 89, 59, 51, - 205, 159, 237, 69, 59, 51, 205, 159, 197, 89, 59, 51, 50, 53, 59, 51, - 107, 58, 51, 200, 24, 58, 51, 237, 231, 58, 51, 173, 237, 69, 58, 51, - 173, 197, 89, 58, 51, 205, 159, 237, 69, 58, 51, 205, 159, 197, 89, 58, - 51, 50, 53, 58, 51, 124, 135, 58, 51, 91, 61, 3, 202, 68, 237, 230, 91, - 61, 3, 202, 68, 200, 23, 107, 61, 3, 202, 68, 237, 230, 107, 61, 3, 202, - 68, 200, 23, 47, 3, 201, 243, 157, 248, 136, 47, 3, 248, 85, 157, 248, - 136, 47, 3, 200, 33, 53, 239, 147, 157, 248, 136, 47, 3, 221, 203, 50, - 239, 147, 157, 248, 136, 239, 141, 3, 50, 157, 248, 136, 239, 141, 3, 53, - 157, 248, 136, 239, 141, 3, 201, 243, 157, 248, 136, 239, 141, 3, 248, - 85, 157, 248, 136, 237, 250, 205, 94, 58, 222, 228, 205, 94, 59, 222, - 228, 205, 94, 58, 199, 48, 4, 205, 94, 59, 199, 48, 4, 205, 94, 58, 213, - 55, 59, 213, 55, 59, 232, 85, 58, 232, 85, 231, 155, 58, 232, 85, 58, - 222, 228, 244, 249, 58, 219, 190, 239, 140, 59, 219, 190, 239, 140, 58, - 219, 190, 221, 198, 59, 219, 190, 221, 198, 58, 4, 239, 140, 58, 4, 221, - 198, 59, 4, 221, 198, 58, 231, 155, 236, 248, 59, 231, 155, 236, 248, 58, - 83, 236, 248, 59, 83, 236, 248, 50, 61, 3, 4, 244, 249, 115, 107, 250, - 214, 50, 61, 3, 46, 212, 125, 181, 107, 205, 87, 51, 107, 200, 215, 61, - 3, 83, 106, 107, 200, 215, 61, 3, 52, 83, 106, 107, 200, 215, 61, 234, - 235, 154, 107, 200, 215, 201, 165, 240, 66, 51, 107, 61, 3, 237, 250, - 204, 243, 107, 61, 3, 203, 136, 3, 83, 106, 107, 61, 3, 203, 136, 3, 52, - 83, 106, 107, 200, 215, 61, 3, 203, 135, 107, 200, 215, 61, 3, 203, 136, - 3, 83, 106, 107, 200, 215, 61, 3, 203, 136, 3, 52, 83, 106, 107, 61, 202, - 145, 196, 222, 197, 123, 61, 212, 107, 239, 83, 222, 184, 236, 172, 2, - 90, 107, 51, 210, 90, 202, 85, 214, 83, 90, 107, 51, 107, 61, 90, 210, - 90, 251, 139, 180, 149, 91, 61, 202, 145, 233, 93, 91, 61, 202, 145, 204, - 93, 107, 211, 90, 51, 91, 211, 90, 51, 210, 90, 202, 85, 214, 83, 90, 91, - 51, 91, 61, 90, 210, 90, 251, 139, 180, 149, 202, 85, 214, 83, 90, 107, - 51, 107, 61, 90, 251, 139, 180, 149, 107, 61, 90, 210, 90, 202, 85, 214, - 82, 91, 61, 90, 210, 90, 202, 85, 214, 82, 237, 231, 201, 179, 195, 24, - 51, 206, 182, 205, 250, 173, 51, 206, 182, 249, 135, 205, 159, 51, 59, - 219, 190, 205, 7, 58, 4, 205, 7, 59, 4, 205, 7, 58, 210, 17, 213, 55, 59, - 210, 17, 213, 55, 85, 222, 228, 244, 249, 85, 214, 28, 3, 214, 28, 226, - 41, 85, 244, 250, 3, 244, 250, 226, 41, 85, 244, 249, 85, 46, 208, 230, - 205, 250, 173, 61, 3, 231, 164, 232, 137, 249, 135, 205, 159, 61, 3, 231, - 164, 203, 135, 205, 250, 173, 61, 3, 231, 155, 203, 135, 249, 135, 205, - 159, 61, 3, 231, 155, 203, 135, 248, 218, 61, 212, 107, 237, 231, 202, - 209, 173, 237, 68, 206, 182, 248, 218, 61, 212, 107, 237, 231, 202, 209, - 173, 237, 68, 107, 201, 179, 51, 200, 24, 201, 179, 51, 91, 201, 179, 51, - 237, 231, 201, 179, 51, 50, 53, 201, 179, 51, 124, 135, 201, 179, 51, - 173, 197, 89, 201, 179, 51, 173, 237, 69, 201, 179, 51, 205, 159, 237, - 69, 201, 179, 51, 205, 159, 197, 89, 201, 179, 51, 107, 201, 179, 240, - 64, 51, 200, 24, 201, 179, 240, 64, 51, 91, 201, 179, 240, 64, 51, 237, - 231, 201, 179, 240, 64, 51, 244, 205, 201, 179, 192, 244, 250, 51, 251, - 65, 201, 179, 192, 244, 250, 51, 107, 201, 179, 61, 202, 30, 154, 200, - 24, 201, 179, 61, 202, 30, 154, 91, 201, 179, 61, 202, 30, 154, 237, 231, - 201, 179, 61, 202, 30, 154, 173, 197, 89, 201, 179, 61, 202, 30, 154, - 173, 237, 69, 201, 179, 61, 202, 30, 154, 205, 159, 237, 69, 201, 179, - 61, 202, 30, 154, 205, 159, 197, 89, 201, 179, 61, 202, 30, 154, 107, - 201, 179, 61, 3, 52, 231, 155, 106, 200, 24, 201, 179, 61, 3, 52, 231, - 155, 106, 91, 201, 179, 61, 3, 52, 231, 155, 106, 237, 231, 201, 179, 61, - 3, 52, 231, 155, 106, 231, 155, 203, 155, 224, 153, 83, 203, 155, 224, - 153, 107, 201, 179, 61, 127, 91, 201, 179, 51, 200, 24, 201, 179, 61, - 107, 77, 237, 231, 201, 179, 51, 91, 201, 179, 61, 127, 107, 201, 179, - 51, 237, 231, 201, 179, 61, 107, 77, 200, 24, 201, 179, 51, 107, 201, - 179, 213, 219, 250, 214, 200, 24, 201, 179, 213, 219, 250, 214, 91, 201, - 179, 213, 219, 250, 214, 237, 231, 201, 179, 213, 219, 250, 214, 107, 58, - 46, 59, 51, 200, 24, 58, 46, 59, 51, 91, 58, 46, 59, 51, 237, 231, 58, - 46, 59, 51, 251, 65, 201, 179, 53, 200, 167, 51, 251, 65, 201, 179, 248, - 85, 200, 167, 51, 251, 65, 201, 179, 50, 200, 167, 51, 251, 65, 201, 179, - 201, 243, 200, 167, 51, 210, 94, 222, 184, 210, 94, 210, 22, 217, 80, - 222, 184, 217, 80, 210, 22, 235, 7, 241, 102, 250, 215, 244, 245, 251, - 64, 91, 58, 51, 202, 154, 201, 241, 107, 236, 166, 250, 217, 202, 154, - 210, 18, 200, 24, 236, 166, 250, 217, 202, 154, 201, 241, 91, 236, 166, - 250, 217, 202, 154, 222, 180, 237, 231, 236, 166, 250, 217, 58, 107, 236, - 166, 250, 217, 58, 200, 24, 236, 166, 250, 217, 58, 91, 236, 166, 250, - 217, 58, 237, 231, 236, 166, 250, 217, 237, 231, 201, 179, 61, 3, 181, - 202, 68, 222, 174, 237, 231, 201, 179, 61, 3, 181, 202, 68, 210, 11, 200, - 24, 201, 179, 61, 3, 181, 202, 68, 222, 174, 200, 24, 201, 179, 61, 3, - 181, 202, 68, 210, 11, 107, 201, 179, 61, 3, 181, 202, 68, 200, 23, 91, - 201, 179, 61, 3, 181, 202, 68, 200, 23, 107, 201, 179, 61, 3, 181, 202, - 68, 237, 230, 91, 201, 179, 61, 3, 181, 202, 68, 237, 230, 58, 241, 10, - 237, 231, 26, 107, 51, 58, 241, 10, 237, 231, 26, 91, 51, 58, 241, 10, - 200, 24, 26, 107, 51, 58, 241, 10, 200, 24, 26, 91, 51, 58, 241, 10, 107, - 26, 200, 24, 51, 58, 241, 10, 91, 26, 200, 24, 51, 58, 241, 10, 107, 26, - 237, 231, 51, 58, 241, 10, 91, 26, 237, 231, 51, 210, 63, 61, 135, 222, - 184, 210, 63, 61, 135, 210, 22, 210, 63, 61, 124, 222, 184, 210, 63, 61, - 124, 210, 22, 210, 63, 61, 50, 200, 36, 210, 63, 61, 53, 200, 36, 210, - 63, 61, 50, 237, 235, 210, 63, 61, 53, 237, 235, 200, 24, 59, 61, 234, - 235, 249, 80, 3, 231, 155, 154, 124, 250, 218, 226, 87, 39, 210, 164, - 248, 70, 214, 22, 59, 205, 92, 214, 22, 59, 26, 58, 205, 92, 214, 22, 58, - 205, 92, 249, 99, 111, 3, 175, 196, 222, 46, 196, 222, 46, 27, 196, 222, - 58, 47, 247, 34, 58, 239, 141, 247, 34, 163, 58, 213, 55, 231, 155, 58, - 214, 173, 58, 214, 173, 58, 219, 190, 200, 35, 201, 181, 247, 34, 58, - 219, 190, 237, 234, 201, 181, 247, 34, 58, 219, 190, 222, 179, 201, 181, - 247, 34, 58, 219, 190, 210, 17, 201, 181, 247, 34, 217, 95, 235, 24, 102, - 201, 243, 157, 58, 244, 249, 248, 85, 157, 58, 244, 249, 175, 235, 7, - 212, 109, 58, 241, 6, 209, 194, 175, 235, 7, 212, 109, 58, 241, 6, 59, - 235, 7, 212, 109, 241, 6, 209, 194, 59, 235, 7, 212, 109, 241, 6, 47, - 212, 79, 226, 68, 200, 66, 55, 233, 84, 78, 212, 122, 235, 24, 102, 212, - 122, 235, 24, 134, 212, 122, 235, 24, 136, 212, 122, 235, 24, 146, 201, - 200, 211, 246, 250, 175, 231, 10, 212, 231, 217, 91, 59, 218, 190, 207, - 113, 58, 239, 141, 214, 120, 241, 61, 201, 143, 175, 218, 190, 250, 210, - 241, 25, 232, 243, 195, 77, 223, 204, 251, 34, 251, 252, 197, 218, 212, - 80, 50, 157, 58, 205, 7, 53, 157, 58, 205, 7, 205, 8, 3, 50, 157, 248, - 136, 205, 8, 3, 53, 157, 248, 136, 107, 200, 215, 61, 3, 201, 181, 250, - 216, 200, 24, 200, 215, 61, 3, 201, 181, 250, 216, 91, 200, 215, 61, 3, - 201, 181, 250, 216, 237, 231, 200, 215, 61, 3, 201, 181, 250, 216, 236, - 156, 235, 24, 100, 236, 156, 235, 24, 102, 208, 130, 209, 103, 250, 174, - 16, 199, 19, 209, 103, 250, 174, 16, 216, 5, 209, 103, 250, 174, 16, 211, - 67, 209, 103, 250, 174, 16, 248, 159, 209, 103, 250, 174, 16, 207, 96, - 209, 103, 250, 174, 16, 201, 192, 236, 172, 2, 3, 226, 64, 60, 200, 48, - 105, 207, 92, 105, 237, 240, 105, 213, 123, 105, 210, 89, 53, 251, 90, - 232, 106, 213, 107, 105, 125, 6, 1, 250, 113, 125, 6, 1, 248, 9, 125, 6, - 1, 199, 116, 125, 6, 1, 233, 159, 125, 6, 1, 239, 23, 125, 6, 1, 196, 38, - 125, 6, 1, 195, 58, 125, 6, 1, 237, 151, 125, 6, 1, 195, 84, 125, 6, 1, - 225, 221, 125, 6, 1, 84, 225, 221, 125, 6, 1, 68, 125, 6, 1, 239, 44, - 125, 6, 1, 225, 23, 125, 6, 1, 222, 39, 125, 6, 1, 218, 59, 125, 6, 1, - 217, 206, 125, 6, 1, 214, 104, 125, 6, 1, 212, 104, 125, 6, 1, 209, 249, - 125, 6, 1, 205, 229, 125, 6, 1, 200, 246, 125, 6, 1, 200, 83, 125, 6, 1, - 234, 238, 125, 6, 1, 232, 91, 125, 6, 1, 214, 40, 125, 6, 1, 213, 92, - 125, 6, 1, 206, 154, 125, 6, 1, 201, 92, 125, 6, 1, 245, 36, 125, 6, 1, - 207, 50, 125, 6, 1, 196, 47, 125, 6, 1, 196, 49, 125, 6, 1, 196, 82, 125, - 6, 1, 205, 123, 142, 125, 6, 1, 195, 217, 125, 6, 1, 4, 195, 182, 125, 6, - 1, 4, 195, 183, 3, 203, 135, 125, 6, 1, 196, 3, 125, 6, 1, 226, 6, 4, - 195, 182, 125, 6, 1, 248, 171, 195, 182, 125, 6, 1, 226, 6, 248, 171, - 195, 182, 125, 6, 1, 235, 103, 125, 6, 1, 225, 219, 125, 6, 1, 206, 153, - 125, 6, 1, 201, 155, 63, 125, 6, 1, 222, 216, 218, 59, 125, 4, 1, 250, - 113, 125, 4, 1, 248, 9, 125, 4, 1, 199, 116, 125, 4, 1, 233, 159, 125, 4, - 1, 239, 23, 125, 4, 1, 196, 38, 125, 4, 1, 195, 58, 125, 4, 1, 237, 151, - 125, 4, 1, 195, 84, 125, 4, 1, 225, 221, 125, 4, 1, 84, 225, 221, 125, 4, - 1, 68, 125, 4, 1, 239, 44, 125, 4, 1, 225, 23, 125, 4, 1, 222, 39, 125, - 4, 1, 218, 59, 125, 4, 1, 217, 206, 125, 4, 1, 214, 104, 125, 4, 1, 212, - 104, 125, 4, 1, 209, 249, 125, 4, 1, 205, 229, 125, 4, 1, 200, 246, 125, - 4, 1, 200, 83, 125, 4, 1, 234, 238, 125, 4, 1, 232, 91, 125, 4, 1, 214, - 40, 125, 4, 1, 213, 92, 125, 4, 1, 206, 154, 125, 4, 1, 201, 92, 125, 4, - 1, 245, 36, 125, 4, 1, 207, 50, 125, 4, 1, 196, 47, 125, 4, 1, 196, 49, - 125, 4, 1, 196, 82, 125, 4, 1, 205, 123, 142, 125, 4, 1, 195, 217, 125, - 4, 1, 4, 195, 182, 125, 4, 1, 4, 195, 183, 3, 203, 135, 125, 4, 1, 196, - 3, 125, 4, 1, 226, 6, 4, 195, 182, 125, 4, 1, 248, 171, 195, 182, 125, 4, - 1, 226, 6, 248, 171, 195, 182, 125, 4, 1, 235, 103, 125, 4, 1, 225, 219, - 125, 4, 1, 206, 153, 125, 4, 1, 201, 155, 63, 125, 4, 1, 222, 216, 218, - 59, 8, 6, 1, 223, 100, 3, 52, 154, 8, 4, 1, 223, 100, 3, 52, 154, 8, 6, - 1, 223, 100, 3, 112, 202, 84, 8, 6, 1, 214, 4, 3, 106, 8, 6, 1, 211, 32, - 3, 203, 135, 8, 4, 1, 39, 3, 106, 8, 4, 1, 203, 217, 3, 239, 147, 106, 8, - 6, 1, 233, 16, 3, 239, 195, 8, 4, 1, 233, 16, 3, 239, 195, 8, 6, 1, 225, - 81, 3, 239, 195, 8, 4, 1, 225, 81, 3, 239, 195, 8, 6, 1, 195, 159, 3, - 239, 195, 8, 4, 1, 195, 159, 3, 239, 195, 8, 6, 1, 251, 134, 8, 6, 1, - 221, 137, 3, 122, 8, 6, 1, 163, 63, 8, 6, 1, 163, 251, 134, 8, 4, 1, 199, - 231, 3, 53, 122, 8, 6, 1, 197, 200, 3, 122, 8, 4, 1, 197, 200, 3, 122, 8, - 4, 1, 199, 231, 3, 241, 21, 8, 6, 1, 157, 233, 15, 8, 4, 1, 157, 233, 15, - 8, 4, 1, 203, 133, 212, 246, 8, 4, 1, 237, 136, 3, 216, 16, 8, 4, 1, 163, - 211, 32, 3, 203, 135, 8, 4, 1, 177, 3, 126, 210, 3, 226, 41, 8, 1, 4, 6, - 163, 69, 8, 204, 143, 4, 1, 225, 217, 73, 1, 6, 199, 230, 8, 6, 1, 209, - 81, 3, 204, 63, 203, 135, 8, 6, 1, 195, 159, 3, 204, 63, 203, 135, 88, 6, - 1, 251, 158, 88, 4, 1, 251, 158, 88, 6, 1, 199, 31, 88, 4, 1, 199, 31, - 88, 6, 1, 234, 94, 88, 4, 1, 234, 94, 88, 6, 1, 240, 103, 88, 4, 1, 240, - 103, 88, 6, 1, 237, 32, 88, 4, 1, 237, 32, 88, 6, 1, 205, 164, 88, 4, 1, - 205, 164, 88, 6, 1, 195, 96, 88, 4, 1, 195, 96, 88, 6, 1, 232, 162, 88, - 4, 1, 232, 162, 88, 6, 1, 202, 197, 88, 4, 1, 202, 197, 88, 6, 1, 230, - 207, 88, 4, 1, 230, 207, 88, 6, 1, 225, 7, 88, 4, 1, 225, 7, 88, 6, 1, - 222, 211, 88, 4, 1, 222, 211, 88, 6, 1, 219, 78, 88, 4, 1, 219, 78, 88, - 6, 1, 216, 223, 88, 4, 1, 216, 223, 88, 6, 1, 223, 203, 88, 4, 1, 223, - 203, 88, 6, 1, 72, 88, 4, 1, 72, 88, 6, 1, 212, 220, 88, 4, 1, 212, 220, - 88, 6, 1, 209, 232, 88, 4, 1, 209, 232, 88, 6, 1, 206, 74, 88, 4, 1, 206, - 74, 88, 6, 1, 203, 89, 88, 4, 1, 203, 89, 88, 6, 1, 200, 114, 88, 4, 1, - 200, 114, 88, 6, 1, 235, 153, 88, 4, 1, 235, 153, 88, 6, 1, 224, 124, 88, - 4, 1, 224, 124, 88, 6, 1, 211, 238, 88, 4, 1, 211, 238, 88, 6, 1, 214, - 96, 88, 4, 1, 214, 96, 88, 6, 1, 239, 145, 251, 164, 88, 4, 1, 239, 145, - 251, 164, 88, 6, 1, 37, 88, 251, 194, 88, 4, 1, 37, 88, 251, 194, 88, 6, - 1, 241, 44, 237, 32, 88, 4, 1, 241, 44, 237, 32, 88, 6, 1, 239, 145, 225, - 7, 88, 4, 1, 239, 145, 225, 7, 88, 6, 1, 239, 145, 216, 223, 88, 4, 1, - 239, 145, 216, 223, 88, 6, 1, 241, 44, 216, 223, 88, 4, 1, 241, 44, 216, - 223, 88, 6, 1, 37, 88, 214, 96, 88, 4, 1, 37, 88, 214, 96, 88, 6, 1, 208, - 222, 88, 4, 1, 208, 222, 88, 6, 1, 241, 59, 206, 247, 88, 4, 1, 241, 59, - 206, 247, 88, 6, 1, 37, 88, 206, 247, 88, 4, 1, 37, 88, 206, 247, 88, 6, - 1, 37, 88, 236, 141, 88, 4, 1, 37, 88, 236, 141, 88, 6, 1, 251, 177, 224, - 129, 88, 4, 1, 251, 177, 224, 129, 88, 6, 1, 239, 145, 231, 156, 88, 4, - 1, 239, 145, 231, 156, 88, 6, 1, 37, 88, 231, 156, 88, 4, 1, 37, 88, 231, - 156, 88, 6, 1, 37, 88, 142, 88, 4, 1, 37, 88, 142, 88, 6, 1, 223, 99, - 142, 88, 4, 1, 223, 99, 142, 88, 6, 1, 37, 88, 232, 112, 88, 4, 1, 37, - 88, 232, 112, 88, 6, 1, 37, 88, 232, 165, 88, 4, 1, 37, 88, 232, 165, 88, - 6, 1, 37, 88, 234, 89, 88, 4, 1, 37, 88, 234, 89, 88, 6, 1, 37, 88, 239, - 47, 88, 4, 1, 37, 88, 239, 47, 88, 6, 1, 37, 88, 206, 213, 88, 4, 1, 37, - 88, 206, 213, 88, 6, 1, 37, 215, 153, 206, 213, 88, 4, 1, 37, 215, 153, - 206, 213, 88, 6, 1, 37, 215, 153, 217, 19, 88, 4, 1, 37, 215, 153, 217, - 19, 88, 6, 1, 37, 215, 153, 215, 89, 88, 4, 1, 37, 215, 153, 215, 89, 88, - 6, 1, 37, 215, 153, 197, 124, 88, 4, 1, 37, 215, 153, 197, 124, 88, 16, - 225, 31, 88, 16, 219, 79, 209, 232, 88, 16, 212, 221, 209, 232, 88, 16, - 204, 252, 88, 16, 203, 90, 209, 232, 88, 16, 224, 125, 209, 232, 88, 16, - 206, 214, 206, 74, 88, 6, 1, 241, 44, 206, 247, 88, 4, 1, 241, 44, 206, - 247, 88, 6, 1, 241, 44, 234, 89, 88, 4, 1, 241, 44, 234, 89, 88, 38, 216, - 224, 57, 88, 38, 205, 116, 250, 187, 88, 38, 205, 116, 222, 148, 88, 6, - 1, 248, 109, 224, 129, 88, 4, 1, 248, 109, 224, 129, 88, 37, 215, 153, - 234, 217, 204, 226, 88, 37, 215, 153, 239, 86, 211, 79, 78, 88, 37, 215, - 153, 226, 66, 211, 79, 78, 88, 37, 215, 153, 199, 102, 239, 59, 88, 191, - 97, 232, 225, 88, 234, 217, 204, 226, 88, 218, 185, 239, 59, 94, 4, 1, - 251, 106, 94, 4, 1, 249, 93, 94, 4, 1, 234, 93, 94, 4, 1, 239, 6, 94, 4, - 1, 236, 230, 94, 4, 1, 199, 16, 94, 4, 1, 195, 82, 94, 4, 1, 203, 114, - 94, 4, 1, 226, 86, 94, 4, 1, 225, 17, 94, 4, 1, 222, 222, 94, 4, 1, 220, - 62, 94, 4, 1, 217, 211, 94, 4, 1, 214, 119, 94, 4, 1, 213, 157, 94, 4, 1, - 195, 70, 94, 4, 1, 210, 229, 94, 4, 1, 208, 219, 94, 4, 1, 203, 101, 94, - 4, 1, 200, 72, 94, 4, 1, 212, 254, 94, 4, 1, 224, 134, 94, 4, 1, 233, - 221, 94, 4, 1, 211, 144, 94, 4, 1, 206, 211, 94, 4, 1, 245, 62, 94, 4, 1, - 247, 142, 94, 4, 1, 225, 162, 94, 4, 1, 245, 0, 94, 4, 1, 247, 0, 94, 4, - 1, 196, 206, 94, 4, 1, 225, 177, 94, 4, 1, 232, 242, 94, 4, 1, 232, 147, - 94, 4, 1, 232, 58, 94, 4, 1, 197, 109, 94, 4, 1, 232, 175, 94, 4, 1, 231, - 181, 94, 4, 1, 196, 5, 94, 4, 1, 251, 234, 202, 104, 1, 164, 202, 104, 1, - 196, 125, 202, 104, 1, 196, 124, 202, 104, 1, 196, 114, 202, 104, 1, 196, - 112, 202, 104, 1, 248, 212, 252, 24, 196, 107, 202, 104, 1, 196, 107, - 202, 104, 1, 196, 122, 202, 104, 1, 196, 119, 202, 104, 1, 196, 121, 202, - 104, 1, 196, 120, 202, 104, 1, 196, 29, 202, 104, 1, 196, 116, 202, 104, - 1, 196, 105, 202, 104, 1, 201, 32, 196, 105, 202, 104, 1, 196, 102, 202, - 104, 1, 196, 110, 202, 104, 1, 248, 212, 252, 24, 196, 110, 202, 104, 1, - 201, 32, 196, 110, 202, 104, 1, 196, 109, 202, 104, 1, 196, 129, 202, - 104, 1, 196, 103, 202, 104, 1, 201, 32, 196, 103, 202, 104, 1, 196, 92, - 202, 104, 1, 201, 32, 196, 92, 202, 104, 1, 196, 24, 202, 104, 1, 196, - 71, 202, 104, 1, 251, 207, 196, 71, 202, 104, 1, 201, 32, 196, 71, 202, - 104, 1, 196, 101, 202, 104, 1, 196, 100, 202, 104, 1, 196, 97, 202, 104, - 1, 201, 32, 196, 111, 202, 104, 1, 201, 32, 196, 95, 202, 104, 1, 196, - 93, 202, 104, 1, 195, 217, 202, 104, 1, 196, 90, 202, 104, 1, 196, 88, - 202, 104, 1, 196, 113, 202, 104, 1, 201, 32, 196, 113, 202, 104, 1, 250, - 118, 196, 113, 202, 104, 1, 196, 87, 202, 104, 1, 196, 85, 202, 104, 1, - 196, 86, 202, 104, 1, 196, 84, 202, 104, 1, 196, 83, 202, 104, 1, 196, - 123, 202, 104, 1, 196, 81, 202, 104, 1, 196, 79, 202, 104, 1, 196, 78, - 202, 104, 1, 196, 75, 202, 104, 1, 196, 72, 202, 104, 1, 203, 80, 196, - 72, 202, 104, 1, 196, 70, 202, 104, 1, 196, 69, 202, 104, 1, 196, 3, 202, - 104, 73, 1, 223, 72, 78, 202, 104, 207, 91, 78, 202, 104, 108, 225, 124, - 35, 5, 222, 6, 35, 5, 218, 244, 35, 5, 209, 224, 35, 5, 205, 192, 35, 5, - 206, 197, 35, 5, 248, 115, 35, 5, 202, 22, 35, 5, 244, 181, 35, 5, 216, - 43, 35, 5, 215, 72, 35, 5, 233, 152, 214, 190, 35, 5, 195, 10, 35, 5, - 239, 26, 35, 5, 240, 10, 35, 5, 225, 128, 35, 5, 202, 168, 35, 5, 245, - 48, 35, 5, 212, 233, 35, 5, 212, 116, 35, 5, 233, 236, 35, 5, 233, 232, - 35, 5, 233, 233, 35, 5, 233, 234, 35, 5, 205, 80, 35, 5, 205, 34, 35, 5, - 205, 47, 35, 5, 205, 79, 35, 5, 205, 52, 35, 5, 205, 53, 35, 5, 205, 39, - 35, 5, 247, 80, 35, 5, 247, 59, 35, 5, 247, 61, 35, 5, 247, 79, 35, 5, - 247, 77, 35, 5, 247, 78, 35, 5, 247, 60, 35, 5, 194, 228, 35, 5, 194, - 206, 35, 5, 194, 219, 35, 5, 194, 227, 35, 5, 194, 222, 35, 5, 194, 223, - 35, 5, 194, 211, 35, 5, 247, 75, 35, 5, 247, 62, 35, 5, 247, 64, 35, 5, - 247, 74, 35, 5, 247, 72, 35, 5, 247, 73, 35, 5, 247, 63, 35, 5, 211, 44, - 35, 5, 211, 34, 35, 5, 211, 40, 35, 5, 211, 43, 35, 5, 211, 41, 35, 5, - 211, 42, 35, 5, 211, 39, 35, 5, 223, 110, 35, 5, 223, 102, 35, 5, 223, - 105, 35, 5, 223, 109, 35, 5, 223, 106, 35, 5, 223, 107, 35, 5, 223, 103, - 35, 5, 196, 164, 35, 5, 196, 151, 35, 5, 196, 159, 35, 5, 196, 163, 35, - 5, 196, 161, 35, 5, 196, 162, 35, 5, 196, 158, 35, 5, 233, 27, 35, 5, - 233, 17, 35, 5, 233, 20, 35, 5, 233, 26, 35, 5, 233, 22, 35, 5, 233, 23, - 35, 5, 233, 19, 38, 40, 1, 249, 9, 38, 40, 1, 199, 118, 38, 40, 1, 233, - 216, 38, 40, 1, 239, 252, 38, 40, 1, 195, 65, 38, 40, 1, 195, 88, 38, 40, - 1, 155, 38, 40, 1, 237, 7, 38, 40, 1, 236, 241, 38, 40, 1, 236, 230, 38, - 40, 1, 72, 38, 40, 1, 213, 92, 38, 40, 1, 236, 163, 38, 40, 1, 236, 151, - 38, 40, 1, 203, 68, 38, 40, 1, 142, 38, 40, 1, 201, 107, 38, 40, 1, 245, - 103, 38, 40, 1, 207, 50, 38, 40, 1, 207, 2, 38, 40, 1, 235, 103, 38, 40, - 1, 236, 147, 38, 40, 1, 63, 38, 40, 1, 226, 147, 38, 40, 1, 239, 45, 38, - 40, 1, 218, 203, 200, 87, 38, 40, 1, 196, 84, 38, 40, 1, 195, 217, 38, - 40, 1, 226, 5, 63, 38, 40, 1, 222, 47, 195, 182, 38, 40, 1, 248, 171, - 195, 182, 38, 40, 1, 226, 5, 248, 171, 195, 182, 53, 251, 91, 204, 138, - 220, 24, 53, 251, 91, 237, 250, 204, 138, 220, 24, 50, 204, 138, 179, 53, - 204, 138, 179, 50, 237, 250, 204, 138, 179, 53, 237, 250, 204, 138, 179, - 210, 215, 226, 28, 220, 24, 210, 215, 237, 250, 226, 28, 220, 24, 237, - 250, 201, 199, 220, 24, 50, 201, 199, 179, 53, 201, 199, 179, 210, 215, - 205, 94, 50, 210, 215, 214, 121, 179, 53, 210, 215, 214, 121, 179, 237, - 55, 241, 98, 213, 152, 235, 26, 213, 152, 210, 89, 235, 26, 213, 152, - 231, 4, 237, 250, 214, 185, 237, 231, 251, 101, 200, 24, 251, 101, 237, - 250, 210, 17, 251, 90, 52, 214, 182, 231, 7, 226, 17, 226, 26, 213, 207, - 248, 57, 231, 8, 3, 239, 150, 202, 85, 3, 210, 3, 57, 50, 126, 213, 143, - 179, 53, 126, 213, 143, 179, 202, 85, 3, 76, 57, 202, 85, 3, 76, 60, 50, - 83, 249, 80, 3, 211, 73, 53, 83, 249, 80, 3, 211, 73, 201, 243, 50, 157, - 179, 201, 243, 53, 157, 179, 248, 85, 50, 157, 179, 248, 85, 53, 157, - 179, 50, 206, 96, 118, 179, 53, 206, 96, 118, 179, 50, 52, 213, 140, 53, - 52, 213, 140, 99, 238, 251, 127, 97, 76, 211, 213, 97, 76, 127, 99, 238, - 251, 211, 213, 103, 235, 7, 76, 211, 213, 235, 101, 76, 78, 210, 89, 211, - 79, 78, 83, 202, 84, 210, 3, 212, 110, 197, 9, 207, 91, 112, 238, 253, - 163, 244, 159, 210, 215, 238, 253, 210, 215, 244, 159, 163, 207, 105, - 240, 119, 3, 50, 233, 70, 240, 119, 3, 53, 233, 70, 163, 240, 118, 201, - 243, 157, 208, 133, 55, 200, 216, 240, 65, 202, 152, 240, 65, 204, 242, - 234, 217, 204, 226, 83, 206, 29, 238, 250, 197, 56, 83, 222, 75, 247, - 123, 52, 231, 7, 210, 89, 244, 159, 52, 221, 204, 211, 62, 78, 240, 66, - 3, 50, 200, 27, 52, 204, 77, 78, 226, 17, 126, 224, 221, 226, 17, 126, - 224, 222, 3, 224, 222, 57, 126, 224, 221, 126, 224, 222, 3, 238, 253, 52, - 205, 19, 244, 159, 237, 250, 205, 177, 201, 165, 240, 118, 219, 191, 244, - 159, 213, 151, 78, 211, 212, 236, 254, 78, 241, 99, 199, 102, 239, 59, - 12, 44, 210, 119, 12, 44, 244, 214, 12, 44, 208, 136, 100, 12, 44, 208, - 136, 102, 12, 44, 208, 136, 134, 12, 44, 213, 28, 12, 44, 248, 70, 12, - 44, 203, 152, 12, 44, 224, 22, 100, 12, 44, 224, 22, 102, 12, 44, 239, - 56, 12, 44, 208, 140, 12, 44, 4, 100, 12, 44, 4, 102, 12, 44, 222, 244, - 100, 12, 44, 222, 244, 102, 12, 44, 222, 244, 134, 12, 44, 222, 244, 136, - 12, 44, 205, 212, 12, 44, 202, 156, 12, 44, 205, 209, 100, 12, 44, 205, - 209, 102, 12, 44, 232, 127, 100, 12, 44, 232, 127, 102, 12, 44, 232, 209, - 12, 44, 210, 204, 12, 44, 245, 45, 12, 44, 204, 111, 12, 44, 218, 189, - 12, 44, 239, 249, 12, 44, 218, 178, 12, 44, 244, 232, 12, 44, 197, 128, - 100, 12, 44, 197, 128, 102, 12, 44, 235, 118, 12, 44, 213, 105, 100, 12, - 44, 213, 105, 102, 12, 44, 206, 69, 157, 201, 191, 201, 118, 12, 44, 241, - 83, 12, 44, 239, 17, 12, 44, 225, 209, 12, 44, 248, 108, 77, 244, 197, - 12, 44, 236, 67, 12, 44, 205, 118, 100, 12, 44, 205, 118, 102, 12, 44, - 249, 95, 12, 44, 206, 76, 12, 44, 247, 204, 206, 76, 12, 44, 217, 89, - 100, 12, 44, 217, 89, 102, 12, 44, 217, 89, 134, 12, 44, 217, 89, 136, - 12, 44, 219, 150, 12, 44, 206, 249, 12, 44, 210, 210, 12, 44, 236, 97, - 12, 44, 214, 133, 12, 44, 248, 29, 100, 12, 44, 248, 29, 102, 12, 44, - 219, 199, 12, 44, 218, 184, 12, 44, 233, 104, 100, 12, 44, 233, 104, 102, - 12, 44, 233, 104, 134, 12, 44, 202, 102, 12, 44, 244, 196, 12, 44, 197, - 89, 100, 12, 44, 197, 89, 102, 12, 44, 247, 204, 208, 129, 12, 44, 206, - 69, 231, 102, 12, 44, 231, 102, 12, 44, 247, 204, 205, 131, 12, 44, 247, - 204, 206, 244, 12, 44, 235, 37, 12, 44, 247, 204, 247, 99, 12, 44, 206, - 69, 197, 150, 12, 44, 197, 151, 100, 12, 44, 197, 151, 102, 12, 44, 244, - 235, 12, 44, 247, 204, 233, 135, 12, 44, 181, 100, 12, 44, 181, 102, 12, - 44, 247, 204, 221, 240, 12, 44, 247, 204, 234, 74, 12, 44, 218, 173, 100, - 12, 44, 218, 173, 102, 12, 44, 210, 217, 12, 44, 248, 118, 12, 44, 247, - 204, 203, 107, 222, 190, 12, 44, 247, 204, 222, 192, 12, 44, 247, 204, - 197, 50, 12, 44, 247, 204, 235, 55, 12, 44, 237, 66, 100, 12, 44, 237, - 66, 102, 12, 44, 237, 66, 134, 12, 44, 247, 204, 237, 65, 12, 44, 232, - 137, 12, 44, 247, 204, 231, 98, 12, 44, 248, 104, 12, 44, 233, 200, 12, - 44, 247, 204, 235, 111, 12, 44, 247, 204, 248, 156, 12, 44, 247, 204, - 208, 233, 12, 44, 206, 69, 197, 79, 12, 44, 206, 69, 196, 61, 12, 44, - 247, 204, 234, 236, 12, 44, 225, 216, 236, 102, 12, 44, 247, 204, 236, - 102, 12, 44, 225, 216, 201, 244, 12, 44, 247, 204, 201, 244, 12, 44, 225, - 216, 237, 223, 12, 44, 247, 204, 237, 223, 12, 44, 201, 1, 12, 44, 225, - 216, 201, 1, 12, 44, 247, 204, 201, 1, 79, 44, 100, 79, 44, 222, 75, 79, - 44, 238, 253, 79, 44, 205, 248, 79, 44, 208, 135, 79, 44, 122, 79, 44, - 102, 79, 44, 222, 104, 79, 44, 220, 62, 79, 44, 222, 169, 79, 44, 236, - 204, 79, 44, 171, 79, 44, 135, 248, 70, 79, 44, 241, 86, 79, 44, 230, - 201, 79, 44, 203, 152, 79, 44, 192, 248, 70, 79, 44, 224, 21, 79, 44, - 212, 58, 79, 44, 196, 255, 79, 44, 205, 107, 79, 44, 53, 192, 248, 70, - 79, 44, 232, 59, 236, 225, 79, 44, 203, 23, 79, 44, 239, 56, 79, 44, 208, - 140, 79, 44, 244, 214, 79, 44, 212, 8, 79, 44, 251, 216, 79, 44, 218, - 164, 79, 44, 236, 225, 79, 44, 237, 72, 79, 44, 208, 168, 79, 44, 233, - 144, 79, 44, 233, 145, 205, 226, 79, 44, 236, 101, 79, 44, 248, 170, 79, - 44, 197, 21, 79, 44, 245, 66, 79, 44, 209, 205, 79, 44, 226, 82, 79, 44, - 205, 224, 79, 44, 222, 243, 79, 44, 241, 96, 79, 44, 205, 98, 79, 44, - 218, 169, 79, 44, 209, 246, 79, 44, 197, 6, 79, 44, 214, 110, 79, 44, - 201, 9, 79, 44, 237, 203, 79, 44, 206, 182, 202, 156, 79, 44, 237, 250, - 244, 214, 79, 44, 181, 204, 202, 79, 44, 99, 232, 184, 79, 44, 206, 188, - 79, 44, 248, 77, 79, 44, 205, 208, 79, 44, 248, 36, 79, 44, 204, 241, 79, - 44, 232, 126, 79, 44, 232, 226, 79, 44, 239, 1, 79, 44, 232, 209, 79, 44, - 248, 57, 79, 44, 210, 204, 79, 44, 208, 153, 79, 44, 239, 88, 79, 44, - 250, 123, 79, 44, 205, 94, 79, 44, 216, 18, 79, 44, 204, 111, 79, 44, - 208, 180, 79, 44, 218, 189, 79, 44, 201, 190, 79, 44, 223, 68, 79, 44, - 204, 226, 79, 44, 239, 249, 79, 44, 197, 104, 79, 44, 239, 29, 216, 18, - 79, 44, 244, 155, 79, 44, 234, 210, 79, 44, 244, 226, 79, 44, 204, 247, - 79, 44, 197, 127, 79, 44, 235, 118, 79, 44, 244, 222, 79, 44, 235, 196, - 79, 44, 52, 196, 222, 79, 44, 157, 201, 191, 201, 118, 79, 44, 205, 239, - 79, 44, 235, 208, 79, 44, 241, 83, 79, 44, 239, 17, 79, 44, 212, 4, 79, - 44, 225, 209, 79, 44, 219, 173, 79, 44, 202, 83, 79, 44, 204, 58, 79, 44, - 222, 98, 79, 44, 200, 2, 79, 44, 235, 151, 79, 44, 248, 108, 77, 244, - 197, 79, 44, 206, 102, 79, 44, 237, 250, 203, 15, 79, 44, 197, 73, 79, - 44, 206, 1, 79, 44, 239, 75, 79, 44, 236, 67, 79, 44, 205, 134, 79, 44, - 51, 79, 44, 204, 228, 79, 44, 205, 117, 79, 44, 201, 216, 79, 44, 233, - 113, 79, 44, 247, 85, 79, 44, 205, 12, 79, 44, 249, 95, 79, 44, 210, 60, - 79, 44, 206, 76, 79, 44, 225, 201, 79, 44, 217, 88, 79, 44, 206, 249, 79, - 44, 235, 184, 79, 44, 214, 133, 79, 44, 251, 100, 79, 44, 212, 132, 79, - 44, 237, 76, 79, 44, 248, 28, 79, 44, 219, 199, 79, 44, 219, 17, 79, 44, - 207, 112, 79, 44, 250, 221, 79, 44, 218, 184, 79, 44, 201, 249, 79, 44, - 214, 80, 79, 44, 248, 112, 79, 44, 204, 224, 79, 44, 244, 167, 79, 44, - 233, 103, 79, 44, 202, 102, 79, 44, 226, 45, 79, 44, 248, 124, 79, 44, - 197, 151, 236, 225, 79, 44, 244, 196, 79, 44, 197, 88, 79, 44, 208, 129, - 79, 44, 231, 102, 79, 44, 205, 131, 79, 44, 199, 144, 79, 44, 249, 4, 79, - 44, 212, 184, 79, 44, 249, 125, 79, 44, 206, 244, 79, 44, 210, 157, 79, - 44, 209, 117, 79, 44, 235, 37, 79, 44, 248, 110, 79, 44, 247, 99, 79, 44, - 248, 141, 79, 44, 218, 186, 79, 44, 197, 150, 79, 44, 244, 235, 79, 44, - 197, 46, 79, 44, 239, 67, 79, 44, 199, 17, 79, 44, 233, 135, 79, 44, 221, - 240, 79, 44, 234, 74, 79, 44, 218, 172, 79, 44, 205, 247, 79, 44, 206, - 182, 203, 134, 248, 156, 79, 44, 210, 217, 79, 44, 248, 118, 79, 44, 196, - 245, 79, 44, 235, 233, 79, 44, 222, 190, 79, 44, 203, 107, 222, 190, 79, - 44, 222, 186, 79, 44, 205, 161, 79, 44, 222, 192, 79, 44, 197, 50, 79, - 44, 235, 55, 79, 44, 237, 65, 79, 44, 232, 137, 79, 44, 234, 252, 79, 44, - 231, 98, 79, 44, 248, 104, 79, 44, 203, 119, 79, 44, 232, 233, 79, 44, - 235, 144, 79, 44, 209, 10, 197, 46, 79, 44, 247, 87, 79, 44, 233, 200, - 79, 44, 235, 111, 79, 44, 248, 156, 79, 44, 208, 233, 79, 44, 239, 234, - 79, 44, 197, 79, 79, 44, 232, 102, 79, 44, 196, 61, 79, 44, 219, 28, 79, - 44, 248, 136, 79, 44, 236, 237, 79, 44, 234, 236, 79, 44, 201, 162, 79, - 44, 237, 206, 79, 44, 210, 198, 79, 44, 216, 20, 79, 44, 236, 102, 79, - 44, 201, 244, 79, 44, 237, 223, 79, 44, 201, 1, 79, 44, 235, 58, 143, - 239, 193, 190, 50, 202, 30, 210, 22, 143, 239, 193, 190, 90, 202, 30, 60, - 143, 239, 193, 190, 50, 202, 30, 112, 26, 210, 22, 143, 239, 193, 190, - 90, 202, 30, 112, 26, 60, 143, 239, 193, 190, 234, 217, 204, 81, 143, - 239, 193, 190, 204, 82, 234, 235, 57, 143, 239, 193, 190, 204, 82, 234, - 235, 60, 143, 239, 193, 190, 204, 82, 234, 235, 222, 184, 143, 239, 193, - 190, 204, 82, 234, 235, 200, 33, 222, 184, 143, 239, 193, 190, 204, 82, - 234, 235, 200, 33, 210, 22, 143, 239, 193, 190, 204, 82, 234, 235, 221, - 203, 222, 184, 143, 239, 193, 190, 214, 24, 143, 205, 148, 143, 244, 159, - 143, 234, 217, 204, 226, 239, 64, 78, 225, 202, 226, 65, 205, 11, 105, - 143, 225, 232, 78, 143, 244, 199, 78, 143, 31, 195, 79, 50, 251, 91, 179, - 53, 251, 91, 179, 50, 52, 251, 91, 179, 53, 52, 251, 91, 179, 50, 241, - 102, 179, 53, 241, 102, 179, 50, 59, 241, 102, 179, 53, 59, 241, 102, - 179, 50, 58, 222, 147, 179, 53, 58, 222, 147, 179, 212, 72, 78, 234, 13, - 78, 50, 201, 231, 206, 245, 179, 53, 201, 231, 206, 245, 179, 50, 59, - 222, 147, 179, 53, 59, 222, 147, 179, 50, 59, 201, 231, 206, 245, 179, - 53, 59, 201, 231, 206, 245, 179, 50, 59, 47, 179, 53, 59, 47, 179, 197, - 123, 240, 65, 210, 89, 52, 212, 20, 211, 62, 78, 52, 212, 20, 211, 62, - 78, 126, 52, 212, 20, 211, 62, 78, 212, 72, 117, 235, 233, 232, 181, 215, - 142, 100, 232, 181, 215, 142, 102, 232, 181, 215, 142, 134, 232, 181, - 215, 142, 136, 232, 181, 215, 142, 146, 232, 181, 215, 142, 167, 232, - 181, 215, 142, 178, 232, 181, 215, 142, 171, 232, 181, 215, 142, 182, - 143, 222, 128, 152, 78, 143, 209, 250, 152, 78, 143, 239, 202, 152, 78, - 143, 236, 203, 152, 78, 29, 206, 62, 76, 152, 78, 29, 52, 76, 152, 78, - 197, 119, 240, 65, 83, 225, 16, 210, 120, 78, 83, 225, 16, 210, 120, 3, - 198, 244, 205, 162, 78, 83, 225, 16, 210, 120, 117, 200, 33, 232, 225, - 83, 225, 16, 210, 120, 3, 198, 244, 205, 162, 117, 200, 33, 232, 225, 83, - 225, 16, 210, 120, 117, 221, 203, 232, 225, 46, 212, 72, 78, 143, 203, - 36, 222, 76, 235, 181, 207, 91, 105, 232, 181, 215, 142, 203, 23, 232, - 181, 215, 142, 200, 234, 232, 181, 215, 142, 202, 177, 83, 143, 225, 232, - 78, 220, 5, 78, 213, 134, 251, 127, 78, 143, 62, 226, 68, 143, 157, 235, - 137, 205, 148, 188, 1, 4, 63, 188, 1, 63, 188, 1, 4, 68, 188, 1, 68, 188, - 1, 4, 66, 188, 1, 66, 188, 1, 4, 69, 188, 1, 69, 188, 1, 4, 72, 188, 1, - 72, 188, 1, 155, 188, 1, 234, 123, 188, 1, 224, 101, 188, 1, 233, 192, - 188, 1, 223, 187, 188, 1, 233, 76, 188, 1, 224, 209, 188, 1, 234, 48, - 188, 1, 224, 11, 188, 1, 233, 144, 188, 1, 183, 188, 1, 195, 115, 188, 1, - 206, 112, 188, 1, 195, 33, 188, 1, 204, 172, 188, 1, 194, 255, 188, 1, - 208, 147, 188, 1, 195, 88, 188, 1, 205, 200, 188, 1, 195, 11, 188, 1, - 189, 188, 1, 240, 136, 188, 1, 202, 122, 188, 1, 239, 152, 188, 1, 4, - 201, 40, 188, 1, 201, 40, 188, 1, 237, 201, 188, 1, 203, 68, 188, 1, 239, - 252, 188, 1, 149, 188, 1, 239, 28, 188, 1, 176, 188, 1, 216, 223, 188, 1, - 215, 186, 188, 1, 217, 118, 188, 1, 216, 50, 188, 1, 142, 188, 1, 249, - 145, 188, 1, 161, 188, 1, 232, 71, 188, 1, 248, 184, 188, 1, 212, 220, - 188, 1, 231, 75, 188, 1, 248, 21, 188, 1, 211, 227, 188, 1, 232, 147, - 188, 1, 249, 9, 188, 1, 213, 92, 188, 1, 231, 193, 188, 1, 248, 116, 188, - 1, 212, 117, 188, 1, 166, 188, 1, 219, 78, 188, 1, 218, 145, 188, 1, 219, - 207, 188, 1, 218, 251, 188, 1, 4, 164, 188, 1, 164, 188, 1, 4, 195, 217, - 188, 1, 195, 217, 188, 1, 4, 196, 3, 188, 1, 196, 3, 188, 1, 169, 188, 1, - 210, 72, 188, 1, 209, 140, 188, 1, 210, 183, 188, 1, 209, 232, 188, 1, 4, - 197, 166, 188, 1, 197, 166, 188, 1, 197, 70, 188, 1, 197, 109, 188, 1, - 197, 34, 188, 1, 218, 55, 188, 1, 197, 220, 188, 1, 4, 155, 188, 1, 4, - 224, 209, 38, 224, 234, 198, 244, 205, 162, 78, 38, 224, 234, 207, 110, - 205, 162, 78, 224, 234, 198, 244, 205, 162, 78, 224, 234, 207, 110, 205, - 162, 78, 188, 225, 232, 78, 188, 198, 244, 225, 232, 78, 188, 239, 111, - 195, 233, 224, 234, 52, 231, 7, 71, 1, 4, 63, 71, 1, 63, 71, 1, 4, 68, - 71, 1, 68, 71, 1, 4, 66, 71, 1, 66, 71, 1, 4, 69, 71, 1, 69, 71, 1, 4, - 72, 71, 1, 72, 71, 1, 155, 71, 1, 234, 123, 71, 1, 224, 101, 71, 1, 233, - 192, 71, 1, 223, 187, 71, 1, 233, 76, 71, 1, 224, 209, 71, 1, 234, 48, - 71, 1, 224, 11, 71, 1, 233, 144, 71, 1, 183, 71, 1, 195, 115, 71, 1, 206, - 112, 71, 1, 195, 33, 71, 1, 204, 172, 71, 1, 194, 255, 71, 1, 208, 147, - 71, 1, 195, 88, 71, 1, 205, 200, 71, 1, 195, 11, 71, 1, 189, 71, 1, 240, - 136, 71, 1, 202, 122, 71, 1, 239, 152, 71, 1, 4, 201, 40, 71, 1, 201, 40, - 71, 1, 237, 201, 71, 1, 203, 68, 71, 1, 239, 252, 71, 1, 149, 71, 1, 239, - 28, 71, 1, 176, 71, 1, 216, 223, 71, 1, 215, 186, 71, 1, 217, 118, 71, 1, - 216, 50, 71, 1, 142, 71, 1, 249, 145, 71, 1, 161, 71, 1, 232, 71, 71, 1, - 248, 184, 71, 1, 212, 220, 71, 1, 231, 75, 71, 1, 248, 21, 71, 1, 211, - 227, 71, 1, 232, 147, 71, 1, 249, 9, 71, 1, 213, 92, 71, 1, 231, 193, 71, - 1, 248, 116, 71, 1, 212, 117, 71, 1, 166, 71, 1, 219, 78, 71, 1, 218, - 145, 71, 1, 219, 207, 71, 1, 218, 251, 71, 1, 4, 164, 71, 1, 164, 71, 1, - 4, 195, 217, 71, 1, 195, 217, 71, 1, 4, 196, 3, 71, 1, 196, 3, 71, 1, - 169, 71, 1, 210, 72, 71, 1, 209, 140, 71, 1, 210, 183, 71, 1, 209, 232, - 71, 1, 4, 197, 166, 71, 1, 197, 166, 71, 1, 197, 70, 71, 1, 197, 109, 71, - 1, 197, 34, 71, 1, 218, 55, 71, 1, 197, 220, 71, 1, 4, 155, 71, 1, 4, - 224, 209, 71, 1, 199, 152, 71, 1, 199, 34, 71, 1, 199, 118, 71, 1, 198, - 248, 71, 112, 238, 253, 224, 234, 211, 252, 205, 162, 78, 71, 225, 232, - 78, 71, 198, 244, 225, 232, 78, 71, 239, 111, 223, 229, 248, 94, 1, 250, - 112, 248, 94, 1, 214, 3, 248, 94, 1, 221, 136, 248, 94, 1, 236, 49, 248, - 94, 1, 240, 231, 248, 94, 1, 203, 216, 248, 94, 1, 218, 55, 248, 94, 1, - 159, 248, 94, 1, 234, 190, 248, 94, 1, 225, 80, 248, 94, 1, 233, 15, 248, - 94, 1, 225, 217, 248, 94, 1, 211, 167, 248, 94, 1, 196, 222, 248, 94, 1, - 195, 75, 248, 94, 1, 247, 18, 248, 94, 1, 207, 52, 248, 94, 1, 144, 248, - 94, 1, 195, 158, 248, 94, 1, 247, 207, 248, 94, 1, 209, 80, 248, 94, 1, - 63, 248, 94, 1, 72, 248, 94, 1, 69, 248, 94, 1, 237, 40, 248, 94, 1, 251, - 200, 248, 94, 1, 237, 33, 248, 94, 1, 250, 150, 248, 94, 1, 214, 39, 248, - 94, 1, 251, 106, 248, 94, 1, 236, 230, 248, 94, 1, 251, 97, 248, 94, 1, - 236, 215, 248, 94, 1, 236, 163, 248, 94, 1, 68, 248, 94, 1, 66, 248, 94, - 1, 225, 230, 248, 94, 1, 199, 230, 248, 94, 1, 217, 73, 248, 94, 1, 233, - 148, 248, 94, 1, 226, 121, 248, 94, 1, 177, 3, 76, 57, 248, 94, 1, 216, - 87, 29, 1, 224, 48, 29, 1, 205, 72, 29, 1, 224, 41, 29, 1, 216, 208, 29, - 1, 216, 206, 29, 1, 216, 205, 29, 1, 202, 97, 29, 1, 205, 61, 29, 1, 210, - 54, 29, 1, 210, 49, 29, 1, 210, 46, 29, 1, 210, 39, 29, 1, 210, 34, 29, - 1, 210, 29, 29, 1, 210, 40, 29, 1, 210, 52, 29, 1, 219, 56, 29, 1, 212, - 206, 29, 1, 205, 69, 29, 1, 212, 195, 29, 1, 206, 52, 29, 1, 205, 66, 29, - 1, 226, 143, 29, 1, 245, 6, 29, 1, 205, 76, 29, 1, 245, 71, 29, 1, 224, - 122, 29, 1, 202, 191, 29, 1, 212, 244, 29, 1, 232, 55, 29, 1, 63, 29, 1, - 251, 245, 29, 1, 164, 29, 1, 196, 118, 29, 1, 236, 192, 29, 1, 69, 29, 1, - 196, 56, 29, 1, 196, 69, 29, 1, 72, 29, 1, 197, 166, 29, 1, 197, 157, 29, - 1, 214, 164, 29, 1, 196, 3, 29, 1, 66, 29, 1, 197, 91, 29, 1, 197, 109, - 29, 1, 197, 70, 29, 1, 195, 217, 29, 1, 236, 116, 29, 1, 196, 24, 29, 1, - 68, 29, 235, 134, 29, 1, 205, 70, 29, 1, 216, 198, 29, 1, 216, 200, 29, - 1, 216, 203, 29, 1, 210, 47, 29, 1, 210, 28, 29, 1, 210, 36, 29, 1, 210, - 41, 29, 1, 210, 26, 29, 1, 219, 49, 29, 1, 219, 46, 29, 1, 219, 50, 29, - 1, 225, 1, 29, 1, 212, 201, 29, 1, 212, 187, 29, 1, 212, 193, 29, 1, 212, - 190, 29, 1, 212, 204, 29, 1, 212, 188, 29, 1, 224, 255, 29, 1, 224, 253, - 29, 1, 206, 45, 29, 1, 206, 43, 29, 1, 206, 35, 29, 1, 206, 40, 29, 1, - 206, 50, 29, 1, 213, 174, 29, 1, 205, 73, 29, 1, 196, 46, 29, 1, 196, 40, - 29, 1, 196, 41, 29, 1, 225, 0, 29, 1, 205, 74, 29, 1, 196, 52, 29, 1, - 195, 247, 29, 1, 195, 246, 29, 1, 195, 249, 29, 1, 195, 204, 29, 1, 195, - 205, 29, 1, 195, 208, 29, 1, 251, 6, 29, 1, 251, 0, 143, 251, 76, 222, - 64, 78, 143, 251, 76, 210, 90, 78, 143, 251, 76, 97, 78, 143, 251, 76, - 99, 78, 143, 251, 76, 115, 78, 143, 251, 76, 235, 7, 78, 143, 251, 76, - 201, 243, 78, 143, 251, 76, 112, 78, 143, 251, 76, 248, 85, 78, 143, 251, - 76, 235, 113, 78, 143, 251, 76, 208, 136, 78, 143, 251, 76, 202, 185, 78, - 143, 251, 76, 235, 0, 78, 143, 251, 76, 232, 123, 78, 143, 251, 76, 237, - 73, 78, 143, 251, 76, 220, 63, 78, 248, 94, 1, 248, 21, 248, 94, 1, 195, - 33, 248, 94, 1, 225, 172, 248, 94, 1, 233, 76, 248, 94, 1, 237, 54, 248, - 94, 1, 236, 212, 248, 94, 1, 214, 102, 248, 94, 1, 214, 106, 248, 94, 1, - 226, 1, 248, 94, 1, 251, 78, 248, 94, 1, 226, 52, 248, 94, 1, 200, 42, - 248, 94, 1, 226, 103, 248, 94, 1, 217, 51, 248, 94, 1, 251, 193, 248, 94, - 1, 250, 145, 248, 94, 1, 251, 123, 248, 94, 1, 214, 127, 248, 94, 1, 214, - 109, 248, 94, 1, 226, 49, 248, 94, 48, 1, 214, 3, 248, 94, 48, 1, 203, - 216, 248, 94, 48, 1, 225, 80, 248, 94, 48, 1, 233, 15, 248, 94, 1, 233, - 231, 248, 94, 1, 222, 123, 248, 94, 1, 194, 235, 12, 204, 196, 203, 216, - 12, 204, 196, 197, 82, 12, 204, 196, 196, 197, 12, 204, 196, 247, 220, - 12, 204, 196, 204, 68, 12, 204, 196, 230, 253, 12, 204, 196, 231, 1, 12, - 204, 196, 231, 84, 12, 204, 196, 230, 254, 12, 204, 196, 203, 219, 12, - 204, 196, 231, 0, 12, 204, 196, 230, 252, 12, 204, 196, 231, 82, 12, 204, - 196, 230, 255, 12, 204, 196, 230, 251, 12, 204, 196, 218, 55, 12, 204, - 196, 233, 15, 12, 204, 196, 209, 80, 12, 204, 196, 214, 3, 12, 204, 196, - 205, 151, 12, 204, 196, 240, 231, 12, 204, 196, 231, 2, 12, 204, 196, - 232, 81, 12, 204, 196, 203, 228, 12, 204, 196, 204, 45, 12, 204, 196, - 205, 23, 12, 204, 196, 207, 58, 12, 204, 196, 213, 96, 12, 204, 196, 211, - 169, 12, 204, 196, 202, 31, 12, 204, 196, 203, 218, 12, 204, 196, 204, - 57, 12, 204, 196, 231, 12, 12, 204, 196, 230, 250, 12, 204, 196, 213, 8, - 12, 204, 196, 211, 167, 71, 1, 4, 223, 187, 71, 1, 4, 206, 112, 71, 1, 4, - 204, 172, 71, 1, 4, 149, 71, 1, 4, 215, 186, 71, 1, 4, 142, 71, 1, 4, - 232, 71, 71, 1, 4, 231, 75, 71, 1, 4, 232, 147, 71, 1, 4, 231, 193, 71, - 1, 4, 218, 145, 71, 1, 4, 169, 71, 1, 4, 210, 72, 71, 1, 4, 209, 140, 71, - 1, 4, 210, 183, 71, 1, 4, 209, 232, 119, 29, 224, 48, 119, 29, 216, 208, - 119, 29, 202, 97, 119, 29, 210, 54, 119, 29, 219, 56, 119, 29, 212, 206, - 119, 29, 206, 52, 119, 29, 226, 143, 119, 29, 245, 6, 119, 29, 245, 71, - 119, 29, 224, 122, 119, 29, 202, 191, 119, 29, 212, 244, 119, 29, 232, - 55, 119, 29, 224, 49, 63, 119, 29, 216, 209, 63, 119, 29, 202, 98, 63, - 119, 29, 210, 55, 63, 119, 29, 219, 57, 63, 119, 29, 212, 207, 63, 119, - 29, 206, 53, 63, 119, 29, 226, 144, 63, 119, 29, 245, 7, 63, 119, 29, - 245, 72, 63, 119, 29, 224, 123, 63, 119, 29, 202, 192, 63, 119, 29, 212, - 245, 63, 119, 29, 232, 56, 63, 119, 29, 245, 7, 66, 119, 223, 233, 190, - 214, 142, 119, 223, 233, 190, 177, 231, 75, 119, 230, 191, 100, 119, 230, - 191, 102, 119, 230, 191, 134, 119, 230, 191, 136, 119, 230, 191, 146, - 119, 230, 191, 167, 119, 230, 191, 178, 119, 230, 191, 171, 119, 230, - 191, 182, 119, 230, 191, 203, 23, 119, 230, 191, 218, 189, 119, 230, 191, - 235, 118, 119, 230, 191, 197, 127, 119, 230, 191, 197, 14, 119, 230, 191, - 219, 143, 119, 230, 191, 237, 72, 119, 230, 191, 204, 111, 119, 230, 191, - 204, 229, 119, 230, 191, 232, 156, 119, 230, 191, 205, 189, 119, 230, - 191, 217, 222, 119, 230, 191, 205, 133, 119, 230, 191, 235, 129, 119, - 230, 191, 241, 148, 119, 230, 191, 223, 71, 119, 230, 191, 210, 113, 119, - 230, 191, 247, 152, 119, 230, 191, 204, 178, 119, 230, 191, 204, 91, 119, - 230, 191, 236, 202, 119, 230, 191, 210, 103, 119, 230, 191, 251, 142, - 119, 230, 191, 235, 161, 119, 230, 191, 210, 101, 119, 230, 191, 207, - 112, 119, 230, 191, 210, 178, 46, 230, 191, 211, 78, 46, 230, 191, 224, - 75, 46, 230, 191, 208, 166, 46, 230, 191, 223, 229, 46, 31, 203, 24, 214, - 120, 58, 205, 94, 46, 31, 200, 235, 214, 120, 58, 205, 94, 46, 31, 202, - 178, 214, 120, 58, 205, 94, 46, 31, 235, 15, 214, 120, 58, 205, 94, 46, - 31, 235, 146, 214, 120, 58, 205, 94, 46, 31, 206, 14, 214, 120, 58, 205, - 94, 46, 31, 207, 66, 214, 120, 58, 205, 94, 46, 31, 237, 21, 214, 120, - 58, 205, 94, 213, 130, 55, 46, 31, 200, 235, 100, 46, 31, 200, 235, 102, - 46, 31, 200, 235, 134, 46, 31, 200, 235, 136, 46, 31, 200, 235, 146, 46, - 31, 200, 235, 167, 46, 31, 200, 235, 178, 46, 31, 200, 235, 171, 46, 31, - 200, 235, 182, 46, 31, 202, 177, 46, 31, 202, 178, 100, 46, 31, 202, 178, - 102, 46, 31, 202, 178, 134, 46, 31, 202, 178, 136, 46, 31, 202, 178, 146, - 46, 29, 224, 48, 46, 29, 216, 208, 46, 29, 202, 97, 46, 29, 210, 54, 46, - 29, 219, 56, 46, 29, 212, 206, 46, 29, 206, 52, 46, 29, 226, 143, 46, 29, - 245, 6, 46, 29, 245, 71, 46, 29, 224, 122, 46, 29, 202, 191, 46, 29, 212, - 244, 46, 29, 232, 55, 46, 29, 224, 49, 63, 46, 29, 216, 209, 63, 46, 29, - 202, 98, 63, 46, 29, 210, 55, 63, 46, 29, 219, 57, 63, 46, 29, 212, 207, - 63, 46, 29, 206, 53, 63, 46, 29, 226, 144, 63, 46, 29, 245, 7, 63, 46, - 29, 245, 72, 63, 46, 29, 224, 123, 63, 46, 29, 202, 192, 63, 46, 29, 212, - 245, 63, 46, 29, 232, 56, 63, 46, 223, 233, 190, 247, 6, 46, 223, 233, - 190, 225, 106, 46, 29, 226, 144, 66, 223, 233, 205, 11, 105, 46, 230, - 191, 100, 46, 230, 191, 102, 46, 230, 191, 134, 46, 230, 191, 136, 46, - 230, 191, 146, 46, 230, 191, 167, 46, 230, 191, 178, 46, 230, 191, 171, - 46, 230, 191, 182, 46, 230, 191, 203, 23, 46, 230, 191, 218, 189, 46, - 230, 191, 235, 118, 46, 230, 191, 197, 127, 46, 230, 191, 197, 14, 46, - 230, 191, 219, 143, 46, 230, 191, 237, 72, 46, 230, 191, 204, 111, 46, - 230, 191, 204, 229, 46, 230, 191, 232, 156, 46, 230, 191, 205, 189, 46, - 230, 191, 217, 222, 46, 230, 191, 205, 133, 46, 230, 191, 235, 129, 46, - 230, 191, 241, 148, 46, 230, 191, 223, 71, 46, 230, 191, 208, 134, 46, - 230, 191, 220, 66, 46, 230, 191, 235, 171, 46, 230, 191, 204, 123, 46, - 230, 191, 236, 94, 46, 230, 191, 212, 15, 46, 230, 191, 250, 154, 46, - 230, 191, 225, 233, 46, 230, 191, 210, 101, 46, 230, 191, 241, 107, 46, - 230, 191, 241, 95, 46, 230, 191, 232, 48, 46, 230, 191, 247, 36, 46, 230, - 191, 221, 208, 46, 230, 191, 222, 184, 46, 230, 191, 210, 22, 46, 230, - 191, 219, 192, 46, 230, 191, 210, 131, 46, 230, 191, 204, 178, 46, 230, - 191, 204, 91, 46, 230, 191, 236, 202, 46, 230, 191, 210, 103, 46, 230, - 191, 251, 142, 46, 230, 191, 216, 194, 46, 31, 202, 178, 167, 46, 31, - 202, 178, 178, 46, 31, 202, 178, 171, 46, 31, 202, 178, 182, 46, 31, 235, - 14, 46, 31, 235, 15, 100, 46, 31, 235, 15, 102, 46, 31, 235, 15, 134, 46, - 31, 235, 15, 136, 46, 31, 235, 15, 146, 46, 31, 235, 15, 167, 46, 31, - 235, 15, 178, 46, 31, 235, 15, 171, 46, 31, 235, 15, 182, 46, 31, 235, - 145, 143, 203, 36, 16, 36, 225, 204, 143, 203, 36, 16, 36, 235, 183, 143, - 203, 36, 16, 36, 220, 31, 143, 203, 36, 16, 36, 251, 20, 143, 203, 36, - 16, 36, 219, 251, 143, 203, 36, 16, 36, 225, 103, 143, 203, 36, 16, 36, - 225, 104, 143, 203, 36, 16, 36, 250, 146, 143, 203, 36, 16, 36, 207, 89, - 143, 203, 36, 16, 36, 214, 170, 143, 203, 36, 16, 36, 216, 6, 143, 203, - 36, 16, 36, 239, 246, 47, 232, 81, 47, 236, 159, 47, 236, 104, 222, 81, - 222, 108, 55, 46, 71, 63, 46, 71, 68, 46, 71, 66, 46, 71, 69, 46, 71, 72, - 46, 71, 155, 46, 71, 224, 101, 46, 71, 223, 187, 46, 71, 224, 209, 46, - 71, 224, 11, 46, 71, 183, 46, 71, 206, 112, 46, 71, 204, 172, 46, 71, - 208, 147, 46, 71, 205, 200, 46, 71, 189, 46, 71, 202, 122, 46, 71, 201, - 40, 46, 71, 203, 68, 46, 71, 149, 46, 71, 176, 46, 71, 216, 223, 46, 71, - 215, 186, 46, 71, 217, 118, 46, 71, 216, 50, 46, 71, 142, 46, 71, 232, - 71, 46, 71, 231, 75, 46, 71, 232, 147, 46, 71, 231, 193, 46, 71, 166, 46, - 71, 219, 78, 46, 71, 218, 145, 46, 71, 219, 207, 46, 71, 218, 251, 46, - 71, 164, 46, 71, 195, 217, 46, 71, 196, 3, 46, 71, 169, 46, 71, 210, 72, - 46, 71, 209, 140, 46, 71, 210, 183, 46, 71, 209, 232, 46, 71, 197, 166, - 46, 71, 197, 70, 46, 71, 197, 109, 46, 71, 197, 34, 47, 236, 162, 217, - 223, 210, 139, 47, 251, 45, 47, 250, 204, 47, 251, 72, 47, 252, 125, 47, - 226, 54, 47, 226, 21, 47, 200, 39, 47, 236, 131, 47, 237, 51, 47, 214, - 105, 47, 214, 98, 47, 225, 29, 47, 224, 249, 47, 224, 244, 47, 234, 78, - 47, 234, 88, 47, 233, 180, 47, 233, 176, 47, 223, 101, 47, 233, 167, 47, - 224, 66, 47, 224, 65, 47, 224, 64, 47, 224, 63, 47, 233, 44, 47, 233, 43, - 47, 223, 150, 47, 223, 153, 47, 224, 196, 47, 223, 231, 47, 223, 239, 47, - 208, 252, 47, 208, 210, 47, 206, 33, 47, 207, 95, 47, 207, 94, 47, 240, - 132, 47, 239, 189, 47, 238, 254, 47, 202, 13, 47, 217, 216, 47, 216, 7, - 47, 232, 230, 47, 213, 237, 47, 213, 236, 47, 249, 142, 47, 212, 217, 47, - 212, 180, 47, 212, 181, 47, 248, 152, 47, 231, 70, 47, 231, 65, 47, 247, - 235, 47, 231, 49, 47, 232, 109, 47, 213, 19, 47, 213, 60, 47, 232, 90, - 47, 213, 56, 47, 213, 74, 47, 248, 246, 47, 212, 106, 47, 248, 90, 47, - 231, 169, 47, 212, 92, 47, 231, 160, 47, 231, 162, 47, 220, 79, 47, 220, - 75, 47, 220, 84, 47, 220, 17, 47, 220, 48, 47, 219, 35, 47, 219, 10, 47, - 219, 9, 47, 219, 180, 47, 219, 177, 47, 219, 181, 47, 196, 128, 47, 196, - 126, 47, 195, 202, 47, 209, 248, 47, 209, 252, 47, 209, 107, 47, 209, - 100, 47, 210, 128, 47, 210, 125, 47, 197, 125, 143, 203, 36, 16, 36, 231, - 92, 195, 79, 143, 203, 36, 16, 36, 231, 92, 100, 143, 203, 36, 16, 36, - 231, 92, 102, 143, 203, 36, 16, 36, 231, 92, 134, 143, 203, 36, 16, 36, - 231, 92, 136, 143, 203, 36, 16, 36, 231, 92, 146, 143, 203, 36, 16, 36, - 231, 92, 167, 143, 203, 36, 16, 36, 231, 92, 178, 143, 203, 36, 16, 36, - 231, 92, 171, 143, 203, 36, 16, 36, 231, 92, 182, 143, 203, 36, 16, 36, - 231, 92, 203, 23, 143, 203, 36, 16, 36, 231, 92, 236, 252, 143, 203, 36, - 16, 36, 231, 92, 200, 239, 143, 203, 36, 16, 36, 231, 92, 202, 179, 143, - 203, 36, 16, 36, 231, 92, 235, 1, 143, 203, 36, 16, 36, 231, 92, 235, - 149, 143, 203, 36, 16, 36, 231, 92, 206, 23, 143, 203, 36, 16, 36, 231, - 92, 207, 68, 143, 203, 36, 16, 36, 231, 92, 237, 28, 143, 203, 36, 16, - 36, 231, 92, 216, 176, 143, 203, 36, 16, 36, 231, 92, 200, 234, 143, 203, - 36, 16, 36, 231, 92, 200, 227, 143, 203, 36, 16, 36, 231, 92, 200, 222, - 143, 203, 36, 16, 36, 231, 92, 200, 224, 143, 203, 36, 16, 36, 231, 92, - 200, 229, 47, 231, 83, 47, 240, 136, 47, 250, 150, 47, 154, 47, 214, 29, - 47, 213, 97, 47, 239, 31, 47, 239, 32, 205, 93, 47, 239, 32, 241, 35, 47, - 225, 230, 47, 236, 162, 217, 223, 232, 110, 47, 236, 162, 217, 223, 203, - 239, 47, 236, 162, 217, 223, 203, 132, 47, 236, 162, 217, 223, 219, 176, - 47, 241, 97, 47, 213, 244, 251, 109, 47, 176, 47, 218, 146, 63, 47, 166, - 47, 155, 47, 224, 212, 47, 219, 246, 47, 234, 66, 47, 247, 158, 47, 224, - 211, 47, 213, 9, 47, 217, 75, 47, 218, 146, 236, 49, 47, 218, 146, 234, - 190, 47, 219, 119, 47, 224, 148, 47, 231, 2, 47, 224, 103, 47, 219, 80, - 47, 233, 194, 47, 202, 124, 47, 218, 146, 159, 47, 219, 3, 47, 239, 41, - 47, 224, 30, 47, 235, 53, 47, 216, 88, 47, 218, 146, 221, 136, 47, 219, - 0, 47, 244, 183, 47, 224, 24, 47, 219, 1, 205, 93, 47, 244, 184, 205, 93, - 47, 221, 137, 205, 93, 47, 224, 25, 205, 93, 47, 219, 1, 241, 35, 47, - 244, 184, 241, 35, 47, 221, 137, 241, 35, 47, 224, 25, 241, 35, 47, 221, - 137, 127, 209, 80, 47, 221, 137, 127, 209, 81, 205, 93, 47, 161, 47, 223, - 223, 47, 218, 151, 47, 233, 118, 47, 210, 234, 47, 210, 235, 127, 209, - 80, 47, 210, 235, 127, 209, 81, 205, 93, 47, 211, 240, 47, 215, 227, 47, - 218, 146, 209, 80, 47, 218, 148, 47, 211, 187, 47, 215, 120, 47, 218, - 146, 199, 230, 47, 218, 79, 47, 223, 139, 47, 218, 80, 219, 180, 47, 211, - 186, 47, 215, 119, 47, 218, 146, 197, 199, 47, 218, 73, 47, 223, 137, 47, - 218, 74, 219, 180, 47, 225, 81, 214, 147, 47, 221, 137, 214, 147, 47, - 251, 123, 47, 248, 65, 47, 247, 81, 47, 247, 58, 47, 247, 208, 127, 224, - 148, 47, 244, 182, 47, 240, 50, 47, 233, 28, 47, 142, 47, 231, 84, 47, - 226, 86, 47, 224, 37, 47, 224, 25, 247, 124, 47, 223, 189, 47, 222, 10, - 47, 222, 9, 47, 221, 250, 47, 221, 152, 47, 219, 247, 205, 224, 47, 219, - 34, 47, 218, 217, 47, 213, 7, 47, 212, 120, 47, 212, 53, 47, 212, 51, 47, - 205, 84, 47, 204, 72, 47, 197, 111, 47, 199, 231, 127, 221, 136, 47, 39, - 127, 221, 136, 143, 203, 36, 16, 36, 240, 54, 100, 143, 203, 36, 16, 36, - 240, 54, 102, 143, 203, 36, 16, 36, 240, 54, 134, 143, 203, 36, 16, 36, - 240, 54, 136, 143, 203, 36, 16, 36, 240, 54, 146, 143, 203, 36, 16, 36, - 240, 54, 167, 143, 203, 36, 16, 36, 240, 54, 178, 143, 203, 36, 16, 36, - 240, 54, 171, 143, 203, 36, 16, 36, 240, 54, 182, 143, 203, 36, 16, 36, - 240, 54, 203, 23, 143, 203, 36, 16, 36, 240, 54, 236, 252, 143, 203, 36, - 16, 36, 240, 54, 200, 239, 143, 203, 36, 16, 36, 240, 54, 202, 179, 143, - 203, 36, 16, 36, 240, 54, 235, 1, 143, 203, 36, 16, 36, 240, 54, 235, - 149, 143, 203, 36, 16, 36, 240, 54, 206, 23, 143, 203, 36, 16, 36, 240, - 54, 207, 68, 143, 203, 36, 16, 36, 240, 54, 237, 28, 143, 203, 36, 16, - 36, 240, 54, 216, 176, 143, 203, 36, 16, 36, 240, 54, 200, 234, 143, 203, - 36, 16, 36, 240, 54, 200, 227, 143, 203, 36, 16, 36, 240, 54, 200, 222, - 143, 203, 36, 16, 36, 240, 54, 200, 224, 143, 203, 36, 16, 36, 240, 54, - 200, 229, 143, 203, 36, 16, 36, 240, 54, 200, 230, 143, 203, 36, 16, 36, - 240, 54, 200, 225, 143, 203, 36, 16, 36, 240, 54, 200, 226, 143, 203, 36, - 16, 36, 240, 54, 200, 233, 143, 203, 36, 16, 36, 240, 54, 200, 228, 143, - 203, 36, 16, 36, 240, 54, 202, 177, 143, 203, 36, 16, 36, 240, 54, 202, - 175, 47, 234, 105, 232, 84, 36, 202, 218, 241, 75, 232, 122, 232, 84, 36, - 202, 218, 210, 171, 237, 72, 232, 84, 36, 239, 122, 250, 169, 202, 218, - 248, 241, 232, 84, 36, 195, 230, 235, 45, 232, 84, 36, 197, 152, 232, 84, - 36, 241, 151, 232, 84, 36, 202, 218, 250, 228, 232, 84, 36, 231, 176, - 202, 19, 232, 84, 36, 4, 203, 115, 232, 84, 36, 201, 193, 232, 84, 36, - 213, 90, 232, 84, 36, 205, 9, 232, 84, 36, 235, 173, 232, 84, 36, 233, - 96, 212, 75, 232, 84, 36, 218, 237, 232, 84, 36, 236, 201, 232, 84, 36, - 235, 46, 232, 84, 36, 197, 7, 214, 120, 202, 218, 239, 247, 232, 84, 36, - 251, 24, 232, 84, 36, 241, 130, 232, 84, 36, 248, 142, 202, 144, 232, 84, - 36, 233, 116, 232, 84, 36, 205, 111, 251, 44, 232, 84, 36, 210, 93, 232, - 84, 36, 226, 48, 232, 84, 36, 233, 96, 203, 115, 232, 84, 36, 218, 165, - 241, 100, 232, 84, 36, 233, 96, 212, 28, 232, 84, 36, 202, 218, 252, 27, - 197, 127, 232, 84, 36, 202, 218, 244, 211, 235, 118, 232, 84, 36, 226, - 62, 232, 84, 36, 237, 177, 232, 84, 36, 210, 96, 232, 84, 36, 233, 96, - 212, 58, 232, 84, 36, 212, 2, 232, 84, 36, 240, 70, 77, 202, 218, 222, - 95, 232, 84, 36, 202, 218, 235, 211, 232, 84, 36, 214, 78, 232, 84, 36, - 214, 177, 232, 84, 36, 239, 217, 232, 84, 36, 239, 239, 232, 84, 36, 226, - 77, 232, 84, 36, 248, 51, 232, 84, 36, 244, 161, 202, 30, 219, 183, 232, - 84, 36, 234, 73, 202, 19, 232, 84, 36, 211, 197, 200, 25, 232, 84, 36, - 214, 77, 232, 84, 36, 202, 218, 197, 93, 232, 84, 36, 210, 84, 232, 84, - 36, 202, 218, 247, 87, 232, 84, 36, 202, 218, 250, 224, 202, 138, 232, - 84, 36, 202, 218, 224, 197, 204, 233, 218, 169, 232, 84, 36, 239, 184, - 232, 84, 36, 202, 218, 220, 20, 220, 80, 232, 84, 36, 252, 28, 232, 84, - 36, 202, 218, 197, 144, 232, 84, 36, 202, 218, 234, 28, 197, 50, 232, 84, - 36, 202, 218, 225, 112, 223, 1, 232, 84, 36, 239, 72, 232, 84, 36, 222, - 82, 232, 84, 36, 226, 51, 201, 117, 232, 84, 36, 4, 212, 28, 232, 84, 36, - 251, 218, 244, 151, 232, 84, 36, 248, 244, 244, 151, 11, 5, 225, 234, 11, - 5, 225, 226, 11, 5, 68, 11, 5, 226, 4, 11, 5, 226, 145, 11, 5, 226, 128, - 11, 5, 226, 147, 11, 5, 226, 146, 11, 5, 250, 168, 11, 5, 250, 124, 11, - 5, 63, 11, 5, 251, 46, 11, 5, 200, 37, 11, 5, 200, 41, 11, 5, 200, 38, - 11, 5, 214, 49, 11, 5, 214, 13, 11, 5, 72, 11, 5, 214, 93, 11, 5, 236, - 95, 11, 5, 69, 11, 5, 196, 243, 11, 5, 248, 145, 11, 5, 248, 140, 11, 5, - 248, 184, 11, 5, 248, 157, 11, 5, 248, 173, 11, 5, 248, 172, 11, 5, 248, - 175, 11, 5, 248, 174, 11, 5, 249, 56, 11, 5, 249, 48, 11, 5, 249, 145, - 11, 5, 249, 81, 11, 5, 247, 247, 11, 5, 247, 251, 11, 5, 247, 248, 11, 5, - 248, 89, 11, 5, 248, 70, 11, 5, 248, 116, 11, 5, 248, 95, 11, 5, 248, - 200, 11, 5, 249, 9, 11, 5, 248, 213, 11, 5, 247, 231, 11, 5, 247, 225, - 11, 5, 248, 21, 11, 5, 247, 246, 11, 5, 247, 239, 11, 5, 247, 244, 11, 5, - 247, 213, 11, 5, 247, 211, 11, 5, 247, 218, 11, 5, 247, 216, 11, 5, 247, - 214, 11, 5, 247, 215, 11, 5, 212, 157, 11, 5, 212, 153, 11, 5, 212, 220, - 11, 5, 212, 169, 11, 5, 212, 186, 11, 5, 212, 213, 11, 5, 212, 209, 11, - 5, 213, 116, 11, 5, 213, 102, 11, 5, 161, 11, 5, 213, 163, 11, 5, 211, - 207, 11, 5, 211, 209, 11, 5, 211, 208, 11, 5, 212, 68, 11, 5, 212, 56, - 11, 5, 212, 117, 11, 5, 212, 87, 11, 5, 211, 193, 11, 5, 211, 189, 11, 5, - 211, 227, 11, 5, 211, 206, 11, 5, 211, 198, 11, 5, 211, 204, 11, 5, 211, - 171, 11, 5, 211, 170, 11, 5, 211, 175, 11, 5, 211, 174, 11, 5, 211, 172, - 11, 5, 211, 173, 11, 5, 249, 30, 11, 5, 249, 29, 11, 5, 249, 36, 11, 5, - 249, 31, 11, 5, 249, 33, 11, 5, 249, 32, 11, 5, 249, 35, 11, 5, 249, 34, - 11, 5, 249, 42, 11, 5, 249, 41, 11, 5, 249, 45, 11, 5, 249, 43, 11, 5, - 249, 21, 11, 5, 249, 23, 11, 5, 249, 22, 11, 5, 249, 26, 11, 5, 249, 25, - 11, 5, 249, 28, 11, 5, 249, 27, 11, 5, 249, 37, 11, 5, 249, 40, 11, 5, - 249, 38, 11, 5, 249, 17, 11, 5, 249, 16, 11, 5, 249, 24, 11, 5, 249, 20, - 11, 5, 249, 18, 11, 5, 249, 19, 11, 5, 249, 13, 11, 5, 249, 12, 11, 5, - 249, 15, 11, 5, 249, 14, 11, 5, 217, 182, 11, 5, 217, 181, 11, 5, 217, - 187, 11, 5, 217, 183, 11, 5, 217, 184, 11, 5, 217, 186, 11, 5, 217, 185, - 11, 5, 217, 190, 11, 5, 217, 189, 11, 5, 217, 192, 11, 5, 217, 191, 11, - 5, 217, 178, 11, 5, 217, 177, 11, 5, 217, 180, 11, 5, 217, 179, 11, 5, - 217, 171, 11, 5, 217, 170, 11, 5, 217, 175, 11, 5, 217, 174, 11, 5, 217, - 172, 11, 5, 217, 173, 11, 5, 217, 165, 11, 5, 217, 164, 11, 5, 217, 169, - 11, 5, 217, 168, 11, 5, 217, 166, 11, 5, 217, 167, 11, 5, 231, 237, 11, - 5, 231, 236, 11, 5, 231, 242, 11, 5, 231, 238, 11, 5, 231, 239, 11, 5, - 231, 241, 11, 5, 231, 240, 11, 5, 231, 245, 11, 5, 231, 244, 11, 5, 231, - 247, 11, 5, 231, 246, 11, 5, 231, 228, 11, 5, 231, 230, 11, 5, 231, 229, - 11, 5, 231, 233, 11, 5, 231, 232, 11, 5, 231, 235, 11, 5, 231, 234, 11, - 5, 231, 224, 11, 5, 231, 223, 11, 5, 231, 231, 11, 5, 231, 227, 11, 5, - 231, 225, 11, 5, 231, 226, 11, 5, 231, 218, 11, 5, 231, 222, 11, 5, 231, - 221, 11, 5, 231, 219, 11, 5, 231, 220, 11, 5, 219, 6, 11, 5, 219, 5, 11, - 5, 219, 78, 11, 5, 219, 12, 11, 5, 219, 42, 11, 5, 219, 60, 11, 5, 219, - 58, 11, 5, 220, 4, 11, 5, 219, 254, 11, 5, 166, 11, 5, 220, 43, 11, 5, - 218, 107, 11, 5, 218, 106, 11, 5, 218, 110, 11, 5, 218, 108, 11, 5, 218, - 180, 11, 5, 218, 153, 11, 5, 218, 251, 11, 5, 218, 187, 11, 5, 219, 130, - 11, 5, 219, 207, 11, 5, 218, 87, 11, 5, 218, 81, 11, 5, 218, 145, 11, 5, - 218, 103, 11, 5, 218, 96, 11, 5, 218, 101, 11, 5, 218, 58, 11, 5, 218, - 57, 11, 5, 218, 63, 11, 5, 218, 60, 11, 5, 235, 104, 11, 5, 235, 98, 11, - 5, 235, 153, 11, 5, 235, 120, 11, 5, 235, 202, 11, 5, 235, 193, 11, 5, - 235, 239, 11, 5, 235, 207, 11, 5, 234, 254, 11, 5, 235, 51, 11, 5, 235, - 32, 11, 5, 234, 206, 11, 5, 234, 205, 11, 5, 234, 223, 11, 5, 234, 211, - 11, 5, 234, 209, 11, 5, 234, 210, 11, 5, 234, 193, 11, 5, 234, 192, 11, - 5, 234, 196, 11, 5, 234, 194, 11, 5, 198, 255, 11, 5, 198, 250, 11, 5, - 199, 34, 11, 5, 199, 8, 11, 5, 199, 23, 11, 5, 199, 20, 11, 5, 199, 26, - 11, 5, 199, 25, 11, 5, 199, 126, 11, 5, 199, 121, 11, 5, 199, 152, 11, 5, - 199, 139, 11, 5, 198, 229, 11, 5, 198, 225, 11, 5, 198, 248, 11, 5, 198, - 231, 11, 5, 199, 38, 11, 5, 199, 106, 11, 5, 197, 213, 11, 5, 197, 211, - 11, 5, 197, 220, 11, 5, 197, 216, 11, 5, 197, 214, 11, 5, 197, 215, 11, - 5, 197, 203, 11, 5, 197, 202, 11, 5, 197, 207, 11, 5, 197, 206, 11, 5, - 197, 204, 11, 5, 197, 205, 11, 5, 239, 65, 11, 5, 239, 51, 11, 5, 239, - 152, 11, 5, 239, 92, 11, 5, 239, 127, 11, 5, 239, 132, 11, 5, 239, 131, - 11, 5, 240, 61, 11, 5, 240, 55, 11, 5, 240, 136, 11, 5, 240, 81, 11, 5, - 237, 182, 11, 5, 237, 183, 11, 5, 238, 253, 11, 5, 237, 229, 11, 5, 239, - 28, 11, 5, 239, 0, 11, 5, 239, 182, 11, 5, 239, 252, 11, 5, 239, 203, 11, - 5, 237, 173, 11, 5, 237, 171, 11, 5, 237, 201, 11, 5, 237, 181, 11, 5, - 237, 176, 11, 5, 237, 179, 11, 5, 202, 57, 11, 5, 202, 49, 11, 5, 202, - 122, 11, 5, 202, 67, 11, 5, 202, 105, 11, 5, 202, 107, 11, 5, 202, 106, - 11, 5, 203, 94, 11, 5, 203, 79, 11, 5, 189, 11, 5, 203, 105, 11, 5, 201, - 15, 11, 5, 201, 14, 11, 5, 201, 17, 11, 5, 201, 16, 11, 5, 201, 229, 11, - 5, 201, 219, 11, 5, 149, 11, 5, 201, 242, 11, 5, 202, 239, 11, 5, 203, - 68, 11, 5, 203, 10, 11, 5, 200, 254, 11, 5, 200, 249, 11, 5, 201, 40, 11, - 5, 201, 13, 11, 5, 200, 255, 11, 5, 201, 10, 11, 5, 240, 13, 11, 5, 240, - 12, 11, 5, 240, 18, 11, 5, 240, 14, 11, 5, 240, 15, 11, 5, 240, 17, 11, - 5, 240, 16, 11, 5, 240, 34, 11, 5, 240, 33, 11, 5, 240, 41, 11, 5, 240, - 35, 11, 5, 240, 3, 11, 5, 240, 5, 11, 5, 240, 4, 11, 5, 240, 8, 11, 5, - 240, 7, 11, 5, 240, 11, 11, 5, 240, 9, 11, 5, 240, 26, 11, 5, 240, 29, - 11, 5, 240, 27, 11, 5, 239, 255, 11, 5, 239, 254, 11, 5, 240, 6, 11, 5, - 240, 2, 11, 5, 240, 0, 11, 5, 240, 1, 11, 5, 217, 137, 11, 5, 217, 136, - 11, 5, 217, 144, 11, 5, 217, 139, 11, 5, 217, 140, 11, 5, 217, 141, 11, - 5, 217, 153, 11, 5, 217, 152, 11, 5, 217, 159, 11, 5, 217, 154, 11, 5, - 217, 129, 11, 5, 217, 128, 11, 5, 217, 135, 11, 5, 217, 130, 11, 5, 217, - 145, 11, 5, 217, 151, 11, 5, 217, 149, 11, 5, 217, 121, 11, 5, 217, 120, - 11, 5, 217, 126, 11, 5, 217, 124, 11, 5, 217, 122, 11, 5, 217, 123, 11, - 5, 231, 203, 11, 5, 231, 202, 11, 5, 231, 209, 11, 5, 231, 204, 11, 5, - 231, 206, 11, 5, 231, 205, 11, 5, 231, 208, 11, 5, 231, 207, 11, 5, 231, - 215, 11, 5, 231, 213, 11, 5, 231, 217, 11, 5, 231, 216, 11, 5, 231, 196, - 11, 5, 231, 197, 11, 5, 231, 200, 11, 5, 231, 199, 11, 5, 231, 201, 11, - 5, 231, 210, 11, 5, 231, 212, 11, 5, 231, 211, 11, 5, 231, 195, 11, 5, - 216, 168, 11, 5, 216, 166, 11, 5, 216, 223, 11, 5, 216, 171, 11, 5, 216, - 197, 11, 5, 216, 211, 11, 5, 216, 210, 11, 5, 217, 197, 11, 5, 176, 11, - 5, 217, 213, 11, 5, 215, 130, 11, 5, 215, 132, 11, 5, 215, 131, 11, 5, - 216, 18, 11, 5, 216, 2, 11, 5, 216, 50, 11, 5, 216, 29, 11, 5, 217, 77, - 11, 5, 217, 118, 11, 5, 217, 96, 11, 5, 215, 125, 11, 5, 215, 121, 11, 5, - 215, 186, 11, 5, 215, 129, 11, 5, 215, 127, 11, 5, 215, 128, 11, 5, 232, - 12, 11, 5, 232, 11, 11, 5, 232, 17, 11, 5, 232, 13, 11, 5, 232, 14, 11, - 5, 232, 16, 11, 5, 232, 15, 11, 5, 232, 23, 11, 5, 232, 21, 11, 5, 232, - 25, 11, 5, 232, 24, 11, 5, 232, 4, 11, 5, 232, 6, 11, 5, 232, 5, 11, 5, - 232, 8, 11, 5, 232, 10, 11, 5, 232, 9, 11, 5, 232, 18, 11, 5, 232, 20, - 11, 5, 232, 19, 11, 5, 232, 0, 11, 5, 231, 255, 11, 5, 232, 7, 11, 5, - 232, 3, 11, 5, 232, 1, 11, 5, 232, 2, 11, 5, 231, 250, 11, 5, 231, 249, - 11, 5, 231, 254, 11, 5, 231, 253, 11, 5, 231, 251, 11, 5, 231, 252, 11, - 5, 222, 51, 11, 5, 222, 43, 11, 5, 222, 109, 11, 5, 222, 61, 11, 5, 222, - 100, 11, 5, 222, 99, 11, 5, 222, 103, 11, 5, 222, 101, 11, 5, 222, 220, - 11, 5, 222, 208, 11, 5, 172, 11, 5, 222, 231, 11, 5, 221, 169, 11, 5, - 221, 168, 11, 5, 221, 171, 11, 5, 221, 170, 11, 5, 221, 216, 11, 5, 221, - 200, 11, 5, 222, 7, 11, 5, 221, 222, 11, 5, 222, 126, 11, 5, 222, 197, - 11, 5, 222, 144, 11, 5, 221, 163, 11, 5, 221, 161, 11, 5, 221, 191, 11, - 5, 221, 167, 11, 5, 221, 165, 11, 5, 221, 166, 11, 5, 221, 141, 11, 5, - 221, 140, 11, 5, 221, 151, 11, 5, 221, 144, 11, 5, 221, 142, 11, 5, 221, - 143, 11, 5, 233, 163, 11, 5, 233, 162, 11, 5, 233, 192, 11, 5, 233, 175, - 11, 5, 233, 184, 11, 5, 233, 183, 11, 5, 233, 186, 11, 5, 233, 185, 11, - 5, 234, 75, 11, 5, 234, 70, 11, 5, 234, 123, 11, 5, 234, 86, 11, 5, 233, - 49, 11, 5, 233, 48, 11, 5, 233, 51, 11, 5, 233, 50, 11, 5, 233, 121, 11, - 5, 233, 119, 11, 5, 233, 144, 11, 5, 233, 130, 11, 5, 234, 14, 11, 5, - 234, 12, 11, 5, 234, 48, 11, 5, 234, 25, 11, 5, 233, 38, 11, 5, 233, 37, - 11, 5, 233, 76, 11, 5, 233, 47, 11, 5, 233, 39, 11, 5, 233, 46, 11, 5, - 224, 55, 11, 5, 224, 50, 11, 5, 224, 101, 11, 5, 224, 69, 11, 5, 224, 82, - 11, 5, 224, 86, 11, 5, 224, 84, 11, 5, 224, 235, 11, 5, 224, 217, 11, 5, - 155, 11, 5, 225, 8, 11, 5, 223, 158, 11, 5, 223, 163, 11, 5, 223, 160, - 11, 5, 223, 230, 11, 5, 223, 225, 11, 5, 224, 11, 11, 5, 223, 237, 11, 5, - 224, 172, 11, 5, 224, 155, 11, 5, 224, 209, 11, 5, 224, 176, 11, 5, 223, - 145, 11, 5, 223, 141, 11, 5, 223, 187, 11, 5, 223, 157, 11, 5, 223, 149, - 11, 5, 223, 154, 11, 5, 233, 252, 11, 5, 233, 251, 11, 5, 234, 0, 11, 5, - 233, 253, 11, 5, 233, 255, 11, 5, 233, 254, 11, 5, 234, 7, 11, 5, 234, 6, - 11, 5, 234, 10, 11, 5, 234, 8, 11, 5, 233, 243, 11, 5, 233, 242, 11, 5, - 233, 245, 11, 5, 233, 244, 11, 5, 233, 248, 11, 5, 233, 247, 11, 5, 233, - 250, 11, 5, 233, 249, 11, 5, 234, 2, 11, 5, 234, 1, 11, 5, 234, 5, 11, 5, - 234, 3, 11, 5, 233, 238, 11, 5, 233, 237, 11, 5, 233, 246, 11, 5, 233, - 241, 11, 5, 233, 239, 11, 5, 233, 240, 11, 5, 219, 97, 11, 5, 219, 98, - 11, 5, 219, 116, 11, 5, 219, 115, 11, 5, 219, 118, 11, 5, 219, 117, 11, - 5, 219, 88, 11, 5, 219, 90, 11, 5, 219, 89, 11, 5, 219, 93, 11, 5, 219, - 92, 11, 5, 219, 95, 11, 5, 219, 94, 11, 5, 219, 99, 11, 5, 219, 101, 11, - 5, 219, 100, 11, 5, 219, 84, 11, 5, 219, 83, 11, 5, 219, 91, 11, 5, 219, - 87, 11, 5, 219, 85, 11, 5, 219, 86, 11, 5, 231, 22, 11, 5, 231, 21, 11, - 5, 231, 28, 11, 5, 231, 23, 11, 5, 231, 25, 11, 5, 231, 24, 11, 5, 231, - 27, 11, 5, 231, 26, 11, 5, 231, 33, 11, 5, 231, 32, 11, 5, 231, 35, 11, - 5, 231, 34, 11, 5, 231, 14, 11, 5, 231, 13, 11, 5, 231, 16, 11, 5, 231, - 15, 11, 5, 231, 18, 11, 5, 231, 17, 11, 5, 231, 20, 11, 5, 231, 19, 11, - 5, 231, 29, 11, 5, 231, 31, 11, 5, 231, 30, 11, 5, 217, 16, 11, 5, 217, - 18, 11, 5, 217, 17, 11, 5, 217, 61, 11, 5, 217, 59, 11, 5, 217, 71, 11, - 5, 217, 64, 11, 5, 216, 233, 11, 5, 216, 232, 11, 5, 216, 234, 11, 5, - 216, 244, 11, 5, 216, 241, 11, 5, 216, 252, 11, 5, 216, 246, 11, 5, 217, - 52, 11, 5, 217, 58, 11, 5, 217, 54, 11, 5, 232, 31, 11, 5, 232, 49, 11, - 5, 232, 58, 11, 5, 232, 165, 11, 5, 232, 154, 11, 5, 142, 11, 5, 232, - 177, 11, 5, 231, 51, 11, 5, 231, 50, 11, 5, 231, 53, 11, 5, 231, 52, 11, - 5, 231, 95, 11, 5, 231, 86, 11, 5, 231, 193, 11, 5, 231, 158, 11, 5, 232, - 86, 11, 5, 232, 147, 11, 5, 232, 98, 11, 5, 197, 130, 11, 5, 197, 115, - 11, 5, 197, 166, 11, 5, 197, 141, 11, 5, 196, 232, 11, 5, 196, 234, 11, - 5, 196, 233, 11, 5, 197, 0, 11, 5, 197, 34, 11, 5, 197, 10, 11, 5, 197, - 83, 11, 5, 197, 109, 11, 5, 197, 90, 11, 5, 195, 18, 11, 5, 195, 17, 11, - 5, 195, 33, 11, 5, 195, 21, 11, 5, 195, 26, 11, 5, 195, 28, 11, 5, 195, - 27, 11, 5, 195, 97, 11, 5, 195, 94, 11, 5, 195, 115, 11, 5, 195, 101, 11, - 5, 194, 248, 11, 5, 194, 250, 11, 5, 194, 249, 11, 5, 195, 6, 11, 5, 195, - 5, 11, 5, 195, 11, 11, 5, 195, 7, 11, 5, 195, 76, 11, 5, 195, 88, 11, 5, - 195, 81, 11, 5, 194, 244, 11, 5, 194, 243, 11, 5, 194, 255, 11, 5, 194, - 247, 11, 5, 194, 245, 11, 5, 194, 246, 11, 5, 194, 230, 11, 5, 194, 229, - 11, 5, 194, 235, 11, 5, 194, 233, 11, 5, 194, 231, 11, 5, 194, 232, 11, - 5, 244, 238, 11, 5, 244, 231, 11, 5, 245, 11, 11, 5, 244, 251, 11, 5, - 245, 8, 11, 5, 245, 2, 11, 5, 245, 10, 11, 5, 245, 9, 11, 5, 247, 92, 11, - 5, 247, 84, 11, 5, 247, 174, 11, 5, 247, 125, 11, 5, 241, 29, 11, 5, 241, - 31, 11, 5, 241, 30, 11, 5, 241, 93, 11, 5, 241, 81, 11, 5, 244, 182, 11, - 5, 241, 112, 11, 5, 247, 20, 11, 5, 247, 57, 11, 5, 247, 26, 11, 5, 241, - 1, 11, 5, 240, 255, 11, 5, 241, 41, 11, 5, 241, 27, 11, 5, 241, 7, 11, 5, - 241, 22, 11, 5, 240, 234, 11, 5, 240, 233, 11, 5, 240, 246, 11, 5, 240, - 240, 11, 5, 240, 235, 11, 5, 240, 237, 11, 5, 194, 213, 11, 5, 194, 212, - 11, 5, 194, 219, 11, 5, 194, 214, 11, 5, 194, 216, 11, 5, 194, 215, 11, - 5, 194, 218, 11, 5, 194, 217, 11, 5, 194, 225, 11, 5, 194, 224, 11, 5, - 194, 228, 11, 5, 194, 226, 11, 5, 194, 209, 11, 5, 194, 211, 11, 5, 194, - 210, 11, 5, 194, 220, 11, 5, 194, 223, 11, 5, 194, 221, 11, 5, 194, 202, - 11, 5, 194, 206, 11, 5, 194, 205, 11, 5, 194, 203, 11, 5, 194, 204, 11, - 5, 194, 196, 11, 5, 194, 195, 11, 5, 194, 201, 11, 5, 194, 199, 11, 5, - 194, 197, 11, 5, 194, 198, 11, 5, 215, 41, 11, 5, 215, 40, 11, 5, 215, - 46, 11, 5, 215, 42, 11, 5, 215, 43, 11, 5, 215, 45, 11, 5, 215, 44, 11, - 5, 215, 51, 11, 5, 215, 50, 11, 5, 215, 54, 11, 5, 215, 53, 11, 5, 215, - 34, 11, 5, 215, 35, 11, 5, 215, 38, 11, 5, 215, 39, 11, 5, 215, 47, 11, - 5, 215, 49, 11, 5, 215, 29, 11, 5, 215, 37, 11, 5, 215, 33, 11, 5, 215, - 30, 11, 5, 215, 31, 11, 5, 215, 24, 11, 5, 215, 23, 11, 5, 215, 28, 11, - 5, 215, 27, 11, 5, 215, 25, 11, 5, 215, 26, 11, 5, 206, 31, 11, 5, 167, - 11, 5, 206, 112, 11, 5, 206, 34, 11, 5, 206, 92, 11, 5, 206, 95, 11, 5, - 206, 93, 11, 5, 208, 199, 11, 5, 208, 183, 11, 5, 183, 11, 5, 208, 207, - 11, 5, 204, 101, 11, 5, 204, 103, 11, 5, 204, 102, 11, 5, 205, 165, 11, - 5, 205, 154, 11, 5, 205, 200, 11, 5, 205, 169, 11, 5, 207, 63, 11, 5, - 208, 147, 11, 5, 207, 93, 11, 5, 204, 76, 11, 5, 204, 73, 11, 5, 204, - 172, 11, 5, 204, 100, 11, 5, 204, 80, 11, 5, 204, 88, 11, 5, 203, 230, - 11, 5, 203, 229, 11, 5, 204, 44, 11, 5, 203, 238, 11, 5, 203, 232, 11, 5, - 203, 237, 11, 5, 205, 41, 11, 5, 205, 40, 11, 5, 205, 47, 11, 5, 205, 42, - 11, 5, 205, 44, 11, 5, 205, 46, 11, 5, 205, 45, 11, 5, 205, 56, 11, 5, - 205, 54, 11, 5, 205, 80, 11, 5, 205, 57, 11, 5, 205, 36, 11, 5, 205, 35, - 11, 5, 205, 39, 11, 5, 205, 37, 11, 5, 205, 50, 11, 5, 205, 53, 11, 5, - 205, 51, 11, 5, 205, 32, 11, 5, 205, 30, 11, 5, 205, 34, 11, 5, 205, 33, - 11, 5, 205, 25, 11, 5, 205, 24, 11, 5, 205, 29, 11, 5, 205, 28, 11, 5, - 205, 26, 11, 5, 205, 27, 11, 5, 195, 69, 11, 5, 195, 68, 11, 5, 195, 74, - 11, 5, 195, 71, 11, 5, 195, 48, 11, 5, 195, 50, 11, 5, 195, 49, 11, 5, - 195, 53, 11, 5, 195, 52, 11, 5, 195, 57, 11, 5, 195, 54, 11, 5, 195, 62, - 11, 5, 195, 61, 11, 5, 195, 65, 11, 5, 195, 63, 11, 5, 195, 44, 11, 5, - 195, 43, 11, 5, 195, 51, 11, 5, 195, 47, 11, 5, 195, 45, 11, 5, 195, 46, - 11, 5, 195, 36, 11, 5, 195, 35, 11, 5, 195, 40, 11, 5, 195, 39, 11, 5, - 195, 37, 11, 5, 195, 38, 11, 5, 245, 109, 11, 5, 245, 105, 11, 5, 247, - 16, 11, 5, 247, 2, 11, 5, 245, 26, 11, 5, 245, 25, 11, 5, 245, 28, 11, 5, - 245, 27, 11, 5, 245, 41, 11, 5, 245, 40, 11, 5, 245, 49, 11, 5, 245, 44, - 11, 5, 245, 80, 11, 5, 245, 78, 11, 5, 245, 103, 11, 5, 245, 88, 11, 5, - 245, 20, 11, 5, 245, 30, 11, 5, 245, 24, 11, 5, 245, 21, 11, 5, 245, 23, - 11, 5, 245, 13, 11, 5, 245, 12, 11, 5, 245, 17, 11, 5, 245, 16, 11, 5, - 245, 14, 11, 5, 245, 15, 11, 5, 209, 177, 11, 5, 209, 181, 11, 5, 209, - 159, 11, 5, 209, 160, 11, 5, 209, 164, 11, 5, 209, 163, 11, 5, 209, 167, - 11, 5, 209, 165, 11, 5, 209, 171, 11, 5, 209, 170, 11, 5, 209, 176, 11, - 5, 209, 172, 11, 5, 209, 155, 11, 5, 209, 153, 11, 5, 209, 161, 11, 5, - 209, 158, 11, 5, 209, 156, 11, 5, 209, 157, 11, 5, 209, 148, 11, 5, 209, - 147, 11, 5, 209, 152, 11, 5, 209, 151, 11, 5, 209, 149, 11, 5, 209, 150, - 11, 5, 215, 250, 11, 5, 215, 249, 11, 5, 215, 252, 11, 5, 215, 251, 11, - 5, 215, 241, 11, 5, 215, 243, 11, 5, 215, 242, 11, 5, 215, 245, 11, 5, - 215, 244, 11, 5, 215, 248, 11, 5, 215, 247, 11, 5, 215, 235, 11, 5, 215, - 234, 11, 5, 215, 240, 11, 5, 215, 238, 11, 5, 215, 236, 11, 5, 215, 237, - 11, 5, 215, 229, 11, 5, 215, 228, 11, 5, 215, 233, 11, 5, 215, 232, 11, - 5, 215, 230, 11, 5, 215, 231, 11, 5, 207, 9, 11, 5, 207, 4, 11, 5, 207, - 50, 11, 5, 207, 22, 11, 5, 206, 139, 11, 5, 206, 141, 11, 5, 206, 140, - 11, 5, 206, 166, 11, 5, 206, 161, 11, 5, 206, 198, 11, 5, 206, 186, 11, - 5, 206, 233, 11, 5, 206, 226, 11, 5, 206, 255, 11, 5, 206, 242, 11, 5, - 206, 135, 11, 5, 206, 132, 11, 5, 206, 151, 11, 5, 206, 138, 11, 5, 206, - 136, 11, 5, 206, 137, 11, 5, 206, 115, 11, 5, 206, 114, 11, 5, 206, 121, - 11, 5, 206, 118, 11, 5, 206, 116, 11, 5, 206, 117, 11, 5, 210, 198, 11, - 5, 210, 192, 11, 5, 169, 11, 5, 210, 204, 11, 5, 209, 110, 11, 5, 209, - 112, 11, 5, 209, 111, 11, 5, 209, 195, 11, 5, 209, 183, 11, 5, 209, 232, - 11, 5, 209, 199, 11, 5, 210, 82, 11, 5, 210, 183, 11, 5, 210, 124, 11, 5, - 209, 102, 11, 5, 209, 99, 11, 5, 209, 140, 11, 5, 209, 109, 11, 5, 209, - 105, 11, 5, 209, 106, 11, 5, 209, 84, 11, 5, 209, 83, 11, 5, 209, 89, 11, - 5, 209, 87, 11, 5, 209, 85, 11, 5, 209, 86, 11, 5, 225, 160, 11, 5, 225, - 159, 11, 5, 225, 172, 11, 5, 225, 161, 11, 5, 225, 168, 11, 5, 225, 167, - 11, 5, 225, 170, 11, 5, 225, 169, 11, 5, 225, 98, 11, 5, 225, 97, 11, 5, - 225, 100, 11, 5, 225, 99, 11, 5, 225, 116, 11, 5, 225, 114, 11, 5, 225, - 129, 11, 5, 225, 118, 11, 5, 225, 91, 11, 5, 225, 89, 11, 5, 225, 110, - 11, 5, 225, 96, 11, 5, 225, 93, 11, 5, 225, 94, 11, 5, 225, 83, 11, 5, - 225, 82, 11, 5, 225, 87, 11, 5, 225, 86, 11, 5, 225, 84, 11, 5, 225, 85, - 11, 5, 211, 113, 11, 5, 211, 111, 11, 5, 211, 121, 11, 5, 211, 114, 11, - 5, 211, 118, 11, 5, 211, 117, 11, 5, 211, 120, 11, 5, 211, 119, 11, 5, - 211, 63, 11, 5, 211, 60, 11, 5, 211, 65, 11, 5, 211, 64, 11, 5, 211, 100, - 11, 5, 211, 99, 11, 5, 211, 109, 11, 5, 211, 103, 11, 5, 211, 55, 11, 5, - 211, 51, 11, 5, 211, 97, 11, 5, 211, 59, 11, 5, 211, 57, 11, 5, 211, 58, - 11, 5, 211, 35, 11, 5, 211, 33, 11, 5, 211, 45, 11, 5, 211, 38, 11, 5, - 211, 36, 11, 5, 211, 37, 11, 5, 225, 149, 11, 5, 225, 148, 11, 5, 225, - 155, 11, 5, 225, 150, 11, 5, 225, 152, 11, 5, 225, 151, 11, 5, 225, 154, - 11, 5, 225, 153, 11, 5, 225, 140, 11, 5, 225, 142, 11, 5, 225, 141, 11, - 5, 225, 145, 11, 5, 225, 144, 11, 5, 225, 147, 11, 5, 225, 146, 11, 5, - 225, 136, 11, 5, 225, 135, 11, 5, 225, 143, 11, 5, 225, 139, 11, 5, 225, - 137, 11, 5, 225, 138, 11, 5, 225, 132, 11, 5, 225, 131, 11, 5, 225, 134, - 11, 5, 225, 133, 11, 5, 216, 141, 11, 5, 216, 140, 11, 5, 216, 148, 11, - 5, 216, 142, 11, 5, 216, 144, 11, 5, 216, 143, 11, 5, 216, 147, 11, 5, - 216, 145, 11, 5, 216, 130, 11, 5, 216, 131, 11, 5, 216, 136, 11, 5, 216, - 135, 11, 5, 216, 139, 11, 5, 216, 137, 11, 5, 216, 125, 11, 5, 216, 134, - 11, 5, 216, 129, 11, 5, 216, 126, 11, 5, 216, 127, 11, 5, 216, 120, 11, - 5, 216, 119, 11, 5, 216, 124, 11, 5, 216, 123, 11, 5, 216, 121, 11, 5, - 216, 122, 11, 5, 215, 76, 11, 5, 215, 75, 11, 5, 215, 89, 11, 5, 215, 80, - 11, 5, 215, 85, 11, 5, 215, 84, 11, 5, 215, 87, 11, 5, 215, 86, 11, 5, - 215, 61, 11, 5, 215, 63, 11, 5, 215, 62, 11, 5, 215, 68, 11, 5, 215, 67, - 11, 5, 215, 73, 11, 5, 215, 69, 11, 5, 215, 59, 11, 5, 215, 57, 11, 5, - 215, 66, 11, 5, 215, 60, 11, 5, 196, 187, 11, 5, 196, 186, 11, 5, 196, - 196, 11, 5, 196, 189, 11, 5, 196, 191, 11, 5, 196, 190, 11, 5, 196, 193, - 11, 5, 196, 192, 11, 5, 196, 175, 11, 5, 196, 176, 11, 5, 196, 180, 11, - 5, 196, 179, 11, 5, 196, 185, 11, 5, 196, 183, 11, 5, 196, 152, 11, 5, - 196, 150, 11, 5, 196, 165, 11, 5, 196, 155, 11, 5, 196, 153, 11, 5, 196, - 154, 11, 5, 196, 9, 11, 5, 196, 7, 11, 5, 196, 24, 11, 5, 196, 10, 11, 5, - 196, 18, 11, 5, 196, 17, 11, 5, 196, 21, 11, 5, 196, 19, 11, 5, 195, 190, - 11, 5, 195, 189, 11, 5, 195, 193, 11, 5, 195, 191, 11, 5, 195, 232, 11, - 5, 195, 227, 11, 5, 196, 3, 11, 5, 195, 236, 11, 5, 195, 181, 11, 5, 195, - 177, 11, 5, 195, 217, 11, 5, 195, 188, 11, 5, 195, 184, 11, 5, 195, 185, - 11, 5, 195, 161, 11, 5, 195, 160, 11, 5, 195, 168, 11, 5, 195, 164, 11, - 5, 195, 162, 11, 5, 195, 163, 11, 44, 211, 100, 11, 44, 222, 109, 11, 44, - 224, 55, 11, 44, 215, 80, 11, 44, 240, 240, 11, 44, 205, 47, 11, 44, 233, - 249, 11, 44, 234, 25, 11, 44, 219, 78, 11, 44, 231, 22, 11, 44, 221, 143, - 11, 44, 249, 17, 11, 44, 218, 187, 11, 44, 196, 3, 11, 44, 211, 193, 11, - 44, 231, 16, 11, 44, 203, 94, 11, 44, 234, 123, 11, 44, 194, 247, 11, 44, - 240, 234, 11, 44, 240, 1, 11, 44, 247, 244, 11, 44, 233, 245, 11, 44, - 215, 69, 11, 44, 201, 40, 11, 44, 214, 93, 11, 44, 225, 136, 11, 44, 195, - 6, 11, 44, 211, 171, 11, 44, 231, 235, 11, 44, 196, 9, 11, 44, 197, 215, - 11, 44, 206, 121, 11, 44, 199, 106, 11, 44, 195, 115, 11, 44, 225, 129, - 11, 44, 215, 33, 11, 44, 225, 134, 11, 44, 233, 121, 11, 44, 225, 154, - 11, 44, 197, 34, 11, 44, 237, 201, 11, 44, 206, 137, 11, 44, 222, 103, - 11, 44, 240, 246, 11, 44, 241, 30, 11, 44, 244, 251, 11, 44, 231, 19, 11, - 44, 207, 9, 11, 44, 194, 246, 11, 44, 206, 186, 11, 44, 245, 103, 11, 44, - 194, 216, 11, 44, 217, 186, 11, 44, 224, 209, 222, 52, 1, 249, 145, 222, - 52, 1, 161, 222, 52, 1, 213, 6, 222, 52, 1, 240, 136, 222, 52, 1, 189, - 222, 52, 1, 202, 233, 222, 52, 1, 234, 123, 222, 52, 1, 155, 222, 52, 1, - 224, 146, 222, 52, 1, 225, 214, 222, 52, 1, 247, 174, 222, 52, 1, 247, - 16, 222, 52, 1, 237, 156, 222, 52, 1, 201, 113, 222, 52, 1, 201, 103, - 222, 52, 1, 166, 222, 52, 1, 176, 222, 52, 1, 172, 222, 52, 1, 183, 222, - 52, 1, 195, 74, 222, 52, 1, 195, 115, 222, 52, 1, 217, 71, 222, 52, 1, - 142, 222, 52, 1, 196, 208, 222, 52, 1, 232, 80, 222, 52, 1, 235, 239, - 222, 52, 1, 197, 166, 222, 52, 1, 207, 50, 222, 52, 1, 164, 222, 52, 1, - 233, 230, 222, 52, 1, 63, 222, 52, 1, 251, 245, 222, 52, 1, 69, 222, 52, - 1, 236, 116, 222, 52, 1, 68, 222, 52, 1, 72, 222, 52, 1, 66, 222, 52, 1, - 200, 99, 222, 52, 1, 200, 92, 222, 52, 1, 214, 164, 222, 52, 1, 152, 218, - 62, 202, 122, 222, 52, 1, 152, 218, 1, 212, 117, 222, 52, 1, 152, 218, - 62, 240, 245, 222, 52, 1, 152, 218, 62, 248, 116, 222, 52, 1, 152, 218, - 62, 176, 222, 52, 1, 152, 218, 62, 225, 181, 222, 52, 211, 214, 244, 159, - 222, 52, 211, 214, 234, 217, 204, 226, 54, 5, 237, 54, 54, 5, 237, 50, - 54, 5, 232, 118, 54, 5, 197, 98, 54, 5, 197, 97, 54, 5, 213, 79, 54, 5, - 248, 191, 54, 5, 248, 251, 54, 5, 219, 233, 54, 5, 223, 218, 54, 5, 219, - 110, 54, 5, 234, 61, 54, 5, 235, 182, 54, 5, 199, 113, 54, 5, 203, 48, - 54, 5, 202, 215, 54, 5, 239, 166, 54, 5, 239, 163, 54, 5, 222, 188, 54, - 5, 210, 155, 54, 5, 239, 237, 54, 5, 217, 150, 54, 5, 208, 129, 54, 5, - 206, 253, 54, 5, 195, 85, 54, 5, 195, 64, 54, 5, 247, 49, 54, 5, 225, - 191, 54, 5, 216, 155, 54, 5, 196, 66, 54, 5, 224, 200, 54, 5, 217, 44, - 54, 5, 234, 40, 54, 5, 219, 188, 54, 5, 217, 107, 54, 5, 215, 97, 54, 5, - 68, 54, 5, 226, 86, 54, 5, 232, 71, 54, 5, 232, 41, 54, 5, 197, 70, 54, - 5, 197, 52, 54, 5, 212, 220, 54, 5, 248, 189, 54, 5, 248, 184, 54, 5, - 219, 226, 54, 5, 223, 215, 54, 5, 219, 107, 54, 5, 234, 57, 54, 5, 235, - 153, 54, 5, 199, 34, 54, 5, 202, 122, 54, 5, 202, 195, 54, 5, 239, 158, - 54, 5, 239, 162, 54, 5, 222, 109, 54, 5, 210, 72, 54, 5, 239, 152, 54, 5, - 217, 144, 54, 5, 206, 112, 54, 5, 206, 223, 54, 5, 195, 33, 54, 5, 195, - 60, 54, 5, 245, 11, 54, 5, 225, 172, 54, 5, 216, 148, 54, 5, 196, 24, 54, - 5, 224, 101, 54, 5, 217, 36, 54, 5, 233, 192, 54, 5, 219, 78, 54, 5, 216, - 223, 54, 5, 215, 89, 54, 5, 63, 54, 5, 251, 106, 54, 5, 217, 66, 54, 5, - 142, 54, 5, 232, 212, 54, 5, 197, 166, 54, 5, 197, 146, 54, 5, 161, 54, - 5, 248, 197, 54, 5, 249, 145, 54, 5, 219, 241, 54, 5, 223, 223, 54, 5, - 223, 221, 54, 5, 219, 114, 54, 5, 234, 65, 54, 5, 235, 239, 54, 5, 199, - 152, 54, 5, 189, 54, 5, 202, 233, 54, 5, 239, 176, 54, 5, 239, 165, 54, - 5, 172, 54, 5, 169, 54, 5, 240, 136, 54, 5, 217, 159, 54, 5, 183, 54, 5, - 207, 50, 54, 5, 195, 115, 54, 5, 195, 74, 54, 5, 247, 174, 54, 5, 225, - 214, 54, 5, 216, 164, 54, 5, 164, 54, 5, 155, 54, 5, 225, 17, 54, 5, 217, - 50, 54, 5, 234, 123, 54, 5, 166, 54, 5, 176, 54, 5, 215, 109, 54, 5, 214, - 102, 54, 5, 214, 97, 54, 5, 231, 166, 54, 5, 197, 15, 54, 5, 197, 11, 54, - 5, 212, 91, 54, 5, 248, 187, 54, 5, 248, 103, 54, 5, 219, 221, 54, 5, - 223, 213, 54, 5, 219, 103, 54, 5, 234, 53, 54, 5, 235, 40, 54, 5, 198, - 233, 54, 5, 201, 247, 54, 5, 202, 164, 54, 5, 239, 155, 54, 5, 239, 160, - 54, 5, 221, 229, 54, 5, 209, 206, 54, 5, 239, 3, 54, 5, 217, 131, 54, 5, - 205, 171, 54, 5, 206, 190, 54, 5, 195, 8, 54, 5, 195, 55, 54, 5, 241, - 117, 54, 5, 225, 119, 54, 5, 216, 138, 54, 5, 195, 237, 54, 5, 223, 242, - 54, 5, 217, 34, 54, 5, 233, 132, 54, 5, 218, 195, 54, 5, 216, 33, 54, 5, - 215, 70, 54, 5, 66, 54, 5, 200, 72, 54, 5, 231, 75, 54, 5, 231, 59, 54, - 5, 196, 243, 54, 5, 196, 236, 54, 5, 211, 227, 54, 5, 248, 186, 54, 5, - 248, 21, 54, 5, 219, 220, 54, 5, 223, 211, 54, 5, 219, 102, 54, 5, 234, - 52, 54, 5, 234, 223, 54, 5, 197, 220, 54, 5, 201, 40, 54, 5, 202, 142, - 54, 5, 239, 153, 54, 5, 239, 159, 54, 5, 221, 191, 54, 5, 209, 140, 54, - 5, 237, 201, 54, 5, 217, 126, 54, 5, 204, 172, 54, 5, 206, 151, 54, 5, - 194, 255, 54, 5, 195, 51, 54, 5, 241, 41, 54, 5, 225, 110, 54, 5, 216, - 134, 54, 5, 195, 217, 54, 5, 223, 187, 54, 5, 217, 33, 54, 5, 233, 76, - 54, 5, 218, 145, 54, 5, 215, 186, 54, 5, 215, 66, 54, 5, 72, 54, 5, 214, - 119, 54, 5, 216, 248, 54, 5, 231, 193, 54, 5, 231, 169, 54, 5, 197, 34, - 54, 5, 197, 16, 54, 5, 212, 117, 54, 5, 248, 188, 54, 5, 248, 116, 54, 5, - 219, 222, 54, 5, 223, 214, 54, 5, 219, 105, 54, 5, 234, 55, 54, 5, 234, - 54, 54, 5, 235, 51, 54, 5, 198, 248, 54, 5, 149, 54, 5, 202, 169, 54, 5, - 239, 156, 54, 5, 239, 161, 54, 5, 222, 7, 54, 5, 209, 232, 54, 5, 239, - 28, 54, 5, 217, 135, 54, 5, 205, 200, 54, 5, 206, 198, 54, 5, 195, 11, - 54, 5, 195, 57, 54, 5, 244, 182, 54, 5, 225, 129, 54, 5, 216, 139, 54, 5, - 196, 3, 54, 5, 224, 11, 54, 5, 217, 35, 54, 5, 233, 144, 54, 5, 218, 251, - 54, 5, 216, 50, 54, 5, 215, 73, 54, 5, 69, 54, 5, 236, 230, 54, 5, 217, - 55, 54, 5, 232, 147, 54, 5, 232, 101, 54, 5, 197, 109, 54, 5, 197, 92, - 54, 5, 213, 92, 54, 5, 248, 192, 54, 5, 249, 9, 54, 5, 219, 234, 54, 5, - 223, 219, 54, 5, 223, 217, 54, 5, 219, 111, 54, 5, 234, 62, 54, 5, 234, - 60, 54, 5, 235, 189, 54, 5, 199, 118, 54, 5, 203, 68, 54, 5, 202, 217, - 54, 5, 239, 167, 54, 5, 239, 164, 54, 5, 222, 197, 54, 5, 210, 183, 54, - 5, 239, 252, 54, 5, 217, 151, 54, 5, 208, 147, 54, 5, 206, 255, 54, 5, - 195, 88, 54, 5, 195, 65, 54, 5, 247, 57, 54, 5, 225, 193, 54, 5, 216, - 157, 54, 5, 196, 69, 54, 5, 224, 209, 54, 5, 217, 45, 54, 5, 217, 41, 54, - 5, 234, 48, 54, 5, 234, 34, 54, 5, 219, 207, 54, 5, 217, 118, 54, 5, 215, - 98, 54, 5, 217, 73, 54, 5, 222, 150, 54, 244, 159, 54, 234, 217, 204, - 226, 54, 211, 79, 78, 54, 5, 217, 134, 235, 239, 54, 5, 217, 134, 155, - 54, 5, 217, 134, 205, 171, 54, 16, 235, 178, 54, 16, 224, 198, 54, 16, - 202, 72, 54, 16, 216, 190, 54, 16, 249, 87, 54, 16, 235, 238, 54, 16, - 203, 162, 54, 16, 240, 86, 54, 16, 239, 2, 54, 16, 223, 164, 54, 16, 201, - 251, 54, 16, 239, 27, 54, 16, 225, 120, 54, 17, 195, 79, 54, 17, 100, 54, - 17, 102, 54, 17, 134, 54, 17, 136, 54, 17, 146, 54, 17, 167, 54, 17, 178, - 54, 17, 171, 54, 17, 182, 54, 5, 217, 134, 166, 54, 5, 217, 134, 239, 28, - 40, 6, 1, 195, 83, 40, 4, 1, 195, 83, 40, 6, 1, 237, 151, 40, 4, 1, 237, - 151, 40, 6, 1, 210, 89, 237, 153, 40, 4, 1, 210, 89, 237, 153, 40, 6, 1, - 226, 7, 40, 4, 1, 226, 7, 40, 6, 1, 239, 45, 40, 4, 1, 239, 45, 40, 6, 1, - 218, 203, 200, 87, 40, 4, 1, 218, 203, 200, 87, 40, 6, 1, 248, 35, 214, - 124, 40, 4, 1, 248, 35, 214, 124, 40, 6, 1, 217, 85, 196, 51, 40, 4, 1, - 217, 85, 196, 51, 40, 6, 1, 196, 48, 3, 249, 139, 196, 51, 40, 4, 1, 196, - 48, 3, 249, 139, 196, 51, 40, 6, 1, 226, 5, 196, 84, 40, 4, 1, 226, 5, - 196, 84, 40, 6, 1, 210, 89, 195, 217, 40, 4, 1, 210, 89, 195, 217, 40, 6, - 1, 226, 5, 63, 40, 4, 1, 226, 5, 63, 40, 6, 1, 244, 203, 222, 47, 195, - 182, 40, 4, 1, 244, 203, 222, 47, 195, 182, 40, 6, 1, 248, 128, 195, 182, - 40, 4, 1, 248, 128, 195, 182, 40, 6, 1, 226, 5, 244, 203, 222, 47, 195, - 182, 40, 4, 1, 226, 5, 244, 203, 222, 47, 195, 182, 40, 6, 1, 196, 5, 40, - 4, 1, 196, 5, 40, 6, 1, 210, 89, 201, 107, 40, 4, 1, 210, 89, 201, 107, - 40, 6, 1, 205, 186, 239, 252, 40, 4, 1, 205, 186, 239, 252, 40, 6, 1, - 205, 186, 237, 7, 40, 4, 1, 205, 186, 237, 7, 40, 6, 1, 205, 186, 236, - 241, 40, 4, 1, 205, 186, 236, 241, 40, 6, 1, 218, 207, 72, 40, 4, 1, 218, - 207, 72, 40, 6, 1, 248, 160, 72, 40, 4, 1, 248, 160, 72, 40, 6, 1, 52, - 218, 207, 72, 40, 4, 1, 52, 218, 207, 72, 40, 1, 218, 121, 72, 38, 40, - 197, 201, 38, 40, 203, 24, 219, 27, 55, 38, 40, 231, 58, 219, 27, 55, 38, - 40, 202, 159, 219, 27, 55, 205, 246, 250, 179, 38, 40, 1, 200, 84, 226, - 147, 38, 40, 1, 68, 38, 40, 1, 196, 24, 38, 40, 1, 66, 38, 40, 1, 232, - 173, 55, 38, 40, 1, 196, 47, 38, 40, 1, 205, 186, 55, 38, 40, 1, 214, - 124, 38, 40, 224, 221, 38, 40, 213, 99, 40, 224, 221, 40, 213, 99, 40, 6, - 1, 237, 166, 40, 4, 1, 237, 166, 40, 6, 1, 237, 142, 40, 4, 1, 237, 142, - 40, 6, 1, 195, 41, 40, 4, 1, 195, 41, 40, 6, 1, 247, 73, 40, 4, 1, 247, - 73, 40, 6, 1, 237, 138, 40, 4, 1, 237, 138, 40, 6, 1, 203, 69, 3, 112, - 122, 40, 4, 1, 203, 69, 3, 112, 122, 40, 6, 1, 200, 243, 40, 4, 1, 200, - 243, 40, 6, 1, 201, 82, 40, 4, 1, 201, 82, 40, 6, 1, 201, 87, 40, 4, 1, - 201, 87, 40, 6, 1, 203, 74, 40, 4, 1, 203, 74, 40, 6, 1, 231, 40, 40, 4, - 1, 231, 40, 40, 6, 1, 206, 127, 40, 4, 1, 206, 127, 40, 6, 1, 52, 72, 40, - 4, 1, 52, 72, 40, 6, 1, 241, 59, 72, 40, 4, 1, 241, 59, 72, 73, 1, 40, - 232, 173, 55, 73, 1, 40, 205, 186, 55, 38, 40, 1, 237, 47, 38, 40, 1, - 226, 5, 69, 25, 1, 63, 25, 1, 155, 25, 1, 66, 25, 1, 223, 187, 25, 1, - 237, 54, 25, 1, 210, 155, 25, 1, 203, 145, 25, 1, 72, 25, 1, 215, 89, 25, - 1, 68, 25, 1, 172, 25, 1, 161, 25, 1, 210, 9, 25, 1, 210, 57, 25, 1, 222, - 187, 25, 1, 219, 187, 25, 1, 203, 162, 25, 1, 217, 157, 25, 1, 216, 162, - 25, 1, 221, 136, 25, 1, 204, 74, 25, 1, 218, 145, 25, 1, 206, 218, 25, 1, - 206, 112, 25, 1, 206, 228, 25, 1, 207, 72, 25, 1, 223, 106, 25, 1, 224, - 172, 25, 1, 215, 154, 25, 1, 215, 186, 25, 1, 216, 133, 25, 1, 195, 234, - 25, 1, 206, 151, 25, 1, 195, 186, 25, 1, 164, 25, 1, 215, 223, 25, 1, - 224, 158, 25, 1, 213, 10, 25, 1, 216, 155, 25, 1, 215, 203, 25, 1, 211, - 218, 25, 1, 196, 240, 25, 1, 213, 79, 25, 1, 235, 182, 25, 1, 209, 140, - 25, 1, 221, 191, 25, 1, 219, 78, 25, 1, 216, 223, 25, 1, 210, 91, 25, 1, - 210, 229, 25, 1, 224, 182, 25, 1, 216, 255, 25, 1, 217, 50, 25, 1, 217, - 71, 25, 1, 206, 198, 25, 1, 211, 223, 25, 1, 234, 223, 25, 1, 235, 44, - 25, 1, 197, 166, 25, 1, 176, 25, 1, 222, 109, 25, 1, 212, 220, 25, 1, - 221, 221, 25, 1, 224, 11, 25, 1, 219, 231, 25, 1, 210, 126, 25, 1, 219, - 164, 25, 1, 166, 25, 1, 202, 122, 25, 1, 224, 101, 25, 1, 218, 251, 25, - 1, 219, 239, 25, 1, 203, 1, 25, 1, 223, 223, 25, 1, 203, 23, 25, 1, 215, - 189, 25, 1, 208, 227, 25, 1, 235, 235, 25, 1, 223, 226, 25, 1, 224, 2, - 25, 38, 117, 223, 235, 25, 38, 117, 201, 25, 25, 216, 161, 25, 234, 217, - 204, 226, 25, 244, 168, 25, 244, 159, 25, 207, 105, 25, 211, 79, 78, 73, - 1, 245, 61, 152, 196, 13, 212, 171, 73, 1, 245, 61, 152, 196, 96, 212, - 171, 73, 1, 245, 61, 152, 196, 13, 207, 23, 73, 1, 245, 61, 152, 196, 96, - 207, 23, 73, 1, 245, 61, 152, 196, 13, 211, 97, 73, 1, 245, 61, 152, 196, - 96, 211, 97, 73, 1, 245, 61, 152, 196, 13, 209, 140, 73, 1, 245, 61, 152, - 196, 96, 209, 140, 73, 1, 236, 74, 237, 250, 152, 154, 73, 1, 130, 237, - 250, 152, 154, 73, 1, 219, 65, 237, 250, 152, 154, 73, 1, 126, 237, 250, - 152, 154, 73, 1, 236, 73, 237, 250, 152, 154, 73, 1, 236, 74, 237, 250, - 222, 176, 152, 154, 73, 1, 130, 237, 250, 222, 176, 152, 154, 73, 1, 219, - 65, 237, 250, 222, 176, 152, 154, 73, 1, 126, 237, 250, 222, 176, 152, - 154, 73, 1, 236, 73, 237, 250, 222, 176, 152, 154, 73, 1, 236, 74, 222, - 176, 152, 154, 73, 1, 130, 222, 176, 152, 154, 73, 1, 219, 65, 222, 176, - 152, 154, 73, 1, 126, 222, 176, 152, 154, 73, 1, 236, 73, 222, 176, 152, - 154, 73, 1, 76, 83, 154, 73, 1, 76, 205, 248, 73, 1, 76, 231, 155, 154, - 73, 1, 221, 203, 53, 241, 102, 251, 90, 73, 1, 210, 215, 124, 51, 73, 1, - 210, 215, 135, 51, 73, 1, 210, 215, 236, 90, 78, 73, 1, 210, 215, 226, - 17, 236, 90, 78, 73, 1, 126, 226, 17, 236, 90, 78, 73, 1, 204, 206, 26, - 130, 202, 11, 73, 1, 204, 206, 26, 126, 202, 11, 8, 6, 1, 237, 42, 251, - 164, 8, 4, 1, 237, 42, 251, 164, 8, 6, 1, 237, 42, 251, 194, 8, 4, 1, - 237, 42, 251, 194, 8, 6, 1, 232, 99, 8, 4, 1, 232, 99, 8, 6, 1, 200, 187, - 8, 4, 1, 200, 187, 8, 6, 1, 201, 184, 8, 4, 1, 201, 184, 8, 6, 1, 241, - 38, 8, 4, 1, 241, 38, 8, 6, 1, 241, 39, 3, 244, 159, 8, 4, 1, 241, 39, 3, - 244, 159, 8, 1, 4, 6, 236, 49, 8, 1, 4, 6, 209, 80, 8, 6, 1, 252, 168, 8, - 4, 1, 252, 168, 8, 6, 1, 251, 49, 8, 4, 1, 251, 49, 8, 6, 1, 250, 150, 8, - 4, 1, 250, 150, 8, 6, 1, 250, 133, 8, 4, 1, 250, 133, 8, 6, 1, 250, 134, - 3, 231, 155, 154, 8, 4, 1, 250, 134, 3, 231, 155, 154, 8, 6, 1, 250, 122, - 8, 4, 1, 250, 122, 8, 6, 1, 210, 89, 247, 208, 3, 238, 253, 8, 4, 1, 210, - 89, 247, 208, 3, 238, 253, 8, 6, 1, 225, 81, 3, 106, 8, 4, 1, 225, 81, 3, - 106, 8, 6, 1, 225, 81, 3, 239, 147, 106, 8, 4, 1, 225, 81, 3, 239, 147, - 106, 8, 6, 1, 225, 81, 3, 204, 196, 26, 239, 147, 106, 8, 4, 1, 225, 81, - 3, 204, 196, 26, 239, 147, 106, 8, 6, 1, 248, 33, 159, 8, 4, 1, 248, 33, - 159, 8, 6, 1, 223, 100, 3, 130, 106, 8, 4, 1, 223, 100, 3, 130, 106, 8, - 6, 1, 177, 3, 181, 204, 196, 214, 20, 8, 4, 1, 177, 3, 181, 204, 196, - 214, 20, 8, 6, 1, 177, 3, 221, 225, 8, 4, 1, 177, 3, 221, 225, 8, 6, 1, - 214, 102, 8, 4, 1, 214, 102, 8, 6, 1, 214, 4, 3, 204, 196, 202, 145, 239, - 195, 8, 4, 1, 214, 4, 3, 204, 196, 202, 145, 239, 195, 8, 6, 1, 214, 4, - 3, 235, 64, 8, 4, 1, 214, 4, 3, 235, 64, 8, 6, 1, 214, 4, 3, 205, 86, - 203, 135, 8, 4, 1, 214, 4, 3, 205, 86, 203, 135, 8, 6, 1, 211, 168, 3, - 204, 196, 202, 145, 239, 195, 8, 4, 1, 211, 168, 3, 204, 196, 202, 145, - 239, 195, 8, 6, 1, 211, 168, 3, 239, 147, 106, 8, 4, 1, 211, 168, 3, 239, - 147, 106, 8, 6, 1, 211, 32, 209, 188, 8, 4, 1, 211, 32, 209, 188, 8, 6, - 1, 209, 121, 209, 188, 8, 4, 1, 209, 121, 209, 188, 8, 6, 1, 199, 231, 3, - 239, 147, 106, 8, 4, 1, 199, 231, 3, 239, 147, 106, 8, 6, 1, 197, 207, 8, - 4, 1, 197, 207, 8, 6, 1, 199, 0, 195, 158, 8, 4, 1, 199, 0, 195, 158, 8, - 6, 1, 202, 163, 3, 106, 8, 4, 1, 202, 163, 3, 106, 8, 6, 1, 202, 163, 3, - 204, 196, 202, 145, 239, 195, 8, 4, 1, 202, 163, 3, 204, 196, 202, 145, - 239, 195, 8, 6, 1, 199, 107, 8, 4, 1, 199, 107, 8, 6, 1, 236, 128, 8, 4, - 1, 236, 128, 8, 6, 1, 225, 248, 8, 4, 1, 225, 248, 8, 6, 1, 241, 155, 8, - 4, 1, 241, 155, 73, 1, 200, 4, 8, 4, 1, 237, 190, 8, 4, 1, 221, 174, 8, - 4, 1, 218, 114, 8, 4, 1, 215, 145, 8, 4, 1, 209, 120, 8, 1, 4, 6, 209, - 120, 8, 4, 1, 201, 22, 8, 4, 1, 200, 79, 8, 6, 1, 226, 39, 240, 231, 8, - 4, 1, 226, 39, 240, 231, 8, 6, 1, 226, 39, 236, 49, 8, 4, 1, 226, 39, - 236, 49, 8, 6, 1, 226, 39, 234, 190, 8, 6, 1, 163, 226, 39, 234, 190, 8, - 4, 1, 163, 226, 39, 234, 190, 8, 6, 1, 163, 159, 8, 4, 1, 163, 159, 8, 6, - 1, 226, 39, 144, 8, 4, 1, 226, 39, 144, 8, 6, 1, 226, 39, 209, 80, 8, 4, - 1, 226, 39, 209, 80, 8, 6, 1, 226, 39, 203, 216, 8, 4, 1, 226, 39, 203, - 216, 73, 1, 126, 244, 241, 252, 22, 73, 1, 244, 168, 73, 1, 206, 182, - 236, 172, 55, 8, 6, 1, 208, 231, 8, 4, 1, 208, 231, 8, 6, 1, 163, 233, - 15, 8, 4, 1, 223, 100, 3, 210, 95, 231, 165, 26, 248, 225, 8, 1, 206, 55, - 238, 253, 8, 6, 1, 218, 56, 3, 239, 195, 8, 4, 1, 218, 56, 3, 239, 195, - 8, 6, 1, 247, 208, 3, 154, 8, 4, 1, 247, 208, 3, 154, 8, 4, 1, 247, 208, - 3, 213, 215, 122, 8, 4, 1, 233, 16, 3, 213, 215, 122, 8, 6, 1, 74, 3, - 235, 64, 8, 4, 1, 74, 3, 235, 64, 8, 6, 1, 236, 50, 3, 106, 8, 4, 1, 236, - 50, 3, 106, 8, 6, 1, 198, 240, 251, 245, 8, 4, 1, 198, 240, 251, 245, 8, - 6, 1, 198, 240, 214, 164, 8, 4, 1, 198, 240, 214, 164, 8, 6, 1, 198, 240, - 200, 99, 8, 4, 1, 198, 240, 200, 99, 8, 6, 1, 234, 191, 3, 214, 182, 106, - 8, 4, 1, 234, 191, 3, 214, 182, 106, 8, 6, 1, 225, 81, 3, 214, 182, 106, - 8, 4, 1, 225, 81, 3, 214, 182, 106, 8, 6, 1, 218, 56, 3, 214, 182, 106, - 8, 4, 1, 218, 56, 3, 214, 182, 106, 8, 6, 1, 211, 32, 3, 214, 182, 106, - 8, 4, 1, 211, 32, 3, 214, 182, 106, 8, 6, 1, 209, 81, 3, 214, 182, 106, - 8, 4, 1, 209, 81, 3, 214, 182, 106, 8, 6, 1, 233, 16, 3, 122, 8, 6, 1, - 210, 89, 192, 69, 8, 6, 1, 145, 234, 190, 8, 6, 1, 223, 100, 3, 248, 225, - 8, 6, 1, 4, 6, 68, 8, 1, 4, 6, 211, 167, 8, 6, 1, 163, 225, 80, 8, 6, 1, - 163, 203, 216, 8, 6, 1, 225, 218, 3, 241, 57, 8, 6, 1, 245, 75, 8, 6, 1, - 248, 206, 8, 4, 1, 248, 206, 8, 6, 1, 214, 124, 8, 4, 1, 214, 124, 8, 6, - 1, 118, 3, 106, 8, 4, 1, 118, 3, 106, 8, 6, 1, 233, 152, 63, 8, 4, 1, - 233, 152, 63, 8, 6, 1, 233, 152, 68, 8, 4, 1, 233, 152, 68, 8, 6, 1, 233, - 152, 66, 8, 4, 1, 233, 152, 66, 8, 6, 1, 251, 87, 197, 199, 8, 4, 1, 251, - 87, 197, 199, 8, 6, 1, 247, 208, 3, 213, 215, 122, 8, 6, 1, 209, 81, 3, - 122, 8, 6, 1, 195, 159, 3, 213, 215, 122, 8, 236, 177, 1, 206, 96, 68, - 73, 1, 6, 233, 16, 3, 106, 73, 1, 4, 33, 214, 164, 8, 1, 4, 6, 163, 221, - 136, 8, 236, 177, 1, 210, 89, 236, 49, 8, 236, 177, 1, 210, 89, 214, 3, - 8, 236, 177, 1, 226, 17, 221, 136, 8, 236, 177, 1, 230, 249, 221, 231, 8, - 236, 177, 1, 250, 251, 221, 136, 204, 41, 217, 232, 1, 63, 204, 41, 217, - 232, 1, 68, 204, 41, 217, 232, 2, 237, 168, 204, 41, 217, 232, 1, 66, - 204, 41, 217, 232, 1, 69, 204, 41, 217, 232, 1, 72, 204, 41, 217, 232, 2, - 232, 167, 204, 41, 217, 232, 1, 224, 11, 204, 41, 217, 232, 1, 224, 117, - 204, 41, 217, 232, 1, 233, 144, 204, 41, 217, 232, 1, 233, 202, 204, 41, - 217, 232, 2, 251, 51, 204, 41, 217, 232, 1, 244, 182, 204, 41, 217, 232, - 1, 245, 49, 204, 41, 217, 232, 1, 225, 129, 204, 41, 217, 232, 1, 225, - 174, 204, 41, 217, 232, 1, 201, 55, 204, 41, 217, 232, 1, 201, 61, 204, - 41, 217, 232, 1, 240, 11, 204, 41, 217, 232, 1, 240, 20, 204, 41, 217, - 232, 1, 149, 204, 41, 217, 232, 1, 202, 169, 204, 41, 217, 232, 1, 239, - 28, 204, 41, 217, 232, 1, 239, 156, 204, 41, 217, 232, 1, 216, 50, 204, - 41, 217, 232, 1, 212, 117, 204, 41, 217, 232, 1, 212, 234, 204, 41, 217, - 232, 1, 248, 116, 204, 41, 217, 232, 1, 248, 188, 204, 41, 217, 232, 1, - 218, 251, 204, 41, 217, 232, 1, 209, 232, 204, 41, 217, 232, 1, 222, 7, - 204, 41, 217, 232, 1, 209, 167, 204, 41, 217, 232, 1, 205, 200, 204, 41, - 217, 232, 1, 231, 193, 204, 41, 217, 232, 18, 2, 63, 204, 41, 217, 232, - 18, 2, 68, 204, 41, 217, 232, 18, 2, 66, 204, 41, 217, 232, 18, 2, 69, - 204, 41, 217, 232, 18, 2, 214, 102, 204, 41, 217, 232, 212, 112, 220, 28, - 204, 41, 217, 232, 212, 112, 220, 27, 204, 41, 217, 232, 212, 112, 220, - 26, 204, 41, 217, 232, 212, 112, 220, 25, 173, 226, 70, 191, 97, 211, 87, - 173, 226, 70, 191, 97, 232, 225, 173, 226, 70, 191, 115, 211, 85, 173, - 226, 70, 191, 97, 206, 21, 173, 226, 70, 191, 97, 237, 26, 173, 226, 70, - 191, 115, 206, 18, 173, 226, 70, 211, 88, 78, 173, 226, 70, 212, 148, 78, - 173, 226, 70, 209, 108, 78, 173, 226, 70, 211, 89, 78, 213, 2, 1, 155, - 213, 2, 1, 224, 146, 213, 2, 1, 234, 123, 213, 2, 1, 217, 71, 213, 2, 1, - 247, 174, 213, 2, 1, 247, 16, 213, 2, 1, 225, 214, 213, 2, 1, 215, 109, - 213, 2, 1, 189, 213, 2, 1, 202, 233, 213, 2, 1, 240, 136, 213, 2, 1, 176, - 213, 2, 1, 161, 213, 2, 1, 213, 6, 213, 2, 1, 249, 145, 213, 2, 1, 166, - 213, 2, 1, 201, 113, 213, 2, 1, 201, 103, 213, 2, 1, 237, 156, 213, 2, 1, - 197, 166, 213, 2, 1, 195, 74, 213, 2, 1, 195, 115, 213, 2, 1, 4, 63, 213, - 2, 1, 164, 213, 2, 1, 169, 213, 2, 1, 172, 213, 2, 1, 207, 50, 213, 2, 1, - 183, 213, 2, 1, 142, 213, 2, 1, 63, 213, 2, 1, 68, 213, 2, 1, 66, 213, 2, - 1, 69, 213, 2, 1, 72, 213, 2, 1, 211, 159, 213, 2, 1, 196, 208, 213, 2, - 1, 235, 239, 213, 2, 1, 234, 10, 213, 2, 1, 237, 54, 213, 2, 204, 152, 1, - 197, 166, 213, 2, 204, 152, 1, 164, 213, 2, 1, 201, 78, 213, 2, 1, 201, - 66, 213, 2, 1, 240, 41, 213, 2, 1, 216, 86, 213, 2, 1, 251, 131, 164, - 213, 2, 1, 198, 243, 207, 50, 213, 2, 1, 198, 244, 142, 213, 2, 1, 250, - 186, 235, 239, 213, 2, 204, 152, 1, 169, 213, 2, 204, 98, 1, 169, 213, 2, - 1, 247, 133, 213, 2, 206, 62, 232, 138, 78, 213, 2, 52, 232, 138, 78, - 213, 2, 117, 207, 42, 213, 2, 117, 52, 207, 42, 208, 188, 2, 251, 51, - 208, 188, 2, 199, 2, 208, 188, 1, 63, 208, 188, 1, 252, 168, 208, 188, 1, - 68, 208, 188, 1, 226, 120, 208, 188, 1, 66, 208, 188, 1, 199, 245, 208, - 188, 1, 110, 144, 208, 188, 1, 110, 209, 182, 208, 188, 1, 110, 159, 208, - 188, 1, 110, 222, 38, 208, 188, 1, 69, 208, 188, 1, 237, 54, 208, 188, 1, - 251, 200, 208, 188, 1, 72, 208, 188, 1, 214, 102, 208, 188, 1, 250, 150, - 208, 188, 1, 155, 208, 188, 1, 224, 146, 208, 188, 1, 234, 123, 208, 188, - 1, 233, 230, 208, 188, 1, 217, 71, 208, 188, 1, 247, 174, 208, 188, 1, - 247, 16, 208, 188, 1, 225, 214, 208, 188, 1, 225, 180, 208, 188, 1, 215, - 109, 208, 188, 1, 201, 78, 208, 188, 1, 201, 66, 208, 188, 1, 240, 41, - 208, 188, 1, 240, 25, 208, 188, 1, 216, 86, 208, 188, 1, 189, 208, 188, - 1, 202, 233, 208, 188, 1, 240, 136, 208, 188, 1, 239, 176, 208, 188, 1, - 176, 208, 188, 1, 161, 208, 188, 1, 213, 6, 208, 188, 1, 249, 145, 208, - 188, 1, 248, 197, 208, 188, 1, 166, 208, 188, 1, 164, 208, 188, 1, 169, - 208, 188, 1, 172, 208, 188, 1, 199, 152, 208, 188, 1, 207, 50, 208, 188, - 1, 205, 80, 208, 188, 1, 183, 208, 188, 1, 142, 208, 188, 1, 222, 37, - 208, 188, 108, 2, 232, 244, 208, 188, 18, 2, 252, 168, 208, 188, 18, 2, - 68, 208, 188, 18, 2, 226, 120, 208, 188, 18, 2, 66, 208, 188, 18, 2, 199, - 245, 208, 188, 18, 2, 110, 144, 208, 188, 18, 2, 110, 209, 182, 208, 188, - 18, 2, 110, 159, 208, 188, 18, 2, 110, 222, 38, 208, 188, 18, 2, 69, 208, - 188, 18, 2, 237, 54, 208, 188, 18, 2, 251, 200, 208, 188, 18, 2, 72, 208, - 188, 18, 2, 214, 102, 208, 188, 18, 2, 250, 150, 208, 188, 2, 199, 7, - 208, 188, 2, 247, 133, 208, 188, 240, 88, 208, 188, 52, 240, 88, 208, - 188, 17, 195, 79, 208, 188, 17, 100, 208, 188, 17, 102, 208, 188, 17, - 134, 208, 188, 17, 136, 208, 188, 17, 146, 208, 188, 17, 167, 208, 188, - 17, 178, 208, 188, 17, 171, 208, 188, 17, 182, 38, 101, 17, 195, 79, 38, - 101, 17, 100, 38, 101, 17, 102, 38, 101, 17, 134, 38, 101, 17, 136, 38, - 101, 17, 146, 38, 101, 17, 167, 38, 101, 17, 178, 38, 101, 17, 171, 38, - 101, 17, 182, 38, 101, 1, 63, 38, 101, 1, 66, 38, 101, 1, 155, 38, 101, - 1, 176, 38, 101, 1, 161, 38, 101, 1, 169, 38, 101, 1, 199, 34, 38, 101, - 2, 250, 132, 101, 2, 205, 147, 247, 133, 101, 2, 247, 134, 199, 7, 101, - 2, 52, 247, 134, 199, 7, 101, 2, 247, 134, 102, 101, 2, 247, 134, 134, - 101, 2, 247, 134, 250, 132, 101, 2, 211, 196, 101, 234, 87, 235, 134, - 101, 247, 110, 101, 232, 130, 101, 2, 206, 100, 101, 225, 206, 214, 127, - 101, 1, 250, 122, 101, 18, 2, 250, 122, 224, 215, 222, 110, 17, 195, 79, - 224, 215, 222, 110, 17, 100, 224, 215, 222, 110, 17, 102, 224, 215, 222, - 110, 17, 134, 224, 215, 222, 110, 17, 136, 224, 215, 222, 110, 17, 146, - 224, 215, 222, 110, 17, 167, 224, 215, 222, 110, 17, 178, 224, 215, 222, - 110, 17, 171, 224, 215, 222, 110, 17, 182, 224, 215, 222, 110, 1, 155, - 224, 215, 222, 110, 1, 224, 146, 224, 215, 222, 110, 1, 234, 123, 224, - 215, 222, 110, 1, 217, 71, 224, 215, 222, 110, 1, 183, 224, 215, 222, - 110, 1, 207, 50, 224, 215, 222, 110, 1, 195, 115, 224, 215, 222, 110, 1, - 215, 109, 224, 215, 222, 110, 1, 189, 224, 215, 222, 110, 1, 231, 79, - 224, 215, 222, 110, 1, 176, 224, 215, 222, 110, 1, 161, 224, 215, 222, - 110, 1, 213, 6, 224, 215, 222, 110, 1, 166, 224, 215, 222, 110, 1, 240, - 136, 224, 215, 222, 110, 1, 249, 145, 224, 215, 222, 110, 1, 169, 224, - 215, 222, 110, 1, 164, 224, 215, 222, 110, 1, 172, 224, 215, 222, 110, 1, - 197, 166, 224, 215, 222, 110, 1, 202, 233, 224, 215, 222, 110, 1, 142, - 224, 215, 222, 110, 1, 199, 152, 224, 215, 222, 110, 1, 247, 174, 224, - 215, 222, 110, 1, 63, 224, 215, 222, 110, 1, 214, 164, 224, 215, 222, - 110, 1, 68, 224, 215, 222, 110, 1, 214, 102, 224, 215, 222, 110, 18, 200, - 99, 224, 215, 222, 110, 18, 69, 224, 215, 222, 110, 18, 66, 224, 215, - 222, 110, 18, 237, 54, 224, 215, 222, 110, 18, 72, 224, 215, 222, 110, - 152, 212, 133, 224, 215, 222, 110, 152, 247, 149, 224, 215, 222, 110, - 152, 247, 150, 212, 133, 224, 215, 222, 110, 2, 240, 250, 224, 215, 222, - 110, 2, 206, 120, 210, 138, 1, 155, 210, 138, 1, 234, 123, 210, 138, 1, - 217, 71, 210, 138, 1, 189, 210, 138, 1, 240, 136, 210, 138, 1, 176, 210, - 138, 1, 161, 210, 138, 1, 249, 145, 210, 138, 1, 166, 210, 138, 1, 247, - 174, 210, 138, 1, 225, 214, 210, 138, 1, 215, 109, 210, 138, 1, 183, 210, - 138, 1, 169, 210, 138, 1, 172, 210, 138, 1, 164, 210, 138, 1, 197, 166, - 210, 138, 1, 142, 210, 138, 1, 219, 241, 210, 138, 1, 217, 50, 210, 138, - 1, 217, 159, 210, 138, 1, 215, 74, 210, 138, 1, 63, 210, 138, 18, 2, 68, - 210, 138, 18, 2, 66, 210, 138, 18, 2, 69, 210, 138, 18, 2, 251, 200, 210, - 138, 18, 2, 72, 210, 138, 18, 2, 250, 150, 210, 138, 18, 2, 236, 116, - 210, 138, 18, 2, 237, 82, 210, 138, 108, 2, 217, 73, 210, 138, 108, 2, - 218, 55, 210, 138, 108, 2, 144, 210, 138, 108, 2, 233, 15, 210, 138, 199, - 7, 210, 138, 208, 133, 78, 29, 137, 202, 93, 29, 137, 202, 92, 29, 137, - 202, 90, 29, 137, 202, 95, 29, 137, 210, 49, 29, 137, 210, 33, 29, 137, - 210, 28, 29, 137, 210, 30, 29, 137, 210, 46, 29, 137, 210, 39, 29, 137, - 210, 32, 29, 137, 210, 51, 29, 137, 210, 34, 29, 137, 210, 53, 29, 137, - 210, 50, 29, 137, 219, 52, 29, 137, 219, 43, 29, 137, 219, 46, 29, 137, - 212, 191, 29, 137, 212, 202, 29, 137, 212, 203, 29, 137, 205, 64, 29, - 137, 226, 133, 29, 137, 226, 140, 29, 137, 205, 75, 29, 137, 205, 62, 29, - 137, 212, 243, 29, 137, 232, 50, 29, 137, 205, 59, 225, 199, 2, 213, 169, - 225, 199, 2, 247, 54, 225, 199, 2, 222, 205, 225, 199, 2, 197, 55, 225, - 199, 1, 63, 225, 199, 1, 230, 249, 224, 219, 225, 199, 1, 68, 225, 199, - 1, 226, 120, 225, 199, 1, 66, 225, 199, 1, 213, 244, 247, 24, 225, 199, - 1, 217, 72, 222, 163, 225, 199, 1, 217, 72, 222, 164, 210, 199, 225, 199, - 1, 69, 225, 199, 1, 251, 200, 225, 199, 1, 72, 225, 199, 1, 155, 225, - 199, 1, 225, 70, 208, 201, 225, 199, 1, 225, 70, 218, 99, 225, 199, 1, - 234, 123, 225, 199, 1, 234, 124, 218, 99, 225, 199, 1, 217, 71, 225, 199, - 1, 247, 174, 225, 199, 1, 247, 175, 218, 99, 225, 199, 1, 225, 214, 225, - 199, 1, 215, 110, 218, 99, 225, 199, 1, 225, 215, 220, 85, 225, 199, 1, - 215, 109, 225, 199, 1, 201, 78, 225, 199, 1, 201, 79, 220, 85, 225, 199, - 1, 240, 41, 225, 199, 1, 240, 42, 220, 85, 225, 199, 1, 218, 1, 218, 99, - 225, 199, 1, 189, 225, 199, 1, 203, 169, 218, 99, 225, 199, 1, 240, 136, - 225, 199, 1, 240, 137, 220, 85, 225, 199, 1, 176, 225, 199, 1, 161, 225, - 199, 1, 213, 244, 218, 99, 225, 199, 1, 249, 145, 225, 199, 1, 249, 146, - 218, 99, 225, 199, 1, 166, 225, 199, 1, 164, 225, 199, 1, 169, 225, 199, - 1, 210, 252, 251, 210, 225, 199, 1, 172, 225, 199, 1, 197, 166, 225, 199, - 1, 209, 23, 218, 99, 225, 199, 1, 209, 23, 220, 85, 225, 199, 1, 183, - 225, 199, 1, 142, 225, 199, 2, 247, 55, 203, 27, 225, 199, 18, 2, 203, - 97, 225, 199, 18, 2, 202, 16, 225, 199, 18, 2, 196, 237, 225, 199, 18, 2, - 196, 238, 219, 175, 225, 199, 18, 2, 204, 121, 225, 199, 18, 2, 204, 122, - 219, 163, 225, 199, 18, 2, 203, 121, 225, 199, 18, 2, 239, 82, 218, 98, - 225, 199, 18, 2, 213, 48, 225, 199, 108, 2, 224, 175, 225, 199, 108, 2, - 213, 62, 225, 199, 108, 2, 247, 159, 225, 199, 213, 182, 225, 199, 50, - 210, 111, 225, 199, 53, 210, 111, 225, 199, 213, 232, 251, 99, 225, 199, - 213, 232, 220, 105, 225, 199, 213, 232, 221, 178, 225, 199, 213, 232, - 197, 48, 225, 199, 213, 232, 213, 183, 225, 199, 213, 232, 222, 67, 225, - 199, 213, 232, 221, 172, 225, 199, 213, 232, 252, 0, 225, 199, 213, 232, - 252, 1, 252, 0, 225, 199, 213, 232, 212, 159, 225, 199, 163, 213, 232, - 212, 159, 225, 199, 213, 178, 225, 199, 17, 195, 79, 225, 199, 17, 100, - 225, 199, 17, 102, 225, 199, 17, 134, 225, 199, 17, 136, 225, 199, 17, - 146, 225, 199, 17, 167, 225, 199, 17, 178, 225, 199, 17, 171, 225, 199, - 17, 182, 225, 199, 213, 232, 202, 59, 201, 19, 225, 199, 213, 232, 225, - 244, 75, 1, 207, 25, 233, 230, 75, 1, 207, 25, 247, 16, 75, 1, 207, 25, - 225, 180, 75, 1, 207, 25, 216, 86, 75, 1, 207, 25, 248, 197, 75, 2, 207, - 25, 208, 185, 75, 73, 1, 207, 25, 210, 156, 75, 1, 49, 223, 53, 215, 109, - 75, 1, 49, 223, 53, 235, 239, 75, 1, 49, 223, 53, 234, 123, 75, 1, 49, - 223, 53, 233, 230, 75, 1, 49, 223, 53, 225, 214, 75, 1, 49, 223, 53, 225, - 180, 75, 1, 49, 223, 53, 240, 41, 75, 1, 49, 223, 53, 240, 25, 75, 1, 49, - 223, 53, 216, 86, 75, 49, 223, 53, 17, 195, 79, 75, 49, 223, 53, 17, 100, - 75, 49, 223, 53, 17, 102, 75, 49, 223, 53, 17, 134, 75, 49, 223, 53, 17, - 136, 75, 49, 223, 53, 17, 146, 75, 49, 223, 53, 17, 167, 75, 49, 223, 53, - 17, 178, 75, 49, 223, 53, 17, 171, 75, 49, 223, 53, 17, 182, 75, 1, 49, - 223, 53, 222, 37, 75, 1, 49, 223, 53, 240, 136, 75, 1, 49, 223, 53, 239, - 176, 75, 1, 49, 223, 53, 249, 145, 75, 1, 49, 223, 53, 248, 197, 247, 9, - 1, 63, 247, 9, 1, 68, 247, 9, 1, 66, 247, 9, 1, 69, 247, 9, 1, 251, 200, - 247, 9, 1, 72, 247, 9, 1, 155, 247, 9, 1, 224, 146, 247, 9, 1, 234, 123, - 247, 9, 1, 233, 230, 247, 9, 1, 216, 236, 247, 9, 1, 217, 71, 247, 9, 1, - 247, 16, 247, 9, 1, 245, 77, 247, 9, 1, 225, 214, 247, 9, 1, 225, 180, - 247, 9, 1, 216, 225, 247, 9, 1, 216, 227, 247, 9, 1, 216, 226, 247, 9, 1, - 189, 247, 9, 1, 202, 233, 247, 9, 1, 240, 136, 247, 9, 1, 239, 176, 247, - 9, 1, 215, 152, 247, 9, 1, 176, 247, 9, 1, 240, 41, 247, 9, 1, 161, 247, - 9, 1, 212, 54, 247, 9, 1, 213, 6, 247, 9, 1, 249, 145, 247, 9, 1, 248, - 197, 247, 9, 1, 218, 133, 247, 9, 1, 166, 247, 9, 1, 249, 45, 247, 9, 1, - 164, 247, 9, 1, 169, 247, 9, 1, 172, 247, 9, 1, 199, 152, 247, 9, 1, 205, - 80, 247, 9, 1, 183, 247, 9, 1, 142, 247, 9, 18, 2, 252, 168, 247, 9, 18, - 2, 68, 247, 9, 18, 2, 226, 120, 247, 9, 18, 2, 237, 33, 247, 9, 18, 2, - 66, 247, 9, 18, 2, 214, 164, 247, 9, 18, 2, 72, 247, 9, 18, 2, 251, 200, - 247, 9, 18, 2, 250, 150, 247, 9, 18, 2, 200, 99, 247, 9, 108, 2, 164, - 247, 9, 108, 2, 169, 247, 9, 108, 2, 172, 247, 9, 108, 2, 197, 166, 247, - 9, 1, 48, 225, 80, 247, 9, 1, 48, 234, 190, 247, 9, 1, 48, 217, 73, 247, - 9, 108, 2, 48, 217, 73, 247, 9, 1, 48, 247, 18, 247, 9, 1, 48, 203, 216, - 247, 9, 1, 48, 218, 55, 247, 9, 1, 48, 214, 3, 247, 9, 1, 48, 196, 148, - 247, 9, 1, 48, 144, 247, 9, 1, 48, 159, 247, 9, 1, 48, 205, 83, 247, 9, - 108, 2, 48, 221, 136, 247, 9, 108, 2, 48, 233, 15, 247, 9, 17, 195, 79, - 247, 9, 17, 100, 247, 9, 17, 102, 247, 9, 17, 134, 247, 9, 17, 136, 247, - 9, 17, 146, 247, 9, 17, 167, 247, 9, 17, 178, 247, 9, 17, 171, 247, 9, - 17, 182, 247, 9, 211, 214, 205, 120, 247, 9, 211, 214, 240, 88, 247, 9, - 211, 214, 52, 240, 88, 247, 9, 211, 214, 201, 165, 240, 88, 75, 1, 224, - 139, 234, 123, 75, 1, 224, 139, 247, 174, 75, 1, 224, 139, 247, 16, 75, - 1, 224, 139, 225, 214, 75, 1, 224, 139, 225, 180, 75, 1, 224, 139, 215, - 109, 75, 1, 224, 139, 201, 78, 75, 1, 224, 139, 201, 66, 75, 1, 224, 139, - 240, 41, 75, 1, 224, 139, 240, 25, 75, 1, 224, 139, 239, 176, 75, 1, 224, - 139, 176, 75, 1, 224, 139, 183, 75, 1, 224, 139, 142, 75, 1, 224, 139, - 232, 80, 75, 1, 224, 139, 235, 239, 75, 73, 1, 224, 139, 210, 156, 75, 1, - 224, 139, 196, 208, 75, 1, 224, 139, 195, 115, 75, 1, 224, 139, 169, 75, - 221, 248, 224, 139, 214, 187, 75, 221, 248, 224, 139, 211, 110, 75, 221, - 248, 224, 139, 231, 248, 75, 16, 251, 186, 236, 89, 75, 16, 251, 186, - 100, 75, 16, 251, 186, 102, 75, 1, 251, 186, 169, 75, 2, 213, 165, 224, - 248, 202, 11, 75, 2, 49, 223, 53, 202, 9, 75, 2, 49, 223, 53, 202, 6, 75, - 1, 206, 128, 213, 212, 247, 16, 75, 1, 206, 128, 213, 212, 207, 50, 49, - 199, 24, 1, 126, 224, 11, 49, 199, 24, 1, 130, 224, 11, 49, 199, 24, 1, - 126, 224, 117, 49, 199, 24, 1, 130, 224, 117, 49, 199, 24, 1, 126, 224, - 126, 49, 199, 24, 1, 130, 224, 126, 49, 199, 24, 1, 126, 233, 144, 49, - 199, 24, 1, 130, 233, 144, 49, 199, 24, 1, 126, 216, 252, 49, 199, 24, 1, - 130, 216, 252, 49, 199, 24, 1, 126, 244, 182, 49, 199, 24, 1, 130, 244, - 182, 49, 199, 24, 1, 126, 245, 49, 49, 199, 24, 1, 130, 245, 49, 49, 199, - 24, 1, 126, 205, 200, 49, 199, 24, 1, 130, 205, 200, 49, 199, 24, 1, 126, - 215, 73, 49, 199, 24, 1, 130, 215, 73, 49, 199, 24, 1, 126, 239, 28, 49, - 199, 24, 1, 130, 239, 28, 49, 199, 24, 1, 126, 149, 49, 199, 24, 1, 130, - 149, 49, 199, 24, 1, 126, 202, 169, 49, 199, 24, 1, 130, 202, 169, 49, - 199, 24, 1, 126, 216, 50, 49, 199, 24, 1, 130, 216, 50, 49, 199, 24, 1, - 126, 248, 116, 49, 199, 24, 1, 130, 248, 116, 49, 199, 24, 1, 126, 212, - 117, 49, 199, 24, 1, 130, 212, 117, 49, 199, 24, 1, 126, 212, 234, 49, - 199, 24, 1, 130, 212, 234, 49, 199, 24, 1, 126, 235, 51, 49, 199, 24, 1, - 130, 235, 51, 49, 199, 24, 1, 126, 218, 251, 49, 199, 24, 1, 130, 218, - 251, 49, 199, 24, 1, 126, 196, 3, 49, 199, 24, 1, 130, 196, 3, 49, 199, - 24, 1, 126, 209, 232, 49, 199, 24, 1, 130, 209, 232, 49, 199, 24, 1, 126, - 222, 7, 49, 199, 24, 1, 130, 222, 7, 49, 199, 24, 1, 126, 198, 248, 49, - 199, 24, 1, 130, 198, 248, 49, 199, 24, 1, 126, 231, 193, 49, 199, 24, 1, - 130, 231, 193, 49, 199, 24, 1, 126, 72, 49, 199, 24, 1, 130, 72, 49, 199, - 24, 220, 82, 225, 13, 49, 199, 24, 18, 252, 168, 49, 199, 24, 18, 68, 49, - 199, 24, 18, 200, 99, 49, 199, 24, 18, 66, 49, 199, 24, 18, 69, 49, 199, - 24, 18, 72, 49, 199, 24, 220, 82, 224, 120, 49, 199, 24, 18, 230, 210, - 49, 199, 24, 18, 200, 98, 49, 199, 24, 18, 200, 114, 49, 199, 24, 18, - 250, 148, 49, 199, 24, 18, 250, 122, 49, 199, 24, 18, 251, 106, 49, 199, - 24, 18, 251, 123, 49, 199, 24, 152, 220, 82, 237, 14, 49, 199, 24, 152, - 220, 82, 215, 151, 49, 199, 24, 152, 220, 82, 202, 169, 49, 199, 24, 152, - 220, 82, 205, 173, 49, 199, 24, 16, 223, 245, 49, 199, 24, 16, 215, 151, - 49, 199, 24, 16, 208, 229, 49, 199, 24, 16, 231, 194, 231, 180, 49, 199, - 24, 16, 224, 0, 223, 255, 219, 182, 219, 248, 1, 69, 219, 182, 219, 248, - 1, 72, 219, 182, 219, 248, 1, 247, 16, 219, 182, 219, 248, 1, 215, 109, - 219, 182, 219, 248, 1, 201, 78, 219, 182, 219, 248, 1, 201, 66, 219, 182, - 219, 248, 1, 240, 41, 219, 182, 219, 248, 1, 240, 25, 219, 182, 219, 248, - 1, 216, 86, 219, 182, 219, 248, 1, 207, 50, 219, 182, 219, 248, 1, 205, - 80, 219, 182, 219, 248, 18, 2, 226, 120, 219, 182, 219, 248, 18, 2, 199, - 245, 219, 182, 219, 248, 18, 2, 252, 132, 219, 182, 219, 248, 18, 2, 250, - 150, 219, 182, 219, 248, 18, 2, 252, 124, 219, 182, 219, 248, 245, 92, - 219, 182, 219, 248, 251, 206, 224, 108, 219, 182, 219, 248, 251, 80, 219, - 182, 219, 248, 5, 210, 117, 78, 219, 182, 219, 248, 197, 9, 210, 117, 78, - 219, 182, 219, 248, 18, 2, 199, 2, 219, 182, 219, 248, 199, 7, 35, 5, - 201, 59, 35, 5, 201, 62, 35, 5, 201, 65, 35, 5, 201, 63, 35, 5, 201, 64, - 35, 5, 201, 61, 35, 5, 240, 19, 35, 5, 240, 21, 35, 5, 240, 24, 35, 5, - 240, 22, 35, 5, 240, 23, 35, 5, 240, 20, 35, 5, 237, 143, 35, 5, 237, - 147, 35, 5, 237, 155, 35, 5, 237, 152, 35, 5, 237, 153, 35, 5, 237, 144, - 35, 5, 247, 71, 35, 5, 247, 65, 35, 5, 247, 67, 35, 5, 247, 70, 35, 5, - 247, 68, 35, 5, 247, 69, 35, 5, 247, 66, 35, 5, 249, 45, 35, 5, 249, 24, - 35, 5, 249, 36, 35, 5, 249, 44, 35, 5, 249, 39, 35, 5, 249, 40, 35, 5, - 249, 28, 8, 4, 1, 249, 74, 251, 134, 8, 4, 1, 39, 210, 87, 8, 4, 1, 248, - 132, 69, 8, 4, 1, 249, 74, 69, 8, 4, 1, 237, 136, 3, 235, 64, 8, 4, 1, - 222, 149, 236, 49, 8, 4, 1, 145, 234, 191, 3, 241, 57, 8, 4, 1, 223, 100, - 3, 226, 17, 222, 204, 209, 80, 8, 4, 1, 223, 100, 3, 52, 112, 202, 84, 8, - 4, 1, 223, 100, 3, 112, 210, 2, 8, 4, 1, 221, 137, 3, 241, 57, 8, 4, 1, - 218, 56, 3, 241, 57, 8, 4, 1, 236, 216, 3, 241, 57, 8, 4, 1, 248, 132, - 72, 8, 4, 1, 248, 132, 177, 3, 106, 8, 4, 1, 192, 177, 3, 106, 8, 4, 1, - 226, 17, 214, 164, 8, 4, 1, 163, 214, 165, 3, 106, 8, 4, 1, 163, 214, - 165, 3, 231, 155, 106, 8, 4, 1, 163, 177, 214, 88, 8, 4, 1, 163, 177, - 214, 89, 3, 106, 8, 4, 1, 204, 231, 144, 8, 1, 4, 6, 211, 32, 3, 53, 222, - 172, 8, 4, 1, 211, 32, 197, 37, 232, 187, 8, 4, 1, 52, 144, 8, 4, 1, 211, - 32, 3, 241, 57, 8, 4, 1, 52, 211, 32, 3, 241, 57, 8, 4, 1, 145, 144, 8, - 4, 1, 145, 211, 32, 3, 210, 2, 8, 4, 1, 249, 64, 236, 141, 8, 4, 1, 118, - 3, 206, 182, 53, 222, 172, 8, 4, 1, 118, 249, 80, 3, 206, 182, 53, 222, - 172, 8, 4, 1, 200, 90, 8, 4, 1, 163, 200, 90, 8, 4, 1, 118, 3, 50, 122, - 8, 4, 1, 245, 75, 8, 4, 1, 245, 76, 3, 126, 53, 210, 2, 8, 4, 1, 245, 76, - 3, 126, 50, 207, 85, 8, 4, 1, 196, 223, 3, 126, 53, 210, 2, 8, 4, 1, 196, - 223, 3, 181, 50, 222, 172, 8, 4, 1, 196, 223, 3, 181, 50, 222, 173, 26, - 126, 53, 210, 2, 8, 4, 1, 196, 223, 3, 181, 50, 222, 173, 3, 207, 85, 8, - 4, 1, 196, 149, 3, 206, 182, 53, 222, 172, 73, 248, 48, 3, 226, 17, 248, - 47, 73, 1, 4, 232, 99, 73, 1, 4, 223, 100, 3, 226, 17, 222, 204, 209, 80, - 73, 1, 4, 223, 100, 3, 112, 202, 84, 73, 1, 4, 118, 3, 50, 122, 8, 4, 1, - 208, 246, 196, 84, 8, 4, 1, 226, 5, 69, 8, 4, 1, 192, 214, 164, 8, 4, 1, - 200, 41, 8, 4, 1, 226, 17, 251, 134, 32, 1, 4, 6, 214, 124, 8, 4, 1, 237, - 158, 239, 111, 3, 210, 95, 122, 8, 4, 1, 201, 115, 239, 111, 3, 210, 95, - 122, 95, 4, 1, 63, 95, 4, 1, 69, 95, 4, 1, 68, 95, 4, 1, 72, 95, 4, 1, - 66, 95, 4, 1, 199, 230, 95, 4, 1, 234, 123, 95, 4, 1, 155, 95, 4, 1, 234, - 48, 95, 4, 1, 233, 192, 95, 4, 1, 233, 144, 95, 4, 1, 233, 76, 95, 4, 1, - 233, 36, 95, 4, 1, 142, 95, 4, 1, 232, 147, 95, 4, 1, 232, 71, 95, 4, 1, - 231, 193, 95, 4, 1, 231, 75, 95, 4, 1, 231, 44, 95, 4, 1, 172, 95, 4, 1, - 222, 197, 95, 4, 1, 222, 109, 95, 4, 1, 222, 7, 95, 4, 1, 221, 191, 95, - 4, 1, 221, 160, 95, 4, 1, 166, 95, 4, 1, 219, 207, 95, 4, 1, 219, 78, 95, - 4, 1, 218, 251, 95, 4, 1, 218, 145, 95, 4, 1, 176, 95, 4, 1, 231, 217, - 95, 4, 1, 217, 231, 95, 4, 1, 217, 118, 95, 4, 1, 216, 223, 95, 4, 1, - 216, 50, 95, 4, 1, 215, 186, 95, 4, 1, 215, 120, 95, 4, 1, 211, 96, 95, - 4, 1, 211, 82, 95, 4, 1, 211, 75, 95, 4, 1, 211, 65, 95, 4, 1, 211, 54, - 95, 4, 1, 211, 52, 95, 4, 1, 183, 95, 4, 1, 209, 80, 95, 4, 1, 208, 147, - 95, 4, 1, 206, 112, 95, 4, 1, 205, 200, 95, 4, 1, 204, 172, 95, 4, 1, - 204, 72, 95, 4, 1, 240, 136, 95, 4, 1, 189, 95, 4, 1, 239, 252, 95, 4, 1, - 203, 68, 95, 4, 1, 239, 152, 95, 4, 1, 202, 122, 95, 4, 1, 239, 28, 95, - 4, 1, 237, 201, 95, 4, 1, 237, 170, 95, 4, 1, 239, 40, 95, 4, 1, 202, 47, - 95, 4, 1, 202, 46, 95, 4, 1, 202, 35, 95, 4, 1, 202, 34, 95, 4, 1, 202, - 33, 95, 4, 1, 202, 32, 95, 4, 1, 201, 113, 95, 4, 1, 201, 107, 95, 4, 1, - 201, 92, 95, 4, 1, 201, 90, 95, 4, 1, 201, 86, 95, 4, 1, 201, 85, 95, 4, - 1, 197, 166, 95, 4, 1, 197, 109, 95, 4, 1, 197, 70, 95, 4, 1, 197, 34, - 95, 4, 1, 196, 243, 95, 4, 1, 196, 230, 95, 4, 1, 164, 219, 182, 219, - 248, 1, 223, 252, 219, 182, 219, 248, 1, 208, 229, 219, 182, 219, 248, 1, - 223, 54, 219, 182, 219, 248, 1, 219, 6, 219, 182, 219, 248, 1, 161, 219, - 182, 219, 248, 1, 176, 219, 182, 219, 248, 1, 245, 67, 219, 182, 219, - 248, 1, 202, 86, 219, 182, 219, 248, 1, 224, 111, 219, 182, 219, 248, 1, - 216, 242, 219, 182, 219, 248, 1, 202, 161, 219, 182, 219, 248, 1, 197, - 154, 219, 182, 219, 248, 1, 196, 95, 219, 182, 219, 248, 1, 231, 64, 219, - 182, 219, 248, 1, 200, 72, 219, 182, 219, 248, 1, 68, 219, 182, 219, 248, - 1, 213, 0, 219, 182, 219, 248, 1, 250, 161, 219, 182, 219, 248, 1, 233, - 136, 219, 182, 219, 248, 1, 225, 178, 219, 182, 219, 248, 1, 210, 224, - 219, 182, 219, 248, 1, 249, 145, 219, 182, 219, 248, 1, 225, 162, 219, - 182, 219, 248, 1, 239, 109, 219, 182, 219, 248, 1, 233, 199, 219, 182, - 219, 248, 1, 239, 154, 219, 182, 219, 248, 1, 248, 194, 219, 182, 219, - 248, 1, 223, 253, 221, 230, 219, 182, 219, 248, 1, 223, 55, 221, 230, - 219, 182, 219, 248, 1, 219, 7, 221, 230, 219, 182, 219, 248, 1, 213, 244, - 221, 230, 219, 182, 219, 248, 1, 218, 1, 221, 230, 219, 182, 219, 248, 1, - 202, 87, 221, 230, 219, 182, 219, 248, 1, 216, 243, 221, 230, 219, 182, - 219, 248, 1, 230, 249, 221, 230, 219, 182, 219, 248, 18, 2, 214, 117, - 219, 182, 219, 248, 18, 2, 226, 84, 219, 182, 219, 248, 18, 2, 251, 104, - 219, 182, 219, 248, 18, 2, 196, 58, 219, 182, 219, 248, 18, 2, 205, 163, - 219, 182, 219, 248, 18, 2, 200, 69, 219, 182, 219, 248, 18, 2, 245, 90, - 219, 182, 219, 248, 18, 2, 215, 135, 219, 182, 219, 248, 245, 91, 219, - 182, 219, 248, 221, 175, 225, 223, 219, 182, 219, 248, 251, 19, 225, 223, - 219, 182, 219, 248, 17, 195, 79, 219, 182, 219, 248, 17, 100, 219, 182, - 219, 248, 17, 102, 219, 182, 219, 248, 17, 134, 219, 182, 219, 248, 17, - 136, 219, 182, 219, 248, 17, 146, 219, 182, 219, 248, 17, 167, 219, 182, - 219, 248, 17, 178, 219, 182, 219, 248, 17, 171, 219, 182, 219, 248, 17, - 182, 29, 225, 102, 215, 11, 29, 225, 102, 215, 16, 29, 225, 102, 195, - 252, 29, 225, 102, 195, 251, 29, 225, 102, 195, 250, 29, 225, 102, 200, - 164, 29, 225, 102, 200, 168, 29, 225, 102, 195, 211, 29, 225, 102, 195, - 207, 29, 225, 102, 236, 115, 29, 225, 102, 236, 113, 29, 225, 102, 236, - 114, 29, 225, 102, 236, 111, 29, 225, 102, 230, 235, 29, 225, 102, 230, - 234, 29, 225, 102, 230, 232, 29, 225, 102, 230, 233, 29, 225, 102, 230, - 238, 29, 225, 102, 230, 231, 29, 225, 102, 230, 230, 29, 225, 102, 230, - 240, 29, 225, 102, 251, 5, 29, 225, 102, 251, 4, 29, 116, 216, 201, 29, - 116, 216, 207, 29, 116, 205, 61, 29, 116, 205, 60, 29, 116, 202, 92, 29, - 116, 202, 90, 29, 116, 202, 89, 29, 116, 202, 95, 29, 116, 202, 96, 29, - 116, 202, 88, 29, 116, 210, 33, 29, 116, 210, 48, 29, 116, 205, 67, 29, - 116, 210, 45, 29, 116, 210, 35, 29, 116, 210, 37, 29, 116, 210, 24, 29, - 116, 210, 25, 29, 116, 224, 254, 29, 116, 219, 51, 29, 116, 219, 45, 29, - 116, 205, 71, 29, 116, 219, 48, 29, 116, 219, 54, 29, 116, 212, 187, 29, - 116, 212, 196, 29, 116, 212, 200, 29, 116, 205, 69, 29, 116, 212, 190, - 29, 116, 212, 204, 29, 116, 212, 205, 29, 116, 206, 44, 29, 116, 206, 47, - 29, 116, 205, 65, 29, 116, 205, 63, 29, 116, 206, 42, 29, 116, 206, 50, - 29, 116, 206, 51, 29, 116, 206, 36, 29, 116, 206, 49, 29, 116, 213, 172, - 29, 116, 213, 173, 29, 116, 196, 42, 29, 116, 196, 45, 29, 116, 245, 4, - 29, 116, 245, 3, 29, 116, 205, 76, 29, 116, 212, 241, 29, 116, 212, 240, - 12, 15, 228, 111, 12, 15, 228, 110, 12, 15, 228, 109, 12, 15, 228, 108, - 12, 15, 228, 107, 12, 15, 228, 106, 12, 15, 228, 105, 12, 15, 228, 104, - 12, 15, 228, 103, 12, 15, 228, 102, 12, 15, 228, 101, 12, 15, 228, 100, - 12, 15, 228, 99, 12, 15, 228, 98, 12, 15, 228, 97, 12, 15, 228, 96, 12, - 15, 228, 95, 12, 15, 228, 94, 12, 15, 228, 93, 12, 15, 228, 92, 12, 15, - 228, 91, 12, 15, 228, 90, 12, 15, 228, 89, 12, 15, 228, 88, 12, 15, 228, - 87, 12, 15, 228, 86, 12, 15, 228, 85, 12, 15, 228, 84, 12, 15, 228, 83, - 12, 15, 228, 82, 12, 15, 228, 81, 12, 15, 228, 80, 12, 15, 228, 79, 12, - 15, 228, 78, 12, 15, 228, 77, 12, 15, 228, 76, 12, 15, 228, 75, 12, 15, - 228, 74, 12, 15, 228, 73, 12, 15, 228, 72, 12, 15, 228, 71, 12, 15, 228, - 70, 12, 15, 228, 69, 12, 15, 228, 68, 12, 15, 228, 67, 12, 15, 228, 66, - 12, 15, 228, 65, 12, 15, 228, 64, 12, 15, 228, 63, 12, 15, 228, 62, 12, - 15, 228, 61, 12, 15, 228, 60, 12, 15, 228, 59, 12, 15, 228, 58, 12, 15, - 228, 57, 12, 15, 228, 56, 12, 15, 228, 55, 12, 15, 228, 54, 12, 15, 228, - 53, 12, 15, 228, 52, 12, 15, 228, 51, 12, 15, 228, 50, 12, 15, 228, 49, - 12, 15, 228, 48, 12, 15, 228, 47, 12, 15, 228, 46, 12, 15, 228, 45, 12, - 15, 228, 44, 12, 15, 228, 43, 12, 15, 228, 42, 12, 15, 228, 41, 12, 15, - 228, 40, 12, 15, 228, 39, 12, 15, 228, 38, 12, 15, 228, 37, 12, 15, 228, - 36, 12, 15, 228, 35, 12, 15, 228, 34, 12, 15, 228, 33, 12, 15, 228, 32, - 12, 15, 228, 31, 12, 15, 228, 30, 12, 15, 228, 29, 12, 15, 228, 28, 12, - 15, 228, 27, 12, 15, 228, 26, 12, 15, 228, 25, 12, 15, 228, 24, 12, 15, - 228, 23, 12, 15, 228, 22, 12, 15, 228, 21, 12, 15, 228, 20, 12, 15, 228, - 19, 12, 15, 228, 18, 12, 15, 228, 17, 12, 15, 228, 16, 12, 15, 228, 15, - 12, 15, 228, 14, 12, 15, 228, 13, 12, 15, 228, 12, 12, 15, 228, 11, 12, - 15, 228, 10, 12, 15, 228, 9, 12, 15, 228, 8, 12, 15, 228, 7, 12, 15, 228, - 6, 12, 15, 228, 5, 12, 15, 228, 4, 12, 15, 228, 3, 12, 15, 228, 2, 12, - 15, 228, 1, 12, 15, 228, 0, 12, 15, 227, 255, 12, 15, 227, 254, 12, 15, - 227, 253, 12, 15, 227, 252, 12, 15, 227, 251, 12, 15, 227, 250, 12, 15, - 227, 249, 12, 15, 227, 248, 12, 15, 227, 247, 12, 15, 227, 246, 12, 15, - 227, 245, 12, 15, 227, 244, 12, 15, 227, 243, 12, 15, 227, 242, 12, 15, - 227, 241, 12, 15, 227, 240, 12, 15, 227, 239, 12, 15, 227, 238, 12, 15, - 227, 237, 12, 15, 227, 236, 12, 15, 227, 235, 12, 15, 227, 234, 12, 15, - 227, 233, 12, 15, 227, 232, 12, 15, 227, 231, 12, 15, 227, 230, 12, 15, - 227, 229, 12, 15, 227, 228, 12, 15, 227, 227, 12, 15, 227, 226, 12, 15, - 227, 225, 12, 15, 227, 224, 12, 15, 227, 223, 12, 15, 227, 222, 12, 15, - 227, 221, 12, 15, 227, 220, 12, 15, 227, 219, 12, 15, 227, 218, 12, 15, - 227, 217, 12, 15, 227, 216, 12, 15, 227, 215, 12, 15, 227, 214, 12, 15, - 227, 213, 12, 15, 227, 212, 12, 15, 227, 211, 12, 15, 227, 210, 12, 15, - 227, 209, 12, 15, 227, 208, 12, 15, 227, 207, 12, 15, 227, 206, 12, 15, - 227, 205, 12, 15, 227, 204, 12, 15, 227, 203, 12, 15, 227, 202, 12, 15, - 227, 201, 12, 15, 227, 200, 12, 15, 227, 199, 12, 15, 227, 198, 12, 15, - 227, 197, 12, 15, 227, 196, 12, 15, 227, 195, 12, 15, 227, 194, 12, 15, - 227, 193, 12, 15, 227, 192, 12, 15, 227, 191, 12, 15, 227, 190, 12, 15, - 227, 189, 12, 15, 227, 188, 12, 15, 227, 187, 12, 15, 227, 186, 12, 15, - 227, 185, 12, 15, 227, 184, 12, 15, 227, 183, 12, 15, 227, 182, 12, 15, - 227, 181, 12, 15, 227, 180, 12, 15, 227, 179, 12, 15, 227, 178, 12, 15, - 227, 177, 12, 15, 227, 176, 12, 15, 227, 175, 12, 15, 227, 174, 12, 15, - 227, 173, 12, 15, 227, 172, 12, 15, 227, 171, 12, 15, 227, 170, 12, 15, - 227, 169, 12, 15, 227, 168, 12, 15, 227, 167, 12, 15, 227, 166, 12, 15, - 227, 165, 12, 15, 227, 164, 12, 15, 227, 163, 12, 15, 227, 162, 12, 15, - 227, 161, 12, 15, 227, 160, 12, 15, 227, 159, 12, 15, 227, 158, 12, 15, - 227, 157, 12, 15, 227, 156, 12, 15, 227, 155, 12, 15, 227, 154, 12, 15, - 227, 153, 12, 15, 227, 152, 12, 15, 227, 151, 12, 15, 227, 150, 12, 15, - 227, 149, 12, 15, 227, 148, 12, 15, 227, 147, 12, 15, 227, 146, 12, 15, - 227, 145, 12, 15, 227, 144, 12, 15, 227, 143, 12, 15, 227, 142, 12, 15, - 227, 141, 12, 15, 227, 140, 12, 15, 227, 139, 12, 15, 227, 138, 12, 15, - 227, 137, 12, 15, 227, 136, 12, 15, 227, 135, 12, 15, 227, 134, 12, 15, - 227, 133, 12, 15, 227, 132, 12, 15, 227, 131, 12, 15, 227, 130, 12, 15, - 227, 129, 12, 15, 227, 128, 12, 15, 227, 127, 12, 15, 227, 126, 12, 15, - 227, 125, 12, 15, 227, 124, 12, 15, 227, 123, 12, 15, 227, 122, 12, 15, - 227, 121, 12, 15, 227, 120, 12, 15, 227, 119, 12, 15, 227, 118, 12, 15, - 227, 117, 12, 15, 227, 116, 12, 15, 227, 115, 12, 15, 227, 114, 12, 15, - 227, 113, 12, 15, 227, 112, 12, 15, 227, 111, 12, 15, 227, 110, 12, 15, - 227, 109, 12, 15, 227, 108, 12, 15, 227, 107, 12, 15, 227, 106, 12, 15, - 227, 105, 12, 15, 227, 104, 12, 15, 227, 103, 12, 15, 227, 102, 12, 15, - 227, 101, 12, 15, 227, 100, 12, 15, 227, 99, 12, 15, 227, 98, 12, 15, - 227, 97, 12, 15, 227, 96, 12, 15, 227, 95, 12, 15, 227, 94, 12, 15, 227, - 93, 12, 15, 227, 92, 12, 15, 227, 91, 12, 15, 227, 90, 12, 15, 227, 89, - 12, 15, 227, 88, 12, 15, 227, 87, 12, 15, 227, 86, 12, 15, 227, 85, 12, - 15, 227, 84, 12, 15, 227, 83, 12, 15, 227, 82, 12, 15, 227, 81, 12, 15, - 227, 80, 12, 15, 227, 79, 12, 15, 227, 78, 12, 15, 227, 77, 12, 15, 227, - 76, 12, 15, 227, 75, 12, 15, 227, 74, 12, 15, 227, 73, 12, 15, 227, 72, - 12, 15, 227, 71, 12, 15, 227, 70, 12, 15, 227, 69, 12, 15, 227, 68, 12, - 15, 227, 67, 12, 15, 227, 66, 12, 15, 227, 65, 12, 15, 227, 64, 12, 15, - 227, 63, 12, 15, 227, 62, 12, 15, 227, 61, 12, 15, 227, 60, 12, 15, 227, - 59, 12, 15, 227, 58, 12, 15, 227, 57, 12, 15, 227, 56, 12, 15, 227, 55, - 12, 15, 227, 54, 12, 15, 227, 53, 12, 15, 227, 52, 12, 15, 227, 51, 12, - 15, 227, 50, 12, 15, 227, 49, 12, 15, 227, 48, 12, 15, 227, 47, 12, 15, - 227, 46, 12, 15, 227, 45, 12, 15, 227, 44, 12, 15, 227, 43, 12, 15, 227, - 42, 12, 15, 227, 41, 12, 15, 227, 40, 12, 15, 227, 39, 12, 15, 227, 38, - 12, 15, 227, 37, 12, 15, 227, 36, 12, 15, 227, 35, 12, 15, 227, 34, 12, - 15, 227, 33, 12, 15, 227, 32, 12, 15, 227, 31, 12, 15, 227, 30, 12, 15, - 227, 29, 12, 15, 227, 28, 12, 15, 227, 27, 12, 15, 227, 26, 12, 15, 227, - 25, 12, 15, 227, 24, 12, 15, 227, 23, 12, 15, 227, 22, 12, 15, 227, 21, - 12, 15, 227, 20, 12, 15, 227, 19, 12, 15, 227, 18, 12, 15, 227, 17, 12, - 15, 227, 16, 12, 15, 227, 15, 12, 15, 227, 14, 12, 15, 227, 13, 12, 15, - 227, 12, 12, 15, 227, 11, 12, 15, 227, 10, 12, 15, 227, 9, 12, 15, 227, - 8, 12, 15, 227, 7, 12, 15, 227, 6, 12, 15, 227, 5, 12, 15, 227, 4, 12, - 15, 227, 3, 12, 15, 227, 2, 12, 15, 227, 1, 12, 15, 227, 0, 12, 15, 226, - 255, 12, 15, 226, 254, 12, 15, 226, 253, 12, 15, 226, 252, 12, 15, 226, - 251, 12, 15, 226, 250, 12, 15, 226, 249, 12, 15, 226, 248, 12, 15, 226, - 247, 12, 15, 226, 246, 12, 15, 226, 245, 12, 15, 226, 244, 12, 15, 226, - 243, 12, 15, 226, 242, 12, 15, 226, 241, 12, 15, 226, 240, 12, 15, 226, - 239, 12, 15, 226, 238, 12, 15, 226, 237, 12, 15, 226, 236, 12, 15, 226, - 235, 12, 15, 226, 234, 12, 15, 226, 233, 12, 15, 226, 232, 12, 15, 226, - 231, 12, 15, 226, 230, 12, 15, 226, 229, 12, 15, 226, 228, 12, 15, 226, - 227, 12, 15, 226, 226, 12, 15, 226, 225, 12, 15, 226, 224, 12, 15, 226, - 223, 12, 15, 226, 222, 12, 15, 226, 221, 12, 15, 226, 220, 12, 15, 226, - 219, 12, 15, 226, 218, 12, 15, 226, 217, 12, 15, 226, 216, 12, 15, 226, - 215, 12, 15, 226, 214, 12, 15, 226, 213, 12, 15, 226, 212, 12, 15, 226, - 211, 12, 15, 226, 210, 12, 15, 226, 209, 12, 15, 226, 208, 12, 15, 226, - 207, 12, 15, 226, 206, 12, 15, 226, 205, 12, 15, 226, 204, 12, 15, 226, - 203, 12, 15, 226, 202, 12, 15, 226, 201, 12, 15, 226, 200, 12, 15, 226, - 199, 12, 15, 226, 198, 12, 15, 226, 197, 12, 15, 226, 196, 12, 15, 226, - 195, 12, 15, 226, 194, 12, 15, 226, 193, 12, 15, 226, 192, 12, 15, 226, - 191, 12, 15, 226, 190, 12, 15, 226, 189, 12, 15, 226, 188, 12, 15, 226, - 187, 12, 15, 226, 186, 12, 15, 226, 185, 12, 15, 226, 184, 12, 15, 226, - 183, 12, 15, 226, 182, 12, 15, 226, 181, 12, 15, 226, 180, 12, 15, 226, - 179, 12, 15, 226, 178, 12, 15, 226, 177, 12, 15, 226, 176, 12, 15, 226, - 175, 12, 15, 226, 174, 12, 15, 226, 173, 12, 15, 226, 172, 12, 15, 226, - 171, 12, 15, 226, 170, 12, 15, 226, 169, 12, 15, 226, 168, 12, 15, 226, - 167, 12, 15, 226, 166, 12, 15, 226, 165, 12, 15, 226, 164, 12, 15, 226, - 163, 12, 15, 226, 162, 12, 15, 226, 161, 12, 15, 226, 160, 12, 15, 226, - 159, 12, 15, 226, 158, 12, 15, 226, 157, 12, 15, 226, 156, 12, 15, 226, - 155, 12, 15, 226, 154, 12, 15, 226, 153, 12, 15, 226, 152, 8, 4, 33, 235, - 157, 8, 4, 33, 235, 153, 8, 4, 33, 235, 96, 8, 4, 33, 235, 156, 8, 4, 33, - 235, 155, 8, 4, 33, 181, 209, 81, 203, 216, 8, 4, 33, 205, 23, 250, 230, - 4, 33, 219, 165, 216, 4, 250, 230, 4, 33, 219, 165, 237, 60, 250, 230, 4, - 33, 219, 165, 226, 55, 250, 230, 4, 33, 199, 40, 216, 4, 250, 230, 4, 33, - 219, 165, 196, 200, 123, 1, 195, 242, 3, 232, 33, 123, 212, 111, 225, - 109, 199, 130, 123, 33, 196, 22, 195, 242, 195, 242, 213, 115, 123, 1, - 251, 126, 250, 117, 123, 1, 197, 62, 251, 164, 123, 1, 197, 62, 240, 101, - 123, 1, 197, 62, 232, 147, 123, 1, 197, 62, 225, 35, 123, 1, 197, 62, - 222, 241, 123, 1, 197, 62, 48, 219, 171, 123, 1, 197, 62, 210, 109, 123, - 1, 197, 62, 203, 85, 123, 1, 251, 126, 98, 55, 123, 1, 206, 212, 3, 206, - 212, 238, 253, 123, 1, 206, 212, 3, 206, 66, 238, 253, 123, 1, 206, 212, - 3, 240, 121, 26, 206, 212, 238, 253, 123, 1, 206, 212, 3, 240, 121, 26, - 206, 66, 238, 253, 123, 1, 151, 3, 213, 115, 123, 1, 151, 3, 211, 147, - 123, 1, 151, 3, 220, 42, 123, 1, 248, 209, 3, 240, 120, 123, 1, 233, 178, - 3, 240, 120, 123, 1, 240, 102, 3, 240, 120, 123, 1, 232, 148, 3, 220, 42, - 123, 1, 199, 123, 3, 240, 120, 123, 1, 195, 93, 3, 240, 120, 123, 1, 203, - 2, 3, 240, 120, 123, 1, 195, 242, 3, 240, 120, 123, 1, 48, 225, 36, 3, - 240, 120, 123, 1, 225, 36, 3, 240, 120, 123, 1, 222, 242, 3, 240, 120, - 123, 1, 219, 172, 3, 240, 120, 123, 1, 215, 139, 3, 240, 120, 123, 1, - 208, 226, 3, 240, 120, 123, 1, 48, 213, 93, 3, 240, 120, 123, 1, 213, 93, - 3, 240, 120, 123, 1, 201, 109, 3, 240, 120, 123, 1, 211, 107, 3, 240, - 120, 123, 1, 210, 110, 3, 240, 120, 123, 1, 206, 212, 3, 240, 120, 123, - 1, 203, 86, 3, 240, 120, 123, 1, 199, 123, 3, 231, 177, 123, 1, 248, 209, - 3, 210, 227, 123, 1, 225, 36, 3, 210, 227, 123, 1, 213, 93, 3, 210, 227, - 123, 33, 151, 222, 241, 9, 1, 151, 197, 135, 70, 20, 9, 1, 151, 197, 135, - 48, 20, 9, 1, 248, 250, 70, 20, 9, 1, 248, 250, 48, 20, 9, 1, 248, 250, - 84, 20, 9, 1, 248, 250, 219, 194, 20, 9, 1, 213, 73, 70, 20, 9, 1, 213, - 73, 48, 20, 9, 1, 213, 73, 84, 20, 9, 1, 213, 73, 219, 194, 20, 9, 1, - 248, 238, 70, 20, 9, 1, 248, 238, 48, 20, 9, 1, 248, 238, 84, 20, 9, 1, - 248, 238, 219, 194, 20, 9, 1, 201, 69, 70, 20, 9, 1, 201, 69, 48, 20, 9, - 1, 201, 69, 84, 20, 9, 1, 201, 69, 219, 194, 20, 9, 1, 203, 40, 70, 20, - 9, 1, 203, 40, 48, 20, 9, 1, 203, 40, 84, 20, 9, 1, 203, 40, 219, 194, - 20, 9, 1, 201, 71, 70, 20, 9, 1, 201, 71, 48, 20, 9, 1, 201, 71, 84, 20, - 9, 1, 201, 71, 219, 194, 20, 9, 1, 199, 112, 70, 20, 9, 1, 199, 112, 48, - 20, 9, 1, 199, 112, 84, 20, 9, 1, 199, 112, 219, 194, 20, 9, 1, 213, 71, - 70, 20, 9, 1, 213, 71, 48, 20, 9, 1, 213, 71, 84, 20, 9, 1, 213, 71, 219, - 194, 20, 9, 1, 237, 163, 70, 20, 9, 1, 237, 163, 48, 20, 9, 1, 237, 163, - 84, 20, 9, 1, 237, 163, 219, 194, 20, 9, 1, 215, 96, 70, 20, 9, 1, 215, - 96, 48, 20, 9, 1, 215, 96, 84, 20, 9, 1, 215, 96, 219, 194, 20, 9, 1, - 203, 73, 70, 20, 9, 1, 203, 73, 48, 20, 9, 1, 203, 73, 84, 20, 9, 1, 203, - 73, 219, 194, 20, 9, 1, 203, 71, 70, 20, 9, 1, 203, 71, 48, 20, 9, 1, - 203, 71, 84, 20, 9, 1, 203, 71, 219, 194, 20, 9, 1, 240, 39, 70, 20, 9, - 1, 240, 39, 48, 20, 9, 1, 240, 115, 70, 20, 9, 1, 240, 115, 48, 20, 9, 1, - 237, 192, 70, 20, 9, 1, 237, 192, 48, 20, 9, 1, 240, 37, 70, 20, 9, 1, - 240, 37, 48, 20, 9, 1, 225, 187, 70, 20, 9, 1, 225, 187, 48, 20, 9, 1, - 209, 174, 70, 20, 9, 1, 209, 174, 48, 20, 9, 1, 224, 192, 70, 20, 9, 1, - 224, 192, 48, 20, 9, 1, 224, 192, 84, 20, 9, 1, 224, 192, 219, 194, 20, - 9, 1, 234, 111, 70, 20, 9, 1, 234, 111, 48, 20, 9, 1, 234, 111, 84, 20, - 9, 1, 234, 111, 219, 194, 20, 9, 1, 233, 64, 70, 20, 9, 1, 233, 64, 48, - 20, 9, 1, 233, 64, 84, 20, 9, 1, 233, 64, 219, 194, 20, 9, 1, 216, 251, - 70, 20, 9, 1, 216, 251, 48, 20, 9, 1, 216, 251, 84, 20, 9, 1, 216, 251, - 219, 194, 20, 9, 1, 216, 32, 233, 197, 70, 20, 9, 1, 216, 32, 233, 197, - 48, 20, 9, 1, 209, 236, 70, 20, 9, 1, 209, 236, 48, 20, 9, 1, 209, 236, - 84, 20, 9, 1, 209, 236, 219, 194, 20, 9, 1, 232, 114, 3, 93, 90, 70, 20, - 9, 1, 232, 114, 3, 93, 90, 48, 20, 9, 1, 232, 114, 233, 142, 70, 20, 9, - 1, 232, 114, 233, 142, 48, 20, 9, 1, 232, 114, 233, 142, 84, 20, 9, 1, - 232, 114, 233, 142, 219, 194, 20, 9, 1, 232, 114, 239, 25, 70, 20, 9, 1, - 232, 114, 239, 25, 48, 20, 9, 1, 232, 114, 239, 25, 84, 20, 9, 1, 232, - 114, 239, 25, 219, 194, 20, 9, 1, 93, 249, 73, 70, 20, 9, 1, 93, 249, 73, - 48, 20, 9, 1, 93, 249, 73, 3, 232, 214, 90, 70, 20, 9, 1, 93, 249, 73, 3, - 232, 214, 90, 48, 20, 9, 16, 76, 57, 9, 16, 76, 60, 9, 16, 99, 238, 251, - 57, 9, 16, 99, 238, 251, 60, 9, 16, 115, 238, 251, 57, 9, 16, 115, 238, - 251, 60, 9, 16, 115, 238, 251, 212, 107, 237, 231, 57, 9, 16, 115, 238, - 251, 212, 107, 237, 231, 60, 9, 16, 235, 7, 238, 251, 57, 9, 16, 235, 7, - 238, 251, 60, 9, 16, 52, 83, 249, 80, 60, 9, 16, 99, 238, 251, 199, 50, - 57, 9, 16, 99, 238, 251, 199, 50, 60, 9, 16, 210, 2, 9, 16, 4, 203, 140, - 57, 9, 16, 4, 203, 140, 60, 9, 1, 217, 74, 70, 20, 9, 1, 217, 74, 48, 20, - 9, 1, 217, 74, 84, 20, 9, 1, 217, 74, 219, 194, 20, 9, 1, 118, 70, 20, 9, - 1, 118, 48, 20, 9, 1, 214, 165, 70, 20, 9, 1, 214, 165, 48, 20, 9, 1, - 195, 218, 70, 20, 9, 1, 195, 218, 48, 20, 9, 1, 118, 3, 232, 214, 90, 70, - 20, 9, 1, 199, 119, 70, 20, 9, 1, 199, 119, 48, 20, 9, 1, 224, 67, 214, - 165, 70, 20, 9, 1, 224, 67, 214, 165, 48, 20, 9, 1, 224, 67, 195, 218, - 70, 20, 9, 1, 224, 67, 195, 218, 48, 20, 9, 1, 237, 136, 70, 20, 9, 1, - 237, 136, 48, 20, 9, 1, 237, 136, 84, 20, 9, 1, 237, 136, 219, 194, 20, - 9, 1, 200, 89, 224, 213, 224, 67, 151, 220, 70, 84, 20, 9, 1, 200, 89, - 224, 213, 224, 67, 151, 220, 70, 219, 194, 20, 9, 33, 93, 3, 232, 214, - 90, 3, 151, 70, 20, 9, 33, 93, 3, 232, 214, 90, 3, 151, 48, 20, 9, 33, - 93, 3, 232, 214, 90, 3, 251, 246, 70, 20, 9, 33, 93, 3, 232, 214, 90, 3, - 251, 246, 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, 197, 118, 70, 20, 9, 33, - 93, 3, 232, 214, 90, 3, 197, 118, 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, - 118, 70, 20, 9, 33, 93, 3, 232, 214, 90, 3, 118, 48, 20, 9, 33, 93, 3, - 232, 214, 90, 3, 214, 165, 70, 20, 9, 33, 93, 3, 232, 214, 90, 3, 214, - 165, 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, 195, 218, 70, 20, 9, 33, 93, - 3, 232, 214, 90, 3, 195, 218, 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, 237, - 136, 70, 20, 9, 33, 93, 3, 232, 214, 90, 3, 237, 136, 48, 20, 9, 33, 93, - 3, 232, 214, 90, 3, 237, 136, 84, 20, 9, 33, 200, 89, 224, 67, 93, 3, - 232, 214, 90, 3, 151, 220, 70, 70, 20, 9, 33, 200, 89, 224, 67, 93, 3, - 232, 214, 90, 3, 151, 220, 70, 48, 20, 9, 33, 200, 89, 224, 67, 93, 3, - 232, 214, 90, 3, 151, 220, 70, 84, 20, 9, 1, 235, 204, 93, 70, 20, 9, 1, - 235, 204, 93, 48, 20, 9, 1, 235, 204, 93, 84, 20, 9, 1, 235, 204, 93, - 219, 194, 20, 9, 33, 93, 3, 232, 214, 90, 3, 225, 190, 70, 20, 9, 33, 93, - 3, 232, 214, 90, 3, 168, 70, 20, 9, 33, 93, 3, 232, 214, 90, 3, 87, 70, - 20, 9, 33, 93, 3, 232, 214, 90, 3, 151, 220, 70, 70, 20, 9, 33, 93, 3, - 232, 214, 90, 3, 93, 70, 20, 9, 33, 248, 240, 3, 225, 190, 70, 20, 9, 33, - 248, 240, 3, 168, 70, 20, 9, 33, 248, 240, 3, 224, 143, 70, 20, 9, 33, - 248, 240, 3, 87, 70, 20, 9, 33, 248, 240, 3, 151, 220, 70, 70, 20, 9, 33, - 248, 240, 3, 93, 70, 20, 9, 33, 203, 42, 3, 225, 190, 70, 20, 9, 33, 203, - 42, 3, 168, 70, 20, 9, 33, 203, 42, 3, 224, 143, 70, 20, 9, 33, 203, 42, - 3, 87, 70, 20, 9, 33, 203, 42, 3, 151, 220, 70, 70, 20, 9, 33, 203, 42, - 3, 93, 70, 20, 9, 33, 202, 214, 3, 225, 190, 70, 20, 9, 33, 202, 214, 3, - 87, 70, 20, 9, 33, 202, 214, 3, 151, 220, 70, 70, 20, 9, 33, 202, 214, 3, - 93, 70, 20, 9, 33, 225, 190, 3, 168, 70, 20, 9, 33, 225, 190, 3, 87, 70, - 20, 9, 33, 168, 3, 225, 190, 70, 20, 9, 33, 168, 3, 87, 70, 20, 9, 33, - 224, 143, 3, 225, 190, 70, 20, 9, 33, 224, 143, 3, 168, 70, 20, 9, 33, - 224, 143, 3, 87, 70, 20, 9, 33, 208, 126, 3, 225, 190, 70, 20, 9, 33, - 208, 126, 3, 168, 70, 20, 9, 33, 208, 126, 3, 224, 143, 70, 20, 9, 33, - 208, 126, 3, 87, 70, 20, 9, 33, 209, 9, 3, 168, 70, 20, 9, 33, 209, 9, 3, - 87, 70, 20, 9, 33, 240, 131, 3, 225, 190, 70, 20, 9, 33, 240, 131, 3, - 168, 70, 20, 9, 33, 240, 131, 3, 224, 143, 70, 20, 9, 33, 240, 131, 3, - 87, 70, 20, 9, 33, 203, 140, 3, 168, 70, 20, 9, 33, 203, 140, 3, 87, 70, - 20, 9, 33, 195, 110, 3, 87, 70, 20, 9, 33, 251, 195, 3, 225, 190, 70, 20, - 9, 33, 251, 195, 3, 87, 70, 20, 9, 33, 233, 226, 3, 225, 190, 70, 20, 9, - 33, 233, 226, 3, 87, 70, 20, 9, 33, 235, 177, 3, 225, 190, 70, 20, 9, 33, - 235, 177, 3, 168, 70, 20, 9, 33, 235, 177, 3, 224, 143, 70, 20, 9, 33, - 235, 177, 3, 87, 70, 20, 9, 33, 235, 177, 3, 151, 220, 70, 70, 20, 9, 33, - 235, 177, 3, 93, 70, 20, 9, 33, 211, 153, 3, 168, 70, 20, 9, 33, 211, - 153, 3, 87, 70, 20, 9, 33, 211, 153, 3, 151, 220, 70, 70, 20, 9, 33, 211, - 153, 3, 93, 70, 20, 9, 33, 225, 36, 3, 151, 70, 20, 9, 33, 225, 36, 3, - 225, 190, 70, 20, 9, 33, 225, 36, 3, 168, 70, 20, 9, 33, 225, 36, 3, 224, - 143, 70, 20, 9, 33, 225, 36, 3, 222, 250, 70, 20, 9, 33, 225, 36, 3, 87, - 70, 20, 9, 33, 225, 36, 3, 151, 220, 70, 70, 20, 9, 33, 225, 36, 3, 93, - 70, 20, 9, 33, 222, 250, 3, 225, 190, 70, 20, 9, 33, 222, 250, 3, 168, - 70, 20, 9, 33, 222, 250, 3, 224, 143, 70, 20, 9, 33, 222, 250, 3, 87, 70, - 20, 9, 33, 222, 250, 3, 151, 220, 70, 70, 20, 9, 33, 222, 250, 3, 93, 70, - 20, 9, 33, 87, 3, 225, 190, 70, 20, 9, 33, 87, 3, 168, 70, 20, 9, 33, 87, - 3, 224, 143, 70, 20, 9, 33, 87, 3, 87, 70, 20, 9, 33, 87, 3, 151, 220, - 70, 70, 20, 9, 33, 87, 3, 93, 70, 20, 9, 33, 216, 32, 3, 225, 190, 70, - 20, 9, 33, 216, 32, 3, 168, 70, 20, 9, 33, 216, 32, 3, 224, 143, 70, 20, - 9, 33, 216, 32, 3, 87, 70, 20, 9, 33, 216, 32, 3, 151, 220, 70, 70, 20, - 9, 33, 216, 32, 3, 93, 70, 20, 9, 33, 232, 114, 3, 225, 190, 70, 20, 9, - 33, 232, 114, 3, 87, 70, 20, 9, 33, 232, 114, 3, 151, 220, 70, 70, 20, 9, - 33, 232, 114, 3, 93, 70, 20, 9, 33, 93, 3, 225, 190, 70, 20, 9, 33, 93, - 3, 168, 70, 20, 9, 33, 93, 3, 224, 143, 70, 20, 9, 33, 93, 3, 87, 70, 20, - 9, 33, 93, 3, 151, 220, 70, 70, 20, 9, 33, 93, 3, 93, 70, 20, 9, 33, 202, - 226, 3, 204, 95, 151, 70, 20, 9, 33, 210, 143, 3, 204, 95, 151, 70, 20, - 9, 33, 151, 220, 70, 3, 204, 95, 151, 70, 20, 9, 33, 207, 41, 3, 240, 94, - 70, 20, 9, 33, 207, 41, 3, 224, 237, 70, 20, 9, 33, 207, 41, 3, 235, 201, - 70, 20, 9, 33, 207, 41, 3, 240, 96, 70, 20, 9, 33, 207, 41, 3, 224, 239, - 70, 20, 9, 33, 207, 41, 3, 204, 95, 151, 70, 20, 9, 33, 93, 3, 232, 214, - 90, 3, 210, 143, 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, 195, 107, 48, 20, - 9, 33, 93, 3, 232, 214, 90, 3, 87, 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, - 216, 32, 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, 151, 220, 70, 48, 20, 9, - 33, 93, 3, 232, 214, 90, 3, 93, 48, 20, 9, 33, 248, 240, 3, 210, 143, 48, - 20, 9, 33, 248, 240, 3, 195, 107, 48, 20, 9, 33, 248, 240, 3, 87, 48, 20, - 9, 33, 248, 240, 3, 216, 32, 48, 20, 9, 33, 248, 240, 3, 151, 220, 70, - 48, 20, 9, 33, 248, 240, 3, 93, 48, 20, 9, 33, 203, 42, 3, 210, 143, 48, - 20, 9, 33, 203, 42, 3, 195, 107, 48, 20, 9, 33, 203, 42, 3, 87, 48, 20, - 9, 33, 203, 42, 3, 216, 32, 48, 20, 9, 33, 203, 42, 3, 151, 220, 70, 48, - 20, 9, 33, 203, 42, 3, 93, 48, 20, 9, 33, 202, 214, 3, 210, 143, 48, 20, - 9, 33, 202, 214, 3, 195, 107, 48, 20, 9, 33, 202, 214, 3, 87, 48, 20, 9, - 33, 202, 214, 3, 216, 32, 48, 20, 9, 33, 202, 214, 3, 151, 220, 70, 48, - 20, 9, 33, 202, 214, 3, 93, 48, 20, 9, 33, 235, 177, 3, 151, 220, 70, 48, - 20, 9, 33, 235, 177, 3, 93, 48, 20, 9, 33, 211, 153, 3, 151, 220, 70, 48, - 20, 9, 33, 211, 153, 3, 93, 48, 20, 9, 33, 225, 36, 3, 151, 48, 20, 9, - 33, 225, 36, 3, 222, 250, 48, 20, 9, 33, 225, 36, 3, 87, 48, 20, 9, 33, - 225, 36, 3, 151, 220, 70, 48, 20, 9, 33, 225, 36, 3, 93, 48, 20, 9, 33, - 222, 250, 3, 87, 48, 20, 9, 33, 222, 250, 3, 151, 220, 70, 48, 20, 9, 33, - 222, 250, 3, 93, 48, 20, 9, 33, 87, 3, 151, 48, 20, 9, 33, 87, 3, 87, 48, - 20, 9, 33, 216, 32, 3, 210, 143, 48, 20, 9, 33, 216, 32, 3, 195, 107, 48, - 20, 9, 33, 216, 32, 3, 87, 48, 20, 9, 33, 216, 32, 3, 216, 32, 48, 20, 9, - 33, 216, 32, 3, 151, 220, 70, 48, 20, 9, 33, 216, 32, 3, 93, 48, 20, 9, - 33, 151, 220, 70, 3, 204, 95, 151, 48, 20, 9, 33, 93, 3, 210, 143, 48, - 20, 9, 33, 93, 3, 195, 107, 48, 20, 9, 33, 93, 3, 87, 48, 20, 9, 33, 93, - 3, 216, 32, 48, 20, 9, 33, 93, 3, 151, 220, 70, 48, 20, 9, 33, 93, 3, 93, - 48, 20, 9, 33, 93, 3, 232, 214, 90, 3, 225, 190, 84, 20, 9, 33, 93, 3, - 232, 214, 90, 3, 168, 84, 20, 9, 33, 93, 3, 232, 214, 90, 3, 224, 143, - 84, 20, 9, 33, 93, 3, 232, 214, 90, 3, 87, 84, 20, 9, 33, 93, 3, 232, - 214, 90, 3, 232, 114, 84, 20, 9, 33, 248, 240, 3, 225, 190, 84, 20, 9, - 33, 248, 240, 3, 168, 84, 20, 9, 33, 248, 240, 3, 224, 143, 84, 20, 9, - 33, 248, 240, 3, 87, 84, 20, 9, 33, 248, 240, 3, 232, 114, 84, 20, 9, 33, - 203, 42, 3, 225, 190, 84, 20, 9, 33, 203, 42, 3, 168, 84, 20, 9, 33, 203, - 42, 3, 224, 143, 84, 20, 9, 33, 203, 42, 3, 87, 84, 20, 9, 33, 203, 42, - 3, 232, 114, 84, 20, 9, 33, 202, 214, 3, 87, 84, 20, 9, 33, 225, 190, 3, - 168, 84, 20, 9, 33, 225, 190, 3, 87, 84, 20, 9, 33, 168, 3, 225, 190, 84, - 20, 9, 33, 168, 3, 87, 84, 20, 9, 33, 224, 143, 3, 225, 190, 84, 20, 9, - 33, 224, 143, 3, 87, 84, 20, 9, 33, 208, 126, 3, 225, 190, 84, 20, 9, 33, - 208, 126, 3, 168, 84, 20, 9, 33, 208, 126, 3, 224, 143, 84, 20, 9, 33, - 208, 126, 3, 87, 84, 20, 9, 33, 209, 9, 3, 168, 84, 20, 9, 33, 209, 9, 3, - 224, 143, 84, 20, 9, 33, 209, 9, 3, 87, 84, 20, 9, 33, 240, 131, 3, 225, - 190, 84, 20, 9, 33, 240, 131, 3, 168, 84, 20, 9, 33, 240, 131, 3, 224, - 143, 84, 20, 9, 33, 240, 131, 3, 87, 84, 20, 9, 33, 203, 140, 3, 168, 84, - 20, 9, 33, 195, 110, 3, 87, 84, 20, 9, 33, 251, 195, 3, 225, 190, 84, 20, - 9, 33, 251, 195, 3, 87, 84, 20, 9, 33, 233, 226, 3, 225, 190, 84, 20, 9, - 33, 233, 226, 3, 87, 84, 20, 9, 33, 235, 177, 3, 225, 190, 84, 20, 9, 33, - 235, 177, 3, 168, 84, 20, 9, 33, 235, 177, 3, 224, 143, 84, 20, 9, 33, - 235, 177, 3, 87, 84, 20, 9, 33, 211, 153, 3, 168, 84, 20, 9, 33, 211, - 153, 3, 87, 84, 20, 9, 33, 225, 36, 3, 225, 190, 84, 20, 9, 33, 225, 36, - 3, 168, 84, 20, 9, 33, 225, 36, 3, 224, 143, 84, 20, 9, 33, 225, 36, 3, - 222, 250, 84, 20, 9, 33, 225, 36, 3, 87, 84, 20, 9, 33, 222, 250, 3, 225, - 190, 84, 20, 9, 33, 222, 250, 3, 168, 84, 20, 9, 33, 222, 250, 3, 224, - 143, 84, 20, 9, 33, 222, 250, 3, 87, 84, 20, 9, 33, 222, 250, 3, 232, - 114, 84, 20, 9, 33, 87, 3, 225, 190, 84, 20, 9, 33, 87, 3, 168, 84, 20, - 9, 33, 87, 3, 224, 143, 84, 20, 9, 33, 87, 3, 87, 84, 20, 9, 33, 216, 32, - 3, 225, 190, 84, 20, 9, 33, 216, 32, 3, 168, 84, 20, 9, 33, 216, 32, 3, - 224, 143, 84, 20, 9, 33, 216, 32, 3, 87, 84, 20, 9, 33, 216, 32, 3, 232, - 114, 84, 20, 9, 33, 232, 114, 3, 225, 190, 84, 20, 9, 33, 232, 114, 3, - 87, 84, 20, 9, 33, 232, 114, 3, 204, 95, 151, 84, 20, 9, 33, 93, 3, 225, - 190, 84, 20, 9, 33, 93, 3, 168, 84, 20, 9, 33, 93, 3, 224, 143, 84, 20, - 9, 33, 93, 3, 87, 84, 20, 9, 33, 93, 3, 232, 114, 84, 20, 9, 33, 93, 3, - 232, 214, 90, 3, 87, 219, 194, 20, 9, 33, 93, 3, 232, 214, 90, 3, 232, - 114, 219, 194, 20, 9, 33, 248, 240, 3, 87, 219, 194, 20, 9, 33, 248, 240, - 3, 232, 114, 219, 194, 20, 9, 33, 203, 42, 3, 87, 219, 194, 20, 9, 33, - 203, 42, 3, 232, 114, 219, 194, 20, 9, 33, 202, 214, 3, 87, 219, 194, 20, - 9, 33, 202, 214, 3, 232, 114, 219, 194, 20, 9, 33, 208, 126, 3, 87, 219, - 194, 20, 9, 33, 208, 126, 3, 232, 114, 219, 194, 20, 9, 33, 206, 252, 3, - 87, 219, 194, 20, 9, 33, 206, 252, 3, 232, 114, 219, 194, 20, 9, 33, 225, - 36, 3, 222, 250, 219, 194, 20, 9, 33, 225, 36, 3, 87, 219, 194, 20, 9, - 33, 222, 250, 3, 87, 219, 194, 20, 9, 33, 216, 32, 3, 87, 219, 194, 20, - 9, 33, 216, 32, 3, 232, 114, 219, 194, 20, 9, 33, 93, 3, 87, 219, 194, - 20, 9, 33, 93, 3, 232, 114, 219, 194, 20, 9, 33, 207, 41, 3, 235, 201, - 219, 194, 20, 9, 33, 207, 41, 3, 240, 96, 219, 194, 20, 9, 33, 207, 41, - 3, 224, 239, 219, 194, 20, 9, 33, 203, 140, 3, 151, 220, 70, 70, 20, 9, - 33, 203, 140, 3, 93, 70, 20, 9, 33, 251, 195, 3, 151, 220, 70, 70, 20, 9, - 33, 251, 195, 3, 93, 70, 20, 9, 33, 233, 226, 3, 151, 220, 70, 70, 20, 9, - 33, 233, 226, 3, 93, 70, 20, 9, 33, 208, 126, 3, 151, 220, 70, 70, 20, 9, - 33, 208, 126, 3, 93, 70, 20, 9, 33, 206, 252, 3, 151, 220, 70, 70, 20, 9, - 33, 206, 252, 3, 93, 70, 20, 9, 33, 168, 3, 151, 220, 70, 70, 20, 9, 33, - 168, 3, 93, 70, 20, 9, 33, 225, 190, 3, 151, 220, 70, 70, 20, 9, 33, 225, - 190, 3, 93, 70, 20, 9, 33, 224, 143, 3, 151, 220, 70, 70, 20, 9, 33, 224, - 143, 3, 93, 70, 20, 9, 33, 209, 9, 3, 151, 220, 70, 70, 20, 9, 33, 209, - 9, 3, 93, 70, 20, 9, 33, 240, 131, 3, 151, 220, 70, 70, 20, 9, 33, 240, - 131, 3, 93, 70, 20, 9, 33, 206, 252, 3, 225, 190, 70, 20, 9, 33, 206, - 252, 3, 168, 70, 20, 9, 33, 206, 252, 3, 224, 143, 70, 20, 9, 33, 206, - 252, 3, 87, 70, 20, 9, 33, 206, 252, 3, 210, 143, 70, 20, 9, 33, 208, - 126, 3, 210, 143, 70, 20, 9, 33, 209, 9, 3, 210, 143, 70, 20, 9, 33, 240, - 131, 3, 210, 143, 70, 20, 9, 33, 203, 140, 3, 151, 220, 70, 48, 20, 9, - 33, 203, 140, 3, 93, 48, 20, 9, 33, 251, 195, 3, 151, 220, 70, 48, 20, 9, - 33, 251, 195, 3, 93, 48, 20, 9, 33, 233, 226, 3, 151, 220, 70, 48, 20, 9, - 33, 233, 226, 3, 93, 48, 20, 9, 33, 208, 126, 3, 151, 220, 70, 48, 20, 9, - 33, 208, 126, 3, 93, 48, 20, 9, 33, 206, 252, 3, 151, 220, 70, 48, 20, 9, - 33, 206, 252, 3, 93, 48, 20, 9, 33, 168, 3, 151, 220, 70, 48, 20, 9, 33, - 168, 3, 93, 48, 20, 9, 33, 225, 190, 3, 151, 220, 70, 48, 20, 9, 33, 225, - 190, 3, 93, 48, 20, 9, 33, 224, 143, 3, 151, 220, 70, 48, 20, 9, 33, 224, - 143, 3, 93, 48, 20, 9, 33, 209, 9, 3, 151, 220, 70, 48, 20, 9, 33, 209, - 9, 3, 93, 48, 20, 9, 33, 240, 131, 3, 151, 220, 70, 48, 20, 9, 33, 240, - 131, 3, 93, 48, 20, 9, 33, 206, 252, 3, 225, 190, 48, 20, 9, 33, 206, - 252, 3, 168, 48, 20, 9, 33, 206, 252, 3, 224, 143, 48, 20, 9, 33, 206, - 252, 3, 87, 48, 20, 9, 33, 206, 252, 3, 210, 143, 48, 20, 9, 33, 208, - 126, 3, 210, 143, 48, 20, 9, 33, 209, 9, 3, 210, 143, 48, 20, 9, 33, 240, - 131, 3, 210, 143, 48, 20, 9, 33, 206, 252, 3, 225, 190, 84, 20, 9, 33, - 206, 252, 3, 168, 84, 20, 9, 33, 206, 252, 3, 224, 143, 84, 20, 9, 33, - 206, 252, 3, 87, 84, 20, 9, 33, 208, 126, 3, 232, 114, 84, 20, 9, 33, - 206, 252, 3, 232, 114, 84, 20, 9, 33, 203, 140, 3, 87, 84, 20, 9, 33, - 208, 126, 3, 225, 190, 219, 194, 20, 9, 33, 208, 126, 3, 168, 219, 194, - 20, 9, 33, 208, 126, 3, 224, 143, 219, 194, 20, 9, 33, 206, 252, 3, 225, - 190, 219, 194, 20, 9, 33, 206, 252, 3, 168, 219, 194, 20, 9, 33, 206, - 252, 3, 224, 143, 219, 194, 20, 9, 33, 203, 140, 3, 87, 219, 194, 20, 9, - 33, 195, 110, 3, 87, 219, 194, 20, 9, 33, 151, 3, 235, 199, 48, 20, 9, - 33, 151, 3, 235, 199, 70, 20, 214, 57, 50, 213, 140, 214, 57, 53, 213, - 140, 9, 33, 203, 42, 3, 225, 190, 3, 87, 84, 20, 9, 33, 203, 42, 3, 168, - 3, 225, 190, 48, 20, 9, 33, 203, 42, 3, 168, 3, 225, 190, 84, 20, 9, 33, - 203, 42, 3, 168, 3, 87, 84, 20, 9, 33, 203, 42, 3, 224, 143, 3, 87, 84, - 20, 9, 33, 203, 42, 3, 87, 3, 225, 190, 84, 20, 9, 33, 203, 42, 3, 87, 3, - 168, 84, 20, 9, 33, 203, 42, 3, 87, 3, 224, 143, 84, 20, 9, 33, 225, 190, - 3, 87, 3, 168, 48, 20, 9, 33, 225, 190, 3, 87, 3, 168, 84, 20, 9, 33, - 168, 3, 87, 3, 93, 48, 20, 9, 33, 168, 3, 87, 3, 151, 220, 70, 48, 20, 9, - 33, 208, 126, 3, 168, 3, 225, 190, 84, 20, 9, 33, 208, 126, 3, 225, 190, - 3, 168, 84, 20, 9, 33, 208, 126, 3, 225, 190, 3, 151, 220, 70, 48, 20, 9, - 33, 208, 126, 3, 87, 3, 168, 48, 20, 9, 33, 208, 126, 3, 87, 3, 168, 84, - 20, 9, 33, 208, 126, 3, 87, 3, 225, 190, 84, 20, 9, 33, 208, 126, 3, 87, - 3, 87, 48, 20, 9, 33, 208, 126, 3, 87, 3, 87, 84, 20, 9, 33, 209, 9, 3, - 168, 3, 168, 48, 20, 9, 33, 209, 9, 3, 168, 3, 168, 84, 20, 9, 33, 209, - 9, 3, 87, 3, 87, 48, 20, 9, 33, 206, 252, 3, 168, 3, 87, 48, 20, 9, 33, - 206, 252, 3, 168, 3, 87, 84, 20, 9, 33, 206, 252, 3, 225, 190, 3, 93, 48, - 20, 9, 33, 206, 252, 3, 87, 3, 224, 143, 48, 20, 9, 33, 206, 252, 3, 87, - 3, 224, 143, 84, 20, 9, 33, 206, 252, 3, 87, 3, 87, 48, 20, 9, 33, 206, - 252, 3, 87, 3, 87, 84, 20, 9, 33, 240, 131, 3, 168, 3, 151, 220, 70, 48, - 20, 9, 33, 240, 131, 3, 224, 143, 3, 87, 48, 20, 9, 33, 240, 131, 3, 224, - 143, 3, 87, 84, 20, 9, 33, 203, 140, 3, 87, 3, 168, 48, 20, 9, 33, 203, - 140, 3, 87, 3, 168, 84, 20, 9, 33, 203, 140, 3, 87, 3, 87, 84, 20, 9, 33, - 203, 140, 3, 87, 3, 93, 48, 20, 9, 33, 251, 195, 3, 225, 190, 3, 87, 48, - 20, 9, 33, 251, 195, 3, 87, 3, 87, 48, 20, 9, 33, 251, 195, 3, 87, 3, 87, - 84, 20, 9, 33, 251, 195, 3, 87, 3, 151, 220, 70, 48, 20, 9, 33, 233, 226, - 3, 87, 3, 87, 48, 20, 9, 33, 233, 226, 3, 87, 3, 93, 48, 20, 9, 33, 233, - 226, 3, 87, 3, 151, 220, 70, 48, 20, 9, 33, 235, 177, 3, 224, 143, 3, 87, - 48, 20, 9, 33, 235, 177, 3, 224, 143, 3, 87, 84, 20, 9, 33, 211, 153, 3, - 87, 3, 168, 48, 20, 9, 33, 211, 153, 3, 87, 3, 87, 48, 20, 9, 33, 222, - 250, 3, 168, 3, 87, 48, 20, 9, 33, 222, 250, 3, 168, 3, 93, 48, 20, 9, - 33, 222, 250, 3, 168, 3, 151, 220, 70, 48, 20, 9, 33, 222, 250, 3, 225, - 190, 3, 225, 190, 84, 20, 9, 33, 222, 250, 3, 225, 190, 3, 225, 190, 48, - 20, 9, 33, 222, 250, 3, 224, 143, 3, 87, 48, 20, 9, 33, 222, 250, 3, 224, - 143, 3, 87, 84, 20, 9, 33, 222, 250, 3, 87, 3, 168, 48, 20, 9, 33, 222, - 250, 3, 87, 3, 168, 84, 20, 9, 33, 87, 3, 168, 3, 225, 190, 84, 20, 9, - 33, 87, 3, 168, 3, 87, 84, 20, 9, 33, 87, 3, 168, 3, 93, 48, 20, 9, 33, - 87, 3, 225, 190, 3, 168, 84, 20, 9, 33, 87, 3, 225, 190, 3, 87, 84, 20, - 9, 33, 87, 3, 224, 143, 3, 225, 190, 84, 20, 9, 33, 87, 3, 224, 143, 3, - 87, 84, 20, 9, 33, 87, 3, 225, 190, 3, 224, 143, 84, 20, 9, 33, 232, 114, - 3, 87, 3, 225, 190, 84, 20, 9, 33, 232, 114, 3, 87, 3, 87, 84, 20, 9, 33, - 216, 32, 3, 168, 3, 87, 84, 20, 9, 33, 216, 32, 3, 168, 3, 151, 220, 70, - 48, 20, 9, 33, 216, 32, 3, 225, 190, 3, 87, 48, 20, 9, 33, 216, 32, 3, - 225, 190, 3, 87, 84, 20, 9, 33, 216, 32, 3, 225, 190, 3, 151, 220, 70, - 48, 20, 9, 33, 216, 32, 3, 87, 3, 93, 48, 20, 9, 33, 216, 32, 3, 87, 3, - 151, 220, 70, 48, 20, 9, 33, 93, 3, 87, 3, 87, 48, 20, 9, 33, 93, 3, 87, - 3, 87, 84, 20, 9, 33, 248, 240, 3, 224, 143, 3, 93, 48, 20, 9, 33, 203, - 42, 3, 225, 190, 3, 93, 48, 20, 9, 33, 203, 42, 3, 225, 190, 3, 151, 220, - 70, 48, 20, 9, 33, 203, 42, 3, 224, 143, 3, 93, 48, 20, 9, 33, 203, 42, - 3, 224, 143, 3, 151, 220, 70, 48, 20, 9, 33, 203, 42, 3, 87, 3, 93, 48, - 20, 9, 33, 203, 42, 3, 87, 3, 151, 220, 70, 48, 20, 9, 33, 225, 190, 3, - 87, 3, 93, 48, 20, 9, 33, 225, 190, 3, 168, 3, 151, 220, 70, 48, 20, 9, - 33, 225, 190, 3, 87, 3, 151, 220, 70, 48, 20, 9, 33, 208, 126, 3, 224, - 143, 3, 151, 220, 70, 48, 20, 9, 33, 209, 9, 3, 168, 3, 93, 48, 20, 9, - 33, 206, 252, 3, 168, 3, 93, 48, 20, 9, 33, 240, 131, 3, 168, 3, 93, 48, - 20, 9, 33, 222, 250, 3, 225, 190, 3, 93, 48, 20, 9, 33, 222, 250, 3, 87, - 3, 93, 48, 20, 9, 33, 93, 3, 168, 3, 93, 48, 20, 9, 33, 93, 3, 225, 190, - 3, 93, 48, 20, 9, 33, 93, 3, 87, 3, 93, 48, 20, 9, 33, 87, 3, 87, 3, 93, - 48, 20, 9, 33, 211, 153, 3, 87, 3, 93, 48, 20, 9, 33, 216, 32, 3, 168, 3, - 93, 48, 20, 9, 33, 211, 153, 3, 87, 3, 168, 84, 20, 9, 33, 222, 250, 3, - 168, 3, 87, 84, 20, 9, 33, 251, 195, 3, 87, 3, 93, 48, 20, 9, 33, 225, - 36, 3, 87, 3, 93, 48, 20, 9, 33, 216, 32, 3, 225, 190, 3, 168, 84, 20, 9, - 33, 87, 3, 224, 143, 3, 93, 48, 20, 9, 33, 222, 250, 3, 225, 190, 3, 87, - 84, 20, 9, 33, 225, 36, 3, 87, 3, 87, 48, 20, 9, 33, 222, 250, 3, 225, - 190, 3, 87, 48, 20, 9, 33, 216, 32, 3, 225, 190, 3, 168, 48, 20, 9, 33, - 225, 190, 3, 168, 3, 93, 48, 20, 9, 33, 168, 3, 225, 190, 3, 93, 48, 20, - 9, 33, 87, 3, 225, 190, 3, 93, 48, 20, 9, 33, 235, 177, 3, 87, 3, 93, 48, - 20, 9, 33, 248, 240, 3, 168, 3, 93, 48, 20, 9, 33, 225, 36, 3, 87, 3, 87, - 84, 20, 9, 33, 251, 195, 3, 225, 190, 3, 87, 84, 20, 9, 33, 209, 9, 3, - 87, 3, 87, 84, 20, 9, 33, 208, 126, 3, 224, 143, 3, 93, 48, 20, 9, 33, - 216, 32, 3, 225, 190, 3, 93, 48, 20, 9, 33, 208, 236, 199, 255, 250, 203, - 223, 234, 204, 227, 2, 70, 20, 9, 33, 211, 149, 199, 255, 250, 203, 223, - 234, 204, 227, 2, 70, 20, 9, 33, 251, 145, 70, 20, 9, 33, 251, 178, 70, - 20, 9, 33, 218, 218, 70, 20, 9, 33, 208, 237, 70, 20, 9, 33, 210, 200, - 70, 20, 9, 33, 251, 167, 70, 20, 9, 33, 197, 137, 70, 20, 9, 33, 208, - 236, 70, 20, 9, 33, 208, 235, 251, 167, 197, 136, 9, 33, 225, 205, 210, - 64, 55, 9, 33, 248, 147, 251, 12, 251, 13, 62, 208, 113, 62, 208, 2, 62, - 207, 190, 62, 207, 179, 62, 207, 168, 62, 207, 157, 62, 207, 146, 62, - 207, 135, 62, 207, 124, 62, 208, 112, 62, 208, 101, 62, 208, 90, 62, 208, - 79, 62, 208, 68, 62, 208, 57, 62, 208, 46, 212, 25, 235, 24, 36, 83, 244, - 159, 212, 25, 235, 24, 36, 83, 143, 244, 159, 212, 25, 235, 24, 36, 83, - 143, 234, 217, 204, 226, 212, 25, 235, 24, 36, 83, 244, 168, 212, 25, - 235, 24, 36, 83, 207, 105, 212, 25, 235, 24, 36, 83, 236, 90, 78, 212, - 25, 235, 24, 36, 83, 211, 79, 78, 212, 25, 235, 24, 36, 83, 50, 59, 222, - 147, 179, 212, 25, 235, 24, 36, 83, 53, 59, 222, 147, 248, 59, 212, 25, - 235, 24, 36, 83, 231, 155, 236, 247, 38, 33, 50, 232, 225, 38, 33, 53, - 232, 225, 38, 52, 202, 85, 50, 232, 225, 38, 52, 202, 85, 53, 232, 225, - 38, 220, 115, 50, 232, 225, 38, 220, 115, 53, 232, 225, 38, 241, 143, - 220, 114, 38, 33, 50, 157, 60, 38, 33, 53, 157, 60, 38, 202, 85, 50, 157, - 60, 38, 202, 85, 53, 157, 60, 38, 220, 115, 50, 157, 60, 38, 220, 115, - 53, 157, 60, 38, 241, 143, 220, 115, 60, 38, 40, 202, 55, 50, 232, 225, - 38, 40, 202, 55, 53, 232, 225, 212, 25, 235, 24, 36, 83, 99, 76, 222, - 195, 212, 25, 235, 24, 36, 83, 236, 242, 240, 65, 212, 25, 235, 24, 36, - 83, 236, 231, 240, 65, 212, 25, 235, 24, 36, 83, 126, 222, 75, 212, 25, - 235, 24, 36, 83, 197, 119, 126, 222, 75, 212, 25, 235, 24, 36, 83, 50, - 213, 140, 212, 25, 235, 24, 36, 83, 53, 213, 140, 212, 25, 235, 24, 36, - 83, 50, 241, 18, 179, 212, 25, 235, 24, 36, 83, 53, 241, 18, 179, 212, - 25, 235, 24, 36, 83, 50, 201, 231, 206, 245, 179, 212, 25, 235, 24, 36, - 83, 53, 201, 231, 206, 245, 179, 212, 25, 235, 24, 36, 83, 50, 58, 222, - 147, 179, 212, 25, 235, 24, 36, 83, 53, 58, 222, 147, 179, 212, 25, 235, - 24, 36, 83, 50, 52, 251, 91, 179, 212, 25, 235, 24, 36, 83, 53, 52, 251, - 91, 179, 212, 25, 235, 24, 36, 83, 50, 251, 91, 179, 212, 25, 235, 24, - 36, 83, 53, 251, 91, 179, 212, 25, 235, 24, 36, 83, 50, 241, 102, 179, - 212, 25, 235, 24, 36, 83, 53, 241, 102, 179, 212, 25, 235, 24, 36, 83, - 50, 59, 241, 102, 179, 212, 25, 235, 24, 36, 83, 53, 59, 241, 102, 179, - 207, 80, 238, 253, 59, 207, 80, 238, 253, 212, 25, 235, 24, 36, 83, 50, - 47, 179, 212, 25, 235, 24, 36, 83, 53, 47, 179, 240, 64, 214, 19, 247, - 33, 214, 19, 197, 119, 214, 19, 52, 197, 119, 214, 19, 240, 64, 126, 222, - 75, 247, 33, 126, 222, 75, 197, 119, 126, 222, 75, 4, 244, 159, 4, 143, - 244, 159, 4, 234, 217, 204, 226, 4, 207, 105, 4, 244, 168, 4, 211, 79, - 78, 4, 236, 90, 78, 4, 236, 242, 240, 65, 4, 50, 213, 140, 4, 53, 213, - 140, 4, 50, 241, 18, 179, 4, 53, 241, 18, 179, 4, 50, 201, 231, 206, 245, - 179, 4, 53, 201, 231, 206, 245, 179, 4, 31, 55, 4, 251, 111, 4, 250, 179, - 4, 98, 55, 4, 231, 6, 4, 222, 140, 55, 4, 233, 94, 55, 4, 236, 172, 55, - 4, 210, 90, 205, 177, 4, 239, 10, 55, 4, 213, 45, 55, 4, 244, 157, 250, - 168, 9, 235, 199, 70, 20, 9, 203, 92, 3, 235, 199, 57, 9, 240, 94, 70, - 20, 9, 203, 136, 234, 253, 9, 224, 237, 70, 20, 9, 235, 201, 70, 20, 9, - 235, 201, 219, 194, 20, 9, 240, 96, 70, 20, 9, 240, 96, 219, 194, 20, 9, - 224, 239, 70, 20, 9, 224, 239, 219, 194, 20, 9, 207, 41, 70, 20, 9, 207, - 41, 219, 194, 20, 9, 204, 120, 70, 20, 9, 204, 120, 219, 194, 20, 9, 1, - 232, 214, 70, 20, 9, 1, 151, 3, 220, 110, 90, 70, 20, 9, 1, 151, 3, 220, - 110, 90, 48, 20, 9, 1, 151, 3, 232, 214, 90, 70, 20, 9, 1, 151, 3, 232, - 214, 90, 48, 20, 9, 1, 197, 118, 3, 232, 214, 90, 70, 20, 9, 1, 197, 118, - 3, 232, 214, 90, 48, 20, 9, 1, 151, 3, 232, 214, 248, 227, 70, 20, 9, 1, - 151, 3, 232, 214, 248, 227, 48, 20, 9, 1, 93, 3, 232, 214, 90, 70, 20, 9, - 1, 93, 3, 232, 214, 90, 48, 20, 9, 1, 93, 3, 232, 214, 90, 84, 20, 9, 1, - 93, 3, 232, 214, 90, 219, 194, 20, 9, 1, 151, 70, 20, 9, 1, 151, 48, 20, - 9, 1, 248, 240, 70, 20, 9, 1, 248, 240, 48, 20, 9, 1, 248, 240, 84, 20, - 9, 1, 248, 240, 219, 194, 20, 9, 1, 203, 42, 220, 36, 70, 20, 9, 1, 203, - 42, 220, 36, 48, 20, 9, 1, 203, 42, 70, 20, 9, 1, 203, 42, 48, 20, 9, 1, - 203, 42, 84, 20, 9, 1, 203, 42, 219, 194, 20, 9, 1, 202, 214, 70, 20, 9, - 1, 202, 214, 48, 20, 9, 1, 202, 214, 84, 20, 9, 1, 202, 214, 219, 194, - 20, 9, 1, 225, 190, 70, 20, 9, 1, 225, 190, 48, 20, 9, 1, 225, 190, 84, - 20, 9, 1, 225, 190, 219, 194, 20, 9, 1, 168, 70, 20, 9, 1, 168, 48, 20, - 9, 1, 168, 84, 20, 9, 1, 168, 219, 194, 20, 9, 1, 224, 143, 70, 20, 9, 1, - 224, 143, 48, 20, 9, 1, 224, 143, 84, 20, 9, 1, 224, 143, 219, 194, 20, - 9, 1, 240, 108, 70, 20, 9, 1, 240, 108, 48, 20, 9, 1, 202, 226, 70, 20, - 9, 1, 202, 226, 48, 20, 9, 1, 210, 143, 70, 20, 9, 1, 210, 143, 48, 20, - 9, 1, 195, 107, 70, 20, 9, 1, 195, 107, 48, 20, 9, 1, 208, 126, 70, 20, - 9, 1, 208, 126, 48, 20, 9, 1, 208, 126, 84, 20, 9, 1, 208, 126, 219, 194, - 20, 9, 1, 206, 252, 70, 20, 9, 1, 206, 252, 48, 20, 9, 1, 206, 252, 84, - 20, 9, 1, 206, 252, 219, 194, 20, 9, 1, 209, 9, 70, 20, 9, 1, 209, 9, 48, - 20, 9, 1, 209, 9, 84, 20, 9, 1, 209, 9, 219, 194, 20, 9, 1, 240, 131, 70, - 20, 9, 1, 240, 131, 48, 20, 9, 1, 240, 131, 84, 20, 9, 1, 240, 131, 219, - 194, 20, 9, 1, 203, 140, 70, 20, 9, 1, 203, 140, 48, 20, 9, 1, 203, 140, - 84, 20, 9, 1, 203, 140, 219, 194, 20, 9, 1, 195, 110, 70, 20, 9, 1, 195, - 110, 48, 20, 9, 1, 195, 110, 84, 20, 9, 1, 195, 110, 219, 194, 20, 9, 1, - 251, 195, 70, 20, 9, 1, 251, 195, 48, 20, 9, 1, 251, 195, 84, 20, 9, 1, - 251, 195, 219, 194, 20, 9, 1, 233, 226, 70, 20, 9, 1, 233, 226, 48, 20, - 9, 1, 233, 226, 84, 20, 9, 1, 233, 226, 219, 194, 20, 9, 1, 235, 177, 70, - 20, 9, 1, 235, 177, 48, 20, 9, 1, 235, 177, 84, 20, 9, 1, 235, 177, 219, - 194, 20, 9, 1, 211, 153, 70, 20, 9, 1, 211, 153, 48, 20, 9, 1, 211, 153, - 84, 20, 9, 1, 211, 153, 219, 194, 20, 9, 1, 225, 36, 70, 20, 9, 1, 225, - 36, 48, 20, 9, 1, 225, 36, 84, 20, 9, 1, 225, 36, 219, 194, 20, 9, 1, - 222, 250, 70, 20, 9, 1, 222, 250, 48, 20, 9, 1, 222, 250, 84, 20, 9, 1, - 222, 250, 219, 194, 20, 9, 1, 87, 70, 20, 9, 1, 87, 48, 20, 9, 1, 87, 84, - 20, 9, 1, 87, 219, 194, 20, 9, 1, 216, 32, 70, 20, 9, 1, 216, 32, 48, 20, - 9, 1, 216, 32, 84, 20, 9, 1, 216, 32, 219, 194, 20, 9, 1, 232, 114, 70, - 20, 9, 1, 232, 114, 48, 20, 9, 1, 232, 114, 84, 20, 9, 1, 232, 114, 219, - 194, 20, 9, 1, 197, 118, 70, 20, 9, 1, 197, 118, 48, 20, 9, 1, 151, 220, - 70, 70, 20, 9, 1, 151, 220, 70, 48, 20, 9, 1, 93, 70, 20, 9, 1, 93, 48, - 20, 9, 1, 93, 84, 20, 9, 1, 93, 219, 194, 20, 9, 33, 222, 250, 3, 151, 3, - 220, 110, 90, 70, 20, 9, 33, 222, 250, 3, 151, 3, 220, 110, 90, 48, 20, - 9, 33, 222, 250, 3, 151, 3, 232, 214, 90, 70, 20, 9, 33, 222, 250, 3, - 151, 3, 232, 214, 90, 48, 20, 9, 33, 222, 250, 3, 151, 3, 232, 214, 248, - 227, 70, 20, 9, 33, 222, 250, 3, 151, 3, 232, 214, 248, 227, 48, 20, 9, - 33, 222, 250, 3, 151, 70, 20, 9, 33, 222, 250, 3, 151, 48, 20, 195, 80, - 197, 59, 216, 44, 205, 148, 174, 236, 90, 78, 174, 211, 62, 78, 174, 31, - 55, 174, 239, 10, 55, 174, 213, 45, 55, 174, 251, 111, 174, 251, 30, 174, - 50, 213, 140, 174, 53, 213, 140, 174, 250, 179, 174, 98, 55, 174, 244, - 159, 174, 231, 6, 174, 234, 217, 204, 226, 174, 205, 177, 174, 17, 195, - 79, 174, 17, 100, 174, 17, 102, 174, 17, 134, 174, 17, 136, 174, 17, 146, - 174, 17, 167, 174, 17, 178, 174, 17, 171, 174, 17, 182, 174, 244, 168, - 174, 207, 105, 174, 222, 140, 55, 174, 236, 172, 55, 174, 233, 94, 55, - 174, 211, 79, 78, 174, 244, 157, 250, 168, 174, 8, 6, 1, 63, 174, 8, 6, - 1, 250, 112, 174, 8, 6, 1, 247, 207, 174, 8, 6, 1, 240, 231, 174, 8, 6, - 1, 69, 174, 8, 6, 1, 236, 49, 174, 8, 6, 1, 234, 190, 174, 8, 6, 1, 233, - 15, 174, 8, 6, 1, 68, 174, 8, 6, 1, 225, 217, 174, 8, 6, 1, 225, 80, 174, - 8, 6, 1, 159, 174, 8, 6, 1, 221, 136, 174, 8, 6, 1, 218, 55, 174, 8, 6, - 1, 72, 174, 8, 6, 1, 214, 3, 174, 8, 6, 1, 211, 167, 174, 8, 6, 1, 144, - 174, 8, 6, 1, 209, 80, 174, 8, 6, 1, 203, 216, 174, 8, 6, 1, 66, 174, 8, - 6, 1, 199, 230, 174, 8, 6, 1, 197, 199, 174, 8, 6, 1, 196, 222, 174, 8, - 6, 1, 196, 148, 174, 8, 6, 1, 195, 158, 174, 50, 47, 179, 174, 210, 90, - 205, 177, 174, 53, 47, 179, 174, 244, 241, 252, 22, 174, 126, 222, 75, - 174, 233, 101, 252, 22, 174, 8, 4, 1, 63, 174, 8, 4, 1, 250, 112, 174, 8, - 4, 1, 247, 207, 174, 8, 4, 1, 240, 231, 174, 8, 4, 1, 69, 174, 8, 4, 1, - 236, 49, 174, 8, 4, 1, 234, 190, 174, 8, 4, 1, 233, 15, 174, 8, 4, 1, 68, - 174, 8, 4, 1, 225, 217, 174, 8, 4, 1, 225, 80, 174, 8, 4, 1, 159, 174, 8, - 4, 1, 221, 136, 174, 8, 4, 1, 218, 55, 174, 8, 4, 1, 72, 174, 8, 4, 1, - 214, 3, 174, 8, 4, 1, 211, 167, 174, 8, 4, 1, 144, 174, 8, 4, 1, 209, 80, - 174, 8, 4, 1, 203, 216, 174, 8, 4, 1, 66, 174, 8, 4, 1, 199, 230, 174, 8, - 4, 1, 197, 199, 174, 8, 4, 1, 196, 222, 174, 8, 4, 1, 196, 148, 174, 8, - 4, 1, 195, 158, 174, 50, 241, 18, 179, 174, 83, 222, 75, 174, 53, 241, - 18, 179, 174, 202, 84, 174, 50, 59, 213, 140, 174, 53, 59, 213, 140, 138, - 143, 234, 217, 204, 226, 138, 50, 241, 102, 179, 138, 53, 241, 102, 179, - 138, 143, 244, 159, 138, 71, 112, 238, 253, 138, 71, 1, 197, 34, 138, 71, - 1, 4, 63, 138, 71, 1, 4, 68, 138, 71, 1, 4, 66, 138, 71, 1, 4, 69, 138, - 71, 1, 4, 72, 138, 71, 1, 4, 164, 138, 71, 1, 4, 195, 217, 138, 71, 1, 4, - 196, 3, 138, 71, 1, 4, 201, 40, 138, 224, 234, 211, 252, 205, 162, 78, - 138, 71, 1, 63, 138, 71, 1, 68, 138, 71, 1, 66, 138, 71, 1, 69, 138, 71, - 1, 72, 138, 71, 1, 155, 138, 71, 1, 224, 101, 138, 71, 1, 223, 187, 138, - 71, 1, 224, 209, 138, 71, 1, 224, 11, 138, 71, 1, 183, 138, 71, 1, 206, - 112, 138, 71, 1, 204, 172, 138, 71, 1, 208, 147, 138, 71, 1, 205, 200, - 138, 71, 1, 189, 138, 71, 1, 202, 122, 138, 71, 1, 201, 40, 138, 71, 1, - 203, 68, 138, 71, 1, 149, 138, 71, 1, 176, 138, 71, 1, 216, 223, 138, 71, - 1, 215, 186, 138, 71, 1, 217, 118, 138, 71, 1, 216, 50, 138, 71, 1, 142, - 138, 71, 1, 232, 71, 138, 71, 1, 231, 75, 138, 71, 1, 232, 147, 138, 71, - 1, 231, 193, 138, 71, 1, 166, 138, 71, 1, 219, 78, 138, 71, 1, 218, 145, - 138, 71, 1, 219, 207, 138, 71, 1, 218, 251, 138, 71, 1, 164, 138, 71, 1, - 195, 217, 138, 71, 1, 196, 3, 138, 71, 1, 169, 138, 71, 1, 210, 72, 138, - 71, 1, 209, 140, 138, 71, 1, 210, 183, 138, 71, 1, 209, 232, 138, 71, 1, - 197, 166, 138, 71, 1, 218, 55, 138, 71, 198, 244, 205, 162, 78, 138, 71, - 207, 110, 205, 162, 78, 138, 29, 235, 134, 138, 29, 1, 224, 48, 138, 29, - 1, 205, 72, 138, 29, 1, 224, 41, 138, 29, 1, 216, 208, 138, 29, 1, 216, - 206, 138, 29, 1, 216, 205, 138, 29, 1, 202, 97, 138, 29, 1, 205, 61, 138, - 29, 1, 210, 54, 138, 29, 1, 210, 49, 138, 29, 1, 210, 46, 138, 29, 1, - 210, 39, 138, 29, 1, 210, 34, 138, 29, 1, 210, 29, 138, 29, 1, 210, 40, - 138, 29, 1, 210, 52, 138, 29, 1, 219, 56, 138, 29, 1, 212, 206, 138, 29, - 1, 205, 69, 138, 29, 1, 212, 195, 138, 29, 1, 206, 52, 138, 29, 1, 205, - 66, 138, 29, 1, 226, 143, 138, 29, 1, 245, 6, 138, 29, 1, 205, 76, 138, - 29, 1, 245, 71, 138, 29, 1, 224, 122, 138, 29, 1, 202, 191, 138, 29, 1, - 212, 244, 138, 29, 1, 232, 55, 138, 29, 1, 63, 138, 29, 1, 251, 245, 138, - 29, 1, 164, 138, 29, 1, 196, 118, 138, 29, 1, 236, 192, 138, 29, 1, 69, - 138, 29, 1, 196, 56, 138, 29, 1, 196, 69, 138, 29, 1, 72, 138, 29, 1, - 197, 166, 138, 29, 1, 197, 157, 138, 29, 1, 214, 164, 138, 29, 1, 196, 3, - 138, 29, 1, 66, 138, 29, 1, 197, 91, 138, 29, 1, 197, 109, 138, 29, 1, - 197, 70, 138, 29, 1, 195, 217, 138, 29, 1, 236, 116, 138, 29, 1, 196, 24, - 138, 29, 1, 68, 174, 247, 39, 55, 174, 212, 63, 55, 174, 216, 19, 55, - 174, 220, 114, 174, 248, 33, 154, 174, 196, 60, 55, 174, 197, 17, 55, - 138, 235, 19, 175, 199, 100, 138, 107, 51, 138, 200, 24, 51, 138, 91, 51, - 138, 237, 231, 51, 138, 58, 205, 94, 138, 59, 244, 249, 226, 30, 251, 76, - 251, 102, 226, 30, 251, 76, 207, 90, 226, 30, 251, 76, 203, 8, 214, 183, - 210, 114, 246, 255, 210, 114, 246, 255, 30, 74, 5, 250, 96, 63, 30, 74, - 5, 250, 65, 69, 30, 74, 5, 250, 74, 68, 30, 74, 5, 250, 42, 72, 30, 74, - 5, 250, 92, 66, 30, 74, 5, 250, 111, 240, 136, 30, 74, 5, 250, 58, 239, - 252, 30, 74, 5, 250, 98, 239, 152, 30, 74, 5, 250, 88, 239, 28, 30, 74, - 5, 250, 52, 237, 201, 30, 74, 5, 250, 46, 225, 214, 30, 74, 5, 250, 57, - 225, 193, 30, 74, 5, 250, 67, 225, 129, 30, 74, 5, 250, 38, 225, 110, 30, - 74, 5, 250, 26, 155, 30, 74, 5, 250, 59, 224, 209, 30, 74, 5, 250, 36, - 224, 101, 30, 74, 5, 250, 33, 224, 11, 30, 74, 5, 250, 22, 223, 187, 30, - 74, 5, 250, 23, 166, 30, 74, 5, 250, 89, 219, 207, 30, 74, 5, 250, 30, - 219, 78, 30, 74, 5, 250, 87, 218, 251, 30, 74, 5, 250, 79, 218, 145, 30, - 74, 5, 250, 100, 176, 30, 74, 5, 250, 78, 217, 118, 30, 74, 5, 250, 72, - 216, 223, 30, 74, 5, 250, 51, 216, 50, 30, 74, 5, 250, 48, 215, 186, 30, - 74, 5, 250, 107, 161, 30, 74, 5, 250, 31, 213, 92, 30, 74, 5, 250, 64, - 212, 220, 30, 74, 5, 250, 91, 212, 117, 30, 74, 5, 250, 53, 211, 227, 30, - 74, 5, 250, 86, 211, 159, 30, 74, 5, 250, 25, 211, 139, 30, 74, 5, 250, - 81, 211, 121, 30, 74, 5, 250, 70, 211, 109, 30, 74, 5, 250, 43, 169, 30, - 74, 5, 250, 75, 210, 183, 30, 74, 5, 250, 50, 210, 72, 30, 74, 5, 250, - 109, 209, 232, 30, 74, 5, 250, 76, 209, 140, 30, 74, 5, 250, 71, 183, 30, - 74, 5, 250, 94, 208, 147, 30, 74, 5, 250, 62, 206, 112, 30, 74, 5, 250, - 90, 205, 200, 30, 74, 5, 250, 45, 204, 172, 30, 74, 5, 250, 44, 189, 30, - 74, 5, 250, 105, 203, 68, 30, 74, 5, 250, 66, 202, 122, 30, 74, 5, 250, - 103, 149, 30, 74, 5, 250, 34, 201, 40, 30, 74, 5, 250, 49, 197, 166, 30, - 74, 5, 250, 28, 197, 109, 30, 74, 5, 250, 63, 197, 70, 30, 74, 5, 250, - 61, 197, 34, 30, 74, 5, 250, 85, 195, 115, 30, 74, 5, 250, 29, 195, 88, - 30, 74, 5, 250, 82, 195, 11, 30, 74, 5, 250, 77, 254, 177, 30, 74, 5, - 250, 60, 254, 65, 30, 74, 5, 250, 19, 250, 150, 30, 74, 5, 250, 32, 237, - 166, 30, 74, 5, 250, 15, 237, 165, 30, 74, 5, 250, 55, 215, 118, 30, 74, - 5, 250, 73, 211, 225, 30, 74, 5, 250, 41, 211, 229, 30, 74, 5, 250, 27, - 210, 246, 30, 74, 5, 250, 69, 210, 245, 30, 74, 5, 250, 35, 209, 225, 30, - 74, 5, 250, 37, 203, 163, 30, 74, 5, 250, 17, 200, 243, 30, 74, 5, 250, - 14, 102, 30, 74, 16, 250, 84, 30, 74, 16, 250, 83, 30, 74, 16, 250, 80, - 30, 74, 16, 250, 68, 30, 74, 16, 250, 56, 30, 74, 16, 250, 54, 30, 74, - 16, 250, 47, 30, 74, 16, 250, 40, 30, 74, 16, 250, 39, 30, 74, 16, 250, - 24, 30, 74, 16, 250, 21, 30, 74, 16, 250, 20, 30, 74, 16, 250, 18, 30, - 74, 16, 250, 16, 30, 74, 147, 250, 13, 220, 62, 30, 74, 147, 250, 12, - 197, 21, 30, 74, 147, 250, 11, 239, 234, 30, 74, 147, 250, 10, 236, 169, - 30, 74, 147, 250, 9, 220, 29, 30, 74, 147, 250, 8, 205, 15, 30, 74, 147, - 250, 7, 236, 97, 30, 74, 147, 250, 6, 210, 210, 30, 74, 147, 250, 5, 206, - 254, 30, 74, 147, 250, 4, 232, 139, 30, 74, 147, 250, 3, 205, 156, 30, - 74, 147, 250, 2, 248, 114, 30, 74, 147, 250, 1, 241, 83, 30, 74, 147, - 250, 0, 248, 7, 30, 74, 147, 249, 255, 197, 79, 30, 74, 147, 249, 254, - 249, 76, 30, 74, 147, 249, 253, 214, 129, 30, 74, 147, 249, 252, 205, - 126, 30, 74, 147, 249, 251, 240, 239, 30, 74, 218, 205, 249, 250, 225, 4, - 30, 74, 218, 205, 249, 249, 225, 15, 30, 74, 147, 249, 248, 214, 144, 30, - 74, 147, 249, 247, 197, 46, 30, 74, 147, 249, 246, 30, 74, 218, 205, 249, - 245, 250, 244, 30, 74, 218, 205, 249, 244, 219, 156, 30, 74, 147, 249, - 243, 248, 32, 30, 74, 147, 249, 242, 233, 135, 30, 74, 147, 249, 241, 30, - 74, 147, 249, 240, 197, 12, 30, 74, 147, 249, 239, 30, 74, 147, 249, 238, - 30, 74, 147, 249, 237, 231, 102, 30, 74, 147, 249, 236, 30, 74, 147, 249, - 235, 30, 74, 147, 249, 234, 30, 74, 218, 205, 249, 232, 201, 2, 30, 74, - 147, 249, 231, 30, 74, 147, 249, 230, 30, 74, 147, 249, 229, 244, 197, - 30, 74, 147, 249, 228, 30, 74, 147, 249, 227, 30, 74, 147, 249, 226, 234, - 79, 30, 74, 147, 249, 225, 250, 229, 30, 74, 147, 249, 224, 30, 74, 147, - 249, 223, 30, 74, 147, 249, 222, 30, 74, 147, 249, 221, 30, 74, 147, 249, - 220, 30, 74, 147, 249, 219, 30, 74, 147, 249, 218, 30, 74, 147, 249, 217, - 30, 74, 147, 249, 216, 30, 74, 147, 249, 215, 218, 197, 30, 74, 147, 249, - 214, 30, 74, 147, 249, 213, 201, 190, 30, 74, 147, 249, 212, 30, 74, 147, - 249, 211, 30, 74, 147, 249, 210, 30, 74, 147, 249, 209, 30, 74, 147, 249, - 208, 30, 74, 147, 249, 207, 30, 74, 147, 249, 206, 30, 74, 147, 249, 205, - 30, 74, 147, 249, 204, 30, 74, 147, 249, 203, 30, 74, 147, 249, 202, 30, - 74, 147, 249, 201, 232, 103, 30, 74, 147, 249, 180, 235, 33, 30, 74, 147, - 249, 177, 249, 51, 30, 74, 147, 249, 172, 205, 134, 30, 74, 147, 249, - 171, 51, 30, 74, 147, 249, 170, 30, 74, 147, 249, 169, 204, 48, 30, 74, - 147, 249, 168, 30, 74, 147, 249, 167, 30, 74, 147, 249, 166, 197, 74, - 245, 112, 30, 74, 147, 249, 165, 245, 112, 30, 74, 147, 249, 164, 245, - 113, 234, 250, 30, 74, 147, 249, 163, 197, 77, 30, 74, 147, 249, 162, 30, - 74, 147, 249, 161, 30, 74, 218, 205, 249, 160, 239, 87, 30, 74, 147, 249, - 159, 30, 74, 147, 249, 158, 30, 74, 147, 249, 156, 30, 74, 147, 249, 155, - 30, 74, 147, 249, 154, 30, 74, 147, 249, 153, 240, 68, 30, 74, 147, 249, - 152, 30, 74, 147, 249, 151, 30, 74, 147, 249, 150, 30, 74, 147, 249, 149, - 30, 74, 147, 249, 148, 30, 74, 147, 199, 47, 249, 233, 30, 74, 147, 199, - 47, 249, 200, 30, 74, 147, 199, 47, 249, 199, 30, 74, 147, 199, 47, 249, - 198, 30, 74, 147, 199, 47, 249, 197, 30, 74, 147, 199, 47, 249, 196, 30, - 74, 147, 199, 47, 249, 195, 30, 74, 147, 199, 47, 249, 194, 30, 74, 147, - 199, 47, 249, 193, 30, 74, 147, 199, 47, 249, 192, 30, 74, 147, 199, 47, - 249, 191, 30, 74, 147, 199, 47, 249, 190, 30, 74, 147, 199, 47, 249, 189, - 30, 74, 147, 199, 47, 249, 188, 30, 74, 147, 199, 47, 249, 187, 30, 74, - 147, 199, 47, 249, 186, 30, 74, 147, 199, 47, 249, 185, 30, 74, 147, 199, - 47, 249, 184, 30, 74, 147, 199, 47, 249, 183, 30, 74, 147, 199, 47, 249, - 182, 30, 74, 147, 199, 47, 249, 181, 30, 74, 147, 199, 47, 249, 179, 30, - 74, 147, 199, 47, 249, 178, 30, 74, 147, 199, 47, 249, 176, 30, 74, 147, - 199, 47, 249, 175, 30, 74, 147, 199, 47, 249, 174, 30, 74, 147, 199, 47, - 249, 173, 30, 74, 147, 199, 47, 249, 157, 30, 74, 147, 199, 47, 249, 147, - 251, 238, 197, 9, 207, 91, 222, 75, 251, 238, 197, 9, 207, 91, 238, 253, - 251, 238, 245, 102, 78, 251, 238, 31, 100, 251, 238, 31, 102, 251, 238, - 31, 134, 251, 238, 31, 136, 251, 238, 31, 146, 251, 238, 31, 167, 251, - 238, 31, 178, 251, 238, 31, 171, 251, 238, 31, 182, 251, 238, 31, 203, - 23, 251, 238, 31, 200, 234, 251, 238, 31, 202, 177, 251, 238, 31, 235, - 14, 251, 238, 31, 235, 145, 251, 238, 31, 206, 13, 251, 238, 31, 207, 65, - 251, 238, 31, 237, 20, 251, 238, 31, 216, 174, 251, 238, 31, 97, 231, 57, - 251, 238, 31, 99, 231, 57, 251, 238, 31, 115, 231, 57, 251, 238, 31, 235, - 7, 231, 57, 251, 238, 31, 235, 101, 231, 57, 251, 238, 31, 206, 29, 231, - 57, 251, 238, 31, 207, 71, 231, 57, 251, 238, 31, 237, 31, 231, 57, 251, - 238, 31, 216, 179, 231, 57, 251, 238, 31, 97, 170, 251, 238, 31, 99, 170, - 251, 238, 31, 115, 170, 251, 238, 31, 235, 7, 170, 251, 238, 31, 235, - 101, 170, 251, 238, 31, 206, 29, 170, 251, 238, 31, 207, 71, 170, 251, - 238, 31, 237, 31, 170, 251, 238, 31, 216, 179, 170, 251, 238, 31, 203, - 24, 170, 251, 238, 31, 200, 235, 170, 251, 238, 31, 202, 178, 170, 251, - 238, 31, 235, 15, 170, 251, 238, 31, 235, 146, 170, 251, 238, 31, 206, - 14, 170, 251, 238, 31, 207, 66, 170, 251, 238, 31, 237, 21, 170, 251, - 238, 31, 216, 175, 170, 251, 238, 197, 94, 249, 67, 200, 49, 251, 238, - 197, 94, 235, 113, 204, 137, 251, 238, 197, 94, 208, 136, 204, 137, 251, - 238, 197, 94, 202, 185, 204, 137, 251, 238, 197, 94, 235, 0, 204, 137, - 251, 238, 237, 204, 219, 203, 235, 113, 204, 137, 251, 238, 222, 56, 219, - 203, 235, 113, 204, 137, 251, 238, 219, 203, 208, 136, 204, 137, 251, - 238, 219, 203, 202, 185, 204, 137, 32, 252, 13, 250, 152, 97, 211, 87, - 32, 252, 13, 250, 152, 97, 232, 225, 32, 252, 13, 250, 152, 97, 237, 227, - 32, 252, 13, 250, 152, 146, 32, 252, 13, 250, 152, 235, 145, 32, 252, 13, - 250, 152, 235, 101, 231, 57, 32, 252, 13, 250, 152, 235, 101, 170, 32, - 252, 13, 250, 152, 235, 146, 170, 32, 252, 13, 250, 152, 235, 101, 203, - 123, 32, 252, 13, 250, 152, 203, 24, 203, 123, 32, 252, 13, 250, 152, - 235, 146, 203, 123, 32, 252, 13, 250, 152, 97, 231, 58, 203, 123, 32, - 252, 13, 250, 152, 235, 101, 231, 58, 203, 123, 32, 252, 13, 250, 152, - 97, 202, 159, 203, 123, 32, 252, 13, 250, 152, 235, 101, 202, 159, 203, - 123, 32, 252, 13, 250, 152, 235, 101, 204, 255, 32, 252, 13, 250, 152, - 203, 24, 204, 255, 32, 252, 13, 250, 152, 235, 146, 204, 255, 32, 252, - 13, 250, 152, 97, 231, 58, 204, 255, 32, 252, 13, 250, 152, 235, 101, - 231, 58, 204, 255, 32, 252, 13, 250, 152, 97, 202, 159, 204, 255, 32, - 252, 13, 250, 152, 203, 24, 202, 159, 204, 255, 32, 252, 13, 250, 152, - 235, 146, 202, 159, 204, 255, 32, 252, 13, 250, 152, 203, 24, 218, 254, - 32, 252, 13, 232, 97, 97, 212, 135, 32, 252, 13, 202, 201, 100, 32, 252, - 13, 232, 93, 100, 32, 252, 13, 236, 178, 102, 32, 252, 13, 202, 201, 102, - 32, 252, 13, 240, 236, 99, 237, 226, 32, 252, 13, 236, 178, 99, 237, 226, - 32, 252, 13, 201, 156, 146, 32, 252, 13, 201, 156, 203, 23, 32, 252, 13, - 201, 156, 203, 24, 251, 131, 20, 32, 252, 13, 232, 93, 203, 23, 32, 252, - 13, 219, 145, 203, 23, 32, 252, 13, 202, 201, 203, 23, 32, 252, 13, 202, - 201, 202, 177, 32, 252, 13, 201, 156, 235, 145, 32, 252, 13, 201, 156, - 235, 146, 251, 131, 20, 32, 252, 13, 232, 93, 235, 145, 32, 252, 13, 202, - 201, 235, 145, 32, 252, 13, 202, 201, 97, 231, 57, 32, 252, 13, 202, 201, - 115, 231, 57, 32, 252, 13, 236, 178, 235, 101, 231, 57, 32, 252, 13, 201, - 156, 235, 101, 231, 57, 32, 252, 13, 202, 201, 235, 101, 231, 57, 32, - 252, 13, 247, 96, 235, 101, 231, 57, 32, 252, 13, 217, 196, 235, 101, - 231, 57, 32, 252, 13, 202, 201, 97, 170, 32, 252, 13, 202, 201, 235, 101, - 170, 32, 252, 13, 239, 215, 235, 101, 218, 254, 32, 252, 13, 204, 214, - 235, 146, 218, 254, 32, 97, 157, 55, 32, 97, 157, 2, 251, 131, 20, 32, - 99, 202, 182, 55, 32, 115, 211, 86, 55, 32, 196, 67, 55, 32, 203, 124, - 55, 32, 237, 228, 55, 32, 214, 180, 55, 32, 99, 214, 179, 55, 32, 115, - 214, 179, 55, 32, 235, 7, 214, 179, 55, 32, 235, 101, 214, 179, 55, 32, - 219, 139, 55, 32, 223, 108, 249, 67, 55, 32, 222, 49, 55, 32, 214, 36, - 55, 32, 196, 199, 55, 32, 250, 209, 55, 32, 250, 225, 55, 32, 233, 110, - 55, 32, 201, 116, 249, 67, 55, 32, 195, 80, 55, 32, 97, 211, 88, 55, 32, - 206, 54, 55, 32, 226, 67, 55, 216, 39, 55, 209, 208, 207, 62, 55, 209, - 208, 200, 65, 55, 209, 208, 207, 97, 55, 209, 208, 207, 60, 55, 209, 208, - 239, 102, 207, 60, 55, 209, 208, 206, 77, 55, 209, 208, 239, 211, 55, - 209, 208, 211, 71, 55, 209, 208, 207, 78, 55, 209, 208, 237, 180, 55, - 209, 208, 250, 203, 55, 209, 208, 247, 32, 55, 32, 16, 203, 90, 210, 74, - 213, 1, 239, 79, 2, 213, 81, 213, 1, 239, 79, 2, 212, 127, 232, 137, 213, - 1, 239, 79, 2, 203, 93, 232, 137, 213, 1, 239, 79, 2, 247, 119, 213, 1, - 239, 79, 2, 245, 66, 213, 1, 239, 79, 2, 197, 21, 213, 1, 239, 79, 2, - 232, 103, 213, 1, 239, 79, 2, 234, 71, 213, 1, 239, 79, 2, 202, 113, 213, - 1, 239, 79, 2, 51, 213, 1, 239, 79, 2, 248, 77, 213, 1, 239, 79, 2, 206, - 220, 213, 1, 239, 79, 2, 244, 190, 213, 1, 239, 79, 2, 220, 61, 213, 1, - 239, 79, 2, 220, 0, 213, 1, 239, 79, 2, 208, 185, 213, 1, 239, 79, 2, - 222, 104, 213, 1, 239, 79, 2, 248, 98, 213, 1, 239, 79, 2, 247, 103, 212, - 142, 213, 1, 239, 79, 2, 239, 11, 213, 1, 239, 79, 2, 244, 165, 213, 1, - 239, 79, 2, 205, 235, 213, 1, 239, 79, 2, 244, 166, 213, 1, 239, 79, 2, - 248, 248, 213, 1, 239, 79, 2, 206, 207, 213, 1, 239, 79, 2, 231, 102, - 213, 1, 239, 79, 2, 232, 61, 213, 1, 239, 79, 2, 248, 2, 222, 172, 213, - 1, 239, 79, 2, 247, 92, 213, 1, 239, 79, 2, 210, 210, 213, 1, 239, 79, 2, - 237, 79, 213, 1, 239, 79, 2, 237, 236, 213, 1, 239, 79, 2, 201, 18, 213, - 1, 239, 79, 2, 248, 251, 213, 1, 239, 79, 2, 212, 143, 201, 190, 213, 1, - 239, 79, 2, 199, 14, 213, 1, 239, 79, 2, 213, 158, 213, 1, 239, 79, 2, - 209, 197, 213, 1, 239, 79, 2, 222, 88, 213, 1, 239, 79, 2, 214, 14, 249, - 138, 213, 1, 239, 79, 2, 235, 58, 213, 1, 239, 79, 2, 233, 102, 213, 1, - 239, 79, 2, 204, 215, 213, 1, 239, 79, 2, 4, 250, 123, 213, 1, 239, 79, - 2, 197, 119, 249, 89, 213, 1, 239, 79, 2, 38, 214, 182, 106, 221, 149, 1, - 63, 221, 149, 1, 69, 221, 149, 1, 250, 112, 221, 149, 1, 248, 198, 221, - 149, 1, 234, 190, 221, 149, 1, 240, 231, 221, 149, 1, 68, 221, 149, 1, - 197, 199, 221, 149, 1, 195, 158, 221, 149, 1, 202, 235, 221, 149, 1, 225, - 217, 221, 149, 1, 225, 80, 221, 149, 1, 211, 167, 221, 149, 1, 159, 221, - 149, 1, 221, 136, 221, 149, 1, 218, 55, 221, 149, 1, 219, 0, 221, 149, 1, - 216, 87, 221, 149, 1, 66, 221, 149, 1, 214, 3, 221, 149, 1, 224, 37, 221, - 149, 1, 144, 221, 149, 1, 209, 80, 221, 149, 1, 203, 216, 221, 149, 1, - 201, 81, 221, 149, 1, 251, 106, 221, 149, 1, 236, 230, 221, 149, 1, 233, - 15, 221, 149, 1, 196, 222, 247, 109, 1, 63, 247, 109, 1, 213, 245, 247, - 109, 1, 240, 231, 247, 109, 1, 159, 247, 109, 1, 199, 243, 247, 109, 1, - 144, 247, 109, 1, 222, 201, 247, 109, 1, 254, 177, 247, 109, 1, 211, 167, - 247, 109, 1, 250, 112, 247, 109, 1, 221, 136, 247, 109, 1, 72, 247, 109, - 1, 240, 138, 247, 109, 1, 203, 216, 247, 109, 1, 207, 52, 247, 109, 1, - 207, 51, 247, 109, 1, 209, 80, 247, 109, 1, 247, 206, 247, 109, 1, 66, - 247, 109, 1, 216, 87, 247, 109, 1, 196, 222, 247, 109, 1, 218, 55, 247, - 109, 1, 201, 80, 247, 109, 1, 214, 3, 247, 109, 1, 205, 83, 247, 109, 1, - 68, 247, 109, 1, 69, 247, 109, 1, 199, 240, 247, 109, 1, 225, 80, 247, - 109, 1, 225, 71, 247, 109, 1, 217, 161, 247, 109, 1, 199, 245, 247, 109, - 1, 234, 190, 247, 109, 1, 234, 125, 247, 109, 1, 205, 23, 247, 109, 1, - 205, 22, 247, 109, 1, 217, 73, 247, 109, 1, 226, 120, 247, 109, 1, 247, - 205, 247, 109, 1, 201, 81, 247, 109, 1, 199, 242, 247, 109, 1, 209, 182, - 247, 109, 1, 219, 246, 247, 109, 1, 219, 245, 247, 109, 1, 219, 244, 247, - 109, 1, 219, 243, 247, 109, 1, 222, 200, 247, 109, 1, 237, 83, 247, 109, - 1, 199, 241, 88, 236, 181, 202, 158, 78, 88, 236, 181, 17, 100, 88, 236, - 181, 17, 102, 88, 236, 181, 17, 134, 88, 236, 181, 17, 136, 88, 236, 181, - 17, 146, 88, 236, 181, 17, 167, 88, 236, 181, 17, 178, 88, 236, 181, 17, - 171, 88, 236, 181, 17, 182, 88, 236, 181, 31, 203, 23, 88, 236, 181, 31, - 200, 234, 88, 236, 181, 31, 202, 177, 88, 236, 181, 31, 235, 14, 88, 236, - 181, 31, 235, 145, 88, 236, 181, 31, 206, 13, 88, 236, 181, 31, 207, 65, - 88, 236, 181, 31, 237, 20, 88, 236, 181, 31, 216, 174, 88, 236, 181, 31, - 97, 231, 57, 88, 236, 181, 31, 99, 231, 57, 88, 236, 181, 31, 115, 231, - 57, 88, 236, 181, 31, 235, 7, 231, 57, 88, 236, 181, 31, 235, 101, 231, - 57, 88, 236, 181, 31, 206, 29, 231, 57, 88, 236, 181, 31, 207, 71, 231, - 57, 88, 236, 181, 31, 237, 31, 231, 57, 88, 236, 181, 31, 216, 179, 231, - 57, 37, 41, 1, 63, 37, 41, 1, 249, 9, 37, 41, 1, 224, 209, 37, 41, 1, - 239, 252, 37, 41, 1, 69, 37, 41, 1, 199, 118, 37, 41, 1, 195, 88, 37, 41, - 1, 232, 147, 37, 41, 1, 202, 217, 37, 41, 1, 68, 37, 41, 1, 155, 37, 41, - 1, 237, 7, 37, 41, 1, 236, 241, 37, 41, 1, 236, 230, 37, 41, 1, 236, 141, - 37, 41, 1, 72, 37, 41, 1, 213, 92, 37, 41, 1, 206, 255, 37, 41, 1, 223, - 187, 37, 41, 1, 236, 163, 37, 41, 1, 236, 151, 37, 41, 1, 203, 68, 37, - 41, 1, 66, 37, 41, 1, 237, 10, 37, 41, 1, 212, 249, 37, 41, 1, 224, 131, - 37, 41, 1, 237, 47, 37, 41, 1, 236, 153, 37, 41, 1, 245, 103, 37, 41, 1, - 226, 120, 37, 41, 1, 199, 245, 37, 41, 1, 236, 134, 37, 41, 215, 142, - 100, 37, 41, 215, 142, 146, 37, 41, 215, 142, 203, 23, 37, 41, 215, 142, - 235, 145, 37, 41, 1, 196, 69, 37, 41, 1, 216, 23, 201, 107, 37, 41, 1, - 205, 157, 201, 107, 233, 120, 1, 251, 203, 233, 120, 1, 249, 109, 233, - 120, 1, 233, 189, 233, 120, 1, 240, 117, 233, 120, 1, 251, 198, 233, 120, - 1, 211, 150, 233, 120, 1, 225, 229, 233, 120, 1, 232, 238, 233, 120, 1, - 202, 171, 233, 120, 1, 237, 18, 233, 120, 1, 223, 146, 233, 120, 1, 223, - 58, 233, 120, 1, 220, 52, 233, 120, 1, 217, 198, 233, 120, 1, 225, 185, - 233, 120, 1, 200, 7, 233, 120, 1, 213, 218, 233, 120, 1, 216, 174, 233, - 120, 1, 210, 223, 233, 120, 1, 208, 189, 233, 120, 1, 203, 38, 233, 120, - 1, 197, 44, 233, 120, 1, 235, 219, 233, 120, 1, 226, 124, 233, 120, 1, - 231, 41, 233, 120, 1, 214, 48, 233, 120, 1, 216, 179, 231, 57, 37, 213, - 36, 1, 251, 106, 37, 213, 36, 1, 247, 244, 37, 213, 36, 1, 234, 107, 37, - 213, 36, 1, 239, 15, 37, 213, 36, 1, 69, 37, 213, 36, 1, 195, 56, 37, - 213, 36, 1, 237, 148, 37, 213, 36, 1, 195, 96, 37, 213, 36, 1, 237, 146, - 37, 213, 36, 1, 68, 37, 213, 36, 1, 223, 251, 37, 213, 36, 1, 222, 168, - 37, 213, 36, 1, 219, 162, 37, 213, 36, 1, 217, 99, 37, 213, 36, 1, 198, - 232, 37, 213, 36, 1, 213, 78, 37, 213, 36, 1, 210, 141, 37, 213, 36, 1, - 206, 84, 37, 213, 36, 1, 203, 137, 37, 213, 36, 1, 66, 37, 213, 36, 1, - 245, 84, 37, 213, 36, 1, 206, 189, 37, 213, 36, 1, 207, 1, 37, 213, 36, - 1, 195, 219, 37, 213, 36, 1, 196, 47, 37, 213, 36, 1, 72, 37, 213, 36, 1, - 214, 102, 37, 213, 36, 1, 237, 47, 37, 213, 36, 1, 142, 37, 213, 36, 1, - 201, 91, 37, 213, 36, 1, 199, 105, 37, 213, 36, 1, 196, 51, 37, 213, 36, - 1, 196, 49, 37, 213, 36, 1, 196, 84, 37, 213, 36, 1, 226, 147, 37, 213, - 36, 1, 195, 217, 37, 213, 36, 1, 164, 37, 213, 36, 1, 230, 210, 38, 37, - 213, 36, 1, 251, 106, 38, 37, 213, 36, 1, 239, 15, 38, 37, 213, 36, 1, - 195, 96, 38, 37, 213, 36, 1, 217, 99, 38, 37, 213, 36, 1, 206, 84, 200, - 93, 1, 251, 138, 200, 93, 1, 248, 206, 200, 93, 1, 234, 95, 200, 93, 1, - 224, 146, 200, 93, 1, 239, 212, 200, 93, 1, 231, 193, 200, 93, 1, 197, - 34, 200, 93, 1, 195, 78, 200, 93, 1, 231, 94, 200, 93, 1, 203, 1, 200, - 93, 1, 195, 241, 200, 93, 1, 225, 35, 200, 93, 1, 206, 211, 200, 93, 1, - 222, 245, 200, 93, 1, 219, 171, 200, 93, 1, 239, 172, 200, 93, 1, 215, - 138, 200, 93, 1, 194, 255, 200, 93, 1, 208, 224, 200, 93, 1, 251, 194, - 200, 93, 1, 211, 227, 200, 93, 1, 209, 7, 200, 93, 1, 211, 102, 200, 93, - 1, 210, 201, 200, 93, 1, 202, 221, 200, 93, 1, 233, 225, 200, 93, 1, 149, - 200, 93, 1, 68, 200, 93, 1, 66, 200, 93, 1, 205, 34, 200, 93, 197, 9, - 239, 59, 37, 213, 30, 2, 63, 37, 213, 30, 2, 68, 37, 213, 30, 2, 66, 37, - 213, 30, 2, 155, 37, 213, 30, 2, 223, 187, 37, 213, 30, 2, 234, 123, 37, - 213, 30, 2, 233, 76, 37, 213, 30, 2, 196, 208, 37, 213, 30, 2, 247, 174, - 37, 213, 30, 2, 225, 214, 37, 213, 30, 2, 225, 172, 37, 213, 30, 2, 189, - 37, 213, 30, 2, 201, 40, 37, 213, 30, 2, 240, 136, 37, 213, 30, 2, 239, - 152, 37, 213, 30, 2, 237, 201, 37, 213, 30, 2, 202, 233, 37, 213, 30, 2, - 161, 37, 213, 30, 2, 249, 145, 37, 213, 30, 2, 235, 239, 37, 213, 30, 2, - 176, 37, 213, 30, 2, 215, 186, 37, 213, 30, 2, 166, 37, 213, 30, 2, 219, - 78, 37, 213, 30, 2, 218, 145, 37, 213, 30, 2, 164, 37, 213, 30, 2, 199, - 152, 37, 213, 30, 2, 199, 34, 37, 213, 30, 2, 169, 37, 213, 30, 2, 209, - 140, 37, 213, 30, 2, 172, 37, 213, 30, 2, 183, 37, 213, 30, 2, 195, 115, - 37, 213, 30, 2, 207, 50, 37, 213, 30, 2, 205, 80, 37, 213, 30, 2, 142, - 37, 213, 30, 2, 250, 144, 37, 213, 30, 2, 250, 143, 37, 213, 30, 2, 250, - 142, 37, 213, 30, 2, 196, 178, 37, 213, 30, 2, 240, 113, 37, 213, 30, 2, - 240, 112, 37, 213, 30, 2, 249, 120, 37, 213, 30, 2, 247, 226, 37, 213, - 30, 197, 9, 239, 59, 37, 213, 30, 31, 100, 37, 213, 30, 31, 102, 37, 213, - 30, 31, 203, 23, 37, 213, 30, 31, 200, 234, 37, 213, 30, 31, 231, 57, - 239, 192, 6, 1, 181, 68, 239, 192, 6, 1, 181, 69, 239, 192, 6, 1, 181, - 63, 239, 192, 6, 1, 181, 251, 209, 239, 192, 6, 1, 181, 72, 239, 192, 6, - 1, 181, 214, 102, 239, 192, 6, 1, 206, 182, 68, 239, 192, 6, 1, 206, 182, - 69, 239, 192, 6, 1, 206, 182, 63, 239, 192, 6, 1, 206, 182, 251, 209, - 239, 192, 6, 1, 206, 182, 72, 239, 192, 6, 1, 206, 182, 214, 102, 239, - 192, 6, 1, 250, 122, 239, 192, 6, 1, 214, 16, 239, 192, 6, 1, 196, 243, - 239, 192, 6, 1, 196, 66, 239, 192, 6, 1, 233, 15, 239, 192, 6, 1, 213, - 79, 239, 192, 6, 1, 248, 251, 239, 192, 6, 1, 203, 48, 239, 192, 6, 1, - 239, 237, 239, 192, 6, 1, 245, 99, 239, 192, 6, 1, 225, 191, 239, 192, 6, - 1, 224, 216, 239, 192, 6, 1, 234, 69, 239, 192, 6, 1, 237, 47, 239, 192, - 6, 1, 199, 113, 239, 192, 6, 1, 236, 121, 239, 192, 6, 1, 202, 215, 239, - 192, 6, 1, 236, 151, 239, 192, 6, 1, 195, 85, 239, 192, 6, 1, 236, 141, - 239, 192, 6, 1, 195, 64, 239, 192, 6, 1, 236, 163, 239, 192, 6, 1, 237, - 7, 239, 192, 6, 1, 236, 241, 239, 192, 6, 1, 236, 230, 239, 192, 6, 1, - 236, 215, 239, 192, 6, 1, 214, 146, 239, 192, 6, 1, 236, 98, 239, 192, 4, - 1, 181, 68, 239, 192, 4, 1, 181, 69, 239, 192, 4, 1, 181, 63, 239, 192, - 4, 1, 181, 251, 209, 239, 192, 4, 1, 181, 72, 239, 192, 4, 1, 181, 214, - 102, 239, 192, 4, 1, 206, 182, 68, 239, 192, 4, 1, 206, 182, 69, 239, - 192, 4, 1, 206, 182, 63, 239, 192, 4, 1, 206, 182, 251, 209, 239, 192, 4, - 1, 206, 182, 72, 239, 192, 4, 1, 206, 182, 214, 102, 239, 192, 4, 1, 250, - 122, 239, 192, 4, 1, 214, 16, 239, 192, 4, 1, 196, 243, 239, 192, 4, 1, - 196, 66, 239, 192, 4, 1, 233, 15, 239, 192, 4, 1, 213, 79, 239, 192, 4, - 1, 248, 251, 239, 192, 4, 1, 203, 48, 239, 192, 4, 1, 239, 237, 239, 192, - 4, 1, 245, 99, 239, 192, 4, 1, 225, 191, 239, 192, 4, 1, 224, 216, 239, - 192, 4, 1, 234, 69, 239, 192, 4, 1, 237, 47, 239, 192, 4, 1, 199, 113, - 239, 192, 4, 1, 236, 121, 239, 192, 4, 1, 202, 215, 239, 192, 4, 1, 236, - 151, 239, 192, 4, 1, 195, 85, 239, 192, 4, 1, 236, 141, 239, 192, 4, 1, - 195, 64, 239, 192, 4, 1, 236, 163, 239, 192, 4, 1, 237, 7, 239, 192, 4, - 1, 236, 241, 239, 192, 4, 1, 236, 230, 239, 192, 4, 1, 236, 215, 239, - 192, 4, 1, 214, 146, 239, 192, 4, 1, 236, 98, 207, 6, 1, 213, 76, 207, 6, - 1, 201, 229, 207, 6, 1, 224, 89, 207, 6, 1, 235, 182, 207, 6, 1, 202, - 190, 207, 6, 1, 205, 200, 207, 6, 1, 204, 85, 207, 6, 1, 245, 22, 207, 6, - 1, 196, 68, 207, 6, 1, 231, 54, 207, 6, 1, 248, 183, 207, 6, 1, 239, 251, - 207, 6, 1, 234, 109, 207, 6, 1, 198, 227, 207, 6, 1, 202, 196, 207, 6, 1, - 195, 8, 207, 6, 1, 219, 202, 207, 6, 1, 225, 108, 207, 6, 1, 197, 25, - 207, 6, 1, 232, 248, 207, 6, 1, 221, 245, 207, 6, 1, 219, 24, 207, 6, 1, - 226, 127, 207, 6, 1, 237, 45, 207, 6, 1, 250, 195, 207, 6, 1, 251, 250, - 207, 6, 1, 214, 119, 207, 6, 1, 197, 12, 207, 6, 1, 214, 34, 207, 6, 1, - 251, 209, 207, 6, 1, 209, 223, 207, 6, 1, 215, 138, 207, 6, 1, 237, 65, - 207, 6, 1, 251, 214, 207, 6, 1, 230, 201, 207, 6, 1, 200, 36, 207, 6, 1, - 214, 188, 207, 6, 1, 214, 94, 207, 6, 1, 214, 144, 207, 6, 1, 250, 125, - 207, 6, 1, 250, 246, 207, 6, 1, 214, 72, 207, 6, 1, 251, 189, 207, 6, 1, - 236, 155, 207, 6, 1, 250, 222, 207, 6, 1, 237, 76, 207, 6, 1, 230, 209, - 207, 6, 1, 196, 30, 214, 50, 1, 251, 164, 214, 50, 1, 249, 145, 214, 50, - 1, 189, 214, 50, 1, 225, 214, 214, 50, 1, 196, 208, 214, 50, 1, 224, 146, - 214, 50, 1, 239, 236, 214, 50, 1, 169, 214, 50, 1, 183, 214, 50, 1, 206, - 217, 214, 50, 1, 239, 176, 214, 50, 1, 247, 82, 214, 50, 1, 234, 123, - 214, 50, 1, 235, 239, 214, 50, 1, 211, 157, 214, 50, 1, 225, 51, 214, 50, - 1, 223, 78, 214, 50, 1, 219, 38, 214, 50, 1, 215, 122, 214, 50, 1, 197, - 117, 214, 50, 1, 142, 214, 50, 1, 164, 214, 50, 1, 63, 214, 50, 1, 69, - 214, 50, 1, 68, 214, 50, 1, 72, 214, 50, 1, 66, 214, 50, 1, 252, 168, - 214, 50, 1, 237, 54, 214, 50, 1, 214, 102, 214, 50, 17, 195, 79, 214, 50, - 17, 100, 214, 50, 17, 102, 214, 50, 17, 134, 214, 50, 17, 136, 214, 50, - 17, 146, 214, 50, 17, 167, 214, 50, 17, 178, 214, 50, 17, 171, 214, 50, - 17, 182, 214, 52, 6, 1, 63, 214, 52, 6, 1, 251, 200, 214, 52, 6, 1, 251, - 194, 214, 52, 6, 1, 251, 209, 214, 52, 6, 1, 248, 64, 214, 52, 6, 1, 247, - 16, 214, 52, 6, 1, 237, 39, 214, 52, 6, 1, 69, 214, 52, 6, 1, 237, 19, - 214, 52, 6, 1, 142, 214, 52, 6, 1, 231, 11, 214, 52, 6, 1, 68, 214, 52, - 6, 1, 155, 214, 52, 6, 1, 237, 38, 214, 52, 6, 1, 223, 110, 214, 52, 6, - 1, 172, 214, 52, 6, 1, 166, 214, 52, 6, 1, 176, 214, 52, 6, 1, 72, 214, - 52, 6, 1, 214, 143, 214, 52, 6, 1, 161, 214, 52, 6, 1, 237, 37, 214, 52, - 6, 1, 183, 214, 52, 6, 1, 207, 50, 214, 52, 6, 1, 189, 214, 52, 6, 1, - 237, 36, 214, 52, 6, 1, 201, 113, 214, 52, 6, 1, 237, 35, 214, 52, 6, 1, - 201, 103, 214, 52, 6, 1, 239, 176, 214, 52, 6, 1, 66, 214, 52, 6, 1, 197, - 166, 214, 52, 6, 1, 224, 146, 214, 52, 6, 1, 233, 230, 214, 52, 6, 1, - 195, 115, 214, 52, 6, 1, 195, 74, 214, 52, 4, 1, 63, 214, 52, 4, 1, 251, - 200, 214, 52, 4, 1, 251, 194, 214, 52, 4, 1, 251, 209, 214, 52, 4, 1, - 248, 64, 214, 52, 4, 1, 247, 16, 214, 52, 4, 1, 237, 39, 214, 52, 4, 1, - 69, 214, 52, 4, 1, 237, 19, 214, 52, 4, 1, 142, 214, 52, 4, 1, 231, 11, - 214, 52, 4, 1, 68, 214, 52, 4, 1, 155, 214, 52, 4, 1, 237, 38, 214, 52, - 4, 1, 223, 110, 214, 52, 4, 1, 172, 214, 52, 4, 1, 166, 214, 52, 4, 1, - 176, 214, 52, 4, 1, 72, 214, 52, 4, 1, 214, 143, 214, 52, 4, 1, 161, 214, - 52, 4, 1, 237, 37, 214, 52, 4, 1, 183, 214, 52, 4, 1, 207, 50, 214, 52, - 4, 1, 189, 214, 52, 4, 1, 237, 36, 214, 52, 4, 1, 201, 113, 214, 52, 4, - 1, 237, 35, 214, 52, 4, 1, 201, 103, 214, 52, 4, 1, 239, 176, 214, 52, 4, - 1, 66, 214, 52, 4, 1, 197, 166, 214, 52, 4, 1, 224, 146, 214, 52, 4, 1, - 233, 230, 214, 52, 4, 1, 195, 115, 214, 52, 4, 1, 195, 74, 237, 3, 1, 63, - 237, 3, 1, 249, 9, 237, 3, 1, 247, 57, 237, 3, 1, 245, 103, 237, 3, 1, - 239, 252, 237, 3, 1, 217, 151, 237, 3, 1, 239, 167, 237, 3, 1, 237, 33, - 237, 3, 1, 69, 237, 3, 1, 235, 189, 237, 3, 1, 234, 48, 237, 3, 1, 233, - 161, 237, 3, 1, 232, 147, 237, 3, 1, 68, 237, 3, 1, 225, 193, 237, 3, 1, - 224, 209, 237, 3, 1, 222, 197, 237, 3, 1, 222, 32, 237, 3, 1, 219, 207, - 237, 3, 1, 217, 118, 237, 3, 1, 176, 237, 3, 1, 216, 157, 237, 3, 1, 72, - 237, 3, 1, 213, 92, 237, 3, 1, 211, 139, 237, 3, 1, 210, 183, 237, 3, 1, - 209, 176, 237, 3, 1, 208, 147, 237, 3, 1, 206, 255, 237, 3, 1, 203, 68, - 237, 3, 1, 202, 217, 237, 3, 1, 66, 237, 3, 1, 199, 118, 237, 3, 1, 196, - 202, 237, 3, 1, 196, 148, 237, 3, 1, 195, 88, 237, 3, 1, 195, 65, 237, 3, - 1, 233, 216, 237, 3, 1, 233, 222, 237, 3, 1, 224, 131, 247, 89, 251, 165, - 1, 251, 133, 247, 89, 251, 165, 1, 248, 208, 247, 89, 251, 165, 1, 233, - 179, 247, 89, 251, 165, 1, 240, 61, 247, 89, 251, 165, 1, 237, 64, 247, - 89, 251, 165, 1, 195, 99, 247, 89, 251, 165, 1, 236, 58, 247, 89, 251, - 165, 1, 195, 59, 247, 89, 251, 165, 1, 203, 96, 247, 89, 251, 165, 1, - 247, 16, 247, 89, 251, 165, 1, 195, 228, 247, 89, 251, 165, 1, 195, 74, - 247, 89, 251, 165, 1, 226, 0, 247, 89, 251, 165, 1, 207, 50, 247, 89, - 251, 165, 1, 222, 238, 247, 89, 251, 165, 1, 226, 13, 247, 89, 251, 165, - 1, 196, 198, 247, 89, 251, 165, 1, 237, 164, 247, 89, 251, 165, 1, 247, - 116, 247, 89, 251, 165, 1, 225, 173, 247, 89, 251, 165, 1, 224, 251, 247, - 89, 251, 165, 1, 221, 145, 247, 89, 251, 165, 1, 232, 82, 247, 89, 251, - 165, 1, 211, 140, 247, 89, 251, 165, 1, 251, 48, 247, 89, 251, 165, 1, - 245, 39, 247, 89, 251, 165, 1, 245, 75, 247, 89, 251, 165, 1, 240, 243, - 247, 89, 251, 165, 1, 220, 40, 247, 89, 251, 165, 1, 211, 144, 247, 89, - 251, 165, 1, 216, 3, 247, 89, 251, 165, 1, 237, 141, 247, 89, 251, 165, - 1, 207, 33, 247, 89, 251, 165, 1, 225, 194, 247, 89, 251, 165, 1, 214, - 119, 247, 89, 251, 165, 1, 200, 205, 247, 89, 251, 165, 1, 235, 212, 247, - 89, 251, 165, 1, 237, 154, 247, 89, 251, 165, 1, 245, 109, 247, 89, 251, - 165, 1, 213, 65, 247, 89, 251, 165, 1, 233, 206, 247, 89, 251, 165, 1, - 210, 198, 247, 89, 251, 165, 1, 207, 59, 247, 89, 251, 165, 1, 199, 37, - 247, 89, 251, 165, 1, 202, 50, 247, 89, 251, 165, 1, 206, 160, 247, 89, - 251, 165, 1, 225, 227, 247, 89, 251, 165, 1, 240, 244, 247, 89, 251, 165, - 1, 247, 82, 247, 89, 251, 165, 1, 196, 73, 247, 89, 251, 165, 1, 212, - 154, 247, 89, 251, 165, 1, 224, 52, 247, 89, 251, 165, 244, 237, 78, 30, - 39, 2, 252, 116, 30, 39, 2, 252, 115, 30, 39, 2, 252, 114, 30, 39, 2, - 252, 113, 30, 39, 2, 252, 112, 30, 39, 2, 252, 111, 30, 39, 2, 252, 110, - 30, 39, 2, 252, 109, 30, 39, 2, 252, 108, 30, 39, 2, 252, 107, 30, 39, 2, - 252, 106, 30, 39, 2, 252, 105, 30, 39, 2, 252, 104, 30, 39, 2, 252, 103, - 30, 39, 2, 252, 102, 30, 39, 2, 252, 101, 30, 39, 2, 252, 100, 30, 39, 2, - 252, 99, 30, 39, 2, 252, 98, 30, 39, 2, 252, 97, 30, 39, 2, 252, 96, 30, - 39, 2, 252, 95, 30, 39, 2, 252, 94, 30, 39, 2, 252, 93, 30, 39, 2, 252, - 92, 30, 39, 2, 252, 91, 30, 39, 2, 252, 90, 30, 39, 2, 255, 126, 30, 39, - 2, 252, 89, 30, 39, 2, 252, 88, 30, 39, 2, 252, 87, 30, 39, 2, 252, 86, - 30, 39, 2, 252, 85, 30, 39, 2, 252, 84, 30, 39, 2, 252, 83, 30, 39, 2, - 252, 82, 30, 39, 2, 252, 81, 30, 39, 2, 252, 80, 30, 39, 2, 252, 79, 30, - 39, 2, 252, 78, 30, 39, 2, 252, 77, 30, 39, 2, 252, 76, 30, 39, 2, 252, - 75, 30, 39, 2, 252, 74, 30, 39, 2, 252, 73, 30, 39, 2, 252, 72, 30, 39, - 2, 252, 71, 30, 39, 2, 252, 70, 30, 39, 2, 252, 69, 30, 39, 2, 252, 68, - 30, 39, 2, 252, 67, 30, 39, 2, 252, 66, 30, 39, 2, 252, 65, 30, 39, 2, - 252, 64, 30, 39, 2, 252, 63, 30, 39, 2, 252, 62, 30, 39, 2, 252, 61, 30, - 39, 2, 252, 60, 30, 39, 2, 252, 59, 30, 39, 2, 252, 58, 30, 39, 2, 252, - 57, 30, 39, 2, 252, 56, 30, 39, 2, 252, 55, 30, 39, 2, 252, 54, 30, 39, - 2, 252, 53, 30, 39, 2, 252, 52, 30, 39, 2, 252, 51, 30, 39, 2, 252, 50, - 30, 39, 2, 252, 49, 30, 39, 2, 252, 48, 30, 39, 2, 252, 47, 30, 39, 2, - 255, 39, 30, 39, 2, 252, 46, 30, 39, 2, 252, 45, 30, 39, 2, 255, 4, 30, - 39, 2, 252, 44, 30, 39, 2, 252, 43, 30, 39, 2, 252, 42, 30, 39, 2, 252, - 41, 30, 39, 2, 254, 247, 30, 39, 2, 252, 40, 30, 39, 2, 252, 39, 30, 39, - 2, 252, 38, 30, 39, 2, 252, 37, 30, 39, 2, 252, 36, 30, 39, 2, 254, 63, - 30, 39, 2, 254, 62, 30, 39, 2, 254, 61, 30, 39, 2, 254, 60, 30, 39, 2, - 254, 59, 30, 39, 2, 254, 58, 30, 39, 2, 254, 57, 30, 39, 2, 254, 56, 30, - 39, 2, 254, 54, 30, 39, 2, 254, 53, 30, 39, 2, 254, 52, 30, 39, 2, 254, - 51, 30, 39, 2, 254, 50, 30, 39, 2, 254, 49, 30, 39, 2, 254, 47, 30, 39, - 2, 254, 46, 30, 39, 2, 254, 45, 30, 39, 2, 254, 44, 30, 39, 2, 254, 43, - 30, 39, 2, 254, 42, 30, 39, 2, 254, 41, 30, 39, 2, 254, 40, 30, 39, 2, - 254, 39, 30, 39, 2, 254, 38, 30, 39, 2, 254, 37, 30, 39, 2, 254, 36, 30, - 39, 2, 254, 35, 30, 39, 2, 254, 34, 30, 39, 2, 254, 33, 30, 39, 2, 254, - 32, 30, 39, 2, 254, 31, 30, 39, 2, 254, 30, 30, 39, 2, 254, 29, 30, 39, - 2, 254, 27, 30, 39, 2, 254, 26, 30, 39, 2, 254, 25, 30, 39, 2, 254, 21, - 30, 39, 2, 254, 20, 30, 39, 2, 254, 19, 30, 39, 2, 254, 18, 30, 39, 2, - 254, 14, 30, 39, 2, 254, 13, 30, 39, 2, 254, 12, 30, 39, 2, 254, 11, 30, - 39, 2, 254, 10, 30, 39, 2, 254, 9, 30, 39, 2, 254, 8, 30, 39, 2, 254, 7, - 30, 39, 2, 254, 6, 30, 39, 2, 254, 5, 30, 39, 2, 254, 4, 30, 39, 2, 254, - 3, 30, 39, 2, 254, 2, 30, 39, 2, 254, 1, 30, 39, 2, 254, 0, 30, 39, 2, - 253, 255, 30, 39, 2, 253, 254, 30, 39, 2, 253, 253, 30, 39, 2, 253, 252, - 30, 39, 2, 253, 251, 30, 39, 2, 253, 250, 30, 39, 2, 253, 249, 30, 39, 2, - 253, 248, 30, 39, 2, 253, 246, 30, 39, 2, 253, 245, 30, 39, 2, 253, 244, - 30, 39, 2, 253, 243, 30, 39, 2, 253, 242, 30, 39, 2, 253, 240, 30, 39, 2, - 253, 239, 30, 39, 2, 253, 238, 30, 39, 2, 253, 237, 30, 39, 2, 253, 235, - 30, 39, 2, 253, 234, 30, 39, 2, 253, 233, 30, 39, 2, 253, 199, 30, 39, 2, - 253, 197, 30, 39, 2, 253, 195, 30, 39, 2, 253, 193, 30, 39, 2, 253, 191, - 30, 39, 2, 253, 189, 30, 39, 2, 253, 187, 30, 39, 2, 253, 185, 30, 39, 2, - 253, 183, 30, 39, 2, 253, 181, 30, 39, 2, 253, 179, 30, 39, 2, 253, 176, - 30, 39, 2, 253, 174, 30, 39, 2, 253, 172, 30, 39, 2, 253, 170, 30, 39, 2, - 253, 168, 30, 39, 2, 253, 166, 30, 39, 2, 253, 164, 30, 39, 2, 253, 162, - 30, 39, 2, 253, 80, 30, 39, 2, 253, 79, 30, 39, 2, 253, 78, 30, 39, 2, - 253, 77, 30, 39, 2, 253, 76, 30, 39, 2, 253, 75, 30, 39, 2, 253, 73, 30, - 39, 2, 253, 72, 30, 39, 2, 253, 71, 30, 39, 2, 253, 70, 30, 39, 2, 253, - 69, 30, 39, 2, 253, 68, 30, 39, 2, 253, 66, 30, 39, 2, 253, 65, 30, 39, - 2, 253, 61, 30, 39, 2, 253, 60, 30, 39, 2, 253, 58, 30, 39, 2, 253, 57, - 30, 39, 2, 253, 56, 30, 39, 2, 253, 55, 30, 39, 2, 253, 54, 30, 39, 2, - 253, 53, 30, 39, 2, 253, 52, 30, 39, 2, 253, 51, 30, 39, 2, 253, 50, 30, - 39, 2, 253, 49, 30, 39, 2, 253, 48, 30, 39, 2, 253, 47, 30, 39, 2, 253, - 46, 30, 39, 2, 253, 45, 30, 39, 2, 253, 44, 30, 39, 2, 253, 43, 30, 39, - 2, 253, 42, 30, 39, 2, 253, 41, 30, 39, 2, 253, 40, 30, 39, 2, 253, 39, - 30, 39, 2, 253, 38, 30, 39, 2, 253, 37, 30, 39, 2, 253, 36, 30, 39, 2, - 253, 35, 30, 39, 2, 253, 34, 30, 39, 2, 253, 33, 30, 39, 2, 253, 32, 30, - 39, 2, 253, 31, 30, 39, 2, 253, 30, 30, 39, 2, 253, 29, 30, 39, 2, 253, - 28, 30, 39, 2, 253, 27, 30, 39, 2, 253, 26, 30, 39, 2, 253, 25, 30, 39, - 2, 253, 24, 30, 39, 2, 253, 23, 30, 39, 2, 253, 22, 30, 39, 2, 253, 21, - 30, 39, 2, 253, 20, 30, 39, 2, 253, 19, 30, 39, 2, 253, 18, 30, 39, 2, - 253, 17, 30, 39, 2, 253, 16, 30, 39, 2, 253, 15, 30, 39, 2, 253, 14, 30, - 39, 2, 253, 13, 30, 39, 2, 253, 12, 30, 39, 2, 253, 11, 30, 39, 2, 253, - 10, 30, 39, 2, 253, 9, 30, 39, 2, 253, 8, 30, 39, 2, 253, 7, 30, 39, 2, - 253, 6, 30, 39, 2, 253, 5, 30, 39, 2, 253, 4, 30, 39, 2, 253, 3, 30, 39, - 2, 253, 2, 30, 39, 2, 253, 1, 30, 39, 2, 253, 0, 30, 39, 2, 252, 255, 30, - 39, 2, 252, 254, 30, 39, 2, 252, 253, 30, 39, 2, 252, 252, 30, 39, 2, - 252, 251, 30, 39, 2, 252, 250, 30, 39, 2, 252, 249, 30, 39, 2, 252, 248, - 30, 39, 2, 252, 247, 30, 39, 2, 252, 246, 30, 39, 2, 252, 245, 30, 39, 2, - 252, 244, 30, 39, 2, 252, 243, 30, 39, 2, 252, 242, 30, 39, 2, 252, 241, - 30, 39, 2, 252, 240, 30, 39, 2, 252, 239, 30, 39, 2, 252, 238, 30, 39, 2, - 252, 237, 30, 39, 2, 252, 236, 30, 39, 2, 252, 235, 30, 39, 2, 252, 234, - 30, 39, 2, 252, 233, 30, 39, 2, 252, 232, 30, 39, 2, 252, 231, 30, 39, 2, - 252, 230, 30, 39, 2, 252, 229, 30, 39, 2, 252, 228, 30, 39, 2, 252, 227, - 30, 39, 2, 252, 226, 30, 39, 2, 252, 225, 30, 39, 2, 252, 224, 30, 39, 2, - 252, 223, 30, 39, 2, 252, 222, 30, 39, 2, 252, 221, 30, 39, 2, 252, 220, - 30, 39, 2, 252, 219, 30, 39, 2, 252, 218, 30, 39, 2, 252, 217, 30, 39, 2, - 252, 216, 30, 39, 2, 252, 215, 30, 39, 2, 252, 214, 30, 39, 2, 252, 213, - 30, 39, 2, 252, 212, 30, 39, 2, 252, 211, 30, 39, 2, 252, 210, 30, 39, 2, - 252, 209, 30, 39, 2, 252, 208, 30, 39, 2, 252, 207, 30, 39, 2, 252, 206, - 30, 39, 2, 252, 205, 30, 39, 2, 252, 204, 30, 39, 2, 252, 203, 30, 39, 2, - 252, 202, 30, 39, 2, 252, 201, 30, 39, 2, 252, 200, 30, 39, 2, 252, 199, - 30, 39, 2, 252, 198, 63, 30, 39, 2, 252, 197, 250, 112, 30, 39, 2, 252, - 196, 240, 231, 30, 39, 2, 252, 195, 69, 30, 39, 2, 252, 194, 236, 49, 30, - 39, 2, 252, 193, 233, 15, 30, 39, 2, 252, 192, 225, 217, 30, 39, 2, 252, - 191, 225, 80, 30, 39, 2, 252, 190, 159, 30, 39, 2, 252, 189, 223, 87, 30, - 39, 2, 252, 188, 223, 86, 30, 39, 2, 252, 187, 223, 85, 30, 39, 2, 252, - 186, 223, 84, 30, 39, 2, 252, 185, 197, 199, 30, 39, 2, 252, 184, 196, - 222, 30, 39, 2, 252, 183, 196, 148, 30, 39, 2, 252, 182, 214, 124, 30, - 39, 2, 252, 181, 252, 31, 30, 39, 2, 252, 180, 249, 46, 30, 39, 2, 252, - 179, 240, 43, 30, 39, 2, 252, 178, 236, 57, 30, 39, 2, 252, 177, 225, - 193, 30, 39, 2, 252, 176, 30, 39, 2, 252, 175, 30, 39, 2, 252, 174, 30, - 39, 2, 252, 173, 30, 39, 2, 252, 172, 30, 39, 2, 252, 171, 30, 39, 2, - 252, 170, 30, 39, 2, 252, 169, 240, 238, 5, 63, 240, 238, 5, 69, 240, - 238, 5, 68, 240, 238, 5, 72, 240, 238, 5, 66, 240, 238, 5, 225, 214, 240, - 238, 5, 225, 129, 240, 238, 5, 155, 240, 238, 5, 224, 209, 240, 238, 5, - 224, 101, 240, 238, 5, 224, 11, 240, 238, 5, 223, 187, 240, 238, 5, 172, - 240, 238, 5, 222, 197, 240, 238, 5, 222, 109, 240, 238, 5, 222, 7, 240, - 238, 5, 221, 191, 240, 238, 5, 166, 240, 238, 5, 219, 207, 240, 238, 5, - 219, 78, 240, 238, 5, 218, 251, 240, 238, 5, 218, 145, 240, 238, 5, 176, - 240, 238, 5, 217, 118, 240, 238, 5, 216, 223, 240, 238, 5, 216, 50, 240, - 238, 5, 215, 186, 240, 238, 5, 161, 240, 238, 5, 213, 92, 240, 238, 5, - 212, 220, 240, 238, 5, 212, 117, 240, 238, 5, 211, 227, 240, 238, 5, 169, - 240, 238, 5, 210, 183, 240, 238, 5, 210, 72, 240, 238, 5, 209, 232, 240, - 238, 5, 209, 140, 240, 238, 5, 183, 240, 238, 5, 208, 147, 240, 238, 5, - 206, 112, 240, 238, 5, 205, 200, 240, 238, 5, 204, 172, 240, 238, 5, 189, - 240, 238, 5, 203, 68, 240, 238, 5, 202, 122, 240, 238, 5, 149, 240, 238, - 5, 201, 40, 240, 238, 5, 197, 166, 240, 238, 5, 197, 109, 240, 238, 5, - 197, 70, 240, 238, 5, 197, 34, 240, 238, 5, 196, 208, 240, 238, 5, 196, - 202, 240, 238, 5, 195, 115, 240, 238, 5, 195, 11, 226, 88, 250, 255, 1, - 251, 162, 226, 88, 250, 255, 1, 248, 205, 226, 88, 250, 255, 1, 233, 177, - 226, 88, 250, 255, 1, 240, 100, 226, 88, 250, 255, 1, 232, 147, 226, 88, - 250, 255, 1, 197, 117, 226, 88, 250, 255, 1, 195, 92, 226, 88, 250, 255, - 1, 232, 87, 226, 88, 250, 255, 1, 202, 253, 226, 88, 250, 255, 1, 195, - 240, 226, 88, 250, 255, 1, 225, 5, 226, 88, 250, 255, 1, 222, 240, 226, - 88, 250, 255, 1, 219, 171, 226, 88, 250, 255, 1, 215, 138, 226, 88, 250, - 255, 1, 208, 225, 226, 88, 250, 255, 1, 250, 117, 226, 88, 250, 255, 1, - 213, 92, 226, 88, 250, 255, 1, 209, 5, 226, 88, 250, 255, 1, 211, 101, - 226, 88, 250, 255, 1, 210, 109, 226, 88, 250, 255, 1, 206, 211, 226, 88, - 250, 255, 1, 203, 82, 226, 88, 250, 255, 208, 133, 55, 226, 88, 250, 255, - 31, 100, 226, 88, 250, 255, 31, 102, 226, 88, 250, 255, 31, 134, 226, 88, - 250, 255, 31, 203, 23, 226, 88, 250, 255, 31, 200, 234, 226, 88, 250, - 255, 31, 97, 231, 57, 226, 88, 250, 255, 31, 97, 170, 226, 88, 250, 255, - 31, 203, 24, 170, 213, 204, 1, 251, 162, 213, 204, 1, 248, 205, 213, 204, - 1, 233, 177, 213, 204, 1, 240, 100, 213, 204, 1, 232, 147, 213, 204, 1, - 197, 117, 213, 204, 1, 195, 92, 213, 204, 1, 232, 87, 213, 204, 1, 202, - 253, 213, 204, 1, 195, 240, 213, 204, 1, 225, 5, 213, 204, 1, 222, 240, - 213, 204, 1, 219, 171, 213, 204, 1, 48, 215, 138, 213, 204, 1, 215, 138, - 213, 204, 1, 208, 225, 213, 204, 1, 250, 117, 213, 204, 1, 213, 92, 213, - 204, 1, 209, 5, 213, 204, 1, 211, 101, 213, 204, 1, 210, 109, 213, 204, - 1, 206, 211, 213, 204, 1, 203, 82, 213, 204, 222, 179, 235, 77, 213, 204, - 210, 17, 235, 77, 213, 204, 31, 100, 213, 204, 31, 102, 213, 204, 31, - 134, 213, 204, 31, 136, 213, 204, 31, 146, 213, 204, 31, 203, 23, 213, - 204, 31, 200, 234, 217, 240, 1, 48, 251, 162, 217, 240, 1, 251, 162, 217, - 240, 1, 48, 248, 205, 217, 240, 1, 248, 205, 217, 240, 1, 233, 177, 217, - 240, 1, 240, 100, 217, 240, 1, 48, 232, 147, 217, 240, 1, 232, 147, 217, - 240, 1, 197, 117, 217, 240, 1, 195, 92, 217, 240, 1, 232, 87, 217, 240, - 1, 202, 253, 217, 240, 1, 48, 195, 240, 217, 240, 1, 195, 240, 217, 240, - 1, 48, 225, 5, 217, 240, 1, 225, 5, 217, 240, 1, 48, 222, 240, 217, 240, - 1, 222, 240, 217, 240, 1, 48, 219, 171, 217, 240, 1, 219, 171, 217, 240, - 1, 48, 215, 138, 217, 240, 1, 215, 138, 217, 240, 1, 208, 225, 217, 240, - 1, 250, 117, 217, 240, 1, 213, 92, 217, 240, 1, 209, 5, 217, 240, 1, 211, - 101, 217, 240, 1, 210, 109, 217, 240, 1, 48, 206, 211, 217, 240, 1, 206, - 211, 217, 240, 1, 203, 82, 217, 240, 31, 100, 217, 240, 31, 102, 217, - 240, 31, 134, 217, 240, 31, 136, 217, 240, 241, 47, 31, 136, 217, 240, - 31, 146, 217, 240, 31, 203, 23, 217, 240, 31, 200, 234, 217, 240, 31, 97, - 231, 57, 232, 160, 1, 251, 162, 232, 160, 1, 248, 205, 232, 160, 1, 233, - 177, 232, 160, 1, 240, 99, 232, 160, 1, 232, 147, 232, 160, 1, 197, 117, - 232, 160, 1, 195, 90, 232, 160, 1, 232, 87, 232, 160, 1, 202, 253, 232, - 160, 1, 195, 240, 232, 160, 1, 225, 5, 232, 160, 1, 222, 240, 232, 160, - 1, 219, 171, 232, 160, 1, 215, 138, 232, 160, 1, 208, 225, 232, 160, 1, - 250, 115, 232, 160, 1, 213, 92, 232, 160, 1, 209, 5, 232, 160, 1, 211, - 101, 232, 160, 1, 206, 211, 232, 160, 1, 203, 82, 232, 160, 31, 100, 232, - 160, 31, 146, 232, 160, 31, 203, 23, 232, 160, 31, 200, 234, 232, 160, - 31, 97, 231, 57, 212, 232, 1, 251, 159, 212, 232, 1, 248, 208, 212, 232, - 1, 234, 96, 212, 232, 1, 239, 214, 212, 232, 1, 232, 147, 212, 232, 1, - 197, 124, 212, 232, 1, 195, 108, 212, 232, 1, 232, 89, 212, 232, 1, 203, - 1, 212, 232, 1, 195, 241, 212, 232, 1, 225, 35, 212, 232, 1, 222, 246, - 212, 232, 1, 219, 171, 212, 232, 1, 215, 138, 212, 232, 1, 207, 99, 212, - 232, 1, 251, 194, 212, 232, 1, 213, 92, 212, 232, 1, 209, 7, 212, 232, 1, - 211, 106, 212, 232, 1, 209, 196, 212, 232, 1, 206, 211, 212, 232, 1, 203, - 89, 212, 232, 31, 100, 212, 232, 31, 203, 23, 212, 232, 31, 200, 234, - 212, 232, 31, 97, 231, 57, 212, 232, 31, 102, 212, 232, 31, 134, 212, - 232, 197, 9, 207, 90, 221, 148, 1, 63, 221, 148, 1, 250, 112, 221, 148, - 1, 234, 190, 221, 148, 1, 240, 231, 221, 148, 1, 69, 221, 148, 1, 199, - 230, 221, 148, 1, 68, 221, 148, 1, 196, 148, 221, 148, 1, 225, 80, 221, - 148, 1, 159, 221, 148, 1, 221, 136, 221, 148, 1, 218, 55, 221, 148, 1, - 72, 221, 148, 1, 144, 221, 148, 1, 205, 83, 221, 148, 1, 203, 216, 221, - 148, 1, 66, 221, 148, 1, 236, 49, 221, 148, 1, 211, 167, 221, 148, 1, - 209, 80, 221, 148, 1, 201, 81, 221, 148, 1, 251, 106, 221, 148, 1, 236, - 230, 221, 148, 1, 221, 151, 221, 148, 1, 216, 87, 221, 148, 1, 247, 207, - 221, 148, 201, 177, 78, 140, 232, 57, 1, 63, 140, 232, 57, 1, 69, 140, - 232, 57, 1, 68, 140, 232, 57, 1, 72, 140, 232, 57, 1, 164, 140, 232, 57, - 1, 197, 166, 140, 232, 57, 1, 249, 145, 140, 232, 57, 1, 249, 144, 140, - 232, 57, 1, 161, 140, 232, 57, 1, 166, 140, 232, 57, 1, 176, 140, 232, - 57, 1, 217, 255, 140, 232, 57, 1, 217, 118, 140, 232, 57, 1, 217, 116, - 140, 232, 57, 1, 169, 140, 232, 57, 1, 210, 250, 140, 232, 57, 1, 172, - 140, 232, 57, 1, 224, 146, 140, 232, 57, 1, 232, 80, 140, 232, 57, 1, - 183, 140, 232, 57, 1, 209, 21, 140, 232, 57, 1, 208, 147, 140, 232, 57, - 1, 155, 140, 232, 57, 1, 211, 159, 140, 232, 57, 1, 189, 140, 232, 57, 1, - 203, 167, 140, 232, 57, 1, 203, 68, 140, 232, 57, 1, 203, 66, 140, 232, - 57, 1, 149, 140, 232, 57, 1, 240, 136, 140, 232, 57, 16, 199, 28, 140, - 232, 57, 16, 199, 27, 140, 241, 13, 1, 63, 140, 241, 13, 1, 69, 140, 241, - 13, 1, 68, 140, 241, 13, 1, 72, 140, 241, 13, 1, 164, 140, 241, 13, 1, - 197, 166, 140, 241, 13, 1, 249, 145, 140, 241, 13, 1, 161, 140, 241, 13, - 1, 166, 140, 241, 13, 1, 176, 140, 241, 13, 1, 217, 118, 140, 241, 13, 1, - 169, 140, 241, 13, 1, 172, 140, 241, 13, 1, 224, 146, 140, 241, 13, 1, - 232, 80, 140, 241, 13, 1, 183, 140, 241, 13, 1, 250, 251, 183, 140, 241, - 13, 1, 208, 147, 140, 241, 13, 1, 155, 140, 241, 13, 1, 211, 159, 140, - 241, 13, 1, 189, 140, 241, 13, 1, 203, 68, 140, 241, 13, 1, 149, 140, - 241, 13, 1, 240, 136, 140, 241, 13, 191, 236, 253, 200, 241, 140, 241, - 13, 191, 97, 232, 225, 140, 241, 13, 221, 248, 209, 238, 140, 241, 13, - 221, 248, 226, 93, 140, 241, 13, 31, 100, 140, 241, 13, 31, 102, 140, - 241, 13, 31, 134, 140, 241, 13, 31, 136, 140, 241, 13, 31, 146, 140, 241, - 13, 31, 167, 140, 241, 13, 31, 178, 140, 241, 13, 31, 171, 140, 241, 13, - 31, 182, 140, 241, 13, 31, 203, 23, 140, 241, 13, 31, 200, 234, 140, 241, - 13, 31, 202, 177, 140, 241, 13, 31, 235, 14, 140, 241, 13, 31, 235, 145, - 140, 241, 13, 31, 206, 13, 140, 241, 13, 31, 207, 65, 140, 241, 13, 31, - 97, 231, 57, 140, 241, 13, 31, 99, 231, 57, 140, 241, 13, 31, 115, 231, - 57, 140, 241, 13, 31, 235, 7, 231, 57, 140, 241, 13, 31, 235, 101, 231, - 57, 140, 241, 13, 31, 206, 29, 231, 57, 140, 241, 13, 31, 207, 71, 231, - 57, 140, 241, 13, 31, 237, 31, 231, 57, 140, 241, 13, 31, 216, 179, 231, - 57, 140, 241, 13, 31, 97, 170, 140, 241, 13, 31, 99, 170, 140, 241, 13, - 31, 115, 170, 140, 241, 13, 31, 235, 7, 170, 140, 241, 13, 31, 235, 101, - 170, 140, 241, 13, 31, 206, 29, 170, 140, 241, 13, 31, 207, 71, 170, 140, - 241, 13, 31, 237, 31, 170, 140, 241, 13, 31, 216, 179, 170, 140, 241, 13, - 31, 203, 24, 170, 140, 241, 13, 31, 200, 235, 170, 140, 241, 13, 31, 202, - 178, 170, 140, 241, 13, 31, 235, 15, 170, 140, 241, 13, 31, 235, 146, - 170, 140, 241, 13, 31, 206, 14, 170, 140, 241, 13, 31, 207, 66, 170, 140, - 241, 13, 31, 237, 21, 170, 140, 241, 13, 31, 216, 175, 170, 140, 241, 13, - 31, 97, 231, 58, 170, 140, 241, 13, 31, 99, 231, 58, 170, 140, 241, 13, - 31, 115, 231, 58, 170, 140, 241, 13, 31, 235, 7, 231, 58, 170, 140, 241, - 13, 31, 235, 101, 231, 58, 170, 140, 241, 13, 31, 206, 29, 231, 58, 170, - 140, 241, 13, 31, 207, 71, 231, 58, 170, 140, 241, 13, 31, 237, 31, 231, - 58, 170, 140, 241, 13, 31, 216, 179, 231, 58, 170, 140, 241, 13, 191, 97, - 200, 242, 140, 241, 13, 191, 99, 200, 241, 140, 241, 13, 191, 115, 200, - 241, 140, 241, 13, 191, 235, 7, 200, 241, 140, 241, 13, 191, 235, 101, - 200, 241, 140, 241, 13, 191, 206, 29, 200, 241, 140, 241, 13, 191, 207, - 71, 200, 241, 140, 241, 13, 191, 237, 31, 200, 241, 140, 241, 13, 191, - 216, 179, 200, 241, 140, 241, 13, 191, 203, 24, 200, 241, 224, 133, 1, - 63, 224, 133, 18, 2, 68, 224, 133, 18, 2, 66, 224, 133, 18, 2, 110, 144, - 224, 133, 18, 2, 69, 224, 133, 18, 2, 72, 224, 133, 18, 222, 158, 78, - 224, 133, 2, 52, 210, 3, 60, 224, 133, 2, 251, 51, 224, 133, 2, 199, 2, - 224, 133, 1, 155, 224, 133, 1, 224, 146, 224, 133, 1, 234, 123, 224, 133, - 1, 233, 230, 224, 133, 1, 247, 174, 224, 133, 1, 247, 16, 224, 133, 1, - 225, 214, 224, 133, 1, 215, 109, 224, 133, 1, 201, 78, 224, 133, 1, 201, - 66, 224, 133, 1, 240, 41, 224, 133, 1, 240, 25, 224, 133, 1, 216, 86, - 224, 133, 1, 189, 224, 133, 1, 202, 233, 224, 133, 1, 240, 136, 224, 133, - 1, 239, 176, 224, 133, 1, 176, 224, 133, 1, 161, 224, 133, 1, 213, 6, - 224, 133, 1, 249, 145, 224, 133, 1, 248, 197, 224, 133, 1, 166, 224, 133, - 1, 164, 224, 133, 1, 169, 224, 133, 1, 172, 224, 133, 1, 199, 152, 224, - 133, 1, 207, 50, 224, 133, 1, 205, 80, 224, 133, 1, 183, 224, 133, 1, - 195, 115, 224, 133, 1, 142, 224, 133, 1, 224, 36, 224, 133, 1, 201, 46, - 224, 133, 1, 201, 47, 224, 133, 1, 199, 35, 224, 133, 2, 249, 80, 57, - 224, 133, 2, 247, 88, 224, 133, 2, 76, 60, 224, 133, 199, 7, 224, 133, - 17, 100, 224, 133, 17, 102, 224, 133, 17, 134, 224, 133, 17, 136, 224, - 133, 31, 203, 23, 224, 133, 31, 200, 234, 224, 133, 31, 97, 231, 57, 224, - 133, 31, 97, 170, 224, 133, 191, 97, 232, 225, 224, 133, 211, 214, 238, - 253, 224, 133, 211, 214, 4, 244, 249, 224, 133, 211, 214, 244, 249, 224, - 133, 211, 214, 241, 72, 154, 224, 133, 211, 214, 220, 55, 224, 133, 211, - 214, 221, 213, 224, 133, 211, 214, 240, 88, 224, 133, 211, 214, 52, 240, - 88, 224, 133, 211, 214, 222, 69, 37, 205, 159, 251, 10, 1, 232, 147, 37, - 205, 159, 251, 10, 1, 222, 240, 37, 205, 159, 251, 10, 1, 232, 87, 37, - 205, 159, 251, 10, 1, 219, 171, 37, 205, 159, 251, 10, 1, 211, 101, 37, - 205, 159, 251, 10, 1, 197, 117, 37, 205, 159, 251, 10, 1, 206, 211, 37, - 205, 159, 251, 10, 1, 210, 109, 37, 205, 159, 251, 10, 1, 248, 205, 37, - 205, 159, 251, 10, 1, 203, 82, 37, 205, 159, 251, 10, 1, 208, 199, 37, - 205, 159, 251, 10, 1, 225, 5, 37, 205, 159, 251, 10, 1, 215, 138, 37, - 205, 159, 251, 10, 1, 224, 128, 37, 205, 159, 251, 10, 1, 209, 5, 37, - 205, 159, 251, 10, 1, 208, 225, 37, 205, 159, 251, 10, 1, 235, 189, 37, - 205, 159, 251, 10, 1, 251, 164, 37, 205, 159, 251, 10, 1, 250, 115, 37, - 205, 159, 251, 10, 1, 239, 173, 37, 205, 159, 251, 10, 1, 233, 177, 37, - 205, 159, 251, 10, 1, 240, 100, 37, 205, 159, 251, 10, 1, 233, 218, 37, - 205, 159, 251, 10, 1, 202, 253, 37, 205, 159, 251, 10, 1, 195, 90, 37, - 205, 159, 251, 10, 1, 239, 170, 37, 205, 159, 251, 10, 1, 195, 240, 37, - 205, 159, 251, 10, 1, 202, 219, 37, 205, 159, 251, 10, 1, 202, 198, 37, - 205, 159, 251, 10, 31, 100, 37, 205, 159, 251, 10, 31, 235, 145, 37, 205, - 159, 251, 10, 156, 226, 68, 37, 173, 251, 10, 1, 232, 113, 37, 173, 251, - 10, 1, 222, 249, 37, 173, 251, 10, 1, 232, 236, 37, 173, 251, 10, 1, 219, - 185, 37, 173, 251, 10, 1, 211, 152, 37, 173, 251, 10, 1, 197, 117, 37, - 173, 251, 10, 1, 236, 149, 37, 173, 251, 10, 1, 210, 142, 37, 173, 251, - 10, 1, 248, 239, 37, 173, 251, 10, 1, 203, 41, 37, 173, 251, 10, 1, 236, - 150, 37, 173, 251, 10, 1, 225, 35, 37, 173, 251, 10, 1, 216, 31, 37, 173, - 251, 10, 1, 224, 142, 37, 173, 251, 10, 1, 209, 8, 37, 173, 251, 10, 1, - 236, 148, 37, 173, 251, 10, 1, 235, 176, 37, 173, 251, 10, 1, 251, 164, - 37, 173, 251, 10, 1, 251, 194, 37, 173, 251, 10, 1, 240, 130, 37, 173, - 251, 10, 1, 234, 39, 37, 173, 251, 10, 1, 240, 107, 37, 173, 251, 10, 1, - 233, 225, 37, 173, 251, 10, 1, 203, 139, 37, 173, 251, 10, 1, 195, 106, - 37, 173, 251, 10, 1, 202, 225, 37, 173, 251, 10, 1, 196, 64, 37, 173, - 251, 10, 1, 202, 213, 37, 173, 251, 10, 1, 195, 109, 37, 173, 251, 10, - 31, 100, 37, 173, 251, 10, 31, 203, 23, 37, 173, 251, 10, 31, 200, 234, - 220, 53, 1, 251, 162, 220, 53, 1, 248, 205, 220, 53, 1, 248, 190, 220, - 53, 1, 233, 177, 220, 53, 1, 233, 203, 220, 53, 1, 240, 100, 220, 53, 1, - 232, 147, 220, 53, 1, 197, 117, 220, 53, 2, 200, 104, 220, 53, 1, 195, - 92, 220, 53, 1, 195, 67, 220, 53, 1, 225, 195, 220, 53, 1, 225, 176, 220, - 53, 1, 232, 87, 220, 53, 1, 202, 253, 220, 53, 1, 195, 240, 220, 53, 1, - 225, 5, 220, 53, 1, 196, 205, 220, 53, 1, 224, 135, 220, 53, 1, 222, 240, - 220, 53, 1, 239, 169, 220, 53, 1, 202, 224, 220, 53, 1, 219, 171, 220, - 53, 1, 215, 138, 220, 53, 1, 208, 225, 220, 53, 1, 250, 117, 220, 53, 1, - 252, 120, 220, 53, 1, 213, 92, 220, 53, 1, 235, 189, 220, 53, 1, 209, 5, - 220, 53, 1, 211, 101, 220, 53, 1, 196, 182, 220, 53, 1, 211, 128, 220, - 53, 1, 210, 109, 220, 53, 1, 206, 211, 220, 53, 1, 205, 48, 220, 53, 1, - 203, 82, 220, 53, 252, 30, 117, 57, 220, 53, 252, 30, 117, 60, 220, 53, - 31, 100, 220, 53, 31, 146, 220, 53, 31, 203, 23, 220, 53, 31, 200, 234, - 220, 53, 31, 97, 231, 57, 220, 53, 211, 214, 205, 7, 220, 53, 211, 214, - 235, 77, 220, 53, 211, 214, 52, 76, 197, 39, 238, 253, 220, 53, 211, 214, - 76, 197, 39, 238, 253, 220, 53, 211, 214, 238, 253, 220, 53, 211, 214, - 99, 238, 250, 220, 53, 211, 214, 222, 76, 235, 134, 250, 129, 1, 63, 250, - 129, 1, 252, 168, 250, 129, 1, 251, 49, 250, 129, 1, 252, 126, 250, 129, - 1, 251, 106, 250, 129, 1, 252, 128, 250, 129, 1, 251, 245, 250, 129, 1, - 251, 241, 250, 129, 1, 69, 250, 129, 1, 237, 54, 250, 129, 1, 72, 250, - 129, 1, 214, 102, 250, 129, 1, 68, 250, 129, 1, 226, 120, 250, 129, 1, - 66, 250, 129, 1, 199, 245, 250, 129, 1, 224, 209, 250, 129, 1, 196, 202, - 250, 129, 1, 196, 162, 250, 129, 1, 196, 173, 250, 129, 1, 234, 48, 250, - 129, 1, 234, 5, 250, 129, 1, 233, 216, 250, 129, 1, 247, 57, 250, 129, 1, - 225, 193, 250, 129, 1, 203, 68, 250, 129, 1, 202, 217, 250, 129, 1, 239, - 252, 250, 129, 1, 239, 167, 250, 129, 1, 201, 73, 250, 129, 1, 213, 92, - 250, 129, 1, 235, 189, 250, 129, 1, 249, 9, 250, 129, 1, 248, 192, 250, - 129, 1, 217, 58, 250, 129, 1, 216, 229, 250, 129, 1, 216, 230, 250, 129, - 1, 217, 118, 250, 129, 1, 215, 98, 250, 129, 1, 216, 81, 250, 129, 1, - 219, 207, 250, 129, 1, 231, 243, 250, 129, 1, 195, 165, 250, 129, 1, 196, - 69, 250, 129, 1, 199, 118, 250, 129, 1, 210, 183, 250, 129, 1, 222, 197, - 250, 129, 1, 208, 147, 250, 129, 1, 195, 88, 250, 129, 1, 206, 255, 250, - 129, 1, 195, 65, 250, 129, 1, 206, 119, 250, 129, 1, 205, 49, 250, 129, - 1, 232, 147, 250, 129, 252, 30, 78, 202, 70, 99, 238, 251, 127, 97, 76, - 211, 213, 4, 99, 238, 251, 127, 97, 76, 211, 213, 222, 228, 99, 238, 251, - 127, 97, 76, 211, 213, 222, 228, 97, 76, 127, 99, 238, 251, 211, 213, - 222, 228, 99, 209, 255, 127, 97, 210, 3, 211, 213, 222, 228, 97, 210, 3, - 127, 99, 209, 255, 211, 213, 226, 46, 213, 133, 1, 251, 162, 226, 46, - 213, 133, 1, 248, 205, 226, 46, 213, 133, 1, 233, 177, 226, 46, 213, 133, - 1, 240, 100, 226, 46, 213, 133, 1, 232, 147, 226, 46, 213, 133, 1, 197, - 117, 226, 46, 213, 133, 1, 195, 92, 226, 46, 213, 133, 1, 232, 87, 226, - 46, 213, 133, 1, 202, 253, 226, 46, 213, 133, 1, 195, 240, 226, 46, 213, - 133, 1, 225, 5, 226, 46, 213, 133, 1, 222, 240, 226, 46, 213, 133, 1, - 219, 171, 226, 46, 213, 133, 1, 215, 138, 226, 46, 213, 133, 1, 208, 225, - 226, 46, 213, 133, 1, 250, 117, 226, 46, 213, 133, 1, 213, 92, 226, 46, - 213, 133, 1, 209, 5, 226, 46, 213, 133, 1, 211, 101, 226, 46, 213, 133, - 1, 210, 109, 226, 46, 213, 133, 1, 206, 211, 226, 46, 213, 133, 1, 203, - 82, 226, 46, 213, 133, 31, 100, 226, 46, 213, 133, 31, 102, 226, 46, 213, - 133, 31, 134, 226, 46, 213, 133, 31, 136, 226, 46, 213, 133, 31, 203, 23, - 226, 46, 213, 133, 31, 200, 234, 226, 46, 213, 133, 31, 97, 231, 57, 226, - 46, 213, 133, 31, 97, 170, 226, 46, 213, 222, 1, 251, 162, 226, 46, 213, - 222, 1, 248, 205, 226, 46, 213, 222, 1, 233, 177, 226, 46, 213, 222, 1, - 240, 100, 226, 46, 213, 222, 1, 232, 147, 226, 46, 213, 222, 1, 197, 116, - 226, 46, 213, 222, 1, 195, 92, 226, 46, 213, 222, 1, 232, 87, 226, 46, - 213, 222, 1, 202, 253, 226, 46, 213, 222, 1, 195, 240, 226, 46, 213, 222, - 1, 225, 5, 226, 46, 213, 222, 1, 222, 240, 226, 46, 213, 222, 1, 219, - 170, 226, 46, 213, 222, 1, 215, 138, 226, 46, 213, 222, 1, 208, 225, 226, - 46, 213, 222, 1, 213, 92, 226, 46, 213, 222, 1, 209, 5, 226, 46, 213, - 222, 1, 206, 211, 226, 46, 213, 222, 1, 203, 82, 226, 46, 213, 222, 31, - 100, 226, 46, 213, 222, 31, 102, 226, 46, 213, 222, 31, 134, 226, 46, - 213, 222, 31, 136, 226, 46, 213, 222, 31, 203, 23, 226, 46, 213, 222, 31, - 200, 234, 226, 46, 213, 222, 31, 97, 231, 57, 226, 46, 213, 222, 31, 97, - 170, 211, 239, 213, 222, 1, 251, 162, 211, 239, 213, 222, 1, 248, 205, - 211, 239, 213, 222, 1, 233, 177, 211, 239, 213, 222, 1, 240, 100, 211, - 239, 213, 222, 1, 232, 147, 211, 239, 213, 222, 1, 197, 116, 211, 239, - 213, 222, 1, 195, 92, 211, 239, 213, 222, 1, 232, 87, 211, 239, 213, 222, - 1, 195, 240, 211, 239, 213, 222, 1, 225, 5, 211, 239, 213, 222, 1, 222, - 240, 211, 239, 213, 222, 1, 219, 170, 211, 239, 213, 222, 1, 215, 138, - 211, 239, 213, 222, 1, 208, 225, 211, 239, 213, 222, 1, 213, 92, 211, - 239, 213, 222, 1, 209, 5, 211, 239, 213, 222, 1, 206, 211, 211, 239, 213, - 222, 1, 203, 82, 211, 239, 213, 222, 208, 133, 78, 211, 239, 213, 222, - 163, 208, 133, 78, 211, 239, 213, 222, 235, 7, 238, 251, 3, 241, 61, 211, - 239, 213, 222, 235, 7, 238, 251, 3, 238, 253, 211, 239, 213, 222, 31, - 100, 211, 239, 213, 222, 31, 102, 211, 239, 213, 222, 31, 134, 211, 239, - 213, 222, 31, 136, 211, 239, 213, 222, 31, 203, 23, 211, 239, 213, 222, - 31, 200, 234, 211, 239, 213, 222, 31, 97, 231, 57, 37, 201, 7, 1, 214, - 61, 63, 37, 201, 7, 1, 196, 57, 63, 37, 201, 7, 1, 196, 57, 251, 245, 37, - 201, 7, 1, 214, 61, 68, 37, 201, 7, 1, 196, 57, 68, 37, 201, 7, 1, 196, - 57, 69, 37, 201, 7, 1, 214, 61, 72, 37, 201, 7, 1, 214, 61, 214, 164, 37, - 201, 7, 1, 196, 57, 214, 164, 37, 201, 7, 1, 214, 61, 252, 117, 37, 201, - 7, 1, 196, 57, 252, 117, 37, 201, 7, 1, 214, 61, 251, 244, 37, 201, 7, 1, - 196, 57, 251, 244, 37, 201, 7, 1, 214, 61, 251, 217, 37, 201, 7, 1, 196, - 57, 251, 217, 37, 201, 7, 1, 214, 61, 251, 239, 37, 201, 7, 1, 196, 57, - 251, 239, 37, 201, 7, 1, 214, 61, 252, 6, 37, 201, 7, 1, 196, 57, 252, 6, - 37, 201, 7, 1, 214, 61, 251, 243, 37, 201, 7, 1, 214, 61, 236, 56, 37, - 201, 7, 1, 196, 57, 236, 56, 37, 201, 7, 1, 214, 61, 250, 122, 37, 201, - 7, 1, 196, 57, 250, 122, 37, 201, 7, 1, 214, 61, 251, 226, 37, 201, 7, 1, - 196, 57, 251, 226, 37, 201, 7, 1, 214, 61, 251, 237, 37, 201, 7, 1, 196, - 57, 251, 237, 37, 201, 7, 1, 214, 61, 214, 162, 37, 201, 7, 1, 196, 57, - 214, 162, 37, 201, 7, 1, 214, 61, 251, 173, 37, 201, 7, 1, 196, 57, 251, - 173, 37, 201, 7, 1, 214, 61, 251, 236, 37, 201, 7, 1, 214, 61, 236, 245, - 37, 201, 7, 1, 214, 61, 236, 241, 37, 201, 7, 1, 214, 61, 251, 106, 37, - 201, 7, 1, 214, 61, 251, 234, 37, 201, 7, 1, 196, 57, 251, 234, 37, 201, - 7, 1, 214, 61, 236, 207, 37, 201, 7, 1, 196, 57, 236, 207, 37, 201, 7, 1, - 214, 61, 236, 227, 37, 201, 7, 1, 196, 57, 236, 227, 37, 201, 7, 1, 214, - 61, 236, 193, 37, 201, 7, 1, 196, 57, 236, 193, 37, 201, 7, 1, 196, 57, - 251, 97, 37, 201, 7, 1, 214, 61, 236, 215, 37, 201, 7, 1, 196, 57, 251, - 233, 37, 201, 7, 1, 214, 61, 236, 183, 37, 201, 7, 1, 214, 61, 214, 93, - 37, 201, 7, 1, 214, 61, 230, 203, 37, 201, 7, 1, 214, 61, 237, 62, 37, - 201, 7, 1, 196, 57, 237, 62, 37, 201, 7, 1, 214, 61, 251, 18, 37, 201, 7, - 1, 196, 57, 251, 18, 37, 201, 7, 1, 214, 61, 226, 3, 37, 201, 7, 1, 196, - 57, 226, 3, 37, 201, 7, 1, 214, 61, 214, 74, 37, 201, 7, 1, 196, 57, 214, - 74, 37, 201, 7, 1, 214, 61, 251, 14, 37, 201, 7, 1, 196, 57, 251, 14, 37, - 201, 7, 1, 214, 61, 251, 232, 37, 201, 7, 1, 214, 61, 250, 202, 37, 201, - 7, 1, 214, 61, 251, 230, 37, 201, 7, 1, 214, 61, 250, 195, 37, 201, 7, 1, - 196, 57, 250, 195, 37, 201, 7, 1, 214, 61, 236, 141, 37, 201, 7, 1, 196, - 57, 236, 141, 37, 201, 7, 1, 214, 61, 250, 168, 37, 201, 7, 1, 196, 57, - 250, 168, 37, 201, 7, 1, 214, 61, 251, 227, 37, 201, 7, 1, 196, 57, 251, - 227, 37, 201, 7, 1, 214, 61, 214, 49, 37, 201, 7, 1, 214, 61, 249, 63, - 37, 160, 6, 1, 63, 37, 160, 6, 1, 252, 168, 37, 160, 6, 1, 237, 64, 37, - 160, 6, 1, 251, 118, 37, 160, 6, 1, 237, 62, 37, 160, 6, 1, 236, 227, 37, - 160, 6, 1, 237, 59, 37, 160, 6, 1, 237, 58, 37, 160, 6, 1, 251, 100, 37, - 160, 6, 1, 69, 37, 160, 6, 1, 244, 204, 69, 37, 160, 6, 1, 237, 54, 37, - 160, 6, 1, 237, 47, 37, 160, 6, 1, 237, 46, 37, 160, 6, 1, 237, 43, 37, - 160, 6, 1, 237, 40, 37, 160, 6, 1, 68, 37, 160, 6, 1, 226, 120, 37, 160, - 6, 1, 237, 17, 37, 160, 6, 1, 237, 14, 37, 160, 6, 1, 251, 181, 37, 160, - 6, 1, 200, 45, 37, 160, 6, 1, 237, 7, 37, 160, 6, 1, 236, 244, 37, 160, - 6, 1, 236, 241, 37, 160, 6, 1, 236, 230, 37, 160, 6, 1, 236, 193, 37, - 160, 6, 1, 72, 37, 160, 6, 1, 214, 102, 37, 160, 6, 1, 216, 186, 214, - 164, 37, 160, 6, 1, 209, 130, 214, 164, 37, 160, 6, 1, 214, 163, 37, 160, - 6, 1, 236, 183, 37, 160, 6, 1, 236, 235, 37, 160, 6, 1, 236, 163, 37, - 160, 6, 1, 206, 182, 236, 163, 37, 160, 6, 1, 236, 151, 37, 160, 6, 1, - 236, 130, 37, 160, 6, 1, 236, 128, 37, 160, 6, 1, 236, 207, 37, 160, 6, - 1, 236, 117, 37, 160, 6, 1, 237, 60, 37, 160, 6, 1, 66, 37, 160, 6, 1, - 199, 245, 37, 160, 6, 1, 216, 186, 200, 99, 37, 160, 6, 1, 209, 130, 200, - 99, 37, 160, 6, 1, 236, 104, 37, 160, 6, 1, 236, 56, 37, 160, 6, 1, 236, - 51, 37, 160, 6, 1, 236, 206, 55, 37, 160, 6, 1, 200, 4, 37, 160, 4, 1, - 63, 37, 160, 4, 1, 252, 168, 37, 160, 4, 1, 237, 64, 37, 160, 4, 1, 251, - 118, 37, 160, 4, 1, 237, 62, 37, 160, 4, 1, 236, 227, 37, 160, 4, 1, 237, - 59, 37, 160, 4, 1, 237, 58, 37, 160, 4, 1, 251, 100, 37, 160, 4, 1, 69, - 37, 160, 4, 1, 244, 204, 69, 37, 160, 4, 1, 237, 54, 37, 160, 4, 1, 237, - 47, 37, 160, 4, 1, 237, 46, 37, 160, 4, 1, 237, 43, 37, 160, 4, 1, 237, - 40, 37, 160, 4, 1, 68, 37, 160, 4, 1, 226, 120, 37, 160, 4, 1, 237, 17, - 37, 160, 4, 1, 237, 14, 37, 160, 4, 1, 251, 181, 37, 160, 4, 1, 200, 45, - 37, 160, 4, 1, 237, 7, 37, 160, 4, 1, 236, 244, 37, 160, 4, 1, 236, 241, - 37, 160, 4, 1, 236, 230, 37, 160, 4, 1, 236, 193, 37, 160, 4, 1, 72, 37, - 160, 4, 1, 214, 102, 37, 160, 4, 1, 216, 186, 214, 164, 37, 160, 4, 1, - 209, 130, 214, 164, 37, 160, 4, 1, 214, 163, 37, 160, 4, 1, 236, 183, 37, - 160, 4, 1, 236, 235, 37, 160, 4, 1, 236, 163, 37, 160, 4, 1, 206, 182, - 236, 163, 37, 160, 4, 1, 236, 151, 37, 160, 4, 1, 236, 130, 37, 160, 4, - 1, 236, 128, 37, 160, 4, 1, 236, 207, 37, 160, 4, 1, 236, 117, 37, 160, - 4, 1, 237, 60, 37, 160, 4, 1, 66, 37, 160, 4, 1, 199, 245, 37, 160, 4, 1, - 216, 186, 200, 99, 37, 160, 4, 1, 209, 130, 200, 99, 37, 160, 4, 1, 236, - 104, 37, 160, 4, 1, 236, 56, 37, 160, 4, 1, 236, 51, 37, 160, 4, 1, 236, - 206, 55, 37, 160, 4, 1, 200, 4, 37, 160, 31, 100, 37, 160, 31, 146, 37, - 160, 31, 203, 23, 37, 160, 31, 235, 145, 37, 160, 31, 97, 231, 57, 37, - 160, 31, 97, 170, 232, 180, 209, 214, 1, 63, 232, 180, 209, 214, 1, 249, - 145, 232, 180, 209, 214, 1, 161, 232, 180, 209, 214, 1, 189, 232, 180, - 209, 214, 1, 201, 78, 232, 180, 209, 214, 1, 225, 214, 232, 180, 209, - 214, 1, 247, 174, 232, 180, 209, 214, 1, 142, 232, 180, 209, 214, 1, 224, - 146, 232, 180, 209, 214, 1, 235, 239, 232, 180, 209, 214, 1, 240, 136, - 232, 180, 209, 214, 1, 240, 41, 232, 180, 209, 214, 1, 169, 232, 180, - 209, 214, 1, 209, 181, 232, 180, 209, 214, 1, 195, 115, 232, 180, 209, - 214, 1, 183, 232, 180, 209, 214, 1, 207, 50, 232, 180, 209, 214, 1, 155, - 232, 180, 209, 214, 1, 234, 123, 232, 180, 209, 214, 1, 172, 232, 180, - 209, 214, 1, 166, 232, 180, 209, 214, 1, 176, 232, 180, 209, 214, 1, 197, - 166, 232, 180, 209, 214, 1, 224, 72, 197, 166, 232, 180, 209, 214, 1, - 164, 232, 180, 209, 214, 1, 224, 72, 164, 232, 180, 209, 214, 1, 217, 71, - 232, 180, 209, 214, 1, 215, 109, 232, 180, 209, 214, 1, 199, 152, 232, - 180, 209, 214, 18, 63, 232, 180, 209, 214, 18, 68, 232, 180, 209, 214, - 18, 66, 232, 180, 209, 214, 18, 69, 232, 180, 209, 214, 18, 72, 232, 180, - 209, 214, 117, 208, 245, 232, 180, 209, 214, 117, 218, 1, 224, 113, 232, - 180, 209, 214, 2, 232, 174, 232, 180, 209, 214, 2, 203, 138, 232, 180, - 209, 214, 2, 203, 113, 232, 180, 209, 214, 2, 203, 95, 232, 180, 209, - 214, 17, 195, 79, 232, 180, 209, 214, 17, 100, 232, 180, 209, 214, 17, - 102, 232, 180, 209, 214, 17, 134, 232, 180, 209, 214, 17, 136, 232, 180, - 209, 214, 17, 146, 232, 180, 209, 214, 17, 167, 232, 180, 209, 214, 17, - 178, 232, 180, 209, 214, 17, 171, 232, 180, 209, 214, 17, 182, 209, 118, - 17, 100, 209, 118, 17, 102, 209, 118, 17, 134, 209, 118, 17, 136, 209, - 118, 17, 146, 209, 118, 17, 167, 209, 118, 17, 178, 209, 118, 17, 171, - 209, 118, 17, 182, 209, 118, 31, 203, 23, 209, 118, 31, 200, 234, 209, - 118, 31, 202, 177, 209, 118, 31, 235, 14, 209, 118, 31, 235, 145, 209, - 118, 31, 206, 13, 209, 118, 31, 207, 65, 209, 118, 31, 237, 20, 209, 118, - 31, 216, 174, 209, 118, 31, 97, 231, 57, 209, 118, 31, 99, 231, 57, 209, - 118, 31, 115, 231, 57, 209, 118, 31, 235, 7, 231, 57, 209, 118, 31, 235, - 101, 231, 57, 209, 118, 31, 206, 29, 231, 57, 209, 118, 31, 207, 71, 231, - 57, 209, 118, 31, 237, 31, 231, 57, 209, 118, 31, 216, 179, 231, 57, 209, - 118, 191, 97, 232, 225, 209, 118, 191, 97, 211, 87, 209, 118, 191, 97, - 202, 184, 209, 118, 191, 99, 202, 181, 37, 205, 182, 1, 251, 162, 37, - 205, 182, 1, 48, 251, 162, 37, 205, 182, 1, 248, 205, 37, 205, 182, 1, - 48, 248, 205, 37, 205, 182, 1, 233, 177, 37, 205, 182, 1, 232, 147, 37, - 205, 182, 1, 48, 232, 147, 37, 205, 182, 1, 197, 117, 37, 205, 182, 1, - 195, 92, 37, 205, 182, 1, 232, 87, 37, 205, 182, 1, 195, 240, 37, 205, - 182, 1, 225, 5, 37, 205, 182, 1, 222, 240, 37, 205, 182, 1, 219, 171, 37, - 205, 182, 1, 215, 138, 37, 205, 182, 1, 48, 215, 138, 37, 205, 182, 1, - 48, 215, 139, 3, 83, 203, 135, 37, 205, 182, 1, 208, 225, 37, 205, 182, - 1, 250, 117, 37, 205, 182, 1, 251, 131, 250, 117, 37, 205, 182, 1, 213, - 92, 37, 205, 182, 1, 209, 5, 37, 205, 182, 1, 48, 209, 5, 37, 205, 182, - 1, 48, 209, 6, 3, 83, 203, 135, 37, 205, 182, 1, 210, 107, 37, 205, 182, - 1, 206, 211, 37, 205, 182, 1, 203, 82, 37, 205, 182, 1, 48, 203, 82, 37, - 205, 182, 1, 48, 203, 83, 3, 83, 203, 135, 37, 205, 182, 31, 100, 37, - 205, 182, 31, 102, 37, 205, 182, 31, 134, 37, 205, 182, 31, 136, 37, 205, - 182, 31, 146, 37, 205, 182, 31, 203, 23, 37, 205, 182, 31, 200, 234, 37, - 205, 182, 31, 202, 177, 37, 205, 182, 31, 97, 231, 57, 37, 205, 182, 191, - 97, 232, 225, 37, 205, 182, 33, 250, 116, 205, 182, 1, 251, 162, 205, - 182, 1, 248, 205, 205, 182, 1, 233, 177, 205, 182, 1, 232, 147, 205, 182, - 1, 197, 117, 205, 182, 1, 195, 92, 205, 182, 1, 232, 87, 205, 182, 1, - 195, 240, 205, 182, 1, 225, 5, 205, 182, 1, 222, 240, 205, 182, 1, 219, - 171, 205, 182, 1, 215, 138, 205, 182, 1, 208, 225, 205, 182, 1, 250, 117, - 205, 182, 1, 213, 92, 205, 182, 1, 209, 5, 205, 182, 1, 210, 108, 205, - 182, 1, 206, 211, 205, 182, 1, 203, 82, 205, 182, 1, 235, 160, 205, 182, - 1, 222, 142, 205, 182, 226, 73, 206, 211, 205, 182, 38, 76, 60, 205, 182, - 38, 99, 238, 251, 60, 205, 182, 38, 76, 57, 205, 182, 38, 99, 238, 251, - 57, 205, 182, 38, 241, 12, 57, 205, 182, 38, 241, 12, 60, 205, 182, 38, - 231, 165, 57, 205, 182, 38, 231, 165, 60, 205, 182, 38, 181, 231, 165, - 60, 205, 182, 38, 210, 110, 60, 205, 182, 38, 204, 196, 60, 205, 182, 31, - 100, 205, 182, 31, 203, 23, 205, 182, 31, 200, 234, 205, 182, 31, 97, - 231, 57, 205, 182, 211, 214, 99, 83, 249, 68, 205, 182, 211, 214, 99, 83, - 249, 69, 3, 238, 250, 205, 182, 211, 214, 244, 250, 3, 238, 253, 205, - 182, 211, 214, 99, 244, 247, 3, 238, 250, 205, 182, 211, 214, 157, 244, - 250, 3, 238, 253, 236, 243, 1, 251, 162, 236, 243, 1, 248, 205, 236, 243, - 1, 233, 177, 236, 243, 1, 240, 100, 236, 243, 1, 232, 147, 236, 243, 1, - 197, 117, 236, 243, 1, 195, 92, 236, 243, 1, 232, 87, 236, 243, 1, 202, - 253, 236, 243, 1, 195, 240, 236, 243, 1, 225, 5, 236, 243, 1, 222, 240, - 236, 243, 1, 219, 171, 236, 243, 1, 215, 138, 236, 243, 1, 208, 225, 236, - 243, 1, 250, 117, 236, 243, 1, 213, 92, 236, 243, 1, 209, 5, 236, 243, 1, - 211, 101, 236, 243, 1, 210, 109, 236, 243, 1, 206, 211, 236, 243, 1, 203, - 82, 236, 243, 33, 195, 91, 158, 2, 247, 133, 158, 2, 251, 51, 158, 2, - 199, 2, 158, 2, 225, 165, 158, 2, 200, 34, 158, 1, 63, 158, 1, 252, 168, - 158, 1, 68, 158, 1, 226, 120, 158, 1, 66, 158, 1, 199, 245, 158, 1, 110, - 144, 158, 1, 110, 209, 182, 158, 1, 110, 159, 158, 1, 110, 222, 38, 158, - 1, 69, 158, 1, 251, 200, 158, 1, 72, 158, 1, 250, 150, 158, 1, 155, 158, - 1, 224, 146, 158, 1, 234, 123, 158, 1, 233, 230, 158, 1, 217, 71, 158, 1, - 247, 174, 158, 1, 247, 16, 158, 1, 225, 214, 158, 1, 225, 180, 158, 1, - 215, 109, 158, 1, 201, 78, 158, 1, 201, 66, 158, 1, 240, 41, 158, 1, 240, - 25, 158, 1, 216, 86, 158, 1, 189, 158, 1, 202, 233, 158, 1, 240, 136, - 158, 1, 239, 176, 158, 1, 176, 158, 1, 161, 158, 1, 213, 6, 158, 1, 249, - 145, 158, 1, 248, 197, 158, 1, 166, 158, 1, 164, 158, 1, 169, 158, 1, - 172, 158, 1, 199, 152, 158, 1, 207, 50, 158, 1, 205, 80, 158, 1, 183, - 158, 1, 142, 158, 1, 222, 37, 158, 1, 37, 42, 222, 26, 158, 1, 37, 42, - 209, 181, 158, 1, 37, 42, 216, 68, 158, 18, 2, 252, 168, 158, 18, 2, 248, - 193, 252, 168, 158, 18, 2, 68, 158, 18, 2, 226, 120, 158, 18, 2, 66, 158, - 18, 2, 199, 245, 158, 18, 2, 110, 144, 158, 18, 2, 110, 209, 182, 158, - 18, 2, 110, 159, 158, 18, 2, 110, 222, 38, 158, 18, 2, 69, 158, 18, 2, - 251, 200, 158, 18, 2, 72, 158, 18, 2, 250, 150, 158, 199, 7, 158, 240, - 88, 158, 52, 240, 88, 158, 211, 214, 238, 253, 158, 211, 214, 52, 238, - 253, 158, 211, 214, 222, 75, 158, 211, 214, 241, 72, 154, 158, 211, 214, - 221, 213, 158, 31, 100, 158, 31, 102, 158, 31, 134, 158, 31, 136, 158, - 31, 146, 158, 31, 167, 158, 31, 178, 158, 31, 171, 158, 31, 182, 158, 31, - 203, 23, 158, 31, 200, 234, 158, 31, 202, 177, 158, 31, 235, 14, 158, 31, - 235, 145, 158, 31, 206, 13, 158, 31, 207, 65, 158, 31, 237, 20, 158, 31, - 216, 174, 158, 31, 97, 231, 57, 158, 31, 97, 170, 158, 17, 195, 79, 158, - 17, 100, 158, 17, 102, 158, 17, 134, 158, 17, 136, 158, 17, 146, 158, 17, - 167, 158, 17, 178, 158, 17, 171, 158, 17, 182, 158, 31, 225, 124, 225, - 28, 2, 247, 133, 225, 28, 2, 251, 51, 225, 28, 2, 199, 2, 225, 28, 1, 63, - 225, 28, 1, 252, 168, 225, 28, 1, 68, 225, 28, 1, 226, 120, 225, 28, 1, - 66, 225, 28, 1, 199, 245, 225, 28, 1, 69, 225, 28, 1, 251, 200, 225, 28, - 1, 72, 225, 28, 1, 250, 150, 225, 28, 1, 155, 225, 28, 1, 224, 146, 225, - 28, 1, 234, 123, 225, 28, 1, 233, 230, 225, 28, 1, 217, 71, 225, 28, 1, - 247, 174, 225, 28, 1, 247, 16, 225, 28, 1, 225, 214, 225, 28, 1, 225, - 180, 225, 28, 1, 215, 109, 225, 28, 1, 201, 78, 225, 28, 1, 201, 66, 225, - 28, 1, 240, 41, 225, 28, 1, 240, 30, 225, 28, 1, 240, 25, 225, 28, 1, - 210, 77, 225, 28, 1, 216, 86, 225, 28, 1, 189, 225, 28, 1, 202, 233, 225, - 28, 1, 240, 136, 225, 28, 1, 239, 176, 225, 28, 1, 176, 225, 28, 1, 161, - 225, 28, 1, 213, 6, 225, 28, 1, 249, 145, 225, 28, 1, 248, 197, 225, 28, - 1, 166, 225, 28, 1, 164, 225, 28, 1, 169, 225, 28, 1, 172, 225, 28, 1, - 199, 152, 225, 28, 1, 207, 50, 225, 28, 1, 205, 80, 225, 28, 1, 183, 225, - 28, 1, 142, 225, 28, 18, 2, 252, 168, 225, 28, 18, 2, 68, 225, 28, 18, 2, - 226, 120, 225, 28, 18, 2, 66, 225, 28, 18, 2, 199, 245, 225, 28, 18, 2, - 69, 225, 28, 18, 2, 251, 200, 225, 28, 18, 2, 72, 225, 28, 18, 2, 250, - 150, 225, 28, 2, 199, 7, 225, 28, 2, 215, 149, 225, 28, 252, 30, 55, 225, - 28, 236, 196, 55, 225, 28, 31, 55, 225, 28, 208, 133, 78, 225, 28, 52, - 208, 133, 78, 225, 28, 240, 88, 225, 28, 52, 240, 88, 225, 28, 31, 2, 57, - 205, 167, 205, 175, 1, 208, 254, 205, 167, 205, 175, 1, 203, 139, 205, - 167, 205, 175, 1, 249, 115, 205, 167, 205, 175, 1, 247, 163, 205, 167, - 205, 175, 1, 240, 116, 205, 167, 205, 175, 1, 234, 108, 205, 167, 205, - 175, 1, 220, 89, 205, 167, 205, 175, 1, 217, 68, 205, 167, 205, 175, 1, - 223, 57, 205, 167, 205, 175, 1, 217, 231, 205, 167, 205, 175, 1, 199, - 148, 205, 167, 205, 175, 1, 213, 223, 205, 167, 205, 175, 1, 196, 110, - 205, 167, 205, 175, 1, 210, 226, 205, 167, 205, 175, 1, 232, 236, 205, - 167, 205, 175, 1, 225, 33, 205, 167, 205, 175, 1, 225, 208, 205, 167, - 205, 175, 1, 215, 106, 205, 167, 205, 175, 1, 251, 209, 205, 167, 205, - 175, 1, 237, 52, 205, 167, 205, 175, 1, 226, 121, 205, 167, 205, 175, 1, - 200, 92, 205, 167, 205, 175, 1, 214, 149, 205, 167, 205, 175, 1, 237, 40, - 205, 167, 205, 175, 1, 220, 104, 205, 167, 205, 175, 17, 195, 79, 205, - 167, 205, 175, 17, 100, 205, 167, 205, 175, 17, 102, 205, 167, 205, 175, - 17, 134, 205, 167, 205, 175, 17, 136, 205, 167, 205, 175, 17, 146, 205, - 167, 205, 175, 17, 167, 205, 167, 205, 175, 17, 178, 205, 167, 205, 175, - 17, 171, 205, 167, 205, 175, 17, 182, 247, 10, 2, 247, 133, 247, 10, 2, - 251, 51, 247, 10, 2, 199, 2, 247, 10, 1, 252, 168, 247, 10, 1, 68, 247, - 10, 1, 66, 247, 10, 1, 69, 247, 10, 1, 225, 55, 247, 10, 1, 224, 145, - 247, 10, 1, 234, 120, 247, 10, 1, 233, 229, 247, 10, 1, 217, 70, 247, 10, - 1, 247, 173, 247, 10, 1, 247, 15, 247, 10, 1, 225, 213, 247, 10, 1, 225, - 179, 247, 10, 1, 215, 108, 247, 10, 1, 201, 77, 247, 10, 1, 201, 65, 247, - 10, 1, 240, 40, 247, 10, 1, 240, 24, 247, 10, 1, 216, 85, 247, 10, 1, - 203, 162, 247, 10, 1, 202, 232, 247, 10, 1, 240, 135, 247, 10, 1, 239, - 175, 247, 10, 1, 217, 244, 247, 10, 1, 213, 243, 247, 10, 1, 213, 5, 247, - 10, 1, 249, 143, 247, 10, 1, 248, 196, 247, 10, 1, 220, 119, 247, 10, 1, - 195, 166, 247, 10, 1, 196, 129, 247, 10, 1, 210, 244, 247, 10, 1, 223, - 82, 247, 10, 1, 197, 160, 247, 10, 1, 209, 13, 247, 10, 1, 232, 246, 247, - 10, 18, 2, 63, 247, 10, 18, 2, 68, 247, 10, 18, 2, 226, 120, 247, 10, 18, - 2, 66, 247, 10, 18, 2, 199, 245, 247, 10, 18, 2, 69, 247, 10, 18, 2, 251, - 200, 247, 10, 18, 2, 72, 247, 10, 18, 2, 250, 150, 247, 10, 18, 2, 214, - 146, 247, 10, 177, 78, 247, 10, 250, 151, 78, 247, 10, 199, 7, 247, 10, - 220, 117, 247, 10, 17, 195, 79, 247, 10, 17, 100, 247, 10, 17, 102, 247, - 10, 17, 134, 247, 10, 17, 136, 247, 10, 17, 146, 247, 10, 17, 167, 247, - 10, 17, 178, 247, 10, 17, 171, 247, 10, 17, 182, 247, 10, 208, 133, 78, - 247, 10, 240, 88, 247, 10, 52, 240, 88, 247, 10, 211, 79, 78, 247, 10, 1, - 222, 121, 247, 10, 18, 2, 252, 168, 247, 10, 18, 2, 237, 33, 220, 87, 1, - 63, 220, 87, 1, 68, 220, 87, 1, 66, 220, 87, 1, 69, 220, 87, 1, 72, 220, - 87, 1, 155, 220, 87, 1, 224, 146, 220, 87, 1, 234, 123, 220, 87, 1, 233, - 230, 220, 87, 1, 247, 174, 220, 87, 1, 247, 16, 220, 87, 1, 225, 214, - 220, 87, 1, 225, 180, 220, 87, 1, 215, 109, 220, 87, 1, 201, 78, 220, 87, - 1, 201, 66, 220, 87, 1, 240, 41, 220, 87, 1, 240, 25, 220, 87, 1, 216, - 86, 220, 87, 1, 189, 220, 87, 1, 202, 233, 220, 87, 1, 240, 136, 220, 87, - 1, 239, 176, 220, 87, 1, 176, 220, 87, 1, 161, 220, 87, 1, 213, 6, 220, - 87, 1, 249, 145, 220, 87, 1, 248, 197, 220, 87, 1, 166, 220, 87, 1, 169, - 220, 87, 1, 172, 220, 87, 1, 199, 152, 220, 87, 1, 183, 220, 87, 1, 142, - 220, 87, 1, 209, 181, 220, 87, 2, 215, 149, 220, 87, 252, 30, 55, 220, - 87, 208, 133, 78, 220, 87, 33, 206, 159, 207, 15, 2, 247, 133, 207, 15, - 2, 251, 51, 207, 15, 2, 199, 2, 207, 15, 1, 63, 207, 15, 1, 252, 168, - 207, 15, 1, 68, 207, 15, 1, 226, 120, 207, 15, 1, 66, 207, 15, 1, 199, - 245, 207, 15, 1, 110, 144, 207, 15, 1, 110, 209, 182, 207, 15, 1, 110, - 159, 207, 15, 1, 110, 222, 38, 207, 15, 1, 69, 207, 15, 1, 251, 200, 207, - 15, 1, 72, 207, 15, 1, 250, 150, 207, 15, 1, 155, 207, 15, 1, 224, 146, - 207, 15, 1, 234, 123, 207, 15, 1, 233, 230, 207, 15, 1, 217, 71, 207, 15, - 1, 247, 174, 207, 15, 1, 247, 16, 207, 15, 1, 225, 214, 207, 15, 1, 225, - 180, 207, 15, 1, 215, 109, 207, 15, 1, 201, 78, 207, 15, 1, 201, 66, 207, - 15, 1, 240, 41, 207, 15, 1, 240, 25, 207, 15, 1, 216, 86, 207, 15, 1, - 189, 207, 15, 1, 202, 233, 207, 15, 1, 240, 136, 207, 15, 1, 239, 176, - 207, 15, 1, 176, 207, 15, 1, 161, 207, 15, 1, 213, 6, 207, 15, 1, 249, - 145, 207, 15, 1, 248, 197, 207, 15, 1, 166, 207, 15, 1, 164, 207, 15, 1, - 169, 207, 15, 1, 172, 207, 15, 1, 222, 37, 207, 15, 1, 199, 152, 207, 15, - 1, 207, 50, 207, 15, 1, 205, 80, 207, 15, 1, 183, 207, 15, 1, 142, 207, - 15, 18, 2, 252, 168, 207, 15, 18, 2, 68, 207, 15, 18, 2, 226, 120, 207, - 15, 18, 2, 66, 207, 15, 18, 2, 199, 245, 207, 15, 18, 2, 110, 144, 207, - 15, 18, 2, 110, 209, 182, 207, 15, 18, 2, 110, 159, 207, 15, 18, 2, 110, - 222, 38, 207, 15, 18, 2, 69, 207, 15, 18, 2, 251, 200, 207, 15, 18, 2, - 72, 207, 15, 18, 2, 250, 150, 207, 15, 2, 199, 7, 207, 15, 2, 250, 132, - 207, 15, 2, 225, 165, 207, 15, 2, 200, 34, 207, 15, 214, 127, 207, 15, - 240, 88, 207, 15, 52, 240, 88, 207, 15, 252, 30, 55, 207, 15, 207, 90, - 207, 15, 208, 215, 78, 207, 15, 2, 215, 149, 207, 15, 18, 73, 78, 207, - 15, 236, 75, 206, 182, 18, 78, 207, 15, 204, 75, 78, 207, 15, 17, 195, - 79, 207, 15, 17, 100, 207, 15, 17, 102, 207, 15, 17, 134, 207, 15, 17, - 136, 207, 15, 17, 146, 207, 15, 17, 167, 207, 15, 17, 178, 207, 15, 17, - 171, 207, 15, 17, 182, 207, 15, 237, 13, 207, 15, 2, 206, 100, 207, 15, - 232, 130, 207, 15, 241, 128, 55, 207, 15, 208, 133, 220, 28, 207, 15, - 208, 133, 220, 27, 153, 250, 251, 17, 100, 153, 250, 251, 17, 102, 153, - 250, 251, 17, 134, 153, 250, 251, 17, 136, 153, 250, 251, 17, 146, 153, - 250, 251, 17, 167, 153, 250, 251, 17, 178, 153, 250, 251, 17, 171, 153, - 250, 251, 17, 182, 153, 250, 251, 31, 203, 23, 153, 250, 251, 31, 200, - 234, 153, 250, 251, 31, 202, 177, 153, 250, 251, 31, 235, 14, 153, 250, - 251, 31, 235, 145, 153, 250, 251, 31, 206, 13, 153, 250, 251, 31, 207, - 65, 153, 250, 251, 31, 237, 20, 153, 250, 251, 31, 216, 174, 153, 250, - 251, 31, 97, 231, 57, 153, 250, 251, 31, 97, 170, 224, 116, 1, 63, 224, - 116, 1, 252, 168, 224, 116, 1, 68, 224, 116, 1, 66, 224, 116, 1, 69, 224, - 116, 1, 251, 200, 224, 116, 1, 72, 224, 116, 1, 250, 150, 224, 116, 1, - 155, 224, 116, 1, 224, 146, 224, 116, 1, 234, 123, 224, 116, 1, 234, 10, - 224, 116, 1, 233, 230, 224, 116, 1, 217, 71, 224, 116, 1, 247, 174, 224, - 116, 1, 247, 16, 224, 116, 1, 225, 214, 224, 116, 1, 225, 158, 224, 116, - 1, 215, 109, 224, 116, 1, 201, 78, 224, 116, 1, 201, 66, 224, 116, 1, - 240, 41, 224, 116, 1, 240, 25, 224, 116, 1, 216, 86, 224, 116, 1, 189, - 224, 116, 1, 202, 233, 224, 116, 1, 240, 136, 224, 116, 1, 240, 31, 224, - 116, 1, 239, 176, 224, 116, 1, 176, 224, 116, 1, 161, 224, 116, 1, 213, - 6, 224, 116, 1, 249, 145, 224, 116, 1, 249, 45, 224, 116, 1, 248, 197, - 224, 116, 1, 166, 224, 116, 1, 164, 224, 116, 1, 169, 224, 116, 1, 172, - 224, 116, 1, 199, 152, 224, 116, 1, 183, 224, 116, 1, 142, 224, 116, 1, - 222, 37, 224, 116, 18, 2, 252, 168, 224, 116, 18, 2, 68, 224, 116, 18, 2, - 226, 120, 224, 116, 18, 2, 66, 224, 116, 18, 2, 69, 224, 116, 18, 2, 251, - 200, 224, 116, 18, 2, 72, 224, 116, 18, 2, 250, 150, 224, 116, 2, 251, - 51, 224, 116, 2, 199, 7, 224, 116, 2, 215, 149, 224, 116, 2, 207, 40, - 224, 116, 240, 88, 224, 116, 52, 240, 88, 224, 116, 197, 9, 207, 90, 224, - 116, 208, 133, 78, 224, 116, 52, 208, 133, 78, 224, 116, 252, 30, 55, - 224, 116, 2, 204, 119, 218, 124, 1, 63, 218, 124, 1, 68, 218, 124, 1, 66, - 218, 124, 1, 69, 218, 124, 1, 155, 218, 124, 1, 224, 146, 218, 124, 1, - 234, 123, 218, 124, 1, 233, 230, 218, 124, 1, 247, 174, 218, 124, 1, 247, - 16, 218, 124, 1, 225, 214, 218, 124, 1, 225, 158, 218, 124, 1, 215, 109, - 218, 124, 1, 201, 78, 218, 124, 1, 201, 66, 218, 124, 1, 240, 41, 218, - 124, 1, 240, 31, 218, 124, 1, 240, 25, 218, 124, 1, 216, 86, 218, 124, 1, - 189, 218, 124, 1, 202, 233, 218, 124, 1, 240, 136, 218, 124, 1, 239, 176, - 218, 124, 1, 176, 218, 124, 1, 161, 218, 124, 1, 213, 6, 218, 124, 1, - 249, 145, 218, 124, 1, 248, 197, 218, 124, 1, 166, 218, 124, 1, 164, 218, - 124, 1, 169, 218, 124, 1, 172, 218, 124, 1, 199, 152, 218, 124, 1, 183, - 218, 124, 1, 142, 218, 124, 1, 209, 181, 218, 124, 1, 210, 77, 218, 124, - 208, 133, 78, 224, 107, 1, 63, 224, 107, 1, 252, 168, 224, 107, 1, 68, - 224, 107, 1, 226, 120, 224, 107, 1, 66, 224, 107, 1, 199, 245, 224, 107, - 1, 69, 224, 107, 1, 251, 200, 224, 107, 1, 72, 224, 107, 1, 250, 150, - 224, 107, 1, 155, 224, 107, 1, 224, 146, 224, 107, 1, 234, 123, 224, 107, - 1, 234, 10, 224, 107, 1, 233, 230, 224, 107, 1, 217, 71, 224, 107, 1, - 247, 174, 224, 107, 1, 247, 16, 224, 107, 1, 225, 214, 224, 107, 1, 225, - 158, 224, 107, 1, 225, 180, 224, 107, 1, 215, 109, 224, 107, 1, 201, 78, - 224, 107, 1, 201, 66, 224, 107, 1, 240, 41, 224, 107, 1, 240, 31, 224, - 107, 1, 209, 181, 224, 107, 1, 240, 25, 224, 107, 1, 216, 86, 224, 107, - 1, 189, 224, 107, 1, 202, 233, 224, 107, 1, 240, 136, 224, 107, 1, 239, - 176, 224, 107, 1, 176, 224, 107, 1, 161, 224, 107, 1, 213, 6, 224, 107, - 1, 249, 145, 224, 107, 1, 249, 45, 224, 107, 1, 248, 197, 224, 107, 1, - 166, 224, 107, 1, 164, 224, 107, 1, 169, 224, 107, 1, 172, 224, 107, 1, - 199, 152, 224, 107, 1, 207, 50, 224, 107, 1, 183, 224, 107, 1, 142, 224, - 107, 2, 251, 51, 224, 107, 18, 2, 252, 168, 224, 107, 18, 2, 68, 224, - 107, 18, 2, 226, 120, 224, 107, 18, 2, 66, 224, 107, 18, 2, 199, 245, - 224, 107, 18, 2, 69, 224, 107, 18, 2, 251, 200, 224, 107, 18, 2, 72, 224, - 107, 18, 2, 250, 150, 224, 107, 2, 215, 149, 224, 107, 2, 199, 7, 224, - 107, 17, 195, 79, 224, 107, 17, 100, 224, 107, 17, 102, 224, 107, 17, - 134, 224, 107, 17, 136, 224, 107, 17, 146, 224, 107, 17, 167, 224, 107, - 17, 178, 224, 107, 17, 171, 224, 107, 17, 182, 233, 109, 2, 38, 251, 52, - 57, 233, 109, 2, 247, 133, 233, 109, 2, 251, 51, 233, 109, 2, 199, 2, - 233, 109, 1, 63, 233, 109, 1, 252, 168, 233, 109, 1, 68, 233, 109, 1, - 226, 120, 233, 109, 1, 66, 233, 109, 1, 199, 245, 233, 109, 1, 110, 144, - 233, 109, 1, 110, 159, 233, 109, 1, 237, 54, 233, 109, 1, 251, 200, 233, - 109, 1, 214, 102, 233, 109, 1, 250, 150, 233, 109, 1, 155, 233, 109, 1, - 224, 146, 233, 109, 1, 234, 123, 233, 109, 1, 233, 230, 233, 109, 1, 217, - 71, 233, 109, 1, 247, 174, 233, 109, 1, 247, 16, 233, 109, 1, 225, 214, - 233, 109, 1, 225, 180, 233, 109, 1, 215, 109, 233, 109, 1, 201, 78, 233, - 109, 1, 201, 66, 233, 109, 1, 240, 41, 233, 109, 1, 240, 25, 233, 109, 1, - 216, 86, 233, 109, 1, 189, 233, 109, 1, 202, 233, 233, 109, 1, 240, 136, - 233, 109, 1, 239, 176, 233, 109, 1, 176, 233, 109, 1, 161, 233, 109, 1, - 213, 6, 233, 109, 1, 249, 145, 233, 109, 1, 248, 197, 233, 109, 1, 166, - 233, 109, 1, 164, 233, 109, 1, 169, 233, 109, 1, 172, 233, 109, 1, 222, - 37, 233, 109, 1, 199, 152, 233, 109, 1, 207, 50, 233, 109, 1, 205, 80, - 233, 109, 1, 183, 233, 109, 1, 142, 38, 248, 161, 60, 233, 109, 2, 215, - 149, 233, 109, 2, 250, 132, 233, 109, 18, 2, 252, 168, 233, 109, 18, 2, - 68, 233, 109, 18, 2, 226, 120, 233, 109, 18, 2, 66, 233, 109, 18, 2, 199, - 245, 233, 109, 18, 2, 110, 144, 233, 109, 18, 2, 110, 209, 182, 233, 109, - 18, 2, 237, 54, 233, 109, 18, 2, 251, 200, 233, 109, 18, 2, 214, 102, - 233, 109, 18, 2, 250, 150, 233, 109, 2, 199, 7, 233, 109, 214, 127, 233, - 109, 250, 151, 222, 158, 78, 233, 109, 2, 212, 123, 233, 109, 1, 199, - 115, 251, 51, 233, 109, 1, 199, 115, 52, 251, 51, 233, 109, 1, 110, 209, - 182, 233, 109, 1, 110, 222, 38, 233, 109, 18, 2, 110, 159, 233, 109, 18, - 2, 110, 222, 38, 38, 233, 109, 17, 195, 79, 38, 233, 109, 17, 100, 38, - 233, 109, 17, 102, 38, 233, 109, 17, 134, 38, 233, 109, 17, 136, 38, 233, - 109, 17, 146, 38, 233, 109, 17, 167, 38, 233, 109, 1, 63, 38, 233, 109, - 1, 155, 38, 233, 109, 1, 176, 38, 233, 109, 1, 199, 34, 38, 233, 109, 1, - 161, 217, 81, 1, 63, 217, 81, 1, 252, 168, 217, 81, 1, 68, 217, 81, 1, - 226, 120, 217, 81, 1, 66, 217, 81, 1, 199, 245, 217, 81, 1, 110, 144, - 217, 81, 1, 110, 209, 182, 217, 81, 1, 110, 159, 217, 81, 1, 110, 222, - 38, 217, 81, 1, 69, 217, 81, 1, 251, 200, 217, 81, 1, 72, 217, 81, 1, - 250, 150, 217, 81, 1, 155, 217, 81, 1, 224, 146, 217, 81, 1, 234, 123, - 217, 81, 1, 233, 230, 217, 81, 1, 217, 71, 217, 81, 1, 217, 20, 217, 81, - 1, 247, 174, 217, 81, 1, 247, 16, 217, 81, 1, 225, 214, 217, 81, 1, 225, - 180, 217, 81, 1, 215, 109, 217, 81, 1, 215, 91, 217, 81, 1, 201, 78, 217, - 81, 1, 201, 66, 217, 81, 1, 240, 41, 217, 81, 1, 240, 25, 217, 81, 1, - 216, 86, 217, 81, 1, 189, 217, 81, 1, 202, 233, 217, 81, 1, 240, 136, - 217, 81, 1, 239, 176, 217, 81, 1, 176, 217, 81, 1, 216, 227, 217, 81, 1, - 161, 217, 81, 1, 213, 6, 217, 81, 1, 249, 145, 217, 81, 1, 248, 197, 217, - 81, 1, 166, 217, 81, 1, 219, 81, 217, 81, 1, 164, 217, 81, 1, 169, 217, - 81, 1, 210, 77, 217, 81, 1, 172, 217, 81, 1, 222, 122, 217, 81, 1, 197, - 166, 217, 81, 1, 207, 50, 217, 81, 1, 205, 80, 217, 81, 1, 183, 217, 81, - 1, 142, 217, 81, 18, 2, 252, 168, 217, 81, 18, 2, 68, 217, 81, 18, 2, - 226, 120, 217, 81, 18, 2, 66, 217, 81, 18, 2, 199, 245, 217, 81, 18, 2, - 110, 144, 217, 81, 18, 2, 110, 209, 182, 217, 81, 18, 2, 110, 159, 217, - 81, 18, 2, 110, 222, 38, 217, 81, 18, 2, 69, 217, 81, 18, 2, 251, 200, - 217, 81, 18, 2, 72, 217, 81, 18, 2, 250, 150, 217, 81, 2, 199, 7, 217, - 81, 2, 247, 133, 217, 81, 2, 251, 51, 217, 81, 2, 199, 2, 217, 81, 2, - 215, 149, 217, 81, 2, 250, 132, 217, 81, 2, 48, 251, 51, 217, 81, 214, - 127, 217, 81, 206, 99, 217, 81, 240, 88, 217, 81, 52, 240, 88, 217, 81, - 244, 159, 217, 81, 234, 87, 235, 134, 217, 81, 252, 30, 55, 217, 81, 17, - 195, 79, 217, 81, 17, 100, 217, 81, 17, 102, 217, 81, 17, 134, 217, 81, - 17, 136, 217, 81, 17, 146, 217, 81, 17, 167, 217, 81, 17, 178, 217, 81, - 17, 171, 217, 81, 17, 182, 217, 81, 212, 148, 78, 217, 81, 226, 43, 55, - 217, 81, 208, 215, 78, 217, 81, 1, 199, 115, 251, 51, 202, 61, 251, 80, - 202, 61, 1, 63, 202, 61, 1, 252, 168, 202, 61, 1, 68, 202, 61, 1, 226, - 120, 202, 61, 1, 66, 202, 61, 1, 199, 245, 202, 61, 1, 110, 144, 202, 61, - 1, 110, 209, 182, 202, 61, 1, 110, 159, 202, 61, 1, 110, 222, 38, 202, - 61, 1, 69, 202, 61, 1, 251, 200, 202, 61, 1, 72, 202, 61, 1, 250, 150, - 202, 61, 1, 155, 202, 61, 1, 224, 146, 202, 61, 1, 234, 123, 202, 61, 1, - 233, 230, 202, 61, 1, 217, 71, 202, 61, 1, 247, 174, 202, 61, 1, 247, 16, - 202, 61, 1, 225, 214, 202, 61, 1, 225, 180, 202, 61, 1, 215, 109, 202, - 61, 1, 201, 78, 202, 61, 1, 201, 66, 202, 61, 1, 240, 41, 202, 61, 1, - 240, 25, 202, 61, 1, 216, 86, 202, 61, 1, 189, 202, 61, 1, 202, 233, 202, - 61, 1, 240, 136, 202, 61, 1, 239, 176, 202, 61, 1, 176, 202, 61, 1, 161, - 202, 61, 1, 213, 6, 202, 61, 1, 249, 145, 202, 61, 1, 248, 197, 202, 61, - 1, 166, 202, 61, 1, 164, 202, 61, 1, 169, 202, 61, 1, 172, 202, 61, 1, - 199, 152, 202, 61, 1, 207, 50, 202, 61, 1, 205, 80, 202, 61, 1, 183, 202, - 61, 1, 142, 202, 61, 18, 2, 252, 168, 202, 61, 18, 2, 68, 202, 61, 18, 2, - 226, 120, 202, 61, 18, 2, 66, 202, 61, 18, 2, 199, 245, 202, 61, 18, 2, - 110, 144, 202, 61, 18, 2, 110, 209, 182, 202, 61, 18, 2, 110, 159, 202, - 61, 18, 2, 110, 222, 38, 202, 61, 18, 2, 69, 202, 61, 18, 2, 206, 182, - 69, 202, 61, 18, 2, 251, 200, 202, 61, 18, 2, 72, 202, 61, 18, 2, 206, - 182, 72, 202, 61, 18, 2, 250, 150, 202, 61, 2, 247, 133, 202, 61, 2, 251, - 51, 202, 61, 2, 199, 2, 202, 61, 2, 199, 7, 202, 61, 2, 215, 149, 202, - 61, 2, 250, 132, 202, 61, 233, 35, 202, 61, 252, 30, 55, 202, 61, 214, - 127, 202, 61, 17, 195, 79, 202, 61, 17, 100, 202, 61, 17, 102, 202, 61, - 17, 134, 202, 61, 17, 136, 202, 61, 17, 146, 202, 61, 17, 167, 202, 61, - 17, 178, 202, 61, 17, 171, 202, 61, 17, 182, 206, 101, 1, 63, 206, 101, - 1, 252, 168, 206, 101, 1, 68, 206, 101, 1, 226, 120, 206, 101, 1, 66, - 206, 101, 1, 199, 245, 206, 101, 1, 110, 144, 206, 101, 1, 110, 209, 182, - 206, 101, 1, 110, 159, 206, 101, 1, 110, 222, 38, 206, 101, 1, 69, 206, - 101, 1, 251, 200, 206, 101, 1, 72, 206, 101, 1, 250, 150, 206, 101, 1, - 155, 206, 101, 1, 224, 146, 206, 101, 1, 234, 123, 206, 101, 1, 233, 230, - 206, 101, 1, 217, 71, 206, 101, 1, 247, 174, 206, 101, 1, 247, 16, 206, - 101, 1, 225, 214, 206, 101, 1, 225, 180, 206, 101, 1, 215, 109, 206, 101, - 1, 201, 78, 206, 101, 1, 201, 66, 206, 101, 1, 240, 41, 206, 101, 1, 240, - 25, 206, 101, 1, 216, 86, 206, 101, 1, 189, 206, 101, 1, 202, 233, 206, - 101, 1, 240, 136, 206, 101, 1, 239, 176, 206, 101, 1, 176, 206, 101, 1, - 161, 206, 101, 1, 213, 6, 206, 101, 1, 249, 145, 206, 101, 1, 248, 197, - 206, 101, 1, 166, 206, 101, 1, 164, 206, 101, 1, 169, 206, 101, 1, 172, - 206, 101, 1, 199, 152, 206, 101, 1, 207, 50, 206, 101, 1, 205, 80, 206, - 101, 1, 183, 206, 101, 1, 142, 206, 101, 18, 2, 252, 168, 206, 101, 18, - 2, 68, 206, 101, 18, 2, 226, 120, 206, 101, 18, 2, 66, 206, 101, 18, 2, - 199, 245, 206, 101, 18, 2, 110, 144, 206, 101, 18, 2, 110, 209, 182, 206, - 101, 18, 2, 69, 206, 101, 18, 2, 251, 200, 206, 101, 18, 2, 72, 206, 101, - 18, 2, 250, 150, 206, 101, 2, 247, 133, 206, 101, 2, 251, 51, 206, 101, - 2, 199, 2, 206, 101, 2, 199, 7, 206, 101, 2, 215, 149, 206, 101, 2, 206, - 100, 206, 101, 240, 88, 206, 101, 52, 240, 88, 206, 101, 207, 91, 238, - 253, 206, 101, 207, 91, 154, 206, 101, 210, 117, 220, 28, 206, 101, 210, - 117, 220, 27, 206, 101, 210, 117, 220, 26, 206, 101, 236, 222, 77, 202, - 238, 78, 206, 101, 208, 133, 117, 3, 201, 175, 26, 200, 167, 214, 58, - 206, 101, 208, 133, 117, 3, 201, 175, 26, 237, 250, 241, 70, 206, 101, - 208, 133, 117, 3, 210, 189, 26, 237, 250, 241, 70, 206, 101, 208, 133, - 117, 3, 210, 189, 26, 237, 250, 52, 241, 70, 206, 101, 208, 133, 117, 3, - 210, 189, 26, 237, 250, 201, 165, 241, 70, 206, 101, 208, 133, 117, 52, - 210, 2, 206, 101, 208, 133, 117, 52, 210, 3, 3, 210, 188, 206, 101, 208, - 133, 117, 3, 52, 241, 70, 206, 101, 208, 133, 117, 3, 201, 165, 241, 70, - 206, 101, 208, 133, 117, 3, 211, 90, 241, 70, 206, 101, 208, 133, 117, 3, - 207, 88, 241, 70, 206, 101, 208, 133, 117, 3, 244, 247, 26, 210, 188, - 206, 101, 208, 133, 117, 3, 244, 247, 26, 99, 236, 224, 206, 101, 208, - 133, 117, 3, 244, 247, 26, 235, 7, 236, 224, 206, 101, 1, 202, 155, 251, - 131, 68, 206, 101, 1, 200, 217, 251, 131, 68, 206, 101, 1, 200, 217, 251, - 131, 226, 120, 206, 101, 1, 251, 131, 66, 206, 101, 18, 2, 251, 131, 66, - 206, 101, 18, 2, 251, 131, 199, 245, 218, 236, 1, 63, 218, 236, 1, 252, - 168, 218, 236, 1, 68, 218, 236, 1, 226, 120, 218, 236, 1, 66, 218, 236, - 1, 199, 245, 218, 236, 1, 110, 144, 218, 236, 1, 110, 209, 182, 218, 236, - 1, 110, 159, 218, 236, 1, 110, 222, 38, 218, 236, 1, 69, 218, 236, 1, - 251, 200, 218, 236, 1, 72, 218, 236, 1, 250, 150, 218, 236, 1, 155, 218, - 236, 1, 224, 146, 218, 236, 1, 234, 123, 218, 236, 1, 233, 230, 218, 236, - 1, 217, 71, 218, 236, 1, 247, 174, 218, 236, 1, 247, 16, 218, 236, 1, - 225, 214, 218, 236, 1, 225, 180, 218, 236, 1, 215, 109, 218, 236, 1, 201, - 78, 218, 236, 1, 201, 66, 218, 236, 1, 240, 41, 218, 236, 1, 240, 25, - 218, 236, 1, 216, 86, 218, 236, 1, 189, 218, 236, 1, 202, 233, 218, 236, - 1, 240, 136, 218, 236, 1, 239, 176, 218, 236, 1, 176, 218, 236, 1, 161, - 218, 236, 1, 213, 6, 218, 236, 1, 249, 145, 218, 236, 1, 248, 197, 218, - 236, 1, 166, 218, 236, 1, 164, 218, 236, 1, 169, 218, 236, 1, 172, 218, - 236, 1, 199, 152, 218, 236, 1, 207, 50, 218, 236, 1, 205, 80, 218, 236, - 1, 183, 218, 236, 1, 142, 218, 236, 1, 222, 37, 218, 236, 18, 2, 252, - 168, 218, 236, 18, 2, 68, 218, 236, 18, 2, 226, 120, 218, 236, 18, 2, 66, - 218, 236, 18, 2, 199, 245, 218, 236, 18, 2, 110, 144, 218, 236, 18, 2, - 110, 209, 182, 218, 236, 18, 2, 110, 159, 218, 236, 18, 2, 110, 222, 38, - 218, 236, 18, 2, 69, 218, 236, 18, 2, 251, 200, 218, 236, 18, 2, 72, 218, - 236, 18, 2, 250, 150, 218, 236, 2, 251, 51, 218, 236, 2, 199, 2, 218, - 236, 2, 199, 7, 218, 236, 2, 250, 248, 218, 236, 240, 88, 218, 236, 52, - 240, 88, 218, 236, 252, 30, 55, 218, 236, 2, 231, 45, 218, 236, 17, 195, - 79, 218, 236, 17, 100, 218, 236, 17, 102, 218, 236, 17, 134, 218, 236, - 17, 136, 218, 236, 17, 146, 218, 236, 17, 167, 218, 236, 17, 178, 218, - 236, 17, 171, 218, 236, 17, 182, 96, 248, 155, 3, 214, 59, 96, 209, 194, - 248, 154, 96, 52, 248, 155, 3, 214, 59, 96, 201, 165, 248, 155, 3, 214, - 59, 96, 248, 155, 3, 52, 214, 59, 96, 209, 194, 248, 155, 3, 214, 59, 96, - 209, 194, 248, 155, 3, 52, 214, 59, 96, 226, 17, 248, 154, 96, 226, 17, - 248, 155, 3, 52, 214, 59, 96, 204, 51, 248, 154, 96, 204, 51, 248, 155, - 3, 214, 59, 96, 204, 51, 248, 155, 3, 52, 214, 59, 96, 163, 204, 51, 248, - 155, 3, 52, 214, 59, 203, 125, 1, 63, 203, 125, 1, 252, 168, 203, 125, 1, - 68, 203, 125, 1, 226, 120, 203, 125, 1, 66, 203, 125, 1, 199, 245, 203, - 125, 1, 69, 203, 125, 1, 251, 200, 203, 125, 1, 72, 203, 125, 1, 250, - 150, 203, 125, 1, 155, 203, 125, 1, 224, 146, 203, 125, 1, 234, 123, 203, - 125, 1, 233, 230, 203, 125, 1, 217, 71, 203, 125, 1, 247, 174, 203, 125, - 1, 247, 16, 203, 125, 1, 225, 214, 203, 125, 1, 225, 180, 203, 125, 1, - 215, 109, 203, 125, 1, 201, 78, 203, 125, 1, 201, 66, 203, 125, 1, 240, - 41, 203, 125, 1, 240, 25, 203, 125, 1, 216, 86, 203, 125, 1, 189, 203, - 125, 1, 202, 233, 203, 125, 1, 240, 136, 203, 125, 1, 239, 176, 203, 125, - 1, 176, 203, 125, 1, 161, 203, 125, 1, 213, 6, 203, 125, 1, 249, 145, - 203, 125, 1, 248, 197, 203, 125, 1, 166, 203, 125, 1, 164, 203, 125, 1, - 169, 203, 125, 1, 172, 203, 125, 1, 199, 152, 203, 125, 1, 207, 50, 203, - 125, 1, 183, 203, 125, 1, 142, 203, 125, 1, 209, 181, 203, 125, 2, 251, - 51, 203, 125, 2, 199, 2, 203, 125, 18, 2, 252, 168, 203, 125, 18, 2, 68, - 203, 125, 18, 2, 226, 120, 203, 125, 18, 2, 66, 203, 125, 18, 2, 199, - 245, 203, 125, 18, 2, 69, 203, 125, 18, 2, 251, 200, 203, 125, 18, 2, 72, - 203, 125, 18, 2, 250, 150, 203, 125, 2, 199, 7, 203, 125, 2, 215, 149, - 203, 125, 1, 250, 251, 224, 146, 203, 125, 17, 195, 79, 203, 125, 17, - 100, 203, 125, 17, 102, 203, 125, 17, 134, 203, 125, 17, 136, 203, 125, - 17, 146, 203, 125, 17, 167, 203, 125, 17, 178, 203, 125, 17, 171, 203, - 125, 17, 182, 251, 204, 1, 155, 251, 204, 1, 224, 146, 251, 204, 1, 217, - 71, 251, 204, 1, 176, 251, 204, 1, 189, 251, 204, 1, 251, 131, 189, 251, - 204, 1, 161, 251, 204, 1, 213, 6, 251, 204, 1, 249, 145, 251, 204, 1, - 166, 251, 204, 1, 225, 214, 251, 204, 1, 247, 16, 251, 204, 1, 202, 233, - 251, 204, 1, 169, 251, 204, 1, 172, 251, 204, 1, 183, 251, 204, 1, 215, - 109, 251, 204, 1, 142, 251, 204, 1, 63, 251, 204, 1, 240, 136, 251, 204, - 1, 239, 176, 251, 204, 1, 234, 123, 251, 204, 1, 251, 131, 234, 123, 251, - 204, 1, 233, 230, 251, 204, 1, 248, 197, 251, 204, 1, 225, 180, 251, 204, - 1, 251, 131, 249, 145, 251, 204, 108, 2, 219, 194, 172, 251, 204, 108, 2, - 219, 194, 169, 251, 204, 108, 2, 219, 194, 222, 96, 169, 251, 204, 18, 2, - 63, 251, 204, 18, 2, 252, 168, 251, 204, 18, 2, 68, 251, 204, 18, 2, 226, - 120, 251, 204, 18, 2, 66, 251, 204, 18, 2, 199, 245, 251, 204, 18, 2, 69, - 251, 204, 18, 2, 250, 127, 251, 204, 18, 2, 72, 251, 204, 18, 2, 251, - 200, 251, 204, 18, 2, 251, 123, 251, 204, 2, 224, 78, 251, 204, 17, 195, - 79, 251, 204, 17, 100, 251, 204, 17, 102, 251, 204, 17, 134, 251, 204, - 17, 136, 251, 204, 17, 146, 251, 204, 17, 167, 251, 204, 17, 178, 251, - 204, 17, 171, 251, 204, 17, 182, 251, 204, 31, 203, 23, 251, 204, 31, - 200, 234, 251, 204, 2, 4, 208, 132, 251, 204, 2, 208, 132, 251, 204, 2, - 209, 125, 251, 204, 16, 199, 34, 239, 16, 1, 63, 239, 16, 1, 252, 168, - 239, 16, 1, 68, 239, 16, 1, 226, 120, 239, 16, 1, 66, 239, 16, 1, 199, - 245, 239, 16, 1, 69, 239, 16, 1, 251, 200, 239, 16, 1, 72, 239, 16, 1, - 250, 150, 239, 16, 1, 155, 239, 16, 1, 224, 146, 239, 16, 1, 234, 123, - 239, 16, 1, 233, 230, 239, 16, 1, 217, 71, 239, 16, 1, 247, 174, 239, 16, - 1, 247, 16, 239, 16, 1, 225, 214, 239, 16, 1, 225, 180, 239, 16, 1, 215, - 109, 239, 16, 1, 201, 78, 239, 16, 1, 201, 66, 239, 16, 1, 240, 41, 239, - 16, 1, 240, 25, 239, 16, 1, 216, 86, 239, 16, 1, 189, 239, 16, 1, 202, - 233, 239, 16, 1, 240, 136, 239, 16, 1, 239, 176, 239, 16, 1, 176, 239, - 16, 1, 161, 239, 16, 1, 213, 6, 239, 16, 1, 249, 145, 239, 16, 1, 248, - 197, 239, 16, 1, 166, 239, 16, 1, 164, 239, 16, 1, 169, 239, 16, 1, 172, - 239, 16, 1, 199, 152, 239, 16, 1, 207, 50, 239, 16, 1, 205, 80, 239, 16, - 1, 183, 239, 16, 1, 142, 239, 16, 1, 209, 181, 239, 16, 18, 2, 252, 168, - 239, 16, 18, 2, 68, 239, 16, 18, 2, 226, 120, 239, 16, 18, 2, 66, 239, - 16, 18, 2, 199, 245, 239, 16, 18, 2, 110, 144, 239, 16, 18, 2, 110, 209, - 182, 239, 16, 18, 2, 69, 239, 16, 18, 2, 251, 200, 239, 16, 18, 2, 72, - 239, 16, 18, 2, 250, 150, 239, 16, 2, 251, 51, 239, 16, 2, 199, 2, 239, - 16, 2, 199, 7, 239, 16, 2, 215, 149, 239, 16, 252, 30, 55, 197, 139, 244, - 236, 6, 1, 217, 70, 197, 139, 244, 236, 6, 1, 63, 197, 139, 244, 236, 6, - 1, 197, 70, 197, 139, 244, 236, 6, 1, 195, 217, 197, 139, 244, 236, 6, 1, - 164, 197, 139, 244, 236, 6, 1, 196, 3, 197, 139, 244, 236, 6, 1, 226, - 120, 197, 139, 244, 236, 6, 1, 199, 245, 197, 139, 244, 236, 6, 1, 69, - 197, 139, 244, 236, 6, 1, 72, 197, 139, 244, 236, 6, 1, 251, 97, 197, - 139, 244, 236, 6, 1, 234, 123, 197, 139, 244, 236, 6, 1, 224, 11, 197, - 139, 244, 236, 6, 1, 236, 193, 197, 139, 244, 236, 6, 1, 195, 196, 197, - 139, 244, 236, 6, 1, 200, 106, 197, 139, 244, 236, 6, 1, 236, 212, 197, - 139, 244, 236, 6, 1, 214, 167, 197, 139, 244, 236, 6, 1, 201, 73, 197, - 139, 244, 236, 6, 1, 215, 135, 197, 139, 244, 236, 6, 1, 240, 136, 197, - 139, 244, 236, 6, 1, 250, 168, 197, 139, 244, 236, 6, 1, 251, 123, 197, - 139, 244, 236, 6, 1, 248, 21, 197, 139, 244, 236, 6, 1, 211, 227, 197, - 139, 244, 236, 6, 1, 232, 29, 197, 139, 244, 236, 6, 1, 231, 173, 197, - 139, 244, 236, 6, 1, 231, 100, 197, 139, 244, 236, 6, 1, 232, 175, 197, - 139, 244, 236, 6, 1, 205, 31, 197, 139, 244, 236, 6, 1, 206, 84, 197, - 139, 244, 236, 6, 1, 198, 249, 197, 139, 244, 236, 4, 1, 217, 70, 197, - 139, 244, 236, 4, 1, 63, 197, 139, 244, 236, 4, 1, 197, 70, 197, 139, - 244, 236, 4, 1, 195, 217, 197, 139, 244, 236, 4, 1, 164, 197, 139, 244, - 236, 4, 1, 196, 3, 197, 139, 244, 236, 4, 1, 226, 120, 197, 139, 244, - 236, 4, 1, 199, 245, 197, 139, 244, 236, 4, 1, 69, 197, 139, 244, 236, 4, - 1, 72, 197, 139, 244, 236, 4, 1, 251, 97, 197, 139, 244, 236, 4, 1, 234, - 123, 197, 139, 244, 236, 4, 1, 224, 11, 197, 139, 244, 236, 4, 1, 236, - 193, 197, 139, 244, 236, 4, 1, 195, 196, 197, 139, 244, 236, 4, 1, 200, - 106, 197, 139, 244, 236, 4, 1, 236, 212, 197, 139, 244, 236, 4, 1, 214, - 167, 197, 139, 244, 236, 4, 1, 201, 73, 197, 139, 244, 236, 4, 1, 215, - 135, 197, 139, 244, 236, 4, 1, 240, 136, 197, 139, 244, 236, 4, 1, 250, - 168, 197, 139, 244, 236, 4, 1, 251, 123, 197, 139, 244, 236, 4, 1, 248, - 21, 197, 139, 244, 236, 4, 1, 211, 227, 197, 139, 244, 236, 4, 1, 232, - 29, 197, 139, 244, 236, 4, 1, 231, 173, 197, 139, 244, 236, 4, 1, 231, - 100, 197, 139, 244, 236, 4, 1, 232, 175, 197, 139, 244, 236, 4, 1, 205, - 31, 197, 139, 244, 236, 4, 1, 206, 84, 197, 139, 244, 236, 4, 1, 198, - 249, 197, 139, 244, 236, 17, 195, 79, 197, 139, 244, 236, 17, 100, 197, - 139, 244, 236, 17, 102, 197, 139, 244, 236, 17, 134, 197, 139, 244, 236, - 17, 136, 197, 139, 244, 236, 17, 146, 197, 139, 244, 236, 17, 167, 197, - 139, 244, 236, 17, 178, 197, 139, 244, 236, 17, 171, 197, 139, 244, 236, - 17, 182, 197, 139, 244, 236, 31, 203, 23, 197, 139, 244, 236, 31, 200, - 234, 197, 139, 244, 236, 31, 202, 177, 197, 139, 244, 236, 31, 235, 14, - 197, 139, 244, 236, 31, 235, 145, 197, 139, 244, 236, 31, 206, 13, 197, - 139, 244, 236, 31, 207, 65, 197, 139, 244, 236, 31, 237, 20, 197, 139, - 244, 236, 31, 216, 174, 197, 139, 244, 236, 214, 127, 217, 218, 1, 63, - 217, 218, 1, 252, 168, 217, 218, 1, 68, 217, 218, 1, 226, 120, 217, 218, - 1, 66, 217, 218, 1, 199, 245, 217, 218, 1, 110, 144, 217, 218, 1, 110, - 209, 182, 217, 218, 1, 69, 217, 218, 1, 251, 200, 217, 218, 1, 72, 217, - 218, 1, 250, 150, 217, 218, 1, 155, 217, 218, 1, 224, 146, 217, 218, 1, - 234, 123, 217, 218, 1, 233, 230, 217, 218, 1, 217, 71, 217, 218, 1, 247, - 174, 217, 218, 1, 247, 16, 217, 218, 1, 225, 214, 217, 218, 1, 225, 180, - 217, 218, 1, 215, 109, 217, 218, 1, 201, 78, 217, 218, 1, 201, 66, 217, - 218, 1, 240, 41, 217, 218, 1, 240, 25, 217, 218, 1, 216, 86, 217, 218, 1, - 189, 217, 218, 1, 202, 233, 217, 218, 1, 240, 136, 217, 218, 1, 239, 176, - 217, 218, 1, 176, 217, 218, 1, 161, 217, 218, 1, 213, 6, 217, 218, 1, - 249, 145, 217, 218, 1, 248, 197, 217, 218, 1, 166, 217, 218, 1, 164, 217, - 218, 1, 169, 217, 218, 1, 172, 217, 218, 1, 199, 152, 217, 218, 1, 207, - 50, 217, 218, 1, 205, 80, 217, 218, 1, 183, 217, 218, 1, 142, 217, 218, - 1, 222, 37, 217, 218, 1, 209, 181, 217, 218, 18, 2, 252, 168, 217, 218, - 18, 2, 68, 217, 218, 18, 2, 226, 120, 217, 218, 18, 2, 66, 217, 218, 18, - 2, 199, 245, 217, 218, 18, 2, 110, 144, 217, 218, 18, 2, 110, 209, 182, - 217, 218, 18, 2, 69, 217, 218, 18, 2, 251, 200, 217, 218, 18, 2, 72, 217, - 218, 18, 2, 250, 150, 217, 218, 2, 251, 51, 217, 218, 2, 199, 2, 217, - 218, 2, 199, 7, 217, 218, 2, 250, 132, 217, 218, 2, 206, 100, 217, 218, - 232, 130, 217, 218, 18, 2, 212, 11, 69, 195, 102, 47, 1, 63, 195, 102, - 47, 18, 2, 68, 195, 102, 47, 18, 2, 200, 99, 195, 102, 47, 18, 2, 66, - 195, 102, 47, 18, 2, 69, 195, 102, 47, 18, 2, 214, 164, 195, 102, 47, 18, - 2, 72, 195, 102, 47, 18, 2, 251, 200, 195, 102, 47, 18, 2, 250, 150, 195, - 102, 47, 18, 2, 210, 89, 68, 195, 102, 47, 18, 222, 158, 78, 195, 102, - 47, 1, 155, 195, 102, 47, 1, 224, 146, 195, 102, 47, 1, 234, 123, 195, - 102, 47, 1, 233, 230, 195, 102, 47, 1, 217, 71, 195, 102, 47, 1, 247, - 174, 195, 102, 47, 1, 247, 16, 195, 102, 47, 1, 225, 214, 195, 102, 47, - 1, 215, 109, 195, 102, 47, 1, 201, 78, 195, 102, 47, 1, 201, 66, 195, - 102, 47, 1, 240, 41, 195, 102, 47, 1, 240, 25, 195, 102, 47, 1, 216, 86, - 195, 102, 47, 1, 189, 195, 102, 47, 1, 202, 233, 195, 102, 47, 1, 240, - 136, 195, 102, 47, 1, 239, 176, 195, 102, 47, 1, 176, 195, 102, 47, 1, - 161, 195, 102, 47, 1, 213, 6, 195, 102, 47, 1, 249, 145, 195, 102, 47, 1, - 248, 197, 195, 102, 47, 1, 166, 195, 102, 47, 1, 201, 113, 195, 102, 47, - 1, 201, 103, 195, 102, 47, 1, 237, 156, 195, 102, 47, 1, 237, 150, 195, - 102, 47, 1, 195, 74, 195, 102, 47, 1, 195, 115, 195, 102, 47, 1, 255, - 176, 195, 102, 47, 1, 164, 195, 102, 47, 1, 169, 195, 102, 47, 1, 172, - 195, 102, 47, 1, 199, 152, 195, 102, 47, 1, 207, 50, 195, 102, 47, 1, - 205, 80, 195, 102, 47, 1, 183, 195, 102, 47, 1, 142, 195, 102, 47, 1, - 223, 201, 195, 102, 47, 48, 108, 78, 195, 102, 47, 2, 199, 7, 195, 102, - 47, 2, 247, 133, 195, 102, 47, 2, 247, 134, 3, 214, 59, 195, 102, 47, 2, - 247, 136, 3, 214, 59, 195, 102, 47, 2, 251, 51, 195, 102, 47, 2, 199, 2, - 195, 102, 47, 244, 185, 1, 169, 195, 102, 47, 244, 186, 1, 164, 195, 102, - 47, 244, 186, 1, 169, 195, 102, 47, 244, 186, 1, 172, 195, 102, 47, 244, - 186, 1, 199, 152, 195, 102, 47, 84, 232, 138, 78, 195, 102, 47, 244, 199, - 232, 138, 78, 195, 102, 47, 117, 201, 98, 195, 102, 47, 117, 207, 42, - 195, 102, 47, 117, 52, 207, 42, 195, 102, 47, 117, 181, 201, 98, 195, - 102, 47, 84, 237, 242, 232, 138, 78, 195, 102, 47, 244, 199, 237, 242, - 232, 138, 78, 195, 102, 47, 204, 151, 205, 152, 1, 63, 205, 152, 18, 2, - 68, 205, 152, 18, 2, 200, 99, 205, 152, 18, 2, 66, 205, 152, 18, 2, 69, - 205, 152, 18, 2, 72, 205, 152, 18, 2, 214, 164, 205, 152, 18, 2, 251, - 200, 205, 152, 18, 2, 250, 150, 205, 152, 18, 2, 110, 144, 205, 152, 18, - 2, 110, 159, 205, 152, 18, 222, 158, 78, 205, 152, 1, 155, 205, 152, 1, - 224, 146, 205, 152, 1, 234, 123, 205, 152, 1, 233, 230, 205, 152, 1, 217, - 71, 205, 152, 1, 247, 174, 205, 152, 1, 247, 16, 205, 152, 1, 225, 214, - 205, 152, 1, 225, 180, 205, 152, 1, 215, 109, 205, 152, 1, 201, 78, 205, - 152, 1, 201, 66, 205, 152, 1, 240, 41, 205, 152, 1, 240, 25, 205, 152, 1, - 216, 86, 205, 152, 1, 189, 205, 152, 1, 202, 233, 205, 152, 1, 240, 136, - 205, 152, 1, 239, 176, 205, 152, 1, 176, 205, 152, 1, 161, 205, 152, 1, - 213, 6, 205, 152, 1, 249, 145, 205, 152, 1, 248, 197, 205, 152, 1, 166, - 205, 152, 1, 201, 113, 205, 152, 1, 201, 103, 205, 152, 1, 237, 156, 205, - 152, 1, 195, 74, 205, 152, 1, 195, 115, 205, 152, 1, 255, 176, 205, 152, - 1, 164, 205, 152, 1, 169, 205, 152, 1, 172, 205, 152, 1, 199, 152, 205, - 152, 1, 207, 50, 205, 152, 1, 205, 80, 205, 152, 1, 183, 205, 152, 1, - 142, 205, 152, 1, 223, 201, 205, 152, 2, 225, 165, 205, 152, 2, 200, 34, - 205, 152, 244, 185, 1, 169, 205, 152, 244, 185, 1, 172, 205, 152, 244, - 185, 1, 207, 50, 205, 152, 244, 185, 1, 183, 205, 152, 48, 108, 2, 234, - 190, 205, 152, 48, 108, 2, 225, 80, 205, 152, 48, 108, 2, 217, 73, 205, - 152, 48, 108, 2, 240, 231, 205, 152, 48, 108, 2, 218, 55, 205, 152, 48, - 108, 2, 250, 112, 205, 152, 48, 108, 2, 221, 136, 205, 152, 48, 108, 2, - 144, 205, 152, 48, 108, 2, 159, 205, 152, 48, 108, 2, 207, 52, 205, 152, - 48, 108, 2, 209, 80, 205, 152, 48, 108, 2, 255, 176, 205, 152, 2, 251, - 51, 205, 152, 2, 199, 2, 205, 152, 234, 36, 78, 205, 152, 204, 151, 205, - 152, 117, 201, 98, 205, 152, 117, 207, 42, 205, 152, 117, 52, 207, 42, - 205, 152, 117, 212, 123, 205, 152, 232, 138, 117, 3, 218, 190, 26, 204, - 112, 26, 201, 165, 235, 86, 205, 152, 232, 138, 117, 3, 218, 190, 26, - 204, 112, 26, 235, 86, 205, 152, 232, 138, 117, 3, 218, 190, 26, 204, - 111, 205, 152, 203, 9, 220, 28, 205, 152, 203, 9, 220, 27, 213, 109, 244, - 254, 232, 159, 1, 161, 213, 109, 244, 254, 232, 159, 1, 155, 213, 109, - 244, 254, 232, 159, 1, 172, 213, 109, 244, 254, 232, 159, 1, 166, 213, - 109, 244, 254, 232, 159, 1, 240, 136, 213, 109, 244, 254, 232, 159, 1, - 195, 115, 213, 109, 244, 254, 232, 159, 1, 199, 152, 213, 109, 244, 254, - 232, 159, 1, 217, 71, 213, 109, 244, 254, 232, 159, 1, 142, 213, 109, - 244, 254, 232, 159, 1, 234, 123, 213, 109, 244, 254, 232, 159, 1, 224, - 146, 213, 109, 244, 254, 232, 159, 1, 183, 213, 109, 244, 254, 232, 159, - 1, 249, 145, 213, 109, 244, 254, 232, 159, 1, 247, 174, 213, 109, 244, - 254, 232, 159, 1, 189, 213, 109, 244, 254, 232, 159, 1, 202, 233, 213, - 109, 244, 254, 232, 159, 1, 176, 213, 109, 244, 254, 232, 159, 1, 213, 6, - 213, 109, 244, 254, 232, 159, 1, 169, 213, 109, 244, 254, 232, 159, 1, - 235, 239, 213, 109, 244, 254, 232, 159, 1, 247, 16, 213, 109, 244, 254, - 232, 159, 1, 63, 213, 109, 244, 254, 232, 159, 1, 69, 213, 109, 244, 254, - 232, 159, 1, 68, 213, 109, 244, 254, 232, 159, 1, 72, 213, 109, 244, 254, - 232, 159, 1, 66, 213, 109, 244, 254, 232, 159, 1, 200, 114, 213, 109, - 244, 254, 232, 159, 1, 230, 210, 213, 109, 244, 254, 232, 159, 1, 48, - 214, 3, 213, 109, 244, 254, 232, 159, 1, 48, 225, 80, 213, 109, 244, 254, - 232, 159, 1, 48, 203, 216, 213, 109, 244, 254, 232, 159, 1, 48, 221, 136, - 213, 109, 244, 254, 232, 159, 1, 48, 218, 55, 213, 109, 244, 254, 232, - 159, 1, 48, 159, 213, 109, 244, 254, 232, 159, 1, 48, 197, 199, 213, 109, - 244, 254, 232, 159, 1, 48, 217, 73, 213, 109, 244, 254, 232, 159, 1, 48, - 196, 148, 213, 109, 244, 254, 232, 159, 209, 250, 152, 221, 240, 213, - 109, 244, 254, 232, 159, 209, 250, 202, 11, 213, 109, 244, 254, 232, 159, - 208, 215, 233, 152, 204, 226, 213, 109, 244, 254, 232, 159, 209, 250, - 152, 181, 235, 130, 213, 109, 244, 254, 232, 159, 209, 250, 152, 235, - 130, 213, 109, 244, 254, 232, 159, 208, 215, 233, 152, 204, 227, 235, - 130, 213, 109, 244, 254, 232, 159, 208, 215, 152, 221, 240, 213, 109, - 244, 254, 232, 159, 208, 215, 202, 11, 213, 109, 244, 254, 232, 159, 208, - 215, 152, 181, 235, 130, 213, 109, 244, 254, 232, 159, 208, 215, 152, - 235, 130, 213, 109, 244, 254, 232, 159, 219, 64, 202, 11, 213, 109, 244, - 254, 232, 159, 233, 152, 204, 227, 199, 131, 213, 109, 244, 254, 232, - 159, 219, 64, 152, 181, 235, 130, 213, 109, 244, 254, 232, 159, 219, 64, - 152, 235, 130, 213, 109, 244, 254, 232, 159, 221, 206, 152, 221, 240, - 213, 109, 244, 254, 232, 159, 221, 206, 202, 11, 213, 109, 244, 254, 232, - 159, 233, 152, 204, 226, 213, 109, 244, 254, 232, 159, 221, 206, 152, - 181, 235, 130, 213, 109, 244, 254, 232, 159, 221, 206, 152, 235, 130, - 213, 109, 244, 254, 232, 159, 233, 152, 204, 227, 235, 130, 248, 195, 1, - 63, 248, 195, 1, 252, 168, 248, 195, 1, 68, 248, 195, 1, 226, 120, 248, - 195, 1, 66, 248, 195, 1, 199, 245, 248, 195, 1, 110, 144, 248, 195, 1, - 110, 209, 182, 248, 195, 1, 110, 159, 248, 195, 1, 69, 248, 195, 1, 251, - 200, 248, 195, 1, 72, 248, 195, 1, 250, 150, 248, 195, 1, 155, 248, 195, - 1, 224, 146, 248, 195, 1, 234, 123, 248, 195, 1, 233, 230, 248, 195, 1, - 217, 71, 248, 195, 1, 247, 174, 248, 195, 1, 247, 16, 248, 195, 1, 225, - 214, 248, 195, 1, 225, 180, 248, 195, 1, 215, 109, 248, 195, 1, 201, 78, - 248, 195, 1, 201, 66, 248, 195, 1, 240, 41, 248, 195, 1, 240, 25, 248, - 195, 1, 216, 86, 248, 195, 1, 189, 248, 195, 1, 202, 233, 248, 195, 1, - 240, 136, 248, 195, 1, 239, 176, 248, 195, 1, 176, 248, 195, 1, 161, 248, - 195, 1, 213, 6, 248, 195, 1, 249, 145, 248, 195, 1, 248, 197, 248, 195, - 1, 166, 248, 195, 1, 164, 248, 195, 1, 169, 248, 195, 1, 172, 248, 195, - 1, 199, 152, 248, 195, 1, 207, 50, 248, 195, 1, 205, 80, 248, 195, 1, - 183, 248, 195, 1, 142, 248, 195, 18, 2, 252, 168, 248, 195, 18, 2, 68, - 248, 195, 18, 2, 226, 120, 248, 195, 18, 2, 66, 248, 195, 18, 2, 199, - 245, 248, 195, 18, 2, 110, 144, 248, 195, 18, 2, 110, 209, 182, 248, 195, - 18, 2, 110, 159, 248, 195, 18, 2, 69, 248, 195, 18, 2, 251, 200, 248, - 195, 18, 2, 72, 248, 195, 18, 2, 250, 150, 248, 195, 2, 247, 133, 248, - 195, 2, 251, 51, 248, 195, 2, 199, 2, 248, 195, 2, 199, 7, 248, 195, 2, - 250, 132, 248, 195, 240, 88, 248, 195, 52, 240, 88, 248, 195, 197, 9, - 207, 90, 248, 195, 234, 87, 235, 133, 248, 195, 234, 87, 235, 132, 248, - 195, 17, 195, 79, 248, 195, 17, 100, 248, 195, 17, 102, 248, 195, 17, - 134, 248, 195, 17, 136, 248, 195, 17, 146, 248, 195, 17, 167, 248, 195, - 17, 178, 248, 195, 17, 171, 248, 195, 17, 182, 248, 195, 31, 100, 248, - 195, 31, 102, 248, 195, 31, 134, 248, 195, 31, 136, 248, 195, 31, 146, - 248, 195, 31, 167, 248, 195, 31, 178, 248, 195, 31, 171, 248, 195, 31, - 182, 248, 195, 31, 203, 23, 248, 195, 31, 200, 234, 248, 195, 31, 202, - 177, 248, 195, 31, 235, 14, 248, 195, 31, 235, 145, 248, 195, 31, 206, - 13, 248, 195, 31, 207, 65, 248, 195, 31, 237, 20, 248, 195, 31, 216, 174, - 248, 195, 231, 56, 200, 50, 78, 220, 30, 232, 138, 78, 220, 30, 117, 207, - 42, 220, 30, 1, 155, 220, 30, 1, 224, 146, 220, 30, 1, 234, 123, 220, 30, - 1, 217, 71, 220, 30, 1, 247, 174, 220, 30, 1, 247, 16, 220, 30, 1, 225, - 214, 220, 30, 1, 215, 109, 220, 30, 1, 189, 220, 30, 1, 202, 233, 220, - 30, 1, 240, 136, 220, 30, 1, 176, 220, 30, 1, 161, 220, 30, 1, 213, 6, - 220, 30, 1, 249, 145, 220, 30, 1, 166, 220, 30, 1, 201, 113, 220, 30, 1, - 201, 103, 220, 30, 1, 237, 156, 220, 30, 1, 197, 166, 220, 30, 1, 195, - 74, 220, 30, 1, 195, 115, 220, 30, 1, 255, 176, 220, 30, 1, 164, 220, 30, - 1, 169, 220, 30, 1, 172, 220, 30, 1, 207, 50, 220, 30, 1, 183, 220, 30, - 1, 142, 220, 30, 1, 63, 220, 30, 204, 152, 1, 155, 220, 30, 204, 152, 1, - 224, 146, 220, 30, 204, 152, 1, 234, 123, 220, 30, 204, 152, 1, 217, 71, - 220, 30, 204, 152, 1, 247, 174, 220, 30, 204, 152, 1, 247, 16, 220, 30, - 204, 152, 1, 225, 214, 220, 30, 204, 152, 1, 215, 109, 220, 30, 204, 152, - 1, 189, 220, 30, 204, 152, 1, 202, 233, 220, 30, 204, 152, 1, 240, 136, - 220, 30, 204, 152, 1, 176, 220, 30, 204, 152, 1, 161, 220, 30, 204, 152, - 1, 213, 6, 220, 30, 204, 152, 1, 249, 145, 220, 30, 204, 152, 1, 166, - 220, 30, 204, 152, 1, 201, 113, 220, 30, 204, 152, 1, 201, 103, 220, 30, - 204, 152, 1, 237, 156, 220, 30, 204, 152, 1, 197, 166, 220, 30, 204, 152, - 1, 195, 74, 220, 30, 204, 152, 1, 195, 115, 220, 30, 204, 152, 1, 164, - 220, 30, 204, 152, 1, 169, 220, 30, 204, 152, 1, 172, 220, 30, 204, 152, - 1, 207, 50, 220, 30, 204, 152, 1, 183, 220, 30, 204, 152, 1, 142, 220, - 30, 204, 152, 1, 63, 220, 30, 18, 2, 252, 168, 220, 30, 18, 2, 68, 220, - 30, 18, 2, 66, 220, 30, 18, 2, 69, 220, 30, 18, 2, 72, 220, 30, 2, 251, - 51, 220, 30, 2, 247, 133, 220, 14, 121, 1, 63, 220, 14, 121, 1, 252, 168, - 220, 14, 121, 1, 68, 220, 14, 121, 1, 226, 120, 220, 14, 121, 1, 66, 220, - 14, 121, 1, 199, 245, 220, 14, 121, 1, 69, 220, 14, 121, 1, 251, 200, - 220, 14, 121, 1, 72, 220, 14, 121, 1, 250, 150, 220, 14, 121, 1, 155, - 220, 14, 121, 1, 224, 146, 220, 14, 121, 1, 234, 123, 220, 14, 121, 1, - 233, 230, 220, 14, 121, 1, 217, 71, 220, 14, 121, 1, 247, 174, 220, 14, - 121, 1, 247, 16, 220, 14, 121, 1, 225, 214, 220, 14, 121, 1, 225, 180, - 220, 14, 121, 1, 215, 109, 220, 14, 121, 1, 201, 78, 220, 14, 121, 1, - 201, 66, 220, 14, 121, 1, 240, 41, 220, 14, 121, 1, 240, 25, 220, 14, - 121, 1, 216, 86, 220, 14, 121, 1, 189, 220, 14, 121, 1, 202, 233, 220, - 14, 121, 1, 240, 136, 220, 14, 121, 1, 239, 176, 220, 14, 121, 1, 176, - 220, 14, 121, 1, 161, 220, 14, 121, 1, 213, 6, 220, 14, 121, 1, 249, 145, - 220, 14, 121, 1, 248, 197, 220, 14, 121, 1, 166, 220, 14, 121, 1, 164, - 220, 14, 121, 1, 169, 220, 14, 121, 1, 172, 220, 14, 121, 1, 199, 152, - 220, 14, 121, 1, 207, 50, 220, 14, 121, 1, 205, 80, 220, 14, 121, 1, 183, - 220, 14, 121, 1, 142, 220, 14, 121, 1, 222, 37, 220, 14, 121, 1, 223, - 201, 220, 14, 121, 1, 225, 130, 220, 14, 121, 1, 201, 217, 220, 14, 121, - 18, 2, 252, 168, 220, 14, 121, 18, 2, 68, 220, 14, 121, 18, 2, 226, 120, - 220, 14, 121, 18, 2, 66, 220, 14, 121, 18, 2, 199, 245, 220, 14, 121, 18, - 2, 110, 144, 220, 14, 121, 18, 2, 69, 220, 14, 121, 18, 2, 251, 200, 220, - 14, 121, 18, 2, 72, 220, 14, 121, 18, 2, 250, 150, 220, 14, 121, 2, 251, - 51, 220, 14, 121, 2, 199, 2, 220, 14, 121, 2, 215, 149, 220, 14, 121, 2, - 247, 135, 220, 14, 121, 2, 232, 227, 220, 14, 121, 199, 7, 220, 14, 121, - 210, 115, 220, 14, 121, 210, 247, 220, 14, 121, 17, 195, 79, 220, 14, - 121, 17, 100, 220, 14, 121, 17, 102, 220, 14, 121, 17, 134, 220, 14, 121, - 17, 136, 220, 14, 121, 17, 146, 220, 14, 121, 17, 167, 220, 14, 121, 17, - 178, 220, 14, 121, 17, 171, 220, 14, 121, 17, 182, 233, 54, 121, 1, 63, - 233, 54, 121, 1, 252, 168, 233, 54, 121, 1, 68, 233, 54, 121, 1, 226, - 120, 233, 54, 121, 1, 66, 233, 54, 121, 1, 199, 245, 233, 54, 121, 1, - 237, 54, 233, 54, 121, 1, 251, 200, 233, 54, 121, 1, 214, 102, 233, 54, - 121, 1, 250, 150, 233, 54, 121, 1, 164, 233, 54, 121, 1, 199, 152, 233, - 54, 121, 1, 249, 145, 233, 54, 121, 1, 248, 197, 233, 54, 121, 1, 166, - 233, 54, 121, 1, 155, 233, 54, 121, 1, 224, 146, 233, 54, 121, 1, 189, - 233, 54, 121, 1, 202, 233, 233, 54, 121, 1, 172, 233, 54, 121, 1, 234, - 123, 233, 54, 121, 1, 233, 230, 233, 54, 121, 1, 240, 136, 233, 54, 121, - 1, 239, 176, 233, 54, 121, 1, 176, 233, 54, 121, 1, 247, 174, 233, 54, - 121, 1, 247, 16, 233, 54, 121, 1, 201, 78, 233, 54, 121, 1, 201, 66, 233, - 54, 121, 1, 222, 37, 233, 54, 121, 1, 225, 214, 233, 54, 121, 1, 225, - 180, 233, 54, 121, 1, 240, 41, 233, 54, 121, 1, 240, 25, 233, 54, 121, 1, - 217, 71, 233, 54, 121, 1, 161, 233, 54, 121, 1, 213, 6, 233, 54, 121, 1, - 142, 233, 54, 121, 1, 169, 233, 54, 121, 1, 183, 233, 54, 121, 18, 2, - 252, 168, 233, 54, 121, 18, 2, 68, 233, 54, 121, 18, 2, 226, 120, 233, - 54, 121, 18, 2, 66, 233, 54, 121, 18, 2, 199, 245, 233, 54, 121, 18, 2, - 237, 54, 233, 54, 121, 18, 2, 251, 200, 233, 54, 121, 18, 2, 214, 102, - 233, 54, 121, 18, 2, 250, 150, 233, 54, 121, 2, 251, 51, 233, 54, 121, 2, - 199, 2, 233, 54, 121, 199, 7, 233, 54, 121, 214, 127, 233, 54, 121, 17, - 195, 79, 233, 54, 121, 17, 100, 233, 54, 121, 17, 102, 233, 54, 121, 17, - 134, 233, 54, 121, 17, 136, 233, 54, 121, 17, 146, 233, 54, 121, 17, 167, - 233, 54, 121, 17, 178, 233, 54, 121, 17, 171, 233, 54, 121, 17, 182, 220, - 71, 1, 155, 220, 71, 1, 234, 123, 220, 71, 1, 217, 71, 220, 71, 1, 161, - 220, 71, 1, 249, 145, 220, 71, 1, 166, 220, 71, 1, 189, 220, 71, 1, 240, - 136, 220, 71, 1, 176, 220, 71, 1, 247, 174, 220, 71, 1, 225, 214, 220, - 71, 1, 215, 109, 220, 71, 1, 164, 220, 71, 1, 169, 220, 71, 1, 172, 220, - 71, 1, 199, 152, 220, 71, 1, 183, 220, 71, 1, 63, 220, 71, 251, 93, 220, - 71, 18, 2, 68, 220, 71, 18, 2, 66, 220, 71, 18, 2, 69, 220, 71, 18, 2, - 72, 220, 71, 213, 121, 220, 71, 236, 222, 77, 208, 132, 42, 191, 97, 202, - 151, 42, 191, 97, 214, 115, 42, 191, 97, 237, 23, 42, 191, 97, 206, 11, - 42, 191, 97, 235, 17, 42, 191, 97, 202, 173, 42, 191, 115, 237, 22, 42, - 191, 115, 206, 10, 42, 191, 97, 200, 237, 42, 191, 97, 206, 20, 42, 191, - 97, 206, 19, 42, 191, 97, 203, 14, 42, 191, 97, 237, 26, 42, 191, 115, - 200, 236, 42, 191, 115, 206, 18, 42, 191, 97, 235, 148, 42, 191, 97, 211, - 87, 42, 191, 97, 232, 224, 42, 191, 97, 232, 223, 42, 191, 115, 211, 85, - 42, 191, 237, 233, 235, 223, 224, 79, 42, 2, 217, 102, 42, 2, 247, 21, - 42, 2, 252, 119, 42, 2, 199, 233, 42, 2, 218, 82, 42, 2, 223, 151, 42, 2, - 213, 112, 42, 2, 218, 126, 42, 2, 225, 52, 42, 2, 213, 189, 42, 2, 212, - 93, 42, 2, 199, 137, 42, 2, 213, 238, 42, 2, 223, 140, 42, 2, 199, 108, - 42, 197, 85, 241, 33, 55, 42, 237, 204, 241, 33, 55, 42, 222, 237, 55, - 42, 208, 234, 213, 192, 55, 42, 201, 212, 241, 74, 55, 42, 201, 212, 31, - 55, 42, 241, 16, 55, 42, 26, 214, 168, 55, 42, 205, 129, 55, 42, 201, - 228, 55, 42, 226, 87, 212, 76, 55, 42, 205, 1, 234, 235, 55, 42, 2, 218, - 86, 42, 2, 199, 145, 42, 211, 214, 236, 222, 77, 202, 237, 10, 2, 63, 10, - 2, 39, 24, 63, 10, 2, 39, 24, 249, 127, 10, 2, 39, 24, 234, 92, 203, 12, - 10, 2, 39, 24, 142, 10, 2, 39, 24, 226, 122, 10, 2, 39, 24, 223, 61, 233, - 52, 10, 2, 39, 24, 218, 93, 10, 2, 39, 24, 209, 1, 10, 2, 254, 177, 10, - 2, 252, 117, 10, 2, 252, 118, 24, 250, 193, 10, 2, 252, 118, 24, 237, - 187, 233, 52, 10, 2, 252, 118, 24, 234, 105, 10, 2, 252, 118, 24, 234, - 92, 203, 12, 10, 2, 252, 118, 24, 142, 10, 2, 252, 118, 24, 226, 123, - 233, 52, 10, 2, 252, 118, 24, 226, 96, 10, 2, 252, 118, 24, 223, 62, 10, - 2, 252, 118, 24, 206, 239, 10, 2, 252, 118, 24, 118, 98, 118, 98, 66, 10, - 2, 252, 118, 233, 52, 10, 2, 252, 34, 10, 2, 252, 35, 24, 249, 106, 10, - 2, 252, 35, 24, 234, 92, 203, 12, 10, 2, 252, 35, 24, 219, 208, 98, 236, - 230, 10, 2, 252, 35, 24, 207, 48, 10, 2, 252, 35, 24, 203, 129, 10, 2, - 252, 6, 10, 2, 251, 181, 10, 2, 251, 182, 24, 236, 157, 10, 2, 251, 182, - 24, 206, 201, 98, 233, 164, 10, 2, 251, 173, 10, 2, 251, 174, 24, 251, - 173, 10, 2, 251, 174, 24, 239, 105, 10, 2, 251, 174, 24, 233, 164, 10, 2, - 251, 174, 24, 142, 10, 2, 251, 174, 24, 225, 40, 10, 2, 251, 174, 24, - 224, 101, 10, 2, 251, 174, 24, 206, 255, 10, 2, 251, 174, 24, 199, 253, - 10, 2, 251, 170, 10, 2, 251, 162, 10, 2, 251, 119, 10, 2, 251, 120, 24, - 206, 255, 10, 2, 251, 106, 10, 2, 251, 107, 127, 251, 106, 10, 2, 251, - 107, 115, 202, 76, 10, 2, 251, 107, 98, 217, 235, 214, 79, 251, 107, 98, - 217, 234, 10, 2, 251, 107, 98, 217, 235, 205, 93, 10, 2, 251, 71, 10, 2, - 251, 41, 10, 2, 251, 7, 10, 2, 251, 8, 24, 223, 154, 10, 2, 250, 235, 10, - 2, 250, 200, 10, 2, 250, 195, 10, 2, 250, 196, 195, 29, 203, 12, 10, 2, - 250, 196, 225, 44, 203, 12, 10, 2, 250, 196, 127, 250, 196, 201, 29, 127, - 201, 29, 201, 29, 127, 201, 29, 213, 163, 10, 2, 250, 196, 127, 250, 196, - 127, 250, 195, 10, 2, 250, 196, 127, 250, 196, 127, 250, 196, 241, 55, - 250, 196, 127, 250, 196, 127, 250, 195, 10, 2, 250, 193, 10, 2, 250, 189, - 10, 2, 249, 145, 10, 2, 249, 127, 10, 2, 249, 121, 10, 2, 249, 113, 10, - 2, 249, 107, 10, 2, 249, 108, 127, 249, 107, 10, 2, 249, 106, 10, 2, 154, - 10, 2, 249, 79, 10, 2, 248, 184, 10, 2, 248, 185, 24, 63, 10, 2, 248, - 185, 24, 234, 83, 10, 2, 248, 185, 24, 226, 123, 233, 52, 10, 2, 248, 21, - 10, 2, 248, 22, 127, 248, 22, 252, 117, 10, 2, 248, 22, 127, 248, 22, - 200, 72, 10, 2, 248, 22, 241, 55, 248, 21, 10, 2, 247, 255, 10, 2, 248, - 0, 127, 247, 255, 10, 2, 247, 244, 10, 2, 247, 243, 10, 2, 240, 136, 10, - 2, 240, 126, 10, 2, 240, 127, 224, 60, 24, 39, 98, 220, 12, 10, 2, 240, - 127, 224, 60, 24, 251, 119, 10, 2, 240, 127, 224, 60, 24, 249, 106, 10, - 2, 240, 127, 224, 60, 24, 248, 184, 10, 2, 240, 127, 224, 60, 24, 234, - 123, 10, 2, 240, 127, 224, 60, 24, 234, 124, 98, 220, 12, 10, 2, 240, - 127, 224, 60, 24, 233, 192, 10, 2, 240, 127, 224, 60, 24, 233, 173, 10, - 2, 240, 127, 224, 60, 24, 233, 65, 10, 2, 240, 127, 224, 60, 24, 142, 10, - 2, 240, 127, 224, 60, 24, 226, 1, 10, 2, 240, 127, 224, 60, 24, 226, 2, - 98, 221, 191, 10, 2, 240, 127, 224, 60, 24, 225, 25, 10, 2, 240, 127, - 224, 60, 24, 172, 10, 2, 240, 127, 224, 60, 24, 221, 191, 10, 2, 240, - 127, 224, 60, 24, 221, 192, 98, 220, 11, 10, 2, 240, 127, 224, 60, 24, - 221, 174, 10, 2, 240, 127, 224, 60, 24, 217, 118, 10, 2, 240, 127, 224, - 60, 24, 213, 164, 98, 213, 163, 10, 2, 240, 127, 224, 60, 24, 206, 112, - 10, 2, 240, 127, 224, 60, 24, 203, 129, 10, 2, 240, 127, 224, 60, 24, - 200, 116, 98, 233, 173, 10, 2, 240, 127, 224, 60, 24, 199, 253, 10, 2, - 240, 98, 10, 2, 240, 75, 10, 2, 240, 74, 10, 2, 240, 73, 10, 2, 239, 152, - 10, 2, 239, 134, 10, 2, 239, 107, 10, 2, 239, 108, 24, 206, 255, 10, 2, - 239, 105, 10, 2, 239, 95, 10, 2, 239, 96, 224, 241, 118, 233, 53, 239, - 75, 10, 2, 239, 75, 10, 2, 237, 201, 10, 2, 237, 202, 127, 237, 201, 10, - 2, 237, 202, 233, 52, 10, 2, 237, 202, 206, 236, 10, 2, 237, 199, 10, 2, - 237, 200, 24, 236, 138, 10, 2, 237, 198, 10, 2, 237, 195, 10, 2, 237, - 194, 10, 2, 237, 193, 10, 2, 237, 188, 10, 2, 237, 186, 10, 2, 237, 187, - 233, 52, 10, 2, 237, 187, 233, 53, 233, 52, 10, 2, 237, 185, 10, 2, 237, - 178, 10, 2, 69, 10, 2, 237, 136, 24, 213, 163, 10, 2, 237, 136, 127, 237, - 136, 215, 139, 127, 215, 138, 10, 2, 237, 83, 10, 2, 237, 84, 24, 39, 98, - 233, 4, 98, 240, 136, 10, 2, 237, 84, 24, 234, 83, 10, 2, 237, 84, 24, - 219, 78, 10, 2, 237, 84, 24, 208, 241, 10, 2, 237, 84, 24, 206, 255, 10, - 2, 237, 84, 24, 66, 10, 2, 237, 56, 10, 2, 237, 44, 10, 2, 237, 7, 10, 2, - 236, 230, 10, 2, 236, 231, 24, 234, 91, 10, 2, 236, 231, 24, 234, 92, - 203, 12, 10, 2, 236, 231, 24, 219, 207, 10, 2, 236, 231, 241, 55, 236, - 230, 10, 2, 236, 231, 214, 79, 236, 230, 10, 2, 236, 231, 205, 93, 10, 2, - 236, 160, 10, 2, 236, 157, 10, 2, 236, 138, 10, 2, 236, 54, 10, 2, 236, - 55, 24, 63, 10, 2, 236, 55, 24, 39, 98, 222, 251, 10, 2, 236, 55, 24, 39, - 98, 222, 252, 24, 222, 251, 10, 2, 236, 55, 24, 251, 106, 10, 2, 236, 55, - 24, 249, 127, 10, 2, 236, 55, 24, 237, 187, 233, 52, 10, 2, 236, 55, 24, - 237, 187, 233, 53, 233, 52, 10, 2, 236, 55, 24, 142, 10, 2, 236, 55, 24, - 233, 4, 233, 52, 10, 2, 236, 55, 24, 226, 123, 233, 52, 10, 2, 236, 55, - 24, 224, 240, 10, 2, 236, 55, 24, 224, 241, 205, 93, 10, 2, 236, 55, 24, - 223, 178, 10, 2, 236, 55, 24, 172, 10, 2, 236, 55, 24, 222, 252, 24, 222, - 251, 10, 2, 236, 55, 24, 222, 109, 10, 2, 236, 55, 24, 221, 191, 10, 2, - 236, 55, 24, 200, 115, 10, 2, 236, 55, 24, 200, 104, 10, 2, 234, 123, 10, - 2, 234, 124, 233, 52, 10, 2, 234, 121, 10, 2, 234, 122, 24, 39, 98, 240, - 137, 98, 142, 10, 2, 234, 122, 24, 39, 98, 142, 10, 2, 234, 122, 24, 39, - 98, 226, 122, 10, 2, 234, 122, 24, 252, 35, 203, 13, 98, 203, 154, 10, 2, - 234, 122, 24, 251, 106, 10, 2, 234, 122, 24, 250, 195, 10, 2, 234, 122, - 24, 250, 194, 98, 234, 105, 10, 2, 234, 122, 24, 249, 127, 10, 2, 234, - 122, 24, 249, 80, 98, 169, 10, 2, 234, 122, 24, 247, 244, 10, 2, 234, - 122, 24, 247, 245, 98, 169, 10, 2, 234, 122, 24, 240, 136, 10, 2, 234, - 122, 24, 239, 152, 10, 2, 234, 122, 24, 239, 108, 24, 206, 255, 10, 2, - 234, 122, 24, 237, 199, 10, 2, 234, 122, 24, 237, 7, 10, 2, 234, 122, 24, - 237, 8, 98, 172, 10, 2, 234, 122, 24, 236, 230, 10, 2, 234, 122, 24, 236, - 231, 24, 234, 92, 203, 12, 10, 2, 234, 122, 24, 234, 92, 203, 12, 10, 2, - 234, 122, 24, 234, 83, 10, 2, 234, 122, 24, 233, 192, 10, 2, 234, 122, - 24, 233, 190, 10, 2, 234, 122, 24, 233, 191, 98, 63, 10, 2, 234, 122, 24, - 233, 174, 98, 204, 172, 10, 2, 234, 122, 24, 233, 4, 98, 221, 192, 98, - 236, 138, 10, 2, 234, 122, 24, 232, 228, 10, 2, 234, 122, 24, 232, 229, - 98, 172, 10, 2, 234, 122, 24, 232, 72, 98, 222, 109, 10, 2, 234, 122, 24, - 231, 67, 10, 2, 234, 122, 24, 226, 123, 233, 52, 10, 2, 234, 122, 24, - 225, 243, 98, 231, 76, 98, 250, 195, 10, 2, 234, 122, 24, 225, 25, 10, 2, - 234, 122, 24, 224, 240, 10, 2, 234, 122, 24, 224, 87, 10, 2, 234, 122, - 24, 224, 88, 98, 222, 251, 10, 2, 234, 122, 24, 223, 179, 98, 251, 106, - 10, 2, 234, 122, 24, 172, 10, 2, 234, 122, 24, 219, 208, 98, 236, 230, - 10, 2, 234, 122, 24, 219, 78, 10, 2, 234, 122, 24, 215, 138, 10, 2, 234, - 122, 24, 215, 139, 127, 215, 138, 10, 2, 234, 122, 24, 161, 10, 2, 234, - 122, 24, 208, 241, 10, 2, 234, 122, 24, 208, 204, 10, 2, 234, 122, 24, - 206, 255, 10, 2, 234, 122, 24, 207, 0, 98, 201, 10, 10, 2, 234, 122, 24, - 206, 221, 10, 2, 234, 122, 24, 204, 117, 10, 2, 234, 122, 24, 203, 129, - 10, 2, 234, 122, 24, 66, 10, 2, 234, 122, 24, 200, 104, 10, 2, 234, 122, - 24, 200, 105, 98, 237, 201, 10, 2, 234, 122, 127, 234, 121, 10, 2, 234, - 116, 10, 2, 234, 117, 241, 55, 234, 116, 10, 2, 234, 114, 10, 2, 234, - 115, 127, 234, 115, 234, 84, 127, 234, 83, 10, 2, 234, 105, 10, 2, 234, - 106, 234, 115, 127, 234, 115, 234, 84, 127, 234, 83, 10, 2, 234, 104, 10, - 2, 234, 102, 10, 2, 234, 93, 10, 2, 234, 91, 10, 2, 234, 92, 203, 12, 10, - 2, 234, 92, 127, 234, 91, 10, 2, 234, 92, 241, 55, 234, 91, 10, 2, 234, - 83, 10, 2, 234, 82, 10, 2, 234, 76, 10, 2, 234, 17, 10, 2, 234, 18, 24, - 223, 154, 10, 2, 233, 192, 10, 2, 233, 193, 24, 69, 10, 2, 233, 193, 24, - 66, 10, 2, 233, 193, 241, 55, 233, 192, 10, 2, 233, 190, 10, 2, 233, 191, - 127, 233, 190, 10, 2, 233, 191, 241, 55, 233, 190, 10, 2, 233, 187, 10, - 2, 233, 173, 10, 2, 233, 174, 233, 52, 10, 2, 233, 171, 10, 2, 233, 172, - 24, 39, 98, 226, 122, 10, 2, 233, 172, 24, 234, 92, 203, 12, 10, 2, 233, - 172, 24, 226, 122, 10, 2, 233, 172, 24, 221, 192, 98, 226, 122, 10, 2, - 233, 172, 24, 161, 10, 2, 233, 166, 10, 2, 233, 164, 10, 2, 233, 165, - 241, 55, 233, 164, 10, 2, 233, 165, 24, 249, 127, 10, 2, 233, 165, 24, - 203, 129, 10, 2, 233, 165, 203, 12, 10, 2, 233, 76, 10, 2, 233, 77, 241, - 55, 233, 76, 10, 2, 233, 74, 10, 2, 233, 75, 24, 225, 25, 10, 2, 233, 75, - 24, 225, 26, 24, 226, 123, 233, 52, 10, 2, 233, 75, 24, 215, 138, 10, 2, - 233, 75, 24, 208, 242, 98, 201, 28, 10, 2, 233, 75, 233, 52, 10, 2, 233, - 65, 10, 2, 233, 66, 24, 39, 98, 223, 154, 10, 2, 233, 66, 24, 223, 154, - 10, 2, 233, 66, 127, 233, 66, 221, 182, 10, 2, 233, 57, 10, 2, 233, 55, - 10, 2, 233, 56, 24, 206, 255, 10, 2, 233, 46, 10, 2, 233, 45, 10, 2, 233, - 41, 10, 2, 233, 40, 10, 2, 142, 10, 2, 233, 4, 203, 12, 10, 2, 233, 4, - 233, 52, 10, 2, 232, 228, 10, 2, 232, 71, 10, 2, 232, 72, 24, 250, 195, - 10, 2, 232, 72, 24, 250, 193, 10, 2, 232, 72, 24, 249, 127, 10, 2, 232, - 72, 24, 239, 75, 10, 2, 232, 72, 24, 234, 114, 10, 2, 232, 72, 24, 224, - 76, 10, 2, 232, 72, 24, 215, 138, 10, 2, 232, 72, 24, 206, 255, 10, 2, - 232, 72, 24, 66, 10, 2, 231, 75, 10, 2, 231, 67, 10, 2, 231, 68, 24, 251, - 106, 10, 2, 231, 68, 24, 232, 228, 10, 2, 231, 68, 24, 224, 240, 10, 2, - 231, 68, 24, 222, 53, 10, 2, 231, 68, 24, 200, 104, 10, 2, 231, 63, 10, - 2, 68, 10, 2, 230, 249, 63, 10, 2, 230, 205, 10, 2, 226, 150, 10, 2, 226, - 151, 127, 226, 151, 247, 244, 10, 2, 226, 151, 127, 226, 151, 205, 93, - 10, 2, 226, 125, 10, 2, 226, 122, 10, 2, 226, 123, 239, 134, 10, 2, 226, - 123, 210, 72, 10, 2, 226, 123, 127, 226, 123, 206, 205, 127, 206, 205, - 200, 105, 127, 200, 104, 10, 2, 226, 123, 233, 52, 10, 2, 226, 114, 10, - 2, 226, 115, 24, 234, 92, 203, 12, 10, 2, 226, 113, 10, 2, 226, 103, 10, - 2, 226, 104, 24, 203, 129, 10, 2, 226, 104, 241, 55, 226, 103, 10, 2, - 226, 104, 214, 79, 226, 103, 10, 2, 226, 104, 205, 93, 10, 2, 226, 96, - 10, 2, 226, 86, 10, 2, 226, 1, 10, 2, 225, 242, 10, 2, 155, 10, 2, 225, - 70, 24, 63, 10, 2, 225, 70, 24, 252, 6, 10, 2, 225, 70, 24, 252, 7, 98, - 223, 178, 10, 2, 225, 70, 24, 250, 193, 10, 2, 225, 70, 24, 249, 127, 10, - 2, 225, 70, 24, 249, 106, 10, 2, 225, 70, 24, 154, 10, 2, 225, 70, 24, - 248, 184, 10, 2, 225, 70, 24, 236, 157, 10, 2, 225, 70, 24, 236, 138, 10, - 2, 225, 70, 24, 234, 123, 10, 2, 225, 70, 24, 234, 105, 10, 2, 225, 70, - 24, 234, 92, 203, 12, 10, 2, 225, 70, 24, 234, 83, 10, 2, 225, 70, 24, - 234, 84, 98, 207, 49, 98, 63, 10, 2, 225, 70, 24, 233, 192, 10, 2, 225, - 70, 24, 233, 173, 10, 2, 225, 70, 24, 233, 165, 98, 208, 204, 10, 2, 225, - 70, 24, 233, 165, 241, 55, 233, 164, 10, 2, 225, 70, 24, 233, 76, 10, 2, - 225, 70, 24, 233, 45, 10, 2, 225, 70, 24, 226, 122, 10, 2, 225, 70, 24, - 226, 103, 10, 2, 225, 70, 24, 225, 25, 10, 2, 225, 70, 24, 224, 101, 10, - 2, 225, 70, 24, 224, 87, 10, 2, 225, 70, 24, 222, 109, 10, 2, 225, 70, - 24, 221, 191, 10, 2, 225, 70, 24, 219, 207, 10, 2, 225, 70, 24, 219, 208, - 98, 237, 201, 10, 2, 225, 70, 24, 219, 208, 98, 233, 192, 10, 2, 225, 70, - 24, 219, 208, 98, 203, 68, 10, 2, 225, 70, 24, 219, 78, 10, 2, 225, 70, - 24, 219, 79, 98, 215, 133, 10, 2, 225, 70, 24, 217, 118, 10, 2, 225, 70, - 24, 215, 138, 10, 2, 225, 70, 24, 212, 220, 10, 2, 225, 70, 24, 209, 140, - 10, 2, 225, 70, 24, 183, 10, 2, 225, 70, 24, 208, 204, 10, 2, 225, 70, - 24, 207, 50, 10, 2, 225, 70, 24, 206, 255, 10, 2, 225, 70, 24, 206, 221, - 10, 2, 225, 70, 24, 206, 151, 10, 2, 225, 70, 24, 206, 91, 10, 2, 225, - 70, 24, 204, 126, 10, 2, 225, 70, 24, 203, 101, 10, 2, 225, 70, 24, 66, - 10, 2, 225, 70, 24, 200, 115, 10, 2, 225, 70, 24, 200, 104, 10, 2, 225, - 70, 24, 200, 75, 24, 161, 10, 2, 225, 70, 24, 199, 253, 10, 2, 225, 70, - 24, 195, 33, 10, 2, 225, 56, 10, 2, 225, 57, 241, 55, 225, 56, 10, 2, - 225, 45, 10, 2, 225, 42, 10, 2, 225, 40, 10, 2, 225, 39, 10, 2, 225, 37, - 10, 2, 225, 38, 127, 225, 37, 10, 2, 225, 25, 10, 2, 225, 26, 24, 226, - 123, 233, 52, 10, 2, 225, 21, 10, 2, 225, 22, 24, 249, 127, 10, 2, 225, - 22, 241, 55, 225, 21, 10, 2, 225, 19, 10, 2, 225, 18, 10, 2, 224, 240, - 10, 2, 224, 241, 223, 63, 24, 118, 127, 223, 63, 24, 66, 10, 2, 224, 241, - 127, 224, 241, 223, 63, 24, 118, 127, 223, 63, 24, 66, 10, 2, 224, 173, - 10, 2, 224, 101, 10, 2, 224, 102, 24, 249, 127, 10, 2, 224, 102, 24, 66, - 10, 2, 224, 102, 24, 200, 104, 10, 2, 224, 87, 10, 2, 224, 76, 10, 2, - 224, 62, 10, 2, 224, 61, 10, 2, 224, 59, 10, 2, 224, 60, 127, 224, 59, - 10, 2, 223, 187, 10, 2, 223, 188, 127, 232, 72, 24, 250, 194, 223, 188, - 127, 232, 72, 24, 250, 193, 10, 2, 223, 178, 10, 2, 223, 176, 10, 2, 223, - 177, 199, 132, 20, 10, 2, 223, 175, 10, 2, 223, 167, 10, 2, 223, 168, - 233, 52, 10, 2, 223, 166, 10, 2, 223, 154, 10, 2, 223, 155, 214, 79, 223, - 154, 10, 2, 223, 147, 10, 2, 223, 124, 10, 2, 172, 10, 2, 223, 62, 10, 2, - 223, 63, 24, 63, 10, 2, 223, 63, 24, 39, 98, 240, 137, 98, 142, 10, 2, - 223, 63, 24, 39, 98, 234, 83, 10, 2, 223, 63, 24, 39, 98, 222, 251, 10, - 2, 223, 63, 24, 251, 173, 10, 2, 223, 63, 24, 251, 106, 10, 2, 223, 63, - 24, 250, 196, 195, 29, 203, 12, 10, 2, 223, 63, 24, 249, 127, 10, 2, 223, - 63, 24, 248, 184, 10, 2, 223, 63, 24, 240, 75, 10, 2, 223, 63, 24, 236, - 230, 10, 2, 223, 63, 24, 234, 123, 10, 2, 223, 63, 24, 234, 83, 10, 2, - 223, 63, 24, 233, 65, 10, 2, 223, 63, 24, 233, 66, 98, 233, 65, 10, 2, - 223, 63, 24, 142, 10, 2, 223, 63, 24, 232, 228, 10, 2, 223, 63, 24, 232, - 72, 24, 215, 138, 10, 2, 223, 63, 24, 226, 123, 233, 52, 10, 2, 223, 63, - 24, 226, 103, 10, 2, 223, 63, 24, 226, 104, 98, 142, 10, 2, 223, 63, 24, - 226, 104, 98, 221, 191, 10, 2, 223, 63, 24, 224, 101, 10, 2, 223, 63, 24, - 224, 76, 10, 2, 223, 63, 24, 223, 178, 10, 2, 223, 63, 24, 223, 167, 10, - 2, 223, 63, 24, 223, 168, 98, 232, 72, 98, 63, 10, 2, 223, 63, 24, 223, - 62, 10, 2, 223, 63, 24, 222, 53, 10, 2, 223, 63, 24, 221, 191, 10, 2, - 223, 63, 24, 221, 176, 10, 2, 223, 63, 24, 219, 207, 10, 2, 223, 63, 24, - 219, 208, 98, 236, 230, 10, 2, 223, 63, 24, 218, 93, 10, 2, 223, 63, 24, - 217, 118, 10, 2, 223, 63, 24, 207, 0, 98, 204, 117, 10, 2, 223, 63, 24, - 206, 201, 98, 233, 165, 98, 236, 157, 10, 2, 223, 63, 24, 206, 201, 98, - 233, 165, 203, 12, 10, 2, 223, 63, 24, 206, 149, 10, 2, 223, 63, 24, 206, - 150, 98, 206, 149, 10, 2, 223, 63, 24, 204, 117, 10, 2, 223, 63, 24, 203, - 143, 10, 2, 223, 63, 24, 203, 129, 10, 2, 223, 63, 24, 203, 69, 98, 39, - 98, 204, 173, 98, 176, 10, 2, 223, 63, 24, 66, 10, 2, 223, 63, 24, 118, - 98, 63, 10, 2, 223, 63, 24, 118, 98, 118, 98, 66, 10, 2, 223, 63, 24, - 200, 116, 98, 250, 195, 10, 2, 223, 63, 24, 200, 104, 10, 2, 223, 63, 24, - 199, 253, 10, 2, 223, 63, 205, 93, 10, 2, 223, 60, 10, 2, 223, 61, 24, - 206, 255, 10, 2, 223, 61, 24, 207, 0, 98, 204, 117, 10, 2, 223, 61, 233, - 52, 10, 2, 223, 61, 233, 53, 127, 223, 61, 233, 53, 206, 255, 10, 2, 223, - 56, 10, 2, 222, 251, 10, 2, 222, 252, 24, 222, 251, 10, 2, 222, 249, 10, - 2, 222, 250, 24, 223, 154, 10, 2, 222, 250, 24, 223, 155, 98, 209, 140, - 10, 2, 222, 109, 10, 2, 222, 90, 10, 2, 222, 78, 10, 2, 222, 53, 10, 2, - 221, 191, 10, 2, 221, 192, 24, 249, 127, 10, 2, 221, 189, 10, 2, 221, - 190, 24, 251, 173, 10, 2, 221, 190, 24, 249, 127, 10, 2, 221, 190, 24, - 236, 138, 10, 2, 221, 190, 24, 236, 139, 203, 12, 10, 2, 221, 190, 24, - 234, 92, 203, 12, 10, 2, 221, 190, 24, 232, 72, 24, 249, 127, 10, 2, 221, - 190, 24, 226, 103, 10, 2, 221, 190, 24, 225, 42, 10, 2, 221, 190, 24, - 225, 40, 10, 2, 221, 190, 24, 225, 41, 98, 250, 195, 10, 2, 221, 190, 24, - 224, 101, 10, 2, 221, 190, 24, 223, 83, 98, 250, 195, 10, 2, 221, 190, - 24, 223, 62, 10, 2, 221, 190, 24, 219, 208, 98, 236, 230, 10, 2, 221, - 190, 24, 217, 118, 10, 2, 221, 190, 24, 215, 186, 10, 2, 221, 190, 24, - 206, 113, 98, 250, 195, 10, 2, 221, 190, 24, 206, 83, 98, 248, 21, 10, 2, - 221, 190, 24, 201, 28, 10, 2, 221, 190, 203, 12, 10, 2, 221, 190, 241, - 55, 221, 189, 10, 2, 221, 190, 214, 79, 221, 189, 10, 2, 221, 190, 205, - 93, 10, 2, 221, 190, 206, 236, 10, 2, 221, 188, 10, 2, 221, 182, 10, 2, - 221, 183, 127, 221, 182, 10, 2, 221, 183, 214, 79, 221, 182, 10, 2, 221, - 183, 206, 236, 10, 2, 221, 179, 10, 2, 221, 176, 10, 2, 221, 174, 10, 2, - 221, 175, 127, 221, 174, 10, 2, 221, 175, 127, 221, 175, 234, 84, 127, - 234, 83, 10, 2, 166, 10, 2, 220, 128, 24, 203, 129, 10, 2, 220, 128, 233, - 52, 10, 2, 220, 120, 10, 2, 220, 89, 10, 2, 220, 37, 10, 2, 220, 12, 10, - 2, 220, 11, 10, 2, 219, 207, 10, 2, 219, 151, 10, 2, 219, 78, 10, 2, 219, - 23, 10, 2, 218, 145, 10, 2, 218, 146, 127, 218, 145, 10, 2, 218, 130, 10, - 2, 218, 131, 233, 52, 10, 2, 218, 111, 10, 2, 218, 97, 10, 2, 218, 93, - 10, 2, 218, 94, 24, 63, 10, 2, 218, 94, 24, 223, 154, 10, 2, 218, 94, 24, - 195, 115, 10, 2, 218, 94, 127, 218, 93, 10, 2, 218, 94, 127, 218, 94, 24, - 39, 98, 176, 10, 2, 218, 94, 241, 55, 218, 93, 10, 2, 218, 91, 10, 2, - 218, 92, 24, 63, 10, 2, 218, 92, 24, 39, 98, 239, 152, 10, 2, 218, 92, - 24, 239, 152, 10, 2, 218, 92, 233, 52, 10, 2, 176, 10, 2, 217, 247, 10, - 2, 217, 234, 10, 2, 217, 235, 226, 16, 10, 2, 217, 235, 24, 206, 152, - 203, 12, 10, 2, 217, 235, 214, 79, 217, 234, 10, 2, 217, 233, 10, 2, 217, - 226, 215, 124, 10, 2, 217, 225, 10, 2, 217, 224, 10, 2, 217, 118, 10, 2, - 217, 119, 24, 63, 10, 2, 217, 119, 24, 200, 104, 10, 2, 217, 119, 206, - 236, 10, 2, 216, 223, 10, 2, 216, 224, 24, 69, 10, 2, 216, 214, 10, 2, - 216, 184, 10, 2, 216, 185, 24, 234, 92, 203, 12, 10, 2, 216, 185, 24, - 234, 84, 98, 234, 92, 203, 12, 10, 2, 216, 180, 10, 2, 216, 181, 24, 251, - 106, 10, 2, 216, 181, 24, 250, 195, 10, 2, 216, 181, 24, 250, 196, 98, - 250, 195, 10, 2, 216, 181, 24, 233, 65, 10, 2, 216, 181, 24, 219, 208, - 98, 234, 92, 203, 12, 10, 2, 216, 181, 24, 217, 118, 10, 2, 216, 181, 24, - 215, 138, 10, 2, 216, 181, 24, 206, 255, 10, 2, 216, 181, 24, 207, 0, 98, - 39, 251, 106, 10, 2, 216, 181, 24, 207, 0, 98, 250, 195, 10, 2, 216, 181, - 24, 207, 0, 98, 250, 196, 98, 250, 195, 10, 2, 216, 181, 24, 200, 116, - 98, 250, 195, 10, 2, 216, 181, 24, 199, 253, 10, 2, 216, 169, 10, 2, 215, - 186, 10, 2, 215, 155, 10, 2, 215, 138, 10, 2, 215, 139, 223, 61, 24, 234, - 83, 10, 2, 215, 139, 223, 61, 24, 220, 12, 10, 2, 215, 139, 223, 61, 24, - 208, 241, 10, 2, 215, 139, 223, 61, 24, 208, 242, 127, 215, 139, 223, 61, - 24, 208, 241, 10, 2, 215, 139, 223, 61, 24, 199, 253, 10, 2, 215, 139, - 203, 12, 10, 2, 215, 139, 127, 215, 138, 10, 2, 215, 139, 241, 55, 215, - 138, 10, 2, 215, 139, 241, 55, 215, 139, 223, 61, 127, 223, 60, 10, 2, - 215, 133, 10, 2, 215, 134, 252, 35, 24, 250, 189, 10, 2, 215, 134, 252, - 35, 24, 248, 184, 10, 2, 215, 134, 252, 35, 24, 237, 195, 10, 2, 215, - 134, 252, 35, 24, 233, 65, 10, 2, 215, 134, 252, 35, 24, 226, 123, 233, - 52, 10, 2, 215, 134, 252, 35, 24, 225, 40, 10, 2, 215, 134, 252, 35, 24, - 172, 10, 2, 215, 134, 252, 35, 24, 217, 118, 10, 2, 215, 134, 252, 35, - 24, 206, 80, 10, 2, 215, 134, 252, 35, 24, 200, 115, 10, 2, 215, 134, - 224, 60, 24, 248, 184, 10, 2, 215, 134, 224, 60, 24, 248, 185, 66, 10, 2, - 161, 10, 2, 213, 233, 10, 2, 213, 191, 10, 2, 213, 163, 10, 2, 213, 21, - 10, 2, 212, 220, 10, 2, 212, 221, 24, 63, 10, 2, 212, 221, 24, 252, 117, - 10, 2, 212, 221, 24, 248, 184, 10, 2, 212, 221, 24, 248, 21, 10, 2, 212, - 221, 24, 69, 10, 2, 212, 221, 24, 68, 10, 2, 212, 221, 24, 230, 205, 10, - 2, 212, 221, 24, 66, 10, 2, 212, 221, 24, 200, 115, 10, 2, 212, 221, 241, - 55, 212, 220, 10, 2, 212, 161, 10, 2, 212, 162, 24, 225, 21, 10, 2, 212, - 162, 24, 200, 104, 10, 2, 212, 162, 24, 195, 115, 10, 2, 212, 162, 214, - 79, 212, 161, 10, 2, 169, 10, 2, 210, 242, 10, 2, 210, 72, 10, 2, 209, - 140, 10, 2, 183, 10, 2, 209, 2, 215, 124, 10, 2, 209, 1, 10, 2, 209, 2, - 24, 63, 10, 2, 209, 2, 24, 237, 201, 10, 2, 209, 2, 24, 237, 199, 10, 2, - 209, 2, 24, 142, 10, 2, 209, 2, 24, 225, 25, 10, 2, 209, 2, 24, 223, 154, - 10, 2, 209, 2, 24, 221, 174, 10, 2, 209, 2, 24, 219, 78, 10, 2, 209, 2, - 24, 215, 138, 10, 2, 209, 2, 24, 208, 241, 10, 2, 209, 2, 24, 206, 221, - 10, 2, 209, 2, 24, 203, 154, 10, 2, 209, 2, 24, 200, 115, 10, 2, 209, 2, - 24, 200, 110, 10, 2, 209, 2, 24, 200, 79, 10, 2, 209, 2, 24, 200, 21, 10, - 2, 209, 2, 24, 199, 253, 10, 2, 209, 2, 127, 209, 1, 10, 2, 209, 2, 233, - 52, 10, 2, 208, 241, 10, 2, 208, 242, 223, 63, 24, 250, 193, 10, 2, 208, - 213, 10, 2, 208, 204, 10, 2, 207, 50, 10, 2, 207, 48, 10, 2, 207, 49, 24, - 63, 10, 2, 207, 49, 24, 249, 127, 10, 2, 207, 49, 24, 233, 164, 10, 2, - 207, 49, 24, 217, 118, 10, 2, 207, 49, 24, 206, 149, 10, 2, 207, 49, 24, - 201, 10, 10, 2, 207, 49, 24, 66, 10, 2, 207, 49, 24, 118, 98, 63, 10, 2, - 207, 46, 10, 2, 207, 44, 10, 2, 207, 17, 10, 2, 206, 255, 10, 2, 207, 0, - 231, 75, 10, 2, 207, 0, 127, 207, 0, 234, 115, 127, 234, 115, 234, 84, - 127, 234, 83, 10, 2, 207, 0, 127, 207, 0, 203, 155, 127, 203, 155, 234, - 84, 127, 234, 83, 10, 2, 206, 248, 10, 2, 206, 243, 10, 2, 206, 239, 10, - 2, 206, 238, 10, 2, 206, 235, 10, 2, 206, 221, 10, 2, 206, 222, 24, 63, - 10, 2, 206, 222, 24, 226, 103, 10, 2, 206, 215, 10, 2, 206, 216, 24, 63, - 10, 2, 206, 216, 24, 249, 107, 10, 2, 206, 216, 24, 247, 255, 10, 2, 206, - 216, 24, 239, 95, 10, 2, 206, 216, 24, 234, 83, 10, 2, 206, 216, 24, 226, - 122, 10, 2, 206, 216, 24, 226, 123, 233, 52, 10, 2, 206, 216, 24, 223, - 147, 10, 2, 206, 216, 24, 221, 176, 10, 2, 206, 216, 24, 218, 130, 10, 2, - 206, 216, 24, 208, 241, 10, 2, 206, 209, 10, 2, 206, 204, 10, 2, 206, - 205, 203, 12, 10, 2, 206, 205, 127, 206, 205, 247, 245, 127, 247, 244, - 10, 2, 206, 200, 10, 2, 206, 151, 10, 2, 206, 152, 127, 226, 17, 206, - 151, 10, 2, 206, 149, 10, 2, 206, 147, 10, 2, 206, 112, 10, 2, 206, 113, - 233, 52, 10, 2, 206, 91, 10, 2, 206, 89, 10, 2, 206, 90, 127, 206, 90, - 206, 149, 10, 2, 206, 82, 10, 2, 206, 80, 10, 2, 204, 172, 10, 2, 204, - 173, 127, 204, 172, 10, 2, 204, 129, 10, 2, 204, 128, 10, 2, 204, 126, - 10, 2, 204, 117, 10, 2, 204, 116, 10, 2, 204, 88, 10, 2, 204, 87, 10, 2, - 189, 10, 2, 203, 169, 250, 179, 10, 2, 203, 169, 24, 232, 71, 10, 2, 203, - 169, 24, 219, 78, 10, 2, 203, 169, 233, 52, 10, 2, 203, 154, 10, 2, 203, - 155, 127, 203, 155, 216, 224, 127, 216, 224, 239, 76, 127, 239, 75, 10, - 2, 203, 155, 205, 93, 10, 2, 203, 143, 10, 2, 184, 24, 248, 184, 10, 2, - 184, 24, 233, 65, 10, 2, 184, 24, 206, 255, 10, 2, 184, 24, 206, 151, 10, - 2, 184, 24, 201, 28, 10, 2, 184, 24, 200, 104, 10, 2, 203, 129, 10, 2, - 203, 101, 10, 2, 203, 68, 10, 2, 203, 69, 233, 52, 10, 2, 202, 122, 10, - 2, 202, 123, 203, 12, 10, 2, 202, 86, 10, 2, 202, 63, 10, 2, 202, 64, 24, - 203, 129, 10, 2, 202, 64, 127, 202, 63, 10, 2, 202, 64, 127, 202, 64, - 234, 115, 127, 234, 115, 234, 84, 127, 234, 83, 10, 2, 201, 40, 10, 2, - 201, 28, 10, 2, 201, 26, 10, 2, 201, 22, 10, 2, 201, 10, 10, 2, 201, 11, - 127, 201, 11, 195, 116, 127, 195, 115, 10, 2, 66, 10, 2, 118, 233, 65, - 10, 2, 118, 118, 66, 10, 2, 118, 127, 118, 213, 244, 127, 213, 244, 234, - 84, 127, 234, 83, 10, 2, 118, 127, 118, 204, 89, 127, 204, 88, 10, 2, - 118, 127, 118, 118, 210, 89, 127, 118, 210, 88, 10, 2, 200, 115, 10, 2, - 200, 110, 10, 2, 200, 104, 10, 2, 200, 105, 223, 147, 10, 2, 200, 105, - 24, 249, 127, 10, 2, 200, 105, 24, 219, 78, 10, 2, 200, 105, 24, 118, 98, - 118, 98, 66, 10, 2, 200, 105, 24, 118, 98, 118, 98, 118, 233, 52, 10, 2, - 200, 105, 233, 52, 10, 2, 200, 105, 206, 236, 10, 2, 200, 105, 206, 237, - 24, 249, 127, 10, 2, 200, 100, 10, 2, 200, 79, 10, 2, 200, 80, 24, 223, - 62, 10, 2, 200, 80, 24, 219, 208, 98, 240, 136, 10, 2, 200, 80, 24, 207, - 48, 10, 2, 200, 80, 24, 66, 10, 2, 200, 78, 10, 2, 200, 74, 10, 2, 200, - 75, 24, 224, 240, 10, 2, 200, 75, 24, 161, 10, 2, 200, 72, 10, 2, 200, - 73, 233, 52, 10, 2, 200, 21, 10, 2, 200, 22, 241, 55, 200, 21, 10, 2, - 200, 22, 206, 236, 10, 2, 200, 19, 10, 2, 200, 20, 24, 39, 98, 142, 10, - 2, 200, 20, 24, 39, 98, 176, 10, 2, 200, 20, 24, 251, 173, 10, 2, 200, - 20, 24, 142, 10, 2, 200, 20, 24, 215, 138, 10, 2, 200, 20, 24, 200, 115, - 10, 2, 200, 20, 24, 200, 116, 98, 250, 195, 10, 2, 200, 20, 24, 200, 116, - 98, 248, 184, 10, 2, 200, 18, 10, 2, 200, 15, 10, 2, 200, 14, 10, 2, 200, - 10, 10, 2, 200, 11, 24, 63, 10, 2, 200, 11, 24, 250, 189, 10, 2, 200, 11, - 24, 154, 10, 2, 200, 11, 24, 237, 188, 10, 2, 200, 11, 24, 234, 123, 10, - 2, 200, 11, 24, 234, 105, 10, 2, 200, 11, 24, 234, 92, 203, 12, 10, 2, - 200, 11, 24, 234, 83, 10, 2, 200, 11, 24, 233, 76, 10, 2, 200, 11, 24, - 142, 10, 2, 200, 11, 24, 226, 122, 10, 2, 200, 11, 24, 226, 103, 10, 2, - 200, 11, 24, 225, 242, 10, 2, 200, 11, 24, 224, 101, 10, 2, 200, 11, 24, - 221, 174, 10, 2, 200, 11, 24, 219, 23, 10, 2, 200, 11, 24, 161, 10, 2, - 200, 11, 24, 206, 255, 10, 2, 200, 11, 24, 206, 89, 10, 2, 200, 11, 24, - 201, 40, 10, 2, 200, 11, 24, 118, 98, 233, 65, 10, 2, 200, 11, 24, 200, - 104, 10, 2, 200, 11, 24, 200, 8, 10, 2, 200, 8, 10, 2, 200, 9, 24, 66, - 10, 2, 199, 253, 10, 2, 199, 254, 24, 63, 10, 2, 199, 254, 24, 223, 187, - 10, 2, 199, 254, 24, 223, 154, 10, 2, 199, 254, 24, 203, 129, 10, 2, 199, - 249, 10, 2, 199, 252, 10, 2, 199, 250, 10, 2, 199, 246, 10, 2, 199, 234, - 10, 2, 199, 235, 24, 224, 240, 10, 2, 199, 232, 10, 2, 195, 115, 10, 2, - 195, 116, 203, 12, 10, 2, 195, 116, 103, 24, 223, 154, 10, 2, 195, 111, - 10, 2, 195, 103, 10, 2, 195, 87, 10, 2, 195, 33, 10, 2, 195, 34, 127, - 195, 33, 10, 2, 195, 32, 10, 2, 195, 30, 10, 2, 195, 31, 225, 44, 203, - 12, 10, 2, 195, 25, 10, 2, 195, 16, 10, 2, 194, 255, 10, 2, 194, 253, 10, - 2, 194, 254, 24, 63, 10, 2, 194, 252, 10, 2, 194, 251, 10, 2, 225, 9, - 237, 4, 10, 2, 252, 118, 24, 215, 138, 10, 2, 252, 35, 24, 63, 10, 2, - 251, 120, 24, 223, 169, 10, 2, 240, 127, 224, 60, 24, 200, 116, 98, 220, - 12, 10, 2, 240, 125, 10, 2, 239, 76, 98, 206, 151, 10, 2, 237, 200, 24, - 206, 255, 10, 2, 236, 55, 24, 233, 65, 10, 2, 236, 55, 24, 206, 255, 10, - 2, 234, 122, 24, 251, 107, 98, 225, 26, 98, 63, 10, 2, 234, 122, 24, 250, - 193, 10, 2, 234, 47, 10, 2, 233, 181, 10, 2, 231, 48, 10, 2, 225, 70, 24, - 251, 71, 10, 2, 225, 70, 24, 250, 192, 10, 2, 225, 70, 24, 233, 164, 10, - 2, 225, 70, 24, 233, 65, 10, 2, 225, 70, 24, 232, 72, 24, 250, 193, 10, - 2, 225, 70, 24, 221, 174, 10, 2, 225, 70, 24, 161, 10, 2, 225, 70, 24, - 206, 143, 10, 2, 225, 70, 24, 201, 40, 10, 2, 225, 70, 24, 200, 19, 10, - 2, 223, 63, 24, 233, 192, 10, 2, 221, 190, 206, 237, 24, 249, 127, 10, 2, - 221, 190, 24, 236, 139, 98, 222, 251, 10, 2, 221, 190, 24, 206, 151, 10, - 2, 219, 150, 10, 2, 218, 92, 24, 195, 115, 10, 2, 217, 246, 10, 2, 216, - 183, 10, 2, 216, 182, 10, 2, 216, 181, 24, 249, 107, 10, 2, 216, 181, 24, - 233, 192, 10, 2, 215, 156, 209, 194, 216, 175, 239, 230, 10, 2, 213, 22, - 250, 179, 10, 2, 212, 165, 10, 2, 209, 2, 24, 226, 123, 233, 52, 10, 2, - 202, 114, 10, 2, 200, 80, 24, 219, 207, 10, 2, 118, 66, 10, 156, 2, 99, - 250, 195, 10, 156, 2, 115, 250, 195, 10, 156, 2, 235, 7, 250, 195, 10, - 156, 2, 235, 101, 250, 195, 10, 156, 2, 206, 29, 250, 195, 10, 156, 2, - 207, 71, 250, 195, 10, 156, 2, 237, 31, 250, 195, 10, 156, 2, 216, 179, - 250, 195, 10, 156, 2, 115, 239, 75, 10, 156, 2, 235, 7, 239, 75, 10, 156, - 2, 235, 101, 239, 75, 10, 156, 2, 206, 29, 239, 75, 10, 156, 2, 207, 71, - 239, 75, 10, 156, 2, 237, 31, 239, 75, 10, 156, 2, 216, 179, 239, 75, 10, - 156, 2, 235, 7, 66, 10, 156, 2, 235, 101, 66, 10, 156, 2, 206, 29, 66, - 10, 156, 2, 207, 71, 66, 10, 156, 2, 237, 31, 66, 10, 156, 2, 216, 179, - 66, 10, 156, 2, 97, 234, 19, 10, 156, 2, 99, 234, 19, 10, 156, 2, 115, - 234, 19, 10, 156, 2, 235, 7, 234, 19, 10, 156, 2, 235, 101, 234, 19, 10, - 156, 2, 206, 29, 234, 19, 10, 156, 2, 207, 71, 234, 19, 10, 156, 2, 237, - 31, 234, 19, 10, 156, 2, 216, 179, 234, 19, 10, 156, 2, 97, 234, 16, 10, - 156, 2, 99, 234, 16, 10, 156, 2, 115, 234, 16, 10, 156, 2, 235, 7, 234, - 16, 10, 156, 2, 235, 101, 234, 16, 10, 156, 2, 99, 207, 17, 10, 156, 2, - 115, 207, 17, 10, 156, 2, 115, 207, 18, 199, 132, 20, 10, 156, 2, 235, 7, - 207, 17, 10, 156, 2, 235, 101, 207, 17, 10, 156, 2, 206, 29, 207, 17, 10, - 156, 2, 207, 71, 207, 17, 10, 156, 2, 237, 31, 207, 17, 10, 156, 2, 216, - 179, 207, 17, 10, 156, 2, 97, 207, 10, 10, 156, 2, 99, 207, 10, 10, 156, - 2, 115, 207, 10, 10, 156, 2, 115, 207, 11, 199, 132, 20, 10, 156, 2, 235, - 7, 207, 10, 10, 156, 2, 235, 101, 207, 10, 10, 156, 2, 207, 18, 24, 234, - 106, 98, 239, 75, 10, 156, 2, 207, 18, 24, 234, 106, 98, 219, 23, 10, - 156, 2, 97, 247, 240, 10, 156, 2, 99, 247, 240, 10, 156, 2, 115, 247, - 240, 10, 156, 2, 115, 247, 241, 199, 132, 20, 10, 156, 2, 235, 7, 247, - 240, 10, 156, 2, 235, 101, 247, 240, 10, 156, 2, 115, 199, 132, 235, 24, - 236, 140, 10, 156, 2, 115, 199, 132, 235, 24, 236, 137, 10, 156, 2, 235, - 7, 199, 132, 235, 24, 222, 79, 10, 156, 2, 235, 7, 199, 132, 235, 24, - 222, 77, 10, 156, 2, 235, 7, 199, 132, 235, 24, 222, 80, 63, 10, 156, 2, - 235, 7, 199, 132, 235, 24, 222, 80, 250, 112, 10, 156, 2, 206, 29, 199, - 132, 235, 24, 250, 191, 10, 156, 2, 207, 71, 199, 132, 235, 24, 226, 95, - 10, 156, 2, 207, 71, 199, 132, 235, 24, 226, 97, 63, 10, 156, 2, 207, 71, - 199, 132, 235, 24, 226, 97, 250, 112, 10, 156, 2, 237, 31, 199, 132, 235, - 24, 199, 248, 10, 156, 2, 237, 31, 199, 132, 235, 24, 199, 247, 10, 156, - 2, 216, 179, 199, 132, 235, 24, 226, 111, 10, 156, 2, 216, 179, 199, 132, - 235, 24, 226, 110, 10, 156, 2, 216, 179, 199, 132, 235, 24, 226, 109, 10, - 156, 2, 216, 179, 199, 132, 235, 24, 226, 112, 63, 10, 156, 2, 99, 250, - 196, 203, 12, 10, 156, 2, 115, 250, 196, 203, 12, 10, 156, 2, 235, 7, - 250, 196, 203, 12, 10, 156, 2, 235, 101, 250, 196, 203, 12, 10, 156, 2, - 206, 29, 250, 196, 203, 12, 10, 156, 2, 97, 249, 91, 10, 156, 2, 99, 249, - 91, 10, 156, 2, 115, 249, 91, 10, 156, 2, 235, 7, 249, 91, 10, 156, 2, - 235, 7, 249, 92, 199, 132, 20, 10, 156, 2, 235, 101, 249, 91, 10, 156, 2, - 235, 101, 249, 92, 199, 132, 20, 10, 156, 2, 216, 192, 10, 156, 2, 216, - 193, 10, 156, 2, 97, 236, 136, 10, 156, 2, 99, 236, 136, 10, 156, 2, 97, - 202, 185, 239, 75, 10, 156, 2, 99, 202, 182, 239, 75, 10, 156, 2, 235, - 101, 206, 16, 239, 75, 10, 156, 2, 97, 202, 185, 199, 132, 235, 24, 63, - 10, 156, 2, 99, 202, 182, 199, 132, 235, 24, 63, 10, 156, 2, 97, 237, 27, - 250, 195, 10, 156, 2, 97, 211, 88, 250, 195, 10, 156, 2, 37, 250, 182, - 97, 206, 17, 10, 156, 2, 37, 250, 182, 97, 211, 87, 10, 156, 2, 97, 211, - 88, 233, 46, 10, 156, 2, 97, 157, 233, 46, 10, 156, 2, 237, 5, 97, 202, - 184, 10, 156, 2, 237, 5, 99, 202, 181, 10, 156, 2, 237, 5, 235, 14, 10, - 156, 2, 237, 5, 235, 145, 10, 156, 2, 235, 7, 118, 199, 132, 20, 10, 156, - 2, 235, 101, 118, 199, 132, 20, 10, 156, 2, 206, 29, 118, 199, 132, 20, - 10, 156, 2, 207, 71, 118, 199, 132, 20, 10, 156, 2, 237, 31, 118, 199, - 132, 20, 10, 156, 2, 216, 179, 118, 199, 132, 20, 10, 211, 214, 2, 37, - 250, 182, 197, 9, 239, 59, 10, 211, 214, 2, 83, 244, 168, 10, 211, 214, - 2, 239, 147, 244, 168, 10, 211, 214, 2, 239, 147, 201, 176, 10, 211, 214, - 2, 239, 147, 211, 93, 10, 2, 252, 118, 24, 215, 139, 203, 12, 10, 2, 252, - 118, 24, 206, 149, 10, 2, 252, 7, 24, 236, 138, 10, 2, 249, 128, 24, 239, - 76, 203, 12, 10, 2, 249, 114, 24, 252, 34, 10, 2, 249, 114, 24, 216, 223, - 10, 2, 249, 114, 24, 195, 115, 10, 2, 248, 22, 127, 248, 22, 24, 217, - 247, 10, 2, 240, 137, 24, 203, 129, 10, 2, 240, 127, 24, 223, 154, 10, 2, - 239, 108, 24, 226, 122, 10, 2, 239, 108, 24, 118, 118, 66, 10, 2, 239, - 106, 24, 200, 104, 10, 2, 237, 196, 24, 251, 71, 10, 2, 237, 196, 24, - 250, 195, 10, 2, 237, 196, 24, 250, 196, 250, 169, 222, 184, 10, 2, 237, - 196, 24, 239, 95, 10, 2, 237, 196, 24, 237, 188, 10, 2, 237, 196, 24, - 236, 157, 10, 2, 237, 196, 24, 234, 123, 10, 2, 237, 196, 24, 233, 192, - 10, 2, 237, 196, 24, 233, 174, 233, 52, 10, 2, 237, 196, 24, 233, 164, - 10, 2, 237, 196, 24, 142, 10, 2, 237, 196, 24, 232, 71, 10, 2, 237, 196, - 24, 226, 123, 233, 52, 10, 2, 237, 196, 24, 224, 240, 10, 2, 237, 196, - 24, 223, 154, 10, 2, 237, 196, 24, 223, 147, 10, 2, 237, 196, 24, 223, - 148, 98, 224, 240, 10, 2, 237, 196, 24, 223, 50, 10, 2, 237, 196, 24, - 222, 249, 10, 2, 237, 196, 24, 222, 250, 24, 223, 154, 10, 2, 237, 196, - 24, 221, 180, 98, 233, 164, 10, 2, 237, 196, 24, 220, 12, 10, 2, 237, - 196, 24, 219, 151, 10, 2, 237, 196, 24, 219, 78, 10, 2, 237, 196, 24, - 216, 223, 10, 2, 237, 196, 24, 212, 220, 10, 2, 237, 196, 24, 206, 255, - 10, 2, 237, 196, 24, 206, 113, 233, 52, 10, 2, 237, 84, 24, 223, 154, 10, - 2, 237, 84, 24, 213, 163, 10, 2, 236, 158, 196, 222, 10, 2, 236, 139, - 241, 55, 236, 138, 10, 2, 236, 55, 206, 237, 24, 250, 195, 10, 2, 236, - 55, 206, 237, 24, 232, 71, 10, 2, 236, 55, 206, 237, 24, 226, 123, 233, - 52, 10, 2, 236, 55, 206, 237, 24, 172, 10, 2, 236, 55, 206, 237, 24, 222, - 251, 10, 2, 236, 55, 206, 237, 24, 219, 207, 10, 2, 236, 55, 206, 237, - 24, 219, 151, 10, 2, 236, 55, 206, 237, 24, 204, 172, 10, 2, 236, 55, 24, - 204, 172, 10, 2, 234, 122, 24, 249, 113, 10, 2, 234, 122, 24, 239, 108, - 233, 52, 10, 2, 234, 122, 24, 237, 196, 24, 226, 123, 233, 52, 10, 2, - 234, 122, 24, 237, 196, 24, 224, 240, 10, 2, 234, 122, 24, 236, 160, 10, - 2, 234, 122, 24, 234, 123, 10, 2, 234, 122, 24, 234, 84, 98, 239, 152, - 10, 2, 234, 122, 24, 234, 84, 98, 217, 118, 10, 2, 234, 122, 24, 233, 4, - 98, 63, 10, 2, 234, 122, 24, 223, 148, 98, 224, 240, 10, 2, 234, 122, 24, - 222, 249, 10, 2, 234, 122, 24, 222, 250, 24, 223, 154, 10, 2, 234, 122, - 24, 221, 179, 10, 2, 234, 122, 24, 218, 93, 10, 2, 234, 122, 24, 217, - 118, 10, 2, 234, 122, 24, 217, 119, 98, 237, 83, 10, 2, 234, 122, 24, - 217, 119, 98, 233, 192, 10, 2, 234, 122, 24, 206, 215, 10, 2, 234, 122, - 24, 195, 16, 10, 2, 234, 117, 209, 194, 216, 175, 239, 230, 10, 2, 234, - 18, 24, 66, 10, 2, 233, 165, 24, 233, 165, 241, 55, 233, 164, 10, 2, 233, - 75, 24, 226, 123, 233, 52, 10, 2, 233, 66, 98, 233, 165, 24, 203, 129, - 10, 2, 233, 4, 203, 13, 233, 52, 10, 2, 232, 72, 24, 250, 196, 127, 232, - 72, 24, 250, 195, 10, 2, 225, 70, 24, 248, 21, 10, 2, 225, 70, 24, 155, - 10, 2, 225, 70, 24, 118, 118, 66, 10, 2, 225, 70, 24, 200, 21, 10, 2, - 223, 63, 24, 195, 0, 127, 194, 255, 10, 2, 223, 51, 10, 2, 223, 49, 10, - 2, 223, 48, 10, 2, 223, 47, 10, 2, 223, 46, 10, 2, 223, 45, 10, 2, 223, - 44, 10, 2, 223, 43, 127, 223, 43, 233, 52, 10, 2, 223, 42, 10, 2, 223, - 41, 127, 223, 40, 10, 2, 223, 39, 10, 2, 223, 38, 10, 2, 223, 37, 10, 2, - 223, 36, 10, 2, 223, 35, 10, 2, 223, 34, 10, 2, 223, 33, 10, 2, 223, 32, - 10, 2, 223, 31, 10, 2, 223, 30, 10, 2, 223, 29, 10, 2, 223, 28, 10, 2, - 223, 27, 10, 2, 223, 26, 10, 2, 223, 25, 10, 2, 223, 24, 10, 2, 223, 23, - 10, 2, 223, 22, 10, 2, 223, 20, 10, 2, 223, 21, 24, 233, 76, 10, 2, 223, - 21, 24, 226, 122, 10, 2, 223, 21, 24, 213, 164, 98, 221, 188, 10, 2, 223, - 21, 24, 213, 164, 98, 213, 164, 98, 221, 188, 10, 2, 223, 21, 24, 200, - 116, 98, 249, 145, 10, 2, 223, 19, 10, 2, 223, 18, 10, 2, 223, 17, 10, 2, - 223, 16, 10, 2, 223, 15, 10, 2, 223, 14, 10, 2, 223, 13, 10, 2, 223, 12, - 10, 2, 223, 11, 10, 2, 223, 10, 10, 2, 223, 8, 10, 2, 223, 9, 24, 250, - 195, 10, 2, 223, 9, 24, 249, 127, 10, 2, 223, 9, 24, 237, 187, 233, 53, - 233, 52, 10, 2, 223, 9, 24, 223, 178, 10, 2, 223, 9, 24, 172, 10, 2, 223, - 9, 24, 203, 101, 10, 2, 223, 9, 24, 203, 68, 10, 2, 223, 9, 24, 200, 115, - 10, 2, 223, 9, 24, 200, 104, 10, 2, 223, 9, 24, 200, 8, 10, 2, 223, 7, - 10, 2, 223, 5, 10, 2, 223, 6, 24, 237, 199, 10, 2, 223, 6, 24, 234, 123, - 10, 2, 223, 6, 24, 226, 122, 10, 2, 223, 6, 24, 226, 123, 233, 52, 10, 2, - 223, 6, 24, 216, 223, 10, 2, 223, 6, 24, 213, 164, 98, 213, 164, 98, 221, - 188, 10, 2, 223, 6, 24, 206, 240, 98, 224, 101, 10, 2, 223, 6, 24, 200, - 104, 10, 2, 223, 6, 24, 200, 8, 10, 2, 223, 3, 10, 2, 223, 2, 10, 2, 221, - 190, 233, 53, 24, 250, 195, 10, 2, 221, 190, 24, 239, 75, 10, 2, 221, - 190, 24, 232, 228, 10, 2, 221, 190, 24, 213, 163, 10, 2, 221, 190, 24, - 213, 164, 98, 213, 164, 98, 221, 188, 10, 2, 221, 190, 24, 203, 129, 10, - 2, 219, 79, 98, 195, 114, 10, 2, 218, 94, 127, 218, 94, 24, 234, 123, 10, - 2, 218, 94, 127, 218, 94, 24, 225, 25, 10, 2, 216, 181, 24, 239, 108, - 233, 52, 10, 2, 216, 181, 24, 233, 164, 10, 2, 216, 181, 24, 233, 57, 10, - 2, 216, 181, 24, 232, 71, 10, 2, 216, 181, 24, 224, 173, 10, 2, 216, 181, - 24, 223, 46, 10, 2, 216, 181, 24, 220, 12, 10, 2, 216, 181, 24, 213, 164, - 98, 213, 163, 10, 2, 216, 181, 24, 66, 10, 2, 216, 181, 24, 118, 98, 66, - 10, 2, 216, 181, 24, 200, 8, 10, 2, 209, 2, 233, 53, 24, 142, 10, 2, 209, - 2, 24, 236, 230, 10, 2, 209, 2, 24, 207, 0, 250, 169, 222, 184, 10, 2, - 209, 2, 24, 203, 129, 10, 2, 207, 47, 203, 12, 10, 2, 207, 0, 127, 206, - 255, 10, 2, 207, 0, 98, 231, 67, 10, 2, 207, 0, 98, 217, 224, 10, 2, 207, - 0, 98, 208, 204, 10, 2, 206, 150, 98, 237, 196, 24, 216, 223, 10, 2, 206, - 150, 98, 237, 84, 24, 251, 106, 10, 2, 206, 113, 24, 203, 129, 10, 2, - 203, 130, 98, 209, 1, 10, 2, 201, 23, 24, 234, 92, 203, 12, 10, 2, 201, - 23, 24, 115, 239, 75, 10, 2, 200, 20, 226, 16, 10, 2, 200, 20, 24, 200, - 104, 10, 2, 200, 11, 24, 240, 74, 10, 2, 200, 11, 24, 223, 4, 10, 2, 200, - 11, 24, 221, 188, 10, 2, 195, 114, 10, 2, 195, 0, 127, 195, 0, 98, 208, - 204, 10, 2, 194, 254, 24, 115, 239, 76, 203, 12, 14, 7, 255, 161, 14, 7, - 255, 160, 14, 7, 255, 159, 14, 7, 255, 158, 14, 7, 255, 157, 14, 7, 255, - 156, 14, 7, 255, 155, 14, 7, 255, 154, 14, 7, 255, 153, 14, 7, 255, 152, - 14, 7, 255, 151, 14, 7, 255, 150, 14, 7, 255, 149, 14, 7, 255, 147, 14, - 7, 255, 146, 14, 7, 255, 145, 14, 7, 255, 144, 14, 7, 255, 143, 14, 7, - 255, 142, 14, 7, 255, 141, 14, 7, 255, 140, 14, 7, 255, 139, 14, 7, 255, - 138, 14, 7, 255, 137, 14, 7, 255, 136, 14, 7, 255, 135, 14, 7, 255, 134, - 14, 7, 255, 133, 14, 7, 255, 132, 14, 7, 255, 131, 14, 7, 255, 130, 14, - 7, 255, 128, 14, 7, 255, 127, 14, 7, 255, 125, 14, 7, 255, 124, 14, 7, - 255, 123, 14, 7, 255, 122, 14, 7, 255, 121, 14, 7, 255, 120, 14, 7, 255, - 119, 14, 7, 255, 118, 14, 7, 255, 117, 14, 7, 255, 116, 14, 7, 255, 115, - 14, 7, 255, 114, 14, 7, 255, 112, 14, 7, 255, 111, 14, 7, 255, 110, 14, - 7, 255, 108, 14, 7, 255, 107, 14, 7, 255, 106, 14, 7, 255, 105, 14, 7, - 255, 104, 14, 7, 255, 103, 14, 7, 255, 102, 14, 7, 255, 101, 14, 7, 255, - 98, 14, 7, 255, 97, 14, 7, 255, 96, 14, 7, 255, 95, 14, 7, 255, 94, 14, - 7, 255, 93, 14, 7, 255, 92, 14, 7, 255, 91, 14, 7, 255, 90, 14, 7, 255, - 89, 14, 7, 255, 88, 14, 7, 255, 87, 14, 7, 255, 86, 14, 7, 255, 85, 14, - 7, 255, 84, 14, 7, 255, 83, 14, 7, 255, 82, 14, 7, 255, 81, 14, 7, 255, - 80, 14, 7, 255, 79, 14, 7, 255, 75, 14, 7, 255, 74, 14, 7, 255, 73, 14, - 7, 255, 72, 14, 7, 250, 110, 14, 7, 250, 108, 14, 7, 250, 106, 14, 7, - 250, 104, 14, 7, 250, 102, 14, 7, 250, 101, 14, 7, 250, 99, 14, 7, 250, - 97, 14, 7, 250, 95, 14, 7, 250, 93, 14, 7, 247, 203, 14, 7, 247, 202, 14, - 7, 247, 201, 14, 7, 247, 200, 14, 7, 247, 199, 14, 7, 247, 198, 14, 7, - 247, 197, 14, 7, 247, 196, 14, 7, 247, 195, 14, 7, 247, 194, 14, 7, 247, - 193, 14, 7, 247, 192, 14, 7, 247, 191, 14, 7, 247, 190, 14, 7, 247, 189, - 14, 7, 247, 188, 14, 7, 247, 187, 14, 7, 247, 186, 14, 7, 247, 185, 14, - 7, 247, 184, 14, 7, 247, 183, 14, 7, 247, 182, 14, 7, 247, 181, 14, 7, - 247, 180, 14, 7, 247, 179, 14, 7, 247, 178, 14, 7, 247, 177, 14, 7, 247, - 176, 14, 7, 240, 230, 14, 7, 240, 229, 14, 7, 240, 228, 14, 7, 240, 227, - 14, 7, 240, 226, 14, 7, 240, 225, 14, 7, 240, 224, 14, 7, 240, 223, 14, - 7, 240, 222, 14, 7, 240, 221, 14, 7, 240, 220, 14, 7, 240, 219, 14, 7, - 240, 218, 14, 7, 240, 217, 14, 7, 240, 216, 14, 7, 240, 215, 14, 7, 240, - 214, 14, 7, 240, 213, 14, 7, 240, 212, 14, 7, 240, 211, 14, 7, 240, 210, - 14, 7, 240, 209, 14, 7, 240, 208, 14, 7, 240, 207, 14, 7, 240, 206, 14, - 7, 240, 205, 14, 7, 240, 204, 14, 7, 240, 203, 14, 7, 240, 202, 14, 7, - 240, 201, 14, 7, 240, 200, 14, 7, 240, 199, 14, 7, 240, 198, 14, 7, 240, - 197, 14, 7, 240, 196, 14, 7, 240, 195, 14, 7, 240, 194, 14, 7, 240, 193, - 14, 7, 240, 192, 14, 7, 240, 191, 14, 7, 240, 190, 14, 7, 240, 189, 14, - 7, 240, 188, 14, 7, 240, 187, 14, 7, 240, 186, 14, 7, 240, 185, 14, 7, - 240, 184, 14, 7, 240, 183, 14, 7, 240, 182, 14, 7, 240, 181, 14, 7, 240, - 180, 14, 7, 240, 179, 14, 7, 240, 178, 14, 7, 240, 177, 14, 7, 240, 176, - 14, 7, 240, 175, 14, 7, 240, 174, 14, 7, 240, 173, 14, 7, 240, 172, 14, - 7, 240, 171, 14, 7, 240, 170, 14, 7, 240, 169, 14, 7, 240, 168, 14, 7, - 240, 167, 14, 7, 240, 166, 14, 7, 240, 165, 14, 7, 240, 164, 14, 7, 240, - 163, 14, 7, 240, 162, 14, 7, 240, 161, 14, 7, 240, 160, 14, 7, 240, 159, - 14, 7, 240, 158, 14, 7, 240, 157, 14, 7, 240, 156, 14, 7, 240, 155, 14, - 7, 240, 154, 14, 7, 240, 153, 14, 7, 240, 152, 14, 7, 240, 151, 14, 7, - 240, 150, 14, 7, 240, 149, 14, 7, 240, 148, 14, 7, 240, 147, 14, 7, 240, - 146, 14, 7, 240, 145, 14, 7, 240, 144, 14, 7, 240, 143, 14, 7, 240, 142, - 14, 7, 240, 141, 14, 7, 240, 140, 14, 7, 240, 139, 14, 7, 237, 128, 14, - 7, 237, 127, 14, 7, 237, 126, 14, 7, 237, 125, 14, 7, 237, 124, 14, 7, - 237, 123, 14, 7, 237, 122, 14, 7, 237, 121, 14, 7, 237, 120, 14, 7, 237, - 119, 14, 7, 237, 118, 14, 7, 237, 117, 14, 7, 237, 116, 14, 7, 237, 115, - 14, 7, 237, 114, 14, 7, 237, 113, 14, 7, 237, 112, 14, 7, 237, 111, 14, - 7, 237, 110, 14, 7, 237, 109, 14, 7, 237, 108, 14, 7, 237, 107, 14, 7, - 237, 106, 14, 7, 237, 105, 14, 7, 237, 104, 14, 7, 237, 103, 14, 7, 237, - 102, 14, 7, 237, 101, 14, 7, 237, 100, 14, 7, 237, 99, 14, 7, 237, 98, - 14, 7, 237, 97, 14, 7, 237, 96, 14, 7, 237, 95, 14, 7, 237, 94, 14, 7, - 237, 93, 14, 7, 237, 92, 14, 7, 237, 91, 14, 7, 237, 90, 14, 7, 237, 89, - 14, 7, 237, 88, 14, 7, 237, 87, 14, 7, 237, 86, 14, 7, 237, 85, 14, 7, - 236, 48, 14, 7, 236, 47, 14, 7, 236, 46, 14, 7, 236, 45, 14, 7, 236, 44, - 14, 7, 236, 43, 14, 7, 236, 42, 14, 7, 236, 41, 14, 7, 236, 40, 14, 7, - 236, 39, 14, 7, 236, 38, 14, 7, 236, 37, 14, 7, 236, 36, 14, 7, 236, 35, - 14, 7, 236, 34, 14, 7, 236, 33, 14, 7, 236, 32, 14, 7, 236, 31, 14, 7, - 236, 30, 14, 7, 236, 29, 14, 7, 236, 28, 14, 7, 236, 27, 14, 7, 236, 26, - 14, 7, 236, 25, 14, 7, 236, 24, 14, 7, 236, 23, 14, 7, 236, 22, 14, 7, - 236, 21, 14, 7, 236, 20, 14, 7, 236, 19, 14, 7, 236, 18, 14, 7, 236, 17, - 14, 7, 236, 16, 14, 7, 236, 15, 14, 7, 236, 14, 14, 7, 236, 13, 14, 7, - 236, 12, 14, 7, 236, 11, 14, 7, 236, 10, 14, 7, 236, 9, 14, 7, 236, 8, - 14, 7, 236, 7, 14, 7, 236, 6, 14, 7, 236, 5, 14, 7, 236, 4, 14, 7, 236, - 3, 14, 7, 236, 2, 14, 7, 236, 1, 14, 7, 236, 0, 14, 7, 235, 255, 14, 7, - 235, 254, 14, 7, 235, 253, 14, 7, 235, 252, 14, 7, 235, 251, 14, 7, 235, - 250, 14, 7, 235, 249, 14, 7, 235, 248, 14, 7, 235, 247, 14, 7, 235, 246, - 14, 7, 235, 245, 14, 7, 235, 244, 14, 7, 235, 243, 14, 7, 235, 242, 14, - 7, 235, 241, 14, 7, 235, 240, 14, 7, 234, 189, 14, 7, 234, 188, 14, 7, - 234, 187, 14, 7, 234, 186, 14, 7, 234, 185, 14, 7, 234, 184, 14, 7, 234, - 183, 14, 7, 234, 182, 14, 7, 234, 181, 14, 7, 234, 180, 14, 7, 234, 179, - 14, 7, 234, 178, 14, 7, 234, 177, 14, 7, 234, 176, 14, 7, 234, 175, 14, - 7, 234, 174, 14, 7, 234, 173, 14, 7, 234, 172, 14, 7, 234, 171, 14, 7, - 234, 170, 14, 7, 234, 169, 14, 7, 234, 168, 14, 7, 234, 167, 14, 7, 234, - 166, 14, 7, 234, 165, 14, 7, 234, 164, 14, 7, 234, 163, 14, 7, 234, 162, - 14, 7, 234, 161, 14, 7, 234, 160, 14, 7, 234, 159, 14, 7, 234, 158, 14, - 7, 234, 157, 14, 7, 234, 156, 14, 7, 234, 155, 14, 7, 234, 154, 14, 7, - 234, 153, 14, 7, 234, 152, 14, 7, 234, 151, 14, 7, 234, 150, 14, 7, 234, - 149, 14, 7, 234, 148, 14, 7, 234, 147, 14, 7, 234, 146, 14, 7, 234, 145, - 14, 7, 234, 144, 14, 7, 234, 143, 14, 7, 234, 142, 14, 7, 234, 141, 14, - 7, 234, 140, 14, 7, 234, 139, 14, 7, 234, 138, 14, 7, 234, 137, 14, 7, - 234, 136, 14, 7, 234, 135, 14, 7, 234, 134, 14, 7, 234, 133, 14, 7, 234, - 132, 14, 7, 234, 131, 14, 7, 234, 130, 14, 7, 234, 129, 14, 7, 234, 128, - 14, 7, 234, 127, 14, 7, 234, 126, 14, 7, 233, 13, 14, 7, 233, 12, 14, 7, - 233, 11, 14, 7, 233, 10, 14, 7, 233, 9, 14, 7, 233, 8, 14, 7, 233, 7, 14, - 7, 233, 6, 14, 7, 233, 5, 14, 7, 230, 229, 14, 7, 230, 228, 14, 7, 230, - 227, 14, 7, 230, 226, 14, 7, 230, 225, 14, 7, 230, 224, 14, 7, 230, 223, - 14, 7, 230, 222, 14, 7, 230, 221, 14, 7, 230, 220, 14, 7, 230, 219, 14, - 7, 230, 218, 14, 7, 230, 217, 14, 7, 230, 216, 14, 7, 230, 215, 14, 7, - 230, 214, 14, 7, 230, 213, 14, 7, 230, 212, 14, 7, 230, 211, 14, 7, 225, - 79, 14, 7, 225, 78, 14, 7, 225, 77, 14, 7, 225, 76, 14, 7, 225, 75, 14, - 7, 225, 74, 14, 7, 225, 73, 14, 7, 225, 72, 14, 7, 223, 97, 14, 7, 223, - 96, 14, 7, 223, 95, 14, 7, 223, 94, 14, 7, 223, 93, 14, 7, 223, 92, 14, - 7, 223, 91, 14, 7, 223, 90, 14, 7, 223, 89, 14, 7, 223, 88, 14, 7, 221, - 134, 14, 7, 221, 133, 14, 7, 221, 132, 14, 7, 221, 130, 14, 7, 221, 128, - 14, 7, 221, 127, 14, 7, 221, 125, 14, 7, 221, 123, 14, 7, 221, 121, 14, - 7, 221, 119, 14, 7, 221, 117, 14, 7, 221, 115, 14, 7, 221, 113, 14, 7, - 221, 112, 14, 7, 221, 110, 14, 7, 221, 108, 14, 7, 221, 107, 14, 7, 221, - 106, 14, 7, 221, 105, 14, 7, 221, 104, 14, 7, 221, 103, 14, 7, 221, 102, - 14, 7, 221, 101, 14, 7, 221, 100, 14, 7, 221, 98, 14, 7, 221, 96, 14, 7, - 221, 94, 14, 7, 221, 93, 14, 7, 221, 91, 14, 7, 221, 90, 14, 7, 221, 88, - 14, 7, 221, 87, 14, 7, 221, 85, 14, 7, 221, 83, 14, 7, 221, 81, 14, 7, - 221, 79, 14, 7, 221, 77, 14, 7, 221, 76, 14, 7, 221, 74, 14, 7, 221, 72, - 14, 7, 221, 71, 14, 7, 221, 69, 14, 7, 221, 67, 14, 7, 221, 65, 14, 7, - 221, 63, 14, 7, 221, 62, 14, 7, 221, 60, 14, 7, 221, 58, 14, 7, 221, 56, - 14, 7, 221, 55, 14, 7, 221, 53, 14, 7, 221, 51, 14, 7, 221, 50, 14, 7, - 221, 49, 14, 7, 221, 47, 14, 7, 221, 45, 14, 7, 221, 43, 14, 7, 221, 41, - 14, 7, 221, 39, 14, 7, 221, 37, 14, 7, 221, 35, 14, 7, 221, 34, 14, 7, - 221, 32, 14, 7, 221, 30, 14, 7, 221, 28, 14, 7, 221, 26, 14, 7, 218, 50, - 14, 7, 218, 49, 14, 7, 218, 48, 14, 7, 218, 47, 14, 7, 218, 46, 14, 7, - 218, 45, 14, 7, 218, 44, 14, 7, 218, 43, 14, 7, 218, 42, 14, 7, 218, 41, - 14, 7, 218, 40, 14, 7, 218, 39, 14, 7, 218, 38, 14, 7, 218, 37, 14, 7, - 218, 36, 14, 7, 218, 35, 14, 7, 218, 34, 14, 7, 218, 33, 14, 7, 218, 32, - 14, 7, 218, 31, 14, 7, 218, 30, 14, 7, 218, 29, 14, 7, 218, 28, 14, 7, - 218, 27, 14, 7, 218, 26, 14, 7, 218, 25, 14, 7, 218, 24, 14, 7, 218, 23, - 14, 7, 218, 22, 14, 7, 218, 21, 14, 7, 218, 20, 14, 7, 218, 19, 14, 7, - 218, 18, 14, 7, 218, 17, 14, 7, 218, 16, 14, 7, 218, 15, 14, 7, 218, 14, - 14, 7, 218, 13, 14, 7, 218, 12, 14, 7, 218, 11, 14, 7, 218, 10, 14, 7, - 218, 9, 14, 7, 218, 8, 14, 7, 218, 7, 14, 7, 218, 6, 14, 7, 218, 5, 14, - 7, 218, 4, 14, 7, 218, 3, 14, 7, 218, 2, 14, 7, 216, 111, 14, 7, 216, - 110, 14, 7, 216, 109, 14, 7, 216, 108, 14, 7, 216, 107, 14, 7, 216, 106, - 14, 7, 216, 105, 14, 7, 216, 104, 14, 7, 216, 103, 14, 7, 216, 102, 14, - 7, 216, 101, 14, 7, 216, 100, 14, 7, 216, 99, 14, 7, 216, 98, 14, 7, 216, - 97, 14, 7, 216, 96, 14, 7, 216, 95, 14, 7, 216, 94, 14, 7, 216, 93, 14, - 7, 216, 92, 14, 7, 216, 91, 14, 7, 216, 90, 14, 7, 215, 182, 14, 7, 215, - 181, 14, 7, 215, 180, 14, 7, 215, 179, 14, 7, 215, 178, 14, 7, 215, 177, - 14, 7, 215, 176, 14, 7, 215, 175, 14, 7, 215, 174, 14, 7, 215, 173, 14, - 7, 215, 172, 14, 7, 215, 171, 14, 7, 215, 170, 14, 7, 215, 169, 14, 7, - 215, 168, 14, 7, 215, 167, 14, 7, 215, 166, 14, 7, 215, 165, 14, 7, 215, - 164, 14, 7, 215, 163, 14, 7, 215, 162, 14, 7, 215, 161, 14, 7, 215, 160, - 14, 7, 215, 159, 14, 7, 215, 158, 14, 7, 215, 157, 14, 7, 215, 10, 14, 7, - 215, 9, 14, 7, 215, 8, 14, 7, 215, 7, 14, 7, 215, 6, 14, 7, 215, 5, 14, - 7, 215, 4, 14, 7, 215, 3, 14, 7, 215, 2, 14, 7, 215, 1, 14, 7, 215, 0, - 14, 7, 214, 255, 14, 7, 214, 254, 14, 7, 214, 253, 14, 7, 214, 252, 14, - 7, 214, 251, 14, 7, 214, 250, 14, 7, 214, 249, 14, 7, 214, 248, 14, 7, - 214, 247, 14, 7, 214, 246, 14, 7, 214, 245, 14, 7, 214, 244, 14, 7, 214, - 243, 14, 7, 214, 242, 14, 7, 214, 241, 14, 7, 214, 240, 14, 7, 214, 239, - 14, 7, 214, 238, 14, 7, 214, 237, 14, 7, 214, 236, 14, 7, 214, 235, 14, - 7, 214, 234, 14, 7, 214, 233, 14, 7, 214, 232, 14, 7, 214, 231, 14, 7, - 214, 230, 14, 7, 214, 229, 14, 7, 214, 228, 14, 7, 214, 227, 14, 7, 214, - 226, 14, 7, 214, 225, 14, 7, 214, 224, 14, 7, 214, 223, 14, 7, 214, 222, - 14, 7, 214, 221, 14, 7, 214, 220, 14, 7, 214, 219, 14, 7, 214, 218, 14, - 7, 214, 217, 14, 7, 214, 216, 14, 7, 214, 215, 14, 7, 214, 214, 14, 7, - 214, 213, 14, 7, 214, 212, 14, 7, 214, 211, 14, 7, 214, 210, 14, 7, 214, - 209, 14, 7, 214, 208, 14, 7, 214, 207, 14, 7, 214, 206, 14, 7, 214, 205, - 14, 7, 214, 204, 14, 7, 214, 203, 14, 7, 214, 202, 14, 7, 214, 201, 14, - 7, 214, 200, 14, 7, 214, 199, 14, 7, 214, 198, 14, 7, 214, 197, 14, 7, - 214, 196, 14, 7, 214, 195, 14, 7, 214, 194, 14, 7, 214, 193, 14, 7, 214, - 192, 14, 7, 214, 2, 14, 7, 214, 1, 14, 7, 214, 0, 14, 7, 213, 255, 14, 7, - 213, 254, 14, 7, 213, 253, 14, 7, 213, 252, 14, 7, 213, 251, 14, 7, 213, - 250, 14, 7, 213, 249, 14, 7, 213, 248, 14, 7, 213, 247, 14, 7, 213, 246, - 14, 7, 211, 166, 14, 7, 211, 165, 14, 7, 211, 164, 14, 7, 211, 163, 14, - 7, 211, 162, 14, 7, 211, 161, 14, 7, 211, 160, 14, 7, 211, 30, 14, 7, - 211, 29, 14, 7, 211, 28, 14, 7, 211, 27, 14, 7, 211, 26, 14, 7, 211, 25, - 14, 7, 211, 24, 14, 7, 211, 23, 14, 7, 211, 22, 14, 7, 211, 21, 14, 7, - 211, 20, 14, 7, 211, 19, 14, 7, 211, 18, 14, 7, 211, 17, 14, 7, 211, 16, - 14, 7, 211, 15, 14, 7, 211, 14, 14, 7, 211, 13, 14, 7, 211, 12, 14, 7, - 211, 11, 14, 7, 211, 10, 14, 7, 211, 9, 14, 7, 211, 8, 14, 7, 211, 7, 14, - 7, 211, 6, 14, 7, 211, 5, 14, 7, 211, 4, 14, 7, 211, 3, 14, 7, 211, 2, - 14, 7, 211, 1, 14, 7, 211, 0, 14, 7, 210, 255, 14, 7, 210, 254, 14, 7, - 210, 253, 14, 7, 209, 77, 14, 7, 209, 76, 14, 7, 209, 75, 14, 7, 209, 74, - 14, 7, 209, 73, 14, 7, 209, 72, 14, 7, 209, 71, 14, 7, 209, 70, 14, 7, - 209, 69, 14, 7, 209, 68, 14, 7, 209, 67, 14, 7, 209, 66, 14, 7, 209, 65, - 14, 7, 209, 64, 14, 7, 209, 63, 14, 7, 209, 62, 14, 7, 209, 61, 14, 7, - 209, 60, 14, 7, 209, 59, 14, 7, 209, 58, 14, 7, 209, 57, 14, 7, 209, 56, - 14, 7, 209, 55, 14, 7, 209, 54, 14, 7, 209, 53, 14, 7, 209, 52, 14, 7, - 209, 51, 14, 7, 209, 50, 14, 7, 209, 49, 14, 7, 209, 48, 14, 7, 209, 47, - 14, 7, 209, 46, 14, 7, 209, 45, 14, 7, 209, 44, 14, 7, 209, 43, 14, 7, - 209, 42, 14, 7, 209, 41, 14, 7, 209, 40, 14, 7, 209, 39, 14, 7, 209, 38, - 14, 7, 209, 37, 14, 7, 209, 36, 14, 7, 209, 35, 14, 7, 209, 34, 14, 7, - 209, 33, 14, 7, 209, 32, 14, 7, 209, 31, 14, 7, 209, 30, 14, 7, 209, 29, - 14, 7, 209, 28, 14, 7, 209, 27, 14, 7, 209, 26, 14, 7, 209, 25, 14, 7, - 209, 24, 14, 7, 203, 213, 14, 7, 203, 212, 14, 7, 203, 211, 14, 7, 203, - 210, 14, 7, 203, 209, 14, 7, 203, 208, 14, 7, 203, 207, 14, 7, 203, 206, - 14, 7, 203, 205, 14, 7, 203, 204, 14, 7, 203, 203, 14, 7, 203, 202, 14, - 7, 203, 201, 14, 7, 203, 200, 14, 7, 203, 199, 14, 7, 203, 198, 14, 7, - 203, 197, 14, 7, 203, 196, 14, 7, 203, 195, 14, 7, 203, 194, 14, 7, 203, - 193, 14, 7, 203, 192, 14, 7, 203, 191, 14, 7, 203, 190, 14, 7, 203, 189, - 14, 7, 203, 188, 14, 7, 203, 187, 14, 7, 203, 186, 14, 7, 203, 185, 14, - 7, 203, 184, 14, 7, 203, 183, 14, 7, 203, 182, 14, 7, 203, 181, 14, 7, - 203, 180, 14, 7, 203, 179, 14, 7, 203, 178, 14, 7, 203, 177, 14, 7, 203, - 176, 14, 7, 203, 175, 14, 7, 203, 174, 14, 7, 203, 173, 14, 7, 203, 172, - 14, 7, 203, 171, 14, 7, 203, 170, 14, 7, 200, 163, 14, 7, 200, 162, 14, - 7, 200, 161, 14, 7, 200, 160, 14, 7, 200, 159, 14, 7, 200, 158, 14, 7, - 200, 157, 14, 7, 200, 156, 14, 7, 200, 155, 14, 7, 200, 154, 14, 7, 200, - 153, 14, 7, 200, 152, 14, 7, 200, 151, 14, 7, 200, 150, 14, 7, 200, 149, - 14, 7, 200, 148, 14, 7, 200, 147, 14, 7, 200, 146, 14, 7, 200, 145, 14, - 7, 200, 144, 14, 7, 200, 143, 14, 7, 200, 142, 14, 7, 200, 141, 14, 7, - 200, 140, 14, 7, 200, 139, 14, 7, 200, 138, 14, 7, 200, 137, 14, 7, 200, - 136, 14, 7, 200, 135, 14, 7, 200, 134, 14, 7, 200, 133, 14, 7, 200, 132, - 14, 7, 200, 131, 14, 7, 200, 130, 14, 7, 200, 129, 14, 7, 200, 128, 14, - 7, 200, 127, 14, 7, 200, 126, 14, 7, 200, 125, 14, 7, 200, 124, 14, 7, - 200, 123, 14, 7, 200, 122, 14, 7, 200, 121, 14, 7, 200, 120, 14, 7, 200, - 119, 14, 7, 200, 118, 14, 7, 200, 117, 14, 7, 199, 229, 14, 7, 199, 228, - 14, 7, 199, 227, 14, 7, 199, 226, 14, 7, 199, 225, 14, 7, 199, 224, 14, - 7, 199, 223, 14, 7, 199, 222, 14, 7, 199, 221, 14, 7, 199, 220, 14, 7, - 199, 219, 14, 7, 199, 218, 14, 7, 199, 217, 14, 7, 199, 216, 14, 7, 199, - 215, 14, 7, 199, 214, 14, 7, 199, 213, 14, 7, 199, 212, 14, 7, 199, 211, - 14, 7, 199, 210, 14, 7, 199, 209, 14, 7, 199, 208, 14, 7, 199, 207, 14, - 7, 199, 206, 14, 7, 199, 205, 14, 7, 199, 204, 14, 7, 199, 203, 14, 7, - 199, 202, 14, 7, 199, 201, 14, 7, 199, 200, 14, 7, 199, 199, 14, 7, 199, - 198, 14, 7, 199, 197, 14, 7, 199, 196, 14, 7, 199, 195, 14, 7, 199, 194, - 14, 7, 199, 193, 14, 7, 199, 192, 14, 7, 199, 191, 14, 7, 199, 190, 14, - 7, 199, 189, 14, 7, 199, 188, 14, 7, 199, 187, 14, 7, 199, 186, 14, 7, - 199, 185, 14, 7, 199, 184, 14, 7, 199, 183, 14, 7, 199, 182, 14, 7, 199, - 181, 14, 7, 199, 180, 14, 7, 199, 179, 14, 7, 199, 178, 14, 7, 199, 177, - 14, 7, 199, 176, 14, 7, 199, 175, 14, 7, 199, 174, 14, 7, 199, 173, 14, - 7, 199, 172, 14, 7, 199, 171, 14, 7, 199, 170, 14, 7, 199, 169, 14, 7, - 199, 168, 14, 7, 199, 167, 14, 7, 199, 166, 14, 7, 199, 165, 14, 7, 199, - 164, 14, 7, 199, 163, 14, 7, 199, 162, 14, 7, 199, 161, 14, 7, 199, 160, - 14, 7, 199, 159, 14, 7, 199, 158, 14, 7, 199, 157, 14, 7, 199, 156, 14, - 7, 199, 155, 14, 7, 199, 154, 14, 7, 199, 153, 14, 7, 197, 198, 14, 7, - 197, 197, 14, 7, 197, 196, 14, 7, 197, 195, 14, 7, 197, 194, 14, 7, 197, - 193, 14, 7, 197, 192, 14, 7, 197, 191, 14, 7, 197, 190, 14, 7, 197, 189, - 14, 7, 197, 188, 14, 7, 197, 187, 14, 7, 197, 186, 14, 7, 197, 185, 14, - 7, 197, 184, 14, 7, 197, 183, 14, 7, 197, 182, 14, 7, 197, 181, 14, 7, - 197, 180, 14, 7, 197, 179, 14, 7, 197, 178, 14, 7, 197, 177, 14, 7, 197, - 176, 14, 7, 197, 175, 14, 7, 197, 174, 14, 7, 197, 173, 14, 7, 197, 172, - 14, 7, 197, 171, 14, 7, 197, 170, 14, 7, 197, 169, 14, 7, 197, 168, 14, - 7, 197, 167, 14, 7, 196, 220, 14, 7, 196, 219, 14, 7, 196, 218, 14, 7, - 196, 217, 14, 7, 196, 216, 14, 7, 196, 215, 14, 7, 196, 214, 14, 7, 196, - 213, 14, 7, 196, 212, 14, 7, 196, 211, 14, 7, 196, 210, 14, 7, 196, 209, - 14, 7, 196, 146, 14, 7, 196, 145, 14, 7, 196, 144, 14, 7, 196, 143, 14, - 7, 196, 142, 14, 7, 196, 141, 14, 7, 196, 140, 14, 7, 196, 139, 14, 7, - 196, 138, 14, 7, 195, 157, 14, 7, 195, 156, 14, 7, 195, 155, 14, 7, 195, - 154, 14, 7, 195, 153, 14, 7, 195, 152, 14, 7, 195, 151, 14, 7, 195, 150, - 14, 7, 195, 149, 14, 7, 195, 148, 14, 7, 195, 147, 14, 7, 195, 146, 14, - 7, 195, 145, 14, 7, 195, 144, 14, 7, 195, 143, 14, 7, 195, 142, 14, 7, - 195, 141, 14, 7, 195, 140, 14, 7, 195, 139, 14, 7, 195, 138, 14, 7, 195, - 137, 14, 7, 195, 136, 14, 7, 195, 135, 14, 7, 195, 134, 14, 7, 195, 133, - 14, 7, 195, 132, 14, 7, 195, 131, 14, 7, 195, 130, 14, 7, 195, 129, 14, - 7, 195, 128, 14, 7, 195, 127, 14, 7, 195, 126, 14, 7, 195, 125, 14, 7, - 195, 124, 14, 7, 195, 123, 14, 7, 195, 122, 14, 7, 195, 121, 14, 7, 195, - 120, 14, 7, 195, 119, 14, 7, 195, 118, 14, 7, 195, 117, 14, 7, 252, 167, - 14, 7, 252, 166, 14, 7, 252, 165, 14, 7, 252, 164, 14, 7, 252, 163, 14, - 7, 252, 162, 14, 7, 252, 161, 14, 7, 252, 160, 14, 7, 252, 159, 14, 7, - 252, 158, 14, 7, 252, 157, 14, 7, 252, 156, 14, 7, 252, 155, 14, 7, 252, - 154, 14, 7, 252, 153, 14, 7, 252, 152, 14, 7, 252, 151, 14, 7, 252, 150, - 14, 7, 252, 149, 14, 7, 252, 148, 14, 7, 252, 147, 14, 7, 252, 146, 14, - 7, 252, 145, 14, 7, 252, 144, 14, 7, 252, 143, 14, 7, 252, 142, 14, 7, - 252, 141, 14, 7, 252, 140, 14, 7, 252, 139, 14, 7, 252, 138, 14, 7, 252, - 137, 14, 7, 252, 136, 14, 7, 252, 135, 14, 7, 252, 134, 14, 7, 83, 225, - 124, 14, 7, 231, 155, 225, 124, 14, 7, 226, 44, 250, 169, 201, 243, 205, - 2, 14, 7, 226, 44, 250, 169, 248, 85, 205, 2, 14, 7, 226, 44, 250, 169, - 201, 243, 236, 221, 14, 7, 226, 44, 250, 169, 248, 85, 236, 221, 14, 7, - 214, 21, 219, 63, 14, 7, 248, 243, 208, 122, 14, 7, 236, 222, 208, 122, - 28, 7, 255, 161, 28, 7, 255, 160, 28, 7, 255, 159, 28, 7, 255, 158, 28, - 7, 255, 157, 28, 7, 255, 155, 28, 7, 255, 152, 28, 7, 255, 151, 28, 7, - 255, 150, 28, 7, 255, 149, 28, 7, 255, 148, 28, 7, 255, 147, 28, 7, 255, - 146, 28, 7, 255, 145, 28, 7, 255, 144, 28, 7, 255, 142, 28, 7, 255, 141, - 28, 7, 255, 140, 28, 7, 255, 138, 28, 7, 255, 137, 28, 7, 255, 136, 28, - 7, 255, 135, 28, 7, 255, 134, 28, 7, 255, 133, 28, 7, 255, 132, 28, 7, - 255, 131, 28, 7, 255, 130, 28, 7, 255, 129, 28, 7, 255, 128, 28, 7, 255, - 127, 28, 7, 255, 125, 28, 7, 255, 124, 28, 7, 255, 123, 28, 7, 255, 122, - 28, 7, 255, 120, 28, 7, 255, 119, 28, 7, 255, 118, 28, 7, 255, 117, 28, - 7, 255, 116, 28, 7, 255, 115, 28, 7, 255, 114, 28, 7, 255, 113, 28, 7, - 255, 112, 28, 7, 255, 110, 28, 7, 255, 109, 28, 7, 255, 108, 28, 7, 255, - 106, 28, 7, 255, 104, 28, 7, 255, 103, 28, 7, 255, 102, 28, 7, 255, 101, - 28, 7, 255, 100, 28, 7, 255, 99, 28, 7, 255, 98, 28, 7, 255, 97, 28, 7, - 255, 96, 28, 7, 255, 95, 28, 7, 255, 94, 28, 7, 255, 93, 28, 7, 255, 92, - 28, 7, 255, 91, 28, 7, 255, 90, 28, 7, 255, 89, 28, 7, 255, 88, 28, 7, - 255, 87, 28, 7, 255, 86, 28, 7, 255, 85, 28, 7, 255, 84, 28, 7, 255, 83, - 28, 7, 255, 82, 28, 7, 255, 81, 28, 7, 255, 80, 28, 7, 255, 79, 28, 7, - 255, 78, 28, 7, 255, 77, 28, 7, 255, 76, 28, 7, 255, 75, 28, 7, 255, 74, - 28, 7, 255, 73, 28, 7, 255, 72, 28, 7, 255, 71, 28, 7, 255, 70, 28, 7, - 255, 69, 28, 7, 255, 68, 28, 7, 255, 67, 28, 7, 255, 66, 28, 7, 255, 65, - 28, 7, 255, 64, 28, 7, 255, 63, 28, 7, 255, 62, 28, 7, 255, 61, 28, 7, - 255, 60, 28, 7, 255, 59, 28, 7, 255, 58, 28, 7, 255, 57, 28, 7, 255, 56, - 28, 7, 255, 55, 28, 7, 255, 54, 28, 7, 255, 53, 28, 7, 255, 52, 28, 7, - 255, 51, 28, 7, 255, 50, 28, 7, 255, 49, 28, 7, 255, 48, 28, 7, 255, 47, - 28, 7, 255, 46, 28, 7, 255, 45, 28, 7, 255, 44, 28, 7, 255, 43, 28, 7, - 255, 42, 28, 7, 255, 41, 28, 7, 255, 40, 28, 7, 255, 38, 28, 7, 255, 37, - 28, 7, 255, 36, 28, 7, 255, 35, 28, 7, 255, 34, 28, 7, 255, 33, 28, 7, - 255, 32, 28, 7, 255, 31, 28, 7, 255, 30, 28, 7, 255, 29, 28, 7, 255, 28, - 28, 7, 255, 27, 28, 7, 255, 26, 28, 7, 255, 25, 28, 7, 255, 24, 28, 7, - 255, 23, 28, 7, 255, 22, 28, 7, 255, 21, 28, 7, 255, 20, 28, 7, 255, 19, - 28, 7, 255, 18, 28, 7, 255, 17, 28, 7, 255, 16, 28, 7, 255, 15, 28, 7, - 255, 14, 28, 7, 255, 13, 28, 7, 255, 12, 28, 7, 255, 11, 28, 7, 255, 10, - 28, 7, 255, 9, 28, 7, 255, 8, 28, 7, 255, 7, 28, 7, 255, 6, 28, 7, 255, - 5, 28, 7, 255, 3, 28, 7, 255, 2, 28, 7, 255, 1, 28, 7, 255, 0, 28, 7, - 254, 255, 28, 7, 254, 254, 28, 7, 254, 253, 28, 7, 254, 252, 28, 7, 254, - 251, 28, 7, 254, 250, 28, 7, 254, 249, 28, 7, 254, 248, 28, 7, 254, 246, - 28, 7, 254, 245, 28, 7, 254, 244, 28, 7, 254, 243, 28, 7, 254, 242, 28, - 7, 254, 241, 28, 7, 254, 240, 28, 7, 254, 239, 28, 7, 254, 238, 28, 7, - 254, 237, 28, 7, 254, 236, 28, 7, 254, 235, 28, 7, 254, 234, 28, 7, 254, - 233, 28, 7, 254, 232, 28, 7, 254, 231, 28, 7, 254, 230, 28, 7, 254, 229, - 28, 7, 254, 228, 28, 7, 254, 227, 28, 7, 254, 226, 28, 7, 254, 225, 28, - 7, 254, 224, 28, 7, 254, 223, 28, 7, 254, 222, 28, 7, 254, 221, 28, 7, - 254, 220, 28, 7, 254, 219, 28, 7, 254, 218, 28, 7, 254, 217, 28, 7, 254, - 216, 28, 7, 254, 215, 28, 7, 254, 214, 28, 7, 254, 213, 28, 7, 254, 212, - 28, 7, 254, 211, 28, 7, 254, 210, 28, 7, 254, 209, 28, 7, 254, 208, 28, - 7, 254, 207, 28, 7, 254, 206, 28, 7, 254, 205, 28, 7, 254, 204, 28, 7, - 254, 203, 28, 7, 254, 202, 28, 7, 254, 201, 28, 7, 254, 200, 28, 7, 254, - 199, 28, 7, 254, 198, 28, 7, 254, 197, 28, 7, 254, 196, 28, 7, 254, 195, - 28, 7, 254, 194, 28, 7, 254, 193, 28, 7, 254, 192, 28, 7, 254, 191, 28, - 7, 254, 190, 28, 7, 254, 189, 28, 7, 254, 188, 28, 7, 254, 187, 28, 7, - 254, 186, 28, 7, 254, 185, 28, 7, 254, 184, 28, 7, 254, 183, 28, 7, 254, - 182, 28, 7, 254, 181, 28, 7, 254, 180, 28, 7, 254, 179, 28, 7, 254, 178, - 28, 7, 254, 176, 28, 7, 254, 175, 28, 7, 254, 174, 28, 7, 254, 173, 28, - 7, 254, 172, 28, 7, 254, 171, 28, 7, 254, 170, 28, 7, 254, 169, 28, 7, - 254, 168, 28, 7, 254, 167, 28, 7, 254, 166, 28, 7, 254, 165, 28, 7, 254, - 164, 28, 7, 254, 163, 28, 7, 254, 162, 28, 7, 254, 161, 28, 7, 254, 160, - 28, 7, 254, 159, 28, 7, 254, 158, 28, 7, 254, 157, 28, 7, 254, 156, 28, - 7, 254, 155, 28, 7, 254, 154, 28, 7, 254, 153, 28, 7, 254, 152, 28, 7, - 254, 151, 28, 7, 254, 150, 28, 7, 254, 149, 28, 7, 254, 148, 28, 7, 254, - 147, 28, 7, 254, 146, 28, 7, 254, 145, 28, 7, 254, 144, 28, 7, 254, 143, - 28, 7, 254, 142, 28, 7, 254, 141, 28, 7, 254, 140, 28, 7, 254, 139, 28, - 7, 254, 138, 28, 7, 254, 137, 28, 7, 254, 136, 28, 7, 254, 135, 28, 7, - 254, 134, 28, 7, 254, 133, 28, 7, 254, 132, 28, 7, 254, 131, 28, 7, 254, - 130, 28, 7, 254, 129, 28, 7, 254, 128, 28, 7, 254, 127, 28, 7, 254, 126, - 28, 7, 254, 125, 28, 7, 254, 124, 28, 7, 254, 123, 28, 7, 254, 122, 28, - 7, 254, 121, 28, 7, 254, 120, 28, 7, 254, 119, 28, 7, 254, 118, 28, 7, - 254, 117, 28, 7, 254, 116, 28, 7, 254, 115, 28, 7, 254, 114, 28, 7, 254, - 113, 28, 7, 254, 112, 28, 7, 254, 111, 28, 7, 254, 110, 28, 7, 254, 109, - 28, 7, 254, 108, 28, 7, 254, 107, 28, 7, 254, 106, 28, 7, 254, 105, 28, - 7, 254, 104, 28, 7, 254, 103, 28, 7, 254, 102, 28, 7, 254, 101, 28, 7, - 254, 100, 28, 7, 254, 99, 28, 7, 254, 98, 28, 7, 254, 97, 28, 7, 254, 96, - 28, 7, 254, 95, 28, 7, 254, 94, 28, 7, 254, 93, 28, 7, 254, 92, 28, 7, - 254, 91, 28, 7, 254, 90, 28, 7, 254, 89, 28, 7, 254, 88, 28, 7, 254, 87, - 28, 7, 254, 86, 28, 7, 254, 85, 28, 7, 254, 84, 28, 7, 254, 83, 28, 7, - 254, 82, 28, 7, 254, 81, 28, 7, 254, 80, 28, 7, 254, 79, 28, 7, 254, 78, - 28, 7, 254, 77, 28, 7, 254, 76, 28, 7, 254, 75, 28, 7, 254, 74, 28, 7, - 254, 73, 28, 7, 254, 72, 28, 7, 254, 71, 28, 7, 254, 70, 28, 7, 254, 69, - 28, 7, 254, 68, 28, 7, 254, 67, 28, 7, 254, 66, 28, 7, 254, 64, 28, 7, - 254, 63, 28, 7, 254, 62, 28, 7, 254, 61, 28, 7, 254, 60, 28, 7, 254, 59, - 28, 7, 254, 58, 28, 7, 254, 57, 28, 7, 254, 56, 28, 7, 254, 55, 28, 7, - 254, 54, 28, 7, 254, 51, 28, 7, 254, 50, 28, 7, 254, 49, 28, 7, 254, 48, - 28, 7, 254, 44, 28, 7, 254, 43, 28, 7, 254, 42, 28, 7, 254, 41, 28, 7, - 254, 40, 28, 7, 254, 39, 28, 7, 254, 38, 28, 7, 254, 37, 28, 7, 254, 36, - 28, 7, 254, 35, 28, 7, 254, 34, 28, 7, 254, 33, 28, 7, 254, 32, 28, 7, - 254, 31, 28, 7, 254, 30, 28, 7, 254, 29, 28, 7, 254, 28, 28, 7, 254, 27, - 28, 7, 254, 26, 28, 7, 254, 24, 28, 7, 254, 23, 28, 7, 254, 22, 28, 7, - 254, 21, 28, 7, 254, 20, 28, 7, 254, 19, 28, 7, 254, 18, 28, 7, 254, 17, - 28, 7, 254, 16, 28, 7, 254, 15, 28, 7, 254, 14, 28, 7, 254, 13, 28, 7, - 254, 12, 28, 7, 254, 11, 28, 7, 254, 10, 28, 7, 254, 9, 28, 7, 254, 8, - 28, 7, 254, 7, 28, 7, 254, 6, 28, 7, 254, 5, 28, 7, 254, 4, 28, 7, 254, - 3, 28, 7, 254, 2, 28, 7, 254, 1, 28, 7, 254, 0, 28, 7, 253, 255, 28, 7, - 253, 254, 28, 7, 253, 253, 28, 7, 253, 252, 28, 7, 253, 251, 28, 7, 253, - 250, 28, 7, 253, 249, 28, 7, 253, 248, 28, 7, 253, 247, 28, 7, 253, 246, - 28, 7, 253, 245, 28, 7, 253, 244, 28, 7, 253, 243, 28, 7, 253, 242, 28, - 7, 253, 241, 28, 7, 253, 240, 28, 7, 253, 239, 28, 7, 253, 238, 28, 7, - 253, 237, 28, 7, 253, 236, 28, 7, 253, 235, 28, 7, 253, 234, 28, 7, 253, - 233, 28, 7, 253, 232, 28, 7, 253, 231, 28, 7, 253, 230, 28, 7, 253, 229, - 28, 7, 253, 228, 28, 7, 253, 227, 28, 7, 253, 226, 28, 7, 253, 225, 28, - 7, 253, 224, 28, 7, 253, 223, 28, 7, 253, 222, 28, 7, 253, 221, 28, 7, - 253, 220, 28, 7, 253, 219, 210, 252, 214, 73, 210, 72, 28, 7, 253, 218, - 28, 7, 253, 217, 28, 7, 253, 216, 28, 7, 253, 215, 28, 7, 253, 214, 28, - 7, 253, 213, 28, 7, 253, 212, 28, 7, 253, 211, 28, 7, 253, 210, 28, 7, - 253, 209, 28, 7, 253, 208, 28, 7, 253, 207, 171, 28, 7, 253, 206, 28, 7, - 253, 205, 28, 7, 253, 204, 28, 7, 253, 203, 28, 7, 253, 202, 28, 7, 253, - 201, 28, 7, 253, 200, 28, 7, 253, 198, 28, 7, 253, 196, 28, 7, 253, 194, - 28, 7, 253, 192, 28, 7, 253, 190, 28, 7, 253, 188, 28, 7, 253, 186, 28, - 7, 253, 184, 28, 7, 253, 182, 28, 7, 253, 180, 248, 243, 221, 248, 78, - 28, 7, 253, 178, 236, 222, 221, 248, 78, 28, 7, 253, 177, 28, 7, 253, - 175, 28, 7, 253, 173, 28, 7, 253, 171, 28, 7, 253, 169, 28, 7, 253, 167, - 28, 7, 253, 165, 28, 7, 253, 163, 28, 7, 253, 161, 28, 7, 253, 160, 28, - 7, 253, 159, 28, 7, 253, 158, 28, 7, 253, 157, 28, 7, 253, 156, 28, 7, - 253, 155, 28, 7, 253, 154, 28, 7, 253, 153, 28, 7, 253, 152, 28, 7, 253, - 151, 28, 7, 253, 150, 28, 7, 253, 149, 28, 7, 253, 148, 28, 7, 253, 147, - 28, 7, 253, 146, 28, 7, 253, 145, 28, 7, 253, 144, 28, 7, 253, 143, 28, - 7, 253, 142, 28, 7, 253, 141, 28, 7, 253, 140, 28, 7, 253, 139, 28, 7, - 253, 138, 28, 7, 253, 137, 28, 7, 253, 136, 28, 7, 253, 135, 28, 7, 253, - 134, 28, 7, 253, 133, 28, 7, 253, 132, 28, 7, 253, 131, 28, 7, 253, 130, - 28, 7, 253, 129, 28, 7, 253, 128, 28, 7, 253, 127, 28, 7, 253, 126, 28, - 7, 253, 125, 28, 7, 253, 124, 28, 7, 253, 123, 28, 7, 253, 122, 28, 7, - 253, 121, 28, 7, 253, 120, 28, 7, 253, 119, 28, 7, 253, 118, 28, 7, 253, - 117, 28, 7, 253, 116, 28, 7, 253, 115, 28, 7, 253, 114, 28, 7, 253, 113, - 28, 7, 253, 112, 28, 7, 253, 111, 28, 7, 253, 110, 28, 7, 253, 109, 28, - 7, 253, 108, 28, 7, 253, 107, 28, 7, 253, 106, 28, 7, 253, 105, 28, 7, - 253, 104, 28, 7, 253, 103, 28, 7, 253, 102, 28, 7, 253, 101, 28, 7, 253, - 100, 28, 7, 253, 99, 28, 7, 253, 98, 28, 7, 253, 97, 28, 7, 253, 96, 28, - 7, 253, 95, 28, 7, 253, 94, 28, 7, 253, 93, 28, 7, 253, 92, 28, 7, 253, - 91, 28, 7, 253, 90, 28, 7, 253, 89, 28, 7, 253, 88, 28, 7, 253, 87, 28, - 7, 253, 86, 28, 7, 253, 85, 28, 7, 253, 84, 28, 7, 253, 83, 28, 7, 253, - 82, 28, 7, 253, 81, 28, 7, 253, 80, 28, 7, 253, 79, 28, 7, 253, 78, 28, - 7, 253, 77, 28, 7, 253, 76, 28, 7, 253, 75, 28, 7, 253, 74, 28, 7, 253, - 73, 28, 7, 253, 72, 28, 7, 253, 71, 28, 7, 253, 70, 28, 7, 253, 69, 28, - 7, 253, 68, 28, 7, 253, 67, 28, 7, 253, 66, 28, 7, 253, 65, 28, 7, 253, - 64, 28, 7, 253, 63, 28, 7, 253, 62, 28, 7, 253, 61, 28, 7, 253, 60, 28, - 7, 253, 59, 28, 7, 253, 58, 28, 7, 253, 57, 28, 7, 253, 56, 28, 7, 253, - 55, 28, 7, 253, 54, 28, 7, 253, 53, 28, 7, 253, 52, 28, 7, 253, 51, 25, - 1, 212, 252, 217, 4, 219, 120, 25, 1, 212, 252, 234, 56, 235, 43, 25, 1, - 212, 252, 212, 94, 219, 121, 212, 167, 25, 1, 212, 252, 212, 94, 219, - 121, 212, 168, 25, 1, 212, 252, 217, 245, 219, 120, 25, 1, 212, 252, 206, - 146, 25, 1, 212, 252, 202, 56, 219, 120, 25, 1, 212, 252, 215, 55, 219, - 120, 25, 1, 212, 252, 206, 210, 213, 244, 216, 148, 25, 1, 212, 252, 212, - 94, 213, 244, 216, 149, 212, 167, 25, 1, 212, 252, 212, 94, 213, 244, - 216, 149, 212, 168, 25, 1, 212, 252, 220, 99, 25, 1, 212, 252, 201, 41, - 220, 100, 25, 1, 212, 252, 217, 65, 25, 1, 212, 252, 220, 96, 25, 1, 212, - 252, 220, 49, 25, 1, 212, 252, 218, 78, 25, 1, 212, 252, 207, 73, 25, 1, - 212, 252, 215, 195, 25, 1, 212, 252, 224, 165, 25, 1, 212, 252, 216, 115, - 25, 1, 212, 252, 204, 74, 25, 1, 212, 252, 217, 3, 25, 1, 212, 252, 222, - 230, 25, 1, 212, 252, 222, 137, 223, 145, 25, 1, 212, 252, 215, 205, 219, - 128, 25, 1, 212, 252, 220, 103, 25, 1, 212, 252, 213, 125, 25, 1, 212, - 252, 233, 211, 25, 1, 212, 252, 213, 195, 25, 1, 212, 252, 218, 216, 217, - 38, 25, 1, 212, 252, 215, 36, 219, 131, 25, 1, 212, 252, 118, 195, 187, - 217, 238, 25, 1, 212, 252, 233, 212, 25, 1, 212, 252, 215, 205, 215, 206, - 25, 1, 212, 252, 206, 32, 25, 1, 212, 252, 219, 113, 25, 1, 212, 252, - 219, 134, 25, 1, 212, 252, 218, 191, 25, 1, 212, 252, 225, 34, 25, 1, - 212, 252, 213, 244, 222, 185, 25, 1, 212, 252, 217, 160, 222, 185, 25, 1, - 212, 252, 213, 18, 25, 1, 212, 252, 220, 97, 25, 1, 212, 252, 216, 189, - 25, 1, 212, 252, 211, 206, 25, 1, 212, 252, 201, 33, 25, 1, 212, 252, - 221, 187, 25, 1, 212, 252, 205, 172, 25, 1, 212, 252, 202, 242, 25, 1, - 212, 252, 220, 94, 25, 1, 212, 252, 224, 172, 25, 1, 212, 252, 217, 156, - 25, 1, 212, 252, 223, 159, 25, 1, 212, 252, 218, 192, 25, 1, 212, 252, - 206, 142, 25, 1, 212, 252, 221, 241, 25, 1, 212, 252, 235, 114, 25, 1, - 212, 252, 209, 209, 25, 1, 212, 252, 223, 212, 25, 1, 212, 252, 205, 168, - 25, 1, 212, 252, 220, 44, 212, 210, 25, 1, 212, 252, 206, 203, 25, 1, - 212, 252, 215, 204, 25, 1, 212, 252, 206, 184, 215, 216, 195, 195, 25, 1, - 212, 252, 215, 77, 218, 212, 25, 1, 212, 252, 213, 239, 25, 1, 212, 252, - 216, 117, 25, 1, 212, 252, 200, 44, 25, 1, 212, 252, 217, 41, 25, 1, 212, - 252, 220, 93, 25, 1, 212, 252, 216, 160, 25, 1, 212, 252, 219, 236, 25, - 1, 212, 252, 215, 92, 25, 1, 212, 252, 202, 246, 25, 1, 212, 252, 205, - 165, 25, 1, 212, 252, 213, 240, 25, 1, 212, 252, 215, 220, 25, 1, 212, - 252, 220, 101, 25, 1, 212, 252, 215, 89, 25, 1, 212, 252, 224, 252, 25, - 1, 212, 252, 215, 223, 25, 1, 212, 252, 199, 113, 25, 1, 212, 252, 221, - 191, 25, 1, 212, 252, 217, 101, 25, 1, 212, 252, 217, 212, 25, 1, 212, - 252, 219, 235, 25, 1, 212, 251, 215, 218, 25, 1, 212, 251, 201, 41, 220, - 98, 25, 1, 212, 251, 206, 94, 25, 1, 212, 251, 207, 77, 201, 40, 25, 1, - 212, 251, 221, 243, 215, 201, 25, 1, 212, 251, 219, 242, 220, 102, 25, 1, - 212, 251, 224, 85, 25, 1, 212, 251, 196, 32, 25, 1, 212, 251, 219, 237, - 25, 1, 212, 251, 225, 20, 25, 1, 212, 251, 213, 75, 25, 1, 212, 251, 196, - 115, 222, 185, 25, 1, 212, 251, 222, 250, 215, 216, 215, 103, 25, 1, 212, - 251, 215, 198, 206, 229, 25, 1, 212, 251, 217, 127, 216, 163, 25, 1, 212, - 251, 233, 209, 25, 1, 212, 251, 212, 157, 25, 1, 212, 251, 201, 41, 215, - 214, 25, 1, 212, 251, 206, 234, 216, 158, 25, 1, 212, 251, 206, 230, 25, - 1, 212, 251, 219, 121, 202, 245, 25, 1, 212, 251, 219, 224, 219, 238, 25, - 1, 212, 251, 215, 90, 215, 201, 25, 1, 212, 251, 224, 161, 25, 1, 212, - 251, 233, 210, 25, 1, 212, 251, 224, 157, 25, 1, 212, 251, 223, 77, 25, - 1, 212, 251, 213, 128, 25, 1, 212, 251, 199, 42, 25, 1, 212, 251, 217, 5, - 218, 76, 25, 1, 212, 251, 217, 40, 219, 220, 25, 1, 212, 251, 196, 241, - 25, 1, 212, 251, 208, 247, 25, 1, 212, 251, 203, 158, 25, 1, 212, 251, - 219, 133, 25, 1, 212, 251, 217, 24, 25, 1, 212, 251, 217, 25, 222, 227, - 25, 1, 212, 251, 219, 123, 25, 1, 212, 251, 204, 127, 25, 1, 212, 251, - 219, 228, 25, 1, 212, 251, 218, 196, 25, 1, 212, 251, 215, 107, 25, 1, - 212, 251, 211, 210, 25, 1, 212, 251, 219, 132, 217, 42, 25, 1, 212, 251, - 235, 158, 25, 1, 212, 251, 219, 215, 25, 1, 212, 251, 235, 182, 25, 1, - 212, 251, 224, 169, 25, 1, 212, 251, 220, 128, 216, 152, 25, 1, 212, 251, - 220, 128, 216, 128, 25, 1, 212, 251, 222, 136, 25, 1, 212, 251, 217, 48, - 25, 1, 212, 251, 215, 225, 25, 1, 212, 251, 166, 25, 1, 212, 251, 224, - 68, 25, 1, 212, 251, 216, 249, 25, 1, 193, 217, 4, 220, 100, 25, 1, 193, - 215, 54, 25, 1, 193, 195, 195, 25, 1, 193, 197, 143, 25, 1, 193, 217, 41, - 25, 1, 193, 217, 148, 25, 1, 193, 217, 11, 25, 1, 193, 233, 219, 25, 1, - 193, 219, 232, 25, 1, 193, 234, 63, 25, 1, 193, 215, 79, 219, 4, 219, - 135, 25, 1, 193, 215, 192, 219, 223, 25, 1, 193, 219, 229, 25, 1, 193, - 212, 163, 25, 1, 193, 217, 133, 25, 1, 193, 219, 240, 247, 170, 25, 1, - 193, 224, 159, 25, 1, 193, 233, 220, 25, 1, 193, 224, 166, 25, 1, 193, - 195, 218, 218, 109, 25, 1, 193, 215, 48, 25, 1, 193, 219, 217, 25, 1, - 193, 215, 224, 25, 1, 193, 219, 223, 25, 1, 193, 196, 33, 25, 1, 193, - 223, 220, 25, 1, 193, 225, 55, 25, 1, 193, 207, 72, 25, 1, 193, 217, 142, - 25, 1, 193, 203, 156, 25, 1, 193, 216, 132, 25, 1, 193, 202, 56, 195, - 199, 25, 1, 193, 204, 159, 25, 1, 193, 217, 31, 215, 103, 25, 1, 193, - 199, 41, 25, 1, 193, 217, 215, 25, 1, 193, 220, 128, 224, 168, 25, 1, - 193, 215, 206, 25, 1, 193, 217, 26, 25, 1, 193, 222, 231, 25, 1, 193, - 219, 225, 25, 1, 193, 219, 112, 25, 1, 193, 215, 200, 25, 1, 193, 202, - 241, 25, 1, 193, 217, 28, 25, 1, 193, 234, 221, 25, 1, 193, 217, 147, 25, - 1, 193, 215, 226, 25, 1, 193, 215, 222, 25, 1, 193, 247, 253, 25, 1, 193, - 199, 43, 25, 1, 193, 219, 230, 25, 1, 193, 209, 140, 25, 1, 193, 216, - 162, 25, 1, 193, 222, 249, 25, 1, 193, 202, 53, 25, 1, 193, 215, 208, - 216, 249, 25, 1, 193, 216, 154, 25, 1, 193, 224, 172, 25, 1, 193, 217, - 33, 25, 1, 193, 220, 93, 25, 1, 193, 219, 218, 25, 1, 193, 221, 191, 25, - 1, 193, 223, 145, 25, 1, 193, 216, 160, 25, 1, 193, 216, 249, 25, 1, 193, - 196, 231, 25, 1, 193, 217, 29, 25, 1, 193, 215, 211, 25, 1, 193, 215, - 202, 25, 1, 193, 223, 161, 216, 117, 25, 1, 193, 215, 209, 25, 1, 193, - 217, 155, 25, 1, 193, 220, 128, 215, 214, 25, 1, 193, 196, 129, 25, 1, - 193, 217, 154, 25, 1, 193, 206, 145, 25, 1, 193, 207, 75, 25, 1, 193, - 219, 226, 25, 1, 193, 220, 100, 25, 1, 193, 219, 236, 25, 1, 193, 224, - 160, 25, 1, 193, 219, 227, 25, 1, 193, 224, 164, 25, 1, 193, 219, 240, - 212, 215, 25, 1, 193, 195, 178, 25, 1, 193, 216, 150, 25, 1, 193, 219, - 59, 25, 1, 193, 218, 139, 25, 1, 193, 206, 206, 25, 1, 193, 224, 183, - 222, 209, 25, 1, 193, 224, 183, 235, 195, 25, 1, 193, 217, 63, 25, 1, - 193, 217, 212, 25, 1, 193, 222, 57, 25, 1, 193, 212, 176, 25, 1, 193, - 213, 65, 25, 1, 193, 203, 1, 25, 1, 148, 219, 216, 25, 1, 148, 197, 141, - 25, 1, 148, 216, 148, 25, 1, 148, 219, 120, 25, 1, 148, 216, 146, 25, 1, - 148, 222, 102, 25, 1, 148, 216, 151, 25, 1, 148, 215, 221, 25, 1, 148, - 217, 47, 25, 1, 148, 215, 103, 25, 1, 148, 196, 242, 25, 1, 148, 217, 1, - 25, 1, 148, 206, 253, 25, 1, 148, 217, 12, 25, 1, 148, 224, 167, 25, 1, - 148, 202, 243, 25, 1, 148, 206, 232, 25, 1, 148, 216, 159, 25, 1, 148, - 204, 127, 25, 1, 148, 224, 172, 25, 1, 148, 196, 117, 25, 1, 148, 223, - 162, 25, 1, 148, 208, 207, 25, 1, 148, 219, 125, 25, 1, 148, 217, 146, - 25, 1, 148, 220, 65, 25, 1, 148, 219, 131, 25, 1, 148, 207, 74, 25, 1, - 148, 196, 59, 25, 1, 148, 216, 153, 25, 1, 148, 224, 163, 219, 219, 25, - 1, 148, 217, 8, 25, 1, 148, 201, 40, 25, 1, 148, 233, 229, 25, 1, 148, - 216, 254, 25, 1, 148, 235, 159, 25, 1, 148, 217, 150, 25, 1, 148, 219, - 104, 25, 1, 148, 222, 130, 25, 1, 148, 217, 132, 25, 1, 148, 218, 211, - 25, 1, 148, 219, 108, 25, 1, 148, 211, 190, 25, 1, 148, 219, 106, 25, 1, - 148, 219, 122, 25, 1, 148, 221, 174, 25, 1, 148, 215, 213, 25, 1, 148, - 219, 239, 25, 1, 148, 223, 134, 25, 1, 148, 215, 92, 25, 1, 148, 202, - 246, 25, 1, 148, 205, 165, 25, 1, 148, 195, 178, 25, 1, 148, 224, 164, - 25, 1, 148, 210, 228, 25, 1, 148, 203, 47, 25, 1, 148, 217, 9, 25, 1, - 148, 219, 127, 25, 1, 148, 215, 212, 25, 1, 148, 224, 162, 25, 1, 148, - 212, 169, 25, 1, 148, 213, 11, 25, 1, 148, 215, 65, 25, 1, 148, 222, 136, - 25, 1, 148, 217, 48, 25, 1, 148, 219, 124, 25, 1, 148, 217, 21, 25, 1, - 148, 195, 192, 25, 1, 148, 213, 163, 25, 1, 148, 195, 191, 25, 1, 148, - 217, 155, 25, 1, 148, 215, 201, 25, 1, 148, 204, 161, 25, 1, 148, 223, - 166, 25, 1, 148, 217, 37, 25, 1, 148, 217, 6, 25, 1, 148, 201, 15, 25, 1, - 148, 219, 135, 25, 1, 148, 223, 156, 25, 1, 148, 215, 210, 25, 1, 148, - 202, 244, 25, 1, 148, 220, 95, 25, 1, 148, 217, 46, 25, 1, 148, 222, 129, - 25, 1, 148, 217, 27, 25, 1, 148, 215, 215, 25, 1, 148, 216, 132, 25, 1, - 148, 233, 213, 25, 1, 148, 223, 187, 25, 1, 148, 210, 127, 214, 133, 25, - 1, 148, 203, 145, 25, 1, 148, 201, 239, 25, 1, 148, 215, 89, 25, 1, 148, - 210, 9, 25, 1, 148, 222, 187, 25, 1, 148, 219, 187, 25, 1, 148, 221, 136, - 25, 1, 148, 204, 74, 25, 1, 148, 218, 145, 25, 1, 148, 206, 218, 25, 1, - 148, 206, 228, 25, 1, 148, 223, 106, 25, 1, 148, 215, 186, 25, 1, 148, - 206, 151, 25, 1, 148, 215, 203, 25, 1, 148, 213, 79, 25, 1, 148, 216, - 223, 25, 1, 148, 206, 183, 25, 1, 148, 211, 205, 25, 1, 148, 218, 76, 25, - 1, 148, 221, 221, 25, 1, 148, 210, 127, 218, 134, 25, 1, 148, 202, 122, - 25, 1, 148, 215, 189, 25, 1, 148, 219, 240, 178, 25, 1, 148, 208, 205, - 25, 1, 148, 235, 238, 25, 1, 104, 217, 154, 25, 1, 104, 201, 245, 25, 1, - 104, 219, 229, 25, 1, 104, 222, 231, 25, 1, 104, 198, 235, 25, 1, 104, - 221, 227, 25, 1, 104, 213, 243, 25, 1, 104, 205, 176, 25, 1, 104, 210, - 202, 25, 1, 104, 215, 217, 25, 1, 104, 217, 125, 25, 1, 104, 211, 223, - 25, 1, 104, 203, 117, 25, 1, 104, 217, 14, 25, 1, 104, 223, 216, 25, 1, - 104, 196, 234, 25, 1, 104, 208, 129, 25, 1, 104, 217, 38, 25, 1, 104, - 213, 240, 25, 1, 104, 201, 247, 25, 1, 104, 223, 160, 25, 1, 104, 221, - 242, 25, 1, 104, 215, 220, 25, 1, 104, 216, 246, 25, 1, 104, 220, 101, - 25, 1, 104, 217, 7, 25, 1, 104, 216, 245, 25, 1, 104, 215, 219, 25, 1, - 104, 210, 6, 25, 1, 104, 216, 150, 25, 1, 104, 213, 77, 25, 1, 104, 209, - 13, 25, 1, 104, 217, 22, 25, 1, 104, 219, 114, 25, 1, 104, 233, 207, 25, - 1, 104, 217, 10, 25, 1, 104, 216, 161, 25, 1, 104, 220, 43, 25, 1, 104, - 221, 223, 25, 1, 104, 217, 43, 25, 1, 104, 217, 138, 25, 1, 104, 203, - 144, 215, 201, 25, 1, 104, 207, 76, 25, 1, 104, 211, 216, 25, 1, 104, - 217, 158, 205, 184, 25, 1, 104, 217, 30, 215, 103, 25, 1, 104, 196, 20, - 25, 1, 104, 233, 208, 25, 1, 104, 201, 34, 25, 1, 104, 196, 36, 25, 1, - 104, 212, 117, 25, 1, 104, 201, 21, 25, 1, 104, 224, 170, 25, 1, 104, - 204, 160, 25, 1, 104, 202, 245, 25, 1, 104, 199, 44, 25, 1, 104, 197, 84, - 25, 1, 104, 223, 80, 25, 1, 104, 211, 227, 25, 1, 104, 203, 157, 25, 1, - 104, 233, 228, 25, 1, 104, 217, 53, 25, 1, 104, 206, 231, 25, 1, 104, - 219, 109, 25, 1, 104, 219, 233, 25, 1, 104, 215, 52, 25, 1, 104, 216, - 113, 25, 1, 104, 234, 59, 25, 1, 104, 201, 22, 25, 1, 104, 223, 170, 25, - 1, 104, 196, 93, 25, 1, 104, 215, 90, 244, 220, 25, 1, 104, 196, 9, 25, - 1, 104, 219, 126, 25, 1, 104, 217, 143, 25, 1, 104, 212, 211, 25, 1, 104, - 195, 198, 25, 1, 104, 222, 131, 25, 1, 104, 234, 221, 25, 1, 104, 234, - 58, 25, 1, 104, 217, 0, 25, 1, 104, 224, 172, 25, 1, 104, 220, 104, 25, - 1, 104, 217, 13, 25, 1, 104, 233, 214, 25, 1, 104, 235, 239, 25, 1, 104, - 215, 190, 25, 1, 104, 213, 12, 25, 1, 104, 196, 34, 25, 1, 104, 217, 39, - 25, 1, 104, 215, 90, 248, 203, 25, 1, 104, 215, 32, 25, 1, 104, 212, 89, - 25, 1, 104, 219, 59, 25, 1, 104, 234, 219, 25, 1, 104, 217, 238, 25, 1, - 104, 218, 139, 25, 1, 104, 233, 213, 25, 1, 104, 234, 224, 68, 25, 1, - 104, 218, 77, 25, 1, 104, 211, 222, 25, 1, 104, 217, 2, 25, 1, 104, 223, - 145, 25, 1, 104, 212, 208, 25, 1, 104, 215, 204, 25, 1, 104, 196, 35, 25, - 1, 104, 217, 23, 25, 1, 104, 213, 244, 213, 51, 25, 1, 104, 234, 224, - 247, 152, 25, 1, 104, 235, 44, 25, 1, 104, 216, 155, 25, 1, 104, 63, 25, - 1, 104, 201, 239, 25, 1, 104, 72, 25, 1, 104, 68, 25, 1, 104, 222, 229, - 25, 1, 104, 213, 244, 212, 126, 25, 1, 104, 203, 162, 25, 1, 104, 203, - 102, 25, 1, 104, 217, 158, 218, 64, 231, 87, 25, 1, 104, 206, 206, 25, 1, - 104, 196, 31, 25, 1, 104, 216, 239, 25, 1, 104, 195, 203, 25, 1, 104, - 195, 235, 204, 53, 25, 1, 104, 195, 235, 241, 86, 25, 1, 104, 195, 186, - 25, 1, 104, 195, 194, 25, 1, 104, 224, 158, 25, 1, 104, 213, 10, 25, 1, - 104, 216, 156, 236, 176, 25, 1, 104, 211, 218, 25, 1, 104, 196, 240, 25, - 1, 104, 235, 182, 25, 1, 104, 199, 113, 25, 1, 104, 221, 191, 25, 1, 104, - 219, 78, 25, 1, 104, 210, 91, 25, 1, 104, 210, 229, 25, 1, 104, 216, 238, - 25, 1, 104, 217, 71, 25, 1, 104, 206, 198, 25, 1, 104, 206, 183, 25, 1, - 104, 234, 224, 210, 130, 25, 1, 104, 176, 25, 1, 104, 212, 220, 25, 1, - 104, 221, 221, 25, 1, 104, 224, 11, 25, 1, 104, 219, 164, 25, 1, 104, - 166, 25, 1, 104, 220, 40, 25, 1, 104, 202, 247, 25, 1, 104, 224, 101, 25, - 1, 104, 218, 215, 25, 1, 104, 203, 23, 25, 1, 104, 235, 206, 25, 1, 104, - 233, 201, 25, 1, 212, 250, 155, 25, 1, 212, 250, 66, 25, 1, 212, 250, - 223, 187, 25, 1, 212, 250, 237, 54, 25, 1, 212, 250, 210, 155, 25, 1, - 212, 250, 203, 145, 25, 1, 212, 250, 215, 89, 25, 1, 212, 250, 172, 25, - 1, 212, 250, 210, 9, 25, 1, 212, 250, 210, 57, 25, 1, 212, 250, 219, 187, - 25, 1, 212, 250, 203, 162, 25, 1, 212, 250, 217, 157, 25, 1, 212, 250, - 216, 162, 25, 1, 212, 250, 221, 136, 25, 1, 212, 250, 204, 74, 25, 1, - 212, 250, 206, 218, 25, 1, 212, 250, 206, 112, 25, 1, 212, 250, 207, 72, - 25, 1, 212, 250, 223, 106, 25, 1, 212, 250, 224, 172, 25, 1, 212, 250, - 215, 154, 25, 1, 212, 250, 215, 186, 25, 1, 212, 250, 216, 133, 25, 1, - 212, 250, 195, 234, 25, 1, 212, 250, 206, 151, 25, 1, 212, 250, 164, 25, - 1, 212, 250, 215, 223, 25, 1, 212, 250, 213, 10, 25, 1, 212, 250, 215, - 203, 25, 1, 212, 250, 196, 240, 25, 1, 212, 250, 213, 79, 25, 1, 212, - 250, 209, 140, 25, 1, 212, 250, 216, 223, 25, 1, 212, 250, 210, 91, 25, - 1, 212, 250, 224, 182, 25, 1, 212, 250, 216, 255, 25, 1, 212, 250, 217, - 50, 25, 1, 212, 250, 206, 198, 25, 1, 212, 250, 211, 223, 25, 1, 212, - 250, 235, 44, 25, 1, 212, 250, 197, 166, 25, 1, 212, 250, 222, 109, 25, - 1, 212, 250, 221, 221, 25, 1, 212, 250, 224, 11, 25, 1, 212, 250, 219, - 231, 25, 1, 212, 250, 210, 126, 25, 1, 212, 250, 166, 25, 1, 212, 250, - 218, 251, 25, 1, 212, 250, 219, 239, 25, 1, 212, 250, 203, 1, 25, 1, 212, - 250, 223, 223, 25, 1, 212, 250, 208, 227, 25, 1, 212, 250, 197, 219, 218, - 149, 1, 189, 218, 149, 1, 217, 19, 218, 149, 1, 196, 3, 218, 149, 1, 219, - 25, 218, 149, 1, 249, 145, 218, 149, 1, 240, 136, 218, 149, 1, 63, 218, - 149, 1, 212, 246, 218, 149, 1, 224, 141, 218, 149, 1, 232, 178, 218, 149, - 1, 240, 111, 218, 149, 1, 245, 30, 218, 149, 1, 224, 202, 218, 149, 1, - 214, 134, 218, 149, 1, 220, 101, 218, 149, 1, 216, 183, 218, 149, 1, 161, - 218, 149, 1, 214, 102, 218, 149, 1, 72, 218, 149, 1, 209, 232, 218, 149, - 1, 206, 223, 218, 149, 1, 202, 216, 218, 149, 1, 237, 82, 218, 149, 1, - 197, 166, 218, 149, 1, 69, 218, 149, 1, 224, 11, 218, 149, 1, 222, 238, - 218, 149, 1, 172, 218, 149, 1, 232, 235, 218, 149, 1, 210, 72, 218, 149, - 1, 203, 37, 218, 149, 17, 195, 79, 218, 149, 17, 100, 218, 149, 17, 102, - 218, 149, 17, 134, 218, 149, 17, 136, 218, 149, 17, 146, 218, 149, 17, - 167, 218, 149, 17, 178, 218, 149, 17, 171, 218, 149, 17, 182, 218, 149, - 240, 88, 218, 149, 52, 240, 88, 249, 59, 199, 149, 1, 236, 211, 249, 59, - 199, 149, 1, 155, 249, 59, 199, 149, 1, 208, 147, 249, 59, 199, 149, 1, - 235, 239, 249, 59, 199, 149, 1, 219, 234, 249, 59, 199, 149, 1, 196, 21, - 249, 59, 199, 149, 1, 234, 108, 249, 59, 199, 149, 1, 239, 157, 249, 59, - 199, 149, 1, 223, 222, 249, 59, 199, 149, 1, 225, 129, 249, 59, 199, 149, - 1, 231, 42, 249, 59, 199, 149, 1, 197, 166, 249, 59, 199, 149, 1, 195, - 11, 249, 59, 199, 149, 1, 234, 52, 249, 59, 199, 149, 1, 239, 28, 249, - 59, 199, 149, 1, 247, 57, 249, 59, 199, 149, 1, 199, 238, 249, 59, 199, - 149, 1, 149, 249, 59, 199, 149, 1, 249, 145, 249, 59, 199, 149, 1, 197, - 220, 249, 59, 199, 149, 1, 196, 63, 249, 59, 199, 149, 1, 161, 249, 59, - 199, 149, 1, 197, 158, 249, 59, 199, 149, 1, 63, 249, 59, 199, 149, 1, - 72, 249, 59, 199, 149, 1, 214, 102, 249, 59, 199, 149, 1, 66, 249, 59, - 199, 149, 1, 237, 54, 249, 59, 199, 149, 1, 69, 249, 59, 199, 149, 1, 68, - 249, 59, 199, 149, 38, 130, 202, 11, 249, 59, 199, 149, 38, 126, 202, 11, - 249, 59, 199, 149, 38, 219, 65, 202, 11, 249, 59, 199, 149, 38, 221, 205, - 202, 11, 249, 59, 199, 149, 38, 232, 46, 202, 11, 249, 59, 199, 149, 234, - 217, 204, 226, 133, 86, 18, 224, 199, 133, 86, 18, 224, 195, 133, 86, 18, - 224, 90, 133, 86, 18, 224, 53, 133, 86, 18, 224, 227, 133, 86, 18, 224, - 224, 133, 86, 18, 223, 171, 133, 86, 18, 223, 142, 133, 86, 18, 224, 201, - 133, 86, 18, 224, 156, 133, 86, 18, 225, 30, 133, 86, 18, 225, 27, 133, - 86, 18, 223, 241, 133, 86, 18, 223, 238, 133, 86, 18, 224, 220, 133, 86, - 18, 224, 218, 133, 86, 18, 223, 173, 133, 86, 18, 223, 172, 133, 86, 18, - 224, 4, 133, 86, 18, 223, 227, 133, 86, 18, 224, 92, 133, 86, 18, 224, - 91, 133, 86, 18, 225, 45, 133, 86, 18, 224, 223, 133, 86, 18, 223, 132, - 133, 86, 18, 223, 123, 133, 86, 18, 225, 54, 133, 86, 18, 225, 46, 133, - 86, 108, 199, 124, 133, 86, 108, 215, 193, 133, 86, 108, 222, 215, 133, - 86, 108, 232, 158, 133, 86, 108, 216, 89, 133, 86, 108, 210, 193, 133, - 86, 108, 216, 116, 133, 86, 108, 211, 133, 133, 86, 108, 196, 80, 133, - 86, 108, 232, 22, 133, 86, 108, 219, 255, 133, 86, 108, 245, 107, 133, - 86, 108, 217, 162, 133, 86, 108, 231, 214, 133, 86, 108, 212, 134, 133, - 86, 108, 215, 199, 133, 86, 108, 217, 202, 133, 86, 108, 250, 150, 133, - 86, 108, 196, 204, 133, 86, 108, 247, 90, 133, 86, 117, 244, 255, 201, - 31, 133, 86, 117, 244, 255, 205, 200, 133, 86, 117, 244, 255, 224, 174, - 133, 86, 117, 244, 255, 224, 132, 133, 86, 117, 244, 255, 204, 158, 133, - 86, 117, 244, 255, 231, 172, 133, 86, 117, 244, 255, 203, 88, 133, 86, 2, - 198, 230, 202, 166, 133, 86, 2, 198, 230, 201, 102, 247, 48, 133, 86, 2, - 244, 255, 245, 96, 133, 86, 2, 198, 230, 202, 194, 133, 86, 2, 198, 230, - 235, 179, 133, 86, 2, 196, 160, 215, 187, 133, 86, 2, 196, 160, 210, 74, - 133, 86, 2, 196, 160, 201, 222, 133, 86, 2, 196, 160, 235, 220, 133, 86, - 2, 198, 230, 208, 123, 133, 86, 2, 219, 186, 204, 162, 133, 86, 2, 198, - 230, 215, 239, 133, 86, 2, 230, 206, 196, 100, 133, 86, 2, 196, 203, 133, - 86, 2, 244, 255, 201, 89, 209, 215, 133, 86, 17, 195, 79, 133, 86, 17, - 100, 133, 86, 17, 102, 133, 86, 17, 134, 133, 86, 17, 136, 133, 86, 17, - 146, 133, 86, 17, 167, 133, 86, 17, 178, 133, 86, 17, 171, 133, 86, 17, - 182, 133, 86, 31, 203, 18, 133, 86, 31, 231, 55, 133, 86, 31, 203, 24, - 202, 157, 133, 86, 31, 219, 26, 133, 86, 31, 231, 58, 219, 26, 133, 86, - 31, 203, 24, 248, 165, 133, 86, 31, 201, 167, 133, 86, 2, 198, 230, 221, - 186, 133, 86, 2, 196, 157, 133, 86, 2, 232, 17, 133, 86, 2, 202, 183, - 232, 17, 133, 86, 2, 194, 240, 202, 227, 133, 86, 2, 231, 198, 133, 86, - 2, 215, 253, 133, 86, 2, 196, 195, 133, 86, 2, 215, 191, 133, 86, 2, 250, - 133, 133, 86, 2, 200, 209, 247, 47, 133, 86, 2, 219, 186, 201, 105, 133, - 86, 2, 203, 89, 133, 86, 2, 221, 218, 133, 86, 2, 218, 95, 133, 86, 2, - 244, 255, 232, 231, 221, 164, 215, 197, 215, 196, 133, 86, 2, 244, 255, - 241, 40, 201, 96, 133, 86, 2, 244, 255, 200, 207, 133, 86, 2, 244, 255, - 200, 208, 245, 18, 133, 86, 2, 244, 255, 211, 221, 240, 56, 133, 86, 2, - 244, 255, 215, 246, 201, 230, 133, 86, 244, 227, 2, 201, 100, 133, 86, - 244, 227, 2, 196, 65, 133, 86, 244, 227, 2, 222, 54, 133, 86, 244, 227, - 2, 222, 213, 133, 86, 244, 227, 2, 196, 156, 133, 86, 244, 227, 2, 223, - 242, 133, 86, 244, 227, 2, 232, 155, 133, 86, 244, 227, 2, 218, 137, 133, - 86, 244, 227, 2, 202, 167, 133, 86, 244, 227, 2, 201, 110, 133, 86, 244, - 227, 2, 213, 3, 133, 86, 244, 227, 2, 224, 144, 133, 86, 244, 227, 2, - 232, 219, 133, 86, 244, 227, 2, 199, 146, 133, 86, 244, 227, 2, 235, 216, - 133, 86, 244, 227, 2, 196, 107, 133, 86, 244, 227, 2, 201, 83, 133, 86, - 244, 227, 2, 223, 127, 133, 86, 244, 227, 2, 197, 208, 219, 195, 6, 1, - 221, 136, 219, 195, 6, 1, 209, 80, 219, 195, 6, 1, 199, 230, 219, 195, 6, - 1, 197, 199, 219, 195, 6, 1, 250, 162, 219, 195, 6, 1, 195, 158, 219, - 195, 6, 1, 223, 224, 219, 195, 6, 1, 214, 3, 219, 195, 6, 1, 203, 216, - 219, 195, 6, 1, 234, 190, 219, 195, 6, 1, 236, 49, 219, 195, 6, 1, 68, - 219, 195, 6, 1, 225, 80, 219, 195, 6, 1, 63, 219, 195, 6, 1, 225, 217, - 219, 195, 6, 1, 69, 219, 195, 6, 1, 250, 112, 219, 195, 6, 1, 247, 207, - 219, 195, 6, 1, 66, 219, 195, 6, 1, 195, 217, 219, 195, 6, 1, 159, 219, - 195, 6, 1, 211, 167, 219, 195, 6, 1, 231, 84, 219, 195, 6, 1, 215, 111, - 219, 195, 6, 1, 196, 222, 219, 195, 6, 1, 240, 231, 219, 195, 6, 1, 214, - 164, 219, 195, 6, 1, 218, 55, 219, 195, 6, 1, 144, 219, 195, 6, 1, 72, - 219, 195, 6, 1, 251, 200, 219, 195, 6, 1, 196, 148, 219, 195, 4, 1, 221, - 136, 219, 195, 4, 1, 209, 80, 219, 195, 4, 1, 199, 230, 219, 195, 4, 1, - 197, 199, 219, 195, 4, 1, 250, 162, 219, 195, 4, 1, 195, 158, 219, 195, - 4, 1, 223, 224, 219, 195, 4, 1, 214, 3, 219, 195, 4, 1, 203, 216, 219, - 195, 4, 1, 234, 190, 219, 195, 4, 1, 236, 49, 219, 195, 4, 1, 68, 219, - 195, 4, 1, 225, 80, 219, 195, 4, 1, 63, 219, 195, 4, 1, 225, 217, 219, - 195, 4, 1, 69, 219, 195, 4, 1, 250, 112, 219, 195, 4, 1, 247, 207, 219, - 195, 4, 1, 66, 219, 195, 4, 1, 195, 217, 219, 195, 4, 1, 159, 219, 195, - 4, 1, 211, 167, 219, 195, 4, 1, 231, 84, 219, 195, 4, 1, 215, 111, 219, - 195, 4, 1, 196, 222, 219, 195, 4, 1, 240, 231, 219, 195, 4, 1, 214, 164, - 219, 195, 4, 1, 218, 55, 219, 195, 4, 1, 144, 219, 195, 4, 1, 72, 219, - 195, 4, 1, 251, 200, 219, 195, 4, 1, 196, 148, 219, 195, 17, 195, 79, - 219, 195, 17, 100, 219, 195, 17, 102, 219, 195, 17, 134, 219, 195, 17, - 136, 219, 195, 17, 146, 219, 195, 17, 167, 219, 195, 17, 178, 219, 195, - 17, 171, 219, 195, 17, 182, 219, 195, 31, 203, 23, 219, 195, 31, 236, - 252, 219, 195, 31, 200, 239, 219, 195, 31, 202, 179, 219, 195, 31, 235, - 1, 219, 195, 31, 235, 149, 219, 195, 31, 206, 23, 219, 195, 31, 207, 68, - 219, 195, 31, 237, 28, 219, 195, 31, 216, 176, 219, 195, 17, 97, 251, - 131, 20, 219, 195, 17, 99, 251, 131, 20, 219, 195, 17, 115, 251, 131, 20, - 219, 195, 244, 159, 219, 195, 234, 217, 204, 226, 219, 195, 16, 251, 185, - 219, 195, 236, 90, 214, 149, 109, 1, 161, 109, 1, 249, 145, 109, 1, 11, - 161, 109, 1, 212, 150, 109, 1, 166, 109, 1, 219, 81, 109, 1, 250, 251, - 166, 109, 1, 235, 239, 109, 1, 199, 152, 109, 1, 199, 36, 109, 1, 189, - 109, 1, 240, 136, 109, 1, 11, 201, 78, 109, 1, 11, 189, 109, 1, 201, 78, - 109, 1, 240, 41, 109, 1, 176, 109, 1, 216, 227, 109, 1, 11, 216, 86, 109, - 1, 250, 251, 176, 109, 1, 216, 86, 109, 1, 216, 72, 109, 1, 172, 109, 1, - 221, 150, 109, 1, 222, 122, 109, 1, 222, 111, 109, 1, 202, 44, 109, 1, - 239, 37, 109, 1, 202, 36, 109, 1, 239, 36, 109, 1, 155, 109, 1, 234, 123, - 109, 1, 11, 155, 109, 1, 211, 159, 109, 1, 211, 136, 109, 1, 217, 71, - 109, 1, 217, 20, 109, 1, 250, 251, 217, 71, 109, 1, 142, 109, 1, 196, - 208, 109, 1, 233, 230, 109, 1, 233, 205, 109, 1, 201, 88, 109, 1, 237, - 139, 109, 1, 215, 109, 109, 1, 215, 91, 109, 1, 201, 103, 109, 1, 237, - 150, 109, 1, 11, 201, 103, 109, 1, 11, 237, 150, 109, 1, 210, 153, 201, - 103, 109, 1, 207, 50, 109, 1, 205, 80, 109, 1, 195, 74, 109, 1, 195, 1, - 109, 1, 201, 113, 109, 1, 237, 156, 109, 1, 11, 201, 113, 109, 1, 183, - 109, 1, 195, 115, 109, 1, 195, 2, 109, 1, 194, 228, 109, 1, 194, 208, - 109, 1, 250, 251, 194, 228, 109, 1, 194, 200, 109, 1, 194, 207, 109, 1, - 197, 166, 109, 1, 251, 209, 109, 1, 232, 80, 109, 1, 248, 43, 109, 1, - 204, 42, 109, 1, 237, 140, 109, 1, 203, 68, 109, 1, 201, 107, 109, 1, - 209, 143, 109, 2, 108, 73, 154, 109, 1, 217, 207, 109, 2, 250, 185, 109, - 2, 210, 153, 198, 242, 109, 2, 210, 153, 250, 185, 109, 18, 2, 63, 109, - 18, 2, 252, 168, 109, 18, 2, 251, 205, 109, 18, 2, 251, 106, 109, 18, 2, - 251, 97, 109, 18, 2, 72, 109, 18, 2, 214, 102, 109, 18, 2, 197, 34, 109, - 18, 2, 197, 199, 109, 18, 2, 69, 109, 18, 2, 236, 230, 109, 18, 2, 236, - 215, 109, 18, 2, 214, 160, 109, 18, 2, 68, 109, 18, 2, 230, 210, 109, 18, - 2, 230, 209, 109, 18, 2, 230, 208, 109, 18, 2, 226, 12, 109, 18, 2, 226, - 147, 109, 18, 2, 226, 120, 109, 18, 2, 225, 230, 109, 18, 2, 226, 60, - 109, 18, 2, 66, 109, 18, 2, 200, 114, 109, 18, 2, 200, 113, 109, 18, 2, - 200, 112, 109, 18, 2, 199, 245, 109, 18, 2, 200, 96, 109, 18, 2, 200, 56, - 109, 18, 2, 196, 148, 109, 18, 2, 196, 24, 109, 18, 2, 251, 245, 109, 18, - 2, 251, 241, 109, 18, 2, 236, 155, 109, 18, 2, 209, 185, 236, 155, 109, - 18, 2, 236, 163, 109, 18, 2, 209, 185, 236, 163, 109, 18, 2, 251, 200, - 109, 18, 2, 237, 33, 109, 18, 2, 250, 150, 109, 18, 2, 214, 39, 109, 18, - 2, 218, 55, 109, 18, 2, 217, 73, 109, 18, 2, 200, 40, 109, 18, 2, 195, - 197, 109, 18, 2, 214, 154, 109, 18, 2, 214, 161, 109, 18, 2, 197, 210, - 109, 18, 2, 226, 125, 109, 18, 2, 237, 82, 109, 18, 2, 226, 10, 109, 18, - 2, 200, 90, 109, 152, 210, 22, 109, 152, 201, 243, 210, 22, 109, 152, 57, - 109, 152, 60, 109, 1, 202, 9, 109, 1, 202, 8, 109, 1, 202, 7, 109, 1, - 202, 6, 109, 1, 202, 5, 109, 1, 202, 4, 109, 1, 202, 3, 109, 1, 210, 153, - 202, 10, 109, 1, 210, 153, 202, 9, 109, 1, 210, 153, 202, 7, 109, 1, 210, - 153, 202, 6, 109, 1, 210, 153, 202, 5, 109, 1, 210, 153, 202, 3, 19, 225, - 232, 78, 43, 225, 232, 78, 37, 245, 61, 231, 165, 78, 37, 245, 61, 225, - 232, 78, 19, 244, 148, 19, 244, 147, 19, 244, 146, 19, 244, 145, 19, 244, - 144, 19, 244, 143, 19, 244, 142, 19, 244, 141, 19, 244, 140, 19, 244, - 139, 19, 244, 138, 19, 244, 137, 19, 244, 136, 19, 244, 135, 19, 244, - 134, 19, 244, 133, 19, 244, 132, 19, 244, 131, 19, 244, 130, 19, 244, - 129, 19, 244, 128, 19, 244, 127, 19, 244, 126, 19, 244, 125, 19, 244, - 124, 19, 244, 123, 19, 244, 122, 19, 244, 121, 19, 244, 120, 19, 244, - 119, 19, 244, 118, 19, 244, 117, 19, 244, 116, 19, 244, 115, 19, 244, - 114, 19, 244, 113, 19, 244, 112, 19, 244, 111, 19, 244, 110, 19, 244, - 109, 19, 244, 108, 19, 244, 107, 19, 244, 106, 19, 244, 105, 19, 244, - 104, 19, 244, 103, 19, 244, 102, 19, 244, 101, 19, 244, 100, 19, 244, 99, - 19, 244, 98, 19, 244, 97, 19, 244, 96, 19, 244, 95, 19, 244, 94, 19, 244, - 93, 19, 244, 92, 19, 244, 91, 19, 244, 90, 19, 244, 89, 19, 244, 88, 19, - 244, 87, 19, 244, 86, 19, 244, 85, 19, 244, 84, 19, 244, 83, 19, 244, 82, - 19, 244, 81, 19, 244, 80, 19, 244, 79, 19, 244, 78, 19, 244, 77, 19, 244, - 76, 19, 244, 75, 19, 244, 74, 19, 244, 73, 19, 244, 72, 19, 244, 71, 19, - 244, 70, 19, 244, 69, 19, 244, 68, 19, 244, 67, 19, 244, 66, 19, 244, 65, - 19, 244, 64, 19, 244, 63, 19, 244, 62, 19, 244, 61, 19, 244, 60, 19, 244, - 59, 19, 244, 58, 19, 244, 57, 19, 244, 56, 19, 244, 55, 19, 244, 54, 19, - 244, 53, 19, 244, 52, 19, 244, 51, 19, 244, 50, 19, 244, 49, 19, 244, 48, - 19, 244, 47, 19, 244, 46, 19, 244, 45, 19, 244, 44, 19, 244, 43, 19, 244, - 42, 19, 244, 41, 19, 244, 40, 19, 244, 39, 19, 244, 38, 19, 244, 37, 19, - 244, 36, 19, 244, 35, 19, 244, 34, 19, 244, 33, 19, 244, 32, 19, 244, 31, - 19, 244, 30, 19, 244, 29, 19, 244, 28, 19, 244, 27, 19, 244, 26, 19, 244, - 25, 19, 244, 24, 19, 244, 23, 19, 244, 22, 19, 244, 21, 19, 244, 20, 19, - 244, 19, 19, 244, 18, 19, 244, 17, 19, 244, 16, 19, 244, 15, 19, 244, 14, - 19, 244, 13, 19, 244, 12, 19, 244, 11, 19, 244, 10, 19, 244, 9, 19, 244, - 8, 19, 244, 7, 19, 244, 6, 19, 244, 5, 19, 244, 4, 19, 244, 3, 19, 244, - 2, 19, 244, 1, 19, 244, 0, 19, 243, 255, 19, 243, 254, 19, 243, 253, 19, - 243, 252, 19, 243, 251, 19, 243, 250, 19, 243, 249, 19, 243, 248, 19, - 243, 247, 19, 243, 246, 19, 243, 245, 19, 243, 244, 19, 243, 243, 19, - 243, 242, 19, 243, 241, 19, 243, 240, 19, 243, 239, 19, 243, 238, 19, - 243, 237, 19, 243, 236, 19, 243, 235, 19, 243, 234, 19, 243, 233, 19, - 243, 232, 19, 243, 231, 19, 243, 230, 19, 243, 229, 19, 243, 228, 19, - 243, 227, 19, 243, 226, 19, 243, 225, 19, 243, 224, 19, 243, 223, 19, - 243, 222, 19, 243, 221, 19, 243, 220, 19, 243, 219, 19, 243, 218, 19, - 243, 217, 19, 243, 216, 19, 243, 215, 19, 243, 214, 19, 243, 213, 19, - 243, 212, 19, 243, 211, 19, 243, 210, 19, 243, 209, 19, 243, 208, 19, - 243, 207, 19, 243, 206, 19, 243, 205, 19, 243, 204, 19, 243, 203, 19, - 243, 202, 19, 243, 201, 19, 243, 200, 19, 243, 199, 19, 243, 198, 19, - 243, 197, 19, 243, 196, 19, 243, 195, 19, 243, 194, 19, 243, 193, 19, - 243, 192, 19, 243, 191, 19, 243, 190, 19, 243, 189, 19, 243, 188, 19, - 243, 187, 19, 243, 186, 19, 243, 185, 19, 243, 184, 19, 243, 183, 19, - 243, 182, 19, 243, 181, 19, 243, 180, 19, 243, 179, 19, 243, 178, 19, - 243, 177, 19, 243, 176, 19, 243, 175, 19, 243, 174, 19, 243, 173, 19, - 243, 172, 19, 243, 171, 19, 243, 170, 19, 243, 169, 19, 243, 168, 19, - 243, 167, 19, 243, 166, 19, 243, 165, 19, 243, 164, 19, 243, 163, 19, - 243, 162, 19, 243, 161, 19, 243, 160, 19, 243, 159, 19, 243, 158, 19, - 243, 157, 19, 243, 156, 19, 243, 155, 19, 243, 154, 19, 243, 153, 19, - 243, 152, 19, 243, 151, 19, 243, 150, 19, 243, 149, 19, 243, 148, 19, - 243, 147, 19, 243, 146, 19, 243, 145, 19, 243, 144, 19, 243, 143, 19, - 243, 142, 19, 243, 141, 19, 243, 140, 19, 243, 139, 19, 243, 138, 19, - 243, 137, 19, 243, 136, 19, 243, 135, 19, 243, 134, 19, 243, 133, 19, - 243, 132, 19, 243, 131, 19, 243, 130, 19, 243, 129, 19, 243, 128, 19, - 243, 127, 19, 243, 126, 19, 243, 125, 19, 243, 124, 19, 243, 123, 19, - 243, 122, 19, 243, 121, 19, 243, 120, 19, 243, 119, 19, 243, 118, 19, - 243, 117, 19, 243, 116, 19, 243, 115, 19, 243, 114, 19, 243, 113, 19, - 243, 112, 19, 243, 111, 19, 243, 110, 19, 243, 109, 19, 243, 108, 19, - 243, 107, 19, 243, 106, 19, 243, 105, 19, 243, 104, 19, 243, 103, 19, - 243, 102, 19, 243, 101, 19, 243, 100, 19, 243, 99, 19, 243, 98, 19, 243, - 97, 19, 243, 96, 19, 243, 95, 19, 243, 94, 19, 243, 93, 19, 243, 92, 19, - 243, 91, 19, 243, 90, 19, 243, 89, 19, 243, 88, 19, 243, 87, 19, 243, 86, - 19, 243, 85, 19, 243, 84, 19, 243, 83, 19, 243, 82, 19, 243, 81, 19, 243, - 80, 19, 243, 79, 19, 243, 78, 19, 243, 77, 19, 243, 76, 19, 243, 75, 19, - 243, 74, 19, 243, 73, 19, 243, 72, 19, 243, 71, 19, 243, 70, 19, 243, 69, - 19, 243, 68, 19, 243, 67, 19, 243, 66, 19, 243, 65, 19, 243, 64, 19, 243, - 63, 19, 243, 62, 19, 243, 61, 19, 243, 60, 19, 243, 59, 19, 243, 58, 19, - 243, 57, 19, 243, 56, 19, 243, 55, 19, 243, 54, 19, 243, 53, 19, 243, 52, - 19, 243, 51, 19, 243, 50, 19, 243, 49, 19, 243, 48, 19, 243, 47, 19, 243, - 46, 19, 243, 45, 19, 243, 44, 19, 243, 43, 19, 243, 42, 19, 243, 41, 19, - 243, 40, 19, 243, 39, 19, 243, 38, 19, 243, 37, 19, 243, 36, 19, 243, 35, - 19, 243, 34, 19, 243, 33, 19, 243, 32, 19, 243, 31, 19, 243, 30, 19, 243, - 29, 19, 243, 28, 19, 243, 27, 19, 243, 26, 19, 243, 25, 19, 243, 24, 19, - 243, 23, 19, 243, 22, 19, 243, 21, 19, 243, 20, 19, 243, 19, 19, 243, 18, - 19, 243, 17, 19, 243, 16, 19, 243, 15, 19, 243, 14, 19, 243, 13, 19, 243, - 12, 19, 243, 11, 19, 243, 10, 19, 243, 9, 19, 243, 8, 19, 243, 7, 19, - 243, 6, 19, 243, 5, 19, 243, 4, 19, 243, 3, 19, 243, 2, 19, 243, 1, 19, - 243, 0, 19, 242, 255, 19, 242, 254, 19, 242, 253, 19, 242, 252, 19, 242, - 251, 19, 242, 250, 19, 242, 249, 19, 242, 248, 19, 242, 247, 19, 242, - 246, 19, 242, 245, 19, 242, 244, 19, 242, 243, 19, 242, 242, 19, 242, - 241, 19, 242, 240, 19, 242, 239, 19, 242, 238, 19, 242, 237, 19, 242, - 236, 19, 242, 235, 19, 242, 234, 19, 242, 233, 19, 242, 232, 19, 242, - 231, 19, 242, 230, 19, 242, 229, 19, 242, 228, 19, 242, 227, 19, 242, - 226, 19, 242, 225, 19, 242, 224, 19, 242, 223, 19, 242, 222, 19, 242, - 221, 19, 242, 220, 19, 242, 219, 19, 242, 218, 19, 242, 217, 19, 242, - 216, 19, 242, 215, 19, 242, 214, 19, 242, 213, 19, 242, 212, 19, 242, - 211, 19, 242, 210, 19, 242, 209, 19, 242, 208, 19, 242, 207, 19, 242, - 206, 19, 242, 205, 19, 242, 204, 19, 242, 203, 19, 242, 202, 19, 242, - 201, 19, 242, 200, 19, 242, 199, 19, 242, 198, 19, 242, 197, 19, 242, - 196, 19, 242, 195, 19, 242, 194, 19, 242, 193, 19, 242, 192, 19, 242, - 191, 19, 242, 190, 19, 242, 189, 19, 242, 188, 19, 242, 187, 19, 242, - 186, 19, 242, 185, 19, 242, 184, 19, 242, 183, 19, 242, 182, 19, 242, - 181, 19, 242, 180, 19, 242, 179, 19, 242, 178, 19, 242, 177, 19, 242, - 176, 19, 242, 175, 19, 242, 174, 19, 242, 173, 19, 242, 172, 19, 242, - 171, 19, 242, 170, 19, 242, 169, 19, 242, 168, 19, 242, 167, 19, 242, - 166, 19, 242, 165, 19, 242, 164, 19, 242, 163, 19, 242, 162, 19, 242, - 161, 19, 242, 160, 19, 242, 159, 19, 242, 158, 19, 242, 157, 19, 242, - 156, 19, 242, 155, 19, 242, 154, 19, 242, 153, 19, 242, 152, 19, 242, - 151, 19, 242, 150, 19, 242, 149, 19, 242, 148, 19, 242, 147, 19, 242, - 146, 19, 242, 145, 19, 242, 144, 19, 242, 143, 19, 242, 142, 19, 242, - 141, 19, 242, 140, 19, 242, 139, 19, 242, 138, 19, 242, 137, 19, 242, - 136, 19, 242, 135, 19, 242, 134, 19, 242, 133, 19, 242, 132, 19, 242, - 131, 19, 242, 130, 19, 242, 129, 19, 242, 128, 19, 242, 127, 19, 242, - 126, 19, 242, 125, 19, 242, 124, 19, 242, 123, 19, 242, 122, 19, 242, - 121, 19, 242, 120, 19, 242, 119, 19, 242, 118, 19, 242, 117, 19, 242, - 116, 19, 242, 115, 19, 242, 114, 19, 242, 113, 19, 242, 112, 19, 242, - 111, 19, 242, 110, 19, 242, 109, 19, 242, 108, 19, 242, 107, 19, 242, - 106, 19, 242, 105, 19, 242, 104, 19, 242, 103, 19, 242, 102, 19, 242, - 101, 19, 242, 100, 19, 242, 99, 19, 242, 98, 19, 242, 97, 19, 242, 96, - 19, 242, 95, 19, 242, 94, 19, 242, 93, 19, 242, 92, 19, 242, 91, 19, 242, - 90, 19, 242, 89, 19, 242, 88, 19, 242, 87, 19, 242, 86, 19, 242, 85, 19, - 242, 84, 19, 242, 83, 19, 242, 82, 19, 242, 81, 19, 242, 80, 19, 242, 79, - 19, 242, 78, 19, 242, 77, 19, 242, 76, 19, 242, 75, 19, 242, 74, 19, 242, - 73, 19, 242, 72, 19, 242, 71, 19, 242, 70, 19, 242, 69, 19, 242, 68, 19, - 242, 67, 19, 242, 66, 19, 242, 65, 19, 242, 64, 19, 242, 63, 19, 242, 62, - 19, 242, 61, 19, 242, 60, 19, 242, 59, 19, 242, 58, 19, 242, 57, 19, 242, - 56, 19, 242, 55, 19, 242, 54, 19, 242, 53, 19, 242, 52, 19, 242, 51, 19, - 242, 50, 19, 242, 49, 19, 242, 48, 19, 242, 47, 19, 242, 46, 19, 242, 45, - 19, 242, 44, 19, 242, 43, 19, 242, 42, 19, 242, 41, 19, 242, 40, 19, 242, - 39, 19, 242, 38, 19, 242, 37, 19, 242, 36, 19, 242, 35, 19, 242, 34, 19, - 242, 33, 19, 242, 32, 19, 242, 31, 19, 242, 30, 19, 242, 29, 19, 242, 28, - 19, 242, 27, 19, 242, 26, 19, 242, 25, 19, 242, 24, 19, 242, 23, 19, 242, - 22, 19, 242, 21, 19, 242, 20, 19, 242, 19, 19, 242, 18, 19, 242, 17, 19, - 242, 16, 19, 242, 15, 19, 242, 14, 19, 242, 13, 19, 242, 12, 19, 242, 11, - 19, 242, 10, 19, 242, 9, 19, 242, 8, 19, 242, 7, 19, 242, 6, 19, 242, 5, - 19, 242, 4, 19, 242, 3, 19, 242, 2, 19, 242, 1, 19, 242, 0, 19, 241, 255, - 19, 241, 254, 19, 241, 253, 19, 241, 252, 19, 241, 251, 19, 241, 250, 19, - 241, 249, 19, 241, 248, 19, 241, 247, 19, 241, 246, 19, 241, 245, 19, - 241, 244, 19, 241, 243, 19, 241, 242, 19, 241, 241, 19, 241, 240, 19, - 241, 239, 19, 241, 238, 19, 241, 237, 19, 241, 236, 19, 241, 235, 19, - 241, 234, 19, 241, 233, 19, 241, 232, 19, 241, 231, 19, 241, 230, 19, - 241, 229, 19, 241, 228, 19, 241, 227, 19, 241, 226, 19, 241, 225, 19, - 241, 224, 19, 241, 223, 19, 241, 222, 19, 241, 221, 19, 241, 220, 19, - 241, 219, 19, 241, 218, 19, 241, 217, 19, 241, 216, 19, 241, 215, 19, - 241, 214, 19, 241, 213, 19, 241, 212, 19, 241, 211, 19, 241, 210, 19, - 241, 209, 19, 241, 208, 19, 241, 207, 19, 241, 206, 19, 241, 205, 19, - 241, 204, 19, 241, 203, 19, 241, 202, 19, 241, 201, 19, 241, 200, 19, - 241, 199, 19, 241, 198, 19, 241, 197, 19, 241, 196, 19, 241, 195, 19, - 241, 194, 19, 241, 193, 19, 241, 192, 19, 241, 191, 19, 241, 190, 19, - 241, 189, 19, 241, 188, 19, 241, 187, 19, 241, 186, 19, 241, 185, 19, - 241, 184, 19, 241, 183, 19, 241, 182, 19, 241, 181, 19, 241, 180, 19, - 241, 179, 19, 241, 178, 19, 241, 177, 19, 241, 176, 19, 241, 175, 19, - 241, 174, 19, 241, 173, 19, 241, 172, 19, 241, 171, 19, 241, 170, 19, - 241, 169, 19, 241, 168, 19, 241, 167, 19, 241, 166, 19, 241, 165, 19, - 241, 164, 19, 241, 163, 19, 241, 162, 71, 1, 250, 251, 69, 188, 1, 250, - 251, 196, 69, 56, 1, 255, 168, 56, 1, 255, 167, 56, 1, 255, 166, 56, 1, - 255, 162, 56, 1, 230, 248, 56, 1, 230, 247, 56, 1, 230, 246, 56, 1, 230, - 245, 56, 1, 200, 177, 56, 1, 200, 176, 56, 1, 200, 175, 56, 1, 200, 174, - 56, 1, 200, 173, 56, 1, 237, 134, 56, 1, 237, 133, 56, 1, 237, 132, 56, - 1, 237, 131, 56, 1, 237, 130, 56, 1, 215, 22, 56, 1, 215, 21, 56, 1, 215, - 20, 56, 1, 225, 69, 56, 1, 225, 66, 56, 1, 225, 65, 56, 1, 225, 64, 56, - 1, 225, 63, 56, 1, 225, 62, 56, 1, 225, 61, 56, 1, 225, 60, 56, 1, 225, - 59, 56, 1, 225, 68, 56, 1, 225, 67, 56, 1, 225, 58, 56, 1, 224, 100, 56, - 1, 224, 99, 56, 1, 224, 98, 56, 1, 224, 97, 56, 1, 224, 96, 56, 1, 224, - 95, 56, 1, 224, 94, 56, 1, 224, 93, 56, 1, 223, 186, 56, 1, 223, 185, 56, - 1, 223, 184, 56, 1, 223, 183, 56, 1, 223, 182, 56, 1, 223, 181, 56, 1, - 223, 180, 56, 1, 224, 208, 56, 1, 224, 207, 56, 1, 224, 206, 56, 1, 224, - 205, 56, 1, 224, 204, 56, 1, 224, 203, 56, 1, 224, 10, 56, 1, 224, 9, 56, - 1, 224, 8, 56, 1, 224, 7, 56, 1, 209, 22, 56, 1, 209, 21, 56, 1, 209, 20, - 56, 1, 209, 19, 56, 1, 209, 18, 56, 1, 209, 17, 56, 1, 209, 16, 56, 1, - 209, 15, 56, 1, 206, 111, 56, 1, 206, 110, 56, 1, 206, 109, 56, 1, 206, - 108, 56, 1, 206, 107, 56, 1, 206, 106, 56, 1, 204, 171, 56, 1, 204, 170, - 56, 1, 204, 169, 56, 1, 204, 168, 56, 1, 204, 167, 56, 1, 204, 166, 56, - 1, 204, 165, 56, 1, 204, 164, 56, 1, 208, 146, 56, 1, 208, 145, 56, 1, - 208, 144, 56, 1, 208, 143, 56, 1, 208, 142, 56, 1, 205, 199, 56, 1, 205, - 198, 56, 1, 205, 197, 56, 1, 205, 196, 56, 1, 205, 195, 56, 1, 205, 194, - 56, 1, 205, 193, 56, 1, 203, 168, 56, 1, 203, 167, 56, 1, 203, 166, 56, - 1, 203, 165, 56, 1, 202, 121, 56, 1, 202, 120, 56, 1, 202, 119, 56, 1, - 202, 118, 56, 1, 202, 117, 56, 1, 202, 116, 56, 1, 202, 115, 56, 1, 201, - 39, 56, 1, 201, 38, 56, 1, 201, 37, 56, 1, 201, 36, 56, 1, 201, 35, 56, - 1, 203, 67, 56, 1, 203, 66, 56, 1, 203, 65, 56, 1, 203, 64, 56, 1, 203, - 63, 56, 1, 203, 62, 56, 1, 203, 61, 56, 1, 203, 60, 56, 1, 203, 59, 56, - 1, 202, 29, 56, 1, 202, 28, 56, 1, 202, 27, 56, 1, 202, 26, 56, 1, 202, - 25, 56, 1, 202, 24, 56, 1, 202, 23, 56, 1, 218, 0, 56, 1, 217, 255, 56, - 1, 217, 254, 56, 1, 217, 253, 56, 1, 217, 252, 56, 1, 217, 251, 56, 1, - 217, 250, 56, 1, 217, 249, 56, 1, 217, 248, 56, 1, 216, 222, 56, 1, 216, - 221, 56, 1, 216, 220, 56, 1, 216, 219, 56, 1, 216, 218, 56, 1, 216, 217, - 56, 1, 216, 216, 56, 1, 216, 215, 56, 1, 215, 185, 56, 1, 215, 184, 56, - 1, 215, 183, 56, 1, 217, 117, 56, 1, 217, 116, 56, 1, 217, 115, 56, 1, - 217, 114, 56, 1, 217, 113, 56, 1, 217, 112, 56, 1, 217, 111, 56, 1, 216, - 49, 56, 1, 216, 48, 56, 1, 216, 47, 56, 1, 216, 46, 56, 1, 216, 45, 56, - 1, 233, 3, 56, 1, 233, 0, 56, 1, 232, 255, 56, 1, 232, 254, 56, 1, 232, - 253, 56, 1, 232, 252, 56, 1, 232, 251, 56, 1, 232, 250, 56, 1, 232, 249, - 56, 1, 233, 2, 56, 1, 233, 1, 56, 1, 232, 70, 56, 1, 232, 69, 56, 1, 232, - 68, 56, 1, 232, 67, 56, 1, 232, 66, 56, 1, 232, 65, 56, 1, 232, 64, 56, - 1, 231, 74, 56, 1, 231, 73, 56, 1, 231, 72, 56, 1, 232, 146, 56, 1, 232, - 145, 56, 1, 232, 144, 56, 1, 232, 143, 56, 1, 232, 142, 56, 1, 232, 141, - 56, 1, 232, 140, 56, 1, 231, 192, 56, 1, 231, 191, 56, 1, 231, 190, 56, - 1, 231, 189, 56, 1, 231, 188, 56, 1, 231, 187, 56, 1, 231, 186, 56, 1, - 231, 185, 56, 1, 220, 127, 56, 1, 220, 126, 56, 1, 220, 125, 56, 1, 220, - 124, 56, 1, 220, 123, 56, 1, 220, 122, 56, 1, 220, 121, 56, 1, 219, 77, - 56, 1, 219, 76, 56, 1, 219, 75, 56, 1, 219, 74, 56, 1, 219, 73, 56, 1, - 219, 72, 56, 1, 219, 71, 56, 1, 218, 144, 56, 1, 218, 143, 56, 1, 218, - 142, 56, 1, 218, 141, 56, 1, 219, 206, 56, 1, 219, 205, 56, 1, 219, 204, - 56, 1, 218, 250, 56, 1, 218, 249, 56, 1, 218, 248, 56, 1, 218, 247, 56, - 1, 218, 246, 56, 1, 218, 245, 56, 1, 196, 137, 56, 1, 196, 136, 56, 1, - 196, 135, 56, 1, 196, 134, 56, 1, 196, 133, 56, 1, 196, 130, 56, 1, 195, - 216, 56, 1, 195, 215, 56, 1, 195, 214, 56, 1, 195, 213, 56, 1, 196, 2, - 56, 1, 196, 1, 56, 1, 196, 0, 56, 1, 195, 255, 56, 1, 195, 254, 56, 1, - 195, 253, 56, 1, 210, 251, 56, 1, 210, 250, 56, 1, 210, 249, 56, 1, 210, - 248, 56, 1, 210, 71, 56, 1, 210, 70, 56, 1, 210, 69, 56, 1, 210, 68, 56, - 1, 210, 67, 56, 1, 210, 66, 56, 1, 210, 65, 56, 1, 209, 139, 56, 1, 209, - 138, 56, 1, 209, 137, 56, 1, 209, 136, 56, 1, 209, 135, 56, 1, 209, 134, - 56, 1, 210, 182, 56, 1, 210, 181, 56, 1, 210, 180, 56, 1, 210, 179, 56, - 1, 209, 231, 56, 1, 209, 230, 56, 1, 209, 229, 56, 1, 209, 228, 56, 1, - 209, 227, 56, 1, 209, 226, 56, 1, 197, 165, 56, 1, 197, 164, 56, 1, 197, - 163, 56, 1, 197, 162, 56, 1, 197, 161, 56, 1, 197, 69, 56, 1, 197, 68, - 56, 1, 197, 67, 56, 1, 197, 66, 56, 1, 197, 65, 56, 1, 197, 108, 56, 1, - 197, 107, 56, 1, 197, 106, 56, 1, 197, 105, 56, 1, 197, 33, 56, 1, 197, - 32, 56, 1, 197, 31, 56, 1, 197, 30, 56, 1, 197, 29, 56, 1, 197, 28, 56, - 1, 197, 27, 56, 1, 218, 52, 56, 1, 218, 51, 188, 1, 4, 197, 70, 188, 1, - 4, 197, 109, 188, 1, 4, 197, 34, 71, 1, 4, 197, 70, 71, 1, 4, 197, 109, - 71, 1, 4, 197, 34, 71, 1, 4, 218, 55, 43, 246, 254, 43, 246, 253, 43, - 246, 252, 43, 246, 251, 43, 246, 250, 43, 246, 249, 43, 246, 248, 43, - 246, 247, 43, 246, 246, 43, 246, 245, 43, 246, 244, 43, 246, 243, 43, - 246, 242, 43, 246, 241, 43, 246, 240, 43, 246, 239, 43, 246, 238, 43, - 246, 237, 43, 246, 236, 43, 246, 235, 43, 246, 234, 43, 246, 233, 43, - 246, 232, 43, 246, 231, 43, 246, 230, 43, 246, 229, 43, 246, 228, 43, - 246, 227, 43, 246, 226, 43, 246, 225, 43, 246, 224, 43, 246, 223, 43, - 246, 222, 43, 246, 221, 43, 246, 220, 43, 246, 219, 43, 246, 218, 43, - 246, 217, 43, 246, 216, 43, 246, 215, 43, 246, 214, 43, 246, 213, 43, - 246, 212, 43, 246, 211, 43, 246, 210, 43, 246, 209, 43, 246, 208, 43, - 246, 207, 43, 246, 206, 43, 246, 205, 43, 246, 204, 43, 246, 203, 43, - 246, 202, 43, 246, 201, 43, 246, 200, 43, 246, 199, 43, 246, 198, 43, - 246, 197, 43, 246, 196, 43, 246, 195, 43, 246, 194, 43, 246, 193, 43, - 246, 192, 43, 246, 191, 43, 246, 190, 43, 246, 189, 43, 246, 188, 43, - 246, 187, 43, 246, 186, 43, 246, 185, 43, 246, 184, 43, 246, 183, 43, - 246, 182, 43, 246, 181, 43, 246, 180, 43, 246, 179, 43, 246, 178, 43, - 246, 177, 43, 246, 176, 43, 246, 175, 43, 246, 174, 43, 246, 173, 43, - 246, 172, 43, 246, 171, 43, 246, 170, 43, 246, 169, 43, 246, 168, 43, - 246, 167, 43, 246, 166, 43, 246, 165, 43, 246, 164, 43, 246, 163, 43, - 246, 162, 43, 246, 161, 43, 246, 160, 43, 246, 159, 43, 246, 158, 43, - 246, 157, 43, 246, 156, 43, 246, 155, 43, 246, 154, 43, 246, 153, 43, - 246, 152, 43, 246, 151, 43, 246, 150, 43, 246, 149, 43, 246, 148, 43, - 246, 147, 43, 246, 146, 43, 246, 145, 43, 246, 144, 43, 246, 143, 43, - 246, 142, 43, 246, 141, 43, 246, 140, 43, 246, 139, 43, 246, 138, 43, - 246, 137, 43, 246, 136, 43, 246, 135, 43, 246, 134, 43, 246, 133, 43, - 246, 132, 43, 246, 131, 43, 246, 130, 43, 246, 129, 43, 246, 128, 43, - 246, 127, 43, 246, 126, 43, 246, 125, 43, 246, 124, 43, 246, 123, 43, - 246, 122, 43, 246, 121, 43, 246, 120, 43, 246, 119, 43, 246, 118, 43, - 246, 117, 43, 246, 116, 43, 246, 115, 43, 246, 114, 43, 246, 113, 43, - 246, 112, 43, 246, 111, 43, 246, 110, 43, 246, 109, 43, 246, 108, 43, - 246, 107, 43, 246, 106, 43, 246, 105, 43, 246, 104, 43, 246, 103, 43, - 246, 102, 43, 246, 101, 43, 246, 100, 43, 246, 99, 43, 246, 98, 43, 246, - 97, 43, 246, 96, 43, 246, 95, 43, 246, 94, 43, 246, 93, 43, 246, 92, 43, - 246, 91, 43, 246, 90, 43, 246, 89, 43, 246, 88, 43, 246, 87, 43, 246, 86, - 43, 246, 85, 43, 246, 84, 43, 246, 83, 43, 246, 82, 43, 246, 81, 43, 246, - 80, 43, 246, 79, 43, 246, 78, 43, 246, 77, 43, 246, 76, 43, 246, 75, 43, - 246, 74, 43, 246, 73, 43, 246, 72, 43, 246, 71, 43, 246, 70, 43, 246, 69, - 43, 246, 68, 43, 246, 67, 43, 246, 66, 43, 246, 65, 43, 246, 64, 43, 246, - 63, 43, 246, 62, 43, 246, 61, 43, 246, 60, 43, 246, 59, 43, 246, 58, 43, - 246, 57, 43, 246, 56, 43, 246, 55, 43, 246, 54, 43, 246, 53, 43, 246, 52, - 43, 246, 51, 43, 246, 50, 43, 246, 49, 43, 246, 48, 43, 246, 47, 43, 246, - 46, 43, 246, 45, 43, 246, 44, 43, 246, 43, 43, 246, 42, 43, 246, 41, 43, - 246, 40, 43, 246, 39, 43, 246, 38, 43, 246, 37, 43, 246, 36, 43, 246, 35, - 43, 246, 34, 43, 246, 33, 43, 246, 32, 43, 246, 31, 43, 246, 30, 43, 246, - 29, 43, 246, 28, 43, 246, 27, 43, 246, 26, 43, 246, 25, 43, 246, 24, 43, - 246, 23, 43, 246, 22, 43, 246, 21, 43, 246, 20, 43, 246, 19, 43, 246, 18, - 43, 246, 17, 43, 246, 16, 43, 246, 15, 43, 246, 14, 43, 246, 13, 43, 246, - 12, 43, 246, 11, 43, 246, 10, 43, 246, 9, 43, 246, 8, 43, 246, 7, 43, - 246, 6, 43, 246, 5, 43, 246, 4, 43, 246, 3, 43, 246, 2, 43, 246, 1, 43, - 246, 0, 43, 245, 255, 43, 245, 254, 43, 245, 253, 43, 245, 252, 43, 245, - 251, 43, 245, 250, 43, 245, 249, 43, 245, 248, 43, 245, 247, 43, 245, - 246, 43, 245, 245, 43, 245, 244, 43, 245, 243, 43, 245, 242, 43, 245, - 241, 43, 245, 240, 43, 245, 239, 43, 245, 238, 43, 245, 237, 43, 245, - 236, 43, 245, 235, 43, 245, 234, 43, 245, 233, 43, 245, 232, 43, 245, - 231, 43, 245, 230, 43, 245, 229, 43, 245, 228, 43, 245, 227, 43, 245, - 226, 43, 245, 225, 43, 245, 224, 43, 245, 223, 43, 245, 222, 43, 245, - 221, 43, 245, 220, 43, 245, 219, 43, 245, 218, 43, 245, 217, 43, 245, - 216, 43, 245, 215, 43, 245, 214, 43, 245, 213, 43, 245, 212, 43, 245, - 211, 43, 245, 210, 43, 245, 209, 43, 245, 208, 43, 245, 207, 43, 245, - 206, 43, 245, 205, 43, 245, 204, 43, 245, 203, 43, 245, 202, 43, 245, - 201, 43, 245, 200, 43, 245, 199, 43, 245, 198, 43, 245, 197, 43, 245, - 196, 43, 245, 195, 43, 245, 194, 43, 245, 193, 43, 245, 192, 43, 245, - 191, 43, 245, 190, 43, 245, 189, 43, 245, 188, 43, 245, 187, 43, 245, - 186, 43, 245, 185, 43, 245, 184, 43, 245, 183, 43, 245, 182, 43, 245, - 181, 43, 245, 180, 43, 245, 179, 43, 245, 178, 43, 245, 177, 43, 245, - 176, 43, 245, 175, 43, 245, 174, 43, 245, 173, 43, 245, 172, 43, 245, - 171, 43, 245, 170, 43, 245, 169, 43, 245, 168, 43, 245, 167, 43, 245, - 166, 43, 245, 165, 43, 245, 164, 43, 245, 163, 43, 245, 162, 43, 245, - 161, 43, 245, 160, 43, 245, 159, 43, 245, 158, 43, 245, 157, 43, 245, - 156, 43, 245, 155, 43, 245, 154, 43, 245, 153, 43, 245, 152, 43, 245, - 151, 43, 245, 150, 43, 245, 149, 43, 245, 148, 43, 245, 147, 43, 245, - 146, 43, 245, 145, 43, 245, 144, 43, 245, 143, 43, 245, 142, 43, 245, - 141, 43, 245, 140, 43, 245, 139, 43, 245, 138, 43, 245, 137, 43, 245, - 136, 43, 245, 135, 43, 245, 134, 43, 245, 133, 43, 245, 132, 43, 245, - 131, 43, 245, 130, 43, 245, 129, 43, 245, 128, 43, 245, 127, 43, 245, - 126, 43, 245, 125, 43, 245, 124, 43, 245, 123, 43, 245, 122, 43, 245, - 121, 43, 245, 120, 43, 245, 119, 43, 245, 118, 43, 245, 117, 43, 245, - 116, 43, 245, 115, 114, 1, 233, 15, 114, 1, 196, 222, 114, 1, 214, 3, - 114, 1, 203, 216, 114, 1, 236, 49, 114, 1, 225, 80, 114, 1, 159, 114, 1, - 250, 112, 114, 1, 240, 231, 114, 1, 199, 230, 114, 1, 234, 190, 114, 1, - 144, 114, 1, 214, 4, 218, 55, 114, 1, 240, 232, 209, 80, 114, 1, 236, 50, - 218, 55, 114, 1, 225, 81, 221, 136, 114, 1, 211, 32, 209, 80, 114, 1, - 202, 235, 114, 1, 205, 234, 239, 177, 114, 1, 239, 177, 114, 1, 224, 37, - 114, 1, 205, 234, 225, 217, 114, 1, 232, 26, 114, 1, 222, 123, 114, 1, - 210, 78, 114, 1, 221, 136, 114, 1, 218, 55, 114, 1, 225, 217, 114, 1, - 209, 80, 114, 1, 221, 137, 218, 55, 114, 1, 218, 56, 221, 136, 114, 1, - 225, 218, 221, 136, 114, 1, 209, 81, 225, 217, 114, 1, 221, 137, 3, 238, - 253, 114, 1, 218, 56, 3, 238, 253, 114, 1, 225, 218, 3, 238, 253, 114, 1, - 225, 218, 3, 238, 251, 226, 42, 26, 57, 114, 1, 209, 81, 3, 238, 253, - 114, 1, 209, 81, 3, 76, 60, 114, 1, 221, 137, 209, 80, 114, 1, 218, 56, - 209, 80, 114, 1, 225, 218, 209, 80, 114, 1, 209, 81, 209, 80, 114, 1, - 221, 137, 218, 56, 209, 80, 114, 1, 218, 56, 221, 137, 209, 80, 114, 1, - 225, 218, 221, 137, 209, 80, 114, 1, 209, 81, 225, 218, 209, 80, 114, 1, - 225, 218, 209, 81, 3, 238, 253, 114, 1, 225, 218, 218, 55, 114, 1, 225, - 218, 218, 56, 209, 80, 114, 1, 209, 81, 203, 216, 114, 1, 209, 81, 203, - 217, 144, 114, 1, 209, 81, 214, 3, 114, 1, 209, 81, 214, 4, 144, 114, 1, - 203, 217, 209, 80, 114, 1, 203, 217, 211, 32, 209, 80, 114, 1, 197, 199, - 114, 1, 197, 81, 114, 1, 197, 200, 144, 114, 1, 209, 81, 218, 55, 114, 1, - 209, 81, 221, 136, 114, 1, 225, 81, 211, 32, 209, 80, 114, 1, 234, 191, - 211, 32, 209, 80, 114, 1, 209, 81, 225, 80, 114, 1, 209, 81, 225, 81, - 144, 114, 1, 63, 114, 1, 205, 234, 214, 16, 114, 1, 214, 190, 114, 1, 72, - 114, 1, 251, 47, 114, 1, 68, 114, 1, 69, 114, 1, 226, 147, 114, 1, 206, - 182, 68, 114, 1, 200, 90, 114, 1, 237, 54, 114, 1, 205, 234, 237, 40, - 114, 1, 209, 207, 68, 114, 1, 205, 234, 237, 54, 114, 1, 181, 68, 114, 1, - 196, 69, 114, 1, 66, 114, 1, 236, 116, 114, 1, 196, 171, 114, 1, 118, - 218, 55, 114, 1, 181, 66, 114, 1, 209, 207, 66, 114, 1, 200, 92, 114, 1, - 205, 234, 66, 114, 1, 214, 99, 114, 1, 214, 16, 114, 1, 214, 39, 114, 1, - 197, 166, 114, 1, 197, 34, 114, 1, 197, 70, 114, 1, 197, 96, 114, 1, 197, - 1, 114, 1, 217, 209, 66, 114, 1, 217, 209, 72, 114, 1, 217, 209, 68, 114, - 1, 217, 209, 63, 114, 1, 213, 34, 251, 106, 114, 1, 213, 34, 251, 123, - 114, 1, 205, 234, 236, 230, 114, 1, 205, 234, 251, 106, 114, 1, 205, 234, - 214, 119, 114, 1, 110, 221, 136, 114, 251, 224, 50, 231, 155, 208, 137, - 114, 251, 224, 219, 65, 231, 155, 208, 137, 114, 251, 224, 53, 231, 155, - 208, 137, 114, 251, 224, 126, 83, 208, 137, 114, 251, 224, 219, 65, 83, - 208, 137, 114, 251, 224, 130, 83, 208, 137, 114, 251, 224, 250, 156, 208, - 137, 114, 251, 224, 250, 156, 222, 175, 208, 137, 114, 251, 224, 250, - 156, 203, 109, 114, 251, 224, 250, 156, 203, 135, 114, 251, 224, 250, - 156, 237, 136, 122, 114, 251, 224, 250, 156, 230, 249, 122, 114, 251, - 224, 250, 156, 203, 110, 122, 114, 251, 224, 130, 186, 114, 251, 224, - 130, 202, 101, 186, 114, 251, 224, 130, 233, 100, 114, 251, 224, 130, - 181, 233, 100, 114, 251, 224, 130, 238, 253, 114, 251, 224, 130, 244, - 249, 114, 251, 224, 130, 222, 75, 114, 251, 224, 130, 197, 122, 114, 251, - 224, 130, 199, 100, 114, 251, 224, 126, 186, 114, 251, 224, 126, 202, - 101, 186, 114, 251, 224, 126, 233, 100, 114, 251, 224, 126, 181, 233, - 100, 114, 251, 224, 126, 238, 253, 114, 251, 224, 126, 244, 249, 114, - 251, 224, 126, 222, 75, 114, 251, 224, 126, 197, 122, 114, 251, 224, 126, - 199, 100, 114, 251, 224, 126, 51, 114, 2, 177, 3, 241, 61, 114, 202, 193, - 1, 208, 114, 114, 52, 78, 114, 211, 214, 245, 59, 234, 217, 204, 226, - 206, 169, 235, 23, 1, 214, 23, 206, 169, 235, 23, 241, 127, 214, 23, 206, - 169, 235, 23, 135, 204, 241, 206, 169, 235, 23, 124, 204, 241, 67, 34, - 16, 211, 231, 67, 34, 16, 240, 67, 67, 34, 16, 213, 38, 67, 34, 16, 214, - 12, 237, 11, 67, 34, 16, 214, 12, 239, 90, 67, 34, 16, 199, 136, 237, 11, - 67, 34, 16, 199, 136, 239, 90, 67, 34, 16, 224, 230, 67, 34, 16, 203, - 233, 67, 34, 16, 213, 147, 67, 34, 16, 195, 223, 67, 34, 16, 195, 224, - 239, 90, 67, 34, 16, 223, 205, 67, 34, 16, 251, 42, 237, 11, 67, 34, 16, - 236, 84, 237, 11, 67, 34, 16, 203, 35, 67, 34, 16, 224, 178, 67, 34, 16, - 251, 31, 67, 34, 16, 251, 32, 239, 90, 67, 34, 16, 203, 240, 67, 34, 16, - 202, 172, 67, 34, 16, 214, 130, 250, 249, 67, 34, 16, 233, 127, 250, 249, - 67, 34, 16, 211, 230, 67, 34, 16, 247, 7, 67, 34, 16, 199, 125, 67, 34, - 16, 225, 239, 250, 249, 67, 34, 16, 224, 180, 250, 249, 67, 34, 16, 224, - 179, 250, 249, 67, 34, 16, 208, 182, 67, 34, 16, 213, 137, 67, 34, 16, - 204, 251, 251, 35, 67, 34, 16, 214, 11, 250, 249, 67, 34, 16, 199, 135, - 250, 249, 67, 34, 16, 251, 36, 250, 249, 67, 34, 16, 251, 29, 67, 34, 16, - 224, 27, 67, 34, 16, 210, 85, 67, 34, 16, 212, 218, 250, 249, 67, 34, 16, - 202, 74, 67, 34, 16, 251, 103, 67, 34, 16, 208, 117, 67, 34, 16, 203, - 244, 250, 249, 67, 34, 16, 203, 244, 219, 144, 204, 249, 67, 34, 16, 214, - 6, 250, 249, 67, 34, 16, 202, 211, 67, 34, 16, 222, 162, 67, 34, 16, 237, - 159, 67, 34, 16, 201, 182, 67, 34, 16, 203, 4, 67, 34, 16, 223, 208, 67, - 34, 16, 251, 42, 236, 84, 217, 97, 67, 34, 16, 234, 225, 250, 249, 67, - 34, 16, 226, 99, 67, 34, 16, 201, 151, 250, 249, 67, 34, 16, 224, 233, - 201, 150, 67, 34, 16, 213, 67, 67, 34, 16, 211, 235, 67, 34, 16, 223, - 243, 67, 34, 16, 245, 42, 250, 249, 67, 34, 16, 210, 203, 67, 34, 16, - 213, 150, 250, 249, 67, 34, 16, 213, 148, 250, 249, 67, 34, 16, 230, 199, - 67, 34, 16, 217, 220, 67, 34, 16, 213, 16, 67, 34, 16, 223, 244, 251, - 141, 67, 34, 16, 201, 151, 251, 141, 67, 34, 16, 204, 220, 67, 34, 16, - 233, 86, 67, 34, 16, 225, 239, 217, 97, 67, 34, 16, 214, 130, 217, 97, - 67, 34, 16, 214, 12, 217, 97, 67, 34, 16, 213, 15, 67, 34, 16, 223, 228, - 67, 34, 16, 213, 14, 67, 34, 16, 223, 207, 67, 34, 16, 213, 68, 217, 97, - 67, 34, 16, 224, 179, 217, 98, 251, 73, 67, 34, 16, 224, 180, 217, 98, - 251, 73, 67, 34, 16, 195, 221, 67, 34, 16, 251, 32, 217, 97, 67, 34, 16, - 251, 33, 203, 241, 217, 97, 67, 34, 16, 195, 222, 67, 34, 16, 223, 206, - 67, 34, 16, 237, 6, 67, 34, 16, 247, 8, 67, 34, 16, 219, 36, 225, 238, - 67, 34, 16, 199, 136, 217, 97, 67, 34, 16, 212, 218, 217, 97, 67, 34, 16, - 211, 236, 217, 97, 67, 34, 16, 214, 126, 67, 34, 16, 251, 60, 67, 34, 16, - 221, 147, 67, 34, 16, 213, 148, 217, 97, 67, 34, 16, 213, 150, 217, 97, - 67, 34, 16, 236, 122, 213, 149, 67, 34, 16, 223, 104, 67, 34, 16, 251, - 61, 67, 34, 16, 201, 151, 217, 97, 67, 34, 16, 237, 9, 67, 34, 16, 203, - 244, 217, 97, 67, 34, 16, 203, 234, 67, 34, 16, 245, 42, 217, 97, 67, 34, - 16, 236, 180, 67, 34, 16, 208, 118, 217, 97, 67, 34, 16, 196, 188, 224, - 27, 67, 34, 16, 201, 148, 67, 34, 16, 211, 237, 67, 34, 16, 201, 152, 67, - 34, 16, 201, 149, 67, 34, 16, 211, 234, 67, 34, 16, 201, 147, 67, 34, 16, - 211, 233, 67, 34, 16, 233, 126, 67, 34, 16, 250, 241, 67, 34, 16, 236, - 122, 250, 241, 67, 34, 16, 214, 6, 217, 97, 67, 34, 16, 202, 210, 236, - 135, 67, 34, 16, 202, 210, 236, 83, 67, 34, 16, 202, 212, 251, 37, 67, - 34, 16, 202, 204, 225, 32, 251, 28, 67, 34, 16, 224, 232, 67, 34, 16, - 236, 217, 67, 34, 16, 196, 28, 224, 229, 67, 34, 16, 196, 28, 251, 73, - 67, 34, 16, 204, 250, 67, 34, 16, 224, 28, 251, 73, 67, 34, 16, 239, 91, - 250, 249, 67, 34, 16, 223, 209, 250, 249, 67, 34, 16, 223, 209, 251, 141, - 67, 34, 16, 223, 209, 217, 97, 67, 34, 16, 251, 36, 217, 97, 67, 34, 16, - 251, 38, 67, 34, 16, 239, 90, 67, 34, 16, 201, 163, 67, 34, 16, 202, 250, - 67, 34, 16, 223, 232, 67, 34, 16, 222, 167, 236, 210, 245, 32, 67, 34, - 16, 222, 167, 237, 160, 245, 33, 67, 34, 16, 222, 167, 201, 166, 245, 33, - 67, 34, 16, 222, 167, 203, 6, 245, 33, 67, 34, 16, 222, 167, 226, 94, - 245, 32, 67, 34, 16, 233, 127, 217, 98, 251, 73, 67, 34, 16, 233, 127, - 213, 138, 250, 237, 67, 34, 16, 233, 127, 213, 138, 239, 181, 67, 34, 16, - 239, 115, 67, 34, 16, 239, 116, 213, 138, 250, 238, 224, 229, 67, 34, 16, - 239, 116, 213, 138, 250, 238, 251, 73, 67, 34, 16, 239, 116, 213, 138, - 239, 181, 67, 34, 16, 201, 171, 67, 34, 16, 250, 242, 67, 34, 16, 226, - 101, 67, 34, 16, 239, 138, 67, 34, 16, 251, 211, 212, 100, 250, 243, 67, - 34, 16, 251, 211, 250, 240, 67, 34, 16, 251, 211, 250, 243, 67, 34, 16, - 251, 211, 219, 138, 67, 34, 16, 251, 211, 219, 149, 67, 34, 16, 251, 211, - 233, 128, 67, 34, 16, 251, 211, 233, 125, 67, 34, 16, 251, 211, 212, 100, - 233, 128, 67, 34, 16, 220, 18, 211, 243, 230, 197, 67, 34, 16, 220, 18, - 251, 143, 211, 243, 230, 197, 67, 34, 16, 220, 18, 239, 180, 230, 197, - 67, 34, 16, 220, 18, 251, 143, 239, 180, 230, 197, 67, 34, 16, 220, 18, - 201, 158, 230, 197, 67, 34, 16, 220, 18, 201, 172, 67, 34, 16, 220, 18, - 202, 255, 230, 197, 67, 34, 16, 220, 18, 202, 255, 222, 171, 230, 197, - 67, 34, 16, 220, 18, 222, 171, 230, 197, 67, 34, 16, 220, 18, 212, 146, - 230, 197, 67, 34, 16, 225, 246, 203, 28, 230, 198, 67, 34, 16, 251, 33, - 203, 28, 230, 198, 67, 34, 16, 235, 209, 202, 252, 67, 34, 16, 235, 209, - 218, 206, 67, 34, 16, 235, 209, 239, 121, 67, 34, 16, 220, 18, 199, 129, - 230, 197, 67, 34, 16, 220, 18, 211, 242, 230, 197, 67, 34, 16, 220, 18, - 212, 146, 202, 255, 230, 197, 67, 34, 16, 233, 122, 218, 56, 251, 37, 67, - 34, 16, 233, 122, 218, 56, 239, 89, 67, 34, 16, 236, 228, 225, 32, 234, - 225, 198, 228, 67, 34, 16, 226, 100, 67, 34, 16, 226, 98, 67, 34, 16, - 234, 225, 250, 250, 239, 179, 230, 196, 67, 34, 16, 234, 225, 239, 136, - 161, 67, 34, 16, 234, 225, 239, 136, 217, 220, 67, 34, 16, 234, 225, 217, - 214, 230, 197, 67, 34, 16, 234, 225, 239, 136, 239, 152, 67, 34, 16, 234, - 225, 206, 0, 239, 135, 239, 152, 67, 34, 16, 234, 225, 239, 136, 224, - 209, 67, 34, 16, 234, 225, 239, 136, 195, 11, 67, 34, 16, 234, 225, 239, - 136, 216, 224, 224, 229, 67, 34, 16, 234, 225, 239, 136, 216, 224, 251, - 73, 67, 34, 16, 234, 225, 220, 68, 245, 34, 239, 121, 67, 34, 16, 234, - 225, 220, 68, 245, 34, 218, 206, 67, 34, 16, 235, 154, 206, 0, 245, 34, - 199, 128, 67, 34, 16, 234, 225, 206, 0, 245, 34, 203, 245, 67, 34, 16, - 234, 225, 217, 100, 67, 34, 16, 245, 35, 194, 234, 67, 34, 16, 245, 35, - 224, 26, 67, 34, 16, 245, 35, 205, 139, 67, 34, 16, 234, 225, 230, 249, - 196, 27, 203, 0, 67, 34, 16, 234, 225, 236, 229, 251, 62, 67, 34, 16, - 196, 27, 201, 159, 67, 34, 16, 239, 129, 201, 159, 67, 34, 16, 239, 129, - 203, 0, 67, 34, 16, 239, 129, 251, 39, 237, 160, 239, 20, 67, 34, 16, - 239, 129, 218, 204, 203, 5, 239, 20, 67, 34, 16, 239, 129, 239, 112, 236, - 96, 239, 20, 67, 34, 16, 239, 129, 201, 169, 214, 136, 239, 20, 67, 34, - 16, 196, 27, 251, 39, 237, 160, 239, 20, 67, 34, 16, 196, 27, 218, 204, - 203, 5, 239, 20, 67, 34, 16, 196, 27, 239, 112, 236, 96, 239, 20, 67, 34, - 16, 196, 27, 201, 169, 214, 136, 239, 20, 67, 34, 16, 234, 30, 239, 128, - 67, 34, 16, 234, 30, 196, 26, 67, 34, 16, 239, 137, 251, 39, 219, 37, 67, - 34, 16, 239, 137, 251, 39, 219, 179, 67, 34, 16, 239, 137, 239, 90, 67, - 34, 16, 239, 137, 202, 202, 67, 34, 16, 206, 72, 202, 202, 67, 34, 16, - 206, 72, 202, 203, 239, 74, 67, 34, 16, 206, 72, 202, 203, 201, 160, 67, - 34, 16, 206, 72, 202, 203, 202, 248, 67, 34, 16, 206, 72, 250, 211, 67, - 34, 16, 206, 72, 250, 212, 239, 74, 67, 34, 16, 206, 72, 250, 212, 201, - 160, 67, 34, 16, 206, 72, 250, 212, 202, 248, 67, 34, 16, 239, 113, 234, - 11, 67, 34, 16, 239, 120, 214, 39, 67, 34, 16, 204, 236, 67, 34, 16, 250, - 234, 161, 67, 34, 16, 250, 234, 198, 228, 67, 34, 16, 250, 234, 234, 123, - 67, 34, 16, 250, 234, 239, 152, 67, 34, 16, 250, 234, 224, 209, 67, 34, - 16, 250, 234, 195, 11, 67, 34, 16, 250, 234, 216, 223, 67, 34, 16, 224, - 179, 217, 98, 219, 148, 67, 34, 16, 224, 180, 217, 98, 219, 148, 67, 34, - 16, 224, 179, 217, 98, 224, 229, 67, 34, 16, 224, 180, 217, 98, 224, 229, - 67, 34, 16, 224, 28, 224, 229, 67, 34, 16, 233, 127, 217, 98, 224, 229, - 34, 16, 206, 62, 249, 75, 34, 16, 52, 249, 75, 34, 16, 48, 249, 75, 34, - 16, 210, 90, 48, 249, 75, 34, 16, 240, 64, 249, 75, 34, 16, 206, 182, - 249, 75, 34, 16, 50, 210, 120, 55, 34, 16, 53, 210, 120, 55, 34, 16, 210, - 120, 238, 250, 34, 16, 240, 108, 208, 121, 34, 16, 240, 137, 247, 122, - 34, 16, 208, 121, 34, 16, 244, 176, 34, 16, 210, 118, 235, 142, 34, 16, - 210, 118, 235, 141, 34, 16, 210, 118, 235, 140, 34, 16, 235, 164, 34, 16, - 235, 165, 60, 34, 16, 248, 49, 78, 34, 16, 247, 164, 34, 16, 248, 63, 34, - 16, 179, 34, 16, 214, 114, 205, 16, 34, 16, 200, 214, 205, 16, 34, 16, - 202, 149, 205, 16, 34, 16, 235, 6, 205, 16, 34, 16, 235, 100, 205, 16, - 34, 16, 206, 28, 205, 16, 34, 16, 206, 26, 234, 242, 34, 16, 235, 4, 234, - 242, 34, 16, 234, 191, 244, 218, 34, 16, 234, 191, 244, 219, 214, 43, - 251, 132, 34, 16, 234, 191, 244, 219, 214, 43, 249, 58, 34, 16, 247, 208, - 244, 218, 34, 16, 236, 50, 244, 218, 34, 16, 236, 50, 244, 219, 214, 43, - 251, 132, 34, 16, 236, 50, 244, 219, 214, 43, 249, 58, 34, 16, 237, 207, - 244, 217, 34, 16, 237, 207, 244, 216, 34, 16, 218, 120, 219, 203, 210, - 101, 34, 16, 52, 207, 12, 34, 16, 52, 235, 82, 34, 16, 235, 83, 200, 36, - 34, 16, 235, 83, 237, 235, 34, 16, 217, 203, 200, 36, 34, 16, 217, 203, - 237, 235, 34, 16, 207, 13, 200, 36, 34, 16, 207, 13, 237, 235, 34, 16, - 211, 88, 152, 207, 12, 34, 16, 211, 88, 152, 235, 82, 34, 16, 244, 156, - 202, 78, 34, 16, 241, 2, 202, 78, 34, 16, 214, 43, 251, 132, 34, 16, 214, - 43, 249, 58, 34, 16, 211, 69, 251, 132, 34, 16, 211, 69, 249, 58, 34, 16, - 218, 123, 210, 101, 34, 16, 197, 71, 210, 101, 34, 16, 157, 210, 101, 34, - 16, 211, 88, 210, 101, 34, 16, 237, 27, 210, 101, 34, 16, 206, 22, 210, - 101, 34, 16, 202, 174, 210, 101, 34, 16, 206, 12, 210, 101, 34, 16, 97, - 231, 58, 200, 232, 210, 101, 34, 16, 196, 223, 216, 9, 34, 16, 98, 216, - 9, 34, 16, 244, 250, 196, 223, 216, 9, 34, 16, 47, 216, 10, 197, 73, 34, - 16, 47, 216, 10, 248, 136, 34, 16, 201, 181, 216, 10, 124, 197, 73, 34, - 16, 201, 181, 216, 10, 124, 248, 136, 34, 16, 201, 181, 216, 10, 50, 197, - 73, 34, 16, 201, 181, 216, 10, 50, 248, 136, 34, 16, 201, 181, 216, 10, - 53, 197, 73, 34, 16, 201, 181, 216, 10, 53, 248, 136, 34, 16, 201, 181, - 216, 10, 135, 197, 73, 34, 16, 201, 181, 216, 10, 135, 248, 136, 34, 16, - 201, 181, 216, 10, 124, 53, 197, 73, 34, 16, 201, 181, 216, 10, 124, 53, - 248, 136, 34, 16, 218, 190, 216, 10, 197, 73, 34, 16, 218, 190, 216, 10, - 248, 136, 34, 16, 201, 178, 216, 10, 135, 197, 73, 34, 16, 201, 178, 216, - 10, 135, 248, 136, 34, 16, 213, 141, 216, 9, 34, 16, 198, 241, 216, 9, - 34, 16, 216, 10, 248, 136, 34, 16, 215, 147, 216, 9, 34, 16, 244, 187, - 216, 10, 197, 73, 34, 16, 244, 187, 216, 10, 248, 136, 34, 16, 248, 47, - 34, 16, 197, 71, 216, 13, 34, 16, 157, 216, 13, 34, 16, 211, 88, 216, 13, - 34, 16, 237, 27, 216, 13, 34, 16, 206, 22, 216, 13, 34, 16, 202, 174, - 216, 13, 34, 16, 206, 12, 216, 13, 34, 16, 97, 231, 58, 200, 232, 216, - 13, 34, 16, 38, 204, 243, 34, 16, 38, 205, 101, 204, 243, 34, 16, 38, - 201, 189, 34, 16, 38, 201, 188, 34, 16, 38, 201, 187, 34, 16, 235, 125, - 201, 189, 34, 16, 235, 125, 201, 188, 34, 16, 235, 125, 201, 187, 34, 16, - 38, 250, 147, 238, 253, 34, 16, 38, 235, 92, 34, 16, 38, 235, 91, 34, 16, - 38, 235, 90, 34, 16, 38, 235, 89, 34, 16, 38, 235, 88, 34, 16, 248, 243, - 249, 6, 34, 16, 236, 222, 249, 6, 34, 16, 248, 243, 202, 107, 34, 16, - 236, 222, 202, 107, 34, 16, 248, 243, 205, 225, 34, 16, 236, 222, 205, - 225, 34, 16, 248, 243, 212, 227, 34, 16, 236, 222, 212, 227, 34, 16, 38, - 252, 22, 34, 16, 38, 205, 20, 34, 16, 38, 203, 11, 34, 16, 38, 205, 21, - 34, 16, 38, 220, 33, 34, 16, 38, 220, 32, 34, 16, 38, 252, 21, 34, 16, - 38, 221, 210, 34, 16, 250, 223, 200, 36, 34, 16, 250, 223, 237, 235, 34, - 16, 38, 239, 13, 34, 16, 38, 209, 254, 34, 16, 38, 235, 71, 34, 16, 38, - 205, 221, 34, 16, 38, 248, 221, 34, 16, 38, 52, 201, 249, 34, 16, 38, - 201, 165, 201, 249, 34, 16, 210, 4, 34, 16, 204, 154, 34, 16, 195, 158, - 34, 16, 212, 219, 34, 16, 219, 129, 34, 16, 235, 18, 34, 16, 241, 73, 34, - 16, 239, 238, 34, 16, 233, 117, 216, 14, 205, 248, 34, 16, 233, 117, 216, - 14, 216, 51, 205, 248, 34, 16, 201, 218, 34, 16, 201, 4, 34, 16, 226, 17, - 201, 4, 34, 16, 201, 5, 205, 248, 34, 16, 201, 5, 200, 36, 34, 16, 214, - 60, 204, 195, 34, 16, 214, 60, 204, 192, 34, 16, 214, 60, 204, 191, 34, - 16, 214, 60, 204, 190, 34, 16, 214, 60, 204, 189, 34, 16, 214, 60, 204, - 188, 34, 16, 214, 60, 204, 187, 34, 16, 214, 60, 204, 186, 34, 16, 214, - 60, 204, 185, 34, 16, 214, 60, 204, 194, 34, 16, 214, 60, 204, 193, 34, - 16, 232, 157, 34, 16, 217, 110, 34, 16, 236, 222, 77, 204, 232, 34, 16, - 239, 231, 205, 248, 34, 16, 38, 135, 248, 77, 34, 16, 38, 124, 248, 77, - 34, 16, 38, 232, 170, 34, 16, 38, 205, 211, 212, 151, 34, 16, 213, 84, - 78, 34, 16, 213, 84, 124, 78, 34, 16, 157, 213, 84, 78, 34, 16, 233, 154, - 200, 36, 34, 16, 233, 154, 237, 235, 34, 16, 3, 235, 124, 34, 16, 240, - 91, 34, 16, 240, 92, 251, 146, 34, 16, 219, 253, 34, 16, 221, 231, 34, - 16, 248, 44, 34, 16, 207, 109, 197, 73, 34, 16, 207, 109, 248, 136, 34, - 16, 219, 19, 34, 16, 219, 20, 248, 136, 34, 16, 207, 103, 197, 73, 34, - 16, 207, 103, 248, 136, 34, 16, 234, 208, 197, 73, 34, 16, 234, 208, 248, - 136, 34, 16, 221, 232, 213, 43, 210, 101, 34, 16, 221, 232, 226, 91, 210, - 101, 34, 16, 248, 45, 210, 101, 34, 16, 207, 109, 210, 101, 34, 16, 219, - 20, 210, 101, 34, 16, 207, 103, 210, 101, 34, 16, 203, 25, 213, 41, 241, - 32, 211, 253, 213, 42, 34, 16, 203, 25, 213, 41, 241, 32, 211, 253, 226, - 90, 34, 16, 203, 25, 213, 41, 241, 32, 211, 253, 213, 43, 239, 100, 34, - 16, 203, 25, 226, 89, 241, 32, 211, 253, 213, 42, 34, 16, 203, 25, 226, - 89, 241, 32, 211, 253, 226, 90, 34, 16, 203, 25, 226, 89, 241, 32, 211, - 253, 226, 91, 239, 100, 34, 16, 203, 25, 226, 89, 241, 32, 211, 253, 226, - 91, 239, 99, 34, 16, 203, 25, 226, 89, 241, 32, 211, 253, 226, 91, 239, - 98, 34, 16, 241, 64, 34, 16, 233, 89, 247, 208, 244, 218, 34, 16, 233, - 89, 236, 50, 244, 218, 34, 16, 47, 250, 112, 34, 16, 199, 6, 34, 16, 212, - 114, 34, 16, 244, 208, 34, 16, 208, 172, 34, 16, 244, 213, 34, 16, 201, - 236, 34, 16, 212, 82, 34, 16, 212, 83, 235, 74, 34, 16, 208, 173, 235, - 74, 34, 16, 201, 237, 210, 98, 34, 16, 213, 24, 204, 144, 34, 16, 224, - 83, 247, 208, 244, 218, 34, 16, 224, 83, 236, 222, 77, 212, 212, 34, 16, - 224, 83, 48, 216, 13, 34, 16, 224, 83, 210, 170, 78, 34, 16, 224, 83, - 197, 71, 216, 13, 34, 16, 224, 83, 157, 216, 13, 34, 16, 224, 83, 211, - 88, 216, 14, 204, 244, 237, 235, 34, 16, 224, 83, 211, 88, 216, 14, 204, - 244, 200, 36, 34, 16, 224, 83, 237, 27, 216, 14, 204, 244, 237, 235, 34, - 16, 224, 83, 237, 27, 216, 14, 204, 244, 200, 36, 34, 16, 224, 83, 235, - 83, 55, 32, 198, 247, 216, 17, 204, 40, 32, 198, 247, 216, 17, 204, 29, - 32, 198, 247, 216, 17, 204, 19, 32, 198, 247, 216, 17, 204, 12, 32, 198, - 247, 216, 17, 204, 4, 32, 198, 247, 216, 17, 203, 254, 32, 198, 247, 216, - 17, 203, 253, 32, 198, 247, 216, 17, 203, 252, 32, 198, 247, 216, 17, - 203, 251, 32, 198, 247, 216, 17, 204, 39, 32, 198, 247, 216, 17, 204, 38, - 32, 198, 247, 216, 17, 204, 37, 32, 198, 247, 216, 17, 204, 36, 32, 198, - 247, 216, 17, 204, 35, 32, 198, 247, 216, 17, 204, 34, 32, 198, 247, 216, - 17, 204, 33, 32, 198, 247, 216, 17, 204, 32, 32, 198, 247, 216, 17, 204, - 31, 32, 198, 247, 216, 17, 204, 30, 32, 198, 247, 216, 17, 204, 28, 32, - 198, 247, 216, 17, 204, 27, 32, 198, 247, 216, 17, 204, 26, 32, 198, 247, - 216, 17, 204, 25, 32, 198, 247, 216, 17, 204, 24, 32, 198, 247, 216, 17, - 204, 3, 32, 198, 247, 216, 17, 204, 2, 32, 198, 247, 216, 17, 204, 1, 32, - 198, 247, 216, 17, 204, 0, 32, 198, 247, 216, 17, 203, 255, 32, 226, 40, - 216, 17, 204, 40, 32, 226, 40, 216, 17, 204, 29, 32, 226, 40, 216, 17, - 204, 12, 32, 226, 40, 216, 17, 204, 4, 32, 226, 40, 216, 17, 203, 253, - 32, 226, 40, 216, 17, 203, 252, 32, 226, 40, 216, 17, 204, 38, 32, 226, - 40, 216, 17, 204, 37, 32, 226, 40, 216, 17, 204, 36, 32, 226, 40, 216, - 17, 204, 35, 32, 226, 40, 216, 17, 204, 32, 32, 226, 40, 216, 17, 204, - 31, 32, 226, 40, 216, 17, 204, 30, 32, 226, 40, 216, 17, 204, 25, 32, - 226, 40, 216, 17, 204, 24, 32, 226, 40, 216, 17, 204, 23, 32, 226, 40, - 216, 17, 204, 22, 32, 226, 40, 216, 17, 204, 21, 32, 226, 40, 216, 17, - 204, 20, 32, 226, 40, 216, 17, 204, 18, 32, 226, 40, 216, 17, 204, 17, - 32, 226, 40, 216, 17, 204, 16, 32, 226, 40, 216, 17, 204, 15, 32, 226, - 40, 216, 17, 204, 14, 32, 226, 40, 216, 17, 204, 13, 32, 226, 40, 216, - 17, 204, 11, 32, 226, 40, 216, 17, 204, 10, 32, 226, 40, 216, 17, 204, 9, - 32, 226, 40, 216, 17, 204, 8, 32, 226, 40, 216, 17, 204, 7, 32, 226, 40, - 216, 17, 204, 6, 32, 226, 40, 216, 17, 204, 5, 32, 226, 40, 216, 17, 204, - 3, 32, 226, 40, 216, 17, 204, 2, 32, 226, 40, 216, 17, 204, 1, 32, 226, - 40, 216, 17, 204, 0, 32, 226, 40, 216, 17, 203, 255, 38, 32, 34, 201, - 161, 38, 32, 34, 202, 249, 38, 32, 34, 213, 53, 32, 34, 222, 166, 219, - 250, 215, 142, 195, 79, 219, 250, 215, 142, 100, 219, 250, 215, 142, 102, - 219, 250, 215, 142, 134, 219, 250, 215, 142, 136, 219, 250, 215, 142, - 146, 219, 250, 215, 142, 167, 219, 250, 215, 142, 178, 219, 250, 215, - 142, 171, 219, 250, 215, 142, 182, 219, 250, 215, 142, 203, 23, 219, 250, - 215, 142, 236, 252, 219, 250, 215, 142, 200, 239, 219, 250, 215, 142, - 202, 179, 219, 250, 215, 142, 235, 1, 219, 250, 215, 142, 235, 149, 219, - 250, 215, 142, 206, 23, 219, 250, 215, 142, 207, 68, 219, 250, 215, 142, - 237, 28, 219, 250, 215, 142, 216, 176, 218, 205, 36, 237, 72, 239, 114, - 36, 232, 121, 237, 72, 239, 114, 36, 231, 62, 237, 72, 239, 114, 36, 237, - 71, 232, 122, 239, 114, 36, 237, 71, 231, 61, 239, 114, 36, 237, 72, 202, - 251, 36, 247, 36, 202, 251, 36, 234, 217, 244, 249, 202, 251, 36, 219, - 11, 202, 251, 36, 249, 70, 202, 251, 36, 224, 197, 205, 224, 202, 251, - 36, 241, 122, 202, 251, 36, 250, 197, 202, 251, 36, 214, 78, 202, 251, - 36, 248, 55, 214, 34, 202, 251, 36, 239, 233, 214, 73, 239, 66, 202, 251, - 36, 239, 63, 202, 251, 36, 195, 229, 202, 251, 36, 226, 77, 202, 251, 36, - 213, 63, 202, 251, 36, 210, 178, 202, 251, 36, 241, 134, 202, 251, 36, - 231, 176, 249, 138, 202, 251, 36, 197, 152, 202, 251, 36, 235, 46, 202, - 251, 36, 251, 248, 202, 251, 36, 210, 133, 202, 251, 36, 210, 105, 202, - 251, 36, 237, 70, 202, 251, 36, 225, 113, 202, 251, 36, 241, 129, 202, - 251, 36, 236, 220, 202, 251, 36, 237, 172, 202, 251, 36, 247, 3, 202, - 251, 36, 239, 243, 202, 251, 36, 27, 210, 104, 202, 251, 36, 213, 234, - 202, 251, 36, 222, 170, 202, 251, 36, 244, 201, 202, 251, 36, 224, 71, - 202, 251, 36, 234, 72, 202, 251, 36, 204, 207, 202, 251, 36, 211, 202, - 202, 251, 36, 234, 216, 202, 251, 36, 210, 106, 202, 251, 36, 222, 210, - 214, 73, 218, 241, 202, 251, 36, 210, 102, 202, 251, 36, 233, 137, 202, - 30, 219, 183, 202, 251, 36, 236, 223, 202, 251, 36, 204, 221, 202, 251, - 36, 233, 92, 202, 251, 36, 236, 213, 202, 251, 36, 213, 110, 202, 251, - 36, 209, 247, 202, 251, 36, 235, 72, 202, 251, 36, 199, 127, 214, 73, - 197, 131, 202, 251, 36, 241, 139, 202, 251, 36, 219, 202, 202, 251, 36, - 236, 123, 202, 251, 36, 200, 47, 202, 251, 36, 239, 101, 202, 251, 36, - 244, 203, 218, 164, 202, 251, 36, 233, 68, 202, 251, 36, 234, 73, 226, - 86, 202, 251, 36, 220, 6, 202, 251, 36, 252, 17, 202, 251, 36, 236, 239, - 202, 251, 36, 237, 239, 202, 251, 36, 197, 129, 202, 251, 36, 206, 57, - 202, 251, 36, 226, 50, 202, 251, 36, 239, 200, 202, 251, 36, 240, 69, - 202, 251, 36, 239, 97, 202, 251, 36, 236, 87, 202, 251, 36, 207, 64, 202, - 251, 36, 204, 225, 202, 251, 36, 232, 172, 202, 251, 36, 244, 151, 202, - 251, 36, 244, 198, 202, 251, 36, 235, 218, 202, 251, 36, 251, 212, 202, - 251, 36, 244, 150, 202, 251, 36, 214, 120, 202, 218, 199, 103, 202, 251, - 36, 239, 123, 202, 251, 36, 223, 70, 202, 251, 36, 235, 10, 241, 88, 209, - 216, 200, 50, 17, 100, 241, 88, 209, 216, 200, 50, 17, 102, 241, 88, 209, - 216, 200, 50, 17, 134, 241, 88, 209, 216, 200, 50, 17, 136, 241, 88, 209, - 216, 200, 50, 17, 146, 241, 88, 209, 216, 200, 50, 17, 167, 241, 88, 209, - 216, 200, 50, 17, 178, 241, 88, 209, 216, 200, 50, 17, 171, 241, 88, 209, - 216, 200, 50, 17, 182, 241, 88, 209, 216, 203, 19, 17, 100, 241, 88, 209, - 216, 203, 19, 17, 102, 241, 88, 209, 216, 203, 19, 17, 134, 241, 88, 209, - 216, 203, 19, 17, 136, 241, 88, 209, 216, 203, 19, 17, 146, 241, 88, 209, - 216, 203, 19, 17, 167, 241, 88, 209, 216, 203, 19, 17, 178, 241, 88, 209, - 216, 203, 19, 17, 171, 241, 88, 209, 216, 203, 19, 17, 182, 143, 203, - 118, 117, 100, 143, 203, 118, 117, 102, 143, 203, 118, 117, 134, 143, - 203, 118, 117, 136, 143, 203, 118, 117, 146, 203, 118, 117, 100, 203, - 118, 117, 146, 13, 27, 6, 63, 13, 27, 6, 250, 112, 13, 27, 6, 247, 207, - 13, 27, 6, 240, 231, 13, 27, 6, 69, 13, 27, 6, 236, 49, 13, 27, 6, 234, - 190, 13, 27, 6, 233, 15, 13, 27, 6, 68, 13, 27, 6, 225, 217, 13, 27, 6, - 225, 80, 13, 27, 6, 159, 13, 27, 6, 221, 136, 13, 27, 6, 218, 55, 13, 27, - 6, 72, 13, 27, 6, 214, 3, 13, 27, 6, 211, 167, 13, 27, 6, 144, 13, 27, 6, - 209, 80, 13, 27, 6, 203, 216, 13, 27, 6, 66, 13, 27, 6, 199, 230, 13, 27, - 6, 197, 199, 13, 27, 6, 196, 222, 13, 27, 6, 196, 148, 13, 27, 6, 195, - 158, 13, 27, 4, 63, 13, 27, 4, 250, 112, 13, 27, 4, 247, 207, 13, 27, 4, - 240, 231, 13, 27, 4, 69, 13, 27, 4, 236, 49, 13, 27, 4, 234, 190, 13, 27, - 4, 233, 15, 13, 27, 4, 68, 13, 27, 4, 225, 217, 13, 27, 4, 225, 80, 13, - 27, 4, 159, 13, 27, 4, 221, 136, 13, 27, 4, 218, 55, 13, 27, 4, 72, 13, - 27, 4, 214, 3, 13, 27, 4, 211, 167, 13, 27, 4, 144, 13, 27, 4, 209, 80, - 13, 27, 4, 203, 216, 13, 27, 4, 66, 13, 27, 4, 199, 230, 13, 27, 4, 197, - 199, 13, 27, 4, 196, 222, 13, 27, 4, 196, 148, 13, 27, 4, 195, 158, 13, - 41, 6, 63, 13, 41, 6, 250, 112, 13, 41, 6, 247, 207, 13, 41, 6, 240, 231, - 13, 41, 6, 69, 13, 41, 6, 236, 49, 13, 41, 6, 234, 190, 13, 41, 6, 233, - 15, 13, 41, 6, 68, 13, 41, 6, 225, 217, 13, 41, 6, 225, 80, 13, 41, 6, - 159, 13, 41, 6, 221, 136, 13, 41, 6, 218, 55, 13, 41, 6, 72, 13, 41, 6, - 214, 3, 13, 41, 6, 211, 167, 13, 41, 6, 144, 13, 41, 6, 209, 80, 13, 41, - 6, 203, 216, 13, 41, 6, 66, 13, 41, 6, 199, 230, 13, 41, 6, 197, 199, 13, - 41, 6, 196, 222, 13, 41, 6, 196, 148, 13, 41, 6, 195, 158, 13, 41, 4, 63, - 13, 41, 4, 250, 112, 13, 41, 4, 247, 207, 13, 41, 4, 240, 231, 13, 41, 4, - 69, 13, 41, 4, 236, 49, 13, 41, 4, 234, 190, 13, 41, 4, 68, 13, 41, 4, - 225, 217, 13, 41, 4, 225, 80, 13, 41, 4, 159, 13, 41, 4, 221, 136, 13, - 41, 4, 218, 55, 13, 41, 4, 72, 13, 41, 4, 214, 3, 13, 41, 4, 211, 167, - 13, 41, 4, 144, 13, 41, 4, 209, 80, 13, 41, 4, 203, 216, 13, 41, 4, 66, - 13, 41, 4, 199, 230, 13, 41, 4, 197, 199, 13, 41, 4, 196, 222, 13, 41, 4, - 196, 148, 13, 41, 4, 195, 158, 13, 27, 41, 6, 63, 13, 27, 41, 6, 250, - 112, 13, 27, 41, 6, 247, 207, 13, 27, 41, 6, 240, 231, 13, 27, 41, 6, 69, - 13, 27, 41, 6, 236, 49, 13, 27, 41, 6, 234, 190, 13, 27, 41, 6, 233, 15, - 13, 27, 41, 6, 68, 13, 27, 41, 6, 225, 217, 13, 27, 41, 6, 225, 80, 13, - 27, 41, 6, 159, 13, 27, 41, 6, 221, 136, 13, 27, 41, 6, 218, 55, 13, 27, - 41, 6, 72, 13, 27, 41, 6, 214, 3, 13, 27, 41, 6, 211, 167, 13, 27, 41, 6, - 144, 13, 27, 41, 6, 209, 80, 13, 27, 41, 6, 203, 216, 13, 27, 41, 6, 66, - 13, 27, 41, 6, 199, 230, 13, 27, 41, 6, 197, 199, 13, 27, 41, 6, 196, - 222, 13, 27, 41, 6, 196, 148, 13, 27, 41, 6, 195, 158, 13, 27, 41, 4, 63, - 13, 27, 41, 4, 250, 112, 13, 27, 41, 4, 247, 207, 13, 27, 41, 4, 240, - 231, 13, 27, 41, 4, 69, 13, 27, 41, 4, 236, 49, 13, 27, 41, 4, 234, 190, - 13, 27, 41, 4, 233, 15, 13, 27, 41, 4, 68, 13, 27, 41, 4, 225, 217, 13, - 27, 41, 4, 225, 80, 13, 27, 41, 4, 159, 13, 27, 41, 4, 221, 136, 13, 27, - 41, 4, 218, 55, 13, 27, 41, 4, 72, 13, 27, 41, 4, 214, 3, 13, 27, 41, 4, - 211, 167, 13, 27, 41, 4, 144, 13, 27, 41, 4, 209, 80, 13, 27, 41, 4, 203, - 216, 13, 27, 41, 4, 66, 13, 27, 41, 4, 199, 230, 13, 27, 41, 4, 197, 199, - 13, 27, 41, 4, 196, 222, 13, 27, 41, 4, 196, 148, 13, 27, 41, 4, 195, - 158, 13, 145, 6, 63, 13, 145, 6, 247, 207, 13, 145, 6, 240, 231, 13, 145, - 6, 234, 190, 13, 145, 6, 225, 217, 13, 145, 6, 225, 80, 13, 145, 6, 218, - 55, 13, 145, 6, 72, 13, 145, 6, 214, 3, 13, 145, 6, 211, 167, 13, 145, 6, - 209, 80, 13, 145, 6, 203, 216, 13, 145, 6, 66, 13, 145, 6, 199, 230, 13, - 145, 6, 197, 199, 13, 145, 6, 196, 222, 13, 145, 6, 196, 148, 13, 145, 6, - 195, 158, 13, 145, 4, 63, 13, 145, 4, 250, 112, 13, 145, 4, 247, 207, 13, - 145, 4, 240, 231, 13, 145, 4, 236, 49, 13, 145, 4, 233, 15, 13, 145, 4, - 68, 13, 145, 4, 225, 217, 13, 145, 4, 225, 80, 13, 145, 4, 159, 13, 145, - 4, 221, 136, 13, 145, 4, 218, 55, 13, 145, 4, 214, 3, 13, 145, 4, 211, - 167, 13, 145, 4, 144, 13, 145, 4, 209, 80, 13, 145, 4, 203, 216, 13, 145, - 4, 66, 13, 145, 4, 199, 230, 13, 145, 4, 197, 199, 13, 145, 4, 196, 222, - 13, 145, 4, 196, 148, 13, 145, 4, 195, 158, 13, 27, 145, 6, 63, 13, 27, - 145, 6, 250, 112, 13, 27, 145, 6, 247, 207, 13, 27, 145, 6, 240, 231, 13, - 27, 145, 6, 69, 13, 27, 145, 6, 236, 49, 13, 27, 145, 6, 234, 190, 13, - 27, 145, 6, 233, 15, 13, 27, 145, 6, 68, 13, 27, 145, 6, 225, 217, 13, - 27, 145, 6, 225, 80, 13, 27, 145, 6, 159, 13, 27, 145, 6, 221, 136, 13, - 27, 145, 6, 218, 55, 13, 27, 145, 6, 72, 13, 27, 145, 6, 214, 3, 13, 27, - 145, 6, 211, 167, 13, 27, 145, 6, 144, 13, 27, 145, 6, 209, 80, 13, 27, - 145, 6, 203, 216, 13, 27, 145, 6, 66, 13, 27, 145, 6, 199, 230, 13, 27, - 145, 6, 197, 199, 13, 27, 145, 6, 196, 222, 13, 27, 145, 6, 196, 148, 13, - 27, 145, 6, 195, 158, 13, 27, 145, 4, 63, 13, 27, 145, 4, 250, 112, 13, - 27, 145, 4, 247, 207, 13, 27, 145, 4, 240, 231, 13, 27, 145, 4, 69, 13, - 27, 145, 4, 236, 49, 13, 27, 145, 4, 234, 190, 13, 27, 145, 4, 233, 15, - 13, 27, 145, 4, 68, 13, 27, 145, 4, 225, 217, 13, 27, 145, 4, 225, 80, - 13, 27, 145, 4, 159, 13, 27, 145, 4, 221, 136, 13, 27, 145, 4, 218, 55, - 13, 27, 145, 4, 72, 13, 27, 145, 4, 214, 3, 13, 27, 145, 4, 211, 167, 13, - 27, 145, 4, 144, 13, 27, 145, 4, 209, 80, 13, 27, 145, 4, 203, 216, 13, - 27, 145, 4, 66, 13, 27, 145, 4, 199, 230, 13, 27, 145, 4, 197, 199, 13, - 27, 145, 4, 196, 222, 13, 27, 145, 4, 196, 148, 13, 27, 145, 4, 195, 158, - 13, 187, 6, 63, 13, 187, 6, 250, 112, 13, 187, 6, 240, 231, 13, 187, 6, - 69, 13, 187, 6, 236, 49, 13, 187, 6, 234, 190, 13, 187, 6, 225, 217, 13, - 187, 6, 225, 80, 13, 187, 6, 159, 13, 187, 6, 221, 136, 13, 187, 6, 218, - 55, 13, 187, 6, 72, 13, 187, 6, 214, 3, 13, 187, 6, 211, 167, 13, 187, 6, - 209, 80, 13, 187, 6, 203, 216, 13, 187, 6, 66, 13, 187, 6, 199, 230, 13, - 187, 6, 197, 199, 13, 187, 6, 196, 222, 13, 187, 6, 196, 148, 13, 187, 4, - 63, 13, 187, 4, 250, 112, 13, 187, 4, 247, 207, 13, 187, 4, 240, 231, 13, - 187, 4, 69, 13, 187, 4, 236, 49, 13, 187, 4, 234, 190, 13, 187, 4, 233, - 15, 13, 187, 4, 68, 13, 187, 4, 225, 217, 13, 187, 4, 225, 80, 13, 187, - 4, 159, 13, 187, 4, 221, 136, 13, 187, 4, 218, 55, 13, 187, 4, 72, 13, - 187, 4, 214, 3, 13, 187, 4, 211, 167, 13, 187, 4, 144, 13, 187, 4, 209, - 80, 13, 187, 4, 203, 216, 13, 187, 4, 66, 13, 187, 4, 199, 230, 13, 187, - 4, 197, 199, 13, 187, 4, 196, 222, 13, 187, 4, 196, 148, 13, 187, 4, 195, - 158, 13, 237, 241, 6, 63, 13, 237, 241, 6, 250, 112, 13, 237, 241, 6, - 240, 231, 13, 237, 241, 6, 69, 13, 237, 241, 6, 236, 49, 13, 237, 241, 6, - 234, 190, 13, 237, 241, 6, 68, 13, 237, 241, 6, 225, 217, 13, 237, 241, - 6, 225, 80, 13, 237, 241, 6, 159, 13, 237, 241, 6, 221, 136, 13, 237, - 241, 6, 72, 13, 237, 241, 6, 209, 80, 13, 237, 241, 6, 203, 216, 13, 237, - 241, 6, 66, 13, 237, 241, 6, 199, 230, 13, 237, 241, 6, 197, 199, 13, - 237, 241, 6, 196, 222, 13, 237, 241, 6, 196, 148, 13, 237, 241, 4, 63, - 13, 237, 241, 4, 250, 112, 13, 237, 241, 4, 247, 207, 13, 237, 241, 4, - 240, 231, 13, 237, 241, 4, 69, 13, 237, 241, 4, 236, 49, 13, 237, 241, 4, - 234, 190, 13, 237, 241, 4, 233, 15, 13, 237, 241, 4, 68, 13, 237, 241, 4, - 225, 217, 13, 237, 241, 4, 225, 80, 13, 237, 241, 4, 159, 13, 237, 241, - 4, 221, 136, 13, 237, 241, 4, 218, 55, 13, 237, 241, 4, 72, 13, 237, 241, - 4, 214, 3, 13, 237, 241, 4, 211, 167, 13, 237, 241, 4, 144, 13, 237, 241, - 4, 209, 80, 13, 237, 241, 4, 203, 216, 13, 237, 241, 4, 66, 13, 237, 241, - 4, 199, 230, 13, 237, 241, 4, 197, 199, 13, 237, 241, 4, 196, 222, 13, - 237, 241, 4, 196, 148, 13, 237, 241, 4, 195, 158, 13, 27, 187, 6, 63, 13, - 27, 187, 6, 250, 112, 13, 27, 187, 6, 247, 207, 13, 27, 187, 6, 240, 231, - 13, 27, 187, 6, 69, 13, 27, 187, 6, 236, 49, 13, 27, 187, 6, 234, 190, - 13, 27, 187, 6, 233, 15, 13, 27, 187, 6, 68, 13, 27, 187, 6, 225, 217, - 13, 27, 187, 6, 225, 80, 13, 27, 187, 6, 159, 13, 27, 187, 6, 221, 136, - 13, 27, 187, 6, 218, 55, 13, 27, 187, 6, 72, 13, 27, 187, 6, 214, 3, 13, - 27, 187, 6, 211, 167, 13, 27, 187, 6, 144, 13, 27, 187, 6, 209, 80, 13, - 27, 187, 6, 203, 216, 13, 27, 187, 6, 66, 13, 27, 187, 6, 199, 230, 13, - 27, 187, 6, 197, 199, 13, 27, 187, 6, 196, 222, 13, 27, 187, 6, 196, 148, - 13, 27, 187, 6, 195, 158, 13, 27, 187, 4, 63, 13, 27, 187, 4, 250, 112, - 13, 27, 187, 4, 247, 207, 13, 27, 187, 4, 240, 231, 13, 27, 187, 4, 69, - 13, 27, 187, 4, 236, 49, 13, 27, 187, 4, 234, 190, 13, 27, 187, 4, 233, - 15, 13, 27, 187, 4, 68, 13, 27, 187, 4, 225, 217, 13, 27, 187, 4, 225, - 80, 13, 27, 187, 4, 159, 13, 27, 187, 4, 221, 136, 13, 27, 187, 4, 218, - 55, 13, 27, 187, 4, 72, 13, 27, 187, 4, 214, 3, 13, 27, 187, 4, 211, 167, - 13, 27, 187, 4, 144, 13, 27, 187, 4, 209, 80, 13, 27, 187, 4, 203, 216, - 13, 27, 187, 4, 66, 13, 27, 187, 4, 199, 230, 13, 27, 187, 4, 197, 199, - 13, 27, 187, 4, 196, 222, 13, 27, 187, 4, 196, 148, 13, 27, 187, 4, 195, - 158, 13, 45, 6, 63, 13, 45, 6, 250, 112, 13, 45, 6, 247, 207, 13, 45, 6, - 240, 231, 13, 45, 6, 69, 13, 45, 6, 236, 49, 13, 45, 6, 234, 190, 13, 45, - 6, 233, 15, 13, 45, 6, 68, 13, 45, 6, 225, 217, 13, 45, 6, 225, 80, 13, - 45, 6, 159, 13, 45, 6, 221, 136, 13, 45, 6, 218, 55, 13, 45, 6, 72, 13, - 45, 6, 214, 3, 13, 45, 6, 211, 167, 13, 45, 6, 144, 13, 45, 6, 209, 80, - 13, 45, 6, 203, 216, 13, 45, 6, 66, 13, 45, 6, 199, 230, 13, 45, 6, 197, - 199, 13, 45, 6, 196, 222, 13, 45, 6, 196, 148, 13, 45, 6, 195, 158, 13, - 45, 4, 63, 13, 45, 4, 250, 112, 13, 45, 4, 247, 207, 13, 45, 4, 240, 231, - 13, 45, 4, 69, 13, 45, 4, 236, 49, 13, 45, 4, 234, 190, 13, 45, 4, 233, - 15, 13, 45, 4, 68, 13, 45, 4, 225, 217, 13, 45, 4, 225, 80, 13, 45, 4, - 159, 13, 45, 4, 221, 136, 13, 45, 4, 218, 55, 13, 45, 4, 72, 13, 45, 4, - 214, 3, 13, 45, 4, 211, 167, 13, 45, 4, 144, 13, 45, 4, 209, 80, 13, 45, - 4, 203, 216, 13, 45, 4, 66, 13, 45, 4, 199, 230, 13, 45, 4, 197, 199, 13, - 45, 4, 196, 222, 13, 45, 4, 196, 148, 13, 45, 4, 195, 158, 13, 45, 27, 6, - 63, 13, 45, 27, 6, 250, 112, 13, 45, 27, 6, 247, 207, 13, 45, 27, 6, 240, - 231, 13, 45, 27, 6, 69, 13, 45, 27, 6, 236, 49, 13, 45, 27, 6, 234, 190, - 13, 45, 27, 6, 233, 15, 13, 45, 27, 6, 68, 13, 45, 27, 6, 225, 217, 13, - 45, 27, 6, 225, 80, 13, 45, 27, 6, 159, 13, 45, 27, 6, 221, 136, 13, 45, - 27, 6, 218, 55, 13, 45, 27, 6, 72, 13, 45, 27, 6, 214, 3, 13, 45, 27, 6, - 211, 167, 13, 45, 27, 6, 144, 13, 45, 27, 6, 209, 80, 13, 45, 27, 6, 203, - 216, 13, 45, 27, 6, 66, 13, 45, 27, 6, 199, 230, 13, 45, 27, 6, 197, 199, - 13, 45, 27, 6, 196, 222, 13, 45, 27, 6, 196, 148, 13, 45, 27, 6, 195, - 158, 13, 45, 27, 4, 63, 13, 45, 27, 4, 250, 112, 13, 45, 27, 4, 247, 207, - 13, 45, 27, 4, 240, 231, 13, 45, 27, 4, 69, 13, 45, 27, 4, 236, 49, 13, - 45, 27, 4, 234, 190, 13, 45, 27, 4, 233, 15, 13, 45, 27, 4, 68, 13, 45, - 27, 4, 225, 217, 13, 45, 27, 4, 225, 80, 13, 45, 27, 4, 159, 13, 45, 27, - 4, 221, 136, 13, 45, 27, 4, 218, 55, 13, 45, 27, 4, 72, 13, 45, 27, 4, - 214, 3, 13, 45, 27, 4, 211, 167, 13, 45, 27, 4, 144, 13, 45, 27, 4, 209, - 80, 13, 45, 27, 4, 203, 216, 13, 45, 27, 4, 66, 13, 45, 27, 4, 199, 230, - 13, 45, 27, 4, 197, 199, 13, 45, 27, 4, 196, 222, 13, 45, 27, 4, 196, - 148, 13, 45, 27, 4, 195, 158, 13, 45, 41, 6, 63, 13, 45, 41, 6, 250, 112, - 13, 45, 41, 6, 247, 207, 13, 45, 41, 6, 240, 231, 13, 45, 41, 6, 69, 13, - 45, 41, 6, 236, 49, 13, 45, 41, 6, 234, 190, 13, 45, 41, 6, 233, 15, 13, - 45, 41, 6, 68, 13, 45, 41, 6, 225, 217, 13, 45, 41, 6, 225, 80, 13, 45, - 41, 6, 159, 13, 45, 41, 6, 221, 136, 13, 45, 41, 6, 218, 55, 13, 45, 41, - 6, 72, 13, 45, 41, 6, 214, 3, 13, 45, 41, 6, 211, 167, 13, 45, 41, 6, - 144, 13, 45, 41, 6, 209, 80, 13, 45, 41, 6, 203, 216, 13, 45, 41, 6, 66, - 13, 45, 41, 6, 199, 230, 13, 45, 41, 6, 197, 199, 13, 45, 41, 6, 196, - 222, 13, 45, 41, 6, 196, 148, 13, 45, 41, 6, 195, 158, 13, 45, 41, 4, 63, - 13, 45, 41, 4, 250, 112, 13, 45, 41, 4, 247, 207, 13, 45, 41, 4, 240, - 231, 13, 45, 41, 4, 69, 13, 45, 41, 4, 236, 49, 13, 45, 41, 4, 234, 190, - 13, 45, 41, 4, 233, 15, 13, 45, 41, 4, 68, 13, 45, 41, 4, 225, 217, 13, - 45, 41, 4, 225, 80, 13, 45, 41, 4, 159, 13, 45, 41, 4, 221, 136, 13, 45, - 41, 4, 218, 55, 13, 45, 41, 4, 72, 13, 45, 41, 4, 214, 3, 13, 45, 41, 4, - 211, 167, 13, 45, 41, 4, 144, 13, 45, 41, 4, 209, 80, 13, 45, 41, 4, 203, - 216, 13, 45, 41, 4, 66, 13, 45, 41, 4, 199, 230, 13, 45, 41, 4, 197, 199, - 13, 45, 41, 4, 196, 222, 13, 45, 41, 4, 196, 148, 13, 45, 41, 4, 195, - 158, 13, 45, 27, 41, 6, 63, 13, 45, 27, 41, 6, 250, 112, 13, 45, 27, 41, - 6, 247, 207, 13, 45, 27, 41, 6, 240, 231, 13, 45, 27, 41, 6, 69, 13, 45, - 27, 41, 6, 236, 49, 13, 45, 27, 41, 6, 234, 190, 13, 45, 27, 41, 6, 233, - 15, 13, 45, 27, 41, 6, 68, 13, 45, 27, 41, 6, 225, 217, 13, 45, 27, 41, - 6, 225, 80, 13, 45, 27, 41, 6, 159, 13, 45, 27, 41, 6, 221, 136, 13, 45, - 27, 41, 6, 218, 55, 13, 45, 27, 41, 6, 72, 13, 45, 27, 41, 6, 214, 3, 13, - 45, 27, 41, 6, 211, 167, 13, 45, 27, 41, 6, 144, 13, 45, 27, 41, 6, 209, - 80, 13, 45, 27, 41, 6, 203, 216, 13, 45, 27, 41, 6, 66, 13, 45, 27, 41, - 6, 199, 230, 13, 45, 27, 41, 6, 197, 199, 13, 45, 27, 41, 6, 196, 222, - 13, 45, 27, 41, 6, 196, 148, 13, 45, 27, 41, 6, 195, 158, 13, 45, 27, 41, - 4, 63, 13, 45, 27, 41, 4, 250, 112, 13, 45, 27, 41, 4, 247, 207, 13, 45, - 27, 41, 4, 240, 231, 13, 45, 27, 41, 4, 69, 13, 45, 27, 41, 4, 236, 49, - 13, 45, 27, 41, 4, 234, 190, 13, 45, 27, 41, 4, 233, 15, 13, 45, 27, 41, - 4, 68, 13, 45, 27, 41, 4, 225, 217, 13, 45, 27, 41, 4, 225, 80, 13, 45, - 27, 41, 4, 159, 13, 45, 27, 41, 4, 221, 136, 13, 45, 27, 41, 4, 218, 55, - 13, 45, 27, 41, 4, 72, 13, 45, 27, 41, 4, 214, 3, 13, 45, 27, 41, 4, 211, - 167, 13, 45, 27, 41, 4, 144, 13, 45, 27, 41, 4, 209, 80, 13, 45, 27, 41, - 4, 203, 216, 13, 45, 27, 41, 4, 66, 13, 45, 27, 41, 4, 199, 230, 13, 45, - 27, 41, 4, 197, 199, 13, 45, 27, 41, 4, 196, 222, 13, 45, 27, 41, 4, 196, - 148, 13, 45, 27, 41, 4, 195, 158, 13, 218, 201, 6, 63, 13, 218, 201, 6, - 250, 112, 13, 218, 201, 6, 247, 207, 13, 218, 201, 6, 240, 231, 13, 218, - 201, 6, 69, 13, 218, 201, 6, 236, 49, 13, 218, 201, 6, 234, 190, 13, 218, - 201, 6, 233, 15, 13, 218, 201, 6, 68, 13, 218, 201, 6, 225, 217, 13, 218, - 201, 6, 225, 80, 13, 218, 201, 6, 159, 13, 218, 201, 6, 221, 136, 13, - 218, 201, 6, 218, 55, 13, 218, 201, 6, 72, 13, 218, 201, 6, 214, 3, 13, - 218, 201, 6, 211, 167, 13, 218, 201, 6, 144, 13, 218, 201, 6, 209, 80, - 13, 218, 201, 6, 203, 216, 13, 218, 201, 6, 66, 13, 218, 201, 6, 199, - 230, 13, 218, 201, 6, 197, 199, 13, 218, 201, 6, 196, 222, 13, 218, 201, - 6, 196, 148, 13, 218, 201, 6, 195, 158, 13, 218, 201, 4, 63, 13, 218, - 201, 4, 250, 112, 13, 218, 201, 4, 247, 207, 13, 218, 201, 4, 240, 231, - 13, 218, 201, 4, 69, 13, 218, 201, 4, 236, 49, 13, 218, 201, 4, 234, 190, - 13, 218, 201, 4, 233, 15, 13, 218, 201, 4, 68, 13, 218, 201, 4, 225, 217, - 13, 218, 201, 4, 225, 80, 13, 218, 201, 4, 159, 13, 218, 201, 4, 221, - 136, 13, 218, 201, 4, 218, 55, 13, 218, 201, 4, 72, 13, 218, 201, 4, 214, - 3, 13, 218, 201, 4, 211, 167, 13, 218, 201, 4, 144, 13, 218, 201, 4, 209, - 80, 13, 218, 201, 4, 203, 216, 13, 218, 201, 4, 66, 13, 218, 201, 4, 199, - 230, 13, 218, 201, 4, 197, 199, 13, 218, 201, 4, 196, 222, 13, 218, 201, - 4, 196, 148, 13, 218, 201, 4, 195, 158, 13, 41, 4, 238, 252, 68, 13, 41, - 4, 238, 252, 225, 217, 13, 27, 6, 251, 134, 13, 27, 6, 248, 206, 13, 27, - 6, 234, 94, 13, 27, 6, 239, 212, 13, 27, 6, 236, 174, 13, 27, 6, 195, 78, - 13, 27, 6, 236, 126, 13, 27, 6, 202, 199, 13, 27, 6, 226, 7, 13, 27, 6, - 225, 2, 13, 27, 6, 222, 245, 13, 27, 6, 218, 145, 13, 27, 6, 215, 186, - 13, 27, 6, 196, 196, 13, 27, 6, 214, 122, 13, 27, 6, 212, 220, 13, 27, 6, - 210, 74, 13, 27, 6, 202, 200, 105, 13, 27, 6, 206, 86, 13, 27, 6, 203, - 89, 13, 27, 6, 200, 28, 13, 27, 6, 212, 246, 13, 27, 6, 245, 75, 13, 27, - 6, 211, 238, 13, 27, 6, 214, 124, 13, 27, 217, 239, 13, 27, 4, 251, 134, - 13, 27, 4, 248, 206, 13, 27, 4, 234, 94, 13, 27, 4, 239, 212, 13, 27, 4, - 236, 174, 13, 27, 4, 195, 78, 13, 27, 4, 236, 126, 13, 27, 4, 202, 199, - 13, 27, 4, 226, 7, 13, 27, 4, 225, 2, 13, 27, 4, 222, 245, 13, 27, 4, - 218, 145, 13, 27, 4, 215, 186, 13, 27, 4, 196, 196, 13, 27, 4, 214, 122, - 13, 27, 4, 212, 220, 13, 27, 4, 210, 74, 13, 27, 4, 48, 206, 86, 13, 27, - 4, 206, 86, 13, 27, 4, 203, 89, 13, 27, 4, 200, 28, 13, 27, 4, 212, 246, - 13, 27, 4, 245, 75, 13, 27, 4, 211, 238, 13, 27, 4, 214, 124, 13, 27, - 213, 132, 239, 124, 13, 27, 236, 175, 105, 13, 27, 202, 200, 105, 13, 27, - 225, 3, 105, 13, 27, 212, 247, 105, 13, 27, 210, 75, 105, 13, 27, 212, - 221, 105, 13, 41, 6, 251, 134, 13, 41, 6, 248, 206, 13, 41, 6, 234, 94, - 13, 41, 6, 239, 212, 13, 41, 6, 236, 174, 13, 41, 6, 195, 78, 13, 41, 6, - 236, 126, 13, 41, 6, 202, 199, 13, 41, 6, 226, 7, 13, 41, 6, 225, 2, 13, - 41, 6, 222, 245, 13, 41, 6, 218, 145, 13, 41, 6, 215, 186, 13, 41, 6, - 196, 196, 13, 41, 6, 214, 122, 13, 41, 6, 212, 220, 13, 41, 6, 210, 74, - 13, 41, 6, 202, 200, 105, 13, 41, 6, 206, 86, 13, 41, 6, 203, 89, 13, 41, - 6, 200, 28, 13, 41, 6, 212, 246, 13, 41, 6, 245, 75, 13, 41, 6, 211, 238, - 13, 41, 6, 214, 124, 13, 41, 217, 239, 13, 41, 4, 251, 134, 13, 41, 4, - 248, 206, 13, 41, 4, 234, 94, 13, 41, 4, 239, 212, 13, 41, 4, 236, 174, - 13, 41, 4, 195, 78, 13, 41, 4, 236, 126, 13, 41, 4, 202, 199, 13, 41, 4, - 226, 7, 13, 41, 4, 225, 2, 13, 41, 4, 222, 245, 13, 41, 4, 218, 145, 13, - 41, 4, 215, 186, 13, 41, 4, 196, 196, 13, 41, 4, 214, 122, 13, 41, 4, - 212, 220, 13, 41, 4, 210, 74, 13, 41, 4, 48, 206, 86, 13, 41, 4, 206, 86, - 13, 41, 4, 203, 89, 13, 41, 4, 200, 28, 13, 41, 4, 212, 246, 13, 41, 4, - 245, 75, 13, 41, 4, 211, 238, 13, 41, 4, 214, 124, 13, 41, 213, 132, 239, - 124, 13, 41, 236, 175, 105, 13, 41, 202, 200, 105, 13, 41, 225, 3, 105, - 13, 41, 212, 247, 105, 13, 41, 210, 75, 105, 13, 41, 212, 221, 105, 13, - 27, 41, 6, 251, 134, 13, 27, 41, 6, 248, 206, 13, 27, 41, 6, 234, 94, 13, - 27, 41, 6, 239, 212, 13, 27, 41, 6, 236, 174, 13, 27, 41, 6, 195, 78, 13, - 27, 41, 6, 236, 126, 13, 27, 41, 6, 202, 199, 13, 27, 41, 6, 226, 7, 13, - 27, 41, 6, 225, 2, 13, 27, 41, 6, 222, 245, 13, 27, 41, 6, 218, 145, 13, - 27, 41, 6, 215, 186, 13, 27, 41, 6, 196, 196, 13, 27, 41, 6, 214, 122, - 13, 27, 41, 6, 212, 220, 13, 27, 41, 6, 210, 74, 13, 27, 41, 6, 202, 200, - 105, 13, 27, 41, 6, 206, 86, 13, 27, 41, 6, 203, 89, 13, 27, 41, 6, 200, - 28, 13, 27, 41, 6, 212, 246, 13, 27, 41, 6, 245, 75, 13, 27, 41, 6, 211, - 238, 13, 27, 41, 6, 214, 124, 13, 27, 41, 217, 239, 13, 27, 41, 4, 251, - 134, 13, 27, 41, 4, 248, 206, 13, 27, 41, 4, 234, 94, 13, 27, 41, 4, 239, - 212, 13, 27, 41, 4, 236, 174, 13, 27, 41, 4, 195, 78, 13, 27, 41, 4, 236, - 126, 13, 27, 41, 4, 202, 199, 13, 27, 41, 4, 226, 7, 13, 27, 41, 4, 225, - 2, 13, 27, 41, 4, 222, 245, 13, 27, 41, 4, 218, 145, 13, 27, 41, 4, 215, - 186, 13, 27, 41, 4, 196, 196, 13, 27, 41, 4, 214, 122, 13, 27, 41, 4, - 212, 220, 13, 27, 41, 4, 210, 74, 13, 27, 41, 4, 48, 206, 86, 13, 27, 41, - 4, 206, 86, 13, 27, 41, 4, 203, 89, 13, 27, 41, 4, 200, 28, 13, 27, 41, - 4, 212, 246, 13, 27, 41, 4, 245, 75, 13, 27, 41, 4, 211, 238, 13, 27, 41, - 4, 214, 124, 13, 27, 41, 213, 132, 239, 124, 13, 27, 41, 236, 175, 105, - 13, 27, 41, 202, 200, 105, 13, 27, 41, 225, 3, 105, 13, 27, 41, 212, 247, - 105, 13, 27, 41, 210, 75, 105, 13, 27, 41, 212, 221, 105, 13, 45, 27, 6, - 251, 134, 13, 45, 27, 6, 248, 206, 13, 45, 27, 6, 234, 94, 13, 45, 27, 6, - 239, 212, 13, 45, 27, 6, 236, 174, 13, 45, 27, 6, 195, 78, 13, 45, 27, 6, - 236, 126, 13, 45, 27, 6, 202, 199, 13, 45, 27, 6, 226, 7, 13, 45, 27, 6, - 225, 2, 13, 45, 27, 6, 222, 245, 13, 45, 27, 6, 218, 145, 13, 45, 27, 6, - 215, 186, 13, 45, 27, 6, 196, 196, 13, 45, 27, 6, 214, 122, 13, 45, 27, - 6, 212, 220, 13, 45, 27, 6, 210, 74, 13, 45, 27, 6, 202, 200, 105, 13, - 45, 27, 6, 206, 86, 13, 45, 27, 6, 203, 89, 13, 45, 27, 6, 200, 28, 13, - 45, 27, 6, 212, 246, 13, 45, 27, 6, 245, 75, 13, 45, 27, 6, 211, 238, 13, - 45, 27, 6, 214, 124, 13, 45, 27, 217, 239, 13, 45, 27, 4, 251, 134, 13, - 45, 27, 4, 248, 206, 13, 45, 27, 4, 234, 94, 13, 45, 27, 4, 239, 212, 13, - 45, 27, 4, 236, 174, 13, 45, 27, 4, 195, 78, 13, 45, 27, 4, 236, 126, 13, - 45, 27, 4, 202, 199, 13, 45, 27, 4, 226, 7, 13, 45, 27, 4, 225, 2, 13, - 45, 27, 4, 222, 245, 13, 45, 27, 4, 218, 145, 13, 45, 27, 4, 215, 186, - 13, 45, 27, 4, 196, 196, 13, 45, 27, 4, 214, 122, 13, 45, 27, 4, 212, - 220, 13, 45, 27, 4, 210, 74, 13, 45, 27, 4, 48, 206, 86, 13, 45, 27, 4, - 206, 86, 13, 45, 27, 4, 203, 89, 13, 45, 27, 4, 200, 28, 13, 45, 27, 4, - 212, 246, 13, 45, 27, 4, 245, 75, 13, 45, 27, 4, 211, 238, 13, 45, 27, 4, - 214, 124, 13, 45, 27, 213, 132, 239, 124, 13, 45, 27, 236, 175, 105, 13, - 45, 27, 202, 200, 105, 13, 45, 27, 225, 3, 105, 13, 45, 27, 212, 247, - 105, 13, 45, 27, 210, 75, 105, 13, 45, 27, 212, 221, 105, 13, 45, 27, 41, - 6, 251, 134, 13, 45, 27, 41, 6, 248, 206, 13, 45, 27, 41, 6, 234, 94, 13, - 45, 27, 41, 6, 239, 212, 13, 45, 27, 41, 6, 236, 174, 13, 45, 27, 41, 6, - 195, 78, 13, 45, 27, 41, 6, 236, 126, 13, 45, 27, 41, 6, 202, 199, 13, - 45, 27, 41, 6, 226, 7, 13, 45, 27, 41, 6, 225, 2, 13, 45, 27, 41, 6, 222, - 245, 13, 45, 27, 41, 6, 218, 145, 13, 45, 27, 41, 6, 215, 186, 13, 45, - 27, 41, 6, 196, 196, 13, 45, 27, 41, 6, 214, 122, 13, 45, 27, 41, 6, 212, - 220, 13, 45, 27, 41, 6, 210, 74, 13, 45, 27, 41, 6, 202, 200, 105, 13, - 45, 27, 41, 6, 206, 86, 13, 45, 27, 41, 6, 203, 89, 13, 45, 27, 41, 6, - 200, 28, 13, 45, 27, 41, 6, 212, 246, 13, 45, 27, 41, 6, 245, 75, 13, 45, - 27, 41, 6, 211, 238, 13, 45, 27, 41, 6, 214, 124, 13, 45, 27, 41, 217, - 239, 13, 45, 27, 41, 4, 251, 134, 13, 45, 27, 41, 4, 248, 206, 13, 45, - 27, 41, 4, 234, 94, 13, 45, 27, 41, 4, 239, 212, 13, 45, 27, 41, 4, 236, - 174, 13, 45, 27, 41, 4, 195, 78, 13, 45, 27, 41, 4, 236, 126, 13, 45, 27, - 41, 4, 202, 199, 13, 45, 27, 41, 4, 226, 7, 13, 45, 27, 41, 4, 225, 2, - 13, 45, 27, 41, 4, 222, 245, 13, 45, 27, 41, 4, 218, 145, 13, 45, 27, 41, - 4, 215, 186, 13, 45, 27, 41, 4, 196, 196, 13, 45, 27, 41, 4, 214, 122, - 13, 45, 27, 41, 4, 212, 220, 13, 45, 27, 41, 4, 210, 74, 13, 45, 27, 41, - 4, 48, 206, 86, 13, 45, 27, 41, 4, 206, 86, 13, 45, 27, 41, 4, 203, 89, - 13, 45, 27, 41, 4, 200, 28, 13, 45, 27, 41, 4, 212, 246, 13, 45, 27, 41, - 4, 245, 75, 13, 45, 27, 41, 4, 211, 238, 13, 45, 27, 41, 4, 214, 124, 13, - 45, 27, 41, 213, 132, 239, 124, 13, 45, 27, 41, 236, 175, 105, 13, 45, - 27, 41, 202, 200, 105, 13, 45, 27, 41, 225, 3, 105, 13, 45, 27, 41, 212, - 247, 105, 13, 45, 27, 41, 210, 75, 105, 13, 45, 27, 41, 212, 221, 105, - 13, 27, 6, 239, 118, 13, 27, 4, 239, 118, 13, 27, 17, 195, 79, 13, 27, - 17, 100, 13, 27, 17, 102, 13, 27, 17, 134, 13, 27, 17, 136, 13, 27, 17, - 146, 13, 27, 17, 167, 13, 27, 17, 178, 13, 27, 17, 171, 13, 27, 17, 182, - 13, 237, 241, 17, 195, 79, 13, 237, 241, 17, 100, 13, 237, 241, 17, 102, - 13, 237, 241, 17, 134, 13, 237, 241, 17, 136, 13, 237, 241, 17, 146, 13, - 237, 241, 17, 167, 13, 237, 241, 17, 178, 13, 237, 241, 17, 171, 13, 237, - 241, 17, 182, 13, 45, 17, 195, 79, 13, 45, 17, 100, 13, 45, 17, 102, 13, - 45, 17, 134, 13, 45, 17, 136, 13, 45, 17, 146, 13, 45, 17, 167, 13, 45, - 17, 178, 13, 45, 17, 171, 13, 45, 17, 182, 13, 45, 27, 17, 195, 79, 13, - 45, 27, 17, 100, 13, 45, 27, 17, 102, 13, 45, 27, 17, 134, 13, 45, 27, - 17, 136, 13, 45, 27, 17, 146, 13, 45, 27, 17, 167, 13, 45, 27, 17, 178, - 13, 45, 27, 17, 171, 13, 45, 27, 17, 182, 13, 218, 201, 17, 195, 79, 13, - 218, 201, 17, 100, 13, 218, 201, 17, 102, 13, 218, 201, 17, 134, 13, 218, - 201, 17, 136, 13, 218, 201, 17, 146, 13, 218, 201, 17, 167, 13, 218, 201, - 17, 178, 13, 218, 201, 17, 171, 13, 218, 201, 17, 182, 23, 139, 226, 72, - 23, 232, 206, 226, 72, 23, 232, 202, 226, 72, 23, 232, 191, 226, 72, 23, - 232, 195, 226, 72, 23, 232, 208, 226, 72, 23, 139, 132, 248, 217, 23, - 232, 206, 132, 248, 217, 23, 139, 162, 200, 64, 132, 248, 217, 23, 139, - 132, 210, 215, 224, 14, 23, 139, 132, 241, 23, 23, 139, 132, 232, 37, 23, - 139, 132, 232, 38, 221, 208, 23, 232, 206, 132, 232, 39, 23, 139, 132, - 219, 63, 23, 232, 206, 132, 219, 63, 23, 139, 132, 112, 248, 217, 23, - 139, 132, 112, 210, 215, 224, 13, 23, 139, 132, 112, 232, 37, 23, 139, - 132, 124, 112, 232, 37, 23, 139, 132, 232, 38, 112, 200, 36, 23, 139, - 132, 112, 241, 144, 23, 139, 132, 112, 241, 145, 132, 248, 217, 23, 139, - 132, 112, 241, 145, 112, 248, 217, 23, 139, 132, 112, 241, 145, 241, 23, - 23, 139, 132, 112, 241, 145, 232, 37, 23, 139, 132, 112, 241, 58, 23, - 232, 206, 132, 112, 241, 58, 23, 139, 112, 248, 218, 127, 226, 72, 23, - 139, 132, 248, 218, 127, 219, 63, 23, 139, 132, 112, 202, 141, 23, 232, - 206, 132, 112, 202, 141, 23, 139, 132, 112, 204, 218, 162, 248, 217, 23, - 139, 132, 112, 248, 218, 162, 204, 217, 23, 139, 132, 112, 162, 248, 217, - 23, 139, 132, 112, 232, 38, 205, 103, 162, 206, 97, 23, 139, 132, 124, - 112, 232, 38, 162, 206, 97, 23, 139, 132, 124, 112, 232, 38, 162, 241, - 144, 23, 139, 132, 232, 38, 112, 124, 162, 206, 97, 23, 139, 132, 112, - 124, 205, 103, 162, 235, 11, 23, 139, 132, 112, 162, 241, 23, 23, 139, - 132, 112, 162, 244, 248, 23, 139, 132, 112, 162, 231, 163, 23, 139, 132, - 112, 162, 232, 37, 23, 139, 162, 248, 204, 132, 112, 204, 217, 23, 139, - 132, 112, 241, 145, 162, 206, 97, 23, 139, 132, 112, 241, 145, 162, 206, - 98, 241, 144, 23, 139, 132, 112, 241, 145, 162, 206, 98, 248, 217, 23, - 139, 112, 162, 231, 164, 132, 200, 36, 23, 139, 132, 162, 231, 164, 112, - 200, 36, 23, 139, 132, 112, 241, 145, 232, 38, 162, 206, 97, 23, 139, - 132, 112, 241, 59, 162, 206, 97, 23, 139, 132, 112, 241, 145, 162, 235, - 11, 23, 139, 132, 112, 241, 145, 241, 24, 162, 235, 11, 23, 139, 112, - 162, 241, 24, 132, 200, 36, 23, 139, 132, 162, 241, 24, 112, 200, 36, 23, - 139, 112, 162, 46, 132, 200, 36, 23, 139, 112, 162, 46, 132, 232, 37, 23, - 139, 132, 162, 251, 89, 214, 35, 112, 200, 36, 23, 139, 132, 162, 251, - 89, 226, 87, 112, 200, 36, 23, 139, 132, 162, 46, 112, 200, 36, 23, 139, - 132, 112, 162, 241, 145, 232, 37, 23, 139, 132, 112, 162, 251, 89, 214, - 34, 23, 139, 132, 112, 162, 251, 88, 23, 139, 112, 162, 251, 89, 214, 35, - 132, 200, 36, 23, 139, 112, 162, 251, 89, 214, 35, 132, 241, 58, 23, 139, - 112, 162, 251, 89, 132, 200, 36, 23, 139, 132, 162, 231, 164, 112, 232, - 37, 23, 232, 197, 235, 7, 235, 122, 23, 232, 197, 235, 7, 235, 123, 248, - 217, 23, 232, 197, 235, 7, 235, 123, 232, 37, 23, 232, 197, 235, 7, 235, - 123, 241, 144, 23, 232, 197, 235, 7, 235, 123, 241, 145, 205, 112, 23, - 232, 204, 235, 7, 235, 123, 241, 144, 23, 139, 235, 7, 235, 123, 241, - 145, 248, 217, 23, 232, 195, 235, 7, 235, 123, 241, 144, 23, 232, 197, - 235, 101, 235, 123, 205, 102, 23, 232, 197, 232, 116, 235, 101, 235, 123, - 205, 102, 23, 232, 197, 235, 101, 235, 123, 205, 103, 235, 7, 248, 217, - 23, 232, 197, 232, 116, 235, 101, 235, 123, 205, 103, 235, 7, 248, 217, - 23, 232, 197, 235, 101, 235, 123, 205, 103, 248, 217, 23, 232, 197, 232, - 116, 235, 101, 235, 123, 205, 103, 248, 217, 23, 232, 197, 235, 101, 235, - 123, 205, 103, 162, 235, 11, 23, 232, 202, 235, 101, 235, 123, 205, 102, - 23, 232, 202, 235, 101, 235, 123, 205, 103, 214, 92, 23, 232, 195, 235, - 101, 235, 123, 205, 103, 214, 92, 23, 232, 191, 235, 101, 235, 123, 205, - 102, 23, 232, 197, 235, 101, 235, 123, 205, 103, 232, 37, 23, 232, 197, - 235, 101, 235, 123, 205, 103, 232, 38, 162, 206, 97, 23, 232, 197, 235, - 101, 235, 123, 205, 103, 232, 38, 216, 51, 202, 141, 23, 232, 196, 23, - 232, 197, 248, 204, 213, 207, 235, 225, 23, 232, 197, 232, 115, 23, 232, - 197, 162, 206, 97, 23, 232, 197, 232, 116, 162, 206, 97, 23, 232, 197, - 162, 248, 217, 23, 232, 197, 162, 235, 11, 23, 232, 197, 205, 113, 132, - 162, 206, 97, 23, 232, 197, 205, 113, 247, 36, 23, 232, 197, 205, 113, - 247, 37, 162, 206, 97, 23, 232, 197, 205, 113, 247, 37, 162, 206, 98, - 248, 217, 23, 232, 197, 205, 113, 222, 46, 23, 232, 203, 23, 232, 204, - 162, 206, 97, 23, 232, 204, 216, 51, 202, 141, 23, 232, 204, 162, 235, - 11, 23, 232, 193, 241, 20, 23, 232, 192, 23, 232, 202, 214, 92, 23, 232, - 201, 23, 232, 202, 192, 162, 206, 97, 23, 232, 202, 162, 206, 97, 23, - 232, 202, 192, 216, 51, 202, 141, 23, 232, 202, 216, 51, 202, 141, 23, - 232, 202, 192, 162, 235, 11, 23, 232, 202, 162, 235, 11, 23, 232, 200, - 214, 92, 23, 232, 199, 23, 232, 205, 23, 232, 190, 23, 232, 191, 162, - 206, 97, 23, 232, 191, 216, 51, 202, 141, 23, 232, 191, 162, 235, 11, 23, - 232, 195, 214, 92, 23, 232, 195, 192, 162, 235, 11, 23, 232, 194, 23, - 232, 195, 205, 224, 23, 232, 195, 192, 162, 206, 97, 23, 232, 195, 162, - 206, 97, 23, 232, 195, 192, 216, 51, 202, 141, 23, 232, 195, 216, 51, - 202, 141, 23, 232, 195, 162, 206, 98, 201, 225, 226, 72, 23, 232, 195, - 162, 248, 204, 112, 210, 2, 23, 232, 207, 23, 139, 132, 112, 210, 2, 23, - 232, 206, 132, 112, 210, 2, 23, 232, 195, 132, 112, 210, 2, 23, 232, 208, - 132, 112, 210, 2, 23, 232, 195, 222, 46, 23, 139, 132, 112, 210, 3, 248, - 217, 23, 139, 132, 112, 210, 3, 241, 144, 23, 232, 195, 132, 112, 210, 3, - 241, 144, 23, 139, 222, 47, 237, 235, 23, 139, 222, 47, 135, 209, 253, - 204, 217, 23, 139, 222, 47, 135, 209, 253, 241, 9, 23, 139, 222, 47, 135, - 214, 45, 244, 248, 23, 139, 222, 47, 200, 36, 23, 139, 162, 200, 64, 222, - 47, 200, 36, 23, 232, 206, 222, 47, 200, 36, 23, 232, 191, 222, 47, 200, - 36, 23, 232, 208, 222, 47, 200, 36, 23, 139, 222, 47, 210, 215, 224, 14, - 23, 139, 222, 47, 248, 217, 23, 139, 222, 47, 201, 226, 202, 141, 23, - 139, 222, 47, 202, 141, 23, 232, 195, 222, 47, 202, 141, 23, 139, 222, - 47, 132, 202, 141, 23, 232, 195, 222, 47, 132, 202, 141, 23, 232, 208, - 222, 47, 132, 162, 132, 162, 214, 34, 23, 232, 208, 222, 47, 132, 162, - 132, 202, 141, 23, 139, 222, 47, 226, 72, 23, 232, 206, 222, 47, 226, 72, - 23, 232, 195, 222, 47, 226, 72, 23, 232, 208, 222, 47, 226, 72, 23, 139, - 132, 112, 222, 46, 23, 232, 206, 132, 112, 222, 46, 23, 232, 195, 132, - 112, 222, 46, 23, 232, 195, 210, 2, 23, 232, 208, 132, 112, 222, 46, 23, - 139, 132, 112, 241, 62, 222, 46, 23, 232, 206, 132, 112, 241, 62, 222, - 46, 23, 139, 210, 3, 237, 235, 23, 232, 195, 210, 3, 135, 132, 162, 231, - 165, 219, 63, 23, 232, 208, 210, 3, 135, 112, 162, 132, 241, 61, 23, 139, - 210, 3, 200, 36, 23, 139, 210, 3, 210, 215, 224, 14, 23, 139, 210, 3, - 222, 46, 23, 232, 206, 210, 3, 222, 46, 23, 232, 191, 210, 3, 222, 46, - 23, 232, 208, 210, 3, 222, 46, 23, 139, 210, 3, 219, 63, 23, 139, 210, 3, - 112, 241, 144, 23, 139, 210, 3, 112, 210, 215, 224, 13, 23, 139, 210, 3, - 226, 72, 23, 139, 210, 3, 202, 141, 23, 232, 193, 210, 3, 202, 141, 23, - 139, 132, 210, 3, 222, 46, 23, 232, 206, 132, 210, 3, 222, 46, 23, 232, - 200, 132, 210, 3, 222, 47, 214, 119, 23, 232, 193, 132, 210, 3, 222, 47, - 214, 34, 23, 232, 193, 132, 210, 3, 222, 47, 226, 86, 23, 232, 193, 132, - 210, 3, 222, 47, 200, 63, 23, 232, 202, 132, 210, 3, 222, 46, 23, 232, - 195, 132, 210, 3, 222, 46, 23, 232, 208, 132, 210, 3, 222, 47, 214, 34, - 23, 232, 208, 132, 210, 3, 222, 46, 23, 139, 112, 237, 235, 23, 232, 195, - 219, 63, 23, 139, 112, 200, 36, 23, 232, 206, 112, 200, 36, 23, 139, 112, - 210, 215, 224, 14, 23, 139, 112, 124, 162, 206, 97, 23, 232, 193, 112, - 202, 141, 23, 139, 112, 162, 222, 46, 23, 139, 112, 222, 46, 23, 139, - 112, 210, 3, 222, 46, 23, 232, 206, 112, 210, 3, 222, 46, 23, 232, 200, - 112, 210, 3, 222, 47, 214, 119, 23, 232, 202, 112, 210, 3, 222, 46, 23, - 232, 195, 112, 210, 3, 222, 46, 23, 232, 208, 112, 210, 3, 222, 47, 214, - 34, 23, 232, 208, 112, 210, 3, 222, 47, 226, 86, 23, 232, 208, 112, 210, - 3, 222, 46, 23, 232, 206, 112, 210, 3, 222, 47, 248, 217, 23, 232, 204, - 112, 210, 3, 222, 47, 241, 144, 23, 232, 204, 112, 210, 3, 222, 47, 241, - 145, 206, 97, 23, 232, 193, 112, 210, 3, 222, 47, 241, 145, 214, 34, 23, - 232, 193, 112, 210, 3, 222, 47, 241, 145, 226, 86, 23, 232, 193, 112, - 210, 3, 222, 47, 241, 144, 23, 232, 195, 132, 232, 37, 23, 139, 132, 162, - 206, 97, 23, 232, 195, 132, 162, 206, 97, 23, 139, 132, 162, 206, 98, - 162, 239, 146, 23, 139, 132, 162, 206, 98, 162, 241, 144, 23, 139, 132, - 162, 206, 98, 162, 248, 217, 23, 139, 132, 162, 206, 98, 132, 248, 217, - 23, 139, 132, 162, 206, 98, 248, 88, 248, 217, 23, 139, 132, 162, 206, - 98, 132, 232, 39, 23, 139, 132, 162, 235, 12, 132, 204, 217, 23, 139, - 132, 162, 235, 12, 132, 248, 217, 23, 139, 132, 162, 122, 23, 139, 132, - 162, 241, 20, 23, 139, 132, 162, 241, 12, 162, 226, 41, 23, 232, 204, - 132, 162, 241, 12, 162, 226, 41, 23, 139, 132, 162, 241, 12, 162, 200, - 63, 23, 139, 132, 162, 244, 249, 23, 232, 202, 132, 202, 141, 23, 232, - 202, 132, 162, 214, 92, 23, 232, 195, 132, 162, 214, 92, 23, 232, 195, - 132, 162, 222, 227, 23, 232, 195, 132, 202, 141, 23, 232, 195, 132, 162, - 205, 224, 23, 232, 208, 132, 162, 214, 34, 23, 232, 208, 132, 162, 226, - 86, 23, 232, 208, 132, 202, 141, 23, 139, 202, 141, 23, 139, 162, 232, - 115, 23, 139, 162, 206, 98, 239, 146, 23, 139, 162, 206, 98, 241, 144, - 23, 139, 162, 206, 98, 248, 217, 23, 139, 162, 235, 11, 23, 139, 162, - 248, 204, 132, 219, 63, 23, 139, 162, 248, 204, 112, 210, 2, 23, 139, - 162, 248, 204, 210, 3, 222, 46, 23, 139, 162, 200, 64, 99, 235, 122, 23, - 139, 162, 127, 99, 235, 122, 23, 139, 162, 200, 64, 115, 235, 122, 23, - 139, 162, 200, 64, 235, 7, 235, 122, 23, 139, 162, 127, 235, 7, 210, 215, - 224, 13, 23, 232, 198, 23, 139, 232, 115, 23, 201, 227, 206, 61, 23, 201, - 227, 218, 119, 23, 201, 227, 248, 203, 23, 233, 105, 206, 61, 23, 233, - 105, 218, 119, 23, 233, 105, 248, 203, 23, 204, 201, 206, 61, 23, 204, - 201, 218, 119, 23, 204, 201, 248, 203, 23, 248, 29, 206, 61, 23, 248, 29, - 218, 119, 23, 248, 29, 248, 203, 23, 209, 132, 206, 61, 23, 209, 132, - 218, 119, 23, 209, 132, 248, 203, 23, 204, 84, 203, 249, 23, 204, 84, - 248, 203, 23, 205, 90, 222, 228, 206, 61, 23, 205, 90, 4, 206, 61, 23, - 205, 90, 222, 228, 218, 119, 23, 205, 90, 4, 218, 119, 23, 205, 90, 207, - 86, 23, 235, 73, 222, 228, 206, 61, 23, 235, 73, 4, 206, 61, 23, 235, 73, - 222, 228, 218, 119, 23, 235, 73, 4, 218, 119, 23, 235, 73, 207, 86, 23, - 205, 90, 235, 73, 251, 128, 23, 218, 157, 124, 135, 222, 227, 23, 218, - 157, 124, 135, 205, 224, 23, 218, 157, 124, 207, 86, 23, 218, 157, 135, - 207, 86, 23, 218, 157, 124, 135, 251, 129, 222, 227, 23, 218, 157, 124, - 135, 251, 129, 205, 224, 23, 218, 157, 206, 98, 202, 30, 206, 98, 208, - 161, 23, 218, 156, 235, 128, 241, 134, 23, 218, 158, 235, 128, 241, 134, - 23, 218, 156, 206, 62, 204, 218, 205, 224, 23, 218, 156, 206, 62, 204, - 218, 219, 189, 23, 218, 156, 206, 62, 204, 218, 222, 227, 23, 218, 156, - 206, 62, 204, 218, 222, 225, 23, 218, 156, 206, 62, 196, 247, 235, 76, - 23, 218, 156, 52, 204, 217, 23, 218, 156, 52, 196, 247, 235, 76, 23, 218, - 156, 52, 251, 128, 23, 218, 156, 52, 251, 129, 196, 247, 235, 76, 23, - 218, 156, 241, 61, 23, 218, 156, 201, 165, 204, 218, 218, 160, 23, 218, - 156, 201, 165, 196, 247, 235, 76, 23, 218, 156, 201, 165, 251, 128, 23, - 218, 156, 201, 165, 251, 129, 196, 247, 235, 76, 23, 218, 156, 248, 222, - 205, 224, 23, 218, 156, 248, 222, 219, 189, 23, 218, 156, 248, 222, 222, - 227, 23, 218, 156, 241, 102, 205, 224, 23, 218, 156, 241, 102, 219, 189, - 23, 218, 156, 241, 102, 222, 227, 23, 218, 156, 241, 102, 209, 192, 23, - 218, 156, 245, 102, 205, 224, 23, 218, 156, 245, 102, 219, 189, 23, 218, - 156, 245, 102, 222, 227, 23, 218, 156, 111, 205, 224, 23, 218, 156, 111, - 219, 189, 23, 218, 156, 111, 222, 227, 23, 218, 156, 195, 24, 205, 224, - 23, 218, 156, 195, 24, 219, 189, 23, 218, 156, 195, 24, 222, 227, 23, - 218, 156, 213, 87, 205, 224, 23, 218, 156, 213, 87, 219, 189, 23, 218, - 156, 213, 87, 222, 227, 23, 201, 195, 209, 190, 206, 61, 23, 201, 195, - 209, 190, 237, 245, 23, 201, 195, 209, 190, 251, 128, 23, 201, 195, 209, - 191, 206, 61, 23, 201, 195, 209, 191, 237, 245, 23, 201, 195, 209, 191, - 251, 128, 23, 201, 195, 207, 30, 23, 201, 195, 250, 232, 205, 121, 206, - 61, 23, 201, 195, 250, 232, 205, 121, 237, 245, 23, 201, 195, 250, 232, - 205, 121, 201, 164, 23, 218, 159, 250, 126, 205, 224, 23, 218, 159, 250, - 126, 219, 189, 23, 218, 159, 250, 126, 222, 227, 23, 218, 159, 250, 126, - 222, 225, 23, 218, 159, 201, 221, 205, 224, 23, 218, 159, 201, 221, 219, - 189, 23, 218, 159, 201, 221, 222, 227, 23, 218, 159, 201, 221, 222, 225, - 23, 218, 159, 248, 204, 250, 126, 205, 224, 23, 218, 159, 248, 204, 250, - 126, 219, 189, 23, 218, 159, 248, 204, 250, 126, 222, 227, 23, 218, 159, - 248, 204, 250, 126, 222, 225, 23, 218, 159, 248, 204, 201, 221, 205, 224, - 23, 218, 159, 248, 204, 201, 221, 219, 189, 23, 218, 159, 248, 204, 201, - 221, 222, 227, 23, 218, 159, 248, 204, 201, 221, 222, 225, 23, 218, 158, - 206, 62, 204, 218, 205, 224, 23, 218, 158, 206, 62, 204, 218, 219, 189, - 23, 218, 158, 206, 62, 204, 218, 222, 227, 23, 218, 158, 206, 62, 204, - 218, 222, 225, 23, 218, 158, 206, 62, 196, 247, 235, 76, 23, 218, 158, - 52, 204, 217, 23, 218, 158, 52, 196, 247, 235, 76, 23, 218, 158, 52, 251, - 128, 23, 218, 158, 52, 251, 129, 196, 247, 235, 76, 23, 218, 158, 241, - 61, 23, 218, 158, 201, 165, 204, 218, 218, 160, 23, 218, 158, 201, 165, - 196, 247, 235, 76, 23, 218, 158, 201, 165, 251, 129, 218, 160, 23, 218, - 158, 201, 165, 251, 129, 196, 247, 235, 76, 23, 218, 158, 248, 221, 23, - 218, 158, 241, 102, 205, 224, 23, 218, 158, 241, 102, 219, 189, 23, 218, - 158, 241, 102, 222, 227, 23, 218, 158, 245, 101, 23, 218, 158, 111, 205, - 224, 23, 218, 158, 111, 219, 189, 23, 218, 158, 111, 222, 227, 23, 218, - 158, 195, 24, 205, 224, 23, 218, 158, 195, 24, 219, 189, 23, 218, 158, - 195, 24, 222, 227, 23, 218, 158, 213, 87, 205, 224, 23, 218, 158, 213, - 87, 219, 189, 23, 218, 158, 213, 87, 222, 227, 23, 201, 196, 209, 191, - 206, 61, 23, 201, 196, 209, 191, 237, 245, 23, 201, 196, 209, 191, 251, - 128, 23, 201, 196, 209, 190, 206, 61, 23, 201, 196, 209, 190, 237, 245, - 23, 201, 196, 209, 190, 251, 128, 23, 201, 196, 207, 30, 23, 218, 156, - 241, 12, 211, 88, 205, 224, 23, 218, 156, 241, 12, 211, 88, 219, 189, 23, - 218, 156, 241, 12, 211, 88, 222, 227, 23, 218, 156, 241, 12, 211, 88, - 222, 225, 23, 218, 156, 241, 12, 232, 222, 205, 224, 23, 218, 156, 241, - 12, 232, 222, 219, 189, 23, 218, 156, 241, 12, 232, 222, 222, 227, 23, - 218, 156, 241, 12, 232, 222, 222, 225, 23, 218, 156, 241, 12, 202, 147, - 244, 250, 205, 224, 23, 218, 156, 241, 12, 202, 147, 244, 250, 219, 189, - 23, 218, 156, 231, 60, 205, 224, 23, 218, 156, 231, 60, 219, 189, 23, - 218, 156, 231, 60, 222, 227, 23, 218, 156, 221, 226, 205, 224, 23, 218, - 156, 221, 226, 219, 189, 23, 218, 156, 221, 226, 222, 227, 23, 218, 156, - 221, 226, 4, 237, 245, 23, 218, 156, 197, 123, 241, 12, 52, 205, 224, 23, - 218, 156, 197, 123, 241, 12, 52, 219, 189, 23, 218, 156, 197, 123, 241, - 12, 52, 222, 227, 23, 218, 156, 197, 123, 241, 12, 201, 165, 205, 224, - 23, 218, 156, 197, 123, 241, 12, 201, 165, 219, 189, 23, 218, 156, 197, - 123, 241, 12, 201, 165, 222, 227, 23, 218, 156, 241, 12, 202, 209, 204, - 217, 23, 218, 156, 241, 10, 241, 62, 205, 224, 23, 218, 156, 241, 10, - 241, 62, 219, 189, 23, 209, 190, 206, 61, 23, 209, 190, 237, 245, 23, - 209, 190, 251, 130, 23, 218, 156, 207, 30, 23, 218, 156, 241, 12, 232, - 30, 234, 234, 197, 148, 23, 218, 156, 231, 60, 232, 30, 234, 234, 197, - 148, 23, 218, 156, 221, 226, 232, 30, 234, 234, 197, 148, 23, 218, 156, - 197, 123, 232, 30, 234, 234, 197, 148, 23, 209, 190, 206, 62, 232, 30, - 234, 234, 197, 148, 23, 209, 190, 52, 232, 30, 234, 234, 197, 148, 23, - 209, 190, 251, 129, 232, 30, 234, 234, 197, 148, 23, 218, 156, 241, 12, - 232, 30, 245, 82, 23, 218, 156, 231, 60, 232, 30, 245, 82, 23, 218, 156, - 221, 226, 232, 30, 245, 82, 23, 218, 156, 197, 123, 232, 30, 245, 82, 23, - 209, 190, 206, 62, 232, 30, 245, 82, 23, 209, 190, 52, 232, 30, 245, 82, - 23, 209, 190, 251, 129, 232, 30, 245, 82, 23, 218, 156, 197, 123, 239, - 147, 213, 113, 205, 224, 23, 218, 156, 197, 123, 239, 147, 213, 113, 219, - 189, 23, 218, 156, 197, 123, 239, 147, 213, 113, 222, 227, 23, 218, 158, - 241, 12, 232, 30, 247, 46, 205, 224, 23, 218, 158, 241, 12, 232, 30, 247, - 46, 222, 227, 23, 218, 158, 231, 60, 232, 30, 247, 46, 4, 237, 245, 23, - 218, 158, 231, 60, 232, 30, 247, 46, 222, 228, 237, 245, 23, 218, 158, - 231, 60, 232, 30, 247, 46, 4, 201, 164, 23, 218, 158, 231, 60, 232, 30, - 247, 46, 222, 228, 201, 164, 23, 218, 158, 221, 226, 232, 30, 247, 46, 4, - 206, 61, 23, 218, 158, 221, 226, 232, 30, 247, 46, 222, 228, 206, 61, 23, - 218, 158, 221, 226, 232, 30, 247, 46, 4, 237, 245, 23, 218, 158, 221, - 226, 232, 30, 247, 46, 222, 228, 237, 245, 23, 218, 158, 197, 123, 232, - 30, 247, 46, 205, 224, 23, 218, 158, 197, 123, 232, 30, 247, 46, 222, - 227, 23, 209, 191, 206, 62, 232, 30, 247, 45, 23, 209, 191, 52, 232, 30, - 247, 45, 23, 209, 191, 251, 129, 232, 30, 247, 45, 23, 218, 158, 241, 12, - 232, 30, 235, 70, 205, 224, 23, 218, 158, 241, 12, 232, 30, 235, 70, 222, - 227, 23, 218, 158, 231, 60, 232, 30, 235, 70, 4, 237, 245, 23, 218, 158, - 231, 60, 232, 30, 235, 70, 222, 228, 237, 245, 23, 218, 158, 231, 60, - 232, 30, 235, 70, 201, 165, 4, 201, 164, 23, 218, 158, 231, 60, 232, 30, - 235, 70, 201, 165, 222, 228, 201, 164, 23, 218, 158, 221, 226, 232, 30, - 235, 70, 4, 206, 61, 23, 218, 158, 221, 226, 232, 30, 235, 70, 222, 228, - 206, 61, 23, 218, 158, 221, 226, 232, 30, 235, 70, 4, 237, 245, 23, 218, - 158, 221, 226, 232, 30, 235, 70, 222, 228, 237, 245, 23, 218, 158, 197, - 123, 232, 30, 235, 70, 205, 224, 23, 218, 158, 197, 123, 232, 30, 235, - 70, 222, 227, 23, 209, 191, 206, 62, 232, 30, 235, 69, 23, 209, 191, 52, - 232, 30, 235, 69, 23, 209, 191, 251, 129, 232, 30, 235, 69, 23, 218, 158, - 241, 12, 205, 224, 23, 218, 158, 241, 12, 219, 189, 23, 218, 158, 241, - 12, 222, 227, 23, 218, 158, 241, 12, 222, 225, 23, 218, 158, 241, 12, - 244, 163, 23, 218, 158, 231, 60, 205, 224, 23, 218, 158, 221, 226, 205, - 224, 23, 218, 158, 197, 123, 205, 212, 23, 218, 158, 197, 123, 205, 224, - 23, 218, 158, 197, 123, 222, 227, 23, 209, 191, 206, 61, 23, 209, 191, - 237, 245, 23, 209, 191, 251, 128, 23, 218, 158, 207, 31, 213, 145, 23, - 218, 156, 250, 232, 244, 250, 4, 206, 61, 23, 218, 156, 250, 232, 244, - 250, 219, 190, 206, 61, 23, 218, 156, 250, 232, 244, 250, 4, 237, 245, - 23, 218, 156, 250, 232, 244, 250, 219, 190, 237, 245, 23, 218, 158, 250, - 232, 244, 250, 232, 30, 197, 149, 4, 206, 61, 23, 218, 158, 250, 232, - 244, 250, 232, 30, 197, 149, 219, 190, 206, 61, 23, 218, 158, 250, 232, - 244, 250, 232, 30, 197, 149, 222, 228, 206, 61, 23, 218, 158, 250, 232, - 244, 250, 232, 30, 197, 149, 4, 237, 245, 23, 218, 158, 250, 232, 244, - 250, 232, 30, 197, 149, 219, 190, 237, 245, 23, 218, 158, 250, 232, 244, - 250, 232, 30, 197, 149, 222, 228, 237, 245, 23, 218, 156, 196, 247, 244, - 250, 234, 234, 206, 61, 23, 218, 156, 196, 247, 244, 250, 234, 234, 237, - 245, 23, 218, 158, 196, 247, 244, 250, 232, 30, 197, 149, 206, 61, 23, - 218, 158, 196, 247, 244, 250, 232, 30, 197, 149, 237, 245, 23, 218, 156, - 235, 128, 244, 247, 206, 61, 23, 218, 156, 235, 128, 244, 247, 237, 245, - 23, 218, 158, 235, 128, 244, 247, 232, 30, 197, 149, 206, 61, 23, 218, - 158, 235, 128, 244, 247, 232, 30, 197, 149, 237, 245, 23, 237, 161, 250, - 218, 205, 224, 23, 237, 161, 250, 218, 222, 227, 23, 237, 161, 235, 203, - 23, 237, 161, 205, 227, 23, 237, 161, 203, 16, 23, 237, 161, 210, 134, - 23, 237, 161, 206, 67, 23, 237, 161, 206, 68, 251, 128, 23, 237, 161, - 236, 99, 214, 46, 202, 78, 23, 237, 161, 233, 115, 23, 232, 137, 23, 232, - 138, 210, 7, 23, 232, 138, 218, 156, 204, 217, 23, 232, 138, 218, 156, - 202, 81, 23, 232, 138, 218, 158, 204, 217, 23, 232, 138, 218, 156, 241, - 11, 23, 232, 138, 218, 158, 241, 11, 23, 232, 138, 218, 161, 244, 249, - 23, 235, 234, 239, 85, 212, 79, 216, 21, 235, 12, 202, 79, 23, 235, 234, - 239, 85, 212, 79, 216, 21, 124, 214, 73, 237, 235, 23, 235, 234, 239, 85, - 212, 79, 216, 21, 124, 214, 73, 135, 202, 79, 23, 236, 65, 204, 218, 200, - 36, 23, 236, 65, 204, 218, 217, 84, 23, 236, 65, 204, 218, 237, 235, 23, - 237, 219, 236, 65, 217, 85, 237, 235, 23, 237, 219, 236, 65, 135, 217, - 84, 23, 237, 219, 236, 65, 124, 217, 84, 23, 237, 219, 236, 65, 217, 85, - 200, 36, 23, 235, 29, 217, 84, 23, 235, 29, 241, 134, 23, 235, 29, 196, - 250, 23, 236, 60, 214, 92, 23, 236, 60, 205, 89, 23, 236, 60, 244, 202, - 23, 236, 68, 248, 127, 206, 61, 23, 236, 68, 248, 127, 218, 119, 23, 236, - 60, 157, 214, 92, 23, 236, 60, 197, 62, 214, 92, 23, 236, 60, 157, 244, - 202, 23, 236, 60, 197, 60, 218, 160, 23, 236, 68, 197, 43, 23, 236, 61, - 200, 36, 23, 236, 61, 237, 235, 23, 236, 61, 235, 56, 23, 236, 63, 204, - 217, 23, 236, 63, 204, 218, 237, 245, 23, 236, 63, 204, 218, 251, 128, - 23, 236, 64, 204, 217, 23, 236, 64, 204, 218, 237, 245, 23, 236, 64, 204, - 218, 251, 128, 23, 236, 63, 241, 9, 23, 236, 64, 241, 9, 23, 236, 63, - 244, 244, 23, 245, 97, 211, 217, 23, 245, 97, 217, 84, 23, 245, 97, 204, - 131, 23, 203, 17, 245, 97, 232, 48, 23, 203, 17, 245, 97, 219, 63, 23, - 203, 17, 245, 97, 221, 208, 23, 237, 74, 23, 216, 21, 217, 84, 23, 216, - 21, 241, 134, 23, 216, 21, 196, 248, 23, 216, 21, 197, 57, 23, 251, 190, - 248, 120, 214, 34, 23, 251, 190, 204, 130, 226, 86, 23, 251, 190, 248, - 122, 4, 209, 189, 23, 251, 190, 204, 132, 4, 209, 189, 23, 248, 49, 226, - 58, 23, 248, 49, 236, 88, 23, 218, 165, 244, 203, 217, 84, 23, 218, 165, - 244, 203, 235, 11, 23, 218, 165, 244, 203, 241, 134, 23, 218, 165, 205, - 219, 23, 218, 165, 205, 220, 196, 250, 23, 218, 165, 205, 220, 214, 92, - 23, 218, 165, 234, 230, 23, 218, 165, 234, 231, 196, 250, 23, 218, 165, - 234, 231, 214, 92, 23, 218, 165, 192, 244, 249, 23, 218, 165, 192, 235, - 11, 23, 218, 165, 192, 196, 250, 23, 218, 165, 192, 214, 27, 23, 218, - 165, 192, 214, 28, 196, 250, 23, 218, 165, 192, 214, 28, 196, 77, 23, - 218, 165, 192, 210, 163, 23, 218, 165, 192, 210, 164, 196, 250, 23, 218, - 165, 192, 210, 164, 196, 77, 23, 218, 165, 224, 57, 23, 218, 165, 224, - 58, 235, 11, 23, 218, 165, 224, 58, 196, 250, 23, 218, 165, 203, 16, 23, - 218, 165, 203, 17, 235, 11, 23, 218, 165, 203, 17, 204, 131, 23, 222, 60, - 212, 23, 202, 19, 23, 222, 62, 221, 203, 127, 200, 32, 23, 222, 62, 200, - 33, 127, 221, 202, 23, 218, 165, 241, 100, 23, 218, 165, 196, 249, 206, - 61, 23, 218, 165, 196, 249, 237, 245, 23, 201, 250, 204, 237, 214, 35, - 235, 205, 23, 201, 250, 222, 105, 222, 59, 23, 201, 250, 202, 68, 248, - 204, 222, 59, 23, 201, 250, 202, 68, 201, 225, 226, 42, 218, 164, 23, - 201, 250, 226, 42, 218, 165, 210, 134, 23, 201, 250, 218, 155, 251, 215, - 245, 98, 23, 201, 250, 247, 37, 204, 237, 214, 34, 23, 201, 250, 247, 37, - 226, 42, 218, 164, 23, 203, 44, 23, 203, 45, 218, 160, 23, 203, 45, 214, - 120, 201, 249, 23, 203, 45, 214, 120, 201, 250, 218, 160, 23, 203, 45, - 214, 120, 222, 59, 23, 203, 45, 214, 120, 222, 60, 218, 160, 23, 203, 45, - 248, 143, 222, 59, 23, 218, 156, 225, 197, 23, 218, 158, 225, 197, 23, - 217, 109, 23, 232, 233, 23, 236, 91, 23, 206, 164, 232, 36, 205, 122, 23, - 206, 164, 232, 36, 212, 77, 23, 197, 147, 206, 164, 232, 36, 218, 163, - 23, 235, 68, 206, 164, 232, 36, 218, 163, 23, 206, 164, 202, 80, 234, - 235, 197, 153, 23, 201, 232, 204, 218, 204, 205, 23, 201, 232, 241, 10, - 248, 221, 23, 201, 233, 200, 218, 23, 200, 33, 248, 111, 202, 80, 234, - 235, 232, 36, 225, 123, 23, 222, 87, 244, 164, 23, 222, 87, 222, 157, 23, - 222, 87, 222, 156, 23, 222, 87, 222, 155, 23, 222, 87, 222, 154, 23, 222, - 87, 222, 153, 23, 222, 87, 222, 152, 23, 222, 87, 222, 151, 23, 235, 127, - 23, 222, 1, 205, 148, 23, 222, 2, 205, 148, 23, 222, 4, 232, 111, 23, - 222, 4, 197, 58, 23, 222, 4, 239, 199, 23, 222, 4, 232, 138, 217, 109, - 23, 222, 4, 201, 234, 23, 222, 4, 222, 86, 239, 117, 23, 244, 159, 23, - 234, 217, 204, 226, 23, 207, 105, 23, 244, 168, 23, 213, 140, 23, 235, - 137, 218, 227, 23, 235, 137, 218, 226, 23, 235, 137, 218, 225, 23, 235, - 137, 218, 224, 23, 235, 137, 218, 223, 23, 209, 193, 218, 227, 23, 209, - 193, 218, 226, 23, 209, 193, 218, 225, 23, 209, 193, 218, 224, 23, 209, - 193, 218, 223, 23, 209, 193, 218, 222, 23, 209, 193, 218, 221, 23, 209, - 193, 218, 220, 23, 209, 193, 218, 234, 23, 209, 193, 218, 233, 23, 209, - 193, 218, 232, 23, 209, 193, 218, 231, 23, 209, 193, 218, 230, 23, 209, - 193, 218, 229, 23, 209, 193, 218, 228, 38, 125, 1, 250, 113, 38, 125, 1, - 248, 9, 38, 125, 1, 199, 116, 38, 125, 1, 233, 159, 38, 125, 1, 239, 23, - 38, 125, 1, 196, 38, 38, 125, 1, 195, 58, 38, 125, 1, 195, 84, 38, 125, - 1, 225, 221, 38, 125, 1, 84, 225, 221, 38, 125, 1, 68, 38, 125, 1, 239, - 44, 38, 125, 1, 225, 23, 38, 125, 1, 222, 39, 38, 125, 1, 218, 59, 38, - 125, 1, 217, 206, 38, 125, 1, 214, 104, 38, 125, 1, 212, 104, 38, 125, 1, - 209, 249, 38, 125, 1, 205, 229, 38, 125, 1, 200, 246, 38, 125, 1, 200, - 83, 38, 125, 1, 234, 238, 38, 125, 1, 232, 91, 38, 125, 1, 206, 154, 38, - 125, 1, 201, 92, 38, 125, 1, 245, 36, 38, 125, 1, 207, 50, 38, 125, 1, - 196, 47, 38, 125, 1, 196, 49, 38, 125, 1, 196, 82, 38, 125, 1, 195, 217, - 38, 125, 1, 4, 195, 182, 38, 125, 1, 196, 3, 38, 125, 1, 226, 6, 4, 195, - 182, 38, 125, 1, 248, 171, 195, 182, 38, 125, 1, 226, 6, 248, 171, 195, - 182, 38, 125, 1, 235, 103, 215, 88, 211, 224, 86, 1, 166, 215, 88, 211, - 224, 86, 1, 201, 113, 215, 88, 211, 224, 86, 1, 215, 207, 215, 88, 211, - 224, 86, 1, 189, 215, 88, 211, 224, 86, 1, 142, 215, 88, 211, 224, 86, 1, - 176, 215, 88, 211, 224, 86, 1, 196, 208, 215, 88, 211, 224, 86, 1, 216, - 118, 215, 88, 211, 224, 86, 1, 247, 174, 215, 88, 211, 224, 86, 1, 172, - 215, 88, 211, 224, 86, 1, 183, 215, 88, 211, 224, 86, 1, 195, 115, 215, - 88, 211, 224, 86, 1, 217, 163, 215, 88, 211, 224, 86, 1, 215, 194, 215, - 88, 211, 224, 86, 1, 155, 215, 88, 211, 224, 86, 1, 240, 136, 215, 88, - 211, 224, 86, 1, 215, 109, 215, 88, 211, 224, 86, 1, 215, 252, 215, 88, - 211, 224, 86, 1, 199, 152, 215, 88, 211, 224, 86, 1, 215, 188, 215, 88, - 211, 224, 86, 1, 200, 210, 215, 88, 211, 224, 86, 1, 235, 239, 215, 88, - 211, 224, 86, 1, 169, 215, 88, 211, 224, 86, 1, 211, 159, 215, 88, 211, - 224, 86, 1, 164, 215, 88, 211, 224, 86, 1, 215, 254, 215, 88, 211, 224, - 86, 1, 161, 215, 88, 211, 224, 86, 1, 196, 164, 215, 88, 211, 224, 86, 1, - 216, 0, 215, 88, 211, 224, 86, 1, 239, 40, 215, 88, 211, 224, 86, 1, 215, - 255, 215, 88, 211, 224, 86, 1, 232, 236, 215, 88, 211, 224, 86, 1, 219, - 2, 215, 88, 211, 224, 86, 1, 212, 150, 215, 88, 211, 224, 86, 1, 234, - 123, 215, 88, 211, 224, 86, 1, 209, 181, 215, 88, 211, 224, 86, 1, 63, - 215, 88, 211, 224, 86, 1, 252, 168, 215, 88, 211, 224, 86, 1, 68, 215, - 88, 211, 224, 86, 1, 66, 215, 88, 211, 224, 86, 1, 72, 215, 88, 211, 224, - 86, 1, 214, 102, 215, 88, 211, 224, 86, 1, 69, 215, 88, 211, 224, 86, 1, - 237, 54, 215, 88, 211, 224, 86, 1, 197, 199, 215, 88, 211, 224, 86, 202, - 2, 215, 88, 211, 224, 86, 201, 254, 215, 88, 211, 224, 86, 201, 255, 215, - 88, 211, 224, 86, 201, 252, 215, 88, 211, 224, 86, 201, 253, 215, 88, - 211, 224, 86, 202, 0, 215, 88, 211, 224, 86, 202, 1, 215, 88, 211, 224, - 86, 2, 36, 213, 28, 215, 88, 211, 224, 86, 2, 36, 202, 187, 215, 88, 211, - 224, 86, 2, 36, 222, 3, 215, 88, 211, 224, 86, 2, 36, 251, 81, 215, 88, - 211, 224, 86, 2, 36, 226, 18, 215, 88, 211, 224, 86, 2, 196, 172, 196, - 171, 215, 88, 211, 224, 86, 5, 222, 150, 215, 88, 211, 224, 86, 17, 195, - 79, 215, 88, 211, 224, 86, 17, 100, 215, 88, 211, 224, 86, 17, 102, 215, - 88, 211, 224, 86, 17, 134, 215, 88, 211, 224, 86, 17, 136, 215, 88, 211, - 224, 86, 17, 146, 215, 88, 211, 224, 86, 17, 167, 215, 88, 211, 224, 86, - 17, 178, 215, 88, 211, 224, 86, 17, 171, 215, 88, 211, 224, 86, 17, 182, - 215, 88, 211, 224, 86, 221, 248, 215, 104, 215, 88, 211, 224, 86, 46, - 247, 174, 197, 145, 1, 252, 168, 197, 145, 1, 63, 197, 145, 1, 249, 145, - 197, 145, 1, 247, 174, 197, 145, 1, 240, 136, 197, 145, 1, 234, 123, 197, - 145, 1, 164, 197, 145, 1, 213, 6, 197, 145, 1, 172, 197, 145, 1, 176, - 197, 145, 1, 161, 197, 145, 1, 189, 197, 145, 1, 202, 233, 197, 145, 1, - 235, 239, 197, 145, 1, 183, 197, 145, 1, 207, 50, 197, 145, 1, 225, 214, - 197, 145, 1, 195, 115, 197, 145, 1, 197, 166, 197, 145, 1, 199, 152, 197, - 145, 1, 155, 197, 145, 1, 72, 197, 145, 1, 250, 150, 197, 145, 1, 169, - 197, 145, 1, 166, 197, 145, 1, 224, 146, 197, 145, 1, 142, 197, 145, 1, - 69, 197, 145, 1, 68, 197, 145, 1, 217, 71, 197, 145, 1, 66, 197, 145, 1, - 222, 30, 197, 145, 1, 201, 113, 197, 145, 1, 201, 217, 197, 145, 1, 214, - 109, 197, 145, 1, 252, 127, 197, 145, 1, 251, 97, 197, 145, 1, 226, 60, - 197, 145, 1, 214, 119, 197, 145, 1, 236, 230, 197, 145, 1, 252, 128, 197, - 145, 1, 215, 109, 197, 145, 1, 200, 95, 197, 145, 1, 196, 15, 197, 145, - 152, 201, 13, 197, 145, 152, 201, 12, 197, 145, 152, 223, 255, 197, 145, - 152, 223, 254, 197, 145, 17, 195, 79, 197, 145, 17, 100, 197, 145, 17, - 102, 197, 145, 17, 134, 197, 145, 17, 136, 197, 145, 17, 146, 197, 145, - 17, 167, 197, 145, 17, 178, 197, 145, 17, 171, 197, 145, 17, 182, 197, - 145, 216, 235, 55, 81, 80, 5, 221, 135, 224, 101, 81, 80, 5, 221, 131, - 155, 81, 80, 5, 221, 129, 223, 187, 81, 80, 5, 221, 5, 224, 200, 81, 80, - 5, 220, 231, 224, 209, 81, 80, 5, 220, 250, 223, 242, 81, 80, 5, 221, 22, - 224, 11, 81, 80, 5, 220, 147, 223, 174, 81, 80, 5, 221, 126, 197, 70, 81, - 80, 5, 221, 124, 197, 166, 81, 80, 5, 221, 122, 196, 243, 81, 80, 5, 220, - 200, 197, 98, 81, 80, 5, 220, 208, 197, 109, 81, 80, 5, 220, 212, 197, - 15, 81, 80, 5, 221, 25, 197, 34, 81, 80, 5, 220, 132, 196, 239, 81, 80, - 5, 220, 183, 197, 96, 81, 80, 5, 221, 9, 196, 227, 81, 80, 5, 221, 21, - 196, 229, 81, 80, 5, 220, 187, 196, 228, 81, 80, 5, 221, 120, 219, 23, - 81, 80, 5, 221, 118, 220, 62, 81, 80, 5, 221, 116, 218, 113, 81, 80, 5, - 221, 11, 219, 164, 81, 80, 5, 220, 232, 218, 215, 81, 80, 5, 220, 172, - 218, 138, 81, 80, 5, 220, 137, 218, 132, 81, 80, 5, 221, 114, 248, 184, - 81, 80, 5, 221, 111, 249, 145, 81, 80, 5, 221, 109, 248, 21, 81, 80, 5, - 220, 176, 248, 251, 81, 80, 5, 220, 229, 249, 9, 81, 80, 5, 220, 223, - 248, 103, 81, 80, 5, 220, 188, 248, 116, 81, 80, 5, 221, 99, 68, 81, 80, - 5, 221, 97, 63, 81, 80, 5, 221, 95, 66, 81, 80, 5, 220, 163, 237, 54, 81, - 80, 5, 220, 226, 69, 81, 80, 5, 220, 161, 214, 102, 81, 80, 5, 220, 179, - 72, 81, 80, 5, 220, 189, 237, 33, 81, 80, 5, 220, 195, 226, 86, 81, 80, - 5, 220, 191, 226, 86, 81, 80, 5, 220, 131, 251, 106, 81, 80, 5, 220, 148, - 236, 230, 81, 80, 5, 221, 84, 206, 112, 81, 80, 5, 221, 82, 183, 81, 80, - 5, 221, 80, 204, 172, 81, 80, 5, 220, 164, 208, 129, 81, 80, 5, 220, 210, - 208, 147, 81, 80, 5, 220, 190, 205, 171, 81, 80, 5, 220, 247, 205, 200, - 81, 80, 5, 220, 130, 206, 105, 81, 80, 5, 221, 70, 222, 109, 81, 80, 5, - 221, 68, 172, 81, 80, 5, 221, 66, 221, 191, 81, 80, 5, 220, 242, 222, - 188, 81, 80, 5, 220, 253, 222, 197, 81, 80, 5, 221, 16, 221, 229, 81, 80, - 5, 220, 173, 222, 7, 81, 80, 5, 220, 216, 181, 222, 197, 81, 80, 5, 221, - 92, 239, 152, 81, 80, 5, 221, 89, 240, 136, 81, 80, 5, 221, 86, 237, 201, - 81, 80, 5, 220, 237, 239, 237, 81, 80, 5, 220, 146, 239, 3, 81, 80, 5, - 220, 145, 239, 28, 81, 80, 5, 221, 78, 202, 122, 81, 80, 5, 221, 75, 189, - 81, 80, 5, 221, 73, 201, 40, 81, 80, 5, 220, 235, 203, 48, 81, 80, 5, - 221, 15, 203, 68, 81, 80, 5, 220, 222, 201, 247, 81, 80, 5, 221, 1, 149, - 81, 80, 5, 221, 64, 225, 172, 81, 80, 5, 221, 61, 225, 214, 81, 80, 5, - 221, 59, 225, 110, 81, 80, 5, 220, 169, 225, 191, 81, 80, 5, 220, 213, - 225, 193, 81, 80, 5, 220, 166, 225, 119, 81, 80, 5, 221, 7, 225, 129, 81, - 80, 5, 220, 151, 181, 225, 129, 81, 80, 5, 221, 57, 196, 24, 81, 80, 5, - 221, 54, 164, 81, 80, 5, 221, 52, 195, 217, 81, 80, 5, 220, 217, 196, 66, - 81, 80, 5, 220, 246, 196, 69, 81, 80, 5, 220, 185, 195, 237, 81, 80, 5, - 220, 205, 196, 3, 81, 80, 5, 221, 48, 235, 153, 81, 80, 5, 221, 46, 235, - 239, 81, 80, 5, 221, 44, 234, 223, 81, 80, 5, 220, 248, 235, 182, 81, 80, - 5, 220, 251, 235, 189, 81, 80, 5, 220, 193, 235, 40, 81, 80, 5, 220, 238, - 235, 51, 81, 80, 5, 220, 129, 234, 222, 81, 80, 5, 220, 225, 235, 210, - 81, 80, 5, 221, 42, 216, 183, 81, 80, 5, 221, 40, 217, 221, 81, 80, 5, - 221, 38, 215, 138, 81, 80, 5, 220, 209, 217, 101, 81, 80, 5, 220, 157, - 216, 38, 81, 80, 5, 220, 150, 232, 71, 81, 80, 5, 221, 33, 142, 81, 80, - 5, 220, 140, 231, 75, 81, 80, 5, 221, 36, 232, 118, 81, 80, 5, 220, 230, - 232, 147, 81, 80, 5, 221, 31, 231, 166, 81, 80, 5, 220, 186, 231, 193, - 81, 80, 5, 220, 243, 232, 117, 81, 80, 5, 220, 198, 231, 159, 81, 80, 5, - 221, 17, 232, 41, 81, 80, 5, 220, 196, 232, 212, 81, 80, 5, 220, 239, - 231, 59, 81, 80, 5, 221, 18, 232, 101, 81, 80, 5, 220, 133, 231, 169, 81, - 80, 5, 221, 24, 231, 71, 81, 80, 5, 220, 236, 217, 36, 81, 80, 5, 221, - 29, 217, 50, 81, 80, 5, 220, 244, 217, 33, 81, 80, 5, 220, 211, 217, 44, - 81, 80, 5, 220, 180, 217, 45, 81, 80, 5, 220, 170, 217, 34, 81, 80, 5, - 220, 206, 217, 35, 81, 80, 5, 220, 167, 217, 49, 81, 80, 5, 220, 199, - 217, 32, 81, 80, 5, 220, 240, 181, 217, 45, 81, 80, 5, 220, 220, 181, - 217, 34, 81, 80, 5, 220, 143, 181, 217, 35, 81, 80, 5, 220, 171, 233, - 192, 81, 80, 5, 220, 215, 234, 123, 81, 80, 5, 220, 158, 233, 76, 81, 80, - 5, 220, 136, 234, 40, 81, 80, 5, 220, 160, 233, 62, 81, 80, 5, 220, 159, - 233, 72, 81, 80, 5, 220, 142, 217, 55, 81, 80, 5, 221, 13, 216, 248, 81, - 80, 5, 220, 149, 216, 237, 81, 80, 5, 221, 2, 212, 220, 81, 80, 5, 220, - 227, 161, 81, 80, 5, 221, 20, 211, 227, 81, 80, 5, 220, 245, 213, 79, 81, - 80, 5, 221, 19, 213, 92, 81, 80, 5, 220, 224, 212, 91, 81, 80, 5, 221, 4, - 212, 117, 81, 80, 5, 220, 181, 219, 226, 81, 80, 5, 221, 8, 219, 241, 81, - 80, 5, 220, 204, 219, 220, 81, 80, 5, 221, 23, 219, 233, 81, 80, 5, 220, - 138, 219, 233, 81, 80, 5, 220, 254, 219, 234, 81, 80, 5, 220, 154, 219, - 221, 81, 80, 5, 220, 152, 219, 222, 81, 80, 5, 220, 139, 219, 214, 81, - 80, 5, 220, 165, 181, 219, 234, 81, 80, 5, 220, 221, 181, 219, 221, 81, - 80, 5, 220, 184, 181, 219, 222, 81, 80, 5, 220, 194, 223, 215, 81, 80, 5, - 220, 234, 223, 223, 81, 80, 5, 220, 252, 223, 211, 81, 80, 5, 221, 27, - 223, 218, 81, 80, 5, 220, 218, 223, 219, 81, 80, 5, 220, 214, 223, 213, - 81, 80, 5, 220, 168, 223, 214, 81, 80, 5, 220, 202, 234, 57, 81, 80, 5, - 221, 14, 234, 65, 81, 80, 5, 220, 178, 234, 52, 81, 80, 5, 220, 233, 234, - 61, 81, 80, 5, 220, 219, 234, 62, 81, 80, 5, 220, 255, 234, 53, 81, 80, - 5, 221, 0, 234, 55, 81, 80, 5, 220, 155, 169, 81, 80, 5, 220, 203, 217, - 144, 81, 80, 5, 220, 197, 217, 159, 81, 80, 5, 220, 201, 217, 126, 81, - 80, 5, 220, 135, 217, 150, 81, 80, 5, 220, 207, 217, 151, 81, 80, 5, 221, - 3, 217, 131, 81, 80, 5, 221, 6, 217, 135, 81, 80, 5, 220, 174, 216, 164, - 81, 80, 5, 220, 134, 216, 134, 81, 80, 5, 220, 177, 216, 155, 81, 80, 5, - 220, 192, 216, 138, 81, 80, 5, 220, 144, 199, 34, 81, 80, 5, 220, 141, - 199, 152, 81, 80, 5, 220, 175, 197, 220, 81, 80, 5, 220, 153, 199, 113, - 81, 80, 5, 220, 241, 199, 118, 81, 80, 5, 220, 182, 198, 233, 81, 80, 5, - 220, 249, 198, 248, 81, 80, 5, 220, 162, 215, 82, 81, 80, 5, 221, 12, - 215, 102, 81, 80, 5, 220, 156, 215, 64, 81, 80, 5, 220, 228, 215, 94, 81, - 80, 5, 221, 10, 215, 71, 81, 80, 17, 100, 81, 80, 17, 102, 81, 80, 17, - 134, 81, 80, 17, 136, 81, 80, 17, 146, 81, 80, 17, 167, 81, 80, 17, 178, - 81, 80, 17, 171, 81, 80, 17, 182, 81, 80, 38, 31, 203, 46, 81, 80, 38, - 31, 203, 18, 81, 80, 38, 31, 231, 55, 81, 80, 38, 31, 202, 157, 81, 80, - 38, 31, 203, 24, 202, 157, 81, 80, 38, 31, 231, 58, 202, 157, 81, 80, 38, - 31, 219, 26, 251, 253, 6, 1, 251, 152, 251, 253, 6, 1, 240, 133, 251, - 253, 6, 1, 223, 80, 251, 253, 6, 1, 219, 39, 251, 253, 6, 1, 249, 145, - 251, 253, 6, 1, 206, 56, 251, 253, 6, 1, 213, 92, 251, 253, 6, 1, 248, - 192, 251, 253, 6, 1, 169, 251, 253, 6, 1, 69, 251, 253, 6, 1, 235, 239, - 251, 253, 6, 1, 68, 251, 253, 6, 1, 72, 251, 253, 6, 1, 239, 176, 251, - 253, 6, 1, 196, 25, 251, 253, 6, 1, 197, 117, 251, 253, 6, 1, 215, 138, - 251, 253, 6, 1, 225, 35, 251, 253, 6, 1, 164, 251, 253, 6, 1, 66, 251, - 253, 6, 1, 225, 163, 251, 253, 6, 1, 245, 75, 251, 253, 6, 1, 142, 251, - 253, 6, 1, 211, 157, 251, 253, 6, 1, 234, 123, 251, 253, 6, 1, 215, 109, - 251, 253, 6, 1, 201, 40, 251, 253, 6, 1, 216, 227, 251, 253, 6, 1, 199, - 152, 251, 253, 6, 1, 224, 146, 251, 253, 6, 1, 234, 62, 251, 253, 6, 1, - 195, 104, 251, 253, 6, 1, 223, 214, 251, 253, 6, 1, 207, 50, 251, 253, 4, - 1, 251, 152, 251, 253, 4, 1, 240, 133, 251, 253, 4, 1, 223, 80, 251, 253, - 4, 1, 219, 39, 251, 253, 4, 1, 249, 145, 251, 253, 4, 1, 206, 56, 251, - 253, 4, 1, 213, 92, 251, 253, 4, 1, 248, 192, 251, 253, 4, 1, 169, 251, - 253, 4, 1, 69, 251, 253, 4, 1, 235, 239, 251, 253, 4, 1, 68, 251, 253, 4, - 1, 72, 251, 253, 4, 1, 239, 176, 251, 253, 4, 1, 196, 25, 251, 253, 4, 1, - 197, 117, 251, 253, 4, 1, 215, 138, 251, 253, 4, 1, 225, 35, 251, 253, 4, - 1, 164, 251, 253, 4, 1, 66, 251, 253, 4, 1, 225, 163, 251, 253, 4, 1, - 245, 75, 251, 253, 4, 1, 142, 251, 253, 4, 1, 211, 157, 251, 253, 4, 1, - 234, 123, 251, 253, 4, 1, 215, 109, 251, 253, 4, 1, 201, 40, 251, 253, 4, - 1, 216, 227, 251, 253, 4, 1, 199, 152, 251, 253, 4, 1, 224, 146, 251, - 253, 4, 1, 234, 62, 251, 253, 4, 1, 195, 104, 251, 253, 4, 1, 223, 214, - 251, 253, 4, 1, 207, 50, 251, 253, 251, 153, 222, 150, 251, 253, 18, 222, - 150, 251, 253, 234, 36, 78, 251, 253, 232, 213, 251, 253, 108, 218, 235, - 251, 253, 234, 37, 108, 218, 235, 251, 253, 215, 149, 251, 253, 217, 208, - 78, 251, 253, 17, 195, 79, 251, 253, 17, 100, 251, 253, 17, 102, 251, - 253, 17, 134, 251, 253, 17, 136, 251, 253, 17, 146, 251, 253, 17, 167, - 251, 253, 17, 178, 251, 253, 17, 171, 251, 253, 17, 182, 251, 253, 84, - 236, 90, 78, 251, 253, 84, 211, 79, 78, 226, 70, 128, 31, 100, 226, 70, - 128, 31, 102, 226, 70, 128, 31, 134, 226, 70, 128, 31, 136, 226, 70, 128, - 31, 146, 226, 70, 128, 31, 167, 226, 70, 128, 31, 178, 226, 70, 128, 31, - 171, 226, 70, 128, 31, 182, 226, 70, 128, 31, 203, 23, 226, 70, 128, 31, - 200, 234, 226, 70, 128, 31, 202, 177, 226, 70, 128, 31, 235, 14, 226, 70, - 128, 31, 235, 145, 226, 70, 128, 31, 206, 13, 226, 70, 128, 31, 207, 65, - 226, 70, 128, 31, 237, 20, 226, 70, 128, 31, 216, 174, 226, 70, 128, 31, - 97, 231, 57, 226, 70, 128, 31, 99, 231, 57, 226, 70, 128, 31, 115, 231, - 57, 226, 70, 128, 31, 235, 7, 231, 57, 226, 70, 128, 31, 235, 101, 231, - 57, 226, 70, 128, 31, 206, 29, 231, 57, 226, 70, 128, 31, 207, 71, 231, - 57, 226, 70, 128, 31, 237, 31, 231, 57, 226, 70, 128, 31, 216, 179, 231, - 57, 226, 70, 128, 31, 97, 170, 226, 70, 128, 31, 99, 170, 226, 70, 128, - 31, 115, 170, 226, 70, 128, 31, 235, 7, 170, 226, 70, 128, 31, 235, 101, - 170, 226, 70, 128, 31, 206, 29, 170, 226, 70, 128, 31, 207, 71, 170, 226, - 70, 128, 31, 237, 31, 170, 226, 70, 128, 31, 216, 179, 170, 226, 70, 128, - 31, 203, 24, 170, 226, 70, 128, 31, 200, 235, 170, 226, 70, 128, 31, 202, - 178, 170, 226, 70, 128, 31, 235, 15, 170, 226, 70, 128, 31, 235, 146, - 170, 226, 70, 128, 31, 206, 14, 170, 226, 70, 128, 31, 207, 66, 170, 226, - 70, 128, 31, 237, 21, 170, 226, 70, 128, 31, 216, 175, 170, 226, 70, 128, - 31, 222, 255, 226, 70, 128, 31, 222, 254, 226, 70, 128, 223, 0, 78, 226, - 70, 128, 31, 224, 246, 226, 70, 128, 31, 224, 245, 226, 70, 128, 31, 212, - 31, 100, 226, 70, 128, 31, 212, 31, 102, 226, 70, 128, 31, 212, 31, 134, - 226, 70, 128, 31, 212, 31, 136, 226, 70, 128, 31, 212, 31, 146, 226, 70, - 128, 31, 212, 31, 167, 226, 70, 128, 31, 212, 31, 178, 226, 70, 128, 31, - 212, 31, 171, 226, 70, 128, 31, 212, 31, 182, 226, 70, 128, 212, 147, - 226, 70, 128, 191, 97, 211, 87, 226, 70, 128, 191, 97, 232, 225, 226, 70, - 128, 191, 115, 211, 85, 226, 70, 128, 209, 108, 78, 226, 70, 128, 31, - 251, 131, 100, 226, 70, 128, 31, 251, 131, 102, 226, 70, 128, 31, 251, - 131, 203, 24, 170, 226, 70, 128, 251, 131, 223, 0, 78, 214, 41, 128, 31, - 100, 214, 41, 128, 31, 102, 214, 41, 128, 31, 134, 214, 41, 128, 31, 136, - 214, 41, 128, 31, 146, 214, 41, 128, 31, 167, 214, 41, 128, 31, 178, 214, - 41, 128, 31, 171, 214, 41, 128, 31, 182, 214, 41, 128, 31, 203, 23, 214, - 41, 128, 31, 200, 234, 214, 41, 128, 31, 202, 177, 214, 41, 128, 31, 235, - 14, 214, 41, 128, 31, 235, 145, 214, 41, 128, 31, 206, 13, 214, 41, 128, - 31, 207, 65, 214, 41, 128, 31, 237, 20, 214, 41, 128, 31, 216, 174, 214, - 41, 128, 31, 97, 231, 57, 214, 41, 128, 31, 99, 231, 57, 214, 41, 128, - 31, 115, 231, 57, 214, 41, 128, 31, 235, 7, 231, 57, 214, 41, 128, 31, - 235, 101, 231, 57, 214, 41, 128, 31, 206, 29, 231, 57, 214, 41, 128, 31, - 207, 71, 231, 57, 214, 41, 128, 31, 237, 31, 231, 57, 214, 41, 128, 31, - 216, 179, 231, 57, 214, 41, 128, 31, 97, 170, 214, 41, 128, 31, 99, 170, - 214, 41, 128, 31, 115, 170, 214, 41, 128, 31, 235, 7, 170, 214, 41, 128, - 31, 235, 101, 170, 214, 41, 128, 31, 206, 29, 170, 214, 41, 128, 31, 207, - 71, 170, 214, 41, 128, 31, 237, 31, 170, 214, 41, 128, 31, 216, 179, 170, - 214, 41, 128, 31, 203, 24, 170, 214, 41, 128, 31, 200, 235, 170, 214, 41, - 128, 31, 202, 178, 170, 214, 41, 128, 31, 235, 15, 170, 214, 41, 128, 31, - 235, 146, 170, 214, 41, 128, 31, 206, 14, 170, 214, 41, 128, 31, 207, 66, - 170, 214, 41, 128, 31, 237, 21, 170, 214, 41, 128, 31, 216, 175, 170, - 214, 41, 128, 220, 22, 214, 41, 128, 251, 131, 31, 102, 214, 41, 128, - 251, 131, 31, 134, 214, 41, 128, 251, 131, 31, 136, 214, 41, 128, 251, - 131, 31, 146, 214, 41, 128, 251, 131, 31, 167, 214, 41, 128, 251, 131, - 31, 178, 214, 41, 128, 251, 131, 31, 171, 214, 41, 128, 251, 131, 31, - 182, 214, 41, 128, 251, 131, 31, 203, 23, 214, 41, 128, 251, 131, 31, - 235, 7, 231, 57, 214, 41, 128, 251, 131, 31, 206, 29, 231, 57, 214, 41, - 128, 251, 131, 31, 99, 170, 214, 41, 128, 251, 131, 31, 203, 24, 170, - 214, 41, 128, 191, 97, 232, 225, 214, 41, 128, 191, 97, 206, 17, 9, 13, - 251, 164, 9, 13, 248, 239, 9, 13, 225, 189, 9, 13, 240, 107, 9, 13, 197, - 117, 9, 13, 195, 106, 9, 13, 232, 236, 9, 13, 203, 139, 9, 13, 196, 64, - 9, 13, 225, 35, 9, 13, 222, 249, 9, 13, 219, 185, 9, 13, 216, 31, 9, 13, - 208, 125, 9, 13, 251, 194, 9, 13, 235, 176, 9, 13, 209, 8, 9, 13, 211, - 152, 9, 13, 210, 142, 9, 13, 206, 251, 9, 13, 203, 41, 9, 13, 202, 213, - 9, 13, 224, 142, 9, 13, 202, 225, 9, 13, 240, 130, 9, 13, 195, 109, 9, - 13, 233, 225, 9, 13, 238, 252, 248, 239, 9, 13, 238, 252, 216, 31, 9, 13, - 238, 252, 235, 176, 9, 13, 238, 252, 211, 152, 9, 13, 84, 248, 239, 9, - 13, 84, 225, 189, 9, 13, 84, 232, 113, 9, 13, 84, 232, 236, 9, 13, 84, - 196, 64, 9, 13, 84, 225, 35, 9, 13, 84, 222, 249, 9, 13, 84, 219, 185, 9, - 13, 84, 216, 31, 9, 13, 84, 208, 125, 9, 13, 84, 251, 194, 9, 13, 84, - 235, 176, 9, 13, 84, 209, 8, 9, 13, 84, 211, 152, 9, 13, 84, 206, 251, 9, - 13, 84, 203, 41, 9, 13, 84, 202, 213, 9, 13, 84, 224, 142, 9, 13, 84, - 240, 130, 9, 13, 84, 233, 225, 9, 13, 203, 134, 225, 189, 9, 13, 203, - 134, 232, 236, 9, 13, 203, 134, 196, 64, 9, 13, 203, 134, 222, 249, 9, - 13, 203, 134, 216, 31, 9, 13, 203, 134, 208, 125, 9, 13, 203, 134, 251, - 194, 9, 13, 203, 134, 209, 8, 9, 13, 203, 134, 211, 152, 9, 13, 203, 134, - 206, 251, 9, 13, 203, 134, 224, 142, 9, 13, 203, 134, 240, 130, 9, 13, - 203, 134, 233, 225, 9, 13, 203, 134, 238, 252, 216, 31, 9, 13, 203, 134, - 238, 252, 211, 152, 9, 13, 204, 204, 248, 239, 9, 13, 204, 204, 225, 189, - 9, 13, 204, 204, 232, 113, 9, 13, 204, 204, 232, 236, 9, 13, 204, 204, - 203, 139, 9, 13, 204, 204, 196, 64, 9, 13, 204, 204, 225, 35, 9, 13, 204, - 204, 219, 185, 9, 13, 204, 204, 216, 31, 9, 13, 204, 204, 208, 125, 9, - 13, 204, 204, 251, 194, 9, 13, 204, 204, 235, 176, 9, 13, 204, 204, 209, - 8, 9, 13, 204, 204, 211, 152, 9, 13, 204, 204, 206, 251, 9, 13, 204, 204, - 203, 41, 9, 13, 204, 204, 202, 213, 9, 13, 204, 204, 224, 142, 9, 13, - 204, 204, 240, 130, 9, 13, 204, 204, 195, 109, 9, 13, 204, 204, 233, 225, - 9, 13, 204, 204, 238, 252, 248, 239, 9, 13, 204, 204, 238, 252, 235, 176, - 9, 13, 221, 224, 251, 164, 9, 13, 221, 224, 248, 239, 9, 13, 221, 224, - 225, 189, 9, 13, 221, 224, 240, 107, 9, 13, 221, 224, 232, 113, 9, 13, - 221, 224, 197, 117, 9, 13, 221, 224, 195, 106, 9, 13, 221, 224, 232, 236, - 9, 13, 221, 224, 203, 139, 9, 13, 221, 224, 196, 64, 9, 13, 221, 224, - 222, 249, 9, 13, 221, 224, 219, 185, 9, 13, 221, 224, 216, 31, 9, 13, - 221, 224, 208, 125, 9, 13, 221, 224, 251, 194, 9, 13, 221, 224, 235, 176, - 9, 13, 221, 224, 209, 8, 9, 13, 221, 224, 211, 152, 9, 13, 221, 224, 210, - 142, 9, 13, 221, 224, 206, 251, 9, 13, 221, 224, 203, 41, 9, 13, 221, - 224, 202, 213, 9, 13, 221, 224, 224, 142, 9, 13, 221, 224, 202, 225, 9, - 13, 221, 224, 240, 130, 9, 13, 221, 224, 195, 109, 9, 13, 221, 224, 233, - 225, 9, 13, 237, 241, 248, 239, 9, 13, 237, 241, 225, 189, 9, 13, 237, - 241, 240, 107, 9, 13, 237, 241, 197, 117, 9, 13, 237, 241, 195, 106, 9, - 13, 237, 241, 232, 236, 9, 13, 237, 241, 203, 139, 9, 13, 237, 241, 196, - 64, 9, 13, 237, 241, 222, 249, 9, 13, 237, 241, 219, 185, 9, 13, 237, - 241, 216, 31, 9, 13, 237, 241, 208, 125, 9, 13, 237, 241, 251, 194, 9, - 13, 237, 241, 235, 176, 9, 13, 237, 241, 209, 8, 9, 13, 237, 241, 211, - 152, 9, 13, 237, 241, 210, 142, 9, 13, 237, 241, 206, 251, 9, 13, 237, - 241, 203, 41, 9, 13, 237, 241, 202, 213, 9, 13, 237, 241, 224, 142, 9, - 13, 237, 241, 202, 225, 9, 13, 237, 241, 240, 130, 9, 13, 237, 241, 195, - 109, 9, 13, 237, 241, 233, 225, 9, 13, 214, 83, 87, 3, 168, 3, 203, 91, - 9, 13, 214, 83, 168, 3, 240, 107, 220, 83, 113, 237, 69, 197, 50, 220, - 83, 113, 205, 159, 197, 50, 220, 83, 113, 197, 89, 197, 50, 220, 83, 113, - 173, 197, 50, 220, 83, 113, 210, 158, 237, 223, 220, 83, 113, 233, 91, - 237, 223, 220, 83, 113, 59, 237, 223, 220, 83, 113, 97, 77, 245, 114, - 220, 83, 113, 99, 77, 245, 114, 220, 83, 113, 115, 77, 245, 114, 220, 83, - 113, 235, 7, 77, 245, 114, 220, 83, 113, 235, 101, 77, 245, 114, 220, 83, - 113, 206, 29, 77, 245, 114, 220, 83, 113, 207, 71, 77, 245, 114, 220, 83, - 113, 237, 31, 77, 245, 114, 220, 83, 113, 216, 179, 77, 245, 114, 220, - 83, 113, 97, 77, 249, 94, 220, 83, 113, 99, 77, 249, 94, 220, 83, 113, - 115, 77, 249, 94, 220, 83, 113, 235, 7, 77, 249, 94, 220, 83, 113, 235, - 101, 77, 249, 94, 220, 83, 113, 206, 29, 77, 249, 94, 220, 83, 113, 207, - 71, 77, 249, 94, 220, 83, 113, 237, 31, 77, 249, 94, 220, 83, 113, 216, - 179, 77, 249, 94, 220, 83, 113, 97, 77, 244, 246, 220, 83, 113, 99, 77, - 244, 246, 220, 83, 113, 115, 77, 244, 246, 220, 83, 113, 235, 7, 77, 244, - 246, 220, 83, 113, 235, 101, 77, 244, 246, 220, 83, 113, 206, 29, 77, - 244, 246, 220, 83, 113, 207, 71, 77, 244, 246, 220, 83, 113, 237, 31, 77, - 244, 246, 220, 83, 113, 216, 179, 77, 244, 246, 220, 83, 113, 212, 128, - 220, 83, 113, 214, 69, 220, 83, 113, 249, 95, 220, 83, 113, 245, 31, 220, - 83, 113, 205, 100, 220, 83, 113, 204, 113, 220, 83, 113, 250, 136, 220, - 83, 113, 197, 41, 220, 83, 113, 225, 122, 220, 83, 113, 249, 138, 185, - 113, 231, 155, 249, 138, 185, 113, 231, 153, 185, 113, 231, 152, 185, - 113, 231, 151, 185, 113, 231, 150, 185, 113, 231, 149, 185, 113, 231, - 148, 185, 113, 231, 147, 185, 113, 231, 146, 185, 113, 231, 145, 185, - 113, 231, 144, 185, 113, 231, 143, 185, 113, 231, 142, 185, 113, 231, - 141, 185, 113, 231, 140, 185, 113, 231, 139, 185, 113, 231, 138, 185, - 113, 231, 137, 185, 113, 231, 136, 185, 113, 231, 135, 185, 113, 231, - 134, 185, 113, 231, 133, 185, 113, 231, 132, 185, 113, 231, 131, 185, - 113, 231, 130, 185, 113, 231, 129, 185, 113, 231, 128, 185, 113, 231, - 127, 185, 113, 231, 126, 185, 113, 231, 125, 185, 113, 231, 124, 185, - 113, 231, 123, 185, 113, 231, 122, 185, 113, 231, 121, 185, 113, 231, - 120, 185, 113, 231, 119, 185, 113, 231, 118, 185, 113, 231, 117, 185, - 113, 231, 116, 185, 113, 231, 115, 185, 113, 231, 114, 185, 113, 231, - 113, 185, 113, 231, 112, 185, 113, 231, 111, 185, 113, 231, 110, 185, - 113, 231, 109, 185, 113, 231, 108, 185, 113, 231, 107, 185, 113, 231, - 106, 185, 113, 231, 105, 185, 113, 83, 249, 138, 185, 113, 199, 99, 185, - 113, 199, 98, 185, 113, 199, 97, 185, 113, 199, 96, 185, 113, 199, 95, - 185, 113, 199, 94, 185, 113, 199, 93, 185, 113, 199, 92, 185, 113, 199, - 91, 185, 113, 199, 90, 185, 113, 199, 89, 185, 113, 199, 88, 185, 113, - 199, 87, 185, 113, 199, 86, 185, 113, 199, 85, 185, 113, 199, 84, 185, - 113, 199, 83, 185, 113, 199, 82, 185, 113, 199, 81, 185, 113, 199, 80, - 185, 113, 199, 79, 185, 113, 199, 78, 185, 113, 199, 77, 185, 113, 199, - 76, 185, 113, 199, 75, 185, 113, 199, 74, 185, 113, 199, 73, 185, 113, - 199, 72, 185, 113, 199, 71, 185, 113, 199, 70, 185, 113, 199, 69, 185, - 113, 199, 68, 185, 113, 199, 67, 185, 113, 199, 66, 185, 113, 199, 65, - 185, 113, 199, 64, 185, 113, 199, 63, 185, 113, 199, 62, 185, 113, 199, - 61, 185, 113, 199, 60, 185, 113, 199, 59, 185, 113, 199, 58, 185, 113, - 199, 57, 185, 113, 199, 56, 185, 113, 199, 55, 185, 113, 199, 54, 185, - 113, 199, 53, 185, 113, 199, 52, 185, 113, 199, 51, 212, 138, 247, 115, - 249, 138, 212, 138, 247, 115, 252, 16, 77, 205, 145, 212, 138, 247, 115, - 99, 77, 205, 145, 212, 138, 247, 115, 115, 77, 205, 145, 212, 138, 247, - 115, 235, 7, 77, 205, 145, 212, 138, 247, 115, 235, 101, 77, 205, 145, - 212, 138, 247, 115, 206, 29, 77, 205, 145, 212, 138, 247, 115, 207, 71, - 77, 205, 145, 212, 138, 247, 115, 237, 31, 77, 205, 145, 212, 138, 247, - 115, 216, 179, 77, 205, 145, 212, 138, 247, 115, 203, 24, 77, 205, 145, - 212, 138, 247, 115, 225, 212, 77, 205, 145, 212, 138, 247, 115, 224, 20, - 77, 205, 145, 212, 138, 247, 115, 211, 81, 77, 205, 145, 212, 138, 247, - 115, 224, 74, 77, 205, 145, 212, 138, 247, 115, 252, 16, 77, 232, 124, - 212, 138, 247, 115, 99, 77, 232, 124, 212, 138, 247, 115, 115, 77, 232, - 124, 212, 138, 247, 115, 235, 7, 77, 232, 124, 212, 138, 247, 115, 235, - 101, 77, 232, 124, 212, 138, 247, 115, 206, 29, 77, 232, 124, 212, 138, - 247, 115, 207, 71, 77, 232, 124, 212, 138, 247, 115, 237, 31, 77, 232, - 124, 212, 138, 247, 115, 216, 179, 77, 232, 124, 212, 138, 247, 115, 203, - 24, 77, 232, 124, 212, 138, 247, 115, 225, 212, 77, 232, 124, 212, 138, - 247, 115, 224, 20, 77, 232, 124, 212, 138, 247, 115, 211, 81, 77, 232, - 124, 212, 138, 247, 115, 224, 74, 77, 232, 124, 212, 138, 247, 115, 210, - 158, 225, 122, 212, 138, 247, 115, 252, 16, 77, 239, 139, 212, 138, 247, - 115, 99, 77, 239, 139, 212, 138, 247, 115, 115, 77, 239, 139, 212, 138, - 247, 115, 235, 7, 77, 239, 139, 212, 138, 247, 115, 235, 101, 77, 239, - 139, 212, 138, 247, 115, 206, 29, 77, 239, 139, 212, 138, 247, 115, 207, - 71, 77, 239, 139, 212, 138, 247, 115, 237, 31, 77, 239, 139, 212, 138, - 247, 115, 216, 179, 77, 239, 139, 212, 138, 247, 115, 203, 24, 77, 239, - 139, 212, 138, 247, 115, 225, 212, 77, 239, 139, 212, 138, 247, 115, 224, - 20, 77, 239, 139, 212, 138, 247, 115, 211, 81, 77, 239, 139, 212, 138, - 247, 115, 224, 74, 77, 239, 139, 212, 138, 247, 115, 58, 225, 122, 212, - 138, 247, 115, 252, 16, 77, 244, 188, 212, 138, 247, 115, 99, 77, 244, - 188, 212, 138, 247, 115, 115, 77, 244, 188, 212, 138, 247, 115, 235, 7, - 77, 244, 188, 212, 138, 247, 115, 235, 101, 77, 244, 188, 212, 138, 247, - 115, 206, 29, 77, 244, 188, 212, 138, 247, 115, 207, 71, 77, 244, 188, - 212, 138, 247, 115, 237, 31, 77, 244, 188, 212, 138, 247, 115, 216, 179, - 77, 244, 188, 212, 138, 247, 115, 203, 24, 77, 244, 188, 212, 138, 247, - 115, 225, 212, 77, 244, 188, 212, 138, 247, 115, 224, 20, 77, 244, 188, - 212, 138, 247, 115, 211, 81, 77, 244, 188, 212, 138, 247, 115, 224, 74, - 77, 244, 188, 212, 138, 247, 115, 59, 225, 122, 212, 138, 247, 115, 235, - 38, 212, 138, 247, 115, 201, 141, 212, 138, 247, 115, 201, 130, 212, 138, - 247, 115, 201, 127, 212, 138, 247, 115, 201, 126, 212, 138, 247, 115, - 201, 125, 212, 138, 247, 115, 201, 124, 212, 138, 247, 115, 201, 123, - 212, 138, 247, 115, 201, 122, 212, 138, 247, 115, 201, 121, 212, 138, - 247, 115, 201, 140, 212, 138, 247, 115, 201, 139, 212, 138, 247, 115, - 201, 138, 212, 138, 247, 115, 201, 137, 212, 138, 247, 115, 201, 136, - 212, 138, 247, 115, 201, 135, 212, 138, 247, 115, 201, 134, 212, 138, - 247, 115, 201, 133, 212, 138, 247, 115, 201, 132, 212, 138, 247, 115, - 201, 131, 212, 138, 247, 115, 201, 129, 212, 138, 247, 115, 201, 128, 17, - 195, 80, 234, 217, 204, 226, 17, 195, 80, 244, 159, 17, 97, 244, 159, 17, - 99, 244, 159, 17, 115, 244, 159, 17, 235, 7, 244, 159, 17, 235, 101, 244, - 159, 17, 206, 29, 244, 159, 17, 207, 71, 244, 159, 17, 237, 31, 244, 159, - 17, 216, 179, 244, 159, 239, 93, 46, 45, 17, 195, 79, 239, 93, 217, 104, - 46, 45, 17, 195, 79, 119, 8, 6, 1, 63, 119, 8, 6, 1, 250, 112, 119, 8, 6, - 1, 247, 207, 119, 8, 6, 1, 240, 231, 119, 8, 6, 1, 69, 119, 8, 6, 1, 236, - 49, 119, 8, 6, 1, 234, 190, 119, 8, 6, 1, 233, 15, 119, 8, 6, 1, 68, 119, - 8, 6, 1, 225, 217, 119, 8, 6, 1, 225, 80, 119, 8, 6, 1, 159, 119, 8, 6, - 1, 221, 136, 119, 8, 6, 1, 218, 55, 119, 8, 6, 1, 72, 119, 8, 6, 1, 214, - 3, 119, 8, 6, 1, 211, 167, 119, 8, 6, 1, 144, 119, 8, 6, 1, 209, 80, 119, - 8, 6, 1, 203, 216, 119, 8, 6, 1, 66, 119, 8, 6, 1, 199, 230, 119, 8, 6, - 1, 197, 199, 119, 8, 6, 1, 196, 222, 119, 8, 6, 1, 196, 148, 119, 8, 6, - 1, 195, 158, 201, 231, 206, 245, 248, 61, 8, 6, 1, 209, 80, 46, 41, 8, 6, - 1, 247, 207, 46, 41, 8, 6, 1, 144, 46, 247, 58, 46, 196, 224, 241, 106, - 105, 103, 8, 6, 1, 63, 103, 8, 6, 1, 250, 112, 103, 8, 6, 1, 247, 207, - 103, 8, 6, 1, 240, 231, 103, 8, 6, 1, 69, 103, 8, 6, 1, 236, 49, 103, 8, - 6, 1, 234, 190, 103, 8, 6, 1, 233, 15, 103, 8, 6, 1, 68, 103, 8, 6, 1, - 225, 217, 103, 8, 6, 1, 225, 80, 103, 8, 6, 1, 159, 103, 8, 6, 1, 221, - 136, 103, 8, 6, 1, 218, 55, 103, 8, 6, 1, 72, 103, 8, 6, 1, 214, 3, 103, - 8, 6, 1, 211, 167, 103, 8, 6, 1, 144, 103, 8, 6, 1, 209, 80, 103, 8, 6, - 1, 203, 216, 103, 8, 6, 1, 66, 103, 8, 6, 1, 199, 230, 103, 8, 6, 1, 197, - 199, 103, 8, 6, 1, 196, 222, 103, 8, 6, 1, 196, 148, 103, 8, 6, 1, 195, - 158, 103, 231, 44, 103, 218, 79, 103, 208, 149, 103, 205, 83, 103, 212, - 52, 103, 197, 110, 217, 104, 46, 8, 6, 1, 63, 217, 104, 46, 8, 6, 1, 250, - 112, 217, 104, 46, 8, 6, 1, 247, 207, 217, 104, 46, 8, 6, 1, 240, 231, - 217, 104, 46, 8, 6, 1, 69, 217, 104, 46, 8, 6, 1, 236, 49, 217, 104, 46, - 8, 6, 1, 234, 190, 217, 104, 46, 8, 6, 1, 233, 15, 217, 104, 46, 8, 6, 1, - 68, 217, 104, 46, 8, 6, 1, 225, 217, 217, 104, 46, 8, 6, 1, 225, 80, 217, - 104, 46, 8, 6, 1, 159, 217, 104, 46, 8, 6, 1, 221, 136, 217, 104, 46, 8, - 6, 1, 218, 55, 217, 104, 46, 8, 6, 1, 72, 217, 104, 46, 8, 6, 1, 214, 3, - 217, 104, 46, 8, 6, 1, 211, 167, 217, 104, 46, 8, 6, 1, 144, 217, 104, - 46, 8, 6, 1, 209, 80, 217, 104, 46, 8, 6, 1, 203, 216, 217, 104, 46, 8, - 6, 1, 66, 217, 104, 46, 8, 6, 1, 199, 230, 217, 104, 46, 8, 6, 1, 197, - 199, 217, 104, 46, 8, 6, 1, 196, 222, 217, 104, 46, 8, 6, 1, 196, 148, - 217, 104, 46, 8, 6, 1, 195, 158, 210, 215, 219, 213, 55, 210, 215, 219, - 210, 55, 210, 215, 218, 150, 55, 217, 104, 103, 8, 6, 1, 63, 217, 104, - 103, 8, 6, 1, 250, 112, 217, 104, 103, 8, 6, 1, 247, 207, 217, 104, 103, - 8, 6, 1, 240, 231, 217, 104, 103, 8, 6, 1, 69, 217, 104, 103, 8, 6, 1, - 236, 49, 217, 104, 103, 8, 6, 1, 234, 190, 217, 104, 103, 8, 6, 1, 233, - 15, 217, 104, 103, 8, 6, 1, 68, 217, 104, 103, 8, 6, 1, 225, 217, 217, - 104, 103, 8, 6, 1, 225, 80, 217, 104, 103, 8, 6, 1, 159, 217, 104, 103, - 8, 6, 1, 221, 136, 217, 104, 103, 8, 6, 1, 218, 55, 217, 104, 103, 8, 6, - 1, 72, 217, 104, 103, 8, 6, 1, 214, 3, 217, 104, 103, 8, 6, 1, 211, 167, - 217, 104, 103, 8, 6, 1, 144, 217, 104, 103, 8, 6, 1, 209, 80, 217, 104, - 103, 8, 6, 1, 203, 216, 217, 104, 103, 8, 6, 1, 66, 217, 104, 103, 8, 6, - 1, 199, 230, 217, 104, 103, 8, 6, 1, 197, 199, 217, 104, 103, 8, 6, 1, - 196, 222, 217, 104, 103, 8, 6, 1, 196, 148, 217, 104, 103, 8, 6, 1, 195, - 158, 241, 59, 217, 104, 103, 8, 6, 1, 214, 3, 217, 104, 103, 230, 203, - 217, 104, 103, 161, 217, 104, 103, 183, 217, 104, 103, 252, 117, 217, - 104, 103, 197, 110, 47, 239, 48, 103, 244, 230, 103, 241, 113, 103, 234, - 245, 103, 230, 194, 103, 217, 82, 103, 217, 73, 103, 214, 139, 103, 205, - 166, 103, 124, 3, 236, 90, 78, 103, 198, 223, 103, 115, 240, 231, 103, - 208, 136, 208, 154, 103, 99, 225, 80, 103, 235, 7, 225, 80, 103, 237, 31, - 225, 80, 103, 235, 101, 212, 111, 100, 103, 207, 71, 212, 111, 100, 103, - 200, 223, 212, 111, 102, 103, 206, 14, 214, 3, 103, 97, 231, 58, 200, - 235, 214, 3, 103, 8, 4, 1, 240, 231, 103, 232, 150, 103, 232, 149, 103, - 232, 63, 103, 221, 217, 103, 206, 131, 103, 200, 91, 103, 198, 245, 210, - 150, 226, 69, 16, 1, 63, 210, 150, 226, 69, 16, 1, 250, 112, 210, 150, - 226, 69, 16, 1, 247, 207, 210, 150, 226, 69, 16, 1, 240, 231, 210, 150, - 226, 69, 16, 1, 69, 210, 150, 226, 69, 16, 1, 236, 49, 210, 150, 226, 69, - 16, 1, 234, 190, 210, 150, 226, 69, 16, 1, 233, 15, 210, 150, 226, 69, - 16, 1, 68, 210, 150, 226, 69, 16, 1, 225, 217, 210, 150, 226, 69, 16, 1, - 225, 80, 210, 150, 226, 69, 16, 1, 159, 210, 150, 226, 69, 16, 1, 221, - 136, 210, 150, 226, 69, 16, 1, 218, 55, 210, 150, 226, 69, 16, 1, 72, - 210, 150, 226, 69, 16, 1, 214, 3, 210, 150, 226, 69, 16, 1, 211, 167, - 210, 150, 226, 69, 16, 1, 144, 210, 150, 226, 69, 16, 1, 209, 80, 210, - 150, 226, 69, 16, 1, 203, 216, 210, 150, 226, 69, 16, 1, 66, 210, 150, - 226, 69, 16, 1, 199, 230, 210, 150, 226, 69, 16, 1, 197, 199, 210, 150, - 226, 69, 16, 1, 196, 222, 210, 150, 226, 69, 16, 1, 196, 148, 210, 150, - 226, 69, 16, 1, 195, 158, 47, 188, 231, 179, 103, 71, 223, 250, 103, 71, - 183, 103, 12, 200, 54, 228, 138, 103, 12, 200, 54, 228, 142, 103, 12, - 200, 54, 228, 150, 103, 71, 239, 252, 103, 12, 200, 54, 228, 157, 103, - 12, 200, 54, 228, 144, 103, 12, 200, 54, 228, 116, 103, 12, 200, 54, 228, - 143, 103, 12, 200, 54, 228, 156, 103, 12, 200, 54, 228, 130, 103, 12, - 200, 54, 228, 123, 103, 12, 200, 54, 228, 132, 103, 12, 200, 54, 228, - 153, 103, 12, 200, 54, 228, 139, 103, 12, 200, 54, 228, 155, 103, 12, - 200, 54, 228, 131, 103, 12, 200, 54, 228, 154, 103, 12, 200, 54, 228, - 117, 103, 12, 200, 54, 228, 122, 103, 12, 200, 54, 228, 115, 103, 12, - 200, 54, 228, 145, 103, 12, 200, 54, 228, 147, 103, 12, 200, 54, 228, - 125, 103, 12, 200, 54, 228, 136, 103, 12, 200, 54, 228, 134, 103, 12, - 200, 54, 228, 160, 103, 12, 200, 54, 228, 159, 103, 12, 200, 54, 228, - 113, 103, 12, 200, 54, 228, 140, 103, 12, 200, 54, 228, 158, 103, 12, - 200, 54, 228, 149, 103, 12, 200, 54, 228, 135, 103, 12, 200, 54, 228, - 114, 103, 12, 200, 54, 228, 137, 103, 12, 200, 54, 228, 119, 103, 12, - 200, 54, 228, 118, 103, 12, 200, 54, 228, 148, 103, 12, 200, 54, 228, - 126, 103, 12, 200, 54, 228, 128, 103, 12, 200, 54, 228, 129, 103, 12, - 200, 54, 228, 121, 103, 12, 200, 54, 228, 152, 103, 12, 200, 54, 228, - 146, 103, 12, 200, 54, 228, 112, 201, 231, 206, 245, 248, 61, 12, 200, - 54, 228, 127, 201, 231, 206, 245, 248, 61, 12, 200, 54, 228, 159, 201, - 231, 206, 245, 248, 61, 12, 200, 54, 228, 157, 201, 231, 206, 245, 248, - 61, 12, 200, 54, 228, 141, 201, 231, 206, 245, 248, 61, 12, 200, 54, 228, - 124, 201, 231, 206, 245, 248, 61, 12, 200, 54, 228, 137, 201, 231, 206, - 245, 248, 61, 12, 200, 54, 228, 120, 201, 231, 206, 245, 248, 61, 12, - 200, 54, 228, 151, 201, 231, 206, 245, 248, 61, 12, 200, 54, 228, 133, - 46, 230, 191, 251, 247, 46, 230, 191, 252, 20, 209, 185, 16, 36, 234, - 223, 209, 185, 16, 36, 221, 191, 209, 185, 16, 36, 206, 165, 209, 185, - 16, 36, 196, 196, 209, 185, 16, 36, 206, 148, 209, 185, 16, 36, 247, 162, - 240, 242, 235, 49, 244, 203, 200, 76, 216, 195, 3, 205, 4, 204, 106, 127, - 218, 168, 204, 105, 244, 234, 250, 169, 237, 174, 204, 104, 127, 248, 10, - 210, 216, 248, 40, 250, 169, 216, 194, 197, 128, 197, 122, 198, 239, 219, - 31, 197, 112, 237, 73, 233, 153, 236, 106, 237, 73, 233, 153, 251, 114, - 237, 73, 233, 153, 250, 188, 233, 153, 3, 219, 155, 217, 83, 218, 190, - 105, 197, 114, 241, 72, 218, 190, 105, 235, 113, 211, 88, 218, 190, 105, - 197, 114, 233, 188, 218, 190, 105, 234, 217, 218, 190, 105, 197, 142, - 233, 188, 218, 190, 105, 222, 221, 211, 88, 218, 190, 105, 197, 142, 241, - 72, 218, 190, 105, 241, 72, 218, 189, 217, 83, 218, 190, 3, 235, 233, - 235, 113, 211, 88, 218, 190, 3, 235, 233, 222, 221, 211, 88, 218, 190, 3, - 235, 233, 234, 217, 218, 190, 3, 235, 233, 204, 112, 3, 235, 233, 233, - 149, 205, 7, 206, 187, 205, 7, 202, 205, 58, 237, 209, 59, 204, 111, 59, - 204, 112, 3, 4, 244, 194, 59, 204, 112, 248, 236, 244, 194, 59, 204, 112, - 248, 236, 244, 195, 3, 210, 217, 244, 195, 3, 210, 217, 244, 195, 3, 205, - 206, 244, 195, 3, 222, 92, 244, 195, 3, 201, 235, 235, 50, 197, 51, 248, - 120, 235, 233, 231, 96, 239, 17, 203, 146, 247, 242, 245, 81, 208, 127, - 236, 100, 201, 190, 239, 245, 201, 190, 213, 207, 201, 190, 247, 167, - 231, 96, 213, 47, 201, 24, 245, 85, 248, 123, 209, 198, 232, 62, 204, - 109, 248, 123, 237, 77, 77, 220, 72, 237, 77, 77, 210, 60, 232, 96, 235, - 7, 222, 193, 244, 193, 220, 41, 222, 192, 235, 214, 222, 192, 222, 193, - 235, 57, 226, 87, 197, 50, 218, 90, 202, 15, 250, 149, 233, 108, 219, - 173, 197, 126, 203, 108, 222, 161, 249, 90, 212, 172, 210, 158, 251, 27, - 233, 91, 251, 27, 213, 85, 213, 89, 245, 86, 204, 209, 232, 218, 205, - 240, 77, 212, 152, 219, 200, 214, 120, 248, 104, 212, 64, 222, 172, 210, - 61, 241, 78, 210, 61, 249, 103, 241, 116, 210, 60, 241, 14, 26, 210, 60, - 204, 246, 248, 74, 205, 144, 248, 53, 234, 243, 234, 239, 209, 222, 204, - 59, 212, 66, 240, 85, 214, 166, 204, 78, 234, 240, 206, 157, 235, 112, - 247, 161, 3, 204, 51, 239, 188, 205, 186, 230, 202, 241, 76, 207, 7, 230, - 201, 230, 202, 241, 76, 237, 238, 241, 115, 245, 47, 154, 247, 132, 221, - 244, 241, 5, 231, 168, 212, 68, 206, 171, 248, 216, 248, 70, 212, 69, 77, - 235, 39, 241, 114, 235, 28, 26, 224, 21, 203, 57, 197, 37, 232, 187, 208, - 248, 248, 87, 26, 241, 27, 197, 47, 233, 157, 244, 178, 233, 157, 201, - 145, 237, 216, 248, 247, 218, 130, 244, 210, 248, 247, 218, 129, 249, - 141, 248, 86, 235, 28, 26, 224, 22, 3, 212, 139, 248, 87, 3, 212, 84, - 241, 103, 212, 86, 210, 62, 196, 254, 212, 26, 248, 153, 247, 160, 225, - 211, 245, 38, 201, 190, 235, 197, 245, 37, 235, 115, 235, 116, 205, 142, - 249, 101, 213, 129, 212, 85, 241, 152, 249, 103, 203, 112, 201, 190, 241, - 59, 235, 87, 212, 173, 239, 242, 225, 202, 239, 9, 247, 104, 204, 208, - 197, 51, 245, 63, 218, 190, 199, 21, 247, 23, 208, 167, 208, 197, 233, - 114, 247, 125, 232, 127, 3, 202, 68, 214, 120, 202, 218, 222, 184, 248, - 80, 77, 235, 61, 219, 33, 219, 196, 210, 129, 210, 62, 34, 224, 152, 3, - 225, 210, 204, 179, 219, 67, 222, 128, 205, 238, 241, 121, 224, 15, 249, - 5, 250, 198, 34, 216, 8, 249, 5, 239, 194, 34, 216, 8, 235, 131, 234, - 249, 251, 251, 202, 109, 247, 105, 231, 98, 235, 163, 197, 77, 209, 211, - 244, 180, 235, 107, 212, 102, 26, 235, 111, 219, 67, 218, 154, 247, 146, - 244, 253, 232, 133, 250, 207, 213, 211, 201, 243, 232, 165, 244, 239, - 203, 15, 202, 110, 244, 225, 248, 113, 213, 40, 250, 205, 199, 30, 234, - 97, 239, 86, 232, 31, 205, 231, 220, 116, 248, 166, 234, 98, 239, 132, - 248, 73, 235, 63, 212, 138, 247, 113, 34, 216, 13, 218, 120, 34, 216, 8, - 208, 181, 233, 59, 34, 224, 151, 201, 120, 199, 9, 34, 208, 159, 209, - 114, 206, 202, 3, 208, 200, 203, 20, 210, 236, 26, 249, 103, 206, 3, 26, - 206, 3, 248, 97, 249, 60, 26, 231, 161, 245, 87, 235, 93, 205, 205, 209, - 115, 204, 83, 205, 106, 219, 196, 201, 146, 231, 99, 210, 237, 251, 115, - 235, 36, 209, 128, 235, 36, 204, 54, 197, 94, 222, 97, 233, 134, 210, - 238, 218, 176, 210, 238, 247, 116, 241, 69, 249, 57, 26, 249, 103, 198, - 238, 235, 152, 231, 182, 204, 238, 26, 249, 103, 230, 202, 231, 182, 204, - 238, 26, 211, 219, 203, 153, 203, 20, 213, 230, 26, 249, 103, 205, 207, - 247, 121, 218, 169, 247, 144, 249, 8, 3, 200, 76, 248, 12, 241, 135, 231, - 88, 248, 10, 244, 233, 239, 198, 231, 88, 248, 11, 244, 223, 248, 11, - 239, 190, 239, 191, 225, 241, 217, 204, 213, 136, 205, 18, 231, 88, 248, - 11, 231, 88, 3, 234, 81, 214, 157, 248, 11, 225, 202, 212, 74, 214, 156, - 236, 105, 212, 74, 214, 156, 231, 97, 249, 84, 250, 138, 203, 29, 220, - 116, 231, 93, 221, 209, 231, 93, 241, 119, 204, 222, 208, 166, 239, 201, - 204, 222, 235, 222, 225, 222, 222, 233, 225, 202, 247, 94, 236, 105, 247, - 94, 59, 213, 59, 58, 213, 59, 197, 120, 59, 235, 93, 197, 120, 58, 235, - 93, 209, 197, 58, 209, 197, 223, 74, 249, 124, 210, 236, 26, 206, 134, - 248, 78, 26, 51, 251, 110, 236, 236, 73, 235, 102, 200, 199, 236, 236, - 73, 235, 102, 200, 196, 236, 236, 73, 235, 102, 200, 194, 236, 236, 73, - 235, 102, 200, 192, 236, 236, 73, 235, 102, 200, 190, 210, 198, 218, 166, - 214, 13, 197, 128, 248, 16, 241, 83, 202, 102, 222, 145, 210, 240, 247, - 92, 237, 223, 241, 67, 197, 80, 205, 214, 205, 212, 231, 98, 210, 210, - 233, 140, 206, 249, 218, 209, 209, 201, 245, 73, 239, 17, 212, 184, 248, - 114, 236, 255, 214, 169, 205, 121, 206, 244, 248, 15, 251, 69, 231, 167, - 223, 66, 248, 245, 235, 111, 201, 145, 235, 111, 248, 121, 201, 1, 232, - 163, 245, 74, 249, 141, 245, 74, 234, 233, 249, 141, 245, 74, 248, 156, - 213, 61, 224, 5, 212, 90, 237, 213, 247, 148, 249, 129, 247, 148, 239, 8, - 218, 167, 235, 233, 241, 84, 235, 233, 202, 103, 235, 233, 210, 241, 235, - 233, 247, 93, 235, 233, 237, 224, 235, 233, 205, 104, 197, 80, 231, 99, - 235, 233, 218, 210, 235, 233, 239, 18, 235, 233, 212, 185, 235, 233, 234, - 237, 235, 233, 232, 215, 235, 233, 197, 24, 235, 233, 249, 3, 235, 233, - 213, 187, 235, 233, 212, 185, 216, 20, 213, 105, 212, 12, 245, 58, 236, - 59, 236, 67, 237, 76, 216, 20, 218, 164, 201, 249, 59, 124, 212, 107, - 249, 136, 226, 72, 59, 135, 212, 107, 249, 136, 226, 72, 59, 50, 212, - 107, 249, 136, 226, 72, 59, 53, 212, 107, 249, 136, 226, 72, 235, 105, - 232, 210, 55, 197, 120, 232, 210, 55, 214, 140, 232, 210, 55, 202, 140, - 124, 55, 202, 140, 135, 55, 244, 224, 232, 185, 55, 192, 232, 185, 55, - 241, 53, 197, 20, 232, 165, 236, 62, 217, 108, 203, 214, 225, 192, 237, - 218, 224, 77, 248, 169, 197, 20, 244, 196, 211, 199, 232, 189, 212, 65, - 220, 50, 206, 194, 250, 164, 206, 194, 232, 47, 206, 194, 197, 20, 208, - 216, 197, 20, 248, 96, 235, 34, 247, 234, 226, 87, 206, 78, 247, 233, - 226, 87, 206, 78, 248, 68, 233, 169, 220, 62, 197, 21, 235, 211, 220, 63, - 26, 197, 22, 231, 176, 232, 184, 99, 219, 165, 231, 176, 232, 184, 99, - 197, 19, 231, 176, 232, 184, 212, 99, 214, 155, 197, 22, 3, 247, 252, - 237, 74, 248, 41, 3, 199, 109, 213, 29, 3, 248, 125, 232, 233, 220, 63, - 3, 233, 73, 212, 221, 220, 45, 220, 63, 3, 201, 9, 214, 132, 220, 62, - 214, 132, 197, 21, 249, 140, 241, 136, 197, 5, 212, 17, 225, 202, 214, - 150, 225, 202, 233, 139, 233, 200, 249, 141, 251, 95, 236, 72, 251, 154, - 251, 155, 218, 199, 226, 92, 205, 254, 226, 61, 239, 187, 213, 28, 233, - 67, 240, 90, 222, 58, 217, 229, 212, 98, 235, 234, 220, 7, 232, 232, 249, - 78, 212, 101, 203, 235, 212, 177, 224, 58, 78, 221, 209, 222, 135, 210, - 2, 234, 38, 204, 228, 224, 57, 248, 79, 241, 87, 3, 232, 126, 197, 101, - 248, 255, 232, 126, 248, 33, 232, 126, 99, 232, 124, 205, 140, 232, 126, - 233, 83, 232, 126, 232, 127, 3, 51, 248, 119, 232, 126, 233, 91, 232, - 126, 196, 62, 232, 126, 211, 200, 232, 126, 232, 127, 3, 210, 62, 210, - 83, 232, 124, 232, 127, 239, 242, 239, 141, 207, 21, 3, 39, 76, 226, 41, - 237, 2, 175, 248, 8, 251, 94, 105, 248, 105, 205, 243, 105, 244, 170, - 105, 205, 115, 204, 61, 105, 237, 209, 240, 66, 105, 212, 178, 77, 212, - 91, 235, 75, 248, 181, 239, 49, 105, 205, 132, 249, 101, 202, 160, 249, - 101, 59, 235, 62, 231, 58, 212, 105, 105, 218, 214, 249, 122, 241, 17, - 236, 92, 85, 239, 10, 55, 241, 74, 247, 114, 249, 83, 3, 196, 60, 55, - 249, 83, 3, 239, 10, 55, 249, 83, 3, 236, 108, 55, 249, 83, 3, 212, 63, - 55, 218, 214, 3, 197, 45, 245, 111, 3, 200, 24, 201, 186, 26, 196, 60, - 55, 208, 139, 213, 27, 241, 157, 248, 39, 219, 21, 235, 67, 239, 73, 214, - 76, 239, 78, 237, 169, 235, 138, 235, 47, 192, 235, 138, 235, 47, 213, - 228, 3, 241, 21, 213, 228, 235, 226, 200, 36, 247, 154, 203, 56, 247, - 154, 247, 115, 226, 72, 245, 111, 3, 200, 24, 201, 185, 245, 111, 3, 237, - 231, 201, 185, 249, 80, 245, 110, 244, 209, 211, 195, 209, 187, 211, 195, - 213, 160, 204, 218, 209, 122, 201, 177, 209, 122, 248, 101, 203, 151, - 222, 189, 216, 11, 216, 12, 3, 239, 241, 241, 86, 244, 203, 248, 102, - 192, 248, 102, 233, 91, 248, 102, 248, 119, 248, 102, 214, 71, 248, 102, - 248, 99, 217, 223, 249, 126, 208, 152, 219, 166, 203, 34, 210, 172, 213, - 226, 235, 194, 220, 116, 208, 196, 251, 66, 211, 220, 252, 3, 221, 211, - 245, 95, 219, 178, 214, 33, 201, 194, 226, 83, 201, 194, 213, 235, 237, - 129, 105, 226, 80, 236, 194, 236, 195, 3, 237, 231, 61, 57, 244, 203, - 220, 78, 3, 221, 201, 235, 93, 244, 203, 220, 78, 3, 210, 215, 235, 93, - 192, 220, 78, 3, 210, 215, 235, 93, 192, 220, 78, 3, 221, 201, 235, 93, - 212, 71, 212, 72, 231, 102, 217, 78, 218, 243, 212, 229, 218, 243, 212, - 230, 3, 91, 61, 250, 169, 222, 184, 199, 33, 218, 242, 218, 243, 212, - 230, 214, 158, 216, 51, 218, 243, 212, 228, 251, 67, 3, 249, 68, 247, - 146, 247, 147, 3, 235, 84, 199, 30, 247, 146, 203, 31, 210, 231, 199, 29, - 235, 131, 211, 254, 212, 81, 204, 240, 212, 40, 249, 7, 200, 219, 91, - 250, 214, 244, 205, 91, 26, 107, 192, 244, 250, 250, 214, 244, 205, 91, - 26, 107, 192, 244, 250, 250, 215, 3, 46, 97, 214, 20, 244, 205, 237, 231, - 26, 200, 24, 192, 244, 250, 250, 214, 251, 65, 237, 231, 26, 200, 24, - 192, 244, 250, 250, 214, 126, 248, 37, 105, 130, 248, 37, 105, 205, 137, - 3, 247, 139, 106, 205, 136, 205, 137, 3, 97, 205, 162, 197, 122, 205, - 137, 3, 115, 205, 162, 197, 121, 249, 50, 237, 2, 212, 130, 222, 179, - 220, 90, 233, 157, 210, 17, 220, 90, 233, 157, 221, 255, 3, 226, 53, 213, - 65, 244, 203, 221, 255, 3, 224, 153, 224, 153, 221, 254, 192, 221, 254, - 248, 229, 248, 230, 3, 247, 139, 106, 248, 100, 222, 66, 105, 210, 232, - 247, 227, 249, 139, 3, 107, 61, 57, 236, 222, 3, 107, 61, 57, 214, 120, - 3, 236, 90, 117, 3, 50, 53, 61, 57, 205, 170, 3, 91, 61, 57, 201, 243, 3, - 200, 24, 61, 57, 216, 51, 97, 200, 64, 237, 29, 105, 224, 150, 203, 23, - 226, 47, 16, 36, 8, 6, 222, 134, 226, 47, 16, 36, 8, 4, 222, 134, 226, - 47, 16, 36, 215, 143, 226, 47, 16, 36, 203, 249, 226, 47, 16, 36, 8, 222, - 134, 235, 118, 237, 2, 201, 238, 196, 252, 232, 216, 215, 126, 26, 248, - 107, 231, 183, 212, 158, 219, 66, 203, 32, 241, 43, 249, 103, 206, 29, - 212, 109, 205, 8, 3, 112, 238, 253, 225, 202, 16, 36, 248, 242, 201, 175, - 236, 238, 58, 47, 247, 227, 59, 47, 247, 227, 222, 228, 210, 158, 244, - 249, 222, 228, 248, 119, 244, 249, 222, 228, 214, 71, 239, 140, 222, 228, - 248, 119, 239, 140, 4, 214, 71, 239, 140, 4, 248, 119, 239, 140, 200, 35, - 210, 158, 201, 180, 237, 234, 210, 158, 201, 180, 200, 35, 4, 210, 158, - 201, 180, 237, 234, 4, 210, 158, 201, 180, 221, 203, 53, 207, 37, 59, - 244, 249, 200, 33, 53, 207, 37, 59, 244, 249, 46, 241, 62, 212, 95, 241, - 62, 212, 96, 3, 232, 222, 60, 241, 62, 212, 95, 216, 15, 50, 207, 108, 3, - 115, 238, 250, 216, 15, 53, 207, 108, 3, 115, 238, 250, 16, 36, 220, 23, - 247, 1, 59, 8, 241, 61, 85, 8, 241, 61, 247, 41, 241, 61, 214, 128, 105, - 237, 237, 77, 213, 90, 225, 53, 218, 182, 203, 243, 219, 161, 3, 216, - 179, 248, 56, 248, 75, 77, 231, 9, 244, 207, 235, 234, 97, 214, 175, 244, - 207, 235, 234, 99, 214, 175, 244, 207, 235, 234, 115, 214, 175, 244, 207, - 235, 234, 235, 7, 214, 175, 244, 207, 235, 234, 235, 101, 214, 175, 244, - 207, 235, 234, 206, 29, 214, 175, 244, 207, 235, 234, 207, 71, 214, 175, - 244, 207, 235, 234, 237, 31, 214, 175, 244, 207, 235, 234, 216, 179, 214, - 175, 244, 207, 235, 234, 203, 24, 214, 175, 244, 207, 235, 234, 236, 253, - 214, 175, 244, 207, 235, 234, 200, 240, 214, 175, 244, 207, 235, 234, - 214, 112, 244, 207, 235, 234, 200, 213, 244, 207, 235, 234, 202, 146, - 244, 207, 235, 234, 235, 3, 244, 207, 235, 234, 235, 99, 244, 207, 235, - 234, 206, 25, 244, 207, 235, 234, 207, 70, 244, 207, 235, 234, 237, 30, - 244, 207, 235, 234, 216, 178, 244, 207, 235, 234, 203, 22, 244, 207, 235, - 234, 236, 251, 244, 207, 235, 234, 200, 238, 53, 205, 136, 53, 205, 137, - 3, 97, 205, 162, 197, 122, 53, 205, 137, 3, 115, 205, 162, 197, 121, 248, - 3, 248, 4, 3, 205, 162, 197, 121, 210, 0, 248, 229, 248, 102, 247, 137, - 220, 47, 244, 206, 58, 205, 255, 26, 241, 60, 216, 51, 212, 164, 231, - 175, 220, 63, 226, 87, 247, 236, 204, 125, 222, 127, 205, 241, 214, 73, - 205, 95, 240, 71, 204, 107, 205, 124, 205, 125, 197, 102, 225, 111, 220, - 63, 240, 89, 50, 232, 210, 203, 34, 210, 172, 203, 34, 210, 173, 3, 213, - 227, 53, 232, 210, 203, 34, 210, 172, 59, 201, 224, 203, 33, 58, 201, - 224, 203, 33, 203, 34, 214, 120, 201, 243, 77, 218, 239, 244, 228, 218, - 243, 212, 229, 249, 139, 77, 236, 194, 205, 14, 236, 194, 236, 195, 3, - 222, 92, 235, 54, 236, 194, 213, 66, 127, 205, 14, 236, 194, 222, 65, - 213, 159, 58, 211, 195, 221, 203, 50, 213, 64, 221, 203, 50, 249, 97, - 213, 65, 221, 203, 50, 235, 9, 213, 65, 221, 203, 50, 213, 220, 221, 203, - 50, 241, 77, 50, 196, 246, 232, 209, 163, 214, 140, 232, 210, 55, 210, - 215, 232, 210, 3, 235, 123, 205, 114, 210, 89, 210, 215, 232, 210, 3, - 235, 123, 205, 114, 210, 89, 202, 140, 124, 55, 210, 89, 202, 140, 135, - 55, 210, 89, 199, 32, 232, 209, 210, 89, 232, 210, 3, 112, 235, 128, 236, - 78, 210, 215, 232, 210, 3, 213, 134, 248, 204, 112, 26, 210, 3, 235, 122, - 59, 135, 212, 107, 50, 232, 210, 226, 72, 206, 96, 59, 50, 212, 107, 226, - 72, 206, 96, 59, 53, 212, 107, 226, 72, 206, 96, 58, 50, 212, 107, 226, - 72, 206, 96, 58, 53, 212, 107, 226, 72, 58, 50, 212, 107, 249, 136, 226, - 72, 58, 53, 212, 107, 249, 136, 226, 72, 206, 96, 59, 124, 212, 107, 226, - 72, 206, 96, 59, 135, 212, 107, 226, 72, 206, 96, 58, 124, 212, 107, 226, - 72, 206, 96, 58, 135, 212, 107, 226, 72, 58, 124, 212, 107, 249, 136, - 226, 72, 58, 135, 212, 107, 249, 136, 226, 72, 58, 232, 126, 239, 186, - 241, 157, 224, 152, 26, 218, 166, 115, 217, 87, 241, 156, 212, 13, 212, - 115, 247, 156, 58, 232, 173, 206, 245, 235, 67, 239, 73, 59, 232, 173, - 206, 245, 235, 67, 239, 73, 205, 186, 206, 245, 235, 67, 239, 73, 203, - 104, 247, 98, 197, 40, 224, 151, 97, 247, 228, 218, 166, 99, 247, 228, - 218, 166, 115, 247, 228, 218, 166, 201, 215, 37, 213, 27, 241, 157, 232, - 173, 239, 73, 208, 154, 212, 14, 230, 195, 235, 194, 230, 195, 214, 76, - 239, 79, 230, 195, 239, 22, 3, 202, 237, 239, 22, 3, 202, 238, 26, 212, - 214, 239, 22, 3, 212, 214, 234, 251, 3, 212, 214, 234, 251, 3, 202, 82, - 234, 251, 3, 251, 107, 196, 222, 58, 235, 47, 235, 47, 192, 235, 47, 247, - 115, 132, 239, 58, 247, 115, 235, 138, 248, 70, 235, 138, 247, 169, 236, - 232, 216, 13, 236, 232, 216, 14, 213, 227, 236, 232, 216, 14, 213, 233, - 216, 13, 216, 14, 213, 227, 216, 14, 213, 233, 236, 232, 239, 21, 236, - 232, 213, 227, 236, 232, 213, 225, 239, 21, 213, 227, 213, 225, 197, 132, - 205, 121, 216, 14, 213, 233, 205, 121, 247, 155, 213, 233, 239, 186, 197, - 49, 219, 18, 219, 252, 214, 23, 244, 205, 53, 26, 50, 207, 108, 250, 214, - 247, 139, 196, 222, 226, 78, 235, 41, 206, 9, 105, 239, 240, 235, 41, - 206, 9, 105, 241, 158, 37, 224, 153, 209, 212, 217, 78, 213, 228, 3, 46, - 202, 237, 204, 230, 245, 110, 240, 119, 224, 21, 222, 59, 205, 135, 232, - 138, 226, 87, 206, 78, 115, 210, 189, 57, 115, 210, 189, 60, 115, 210, - 189, 222, 184, 115, 210, 189, 210, 22, 50, 205, 132, 248, 20, 53, 205, - 132, 248, 20, 99, 205, 132, 248, 19, 115, 205, 132, 248, 19, 50, 202, - 160, 248, 20, 53, 202, 160, 248, 20, 50, 251, 94, 248, 20, 53, 251, 94, - 248, 20, 218, 194, 248, 20, 222, 93, 218, 194, 248, 20, 222, 93, 218, - 193, 249, 99, 111, 3, 249, 98, 249, 99, 145, 196, 222, 249, 99, 111, 3, - 145, 196, 222, 249, 99, 27, 145, 196, 222, 249, 99, 111, 3, 27, 145, 196, - 222, 175, 245, 102, 78, 249, 99, 111, 3, 27, 245, 101, 197, 4, 220, 43, - 218, 171, 234, 218, 202, 17, 201, 220, 204, 253, 77, 222, 107, 206, 79, - 77, 225, 203, 218, 152, 233, 87, 235, 233, 233, 87, 235, 234, 3, 205, - 218, 236, 59, 235, 234, 3, 203, 52, 77, 225, 113, 205, 218, 235, 234, 3, - 192, 218, 164, 205, 218, 235, 234, 3, 192, 218, 165, 26, 205, 218, 236, - 59, 205, 218, 235, 234, 3, 192, 218, 165, 26, 244, 172, 204, 60, 205, - 218, 235, 234, 3, 192, 218, 165, 26, 202, 100, 236, 59, 205, 218, 235, - 234, 3, 232, 221, 205, 218, 235, 234, 3, 231, 101, 197, 42, 235, 233, - 205, 218, 235, 234, 3, 205, 218, 236, 59, 235, 234, 208, 186, 239, 220, - 235, 39, 210, 132, 235, 233, 205, 218, 235, 234, 3, 232, 125, 236, 59, - 205, 218, 235, 234, 3, 204, 107, 205, 217, 235, 233, 217, 85, 235, 233, - 236, 80, 235, 233, 200, 70, 235, 233, 235, 234, 3, 244, 172, 204, 60, - 213, 57, 235, 233, 241, 149, 235, 233, 241, 150, 235, 233, 224, 56, 235, - 233, 235, 234, 202, 143, 39, 224, 57, 224, 56, 235, 234, 3, 205, 218, - 236, 59, 224, 56, 235, 234, 3, 244, 203, 236, 59, 235, 234, 3, 204, 180, - 201, 249, 235, 234, 3, 204, 180, 201, 250, 26, 197, 42, 236, 67, 235, - 234, 3, 204, 180, 201, 250, 26, 202, 100, 236, 59, 239, 80, 235, 233, - 197, 3, 235, 233, 251, 86, 235, 233, 212, 62, 235, 233, 241, 45, 235, - 233, 213, 31, 235, 233, 235, 234, 3, 221, 228, 77, 201, 157, 239, 80, - 247, 232, 210, 132, 235, 233, 234, 229, 235, 234, 3, 192, 218, 164, 251, - 84, 235, 233, 235, 187, 235, 233, 197, 103, 235, 233, 205, 242, 235, 233, - 202, 62, 235, 233, 233, 88, 235, 233, 221, 212, 241, 45, 235, 233, 235, - 234, 3, 192, 218, 164, 231, 47, 235, 233, 235, 234, 3, 192, 218, 165, 26, - 244, 172, 204, 60, 235, 234, 208, 156, 226, 87, 235, 188, 250, 176, 235, - 233, 235, 59, 235, 233, 205, 243, 235, 233, 239, 49, 235, 233, 235, 234, - 197, 37, 218, 164, 235, 234, 3, 219, 193, 220, 9, 233, 87, 247, 93, 235, - 234, 3, 205, 218, 236, 59, 247, 93, 235, 234, 3, 203, 52, 77, 225, 113, - 205, 218, 247, 93, 235, 234, 3, 192, 218, 164, 205, 218, 247, 93, 235, - 234, 3, 232, 125, 236, 59, 247, 93, 235, 234, 3, 196, 244, 205, 219, 224, - 56, 247, 93, 235, 234, 3, 244, 203, 236, 59, 212, 62, 247, 93, 235, 233, - 241, 45, 247, 93, 235, 233, 197, 103, 247, 93, 235, 233, 205, 236, 234, - 229, 235, 233, 205, 236, 205, 218, 235, 233, 200, 30, 235, 233, 235, 234, - 3, 209, 210, 236, 59, 235, 234, 3, 216, 51, 233, 131, 234, 15, 235, 234, - 3, 214, 140, 234, 15, 213, 29, 248, 76, 239, 235, 208, 128, 218, 209, - 232, 129, 218, 209, 205, 138, 218, 209, 232, 176, 213, 29, 210, 213, 97, - 232, 209, 213, 29, 210, 213, 248, 88, 232, 185, 226, 87, 247, 43, 213, - 29, 234, 228, 213, 29, 3, 212, 62, 235, 233, 213, 29, 3, 235, 48, 232, - 184, 173, 197, 89, 212, 107, 222, 192, 205, 159, 197, 89, 212, 107, 222, - 192, 173, 237, 69, 212, 107, 222, 192, 205, 159, 237, 69, 212, 107, 222, - 192, 163, 173, 197, 89, 212, 107, 222, 192, 163, 205, 159, 197, 89, 212, - 107, 222, 192, 163, 173, 237, 69, 212, 107, 222, 192, 163, 205, 159, 237, - 69, 212, 107, 222, 192, 173, 197, 89, 212, 107, 199, 15, 222, 192, 205, - 159, 197, 89, 212, 107, 199, 15, 222, 192, 173, 237, 69, 212, 107, 199, - 15, 222, 192, 205, 159, 237, 69, 212, 107, 199, 15, 222, 192, 85, 173, - 197, 89, 212, 107, 199, 15, 222, 192, 85, 205, 159, 197, 89, 212, 107, - 199, 15, 222, 192, 85, 173, 237, 69, 212, 107, 199, 15, 222, 192, 85, - 205, 159, 237, 69, 212, 107, 199, 15, 222, 192, 173, 197, 89, 212, 107, - 248, 17, 205, 159, 197, 89, 212, 107, 248, 17, 173, 237, 69, 212, 107, - 248, 17, 205, 159, 237, 69, 212, 107, 248, 17, 85, 173, 197, 89, 212, - 107, 248, 17, 85, 205, 159, 197, 89, 212, 107, 248, 17, 85, 173, 237, 69, - 212, 107, 248, 17, 85, 205, 159, 237, 69, 212, 107, 248, 17, 231, 174, - 211, 72, 47, 214, 59, 231, 174, 211, 72, 47, 214, 60, 226, 87, 58, 205, - 94, 205, 179, 211, 72, 47, 214, 59, 205, 179, 211, 72, 47, 214, 60, 226, - 87, 58, 205, 94, 107, 209, 217, 200, 24, 209, 217, 91, 209, 217, 237, - 231, 209, 217, 145, 33, 236, 129, 214, 59, 85, 145, 33, 236, 129, 214, - 59, 33, 192, 236, 129, 214, 59, 85, 33, 192, 236, 129, 214, 59, 85, 251, - 112, 214, 59, 204, 63, 251, 112, 214, 59, 45, 85, 52, 163, 244, 160, 211, - 62, 117, 214, 59, 45, 85, 52, 244, 160, 211, 62, 117, 214, 59, 45, 85, - 126, 52, 244, 160, 211, 62, 117, 214, 59, 85, 226, 27, 214, 59, 45, 226, - 27, 214, 59, 85, 45, 226, 27, 214, 59, 199, 48, 85, 205, 177, 199, 48, - 85, 210, 90, 205, 177, 245, 100, 248, 113, 210, 90, 245, 100, 248, 113, - 209, 217, 232, 108, 204, 248, 221, 252, 210, 220, 247, 116, 232, 44, 201, - 207, 232, 44, 201, 208, 3, 248, 6, 216, 20, 201, 207, 219, 136, 175, 210, - 221, 204, 254, 201, 205, 201, 206, 247, 116, 247, 237, 214, 116, 247, - 237, 201, 153, 247, 238, 204, 226, 219, 22, 251, 116, 235, 119, 236, 214, - 212, 99, 247, 116, 214, 116, 212, 99, 247, 116, 203, 78, 214, 116, 203, - 78, 250, 137, 214, 116, 250, 137, 210, 165, 199, 110, 239, 216, 201, 144, - 250, 208, 221, 219, 201, 214, 218, 202, 218, 170, 210, 219, 204, 77, 210, - 219, 218, 170, 247, 168, 251, 231, 201, 204, 206, 207, 209, 184, 205, - 130, 231, 155, 201, 211, 222, 95, 83, 201, 211, 222, 95, 241, 136, 55, - 212, 99, 247, 100, 210, 83, 222, 95, 201, 177, 235, 94, 214, 120, 212, - 73, 239, 1, 216, 51, 236, 200, 55, 205, 216, 105, 216, 51, 205, 216, 105, - 211, 194, 222, 48, 226, 87, 225, 231, 212, 149, 105, 239, 29, 216, 19, - 222, 48, 105, 212, 67, 197, 128, 105, 216, 35, 197, 128, 105, 248, 180, - 216, 51, 248, 179, 248, 178, 218, 170, 248, 178, 213, 81, 216, 51, 213, - 80, 245, 65, 241, 54, 219, 160, 105, 197, 18, 105, 210, 99, 249, 141, - 105, 202, 18, 197, 128, 244, 200, 206, 162, 249, 53, 249, 51, 213, 118, - 241, 120, 241, 3, 249, 118, 244, 229, 50, 221, 181, 201, 181, 3, 209, - 185, 241, 100, 212, 1, 55, 46, 226, 61, 205, 160, 248, 67, 105, 233, 168, - 105, 241, 92, 26, 222, 239, 205, 243, 252, 19, 206, 185, 249, 117, 248, - 228, 248, 229, 248, 252, 212, 149, 77, 197, 2, 214, 172, 55, 206, 185, - 201, 154, 204, 176, 213, 224, 232, 40, 203, 26, 232, 217, 26, 196, 252, - 206, 220, 214, 145, 237, 206, 218, 174, 210, 220, 201, 216, 218, 177, - 248, 112, 200, 35, 219, 33, 251, 187, 200, 35, 251, 187, 200, 35, 4, 251, - 187, 4, 251, 187, 216, 24, 251, 187, 251, 188, 239, 200, 251, 188, 250, - 220, 208, 195, 214, 116, 235, 119, 236, 214, 239, 130, 221, 252, 213, - 122, 206, 207, 208, 160, 218, 177, 208, 160, 247, 127, 205, 245, 235, 54, - 208, 190, 206, 5, 250, 139, 210, 58, 150, 16, 36, 211, 68, 150, 16, 36, - 251, 189, 150, 16, 36, 235, 118, 150, 16, 36, 237, 72, 150, 16, 36, 197, - 127, 150, 16, 36, 251, 16, 150, 16, 36, 251, 17, 210, 152, 150, 16, 36, - 251, 17, 210, 151, 150, 16, 36, 251, 17, 198, 254, 150, 16, 36, 251, 17, - 198, 253, 150, 16, 36, 199, 12, 150, 16, 36, 199, 11, 150, 16, 36, 199, - 10, 150, 16, 36, 204, 118, 150, 16, 36, 212, 238, 204, 118, 150, 16, 36, - 58, 204, 118, 150, 16, 36, 219, 159, 204, 149, 150, 16, 36, 219, 159, - 204, 148, 150, 16, 36, 219, 159, 204, 147, 150, 16, 36, 244, 252, 150, - 16, 36, 208, 233, 150, 16, 36, 216, 167, 150, 16, 36, 198, 252, 150, 16, - 36, 198, 251, 150, 16, 36, 209, 218, 208, 233, 150, 16, 36, 209, 218, - 208, 232, 150, 16, 36, 233, 135, 150, 16, 36, 206, 75, 150, 16, 36, 225, - 254, 214, 66, 150, 16, 36, 225, 254, 214, 65, 150, 16, 36, 241, 66, 77, - 225, 253, 150, 16, 36, 210, 148, 77, 225, 253, 150, 16, 36, 241, 111, - 214, 66, 150, 16, 36, 225, 252, 214, 66, 150, 16, 36, 204, 150, 77, 241, - 110, 150, 16, 36, 241, 66, 77, 241, 110, 150, 16, 36, 241, 66, 77, 241, - 109, 150, 16, 36, 241, 111, 251, 59, 150, 16, 36, 208, 234, 77, 241, 111, - 251, 59, 150, 16, 36, 204, 150, 77, 208, 234, 77, 241, 110, 150, 16, 36, - 199, 104, 150, 16, 36, 202, 75, 214, 66, 150, 16, 36, 222, 196, 214, 66, - 150, 16, 36, 251, 58, 214, 66, 150, 16, 36, 204, 150, 77, 251, 57, 150, - 16, 36, 208, 234, 77, 251, 57, 150, 16, 36, 204, 150, 77, 208, 234, 77, - 251, 57, 150, 16, 36, 199, 13, 77, 251, 57, 150, 16, 36, 210, 148, 77, - 251, 57, 150, 16, 36, 210, 148, 77, 251, 56, 150, 16, 36, 210, 147, 150, - 16, 36, 210, 146, 150, 16, 36, 210, 145, 150, 16, 36, 210, 144, 150, 16, - 36, 251, 149, 150, 16, 36, 251, 148, 150, 16, 36, 220, 34, 150, 16, 36, - 208, 240, 150, 16, 36, 250, 213, 150, 16, 36, 210, 176, 150, 16, 36, 210, - 175, 150, 16, 36, 250, 141, 150, 16, 36, 248, 146, 214, 66, 150, 16, 36, - 203, 99, 150, 16, 36, 203, 98, 150, 16, 36, 211, 74, 222, 84, 150, 16, - 36, 248, 93, 150, 16, 36, 248, 92, 150, 16, 36, 248, 91, 150, 16, 36, - 251, 125, 150, 16, 36, 214, 144, 150, 16, 36, 205, 117, 150, 16, 36, 202, - 73, 150, 16, 36, 233, 55, 150, 16, 36, 197, 115, 150, 16, 36, 212, 61, - 150, 16, 36, 247, 151, 150, 16, 36, 200, 252, 150, 16, 36, 247, 118, 218, - 183, 150, 16, 36, 208, 170, 77, 225, 115, 150, 16, 36, 247, 165, 150, 16, - 36, 201, 174, 150, 16, 36, 205, 5, 201, 174, 150, 16, 36, 221, 251, 150, - 16, 36, 205, 191, 150, 16, 36, 200, 13, 150, 16, 36, 231, 99, 237, 184, - 150, 16, 36, 250, 190, 150, 16, 36, 212, 69, 250, 190, 150, 16, 36, 248, - 42, 150, 16, 36, 212, 60, 248, 42, 150, 16, 36, 251, 122, 150, 16, 36, - 204, 213, 204, 99, 204, 212, 150, 16, 36, 204, 213, 204, 99, 204, 211, - 150, 16, 36, 204, 146, 150, 16, 36, 212, 33, 150, 16, 36, 239, 68, 150, - 16, 36, 239, 70, 150, 16, 36, 239, 69, 150, 16, 36, 211, 203, 150, 16, - 36, 211, 192, 150, 16, 36, 241, 52, 150, 16, 36, 241, 51, 150, 16, 36, - 241, 50, 150, 16, 36, 241, 49, 150, 16, 36, 241, 48, 150, 16, 36, 251, - 163, 150, 16, 36, 249, 54, 77, 220, 15, 150, 16, 36, 249, 54, 77, 199, - 138, 150, 16, 36, 210, 97, 150, 16, 36, 231, 91, 150, 16, 36, 216, 194, - 150, 16, 36, 240, 53, 150, 16, 36, 218, 197, 150, 16, 36, 157, 237, 221, - 150, 16, 36, 157, 214, 37, 58, 222, 179, 225, 237, 53, 201, 180, 58, 200, - 35, 225, 237, 53, 201, 180, 58, 210, 17, 225, 237, 53, 201, 180, 58, 237, - 234, 225, 237, 53, 201, 180, 58, 205, 236, 4, 244, 249, 219, 190, 27, 59, - 244, 249, 27, 59, 244, 249, 85, 59, 244, 249, 199, 48, 85, 59, 244, 249, - 236, 71, 85, 59, 244, 249, 59, 244, 250, 241, 132, 58, 4, 244, 249, 209, - 187, 203, 100, 58, 202, 70, 205, 94, 58, 205, 236, 4, 205, 94, 175, 59, - 205, 94, 219, 190, 59, 205, 94, 27, 59, 205, 94, 85, 59, 205, 94, 199, - 48, 85, 59, 205, 94, 236, 71, 85, 59, 205, 94, 59, 47, 241, 132, 58, 199, - 48, 4, 205, 94, 59, 47, 241, 132, 58, 219, 190, 205, 94, 47, 203, 100, - 58, 202, 70, 239, 140, 58, 199, 48, 4, 239, 140, 58, 219, 190, 4, 239, - 140, 59, 239, 141, 241, 132, 58, 199, 48, 4, 239, 140, 59, 239, 141, 241, - 132, 58, 219, 190, 239, 140, 239, 141, 203, 100, 58, 202, 70, 221, 198, - 58, 199, 48, 4, 221, 198, 58, 219, 190, 4, 221, 198, 59, 221, 199, 241, - 132, 58, 4, 221, 198, 202, 188, 32, 241, 61, 175, 32, 241, 61, 219, 190, - 32, 241, 61, 27, 32, 241, 61, 199, 48, 27, 32, 241, 61, 199, 48, 85, 32, - 241, 61, 236, 71, 85, 32, 241, 61, 202, 188, 208, 230, 175, 208, 230, - 219, 190, 208, 230, 27, 208, 230, 85, 208, 230, 199, 48, 85, 208, 230, - 236, 71, 85, 208, 230, 175, 235, 101, 205, 110, 250, 179, 219, 190, 235, - 101, 205, 110, 250, 179, 27, 235, 101, 205, 110, 250, 179, 85, 235, 101, - 205, 110, 250, 179, 199, 48, 85, 235, 101, 205, 110, 250, 179, 236, 71, - 85, 235, 101, 205, 110, 250, 179, 175, 206, 29, 205, 110, 250, 179, 219, - 190, 206, 29, 205, 110, 250, 179, 27, 206, 29, 205, 110, 250, 179, 85, - 206, 29, 205, 110, 250, 179, 199, 48, 85, 206, 29, 205, 110, 250, 179, - 236, 71, 85, 206, 29, 205, 110, 250, 179, 175, 237, 31, 205, 110, 250, - 179, 219, 190, 237, 31, 205, 110, 250, 179, 27, 237, 31, 205, 110, 250, - 179, 85, 237, 31, 205, 110, 250, 179, 199, 48, 85, 237, 31, 205, 110, - 250, 179, 175, 115, 212, 109, 58, 205, 7, 219, 190, 115, 212, 109, 58, - 205, 7, 115, 212, 109, 58, 205, 7, 219, 190, 115, 212, 109, 212, 170, - 205, 7, 175, 235, 7, 212, 109, 58, 205, 7, 219, 190, 235, 7, 212, 109, - 58, 205, 7, 235, 7, 212, 109, 58, 205, 7, 219, 190, 235, 7, 212, 109, - 212, 170, 205, 7, 210, 90, 175, 235, 7, 212, 109, 212, 170, 205, 7, 175, - 235, 101, 212, 109, 58, 205, 7, 85, 235, 101, 212, 109, 58, 205, 7, 219, - 190, 206, 29, 212, 109, 58, 205, 7, 85, 206, 29, 212, 109, 58, 205, 7, - 206, 29, 212, 109, 212, 170, 205, 7, 219, 190, 237, 31, 212, 109, 58, - 205, 7, 85, 237, 31, 212, 109, 58, 205, 7, 199, 48, 85, 237, 31, 212, - 109, 58, 205, 7, 85, 237, 31, 212, 109, 212, 170, 205, 7, 175, 200, 240, - 212, 109, 58, 205, 7, 85, 200, 240, 212, 109, 58, 205, 7, 85, 200, 240, - 212, 109, 212, 170, 205, 7, 46, 201, 180, 217, 104, 46, 201, 180, 46, - 205, 94, 217, 104, 46, 205, 94, 222, 228, 214, 71, 244, 249, 222, 228, - 196, 62, 244, 249, 222, 228, 233, 91, 244, 249, 222, 228, 211, 200, 244, - 249, 222, 228, 248, 30, 244, 249, 222, 228, 210, 158, 205, 94, 222, 228, - 248, 119, 205, 94, 222, 228, 214, 71, 205, 94, 222, 228, 196, 62, 205, - 94, 222, 228, 233, 91, 205, 94, 222, 228, 211, 200, 205, 94, 222, 228, - 248, 30, 205, 94, 107, 61, 3, 4, 201, 181, 250, 217, 200, 24, 61, 3, 4, - 201, 181, 250, 217, 91, 61, 3, 4, 201, 181, 250, 217, 237, 231, 61, 3, 4, - 201, 181, 250, 217, 107, 61, 3, 219, 190, 201, 181, 250, 217, 200, 24, - 61, 3, 219, 190, 201, 181, 250, 217, 91, 61, 3, 219, 190, 201, 181, 250, - 217, 237, 231, 61, 3, 219, 190, 201, 181, 250, 217, 107, 61, 3, 222, 228, - 201, 181, 250, 217, 200, 24, 61, 3, 222, 228, 201, 181, 250, 217, 91, 61, - 3, 222, 228, 201, 181, 250, 217, 237, 231, 61, 3, 222, 228, 201, 181, - 250, 217, 107, 61, 3, 4, 236, 166, 250, 217, 200, 24, 61, 3, 4, 236, 166, - 250, 217, 91, 61, 3, 4, 236, 166, 250, 217, 237, 231, 61, 3, 4, 236, 166, - 250, 217, 107, 61, 3, 236, 166, 250, 217, 200, 24, 61, 3, 236, 166, 250, - 217, 91, 61, 3, 236, 166, 250, 217, 237, 231, 61, 3, 236, 166, 250, 217, - 85, 107, 61, 3, 236, 166, 250, 217, 85, 200, 24, 61, 3, 236, 166, 250, - 217, 85, 91, 61, 3, 236, 166, 250, 217, 85, 237, 231, 61, 3, 236, 166, - 250, 217, 85, 107, 61, 3, 222, 228, 236, 166, 250, 217, 85, 200, 24, 61, - 3, 222, 228, 236, 166, 250, 217, 85, 91, 61, 3, 222, 228, 236, 166, 250, - 217, 85, 237, 231, 61, 3, 222, 228, 236, 166, 250, 217, 107, 201, 179, - 61, 3, 217, 210, 207, 35, 200, 24, 201, 179, 61, 3, 217, 210, 207, 35, - 91, 201, 179, 61, 3, 217, 210, 207, 35, 237, 231, 201, 179, 61, 3, 217, - 210, 207, 35, 107, 201, 179, 61, 3, 219, 190, 207, 35, 200, 24, 201, 179, - 61, 3, 219, 190, 207, 35, 91, 201, 179, 61, 3, 219, 190, 207, 35, 237, - 231, 201, 179, 61, 3, 219, 190, 207, 35, 107, 201, 179, 61, 3, 27, 207, - 35, 200, 24, 201, 179, 61, 3, 27, 207, 35, 91, 201, 179, 61, 3, 27, 207, - 35, 237, 231, 201, 179, 61, 3, 27, 207, 35, 107, 201, 179, 61, 3, 85, - 207, 35, 200, 24, 201, 179, 61, 3, 85, 207, 35, 91, 201, 179, 61, 3, 85, - 207, 35, 237, 231, 201, 179, 61, 3, 85, 207, 35, 107, 201, 179, 61, 3, - 199, 48, 85, 207, 35, 200, 24, 201, 179, 61, 3, 199, 48, 85, 207, 35, 91, - 201, 179, 61, 3, 199, 48, 85, 207, 35, 237, 231, 201, 179, 61, 3, 199, - 48, 85, 207, 35, 107, 235, 126, 51, 200, 24, 235, 126, 51, 91, 235, 126, - 51, 237, 231, 235, 126, 51, 107, 103, 51, 200, 24, 103, 51, 91, 103, 51, - 237, 231, 103, 51, 107, 241, 159, 51, 200, 24, 241, 159, 51, 91, 241, - 159, 51, 237, 231, 241, 159, 51, 107, 85, 241, 159, 51, 200, 24, 85, 241, - 159, 51, 91, 85, 241, 159, 51, 237, 231, 85, 241, 159, 51, 107, 85, 51, - 200, 24, 85, 51, 91, 85, 51, 237, 231, 85, 51, 107, 45, 51, 200, 24, 45, - 51, 91, 45, 51, 237, 231, 45, 51, 173, 197, 89, 45, 51, 173, 237, 69, 45, - 51, 205, 159, 237, 69, 45, 51, 205, 159, 197, 89, 45, 51, 50, 53, 45, 51, - 124, 135, 45, 51, 197, 61, 107, 175, 165, 51, 197, 61, 200, 24, 175, 165, - 51, 197, 61, 91, 175, 165, 51, 197, 61, 237, 231, 175, 165, 51, 197, 61, - 173, 197, 89, 175, 165, 51, 197, 61, 173, 237, 69, 175, 165, 51, 197, 61, - 205, 159, 237, 69, 175, 165, 51, 197, 61, 205, 159, 197, 89, 175, 165, - 51, 197, 61, 107, 165, 51, 197, 61, 200, 24, 165, 51, 197, 61, 91, 165, - 51, 197, 61, 237, 231, 165, 51, 197, 61, 173, 197, 89, 165, 51, 197, 61, - 173, 237, 69, 165, 51, 197, 61, 205, 159, 237, 69, 165, 51, 197, 61, 205, - 159, 197, 89, 165, 51, 197, 61, 107, 219, 190, 165, 51, 197, 61, 200, 24, - 219, 190, 165, 51, 197, 61, 91, 219, 190, 165, 51, 197, 61, 237, 231, - 219, 190, 165, 51, 197, 61, 173, 197, 89, 219, 190, 165, 51, 197, 61, - 173, 237, 69, 219, 190, 165, 51, 197, 61, 205, 159, 237, 69, 219, 190, - 165, 51, 197, 61, 205, 159, 197, 89, 219, 190, 165, 51, 197, 61, 107, 85, - 165, 51, 197, 61, 200, 24, 85, 165, 51, 197, 61, 91, 85, 165, 51, 197, - 61, 237, 231, 85, 165, 51, 197, 61, 173, 197, 89, 85, 165, 51, 197, 61, - 173, 237, 69, 85, 165, 51, 197, 61, 205, 159, 237, 69, 85, 165, 51, 197, - 61, 205, 159, 197, 89, 85, 165, 51, 197, 61, 107, 199, 48, 85, 165, 51, - 197, 61, 200, 24, 199, 48, 85, 165, 51, 197, 61, 91, 199, 48, 85, 165, - 51, 197, 61, 237, 231, 199, 48, 85, 165, 51, 197, 61, 173, 197, 89, 199, - 48, 85, 165, 51, 197, 61, 173, 237, 69, 199, 48, 85, 165, 51, 197, 61, - 205, 159, 237, 69, 199, 48, 85, 165, 51, 197, 61, 205, 159, 197, 89, 199, - 48, 85, 165, 51, 107, 201, 181, 250, 217, 200, 24, 201, 181, 250, 217, - 91, 201, 181, 250, 217, 237, 231, 201, 181, 250, 217, 107, 59, 61, 197, - 39, 201, 181, 250, 217, 200, 24, 59, 61, 197, 39, 201, 181, 250, 217, 91, - 59, 61, 197, 39, 201, 181, 250, 217, 237, 231, 59, 61, 197, 39, 201, 181, - 250, 217, 107, 61, 3, 216, 15, 203, 135, 200, 24, 61, 3, 216, 15, 203, - 135, 91, 61, 3, 216, 15, 203, 135, 237, 231, 61, 3, 216, 15, 203, 135, - 85, 61, 207, 36, 197, 59, 100, 85, 61, 207, 36, 197, 59, 99, 202, 181, - 85, 61, 207, 36, 197, 59, 97, 232, 225, 85, 61, 207, 36, 197, 59, 97, - 202, 184, 107, 248, 82, 59, 51, 91, 248, 85, 207, 38, 59, 51, 107, 201, - 243, 207, 38, 59, 51, 91, 201, 243, 207, 38, 59, 51, 107, 222, 178, 59, - 51, 91, 210, 16, 59, 51, 107, 210, 16, 59, 51, 91, 222, 178, 59, 51, 107, - 249, 137, 207, 37, 59, 51, 91, 249, 137, 207, 37, 59, 51, 107, 234, 232, - 207, 37, 59, 51, 91, 234, 232, 207, 37, 59, 51, 59, 61, 207, 36, 197, 59, - 100, 59, 61, 207, 36, 197, 59, 99, 202, 181, 46, 241, 62, 235, 21, 3, - 235, 7, 238, 250, 46, 241, 62, 235, 21, 3, 99, 238, 250, 46, 241, 62, - 235, 20, 50, 157, 244, 250, 3, 235, 7, 238, 250, 50, 157, 244, 250, 3, - 115, 238, 250, 50, 157, 244, 250, 3, 99, 238, 250, 50, 157, 244, 250, 3, - 238, 253, 50, 157, 244, 249, 237, 232, 235, 226, 122, 237, 232, 235, 226, - 216, 15, 122, 237, 232, 235, 226, 231, 165, 3, 238, 253, 237, 232, 235, - 226, 216, 15, 231, 165, 3, 238, 253, 59, 232, 126, 248, 30, 232, 126, - 212, 174, 232, 209, 195, 20, 235, 233, 218, 213, 235, 233, 235, 234, 3, - 202, 205, 217, 92, 235, 233, 202, 186, 235, 233, 235, 234, 3, 232, 136, - 209, 220, 235, 233, 231, 66, 235, 233, 2, 77, 202, 218, 231, 101, 247, - 153, 219, 208, 232, 209, 210, 215, 249, 139, 77, 232, 209, 222, 183, 235, - 106, 210, 21, 235, 106, 232, 183, 232, 210, 3, 132, 26, 112, 235, 123, - 241, 58, 230, 249, 221, 209, 195, 231, 232, 210, 55, 235, 234, 3, 241, - 82, 232, 165, 244, 192, 235, 233, 217, 199, 235, 233, 209, 210, 214, 120, - 202, 218, 235, 70, 222, 214, 237, 212, 235, 233, 221, 146, 235, 233, 235, - 234, 213, 206, 205, 210, 235, 233, 235, 234, 3, 97, 236, 66, 210, 214, - 233, 87, 235, 234, 3, 205, 8, 236, 59, 233, 87, 235, 234, 3, 97, 222, - 228, 26, 97, 4, 236, 67, 235, 234, 3, 235, 128, 241, 85, 244, 203, 222, - 59, 207, 82, 235, 234, 3, 203, 250, 241, 85, 218, 164, 205, 218, 235, - 234, 3, 205, 218, 236, 60, 26, 232, 210, 241, 85, 218, 164, 235, 234, 3, - 192, 218, 165, 198, 234, 206, 196, 235, 234, 3, 236, 82, 232, 137, 212, - 30, 197, 21, 248, 50, 213, 205, 124, 202, 19, 207, 111, 212, 18, 220, 63, - 226, 87, 200, 248, 218, 179, 245, 37, 206, 155, 213, 29, 239, 14, 247, - 97, 225, 105, 235, 168, 218, 238, 213, 52, 196, 251, 197, 128, 212, 97, - 232, 188, 239, 55, 220, 9, 197, 53, 235, 62, 237, 207, 3, 237, 205, 244, - 210, 233, 156, 201, 20, 233, 157, 205, 107, 233, 142, 217, 88, 210, 23, - 235, 113, 212, 149, 219, 196, 208, 136, 212, 149, 219, 196, 202, 185, - 212, 149, 219, 196, 248, 69, 233, 151, 220, 19, 250, 206, 200, 53, 241, - 19, 204, 228, 223, 67, 204, 238, 26, 249, 103, 205, 185, 235, 54, 239, - 78, 241, 65, 250, 128, 241, 34, 249, 130, 212, 66, 247, 101, 249, 116, - 248, 53, 233, 91, 208, 238, 207, 28, 213, 192, 77, 235, 39, 204, 177, - 235, 81, 237, 45, 233, 158, 77, 219, 32, 213, 86, 224, 51, 213, 188, 237, - 189, 235, 16, 241, 115, 203, 127, 248, 70, 245, 43, 248, 75, 3, 205, 107, - 241, 28, 3, 204, 210, 244, 177, 248, 34, 212, 213, 212, 22, 241, 2, 77, - 219, 199, 208, 214, 247, 129, 235, 39, 222, 191, 233, 90, 220, 54, 218, - 190, 247, 160, 249, 119, 205, 218, 235, 234, 3, 205, 218, 236, 60, 26, - 115, 232, 124, 196, 76, 235, 233, 235, 234, 3, 213, 129, 231, 103, 26, - 213, 129, 232, 165, 235, 234, 3, 200, 57, 236, 60, 26, 197, 119, 218, - 164, 214, 25, 235, 233, 234, 244, 235, 233, 235, 234, 3, 212, 136, 236, - 59, 208, 202, 223, 76, 244, 179, 233, 138, 232, 42, 248, 97, 235, 83, - 206, 194, 241, 79, 222, 63, 235, 233, 208, 158, 201, 8, 200, 55, 235, - 233, 237, 79, 237, 197, 249, 56, 207, 14, 214, 15, 234, 255, 235, 233, - 247, 229, 239, 234, 233, 124, 222, 42, 210, 76, 206, 157, 205, 88, 233, - 170, 235, 233, 195, 86, 235, 233, 232, 119, 208, 187, 203, 215, 241, 68, - 225, 12, 222, 34, 213, 88, 232, 34, 213, 135, 210, 239, 222, 5, 218, 181, - 219, 68, 249, 125, 204, 65, 205, 230, 214, 42, 214, 70, 205, 253, 235, - 85, 214, 5, 233, 60, 239, 17, 212, 7, 247, 131, 236, 236, 244, 149, 210, - 158, 232, 233, 236, 236, 244, 149, 241, 18, 232, 233, 236, 236, 244, 149, - 249, 105, 236, 236, 244, 149, 59, 232, 233, 248, 104, 222, 172, 235, 37, - 201, 244, 204, 97, 204, 92, 209, 4, 199, 46, 237, 77, 3, 232, 128, 251, - 199, 218, 175, 197, 75, 220, 46, 197, 75, 219, 198, 250, 231, 219, 198, - 222, 172, 245, 94, 197, 100, 241, 26, 208, 234, 207, 32, 248, 202, 248, - 70, 234, 80, 214, 108, 235, 215, 197, 155, 247, 230, 220, 3, 237, 216, - 230, 202, 241, 36, 205, 10, 213, 28, 224, 23, 213, 28, 239, 250, 213, 28, - 235, 234, 3, 218, 208, 251, 249, 245, 66, 214, 132, 251, 249, 249, 1, - 213, 28, 213, 29, 3, 232, 132, 213, 29, 226, 87, 204, 245, 209, 202, 213, - 29, 244, 212, 213, 29, 226, 87, 221, 214, 212, 78, 220, 92, 235, 217, - 199, 141, 219, 152, 236, 250, 234, 31, 195, 9, 248, 60, 214, 71, 232, - 126, 248, 167, 247, 125, 208, 171, 233, 150, 244, 179, 205, 188, 210, - 158, 233, 182, 236, 194, 235, 117, 225, 166, 211, 188, 212, 212, 203, 3, - 201, 30, 213, 13, 239, 75, 239, 30, 52, 232, 107, 244, 154, 252, 33, 235, - 119, 236, 76, 201, 246, 248, 42, 220, 91, 221, 181, 221, 215, 248, 86, - 205, 108, 77, 202, 156, 249, 104, 77, 196, 89, 209, 4, 212, 176, 203, 51, - 249, 2, 248, 31, 249, 61, 209, 213, 77, 213, 161, 249, 80, 77, 205, 191, - 205, 109, 210, 174, 217, 193, 251, 108, 217, 85, 245, 83, 224, 73, 217, - 85, 245, 83, 211, 80, 217, 85, 245, 83, 209, 203, 217, 85, 245, 83, 248, - 148, 217, 85, 245, 83, 224, 19, 217, 85, 245, 83, 213, 103, 59, 245, 83, - 224, 20, 209, 194, 235, 13, 239, 230, 58, 245, 83, 224, 20, 209, 194, - 235, 13, 239, 230, 217, 85, 245, 83, 224, 20, 209, 194, 235, 13, 239, - 230, 59, 245, 83, 224, 74, 209, 194, 216, 175, 239, 230, 59, 245, 83, - 211, 81, 209, 194, 216, 175, 239, 230, 59, 245, 83, 209, 204, 209, 194, - 216, 175, 239, 230, 59, 245, 83, 248, 149, 209, 194, 216, 175, 239, 230, - 59, 245, 83, 224, 20, 209, 194, 216, 175, 239, 230, 59, 245, 83, 213, - 104, 209, 194, 216, 175, 239, 230, 58, 245, 83, 224, 74, 209, 194, 216, - 175, 239, 230, 58, 245, 83, 211, 81, 209, 194, 216, 175, 239, 230, 58, - 245, 83, 209, 204, 209, 194, 216, 175, 239, 230, 58, 245, 83, 248, 149, - 209, 194, 216, 175, 239, 230, 58, 245, 83, 224, 20, 209, 194, 216, 175, - 239, 230, 58, 245, 83, 213, 104, 209, 194, 216, 175, 239, 230, 217, 85, - 245, 83, 224, 74, 209, 194, 216, 175, 239, 230, 217, 85, 245, 83, 211, - 81, 209, 194, 216, 175, 239, 230, 217, 85, 245, 83, 209, 204, 209, 194, - 216, 175, 239, 230, 217, 85, 245, 83, 248, 149, 209, 194, 216, 175, 239, - 230, 217, 85, 245, 83, 224, 20, 209, 194, 216, 175, 239, 230, 217, 85, - 245, 83, 213, 104, 209, 194, 216, 175, 239, 230, 59, 245, 83, 224, 20, - 209, 194, 97, 231, 58, 202, 176, 239, 230, 58, 245, 83, 224, 20, 209, - 194, 97, 231, 58, 202, 176, 239, 230, 217, 85, 245, 83, 224, 20, 209, - 194, 97, 231, 58, 202, 176, 239, 230, 59, 245, 83, 163, 224, 73, 59, 245, - 83, 163, 211, 80, 59, 245, 83, 163, 209, 203, 59, 245, 83, 163, 248, 148, - 59, 245, 83, 163, 224, 19, 59, 245, 83, 163, 213, 103, 58, 245, 83, 163, - 224, 73, 58, 245, 83, 163, 211, 80, 58, 245, 83, 163, 209, 203, 58, 245, - 83, 163, 248, 148, 58, 245, 83, 163, 224, 19, 58, 245, 83, 163, 213, 103, - 217, 85, 245, 83, 163, 224, 73, 217, 85, 245, 83, 163, 211, 80, 217, 85, - 245, 83, 163, 209, 203, 217, 85, 245, 83, 163, 248, 148, 217, 85, 245, - 83, 163, 224, 19, 217, 85, 245, 83, 163, 213, 103, 59, 245, 83, 224, 20, - 209, 194, 99, 231, 58, 200, 231, 239, 230, 58, 245, 83, 224, 20, 209, - 194, 99, 231, 58, 200, 231, 239, 230, 217, 85, 245, 83, 224, 20, 209, - 194, 99, 231, 58, 200, 231, 239, 230, 59, 245, 83, 224, 74, 209, 194, 99, - 231, 58, 207, 66, 239, 230, 59, 245, 83, 211, 81, 209, 194, 99, 231, 58, - 207, 66, 239, 230, 59, 245, 83, 209, 204, 209, 194, 99, 231, 58, 207, 66, - 239, 230, 59, 245, 83, 248, 149, 209, 194, 99, 231, 58, 207, 66, 239, - 230, 59, 245, 83, 224, 20, 209, 194, 99, 231, 58, 207, 66, 239, 230, 59, - 245, 83, 213, 104, 209, 194, 99, 231, 58, 207, 66, 239, 230, 58, 245, 83, - 224, 74, 209, 194, 99, 231, 58, 207, 66, 239, 230, 58, 245, 83, 211, 81, - 209, 194, 99, 231, 58, 207, 66, 239, 230, 58, 245, 83, 209, 204, 209, - 194, 99, 231, 58, 207, 66, 239, 230, 58, 245, 83, 248, 149, 209, 194, 99, - 231, 58, 207, 66, 239, 230, 58, 245, 83, 224, 20, 209, 194, 99, 231, 58, - 207, 66, 239, 230, 58, 245, 83, 213, 104, 209, 194, 99, 231, 58, 207, 66, - 239, 230, 217, 85, 245, 83, 224, 74, 209, 194, 99, 231, 58, 207, 66, 239, - 230, 217, 85, 245, 83, 211, 81, 209, 194, 99, 231, 58, 207, 66, 239, 230, - 217, 85, 245, 83, 209, 204, 209, 194, 99, 231, 58, 207, 66, 239, 230, - 217, 85, 245, 83, 248, 149, 209, 194, 99, 231, 58, 207, 66, 239, 230, - 217, 85, 245, 83, 224, 20, 209, 194, 99, 231, 58, 207, 66, 239, 230, 217, - 85, 245, 83, 213, 104, 209, 194, 99, 231, 58, 207, 66, 239, 230, 59, 245, - 83, 224, 20, 209, 194, 115, 231, 58, 235, 150, 239, 230, 58, 245, 83, - 224, 20, 209, 194, 115, 231, 58, 235, 150, 239, 230, 217, 85, 245, 83, - 224, 20, 209, 194, 115, 231, 58, 235, 150, 239, 230, 59, 245, 83, 236, - 167, 58, 245, 83, 236, 167, 217, 85, 245, 83, 236, 167, 59, 245, 83, 236, - 168, 209, 194, 216, 175, 239, 230, 58, 245, 83, 236, 168, 209, 194, 216, - 175, 239, 230, 217, 85, 245, 83, 236, 168, 209, 194, 216, 175, 239, 230, - 59, 245, 83, 224, 17, 59, 245, 83, 224, 16, 59, 245, 83, 224, 18, 58, - 245, 83, 224, 17, 58, 245, 83, 224, 16, 58, 245, 83, 224, 18, 196, 194, - 210, 158, 234, 33, 196, 194, 210, 158, 220, 56, 196, 194, 210, 158, 236, - 255, 196, 194, 210, 158, 231, 98, 196, 194, 210, 158, 245, 112, 196, 194, - 210, 158, 247, 128, 196, 194, 210, 158, 205, 180, 196, 194, 58, 234, 33, - 196, 194, 58, 220, 56, 196, 194, 58, 236, 255, 196, 194, 58, 231, 98, - 196, 194, 58, 245, 112, 196, 194, 58, 247, 128, 196, 194, 58, 205, 180, - 249, 102, 206, 193, 214, 113, 204, 52, 248, 38, 206, 167, 237, 211, 77, - 248, 124, 251, 255, 249, 88, 204, 239, 195, 244, 224, 54, 213, 155, 210, - 1, 212, 141, 247, 11, 210, 187, 250, 123, 239, 50, 222, 239, 249, 86, 12, - 15, 230, 190, 12, 15, 230, 189, 12, 15, 230, 188, 12, 15, 230, 187, 12, - 15, 230, 186, 12, 15, 230, 185, 12, 15, 230, 184, 12, 15, 230, 183, 12, - 15, 230, 182, 12, 15, 230, 181, 12, 15, 230, 180, 12, 15, 230, 179, 12, - 15, 230, 178, 12, 15, 230, 177, 12, 15, 230, 176, 12, 15, 230, 175, 12, - 15, 230, 174, 12, 15, 230, 173, 12, 15, 230, 172, 12, 15, 230, 171, 12, - 15, 230, 170, 12, 15, 230, 169, 12, 15, 230, 168, 12, 15, 230, 167, 12, - 15, 230, 166, 12, 15, 230, 165, 12, 15, 230, 164, 12, 15, 230, 163, 12, - 15, 230, 162, 12, 15, 230, 161, 12, 15, 230, 160, 12, 15, 230, 159, 12, - 15, 230, 158, 12, 15, 230, 157, 12, 15, 230, 156, 12, 15, 230, 155, 12, - 15, 230, 154, 12, 15, 230, 153, 12, 15, 230, 152, 12, 15, 230, 151, 12, - 15, 230, 150, 12, 15, 230, 149, 12, 15, 230, 148, 12, 15, 230, 147, 12, - 15, 230, 146, 12, 15, 230, 145, 12, 15, 230, 144, 12, 15, 230, 143, 12, - 15, 230, 142, 12, 15, 230, 141, 12, 15, 230, 140, 12, 15, 230, 139, 12, - 15, 230, 138, 12, 15, 230, 137, 12, 15, 230, 136, 12, 15, 230, 135, 12, - 15, 230, 134, 12, 15, 230, 133, 12, 15, 230, 132, 12, 15, 230, 131, 12, - 15, 230, 130, 12, 15, 230, 129, 12, 15, 230, 128, 12, 15, 230, 127, 12, - 15, 230, 126, 12, 15, 230, 125, 12, 15, 230, 124, 12, 15, 230, 123, 12, - 15, 230, 122, 12, 15, 230, 121, 12, 15, 230, 120, 12, 15, 230, 119, 12, - 15, 230, 118, 12, 15, 230, 117, 12, 15, 230, 116, 12, 15, 230, 115, 12, - 15, 230, 114, 12, 15, 230, 113, 12, 15, 230, 112, 12, 15, 230, 111, 12, - 15, 230, 110, 12, 15, 230, 109, 12, 15, 230, 108, 12, 15, 230, 107, 12, - 15, 230, 106, 12, 15, 230, 105, 12, 15, 230, 104, 12, 15, 230, 103, 12, - 15, 230, 102, 12, 15, 230, 101, 12, 15, 230, 100, 12, 15, 230, 99, 12, - 15, 230, 98, 12, 15, 230, 97, 12, 15, 230, 96, 12, 15, 230, 95, 12, 15, - 230, 94, 12, 15, 230, 93, 12, 15, 230, 92, 12, 15, 230, 91, 12, 15, 230, - 90, 12, 15, 230, 89, 12, 15, 230, 88, 12, 15, 230, 87, 12, 15, 230, 86, - 12, 15, 230, 85, 12, 15, 230, 84, 12, 15, 230, 83, 12, 15, 230, 82, 12, - 15, 230, 81, 12, 15, 230, 80, 12, 15, 230, 79, 12, 15, 230, 78, 12, 15, - 230, 77, 12, 15, 230, 76, 12, 15, 230, 75, 12, 15, 230, 74, 12, 15, 230, - 73, 12, 15, 230, 72, 12, 15, 230, 71, 12, 15, 230, 70, 12, 15, 230, 69, - 12, 15, 230, 68, 12, 15, 230, 67, 12, 15, 230, 66, 12, 15, 230, 65, 12, - 15, 230, 64, 12, 15, 230, 63, 12, 15, 230, 62, 12, 15, 230, 61, 12, 15, - 230, 60, 12, 15, 230, 59, 12, 15, 230, 58, 12, 15, 230, 57, 12, 15, 230, - 56, 12, 15, 230, 55, 12, 15, 230, 54, 12, 15, 230, 53, 12, 15, 230, 52, - 12, 15, 230, 51, 12, 15, 230, 50, 12, 15, 230, 49, 12, 15, 230, 48, 12, - 15, 230, 47, 12, 15, 230, 46, 12, 15, 230, 45, 12, 15, 230, 44, 12, 15, - 230, 43, 12, 15, 230, 42, 12, 15, 230, 41, 12, 15, 230, 40, 12, 15, 230, - 39, 12, 15, 230, 38, 12, 15, 230, 37, 12, 15, 230, 36, 12, 15, 230, 35, - 12, 15, 230, 34, 12, 15, 230, 33, 12, 15, 230, 32, 12, 15, 230, 31, 12, - 15, 230, 30, 12, 15, 230, 29, 12, 15, 230, 28, 12, 15, 230, 27, 12, 15, - 230, 26, 12, 15, 230, 25, 12, 15, 230, 24, 12, 15, 230, 23, 12, 15, 230, - 22, 12, 15, 230, 21, 12, 15, 230, 20, 12, 15, 230, 19, 12, 15, 230, 18, - 12, 15, 230, 17, 12, 15, 230, 16, 12, 15, 230, 15, 12, 15, 230, 14, 12, - 15, 230, 13, 12, 15, 230, 12, 12, 15, 230, 11, 12, 15, 230, 10, 12, 15, - 230, 9, 12, 15, 230, 8, 12, 15, 230, 7, 12, 15, 230, 6, 12, 15, 230, 5, - 12, 15, 230, 4, 12, 15, 230, 3, 12, 15, 230, 2, 12, 15, 230, 1, 12, 15, - 230, 0, 12, 15, 229, 255, 12, 15, 229, 254, 12, 15, 229, 253, 12, 15, - 229, 252, 12, 15, 229, 251, 12, 15, 229, 250, 12, 15, 229, 249, 12, 15, - 229, 248, 12, 15, 229, 247, 12, 15, 229, 246, 12, 15, 229, 245, 12, 15, - 229, 244, 12, 15, 229, 243, 12, 15, 229, 242, 12, 15, 229, 241, 12, 15, - 229, 240, 12, 15, 229, 239, 12, 15, 229, 238, 12, 15, 229, 237, 12, 15, - 229, 236, 12, 15, 229, 235, 12, 15, 229, 234, 12, 15, 229, 233, 12, 15, - 229, 232, 12, 15, 229, 231, 12, 15, 229, 230, 12, 15, 229, 229, 12, 15, - 229, 228, 12, 15, 229, 227, 12, 15, 229, 226, 12, 15, 229, 225, 12, 15, - 229, 224, 12, 15, 229, 223, 12, 15, 229, 222, 12, 15, 229, 221, 12, 15, - 229, 220, 12, 15, 229, 219, 12, 15, 229, 218, 12, 15, 229, 217, 12, 15, - 229, 216, 12, 15, 229, 215, 12, 15, 229, 214, 12, 15, 229, 213, 12, 15, - 229, 212, 12, 15, 229, 211, 12, 15, 229, 210, 12, 15, 229, 209, 12, 15, - 229, 208, 12, 15, 229, 207, 12, 15, 229, 206, 12, 15, 229, 205, 12, 15, - 229, 204, 12, 15, 229, 203, 12, 15, 229, 202, 12, 15, 229, 201, 12, 15, - 229, 200, 12, 15, 229, 199, 12, 15, 229, 198, 12, 15, 229, 197, 12, 15, - 229, 196, 12, 15, 229, 195, 12, 15, 229, 194, 12, 15, 229, 193, 12, 15, - 229, 192, 12, 15, 229, 191, 12, 15, 229, 190, 12, 15, 229, 189, 12, 15, - 229, 188, 12, 15, 229, 187, 12, 15, 229, 186, 12, 15, 229, 185, 12, 15, - 229, 184, 12, 15, 229, 183, 12, 15, 229, 182, 12, 15, 229, 181, 12, 15, - 229, 180, 12, 15, 229, 179, 12, 15, 229, 178, 12, 15, 229, 177, 12, 15, - 229, 176, 12, 15, 229, 175, 12, 15, 229, 174, 12, 15, 229, 173, 12, 15, - 229, 172, 12, 15, 229, 171, 12, 15, 229, 170, 12, 15, 229, 169, 12, 15, - 229, 168, 12, 15, 229, 167, 12, 15, 229, 166, 12, 15, 229, 165, 12, 15, - 229, 164, 12, 15, 229, 163, 12, 15, 229, 162, 12, 15, 229, 161, 12, 15, - 229, 160, 12, 15, 229, 159, 12, 15, 229, 158, 12, 15, 229, 157, 12, 15, - 229, 156, 12, 15, 229, 155, 12, 15, 229, 154, 12, 15, 229, 153, 12, 15, - 229, 152, 12, 15, 229, 151, 12, 15, 229, 150, 12, 15, 229, 149, 12, 15, - 229, 148, 12, 15, 229, 147, 12, 15, 229, 146, 12, 15, 229, 145, 12, 15, - 229, 144, 12, 15, 229, 143, 12, 15, 229, 142, 12, 15, 229, 141, 12, 15, - 229, 140, 12, 15, 229, 139, 12, 15, 229, 138, 12, 15, 229, 137, 12, 15, - 229, 136, 12, 15, 229, 135, 12, 15, 229, 134, 12, 15, 229, 133, 12, 15, - 229, 132, 12, 15, 229, 131, 12, 15, 229, 130, 12, 15, 229, 129, 12, 15, - 229, 128, 12, 15, 229, 127, 12, 15, 229, 126, 12, 15, 229, 125, 12, 15, - 229, 124, 12, 15, 229, 123, 12, 15, 229, 122, 12, 15, 229, 121, 12, 15, - 229, 120, 12, 15, 229, 119, 12, 15, 229, 118, 12, 15, 229, 117, 12, 15, - 229, 116, 12, 15, 229, 115, 12, 15, 229, 114, 12, 15, 229, 113, 12, 15, - 229, 112, 12, 15, 229, 111, 12, 15, 229, 110, 12, 15, 229, 109, 12, 15, - 229, 108, 12, 15, 229, 107, 12, 15, 229, 106, 12, 15, 229, 105, 12, 15, - 229, 104, 12, 15, 229, 103, 12, 15, 229, 102, 12, 15, 229, 101, 12, 15, - 229, 100, 12, 15, 229, 99, 12, 15, 229, 98, 12, 15, 229, 97, 12, 15, 229, - 96, 12, 15, 229, 95, 12, 15, 229, 94, 12, 15, 229, 93, 12, 15, 229, 92, - 12, 15, 229, 91, 12, 15, 229, 90, 12, 15, 229, 89, 12, 15, 229, 88, 12, - 15, 229, 87, 12, 15, 229, 86, 12, 15, 229, 85, 12, 15, 229, 84, 12, 15, - 229, 83, 12, 15, 229, 82, 12, 15, 229, 81, 12, 15, 229, 80, 12, 15, 229, - 79, 12, 15, 229, 78, 12, 15, 229, 77, 12, 15, 229, 76, 12, 15, 229, 75, - 12, 15, 229, 74, 12, 15, 229, 73, 12, 15, 229, 72, 12, 15, 229, 71, 12, - 15, 229, 70, 12, 15, 229, 69, 12, 15, 229, 68, 12, 15, 229, 67, 12, 15, - 229, 66, 12, 15, 229, 65, 12, 15, 229, 64, 12, 15, 229, 63, 12, 15, 229, - 62, 12, 15, 229, 61, 12, 15, 229, 60, 12, 15, 229, 59, 12, 15, 229, 58, - 12, 15, 229, 57, 12, 15, 229, 56, 12, 15, 229, 55, 12, 15, 229, 54, 12, - 15, 229, 53, 12, 15, 229, 52, 12, 15, 229, 51, 12, 15, 229, 50, 12, 15, - 229, 49, 12, 15, 229, 48, 12, 15, 229, 47, 12, 15, 229, 46, 12, 15, 229, - 45, 12, 15, 229, 44, 12, 15, 229, 43, 12, 15, 229, 42, 12, 15, 229, 41, - 12, 15, 229, 40, 12, 15, 229, 39, 12, 15, 229, 38, 12, 15, 229, 37, 12, - 15, 229, 36, 12, 15, 229, 35, 12, 15, 229, 34, 12, 15, 229, 33, 12, 15, - 229, 32, 12, 15, 229, 31, 12, 15, 229, 30, 12, 15, 229, 29, 12, 15, 229, - 28, 12, 15, 229, 27, 12, 15, 229, 26, 12, 15, 229, 25, 12, 15, 229, 24, - 12, 15, 229, 23, 12, 15, 229, 22, 12, 15, 229, 21, 12, 15, 229, 20, 12, - 15, 229, 19, 12, 15, 229, 18, 12, 15, 229, 17, 12, 15, 229, 16, 12, 15, - 229, 15, 12, 15, 229, 14, 12, 15, 229, 13, 12, 15, 229, 12, 12, 15, 229, - 11, 12, 15, 229, 10, 12, 15, 229, 9, 12, 15, 229, 8, 12, 15, 229, 7, 12, - 15, 229, 6, 12, 15, 229, 5, 12, 15, 229, 4, 12, 15, 229, 3, 12, 15, 229, - 2, 12, 15, 229, 1, 12, 15, 229, 0, 12, 15, 228, 255, 12, 15, 228, 254, - 12, 15, 228, 253, 12, 15, 228, 252, 12, 15, 228, 251, 12, 15, 228, 250, - 12, 15, 228, 249, 12, 15, 228, 248, 12, 15, 228, 247, 12, 15, 228, 246, - 12, 15, 228, 245, 12, 15, 228, 244, 12, 15, 228, 243, 12, 15, 228, 242, - 12, 15, 228, 241, 12, 15, 228, 240, 12, 15, 228, 239, 12, 15, 228, 238, - 12, 15, 228, 237, 12, 15, 228, 236, 12, 15, 228, 235, 12, 15, 228, 234, - 12, 15, 228, 233, 12, 15, 228, 232, 12, 15, 228, 231, 12, 15, 228, 230, - 12, 15, 228, 229, 12, 15, 228, 228, 12, 15, 228, 227, 12, 15, 228, 226, - 12, 15, 228, 225, 12, 15, 228, 224, 12, 15, 228, 223, 12, 15, 228, 222, - 12, 15, 228, 221, 12, 15, 228, 220, 12, 15, 228, 219, 12, 15, 228, 218, - 12, 15, 228, 217, 12, 15, 228, 216, 12, 15, 228, 215, 12, 15, 228, 214, - 12, 15, 228, 213, 12, 15, 228, 212, 12, 15, 228, 211, 12, 15, 228, 210, - 12, 15, 228, 209, 12, 15, 228, 208, 12, 15, 228, 207, 12, 15, 228, 206, - 12, 15, 228, 205, 12, 15, 228, 204, 12, 15, 228, 203, 12, 15, 228, 202, - 12, 15, 228, 201, 12, 15, 228, 200, 12, 15, 228, 199, 12, 15, 228, 198, - 12, 15, 228, 197, 12, 15, 228, 196, 12, 15, 228, 195, 12, 15, 228, 194, - 12, 15, 228, 193, 12, 15, 228, 192, 12, 15, 228, 191, 12, 15, 228, 190, - 12, 15, 228, 189, 12, 15, 228, 188, 12, 15, 228, 187, 12, 15, 228, 186, - 12, 15, 228, 185, 12, 15, 228, 184, 12, 15, 228, 183, 12, 15, 228, 182, - 12, 15, 228, 181, 12, 15, 228, 180, 12, 15, 228, 179, 12, 15, 228, 178, - 12, 15, 228, 177, 12, 15, 228, 176, 12, 15, 228, 175, 12, 15, 228, 174, - 12, 15, 228, 173, 12, 15, 228, 172, 12, 15, 228, 171, 12, 15, 228, 170, - 12, 15, 228, 169, 12, 15, 228, 168, 12, 15, 228, 167, 12, 15, 228, 166, - 12, 15, 228, 165, 12, 15, 228, 164, 12, 15, 228, 163, 12, 15, 228, 162, - 12, 15, 228, 161, 222, 234, 203, 143, 184, 205, 148, 184, 236, 90, 78, - 184, 211, 62, 78, 184, 31, 55, 184, 239, 10, 55, 184, 213, 45, 55, 184, - 251, 111, 184, 251, 30, 184, 50, 213, 140, 184, 53, 213, 140, 184, 250, - 179, 184, 98, 55, 184, 244, 159, 184, 231, 6, 184, 234, 217, 204, 226, - 184, 205, 177, 184, 17, 195, 79, 184, 17, 100, 184, 17, 102, 184, 17, - 134, 184, 17, 136, 184, 17, 146, 184, 17, 167, 184, 17, 178, 184, 17, - 171, 184, 17, 182, 184, 244, 168, 184, 207, 105, 184, 222, 140, 55, 184, - 236, 172, 55, 184, 233, 94, 55, 184, 211, 79, 78, 184, 244, 157, 250, - 168, 184, 8, 6, 1, 63, 184, 8, 6, 1, 250, 112, 184, 8, 6, 1, 247, 207, - 184, 8, 6, 1, 240, 231, 184, 8, 6, 1, 69, 184, 8, 6, 1, 236, 49, 184, 8, - 6, 1, 234, 190, 184, 8, 6, 1, 233, 15, 184, 8, 6, 1, 68, 184, 8, 6, 1, - 225, 217, 184, 8, 6, 1, 225, 80, 184, 8, 6, 1, 159, 184, 8, 6, 1, 221, - 136, 184, 8, 6, 1, 218, 55, 184, 8, 6, 1, 72, 184, 8, 6, 1, 214, 3, 184, - 8, 6, 1, 211, 167, 184, 8, 6, 1, 144, 184, 8, 6, 1, 209, 80, 184, 8, 6, - 1, 203, 216, 184, 8, 6, 1, 66, 184, 8, 6, 1, 199, 230, 184, 8, 6, 1, 197, - 199, 184, 8, 6, 1, 196, 222, 184, 8, 6, 1, 196, 148, 184, 8, 6, 1, 195, - 158, 184, 50, 47, 179, 184, 210, 90, 205, 177, 184, 53, 47, 179, 184, - 244, 241, 252, 22, 184, 126, 222, 75, 184, 233, 101, 252, 22, 184, 8, 4, - 1, 63, 184, 8, 4, 1, 250, 112, 184, 8, 4, 1, 247, 207, 184, 8, 4, 1, 240, - 231, 184, 8, 4, 1, 69, 184, 8, 4, 1, 236, 49, 184, 8, 4, 1, 234, 190, - 184, 8, 4, 1, 233, 15, 184, 8, 4, 1, 68, 184, 8, 4, 1, 225, 217, 184, 8, - 4, 1, 225, 80, 184, 8, 4, 1, 159, 184, 8, 4, 1, 221, 136, 184, 8, 4, 1, - 218, 55, 184, 8, 4, 1, 72, 184, 8, 4, 1, 214, 3, 184, 8, 4, 1, 211, 167, - 184, 8, 4, 1, 144, 184, 8, 4, 1, 209, 80, 184, 8, 4, 1, 203, 216, 184, 8, - 4, 1, 66, 184, 8, 4, 1, 199, 230, 184, 8, 4, 1, 197, 199, 184, 8, 4, 1, - 196, 222, 184, 8, 4, 1, 196, 148, 184, 8, 4, 1, 195, 158, 184, 50, 241, - 18, 179, 184, 83, 222, 75, 184, 53, 241, 18, 179, 184, 202, 84, 247, 141, - 203, 143, 62, 208, 35, 62, 208, 24, 62, 208, 13, 62, 208, 1, 62, 207, - 246, 62, 207, 235, 62, 207, 224, 62, 207, 213, 62, 207, 202, 62, 207, - 194, 62, 207, 193, 62, 207, 192, 62, 207, 191, 62, 207, 189, 62, 207, - 188, 62, 207, 187, 62, 207, 186, 62, 207, 185, 62, 207, 184, 62, 207, - 183, 62, 207, 182, 62, 207, 181, 62, 207, 180, 62, 207, 178, 62, 207, - 177, 62, 207, 176, 62, 207, 175, 62, 207, 174, 62, 207, 173, 62, 207, - 172, 62, 207, 171, 62, 207, 170, 62, 207, 169, 62, 207, 167, 62, 207, - 166, 62, 207, 165, 62, 207, 164, 62, 207, 163, 62, 207, 162, 62, 207, - 161, 62, 207, 160, 62, 207, 159, 62, 207, 158, 62, 207, 156, 62, 207, - 155, 62, 207, 154, 62, 207, 153, 62, 207, 152, 62, 207, 151, 62, 207, - 150, 62, 207, 149, 62, 207, 148, 62, 207, 147, 62, 207, 145, 62, 207, - 144, 62, 207, 143, 62, 207, 142, 62, 207, 141, 62, 207, 140, 62, 207, - 139, 62, 207, 138, 62, 207, 137, 62, 207, 136, 62, 207, 134, 62, 207, - 133, 62, 207, 132, 62, 207, 131, 62, 207, 130, 62, 207, 129, 62, 207, - 128, 62, 207, 127, 62, 207, 126, 62, 207, 125, 62, 207, 123, 62, 207, - 122, 62, 207, 121, 62, 207, 120, 62, 207, 119, 62, 207, 118, 62, 207, - 117, 62, 207, 116, 62, 207, 115, 62, 207, 114, 62, 208, 111, 62, 208, - 110, 62, 208, 109, 62, 208, 108, 62, 208, 107, 62, 208, 106, 62, 208, - 105, 62, 208, 104, 62, 208, 103, 62, 208, 102, 62, 208, 100, 62, 208, 99, - 62, 208, 98, 62, 208, 97, 62, 208, 96, 62, 208, 95, 62, 208, 94, 62, 208, - 93, 62, 208, 92, 62, 208, 91, 62, 208, 89, 62, 208, 88, 62, 208, 87, 62, - 208, 86, 62, 208, 85, 62, 208, 84, 62, 208, 83, 62, 208, 82, 62, 208, 81, - 62, 208, 80, 62, 208, 78, 62, 208, 77, 62, 208, 76, 62, 208, 75, 62, 208, - 74, 62, 208, 73, 62, 208, 72, 62, 208, 71, 62, 208, 70, 62, 208, 69, 62, - 208, 67, 62, 208, 66, 62, 208, 65, 62, 208, 64, 62, 208, 63, 62, 208, 62, - 62, 208, 61, 62, 208, 60, 62, 208, 59, 62, 208, 58, 62, 208, 56, 62, 208, - 55, 62, 208, 54, 62, 208, 53, 62, 208, 52, 62, 208, 51, 62, 208, 50, 62, - 208, 49, 62, 208, 48, 62, 208, 47, 62, 208, 45, 62, 208, 44, 62, 208, 43, - 62, 208, 42, 62, 208, 41, 62, 208, 40, 62, 208, 39, 62, 208, 38, 62, 208, - 37, 62, 208, 36, 62, 208, 34, 62, 208, 33, 62, 208, 32, 62, 208, 31, 62, - 208, 30, 62, 208, 29, 62, 208, 28, 62, 208, 27, 62, 208, 26, 62, 208, 25, - 62, 208, 23, 62, 208, 22, 62, 208, 21, 62, 208, 20, 62, 208, 19, 62, 208, - 18, 62, 208, 17, 62, 208, 16, 62, 208, 15, 62, 208, 14, 62, 208, 12, 62, - 208, 11, 62, 208, 10, 62, 208, 9, 62, 208, 8, 62, 208, 7, 62, 208, 6, 62, - 208, 5, 62, 208, 4, 62, 208, 3, 62, 208, 0, 62, 207, 255, 62, 207, 254, - 62, 207, 253, 62, 207, 252, 62, 207, 251, 62, 207, 250, 62, 207, 249, 62, - 207, 248, 62, 207, 247, 62, 207, 245, 62, 207, 244, 62, 207, 243, 62, - 207, 242, 62, 207, 241, 62, 207, 240, 62, 207, 239, 62, 207, 238, 62, - 207, 237, 62, 207, 236, 62, 207, 234, 62, 207, 233, 62, 207, 232, 62, - 207, 231, 62, 207, 230, 62, 207, 229, 62, 207, 228, 62, 207, 227, 62, - 207, 226, 62, 207, 225, 62, 207, 223, 62, 207, 222, 62, 207, 221, 62, - 207, 220, 62, 207, 219, 62, 207, 218, 62, 207, 217, 62, 207, 216, 62, - 207, 215, 62, 207, 214, 62, 207, 212, 62, 207, 211, 62, 207, 210, 62, - 207, 209, 62, 207, 208, 62, 207, 207, 62, 207, 206, 62, 207, 205, 62, - 207, 204, 62, 207, 203, 62, 207, 201, 62, 207, 200, 62, 207, 199, 62, - 207, 198, 62, 207, 197, 62, 207, 196, 62, 207, 195, 215, 146, 215, 148, - 205, 3, 77, 232, 134, 205, 181, 205, 3, 77, 202, 237, 204, 174, 236, 222, - 77, 202, 237, 236, 118, 236, 222, 77, 201, 202, 236, 184, 236, 208, 236, - 209, 252, 14, 252, 15, 251, 161, 248, 232, 249, 132, 248, 27, 190, 203, - 149, 231, 155, 203, 149, 231, 80, 203, 154, 222, 76, 235, 180, 217, 83, - 222, 75, 236, 222, 77, 222, 75, 222, 124, 216, 112, 236, 187, 222, 76, - 203, 149, 83, 203, 149, 197, 222, 235, 24, 235, 180, 235, 157, 247, 102, - 210, 93, 241, 80, 206, 219, 214, 34, 221, 253, 100, 205, 200, 206, 219, - 226, 86, 221, 253, 195, 79, 206, 112, 240, 60, 222, 66, 236, 143, 239, - 39, 239, 183, 241, 121, 100, 240, 49, 239, 183, 241, 121, 102, 240, 48, - 239, 183, 241, 121, 134, 240, 47, 239, 183, 241, 121, 136, 240, 46, 217, - 104, 252, 14, 217, 227, 203, 242, 226, 149, 203, 246, 236, 222, 77, 201, - 203, 248, 126, 236, 125, 247, 140, 247, 142, 236, 222, 77, 219, 189, 236, - 185, 204, 139, 204, 157, 236, 143, 236, 144, 226, 61, 207, 91, 136, 235, - 138, 207, 90, 234, 227, 226, 61, 207, 91, 134, 233, 84, 207, 90, 233, 81, - 226, 61, 207, 91, 102, 210, 169, 207, 90, 209, 146, 226, 61, 207, 91, - 100, 200, 50, 207, 90, 200, 4, 205, 151, 239, 222, 239, 224, 213, 231, - 246, 255, 213, 233, 130, 214, 171, 212, 24, 231, 158, 248, 52, 213, 35, - 232, 95, 248, 66, 216, 51, 248, 52, 232, 95, 217, 188, 226, 72, 226, 74, - 217, 76, 222, 75, 217, 102, 205, 3, 77, 208, 116, 250, 245, 205, 80, 236, - 222, 77, 208, 116, 250, 245, 236, 146, 190, 203, 150, 207, 76, 231, 155, - 203, 150, 207, 76, 231, 77, 190, 203, 150, 3, 225, 92, 231, 155, 203, - 150, 3, 225, 92, 231, 78, 222, 76, 203, 150, 207, 76, 83, 203, 150, 207, - 76, 197, 221, 213, 132, 222, 76, 235, 11, 213, 132, 222, 76, 237, 235, - 212, 137, 213, 132, 222, 76, 249, 131, 213, 132, 222, 76, 200, 36, 212, - 131, 210, 90, 222, 76, 235, 180, 210, 90, 226, 72, 210, 72, 206, 62, 206, - 219, 102, 206, 59, 205, 82, 206, 62, 206, 219, 134, 206, 58, 205, 81, - 239, 183, 241, 121, 204, 198, 240, 44, 212, 9, 200, 3, 100, 212, 9, 200, - 1, 211, 226, 212, 9, 200, 3, 102, 212, 9, 200, 0, 211, 225, 207, 77, 201, - 201, 205, 0, 204, 181, 247, 141, 246, 255, 247, 76, 219, 147, 197, 152, - 218, 73, 205, 3, 77, 233, 69, 250, 245, 205, 3, 77, 211, 244, 250, 245, - 205, 150, 236, 222, 77, 233, 69, 250, 245, 236, 222, 77, 211, 244, 250, - 245, 236, 182, 205, 3, 77, 204, 198, 205, 166, 206, 62, 233, 106, 190, - 226, 20, 207, 55, 206, 62, 190, 226, 20, 208, 162, 241, 121, 207, 87, - 226, 20, 241, 42, 204, 199, 203, 8, 205, 23, 214, 84, 203, 231, 244, 158, - 214, 51, 212, 10, 219, 146, 212, 120, 251, 26, 212, 3, 244, 158, 251, 43, - 217, 176, 206, 121, 8, 6, 1, 233, 230, 8, 4, 1, 233, 230, 247, 19, 251, - 140, 203, 236, 204, 145, 244, 169, 206, 4, 222, 184, 225, 11, 1, 222, 26, - 222, 232, 1, 235, 52, 235, 43, 222, 232, 1, 235, 52, 235, 192, 222, 232, - 1, 209, 232, 222, 232, 1, 222, 7, 82, 117, 248, 138, 206, 192, 233, 193, - 219, 96, 210, 80, 29, 116, 196, 43, 29, 116, 196, 39, 29, 116, 205, 58, - 29, 116, 196, 44, 234, 204, 234, 203, 234, 202, 218, 75, 194, 236, 194, - 237, 194, 239, 221, 195, 209, 240, 221, 197, 209, 242, 213, 95, 221, 194, - 209, 239, 216, 82, 218, 255, 197, 36, 221, 196, 209, 241, 234, 226, 213, - 94, 197, 95, 236, 246, 234, 214, 219, 70, 214, 120, 200, 5, 105, 219, 70, - 240, 66, 105, 107, 201, 179, 61, 3, 52, 83, 106, 91, 201, 179, 61, 3, 52, - 83, 106, 11, 5, 225, 232, 78, 198, 222, 198, 111, 198, 43, 198, 32, 198, - 21, 198, 10, 197, 255, 197, 244, 197, 233, 198, 221, 198, 210, 198, 199, - 198, 188, 198, 177, 198, 166, 198, 155, 212, 25, 235, 24, 36, 83, 53, 59, - 222, 147, 179, 247, 212, 214, 68, 78, 248, 106, 194, 238, 10, 2, 215, - 156, 203, 12, 10, 2, 215, 156, 127, 215, 156, 247, 245, 127, 247, 244, - 219, 195, 6, 1, 233, 15, 219, 195, 6, 1, 217, 73, 219, 195, 4, 1, 233, - 15, 219, 195, 4, 1, 217, 73, 56, 1, 237, 135, 67, 34, 16, 234, 225, 206, - 0, 245, 34, 199, 128, 198, 144, 198, 133, 198, 122, 198, 110, 198, 99, - 198, 88, 198, 77, 198, 66, 198, 55, 198, 47, 198, 46, 198, 45, 198, 44, - 198, 42, 198, 41, 198, 40, 198, 39, 198, 38, 198, 37, 198, 36, 198, 35, - 198, 34, 198, 33, 198, 31, 198, 30, 198, 29, 198, 28, 198, 27, 198, 26, - 198, 25, 198, 24, 198, 23, 198, 22, 198, 20, 198, 19, 198, 18, 198, 17, - 198, 16, 198, 15, 198, 14, 198, 13, 198, 12, 198, 11, 198, 9, 198, 8, - 198, 7, 198, 6, 198, 5, 198, 4, 198, 3, 198, 2, 198, 1, 198, 0, 197, 254, - 197, 253, 197, 252, 197, 251, 197, 250, 197, 249, 197, 248, 197, 247, - 197, 246, 197, 245, 197, 243, 197, 242, 197, 241, 197, 240, 197, 239, - 197, 238, 197, 237, 197, 236, 197, 235, 197, 234, 197, 232, 197, 231, - 197, 230, 197, 229, 197, 228, 197, 227, 197, 226, 197, 225, 197, 224, - 197, 223, 198, 220, 198, 219, 198, 218, 198, 217, 198, 216, 198, 215, - 198, 214, 198, 213, 198, 212, 198, 211, 198, 209, 198, 208, 198, 207, - 198, 206, 198, 205, 198, 204, 198, 203, 198, 202, 198, 201, 198, 200, - 198, 198, 198, 197, 198, 196, 198, 195, 198, 194, 198, 193, 198, 192, - 198, 191, 198, 190, 198, 189, 198, 187, 198, 186, 198, 185, 198, 184, - 198, 183, 198, 182, 198, 181, 198, 180, 198, 179, 198, 178, 198, 176, - 198, 175, 198, 174, 198, 173, 198, 172, 198, 171, 198, 170, 198, 169, - 198, 168, 198, 167, 198, 165, 198, 164, 198, 163, 198, 162, 198, 161, - 198, 160, 198, 159, 198, 158, 198, 157, 198, 156, 198, 154, 198, 153, - 198, 152, 198, 151, 198, 150, 198, 149, 198, 148, 198, 147, 198, 146, - 198, 145, 198, 143, 198, 142, 198, 141, 198, 140, 198, 139, 198, 138, - 198, 137, 198, 136, 198, 135, 198, 134, 198, 132, 198, 131, 198, 130, - 198, 129, 198, 128, 198, 127, 198, 126, 198, 125, 198, 124, 198, 123, - 198, 121, 198, 120, 198, 119, 198, 118, 198, 117, 198, 116, 198, 115, - 198, 114, 198, 113, 198, 112, 198, 109, 198, 108, 198, 107, 198, 106, - 198, 105, 198, 104, 198, 103, 198, 102, 198, 101, 198, 100, 198, 98, 198, - 97, 198, 96, 198, 95, 198, 94, 198, 93, 198, 92, 198, 91, 198, 90, 198, - 89, 198, 87, 198, 86, 198, 85, 198, 84, 198, 83, 198, 82, 198, 81, 198, - 80, 198, 79, 198, 78, 198, 76, 198, 75, 198, 74, 198, 73, 198, 72, 198, - 71, 198, 70, 198, 69, 198, 68, 198, 67, 198, 65, 198, 64, 198, 63, 198, - 62, 198, 61, 198, 60, 198, 59, 198, 58, 198, 57, 198, 56, 198, 54, 198, - 53, 198, 52, 198, 51, 198, 50, 198, 49, 198, 48, 224, 150, 31, 55, 224, - 150, 250, 179, 224, 150, 17, 195, 79, 224, 150, 17, 100, 224, 150, 17, - 102, 224, 150, 17, 134, 224, 150, 17, 136, 224, 150, 17, 146, 224, 150, - 17, 167, 224, 150, 17, 178, 224, 150, 17, 171, 224, 150, 17, 182, 8, 6, - 1, 39, 3, 220, 115, 26, 233, 100, 8, 4, 1, 39, 3, 220, 115, 26, 233, 100, - 8, 6, 1, 237, 136, 3, 83, 222, 76, 60, 8, 4, 1, 237, 136, 3, 83, 222, 76, - 60, 8, 6, 1, 237, 136, 3, 83, 222, 76, 248, 227, 26, 233, 100, 8, 4, 1, - 237, 136, 3, 83, 222, 76, 248, 227, 26, 233, 100, 8, 6, 1, 237, 136, 3, - 83, 222, 76, 248, 227, 26, 186, 8, 4, 1, 237, 136, 3, 83, 222, 76, 248, - 227, 26, 186, 8, 6, 1, 237, 136, 3, 244, 241, 26, 220, 114, 8, 4, 1, 237, - 136, 3, 244, 241, 26, 220, 114, 8, 6, 1, 237, 136, 3, 244, 241, 26, 247, - 106, 8, 4, 1, 237, 136, 3, 244, 241, 26, 247, 106, 8, 6, 1, 230, 249, 3, - 220, 115, 26, 233, 100, 8, 4, 1, 230, 249, 3, 220, 115, 26, 233, 100, 8, - 4, 1, 230, 249, 3, 76, 90, 26, 186, 8, 4, 1, 217, 74, 3, 202, 85, 57, 8, - 6, 1, 177, 3, 83, 222, 76, 60, 8, 4, 1, 177, 3, 83, 222, 76, 60, 8, 6, 1, - 177, 3, 83, 222, 76, 248, 227, 26, 233, 100, 8, 4, 1, 177, 3, 83, 222, - 76, 248, 227, 26, 233, 100, 8, 6, 1, 177, 3, 83, 222, 76, 248, 227, 26, - 186, 8, 4, 1, 177, 3, 83, 222, 76, 248, 227, 26, 186, 8, 6, 1, 209, 81, - 3, 83, 222, 76, 60, 8, 4, 1, 209, 81, 3, 83, 222, 76, 60, 8, 6, 1, 118, - 3, 220, 115, 26, 233, 100, 8, 4, 1, 118, 3, 220, 115, 26, 233, 100, 8, 6, - 1, 39, 3, 214, 152, 26, 186, 8, 4, 1, 39, 3, 214, 152, 26, 186, 8, 6, 1, - 39, 3, 214, 152, 26, 202, 84, 8, 4, 1, 39, 3, 214, 152, 26, 202, 84, 8, - 6, 1, 237, 136, 3, 214, 152, 26, 186, 8, 4, 1, 237, 136, 3, 214, 152, 26, - 186, 8, 6, 1, 237, 136, 3, 214, 152, 26, 202, 84, 8, 4, 1, 237, 136, 3, - 214, 152, 26, 202, 84, 8, 6, 1, 237, 136, 3, 76, 90, 26, 186, 8, 4, 1, - 237, 136, 3, 76, 90, 26, 186, 8, 6, 1, 237, 136, 3, 76, 90, 26, 202, 84, - 8, 4, 1, 237, 136, 3, 76, 90, 26, 202, 84, 8, 4, 1, 230, 249, 3, 76, 90, - 26, 233, 100, 8, 4, 1, 230, 249, 3, 76, 90, 26, 202, 84, 8, 6, 1, 230, - 249, 3, 214, 152, 26, 186, 8, 4, 1, 230, 249, 3, 214, 152, 26, 76, 90, - 26, 186, 8, 6, 1, 230, 249, 3, 214, 152, 26, 202, 84, 8, 4, 1, 230, 249, - 3, 214, 152, 26, 76, 90, 26, 202, 84, 8, 6, 1, 225, 218, 3, 202, 84, 8, - 4, 1, 225, 218, 3, 76, 90, 26, 202, 84, 8, 6, 1, 223, 100, 3, 202, 84, 8, - 4, 1, 223, 100, 3, 202, 84, 8, 6, 1, 221, 137, 3, 202, 84, 8, 4, 1, 221, - 137, 3, 202, 84, 8, 6, 1, 211, 32, 3, 202, 84, 8, 4, 1, 211, 32, 3, 202, - 84, 8, 6, 1, 118, 3, 214, 152, 26, 186, 8, 4, 1, 118, 3, 214, 152, 26, - 186, 8, 6, 1, 118, 3, 214, 152, 26, 202, 84, 8, 4, 1, 118, 3, 214, 152, - 26, 202, 84, 8, 6, 1, 118, 3, 220, 115, 26, 186, 8, 4, 1, 118, 3, 220, - 115, 26, 186, 8, 6, 1, 118, 3, 220, 115, 26, 202, 84, 8, 4, 1, 118, 3, - 220, 115, 26, 202, 84, 8, 4, 1, 251, 246, 3, 233, 100, 8, 4, 1, 192, 177, - 3, 233, 100, 8, 4, 1, 192, 177, 3, 186, 8, 4, 1, 163, 199, 231, 3, 233, - 100, 8, 4, 1, 163, 199, 231, 3, 186, 8, 4, 1, 208, 164, 3, 233, 100, 8, - 4, 1, 208, 164, 3, 186, 8, 4, 1, 231, 164, 208, 164, 3, 233, 100, 8, 4, - 1, 231, 164, 208, 164, 3, 186, 9, 207, 87, 93, 3, 232, 214, 90, 3, 251, - 164, 9, 207, 87, 93, 3, 232, 214, 90, 3, 197, 117, 9, 207, 87, 93, 3, - 232, 214, 90, 3, 151, 220, 69, 9, 207, 87, 93, 3, 232, 214, 90, 3, 214, - 164, 9, 207, 87, 93, 3, 232, 214, 90, 3, 66, 9, 207, 87, 93, 3, 232, 214, - 90, 3, 195, 217, 9, 207, 87, 93, 3, 232, 214, 90, 3, 69, 9, 207, 87, 93, - 3, 232, 214, 90, 3, 251, 245, 9, 207, 87, 216, 32, 3, 224, 191, 248, 219, - 1, 224, 121, 42, 108, 225, 80, 42, 108, 217, 73, 42, 108, 247, 207, 42, - 108, 215, 111, 42, 108, 201, 81, 42, 108, 216, 87, 42, 108, 203, 216, 42, - 108, 218, 55, 42, 108, 214, 3, 42, 108, 221, 136, 42, 108, 196, 148, 42, - 108, 144, 42, 108, 159, 42, 108, 199, 230, 42, 108, 222, 27, 42, 108, - 222, 38, 42, 108, 209, 182, 42, 108, 216, 69, 42, 108, 225, 217, 42, 108, - 207, 52, 42, 108, 205, 83, 42, 108, 209, 80, 42, 108, 233, 15, 42, 108, - 223, 202, 42, 5, 225, 55, 42, 5, 224, 101, 42, 5, 224, 80, 42, 5, 223, - 187, 42, 5, 223, 144, 42, 5, 224, 209, 42, 5, 224, 200, 42, 5, 225, 31, - 42, 5, 224, 11, 42, 5, 223, 242, 42, 5, 224, 228, 42, 5, 217, 70, 42, 5, - 217, 19, 42, 5, 217, 15, 42, 5, 216, 240, 42, 5, 216, 231, 42, 5, 217, - 58, 42, 5, 217, 56, 42, 5, 217, 67, 42, 5, 216, 252, 42, 5, 216, 247, 42, - 5, 217, 60, 42, 5, 247, 173, 42, 5, 245, 11, 42, 5, 245, 1, 42, 5, 241, - 41, 42, 5, 241, 0, 42, 5, 247, 57, 42, 5, 247, 49, 42, 5, 247, 162, 42, - 5, 244, 182, 42, 5, 241, 117, 42, 5, 247, 90, 42, 5, 215, 108, 42, 5, - 215, 89, 42, 5, 215, 83, 42, 5, 215, 66, 42, 5, 215, 58, 42, 5, 215, 98, - 42, 5, 215, 97, 42, 5, 215, 105, 42, 5, 215, 73, 42, 5, 215, 70, 42, 5, - 215, 101, 42, 5, 201, 77, 42, 5, 201, 57, 42, 5, 201, 56, 42, 5, 201, 45, - 42, 5, 201, 42, 42, 5, 201, 73, 42, 5, 201, 72, 42, 5, 201, 76, 42, 5, - 201, 55, 42, 5, 201, 54, 42, 5, 201, 75, 42, 5, 216, 85, 42, 5, 216, 71, - 42, 5, 216, 70, 42, 5, 216, 54, 42, 5, 216, 53, 42, 5, 216, 81, 42, 5, - 216, 80, 42, 5, 216, 84, 42, 5, 216, 56, 42, 5, 216, 55, 42, 5, 216, 83, - 42, 5, 203, 162, 42, 5, 202, 122, 42, 5, 202, 99, 42, 5, 201, 40, 42, 5, - 200, 251, 42, 5, 203, 68, 42, 5, 203, 48, 42, 5, 203, 137, 42, 5, 149, - 42, 5, 201, 247, 42, 5, 203, 89, 42, 5, 217, 244, 42, 5, 216, 223, 42, 5, - 216, 190, 42, 5, 215, 186, 42, 5, 215, 123, 42, 5, 217, 118, 42, 5, 217, - 107, 42, 5, 217, 230, 42, 5, 216, 50, 42, 5, 216, 33, 42, 5, 217, 202, - 42, 5, 213, 243, 42, 5, 212, 220, 42, 5, 212, 182, 42, 5, 211, 227, 42, - 5, 211, 191, 42, 5, 213, 92, 42, 5, 213, 79, 42, 5, 213, 221, 42, 5, 212, - 117, 42, 5, 212, 91, 42, 5, 213, 108, 42, 5, 220, 119, 42, 5, 219, 78, - 42, 5, 219, 40, 42, 5, 218, 145, 42, 5, 218, 85, 42, 5, 219, 207, 42, 5, - 219, 188, 42, 5, 220, 81, 42, 5, 218, 251, 42, 5, 218, 195, 42, 5, 219, - 255, 42, 5, 196, 129, 42, 5, 196, 24, 42, 5, 196, 14, 42, 5, 195, 217, - 42, 5, 195, 180, 42, 5, 196, 69, 42, 5, 196, 66, 42, 5, 196, 108, 42, 5, - 196, 3, 42, 5, 195, 237, 42, 5, 196, 80, 42, 5, 210, 244, 42, 5, 210, 72, - 42, 5, 210, 9, 42, 5, 209, 140, 42, 5, 209, 101, 42, 5, 210, 183, 42, 5, - 210, 155, 42, 5, 210, 224, 42, 5, 209, 232, 42, 5, 209, 206, 42, 5, 210, - 193, 42, 5, 223, 82, 42, 5, 222, 109, 42, 5, 222, 91, 42, 5, 221, 191, - 42, 5, 221, 162, 42, 5, 222, 197, 42, 5, 222, 188, 42, 5, 223, 54, 42, 5, - 222, 7, 42, 5, 221, 229, 42, 5, 222, 215, 42, 5, 199, 151, 42, 5, 199, - 34, 42, 5, 199, 18, 42, 5, 197, 220, 42, 5, 197, 212, 42, 5, 199, 118, - 42, 5, 199, 113, 42, 5, 199, 147, 42, 5, 198, 248, 42, 5, 198, 233, 42, - 5, 199, 124, 42, 5, 222, 25, 42, 5, 222, 20, 42, 5, 222, 19, 42, 5, 222, - 16, 42, 5, 222, 15, 42, 5, 222, 22, 42, 5, 222, 21, 42, 5, 222, 24, 42, - 5, 222, 18, 42, 5, 222, 17, 42, 5, 222, 23, 42, 5, 222, 36, 42, 5, 222, - 29, 42, 5, 222, 28, 42, 5, 222, 12, 42, 5, 222, 11, 42, 5, 222, 32, 42, - 5, 222, 31, 42, 5, 222, 35, 42, 5, 222, 14, 42, 5, 222, 13, 42, 5, 222, - 33, 42, 5, 209, 180, 42, 5, 209, 169, 42, 5, 209, 168, 42, 5, 209, 161, - 42, 5, 209, 154, 42, 5, 209, 176, 42, 5, 209, 175, 42, 5, 209, 179, 42, - 5, 209, 167, 42, 5, 209, 166, 42, 5, 209, 178, 42, 5, 216, 67, 42, 5, - 216, 62, 42, 5, 216, 61, 42, 5, 216, 58, 42, 5, 216, 57, 42, 5, 216, 64, - 42, 5, 216, 63, 42, 5, 216, 66, 42, 5, 216, 60, 42, 5, 216, 59, 42, 5, - 216, 65, 42, 5, 225, 213, 42, 5, 225, 172, 42, 5, 225, 164, 42, 5, 225, - 110, 42, 5, 225, 90, 42, 5, 225, 193, 42, 5, 225, 191, 42, 5, 225, 207, - 42, 5, 225, 129, 42, 5, 225, 119, 42, 5, 225, 200, 42, 5, 207, 45, 42, 5, - 206, 223, 42, 5, 206, 218, 42, 5, 206, 151, 42, 5, 206, 133, 42, 5, 206, - 255, 42, 5, 206, 253, 42, 5, 207, 34, 42, 5, 206, 198, 42, 5, 206, 190, - 42, 5, 207, 8, 42, 5, 205, 79, 42, 5, 205, 47, 42, 5, 205, 43, 42, 5, - 205, 34, 42, 5, 205, 31, 42, 5, 205, 53, 42, 5, 205, 52, 42, 5, 205, 78, - 42, 5, 205, 39, 42, 5, 205, 38, 42, 5, 205, 55, 42, 5, 209, 13, 42, 5, - 206, 112, 42, 5, 206, 84, 42, 5, 204, 172, 42, 5, 204, 74, 42, 5, 208, - 147, 42, 5, 208, 129, 42, 5, 208, 253, 42, 5, 205, 200, 42, 5, 205, 171, - 42, 5, 208, 191, 42, 5, 232, 246, 42, 5, 232, 71, 42, 5, 232, 43, 42, 5, - 231, 75, 42, 5, 231, 46, 42, 5, 232, 147, 42, 5, 232, 118, 42, 5, 232, - 235, 42, 5, 231, 193, 42, 5, 231, 166, 42, 5, 232, 158, 42, 5, 223, 201, - 42, 5, 223, 200, 42, 5, 223, 195, 42, 5, 223, 194, 42, 5, 223, 191, 42, - 5, 223, 190, 42, 5, 223, 197, 42, 5, 223, 196, 42, 5, 223, 199, 42, 5, - 223, 193, 42, 5, 223, 192, 42, 5, 223, 198, 42, 5, 206, 158, 153, 108, 2, - 196, 94, 153, 108, 2, 210, 212, 153, 108, 2, 210, 121, 94, 1, 200, 170, - 89, 108, 2, 244, 175, 155, 89, 108, 2, 244, 175, 224, 146, 89, 108, 2, - 244, 175, 224, 11, 89, 108, 2, 244, 175, 224, 117, 89, 108, 2, 244, 175, - 216, 252, 89, 108, 2, 244, 175, 247, 174, 89, 108, 2, 244, 175, 247, 16, - 89, 108, 2, 244, 175, 244, 182, 89, 108, 2, 244, 175, 245, 49, 89, 108, - 2, 244, 175, 215, 73, 89, 108, 2, 244, 175, 240, 136, 89, 108, 2, 244, - 175, 201, 66, 89, 108, 2, 244, 175, 239, 28, 89, 108, 2, 244, 175, 201, - 61, 89, 108, 2, 244, 175, 176, 89, 108, 2, 244, 175, 189, 89, 108, 2, - 244, 175, 202, 233, 89, 108, 2, 244, 175, 149, 89, 108, 2, 244, 175, 202, - 169, 89, 108, 2, 244, 175, 216, 50, 89, 108, 2, 244, 175, 249, 145, 89, - 108, 2, 244, 175, 213, 6, 89, 108, 2, 244, 175, 212, 117, 89, 108, 2, - 244, 175, 212, 234, 89, 108, 2, 244, 175, 218, 251, 89, 108, 2, 244, 175, - 196, 3, 89, 108, 2, 244, 175, 209, 232, 89, 108, 2, 244, 175, 222, 7, 89, - 108, 2, 244, 175, 198, 248, 89, 108, 2, 244, 175, 207, 50, 89, 108, 2, - 244, 175, 205, 80, 89, 108, 2, 244, 175, 183, 89, 108, 2, 244, 175, 142, - 89, 108, 2, 244, 175, 172, 89, 18, 2, 244, 175, 211, 159, 89, 226, 73, - 18, 2, 244, 175, 211, 97, 89, 226, 73, 18, 2, 244, 175, 209, 89, 89, 226, - 73, 18, 2, 244, 175, 209, 82, 89, 226, 73, 18, 2, 244, 175, 211, 139, 89, - 18, 2, 214, 127, 89, 18, 2, 252, 129, 188, 1, 248, 177, 217, 71, 188, 1, - 248, 177, 217, 19, 188, 1, 248, 177, 216, 240, 188, 1, 248, 177, 217, 58, - 188, 1, 248, 177, 216, 252, 71, 1, 248, 177, 217, 71, 71, 1, 248, 177, - 217, 19, 71, 1, 248, 177, 216, 240, 71, 1, 248, 177, 217, 58, 71, 1, 248, - 177, 216, 252, 71, 1, 251, 192, 247, 57, 71, 1, 251, 192, 201, 40, 71, 1, - 251, 192, 149, 71, 1, 251, 192, 214, 3, 73, 1, 236, 74, 236, 73, 241, - 125, 152, 154, 73, 1, 236, 73, 236, 74, 241, 125, 152, 154, + 0, 202, 160, 233, 204, 77, 208, 142, 77, 31, 57, 236, 127, 57, 210, 133, + 57, 250, 229, 250, 147, 46, 210, 230, 51, 210, 230, 250, 37, 102, 57, + 242, 38, 228, 110, 232, 71, 201, 238, 202, 189, 17, 192, 76, 17, 101, 17, + 104, 17, 133, 17, 134, 17, 151, 17, 170, 17, 179, 17, 174, 17, 182, 242, + 47, 204, 180, 219, 240, 57, 234, 30, 57, 230, 204, 57, 208, 159, 77, 242, + 36, 250, 26, 8, 6, 1, 64, 8, 6, 1, 249, 226, 8, 6, 1, 247, 52, 8, 6, 1, + 238, 95, 8, 6, 1, 71, 8, 6, 1, 233, 163, 8, 6, 1, 232, 44, 8, 6, 1, 230, + 124, 8, 6, 1, 70, 8, 6, 1, 223, 65, 8, 6, 1, 222, 184, 8, 6, 1, 165, 8, + 6, 1, 218, 236, 8, 6, 1, 215, 151, 8, 6, 1, 74, 8, 6, 1, 211, 93, 8, 6, + 1, 208, 247, 8, 6, 1, 150, 8, 6, 1, 206, 158, 8, 6, 1, 200, 228, 8, 6, 1, + 68, 8, 6, 1, 196, 236, 8, 6, 1, 194, 202, 8, 6, 1, 193, 223, 8, 6, 1, + 193, 148, 8, 6, 1, 192, 155, 46, 50, 186, 207, 169, 202, 189, 51, 50, + 186, 242, 122, 251, 143, 132, 219, 175, 230, 211, 251, 143, 8, 2, 1, 64, + 8, 2, 1, 249, 226, 8, 2, 1, 247, 52, 8, 2, 1, 238, 95, 8, 2, 1, 71, 8, 2, + 1, 233, 163, 8, 2, 1, 232, 44, 8, 2, 1, 230, 124, 8, 2, 1, 70, 8, 2, 1, + 223, 65, 8, 2, 1, 222, 184, 8, 2, 1, 165, 8, 2, 1, 218, 236, 8, 2, 1, + 215, 151, 8, 2, 1, 74, 8, 2, 1, 211, 93, 8, 2, 1, 208, 247, 8, 2, 1, 150, + 8, 2, 1, 206, 158, 8, 2, 1, 200, 228, 8, 2, 1, 68, 8, 2, 1, 196, 236, 8, + 2, 1, 194, 202, 8, 2, 1, 193, 223, 8, 2, 1, 193, 148, 8, 2, 1, 192, 155, + 46, 238, 138, 186, 84, 219, 175, 51, 238, 138, 186, 199, 90, 213, 136, + 202, 160, 223, 121, 233, 204, 77, 246, 140, 57, 209, 143, 57, 238, 137, + 57, 193, 60, 57, 247, 136, 161, 205, 209, 57, 237, 14, 238, 227, 57, 233, + 28, 211, 158, 223, 172, 220, 23, 55, 250, 208, 208, 142, 77, 213, 111, + 57, 202, 198, 228, 111, 207, 228, 57, 217, 214, 237, 95, 57, 209, 205, + 57, 201, 107, 104, 201, 107, 133, 251, 130, 251, 143, 216, 166, 57, 210, + 9, 57, 85, 236, 114, 246, 151, 201, 107, 101, 217, 111, 211, 158, 223, + 172, 207, 96, 55, 250, 208, 208, 142, 77, 194, 220, 232, 109, 90, 208, + 167, 194, 220, 232, 109, 90, 230, 78, 194, 220, 232, 109, 112, 208, 165, + 223, 121, 208, 159, 77, 8, 6, 1, 41, 4, 230, 210, 8, 6, 1, 41, 4, 251, + 129, 8, 6, 1, 41, 4, 242, 121, 8, 6, 1, 41, 4, 199, 90, 8, 6, 1, 41, 4, + 237, 14, 8, 6, 1, 41, 4, 207, 82, 58, 8, 6, 1, 251, 108, 8, 6, 1, 247, + 53, 4, 246, 151, 8, 6, 1, 234, 253, 4, 230, 210, 8, 6, 1, 234, 253, 4, + 251, 129, 8, 6, 1, 234, 253, 4, 242, 121, 8, 6, 1, 234, 253, 4, 237, 14, + 8, 6, 1, 228, 97, 4, 230, 210, 8, 6, 1, 228, 97, 4, 251, 129, 8, 6, 1, + 228, 97, 4, 242, 121, 8, 6, 1, 228, 97, 4, 237, 14, 8, 6, 1, 233, 235, 8, + 6, 1, 215, 152, 4, 199, 90, 8, 6, 1, 185, 4, 230, 210, 8, 6, 1, 185, 4, + 251, 129, 8, 6, 1, 185, 4, 242, 121, 8, 6, 1, 185, 4, 199, 90, 8, 6, 1, + 185, 4, 237, 14, 215, 214, 57, 8, 6, 1, 185, 4, 111, 8, 6, 1, 124, 4, + 230, 210, 8, 6, 1, 124, 4, 251, 129, 8, 6, 1, 124, 4, 242, 121, 8, 6, 1, + 124, 4, 237, 14, 8, 6, 1, 193, 149, 4, 251, 129, 8, 6, 1, 199, 168, 8, 2, + 1, 204, 26, 206, 158, 8, 2, 1, 41, 4, 230, 210, 8, 2, 1, 41, 4, 251, 129, + 8, 2, 1, 41, 4, 242, 121, 8, 2, 1, 41, 4, 199, 90, 8, 2, 1, 41, 4, 237, + 14, 8, 2, 1, 41, 4, 207, 82, 58, 8, 2, 1, 251, 108, 8, 2, 1, 247, 53, 4, + 246, 151, 8, 2, 1, 234, 253, 4, 230, 210, 8, 2, 1, 234, 253, 4, 251, 129, + 8, 2, 1, 234, 253, 4, 242, 121, 8, 2, 1, 234, 253, 4, 237, 14, 8, 2, 1, + 228, 97, 4, 230, 210, 8, 2, 1, 228, 97, 4, 251, 129, 8, 2, 1, 228, 97, 4, + 242, 121, 8, 2, 1, 228, 97, 4, 237, 14, 8, 2, 1, 233, 235, 8, 2, 1, 215, + 152, 4, 199, 90, 8, 2, 1, 185, 4, 230, 210, 8, 2, 1, 185, 4, 251, 129, 8, + 2, 1, 185, 4, 242, 121, 8, 2, 1, 185, 4, 199, 90, 8, 2, 1, 185, 4, 237, + 14, 236, 172, 57, 8, 2, 1, 185, 4, 111, 8, 2, 1, 124, 4, 230, 210, 8, 2, + 1, 124, 4, 251, 129, 8, 2, 1, 124, 4, 242, 121, 8, 2, 1, 124, 4, 237, 14, + 8, 2, 1, 193, 149, 4, 251, 129, 8, 2, 1, 199, 168, 8, 2, 1, 193, 149, 4, + 237, 14, 8, 6, 1, 41, 4, 217, 214, 8, 2, 1, 41, 4, 217, 214, 8, 6, 1, 41, + 4, 247, 150, 8, 2, 1, 41, 4, 247, 150, 8, 6, 1, 41, 4, 211, 243, 8, 2, 1, + 41, 4, 211, 243, 8, 6, 1, 247, 53, 4, 251, 129, 8, 2, 1, 247, 53, 4, 251, + 129, 8, 6, 1, 247, 53, 4, 242, 121, 8, 2, 1, 247, 53, 4, 242, 121, 8, 6, + 1, 247, 53, 4, 78, 58, 8, 2, 1, 247, 53, 4, 78, 58, 8, 6, 1, 247, 53, 4, + 246, 207, 8, 2, 1, 247, 53, 4, 246, 207, 8, 6, 1, 238, 96, 4, 246, 207, + 8, 2, 1, 238, 96, 4, 246, 207, 8, 6, 1, 238, 96, 4, 111, 8, 2, 1, 238, + 96, 4, 111, 8, 6, 1, 234, 253, 4, 217, 214, 8, 2, 1, 234, 253, 4, 217, + 214, 8, 6, 1, 234, 253, 4, 247, 150, 8, 2, 1, 234, 253, 4, 247, 150, 8, + 6, 1, 234, 253, 4, 78, 58, 8, 2, 1, 234, 253, 4, 78, 58, 8, 6, 1, 234, + 253, 4, 211, 243, 8, 2, 1, 234, 253, 4, 211, 243, 8, 6, 1, 234, 253, 4, + 246, 207, 8, 2, 1, 234, 253, 4, 246, 207, 8, 6, 1, 232, 45, 4, 242, 121, + 8, 2, 1, 232, 45, 4, 242, 121, 8, 6, 1, 232, 45, 4, 247, 150, 8, 2, 1, + 232, 45, 4, 247, 150, 8, 6, 1, 232, 45, 4, 78, 58, 8, 2, 1, 232, 45, 4, + 78, 58, 8, 6, 1, 232, 45, 4, 246, 151, 8, 2, 1, 232, 45, 4, 246, 151, 8, + 6, 1, 230, 125, 4, 242, 121, 8, 2, 1, 230, 125, 4, 242, 121, 8, 6, 1, + 230, 125, 4, 111, 8, 2, 1, 230, 125, 4, 111, 8, 6, 1, 228, 97, 4, 199, + 90, 8, 2, 1, 228, 97, 4, 199, 90, 8, 6, 1, 228, 97, 4, 217, 214, 8, 2, 1, + 228, 97, 4, 217, 214, 8, 6, 1, 228, 97, 4, 247, 150, 8, 2, 1, 228, 97, 4, + 247, 150, 8, 6, 1, 228, 97, 4, 211, 243, 8, 2, 1, 228, 97, 4, 211, 243, + 8, 6, 1, 228, 97, 4, 78, 58, 8, 2, 1, 236, 113, 70, 8, 6, 34, 223, 222, + 8, 2, 34, 223, 222, 8, 6, 1, 223, 66, 4, 242, 121, 8, 2, 1, 223, 66, 4, + 242, 121, 8, 6, 1, 222, 185, 4, 246, 151, 8, 2, 1, 222, 185, 4, 246, 151, + 8, 2, 1, 221, 56, 8, 6, 1, 220, 202, 4, 251, 129, 8, 2, 1, 220, 202, 4, + 251, 129, 8, 6, 1, 220, 202, 4, 246, 151, 8, 2, 1, 220, 202, 4, 246, 151, + 8, 6, 1, 220, 202, 4, 246, 207, 8, 2, 1, 220, 202, 4, 246, 207, 8, 6, 1, + 220, 202, 4, 85, 236, 114, 8, 2, 1, 220, 202, 4, 85, 236, 114, 8, 6, 1, + 220, 202, 4, 111, 8, 2, 1, 220, 202, 4, 111, 8, 6, 1, 215, 152, 4, 251, + 129, 8, 2, 1, 215, 152, 4, 251, 129, 8, 6, 1, 215, 152, 4, 246, 151, 8, + 2, 1, 215, 152, 4, 246, 151, 8, 6, 1, 215, 152, 4, 246, 207, 8, 2, 1, + 215, 152, 4, 246, 207, 8, 2, 1, 215, 152, 209, 117, 247, 64, 250, 147, 8, + 6, 1, 234, 73, 8, 2, 1, 234, 73, 8, 6, 1, 185, 4, 217, 214, 8, 2, 1, 185, + 4, 217, 214, 8, 6, 1, 185, 4, 247, 150, 8, 2, 1, 185, 4, 247, 150, 8, 6, + 1, 185, 4, 55, 251, 129, 8, 2, 1, 185, 4, 55, 251, 129, 8, 6, 34, 212, 0, + 8, 2, 34, 212, 0, 8, 6, 1, 208, 112, 4, 251, 129, 8, 2, 1, 208, 112, 4, + 251, 129, 8, 6, 1, 208, 112, 4, 246, 151, 8, 2, 1, 208, 112, 4, 246, 151, + 8, 6, 1, 208, 112, 4, 246, 207, 8, 2, 1, 208, 112, 4, 246, 207, 8, 6, 1, + 206, 159, 4, 251, 129, 8, 2, 1, 206, 159, 4, 251, 129, 8, 6, 1, 206, 159, + 4, 242, 121, 8, 2, 1, 206, 159, 4, 242, 121, 8, 6, 1, 206, 159, 4, 246, + 151, 8, 2, 1, 206, 159, 4, 246, 151, 8, 6, 1, 206, 159, 4, 246, 207, 8, + 2, 1, 206, 159, 4, 246, 207, 8, 6, 1, 200, 229, 4, 246, 151, 8, 2, 1, + 200, 229, 4, 246, 151, 8, 6, 1, 200, 229, 4, 246, 207, 8, 2, 1, 200, 229, + 4, 246, 207, 8, 6, 1, 200, 229, 4, 111, 8, 2, 1, 200, 229, 4, 111, 8, 6, + 1, 124, 4, 199, 90, 8, 2, 1, 124, 4, 199, 90, 8, 6, 1, 124, 4, 217, 214, + 8, 2, 1, 124, 4, 217, 214, 8, 6, 1, 124, 4, 247, 150, 8, 2, 1, 124, 4, + 247, 150, 8, 6, 1, 124, 4, 207, 82, 58, 8, 2, 1, 124, 4, 207, 82, 58, 8, + 6, 1, 124, 4, 55, 251, 129, 8, 2, 1, 124, 4, 55, 251, 129, 8, 6, 1, 124, + 4, 211, 243, 8, 2, 1, 124, 4, 211, 243, 8, 6, 1, 194, 203, 4, 242, 121, + 8, 2, 1, 194, 203, 4, 242, 121, 8, 6, 1, 193, 149, 4, 242, 121, 8, 2, 1, + 193, 149, 4, 242, 121, 8, 6, 1, 193, 149, 4, 237, 14, 8, 6, 1, 192, 156, + 4, 251, 129, 8, 2, 1, 192, 156, 4, 251, 129, 8, 6, 1, 192, 156, 4, 78, + 58, 8, 2, 1, 192, 156, 4, 78, 58, 8, 6, 1, 192, 156, 4, 246, 207, 8, 2, + 1, 192, 156, 4, 246, 207, 8, 2, 1, 184, 206, 158, 8, 2, 1, 76, 4, 111, 8, + 6, 1, 76, 4, 128, 8, 6, 1, 76, 4, 198, 246, 8, 2, 1, 76, 4, 198, 246, 8, + 6, 1, 158, 170, 8, 2, 1, 158, 170, 8, 6, 1, 211, 184, 74, 8, 6, 1, 247, + 53, 4, 128, 8, 2, 1, 247, 53, 4, 128, 8, 6, 1, 251, 83, 238, 95, 8, 6, 1, + 238, 96, 4, 128, 8, 6, 1, 238, 96, 4, 198, 246, 8, 2, 1, 238, 96, 4, 198, + 246, 8, 2, 1, 163, 237, 76, 8, 6, 1, 207, 168, 71, 8, 6, 1, 205, 240, 8, + 6, 1, 211, 184, 71, 8, 6, 1, 233, 164, 4, 128, 8, 2, 1, 233, 164, 4, 128, + 8, 6, 1, 232, 45, 4, 128, 8, 6, 1, 231, 204, 8, 2, 1, 228, 148, 8, 6, 1, + 223, 111, 8, 6, 1, 228, 97, 4, 111, 8, 6, 1, 222, 185, 4, 128, 8, 2, 1, + 222, 185, 4, 128, 8, 2, 1, 220, 202, 4, 161, 8, 2, 1, 220, 92, 4, 111, 8, + 6, 1, 163, 218, 236, 8, 6, 1, 215, 152, 4, 46, 128, 8, 2, 1, 215, 152, 4, + 184, 51, 220, 16, 8, 6, 1, 185, 4, 85, 199, 90, 8, 6, 1, 185, 4, 228, + 208, 8, 2, 1, 185, 4, 228, 208, 8, 6, 1, 211, 238, 8, 2, 1, 211, 238, 8, + 6, 1, 211, 94, 4, 128, 8, 2, 1, 211, 94, 4, 128, 8, 1, 192, 217, 8, 6, 1, + 158, 104, 8, 2, 1, 158, 104, 8, 6, 1, 233, 255, 8, 1, 207, 168, 234, 0, + 219, 69, 8, 2, 1, 200, 229, 4, 211, 49, 128, 8, 6, 1, 200, 229, 4, 128, + 8, 2, 1, 200, 229, 4, 128, 8, 6, 1, 200, 229, 4, 207, 174, 128, 8, 6, 1, + 124, 4, 228, 208, 8, 2, 1, 124, 4, 228, 208, 8, 6, 1, 197, 34, 8, 6, 1, + 196, 237, 4, 128, 8, 6, 1, 193, 149, 4, 128, 8, 2, 1, 193, 149, 4, 128, + 8, 6, 1, 192, 156, 4, 111, 8, 2, 1, 192, 156, 4, 111, 8, 6, 1, 233, 166, + 8, 6, 1, 233, 167, 207, 167, 8, 2, 1, 233, 167, 207, 167, 8, 2, 1, 233, + 167, 4, 200, 147, 8, 1, 103, 4, 111, 8, 6, 1, 158, 151, 8, 2, 1, 158, + 151, 8, 1, 223, 121, 231, 6, 201, 239, 4, 111, 8, 1, 193, 226, 8, 1, 237, + 69, 242, 96, 8, 1, 220, 63, 242, 96, 8, 1, 250, 242, 242, 96, 8, 1, 207, + 174, 242, 96, 8, 6, 1, 235, 19, 4, 246, 207, 8, 6, 1, 238, 96, 4, 2, 1, + 192, 156, 4, 246, 207, 8, 2, 1, 235, 19, 4, 246, 207, 8, 6, 1, 219, 141, + 8, 6, 1, 220, 202, 4, 2, 1, 223, 65, 8, 2, 1, 219, 141, 8, 6, 1, 214, 1, + 8, 6, 1, 215, 152, 4, 2, 1, 223, 65, 8, 2, 1, 214, 1, 8, 6, 1, 41, 4, + 246, 207, 8, 2, 1, 41, 4, 246, 207, 8, 6, 1, 228, 97, 4, 246, 207, 8, 2, + 1, 228, 97, 4, 246, 207, 8, 6, 1, 185, 4, 246, 207, 8, 2, 1, 185, 4, 246, + 207, 8, 6, 1, 124, 4, 246, 207, 8, 2, 1, 124, 4, 246, 207, 8, 6, 1, 124, + 4, 237, 15, 26, 217, 214, 8, 2, 1, 124, 4, 237, 15, 26, 217, 214, 8, 6, + 1, 124, 4, 237, 15, 26, 251, 129, 8, 2, 1, 124, 4, 237, 15, 26, 251, 129, + 8, 6, 1, 124, 4, 237, 15, 26, 246, 207, 8, 2, 1, 124, 4, 237, 15, 26, + 246, 207, 8, 6, 1, 124, 4, 237, 15, 26, 230, 210, 8, 2, 1, 124, 4, 237, + 15, 26, 230, 210, 8, 2, 1, 163, 71, 8, 6, 1, 41, 4, 237, 15, 26, 217, + 214, 8, 2, 1, 41, 4, 237, 15, 26, 217, 214, 8, 6, 1, 41, 4, 78, 95, 26, + 217, 214, 8, 2, 1, 41, 4, 78, 95, 26, 217, 214, 8, 6, 1, 251, 109, 4, + 217, 214, 8, 2, 1, 251, 109, 4, 217, 214, 8, 6, 1, 232, 45, 4, 111, 8, 2, + 1, 232, 45, 4, 111, 8, 6, 1, 232, 45, 4, 246, 207, 8, 2, 1, 232, 45, 4, + 246, 207, 8, 6, 1, 222, 185, 4, 246, 207, 8, 2, 1, 222, 185, 4, 246, 207, + 8, 6, 1, 185, 4, 211, 243, 8, 2, 1, 185, 4, 211, 243, 8, 6, 1, 185, 4, + 211, 244, 26, 217, 214, 8, 2, 1, 185, 4, 211, 244, 26, 217, 214, 8, 6, 1, + 233, 167, 4, 246, 207, 8, 2, 1, 233, 167, 4, 246, 207, 8, 2, 1, 223, 66, + 4, 246, 207, 8, 6, 1, 235, 18, 8, 6, 1, 238, 96, 4, 2, 1, 192, 155, 8, 2, + 1, 235, 18, 8, 6, 1, 232, 45, 4, 251, 129, 8, 2, 1, 232, 45, 4, 251, 129, + 8, 6, 1, 228, 145, 8, 6, 1, 193, 226, 8, 6, 1, 215, 152, 4, 230, 210, 8, + 2, 1, 215, 152, 4, 230, 210, 8, 6, 1, 41, 4, 207, 82, 95, 26, 251, 129, + 8, 2, 1, 41, 4, 207, 82, 95, 26, 251, 129, 8, 6, 1, 251, 109, 4, 251, + 129, 8, 2, 1, 251, 109, 4, 251, 129, 8, 6, 1, 185, 4, 201, 208, 26, 251, + 129, 8, 2, 1, 185, 4, 201, 208, 26, 251, 129, 8, 6, 1, 41, 4, 55, 230, + 210, 8, 2, 1, 41, 4, 55, 230, 210, 8, 6, 1, 41, 4, 223, 121, 247, 150, 8, + 2, 1, 41, 4, 223, 121, 247, 150, 8, 6, 1, 234, 253, 4, 55, 230, 210, 8, + 2, 1, 234, 253, 4, 55, 230, 210, 8, 6, 1, 234, 253, 4, 223, 121, 247, + 150, 8, 2, 1, 234, 253, 4, 223, 121, 247, 150, 8, 6, 1, 228, 97, 4, 55, + 230, 210, 8, 2, 1, 228, 97, 4, 55, 230, 210, 8, 6, 1, 228, 97, 4, 223, + 121, 247, 150, 8, 2, 1, 228, 97, 4, 223, 121, 247, 150, 8, 6, 1, 185, 4, + 55, 230, 210, 8, 2, 1, 185, 4, 55, 230, 210, 8, 6, 1, 185, 4, 223, 121, + 247, 150, 8, 2, 1, 185, 4, 223, 121, 247, 150, 8, 6, 1, 208, 112, 4, 55, + 230, 210, 8, 2, 1, 208, 112, 4, 55, 230, 210, 8, 6, 1, 208, 112, 4, 223, + 121, 247, 150, 8, 2, 1, 208, 112, 4, 223, 121, 247, 150, 8, 6, 1, 124, 4, + 55, 230, 210, 8, 2, 1, 124, 4, 55, 230, 210, 8, 6, 1, 124, 4, 223, 121, + 247, 150, 8, 2, 1, 124, 4, 223, 121, 247, 150, 8, 6, 1, 206, 159, 4, 242, + 39, 63, 8, 2, 1, 206, 159, 4, 242, 39, 63, 8, 6, 1, 200, 229, 4, 242, 39, + 63, 8, 2, 1, 200, 229, 4, 242, 39, 63, 8, 6, 1, 192, 237, 8, 2, 1, 192, + 237, 8, 6, 1, 230, 125, 4, 246, 207, 8, 2, 1, 230, 125, 4, 246, 207, 8, + 6, 1, 215, 152, 4, 184, 51, 220, 16, 8, 2, 1, 238, 96, 4, 238, 142, 8, 6, + 1, 211, 130, 8, 2, 1, 211, 130, 8, 6, 1, 192, 156, 4, 128, 8, 2, 1, 192, + 156, 4, 128, 8, 6, 1, 41, 4, 78, 58, 8, 2, 1, 41, 4, 78, 58, 8, 6, 1, + 234, 253, 4, 246, 151, 8, 2, 1, 234, 253, 4, 246, 151, 8, 6, 1, 185, 4, + 237, 15, 26, 217, 214, 8, 2, 1, 185, 4, 237, 15, 26, 217, 214, 8, 6, 1, + 185, 4, 199, 91, 26, 217, 214, 8, 2, 1, 185, 4, 199, 91, 26, 217, 214, 8, + 6, 1, 185, 4, 78, 58, 8, 2, 1, 185, 4, 78, 58, 8, 6, 1, 185, 4, 78, 95, + 26, 217, 214, 8, 2, 1, 185, 4, 78, 95, 26, 217, 214, 8, 6, 1, 193, 149, + 4, 217, 214, 8, 2, 1, 193, 149, 4, 217, 214, 8, 2, 1, 220, 202, 4, 238, + 142, 8, 2, 1, 215, 152, 4, 238, 142, 8, 2, 1, 200, 229, 4, 238, 142, 8, + 2, 1, 236, 113, 223, 65, 8, 2, 1, 237, 171, 236, 230, 8, 2, 1, 208, 178, + 236, 230, 8, 6, 1, 41, 4, 111, 8, 6, 1, 247, 53, 4, 111, 8, 2, 1, 247, + 53, 4, 111, 8, 6, 1, 220, 202, 4, 161, 8, 6, 1, 200, 229, 4, 237, 11, + 111, 8, 2, 1, 206, 159, 4, 201, 75, 200, 147, 8, 2, 1, 192, 156, 4, 201, + 75, 200, 147, 8, 6, 1, 231, 6, 201, 238, 8, 2, 1, 231, 6, 201, 238, 8, 6, + 1, 76, 4, 111, 8, 6, 1, 124, 161, 8, 6, 1, 163, 196, 236, 8, 6, 1, 234, + 253, 4, 111, 8, 2, 1, 234, 253, 4, 111, 8, 6, 1, 223, 66, 4, 111, 8, 2, + 1, 223, 66, 4, 111, 8, 6, 1, 2, 208, 248, 4, 229, 15, 200, 147, 8, 2, 1, + 208, 248, 4, 229, 15, 200, 147, 8, 6, 1, 208, 112, 4, 111, 8, 2, 1, 208, + 112, 4, 111, 8, 6, 1, 193, 149, 4, 111, 8, 2, 1, 193, 149, 4, 111, 8, 2, + 1, 163, 64, 8, 2, 1, 250, 252, 8, 2, 1, 163, 250, 252, 8, 2, 1, 76, 4, + 128, 8, 2, 1, 211, 184, 74, 8, 2, 1, 247, 53, 4, 238, 142, 8, 2, 1, 238, + 96, 4, 200, 147, 8, 2, 1, 238, 96, 4, 128, 8, 2, 1, 207, 168, 71, 8, 2, + 1, 205, 240, 8, 2, 1, 205, 241, 4, 128, 8, 2, 1, 211, 184, 71, 8, 2, 1, + 207, 168, 211, 184, 71, 8, 2, 1, 207, 168, 211, 184, 234, 253, 4, 128, 8, + 2, 1, 242, 84, 207, 168, 211, 184, 71, 8, 2, 1, 236, 113, 223, 66, 4, + 111, 8, 2, 1, 232, 45, 4, 128, 8, 2, 1, 27, 232, 44, 8, 1, 2, 6, 232, 44, + 8, 2, 1, 231, 204, 8, 2, 1, 208, 32, 228, 208, 8, 2, 1, 163, 230, 124, 8, + 2, 1, 230, 125, 4, 128, 8, 2, 1, 229, 207, 4, 128, 8, 2, 1, 228, 97, 4, + 111, 8, 2, 1, 223, 111, 8, 1, 2, 6, 70, 8, 2, 1, 220, 202, 4, 85, 199, + 90, 8, 2, 1, 220, 202, 4, 248, 82, 8, 2, 1, 220, 202, 4, 207, 174, 128, + 8, 2, 1, 219, 225, 8, 2, 1, 163, 218, 236, 8, 2, 1, 163, 218, 237, 4, + 184, 220, 16, 8, 2, 1, 218, 237, 4, 128, 8, 2, 1, 215, 152, 4, 46, 128, + 8, 2, 1, 215, 152, 4, 207, 174, 128, 8, 1, 2, 6, 215, 151, 8, 2, 1, 248, + 188, 74, 8, 1, 2, 6, 212, 0, 8, 2, 1, 242, 84, 211, 216, 8, 2, 1, 210, + 77, 8, 2, 1, 163, 150, 8, 2, 1, 163, 208, 112, 4, 184, 220, 16, 8, 2, 1, + 163, 208, 112, 4, 128, 8, 2, 1, 208, 112, 4, 184, 220, 16, 8, 2, 1, 208, + 112, 4, 200, 147, 8, 2, 1, 208, 112, 4, 232, 221, 8, 2, 1, 207, 168, 208, + 112, 4, 232, 221, 8, 1, 2, 6, 150, 8, 1, 2, 6, 223, 121, 150, 8, 2, 1, + 206, 159, 4, 128, 8, 2, 1, 233, 255, 8, 2, 1, 236, 113, 223, 66, 4, 201, + 208, 26, 128, 8, 2, 1, 202, 103, 207, 168, 233, 255, 8, 2, 1, 234, 0, 4, + 238, 142, 8, 2, 1, 163, 200, 228, 8, 2, 1, 200, 229, 4, 207, 174, 128, 8, + 2, 1, 124, 161, 8, 2, 1, 197, 34, 8, 2, 1, 196, 237, 4, 128, 8, 2, 1, + 163, 196, 236, 8, 2, 1, 163, 194, 202, 8, 2, 1, 163, 193, 148, 8, 1, 2, + 6, 193, 148, 8, 2, 1, 192, 156, 4, 207, 174, 128, 8, 2, 1, 192, 156, 4, + 238, 142, 8, 2, 1, 233, 166, 8, 2, 1, 233, 167, 4, 238, 142, 8, 1, 231, + 6, 201, 238, 8, 1, 210, 85, 195, 248, 232, 95, 8, 1, 223, 121, 231, 6, + 201, 238, 8, 1, 201, 216, 247, 52, 8, 1, 248, 25, 242, 96, 8, 1, 2, 6, + 249, 226, 8, 2, 1, 242, 84, 211, 184, 71, 8, 1, 2, 6, 232, 45, 4, 128, 8, + 1, 2, 6, 230, 124, 8, 2, 1, 223, 66, 4, 238, 178, 8, 2, 1, 163, 222, 184, + 8, 1, 2, 6, 165, 8, 2, 1, 208, 248, 4, 128, 8, 1, 231, 6, 201, 239, 4, + 111, 8, 1, 207, 168, 231, 6, 201, 239, 4, 111, 8, 2, 1, 235, 19, 236, + 230, 8, 2, 1, 237, 42, 236, 230, 8, 2, 1, 235, 19, 236, 231, 4, 238, 142, + 8, 2, 1, 198, 120, 236, 230, 8, 2, 1, 200, 14, 236, 230, 8, 2, 1, 200, + 86, 236, 231, 4, 238, 142, 8, 2, 1, 233, 25, 236, 230, 8, 2, 1, 219, 38, + 236, 230, 8, 2, 1, 218, 238, 236, 230, 8, 1, 248, 25, 210, 132, 8, 1, + 248, 33, 210, 132, 8, 2, 1, 163, 230, 125, 4, 232, 221, 8, 2, 1, 163, + 230, 125, 4, 232, 222, 26, 200, 147, 73, 1, 2, 230, 124, 73, 1, 2, 230, + 125, 4, 128, 73, 1, 2, 223, 65, 73, 1, 2, 150, 73, 1, 2, 163, 150, 73, 1, + 2, 163, 208, 112, 4, 128, 73, 1, 2, 6, 223, 121, 150, 73, 1, 2, 194, 202, + 73, 1, 2, 193, 148, 73, 1, 209, 99, 73, 1, 55, 209, 99, 73, 1, 163, 242, + 38, 73, 1, 250, 147, 73, 1, 207, 168, 242, 38, 73, 1, 51, 138, 207, 81, + 73, 1, 46, 138, 207, 81, 73, 1, 231, 6, 201, 238, 73, 1, 207, 168, 231, + 6, 201, 238, 73, 1, 46, 250, 77, 73, 1, 51, 250, 77, 73, 1, 130, 250, 77, + 73, 1, 142, 250, 77, 73, 1, 242, 122, 251, 143, 246, 207, 73, 1, 84, 219, + 175, 73, 1, 217, 214, 73, 1, 251, 130, 251, 143, 73, 1, 230, 211, 251, + 143, 73, 1, 132, 84, 219, 175, 73, 1, 132, 217, 214, 73, 1, 132, 230, + 211, 251, 143, 73, 1, 132, 251, 130, 251, 143, 73, 1, 198, 182, 242, 47, + 73, 1, 138, 198, 182, 242, 47, 73, 1, 246, 136, 51, 138, 207, 81, 73, 1, + 246, 136, 46, 138, 207, 81, 73, 1, 130, 200, 159, 73, 1, 142, 200, 159, + 73, 1, 102, 57, 73, 1, 216, 113, 57, 247, 150, 78, 58, 207, 82, 58, 211, + 243, 2, 199, 90, 55, 251, 130, 251, 143, 73, 1, 207, 152, 128, 73, 1, + 238, 184, 251, 143, 73, 1, 2, 231, 204, 73, 1, 2, 165, 73, 1, 2, 206, + 158, 73, 1, 2, 193, 223, 73, 1, 2, 207, 168, 231, 6, 201, 238, 73, 1, + 233, 188, 158, 161, 73, 1, 139, 158, 161, 73, 1, 216, 162, 158, 161, 73, + 1, 132, 158, 161, 73, 1, 233, 187, 158, 161, 73, 1, 193, 11, 237, 66, + 158, 77, 73, 1, 193, 96, 237, 66, 158, 77, 73, 1, 195, 246, 73, 1, 197, + 73, 73, 1, 55, 250, 147, 73, 1, 132, 142, 250, 77, 73, 1, 132, 130, 250, + 77, 73, 1, 132, 46, 250, 77, 73, 1, 132, 51, 250, 77, 73, 1, 132, 207, + 81, 73, 1, 85, 230, 211, 251, 143, 73, 1, 85, 55, 230, 211, 251, 143, 73, + 1, 85, 55, 251, 130, 251, 143, 73, 1, 132, 199, 90, 73, 1, 208, 39, 242, + 47, 73, 1, 248, 100, 139, 199, 18, 73, 1, 234, 80, 139, 199, 18, 73, 1, + 248, 100, 132, 199, 18, 73, 1, 234, 80, 132, 199, 18, 73, 1, 204, 3, 73, + 1, 211, 184, 204, 3, 73, 1, 132, 46, 54, 38, 230, 211, 251, 143, 38, 251, + 130, 251, 143, 38, 242, 122, 251, 143, 38, 199, 90, 38, 217, 214, 38, + 211, 109, 38, 247, 150, 38, 78, 58, 38, 237, 14, 38, 229, 15, 58, 38, + 207, 82, 58, 38, 55, 251, 130, 251, 143, 38, 246, 207, 38, 84, 219, 176, + 58, 38, 55, 84, 219, 176, 58, 38, 55, 230, 211, 251, 143, 38, 246, 234, + 38, 223, 121, 247, 150, 38, 163, 242, 39, 58, 38, 242, 39, 58, 38, 207, + 168, 242, 39, 58, 38, 242, 39, 95, 207, 101, 38, 230, 211, 251, 144, 63, + 38, 251, 130, 251, 144, 63, 38, 46, 200, 160, 63, 38, 51, 200, 160, 63, + 38, 46, 250, 208, 58, 38, 228, 208, 38, 46, 138, 207, 82, 63, 38, 130, + 200, 160, 63, 38, 142, 200, 160, 63, 38, 102, 3, 63, 38, 216, 113, 3, 63, + 38, 211, 47, 229, 15, 63, 38, 207, 174, 229, 15, 63, 38, 78, 63, 38, 237, + 15, 63, 38, 207, 82, 63, 38, 242, 39, 63, 38, 246, 151, 38, 211, 243, 38, + 84, 219, 176, 63, 38, 247, 143, 63, 38, 223, 121, 55, 250, 113, 63, 38, + 246, 208, 63, 38, 242, 122, 251, 144, 63, 38, 247, 151, 63, 38, 223, 121, + 247, 151, 63, 38, 199, 91, 63, 38, 217, 215, 63, 38, 132, 219, 175, 38, + 55, 132, 219, 175, 38, 199, 91, 211, 110, 38, 203, 195, 201, 208, 211, + 110, 38, 184, 201, 208, 211, 110, 38, 203, 195, 202, 190, 211, 110, 38, + 184, 202, 190, 211, 110, 38, 51, 138, 207, 82, 63, 38, 223, 121, 247, + 143, 63, 38, 50, 63, 38, 205, 217, 63, 38, 193, 224, 58, 38, 84, 199, 90, + 38, 55, 211, 109, 38, 230, 211, 158, 77, 38, 251, 130, 158, 77, 38, 33, + 210, 126, 38, 33, 221, 78, 38, 33, 237, 8, 198, 255, 38, 33, 192, 222, + 38, 247, 143, 58, 38, 234, 30, 3, 63, 38, 55, 84, 219, 176, 63, 38, 46, + 250, 208, 63, 38, 213, 111, 199, 91, 58, 38, 229, 21, 58, 38, 251, 1, + 187, 115, 58, 38, 46, 51, 61, 63, 38, 197, 30, 61, 63, 38, 230, 217, 222, + 228, 38, 51, 250, 78, 58, 38, 46, 138, 207, 82, 58, 38, 233, 22, 38, 193, + 224, 63, 38, 46, 250, 78, 63, 38, 51, 250, 78, 63, 38, 51, 250, 78, 26, + 130, 250, 78, 63, 38, 51, 138, 207, 82, 58, 38, 78, 95, 207, 101, 38, + 250, 38, 63, 38, 55, 207, 82, 63, 38, 192, 21, 58, 38, 55, 247, 151, 63, + 38, 55, 247, 150, 38, 55, 217, 214, 38, 55, 217, 215, 63, 38, 55, 199, + 90, 38, 55, 223, 121, 247, 150, 38, 55, 94, 61, 63, 38, 8, 2, 1, 64, 38, + 8, 2, 1, 71, 38, 8, 2, 1, 70, 38, 8, 2, 1, 74, 38, 8, 2, 1, 68, 38, 8, 2, + 1, 247, 52, 38, 8, 2, 1, 238, 95, 38, 8, 2, 1, 230, 124, 38, 8, 2, 1, + 218, 236, 38, 8, 2, 1, 150, 38, 8, 2, 1, 200, 228, 38, 8, 2, 1, 196, 236, + 38, 8, 2, 1, 193, 223, 33, 6, 1, 229, 195, 33, 2, 1, 229, 195, 33, 6, 1, + 250, 112, 206, 43, 33, 2, 1, 250, 112, 206, 43, 33, 212, 234, 57, 33, + 106, 212, 234, 57, 33, 6, 1, 211, 30, 236, 238, 33, 2, 1, 211, 30, 236, + 238, 33, 192, 222, 33, 2, 207, 168, 219, 18, 203, 100, 109, 33, 2, 235, + 111, 219, 18, 203, 100, 109, 33, 2, 207, 168, 235, 111, 219, 18, 203, + 100, 109, 33, 208, 159, 77, 33, 6, 1, 192, 229, 33, 198, 255, 33, 237, 8, + 198, 255, 33, 6, 1, 250, 253, 4, 198, 255, 33, 250, 191, 200, 43, 33, 6, + 1, 234, 33, 4, 198, 255, 33, 6, 1, 233, 241, 4, 198, 255, 33, 6, 1, 223, + 112, 4, 198, 255, 33, 6, 1, 211, 215, 4, 198, 255, 33, 6, 1, 197, 35, 4, + 198, 255, 33, 6, 1, 211, 217, 4, 198, 255, 33, 2, 1, 223, 112, 4, 237, 8, + 26, 198, 255, 33, 6, 1, 250, 252, 33, 6, 1, 248, 63, 33, 6, 1, 231, 204, + 33, 6, 1, 237, 76, 33, 6, 1, 234, 32, 33, 6, 1, 192, 75, 33, 6, 1, 233, + 240, 33, 6, 1, 199, 206, 33, 6, 1, 223, 111, 33, 6, 1, 222, 106, 33, 6, + 1, 220, 90, 33, 6, 1, 215, 241, 33, 6, 1, 213, 22, 33, 6, 1, 193, 196, + 33, 6, 1, 211, 214, 33, 6, 1, 210, 51, 33, 6, 1, 207, 153, 33, 6, 1, 203, + 99, 33, 6, 1, 200, 100, 33, 6, 1, 197, 34, 33, 6, 1, 210, 77, 33, 6, 1, + 242, 215, 33, 6, 1, 209, 62, 33, 6, 1, 211, 216, 33, 6, 1, 223, 112, 4, + 237, 7, 33, 6, 1, 197, 35, 4, 237, 7, 33, 2, 1, 250, 253, 4, 198, 255, + 33, 2, 1, 234, 33, 4, 198, 255, 33, 2, 1, 233, 241, 4, 198, 255, 33, 2, + 1, 223, 112, 4, 198, 255, 33, 2, 1, 197, 35, 4, 237, 8, 26, 198, 255, 33, + 2, 1, 250, 252, 33, 2, 1, 248, 63, 33, 2, 1, 231, 204, 33, 2, 1, 237, 76, + 33, 2, 1, 234, 32, 33, 2, 1, 192, 75, 33, 2, 1, 233, 240, 33, 2, 1, 199, + 206, 33, 2, 1, 223, 111, 33, 2, 1, 222, 106, 33, 2, 1, 220, 90, 33, 2, 1, + 215, 241, 33, 2, 1, 213, 22, 33, 2, 1, 193, 196, 33, 2, 1, 211, 214, 33, + 2, 1, 210, 51, 33, 2, 1, 207, 153, 33, 2, 1, 52, 203, 99, 33, 2, 1, 203, + 99, 33, 2, 1, 200, 100, 33, 2, 1, 197, 34, 33, 2, 1, 210, 77, 33, 2, 1, + 242, 215, 33, 2, 1, 209, 62, 33, 2, 1, 211, 216, 33, 2, 1, 223, 112, 4, + 237, 7, 33, 2, 1, 197, 35, 4, 237, 7, 33, 2, 1, 211, 215, 4, 198, 255, + 33, 2, 1, 197, 35, 4, 198, 255, 33, 2, 1, 211, 217, 4, 198, 255, 33, 6, + 222, 136, 109, 33, 248, 64, 109, 33, 199, 207, 109, 33, 197, 35, 4, 229, + 15, 109, 33, 197, 35, 4, 251, 130, 26, 229, 15, 109, 33, 197, 35, 4, 237, + 15, 26, 229, 15, 109, 33, 210, 78, 109, 33, 210, 52, 109, 33, 222, 136, + 109, 33, 1, 250, 112, 221, 82, 33, 2, 1, 250, 112, 221, 82, 33, 1, 201, + 248, 33, 2, 1, 201, 248, 33, 1, 236, 238, 33, 2, 1, 236, 238, 33, 1, 221, + 82, 33, 2, 1, 221, 82, 33, 1, 206, 43, 33, 2, 1, 206, 43, 92, 6, 1, 204, + 4, 92, 2, 1, 204, 4, 92, 6, 1, 233, 32, 92, 2, 1, 233, 32, 92, 6, 1, 221, + 232, 92, 2, 1, 221, 232, 92, 6, 1, 229, 6, 92, 2, 1, 229, 6, 92, 6, 1, + 231, 199, 92, 2, 1, 231, 199, 92, 6, 1, 203, 226, 92, 2, 1, 203, 226, 92, + 6, 1, 237, 92, 92, 2, 1, 237, 92, 33, 222, 107, 109, 33, 207, 154, 109, + 33, 219, 18, 203, 100, 109, 33, 1, 192, 229, 33, 6, 199, 207, 109, 33, + 219, 18, 234, 33, 109, 33, 207, 168, 219, 18, 234, 33, 109, 33, 6, 1, + 203, 211, 33, 2, 1, 203, 211, 33, 6, 219, 18, 203, 100, 109, 33, 6, 1, + 206, 40, 33, 2, 1, 206, 40, 33, 207, 154, 4, 201, 208, 109, 33, 6, 207, + 168, 219, 18, 203, 100, 109, 33, 6, 235, 111, 219, 18, 203, 100, 109, 33, + 6, 207, 168, 235, 111, 219, 18, 203, 100, 109, 42, 6, 1, 223, 252, 4, + 230, 210, 42, 6, 1, 223, 116, 42, 6, 1, 236, 164, 42, 6, 1, 231, 15, 42, + 6, 1, 197, 89, 223, 251, 42, 6, 1, 235, 14, 42, 6, 1, 247, 62, 70, 42, 6, + 1, 193, 22, 42, 6, 1, 223, 41, 42, 6, 1, 219, 140, 42, 6, 1, 213, 249, + 42, 6, 1, 198, 106, 42, 6, 1, 221, 141, 42, 6, 1, 228, 97, 4, 230, 210, + 42, 6, 1, 203, 195, 68, 42, 6, 1, 235, 10, 42, 6, 1, 64, 42, 6, 1, 248, + 123, 42, 6, 1, 196, 123, 42, 6, 1, 231, 70, 42, 6, 1, 237, 116, 42, 6, 1, + 223, 251, 42, 6, 1, 192, 62, 42, 6, 1, 192, 85, 42, 6, 1, 70, 42, 6, 1, + 203, 195, 70, 42, 6, 1, 160, 42, 6, 1, 234, 124, 42, 6, 1, 234, 99, 42, + 6, 1, 234, 88, 42, 6, 1, 74, 42, 6, 1, 210, 181, 42, 6, 1, 234, 21, 42, + 6, 1, 234, 9, 42, 6, 1, 200, 79, 42, 6, 1, 68, 42, 6, 1, 234, 164, 42, 6, + 1, 144, 42, 6, 1, 198, 112, 42, 6, 1, 242, 245, 42, 6, 1, 204, 64, 42, 6, + 1, 204, 15, 42, 6, 1, 230, 26, 57, 42, 6, 1, 193, 47, 42, 6, 1, 202, 198, + 57, 42, 6, 1, 71, 42, 6, 1, 192, 214, 42, 6, 1, 168, 42, 2, 1, 64, 42, 2, + 1, 248, 123, 42, 2, 1, 196, 123, 42, 2, 1, 231, 70, 42, 2, 1, 237, 116, + 42, 2, 1, 223, 251, 42, 2, 1, 192, 62, 42, 2, 1, 192, 85, 42, 2, 1, 70, + 42, 2, 1, 203, 195, 70, 42, 2, 1, 160, 42, 2, 1, 234, 124, 42, 2, 1, 234, + 99, 42, 2, 1, 234, 88, 42, 2, 1, 74, 42, 2, 1, 210, 181, 42, 2, 1, 234, + 21, 42, 2, 1, 234, 9, 42, 2, 1, 200, 79, 42, 2, 1, 68, 42, 2, 1, 234, + 164, 42, 2, 1, 144, 42, 2, 1, 198, 112, 42, 2, 1, 242, 245, 42, 2, 1, + 204, 64, 42, 2, 1, 204, 15, 42, 2, 1, 230, 26, 57, 42, 2, 1, 193, 47, 42, + 2, 1, 202, 198, 57, 42, 2, 1, 71, 42, 2, 1, 192, 214, 42, 2, 1, 168, 42, + 2, 1, 223, 252, 4, 230, 210, 42, 2, 1, 223, 116, 42, 2, 1, 236, 164, 42, + 2, 1, 231, 15, 42, 2, 1, 197, 89, 223, 251, 42, 2, 1, 235, 14, 42, 2, 1, + 247, 62, 70, 42, 2, 1, 193, 22, 42, 2, 1, 223, 41, 42, 2, 1, 219, 140, + 42, 2, 1, 213, 249, 42, 2, 1, 198, 106, 42, 2, 1, 221, 141, 42, 2, 1, + 228, 97, 4, 230, 210, 42, 2, 1, 203, 195, 68, 42, 2, 1, 235, 10, 42, 6, + 1, 211, 216, 42, 2, 1, 211, 216, 42, 6, 1, 193, 84, 42, 2, 1, 193, 84, + 42, 6, 1, 223, 109, 71, 42, 2, 1, 223, 109, 71, 42, 6, 1, 219, 147, 192, + 179, 42, 2, 1, 219, 147, 192, 179, 42, 6, 1, 223, 109, 219, 147, 192, + 179, 42, 2, 1, 223, 109, 219, 147, 192, 179, 42, 6, 1, 248, 28, 192, 179, + 42, 2, 1, 248, 28, 192, 179, 42, 6, 1, 223, 109, 248, 28, 192, 179, 42, + 2, 1, 223, 109, 248, 28, 192, 179, 42, 6, 1, 221, 49, 42, 2, 1, 221, 49, + 42, 6, 1, 209, 62, 42, 2, 1, 209, 62, 42, 6, 1, 232, 216, 42, 2, 1, 232, + 216, 42, 6, 1, 223, 67, 42, 2, 1, 223, 67, 42, 6, 1, 223, 68, 4, 55, 230, + 211, 251, 143, 42, 2, 1, 223, 68, 4, 55, 230, 211, 251, 143, 42, 6, 1, + 197, 92, 42, 2, 1, 197, 92, 42, 6, 1, 207, 9, 211, 216, 42, 2, 1, 207, 9, + 211, 216, 42, 6, 1, 211, 217, 4, 199, 60, 42, 2, 1, 211, 217, 4, 199, 60, + 42, 6, 1, 211, 140, 42, 2, 1, 211, 140, 42, 6, 1, 221, 82, 42, 2, 1, 221, + 82, 42, 199, 164, 57, 38, 42, 199, 60, 38, 42, 211, 48, 38, 42, 237, 183, + 209, 200, 38, 42, 209, 56, 209, 200, 38, 42, 209, 184, 38, 42, 228, 163, + 199, 164, 57, 38, 42, 216, 124, 57, 42, 6, 1, 203, 195, 228, 97, 4, 200, + 147, 42, 2, 1, 203, 195, 228, 97, 4, 200, 147, 42, 6, 1, 204, 176, 57, + 42, 2, 1, 204, 176, 57, 42, 6, 1, 234, 22, 4, 199, 117, 42, 2, 1, 234, + 22, 4, 199, 117, 42, 6, 1, 231, 71, 4, 197, 33, 42, 2, 1, 231, 71, 4, + 197, 33, 42, 6, 1, 231, 71, 4, 111, 42, 2, 1, 231, 71, 4, 111, 42, 6, 1, + 231, 71, 4, 85, 128, 42, 2, 1, 231, 71, 4, 85, 128, 42, 6, 1, 192, 63, 4, + 237, 59, 42, 2, 1, 192, 63, 4, 237, 59, 42, 6, 1, 192, 86, 4, 237, 59, + 42, 2, 1, 192, 86, 4, 237, 59, 42, 6, 1, 222, 174, 4, 237, 59, 42, 2, 1, + 222, 174, 4, 237, 59, 42, 6, 1, 222, 174, 4, 84, 111, 42, 2, 1, 222, 174, + 4, 84, 111, 42, 6, 1, 222, 174, 4, 111, 42, 2, 1, 222, 174, 4, 111, 42, + 6, 1, 248, 176, 160, 42, 2, 1, 248, 176, 160, 42, 6, 1, 234, 89, 4, 237, + 59, 42, 2, 1, 234, 89, 4, 237, 59, 42, 6, 34, 234, 89, 231, 70, 42, 2, + 34, 234, 89, 231, 70, 42, 6, 1, 210, 182, 4, 85, 128, 42, 2, 1, 210, 182, + 4, 85, 128, 42, 6, 1, 251, 150, 144, 42, 2, 1, 251, 150, 144, 42, 6, 1, + 234, 10, 4, 237, 59, 42, 2, 1, 234, 10, 4, 237, 59, 42, 6, 1, 200, 80, 4, + 237, 59, 42, 2, 1, 200, 80, 4, 237, 59, 42, 6, 1, 201, 230, 68, 42, 2, 1, + 201, 230, 68, 42, 6, 1, 201, 230, 124, 4, 111, 42, 2, 1, 201, 230, 124, + 4, 111, 42, 6, 1, 230, 113, 4, 237, 59, 42, 2, 1, 230, 113, 4, 237, 59, + 42, 6, 34, 200, 80, 198, 112, 42, 2, 34, 200, 80, 198, 112, 42, 6, 1, + 242, 246, 4, 237, 59, 42, 2, 1, 242, 246, 4, 237, 59, 42, 6, 1, 242, 246, + 4, 84, 111, 42, 2, 1, 242, 246, 4, 84, 111, 42, 6, 1, 203, 237, 42, 2, 1, + 203, 237, 42, 6, 1, 251, 150, 242, 245, 42, 2, 1, 251, 150, 242, 245, 42, + 6, 1, 251, 150, 242, 246, 4, 237, 59, 42, 2, 1, 251, 150, 242, 246, 4, + 237, 59, 42, 1, 211, 37, 42, 6, 1, 192, 63, 4, 247, 150, 42, 2, 1, 192, + 63, 4, 247, 150, 42, 6, 1, 222, 174, 4, 128, 42, 2, 1, 222, 174, 4, 128, + 42, 6, 1, 234, 125, 4, 200, 147, 42, 2, 1, 234, 125, 4, 200, 147, 42, 6, + 1, 234, 89, 4, 128, 42, 2, 1, 234, 89, 4, 128, 42, 6, 1, 234, 89, 4, 200, + 147, 42, 2, 1, 234, 89, 4, 200, 147, 42, 6, 1, 221, 243, 242, 245, 42, 2, + 1, 221, 243, 242, 245, 42, 6, 1, 234, 100, 4, 200, 147, 42, 2, 1, 234, + 100, 4, 200, 147, 42, 2, 1, 211, 37, 42, 6, 1, 41, 4, 247, 150, 42, 2, 1, + 41, 4, 247, 150, 42, 6, 1, 41, 4, 237, 14, 42, 2, 1, 41, 4, 237, 14, 42, + 6, 34, 41, 223, 251, 42, 2, 34, 41, 223, 251, 42, 6, 1, 223, 252, 4, 247, + 150, 42, 2, 1, 223, 252, 4, 247, 150, 42, 6, 1, 205, 240, 42, 2, 1, 205, + 240, 42, 6, 1, 205, 241, 4, 237, 14, 42, 2, 1, 205, 241, 4, 237, 14, 42, + 6, 1, 192, 63, 4, 237, 14, 42, 2, 1, 192, 63, 4, 237, 14, 42, 6, 1, 192, + 86, 4, 237, 14, 42, 2, 1, 192, 86, 4, 237, 14, 42, 6, 1, 251, 150, 235, + 14, 42, 2, 1, 251, 150, 235, 14, 42, 6, 1, 228, 97, 4, 217, 214, 42, 2, + 1, 228, 97, 4, 217, 214, 42, 6, 1, 228, 97, 4, 237, 14, 42, 2, 1, 228, + 97, 4, 237, 14, 42, 6, 1, 185, 4, 237, 14, 42, 2, 1, 185, 4, 237, 14, 42, + 6, 1, 248, 188, 74, 42, 2, 1, 248, 188, 74, 42, 6, 1, 248, 188, 185, 4, + 237, 14, 42, 2, 1, 248, 188, 185, 4, 237, 14, 42, 6, 1, 234, 253, 4, 237, + 14, 42, 2, 1, 234, 253, 4, 237, 14, 42, 6, 1, 124, 4, 217, 214, 42, 2, 1, + 124, 4, 217, 214, 42, 6, 1, 124, 4, 237, 14, 42, 2, 1, 124, 4, 237, 14, + 42, 6, 1, 124, 4, 55, 251, 129, 42, 2, 1, 124, 4, 55, 251, 129, 42, 6, 1, + 242, 246, 4, 237, 14, 42, 2, 1, 242, 246, 4, 237, 14, 42, 6, 1, 231, 71, + 4, 237, 59, 42, 2, 1, 231, 71, 4, 237, 59, 42, 6, 1, 193, 48, 4, 237, 14, + 42, 2, 1, 193, 48, 4, 237, 14, 42, 6, 1, 231, 71, 4, 201, 208, 26, 128, + 42, 2, 1, 231, 71, 4, 201, 208, 26, 128, 42, 6, 1, 230, 113, 4, 128, 42, + 2, 1, 230, 113, 4, 128, 42, 6, 1, 230, 113, 4, 111, 42, 2, 1, 230, 113, + 4, 111, 42, 6, 1, 221, 92, 237, 116, 42, 2, 1, 221, 92, 237, 116, 42, 6, + 1, 221, 92, 236, 164, 42, 2, 1, 221, 92, 236, 164, 42, 6, 1, 221, 92, + 192, 12, 42, 2, 1, 221, 92, 192, 12, 42, 6, 1, 221, 92, 235, 6, 42, 2, 1, + 221, 92, 235, 6, 42, 6, 1, 221, 92, 219, 140, 42, 2, 1, 221, 92, 219, + 140, 42, 6, 1, 221, 92, 213, 249, 42, 2, 1, 221, 92, 213, 249, 42, 6, 1, + 221, 92, 203, 20, 42, 2, 1, 221, 92, 203, 20, 42, 6, 1, 221, 92, 199, 54, + 42, 2, 1, 221, 92, 199, 54, 42, 6, 1, 207, 168, 192, 85, 42, 2, 1, 207, + 168, 192, 85, 42, 6, 1, 234, 125, 4, 128, 42, 2, 1, 234, 125, 4, 128, 42, + 6, 1, 219, 222, 42, 2, 1, 219, 222, 42, 6, 1, 207, 156, 42, 2, 1, 207, + 156, 42, 6, 1, 193, 118, 42, 2, 1, 193, 118, 42, 6, 1, 208, 239, 42, 2, + 1, 208, 239, 42, 6, 1, 194, 111, 42, 2, 1, 194, 111, 42, 6, 1, 251, 22, + 160, 42, 2, 1, 251, 22, 160, 42, 6, 1, 234, 125, 4, 85, 128, 42, 2, 1, + 234, 125, 4, 85, 128, 42, 6, 1, 234, 89, 4, 85, 128, 42, 2, 1, 234, 89, + 4, 85, 128, 42, 6, 1, 210, 182, 4, 237, 59, 42, 2, 1, 210, 182, 4, 237, + 59, 42, 6, 1, 203, 238, 4, 237, 59, 42, 2, 1, 203, 238, 4, 237, 59, 42, + 6, 1, 234, 89, 4, 46, 128, 42, 2, 1, 234, 89, 4, 46, 128, 42, 6, 1, 234, + 254, 42, 2, 1, 234, 254, 42, 6, 1, 237, 165, 42, 2, 1, 237, 165, 42, 6, + 1, 234, 125, 4, 237, 59, 42, 2, 1, 234, 125, 4, 237, 59, 250, 91, 6, 1, + 249, 233, 250, 91, 6, 1, 248, 80, 250, 91, 6, 1, 231, 33, 250, 91, 6, 1, + 238, 0, 250, 91, 6, 1, 234, 177, 250, 91, 6, 1, 192, 112, 250, 91, 6, 1, + 234, 157, 250, 91, 6, 1, 233, 242, 250, 91, 6, 1, 155, 250, 91, 6, 1, + 192, 62, 250, 91, 6, 1, 223, 159, 250, 91, 6, 1, 219, 144, 250, 91, 6, 1, + 193, 201, 250, 91, 6, 1, 247, 19, 250, 91, 6, 1, 222, 30, 250, 91, 6, 1, + 229, 43, 250, 91, 6, 1, 223, 62, 250, 91, 6, 1, 231, 81, 250, 91, 6, 1, + 242, 235, 250, 91, 6, 1, 217, 5, 250, 91, 6, 1, 193, 22, 250, 91, 6, 1, + 213, 96, 250, 91, 6, 1, 204, 64, 250, 91, 6, 1, 195, 252, 250, 91, 6, 1, + 246, 117, 250, 91, 6, 1, 210, 161, 250, 91, 6, 1, 223, 23, 250, 91, 6, 1, + 167, 250, 91, 6, 1, 205, 194, 250, 91, 6, 1, 196, 44, 250, 91, 6, 1, 199, + 57, 250, 91, 6, 1, 207, 221, 250, 91, 6, 1, 242, 63, 250, 91, 6, 1, 193, + 6, 250, 91, 6, 1, 209, 238, 250, 91, 6, 1, 222, 41, 250, 91, 6, 1, 211, + 241, 250, 91, 6, 1, 233, 34, 250, 91, 73, 1, 46, 138, 207, 81, 250, 91, + 250, 147, 250, 91, 234, 92, 77, 250, 91, 233, 204, 77, 250, 91, 242, 38, + 250, 91, 208, 159, 77, 250, 91, 251, 151, 77, 250, 91, 2, 1, 163, 249, + 233, 250, 91, 2, 1, 249, 233, 250, 91, 2, 1, 248, 80, 250, 91, 2, 1, 231, + 33, 250, 91, 2, 1, 238, 0, 250, 91, 2, 1, 234, 177, 250, 91, 2, 1, 192, + 112, 250, 91, 2, 1, 234, 157, 250, 91, 2, 1, 233, 242, 250, 91, 2, 1, + 155, 250, 91, 2, 1, 192, 62, 250, 91, 2, 1, 223, 159, 250, 91, 2, 1, 219, + 144, 250, 91, 2, 1, 193, 201, 250, 91, 2, 1, 247, 19, 250, 91, 2, 1, 222, + 30, 250, 91, 2, 1, 229, 43, 250, 91, 2, 1, 223, 62, 250, 91, 2, 1, 231, + 81, 250, 91, 2, 1, 242, 235, 250, 91, 2, 1, 217, 5, 250, 91, 2, 1, 193, + 22, 250, 91, 2, 1, 213, 96, 250, 91, 2, 1, 204, 64, 250, 91, 2, 1, 195, + 252, 250, 91, 2, 1, 246, 117, 250, 91, 2, 1, 210, 161, 250, 91, 2, 1, + 223, 23, 250, 91, 2, 1, 167, 250, 91, 2, 1, 205, 194, 250, 91, 2, 1, 196, + 44, 250, 91, 2, 1, 199, 57, 250, 91, 2, 1, 207, 221, 250, 91, 2, 1, 242, + 63, 250, 91, 2, 1, 193, 6, 250, 91, 2, 1, 209, 238, 250, 91, 2, 1, 222, + 41, 250, 91, 2, 1, 211, 241, 250, 91, 2, 1, 233, 34, 250, 91, 2, 34, 234, + 178, 193, 6, 250, 91, 2, 1, 11, 4, 111, 250, 91, 232, 71, 201, 238, 250, + 91, 228, 111, 207, 100, 250, 91, 233, 238, 57, 220, 27, 250, 91, 233, + 238, 57, 250, 91, 235, 83, 57, 129, 251, 144, 233, 233, 129, 251, 144, + 205, 195, 129, 251, 144, 204, 40, 129, 251, 144, 192, 97, 208, 222, 129, + 251, 144, 192, 97, 231, 223, 129, 251, 144, 199, 72, 129, 251, 144, 207, + 165, 129, 251, 144, 192, 95, 129, 251, 144, 210, 214, 129, 251, 144, 193, + 37, 129, 251, 144, 199, 247, 129, 251, 144, 231, 132, 129, 251, 144, 231, + 133, 215, 198, 129, 251, 144, 231, 130, 129, 251, 144, 208, 223, 210, + 246, 129, 251, 144, 200, 38, 231, 151, 129, 251, 144, 210, 187, 129, 251, + 144, 250, 17, 230, 93, 129, 251, 144, 215, 208, 129, 251, 144, 217, 185, + 129, 251, 144, 216, 250, 129, 251, 144, 216, 251, 222, 42, 129, 251, 144, + 237, 192, 129, 251, 144, 208, 234, 129, 251, 144, 200, 38, 208, 217, 129, + 251, 144, 193, 50, 248, 81, 192, 236, 129, 251, 144, 211, 223, 129, 251, + 144, 223, 210, 129, 251, 144, 237, 93, 129, 251, 144, 192, 19, 129, 122, + 217, 105, 242, 130, 129, 209, 192, 203, 240, 129, 209, 192, 230, 17, 205, + 195, 129, 209, 192, 230, 17, 210, 205, 129, 209, 192, 230, 17, 208, 227, + 129, 209, 192, 229, 139, 129, 209, 192, 198, 109, 129, 209, 192, 205, + 195, 129, 209, 192, 210, 205, 129, 209, 192, 208, 227, 129, 209, 192, + 229, 27, 129, 209, 192, 229, 28, 230, 19, 39, 196, 127, 129, 209, 192, + 208, 163, 129, 209, 192, 237, 241, 211, 164, 217, 140, 129, 209, 192, + 216, 239, 129, 209, 38, 217, 137, 129, 209, 192, 208, 51, 129, 209, 38, + 210, 216, 129, 209, 192, 203, 225, 236, 114, 129, 209, 192, 203, 79, 236, + 114, 129, 209, 38, 202, 199, 210, 207, 129, 122, 113, 236, 114, 129, 122, + 106, 236, 114, 129, 209, 38, 212, 231, 230, 92, 129, 209, 192, 208, 228, + 208, 222, 129, 1, 251, 26, 129, 1, 248, 65, 129, 1, 231, 31, 129, 1, 237, + 221, 129, 1, 229, 255, 129, 1, 196, 127, 129, 1, 192, 89, 129, 1, 229, + 196, 129, 1, 200, 8, 129, 1, 192, 239, 129, 1, 52, 222, 139, 129, 1, 222, + 139, 129, 1, 220, 86, 129, 1, 52, 217, 12, 129, 1, 217, 12, 129, 1, 52, + 212, 230, 129, 1, 212, 230, 129, 1, 206, 46, 129, 1, 249, 231, 129, 1, + 52, 210, 181, 129, 1, 210, 181, 129, 1, 52, 198, 113, 129, 1, 198, 113, + 129, 1, 208, 186, 129, 1, 207, 188, 129, 1, 203, 224, 129, 1, 200, 96, + 129, 192, 240, 198, 185, 129, 34, 193, 20, 55, 196, 127, 129, 34, 193, + 20, 196, 128, 192, 239, 129, 34, 193, 20, 55, 192, 239, 129, 209, 38, + 231, 132, 129, 209, 38, 231, 130, 9, 31, 57, 9, 3, 206, 39, 9, 232, 147, + 217, 122, 9, 3, 206, 81, 9, 3, 206, 42, 9, 31, 122, 58, 250, 126, 238, + 158, 207, 22, 250, 126, 232, 112, 207, 22, 9, 208, 15, 250, 126, 210, + 134, 216, 126, 57, 250, 126, 210, 134, 200, 31, 199, 165, 57, 251, 85, + 57, 9, 242, 38, 9, 237, 179, 204, 165, 9, 209, 194, 196, 107, 57, 9, 3, + 216, 104, 9, 3, 206, 57, 251, 29, 194, 135, 9, 3, 251, 29, 250, 42, 9, 3, + 208, 49, 251, 28, 9, 3, 208, 57, 251, 6, 250, 199, 9, 3, 200, 138, 9, 2, + 139, 200, 151, 9, 2, 139, 34, 157, 4, 220, 95, 4, 193, 64, 9, 2, 139, + 192, 103, 9, 2, 233, 58, 9, 2, 237, 215, 9, 2, 222, 86, 9, 204, 180, 9, + 1, 77, 9, 198, 170, 78, 209, 38, 77, 9, 208, 159, 77, 9, 1, 222, 90, 193, + 64, 9, 1, 230, 66, 9, 1, 157, 4, 217, 210, 58, 9, 1, 157, 4, 230, 67, 58, + 9, 1, 194, 120, 4, 230, 67, 58, 9, 1, 157, 4, 230, 67, 63, 9, 1, 97, 4, + 230, 67, 58, 9, 1, 251, 26, 9, 1, 248, 96, 9, 1, 200, 50, 217, 133, 9, 1, + 200, 49, 9, 1, 199, 220, 9, 1, 223, 37, 9, 1, 230, 89, 9, 1, 221, 245, 9, + 1, 237, 227, 9, 1, 199, 232, 9, 1, 207, 221, 9, 1, 192, 103, 9, 1, 205, + 201, 9, 1, 204, 8, 9, 1, 206, 86, 9, 1, 237, 250, 9, 1, 200, 151, 9, 1, + 192, 106, 9, 1, 251, 57, 9, 1, 231, 79, 9, 1, 222, 40, 4, 103, 236, 112, + 58, 9, 1, 222, 40, 4, 112, 236, 112, 63, 9, 1, 233, 62, 97, 4, 223, 121, + 196, 236, 9, 1, 233, 62, 97, 4, 103, 236, 112, 58, 9, 1, 233, 62, 97, 4, + 112, 236, 112, 58, 9, 200, 102, 9, 1, 233, 34, 9, 1, 208, 232, 9, 1, 222, + 139, 9, 1, 220, 94, 9, 1, 217, 26, 9, 1, 213, 123, 9, 1, 229, 220, 9, 1, + 194, 119, 9, 1, 157, 217, 168, 9, 1, 193, 64, 9, 233, 56, 9, 237, 213, 9, + 222, 84, 9, 233, 58, 9, 237, 215, 9, 222, 86, 9, 204, 54, 9, 201, 131, 9, + 217, 208, 58, 9, 230, 67, 58, 9, 230, 67, 63, 9, 201, 155, 251, 26, 9, + 223, 121, 237, 215, 9, 122, 213, 124, 231, 50, 9, 191, 238, 9, 18, 3, 2, + 196, 237, 58, 9, 18, 3, 223, 121, 2, 196, 237, 58, 9, 18, 3, 78, 63, 9, + 207, 168, 237, 215, 9, 233, 59, 4, 103, 236, 111, 9, 194, 121, 230, 67, + 63, 250, 126, 17, 192, 76, 250, 126, 17, 101, 250, 126, 17, 104, 250, + 126, 17, 133, 250, 126, 17, 134, 250, 126, 17, 151, 250, 126, 17, 170, + 250, 126, 17, 179, 250, 126, 17, 174, 250, 126, 17, 182, 9, 210, 133, 57, + 9, 237, 108, 204, 165, 9, 199, 164, 204, 165, 9, 232, 214, 209, 190, 202, + 19, 9, 1, 236, 113, 248, 96, 9, 1, 236, 113, 208, 232, 9, 1, 201, 107, + 251, 26, 9, 1, 157, 194, 136, 9, 1, 157, 4, 194, 121, 230, 67, 58, 9, 1, + 157, 4, 194, 121, 230, 67, 63, 9, 1, 139, 230, 66, 9, 1, 139, 230, 67, + 251, 26, 9, 1, 139, 230, 67, 194, 119, 9, 1, 124, 4, 230, 67, 58, 9, 1, + 139, 230, 67, 193, 64, 9, 1, 198, 75, 9, 1, 198, 73, 9, 1, 248, 106, 9, + 1, 200, 50, 4, 207, 81, 9, 1, 200, 50, 4, 112, 236, 112, 95, 235, 91, 9, + 1, 210, 161, 9, 1, 200, 47, 9, 1, 248, 94, 9, 1, 176, 4, 230, 67, 58, 9, + 1, 176, 4, 103, 236, 112, 84, 58, 9, 1, 212, 187, 9, 1, 235, 23, 9, 1, + 176, 4, 112, 236, 112, 58, 9, 1, 200, 83, 9, 1, 200, 81, 9, 1, 237, 156, + 9, 1, 237, 228, 4, 207, 81, 9, 1, 237, 228, 4, 78, 63, 9, 1, 237, 228, 4, + 78, 248, 84, 26, 2, 200, 151, 9, 1, 237, 234, 9, 1, 237, 158, 9, 1, 235, + 52, 9, 1, 237, 228, 4, 112, 236, 112, 95, 235, 91, 9, 1, 237, 228, 4, + 232, 119, 236, 112, 58, 9, 1, 206, 251, 9, 1, 207, 222, 4, 2, 196, 236, + 9, 1, 207, 222, 4, 207, 81, 9, 1, 207, 222, 4, 78, 63, 9, 1, 207, 222, 4, + 2, 196, 237, 63, 9, 1, 207, 222, 4, 78, 248, 84, 26, 78, 58, 9, 1, 207, + 222, 4, 103, 236, 112, 58, 9, 1, 223, 34, 9, 1, 207, 222, 4, 232, 119, + 236, 112, 58, 9, 1, 205, 202, 4, 78, 248, 84, 26, 78, 58, 9, 1, 205, 202, + 4, 112, 236, 112, 63, 9, 1, 205, 202, 4, 112, 236, 112, 248, 84, 26, 112, + 236, 112, 58, 9, 1, 206, 87, 4, 103, 236, 112, 63, 9, 1, 206, 87, 4, 112, + 236, 112, 58, 9, 1, 200, 152, 4, 112, 236, 112, 58, 9, 1, 251, 58, 4, + 112, 236, 112, 58, 9, 1, 236, 113, 233, 34, 9, 1, 233, 35, 4, 78, 216, 2, + 63, 9, 1, 233, 35, 4, 78, 63, 9, 1, 196, 116, 9, 1, 233, 35, 4, 112, 236, + 112, 63, 9, 1, 210, 159, 9, 1, 208, 233, 4, 78, 58, 9, 1, 208, 233, 4, + 112, 236, 112, 58, 9, 1, 222, 39, 9, 1, 201, 75, 222, 139, 9, 1, 222, + 140, 4, 207, 81, 9, 1, 222, 140, 4, 78, 58, 9, 1, 214, 167, 9, 1, 222, + 140, 4, 112, 236, 112, 63, 9, 1, 231, 220, 9, 1, 231, 221, 4, 207, 81, 9, + 1, 214, 88, 9, 1, 231, 221, 4, 103, 236, 112, 63, 9, 1, 230, 173, 9, 1, + 231, 221, 4, 112, 236, 112, 58, 9, 1, 220, 95, 4, 2, 196, 236, 9, 1, 220, + 95, 4, 78, 58, 9, 1, 220, 95, 4, 112, 236, 112, 58, 9, 1, 220, 95, 4, + 112, 236, 112, 63, 9, 1, 213, 124, 4, 78, 63, 9, 1, 213, 124, 231, 50, 9, + 1, 207, 58, 9, 1, 213, 124, 4, 207, 81, 9, 1, 213, 124, 4, 112, 236, 112, + 58, 9, 1, 229, 221, 236, 142, 9, 1, 200, 84, 4, 78, 58, 9, 1, 229, 221, + 4, 97, 58, 9, 1, 229, 221, 230, 251, 9, 1, 229, 221, 230, 252, 4, 230, + 67, 58, 9, 1, 200, 50, 217, 134, 230, 251, 9, 1, 194, 120, 4, 207, 81, 9, + 1, 221, 170, 212, 0, 9, 1, 212, 0, 9, 1, 68, 9, 1, 192, 214, 9, 1, 221, + 170, 192, 214, 9, 1, 194, 120, 4, 103, 236, 112, 58, 9, 1, 196, 123, 9, + 1, 233, 62, 193, 64, 9, 1, 97, 4, 200, 147, 9, 1, 97, 4, 2, 196, 236, 9, + 1, 194, 120, 4, 78, 58, 9, 1, 71, 9, 1, 97, 4, 112, 236, 112, 63, 9, 1, + 97, 248, 186, 9, 1, 97, 248, 187, 4, 230, 67, 58, 9, 232, 71, 201, 238, + 9, 1, 251, 108, 9, 2, 139, 34, 206, 87, 4, 220, 95, 4, 157, 217, 168, 9, + 2, 139, 34, 208, 233, 4, 220, 95, 4, 157, 217, 168, 9, 2, 139, 91, 88, + 20, 9, 2, 139, 220, 95, 251, 26, 9, 2, 139, 223, 37, 9, 2, 139, 112, 236, + 111, 9, 2, 139, 205, 201, 9, 234, 80, 80, 249, 235, 9, 202, 15, 80, 206, + 210, 234, 125, 229, 134, 9, 2, 139, 207, 7, 192, 76, 9, 2, 139, 197, 37, + 207, 241, 192, 76, 9, 2, 139, 236, 113, 229, 246, 80, 221, 245, 9, 2, + 139, 91, 72, 20, 9, 2, 132, 205, 201, 9, 2, 139, 217, 209, 9, 2, 194, + 119, 9, 2, 193, 64, 9, 2, 139, 193, 64, 9, 2, 139, 213, 123, 9, 209, 232, + 80, 206, 71, 9, 234, 90, 246, 138, 132, 201, 238, 9, 234, 90, 246, 138, + 139, 201, 238, 9, 207, 7, 139, 201, 239, 4, 232, 248, 246, 137, 9, 2, + 132, 217, 26, 9, 1, 237, 228, 4, 223, 121, 196, 236, 9, 1, 207, 222, 4, + 223, 121, 196, 236, 233, 193, 250, 126, 17, 192, 76, 233, 193, 250, 126, + 17, 101, 233, 193, 250, 126, 17, 104, 233, 193, 250, 126, 17, 133, 233, + 193, 250, 126, 17, 134, 233, 193, 250, 126, 17, 151, 233, 193, 250, 126, + 17, 170, 233, 193, 250, 126, 17, 179, 233, 193, 250, 126, 17, 174, 233, + 193, 250, 126, 17, 182, 9, 1, 204, 9, 4, 78, 63, 9, 1, 237, 251, 4, 78, + 63, 9, 1, 231, 80, 4, 78, 63, 9, 3, 203, 77, 250, 229, 9, 3, 203, 77, + 209, 151, 217, 5, 9, 1, 229, 221, 4, 223, 121, 196, 236, 200, 248, 234, + 80, 80, 210, 243, 200, 248, 201, 102, 232, 71, 201, 238, 200, 248, 201, + 157, 232, 71, 201, 238, 200, 248, 201, 102, 242, 47, 200, 248, 201, 157, + 242, 47, 200, 248, 229, 5, 242, 47, 200, 248, 242, 48, 203, 16, 220, 28, + 200, 248, 242, 48, 203, 16, 207, 101, 200, 248, 201, 102, 242, 48, 203, + 16, 220, 28, 200, 248, 201, 157, 242, 48, 203, 16, 207, 101, 200, 248, + 238, 245, 200, 248, 230, 24, 212, 20, 200, 248, 230, 24, 216, 237, 200, + 248, 230, 24, 250, 39, 200, 248, 251, 151, 77, 200, 248, 1, 251, 31, 200, + 248, 1, 201, 107, 251, 31, 200, 248, 1, 248, 62, 200, 248, 1, 231, 210, + 200, 248, 1, 231, 211, 231, 187, 200, 248, 1, 237, 224, 200, 248, 1, 236, + 113, 237, 225, 207, 74, 200, 248, 1, 229, 255, 200, 248, 1, 194, 119, + 200, 248, 1, 192, 103, 200, 248, 1, 229, 194, 200, 248, 1, 200, 4, 200, + 248, 1, 200, 5, 231, 187, 200, 248, 1, 192, 197, 200, 248, 1, 192, 198, + 229, 255, 200, 248, 1, 222, 109, 200, 248, 1, 220, 93, 200, 248, 1, 216, + 122, 200, 248, 1, 212, 230, 200, 248, 1, 204, 173, 200, 248, 1, 52, 204, + 173, 200, 248, 1, 71, 200, 248, 1, 210, 181, 200, 248, 1, 207, 168, 210, + 181, 200, 248, 1, 206, 83, 200, 248, 1, 208, 226, 200, 248, 1, 207, 74, + 200, 248, 1, 203, 224, 200, 248, 1, 200, 93, 200, 248, 1, 210, 118, 248, + 47, 200, 248, 1, 210, 118, 231, 77, 200, 248, 1, 210, 118, 237, 35, 200, + 248, 209, 52, 58, 200, 248, 209, 52, 63, 200, 248, 209, 52, 235, 110, + 200, 248, 192, 1, 58, 200, 248, 192, 1, 63, 200, 248, 192, 1, 235, 110, + 200, 248, 208, 10, 58, 200, 248, 208, 10, 63, 200, 248, 235, 111, 192, 9, + 229, 4, 200, 248, 235, 111, 192, 9, 250, 200, 200, 248, 230, 4, 58, 200, + 248, 230, 4, 63, 200, 248, 230, 3, 235, 110, 200, 248, 234, 3, 58, 200, + 248, 234, 3, 63, 200, 248, 206, 174, 200, 248, 233, 28, 236, 114, 200, + 248, 208, 136, 200, 248, 206, 204, 200, 248, 103, 84, 236, 112, 58, 200, + 248, 103, 84, 236, 112, 63, 200, 248, 112, 236, 112, 58, 200, 248, 112, + 236, 112, 63, 200, 248, 212, 18, 219, 176, 58, 200, 248, 212, 18, 219, + 176, 63, 200, 248, 215, 184, 200, 248, 248, 185, 200, 248, 1, 202, 194, + 192, 69, 200, 248, 1, 202, 194, 221, 238, 200, 248, 1, 202, 194, 233, 47, + 9, 1, 248, 97, 4, 112, 236, 112, 228, 210, 63, 9, 1, 248, 97, 4, 78, 248, + 84, 26, 112, 236, 112, 58, 9, 1, 248, 97, 4, 112, 236, 112, 209, 188, + 197, 30, 63, 9, 1, 248, 97, 4, 112, 236, 112, 209, 188, 197, 30, 248, 84, + 26, 103, 236, 112, 58, 9, 1, 248, 97, 4, 103, 236, 112, 248, 84, 26, 78, + 58, 9, 1, 248, 97, 4, 223, 121, 2, 196, 237, 63, 9, 1, 248, 97, 4, 2, + 196, 236, 9, 1, 176, 4, 103, 236, 112, 58, 9, 1, 176, 4, 112, 236, 112, + 209, 188, 197, 30, 63, 9, 1, 237, 228, 4, 103, 236, 112, 196, 55, 248, + 84, 26, 2, 200, 151, 9, 1, 237, 228, 4, 223, 121, 2, 196, 237, 63, 9, 1, + 207, 222, 4, 111, 9, 1, 205, 202, 4, 232, 119, 236, 112, 58, 9, 1, 251, + 58, 4, 103, 236, 112, 58, 9, 1, 251, 58, 4, 112, 236, 112, 209, 188, 235, + 92, 58, 9, 1, 251, 58, 4, 103, 236, 112, 196, 55, 58, 9, 1, 233, 35, 4, + 103, 236, 112, 63, 9, 1, 233, 35, 4, 112, 236, 112, 209, 188, 197, 30, + 63, 9, 1, 222, 40, 4, 78, 58, 9, 1, 222, 40, 4, 112, 236, 112, 58, 9, 1, + 222, 40, 4, 112, 236, 112, 209, 188, 197, 30, 63, 9, 1, 91, 4, 78, 58, 9, + 1, 91, 4, 78, 63, 9, 1, 213, 124, 4, 103, 236, 112, 63, 9, 1, 213, 124, + 4, 2, 200, 151, 9, 1, 213, 124, 4, 2, 196, 236, 9, 1, 220, 95, 4, 161, 9, + 1, 207, 222, 4, 103, 236, 112, 196, 55, 58, 9, 1, 207, 222, 4, 230, 67, + 58, 9, 1, 205, 202, 4, 103, 236, 112, 196, 55, 58, 9, 1, 176, 4, 2, 9, 1, + 200, 152, 63, 9, 1, 176, 4, 2, 9, 1, 200, 152, 26, 103, 236, 111, 9, 1, + 205, 202, 4, 2, 9, 1, 200, 152, 26, 103, 236, 111, 9, 1, 207, 222, 4, 2, + 9, 1, 200, 152, 26, 103, 236, 111, 9, 1, 176, 4, 2, 9, 1, 200, 152, 58, + 9, 1, 157, 4, 233, 193, 250, 126, 17, 103, 58, 9, 1, 157, 4, 233, 193, + 250, 126, 17, 112, 58, 9, 1, 233, 62, 97, 4, 233, 193, 250, 126, 17, 103, + 58, 9, 1, 233, 62, 97, 4, 233, 193, 250, 126, 17, 112, 58, 9, 1, 233, 62, + 97, 4, 233, 193, 250, 126, 17, 232, 119, 63, 9, 1, 194, 120, 4, 233, 193, + 250, 126, 17, 103, 58, 9, 1, 194, 120, 4, 233, 193, 250, 126, 17, 112, + 58, 9, 1, 97, 248, 187, 4, 233, 193, 250, 126, 17, 103, 58, 9, 1, 97, + 248, 187, 4, 233, 193, 250, 126, 17, 112, 58, 9, 1, 176, 4, 233, 193, + 250, 126, 17, 232, 119, 63, 9, 1, 205, 202, 4, 233, 193, 250, 126, 17, + 232, 119, 58, 9, 1, 205, 202, 4, 223, 121, 196, 236, 9, 1, 222, 140, 4, + 103, 236, 112, 58, 199, 237, 1, 230, 99, 199, 237, 1, 204, 18, 199, 237, + 1, 213, 122, 199, 237, 1, 208, 68, 199, 237, 1, 249, 1, 199, 237, 1, 219, + 219, 199, 237, 1, 222, 154, 199, 237, 1, 251, 13, 199, 237, 1, 196, 155, + 199, 237, 1, 217, 25, 199, 237, 1, 233, 95, 199, 237, 1, 237, 38, 199, + 237, 1, 199, 239, 199, 237, 1, 220, 181, 199, 237, 1, 231, 229, 199, 237, + 1, 231, 1, 199, 237, 1, 205, 200, 199, 237, 1, 237, 177, 199, 237, 1, + 192, 92, 199, 237, 1, 200, 95, 199, 237, 1, 193, 129, 199, 237, 1, 210, + 195, 199, 237, 1, 223, 46, 199, 237, 1, 242, 248, 199, 237, 1, 198, 82, + 199, 237, 1, 229, 186, 199, 237, 1, 221, 249, 199, 237, 1, 199, 238, 199, + 237, 1, 192, 110, 199, 237, 1, 204, 7, 199, 237, 1, 206, 90, 199, 237, 1, + 237, 254, 199, 237, 1, 155, 199, 237, 1, 192, 8, 199, 237, 1, 251, 54, + 199, 237, 1, 231, 78, 199, 237, 1, 208, 236, 199, 237, 1, 194, 162, 199, + 237, 251, 153, 199, 237, 251, 254, 199, 237, 228, 52, 199, 237, 234, 170, + 199, 237, 197, 112, 199, 237, 211, 193, 199, 237, 234, 180, 199, 237, + 233, 183, 199, 237, 212, 17, 199, 237, 212, 25, 199, 237, 201, 131, 199, + 237, 1, 215, 84, 213, 206, 17, 192, 76, 213, 206, 17, 101, 213, 206, 17, + 104, 213, 206, 17, 133, 213, 206, 17, 134, 213, 206, 17, 151, 213, 206, + 17, 170, 213, 206, 17, 179, 213, 206, 17, 174, 213, 206, 17, 182, 213, + 206, 1, 64, 213, 206, 1, 234, 171, 213, 206, 1, 70, 213, 206, 1, 71, 213, + 206, 1, 68, 213, 206, 1, 211, 194, 213, 206, 1, 74, 213, 206, 1, 237, + 242, 213, 206, 1, 215, 151, 213, 206, 1, 249, 3, 213, 206, 1, 166, 213, + 206, 1, 189, 213, 206, 1, 223, 62, 213, 206, 1, 246, 117, 213, 206, 1, + 238, 0, 213, 206, 1, 167, 213, 206, 1, 207, 3, 213, 206, 1, 188, 213, + 206, 1, 231, 175, 213, 206, 1, 233, 97, 213, 206, 1, 160, 213, 206, 1, + 177, 213, 206, 1, 215, 97, 194, 25, 213, 206, 1, 172, 213, 206, 1, 212, + 201, 213, 206, 1, 181, 213, 206, 1, 144, 213, 206, 1, 194, 169, 213, 206, + 1, 168, 213, 206, 1, 212, 202, 194, 25, 213, 206, 1, 222, 225, 223, 62, + 213, 206, 1, 222, 225, 246, 117, 213, 206, 1, 222, 225, 167, 213, 206, + 38, 203, 195, 139, 199, 18, 213, 206, 38, 203, 195, 132, 199, 18, 213, + 206, 38, 203, 195, 207, 73, 199, 18, 213, 206, 38, 184, 237, 58, 199, 18, + 213, 206, 38, 184, 139, 199, 18, 213, 206, 38, 184, 132, 199, 18, 213, + 206, 38, 184, 207, 73, 199, 18, 213, 206, 38, 215, 48, 77, 213, 206, 38, + 55, 78, 58, 213, 206, 139, 158, 250, 147, 213, 206, 132, 158, 250, 147, + 213, 206, 16, 211, 195, 237, 72, 213, 206, 16, 231, 174, 213, 206, 242, + 38, 213, 206, 233, 204, 77, 213, 206, 220, 153, 213, 206, 237, 203, 213, + 206, 236, 116, 57, 213, 206, 200, 127, 57, 206, 49, 1, 251, 33, 206, 49, + 1, 248, 1, 206, 49, 1, 231, 209, 206, 49, 1, 237, 226, 206, 49, 1, 223, + 73, 206, 49, 1, 249, 1, 206, 49, 1, 192, 79, 206, 49, 1, 223, 82, 206, + 49, 1, 199, 63, 206, 49, 1, 192, 178, 206, 49, 1, 222, 155, 206, 49, 1, + 220, 177, 206, 49, 1, 216, 122, 206, 49, 1, 212, 230, 206, 49, 1, 203, + 75, 206, 49, 1, 223, 190, 206, 49, 1, 233, 11, 206, 49, 1, 198, 116, 206, + 49, 1, 208, 156, 206, 49, 1, 207, 74, 206, 49, 1, 204, 37, 206, 49, 1, + 200, 173, 206, 49, 122, 223, 190, 206, 49, 122, 223, 189, 206, 49, 122, + 212, 12, 206, 49, 122, 237, 240, 206, 49, 73, 1, 234, 37, 192, 178, 206, + 49, 122, 234, 37, 192, 178, 206, 49, 18, 3, 184, 71, 206, 49, 18, 3, 71, + 206, 49, 18, 3, 211, 108, 252, 33, 206, 49, 18, 3, 184, 252, 33, 206, 49, + 18, 3, 252, 33, 206, 49, 18, 3, 211, 108, 64, 206, 49, 18, 3, 184, 64, + 206, 49, 18, 3, 64, 206, 49, 73, 1, 203, 195, 64, 206, 49, 18, 3, 203, + 195, 64, 206, 49, 18, 3, 184, 68, 206, 49, 18, 3, 68, 206, 49, 73, 1, 70, + 206, 49, 18, 3, 184, 70, 206, 49, 18, 3, 70, 206, 49, 18, 3, 74, 206, 49, + 18, 3, 201, 131, 206, 49, 122, 214, 188, 206, 49, 209, 38, 214, 188, 206, + 49, 209, 38, 251, 82, 206, 49, 209, 38, 250, 213, 206, 49, 209, 38, 248, + 163, 206, 49, 209, 38, 250, 18, 206, 49, 209, 38, 203, 212, 206, 49, 251, + 151, 77, 206, 49, 209, 38, 217, 15, 208, 192, 206, 49, 209, 38, 192, 16, + 206, 49, 209, 38, 208, 192, 206, 49, 209, 38, 192, 109, 206, 49, 209, 38, + 198, 5, 206, 49, 209, 38, 250, 97, 206, 49, 209, 38, 202, 199, 217, 108, + 206, 49, 209, 38, 250, 194, 217, 156, 1, 230, 73, 217, 156, 1, 251, 238, + 217, 156, 1, 251, 80, 217, 156, 1, 251, 125, 217, 156, 1, 251, 72, 217, + 156, 1, 197, 1, 217, 156, 1, 249, 228, 217, 156, 1, 223, 82, 217, 156, 1, + 250, 15, 217, 156, 1, 251, 39, 217, 156, 1, 251, 44, 217, 156, 1, 251, + 35, 217, 156, 1, 250, 241, 217, 156, 1, 250, 224, 217, 156, 1, 250, 61, + 217, 156, 1, 223, 190, 217, 156, 1, 250, 163, 217, 156, 1, 250, 28, 217, + 156, 1, 250, 135, 217, 156, 1, 250, 131, 217, 156, 1, 250, 53, 217, 156, + 1, 250, 26, 217, 156, 1, 235, 36, 217, 156, 1, 222, 147, 217, 156, 1, + 251, 57, 217, 156, 251, 86, 77, 217, 156, 195, 250, 77, 217, 156, 231, + 146, 77, 217, 156, 209, 37, 200, 248, 1, 135, 214, 165, 200, 248, 1, 135, + 223, 62, 200, 248, 1, 135, 212, 201, 200, 248, 1, 135, 198, 83, 200, 248, + 1, 135, 213, 178, 200, 248, 1, 135, 213, 160, 200, 248, 1, 135, 248, 54, + 200, 248, 1, 135, 167, 200, 248, 1, 135, 219, 137, 200, 248, 1, 135, 219, + 126, 200, 248, 1, 135, 202, 92, 9, 1, 248, 97, 4, 2, 196, 237, 63, 9, 1, + 248, 97, 4, 230, 67, 58, 9, 1, 223, 38, 4, 103, 236, 112, 58, 9, 1, 200, + 152, 4, 103, 236, 112, 58, 9, 1, 233, 35, 4, 78, 248, 84, 26, 112, 236, + 112, 58, 9, 1, 208, 233, 4, 78, 63, 9, 1, 220, 95, 4, 55, 161, 9, 1, 91, + 4, 112, 236, 112, 58, 9, 1, 97, 4, 103, 236, 112, 248, 84, 26, 230, 67, + 58, 9, 1, 97, 4, 103, 236, 112, 248, 84, 26, 78, 58, 9, 1, 207, 222, 4, + 219, 69, 9, 1, 194, 120, 4, 78, 194, 40, 9, 1, 207, 36, 193, 64, 9, 1, + 132, 251, 26, 9, 1, 237, 228, 4, 112, 236, 112, 63, 9, 1, 206, 87, 4, + 112, 236, 112, 63, 9, 1, 231, 221, 4, 223, 121, 111, 9, 1, 201, 230, 194, + 119, 9, 1, 192, 104, 4, 223, 121, 196, 237, 58, 9, 1, 251, 58, 4, 112, + 236, 112, 63, 9, 1, 222, 140, 4, 78, 63, 9, 1, 248, 97, 4, 2, 91, 58, 9, + 1, 210, 162, 4, 2, 91, 58, 9, 1, 200, 50, 4, 2, 200, 50, 58, 9, 1, 207, + 222, 4, 2, 213, 124, 58, 9, 1, 97, 4, 103, 236, 112, 248, 84, 26, 2, 213, + 124, 58, 9, 1, 251, 83, 233, 34, 9, 1, 251, 83, 208, 232, 9, 1, 251, 83, + 213, 123, 9, 1, 210, 162, 4, 2, 196, 236, 9, 1, 200, 50, 4, 2, 196, 236, + 9, 1, 198, 76, 4, 2, 196, 236, 9, 1, 200, 84, 4, 2, 196, 236, 9, 1, 222, + 40, 4, 2, 196, 236, 9, 1, 231, 80, 4, 112, 236, 112, 58, 9, 1, 251, 83, + 208, 233, 4, 112, 236, 112, 58, 9, 1, 223, 38, 4, 112, 236, 112, 58, 9, + 1, 223, 38, 4, 112, 236, 112, 63, 9, 1, 220, 95, 4, 2, 9, 1, 200, 152, + 58, 9, 2, 132, 194, 119, 9, 2, 139, 194, 11, 250, 128, 9, 2, 139, 206, + 86, 9, 2, 139, 251, 57, 9, 2, 139, 208, 232, 9, 2, 139, 213, 124, 4, 222, + 86, 9, 2, 132, 213, 124, 4, 222, 86, 9, 2, 139, 194, 11, 250, 25, 9, 2, + 139, 194, 11, 250, 60, 9, 2, 139, 194, 11, 250, 223, 9, 2, 139, 194, 11, + 206, 65, 9, 2, 139, 194, 11, 208, 196, 9, 2, 139, 194, 11, 194, 142, 9, + 2, 139, 232, 147, 217, 122, 9, 2, 139, 3, 206, 81, 9, 236, 190, 234, 80, + 80, 249, 235, 9, 163, 237, 216, 63, 9, 238, 138, 233, 58, 9, 238, 138, + 237, 215, 9, 238, 138, 222, 86, 9, 238, 138, 233, 56, 9, 238, 138, 237, + 213, 9, 238, 138, 222, 84, 9, 158, 90, 78, 58, 9, 158, 103, 236, 112, 58, + 9, 158, 219, 70, 58, 9, 158, 90, 78, 63, 9, 158, 103, 236, 112, 63, 9, + 158, 219, 70, 63, 9, 211, 184, 233, 56, 9, 211, 184, 237, 213, 9, 211, + 184, 222, 84, 9, 2, 139, 194, 119, 9, 233, 59, 4, 207, 81, 9, 233, 59, 4, + 78, 58, 9, 222, 87, 4, 78, 63, 9, 46, 250, 78, 58, 9, 51, 250, 78, 58, 9, + 46, 250, 78, 63, 9, 51, 250, 78, 63, 9, 55, 51, 250, 78, 58, 9, 55, 51, + 250, 78, 95, 4, 236, 114, 9, 51, 250, 78, 95, 4, 236, 114, 9, 237, 216, + 4, 236, 114, 9, 122, 203, 109, 213, 124, 231, 50, 107, 3, 223, 121, 246, + 234, 107, 3, 246, 234, 107, 3, 250, 168, 107, 3, 196, 6, 107, 1, 203, + 195, 64, 107, 1, 64, 107, 1, 252, 33, 107, 1, 70, 107, 1, 223, 224, 107, + 1, 68, 107, 1, 196, 251, 107, 1, 118, 150, 107, 1, 118, 165, 107, 1, 246, + 237, 71, 107, 1, 203, 195, 71, 107, 1, 71, 107, 1, 251, 63, 107, 1, 246, + 237, 74, 107, 1, 203, 195, 74, 107, 1, 74, 107, 1, 250, 8, 107, 1, 160, + 107, 1, 221, 250, 107, 1, 231, 233, 107, 1, 231, 84, 107, 1, 214, 165, + 107, 1, 247, 19, 107, 1, 246, 117, 107, 1, 223, 62, 107, 1, 223, 28, 107, + 1, 212, 201, 107, 1, 198, 83, 107, 1, 198, 71, 107, 1, 237, 161, 107, 1, + 237, 145, 107, 1, 213, 178, 107, 1, 189, 107, 1, 199, 240, 107, 1, 238, + 0, 107, 1, 237, 40, 107, 1, 181, 107, 1, 213, 160, 107, 1, 166, 107, 1, + 210, 94, 107, 1, 249, 3, 107, 1, 248, 54, 107, 1, 172, 107, 1, 168, 107, + 1, 167, 107, 1, 207, 3, 107, 1, 177, 107, 1, 219, 137, 107, 1, 219, 126, + 107, 1, 196, 157, 107, 1, 204, 64, 107, 1, 202, 92, 107, 1, 188, 107, 1, + 144, 107, 18, 3, 212, 0, 107, 18, 3, 211, 192, 107, 3, 212, 241, 107, 3, + 249, 246, 107, 18, 3, 252, 33, 107, 18, 3, 70, 107, 18, 3, 223, 224, 107, + 18, 3, 68, 107, 18, 3, 196, 251, 107, 18, 3, 118, 150, 107, 18, 3, 118, + 207, 4, 107, 18, 3, 246, 237, 71, 107, 18, 3, 203, 195, 71, 107, 18, 3, + 71, 107, 18, 3, 251, 63, 107, 18, 3, 246, 237, 74, 107, 18, 3, 203, 195, + 74, 107, 18, 3, 74, 107, 18, 3, 250, 8, 107, 3, 196, 11, 107, 18, 3, 209, + 91, 71, 107, 18, 3, 249, 241, 107, 211, 219, 107, 201, 218, 3, 197, 106, + 107, 201, 218, 3, 250, 170, 107, 230, 211, 251, 143, 107, 251, 130, 251, + 143, 107, 18, 3, 246, 237, 184, 71, 107, 18, 3, 197, 104, 107, 18, 3, + 196, 250, 107, 1, 208, 239, 107, 1, 221, 230, 107, 1, 231, 59, 107, 1, + 192, 112, 107, 1, 237, 150, 107, 1, 207, 156, 107, 1, 233, 97, 107, 1, + 192, 164, 107, 1, 118, 207, 4, 107, 1, 118, 219, 138, 107, 18, 3, 118, + 165, 107, 18, 3, 118, 219, 138, 107, 237, 208, 107, 55, 237, 208, 107, + 17, 192, 76, 107, 17, 101, 107, 17, 104, 107, 17, 133, 107, 17, 134, 107, + 17, 151, 107, 17, 170, 107, 17, 179, 107, 17, 174, 107, 17, 182, 107, + 251, 151, 57, 107, 3, 139, 202, 159, 236, 114, 107, 1, 246, 237, 64, 107, + 1, 212, 0, 107, 1, 211, 192, 107, 1, 249, 241, 107, 1, 197, 104, 107, 1, + 196, 250, 107, 1, 217, 114, 237, 161, 107, 1, 192, 71, 107, 1, 87, 168, + 107, 1, 231, 120, 107, 1, 223, 6, 107, 1, 231, 6, 201, 238, 107, 1, 237, + 151, 107, 1, 248, 159, 248, 76, 250, 197, 248, 76, 3, 246, 234, 248, 76, + 3, 250, 168, 248, 76, 3, 196, 6, 248, 76, 1, 64, 248, 76, 1, 252, 33, + 248, 76, 1, 70, 248, 76, 1, 223, 224, 248, 76, 1, 68, 248, 76, 1, 196, + 251, 248, 76, 1, 118, 150, 248, 76, 1, 118, 165, 248, 76, 1, 71, 248, 76, + 1, 251, 63, 248, 76, 1, 74, 248, 76, 1, 250, 8, 248, 76, 1, 160, 248, 76, + 1, 221, 250, 248, 76, 1, 231, 233, 248, 76, 1, 231, 84, 248, 76, 1, 214, + 165, 248, 76, 1, 247, 19, 248, 76, 1, 246, 117, 248, 76, 1, 223, 62, 248, + 76, 1, 223, 28, 248, 76, 1, 212, 201, 248, 76, 1, 198, 83, 248, 76, 1, + 198, 71, 248, 76, 1, 237, 161, 248, 76, 1, 237, 145, 248, 76, 1, 213, + 178, 248, 76, 1, 189, 248, 76, 1, 199, 240, 248, 76, 1, 238, 0, 248, 76, + 1, 237, 40, 248, 76, 1, 181, 248, 76, 1, 166, 248, 76, 1, 210, 94, 248, + 76, 1, 249, 3, 248, 76, 1, 248, 54, 248, 76, 1, 172, 248, 76, 1, 168, + 248, 76, 1, 167, 248, 76, 1, 177, 248, 76, 1, 204, 64, 248, 76, 1, 202, + 92, 248, 76, 1, 188, 248, 76, 1, 144, 248, 76, 3, 212, 241, 248, 76, 3, + 249, 246, 248, 76, 18, 3, 252, 33, 248, 76, 18, 3, 70, 248, 76, 18, 3, + 223, 224, 248, 76, 18, 3, 68, 248, 76, 18, 3, 196, 251, 248, 76, 18, 3, + 118, 150, 248, 76, 18, 3, 118, 207, 4, 248, 76, 18, 3, 71, 248, 76, 18, + 3, 251, 63, 248, 76, 18, 3, 74, 248, 76, 18, 3, 250, 8, 248, 76, 3, 196, + 11, 248, 76, 1, 221, 240, 189, 248, 76, 250, 9, 220, 2, 77, 248, 76, 1, + 207, 3, 248, 76, 1, 207, 156, 248, 76, 1, 192, 164, 248, 76, 1, 118, 207, + 4, 248, 76, 1, 118, 219, 138, 248, 76, 18, 3, 118, 165, 248, 76, 18, 3, + 118, 219, 138, 248, 76, 17, 192, 76, 248, 76, 17, 101, 248, 76, 17, 104, + 248, 76, 17, 133, 248, 76, 17, 134, 248, 76, 17, 151, 248, 76, 17, 170, + 248, 76, 17, 179, 248, 76, 17, 174, 248, 76, 17, 182, 248, 76, 1, 208, + 76, 4, 85, 237, 10, 248, 76, 1, 208, 76, 4, 106, 237, 10, 248, 76, 206, + 186, 77, 248, 76, 206, 186, 57, 248, 76, 238, 137, 212, 233, 101, 248, + 76, 238, 137, 212, 233, 104, 248, 76, 238, 137, 212, 233, 133, 248, 76, + 238, 137, 212, 233, 134, 248, 76, 238, 137, 212, 233, 90, 219, 241, 199, + 230, 199, 225, 237, 70, 248, 76, 238, 137, 237, 71, 203, 35, 248, 76, + 223, 83, 248, 76, 231, 200, 77, 248, 76, 1, 196, 120, 250, 168, 248, 76, + 251, 151, 57, 248, 76, 206, 36, 77, 230, 152, 3, 251, 124, 248, 20, 230, + 152, 3, 248, 20, 230, 152, 3, 196, 6, 230, 152, 1, 64, 230, 152, 1, 252, + 33, 230, 152, 1, 70, 230, 152, 1, 223, 224, 230, 152, 1, 68, 230, 152, 1, + 196, 251, 230, 152, 1, 234, 171, 230, 152, 1, 251, 63, 230, 152, 1, 211, + 194, 230, 152, 1, 250, 8, 230, 152, 1, 160, 230, 152, 1, 221, 250, 230, + 152, 1, 231, 233, 230, 152, 1, 231, 84, 230, 152, 1, 214, 165, 230, 152, + 1, 247, 19, 230, 152, 1, 246, 117, 230, 152, 1, 223, 62, 230, 152, 1, + 223, 28, 230, 152, 1, 212, 201, 230, 152, 1, 198, 83, 230, 152, 1, 198, + 71, 230, 152, 1, 237, 161, 230, 152, 1, 237, 145, 230, 152, 1, 213, 178, + 230, 152, 1, 189, 230, 152, 1, 199, 240, 230, 152, 1, 238, 0, 230, 152, + 1, 237, 40, 230, 152, 1, 181, 230, 152, 1, 166, 230, 152, 1, 210, 94, + 230, 152, 1, 249, 3, 230, 152, 1, 248, 54, 230, 152, 1, 172, 230, 152, 1, + 168, 230, 152, 1, 167, 230, 152, 1, 177, 230, 152, 1, 219, 137, 230, 152, + 1, 196, 157, 230, 152, 1, 204, 64, 230, 152, 1, 188, 230, 152, 1, 144, + 230, 152, 3, 212, 241, 230, 152, 18, 3, 252, 33, 230, 152, 18, 3, 70, + 230, 152, 18, 3, 223, 224, 230, 152, 18, 3, 68, 230, 152, 18, 3, 196, + 251, 230, 152, 18, 3, 234, 171, 230, 152, 18, 3, 251, 63, 230, 152, 18, + 3, 211, 194, 230, 152, 18, 3, 250, 8, 230, 152, 3, 196, 11, 230, 152, 3, + 197, 108, 230, 152, 1, 221, 230, 230, 152, 1, 231, 59, 230, 152, 1, 192, + 112, 230, 152, 1, 207, 3, 230, 152, 1, 233, 97, 230, 152, 17, 192, 76, + 230, 152, 17, 101, 230, 152, 17, 104, 230, 152, 17, 133, 230, 152, 17, + 134, 230, 152, 17, 151, 230, 152, 17, 170, 230, 152, 17, 179, 230, 152, + 17, 174, 230, 152, 17, 182, 230, 152, 199, 71, 230, 152, 251, 123, 230, + 152, 223, 103, 230, 152, 197, 23, 230, 152, 234, 132, 211, 199, 230, 152, + 3, 193, 104, 230, 152, 251, 151, 57, 230, 168, 3, 246, 234, 230, 168, 3, + 250, 168, 230, 168, 3, 196, 6, 230, 168, 1, 64, 230, 168, 1, 252, 33, + 230, 168, 1, 70, 230, 168, 1, 223, 224, 230, 168, 1, 68, 230, 168, 1, + 196, 251, 230, 168, 1, 118, 150, 230, 168, 1, 118, 165, 230, 168, 18, + 246, 237, 71, 230, 168, 1, 71, 230, 168, 1, 251, 63, 230, 168, 18, 246, + 237, 74, 230, 168, 1, 74, 230, 168, 1, 250, 8, 230, 168, 1, 160, 230, + 168, 1, 221, 250, 230, 168, 1, 231, 233, 230, 168, 1, 231, 84, 230, 168, + 1, 214, 165, 230, 168, 1, 247, 19, 230, 168, 1, 246, 117, 230, 168, 1, + 223, 62, 230, 168, 1, 223, 28, 230, 168, 1, 212, 201, 230, 168, 1, 198, + 83, 230, 168, 1, 198, 71, 230, 168, 1, 237, 161, 230, 168, 1, 237, 145, + 230, 168, 1, 213, 178, 230, 168, 1, 189, 230, 168, 1, 199, 240, 230, 168, + 1, 238, 0, 230, 168, 1, 237, 40, 230, 168, 1, 181, 230, 168, 1, 166, 230, + 168, 1, 210, 94, 230, 168, 1, 249, 3, 230, 168, 1, 248, 54, 230, 168, 1, + 172, 230, 168, 1, 168, 230, 168, 1, 167, 230, 168, 1, 177, 230, 168, 1, + 219, 137, 230, 168, 1, 196, 157, 230, 168, 1, 204, 64, 230, 168, 1, 202, + 92, 230, 168, 1, 188, 230, 168, 1, 144, 230, 168, 3, 212, 241, 230, 168, + 3, 249, 246, 230, 168, 18, 3, 252, 33, 230, 168, 18, 3, 70, 230, 168, 18, + 3, 223, 224, 230, 168, 18, 3, 68, 230, 168, 18, 3, 196, 251, 230, 168, + 18, 3, 118, 150, 230, 168, 18, 3, 118, 207, 4, 230, 168, 18, 3, 246, 237, + 71, 230, 168, 18, 3, 71, 230, 168, 18, 3, 251, 63, 230, 168, 18, 3, 246, + 237, 74, 230, 168, 18, 3, 74, 230, 168, 18, 3, 250, 8, 230, 168, 3, 196, + 11, 230, 168, 211, 219, 230, 168, 1, 118, 207, 4, 230, 168, 1, 118, 219, + 138, 230, 168, 18, 3, 118, 165, 230, 168, 18, 3, 118, 219, 138, 230, 168, + 17, 192, 76, 230, 168, 17, 101, 230, 168, 17, 104, 230, 168, 17, 133, + 230, 168, 17, 134, 230, 168, 17, 151, 230, 168, 17, 170, 230, 168, 17, + 179, 230, 168, 17, 174, 230, 168, 17, 182, 230, 168, 251, 151, 57, 230, + 168, 206, 186, 57, 230, 168, 1, 192, 71, 230, 168, 3, 201, 131, 230, 168, + 3, 204, 54, 230, 168, 3, 217, 207, 230, 168, 3, 199, 159, 212, 242, 58, + 230, 168, 3, 242, 131, 212, 242, 58, 230, 168, 3, 197, 222, 212, 242, 58, + 211, 153, 3, 246, 234, 211, 153, 3, 250, 168, 211, 153, 3, 196, 6, 211, + 153, 1, 64, 211, 153, 1, 252, 33, 211, 153, 1, 70, 211, 153, 1, 223, 224, + 211, 153, 1, 68, 211, 153, 1, 196, 251, 211, 153, 1, 118, 150, 211, 153, + 1, 118, 165, 211, 153, 1, 71, 211, 153, 1, 251, 63, 211, 153, 1, 74, 211, + 153, 1, 250, 8, 211, 153, 1, 160, 211, 153, 1, 221, 250, 211, 153, 1, + 231, 233, 211, 153, 1, 231, 84, 211, 153, 1, 214, 165, 211, 153, 1, 247, + 19, 211, 153, 1, 246, 117, 211, 153, 1, 223, 62, 211, 153, 1, 223, 28, + 211, 153, 1, 212, 201, 211, 153, 1, 198, 83, 211, 153, 1, 198, 71, 211, + 153, 1, 237, 161, 211, 153, 1, 237, 145, 211, 153, 1, 213, 178, 211, 153, + 1, 189, 211, 153, 1, 199, 240, 211, 153, 1, 238, 0, 211, 153, 1, 237, 40, + 211, 153, 1, 181, 211, 153, 1, 166, 211, 153, 1, 210, 94, 211, 153, 1, + 249, 3, 211, 153, 1, 248, 54, 211, 153, 1, 172, 211, 153, 1, 168, 211, + 153, 1, 167, 211, 153, 1, 177, 211, 153, 1, 219, 137, 211, 153, 1, 196, + 157, 211, 153, 1, 204, 64, 211, 153, 1, 202, 92, 211, 153, 1, 188, 211, + 153, 1, 144, 211, 153, 3, 212, 241, 211, 153, 3, 249, 246, 211, 153, 18, + 3, 252, 33, 211, 153, 18, 3, 70, 211, 153, 18, 3, 223, 224, 211, 153, 18, + 3, 68, 211, 153, 18, 3, 196, 251, 211, 153, 18, 3, 118, 150, 211, 153, + 18, 3, 118, 207, 4, 211, 153, 18, 3, 71, 211, 153, 18, 3, 251, 63, 211, + 153, 18, 3, 74, 211, 153, 18, 3, 250, 8, 211, 153, 3, 196, 11, 211, 153, + 3, 211, 109, 211, 153, 251, 64, 220, 2, 77, 211, 153, 250, 9, 220, 2, 77, + 211, 153, 1, 207, 3, 211, 153, 1, 207, 156, 211, 153, 1, 192, 164, 211, + 153, 1, 118, 207, 4, 211, 153, 1, 118, 219, 138, 211, 153, 18, 3, 118, + 165, 211, 153, 18, 3, 118, 219, 138, 211, 153, 17, 192, 76, 211, 153, 17, + 101, 211, 153, 17, 104, 211, 153, 17, 133, 211, 153, 17, 134, 211, 153, + 17, 151, 211, 153, 17, 170, 211, 153, 17, 179, 211, 153, 17, 174, 211, + 153, 17, 182, 211, 153, 223, 83, 211, 153, 1, 194, 169, 211, 153, 232, + 109, 90, 208, 167, 211, 153, 232, 109, 90, 230, 78, 211, 153, 232, 109, + 112, 208, 165, 211, 153, 232, 109, 90, 203, 33, 211, 153, 232, 109, 90, + 234, 143, 211, 153, 232, 109, 112, 203, 30, 44, 3, 250, 168, 44, 3, 196, + 6, 44, 1, 64, 44, 1, 252, 33, 44, 1, 70, 44, 1, 223, 224, 44, 1, 68, 44, + 1, 196, 251, 44, 1, 71, 44, 1, 234, 171, 44, 1, 251, 63, 44, 1, 74, 44, + 1, 211, 194, 44, 1, 250, 8, 44, 1, 160, 44, 1, 214, 165, 44, 1, 247, 19, + 44, 1, 223, 62, 44, 1, 212, 201, 44, 1, 198, 83, 44, 1, 213, 178, 44, 1, + 189, 44, 1, 181, 44, 1, 213, 160, 44, 1, 166, 44, 1, 172, 44, 1, 168, 44, + 1, 167, 44, 1, 207, 3, 44, 1, 177, 44, 1, 219, 137, 44, 1, 219, 126, 44, + 1, 196, 157, 44, 1, 204, 64, 44, 1, 202, 92, 44, 1, 188, 44, 1, 144, 44, + 18, 3, 252, 33, 44, 18, 3, 70, 44, 18, 3, 223, 224, 44, 18, 3, 68, 44, + 18, 3, 196, 251, 44, 18, 3, 71, 44, 18, 3, 234, 171, 44, 18, 3, 251, 63, + 44, 18, 3, 74, 44, 18, 3, 211, 194, 44, 18, 3, 250, 8, 44, 3, 196, 11, + 44, 211, 219, 44, 250, 9, 220, 2, 77, 44, 17, 192, 76, 44, 17, 101, 44, + 17, 104, 44, 17, 133, 44, 17, 134, 44, 17, 151, 44, 17, 170, 44, 17, 179, + 44, 17, 174, 44, 17, 182, 44, 31, 200, 30, 44, 31, 90, 228, 162, 44, 31, + 90, 180, 44, 237, 174, 57, 44, 216, 38, 57, 44, 193, 67, 57, 44, 237, + 112, 57, 44, 238, 196, 57, 44, 250, 62, 95, 57, 44, 206, 186, 57, 44, 31, + 57, 200, 34, 3, 38, 246, 235, 58, 200, 34, 3, 246, 234, 200, 34, 3, 250, + 168, 200, 34, 3, 196, 6, 200, 34, 3, 38, 250, 169, 58, 200, 34, 1, 64, + 200, 34, 1, 252, 33, 200, 34, 1, 70, 200, 34, 1, 223, 224, 200, 34, 1, + 68, 200, 34, 1, 196, 251, 200, 34, 1, 118, 150, 200, 34, 1, 118, 165, + 200, 34, 1, 71, 200, 34, 1, 234, 171, 200, 34, 1, 251, 63, 200, 34, 1, + 74, 200, 34, 1, 211, 194, 200, 34, 1, 250, 8, 200, 34, 1, 160, 200, 34, + 1, 221, 250, 200, 34, 1, 231, 233, 200, 34, 1, 231, 84, 200, 34, 1, 214, + 165, 200, 34, 1, 247, 19, 200, 34, 1, 246, 117, 200, 34, 1, 223, 62, 200, + 34, 1, 223, 28, 200, 34, 1, 212, 201, 200, 34, 1, 198, 83, 200, 34, 1, + 198, 71, 200, 34, 1, 237, 161, 200, 34, 1, 237, 145, 200, 34, 1, 213, + 178, 200, 34, 1, 189, 200, 34, 1, 199, 240, 200, 34, 1, 238, 0, 200, 34, + 1, 237, 40, 200, 34, 1, 181, 200, 34, 1, 166, 200, 34, 1, 210, 94, 200, + 34, 1, 249, 3, 200, 34, 1, 248, 54, 200, 34, 1, 172, 200, 34, 1, 168, + 200, 34, 1, 167, 200, 34, 1, 207, 3, 200, 34, 1, 177, 200, 34, 1, 219, + 137, 200, 34, 1, 219, 126, 200, 34, 1, 196, 157, 200, 34, 1, 204, 64, + 200, 34, 1, 202, 92, 200, 34, 1, 188, 200, 34, 1, 144, 200, 34, 3, 249, + 246, 200, 34, 18, 3, 252, 33, 200, 34, 18, 3, 70, 200, 34, 18, 3, 223, + 224, 200, 34, 18, 3, 68, 200, 34, 18, 3, 196, 251, 200, 34, 18, 3, 118, + 150, 200, 34, 18, 3, 118, 207, 4, 200, 34, 18, 3, 71, 200, 34, 18, 3, + 234, 171, 200, 34, 18, 3, 251, 63, 200, 34, 18, 3, 74, 200, 34, 18, 3, + 211, 194, 200, 34, 18, 3, 250, 8, 200, 34, 3, 196, 11, 200, 34, 220, 2, + 77, 200, 34, 251, 64, 220, 2, 77, 200, 34, 1, 198, 118, 200, 34, 1, 235, + 17, 200, 34, 1, 206, 240, 200, 34, 1, 118, 207, 4, 200, 34, 1, 118, 219, + 138, 200, 34, 18, 3, 118, 165, 200, 34, 18, 3, 118, 219, 138, 200, 34, + 17, 192, 76, 200, 34, 17, 101, 200, 34, 17, 104, 200, 34, 17, 133, 200, + 34, 17, 134, 200, 34, 17, 151, 200, 34, 17, 170, 200, 34, 17, 179, 200, + 34, 17, 174, 200, 34, 17, 182, 200, 34, 3, 203, 113, 200, 34, 232, 109, + 17, 192, 77, 39, 212, 4, 209, 137, 80, 134, 200, 34, 232, 109, 17, 90, + 39, 212, 4, 209, 137, 80, 134, 200, 34, 232, 109, 17, 103, 39, 212, 4, + 209, 137, 80, 134, 200, 34, 232, 109, 17, 112, 39, 212, 4, 209, 137, 80, + 134, 200, 34, 232, 109, 17, 90, 39, 233, 217, 209, 137, 80, 134, 200, 34, + 232, 109, 17, 103, 39, 233, 217, 209, 137, 80, 134, 200, 34, 232, 109, + 17, 112, 39, 233, 217, 209, 137, 80, 134, 200, 34, 3, 197, 255, 222, 115, + 3, 202, 159, 246, 234, 222, 115, 3, 246, 234, 222, 115, 3, 250, 168, 222, + 115, 3, 196, 6, 222, 115, 3, 203, 113, 222, 115, 1, 64, 222, 115, 1, 252, + 33, 222, 115, 1, 70, 222, 115, 1, 223, 224, 222, 115, 1, 68, 222, 115, 1, + 196, 251, 222, 115, 1, 118, 150, 222, 115, 1, 118, 165, 222, 115, 1, 71, + 222, 115, 1, 234, 171, 222, 115, 1, 251, 63, 222, 115, 1, 74, 222, 115, + 1, 211, 194, 222, 115, 1, 250, 8, 222, 115, 1, 160, 222, 115, 1, 221, + 250, 222, 115, 1, 231, 233, 222, 115, 1, 231, 84, 222, 115, 1, 214, 165, + 222, 115, 1, 247, 19, 222, 115, 1, 246, 117, 222, 115, 1, 223, 62, 222, + 115, 1, 223, 28, 222, 115, 1, 212, 201, 222, 115, 1, 198, 83, 222, 115, + 1, 198, 71, 222, 115, 1, 237, 161, 222, 115, 1, 237, 145, 222, 115, 1, + 213, 178, 222, 115, 1, 189, 222, 115, 1, 199, 240, 222, 115, 1, 238, 0, + 222, 115, 1, 237, 40, 222, 115, 1, 181, 222, 115, 1, 166, 222, 115, 1, + 210, 94, 222, 115, 1, 249, 3, 222, 115, 1, 248, 54, 222, 115, 1, 172, + 222, 115, 1, 168, 222, 115, 1, 167, 222, 115, 1, 207, 3, 222, 115, 1, + 177, 222, 115, 1, 219, 137, 222, 115, 1, 196, 157, 222, 115, 1, 204, 64, + 222, 115, 1, 202, 92, 222, 115, 1, 188, 222, 115, 1, 144, 222, 115, 3, + 212, 241, 222, 115, 3, 249, 246, 222, 115, 18, 3, 252, 33, 222, 115, 18, + 3, 70, 222, 115, 18, 3, 223, 224, 222, 115, 18, 3, 68, 222, 115, 18, 3, + 196, 251, 222, 115, 18, 3, 118, 150, 222, 115, 18, 3, 118, 207, 4, 222, + 115, 18, 3, 71, 222, 115, 18, 3, 234, 171, 222, 115, 18, 3, 251, 63, 222, + 115, 18, 3, 74, 222, 115, 18, 3, 211, 194, 222, 115, 18, 3, 250, 8, 222, + 115, 3, 196, 11, 222, 115, 220, 2, 77, 222, 115, 251, 64, 220, 2, 77, + 222, 115, 1, 233, 97, 222, 115, 1, 118, 207, 4, 222, 115, 1, 118, 219, + 138, 222, 115, 18, 3, 118, 165, 222, 115, 18, 3, 118, 219, 138, 222, 115, + 17, 192, 76, 222, 115, 17, 101, 222, 115, 17, 104, 222, 115, 17, 133, + 222, 115, 17, 134, 222, 115, 17, 151, 222, 115, 17, 170, 222, 115, 17, + 179, 222, 115, 17, 174, 222, 115, 17, 182, 222, 115, 3, 223, 13, 222, + 115, 3, 197, 39, 135, 3, 38, 250, 169, 58, 135, 3, 246, 234, 135, 3, 250, + 168, 135, 3, 196, 6, 135, 1, 196, 120, 250, 168, 135, 1, 64, 135, 1, 252, + 33, 135, 1, 70, 135, 1, 223, 224, 135, 1, 68, 135, 1, 196, 251, 135, 1, + 118, 150, 135, 1, 118, 165, 135, 1, 71, 135, 1, 234, 171, 135, 1, 251, + 63, 135, 1, 74, 135, 1, 211, 194, 135, 1, 250, 8, 135, 1, 160, 135, 1, + 221, 250, 135, 1, 231, 233, 135, 1, 231, 84, 135, 1, 214, 165, 135, 1, + 247, 19, 135, 1, 246, 117, 135, 1, 223, 62, 135, 1, 223, 28, 135, 1, 212, + 201, 135, 1, 198, 83, 135, 1, 198, 71, 135, 1, 237, 161, 135, 1, 237, + 145, 135, 1, 213, 178, 135, 1, 189, 135, 1, 199, 240, 135, 1, 238, 0, + 135, 1, 237, 40, 135, 1, 181, 135, 1, 213, 160, 135, 1, 166, 135, 1, 210, + 94, 135, 1, 249, 3, 135, 1, 248, 54, 135, 1, 172, 135, 1, 168, 135, 1, + 167, 135, 1, 207, 3, 135, 1, 177, 135, 1, 219, 137, 135, 1, 219, 126, + 135, 1, 196, 157, 135, 1, 204, 64, 135, 1, 202, 92, 135, 1, 188, 135, 1, + 144, 135, 1, 198, 52, 135, 3, 84, 248, 194, 196, 11, 135, 3, 242, 124, + 196, 11, 135, 3, 249, 246, 135, 18, 3, 252, 33, 135, 18, 3, 70, 135, 18, + 3, 223, 224, 135, 18, 3, 68, 135, 18, 3, 196, 251, 135, 18, 3, 118, 150, + 135, 18, 3, 118, 207, 4, 135, 18, 3, 71, 135, 18, 3, 234, 171, 135, 18, + 3, 251, 63, 135, 18, 3, 74, 135, 18, 3, 211, 194, 135, 18, 3, 250, 8, + 135, 3, 196, 11, 135, 1, 78, 207, 195, 135, 3, 210, 246, 135, 1, 242, + 204, 218, 236, 135, 1, 242, 204, 193, 148, 135, 1, 242, 204, 219, 127, + 135, 250, 9, 220, 2, 77, 135, 232, 109, 90, 211, 207, 135, 232, 109, 90, + 232, 129, 135, 232, 109, 112, 234, 139, 135, 232, 109, 90, 197, 242, 135, + 232, 109, 90, 200, 21, 135, 232, 109, 112, 197, 241, 135, 232, 109, 90, + 233, 6, 135, 1, 250, 112, 223, 224, 135, 1, 118, 207, 4, 135, 1, 118, + 219, 138, 135, 18, 3, 118, 165, 135, 18, 3, 118, 219, 138, 135, 17, 192, + 76, 135, 17, 101, 135, 17, 104, 135, 17, 133, 135, 17, 134, 135, 17, 151, + 135, 17, 170, 135, 17, 179, 135, 17, 174, 135, 17, 182, 135, 31, 200, 30, + 135, 31, 90, 228, 162, 135, 31, 90, 180, 135, 232, 109, 90, 208, 167, + 135, 232, 109, 90, 230, 78, 135, 232, 109, 112, 208, 165, 135, 232, 109, + 90, 203, 33, 135, 232, 109, 90, 234, 143, 135, 232, 109, 112, 203, 30, + 135, 237, 179, 77, 135, 1, 242, 204, 213, 179, 135, 1, 242, 204, 215, + 151, 135, 1, 242, 204, 207, 4, 135, 1, 242, 204, 165, 135, 1, 242, 204, + 219, 138, 135, 1, 242, 204, 222, 184, 159, 3, 246, 234, 159, 3, 250, 167, + 159, 3, 196, 5, 159, 1, 249, 234, 159, 1, 251, 242, 159, 1, 251, 88, 159, + 1, 251, 103, 159, 1, 223, 72, 159, 1, 223, 223, 159, 1, 196, 242, 159, 1, + 196, 245, 159, 1, 223, 98, 159, 1, 223, 99, 159, 1, 223, 209, 159, 1, + 223, 211, 159, 1, 233, 184, 159, 1, 234, 166, 159, 1, 251, 46, 159, 1, + 211, 97, 159, 1, 211, 187, 159, 1, 249, 249, 159, 1, 250, 255, 222, 62, + 159, 1, 217, 187, 222, 62, 159, 1, 250, 255, 231, 178, 159, 1, 217, 187, + 231, 178, 159, 1, 222, 114, 215, 81, 159, 1, 206, 30, 231, 178, 159, 1, + 250, 255, 246, 184, 159, 1, 217, 187, 246, 184, 159, 1, 250, 255, 223, + 44, 159, 1, 217, 187, 223, 44, 159, 1, 200, 171, 215, 81, 159, 1, 200, + 171, 206, 29, 215, 82, 159, 1, 206, 30, 223, 44, 159, 1, 250, 255, 198, + 79, 159, 1, 217, 187, 198, 79, 159, 1, 250, 255, 237, 152, 159, 1, 217, + 187, 237, 152, 159, 1, 215, 180, 215, 34, 159, 1, 206, 30, 237, 152, 159, + 1, 250, 255, 200, 87, 159, 1, 217, 187, 200, 87, 159, 1, 250, 255, 237, + 172, 159, 1, 217, 187, 237, 172, 159, 1, 237, 204, 215, 34, 159, 1, 206, + 30, 237, 172, 159, 1, 250, 255, 210, 189, 159, 1, 217, 187, 210, 189, + 159, 1, 250, 255, 248, 161, 159, 1, 217, 187, 248, 161, 159, 1, 217, 90, + 159, 1, 250, 235, 248, 161, 159, 1, 193, 74, 159, 1, 208, 14, 159, 1, + 237, 204, 220, 51, 159, 1, 196, 125, 159, 1, 200, 171, 206, 0, 159, 1, + 215, 180, 206, 0, 159, 1, 237, 204, 206, 0, 159, 1, 230, 5, 159, 1, 215, + 180, 220, 51, 159, 1, 233, 49, 159, 3, 251, 34, 159, 18, 3, 251, 98, 159, + 18, 3, 222, 19, 251, 105, 159, 18, 3, 236, 239, 251, 105, 159, 18, 3, + 222, 19, 223, 95, 159, 18, 3, 236, 239, 223, 95, 159, 18, 3, 222, 19, + 211, 76, 159, 18, 3, 236, 239, 211, 76, 159, 18, 3, 231, 222, 159, 18, 3, + 221, 93, 159, 18, 3, 236, 239, 221, 93, 159, 18, 3, 221, 95, 237, 90, + 159, 18, 3, 221, 94, 230, 100, 251, 98, 159, 18, 3, 221, 94, 230, 100, + 236, 239, 251, 98, 159, 18, 3, 221, 94, 230, 100, 231, 177, 159, 18, 3, + 231, 177, 159, 219, 150, 17, 192, 76, 159, 219, 150, 17, 101, 159, 219, + 150, 17, 104, 159, 219, 150, 17, 133, 159, 219, 150, 17, 134, 159, 219, + 150, 17, 151, 159, 219, 150, 17, 170, 159, 219, 150, 17, 179, 159, 219, + 150, 17, 174, 159, 219, 150, 17, 182, 159, 18, 3, 236, 239, 231, 222, + 159, 18, 3, 236, 239, 231, 177, 159, 209, 38, 221, 11, 199, 235, 246, + 100, 221, 114, 222, 135, 199, 235, 246, 100, 221, 221, 221, 244, 199, + 235, 246, 100, 221, 221, 221, 212, 199, 235, 246, 100, 221, 221, 221, + 207, 199, 235, 246, 100, 221, 221, 221, 217, 199, 235, 246, 100, 221, + 221, 208, 35, 199, 235, 246, 100, 214, 91, 214, 78, 199, 235, 246, 100, + 242, 189, 246, 106, 199, 235, 246, 100, 242, 189, 242, 199, 199, 235, + 246, 100, 242, 189, 246, 105, 199, 235, 246, 100, 202, 213, 202, 212, + 199, 235, 246, 100, 242, 189, 242, 185, 199, 235, 246, 100, 193, 2, 193, + 9, 199, 235, 246, 100, 236, 147, 246, 114, 199, 235, 246, 100, 115, 210, + 204, 199, 235, 246, 100, 199, 177, 199, 229, 199, 235, 246, 100, 199, + 177, 215, 57, 199, 235, 246, 100, 199, 177, 210, 54, 199, 235, 246, 100, + 213, 143, 214, 196, 199, 235, 246, 100, 236, 147, 237, 91, 199, 235, 246, + 100, 115, 200, 117, 199, 235, 246, 100, 199, 177, 199, 142, 199, 235, + 246, 100, 199, 177, 199, 236, 199, 235, 246, 100, 199, 177, 199, 171, + 199, 235, 246, 100, 213, 143, 213, 22, 199, 235, 246, 100, 247, 221, 248, + 224, 199, 235, 246, 100, 209, 199, 209, 234, 199, 235, 246, 100, 210, 66, + 210, 56, 199, 235, 246, 100, 232, 165, 233, 97, 199, 235, 246, 100, 210, + 66, 210, 87, 199, 235, 246, 100, 232, 165, 233, 68, 199, 235, 246, 100, + 210, 66, 206, 44, 199, 235, 246, 100, 216, 92, 172, 199, 235, 246, 100, + 193, 2, 193, 105, 199, 235, 246, 100, 207, 56, 206, 211, 199, 235, 246, + 100, 206, 218, 199, 235, 246, 100, 219, 108, 219, 168, 199, 235, 246, + 100, 219, 36, 199, 235, 246, 100, 194, 37, 194, 159, 199, 235, 246, 100, + 202, 213, 206, 61, 199, 235, 246, 100, 202, 213, 206, 182, 199, 235, 246, + 100, 202, 213, 201, 175, 199, 235, 246, 100, 229, 44, 229, 142, 199, 235, + 246, 100, 219, 108, 242, 167, 199, 235, 246, 100, 185, 250, 214, 199, + 235, 246, 100, 229, 44, 213, 133, 199, 235, 246, 100, 211, 51, 199, 235, + 246, 100, 206, 24, 64, 199, 235, 246, 100, 217, 181, 230, 64, 199, 235, + 246, 100, 206, 24, 252, 33, 199, 235, 246, 100, 206, 24, 250, 241, 199, + 235, 246, 100, 206, 24, 70, 199, 235, 246, 100, 206, 24, 223, 224, 199, + 235, 246, 100, 206, 24, 197, 104, 199, 235, 246, 100, 206, 24, 197, 102, + 199, 235, 246, 100, 206, 24, 68, 199, 235, 246, 100, 206, 24, 196, 251, + 199, 235, 246, 100, 210, 68, 199, 235, 238, 137, 16, 248, 225, 199, 235, + 246, 100, 206, 24, 71, 199, 235, 246, 100, 206, 24, 251, 108, 199, 235, + 246, 100, 206, 24, 74, 199, 235, 246, 100, 206, 24, 251, 64, 217, 175, + 199, 235, 246, 100, 206, 24, 251, 64, 217, 176, 199, 235, 246, 100, 220, + 98, 199, 235, 246, 100, 217, 172, 199, 235, 246, 100, 217, 173, 199, 235, + 246, 100, 217, 181, 234, 131, 199, 235, 246, 100, 217, 181, 199, 176, + 199, 235, 246, 100, 217, 181, 198, 188, 199, 235, 246, 100, 217, 181, + 242, 250, 199, 235, 246, 100, 199, 227, 199, 235, 246, 100, 214, 24, 199, + 235, 246, 100, 193, 99, 199, 235, 246, 100, 232, 154, 199, 235, 17, 192, + 76, 199, 235, 17, 101, 199, 235, 17, 104, 199, 235, 17, 133, 199, 235, + 17, 134, 199, 235, 17, 151, 199, 235, 17, 170, 199, 235, 17, 179, 199, + 235, 17, 174, 199, 235, 17, 182, 199, 235, 246, 100, 250, 209, 199, 235, + 246, 100, 221, 218, 220, 77, 1, 221, 113, 220, 77, 1, 221, 221, 201, 120, + 220, 77, 1, 221, 221, 200, 129, 220, 77, 1, 211, 44, 231, 84, 220, 77, 1, + 214, 90, 220, 77, 1, 242, 63, 220, 77, 1, 211, 44, 246, 117, 220, 77, 1, + 202, 213, 200, 129, 220, 77, 1, 211, 44, 223, 28, 220, 77, 1, 212, 165, + 220, 77, 1, 211, 44, 212, 201, 220, 77, 1, 211, 44, 198, 83, 220, 77, 1, + 211, 44, 198, 71, 220, 77, 1, 211, 44, 237, 161, 220, 77, 1, 211, 44, + 237, 145, 220, 77, 1, 211, 44, 213, 178, 220, 77, 1, 236, 146, 220, 77, + 1, 155, 220, 77, 1, 199, 177, 201, 120, 220, 77, 1, 199, 177, 200, 129, + 220, 77, 1, 211, 44, 237, 40, 220, 77, 1, 213, 142, 220, 77, 1, 247, 220, + 220, 77, 1, 209, 198, 220, 77, 1, 210, 66, 201, 120, 220, 77, 1, 232, + 165, 200, 129, 220, 77, 1, 210, 66, 200, 129, 220, 77, 1, 232, 165, 201, + 120, 220, 77, 1, 211, 44, 248, 54, 220, 77, 1, 216, 91, 220, 77, 1, 193, + 1, 220, 77, 1, 219, 108, 219, 168, 220, 77, 1, 219, 108, 219, 67, 220, + 77, 1, 194, 36, 220, 77, 1, 206, 32, 204, 64, 220, 77, 1, 206, 32, 202, + 92, 220, 77, 1, 202, 213, 201, 120, 220, 77, 1, 229, 44, 201, 120, 220, + 77, 1, 211, 44, 219, 137, 220, 77, 1, 74, 220, 77, 1, 229, 44, 200, 129, + 220, 77, 234, 105, 220, 77, 18, 3, 64, 220, 77, 18, 3, 217, 181, 222, + 121, 220, 77, 18, 3, 252, 33, 220, 77, 18, 3, 250, 241, 220, 77, 18, 3, + 70, 220, 77, 18, 3, 223, 224, 220, 77, 18, 3, 193, 148, 220, 77, 18, 3, + 192, 165, 220, 77, 18, 3, 68, 220, 77, 18, 3, 196, 251, 220, 77, 3, 211, + 44, 196, 11, 220, 77, 18, 3, 217, 181, 221, 91, 220, 77, 204, 175, 3, + 219, 107, 220, 77, 204, 175, 3, 212, 165, 220, 77, 18, 3, 71, 220, 77, + 18, 3, 234, 150, 220, 77, 18, 3, 74, 220, 77, 18, 3, 249, 236, 220, 77, + 18, 3, 251, 63, 220, 77, 221, 114, 177, 220, 77, 158, 217, 181, 234, 131, + 220, 77, 158, 217, 181, 199, 176, 220, 77, 158, 217, 181, 199, 128, 220, + 77, 158, 217, 181, 246, 192, 220, 77, 246, 240, 77, 220, 77, 214, 33, + 220, 77, 17, 192, 76, 220, 77, 17, 101, 220, 77, 17, 104, 220, 77, 17, + 133, 220, 77, 17, 134, 220, 77, 17, 151, 220, 77, 17, 170, 220, 77, 17, + 179, 220, 77, 17, 174, 220, 77, 17, 182, 220, 77, 229, 44, 213, 142, 220, + 77, 229, 44, 216, 91, 220, 77, 1, 221, 222, 230, 254, 220, 77, 1, 221, + 222, 212, 165, 86, 5, 211, 219, 86, 122, 230, 188, 193, 14, 216, 193, + 198, 124, 64, 86, 122, 230, 188, 193, 14, 216, 193, 255, 34, 207, 60, + 248, 125, 172, 86, 122, 230, 188, 193, 14, 216, 193, 255, 34, 230, 188, + 198, 104, 172, 86, 122, 88, 193, 14, 216, 193, 217, 50, 172, 86, 122, + 242, 80, 193, 14, 216, 193, 204, 71, 172, 86, 122, 246, 212, 193, 14, + 216, 193, 210, 55, 204, 57, 172, 86, 122, 193, 14, 216, 193, 198, 104, + 204, 57, 172, 86, 122, 205, 254, 204, 56, 86, 122, 247, 127, 193, 14, + 216, 192, 86, 122, 247, 250, 203, 205, 193, 14, 216, 192, 86, 122, 223, + 126, 198, 103, 86, 122, 237, 83, 198, 104, 247, 126, 86, 122, 204, 56, + 86, 122, 212, 170, 204, 56, 86, 122, 198, 104, 204, 56, 86, 122, 212, + 170, 198, 104, 204, 56, 86, 122, 207, 84, 242, 231, 202, 109, 204, 56, + 86, 122, 207, 160, 230, 222, 204, 56, 86, 122, 246, 212, 255, 38, 206, + 223, 217, 49, 184, 246, 243, 86, 122, 230, 188, 198, 103, 86, 219, 91, 3, + 246, 115, 206, 222, 86, 219, 91, 3, 219, 220, 206, 222, 86, 250, 32, 3, + 204, 67, 231, 161, 255, 39, 206, 222, 86, 250, 32, 3, 255, 36, 166, 86, + 250, 32, 3, 205, 224, 198, 98, 86, 3, 208, 9, 236, 161, 231, 160, 86, 3, + 208, 9, 236, 161, 231, 0, 86, 3, 208, 9, 236, 161, 230, 189, 86, 3, 208, + 9, 215, 77, 231, 160, 86, 3, 208, 9, 215, 77, 231, 0, 86, 3, 208, 9, 236, + 161, 208, 9, 215, 76, 86, 17, 192, 76, 86, 17, 101, 86, 17, 104, 86, 17, + 133, 86, 17, 134, 86, 17, 151, 86, 17, 170, 86, 17, 179, 86, 17, 174, 86, + 17, 182, 86, 17, 138, 101, 86, 17, 138, 104, 86, 17, 138, 133, 86, 17, + 138, 134, 86, 17, 138, 151, 86, 17, 138, 170, 86, 17, 138, 179, 86, 17, + 138, 174, 86, 17, 138, 182, 86, 17, 138, 192, 76, 86, 122, 247, 129, 206, + 222, 86, 122, 214, 156, 247, 54, 212, 182, 192, 10, 86, 122, 246, 212, + 255, 38, 206, 223, 247, 55, 216, 138, 246, 243, 86, 122, 214, 156, 247, + 54, 204, 68, 206, 222, 86, 122, 242, 246, 216, 192, 86, 122, 198, 119, + 255, 35, 86, 122, 230, 171, 206, 223, 230, 127, 86, 122, 230, 171, 206, + 223, 230, 133, 86, 122, 250, 215, 221, 239, 230, 127, 86, 122, 250, 215, + 221, 239, 230, 133, 86, 3, 193, 91, 198, 102, 86, 3, 217, 136, 198, 102, + 86, 1, 160, 86, 1, 221, 250, 86, 1, 231, 233, 86, 1, 231, 84, 86, 1, 214, + 165, 86, 1, 247, 19, 86, 1, 246, 117, 86, 1, 223, 62, 86, 1, 212, 201, + 86, 1, 198, 83, 86, 1, 198, 71, 86, 1, 237, 161, 86, 1, 237, 145, 86, 1, + 213, 178, 86, 1, 189, 86, 1, 199, 240, 86, 1, 238, 0, 86, 1, 237, 40, 86, + 1, 181, 86, 1, 166, 86, 1, 210, 94, 86, 1, 249, 3, 86, 1, 248, 54, 86, 1, + 172, 86, 1, 198, 118, 86, 1, 198, 108, 86, 1, 235, 17, 86, 1, 235, 11, + 86, 1, 194, 169, 86, 1, 192, 71, 86, 1, 192, 112, 86, 1, 255, 41, 86, 1, + 168, 86, 1, 167, 86, 1, 177, 86, 1, 204, 64, 86, 1, 202, 92, 86, 1, 188, + 86, 1, 144, 86, 1, 64, 86, 1, 221, 47, 86, 1, 232, 210, 167, 86, 1, 221, + 139, 86, 1, 207, 3, 86, 18, 3, 252, 33, 86, 18, 3, 70, 86, 18, 3, 223, + 224, 86, 18, 3, 68, 86, 18, 3, 196, 251, 86, 18, 3, 118, 150, 86, 18, 3, + 118, 207, 4, 86, 18, 3, 118, 165, 86, 18, 3, 118, 219, 138, 86, 18, 3, + 71, 86, 18, 3, 234, 171, 86, 18, 3, 74, 86, 18, 3, 211, 194, 86, 3, 207, + 66, 201, 185, 214, 166, 207, 55, 86, 3, 207, 60, 248, 124, 86, 18, 3, + 207, 168, 70, 86, 18, 3, 207, 168, 223, 224, 86, 3, 212, 182, 192, 11, + 215, 85, 238, 0, 86, 3, 202, 227, 220, 44, 86, 122, 230, 80, 86, 122, + 211, 36, 86, 3, 220, 47, 206, 222, 86, 3, 193, 96, 206, 222, 86, 3, 220, + 48, 198, 119, 246, 243, 86, 3, 217, 52, 246, 243, 86, 3, 230, 192, 246, + 244, 207, 158, 86, 3, 230, 192, 217, 38, 207, 158, 86, 3, 223, 121, 217, + 52, 246, 243, 86, 201, 164, 3, 220, 48, 198, 119, 246, 243, 86, 201, 164, + 3, 217, 52, 246, 243, 86, 201, 164, 3, 223, 121, 217, 52, 246, 243, 86, + 201, 164, 1, 160, 86, 201, 164, 1, 221, 250, 86, 201, 164, 1, 231, 233, + 86, 201, 164, 1, 231, 84, 86, 201, 164, 1, 214, 165, 86, 201, 164, 1, + 247, 19, 86, 201, 164, 1, 246, 117, 86, 201, 164, 1, 223, 62, 86, 201, + 164, 1, 212, 201, 86, 201, 164, 1, 198, 83, 86, 201, 164, 1, 198, 71, 86, + 201, 164, 1, 237, 161, 86, 201, 164, 1, 237, 145, 86, 201, 164, 1, 213, + 178, 86, 201, 164, 1, 189, 86, 201, 164, 1, 199, 240, 86, 201, 164, 1, + 238, 0, 86, 201, 164, 1, 237, 40, 86, 201, 164, 1, 181, 86, 201, 164, 1, + 166, 86, 201, 164, 1, 210, 94, 86, 201, 164, 1, 249, 3, 86, 201, 164, 1, + 248, 54, 86, 201, 164, 1, 172, 86, 201, 164, 1, 198, 118, 86, 201, 164, + 1, 198, 108, 86, 201, 164, 1, 235, 17, 86, 201, 164, 1, 235, 11, 86, 201, + 164, 1, 194, 169, 86, 201, 164, 1, 192, 71, 86, 201, 164, 1, 192, 112, + 86, 201, 164, 1, 255, 41, 86, 201, 164, 1, 168, 86, 201, 164, 1, 167, 86, + 201, 164, 1, 177, 86, 201, 164, 1, 204, 64, 86, 201, 164, 1, 202, 92, 86, + 201, 164, 1, 188, 86, 201, 164, 1, 144, 86, 201, 164, 1, 64, 86, 201, + 164, 1, 221, 47, 86, 201, 164, 1, 232, 210, 194, 169, 86, 201, 164, 1, + 232, 210, 168, 86, 201, 164, 1, 232, 210, 167, 86, 221, 34, 206, 219, + 221, 250, 86, 221, 34, 206, 219, 221, 251, 247, 55, 216, 138, 246, 243, + 86, 246, 227, 3, 87, 248, 114, 86, 246, 227, 3, 152, 248, 114, 86, 246, + 227, 3, 246, 231, 200, 69, 86, 246, 227, 3, 205, 253, 255, 40, 86, 16, + 235, 78, 247, 124, 86, 16, 208, 8, 207, 67, 86, 16, 211, 63, 231, 159, + 86, 16, 208, 8, 207, 68, 207, 160, 230, 221, 86, 16, 210, 55, 166, 86, + 16, 213, 120, 247, 124, 86, 16, 213, 120, 247, 125, 212, 170, 255, 37, + 86, 16, 213, 120, 247, 125, 230, 190, 255, 37, 86, 16, 213, 120, 247, + 125, 247, 55, 255, 37, 86, 3, 208, 9, 215, 77, 208, 9, 236, 160, 86, 3, + 208, 9, 215, 77, 230, 189, 86, 122, 247, 128, 203, 205, 231, 47, 216, + 193, 207, 159, 86, 122, 216, 93, 193, 14, 231, 47, 216, 193, 207, 159, + 86, 122, 212, 170, 198, 103, 86, 122, 88, 247, 157, 207, 57, 193, 14, + 216, 193, 217, 50, 172, 86, 122, 242, 80, 247, 157, 207, 57, 193, 14, + 216, 193, 204, 71, 172, 207, 100, 201, 81, 57, 220, 27, 201, 81, 57, 207, + 100, 201, 81, 3, 4, 236, 111, 220, 27, 201, 81, 3, 4, 236, 111, 86, 122, + 220, 39, 217, 53, 206, 222, 86, 122, 198, 215, 217, 53, 206, 222, 79, 1, + 160, 79, 1, 221, 250, 79, 1, 231, 233, 79, 1, 231, 84, 79, 1, 214, 165, + 79, 1, 247, 19, 79, 1, 246, 117, 79, 1, 223, 62, 79, 1, 223, 28, 79, 1, + 212, 201, 79, 1, 213, 144, 79, 1, 198, 83, 79, 1, 198, 71, 79, 1, 237, + 161, 79, 1, 237, 145, 79, 1, 213, 178, 79, 1, 189, 79, 1, 199, 240, 79, + 1, 238, 0, 79, 1, 237, 40, 79, 1, 181, 79, 1, 166, 79, 1, 210, 94, 79, 1, + 249, 3, 79, 1, 248, 54, 79, 1, 172, 79, 1, 168, 79, 1, 167, 79, 1, 177, + 79, 1, 194, 169, 79, 1, 188, 79, 1, 144, 79, 1, 219, 137, 79, 1, 64, 79, + 1, 204, 38, 64, 79, 1, 70, 79, 1, 223, 224, 79, 1, 68, 79, 1, 196, 251, + 79, 1, 71, 79, 1, 216, 56, 71, 79, 1, 74, 79, 1, 250, 8, 79, 18, 3, 200, + 132, 252, 33, 79, 18, 3, 252, 33, 79, 18, 3, 70, 79, 18, 3, 223, 224, 79, + 18, 3, 68, 79, 18, 3, 196, 251, 79, 18, 3, 71, 79, 18, 3, 251, 63, 79, + 18, 3, 216, 56, 223, 224, 79, 18, 3, 216, 56, 74, 79, 18, 3, 234, 253, + 58, 79, 3, 250, 168, 79, 3, 78, 63, 79, 3, 196, 6, 79, 3, 196, 11, 79, 3, + 250, 58, 79, 116, 3, 217, 35, 168, 79, 116, 3, 217, 35, 167, 79, 116, 3, + 217, 35, 194, 169, 79, 116, 3, 217, 35, 144, 79, 1, 230, 206, 188, 79, + 17, 192, 76, 79, 17, 101, 79, 17, 104, 79, 17, 133, 79, 17, 134, 79, 17, + 151, 79, 17, 170, 79, 17, 179, 79, 17, 174, 79, 17, 182, 79, 3, 219, 147, + 205, 208, 79, 3, 205, 208, 79, 16, 219, 100, 79, 16, 242, 31, 79, 16, + 251, 84, 79, 16, 231, 139, 79, 1, 204, 64, 79, 1, 202, 92, 79, 1, 118, + 150, 79, 1, 118, 207, 4, 79, 1, 118, 165, 79, 1, 118, 219, 138, 79, 18, + 3, 118, 150, 79, 18, 3, 118, 207, 4, 79, 18, 3, 118, 165, 79, 18, 3, 118, + 219, 138, 79, 1, 216, 56, 214, 165, 79, 1, 216, 56, 223, 28, 79, 1, 216, + 56, 248, 159, 79, 1, 216, 56, 248, 154, 79, 116, 3, 216, 56, 217, 35, + 181, 79, 116, 3, 216, 56, 217, 35, 172, 79, 116, 3, 216, 56, 217, 35, + 177, 79, 1, 204, 70, 222, 96, 204, 64, 79, 18, 3, 204, 70, 222, 96, 233, + 230, 79, 158, 122, 204, 70, 222, 96, 230, 14, 79, 158, 122, 204, 70, 222, + 96, 222, 58, 210, 65, 79, 1, 194, 88, 209, 3, 222, 96, 199, 240, 79, 1, + 194, 88, 209, 3, 222, 96, 209, 9, 79, 18, 3, 194, 88, 209, 3, 222, 96, + 233, 230, 79, 18, 3, 194, 88, 209, 3, 222, 96, 197, 104, 79, 3, 194, 88, + 209, 3, 222, 96, 199, 17, 79, 3, 194, 88, 209, 3, 222, 96, 199, 16, 79, + 3, 194, 88, 209, 3, 222, 96, 199, 15, 79, 3, 194, 88, 209, 3, 222, 96, + 199, 14, 79, 3, 194, 88, 209, 3, 222, 96, 199, 13, 79, 1, 234, 184, 209, + 3, 222, 96, 213, 178, 79, 1, 234, 184, 209, 3, 222, 96, 192, 172, 79, 1, + 234, 184, 209, 3, 222, 96, 231, 49, 79, 18, 3, 231, 154, 222, 96, 70, 79, + 18, 3, 222, 63, 212, 0, 79, 18, 3, 222, 63, 68, 79, 18, 3, 222, 63, 234, + 171, 79, 1, 204, 38, 160, 79, 1, 204, 38, 221, 250, 79, 1, 204, 38, 231, + 233, 79, 1, 204, 38, 247, 19, 79, 1, 204, 38, 192, 112, 79, 1, 204, 38, + 212, 201, 79, 1, 204, 38, 238, 0, 79, 1, 204, 38, 181, 79, 1, 204, 38, + 210, 94, 79, 1, 204, 38, 233, 97, 79, 1, 204, 38, 249, 3, 79, 1, 204, 38, + 199, 240, 79, 1, 204, 38, 144, 79, 116, 3, 204, 38, 217, 35, 194, 169, + 79, 18, 3, 204, 38, 252, 33, 79, 18, 3, 204, 38, 71, 79, 18, 3, 204, 38, + 234, 253, 58, 79, 18, 3, 204, 38, 52, 193, 148, 79, 3, 204, 38, 199, 16, + 79, 3, 204, 38, 199, 15, 79, 3, 204, 38, 199, 13, 79, 3, 204, 38, 199, + 12, 79, 3, 204, 38, 238, 213, 199, 16, 79, 3, 204, 38, 238, 213, 199, 15, + 79, 3, 204, 38, 238, 213, 234, 91, 199, 18, 79, 1, 206, 197, 211, 46, + 233, 97, 79, 3, 206, 197, 211, 46, 199, 13, 79, 204, 38, 17, 192, 76, 79, + 204, 38, 17, 101, 79, 204, 38, 17, 104, 79, 204, 38, 17, 133, 79, 204, + 38, 17, 134, 79, 204, 38, 17, 151, 79, 204, 38, 17, 170, 79, 204, 38, 17, + 179, 79, 204, 38, 17, 174, 79, 204, 38, 17, 182, 79, 3, 221, 242, 199, + 17, 79, 3, 221, 242, 199, 15, 79, 18, 3, 251, 49, 64, 79, 18, 3, 251, 49, + 251, 63, 79, 16, 204, 38, 101, 79, 16, 204, 38, 233, 203, 98, 6, 1, 250, + 224, 98, 6, 1, 248, 207, 98, 6, 1, 231, 203, 98, 6, 1, 236, 123, 98, 6, + 1, 234, 88, 98, 6, 1, 196, 20, 98, 6, 1, 192, 79, 98, 6, 1, 200, 125, 98, + 6, 1, 223, 190, 98, 6, 1, 222, 121, 98, 6, 1, 220, 67, 98, 6, 1, 217, + 160, 98, 6, 1, 215, 51, 98, 6, 1, 211, 211, 98, 6, 1, 210, 247, 98, 6, 1, + 192, 67, 98, 6, 1, 208, 53, 98, 6, 1, 206, 40, 98, 6, 1, 200, 112, 98, 6, + 1, 197, 77, 98, 6, 1, 210, 86, 98, 6, 1, 221, 237, 98, 6, 1, 231, 75, 98, + 6, 1, 208, 224, 98, 6, 1, 203, 224, 98, 6, 1, 242, 201, 98, 6, 1, 246, + 243, 98, 6, 1, 223, 10, 98, 6, 1, 242, 138, 98, 6, 1, 246, 101, 98, 6, 1, + 193, 207, 98, 6, 1, 223, 25, 98, 6, 1, 230, 95, 98, 6, 1, 229, 255, 98, + 6, 1, 229, 165, 98, 6, 1, 194, 111, 98, 6, 1, 230, 28, 98, 6, 1, 229, 31, + 98, 6, 1, 193, 3, 98, 6, 1, 251, 97, 98, 1, 250, 224, 98, 1, 248, 207, + 98, 1, 231, 203, 98, 1, 236, 123, 98, 1, 234, 88, 98, 1, 196, 20, 98, 1, + 192, 79, 98, 1, 200, 125, 98, 1, 223, 190, 98, 1, 222, 121, 98, 1, 220, + 67, 98, 1, 217, 160, 98, 1, 215, 51, 98, 1, 211, 211, 98, 1, 210, 247, + 98, 1, 192, 67, 98, 1, 208, 53, 98, 1, 206, 40, 98, 1, 200, 112, 98, 1, + 197, 77, 98, 1, 210, 86, 98, 1, 221, 237, 98, 1, 231, 75, 98, 1, 208, + 224, 98, 1, 203, 224, 98, 1, 242, 201, 98, 1, 246, 243, 98, 1, 223, 10, + 98, 1, 242, 138, 98, 1, 246, 101, 98, 1, 193, 207, 98, 1, 223, 25, 98, 1, + 230, 95, 98, 1, 229, 255, 98, 1, 229, 165, 98, 1, 194, 111, 98, 1, 230, + 28, 98, 1, 229, 31, 98, 1, 233, 11, 98, 1, 193, 3, 98, 1, 234, 107, 98, + 1, 163, 231, 203, 98, 1, 251, 57, 98, 210, 244, 204, 165, 73, 1, 98, 215, + 51, 98, 1, 251, 97, 98, 1, 230, 26, 57, 98, 1, 220, 175, 57, 30, 143, + 221, 151, 30, 143, 202, 84, 30, 143, 214, 45, 30, 143, 199, 103, 30, 143, + 202, 73, 30, 143, 207, 133, 30, 143, 216, 153, 30, 143, 210, 36, 30, 143, + 202, 81, 30, 143, 203, 64, 30, 143, 202, 78, 30, 143, 223, 247, 30, 143, + 242, 144, 30, 143, 202, 88, 30, 143, 242, 211, 30, 143, 221, 225, 30, + 143, 199, 198, 30, 143, 210, 75, 30, 143, 229, 162, 30, 143, 214, 41, 30, + 143, 202, 82, 30, 143, 214, 35, 30, 143, 214, 39, 30, 143, 199, 100, 30, + 143, 207, 121, 30, 143, 202, 80, 30, 143, 207, 131, 30, 143, 222, 102, + 30, 143, 216, 146, 30, 143, 222, 105, 30, 143, 210, 31, 30, 143, 210, 29, + 30, 143, 210, 17, 30, 143, 210, 25, 30, 143, 210, 23, 30, 143, 210, 20, + 30, 143, 210, 22, 30, 143, 210, 19, 30, 143, 210, 24, 30, 143, 210, 34, + 30, 143, 210, 35, 30, 143, 210, 18, 30, 143, 210, 28, 30, 143, 222, 103, + 30, 143, 222, 101, 30, 143, 203, 57, 30, 143, 203, 55, 30, 143, 203, 47, + 30, 143, 203, 50, 30, 143, 203, 56, 30, 143, 203, 52, 30, 143, 203, 51, + 30, 143, 203, 49, 30, 143, 203, 60, 30, 143, 203, 62, 30, 143, 203, 63, + 30, 143, 203, 58, 30, 143, 203, 48, 30, 143, 203, 53, 30, 143, 203, 61, + 30, 143, 242, 192, 30, 143, 242, 190, 30, 143, 246, 130, 30, 143, 246, + 128, 30, 143, 211, 8, 30, 143, 223, 242, 30, 143, 223, 233, 30, 143, 223, + 241, 30, 143, 223, 238, 30, 143, 223, 236, 30, 143, 223, 240, 30, 143, + 202, 85, 30, 143, 223, 245, 30, 143, 223, 246, 30, 143, 223, 234, 30, + 143, 223, 239, 30, 143, 193, 46, 30, 143, 242, 143, 30, 143, 242, 193, + 30, 143, 242, 191, 30, 143, 246, 131, 30, 143, 246, 129, 30, 143, 242, + 209, 30, 143, 242, 210, 30, 143, 242, 194, 30, 143, 246, 132, 30, 143, + 210, 73, 30, 143, 222, 104, 30, 143, 202, 86, 30, 143, 193, 52, 30, 143, + 221, 142, 30, 143, 214, 37, 30, 143, 214, 43, 30, 143, 214, 42, 30, 143, + 199, 97, 30, 143, 232, 247, 30, 222, 206, 232, 247, 30, 222, 206, 64, 30, + 222, 206, 251, 108, 30, 222, 206, 168, 30, 222, 206, 193, 118, 30, 222, + 206, 234, 50, 30, 222, 206, 71, 30, 222, 206, 193, 56, 30, 222, 206, 193, + 69, 30, 222, 206, 74, 30, 222, 206, 194, 169, 30, 222, 206, 194, 160, 30, + 222, 206, 212, 0, 30, 222, 206, 193, 1, 30, 222, 206, 68, 30, 222, 206, + 194, 93, 30, 222, 206, 194, 111, 30, 222, 206, 194, 72, 30, 222, 206, + 192, 214, 30, 222, 206, 233, 230, 30, 222, 206, 193, 22, 30, 222, 206, + 70, 30, 222, 206, 255, 29, 30, 222, 206, 255, 28, 30, 222, 206, 193, 132, + 30, 222, 206, 193, 130, 30, 222, 206, 234, 48, 30, 222, 206, 234, 47, 30, + 222, 206, 234, 49, 30, 222, 206, 193, 55, 30, 222, 206, 193, 54, 30, 222, + 206, 212, 110, 30, 222, 206, 212, 111, 30, 222, 206, 212, 104, 30, 222, + 206, 212, 109, 30, 222, 206, 212, 107, 30, 222, 206, 192, 245, 30, 222, + 206, 192, 244, 30, 222, 206, 192, 243, 30, 222, 206, 192, 246, 30, 222, + 206, 192, 247, 30, 222, 206, 197, 177, 30, 222, 206, 197, 176, 30, 222, + 206, 197, 174, 30, 222, 206, 197, 170, 30, 222, 206, 197, 171, 30, 222, + 206, 192, 209, 30, 222, 206, 192, 206, 30, 222, 206, 192, 207, 30, 222, + 206, 192, 201, 30, 222, 206, 192, 202, 30, 222, 206, 192, 203, 30, 222, + 206, 192, 205, 30, 222, 206, 233, 224, 30, 222, 206, 233, 226, 30, 222, + 206, 193, 21, 30, 222, 206, 228, 92, 30, 222, 206, 228, 84, 30, 222, 206, + 228, 87, 30, 222, 206, 228, 85, 30, 222, 206, 228, 89, 30, 222, 206, 228, + 91, 30, 222, 206, 250, 123, 30, 222, 206, 250, 120, 30, 222, 206, 250, + 118, 30, 222, 206, 250, 119, 30, 222, 206, 202, 89, 30, 222, 206, 255, + 30, 30, 222, 206, 193, 131, 30, 222, 206, 193, 53, 30, 222, 206, 212, + 106, 30, 222, 206, 212, 105, 30, 123, 221, 151, 30, 123, 202, 84, 30, + 123, 221, 144, 30, 123, 214, 45, 30, 123, 214, 43, 30, 123, 214, 42, 30, + 123, 199, 103, 30, 123, 207, 133, 30, 123, 207, 128, 30, 123, 207, 125, + 30, 123, 207, 118, 30, 123, 207, 113, 30, 123, 207, 108, 30, 123, 207, + 119, 30, 123, 207, 131, 30, 123, 216, 153, 30, 123, 210, 36, 30, 123, + 210, 25, 30, 123, 203, 64, 30, 123, 202, 78, 30, 123, 223, 247, 30, 123, + 242, 144, 30, 123, 242, 211, 30, 123, 221, 225, 30, 123, 199, 198, 30, + 123, 210, 75, 30, 123, 229, 162, 30, 123, 221, 145, 30, 123, 221, 143, + 30, 123, 214, 41, 30, 123, 214, 35, 30, 123, 214, 37, 30, 123, 214, 40, + 30, 123, 214, 36, 30, 123, 199, 100, 30, 123, 199, 97, 30, 123, 207, 126, + 30, 123, 207, 121, 30, 123, 207, 107, 30, 123, 207, 106, 30, 123, 202, + 80, 30, 123, 207, 123, 30, 123, 207, 122, 30, 123, 207, 115, 30, 123, + 207, 117, 30, 123, 207, 130, 30, 123, 207, 110, 30, 123, 207, 120, 30, + 123, 207, 129, 30, 123, 207, 105, 30, 123, 216, 149, 30, 123, 216, 144, + 30, 123, 216, 146, 30, 123, 216, 143, 30, 123, 216, 141, 30, 123, 216, + 147, 30, 123, 216, 152, 30, 123, 216, 150, 30, 123, 222, 105, 30, 123, + 210, 27, 30, 123, 210, 28, 30, 123, 210, 33, 30, 123, 222, 103, 30, 123, + 203, 57, 30, 123, 203, 47, 30, 123, 203, 50, 30, 123, 203, 52, 30, 123, + 211, 8, 30, 123, 223, 242, 30, 123, 223, 235, 30, 123, 202, 85, 30, 123, + 223, 243, 30, 123, 193, 46, 30, 123, 193, 40, 30, 123, 193, 41, 30, 123, + 210, 73, 30, 123, 222, 104, 30, 123, 229, 160, 30, 123, 229, 158, 30, + 123, 229, 161, 30, 123, 229, 159, 30, 123, 193, 52, 30, 123, 221, 147, + 30, 123, 221, 146, 30, 123, 221, 150, 30, 123, 221, 148, 30, 123, 221, + 149, 30, 123, 202, 82, 36, 5, 144, 36, 5, 228, 181, 36, 5, 229, 178, 36, + 5, 230, 99, 36, 5, 229, 225, 36, 5, 229, 255, 36, 5, 229, 43, 36, 5, 229, + 34, 36, 5, 177, 36, 5, 219, 36, 36, 5, 219, 209, 36, 5, 220, 184, 36, 5, + 220, 32, 36, 5, 220, 42, 36, 5, 219, 107, 36, 5, 219, 3, 36, 5, 229, 187, + 36, 5, 229, 181, 36, 5, 229, 183, 36, 5, 229, 186, 36, 5, 229, 184, 36, + 5, 229, 185, 36, 5, 229, 182, 36, 5, 229, 180, 36, 5, 172, 36, 5, 215, + 241, 36, 5, 216, 175, 36, 5, 217, 219, 36, 5, 217, 29, 36, 5, 217, 48, + 36, 5, 216, 91, 36, 5, 215, 168, 36, 5, 200, 239, 36, 5, 200, 233, 36, 5, + 200, 235, 36, 5, 200, 238, 36, 5, 200, 236, 36, 5, 200, 237, 36, 5, 200, + 234, 36, 5, 200, 232, 36, 5, 167, 36, 5, 206, 218, 36, 5, 207, 151, 36, + 5, 208, 68, 36, 5, 207, 234, 36, 5, 208, 7, 36, 5, 207, 55, 36, 5, 206, + 176, 36, 5, 188, 36, 5, 201, 184, 36, 5, 203, 125, 36, 5, 206, 91, 36, 5, + 205, 205, 36, 5, 205, 223, 36, 5, 202, 212, 36, 5, 201, 79, 36, 5, 204, + 64, 36, 5, 203, 164, 36, 5, 203, 236, 36, 5, 204, 59, 36, 5, 204, 10, 36, + 5, 204, 12, 36, 5, 203, 211, 36, 5, 203, 143, 36, 5, 208, 239, 36, 5, + 208, 177, 36, 5, 208, 201, 36, 5, 208, 238, 36, 5, 208, 218, 36, 5, 208, + 219, 36, 5, 208, 189, 36, 5, 208, 188, 36, 5, 208, 130, 36, 5, 208, 126, + 36, 5, 208, 129, 36, 5, 208, 127, 36, 5, 208, 128, 36, 5, 208, 215, 36, + 5, 208, 207, 36, 5, 208, 210, 36, 5, 208, 214, 36, 5, 208, 211, 36, 5, + 208, 212, 36, 5, 208, 209, 36, 5, 208, 206, 36, 5, 208, 202, 36, 5, 208, + 205, 36, 5, 208, 203, 36, 5, 208, 204, 36, 5, 249, 3, 36, 5, 247, 124, + 36, 5, 248, 41, 36, 5, 249, 1, 36, 5, 248, 108, 36, 5, 248, 123, 36, 5, + 247, 220, 36, 5, 247, 69, 36, 5, 196, 157, 36, 5, 194, 223, 36, 5, 196, + 39, 36, 5, 196, 156, 36, 5, 196, 118, 36, 5, 196, 123, 36, 5, 195, 252, + 36, 5, 194, 212, 36, 5, 189, 36, 5, 198, 45, 36, 5, 199, 128, 36, 5, 200, + 174, 36, 5, 200, 56, 36, 5, 200, 79, 36, 5, 155, 36, 5, 197, 250, 36, 5, + 247, 19, 36, 5, 238, 162, 36, 5, 242, 149, 36, 5, 247, 18, 36, 5, 246, + 150, 36, 5, 246, 158, 36, 5, 242, 63, 36, 5, 238, 118, 36, 5, 193, 209, + 36, 5, 193, 177, 36, 5, 193, 196, 36, 5, 193, 208, 36, 5, 193, 202, 36, + 5, 193, 203, 36, 5, 193, 185, 36, 5, 193, 184, 36, 5, 193, 170, 36, 5, + 193, 166, 36, 5, 193, 169, 36, 5, 193, 167, 36, 5, 193, 168, 36, 5, 181, + 36, 5, 213, 22, 36, 5, 214, 60, 36, 5, 215, 84, 36, 5, 214, 203, 36, 5, + 214, 214, 36, 5, 213, 142, 36, 5, 212, 210, 36, 5, 212, 201, 36, 5, 212, + 158, 36, 5, 212, 181, 36, 5, 212, 200, 36, 5, 212, 189, 36, 5, 212, 190, + 36, 5, 212, 165, 36, 5, 212, 148, 36, 5, 231, 6, 64, 36, 5, 231, 6, 68, + 36, 5, 231, 6, 70, 36, 5, 231, 6, 252, 33, 36, 5, 231, 6, 234, 171, 36, + 5, 231, 6, 71, 36, 5, 231, 6, 74, 36, 5, 231, 6, 194, 169, 36, 5, 160, + 36, 5, 221, 33, 36, 5, 221, 204, 36, 5, 222, 159, 36, 5, 222, 48, 36, 5, + 222, 57, 36, 5, 221, 113, 36, 5, 221, 108, 36, 5, 220, 238, 36, 5, 220, + 231, 36, 5, 220, 237, 36, 5, 220, 232, 36, 5, 220, 233, 36, 5, 220, 224, + 36, 5, 220, 218, 36, 5, 220, 220, 36, 5, 220, 223, 36, 5, 220, 221, 36, + 5, 220, 222, 36, 5, 220, 219, 36, 5, 220, 217, 36, 5, 220, 213, 36, 5, + 220, 216, 36, 5, 220, 214, 36, 5, 220, 215, 36, 5, 194, 169, 36, 5, 193, + 244, 36, 5, 194, 72, 36, 5, 194, 163, 36, 5, 194, 100, 36, 5, 194, 111, + 36, 5, 194, 36, 36, 5, 194, 28, 36, 5, 210, 85, 64, 36, 5, 210, 85, 68, + 36, 5, 210, 85, 70, 36, 5, 210, 85, 252, 33, 36, 5, 210, 85, 234, 171, + 36, 5, 210, 85, 71, 36, 5, 210, 85, 74, 36, 5, 192, 112, 36, 5, 191, 252, + 36, 5, 192, 30, 36, 5, 192, 110, 36, 5, 192, 82, 36, 5, 192, 85, 36, 5, + 192, 8, 36, 5, 191, 239, 36, 5, 192, 71, 36, 5, 192, 48, 36, 5, 192, 57, + 36, 5, 192, 70, 36, 5, 192, 61, 36, 5, 192, 62, 36, 5, 192, 54, 36, 5, + 192, 39, 36, 5, 168, 36, 5, 192, 214, 36, 5, 193, 22, 36, 5, 193, 129, + 36, 5, 193, 66, 36, 5, 193, 69, 36, 5, 193, 1, 36, 5, 192, 241, 36, 5, + 238, 0, 36, 5, 235, 62, 36, 5, 237, 16, 36, 5, 237, 255, 36, 5, 237, 101, + 36, 5, 237, 116, 36, 5, 236, 146, 36, 5, 235, 28, 36, 5, 237, 161, 36, 5, + 237, 126, 36, 5, 237, 138, 36, 5, 237, 160, 36, 5, 237, 148, 36, 5, 237, + 149, 36, 5, 237, 131, 36, 5, 237, 117, 36, 5, 223, 62, 36, 5, 222, 214, + 36, 5, 223, 20, 36, 5, 223, 61, 36, 5, 223, 39, 36, 5, 223, 41, 36, 5, + 222, 233, 36, 5, 222, 192, 36, 5, 231, 233, 36, 5, 230, 186, 36, 5, 231, + 46, 36, 5, 231, 230, 36, 5, 231, 150, 36, 5, 231, 158, 36, 5, 230, 254, + 36, 5, 230, 253, 36, 5, 230, 143, 36, 5, 230, 139, 36, 5, 230, 142, 36, + 5, 230, 140, 36, 5, 230, 141, 36, 5, 231, 120, 36, 5, 231, 100, 36, 5, + 231, 110, 36, 5, 231, 119, 36, 5, 231, 114, 36, 5, 231, 115, 36, 5, 231, + 104, 36, 5, 231, 89, 36, 5, 199, 240, 36, 5, 199, 148, 36, 5, 199, 202, + 36, 5, 199, 239, 36, 5, 199, 222, 36, 5, 199, 224, 36, 5, 199, 176, 36, + 5, 199, 139, 36, 5, 246, 117, 36, 5, 242, 168, 36, 5, 242, 215, 36, 5, + 246, 116, 36, 5, 242, 241, 36, 5, 242, 245, 36, 5, 242, 188, 36, 5, 242, + 157, 36, 5, 210, 94, 36, 5, 210, 57, 36, 5, 210, 77, 36, 5, 210, 93, 36, + 5, 210, 79, 36, 5, 210, 80, 36, 5, 210, 65, 36, 5, 210, 53, 36, 5, 198, + 118, 36, 5, 198, 91, 36, 5, 198, 97, 36, 5, 198, 117, 36, 5, 198, 111, + 36, 5, 198, 112, 36, 5, 198, 95, 36, 5, 198, 89, 36, 5, 197, 191, 36, 5, + 197, 183, 36, 5, 197, 187, 36, 5, 197, 190, 36, 5, 197, 188, 36, 5, 197, + 189, 36, 5, 197, 185, 36, 5, 197, 184, 36, 5, 233, 97, 36, 5, 232, 77, + 36, 5, 233, 11, 36, 5, 233, 96, 36, 5, 233, 40, 36, 5, 233, 47, 36, 5, + 232, 164, 36, 5, 232, 55, 36, 5, 166, 36, 5, 209, 51, 36, 5, 210, 51, 36, + 5, 211, 77, 36, 5, 210, 168, 36, 5, 210, 181, 36, 5, 209, 198, 36, 5, + 209, 9, 36, 5, 206, 166, 36, 5, 215, 157, 36, 5, 232, 49, 36, 38, 231, + 146, 26, 18, 220, 2, 77, 36, 38, 18, 220, 2, 77, 36, 38, 231, 146, 77, + 36, 205, 209, 77, 36, 194, 10, 36, 232, 71, 201, 238, 36, 242, 38, 36, + 204, 180, 36, 242, 47, 36, 209, 112, 242, 47, 36, 208, 159, 77, 36, 210, + 244, 204, 165, 36, 17, 101, 36, 17, 104, 36, 17, 133, 36, 17, 134, 36, + 17, 151, 36, 17, 170, 36, 17, 179, 36, 17, 174, 36, 17, 182, 36, 31, 200, + 30, 36, 31, 197, 239, 36, 31, 199, 184, 36, 31, 232, 126, 36, 31, 233, 3, + 36, 31, 203, 25, 36, 31, 204, 140, 36, 31, 234, 137, 36, 31, 214, 11, 36, + 31, 228, 162, 36, 31, 200, 31, 180, 36, 5, 205, 214, 215, 168, 36, 5, + 215, 164, 36, 5, 215, 165, 36, 5, 215, 166, 36, 5, 205, 214, 247, 69, 36, + 5, 247, 66, 36, 5, 247, 67, 36, 5, 247, 68, 36, 5, 205, 214, 232, 55, 36, + 5, 232, 51, 36, 5, 232, 52, 36, 5, 232, 53, 36, 5, 205, 214, 209, 9, 36, + 5, 209, 5, 36, 5, 209, 6, 36, 5, 209, 7, 36, 199, 19, 122, 193, 4, 36, + 199, 19, 122, 237, 61, 36, 199, 19, 122, 207, 87, 36, 199, 19, 122, 203, + 195, 207, 87, 36, 199, 19, 122, 236, 246, 36, 199, 19, 122, 222, 29, 36, + 199, 19, 122, 242, 196, 36, 199, 19, 122, 229, 167, 36, 199, 19, 122, + 237, 60, 36, 199, 19, 122, 220, 254, 99, 1, 64, 99, 1, 71, 99, 1, 70, 99, + 1, 74, 99, 1, 68, 99, 1, 196, 236, 99, 1, 231, 233, 99, 1, 160, 99, 1, + 231, 158, 99, 1, 231, 46, 99, 1, 230, 254, 99, 1, 230, 186, 99, 1, 230, + 146, 99, 1, 144, 99, 1, 229, 255, 99, 1, 229, 178, 99, 1, 229, 43, 99, 1, + 228, 181, 99, 1, 228, 148, 99, 1, 177, 99, 1, 220, 42, 99, 1, 219, 209, + 99, 1, 219, 107, 99, 1, 219, 36, 99, 1, 219, 4, 99, 1, 172, 99, 1, 217, + 48, 99, 1, 216, 175, 99, 1, 216, 91, 99, 1, 215, 241, 99, 1, 181, 99, 1, + 229, 67, 99, 1, 215, 71, 99, 1, 214, 214, 99, 1, 214, 60, 99, 1, 213, + 142, 99, 1, 213, 22, 99, 1, 212, 212, 99, 1, 208, 176, 99, 1, 208, 162, + 99, 1, 208, 155, 99, 1, 208, 145, 99, 1, 208, 134, 99, 1, 208, 132, 99, + 1, 188, 99, 1, 206, 158, 99, 1, 205, 223, 99, 1, 203, 125, 99, 1, 202, + 212, 99, 1, 201, 184, 99, 1, 201, 84, 99, 1, 238, 0, 99, 1, 189, 99, 1, + 237, 116, 99, 1, 200, 79, 99, 1, 237, 16, 99, 1, 199, 128, 99, 1, 236, + 146, 99, 1, 235, 62, 99, 1, 235, 31, 99, 1, 236, 158, 99, 1, 199, 53, 99, + 1, 199, 52, 99, 1, 199, 41, 99, 1, 199, 40, 99, 1, 199, 39, 99, 1, 199, + 38, 99, 1, 198, 118, 99, 1, 198, 112, 99, 1, 198, 97, 99, 1, 198, 95, 99, + 1, 198, 91, 99, 1, 198, 90, 99, 1, 194, 169, 99, 1, 194, 111, 99, 1, 194, + 72, 99, 1, 194, 36, 99, 1, 193, 244, 99, 1, 193, 231, 99, 1, 168, 99, 1, + 193, 69, 99, 1, 193, 22, 99, 1, 193, 1, 99, 1, 192, 214, 99, 1, 192, 173, + 99, 1, 215, 175, 99, 2, 1, 193, 69, 99, 2, 1, 193, 22, 99, 2, 1, 193, 1, + 99, 2, 1, 192, 214, 99, 2, 1, 192, 173, 99, 2, 1, 215, 175, 21, 22, 228, + 111, 21, 22, 71, 21, 22, 251, 253, 21, 22, 70, 21, 22, 223, 224, 21, 22, + 74, 21, 22, 211, 194, 21, 22, 193, 147, 211, 194, 21, 22, 96, 234, 171, + 21, 22, 96, 70, 21, 22, 64, 21, 22, 252, 33, 21, 22, 194, 111, 21, 22, + 194, 89, 194, 111, 21, 22, 194, 72, 21, 22, 194, 89, 194, 72, 21, 22, + 194, 56, 21, 22, 194, 89, 194, 56, 21, 22, 194, 36, 21, 22, 194, 89, 194, + 36, 21, 22, 194, 17, 21, 22, 194, 89, 194, 17, 21, 22, 215, 45, 194, 17, + 21, 22, 194, 169, 21, 22, 194, 89, 194, 169, 21, 22, 194, 163, 21, 22, + 194, 89, 194, 163, 21, 22, 215, 45, 194, 163, 21, 22, 251, 63, 21, 22, + 193, 147, 194, 202, 21, 22, 231, 6, 201, 238, 21, 22, 52, 251, 129, 21, + 22, 52, 230, 210, 21, 22, 52, 247, 188, 138, 207, 81, 21, 22, 52, 198, + 249, 138, 207, 81, 21, 22, 52, 51, 138, 207, 81, 21, 22, 52, 207, 81, 21, + 22, 52, 55, 251, 129, 21, 22, 52, 55, 203, 195, 84, 201, 195, 21, 22, 52, + 85, 236, 114, 21, 22, 52, 203, 195, 229, 5, 111, 21, 22, 52, 209, 206, + 21, 22, 52, 142, 200, 159, 21, 22, 234, 88, 21, 22, 223, 190, 21, 22, + 211, 211, 21, 22, 250, 224, 21, 22, 210, 181, 21, 22, 211, 75, 21, 22, + 210, 51, 21, 22, 210, 12, 21, 22, 209, 198, 21, 22, 209, 172, 21, 22, + 193, 147, 209, 172, 21, 22, 96, 229, 225, 21, 22, 96, 229, 178, 21, 22, + 166, 21, 22, 211, 77, 21, 22, 209, 7, 21, 22, 194, 89, 209, 7, 21, 22, + 209, 5, 21, 22, 194, 89, 209, 5, 21, 22, 209, 4, 21, 22, 194, 89, 209, 4, + 21, 22, 209, 2, 21, 22, 194, 89, 209, 2, 21, 22, 209, 1, 21, 22, 194, 89, + 209, 1, 21, 22, 209, 9, 21, 22, 194, 89, 209, 9, 21, 22, 209, 8, 21, 22, + 194, 89, 209, 8, 21, 22, 193, 147, 209, 8, 21, 22, 211, 93, 21, 22, 194, + 89, 211, 93, 21, 22, 96, 230, 124, 21, 22, 200, 79, 21, 22, 200, 172, 21, + 22, 199, 128, 21, 22, 199, 105, 21, 22, 155, 21, 22, 198, 254, 21, 22, + 193, 147, 198, 254, 21, 22, 96, 237, 101, 21, 22, 96, 237, 16, 21, 22, + 189, 21, 22, 200, 174, 21, 22, 197, 248, 21, 22, 194, 89, 197, 248, 21, + 22, 197, 226, 21, 22, 194, 89, 197, 226, 21, 22, 197, 225, 21, 22, 194, + 89, 197, 225, 21, 22, 104, 21, 22, 194, 89, 104, 21, 22, 197, 216, 21, + 22, 194, 89, 197, 216, 21, 22, 197, 250, 21, 22, 194, 89, 197, 250, 21, + 22, 197, 249, 21, 22, 194, 89, 197, 249, 21, 22, 215, 45, 197, 249, 21, + 22, 200, 228, 21, 22, 198, 78, 21, 22, 198, 62, 21, 22, 198, 60, 21, 22, + 198, 83, 21, 22, 222, 57, 21, 22, 222, 153, 21, 22, 221, 204, 21, 22, + 221, 183, 21, 22, 221, 113, 21, 22, 221, 88, 21, 22, 193, 147, 221, 88, + 21, 22, 160, 21, 22, 222, 159, 21, 22, 220, 233, 21, 22, 194, 89, 220, + 233, 21, 22, 220, 231, 21, 22, 194, 89, 220, 231, 21, 22, 220, 230, 21, + 22, 194, 89, 220, 230, 21, 22, 220, 228, 21, 22, 194, 89, 220, 228, 21, + 22, 220, 227, 21, 22, 194, 89, 220, 227, 21, 22, 220, 238, 21, 22, 194, + 89, 220, 238, 21, 22, 220, 237, 21, 22, 194, 89, 220, 237, 21, 22, 215, + 45, 220, 237, 21, 22, 222, 184, 21, 22, 220, 239, 21, 22, 202, 170, 222, + 41, 21, 22, 202, 170, 221, 184, 21, 22, 202, 170, 221, 103, 21, 22, 202, + 170, 222, 137, 21, 22, 246, 158, 21, 22, 247, 17, 21, 22, 242, 149, 21, + 22, 242, 139, 21, 22, 242, 63, 21, 22, 238, 239, 21, 22, 193, 147, 238, + 239, 21, 22, 247, 19, 21, 22, 247, 18, 21, 22, 238, 116, 21, 22, 194, 89, + 238, 116, 21, 22, 238, 114, 21, 22, 194, 89, 238, 114, 21, 22, 238, 113, + 21, 22, 194, 89, 238, 113, 21, 22, 238, 112, 21, 22, 194, 89, 238, 112, + 21, 22, 238, 111, 21, 22, 194, 89, 238, 111, 21, 22, 238, 118, 21, 22, + 194, 89, 238, 118, 21, 22, 238, 117, 21, 22, 194, 89, 238, 117, 21, 22, + 215, 45, 238, 117, 21, 22, 247, 52, 21, 22, 205, 255, 199, 242, 21, 22, + 217, 48, 21, 22, 217, 218, 21, 22, 216, 175, 21, 22, 216, 137, 21, 22, + 216, 91, 21, 22, 216, 35, 21, 22, 193, 147, 216, 35, 21, 22, 172, 21, 22, + 217, 219, 21, 22, 215, 166, 21, 22, 194, 89, 215, 166, 21, 22, 215, 164, + 21, 22, 194, 89, 215, 164, 21, 22, 215, 163, 21, 22, 194, 89, 215, 163, + 21, 22, 215, 162, 21, 22, 194, 89, 215, 162, 21, 22, 215, 161, 21, 22, + 194, 89, 215, 161, 21, 22, 215, 168, 21, 22, 194, 89, 215, 168, 21, 22, + 215, 167, 21, 22, 194, 89, 215, 167, 21, 22, 215, 45, 215, 167, 21, 22, + 218, 236, 21, 22, 194, 89, 218, 236, 21, 22, 216, 179, 21, 22, 250, 24, + 218, 236, 21, 22, 205, 255, 218, 236, 21, 22, 214, 214, 21, 22, 215, 83, + 21, 22, 214, 60, 21, 22, 214, 27, 21, 22, 213, 142, 21, 22, 213, 125, 21, + 22, 193, 147, 213, 125, 21, 22, 181, 21, 22, 215, 84, 21, 22, 212, 208, + 21, 22, 194, 89, 212, 208, 21, 22, 212, 210, 21, 22, 194, 89, 212, 210, + 21, 22, 212, 209, 21, 22, 194, 89, 212, 209, 21, 22, 215, 45, 212, 209, + 21, 22, 215, 151, 21, 22, 96, 214, 167, 21, 22, 214, 66, 21, 22, 220, 42, + 21, 22, 220, 183, 21, 22, 219, 209, 21, 22, 219, 191, 21, 22, 219, 107, + 21, 22, 219, 73, 21, 22, 193, 147, 219, 73, 21, 22, 177, 21, 22, 220, + 184, 21, 22, 219, 1, 21, 22, 194, 89, 219, 1, 21, 22, 219, 0, 21, 22, + 194, 89, 219, 0, 21, 22, 218, 255, 21, 22, 194, 89, 218, 255, 21, 22, + 218, 254, 21, 22, 194, 89, 218, 254, 21, 22, 218, 253, 21, 22, 194, 89, + 218, 253, 21, 22, 219, 3, 21, 22, 194, 89, 219, 3, 21, 22, 219, 2, 21, + 22, 194, 89, 219, 2, 21, 22, 165, 21, 22, 194, 89, 165, 21, 22, 217, 35, + 165, 21, 22, 205, 223, 21, 22, 206, 89, 21, 22, 203, 125, 21, 22, 203, + 97, 21, 22, 202, 212, 21, 22, 202, 183, 21, 22, 193, 147, 202, 183, 21, + 22, 188, 21, 22, 206, 91, 21, 22, 201, 74, 21, 22, 194, 89, 201, 74, 21, + 22, 201, 68, 21, 22, 194, 89, 201, 68, 21, 22, 201, 67, 21, 22, 194, 89, + 201, 67, 21, 22, 201, 62, 21, 22, 194, 89, 201, 62, 21, 22, 201, 61, 21, + 22, 194, 89, 201, 61, 21, 22, 201, 79, 21, 22, 194, 89, 201, 79, 21, 22, + 201, 78, 21, 22, 194, 89, 201, 78, 21, 22, 215, 45, 201, 78, 21, 22, 206, + 158, 21, 22, 250, 24, 206, 158, 21, 22, 201, 80, 21, 22, 247, 245, 206, + 158, 21, 22, 216, 28, 203, 19, 21, 22, 215, 45, 203, 8, 21, 22, 215, 45, + 206, 156, 21, 22, 215, 45, 202, 108, 21, 22, 215, 45, 201, 187, 21, 22, + 215, 45, 203, 7, 21, 22, 215, 45, 205, 226, 21, 22, 204, 12, 21, 22, 203, + 236, 21, 22, 203, 231, 21, 22, 203, 211, 21, 22, 203, 203, 21, 22, 204, + 64, 21, 22, 204, 59, 21, 22, 203, 140, 21, 22, 194, 89, 203, 140, 21, 22, + 203, 139, 21, 22, 194, 89, 203, 139, 21, 22, 203, 138, 21, 22, 194, 89, + 203, 138, 21, 22, 203, 137, 21, 22, 194, 89, 203, 137, 21, 22, 203, 136, + 21, 22, 194, 89, 203, 136, 21, 22, 203, 143, 21, 22, 194, 89, 203, 143, + 21, 22, 203, 142, 21, 22, 194, 89, 203, 142, 21, 22, 204, 66, 21, 22, + 193, 69, 21, 22, 193, 127, 21, 22, 193, 22, 21, 22, 193, 12, 21, 22, 193, + 1, 21, 22, 192, 235, 21, 22, 193, 147, 192, 235, 21, 22, 168, 21, 22, + 193, 129, 21, 22, 192, 170, 21, 22, 194, 89, 192, 170, 21, 22, 192, 169, + 21, 22, 194, 89, 192, 169, 21, 22, 192, 168, 21, 22, 194, 89, 192, 168, + 21, 22, 192, 167, 21, 22, 194, 89, 192, 167, 21, 22, 192, 166, 21, 22, + 194, 89, 192, 166, 21, 22, 192, 172, 21, 22, 194, 89, 192, 172, 21, 22, + 192, 171, 21, 22, 194, 89, 192, 171, 21, 22, 215, 45, 192, 171, 21, 22, + 193, 148, 21, 22, 248, 39, 193, 148, 21, 22, 194, 89, 193, 148, 21, 22, + 205, 255, 193, 22, 21, 22, 208, 7, 21, 22, 208, 111, 208, 7, 21, 22, 194, + 89, 220, 42, 21, 22, 208, 67, 21, 22, 207, 151, 21, 22, 207, 88, 21, 22, + 207, 55, 21, 22, 207, 28, 21, 22, 194, 89, 219, 107, 21, 22, 167, 21, 22, + 208, 68, 21, 22, 194, 89, 177, 21, 22, 206, 175, 21, 22, 194, 89, 206, + 175, 21, 22, 150, 21, 22, 194, 89, 150, 21, 22, 217, 35, 150, 21, 22, + 233, 47, 21, 22, 233, 94, 21, 22, 233, 11, 21, 22, 232, 252, 21, 22, 232, + 164, 21, 22, 232, 152, 21, 22, 233, 97, 21, 22, 233, 96, 21, 22, 232, 54, + 21, 22, 194, 89, 232, 54, 21, 22, 233, 163, 21, 22, 199, 224, 21, 22, + 215, 149, 199, 224, 21, 22, 199, 202, 21, 22, 215, 149, 199, 202, 21, 22, + 199, 196, 21, 22, 215, 149, 199, 196, 21, 22, 199, 176, 21, 22, 199, 170, + 21, 22, 199, 240, 21, 22, 199, 239, 21, 22, 199, 138, 21, 22, 194, 89, + 199, 138, 21, 22, 199, 242, 21, 22, 198, 69, 21, 22, 198, 67, 21, 22, + 198, 66, 21, 22, 198, 71, 21, 22, 198, 72, 21, 22, 197, 209, 21, 22, 197, + 208, 21, 22, 197, 207, 21, 22, 197, 211, 21, 22, 212, 229, 229, 255, 21, + 22, 212, 229, 229, 178, 21, 22, 212, 229, 229, 150, 21, 22, 212, 229, + 229, 43, 21, 22, 212, 229, 229, 16, 21, 22, 212, 229, 144, 21, 22, 212, + 229, 230, 99, 21, 22, 212, 229, 230, 124, 21, 22, 212, 228, 230, 124, 21, + 22, 229, 133, 21, 22, 208, 235, 21, 22, 208, 201, 21, 22, 208, 195, 21, + 22, 208, 189, 21, 22, 208, 184, 21, 22, 208, 239, 21, 22, 208, 238, 21, + 22, 208, 247, 21, 22, 199, 49, 21, 22, 199, 47, 21, 22, 199, 46, 21, 22, + 199, 50, 21, 22, 194, 89, 208, 7, 21, 22, 194, 89, 207, 151, 21, 22, 194, + 89, 207, 55, 21, 22, 194, 89, 167, 21, 22, 214, 163, 21, 22, 214, 113, + 21, 22, 214, 109, 21, 22, 214, 90, 21, 22, 214, 85, 21, 22, 214, 165, 21, + 22, 214, 164, 21, 22, 214, 167, 21, 22, 213, 171, 21, 22, 205, 255, 204, + 12, 21, 22, 205, 255, 203, 236, 21, 22, 205, 255, 203, 211, 21, 22, 205, + 255, 204, 64, 21, 22, 194, 15, 199, 224, 21, 22, 194, 15, 199, 202, 21, + 22, 194, 15, 199, 176, 21, 22, 194, 15, 199, 240, 21, 22, 194, 15, 199, + 242, 21, 22, 219, 216, 21, 22, 219, 215, 21, 22, 219, 214, 21, 22, 219, + 213, 21, 22, 219, 222, 21, 22, 219, 221, 21, 22, 219, 223, 21, 22, 199, + 241, 199, 224, 21, 22, 199, 241, 199, 202, 21, 22, 199, 241, 199, 196, + 21, 22, 199, 241, 199, 176, 21, 22, 199, 241, 199, 170, 21, 22, 199, 241, + 199, 240, 21, 22, 199, 241, 199, 239, 21, 22, 199, 241, 199, 242, 21, 22, + 251, 47, 249, 226, 21, 22, 247, 245, 71, 21, 22, 247, 245, 70, 21, 22, + 247, 245, 74, 21, 22, 247, 245, 64, 21, 22, 247, 245, 194, 111, 21, 22, + 247, 245, 194, 72, 21, 22, 247, 245, 194, 36, 21, 22, 247, 245, 194, 169, + 21, 22, 247, 245, 214, 214, 21, 22, 247, 245, 214, 60, 21, 22, 247, 245, + 213, 142, 21, 22, 247, 245, 181, 21, 22, 247, 245, 222, 57, 21, 22, 247, + 245, 221, 204, 21, 22, 247, 245, 221, 113, 21, 22, 247, 245, 160, 21, 22, + 205, 255, 229, 255, 21, 22, 205, 255, 229, 178, 21, 22, 205, 255, 229, + 43, 21, 22, 205, 255, 144, 21, 22, 96, 231, 52, 21, 22, 96, 231, 56, 21, + 22, 96, 231, 70, 21, 22, 96, 231, 69, 21, 22, 96, 231, 58, 21, 22, 96, + 231, 84, 21, 22, 96, 206, 218, 21, 22, 96, 207, 55, 21, 22, 96, 208, 7, + 21, 22, 96, 207, 234, 21, 22, 96, 207, 151, 21, 22, 96, 167, 21, 22, 96, + 193, 244, 21, 22, 96, 194, 36, 21, 22, 96, 194, 111, 21, 22, 96, 194, + 100, 21, 22, 96, 194, 72, 21, 22, 96, 194, 169, 21, 22, 96, 228, 140, 21, + 22, 96, 228, 141, 21, 22, 96, 228, 144, 21, 22, 96, 228, 143, 21, 22, 96, + 228, 142, 21, 22, 96, 228, 147, 21, 22, 96, 199, 148, 21, 22, 96, 199, + 176, 21, 22, 96, 199, 224, 21, 22, 96, 199, 222, 21, 22, 96, 199, 202, + 21, 22, 96, 199, 240, 21, 22, 96, 198, 50, 21, 22, 96, 198, 60, 21, 22, + 96, 198, 78, 21, 22, 96, 198, 77, 21, 22, 96, 198, 62, 21, 22, 96, 198, + 83, 21, 22, 96, 209, 51, 21, 22, 96, 209, 198, 21, 22, 96, 210, 181, 21, + 22, 96, 210, 168, 21, 22, 96, 210, 51, 21, 22, 96, 166, 21, 22, 96, 211, + 93, 21, 22, 96, 230, 186, 21, 22, 96, 230, 254, 21, 22, 96, 231, 158, 21, + 22, 96, 231, 150, 21, 22, 96, 231, 46, 21, 22, 96, 231, 233, 21, 22, 96, + 221, 213, 21, 22, 96, 221, 220, 21, 22, 96, 221, 234, 21, 22, 96, 221, + 233, 21, 22, 96, 221, 227, 21, 22, 96, 221, 250, 21, 22, 96, 221, 134, + 21, 22, 96, 221, 135, 21, 22, 96, 221, 138, 21, 22, 96, 221, 137, 21, 22, + 96, 221, 136, 21, 22, 96, 221, 139, 21, 22, 96, 221, 140, 21, 22, 96, + 213, 22, 21, 22, 96, 213, 142, 21, 22, 96, 214, 214, 21, 22, 96, 214, + 203, 21, 22, 96, 214, 60, 21, 22, 96, 181, 21, 22, 96, 215, 241, 21, 22, + 96, 216, 91, 21, 22, 96, 217, 48, 21, 22, 96, 217, 29, 21, 22, 96, 216, + 175, 21, 22, 96, 172, 21, 22, 96, 192, 214, 21, 22, 96, 193, 1, 21, 22, + 96, 193, 69, 21, 22, 96, 193, 66, 21, 22, 96, 193, 22, 21, 22, 96, 168, + 21, 22, 96, 222, 214, 21, 22, 205, 255, 222, 214, 21, 22, 96, 222, 233, + 21, 22, 96, 223, 41, 21, 22, 96, 223, 39, 21, 22, 96, 223, 20, 21, 22, + 205, 255, 223, 20, 21, 22, 96, 223, 62, 21, 22, 96, 222, 247, 21, 22, 96, + 222, 251, 21, 22, 96, 223, 5, 21, 22, 96, 223, 4, 21, 22, 96, 223, 3, 21, + 22, 96, 223, 6, 21, 22, 96, 219, 36, 21, 22, 96, 219, 107, 21, 22, 96, + 220, 42, 21, 22, 96, 220, 32, 21, 22, 96, 219, 209, 21, 22, 96, 177, 21, + 22, 96, 236, 151, 21, 22, 96, 236, 152, 21, 22, 96, 236, 157, 21, 22, 96, + 236, 156, 21, 22, 96, 236, 153, 21, 22, 96, 236, 158, 21, 22, 96, 219, + 212, 21, 22, 96, 219, 214, 21, 22, 96, 219, 218, 21, 22, 96, 219, 217, + 21, 22, 96, 219, 216, 21, 22, 96, 219, 222, 21, 22, 96, 199, 44, 21, 22, + 96, 199, 46, 21, 22, 96, 199, 49, 21, 22, 96, 199, 48, 21, 22, 96, 199, + 47, 21, 22, 96, 199, 50, 21, 22, 96, 199, 39, 21, 22, 96, 199, 40, 21, + 22, 96, 199, 52, 21, 22, 96, 199, 51, 21, 22, 96, 199, 41, 21, 22, 96, + 199, 53, 21, 22, 96, 191, 252, 21, 22, 96, 192, 8, 21, 22, 96, 192, 85, + 21, 22, 96, 192, 82, 21, 22, 96, 192, 30, 21, 22, 96, 192, 112, 21, 22, + 96, 192, 155, 21, 22, 96, 88, 192, 155, 21, 22, 96, 235, 4, 21, 22, 96, + 235, 5, 21, 22, 96, 235, 14, 21, 22, 96, 235, 13, 21, 22, 96, 235, 8, 21, + 22, 96, 235, 17, 21, 22, 96, 201, 184, 21, 22, 96, 202, 212, 21, 22, 96, + 205, 223, 21, 22, 96, 205, 205, 21, 22, 96, 203, 125, 21, 22, 96, 188, + 21, 22, 96, 203, 164, 21, 22, 96, 203, 211, 21, 22, 96, 204, 12, 21, 22, + 96, 204, 10, 21, 22, 96, 203, 236, 21, 22, 96, 204, 64, 21, 22, 96, 204, + 66, 21, 22, 96, 198, 91, 21, 22, 96, 198, 95, 21, 22, 96, 198, 112, 21, + 22, 96, 198, 111, 21, 22, 96, 198, 97, 21, 22, 96, 198, 118, 21, 22, 96, + 242, 168, 21, 22, 96, 242, 188, 21, 22, 96, 242, 245, 21, 22, 96, 242, + 241, 21, 22, 96, 242, 215, 21, 22, 96, 246, 117, 21, 22, 96, 198, 53, 21, + 22, 96, 198, 54, 21, 22, 96, 198, 57, 21, 22, 96, 198, 56, 21, 22, 96, + 198, 55, 21, 22, 96, 198, 58, 21, 22, 242, 216, 57, 21, 22, 232, 71, 201, + 238, 21, 22, 208, 231, 21, 22, 214, 161, 21, 22, 213, 168, 21, 22, 213, + 167, 21, 22, 213, 166, 21, 22, 213, 165, 21, 22, 213, 170, 21, 22, 213, + 169, 21, 22, 194, 15, 199, 136, 21, 22, 194, 15, 199, 135, 21, 22, 194, + 15, 199, 134, 21, 22, 194, 15, 199, 133, 21, 22, 194, 15, 199, 132, 21, + 22, 194, 15, 199, 139, 21, 22, 194, 15, 199, 138, 21, 22, 194, 15, 52, + 199, 242, 21, 22, 247, 245, 194, 202, 211, 245, 202, 161, 77, 211, 245, + 1, 248, 90, 211, 245, 1, 219, 22, 211, 245, 1, 233, 44, 211, 245, 1, 206, + 73, 211, 245, 1, 214, 8, 211, 245, 1, 197, 116, 211, 245, 1, 237, 229, + 211, 245, 1, 199, 77, 211, 245, 1, 242, 50, 211, 245, 1, 246, 145, 211, + 245, 1, 215, 224, 211, 245, 1, 230, 233, 211, 245, 1, 214, 151, 211, 245, + 1, 201, 231, 211, 245, 1, 206, 205, 211, 245, 1, 251, 59, 211, 245, 1, + 211, 198, 211, 245, 1, 197, 27, 211, 245, 1, 234, 197, 211, 245, 1, 223, + 115, 211, 245, 1, 234, 198, 211, 245, 1, 211, 163, 211, 245, 1, 197, 93, + 211, 245, 1, 223, 230, 211, 245, 1, 234, 195, 211, 245, 1, 210, 158, 211, + 245, 233, 43, 77, 211, 245, 207, 168, 233, 43, 77, 206, 194, 1, 233, 33, + 233, 24, 233, 48, 233, 163, 206, 194, 1, 196, 236, 206, 194, 1, 197, 12, + 197, 28, 68, 206, 194, 1, 192, 217, 206, 194, 1, 193, 148, 206, 194, 1, + 194, 202, 206, 194, 1, 199, 141, 199, 140, 199, 168, 206, 194, 1, 233, + 235, 206, 194, 1, 250, 187, 64, 206, 194, 1, 211, 145, 74, 206, 194, 1, + 251, 147, 64, 206, 194, 1, 251, 92, 206, 194, 1, 219, 80, 74, 206, 194, + 1, 203, 188, 74, 206, 194, 1, 74, 206, 194, 1, 212, 0, 206, 194, 1, 211, + 211, 206, 194, 1, 208, 46, 208, 59, 207, 219, 150, 206, 194, 1, 222, 73, + 206, 194, 1, 246, 141, 206, 194, 1, 222, 74, 222, 184, 206, 194, 1, 232, + 44, 206, 194, 1, 234, 73, 206, 194, 1, 231, 153, 230, 130, 232, 44, 206, + 194, 1, 231, 193, 206, 194, 1, 193, 236, 193, 227, 194, 202, 206, 194, 1, + 230, 90, 230, 124, 206, 194, 1, 230, 94, 230, 124, 206, 194, 1, 219, 82, + 230, 124, 206, 194, 1, 203, 191, 230, 124, 206, 194, 1, 215, 40, 212, + 191, 215, 41, 215, 151, 206, 194, 1, 203, 189, 215, 151, 206, 194, 1, + 235, 108, 206, 194, 1, 223, 93, 223, 97, 223, 84, 70, 206, 194, 1, 71, + 206, 194, 1, 223, 31, 223, 65, 206, 194, 1, 231, 134, 206, 194, 1, 219, + 83, 251, 108, 206, 194, 1, 203, 193, 64, 206, 194, 1, 223, 76, 234, 46, + 206, 194, 1, 210, 113, 210, 138, 211, 93, 206, 194, 1, 251, 19, 234, 44, + 206, 194, 1, 202, 167, 206, 158, 206, 194, 1, 203, 101, 219, 79, 206, + 158, 206, 194, 1, 203, 187, 206, 158, 206, 194, 1, 247, 52, 206, 194, 1, + 192, 155, 206, 194, 1, 199, 58, 199, 70, 197, 193, 200, 228, 206, 194, 1, + 203, 186, 200, 228, 206, 194, 1, 238, 95, 206, 194, 1, 248, 68, 248, 71, + 247, 251, 249, 226, 206, 194, 1, 203, 192, 249, 226, 206, 194, 1, 235, + 107, 206, 194, 1, 211, 177, 206, 194, 1, 234, 151, 234, 158, 71, 206, + 194, 1, 217, 149, 217, 161, 218, 236, 206, 194, 1, 219, 81, 218, 236, + 206, 194, 1, 203, 190, 218, 236, 206, 194, 1, 220, 57, 220, 160, 219, 90, + 165, 206, 194, 1, 235, 109, 206, 194, 1, 223, 163, 206, 194, 1, 223, 164, + 206, 194, 1, 237, 243, 237, 249, 238, 95, 206, 194, 1, 211, 138, 233, + 234, 74, 206, 194, 1, 234, 193, 206, 194, 1, 223, 113, 206, 194, 1, 238, + 115, 206, 194, 1, 247, 2, 206, 194, 1, 246, 157, 206, 194, 1, 202, 25, + 206, 194, 1, 219, 78, 206, 194, 1, 203, 185, 206, 194, 1, 228, 48, 206, + 194, 1, 208, 247, 206, 194, 1, 193, 223, 206, 194, 203, 74, 209, 37, 206, + 194, 215, 216, 209, 37, 206, 194, 238, 184, 209, 37, 206, 194, 250, 94, + 109, 206, 194, 197, 252, 109, 206, 194, 248, 88, 109, 206, 194, 1, 222, + 184, 206, 194, 1, 204, 66, 206, 194, 1, 211, 194, 206, 194, 1, 232, 101, + 246, 196, 211, 144, 206, 194, 1, 232, 101, 246, 196, 223, 96, 206, 194, + 1, 232, 101, 246, 196, 234, 157, 206, 194, 1, 232, 101, 246, 196, 251, + 146, 206, 194, 1, 232, 101, 246, 196, 251, 92, 200, 154, 1, 64, 200, 154, + 1, 70, 200, 154, 1, 68, 200, 154, 1, 160, 200, 154, 1, 231, 233, 200, + 154, 1, 214, 165, 200, 154, 1, 189, 200, 154, 1, 238, 0, 200, 154, 1, + 181, 200, 154, 1, 166, 200, 154, 1, 249, 3, 200, 154, 1, 172, 200, 154, + 1, 168, 200, 154, 1, 177, 200, 154, 1, 194, 169, 200, 154, 1, 188, 200, + 154, 1, 144, 200, 154, 18, 3, 70, 200, 154, 18, 3, 68, 200, 154, 3, 196, + 11, 230, 32, 1, 64, 230, 32, 1, 70, 230, 32, 1, 68, 230, 32, 1, 160, 230, + 32, 1, 231, 233, 230, 32, 1, 214, 165, 230, 32, 1, 189, 230, 32, 1, 238, + 0, 230, 32, 1, 181, 230, 32, 1, 166, 230, 32, 1, 249, 3, 230, 32, 1, 172, + 230, 32, 1, 168, 230, 32, 1, 167, 230, 32, 1, 177, 230, 32, 1, 194, 169, + 230, 32, 1, 188, 230, 32, 1, 144, 230, 32, 18, 3, 70, 230, 32, 18, 3, 68, + 230, 32, 3, 211, 28, 210, 70, 203, 74, 209, 37, 210, 70, 55, 209, 37, + 247, 114, 1, 64, 247, 114, 1, 70, 247, 114, 1, 68, 247, 114, 1, 160, 247, + 114, 1, 231, 233, 247, 114, 1, 214, 165, 247, 114, 1, 189, 247, 114, 1, + 238, 0, 247, 114, 1, 181, 247, 114, 1, 166, 247, 114, 1, 249, 3, 247, + 114, 1, 172, 247, 114, 1, 168, 247, 114, 1, 167, 247, 114, 1, 177, 247, + 114, 1, 194, 169, 247, 114, 1, 188, 247, 114, 1, 144, 247, 114, 18, 3, + 70, 247, 114, 18, 3, 68, 200, 153, 1, 64, 200, 153, 1, 70, 200, 153, 1, + 68, 200, 153, 1, 160, 200, 153, 1, 231, 233, 200, 153, 1, 214, 165, 200, + 153, 1, 189, 200, 153, 1, 238, 0, 200, 153, 1, 181, 200, 153, 1, 166, + 200, 153, 1, 249, 3, 200, 153, 1, 172, 200, 153, 1, 168, 200, 153, 1, + 177, 200, 153, 1, 194, 169, 200, 153, 1, 188, 200, 153, 18, 3, 70, 200, + 153, 18, 3, 68, 93, 1, 160, 93, 1, 221, 250, 93, 1, 221, 113, 93, 1, 221, + 220, 93, 1, 214, 90, 93, 1, 247, 19, 93, 1, 246, 117, 93, 1, 242, 63, 93, + 1, 242, 188, 93, 1, 212, 165, 93, 1, 238, 0, 93, 1, 198, 71, 93, 1, 236, + 146, 93, 1, 198, 66, 93, 1, 213, 148, 93, 1, 189, 93, 1, 199, 240, 93, 1, + 155, 93, 1, 199, 176, 93, 1, 213, 142, 93, 1, 249, 3, 93, 1, 210, 94, 93, + 1, 209, 198, 93, 1, 210, 65, 93, 1, 216, 91, 93, 1, 193, 1, 93, 1, 207, + 55, 93, 1, 219, 107, 93, 1, 195, 252, 93, 1, 204, 64, 93, 1, 202, 51, 93, + 1, 188, 93, 1, 144, 93, 1, 177, 93, 1, 208, 239, 93, 223, 177, 18, 208, + 225, 93, 223, 177, 18, 208, 238, 93, 223, 177, 18, 208, 201, 93, 223, + 177, 18, 208, 195, 93, 223, 177, 18, 208, 177, 93, 223, 177, 18, 208, + 146, 93, 223, 177, 18, 208, 134, 93, 223, 177, 18, 208, 133, 93, 223, + 177, 18, 206, 167, 93, 223, 177, 18, 206, 160, 93, 223, 177, 18, 218, + 251, 93, 223, 177, 18, 218, 239, 93, 223, 177, 18, 208, 219, 93, 223, + 177, 18, 208, 231, 93, 223, 177, 18, 208, 185, 197, 206, 101, 93, 223, + 177, 18, 208, 185, 197, 206, 104, 93, 223, 177, 18, 208, 221, 93, 18, + 223, 161, 250, 135, 93, 18, 223, 161, 252, 33, 93, 18, 3, 252, 33, 93, + 18, 3, 70, 93, 18, 3, 223, 224, 93, 18, 3, 193, 148, 93, 18, 3, 192, 165, + 93, 18, 3, 68, 93, 18, 3, 196, 251, 93, 18, 3, 197, 119, 93, 18, 3, 212, + 0, 93, 18, 3, 168, 93, 18, 3, 223, 251, 93, 18, 3, 71, 93, 18, 3, 251, + 108, 93, 18, 3, 251, 63, 93, 18, 3, 211, 194, 93, 18, 3, 250, 8, 93, 3, + 214, 25, 93, 3, 208, 0, 93, 3, 192, 176, 93, 3, 215, 179, 93, 3, 198, + 173, 93, 3, 248, 196, 93, 3, 207, 44, 93, 3, 199, 28, 93, 3, 222, 128, + 93, 3, 251, 65, 93, 3, 206, 41, 206, 33, 93, 3, 196, 8, 93, 3, 242, 54, + 93, 3, 248, 166, 93, 3, 221, 241, 93, 3, 248, 191, 93, 3, 246, 246, 210, + 13, 220, 245, 93, 3, 220, 9, 198, 254, 93, 3, 248, 56, 93, 3, 210, 67, + 215, 234, 93, 3, 221, 86, 93, 238, 137, 16, 207, 135, 93, 3, 249, 245, + 93, 3, 250, 11, 93, 17, 192, 76, 93, 17, 101, 93, 17, 104, 93, 17, 133, + 93, 17, 134, 93, 17, 151, 93, 17, 170, 93, 17, 179, 93, 17, 174, 93, 17, + 182, 93, 16, 220, 9, 250, 13, 202, 186, 93, 16, 220, 9, 250, 13, 215, + 200, 93, 16, 220, 9, 250, 13, 210, 12, 93, 16, 220, 9, 250, 13, 248, 91, + 93, 16, 220, 9, 250, 13, 247, 94, 93, 16, 220, 9, 250, 13, 209, 129, 93, + 16, 220, 9, 250, 13, 209, 123, 93, 16, 220, 9, 250, 13, 209, 121, 93, 16, + 220, 9, 250, 13, 209, 127, 93, 16, 220, 9, 250, 13, 209, 125, 100, 248, + 11, 100, 234, 105, 100, 242, 38, 100, 232, 71, 201, 238, 100, 242, 47, + 100, 232, 119, 236, 111, 100, 199, 27, 202, 198, 228, 111, 100, 203, 117, + 5, 247, 184, 217, 122, 100, 217, 157, 242, 38, 100, 217, 157, 232, 71, + 201, 238, 100, 214, 6, 100, 232, 100, 65, 205, 190, 101, 100, 232, 100, + 65, 205, 190, 104, 100, 232, 100, 65, 205, 190, 133, 100, 18, 204, 165, + 100, 17, 192, 76, 100, 17, 101, 100, 17, 104, 100, 17, 133, 100, 17, 134, + 100, 17, 151, 100, 17, 170, 100, 17, 179, 100, 17, 174, 100, 17, 182, + 100, 1, 64, 100, 1, 71, 100, 1, 70, 100, 1, 74, 100, 1, 68, 100, 1, 212, + 0, 100, 1, 197, 104, 100, 1, 234, 171, 100, 1, 181, 100, 1, 250, 214, + 100, 1, 249, 3, 100, 1, 166, 100, 1, 208, 239, 100, 1, 231, 233, 100, 1, + 172, 100, 1, 177, 100, 1, 188, 100, 1, 204, 64, 100, 1, 189, 100, 1, 238, + 0, 100, 1, 246, 117, 100, 1, 223, 62, 100, 1, 168, 100, 1, 167, 100, 1, + 194, 169, 100, 1, 233, 97, 100, 1, 160, 100, 1, 221, 250, 100, 1, 198, + 118, 100, 1, 192, 112, 100, 1, 230, 99, 100, 1, 192, 0, 100, 1, 219, 222, + 100, 1, 192, 57, 100, 1, 242, 215, 100, 1, 199, 27, 184, 18, 57, 100, 1, + 199, 27, 71, 100, 1, 199, 27, 70, 100, 1, 199, 27, 74, 100, 1, 199, 27, + 68, 100, 1, 199, 27, 212, 0, 100, 1, 199, 27, 197, 104, 100, 1, 199, 27, + 250, 214, 100, 1, 199, 27, 249, 3, 100, 1, 199, 27, 166, 100, 1, 199, 27, + 208, 239, 100, 1, 199, 27, 231, 233, 100, 1, 199, 27, 172, 100, 1, 199, + 27, 189, 100, 1, 199, 27, 238, 0, 100, 1, 199, 27, 246, 117, 100, 1, 199, + 27, 223, 62, 100, 1, 199, 27, 198, 118, 100, 1, 199, 27, 168, 100, 1, + 199, 27, 194, 169, 100, 1, 199, 27, 160, 100, 1, 199, 27, 231, 230, 100, + 1, 199, 27, 230, 99, 100, 1, 199, 27, 223, 19, 100, 1, 199, 27, 214, 50, + 100, 1, 199, 27, 235, 17, 100, 1, 203, 117, 71, 100, 1, 203, 117, 70, + 100, 1, 203, 117, 223, 73, 100, 1, 203, 117, 197, 104, 100, 1, 203, 117, + 68, 100, 1, 203, 117, 250, 214, 100, 1, 203, 117, 160, 100, 1, 203, 117, + 231, 233, 100, 1, 203, 117, 144, 100, 1, 203, 117, 166, 100, 1, 203, 117, + 204, 64, 100, 1, 203, 117, 189, 100, 1, 203, 117, 238, 0, 100, 1, 203, + 117, 223, 62, 100, 1, 203, 117, 233, 97, 100, 1, 203, 117, 231, 230, 100, + 1, 203, 117, 230, 99, 100, 1, 203, 117, 198, 118, 100, 1, 203, 117, 192, + 112, 100, 1, 203, 117, 208, 68, 100, 1, 203, 117, 246, 117, 100, 1, 203, + 117, 192, 71, 100, 1, 217, 157, 70, 100, 1, 217, 157, 160, 100, 1, 217, + 157, 167, 100, 1, 217, 157, 233, 97, 100, 1, 217, 157, 192, 71, 100, 1, + 246, 118, 4, 103, 236, 111, 100, 1, 251, 18, 231, 213, 250, 169, 101, + 100, 1, 251, 18, 231, 213, 196, 7, 101, 100, 1, 251, 18, 231, 213, 237, + 217, 100, 1, 251, 18, 231, 213, 197, 114, 100, 1, 251, 18, 231, 213, 223, + 121, 197, 114, 100, 1, 251, 18, 231, 213, 248, 210, 100, 1, 251, 18, 231, + 213, 112, 248, 210, 100, 1, 251, 18, 231, 213, 64, 100, 1, 251, 18, 231, + 213, 70, 100, 1, 251, 18, 231, 213, 160, 100, 1, 251, 18, 231, 213, 214, + 165, 100, 1, 251, 18, 231, 213, 247, 19, 100, 1, 251, 18, 231, 213, 198, + 83, 100, 1, 251, 18, 231, 213, 198, 71, 100, 1, 251, 18, 231, 213, 237, + 161, 100, 1, 251, 18, 231, 213, 213, 178, 100, 1, 251, 18, 231, 213, 189, + 100, 1, 251, 18, 231, 213, 238, 0, 100, 1, 251, 18, 231, 213, 166, 100, + 1, 251, 18, 231, 213, 210, 94, 100, 1, 251, 18, 231, 213, 202, 92, 100, + 1, 251, 18, 231, 213, 192, 71, 100, 1, 251, 18, 231, 213, 192, 112, 100, + 1, 251, 18, 231, 213, 251, 72, 100, 1, 199, 27, 251, 18, 231, 213, 189, + 100, 1, 199, 27, 251, 18, 231, 213, 192, 71, 100, 1, 217, 157, 251, 18, + 231, 213, 231, 84, 100, 1, 217, 157, 251, 18, 231, 213, 214, 165, 100, 1, + 217, 157, 251, 18, 231, 213, 247, 19, 100, 1, 217, 157, 251, 18, 231, + 213, 223, 28, 100, 1, 217, 157, 251, 18, 231, 213, 198, 83, 100, 1, 217, + 157, 251, 18, 231, 213, 237, 145, 100, 1, 217, 157, 251, 18, 231, 213, + 189, 100, 1, 217, 157, 251, 18, 231, 213, 237, 40, 100, 1, 217, 157, 251, + 18, 231, 213, 202, 92, 100, 1, 217, 157, 251, 18, 231, 213, 238, 109, + 100, 1, 217, 157, 251, 18, 231, 213, 192, 71, 100, 1, 217, 157, 251, 18, + 231, 213, 192, 112, 100, 1, 251, 18, 231, 213, 138, 68, 100, 1, 251, 18, + 231, 213, 138, 168, 100, 1, 217, 157, 251, 18, 231, 213, 248, 54, 100, 1, + 251, 18, 231, 213, 237, 244, 100, 1, 217, 157, 251, 18, 231, 213, 219, + 222, 21, 22, 211, 98, 21, 22, 249, 236, 21, 22, 251, 243, 21, 22, 194, + 114, 21, 22, 209, 135, 21, 22, 210, 190, 21, 22, 209, 0, 21, 22, 200, 88, + 21, 22, 222, 64, 21, 22, 220, 235, 21, 22, 217, 92, 21, 22, 213, 93, 21, + 22, 215, 35, 21, 22, 220, 52, 21, 22, 202, 165, 21, 22, 206, 1, 21, 22, + 203, 173, 21, 22, 204, 16, 21, 22, 203, 135, 21, 22, 192, 223, 21, 22, + 193, 75, 21, 22, 208, 15, 21, 22, 212, 207, 21, 22, 211, 233, 212, 207, + 21, 22, 212, 206, 21, 22, 211, 233, 212, 206, 21, 22, 212, 205, 21, 22, + 211, 233, 212, 205, 21, 22, 212, 204, 21, 22, 211, 233, 212, 204, 21, 22, + 206, 172, 21, 22, 206, 171, 21, 22, 206, 170, 21, 22, 206, 169, 21, 22, + 206, 168, 21, 22, 206, 176, 21, 22, 211, 233, 211, 93, 21, 22, 211, 233, + 200, 228, 21, 22, 211, 233, 222, 184, 21, 22, 211, 233, 247, 52, 21, 22, + 211, 233, 218, 236, 21, 22, 211, 233, 215, 151, 21, 22, 211, 233, 206, + 158, 21, 22, 211, 233, 204, 66, 21, 22, 234, 184, 194, 202, 21, 22, 194, + 88, 194, 202, 21, 22, 52, 2, 207, 81, 21, 22, 52, 208, 39, 236, 114, 21, + 22, 208, 111, 206, 173, 21, 22, 194, 89, 219, 73, 21, 22, 194, 89, 220, + 184, 21, 22, 199, 137, 21, 22, 199, 139, 21, 22, 198, 63, 21, 22, 198, + 65, 21, 22, 198, 70, 21, 22, 199, 43, 21, 22, 199, 45, 21, 22, 205, 255, + 203, 140, 21, 22, 205, 255, 203, 203, 21, 22, 205, 255, 229, 16, 21, 22, + 96, 230, 138, 21, 22, 96, 237, 74, 231, 150, 21, 22, 96, 231, 230, 21, + 22, 96, 230, 143, 21, 22, 205, 255, 222, 194, 21, 22, 96, 222, 192, 21, + 22, 248, 112, 237, 74, 165, 21, 22, 248, 112, 237, 74, 150, 21, 22, 96, + 237, 69, 206, 158, 219, 185, 195, 229, 219, 235, 219, 185, 1, 160, 219, + 185, 1, 221, 250, 219, 185, 1, 231, 233, 219, 185, 1, 231, 84, 219, 185, + 1, 214, 165, 219, 185, 1, 247, 19, 219, 185, 1, 246, 117, 219, 185, 1, + 223, 62, 219, 185, 1, 223, 28, 219, 185, 1, 193, 97, 219, 185, 1, 189, + 219, 185, 1, 199, 240, 219, 185, 1, 238, 0, 219, 185, 1, 237, 40, 219, + 185, 1, 181, 219, 185, 1, 166, 219, 185, 1, 210, 94, 219, 185, 1, 249, 3, + 219, 185, 1, 248, 54, 219, 185, 1, 172, 219, 185, 1, 168, 219, 185, 1, + 167, 219, 185, 1, 177, 219, 185, 1, 194, 169, 219, 185, 1, 204, 64, 219, + 185, 1, 202, 92, 219, 185, 1, 188, 219, 185, 1, 144, 219, 185, 1, 230, + 134, 219, 185, 1, 198, 223, 219, 185, 18, 3, 64, 219, 185, 18, 3, 70, + 219, 185, 18, 3, 68, 219, 185, 18, 3, 234, 171, 219, 185, 18, 3, 251, 63, + 219, 185, 18, 3, 211, 194, 219, 185, 18, 3, 250, 8, 219, 185, 18, 3, 71, + 219, 185, 18, 3, 74, 219, 185, 201, 164, 1, 168, 219, 185, 201, 164, 1, + 167, 219, 185, 201, 164, 1, 194, 169, 219, 185, 2, 1, 160, 219, 185, 2, + 1, 214, 165, 219, 185, 2, 1, 250, 168, 219, 185, 2, 1, 189, 219, 185, 2, + 1, 181, 219, 185, 2, 1, 166, 219, 185, 2, 1, 172, 219, 185, 2, 1, 167, + 219, 185, 2, 1, 177, 219, 185, 3, 215, 221, 219, 185, 3, 222, 36, 219, + 185, 3, 206, 92, 219, 185, 3, 219, 73, 219, 185, 233, 204, 77, 219, 185, + 208, 159, 77, 219, 185, 17, 192, 76, 219, 185, 17, 101, 219, 185, 17, + 104, 219, 185, 17, 133, 219, 185, 17, 134, 219, 185, 17, 151, 219, 185, + 17, 170, 219, 185, 17, 179, 219, 185, 17, 174, 219, 185, 17, 182, 53, + 220, 43, 1, 160, 53, 220, 43, 1, 193, 209, 53, 220, 43, 1, 214, 165, 53, + 220, 43, 1, 198, 118, 53, 220, 43, 1, 188, 53, 220, 43, 1, 168, 53, 220, + 43, 1, 189, 53, 220, 43, 1, 199, 240, 53, 220, 43, 1, 177, 53, 220, 43, + 1, 166, 53, 220, 43, 1, 210, 94, 53, 220, 43, 1, 172, 53, 220, 43, 1, + 233, 97, 53, 220, 43, 1, 196, 157, 53, 220, 43, 1, 144, 53, 220, 43, 1, + 208, 239, 53, 220, 43, 1, 221, 250, 53, 220, 43, 1, 198, 108, 53, 220, + 43, 1, 181, 53, 220, 43, 1, 64, 53, 220, 43, 1, 70, 53, 220, 43, 1, 234, + 171, 53, 220, 43, 1, 234, 157, 53, 220, 43, 1, 68, 53, 220, 43, 1, 211, + 194, 53, 220, 43, 1, 74, 53, 220, 43, 1, 197, 104, 53, 220, 43, 1, 71, + 53, 220, 43, 1, 250, 6, 53, 220, 43, 1, 251, 63, 53, 220, 43, 1, 199, 16, + 53, 220, 43, 1, 199, 15, 53, 220, 43, 1, 199, 14, 53, 220, 43, 1, 199, + 13, 53, 220, 43, 1, 199, 12, 214, 177, 53, 219, 30, 1, 139, 208, 239, + 214, 177, 53, 219, 30, 1, 132, 208, 239, 214, 177, 53, 219, 30, 1, 139, + 160, 214, 177, 53, 219, 30, 1, 139, 193, 209, 214, 177, 53, 219, 30, 1, + 139, 214, 165, 214, 177, 53, 219, 30, 1, 132, 160, 214, 177, 53, 219, 30, + 1, 132, 193, 209, 214, 177, 53, 219, 30, 1, 132, 214, 165, 214, 177, 53, + 219, 30, 1, 139, 198, 118, 214, 177, 53, 219, 30, 1, 139, 188, 214, 177, + 53, 219, 30, 1, 139, 168, 214, 177, 53, 219, 30, 1, 132, 198, 118, 214, + 177, 53, 219, 30, 1, 132, 188, 214, 177, 53, 219, 30, 1, 132, 168, 214, + 177, 53, 219, 30, 1, 139, 189, 214, 177, 53, 219, 30, 1, 139, 199, 240, + 214, 177, 53, 219, 30, 1, 139, 181, 214, 177, 53, 219, 30, 1, 132, 189, + 214, 177, 53, 219, 30, 1, 132, 199, 240, 214, 177, 53, 219, 30, 1, 132, + 181, 214, 177, 53, 219, 30, 1, 139, 166, 214, 177, 53, 219, 30, 1, 139, + 210, 94, 214, 177, 53, 219, 30, 1, 139, 172, 214, 177, 53, 219, 30, 1, + 132, 166, 214, 177, 53, 219, 30, 1, 132, 210, 94, 214, 177, 53, 219, 30, + 1, 132, 172, 214, 177, 53, 219, 30, 1, 139, 233, 97, 214, 177, 53, 219, + 30, 1, 139, 196, 157, 214, 177, 53, 219, 30, 1, 139, 177, 214, 177, 53, + 219, 30, 1, 132, 233, 97, 214, 177, 53, 219, 30, 1, 132, 196, 157, 214, + 177, 53, 219, 30, 1, 132, 177, 214, 177, 53, 219, 30, 1, 139, 144, 214, + 177, 53, 219, 30, 1, 139, 238, 0, 214, 177, 53, 219, 30, 1, 139, 249, 3, + 214, 177, 53, 219, 30, 1, 132, 144, 214, 177, 53, 219, 30, 1, 132, 238, + 0, 214, 177, 53, 219, 30, 1, 132, 249, 3, 214, 177, 53, 219, 30, 1, 139, + 220, 240, 214, 177, 53, 219, 30, 1, 139, 193, 174, 214, 177, 53, 219, 30, + 1, 132, 220, 240, 214, 177, 53, 219, 30, 1, 132, 193, 174, 214, 177, 53, + 219, 30, 1, 139, 201, 175, 214, 177, 53, 219, 30, 1, 132, 201, 175, 214, + 177, 53, 219, 30, 18, 3, 18, 203, 183, 214, 177, 53, 219, 30, 18, 3, 252, + 33, 214, 177, 53, 219, 30, 18, 3, 223, 224, 214, 177, 53, 219, 30, 18, 3, + 68, 214, 177, 53, 219, 30, 18, 3, 196, 251, 214, 177, 53, 219, 30, 18, 3, + 71, 214, 177, 53, 219, 30, 18, 3, 251, 108, 214, 177, 53, 219, 30, 18, 3, + 74, 214, 177, 53, 219, 30, 18, 3, 212, 26, 214, 177, 53, 219, 30, 18, 3, + 197, 104, 214, 177, 53, 219, 30, 18, 3, 249, 236, 214, 177, 53, 219, 30, + 18, 3, 251, 243, 214, 177, 53, 219, 30, 18, 3, 196, 243, 214, 177, 53, + 219, 30, 18, 3, 211, 98, 214, 177, 53, 219, 30, 18, 3, 212, 23, 214, 177, + 53, 219, 30, 18, 3, 197, 99, 214, 177, 53, 219, 30, 18, 3, 223, 73, 214, + 177, 53, 219, 30, 1, 52, 196, 236, 214, 177, 53, 219, 30, 1, 52, 214, + 167, 214, 177, 53, 219, 30, 1, 52, 215, 151, 214, 177, 53, 219, 30, 1, + 52, 218, 236, 214, 177, 53, 219, 30, 1, 52, 222, 184, 214, 177, 53, 219, + 30, 1, 52, 238, 95, 214, 177, 53, 219, 30, 1, 52, 249, 226, 214, 177, 53, + 219, 30, 158, 217, 126, 214, 177, 53, 219, 30, 158, 217, 125, 214, 177, + 53, 219, 30, 17, 192, 76, 214, 177, 53, 219, 30, 17, 101, 214, 177, 53, + 219, 30, 17, 104, 214, 177, 53, 219, 30, 17, 133, 214, 177, 53, 219, 30, + 17, 134, 214, 177, 53, 219, 30, 17, 151, 214, 177, 53, 219, 30, 17, 170, + 214, 177, 53, 219, 30, 17, 179, 214, 177, 53, 219, 30, 17, 174, 214, 177, + 53, 219, 30, 17, 182, 214, 177, 53, 219, 30, 126, 17, 101, 214, 177, 53, + 219, 30, 3, 220, 166, 214, 177, 53, 219, 30, 3, 220, 165, 93, 16, 210, + 201, 93, 16, 215, 201, 221, 105, 93, 16, 210, 13, 221, 105, 93, 16, 248, + 92, 221, 105, 93, 16, 247, 95, 221, 105, 93, 16, 209, 130, 221, 105, 93, + 16, 209, 124, 221, 105, 93, 16, 209, 122, 221, 105, 93, 16, 209, 128, + 221, 105, 93, 16, 209, 126, 221, 105, 93, 16, 237, 202, 221, 105, 93, 16, + 237, 198, 221, 105, 93, 16, 237, 197, 221, 105, 93, 16, 237, 200, 221, + 105, 93, 16, 237, 199, 221, 105, 93, 16, 237, 196, 221, 105, 93, 16, 198, + 2, 93, 16, 215, 201, 207, 42, 93, 16, 210, 13, 207, 42, 93, 16, 248, 92, + 207, 42, 93, 16, 247, 95, 207, 42, 93, 16, 209, 130, 207, 42, 93, 16, + 209, 124, 207, 42, 93, 16, 209, 122, 207, 42, 93, 16, 209, 128, 207, 42, + 93, 16, 209, 126, 207, 42, 93, 16, 237, 202, 207, 42, 93, 16, 237, 198, + 207, 42, 93, 16, 237, 197, 207, 42, 93, 16, 237, 200, 207, 42, 93, 16, + 237, 199, 207, 42, 93, 16, 237, 196, 207, 42, 247, 115, 1, 160, 247, 115, + 1, 231, 233, 247, 115, 1, 214, 165, 247, 115, 1, 214, 108, 247, 115, 1, + 166, 247, 115, 1, 249, 3, 247, 115, 1, 172, 247, 115, 1, 215, 247, 247, + 115, 1, 189, 247, 115, 1, 238, 0, 247, 115, 1, 181, 247, 115, 1, 213, 88, + 247, 115, 1, 247, 19, 247, 115, 1, 223, 62, 247, 115, 1, 212, 201, 247, + 115, 1, 212, 192, 247, 115, 1, 168, 247, 115, 1, 167, 247, 115, 1, 177, + 247, 115, 1, 196, 157, 247, 115, 1, 188, 247, 115, 1, 64, 247, 115, 1, + 144, 247, 115, 18, 3, 70, 247, 115, 18, 3, 68, 247, 115, 18, 3, 71, 247, + 115, 18, 3, 74, 247, 115, 18, 3, 251, 108, 247, 115, 211, 42, 247, 115, + 234, 80, 80, 205, 208, 53, 126, 1, 139, 160, 53, 126, 1, 139, 221, 250, + 53, 126, 1, 139, 220, 224, 53, 126, 1, 132, 160, 53, 126, 1, 132, 220, + 224, 53, 126, 1, 132, 221, 250, 53, 126, 1, 214, 165, 53, 126, 1, 139, + 247, 19, 53, 126, 1, 139, 246, 117, 53, 126, 1, 132, 247, 19, 53, 126, 1, + 132, 188, 53, 126, 1, 132, 246, 117, 53, 126, 1, 212, 201, 53, 126, 1, + 208, 21, 53, 126, 1, 139, 208, 19, 53, 126, 1, 238, 0, 53, 126, 1, 132, + 208, 19, 53, 126, 1, 208, 30, 53, 126, 1, 139, 189, 53, 126, 1, 139, 199, + 240, 53, 126, 1, 132, 189, 53, 126, 1, 132, 199, 240, 53, 126, 1, 181, + 53, 126, 1, 249, 3, 53, 126, 1, 139, 166, 53, 126, 1, 139, 210, 94, 53, + 126, 1, 139, 233, 97, 53, 126, 1, 132, 166, 53, 126, 1, 132, 233, 97, 53, + 126, 1, 132, 210, 94, 53, 126, 1, 172, 53, 126, 1, 132, 168, 53, 126, 1, + 139, 168, 53, 126, 1, 167, 53, 126, 1, 206, 207, 53, 126, 1, 177, 53, + 126, 1, 219, 29, 53, 126, 1, 194, 169, 53, 126, 1, 139, 204, 64, 53, 126, + 1, 139, 202, 92, 53, 126, 1, 139, 188, 53, 126, 1, 139, 144, 53, 126, 1, + 219, 137, 53, 126, 1, 64, 53, 126, 1, 132, 144, 53, 126, 1, 70, 53, 126, + 1, 223, 224, 53, 126, 1, 68, 53, 126, 1, 196, 251, 53, 126, 1, 234, 171, + 53, 126, 1, 211, 194, 53, 126, 1, 220, 166, 53, 126, 1, 230, 206, 188, + 53, 126, 116, 3, 217, 35, 167, 53, 126, 116, 3, 217, 35, 177, 53, 126, + 116, 3, 220, 185, 200, 122, 220, 155, 53, 126, 3, 217, 181, 222, 118, + 220, 155, 53, 126, 116, 3, 52, 214, 165, 53, 126, 116, 3, 132, 166, 53, + 126, 116, 3, 139, 208, 20, 211, 164, 132, 166, 53, 126, 116, 3, 172, 53, + 126, 116, 3, 249, 3, 53, 126, 116, 3, 188, 53, 126, 3, 206, 66, 53, 126, + 18, 3, 64, 53, 126, 18, 3, 217, 181, 206, 20, 53, 126, 18, 3, 252, 33, + 53, 126, 18, 3, 200, 132, 252, 33, 53, 126, 18, 3, 70, 53, 126, 18, 3, + 223, 224, 53, 126, 18, 3, 197, 104, 53, 126, 18, 3, 196, 250, 53, 126, + 18, 3, 68, 53, 126, 18, 3, 196, 251, 53, 126, 18, 3, 74, 53, 126, 18, 3, + 212, 27, 63, 53, 126, 18, 3, 211, 98, 53, 126, 18, 3, 71, 53, 126, 18, 3, + 251, 108, 53, 126, 18, 3, 211, 194, 53, 126, 18, 3, 251, 63, 53, 126, 18, + 3, 126, 251, 63, 53, 126, 18, 3, 212, 27, 58, 53, 126, 3, 217, 181, 222, + 117, 53, 126, 3, 199, 17, 53, 126, 3, 199, 16, 53, 126, 3, 221, 209, 199, + 15, 53, 126, 3, 221, 209, 199, 14, 53, 126, 3, 221, 209, 199, 13, 53, + 126, 3, 208, 76, 230, 98, 53, 126, 3, 217, 181, 206, 50, 53, 126, 3, 221, + 208, 222, 98, 53, 126, 38, 238, 165, 236, 114, 53, 126, 229, 7, 17, 192, + 76, 53, 126, 229, 7, 17, 101, 53, 126, 229, 7, 17, 104, 53, 126, 229, 7, + 17, 133, 53, 126, 229, 7, 17, 134, 53, 126, 229, 7, 17, 151, 53, 126, + 229, 7, 17, 170, 53, 126, 229, 7, 17, 179, 53, 126, 229, 7, 17, 174, 53, + 126, 229, 7, 17, 182, 53, 126, 126, 17, 192, 76, 53, 126, 126, 17, 101, + 53, 126, 126, 17, 104, 53, 126, 126, 17, 133, 53, 126, 126, 17, 134, 53, + 126, 126, 17, 151, 53, 126, 126, 17, 170, 53, 126, 126, 17, 179, 53, 126, + 126, 17, 174, 53, 126, 126, 17, 182, 53, 126, 3, 194, 66, 53, 126, 3, + 194, 65, 53, 126, 3, 206, 5, 53, 126, 3, 222, 25, 53, 126, 3, 228, 191, + 53, 126, 3, 236, 129, 53, 126, 3, 207, 168, 207, 16, 208, 30, 53, 126, 3, + 217, 181, 193, 98, 53, 126, 3, 222, 152, 53, 126, 3, 222, 151, 53, 126, + 3, 206, 15, 53, 126, 3, 206, 14, 53, 126, 3, 230, 35, 53, 126, 3, 247, + 16, 38, 235, 101, 242, 122, 251, 143, 38, 237, 13, 38, 223, 167, 38, 235, + 92, 54, 38, 198, 170, 236, 114, 38, 193, 222, 63, 38, 194, 58, 219, 176, + 63, 38, 211, 184, 122, 63, 38, 55, 211, 184, 122, 63, 38, 152, 246, 139, + 201, 208, 63, 38, 201, 194, 246, 139, 201, 208, 63, 38, 210, 232, 58, 38, + 55, 210, 232, 58, 38, 210, 232, 63, 38, 210, 232, 211, 110, 38, 8, 2, 1, + 194, 203, 63, 38, 8, 2, 1, 163, 194, 203, 63, 148, 3, 197, 87, 207, 138, + 148, 3, 197, 87, 246, 236, 148, 3, 246, 154, 148, 3, 201, 98, 148, 3, + 248, 8, 148, 1, 251, 42, 148, 1, 251, 43, 200, 58, 148, 1, 223, 220, 148, + 1, 223, 221, 200, 58, 148, 1, 197, 90, 148, 1, 197, 91, 200, 58, 148, 1, + 208, 76, 207, 201, 148, 1, 208, 76, 207, 202, 200, 58, 148, 1, 220, 185, + 220, 3, 148, 1, 220, 185, 220, 4, 200, 58, 148, 1, 234, 129, 148, 1, 251, + 60, 148, 1, 211, 229, 148, 1, 211, 230, 200, 58, 148, 1, 160, 148, 1, + 222, 174, 217, 184, 148, 1, 231, 233, 148, 1, 231, 234, 230, 239, 148, 1, + 214, 165, 148, 1, 247, 19, 148, 1, 247, 20, 220, 171, 148, 1, 223, 62, + 148, 1, 223, 63, 223, 32, 148, 1, 212, 201, 148, 1, 200, 181, 220, 62, + 148, 1, 200, 181, 215, 196, 217, 184, 148, 1, 238, 1, 215, 196, 250, 254, + 148, 1, 238, 1, 215, 196, 217, 184, 148, 1, 215, 97, 208, 33, 148, 1, + 189, 148, 1, 200, 181, 200, 92, 148, 1, 238, 0, 148, 1, 238, 1, 217, 206, + 148, 1, 181, 148, 1, 166, 148, 1, 211, 78, 222, 110, 148, 1, 249, 3, 148, + 1, 249, 4, 222, 37, 148, 1, 172, 148, 1, 168, 148, 1, 167, 148, 1, 177, + 148, 1, 194, 169, 148, 1, 206, 101, 206, 78, 148, 1, 206, 101, 206, 27, + 148, 1, 188, 148, 1, 144, 148, 3, 207, 191, 148, 18, 3, 200, 58, 148, 18, + 3, 197, 86, 148, 18, 3, 197, 87, 206, 23, 148, 18, 3, 201, 133, 148, 18, + 3, 201, 134, 223, 212, 148, 18, 3, 208, 76, 207, 201, 148, 18, 3, 208, + 76, 207, 202, 200, 58, 148, 18, 3, 220, 185, 220, 3, 148, 18, 3, 220, + 185, 220, 4, 200, 58, 148, 18, 3, 200, 133, 148, 18, 3, 200, 134, 207, + 201, 148, 18, 3, 200, 134, 200, 58, 148, 18, 3, 200, 134, 207, 202, 200, + 58, 148, 18, 3, 210, 136, 148, 18, 3, 210, 137, 200, 58, 148, 251, 120, + 251, 119, 148, 1, 222, 140, 206, 22, 148, 1, 221, 215, 206, 22, 148, 1, + 197, 186, 206, 22, 148, 1, 234, 165, 206, 22, 148, 1, 196, 124, 206, 22, + 148, 1, 192, 102, 206, 22, 148, 1, 250, 29, 206, 22, 148, 17, 192, 76, + 148, 17, 101, 148, 17, 104, 148, 17, 133, 148, 17, 134, 148, 17, 151, + 148, 17, 170, 148, 17, 179, 148, 17, 174, 148, 17, 182, 148, 211, 5, 148, + 211, 34, 148, 194, 50, 148, 246, 209, 211, 27, 148, 246, 209, 203, 94, + 148, 246, 209, 210, 229, 148, 211, 33, 148, 35, 16, 236, 121, 148, 35, + 16, 237, 73, 148, 35, 16, 235, 45, 148, 35, 16, 237, 206, 148, 35, 16, + 237, 207, 201, 98, 148, 35, 16, 236, 214, 148, 35, 16, 237, 248, 148, 35, + 16, 237, 49, 148, 35, 16, 237, 230, 148, 35, 16, 237, 207, 231, 152, 148, + 35, 16, 38, 200, 51, 148, 35, 16, 38, 234, 77, 148, 35, 16, 38, 222, 32, + 148, 35, 16, 38, 222, 34, 148, 35, 16, 38, 223, 36, 148, 35, 16, 38, 222, + 33, 4, 223, 36, 148, 35, 16, 38, 222, 35, 4, 223, 36, 148, 35, 16, 38, + 248, 77, 148, 35, 16, 38, 230, 243, 148, 35, 16, 207, 99, 211, 184, 235, + 56, 148, 35, 16, 207, 99, 211, 184, 237, 246, 148, 35, 16, 207, 99, 242, + 84, 198, 31, 148, 35, 16, 207, 99, 242, 84, 200, 143, 148, 35, 16, 220, + 26, 211, 184, 211, 19, 148, 35, 16, 220, 26, 211, 184, 209, 35, 148, 35, + 16, 220, 26, 242, 84, 209, 228, 148, 35, 16, 220, 26, 242, 84, 209, 211, + 148, 35, 16, 220, 26, 211, 184, 209, 255, 201, 122, 3, 211, 2, 201, 122, + 3, 211, 15, 201, 122, 3, 211, 11, 201, 122, 1, 64, 201, 122, 1, 70, 201, + 122, 1, 68, 201, 122, 1, 251, 108, 201, 122, 1, 74, 201, 122, 1, 71, 201, + 122, 1, 233, 230, 201, 122, 1, 160, 201, 122, 1, 208, 239, 201, 122, 1, + 231, 233, 201, 122, 1, 214, 165, 201, 122, 1, 247, 19, 201, 122, 1, 223, + 62, 201, 122, 1, 192, 112, 201, 122, 1, 212, 201, 201, 122, 1, 189, 201, + 122, 1, 238, 0, 201, 122, 1, 181, 201, 122, 1, 166, 201, 122, 1, 233, 97, + 201, 122, 1, 196, 157, 201, 122, 1, 249, 3, 201, 122, 1, 172, 201, 122, + 1, 168, 201, 122, 1, 167, 201, 122, 1, 177, 201, 122, 1, 194, 169, 201, + 122, 1, 188, 201, 122, 1, 193, 209, 201, 122, 1, 144, 201, 122, 116, 3, + 211, 31, 201, 122, 116, 3, 211, 4, 201, 122, 116, 3, 211, 1, 201, 122, + 18, 3, 211, 18, 201, 122, 18, 3, 211, 0, 201, 122, 18, 3, 211, 24, 201, + 122, 18, 3, 211, 10, 201, 122, 18, 3, 211, 32, 201, 122, 18, 3, 211, 20, + 201, 122, 3, 211, 35, 201, 122, 3, 196, 11, 201, 122, 116, 3, 210, 217, + 172, 201, 122, 116, 3, 210, 217, 194, 169, 201, 122, 1, 221, 250, 201, + 122, 1, 201, 55, 201, 122, 17, 192, 76, 201, 122, 17, 101, 201, 122, 17, + 104, 201, 122, 17, 133, 201, 122, 17, 134, 201, 122, 17, 151, 201, 122, + 17, 170, 201, 122, 17, 179, 201, 122, 17, 174, 201, 122, 17, 182, 201, + 122, 249, 246, 201, 122, 1, 207, 171, 201, 122, 1, 219, 232, 201, 122, 1, + 248, 54, 201, 122, 1, 52, 222, 184, 201, 122, 1, 52, 218, 236, 248, 169, + 1, 64, 248, 169, 1, 203, 86, 64, 248, 169, 1, 144, 248, 169, 1, 203, 86, + 144, 248, 169, 1, 217, 155, 144, 248, 169, 1, 249, 3, 248, 169, 1, 222, + 95, 249, 3, 248, 169, 1, 166, 248, 169, 1, 203, 86, 166, 248, 169, 1, + 181, 248, 169, 1, 217, 155, 181, 248, 169, 1, 194, 169, 248, 169, 1, 203, + 86, 194, 169, 248, 169, 1, 211, 50, 194, 169, 248, 169, 1, 231, 233, 248, + 169, 1, 203, 86, 231, 233, 248, 169, 1, 223, 62, 248, 169, 1, 238, 0, + 248, 169, 1, 167, 248, 169, 1, 203, 86, 167, 248, 169, 1, 172, 248, 169, + 1, 203, 86, 172, 248, 169, 1, 202, 169, 189, 248, 169, 1, 213, 115, 189, + 248, 169, 1, 188, 248, 169, 1, 203, 86, 188, 248, 169, 1, 217, 155, 188, + 248, 169, 1, 168, 248, 169, 1, 203, 86, 168, 248, 169, 1, 214, 165, 248, + 169, 1, 177, 248, 169, 1, 203, 86, 177, 248, 169, 1, 212, 201, 248, 169, + 1, 247, 19, 248, 169, 1, 214, 255, 248, 169, 1, 217, 82, 248, 169, 1, 70, + 248, 169, 1, 68, 248, 169, 3, 199, 21, 248, 169, 18, 3, 71, 248, 169, 18, + 3, 211, 50, 71, 248, 169, 18, 3, 234, 171, 248, 169, 18, 3, 70, 248, 169, + 18, 3, 222, 95, 70, 248, 169, 18, 3, 74, 248, 169, 18, 3, 222, 95, 74, + 248, 169, 18, 3, 68, 248, 169, 18, 3, 124, 39, 203, 86, 188, 248, 169, + 116, 3, 214, 167, 248, 169, 116, 3, 230, 124, 248, 169, 211, 13, 248, + 169, 211, 9, 248, 169, 16, 248, 18, 215, 97, 216, 238, 248, 169, 16, 248, + 18, 210, 5, 248, 169, 16, 248, 18, 222, 211, 248, 169, 16, 248, 18, 211, + 13, 219, 243, 1, 160, 219, 243, 1, 221, 132, 219, 243, 1, 221, 250, 219, + 243, 1, 231, 233, 219, 243, 1, 231, 14, 219, 243, 1, 214, 165, 219, 243, + 1, 247, 19, 219, 243, 1, 246, 117, 219, 243, 1, 223, 62, 219, 243, 1, + 212, 201, 219, 243, 1, 189, 219, 243, 1, 199, 240, 219, 243, 1, 238, 0, + 219, 243, 1, 181, 219, 243, 1, 166, 219, 243, 1, 209, 234, 219, 243, 1, + 210, 94, 219, 243, 1, 233, 97, 219, 243, 1, 232, 208, 219, 243, 1, 249, + 3, 219, 243, 1, 247, 249, 219, 243, 1, 172, 219, 243, 1, 216, 98, 219, + 243, 1, 198, 118, 219, 243, 1, 198, 108, 219, 243, 1, 235, 17, 219, 243, + 1, 168, 219, 243, 1, 167, 219, 243, 1, 177, 219, 243, 1, 144, 219, 243, + 1, 229, 131, 219, 243, 1, 196, 157, 219, 243, 1, 188, 219, 243, 1, 204, + 64, 219, 243, 1, 194, 169, 219, 243, 1, 64, 219, 243, 201, 164, 1, 168, + 219, 243, 201, 164, 1, 167, 219, 243, 18, 3, 252, 33, 219, 243, 18, 3, + 70, 219, 243, 18, 3, 74, 219, 243, 18, 3, 211, 194, 219, 243, 18, 3, 68, + 219, 243, 18, 3, 196, 251, 219, 243, 18, 3, 71, 219, 243, 116, 3, 222, + 184, 219, 243, 116, 3, 218, 236, 219, 243, 116, 3, 165, 219, 243, 116, 3, + 215, 151, 219, 243, 116, 3, 211, 93, 219, 243, 116, 3, 150, 219, 243, + 116, 3, 200, 228, 219, 243, 116, 3, 212, 173, 219, 243, 116, 3, 222, 117, + 219, 243, 3, 208, 31, 219, 243, 3, 212, 241, 219, 243, 209, 38, 200, 176, + 219, 243, 209, 38, 212, 185, 199, 131, 200, 176, 219, 243, 209, 38, 246, + 126, 219, 243, 209, 38, 198, 100, 246, 126, 219, 243, 209, 38, 198, 99, + 219, 243, 17, 192, 76, 219, 243, 17, 101, 219, 243, 17, 104, 219, 243, + 17, 133, 219, 243, 17, 134, 219, 243, 17, 151, 219, 243, 17, 170, 219, + 243, 17, 179, 219, 243, 17, 174, 219, 243, 17, 182, 219, 243, 1, 198, 83, + 219, 243, 1, 198, 71, 219, 243, 1, 237, 161, 211, 227, 242, 208, 17, 192, + 76, 211, 227, 242, 208, 17, 101, 211, 227, 242, 208, 17, 104, 211, 227, + 242, 208, 17, 133, 211, 227, 242, 208, 17, 134, 211, 227, 242, 208, 17, + 151, 211, 227, 242, 208, 17, 170, 211, 227, 242, 208, 17, 179, 211, 227, + 242, 208, 17, 174, 211, 227, 242, 208, 17, 182, 211, 227, 242, 208, 1, + 177, 211, 227, 242, 208, 1, 250, 26, 211, 227, 242, 208, 1, 251, 80, 211, + 227, 242, 208, 1, 250, 214, 211, 227, 242, 208, 1, 251, 35, 211, 227, + 242, 208, 1, 220, 184, 211, 227, 242, 208, 1, 251, 251, 211, 227, 242, + 208, 1, 251, 252, 211, 227, 242, 208, 1, 251, 250, 211, 227, 242, 208, 1, + 251, 244, 211, 227, 242, 208, 1, 219, 209, 211, 227, 242, 208, 1, 223, + 96, 211, 227, 242, 208, 1, 223, 225, 211, 227, 242, 208, 1, 223, 118, + 211, 227, 242, 208, 1, 223, 105, 211, 227, 242, 208, 1, 219, 36, 211, + 227, 242, 208, 1, 197, 111, 211, 227, 242, 208, 1, 197, 109, 211, 227, + 242, 208, 1, 197, 47, 211, 227, 242, 208, 1, 196, 243, 211, 227, 242, + 208, 1, 220, 42, 211, 227, 242, 208, 1, 234, 41, 211, 227, 242, 208, 1, + 234, 174, 211, 227, 242, 208, 1, 234, 88, 211, 227, 242, 208, 1, 234, 13, + 211, 227, 242, 208, 1, 219, 107, 211, 227, 242, 208, 1, 211, 135, 211, + 227, 242, 208, 1, 212, 22, 211, 227, 242, 208, 1, 211, 120, 211, 227, + 242, 208, 1, 211, 241, 211, 227, 242, 208, 215, 242, 198, 48, 211, 227, + 242, 208, 231, 228, 198, 49, 211, 227, 242, 208, 215, 236, 198, 49, 211, + 227, 242, 208, 207, 216, 211, 227, 242, 208, 210, 92, 211, 227, 242, 208, + 251, 71, 211, 227, 242, 208, 209, 38, 215, 232, 211, 227, 242, 208, 209, + 38, 55, 215, 232, 42, 2, 1, 207, 7, 196, 123, 42, 2, 1, 219, 77, 237, + 116, 42, 2, 1, 215, 50, 74, 42, 2, 1, 194, 64, 234, 9, 42, 2, 1, 200, + 132, 200, 79, 42, 2, 1, 199, 156, 200, 79, 42, 2, 1, 200, 132, 230, 26, + 57, 42, 2, 1, 200, 132, 193, 84, 42, 2, 1, 197, 72, 197, 92, 98, 215, + 243, 6, 1, 250, 224, 98, 215, 243, 6, 1, 248, 207, 98, 215, 243, 6, 1, + 231, 203, 98, 215, 243, 6, 1, 236, 123, 98, 215, 243, 6, 1, 234, 88, 98, + 215, 243, 6, 1, 196, 20, 98, 215, 243, 6, 1, 192, 79, 98, 215, 243, 6, 1, + 200, 125, 98, 215, 243, 6, 1, 223, 190, 98, 215, 243, 6, 1, 222, 121, 98, + 215, 243, 6, 1, 220, 67, 98, 215, 243, 6, 1, 217, 160, 98, 215, 243, 6, + 1, 215, 51, 98, 215, 243, 6, 1, 211, 211, 98, 215, 243, 6, 1, 210, 247, + 98, 215, 243, 6, 1, 192, 67, 98, 215, 243, 6, 1, 208, 53, 98, 215, 243, + 6, 1, 206, 40, 98, 215, 243, 6, 1, 200, 112, 98, 215, 243, 6, 1, 197, 77, + 98, 215, 243, 6, 1, 210, 86, 98, 215, 243, 6, 1, 221, 237, 98, 215, 243, + 6, 1, 231, 75, 98, 215, 243, 6, 1, 208, 224, 98, 215, 243, 6, 1, 203, + 224, 98, 215, 243, 6, 1, 242, 201, 98, 215, 243, 6, 1, 246, 243, 98, 215, + 243, 6, 1, 223, 10, 98, 215, 243, 6, 1, 242, 138, 98, 215, 243, 6, 1, + 246, 101, 98, 215, 243, 6, 1, 193, 207, 98, 215, 243, 6, 1, 223, 25, 98, + 215, 243, 6, 1, 230, 95, 98, 215, 243, 6, 1, 229, 255, 98, 215, 243, 6, + 1, 229, 165, 98, 215, 243, 6, 1, 194, 111, 98, 215, 243, 6, 1, 230, 28, + 98, 215, 243, 6, 1, 229, 31, 98, 215, 243, 6, 1, 233, 11, 98, 215, 243, + 6, 1, 193, 3, 98, 215, 243, 6, 1, 234, 107, 98, 215, 243, 6, 1, 163, 231, + 203, 98, 215, 243, 6, 1, 251, 57, 98, 215, 243, 6, 1, 251, 97, 98, 215, + 243, 6, 1, 230, 26, 57, 98, 215, 243, 6, 1, 220, 175, 57, 201, 122, 209, + 38, 248, 18, 201, 91, 201, 122, 209, 38, 248, 18, 211, 14, 201, 122, 209, + 38, 248, 18, 209, 25, 201, 122, 209, 38, 248, 18, 247, 4, 201, 122, 209, + 38, 248, 18, 219, 233, 206, 19, 201, 122, 209, 38, 248, 18, 222, 174, + 206, 19, 201, 122, 209, 38, 248, 18, 238, 1, 206, 19, 201, 122, 209, 38, + 248, 18, 249, 4, 206, 19, 196, 120, 158, 222, 91, 196, 120, 158, 204, 29, + 196, 120, 158, 209, 109, 196, 120, 3, 214, 28, 196, 120, 3, 193, 106, + 216, 158, 201, 82, 196, 120, 158, 193, 106, 251, 76, 223, 177, 201, 82, + 196, 120, 158, 193, 106, 223, 177, 201, 82, 196, 120, 158, 193, 106, 222, + 79, 223, 177, 201, 82, 196, 120, 158, 246, 237, 63, 196, 120, 158, 193, + 106, 222, 79, 223, 177, 201, 83, 205, 242, 196, 120, 158, 55, 201, 82, + 196, 120, 158, 198, 170, 201, 82, 196, 120, 158, 222, 79, 250, 170, 196, + 120, 158, 78, 63, 196, 120, 158, 103, 236, 112, 63, 196, 120, 158, 112, + 236, 112, 63, 196, 120, 158, 207, 89, 222, 90, 223, 177, 201, 82, 196, + 120, 158, 250, 23, 223, 177, 201, 82, 196, 120, 3, 196, 7, 201, 82, 196, + 120, 3, 196, 7, 197, 106, 196, 120, 3, 207, 168, 196, 7, 197, 106, 196, + 120, 3, 196, 7, 250, 170, 196, 120, 3, 207, 168, 196, 7, 250, 170, 196, + 120, 3, 196, 7, 197, 107, 4, 200, 147, 196, 120, 3, 196, 7, 250, 171, 4, + 200, 147, 196, 120, 3, 250, 169, 250, 185, 196, 120, 3, 250, 169, 248, + 226, 196, 120, 3, 250, 169, 196, 147, 196, 120, 3, 250, 169, 196, 148, 4, + 200, 147, 196, 120, 3, 199, 64, 196, 120, 3, 229, 190, 184, 250, 168, + 196, 120, 3, 184, 250, 168, 196, 120, 3, 206, 220, 184, 250, 168, 196, + 120, 3, 250, 169, 197, 113, 215, 223, 196, 120, 3, 250, 108, 196, 120, 3, + 207, 16, 250, 108, 196, 120, 158, 246, 237, 58, 196, 120, 3, 223, 13, + 196, 120, 3, 197, 39, 196, 120, 3, 250, 21, 196, 120, 158, 207, 82, 58, + 196, 120, 158, 55, 207, 82, 58, 196, 120, 3, 55, 250, 169, 250, 185, 8, + 1, 2, 6, 64, 8, 1, 2, 6, 251, 108, 8, 2, 1, 163, 251, 108, 8, 1, 2, 6, + 248, 188, 249, 226, 8, 1, 2, 6, 247, 52, 8, 1, 2, 6, 238, 95, 8, 1, 2, 6, + 233, 235, 8, 1, 2, 6, 71, 8, 2, 1, 163, 211, 184, 71, 8, 2, 1, 163, 70, + 8, 1, 2, 6, 223, 65, 8, 1, 2, 6, 222, 184, 8, 1, 2, 6, 220, 202, 4, 111, + 8, 1, 2, 6, 218, 236, 8, 1, 2, 6, 207, 168, 215, 151, 8, 1, 2, 6, 74, 8, + 1, 2, 6, 211, 184, 74, 8, 2, 1, 203, 109, 74, 8, 2, 1, 203, 109, 211, + 184, 74, 8, 2, 1, 203, 109, 185, 4, 111, 8, 2, 1, 163, 212, 0, 8, 1, 2, + 6, 211, 130, 8, 2, 1, 198, 249, 138, 74, 8, 2, 1, 247, 188, 138, 74, 8, + 1, 2, 6, 211, 93, 8, 1, 2, 6, 207, 168, 150, 8, 1, 2, 6, 163, 150, 8, 1, + 2, 6, 200, 228, 8, 1, 2, 6, 68, 8, 2, 1, 203, 109, 68, 8, 2, 1, 203, 109, + 237, 12, 68, 8, 2, 1, 203, 109, 163, 218, 236, 8, 1, 2, 6, 196, 236, 8, + 1, 2, 6, 194, 202, 8, 1, 2, 6, 192, 155, 8, 1, 2, 6, 233, 166, 8, 1, 195, + 248, 220, 68, 202, 131, 8, 1, 251, 57, 33, 1, 2, 6, 231, 204, 33, 1, 2, + 6, 220, 90, 33, 1, 2, 6, 210, 51, 33, 1, 2, 6, 207, 153, 33, 1, 2, 6, + 209, 62, 42, 1, 2, 6, 234, 124, 73, 1, 6, 64, 73, 1, 6, 251, 108, 73, 1, + 6, 249, 226, 73, 1, 6, 248, 188, 249, 226, 73, 1, 6, 238, 95, 73, 1, 6, + 71, 73, 1, 6, 207, 168, 71, 73, 1, 6, 232, 44, 73, 1, 6, 230, 124, 73, 1, + 6, 70, 73, 1, 6, 223, 65, 73, 1, 6, 222, 184, 73, 1, 6, 165, 73, 1, 6, + 218, 236, 73, 1, 6, 215, 151, 73, 1, 6, 207, 168, 215, 151, 73, 1, 6, 74, + 73, 1, 6, 211, 130, 73, 1, 6, 211, 93, 73, 1, 6, 150, 73, 1, 6, 200, 228, + 73, 1, 6, 68, 73, 1, 6, 194, 202, 73, 1, 2, 64, 73, 1, 2, 163, 64, 73, 1, + 2, 250, 252, 73, 1, 2, 163, 251, 108, 73, 1, 2, 249, 226, 73, 1, 2, 238, + 95, 73, 1, 2, 71, 73, 1, 2, 205, 240, 73, 1, 2, 211, 184, 71, 73, 1, 2, + 163, 211, 184, 71, 73, 1, 2, 232, 44, 73, 1, 2, 163, 70, 73, 1, 2, 222, + 184, 73, 1, 2, 218, 236, 73, 1, 2, 234, 73, 73, 1, 2, 74, 73, 1, 2, 211, + 184, 74, 73, 1, 2, 198, 249, 138, 74, 73, 1, 2, 247, 188, 138, 74, 73, 1, + 2, 211, 93, 73, 1, 2, 200, 228, 73, 1, 2, 68, 73, 1, 2, 203, 109, 68, 73, + 1, 2, 163, 218, 236, 73, 1, 2, 196, 236, 73, 1, 2, 251, 57, 73, 1, 2, + 248, 63, 73, 1, 2, 33, 231, 204, 73, 1, 2, 237, 76, 73, 1, 2, 33, 210, + 77, 73, 1, 2, 242, 215, 8, 201, 155, 2, 1, 70, 8, 201, 155, 2, 1, 150, 8, + 201, 155, 2, 1, 68, 8, 201, 155, 2, 1, 196, 236, 33, 201, 155, 2, 1, 248, + 63, 33, 201, 155, 2, 1, 231, 204, 33, 201, 155, 2, 1, 207, 153, 33, 201, + 155, 2, 1, 210, 77, 33, 201, 155, 2, 1, 242, 215, 8, 2, 1, 197, 104, 8, + 2, 1, 76, 4, 85, 199, 90, 8, 2, 1, 238, 96, 4, 85, 199, 90, 8, 2, 1, 233, + 164, 4, 85, 199, 90, 8, 2, 1, 218, 237, 4, 85, 199, 90, 8, 2, 1, 215, + 152, 4, 85, 199, 90, 8, 2, 1, 211, 94, 4, 85, 199, 90, 8, 2, 1, 208, 112, + 4, 85, 199, 90, 8, 2, 1, 208, 112, 4, 232, 222, 26, 85, 199, 90, 8, 2, 1, + 206, 159, 4, 85, 199, 90, 8, 2, 1, 200, 229, 4, 85, 199, 90, 8, 2, 1, + 192, 156, 4, 85, 199, 90, 8, 2, 1, 163, 232, 44, 73, 1, 42, 234, 88, 8, + 2, 1, 223, 143, 232, 44, 8, 2, 1, 199, 243, 4, 201, 212, 8, 2, 6, 1, 228, + 97, 4, 111, 8, 2, 1, 223, 112, 4, 111, 8, 2, 1, 211, 94, 4, 111, 8, 2, 6, + 1, 124, 4, 111, 8, 2, 1, 197, 35, 4, 111, 8, 2, 1, 76, 4, 211, 49, 128, + 8, 2, 1, 238, 96, 4, 211, 49, 128, 8, 2, 1, 233, 164, 4, 211, 49, 128, 8, + 2, 1, 232, 45, 4, 211, 49, 128, 8, 2, 1, 222, 185, 4, 211, 49, 128, 8, 2, + 1, 220, 202, 4, 211, 49, 128, 8, 2, 1, 218, 237, 4, 211, 49, 128, 8, 2, + 1, 215, 152, 4, 211, 49, 128, 8, 2, 1, 211, 94, 4, 211, 49, 128, 8, 2, 1, + 208, 112, 4, 211, 49, 128, 8, 2, 1, 206, 159, 4, 211, 49, 128, 8, 2, 1, + 234, 0, 4, 211, 49, 128, 8, 2, 1, 196, 237, 4, 211, 49, 128, 8, 2, 1, + 193, 224, 4, 211, 49, 128, 8, 2, 1, 192, 156, 4, 211, 49, 128, 8, 2, 1, + 41, 4, 207, 174, 128, 8, 2, 1, 250, 253, 4, 207, 174, 128, 8, 2, 1, 238, + 96, 4, 229, 15, 26, 200, 147, 8, 2, 1, 234, 253, 4, 207, 174, 128, 8, 2, + 1, 211, 184, 234, 253, 4, 207, 174, 128, 8, 2, 1, 207, 168, 211, 184, + 234, 253, 4, 207, 174, 128, 8, 2, 1, 205, 241, 4, 207, 174, 128, 8, 2, 1, + 228, 97, 4, 207, 174, 128, 8, 2, 1, 211, 184, 185, 4, 207, 174, 128, 8, + 2, 1, 234, 0, 4, 207, 174, 128, 8, 2, 1, 124, 4, 207, 174, 128, 8, 2, 1, + 233, 167, 4, 207, 174, 128, 73, 1, 2, 163, 250, 252, 73, 1, 2, 247, 52, + 73, 1, 2, 247, 53, 4, 238, 142, 73, 1, 2, 233, 235, 73, 1, 2, 207, 168, + 211, 184, 71, 73, 1, 2, 233, 163, 73, 1, 2, 236, 113, 223, 66, 4, 111, + 73, 1, 2, 27, 232, 44, 73, 1, 2, 163, 230, 124, 73, 1, 2, 228, 97, 4, + 111, 73, 1, 2, 223, 111, 73, 1, 2, 6, 70, 73, 1, 2, 6, 228, 97, 4, 111, + 73, 1, 2, 223, 66, 4, 238, 178, 73, 1, 2, 220, 202, 4, 207, 174, 128, 73, + 1, 2, 220, 202, 4, 211, 49, 128, 73, 1, 2, 6, 165, 73, 1, 2, 218, 237, 4, + 128, 73, 1, 2, 163, 218, 237, 4, 184, 220, 16, 73, 1, 2, 215, 152, 4, 46, + 128, 73, 1, 2, 215, 152, 4, 207, 174, 128, 73, 1, 2, 6, 215, 151, 73, 1, + 2, 248, 188, 74, 73, 1, 2, 210, 77, 73, 1, 2, 206, 159, 4, 128, 73, 1, 2, + 233, 255, 73, 1, 2, 200, 229, 4, 211, 49, 128, 73, 1, 2, 124, 161, 73, 1, + 2, 197, 34, 73, 1, 2, 6, 68, 73, 1, 2, 196, 237, 4, 128, 73, 1, 2, 163, + 196, 236, 73, 1, 2, 192, 155, 73, 1, 2, 192, 156, 4, 207, 174, 128, 73, + 1, 2, 192, 156, 4, 238, 142, 73, 1, 2, 233, 166, 73, 1, 2, 199, 206, 38, + 235, 111, 230, 211, 251, 143, 38, 235, 111, 251, 130, 251, 143, 38, 202, + 225, 63, 38, 201, 89, 77, 38, 217, 213, 38, 230, 208, 38, 217, 211, 38, + 251, 127, 38, 230, 209, 38, 251, 128, 38, 8, 2, 1, 208, 112, 63, 38, 247, + 149, 38, 217, 212, 38, 55, 242, 122, 58, 38, 211, 244, 58, 38, 192, 21, + 63, 38, 223, 97, 63, 38, 197, 28, 58, 38, 197, 11, 58, 38, 8, 2, 1, 232, + 192, 211, 184, 41, 58, 38, 8, 2, 1, 251, 108, 38, 8, 2, 1, 250, 166, 38, + 8, 2, 1, 249, 247, 38, 8, 2, 1, 247, 53, 246, 151, 38, 8, 2, 1, 223, 143, + 238, 95, 38, 8, 2, 1, 233, 235, 38, 8, 2, 1, 232, 44, 38, 8, 1, 2, 6, + 232, 44, 38, 8, 2, 1, 222, 184, 38, 8, 2, 1, 165, 38, 8, 1, 2, 6, 165, + 38, 8, 1, 2, 6, 218, 236, 38, 8, 2, 1, 215, 151, 38, 8, 1, 2, 6, 215, + 151, 38, 8, 1, 2, 6, 150, 38, 8, 2, 1, 208, 112, 207, 10, 38, 8, 2, 1, + 206, 158, 38, 8, 2, 1, 184, 206, 158, 38, 8, 2, 1, 192, 155, 38, 8, 2, 1, + 250, 252, 38, 8, 2, 1, 249, 226, 38, 8, 2, 1, 248, 63, 38, 8, 2, 1, 205, + 240, 38, 8, 2, 1, 233, 163, 38, 8, 2, 1, 220, 202, 4, 55, 85, 199, 90, + 38, 8, 2, 1, 185, 4, 152, 246, 139, 111, 38, 8, 2, 1, 211, 93, 38, 8, 2, + 1, 233, 255, 38, 8, 2, 1, 124, 4, 152, 246, 139, 111, 38, 8, 2, 1, 194, + 202, 38, 8, 2, 1, 41, 4, 237, 14, 38, 8, 2, 1, 185, 4, 237, 14, 38, 8, 2, + 1, 124, 4, 237, 14, 38, 130, 200, 160, 58, 38, 222, 70, 95, 207, 101, 38, + 222, 70, 95, 220, 28, 38, 78, 95, 220, 28, 38, 194, 64, 223, 121, 247, + 143, 63, 38, 237, 85, 77, 38, 55, 223, 121, 247, 151, 63, 38, 251, 1, + 187, 115, 63, 38, 46, 250, 78, 58, 38, 51, 250, 78, 26, 142, 250, 78, 63, + 8, 6, 1, 41, 4, 207, 82, 63, 8, 2, 1, 41, 4, 207, 82, 63, 8, 6, 1, 76, 4, + 78, 58, 8, 2, 1, 76, 4, 78, 58, 8, 6, 1, 76, 4, 78, 63, 8, 2, 1, 76, 4, + 78, 63, 8, 6, 1, 76, 4, 219, 176, 63, 8, 2, 1, 76, 4, 219, 176, 63, 8, 6, + 1, 247, 53, 4, 246, 152, 26, 251, 129, 8, 2, 1, 247, 53, 4, 246, 152, 26, + 251, 129, 8, 6, 1, 238, 96, 4, 78, 58, 8, 2, 1, 238, 96, 4, 78, 58, 8, 6, + 1, 238, 96, 4, 78, 63, 8, 2, 1, 238, 96, 4, 78, 63, 8, 6, 1, 238, 96, 4, + 219, 176, 63, 8, 2, 1, 238, 96, 4, 219, 176, 63, 8, 6, 1, 238, 96, 4, + 246, 151, 8, 2, 1, 238, 96, 4, 246, 151, 8, 6, 1, 238, 96, 4, 242, 122, + 63, 8, 2, 1, 238, 96, 4, 242, 122, 63, 8, 6, 1, 234, 253, 4, 217, 215, + 26, 230, 210, 8, 2, 1, 234, 253, 4, 217, 215, 26, 230, 210, 8, 6, 1, 234, + 253, 4, 217, 215, 26, 251, 129, 8, 2, 1, 234, 253, 4, 217, 215, 26, 251, + 129, 8, 6, 1, 234, 253, 4, 242, 122, 63, 8, 2, 1, 234, 253, 4, 242, 122, + 63, 8, 6, 1, 234, 253, 4, 199, 91, 63, 8, 2, 1, 234, 253, 4, 199, 91, 63, + 8, 6, 1, 234, 253, 4, 246, 152, 26, 247, 150, 8, 2, 1, 234, 253, 4, 246, + 152, 26, 247, 150, 8, 6, 1, 233, 164, 4, 78, 58, 8, 2, 1, 233, 164, 4, + 78, 58, 8, 6, 1, 232, 45, 4, 217, 214, 8, 2, 1, 232, 45, 4, 217, 214, 8, + 6, 1, 230, 125, 4, 78, 58, 8, 2, 1, 230, 125, 4, 78, 58, 8, 6, 1, 230, + 125, 4, 78, 63, 8, 2, 1, 230, 125, 4, 78, 63, 8, 6, 1, 230, 125, 4, 237, + 14, 8, 2, 1, 230, 125, 4, 237, 14, 8, 6, 1, 230, 125, 4, 246, 151, 8, 2, + 1, 230, 125, 4, 246, 151, 8, 6, 1, 230, 125, 4, 247, 151, 63, 8, 2, 1, + 230, 125, 4, 247, 151, 63, 8, 6, 1, 228, 97, 4, 199, 91, 63, 8, 2, 1, + 228, 97, 4, 199, 91, 63, 8, 6, 1, 228, 97, 4, 237, 15, 26, 251, 129, 8, + 2, 1, 228, 97, 4, 237, 15, 26, 251, 129, 8, 6, 1, 222, 185, 4, 251, 129, + 8, 2, 1, 222, 185, 4, 251, 129, 8, 6, 1, 222, 185, 4, 78, 63, 8, 2, 1, + 222, 185, 4, 78, 63, 8, 6, 1, 222, 185, 4, 219, 176, 63, 8, 2, 1, 222, + 185, 4, 219, 176, 63, 8, 6, 1, 220, 202, 4, 78, 63, 8, 2, 1, 220, 202, 4, + 78, 63, 8, 6, 1, 220, 202, 4, 78, 248, 84, 26, 217, 214, 8, 2, 1, 220, + 202, 4, 78, 248, 84, 26, 217, 214, 8, 6, 1, 220, 202, 4, 219, 176, 63, 8, + 2, 1, 220, 202, 4, 219, 176, 63, 8, 6, 1, 220, 202, 4, 242, 122, 63, 8, + 2, 1, 220, 202, 4, 242, 122, 63, 8, 6, 1, 218, 237, 4, 251, 129, 8, 2, 1, + 218, 237, 4, 251, 129, 8, 6, 1, 218, 237, 4, 78, 58, 8, 2, 1, 218, 237, + 4, 78, 58, 8, 6, 1, 218, 237, 4, 78, 63, 8, 2, 1, 218, 237, 4, 78, 63, 8, + 6, 1, 215, 152, 4, 78, 58, 8, 2, 1, 215, 152, 4, 78, 58, 8, 6, 1, 215, + 152, 4, 78, 63, 8, 2, 1, 215, 152, 4, 78, 63, 8, 6, 1, 215, 152, 4, 219, + 176, 63, 8, 2, 1, 215, 152, 4, 219, 176, 63, 8, 6, 1, 215, 152, 4, 242, + 122, 63, 8, 2, 1, 215, 152, 4, 242, 122, 63, 8, 6, 1, 185, 4, 199, 91, + 26, 251, 129, 8, 2, 1, 185, 4, 199, 91, 26, 251, 129, 8, 6, 1, 185, 4, + 199, 91, 26, 237, 14, 8, 2, 1, 185, 4, 199, 91, 26, 237, 14, 8, 6, 1, + 185, 4, 217, 215, 26, 230, 210, 8, 2, 1, 185, 4, 217, 215, 26, 230, 210, + 8, 6, 1, 185, 4, 217, 215, 26, 251, 129, 8, 2, 1, 185, 4, 217, 215, 26, + 251, 129, 8, 6, 1, 211, 94, 4, 251, 129, 8, 2, 1, 211, 94, 4, 251, 129, + 8, 6, 1, 211, 94, 4, 78, 58, 8, 2, 1, 211, 94, 4, 78, 58, 8, 6, 1, 208, + 112, 4, 78, 58, 8, 2, 1, 208, 112, 4, 78, 58, 8, 6, 1, 208, 112, 4, 78, + 63, 8, 2, 1, 208, 112, 4, 78, 63, 8, 6, 1, 208, 112, 4, 78, 248, 84, 26, + 217, 214, 8, 2, 1, 208, 112, 4, 78, 248, 84, 26, 217, 214, 8, 6, 1, 208, + 112, 4, 219, 176, 63, 8, 2, 1, 208, 112, 4, 219, 176, 63, 8, 6, 1, 206, + 159, 4, 78, 58, 8, 2, 1, 206, 159, 4, 78, 58, 8, 6, 1, 206, 159, 4, 78, + 63, 8, 2, 1, 206, 159, 4, 78, 63, 8, 6, 1, 206, 159, 4, 251, 130, 26, 78, + 58, 8, 2, 1, 206, 159, 4, 251, 130, 26, 78, 58, 8, 6, 1, 206, 159, 4, + 246, 208, 26, 78, 58, 8, 2, 1, 206, 159, 4, 246, 208, 26, 78, 58, 8, 6, + 1, 206, 159, 4, 78, 248, 84, 26, 78, 58, 8, 2, 1, 206, 159, 4, 78, 248, + 84, 26, 78, 58, 8, 6, 1, 200, 229, 4, 78, 58, 8, 2, 1, 200, 229, 4, 78, + 58, 8, 6, 1, 200, 229, 4, 78, 63, 8, 2, 1, 200, 229, 4, 78, 63, 8, 6, 1, + 200, 229, 4, 219, 176, 63, 8, 2, 1, 200, 229, 4, 219, 176, 63, 8, 6, 1, + 200, 229, 4, 242, 122, 63, 8, 2, 1, 200, 229, 4, 242, 122, 63, 8, 6, 1, + 124, 4, 237, 15, 63, 8, 2, 1, 124, 4, 237, 15, 63, 8, 6, 1, 124, 4, 199, + 91, 63, 8, 2, 1, 124, 4, 199, 91, 63, 8, 6, 1, 124, 4, 242, 122, 63, 8, + 2, 1, 124, 4, 242, 122, 63, 8, 6, 1, 124, 4, 199, 91, 26, 251, 129, 8, 2, + 1, 124, 4, 199, 91, 26, 251, 129, 8, 6, 1, 124, 4, 217, 215, 26, 237, 14, + 8, 2, 1, 124, 4, 217, 215, 26, 237, 14, 8, 6, 1, 196, 237, 4, 199, 90, 8, + 2, 1, 196, 237, 4, 199, 90, 8, 6, 1, 196, 237, 4, 78, 63, 8, 2, 1, 196, + 237, 4, 78, 63, 8, 6, 1, 194, 203, 4, 230, 210, 8, 2, 1, 194, 203, 4, + 230, 210, 8, 6, 1, 194, 203, 4, 251, 129, 8, 2, 1, 194, 203, 4, 251, 129, + 8, 6, 1, 194, 203, 4, 237, 14, 8, 2, 1, 194, 203, 4, 237, 14, 8, 6, 1, + 194, 203, 4, 78, 58, 8, 2, 1, 194, 203, 4, 78, 58, 8, 6, 1, 194, 203, 4, + 78, 63, 8, 2, 1, 194, 203, 4, 78, 63, 8, 6, 1, 193, 224, 4, 78, 58, 8, 2, + 1, 193, 224, 4, 78, 58, 8, 6, 1, 193, 224, 4, 237, 14, 8, 2, 1, 193, 224, + 4, 237, 14, 8, 6, 1, 193, 149, 4, 78, 58, 8, 2, 1, 193, 149, 4, 78, 58, + 8, 6, 1, 192, 156, 4, 242, 121, 8, 2, 1, 192, 156, 4, 242, 121, 8, 6, 1, + 192, 156, 4, 78, 63, 8, 2, 1, 192, 156, 4, 78, 63, 8, 6, 1, 192, 156, 4, + 219, 176, 63, 8, 2, 1, 192, 156, 4, 219, 176, 63, 8, 2, 1, 230, 125, 4, + 219, 176, 63, 8, 2, 1, 200, 229, 4, 237, 14, 8, 2, 1, 194, 203, 4, 207, + 82, 58, 8, 2, 1, 193, 149, 4, 207, 82, 58, 8, 2, 1, 41, 4, 51, 138, 207, + 81, 8, 2, 1, 184, 206, 159, 4, 78, 58, 8, 2, 1, 184, 206, 159, 4, 237, + 11, 111, 8, 2, 1, 184, 206, 159, 4, 139, 111, 8, 6, 1, 204, 26, 206, 158, + 8, 2, 1, 237, 76, 8, 6, 1, 41, 4, 78, 63, 8, 2, 1, 41, 4, 78, 63, 8, 6, + 1, 41, 4, 229, 15, 58, 8, 2, 1, 41, 4, 229, 15, 58, 8, 6, 1, 41, 4, 242, + 122, 26, 251, 129, 8, 2, 1, 41, 4, 242, 122, 26, 251, 129, 8, 6, 1, 41, + 4, 242, 122, 26, 230, 210, 8, 2, 1, 41, 4, 242, 122, 26, 230, 210, 8, 6, + 1, 41, 4, 242, 122, 26, 229, 15, 58, 8, 2, 1, 41, 4, 242, 122, 26, 229, + 15, 58, 8, 6, 1, 41, 4, 242, 122, 26, 199, 90, 8, 2, 1, 41, 4, 242, 122, + 26, 199, 90, 8, 6, 1, 41, 4, 242, 122, 26, 78, 63, 8, 2, 1, 41, 4, 242, + 122, 26, 78, 63, 8, 6, 1, 41, 4, 247, 151, 26, 251, 129, 8, 2, 1, 41, 4, + 247, 151, 26, 251, 129, 8, 6, 1, 41, 4, 247, 151, 26, 230, 210, 8, 2, 1, + 41, 4, 247, 151, 26, 230, 210, 8, 6, 1, 41, 4, 247, 151, 26, 229, 15, 58, + 8, 2, 1, 41, 4, 247, 151, 26, 229, 15, 58, 8, 6, 1, 41, 4, 247, 151, 26, + 199, 90, 8, 2, 1, 41, 4, 247, 151, 26, 199, 90, 8, 6, 1, 41, 4, 247, 151, + 26, 78, 63, 8, 2, 1, 41, 4, 247, 151, 26, 78, 63, 8, 6, 1, 234, 253, 4, + 78, 63, 8, 2, 1, 234, 253, 4, 78, 63, 8, 6, 1, 234, 253, 4, 229, 15, 58, + 8, 2, 1, 234, 253, 4, 229, 15, 58, 8, 6, 1, 234, 253, 4, 199, 90, 8, 2, + 1, 234, 253, 4, 199, 90, 8, 6, 1, 234, 253, 4, 242, 122, 26, 251, 129, 8, + 2, 1, 234, 253, 4, 242, 122, 26, 251, 129, 8, 6, 1, 234, 253, 4, 242, + 122, 26, 230, 210, 8, 2, 1, 234, 253, 4, 242, 122, 26, 230, 210, 8, 6, 1, + 234, 253, 4, 242, 122, 26, 229, 15, 58, 8, 2, 1, 234, 253, 4, 242, 122, + 26, 229, 15, 58, 8, 6, 1, 234, 253, 4, 242, 122, 26, 199, 90, 8, 2, 1, + 234, 253, 4, 242, 122, 26, 199, 90, 8, 6, 1, 234, 253, 4, 242, 122, 26, + 78, 63, 8, 2, 1, 234, 253, 4, 242, 122, 26, 78, 63, 8, 6, 1, 228, 97, 4, + 229, 15, 58, 8, 2, 1, 228, 97, 4, 229, 15, 58, 8, 6, 1, 228, 97, 4, 78, + 63, 8, 2, 1, 228, 97, 4, 78, 63, 8, 6, 1, 185, 4, 78, 63, 8, 2, 1, 185, + 4, 78, 63, 8, 6, 1, 185, 4, 229, 15, 58, 8, 2, 1, 185, 4, 229, 15, 58, 8, + 6, 1, 185, 4, 242, 122, 26, 251, 129, 8, 2, 1, 185, 4, 242, 122, 26, 251, + 129, 8, 6, 1, 185, 4, 242, 122, 26, 230, 210, 8, 2, 1, 185, 4, 242, 122, + 26, 230, 210, 8, 6, 1, 185, 4, 242, 122, 26, 229, 15, 58, 8, 2, 1, 185, + 4, 242, 122, 26, 229, 15, 58, 8, 6, 1, 185, 4, 242, 122, 26, 199, 90, 8, + 2, 1, 185, 4, 242, 122, 26, 199, 90, 8, 6, 1, 185, 4, 242, 122, 26, 78, + 63, 8, 2, 1, 185, 4, 242, 122, 26, 78, 63, 8, 6, 1, 185, 4, 228, 209, 26, + 251, 129, 8, 2, 1, 185, 4, 228, 209, 26, 251, 129, 8, 6, 1, 185, 4, 228, + 209, 26, 230, 210, 8, 2, 1, 185, 4, 228, 209, 26, 230, 210, 8, 6, 1, 185, + 4, 228, 209, 26, 229, 15, 58, 8, 2, 1, 185, 4, 228, 209, 26, 229, 15, 58, + 8, 6, 1, 185, 4, 228, 209, 26, 199, 90, 8, 2, 1, 185, 4, 228, 209, 26, + 199, 90, 8, 6, 1, 185, 4, 228, 209, 26, 78, 63, 8, 2, 1, 185, 4, 228, + 209, 26, 78, 63, 8, 6, 1, 124, 4, 78, 63, 8, 2, 1, 124, 4, 78, 63, 8, 6, + 1, 124, 4, 229, 15, 58, 8, 2, 1, 124, 4, 229, 15, 58, 8, 6, 1, 124, 4, + 228, 209, 26, 251, 129, 8, 2, 1, 124, 4, 228, 209, 26, 251, 129, 8, 6, 1, + 124, 4, 228, 209, 26, 230, 210, 8, 2, 1, 124, 4, 228, 209, 26, 230, 210, + 8, 6, 1, 124, 4, 228, 209, 26, 229, 15, 58, 8, 2, 1, 124, 4, 228, 209, + 26, 229, 15, 58, 8, 6, 1, 124, 4, 228, 209, 26, 199, 90, 8, 2, 1, 124, 4, + 228, 209, 26, 199, 90, 8, 6, 1, 124, 4, 228, 209, 26, 78, 63, 8, 2, 1, + 124, 4, 228, 209, 26, 78, 63, 8, 6, 1, 193, 149, 4, 230, 210, 8, 2, 1, + 193, 149, 4, 230, 210, 8, 6, 1, 193, 149, 4, 78, 63, 8, 2, 1, 193, 149, + 4, 78, 63, 8, 6, 1, 193, 149, 4, 229, 15, 58, 8, 2, 1, 193, 149, 4, 229, + 15, 58, 8, 6, 1, 193, 149, 4, 199, 90, 8, 2, 1, 193, 149, 4, 199, 90, 8, + 6, 1, 216, 159, 219, 138, 8, 2, 1, 216, 159, 219, 138, 8, 6, 1, 216, 159, + 196, 236, 8, 2, 1, 216, 159, 196, 236, 8, 6, 1, 193, 149, 4, 219, 69, 8, + 2, 1, 193, 149, 4, 219, 69, 33, 2, 1, 250, 253, 4, 209, 55, 33, 2, 1, + 250, 253, 4, 237, 182, 33, 2, 1, 250, 253, 4, 209, 56, 26, 196, 138, 33, + 2, 1, 250, 253, 4, 237, 183, 26, 196, 138, 33, 2, 1, 250, 253, 4, 209, + 56, 26, 211, 99, 33, 2, 1, 250, 253, 4, 237, 183, 26, 211, 99, 33, 2, 1, + 250, 253, 4, 209, 56, 26, 210, 126, 33, 2, 1, 250, 253, 4, 237, 183, 26, + 210, 126, 33, 6, 1, 250, 253, 4, 209, 55, 33, 6, 1, 250, 253, 4, 237, + 182, 33, 6, 1, 250, 253, 4, 209, 56, 26, 196, 138, 33, 6, 1, 250, 253, 4, + 237, 183, 26, 196, 138, 33, 6, 1, 250, 253, 4, 209, 56, 26, 211, 99, 33, + 6, 1, 250, 253, 4, 237, 183, 26, 211, 99, 33, 6, 1, 250, 253, 4, 209, 56, + 26, 210, 126, 33, 6, 1, 250, 253, 4, 237, 183, 26, 210, 126, 33, 2, 1, + 234, 33, 4, 209, 55, 33, 2, 1, 234, 33, 4, 237, 182, 33, 2, 1, 234, 33, + 4, 209, 56, 26, 196, 138, 33, 2, 1, 234, 33, 4, 237, 183, 26, 196, 138, + 33, 2, 1, 234, 33, 4, 209, 56, 26, 211, 99, 33, 2, 1, 234, 33, 4, 237, + 183, 26, 211, 99, 33, 6, 1, 234, 33, 4, 209, 55, 33, 6, 1, 234, 33, 4, + 237, 182, 33, 6, 1, 234, 33, 4, 209, 56, 26, 196, 138, 33, 6, 1, 234, 33, + 4, 237, 183, 26, 196, 138, 33, 6, 1, 234, 33, 4, 209, 56, 26, 211, 99, + 33, 6, 1, 234, 33, 4, 237, 183, 26, 211, 99, 33, 2, 1, 233, 241, 4, 209, + 55, 33, 2, 1, 233, 241, 4, 237, 182, 33, 2, 1, 233, 241, 4, 209, 56, 26, + 196, 138, 33, 2, 1, 233, 241, 4, 237, 183, 26, 196, 138, 33, 2, 1, 233, + 241, 4, 209, 56, 26, 211, 99, 33, 2, 1, 233, 241, 4, 237, 183, 26, 211, + 99, 33, 2, 1, 233, 241, 4, 209, 56, 26, 210, 126, 33, 2, 1, 233, 241, 4, + 237, 183, 26, 210, 126, 33, 6, 1, 233, 241, 4, 209, 55, 33, 6, 1, 233, + 241, 4, 237, 182, 33, 6, 1, 233, 241, 4, 209, 56, 26, 196, 138, 33, 6, 1, + 233, 241, 4, 237, 183, 26, 196, 138, 33, 6, 1, 233, 241, 4, 209, 56, 26, + 211, 99, 33, 6, 1, 233, 241, 4, 237, 183, 26, 211, 99, 33, 6, 1, 233, + 241, 4, 209, 56, 26, 210, 126, 33, 6, 1, 233, 241, 4, 237, 183, 26, 210, + 126, 33, 2, 1, 223, 112, 4, 209, 55, 33, 2, 1, 223, 112, 4, 237, 182, 33, + 2, 1, 223, 112, 4, 209, 56, 26, 196, 138, 33, 2, 1, 223, 112, 4, 237, + 183, 26, 196, 138, 33, 2, 1, 223, 112, 4, 209, 56, 26, 211, 99, 33, 2, 1, + 223, 112, 4, 237, 183, 26, 211, 99, 33, 2, 1, 223, 112, 4, 209, 56, 26, + 210, 126, 33, 2, 1, 223, 112, 4, 237, 183, 26, 210, 126, 33, 6, 1, 223, + 112, 4, 209, 55, 33, 6, 1, 223, 112, 4, 237, 182, 33, 6, 1, 223, 112, 4, + 209, 56, 26, 196, 138, 33, 6, 1, 223, 112, 4, 237, 183, 26, 196, 138, 33, + 6, 1, 223, 112, 4, 209, 56, 26, 211, 99, 33, 6, 1, 223, 112, 4, 237, 183, + 26, 211, 99, 33, 6, 1, 223, 112, 4, 209, 56, 26, 210, 126, 33, 6, 1, 223, + 112, 4, 237, 183, 26, 210, 126, 33, 2, 1, 211, 215, 4, 209, 55, 33, 2, 1, + 211, 215, 4, 237, 182, 33, 2, 1, 211, 215, 4, 209, 56, 26, 196, 138, 33, + 2, 1, 211, 215, 4, 237, 183, 26, 196, 138, 33, 2, 1, 211, 215, 4, 209, + 56, 26, 211, 99, 33, 2, 1, 211, 215, 4, 237, 183, 26, 211, 99, 33, 6, 1, + 211, 215, 4, 209, 55, 33, 6, 1, 211, 215, 4, 237, 182, 33, 6, 1, 211, + 215, 4, 209, 56, 26, 196, 138, 33, 6, 1, 211, 215, 4, 237, 183, 26, 196, + 138, 33, 6, 1, 211, 215, 4, 209, 56, 26, 211, 99, 33, 6, 1, 211, 215, 4, + 237, 183, 26, 211, 99, 33, 2, 1, 197, 35, 4, 209, 55, 33, 2, 1, 197, 35, + 4, 237, 182, 33, 2, 1, 197, 35, 4, 209, 56, 26, 196, 138, 33, 2, 1, 197, + 35, 4, 237, 183, 26, 196, 138, 33, 2, 1, 197, 35, 4, 209, 56, 26, 211, + 99, 33, 2, 1, 197, 35, 4, 237, 183, 26, 211, 99, 33, 2, 1, 197, 35, 4, + 209, 56, 26, 210, 126, 33, 2, 1, 197, 35, 4, 237, 183, 26, 210, 126, 33, + 6, 1, 197, 35, 4, 237, 182, 33, 6, 1, 197, 35, 4, 237, 183, 26, 196, 138, + 33, 6, 1, 197, 35, 4, 237, 183, 26, 211, 99, 33, 6, 1, 197, 35, 4, 237, + 183, 26, 210, 126, 33, 2, 1, 211, 217, 4, 209, 55, 33, 2, 1, 211, 217, 4, + 237, 182, 33, 2, 1, 211, 217, 4, 209, 56, 26, 196, 138, 33, 2, 1, 211, + 217, 4, 237, 183, 26, 196, 138, 33, 2, 1, 211, 217, 4, 209, 56, 26, 211, + 99, 33, 2, 1, 211, 217, 4, 237, 183, 26, 211, 99, 33, 2, 1, 211, 217, 4, + 209, 56, 26, 210, 126, 33, 2, 1, 211, 217, 4, 237, 183, 26, 210, 126, 33, + 6, 1, 211, 217, 4, 209, 55, 33, 6, 1, 211, 217, 4, 237, 182, 33, 6, 1, + 211, 217, 4, 209, 56, 26, 196, 138, 33, 6, 1, 211, 217, 4, 237, 183, 26, + 196, 138, 33, 6, 1, 211, 217, 4, 209, 56, 26, 211, 99, 33, 6, 1, 211, + 217, 4, 237, 183, 26, 211, 99, 33, 6, 1, 211, 217, 4, 209, 56, 26, 210, + 126, 33, 6, 1, 211, 217, 4, 237, 183, 26, 210, 126, 33, 2, 1, 250, 253, + 4, 196, 138, 33, 2, 1, 250, 253, 4, 211, 99, 33, 2, 1, 234, 33, 4, 196, + 138, 33, 2, 1, 234, 33, 4, 211, 99, 33, 2, 1, 233, 241, 4, 196, 138, 33, + 2, 1, 233, 241, 4, 211, 99, 33, 2, 1, 223, 112, 4, 196, 138, 33, 2, 1, + 223, 112, 4, 211, 99, 33, 2, 1, 211, 215, 4, 196, 138, 33, 2, 1, 211, + 215, 4, 211, 99, 33, 2, 1, 197, 35, 4, 196, 138, 33, 2, 1, 197, 35, 4, + 211, 99, 33, 2, 1, 211, 217, 4, 196, 138, 33, 2, 1, 211, 217, 4, 211, 99, + 33, 2, 1, 250, 253, 4, 209, 56, 26, 192, 222, 33, 2, 1, 250, 253, 4, 237, + 183, 26, 192, 222, 33, 2, 1, 250, 253, 4, 209, 56, 26, 196, 139, 26, 192, + 222, 33, 2, 1, 250, 253, 4, 237, 183, 26, 196, 139, 26, 192, 222, 33, 2, + 1, 250, 253, 4, 209, 56, 26, 211, 100, 26, 192, 222, 33, 2, 1, 250, 253, + 4, 237, 183, 26, 211, 100, 26, 192, 222, 33, 2, 1, 250, 253, 4, 209, 56, + 26, 210, 127, 26, 192, 222, 33, 2, 1, 250, 253, 4, 237, 183, 26, 210, + 127, 26, 192, 222, 33, 6, 1, 250, 253, 4, 209, 56, 26, 209, 69, 33, 6, 1, + 250, 253, 4, 237, 183, 26, 209, 69, 33, 6, 1, 250, 253, 4, 209, 56, 26, + 196, 139, 26, 209, 69, 33, 6, 1, 250, 253, 4, 237, 183, 26, 196, 139, 26, + 209, 69, 33, 6, 1, 250, 253, 4, 209, 56, 26, 211, 100, 26, 209, 69, 33, + 6, 1, 250, 253, 4, 237, 183, 26, 211, 100, 26, 209, 69, 33, 6, 1, 250, + 253, 4, 209, 56, 26, 210, 127, 26, 209, 69, 33, 6, 1, 250, 253, 4, 237, + 183, 26, 210, 127, 26, 209, 69, 33, 2, 1, 233, 241, 4, 209, 56, 26, 192, + 222, 33, 2, 1, 233, 241, 4, 237, 183, 26, 192, 222, 33, 2, 1, 233, 241, + 4, 209, 56, 26, 196, 139, 26, 192, 222, 33, 2, 1, 233, 241, 4, 237, 183, + 26, 196, 139, 26, 192, 222, 33, 2, 1, 233, 241, 4, 209, 56, 26, 211, 100, + 26, 192, 222, 33, 2, 1, 233, 241, 4, 237, 183, 26, 211, 100, 26, 192, + 222, 33, 2, 1, 233, 241, 4, 209, 56, 26, 210, 127, 26, 192, 222, 33, 2, + 1, 233, 241, 4, 237, 183, 26, 210, 127, 26, 192, 222, 33, 6, 1, 233, 241, + 4, 209, 56, 26, 209, 69, 33, 6, 1, 233, 241, 4, 237, 183, 26, 209, 69, + 33, 6, 1, 233, 241, 4, 209, 56, 26, 196, 139, 26, 209, 69, 33, 6, 1, 233, + 241, 4, 237, 183, 26, 196, 139, 26, 209, 69, 33, 6, 1, 233, 241, 4, 209, + 56, 26, 211, 100, 26, 209, 69, 33, 6, 1, 233, 241, 4, 237, 183, 26, 211, + 100, 26, 209, 69, 33, 6, 1, 233, 241, 4, 209, 56, 26, 210, 127, 26, 209, + 69, 33, 6, 1, 233, 241, 4, 237, 183, 26, 210, 127, 26, 209, 69, 33, 2, 1, + 211, 217, 4, 209, 56, 26, 192, 222, 33, 2, 1, 211, 217, 4, 237, 183, 26, + 192, 222, 33, 2, 1, 211, 217, 4, 209, 56, 26, 196, 139, 26, 192, 222, 33, + 2, 1, 211, 217, 4, 237, 183, 26, 196, 139, 26, 192, 222, 33, 2, 1, 211, + 217, 4, 209, 56, 26, 211, 100, 26, 192, 222, 33, 2, 1, 211, 217, 4, 237, + 183, 26, 211, 100, 26, 192, 222, 33, 2, 1, 211, 217, 4, 209, 56, 26, 210, + 127, 26, 192, 222, 33, 2, 1, 211, 217, 4, 237, 183, 26, 210, 127, 26, + 192, 222, 33, 6, 1, 211, 217, 4, 209, 56, 26, 209, 69, 33, 6, 1, 211, + 217, 4, 237, 183, 26, 209, 69, 33, 6, 1, 211, 217, 4, 209, 56, 26, 196, + 139, 26, 209, 69, 33, 6, 1, 211, 217, 4, 237, 183, 26, 196, 139, 26, 209, + 69, 33, 6, 1, 211, 217, 4, 209, 56, 26, 211, 100, 26, 209, 69, 33, 6, 1, + 211, 217, 4, 237, 183, 26, 211, 100, 26, 209, 69, 33, 6, 1, 211, 217, 4, + 209, 56, 26, 210, 127, 26, 209, 69, 33, 6, 1, 211, 217, 4, 237, 183, 26, + 210, 127, 26, 209, 69, 33, 2, 1, 250, 253, 4, 195, 227, 33, 2, 1, 250, + 253, 4, 217, 214, 33, 2, 1, 250, 253, 4, 196, 139, 26, 192, 222, 33, 2, + 1, 250, 253, 4, 192, 222, 33, 2, 1, 250, 253, 4, 211, 100, 26, 192, 222, + 33, 2, 1, 250, 253, 4, 210, 126, 33, 2, 1, 250, 253, 4, 210, 127, 26, + 192, 222, 33, 6, 1, 250, 253, 4, 195, 227, 33, 6, 1, 250, 253, 4, 217, + 214, 33, 6, 1, 250, 253, 4, 196, 138, 33, 6, 1, 250, 253, 4, 211, 99, 33, + 6, 1, 250, 253, 4, 209, 69, 33, 221, 78, 33, 209, 69, 33, 209, 55, 33, + 210, 126, 33, 237, 8, 26, 210, 126, 33, 2, 1, 233, 241, 4, 196, 139, 26, + 192, 222, 33, 2, 1, 233, 241, 4, 192, 222, 33, 2, 1, 233, 241, 4, 211, + 100, 26, 192, 222, 33, 2, 1, 233, 241, 4, 210, 126, 33, 2, 1, 233, 241, + 4, 210, 127, 26, 192, 222, 33, 6, 1, 234, 33, 4, 196, 138, 33, 6, 1, 234, + 33, 4, 211, 99, 33, 6, 1, 233, 241, 4, 196, 138, 33, 6, 1, 233, 241, 4, + 211, 99, 33, 6, 1, 233, 241, 4, 209, 69, 33, 209, 56, 26, 196, 138, 33, + 209, 56, 26, 211, 99, 33, 209, 56, 26, 210, 126, 33, 2, 1, 223, 112, 4, + 195, 227, 33, 2, 1, 223, 112, 4, 217, 214, 33, 2, 1, 223, 112, 4, 237, 8, + 26, 196, 138, 33, 2, 1, 223, 112, 4, 237, 8, 26, 211, 99, 33, 2, 1, 223, + 112, 4, 210, 126, 33, 2, 1, 223, 112, 4, 237, 8, 26, 210, 126, 33, 6, 1, + 223, 112, 4, 195, 227, 33, 6, 1, 223, 112, 4, 217, 214, 33, 6, 1, 223, + 112, 4, 196, 138, 33, 6, 1, 223, 112, 4, 211, 99, 33, 237, 183, 26, 196, + 138, 33, 237, 183, 26, 211, 99, 33, 237, 183, 26, 210, 126, 33, 2, 1, + 197, 35, 4, 195, 227, 33, 2, 1, 197, 35, 4, 217, 214, 33, 2, 1, 197, 35, + 4, 237, 8, 26, 196, 138, 33, 2, 1, 197, 35, 4, 237, 8, 26, 211, 99, 33, + 2, 1, 207, 154, 4, 209, 55, 33, 2, 1, 207, 154, 4, 237, 182, 33, 2, 1, + 197, 35, 4, 210, 126, 33, 2, 1, 197, 35, 4, 237, 8, 26, 210, 126, 33, 6, + 1, 197, 35, 4, 195, 227, 33, 6, 1, 197, 35, 4, 217, 214, 33, 6, 1, 197, + 35, 4, 196, 138, 33, 6, 1, 197, 35, 4, 211, 99, 33, 6, 1, 207, 154, 4, + 237, 182, 33, 237, 8, 26, 196, 138, 33, 237, 8, 26, 211, 99, 33, 196, + 138, 33, 2, 1, 211, 217, 4, 196, 139, 26, 192, 222, 33, 2, 1, 211, 217, + 4, 192, 222, 33, 2, 1, 211, 217, 4, 211, 100, 26, 192, 222, 33, 2, 1, + 211, 217, 4, 210, 126, 33, 2, 1, 211, 217, 4, 210, 127, 26, 192, 222, 33, + 6, 1, 211, 215, 4, 196, 138, 33, 6, 1, 211, 215, 4, 211, 99, 33, 6, 1, + 211, 217, 4, 196, 138, 33, 6, 1, 211, 217, 4, 211, 99, 33, 6, 1, 211, + 217, 4, 209, 69, 33, 211, 99, 33, 237, 182, 234, 89, 208, 174, 234, 100, + 208, 174, 234, 89, 202, 160, 234, 100, 202, 160, 199, 154, 202, 160, 232, + 117, 202, 160, 203, 39, 202, 160, 233, 1, 202, 160, 209, 38, 202, 160, + 199, 195, 202, 160, 230, 87, 202, 160, 192, 77, 194, 61, 202, 160, 192, + 77, 194, 61, 213, 128, 192, 77, 194, 61, 222, 228, 220, 19, 77, 207, 92, + 77, 228, 111, 213, 129, 228, 111, 233, 1, 237, 185, 234, 89, 237, 185, + 234, 100, 237, 185, 229, 5, 161, 55, 84, 219, 175, 55, 132, 219, 175, 46, + 203, 74, 208, 142, 77, 51, 203, 74, 208, 142, 77, 203, 74, 219, 51, 208, + 142, 77, 203, 74, 229, 152, 208, 142, 77, 46, 55, 208, 142, 77, 51, 55, + 208, 142, 77, 55, 219, 51, 208, 142, 77, 55, 229, 152, 208, 142, 77, 237, + 238, 55, 237, 238, 247, 106, 198, 182, 247, 106, 90, 78, 220, 40, 103, + 78, 220, 40, 229, 5, 234, 105, 228, 109, 209, 191, 219, 176, 204, 165, + 210, 244, 204, 165, 220, 19, 234, 98, 207, 92, 234, 98, 209, 169, 236, + 204, 232, 134, 220, 19, 211, 107, 207, 92, 211, 107, 215, 50, 213, 136, + 202, 160, 210, 134, 216, 126, 57, 210, 134, 200, 31, 199, 165, 57, 209, + 99, 55, 209, 99, 198, 170, 209, 99, 207, 168, 209, 99, 207, 168, 55, 209, + 99, 207, 168, 198, 170, 209, 99, 246, 211, 203, 74, 220, 23, 250, 208, + 208, 142, 77, 203, 74, 207, 96, 250, 208, 208, 142, 77, 207, 233, 77, 55, + 233, 204, 77, 223, 130, 211, 109, 197, 64, 246, 100, 199, 113, 246, 212, + 223, 147, 209, 191, 250, 35, 228, 112, 247, 106, 232, 109, 203, 4, 46, + 50, 247, 165, 4, 208, 153, 51, 50, 247, 165, 4, 208, 153, 55, 208, 159, + 77, 208, 159, 233, 204, 77, 233, 204, 208, 159, 77, 199, 66, 3, 233, 242, + 207, 168, 210, 9, 57, 60, 114, 247, 106, 60, 94, 247, 106, 132, 250, 37, + 207, 168, 204, 180, 242, 85, 197, 41, 103, 250, 36, 251, 12, 196, 54, + 242, 36, 216, 113, 57, 201, 58, 237, 185, 223, 121, 197, 64, 232, 176, + 209, 38, 77, 112, 78, 209, 37, 208, 170, 209, 99, 232, 119, 78, 209, 37, + 232, 214, 78, 209, 37, 103, 78, 209, 37, 232, 119, 78, 77, 235, 111, 238, + 183, 198, 181, 84, 232, 119, 236, 111, 217, 31, 13, 202, 160, 194, 11, + 222, 228, 232, 69, 250, 142, 223, 119, 199, 82, 223, 119, 204, 165, 223, + 119, 209, 206, 220, 19, 223, 88, 207, 92, 223, 88, 232, 226, 201, 194, + 223, 88, 209, 169, 236, 204, 223, 88, 223, 160, 201, 4, 201, 76, 251, + 132, 201, 4, 201, 76, 223, 160, 9, 232, 136, 204, 32, 251, 132, 9, 232, + 136, 204, 32, 215, 44, 17, 204, 33, 213, 132, 17, 204, 33, 201, 107, 192, + 76, 201, 107, 8, 2, 1, 70, 201, 107, 134, 201, 107, 151, 201, 107, 170, + 201, 107, 179, 201, 107, 174, 201, 107, 182, 201, 107, 102, 57, 201, 107, + 216, 112, 201, 107, 234, 30, 57, 201, 107, 46, 210, 230, 201, 107, 51, + 210, 230, 201, 107, 8, 2, 1, 215, 151, 201, 155, 192, 76, 201, 155, 101, + 201, 155, 104, 201, 155, 133, 201, 155, 134, 201, 155, 151, 201, 155, + 170, 201, 155, 179, 201, 155, 174, 201, 155, 182, 201, 155, 102, 57, 201, + 155, 216, 112, 201, 155, 234, 30, 57, 201, 155, 46, 210, 230, 201, 155, + 51, 210, 230, 8, 201, 155, 2, 1, 64, 8, 201, 155, 2, 1, 71, 8, 201, 155, + 2, 1, 74, 8, 201, 155, 2, 1, 193, 223, 8, 201, 155, 2, 1, 205, 240, 8, + 201, 155, 2, 1, 230, 124, 8, 201, 155, 2, 1, 222, 184, 8, 201, 155, 2, 1, + 165, 8, 201, 155, 2, 1, 218, 236, 8, 201, 155, 2, 1, 215, 151, 8, 201, + 155, 2, 1, 211, 93, 8, 201, 155, 2, 1, 206, 158, 8, 201, 155, 2, 1, 200, + 228, 233, 221, 57, 242, 48, 57, 238, 167, 57, 232, 97, 232, 102, 57, 219, + 155, 57, 216, 127, 57, 215, 68, 57, 210, 111, 57, 206, 186, 57, 194, 19, + 57, 214, 177, 203, 254, 57, 236, 122, 57, 233, 222, 57, 221, 173, 57, + 198, 32, 57, 235, 89, 57, 231, 131, 210, 147, 57, 210, 108, 57, 230, 181, + 57, 249, 254, 57, 228, 187, 57, 246, 153, 57, 219, 145, 198, 229, 57, + 202, 140, 57, 200, 28, 57, 223, 175, 206, 186, 57, 198, 11, 219, 155, 57, + 213, 118, 122, 57, 217, 158, 57, 206, 209, 57, 220, 69, 57, 248, 0, 57, + 38, 46, 230, 22, 58, 38, 51, 230, 22, 58, 38, 184, 84, 219, 176, 211, + 110, 38, 203, 195, 84, 219, 176, 211, 110, 38, 250, 182, 61, 58, 38, 242, + 86, 61, 58, 38, 46, 61, 58, 38, 51, 61, 58, 38, 207, 82, 211, 110, 38, + 242, 86, 207, 82, 211, 110, 38, 250, 182, 207, 82, 211, 110, 38, 112, + 236, 112, 58, 38, 232, 119, 236, 112, 58, 38, 234, 84, 242, 130, 38, 234, + 84, 202, 106, 38, 234, 84, 237, 4, 38, 234, 84, 242, 131, 248, 247, 38, + 46, 51, 61, 58, 38, 234, 84, 205, 231, 38, 234, 84, 221, 253, 38, 234, + 84, 197, 32, 209, 188, 198, 185, 38, 207, 169, 202, 190, 211, 110, 38, + 55, 84, 201, 208, 211, 110, 38, 250, 192, 109, 38, 198, 170, 197, 66, 38, + 194, 64, 247, 143, 58, 38, 114, 61, 211, 110, 38, 184, 55, 202, 190, 211, + 110, 38, 94, 230, 22, 4, 173, 235, 91, 38, 114, 230, 22, 4, 173, 235, 91, + 38, 46, 61, 63, 38, 51, 61, 63, 38, 250, 38, 58, 251, 138, 211, 251, 251, + 121, 115, 199, 225, 201, 165, 235, 102, 6, 247, 52, 237, 95, 246, 143, + 246, 138, 219, 176, 109, 246, 213, 211, 251, 247, 11, 197, 76, 233, 223, + 239, 3, 205, 227, 237, 95, 233, 79, 27, 2, 232, 44, 27, 6, 230, 124, 247, + 246, 6, 230, 124, 235, 102, 6, 230, 124, 209, 227, 239, 3, 209, 227, 239, + 4, 136, 103, 210, 51, 27, 6, 70, 247, 246, 6, 70, 27, 6, 165, 27, 2, 165, + 220, 202, 76, 248, 194, 109, 235, 102, 6, 215, 151, 212, 232, 57, 202, + 174, 207, 245, 238, 226, 27, 6, 211, 93, 235, 102, 6, 211, 93, 235, 102, + 6, 208, 247, 27, 6, 150, 247, 246, 6, 150, 235, 102, 6, 150, 209, 107, + 200, 140, 207, 181, 204, 156, 77, 200, 42, 57, 198, 219, 122, 57, 196, + 106, 235, 102, 6, 192, 155, 211, 129, 57, 211, 240, 57, 223, 121, 211, + 240, 57, 247, 246, 6, 192, 155, 163, 33, 2, 1, 223, 111, 222, 38, 57, + 250, 202, 57, 27, 6, 249, 226, 247, 246, 6, 247, 52, 233, 247, 109, 27, + 2, 71, 27, 6, 71, 27, 6, 233, 163, 163, 6, 233, 163, 27, 6, 218, 236, 27, + 2, 74, 157, 109, 248, 66, 109, 231, 32, 109, 237, 222, 109, 223, 165, + 202, 172, 207, 16, 6, 208, 247, 233, 82, 57, 235, 102, 2, 210, 51, 235, + 102, 2, 231, 204, 235, 102, 6, 231, 204, 235, 102, 6, 210, 51, 235, 102, + 215, 150, 201, 126, 163, 49, 6, 232, 44, 163, 49, 6, 165, 207, 168, 49, + 6, 165, 163, 49, 6, 193, 148, 235, 102, 43, 6, 238, 95, 235, 102, 43, 2, + 238, 95, 235, 102, 43, 2, 71, 235, 102, 43, 2, 70, 235, 102, 43, 2, 223, + 65, 209, 73, 219, 175, 163, 250, 229, 210, 134, 57, 251, 38, 163, 2, 233, + 163, 16, 39, 206, 49, 202, 172, 194, 220, 232, 109, 90, 204, 142, 194, + 220, 232, 109, 90, 214, 9, 194, 220, 232, 109, 90, 200, 21, 194, 220, + 232, 109, 90, 199, 191, 194, 220, 232, 109, 103, 199, 188, 194, 220, 232, + 109, 90, 233, 6, 194, 220, 232, 109, 103, 233, 5, 194, 220, 232, 109, + 112, 233, 5, 194, 220, 232, 109, 232, 119, 233, 5, 194, 220, 232, 109, + 90, 203, 29, 194, 220, 232, 109, 232, 214, 203, 27, 194, 220, 232, 109, + 90, 234, 143, 194, 220, 232, 109, 112, 234, 141, 194, 220, 232, 109, 232, + 214, 234, 141, 194, 220, 232, 109, 204, 146, 234, 141, 232, 109, 212, + 233, 101, 207, 30, 212, 234, 101, 207, 30, 212, 234, 104, 207, 30, 212, + 234, 133, 207, 30, 212, 234, 134, 207, 30, 212, 234, 151, 207, 30, 212, + 234, 170, 207, 30, 212, 234, 179, 207, 30, 212, 234, 174, 207, 30, 212, + 234, 182, 207, 30, 212, 234, 200, 30, 207, 30, 212, 234, 234, 111, 207, + 30, 212, 234, 197, 244, 207, 30, 212, 234, 233, 3, 207, 30, 212, 234, 90, + 228, 162, 207, 30, 212, 234, 232, 214, 228, 162, 207, 30, 212, 234, 90, + 180, 2, 207, 30, 212, 234, 101, 2, 207, 30, 212, 234, 104, 2, 207, 30, + 212, 234, 133, 2, 207, 30, 212, 234, 134, 2, 207, 30, 212, 234, 151, 2, + 207, 30, 212, 234, 170, 2, 207, 30, 212, 234, 179, 2, 207, 30, 212, 234, + 174, 2, 207, 30, 212, 234, 182, 2, 207, 30, 212, 234, 200, 30, 2, 207, + 30, 212, 234, 234, 111, 2, 207, 30, 212, 234, 197, 244, 2, 207, 30, 212, + 234, 233, 3, 2, 207, 30, 212, 234, 90, 228, 162, 2, 207, 30, 212, 234, + 232, 214, 228, 162, 2, 207, 30, 212, 234, 90, 180, 207, 30, 212, 234, 90, + 199, 165, 247, 53, 238, 95, 207, 30, 212, 234, 232, 214, 180, 207, 30, + 212, 234, 200, 31, 180, 207, 30, 212, 234, 207, 168, 90, 228, 162, 8, 2, + 1, 207, 168, 247, 52, 207, 30, 212, 234, 203, 41, 220, 64, 20, 207, 30, + 212, 234, 233, 4, 234, 192, 20, 207, 30, 212, 234, 233, 4, 180, 207, 30, + 212, 234, 90, 228, 163, 180, 194, 220, 232, 109, 192, 77, 199, 188, 163, + 17, 104, 163, 17, 133, 114, 54, 197, 30, 54, 94, 54, 235, 92, 54, 46, 51, + 54, 130, 142, 54, 178, 194, 91, 54, 178, 234, 186, 54, 202, 171, 234, + 186, 54, 202, 171, 194, 91, 54, 114, 61, 4, 111, 94, 61, 4, 111, 114, + 194, 125, 54, 94, 194, 125, 54, 114, 103, 229, 243, 54, 197, 30, 103, + 229, 243, 54, 94, 103, 229, 243, 54, 235, 92, 103, 229, 243, 54, 114, 61, + 4, 200, 147, 94, 61, 4, 200, 147, 114, 61, 232, 89, 161, 197, 30, 61, + 232, 89, 161, 94, 61, 232, 89, 161, 235, 92, 61, 232, 89, 161, 130, 142, + 61, 4, 248, 180, 114, 61, 4, 128, 94, 61, 4, 128, 114, 61, 4, 219, 69, + 94, 61, 4, 219, 69, 46, 51, 194, 125, 54, 46, 51, 61, 4, 111, 235, 92, + 192, 21, 54, 197, 30, 61, 4, 199, 74, 220, 18, 197, 30, 61, 4, 199, 74, + 207, 90, 235, 92, 61, 4, 199, 74, 220, 18, 235, 92, 61, 4, 199, 74, 207, + 90, 94, 61, 4, 238, 224, 235, 91, 235, 92, 61, 4, 238, 224, 220, 18, 250, + 182, 198, 249, 204, 183, 54, 242, 86, 198, 249, 204, 183, 54, 178, 194, + 91, 61, 115, 184, 161, 114, 61, 115, 248, 194, 136, 94, 61, 115, 161, + 250, 182, 211, 184, 242, 131, 54, 242, 86, 211, 184, 242, 131, 54, 114, + 230, 22, 4, 173, 197, 29, 114, 230, 22, 4, 173, 235, 91, 197, 30, 230, + 22, 4, 173, 207, 90, 197, 30, 230, 22, 4, 173, 220, 18, 94, 230, 22, 4, + 173, 197, 29, 94, 230, 22, 4, 173, 235, 91, 235, 92, 230, 22, 4, 173, + 207, 90, 235, 92, 230, 22, 4, 173, 220, 18, 94, 61, 136, 114, 54, 197, + 30, 61, 114, 80, 235, 92, 54, 114, 61, 136, 94, 54, 114, 211, 53, 250, + 73, 197, 30, 211, 53, 250, 73, 94, 211, 53, 250, 73, 235, 92, 211, 53, + 250, 73, 114, 230, 22, 136, 94, 230, 21, 94, 230, 22, 136, 114, 230, 21, + 114, 55, 61, 4, 111, 46, 51, 55, 61, 4, 111, 94, 55, 61, 4, 111, 114, 55, + 54, 197, 30, 55, 54, 94, 55, 54, 235, 92, 55, 54, 46, 51, 55, 54, 130, + 142, 55, 54, 178, 194, 91, 55, 54, 178, 234, 186, 55, 54, 202, 171, 234, + 186, 55, 54, 202, 171, 194, 91, 55, 54, 114, 198, 170, 54, 94, 198, 170, + 54, 114, 202, 99, 54, 94, 202, 99, 54, 197, 30, 61, 4, 55, 111, 235, 92, + 61, 4, 55, 111, 114, 237, 184, 54, 197, 30, 237, 184, 54, 94, 237, 184, + 54, 235, 92, 237, 184, 54, 114, 61, 115, 161, 94, 61, 115, 161, 114, 62, + 54, 197, 30, 62, 54, 94, 62, 54, 235, 92, 62, 54, 197, 30, 62, 61, 232, + 89, 161, 197, 30, 62, 61, 211, 212, 210, 171, 197, 30, 62, 61, 211, 212, + 210, 172, 4, 229, 5, 161, 197, 30, 62, 61, 211, 212, 210, 172, 4, 84, + 161, 197, 30, 62, 55, 54, 197, 30, 62, 55, 61, 211, 212, 210, 171, 94, + 62, 61, 232, 89, 194, 151, 178, 194, 91, 61, 115, 238, 223, 202, 171, + 234, 186, 61, 115, 238, 223, 130, 142, 62, 54, 51, 61, 4, 2, 242, 130, + 235, 92, 61, 114, 80, 197, 30, 54, 112, 94, 250, 73, 114, 61, 4, 84, 111, + 94, 61, 4, 84, 111, 46, 51, 61, 4, 84, 111, 114, 61, 4, 55, 84, 111, 94, + 61, 4, 55, 84, 111, 46, 51, 61, 4, 55, 84, 111, 114, 211, 181, 54, 94, + 211, 181, 54, 46, 51, 211, 181, 54, 39, 251, 8, 242, 32, 210, 222, 236, + 244, 199, 215, 233, 199, 199, 215, 236, 136, 213, 111, 233, 200, 234, 90, + 204, 151, 223, 179, 215, 79, 234, 116, 211, 251, 213, 111, 250, 225, 234, + 116, 211, 251, 2, 234, 116, 211, 251, 238, 253, 250, 62, 217, 9, 236, + 136, 213, 111, 238, 255, 250, 62, 217, 9, 2, 238, 253, 250, 62, 217, 9, + 234, 80, 80, 209, 75, 215, 150, 209, 85, 215, 150, 238, 230, 215, 150, + 201, 126, 216, 113, 57, 216, 111, 57, 78, 209, 206, 236, 172, 203, 4, + 204, 152, 216, 112, 250, 38, 211, 173, 207, 82, 211, 173, 247, 107, 211, + 173, 50, 207, 22, 238, 158, 207, 22, 232, 112, 207, 22, 209, 71, 155, + 223, 167, 51, 250, 207, 250, 207, 217, 42, 250, 207, 202, 139, 250, 207, + 236, 175, 236, 136, 213, 111, 236, 179, 210, 236, 155, 213, 111, 210, + 236, 155, 219, 93, 250, 217, 219, 93, 211, 163, 223, 127, 197, 56, 223, + 141, 55, 223, 141, 198, 170, 223, 141, 238, 247, 223, 141, 201, 96, 223, + 141, 195, 239, 223, 141, 242, 86, 223, 141, 242, 86, 238, 247, 223, 141, + 250, 182, 238, 247, 223, 141, 199, 214, 248, 110, 208, 18, 209, 72, 78, + 216, 112, 233, 207, 231, 137, 209, 72, 229, 20, 199, 91, 211, 173, 207, + 168, 199, 90, 223, 121, 220, 49, 206, 158, 203, 76, 194, 124, 193, 254, + 209, 85, 213, 111, 199, 90, 216, 113, 199, 90, 250, 30, 187, 155, 213, + 111, 250, 30, 187, 155, 250, 138, 187, 155, 250, 138, 247, 77, 213, 111, + 251, 131, 187, 155, 214, 198, 250, 138, 213, 120, 251, 131, 187, 155, + 251, 1, 187, 155, 213, 111, 251, 1, 187, 155, 251, 1, 187, 211, 164, 187, + 155, 198, 170, 199, 90, 251, 9, 187, 155, 234, 23, 155, 231, 136, 234, + 23, 155, 236, 245, 248, 60, 250, 140, 199, 225, 219, 183, 231, 136, 187, + 155, 250, 138, 187, 115, 211, 164, 199, 225, 223, 206, 211, 251, 223, + 206, 80, 211, 164, 250, 138, 187, 155, 242, 48, 234, 29, 234, 30, 242, + 47, 207, 82, 223, 191, 187, 155, 207, 82, 187, 155, 238, 216, 155, 233, + 246, 234, 28, 155, 202, 20, 234, 29, 237, 77, 187, 155, 187, 115, 247, + 64, 237, 96, 217, 42, 247, 63, 208, 157, 187, 155, 213, 111, 187, 155, + 228, 41, 155, 213, 111, 228, 41, 155, 201, 215, 234, 23, 155, 219, 240, + 211, 164, 187, 155, 230, 204, 211, 164, 187, 155, 219, 240, 136, 187, + 155, 230, 204, 136, 187, 155, 219, 240, 247, 77, 213, 111, 187, 155, 230, + 204, 247, 77, 213, 111, 187, 155, 215, 231, 219, 239, 215, 231, 230, 203, + 248, 60, 213, 111, 234, 23, 155, 213, 111, 219, 239, 213, 111, 230, 203, + 214, 198, 219, 240, 213, 120, 187, 155, 214, 198, 230, 204, 213, 120, + 187, 155, 219, 240, 211, 164, 234, 23, 155, 230, 204, 211, 164, 234, 23, + 155, 214, 198, 219, 240, 213, 120, 234, 23, 155, 214, 198, 230, 204, 213, + 120, 234, 23, 155, 219, 240, 211, 164, 230, 203, 230, 204, 211, 164, 219, + 239, 214, 198, 219, 240, 213, 120, 230, 203, 214, 198, 230, 204, 213, + 120, 219, 239, 209, 115, 201, 145, 209, 116, 211, 164, 187, 155, 201, + 146, 211, 164, 187, 155, 209, 116, 211, 164, 234, 23, 155, 201, 146, 211, + 164, 234, 23, 155, 236, 136, 213, 111, 209, 118, 236, 136, 213, 111, 201, + 147, 201, 154, 211, 251, 201, 106, 211, 251, 213, 111, 41, 201, 154, 211, + 251, 213, 111, 41, 201, 106, 211, 251, 201, 154, 80, 211, 164, 187, 155, + 201, 106, 80, 211, 164, 187, 155, 214, 198, 41, 201, 154, 80, 213, 120, + 187, 155, 214, 198, 41, 201, 106, 80, 213, 120, 187, 155, 201, 154, 80, + 4, 213, 111, 187, 155, 201, 106, 80, 4, 213, 111, 187, 155, 215, 211, + 215, 212, 215, 213, 215, 212, 197, 56, 50, 223, 206, 211, 251, 50, 211, + 154, 211, 251, 50, 223, 206, 80, 211, 164, 187, 155, 50, 211, 154, 80, + 211, 164, 187, 155, 50, 246, 226, 50, 238, 148, 47, 209, 206, 47, 216, + 112, 47, 199, 82, 47, 236, 172, 203, 4, 47, 78, 211, 173, 47, 207, 82, + 211, 173, 47, 250, 38, 211, 173, 47, 234, 29, 47, 237, 185, 108, 209, + 206, 108, 216, 112, 108, 199, 82, 108, 78, 211, 173, 51, 200, 159, 46, + 200, 159, 142, 200, 159, 130, 200, 159, 250, 41, 216, 80, 198, 147, 232, + 142, 198, 170, 84, 248, 194, 51, 198, 8, 55, 84, 248, 194, 55, 51, 198, + 8, 236, 136, 213, 111, 209, 65, 213, 111, 198, 147, 236, 136, 213, 111, + 232, 143, 214, 201, 55, 84, 248, 194, 55, 51, 198, 8, 209, 116, 197, 69, + 207, 215, 201, 146, 197, 69, 207, 215, 213, 117, 201, 168, 211, 251, 238, + 253, 250, 62, 213, 117, 201, 167, 213, 117, 201, 168, 80, 211, 164, 187, + 155, 238, 253, 250, 62, 213, 117, 201, 168, 211, 164, 187, 155, 211, 154, + 211, 251, 223, 206, 211, 251, 215, 218, 229, 199, 239, 8, 217, 98, 223, + 138, 193, 181, 215, 59, 213, 119, 51, 250, 208, 4, 250, 114, 51, 198, + 185, 215, 150, 219, 93, 250, 217, 215, 150, 219, 93, 211, 163, 215, 150, + 223, 127, 215, 150, 197, 56, 237, 5, 211, 173, 78, 211, 173, 202, 20, + 211, 173, 236, 172, 199, 82, 247, 174, 46, 213, 117, 233, 81, 204, 179, + 209, 85, 51, 213, 117, 233, 81, 204, 179, 209, 85, 46, 204, 179, 209, 85, + 51, 204, 179, 209, 85, 207, 168, 199, 91, 234, 29, 238, 138, 219, 93, + 211, 163, 238, 138, 219, 93, 250, 217, 55, 201, 153, 55, 201, 105, 55, + 223, 127, 55, 197, 56, 209, 239, 187, 26, 210, 236, 155, 219, 240, 4, + 236, 114, 230, 204, 4, 236, 114, 196, 53, 215, 231, 219, 239, 196, 53, + 215, 231, 230, 203, 219, 240, 187, 115, 211, 164, 230, 203, 230, 204, + 187, 115, 211, 164, 219, 239, 187, 115, 211, 164, 219, 239, 187, 115, + 211, 164, 230, 203, 187, 115, 211, 164, 209, 115, 187, 115, 211, 164, + 201, 145, 236, 136, 213, 111, 209, 119, 211, 164, 234, 31, 236, 136, 213, + 111, 201, 148, 211, 164, 234, 31, 213, 111, 50, 223, 206, 80, 211, 164, + 187, 155, 213, 111, 50, 211, 154, 80, 211, 164, 187, 155, 50, 223, 206, + 80, 211, 164, 213, 111, 187, 155, 50, 211, 154, 80, 211, 164, 213, 111, + 187, 155, 219, 240, 247, 77, 213, 111, 234, 23, 155, 230, 204, 247, 77, + 213, 111, 234, 23, 155, 209, 116, 247, 77, 213, 111, 234, 23, 155, 201, + 146, 247, 77, 213, 111, 234, 23, 155, 213, 111, 213, 117, 201, 168, 211, + 251, 236, 136, 213, 111, 238, 255, 250, 62, 213, 117, 201, 167, 213, 111, + 213, 117, 201, 168, 80, 211, 164, 187, 155, 236, 136, 213, 111, 238, 255, + 250, 62, 213, 117, 201, 168, 211, 164, 234, 31, 84, 234, 105, 216, 158, + 229, 5, 234, 105, 130, 51, 237, 11, 234, 105, 142, 51, 237, 11, 234, 105, + 234, 116, 80, 4, 184, 229, 5, 111, 234, 116, 80, 4, 84, 248, 194, 250, + 27, 234, 80, 80, 229, 5, 111, 2, 234, 116, 80, 4, 84, 248, 194, 250, 27, + 234, 80, 80, 229, 5, 111, 234, 116, 80, 4, 78, 58, 234, 116, 80, 4, 211, + 117, 2, 234, 116, 80, 4, 211, 117, 234, 116, 80, 4, 197, 67, 234, 116, + 80, 4, 103, 229, 5, 201, 195, 238, 253, 4, 184, 229, 5, 111, 238, 253, 4, + 84, 248, 194, 250, 27, 234, 80, 80, 229, 5, 111, 2, 238, 253, 4, 84, 248, + 194, 250, 27, 234, 80, 80, 229, 5, 111, 238, 253, 4, 211, 117, 2, 238, + 253, 4, 211, 117, 192, 156, 213, 109, 248, 237, 217, 8, 237, 6, 57, 234, + 119, 54, 228, 193, 130, 250, 77, 142, 250, 77, 209, 79, 210, 114, 194, + 121, 219, 175, 46, 246, 146, 51, 246, 146, 46, 232, 182, 51, 232, 182, + 247, 188, 51, 238, 185, 247, 188, 46, 238, 185, 198, 249, 51, 238, 185, + 198, 249, 46, 238, 185, 207, 168, 213, 111, 57, 50, 219, 43, 250, 114, + 205, 198, 205, 207, 200, 42, 207, 246, 209, 160, 223, 172, 196, 26, 202, + 106, 209, 232, 80, 223, 137, 57, 163, 213, 111, 57, 194, 131, 228, 195, + 198, 249, 46, 238, 223, 198, 249, 51, 238, 223, 247, 188, 46, 238, 223, + 247, 188, 51, 238, 223, 198, 249, 138, 223, 141, 247, 188, 138, 223, 141, + 232, 84, 202, 231, 130, 250, 78, 248, 61, 103, 229, 5, 248, 182, 211, + 166, 222, 1, 234, 19, 115, 199, 225, 207, 101, 193, 224, 223, 191, 41, + 207, 243, 247, 173, 221, 255, 220, 23, 250, 208, 186, 207, 96, 250, 208, + 186, 234, 19, 115, 199, 225, 220, 28, 248, 72, 207, 81, 238, 105, 251, 9, + 250, 86, 201, 3, 198, 234, 206, 191, 236, 224, 211, 155, 239, 12, 200, + 114, 202, 245, 238, 212, 238, 211, 250, 157, 232, 67, 16, 228, 90, 250, + 157, 232, 67, 16, 202, 97, 208, 174, 250, 157, 232, 67, 16, 208, 175, + 234, 31, 250, 157, 232, 67, 16, 208, 175, 236, 179, 250, 157, 232, 67, + 16, 208, 175, 237, 4, 250, 157, 232, 67, 16, 208, 175, 222, 220, 250, + 157, 232, 67, 16, 208, 175, 242, 130, 250, 157, 232, 67, 16, 242, 131, + 201, 246, 250, 157, 232, 67, 16, 242, 131, 222, 220, 250, 157, 232, 67, + 16, 203, 5, 161, 250, 157, 232, 67, 16, 248, 248, 161, 250, 157, 232, 67, + 16, 208, 175, 203, 4, 250, 157, 232, 67, 16, 208, 175, 248, 247, 250, + 157, 232, 67, 16, 208, 175, 219, 239, 250, 157, 232, 67, 16, 208, 175, + 230, 203, 250, 157, 232, 67, 16, 114, 196, 145, 250, 157, 232, 67, 16, + 94, 196, 145, 250, 157, 232, 67, 16, 208, 175, 114, 54, 250, 157, 232, + 67, 16, 208, 175, 94, 54, 250, 157, 232, 67, 16, 242, 131, 248, 247, 250, + 157, 232, 67, 16, 142, 200, 160, 197, 67, 250, 157, 232, 67, 16, 237, 77, + 201, 246, 250, 157, 232, 67, 16, 208, 175, 142, 246, 211, 250, 157, 232, + 67, 16, 208, 175, 237, 76, 250, 157, 232, 67, 16, 142, 200, 160, 222, + 220, 250, 157, 232, 67, 16, 197, 30, 196, 145, 250, 157, 232, 67, 16, + 208, 175, 197, 30, 54, 250, 157, 232, 67, 16, 130, 200, 160, 211, 117, + 250, 157, 232, 67, 16, 237, 89, 201, 246, 250, 157, 232, 67, 16, 208, + 175, 130, 246, 211, 250, 157, 232, 67, 16, 208, 175, 237, 88, 250, 157, + 232, 67, 16, 130, 200, 160, 222, 220, 250, 157, 232, 67, 16, 235, 92, + 196, 145, 250, 157, 232, 67, 16, 208, 175, 235, 92, 54, 250, 157, 232, + 67, 16, 208, 141, 197, 67, 250, 157, 232, 67, 16, 237, 77, 197, 67, 250, + 157, 232, 67, 16, 237, 5, 197, 67, 250, 157, 232, 67, 16, 222, 221, 197, + 67, 250, 157, 232, 67, 16, 242, 131, 197, 67, 250, 157, 232, 67, 16, 130, + 203, 208, 222, 220, 250, 157, 232, 67, 16, 208, 141, 208, 174, 250, 157, + 232, 67, 16, 242, 131, 202, 19, 250, 157, 232, 67, 16, 208, 175, 242, 47, + 250, 157, 232, 67, 16, 130, 200, 160, 237, 14, 250, 157, 232, 67, 16, + 237, 89, 237, 14, 250, 157, 232, 67, 16, 202, 20, 237, 14, 250, 157, 232, + 67, 16, 222, 221, 237, 14, 250, 157, 232, 67, 16, 242, 131, 237, 14, 250, + 157, 232, 67, 16, 142, 203, 208, 201, 246, 250, 157, 232, 67, 16, 46, + 203, 208, 201, 246, 250, 157, 232, 67, 16, 199, 91, 237, 14, 250, 157, + 232, 67, 16, 230, 204, 237, 14, 250, 157, 232, 67, 16, 242, 39, 161, 250, + 157, 232, 67, 16, 237, 89, 199, 90, 250, 157, 232, 67, 16, 192, 20, 250, + 157, 232, 67, 16, 201, 247, 199, 90, 250, 157, 232, 67, 16, 204, 181, + 197, 67, 250, 157, 232, 67, 16, 208, 175, 213, 111, 234, 31, 250, 157, + 232, 67, 16, 208, 175, 208, 158, 250, 157, 232, 67, 16, 142, 246, 212, + 199, 90, 250, 157, 232, 67, 16, 130, 246, 212, 199, 90, 250, 157, 232, + 67, 16, 223, 111, 250, 157, 232, 67, 16, 207, 153, 250, 157, 232, 67, 16, + 211, 216, 250, 157, 232, 67, 16, 250, 253, 197, 67, 250, 157, 232, 67, + 16, 234, 33, 197, 67, 250, 157, 232, 67, 16, 223, 112, 197, 67, 250, 157, + 232, 67, 16, 211, 217, 197, 67, 250, 157, 232, 67, 16, 250, 252, 213, + 111, 242, 244, 77, 51, 250, 208, 4, 235, 92, 192, 21, 54, 203, 176, 211, + 184, 247, 173, 248, 87, 109, 84, 219, 176, 4, 85, 236, 114, 223, 147, + 109, 238, 248, 197, 65, 109, 236, 197, 197, 65, 109, 234, 92, 109, 239, + 27, 109, 62, 50, 4, 246, 138, 84, 219, 175, 234, 63, 109, 250, 244, 222, + 2, 109, 229, 212, 109, 47, 229, 5, 248, 194, 4, 213, 108, 47, 198, 186, + 235, 96, 247, 136, 242, 131, 4, 213, 114, 54, 197, 63, 109, 216, 40, 109, + 228, 107, 109, 211, 182, 230, 123, 109, 211, 182, 220, 200, 109, 210, + 210, 109, 210, 209, 109, 236, 206, 238, 136, 16, 232, 136, 104, 202, 195, + 109, 250, 157, 232, 67, 16, 208, 174, 237, 108, 204, 166, 222, 2, 109, + 209, 101, 211, 61, 214, 170, 211, 61, 209, 96, 205, 232, 109, 242, 102, + 205, 232, 109, 46, 210, 231, 113, 128, 46, 210, 231, 233, 191, 46, 210, + 231, 106, 128, 51, 210, 231, 113, 128, 51, 210, 231, 233, 191, 51, 210, + 231, 106, 128, 46, 50, 247, 165, 113, 238, 223, 46, 50, 247, 165, 233, + 191, 46, 50, 247, 165, 106, 238, 223, 51, 50, 247, 165, 113, 238, 223, + 51, 50, 247, 165, 233, 191, 51, 50, 247, 165, 106, 238, 223, 46, 238, + 138, 247, 165, 113, 128, 46, 238, 138, 247, 165, 85, 210, 42, 46, 238, + 138, 247, 165, 106, 128, 238, 138, 247, 165, 233, 191, 51, 238, 138, 247, + 165, 113, 128, 51, 238, 138, 247, 165, 85, 210, 42, 51, 238, 138, 247, + 165, 106, 128, 223, 142, 233, 191, 229, 5, 219, 176, 233, 191, 113, 46, + 211, 164, 106, 51, 238, 138, 247, 165, 205, 208, 113, 51, 211, 164, 106, + 46, 238, 138, 247, 165, 205, 208, 201, 127, 198, 248, 201, 127, 247, 187, + 198, 249, 50, 186, 247, 188, 50, 186, 247, 188, 50, 247, 165, 136, 198, + 249, 50, 186, 48, 16, 247, 187, 46, 84, 105, 219, 175, 51, 84, 105, 219, + 175, 229, 5, 205, 251, 219, 174, 229, 5, 205, 251, 219, 173, 229, 5, 205, + 251, 219, 172, 229, 5, 205, 251, 219, 171, 237, 68, 16, 152, 84, 26, 198, + 249, 207, 101, 237, 68, 16, 152, 84, 26, 247, 188, 207, 101, 237, 68, 16, + 152, 84, 4, 242, 130, 237, 68, 16, 152, 142, 26, 229, 5, 4, 242, 130, + 237, 68, 16, 152, 130, 26, 229, 5, 4, 242, 130, 237, 68, 16, 152, 84, 4, + 198, 185, 237, 68, 16, 152, 142, 26, 229, 5, 4, 198, 185, 237, 68, 16, + 152, 130, 26, 229, 5, 4, 198, 185, 237, 68, 16, 152, 84, 26, 194, 124, + 237, 68, 16, 152, 142, 26, 229, 5, 4, 194, 124, 237, 68, 16, 152, 130, + 26, 229, 5, 4, 194, 124, 237, 68, 16, 152, 142, 26, 229, 4, 237, 68, 16, + 152, 130, 26, 229, 4, 237, 68, 16, 152, 84, 26, 198, 249, 220, 28, 237, + 68, 16, 152, 84, 26, 247, 188, 220, 28, 50, 232, 149, 207, 173, 109, 234, + 133, 109, 84, 219, 176, 233, 191, 216, 234, 247, 150, 216, 234, 184, 136, + 203, 194, 216, 234, 203, 195, 136, 219, 84, 216, 234, 184, 136, 103, 203, + 180, 216, 234, 103, 203, 181, 136, 219, 84, 216, 234, 103, 203, 181, 222, + 229, 216, 234, 198, 166, 216, 234, 200, 0, 216, 234, 210, 142, 234, 190, + 230, 195, 232, 61, 198, 249, 210, 230, 247, 188, 210, 230, 198, 249, 238, + 138, 186, 247, 188, 238, 138, 186, 198, 249, 198, 237, 204, 2, 186, 247, + 188, 198, 237, 204, 2, 186, 62, 198, 202, 248, 72, 207, 82, 4, 242, 130, + 201, 228, 232, 193, 251, 147, 238, 135, 234, 118, 223, 127, 237, 108, + 233, 195, 109, 60, 207, 96, 55, 198, 185, 60, 220, 23, 55, 198, 185, 60, + 197, 40, 55, 198, 185, 60, 235, 95, 55, 198, 185, 60, 207, 96, 55, 198, + 186, 4, 84, 161, 60, 220, 23, 55, 198, 186, 4, 84, 161, 60, 207, 96, 198, + 186, 4, 55, 84, 161, 251, 30, 242, 87, 201, 235, 199, 83, 242, 87, 228, + 196, 4, 232, 173, 206, 38, 60, 217, 31, 220, 23, 198, 185, 60, 217, 31, + 207, 96, 198, 185, 60, 217, 31, 197, 40, 198, 185, 60, 217, 31, 235, 95, + 198, 185, 55, 84, 161, 60, 50, 39, 201, 238, 60, 242, 131, 39, 207, 247, + 209, 139, 109, 209, 139, 211, 210, 109, 209, 139, 211, 212, 109, 209, + 139, 203, 0, 109, 212, 14, 233, 182, 109, 16, 39, 212, 238, 16, 39, 202, + 15, 80, 229, 242, 16, 39, 202, 15, 80, 199, 244, 16, 39, 234, 80, 80, + 199, 244, 16, 39, 234, 80, 80, 198, 208, 16, 39, 234, 66, 16, 39, 251, + 134, 16, 39, 248, 86, 16, 39, 248, 246, 16, 39, 229, 5, 200, 161, 16, 39, + 219, 176, 233, 38, 16, 39, 84, 200, 161, 16, 39, 232, 136, 233, 38, 16, + 39, 246, 203, 207, 172, 16, 39, 203, 232, 211, 125, 16, 39, 203, 232, + 223, 190, 16, 39, 237, 180, 219, 166, 234, 1, 16, 39, 237, 47, 238, 243, + 101, 16, 39, 237, 47, 238, 243, 104, 16, 39, 237, 47, 238, 243, 133, 16, + 39, 237, 47, 238, 243, 134, 16, 39, 214, 199, 251, 134, 16, 39, 200, 254, + 223, 253, 16, 39, 234, 80, 80, 198, 209, 247, 238, 16, 39, 246, 241, 16, + 39, 234, 80, 80, 217, 30, 16, 39, 201, 151, 16, 39, 234, 1, 16, 39, 232, + 251, 204, 165, 16, 39, 230, 194, 204, 165, 16, 39, 207, 248, 204, 165, + 16, 39, 197, 55, 204, 165, 16, 39, 202, 160, 16, 39, 237, 86, 247, 242, + 109, 211, 184, 247, 173, 16, 39, 214, 173, 16, 39, 237, 87, 232, 136, + 104, 16, 39, 201, 152, 232, 136, 104, 212, 10, 128, 212, 10, 246, 112, + 212, 10, 232, 139, 212, 10, 223, 121, 232, 139, 212, 10, 248, 83, 247, + 119, 212, 10, 247, 181, 199, 113, 212, 10, 247, 161, 248, 199, 228, 40, + 212, 10, 250, 231, 80, 242, 243, 212, 10, 237, 185, 212, 10, 238, 124, + 251, 138, 212, 236, 212, 10, 55, 248, 247, 47, 17, 101, 47, 17, 104, 47, + 17, 133, 47, 17, 134, 47, 17, 151, 47, 17, 170, 47, 17, 179, 47, 17, 174, + 47, 17, 182, 47, 31, 200, 30, 47, 31, 234, 111, 47, 31, 197, 244, 47, 31, + 199, 186, 47, 31, 232, 113, 47, 31, 233, 7, 47, 31, 203, 35, 47, 31, 204, + 143, 47, 31, 234, 145, 47, 31, 214, 13, 47, 31, 197, 239, 125, 17, 101, + 125, 17, 104, 125, 17, 133, 125, 17, 134, 125, 17, 151, 125, 17, 170, + 125, 17, 179, 125, 17, 174, 125, 17, 182, 125, 31, 200, 30, 125, 31, 234, + 111, 125, 31, 197, 244, 125, 31, 199, 186, 125, 31, 232, 113, 125, 31, + 233, 7, 125, 31, 203, 35, 125, 31, 204, 143, 125, 31, 234, 145, 125, 31, + 214, 13, 125, 31, 197, 239, 17, 90, 232, 71, 201, 238, 17, 103, 232, 71, + 201, 238, 17, 112, 232, 71, 201, 238, 17, 232, 119, 232, 71, 201, 238, + 17, 232, 214, 232, 71, 201, 238, 17, 203, 41, 232, 71, 201, 238, 17, 204, + 146, 232, 71, 201, 238, 17, 234, 148, 232, 71, 201, 238, 17, 214, 16, + 232, 71, 201, 238, 31, 200, 31, 232, 71, 201, 238, 31, 234, 112, 232, 71, + 201, 238, 31, 197, 245, 232, 71, 201, 238, 31, 199, 187, 232, 71, 201, + 238, 31, 232, 114, 232, 71, 201, 238, 31, 233, 8, 232, 71, 201, 238, 31, + 203, 36, 232, 71, 201, 238, 31, 204, 144, 232, 71, 201, 238, 31, 234, + 146, 232, 71, 201, 238, 31, 214, 14, 232, 71, 201, 238, 31, 197, 240, + 232, 71, 201, 238, 125, 8, 2, 1, 64, 125, 8, 2, 1, 249, 226, 125, 8, 2, + 1, 247, 52, 125, 8, 2, 1, 238, 95, 125, 8, 2, 1, 71, 125, 8, 2, 1, 233, + 163, 125, 8, 2, 1, 232, 44, 125, 8, 2, 1, 230, 124, 125, 8, 2, 1, 70, + 125, 8, 2, 1, 223, 65, 125, 8, 2, 1, 222, 184, 125, 8, 2, 1, 165, 125, 8, + 2, 1, 218, 236, 125, 8, 2, 1, 215, 151, 125, 8, 2, 1, 74, 125, 8, 2, 1, + 211, 93, 125, 8, 2, 1, 208, 247, 125, 8, 2, 1, 150, 125, 8, 2, 1, 206, + 158, 125, 8, 2, 1, 200, 228, 125, 8, 2, 1, 68, 125, 8, 2, 1, 196, 236, + 125, 8, 2, 1, 194, 202, 125, 8, 2, 1, 193, 223, 125, 8, 2, 1, 193, 148, + 125, 8, 2, 1, 192, 155, 47, 8, 6, 1, 64, 47, 8, 6, 1, 249, 226, 47, 8, 6, + 1, 247, 52, 47, 8, 6, 1, 238, 95, 47, 8, 6, 1, 71, 47, 8, 6, 1, 233, 163, + 47, 8, 6, 1, 232, 44, 47, 8, 6, 1, 230, 124, 47, 8, 6, 1, 70, 47, 8, 6, + 1, 223, 65, 47, 8, 6, 1, 222, 184, 47, 8, 6, 1, 165, 47, 8, 6, 1, 218, + 236, 47, 8, 6, 1, 215, 151, 47, 8, 6, 1, 74, 47, 8, 6, 1, 211, 93, 47, 8, + 6, 1, 208, 247, 47, 8, 6, 1, 150, 47, 8, 6, 1, 206, 158, 47, 8, 6, 1, + 200, 228, 47, 8, 6, 1, 68, 47, 8, 6, 1, 196, 236, 47, 8, 6, 1, 194, 202, + 47, 8, 6, 1, 193, 223, 47, 8, 6, 1, 193, 148, 47, 8, 6, 1, 192, 155, 47, + 8, 2, 1, 64, 47, 8, 2, 1, 249, 226, 47, 8, 2, 1, 247, 52, 47, 8, 2, 1, + 238, 95, 47, 8, 2, 1, 71, 47, 8, 2, 1, 233, 163, 47, 8, 2, 1, 232, 44, + 47, 8, 2, 1, 230, 124, 47, 8, 2, 1, 70, 47, 8, 2, 1, 223, 65, 47, 8, 2, + 1, 222, 184, 47, 8, 2, 1, 165, 47, 8, 2, 1, 218, 236, 47, 8, 2, 1, 215, + 151, 47, 8, 2, 1, 74, 47, 8, 2, 1, 211, 93, 47, 8, 2, 1, 208, 247, 47, 8, + 2, 1, 150, 47, 8, 2, 1, 206, 158, 47, 8, 2, 1, 200, 228, 47, 8, 2, 1, 68, + 47, 8, 2, 1, 196, 236, 47, 8, 2, 1, 194, 202, 47, 8, 2, 1, 193, 223, 47, + 8, 2, 1, 193, 148, 47, 8, 2, 1, 192, 155, 47, 17, 192, 76, 214, 199, 47, + 31, 234, 111, 214, 199, 47, 31, 197, 244, 214, 199, 47, 31, 199, 186, + 214, 199, 47, 31, 232, 113, 214, 199, 47, 31, 233, 7, 214, 199, 47, 31, + 203, 35, 214, 199, 47, 31, 204, 143, 214, 199, 47, 31, 234, 145, 214, + 199, 47, 31, 214, 13, 214, 199, 47, 31, 197, 239, 55, 47, 17, 101, 55, + 47, 17, 104, 55, 47, 17, 133, 55, 47, 17, 134, 55, 47, 17, 151, 55, 47, + 17, 170, 55, 47, 17, 179, 55, 47, 17, 174, 55, 47, 17, 182, 55, 47, 31, + 200, 30, 214, 199, 47, 17, 192, 76, 105, 119, 152, 229, 4, 105, 119, 87, + 229, 4, 105, 119, 152, 196, 105, 105, 119, 87, 196, 105, 105, 119, 152, + 198, 170, 237, 186, 229, 4, 105, 119, 87, 198, 170, 237, 186, 229, 4, + 105, 119, 152, 198, 170, 237, 186, 196, 105, 105, 119, 87, 198, 170, 237, + 186, 196, 105, 105, 119, 152, 208, 170, 237, 186, 229, 4, 105, 119, 87, + 208, 170, 237, 186, 229, 4, 105, 119, 152, 208, 170, 237, 186, 196, 105, + 105, 119, 87, 208, 170, 237, 186, 196, 105, 105, 119, 152, 142, 26, 207, + 101, 105, 119, 142, 152, 26, 51, 229, 227, 105, 119, 142, 87, 26, 51, + 219, 195, 105, 119, 87, 142, 26, 207, 101, 105, 119, 152, 142, 26, 220, + 28, 105, 119, 142, 152, 26, 46, 229, 227, 105, 119, 142, 87, 26, 46, 219, + 195, 105, 119, 87, 142, 26, 220, 28, 105, 119, 152, 130, 26, 207, 101, + 105, 119, 130, 152, 26, 51, 229, 227, 105, 119, 130, 87, 26, 51, 219, + 195, 105, 119, 87, 130, 26, 207, 101, 105, 119, 152, 130, 26, 220, 28, + 105, 119, 130, 152, 26, 46, 229, 227, 105, 119, 130, 87, 26, 46, 219, + 195, 105, 119, 87, 130, 26, 220, 28, 105, 119, 152, 84, 26, 207, 101, + 105, 119, 84, 152, 26, 51, 229, 227, 105, 119, 130, 87, 26, 51, 142, 219, + 195, 105, 119, 142, 87, 26, 51, 130, 219, 195, 105, 119, 84, 87, 26, 51, + 219, 195, 105, 119, 142, 152, 26, 51, 130, 229, 227, 105, 119, 130, 152, + 26, 51, 142, 229, 227, 105, 119, 87, 84, 26, 207, 101, 105, 119, 152, 84, + 26, 220, 28, 105, 119, 84, 152, 26, 46, 229, 227, 105, 119, 130, 87, 26, + 46, 142, 219, 195, 105, 119, 142, 87, 26, 46, 130, 219, 195, 105, 119, + 84, 87, 26, 46, 219, 195, 105, 119, 142, 152, 26, 46, 130, 229, 227, 105, + 119, 130, 152, 26, 46, 142, 229, 227, 105, 119, 87, 84, 26, 220, 28, 105, + 119, 152, 142, 26, 229, 4, 105, 119, 46, 87, 26, 51, 142, 219, 195, 105, + 119, 51, 87, 26, 46, 142, 219, 195, 105, 119, 142, 152, 26, 229, 5, 229, + 227, 105, 119, 142, 87, 26, 229, 5, 219, 195, 105, 119, 51, 152, 26, 46, + 142, 229, 227, 105, 119, 46, 152, 26, 51, 142, 229, 227, 105, 119, 87, + 142, 26, 229, 4, 105, 119, 152, 130, 26, 229, 4, 105, 119, 46, 87, 26, + 51, 130, 219, 195, 105, 119, 51, 87, 26, 46, 130, 219, 195, 105, 119, + 130, 152, 26, 229, 5, 229, 227, 105, 119, 130, 87, 26, 229, 5, 219, 195, + 105, 119, 51, 152, 26, 46, 130, 229, 227, 105, 119, 46, 152, 26, 51, 130, + 229, 227, 105, 119, 87, 130, 26, 229, 4, 105, 119, 152, 84, 26, 229, 4, + 105, 119, 46, 87, 26, 51, 84, 219, 195, 105, 119, 51, 87, 26, 46, 84, + 219, 195, 105, 119, 84, 152, 26, 229, 5, 229, 227, 105, 119, 130, 87, 26, + 142, 229, 5, 219, 195, 105, 119, 142, 87, 26, 130, 229, 5, 219, 195, 105, + 119, 84, 87, 26, 229, 5, 219, 195, 105, 119, 46, 130, 87, 26, 51, 142, + 219, 195, 105, 119, 51, 130, 87, 26, 46, 142, 219, 195, 105, 119, 46, + 142, 87, 26, 51, 130, 219, 195, 105, 119, 51, 142, 87, 26, 46, 130, 219, + 195, 105, 119, 142, 152, 26, 130, 229, 5, 229, 227, 105, 119, 130, 152, + 26, 142, 229, 5, 229, 227, 105, 119, 51, 152, 26, 46, 84, 229, 227, 105, + 119, 46, 152, 26, 51, 84, 229, 227, 105, 119, 87, 84, 26, 229, 4, 105, + 119, 152, 55, 237, 186, 229, 4, 105, 119, 87, 55, 237, 186, 229, 4, 105, + 119, 152, 55, 237, 186, 196, 105, 105, 119, 87, 55, 237, 186, 196, 105, + 105, 119, 55, 229, 4, 105, 119, 55, 196, 105, 105, 119, 142, 203, 74, 26, + 51, 235, 106, 105, 119, 142, 55, 26, 51, 203, 73, 105, 119, 55, 142, 26, + 207, 101, 105, 119, 142, 203, 74, 26, 46, 235, 106, 105, 119, 142, 55, + 26, 46, 203, 73, 105, 119, 55, 142, 26, 220, 28, 105, 119, 130, 203, 74, + 26, 51, 235, 106, 105, 119, 130, 55, 26, 51, 203, 73, 105, 119, 55, 130, + 26, 207, 101, 105, 119, 130, 203, 74, 26, 46, 235, 106, 105, 119, 130, + 55, 26, 46, 203, 73, 105, 119, 55, 130, 26, 220, 28, 105, 119, 84, 203, + 74, 26, 51, 235, 106, 105, 119, 84, 55, 26, 51, 203, 73, 105, 119, 55, + 84, 26, 207, 101, 105, 119, 84, 203, 74, 26, 46, 235, 106, 105, 119, 84, + 55, 26, 46, 203, 73, 105, 119, 55, 84, 26, 220, 28, 105, 119, 142, 203, + 74, 26, 229, 5, 235, 106, 105, 119, 142, 55, 26, 229, 5, 203, 73, 105, + 119, 55, 142, 26, 229, 4, 105, 119, 130, 203, 74, 26, 229, 5, 235, 106, + 105, 119, 130, 55, 26, 229, 5, 203, 73, 105, 119, 55, 130, 26, 229, 4, + 105, 119, 84, 203, 74, 26, 229, 5, 235, 106, 105, 119, 84, 55, 26, 229, + 5, 203, 73, 105, 119, 55, 84, 26, 229, 4, 105, 119, 152, 250, 115, 142, + 26, 207, 101, 105, 119, 152, 250, 115, 142, 26, 220, 28, 105, 119, 152, + 250, 115, 130, 26, 220, 28, 105, 119, 152, 250, 115, 130, 26, 207, 101, + 105, 119, 152, 237, 11, 113, 51, 115, 106, 220, 28, 105, 119, 152, 237, + 11, 113, 46, 115, 106, 207, 101, 105, 119, 152, 237, 11, 238, 183, 105, + 119, 152, 220, 28, 105, 119, 152, 197, 41, 105, 119, 152, 207, 101, 105, + 119, 152, 235, 96, 105, 119, 87, 220, 28, 105, 119, 87, 197, 41, 105, + 119, 87, 207, 101, 105, 119, 87, 235, 96, 105, 119, 152, 46, 26, 87, 207, + 101, 105, 119, 152, 130, 26, 87, 235, 96, 105, 119, 87, 46, 26, 152, 207, + 101, 105, 119, 87, 130, 26, 152, 235, 96, 113, 138, 247, 238, 106, 90, + 234, 144, 247, 238, 106, 90, 208, 168, 247, 238, 106, 112, 234, 142, 247, + 238, 106, 138, 247, 238, 106, 232, 214, 234, 142, 247, 238, 106, 112, + 208, 166, 247, 238, 106, 204, 146, 234, 142, 247, 238, 232, 71, 247, 238, + 46, 204, 146, 234, 142, 247, 238, 46, 112, 208, 166, 247, 238, 46, 232, + 214, 234, 142, 247, 238, 46, 138, 247, 238, 46, 112, 234, 142, 247, 238, + 46, 90, 208, 168, 247, 238, 46, 90, 234, 144, 247, 238, 51, 138, 247, + 238, 152, 204, 52, 217, 31, 204, 52, 237, 191, 204, 52, 113, 90, 234, + 144, 247, 238, 51, 90, 234, 144, 247, 238, 208, 172, 106, 220, 28, 208, + 172, 106, 207, 101, 208, 172, 113, 220, 28, 208, 172, 113, 46, 26, 106, + 46, 26, 106, 207, 101, 208, 172, 113, 46, 26, 106, 207, 101, 208, 172, + 113, 46, 26, 113, 51, 26, 106, 220, 28, 208, 172, 113, 46, 26, 113, 51, + 26, 106, 207, 101, 208, 172, 113, 207, 101, 208, 172, 113, 51, 26, 106, + 220, 28, 208, 172, 113, 51, 26, 106, 46, 26, 106, 207, 101, 60, 202, 106, + 62, 202, 106, 62, 50, 4, 207, 7, 238, 222, 62, 50, 238, 254, 60, 2, 202, + 106, 50, 4, 229, 5, 232, 249, 50, 4, 84, 232, 249, 50, 4, 211, 146, 238, + 177, 232, 249, 50, 4, 113, 46, 115, 106, 51, 232, 249, 50, 4, 113, 51, + 115, 106, 46, 232, 249, 50, 4, 237, 11, 238, 177, 232, 249, 60, 2, 202, + 106, 62, 2, 202, 106, 60, 207, 242, 62, 207, 242, 60, 84, 207, 242, 62, + 84, 207, 242, 60, 210, 234, 62, 210, 234, 60, 197, 40, 198, 185, 62, 197, + 40, 198, 185, 60, 197, 40, 2, 198, 185, 62, 197, 40, 2, 198, 185, 60, + 207, 96, 198, 185, 62, 207, 96, 198, 185, 60, 207, 96, 2, 198, 185, 62, + 207, 96, 2, 198, 185, 60, 207, 96, 209, 189, 62, 207, 96, 209, 189, 60, + 235, 95, 198, 185, 62, 235, 95, 198, 185, 60, 235, 95, 2, 198, 185, 62, + 235, 95, 2, 198, 185, 60, 220, 23, 198, 185, 62, 220, 23, 198, 185, 60, + 220, 23, 2, 198, 185, 62, 220, 23, 2, 198, 185, 60, 220, 23, 209, 189, + 62, 220, 23, 209, 189, 60, 237, 4, 62, 237, 4, 62, 237, 5, 238, 254, 60, + 2, 237, 4, 232, 223, 219, 43, 62, 242, 130, 235, 111, 242, 130, 242, 131, + 4, 84, 232, 249, 247, 102, 60, 242, 130, 242, 131, 4, 46, 138, 247, 248, + 242, 131, 4, 51, 138, 247, 248, 242, 131, 4, 106, 138, 247, 248, 242, + 131, 4, 113, 138, 247, 248, 242, 131, 4, 113, 51, 208, 172, 247, 248, + 242, 131, 4, 251, 9, 247, 77, 113, 46, 208, 172, 247, 248, 46, 138, 60, + 242, 130, 51, 138, 60, 242, 130, 223, 123, 247, 106, 223, 123, 62, 242, + 130, 113, 138, 223, 123, 62, 242, 130, 106, 138, 223, 123, 62, 242, 130, + 113, 46, 208, 172, 242, 124, 250, 114, 113, 51, 208, 172, 242, 124, 250, + 114, 106, 51, 208, 172, 242, 124, 250, 114, 106, 46, 208, 172, 242, 124, + 250, 114, 113, 138, 242, 130, 106, 138, 242, 130, 60, 106, 51, 198, 185, + 60, 106, 46, 198, 185, 60, 113, 46, 198, 185, 60, 113, 51, 198, 185, 62, + 247, 106, 50, 4, 46, 138, 247, 248, 50, 4, 51, 138, 247, 248, 50, 4, 113, + 46, 237, 11, 138, 247, 248, 50, 4, 106, 51, 237, 11, 138, 247, 248, 62, + 50, 4, 84, 248, 7, 219, 175, 62, 197, 40, 198, 186, 4, 236, 114, 197, 40, + 198, 186, 4, 46, 138, 247, 248, 197, 40, 198, 186, 4, 51, 138, 247, 248, + 220, 73, 242, 130, 62, 50, 4, 113, 46, 208, 171, 62, 50, 4, 106, 46, 208, + 171, 62, 50, 4, 106, 51, 208, 171, 62, 50, 4, 113, 51, 208, 171, 62, 242, + 131, 4, 113, 46, 208, 171, 62, 242, 131, 4, 106, 46, 208, 171, 62, 242, + 131, 4, 106, 51, 208, 171, 62, 242, 131, 4, 113, 51, 208, 171, 113, 46, + 198, 185, 113, 51, 198, 185, 106, 46, 198, 185, 62, 217, 31, 202, 106, + 60, 217, 31, 202, 106, 62, 217, 31, 2, 202, 106, 60, 217, 31, 2, 202, + 106, 106, 51, 198, 185, 60, 201, 124, 4, 208, 12, 242, 75, 197, 81, 202, + 214, 242, 41, 60, 202, 19, 62, 202, 19, 219, 192, 199, 143, 201, 123, + 250, 57, 213, 134, 237, 58, 213, 134, 239, 7, 211, 169, 60, 200, 41, 62, + 200, 41, 248, 213, 247, 173, 248, 213, 105, 4, 242, 243, 248, 213, 105, + 4, 193, 223, 206, 51, 197, 82, 4, 208, 42, 235, 69, 228, 202, 248, 58, + 62, 203, 204, 210, 42, 60, 203, 204, 210, 42, 204, 39, 207, 168, 207, 16, + 232, 179, 229, 234, 247, 106, 60, 46, 209, 188, 223, 176, 60, 51, 209, + 188, 223, 176, 62, 46, 209, 188, 223, 176, 62, 130, 209, 188, 223, 176, + 62, 51, 209, 188, 223, 176, 62, 142, 209, 188, 223, 176, 203, 11, 26, + 238, 181, 246, 187, 57, 208, 54, 57, 248, 15, 57, 247, 10, 250, 196, 211, + 147, 238, 183, 242, 216, 207, 153, 238, 184, 80, 219, 64, 238, 184, 80, + 223, 30, 202, 20, 26, 238, 193, 233, 62, 109, 251, 117, 204, 42, 230, 70, + 26, 203, 116, 210, 180, 109, 193, 11, 193, 95, 198, 175, 39, 229, 229, + 198, 175, 39, 220, 102, 198, 175, 39, 232, 231, 198, 175, 39, 199, 144, + 198, 175, 39, 194, 52, 198, 175, 39, 194, 129, 198, 175, 39, 216, 9, 198, + 175, 39, 234, 189, 194, 80, 80, 237, 32, 62, 232, 83, 233, 91, 62, 202, + 230, 233, 91, 60, 202, 230, 233, 91, 62, 201, 124, 4, 208, 12, 232, 226, + 208, 168, 216, 29, 220, 66, 208, 168, 216, 29, 216, 255, 233, 30, 57, + 234, 189, 217, 166, 57, 222, 199, 206, 13, 197, 22, 214, 189, 209, 202, + 250, 100, 200, 98, 231, 145, 246, 239, 219, 246, 196, 9, 219, 206, 205, + 234, 206, 77, 246, 221, 250, 132, 209, 244, 62, 242, 225, 221, 176, 62, + 242, 225, 208, 160, 62, 242, 225, 207, 25, 62, 242, 225, 248, 5, 62, 242, + 225, 221, 122, 62, 242, 225, 210, 192, 60, 242, 225, 221, 176, 60, 242, + 225, 208, 160, 60, 242, 225, 207, 25, 60, 242, 225, 248, 5, 60, 242, 225, + 221, 122, 60, 242, 225, 210, 192, 60, 202, 158, 201, 136, 62, 229, 234, + 201, 136, 62, 237, 5, 201, 136, 60, 242, 72, 201, 136, 62, 202, 158, 201, + 136, 60, 229, 234, 201, 136, 60, 237, 5, 201, 136, 62, 242, 72, 201, 136, + 228, 202, 202, 111, 208, 168, 213, 105, 234, 144, 213, 105, 248, 119, + 234, 144, 213, 100, 248, 119, 203, 34, 213, 100, 215, 185, 232, 196, 57, + 215, 185, 215, 43, 57, 215, 185, 204, 26, 57, 194, 91, 200, 248, 238, + 183, 234, 186, 200, 248, 238, 183, 197, 51, 207, 238, 109, 207, 238, 16, + 39, 197, 205, 209, 222, 207, 238, 16, 39, 197, 203, 209, 222, 207, 238, + 16, 39, 197, 202, 209, 222, 207, 238, 16, 39, 197, 200, 209, 222, 207, + 238, 16, 39, 197, 198, 209, 222, 207, 238, 16, 39, 197, 196, 209, 222, + 207, 238, 16, 39, 197, 194, 209, 222, 207, 238, 16, 39, 231, 142, 217, + 99, 60, 197, 51, 207, 238, 109, 207, 239, 210, 252, 109, 210, 221, 210, + 252, 109, 210, 125, 210, 252, 57, 194, 78, 109, 236, 253, 233, 90, 236, + 253, 233, 89, 236, 253, 233, 88, 236, 253, 233, 87, 236, 253, 233, 86, + 236, 253, 233, 85, 62, 242, 131, 4, 78, 207, 101, 62, 242, 131, 4, 103, + 236, 111, 60, 242, 131, 4, 62, 78, 207, 101, 60, 242, 131, 4, 103, 62, + 236, 111, 216, 45, 39, 193, 95, 216, 45, 39, 193, 10, 236, 234, 39, 230, + 205, 193, 95, 236, 234, 39, 219, 238, 193, 10, 236, 234, 39, 219, 238, + 193, 95, 236, 234, 39, 230, 205, 193, 10, 62, 232, 206, 60, 232, 206, + 230, 70, 26, 210, 47, 250, 219, 238, 180, 201, 59, 202, 29, 80, 251, 91, + 205, 252, 251, 25, 232, 175, 231, 155, 202, 29, 80, 229, 201, 250, 16, + 109, 232, 191, 211, 121, 62, 202, 19, 112, 219, 170, 238, 240, 207, 101, + 112, 219, 170, 238, 240, 220, 28, 194, 140, 57, 139, 195, 240, 57, 235, + 101, 233, 30, 57, 235, 101, 217, 166, 57, 223, 133, 233, 30, 26, 217, + 166, 57, 217, 166, 26, 233, 30, 57, 217, 166, 4, 201, 208, 57, 217, 166, + 4, 201, 208, 26, 217, 166, 26, 233, 30, 57, 84, 217, 166, 4, 201, 208, + 57, 229, 5, 217, 166, 4, 201, 208, 57, 217, 31, 62, 242, 130, 217, 31, + 60, 242, 130, 217, 31, 2, 62, 242, 130, 217, 119, 109, 236, 170, 109, + 197, 48, 210, 220, 109, 242, 53, 232, 66, 197, 18, 214, 180, 246, 123, + 211, 43, 222, 205, 196, 50, 242, 195, 60, 216, 30, 219, 189, 204, 75, + 204, 177, 208, 150, 204, 154, 202, 202, 248, 217, 248, 179, 108, 222, 1, + 62, 235, 81, 217, 160, 62, 235, 81, 221, 176, 60, 235, 81, 217, 160, 60, + 235, 81, 221, 176, 202, 215, 194, 39, 202, 218, 201, 124, 248, 93, 242, + 75, 208, 41, 60, 202, 214, 199, 145, 242, 76, 26, 208, 41, 163, 62, 203, + 204, 210, 42, 163, 60, 203, 204, 210, 42, 62, 237, 5, 223, 191, 202, 106, + 238, 176, 220, 80, 236, 201, 246, 217, 211, 172, 210, 47, 246, 218, 202, + 249, 229, 211, 4, 62, 238, 183, 47, 238, 176, 220, 80, 246, 113, 213, + 143, 234, 57, 250, 249, 211, 203, 46, 194, 115, 198, 216, 60, 197, 217, + 46, 194, 115, 198, 216, 62, 197, 217, 46, 194, 115, 198, 216, 60, 46, + 220, 81, 216, 254, 62, 46, 220, 81, 216, 254, 235, 76, 202, 240, 57, 87, + 62, 235, 95, 198, 185, 46, 242, 84, 234, 57, 108, 206, 51, 233, 71, 237, + 11, 223, 191, 62, 242, 131, 223, 191, 60, 202, 106, 60, 198, 149, 207, + 179, 46, 234, 56, 207, 179, 46, 234, 55, 250, 31, 16, 39, 197, 22, 87, + 242, 131, 4, 201, 208, 26, 103, 236, 112, 58, 210, 143, 207, 98, 223, + 135, 210, 143, 220, 25, 223, 135, 210, 143, 223, 121, 210, 143, 60, 238, + 184, 211, 212, 203, 233, 203, 221, 203, 169, 242, 160, 246, 195, 229, + 138, 203, 42, 231, 156, 194, 39, 228, 175, 231, 156, 4, 230, 39, 217, + 142, 16, 39, 219, 194, 216, 9, 197, 82, 211, 212, 230, 195, 232, 120, + 232, 207, 223, 191, 229, 25, 233, 20, 206, 72, 50, 232, 119, 238, 222, + 203, 14, 228, 50, 203, 18, 210, 117, 4, 248, 217, 200, 22, 223, 50, 248, + 199, 109, 229, 239, 230, 207, 109, 232, 74, 209, 39, 238, 149, 211, 212, + 60, 202, 106, 62, 232, 207, 4, 229, 5, 85, 60, 201, 209, 60, 206, 82, + 205, 238, 113, 247, 243, 205, 238, 60, 205, 238, 106, 247, 243, 205, 238, + 62, 205, 238, 62, 87, 242, 244, 77, 200, 42, 219, 104, 57, 200, 115, 235, + 75, 251, 50, 234, 52, 208, 39, 232, 219, 208, 39, 230, 62, 196, 37, 230, + 62, 193, 247, 230, 62, 106, 51, 210, 153, 210, 153, 113, 51, 210, 153, + 62, 214, 49, 60, 214, 49, 242, 244, 77, 87, 242, 244, 77, 215, 214, 193, + 223, 87, 215, 214, 193, 223, 248, 213, 193, 223, 87, 248, 213, 193, 223, + 211, 121, 33, 238, 183, 87, 33, 238, 183, 211, 184, 246, 138, 238, 183, + 87, 211, 184, 246, 138, 238, 183, 8, 238, 183, 204, 50, 62, 8, 238, 183, + 211, 121, 8, 238, 183, 217, 163, 238, 183, 202, 20, 80, 237, 178, 232, + 119, 200, 61, 250, 37, 232, 119, 248, 214, 250, 37, 87, 232, 119, 248, + 214, 250, 37, 232, 119, 242, 70, 250, 37, 60, 232, 119, 209, 190, 202, + 19, 62, 232, 119, 209, 190, 202, 19, 202, 153, 201, 218, 211, 121, 62, + 202, 19, 47, 62, 202, 19, 211, 184, 246, 138, 60, 202, 19, 60, 246, 138, + 62, 202, 19, 211, 121, 60, 202, 19, 87, 211, 121, 60, 202, 19, 209, 254, + 202, 19, 204, 50, 62, 202, 19, 87, 250, 37, 211, 184, 246, 138, 250, 37, + 234, 148, 202, 122, 250, 37, 234, 148, 209, 190, 60, 202, 19, 234, 148, + 209, 190, 209, 254, 202, 19, 203, 41, 209, 190, 60, 202, 19, 234, 148, + 209, 190, 207, 240, 60, 202, 19, 87, 234, 148, 209, 190, 207, 240, 60, + 202, 19, 197, 245, 209, 190, 60, 202, 19, 203, 36, 209, 190, 250, 37, + 200, 61, 250, 37, 211, 184, 246, 138, 200, 61, 250, 37, 87, 200, 61, 250, + 37, 203, 41, 210, 105, 60, 26, 62, 232, 178, 60, 232, 178, 62, 232, 178, + 234, 148, 210, 105, 211, 121, 60, 232, 178, 47, 211, 184, 246, 138, 234, + 148, 209, 190, 202, 19, 87, 200, 61, 209, 254, 250, 37, 202, 216, 199, + 107, 198, 178, 202, 216, 87, 242, 221, 202, 216, 202, 155, 87, 202, 155, + 248, 214, 250, 37, 234, 148, 200, 61, 209, 74, 250, 37, 87, 234, 148, + 200, 61, 209, 74, 250, 37, 238, 184, 77, 204, 50, 62, 242, 130, 214, 199, + 108, 238, 184, 77, 106, 51, 235, 71, 62, 202, 106, 113, 51, 235, 71, 62, + 202, 106, 106, 51, 204, 50, 62, 202, 106, 113, 51, 204, 50, 62, 202, 106, + 60, 208, 159, 122, 211, 150, 62, 208, 159, 122, 211, 150, 62, 233, 204, + 122, 211, 150, 60, 237, 5, 216, 113, 62, 193, 223, 87, 233, 204, 122, + 109, 152, 84, 161, 217, 31, 84, 161, 87, 84, 161, 87, 203, 74, 163, 242, + 39, 208, 142, 122, 211, 150, 87, 203, 74, 242, 39, 208, 142, 122, 211, + 150, 87, 55, 163, 242, 39, 208, 142, 122, 211, 150, 87, 55, 242, 39, 208, + 142, 122, 211, 150, 87, 132, 203, 74, 242, 39, 208, 142, 122, 211, 150, + 87, 132, 55, 242, 39, 208, 142, 122, 211, 150, 238, 130, 202, 0, 210, + 244, 3, 211, 150, 87, 233, 204, 122, 211, 150, 87, 229, 234, 233, 204, + 122, 211, 150, 87, 60, 229, 233, 207, 16, 87, 60, 229, 234, 247, 106, + 232, 179, 229, 233, 207, 16, 232, 179, 229, 234, 247, 106, 217, 31, 46, + 210, 231, 211, 150, 217, 31, 51, 210, 231, 211, 150, 217, 31, 232, 192, + 46, 210, 231, 211, 150, 217, 31, 232, 192, 51, 210, 231, 211, 150, 217, + 31, 220, 23, 250, 208, 247, 165, 211, 150, 217, 31, 207, 96, 250, 208, + 247, 165, 211, 150, 87, 220, 23, 250, 208, 208, 142, 122, 211, 150, 87, + 207, 96, 250, 208, 208, 142, 122, 211, 150, 87, 220, 23, 250, 208, 247, + 165, 211, 150, 87, 207, 96, 250, 208, 247, 165, 211, 150, 152, 46, 198, + 237, 204, 2, 247, 165, 211, 150, 152, 51, 198, 237, 204, 2, 247, 165, + 211, 150, 217, 31, 46, 238, 138, 247, 165, 211, 150, 217, 31, 51, 238, + 138, 247, 165, 211, 150, 236, 213, 214, 199, 47, 17, 101, 236, 213, 214, + 199, 47, 17, 104, 236, 213, 214, 199, 47, 17, 133, 236, 213, 214, 199, + 47, 17, 134, 236, 213, 214, 199, 47, 17, 151, 236, 213, 214, 199, 47, 17, + 170, 236, 213, 214, 199, 47, 17, 179, 236, 213, 214, 199, 47, 17, 174, + 236, 213, 214, 199, 47, 17, 182, 236, 213, 214, 199, 47, 31, 200, 30, + 236, 213, 47, 49, 17, 101, 236, 213, 47, 49, 17, 104, 236, 213, 47, 49, + 17, 133, 236, 213, 47, 49, 17, 134, 236, 213, 47, 49, 17, 151, 236, 213, + 47, 49, 17, 170, 236, 213, 47, 49, 17, 179, 236, 213, 47, 49, 17, 174, + 236, 213, 47, 49, 17, 182, 236, 213, 47, 49, 31, 200, 30, 236, 213, 214, + 199, 47, 49, 17, 101, 236, 213, 214, 199, 47, 49, 17, 104, 236, 213, 214, + 199, 47, 49, 17, 133, 236, 213, 214, 199, 47, 49, 17, 134, 236, 213, 214, + 199, 47, 49, 17, 151, 236, 213, 214, 199, 47, 49, 17, 170, 236, 213, 214, + 199, 47, 49, 17, 179, 236, 213, 214, 199, 47, 49, 17, 174, 236, 213, 214, + 199, 47, 49, 17, 182, 236, 213, 214, 199, 47, 49, 31, 200, 30, 87, 194, + 63, 94, 54, 87, 102, 57, 87, 216, 113, 57, 87, 236, 172, 57, 87, 202, + 171, 234, 186, 54, 87, 94, 54, 87, 178, 234, 186, 54, 235, 86, 209, 192, + 94, 54, 87, 207, 8, 94, 54, 198, 184, 94, 54, 87, 198, 184, 94, 54, 237, + 184, 198, 184, 94, 54, 87, 237, 184, 198, 184, 94, 54, 60, 94, 54, 199, + 160, 198, 247, 94, 250, 77, 199, 160, 247, 186, 94, 250, 77, 60, 94, 250, + 77, 87, 60, 238, 130, 235, 92, 26, 94, 54, 87, 60, 238, 130, 197, 30, 26, + 94, 54, 202, 103, 60, 94, 54, 87, 239, 20, 60, 94, 54, 207, 95, 62, 94, + 54, 220, 22, 62, 94, 54, 248, 251, 204, 50, 62, 94, 54, 232, 86, 204, 50, + 62, 94, 54, 87, 106, 207, 94, 62, 94, 54, 87, 113, 207, 94, 62, 94, 54, + 213, 107, 106, 207, 94, 62, 94, 54, 238, 138, 219, 69, 213, 107, 113, + 207, 94, 62, 94, 54, 47, 87, 62, 94, 54, 194, 74, 94, 54, 247, 247, 202, + 171, 234, 186, 54, 247, 247, 94, 54, 247, 247, 178, 234, 186, 54, 87, + 247, 247, 202, 171, 234, 186, 54, 87, 247, 247, 94, 54, 87, 247, 247, + 178, 234, 186, 54, 200, 63, 94, 54, 87, 200, 62, 94, 54, 194, 101, 94, + 54, 87, 194, 101, 94, 54, 211, 178, 94, 54, 55, 238, 138, 219, 69, 112, + 236, 223, 250, 207, 62, 198, 186, 238, 254, 2, 62, 198, 185, 210, 120, + 211, 184, 201, 153, 211, 184, 201, 105, 46, 206, 157, 248, 237, 237, 82, + 51, 206, 157, 248, 237, 237, 82, 211, 164, 4, 78, 223, 145, 207, 169, + 202, 190, 209, 114, 201, 153, 201, 106, 209, 114, 202, 189, 84, 248, 194, + 4, 229, 5, 111, 13, 207, 73, 237, 10, 184, 236, 171, 13, 233, 71, 237, + 10, 108, 219, 93, 250, 217, 108, 219, 93, 211, 163, 62, 237, 5, 4, 246, + 136, 236, 114, 26, 4, 236, 114, 234, 116, 80, 211, 176, 197, 29, 106, 51, + 238, 224, 4, 236, 114, 113, 46, 238, 224, 4, 236, 114, 46, 211, 123, 222, + 231, 51, 211, 123, 222, 231, 232, 71, 211, 123, 222, 231, 220, 73, 130, + 200, 159, 220, 73, 142, 200, 159, 46, 26, 51, 55, 198, 8, 46, 26, 51, + 200, 159, 46, 215, 218, 184, 51, 200, 159, 184, 46, 200, 159, 130, 200, + 160, 4, 242, 131, 58, 219, 44, 236, 178, 247, 64, 229, 5, 206, 202, 62, + 239, 19, 237, 4, 62, 239, 19, 237, 5, 4, 114, 199, 117, 62, 239, 19, 237, + 5, 4, 94, 199, 117, 62, 50, 4, 114, 199, 117, 62, 50, 4, 94, 199, 117, + 13, 46, 62, 50, 186, 13, 51, 62, 50, 186, 13, 46, 250, 208, 186, 13, 51, + 250, 208, 186, 13, 46, 55, 250, 208, 186, 13, 51, 55, 250, 208, 186, 13, + 46, 62, 198, 237, 204, 2, 186, 13, 51, 62, 198, 237, 204, 2, 186, 13, 46, + 232, 192, 210, 230, 13, 51, 232, 192, 210, 230, 197, 30, 208, 170, 54, + 235, 92, 208, 170, 54, 250, 182, 231, 195, 242, 131, 54, 242, 86, 231, + 195, 242, 131, 54, 51, 61, 4, 47, 209, 206, 184, 114, 54, 184, 94, 54, + 184, 46, 51, 54, 184, 114, 55, 54, 184, 94, 55, 54, 184, 46, 51, 55, 54, + 184, 114, 61, 232, 89, 161, 184, 94, 61, 232, 89, 161, 184, 114, 55, 61, + 232, 89, 161, 184, 94, 55, 61, 232, 89, 161, 184, 94, 202, 99, 54, 66, + 67, 247, 241, 66, 67, 236, 110, 66, 67, 235, 238, 66, 67, 236, 109, 66, + 67, 235, 174, 66, 67, 236, 45, 66, 67, 235, 237, 66, 67, 236, 108, 66, + 67, 235, 142, 66, 67, 236, 13, 66, 67, 235, 205, 66, 67, 236, 76, 66, 67, + 235, 173, 66, 67, 236, 44, 66, 67, 235, 236, 66, 67, 236, 107, 66, 67, + 235, 126, 66, 67, 235, 253, 66, 67, 235, 189, 66, 67, 236, 60, 66, 67, + 235, 157, 66, 67, 236, 28, 66, 67, 235, 220, 66, 67, 236, 91, 66, 67, + 235, 141, 66, 67, 236, 12, 66, 67, 235, 204, 66, 67, 236, 75, 66, 67, + 235, 172, 66, 67, 236, 43, 66, 67, 235, 235, 66, 67, 236, 106, 66, 67, + 235, 118, 66, 67, 235, 245, 66, 67, 235, 181, 66, 67, 236, 52, 66, 67, + 235, 149, 66, 67, 236, 20, 66, 67, 235, 212, 66, 67, 236, 83, 66, 67, + 235, 133, 66, 67, 236, 4, 66, 67, 235, 196, 66, 67, 236, 67, 66, 67, 235, + 164, 66, 67, 236, 35, 66, 67, 235, 227, 66, 67, 236, 98, 66, 67, 235, + 125, 66, 67, 235, 252, 66, 67, 235, 188, 66, 67, 236, 59, 66, 67, 235, + 156, 66, 67, 236, 27, 66, 67, 235, 219, 66, 67, 236, 90, 66, 67, 235, + 140, 66, 67, 236, 11, 66, 67, 235, 203, 66, 67, 236, 74, 66, 67, 235, + 171, 66, 67, 236, 42, 66, 67, 235, 234, 66, 67, 236, 105, 66, 67, 235, + 114, 66, 67, 235, 241, 66, 67, 235, 177, 66, 67, 236, 48, 66, 67, 235, + 145, 66, 67, 236, 16, 66, 67, 235, 208, 66, 67, 236, 79, 66, 67, 235, + 129, 66, 67, 236, 0, 66, 67, 235, 192, 66, 67, 236, 63, 66, 67, 235, 160, + 66, 67, 236, 31, 66, 67, 235, 223, 66, 67, 236, 94, 66, 67, 235, 121, 66, + 67, 235, 248, 66, 67, 235, 184, 66, 67, 236, 55, 66, 67, 235, 152, 66, + 67, 236, 23, 66, 67, 235, 215, 66, 67, 236, 86, 66, 67, 235, 136, 66, 67, + 236, 7, 66, 67, 235, 199, 66, 67, 236, 70, 66, 67, 235, 167, 66, 67, 236, + 38, 66, 67, 235, 230, 66, 67, 236, 101, 66, 67, 235, 117, 66, 67, 235, + 244, 66, 67, 235, 180, 66, 67, 236, 51, 66, 67, 235, 148, 66, 67, 236, + 19, 66, 67, 235, 211, 66, 67, 236, 82, 66, 67, 235, 132, 66, 67, 236, 3, + 66, 67, 235, 195, 66, 67, 236, 66, 66, 67, 235, 163, 66, 67, 236, 34, 66, + 67, 235, 226, 66, 67, 236, 97, 66, 67, 235, 124, 66, 67, 235, 251, 66, + 67, 235, 187, 66, 67, 236, 58, 66, 67, 235, 155, 66, 67, 236, 26, 66, 67, + 235, 218, 66, 67, 236, 89, 66, 67, 235, 139, 66, 67, 236, 10, 66, 67, + 235, 202, 66, 67, 236, 73, 66, 67, 235, 170, 66, 67, 236, 41, 66, 67, + 235, 233, 66, 67, 236, 104, 66, 67, 235, 112, 66, 67, 235, 239, 66, 67, + 235, 175, 66, 67, 236, 46, 66, 67, 235, 143, 66, 67, 236, 14, 66, 67, + 235, 206, 66, 67, 236, 77, 66, 67, 235, 127, 66, 67, 235, 254, 66, 67, + 235, 190, 66, 67, 236, 61, 66, 67, 235, 158, 66, 67, 236, 29, 66, 67, + 235, 221, 66, 67, 236, 92, 66, 67, 235, 119, 66, 67, 235, 246, 66, 67, + 235, 182, 66, 67, 236, 53, 66, 67, 235, 150, 66, 67, 236, 21, 66, 67, + 235, 213, 66, 67, 236, 84, 66, 67, 235, 134, 66, 67, 236, 5, 66, 67, 235, + 197, 66, 67, 236, 68, 66, 67, 235, 165, 66, 67, 236, 36, 66, 67, 235, + 228, 66, 67, 236, 99, 66, 67, 235, 115, 66, 67, 235, 242, 66, 67, 235, + 178, 66, 67, 236, 49, 66, 67, 235, 146, 66, 67, 236, 17, 66, 67, 235, + 209, 66, 67, 236, 80, 66, 67, 235, 130, 66, 67, 236, 1, 66, 67, 235, 193, + 66, 67, 236, 64, 66, 67, 235, 161, 66, 67, 236, 32, 66, 67, 235, 224, 66, + 67, 236, 95, 66, 67, 235, 122, 66, 67, 235, 249, 66, 67, 235, 185, 66, + 67, 236, 56, 66, 67, 235, 153, 66, 67, 236, 24, 66, 67, 235, 216, 66, 67, + 236, 87, 66, 67, 235, 137, 66, 67, 236, 8, 66, 67, 235, 200, 66, 67, 236, + 71, 66, 67, 235, 168, 66, 67, 236, 39, 66, 67, 235, 231, 66, 67, 236, + 102, 66, 67, 235, 113, 66, 67, 235, 240, 66, 67, 235, 176, 66, 67, 236, + 47, 66, 67, 235, 144, 66, 67, 236, 15, 66, 67, 235, 207, 66, 67, 236, 78, + 66, 67, 235, 128, 66, 67, 235, 255, 66, 67, 235, 191, 66, 67, 236, 62, + 66, 67, 235, 159, 66, 67, 236, 30, 66, 67, 235, 222, 66, 67, 236, 93, 66, + 67, 235, 120, 66, 67, 235, 247, 66, 67, 235, 183, 66, 67, 236, 54, 66, + 67, 235, 151, 66, 67, 236, 22, 66, 67, 235, 214, 66, 67, 236, 85, 66, 67, + 235, 135, 66, 67, 236, 6, 66, 67, 235, 198, 66, 67, 236, 69, 66, 67, 235, + 166, 66, 67, 236, 37, 66, 67, 235, 229, 66, 67, 236, 100, 66, 67, 235, + 116, 66, 67, 235, 243, 66, 67, 235, 179, 66, 67, 236, 50, 66, 67, 235, + 147, 66, 67, 236, 18, 66, 67, 235, 210, 66, 67, 236, 81, 66, 67, 235, + 131, 66, 67, 236, 2, 66, 67, 235, 194, 66, 67, 236, 65, 66, 67, 235, 162, + 66, 67, 236, 33, 66, 67, 235, 225, 66, 67, 236, 96, 66, 67, 235, 123, 66, + 67, 235, 250, 66, 67, 235, 186, 66, 67, 236, 57, 66, 67, 235, 154, 66, + 67, 236, 25, 66, 67, 235, 217, 66, 67, 236, 88, 66, 67, 235, 138, 66, 67, + 236, 9, 66, 67, 235, 201, 66, 67, 236, 72, 66, 67, 235, 169, 66, 67, 236, + 40, 66, 67, 235, 232, 66, 67, 236, 103, 94, 197, 220, 61, 4, 84, 111, 94, + 197, 220, 61, 4, 55, 84, 111, 114, 55, 61, 4, 84, 111, 94, 55, 61, 4, 84, + 111, 46, 51, 55, 61, 4, 84, 111, 94, 197, 220, 61, 232, 89, 161, 114, 55, + 61, 232, 89, 161, 94, 55, 61, 232, 89, 161, 235, 92, 61, 4, 229, 5, 111, + 197, 30, 61, 4, 229, 5, 111, 197, 30, 198, 170, 54, 235, 92, 198, 170, + 54, 114, 55, 237, 186, 54, 94, 55, 237, 186, 54, 114, 198, 170, 237, 186, + 54, 94, 198, 170, 237, 186, 54, 94, 197, 220, 198, 170, 237, 186, 54, 94, + 61, 4, 235, 111, 201, 255, 197, 30, 61, 115, 161, 235, 92, 61, 115, 161, + 94, 61, 4, 200, 148, 4, 84, 111, 94, 61, 4, 200, 148, 4, 55, 84, 111, 94, + 197, 220, 61, 4, 200, 147, 94, 197, 220, 61, 4, 200, 148, 4, 84, 111, 94, + 197, 220, 61, 4, 200, 148, 4, 55, 84, 111, 114, 250, 79, 94, 250, 79, + 114, 55, 250, 79, 94, 55, 250, 79, 114, 61, 115, 60, 237, 4, 94, 61, 115, + 60, 237, 4, 114, 61, 232, 89, 248, 194, 115, 60, 237, 4, 94, 61, 232, 89, + 248, 194, 115, 60, 237, 4, 178, 194, 91, 26, 202, 171, 234, 186, 54, 178, + 234, 186, 26, 202, 171, 194, 91, 54, 178, 194, 91, 61, 4, 128, 178, 234, + 186, 61, 4, 128, 202, 171, 234, 186, 61, 4, 128, 202, 171, 194, 91, 61, + 4, 128, 178, 194, 91, 61, 26, 178, 234, 186, 54, 178, 234, 186, 61, 26, + 202, 171, 234, 186, 54, 202, 171, 234, 186, 61, 26, 202, 171, 194, 91, + 54, 202, 171, 194, 91, 61, 26, 178, 194, 91, 54, 207, 73, 237, 11, 238, + 176, 233, 71, 237, 10, 233, 71, 237, 11, 238, 176, 207, 73, 237, 10, 202, + 171, 234, 186, 61, 238, 176, 178, 234, 186, 54, 178, 234, 186, 61, 238, + 176, 202, 171, 234, 186, 54, 233, 71, 237, 11, 238, 176, 178, 234, 186, + 54, 207, 73, 237, 11, 238, 176, 202, 171, 234, 186, 54, 178, 234, 186, + 61, 238, 176, 178, 194, 91, 54, 178, 194, 91, 61, 238, 176, 178, 234, + 186, 54, 194, 125, 61, 209, 188, 236, 203, 207, 101, 61, 209, 188, 94, + 199, 216, 238, 128, 197, 29, 61, 209, 188, 94, 199, 216, 238, 128, 235, + 91, 61, 209, 188, 235, 92, 199, 216, 238, 128, 220, 18, 61, 209, 188, + 235, 92, 199, 216, 238, 128, 207, 90, 207, 93, 250, 115, 242, 86, 54, + 220, 21, 250, 115, 250, 182, 54, 198, 249, 250, 115, 250, 182, 54, 247, + 188, 250, 115, 250, 182, 54, 198, 249, 250, 115, 242, 86, 61, 4, 216, + 112, 198, 249, 250, 115, 250, 182, 61, 4, 209, 206, 106, 51, 204, 182, + 242, 86, 54, 106, 46, 204, 182, 250, 182, 54, 250, 182, 242, 84, 242, + 131, 54, 242, 86, 242, 84, 242, 131, 54, 94, 61, 95, 203, 195, 114, 54, + 114, 61, 95, 203, 195, 94, 54, 203, 195, 94, 61, 95, 114, 54, 94, 61, 4, + 102, 63, 114, 61, 4, 102, 63, 94, 61, 199, 151, 193, 223, 46, 51, 61, + 199, 151, 2, 242, 130, 197, 30, 197, 220, 61, 232, 89, 2, 242, 130, 46, + 173, 130, 51, 173, 142, 230, 21, 46, 173, 142, 51, 173, 130, 230, 21, + 130, 173, 51, 142, 173, 46, 230, 21, 130, 173, 46, 142, 173, 51, 230, 21, + 46, 173, 130, 51, 173, 130, 230, 21, 130, 173, 51, 142, 173, 51, 230, 21, + 46, 173, 142, 51, 173, 142, 230, 21, 130, 173, 46, 142, 173, 46, 230, 21, + 114, 230, 22, 4, 173, 130, 115, 161, 94, 230, 22, 4, 173, 130, 115, 161, + 197, 30, 230, 22, 4, 173, 51, 115, 161, 235, 92, 230, 22, 4, 173, 51, + 115, 161, 114, 230, 22, 4, 173, 142, 115, 161, 94, 230, 22, 4, 173, 142, + 115, 161, 197, 30, 230, 22, 4, 173, 46, 115, 161, 235, 92, 230, 22, 4, + 173, 46, 115, 161, 114, 230, 22, 4, 173, 130, 232, 89, 161, 94, 230, 22, + 4, 173, 130, 232, 89, 161, 197, 30, 230, 22, 4, 173, 51, 232, 89, 161, + 235, 92, 230, 22, 4, 173, 51, 232, 89, 161, 114, 230, 22, 4, 173, 142, + 232, 89, 161, 94, 230, 22, 4, 173, 142, 232, 89, 161, 197, 30, 230, 22, + 4, 173, 46, 232, 89, 161, 235, 92, 230, 22, 4, 173, 46, 232, 89, 161, + 114, 230, 22, 4, 173, 130, 95, 114, 230, 22, 4, 173, 235, 96, 197, 30, + 230, 22, 4, 173, 46, 248, 67, 197, 30, 230, 22, 4, 173, 207, 101, 94, + 230, 22, 4, 173, 130, 95, 94, 230, 22, 4, 173, 235, 96, 235, 92, 230, 22, + 4, 173, 46, 248, 67, 235, 92, 230, 22, 4, 173, 207, 101, 114, 230, 22, 4, + 173, 130, 95, 94, 230, 22, 4, 173, 197, 41, 114, 230, 22, 4, 173, 142, + 95, 94, 230, 22, 4, 173, 235, 96, 94, 230, 22, 4, 173, 130, 95, 114, 230, + 22, 4, 173, 197, 41, 94, 230, 22, 4, 173, 142, 95, 114, 230, 22, 4, 173, + 235, 96, 114, 230, 22, 4, 173, 130, 95, 184, 237, 185, 114, 230, 22, 4, + 173, 142, 248, 84, 184, 237, 185, 94, 230, 22, 4, 173, 130, 95, 184, 237, + 185, 94, 230, 22, 4, 173, 142, 248, 84, 184, 237, 185, 197, 30, 230, 22, + 4, 173, 46, 248, 67, 235, 92, 230, 22, 4, 173, 207, 101, 235, 92, 230, + 22, 4, 173, 46, 248, 67, 197, 30, 230, 22, 4, 173, 207, 101, 51, 55, 61, + 4, 207, 7, 229, 245, 234, 30, 3, 95, 94, 54, 199, 91, 211, 174, 95, 94, + 54, 114, 61, 95, 199, 91, 211, 173, 94, 61, 95, 199, 91, 211, 173, 94, + 61, 95, 251, 1, 187, 155, 219, 240, 95, 114, 54, 114, 61, 199, 151, 219, + 239, 230, 204, 95, 94, 54, 201, 154, 95, 94, 54, 114, 61, 199, 151, 201, + 153, 201, 106, 95, 114, 54, 46, 232, 225, 200, 147, 51, 232, 225, 200, + 147, 130, 232, 225, 200, 147, 142, 232, 225, 200, 147, 198, 170, 84, 248, + 194, 237, 82, 192, 156, 213, 109, 202, 117, 192, 156, 213, 109, 197, 206, + 242, 47, 46, 62, 238, 138, 186, 51, 62, 238, 138, 186, 46, 62, 210, 230, + 51, 62, 210, 230, 192, 156, 213, 109, 46, 223, 206, 186, 192, 156, 213, + 109, 51, 223, 206, 186, 192, 156, 213, 109, 46, 248, 19, 186, 192, 156, + 213, 109, 51, 248, 19, 186, 46, 50, 247, 165, 4, 197, 67, 51, 50, 247, + 165, 4, 197, 67, 46, 50, 247, 165, 4, 199, 118, 223, 191, 198, 249, 238, + 223, 51, 50, 247, 165, 4, 199, 118, 223, 191, 247, 188, 238, 223, 46, 50, + 247, 165, 4, 199, 118, 223, 191, 247, 188, 238, 223, 51, 50, 247, 165, 4, + 199, 118, 223, 191, 198, 249, 238, 223, 46, 250, 208, 247, 165, 4, 236, + 114, 51, 250, 208, 247, 165, 4, 236, 114, 46, 250, 115, 219, 240, 186, + 51, 250, 115, 230, 204, 186, 55, 46, 250, 115, 230, 204, 186, 55, 51, + 250, 115, 219, 240, 186, 46, 60, 198, 237, 204, 2, 186, 51, 60, 198, 237, + 204, 2, 186, 235, 111, 233, 27, 84, 192, 21, 219, 175, 217, 42, 250, 208, + 211, 176, 220, 28, 51, 250, 208, 196, 137, 4, 202, 106, 217, 42, 51, 250, + 208, 4, 236, 114, 250, 208, 4, 206, 159, 223, 145, 251, 130, 250, 207, + 202, 139, 250, 208, 211, 176, 220, 28, 202, 139, 250, 208, 211, 176, 197, + 41, 163, 250, 207, 207, 168, 250, 207, 250, 208, 4, 197, 67, 207, 168, + 250, 208, 4, 197, 67, 212, 18, 250, 208, 211, 176, 197, 41, 212, 18, 250, + 208, 211, 176, 235, 96, 217, 42, 250, 208, 4, 211, 184, 250, 93, 234, 76, + 223, 191, 61, 209, 188, 130, 26, 207, 101, 217, 42, 250, 208, 4, 211, + 184, 250, 93, 234, 76, 223, 191, 61, 209, 188, 130, 26, 220, 28, 217, 42, + 250, 208, 4, 211, 184, 250, 93, 234, 76, 223, 191, 61, 209, 188, 142, 26, + 207, 101, 217, 42, 250, 208, 4, 211, 184, 250, 93, 234, 76, 223, 191, 61, + 209, 188, 142, 26, 220, 28, 217, 42, 250, 208, 4, 211, 184, 250, 93, 234, + 76, 223, 191, 61, 209, 188, 51, 26, 197, 41, 217, 42, 250, 208, 4, 211, + 184, 250, 93, 234, 76, 223, 191, 61, 209, 188, 46, 26, 197, 41, 217, 42, + 250, 208, 4, 211, 184, 250, 93, 234, 76, 223, 191, 61, 209, 188, 51, 26, + 235, 96, 217, 42, 250, 208, 4, 211, 184, 250, 93, 234, 76, 223, 191, 61, + 209, 188, 46, 26, 235, 96, 207, 168, 234, 90, 204, 151, 234, 90, 204, + 152, 4, 211, 117, 234, 90, 204, 152, 4, 2, 242, 131, 58, 234, 90, 204, + 152, 4, 51, 61, 58, 234, 90, 204, 152, 4, 46, 61, 58, 242, 131, 4, 229, + 5, 161, 47, 84, 161, 47, 210, 235, 47, 207, 169, 202, 189, 47, 210, 120, + 242, 131, 236, 178, 247, 64, 229, 5, 248, 194, 26, 198, 249, 138, 236, + 178, 247, 64, 84, 161, 242, 131, 4, 201, 108, 193, 223, 47, 250, 180, + 236, 172, 57, 130, 61, 199, 151, 242, 130, 47, 62, 247, 106, 47, 247, + 106, 47, 219, 239, 47, 230, 203, 242, 131, 4, 2, 242, 131, 115, 199, 225, + 207, 101, 242, 131, 4, 103, 229, 5, 201, 196, 115, 199, 225, 207, 101, + 108, 207, 73, 237, 11, 203, 4, 108, 233, 71, 237, 11, 203, 4, 108, 250, + 37, 108, 2, 242, 130, 108, 202, 106, 103, 222, 230, 202, 104, 198, 186, + 4, 78, 58, 198, 186, 4, 197, 67, 206, 159, 223, 191, 198, 185, 198, 186, + 4, 204, 159, 250, 27, 247, 187, 51, 198, 186, 95, 46, 198, 185, 46, 198, + 186, 248, 67, 84, 161, 84, 248, 194, 248, 67, 51, 198, 185, 247, 175, 4, + 46, 138, 247, 248, 247, 175, 4, 51, 138, 247, 248, 60, 247, 174, 24, 4, + 46, 138, 247, 248, 24, 4, 51, 138, 247, 248, 62, 228, 195, 60, 228, 195, + 46, 194, 58, 233, 27, 51, 194, 58, 233, 27, 46, 55, 194, 58, 233, 27, 51, + 55, 194, 58, 233, 27, 223, 183, 223, 167, 199, 114, 136, 223, 167, 223, + 168, 214, 201, 4, 84, 161, 235, 105, 215, 218, 50, 4, 238, 246, 211, 122, + 223, 180, 250, 61, 203, 157, 209, 85, 234, 30, 3, 26, 203, 6, 210, 235, + 234, 30, 3, 26, 203, 6, 210, 236, 4, 199, 91, 58, 228, 41, 115, 26, 203, + 6, 210, 235, 231, 9, 202, 18, 199, 213, 235, 95, 198, 186, 4, 46, 138, + 247, 248, 235, 95, 198, 186, 4, 51, 138, 247, 248, 60, 237, 5, 4, 142, + 54, 60, 219, 43, 62, 242, 131, 4, 142, 54, 60, 242, 131, 4, 142, 54, 234, + 12, 62, 202, 106, 234, 12, 60, 202, 106, 234, 12, 62, 237, 4, 234, 12, + 60, 237, 4, 234, 12, 62, 242, 130, 234, 12, 60, 242, 130, 206, 201, 207, + 169, 202, 190, 211, 173, 202, 190, 4, 211, 117, 207, 169, 202, 190, 4, + 229, 5, 111, 248, 28, 202, 189, 248, 28, 207, 169, 202, 189, 55, 209, + 206, 198, 170, 209, 206, 220, 23, 238, 130, 250, 208, 186, 207, 96, 238, + 130, 250, 208, 186, 199, 75, 216, 110, 215, 150, 47, 78, 211, 173, 215, + 150, 47, 102, 211, 173, 215, 150, 47, 24, 211, 173, 215, 150, 197, 57, + 211, 174, 4, 236, 114, 215, 150, 197, 57, 211, 174, 4, 209, 206, 215, + 150, 50, 223, 128, 211, 173, 215, 150, 50, 197, 57, 211, 173, 103, 219, + 93, 26, 211, 173, 103, 219, 93, 211, 164, 211, 173, 215, 150, 24, 211, + 173, 216, 59, 103, 201, 129, 201, 127, 4, 223, 141, 208, 170, 223, 142, + 211, 173, 232, 234, 210, 224, 223, 141, 223, 142, 4, 55, 111, 223, 142, + 249, 244, 4, 203, 4, 242, 123, 232, 68, 250, 182, 223, 139, 219, 176, + 223, 140, 4, 207, 241, 210, 203, 250, 87, 209, 182, 219, 176, 223, 140, + 4, 204, 182, 210, 203, 250, 87, 209, 182, 219, 176, 223, 140, 213, 111, + 223, 185, 199, 225, 209, 182, 223, 142, 250, 87, 41, 209, 192, 211, 173, + 208, 164, 223, 142, 211, 173, 223, 142, 4, 114, 61, 4, 128, 223, 142, 4, + 24, 57, 223, 142, 4, 223, 127, 223, 142, 4, 197, 56, 223, 142, 4, 211, + 117, 223, 142, 4, 197, 67, 222, 231, 220, 73, 46, 198, 186, 211, 173, + 192, 156, 213, 109, 205, 246, 239, 26, 192, 156, 213, 109, 205, 246, 209, + 250, 192, 156, 213, 109, 205, 246, 209, 80, 102, 3, 4, 2, 242, 131, 58, + 102, 3, 4, 242, 122, 251, 144, 58, 102, 3, 4, 199, 91, 58, 102, 3, 4, 78, + 63, 102, 3, 4, 199, 91, 63, 102, 3, 4, 201, 155, 104, 102, 3, 4, 60, 198, + 185, 216, 113, 3, 4, 242, 39, 58, 216, 113, 3, 4, 78, 63, 216, 113, 3, 4, + 233, 71, 236, 111, 216, 113, 3, 4, 207, 73, 236, 111, 102, 3, 223, 191, + 46, 138, 242, 130, 102, 3, 223, 191, 51, 138, 242, 130, 196, 122, 211, + 164, 238, 184, 209, 85, 215, 214, 3, 4, 78, 58, 215, 214, 3, 4, 197, 67, + 204, 179, 209, 86, 4, 247, 188, 242, 83, 202, 234, 209, 85, 215, 214, 3, + 223, 191, 46, 138, 242, 130, 215, 214, 3, 223, 191, 51, 138, 242, 130, + 47, 215, 214, 3, 4, 242, 122, 251, 143, 215, 214, 3, 223, 191, 55, 242, + 130, 47, 236, 172, 57, 102, 3, 223, 191, 198, 185, 216, 113, 3, 223, 191, + 198, 185, 215, 214, 3, 223, 191, 198, 185, 223, 136, 209, 85, 207, 91, + 223, 136, 209, 85, 192, 156, 213, 109, 207, 214, 239, 26, 250, 239, 211, + 164, 238, 230, 223, 128, 4, 236, 114, 197, 57, 4, 216, 113, 57, 197, 57, + 4, 211, 117, 223, 128, 4, 211, 117, 223, 128, 4, 219, 93, 250, 217, 197, + 57, 4, 219, 93, 211, 163, 197, 57, 95, 223, 127, 223, 128, 95, 197, 56, + 197, 57, 95, 248, 194, 95, 223, 127, 223, 128, 95, 248, 194, 95, 197, 56, + 197, 57, 248, 67, 26, 222, 230, 4, 197, 56, 223, 128, 248, 67, 26, 222, + 230, 4, 223, 127, 242, 84, 197, 57, 4, 204, 158, 242, 84, 223, 128, 4, + 204, 158, 55, 50, 223, 127, 55, 50, 197, 56, 242, 84, 197, 57, 4, 204, + 159, 26, 202, 234, 209, 85, 219, 93, 26, 4, 78, 58, 219, 93, 211, 164, 4, + 78, 58, 55, 219, 93, 250, 217, 55, 219, 93, 211, 163, 103, 223, 129, 219, + 93, 250, 217, 103, 223, 129, 219, 93, 211, 163, 202, 244, 220, 73, 211, + 163, 202, 244, 220, 73, 250, 217, 219, 93, 211, 164, 211, 112, 219, 93, + 250, 217, 219, 93, 26, 4, 85, 201, 255, 219, 93, 211, 164, 4, 85, 201, + 255, 219, 93, 26, 4, 229, 5, 237, 185, 219, 93, 211, 164, 4, 229, 5, 237, + 185, 219, 93, 26, 4, 55, 211, 117, 219, 93, 26, 4, 197, 67, 219, 93, 26, + 4, 55, 197, 67, 2, 196, 119, 4, 197, 67, 219, 93, 211, 164, 4, 55, 211, + 117, 219, 93, 211, 164, 4, 55, 197, 67, 192, 156, 213, 109, 236, 124, + 250, 172, 192, 156, 213, 109, 208, 29, 250, 172, 234, 30, 3, 4, 78, 63, + 228, 41, 4, 78, 58, 198, 170, 229, 5, 248, 194, 4, 55, 84, 111, 198, 170, + 229, 5, 248, 194, 4, 198, 170, 84, 111, 199, 91, 211, 174, 4, 78, 58, + 199, 91, 211, 174, 4, 207, 73, 236, 111, 203, 84, 216, 113, 203, 83, 239, + 13, 4, 78, 58, 234, 30, 4, 250, 37, 251, 1, 187, 115, 4, 242, 122, 251, + 143, 250, 138, 187, 211, 164, 187, 155, 234, 30, 3, 95, 102, 57, 102, 3, + 95, 234, 30, 57, 234, 30, 3, 95, 199, 91, 211, 173, 55, 242, 48, 234, 31, + 103, 239, 6, 234, 30, 203, 98, 112, 239, 6, 234, 30, 203, 98, 234, 30, 3, + 4, 103, 236, 112, 95, 26, 103, 236, 112, 63, 234, 23, 4, 232, 119, 236, + 112, 58, 219, 240, 4, 242, 131, 223, 145, 230, 204, 4, 242, 131, 223, + 145, 219, 240, 4, 208, 159, 122, 58, 230, 204, 4, 208, 159, 122, 58, 219, + 240, 211, 164, 203, 6, 187, 155, 230, 204, 211, 164, 203, 6, 187, 155, + 219, 240, 211, 164, 203, 6, 187, 115, 4, 78, 223, 145, 230, 204, 211, + 164, 203, 6, 187, 115, 4, 78, 223, 145, 219, 240, 211, 164, 203, 6, 187, + 115, 4, 78, 58, 230, 204, 211, 164, 203, 6, 187, 115, 4, 78, 58, 219, + 240, 211, 164, 203, 6, 187, 115, 4, 78, 95, 207, 101, 230, 204, 211, 164, + 203, 6, 187, 115, 4, 78, 95, 220, 28, 219, 240, 211, 164, 250, 139, 230, + 204, 211, 164, 250, 139, 219, 240, 26, 203, 72, 213, 111, 187, 155, 230, + 204, 26, 203, 72, 213, 111, 187, 155, 219, 240, 26, 213, 111, 250, 139, + 230, 204, 26, 213, 111, 250, 139, 219, 240, 95, 235, 104, 187, 95, 230, + 203, 230, 204, 95, 235, 104, 187, 95, 219, 239, 219, 240, 95, 203, 84, + 211, 164, 234, 31, 230, 204, 95, 203, 84, 211, 164, 234, 31, 219, 240, + 95, 203, 84, 95, 230, 203, 230, 204, 95, 203, 84, 95, 219, 239, 219, 240, + 95, 230, 204, 95, 235, 104, 234, 31, 230, 204, 95, 219, 240, 95, 235, + 104, 234, 31, 219, 240, 95, 203, 6, 187, 95, 230, 204, 95, 203, 6, 234, + 31, 230, 204, 95, 203, 6, 187, 95, 219, 240, 95, 203, 6, 234, 31, 203, 6, + 187, 115, 211, 164, 219, 239, 203, 6, 187, 115, 211, 164, 230, 203, 203, + 6, 187, 115, 211, 164, 219, 240, 4, 78, 223, 145, 203, 6, 187, 115, 211, + 164, 230, 204, 4, 78, 223, 145, 235, 104, 187, 115, 211, 164, 219, 239, + 235, 104, 187, 115, 211, 164, 230, 203, 235, 104, 203, 6, 187, 115, 211, + 164, 219, 239, 235, 104, 203, 6, 187, 115, 211, 164, 230, 203, 203, 84, + 211, 164, 219, 239, 203, 84, 211, 164, 230, 203, 203, 84, 95, 219, 240, + 95, 234, 30, 57, 203, 84, 95, 230, 204, 95, 234, 30, 57, 55, 214, 185, + 219, 239, 55, 214, 185, 230, 203, 55, 214, 185, 219, 240, 4, 197, 67, + 230, 204, 211, 112, 219, 239, 230, 204, 248, 67, 219, 239, 219, 240, 242, + 84, 247, 64, 238, 131, 230, 204, 242, 84, 247, 64, 238, 131, 219, 240, + 242, 84, 247, 64, 238, 132, 95, 203, 6, 234, 31, 230, 204, 242, 84, 247, + 64, 238, 132, 95, 203, 6, 234, 31, 202, 235, 199, 229, 220, 71, 199, 229, + 202, 235, 199, 230, 211, 164, 187, 155, 220, 71, 199, 230, 211, 164, 187, + 155, 234, 30, 3, 4, 247, 99, 58, 209, 116, 95, 203, 72, 234, 30, 57, 201, + 146, 95, 203, 72, 234, 30, 57, 209, 116, 95, 203, 72, 213, 111, 187, 155, + 201, 146, 95, 203, 72, 213, 111, 187, 155, 209, 116, 95, 234, 30, 57, + 201, 146, 95, 234, 30, 57, 209, 116, 95, 213, 111, 187, 155, 201, 146, + 95, 213, 111, 187, 155, 209, 116, 95, 251, 1, 187, 155, 201, 146, 95, + 251, 1, 187, 155, 209, 116, 95, 213, 111, 251, 1, 187, 155, 201, 146, 95, + 213, 111, 251, 1, 187, 155, 55, 209, 115, 55, 201, 145, 201, 154, 4, 236, + 114, 201, 106, 4, 236, 114, 201, 154, 4, 102, 3, 63, 201, 106, 4, 102, 3, + 63, 201, 154, 4, 215, 214, 3, 63, 201, 106, 4, 215, 214, 3, 63, 201, 154, + 80, 211, 164, 187, 115, 4, 78, 58, 201, 106, 80, 211, 164, 187, 115, 4, + 78, 58, 201, 154, 80, 95, 234, 30, 57, 201, 106, 80, 95, 234, 30, 57, + 201, 154, 80, 95, 199, 91, 211, 173, 201, 106, 80, 95, 199, 91, 211, 173, + 201, 154, 80, 95, 251, 1, 187, 155, 201, 106, 80, 95, 251, 1, 187, 155, + 201, 154, 80, 95, 213, 111, 187, 155, 201, 106, 80, 95, 213, 111, 187, + 155, 50, 46, 211, 184, 105, 211, 173, 50, 51, 211, 184, 105, 211, 173, + 242, 84, 201, 153, 242, 84, 201, 105, 242, 84, 201, 154, 211, 164, 187, + 155, 242, 84, 201, 106, 211, 164, 187, 155, 201, 154, 95, 201, 105, 201, + 106, 95, 201, 153, 201, 154, 95, 201, 153, 201, 106, 95, 201, 105, 201, + 106, 248, 67, 201, 153, 201, 106, 248, 67, 26, 222, 230, 247, 64, 237, + 186, 4, 201, 153, 234, 116, 80, 211, 176, 235, 91, 209, 240, 4, 200, 57, + 198, 248, 198, 204, 223, 127, 232, 137, 213, 126, 203, 195, 46, 200, 159, + 203, 195, 142, 200, 159, 203, 195, 130, 200, 159, 210, 121, 4, 206, 158, + 84, 248, 194, 198, 170, 51, 198, 8, 55, 84, 248, 194, 46, 198, 8, 84, + 248, 194, 55, 46, 198, 8, 55, 84, 248, 194, 55, 46, 198, 8, 184, 237, + 186, 232, 89, 46, 217, 10, 80, 55, 196, 105, 203, 195, 142, 200, 160, 4, + 211, 117, 203, 195, 130, 200, 160, 4, 197, 67, 203, 195, 130, 200, 160, + 95, 203, 195, 142, 200, 159, 55, 142, 200, 159, 55, 130, 200, 159, 55, + 201, 208, 213, 111, 57, 207, 168, 55, 201, 208, 213, 111, 57, 236, 136, + 213, 111, 236, 180, 4, 207, 168, 214, 200, 203, 4, 84, 219, 176, 4, 242, + 131, 58, 84, 219, 176, 4, 242, 131, 63, 142, 200, 160, 4, 242, 131, 63, + 210, 236, 4, 229, 5, 111, 210, 236, 4, 199, 91, 211, 173, 198, 170, 84, + 248, 194, 248, 21, 207, 215, 198, 170, 84, 248, 194, 4, 229, 5, 111, 198, + 170, 242, 48, 211, 173, 198, 170, 214, 185, 219, 239, 198, 170, 214, 185, + 230, 203, 235, 104, 203, 6, 219, 240, 211, 164, 187, 155, 235, 104, 203, + 6, 230, 204, 211, 164, 187, 155, 198, 170, 202, 190, 248, 21, 207, 215, + 220, 73, 198, 170, 84, 248, 194, 211, 173, 55, 202, 190, 211, 173, 62, + 84, 161, 215, 150, 62, 84, 161, 178, 234, 186, 62, 54, 178, 194, 91, 62, + 54, 202, 171, 234, 186, 62, 54, 202, 171, 194, 91, 62, 54, 46, 51, 62, + 54, 114, 60, 54, 197, 30, 60, 54, 235, 92, 60, 54, 178, 234, 186, 60, 54, + 178, 194, 91, 60, 54, 202, 171, 234, 186, 60, 54, 202, 171, 194, 91, 60, + 54, 46, 51, 60, 54, 130, 142, 60, 54, 94, 61, 4, 199, 74, 235, 91, 94, + 61, 4, 199, 74, 197, 29, 114, 61, 4, 199, 74, 235, 91, 114, 61, 4, 199, + 74, 197, 29, 50, 4, 198, 249, 138, 247, 248, 50, 4, 247, 188, 138, 247, + 248, 50, 4, 113, 51, 237, 11, 138, 247, 248, 50, 4, 106, 46, 237, 11, + 138, 247, 248, 237, 5, 4, 46, 138, 247, 248, 237, 5, 4, 51, 138, 247, + 248, 237, 5, 4, 198, 249, 138, 247, 248, 237, 5, 4, 247, 188, 138, 247, + 248, 235, 111, 202, 106, 60, 220, 73, 202, 106, 62, 220, 73, 202, 106, + 60, 196, 53, 2, 202, 106, 62, 196, 53, 2, 202, 106, 60, 210, 144, 62, + 210, 144, 62, 229, 192, 60, 229, 192, 229, 5, 60, 229, 192, 60, 220, 73, + 242, 130, 60, 217, 31, 237, 4, 62, 217, 31, 237, 4, 60, 217, 31, 219, 43, + 62, 217, 31, 219, 43, 60, 2, 237, 4, 60, 2, 219, 43, 62, 2, 219, 43, 60, + 229, 5, 234, 106, 62, 229, 5, 234, 106, 60, 84, 234, 106, 62, 84, 234, + 106, 46, 61, 4, 2, 242, 130, 112, 114, 250, 73, 46, 61, 4, 47, 209, 206, + 184, 114, 202, 99, 54, 114, 197, 220, 61, 4, 84, 111, 114, 197, 220, 61, + 4, 55, 84, 111, 114, 197, 220, 61, 232, 89, 161, 114, 197, 220, 198, 170, + 237, 186, 54, 114, 61, 4, 235, 111, 201, 255, 114, 61, 4, 200, 148, 4, + 84, 111, 114, 61, 4, 200, 148, 4, 55, 84, 111, 114, 197, 220, 61, 4, 200, + 147, 114, 197, 220, 61, 4, 200, 148, 4, 84, 111, 114, 197, 220, 61, 4, + 200, 148, 4, 55, 84, 111, 114, 61, 199, 151, 193, 223, 194, 125, 61, 209, + 188, 236, 203, 220, 28, 234, 30, 3, 95, 114, 54, 207, 169, 199, 91, 211, + 174, 95, 114, 54, 114, 61, 95, 207, 169, 251, 1, 187, 155, 94, 61, 199, + 151, 230, 203, 94, 61, 199, 151, 201, 105, 114, 208, 170, 54, 94, 208, + 170, 54, 207, 169, 199, 91, 211, 174, 95, 94, 54, 94, 61, 95, 207, 169, + 251, 1, 187, 155, 199, 91, 211, 174, 95, 114, 54, 114, 61, 95, 251, 1, + 187, 155, 114, 61, 95, 207, 169, 199, 91, 211, 173, 94, 61, 95, 207, 169, + 199, 91, 211, 173, 235, 92, 198, 184, 192, 21, 54, 203, 195, 203, 6, 178, + 54, 203, 195, 248, 249, 202, 171, 54, 62, 217, 31, 202, 19, 60, 2, 202, + 19, 62, 2, 202, 19, 60, 207, 96, 210, 144, 62, 207, 96, 210, 144, 87, + 220, 73, 242, 130, 87, 211, 119, 4, 211, 119, 223, 145, 87, 242, 131, 4, + 242, 131, 223, 145, 87, 242, 130, 87, 47, 206, 51, 203, 6, 178, 61, 4, + 229, 14, 229, 245, 248, 249, 202, 171, 61, 4, 229, 14, 200, 147, 203, 6, + 178, 61, 4, 229, 5, 200, 147, 248, 249, 202, 171, 61, 4, 229, 5, 200, + 147, 248, 75, 61, 209, 188, 235, 92, 199, 216, 178, 234, 185, 203, 195, + 248, 75, 61, 209, 188, 235, 92, 199, 216, 178, 234, 185, 114, 198, 184, + 54, 197, 30, 198, 184, 54, 94, 198, 184, 54, 235, 92, 198, 184, 54, 46, + 51, 198, 184, 54, 130, 142, 198, 184, 54, 178, 194, 91, 198, 184, 54, + 178, 234, 186, 198, 184, 54, 202, 171, 234, 186, 198, 184, 54, 202, 171, + 194, 91, 198, 184, 54, 114, 198, 184, 237, 184, 54, 197, 30, 198, 184, + 237, 184, 54, 94, 198, 184, 237, 184, 54, 235, 92, 198, 184, 237, 184, + 54, 242, 86, 198, 184, 211, 184, 242, 131, 54, 250, 182, 198, 184, 211, + 184, 242, 131, 54, 114, 198, 184, 61, 115, 161, 197, 30, 198, 184, 61, + 115, 161, 94, 198, 184, 61, 115, 161, 235, 92, 198, 184, 61, 115, 161, + 178, 194, 91, 198, 184, 61, 115, 161, 178, 234, 186, 198, 184, 61, 115, + 161, 202, 171, 234, 186, 198, 184, 61, 115, 161, 202, 171, 194, 91, 198, + 184, 61, 115, 161, 114, 198, 184, 61, 4, 55, 229, 5, 111, 197, 30, 198, + 184, 61, 4, 55, 229, 5, 111, 94, 198, 184, 61, 4, 55, 229, 5, 111, 235, + 92, 198, 184, 61, 4, 55, 229, 5, 111, 229, 5, 200, 167, 222, 1, 84, 200, + 167, 222, 1, 114, 198, 184, 61, 136, 94, 198, 184, 54, 197, 30, 198, 184, + 61, 114, 80, 235, 92, 198, 184, 54, 94, 198, 184, 61, 136, 114, 198, 184, + 54, 235, 92, 198, 184, 61, 114, 80, 197, 30, 198, 184, 54, 114, 198, 184, + 211, 53, 250, 73, 197, 30, 198, 184, 211, 53, 250, 73, 94, 198, 184, 211, + 53, 250, 73, 235, 92, 198, 184, 211, 53, 250, 73, 114, 60, 47, 62, 54, + 197, 30, 60, 47, 62, 54, 94, 60, 47, 62, 54, 235, 92, 60, 47, 62, 54, + 250, 182, 198, 184, 51, 197, 172, 54, 250, 182, 198, 184, 247, 188, 197, + 172, 54, 250, 182, 198, 184, 46, 197, 172, 54, 250, 182, 198, 184, 198, + 249, 197, 172, 54, 207, 173, 220, 28, 207, 173, 207, 101, 214, 174, 220, + 28, 214, 174, 207, 101, 232, 119, 238, 224, 250, 74, 242, 126, 250, 181, + 94, 60, 54, 16, 39, 197, 206, 41, 234, 117, 199, 160, 198, 247, 114, 234, + 24, 250, 77, 199, 160, 207, 97, 197, 30, 234, 24, 250, 77, 199, 160, 198, + 247, 94, 234, 24, 250, 77, 199, 160, 220, 24, 235, 92, 234, 24, 250, 77, + 60, 114, 234, 24, 250, 77, 60, 197, 30, 234, 24, 250, 77, 60, 94, 234, + 24, 250, 77, 60, 235, 92, 234, 24, 250, 77, 235, 92, 198, 184, 61, 4, + 184, 199, 74, 220, 18, 235, 92, 198, 184, 61, 4, 184, 199, 74, 207, 90, + 197, 30, 198, 184, 61, 4, 184, 199, 74, 220, 18, 197, 30, 198, 184, 61, + 4, 184, 199, 74, 207, 90, 114, 198, 184, 61, 4, 184, 199, 74, 197, 29, + 94, 198, 184, 61, 4, 184, 199, 74, 197, 29, 114, 198, 184, 61, 4, 184, + 199, 74, 235, 91, 94, 198, 184, 61, 4, 184, 199, 74, 235, 91, 60, 238, + 130, 235, 92, 26, 114, 54, 60, 238, 130, 235, 92, 26, 94, 54, 60, 238, + 130, 197, 30, 26, 114, 54, 60, 238, 130, 197, 30, 26, 94, 54, 60, 238, + 130, 114, 26, 197, 30, 54, 60, 238, 130, 94, 26, 197, 30, 54, 60, 238, + 130, 114, 26, 235, 92, 54, 60, 238, 130, 94, 26, 235, 92, 54, 207, 142, + 61, 142, 220, 28, 207, 142, 61, 142, 207, 101, 207, 142, 61, 130, 220, + 28, 207, 142, 61, 130, 207, 101, 207, 142, 61, 46, 197, 41, 207, 142, 61, + 51, 197, 41, 207, 142, 61, 46, 235, 96, 207, 142, 61, 51, 235, 96, 197, + 30, 62, 61, 232, 89, 248, 194, 4, 229, 5, 161, 130, 250, 78, 223, 191, + 41, 207, 243, 247, 173, 211, 112, 62, 202, 104, 211, 112, 62, 26, 60, + 202, 104, 211, 112, 60, 202, 104, 248, 213, 105, 4, 152, 193, 223, 47, + 193, 223, 47, 28, 193, 223, 60, 50, 246, 135, 60, 237, 5, 246, 135, 163, + 60, 210, 144, 229, 5, 60, 212, 9, 60, 212, 9, 60, 217, 31, 197, 40, 198, + 186, 246, 135, 60, 217, 31, 235, 95, 198, 186, 246, 135, 60, 217, 31, + 220, 23, 198, 186, 246, 135, 60, 217, 31, 207, 96, 198, 186, 246, 135, + 214, 190, 232, 136, 104, 198, 249, 138, 60, 242, 130, 247, 188, 138, 60, + 242, 130, 152, 232, 119, 209, 190, 60, 238, 126, 207, 16, 152, 232, 119, + 209, 190, 60, 238, 126, 62, 232, 119, 209, 190, 238, 126, 207, 16, 62, + 232, 119, 209, 190, 238, 126, 50, 209, 160, 223, 172, 197, 71, 57, 230, + 194, 77, 209, 203, 232, 136, 104, 209, 203, 232, 136, 133, 209, 203, 232, + 136, 134, 209, 203, 232, 136, 151, 198, 206, 209, 70, 250, 33, 228, 114, + 210, 62, 214, 186, 62, 216, 30, 204, 188, 60, 237, 5, 211, 212, 238, 183, + 198, 148, 152, 216, 30, 250, 69, 238, 146, 230, 96, 192, 74, 221, 50, + 250, 151, 251, 115, 194, 221, 209, 161, 46, 138, 60, 202, 19, 51, 138, + 60, 202, 19, 202, 20, 4, 46, 138, 247, 248, 202, 20, 4, 51, 138, 247, + 248, 114, 197, 220, 61, 4, 198, 186, 250, 75, 197, 30, 197, 220, 61, 4, + 198, 186, 250, 75, 94, 197, 220, 61, 4, 198, 186, 250, 75, 235, 92, 197, + 220, 61, 4, 198, 186, 250, 75, 234, 14, 232, 136, 101, 234, 14, 232, 136, + 104, 205, 206, 206, 181, 250, 32, 16, 196, 23, 206, 181, 250, 32, 16, + 213, 97, 206, 181, 250, 32, 16, 208, 147, 206, 181, 250, 32, 16, 248, 16, + 206, 181, 250, 32, 16, 204, 171, 206, 181, 250, 32, 16, 198, 197, 234, + 30, 3, 4, 223, 168, 63, 197, 53, 109, 204, 167, 109, 235, 101, 109, 210, + 213, 109, 207, 168, 51, 250, 207, 229, 213, 210, 196, 109, 131, 6, 1, + 249, 227, 131, 6, 1, 247, 110, 131, 6, 1, 196, 121, 131, 6, 1, 231, 13, + 131, 6, 1, 236, 141, 131, 6, 1, 193, 38, 131, 6, 1, 192, 55, 131, 6, 1, + 235, 12, 131, 6, 1, 192, 81, 131, 6, 1, 223, 69, 131, 6, 1, 88, 223, 69, + 131, 6, 1, 70, 131, 6, 1, 236, 162, 131, 6, 1, 222, 127, 131, 6, 1, 219, + 139, 131, 6, 1, 215, 155, 131, 6, 1, 215, 46, 131, 6, 1, 211, 196, 131, + 6, 1, 209, 185, 131, 6, 1, 207, 72, 131, 6, 1, 202, 241, 131, 6, 1, 197, + 251, 131, 6, 1, 197, 88, 131, 6, 1, 232, 92, 131, 6, 1, 229, 198, 131, 6, + 1, 211, 131, 131, 6, 1, 210, 181, 131, 6, 1, 203, 167, 131, 6, 1, 198, + 97, 131, 6, 1, 242, 174, 131, 6, 1, 204, 64, 131, 6, 1, 193, 47, 131, 6, + 1, 193, 49, 131, 6, 1, 193, 82, 131, 6, 1, 202, 135, 144, 131, 6, 1, 192, + 214, 131, 6, 1, 2, 192, 179, 131, 6, 1, 2, 192, 180, 4, 200, 147, 131, 6, + 1, 193, 1, 131, 6, 1, 223, 110, 2, 192, 179, 131, 6, 1, 248, 28, 192, + 179, 131, 6, 1, 223, 110, 248, 28, 192, 179, 131, 6, 1, 232, 216, 131, 6, + 1, 223, 67, 131, 6, 1, 203, 166, 131, 6, 1, 198, 160, 64, 131, 6, 1, 220, + 61, 215, 155, 131, 2, 1, 249, 227, 131, 2, 1, 247, 110, 131, 2, 1, 196, + 121, 131, 2, 1, 231, 13, 131, 2, 1, 236, 141, 131, 2, 1, 193, 38, 131, 2, + 1, 192, 55, 131, 2, 1, 235, 12, 131, 2, 1, 192, 81, 131, 2, 1, 223, 69, + 131, 2, 1, 88, 223, 69, 131, 2, 1, 70, 131, 2, 1, 236, 162, 131, 2, 1, + 222, 127, 131, 2, 1, 219, 139, 131, 2, 1, 215, 155, 131, 2, 1, 215, 46, + 131, 2, 1, 211, 196, 131, 2, 1, 209, 185, 131, 2, 1, 207, 72, 131, 2, 1, + 202, 241, 131, 2, 1, 197, 251, 131, 2, 1, 197, 88, 131, 2, 1, 232, 92, + 131, 2, 1, 229, 198, 131, 2, 1, 211, 131, 131, 2, 1, 210, 181, 131, 2, 1, + 203, 167, 131, 2, 1, 198, 97, 131, 2, 1, 242, 174, 131, 2, 1, 204, 64, + 131, 2, 1, 193, 47, 131, 2, 1, 193, 49, 131, 2, 1, 193, 82, 131, 2, 1, + 202, 135, 144, 131, 2, 1, 192, 214, 131, 2, 1, 2, 192, 179, 131, 2, 1, 2, + 192, 180, 4, 200, 147, 131, 2, 1, 193, 1, 131, 2, 1, 223, 110, 2, 192, + 179, 131, 2, 1, 248, 28, 192, 179, 131, 2, 1, 223, 110, 248, 28, 192, + 179, 131, 2, 1, 232, 216, 131, 2, 1, 223, 67, 131, 2, 1, 203, 166, 131, + 2, 1, 198, 160, 64, 131, 2, 1, 220, 61, 215, 155, 8, 6, 1, 220, 202, 4, + 55, 161, 8, 2, 1, 220, 202, 4, 55, 161, 8, 6, 1, 220, 202, 4, 85, 199, + 90, 8, 6, 1, 211, 94, 4, 111, 8, 6, 1, 208, 112, 4, 200, 147, 8, 2, 1, + 41, 4, 111, 8, 2, 1, 200, 229, 4, 237, 11, 111, 8, 6, 1, 230, 125, 4, + 237, 59, 8, 2, 1, 230, 125, 4, 237, 59, 8, 6, 1, 222, 185, 4, 237, 59, 8, + 2, 1, 222, 185, 4, 237, 59, 8, 6, 1, 192, 156, 4, 237, 59, 8, 2, 1, 192, + 156, 4, 237, 59, 8, 6, 1, 250, 252, 8, 6, 1, 218, 237, 4, 128, 8, 6, 1, + 163, 64, 8, 6, 1, 163, 250, 252, 8, 2, 1, 196, 237, 4, 51, 128, 8, 6, 1, + 194, 203, 4, 128, 8, 2, 1, 194, 203, 4, 128, 8, 2, 1, 196, 237, 4, 238, + 142, 8, 6, 1, 138, 230, 124, 8, 2, 1, 138, 230, 124, 8, 2, 1, 200, 145, + 210, 77, 8, 2, 1, 234, 253, 4, 213, 108, 8, 2, 1, 163, 208, 112, 4, 200, + 147, 8, 2, 1, 185, 4, 132, 207, 82, 223, 145, 8, 1, 2, 6, 163, 71, 8, + 201, 155, 2, 1, 223, 65, 73, 1, 6, 196, 236, 8, 6, 1, 206, 159, 4, 201, + 75, 200, 147, 8, 6, 1, 192, 156, 4, 201, 75, 200, 147, 92, 6, 1, 251, 20, + 92, 2, 1, 251, 20, 92, 6, 1, 196, 36, 92, 2, 1, 196, 36, 92, 6, 1, 231, + 204, 92, 2, 1, 231, 204, 92, 6, 1, 237, 223, 92, 2, 1, 237, 223, 92, 6, + 1, 234, 149, 92, 2, 1, 234, 149, 92, 6, 1, 202, 176, 92, 2, 1, 202, 176, + 92, 6, 1, 192, 93, 92, 2, 1, 192, 93, 92, 6, 1, 230, 15, 92, 2, 1, 230, + 15, 92, 6, 1, 199, 204, 92, 2, 1, 199, 204, 92, 6, 1, 228, 55, 92, 2, 1, + 228, 55, 92, 6, 1, 222, 111, 92, 2, 1, 222, 111, 92, 6, 1, 220, 56, 92, + 2, 1, 220, 56, 92, 6, 1, 216, 175, 92, 2, 1, 216, 175, 92, 6, 1, 214, 60, + 92, 2, 1, 214, 60, 92, 6, 1, 221, 49, 92, 2, 1, 221, 49, 92, 6, 1, 74, + 92, 2, 1, 74, 92, 6, 1, 210, 51, 92, 2, 1, 210, 51, 92, 6, 1, 207, 55, + 92, 2, 1, 207, 55, 92, 6, 1, 203, 87, 92, 2, 1, 203, 87, 92, 6, 1, 200, + 100, 92, 2, 1, 200, 100, 92, 6, 1, 197, 119, 92, 2, 1, 197, 119, 92, 6, + 1, 233, 11, 92, 2, 1, 233, 11, 92, 6, 1, 221, 227, 92, 2, 1, 221, 227, + 92, 6, 1, 209, 62, 92, 2, 1, 209, 62, 92, 6, 1, 211, 188, 92, 2, 1, 211, + 188, 92, 6, 1, 237, 9, 251, 26, 92, 2, 1, 237, 9, 251, 26, 92, 6, 1, 40, + 92, 251, 57, 92, 2, 1, 40, 92, 251, 57, 92, 6, 1, 238, 165, 234, 149, 92, + 2, 1, 238, 165, 234, 149, 92, 6, 1, 237, 9, 222, 111, 92, 2, 1, 237, 9, + 222, 111, 92, 6, 1, 237, 9, 214, 60, 92, 2, 1, 237, 9, 214, 60, 92, 6, 1, + 238, 165, 214, 60, 92, 2, 1, 238, 165, 214, 60, 92, 6, 1, 40, 92, 211, + 188, 92, 2, 1, 40, 92, 211, 188, 92, 6, 1, 206, 43, 92, 2, 1, 206, 43, + 92, 6, 1, 238, 180, 204, 4, 92, 2, 1, 238, 180, 204, 4, 92, 6, 1, 40, 92, + 204, 4, 92, 2, 1, 40, 92, 204, 4, 92, 6, 1, 40, 92, 233, 255, 92, 2, 1, + 40, 92, 233, 255, 92, 6, 1, 251, 40, 221, 232, 92, 2, 1, 251, 40, 221, + 232, 92, 6, 1, 237, 9, 229, 6, 92, 2, 1, 237, 9, 229, 6, 92, 6, 1, 40, + 92, 229, 6, 92, 2, 1, 40, 92, 229, 6, 92, 6, 1, 40, 92, 144, 92, 2, 1, + 40, 92, 144, 92, 6, 1, 220, 201, 144, 92, 2, 1, 220, 201, 144, 92, 6, 1, + 40, 92, 229, 219, 92, 2, 1, 40, 92, 229, 219, 92, 6, 1, 40, 92, 230, 18, + 92, 2, 1, 40, 92, 230, 18, 92, 6, 1, 40, 92, 231, 199, 92, 2, 1, 40, 92, + 231, 199, 92, 6, 1, 40, 92, 236, 165, 92, 2, 1, 40, 92, 236, 165, 92, 6, + 1, 40, 92, 203, 226, 92, 2, 1, 40, 92, 203, 226, 92, 6, 1, 40, 212, 245, + 203, 226, 92, 2, 1, 40, 212, 245, 203, 226, 92, 6, 1, 40, 212, 245, 214, + 113, 92, 2, 1, 40, 212, 245, 214, 113, 92, 6, 1, 40, 212, 245, 212, 181, + 92, 2, 1, 40, 212, 245, 212, 181, 92, 6, 1, 40, 212, 245, 194, 126, 92, + 2, 1, 40, 212, 245, 194, 126, 92, 16, 222, 135, 92, 16, 216, 176, 207, + 55, 92, 16, 210, 52, 207, 55, 92, 16, 202, 8, 92, 16, 200, 101, 207, 55, + 92, 16, 221, 228, 207, 55, 92, 16, 203, 227, 203, 87, 92, 6, 1, 238, 165, + 204, 4, 92, 2, 1, 238, 165, 204, 4, 92, 6, 1, 238, 165, 231, 199, 92, 2, + 1, 238, 165, 231, 199, 92, 38, 214, 61, 58, 92, 38, 202, 128, 250, 45, + 92, 38, 202, 128, 219, 248, 92, 6, 1, 247, 212, 221, 232, 92, 2, 1, 247, + 212, 221, 232, 92, 40, 212, 245, 232, 71, 201, 238, 92, 40, 212, 245, + 236, 206, 208, 159, 77, 92, 40, 212, 245, 223, 170, 208, 159, 77, 92, 40, + 212, 245, 196, 107, 236, 177, 92, 232, 109, 90, 230, 78, 92, 232, 71, + 201, 238, 92, 216, 25, 236, 177, 98, 2, 1, 250, 224, 98, 2, 1, 248, 207, + 98, 2, 1, 231, 203, 98, 2, 1, 236, 123, 98, 2, 1, 234, 88, 98, 2, 1, 196, + 20, 98, 2, 1, 192, 79, 98, 2, 1, 200, 125, 98, 2, 1, 223, 190, 98, 2, 1, + 222, 121, 98, 2, 1, 220, 67, 98, 2, 1, 217, 160, 98, 2, 1, 215, 51, 98, + 2, 1, 211, 211, 98, 2, 1, 210, 247, 98, 2, 1, 192, 67, 98, 2, 1, 208, 53, + 98, 2, 1, 206, 40, 98, 2, 1, 200, 112, 98, 2, 1, 197, 77, 98, 2, 1, 210, + 86, 98, 2, 1, 221, 237, 98, 2, 1, 231, 75, 98, 2, 1, 208, 224, 98, 2, 1, + 203, 224, 98, 2, 1, 242, 201, 98, 2, 1, 246, 243, 98, 2, 1, 223, 10, 98, + 2, 1, 242, 138, 98, 2, 1, 246, 101, 98, 2, 1, 193, 207, 98, 2, 1, 223, + 25, 98, 2, 1, 230, 95, 98, 2, 1, 229, 255, 98, 2, 1, 229, 165, 98, 2, 1, + 194, 111, 98, 2, 1, 230, 28, 98, 2, 1, 229, 31, 98, 2, 1, 193, 3, 98, 2, + 1, 251, 97, 199, 110, 1, 168, 199, 110, 1, 193, 125, 199, 110, 1, 193, + 124, 199, 110, 1, 193, 114, 199, 110, 1, 193, 112, 199, 110, 1, 248, 69, + 251, 145, 193, 107, 199, 110, 1, 193, 107, 199, 110, 1, 193, 122, 199, + 110, 1, 193, 119, 199, 110, 1, 193, 121, 199, 110, 1, 193, 120, 199, 110, + 1, 193, 29, 199, 110, 1, 193, 116, 199, 110, 1, 193, 105, 199, 110, 1, + 198, 37, 193, 105, 199, 110, 1, 193, 102, 199, 110, 1, 193, 110, 199, + 110, 1, 248, 69, 251, 145, 193, 110, 199, 110, 1, 198, 37, 193, 110, 199, + 110, 1, 193, 109, 199, 110, 1, 193, 129, 199, 110, 1, 193, 103, 199, 110, + 1, 198, 37, 193, 103, 199, 110, 1, 193, 92, 199, 110, 1, 198, 37, 193, + 92, 199, 110, 1, 193, 22, 199, 110, 1, 193, 71, 199, 110, 1, 251, 70, + 193, 71, 199, 110, 1, 198, 37, 193, 71, 199, 110, 1, 193, 101, 199, 110, + 1, 193, 100, 199, 110, 1, 193, 97, 199, 110, 1, 198, 37, 193, 111, 199, + 110, 1, 198, 37, 193, 95, 199, 110, 1, 193, 93, 199, 110, 1, 192, 214, + 199, 110, 1, 193, 90, 199, 110, 1, 193, 88, 199, 110, 1, 193, 113, 199, + 110, 1, 198, 37, 193, 113, 199, 110, 1, 249, 232, 193, 113, 199, 110, 1, + 193, 87, 199, 110, 1, 193, 85, 199, 110, 1, 193, 86, 199, 110, 1, 193, + 84, 199, 110, 1, 193, 83, 199, 110, 1, 193, 123, 199, 110, 1, 193, 81, + 199, 110, 1, 193, 79, 199, 110, 1, 193, 78, 199, 110, 1, 193, 75, 199, + 110, 1, 193, 72, 199, 110, 1, 200, 91, 193, 72, 199, 110, 1, 193, 70, + 199, 110, 1, 193, 69, 199, 110, 1, 193, 1, 199, 110, 73, 1, 220, 174, 77, + 199, 110, 204, 166, 77, 199, 110, 116, 222, 228, 36, 5, 219, 106, 36, 5, + 216, 84, 36, 5, 207, 47, 36, 5, 202, 204, 36, 5, 203, 210, 36, 5, 247, + 219, 36, 5, 199, 29, 36, 5, 242, 62, 36, 5, 213, 135, 36, 5, 212, 164, + 36, 5, 231, 6, 212, 26, 36, 5, 192, 7, 36, 5, 236, 144, 36, 5, 237, 130, + 36, 5, 222, 232, 36, 5, 199, 175, 36, 5, 242, 187, 36, 5, 210, 64, 36, 5, + 209, 197, 36, 5, 231, 90, 36, 5, 231, 86, 36, 5, 231, 87, 36, 5, 231, 88, + 36, 5, 202, 92, 36, 5, 202, 46, 36, 5, 202, 59, 36, 5, 202, 91, 36, 5, + 202, 64, 36, 5, 202, 65, 36, 5, 202, 51, 36, 5, 246, 181, 36, 5, 246, + 160, 36, 5, 246, 162, 36, 5, 246, 180, 36, 5, 246, 178, 36, 5, 246, 179, + 36, 5, 246, 161, 36, 5, 191, 225, 36, 5, 191, 203, 36, 5, 191, 216, 36, + 5, 191, 224, 36, 5, 191, 219, 36, 5, 191, 220, 36, 5, 191, 208, 36, 5, + 246, 176, 36, 5, 246, 163, 36, 5, 246, 165, 36, 5, 246, 175, 36, 5, 246, + 173, 36, 5, 246, 174, 36, 5, 246, 164, 36, 5, 208, 124, 36, 5, 208, 114, + 36, 5, 208, 120, 36, 5, 208, 123, 36, 5, 208, 121, 36, 5, 208, 122, 36, + 5, 208, 119, 36, 5, 220, 212, 36, 5, 220, 204, 36, 5, 220, 207, 36, 5, + 220, 211, 36, 5, 220, 208, 36, 5, 220, 209, 36, 5, 220, 205, 36, 5, 193, + 164, 36, 5, 193, 151, 36, 5, 193, 159, 36, 5, 193, 163, 36, 5, 193, 161, + 36, 5, 193, 162, 36, 5, 193, 158, 36, 5, 230, 136, 36, 5, 230, 126, 36, + 5, 230, 129, 36, 5, 230, 135, 36, 5, 230, 131, 36, 5, 230, 132, 36, 5, + 230, 128, 38, 42, 1, 248, 123, 38, 42, 1, 196, 123, 38, 42, 1, 231, 70, + 38, 42, 1, 237, 116, 38, 42, 1, 192, 62, 38, 42, 1, 192, 85, 38, 42, 1, + 160, 38, 42, 1, 234, 124, 38, 42, 1, 234, 99, 38, 42, 1, 234, 88, 38, 42, + 1, 74, 38, 42, 1, 210, 181, 38, 42, 1, 234, 21, 38, 42, 1, 234, 9, 38, + 42, 1, 200, 79, 38, 42, 1, 144, 38, 42, 1, 198, 112, 38, 42, 1, 242, 245, + 38, 42, 1, 204, 64, 38, 42, 1, 204, 15, 38, 42, 1, 232, 216, 38, 42, 1, + 234, 5, 38, 42, 1, 64, 38, 42, 1, 223, 251, 38, 42, 1, 236, 163, 38, 42, + 1, 216, 43, 197, 92, 38, 42, 1, 193, 84, 38, 42, 1, 192, 214, 38, 42, 1, + 223, 109, 64, 38, 42, 1, 219, 147, 192, 179, 38, 42, 1, 248, 28, 192, + 179, 38, 42, 1, 223, 109, 248, 28, 192, 179, 51, 250, 208, 201, 150, 217, + 122, 51, 250, 208, 235, 111, 201, 150, 217, 122, 46, 201, 150, 186, 51, + 201, 150, 186, 46, 235, 111, 201, 150, 186, 51, 235, 111, 201, 150, 186, + 208, 39, 223, 132, 217, 122, 208, 39, 235, 111, 223, 132, 217, 122, 235, + 111, 198, 205, 217, 122, 46, 198, 205, 186, 51, 198, 205, 186, 208, 39, + 202, 106, 46, 208, 39, 211, 213, 186, 51, 208, 39, 211, 213, 186, 234, + 172, 238, 220, 210, 242, 232, 138, 210, 242, 207, 168, 232, 138, 210, + 242, 228, 108, 235, 111, 212, 21, 235, 92, 250, 218, 197, 30, 250, 218, + 235, 111, 207, 96, 250, 207, 55, 212, 18, 228, 111, 223, 121, 223, 130, + 211, 41, 247, 160, 228, 112, 4, 237, 14, 199, 91, 4, 207, 82, 58, 46, + 132, 210, 233, 186, 51, 132, 210, 233, 186, 199, 91, 4, 78, 58, 199, 91, + 4, 78, 63, 46, 84, 248, 194, 4, 208, 153, 51, 84, 248, 194, 4, 208, 153, + 198, 249, 46, 138, 186, 198, 249, 51, 138, 186, 247, 188, 46, 138, 186, + 247, 188, 51, 138, 186, 46, 203, 109, 124, 186, 51, 203, 109, 124, 186, + 46, 55, 210, 230, 51, 55, 210, 230, 103, 236, 112, 136, 90, 78, 209, 37, + 90, 78, 136, 103, 236, 112, 209, 37, 108, 232, 119, 78, 209, 37, 232, + 214, 78, 77, 207, 168, 208, 159, 77, 84, 199, 90, 207, 82, 209, 191, 194, + 11, 204, 166, 85, 236, 114, 163, 242, 38, 208, 39, 236, 114, 208, 39, + 242, 38, 163, 204, 180, 237, 239, 4, 46, 230, 180, 237, 239, 4, 51, 230, + 180, 163, 237, 238, 198, 249, 138, 205, 209, 57, 197, 221, 237, 185, 199, + 158, 237, 185, 201, 254, 232, 71, 201, 238, 84, 203, 41, 236, 111, 194, + 58, 84, 219, 175, 246, 224, 55, 228, 111, 207, 168, 242, 38, 55, 219, 48, + 208, 142, 77, 237, 186, 4, 46, 197, 33, 55, 201, 89, 77, 223, 121, 132, + 222, 69, 223, 121, 132, 222, 70, 4, 222, 70, 58, 132, 222, 69, 132, 222, + 70, 4, 236, 114, 55, 202, 31, 242, 38, 235, 111, 202, 189, 198, 170, 237, + 238, 217, 32, 242, 38, 210, 241, 77, 209, 36, 234, 113, 77, 238, 221, + 196, 107, 236, 177, 238, 184, 210, 199, 4, 51, 238, 182, 238, 184, 210, + 199, 4, 46, 238, 182, 199, 66, 3, 6, 233, 242, 12, 48, 207, 198, 12, 48, + 242, 95, 12, 48, 205, 212, 101, 12, 48, 205, 212, 104, 12, 48, 205, 212, + 133, 12, 48, 210, 116, 12, 48, 247, 173, 12, 48, 200, 164, 12, 48, 221, + 125, 101, 12, 48, 221, 125, 104, 12, 48, 236, 174, 12, 48, 205, 216, 12, + 48, 2, 101, 12, 48, 2, 104, 12, 48, 220, 89, 101, 12, 48, 220, 89, 104, + 12, 48, 220, 89, 133, 12, 48, 220, 89, 134, 12, 48, 202, 224, 12, 48, + 199, 162, 12, 48, 202, 221, 101, 12, 48, 202, 221, 104, 12, 48, 229, 234, + 101, 12, 48, 229, 234, 104, 12, 48, 230, 62, 12, 48, 208, 28, 12, 48, + 242, 184, 12, 48, 201, 123, 12, 48, 216, 29, 12, 48, 237, 113, 12, 48, + 216, 18, 12, 48, 242, 113, 12, 48, 194, 130, 101, 12, 48, 194, 130, 104, + 12, 48, 232, 231, 12, 48, 210, 194, 101, 12, 48, 210, 194, 104, 12, 48, + 203, 82, 138, 198, 196, 198, 123, 12, 48, 238, 205, 12, 48, 236, 134, 12, + 48, 223, 57, 12, 48, 247, 211, 80, 242, 78, 12, 48, 233, 181, 12, 48, + 202, 130, 101, 12, 48, 202, 130, 104, 12, 48, 248, 209, 12, 48, 203, 89, + 12, 48, 247, 49, 203, 89, 12, 48, 214, 183, 101, 12, 48, 214, 183, 104, + 12, 48, 214, 183, 133, 12, 48, 214, 183, 134, 12, 48, 216, 247, 12, 48, + 204, 6, 12, 48, 208, 34, 12, 48, 233, 211, 12, 48, 211, 225, 12, 48, 247, + 132, 101, 12, 48, 247, 132, 104, 12, 48, 217, 40, 12, 48, 216, 24, 12, + 48, 230, 214, 101, 12, 48, 230, 214, 104, 12, 48, 230, 214, 133, 12, 48, + 199, 108, 12, 48, 242, 77, 12, 48, 194, 91, 101, 12, 48, 194, 91, 104, + 12, 48, 247, 49, 205, 205, 12, 48, 203, 82, 228, 208, 12, 48, 228, 208, + 12, 48, 247, 49, 202, 143, 12, 48, 247, 49, 204, 1, 12, 48, 232, 149, 12, + 48, 247, 49, 246, 200, 12, 48, 203, 82, 194, 153, 12, 48, 194, 154, 101, + 12, 48, 194, 154, 104, 12, 48, 242, 116, 12, 48, 247, 49, 230, 245, 12, + 48, 184, 101, 12, 48, 184, 104, 12, 48, 247, 49, 219, 84, 12, 48, 247, + 49, 231, 184, 12, 48, 216, 13, 101, 12, 48, 216, 13, 104, 12, 48, 208, + 41, 12, 48, 247, 223, 12, 48, 247, 49, 200, 118, 220, 34, 12, 48, 247, + 49, 220, 37, 12, 48, 247, 49, 194, 52, 12, 48, 247, 49, 232, 168, 12, 48, + 234, 183, 101, 12, 48, 234, 183, 104, 12, 48, 234, 183, 133, 12, 48, 247, + 49, 234, 182, 12, 48, 229, 245, 12, 48, 247, 49, 228, 204, 12, 48, 247, + 207, 12, 48, 231, 54, 12, 48, 247, 49, 232, 224, 12, 48, 247, 49, 248, + 13, 12, 48, 247, 49, 206, 55, 12, 48, 203, 82, 194, 81, 12, 48, 203, 82, + 193, 61, 12, 48, 247, 49, 232, 90, 12, 48, 223, 64, 233, 216, 12, 48, + 247, 49, 233, 216, 12, 48, 223, 64, 198, 251, 12, 48, 247, 49, 198, 251, + 12, 48, 223, 64, 235, 84, 12, 48, 247, 49, 235, 84, 12, 48, 198, 6, 12, + 48, 223, 64, 198, 6, 12, 48, 247, 49, 198, 6, 81, 48, 101, 81, 48, 219, + 175, 81, 48, 236, 114, 81, 48, 203, 4, 81, 48, 205, 211, 81, 48, 128, 81, + 48, 104, 81, 48, 219, 204, 81, 48, 217, 160, 81, 48, 220, 13, 81, 48, + 234, 62, 81, 48, 174, 81, 48, 142, 247, 173, 81, 48, 238, 208, 81, 48, + 228, 49, 81, 48, 200, 164, 81, 48, 211, 184, 247, 173, 81, 48, 221, 124, + 81, 48, 209, 138, 81, 48, 194, 0, 81, 48, 202, 119, 81, 48, 51, 211, 184, + 247, 173, 81, 48, 229, 166, 234, 83, 81, 48, 200, 30, 81, 48, 236, 174, + 81, 48, 205, 216, 81, 48, 242, 95, 81, 48, 209, 88, 81, 48, 251, 79, 81, + 48, 216, 4, 81, 48, 234, 83, 81, 48, 234, 189, 81, 48, 205, 245, 81, 48, + 230, 254, 81, 48, 230, 255, 202, 238, 81, 48, 233, 215, 81, 48, 248, 27, + 81, 48, 194, 23, 81, 48, 242, 206, 81, 48, 207, 27, 81, 48, 223, 186, 81, + 48, 202, 236, 81, 48, 220, 88, 81, 48, 238, 218, 81, 48, 202, 110, 81, + 48, 216, 9, 81, 48, 207, 69, 81, 48, 194, 8, 81, 48, 211, 202, 81, 48, + 198, 14, 81, 48, 235, 64, 81, 48, 203, 195, 199, 162, 81, 48, 235, 111, + 242, 95, 81, 48, 184, 201, 214, 81, 48, 103, 230, 37, 81, 48, 203, 201, + 81, 48, 247, 180, 81, 48, 202, 220, 81, 48, 247, 139, 81, 48, 201, 253, + 81, 48, 229, 233, 81, 48, 230, 79, 81, 48, 236, 118, 81, 48, 230, 62, 81, + 48, 247, 160, 81, 48, 208, 28, 81, 48, 205, 229, 81, 48, 236, 208, 81, + 48, 249, 237, 81, 48, 202, 106, 81, 48, 213, 110, 81, 48, 201, 123, 81, + 48, 206, 1, 81, 48, 216, 29, 81, 48, 198, 195, 81, 48, 220, 170, 81, 48, + 201, 238, 81, 48, 237, 113, 81, 48, 194, 106, 81, 48, 236, 147, 213, 110, + 81, 48, 242, 34, 81, 48, 232, 64, 81, 48, 242, 107, 81, 48, 202, 3, 81, + 48, 194, 129, 81, 48, 232, 231, 81, 48, 242, 103, 81, 48, 233, 54, 81, + 48, 55, 193, 223, 81, 48, 138, 198, 196, 198, 123, 81, 48, 202, 251, 81, + 48, 233, 66, 81, 48, 238, 205, 81, 48, 236, 134, 81, 48, 209, 84, 81, 48, + 223, 57, 81, 48, 217, 14, 81, 48, 199, 89, 81, 48, 201, 70, 81, 48, 219, + 198, 81, 48, 197, 8, 81, 48, 233, 9, 81, 48, 247, 211, 80, 242, 78, 81, + 48, 203, 115, 81, 48, 235, 111, 200, 22, 81, 48, 194, 75, 81, 48, 203, + 13, 81, 48, 236, 194, 81, 48, 233, 181, 81, 48, 202, 146, 81, 48, 54, 81, + 48, 201, 240, 81, 48, 202, 129, 81, 48, 198, 222, 81, 48, 230, 223, 81, + 48, 246, 186, 81, 48, 202, 24, 81, 48, 248, 209, 81, 48, 207, 139, 81, + 48, 203, 89, 81, 48, 223, 49, 81, 48, 214, 182, 81, 48, 204, 6, 81, 48, + 233, 42, 81, 48, 211, 225, 81, 48, 250, 217, 81, 48, 209, 214, 81, 48, + 234, 193, 81, 48, 247, 131, 81, 48, 217, 40, 81, 48, 216, 114, 81, 48, + 204, 187, 81, 48, 250, 81, 81, 48, 216, 24, 81, 48, 199, 0, 81, 48, 211, + 171, 81, 48, 247, 215, 81, 48, 201, 236, 81, 48, 242, 46, 81, 48, 230, + 213, 81, 48, 199, 108, 81, 48, 223, 149, 81, 48, 247, 229, 81, 48, 194, + 154, 234, 83, 81, 48, 242, 77, 81, 48, 194, 90, 81, 48, 205, 205, 81, 48, + 228, 208, 81, 48, 202, 143, 81, 48, 196, 149, 81, 48, 248, 118, 81, 48, + 210, 14, 81, 48, 248, 239, 81, 48, 204, 1, 81, 48, 207, 236, 81, 48, 206, + 195, 81, 48, 232, 149, 81, 48, 247, 213, 81, 48, 246, 200, 81, 48, 247, + 253, 81, 48, 216, 26, 81, 48, 194, 153, 81, 48, 242, 116, 81, 48, 194, + 48, 81, 48, 236, 186, 81, 48, 196, 21, 81, 48, 230, 245, 81, 48, 219, 84, + 81, 48, 231, 184, 81, 48, 216, 12, 81, 48, 203, 3, 81, 48, 203, 195, 200, + 146, 248, 13, 81, 48, 208, 41, 81, 48, 247, 223, 81, 48, 193, 246, 81, + 48, 233, 91, 81, 48, 220, 34, 81, 48, 200, 118, 220, 34, 81, 48, 220, 30, + 81, 48, 202, 173, 81, 48, 220, 37, 81, 48, 194, 52, 81, 48, 232, 168, 81, + 48, 234, 182, 81, 48, 229, 245, 81, 48, 232, 107, 81, 48, 228, 204, 81, + 48, 247, 207, 81, 48, 200, 131, 81, 48, 230, 86, 81, 48, 233, 2, 81, 48, + 206, 88, 194, 48, 81, 48, 246, 188, 81, 48, 231, 54, 81, 48, 232, 224, + 81, 48, 248, 13, 81, 48, 206, 55, 81, 48, 237, 98, 81, 48, 194, 81, 81, + 48, 229, 209, 81, 48, 193, 61, 81, 48, 216, 125, 81, 48, 247, 248, 81, + 48, 234, 95, 81, 48, 232, 90, 81, 48, 198, 167, 81, 48, 235, 67, 81, 48, + 208, 22, 81, 48, 213, 112, 81, 48, 233, 216, 81, 48, 198, 251, 81, 48, + 235, 84, 81, 48, 198, 6, 81, 48, 232, 171, 149, 237, 57, 246, 100, 46, + 115, 207, 101, 149, 237, 57, 246, 100, 95, 115, 63, 149, 237, 57, 246, + 100, 46, 115, 85, 26, 207, 101, 149, 237, 57, 246, 100, 95, 115, 85, 26, + 63, 149, 237, 57, 246, 100, 232, 71, 201, 93, 149, 237, 57, 246, 100, + 201, 94, 232, 89, 58, 149, 237, 57, 246, 100, 201, 94, 232, 89, 63, 149, + 237, 57, 246, 100, 201, 94, 232, 89, 220, 28, 149, 237, 57, 246, 100, + 201, 94, 232, 89, 113, 220, 28, 149, 237, 57, 246, 100, 201, 94, 232, 89, + 113, 207, 101, 149, 237, 57, 246, 100, 201, 94, 232, 89, 106, 220, 28, + 149, 237, 57, 246, 100, 211, 114, 149, 202, 160, 149, 242, 38, 149, 232, + 71, 201, 238, 236, 183, 77, 223, 50, 223, 169, 202, 23, 109, 149, 223, + 80, 77, 149, 242, 80, 77, 149, 31, 192, 76, 46, 250, 208, 186, 51, 250, + 208, 186, 46, 55, 250, 208, 186, 51, 55, 250, 208, 186, 46, 238, 224, + 186, 51, 238, 224, 186, 46, 62, 238, 224, 186, 51, 62, 238, 224, 186, 46, + 60, 219, 247, 186, 51, 60, 219, 247, 186, 209, 153, 77, 231, 123, 77, 46, + 198, 237, 204, 2, 186, 51, 198, 237, 204, 2, 186, 46, 62, 219, 247, 186, + 51, 62, 219, 247, 186, 46, 62, 198, 237, 204, 2, 186, 51, 62, 198, 237, + 204, 2, 186, 46, 62, 50, 186, 51, 62, 50, 186, 194, 125, 237, 185, 207, + 168, 55, 209, 100, 208, 142, 77, 55, 209, 100, 208, 142, 77, 132, 55, + 209, 100, 208, 142, 77, 209, 153, 122, 233, 91, 230, 34, 212, 234, 101, + 230, 34, 212, 234, 104, 230, 34, 212, 234, 133, 230, 34, 212, 234, 134, + 230, 34, 212, 234, 151, 230, 34, 212, 234, 170, 230, 34, 212, 234, 179, + 230, 34, 212, 234, 174, 230, 34, 212, 234, 182, 149, 219, 228, 158, 77, + 149, 207, 73, 158, 77, 149, 237, 66, 158, 77, 149, 234, 61, 158, 77, 30, + 203, 74, 78, 158, 77, 30, 55, 78, 158, 77, 194, 121, 237, 185, 84, 222, + 120, 207, 199, 77, 84, 222, 120, 207, 199, 4, 195, 248, 202, 174, 77, 84, + 222, 120, 207, 199, 122, 113, 230, 78, 84, 222, 120, 207, 199, 4, 195, + 248, 202, 174, 122, 113, 230, 78, 84, 222, 120, 207, 199, 122, 106, 230, + 78, 47, 209, 153, 77, 149, 200, 44, 219, 176, 233, 39, 204, 166, 109, + 230, 34, 212, 234, 200, 30, 230, 34, 212, 234, 197, 239, 230, 34, 212, + 234, 199, 184, 84, 149, 223, 80, 77, 217, 102, 77, 210, 224, 250, 245, + 77, 149, 65, 223, 172, 149, 138, 232, 250, 202, 160, 229, 140, 1, 2, 64, + 229, 140, 1, 64, 229, 140, 1, 2, 70, 229, 140, 1, 70, 229, 140, 1, 2, 68, + 229, 140, 1, 68, 229, 140, 1, 2, 71, 229, 140, 1, 71, 229, 140, 1, 2, 74, + 229, 140, 1, 74, 229, 140, 1, 160, 229, 140, 1, 231, 233, 229, 140, 1, + 221, 204, 229, 140, 1, 231, 46, 229, 140, 1, 221, 33, 229, 140, 1, 230, + 186, 229, 140, 1, 222, 57, 229, 140, 1, 231, 158, 229, 140, 1, 221, 113, + 229, 140, 1, 230, 254, 229, 140, 1, 188, 229, 140, 1, 192, 112, 229, 140, + 1, 203, 125, 229, 140, 1, 192, 30, 229, 140, 1, 201, 184, 229, 140, 1, + 191, 252, 229, 140, 1, 205, 223, 229, 140, 1, 192, 85, 229, 140, 1, 202, + 212, 229, 140, 1, 192, 8, 229, 140, 1, 189, 229, 140, 1, 238, 0, 229, + 140, 1, 199, 128, 229, 140, 1, 237, 16, 229, 140, 1, 2, 198, 45, 229, + 140, 1, 198, 45, 229, 140, 1, 235, 62, 229, 140, 1, 200, 79, 229, 140, 1, + 237, 116, 229, 140, 1, 155, 229, 140, 1, 236, 146, 229, 140, 1, 181, 229, + 140, 1, 214, 60, 229, 140, 1, 213, 22, 229, 140, 1, 214, 214, 229, 140, + 1, 213, 142, 229, 140, 1, 144, 229, 140, 1, 249, 3, 229, 140, 1, 166, + 229, 140, 1, 229, 178, 229, 140, 1, 248, 41, 229, 140, 1, 210, 51, 229, + 140, 1, 228, 181, 229, 140, 1, 247, 124, 229, 140, 1, 209, 51, 229, 140, + 1, 229, 255, 229, 140, 1, 248, 123, 229, 140, 1, 210, 181, 229, 140, 1, + 229, 43, 229, 140, 1, 247, 220, 229, 140, 1, 209, 198, 229, 140, 1, 172, + 229, 140, 1, 216, 175, 229, 140, 1, 215, 241, 229, 140, 1, 217, 48, 229, + 140, 1, 216, 91, 229, 140, 1, 2, 168, 229, 140, 1, 168, 229, 140, 1, 2, + 192, 214, 229, 140, 1, 192, 214, 229, 140, 1, 2, 193, 1, 229, 140, 1, + 193, 1, 229, 140, 1, 167, 229, 140, 1, 207, 151, 229, 140, 1, 206, 218, + 229, 140, 1, 208, 7, 229, 140, 1, 207, 55, 229, 140, 1, 2, 194, 169, 229, + 140, 1, 194, 169, 229, 140, 1, 194, 72, 229, 140, 1, 194, 111, 229, 140, + 1, 194, 36, 229, 140, 1, 215, 151, 229, 140, 1, 194, 223, 229, 140, 1, 2, + 160, 229, 140, 1, 2, 222, 57, 38, 222, 82, 195, 248, 202, 174, 77, 38, + 222, 82, 204, 185, 202, 174, 77, 222, 82, 195, 248, 202, 174, 77, 222, + 82, 204, 185, 202, 174, 77, 229, 140, 223, 80, 77, 229, 140, 195, 248, + 223, 80, 77, 229, 140, 236, 231, 192, 231, 222, 82, 55, 228, 111, 75, 1, + 2, 64, 75, 1, 64, 75, 1, 2, 70, 75, 1, 70, 75, 1, 2, 68, 75, 1, 68, 75, + 1, 2, 71, 75, 1, 71, 75, 1, 2, 74, 75, 1, 74, 75, 1, 160, 75, 1, 231, + 233, 75, 1, 221, 204, 75, 1, 231, 46, 75, 1, 221, 33, 75, 1, 230, 186, + 75, 1, 222, 57, 75, 1, 231, 158, 75, 1, 221, 113, 75, 1, 230, 254, 75, 1, + 188, 75, 1, 192, 112, 75, 1, 203, 125, 75, 1, 192, 30, 75, 1, 201, 184, + 75, 1, 191, 252, 75, 1, 205, 223, 75, 1, 192, 85, 75, 1, 202, 212, 75, 1, + 192, 8, 75, 1, 189, 75, 1, 238, 0, 75, 1, 199, 128, 75, 1, 237, 16, 75, + 1, 2, 198, 45, 75, 1, 198, 45, 75, 1, 235, 62, 75, 1, 200, 79, 75, 1, + 237, 116, 75, 1, 155, 75, 1, 236, 146, 75, 1, 181, 75, 1, 214, 60, 75, 1, + 213, 22, 75, 1, 214, 214, 75, 1, 213, 142, 75, 1, 144, 75, 1, 249, 3, 75, + 1, 166, 75, 1, 229, 178, 75, 1, 248, 41, 75, 1, 210, 51, 75, 1, 228, 181, + 75, 1, 247, 124, 75, 1, 209, 51, 75, 1, 229, 255, 75, 1, 248, 123, 75, 1, + 210, 181, 75, 1, 229, 43, 75, 1, 247, 220, 75, 1, 209, 198, 75, 1, 172, + 75, 1, 216, 175, 75, 1, 215, 241, 75, 1, 217, 48, 75, 1, 216, 91, 75, 1, + 2, 168, 75, 1, 168, 75, 1, 2, 192, 214, 75, 1, 192, 214, 75, 1, 2, 193, + 1, 75, 1, 193, 1, 75, 1, 167, 75, 1, 207, 151, 75, 1, 206, 218, 75, 1, + 208, 7, 75, 1, 207, 55, 75, 1, 2, 194, 169, 75, 1, 194, 169, 75, 1, 194, + 72, 75, 1, 194, 111, 75, 1, 194, 36, 75, 1, 215, 151, 75, 1, 194, 223, + 75, 1, 2, 160, 75, 1, 2, 222, 57, 75, 1, 196, 157, 75, 1, 196, 39, 75, 1, + 196, 123, 75, 1, 195, 252, 75, 85, 236, 114, 222, 82, 209, 76, 202, 174, + 77, 75, 223, 80, 77, 75, 195, 248, 223, 80, 77, 75, 236, 231, 221, 75, + 247, 197, 1, 249, 226, 247, 197, 1, 211, 93, 247, 197, 1, 218, 236, 247, + 197, 1, 233, 163, 247, 197, 1, 238, 95, 247, 197, 1, 200, 228, 247, 197, + 1, 215, 151, 247, 197, 1, 165, 247, 197, 1, 232, 44, 247, 197, 1, 222, + 184, 247, 197, 1, 230, 124, 247, 197, 1, 223, 65, 247, 197, 1, 208, 247, + 247, 197, 1, 193, 223, 247, 197, 1, 192, 72, 247, 197, 1, 246, 119, 247, + 197, 1, 204, 66, 247, 197, 1, 150, 247, 197, 1, 192, 155, 247, 197, 1, + 247, 52, 247, 197, 1, 206, 158, 247, 197, 1, 64, 247, 197, 1, 74, 247, + 197, 1, 71, 247, 197, 1, 234, 157, 247, 197, 1, 251, 63, 247, 197, 1, + 234, 150, 247, 197, 1, 250, 8, 247, 197, 1, 211, 130, 247, 197, 1, 250, + 224, 247, 197, 1, 234, 88, 247, 197, 1, 250, 214, 247, 197, 1, 234, 73, + 247, 197, 1, 234, 21, 247, 197, 1, 70, 247, 197, 1, 68, 247, 197, 1, 223, + 78, 247, 197, 1, 196, 236, 247, 197, 1, 214, 167, 247, 197, 1, 231, 2, + 247, 197, 1, 223, 225, 247, 197, 1, 185, 4, 78, 58, 247, 197, 1, 213, + 179, 30, 1, 221, 151, 30, 1, 202, 84, 30, 1, 221, 144, 30, 1, 214, 45, + 30, 1, 214, 43, 30, 1, 214, 42, 30, 1, 199, 103, 30, 1, 202, 73, 30, 1, + 207, 133, 30, 1, 207, 128, 30, 1, 207, 125, 30, 1, 207, 118, 30, 1, 207, + 113, 30, 1, 207, 108, 30, 1, 207, 119, 30, 1, 207, 131, 30, 1, 216, 153, + 30, 1, 210, 36, 30, 1, 202, 81, 30, 1, 210, 25, 30, 1, 203, 64, 30, 1, + 202, 78, 30, 1, 223, 247, 30, 1, 242, 144, 30, 1, 202, 88, 30, 1, 242, + 211, 30, 1, 221, 225, 30, 1, 199, 198, 30, 1, 210, 75, 30, 1, 229, 162, + 30, 1, 64, 30, 1, 251, 108, 30, 1, 168, 30, 1, 193, 118, 30, 1, 234, 50, + 30, 1, 71, 30, 1, 193, 56, 30, 1, 193, 69, 30, 1, 74, 30, 1, 194, 169, + 30, 1, 194, 160, 30, 1, 212, 0, 30, 1, 193, 1, 30, 1, 68, 30, 1, 194, 93, + 30, 1, 194, 111, 30, 1, 194, 72, 30, 1, 192, 214, 30, 1, 233, 230, 30, 1, + 193, 22, 30, 1, 70, 30, 232, 247, 30, 1, 202, 82, 30, 1, 214, 35, 30, 1, + 214, 37, 30, 1, 214, 40, 30, 1, 207, 126, 30, 1, 207, 107, 30, 1, 207, + 115, 30, 1, 207, 120, 30, 1, 207, 105, 30, 1, 216, 146, 30, 1, 216, 143, + 30, 1, 216, 147, 30, 1, 222, 105, 30, 1, 210, 31, 30, 1, 210, 17, 30, 1, + 210, 23, 30, 1, 210, 20, 30, 1, 210, 34, 30, 1, 210, 18, 30, 1, 222, 103, + 30, 1, 222, 101, 30, 1, 203, 57, 30, 1, 203, 55, 30, 1, 203, 47, 30, 1, + 203, 52, 30, 1, 203, 62, 30, 1, 211, 8, 30, 1, 202, 85, 30, 1, 193, 46, + 30, 1, 193, 40, 30, 1, 193, 41, 30, 1, 222, 104, 30, 1, 202, 86, 30, 1, + 193, 52, 30, 1, 192, 245, 30, 1, 192, 244, 30, 1, 192, 247, 30, 1, 192, + 201, 30, 1, 192, 202, 30, 1, 192, 205, 30, 1, 250, 123, 30, 1, 250, 117, + 149, 250, 193, 219, 164, 77, 149, 250, 193, 207, 169, 77, 149, 250, 193, + 90, 77, 149, 250, 193, 103, 77, 149, 250, 193, 112, 77, 149, 250, 193, + 232, 119, 77, 149, 250, 193, 198, 249, 77, 149, 250, 193, 85, 77, 149, + 250, 193, 247, 188, 77, 149, 250, 193, 232, 226, 77, 149, 250, 193, 205, + 212, 77, 149, 250, 193, 199, 192, 77, 149, 250, 193, 232, 112, 77, 149, + 250, 193, 229, 230, 77, 149, 250, 193, 234, 190, 77, 149, 250, 193, 217, + 161, 77, 247, 197, 1, 247, 124, 247, 197, 1, 192, 30, 247, 197, 1, 223, + 20, 247, 197, 1, 230, 186, 247, 197, 1, 234, 171, 247, 197, 1, 234, 70, + 247, 197, 1, 211, 194, 247, 197, 1, 211, 198, 247, 197, 1, 223, 105, 247, + 197, 1, 250, 195, 247, 197, 1, 223, 156, 247, 197, 1, 197, 47, 247, 197, + 1, 223, 207, 247, 197, 1, 214, 145, 247, 197, 1, 251, 56, 247, 197, 1, + 250, 3, 247, 197, 1, 250, 241, 247, 197, 1, 211, 219, 247, 197, 1, 211, + 201, 247, 197, 1, 223, 153, 247, 197, 52, 1, 211, 93, 247, 197, 52, 1, + 200, 228, 247, 197, 52, 1, 222, 184, 247, 197, 52, 1, 230, 124, 247, 197, + 1, 231, 85, 247, 197, 1, 219, 223, 247, 197, 1, 191, 232, 247, 197, 52, + 1, 232, 44, 247, 197, 1, 230, 144, 247, 197, 1, 220, 239, 247, 197, 1, + 212, 0, 247, 197, 1, 251, 72, 12, 201, 208, 200, 228, 12, 201, 208, 194, + 84, 12, 201, 208, 193, 198, 12, 201, 208, 247, 65, 12, 201, 208, 201, 80, + 12, 201, 208, 228, 101, 12, 201, 208, 228, 105, 12, 201, 208, 228, 190, + 12, 201, 208, 228, 102, 12, 201, 208, 200, 231, 12, 201, 208, 228, 104, + 12, 201, 208, 228, 100, 12, 201, 208, 228, 188, 12, 201, 208, 228, 103, + 12, 201, 208, 228, 99, 12, 201, 208, 215, 151, 12, 201, 208, 230, 124, + 12, 201, 208, 206, 158, 12, 201, 208, 211, 93, 12, 201, 208, 202, 163, + 12, 201, 208, 238, 95, 12, 201, 208, 228, 106, 12, 201, 208, 229, 188, + 12, 201, 208, 200, 240, 12, 201, 208, 201, 57, 12, 201, 208, 202, 35, 12, + 201, 208, 204, 72, 12, 201, 208, 210, 185, 12, 201, 208, 208, 249, 12, + 201, 208, 199, 37, 12, 201, 208, 200, 230, 12, 201, 208, 201, 69, 12, + 201, 208, 228, 116, 12, 201, 208, 228, 98, 12, 201, 208, 210, 96, 12, + 201, 208, 208, 247, 75, 1, 2, 221, 33, 75, 1, 2, 203, 125, 75, 1, 2, 201, + 184, 75, 1, 2, 155, 75, 1, 2, 213, 22, 75, 1, 2, 144, 75, 1, 2, 229, 178, + 75, 1, 2, 228, 181, 75, 1, 2, 229, 255, 75, 1, 2, 229, 43, 75, 1, 2, 215, + 241, 75, 1, 2, 167, 75, 1, 2, 207, 151, 75, 1, 2, 206, 218, 75, 1, 2, + 208, 7, 75, 1, 2, 207, 55, 125, 30, 221, 151, 125, 30, 214, 45, 125, 30, + 199, 103, 125, 30, 207, 133, 125, 30, 216, 153, 125, 30, 210, 36, 125, + 30, 203, 64, 125, 30, 223, 247, 125, 30, 242, 144, 125, 30, 242, 211, + 125, 30, 221, 225, 125, 30, 199, 198, 125, 30, 210, 75, 125, 30, 229, + 162, 125, 30, 221, 152, 64, 125, 30, 214, 46, 64, 125, 30, 199, 104, 64, + 125, 30, 207, 134, 64, 125, 30, 216, 154, 64, 125, 30, 210, 37, 64, 125, + 30, 203, 65, 64, 125, 30, 223, 248, 64, 125, 30, 242, 145, 64, 125, 30, + 242, 212, 64, 125, 30, 221, 226, 64, 125, 30, 199, 199, 64, 125, 30, 210, + 76, 64, 125, 30, 229, 163, 64, 125, 30, 242, 145, 68, 125, 221, 79, 246, + 100, 211, 234, 125, 221, 79, 246, 100, 185, 228, 181, 125, 228, 39, 101, + 125, 228, 39, 104, 125, 228, 39, 133, 125, 228, 39, 134, 125, 228, 39, + 151, 125, 228, 39, 170, 125, 228, 39, 179, 125, 228, 39, 174, 125, 228, + 39, 182, 125, 228, 39, 200, 30, 125, 228, 39, 216, 29, 125, 228, 39, 232, + 231, 125, 228, 39, 194, 129, 125, 228, 39, 194, 16, 125, 228, 39, 216, + 240, 125, 228, 39, 234, 189, 125, 228, 39, 201, 123, 125, 228, 39, 201, + 241, 125, 228, 39, 230, 9, 125, 228, 39, 202, 201, 125, 228, 39, 215, 62, + 125, 228, 39, 202, 145, 125, 228, 39, 232, 242, 125, 228, 39, 239, 14, + 125, 228, 39, 220, 173, 125, 228, 39, 207, 192, 125, 228, 39, 246, 253, + 125, 228, 39, 201, 190, 125, 228, 39, 201, 103, 125, 228, 39, 234, 60, + 125, 228, 39, 207, 182, 125, 228, 39, 251, 4, 125, 228, 39, 233, 19, 125, + 228, 39, 207, 180, 125, 228, 39, 204, 187, 125, 228, 39, 208, 2, 47, 228, + 39, 208, 158, 47, 228, 39, 221, 178, 47, 228, 39, 205, 243, 47, 228, 39, + 221, 75, 47, 31, 200, 31, 211, 212, 60, 202, 106, 47, 31, 197, 240, 211, + 212, 60, 202, 106, 47, 31, 199, 185, 211, 212, 60, 202, 106, 47, 31, 232, + 127, 211, 212, 60, 202, 106, 47, 31, 233, 4, 211, 212, 60, 202, 106, 47, + 31, 203, 26, 211, 212, 60, 202, 106, 47, 31, 204, 141, 211, 212, 60, 202, + 106, 47, 31, 234, 138, 211, 212, 60, 202, 106, 210, 220, 57, 47, 31, 197, + 240, 101, 47, 31, 197, 240, 104, 47, 31, 197, 240, 133, 47, 31, 197, 240, + 134, 47, 31, 197, 240, 151, 47, 31, 197, 240, 170, 47, 31, 197, 240, 179, + 47, 31, 197, 240, 174, 47, 31, 197, 240, 182, 47, 31, 199, 184, 47, 31, + 199, 185, 101, 47, 31, 199, 185, 104, 47, 31, 199, 185, 133, 47, 31, 199, + 185, 134, 47, 31, 199, 185, 151, 47, 30, 221, 151, 47, 30, 214, 45, 47, + 30, 199, 103, 47, 30, 207, 133, 47, 30, 216, 153, 47, 30, 210, 36, 47, + 30, 203, 64, 47, 30, 223, 247, 47, 30, 242, 144, 47, 30, 242, 211, 47, + 30, 221, 225, 47, 30, 199, 198, 47, 30, 210, 75, 47, 30, 229, 162, 47, + 30, 221, 152, 64, 47, 30, 214, 46, 64, 47, 30, 199, 104, 64, 47, 30, 207, + 134, 64, 47, 30, 216, 154, 64, 47, 30, 210, 37, 64, 47, 30, 203, 65, 64, + 47, 30, 223, 248, 64, 47, 30, 242, 145, 64, 47, 30, 242, 212, 64, 47, 30, + 221, 226, 64, 47, 30, 199, 199, 64, 47, 30, 210, 76, 64, 47, 30, 229, + 163, 64, 47, 221, 79, 246, 100, 246, 107, 47, 221, 79, 246, 100, 222, + 210, 47, 30, 223, 248, 68, 221, 79, 202, 23, 109, 47, 228, 39, 101, 47, + 228, 39, 104, 47, 228, 39, 133, 47, 228, 39, 134, 47, 228, 39, 151, 47, + 228, 39, 170, 47, 228, 39, 179, 47, 228, 39, 174, 47, 228, 39, 182, 47, + 228, 39, 200, 30, 47, 228, 39, 216, 29, 47, 228, 39, 232, 231, 47, 228, + 39, 194, 129, 47, 228, 39, 194, 16, 47, 228, 39, 216, 240, 47, 228, 39, + 234, 189, 47, 228, 39, 201, 123, 47, 228, 39, 201, 241, 47, 228, 39, 230, + 9, 47, 228, 39, 202, 201, 47, 228, 39, 215, 62, 47, 228, 39, 202, 145, + 47, 228, 39, 232, 242, 47, 228, 39, 239, 14, 47, 228, 39, 220, 173, 47, + 228, 39, 205, 210, 47, 228, 39, 217, 165, 47, 228, 39, 233, 29, 47, 228, + 39, 201, 135, 47, 228, 39, 233, 208, 47, 228, 39, 209, 95, 47, 228, 39, + 250, 12, 47, 228, 39, 223, 81, 47, 228, 39, 207, 180, 47, 228, 39, 238, + 229, 47, 228, 39, 238, 217, 47, 228, 39, 229, 155, 47, 228, 39, 246, 137, + 47, 228, 39, 219, 52, 47, 228, 39, 220, 28, 47, 228, 39, 207, 101, 47, + 228, 39, 217, 33, 47, 228, 39, 207, 210, 47, 228, 39, 201, 190, 47, 228, + 39, 201, 103, 47, 228, 39, 234, 60, 47, 228, 39, 207, 182, 47, 228, 39, + 251, 4, 47, 228, 39, 214, 31, 47, 31, 199, 185, 170, 47, 31, 199, 185, + 179, 47, 31, 199, 185, 174, 47, 31, 199, 185, 182, 47, 31, 232, 126, 47, + 31, 232, 127, 101, 47, 31, 232, 127, 104, 47, 31, 232, 127, 133, 47, 31, + 232, 127, 134, 47, 31, 232, 127, 151, 47, 31, 232, 127, 170, 47, 31, 232, + 127, 179, 47, 31, 232, 127, 174, 47, 31, 232, 127, 182, 47, 31, 233, 3, + 149, 200, 44, 16, 39, 223, 52, 149, 200, 44, 16, 39, 233, 41, 149, 200, + 44, 16, 39, 217, 129, 149, 200, 44, 16, 39, 250, 137, 149, 200, 44, 16, + 39, 217, 92, 149, 200, 44, 16, 39, 222, 207, 149, 200, 44, 16, 39, 222, + 208, 149, 200, 44, 16, 39, 250, 4, 149, 200, 44, 16, 39, 204, 164, 149, + 200, 44, 16, 39, 212, 6, 149, 200, 44, 16, 39, 213, 98, 149, 200, 44, 16, + 39, 237, 110, 50, 229, 188, 50, 234, 17, 50, 233, 218, 219, 181, 219, + 208, 57, 47, 75, 64, 47, 75, 70, 47, 75, 68, 47, 75, 71, 47, 75, 74, 47, + 75, 160, 47, 75, 221, 204, 47, 75, 221, 33, 47, 75, 222, 57, 47, 75, 221, + 113, 47, 75, 188, 47, 75, 203, 125, 47, 75, 201, 184, 47, 75, 205, 223, + 47, 75, 202, 212, 47, 75, 189, 47, 75, 199, 128, 47, 75, 198, 45, 47, 75, + 200, 79, 47, 75, 155, 47, 75, 181, 47, 75, 214, 60, 47, 75, 213, 22, 47, + 75, 214, 214, 47, 75, 213, 142, 47, 75, 144, 47, 75, 229, 178, 47, 75, + 228, 181, 47, 75, 229, 255, 47, 75, 229, 43, 47, 75, 172, 47, 75, 216, + 175, 47, 75, 215, 241, 47, 75, 217, 48, 47, 75, 216, 91, 47, 75, 168, 47, + 75, 192, 214, 47, 75, 193, 1, 47, 75, 167, 47, 75, 207, 151, 47, 75, 206, + 218, 47, 75, 208, 7, 47, 75, 207, 55, 47, 75, 194, 169, 47, 75, 194, 72, + 47, 75, 194, 111, 47, 75, 194, 36, 50, 234, 20, 215, 63, 207, 218, 50, + 250, 162, 50, 250, 63, 50, 250, 189, 50, 251, 246, 50, 223, 158, 50, 223, + 125, 50, 197, 44, 50, 233, 245, 50, 234, 168, 50, 211, 197, 50, 211, 190, + 50, 222, 133, 50, 222, 97, 50, 222, 92, 50, 231, 188, 50, 231, 198, 50, + 231, 34, 50, 231, 30, 50, 220, 203, 50, 231, 21, 50, 221, 169, 50, 221, + 168, 50, 221, 167, 50, 221, 166, 50, 230, 154, 50, 230, 153, 50, 220, + 252, 50, 220, 255, 50, 222, 44, 50, 221, 77, 50, 221, 85, 50, 206, 74, + 50, 206, 31, 50, 203, 45, 50, 204, 170, 50, 204, 169, 50, 237, 252, 50, + 237, 53, 50, 236, 115, 50, 199, 20, 50, 215, 56, 50, 213, 99, 50, 230, + 83, 50, 211, 71, 50, 211, 70, 50, 249, 0, 50, 210, 48, 50, 210, 10, 50, + 210, 11, 50, 248, 9, 50, 228, 176, 50, 228, 170, 50, 247, 80, 50, 228, + 154, 50, 229, 216, 50, 210, 107, 50, 210, 149, 50, 229, 197, 50, 210, + 145, 50, 210, 163, 50, 248, 103, 50, 209, 187, 50, 247, 193, 50, 229, 19, + 50, 209, 173, 50, 229, 10, 50, 229, 12, 50, 217, 178, 50, 217, 174, 50, + 217, 183, 50, 217, 115, 50, 217, 146, 50, 216, 132, 50, 216, 107, 50, + 216, 106, 50, 217, 21, 50, 217, 18, 50, 217, 22, 50, 193, 128, 50, 193, + 126, 50, 192, 199, 50, 207, 71, 50, 207, 75, 50, 206, 185, 50, 206, 178, + 50, 207, 207, 50, 207, 204, 50, 194, 127, 149, 200, 44, 16, 39, 228, 198, + 192, 76, 149, 200, 44, 16, 39, 228, 198, 101, 149, 200, 44, 16, 39, 228, + 198, 104, 149, 200, 44, 16, 39, 228, 198, 133, 149, 200, 44, 16, 39, 228, + 198, 134, 149, 200, 44, 16, 39, 228, 198, 151, 149, 200, 44, 16, 39, 228, + 198, 170, 149, 200, 44, 16, 39, 228, 198, 179, 149, 200, 44, 16, 39, 228, + 198, 174, 149, 200, 44, 16, 39, 228, 198, 182, 149, 200, 44, 16, 39, 228, + 198, 200, 30, 149, 200, 44, 16, 39, 228, 198, 234, 111, 149, 200, 44, 16, + 39, 228, 198, 197, 244, 149, 200, 44, 16, 39, 228, 198, 199, 186, 149, + 200, 44, 16, 39, 228, 198, 232, 113, 149, 200, 44, 16, 39, 228, 198, 233, + 7, 149, 200, 44, 16, 39, 228, 198, 203, 35, 149, 200, 44, 16, 39, 228, + 198, 204, 143, 149, 200, 44, 16, 39, 228, 198, 234, 145, 149, 200, 44, + 16, 39, 228, 198, 214, 13, 149, 200, 44, 16, 39, 228, 198, 197, 239, 149, + 200, 44, 16, 39, 228, 198, 197, 232, 149, 200, 44, 16, 39, 228, 198, 197, + 227, 149, 200, 44, 16, 39, 228, 198, 197, 229, 149, 200, 44, 16, 39, 228, + 198, 197, 234, 50, 228, 189, 50, 238, 0, 50, 250, 8, 50, 161, 50, 211, + 120, 50, 210, 186, 50, 236, 149, 50, 236, 150, 202, 105, 50, 236, 150, + 238, 156, 50, 223, 78, 50, 234, 20, 215, 63, 229, 217, 50, 234, 20, 215, + 63, 200, 251, 50, 234, 20, 215, 63, 200, 144, 50, 234, 20, 215, 63, 217, + 17, 50, 238, 219, 50, 211, 78, 250, 227, 50, 181, 50, 215, 242, 64, 50, + 172, 50, 160, 50, 222, 60, 50, 217, 87, 50, 231, 176, 50, 247, 3, 50, + 222, 59, 50, 210, 97, 50, 214, 169, 50, 215, 242, 233, 163, 50, 215, 242, + 232, 44, 50, 216, 216, 50, 221, 252, 50, 228, 106, 50, 221, 206, 50, 216, + 177, 50, 231, 48, 50, 199, 130, 50, 215, 242, 165, 50, 216, 99, 50, 236, + 159, 50, 221, 133, 50, 232, 166, 50, 213, 180, 50, 215, 242, 218, 236, + 50, 216, 96, 50, 242, 64, 50, 221, 127, 50, 216, 97, 202, 105, 50, 242, + 65, 202, 105, 50, 218, 237, 202, 105, 50, 221, 128, 202, 105, 50, 216, + 97, 238, 156, 50, 242, 65, 238, 156, 50, 218, 237, 238, 156, 50, 221, + 128, 238, 156, 50, 218, 237, 136, 206, 158, 50, 218, 237, 136, 206, 159, + 202, 105, 50, 166, 50, 221, 69, 50, 215, 247, 50, 230, 228, 50, 208, 58, + 50, 208, 59, 136, 206, 158, 50, 208, 59, 136, 206, 159, 202, 105, 50, + 209, 64, 50, 213, 63, 50, 215, 242, 206, 158, 50, 215, 244, 50, 209, 11, + 50, 212, 212, 50, 215, 242, 196, 236, 50, 215, 175, 50, 220, 241, 50, + 215, 176, 217, 21, 50, 209, 10, 50, 212, 211, 50, 215, 242, 194, 202, 50, + 215, 169, 50, 220, 239, 50, 215, 170, 217, 21, 50, 222, 185, 211, 239, + 50, 218, 237, 211, 239, 50, 250, 241, 50, 247, 168, 50, 246, 182, 50, + 246, 159, 50, 247, 53, 136, 221, 252, 50, 242, 63, 50, 237, 170, 50, 230, + 137, 50, 144, 50, 228, 190, 50, 223, 190, 50, 221, 140, 50, 221, 128, + 246, 225, 50, 221, 35, 50, 219, 110, 50, 219, 109, 50, 219, 94, 50, 218, + 252, 50, 217, 88, 202, 236, 50, 216, 131, 50, 216, 57, 50, 210, 95, 50, + 209, 201, 50, 209, 133, 50, 209, 131, 50, 202, 96, 50, 201, 84, 50, 194, + 113, 50, 196, 237, 136, 218, 236, 50, 41, 136, 218, 236, 149, 200, 44, + 16, 39, 237, 174, 101, 149, 200, 44, 16, 39, 237, 174, 104, 149, 200, 44, + 16, 39, 237, 174, 133, 149, 200, 44, 16, 39, 237, 174, 134, 149, 200, 44, + 16, 39, 237, 174, 151, 149, 200, 44, 16, 39, 237, 174, 170, 149, 200, 44, + 16, 39, 237, 174, 179, 149, 200, 44, 16, 39, 237, 174, 174, 149, 200, 44, + 16, 39, 237, 174, 182, 149, 200, 44, 16, 39, 237, 174, 200, 30, 149, 200, + 44, 16, 39, 237, 174, 234, 111, 149, 200, 44, 16, 39, 237, 174, 197, 244, + 149, 200, 44, 16, 39, 237, 174, 199, 186, 149, 200, 44, 16, 39, 237, 174, + 232, 113, 149, 200, 44, 16, 39, 237, 174, 233, 7, 149, 200, 44, 16, 39, + 237, 174, 203, 35, 149, 200, 44, 16, 39, 237, 174, 204, 143, 149, 200, + 44, 16, 39, 237, 174, 234, 145, 149, 200, 44, 16, 39, 237, 174, 214, 13, + 149, 200, 44, 16, 39, 237, 174, 197, 239, 149, 200, 44, 16, 39, 237, 174, + 197, 232, 149, 200, 44, 16, 39, 237, 174, 197, 227, 149, 200, 44, 16, 39, + 237, 174, 197, 229, 149, 200, 44, 16, 39, 237, 174, 197, 234, 149, 200, + 44, 16, 39, 237, 174, 197, 235, 149, 200, 44, 16, 39, 237, 174, 197, 230, + 149, 200, 44, 16, 39, 237, 174, 197, 231, 149, 200, 44, 16, 39, 237, 174, + 197, 238, 149, 200, 44, 16, 39, 237, 174, 197, 233, 149, 200, 44, 16, 39, + 237, 174, 199, 184, 149, 200, 44, 16, 39, 237, 174, 199, 182, 50, 231, + 215, 229, 191, 39, 199, 225, 238, 197, 229, 229, 229, 191, 39, 199, 225, + 207, 250, 234, 189, 229, 191, 39, 236, 242, 250, 27, 199, 225, 248, 98, + 229, 191, 39, 192, 227, 232, 158, 229, 191, 39, 194, 155, 229, 191, 39, + 239, 17, 229, 191, 39, 199, 225, 250, 88, 229, 191, 39, 229, 26, 199, 26, + 229, 191, 39, 2, 200, 126, 229, 191, 39, 198, 198, 229, 191, 39, 210, + 179, 229, 191, 39, 202, 21, 229, 191, 39, 233, 31, 229, 191, 39, 230, + 206, 209, 156, 229, 191, 39, 216, 77, 229, 191, 39, 234, 59, 229, 191, + 39, 232, 159, 229, 191, 39, 194, 9, 211, 212, 199, 225, 237, 111, 229, + 191, 39, 250, 141, 229, 191, 39, 238, 252, 229, 191, 39, 247, 254, 199, + 150, 229, 191, 39, 230, 226, 229, 191, 39, 202, 123, 250, 161, 229, 191, + 39, 207, 172, 229, 191, 39, 223, 152, 229, 191, 39, 230, 206, 200, 126, + 229, 191, 39, 216, 5, 238, 222, 229, 191, 39, 230, 206, 209, 108, 229, + 191, 39, 199, 225, 251, 148, 194, 129, 229, 191, 39, 199, 225, 242, 92, + 232, 231, 229, 191, 39, 223, 166, 229, 191, 39, 235, 38, 229, 191, 39, + 207, 175, 229, 191, 39, 230, 206, 209, 138, 229, 191, 39, 209, 82, 229, + 191, 39, 237, 190, 80, 199, 225, 219, 195, 229, 191, 39, 199, 225, 233, + 69, 229, 191, 39, 211, 169, 229, 191, 39, 212, 13, 229, 191, 39, 237, 81, + 229, 191, 39, 237, 103, 229, 191, 39, 223, 181, 229, 191, 39, 247, 154, + 229, 191, 39, 242, 40, 115, 217, 24, 229, 191, 39, 231, 183, 199, 26, + 229, 191, 39, 209, 21, 197, 31, 229, 191, 39, 211, 168, 229, 191, 39, + 199, 225, 194, 95, 229, 191, 39, 207, 163, 229, 191, 39, 199, 225, 246, + 188, 229, 191, 39, 199, 225, 250, 84, 199, 144, 229, 191, 39, 199, 225, + 222, 45, 201, 245, 216, 9, 229, 191, 39, 237, 48, 229, 191, 39, 199, 225, + 217, 118, 217, 179, 229, 191, 39, 251, 149, 229, 191, 39, 199, 225, 194, + 146, 229, 191, 39, 199, 225, 231, 138, 194, 52, 229, 191, 39, 199, 225, + 222, 216, 220, 102, 229, 191, 39, 236, 191, 229, 191, 39, 219, 182, 229, + 191, 39, 223, 155, 198, 122, 229, 191, 39, 2, 209, 108, 229, 191, 39, + 251, 81, 242, 30, 229, 191, 39, 248, 101, 242, 30, 11, 5, 223, 82, 11, 5, + 223, 74, 11, 5, 70, 11, 5, 223, 108, 11, 5, 223, 249, 11, 5, 223, 232, + 11, 5, 223, 251, 11, 5, 223, 250, 11, 5, 250, 26, 11, 5, 249, 238, 11, 5, + 64, 11, 5, 250, 163, 11, 5, 197, 42, 11, 5, 197, 46, 11, 5, 197, 43, 11, + 5, 211, 140, 11, 5, 211, 103, 11, 5, 74, 11, 5, 211, 185, 11, 5, 233, + 209, 11, 5, 71, 11, 5, 193, 244, 11, 5, 248, 1, 11, 5, 247, 252, 11, 5, + 248, 41, 11, 5, 248, 14, 11, 5, 248, 30, 11, 5, 248, 29, 11, 5, 248, 32, + 11, 5, 248, 31, 11, 5, 248, 170, 11, 5, 248, 162, 11, 5, 249, 3, 11, 5, + 248, 195, 11, 5, 247, 92, 11, 5, 247, 96, 11, 5, 247, 93, 11, 5, 247, + 192, 11, 5, 247, 173, 11, 5, 247, 220, 11, 5, 247, 198, 11, 5, 248, 57, + 11, 5, 248, 123, 11, 5, 248, 70, 11, 5, 247, 76, 11, 5, 247, 70, 11, 5, + 247, 124, 11, 5, 247, 91, 11, 5, 247, 84, 11, 5, 247, 89, 11, 5, 247, 58, + 11, 5, 247, 56, 11, 5, 247, 63, 11, 5, 247, 61, 11, 5, 247, 59, 11, 5, + 247, 60, 11, 5, 209, 241, 11, 5, 209, 237, 11, 5, 210, 51, 11, 5, 209, + 253, 11, 5, 210, 16, 11, 5, 210, 43, 11, 5, 210, 39, 11, 5, 210, 206, 11, + 5, 210, 191, 11, 5, 166, 11, 5, 210, 253, 11, 5, 209, 31, 11, 5, 209, 33, + 11, 5, 209, 32, 11, 5, 209, 149, 11, 5, 209, 136, 11, 5, 209, 198, 11, 5, + 209, 168, 11, 5, 209, 17, 11, 5, 209, 13, 11, 5, 209, 51, 11, 5, 209, 30, + 11, 5, 209, 22, 11, 5, 209, 28, 11, 5, 208, 251, 11, 5, 208, 250, 11, 5, + 208, 255, 11, 5, 208, 254, 11, 5, 208, 252, 11, 5, 208, 253, 11, 5, 248, + 144, 11, 5, 248, 143, 11, 5, 248, 150, 11, 5, 248, 145, 11, 5, 248, 147, + 11, 5, 248, 146, 11, 5, 248, 149, 11, 5, 248, 148, 11, 5, 248, 156, 11, + 5, 248, 155, 11, 5, 248, 159, 11, 5, 248, 157, 11, 5, 248, 135, 11, 5, + 248, 137, 11, 5, 248, 136, 11, 5, 248, 140, 11, 5, 248, 139, 11, 5, 248, + 142, 11, 5, 248, 141, 11, 5, 248, 151, 11, 5, 248, 154, 11, 5, 248, 152, + 11, 5, 248, 131, 11, 5, 248, 130, 11, 5, 248, 138, 11, 5, 248, 134, 11, + 5, 248, 132, 11, 5, 248, 133, 11, 5, 248, 127, 11, 5, 248, 126, 11, 5, + 248, 129, 11, 5, 248, 128, 11, 5, 215, 22, 11, 5, 215, 21, 11, 5, 215, + 27, 11, 5, 215, 23, 11, 5, 215, 24, 11, 5, 215, 26, 11, 5, 215, 25, 11, + 5, 215, 30, 11, 5, 215, 29, 11, 5, 215, 32, 11, 5, 215, 31, 11, 5, 215, + 18, 11, 5, 215, 17, 11, 5, 215, 20, 11, 5, 215, 19, 11, 5, 215, 11, 11, + 5, 215, 10, 11, 5, 215, 15, 11, 5, 215, 14, 11, 5, 215, 12, 11, 5, 215, + 13, 11, 5, 215, 5, 11, 5, 215, 4, 11, 5, 215, 9, 11, 5, 215, 8, 11, 5, + 215, 6, 11, 5, 215, 7, 11, 5, 229, 87, 11, 5, 229, 86, 11, 5, 229, 92, + 11, 5, 229, 88, 11, 5, 229, 89, 11, 5, 229, 91, 11, 5, 229, 90, 11, 5, + 229, 95, 11, 5, 229, 94, 11, 5, 229, 97, 11, 5, 229, 96, 11, 5, 229, 78, + 11, 5, 229, 80, 11, 5, 229, 79, 11, 5, 229, 83, 11, 5, 229, 82, 11, 5, + 229, 85, 11, 5, 229, 84, 11, 5, 229, 74, 11, 5, 229, 73, 11, 5, 229, 81, + 11, 5, 229, 77, 11, 5, 229, 75, 11, 5, 229, 76, 11, 5, 229, 68, 11, 5, + 229, 72, 11, 5, 229, 71, 11, 5, 229, 69, 11, 5, 229, 70, 11, 5, 216, 102, + 11, 5, 216, 101, 11, 5, 216, 175, 11, 5, 216, 109, 11, 5, 216, 139, 11, + 5, 216, 157, 11, 5, 216, 155, 11, 5, 217, 101, 11, 5, 217, 95, 11, 5, + 172, 11, 5, 217, 141, 11, 5, 215, 203, 11, 5, 215, 202, 11, 5, 215, 206, + 11, 5, 215, 204, 11, 5, 216, 20, 11, 5, 215, 249, 11, 5, 216, 91, 11, 5, + 216, 27, 11, 5, 216, 227, 11, 5, 217, 48, 11, 5, 215, 183, 11, 5, 215, + 177, 11, 5, 215, 241, 11, 5, 215, 199, 11, 5, 215, 192, 11, 5, 215, 197, + 11, 5, 215, 154, 11, 5, 215, 153, 11, 5, 215, 159, 11, 5, 215, 156, 11, + 5, 232, 217, 11, 5, 232, 211, 11, 5, 233, 11, 11, 5, 232, 233, 11, 5, + 233, 60, 11, 5, 233, 51, 11, 5, 233, 97, 11, 5, 233, 65, 11, 5, 232, 110, + 11, 5, 232, 164, 11, 5, 232, 144, 11, 5, 232, 60, 11, 5, 232, 59, 11, 5, + 232, 77, 11, 5, 232, 65, 11, 5, 232, 63, 11, 5, 232, 64, 11, 5, 232, 47, + 11, 5, 232, 46, 11, 5, 232, 50, 11, 5, 232, 48, 11, 5, 196, 3, 11, 5, + 195, 254, 11, 5, 196, 39, 11, 5, 196, 12, 11, 5, 196, 28, 11, 5, 196, 24, + 11, 5, 196, 31, 11, 5, 196, 30, 11, 5, 196, 131, 11, 5, 196, 126, 11, 5, + 196, 157, 11, 5, 196, 144, 11, 5, 195, 232, 11, 5, 195, 228, 11, 5, 195, + 252, 11, 5, 195, 234, 11, 5, 196, 43, 11, 5, 196, 111, 11, 5, 194, 216, + 11, 5, 194, 214, 11, 5, 194, 223, 11, 5, 194, 219, 11, 5, 194, 217, 11, + 5, 194, 218, 11, 5, 194, 206, 11, 5, 194, 205, 11, 5, 194, 210, 11, 5, + 194, 209, 11, 5, 194, 207, 11, 5, 194, 208, 11, 5, 236, 184, 11, 5, 236, + 169, 11, 5, 237, 16, 11, 5, 236, 212, 11, 5, 236, 247, 11, 5, 236, 252, + 11, 5, 236, 251, 11, 5, 237, 181, 11, 5, 237, 175, 11, 5, 238, 0, 11, 5, + 237, 201, 11, 5, 235, 43, 11, 5, 235, 44, 11, 5, 236, 114, 11, 5, 235, + 90, 11, 5, 236, 146, 11, 5, 236, 117, 11, 5, 237, 46, 11, 5, 237, 116, + 11, 5, 237, 67, 11, 5, 235, 34, 11, 5, 235, 32, 11, 5, 235, 62, 11, 5, + 235, 42, 11, 5, 235, 37, 11, 5, 235, 40, 11, 5, 199, 63, 11, 5, 199, 55, + 11, 5, 199, 128, 11, 5, 199, 73, 11, 5, 199, 111, 11, 5, 199, 113, 11, 5, + 199, 112, 11, 5, 200, 105, 11, 5, 200, 90, 11, 5, 189, 11, 5, 200, 116, + 11, 5, 198, 20, 11, 5, 198, 19, 11, 5, 198, 22, 11, 5, 198, 21, 11, 5, + 198, 235, 11, 5, 198, 225, 11, 5, 155, 11, 5, 198, 248, 11, 5, 199, 246, + 11, 5, 200, 79, 11, 5, 200, 17, 11, 5, 198, 3, 11, 5, 197, 254, 11, 5, + 198, 45, 11, 5, 198, 18, 11, 5, 198, 4, 11, 5, 198, 15, 11, 5, 237, 133, + 11, 5, 237, 132, 11, 5, 237, 138, 11, 5, 237, 134, 11, 5, 237, 135, 11, + 5, 237, 137, 11, 5, 237, 136, 11, 5, 237, 154, 11, 5, 237, 153, 11, 5, + 237, 161, 11, 5, 237, 155, 11, 5, 237, 123, 11, 5, 237, 125, 11, 5, 237, + 124, 11, 5, 237, 128, 11, 5, 237, 127, 11, 5, 237, 131, 11, 5, 237, 129, + 11, 5, 237, 146, 11, 5, 237, 149, 11, 5, 237, 147, 11, 5, 237, 119, 11, + 5, 237, 118, 11, 5, 237, 126, 11, 5, 237, 122, 11, 5, 237, 120, 11, 5, + 237, 121, 11, 5, 214, 233, 11, 5, 214, 232, 11, 5, 214, 240, 11, 5, 214, + 235, 11, 5, 214, 236, 11, 5, 214, 237, 11, 5, 214, 249, 11, 5, 214, 248, + 11, 5, 214, 255, 11, 5, 214, 250, 11, 5, 214, 225, 11, 5, 214, 224, 11, + 5, 214, 231, 11, 5, 214, 226, 11, 5, 214, 241, 11, 5, 214, 247, 11, 5, + 214, 245, 11, 5, 214, 217, 11, 5, 214, 216, 11, 5, 214, 222, 11, 5, 214, + 220, 11, 5, 214, 218, 11, 5, 214, 219, 11, 5, 229, 53, 11, 5, 229, 52, + 11, 5, 229, 59, 11, 5, 229, 54, 11, 5, 229, 56, 11, 5, 229, 55, 11, 5, + 229, 58, 11, 5, 229, 57, 11, 5, 229, 65, 11, 5, 229, 63, 11, 5, 229, 67, + 11, 5, 229, 66, 11, 5, 229, 46, 11, 5, 229, 47, 11, 5, 229, 50, 11, 5, + 229, 49, 11, 5, 229, 51, 11, 5, 229, 60, 11, 5, 229, 62, 11, 5, 229, 61, + 11, 5, 229, 45, 11, 5, 214, 4, 11, 5, 214, 2, 11, 5, 214, 60, 11, 5, 214, + 7, 11, 5, 214, 34, 11, 5, 214, 48, 11, 5, 214, 47, 11, 5, 215, 37, 11, 5, + 181, 11, 5, 215, 53, 11, 5, 212, 222, 11, 5, 212, 224, 11, 5, 212, 223, + 11, 5, 213, 110, 11, 5, 213, 94, 11, 5, 213, 142, 11, 5, 213, 121, 11, 5, + 214, 171, 11, 5, 214, 214, 11, 5, 214, 191, 11, 5, 212, 217, 11, 5, 212, + 213, 11, 5, 213, 22, 11, 5, 212, 221, 11, 5, 212, 219, 11, 5, 212, 220, + 11, 5, 229, 118, 11, 5, 229, 117, 11, 5, 229, 123, 11, 5, 229, 119, 11, + 5, 229, 120, 11, 5, 229, 122, 11, 5, 229, 121, 11, 5, 229, 129, 11, 5, + 229, 127, 11, 5, 229, 131, 11, 5, 229, 130, 11, 5, 229, 110, 11, 5, 229, + 112, 11, 5, 229, 111, 11, 5, 229, 114, 11, 5, 229, 116, 11, 5, 229, 115, + 11, 5, 229, 124, 11, 5, 229, 126, 11, 5, 229, 125, 11, 5, 229, 106, 11, + 5, 229, 105, 11, 5, 229, 113, 11, 5, 229, 109, 11, 5, 229, 107, 11, 5, + 229, 108, 11, 5, 229, 100, 11, 5, 229, 99, 11, 5, 229, 104, 11, 5, 229, + 103, 11, 5, 229, 101, 11, 5, 229, 102, 11, 5, 219, 151, 11, 5, 219, 143, + 11, 5, 219, 209, 11, 5, 219, 161, 11, 5, 219, 200, 11, 5, 219, 199, 11, + 5, 219, 203, 11, 5, 219, 201, 11, 5, 220, 65, 11, 5, 220, 53, 11, 5, 177, + 11, 5, 220, 76, 11, 5, 219, 13, 11, 5, 219, 12, 11, 5, 219, 15, 11, 5, + 219, 14, 11, 5, 219, 60, 11, 5, 219, 45, 11, 5, 219, 107, 11, 5, 219, 66, + 11, 5, 219, 226, 11, 5, 220, 42, 11, 5, 219, 244, 11, 5, 219, 7, 11, 5, + 219, 5, 11, 5, 219, 36, 11, 5, 219, 11, 11, 5, 219, 9, 11, 5, 219, 10, + 11, 5, 218, 241, 11, 5, 218, 240, 11, 5, 218, 251, 11, 5, 218, 244, 11, + 5, 218, 242, 11, 5, 218, 243, 11, 5, 231, 17, 11, 5, 231, 16, 11, 5, 231, + 46, 11, 5, 231, 29, 11, 5, 231, 38, 11, 5, 231, 37, 11, 5, 231, 40, 11, + 5, 231, 39, 11, 5, 231, 185, 11, 5, 231, 180, 11, 5, 231, 233, 11, 5, + 231, 196, 11, 5, 230, 159, 11, 5, 230, 158, 11, 5, 230, 161, 11, 5, 230, + 160, 11, 5, 230, 231, 11, 5, 230, 229, 11, 5, 230, 254, 11, 5, 230, 240, + 11, 5, 231, 124, 11, 5, 231, 122, 11, 5, 231, 158, 11, 5, 231, 135, 11, + 5, 230, 148, 11, 5, 230, 147, 11, 5, 230, 186, 11, 5, 230, 157, 11, 5, + 230, 149, 11, 5, 230, 156, 11, 5, 221, 158, 11, 5, 221, 153, 11, 5, 221, + 204, 11, 5, 221, 172, 11, 5, 221, 185, 11, 5, 221, 189, 11, 5, 221, 187, + 11, 5, 222, 83, 11, 5, 222, 65, 11, 5, 160, 11, 5, 222, 112, 11, 5, 221, + 4, 11, 5, 221, 9, 11, 5, 221, 6, 11, 5, 221, 76, 11, 5, 221, 71, 11, 5, + 221, 113, 11, 5, 221, 83, 11, 5, 222, 20, 11, 5, 222, 3, 11, 5, 222, 57, + 11, 5, 222, 24, 11, 5, 220, 247, 11, 5, 220, 243, 11, 5, 221, 33, 11, 5, + 221, 3, 11, 5, 220, 251, 11, 5, 221, 0, 11, 5, 231, 106, 11, 5, 231, 105, + 11, 5, 231, 110, 11, 5, 231, 107, 11, 5, 231, 109, 11, 5, 231, 108, 11, + 5, 231, 117, 11, 5, 231, 116, 11, 5, 231, 120, 11, 5, 231, 118, 11, 5, + 231, 97, 11, 5, 231, 96, 11, 5, 231, 99, 11, 5, 231, 98, 11, 5, 231, 102, + 11, 5, 231, 101, 11, 5, 231, 104, 11, 5, 231, 103, 11, 5, 231, 112, 11, + 5, 231, 111, 11, 5, 231, 115, 11, 5, 231, 113, 11, 5, 231, 92, 11, 5, + 231, 91, 11, 5, 231, 100, 11, 5, 231, 95, 11, 5, 231, 93, 11, 5, 231, 94, + 11, 5, 216, 194, 11, 5, 216, 195, 11, 5, 216, 213, 11, 5, 216, 212, 11, + 5, 216, 215, 11, 5, 216, 214, 11, 5, 216, 185, 11, 5, 216, 187, 11, 5, + 216, 186, 11, 5, 216, 190, 11, 5, 216, 189, 11, 5, 216, 192, 11, 5, 216, + 191, 11, 5, 216, 196, 11, 5, 216, 198, 11, 5, 216, 197, 11, 5, 216, 181, + 11, 5, 216, 180, 11, 5, 216, 188, 11, 5, 216, 184, 11, 5, 216, 182, 11, + 5, 216, 183, 11, 5, 228, 126, 11, 5, 228, 125, 11, 5, 228, 132, 11, 5, + 228, 127, 11, 5, 228, 129, 11, 5, 228, 128, 11, 5, 228, 131, 11, 5, 228, + 130, 11, 5, 228, 137, 11, 5, 228, 136, 11, 5, 228, 139, 11, 5, 228, 138, + 11, 5, 228, 118, 11, 5, 228, 117, 11, 5, 228, 120, 11, 5, 228, 119, 11, + 5, 228, 122, 11, 5, 228, 121, 11, 5, 228, 124, 11, 5, 228, 123, 11, 5, + 228, 133, 11, 5, 228, 135, 11, 5, 228, 134, 11, 5, 214, 110, 11, 5, 214, + 112, 11, 5, 214, 111, 11, 5, 214, 155, 11, 5, 214, 153, 11, 5, 214, 165, + 11, 5, 214, 158, 11, 5, 214, 71, 11, 5, 214, 70, 11, 5, 214, 72, 11, 5, + 214, 82, 11, 5, 214, 79, 11, 5, 214, 90, 11, 5, 214, 84, 11, 5, 214, 146, + 11, 5, 214, 152, 11, 5, 214, 148, 11, 5, 229, 137, 11, 5, 229, 156, 11, + 5, 229, 165, 11, 5, 230, 18, 11, 5, 230, 7, 11, 5, 144, 11, 5, 230, 30, + 11, 5, 228, 156, 11, 5, 228, 155, 11, 5, 228, 158, 11, 5, 228, 157, 11, + 5, 228, 201, 11, 5, 228, 192, 11, 5, 229, 43, 11, 5, 229, 8, 11, 5, 229, + 193, 11, 5, 229, 255, 11, 5, 229, 205, 11, 5, 194, 132, 11, 5, 194, 117, + 11, 5, 194, 169, 11, 5, 194, 143, 11, 5, 193, 233, 11, 5, 193, 235, 11, + 5, 193, 234, 11, 5, 194, 1, 11, 5, 194, 36, 11, 5, 194, 12, 11, 5, 194, + 85, 11, 5, 194, 111, 11, 5, 194, 92, 11, 5, 192, 15, 11, 5, 192, 14, 11, + 5, 192, 30, 11, 5, 192, 18, 11, 5, 192, 23, 11, 5, 192, 25, 11, 5, 192, + 24, 11, 5, 192, 94, 11, 5, 192, 91, 11, 5, 192, 112, 11, 5, 192, 98, 11, + 5, 191, 245, 11, 5, 191, 247, 11, 5, 191, 246, 11, 5, 192, 3, 11, 5, 192, + 2, 11, 5, 192, 8, 11, 5, 192, 4, 11, 5, 192, 73, 11, 5, 192, 85, 11, 5, + 192, 78, 11, 5, 191, 241, 11, 5, 191, 240, 11, 5, 191, 252, 11, 5, 191, + 244, 11, 5, 191, 242, 11, 5, 191, 243, 11, 5, 191, 227, 11, 5, 191, 226, + 11, 5, 191, 232, 11, 5, 191, 230, 11, 5, 191, 228, 11, 5, 191, 229, 11, + 5, 242, 119, 11, 5, 242, 112, 11, 5, 242, 149, 11, 5, 242, 132, 11, 5, + 242, 146, 11, 5, 242, 140, 11, 5, 242, 148, 11, 5, 242, 147, 11, 5, 246, + 193, 11, 5, 246, 185, 11, 5, 247, 19, 11, 5, 246, 226, 11, 5, 238, 150, + 11, 5, 238, 152, 11, 5, 238, 151, 11, 5, 238, 215, 11, 5, 238, 203, 11, + 5, 242, 63, 11, 5, 238, 234, 11, 5, 246, 121, 11, 5, 246, 158, 11, 5, + 246, 127, 11, 5, 238, 121, 11, 5, 238, 119, 11, 5, 238, 162, 11, 5, 238, + 148, 11, 5, 238, 127, 11, 5, 238, 143, 11, 5, 238, 98, 11, 5, 238, 97, + 11, 5, 238, 110, 11, 5, 238, 104, 11, 5, 238, 99, 11, 5, 238, 101, 11, 5, + 191, 210, 11, 5, 191, 209, 11, 5, 191, 216, 11, 5, 191, 211, 11, 5, 191, + 213, 11, 5, 191, 212, 11, 5, 191, 215, 11, 5, 191, 214, 11, 5, 191, 222, + 11, 5, 191, 221, 11, 5, 191, 225, 11, 5, 191, 223, 11, 5, 191, 206, 11, + 5, 191, 208, 11, 5, 191, 207, 11, 5, 191, 217, 11, 5, 191, 220, 11, 5, + 191, 218, 11, 5, 191, 199, 11, 5, 191, 203, 11, 5, 191, 202, 11, 5, 191, + 200, 11, 5, 191, 201, 11, 5, 191, 193, 11, 5, 191, 192, 11, 5, 191, 198, + 11, 5, 191, 196, 11, 5, 191, 194, 11, 5, 191, 195, 11, 5, 212, 133, 11, + 5, 212, 132, 11, 5, 212, 138, 11, 5, 212, 134, 11, 5, 212, 135, 11, 5, + 212, 137, 11, 5, 212, 136, 11, 5, 212, 143, 11, 5, 212, 142, 11, 5, 212, + 146, 11, 5, 212, 145, 11, 5, 212, 126, 11, 5, 212, 127, 11, 5, 212, 130, + 11, 5, 212, 131, 11, 5, 212, 139, 11, 5, 212, 141, 11, 5, 212, 121, 11, + 5, 212, 129, 11, 5, 212, 125, 11, 5, 212, 122, 11, 5, 212, 123, 11, 5, + 212, 116, 11, 5, 212, 115, 11, 5, 212, 120, 11, 5, 212, 119, 11, 5, 212, + 117, 11, 5, 212, 118, 11, 5, 203, 43, 11, 5, 170, 11, 5, 203, 125, 11, 5, + 203, 46, 11, 5, 203, 105, 11, 5, 203, 108, 11, 5, 203, 106, 11, 5, 206, + 20, 11, 5, 206, 4, 11, 5, 188, 11, 5, 206, 28, 11, 5, 201, 113, 11, 5, + 201, 115, 11, 5, 201, 114, 11, 5, 202, 177, 11, 5, 202, 166, 11, 5, 202, + 212, 11, 5, 202, 181, 11, 5, 204, 137, 11, 5, 205, 223, 11, 5, 204, 168, + 11, 5, 201, 88, 11, 5, 201, 85, 11, 5, 201, 184, 11, 5, 201, 112, 11, 5, + 201, 92, 11, 5, 201, 100, 11, 5, 200, 242, 11, 5, 200, 241, 11, 5, 201, + 56, 11, 5, 200, 250, 11, 5, 200, 244, 11, 5, 200, 249, 11, 5, 202, 53, + 11, 5, 202, 52, 11, 5, 202, 59, 11, 5, 202, 54, 11, 5, 202, 56, 11, 5, + 202, 58, 11, 5, 202, 57, 11, 5, 202, 68, 11, 5, 202, 66, 11, 5, 202, 92, + 11, 5, 202, 69, 11, 5, 202, 48, 11, 5, 202, 47, 11, 5, 202, 51, 11, 5, + 202, 49, 11, 5, 202, 62, 11, 5, 202, 65, 11, 5, 202, 63, 11, 5, 202, 44, + 11, 5, 202, 42, 11, 5, 202, 46, 11, 5, 202, 45, 11, 5, 202, 37, 11, 5, + 202, 36, 11, 5, 202, 41, 11, 5, 202, 40, 11, 5, 202, 38, 11, 5, 202, 39, + 11, 5, 192, 66, 11, 5, 192, 65, 11, 5, 192, 71, 11, 5, 192, 68, 11, 5, + 192, 45, 11, 5, 192, 47, 11, 5, 192, 46, 11, 5, 192, 50, 11, 5, 192, 49, + 11, 5, 192, 54, 11, 5, 192, 51, 11, 5, 192, 59, 11, 5, 192, 58, 11, 5, + 192, 62, 11, 5, 192, 60, 11, 5, 192, 41, 11, 5, 192, 40, 11, 5, 192, 48, + 11, 5, 192, 44, 11, 5, 192, 42, 11, 5, 192, 43, 11, 5, 192, 33, 11, 5, + 192, 32, 11, 5, 192, 37, 11, 5, 192, 36, 11, 5, 192, 34, 11, 5, 192, 35, + 11, 5, 242, 251, 11, 5, 242, 247, 11, 5, 246, 117, 11, 5, 246, 103, 11, + 5, 242, 164, 11, 5, 242, 163, 11, 5, 242, 166, 11, 5, 242, 165, 11, 5, + 242, 179, 11, 5, 242, 178, 11, 5, 242, 188, 11, 5, 242, 183, 11, 5, 242, + 222, 11, 5, 242, 219, 11, 5, 242, 245, 11, 5, 242, 230, 11, 5, 242, 158, + 11, 5, 242, 168, 11, 5, 242, 162, 11, 5, 242, 159, 11, 5, 242, 161, 11, + 5, 242, 151, 11, 5, 242, 150, 11, 5, 242, 155, 11, 5, 242, 154, 11, 5, + 242, 152, 11, 5, 242, 153, 11, 5, 206, 255, 11, 5, 207, 3, 11, 5, 206, + 237, 11, 5, 206, 238, 11, 5, 206, 242, 11, 5, 206, 241, 11, 5, 206, 245, + 11, 5, 206, 243, 11, 5, 206, 249, 11, 5, 206, 248, 11, 5, 206, 254, 11, + 5, 206, 250, 11, 5, 206, 233, 11, 5, 206, 231, 11, 5, 206, 239, 11, 5, + 206, 236, 11, 5, 206, 234, 11, 5, 206, 235, 11, 5, 206, 226, 11, 5, 206, + 225, 11, 5, 206, 230, 11, 5, 206, 229, 11, 5, 206, 227, 11, 5, 206, 228, + 11, 5, 213, 86, 11, 5, 213, 85, 11, 5, 213, 88, 11, 5, 213, 87, 11, 5, + 213, 77, 11, 5, 213, 79, 11, 5, 213, 78, 11, 5, 213, 81, 11, 5, 213, 80, + 11, 5, 213, 84, 11, 5, 213, 83, 11, 5, 213, 71, 11, 5, 213, 70, 11, 5, + 213, 76, 11, 5, 213, 74, 11, 5, 213, 72, 11, 5, 213, 73, 11, 5, 213, 65, + 11, 5, 213, 64, 11, 5, 213, 69, 11, 5, 213, 68, 11, 5, 213, 66, 11, 5, + 213, 67, 11, 5, 204, 22, 11, 5, 204, 17, 11, 5, 204, 64, 11, 5, 204, 35, + 11, 5, 203, 152, 11, 5, 203, 154, 11, 5, 203, 153, 11, 5, 203, 179, 11, + 5, 203, 174, 11, 5, 203, 211, 11, 5, 203, 199, 11, 5, 203, 246, 11, 5, + 203, 239, 11, 5, 204, 12, 11, 5, 203, 255, 11, 5, 203, 148, 11, 5, 203, + 145, 11, 5, 203, 164, 11, 5, 203, 151, 11, 5, 203, 149, 11, 5, 203, 150, + 11, 5, 203, 128, 11, 5, 203, 127, 11, 5, 203, 134, 11, 5, 203, 131, 11, + 5, 203, 129, 11, 5, 203, 130, 11, 5, 208, 22, 11, 5, 208, 16, 11, 5, 167, + 11, 5, 208, 28, 11, 5, 206, 188, 11, 5, 206, 190, 11, 5, 206, 189, 11, 5, + 207, 17, 11, 5, 207, 5, 11, 5, 207, 55, 11, 5, 207, 21, 11, 5, 207, 161, + 11, 5, 208, 7, 11, 5, 207, 203, 11, 5, 206, 180, 11, 5, 206, 177, 11, 5, + 206, 218, 11, 5, 206, 187, 11, 5, 206, 183, 11, 5, 206, 184, 11, 5, 206, + 162, 11, 5, 206, 161, 11, 5, 206, 167, 11, 5, 206, 165, 11, 5, 206, 163, + 11, 5, 206, 164, 11, 5, 223, 8, 11, 5, 223, 7, 11, 5, 223, 20, 11, 5, + 223, 9, 11, 5, 223, 16, 11, 5, 223, 15, 11, 5, 223, 18, 11, 5, 223, 17, + 11, 5, 222, 202, 11, 5, 222, 201, 11, 5, 222, 204, 11, 5, 222, 203, 11, + 5, 222, 220, 11, 5, 222, 218, 11, 5, 222, 233, 11, 5, 222, 222, 11, 5, + 222, 195, 11, 5, 222, 193, 11, 5, 222, 214, 11, 5, 222, 200, 11, 5, 222, + 197, 11, 5, 222, 198, 11, 5, 222, 187, 11, 5, 222, 186, 11, 5, 222, 191, + 11, 5, 222, 190, 11, 5, 222, 188, 11, 5, 222, 189, 11, 5, 208, 193, 11, + 5, 208, 191, 11, 5, 208, 201, 11, 5, 208, 194, 11, 5, 208, 198, 11, 5, + 208, 197, 11, 5, 208, 200, 11, 5, 208, 199, 11, 5, 208, 143, 11, 5, 208, + 140, 11, 5, 208, 145, 11, 5, 208, 144, 11, 5, 208, 180, 11, 5, 208, 179, + 11, 5, 208, 189, 11, 5, 208, 183, 11, 5, 208, 135, 11, 5, 208, 131, 11, + 5, 208, 177, 11, 5, 208, 139, 11, 5, 208, 137, 11, 5, 208, 138, 11, 5, + 208, 115, 11, 5, 208, 113, 11, 5, 208, 125, 11, 5, 208, 118, 11, 5, 208, + 116, 11, 5, 208, 117, 11, 5, 222, 253, 11, 5, 222, 252, 11, 5, 223, 3, + 11, 5, 222, 254, 11, 5, 223, 0, 11, 5, 222, 255, 11, 5, 223, 2, 11, 5, + 223, 1, 11, 5, 222, 244, 11, 5, 222, 246, 11, 5, 222, 245, 11, 5, 222, + 249, 11, 5, 222, 248, 11, 5, 222, 251, 11, 5, 222, 250, 11, 5, 222, 240, + 11, 5, 222, 239, 11, 5, 222, 247, 11, 5, 222, 243, 11, 5, 222, 241, 11, + 5, 222, 242, 11, 5, 222, 236, 11, 5, 222, 235, 11, 5, 222, 238, 11, 5, + 222, 237, 11, 5, 213, 233, 11, 5, 213, 232, 11, 5, 213, 240, 11, 5, 213, + 234, 11, 5, 213, 236, 11, 5, 213, 235, 11, 5, 213, 239, 11, 5, 213, 237, + 11, 5, 213, 222, 11, 5, 213, 223, 11, 5, 213, 228, 11, 5, 213, 227, 11, + 5, 213, 231, 11, 5, 213, 229, 11, 5, 213, 217, 11, 5, 213, 226, 11, 5, + 213, 221, 11, 5, 213, 218, 11, 5, 213, 219, 11, 5, 213, 212, 11, 5, 213, + 211, 11, 5, 213, 216, 11, 5, 213, 215, 11, 5, 213, 213, 11, 5, 213, 214, + 11, 5, 212, 168, 11, 5, 212, 167, 11, 5, 212, 181, 11, 5, 212, 172, 11, + 5, 212, 177, 11, 5, 212, 176, 11, 5, 212, 179, 11, 5, 212, 178, 11, 5, + 212, 153, 11, 5, 212, 155, 11, 5, 212, 154, 11, 5, 212, 160, 11, 5, 212, + 159, 11, 5, 212, 165, 11, 5, 212, 161, 11, 5, 212, 151, 11, 5, 212, 149, + 11, 5, 212, 158, 11, 5, 212, 152, 11, 5, 193, 187, 11, 5, 193, 186, 11, + 5, 193, 196, 11, 5, 193, 189, 11, 5, 193, 191, 11, 5, 193, 190, 11, 5, + 193, 193, 11, 5, 193, 192, 11, 5, 193, 175, 11, 5, 193, 176, 11, 5, 193, + 180, 11, 5, 193, 179, 11, 5, 193, 185, 11, 5, 193, 183, 11, 5, 193, 152, + 11, 5, 193, 150, 11, 5, 193, 165, 11, 5, 193, 155, 11, 5, 193, 153, 11, + 5, 193, 154, 11, 5, 193, 7, 11, 5, 193, 5, 11, 5, 193, 22, 11, 5, 193, 8, + 11, 5, 193, 16, 11, 5, 193, 15, 11, 5, 193, 19, 11, 5, 193, 17, 11, 5, + 192, 187, 11, 5, 192, 186, 11, 5, 192, 190, 11, 5, 192, 188, 11, 5, 192, + 229, 11, 5, 192, 224, 11, 5, 193, 1, 11, 5, 192, 234, 11, 5, 192, 178, + 11, 5, 192, 174, 11, 5, 192, 214, 11, 5, 192, 185, 11, 5, 192, 181, 11, + 5, 192, 182, 11, 5, 192, 158, 11, 5, 192, 157, 11, 5, 192, 165, 11, 5, + 192, 161, 11, 5, 192, 159, 11, 5, 192, 160, 11, 48, 208, 180, 11, 48, + 219, 209, 11, 48, 221, 158, 11, 48, 212, 172, 11, 48, 238, 104, 11, 48, + 202, 59, 11, 48, 231, 103, 11, 48, 231, 135, 11, 48, 216, 175, 11, 48, + 228, 126, 11, 48, 218, 243, 11, 48, 248, 131, 11, 48, 216, 27, 11, 48, + 193, 1, 11, 48, 209, 17, 11, 48, 228, 120, 11, 48, 200, 105, 11, 48, 231, + 233, 11, 48, 191, 244, 11, 48, 238, 98, 11, 48, 237, 121, 11, 48, 247, + 89, 11, 48, 231, 99, 11, 48, 212, 161, 11, 48, 198, 45, 11, 48, 211, 185, + 11, 48, 222, 240, 11, 48, 192, 3, 11, 48, 208, 251, 11, 48, 229, 85, 11, + 48, 193, 7, 11, 48, 194, 218, 11, 48, 203, 134, 11, 48, 196, 111, 11, 48, + 192, 112, 11, 48, 222, 233, 11, 48, 212, 125, 11, 48, 222, 238, 11, 48, + 230, 231, 11, 48, 223, 2, 11, 48, 194, 36, 11, 48, 235, 62, 11, 48, 203, + 150, 11, 48, 219, 203, 11, 48, 238, 110, 11, 48, 238, 151, 11, 48, 242, + 132, 11, 48, 228, 123, 11, 48, 204, 22, 11, 48, 191, 243, 11, 48, 203, + 199, 11, 48, 242, 245, 11, 48, 191, 213, 11, 48, 215, 26, 11, 48, 222, + 57, 219, 152, 1, 249, 3, 219, 152, 1, 166, 219, 152, 1, 210, 94, 219, + 152, 1, 238, 0, 219, 152, 1, 189, 219, 152, 1, 199, 240, 219, 152, 1, + 231, 233, 219, 152, 1, 160, 219, 152, 1, 221, 250, 219, 152, 1, 223, 62, + 219, 152, 1, 247, 19, 219, 152, 1, 246, 117, 219, 152, 1, 235, 17, 219, + 152, 1, 198, 118, 219, 152, 1, 198, 108, 219, 152, 1, 172, 219, 152, 1, + 181, 219, 152, 1, 177, 219, 152, 1, 188, 219, 152, 1, 192, 71, 219, 152, + 1, 192, 112, 219, 152, 1, 214, 165, 219, 152, 1, 144, 219, 152, 1, 193, + 209, 219, 152, 1, 229, 187, 219, 152, 1, 233, 97, 219, 152, 1, 194, 169, + 219, 152, 1, 204, 64, 219, 152, 1, 168, 219, 152, 1, 231, 84, 219, 152, + 1, 64, 219, 152, 1, 251, 108, 219, 152, 1, 71, 219, 152, 1, 233, 230, + 219, 152, 1, 70, 219, 152, 1, 74, 219, 152, 1, 68, 219, 152, 1, 197, 104, + 219, 152, 1, 197, 97, 219, 152, 1, 212, 0, 219, 152, 1, 158, 215, 158, + 199, 128, 219, 152, 1, 158, 215, 97, 209, 198, 219, 152, 1, 158, 215, + 158, 238, 109, 219, 152, 1, 158, 215, 158, 247, 220, 219, 152, 1, 158, + 215, 158, 181, 219, 152, 1, 158, 215, 158, 223, 29, 219, 152, 209, 38, + 242, 38, 219, 152, 209, 38, 232, 71, 201, 238, 56, 5, 234, 171, 56, 5, + 234, 167, 56, 5, 229, 225, 56, 5, 194, 100, 56, 5, 194, 99, 56, 5, 210, + 168, 56, 5, 248, 48, 56, 5, 248, 108, 56, 5, 217, 74, 56, 5, 221, 64, 56, + 5, 216, 207, 56, 5, 231, 171, 56, 5, 233, 40, 56, 5, 196, 118, 56, 5, + 200, 56, 56, 5, 199, 222, 56, 5, 237, 30, 56, 5, 237, 27, 56, 5, 220, 32, + 56, 5, 207, 234, 56, 5, 237, 101, 56, 5, 214, 246, 56, 5, 205, 205, 56, + 5, 204, 10, 56, 5, 192, 82, 56, 5, 192, 61, 56, 5, 246, 150, 56, 5, 223, + 39, 56, 5, 213, 247, 56, 5, 193, 66, 56, 5, 222, 48, 56, 5, 214, 138, 56, + 5, 231, 150, 56, 5, 217, 29, 56, 5, 214, 203, 56, 5, 212, 189, 56, 5, 70, + 56, 5, 223, 190, 56, 5, 229, 178, 56, 5, 229, 148, 56, 5, 194, 72, 56, 5, + 194, 54, 56, 5, 210, 51, 56, 5, 248, 46, 56, 5, 248, 41, 56, 5, 217, 67, + 56, 5, 221, 61, 56, 5, 216, 204, 56, 5, 231, 167, 56, 5, 233, 11, 56, 5, + 196, 39, 56, 5, 199, 128, 56, 5, 199, 202, 56, 5, 237, 22, 56, 5, 237, + 26, 56, 5, 219, 209, 56, 5, 207, 151, 56, 5, 237, 16, 56, 5, 214, 240, + 56, 5, 203, 125, 56, 5, 203, 236, 56, 5, 192, 30, 56, 5, 192, 57, 56, 5, + 242, 149, 56, 5, 223, 20, 56, 5, 213, 240, 56, 5, 193, 22, 56, 5, 221, + 204, 56, 5, 214, 130, 56, 5, 231, 46, 56, 5, 216, 175, 56, 5, 214, 60, + 56, 5, 212, 181, 56, 5, 64, 56, 5, 250, 224, 56, 5, 214, 160, 56, 5, 144, + 56, 5, 230, 65, 56, 5, 194, 169, 56, 5, 194, 149, 56, 5, 166, 56, 5, 248, + 54, 56, 5, 249, 3, 56, 5, 217, 82, 56, 5, 221, 69, 56, 5, 221, 67, 56, 5, + 216, 211, 56, 5, 231, 175, 56, 5, 233, 97, 56, 5, 196, 157, 56, 5, 189, + 56, 5, 199, 240, 56, 5, 237, 40, 56, 5, 237, 29, 56, 5, 177, 56, 5, 167, + 56, 5, 238, 0, 56, 5, 214, 255, 56, 5, 188, 56, 5, 204, 64, 56, 5, 192, + 112, 56, 5, 192, 71, 56, 5, 247, 19, 56, 5, 223, 62, 56, 5, 214, 0, 56, + 5, 168, 56, 5, 160, 56, 5, 222, 121, 56, 5, 214, 144, 56, 5, 231, 233, + 56, 5, 172, 56, 5, 181, 56, 5, 212, 201, 56, 5, 211, 194, 56, 5, 211, + 189, 56, 5, 229, 16, 56, 5, 194, 17, 56, 5, 194, 13, 56, 5, 209, 172, 56, + 5, 248, 44, 56, 5, 247, 206, 56, 5, 217, 62, 56, 5, 221, 59, 56, 5, 216, + 200, 56, 5, 231, 163, 56, 5, 232, 152, 56, 5, 195, 236, 56, 5, 198, 254, + 56, 5, 199, 170, 56, 5, 237, 19, 56, 5, 237, 24, 56, 5, 219, 73, 56, 5, + 207, 28, 56, 5, 236, 120, 56, 5, 214, 227, 56, 5, 202, 183, 56, 5, 203, + 203, 56, 5, 192, 5, 56, 5, 192, 52, 56, 5, 238, 239, 56, 5, 222, 223, 56, + 5, 213, 230, 56, 5, 192, 235, 56, 5, 221, 88, 56, 5, 214, 128, 56, 5, + 230, 242, 56, 5, 216, 35, 56, 5, 213, 125, 56, 5, 212, 162, 56, 5, 68, + 56, 5, 197, 77, 56, 5, 228, 181, 56, 5, 228, 164, 56, 5, 193, 244, 56, 5, + 193, 237, 56, 5, 209, 51, 56, 5, 248, 43, 56, 5, 247, 124, 56, 5, 217, + 61, 56, 5, 221, 57, 56, 5, 216, 199, 56, 5, 231, 162, 56, 5, 232, 77, 56, + 5, 194, 223, 56, 5, 198, 45, 56, 5, 199, 148, 56, 5, 237, 17, 56, 5, 237, + 23, 56, 5, 219, 36, 56, 5, 206, 218, 56, 5, 235, 62, 56, 5, 214, 222, 56, + 5, 201, 184, 56, 5, 203, 164, 56, 5, 191, 252, 56, 5, 192, 48, 56, 5, + 238, 162, 56, 5, 222, 214, 56, 5, 213, 226, 56, 5, 192, 214, 56, 5, 221, + 33, 56, 5, 214, 127, 56, 5, 230, 186, 56, 5, 215, 241, 56, 5, 213, 22, + 56, 5, 212, 158, 56, 5, 74, 56, 5, 211, 211, 56, 5, 214, 86, 56, 5, 229, + 43, 56, 5, 229, 19, 56, 5, 194, 36, 56, 5, 194, 18, 56, 5, 209, 198, 56, + 5, 248, 45, 56, 5, 247, 220, 56, 5, 217, 63, 56, 5, 221, 60, 56, 5, 216, + 202, 56, 5, 231, 165, 56, 5, 231, 164, 56, 5, 232, 164, 56, 5, 195, 252, + 56, 5, 155, 56, 5, 199, 176, 56, 5, 237, 20, 56, 5, 237, 25, 56, 5, 219, + 107, 56, 5, 207, 55, 56, 5, 236, 146, 56, 5, 214, 231, 56, 5, 202, 212, + 56, 5, 203, 211, 56, 5, 192, 8, 56, 5, 192, 54, 56, 5, 242, 63, 56, 5, + 222, 233, 56, 5, 213, 231, 56, 5, 193, 1, 56, 5, 221, 113, 56, 5, 214, + 129, 56, 5, 230, 254, 56, 5, 216, 91, 56, 5, 213, 142, 56, 5, 212, 165, + 56, 5, 71, 56, 5, 234, 88, 56, 5, 214, 149, 56, 5, 229, 255, 56, 5, 229, + 208, 56, 5, 194, 111, 56, 5, 194, 94, 56, 5, 210, 181, 56, 5, 248, 49, + 56, 5, 248, 123, 56, 5, 217, 75, 56, 5, 221, 65, 56, 5, 221, 63, 56, 5, + 216, 208, 56, 5, 231, 172, 56, 5, 231, 170, 56, 5, 233, 47, 56, 5, 196, + 123, 56, 5, 200, 79, 56, 5, 199, 224, 56, 5, 237, 31, 56, 5, 237, 28, 56, + 5, 220, 42, 56, 5, 208, 7, 56, 5, 237, 116, 56, 5, 214, 247, 56, 5, 205, + 223, 56, 5, 204, 12, 56, 5, 192, 85, 56, 5, 192, 62, 56, 5, 246, 158, 56, + 5, 223, 41, 56, 5, 213, 249, 56, 5, 193, 69, 56, 5, 222, 57, 56, 5, 214, + 139, 56, 5, 214, 135, 56, 5, 231, 158, 56, 5, 231, 144, 56, 5, 217, 48, + 56, 5, 214, 214, 56, 5, 212, 190, 56, 5, 214, 167, 56, 5, 219, 250, 56, + 242, 38, 56, 232, 71, 201, 238, 56, 208, 159, 77, 56, 5, 214, 230, 233, + 97, 56, 5, 214, 230, 160, 56, 5, 214, 230, 202, 183, 56, 16, 233, 36, 56, + 16, 222, 46, 56, 16, 199, 78, 56, 16, 214, 27, 56, 16, 248, 201, 56, 16, + 233, 96, 56, 16, 200, 174, 56, 16, 237, 206, 56, 16, 236, 119, 56, 16, + 221, 10, 56, 16, 199, 2, 56, 16, 236, 145, 56, 16, 222, 224, 56, 17, 192, + 76, 56, 17, 101, 56, 17, 104, 56, 17, 133, 56, 17, 134, 56, 17, 151, 56, + 17, 170, 56, 17, 179, 56, 17, 174, 56, 17, 182, 56, 5, 214, 230, 172, 56, + 5, 214, 230, 236, 146, 42, 6, 1, 192, 80, 42, 2, 1, 192, 80, 42, 6, 1, + 235, 12, 42, 2, 1, 235, 12, 42, 6, 1, 207, 168, 235, 14, 42, 2, 1, 207, + 168, 235, 14, 42, 6, 1, 223, 111, 42, 2, 1, 223, 111, 42, 6, 1, 236, 163, + 42, 2, 1, 236, 163, 42, 6, 1, 216, 43, 197, 92, 42, 2, 1, 216, 43, 197, + 92, 42, 6, 1, 247, 138, 211, 216, 42, 2, 1, 247, 138, 211, 216, 42, 6, 1, + 214, 179, 193, 51, 42, 2, 1, 214, 179, 193, 51, 42, 6, 1, 193, 48, 4, + 248, 253, 193, 51, 42, 2, 1, 193, 48, 4, 248, 253, 193, 51, 42, 6, 1, + 223, 109, 193, 84, 42, 2, 1, 223, 109, 193, 84, 42, 6, 1, 207, 168, 192, + 214, 42, 2, 1, 207, 168, 192, 214, 42, 6, 1, 223, 109, 64, 42, 2, 1, 223, + 109, 64, 42, 6, 1, 242, 84, 219, 147, 192, 179, 42, 2, 1, 242, 84, 219, + 147, 192, 179, 42, 6, 1, 247, 240, 192, 179, 42, 2, 1, 247, 240, 192, + 179, 42, 6, 1, 223, 109, 242, 84, 219, 147, 192, 179, 42, 2, 1, 223, 109, + 242, 84, 219, 147, 192, 179, 42, 6, 1, 193, 3, 42, 2, 1, 193, 3, 42, 6, + 1, 207, 168, 198, 112, 42, 2, 1, 207, 168, 198, 112, 42, 6, 1, 202, 198, + 237, 116, 42, 2, 1, 202, 198, 237, 116, 42, 6, 1, 202, 198, 234, 124, 42, + 2, 1, 202, 198, 234, 124, 42, 6, 1, 202, 198, 234, 99, 42, 2, 1, 202, + 198, 234, 99, 42, 6, 1, 216, 47, 74, 42, 2, 1, 216, 47, 74, 42, 6, 1, + 248, 17, 74, 42, 2, 1, 248, 17, 74, 42, 6, 1, 55, 216, 47, 74, 42, 2, 1, + 55, 216, 47, 74, 42, 1, 215, 217, 74, 38, 42, 194, 204, 38, 42, 200, 31, + 216, 124, 57, 38, 42, 228, 163, 216, 124, 57, 38, 42, 199, 165, 216, 124, + 57, 203, 2, 250, 37, 38, 42, 1, 197, 89, 223, 251, 38, 42, 1, 70, 38, 42, + 1, 193, 22, 38, 42, 1, 68, 38, 42, 1, 230, 26, 57, 38, 42, 1, 193, 47, + 38, 42, 1, 202, 198, 57, 38, 42, 1, 211, 216, 38, 42, 222, 69, 38, 42, + 210, 188, 42, 222, 69, 42, 210, 188, 42, 6, 1, 235, 27, 42, 2, 1, 235, + 27, 42, 6, 1, 235, 3, 42, 2, 1, 235, 3, 42, 6, 1, 192, 38, 42, 2, 1, 192, + 38, 42, 6, 1, 246, 174, 42, 2, 1, 246, 174, 42, 6, 1, 234, 255, 42, 2, 1, + 234, 255, 42, 6, 1, 200, 80, 4, 85, 128, 42, 2, 1, 200, 80, 4, 85, 128, + 42, 6, 1, 197, 248, 42, 2, 1, 197, 248, 42, 6, 1, 198, 87, 42, 2, 1, 198, + 87, 42, 6, 1, 198, 92, 42, 2, 1, 198, 92, 42, 6, 1, 200, 85, 42, 2, 1, + 200, 85, 42, 6, 1, 228, 144, 42, 2, 1, 228, 144, 42, 6, 1, 203, 140, 42, + 2, 1, 203, 140, 42, 6, 1, 55, 74, 42, 2, 1, 55, 74, 42, 6, 1, 238, 180, + 74, 42, 2, 1, 238, 180, 74, 73, 1, 42, 230, 26, 57, 73, 1, 42, 202, 198, + 57, 38, 42, 1, 234, 164, 38, 42, 1, 223, 109, 71, 25, 1, 64, 25, 1, 160, + 25, 1, 68, 25, 1, 221, 33, 25, 1, 234, 171, 25, 1, 207, 234, 25, 1, 200, + 157, 25, 1, 74, 25, 1, 212, 181, 25, 1, 70, 25, 1, 177, 25, 1, 166, 25, + 1, 207, 88, 25, 1, 207, 136, 25, 1, 220, 31, 25, 1, 217, 28, 25, 1, 200, + 174, 25, 1, 214, 253, 25, 1, 213, 254, 25, 1, 218, 236, 25, 1, 201, 86, + 25, 1, 215, 241, 25, 1, 203, 231, 25, 1, 203, 125, 25, 1, 203, 241, 25, + 1, 204, 147, 25, 1, 220, 208, 25, 1, 222, 20, 25, 1, 212, 246, 25, 1, + 213, 22, 25, 1, 213, 225, 25, 1, 192, 232, 25, 1, 203, 164, 25, 1, 192, + 183, 25, 1, 168, 25, 1, 213, 59, 25, 1, 222, 6, 25, 1, 210, 98, 25, 1, + 213, 247, 25, 1, 213, 39, 25, 1, 209, 42, 25, 1, 193, 241, 25, 1, 210, + 168, 25, 1, 233, 40, 25, 1, 206, 218, 25, 1, 219, 36, 25, 1, 216, 175, + 25, 1, 214, 60, 25, 1, 207, 170, 25, 1, 208, 53, 25, 1, 222, 30, 25, 1, + 214, 93, 25, 1, 214, 144, 25, 1, 214, 165, 25, 1, 203, 211, 25, 1, 209, + 47, 25, 1, 232, 77, 25, 1, 232, 157, 25, 1, 194, 169, 25, 1, 181, 25, 1, + 219, 209, 25, 1, 210, 51, 25, 1, 219, 65, 25, 1, 221, 113, 25, 1, 217, + 72, 25, 1, 207, 205, 25, 1, 217, 5, 25, 1, 172, 25, 1, 199, 128, 25, 1, + 221, 204, 25, 1, 216, 91, 25, 1, 217, 80, 25, 1, 200, 8, 25, 1, 221, 69, + 25, 1, 200, 30, 25, 1, 213, 25, 25, 1, 206, 48, 25, 1, 233, 93, 25, 1, + 221, 72, 25, 1, 221, 104, 25, 38, 122, 221, 81, 25, 38, 122, 198, 30, 25, + 213, 253, 25, 232, 71, 201, 238, 25, 242, 47, 25, 242, 38, 25, 204, 180, + 25, 208, 159, 77, 73, 1, 242, 200, 158, 193, 11, 209, 255, 73, 1, 242, + 200, 158, 193, 96, 209, 255, 73, 1, 242, 200, 158, 193, 11, 204, 36, 73, + 1, 242, 200, 158, 193, 96, 204, 36, 73, 1, 242, 200, 158, 193, 11, 208, + 177, 73, 1, 242, 200, 158, 193, 96, 208, 177, 73, 1, 242, 200, 158, 193, + 11, 206, 218, 73, 1, 242, 200, 158, 193, 96, 206, 218, 73, 1, 233, 188, + 235, 111, 158, 161, 73, 1, 139, 235, 111, 158, 161, 73, 1, 216, 162, 235, + 111, 158, 161, 73, 1, 132, 235, 111, 158, 161, 73, 1, 233, 187, 235, 111, + 158, 161, 73, 1, 233, 188, 235, 111, 220, 20, 158, 161, 73, 1, 139, 235, + 111, 220, 20, 158, 161, 73, 1, 216, 162, 235, 111, 220, 20, 158, 161, 73, + 1, 132, 235, 111, 220, 20, 158, 161, 73, 1, 233, 187, 235, 111, 220, 20, + 158, 161, 73, 1, 233, 188, 220, 20, 158, 161, 73, 1, 139, 220, 20, 158, + 161, 73, 1, 216, 162, 220, 20, 158, 161, 73, 1, 132, 220, 20, 158, 161, + 73, 1, 233, 187, 220, 20, 158, 161, 73, 1, 78, 84, 161, 73, 1, 78, 203, + 4, 73, 1, 78, 229, 5, 161, 73, 1, 106, 51, 238, 224, 250, 207, 73, 1, + 208, 39, 130, 54, 73, 1, 208, 39, 142, 54, 73, 1, 208, 39, 233, 204, 77, + 73, 1, 208, 39, 223, 121, 233, 204, 77, 73, 1, 132, 223, 121, 233, 204, + 77, 73, 1, 201, 218, 26, 139, 199, 18, 73, 1, 201, 218, 26, 132, 199, 18, + 8, 6, 1, 234, 159, 251, 26, 8, 2, 1, 234, 159, 251, 26, 8, 6, 1, 234, + 159, 251, 57, 8, 2, 1, 234, 159, 251, 57, 8, 6, 1, 229, 206, 8, 2, 1, + 229, 206, 8, 6, 1, 197, 192, 8, 2, 1, 197, 192, 8, 6, 1, 198, 189, 8, 2, + 1, 198, 189, 8, 6, 1, 238, 159, 8, 2, 1, 238, 159, 8, 6, 1, 238, 160, 4, + 242, 38, 8, 2, 1, 238, 160, 4, 242, 38, 8, 1, 2, 6, 233, 163, 8, 1, 2, 6, + 206, 158, 8, 6, 1, 252, 33, 8, 2, 1, 252, 33, 8, 6, 1, 250, 166, 8, 2, 1, + 250, 166, 8, 6, 1, 250, 8, 8, 2, 1, 250, 8, 8, 6, 1, 249, 247, 8, 2, 1, + 249, 247, 8, 6, 1, 249, 248, 4, 229, 5, 161, 8, 2, 1, 249, 248, 4, 229, + 5, 161, 8, 6, 1, 249, 236, 8, 2, 1, 249, 236, 8, 6, 1, 207, 168, 247, 53, + 4, 236, 114, 8, 2, 1, 207, 168, 247, 53, 4, 236, 114, 8, 6, 1, 222, 185, + 4, 111, 8, 2, 1, 222, 185, 4, 111, 8, 6, 1, 222, 185, 4, 237, 11, 111, 8, + 2, 1, 222, 185, 4, 237, 11, 111, 8, 6, 1, 222, 185, 4, 201, 208, 26, 237, + 11, 111, 8, 2, 1, 222, 185, 4, 201, 208, 26, 237, 11, 111, 8, 6, 1, 247, + 136, 165, 8, 2, 1, 247, 136, 165, 8, 6, 1, 220, 202, 4, 139, 111, 8, 2, + 1, 220, 202, 4, 139, 111, 8, 6, 1, 185, 4, 184, 201, 208, 211, 110, 8, 2, + 1, 185, 4, 184, 201, 208, 211, 110, 8, 6, 1, 185, 4, 219, 69, 8, 2, 1, + 185, 4, 219, 69, 8, 6, 1, 211, 194, 8, 2, 1, 211, 194, 8, 6, 1, 211, 94, + 4, 201, 208, 199, 151, 237, 59, 8, 2, 1, 211, 94, 4, 201, 208, 199, 151, + 237, 59, 8, 6, 1, 211, 94, 4, 232, 177, 8, 2, 1, 211, 94, 4, 232, 177, 8, + 6, 1, 211, 94, 4, 202, 98, 200, 147, 8, 2, 1, 211, 94, 4, 202, 98, 200, + 147, 8, 6, 1, 208, 248, 4, 201, 208, 199, 151, 237, 59, 8, 2, 1, 208, + 248, 4, 201, 208, 199, 151, 237, 59, 8, 6, 1, 208, 248, 4, 237, 11, 111, + 8, 2, 1, 208, 248, 4, 237, 11, 111, 8, 6, 1, 208, 112, 207, 10, 8, 2, 1, + 208, 112, 207, 10, 8, 6, 1, 206, 199, 207, 10, 8, 2, 1, 206, 199, 207, + 10, 8, 6, 1, 196, 237, 4, 237, 11, 111, 8, 2, 1, 196, 237, 4, 237, 11, + 111, 8, 6, 1, 194, 210, 8, 2, 1, 194, 210, 8, 6, 1, 196, 4, 192, 155, 8, + 2, 1, 196, 4, 192, 155, 8, 6, 1, 199, 169, 4, 111, 8, 2, 1, 199, 169, 4, + 111, 8, 6, 1, 199, 169, 4, 201, 208, 199, 151, 237, 59, 8, 2, 1, 199, + 169, 4, 201, 208, 199, 151, 237, 59, 8, 6, 1, 196, 112, 8, 2, 1, 196, + 112, 8, 6, 1, 233, 242, 8, 2, 1, 233, 242, 8, 6, 1, 223, 96, 8, 2, 1, + 223, 96, 8, 6, 1, 239, 21, 8, 2, 1, 239, 21, 73, 1, 197, 10, 8, 2, 1, + 235, 51, 8, 2, 1, 219, 19, 8, 2, 1, 215, 210, 8, 2, 1, 212, 237, 8, 2, 1, + 206, 198, 8, 1, 2, 6, 206, 198, 8, 2, 1, 198, 27, 8, 2, 1, 197, 84, 8, 6, + 1, 223, 143, 238, 95, 8, 2, 1, 223, 143, 238, 95, 8, 6, 1, 223, 143, 233, + 163, 8, 2, 1, 223, 143, 233, 163, 8, 6, 1, 223, 143, 232, 44, 8, 6, 1, + 163, 223, 143, 232, 44, 8, 2, 1, 163, 223, 143, 232, 44, 8, 6, 1, 163, + 165, 8, 2, 1, 163, 165, 8, 6, 1, 223, 143, 150, 8, 2, 1, 223, 143, 150, + 8, 6, 1, 223, 143, 206, 158, 8, 2, 1, 223, 143, 206, 158, 8, 6, 1, 223, + 143, 200, 228, 8, 2, 1, 223, 143, 200, 228, 73, 1, 132, 242, 122, 251, + 143, 73, 1, 242, 47, 73, 1, 203, 195, 234, 30, 57, 8, 6, 1, 206, 53, 8, + 2, 1, 206, 53, 8, 6, 1, 163, 230, 124, 8, 2, 1, 220, 202, 4, 207, 174, + 229, 15, 26, 248, 82, 8, 1, 203, 67, 236, 114, 8, 6, 1, 215, 152, 4, 237, + 59, 8, 2, 1, 215, 152, 4, 237, 59, 8, 6, 1, 247, 53, 4, 161, 8, 2, 1, + 247, 53, 4, 161, 8, 2, 1, 247, 53, 4, 211, 49, 128, 8, 2, 1, 230, 125, 4, + 211, 49, 128, 8, 6, 1, 76, 4, 232, 177, 8, 2, 1, 76, 4, 232, 177, 8, 6, + 1, 233, 164, 4, 111, 8, 2, 1, 233, 164, 4, 111, 8, 6, 1, 195, 243, 251, + 108, 8, 2, 1, 195, 243, 251, 108, 8, 6, 1, 195, 243, 212, 0, 8, 2, 1, + 195, 243, 212, 0, 8, 6, 1, 195, 243, 197, 104, 8, 2, 1, 195, 243, 197, + 104, 8, 6, 1, 232, 45, 4, 212, 18, 111, 8, 2, 1, 232, 45, 4, 212, 18, + 111, 8, 6, 1, 222, 185, 4, 212, 18, 111, 8, 2, 1, 222, 185, 4, 212, 18, + 111, 8, 6, 1, 215, 152, 4, 212, 18, 111, 8, 2, 1, 215, 152, 4, 212, 18, + 111, 8, 6, 1, 208, 112, 4, 212, 18, 111, 8, 2, 1, 208, 112, 4, 212, 18, + 111, 8, 6, 1, 206, 159, 4, 212, 18, 111, 8, 2, 1, 206, 159, 4, 212, 18, + 111, 8, 6, 1, 230, 125, 4, 128, 8, 6, 1, 207, 168, 211, 184, 71, 8, 6, 1, + 27, 232, 44, 8, 6, 1, 220, 202, 4, 248, 82, 8, 6, 1, 2, 6, 70, 8, 1, 2, + 6, 208, 247, 8, 6, 1, 163, 222, 184, 8, 6, 1, 163, 200, 228, 8, 6, 1, + 223, 66, 4, 238, 178, 8, 6, 1, 242, 215, 8, 6, 1, 248, 63, 8, 2, 1, 248, + 63, 8, 6, 1, 211, 216, 8, 2, 1, 211, 216, 8, 6, 1, 124, 4, 111, 8, 2, 1, + 124, 4, 111, 8, 6, 1, 231, 6, 64, 8, 2, 1, 231, 6, 64, 8, 6, 1, 231, 6, + 70, 8, 2, 1, 231, 6, 70, 8, 6, 1, 231, 6, 68, 8, 2, 1, 231, 6, 68, 8, 6, + 1, 250, 204, 194, 202, 8, 2, 1, 250, 204, 194, 202, 8, 6, 1, 247, 53, 4, + 211, 49, 128, 8, 6, 1, 206, 159, 4, 128, 8, 6, 1, 192, 156, 4, 211, 49, + 128, 8, 6, 1, 238, 96, 4, 203, 195, 201, 208, 211, 110, 8, 2, 1, 238, 96, + 4, 203, 195, 201, 208, 211, 110, 8, 6, 1, 206, 159, 4, 203, 195, 201, + 208, 211, 110, 8, 2, 1, 206, 159, 4, 203, 195, 201, 208, 211, 110, 8, 6, + 1, 207, 168, 138, 230, 124, 8, 2, 1, 207, 168, 138, 230, 124, 8, 234, 35, + 1, 203, 109, 70, 73, 1, 6, 230, 125, 4, 111, 73, 1, 2, 34, 212, 0, 8, 1, + 2, 6, 163, 218, 236, 8, 234, 35, 1, 207, 168, 233, 163, 8, 234, 35, 1, + 207, 168, 211, 93, 8, 234, 35, 1, 223, 121, 218, 236, 8, 234, 35, 1, 228, + 97, 219, 75, 8, 234, 35, 1, 250, 112, 218, 236, 201, 53, 215, 72, 1, 64, + 201, 53, 215, 72, 1, 70, 201, 53, 215, 72, 3, 235, 29, 201, 53, 215, 72, + 1, 68, 201, 53, 215, 72, 1, 71, 201, 53, 215, 72, 1, 74, 201, 53, 215, + 72, 3, 230, 20, 201, 53, 215, 72, 1, 221, 113, 201, 53, 215, 72, 1, 221, + 220, 201, 53, 215, 72, 1, 230, 254, 201, 53, 215, 72, 1, 231, 56, 201, + 53, 215, 72, 3, 250, 168, 201, 53, 215, 72, 1, 242, 63, 201, 53, 215, 72, + 1, 242, 188, 201, 53, 215, 72, 1, 222, 233, 201, 53, 215, 72, 1, 223, 22, + 201, 53, 215, 72, 1, 198, 60, 201, 53, 215, 72, 1, 198, 66, 201, 53, 215, + 72, 1, 237, 131, 201, 53, 215, 72, 1, 237, 140, 201, 53, 215, 72, 1, 155, + 201, 53, 215, 72, 1, 199, 176, 201, 53, 215, 72, 1, 236, 146, 201, 53, + 215, 72, 1, 237, 20, 201, 53, 215, 72, 1, 213, 142, 201, 53, 215, 72, 1, + 209, 198, 201, 53, 215, 72, 1, 210, 65, 201, 53, 215, 72, 1, 247, 220, + 201, 53, 215, 72, 1, 248, 45, 201, 53, 215, 72, 1, 216, 91, 201, 53, 215, + 72, 1, 207, 55, 201, 53, 215, 72, 1, 219, 107, 201, 53, 215, 72, 1, 206, + 245, 201, 53, 215, 72, 1, 202, 212, 201, 53, 215, 72, 1, 229, 43, 201, + 53, 215, 72, 18, 3, 64, 201, 53, 215, 72, 18, 3, 70, 201, 53, 215, 72, + 18, 3, 68, 201, 53, 215, 72, 18, 3, 71, 201, 53, 215, 72, 18, 3, 211, + 194, 201, 53, 215, 72, 209, 193, 217, 126, 201, 53, 215, 72, 209, 193, + 217, 125, 201, 53, 215, 72, 209, 193, 217, 124, 201, 53, 215, 72, 209, + 193, 217, 123, 201, 53, 215, 72, 3, 250, 249, 230, 20, 178, 223, 174, + 232, 109, 90, 208, 167, 178, 223, 174, 232, 109, 90, 230, 78, 178, 223, + 174, 232, 109, 112, 208, 165, 178, 223, 174, 232, 109, 90, 203, 33, 178, + 223, 174, 232, 109, 90, 234, 143, 178, 223, 174, 232, 109, 112, 203, 30, + 178, 223, 174, 208, 168, 77, 178, 223, 174, 209, 231, 77, 178, 223, 174, + 206, 186, 77, 178, 223, 174, 208, 169, 77, 210, 90, 1, 160, 210, 90, 1, + 221, 250, 210, 90, 1, 231, 233, 210, 90, 1, 214, 165, 210, 90, 1, 247, + 19, 210, 90, 1, 246, 117, 210, 90, 1, 223, 62, 210, 90, 1, 212, 201, 210, + 90, 1, 189, 210, 90, 1, 199, 240, 210, 90, 1, 238, 0, 210, 90, 1, 181, + 210, 90, 1, 166, 210, 90, 1, 210, 94, 210, 90, 1, 249, 3, 210, 90, 1, + 172, 210, 90, 1, 198, 118, 210, 90, 1, 198, 108, 210, 90, 1, 235, 17, + 210, 90, 1, 194, 169, 210, 90, 1, 192, 71, 210, 90, 1, 192, 112, 210, 90, + 1, 2, 64, 210, 90, 1, 168, 210, 90, 1, 167, 210, 90, 1, 177, 210, 90, 1, + 204, 64, 210, 90, 1, 188, 210, 90, 1, 144, 210, 90, 1, 64, 210, 90, 1, + 70, 210, 90, 1, 68, 210, 90, 1, 71, 210, 90, 1, 74, 210, 90, 1, 208, 239, + 210, 90, 1, 193, 209, 210, 90, 1, 233, 97, 210, 90, 1, 231, 120, 210, 90, + 1, 234, 171, 210, 90, 201, 164, 1, 194, 169, 210, 90, 201, 164, 1, 168, + 210, 90, 1, 198, 83, 210, 90, 1, 198, 71, 210, 90, 1, 237, 161, 210, 90, + 1, 213, 178, 210, 90, 1, 250, 249, 168, 210, 90, 1, 195, 247, 204, 64, + 210, 90, 1, 195, 248, 144, 210, 90, 1, 250, 44, 233, 97, 210, 90, 201, + 164, 1, 167, 210, 90, 201, 110, 1, 167, 210, 90, 1, 246, 234, 210, 90, + 203, 74, 229, 246, 77, 210, 90, 55, 229, 246, 77, 210, 90, 122, 204, 56, + 210, 90, 122, 55, 204, 56, 206, 9, 3, 250, 168, 206, 9, 3, 196, 6, 206, + 9, 1, 64, 206, 9, 1, 252, 33, 206, 9, 1, 70, 206, 9, 1, 223, 224, 206, 9, + 1, 68, 206, 9, 1, 196, 251, 206, 9, 1, 118, 150, 206, 9, 1, 118, 207, 4, + 206, 9, 1, 118, 165, 206, 9, 1, 118, 219, 138, 206, 9, 1, 71, 206, 9, 1, + 234, 171, 206, 9, 1, 251, 63, 206, 9, 1, 74, 206, 9, 1, 211, 194, 206, 9, + 1, 250, 8, 206, 9, 1, 160, 206, 9, 1, 221, 250, 206, 9, 1, 231, 233, 206, + 9, 1, 231, 84, 206, 9, 1, 214, 165, 206, 9, 1, 247, 19, 206, 9, 1, 246, + 117, 206, 9, 1, 223, 62, 206, 9, 1, 223, 28, 206, 9, 1, 212, 201, 206, 9, + 1, 198, 83, 206, 9, 1, 198, 71, 206, 9, 1, 237, 161, 206, 9, 1, 237, 145, + 206, 9, 1, 213, 178, 206, 9, 1, 189, 206, 9, 1, 199, 240, 206, 9, 1, 238, + 0, 206, 9, 1, 237, 40, 206, 9, 1, 181, 206, 9, 1, 166, 206, 9, 1, 210, + 94, 206, 9, 1, 249, 3, 206, 9, 1, 248, 54, 206, 9, 1, 172, 206, 9, 1, + 168, 206, 9, 1, 167, 206, 9, 1, 177, 206, 9, 1, 196, 157, 206, 9, 1, 204, + 64, 206, 9, 1, 202, 92, 206, 9, 1, 188, 206, 9, 1, 144, 206, 9, 1, 219, + 137, 206, 9, 116, 3, 230, 97, 206, 9, 18, 3, 252, 33, 206, 9, 18, 3, 70, + 206, 9, 18, 3, 223, 224, 206, 9, 18, 3, 68, 206, 9, 18, 3, 196, 251, 206, + 9, 18, 3, 118, 150, 206, 9, 18, 3, 118, 207, 4, 206, 9, 18, 3, 118, 165, + 206, 9, 18, 3, 118, 219, 138, 206, 9, 18, 3, 71, 206, 9, 18, 3, 234, 171, + 206, 9, 18, 3, 251, 63, 206, 9, 18, 3, 74, 206, 9, 18, 3, 211, 194, 206, + 9, 18, 3, 250, 8, 206, 9, 3, 196, 11, 206, 9, 3, 246, 234, 206, 9, 237, + 208, 206, 9, 55, 237, 208, 206, 9, 17, 192, 76, 206, 9, 17, 101, 206, 9, + 17, 104, 206, 9, 17, 133, 206, 9, 17, 134, 206, 9, 17, 151, 206, 9, 17, + 170, 206, 9, 17, 179, 206, 9, 17, 174, 206, 9, 17, 182, 38, 107, 17, 192, + 76, 38, 107, 17, 101, 38, 107, 17, 104, 38, 107, 17, 133, 38, 107, 17, + 134, 38, 107, 17, 151, 38, 107, 17, 170, 38, 107, 17, 179, 38, 107, 17, + 174, 38, 107, 17, 182, 38, 107, 1, 64, 38, 107, 1, 68, 38, 107, 1, 160, + 38, 107, 1, 181, 38, 107, 1, 166, 38, 107, 1, 167, 38, 107, 1, 196, 39, + 38, 107, 3, 249, 246, 107, 3, 202, 159, 246, 234, 107, 3, 246, 235, 196, + 11, 107, 3, 55, 246, 235, 196, 11, 107, 3, 246, 235, 104, 107, 3, 246, + 235, 133, 107, 3, 246, 235, 249, 246, 107, 3, 209, 20, 107, 231, 197, + 232, 247, 107, 246, 211, 107, 229, 237, 107, 3, 203, 113, 107, 223, 54, + 211, 219, 107, 1, 249, 236, 107, 18, 3, 249, 236, 222, 63, 219, 210, 17, + 192, 76, 222, 63, 219, 210, 17, 101, 222, 63, 219, 210, 17, 104, 222, 63, + 219, 210, 17, 133, 222, 63, 219, 210, 17, 134, 222, 63, 219, 210, 17, + 151, 222, 63, 219, 210, 17, 170, 222, 63, 219, 210, 17, 179, 222, 63, + 219, 210, 17, 174, 222, 63, 219, 210, 17, 182, 222, 63, 219, 210, 1, 160, + 222, 63, 219, 210, 1, 221, 250, 222, 63, 219, 210, 1, 231, 233, 222, 63, + 219, 210, 1, 214, 165, 222, 63, 219, 210, 1, 188, 222, 63, 219, 210, 1, + 204, 64, 222, 63, 219, 210, 1, 192, 112, 222, 63, 219, 210, 1, 212, 201, + 222, 63, 219, 210, 1, 189, 222, 63, 219, 210, 1, 228, 185, 222, 63, 219, + 210, 1, 181, 222, 63, 219, 210, 1, 166, 222, 63, 219, 210, 1, 210, 94, + 222, 63, 219, 210, 1, 172, 222, 63, 219, 210, 1, 238, 0, 222, 63, 219, + 210, 1, 249, 3, 222, 63, 219, 210, 1, 167, 222, 63, 219, 210, 1, 168, + 222, 63, 219, 210, 1, 177, 222, 63, 219, 210, 1, 194, 169, 222, 63, 219, + 210, 1, 199, 240, 222, 63, 219, 210, 1, 144, 222, 63, 219, 210, 1, 196, + 157, 222, 63, 219, 210, 1, 247, 19, 222, 63, 219, 210, 1, 64, 222, 63, + 219, 210, 1, 212, 0, 222, 63, 219, 210, 1, 70, 222, 63, 219, 210, 1, 211, + 194, 222, 63, 219, 210, 18, 197, 104, 222, 63, 219, 210, 18, 71, 222, 63, + 219, 210, 18, 68, 222, 63, 219, 210, 18, 234, 171, 222, 63, 219, 210, 18, + 74, 222, 63, 219, 210, 158, 209, 215, 222, 63, 219, 210, 158, 246, 250, + 222, 63, 219, 210, 158, 246, 251, 209, 215, 222, 63, 219, 210, 3, 238, + 114, 222, 63, 219, 210, 3, 203, 133, 207, 217, 1, 160, 207, 217, 1, 231, + 233, 207, 217, 1, 214, 165, 207, 217, 1, 189, 207, 217, 1, 238, 0, 207, + 217, 1, 181, 207, 217, 1, 166, 207, 217, 1, 249, 3, 207, 217, 1, 172, + 207, 217, 1, 247, 19, 207, 217, 1, 223, 62, 207, 217, 1, 212, 201, 207, + 217, 1, 188, 207, 217, 1, 167, 207, 217, 1, 177, 207, 217, 1, 168, 207, + 217, 1, 194, 169, 207, 217, 1, 144, 207, 217, 1, 217, 82, 207, 217, 1, + 214, 144, 207, 217, 1, 214, 255, 207, 217, 1, 212, 166, 207, 217, 1, 64, + 207, 217, 18, 3, 70, 207, 217, 18, 3, 68, 207, 217, 18, 3, 71, 207, 217, + 18, 3, 251, 63, 207, 217, 18, 3, 74, 207, 217, 18, 3, 250, 8, 207, 217, + 18, 3, 233, 230, 207, 217, 18, 3, 234, 199, 207, 217, 116, 3, 214, 167, + 207, 217, 116, 3, 215, 151, 207, 217, 116, 3, 150, 207, 217, 116, 3, 230, + 124, 207, 217, 196, 11, 207, 217, 205, 209, 77, 30, 143, 199, 99, 30, + 143, 199, 98, 30, 143, 199, 96, 30, 143, 199, 101, 30, 143, 207, 128, 30, + 143, 207, 112, 30, 143, 207, 107, 30, 143, 207, 109, 30, 143, 207, 125, + 30, 143, 207, 118, 30, 143, 207, 111, 30, 143, 207, 130, 30, 143, 207, + 113, 30, 143, 207, 132, 30, 143, 207, 129, 30, 143, 216, 149, 30, 143, + 216, 140, 30, 143, 216, 143, 30, 143, 210, 21, 30, 143, 210, 32, 30, 143, + 210, 33, 30, 143, 202, 76, 30, 143, 223, 237, 30, 143, 223, 244, 30, 143, + 202, 87, 30, 143, 202, 74, 30, 143, 210, 74, 30, 143, 229, 157, 30, 143, + 202, 71, 223, 47, 3, 211, 3, 223, 47, 3, 246, 155, 223, 47, 3, 220, 50, + 223, 47, 3, 194, 57, 223, 47, 1, 64, 223, 47, 1, 228, 97, 222, 67, 223, + 47, 1, 70, 223, 47, 1, 223, 224, 223, 47, 1, 68, 223, 47, 1, 211, 78, + 246, 125, 223, 47, 1, 214, 166, 220, 7, 223, 47, 1, 214, 166, 220, 8, + 208, 23, 223, 47, 1, 71, 223, 47, 1, 251, 63, 223, 47, 1, 74, 223, 47, 1, + 160, 223, 47, 1, 222, 174, 206, 22, 223, 47, 1, 222, 174, 215, 195, 223, + 47, 1, 231, 233, 223, 47, 1, 231, 234, 215, 195, 223, 47, 1, 214, 165, + 223, 47, 1, 247, 19, 223, 47, 1, 247, 20, 215, 195, 223, 47, 1, 223, 62, + 223, 47, 1, 212, 202, 215, 195, 223, 47, 1, 223, 63, 217, 184, 223, 47, + 1, 212, 201, 223, 47, 1, 198, 83, 223, 47, 1, 198, 84, 217, 184, 223, 47, + 1, 237, 161, 223, 47, 1, 237, 162, 217, 184, 223, 47, 1, 215, 97, 215, + 195, 223, 47, 1, 189, 223, 47, 1, 200, 181, 215, 195, 223, 47, 1, 238, 0, + 223, 47, 1, 238, 1, 217, 184, 223, 47, 1, 181, 223, 47, 1, 166, 223, 47, + 1, 211, 78, 215, 195, 223, 47, 1, 249, 3, 223, 47, 1, 249, 4, 215, 195, + 223, 47, 1, 172, 223, 47, 1, 168, 223, 47, 1, 167, 223, 47, 1, 208, 76, + 251, 73, 223, 47, 1, 177, 223, 47, 1, 194, 169, 223, 47, 1, 206, 101, + 215, 195, 223, 47, 1, 206, 101, 217, 184, 223, 47, 1, 188, 223, 47, 1, + 144, 223, 47, 3, 246, 156, 200, 35, 223, 47, 18, 3, 200, 108, 223, 47, + 18, 3, 199, 23, 223, 47, 18, 3, 193, 238, 223, 47, 18, 3, 193, 239, 217, + 16, 223, 47, 18, 3, 201, 133, 223, 47, 18, 3, 201, 134, 217, 4, 223, 47, + 18, 3, 200, 133, 223, 47, 18, 3, 236, 202, 215, 194, 223, 47, 18, 3, 210, + 136, 223, 47, 116, 3, 222, 23, 223, 47, 116, 3, 210, 151, 223, 47, 116, + 3, 247, 4, 223, 47, 211, 16, 223, 47, 46, 207, 190, 223, 47, 51, 207, + 190, 223, 47, 211, 66, 250, 216, 223, 47, 211, 66, 217, 205, 223, 47, + 211, 66, 219, 23, 223, 47, 211, 66, 194, 50, 223, 47, 211, 66, 211, 17, + 223, 47, 211, 66, 219, 167, 223, 47, 211, 66, 219, 16, 223, 47, 211, 66, + 251, 119, 223, 47, 211, 66, 251, 120, 251, 119, 223, 47, 211, 66, 209, + 243, 223, 47, 163, 211, 66, 209, 243, 223, 47, 211, 12, 223, 47, 17, 192, + 76, 223, 47, 17, 101, 223, 47, 17, 104, 223, 47, 17, 133, 223, 47, 17, + 134, 223, 47, 17, 151, 223, 47, 17, 170, 223, 47, 17, 179, 223, 47, 17, + 174, 223, 47, 17, 182, 223, 47, 211, 66, 199, 65, 198, 24, 223, 47, 211, + 66, 223, 92, 79, 1, 204, 38, 231, 84, 79, 1, 204, 38, 246, 117, 79, 1, + 204, 38, 223, 28, 79, 1, 204, 38, 213, 178, 79, 1, 204, 38, 248, 54, 79, + 3, 204, 38, 206, 6, 79, 73, 1, 204, 38, 207, 235, 79, 1, 53, 220, 154, + 212, 201, 79, 1, 53, 220, 154, 233, 97, 79, 1, 53, 220, 154, 231, 233, + 79, 1, 53, 220, 154, 231, 84, 79, 1, 53, 220, 154, 223, 62, 79, 1, 53, + 220, 154, 223, 28, 79, 1, 53, 220, 154, 237, 161, 79, 1, 53, 220, 154, + 237, 145, 79, 1, 53, 220, 154, 213, 178, 79, 53, 220, 154, 17, 192, 76, + 79, 53, 220, 154, 17, 101, 79, 53, 220, 154, 17, 104, 79, 53, 220, 154, + 17, 133, 79, 53, 220, 154, 17, 134, 79, 53, 220, 154, 17, 151, 79, 53, + 220, 154, 17, 170, 79, 53, 220, 154, 17, 179, 79, 53, 220, 154, 17, 174, + 79, 53, 220, 154, 17, 182, 79, 1, 53, 220, 154, 219, 137, 79, 1, 53, 220, + 154, 238, 0, 79, 1, 53, 220, 154, 237, 40, 79, 1, 53, 220, 154, 249, 3, + 79, 1, 53, 220, 154, 248, 54, 246, 110, 1, 64, 246, 110, 1, 70, 246, 110, + 1, 68, 246, 110, 1, 71, 246, 110, 1, 251, 63, 246, 110, 1, 74, 246, 110, + 1, 160, 246, 110, 1, 221, 250, 246, 110, 1, 231, 233, 246, 110, 1, 231, + 84, 246, 110, 1, 214, 74, 246, 110, 1, 214, 165, 246, 110, 1, 246, 117, + 246, 110, 1, 242, 218, 246, 110, 1, 223, 62, 246, 110, 1, 223, 28, 246, + 110, 1, 214, 62, 246, 110, 1, 214, 65, 246, 110, 1, 214, 63, 246, 110, 1, + 189, 246, 110, 1, 199, 240, 246, 110, 1, 238, 0, 246, 110, 1, 237, 40, + 246, 110, 1, 212, 244, 246, 110, 1, 181, 246, 110, 1, 237, 161, 246, 110, + 1, 166, 246, 110, 1, 209, 134, 246, 110, 1, 210, 94, 246, 110, 1, 249, 3, + 246, 110, 1, 248, 54, 246, 110, 1, 215, 229, 246, 110, 1, 172, 246, 110, + 1, 248, 159, 246, 110, 1, 168, 246, 110, 1, 167, 246, 110, 1, 177, 246, + 110, 1, 196, 157, 246, 110, 1, 202, 92, 246, 110, 1, 188, 246, 110, 1, + 144, 246, 110, 18, 3, 252, 33, 246, 110, 18, 3, 70, 246, 110, 18, 3, 223, + 224, 246, 110, 18, 3, 234, 150, 246, 110, 18, 3, 68, 246, 110, 18, 3, + 212, 0, 246, 110, 18, 3, 74, 246, 110, 18, 3, 251, 63, 246, 110, 18, 3, + 250, 8, 246, 110, 18, 3, 197, 104, 246, 110, 116, 3, 168, 246, 110, 116, + 3, 167, 246, 110, 116, 3, 177, 246, 110, 116, 3, 194, 169, 246, 110, 1, + 52, 222, 184, 246, 110, 1, 52, 232, 44, 246, 110, 1, 52, 214, 167, 246, + 110, 116, 3, 52, 214, 167, 246, 110, 1, 52, 246, 119, 246, 110, 1, 52, + 200, 228, 246, 110, 1, 52, 215, 151, 246, 110, 1, 52, 211, 93, 246, 110, + 1, 52, 193, 148, 246, 110, 1, 52, 150, 246, 110, 1, 52, 165, 246, 110, 1, + 52, 202, 95, 246, 110, 116, 3, 52, 218, 236, 246, 110, 116, 3, 52, 230, + 124, 246, 110, 17, 192, 76, 246, 110, 17, 101, 246, 110, 17, 104, 246, + 110, 17, 133, 246, 110, 17, 134, 246, 110, 17, 151, 246, 110, 17, 170, + 246, 110, 17, 179, 246, 110, 17, 174, 246, 110, 17, 182, 246, 110, 209, + 38, 202, 132, 246, 110, 209, 38, 237, 208, 246, 110, 209, 38, 55, 237, + 208, 246, 110, 209, 38, 198, 170, 237, 208, 79, 1, 221, 242, 231, 233, + 79, 1, 221, 242, 247, 19, 79, 1, 221, 242, 246, 117, 79, 1, 221, 242, + 223, 62, 79, 1, 221, 242, 223, 28, 79, 1, 221, 242, 212, 201, 79, 1, 221, + 242, 198, 83, 79, 1, 221, 242, 198, 71, 79, 1, 221, 242, 237, 161, 79, 1, + 221, 242, 237, 145, 79, 1, 221, 242, 237, 40, 79, 1, 221, 242, 181, 79, + 1, 221, 242, 188, 79, 1, 221, 242, 144, 79, 1, 221, 242, 229, 187, 79, 1, + 221, 242, 233, 97, 79, 73, 1, 221, 242, 207, 235, 79, 1, 221, 242, 193, + 209, 79, 1, 221, 242, 192, 112, 79, 1, 221, 242, 167, 79, 219, 92, 221, + 242, 212, 23, 79, 219, 92, 221, 242, 208, 190, 79, 219, 92, 221, 242, + 229, 98, 79, 16, 251, 49, 233, 203, 79, 16, 251, 49, 101, 79, 16, 251, + 49, 104, 79, 1, 251, 49, 167, 79, 3, 210, 255, 222, 96, 199, 18, 79, 3, + 53, 220, 154, 199, 16, 79, 3, 53, 220, 154, 199, 13, 79, 1, 203, 141, + 211, 46, 246, 117, 79, 1, 203, 141, 211, 46, 204, 64, 53, 196, 29, 1, + 132, 221, 113, 53, 196, 29, 1, 139, 221, 113, 53, 196, 29, 1, 132, 221, + 220, 53, 196, 29, 1, 139, 221, 220, 53, 196, 29, 1, 132, 221, 229, 53, + 196, 29, 1, 139, 221, 229, 53, 196, 29, 1, 132, 230, 254, 53, 196, 29, 1, + 139, 230, 254, 53, 196, 29, 1, 132, 214, 90, 53, 196, 29, 1, 139, 214, + 90, 53, 196, 29, 1, 132, 242, 63, 53, 196, 29, 1, 139, 242, 63, 53, 196, + 29, 1, 132, 242, 188, 53, 196, 29, 1, 139, 242, 188, 53, 196, 29, 1, 132, + 202, 212, 53, 196, 29, 1, 139, 202, 212, 53, 196, 29, 1, 132, 212, 165, + 53, 196, 29, 1, 139, 212, 165, 53, 196, 29, 1, 132, 236, 146, 53, 196, + 29, 1, 139, 236, 146, 53, 196, 29, 1, 132, 155, 53, 196, 29, 1, 139, 155, + 53, 196, 29, 1, 132, 199, 176, 53, 196, 29, 1, 139, 199, 176, 53, 196, + 29, 1, 132, 213, 142, 53, 196, 29, 1, 139, 213, 142, 53, 196, 29, 1, 132, + 247, 220, 53, 196, 29, 1, 139, 247, 220, 53, 196, 29, 1, 132, 209, 198, + 53, 196, 29, 1, 139, 209, 198, 53, 196, 29, 1, 132, 210, 65, 53, 196, 29, + 1, 139, 210, 65, 53, 196, 29, 1, 132, 232, 164, 53, 196, 29, 1, 139, 232, + 164, 53, 196, 29, 1, 132, 216, 91, 53, 196, 29, 1, 139, 216, 91, 53, 196, + 29, 1, 132, 193, 1, 53, 196, 29, 1, 139, 193, 1, 53, 196, 29, 1, 132, + 207, 55, 53, 196, 29, 1, 139, 207, 55, 53, 196, 29, 1, 132, 219, 107, 53, + 196, 29, 1, 139, 219, 107, 53, 196, 29, 1, 132, 195, 252, 53, 196, 29, 1, + 139, 195, 252, 53, 196, 29, 1, 132, 229, 43, 53, 196, 29, 1, 139, 229, + 43, 53, 196, 29, 1, 132, 74, 53, 196, 29, 1, 139, 74, 53, 196, 29, 217, + 181, 222, 117, 53, 196, 29, 18, 252, 33, 53, 196, 29, 18, 70, 53, 196, + 29, 18, 197, 104, 53, 196, 29, 18, 68, 53, 196, 29, 18, 71, 53, 196, 29, + 18, 74, 53, 196, 29, 217, 181, 221, 223, 53, 196, 29, 18, 228, 58, 53, + 196, 29, 18, 197, 103, 53, 196, 29, 18, 197, 119, 53, 196, 29, 18, 250, + 6, 53, 196, 29, 18, 249, 236, 53, 196, 29, 18, 250, 224, 53, 196, 29, 18, + 250, 241, 53, 196, 29, 158, 217, 181, 234, 131, 53, 196, 29, 158, 217, + 181, 212, 243, 53, 196, 29, 158, 217, 181, 199, 176, 53, 196, 29, 158, + 217, 181, 202, 185, 53, 196, 29, 16, 221, 91, 53, 196, 29, 16, 212, 243, + 53, 196, 29, 16, 206, 50, 53, 196, 29, 16, 229, 44, 229, 30, 53, 196, 29, + 16, 221, 102, 221, 101, 217, 23, 217, 89, 1, 71, 217, 23, 217, 89, 1, 74, + 217, 23, 217, 89, 1, 246, 117, 217, 23, 217, 89, 1, 212, 201, 217, 23, + 217, 89, 1, 198, 83, 217, 23, 217, 89, 1, 198, 71, 217, 23, 217, 89, 1, + 237, 161, 217, 23, 217, 89, 1, 237, 145, 217, 23, 217, 89, 1, 213, 178, + 217, 23, 217, 89, 1, 204, 64, 217, 23, 217, 89, 1, 202, 92, 217, 23, 217, + 89, 18, 3, 223, 224, 217, 23, 217, 89, 18, 3, 196, 251, 217, 23, 217, 89, + 18, 3, 251, 253, 217, 23, 217, 89, 18, 3, 250, 8, 217, 23, 217, 89, 18, + 3, 251, 245, 217, 23, 217, 89, 242, 234, 217, 23, 217, 89, 251, 69, 221, + 211, 217, 23, 217, 89, 250, 197, 217, 23, 217, 89, 5, 207, 196, 77, 217, + 23, 217, 89, 194, 11, 207, 196, 77, 217, 23, 217, 89, 18, 3, 196, 6, 217, + 23, 217, 89, 196, 11, 36, 5, 198, 64, 36, 5, 198, 67, 36, 5, 198, 70, 36, + 5, 198, 68, 36, 5, 198, 69, 36, 5, 198, 66, 36, 5, 237, 139, 36, 5, 237, + 141, 36, 5, 237, 144, 36, 5, 237, 142, 36, 5, 237, 143, 36, 5, 237, 140, + 36, 5, 235, 4, 36, 5, 235, 8, 36, 5, 235, 16, 36, 5, 235, 13, 36, 5, 235, + 14, 36, 5, 235, 5, 36, 5, 246, 172, 36, 5, 246, 166, 36, 5, 246, 168, 36, + 5, 246, 171, 36, 5, 246, 169, 36, 5, 246, 170, 36, 5, 246, 167, 36, 5, + 248, 159, 36, 5, 248, 138, 36, 5, 248, 150, 36, 5, 248, 158, 36, 5, 248, + 153, 36, 5, 248, 154, 36, 5, 248, 142, 8, 2, 1, 248, 188, 250, 252, 8, 2, + 1, 41, 207, 166, 8, 2, 1, 247, 244, 71, 8, 2, 1, 248, 188, 71, 8, 2, 1, + 234, 253, 4, 232, 177, 8, 2, 1, 219, 249, 233, 163, 8, 2, 1, 27, 232, 45, + 4, 238, 178, 8, 2, 1, 220, 202, 4, 223, 121, 220, 49, 206, 158, 8, 2, 1, + 220, 202, 4, 55, 85, 199, 90, 8, 2, 1, 220, 202, 4, 85, 207, 81, 8, 2, 1, + 218, 237, 4, 238, 178, 8, 2, 1, 215, 152, 4, 238, 178, 8, 2, 1, 234, 74, + 4, 238, 178, 8, 2, 1, 247, 244, 74, 8, 2, 1, 247, 244, 185, 4, 111, 8, 2, + 1, 211, 184, 185, 4, 111, 8, 2, 1, 223, 121, 212, 0, 8, 2, 1, 163, 212, + 1, 4, 111, 8, 2, 1, 163, 212, 1, 4, 229, 5, 111, 8, 2, 1, 163, 185, 211, + 179, 8, 2, 1, 163, 185, 211, 180, 4, 111, 8, 2, 1, 201, 243, 150, 8, 1, + 2, 6, 208, 112, 4, 51, 220, 16, 8, 2, 1, 208, 112, 194, 39, 230, 40, 8, + 2, 1, 55, 150, 8, 2, 1, 208, 112, 4, 238, 178, 8, 2, 1, 55, 208, 112, 4, + 238, 178, 8, 2, 1, 27, 150, 8, 2, 1, 27, 208, 112, 4, 207, 81, 8, 2, 1, + 248, 178, 233, 255, 8, 2, 1, 124, 4, 203, 195, 51, 220, 16, 8, 2, 1, 124, + 248, 194, 4, 203, 195, 51, 220, 16, 8, 2, 1, 197, 95, 8, 2, 1, 163, 197, + 95, 8, 2, 1, 124, 4, 46, 128, 8, 2, 1, 242, 215, 8, 2, 1, 242, 216, 4, + 132, 51, 207, 81, 8, 2, 1, 242, 216, 4, 132, 46, 204, 160, 8, 2, 1, 193, + 224, 4, 132, 51, 207, 81, 8, 2, 1, 193, 224, 4, 184, 46, 220, 16, 8, 2, + 1, 193, 224, 4, 184, 46, 220, 17, 26, 132, 51, 207, 81, 8, 2, 1, 193, + 224, 4, 184, 46, 220, 17, 4, 204, 160, 8, 2, 1, 193, 149, 4, 203, 195, + 51, 220, 16, 73, 247, 151, 4, 223, 121, 247, 150, 73, 1, 2, 229, 206, 73, + 1, 2, 220, 202, 4, 223, 121, 220, 49, 206, 158, 73, 1, 2, 220, 202, 4, + 85, 199, 90, 73, 1, 2, 124, 4, 46, 128, 8, 2, 1, 206, 68, 193, 84, 8, 2, + 1, 223, 109, 71, 8, 2, 1, 211, 184, 212, 0, 8, 2, 1, 197, 46, 8, 2, 1, + 223, 121, 250, 252, 33, 1, 2, 6, 211, 216, 8, 2, 1, 235, 19, 236, 231, 4, + 207, 174, 128, 8, 2, 1, 198, 120, 236, 231, 4, 207, 174, 128, 8, 2, 1, + 163, 208, 112, 4, 85, 199, 90, 73, 1, 2, 163, 194, 202, 73, 1, 46, 200, + 159, 73, 1, 51, 200, 159, 99, 2, 1, 64, 99, 2, 1, 71, 99, 2, 1, 70, 99, + 2, 1, 74, 99, 2, 1, 68, 99, 2, 1, 196, 236, 99, 2, 1, 231, 233, 99, 2, 1, + 160, 99, 2, 1, 231, 158, 99, 2, 1, 231, 46, 99, 2, 1, 230, 254, 99, 2, 1, + 230, 186, 99, 2, 1, 230, 146, 99, 2, 1, 144, 99, 2, 1, 229, 255, 99, 2, + 1, 229, 178, 99, 2, 1, 229, 43, 99, 2, 1, 228, 181, 99, 2, 1, 228, 148, + 99, 2, 1, 177, 99, 2, 1, 220, 42, 99, 2, 1, 219, 209, 99, 2, 1, 219, 107, + 99, 2, 1, 219, 36, 99, 2, 1, 219, 4, 99, 2, 1, 172, 99, 2, 1, 217, 48, + 99, 2, 1, 216, 175, 99, 2, 1, 216, 91, 99, 2, 1, 215, 241, 99, 2, 1, 181, + 99, 2, 1, 229, 67, 99, 2, 1, 215, 71, 99, 2, 1, 214, 214, 99, 2, 1, 214, + 60, 99, 2, 1, 213, 142, 99, 2, 1, 213, 22, 99, 2, 1, 212, 212, 99, 2, 1, + 208, 176, 99, 2, 1, 208, 162, 99, 2, 1, 208, 155, 99, 2, 1, 208, 145, 99, + 2, 1, 208, 134, 99, 2, 1, 208, 132, 99, 2, 1, 188, 99, 2, 1, 206, 158, + 99, 2, 1, 205, 223, 99, 2, 1, 203, 125, 99, 2, 1, 202, 212, 99, 2, 1, + 201, 184, 99, 2, 1, 201, 84, 99, 2, 1, 238, 0, 99, 2, 1, 189, 99, 2, 1, + 237, 116, 99, 2, 1, 200, 79, 99, 2, 1, 237, 16, 99, 2, 1, 199, 128, 99, + 2, 1, 236, 146, 99, 2, 1, 235, 62, 99, 2, 1, 235, 31, 99, 2, 1, 236, 158, + 99, 2, 1, 199, 53, 99, 2, 1, 199, 52, 99, 2, 1, 199, 41, 99, 2, 1, 199, + 40, 99, 2, 1, 199, 39, 99, 2, 1, 199, 38, 99, 2, 1, 198, 118, 99, 2, 1, + 198, 112, 99, 2, 1, 198, 97, 99, 2, 1, 198, 95, 99, 2, 1, 198, 91, 99, 2, + 1, 198, 90, 99, 2, 1, 194, 169, 99, 2, 1, 194, 111, 99, 2, 1, 194, 72, + 99, 2, 1, 194, 36, 99, 2, 1, 193, 244, 99, 2, 1, 193, 231, 99, 2, 1, 168, + 217, 23, 217, 89, 1, 221, 98, 217, 23, 217, 89, 1, 206, 50, 217, 23, 217, + 89, 1, 220, 155, 217, 23, 217, 89, 1, 216, 102, 217, 23, 217, 89, 1, 166, + 217, 23, 217, 89, 1, 181, 217, 23, 217, 89, 1, 242, 207, 217, 23, 217, + 89, 1, 199, 92, 217, 23, 217, 89, 1, 221, 214, 217, 23, 217, 89, 1, 214, + 80, 217, 23, 217, 89, 1, 199, 167, 217, 23, 217, 89, 1, 194, 157, 217, + 23, 217, 89, 1, 193, 95, 217, 23, 217, 89, 1, 228, 169, 217, 23, 217, 89, + 1, 197, 77, 217, 23, 217, 89, 1, 70, 217, 23, 217, 89, 1, 210, 88, 217, + 23, 217, 89, 1, 250, 19, 217, 23, 217, 89, 1, 230, 246, 217, 23, 217, 89, + 1, 223, 26, 217, 23, 217, 89, 1, 208, 48, 217, 23, 217, 89, 1, 249, 3, + 217, 23, 217, 89, 1, 223, 10, 217, 23, 217, 89, 1, 236, 229, 217, 23, + 217, 89, 1, 231, 53, 217, 23, 217, 89, 1, 237, 18, 217, 23, 217, 89, 1, + 248, 51, 217, 23, 217, 89, 1, 221, 99, 219, 74, 217, 23, 217, 89, 1, 220, + 156, 219, 74, 217, 23, 217, 89, 1, 216, 103, 219, 74, 217, 23, 217, 89, + 1, 211, 78, 219, 74, 217, 23, 217, 89, 1, 215, 97, 219, 74, 217, 23, 217, + 89, 1, 199, 93, 219, 74, 217, 23, 217, 89, 1, 214, 81, 219, 74, 217, 23, + 217, 89, 1, 228, 97, 219, 74, 217, 23, 217, 89, 18, 3, 211, 209, 217, 23, + 217, 89, 18, 3, 223, 188, 217, 23, 217, 89, 18, 3, 250, 222, 217, 23, + 217, 89, 18, 3, 193, 58, 217, 23, 217, 89, 18, 3, 202, 175, 217, 23, 217, + 89, 18, 3, 197, 74, 217, 23, 217, 89, 18, 3, 242, 232, 217, 23, 217, 89, + 18, 3, 212, 227, 217, 23, 217, 89, 242, 233, 217, 23, 217, 89, 219, 20, + 223, 71, 217, 23, 217, 89, 250, 136, 223, 71, 217, 23, 217, 89, 17, 192, + 76, 217, 23, 217, 89, 17, 101, 217, 23, 217, 89, 17, 104, 217, 23, 217, + 89, 17, 133, 217, 23, 217, 89, 17, 134, 217, 23, 217, 89, 17, 151, 217, + 23, 217, 89, 17, 170, 217, 23, 217, 89, 17, 179, 217, 23, 217, 89, 17, + 174, 217, 23, 217, 89, 17, 182, 30, 222, 206, 212, 103, 30, 222, 206, + 212, 108, 30, 222, 206, 192, 250, 30, 222, 206, 192, 249, 30, 222, 206, + 192, 248, 30, 222, 206, 197, 169, 30, 222, 206, 197, 173, 30, 222, 206, + 192, 208, 30, 222, 206, 192, 204, 30, 222, 206, 233, 229, 30, 222, 206, + 233, 227, 30, 222, 206, 233, 228, 30, 222, 206, 233, 225, 30, 222, 206, + 228, 83, 30, 222, 206, 228, 82, 30, 222, 206, 228, 80, 30, 222, 206, 228, + 81, 30, 222, 206, 228, 86, 30, 222, 206, 228, 79, 30, 222, 206, 228, 78, + 30, 222, 206, 228, 88, 30, 222, 206, 250, 122, 30, 222, 206, 250, 121, + 30, 123, 214, 38, 30, 123, 214, 44, 30, 123, 202, 73, 30, 123, 202, 72, + 30, 123, 199, 98, 30, 123, 199, 96, 30, 123, 199, 95, 30, 123, 199, 101, + 30, 123, 199, 102, 30, 123, 199, 94, 30, 123, 207, 112, 30, 123, 207, + 127, 30, 123, 202, 79, 30, 123, 207, 124, 30, 123, 207, 114, 30, 123, + 207, 116, 30, 123, 207, 103, 30, 123, 207, 104, 30, 123, 222, 102, 30, + 123, 216, 148, 30, 123, 216, 142, 30, 123, 202, 83, 30, 123, 216, 145, + 30, 123, 216, 151, 30, 123, 210, 17, 30, 123, 210, 26, 30, 123, 210, 30, + 30, 123, 202, 81, 30, 123, 210, 20, 30, 123, 210, 34, 30, 123, 210, 35, + 30, 123, 203, 56, 30, 123, 203, 59, 30, 123, 202, 77, 30, 123, 202, 75, + 30, 123, 203, 54, 30, 123, 203, 62, 30, 123, 203, 63, 30, 123, 203, 48, + 30, 123, 203, 61, 30, 123, 211, 6, 30, 123, 211, 7, 30, 123, 193, 42, 30, + 123, 193, 45, 30, 123, 242, 142, 30, 123, 242, 141, 30, 123, 202, 88, 30, + 123, 210, 72, 30, 123, 210, 71, 12, 15, 225, 215, 12, 15, 225, 214, 12, + 15, 225, 213, 12, 15, 225, 212, 12, 15, 225, 211, 12, 15, 225, 210, 12, + 15, 225, 209, 12, 15, 225, 208, 12, 15, 225, 207, 12, 15, 225, 206, 12, + 15, 225, 205, 12, 15, 225, 204, 12, 15, 225, 203, 12, 15, 225, 202, 12, + 15, 225, 201, 12, 15, 225, 200, 12, 15, 225, 199, 12, 15, 225, 198, 12, + 15, 225, 197, 12, 15, 225, 196, 12, 15, 225, 195, 12, 15, 225, 194, 12, + 15, 225, 193, 12, 15, 225, 192, 12, 15, 225, 191, 12, 15, 225, 190, 12, + 15, 225, 189, 12, 15, 225, 188, 12, 15, 225, 187, 12, 15, 225, 186, 12, + 15, 225, 185, 12, 15, 225, 184, 12, 15, 225, 183, 12, 15, 225, 182, 12, + 15, 225, 181, 12, 15, 225, 180, 12, 15, 225, 179, 12, 15, 225, 178, 12, + 15, 225, 177, 12, 15, 225, 176, 12, 15, 225, 175, 12, 15, 225, 174, 12, + 15, 225, 173, 12, 15, 225, 172, 12, 15, 225, 171, 12, 15, 225, 170, 12, + 15, 225, 169, 12, 15, 225, 168, 12, 15, 225, 167, 12, 15, 225, 166, 12, + 15, 225, 165, 12, 15, 225, 164, 12, 15, 225, 163, 12, 15, 225, 162, 12, + 15, 225, 161, 12, 15, 225, 160, 12, 15, 225, 159, 12, 15, 225, 158, 12, + 15, 225, 157, 12, 15, 225, 156, 12, 15, 225, 155, 12, 15, 225, 154, 12, + 15, 225, 153, 12, 15, 225, 152, 12, 15, 225, 151, 12, 15, 225, 150, 12, + 15, 225, 149, 12, 15, 225, 148, 12, 15, 225, 147, 12, 15, 225, 146, 12, + 15, 225, 145, 12, 15, 225, 144, 12, 15, 225, 143, 12, 15, 225, 142, 12, + 15, 225, 141, 12, 15, 225, 140, 12, 15, 225, 139, 12, 15, 225, 138, 12, + 15, 225, 137, 12, 15, 225, 136, 12, 15, 225, 135, 12, 15, 225, 134, 12, + 15, 225, 133, 12, 15, 225, 132, 12, 15, 225, 131, 12, 15, 225, 130, 12, + 15, 225, 129, 12, 15, 225, 128, 12, 15, 225, 127, 12, 15, 225, 126, 12, + 15, 225, 125, 12, 15, 225, 124, 12, 15, 225, 123, 12, 15, 225, 122, 12, + 15, 225, 121, 12, 15, 225, 120, 12, 15, 225, 119, 12, 15, 225, 118, 12, + 15, 225, 117, 12, 15, 225, 116, 12, 15, 225, 115, 12, 15, 225, 114, 12, + 15, 225, 113, 12, 15, 225, 112, 12, 15, 225, 111, 12, 15, 225, 110, 12, + 15, 225, 109, 12, 15, 225, 108, 12, 15, 225, 107, 12, 15, 225, 106, 12, + 15, 225, 105, 12, 15, 225, 104, 12, 15, 225, 103, 12, 15, 225, 102, 12, + 15, 225, 101, 12, 15, 225, 100, 12, 15, 225, 99, 12, 15, 225, 98, 12, 15, + 225, 97, 12, 15, 225, 96, 12, 15, 225, 95, 12, 15, 225, 94, 12, 15, 225, + 93, 12, 15, 225, 92, 12, 15, 225, 91, 12, 15, 225, 90, 12, 15, 225, 89, + 12, 15, 225, 88, 12, 15, 225, 87, 12, 15, 225, 86, 12, 15, 225, 85, 12, + 15, 225, 84, 12, 15, 225, 83, 12, 15, 225, 82, 12, 15, 225, 81, 12, 15, + 225, 80, 12, 15, 225, 79, 12, 15, 225, 78, 12, 15, 225, 77, 12, 15, 225, + 76, 12, 15, 225, 75, 12, 15, 225, 74, 12, 15, 225, 73, 12, 15, 225, 72, + 12, 15, 225, 71, 12, 15, 225, 70, 12, 15, 225, 69, 12, 15, 225, 68, 12, + 15, 225, 67, 12, 15, 225, 66, 12, 15, 225, 65, 12, 15, 225, 64, 12, 15, + 225, 63, 12, 15, 225, 62, 12, 15, 225, 61, 12, 15, 225, 60, 12, 15, 225, + 59, 12, 15, 225, 58, 12, 15, 225, 57, 12, 15, 225, 56, 12, 15, 225, 55, + 12, 15, 225, 54, 12, 15, 225, 53, 12, 15, 225, 52, 12, 15, 225, 51, 12, + 15, 225, 50, 12, 15, 225, 49, 12, 15, 225, 48, 12, 15, 225, 47, 12, 15, + 225, 46, 12, 15, 225, 45, 12, 15, 225, 44, 12, 15, 225, 43, 12, 15, 225, + 42, 12, 15, 225, 41, 12, 15, 225, 40, 12, 15, 225, 39, 12, 15, 225, 38, + 12, 15, 225, 37, 12, 15, 225, 36, 12, 15, 225, 35, 12, 15, 225, 34, 12, + 15, 225, 33, 12, 15, 225, 32, 12, 15, 225, 31, 12, 15, 225, 30, 12, 15, + 225, 29, 12, 15, 225, 28, 12, 15, 225, 27, 12, 15, 225, 26, 12, 15, 225, + 25, 12, 15, 225, 24, 12, 15, 225, 23, 12, 15, 225, 22, 12, 15, 225, 21, + 12, 15, 225, 20, 12, 15, 225, 19, 12, 15, 225, 18, 12, 15, 225, 17, 12, + 15, 225, 16, 12, 15, 225, 15, 12, 15, 225, 14, 12, 15, 225, 13, 12, 15, + 225, 12, 12, 15, 225, 11, 12, 15, 225, 10, 12, 15, 225, 9, 12, 15, 225, + 8, 12, 15, 225, 7, 12, 15, 225, 6, 12, 15, 225, 5, 12, 15, 225, 4, 12, + 15, 225, 3, 12, 15, 225, 2, 12, 15, 225, 1, 12, 15, 225, 0, 12, 15, 224, + 255, 12, 15, 224, 254, 12, 15, 224, 253, 12, 15, 224, 252, 12, 15, 224, + 251, 12, 15, 224, 250, 12, 15, 224, 249, 12, 15, 224, 248, 12, 15, 224, + 247, 12, 15, 224, 246, 12, 15, 224, 245, 12, 15, 224, 244, 12, 15, 224, + 243, 12, 15, 224, 242, 12, 15, 224, 241, 12, 15, 224, 240, 12, 15, 224, + 239, 12, 15, 224, 238, 12, 15, 224, 237, 12, 15, 224, 236, 12, 15, 224, + 235, 12, 15, 224, 234, 12, 15, 224, 233, 12, 15, 224, 232, 12, 15, 224, + 231, 12, 15, 224, 230, 12, 15, 224, 229, 12, 15, 224, 228, 12, 15, 224, + 227, 12, 15, 224, 226, 12, 15, 224, 225, 12, 15, 224, 224, 12, 15, 224, + 223, 12, 15, 224, 222, 12, 15, 224, 221, 12, 15, 224, 220, 12, 15, 224, + 219, 12, 15, 224, 218, 12, 15, 224, 217, 12, 15, 224, 216, 12, 15, 224, + 215, 12, 15, 224, 214, 12, 15, 224, 213, 12, 15, 224, 212, 12, 15, 224, + 211, 12, 15, 224, 210, 12, 15, 224, 209, 12, 15, 224, 208, 12, 15, 224, + 207, 12, 15, 224, 206, 12, 15, 224, 205, 12, 15, 224, 204, 12, 15, 224, + 203, 12, 15, 224, 202, 12, 15, 224, 201, 12, 15, 224, 200, 12, 15, 224, + 199, 12, 15, 224, 198, 12, 15, 224, 197, 12, 15, 224, 196, 12, 15, 224, + 195, 12, 15, 224, 194, 12, 15, 224, 193, 12, 15, 224, 192, 12, 15, 224, + 191, 12, 15, 224, 190, 12, 15, 224, 189, 12, 15, 224, 188, 12, 15, 224, + 187, 12, 15, 224, 186, 12, 15, 224, 185, 12, 15, 224, 184, 12, 15, 224, + 183, 12, 15, 224, 182, 12, 15, 224, 181, 12, 15, 224, 180, 12, 15, 224, + 179, 12, 15, 224, 178, 12, 15, 224, 177, 12, 15, 224, 176, 12, 15, 224, + 175, 12, 15, 224, 174, 12, 15, 224, 173, 12, 15, 224, 172, 12, 15, 224, + 171, 12, 15, 224, 170, 12, 15, 224, 169, 12, 15, 224, 168, 12, 15, 224, + 167, 12, 15, 224, 166, 12, 15, 224, 165, 12, 15, 224, 164, 12, 15, 224, + 163, 12, 15, 224, 162, 12, 15, 224, 161, 12, 15, 224, 160, 12, 15, 224, + 159, 12, 15, 224, 158, 12, 15, 224, 157, 12, 15, 224, 156, 12, 15, 224, + 155, 12, 15, 224, 154, 12, 15, 224, 153, 12, 15, 224, 152, 12, 15, 224, + 151, 12, 15, 224, 150, 12, 15, 224, 149, 12, 15, 224, 148, 12, 15, 224, + 147, 12, 15, 224, 146, 12, 15, 224, 145, 12, 15, 224, 144, 12, 15, 224, + 143, 12, 15, 224, 142, 12, 15, 224, 141, 12, 15, 224, 140, 12, 15, 224, + 139, 12, 15, 224, 138, 12, 15, 224, 137, 12, 15, 224, 136, 12, 15, 224, + 135, 12, 15, 224, 134, 12, 15, 224, 133, 12, 15, 224, 132, 12, 15, 224, + 131, 12, 15, 224, 130, 12, 15, 224, 129, 12, 15, 224, 128, 12, 15, 224, + 127, 12, 15, 224, 126, 12, 15, 224, 125, 12, 15, 224, 124, 12, 15, 224, + 123, 12, 15, 224, 122, 12, 15, 224, 121, 12, 15, 224, 120, 12, 15, 224, + 119, 12, 15, 224, 118, 12, 15, 224, 117, 12, 15, 224, 116, 12, 15, 224, + 115, 12, 15, 224, 114, 12, 15, 224, 113, 12, 15, 224, 112, 12, 15, 224, + 111, 12, 15, 224, 110, 12, 15, 224, 109, 12, 15, 224, 108, 12, 15, 224, + 107, 12, 15, 224, 106, 12, 15, 224, 105, 12, 15, 224, 104, 12, 15, 224, + 103, 12, 15, 224, 102, 12, 15, 224, 101, 12, 15, 224, 100, 12, 15, 224, + 99, 12, 15, 224, 98, 12, 15, 224, 97, 12, 15, 224, 96, 12, 15, 224, 95, + 12, 15, 224, 94, 12, 15, 224, 93, 12, 15, 224, 92, 12, 15, 224, 91, 12, + 15, 224, 90, 12, 15, 224, 89, 12, 15, 224, 88, 12, 15, 224, 87, 12, 15, + 224, 86, 12, 15, 224, 85, 12, 15, 224, 84, 12, 15, 224, 83, 12, 15, 224, + 82, 12, 15, 224, 81, 12, 15, 224, 80, 12, 15, 224, 79, 12, 15, 224, 78, + 12, 15, 224, 77, 12, 15, 224, 76, 12, 15, 224, 75, 12, 15, 224, 74, 12, + 15, 224, 73, 12, 15, 224, 72, 12, 15, 224, 71, 12, 15, 224, 70, 12, 15, + 224, 69, 12, 15, 224, 68, 12, 15, 224, 67, 12, 15, 224, 66, 12, 15, 224, + 65, 12, 15, 224, 64, 12, 15, 224, 63, 12, 15, 224, 62, 12, 15, 224, 61, + 12, 15, 224, 60, 12, 15, 224, 59, 12, 15, 224, 58, 12, 15, 224, 57, 12, + 15, 224, 56, 12, 15, 224, 55, 12, 15, 224, 54, 12, 15, 224, 53, 12, 15, + 224, 52, 12, 15, 224, 51, 12, 15, 224, 50, 12, 15, 224, 49, 12, 15, 224, + 48, 12, 15, 224, 47, 12, 15, 224, 46, 12, 15, 224, 45, 12, 15, 224, 44, + 12, 15, 224, 43, 12, 15, 224, 42, 12, 15, 224, 41, 12, 15, 224, 40, 12, + 15, 224, 39, 12, 15, 224, 38, 12, 15, 224, 37, 12, 15, 224, 36, 12, 15, + 224, 35, 12, 15, 224, 34, 12, 15, 224, 33, 12, 15, 224, 32, 12, 15, 224, + 31, 12, 15, 224, 30, 12, 15, 224, 29, 12, 15, 224, 28, 12, 15, 224, 27, + 12, 15, 224, 26, 12, 15, 224, 25, 12, 15, 224, 24, 12, 15, 224, 23, 12, + 15, 224, 22, 12, 15, 224, 21, 12, 15, 224, 20, 12, 15, 224, 19, 12, 15, + 224, 18, 12, 15, 224, 17, 12, 15, 224, 16, 12, 15, 224, 15, 12, 15, 224, + 14, 12, 15, 224, 13, 12, 15, 224, 12, 12, 15, 224, 11, 12, 15, 224, 10, + 12, 15, 224, 9, 12, 15, 224, 8, 12, 15, 224, 7, 12, 15, 224, 6, 12, 15, + 224, 5, 12, 15, 224, 4, 12, 15, 224, 3, 12, 15, 224, 2, 12, 15, 224, 1, + 12, 15, 224, 0, 8, 2, 34, 233, 15, 8, 2, 34, 233, 11, 8, 2, 34, 232, 209, + 8, 2, 34, 233, 14, 8, 2, 34, 233, 13, 8, 2, 34, 184, 206, 159, 200, 228, + 8, 2, 34, 202, 35, 250, 91, 2, 34, 217, 6, 213, 96, 250, 91, 2, 34, 217, + 6, 234, 177, 250, 91, 2, 34, 217, 6, 223, 159, 250, 91, 2, 34, 196, 45, + 213, 96, 250, 91, 2, 34, 217, 6, 193, 201, 129, 1, 192, 240, 4, 229, 139, + 129, 209, 192, 222, 213, 196, 135, 129, 34, 193, 20, 192, 240, 192, 240, + 210, 205, 129, 1, 250, 244, 249, 231, 129, 1, 194, 64, 251, 26, 129, 1, + 194, 64, 237, 221, 129, 1, 194, 64, 229, 255, 129, 1, 194, 64, 222, 139, + 129, 1, 194, 64, 220, 86, 129, 1, 194, 64, 52, 217, 12, 129, 1, 194, 64, + 207, 188, 129, 1, 194, 64, 200, 96, 129, 1, 250, 244, 102, 57, 129, 1, + 203, 225, 4, 203, 225, 236, 114, 129, 1, 203, 225, 4, 203, 79, 236, 114, + 129, 1, 203, 225, 4, 237, 241, 26, 203, 225, 236, 114, 129, 1, 203, 225, + 4, 237, 241, 26, 203, 79, 236, 114, 129, 1, 157, 4, 210, 205, 129, 1, + 157, 4, 208, 227, 129, 1, 157, 4, 217, 140, 129, 1, 248, 66, 4, 237, 240, + 129, 1, 231, 32, 4, 237, 240, 129, 1, 237, 222, 4, 237, 240, 129, 1, 230, + 0, 4, 217, 140, 129, 1, 196, 128, 4, 237, 240, 129, 1, 192, 90, 4, 237, + 240, 129, 1, 200, 9, 4, 237, 240, 129, 1, 192, 240, 4, 237, 240, 129, 1, + 52, 222, 140, 4, 237, 240, 129, 1, 222, 140, 4, 237, 240, 129, 1, 220, + 87, 4, 237, 240, 129, 1, 217, 13, 4, 237, 240, 129, 1, 212, 231, 4, 237, + 240, 129, 1, 206, 47, 4, 237, 240, 129, 1, 52, 210, 182, 4, 237, 240, + 129, 1, 210, 182, 4, 237, 240, 129, 1, 198, 114, 4, 237, 240, 129, 1, + 208, 187, 4, 237, 240, 129, 1, 207, 189, 4, 237, 240, 129, 1, 203, 225, + 4, 237, 240, 129, 1, 200, 97, 4, 237, 240, 129, 1, 196, 128, 4, 229, 27, + 129, 1, 248, 66, 4, 208, 51, 129, 1, 222, 140, 4, 208, 51, 129, 1, 210, + 182, 4, 208, 51, 129, 34, 157, 220, 86, 9, 1, 157, 194, 137, 72, 20, 9, + 1, 157, 194, 137, 52, 20, 9, 1, 248, 107, 72, 20, 9, 1, 248, 107, 52, 20, + 9, 1, 248, 107, 88, 20, 9, 1, 248, 107, 217, 35, 20, 9, 1, 210, 162, 72, + 20, 9, 1, 210, 162, 52, 20, 9, 1, 210, 162, 88, 20, 9, 1, 210, 162, 217, + 35, 20, 9, 1, 248, 95, 72, 20, 9, 1, 248, 95, 52, 20, 9, 1, 248, 95, 88, + 20, 9, 1, 248, 95, 217, 35, 20, 9, 1, 198, 74, 72, 20, 9, 1, 198, 74, 52, + 20, 9, 1, 198, 74, 88, 20, 9, 1, 198, 74, 217, 35, 20, 9, 1, 200, 48, 72, + 20, 9, 1, 200, 48, 52, 20, 9, 1, 200, 48, 88, 20, 9, 1, 200, 48, 217, 35, + 20, 9, 1, 198, 76, 72, 20, 9, 1, 198, 76, 52, 20, 9, 1, 198, 76, 88, 20, + 9, 1, 198, 76, 217, 35, 20, 9, 1, 196, 117, 72, 20, 9, 1, 196, 117, 52, + 20, 9, 1, 196, 117, 88, 20, 9, 1, 196, 117, 217, 35, 20, 9, 1, 210, 160, + 72, 20, 9, 1, 210, 160, 52, 20, 9, 1, 210, 160, 88, 20, 9, 1, 210, 160, + 217, 35, 20, 9, 1, 235, 24, 72, 20, 9, 1, 235, 24, 52, 20, 9, 1, 235, 24, + 88, 20, 9, 1, 235, 24, 217, 35, 20, 9, 1, 212, 188, 72, 20, 9, 1, 212, + 188, 52, 20, 9, 1, 212, 188, 88, 20, 9, 1, 212, 188, 217, 35, 20, 9, 1, + 200, 84, 72, 20, 9, 1, 200, 84, 52, 20, 9, 1, 200, 84, 88, 20, 9, 1, 200, + 84, 217, 35, 20, 9, 1, 200, 82, 72, 20, 9, 1, 200, 82, 52, 20, 9, 1, 200, + 82, 88, 20, 9, 1, 200, 82, 217, 35, 20, 9, 1, 237, 159, 72, 20, 9, 1, + 237, 159, 52, 20, 9, 1, 237, 235, 72, 20, 9, 1, 237, 235, 52, 20, 9, 1, + 235, 53, 72, 20, 9, 1, 235, 53, 52, 20, 9, 1, 237, 157, 72, 20, 9, 1, + 237, 157, 52, 20, 9, 1, 223, 35, 72, 20, 9, 1, 223, 35, 52, 20, 9, 1, + 206, 252, 72, 20, 9, 1, 206, 252, 52, 20, 9, 1, 222, 40, 72, 20, 9, 1, + 222, 40, 52, 20, 9, 1, 222, 40, 88, 20, 9, 1, 222, 40, 217, 35, 20, 9, 1, + 231, 221, 72, 20, 9, 1, 231, 221, 52, 20, 9, 1, 231, 221, 88, 20, 9, 1, + 231, 221, 217, 35, 20, 9, 1, 230, 174, 72, 20, 9, 1, 230, 174, 52, 20, 9, + 1, 230, 174, 88, 20, 9, 1, 230, 174, 217, 35, 20, 9, 1, 214, 89, 72, 20, + 9, 1, 214, 89, 52, 20, 9, 1, 214, 89, 88, 20, 9, 1, 214, 89, 217, 35, 20, + 9, 1, 213, 124, 231, 51, 72, 20, 9, 1, 213, 124, 231, 51, 52, 20, 9, 1, + 207, 59, 72, 20, 9, 1, 207, 59, 52, 20, 9, 1, 207, 59, 88, 20, 9, 1, 207, + 59, 217, 35, 20, 9, 1, 229, 221, 4, 97, 95, 72, 20, 9, 1, 229, 221, 4, + 97, 95, 52, 20, 9, 1, 229, 221, 230, 252, 72, 20, 9, 1, 229, 221, 230, + 252, 52, 20, 9, 1, 229, 221, 230, 252, 88, 20, 9, 1, 229, 221, 230, 252, + 217, 35, 20, 9, 1, 229, 221, 236, 143, 72, 20, 9, 1, 229, 221, 236, 143, + 52, 20, 9, 1, 229, 221, 236, 143, 88, 20, 9, 1, 229, 221, 236, 143, 217, + 35, 20, 9, 1, 97, 248, 187, 72, 20, 9, 1, 97, 248, 187, 52, 20, 9, 1, 97, + 248, 187, 4, 230, 67, 95, 72, 20, 9, 1, 97, 248, 187, 4, 230, 67, 95, 52, + 20, 9, 16, 78, 58, 9, 16, 78, 63, 9, 16, 103, 236, 112, 58, 9, 16, 103, + 236, 112, 63, 9, 16, 112, 236, 112, 58, 9, 16, 112, 236, 112, 63, 9, 16, + 112, 236, 112, 209, 188, 235, 92, 58, 9, 16, 112, 236, 112, 209, 188, + 235, 92, 63, 9, 16, 232, 119, 236, 112, 58, 9, 16, 232, 119, 236, 112, + 63, 9, 16, 55, 84, 248, 194, 63, 9, 16, 103, 236, 112, 196, 55, 58, 9, + 16, 103, 236, 112, 196, 55, 63, 9, 16, 207, 81, 9, 16, 2, 200, 152, 58, + 9, 16, 2, 200, 152, 63, 9, 1, 214, 168, 72, 20, 9, 1, 214, 168, 52, 20, + 9, 1, 214, 168, 88, 20, 9, 1, 214, 168, 217, 35, 20, 9, 1, 124, 72, 20, + 9, 1, 124, 52, 20, 9, 1, 212, 1, 72, 20, 9, 1, 212, 1, 52, 20, 9, 1, 192, + 215, 72, 20, 9, 1, 192, 215, 52, 20, 9, 1, 124, 4, 230, 67, 95, 72, 20, + 9, 1, 196, 124, 72, 20, 9, 1, 196, 124, 52, 20, 9, 1, 221, 170, 212, 1, + 72, 20, 9, 1, 221, 170, 212, 1, 52, 20, 9, 1, 221, 170, 192, 215, 72, 20, + 9, 1, 221, 170, 192, 215, 52, 20, 9, 1, 234, 253, 72, 20, 9, 1, 234, 253, + 52, 20, 9, 1, 234, 253, 88, 20, 9, 1, 234, 253, 217, 35, 20, 9, 1, 197, + 94, 222, 61, 221, 170, 157, 217, 169, 88, 20, 9, 1, 197, 94, 222, 61, + 221, 170, 157, 217, 169, 217, 35, 20, 9, 34, 97, 4, 230, 67, 95, 4, 157, + 72, 20, 9, 34, 97, 4, 230, 67, 95, 4, 157, 52, 20, 9, 34, 97, 4, 230, 67, + 95, 4, 251, 109, 72, 20, 9, 34, 97, 4, 230, 67, 95, 4, 251, 109, 52, 20, + 9, 34, 97, 4, 230, 67, 95, 4, 194, 120, 72, 20, 9, 34, 97, 4, 230, 67, + 95, 4, 194, 120, 52, 20, 9, 34, 97, 4, 230, 67, 95, 4, 124, 72, 20, 9, + 34, 97, 4, 230, 67, 95, 4, 124, 52, 20, 9, 34, 97, 4, 230, 67, 95, 4, + 212, 1, 72, 20, 9, 34, 97, 4, 230, 67, 95, 4, 212, 1, 52, 20, 9, 34, 97, + 4, 230, 67, 95, 4, 192, 215, 72, 20, 9, 34, 97, 4, 230, 67, 95, 4, 192, + 215, 52, 20, 9, 34, 97, 4, 230, 67, 95, 4, 234, 253, 72, 20, 9, 34, 97, + 4, 230, 67, 95, 4, 234, 253, 52, 20, 9, 34, 97, 4, 230, 67, 95, 4, 234, + 253, 88, 20, 9, 34, 197, 94, 221, 170, 97, 4, 230, 67, 95, 4, 157, 217, + 169, 72, 20, 9, 34, 197, 94, 221, 170, 97, 4, 230, 67, 95, 4, 157, 217, + 169, 52, 20, 9, 34, 197, 94, 221, 170, 97, 4, 230, 67, 95, 4, 157, 217, + 169, 88, 20, 9, 1, 233, 62, 97, 72, 20, 9, 1, 233, 62, 97, 52, 20, 9, 1, + 233, 62, 97, 88, 20, 9, 1, 233, 62, 97, 217, 35, 20, 9, 34, 97, 4, 230, + 67, 95, 4, 223, 38, 72, 20, 9, 34, 97, 4, 230, 67, 95, 4, 176, 72, 20, 9, + 34, 97, 4, 230, 67, 95, 4, 91, 72, 20, 9, 34, 97, 4, 230, 67, 95, 4, 157, + 217, 169, 72, 20, 9, 34, 97, 4, 230, 67, 95, 4, 97, 72, 20, 9, 34, 248, + 97, 4, 223, 38, 72, 20, 9, 34, 248, 97, 4, 176, 72, 20, 9, 34, 248, 97, + 4, 221, 246, 72, 20, 9, 34, 248, 97, 4, 91, 72, 20, 9, 34, 248, 97, 4, + 157, 217, 169, 72, 20, 9, 34, 248, 97, 4, 97, 72, 20, 9, 34, 200, 50, 4, + 223, 38, 72, 20, 9, 34, 200, 50, 4, 176, 72, 20, 9, 34, 200, 50, 4, 221, + 246, 72, 20, 9, 34, 200, 50, 4, 91, 72, 20, 9, 34, 200, 50, 4, 157, 217, + 169, 72, 20, 9, 34, 200, 50, 4, 97, 72, 20, 9, 34, 199, 221, 4, 223, 38, + 72, 20, 9, 34, 199, 221, 4, 91, 72, 20, 9, 34, 199, 221, 4, 157, 217, + 169, 72, 20, 9, 34, 199, 221, 4, 97, 72, 20, 9, 34, 223, 38, 4, 176, 72, + 20, 9, 34, 223, 38, 4, 91, 72, 20, 9, 34, 176, 4, 223, 38, 72, 20, 9, 34, + 176, 4, 91, 72, 20, 9, 34, 221, 246, 4, 223, 38, 72, 20, 9, 34, 221, 246, + 4, 176, 72, 20, 9, 34, 221, 246, 4, 91, 72, 20, 9, 34, 205, 202, 4, 223, + 38, 72, 20, 9, 34, 205, 202, 4, 176, 72, 20, 9, 34, 205, 202, 4, 221, + 246, 72, 20, 9, 34, 205, 202, 4, 91, 72, 20, 9, 34, 206, 87, 4, 176, 72, + 20, 9, 34, 206, 87, 4, 91, 72, 20, 9, 34, 237, 251, 4, 223, 38, 72, 20, + 9, 34, 237, 251, 4, 176, 72, 20, 9, 34, 237, 251, 4, 221, 246, 72, 20, 9, + 34, 237, 251, 4, 91, 72, 20, 9, 34, 200, 152, 4, 176, 72, 20, 9, 34, 200, + 152, 4, 91, 72, 20, 9, 34, 192, 107, 4, 91, 72, 20, 9, 34, 251, 58, 4, + 223, 38, 72, 20, 9, 34, 251, 58, 4, 91, 72, 20, 9, 34, 231, 80, 4, 223, + 38, 72, 20, 9, 34, 231, 80, 4, 91, 72, 20, 9, 34, 233, 35, 4, 223, 38, + 72, 20, 9, 34, 233, 35, 4, 176, 72, 20, 9, 34, 233, 35, 4, 221, 246, 72, + 20, 9, 34, 233, 35, 4, 91, 72, 20, 9, 34, 233, 35, 4, 157, 217, 169, 72, + 20, 9, 34, 233, 35, 4, 97, 72, 20, 9, 34, 208, 233, 4, 176, 72, 20, 9, + 34, 208, 233, 4, 91, 72, 20, 9, 34, 208, 233, 4, 157, 217, 169, 72, 20, + 9, 34, 208, 233, 4, 97, 72, 20, 9, 34, 222, 140, 4, 157, 72, 20, 9, 34, + 222, 140, 4, 223, 38, 72, 20, 9, 34, 222, 140, 4, 176, 72, 20, 9, 34, + 222, 140, 4, 221, 246, 72, 20, 9, 34, 222, 140, 4, 220, 95, 72, 20, 9, + 34, 222, 140, 4, 91, 72, 20, 9, 34, 222, 140, 4, 157, 217, 169, 72, 20, + 9, 34, 222, 140, 4, 97, 72, 20, 9, 34, 220, 95, 4, 223, 38, 72, 20, 9, + 34, 220, 95, 4, 176, 72, 20, 9, 34, 220, 95, 4, 221, 246, 72, 20, 9, 34, + 220, 95, 4, 91, 72, 20, 9, 34, 220, 95, 4, 157, 217, 169, 72, 20, 9, 34, + 220, 95, 4, 97, 72, 20, 9, 34, 91, 4, 223, 38, 72, 20, 9, 34, 91, 4, 176, + 72, 20, 9, 34, 91, 4, 221, 246, 72, 20, 9, 34, 91, 4, 91, 72, 20, 9, 34, + 91, 4, 157, 217, 169, 72, 20, 9, 34, 91, 4, 97, 72, 20, 9, 34, 213, 124, + 4, 223, 38, 72, 20, 9, 34, 213, 124, 4, 176, 72, 20, 9, 34, 213, 124, 4, + 221, 246, 72, 20, 9, 34, 213, 124, 4, 91, 72, 20, 9, 34, 213, 124, 4, + 157, 217, 169, 72, 20, 9, 34, 213, 124, 4, 97, 72, 20, 9, 34, 229, 221, + 4, 223, 38, 72, 20, 9, 34, 229, 221, 4, 91, 72, 20, 9, 34, 229, 221, 4, + 157, 217, 169, 72, 20, 9, 34, 229, 221, 4, 97, 72, 20, 9, 34, 97, 4, 223, + 38, 72, 20, 9, 34, 97, 4, 176, 72, 20, 9, 34, 97, 4, 221, 246, 72, 20, 9, + 34, 97, 4, 91, 72, 20, 9, 34, 97, 4, 157, 217, 169, 72, 20, 9, 34, 97, 4, + 97, 72, 20, 9, 34, 199, 233, 4, 201, 107, 157, 72, 20, 9, 34, 207, 222, + 4, 201, 107, 157, 72, 20, 9, 34, 157, 217, 169, 4, 201, 107, 157, 72, 20, + 9, 34, 204, 55, 4, 237, 214, 72, 20, 9, 34, 204, 55, 4, 222, 85, 72, 20, + 9, 34, 204, 55, 4, 233, 59, 72, 20, 9, 34, 204, 55, 4, 237, 216, 72, 20, + 9, 34, 204, 55, 4, 222, 87, 72, 20, 9, 34, 204, 55, 4, 201, 107, 157, 72, + 20, 9, 34, 97, 4, 230, 67, 95, 4, 207, 222, 52, 20, 9, 34, 97, 4, 230, + 67, 95, 4, 192, 104, 52, 20, 9, 34, 97, 4, 230, 67, 95, 4, 91, 52, 20, 9, + 34, 97, 4, 230, 67, 95, 4, 213, 124, 52, 20, 9, 34, 97, 4, 230, 67, 95, + 4, 157, 217, 169, 52, 20, 9, 34, 97, 4, 230, 67, 95, 4, 97, 52, 20, 9, + 34, 248, 97, 4, 207, 222, 52, 20, 9, 34, 248, 97, 4, 192, 104, 52, 20, 9, + 34, 248, 97, 4, 91, 52, 20, 9, 34, 248, 97, 4, 213, 124, 52, 20, 9, 34, + 248, 97, 4, 157, 217, 169, 52, 20, 9, 34, 248, 97, 4, 97, 52, 20, 9, 34, + 200, 50, 4, 207, 222, 52, 20, 9, 34, 200, 50, 4, 192, 104, 52, 20, 9, 34, + 200, 50, 4, 91, 52, 20, 9, 34, 200, 50, 4, 213, 124, 52, 20, 9, 34, 200, + 50, 4, 157, 217, 169, 52, 20, 9, 34, 200, 50, 4, 97, 52, 20, 9, 34, 199, + 221, 4, 207, 222, 52, 20, 9, 34, 199, 221, 4, 192, 104, 52, 20, 9, 34, + 199, 221, 4, 91, 52, 20, 9, 34, 199, 221, 4, 213, 124, 52, 20, 9, 34, + 199, 221, 4, 157, 217, 169, 52, 20, 9, 34, 199, 221, 4, 97, 52, 20, 9, + 34, 233, 35, 4, 157, 217, 169, 52, 20, 9, 34, 233, 35, 4, 97, 52, 20, 9, + 34, 208, 233, 4, 157, 217, 169, 52, 20, 9, 34, 208, 233, 4, 97, 52, 20, + 9, 34, 222, 140, 4, 157, 52, 20, 9, 34, 222, 140, 4, 220, 95, 52, 20, 9, + 34, 222, 140, 4, 91, 52, 20, 9, 34, 222, 140, 4, 157, 217, 169, 52, 20, + 9, 34, 222, 140, 4, 97, 52, 20, 9, 34, 220, 95, 4, 91, 52, 20, 9, 34, + 220, 95, 4, 157, 217, 169, 52, 20, 9, 34, 220, 95, 4, 97, 52, 20, 9, 34, + 91, 4, 157, 52, 20, 9, 34, 91, 4, 91, 52, 20, 9, 34, 213, 124, 4, 207, + 222, 52, 20, 9, 34, 213, 124, 4, 192, 104, 52, 20, 9, 34, 213, 124, 4, + 91, 52, 20, 9, 34, 213, 124, 4, 213, 124, 52, 20, 9, 34, 213, 124, 4, + 157, 217, 169, 52, 20, 9, 34, 213, 124, 4, 97, 52, 20, 9, 34, 157, 217, + 169, 4, 201, 107, 157, 52, 20, 9, 34, 97, 4, 207, 222, 52, 20, 9, 34, 97, + 4, 192, 104, 52, 20, 9, 34, 97, 4, 91, 52, 20, 9, 34, 97, 4, 213, 124, + 52, 20, 9, 34, 97, 4, 157, 217, 169, 52, 20, 9, 34, 97, 4, 97, 52, 20, 9, + 34, 97, 4, 230, 67, 95, 4, 223, 38, 88, 20, 9, 34, 97, 4, 230, 67, 95, 4, + 176, 88, 20, 9, 34, 97, 4, 230, 67, 95, 4, 221, 246, 88, 20, 9, 34, 97, + 4, 230, 67, 95, 4, 91, 88, 20, 9, 34, 97, 4, 230, 67, 95, 4, 229, 221, + 88, 20, 9, 34, 248, 97, 4, 223, 38, 88, 20, 9, 34, 248, 97, 4, 176, 88, + 20, 9, 34, 248, 97, 4, 221, 246, 88, 20, 9, 34, 248, 97, 4, 91, 88, 20, + 9, 34, 248, 97, 4, 229, 221, 88, 20, 9, 34, 200, 50, 4, 223, 38, 88, 20, + 9, 34, 200, 50, 4, 176, 88, 20, 9, 34, 200, 50, 4, 221, 246, 88, 20, 9, + 34, 200, 50, 4, 91, 88, 20, 9, 34, 200, 50, 4, 229, 221, 88, 20, 9, 34, + 199, 221, 4, 91, 88, 20, 9, 34, 223, 38, 4, 176, 88, 20, 9, 34, 223, 38, + 4, 91, 88, 20, 9, 34, 176, 4, 223, 38, 88, 20, 9, 34, 176, 4, 91, 88, 20, + 9, 34, 221, 246, 4, 223, 38, 88, 20, 9, 34, 221, 246, 4, 91, 88, 20, 9, + 34, 205, 202, 4, 223, 38, 88, 20, 9, 34, 205, 202, 4, 176, 88, 20, 9, 34, + 205, 202, 4, 221, 246, 88, 20, 9, 34, 205, 202, 4, 91, 88, 20, 9, 34, + 206, 87, 4, 176, 88, 20, 9, 34, 206, 87, 4, 221, 246, 88, 20, 9, 34, 206, + 87, 4, 91, 88, 20, 9, 34, 237, 251, 4, 223, 38, 88, 20, 9, 34, 237, 251, + 4, 176, 88, 20, 9, 34, 237, 251, 4, 221, 246, 88, 20, 9, 34, 237, 251, 4, + 91, 88, 20, 9, 34, 200, 152, 4, 176, 88, 20, 9, 34, 192, 107, 4, 91, 88, + 20, 9, 34, 251, 58, 4, 223, 38, 88, 20, 9, 34, 251, 58, 4, 91, 88, 20, 9, + 34, 231, 80, 4, 223, 38, 88, 20, 9, 34, 231, 80, 4, 91, 88, 20, 9, 34, + 233, 35, 4, 223, 38, 88, 20, 9, 34, 233, 35, 4, 176, 88, 20, 9, 34, 233, + 35, 4, 221, 246, 88, 20, 9, 34, 233, 35, 4, 91, 88, 20, 9, 34, 208, 233, + 4, 176, 88, 20, 9, 34, 208, 233, 4, 91, 88, 20, 9, 34, 222, 140, 4, 223, + 38, 88, 20, 9, 34, 222, 140, 4, 176, 88, 20, 9, 34, 222, 140, 4, 221, + 246, 88, 20, 9, 34, 222, 140, 4, 220, 95, 88, 20, 9, 34, 222, 140, 4, 91, + 88, 20, 9, 34, 220, 95, 4, 223, 38, 88, 20, 9, 34, 220, 95, 4, 176, 88, + 20, 9, 34, 220, 95, 4, 221, 246, 88, 20, 9, 34, 220, 95, 4, 91, 88, 20, + 9, 34, 220, 95, 4, 229, 221, 88, 20, 9, 34, 91, 4, 223, 38, 88, 20, 9, + 34, 91, 4, 176, 88, 20, 9, 34, 91, 4, 221, 246, 88, 20, 9, 34, 91, 4, 91, + 88, 20, 9, 34, 213, 124, 4, 223, 38, 88, 20, 9, 34, 213, 124, 4, 176, 88, + 20, 9, 34, 213, 124, 4, 221, 246, 88, 20, 9, 34, 213, 124, 4, 91, 88, 20, + 9, 34, 213, 124, 4, 229, 221, 88, 20, 9, 34, 229, 221, 4, 223, 38, 88, + 20, 9, 34, 229, 221, 4, 91, 88, 20, 9, 34, 229, 221, 4, 201, 107, 157, + 88, 20, 9, 34, 97, 4, 223, 38, 88, 20, 9, 34, 97, 4, 176, 88, 20, 9, 34, + 97, 4, 221, 246, 88, 20, 9, 34, 97, 4, 91, 88, 20, 9, 34, 97, 4, 229, + 221, 88, 20, 9, 34, 97, 4, 230, 67, 95, 4, 91, 217, 35, 20, 9, 34, 97, 4, + 230, 67, 95, 4, 229, 221, 217, 35, 20, 9, 34, 248, 97, 4, 91, 217, 35, + 20, 9, 34, 248, 97, 4, 229, 221, 217, 35, 20, 9, 34, 200, 50, 4, 91, 217, + 35, 20, 9, 34, 200, 50, 4, 229, 221, 217, 35, 20, 9, 34, 199, 221, 4, 91, + 217, 35, 20, 9, 34, 199, 221, 4, 229, 221, 217, 35, 20, 9, 34, 205, 202, + 4, 91, 217, 35, 20, 9, 34, 205, 202, 4, 229, 221, 217, 35, 20, 9, 34, + 204, 9, 4, 91, 217, 35, 20, 9, 34, 204, 9, 4, 229, 221, 217, 35, 20, 9, + 34, 222, 140, 4, 220, 95, 217, 35, 20, 9, 34, 222, 140, 4, 91, 217, 35, + 20, 9, 34, 220, 95, 4, 91, 217, 35, 20, 9, 34, 213, 124, 4, 91, 217, 35, + 20, 9, 34, 213, 124, 4, 229, 221, 217, 35, 20, 9, 34, 97, 4, 91, 217, 35, + 20, 9, 34, 97, 4, 229, 221, 217, 35, 20, 9, 34, 204, 55, 4, 233, 59, 217, + 35, 20, 9, 34, 204, 55, 4, 237, 216, 217, 35, 20, 9, 34, 204, 55, 4, 222, + 87, 217, 35, 20, 9, 34, 200, 152, 4, 157, 217, 169, 72, 20, 9, 34, 200, + 152, 4, 97, 72, 20, 9, 34, 251, 58, 4, 157, 217, 169, 72, 20, 9, 34, 251, + 58, 4, 97, 72, 20, 9, 34, 231, 80, 4, 157, 217, 169, 72, 20, 9, 34, 231, + 80, 4, 97, 72, 20, 9, 34, 205, 202, 4, 157, 217, 169, 72, 20, 9, 34, 205, + 202, 4, 97, 72, 20, 9, 34, 204, 9, 4, 157, 217, 169, 72, 20, 9, 34, 204, + 9, 4, 97, 72, 20, 9, 34, 176, 4, 157, 217, 169, 72, 20, 9, 34, 176, 4, + 97, 72, 20, 9, 34, 223, 38, 4, 157, 217, 169, 72, 20, 9, 34, 223, 38, 4, + 97, 72, 20, 9, 34, 221, 246, 4, 157, 217, 169, 72, 20, 9, 34, 221, 246, + 4, 97, 72, 20, 9, 34, 206, 87, 4, 157, 217, 169, 72, 20, 9, 34, 206, 87, + 4, 97, 72, 20, 9, 34, 237, 251, 4, 157, 217, 169, 72, 20, 9, 34, 237, + 251, 4, 97, 72, 20, 9, 34, 204, 9, 4, 223, 38, 72, 20, 9, 34, 204, 9, 4, + 176, 72, 20, 9, 34, 204, 9, 4, 221, 246, 72, 20, 9, 34, 204, 9, 4, 91, + 72, 20, 9, 34, 204, 9, 4, 207, 222, 72, 20, 9, 34, 205, 202, 4, 207, 222, + 72, 20, 9, 34, 206, 87, 4, 207, 222, 72, 20, 9, 34, 237, 251, 4, 207, + 222, 72, 20, 9, 34, 200, 152, 4, 157, 217, 169, 52, 20, 9, 34, 200, 152, + 4, 97, 52, 20, 9, 34, 251, 58, 4, 157, 217, 169, 52, 20, 9, 34, 251, 58, + 4, 97, 52, 20, 9, 34, 231, 80, 4, 157, 217, 169, 52, 20, 9, 34, 231, 80, + 4, 97, 52, 20, 9, 34, 205, 202, 4, 157, 217, 169, 52, 20, 9, 34, 205, + 202, 4, 97, 52, 20, 9, 34, 204, 9, 4, 157, 217, 169, 52, 20, 9, 34, 204, + 9, 4, 97, 52, 20, 9, 34, 176, 4, 157, 217, 169, 52, 20, 9, 34, 176, 4, + 97, 52, 20, 9, 34, 223, 38, 4, 157, 217, 169, 52, 20, 9, 34, 223, 38, 4, + 97, 52, 20, 9, 34, 221, 246, 4, 157, 217, 169, 52, 20, 9, 34, 221, 246, + 4, 97, 52, 20, 9, 34, 206, 87, 4, 157, 217, 169, 52, 20, 9, 34, 206, 87, + 4, 97, 52, 20, 9, 34, 237, 251, 4, 157, 217, 169, 52, 20, 9, 34, 237, + 251, 4, 97, 52, 20, 9, 34, 204, 9, 4, 223, 38, 52, 20, 9, 34, 204, 9, 4, + 176, 52, 20, 9, 34, 204, 9, 4, 221, 246, 52, 20, 9, 34, 204, 9, 4, 91, + 52, 20, 9, 34, 204, 9, 4, 207, 222, 52, 20, 9, 34, 205, 202, 4, 207, 222, + 52, 20, 9, 34, 206, 87, 4, 207, 222, 52, 20, 9, 34, 237, 251, 4, 207, + 222, 52, 20, 9, 34, 204, 9, 4, 223, 38, 88, 20, 9, 34, 204, 9, 4, 176, + 88, 20, 9, 34, 204, 9, 4, 221, 246, 88, 20, 9, 34, 204, 9, 4, 91, 88, 20, + 9, 34, 205, 202, 4, 229, 221, 88, 20, 9, 34, 204, 9, 4, 229, 221, 88, 20, + 9, 34, 200, 152, 4, 91, 88, 20, 9, 34, 205, 202, 4, 223, 38, 217, 35, 20, + 9, 34, 205, 202, 4, 176, 217, 35, 20, 9, 34, 205, 202, 4, 221, 246, 217, + 35, 20, 9, 34, 204, 9, 4, 223, 38, 217, 35, 20, 9, 34, 204, 9, 4, 176, + 217, 35, 20, 9, 34, 204, 9, 4, 221, 246, 217, 35, 20, 9, 34, 200, 152, 4, + 91, 217, 35, 20, 9, 34, 192, 107, 4, 91, 217, 35, 20, 9, 34, 157, 4, 233, + 57, 52, 20, 9, 34, 157, 4, 233, 57, 72, 20, 211, 148, 46, 210, 230, 211, + 148, 51, 210, 230, 9, 34, 200, 50, 4, 223, 38, 4, 91, 88, 20, 9, 34, 200, + 50, 4, 176, 4, 223, 38, 52, 20, 9, 34, 200, 50, 4, 176, 4, 223, 38, 88, + 20, 9, 34, 200, 50, 4, 176, 4, 91, 88, 20, 9, 34, 200, 50, 4, 221, 246, + 4, 91, 88, 20, 9, 34, 200, 50, 4, 91, 4, 223, 38, 88, 20, 9, 34, 200, 50, + 4, 91, 4, 176, 88, 20, 9, 34, 200, 50, 4, 91, 4, 221, 246, 88, 20, 9, 34, + 223, 38, 4, 91, 4, 176, 52, 20, 9, 34, 223, 38, 4, 91, 4, 176, 88, 20, 9, + 34, 176, 4, 91, 4, 97, 52, 20, 9, 34, 176, 4, 91, 4, 157, 217, 169, 52, + 20, 9, 34, 205, 202, 4, 176, 4, 223, 38, 88, 20, 9, 34, 205, 202, 4, 223, + 38, 4, 176, 88, 20, 9, 34, 205, 202, 4, 223, 38, 4, 157, 217, 169, 52, + 20, 9, 34, 205, 202, 4, 91, 4, 176, 52, 20, 9, 34, 205, 202, 4, 91, 4, + 176, 88, 20, 9, 34, 205, 202, 4, 91, 4, 223, 38, 88, 20, 9, 34, 205, 202, + 4, 91, 4, 91, 52, 20, 9, 34, 205, 202, 4, 91, 4, 91, 88, 20, 9, 34, 206, + 87, 4, 176, 4, 176, 52, 20, 9, 34, 206, 87, 4, 176, 4, 176, 88, 20, 9, + 34, 206, 87, 4, 91, 4, 91, 52, 20, 9, 34, 204, 9, 4, 176, 4, 91, 52, 20, + 9, 34, 204, 9, 4, 176, 4, 91, 88, 20, 9, 34, 204, 9, 4, 223, 38, 4, 97, + 52, 20, 9, 34, 204, 9, 4, 91, 4, 221, 246, 52, 20, 9, 34, 204, 9, 4, 91, + 4, 221, 246, 88, 20, 9, 34, 204, 9, 4, 91, 4, 91, 52, 20, 9, 34, 204, 9, + 4, 91, 4, 91, 88, 20, 9, 34, 237, 251, 4, 176, 4, 157, 217, 169, 52, 20, + 9, 34, 237, 251, 4, 221, 246, 4, 91, 52, 20, 9, 34, 237, 251, 4, 221, + 246, 4, 91, 88, 20, 9, 34, 200, 152, 4, 91, 4, 176, 52, 20, 9, 34, 200, + 152, 4, 91, 4, 176, 88, 20, 9, 34, 200, 152, 4, 91, 4, 91, 88, 20, 9, 34, + 200, 152, 4, 91, 4, 97, 52, 20, 9, 34, 251, 58, 4, 223, 38, 4, 91, 52, + 20, 9, 34, 251, 58, 4, 91, 4, 91, 52, 20, 9, 34, 251, 58, 4, 91, 4, 91, + 88, 20, 9, 34, 251, 58, 4, 91, 4, 157, 217, 169, 52, 20, 9, 34, 231, 80, + 4, 91, 4, 91, 52, 20, 9, 34, 231, 80, 4, 91, 4, 97, 52, 20, 9, 34, 231, + 80, 4, 91, 4, 157, 217, 169, 52, 20, 9, 34, 233, 35, 4, 221, 246, 4, 91, + 52, 20, 9, 34, 233, 35, 4, 221, 246, 4, 91, 88, 20, 9, 34, 208, 233, 4, + 91, 4, 176, 52, 20, 9, 34, 208, 233, 4, 91, 4, 91, 52, 20, 9, 34, 220, + 95, 4, 176, 4, 91, 52, 20, 9, 34, 220, 95, 4, 176, 4, 97, 52, 20, 9, 34, + 220, 95, 4, 176, 4, 157, 217, 169, 52, 20, 9, 34, 220, 95, 4, 223, 38, 4, + 223, 38, 88, 20, 9, 34, 220, 95, 4, 223, 38, 4, 223, 38, 52, 20, 9, 34, + 220, 95, 4, 221, 246, 4, 91, 52, 20, 9, 34, 220, 95, 4, 221, 246, 4, 91, + 88, 20, 9, 34, 220, 95, 4, 91, 4, 176, 52, 20, 9, 34, 220, 95, 4, 91, 4, + 176, 88, 20, 9, 34, 91, 4, 176, 4, 223, 38, 88, 20, 9, 34, 91, 4, 176, 4, + 91, 88, 20, 9, 34, 91, 4, 176, 4, 97, 52, 20, 9, 34, 91, 4, 223, 38, 4, + 176, 88, 20, 9, 34, 91, 4, 223, 38, 4, 91, 88, 20, 9, 34, 91, 4, 221, + 246, 4, 223, 38, 88, 20, 9, 34, 91, 4, 221, 246, 4, 91, 88, 20, 9, 34, + 91, 4, 223, 38, 4, 221, 246, 88, 20, 9, 34, 229, 221, 4, 91, 4, 223, 38, + 88, 20, 9, 34, 229, 221, 4, 91, 4, 91, 88, 20, 9, 34, 213, 124, 4, 176, + 4, 91, 88, 20, 9, 34, 213, 124, 4, 176, 4, 157, 217, 169, 52, 20, 9, 34, + 213, 124, 4, 223, 38, 4, 91, 52, 20, 9, 34, 213, 124, 4, 223, 38, 4, 91, + 88, 20, 9, 34, 213, 124, 4, 223, 38, 4, 157, 217, 169, 52, 20, 9, 34, + 213, 124, 4, 91, 4, 97, 52, 20, 9, 34, 213, 124, 4, 91, 4, 157, 217, 169, + 52, 20, 9, 34, 97, 4, 91, 4, 91, 52, 20, 9, 34, 97, 4, 91, 4, 91, 88, 20, + 9, 34, 248, 97, 4, 221, 246, 4, 97, 52, 20, 9, 34, 200, 50, 4, 223, 38, + 4, 97, 52, 20, 9, 34, 200, 50, 4, 223, 38, 4, 157, 217, 169, 52, 20, 9, + 34, 200, 50, 4, 221, 246, 4, 97, 52, 20, 9, 34, 200, 50, 4, 221, 246, 4, + 157, 217, 169, 52, 20, 9, 34, 200, 50, 4, 91, 4, 97, 52, 20, 9, 34, 200, + 50, 4, 91, 4, 157, 217, 169, 52, 20, 9, 34, 223, 38, 4, 91, 4, 97, 52, + 20, 9, 34, 223, 38, 4, 176, 4, 157, 217, 169, 52, 20, 9, 34, 223, 38, 4, + 91, 4, 157, 217, 169, 52, 20, 9, 34, 205, 202, 4, 221, 246, 4, 157, 217, + 169, 52, 20, 9, 34, 206, 87, 4, 176, 4, 97, 52, 20, 9, 34, 204, 9, 4, + 176, 4, 97, 52, 20, 9, 34, 237, 251, 4, 176, 4, 97, 52, 20, 9, 34, 220, + 95, 4, 223, 38, 4, 97, 52, 20, 9, 34, 220, 95, 4, 91, 4, 97, 52, 20, 9, + 34, 97, 4, 176, 4, 97, 52, 20, 9, 34, 97, 4, 223, 38, 4, 97, 52, 20, 9, + 34, 97, 4, 91, 4, 97, 52, 20, 9, 34, 91, 4, 91, 4, 97, 52, 20, 9, 34, + 208, 233, 4, 91, 4, 97, 52, 20, 9, 34, 213, 124, 4, 176, 4, 97, 52, 20, + 9, 34, 208, 233, 4, 91, 4, 176, 88, 20, 9, 34, 220, 95, 4, 176, 4, 91, + 88, 20, 9, 34, 251, 58, 4, 91, 4, 97, 52, 20, 9, 34, 222, 140, 4, 91, 4, + 97, 52, 20, 9, 34, 213, 124, 4, 223, 38, 4, 176, 88, 20, 9, 34, 91, 4, + 221, 246, 4, 97, 52, 20, 9, 34, 220, 95, 4, 223, 38, 4, 91, 88, 20, 9, + 34, 222, 140, 4, 91, 4, 91, 52, 20, 9, 34, 220, 95, 4, 223, 38, 4, 91, + 52, 20, 9, 34, 213, 124, 4, 223, 38, 4, 176, 52, 20, 9, 34, 223, 38, 4, + 176, 4, 97, 52, 20, 9, 34, 176, 4, 223, 38, 4, 97, 52, 20, 9, 34, 91, 4, + 223, 38, 4, 97, 52, 20, 9, 34, 233, 35, 4, 91, 4, 97, 52, 20, 9, 34, 248, + 97, 4, 176, 4, 97, 52, 20, 9, 34, 222, 140, 4, 91, 4, 91, 88, 20, 9, 34, + 251, 58, 4, 223, 38, 4, 91, 88, 20, 9, 34, 206, 87, 4, 91, 4, 91, 88, 20, + 9, 34, 205, 202, 4, 221, 246, 4, 97, 52, 20, 9, 34, 213, 124, 4, 223, 38, + 4, 97, 52, 20, 9, 34, 206, 58, 197, 5, 250, 62, 221, 80, 201, 239, 3, 72, + 20, 9, 34, 208, 229, 197, 5, 250, 62, 221, 80, 201, 239, 3, 72, 20, 9, + 34, 251, 7, 72, 20, 9, 34, 251, 41, 72, 20, 9, 34, 216, 58, 72, 20, 9, + 34, 206, 59, 72, 20, 9, 34, 208, 24, 72, 20, 9, 34, 251, 29, 72, 20, 9, + 34, 194, 139, 72, 20, 9, 34, 206, 58, 72, 20, 9, 34, 206, 57, 251, 29, + 194, 138, 9, 34, 223, 53, 207, 143, 57, 9, 34, 248, 4, 250, 129, 250, + 130, 65, 205, 188, 65, 205, 77, 65, 205, 9, 65, 204, 254, 65, 204, 243, + 65, 204, 232, 65, 204, 221, 65, 204, 210, 65, 204, 199, 65, 205, 187, 65, + 205, 176, 65, 205, 165, 65, 205, 154, 65, 205, 143, 65, 205, 132, 65, + 205, 121, 209, 105, 232, 136, 39, 84, 242, 38, 209, 105, 232, 136, 39, + 84, 149, 242, 38, 209, 105, 232, 136, 39, 84, 149, 232, 71, 201, 238, + 209, 105, 232, 136, 39, 84, 242, 47, 209, 105, 232, 136, 39, 84, 204, + 180, 209, 105, 232, 136, 39, 84, 233, 204, 77, 209, 105, 232, 136, 39, + 84, 208, 159, 77, 209, 105, 232, 136, 39, 84, 46, 62, 219, 247, 186, 209, + 105, 232, 136, 39, 84, 51, 62, 219, 247, 247, 162, 209, 105, 232, 136, + 39, 84, 229, 5, 234, 105, 38, 34, 46, 230, 78, 38, 34, 51, 230, 78, 38, + 55, 199, 91, 46, 230, 78, 38, 55, 199, 91, 51, 230, 78, 38, 217, 215, 46, + 230, 78, 38, 217, 215, 51, 230, 78, 38, 239, 9, 217, 214, 38, 34, 46, + 138, 63, 38, 34, 51, 138, 63, 38, 199, 91, 46, 138, 63, 38, 199, 91, 51, + 138, 63, 38, 217, 215, 46, 138, 63, 38, 217, 215, 51, 138, 63, 38, 239, + 9, 217, 215, 63, 38, 42, 199, 61, 46, 230, 78, 38, 42, 199, 61, 51, 230, + 78, 209, 105, 232, 136, 39, 84, 103, 78, 220, 40, 209, 105, 232, 136, 39, + 84, 234, 100, 237, 185, 209, 105, 232, 136, 39, 84, 234, 89, 237, 185, + 209, 105, 232, 136, 39, 84, 132, 219, 175, 209, 105, 232, 136, 39, 84, + 194, 121, 132, 219, 175, 209, 105, 232, 136, 39, 84, 46, 210, 230, 209, + 105, 232, 136, 39, 84, 51, 210, 230, 209, 105, 232, 136, 39, 84, 46, 238, + 138, 186, 209, 105, 232, 136, 39, 84, 51, 238, 138, 186, 209, 105, 232, + 136, 39, 84, 46, 198, 237, 204, 2, 186, 209, 105, 232, 136, 39, 84, 51, + 198, 237, 204, 2, 186, 209, 105, 232, 136, 39, 84, 46, 60, 219, 247, 186, + 209, 105, 232, 136, 39, 84, 51, 60, 219, 247, 186, 209, 105, 232, 136, + 39, 84, 46, 55, 250, 208, 186, 209, 105, 232, 136, 39, 84, 51, 55, 250, + 208, 186, 209, 105, 232, 136, 39, 84, 46, 250, 208, 186, 209, 105, 232, + 136, 39, 84, 51, 250, 208, 186, 209, 105, 232, 136, 39, 84, 46, 238, 224, + 186, 209, 105, 232, 136, 39, 84, 51, 238, 224, 186, 209, 105, 232, 136, + 39, 84, 46, 62, 238, 224, 186, 209, 105, 232, 136, 39, 84, 51, 62, 238, + 224, 186, 204, 155, 236, 114, 62, 204, 155, 236, 114, 209, 105, 232, 136, + 39, 84, 46, 50, 186, 209, 105, 232, 136, 39, 84, 51, 50, 186, 237, 184, + 211, 109, 246, 134, 211, 109, 194, 121, 211, 109, 55, 194, 121, 211, 109, + 237, 184, 132, 219, 175, 246, 134, 132, 219, 175, 194, 121, 132, 219, + 175, 2, 242, 38, 2, 149, 242, 38, 2, 232, 71, 201, 238, 2, 204, 180, 2, + 242, 47, 2, 208, 159, 77, 2, 233, 204, 77, 2, 234, 100, 237, 185, 2, 46, + 210, 230, 2, 51, 210, 230, 2, 46, 238, 138, 186, 2, 51, 238, 138, 186, 2, + 46, 198, 237, 204, 2, 186, 2, 51, 198, 237, 204, 2, 186, 2, 31, 57, 2, + 250, 229, 2, 250, 37, 2, 102, 57, 2, 228, 110, 2, 219, 240, 57, 2, 230, + 204, 57, 2, 234, 30, 57, 2, 207, 169, 202, 189, 2, 236, 127, 57, 2, 210, + 133, 57, 2, 242, 36, 250, 26, 9, 233, 57, 72, 20, 9, 200, 103, 4, 233, + 57, 58, 9, 237, 214, 72, 20, 9, 200, 148, 232, 108, 9, 222, 85, 72, 20, + 9, 233, 59, 72, 20, 9, 233, 59, 217, 35, 20, 9, 237, 216, 72, 20, 9, 237, + 216, 217, 35, 20, 9, 222, 87, 72, 20, 9, 222, 87, 217, 35, 20, 9, 204, + 55, 72, 20, 9, 204, 55, 217, 35, 20, 9, 201, 132, 72, 20, 9, 201, 132, + 217, 35, 20, 9, 1, 230, 67, 72, 20, 9, 1, 157, 4, 217, 210, 95, 72, 20, + 9, 1, 157, 4, 217, 210, 95, 52, 20, 9, 1, 157, 4, 230, 67, 95, 72, 20, 9, + 1, 157, 4, 230, 67, 95, 52, 20, 9, 1, 194, 120, 4, 230, 67, 95, 72, 20, + 9, 1, 194, 120, 4, 230, 67, 95, 52, 20, 9, 1, 157, 4, 230, 67, 248, 84, + 72, 20, 9, 1, 157, 4, 230, 67, 248, 84, 52, 20, 9, 1, 97, 4, 230, 67, 95, + 72, 20, 9, 1, 97, 4, 230, 67, 95, 52, 20, 9, 1, 97, 4, 230, 67, 95, 88, + 20, 9, 1, 97, 4, 230, 67, 95, 217, 35, 20, 9, 1, 157, 72, 20, 9, 1, 157, + 52, 20, 9, 1, 248, 97, 72, 20, 9, 1, 248, 97, 52, 20, 9, 1, 248, 97, 88, + 20, 9, 1, 248, 97, 217, 35, 20, 9, 1, 200, 50, 217, 134, 72, 20, 9, 1, + 200, 50, 217, 134, 52, 20, 9, 1, 200, 50, 72, 20, 9, 1, 200, 50, 52, 20, + 9, 1, 200, 50, 88, 20, 9, 1, 200, 50, 217, 35, 20, 9, 1, 199, 221, 72, + 20, 9, 1, 199, 221, 52, 20, 9, 1, 199, 221, 88, 20, 9, 1, 199, 221, 217, + 35, 20, 9, 1, 223, 38, 72, 20, 9, 1, 223, 38, 52, 20, 9, 1, 223, 38, 88, + 20, 9, 1, 223, 38, 217, 35, 20, 9, 1, 176, 72, 20, 9, 1, 176, 52, 20, 9, + 1, 176, 88, 20, 9, 1, 176, 217, 35, 20, 9, 1, 221, 246, 72, 20, 9, 1, + 221, 246, 52, 20, 9, 1, 221, 246, 88, 20, 9, 1, 221, 246, 217, 35, 20, 9, + 1, 237, 228, 72, 20, 9, 1, 237, 228, 52, 20, 9, 1, 199, 233, 72, 20, 9, + 1, 199, 233, 52, 20, 9, 1, 207, 222, 72, 20, 9, 1, 207, 222, 52, 20, 9, + 1, 192, 104, 72, 20, 9, 1, 192, 104, 52, 20, 9, 1, 205, 202, 72, 20, 9, + 1, 205, 202, 52, 20, 9, 1, 205, 202, 88, 20, 9, 1, 205, 202, 217, 35, 20, + 9, 1, 204, 9, 72, 20, 9, 1, 204, 9, 52, 20, 9, 1, 204, 9, 88, 20, 9, 1, + 204, 9, 217, 35, 20, 9, 1, 206, 87, 72, 20, 9, 1, 206, 87, 52, 20, 9, 1, + 206, 87, 88, 20, 9, 1, 206, 87, 217, 35, 20, 9, 1, 237, 251, 72, 20, 9, + 1, 237, 251, 52, 20, 9, 1, 237, 251, 88, 20, 9, 1, 237, 251, 217, 35, 20, + 9, 1, 200, 152, 72, 20, 9, 1, 200, 152, 52, 20, 9, 1, 200, 152, 88, 20, + 9, 1, 200, 152, 217, 35, 20, 9, 1, 192, 107, 72, 20, 9, 1, 192, 107, 52, + 20, 9, 1, 192, 107, 88, 20, 9, 1, 192, 107, 217, 35, 20, 9, 1, 251, 58, + 72, 20, 9, 1, 251, 58, 52, 20, 9, 1, 251, 58, 88, 20, 9, 1, 251, 58, 217, + 35, 20, 9, 1, 231, 80, 72, 20, 9, 1, 231, 80, 52, 20, 9, 1, 231, 80, 88, + 20, 9, 1, 231, 80, 217, 35, 20, 9, 1, 233, 35, 72, 20, 9, 1, 233, 35, 52, + 20, 9, 1, 233, 35, 88, 20, 9, 1, 233, 35, 217, 35, 20, 9, 1, 208, 233, + 72, 20, 9, 1, 208, 233, 52, 20, 9, 1, 208, 233, 88, 20, 9, 1, 208, 233, + 217, 35, 20, 9, 1, 222, 140, 72, 20, 9, 1, 222, 140, 52, 20, 9, 1, 222, + 140, 88, 20, 9, 1, 222, 140, 217, 35, 20, 9, 1, 220, 95, 72, 20, 9, 1, + 220, 95, 52, 20, 9, 1, 220, 95, 88, 20, 9, 1, 220, 95, 217, 35, 20, 9, 1, + 91, 72, 20, 9, 1, 91, 52, 20, 9, 1, 91, 88, 20, 9, 1, 91, 217, 35, 20, 9, + 1, 213, 124, 72, 20, 9, 1, 213, 124, 52, 20, 9, 1, 213, 124, 88, 20, 9, + 1, 213, 124, 217, 35, 20, 9, 1, 229, 221, 72, 20, 9, 1, 229, 221, 52, 20, + 9, 1, 229, 221, 88, 20, 9, 1, 229, 221, 217, 35, 20, 9, 1, 194, 120, 72, + 20, 9, 1, 194, 120, 52, 20, 9, 1, 157, 217, 169, 72, 20, 9, 1, 157, 217, + 169, 52, 20, 9, 1, 97, 72, 20, 9, 1, 97, 52, 20, 9, 1, 97, 88, 20, 9, 1, + 97, 217, 35, 20, 9, 34, 220, 95, 4, 157, 4, 217, 210, 95, 72, 20, 9, 34, + 220, 95, 4, 157, 4, 217, 210, 95, 52, 20, 9, 34, 220, 95, 4, 157, 4, 230, + 67, 95, 72, 20, 9, 34, 220, 95, 4, 157, 4, 230, 67, 95, 52, 20, 9, 34, + 220, 95, 4, 157, 4, 230, 67, 248, 84, 72, 20, 9, 34, 220, 95, 4, 157, 4, + 230, 67, 248, 84, 52, 20, 9, 34, 220, 95, 4, 157, 72, 20, 9, 34, 220, 95, + 4, 157, 52, 20, 192, 77, 194, 61, 213, 136, 202, 160, 183, 233, 204, 77, + 183, 208, 142, 77, 183, 31, 57, 183, 236, 127, 57, 183, 210, 133, 57, + 183, 250, 229, 183, 250, 147, 183, 46, 210, 230, 183, 51, 210, 230, 183, + 250, 37, 183, 102, 57, 183, 242, 38, 183, 228, 110, 183, 232, 71, 201, + 238, 183, 202, 189, 183, 17, 192, 76, 183, 17, 101, 183, 17, 104, 183, + 17, 133, 183, 17, 134, 183, 17, 151, 183, 17, 170, 183, 17, 179, 183, 17, + 174, 183, 17, 182, 183, 242, 47, 183, 204, 180, 183, 219, 240, 57, 183, + 234, 30, 57, 183, 230, 204, 57, 183, 208, 159, 77, 183, 242, 36, 250, 26, + 183, 8, 6, 1, 64, 183, 8, 6, 1, 249, 226, 183, 8, 6, 1, 247, 52, 183, 8, + 6, 1, 238, 95, 183, 8, 6, 1, 71, 183, 8, 6, 1, 233, 163, 183, 8, 6, 1, + 232, 44, 183, 8, 6, 1, 230, 124, 183, 8, 6, 1, 70, 183, 8, 6, 1, 223, 65, + 183, 8, 6, 1, 222, 184, 183, 8, 6, 1, 165, 183, 8, 6, 1, 218, 236, 183, + 8, 6, 1, 215, 151, 183, 8, 6, 1, 74, 183, 8, 6, 1, 211, 93, 183, 8, 6, 1, + 208, 247, 183, 8, 6, 1, 150, 183, 8, 6, 1, 206, 158, 183, 8, 6, 1, 200, + 228, 183, 8, 6, 1, 68, 183, 8, 6, 1, 196, 236, 183, 8, 6, 1, 194, 202, + 183, 8, 6, 1, 193, 223, 183, 8, 6, 1, 193, 148, 183, 8, 6, 1, 192, 155, + 183, 46, 50, 186, 183, 207, 169, 202, 189, 183, 51, 50, 186, 183, 242, + 122, 251, 143, 183, 132, 219, 175, 183, 230, 211, 251, 143, 183, 8, 2, 1, + 64, 183, 8, 2, 1, 249, 226, 183, 8, 2, 1, 247, 52, 183, 8, 2, 1, 238, 95, + 183, 8, 2, 1, 71, 183, 8, 2, 1, 233, 163, 183, 8, 2, 1, 232, 44, 183, 8, + 2, 1, 230, 124, 183, 8, 2, 1, 70, 183, 8, 2, 1, 223, 65, 183, 8, 2, 1, + 222, 184, 183, 8, 2, 1, 165, 183, 8, 2, 1, 218, 236, 183, 8, 2, 1, 215, + 151, 183, 8, 2, 1, 74, 183, 8, 2, 1, 211, 93, 183, 8, 2, 1, 208, 247, + 183, 8, 2, 1, 150, 183, 8, 2, 1, 206, 158, 183, 8, 2, 1, 200, 228, 183, + 8, 2, 1, 68, 183, 8, 2, 1, 196, 236, 183, 8, 2, 1, 194, 202, 183, 8, 2, + 1, 193, 223, 183, 8, 2, 1, 193, 148, 183, 8, 2, 1, 192, 155, 183, 46, + 238, 138, 186, 183, 84, 219, 175, 183, 51, 238, 138, 186, 183, 199, 90, + 183, 46, 62, 210, 230, 183, 51, 62, 210, 230, 145, 149, 232, 71, 201, + 238, 145, 46, 238, 224, 186, 145, 51, 238, 224, 186, 145, 149, 242, 38, + 145, 75, 85, 236, 114, 145, 75, 1, 194, 36, 145, 75, 1, 2, 64, 145, 75, + 1, 2, 70, 145, 75, 1, 2, 68, 145, 75, 1, 2, 71, 145, 75, 1, 2, 74, 145, + 75, 1, 2, 168, 145, 75, 1, 2, 192, 214, 145, 75, 1, 2, 193, 1, 145, 75, + 1, 2, 198, 45, 145, 222, 82, 209, 76, 202, 174, 77, 145, 75, 1, 64, 145, + 75, 1, 70, 145, 75, 1, 68, 145, 75, 1, 71, 145, 75, 1, 74, 145, 75, 1, + 160, 145, 75, 1, 221, 204, 145, 75, 1, 221, 33, 145, 75, 1, 222, 57, 145, + 75, 1, 221, 113, 145, 75, 1, 188, 145, 75, 1, 203, 125, 145, 75, 1, 201, + 184, 145, 75, 1, 205, 223, 145, 75, 1, 202, 212, 145, 75, 1, 189, 145, + 75, 1, 199, 128, 145, 75, 1, 198, 45, 145, 75, 1, 200, 79, 145, 75, 1, + 155, 145, 75, 1, 181, 145, 75, 1, 214, 60, 145, 75, 1, 213, 22, 145, 75, + 1, 214, 214, 145, 75, 1, 213, 142, 145, 75, 1, 144, 145, 75, 1, 229, 178, + 145, 75, 1, 228, 181, 145, 75, 1, 229, 255, 145, 75, 1, 229, 43, 145, 75, + 1, 172, 145, 75, 1, 216, 175, 145, 75, 1, 215, 241, 145, 75, 1, 217, 48, + 145, 75, 1, 216, 91, 145, 75, 1, 168, 145, 75, 1, 192, 214, 145, 75, 1, + 193, 1, 145, 75, 1, 167, 145, 75, 1, 207, 151, 145, 75, 1, 206, 218, 145, + 75, 1, 208, 7, 145, 75, 1, 207, 55, 145, 75, 1, 194, 169, 145, 75, 1, + 215, 151, 145, 75, 195, 248, 202, 174, 77, 145, 75, 204, 185, 202, 174, + 77, 145, 30, 232, 247, 145, 30, 1, 221, 151, 145, 30, 1, 202, 84, 145, + 30, 1, 221, 144, 145, 30, 1, 214, 45, 145, 30, 1, 214, 43, 145, 30, 1, + 214, 42, 145, 30, 1, 199, 103, 145, 30, 1, 202, 73, 145, 30, 1, 207, 133, + 145, 30, 1, 207, 128, 145, 30, 1, 207, 125, 145, 30, 1, 207, 118, 145, + 30, 1, 207, 113, 145, 30, 1, 207, 108, 145, 30, 1, 207, 119, 145, 30, 1, + 207, 131, 145, 30, 1, 216, 153, 145, 30, 1, 210, 36, 145, 30, 1, 202, 81, + 145, 30, 1, 210, 25, 145, 30, 1, 203, 64, 145, 30, 1, 202, 78, 145, 30, + 1, 223, 247, 145, 30, 1, 242, 144, 145, 30, 1, 202, 88, 145, 30, 1, 242, + 211, 145, 30, 1, 221, 225, 145, 30, 1, 199, 198, 145, 30, 1, 210, 75, + 145, 30, 1, 229, 162, 145, 30, 1, 64, 145, 30, 1, 251, 108, 145, 30, 1, + 168, 145, 30, 1, 193, 118, 145, 30, 1, 234, 50, 145, 30, 1, 71, 145, 30, + 1, 193, 56, 145, 30, 1, 193, 69, 145, 30, 1, 74, 145, 30, 1, 194, 169, + 145, 30, 1, 194, 160, 145, 30, 1, 212, 0, 145, 30, 1, 193, 1, 145, 30, 1, + 68, 145, 30, 1, 194, 93, 145, 30, 1, 194, 111, 145, 30, 1, 194, 72, 145, + 30, 1, 192, 214, 145, 30, 1, 233, 230, 145, 30, 1, 193, 22, 145, 30, 1, + 70, 183, 246, 140, 57, 183, 209, 143, 57, 183, 213, 111, 57, 183, 217, + 214, 183, 247, 136, 161, 183, 193, 60, 57, 183, 194, 19, 57, 145, 232, + 131, 152, 196, 105, 145, 114, 54, 145, 197, 30, 54, 145, 94, 54, 145, + 235, 92, 54, 145, 60, 202, 106, 145, 62, 242, 130, 223, 134, 250, 193, + 250, 219, 223, 134, 250, 193, 204, 165, 223, 134, 250, 193, 200, 15, 212, + 19, 207, 193, 246, 99, 207, 193, 246, 99, 32, 76, 5, 249, 210, 64, 32, + 76, 5, 249, 179, 71, 32, 76, 5, 249, 188, 70, 32, 76, 5, 249, 156, 74, + 32, 76, 5, 249, 206, 68, 32, 76, 5, 249, 225, 238, 0, 32, 76, 5, 249, + 172, 237, 116, 32, 76, 5, 249, 212, 237, 16, 32, 76, 5, 249, 202, 236, + 146, 32, 76, 5, 249, 166, 235, 62, 32, 76, 5, 249, 160, 223, 62, 32, 76, + 5, 249, 171, 223, 41, 32, 76, 5, 249, 181, 222, 233, 32, 76, 5, 249, 152, + 222, 214, 32, 76, 5, 249, 140, 160, 32, 76, 5, 249, 173, 222, 57, 32, 76, + 5, 249, 150, 221, 204, 32, 76, 5, 249, 147, 221, 113, 32, 76, 5, 249, + 136, 221, 33, 32, 76, 5, 249, 137, 172, 32, 76, 5, 249, 203, 217, 48, 32, + 76, 5, 249, 144, 216, 175, 32, 76, 5, 249, 201, 216, 91, 32, 76, 5, 249, + 193, 215, 241, 32, 76, 5, 249, 214, 181, 32, 76, 5, 249, 192, 214, 214, + 32, 76, 5, 249, 186, 214, 60, 32, 76, 5, 249, 165, 213, 142, 32, 76, 5, + 249, 162, 213, 22, 32, 76, 5, 249, 221, 166, 32, 76, 5, 249, 145, 210, + 181, 32, 76, 5, 249, 178, 210, 51, 32, 76, 5, 249, 205, 209, 198, 32, 76, + 5, 249, 167, 209, 51, 32, 76, 5, 249, 200, 208, 239, 32, 76, 5, 249, 139, + 208, 219, 32, 76, 5, 249, 195, 208, 201, 32, 76, 5, 249, 184, 208, 189, + 32, 76, 5, 249, 157, 167, 32, 76, 5, 249, 189, 208, 7, 32, 76, 5, 249, + 164, 207, 151, 32, 76, 5, 249, 223, 207, 55, 32, 76, 5, 249, 190, 206, + 218, 32, 76, 5, 249, 185, 188, 32, 76, 5, 249, 208, 205, 223, 32, 76, 5, + 249, 176, 203, 125, 32, 76, 5, 249, 204, 202, 212, 32, 76, 5, 249, 159, + 201, 184, 32, 76, 5, 249, 158, 189, 32, 76, 5, 249, 219, 200, 79, 32, 76, + 5, 249, 180, 199, 128, 32, 76, 5, 249, 217, 155, 32, 76, 5, 249, 148, + 198, 45, 32, 76, 5, 249, 163, 194, 169, 32, 76, 5, 249, 142, 194, 111, + 32, 76, 5, 249, 177, 194, 72, 32, 76, 5, 249, 175, 194, 36, 32, 76, 5, + 249, 199, 192, 112, 32, 76, 5, 249, 143, 192, 85, 32, 76, 5, 249, 196, + 192, 8, 32, 76, 5, 249, 191, 254, 42, 32, 76, 5, 249, 174, 253, 186, 32, + 76, 5, 249, 133, 250, 8, 32, 76, 5, 249, 146, 235, 27, 32, 76, 5, 249, + 129, 235, 26, 32, 76, 5, 249, 169, 212, 210, 32, 76, 5, 249, 187, 209, + 49, 32, 76, 5, 249, 155, 209, 53, 32, 76, 5, 249, 141, 208, 70, 32, 76, + 5, 249, 183, 208, 69, 32, 76, 5, 249, 149, 207, 48, 32, 76, 5, 249, 151, + 200, 175, 32, 76, 5, 249, 131, 197, 248, 32, 76, 5, 249, 128, 104, 32, + 76, 16, 249, 198, 32, 76, 16, 249, 197, 32, 76, 16, 249, 194, 32, 76, 16, + 249, 182, 32, 76, 16, 249, 170, 32, 76, 16, 249, 168, 32, 76, 16, 249, + 161, 32, 76, 16, 249, 154, 32, 76, 16, 249, 153, 32, 76, 16, 249, 138, + 32, 76, 16, 249, 135, 32, 76, 16, 249, 134, 32, 76, 16, 249, 132, 32, 76, + 16, 249, 130, 32, 76, 153, 249, 127, 217, 160, 32, 76, 153, 249, 126, + 194, 23, 32, 76, 153, 249, 125, 237, 98, 32, 76, 153, 249, 124, 234, 27, + 32, 76, 153, 249, 123, 217, 127, 32, 76, 153, 249, 122, 202, 27, 32, 76, + 153, 249, 121, 233, 211, 32, 76, 153, 249, 120, 208, 34, 32, 76, 153, + 249, 119, 204, 11, 32, 76, 153, 249, 118, 229, 247, 32, 76, 153, 249, + 117, 202, 168, 32, 76, 153, 249, 116, 247, 218, 32, 76, 153, 249, 115, + 238, 205, 32, 76, 153, 249, 114, 247, 108, 32, 76, 153, 249, 113, 194, + 81, 32, 76, 153, 249, 112, 248, 190, 32, 76, 153, 249, 111, 211, 221, 32, + 76, 153, 249, 110, 202, 138, 32, 76, 153, 249, 109, 238, 103, 32, 76, + 216, 45, 249, 108, 222, 108, 32, 76, 216, 45, 249, 107, 222, 119, 32, 76, + 153, 249, 106, 211, 236, 32, 76, 153, 249, 105, 194, 48, 32, 76, 153, + 249, 104, 32, 76, 216, 45, 249, 103, 250, 105, 32, 76, 216, 45, 249, 102, + 216, 253, 32, 76, 153, 249, 101, 247, 135, 32, 76, 153, 249, 100, 230, + 245, 32, 76, 153, 249, 99, 32, 76, 153, 249, 98, 194, 14, 32, 76, 153, + 249, 97, 32, 76, 153, 249, 96, 32, 76, 153, 249, 95, 228, 208, 32, 76, + 153, 249, 94, 32, 76, 153, 249, 93, 32, 76, 153, 249, 92, 32, 76, 216, + 45, 249, 90, 198, 7, 32, 76, 153, 249, 89, 32, 76, 153, 249, 88, 32, 76, + 153, 249, 87, 242, 78, 32, 76, 153, 249, 86, 32, 76, 153, 249, 85, 32, + 76, 153, 249, 84, 231, 189, 32, 76, 153, 249, 83, 250, 90, 32, 76, 153, + 249, 82, 32, 76, 153, 249, 81, 32, 76, 153, 249, 80, 32, 76, 153, 249, + 79, 32, 76, 153, 249, 78, 32, 76, 153, 249, 77, 32, 76, 153, 249, 76, 32, + 76, 153, 249, 75, 32, 76, 153, 249, 74, 32, 76, 153, 249, 73, 216, 37, + 32, 76, 153, 249, 72, 32, 76, 153, 249, 71, 198, 195, 32, 76, 153, 249, + 70, 32, 76, 153, 249, 69, 32, 76, 153, 249, 68, 32, 76, 153, 249, 67, 32, + 76, 153, 249, 66, 32, 76, 153, 249, 65, 32, 76, 153, 249, 64, 32, 76, + 153, 249, 63, 32, 76, 153, 249, 62, 32, 76, 153, 249, 61, 32, 76, 153, + 249, 60, 32, 76, 153, 249, 59, 229, 210, 32, 76, 153, 249, 38, 232, 145, + 32, 76, 153, 249, 35, 248, 165, 32, 76, 153, 249, 30, 202, 146, 32, 76, + 153, 249, 29, 54, 32, 76, 153, 249, 28, 32, 76, 153, 249, 27, 201, 60, + 32, 76, 153, 249, 26, 32, 76, 153, 249, 25, 32, 76, 153, 249, 24, 194, + 76, 242, 254, 32, 76, 153, 249, 23, 242, 254, 32, 76, 153, 249, 22, 242, + 255, 232, 104, 32, 76, 153, 249, 21, 194, 79, 32, 76, 153, 249, 20, 32, + 76, 153, 249, 19, 32, 76, 216, 45, 249, 18, 236, 207, 32, 76, 153, 249, + 17, 32, 76, 153, 249, 16, 32, 76, 153, 249, 14, 32, 76, 153, 249, 13, 32, + 76, 153, 249, 12, 32, 76, 153, 249, 11, 237, 188, 32, 76, 153, 249, 10, + 32, 76, 153, 249, 9, 32, 76, 153, 249, 8, 32, 76, 153, 249, 7, 32, 76, + 153, 249, 6, 32, 76, 153, 196, 52, 249, 91, 32, 76, 153, 196, 52, 249, + 58, 32, 76, 153, 196, 52, 249, 57, 32, 76, 153, 196, 52, 249, 56, 32, 76, + 153, 196, 52, 249, 55, 32, 76, 153, 196, 52, 249, 54, 32, 76, 153, 196, + 52, 249, 53, 32, 76, 153, 196, 52, 249, 52, 32, 76, 153, 196, 52, 249, + 51, 32, 76, 153, 196, 52, 249, 50, 32, 76, 153, 196, 52, 249, 49, 32, 76, + 153, 196, 52, 249, 48, 32, 76, 153, 196, 52, 249, 47, 32, 76, 153, 196, + 52, 249, 46, 32, 76, 153, 196, 52, 249, 45, 32, 76, 153, 196, 52, 249, + 44, 32, 76, 153, 196, 52, 249, 43, 32, 76, 153, 196, 52, 249, 42, 32, 76, + 153, 196, 52, 249, 41, 32, 76, 153, 196, 52, 249, 40, 32, 76, 153, 196, + 52, 249, 39, 32, 76, 153, 196, 52, 249, 37, 32, 76, 153, 196, 52, 249, + 36, 32, 76, 153, 196, 52, 249, 34, 32, 76, 153, 196, 52, 249, 33, 32, 76, + 153, 196, 52, 249, 32, 32, 76, 153, 196, 52, 249, 31, 32, 76, 153, 196, + 52, 249, 15, 32, 76, 153, 196, 52, 249, 5, 251, 101, 194, 11, 204, 166, + 219, 175, 251, 101, 194, 11, 204, 166, 236, 114, 251, 101, 242, 244, 77, + 251, 101, 31, 101, 251, 101, 31, 104, 251, 101, 31, 133, 251, 101, 31, + 134, 251, 101, 31, 151, 251, 101, 31, 170, 251, 101, 31, 179, 251, 101, + 31, 174, 251, 101, 31, 182, 251, 101, 31, 200, 30, 251, 101, 31, 197, + 239, 251, 101, 31, 199, 184, 251, 101, 31, 232, 126, 251, 101, 31, 233, + 3, 251, 101, 31, 203, 25, 251, 101, 31, 204, 140, 251, 101, 31, 234, 137, + 251, 101, 31, 214, 11, 251, 101, 31, 90, 228, 162, 251, 101, 31, 103, + 228, 162, 251, 101, 31, 112, 228, 162, 251, 101, 31, 232, 119, 228, 162, + 251, 101, 31, 232, 214, 228, 162, 251, 101, 31, 203, 41, 228, 162, 251, + 101, 31, 204, 146, 228, 162, 251, 101, 31, 234, 148, 228, 162, 251, 101, + 31, 214, 16, 228, 162, 251, 101, 31, 90, 180, 251, 101, 31, 103, 180, + 251, 101, 31, 112, 180, 251, 101, 31, 232, 119, 180, 251, 101, 31, 232, + 214, 180, 251, 101, 31, 203, 41, 180, 251, 101, 31, 204, 146, 180, 251, + 101, 31, 234, 148, 180, 251, 101, 31, 214, 16, 180, 251, 101, 31, 200, + 31, 180, 251, 101, 31, 197, 240, 180, 251, 101, 31, 199, 185, 180, 251, + 101, 31, 232, 127, 180, 251, 101, 31, 233, 4, 180, 251, 101, 31, 203, 26, + 180, 251, 101, 31, 204, 141, 180, 251, 101, 31, 234, 138, 180, 251, 101, + 31, 214, 12, 180, 251, 101, 194, 96, 248, 181, 197, 54, 251, 101, 194, + 96, 232, 226, 201, 149, 251, 101, 194, 96, 205, 212, 201, 149, 251, 101, + 194, 96, 199, 192, 201, 149, 251, 101, 194, 96, 232, 112, 201, 149, 251, + 101, 235, 65, 217, 44, 232, 226, 201, 149, 251, 101, 219, 156, 217, 44, + 232, 226, 201, 149, 251, 101, 217, 44, 205, 212, 201, 149, 251, 101, 217, + 44, 199, 192, 201, 149, 33, 251, 133, 250, 10, 90, 208, 167, 33, 251, + 133, 250, 10, 90, 230, 78, 33, 251, 133, 250, 10, 90, 235, 88, 33, 251, + 133, 250, 10, 151, 33, 251, 133, 250, 10, 233, 3, 33, 251, 133, 250, 10, + 232, 214, 228, 162, 33, 251, 133, 250, 10, 232, 214, 180, 33, 251, 133, + 250, 10, 233, 4, 180, 33, 251, 133, 250, 10, 232, 214, 200, 135, 33, 251, + 133, 250, 10, 200, 31, 200, 135, 33, 251, 133, 250, 10, 233, 4, 200, 135, + 33, 251, 133, 250, 10, 90, 228, 163, 200, 135, 33, 251, 133, 250, 10, + 232, 214, 228, 163, 200, 135, 33, 251, 133, 250, 10, 90, 199, 165, 200, + 135, 33, 251, 133, 250, 10, 232, 214, 199, 165, 200, 135, 33, 251, 133, + 250, 10, 232, 214, 202, 11, 33, 251, 133, 250, 10, 200, 31, 202, 11, 33, + 251, 133, 250, 10, 233, 4, 202, 11, 33, 251, 133, 250, 10, 90, 228, 163, + 202, 11, 33, 251, 133, 250, 10, 232, 214, 228, 163, 202, 11, 33, 251, + 133, 250, 10, 90, 199, 165, 202, 11, 33, 251, 133, 250, 10, 200, 31, 199, + 165, 202, 11, 33, 251, 133, 250, 10, 233, 4, 199, 165, 202, 11, 33, 251, + 133, 250, 10, 200, 31, 216, 94, 33, 251, 133, 229, 204, 90, 209, 217, 33, + 251, 133, 199, 208, 101, 33, 251, 133, 229, 200, 101, 33, 251, 133, 234, + 36, 104, 33, 251, 133, 199, 208, 104, 33, 251, 133, 238, 100, 103, 235, + 87, 33, 251, 133, 234, 36, 103, 235, 87, 33, 251, 133, 198, 161, 151, 33, + 251, 133, 198, 161, 200, 30, 33, 251, 133, 198, 161, 200, 31, 250, 249, + 20, 33, 251, 133, 229, 200, 200, 30, 33, 251, 133, 216, 242, 200, 30, 33, + 251, 133, 199, 208, 200, 30, 33, 251, 133, 199, 208, 199, 184, 33, 251, + 133, 198, 161, 233, 3, 33, 251, 133, 198, 161, 233, 4, 250, 249, 20, 33, + 251, 133, 229, 200, 233, 3, 33, 251, 133, 199, 208, 233, 3, 33, 251, 133, + 199, 208, 90, 228, 162, 33, 251, 133, 199, 208, 112, 228, 162, 33, 251, + 133, 234, 36, 232, 214, 228, 162, 33, 251, 133, 198, 161, 232, 214, 228, + 162, 33, 251, 133, 199, 208, 232, 214, 228, 162, 33, 251, 133, 246, 197, + 232, 214, 228, 162, 33, 251, 133, 215, 36, 232, 214, 228, 162, 33, 251, + 133, 199, 208, 90, 180, 33, 251, 133, 199, 208, 232, 214, 180, 33, 251, + 133, 237, 79, 232, 214, 216, 94, 33, 251, 133, 201, 226, 233, 4, 216, 94, + 33, 90, 138, 57, 33, 90, 138, 3, 250, 249, 20, 33, 103, 199, 189, 57, 33, + 112, 208, 166, 57, 33, 193, 67, 57, 33, 200, 136, 57, 33, 235, 89, 57, + 33, 212, 16, 57, 33, 103, 212, 15, 57, 33, 112, 212, 15, 57, 33, 232, + 119, 212, 15, 57, 33, 232, 214, 212, 15, 57, 33, 216, 236, 57, 33, 220, + 210, 248, 181, 57, 33, 219, 149, 57, 33, 211, 127, 57, 33, 193, 200, 57, + 33, 250, 68, 57, 33, 250, 85, 57, 33, 230, 220, 57, 33, 198, 121, 248, + 181, 57, 33, 192, 77, 57, 33, 90, 208, 168, 57, 33, 203, 66, 57, 33, 223, + 171, 57, 213, 131, 57, 207, 30, 204, 136, 57, 207, 30, 197, 70, 57, 207, + 30, 204, 172, 57, 207, 30, 204, 74, 57, 207, 30, 236, 222, 204, 74, 57, + 207, 30, 203, 90, 57, 207, 30, 237, 75, 57, 207, 30, 208, 151, 57, 207, + 30, 204, 153, 57, 207, 30, 235, 41, 57, 207, 30, 250, 62, 57, 207, 30, + 246, 133, 57, 250, 55, 109, 33, 16, 200, 101, 207, 153, 210, 89, 236, + 199, 3, 210, 170, 210, 89, 236, 199, 3, 209, 209, 229, 245, 210, 89, 236, + 199, 3, 200, 104, 229, 245, 210, 89, 236, 199, 3, 246, 220, 210, 89, 236, + 199, 3, 242, 206, 210, 89, 236, 199, 3, 194, 23, 210, 89, 236, 199, 3, + 229, 210, 210, 89, 236, 199, 3, 231, 181, 210, 89, 236, 199, 3, 199, 119, + 210, 89, 236, 199, 3, 54, 210, 89, 236, 199, 3, 247, 180, 210, 89, 236, + 199, 3, 203, 233, 210, 89, 236, 199, 3, 242, 71, 210, 89, 236, 199, 3, + 217, 159, 210, 89, 236, 199, 3, 217, 97, 210, 89, 236, 199, 3, 206, 6, + 210, 89, 236, 199, 3, 219, 204, 210, 89, 236, 199, 3, 247, 201, 210, 89, + 236, 199, 3, 246, 204, 209, 225, 210, 89, 236, 199, 3, 236, 128, 210, 89, + 236, 199, 3, 242, 44, 210, 89, 236, 199, 3, 202, 247, 210, 89, 236, 199, + 3, 242, 45, 210, 89, 236, 199, 3, 248, 105, 210, 89, 236, 199, 3, 203, + 220, 210, 89, 236, 199, 3, 228, 208, 210, 89, 236, 199, 3, 229, 168, 210, + 89, 236, 199, 3, 247, 103, 220, 16, 210, 89, 236, 199, 3, 246, 193, 210, + 89, 236, 199, 3, 208, 34, 210, 89, 236, 199, 3, 234, 196, 210, 89, 236, + 199, 3, 235, 97, 210, 89, 236, 199, 3, 198, 23, 210, 89, 236, 199, 3, + 248, 108, 210, 89, 236, 199, 3, 209, 226, 198, 195, 210, 89, 236, 199, 3, + 196, 18, 210, 89, 236, 199, 3, 210, 248, 210, 89, 236, 199, 3, 207, 19, + 210, 89, 236, 199, 3, 219, 188, 210, 89, 236, 199, 3, 211, 104, 248, 252, + 210, 89, 236, 199, 3, 232, 171, 210, 89, 236, 199, 3, 230, 212, 210, 89, + 236, 199, 3, 201, 227, 210, 89, 236, 199, 3, 2, 249, 237, 210, 89, 236, + 199, 3, 194, 121, 248, 203, 210, 89, 236, 199, 3, 38, 212, 18, 111, 218, + 249, 1, 64, 218, 249, 1, 71, 218, 249, 1, 249, 226, 218, 249, 1, 248, 55, + 218, 249, 1, 232, 44, 218, 249, 1, 238, 95, 218, 249, 1, 70, 218, 249, 1, + 194, 202, 218, 249, 1, 192, 155, 218, 249, 1, 199, 242, 218, 249, 1, 223, + 65, 218, 249, 1, 222, 184, 218, 249, 1, 208, 247, 218, 249, 1, 165, 218, + 249, 1, 218, 236, 218, 249, 1, 215, 151, 218, 249, 1, 216, 96, 218, 249, + 1, 213, 179, 218, 249, 1, 68, 218, 249, 1, 211, 93, 218, 249, 1, 221, + 140, 218, 249, 1, 150, 218, 249, 1, 206, 158, 218, 249, 1, 200, 228, 218, + 249, 1, 198, 86, 218, 249, 1, 250, 224, 218, 249, 1, 234, 88, 218, 249, + 1, 230, 124, 218, 249, 1, 193, 223, 246, 210, 1, 64, 246, 210, 1, 211, + 79, 246, 210, 1, 238, 95, 246, 210, 1, 165, 246, 210, 1, 196, 249, 246, + 210, 1, 150, 246, 210, 1, 220, 46, 246, 210, 1, 254, 42, 246, 210, 1, + 208, 247, 246, 210, 1, 249, 226, 246, 210, 1, 218, 236, 246, 210, 1, 74, + 246, 210, 1, 238, 2, 246, 210, 1, 200, 228, 246, 210, 1, 204, 66, 246, + 210, 1, 204, 65, 246, 210, 1, 206, 158, 246, 210, 1, 247, 51, 246, 210, + 1, 68, 246, 210, 1, 213, 179, 246, 210, 1, 193, 223, 246, 210, 1, 215, + 151, 246, 210, 1, 198, 85, 246, 210, 1, 211, 93, 246, 210, 1, 202, 95, + 246, 210, 1, 70, 246, 210, 1, 71, 246, 210, 1, 196, 246, 246, 210, 1, + 222, 184, 246, 210, 1, 222, 175, 246, 210, 1, 215, 1, 246, 210, 1, 196, + 251, 246, 210, 1, 232, 44, 246, 210, 1, 231, 235, 246, 210, 1, 202, 35, + 246, 210, 1, 202, 34, 246, 210, 1, 214, 167, 246, 210, 1, 223, 224, 246, + 210, 1, 247, 50, 246, 210, 1, 198, 86, 246, 210, 1, 196, 248, 246, 210, + 1, 207, 4, 246, 210, 1, 217, 87, 246, 210, 1, 217, 86, 246, 210, 1, 217, + 85, 246, 210, 1, 217, 84, 246, 210, 1, 220, 45, 246, 210, 1, 234, 200, + 246, 210, 1, 196, 247, 92, 234, 39, 199, 164, 77, 92, 234, 39, 17, 101, + 92, 234, 39, 17, 104, 92, 234, 39, 17, 133, 92, 234, 39, 17, 134, 92, + 234, 39, 17, 151, 92, 234, 39, 17, 170, 92, 234, 39, 17, 179, 92, 234, + 39, 17, 174, 92, 234, 39, 17, 182, 92, 234, 39, 31, 200, 30, 92, 234, 39, + 31, 197, 239, 92, 234, 39, 31, 199, 184, 92, 234, 39, 31, 232, 126, 92, + 234, 39, 31, 233, 3, 92, 234, 39, 31, 203, 25, 92, 234, 39, 31, 204, 140, + 92, 234, 39, 31, 234, 137, 92, 234, 39, 31, 214, 11, 92, 234, 39, 31, 90, + 228, 162, 92, 234, 39, 31, 103, 228, 162, 92, 234, 39, 31, 112, 228, 162, + 92, 234, 39, 31, 232, 119, 228, 162, 92, 234, 39, 31, 232, 214, 228, 162, + 92, 234, 39, 31, 203, 41, 228, 162, 92, 234, 39, 31, 204, 146, 228, 162, + 92, 234, 39, 31, 234, 148, 228, 162, 92, 234, 39, 31, 214, 16, 228, 162, + 40, 43, 1, 64, 40, 43, 1, 248, 123, 40, 43, 1, 222, 57, 40, 43, 1, 237, + 116, 40, 43, 1, 71, 40, 43, 1, 196, 123, 40, 43, 1, 192, 85, 40, 43, 1, + 229, 255, 40, 43, 1, 199, 224, 40, 43, 1, 70, 40, 43, 1, 160, 40, 43, 1, + 234, 124, 40, 43, 1, 234, 99, 40, 43, 1, 234, 88, 40, 43, 1, 233, 255, + 40, 43, 1, 74, 40, 43, 1, 210, 181, 40, 43, 1, 204, 12, 40, 43, 1, 221, + 33, 40, 43, 1, 234, 21, 40, 43, 1, 234, 9, 40, 43, 1, 200, 79, 40, 43, 1, + 68, 40, 43, 1, 234, 127, 40, 43, 1, 210, 80, 40, 43, 1, 221, 234, 40, 43, + 1, 234, 164, 40, 43, 1, 234, 11, 40, 43, 1, 242, 245, 40, 43, 1, 223, + 224, 40, 43, 1, 196, 251, 40, 43, 1, 233, 248, 40, 43, 212, 234, 101, 40, + 43, 212, 234, 151, 40, 43, 212, 234, 200, 30, 40, 43, 212, 234, 233, 3, + 40, 43, 1, 193, 69, 40, 43, 1, 213, 115, 198, 112, 40, 43, 1, 202, 169, + 198, 112, 230, 230, 1, 251, 66, 230, 230, 1, 248, 223, 230, 230, 1, 231, + 43, 230, 230, 1, 237, 237, 230, 230, 1, 251, 61, 230, 230, 1, 208, 230, + 230, 230, 1, 223, 77, 230, 230, 1, 230, 91, 230, 230, 1, 199, 178, 230, + 230, 1, 234, 135, 230, 230, 1, 220, 248, 230, 230, 1, 220, 159, 230, 230, + 1, 217, 150, 230, 230, 1, 215, 38, 230, 230, 1, 223, 33, 230, 230, 1, + 197, 13, 230, 230, 1, 211, 52, 230, 230, 1, 214, 11, 230, 230, 1, 208, + 47, 230, 230, 1, 206, 10, 230, 230, 1, 200, 46, 230, 230, 1, 194, 46, + 230, 230, 1, 233, 77, 230, 230, 1, 223, 228, 230, 230, 1, 228, 145, 230, + 230, 1, 211, 139, 230, 230, 1, 214, 16, 228, 162, 40, 210, 124, 1, 250, + 224, 40, 210, 124, 1, 247, 89, 40, 210, 124, 1, 231, 217, 40, 210, 124, + 1, 236, 132, 40, 210, 124, 1, 71, 40, 210, 124, 1, 192, 53, 40, 210, 124, + 1, 235, 9, 40, 210, 124, 1, 192, 93, 40, 210, 124, 1, 235, 7, 40, 210, + 124, 1, 70, 40, 210, 124, 1, 221, 97, 40, 210, 124, 1, 220, 12, 40, 210, + 124, 1, 217, 3, 40, 210, 124, 1, 214, 194, 40, 210, 124, 1, 195, 235, 40, + 210, 124, 1, 210, 167, 40, 210, 124, 1, 207, 220, 40, 210, 124, 1, 203, + 97, 40, 210, 124, 1, 200, 149, 40, 210, 124, 1, 68, 40, 210, 124, 1, 242, + 226, 40, 210, 124, 1, 203, 202, 40, 210, 124, 1, 204, 14, 40, 210, 124, + 1, 192, 216, 40, 210, 124, 1, 193, 47, 40, 210, 124, 1, 74, 40, 210, 124, + 1, 211, 194, 40, 210, 124, 1, 234, 164, 40, 210, 124, 1, 144, 40, 210, + 124, 1, 198, 96, 40, 210, 124, 1, 196, 110, 40, 210, 124, 1, 193, 51, 40, + 210, 124, 1, 193, 49, 40, 210, 124, 1, 193, 84, 40, 210, 124, 1, 223, + 251, 40, 210, 124, 1, 192, 214, 40, 210, 124, 1, 168, 40, 210, 124, 1, + 228, 58, 38, 40, 210, 124, 1, 250, 224, 38, 40, 210, 124, 1, 236, 132, + 38, 40, 210, 124, 1, 192, 93, 38, 40, 210, 124, 1, 214, 194, 38, 40, 210, + 124, 1, 203, 97, 197, 98, 1, 251, 0, 197, 98, 1, 248, 63, 197, 98, 1, + 231, 205, 197, 98, 1, 221, 250, 197, 98, 1, 237, 76, 197, 98, 1, 229, 43, + 197, 98, 1, 194, 36, 197, 98, 1, 192, 75, 197, 98, 1, 228, 200, 197, 98, + 1, 200, 8, 197, 98, 1, 192, 239, 197, 98, 1, 222, 139, 197, 98, 1, 203, + 224, 197, 98, 1, 220, 90, 197, 98, 1, 217, 12, 197, 98, 1, 237, 36, 197, + 98, 1, 212, 230, 197, 98, 1, 191, 252, 197, 98, 1, 206, 45, 197, 98, 1, + 251, 57, 197, 98, 1, 209, 51, 197, 98, 1, 206, 85, 197, 98, 1, 208, 182, + 197, 98, 1, 208, 25, 197, 98, 1, 199, 228, 197, 98, 1, 231, 79, 197, 98, + 1, 155, 197, 98, 1, 70, 197, 98, 1, 68, 197, 98, 1, 202, 46, 197, 98, + 194, 11, 236, 177, 40, 210, 118, 3, 64, 40, 210, 118, 3, 70, 40, 210, + 118, 3, 68, 40, 210, 118, 3, 160, 40, 210, 118, 3, 221, 33, 40, 210, 118, + 3, 231, 233, 40, 210, 118, 3, 230, 186, 40, 210, 118, 3, 193, 209, 40, + 210, 118, 3, 247, 19, 40, 210, 118, 3, 223, 62, 40, 210, 118, 3, 223, 20, + 40, 210, 118, 3, 189, 40, 210, 118, 3, 198, 45, 40, 210, 118, 3, 238, 0, + 40, 210, 118, 3, 237, 16, 40, 210, 118, 3, 235, 62, 40, 210, 118, 3, 199, + 240, 40, 210, 118, 3, 166, 40, 210, 118, 3, 249, 3, 40, 210, 118, 3, 233, + 97, 40, 210, 118, 3, 181, 40, 210, 118, 3, 213, 22, 40, 210, 118, 3, 172, + 40, 210, 118, 3, 216, 175, 40, 210, 118, 3, 215, 241, 40, 210, 118, 3, + 168, 40, 210, 118, 3, 196, 157, 40, 210, 118, 3, 196, 39, 40, 210, 118, + 3, 167, 40, 210, 118, 3, 206, 218, 40, 210, 118, 3, 177, 40, 210, 118, 3, + 188, 40, 210, 118, 3, 192, 112, 40, 210, 118, 3, 204, 64, 40, 210, 118, + 3, 202, 92, 40, 210, 118, 3, 144, 40, 210, 118, 3, 250, 2, 40, 210, 118, + 3, 250, 1, 40, 210, 118, 3, 250, 0, 40, 210, 118, 3, 193, 178, 40, 210, + 118, 3, 237, 233, 40, 210, 118, 3, 237, 232, 40, 210, 118, 3, 248, 234, + 40, 210, 118, 3, 247, 71, 40, 210, 118, 194, 11, 236, 177, 40, 210, 118, + 31, 101, 40, 210, 118, 31, 104, 40, 210, 118, 31, 200, 30, 40, 210, 118, + 31, 197, 239, 40, 210, 118, 31, 228, 162, 237, 56, 6, 1, 184, 70, 237, + 56, 6, 1, 184, 71, 237, 56, 6, 1, 184, 64, 237, 56, 6, 1, 184, 251, 72, + 237, 56, 6, 1, 184, 74, 237, 56, 6, 1, 184, 211, 194, 237, 56, 6, 1, 203, + 195, 70, 237, 56, 6, 1, 203, 195, 71, 237, 56, 6, 1, 203, 195, 64, 237, + 56, 6, 1, 203, 195, 251, 72, 237, 56, 6, 1, 203, 195, 74, 237, 56, 6, 1, + 203, 195, 211, 194, 237, 56, 6, 1, 249, 236, 237, 56, 6, 1, 211, 106, + 237, 56, 6, 1, 193, 244, 237, 56, 6, 1, 193, 66, 237, 56, 6, 1, 230, 124, + 237, 56, 6, 1, 210, 168, 237, 56, 6, 1, 248, 108, 237, 56, 6, 1, 200, 56, + 237, 56, 6, 1, 237, 101, 237, 56, 6, 1, 242, 241, 237, 56, 6, 1, 223, 39, + 237, 56, 6, 1, 222, 64, 237, 56, 6, 1, 231, 179, 237, 56, 6, 1, 234, 164, + 237, 56, 6, 1, 196, 118, 237, 56, 6, 1, 233, 235, 237, 56, 6, 1, 199, + 222, 237, 56, 6, 1, 234, 9, 237, 56, 6, 1, 192, 82, 237, 56, 6, 1, 233, + 255, 237, 56, 6, 1, 192, 61, 237, 56, 6, 1, 234, 21, 237, 56, 6, 1, 234, + 124, 237, 56, 6, 1, 234, 99, 237, 56, 6, 1, 234, 88, 237, 56, 6, 1, 234, + 73, 237, 56, 6, 1, 211, 238, 237, 56, 6, 1, 233, 212, 237, 56, 2, 1, 184, + 70, 237, 56, 2, 1, 184, 71, 237, 56, 2, 1, 184, 64, 237, 56, 2, 1, 184, + 251, 72, 237, 56, 2, 1, 184, 74, 237, 56, 2, 1, 184, 211, 194, 237, 56, + 2, 1, 203, 195, 70, 237, 56, 2, 1, 203, 195, 71, 237, 56, 2, 1, 203, 195, + 64, 237, 56, 2, 1, 203, 195, 251, 72, 237, 56, 2, 1, 203, 195, 74, 237, + 56, 2, 1, 203, 195, 211, 194, 237, 56, 2, 1, 249, 236, 237, 56, 2, 1, + 211, 106, 237, 56, 2, 1, 193, 244, 237, 56, 2, 1, 193, 66, 237, 56, 2, 1, + 230, 124, 237, 56, 2, 1, 210, 168, 237, 56, 2, 1, 248, 108, 237, 56, 2, + 1, 200, 56, 237, 56, 2, 1, 237, 101, 237, 56, 2, 1, 242, 241, 237, 56, 2, + 1, 223, 39, 237, 56, 2, 1, 222, 64, 237, 56, 2, 1, 231, 179, 237, 56, 2, + 1, 234, 164, 237, 56, 2, 1, 196, 118, 237, 56, 2, 1, 233, 235, 237, 56, + 2, 1, 199, 222, 237, 56, 2, 1, 234, 9, 237, 56, 2, 1, 192, 82, 237, 56, + 2, 1, 233, 255, 237, 56, 2, 1, 192, 61, 237, 56, 2, 1, 234, 21, 237, 56, + 2, 1, 234, 124, 237, 56, 2, 1, 234, 99, 237, 56, 2, 1, 234, 88, 237, 56, + 2, 1, 234, 73, 237, 56, 2, 1, 211, 238, 237, 56, 2, 1, 233, 212, 204, 19, + 1, 210, 165, 204, 19, 1, 198, 235, 204, 19, 1, 221, 192, 204, 19, 1, 233, + 40, 204, 19, 1, 199, 197, 204, 19, 1, 202, 212, 204, 19, 1, 201, 97, 204, + 19, 1, 242, 160, 204, 19, 1, 193, 68, 204, 19, 1, 228, 159, 204, 19, 1, + 248, 40, 204, 19, 1, 237, 115, 204, 19, 1, 231, 219, 204, 19, 1, 195, + 230, 204, 19, 1, 199, 203, 204, 19, 1, 192, 5, 204, 19, 1, 217, 43, 204, + 19, 1, 222, 212, 204, 19, 1, 194, 27, 204, 19, 1, 230, 101, 204, 19, 1, + 219, 89, 204, 19, 1, 216, 121, 204, 19, 1, 223, 231, 204, 19, 1, 234, + 162, 204, 19, 1, 250, 53, 204, 19, 1, 251, 113, 204, 19, 1, 211, 211, + 204, 19, 1, 194, 14, 204, 19, 1, 211, 125, 204, 19, 1, 251, 72, 204, 19, + 1, 207, 46, 204, 19, 1, 212, 230, 204, 19, 1, 234, 182, 204, 19, 1, 251, + 77, 204, 19, 1, 228, 49, 204, 19, 1, 197, 41, 204, 19, 1, 212, 24, 204, + 19, 1, 211, 186, 204, 19, 1, 211, 236, 204, 19, 1, 249, 239, 204, 19, 1, + 250, 107, 204, 19, 1, 211, 163, 204, 19, 1, 251, 52, 204, 19, 1, 234, 13, + 204, 19, 1, 250, 82, 204, 19, 1, 234, 193, 204, 19, 1, 228, 57, 204, 19, + 1, 193, 30, 211, 141, 1, 251, 26, 211, 141, 1, 249, 3, 211, 141, 1, 189, + 211, 141, 1, 223, 62, 211, 141, 1, 193, 209, 211, 141, 1, 221, 250, 211, + 141, 1, 237, 100, 211, 141, 1, 167, 211, 141, 1, 188, 211, 141, 1, 203, + 230, 211, 141, 1, 237, 40, 211, 141, 1, 246, 183, 211, 141, 1, 231, 233, + 211, 141, 1, 233, 97, 211, 141, 1, 208, 237, 211, 141, 1, 222, 155, 211, + 141, 1, 220, 180, 211, 141, 1, 216, 135, 211, 141, 1, 212, 214, 211, 141, + 1, 194, 119, 211, 141, 1, 144, 211, 141, 1, 168, 211, 141, 1, 64, 211, + 141, 1, 71, 211, 141, 1, 70, 211, 141, 1, 74, 211, 141, 1, 68, 211, 141, + 1, 252, 33, 211, 141, 1, 234, 171, 211, 141, 1, 211, 194, 211, 141, 17, + 192, 76, 211, 141, 17, 101, 211, 141, 17, 104, 211, 141, 17, 133, 211, + 141, 17, 134, 211, 141, 17, 151, 211, 141, 17, 170, 211, 141, 17, 179, + 211, 141, 17, 174, 211, 141, 17, 182, 211, 143, 6, 1, 64, 211, 143, 6, 1, + 251, 63, 211, 143, 6, 1, 251, 57, 211, 143, 6, 1, 251, 72, 211, 143, 6, + 1, 247, 167, 211, 143, 6, 1, 246, 117, 211, 143, 6, 1, 234, 156, 211, + 143, 6, 1, 71, 211, 143, 6, 1, 234, 136, 211, 143, 6, 1, 144, 211, 143, + 6, 1, 228, 115, 211, 143, 6, 1, 70, 211, 143, 6, 1, 160, 211, 143, 6, 1, + 234, 155, 211, 143, 6, 1, 220, 212, 211, 143, 6, 1, 177, 211, 143, 6, 1, + 172, 211, 143, 6, 1, 181, 211, 143, 6, 1, 74, 211, 143, 6, 1, 211, 235, + 211, 143, 6, 1, 166, 211, 143, 6, 1, 234, 154, 211, 143, 6, 1, 188, 211, + 143, 6, 1, 204, 64, 211, 143, 6, 1, 189, 211, 143, 6, 1, 234, 153, 211, + 143, 6, 1, 198, 118, 211, 143, 6, 1, 234, 152, 211, 143, 6, 1, 198, 108, + 211, 143, 6, 1, 237, 40, 211, 143, 6, 1, 68, 211, 143, 6, 1, 194, 169, + 211, 143, 6, 1, 221, 250, 211, 143, 6, 1, 231, 84, 211, 143, 6, 1, 192, + 112, 211, 143, 6, 1, 192, 71, 211, 143, 2, 1, 64, 211, 143, 2, 1, 251, + 63, 211, 143, 2, 1, 251, 57, 211, 143, 2, 1, 251, 72, 211, 143, 2, 1, + 247, 167, 211, 143, 2, 1, 246, 117, 211, 143, 2, 1, 234, 156, 211, 143, + 2, 1, 71, 211, 143, 2, 1, 234, 136, 211, 143, 2, 1, 144, 211, 143, 2, 1, + 228, 115, 211, 143, 2, 1, 70, 211, 143, 2, 1, 160, 211, 143, 2, 1, 234, + 155, 211, 143, 2, 1, 220, 212, 211, 143, 2, 1, 177, 211, 143, 2, 1, 172, + 211, 143, 2, 1, 181, 211, 143, 2, 1, 74, 211, 143, 2, 1, 211, 235, 211, + 143, 2, 1, 166, 211, 143, 2, 1, 234, 154, 211, 143, 2, 1, 188, 211, 143, + 2, 1, 204, 64, 211, 143, 2, 1, 189, 211, 143, 2, 1, 234, 153, 211, 143, + 2, 1, 198, 118, 211, 143, 2, 1, 234, 152, 211, 143, 2, 1, 198, 108, 211, + 143, 2, 1, 237, 40, 211, 143, 2, 1, 68, 211, 143, 2, 1, 194, 169, 211, + 143, 2, 1, 221, 250, 211, 143, 2, 1, 231, 84, 211, 143, 2, 1, 192, 112, + 211, 143, 2, 1, 192, 71, 234, 120, 1, 64, 234, 120, 1, 248, 123, 234, + 120, 1, 246, 158, 234, 120, 1, 242, 245, 234, 120, 1, 237, 116, 234, 120, + 1, 214, 247, 234, 120, 1, 237, 31, 234, 120, 1, 234, 150, 234, 120, 1, + 71, 234, 120, 1, 233, 47, 234, 120, 1, 231, 158, 234, 120, 1, 231, 15, + 234, 120, 1, 229, 255, 234, 120, 1, 70, 234, 120, 1, 223, 41, 234, 120, + 1, 222, 57, 234, 120, 1, 220, 42, 234, 120, 1, 219, 132, 234, 120, 1, + 217, 48, 234, 120, 1, 214, 214, 234, 120, 1, 181, 234, 120, 1, 213, 249, + 234, 120, 1, 74, 234, 120, 1, 210, 181, 234, 120, 1, 208, 219, 234, 120, + 1, 208, 7, 234, 120, 1, 206, 254, 234, 120, 1, 205, 223, 234, 120, 1, + 204, 12, 234, 120, 1, 200, 79, 234, 120, 1, 199, 224, 234, 120, 1, 68, + 234, 120, 1, 196, 123, 234, 120, 1, 193, 203, 234, 120, 1, 193, 148, 234, + 120, 1, 192, 85, 234, 120, 1, 192, 62, 234, 120, 1, 231, 70, 234, 120, 1, + 231, 76, 234, 120, 1, 221, 234, 246, 190, 251, 27, 1, 250, 251, 246, 190, + 251, 27, 1, 248, 65, 246, 190, 251, 27, 1, 231, 33, 246, 190, 251, 27, 1, + 237, 181, 246, 190, 251, 27, 1, 234, 181, 246, 190, 251, 27, 1, 192, 96, + 246, 190, 251, 27, 1, 233, 172, 246, 190, 251, 27, 1, 192, 56, 246, 190, + 251, 27, 1, 200, 107, 246, 190, 251, 27, 1, 246, 117, 246, 190, 251, 27, + 1, 192, 225, 246, 190, 251, 27, 1, 192, 71, 246, 190, 251, 27, 1, 223, + 104, 246, 190, 251, 27, 1, 204, 64, 246, 190, 251, 27, 1, 220, 83, 246, + 190, 251, 27, 1, 223, 117, 246, 190, 251, 27, 1, 193, 199, 246, 190, 251, + 27, 1, 235, 25, 246, 190, 251, 27, 1, 246, 217, 246, 190, 251, 27, 1, + 223, 21, 246, 190, 251, 27, 1, 222, 99, 246, 190, 251, 27, 1, 218, 245, + 246, 190, 251, 27, 1, 229, 189, 246, 190, 251, 27, 1, 208, 220, 246, 190, + 251, 27, 1, 250, 165, 246, 190, 251, 27, 1, 242, 177, 246, 190, 251, 27, + 1, 242, 215, 246, 190, 251, 27, 1, 238, 107, 246, 190, 251, 27, 1, 217, + 138, 246, 190, 251, 27, 1, 208, 224, 246, 190, 251, 27, 1, 213, 95, 246, + 190, 251, 27, 1, 235, 2, 246, 190, 251, 27, 1, 204, 46, 246, 190, 251, + 27, 1, 223, 42, 246, 190, 251, 27, 1, 211, 211, 246, 190, 251, 27, 1, + 197, 210, 246, 190, 251, 27, 1, 233, 70, 246, 190, 251, 27, 1, 235, 15, + 246, 190, 251, 27, 1, 242, 251, 246, 190, 251, 27, 1, 210, 154, 246, 190, + 251, 27, 1, 231, 60, 246, 190, 251, 27, 1, 208, 22, 246, 190, 251, 27, 1, + 204, 73, 246, 190, 251, 27, 1, 196, 42, 246, 190, 251, 27, 1, 199, 56, + 246, 190, 251, 27, 1, 203, 173, 246, 190, 251, 27, 1, 223, 75, 246, 190, + 251, 27, 1, 238, 108, 246, 190, 251, 27, 1, 246, 183, 246, 190, 251, 27, + 1, 193, 73, 246, 190, 251, 27, 1, 209, 238, 246, 190, 251, 27, 1, 221, + 155, 246, 190, 251, 27, 242, 118, 77, 32, 41, 3, 251, 237, 32, 41, 3, + 251, 236, 32, 41, 3, 251, 235, 32, 41, 3, 251, 234, 32, 41, 3, 251, 233, + 32, 41, 3, 251, 232, 32, 41, 3, 251, 231, 32, 41, 3, 251, 230, 32, 41, 3, + 251, 229, 32, 41, 3, 251, 228, 32, 41, 3, 251, 227, 32, 41, 3, 251, 226, + 32, 41, 3, 251, 225, 32, 41, 3, 251, 224, 32, 41, 3, 251, 223, 32, 41, 3, + 251, 222, 32, 41, 3, 251, 221, 32, 41, 3, 251, 220, 32, 41, 3, 251, 219, + 32, 41, 3, 251, 218, 32, 41, 3, 251, 217, 32, 41, 3, 251, 216, 32, 41, 3, + 251, 215, 32, 41, 3, 251, 214, 32, 41, 3, 251, 213, 32, 41, 3, 251, 212, + 32, 41, 3, 251, 211, 32, 41, 3, 254, 247, 32, 41, 3, 251, 210, 32, 41, 3, + 251, 209, 32, 41, 3, 251, 208, 32, 41, 3, 251, 207, 32, 41, 3, 251, 206, + 32, 41, 3, 251, 205, 32, 41, 3, 251, 204, 32, 41, 3, 251, 203, 32, 41, 3, + 251, 202, 32, 41, 3, 251, 201, 32, 41, 3, 251, 200, 32, 41, 3, 251, 199, + 32, 41, 3, 251, 198, 32, 41, 3, 251, 197, 32, 41, 3, 251, 196, 32, 41, 3, + 251, 195, 32, 41, 3, 251, 194, 32, 41, 3, 251, 193, 32, 41, 3, 251, 192, + 32, 41, 3, 251, 191, 32, 41, 3, 251, 190, 32, 41, 3, 251, 189, 32, 41, 3, + 251, 188, 32, 41, 3, 251, 187, 32, 41, 3, 251, 186, 32, 41, 3, 251, 185, + 32, 41, 3, 251, 184, 32, 41, 3, 251, 183, 32, 41, 3, 251, 182, 32, 41, 3, + 251, 181, 32, 41, 3, 251, 180, 32, 41, 3, 251, 179, 32, 41, 3, 251, 178, + 32, 41, 3, 251, 177, 32, 41, 3, 251, 176, 32, 41, 3, 251, 175, 32, 41, 3, + 251, 174, 32, 41, 3, 251, 173, 32, 41, 3, 251, 172, 32, 41, 3, 251, 171, + 32, 41, 3, 251, 170, 32, 41, 3, 251, 169, 32, 41, 3, 251, 168, 32, 41, 3, + 254, 160, 32, 41, 3, 251, 167, 32, 41, 3, 251, 166, 32, 41, 3, 254, 125, + 32, 41, 3, 251, 165, 32, 41, 3, 251, 164, 32, 41, 3, 251, 163, 32, 41, 3, + 251, 162, 32, 41, 3, 254, 112, 32, 41, 3, 251, 161, 32, 41, 3, 251, 160, + 32, 41, 3, 251, 159, 32, 41, 3, 251, 158, 32, 41, 3, 251, 157, 32, 41, 3, + 253, 184, 32, 41, 3, 253, 183, 32, 41, 3, 253, 182, 32, 41, 3, 253, 181, + 32, 41, 3, 253, 180, 32, 41, 3, 253, 179, 32, 41, 3, 253, 178, 32, 41, 3, + 253, 177, 32, 41, 3, 253, 175, 32, 41, 3, 253, 174, 32, 41, 3, 253, 173, + 32, 41, 3, 253, 172, 32, 41, 3, 253, 171, 32, 41, 3, 253, 170, 32, 41, 3, + 253, 168, 32, 41, 3, 253, 167, 32, 41, 3, 253, 166, 32, 41, 3, 253, 165, + 32, 41, 3, 253, 164, 32, 41, 3, 253, 163, 32, 41, 3, 253, 162, 32, 41, 3, + 253, 161, 32, 41, 3, 253, 160, 32, 41, 3, 253, 159, 32, 41, 3, 253, 158, + 32, 41, 3, 253, 157, 32, 41, 3, 253, 156, 32, 41, 3, 253, 155, 32, 41, 3, + 253, 154, 32, 41, 3, 253, 153, 32, 41, 3, 253, 152, 32, 41, 3, 253, 151, + 32, 41, 3, 253, 150, 32, 41, 3, 253, 148, 32, 41, 3, 253, 147, 32, 41, 3, + 253, 146, 32, 41, 3, 253, 142, 32, 41, 3, 253, 141, 32, 41, 3, 253, 140, + 32, 41, 3, 253, 139, 32, 41, 3, 253, 135, 32, 41, 3, 253, 134, 32, 41, 3, + 253, 133, 32, 41, 3, 253, 132, 32, 41, 3, 253, 131, 32, 41, 3, 253, 130, + 32, 41, 3, 253, 129, 32, 41, 3, 253, 128, 32, 41, 3, 253, 127, 32, 41, 3, + 253, 126, 32, 41, 3, 253, 125, 32, 41, 3, 253, 124, 32, 41, 3, 253, 123, + 32, 41, 3, 253, 122, 32, 41, 3, 253, 121, 32, 41, 3, 253, 120, 32, 41, 3, + 253, 119, 32, 41, 3, 253, 118, 32, 41, 3, 253, 117, 32, 41, 3, 253, 116, + 32, 41, 3, 253, 115, 32, 41, 3, 253, 114, 32, 41, 3, 253, 113, 32, 41, 3, + 253, 111, 32, 41, 3, 253, 110, 32, 41, 3, 253, 109, 32, 41, 3, 253, 108, + 32, 41, 3, 253, 107, 32, 41, 3, 253, 105, 32, 41, 3, 253, 104, 32, 41, 3, + 253, 103, 32, 41, 3, 253, 102, 32, 41, 3, 253, 100, 32, 41, 3, 253, 99, + 32, 41, 3, 253, 98, 32, 41, 3, 253, 64, 32, 41, 3, 253, 62, 32, 41, 3, + 253, 60, 32, 41, 3, 253, 58, 32, 41, 3, 253, 56, 32, 41, 3, 253, 54, 32, + 41, 3, 253, 52, 32, 41, 3, 253, 50, 32, 41, 3, 253, 48, 32, 41, 3, 253, + 46, 32, 41, 3, 253, 44, 32, 41, 3, 253, 41, 32, 41, 3, 253, 39, 32, 41, + 3, 253, 37, 32, 41, 3, 253, 35, 32, 41, 3, 253, 33, 32, 41, 3, 253, 31, + 32, 41, 3, 253, 29, 32, 41, 3, 253, 27, 32, 41, 3, 252, 201, 32, 41, 3, + 252, 200, 32, 41, 3, 252, 199, 32, 41, 3, 252, 198, 32, 41, 3, 252, 197, + 32, 41, 3, 252, 196, 32, 41, 3, 252, 194, 32, 41, 3, 252, 193, 32, 41, 3, + 252, 192, 32, 41, 3, 252, 191, 32, 41, 3, 252, 190, 32, 41, 3, 252, 189, + 32, 41, 3, 252, 187, 32, 41, 3, 252, 186, 32, 41, 3, 252, 182, 32, 41, 3, + 252, 181, 32, 41, 3, 252, 179, 32, 41, 3, 252, 178, 32, 41, 3, 252, 177, + 32, 41, 3, 252, 176, 32, 41, 3, 252, 175, 32, 41, 3, 252, 174, 32, 41, 3, + 252, 173, 32, 41, 3, 252, 172, 32, 41, 3, 252, 171, 32, 41, 3, 252, 170, + 32, 41, 3, 252, 169, 32, 41, 3, 252, 168, 32, 41, 3, 252, 167, 32, 41, 3, + 252, 166, 32, 41, 3, 252, 165, 32, 41, 3, 252, 164, 32, 41, 3, 252, 163, + 32, 41, 3, 252, 162, 32, 41, 3, 252, 161, 32, 41, 3, 252, 160, 32, 41, 3, + 252, 159, 32, 41, 3, 252, 158, 32, 41, 3, 252, 157, 32, 41, 3, 252, 156, + 32, 41, 3, 252, 155, 32, 41, 3, 252, 154, 32, 41, 3, 252, 153, 32, 41, 3, + 252, 152, 32, 41, 3, 252, 151, 32, 41, 3, 252, 150, 32, 41, 3, 252, 149, + 32, 41, 3, 252, 148, 32, 41, 3, 252, 147, 32, 41, 3, 252, 146, 32, 41, 3, + 252, 145, 32, 41, 3, 252, 144, 32, 41, 3, 252, 143, 32, 41, 3, 252, 142, + 32, 41, 3, 252, 141, 32, 41, 3, 252, 140, 32, 41, 3, 252, 139, 32, 41, 3, + 252, 138, 32, 41, 3, 252, 137, 32, 41, 3, 252, 136, 32, 41, 3, 252, 135, + 32, 41, 3, 252, 134, 32, 41, 3, 252, 133, 32, 41, 3, 252, 132, 32, 41, 3, + 252, 131, 32, 41, 3, 252, 130, 32, 41, 3, 252, 129, 32, 41, 3, 252, 128, + 32, 41, 3, 252, 127, 32, 41, 3, 252, 126, 32, 41, 3, 252, 125, 32, 41, 3, + 252, 124, 32, 41, 3, 252, 123, 32, 41, 3, 252, 122, 32, 41, 3, 252, 121, + 32, 41, 3, 252, 120, 32, 41, 3, 252, 119, 32, 41, 3, 252, 118, 32, 41, 3, + 252, 117, 32, 41, 3, 252, 116, 32, 41, 3, 252, 115, 32, 41, 3, 252, 114, + 32, 41, 3, 252, 113, 32, 41, 3, 252, 112, 32, 41, 3, 252, 111, 32, 41, 3, + 252, 110, 32, 41, 3, 252, 109, 32, 41, 3, 252, 108, 32, 41, 3, 252, 107, + 32, 41, 3, 252, 106, 32, 41, 3, 252, 105, 32, 41, 3, 252, 104, 32, 41, 3, + 252, 103, 32, 41, 3, 252, 102, 32, 41, 3, 252, 101, 32, 41, 3, 252, 100, + 32, 41, 3, 252, 99, 32, 41, 3, 252, 98, 32, 41, 3, 252, 97, 32, 41, 3, + 252, 96, 32, 41, 3, 252, 95, 32, 41, 3, 252, 94, 32, 41, 3, 252, 93, 32, + 41, 3, 252, 92, 32, 41, 3, 252, 91, 32, 41, 3, 252, 90, 32, 41, 3, 252, + 89, 32, 41, 3, 252, 88, 32, 41, 3, 252, 87, 32, 41, 3, 252, 86, 32, 41, + 3, 252, 85, 32, 41, 3, 252, 84, 32, 41, 3, 252, 83, 32, 41, 3, 252, 82, + 32, 41, 3, 252, 81, 32, 41, 3, 252, 80, 32, 41, 3, 252, 79, 32, 41, 3, + 252, 78, 32, 41, 3, 252, 77, 32, 41, 3, 252, 76, 32, 41, 3, 252, 75, 32, + 41, 3, 252, 74, 32, 41, 3, 252, 73, 32, 41, 3, 252, 72, 32, 41, 3, 252, + 71, 32, 41, 3, 252, 70, 32, 41, 3, 252, 69, 32, 41, 3, 252, 68, 32, 41, + 3, 252, 67, 32, 41, 3, 252, 66, 32, 41, 3, 252, 65, 32, 41, 3, 252, 64, + 32, 41, 3, 252, 63, 64, 32, 41, 3, 252, 62, 249, 226, 32, 41, 3, 252, 61, + 238, 95, 32, 41, 3, 252, 60, 71, 32, 41, 3, 252, 59, 233, 163, 32, 41, 3, + 252, 58, 230, 124, 32, 41, 3, 252, 57, 223, 65, 32, 41, 3, 252, 56, 222, + 184, 32, 41, 3, 252, 55, 165, 32, 41, 3, 252, 54, 220, 189, 32, 41, 3, + 252, 53, 220, 188, 32, 41, 3, 252, 52, 220, 187, 32, 41, 3, 252, 51, 220, + 186, 32, 41, 3, 252, 50, 194, 202, 32, 41, 3, 252, 49, 193, 223, 32, 41, + 3, 252, 48, 193, 148, 32, 41, 3, 252, 47, 211, 216, 32, 41, 3, 252, 46, + 251, 152, 32, 41, 3, 252, 45, 248, 160, 32, 41, 3, 252, 44, 237, 163, 32, + 41, 3, 252, 43, 233, 171, 32, 41, 3, 252, 42, 223, 41, 32, 41, 3, 252, + 41, 32, 41, 3, 252, 40, 32, 41, 3, 252, 39, 32, 41, 3, 252, 38, 32, 41, + 3, 252, 37, 32, 41, 3, 252, 36, 32, 41, 3, 252, 35, 32, 41, 3, 252, 34, + 238, 102, 5, 64, 238, 102, 5, 71, 238, 102, 5, 70, 238, 102, 5, 74, 238, + 102, 5, 68, 238, 102, 5, 223, 62, 238, 102, 5, 222, 233, 238, 102, 5, + 160, 238, 102, 5, 222, 57, 238, 102, 5, 221, 204, 238, 102, 5, 221, 113, + 238, 102, 5, 221, 33, 238, 102, 5, 177, 238, 102, 5, 220, 42, 238, 102, + 5, 219, 209, 238, 102, 5, 219, 107, 238, 102, 5, 219, 36, 238, 102, 5, + 172, 238, 102, 5, 217, 48, 238, 102, 5, 216, 175, 238, 102, 5, 216, 91, + 238, 102, 5, 215, 241, 238, 102, 5, 181, 238, 102, 5, 214, 214, 238, 102, + 5, 214, 60, 238, 102, 5, 213, 142, 238, 102, 5, 213, 22, 238, 102, 5, + 166, 238, 102, 5, 210, 181, 238, 102, 5, 210, 51, 238, 102, 5, 209, 198, + 238, 102, 5, 209, 51, 238, 102, 5, 167, 238, 102, 5, 208, 7, 238, 102, 5, + 207, 151, 238, 102, 5, 207, 55, 238, 102, 5, 206, 218, 238, 102, 5, 188, + 238, 102, 5, 205, 223, 238, 102, 5, 203, 125, 238, 102, 5, 202, 212, 238, + 102, 5, 201, 184, 238, 102, 5, 189, 238, 102, 5, 200, 79, 238, 102, 5, + 199, 128, 238, 102, 5, 155, 238, 102, 5, 198, 45, 238, 102, 5, 194, 169, + 238, 102, 5, 194, 111, 238, 102, 5, 194, 72, 238, 102, 5, 194, 36, 238, + 102, 5, 193, 209, 238, 102, 5, 193, 203, 238, 102, 5, 192, 112, 238, 102, + 5, 192, 8, 223, 192, 250, 116, 1, 251, 24, 223, 192, 250, 116, 1, 248, + 62, 223, 192, 250, 116, 1, 231, 31, 223, 192, 250, 116, 1, 237, 220, 223, + 192, 250, 116, 1, 229, 255, 223, 192, 250, 116, 1, 194, 119, 223, 192, + 250, 116, 1, 192, 89, 223, 192, 250, 116, 1, 229, 194, 223, 192, 250, + 116, 1, 200, 4, 223, 192, 250, 116, 1, 192, 238, 223, 192, 250, 116, 1, + 222, 109, 223, 192, 250, 116, 1, 220, 85, 223, 192, 250, 116, 1, 217, 12, + 223, 192, 250, 116, 1, 212, 230, 223, 192, 250, 116, 1, 206, 46, 223, + 192, 250, 116, 1, 249, 231, 223, 192, 250, 116, 1, 210, 181, 223, 192, + 250, 116, 1, 206, 83, 223, 192, 250, 116, 1, 208, 181, 223, 192, 250, + 116, 1, 207, 188, 223, 192, 250, 116, 1, 203, 224, 223, 192, 250, 116, 1, + 200, 93, 223, 192, 250, 116, 205, 209, 57, 223, 192, 250, 116, 31, 101, + 223, 192, 250, 116, 31, 104, 223, 192, 250, 116, 31, 133, 223, 192, 250, + 116, 31, 200, 30, 223, 192, 250, 116, 31, 197, 239, 223, 192, 250, 116, + 31, 90, 228, 162, 223, 192, 250, 116, 31, 90, 180, 223, 192, 250, 116, + 31, 200, 31, 180, 211, 38, 1, 251, 24, 211, 38, 1, 248, 62, 211, 38, 1, + 231, 31, 211, 38, 1, 237, 220, 211, 38, 1, 229, 255, 211, 38, 1, 194, + 119, 211, 38, 1, 192, 89, 211, 38, 1, 229, 194, 211, 38, 1, 200, 4, 211, + 38, 1, 192, 238, 211, 38, 1, 222, 109, 211, 38, 1, 220, 85, 211, 38, 1, + 217, 12, 211, 38, 1, 52, 212, 230, 211, 38, 1, 212, 230, 211, 38, 1, 206, + 46, 211, 38, 1, 249, 231, 211, 38, 1, 210, 181, 211, 38, 1, 206, 83, 211, + 38, 1, 208, 181, 211, 38, 1, 207, 188, 211, 38, 1, 203, 224, 211, 38, 1, + 200, 93, 211, 38, 220, 23, 232, 190, 211, 38, 207, 96, 232, 190, 211, 38, + 31, 101, 211, 38, 31, 104, 211, 38, 31, 133, 211, 38, 31, 134, 211, 38, + 31, 151, 211, 38, 31, 200, 30, 211, 38, 31, 197, 239, 215, 80, 1, 52, + 251, 24, 215, 80, 1, 251, 24, 215, 80, 1, 52, 248, 62, 215, 80, 1, 248, + 62, 215, 80, 1, 231, 31, 215, 80, 1, 237, 220, 215, 80, 1, 52, 229, 255, + 215, 80, 1, 229, 255, 215, 80, 1, 194, 119, 215, 80, 1, 192, 89, 215, 80, + 1, 229, 194, 215, 80, 1, 200, 4, 215, 80, 1, 52, 192, 238, 215, 80, 1, + 192, 238, 215, 80, 1, 52, 222, 109, 215, 80, 1, 222, 109, 215, 80, 1, 52, + 220, 85, 215, 80, 1, 220, 85, 215, 80, 1, 52, 217, 12, 215, 80, 1, 217, + 12, 215, 80, 1, 52, 212, 230, 215, 80, 1, 212, 230, 215, 80, 1, 206, 46, + 215, 80, 1, 249, 231, 215, 80, 1, 210, 181, 215, 80, 1, 206, 83, 215, 80, + 1, 208, 181, 215, 80, 1, 207, 188, 215, 80, 1, 52, 203, 224, 215, 80, 1, + 203, 224, 215, 80, 1, 200, 93, 215, 80, 31, 101, 215, 80, 31, 104, 215, + 80, 31, 133, 215, 80, 31, 134, 215, 80, 238, 168, 31, 134, 215, 80, 31, + 151, 215, 80, 31, 200, 30, 215, 80, 31, 197, 239, 215, 80, 31, 90, 228, + 162, 230, 13, 1, 251, 24, 230, 13, 1, 248, 62, 230, 13, 1, 231, 31, 230, + 13, 1, 237, 219, 230, 13, 1, 229, 255, 230, 13, 1, 194, 119, 230, 13, 1, + 192, 87, 230, 13, 1, 229, 194, 230, 13, 1, 200, 4, 230, 13, 1, 192, 238, + 230, 13, 1, 222, 109, 230, 13, 1, 220, 85, 230, 13, 1, 217, 12, 230, 13, + 1, 212, 230, 230, 13, 1, 206, 46, 230, 13, 1, 249, 229, 230, 13, 1, 210, + 181, 230, 13, 1, 206, 83, 230, 13, 1, 208, 181, 230, 13, 1, 203, 224, + 230, 13, 1, 200, 93, 230, 13, 31, 101, 230, 13, 31, 151, 230, 13, 31, + 200, 30, 230, 13, 31, 197, 239, 230, 13, 31, 90, 228, 162, 210, 63, 1, + 251, 21, 210, 63, 1, 248, 65, 210, 63, 1, 231, 206, 210, 63, 1, 237, 78, + 210, 63, 1, 229, 255, 210, 63, 1, 194, 126, 210, 63, 1, 192, 105, 210, + 63, 1, 229, 196, 210, 63, 1, 200, 8, 210, 63, 1, 192, 239, 210, 63, 1, + 222, 139, 210, 63, 1, 220, 91, 210, 63, 1, 217, 12, 210, 63, 1, 212, 230, + 210, 63, 1, 204, 174, 210, 63, 1, 251, 57, 210, 63, 1, 210, 181, 210, 63, + 1, 206, 85, 210, 63, 1, 208, 186, 210, 63, 1, 207, 18, 210, 63, 1, 203, + 224, 210, 63, 1, 200, 100, 210, 63, 31, 101, 210, 63, 31, 200, 30, 210, + 63, 31, 197, 239, 210, 63, 31, 90, 228, 162, 210, 63, 31, 104, 210, 63, + 31, 133, 210, 63, 194, 11, 204, 165, 218, 248, 1, 64, 218, 248, 1, 249, + 226, 218, 248, 1, 232, 44, 218, 248, 1, 238, 95, 218, 248, 1, 71, 218, + 248, 1, 196, 236, 218, 248, 1, 70, 218, 248, 1, 193, 148, 218, 248, 1, + 222, 184, 218, 248, 1, 165, 218, 248, 1, 218, 236, 218, 248, 1, 215, 151, + 218, 248, 1, 74, 218, 248, 1, 150, 218, 248, 1, 202, 95, 218, 248, 1, + 200, 228, 218, 248, 1, 68, 218, 248, 1, 233, 163, 218, 248, 1, 208, 247, + 218, 248, 1, 206, 158, 218, 248, 1, 198, 86, 218, 248, 1, 250, 224, 218, + 248, 1, 234, 88, 218, 248, 1, 218, 251, 218, 248, 1, 213, 179, 218, 248, + 1, 247, 52, 218, 248, 198, 182, 77, 147, 229, 164, 1, 64, 147, 229, 164, + 1, 71, 147, 229, 164, 1, 70, 147, 229, 164, 1, 74, 147, 229, 164, 1, 168, + 147, 229, 164, 1, 194, 169, 147, 229, 164, 1, 249, 3, 147, 229, 164, 1, + 249, 2, 147, 229, 164, 1, 166, 147, 229, 164, 1, 172, 147, 229, 164, 1, + 181, 147, 229, 164, 1, 215, 95, 147, 229, 164, 1, 214, 214, 147, 229, + 164, 1, 214, 212, 147, 229, 164, 1, 167, 147, 229, 164, 1, 208, 74, 147, + 229, 164, 1, 177, 147, 229, 164, 1, 221, 250, 147, 229, 164, 1, 229, 187, + 147, 229, 164, 1, 188, 147, 229, 164, 1, 206, 99, 147, 229, 164, 1, 205, + 223, 147, 229, 164, 1, 160, 147, 229, 164, 1, 208, 239, 147, 229, 164, 1, + 189, 147, 229, 164, 1, 200, 179, 147, 229, 164, 1, 200, 79, 147, 229, + 164, 1, 200, 77, 147, 229, 164, 1, 155, 147, 229, 164, 1, 238, 0, 147, + 229, 164, 16, 196, 33, 147, 229, 164, 16, 196, 32, 147, 238, 133, 1, 64, + 147, 238, 133, 1, 71, 147, 238, 133, 1, 70, 147, 238, 133, 1, 74, 147, + 238, 133, 1, 168, 147, 238, 133, 1, 194, 169, 147, 238, 133, 1, 249, 3, + 147, 238, 133, 1, 166, 147, 238, 133, 1, 172, 147, 238, 133, 1, 181, 147, + 238, 133, 1, 214, 214, 147, 238, 133, 1, 167, 147, 238, 133, 1, 177, 147, + 238, 133, 1, 221, 250, 147, 238, 133, 1, 229, 187, 147, 238, 133, 1, 188, + 147, 238, 133, 1, 250, 112, 188, 147, 238, 133, 1, 205, 223, 147, 238, + 133, 1, 160, 147, 238, 133, 1, 208, 239, 147, 238, 133, 1, 189, 147, 238, + 133, 1, 200, 79, 147, 238, 133, 1, 155, 147, 238, 133, 1, 238, 0, 147, + 238, 133, 232, 109, 234, 112, 197, 246, 147, 238, 133, 232, 109, 90, 230, + 78, 147, 238, 133, 219, 92, 207, 61, 147, 238, 133, 219, 92, 223, 197, + 147, 238, 133, 31, 101, 147, 238, 133, 31, 104, 147, 238, 133, 31, 133, + 147, 238, 133, 31, 134, 147, 238, 133, 31, 151, 147, 238, 133, 31, 170, + 147, 238, 133, 31, 179, 147, 238, 133, 31, 174, 147, 238, 133, 31, 182, + 147, 238, 133, 31, 200, 30, 147, 238, 133, 31, 197, 239, 147, 238, 133, + 31, 199, 184, 147, 238, 133, 31, 232, 126, 147, 238, 133, 31, 233, 3, + 147, 238, 133, 31, 203, 25, 147, 238, 133, 31, 204, 140, 147, 238, 133, + 31, 90, 228, 162, 147, 238, 133, 31, 103, 228, 162, 147, 238, 133, 31, + 112, 228, 162, 147, 238, 133, 31, 232, 119, 228, 162, 147, 238, 133, 31, + 232, 214, 228, 162, 147, 238, 133, 31, 203, 41, 228, 162, 147, 238, 133, + 31, 204, 146, 228, 162, 147, 238, 133, 31, 234, 148, 228, 162, 147, 238, + 133, 31, 214, 16, 228, 162, 147, 238, 133, 31, 90, 180, 147, 238, 133, + 31, 103, 180, 147, 238, 133, 31, 112, 180, 147, 238, 133, 31, 232, 119, + 180, 147, 238, 133, 31, 232, 214, 180, 147, 238, 133, 31, 203, 41, 180, + 147, 238, 133, 31, 204, 146, 180, 147, 238, 133, 31, 234, 148, 180, 147, + 238, 133, 31, 214, 16, 180, 147, 238, 133, 31, 200, 31, 180, 147, 238, + 133, 31, 197, 240, 180, 147, 238, 133, 31, 199, 185, 180, 147, 238, 133, + 31, 232, 127, 180, 147, 238, 133, 31, 233, 4, 180, 147, 238, 133, 31, + 203, 26, 180, 147, 238, 133, 31, 204, 141, 180, 147, 238, 133, 31, 234, + 138, 180, 147, 238, 133, 31, 214, 12, 180, 147, 238, 133, 31, 90, 228, + 163, 180, 147, 238, 133, 31, 103, 228, 163, 180, 147, 238, 133, 31, 112, + 228, 163, 180, 147, 238, 133, 31, 232, 119, 228, 163, 180, 147, 238, 133, + 31, 232, 214, 228, 163, 180, 147, 238, 133, 31, 203, 41, 228, 163, 180, + 147, 238, 133, 31, 204, 146, 228, 163, 180, 147, 238, 133, 31, 234, 148, + 228, 163, 180, 147, 238, 133, 31, 214, 16, 228, 163, 180, 147, 238, 133, + 232, 109, 90, 197, 247, 147, 238, 133, 232, 109, 103, 197, 246, 147, 238, + 133, 232, 109, 112, 197, 246, 147, 238, 133, 232, 109, 232, 119, 197, + 246, 147, 238, 133, 232, 109, 232, 214, 197, 246, 147, 238, 133, 232, + 109, 203, 41, 197, 246, 147, 238, 133, 232, 109, 204, 146, 197, 246, 147, + 238, 133, 232, 109, 234, 148, 197, 246, 147, 238, 133, 232, 109, 214, 16, + 197, 246, 147, 238, 133, 232, 109, 200, 31, 197, 246, 221, 236, 1, 64, + 221, 236, 18, 3, 70, 221, 236, 18, 3, 68, 221, 236, 18, 3, 118, 150, 221, + 236, 18, 3, 71, 221, 236, 18, 3, 74, 221, 236, 18, 220, 2, 77, 221, 236, + 3, 55, 207, 82, 63, 221, 236, 3, 250, 168, 221, 236, 3, 196, 6, 221, 236, + 1, 160, 221, 236, 1, 221, 250, 221, 236, 1, 231, 233, 221, 236, 1, 231, + 84, 221, 236, 1, 247, 19, 221, 236, 1, 246, 117, 221, 236, 1, 223, 62, + 221, 236, 1, 212, 201, 221, 236, 1, 198, 83, 221, 236, 1, 198, 71, 221, + 236, 1, 237, 161, 221, 236, 1, 237, 145, 221, 236, 1, 213, 178, 221, 236, + 1, 189, 221, 236, 1, 199, 240, 221, 236, 1, 238, 0, 221, 236, 1, 237, 40, + 221, 236, 1, 181, 221, 236, 1, 166, 221, 236, 1, 210, 94, 221, 236, 1, + 249, 3, 221, 236, 1, 248, 54, 221, 236, 1, 172, 221, 236, 1, 168, 221, + 236, 1, 167, 221, 236, 1, 177, 221, 236, 1, 196, 157, 221, 236, 1, 204, + 64, 221, 236, 1, 202, 92, 221, 236, 1, 188, 221, 236, 1, 192, 112, 221, + 236, 1, 144, 221, 236, 1, 221, 139, 221, 236, 1, 198, 51, 221, 236, 1, + 198, 52, 221, 236, 1, 196, 40, 221, 236, 3, 248, 194, 58, 221, 236, 3, + 246, 189, 221, 236, 3, 78, 63, 221, 236, 196, 11, 221, 236, 17, 101, 221, + 236, 17, 104, 221, 236, 17, 133, 221, 236, 17, 134, 221, 236, 31, 200, + 30, 221, 236, 31, 197, 239, 221, 236, 31, 90, 228, 162, 221, 236, 31, 90, + 180, 221, 236, 232, 109, 90, 230, 78, 221, 236, 209, 38, 236, 114, 221, + 236, 209, 38, 2, 242, 130, 221, 236, 209, 38, 242, 130, 221, 236, 209, + 38, 238, 194, 161, 221, 236, 209, 38, 217, 153, 221, 236, 209, 38, 219, + 57, 221, 236, 209, 38, 237, 208, 221, 236, 209, 38, 55, 237, 208, 221, + 236, 209, 38, 219, 169, 40, 202, 171, 250, 127, 1, 229, 255, 40, 202, + 171, 250, 127, 1, 220, 85, 40, 202, 171, 250, 127, 1, 229, 194, 40, 202, + 171, 250, 127, 1, 217, 12, 40, 202, 171, 250, 127, 1, 208, 181, 40, 202, + 171, 250, 127, 1, 194, 119, 40, 202, 171, 250, 127, 1, 203, 224, 40, 202, + 171, 250, 127, 1, 207, 188, 40, 202, 171, 250, 127, 1, 248, 62, 40, 202, + 171, 250, 127, 1, 200, 93, 40, 202, 171, 250, 127, 1, 206, 20, 40, 202, + 171, 250, 127, 1, 222, 109, 40, 202, 171, 250, 127, 1, 212, 230, 40, 202, + 171, 250, 127, 1, 221, 231, 40, 202, 171, 250, 127, 1, 206, 83, 40, 202, + 171, 250, 127, 1, 206, 46, 40, 202, 171, 250, 127, 1, 233, 47, 40, 202, + 171, 250, 127, 1, 251, 26, 40, 202, 171, 250, 127, 1, 249, 229, 40, 202, + 171, 250, 127, 1, 237, 37, 40, 202, 171, 250, 127, 1, 231, 31, 40, 202, + 171, 250, 127, 1, 237, 220, 40, 202, 171, 250, 127, 1, 231, 72, 40, 202, + 171, 250, 127, 1, 200, 4, 40, 202, 171, 250, 127, 1, 192, 87, 40, 202, + 171, 250, 127, 1, 237, 34, 40, 202, 171, 250, 127, 1, 192, 238, 40, 202, + 171, 250, 127, 1, 199, 226, 40, 202, 171, 250, 127, 1, 199, 205, 40, 202, + 171, 250, 127, 31, 101, 40, 202, 171, 250, 127, 31, 233, 3, 40, 202, 171, + 250, 127, 162, 223, 172, 40, 178, 250, 127, 1, 229, 220, 40, 178, 250, + 127, 1, 220, 94, 40, 178, 250, 127, 1, 230, 89, 40, 178, 250, 127, 1, + 217, 26, 40, 178, 250, 127, 1, 208, 232, 40, 178, 250, 127, 1, 194, 119, + 40, 178, 250, 127, 1, 234, 7, 40, 178, 250, 127, 1, 207, 221, 40, 178, + 250, 127, 1, 248, 96, 40, 178, 250, 127, 1, 200, 49, 40, 178, 250, 127, + 1, 234, 8, 40, 178, 250, 127, 1, 222, 139, 40, 178, 250, 127, 1, 213, + 123, 40, 178, 250, 127, 1, 221, 245, 40, 178, 250, 127, 1, 206, 86, 40, + 178, 250, 127, 1, 234, 6, 40, 178, 250, 127, 1, 233, 34, 40, 178, 250, + 127, 1, 251, 26, 40, 178, 250, 127, 1, 251, 57, 40, 178, 250, 127, 1, + 237, 250, 40, 178, 250, 127, 1, 231, 149, 40, 178, 250, 127, 1, 237, 227, + 40, 178, 250, 127, 1, 231, 79, 40, 178, 250, 127, 1, 200, 151, 40, 178, + 250, 127, 1, 192, 103, 40, 178, 250, 127, 1, 199, 232, 40, 178, 250, 127, + 1, 193, 64, 40, 178, 250, 127, 1, 199, 220, 40, 178, 250, 127, 1, 192, + 106, 40, 178, 250, 127, 31, 101, 40, 178, 250, 127, 31, 200, 30, 40, 178, + 250, 127, 31, 197, 239, 217, 151, 1, 251, 24, 217, 151, 1, 248, 62, 217, + 151, 1, 248, 47, 217, 151, 1, 231, 31, 217, 151, 1, 231, 57, 217, 151, 1, + 237, 220, 217, 151, 1, 229, 255, 217, 151, 1, 194, 119, 217, 151, 3, 197, + 109, 217, 151, 1, 192, 89, 217, 151, 1, 192, 64, 217, 151, 1, 223, 43, + 217, 151, 1, 223, 24, 217, 151, 1, 229, 194, 217, 151, 1, 200, 4, 217, + 151, 1, 192, 238, 217, 151, 1, 222, 109, 217, 151, 1, 193, 206, 217, 151, + 1, 221, 238, 217, 151, 1, 220, 85, 217, 151, 1, 237, 33, 217, 151, 1, + 199, 231, 217, 151, 1, 217, 12, 217, 151, 1, 212, 230, 217, 151, 1, 206, + 46, 217, 151, 1, 249, 231, 217, 151, 1, 251, 241, 217, 151, 1, 210, 181, + 217, 151, 1, 233, 47, 217, 151, 1, 206, 83, 217, 151, 1, 208, 181, 217, + 151, 1, 193, 182, 217, 151, 1, 208, 208, 217, 151, 1, 207, 188, 217, 151, + 1, 203, 224, 217, 151, 1, 202, 60, 217, 151, 1, 200, 93, 217, 151, 251, + 151, 122, 58, 217, 151, 251, 151, 122, 63, 217, 151, 31, 101, 217, 151, + 31, 151, 217, 151, 31, 200, 30, 217, 151, 31, 197, 239, 217, 151, 31, 90, + 228, 162, 217, 151, 209, 38, 202, 19, 217, 151, 209, 38, 232, 190, 217, + 151, 209, 38, 55, 78, 194, 41, 236, 114, 217, 151, 209, 38, 78, 194, 41, + 236, 114, 217, 151, 209, 38, 236, 114, 217, 151, 209, 38, 103, 236, 111, + 217, 151, 209, 38, 219, 176, 232, 247, 249, 243, 1, 64, 249, 243, 1, 252, + 33, 249, 243, 1, 250, 166, 249, 243, 1, 251, 247, 249, 243, 1, 250, 224, + 249, 243, 1, 251, 249, 249, 243, 1, 251, 108, 249, 243, 1, 251, 104, 249, + 243, 1, 71, 249, 243, 1, 234, 171, 249, 243, 1, 74, 249, 243, 1, 211, + 194, 249, 243, 1, 70, 249, 243, 1, 223, 224, 249, 243, 1, 68, 249, 243, + 1, 196, 251, 249, 243, 1, 222, 57, 249, 243, 1, 193, 203, 249, 243, 1, + 193, 162, 249, 243, 1, 193, 173, 249, 243, 1, 231, 158, 249, 243, 1, 231, + 115, 249, 243, 1, 231, 70, 249, 243, 1, 246, 158, 249, 243, 1, 223, 41, + 249, 243, 1, 200, 79, 249, 243, 1, 199, 224, 249, 243, 1, 237, 116, 249, + 243, 1, 237, 31, 249, 243, 1, 198, 78, 249, 243, 1, 210, 181, 249, 243, + 1, 233, 47, 249, 243, 1, 248, 123, 249, 243, 1, 248, 49, 249, 243, 1, + 214, 152, 249, 243, 1, 214, 67, 249, 243, 1, 214, 68, 249, 243, 1, 214, + 214, 249, 243, 1, 212, 190, 249, 243, 1, 213, 173, 249, 243, 1, 217, 48, + 249, 243, 1, 229, 93, 249, 243, 1, 192, 162, 249, 243, 1, 193, 69, 249, + 243, 1, 196, 123, 249, 243, 1, 208, 7, 249, 243, 1, 220, 42, 249, 243, 1, + 205, 223, 249, 243, 1, 192, 85, 249, 243, 1, 204, 12, 249, 243, 1, 192, + 62, 249, 243, 1, 203, 132, 249, 243, 1, 202, 61, 249, 243, 1, 229, 255, + 249, 243, 251, 151, 77, 199, 76, 103, 236, 112, 136, 90, 78, 209, 37, 2, + 103, 236, 112, 136, 90, 78, 209, 37, 220, 73, 103, 236, 112, 136, 90, 78, + 209, 37, 220, 73, 90, 78, 136, 103, 236, 112, 209, 37, 220, 73, 103, 207, + 78, 136, 90, 207, 82, 209, 37, 220, 73, 90, 207, 82, 136, 103, 207, 78, + 209, 37, 223, 150, 210, 223, 1, 251, 24, 223, 150, 210, 223, 1, 248, 62, + 223, 150, 210, 223, 1, 231, 31, 223, 150, 210, 223, 1, 237, 220, 223, + 150, 210, 223, 1, 229, 255, 223, 150, 210, 223, 1, 194, 119, 223, 150, + 210, 223, 1, 192, 89, 223, 150, 210, 223, 1, 229, 194, 223, 150, 210, + 223, 1, 200, 4, 223, 150, 210, 223, 1, 192, 238, 223, 150, 210, 223, 1, + 222, 109, 223, 150, 210, 223, 1, 220, 85, 223, 150, 210, 223, 1, 217, 12, + 223, 150, 210, 223, 1, 212, 230, 223, 150, 210, 223, 1, 206, 46, 223, + 150, 210, 223, 1, 249, 231, 223, 150, 210, 223, 1, 210, 181, 223, 150, + 210, 223, 1, 206, 83, 223, 150, 210, 223, 1, 208, 181, 223, 150, 210, + 223, 1, 207, 188, 223, 150, 210, 223, 1, 203, 224, 223, 150, 210, 223, 1, + 200, 93, 223, 150, 210, 223, 31, 101, 223, 150, 210, 223, 31, 104, 223, + 150, 210, 223, 31, 133, 223, 150, 210, 223, 31, 134, 223, 150, 210, 223, + 31, 200, 30, 223, 150, 210, 223, 31, 197, 239, 223, 150, 210, 223, 31, + 90, 228, 162, 223, 150, 210, 223, 31, 90, 180, 223, 150, 211, 56, 1, 251, + 24, 223, 150, 211, 56, 1, 248, 62, 223, 150, 211, 56, 1, 231, 31, 223, + 150, 211, 56, 1, 237, 220, 223, 150, 211, 56, 1, 229, 255, 223, 150, 211, + 56, 1, 194, 118, 223, 150, 211, 56, 1, 192, 89, 223, 150, 211, 56, 1, + 229, 194, 223, 150, 211, 56, 1, 200, 4, 223, 150, 211, 56, 1, 192, 238, + 223, 150, 211, 56, 1, 222, 109, 223, 150, 211, 56, 1, 220, 85, 223, 150, + 211, 56, 1, 217, 11, 223, 150, 211, 56, 1, 212, 230, 223, 150, 211, 56, + 1, 206, 46, 223, 150, 211, 56, 1, 210, 181, 223, 150, 211, 56, 1, 206, + 83, 223, 150, 211, 56, 1, 203, 224, 223, 150, 211, 56, 1, 200, 93, 223, + 150, 211, 56, 31, 101, 223, 150, 211, 56, 31, 104, 223, 150, 211, 56, 31, + 133, 223, 150, 211, 56, 31, 134, 223, 150, 211, 56, 31, 200, 30, 223, + 150, 211, 56, 31, 197, 239, 223, 150, 211, 56, 31, 90, 228, 162, 223, + 150, 211, 56, 31, 90, 180, 209, 63, 211, 56, 1, 251, 24, 209, 63, 211, + 56, 1, 248, 62, 209, 63, 211, 56, 1, 231, 31, 209, 63, 211, 56, 1, 237, + 220, 209, 63, 211, 56, 1, 229, 255, 209, 63, 211, 56, 1, 194, 118, 209, + 63, 211, 56, 1, 192, 89, 209, 63, 211, 56, 1, 229, 194, 209, 63, 211, 56, + 1, 192, 238, 209, 63, 211, 56, 1, 222, 109, 209, 63, 211, 56, 1, 220, 85, + 209, 63, 211, 56, 1, 217, 11, 209, 63, 211, 56, 1, 212, 230, 209, 63, + 211, 56, 1, 206, 46, 209, 63, 211, 56, 1, 210, 181, 209, 63, 211, 56, 1, + 206, 83, 209, 63, 211, 56, 1, 203, 224, 209, 63, 211, 56, 1, 200, 93, + 209, 63, 211, 56, 205, 209, 77, 209, 63, 211, 56, 163, 205, 209, 77, 209, + 63, 211, 56, 232, 119, 236, 112, 4, 238, 183, 209, 63, 211, 56, 232, 119, + 236, 112, 4, 236, 114, 209, 63, 211, 56, 31, 101, 209, 63, 211, 56, 31, + 104, 209, 63, 211, 56, 31, 133, 209, 63, 211, 56, 31, 134, 209, 63, 211, + 56, 31, 200, 30, 209, 63, 211, 56, 31, 197, 239, 209, 63, 211, 56, 31, + 90, 228, 162, 40, 198, 12, 1, 211, 152, 64, 40, 198, 12, 1, 193, 57, 64, + 40, 198, 12, 1, 193, 57, 251, 108, 40, 198, 12, 1, 211, 152, 70, 40, 198, + 12, 1, 193, 57, 70, 40, 198, 12, 1, 193, 57, 71, 40, 198, 12, 1, 211, + 152, 74, 40, 198, 12, 1, 211, 152, 212, 0, 40, 198, 12, 1, 193, 57, 212, + 0, 40, 198, 12, 1, 211, 152, 251, 238, 40, 198, 12, 1, 193, 57, 251, 238, + 40, 198, 12, 1, 211, 152, 251, 107, 40, 198, 12, 1, 193, 57, 251, 107, + 40, 198, 12, 1, 211, 152, 251, 80, 40, 198, 12, 1, 193, 57, 251, 80, 40, + 198, 12, 1, 211, 152, 251, 102, 40, 198, 12, 1, 193, 57, 251, 102, 40, + 198, 12, 1, 211, 152, 251, 125, 40, 198, 12, 1, 193, 57, 251, 125, 40, + 198, 12, 1, 211, 152, 251, 106, 40, 198, 12, 1, 211, 152, 233, 170, 40, + 198, 12, 1, 193, 57, 233, 170, 40, 198, 12, 1, 211, 152, 249, 236, 40, + 198, 12, 1, 193, 57, 249, 236, 40, 198, 12, 1, 211, 152, 251, 89, 40, + 198, 12, 1, 193, 57, 251, 89, 40, 198, 12, 1, 211, 152, 251, 100, 40, + 198, 12, 1, 193, 57, 251, 100, 40, 198, 12, 1, 211, 152, 211, 254, 40, + 198, 12, 1, 193, 57, 211, 254, 40, 198, 12, 1, 211, 152, 251, 35, 40, + 198, 12, 1, 193, 57, 251, 35, 40, 198, 12, 1, 211, 152, 251, 99, 40, 198, + 12, 1, 211, 152, 234, 103, 40, 198, 12, 1, 211, 152, 234, 99, 40, 198, + 12, 1, 211, 152, 250, 224, 40, 198, 12, 1, 211, 152, 251, 97, 40, 198, + 12, 1, 193, 57, 251, 97, 40, 198, 12, 1, 211, 152, 234, 65, 40, 198, 12, + 1, 193, 57, 234, 65, 40, 198, 12, 1, 211, 152, 234, 85, 40, 198, 12, 1, + 193, 57, 234, 85, 40, 198, 12, 1, 211, 152, 234, 51, 40, 198, 12, 1, 193, + 57, 234, 51, 40, 198, 12, 1, 193, 57, 250, 214, 40, 198, 12, 1, 211, 152, + 234, 73, 40, 198, 12, 1, 193, 57, 251, 96, 40, 198, 12, 1, 211, 152, 234, + 41, 40, 198, 12, 1, 211, 152, 211, 185, 40, 198, 12, 1, 211, 152, 228, + 51, 40, 198, 12, 1, 211, 152, 234, 179, 40, 198, 12, 1, 193, 57, 234, + 179, 40, 198, 12, 1, 211, 152, 250, 135, 40, 198, 12, 1, 193, 57, 250, + 135, 40, 198, 12, 1, 211, 152, 223, 107, 40, 198, 12, 1, 193, 57, 223, + 107, 40, 198, 12, 1, 211, 152, 211, 165, 40, 198, 12, 1, 193, 57, 211, + 165, 40, 198, 12, 1, 211, 152, 250, 131, 40, 198, 12, 1, 193, 57, 250, + 131, 40, 198, 12, 1, 211, 152, 251, 95, 40, 198, 12, 1, 211, 152, 250, + 61, 40, 198, 12, 1, 211, 152, 251, 93, 40, 198, 12, 1, 211, 152, 250, 53, + 40, 198, 12, 1, 193, 57, 250, 53, 40, 198, 12, 1, 211, 152, 233, 255, 40, + 198, 12, 1, 193, 57, 233, 255, 40, 198, 12, 1, 211, 152, 250, 26, 40, + 198, 12, 1, 193, 57, 250, 26, 40, 198, 12, 1, 211, 152, 251, 90, 40, 198, + 12, 1, 193, 57, 251, 90, 40, 198, 12, 1, 211, 152, 211, 140, 40, 198, 12, + 1, 211, 152, 248, 177, 40, 169, 6, 1, 64, 40, 169, 6, 1, 252, 33, 40, + 169, 6, 1, 234, 181, 40, 169, 6, 1, 250, 236, 40, 169, 6, 1, 234, 179, + 40, 169, 6, 1, 234, 85, 40, 169, 6, 1, 234, 176, 40, 169, 6, 1, 234, 175, + 40, 169, 6, 1, 250, 217, 40, 169, 6, 1, 71, 40, 169, 6, 1, 242, 85, 71, + 40, 169, 6, 1, 234, 171, 40, 169, 6, 1, 234, 164, 40, 169, 6, 1, 234, + 163, 40, 169, 6, 1, 234, 160, 40, 169, 6, 1, 234, 157, 40, 169, 6, 1, 70, + 40, 169, 6, 1, 223, 224, 40, 169, 6, 1, 234, 134, 40, 169, 6, 1, 234, + 131, 40, 169, 6, 1, 251, 44, 40, 169, 6, 1, 197, 50, 40, 169, 6, 1, 234, + 124, 40, 169, 6, 1, 234, 102, 40, 169, 6, 1, 234, 99, 40, 169, 6, 1, 234, + 88, 40, 169, 6, 1, 234, 51, 40, 169, 6, 1, 74, 40, 169, 6, 1, 211, 194, + 40, 169, 6, 1, 214, 23, 212, 0, 40, 169, 6, 1, 206, 208, 212, 0, 40, 169, + 6, 1, 211, 255, 40, 169, 6, 1, 234, 41, 40, 169, 6, 1, 234, 93, 40, 169, + 6, 1, 234, 21, 40, 169, 6, 1, 203, 195, 234, 21, 40, 169, 6, 1, 234, 9, + 40, 169, 6, 1, 233, 244, 40, 169, 6, 1, 233, 242, 40, 169, 6, 1, 234, 65, + 40, 169, 6, 1, 233, 231, 40, 169, 6, 1, 234, 177, 40, 169, 6, 1, 68, 40, + 169, 6, 1, 196, 251, 40, 169, 6, 1, 214, 23, 197, 104, 40, 169, 6, 1, + 206, 208, 197, 104, 40, 169, 6, 1, 233, 218, 40, 169, 6, 1, 233, 170, 40, + 169, 6, 1, 233, 165, 40, 169, 6, 1, 234, 64, 57, 40, 169, 6, 1, 197, 10, + 40, 169, 2, 1, 64, 40, 169, 2, 1, 252, 33, 40, 169, 2, 1, 234, 181, 40, + 169, 2, 1, 250, 236, 40, 169, 2, 1, 234, 179, 40, 169, 2, 1, 234, 85, 40, + 169, 2, 1, 234, 176, 40, 169, 2, 1, 234, 175, 40, 169, 2, 1, 250, 217, + 40, 169, 2, 1, 71, 40, 169, 2, 1, 242, 85, 71, 40, 169, 2, 1, 234, 171, + 40, 169, 2, 1, 234, 164, 40, 169, 2, 1, 234, 163, 40, 169, 2, 1, 234, + 160, 40, 169, 2, 1, 234, 157, 40, 169, 2, 1, 70, 40, 169, 2, 1, 223, 224, + 40, 169, 2, 1, 234, 134, 40, 169, 2, 1, 234, 131, 40, 169, 2, 1, 251, 44, + 40, 169, 2, 1, 197, 50, 40, 169, 2, 1, 234, 124, 40, 169, 2, 1, 234, 102, + 40, 169, 2, 1, 234, 99, 40, 169, 2, 1, 234, 88, 40, 169, 2, 1, 234, 51, + 40, 169, 2, 1, 74, 40, 169, 2, 1, 211, 194, 40, 169, 2, 1, 214, 23, 212, + 0, 40, 169, 2, 1, 206, 208, 212, 0, 40, 169, 2, 1, 211, 255, 40, 169, 2, + 1, 234, 41, 40, 169, 2, 1, 234, 93, 40, 169, 2, 1, 234, 21, 40, 169, 2, + 1, 203, 195, 234, 21, 40, 169, 2, 1, 234, 9, 40, 169, 2, 1, 233, 244, 40, + 169, 2, 1, 233, 242, 40, 169, 2, 1, 234, 65, 40, 169, 2, 1, 233, 231, 40, + 169, 2, 1, 234, 177, 40, 169, 2, 1, 68, 40, 169, 2, 1, 196, 251, 40, 169, + 2, 1, 214, 23, 197, 104, 40, 169, 2, 1, 206, 208, 197, 104, 40, 169, 2, + 1, 233, 218, 40, 169, 2, 1, 233, 170, 40, 169, 2, 1, 233, 165, 40, 169, + 2, 1, 234, 64, 57, 40, 169, 2, 1, 197, 10, 40, 169, 31, 101, 40, 169, 31, + 151, 40, 169, 31, 200, 30, 40, 169, 31, 233, 3, 40, 169, 31, 90, 228, + 162, 40, 169, 31, 90, 180, 230, 33, 207, 36, 1, 64, 230, 33, 207, 36, 1, + 249, 3, 230, 33, 207, 36, 1, 166, 230, 33, 207, 36, 1, 189, 230, 33, 207, + 36, 1, 198, 83, 230, 33, 207, 36, 1, 223, 62, 230, 33, 207, 36, 1, 247, + 19, 230, 33, 207, 36, 1, 144, 230, 33, 207, 36, 1, 221, 250, 230, 33, + 207, 36, 1, 233, 97, 230, 33, 207, 36, 1, 238, 0, 230, 33, 207, 36, 1, + 237, 161, 230, 33, 207, 36, 1, 167, 230, 33, 207, 36, 1, 207, 3, 230, 33, + 207, 36, 1, 192, 112, 230, 33, 207, 36, 1, 188, 230, 33, 207, 36, 1, 204, + 64, 230, 33, 207, 36, 1, 160, 230, 33, 207, 36, 1, 231, 233, 230, 33, + 207, 36, 1, 177, 230, 33, 207, 36, 1, 172, 230, 33, 207, 36, 1, 181, 230, + 33, 207, 36, 1, 194, 169, 230, 33, 207, 36, 1, 221, 175, 194, 169, 230, + 33, 207, 36, 1, 168, 230, 33, 207, 36, 1, 221, 175, 168, 230, 33, 207, + 36, 1, 214, 165, 230, 33, 207, 36, 1, 212, 201, 230, 33, 207, 36, 1, 196, + 157, 230, 33, 207, 36, 18, 64, 230, 33, 207, 36, 18, 70, 230, 33, 207, + 36, 18, 68, 230, 33, 207, 36, 18, 71, 230, 33, 207, 36, 18, 74, 230, 33, + 207, 36, 122, 206, 67, 230, 33, 207, 36, 122, 215, 97, 221, 216, 230, 33, + 207, 36, 3, 230, 27, 230, 33, 207, 36, 3, 200, 150, 230, 33, 207, 36, 3, + 200, 124, 230, 33, 207, 36, 3, 200, 106, 230, 33, 207, 36, 17, 192, 76, + 230, 33, 207, 36, 17, 101, 230, 33, 207, 36, 17, 104, 230, 33, 207, 36, + 17, 133, 230, 33, 207, 36, 17, 134, 230, 33, 207, 36, 17, 151, 230, 33, + 207, 36, 17, 170, 230, 33, 207, 36, 17, 179, 230, 33, 207, 36, 17, 174, + 230, 33, 207, 36, 17, 182, 206, 196, 17, 101, 206, 196, 17, 104, 206, + 196, 17, 133, 206, 196, 17, 134, 206, 196, 17, 151, 206, 196, 17, 170, + 206, 196, 17, 179, 206, 196, 17, 174, 206, 196, 17, 182, 206, 196, 31, + 200, 30, 206, 196, 31, 197, 239, 206, 196, 31, 199, 184, 206, 196, 31, + 232, 126, 206, 196, 31, 233, 3, 206, 196, 31, 203, 25, 206, 196, 31, 204, + 140, 206, 196, 31, 234, 137, 206, 196, 31, 214, 11, 206, 196, 31, 90, + 228, 162, 206, 196, 31, 103, 228, 162, 206, 196, 31, 112, 228, 162, 206, + 196, 31, 232, 119, 228, 162, 206, 196, 31, 232, 214, 228, 162, 206, 196, + 31, 203, 41, 228, 162, 206, 196, 31, 204, 146, 228, 162, 206, 196, 31, + 234, 148, 228, 162, 206, 196, 31, 214, 16, 228, 162, 206, 196, 232, 109, + 90, 230, 78, 206, 196, 232, 109, 90, 208, 167, 206, 196, 232, 109, 90, + 199, 191, 206, 196, 232, 109, 103, 199, 188, 193, 28, 1, 234, 108, 193, + 28, 1, 248, 123, 193, 28, 1, 210, 181, 193, 28, 1, 210, 80, 193, 28, 1, + 199, 224, 193, 28, 1, 205, 223, 193, 28, 1, 242, 136, 193, 28, 1, 242, + 203, 193, 28, 1, 242, 217, 193, 28, 1, 229, 187, 193, 28, 1, 193, 209, + 193, 28, 1, 237, 227, 193, 28, 1, 192, 101, 193, 28, 1, 167, 193, 28, 1, + 207, 156, 193, 28, 1, 192, 112, 193, 28, 1, 223, 62, 193, 28, 1, 203, 78, + 193, 28, 1, 203, 224, 193, 28, 1, 206, 86, 193, 28, 1, 237, 250, 193, 28, + 1, 189, 193, 28, 1, 192, 85, 193, 28, 1, 233, 172, 193, 28, 1, 193, 197, + 193, 28, 1, 233, 97, 193, 28, 1, 196, 157, 193, 28, 1, 196, 158, 250, + 249, 20, 193, 28, 1, 208, 232, 193, 28, 1, 222, 139, 193, 28, 1, 221, + 247, 193, 28, 1, 231, 220, 193, 28, 1, 220, 94, 193, 28, 1, 216, 122, + 193, 28, 1, 212, 230, 193, 28, 1, 197, 84, 193, 28, 1, 194, 119, 193, 28, + 1, 211, 106, 193, 28, 1, 233, 212, 193, 28, 1, 230, 6, 193, 28, 1, 192, + 229, 193, 28, 1, 233, 242, 193, 28, 38, 230, 67, 77, 193, 28, 38, 217, + 210, 77, 193, 28, 228, 109, 77, 193, 28, 1, 220, 95, 4, 78, 58, 193, 28, + 1, 192, 230, 4, 242, 122, 58, 40, 202, 194, 1, 251, 24, 40, 202, 194, 1, + 52, 251, 24, 40, 202, 194, 1, 248, 62, 40, 202, 194, 1, 52, 248, 62, 40, + 202, 194, 1, 231, 31, 40, 202, 194, 1, 229, 255, 40, 202, 194, 1, 52, + 229, 255, 40, 202, 194, 1, 194, 119, 40, 202, 194, 1, 192, 89, 40, 202, + 194, 1, 229, 194, 40, 202, 194, 1, 192, 238, 40, 202, 194, 1, 222, 109, + 40, 202, 194, 1, 220, 85, 40, 202, 194, 1, 217, 12, 40, 202, 194, 1, 212, + 230, 40, 202, 194, 1, 52, 212, 230, 40, 202, 194, 1, 52, 212, 231, 4, 84, + 200, 147, 40, 202, 194, 1, 206, 46, 40, 202, 194, 1, 249, 231, 40, 202, + 194, 1, 250, 249, 249, 231, 40, 202, 194, 1, 210, 181, 40, 202, 194, 1, + 206, 83, 40, 202, 194, 1, 52, 206, 83, 40, 202, 194, 1, 52, 206, 84, 4, + 84, 200, 147, 40, 202, 194, 1, 207, 186, 40, 202, 194, 1, 203, 224, 40, + 202, 194, 1, 200, 93, 40, 202, 194, 1, 52, 200, 93, 40, 202, 194, 1, 52, + 200, 94, 4, 84, 200, 147, 40, 202, 194, 31, 101, 40, 202, 194, 31, 104, + 40, 202, 194, 31, 133, 40, 202, 194, 31, 134, 40, 202, 194, 31, 151, 40, + 202, 194, 31, 200, 30, 40, 202, 194, 31, 197, 239, 40, 202, 194, 31, 199, + 184, 40, 202, 194, 31, 90, 228, 162, 40, 202, 194, 232, 109, 90, 230, 78, + 40, 202, 194, 34, 249, 230, 202, 194, 1, 251, 24, 202, 194, 1, 248, 62, + 202, 194, 1, 231, 31, 202, 194, 1, 229, 255, 202, 194, 1, 194, 119, 202, + 194, 1, 192, 89, 202, 194, 1, 229, 194, 202, 194, 1, 192, 238, 202, 194, + 1, 222, 109, 202, 194, 1, 220, 85, 202, 194, 1, 217, 12, 202, 194, 1, + 212, 230, 202, 194, 1, 206, 46, 202, 194, 1, 249, 231, 202, 194, 1, 210, + 181, 202, 194, 1, 206, 83, 202, 194, 1, 207, 187, 202, 194, 1, 203, 224, + 202, 194, 1, 200, 93, 202, 194, 1, 233, 18, 202, 194, 1, 219, 242, 202, + 194, 223, 177, 203, 224, 202, 194, 38, 78, 63, 202, 194, 38, 103, 236, + 112, 63, 202, 194, 38, 78, 58, 202, 194, 38, 103, 236, 112, 58, 202, 194, + 38, 238, 132, 58, 202, 194, 38, 238, 132, 63, 202, 194, 38, 229, 15, 58, + 202, 194, 38, 229, 15, 63, 202, 194, 38, 184, 229, 15, 63, 202, 194, 38, + 207, 189, 63, 202, 194, 38, 201, 208, 63, 202, 194, 31, 101, 202, 194, + 31, 200, 30, 202, 194, 31, 197, 239, 202, 194, 31, 90, 228, 162, 202, + 194, 209, 38, 103, 84, 248, 182, 202, 194, 209, 38, 103, 84, 248, 183, 4, + 236, 111, 202, 194, 209, 38, 242, 131, 4, 236, 114, 202, 194, 209, 38, + 103, 242, 128, 4, 236, 111, 202, 194, 209, 38, 138, 242, 131, 4, 236, + 114, 242, 181, 1, 251, 24, 242, 181, 1, 2, 251, 24, 242, 181, 1, 248, 62, + 242, 181, 1, 231, 31, 242, 181, 1, 237, 220, 242, 181, 1, 229, 255, 242, + 181, 1, 194, 119, 242, 181, 1, 238, 141, 194, 119, 242, 181, 1, 192, 89, + 242, 181, 1, 229, 194, 242, 181, 1, 192, 238, 242, 181, 1, 222, 109, 242, + 181, 1, 220, 85, 242, 181, 1, 217, 12, 242, 181, 1, 212, 230, 242, 181, + 1, 206, 46, 242, 181, 1, 249, 231, 242, 181, 1, 210, 181, 242, 181, 1, + 207, 188, 242, 181, 1, 203, 224, 242, 181, 1, 200, 93, 242, 181, 31, 101, + 242, 181, 31, 104, 242, 181, 31, 133, 242, 181, 31, 134, 242, 181, 31, + 200, 30, 242, 181, 31, 197, 239, 242, 181, 31, 90, 228, 162, 234, 101, 1, + 251, 24, 234, 101, 1, 248, 62, 234, 101, 1, 231, 31, 234, 101, 1, 237, + 220, 234, 101, 1, 229, 255, 234, 101, 1, 194, 119, 234, 101, 1, 192, 89, + 234, 101, 1, 229, 194, 234, 101, 1, 200, 4, 234, 101, 1, 192, 238, 234, + 101, 1, 222, 109, 234, 101, 1, 220, 85, 234, 101, 1, 217, 12, 234, 101, + 1, 212, 230, 234, 101, 1, 206, 46, 234, 101, 1, 249, 231, 234, 101, 1, + 210, 181, 234, 101, 1, 206, 83, 234, 101, 1, 208, 181, 234, 101, 1, 207, + 188, 234, 101, 1, 203, 224, 234, 101, 1, 200, 93, 234, 101, 34, 192, 88, + 164, 3, 246, 234, 164, 3, 250, 168, 164, 3, 196, 6, 164, 3, 223, 13, 164, + 3, 197, 39, 164, 1, 64, 164, 1, 252, 33, 164, 1, 70, 164, 1, 223, 224, + 164, 1, 68, 164, 1, 196, 251, 164, 1, 118, 150, 164, 1, 118, 207, 4, 164, + 1, 118, 165, 164, 1, 118, 219, 138, 164, 1, 71, 164, 1, 251, 63, 164, 1, + 74, 164, 1, 250, 8, 164, 1, 160, 164, 1, 221, 250, 164, 1, 231, 233, 164, + 1, 231, 84, 164, 1, 214, 165, 164, 1, 247, 19, 164, 1, 246, 117, 164, 1, + 223, 62, 164, 1, 223, 28, 164, 1, 212, 201, 164, 1, 198, 83, 164, 1, 198, + 71, 164, 1, 237, 161, 164, 1, 237, 145, 164, 1, 213, 178, 164, 1, 189, + 164, 1, 199, 240, 164, 1, 238, 0, 164, 1, 237, 40, 164, 1, 181, 164, 1, + 166, 164, 1, 210, 94, 164, 1, 249, 3, 164, 1, 248, 54, 164, 1, 172, 164, + 1, 168, 164, 1, 167, 164, 1, 177, 164, 1, 196, 157, 164, 1, 204, 64, 164, + 1, 202, 92, 164, 1, 188, 164, 1, 144, 164, 1, 219, 137, 164, 1, 40, 44, + 219, 126, 164, 1, 40, 44, 207, 3, 164, 1, 40, 44, 213, 160, 164, 18, 3, + 252, 33, 164, 18, 3, 248, 50, 252, 33, 164, 18, 3, 70, 164, 18, 3, 223, + 224, 164, 18, 3, 68, 164, 18, 3, 196, 251, 164, 18, 3, 118, 150, 164, 18, + 3, 118, 207, 4, 164, 18, 3, 118, 165, 164, 18, 3, 118, 219, 138, 164, 18, + 3, 71, 164, 18, 3, 251, 63, 164, 18, 3, 74, 164, 18, 3, 250, 8, 164, 196, + 11, 164, 237, 208, 164, 55, 237, 208, 164, 209, 38, 236, 114, 164, 209, + 38, 55, 236, 114, 164, 209, 38, 219, 175, 164, 209, 38, 238, 194, 161, + 164, 209, 38, 219, 57, 164, 31, 101, 164, 31, 104, 164, 31, 133, 164, 31, + 134, 164, 31, 151, 164, 31, 170, 164, 31, 179, 164, 31, 174, 164, 31, + 182, 164, 31, 200, 30, 164, 31, 197, 239, 164, 31, 199, 184, 164, 31, + 232, 126, 164, 31, 233, 3, 164, 31, 203, 25, 164, 31, 204, 140, 164, 31, + 234, 137, 164, 31, 214, 11, 164, 31, 90, 228, 162, 164, 31, 90, 180, 164, + 17, 192, 76, 164, 17, 101, 164, 17, 104, 164, 17, 133, 164, 17, 134, 164, + 17, 151, 164, 17, 170, 164, 17, 179, 164, 17, 174, 164, 17, 182, 164, 31, + 222, 228, 222, 132, 3, 246, 234, 222, 132, 3, 250, 168, 222, 132, 3, 196, + 6, 222, 132, 1, 64, 222, 132, 1, 252, 33, 222, 132, 1, 70, 222, 132, 1, + 223, 224, 222, 132, 1, 68, 222, 132, 1, 196, 251, 222, 132, 1, 71, 222, + 132, 1, 251, 63, 222, 132, 1, 74, 222, 132, 1, 250, 8, 222, 132, 1, 160, + 222, 132, 1, 221, 250, 222, 132, 1, 231, 233, 222, 132, 1, 231, 84, 222, + 132, 1, 214, 165, 222, 132, 1, 247, 19, 222, 132, 1, 246, 117, 222, 132, + 1, 223, 62, 222, 132, 1, 223, 28, 222, 132, 1, 212, 201, 222, 132, 1, + 198, 83, 222, 132, 1, 198, 71, 222, 132, 1, 237, 161, 222, 132, 1, 237, + 150, 222, 132, 1, 237, 145, 222, 132, 1, 207, 156, 222, 132, 1, 213, 178, + 222, 132, 1, 189, 222, 132, 1, 199, 240, 222, 132, 1, 238, 0, 222, 132, + 1, 237, 40, 222, 132, 1, 181, 222, 132, 1, 166, 222, 132, 1, 210, 94, + 222, 132, 1, 249, 3, 222, 132, 1, 248, 54, 222, 132, 1, 172, 222, 132, 1, + 168, 222, 132, 1, 167, 222, 132, 1, 177, 222, 132, 1, 196, 157, 222, 132, + 1, 204, 64, 222, 132, 1, 202, 92, 222, 132, 1, 188, 222, 132, 1, 144, + 222, 132, 18, 3, 252, 33, 222, 132, 18, 3, 70, 222, 132, 18, 3, 223, 224, + 222, 132, 18, 3, 68, 222, 132, 18, 3, 196, 251, 222, 132, 18, 3, 71, 222, + 132, 18, 3, 251, 63, 222, 132, 18, 3, 74, 222, 132, 18, 3, 250, 8, 222, + 132, 3, 196, 11, 222, 132, 3, 212, 241, 222, 132, 251, 151, 57, 222, 132, + 234, 54, 57, 222, 132, 31, 57, 222, 132, 205, 209, 77, 222, 132, 55, 205, + 209, 77, 222, 132, 237, 208, 222, 132, 55, 237, 208, 222, 132, 31, 3, 58, + 202, 179, 202, 187, 1, 206, 76, 202, 179, 202, 187, 1, 200, 151, 202, + 179, 202, 187, 1, 248, 229, 202, 179, 202, 187, 1, 247, 8, 202, 179, 202, + 187, 1, 237, 236, 202, 179, 202, 187, 1, 231, 218, 202, 179, 202, 187, 1, + 217, 188, 202, 179, 202, 187, 1, 214, 162, 202, 179, 202, 187, 1, 220, + 158, 202, 179, 202, 187, 1, 215, 71, 202, 179, 202, 187, 1, 196, 153, + 202, 179, 202, 187, 1, 211, 57, 202, 179, 202, 187, 1, 193, 110, 202, + 179, 202, 187, 1, 208, 50, 202, 179, 202, 187, 1, 230, 89, 202, 179, 202, + 187, 1, 222, 137, 202, 179, 202, 187, 1, 223, 56, 202, 179, 202, 187, 1, + 212, 198, 202, 179, 202, 187, 1, 251, 72, 202, 179, 202, 187, 1, 234, + 169, 202, 179, 202, 187, 1, 223, 225, 202, 179, 202, 187, 1, 197, 97, + 202, 179, 202, 187, 1, 211, 241, 202, 179, 202, 187, 1, 234, 157, 202, + 179, 202, 187, 1, 217, 204, 202, 179, 202, 187, 17, 192, 76, 202, 179, + 202, 187, 17, 101, 202, 179, 202, 187, 17, 104, 202, 179, 202, 187, 17, + 133, 202, 179, 202, 187, 17, 134, 202, 179, 202, 187, 17, 151, 202, 179, + 202, 187, 17, 170, 202, 179, 202, 187, 17, 179, 202, 179, 202, 187, 17, + 174, 202, 179, 202, 187, 17, 182, 246, 111, 3, 246, 234, 246, 111, 3, + 250, 168, 246, 111, 3, 196, 6, 246, 111, 1, 252, 33, 246, 111, 1, 70, + 246, 111, 1, 68, 246, 111, 1, 71, 246, 111, 1, 222, 159, 246, 111, 1, + 221, 249, 246, 111, 1, 231, 230, 246, 111, 1, 231, 83, 246, 111, 1, 214, + 164, 246, 111, 1, 247, 18, 246, 111, 1, 246, 116, 246, 111, 1, 223, 61, + 246, 111, 1, 223, 27, 246, 111, 1, 212, 200, 246, 111, 1, 198, 82, 246, + 111, 1, 198, 70, 246, 111, 1, 237, 160, 246, 111, 1, 237, 144, 246, 111, + 1, 213, 177, 246, 111, 1, 200, 174, 246, 111, 1, 199, 239, 246, 111, 1, + 237, 255, 246, 111, 1, 237, 39, 246, 111, 1, 215, 84, 246, 111, 1, 211, + 77, 246, 111, 1, 210, 93, 246, 111, 1, 249, 1, 246, 111, 1, 248, 53, 246, + 111, 1, 217, 219, 246, 111, 1, 192, 163, 246, 111, 1, 193, 129, 246, 111, + 1, 208, 68, 246, 111, 1, 220, 184, 246, 111, 1, 194, 163, 246, 111, 1, + 206, 91, 246, 111, 1, 230, 99, 246, 111, 18, 3, 64, 246, 111, 18, 3, 70, + 246, 111, 18, 3, 223, 224, 246, 111, 18, 3, 68, 246, 111, 18, 3, 196, + 251, 246, 111, 18, 3, 71, 246, 111, 18, 3, 251, 63, 246, 111, 18, 3, 74, + 246, 111, 18, 3, 250, 8, 246, 111, 18, 3, 211, 238, 246, 111, 185, 77, + 246, 111, 250, 9, 77, 246, 111, 196, 11, 246, 111, 217, 217, 246, 111, + 17, 192, 76, 246, 111, 17, 101, 246, 111, 17, 104, 246, 111, 17, 133, + 246, 111, 17, 134, 246, 111, 17, 151, 246, 111, 17, 170, 246, 111, 17, + 179, 246, 111, 17, 174, 246, 111, 17, 182, 246, 111, 205, 209, 77, 246, + 111, 237, 208, 246, 111, 55, 237, 208, 246, 111, 208, 159, 77, 246, 111, + 1, 219, 221, 246, 111, 18, 3, 252, 33, 246, 111, 18, 3, 234, 150, 246, + 111, 1, 196, 156, 217, 186, 1, 64, 217, 186, 1, 70, 217, 186, 1, 68, 217, + 186, 1, 71, 217, 186, 1, 74, 217, 186, 1, 160, 217, 186, 1, 221, 250, + 217, 186, 1, 231, 233, 217, 186, 1, 231, 84, 217, 186, 1, 247, 19, 217, + 186, 1, 246, 117, 217, 186, 1, 223, 62, 217, 186, 1, 223, 28, 217, 186, + 1, 212, 201, 217, 186, 1, 198, 83, 217, 186, 1, 198, 71, 217, 186, 1, + 237, 161, 217, 186, 1, 237, 145, 217, 186, 1, 213, 178, 217, 186, 1, 189, + 217, 186, 1, 199, 240, 217, 186, 1, 238, 0, 217, 186, 1, 237, 40, 217, + 186, 1, 181, 217, 186, 1, 166, 217, 186, 1, 210, 94, 217, 186, 1, 249, 3, + 217, 186, 1, 248, 54, 217, 186, 1, 172, 217, 186, 1, 167, 217, 186, 1, + 177, 217, 186, 1, 196, 157, 217, 186, 1, 188, 217, 186, 1, 144, 217, 186, + 1, 207, 3, 217, 186, 3, 212, 241, 217, 186, 251, 151, 57, 217, 186, 205, + 209, 77, 217, 186, 34, 203, 172, 204, 28, 3, 246, 234, 204, 28, 3, 250, + 168, 204, 28, 3, 196, 6, 204, 28, 1, 64, 204, 28, 1, 252, 33, 204, 28, 1, + 70, 204, 28, 1, 223, 224, 204, 28, 1, 68, 204, 28, 1, 196, 251, 204, 28, + 1, 118, 150, 204, 28, 1, 118, 207, 4, 204, 28, 1, 118, 165, 204, 28, 1, + 118, 219, 138, 204, 28, 1, 71, 204, 28, 1, 251, 63, 204, 28, 1, 74, 204, + 28, 1, 250, 8, 204, 28, 1, 160, 204, 28, 1, 221, 250, 204, 28, 1, 231, + 233, 204, 28, 1, 231, 84, 204, 28, 1, 214, 165, 204, 28, 1, 247, 19, 204, + 28, 1, 246, 117, 204, 28, 1, 223, 62, 204, 28, 1, 223, 28, 204, 28, 1, + 212, 201, 204, 28, 1, 198, 83, 204, 28, 1, 198, 71, 204, 28, 1, 237, 161, + 204, 28, 1, 237, 145, 204, 28, 1, 213, 178, 204, 28, 1, 189, 204, 28, 1, + 199, 240, 204, 28, 1, 238, 0, 204, 28, 1, 237, 40, 204, 28, 1, 181, 204, + 28, 1, 166, 204, 28, 1, 210, 94, 204, 28, 1, 249, 3, 204, 28, 1, 248, 54, + 204, 28, 1, 172, 204, 28, 1, 168, 204, 28, 1, 167, 204, 28, 1, 177, 204, + 28, 1, 219, 137, 204, 28, 1, 196, 157, 204, 28, 1, 204, 64, 204, 28, 1, + 202, 92, 204, 28, 1, 188, 204, 28, 1, 144, 204, 28, 18, 3, 252, 33, 204, + 28, 18, 3, 70, 204, 28, 18, 3, 223, 224, 204, 28, 18, 3, 68, 204, 28, 18, + 3, 196, 251, 204, 28, 18, 3, 118, 150, 204, 28, 18, 3, 118, 207, 4, 204, + 28, 18, 3, 118, 165, 204, 28, 18, 3, 118, 219, 138, 204, 28, 18, 3, 71, + 204, 28, 18, 3, 251, 63, 204, 28, 18, 3, 74, 204, 28, 18, 3, 250, 8, 204, + 28, 3, 196, 11, 204, 28, 3, 249, 246, 204, 28, 3, 223, 13, 204, 28, 3, + 197, 39, 204, 28, 211, 219, 204, 28, 237, 208, 204, 28, 55, 237, 208, + 204, 28, 251, 151, 57, 204, 28, 204, 165, 204, 28, 206, 36, 77, 204, 28, + 3, 212, 241, 204, 28, 18, 73, 77, 204, 28, 233, 189, 203, 195, 18, 77, + 204, 28, 201, 87, 77, 204, 28, 18, 3, 209, 91, 71, 204, 28, 3, 223, 121, + 246, 234, 204, 28, 17, 192, 76, 204, 28, 17, 101, 204, 28, 17, 104, 204, + 28, 17, 133, 204, 28, 17, 134, 204, 28, 17, 151, 204, 28, 17, 170, 204, + 28, 17, 179, 204, 28, 17, 174, 204, 28, 17, 182, 204, 28, 234, 130, 204, + 28, 3, 203, 113, 204, 28, 229, 237, 204, 28, 238, 250, 57, 204, 28, 205, + 209, 217, 126, 204, 28, 205, 209, 217, 125, 159, 250, 112, 17, 101, 159, + 250, 112, 17, 104, 159, 250, 112, 17, 133, 159, 250, 112, 17, 134, 159, + 250, 112, 17, 151, 159, 250, 112, 17, 170, 159, 250, 112, 17, 179, 159, + 250, 112, 17, 174, 159, 250, 112, 17, 182, 159, 250, 112, 31, 200, 30, + 159, 250, 112, 31, 197, 239, 159, 250, 112, 31, 199, 184, 159, 250, 112, + 31, 232, 126, 159, 250, 112, 31, 233, 3, 159, 250, 112, 31, 203, 25, 159, + 250, 112, 31, 204, 140, 159, 250, 112, 31, 234, 137, 159, 250, 112, 31, + 214, 11, 159, 250, 112, 31, 90, 228, 162, 159, 250, 112, 31, 90, 180, + 221, 219, 1, 64, 221, 219, 1, 252, 33, 221, 219, 1, 70, 221, 219, 1, 68, + 221, 219, 1, 71, 221, 219, 1, 251, 63, 221, 219, 1, 74, 221, 219, 1, 250, + 8, 221, 219, 1, 160, 221, 219, 1, 221, 250, 221, 219, 1, 231, 233, 221, + 219, 1, 231, 120, 221, 219, 1, 231, 84, 221, 219, 1, 214, 165, 221, 219, + 1, 247, 19, 221, 219, 1, 246, 117, 221, 219, 1, 223, 62, 221, 219, 1, + 223, 6, 221, 219, 1, 212, 201, 221, 219, 1, 198, 83, 221, 219, 1, 198, + 71, 221, 219, 1, 237, 161, 221, 219, 1, 237, 145, 221, 219, 1, 213, 178, + 221, 219, 1, 189, 221, 219, 1, 199, 240, 221, 219, 1, 238, 0, 221, 219, + 1, 237, 151, 221, 219, 1, 237, 40, 221, 219, 1, 181, 221, 219, 1, 166, + 221, 219, 1, 210, 94, 221, 219, 1, 249, 3, 221, 219, 1, 248, 159, 221, + 219, 1, 248, 54, 221, 219, 1, 172, 221, 219, 1, 168, 221, 219, 1, 167, + 221, 219, 1, 177, 221, 219, 1, 196, 157, 221, 219, 1, 188, 221, 219, 1, + 144, 221, 219, 1, 219, 137, 221, 219, 18, 3, 252, 33, 221, 219, 18, 3, + 70, 221, 219, 18, 3, 223, 224, 221, 219, 18, 3, 68, 221, 219, 18, 3, 71, + 221, 219, 18, 3, 251, 63, 221, 219, 18, 3, 74, 221, 219, 18, 3, 250, 8, + 221, 219, 3, 250, 168, 221, 219, 3, 196, 11, 221, 219, 3, 212, 241, 221, + 219, 3, 204, 54, 221, 219, 237, 208, 221, 219, 55, 237, 208, 221, 219, + 194, 11, 204, 165, 221, 219, 205, 209, 77, 221, 219, 55, 205, 209, 77, + 221, 219, 251, 151, 57, 221, 219, 3, 201, 131, 215, 220, 1, 64, 215, 220, + 1, 70, 215, 220, 1, 68, 215, 220, 1, 71, 215, 220, 1, 160, 215, 220, 1, + 221, 250, 215, 220, 1, 231, 233, 215, 220, 1, 231, 84, 215, 220, 1, 247, + 19, 215, 220, 1, 246, 117, 215, 220, 1, 223, 62, 215, 220, 1, 223, 6, + 215, 220, 1, 212, 201, 215, 220, 1, 198, 83, 215, 220, 1, 198, 71, 215, + 220, 1, 237, 161, 215, 220, 1, 237, 151, 215, 220, 1, 237, 145, 215, 220, + 1, 213, 178, 215, 220, 1, 189, 215, 220, 1, 199, 240, 215, 220, 1, 238, + 0, 215, 220, 1, 237, 40, 215, 220, 1, 181, 215, 220, 1, 166, 215, 220, 1, + 210, 94, 215, 220, 1, 249, 3, 215, 220, 1, 248, 54, 215, 220, 1, 172, + 215, 220, 1, 168, 215, 220, 1, 167, 215, 220, 1, 177, 215, 220, 1, 196, + 157, 215, 220, 1, 188, 215, 220, 1, 144, 215, 220, 1, 207, 3, 215, 220, + 1, 207, 156, 215, 220, 205, 209, 77, 221, 210, 1, 64, 221, 210, 1, 252, + 33, 221, 210, 1, 70, 221, 210, 1, 223, 224, 221, 210, 1, 68, 221, 210, 1, + 196, 251, 221, 210, 1, 71, 221, 210, 1, 251, 63, 221, 210, 1, 74, 221, + 210, 1, 250, 8, 221, 210, 1, 160, 221, 210, 1, 221, 250, 221, 210, 1, + 231, 233, 221, 210, 1, 231, 120, 221, 210, 1, 231, 84, 221, 210, 1, 214, + 165, 221, 210, 1, 247, 19, 221, 210, 1, 246, 117, 221, 210, 1, 223, 62, + 221, 210, 1, 223, 6, 221, 210, 1, 223, 28, 221, 210, 1, 212, 201, 221, + 210, 1, 198, 83, 221, 210, 1, 198, 71, 221, 210, 1, 237, 161, 221, 210, + 1, 237, 151, 221, 210, 1, 207, 3, 221, 210, 1, 237, 145, 221, 210, 1, + 213, 178, 221, 210, 1, 189, 221, 210, 1, 199, 240, 221, 210, 1, 238, 0, + 221, 210, 1, 237, 40, 221, 210, 1, 181, 221, 210, 1, 166, 221, 210, 1, + 210, 94, 221, 210, 1, 249, 3, 221, 210, 1, 248, 159, 221, 210, 1, 248, + 54, 221, 210, 1, 172, 221, 210, 1, 168, 221, 210, 1, 167, 221, 210, 1, + 177, 221, 210, 1, 196, 157, 221, 210, 1, 204, 64, 221, 210, 1, 188, 221, + 210, 1, 144, 221, 210, 3, 250, 168, 221, 210, 18, 3, 252, 33, 221, 210, + 18, 3, 70, 221, 210, 18, 3, 223, 224, 221, 210, 18, 3, 68, 221, 210, 18, + 3, 196, 251, 221, 210, 18, 3, 71, 221, 210, 18, 3, 251, 63, 221, 210, 18, + 3, 74, 221, 210, 18, 3, 250, 8, 221, 210, 3, 212, 241, 221, 210, 3, 196, + 11, 221, 210, 17, 192, 76, 221, 210, 17, 101, 221, 210, 17, 104, 221, + 210, 17, 133, 221, 210, 17, 134, 221, 210, 17, 151, 221, 210, 17, 170, + 221, 210, 17, 179, 221, 210, 17, 174, 221, 210, 17, 182, 230, 219, 3, 38, + 250, 169, 58, 230, 219, 3, 246, 234, 230, 219, 3, 250, 168, 230, 219, 3, + 196, 6, 230, 219, 1, 64, 230, 219, 1, 252, 33, 230, 219, 1, 70, 230, 219, + 1, 223, 224, 230, 219, 1, 68, 230, 219, 1, 196, 251, 230, 219, 1, 118, + 150, 230, 219, 1, 118, 165, 230, 219, 1, 234, 171, 230, 219, 1, 251, 63, + 230, 219, 1, 211, 194, 230, 219, 1, 250, 8, 230, 219, 1, 160, 230, 219, + 1, 221, 250, 230, 219, 1, 231, 233, 230, 219, 1, 231, 84, 230, 219, 1, + 214, 165, 230, 219, 1, 247, 19, 230, 219, 1, 246, 117, 230, 219, 1, 223, + 62, 230, 219, 1, 223, 28, 230, 219, 1, 212, 201, 230, 219, 1, 198, 83, + 230, 219, 1, 198, 71, 230, 219, 1, 237, 161, 230, 219, 1, 237, 145, 230, + 219, 1, 213, 178, 230, 219, 1, 189, 230, 219, 1, 199, 240, 230, 219, 1, + 238, 0, 230, 219, 1, 237, 40, 230, 219, 1, 181, 230, 219, 1, 166, 230, + 219, 1, 210, 94, 230, 219, 1, 249, 3, 230, 219, 1, 248, 54, 230, 219, 1, + 172, 230, 219, 1, 168, 230, 219, 1, 167, 230, 219, 1, 177, 230, 219, 1, + 219, 137, 230, 219, 1, 196, 157, 230, 219, 1, 204, 64, 230, 219, 1, 202, + 92, 230, 219, 1, 188, 230, 219, 1, 144, 38, 248, 18, 63, 230, 219, 3, + 212, 241, 230, 219, 3, 249, 246, 230, 219, 18, 3, 252, 33, 230, 219, 18, + 3, 70, 230, 219, 18, 3, 223, 224, 230, 219, 18, 3, 68, 230, 219, 18, 3, + 196, 251, 230, 219, 18, 3, 118, 150, 230, 219, 18, 3, 118, 207, 4, 230, + 219, 18, 3, 234, 171, 230, 219, 18, 3, 251, 63, 230, 219, 18, 3, 211, + 194, 230, 219, 18, 3, 250, 8, 230, 219, 3, 196, 11, 230, 219, 211, 219, + 230, 219, 250, 9, 220, 2, 77, 230, 219, 3, 209, 204, 230, 219, 1, 196, + 120, 250, 168, 230, 219, 1, 196, 120, 55, 250, 168, 230, 219, 1, 118, + 207, 4, 230, 219, 1, 118, 219, 138, 230, 219, 18, 3, 118, 165, 230, 219, + 18, 3, 118, 219, 138, 38, 230, 219, 17, 192, 76, 38, 230, 219, 17, 101, + 38, 230, 219, 17, 104, 38, 230, 219, 17, 133, 38, 230, 219, 17, 134, 38, + 230, 219, 17, 151, 38, 230, 219, 17, 170, 38, 230, 219, 1, 64, 38, 230, + 219, 1, 160, 38, 230, 219, 1, 181, 38, 230, 219, 1, 196, 39, 38, 230, + 219, 1, 166, 214, 175, 1, 64, 214, 175, 1, 252, 33, 214, 175, 1, 70, 214, + 175, 1, 223, 224, 214, 175, 1, 68, 214, 175, 1, 196, 251, 214, 175, 1, + 118, 150, 214, 175, 1, 118, 207, 4, 214, 175, 1, 118, 165, 214, 175, 1, + 118, 219, 138, 214, 175, 1, 71, 214, 175, 1, 251, 63, 214, 175, 1, 74, + 214, 175, 1, 250, 8, 214, 175, 1, 160, 214, 175, 1, 221, 250, 214, 175, + 1, 231, 233, 214, 175, 1, 231, 84, 214, 175, 1, 214, 165, 214, 175, 1, + 214, 114, 214, 175, 1, 247, 19, 214, 175, 1, 246, 117, 214, 175, 1, 223, + 62, 214, 175, 1, 223, 28, 214, 175, 1, 212, 201, 214, 175, 1, 212, 183, + 214, 175, 1, 198, 83, 214, 175, 1, 198, 71, 214, 175, 1, 237, 161, 214, + 175, 1, 237, 145, 214, 175, 1, 213, 178, 214, 175, 1, 189, 214, 175, 1, + 199, 240, 214, 175, 1, 238, 0, 214, 175, 1, 237, 40, 214, 175, 1, 181, + 214, 175, 1, 214, 65, 214, 175, 1, 166, 214, 175, 1, 210, 94, 214, 175, + 1, 249, 3, 214, 175, 1, 248, 54, 214, 175, 1, 172, 214, 175, 1, 216, 178, + 214, 175, 1, 168, 214, 175, 1, 167, 214, 175, 1, 207, 156, 214, 175, 1, + 177, 214, 175, 1, 219, 222, 214, 175, 1, 194, 169, 214, 175, 1, 204, 64, + 214, 175, 1, 202, 92, 214, 175, 1, 188, 214, 175, 1, 144, 214, 175, 18, + 3, 252, 33, 214, 175, 18, 3, 70, 214, 175, 18, 3, 223, 224, 214, 175, 18, + 3, 68, 214, 175, 18, 3, 196, 251, 214, 175, 18, 3, 118, 150, 214, 175, + 18, 3, 118, 207, 4, 214, 175, 18, 3, 118, 165, 214, 175, 18, 3, 118, 219, + 138, 214, 175, 18, 3, 71, 214, 175, 18, 3, 251, 63, 214, 175, 18, 3, 74, + 214, 175, 18, 3, 250, 8, 214, 175, 3, 196, 11, 214, 175, 3, 246, 234, + 214, 175, 3, 250, 168, 214, 175, 3, 196, 6, 214, 175, 3, 212, 241, 214, + 175, 3, 249, 246, 214, 175, 3, 52, 250, 168, 214, 175, 211, 219, 214, + 175, 203, 112, 214, 175, 237, 208, 214, 175, 55, 237, 208, 214, 175, 242, + 38, 214, 175, 231, 197, 232, 247, 214, 175, 251, 151, 57, 214, 175, 17, + 192, 76, 214, 175, 17, 101, 214, 175, 17, 104, 214, 175, 17, 133, 214, + 175, 17, 134, 214, 175, 17, 151, 214, 175, 17, 170, 214, 175, 17, 179, + 214, 175, 17, 174, 214, 175, 17, 182, 214, 175, 55, 242, 38, 214, 175, + 209, 231, 77, 214, 175, 223, 147, 57, 214, 175, 206, 36, 77, 214, 175, 1, + 196, 120, 250, 168, 214, 175, 3, 223, 13, 214, 175, 3, 197, 39, 199, 67, + 250, 197, 199, 67, 1, 64, 199, 67, 1, 252, 33, 199, 67, 1, 70, 199, 67, + 1, 223, 224, 199, 67, 1, 68, 199, 67, 1, 196, 251, 199, 67, 1, 118, 150, + 199, 67, 1, 118, 207, 4, 199, 67, 1, 118, 165, 199, 67, 1, 118, 219, 138, + 199, 67, 1, 71, 199, 67, 1, 251, 63, 199, 67, 1, 74, 199, 67, 1, 250, 8, + 199, 67, 1, 160, 199, 67, 1, 221, 250, 199, 67, 1, 231, 233, 199, 67, 1, + 231, 84, 199, 67, 1, 214, 165, 199, 67, 1, 247, 19, 199, 67, 1, 246, 117, + 199, 67, 1, 223, 62, 199, 67, 1, 223, 28, 199, 67, 1, 212, 201, 199, 67, + 1, 198, 83, 199, 67, 1, 198, 71, 199, 67, 1, 237, 161, 199, 67, 1, 237, + 145, 199, 67, 1, 213, 178, 199, 67, 1, 189, 199, 67, 1, 199, 240, 199, + 67, 1, 238, 0, 199, 67, 1, 237, 40, 199, 67, 1, 181, 199, 67, 1, 166, + 199, 67, 1, 210, 94, 199, 67, 1, 249, 3, 199, 67, 1, 248, 54, 199, 67, 1, + 172, 199, 67, 1, 168, 199, 67, 1, 167, 199, 67, 1, 177, 199, 67, 1, 196, + 157, 199, 67, 1, 204, 64, 199, 67, 1, 202, 92, 199, 67, 1, 188, 199, 67, + 1, 144, 199, 67, 18, 3, 252, 33, 199, 67, 18, 3, 70, 199, 67, 18, 3, 223, + 224, 199, 67, 18, 3, 68, 199, 67, 18, 3, 196, 251, 199, 67, 18, 3, 118, + 150, 199, 67, 18, 3, 118, 207, 4, 199, 67, 18, 3, 118, 165, 199, 67, 18, + 3, 118, 219, 138, 199, 67, 18, 3, 71, 199, 67, 18, 3, 203, 195, 71, 199, + 67, 18, 3, 251, 63, 199, 67, 18, 3, 74, 199, 67, 18, 3, 203, 195, 74, + 199, 67, 18, 3, 250, 8, 199, 67, 3, 246, 234, 199, 67, 3, 250, 168, 199, + 67, 3, 196, 6, 199, 67, 3, 196, 11, 199, 67, 3, 212, 241, 199, 67, 3, + 249, 246, 199, 67, 230, 145, 199, 67, 251, 151, 57, 199, 67, 211, 219, + 199, 67, 17, 192, 76, 199, 67, 17, 101, 199, 67, 17, 104, 199, 67, 17, + 133, 199, 67, 17, 134, 199, 67, 17, 151, 199, 67, 17, 170, 199, 67, 17, + 179, 199, 67, 17, 174, 199, 67, 17, 182, 203, 114, 1, 64, 203, 114, 1, + 252, 33, 203, 114, 1, 70, 203, 114, 1, 223, 224, 203, 114, 1, 68, 203, + 114, 1, 196, 251, 203, 114, 1, 118, 150, 203, 114, 1, 118, 207, 4, 203, + 114, 1, 118, 165, 203, 114, 1, 118, 219, 138, 203, 114, 1, 71, 203, 114, + 1, 251, 63, 203, 114, 1, 74, 203, 114, 1, 250, 8, 203, 114, 1, 160, 203, + 114, 1, 221, 250, 203, 114, 1, 231, 233, 203, 114, 1, 231, 84, 203, 114, + 1, 214, 165, 203, 114, 1, 247, 19, 203, 114, 1, 246, 117, 203, 114, 1, + 223, 62, 203, 114, 1, 223, 28, 203, 114, 1, 212, 201, 203, 114, 1, 198, + 83, 203, 114, 1, 198, 71, 203, 114, 1, 237, 161, 203, 114, 1, 237, 145, + 203, 114, 1, 213, 178, 203, 114, 1, 189, 203, 114, 1, 199, 240, 203, 114, + 1, 238, 0, 203, 114, 1, 237, 40, 203, 114, 1, 181, 203, 114, 1, 166, 203, + 114, 1, 210, 94, 203, 114, 1, 249, 3, 203, 114, 1, 248, 54, 203, 114, 1, + 172, 203, 114, 1, 168, 203, 114, 1, 167, 203, 114, 1, 177, 203, 114, 1, + 196, 157, 203, 114, 1, 204, 64, 203, 114, 1, 202, 92, 203, 114, 1, 188, + 203, 114, 1, 144, 203, 114, 18, 3, 252, 33, 203, 114, 18, 3, 70, 203, + 114, 18, 3, 223, 224, 203, 114, 18, 3, 68, 203, 114, 18, 3, 196, 251, + 203, 114, 18, 3, 118, 150, 203, 114, 18, 3, 118, 207, 4, 203, 114, 18, 3, + 71, 203, 114, 18, 3, 251, 63, 203, 114, 18, 3, 74, 203, 114, 18, 3, 250, + 8, 203, 114, 3, 246, 234, 203, 114, 3, 250, 168, 203, 114, 3, 196, 6, + 203, 114, 3, 196, 11, 203, 114, 3, 212, 241, 203, 114, 3, 203, 113, 203, + 114, 237, 208, 203, 114, 55, 237, 208, 203, 114, 204, 166, 236, 114, 203, + 114, 204, 166, 161, 203, 114, 207, 196, 217, 126, 203, 114, 207, 196, + 217, 125, 203, 114, 207, 196, 217, 124, 203, 114, 234, 80, 80, 199, 245, + 77, 203, 114, 205, 209, 122, 4, 198, 180, 26, 197, 172, 211, 149, 203, + 114, 205, 209, 122, 4, 198, 180, 26, 235, 111, 238, 192, 203, 114, 205, + 209, 122, 4, 208, 13, 26, 235, 111, 238, 192, 203, 114, 205, 209, 122, 4, + 208, 13, 26, 235, 111, 55, 238, 192, 203, 114, 205, 209, 122, 4, 208, 13, + 26, 235, 111, 198, 170, 238, 192, 203, 114, 205, 209, 122, 55, 207, 81, + 203, 114, 205, 209, 122, 55, 207, 82, 4, 208, 12, 203, 114, 205, 209, + 122, 4, 55, 238, 192, 203, 114, 205, 209, 122, 4, 198, 170, 238, 192, + 203, 114, 205, 209, 122, 4, 208, 170, 238, 192, 203, 114, 205, 209, 122, + 4, 204, 163, 238, 192, 203, 114, 205, 209, 122, 4, 242, 128, 26, 208, 12, + 203, 114, 205, 209, 122, 4, 242, 128, 26, 103, 234, 82, 203, 114, 205, + 209, 122, 4, 242, 128, 26, 232, 119, 234, 82, 203, 114, 1, 199, 161, 250, + 249, 70, 203, 114, 1, 197, 222, 250, 249, 70, 203, 114, 1, 197, 222, 250, + 249, 223, 224, 203, 114, 1, 250, 249, 68, 203, 114, 18, 3, 250, 249, 68, + 203, 114, 18, 3, 250, 249, 196, 251, 216, 76, 1, 64, 216, 76, 1, 252, 33, + 216, 76, 1, 70, 216, 76, 1, 223, 224, 216, 76, 1, 68, 216, 76, 1, 196, + 251, 216, 76, 1, 118, 150, 216, 76, 1, 118, 207, 4, 216, 76, 1, 118, 165, + 216, 76, 1, 118, 219, 138, 216, 76, 1, 71, 216, 76, 1, 251, 63, 216, 76, + 1, 74, 216, 76, 1, 250, 8, 216, 76, 1, 160, 216, 76, 1, 221, 250, 216, + 76, 1, 231, 233, 216, 76, 1, 231, 84, 216, 76, 1, 214, 165, 216, 76, 1, + 247, 19, 216, 76, 1, 246, 117, 216, 76, 1, 223, 62, 216, 76, 1, 223, 28, + 216, 76, 1, 212, 201, 216, 76, 1, 198, 83, 216, 76, 1, 198, 71, 216, 76, + 1, 237, 161, 216, 76, 1, 237, 145, 216, 76, 1, 213, 178, 216, 76, 1, 189, + 216, 76, 1, 199, 240, 216, 76, 1, 238, 0, 216, 76, 1, 237, 40, 216, 76, + 1, 181, 216, 76, 1, 166, 216, 76, 1, 210, 94, 216, 76, 1, 249, 3, 216, + 76, 1, 248, 54, 216, 76, 1, 172, 216, 76, 1, 168, 216, 76, 1, 167, 216, + 76, 1, 177, 216, 76, 1, 196, 157, 216, 76, 1, 204, 64, 216, 76, 1, 202, + 92, 216, 76, 1, 188, 216, 76, 1, 144, 216, 76, 1, 219, 137, 216, 76, 18, + 3, 252, 33, 216, 76, 18, 3, 70, 216, 76, 18, 3, 223, 224, 216, 76, 18, 3, + 68, 216, 76, 18, 3, 196, 251, 216, 76, 18, 3, 118, 150, 216, 76, 18, 3, + 118, 207, 4, 216, 76, 18, 3, 118, 165, 216, 76, 18, 3, 118, 219, 138, + 216, 76, 18, 3, 71, 216, 76, 18, 3, 251, 63, 216, 76, 18, 3, 74, 216, 76, + 18, 3, 250, 8, 216, 76, 3, 250, 168, 216, 76, 3, 196, 6, 216, 76, 3, 196, + 11, 216, 76, 3, 250, 109, 216, 76, 237, 208, 216, 76, 55, 237, 208, 216, + 76, 251, 151, 57, 216, 76, 3, 228, 149, 216, 76, 17, 192, 76, 216, 76, + 17, 101, 216, 76, 17, 104, 216, 76, 17, 133, 216, 76, 17, 134, 216, 76, + 17, 151, 216, 76, 17, 170, 216, 76, 17, 179, 216, 76, 17, 174, 216, 76, + 17, 182, 100, 248, 12, 4, 211, 150, 100, 207, 16, 248, 11, 100, 55, 248, + 12, 4, 211, 150, 100, 198, 170, 248, 12, 4, 211, 150, 100, 248, 12, 4, + 55, 211, 150, 100, 207, 16, 248, 12, 4, 211, 150, 100, 207, 16, 248, 12, + 4, 55, 211, 150, 100, 223, 121, 248, 11, 100, 223, 121, 248, 12, 4, 55, + 211, 150, 100, 201, 63, 248, 11, 100, 201, 63, 248, 12, 4, 211, 150, 100, + 201, 63, 248, 12, 4, 55, 211, 150, 100, 163, 201, 63, 248, 12, 4, 55, + 211, 150, 200, 137, 1, 64, 200, 137, 1, 252, 33, 200, 137, 1, 70, 200, + 137, 1, 223, 224, 200, 137, 1, 68, 200, 137, 1, 196, 251, 200, 137, 1, + 71, 200, 137, 1, 251, 63, 200, 137, 1, 74, 200, 137, 1, 250, 8, 200, 137, + 1, 160, 200, 137, 1, 221, 250, 200, 137, 1, 231, 233, 200, 137, 1, 231, + 84, 200, 137, 1, 214, 165, 200, 137, 1, 247, 19, 200, 137, 1, 246, 117, + 200, 137, 1, 223, 62, 200, 137, 1, 223, 28, 200, 137, 1, 212, 201, 200, + 137, 1, 198, 83, 200, 137, 1, 198, 71, 200, 137, 1, 237, 161, 200, 137, + 1, 237, 145, 200, 137, 1, 213, 178, 200, 137, 1, 189, 200, 137, 1, 199, + 240, 200, 137, 1, 238, 0, 200, 137, 1, 237, 40, 200, 137, 1, 181, 200, + 137, 1, 166, 200, 137, 1, 210, 94, 200, 137, 1, 249, 3, 200, 137, 1, 248, + 54, 200, 137, 1, 172, 200, 137, 1, 168, 200, 137, 1, 167, 200, 137, 1, + 177, 200, 137, 1, 196, 157, 200, 137, 1, 204, 64, 200, 137, 1, 188, 200, + 137, 1, 144, 200, 137, 1, 207, 3, 200, 137, 3, 250, 168, 200, 137, 3, + 196, 6, 200, 137, 18, 3, 252, 33, 200, 137, 18, 3, 70, 200, 137, 18, 3, + 223, 224, 200, 137, 18, 3, 68, 200, 137, 18, 3, 196, 251, 200, 137, 18, + 3, 71, 200, 137, 18, 3, 251, 63, 200, 137, 18, 3, 74, 200, 137, 18, 3, + 250, 8, 200, 137, 3, 196, 11, 200, 137, 3, 212, 241, 200, 137, 1, 250, + 112, 221, 250, 200, 137, 17, 192, 76, 200, 137, 17, 101, 200, 137, 17, + 104, 200, 137, 17, 133, 200, 137, 17, 134, 200, 137, 17, 151, 200, 137, + 17, 170, 200, 137, 17, 179, 200, 137, 17, 174, 200, 137, 17, 182, 251, + 67, 1, 160, 251, 67, 1, 221, 250, 251, 67, 1, 214, 165, 251, 67, 1, 181, + 251, 67, 1, 189, 251, 67, 1, 250, 249, 189, 251, 67, 1, 166, 251, 67, 1, + 210, 94, 251, 67, 1, 249, 3, 251, 67, 1, 172, 251, 67, 1, 223, 62, 251, + 67, 1, 246, 117, 251, 67, 1, 199, 240, 251, 67, 1, 167, 251, 67, 1, 177, + 251, 67, 1, 188, 251, 67, 1, 212, 201, 251, 67, 1, 144, 251, 67, 1, 64, + 251, 67, 1, 238, 0, 251, 67, 1, 237, 40, 251, 67, 1, 231, 233, 251, 67, + 1, 250, 249, 231, 233, 251, 67, 1, 231, 84, 251, 67, 1, 248, 54, 251, 67, + 1, 223, 28, 251, 67, 1, 250, 249, 249, 3, 251, 67, 116, 3, 217, 35, 177, + 251, 67, 116, 3, 217, 35, 167, 251, 67, 116, 3, 217, 35, 219, 196, 167, + 251, 67, 18, 3, 64, 251, 67, 18, 3, 252, 33, 251, 67, 18, 3, 70, 251, 67, + 18, 3, 223, 224, 251, 67, 18, 3, 68, 251, 67, 18, 3, 196, 251, 251, 67, + 18, 3, 71, 251, 67, 18, 3, 249, 241, 251, 67, 18, 3, 74, 251, 67, 18, 3, + 251, 63, 251, 67, 18, 3, 250, 241, 251, 67, 3, 221, 181, 251, 67, 17, + 192, 76, 251, 67, 17, 101, 251, 67, 17, 104, 251, 67, 17, 133, 251, 67, + 17, 134, 251, 67, 17, 151, 251, 67, 17, 170, 251, 67, 17, 179, 251, 67, + 17, 174, 251, 67, 17, 182, 251, 67, 31, 200, 30, 251, 67, 31, 197, 239, + 251, 67, 3, 2, 205, 208, 251, 67, 3, 205, 208, 251, 67, 3, 206, 203, 251, + 67, 16, 196, 39, 236, 133, 1, 64, 236, 133, 1, 252, 33, 236, 133, 1, 70, + 236, 133, 1, 223, 224, 236, 133, 1, 68, 236, 133, 1, 196, 251, 236, 133, + 1, 71, 236, 133, 1, 251, 63, 236, 133, 1, 74, 236, 133, 1, 250, 8, 236, + 133, 1, 160, 236, 133, 1, 221, 250, 236, 133, 1, 231, 233, 236, 133, 1, + 231, 84, 236, 133, 1, 214, 165, 236, 133, 1, 247, 19, 236, 133, 1, 246, + 117, 236, 133, 1, 223, 62, 236, 133, 1, 223, 28, 236, 133, 1, 212, 201, + 236, 133, 1, 198, 83, 236, 133, 1, 198, 71, 236, 133, 1, 237, 161, 236, + 133, 1, 237, 145, 236, 133, 1, 213, 178, 236, 133, 1, 189, 236, 133, 1, + 199, 240, 236, 133, 1, 238, 0, 236, 133, 1, 237, 40, 236, 133, 1, 181, + 236, 133, 1, 166, 236, 133, 1, 210, 94, 236, 133, 1, 249, 3, 236, 133, 1, + 248, 54, 236, 133, 1, 172, 236, 133, 1, 168, 236, 133, 1, 167, 236, 133, + 1, 177, 236, 133, 1, 196, 157, 236, 133, 1, 204, 64, 236, 133, 1, 202, + 92, 236, 133, 1, 188, 236, 133, 1, 144, 236, 133, 1, 207, 3, 236, 133, + 18, 3, 252, 33, 236, 133, 18, 3, 70, 236, 133, 18, 3, 223, 224, 236, 133, + 18, 3, 68, 236, 133, 18, 3, 196, 251, 236, 133, 18, 3, 118, 150, 236, + 133, 18, 3, 118, 207, 4, 236, 133, 18, 3, 71, 236, 133, 18, 3, 251, 63, + 236, 133, 18, 3, 74, 236, 133, 18, 3, 250, 8, 236, 133, 3, 250, 168, 236, + 133, 3, 196, 6, 236, 133, 3, 196, 11, 236, 133, 3, 212, 241, 236, 133, + 251, 151, 57, 194, 141, 242, 117, 6, 1, 214, 164, 194, 141, 242, 117, 6, + 1, 64, 194, 141, 242, 117, 6, 1, 194, 72, 194, 141, 242, 117, 6, 1, 192, + 214, 194, 141, 242, 117, 6, 1, 168, 194, 141, 242, 117, 6, 1, 193, 1, + 194, 141, 242, 117, 6, 1, 223, 224, 194, 141, 242, 117, 6, 1, 196, 251, + 194, 141, 242, 117, 6, 1, 71, 194, 141, 242, 117, 6, 1, 74, 194, 141, + 242, 117, 6, 1, 250, 214, 194, 141, 242, 117, 6, 1, 231, 233, 194, 141, + 242, 117, 6, 1, 221, 113, 194, 141, 242, 117, 6, 1, 234, 51, 194, 141, + 242, 117, 6, 1, 192, 193, 194, 141, 242, 117, 6, 1, 197, 111, 194, 141, + 242, 117, 6, 1, 234, 70, 194, 141, 242, 117, 6, 1, 212, 3, 194, 141, 242, + 117, 6, 1, 198, 78, 194, 141, 242, 117, 6, 1, 212, 227, 194, 141, 242, + 117, 6, 1, 238, 0, 194, 141, 242, 117, 6, 1, 250, 26, 194, 141, 242, 117, + 6, 1, 250, 241, 194, 141, 242, 117, 6, 1, 247, 124, 194, 141, 242, 117, + 6, 1, 209, 51, 194, 141, 242, 117, 6, 1, 229, 135, 194, 141, 242, 117, 6, + 1, 229, 23, 194, 141, 242, 117, 6, 1, 228, 206, 194, 141, 242, 117, 6, 1, + 230, 28, 194, 141, 242, 117, 6, 1, 202, 43, 194, 141, 242, 117, 6, 1, + 203, 97, 194, 141, 242, 117, 6, 1, 195, 253, 194, 141, 242, 117, 2, 1, + 214, 164, 194, 141, 242, 117, 2, 1, 64, 194, 141, 242, 117, 2, 1, 194, + 72, 194, 141, 242, 117, 2, 1, 192, 214, 194, 141, 242, 117, 2, 1, 168, + 194, 141, 242, 117, 2, 1, 193, 1, 194, 141, 242, 117, 2, 1, 223, 224, + 194, 141, 242, 117, 2, 1, 196, 251, 194, 141, 242, 117, 2, 1, 71, 194, + 141, 242, 117, 2, 1, 74, 194, 141, 242, 117, 2, 1, 250, 214, 194, 141, + 242, 117, 2, 1, 231, 233, 194, 141, 242, 117, 2, 1, 221, 113, 194, 141, + 242, 117, 2, 1, 234, 51, 194, 141, 242, 117, 2, 1, 192, 193, 194, 141, + 242, 117, 2, 1, 197, 111, 194, 141, 242, 117, 2, 1, 234, 70, 194, 141, + 242, 117, 2, 1, 212, 3, 194, 141, 242, 117, 2, 1, 198, 78, 194, 141, 242, + 117, 2, 1, 212, 227, 194, 141, 242, 117, 2, 1, 238, 0, 194, 141, 242, + 117, 2, 1, 250, 26, 194, 141, 242, 117, 2, 1, 250, 241, 194, 141, 242, + 117, 2, 1, 247, 124, 194, 141, 242, 117, 2, 1, 209, 51, 194, 141, 242, + 117, 2, 1, 229, 135, 194, 141, 242, 117, 2, 1, 229, 23, 194, 141, 242, + 117, 2, 1, 228, 206, 194, 141, 242, 117, 2, 1, 230, 28, 194, 141, 242, + 117, 2, 1, 202, 43, 194, 141, 242, 117, 2, 1, 203, 97, 194, 141, 242, + 117, 2, 1, 195, 253, 194, 141, 242, 117, 17, 192, 76, 194, 141, 242, 117, + 17, 101, 194, 141, 242, 117, 17, 104, 194, 141, 242, 117, 17, 133, 194, + 141, 242, 117, 17, 134, 194, 141, 242, 117, 17, 151, 194, 141, 242, 117, + 17, 170, 194, 141, 242, 117, 17, 179, 194, 141, 242, 117, 17, 174, 194, + 141, 242, 117, 17, 182, 194, 141, 242, 117, 31, 200, 30, 194, 141, 242, + 117, 31, 197, 239, 194, 141, 242, 117, 31, 199, 184, 194, 141, 242, 117, + 31, 232, 126, 194, 141, 242, 117, 31, 233, 3, 194, 141, 242, 117, 31, + 203, 25, 194, 141, 242, 117, 31, 204, 140, 194, 141, 242, 117, 31, 234, + 137, 194, 141, 242, 117, 31, 214, 11, 194, 141, 242, 117, 211, 219, 236, + 181, 251, 37, 1, 64, 236, 181, 251, 37, 1, 252, 33, 236, 181, 251, 37, 1, + 70, 236, 181, 251, 37, 1, 223, 224, 236, 181, 251, 37, 1, 68, 236, 181, + 251, 37, 1, 196, 251, 236, 181, 251, 37, 1, 71, 236, 181, 251, 37, 1, 74, + 236, 181, 251, 37, 1, 160, 236, 181, 251, 37, 1, 221, 250, 236, 181, 251, + 37, 1, 231, 233, 236, 181, 251, 37, 1, 231, 84, 236, 181, 251, 37, 1, + 214, 165, 236, 181, 251, 37, 1, 247, 19, 236, 181, 251, 37, 1, 246, 117, + 236, 181, 251, 37, 1, 223, 62, 236, 181, 251, 37, 1, 212, 201, 236, 181, + 251, 37, 1, 198, 83, 236, 181, 251, 37, 1, 237, 161, 236, 181, 251, 37, + 1, 237, 145, 236, 181, 251, 37, 1, 213, 178, 236, 181, 251, 37, 1, 189, + 236, 181, 251, 37, 1, 199, 240, 236, 181, 251, 37, 1, 238, 0, 236, 181, + 251, 37, 1, 237, 40, 236, 181, 251, 37, 1, 181, 236, 181, 251, 37, 1, + 166, 236, 181, 251, 37, 1, 210, 94, 236, 181, 251, 37, 1, 249, 3, 236, + 181, 251, 37, 1, 248, 54, 236, 181, 251, 37, 1, 172, 236, 181, 251, 37, + 1, 168, 236, 181, 251, 37, 1, 192, 164, 236, 181, 251, 37, 1, 167, 236, + 181, 251, 37, 1, 177, 236, 181, 251, 37, 1, 196, 157, 236, 181, 251, 37, + 1, 204, 64, 236, 181, 251, 37, 1, 202, 92, 236, 181, 251, 37, 1, 188, + 236, 181, 251, 37, 1, 144, 236, 181, 251, 37, 1, 219, 137, 236, 181, 251, + 37, 1, 192, 112, 236, 181, 251, 37, 18, 3, 252, 33, 236, 181, 251, 37, + 18, 3, 70, 236, 181, 251, 37, 18, 3, 223, 224, 236, 181, 251, 37, 18, 3, + 68, 236, 181, 251, 37, 18, 3, 196, 251, 236, 181, 251, 37, 18, 3, 71, + 236, 181, 251, 37, 18, 3, 251, 63, 236, 181, 251, 37, 18, 3, 74, 236, + 181, 251, 37, 3, 250, 168, 236, 181, 251, 37, 3, 246, 234, 236, 181, 251, + 37, 3, 230, 80, 236, 181, 251, 37, 196, 11, 236, 181, 251, 37, 209, 111, + 215, 49, 57, 236, 181, 251, 37, 217, 35, 168, 236, 181, 251, 37, 88, 167, + 236, 181, 251, 37, 217, 35, 167, 236, 181, 251, 37, 3, 212, 241, 236, + 181, 251, 37, 55, 237, 208, 236, 181, 251, 37, 231, 197, 232, 247, 236, + 181, 251, 37, 234, 80, 80, 199, 245, 77, 236, 181, 251, 37, 17, 192, 76, + 236, 181, 251, 37, 17, 101, 236, 181, 251, 37, 17, 104, 236, 181, 251, + 37, 17, 133, 236, 181, 251, 37, 17, 134, 236, 181, 251, 37, 17, 151, 236, + 181, 251, 37, 17, 170, 236, 181, 251, 37, 17, 179, 236, 181, 251, 37, 17, + 174, 236, 181, 251, 37, 17, 182, 215, 58, 1, 64, 215, 58, 1, 252, 33, + 215, 58, 1, 70, 215, 58, 1, 223, 224, 215, 58, 1, 68, 215, 58, 1, 196, + 251, 215, 58, 1, 118, 150, 215, 58, 1, 118, 207, 4, 215, 58, 1, 71, 215, + 58, 1, 251, 63, 215, 58, 1, 74, 215, 58, 1, 250, 8, 215, 58, 1, 160, 215, + 58, 1, 221, 250, 215, 58, 1, 231, 233, 215, 58, 1, 231, 84, 215, 58, 1, + 214, 165, 215, 58, 1, 247, 19, 215, 58, 1, 246, 117, 215, 58, 1, 223, 62, + 215, 58, 1, 223, 28, 215, 58, 1, 212, 201, 215, 58, 1, 198, 83, 215, 58, + 1, 198, 71, 215, 58, 1, 237, 161, 215, 58, 1, 237, 145, 215, 58, 1, 213, + 178, 215, 58, 1, 189, 215, 58, 1, 199, 240, 215, 58, 1, 238, 0, 215, 58, + 1, 237, 40, 215, 58, 1, 181, 215, 58, 1, 166, 215, 58, 1, 210, 94, 215, + 58, 1, 249, 3, 215, 58, 1, 248, 54, 215, 58, 1, 172, 215, 58, 1, 168, + 215, 58, 1, 167, 215, 58, 1, 177, 215, 58, 1, 196, 157, 215, 58, 1, 204, + 64, 215, 58, 1, 202, 92, 215, 58, 1, 188, 215, 58, 1, 144, 215, 58, 1, + 219, 137, 215, 58, 1, 207, 3, 215, 58, 18, 3, 252, 33, 215, 58, 18, 3, + 70, 215, 58, 18, 3, 223, 224, 215, 58, 18, 3, 68, 215, 58, 18, 3, 196, + 251, 215, 58, 18, 3, 118, 150, 215, 58, 18, 3, 118, 207, 4, 215, 58, 18, + 3, 71, 215, 58, 18, 3, 251, 63, 215, 58, 18, 3, 74, 215, 58, 18, 3, 250, + 8, 215, 58, 3, 250, 168, 215, 58, 3, 196, 6, 215, 58, 3, 196, 11, 215, + 58, 3, 249, 246, 215, 58, 3, 203, 113, 215, 58, 229, 237, 215, 58, 18, 3, + 209, 91, 71, 192, 99, 50, 1, 64, 192, 99, 50, 18, 3, 70, 192, 99, 50, 18, + 3, 197, 104, 192, 99, 50, 18, 3, 68, 192, 99, 50, 18, 3, 71, 192, 99, 50, + 18, 3, 212, 0, 192, 99, 50, 18, 3, 74, 192, 99, 50, 18, 3, 251, 63, 192, + 99, 50, 18, 3, 250, 8, 192, 99, 50, 18, 3, 207, 168, 70, 192, 99, 50, 18, + 220, 2, 77, 192, 99, 50, 1, 160, 192, 99, 50, 1, 221, 250, 192, 99, 50, + 1, 231, 233, 192, 99, 50, 1, 231, 84, 192, 99, 50, 1, 214, 165, 192, 99, + 50, 1, 247, 19, 192, 99, 50, 1, 246, 117, 192, 99, 50, 1, 223, 62, 192, + 99, 50, 1, 212, 201, 192, 99, 50, 1, 198, 83, 192, 99, 50, 1, 198, 71, + 192, 99, 50, 1, 237, 161, 192, 99, 50, 1, 237, 145, 192, 99, 50, 1, 213, + 178, 192, 99, 50, 1, 189, 192, 99, 50, 1, 199, 240, 192, 99, 50, 1, 238, + 0, 192, 99, 50, 1, 237, 40, 192, 99, 50, 1, 181, 192, 99, 50, 1, 166, + 192, 99, 50, 1, 210, 94, 192, 99, 50, 1, 249, 3, 192, 99, 50, 1, 248, 54, + 192, 99, 50, 1, 172, 192, 99, 50, 1, 198, 118, 192, 99, 50, 1, 198, 108, + 192, 99, 50, 1, 235, 17, 192, 99, 50, 1, 235, 11, 192, 99, 50, 1, 192, + 71, 192, 99, 50, 1, 192, 112, 192, 99, 50, 1, 255, 41, 192, 99, 50, 1, + 168, 192, 99, 50, 1, 167, 192, 99, 50, 1, 177, 192, 99, 50, 1, 196, 157, + 192, 99, 50, 1, 204, 64, 192, 99, 50, 1, 202, 92, 192, 99, 50, 1, 188, + 192, 99, 50, 1, 144, 192, 99, 50, 1, 221, 47, 192, 99, 50, 52, 116, 77, + 192, 99, 50, 3, 196, 11, 192, 99, 50, 3, 246, 234, 192, 99, 50, 3, 246, + 235, 4, 211, 150, 192, 99, 50, 3, 246, 237, 4, 211, 150, 192, 99, 50, 3, + 250, 168, 192, 99, 50, 3, 196, 6, 192, 99, 50, 242, 66, 1, 167, 192, 99, + 50, 242, 67, 1, 168, 192, 99, 50, 242, 67, 1, 167, 192, 99, 50, 242, 67, + 1, 177, 192, 99, 50, 242, 67, 1, 196, 157, 192, 99, 50, 88, 229, 246, 77, + 192, 99, 50, 242, 80, 229, 246, 77, 192, 99, 50, 122, 198, 103, 192, 99, + 50, 122, 204, 56, 192, 99, 50, 122, 55, 204, 56, 192, 99, 50, 122, 184, + 198, 103, 192, 99, 50, 88, 235, 103, 229, 246, 77, 192, 99, 50, 242, 80, + 235, 103, 229, 246, 77, 192, 99, 50, 201, 163, 202, 164, 1, 64, 202, 164, + 18, 3, 70, 202, 164, 18, 3, 197, 104, 202, 164, 18, 3, 68, 202, 164, 18, + 3, 71, 202, 164, 18, 3, 74, 202, 164, 18, 3, 212, 0, 202, 164, 18, 3, + 251, 63, 202, 164, 18, 3, 250, 8, 202, 164, 18, 3, 118, 150, 202, 164, + 18, 3, 118, 165, 202, 164, 18, 220, 2, 77, 202, 164, 1, 160, 202, 164, 1, + 221, 250, 202, 164, 1, 231, 233, 202, 164, 1, 231, 84, 202, 164, 1, 214, + 165, 202, 164, 1, 247, 19, 202, 164, 1, 246, 117, 202, 164, 1, 223, 62, + 202, 164, 1, 223, 28, 202, 164, 1, 212, 201, 202, 164, 1, 198, 83, 202, + 164, 1, 198, 71, 202, 164, 1, 237, 161, 202, 164, 1, 237, 145, 202, 164, + 1, 213, 178, 202, 164, 1, 189, 202, 164, 1, 199, 240, 202, 164, 1, 238, + 0, 202, 164, 1, 237, 40, 202, 164, 1, 181, 202, 164, 1, 166, 202, 164, 1, + 210, 94, 202, 164, 1, 249, 3, 202, 164, 1, 248, 54, 202, 164, 1, 172, + 202, 164, 1, 198, 118, 202, 164, 1, 198, 108, 202, 164, 1, 235, 17, 202, + 164, 1, 192, 71, 202, 164, 1, 192, 112, 202, 164, 1, 255, 41, 202, 164, + 1, 168, 202, 164, 1, 167, 202, 164, 1, 177, 202, 164, 1, 196, 157, 202, + 164, 1, 204, 64, 202, 164, 1, 202, 92, 202, 164, 1, 188, 202, 164, 1, + 144, 202, 164, 1, 221, 47, 202, 164, 3, 223, 13, 202, 164, 3, 197, 39, + 202, 164, 242, 66, 1, 167, 202, 164, 242, 66, 1, 177, 202, 164, 242, 66, + 1, 204, 64, 202, 164, 242, 66, 1, 188, 202, 164, 52, 116, 3, 232, 44, + 202, 164, 52, 116, 3, 222, 184, 202, 164, 52, 116, 3, 214, 167, 202, 164, + 52, 116, 3, 238, 95, 202, 164, 52, 116, 3, 215, 151, 202, 164, 52, 116, + 3, 249, 226, 202, 164, 52, 116, 3, 218, 236, 202, 164, 52, 116, 3, 150, + 202, 164, 52, 116, 3, 165, 202, 164, 52, 116, 3, 204, 66, 202, 164, 52, + 116, 3, 206, 158, 202, 164, 52, 116, 3, 255, 41, 202, 164, 3, 250, 168, + 202, 164, 3, 196, 6, 202, 164, 231, 146, 77, 202, 164, 201, 163, 202, + 164, 122, 198, 103, 202, 164, 122, 204, 56, 202, 164, 122, 55, 204, 56, + 202, 164, 122, 209, 204, 202, 164, 229, 246, 122, 4, 216, 30, 26, 201, + 124, 26, 198, 170, 232, 199, 202, 164, 229, 246, 122, 4, 216, 30, 26, + 201, 124, 26, 232, 199, 202, 164, 229, 246, 122, 4, 216, 30, 26, 201, + 123, 202, 164, 200, 16, 217, 126, 202, 164, 200, 16, 217, 125, 210, 198, + 242, 135, 230, 12, 1, 166, 210, 198, 242, 135, 230, 12, 1, 160, 210, 198, + 242, 135, 230, 12, 1, 177, 210, 198, 242, 135, 230, 12, 1, 172, 210, 198, + 242, 135, 230, 12, 1, 238, 0, 210, 198, 242, 135, 230, 12, 1, 192, 112, + 210, 198, 242, 135, 230, 12, 1, 196, 157, 210, 198, 242, 135, 230, 12, 1, + 214, 165, 210, 198, 242, 135, 230, 12, 1, 144, 210, 198, 242, 135, 230, + 12, 1, 231, 233, 210, 198, 242, 135, 230, 12, 1, 221, 250, 210, 198, 242, + 135, 230, 12, 1, 188, 210, 198, 242, 135, 230, 12, 1, 249, 3, 210, 198, + 242, 135, 230, 12, 1, 247, 19, 210, 198, 242, 135, 230, 12, 1, 189, 210, + 198, 242, 135, 230, 12, 1, 199, 240, 210, 198, 242, 135, 230, 12, 1, 181, + 210, 198, 242, 135, 230, 12, 1, 210, 94, 210, 198, 242, 135, 230, 12, 1, + 167, 210, 198, 242, 135, 230, 12, 1, 233, 97, 210, 198, 242, 135, 230, + 12, 1, 246, 117, 210, 198, 242, 135, 230, 12, 1, 64, 210, 198, 242, 135, + 230, 12, 1, 71, 210, 198, 242, 135, 230, 12, 1, 70, 210, 198, 242, 135, + 230, 12, 1, 74, 210, 198, 242, 135, 230, 12, 1, 68, 210, 198, 242, 135, + 230, 12, 1, 197, 119, 210, 198, 242, 135, 230, 12, 1, 228, 58, 210, 198, + 242, 135, 230, 12, 1, 52, 211, 93, 210, 198, 242, 135, 230, 12, 1, 52, + 222, 184, 210, 198, 242, 135, 230, 12, 1, 52, 200, 228, 210, 198, 242, + 135, 230, 12, 1, 52, 218, 236, 210, 198, 242, 135, 230, 12, 1, 52, 215, + 151, 210, 198, 242, 135, 230, 12, 1, 52, 165, 210, 198, 242, 135, 230, + 12, 1, 52, 194, 202, 210, 198, 242, 135, 230, 12, 1, 52, 214, 167, 210, + 198, 242, 135, 230, 12, 1, 52, 193, 148, 210, 198, 242, 135, 230, 12, + 207, 73, 158, 219, 84, 210, 198, 242, 135, 230, 12, 207, 73, 199, 18, + 210, 198, 242, 135, 230, 12, 206, 36, 231, 6, 201, 238, 210, 198, 242, + 135, 230, 12, 207, 73, 158, 184, 232, 243, 210, 198, 242, 135, 230, 12, + 207, 73, 158, 232, 243, 210, 198, 242, 135, 230, 12, 206, 36, 231, 6, + 201, 239, 232, 243, 210, 198, 242, 135, 230, 12, 206, 36, 158, 219, 84, + 210, 198, 242, 135, 230, 12, 206, 36, 199, 18, 210, 198, 242, 135, 230, + 12, 206, 36, 158, 184, 232, 243, 210, 198, 242, 135, 230, 12, 206, 36, + 158, 232, 243, 210, 198, 242, 135, 230, 12, 216, 161, 199, 18, 210, 198, + 242, 135, 230, 12, 231, 6, 201, 239, 196, 136, 210, 198, 242, 135, 230, + 12, 216, 161, 158, 184, 232, 243, 210, 198, 242, 135, 230, 12, 216, 161, + 158, 232, 243, 210, 198, 242, 135, 230, 12, 219, 50, 158, 219, 84, 210, + 198, 242, 135, 230, 12, 219, 50, 199, 18, 210, 198, 242, 135, 230, 12, + 231, 6, 201, 238, 210, 198, 242, 135, 230, 12, 219, 50, 158, 184, 232, + 243, 210, 198, 242, 135, 230, 12, 219, 50, 158, 232, 243, 210, 198, 242, + 135, 230, 12, 231, 6, 201, 239, 232, 243, 248, 52, 1, 64, 248, 52, 1, + 252, 33, 248, 52, 1, 70, 248, 52, 1, 223, 224, 248, 52, 1, 68, 248, 52, + 1, 196, 251, 248, 52, 1, 118, 150, 248, 52, 1, 118, 207, 4, 248, 52, 1, + 118, 165, 248, 52, 1, 71, 248, 52, 1, 251, 63, 248, 52, 1, 74, 248, 52, + 1, 250, 8, 248, 52, 1, 160, 248, 52, 1, 221, 250, 248, 52, 1, 231, 233, + 248, 52, 1, 231, 84, 248, 52, 1, 214, 165, 248, 52, 1, 247, 19, 248, 52, + 1, 246, 117, 248, 52, 1, 223, 62, 248, 52, 1, 223, 28, 248, 52, 1, 212, + 201, 248, 52, 1, 198, 83, 248, 52, 1, 198, 71, 248, 52, 1, 237, 161, 248, + 52, 1, 237, 145, 248, 52, 1, 213, 178, 248, 52, 1, 189, 248, 52, 1, 199, + 240, 248, 52, 1, 238, 0, 248, 52, 1, 237, 40, 248, 52, 1, 181, 248, 52, + 1, 166, 248, 52, 1, 210, 94, 248, 52, 1, 249, 3, 248, 52, 1, 248, 54, + 248, 52, 1, 172, 248, 52, 1, 168, 248, 52, 1, 167, 248, 52, 1, 177, 248, + 52, 1, 196, 157, 248, 52, 1, 204, 64, 248, 52, 1, 202, 92, 248, 52, 1, + 188, 248, 52, 1, 144, 248, 52, 18, 3, 252, 33, 248, 52, 18, 3, 70, 248, + 52, 18, 3, 223, 224, 248, 52, 18, 3, 68, 248, 52, 18, 3, 196, 251, 248, + 52, 18, 3, 118, 150, 248, 52, 18, 3, 118, 207, 4, 248, 52, 18, 3, 118, + 165, 248, 52, 18, 3, 71, 248, 52, 18, 3, 251, 63, 248, 52, 18, 3, 74, + 248, 52, 18, 3, 250, 8, 248, 52, 3, 246, 234, 248, 52, 3, 250, 168, 248, + 52, 3, 196, 6, 248, 52, 3, 196, 11, 248, 52, 3, 249, 246, 248, 52, 237, + 208, 248, 52, 55, 237, 208, 248, 52, 194, 11, 204, 165, 248, 52, 231, + 197, 232, 246, 248, 52, 231, 197, 232, 245, 248, 52, 17, 192, 76, 248, + 52, 17, 101, 248, 52, 17, 104, 248, 52, 17, 133, 248, 52, 17, 134, 248, + 52, 17, 151, 248, 52, 17, 170, 248, 52, 17, 179, 248, 52, 17, 174, 248, + 52, 17, 182, 248, 52, 31, 101, 248, 52, 31, 104, 248, 52, 31, 133, 248, + 52, 31, 134, 248, 52, 31, 151, 248, 52, 31, 170, 248, 52, 31, 179, 248, + 52, 31, 174, 248, 52, 31, 182, 248, 52, 31, 200, 30, 248, 52, 31, 197, + 239, 248, 52, 31, 199, 184, 248, 52, 31, 232, 126, 248, 52, 31, 233, 3, + 248, 52, 31, 203, 25, 248, 52, 31, 204, 140, 248, 52, 31, 234, 137, 248, + 52, 31, 214, 11, 248, 52, 228, 161, 197, 55, 77, 217, 128, 229, 246, 77, + 217, 128, 122, 204, 56, 217, 128, 1, 160, 217, 128, 1, 221, 250, 217, + 128, 1, 231, 233, 217, 128, 1, 214, 165, 217, 128, 1, 247, 19, 217, 128, + 1, 246, 117, 217, 128, 1, 223, 62, 217, 128, 1, 212, 201, 217, 128, 1, + 189, 217, 128, 1, 199, 240, 217, 128, 1, 238, 0, 217, 128, 1, 181, 217, + 128, 1, 166, 217, 128, 1, 210, 94, 217, 128, 1, 249, 3, 217, 128, 1, 172, + 217, 128, 1, 198, 118, 217, 128, 1, 198, 108, 217, 128, 1, 235, 17, 217, + 128, 1, 194, 169, 217, 128, 1, 192, 71, 217, 128, 1, 192, 112, 217, 128, + 1, 255, 41, 217, 128, 1, 168, 217, 128, 1, 167, 217, 128, 1, 177, 217, + 128, 1, 204, 64, 217, 128, 1, 188, 217, 128, 1, 144, 217, 128, 1, 64, + 217, 128, 201, 164, 1, 160, 217, 128, 201, 164, 1, 221, 250, 217, 128, + 201, 164, 1, 231, 233, 217, 128, 201, 164, 1, 214, 165, 217, 128, 201, + 164, 1, 247, 19, 217, 128, 201, 164, 1, 246, 117, 217, 128, 201, 164, 1, + 223, 62, 217, 128, 201, 164, 1, 212, 201, 217, 128, 201, 164, 1, 189, + 217, 128, 201, 164, 1, 199, 240, 217, 128, 201, 164, 1, 238, 0, 217, 128, + 201, 164, 1, 181, 217, 128, 201, 164, 1, 166, 217, 128, 201, 164, 1, 210, + 94, 217, 128, 201, 164, 1, 249, 3, 217, 128, 201, 164, 1, 172, 217, 128, + 201, 164, 1, 198, 118, 217, 128, 201, 164, 1, 198, 108, 217, 128, 201, + 164, 1, 235, 17, 217, 128, 201, 164, 1, 194, 169, 217, 128, 201, 164, 1, + 192, 71, 217, 128, 201, 164, 1, 192, 112, 217, 128, 201, 164, 1, 168, + 217, 128, 201, 164, 1, 167, 217, 128, 201, 164, 1, 177, 217, 128, 201, + 164, 1, 204, 64, 217, 128, 201, 164, 1, 188, 217, 128, 201, 164, 1, 144, + 217, 128, 201, 164, 1, 64, 217, 128, 18, 3, 252, 33, 217, 128, 18, 3, 70, + 217, 128, 18, 3, 68, 217, 128, 18, 3, 71, 217, 128, 18, 3, 74, 217, 128, + 3, 250, 168, 217, 128, 3, 246, 234, 217, 112, 127, 1, 64, 217, 112, 127, + 1, 252, 33, 217, 112, 127, 1, 70, 217, 112, 127, 1, 223, 224, 217, 112, + 127, 1, 68, 217, 112, 127, 1, 196, 251, 217, 112, 127, 1, 71, 217, 112, + 127, 1, 251, 63, 217, 112, 127, 1, 74, 217, 112, 127, 1, 250, 8, 217, + 112, 127, 1, 160, 217, 112, 127, 1, 221, 250, 217, 112, 127, 1, 231, 233, + 217, 112, 127, 1, 231, 84, 217, 112, 127, 1, 214, 165, 217, 112, 127, 1, + 247, 19, 217, 112, 127, 1, 246, 117, 217, 112, 127, 1, 223, 62, 217, 112, + 127, 1, 223, 28, 217, 112, 127, 1, 212, 201, 217, 112, 127, 1, 198, 83, + 217, 112, 127, 1, 198, 71, 217, 112, 127, 1, 237, 161, 217, 112, 127, 1, + 237, 145, 217, 112, 127, 1, 213, 178, 217, 112, 127, 1, 189, 217, 112, + 127, 1, 199, 240, 217, 112, 127, 1, 238, 0, 217, 112, 127, 1, 237, 40, + 217, 112, 127, 1, 181, 217, 112, 127, 1, 166, 217, 112, 127, 1, 210, 94, + 217, 112, 127, 1, 249, 3, 217, 112, 127, 1, 248, 54, 217, 112, 127, 1, + 172, 217, 112, 127, 1, 168, 217, 112, 127, 1, 167, 217, 112, 127, 1, 177, + 217, 112, 127, 1, 196, 157, 217, 112, 127, 1, 204, 64, 217, 112, 127, 1, + 202, 92, 217, 112, 127, 1, 188, 217, 112, 127, 1, 144, 217, 112, 127, 1, + 219, 137, 217, 112, 127, 1, 221, 47, 217, 112, 127, 1, 222, 234, 217, + 112, 127, 1, 198, 223, 217, 112, 127, 18, 3, 252, 33, 217, 112, 127, 18, + 3, 70, 217, 112, 127, 18, 3, 223, 224, 217, 112, 127, 18, 3, 68, 217, + 112, 127, 18, 3, 196, 251, 217, 112, 127, 18, 3, 118, 150, 217, 112, 127, + 18, 3, 71, 217, 112, 127, 18, 3, 251, 63, 217, 112, 127, 18, 3, 74, 217, + 112, 127, 18, 3, 250, 8, 217, 112, 127, 3, 250, 168, 217, 112, 127, 3, + 196, 6, 217, 112, 127, 3, 212, 241, 217, 112, 127, 3, 246, 236, 217, 112, + 127, 3, 230, 80, 217, 112, 127, 196, 11, 217, 112, 127, 207, 194, 217, + 112, 127, 208, 71, 217, 112, 127, 17, 192, 76, 217, 112, 127, 17, 101, + 217, 112, 127, 17, 104, 217, 112, 127, 17, 133, 217, 112, 127, 17, 134, + 217, 112, 127, 17, 151, 217, 112, 127, 17, 170, 217, 112, 127, 17, 179, + 217, 112, 127, 17, 174, 217, 112, 127, 17, 182, 230, 164, 127, 1, 64, + 230, 164, 127, 1, 252, 33, 230, 164, 127, 1, 70, 230, 164, 127, 1, 223, + 224, 230, 164, 127, 1, 68, 230, 164, 127, 1, 196, 251, 230, 164, 127, 1, + 234, 171, 230, 164, 127, 1, 251, 63, 230, 164, 127, 1, 211, 194, 230, + 164, 127, 1, 250, 8, 230, 164, 127, 1, 168, 230, 164, 127, 1, 196, 157, + 230, 164, 127, 1, 249, 3, 230, 164, 127, 1, 248, 54, 230, 164, 127, 1, + 172, 230, 164, 127, 1, 160, 230, 164, 127, 1, 221, 250, 230, 164, 127, 1, + 189, 230, 164, 127, 1, 199, 240, 230, 164, 127, 1, 177, 230, 164, 127, 1, + 231, 233, 230, 164, 127, 1, 231, 84, 230, 164, 127, 1, 238, 0, 230, 164, + 127, 1, 237, 40, 230, 164, 127, 1, 181, 230, 164, 127, 1, 247, 19, 230, + 164, 127, 1, 246, 117, 230, 164, 127, 1, 198, 83, 230, 164, 127, 1, 198, + 71, 230, 164, 127, 1, 219, 137, 230, 164, 127, 1, 223, 62, 230, 164, 127, + 1, 223, 28, 230, 164, 127, 1, 237, 161, 230, 164, 127, 1, 237, 145, 230, + 164, 127, 1, 214, 165, 230, 164, 127, 1, 166, 230, 164, 127, 1, 210, 94, + 230, 164, 127, 1, 144, 230, 164, 127, 1, 167, 230, 164, 127, 1, 188, 230, + 164, 127, 18, 3, 252, 33, 230, 164, 127, 18, 3, 70, 230, 164, 127, 18, 3, + 223, 224, 230, 164, 127, 18, 3, 68, 230, 164, 127, 18, 3, 196, 251, 230, + 164, 127, 18, 3, 234, 171, 230, 164, 127, 18, 3, 251, 63, 230, 164, 127, + 18, 3, 211, 194, 230, 164, 127, 18, 3, 250, 8, 230, 164, 127, 3, 250, + 168, 230, 164, 127, 3, 196, 6, 230, 164, 127, 196, 11, 230, 164, 127, + 211, 219, 230, 164, 127, 17, 192, 76, 230, 164, 127, 17, 101, 230, 164, + 127, 17, 104, 230, 164, 127, 17, 133, 230, 164, 127, 17, 134, 230, 164, + 127, 17, 151, 230, 164, 127, 17, 170, 230, 164, 127, 17, 179, 230, 164, + 127, 17, 174, 230, 164, 127, 17, 182, 217, 170, 1, 160, 217, 170, 1, 231, + 233, 217, 170, 1, 214, 165, 217, 170, 1, 166, 217, 170, 1, 249, 3, 217, + 170, 1, 172, 217, 170, 1, 189, 217, 170, 1, 238, 0, 217, 170, 1, 181, + 217, 170, 1, 247, 19, 217, 170, 1, 223, 62, 217, 170, 1, 212, 201, 217, + 170, 1, 168, 217, 170, 1, 167, 217, 170, 1, 177, 217, 170, 1, 196, 157, + 217, 170, 1, 188, 217, 170, 1, 64, 217, 170, 250, 210, 217, 170, 18, 3, + 70, 217, 170, 18, 3, 68, 217, 170, 18, 3, 71, 217, 170, 18, 3, 74, 217, + 170, 210, 211, 217, 170, 234, 80, 80, 205, 208, 219, 152, 1, 193, 24, 44, + 232, 109, 90, 199, 157, 44, 232, 109, 90, 211, 207, 44, 232, 109, 90, + 234, 140, 44, 232, 109, 90, 203, 23, 44, 232, 109, 90, 232, 129, 44, 232, + 109, 90, 199, 180, 44, 232, 109, 112, 234, 139, 44, 232, 109, 112, 203, + 22, 44, 232, 109, 90, 197, 242, 44, 232, 109, 90, 203, 32, 44, 232, 109, + 90, 203, 31, 44, 232, 109, 90, 200, 21, 44, 232, 109, 90, 234, 143, 44, + 232, 109, 112, 197, 241, 44, 232, 109, 112, 203, 30, 44, 232, 109, 90, + 233, 6, 44, 232, 109, 90, 208, 167, 44, 232, 109, 90, 230, 77, 44, 232, + 109, 90, 230, 76, 44, 232, 109, 112, 208, 165, 44, 232, 109, 235, 94, + 233, 81, 221, 182, 44, 3, 214, 197, 44, 3, 246, 122, 44, 3, 251, 240, 44, + 3, 196, 239, 44, 3, 215, 178, 44, 3, 220, 253, 44, 3, 210, 202, 44, 3, + 215, 222, 44, 3, 222, 156, 44, 3, 211, 23, 44, 3, 209, 174, 44, 3, 196, + 142, 44, 3, 211, 72, 44, 3, 220, 242, 44, 3, 196, 113, 44, 194, 87, 238, + 154, 57, 44, 235, 65, 238, 154, 57, 44, 220, 82, 57, 44, 206, 56, 211, + 26, 57, 44, 198, 218, 238, 196, 57, 44, 198, 218, 31, 57, 44, 238, 136, + 57, 44, 26, 212, 4, 57, 44, 202, 141, 57, 44, 198, 234, 57, 44, 223, 191, + 209, 157, 57, 44, 202, 13, 232, 89, 57, 44, 3, 215, 182, 44, 3, 196, 150, + 44, 209, 38, 234, 80, 80, 199, 244, 10, 3, 64, 10, 3, 41, 24, 64, 10, 3, + 41, 24, 248, 241, 10, 3, 41, 24, 231, 202, 200, 19, 10, 3, 41, 24, 144, + 10, 3, 41, 24, 223, 226, 10, 3, 41, 24, 220, 162, 230, 162, 10, 3, 41, + 24, 215, 189, 10, 3, 41, 24, 206, 79, 10, 3, 254, 42, 10, 3, 251, 238, + 10, 3, 251, 239, 24, 250, 51, 10, 3, 251, 239, 24, 235, 48, 230, 162, 10, + 3, 251, 239, 24, 231, 215, 10, 3, 251, 239, 24, 231, 202, 200, 19, 10, 3, + 251, 239, 24, 144, 10, 3, 251, 239, 24, 223, 227, 230, 162, 10, 3, 251, + 239, 24, 223, 200, 10, 3, 251, 239, 24, 220, 163, 10, 3, 251, 239, 24, + 203, 252, 10, 3, 251, 239, 24, 124, 102, 124, 102, 68, 10, 3, 251, 239, + 230, 162, 10, 3, 251, 155, 10, 3, 251, 156, 24, 248, 220, 10, 3, 251, + 156, 24, 231, 202, 200, 19, 10, 3, 251, 156, 24, 217, 49, 102, 234, 88, + 10, 3, 251, 156, 24, 204, 62, 10, 3, 251, 156, 24, 200, 141, 10, 3, 251, + 125, 10, 3, 251, 44, 10, 3, 251, 45, 24, 234, 15, 10, 3, 251, 45, 24, + 203, 214, 102, 231, 18, 10, 3, 251, 35, 10, 3, 251, 36, 24, 251, 35, 10, + 3, 251, 36, 24, 236, 225, 10, 3, 251, 36, 24, 231, 18, 10, 3, 251, 36, + 24, 144, 10, 3, 251, 36, 24, 222, 144, 10, 3, 251, 36, 24, 221, 204, 10, + 3, 251, 36, 24, 204, 12, 10, 3, 251, 36, 24, 197, 3, 10, 3, 251, 32, 10, + 3, 251, 24, 10, 3, 250, 237, 10, 3, 250, 238, 24, 204, 12, 10, 3, 250, + 224, 10, 3, 250, 225, 136, 250, 224, 10, 3, 250, 225, 112, 199, 82, 10, + 3, 250, 225, 102, 215, 75, 211, 170, 250, 225, 102, 215, 74, 10, 3, 250, + 225, 102, 215, 75, 202, 105, 10, 3, 250, 188, 10, 3, 250, 158, 10, 3, + 250, 124, 10, 3, 250, 125, 24, 221, 0, 10, 3, 250, 96, 10, 3, 250, 59, + 10, 3, 250, 53, 10, 3, 250, 54, 192, 26, 200, 19, 10, 3, 250, 54, 222, + 148, 200, 19, 10, 3, 250, 54, 136, 250, 54, 198, 34, 136, 198, 34, 198, + 34, 136, 198, 34, 210, 253, 10, 3, 250, 54, 136, 250, 54, 136, 250, 53, + 10, 3, 250, 54, 136, 250, 54, 136, 250, 54, 238, 176, 250, 54, 136, 250, + 54, 136, 250, 53, 10, 3, 250, 51, 10, 3, 250, 47, 10, 3, 249, 3, 10, 3, + 248, 241, 10, 3, 248, 235, 10, 3, 248, 227, 10, 3, 248, 221, 10, 3, 248, + 222, 136, 248, 221, 10, 3, 248, 220, 10, 3, 161, 10, 3, 248, 193, 10, 3, + 248, 41, 10, 3, 248, 42, 24, 64, 10, 3, 248, 42, 24, 231, 193, 10, 3, + 248, 42, 24, 223, 227, 230, 162, 10, 3, 247, 124, 10, 3, 247, 125, 136, + 247, 125, 251, 238, 10, 3, 247, 125, 136, 247, 125, 197, 77, 10, 3, 247, + 125, 238, 176, 247, 124, 10, 3, 247, 100, 10, 3, 247, 101, 136, 247, 100, + 10, 3, 247, 89, 10, 3, 247, 88, 10, 3, 238, 0, 10, 3, 237, 246, 10, 3, + 237, 247, 221, 163, 24, 41, 102, 217, 110, 10, 3, 237, 247, 221, 163, 24, + 250, 237, 10, 3, 237, 247, 221, 163, 24, 248, 220, 10, 3, 237, 247, 221, + 163, 24, 248, 41, 10, 3, 237, 247, 221, 163, 24, 231, 233, 10, 3, 237, + 247, 221, 163, 24, 231, 234, 102, 217, 110, 10, 3, 237, 247, 221, 163, + 24, 231, 46, 10, 3, 237, 247, 221, 163, 24, 231, 27, 10, 3, 237, 247, + 221, 163, 24, 230, 175, 10, 3, 237, 247, 221, 163, 24, 144, 10, 3, 237, + 247, 221, 163, 24, 223, 105, 10, 3, 237, 247, 221, 163, 24, 223, 106, + 102, 219, 36, 10, 3, 237, 247, 221, 163, 24, 222, 129, 10, 3, 237, 247, + 221, 163, 24, 177, 10, 3, 237, 247, 221, 163, 24, 219, 36, 10, 3, 237, + 247, 221, 163, 24, 219, 37, 102, 217, 109, 10, 3, 237, 247, 221, 163, 24, + 219, 19, 10, 3, 237, 247, 221, 163, 24, 214, 214, 10, 3, 237, 247, 221, + 163, 24, 210, 254, 102, 210, 253, 10, 3, 237, 247, 221, 163, 24, 203, + 125, 10, 3, 237, 247, 221, 163, 24, 200, 141, 10, 3, 237, 247, 221, 163, + 24, 197, 121, 102, 231, 27, 10, 3, 237, 247, 221, 163, 24, 197, 3, 10, 3, + 237, 218, 10, 3, 237, 195, 10, 3, 237, 194, 10, 3, 237, 193, 10, 3, 237, + 16, 10, 3, 236, 254, 10, 3, 236, 227, 10, 3, 236, 228, 24, 204, 12, 10, + 3, 236, 225, 10, 3, 236, 215, 10, 3, 236, 216, 222, 89, 124, 230, 163, + 236, 194, 10, 3, 236, 194, 10, 3, 235, 62, 10, 3, 235, 63, 136, 235, 62, + 10, 3, 235, 63, 230, 162, 10, 3, 235, 63, 203, 249, 10, 3, 235, 60, 10, + 3, 235, 61, 24, 233, 252, 10, 3, 235, 59, 10, 3, 235, 56, 10, 3, 235, 55, + 10, 3, 235, 54, 10, 3, 235, 49, 10, 3, 235, 47, 10, 3, 235, 48, 230, 162, + 10, 3, 235, 48, 230, 163, 230, 162, 10, 3, 235, 46, 10, 3, 235, 39, 10, + 3, 71, 10, 3, 234, 253, 24, 210, 253, 10, 3, 234, 253, 136, 234, 253, + 212, 231, 136, 212, 230, 10, 3, 234, 200, 10, 3, 234, 201, 24, 41, 102, + 230, 113, 102, 238, 0, 10, 3, 234, 201, 24, 231, 193, 10, 3, 234, 201, + 24, 216, 175, 10, 3, 234, 201, 24, 206, 63, 10, 3, 234, 201, 24, 204, 12, + 10, 3, 234, 201, 24, 68, 10, 3, 234, 173, 10, 3, 234, 161, 10, 3, 234, + 124, 10, 3, 234, 88, 10, 3, 234, 89, 24, 231, 201, 10, 3, 234, 89, 24, + 231, 202, 200, 19, 10, 3, 234, 89, 24, 217, 48, 10, 3, 234, 89, 238, 176, + 234, 88, 10, 3, 234, 89, 211, 170, 234, 88, 10, 3, 234, 89, 202, 105, 10, + 3, 234, 18, 10, 3, 234, 15, 10, 3, 233, 252, 10, 3, 233, 168, 10, 3, 233, + 169, 24, 64, 10, 3, 233, 169, 24, 41, 102, 220, 96, 10, 3, 233, 169, 24, + 41, 102, 220, 97, 24, 220, 96, 10, 3, 233, 169, 24, 250, 224, 10, 3, 233, + 169, 24, 248, 241, 10, 3, 233, 169, 24, 235, 48, 230, 162, 10, 3, 233, + 169, 24, 235, 48, 230, 163, 230, 162, 10, 3, 233, 169, 24, 144, 10, 3, + 233, 169, 24, 230, 113, 230, 162, 10, 3, 233, 169, 24, 223, 227, 230, + 162, 10, 3, 233, 169, 24, 222, 88, 10, 3, 233, 169, 24, 222, 89, 202, + 105, 10, 3, 233, 169, 24, 221, 24, 10, 3, 233, 169, 24, 177, 10, 3, 233, + 169, 24, 220, 97, 24, 220, 96, 10, 3, 233, 169, 24, 219, 209, 10, 3, 233, + 169, 24, 219, 36, 10, 3, 233, 169, 24, 197, 120, 10, 3, 233, 169, 24, + 197, 109, 10, 3, 231, 233, 10, 3, 231, 234, 230, 162, 10, 3, 231, 231, + 10, 3, 231, 232, 24, 41, 102, 238, 1, 102, 144, 10, 3, 231, 232, 24, 41, + 102, 144, 10, 3, 231, 232, 24, 41, 102, 223, 226, 10, 3, 231, 232, 24, + 251, 156, 200, 20, 102, 200, 166, 10, 3, 231, 232, 24, 250, 224, 10, 3, + 231, 232, 24, 250, 53, 10, 3, 231, 232, 24, 250, 52, 102, 231, 215, 10, + 3, 231, 232, 24, 248, 241, 10, 3, 231, 232, 24, 248, 194, 102, 167, 10, + 3, 231, 232, 24, 247, 89, 10, 3, 231, 232, 24, 247, 90, 102, 167, 10, 3, + 231, 232, 24, 238, 0, 10, 3, 231, 232, 24, 237, 16, 10, 3, 231, 232, 24, + 236, 228, 24, 204, 12, 10, 3, 231, 232, 24, 235, 60, 10, 3, 231, 232, 24, + 234, 124, 10, 3, 231, 232, 24, 234, 125, 102, 177, 10, 3, 231, 232, 24, + 234, 88, 10, 3, 231, 232, 24, 234, 89, 24, 231, 202, 200, 19, 10, 3, 231, + 232, 24, 231, 202, 200, 19, 10, 3, 231, 232, 24, 231, 193, 10, 3, 231, + 232, 24, 231, 46, 10, 3, 231, 232, 24, 231, 44, 10, 3, 231, 232, 24, 231, + 45, 102, 64, 10, 3, 231, 232, 24, 231, 28, 102, 201, 184, 10, 3, 231, + 232, 24, 230, 113, 102, 219, 37, 102, 233, 252, 10, 3, 231, 232, 24, 230, + 81, 10, 3, 231, 232, 24, 230, 82, 102, 177, 10, 3, 231, 232, 24, 229, + 179, 102, 219, 209, 10, 3, 231, 232, 24, 228, 173, 10, 3, 231, 232, 24, + 223, 227, 230, 162, 10, 3, 231, 232, 24, 223, 91, 102, 228, 182, 102, + 250, 53, 10, 3, 231, 232, 24, 222, 129, 10, 3, 231, 232, 24, 222, 88, 10, + 3, 231, 232, 24, 221, 190, 10, 3, 231, 232, 24, 221, 191, 102, 220, 96, + 10, 3, 231, 232, 24, 221, 25, 102, 250, 224, 10, 3, 231, 232, 24, 177, + 10, 3, 231, 232, 24, 217, 49, 102, 234, 88, 10, 3, 231, 232, 24, 216, + 175, 10, 3, 231, 232, 24, 212, 230, 10, 3, 231, 232, 24, 212, 231, 136, + 212, 230, 10, 3, 231, 232, 24, 166, 10, 3, 231, 232, 24, 206, 63, 10, 3, + 231, 232, 24, 206, 25, 10, 3, 231, 232, 24, 204, 12, 10, 3, 231, 232, 24, + 204, 13, 102, 198, 15, 10, 3, 231, 232, 24, 203, 234, 10, 3, 231, 232, + 24, 201, 129, 10, 3, 231, 232, 24, 200, 141, 10, 3, 231, 232, 24, 68, 10, + 3, 231, 232, 24, 197, 109, 10, 3, 231, 232, 24, 197, 110, 102, 235, 62, + 10, 3, 231, 232, 136, 231, 231, 10, 3, 231, 226, 10, 3, 231, 227, 238, + 176, 231, 226, 10, 3, 231, 224, 10, 3, 231, 225, 136, 231, 225, 231, 194, + 136, 231, 193, 10, 3, 231, 215, 10, 3, 231, 216, 231, 225, 136, 231, 225, + 231, 194, 136, 231, 193, 10, 3, 231, 214, 10, 3, 231, 212, 10, 3, 231, + 203, 10, 3, 231, 201, 10, 3, 231, 202, 200, 19, 10, 3, 231, 202, 136, + 231, 201, 10, 3, 231, 202, 238, 176, 231, 201, 10, 3, 231, 193, 10, 3, + 231, 192, 10, 3, 231, 186, 10, 3, 231, 127, 10, 3, 231, 128, 24, 221, 0, + 10, 3, 231, 46, 10, 3, 231, 47, 24, 71, 10, 3, 231, 47, 24, 68, 10, 3, + 231, 47, 238, 176, 231, 46, 10, 3, 231, 44, 10, 3, 231, 45, 136, 231, 44, + 10, 3, 231, 45, 238, 176, 231, 44, 10, 3, 231, 41, 10, 3, 231, 27, 10, 3, + 231, 28, 230, 162, 10, 3, 231, 25, 10, 3, 231, 26, 24, 41, 102, 223, 226, + 10, 3, 231, 26, 24, 231, 202, 200, 19, 10, 3, 231, 26, 24, 223, 226, 10, + 3, 231, 26, 24, 219, 37, 102, 223, 226, 10, 3, 231, 26, 24, 166, 10, 3, + 231, 20, 10, 3, 231, 18, 10, 3, 231, 19, 238, 176, 231, 18, 10, 3, 231, + 19, 24, 248, 241, 10, 3, 231, 19, 24, 200, 141, 10, 3, 231, 19, 200, 19, + 10, 3, 230, 186, 10, 3, 230, 187, 238, 176, 230, 186, 10, 3, 230, 184, + 10, 3, 230, 185, 24, 222, 129, 10, 3, 230, 185, 24, 222, 130, 24, 223, + 227, 230, 162, 10, 3, 230, 185, 24, 212, 230, 10, 3, 230, 185, 24, 206, + 64, 102, 198, 33, 10, 3, 230, 185, 230, 162, 10, 3, 230, 175, 10, 3, 230, + 176, 24, 41, 102, 221, 0, 10, 3, 230, 176, 24, 221, 0, 10, 3, 230, 176, + 136, 230, 176, 219, 27, 10, 3, 230, 167, 10, 3, 230, 165, 10, 3, 230, + 166, 24, 204, 12, 10, 3, 230, 156, 10, 3, 230, 155, 10, 3, 230, 151, 10, + 3, 230, 150, 10, 3, 144, 10, 3, 230, 113, 200, 19, 10, 3, 230, 113, 230, + 162, 10, 3, 230, 81, 10, 3, 229, 178, 10, 3, 229, 179, 24, 250, 53, 10, + 3, 229, 179, 24, 250, 51, 10, 3, 229, 179, 24, 248, 241, 10, 3, 229, 179, + 24, 236, 194, 10, 3, 229, 179, 24, 231, 224, 10, 3, 229, 179, 24, 221, + 179, 10, 3, 229, 179, 24, 212, 230, 10, 3, 229, 179, 24, 204, 12, 10, 3, + 229, 179, 24, 68, 10, 3, 228, 181, 10, 3, 228, 173, 10, 3, 228, 174, 24, + 250, 224, 10, 3, 228, 174, 24, 230, 81, 10, 3, 228, 174, 24, 222, 88, 10, + 3, 228, 174, 24, 219, 153, 10, 3, 228, 174, 24, 197, 109, 10, 3, 228, + 168, 10, 3, 70, 10, 3, 228, 97, 64, 10, 3, 228, 53, 10, 3, 223, 254, 10, + 3, 223, 255, 136, 223, 255, 247, 89, 10, 3, 223, 255, 136, 223, 255, 202, + 105, 10, 3, 223, 229, 10, 3, 223, 226, 10, 3, 223, 227, 236, 254, 10, 3, + 223, 227, 207, 151, 10, 3, 223, 227, 136, 223, 227, 203, 218, 136, 203, + 218, 197, 110, 136, 197, 109, 10, 3, 223, 227, 230, 162, 10, 3, 223, 218, + 10, 3, 223, 219, 24, 231, 202, 200, 19, 10, 3, 223, 217, 10, 3, 223, 207, + 10, 3, 223, 208, 24, 200, 141, 10, 3, 223, 208, 238, 176, 223, 207, 10, + 3, 223, 208, 211, 170, 223, 207, 10, 3, 223, 208, 202, 105, 10, 3, 223, + 200, 10, 3, 223, 190, 10, 3, 223, 105, 10, 3, 223, 90, 10, 3, 160, 10, 3, + 222, 174, 24, 64, 10, 3, 222, 174, 24, 251, 125, 10, 3, 222, 174, 24, + 251, 126, 102, 221, 24, 10, 3, 222, 174, 24, 250, 51, 10, 3, 222, 174, + 24, 248, 241, 10, 3, 222, 174, 24, 248, 220, 10, 3, 222, 174, 24, 161, + 10, 3, 222, 174, 24, 248, 41, 10, 3, 222, 174, 24, 234, 15, 10, 3, 222, + 174, 24, 233, 252, 10, 3, 222, 174, 24, 231, 233, 10, 3, 222, 174, 24, + 231, 215, 10, 3, 222, 174, 24, 231, 202, 200, 19, 10, 3, 222, 174, 24, + 231, 193, 10, 3, 222, 174, 24, 231, 194, 102, 204, 63, 102, 64, 10, 3, + 222, 174, 24, 231, 46, 10, 3, 222, 174, 24, 231, 27, 10, 3, 222, 174, 24, + 231, 19, 102, 206, 25, 10, 3, 222, 174, 24, 231, 19, 238, 176, 231, 18, + 10, 3, 222, 174, 24, 230, 186, 10, 3, 222, 174, 24, 230, 155, 10, 3, 222, + 174, 24, 223, 226, 10, 3, 222, 174, 24, 223, 207, 10, 3, 222, 174, 24, + 222, 129, 10, 3, 222, 174, 24, 221, 204, 10, 3, 222, 174, 24, 221, 190, + 10, 3, 222, 174, 24, 219, 209, 10, 3, 222, 174, 24, 219, 36, 10, 3, 222, + 174, 24, 217, 48, 10, 3, 222, 174, 24, 217, 49, 102, 235, 62, 10, 3, 222, + 174, 24, 217, 49, 102, 231, 46, 10, 3, 222, 174, 24, 217, 49, 102, 200, + 79, 10, 3, 222, 174, 24, 216, 175, 10, 3, 222, 174, 24, 216, 176, 102, + 212, 225, 10, 3, 222, 174, 24, 214, 214, 10, 3, 222, 174, 24, 212, 230, + 10, 3, 222, 174, 24, 210, 51, 10, 3, 222, 174, 24, 206, 218, 10, 3, 222, + 174, 24, 188, 10, 3, 222, 174, 24, 206, 25, 10, 3, 222, 174, 24, 204, 64, + 10, 3, 222, 174, 24, 204, 12, 10, 3, 222, 174, 24, 203, 234, 10, 3, 222, + 174, 24, 203, 164, 10, 3, 222, 174, 24, 203, 104, 10, 3, 222, 174, 24, + 201, 138, 10, 3, 222, 174, 24, 200, 112, 10, 3, 222, 174, 24, 68, 10, 3, + 222, 174, 24, 197, 120, 10, 3, 222, 174, 24, 197, 109, 10, 3, 222, 174, + 24, 197, 80, 24, 166, 10, 3, 222, 174, 24, 197, 3, 10, 3, 222, 174, 24, + 192, 30, 10, 3, 222, 160, 10, 3, 222, 161, 238, 176, 222, 160, 10, 3, + 222, 149, 10, 3, 222, 146, 10, 3, 222, 144, 10, 3, 222, 143, 10, 3, 222, + 141, 10, 3, 222, 142, 136, 222, 141, 10, 3, 222, 129, 10, 3, 222, 130, + 24, 223, 227, 230, 162, 10, 3, 222, 125, 10, 3, 222, 126, 24, 248, 241, + 10, 3, 222, 126, 238, 176, 222, 125, 10, 3, 222, 123, 10, 3, 222, 122, + 10, 3, 222, 88, 10, 3, 222, 89, 220, 164, 24, 124, 136, 220, 164, 24, 68, + 10, 3, 222, 89, 136, 222, 89, 220, 164, 24, 124, 136, 220, 164, 24, 68, + 10, 3, 222, 21, 10, 3, 221, 204, 10, 3, 221, 205, 24, 248, 241, 10, 3, + 221, 205, 24, 68, 10, 3, 221, 205, 24, 197, 109, 10, 3, 221, 190, 10, 3, + 221, 179, 10, 3, 221, 165, 10, 3, 221, 164, 10, 3, 221, 162, 10, 3, 221, + 163, 136, 221, 162, 10, 3, 221, 33, 10, 3, 221, 34, 136, 229, 179, 24, + 250, 52, 221, 34, 136, 229, 179, 24, 250, 51, 10, 3, 221, 24, 10, 3, 221, + 22, 10, 3, 221, 23, 196, 137, 20, 10, 3, 221, 21, 10, 3, 221, 13, 10, 3, + 221, 14, 230, 162, 10, 3, 221, 12, 10, 3, 221, 0, 10, 3, 221, 1, 211, + 170, 221, 0, 10, 3, 220, 249, 10, 3, 220, 226, 10, 3, 177, 10, 3, 220, + 163, 10, 3, 220, 164, 24, 64, 10, 3, 220, 164, 24, 41, 102, 238, 1, 102, + 144, 10, 3, 220, 164, 24, 41, 102, 231, 193, 10, 3, 220, 164, 24, 41, + 102, 220, 96, 10, 3, 220, 164, 24, 251, 35, 10, 3, 220, 164, 24, 250, + 224, 10, 3, 220, 164, 24, 250, 54, 192, 26, 200, 19, 10, 3, 220, 164, 24, + 248, 241, 10, 3, 220, 164, 24, 248, 41, 10, 3, 220, 164, 24, 237, 195, + 10, 3, 220, 164, 24, 234, 88, 10, 3, 220, 164, 24, 231, 233, 10, 3, 220, + 164, 24, 231, 193, 10, 3, 220, 164, 24, 230, 175, 10, 3, 220, 164, 24, + 230, 176, 102, 230, 175, 10, 3, 220, 164, 24, 144, 10, 3, 220, 164, 24, + 230, 81, 10, 3, 220, 164, 24, 229, 179, 24, 212, 230, 10, 3, 220, 164, + 24, 223, 227, 230, 162, 10, 3, 220, 164, 24, 223, 207, 10, 3, 220, 164, + 24, 223, 208, 102, 144, 10, 3, 220, 164, 24, 223, 208, 102, 219, 36, 10, + 3, 220, 164, 24, 221, 204, 10, 3, 220, 164, 24, 221, 179, 10, 3, 220, + 164, 24, 221, 24, 10, 3, 220, 164, 24, 221, 13, 10, 3, 220, 164, 24, 221, + 14, 102, 229, 179, 102, 64, 10, 3, 220, 164, 24, 220, 163, 10, 3, 220, + 164, 24, 219, 153, 10, 3, 220, 164, 24, 219, 36, 10, 3, 220, 164, 24, + 219, 21, 10, 3, 220, 164, 24, 217, 48, 10, 3, 220, 164, 24, 217, 49, 102, + 234, 88, 10, 3, 220, 164, 24, 215, 189, 10, 3, 220, 164, 24, 214, 214, + 10, 3, 220, 164, 24, 204, 13, 102, 201, 129, 10, 3, 220, 164, 24, 203, + 214, 102, 231, 19, 102, 234, 15, 10, 3, 220, 164, 24, 203, 214, 102, 231, + 19, 200, 19, 10, 3, 220, 164, 24, 203, 162, 10, 3, 220, 164, 24, 203, + 163, 102, 203, 162, 10, 3, 220, 164, 24, 201, 129, 10, 3, 220, 164, 24, + 200, 155, 10, 3, 220, 164, 24, 200, 141, 10, 3, 220, 164, 24, 200, 80, + 102, 41, 102, 201, 185, 102, 181, 10, 3, 220, 164, 24, 68, 10, 3, 220, + 164, 24, 124, 102, 64, 10, 3, 220, 164, 24, 124, 102, 124, 102, 68, 10, + 3, 220, 164, 24, 197, 121, 102, 250, 53, 10, 3, 220, 164, 24, 197, 109, + 10, 3, 220, 164, 24, 197, 3, 10, 3, 220, 164, 202, 105, 10, 3, 220, 161, + 10, 3, 220, 162, 24, 204, 12, 10, 3, 220, 162, 24, 204, 13, 102, 201, + 129, 10, 3, 220, 162, 230, 162, 10, 3, 220, 162, 230, 163, 136, 220, 162, + 230, 163, 204, 12, 10, 3, 220, 157, 10, 3, 220, 96, 10, 3, 220, 97, 24, + 220, 96, 10, 3, 220, 94, 10, 3, 220, 95, 24, 221, 0, 10, 3, 220, 95, 24, + 221, 1, 102, 206, 218, 10, 3, 219, 209, 10, 3, 219, 190, 10, 3, 219, 178, + 10, 3, 219, 153, 10, 3, 219, 36, 10, 3, 219, 37, 24, 248, 241, 10, 3, + 219, 34, 10, 3, 219, 35, 24, 251, 35, 10, 3, 219, 35, 24, 248, 241, 10, + 3, 219, 35, 24, 233, 252, 10, 3, 219, 35, 24, 233, 253, 200, 19, 10, 3, + 219, 35, 24, 231, 202, 200, 19, 10, 3, 219, 35, 24, 229, 179, 24, 248, + 241, 10, 3, 219, 35, 24, 223, 207, 10, 3, 219, 35, 24, 222, 146, 10, 3, + 219, 35, 24, 222, 144, 10, 3, 219, 35, 24, 222, 145, 102, 250, 53, 10, 3, + 219, 35, 24, 221, 204, 10, 3, 219, 35, 24, 220, 185, 102, 250, 53, 10, 3, + 219, 35, 24, 220, 163, 10, 3, 219, 35, 24, 217, 49, 102, 234, 88, 10, 3, + 219, 35, 24, 214, 214, 10, 3, 219, 35, 24, 213, 22, 10, 3, 219, 35, 24, + 203, 126, 102, 250, 53, 10, 3, 219, 35, 24, 203, 96, 102, 247, 124, 10, + 3, 219, 35, 24, 198, 33, 10, 3, 219, 35, 200, 19, 10, 3, 219, 35, 238, + 176, 219, 34, 10, 3, 219, 35, 211, 170, 219, 34, 10, 3, 219, 35, 202, + 105, 10, 3, 219, 35, 203, 249, 10, 3, 219, 33, 10, 3, 219, 27, 10, 3, + 219, 28, 136, 219, 27, 10, 3, 219, 28, 211, 170, 219, 27, 10, 3, 219, 28, + 203, 249, 10, 3, 219, 24, 10, 3, 219, 21, 10, 3, 219, 19, 10, 3, 219, 20, + 136, 219, 19, 10, 3, 219, 20, 136, 219, 20, 231, 194, 136, 231, 193, 10, + 3, 172, 10, 3, 217, 228, 24, 200, 141, 10, 3, 217, 228, 230, 162, 10, 3, + 217, 220, 10, 3, 217, 188, 10, 3, 217, 135, 10, 3, 217, 110, 10, 3, 217, + 109, 10, 3, 217, 48, 10, 3, 216, 248, 10, 3, 216, 175, 10, 3, 216, 120, + 10, 3, 215, 241, 10, 3, 215, 242, 136, 215, 241, 10, 3, 215, 226, 10, 3, + 215, 227, 230, 162, 10, 3, 215, 207, 10, 3, 215, 193, 10, 3, 215, 189, + 10, 3, 215, 190, 24, 64, 10, 3, 215, 190, 24, 221, 0, 10, 3, 215, 190, + 24, 192, 112, 10, 3, 215, 190, 136, 215, 189, 10, 3, 215, 190, 136, 215, + 190, 24, 41, 102, 181, 10, 3, 215, 190, 238, 176, 215, 189, 10, 3, 215, + 187, 10, 3, 215, 188, 24, 64, 10, 3, 215, 188, 24, 41, 102, 237, 16, 10, + 3, 215, 188, 24, 237, 16, 10, 3, 215, 188, 230, 162, 10, 3, 181, 10, 3, + 215, 87, 10, 3, 215, 74, 10, 3, 215, 75, 223, 120, 10, 3, 215, 75, 24, + 203, 165, 200, 19, 10, 3, 215, 75, 211, 170, 215, 74, 10, 3, 215, 73, 10, + 3, 215, 66, 212, 216, 10, 3, 215, 65, 10, 3, 215, 64, 10, 3, 214, 214, + 10, 3, 214, 215, 24, 64, 10, 3, 214, 215, 24, 197, 109, 10, 3, 214, 215, + 203, 249, 10, 3, 214, 60, 10, 3, 214, 61, 24, 71, 10, 3, 214, 51, 10, 3, + 214, 21, 10, 3, 214, 22, 24, 231, 202, 200, 19, 10, 3, 214, 22, 24, 231, + 194, 102, 231, 202, 200, 19, 10, 3, 214, 17, 10, 3, 214, 18, 24, 250, + 224, 10, 3, 214, 18, 24, 250, 53, 10, 3, 214, 18, 24, 250, 54, 102, 250, + 53, 10, 3, 214, 18, 24, 230, 175, 10, 3, 214, 18, 24, 217, 49, 102, 231, + 202, 200, 19, 10, 3, 214, 18, 24, 214, 214, 10, 3, 214, 18, 24, 212, 230, + 10, 3, 214, 18, 24, 204, 12, 10, 3, 214, 18, 24, 204, 13, 102, 41, 250, + 224, 10, 3, 214, 18, 24, 204, 13, 102, 250, 53, 10, 3, 214, 18, 24, 204, + 13, 102, 250, 54, 102, 250, 53, 10, 3, 214, 18, 24, 197, 121, 102, 250, + 53, 10, 3, 214, 18, 24, 197, 3, 10, 3, 214, 5, 10, 3, 213, 22, 10, 3, + 212, 247, 10, 3, 212, 230, 10, 3, 212, 231, 220, 162, 24, 231, 193, 10, + 3, 212, 231, 220, 162, 24, 217, 110, 10, 3, 212, 231, 220, 162, 24, 206, + 63, 10, 3, 212, 231, 220, 162, 24, 206, 64, 136, 212, 231, 220, 162, 24, + 206, 63, 10, 3, 212, 231, 220, 162, 24, 197, 3, 10, 3, 212, 231, 200, 19, + 10, 3, 212, 231, 136, 212, 230, 10, 3, 212, 231, 238, 176, 212, 230, 10, + 3, 212, 231, 238, 176, 212, 231, 220, 162, 136, 220, 161, 10, 3, 212, + 225, 10, 3, 212, 226, 251, 156, 24, 250, 47, 10, 3, 212, 226, 251, 156, + 24, 248, 41, 10, 3, 212, 226, 251, 156, 24, 235, 56, 10, 3, 212, 226, + 251, 156, 24, 230, 175, 10, 3, 212, 226, 251, 156, 24, 223, 227, 230, + 162, 10, 3, 212, 226, 251, 156, 24, 222, 144, 10, 3, 212, 226, 251, 156, + 24, 177, 10, 3, 212, 226, 251, 156, 24, 214, 214, 10, 3, 212, 226, 251, + 156, 24, 203, 93, 10, 3, 212, 226, 251, 156, 24, 197, 120, 10, 3, 212, + 226, 221, 163, 24, 248, 41, 10, 3, 212, 226, 221, 163, 24, 248, 42, 68, + 10, 3, 166, 10, 3, 211, 67, 10, 3, 211, 25, 10, 3, 210, 253, 10, 3, 210, + 109, 10, 3, 210, 51, 10, 3, 210, 52, 24, 64, 10, 3, 210, 52, 24, 251, + 238, 10, 3, 210, 52, 24, 248, 41, 10, 3, 210, 52, 24, 247, 124, 10, 3, + 210, 52, 24, 71, 10, 3, 210, 52, 24, 70, 10, 3, 210, 52, 24, 228, 53, 10, + 3, 210, 52, 24, 68, 10, 3, 210, 52, 24, 197, 120, 10, 3, 210, 52, 238, + 176, 210, 51, 10, 3, 209, 245, 10, 3, 209, 246, 24, 222, 125, 10, 3, 209, + 246, 24, 197, 109, 10, 3, 209, 246, 24, 192, 112, 10, 3, 209, 246, 211, + 170, 209, 245, 10, 3, 167, 10, 3, 208, 66, 10, 3, 207, 151, 10, 3, 206, + 218, 10, 3, 188, 10, 3, 206, 80, 212, 216, 10, 3, 206, 79, 10, 3, 206, + 80, 24, 64, 10, 3, 206, 80, 24, 235, 62, 10, 3, 206, 80, 24, 235, 60, 10, + 3, 206, 80, 24, 144, 10, 3, 206, 80, 24, 222, 129, 10, 3, 206, 80, 24, + 221, 0, 10, 3, 206, 80, 24, 219, 19, 10, 3, 206, 80, 24, 216, 175, 10, 3, + 206, 80, 24, 212, 230, 10, 3, 206, 80, 24, 206, 63, 10, 3, 206, 80, 24, + 203, 234, 10, 3, 206, 80, 24, 200, 166, 10, 3, 206, 80, 24, 197, 120, 10, + 3, 206, 80, 24, 197, 115, 10, 3, 206, 80, 24, 197, 84, 10, 3, 206, 80, + 24, 197, 27, 10, 3, 206, 80, 24, 197, 3, 10, 3, 206, 80, 136, 206, 79, + 10, 3, 206, 80, 230, 162, 10, 3, 206, 63, 10, 3, 206, 64, 220, 164, 24, + 250, 51, 10, 3, 206, 34, 10, 3, 206, 25, 10, 3, 204, 64, 10, 3, 204, 62, + 10, 3, 204, 63, 24, 64, 10, 3, 204, 63, 24, 248, 241, 10, 3, 204, 63, 24, + 231, 18, 10, 3, 204, 63, 24, 214, 214, 10, 3, 204, 63, 24, 203, 162, 10, + 3, 204, 63, 24, 198, 15, 10, 3, 204, 63, 24, 68, 10, 3, 204, 63, 24, 124, + 102, 64, 10, 3, 204, 60, 10, 3, 204, 58, 10, 3, 204, 30, 10, 3, 204, 12, + 10, 3, 204, 13, 228, 181, 10, 3, 204, 13, 136, 204, 13, 231, 225, 136, + 231, 225, 231, 194, 136, 231, 193, 10, 3, 204, 13, 136, 204, 13, 200, + 167, 136, 200, 167, 231, 194, 136, 231, 193, 10, 3, 204, 5, 10, 3, 204, + 0, 10, 3, 203, 252, 10, 3, 203, 251, 10, 3, 203, 248, 10, 3, 203, 234, + 10, 3, 203, 235, 24, 64, 10, 3, 203, 235, 24, 223, 207, 10, 3, 203, 228, + 10, 3, 203, 229, 24, 64, 10, 3, 203, 229, 24, 248, 221, 10, 3, 203, 229, + 24, 247, 100, 10, 3, 203, 229, 24, 236, 215, 10, 3, 203, 229, 24, 231, + 193, 10, 3, 203, 229, 24, 223, 226, 10, 3, 203, 229, 24, 223, 227, 230, + 162, 10, 3, 203, 229, 24, 220, 249, 10, 3, 203, 229, 24, 219, 21, 10, 3, + 203, 229, 24, 215, 226, 10, 3, 203, 229, 24, 206, 63, 10, 3, 203, 222, + 10, 3, 203, 217, 10, 3, 203, 218, 200, 19, 10, 3, 203, 218, 136, 203, + 218, 247, 90, 136, 247, 89, 10, 3, 203, 213, 10, 3, 203, 164, 10, 3, 203, + 165, 136, 223, 121, 203, 164, 10, 3, 203, 162, 10, 3, 203, 160, 10, 3, + 203, 125, 10, 3, 203, 126, 230, 162, 10, 3, 203, 104, 10, 3, 203, 102, + 10, 3, 203, 103, 136, 203, 103, 203, 162, 10, 3, 203, 95, 10, 3, 203, 93, + 10, 3, 201, 184, 10, 3, 201, 185, 136, 201, 184, 10, 3, 201, 141, 10, 3, + 201, 140, 10, 3, 201, 138, 10, 3, 201, 129, 10, 3, 201, 128, 10, 3, 201, + 100, 10, 3, 201, 99, 10, 3, 189, 10, 3, 200, 181, 250, 37, 10, 3, 200, + 181, 24, 229, 178, 10, 3, 200, 181, 24, 216, 175, 10, 3, 200, 181, 230, + 162, 10, 3, 200, 166, 10, 3, 200, 167, 136, 200, 167, 214, 61, 136, 214, + 61, 236, 195, 136, 236, 194, 10, 3, 200, 167, 202, 105, 10, 3, 200, 155, + 10, 3, 190, 24, 248, 41, 10, 3, 190, 24, 230, 175, 10, 3, 190, 24, 204, + 12, 10, 3, 190, 24, 203, 164, 10, 3, 190, 24, 198, 33, 10, 3, 190, 24, + 197, 109, 10, 3, 200, 141, 10, 3, 200, 112, 10, 3, 200, 79, 10, 3, 200, + 80, 230, 162, 10, 3, 199, 128, 10, 3, 199, 129, 200, 19, 10, 3, 199, 92, + 10, 3, 199, 69, 10, 3, 199, 70, 24, 200, 141, 10, 3, 199, 70, 136, 199, + 69, 10, 3, 199, 70, 136, 199, 70, 231, 225, 136, 231, 225, 231, 194, 136, + 231, 193, 10, 3, 198, 45, 10, 3, 198, 33, 10, 3, 198, 31, 10, 3, 198, 27, + 10, 3, 198, 15, 10, 3, 198, 16, 136, 198, 16, 192, 113, 136, 192, 112, + 10, 3, 68, 10, 3, 124, 230, 175, 10, 3, 124, 124, 68, 10, 3, 124, 136, + 124, 211, 78, 136, 211, 78, 231, 194, 136, 231, 193, 10, 3, 124, 136, + 124, 201, 101, 136, 201, 100, 10, 3, 124, 136, 124, 124, 207, 168, 136, + 124, 207, 167, 10, 3, 197, 120, 10, 3, 197, 115, 10, 3, 197, 109, 10, 3, + 197, 110, 220, 249, 10, 3, 197, 110, 24, 248, 241, 10, 3, 197, 110, 24, + 216, 175, 10, 3, 197, 110, 24, 124, 102, 124, 102, 68, 10, 3, 197, 110, + 24, 124, 102, 124, 102, 124, 230, 162, 10, 3, 197, 110, 230, 162, 10, 3, + 197, 110, 203, 249, 10, 3, 197, 110, 203, 250, 24, 248, 241, 10, 3, 197, + 105, 10, 3, 197, 84, 10, 3, 197, 85, 24, 220, 163, 10, 3, 197, 85, 24, + 217, 49, 102, 238, 0, 10, 3, 197, 85, 24, 204, 62, 10, 3, 197, 85, 24, + 68, 10, 3, 197, 83, 10, 3, 197, 79, 10, 3, 197, 80, 24, 222, 88, 10, 3, + 197, 80, 24, 166, 10, 3, 197, 77, 10, 3, 197, 78, 230, 162, 10, 3, 197, + 27, 10, 3, 197, 28, 238, 176, 197, 27, 10, 3, 197, 28, 203, 249, 10, 3, + 197, 25, 10, 3, 197, 26, 24, 41, 102, 144, 10, 3, 197, 26, 24, 41, 102, + 181, 10, 3, 197, 26, 24, 251, 35, 10, 3, 197, 26, 24, 144, 10, 3, 197, + 26, 24, 212, 230, 10, 3, 197, 26, 24, 197, 120, 10, 3, 197, 26, 24, 197, + 121, 102, 250, 53, 10, 3, 197, 26, 24, 197, 121, 102, 248, 41, 10, 3, + 197, 24, 10, 3, 197, 21, 10, 3, 197, 20, 10, 3, 197, 16, 10, 3, 197, 17, + 24, 64, 10, 3, 197, 17, 24, 250, 47, 10, 3, 197, 17, 24, 161, 10, 3, 197, + 17, 24, 235, 49, 10, 3, 197, 17, 24, 231, 233, 10, 3, 197, 17, 24, 231, + 215, 10, 3, 197, 17, 24, 231, 202, 200, 19, 10, 3, 197, 17, 24, 231, 193, + 10, 3, 197, 17, 24, 230, 186, 10, 3, 197, 17, 24, 144, 10, 3, 197, 17, + 24, 223, 226, 10, 3, 197, 17, 24, 223, 207, 10, 3, 197, 17, 24, 223, 90, + 10, 3, 197, 17, 24, 221, 204, 10, 3, 197, 17, 24, 219, 19, 10, 3, 197, + 17, 24, 216, 120, 10, 3, 197, 17, 24, 166, 10, 3, 197, 17, 24, 204, 12, + 10, 3, 197, 17, 24, 203, 102, 10, 3, 197, 17, 24, 198, 45, 10, 3, 197, + 17, 24, 124, 102, 230, 175, 10, 3, 197, 17, 24, 197, 109, 10, 3, 197, 17, + 24, 197, 14, 10, 3, 197, 14, 10, 3, 197, 15, 24, 68, 10, 3, 197, 3, 10, + 3, 197, 4, 24, 64, 10, 3, 197, 4, 24, 221, 33, 10, 3, 197, 4, 24, 221, 0, + 10, 3, 197, 4, 24, 200, 141, 10, 3, 196, 255, 10, 3, 197, 2, 10, 3, 197, + 0, 10, 3, 196, 252, 10, 3, 196, 240, 10, 3, 196, 241, 24, 222, 88, 10, 3, + 196, 238, 10, 3, 192, 112, 10, 3, 192, 113, 200, 19, 10, 3, 192, 113, + 108, 24, 221, 0, 10, 3, 192, 108, 10, 3, 192, 100, 10, 3, 192, 84, 10, 3, + 192, 30, 10, 3, 192, 31, 136, 192, 30, 10, 3, 192, 29, 10, 3, 192, 27, + 10, 3, 192, 28, 222, 148, 200, 19, 10, 3, 192, 22, 10, 3, 192, 13, 10, 3, + 191, 252, 10, 3, 191, 250, 10, 3, 191, 251, 24, 64, 10, 3, 191, 249, 10, + 3, 191, 248, 10, 3, 222, 113, 234, 121, 10, 3, 251, 239, 24, 212, 230, + 10, 3, 251, 156, 24, 64, 10, 3, 250, 238, 24, 221, 15, 10, 3, 237, 247, + 221, 163, 24, 197, 121, 102, 217, 110, 10, 3, 237, 245, 10, 3, 236, 195, + 102, 203, 164, 10, 3, 235, 61, 24, 204, 12, 10, 3, 233, 169, 24, 230, + 175, 10, 3, 233, 169, 24, 204, 12, 10, 3, 231, 232, 24, 250, 225, 102, + 222, 130, 102, 64, 10, 3, 231, 232, 24, 250, 51, 10, 3, 231, 157, 10, 3, + 231, 35, 10, 3, 228, 153, 10, 3, 222, 174, 24, 250, 188, 10, 3, 222, 174, + 24, 250, 50, 10, 3, 222, 174, 24, 231, 18, 10, 3, 222, 174, 24, 230, 175, + 10, 3, 222, 174, 24, 229, 179, 24, 250, 51, 10, 3, 222, 174, 24, 219, 19, + 10, 3, 222, 174, 24, 166, 10, 3, 222, 174, 24, 203, 156, 10, 3, 222, 174, + 24, 198, 45, 10, 3, 222, 174, 24, 197, 25, 10, 3, 220, 164, 24, 231, 46, + 10, 3, 219, 35, 203, 250, 24, 248, 241, 10, 3, 219, 35, 24, 233, 253, + 102, 220, 96, 10, 3, 219, 35, 24, 203, 164, 10, 3, 216, 247, 10, 3, 215, + 188, 24, 192, 112, 10, 3, 215, 86, 10, 3, 214, 20, 10, 3, 214, 19, 10, 3, + 214, 18, 24, 248, 221, 10, 3, 214, 18, 24, 231, 46, 10, 3, 212, 248, 207, + 16, 214, 12, 237, 94, 10, 3, 210, 110, 250, 37, 10, 3, 209, 249, 10, 3, + 206, 80, 24, 223, 227, 230, 162, 10, 3, 199, 120, 10, 3, 197, 85, 24, + 217, 48, 10, 3, 124, 68, 10, 162, 3, 103, 250, 53, 10, 162, 3, 112, 250, + 53, 10, 162, 3, 232, 119, 250, 53, 10, 162, 3, 232, 214, 250, 53, 10, + 162, 3, 203, 41, 250, 53, 10, 162, 3, 204, 146, 250, 53, 10, 162, 3, 234, + 148, 250, 53, 10, 162, 3, 214, 16, 250, 53, 10, 162, 3, 112, 236, 194, + 10, 162, 3, 232, 119, 236, 194, 10, 162, 3, 232, 214, 236, 194, 10, 162, + 3, 203, 41, 236, 194, 10, 162, 3, 204, 146, 236, 194, 10, 162, 3, 234, + 148, 236, 194, 10, 162, 3, 214, 16, 236, 194, 10, 162, 3, 232, 119, 68, + 10, 162, 3, 232, 214, 68, 10, 162, 3, 203, 41, 68, 10, 162, 3, 204, 146, + 68, 10, 162, 3, 234, 148, 68, 10, 162, 3, 214, 16, 68, 10, 162, 3, 90, + 231, 129, 10, 162, 3, 103, 231, 129, 10, 162, 3, 112, 231, 129, 10, 162, + 3, 232, 119, 231, 129, 10, 162, 3, 232, 214, 231, 129, 10, 162, 3, 203, + 41, 231, 129, 10, 162, 3, 204, 146, 231, 129, 10, 162, 3, 234, 148, 231, + 129, 10, 162, 3, 214, 16, 231, 129, 10, 162, 3, 90, 231, 126, 10, 162, 3, + 103, 231, 126, 10, 162, 3, 112, 231, 126, 10, 162, 3, 232, 119, 231, 126, + 10, 162, 3, 232, 214, 231, 126, 10, 162, 3, 103, 204, 30, 10, 162, 3, + 112, 204, 30, 10, 162, 3, 112, 204, 31, 196, 137, 20, 10, 162, 3, 232, + 119, 204, 30, 10, 162, 3, 232, 214, 204, 30, 10, 162, 3, 203, 41, 204, + 30, 10, 162, 3, 204, 146, 204, 30, 10, 162, 3, 234, 148, 204, 30, 10, + 162, 3, 214, 16, 204, 30, 10, 162, 3, 90, 204, 23, 10, 162, 3, 103, 204, + 23, 10, 162, 3, 112, 204, 23, 10, 162, 3, 112, 204, 24, 196, 137, 20, 10, + 162, 3, 232, 119, 204, 23, 10, 162, 3, 232, 214, 204, 23, 10, 162, 3, + 204, 31, 24, 231, 216, 102, 236, 194, 10, 162, 3, 204, 31, 24, 231, 216, + 102, 216, 120, 10, 162, 3, 90, 247, 85, 10, 162, 3, 103, 247, 85, 10, + 162, 3, 112, 247, 85, 10, 162, 3, 112, 247, 86, 196, 137, 20, 10, 162, 3, + 232, 119, 247, 85, 10, 162, 3, 232, 214, 247, 85, 10, 162, 3, 112, 196, + 137, 232, 136, 233, 254, 10, 162, 3, 112, 196, 137, 232, 136, 233, 251, + 10, 162, 3, 232, 119, 196, 137, 232, 136, 219, 179, 10, 162, 3, 232, 119, + 196, 137, 232, 136, 219, 177, 10, 162, 3, 232, 119, 196, 137, 232, 136, + 219, 180, 64, 10, 162, 3, 232, 119, 196, 137, 232, 136, 219, 180, 249, + 226, 10, 162, 3, 203, 41, 196, 137, 232, 136, 250, 49, 10, 162, 3, 204, + 146, 196, 137, 232, 136, 223, 199, 10, 162, 3, 204, 146, 196, 137, 232, + 136, 223, 201, 64, 10, 162, 3, 204, 146, 196, 137, 232, 136, 223, 201, + 249, 226, 10, 162, 3, 234, 148, 196, 137, 232, 136, 196, 254, 10, 162, 3, + 234, 148, 196, 137, 232, 136, 196, 253, 10, 162, 3, 214, 16, 196, 137, + 232, 136, 223, 215, 10, 162, 3, 214, 16, 196, 137, 232, 136, 223, 214, + 10, 162, 3, 214, 16, 196, 137, 232, 136, 223, 213, 10, 162, 3, 214, 16, + 196, 137, 232, 136, 223, 216, 64, 10, 162, 3, 103, 250, 54, 200, 19, 10, + 162, 3, 112, 250, 54, 200, 19, 10, 162, 3, 232, 119, 250, 54, 200, 19, + 10, 162, 3, 232, 214, 250, 54, 200, 19, 10, 162, 3, 203, 41, 250, 54, + 200, 19, 10, 162, 3, 90, 248, 205, 10, 162, 3, 103, 248, 205, 10, 162, 3, + 112, 248, 205, 10, 162, 3, 232, 119, 248, 205, 10, 162, 3, 232, 119, 248, + 206, 196, 137, 20, 10, 162, 3, 232, 214, 248, 205, 10, 162, 3, 232, 214, + 248, 206, 196, 137, 20, 10, 162, 3, 214, 29, 10, 162, 3, 214, 30, 10, + 162, 3, 90, 233, 250, 10, 162, 3, 103, 233, 250, 10, 162, 3, 90, 199, + 192, 236, 194, 10, 162, 3, 103, 199, 189, 236, 194, 10, 162, 3, 232, 214, + 203, 28, 236, 194, 10, 162, 3, 90, 199, 192, 196, 137, 232, 136, 64, 10, + 162, 3, 103, 199, 189, 196, 137, 232, 136, 64, 10, 162, 3, 90, 234, 144, + 250, 53, 10, 162, 3, 90, 208, 168, 250, 53, 10, 162, 3, 40, 250, 40, 90, + 203, 29, 10, 162, 3, 40, 250, 40, 90, 208, 167, 10, 162, 3, 90, 208, 168, + 230, 156, 10, 162, 3, 90, 138, 230, 156, 10, 162, 3, 234, 122, 90, 199, + 191, 10, 162, 3, 234, 122, 103, 199, 188, 10, 162, 3, 234, 122, 232, 126, + 10, 162, 3, 234, 122, 233, 3, 10, 162, 3, 232, 119, 124, 196, 137, 20, + 10, 162, 3, 232, 214, 124, 196, 137, 20, 10, 162, 3, 203, 41, 124, 196, + 137, 20, 10, 162, 3, 204, 146, 124, 196, 137, 20, 10, 162, 3, 234, 148, + 124, 196, 137, 20, 10, 162, 3, 214, 16, 124, 196, 137, 20, 10, 209, 38, + 3, 40, 250, 40, 194, 11, 236, 177, 10, 209, 38, 3, 84, 242, 47, 10, 209, + 38, 3, 237, 11, 242, 47, 10, 209, 38, 3, 237, 11, 198, 181, 10, 209, 38, + 3, 237, 11, 208, 173, 10, 3, 251, 239, 24, 212, 231, 200, 19, 10, 3, 251, + 239, 24, 203, 162, 10, 3, 251, 126, 24, 233, 252, 10, 3, 248, 242, 24, + 236, 195, 200, 19, 10, 3, 248, 228, 24, 251, 155, 10, 3, 248, 228, 24, + 214, 60, 10, 3, 248, 228, 24, 192, 112, 10, 3, 247, 125, 136, 247, 125, + 24, 215, 87, 10, 3, 238, 1, 24, 200, 141, 10, 3, 237, 247, 24, 221, 0, + 10, 3, 236, 228, 24, 223, 226, 10, 3, 236, 228, 24, 124, 124, 68, 10, 3, + 236, 226, 24, 197, 109, 10, 3, 235, 57, 24, 250, 188, 10, 3, 235, 57, 24, + 250, 53, 10, 3, 235, 57, 24, 250, 54, 250, 27, 220, 28, 10, 3, 235, 57, + 24, 236, 215, 10, 3, 235, 57, 24, 235, 49, 10, 3, 235, 57, 24, 234, 15, + 10, 3, 235, 57, 24, 231, 233, 10, 3, 235, 57, 24, 231, 46, 10, 3, 235, + 57, 24, 231, 28, 230, 162, 10, 3, 235, 57, 24, 231, 18, 10, 3, 235, 57, + 24, 144, 10, 3, 235, 57, 24, 229, 178, 10, 3, 235, 57, 24, 223, 227, 230, + 162, 10, 3, 235, 57, 24, 222, 88, 10, 3, 235, 57, 24, 221, 0, 10, 3, 235, + 57, 24, 220, 249, 10, 3, 235, 57, 24, 220, 250, 102, 222, 88, 10, 3, 235, + 57, 24, 220, 151, 10, 3, 235, 57, 24, 220, 94, 10, 3, 235, 57, 24, 220, + 95, 24, 221, 0, 10, 3, 235, 57, 24, 219, 25, 102, 231, 18, 10, 3, 235, + 57, 24, 217, 110, 10, 3, 235, 57, 24, 216, 248, 10, 3, 235, 57, 24, 216, + 175, 10, 3, 235, 57, 24, 214, 60, 10, 3, 235, 57, 24, 210, 51, 10, 3, + 235, 57, 24, 204, 12, 10, 3, 235, 57, 24, 203, 126, 230, 162, 10, 3, 234, + 201, 24, 221, 0, 10, 3, 234, 201, 24, 210, 253, 10, 3, 234, 16, 193, 223, + 10, 3, 233, 253, 238, 176, 233, 252, 10, 3, 233, 169, 203, 250, 24, 250, + 53, 10, 3, 233, 169, 203, 250, 24, 229, 178, 10, 3, 233, 169, 203, 250, + 24, 223, 227, 230, 162, 10, 3, 233, 169, 203, 250, 24, 177, 10, 3, 233, + 169, 203, 250, 24, 220, 96, 10, 3, 233, 169, 203, 250, 24, 217, 48, 10, + 3, 233, 169, 203, 250, 24, 216, 248, 10, 3, 233, 169, 203, 250, 24, 201, + 184, 10, 3, 233, 169, 24, 201, 184, 10, 3, 231, 232, 24, 248, 227, 10, 3, + 231, 232, 24, 236, 228, 230, 162, 10, 3, 231, 232, 24, 235, 57, 24, 223, + 227, 230, 162, 10, 3, 231, 232, 24, 235, 57, 24, 222, 88, 10, 3, 231, + 232, 24, 234, 18, 10, 3, 231, 232, 24, 231, 233, 10, 3, 231, 232, 24, + 231, 194, 102, 237, 16, 10, 3, 231, 232, 24, 231, 194, 102, 214, 214, 10, + 3, 231, 232, 24, 230, 113, 102, 64, 10, 3, 231, 232, 24, 220, 250, 102, + 222, 88, 10, 3, 231, 232, 24, 220, 94, 10, 3, 231, 232, 24, 220, 95, 24, + 221, 0, 10, 3, 231, 232, 24, 219, 24, 10, 3, 231, 232, 24, 215, 189, 10, + 3, 231, 232, 24, 214, 214, 10, 3, 231, 232, 24, 214, 215, 102, 234, 200, + 10, 3, 231, 232, 24, 214, 215, 102, 231, 46, 10, 3, 231, 232, 24, 203, + 228, 10, 3, 231, 232, 24, 192, 13, 10, 3, 231, 227, 207, 16, 214, 12, + 237, 94, 10, 3, 231, 128, 24, 68, 10, 3, 231, 19, 24, 231, 19, 238, 176, + 231, 18, 10, 3, 230, 185, 24, 223, 227, 230, 162, 10, 3, 230, 176, 102, + 231, 19, 24, 200, 141, 10, 3, 230, 113, 200, 20, 230, 162, 10, 3, 229, + 179, 24, 250, 54, 136, 229, 179, 24, 250, 53, 10, 3, 222, 174, 24, 247, + 124, 10, 3, 222, 174, 24, 160, 10, 3, 222, 174, 24, 124, 124, 68, 10, 3, + 222, 174, 24, 197, 27, 10, 3, 220, 164, 24, 191, 253, 136, 191, 252, 10, + 3, 220, 152, 10, 3, 220, 150, 10, 3, 220, 149, 10, 3, 220, 148, 10, 3, + 220, 147, 10, 3, 220, 146, 10, 3, 220, 145, 10, 3, 220, 144, 136, 220, + 144, 230, 162, 10, 3, 220, 143, 10, 3, 220, 142, 136, 220, 141, 10, 3, + 220, 140, 10, 3, 220, 139, 10, 3, 220, 138, 10, 3, 220, 137, 10, 3, 220, + 136, 10, 3, 220, 135, 10, 3, 220, 134, 10, 3, 220, 133, 10, 3, 220, 132, + 10, 3, 220, 131, 10, 3, 220, 130, 10, 3, 220, 129, 10, 3, 220, 128, 10, + 3, 220, 127, 10, 3, 220, 126, 10, 3, 220, 125, 10, 3, 220, 124, 10, 3, + 220, 123, 10, 3, 220, 121, 10, 3, 220, 122, 24, 230, 186, 10, 3, 220, + 122, 24, 223, 226, 10, 3, 220, 122, 24, 210, 254, 102, 219, 33, 10, 3, + 220, 122, 24, 210, 254, 102, 210, 254, 102, 219, 33, 10, 3, 220, 122, 24, + 197, 121, 102, 249, 3, 10, 3, 220, 120, 10, 3, 220, 119, 10, 3, 220, 118, + 10, 3, 220, 117, 10, 3, 220, 116, 10, 3, 220, 115, 10, 3, 220, 114, 10, + 3, 220, 113, 10, 3, 220, 112, 10, 3, 220, 111, 10, 3, 220, 109, 10, 3, + 220, 110, 24, 250, 53, 10, 3, 220, 110, 24, 248, 241, 10, 3, 220, 110, + 24, 235, 48, 230, 163, 230, 162, 10, 3, 220, 110, 24, 221, 24, 10, 3, + 220, 110, 24, 177, 10, 3, 220, 110, 24, 200, 112, 10, 3, 220, 110, 24, + 200, 79, 10, 3, 220, 110, 24, 197, 120, 10, 3, 220, 110, 24, 197, 109, + 10, 3, 220, 110, 24, 197, 14, 10, 3, 220, 108, 10, 3, 220, 106, 10, 3, + 220, 107, 24, 235, 60, 10, 3, 220, 107, 24, 231, 233, 10, 3, 220, 107, + 24, 223, 226, 10, 3, 220, 107, 24, 223, 227, 230, 162, 10, 3, 220, 107, + 24, 214, 60, 10, 3, 220, 107, 24, 210, 254, 102, 210, 254, 102, 219, 33, + 10, 3, 220, 107, 24, 203, 253, 102, 221, 204, 10, 3, 220, 107, 24, 197, + 109, 10, 3, 220, 107, 24, 197, 14, 10, 3, 220, 104, 10, 3, 220, 103, 10, + 3, 219, 35, 230, 163, 24, 250, 53, 10, 3, 219, 35, 24, 236, 194, 10, 3, + 219, 35, 24, 230, 81, 10, 3, 219, 35, 24, 210, 253, 10, 3, 219, 35, 24, + 210, 254, 102, 210, 254, 102, 219, 33, 10, 3, 219, 35, 24, 200, 141, 10, + 3, 216, 176, 102, 192, 111, 10, 3, 215, 190, 136, 215, 190, 24, 231, 233, + 10, 3, 215, 190, 136, 215, 190, 24, 222, 129, 10, 3, 214, 18, 24, 236, + 228, 230, 162, 10, 3, 214, 18, 24, 231, 18, 10, 3, 214, 18, 24, 230, 167, + 10, 3, 214, 18, 24, 229, 178, 10, 3, 214, 18, 24, 222, 21, 10, 3, 214, + 18, 24, 220, 147, 10, 3, 214, 18, 24, 217, 110, 10, 3, 214, 18, 24, 210, + 254, 102, 210, 253, 10, 3, 214, 18, 24, 68, 10, 3, 214, 18, 24, 124, 102, + 68, 10, 3, 214, 18, 24, 197, 14, 10, 3, 206, 80, 230, 163, 24, 144, 10, + 3, 206, 80, 24, 234, 88, 10, 3, 206, 80, 24, 204, 13, 250, 27, 220, 28, + 10, 3, 206, 80, 24, 200, 141, 10, 3, 204, 61, 200, 19, 10, 3, 204, 13, + 136, 204, 12, 10, 3, 204, 13, 102, 228, 173, 10, 3, 204, 13, 102, 215, + 64, 10, 3, 204, 13, 102, 206, 25, 10, 3, 203, 163, 102, 235, 57, 24, 214, + 60, 10, 3, 203, 163, 102, 234, 201, 24, 250, 224, 10, 3, 203, 126, 24, + 200, 141, 10, 3, 200, 142, 102, 206, 79, 10, 3, 198, 28, 24, 231, 202, + 200, 19, 10, 3, 198, 28, 24, 112, 236, 194, 10, 3, 197, 26, 223, 120, 10, + 3, 197, 26, 24, 197, 109, 10, 3, 197, 17, 24, 237, 194, 10, 3, 197, 17, + 24, 220, 105, 10, 3, 197, 17, 24, 219, 33, 10, 3, 192, 111, 10, 3, 191, + 253, 136, 191, 253, 102, 206, 25, 10, 3, 191, 251, 24, 112, 236, 195, + 200, 19, 14, 7, 255, 26, 14, 7, 255, 25, 14, 7, 255, 24, 14, 7, 255, 23, + 14, 7, 255, 22, 14, 7, 255, 21, 14, 7, 255, 20, 14, 7, 255, 19, 14, 7, + 255, 18, 14, 7, 255, 17, 14, 7, 255, 16, 14, 7, 255, 15, 14, 7, 255, 14, + 14, 7, 255, 12, 14, 7, 255, 11, 14, 7, 255, 10, 14, 7, 255, 9, 14, 7, + 255, 8, 14, 7, 255, 7, 14, 7, 255, 6, 14, 7, 255, 5, 14, 7, 255, 4, 14, + 7, 255, 3, 14, 7, 255, 2, 14, 7, 255, 1, 14, 7, 255, 0, 14, 7, 254, 255, + 14, 7, 254, 254, 14, 7, 254, 253, 14, 7, 254, 252, 14, 7, 254, 251, 14, + 7, 254, 249, 14, 7, 254, 248, 14, 7, 254, 246, 14, 7, 254, 245, 14, 7, + 254, 244, 14, 7, 254, 243, 14, 7, 254, 242, 14, 7, 254, 241, 14, 7, 254, + 240, 14, 7, 254, 239, 14, 7, 254, 238, 14, 7, 254, 237, 14, 7, 254, 236, + 14, 7, 254, 235, 14, 7, 254, 233, 14, 7, 254, 232, 14, 7, 254, 231, 14, + 7, 254, 229, 14, 7, 254, 228, 14, 7, 254, 227, 14, 7, 254, 226, 14, 7, + 254, 225, 14, 7, 254, 224, 14, 7, 254, 223, 14, 7, 254, 222, 14, 7, 254, + 219, 14, 7, 254, 218, 14, 7, 254, 217, 14, 7, 254, 216, 14, 7, 254, 215, + 14, 7, 254, 214, 14, 7, 254, 213, 14, 7, 254, 212, 14, 7, 254, 211, 14, + 7, 254, 210, 14, 7, 254, 209, 14, 7, 254, 208, 14, 7, 254, 207, 14, 7, + 254, 206, 14, 7, 254, 205, 14, 7, 254, 204, 14, 7, 254, 203, 14, 7, 254, + 202, 14, 7, 254, 201, 14, 7, 254, 200, 14, 7, 254, 196, 14, 7, 254, 195, + 14, 7, 254, 194, 14, 7, 254, 193, 14, 7, 249, 224, 14, 7, 249, 222, 14, + 7, 249, 220, 14, 7, 249, 218, 14, 7, 249, 216, 14, 7, 249, 215, 14, 7, + 249, 213, 14, 7, 249, 211, 14, 7, 249, 209, 14, 7, 249, 207, 14, 7, 247, + 48, 14, 7, 247, 47, 14, 7, 247, 46, 14, 7, 247, 45, 14, 7, 247, 44, 14, + 7, 247, 43, 14, 7, 247, 42, 14, 7, 247, 41, 14, 7, 247, 40, 14, 7, 247, + 39, 14, 7, 247, 38, 14, 7, 247, 37, 14, 7, 247, 36, 14, 7, 247, 35, 14, + 7, 247, 34, 14, 7, 247, 33, 14, 7, 247, 32, 14, 7, 247, 31, 14, 7, 247, + 30, 14, 7, 247, 29, 14, 7, 247, 28, 14, 7, 247, 27, 14, 7, 247, 26, 14, + 7, 247, 25, 14, 7, 247, 24, 14, 7, 247, 23, 14, 7, 247, 22, 14, 7, 247, + 21, 14, 7, 238, 94, 14, 7, 238, 93, 14, 7, 238, 92, 14, 7, 238, 91, 14, + 7, 238, 90, 14, 7, 238, 89, 14, 7, 238, 88, 14, 7, 238, 87, 14, 7, 238, + 86, 14, 7, 238, 85, 14, 7, 238, 84, 14, 7, 238, 83, 14, 7, 238, 82, 14, + 7, 238, 81, 14, 7, 238, 80, 14, 7, 238, 79, 14, 7, 238, 78, 14, 7, 238, + 77, 14, 7, 238, 76, 14, 7, 238, 75, 14, 7, 238, 74, 14, 7, 238, 73, 14, + 7, 238, 72, 14, 7, 238, 71, 14, 7, 238, 70, 14, 7, 238, 69, 14, 7, 238, + 68, 14, 7, 238, 67, 14, 7, 238, 66, 14, 7, 238, 65, 14, 7, 238, 64, 14, + 7, 238, 63, 14, 7, 238, 62, 14, 7, 238, 61, 14, 7, 238, 60, 14, 7, 238, + 59, 14, 7, 238, 58, 14, 7, 238, 57, 14, 7, 238, 56, 14, 7, 238, 55, 14, + 7, 238, 54, 14, 7, 238, 53, 14, 7, 238, 52, 14, 7, 238, 51, 14, 7, 238, + 50, 14, 7, 238, 49, 14, 7, 238, 48, 14, 7, 238, 47, 14, 7, 238, 46, 14, + 7, 238, 45, 14, 7, 238, 44, 14, 7, 238, 43, 14, 7, 238, 42, 14, 7, 238, + 41, 14, 7, 238, 40, 14, 7, 238, 39, 14, 7, 238, 38, 14, 7, 238, 37, 14, + 7, 238, 36, 14, 7, 238, 35, 14, 7, 238, 34, 14, 7, 238, 33, 14, 7, 238, + 32, 14, 7, 238, 31, 14, 7, 238, 30, 14, 7, 238, 29, 14, 7, 238, 28, 14, + 7, 238, 27, 14, 7, 238, 26, 14, 7, 238, 25, 14, 7, 238, 24, 14, 7, 238, + 23, 14, 7, 238, 22, 14, 7, 238, 21, 14, 7, 238, 20, 14, 7, 238, 19, 14, + 7, 238, 18, 14, 7, 238, 17, 14, 7, 238, 16, 14, 7, 238, 15, 14, 7, 238, + 14, 14, 7, 238, 13, 14, 7, 238, 12, 14, 7, 238, 11, 14, 7, 238, 10, 14, + 7, 238, 9, 14, 7, 238, 8, 14, 7, 238, 7, 14, 7, 238, 6, 14, 7, 238, 5, + 14, 7, 238, 4, 14, 7, 238, 3, 14, 7, 234, 245, 14, 7, 234, 244, 14, 7, + 234, 243, 14, 7, 234, 242, 14, 7, 234, 241, 14, 7, 234, 240, 14, 7, 234, + 239, 14, 7, 234, 238, 14, 7, 234, 237, 14, 7, 234, 236, 14, 7, 234, 235, + 14, 7, 234, 234, 14, 7, 234, 233, 14, 7, 234, 232, 14, 7, 234, 231, 14, + 7, 234, 230, 14, 7, 234, 229, 14, 7, 234, 228, 14, 7, 234, 227, 14, 7, + 234, 226, 14, 7, 234, 225, 14, 7, 234, 224, 14, 7, 234, 223, 14, 7, 234, + 222, 14, 7, 234, 221, 14, 7, 234, 220, 14, 7, 234, 219, 14, 7, 234, 218, + 14, 7, 234, 217, 14, 7, 234, 216, 14, 7, 234, 215, 14, 7, 234, 214, 14, + 7, 234, 213, 14, 7, 234, 212, 14, 7, 234, 211, 14, 7, 234, 210, 14, 7, + 234, 209, 14, 7, 234, 208, 14, 7, 234, 207, 14, 7, 234, 206, 14, 7, 234, + 205, 14, 7, 234, 204, 14, 7, 234, 203, 14, 7, 234, 202, 14, 7, 233, 162, + 14, 7, 233, 161, 14, 7, 233, 160, 14, 7, 233, 159, 14, 7, 233, 158, 14, + 7, 233, 157, 14, 7, 233, 156, 14, 7, 233, 155, 14, 7, 233, 154, 14, 7, + 233, 153, 14, 7, 233, 152, 14, 7, 233, 151, 14, 7, 233, 150, 14, 7, 233, + 149, 14, 7, 233, 148, 14, 7, 233, 147, 14, 7, 233, 146, 14, 7, 233, 145, + 14, 7, 233, 144, 14, 7, 233, 143, 14, 7, 233, 142, 14, 7, 233, 141, 14, + 7, 233, 140, 14, 7, 233, 139, 14, 7, 233, 138, 14, 7, 233, 137, 14, 7, + 233, 136, 14, 7, 233, 135, 14, 7, 233, 134, 14, 7, 233, 133, 14, 7, 233, + 132, 14, 7, 233, 131, 14, 7, 233, 130, 14, 7, 233, 129, 14, 7, 233, 128, + 14, 7, 233, 127, 14, 7, 233, 126, 14, 7, 233, 125, 14, 7, 233, 124, 14, + 7, 233, 123, 14, 7, 233, 122, 14, 7, 233, 121, 14, 7, 233, 120, 14, 7, + 233, 119, 14, 7, 233, 118, 14, 7, 233, 117, 14, 7, 233, 116, 14, 7, 233, + 115, 14, 7, 233, 114, 14, 7, 233, 113, 14, 7, 233, 112, 14, 7, 233, 111, + 14, 7, 233, 110, 14, 7, 233, 109, 14, 7, 233, 108, 14, 7, 233, 107, 14, + 7, 233, 106, 14, 7, 233, 105, 14, 7, 233, 104, 14, 7, 233, 103, 14, 7, + 233, 102, 14, 7, 233, 101, 14, 7, 233, 100, 14, 7, 233, 99, 14, 7, 233, + 98, 14, 7, 232, 43, 14, 7, 232, 42, 14, 7, 232, 41, 14, 7, 232, 40, 14, + 7, 232, 39, 14, 7, 232, 38, 14, 7, 232, 37, 14, 7, 232, 36, 14, 7, 232, + 35, 14, 7, 232, 34, 14, 7, 232, 33, 14, 7, 232, 32, 14, 7, 232, 31, 14, + 7, 232, 30, 14, 7, 232, 29, 14, 7, 232, 28, 14, 7, 232, 27, 14, 7, 232, + 26, 14, 7, 232, 25, 14, 7, 232, 24, 14, 7, 232, 23, 14, 7, 232, 22, 14, + 7, 232, 21, 14, 7, 232, 20, 14, 7, 232, 19, 14, 7, 232, 18, 14, 7, 232, + 17, 14, 7, 232, 16, 14, 7, 232, 15, 14, 7, 232, 14, 14, 7, 232, 13, 14, + 7, 232, 12, 14, 7, 232, 11, 14, 7, 232, 10, 14, 7, 232, 9, 14, 7, 232, 8, + 14, 7, 232, 7, 14, 7, 232, 6, 14, 7, 232, 5, 14, 7, 232, 4, 14, 7, 232, + 3, 14, 7, 232, 2, 14, 7, 232, 1, 14, 7, 232, 0, 14, 7, 231, 255, 14, 7, + 231, 254, 14, 7, 231, 253, 14, 7, 231, 252, 14, 7, 231, 251, 14, 7, 231, + 250, 14, 7, 231, 249, 14, 7, 231, 248, 14, 7, 231, 247, 14, 7, 231, 246, + 14, 7, 231, 245, 14, 7, 231, 244, 14, 7, 231, 243, 14, 7, 231, 242, 14, + 7, 231, 241, 14, 7, 231, 240, 14, 7, 231, 239, 14, 7, 231, 238, 14, 7, + 231, 237, 14, 7, 231, 236, 14, 7, 230, 122, 14, 7, 230, 121, 14, 7, 230, + 120, 14, 7, 230, 119, 14, 7, 230, 118, 14, 7, 230, 117, 14, 7, 230, 116, + 14, 7, 230, 115, 14, 7, 230, 114, 14, 7, 228, 77, 14, 7, 228, 76, 14, 7, + 228, 75, 14, 7, 228, 74, 14, 7, 228, 73, 14, 7, 228, 72, 14, 7, 228, 71, + 14, 7, 228, 70, 14, 7, 228, 69, 14, 7, 228, 68, 14, 7, 228, 67, 14, 7, + 228, 66, 14, 7, 228, 65, 14, 7, 228, 64, 14, 7, 228, 63, 14, 7, 228, 62, + 14, 7, 228, 61, 14, 7, 228, 60, 14, 7, 228, 59, 14, 7, 222, 183, 14, 7, + 222, 182, 14, 7, 222, 181, 14, 7, 222, 180, 14, 7, 222, 179, 14, 7, 222, + 178, 14, 7, 222, 177, 14, 7, 222, 176, 14, 7, 220, 199, 14, 7, 220, 198, + 14, 7, 220, 197, 14, 7, 220, 196, 14, 7, 220, 195, 14, 7, 220, 194, 14, + 7, 220, 193, 14, 7, 220, 192, 14, 7, 220, 191, 14, 7, 220, 190, 14, 7, + 218, 234, 14, 7, 218, 233, 14, 7, 218, 232, 14, 7, 218, 230, 14, 7, 218, + 228, 14, 7, 218, 227, 14, 7, 218, 225, 14, 7, 218, 223, 14, 7, 218, 221, + 14, 7, 218, 219, 14, 7, 218, 217, 14, 7, 218, 215, 14, 7, 218, 213, 14, + 7, 218, 212, 14, 7, 218, 210, 14, 7, 218, 208, 14, 7, 218, 207, 14, 7, + 218, 206, 14, 7, 218, 205, 14, 7, 218, 204, 14, 7, 218, 203, 14, 7, 218, + 202, 14, 7, 218, 201, 14, 7, 218, 200, 14, 7, 218, 198, 14, 7, 218, 196, + 14, 7, 218, 194, 14, 7, 218, 193, 14, 7, 218, 191, 14, 7, 218, 190, 14, + 7, 218, 188, 14, 7, 218, 187, 14, 7, 218, 185, 14, 7, 218, 183, 14, 7, + 218, 181, 14, 7, 218, 179, 14, 7, 218, 177, 14, 7, 218, 176, 14, 7, 218, + 174, 14, 7, 218, 172, 14, 7, 218, 171, 14, 7, 218, 169, 14, 7, 218, 167, + 14, 7, 218, 165, 14, 7, 218, 163, 14, 7, 218, 162, 14, 7, 218, 160, 14, + 7, 218, 158, 14, 7, 218, 156, 14, 7, 218, 155, 14, 7, 218, 153, 14, 7, + 218, 151, 14, 7, 218, 150, 14, 7, 218, 149, 14, 7, 218, 147, 14, 7, 218, + 145, 14, 7, 218, 143, 14, 7, 218, 141, 14, 7, 218, 139, 14, 7, 218, 137, + 14, 7, 218, 135, 14, 7, 218, 134, 14, 7, 218, 132, 14, 7, 218, 130, 14, + 7, 218, 128, 14, 7, 218, 126, 14, 7, 215, 146, 14, 7, 215, 145, 14, 7, + 215, 144, 14, 7, 215, 143, 14, 7, 215, 142, 14, 7, 215, 141, 14, 7, 215, + 140, 14, 7, 215, 139, 14, 7, 215, 138, 14, 7, 215, 137, 14, 7, 215, 136, + 14, 7, 215, 135, 14, 7, 215, 134, 14, 7, 215, 133, 14, 7, 215, 132, 14, + 7, 215, 131, 14, 7, 215, 130, 14, 7, 215, 129, 14, 7, 215, 128, 14, 7, + 215, 127, 14, 7, 215, 126, 14, 7, 215, 125, 14, 7, 215, 124, 14, 7, 215, + 123, 14, 7, 215, 122, 14, 7, 215, 121, 14, 7, 215, 120, 14, 7, 215, 119, + 14, 7, 215, 118, 14, 7, 215, 117, 14, 7, 215, 116, 14, 7, 215, 115, 14, + 7, 215, 114, 14, 7, 215, 113, 14, 7, 215, 112, 14, 7, 215, 111, 14, 7, + 215, 110, 14, 7, 215, 109, 14, 7, 215, 108, 14, 7, 215, 107, 14, 7, 215, + 106, 14, 7, 215, 105, 14, 7, 215, 104, 14, 7, 215, 103, 14, 7, 215, 102, + 14, 7, 215, 101, 14, 7, 215, 100, 14, 7, 215, 99, 14, 7, 215, 98, 14, 7, + 213, 203, 14, 7, 213, 202, 14, 7, 213, 201, 14, 7, 213, 200, 14, 7, 213, + 199, 14, 7, 213, 198, 14, 7, 213, 197, 14, 7, 213, 196, 14, 7, 213, 195, + 14, 7, 213, 194, 14, 7, 213, 193, 14, 7, 213, 192, 14, 7, 213, 191, 14, + 7, 213, 190, 14, 7, 213, 189, 14, 7, 213, 188, 14, 7, 213, 187, 14, 7, + 213, 186, 14, 7, 213, 185, 14, 7, 213, 184, 14, 7, 213, 183, 14, 7, 213, + 182, 14, 7, 213, 18, 14, 7, 213, 17, 14, 7, 213, 16, 14, 7, 213, 15, 14, + 7, 213, 14, 14, 7, 213, 13, 14, 7, 213, 12, 14, 7, 213, 11, 14, 7, 213, + 10, 14, 7, 213, 9, 14, 7, 213, 8, 14, 7, 213, 7, 14, 7, 213, 6, 14, 7, + 213, 5, 14, 7, 213, 4, 14, 7, 213, 3, 14, 7, 213, 2, 14, 7, 213, 1, 14, + 7, 213, 0, 14, 7, 212, 255, 14, 7, 212, 254, 14, 7, 212, 253, 14, 7, 212, + 252, 14, 7, 212, 251, 14, 7, 212, 250, 14, 7, 212, 249, 14, 7, 212, 102, + 14, 7, 212, 101, 14, 7, 212, 100, 14, 7, 212, 99, 14, 7, 212, 98, 14, 7, + 212, 97, 14, 7, 212, 96, 14, 7, 212, 95, 14, 7, 212, 94, 14, 7, 212, 93, + 14, 7, 212, 92, 14, 7, 212, 91, 14, 7, 212, 90, 14, 7, 212, 89, 14, 7, + 212, 88, 14, 7, 212, 87, 14, 7, 212, 86, 14, 7, 212, 85, 14, 7, 212, 84, + 14, 7, 212, 83, 14, 7, 212, 82, 14, 7, 212, 81, 14, 7, 212, 80, 14, 7, + 212, 79, 14, 7, 212, 78, 14, 7, 212, 77, 14, 7, 212, 76, 14, 7, 212, 75, + 14, 7, 212, 74, 14, 7, 212, 73, 14, 7, 212, 72, 14, 7, 212, 71, 14, 7, + 212, 70, 14, 7, 212, 69, 14, 7, 212, 68, 14, 7, 212, 67, 14, 7, 212, 66, + 14, 7, 212, 65, 14, 7, 212, 64, 14, 7, 212, 63, 14, 7, 212, 62, 14, 7, + 212, 61, 14, 7, 212, 60, 14, 7, 212, 59, 14, 7, 212, 58, 14, 7, 212, 57, + 14, 7, 212, 56, 14, 7, 212, 55, 14, 7, 212, 54, 14, 7, 212, 53, 14, 7, + 212, 52, 14, 7, 212, 51, 14, 7, 212, 50, 14, 7, 212, 49, 14, 7, 212, 48, + 14, 7, 212, 47, 14, 7, 212, 46, 14, 7, 212, 45, 14, 7, 212, 44, 14, 7, + 212, 43, 14, 7, 212, 42, 14, 7, 212, 41, 14, 7, 212, 40, 14, 7, 212, 39, + 14, 7, 212, 38, 14, 7, 212, 37, 14, 7, 212, 36, 14, 7, 212, 35, 14, 7, + 212, 34, 14, 7, 212, 33, 14, 7, 212, 32, 14, 7, 212, 31, 14, 7, 212, 30, + 14, 7, 212, 29, 14, 7, 212, 28, 14, 7, 211, 92, 14, 7, 211, 91, 14, 7, + 211, 90, 14, 7, 211, 89, 14, 7, 211, 88, 14, 7, 211, 87, 14, 7, 211, 86, + 14, 7, 211, 85, 14, 7, 211, 84, 14, 7, 211, 83, 14, 7, 211, 82, 14, 7, + 211, 81, 14, 7, 211, 80, 14, 7, 208, 246, 14, 7, 208, 245, 14, 7, 208, + 244, 14, 7, 208, 243, 14, 7, 208, 242, 14, 7, 208, 241, 14, 7, 208, 240, + 14, 7, 208, 110, 14, 7, 208, 109, 14, 7, 208, 108, 14, 7, 208, 107, 14, + 7, 208, 106, 14, 7, 208, 105, 14, 7, 208, 104, 14, 7, 208, 103, 14, 7, + 208, 102, 14, 7, 208, 101, 14, 7, 208, 100, 14, 7, 208, 99, 14, 7, 208, + 98, 14, 7, 208, 97, 14, 7, 208, 96, 14, 7, 208, 95, 14, 7, 208, 94, 14, + 7, 208, 93, 14, 7, 208, 92, 14, 7, 208, 91, 14, 7, 208, 90, 14, 7, 208, + 89, 14, 7, 208, 88, 14, 7, 208, 87, 14, 7, 208, 86, 14, 7, 208, 85, 14, + 7, 208, 84, 14, 7, 208, 83, 14, 7, 208, 82, 14, 7, 208, 81, 14, 7, 208, + 80, 14, 7, 208, 79, 14, 7, 208, 78, 14, 7, 208, 77, 14, 7, 206, 155, 14, + 7, 206, 154, 14, 7, 206, 153, 14, 7, 206, 152, 14, 7, 206, 151, 14, 7, + 206, 150, 14, 7, 206, 149, 14, 7, 206, 148, 14, 7, 206, 147, 14, 7, 206, + 146, 14, 7, 206, 145, 14, 7, 206, 144, 14, 7, 206, 143, 14, 7, 206, 142, + 14, 7, 206, 141, 14, 7, 206, 140, 14, 7, 206, 139, 14, 7, 206, 138, 14, + 7, 206, 137, 14, 7, 206, 136, 14, 7, 206, 135, 14, 7, 206, 134, 14, 7, + 206, 133, 14, 7, 206, 132, 14, 7, 206, 131, 14, 7, 206, 130, 14, 7, 206, + 129, 14, 7, 206, 128, 14, 7, 206, 127, 14, 7, 206, 126, 14, 7, 206, 125, + 14, 7, 206, 124, 14, 7, 206, 123, 14, 7, 206, 122, 14, 7, 206, 121, 14, + 7, 206, 120, 14, 7, 206, 119, 14, 7, 206, 118, 14, 7, 206, 117, 14, 7, + 206, 116, 14, 7, 206, 115, 14, 7, 206, 114, 14, 7, 206, 113, 14, 7, 206, + 112, 14, 7, 206, 111, 14, 7, 206, 110, 14, 7, 206, 109, 14, 7, 206, 108, + 14, 7, 206, 107, 14, 7, 206, 106, 14, 7, 206, 105, 14, 7, 206, 104, 14, + 7, 206, 103, 14, 7, 206, 102, 14, 7, 200, 225, 14, 7, 200, 224, 14, 7, + 200, 223, 14, 7, 200, 222, 14, 7, 200, 221, 14, 7, 200, 220, 14, 7, 200, + 219, 14, 7, 200, 218, 14, 7, 200, 217, 14, 7, 200, 216, 14, 7, 200, 215, + 14, 7, 200, 214, 14, 7, 200, 213, 14, 7, 200, 212, 14, 7, 200, 211, 14, + 7, 200, 210, 14, 7, 200, 209, 14, 7, 200, 208, 14, 7, 200, 207, 14, 7, + 200, 206, 14, 7, 200, 205, 14, 7, 200, 204, 14, 7, 200, 203, 14, 7, 200, + 202, 14, 7, 200, 201, 14, 7, 200, 200, 14, 7, 200, 199, 14, 7, 200, 198, + 14, 7, 200, 197, 14, 7, 200, 196, 14, 7, 200, 195, 14, 7, 200, 194, 14, + 7, 200, 193, 14, 7, 200, 192, 14, 7, 200, 191, 14, 7, 200, 190, 14, 7, + 200, 189, 14, 7, 200, 188, 14, 7, 200, 187, 14, 7, 200, 186, 14, 7, 200, + 185, 14, 7, 200, 184, 14, 7, 200, 183, 14, 7, 200, 182, 14, 7, 197, 168, + 14, 7, 197, 167, 14, 7, 197, 166, 14, 7, 197, 165, 14, 7, 197, 164, 14, + 7, 197, 163, 14, 7, 197, 162, 14, 7, 197, 161, 14, 7, 197, 160, 14, 7, + 197, 159, 14, 7, 197, 158, 14, 7, 197, 157, 14, 7, 197, 156, 14, 7, 197, + 155, 14, 7, 197, 154, 14, 7, 197, 153, 14, 7, 197, 152, 14, 7, 197, 151, + 14, 7, 197, 150, 14, 7, 197, 149, 14, 7, 197, 148, 14, 7, 197, 147, 14, + 7, 197, 146, 14, 7, 197, 145, 14, 7, 197, 144, 14, 7, 197, 143, 14, 7, + 197, 142, 14, 7, 197, 141, 14, 7, 197, 140, 14, 7, 197, 139, 14, 7, 197, + 138, 14, 7, 197, 137, 14, 7, 197, 136, 14, 7, 197, 135, 14, 7, 197, 134, + 14, 7, 197, 133, 14, 7, 197, 132, 14, 7, 197, 131, 14, 7, 197, 130, 14, + 7, 197, 129, 14, 7, 197, 128, 14, 7, 197, 127, 14, 7, 197, 126, 14, 7, + 197, 125, 14, 7, 197, 124, 14, 7, 197, 123, 14, 7, 197, 122, 14, 7, 196, + 235, 14, 7, 196, 234, 14, 7, 196, 233, 14, 7, 196, 232, 14, 7, 196, 231, + 14, 7, 196, 230, 14, 7, 196, 229, 14, 7, 196, 228, 14, 7, 196, 227, 14, + 7, 196, 226, 14, 7, 196, 225, 14, 7, 196, 224, 14, 7, 196, 223, 14, 7, + 196, 222, 14, 7, 196, 221, 14, 7, 196, 220, 14, 7, 196, 219, 14, 7, 196, + 218, 14, 7, 196, 217, 14, 7, 196, 216, 14, 7, 196, 215, 14, 7, 196, 214, + 14, 7, 196, 213, 14, 7, 196, 212, 14, 7, 196, 211, 14, 7, 196, 210, 14, + 7, 196, 209, 14, 7, 196, 208, 14, 7, 196, 207, 14, 7, 196, 206, 14, 7, + 196, 205, 14, 7, 196, 204, 14, 7, 196, 203, 14, 7, 196, 202, 14, 7, 196, + 201, 14, 7, 196, 200, 14, 7, 196, 199, 14, 7, 196, 198, 14, 7, 196, 197, + 14, 7, 196, 196, 14, 7, 196, 195, 14, 7, 196, 194, 14, 7, 196, 193, 14, + 7, 196, 192, 14, 7, 196, 191, 14, 7, 196, 190, 14, 7, 196, 189, 14, 7, + 196, 188, 14, 7, 196, 187, 14, 7, 196, 186, 14, 7, 196, 185, 14, 7, 196, + 184, 14, 7, 196, 183, 14, 7, 196, 182, 14, 7, 196, 181, 14, 7, 196, 180, + 14, 7, 196, 179, 14, 7, 196, 178, 14, 7, 196, 177, 14, 7, 196, 176, 14, + 7, 196, 175, 14, 7, 196, 174, 14, 7, 196, 173, 14, 7, 196, 172, 14, 7, + 196, 171, 14, 7, 196, 170, 14, 7, 196, 169, 14, 7, 196, 168, 14, 7, 196, + 167, 14, 7, 196, 166, 14, 7, 196, 165, 14, 7, 196, 164, 14, 7, 196, 163, + 14, 7, 196, 162, 14, 7, 196, 161, 14, 7, 196, 160, 14, 7, 196, 159, 14, + 7, 194, 201, 14, 7, 194, 200, 14, 7, 194, 199, 14, 7, 194, 198, 14, 7, + 194, 197, 14, 7, 194, 196, 14, 7, 194, 195, 14, 7, 194, 194, 14, 7, 194, + 193, 14, 7, 194, 192, 14, 7, 194, 191, 14, 7, 194, 190, 14, 7, 194, 189, + 14, 7, 194, 188, 14, 7, 194, 187, 14, 7, 194, 186, 14, 7, 194, 185, 14, + 7, 194, 184, 14, 7, 194, 183, 14, 7, 194, 182, 14, 7, 194, 181, 14, 7, + 194, 180, 14, 7, 194, 179, 14, 7, 194, 178, 14, 7, 194, 177, 14, 7, 194, + 176, 14, 7, 194, 175, 14, 7, 194, 174, 14, 7, 194, 173, 14, 7, 194, 172, + 14, 7, 194, 171, 14, 7, 194, 170, 14, 7, 193, 221, 14, 7, 193, 220, 14, + 7, 193, 219, 14, 7, 193, 218, 14, 7, 193, 217, 14, 7, 193, 216, 14, 7, + 193, 215, 14, 7, 193, 214, 14, 7, 193, 213, 14, 7, 193, 212, 14, 7, 193, + 211, 14, 7, 193, 210, 14, 7, 193, 146, 14, 7, 193, 145, 14, 7, 193, 144, + 14, 7, 193, 143, 14, 7, 193, 142, 14, 7, 193, 141, 14, 7, 193, 140, 14, + 7, 193, 139, 14, 7, 193, 138, 14, 7, 192, 154, 14, 7, 192, 153, 14, 7, + 192, 152, 14, 7, 192, 151, 14, 7, 192, 150, 14, 7, 192, 149, 14, 7, 192, + 148, 14, 7, 192, 147, 14, 7, 192, 146, 14, 7, 192, 145, 14, 7, 192, 144, + 14, 7, 192, 143, 14, 7, 192, 142, 14, 7, 192, 141, 14, 7, 192, 140, 14, + 7, 192, 139, 14, 7, 192, 138, 14, 7, 192, 137, 14, 7, 192, 136, 14, 7, + 192, 135, 14, 7, 192, 134, 14, 7, 192, 133, 14, 7, 192, 132, 14, 7, 192, + 131, 14, 7, 192, 130, 14, 7, 192, 129, 14, 7, 192, 128, 14, 7, 192, 127, + 14, 7, 192, 126, 14, 7, 192, 125, 14, 7, 192, 124, 14, 7, 192, 123, 14, + 7, 192, 122, 14, 7, 192, 121, 14, 7, 192, 120, 14, 7, 192, 119, 14, 7, + 192, 118, 14, 7, 192, 117, 14, 7, 192, 116, 14, 7, 192, 115, 14, 7, 192, + 114, 14, 7, 252, 32, 14, 7, 252, 31, 14, 7, 252, 30, 14, 7, 252, 29, 14, + 7, 252, 28, 14, 7, 252, 27, 14, 7, 252, 26, 14, 7, 252, 25, 14, 7, 252, + 24, 14, 7, 252, 23, 14, 7, 252, 22, 14, 7, 252, 21, 14, 7, 252, 20, 14, + 7, 252, 19, 14, 7, 252, 18, 14, 7, 252, 17, 14, 7, 252, 16, 14, 7, 252, + 15, 14, 7, 252, 14, 14, 7, 252, 13, 14, 7, 252, 12, 14, 7, 252, 11, 14, + 7, 252, 10, 14, 7, 252, 9, 14, 7, 252, 8, 14, 7, 252, 7, 14, 7, 252, 6, + 14, 7, 252, 5, 14, 7, 252, 4, 14, 7, 252, 3, 14, 7, 252, 2, 14, 7, 252, + 1, 14, 7, 252, 0, 14, 7, 251, 255, 14, 7, 84, 222, 228, 14, 7, 229, 5, + 222, 228, 14, 7, 223, 148, 250, 27, 198, 249, 202, 14, 14, 7, 223, 148, + 250, 27, 247, 188, 202, 14, 14, 7, 223, 148, 250, 27, 198, 249, 234, 79, + 14, 7, 223, 148, 250, 27, 247, 188, 234, 79, 14, 7, 211, 111, 216, 160, + 14, 7, 248, 100, 205, 198, 14, 7, 234, 80, 205, 198, 29, 7, 255, 26, 29, + 7, 255, 25, 29, 7, 255, 24, 29, 7, 255, 23, 29, 7, 255, 22, 29, 7, 255, + 20, 29, 7, 255, 17, 29, 7, 255, 16, 29, 7, 255, 15, 29, 7, 255, 14, 29, + 7, 255, 13, 29, 7, 255, 12, 29, 7, 255, 11, 29, 7, 255, 10, 29, 7, 255, + 9, 29, 7, 255, 7, 29, 7, 255, 6, 29, 7, 255, 5, 29, 7, 255, 3, 29, 7, + 255, 2, 29, 7, 255, 1, 29, 7, 255, 0, 29, 7, 254, 255, 29, 7, 254, 254, + 29, 7, 254, 253, 29, 7, 254, 252, 29, 7, 254, 251, 29, 7, 254, 250, 29, + 7, 254, 249, 29, 7, 254, 248, 29, 7, 254, 246, 29, 7, 254, 245, 29, 7, + 254, 244, 29, 7, 254, 243, 29, 7, 254, 241, 29, 7, 254, 240, 29, 7, 254, + 239, 29, 7, 254, 238, 29, 7, 254, 237, 29, 7, 254, 236, 29, 7, 254, 235, + 29, 7, 254, 234, 29, 7, 254, 233, 29, 7, 254, 231, 29, 7, 254, 230, 29, + 7, 254, 229, 29, 7, 254, 227, 29, 7, 254, 225, 29, 7, 254, 224, 29, 7, + 254, 223, 29, 7, 254, 222, 29, 7, 254, 221, 29, 7, 254, 220, 29, 7, 254, + 219, 29, 7, 254, 218, 29, 7, 254, 217, 29, 7, 254, 216, 29, 7, 254, 215, + 29, 7, 254, 214, 29, 7, 254, 213, 29, 7, 254, 212, 29, 7, 254, 211, 29, + 7, 254, 210, 29, 7, 254, 209, 29, 7, 254, 208, 29, 7, 254, 207, 29, 7, + 254, 206, 29, 7, 254, 205, 29, 7, 254, 204, 29, 7, 254, 203, 29, 7, 254, + 202, 29, 7, 254, 201, 29, 7, 254, 200, 29, 7, 254, 199, 29, 7, 254, 198, + 29, 7, 254, 197, 29, 7, 254, 196, 29, 7, 254, 195, 29, 7, 254, 194, 29, + 7, 254, 193, 29, 7, 254, 192, 29, 7, 254, 191, 29, 7, 254, 190, 29, 7, + 254, 189, 29, 7, 254, 188, 29, 7, 254, 187, 29, 7, 254, 186, 29, 7, 254, + 185, 29, 7, 254, 184, 29, 7, 254, 183, 29, 7, 254, 182, 29, 7, 254, 181, + 29, 7, 254, 180, 29, 7, 254, 179, 29, 7, 254, 178, 29, 7, 254, 177, 29, + 7, 254, 176, 29, 7, 254, 175, 29, 7, 254, 174, 29, 7, 254, 173, 29, 7, + 254, 172, 29, 7, 254, 171, 29, 7, 254, 170, 29, 7, 254, 169, 29, 7, 254, + 168, 29, 7, 254, 167, 29, 7, 254, 166, 29, 7, 254, 165, 29, 7, 254, 164, + 29, 7, 254, 163, 29, 7, 254, 162, 29, 7, 254, 161, 29, 7, 254, 159, 29, + 7, 254, 158, 29, 7, 254, 157, 29, 7, 254, 156, 29, 7, 254, 155, 29, 7, + 254, 154, 29, 7, 254, 153, 29, 7, 254, 152, 29, 7, 254, 151, 29, 7, 254, + 150, 29, 7, 254, 149, 29, 7, 254, 148, 29, 7, 254, 147, 29, 7, 254, 146, + 29, 7, 254, 145, 29, 7, 254, 144, 29, 7, 254, 143, 29, 7, 254, 142, 29, + 7, 254, 141, 29, 7, 254, 140, 29, 7, 254, 139, 29, 7, 254, 138, 29, 7, + 254, 137, 29, 7, 254, 136, 29, 7, 254, 135, 29, 7, 254, 134, 29, 7, 254, + 133, 29, 7, 254, 132, 29, 7, 254, 131, 29, 7, 254, 130, 29, 7, 254, 129, + 29, 7, 254, 128, 29, 7, 254, 127, 29, 7, 254, 126, 29, 7, 254, 124, 29, + 7, 254, 123, 29, 7, 254, 122, 29, 7, 254, 121, 29, 7, 254, 120, 29, 7, + 254, 119, 29, 7, 254, 118, 29, 7, 254, 117, 29, 7, 254, 116, 29, 7, 254, + 115, 29, 7, 254, 114, 29, 7, 254, 113, 29, 7, 254, 111, 29, 7, 254, 110, + 29, 7, 254, 109, 29, 7, 254, 108, 29, 7, 254, 107, 29, 7, 254, 106, 29, + 7, 254, 105, 29, 7, 254, 104, 29, 7, 254, 103, 29, 7, 254, 102, 29, 7, + 254, 101, 29, 7, 254, 100, 29, 7, 254, 99, 29, 7, 254, 98, 29, 7, 254, + 97, 29, 7, 254, 96, 29, 7, 254, 95, 29, 7, 254, 94, 29, 7, 254, 93, 29, + 7, 254, 92, 29, 7, 254, 91, 29, 7, 254, 90, 29, 7, 254, 89, 29, 7, 254, + 88, 29, 7, 254, 87, 29, 7, 254, 86, 29, 7, 254, 85, 29, 7, 254, 84, 29, + 7, 254, 83, 29, 7, 254, 82, 29, 7, 254, 81, 29, 7, 254, 80, 29, 7, 254, + 79, 29, 7, 254, 78, 29, 7, 254, 77, 29, 7, 254, 76, 29, 7, 254, 75, 29, + 7, 254, 74, 29, 7, 254, 73, 29, 7, 254, 72, 29, 7, 254, 71, 29, 7, 254, + 70, 29, 7, 254, 69, 29, 7, 254, 68, 29, 7, 254, 67, 29, 7, 254, 66, 29, + 7, 254, 65, 29, 7, 254, 64, 29, 7, 254, 63, 29, 7, 254, 62, 29, 7, 254, + 61, 29, 7, 254, 60, 29, 7, 254, 59, 29, 7, 254, 58, 29, 7, 254, 57, 29, + 7, 254, 56, 29, 7, 254, 55, 29, 7, 254, 54, 29, 7, 254, 53, 29, 7, 254, + 52, 29, 7, 254, 51, 29, 7, 254, 50, 29, 7, 254, 49, 29, 7, 254, 48, 29, + 7, 254, 47, 29, 7, 254, 46, 29, 7, 254, 45, 29, 7, 254, 44, 29, 7, 254, + 43, 29, 7, 254, 41, 29, 7, 254, 40, 29, 7, 254, 39, 29, 7, 254, 38, 29, + 7, 254, 37, 29, 7, 254, 36, 29, 7, 254, 35, 29, 7, 254, 34, 29, 7, 254, + 33, 29, 7, 254, 32, 29, 7, 254, 31, 29, 7, 254, 30, 29, 7, 254, 29, 29, + 7, 254, 28, 29, 7, 254, 27, 29, 7, 254, 26, 29, 7, 254, 25, 29, 7, 254, + 24, 29, 7, 254, 23, 29, 7, 254, 22, 29, 7, 254, 21, 29, 7, 254, 20, 29, + 7, 254, 19, 29, 7, 254, 18, 29, 7, 254, 17, 29, 7, 254, 16, 29, 7, 254, + 15, 29, 7, 254, 14, 29, 7, 254, 13, 29, 7, 254, 12, 29, 7, 254, 11, 29, + 7, 254, 10, 29, 7, 254, 9, 29, 7, 254, 8, 29, 7, 254, 7, 29, 7, 254, 6, + 29, 7, 254, 5, 29, 7, 254, 4, 29, 7, 254, 3, 29, 7, 254, 2, 29, 7, 254, + 1, 29, 7, 254, 0, 29, 7, 253, 255, 29, 7, 253, 254, 29, 7, 253, 253, 29, + 7, 253, 252, 29, 7, 253, 251, 29, 7, 253, 250, 29, 7, 253, 249, 29, 7, + 253, 248, 29, 7, 253, 247, 29, 7, 253, 246, 29, 7, 253, 245, 29, 7, 253, + 244, 29, 7, 253, 243, 29, 7, 253, 242, 29, 7, 253, 241, 29, 7, 253, 240, + 29, 7, 253, 239, 29, 7, 253, 238, 29, 7, 253, 237, 29, 7, 253, 236, 29, + 7, 253, 235, 29, 7, 253, 234, 29, 7, 253, 233, 29, 7, 253, 232, 29, 7, + 253, 231, 29, 7, 253, 230, 29, 7, 253, 229, 29, 7, 253, 228, 29, 7, 253, + 227, 29, 7, 253, 226, 29, 7, 253, 225, 29, 7, 253, 224, 29, 7, 253, 223, + 29, 7, 253, 222, 29, 7, 253, 221, 29, 7, 253, 220, 29, 7, 253, 219, 29, + 7, 253, 218, 29, 7, 253, 217, 29, 7, 253, 216, 29, 7, 253, 215, 29, 7, + 253, 214, 29, 7, 253, 213, 29, 7, 253, 212, 29, 7, 253, 211, 29, 7, 253, + 210, 29, 7, 253, 209, 29, 7, 253, 208, 29, 7, 253, 207, 29, 7, 253, 206, + 29, 7, 253, 205, 29, 7, 253, 204, 29, 7, 253, 203, 29, 7, 253, 202, 29, + 7, 253, 201, 29, 7, 253, 200, 29, 7, 253, 199, 29, 7, 253, 198, 29, 7, + 253, 197, 29, 7, 253, 196, 29, 7, 253, 195, 29, 7, 253, 194, 29, 7, 253, + 193, 29, 7, 253, 192, 29, 7, 253, 191, 29, 7, 253, 190, 29, 7, 253, 189, + 29, 7, 253, 188, 29, 7, 253, 187, 29, 7, 253, 185, 29, 7, 253, 184, 29, + 7, 253, 183, 29, 7, 253, 182, 29, 7, 253, 181, 29, 7, 253, 180, 29, 7, + 253, 179, 29, 7, 253, 178, 29, 7, 253, 177, 29, 7, 253, 176, 29, 7, 253, + 175, 29, 7, 253, 172, 29, 7, 253, 171, 29, 7, 253, 170, 29, 7, 253, 169, + 29, 7, 253, 165, 29, 7, 253, 164, 29, 7, 253, 163, 29, 7, 253, 162, 29, + 7, 253, 161, 29, 7, 253, 160, 29, 7, 253, 159, 29, 7, 253, 158, 29, 7, + 253, 157, 29, 7, 253, 156, 29, 7, 253, 155, 29, 7, 253, 154, 29, 7, 253, + 153, 29, 7, 253, 152, 29, 7, 253, 151, 29, 7, 253, 150, 29, 7, 253, 149, + 29, 7, 253, 148, 29, 7, 253, 147, 29, 7, 253, 145, 29, 7, 253, 144, 29, + 7, 253, 143, 29, 7, 253, 142, 29, 7, 253, 141, 29, 7, 253, 140, 29, 7, + 253, 139, 29, 7, 253, 138, 29, 7, 253, 137, 29, 7, 253, 136, 29, 7, 253, + 135, 29, 7, 253, 134, 29, 7, 253, 133, 29, 7, 253, 132, 29, 7, 253, 131, + 29, 7, 253, 130, 29, 7, 253, 129, 29, 7, 253, 128, 29, 7, 253, 127, 29, + 7, 253, 126, 29, 7, 253, 125, 29, 7, 253, 124, 29, 7, 253, 123, 29, 7, + 253, 122, 29, 7, 253, 121, 29, 7, 253, 120, 29, 7, 253, 119, 29, 7, 253, + 118, 29, 7, 253, 117, 29, 7, 253, 116, 29, 7, 253, 115, 29, 7, 253, 114, + 29, 7, 253, 113, 29, 7, 253, 112, 29, 7, 253, 111, 29, 7, 253, 110, 29, + 7, 253, 109, 29, 7, 253, 108, 29, 7, 253, 107, 29, 7, 253, 106, 29, 7, + 253, 105, 29, 7, 253, 104, 29, 7, 253, 103, 29, 7, 253, 102, 29, 7, 253, + 101, 29, 7, 253, 100, 29, 7, 253, 99, 29, 7, 253, 98, 29, 7, 253, 97, 29, + 7, 253, 96, 29, 7, 253, 95, 29, 7, 253, 94, 29, 7, 253, 93, 29, 7, 253, + 92, 29, 7, 253, 91, 29, 7, 253, 90, 29, 7, 253, 89, 29, 7, 253, 88, 29, + 7, 253, 87, 29, 7, 253, 86, 29, 7, 253, 85, 29, 7, 253, 84, 208, 76, 211, + 164, 207, 151, 29, 7, 253, 83, 29, 7, 253, 82, 29, 7, 253, 81, 29, 7, + 253, 80, 29, 7, 253, 79, 29, 7, 253, 78, 29, 7, 253, 77, 29, 7, 253, 76, + 29, 7, 253, 75, 29, 7, 253, 74, 29, 7, 253, 73, 29, 7, 253, 72, 174, 29, + 7, 253, 71, 29, 7, 253, 70, 29, 7, 253, 69, 29, 7, 253, 68, 29, 7, 253, + 67, 29, 7, 253, 66, 29, 7, 253, 65, 29, 7, 253, 63, 29, 7, 253, 61, 29, + 7, 253, 59, 29, 7, 253, 57, 29, 7, 253, 55, 29, 7, 253, 53, 29, 7, 253, + 51, 29, 7, 253, 49, 29, 7, 253, 47, 29, 7, 253, 45, 248, 100, 219, 92, + 77, 29, 7, 253, 43, 234, 80, 219, 92, 77, 29, 7, 253, 42, 29, 7, 253, 40, + 29, 7, 253, 38, 29, 7, 253, 36, 29, 7, 253, 34, 29, 7, 253, 32, 29, 7, + 253, 30, 29, 7, 253, 28, 29, 7, 253, 26, 29, 7, 253, 25, 29, 7, 253, 24, + 29, 7, 253, 23, 29, 7, 253, 22, 29, 7, 253, 21, 29, 7, 253, 20, 29, 7, + 253, 19, 29, 7, 253, 18, 29, 7, 253, 17, 29, 7, 253, 16, 29, 7, 253, 15, + 29, 7, 253, 14, 29, 7, 253, 13, 29, 7, 253, 12, 29, 7, 253, 11, 29, 7, + 253, 10, 29, 7, 253, 9, 29, 7, 253, 8, 29, 7, 253, 7, 29, 7, 253, 6, 29, + 7, 253, 5, 29, 7, 253, 4, 29, 7, 253, 3, 29, 7, 253, 2, 29, 7, 253, 1, + 29, 7, 253, 0, 29, 7, 252, 255, 29, 7, 252, 254, 29, 7, 252, 253, 29, 7, + 252, 252, 29, 7, 252, 251, 29, 7, 252, 250, 29, 7, 252, 249, 29, 7, 252, + 248, 29, 7, 252, 247, 29, 7, 252, 246, 29, 7, 252, 245, 29, 7, 252, 244, + 29, 7, 252, 243, 29, 7, 252, 242, 29, 7, 252, 241, 29, 7, 252, 240, 29, + 7, 252, 239, 29, 7, 252, 238, 29, 7, 252, 237, 29, 7, 252, 236, 29, 7, + 252, 235, 29, 7, 252, 234, 29, 7, 252, 233, 29, 7, 252, 232, 29, 7, 252, + 231, 29, 7, 252, 230, 29, 7, 252, 229, 29, 7, 252, 228, 29, 7, 252, 227, + 29, 7, 252, 226, 29, 7, 252, 225, 29, 7, 252, 224, 29, 7, 252, 223, 29, + 7, 252, 222, 29, 7, 252, 221, 29, 7, 252, 220, 29, 7, 252, 219, 29, 7, + 252, 218, 29, 7, 252, 217, 29, 7, 252, 216, 29, 7, 252, 215, 29, 7, 252, + 214, 29, 7, 252, 213, 29, 7, 252, 212, 29, 7, 252, 211, 29, 7, 252, 210, + 29, 7, 252, 209, 29, 7, 252, 208, 29, 7, 252, 207, 29, 7, 252, 206, 29, + 7, 252, 205, 29, 7, 252, 204, 29, 7, 252, 203, 29, 7, 252, 202, 29, 7, + 252, 201, 29, 7, 252, 200, 29, 7, 252, 199, 29, 7, 252, 198, 29, 7, 252, + 197, 29, 7, 252, 196, 29, 7, 252, 195, 29, 7, 252, 194, 29, 7, 252, 193, + 29, 7, 252, 192, 29, 7, 252, 191, 29, 7, 252, 190, 29, 7, 252, 189, 29, + 7, 252, 188, 29, 7, 252, 187, 29, 7, 252, 186, 29, 7, 252, 185, 29, 7, + 252, 184, 29, 7, 252, 183, 29, 7, 252, 182, 29, 7, 252, 181, 29, 7, 252, + 180, 29, 7, 252, 179, 29, 7, 252, 178, 29, 7, 252, 177, 29, 7, 252, 176, + 29, 7, 252, 175, 29, 7, 252, 174, 29, 7, 252, 173, 29, 7, 252, 172, 25, + 1, 210, 84, 214, 98, 216, 217, 25, 1, 210, 84, 231, 166, 232, 156, 25, 1, + 210, 84, 209, 175, 216, 218, 209, 251, 25, 1, 210, 84, 209, 175, 216, + 218, 209, 252, 25, 1, 210, 84, 215, 85, 216, 217, 25, 1, 210, 84, 203, + 159, 25, 1, 210, 84, 199, 62, 216, 217, 25, 1, 210, 84, 212, 147, 216, + 217, 25, 1, 210, 84, 203, 223, 211, 78, 213, 240, 25, 1, 210, 84, 209, + 175, 211, 78, 213, 241, 209, 251, 25, 1, 210, 84, 209, 175, 211, 78, 213, + 241, 209, 252, 25, 1, 210, 84, 217, 199, 25, 1, 210, 84, 198, 46, 217, + 200, 25, 1, 210, 84, 214, 159, 25, 1, 210, 84, 217, 196, 25, 1, 210, 84, + 217, 147, 25, 1, 210, 84, 215, 174, 25, 1, 210, 84, 204, 148, 25, 1, 210, + 84, 213, 31, 25, 1, 210, 84, 222, 13, 25, 1, 210, 84, 213, 207, 25, 1, + 210, 84, 201, 86, 25, 1, 210, 84, 214, 97, 25, 1, 210, 84, 220, 75, 25, + 1, 210, 84, 219, 237, 220, 247, 25, 1, 210, 84, 213, 41, 216, 225, 25, 1, + 210, 84, 217, 203, 25, 1, 210, 84, 210, 215, 25, 1, 210, 84, 231, 65, 25, + 1, 210, 84, 211, 29, 25, 1, 210, 84, 216, 56, 214, 132, 25, 1, 210, 84, + 212, 128, 216, 228, 25, 1, 210, 84, 124, 192, 184, 215, 78, 25, 1, 210, + 84, 231, 66, 25, 1, 210, 84, 213, 41, 213, 42, 25, 1, 210, 84, 203, 44, + 25, 1, 210, 84, 216, 210, 25, 1, 210, 84, 216, 231, 25, 1, 210, 84, 216, + 31, 25, 1, 210, 84, 222, 138, 25, 1, 210, 84, 211, 78, 220, 29, 25, 1, + 210, 84, 215, 0, 220, 29, 25, 1, 210, 84, 210, 106, 25, 1, 210, 84, 217, + 197, 25, 1, 210, 84, 214, 26, 25, 1, 210, 84, 209, 30, 25, 1, 210, 84, + 198, 38, 25, 1, 210, 84, 219, 32, 25, 1, 210, 84, 202, 184, 25, 1, 210, + 84, 199, 249, 25, 1, 210, 84, 217, 194, 25, 1, 210, 84, 222, 20, 25, 1, + 210, 84, 214, 252, 25, 1, 210, 84, 221, 5, 25, 1, 210, 84, 216, 32, 25, + 1, 210, 84, 203, 155, 25, 1, 210, 84, 219, 85, 25, 1, 210, 84, 232, 227, + 25, 1, 210, 84, 207, 31, 25, 1, 210, 84, 221, 58, 25, 1, 210, 84, 202, + 180, 25, 1, 210, 84, 217, 142, 210, 40, 25, 1, 210, 84, 203, 216, 25, 1, + 210, 84, 213, 40, 25, 1, 210, 84, 203, 197, 213, 52, 192, 192, 25, 1, + 210, 84, 212, 169, 216, 52, 25, 1, 210, 84, 211, 73, 25, 1, 210, 84, 213, + 209, 25, 1, 210, 84, 197, 49, 25, 1, 210, 84, 214, 135, 25, 1, 210, 84, + 217, 193, 25, 1, 210, 84, 213, 252, 25, 1, 210, 84, 217, 77, 25, 1, 210, + 84, 212, 184, 25, 1, 210, 84, 199, 253, 25, 1, 210, 84, 202, 177, 25, 1, + 210, 84, 211, 74, 25, 1, 210, 84, 213, 56, 25, 1, 210, 84, 217, 201, 25, + 1, 210, 84, 212, 181, 25, 1, 210, 84, 222, 100, 25, 1, 210, 84, 213, 59, + 25, 1, 210, 84, 196, 118, 25, 1, 210, 84, 219, 36, 25, 1, 210, 84, 214, + 196, 25, 1, 210, 84, 215, 52, 25, 1, 210, 84, 217, 76, 25, 1, 210, 83, + 213, 54, 25, 1, 210, 83, 198, 46, 217, 198, 25, 1, 210, 83, 203, 107, 25, + 1, 210, 83, 204, 152, 198, 45, 25, 1, 210, 83, 219, 87, 213, 37, 25, 1, + 210, 83, 217, 83, 217, 202, 25, 1, 210, 83, 221, 188, 25, 1, 210, 83, + 193, 32, 25, 1, 210, 83, 217, 78, 25, 1, 210, 83, 222, 124, 25, 1, 210, + 83, 210, 164, 25, 1, 210, 83, 193, 115, 220, 29, 25, 1, 210, 83, 220, 95, + 213, 52, 212, 195, 25, 1, 210, 83, 213, 34, 203, 242, 25, 1, 210, 83, + 214, 223, 213, 255, 25, 1, 210, 83, 231, 63, 25, 1, 210, 83, 209, 241, + 25, 1, 210, 83, 198, 46, 213, 50, 25, 1, 210, 83, 203, 247, 213, 250, 25, + 1, 210, 83, 203, 243, 25, 1, 210, 83, 216, 218, 199, 252, 25, 1, 210, 83, + 217, 65, 217, 79, 25, 1, 210, 83, 212, 182, 213, 37, 25, 1, 210, 83, 222, + 9, 25, 1, 210, 83, 231, 64, 25, 1, 210, 83, 222, 5, 25, 1, 210, 83, 220, + 179, 25, 1, 210, 83, 210, 218, 25, 1, 210, 83, 196, 47, 25, 1, 210, 83, + 214, 99, 215, 172, 25, 1, 210, 83, 214, 134, 217, 61, 25, 1, 210, 83, + 193, 242, 25, 1, 210, 83, 206, 69, 25, 1, 210, 83, 200, 170, 25, 1, 210, + 83, 216, 230, 25, 1, 210, 83, 214, 118, 25, 1, 210, 83, 214, 119, 220, + 72, 25, 1, 210, 83, 216, 220, 25, 1, 210, 83, 201, 139, 25, 1, 210, 83, + 217, 69, 25, 1, 210, 83, 216, 36, 25, 1, 210, 83, 212, 199, 25, 1, 210, + 83, 209, 34, 25, 1, 210, 83, 216, 229, 214, 136, 25, 1, 210, 83, 233, 16, + 25, 1, 210, 83, 217, 56, 25, 1, 210, 83, 233, 40, 25, 1, 210, 83, 222, + 17, 25, 1, 210, 83, 217, 228, 213, 244, 25, 1, 210, 83, 217, 228, 213, + 220, 25, 1, 210, 83, 219, 236, 25, 1, 210, 83, 214, 142, 25, 1, 210, 83, + 213, 61, 25, 1, 210, 83, 172, 25, 1, 210, 83, 221, 171, 25, 1, 210, 83, + 214, 87, 25, 1, 210, 82, 214, 98, 217, 200, 25, 1, 210, 82, 212, 146, 25, + 1, 210, 82, 192, 192, 25, 1, 210, 82, 194, 145, 25, 1, 210, 82, 214, 135, + 25, 1, 210, 82, 214, 244, 25, 1, 210, 82, 214, 105, 25, 1, 210, 82, 231, + 73, 25, 1, 210, 82, 217, 73, 25, 1, 210, 82, 231, 173, 25, 1, 210, 82, + 212, 171, 216, 100, 216, 232, 25, 1, 210, 82, 213, 28, 217, 64, 25, 1, + 210, 82, 217, 70, 25, 1, 210, 82, 209, 247, 25, 1, 210, 82, 214, 229, 25, + 1, 210, 82, 217, 81, 247, 15, 25, 1, 210, 82, 222, 7, 25, 1, 210, 82, + 231, 74, 25, 1, 210, 82, 222, 14, 25, 1, 210, 82, 192, 215, 215, 205, 25, + 1, 210, 82, 212, 140, 25, 1, 210, 82, 217, 58, 25, 1, 210, 82, 213, 60, + 25, 1, 210, 82, 217, 64, 25, 1, 210, 82, 193, 33, 25, 1, 210, 82, 221, + 66, 25, 1, 210, 82, 222, 159, 25, 1, 210, 82, 204, 147, 25, 1, 210, 82, + 214, 238, 25, 1, 210, 82, 200, 168, 25, 1, 210, 82, 213, 224, 25, 1, 210, + 82, 199, 62, 192, 196, 25, 1, 210, 82, 201, 171, 25, 1, 210, 82, 214, + 125, 212, 195, 25, 1, 210, 82, 196, 46, 25, 1, 210, 82, 215, 55, 25, 1, + 210, 82, 217, 228, 222, 16, 25, 1, 210, 82, 213, 42, 25, 1, 210, 82, 214, + 120, 25, 1, 210, 82, 220, 76, 25, 1, 210, 82, 217, 66, 25, 1, 210, 82, + 216, 209, 25, 1, 210, 82, 213, 36, 25, 1, 210, 82, 199, 248, 25, 1, 210, + 82, 214, 122, 25, 1, 210, 82, 232, 75, 25, 1, 210, 82, 214, 243, 25, 1, + 210, 82, 213, 62, 25, 1, 210, 82, 213, 58, 25, 1, 210, 82, 247, 98, 25, + 1, 210, 82, 196, 48, 25, 1, 210, 82, 217, 71, 25, 1, 210, 82, 206, 218, + 25, 1, 210, 82, 213, 254, 25, 1, 210, 82, 220, 94, 25, 1, 210, 82, 199, + 59, 25, 1, 210, 82, 213, 44, 214, 87, 25, 1, 210, 82, 213, 246, 25, 1, + 210, 82, 222, 20, 25, 1, 210, 82, 214, 127, 25, 1, 210, 82, 217, 193, 25, + 1, 210, 82, 217, 59, 25, 1, 210, 82, 219, 36, 25, 1, 210, 82, 220, 247, + 25, 1, 210, 82, 213, 252, 25, 1, 210, 82, 214, 87, 25, 1, 210, 82, 193, + 232, 25, 1, 210, 82, 214, 123, 25, 1, 210, 82, 213, 47, 25, 1, 210, 82, + 213, 38, 25, 1, 210, 82, 221, 7, 213, 209, 25, 1, 210, 82, 213, 45, 25, + 1, 210, 82, 214, 251, 25, 1, 210, 82, 217, 228, 213, 50, 25, 1, 210, 82, + 193, 129, 25, 1, 210, 82, 214, 250, 25, 1, 210, 82, 203, 158, 25, 1, 210, + 82, 204, 150, 25, 1, 210, 82, 217, 67, 25, 1, 210, 82, 217, 200, 25, 1, + 210, 82, 217, 77, 25, 1, 210, 82, 222, 8, 25, 1, 210, 82, 217, 68, 25, 1, + 210, 82, 222, 12, 25, 1, 210, 82, 217, 81, 210, 46, 25, 1, 210, 82, 192, + 175, 25, 1, 210, 82, 213, 242, 25, 1, 210, 82, 216, 156, 25, 1, 210, 82, + 215, 235, 25, 1, 210, 82, 203, 219, 25, 1, 210, 82, 222, 31, 220, 54, 25, + 1, 210, 82, 222, 31, 233, 53, 25, 1, 210, 82, 214, 157, 25, 1, 210, 82, + 215, 52, 25, 1, 210, 82, 219, 157, 25, 1, 210, 82, 210, 6, 25, 1, 210, + 82, 210, 154, 25, 1, 210, 82, 200, 8, 25, 1, 154, 217, 57, 25, 1, 154, + 194, 143, 25, 1, 154, 213, 240, 25, 1, 154, 216, 217, 25, 1, 154, 213, + 238, 25, 1, 154, 219, 202, 25, 1, 154, 213, 243, 25, 1, 154, 213, 57, 25, + 1, 154, 214, 141, 25, 1, 154, 212, 195, 25, 1, 154, 193, 243, 25, 1, 154, + 214, 95, 25, 1, 154, 204, 10, 25, 1, 154, 214, 106, 25, 1, 154, 222, 15, + 25, 1, 154, 199, 250, 25, 1, 154, 203, 245, 25, 1, 154, 213, 251, 25, 1, + 154, 201, 139, 25, 1, 154, 222, 20, 25, 1, 154, 193, 117, 25, 1, 154, + 221, 8, 25, 1, 154, 206, 28, 25, 1, 154, 216, 222, 25, 1, 154, 214, 242, + 25, 1, 154, 217, 164, 25, 1, 154, 216, 228, 25, 1, 154, 204, 149, 25, 1, + 154, 193, 59, 25, 1, 154, 213, 245, 25, 1, 154, 222, 11, 217, 60, 25, 1, + 154, 214, 102, 25, 1, 154, 198, 45, 25, 1, 154, 231, 83, 25, 1, 154, 214, + 92, 25, 1, 154, 233, 17, 25, 1, 154, 214, 246, 25, 1, 154, 216, 201, 25, + 1, 154, 219, 230, 25, 1, 154, 214, 228, 25, 1, 154, 216, 51, 25, 1, 154, + 216, 205, 25, 1, 154, 209, 14, 25, 1, 154, 216, 203, 25, 1, 154, 216, + 219, 25, 1, 154, 219, 19, 25, 1, 154, 213, 49, 25, 1, 154, 217, 80, 25, + 1, 154, 220, 236, 25, 1, 154, 212, 184, 25, 1, 154, 199, 253, 25, 1, 154, + 202, 177, 25, 1, 154, 192, 175, 25, 1, 154, 222, 12, 25, 1, 154, 208, 52, + 25, 1, 154, 200, 55, 25, 1, 154, 214, 103, 25, 1, 154, 216, 224, 25, 1, + 154, 213, 48, 25, 1, 154, 222, 10, 25, 1, 154, 209, 253, 25, 1, 154, 210, + 99, 25, 1, 154, 212, 157, 25, 1, 154, 219, 236, 25, 1, 154, 214, 142, 25, + 1, 154, 216, 221, 25, 1, 154, 214, 115, 25, 1, 154, 192, 189, 25, 1, 154, + 210, 253, 25, 1, 154, 192, 188, 25, 1, 154, 214, 251, 25, 1, 154, 213, + 37, 25, 1, 154, 201, 173, 25, 1, 154, 221, 12, 25, 1, 154, 214, 131, 25, + 1, 154, 214, 100, 25, 1, 154, 198, 20, 25, 1, 154, 216, 232, 25, 1, 154, + 221, 2, 25, 1, 154, 213, 46, 25, 1, 154, 199, 251, 25, 1, 154, 217, 195, + 25, 1, 154, 214, 140, 25, 1, 154, 219, 229, 25, 1, 154, 214, 121, 25, 1, + 154, 213, 51, 25, 1, 154, 213, 224, 25, 1, 154, 231, 67, 25, 1, 154, 221, + 33, 25, 1, 154, 207, 206, 211, 225, 25, 1, 154, 200, 157, 25, 1, 154, + 198, 245, 25, 1, 154, 212, 181, 25, 1, 154, 207, 88, 25, 1, 154, 220, 31, + 25, 1, 154, 217, 28, 25, 1, 154, 218, 236, 25, 1, 154, 201, 86, 25, 1, + 154, 215, 241, 25, 1, 154, 203, 231, 25, 1, 154, 203, 241, 25, 1, 154, + 220, 208, 25, 1, 154, 213, 22, 25, 1, 154, 203, 164, 25, 1, 154, 213, 39, + 25, 1, 154, 210, 168, 25, 1, 154, 214, 60, 25, 1, 154, 203, 196, 25, 1, + 154, 209, 29, 25, 1, 154, 215, 172, 25, 1, 154, 219, 65, 25, 1, 154, 207, + 206, 215, 230, 25, 1, 154, 199, 128, 25, 1, 154, 213, 25, 25, 1, 154, + 217, 81, 179, 25, 1, 154, 206, 26, 25, 1, 154, 233, 96, 25, 1, 110, 214, + 250, 25, 1, 110, 198, 252, 25, 1, 110, 217, 70, 25, 1, 110, 220, 76, 25, + 1, 110, 195, 238, 25, 1, 110, 219, 71, 25, 1, 110, 211, 77, 25, 1, 110, + 202, 188, 25, 1, 110, 208, 26, 25, 1, 110, 213, 53, 25, 1, 110, 214, 221, + 25, 1, 110, 209, 47, 25, 1, 110, 200, 129, 25, 1, 110, 214, 108, 25, 1, + 110, 221, 62, 25, 1, 110, 193, 235, 25, 1, 110, 205, 205, 25, 1, 110, + 214, 132, 25, 1, 110, 211, 74, 25, 1, 110, 198, 254, 25, 1, 110, 221, 6, + 25, 1, 110, 219, 86, 25, 1, 110, 213, 56, 25, 1, 110, 214, 84, 25, 1, + 110, 217, 201, 25, 1, 110, 214, 101, 25, 1, 110, 214, 83, 25, 1, 110, + 213, 55, 25, 1, 110, 207, 85, 25, 1, 110, 213, 242, 25, 1, 110, 210, 166, + 25, 1, 110, 206, 91, 25, 1, 110, 214, 116, 25, 1, 110, 216, 211, 25, 1, + 110, 231, 61, 25, 1, 110, 214, 104, 25, 1, 110, 213, 253, 25, 1, 110, + 217, 141, 25, 1, 110, 219, 67, 25, 1, 110, 214, 137, 25, 1, 110, 214, + 234, 25, 1, 110, 200, 156, 213, 37, 25, 1, 110, 204, 151, 25, 1, 110, + 209, 40, 25, 1, 110, 214, 254, 202, 196, 25, 1, 110, 214, 124, 212, 195, + 25, 1, 110, 193, 18, 25, 1, 110, 231, 62, 25, 1, 110, 198, 39, 25, 1, + 110, 193, 36, 25, 1, 110, 209, 198, 25, 1, 110, 198, 26, 25, 1, 110, 222, + 18, 25, 1, 110, 201, 172, 25, 1, 110, 199, 252, 25, 1, 110, 196, 49, 25, + 1, 110, 194, 86, 25, 1, 110, 220, 182, 25, 1, 110, 209, 51, 25, 1, 110, + 200, 169, 25, 1, 110, 231, 82, 25, 1, 110, 214, 147, 25, 1, 110, 203, + 244, 25, 1, 110, 216, 206, 25, 1, 110, 217, 74, 25, 1, 110, 212, 144, 25, + 1, 110, 213, 205, 25, 1, 110, 231, 169, 25, 1, 110, 198, 27, 25, 1, 110, + 221, 16, 25, 1, 110, 193, 93, 25, 1, 110, 212, 182, 242, 101, 25, 1, 110, + 193, 7, 25, 1, 110, 216, 223, 25, 1, 110, 214, 239, 25, 1, 110, 210, 41, + 25, 1, 110, 192, 195, 25, 1, 110, 219, 231, 25, 1, 110, 232, 75, 25, 1, + 110, 231, 168, 25, 1, 110, 214, 94, 25, 1, 110, 222, 20, 25, 1, 110, 217, + 204, 25, 1, 110, 214, 107, 25, 1, 110, 231, 68, 25, 1, 110, 233, 97, 25, + 1, 110, 213, 26, 25, 1, 110, 210, 100, 25, 1, 110, 193, 34, 25, 1, 110, + 214, 133, 25, 1, 110, 212, 182, 248, 60, 25, 1, 110, 212, 124, 25, 1, + 110, 209, 170, 25, 1, 110, 216, 156, 25, 1, 110, 232, 73, 25, 1, 110, + 215, 78, 25, 1, 110, 215, 235, 25, 1, 110, 231, 67, 25, 1, 110, 232, 78, + 70, 25, 1, 110, 215, 173, 25, 1, 110, 209, 46, 25, 1, 110, 214, 96, 25, + 1, 110, 220, 247, 25, 1, 110, 210, 38, 25, 1, 110, 213, 40, 25, 1, 110, + 193, 35, 25, 1, 110, 214, 117, 25, 1, 110, 211, 78, 210, 139, 25, 1, 110, + 232, 78, 246, 253, 25, 1, 110, 232, 157, 25, 1, 110, 213, 247, 25, 1, + 110, 64, 25, 1, 110, 198, 245, 25, 1, 110, 74, 25, 1, 110, 70, 25, 1, + 110, 220, 74, 25, 1, 110, 211, 78, 209, 207, 25, 1, 110, 200, 174, 25, 1, + 110, 200, 113, 25, 1, 110, 214, 254, 215, 160, 228, 193, 25, 1, 110, 203, + 219, 25, 1, 110, 193, 31, 25, 1, 110, 214, 77, 25, 1, 110, 192, 200, 25, + 1, 110, 192, 233, 201, 65, 25, 1, 110, 192, 233, 238, 208, 25, 1, 110, + 192, 183, 25, 1, 110, 192, 191, 25, 1, 110, 222, 6, 25, 1, 110, 210, 98, + 25, 1, 110, 213, 248, 234, 34, 25, 1, 110, 209, 42, 25, 1, 110, 193, 241, + 25, 1, 110, 233, 40, 25, 1, 110, 196, 118, 25, 1, 110, 219, 36, 25, 1, + 110, 216, 175, 25, 1, 110, 207, 170, 25, 1, 110, 208, 53, 25, 1, 110, + 214, 76, 25, 1, 110, 214, 165, 25, 1, 110, 203, 211, 25, 1, 110, 203, + 196, 25, 1, 110, 232, 78, 207, 209, 25, 1, 110, 181, 25, 1, 110, 210, 51, + 25, 1, 110, 219, 65, 25, 1, 110, 221, 113, 25, 1, 110, 217, 5, 25, 1, + 110, 172, 25, 1, 110, 217, 138, 25, 1, 110, 199, 254, 25, 1, 110, 221, + 204, 25, 1, 110, 216, 55, 25, 1, 110, 200, 30, 25, 1, 110, 233, 64, 25, + 1, 110, 231, 55, 25, 1, 210, 81, 160, 25, 1, 210, 81, 68, 25, 1, 210, 81, + 221, 33, 25, 1, 210, 81, 234, 171, 25, 1, 210, 81, 207, 234, 25, 1, 210, + 81, 200, 157, 25, 1, 210, 81, 212, 181, 25, 1, 210, 81, 177, 25, 1, 210, + 81, 207, 88, 25, 1, 210, 81, 207, 136, 25, 1, 210, 81, 217, 28, 25, 1, + 210, 81, 200, 174, 25, 1, 210, 81, 214, 253, 25, 1, 210, 81, 213, 254, + 25, 1, 210, 81, 218, 236, 25, 1, 210, 81, 201, 86, 25, 1, 210, 81, 203, + 231, 25, 1, 210, 81, 203, 125, 25, 1, 210, 81, 204, 147, 25, 1, 210, 81, + 220, 208, 25, 1, 210, 81, 222, 20, 25, 1, 210, 81, 212, 246, 25, 1, 210, + 81, 213, 22, 25, 1, 210, 81, 213, 225, 25, 1, 210, 81, 192, 232, 25, 1, + 210, 81, 203, 164, 25, 1, 210, 81, 168, 25, 1, 210, 81, 213, 59, 25, 1, + 210, 81, 210, 98, 25, 1, 210, 81, 213, 39, 25, 1, 210, 81, 193, 241, 25, + 1, 210, 81, 210, 168, 25, 1, 210, 81, 206, 218, 25, 1, 210, 81, 214, 60, + 25, 1, 210, 81, 207, 170, 25, 1, 210, 81, 222, 30, 25, 1, 210, 81, 214, + 93, 25, 1, 210, 81, 214, 144, 25, 1, 210, 81, 203, 211, 25, 1, 210, 81, + 209, 47, 25, 1, 210, 81, 232, 157, 25, 1, 210, 81, 194, 169, 25, 1, 210, + 81, 219, 209, 25, 1, 210, 81, 219, 65, 25, 1, 210, 81, 221, 113, 25, 1, + 210, 81, 217, 72, 25, 1, 210, 81, 207, 205, 25, 1, 210, 81, 172, 25, 1, + 210, 81, 216, 91, 25, 1, 210, 81, 217, 80, 25, 1, 210, 81, 200, 8, 25, 1, + 210, 81, 221, 69, 25, 1, 210, 81, 206, 48, 25, 1, 210, 81, 194, 222, 215, + 245, 1, 189, 215, 245, 1, 214, 113, 215, 245, 1, 193, 1, 215, 245, 1, + 216, 122, 215, 245, 1, 249, 3, 215, 245, 1, 238, 0, 215, 245, 1, 64, 215, + 245, 1, 210, 77, 215, 245, 1, 221, 244, 215, 245, 1, 230, 31, 215, 245, + 1, 237, 231, 215, 245, 1, 242, 168, 215, 245, 1, 222, 50, 215, 245, 1, + 211, 226, 215, 245, 1, 217, 201, 215, 245, 1, 214, 20, 215, 245, 1, 166, + 215, 245, 1, 211, 194, 215, 245, 1, 74, 215, 245, 1, 207, 55, 215, 245, + 1, 203, 236, 215, 245, 1, 199, 223, 215, 245, 1, 234, 199, 215, 245, 1, + 194, 169, 215, 245, 1, 71, 215, 245, 1, 221, 113, 215, 245, 1, 220, 83, + 215, 245, 1, 177, 215, 245, 1, 230, 88, 215, 245, 1, 207, 151, 215, 245, + 1, 200, 45, 215, 245, 17, 192, 76, 215, 245, 17, 101, 215, 245, 17, 104, + 215, 245, 17, 133, 215, 245, 17, 134, 215, 245, 17, 151, 215, 245, 17, + 170, 215, 245, 17, 179, 215, 245, 17, 174, 215, 245, 17, 182, 215, 245, + 237, 208, 215, 245, 55, 237, 208, 248, 173, 196, 154, 1, 234, 69, 248, + 173, 196, 154, 1, 160, 248, 173, 196, 154, 1, 205, 223, 248, 173, 196, + 154, 1, 233, 97, 248, 173, 196, 154, 1, 217, 75, 248, 173, 196, 154, 1, + 193, 19, 248, 173, 196, 154, 1, 231, 218, 248, 173, 196, 154, 1, 237, 21, + 248, 173, 196, 154, 1, 221, 68, 248, 173, 196, 154, 1, 222, 233, 248, + 173, 196, 154, 1, 228, 146, 248, 173, 196, 154, 1, 194, 169, 248, 173, + 196, 154, 1, 192, 8, 248, 173, 196, 154, 1, 231, 162, 248, 173, 196, 154, + 1, 236, 146, 248, 173, 196, 154, 1, 246, 158, 248, 173, 196, 154, 1, 196, + 244, 248, 173, 196, 154, 1, 155, 248, 173, 196, 154, 1, 249, 3, 248, 173, + 196, 154, 1, 194, 223, 248, 173, 196, 154, 1, 193, 63, 248, 173, 196, + 154, 1, 166, 248, 173, 196, 154, 1, 194, 161, 248, 173, 196, 154, 1, 64, + 248, 173, 196, 154, 1, 74, 248, 173, 196, 154, 1, 211, 194, 248, 173, + 196, 154, 1, 68, 248, 173, 196, 154, 1, 234, 171, 248, 173, 196, 154, 1, + 71, 248, 173, 196, 154, 1, 70, 248, 173, 196, 154, 38, 139, 199, 18, 248, + 173, 196, 154, 38, 132, 199, 18, 248, 173, 196, 154, 38, 216, 162, 199, + 18, 248, 173, 196, 154, 38, 219, 49, 199, 18, 248, 173, 196, 154, 38, + 229, 153, 199, 18, 248, 173, 196, 154, 232, 71, 201, 238, 141, 89, 18, + 222, 47, 141, 89, 18, 222, 43, 141, 89, 18, 221, 193, 141, 89, 18, 221, + 156, 141, 89, 18, 222, 75, 141, 89, 18, 222, 72, 141, 89, 18, 221, 17, + 141, 89, 18, 220, 244, 141, 89, 18, 222, 49, 141, 89, 18, 222, 4, 141, + 89, 18, 222, 134, 141, 89, 18, 222, 131, 141, 89, 18, 221, 87, 141, 89, + 18, 221, 84, 141, 89, 18, 222, 68, 141, 89, 18, 222, 66, 141, 89, 18, + 221, 19, 141, 89, 18, 221, 18, 141, 89, 18, 221, 106, 141, 89, 18, 221, + 73, 141, 89, 18, 221, 195, 141, 89, 18, 221, 194, 141, 89, 18, 222, 149, + 141, 89, 18, 222, 71, 141, 89, 18, 220, 234, 141, 89, 18, 220, 225, 141, + 89, 18, 222, 158, 141, 89, 18, 222, 150, 141, 89, 116, 196, 129, 141, 89, + 116, 213, 29, 141, 89, 116, 220, 60, 141, 89, 116, 230, 11, 141, 89, 116, + 213, 181, 141, 89, 116, 208, 17, 141, 89, 116, 213, 208, 141, 89, 116, + 208, 213, 141, 89, 116, 193, 80, 141, 89, 116, 229, 128, 141, 89, 116, + 217, 96, 141, 89, 116, 242, 249, 141, 89, 116, 215, 2, 141, 89, 116, 229, + 64, 141, 89, 116, 209, 216, 141, 89, 116, 213, 35, 141, 89, 116, 215, 42, + 141, 89, 116, 250, 8, 141, 89, 116, 193, 205, 141, 89, 116, 246, 191, + 141, 89, 122, 242, 137, 198, 36, 141, 89, 122, 242, 137, 202, 212, 141, + 89, 122, 242, 137, 222, 22, 141, 89, 122, 242, 137, 221, 235, 141, 89, + 122, 242, 137, 201, 170, 141, 89, 122, 242, 137, 229, 22, 141, 89, 122, + 242, 137, 200, 99, 141, 89, 3, 195, 233, 199, 173, 141, 89, 3, 195, 233, + 198, 107, 246, 149, 141, 89, 3, 242, 137, 242, 238, 141, 89, 3, 195, 233, + 199, 201, 141, 89, 3, 195, 233, 233, 37, 141, 89, 3, 193, 160, 213, 23, + 141, 89, 3, 193, 160, 207, 153, 141, 89, 3, 193, 160, 198, 228, 141, 89, + 3, 193, 160, 233, 78, 141, 89, 3, 195, 233, 205, 199, 141, 89, 3, 217, + 27, 201, 174, 141, 89, 3, 195, 233, 213, 75, 141, 89, 3, 228, 54, 193, + 100, 141, 89, 3, 193, 204, 141, 89, 3, 242, 137, 198, 94, 207, 37, 141, + 89, 17, 192, 76, 141, 89, 17, 101, 141, 89, 17, 104, 141, 89, 17, 133, + 141, 89, 17, 134, 141, 89, 17, 151, 141, 89, 17, 170, 141, 89, 17, 179, + 141, 89, 17, 174, 141, 89, 17, 182, 141, 89, 31, 200, 25, 141, 89, 31, + 228, 160, 141, 89, 31, 200, 31, 199, 163, 141, 89, 31, 216, 123, 141, 89, + 31, 228, 163, 216, 123, 141, 89, 31, 200, 31, 248, 22, 141, 89, 31, 198, + 172, 141, 89, 3, 195, 233, 219, 31, 141, 89, 3, 193, 157, 141, 89, 3, + 229, 123, 141, 89, 3, 199, 190, 229, 123, 141, 89, 3, 191, 237, 199, 234, + 141, 89, 3, 229, 48, 141, 89, 3, 213, 89, 141, 89, 3, 193, 195, 141, 89, + 3, 213, 27, 141, 89, 3, 249, 247, 141, 89, 3, 197, 214, 246, 148, 141, + 89, 3, 217, 27, 198, 110, 141, 89, 3, 200, 100, 141, 89, 3, 219, 62, 141, + 89, 3, 215, 191, 141, 89, 3, 242, 137, 230, 84, 219, 8, 213, 33, 213, 32, + 141, 89, 3, 242, 137, 238, 161, 198, 101, 141, 89, 3, 242, 137, 197, 212, + 141, 89, 3, 242, 137, 197, 213, 242, 156, 141, 89, 3, 242, 137, 209, 45, + 237, 176, 141, 89, 3, 242, 137, 213, 82, 198, 236, 141, 89, 242, 108, 3, + 198, 105, 141, 89, 242, 108, 3, 193, 65, 141, 89, 242, 108, 3, 219, 154, + 141, 89, 242, 108, 3, 220, 58, 141, 89, 242, 108, 3, 193, 156, 141, 89, + 242, 108, 3, 221, 88, 141, 89, 242, 108, 3, 230, 8, 141, 89, 242, 108, 3, + 215, 233, 141, 89, 242, 108, 3, 199, 174, 141, 89, 242, 108, 3, 198, 115, + 141, 89, 242, 108, 3, 210, 91, 141, 89, 242, 108, 3, 221, 248, 141, 89, + 242, 108, 3, 230, 72, 141, 89, 242, 108, 3, 196, 151, 141, 89, 242, 108, + 3, 233, 74, 141, 89, 242, 108, 3, 193, 107, 141, 89, 242, 108, 3, 198, + 88, 141, 89, 242, 108, 3, 220, 229, 141, 89, 242, 108, 3, 194, 211, 217, + 36, 6, 1, 218, 236, 217, 36, 6, 1, 206, 158, 217, 36, 6, 1, 196, 236, + 217, 36, 6, 1, 194, 202, 217, 36, 6, 1, 250, 20, 217, 36, 6, 1, 192, 155, + 217, 36, 6, 1, 221, 70, 217, 36, 6, 1, 211, 93, 217, 36, 6, 1, 200, 228, + 217, 36, 6, 1, 232, 44, 217, 36, 6, 1, 233, 163, 217, 36, 6, 1, 70, 217, + 36, 6, 1, 222, 184, 217, 36, 6, 1, 64, 217, 36, 6, 1, 223, 65, 217, 36, + 6, 1, 71, 217, 36, 6, 1, 249, 226, 217, 36, 6, 1, 247, 52, 217, 36, 6, 1, + 68, 217, 36, 6, 1, 192, 214, 217, 36, 6, 1, 165, 217, 36, 6, 1, 208, 247, + 217, 36, 6, 1, 228, 190, 217, 36, 6, 1, 212, 203, 217, 36, 6, 1, 193, + 223, 217, 36, 6, 1, 238, 95, 217, 36, 6, 1, 212, 0, 217, 36, 6, 1, 215, + 151, 217, 36, 6, 1, 150, 217, 36, 6, 1, 74, 217, 36, 6, 1, 251, 63, 217, + 36, 6, 1, 193, 148, 217, 36, 2, 1, 218, 236, 217, 36, 2, 1, 206, 158, + 217, 36, 2, 1, 196, 236, 217, 36, 2, 1, 194, 202, 217, 36, 2, 1, 250, 20, + 217, 36, 2, 1, 192, 155, 217, 36, 2, 1, 221, 70, 217, 36, 2, 1, 211, 93, + 217, 36, 2, 1, 200, 228, 217, 36, 2, 1, 232, 44, 217, 36, 2, 1, 233, 163, + 217, 36, 2, 1, 70, 217, 36, 2, 1, 222, 184, 217, 36, 2, 1, 64, 217, 36, + 2, 1, 223, 65, 217, 36, 2, 1, 71, 217, 36, 2, 1, 249, 226, 217, 36, 2, 1, + 247, 52, 217, 36, 2, 1, 68, 217, 36, 2, 1, 192, 214, 217, 36, 2, 1, 165, + 217, 36, 2, 1, 208, 247, 217, 36, 2, 1, 228, 190, 217, 36, 2, 1, 212, + 203, 217, 36, 2, 1, 193, 223, 217, 36, 2, 1, 238, 95, 217, 36, 2, 1, 212, + 0, 217, 36, 2, 1, 215, 151, 217, 36, 2, 1, 150, 217, 36, 2, 1, 74, 217, + 36, 2, 1, 251, 63, 217, 36, 2, 1, 193, 148, 217, 36, 17, 192, 76, 217, + 36, 17, 101, 217, 36, 17, 104, 217, 36, 17, 133, 217, 36, 17, 134, 217, + 36, 17, 151, 217, 36, 17, 170, 217, 36, 17, 179, 217, 36, 17, 174, 217, + 36, 17, 182, 217, 36, 31, 200, 30, 217, 36, 31, 234, 111, 217, 36, 31, + 197, 244, 217, 36, 31, 199, 186, 217, 36, 31, 232, 113, 217, 36, 31, 233, + 7, 217, 36, 31, 203, 35, 217, 36, 31, 204, 143, 217, 36, 31, 234, 145, + 217, 36, 31, 214, 13, 217, 36, 17, 90, 250, 249, 20, 217, 36, 17, 103, + 250, 249, 20, 217, 36, 17, 112, 250, 249, 20, 217, 36, 242, 38, 217, 36, + 232, 71, 201, 238, 217, 36, 16, 251, 48, 217, 36, 233, 204, 211, 241, + 117, 1, 166, 117, 1, 249, 3, 117, 1, 11, 166, 117, 1, 209, 234, 117, 1, + 172, 117, 1, 216, 178, 117, 1, 250, 112, 172, 117, 1, 233, 97, 117, 1, + 196, 157, 117, 1, 196, 41, 117, 1, 189, 117, 1, 238, 0, 117, 1, 11, 198, + 83, 117, 1, 11, 189, 117, 1, 198, 83, 117, 1, 237, 161, 117, 1, 181, 117, + 1, 214, 65, 117, 1, 11, 213, 178, 117, 1, 250, 112, 181, 117, 1, 213, + 178, 117, 1, 213, 164, 117, 1, 177, 117, 1, 218, 250, 117, 1, 219, 222, + 117, 1, 219, 211, 117, 1, 199, 50, 117, 1, 236, 155, 117, 1, 199, 42, + 117, 1, 236, 154, 117, 1, 160, 117, 1, 231, 233, 117, 1, 11, 160, 117, 1, + 208, 239, 117, 1, 208, 216, 117, 1, 214, 165, 117, 1, 214, 114, 117, 1, + 250, 112, 214, 165, 117, 1, 144, 117, 1, 193, 209, 117, 1, 231, 84, 117, + 1, 231, 59, 117, 1, 198, 93, 117, 1, 235, 0, 117, 1, 212, 201, 117, 1, + 212, 183, 117, 1, 198, 108, 117, 1, 235, 11, 117, 1, 11, 198, 108, 117, + 1, 11, 235, 11, 117, 1, 207, 232, 198, 108, 117, 1, 204, 64, 117, 1, 202, + 92, 117, 1, 192, 71, 117, 1, 191, 254, 117, 1, 198, 118, 117, 1, 235, 17, + 117, 1, 11, 198, 118, 117, 1, 188, 117, 1, 192, 112, 117, 1, 191, 255, + 117, 1, 191, 225, 117, 1, 191, 205, 117, 1, 250, 112, 191, 225, 117, 1, + 191, 197, 117, 1, 191, 204, 117, 1, 194, 169, 117, 1, 251, 72, 117, 1, + 229, 187, 117, 1, 247, 146, 117, 1, 201, 54, 117, 1, 235, 1, 117, 1, 200, + 79, 117, 1, 198, 112, 117, 1, 206, 221, 117, 3, 116, 73, 161, 117, 1, + 215, 47, 117, 3, 250, 43, 117, 3, 207, 232, 195, 246, 117, 3, 207, 232, + 250, 43, 117, 18, 3, 64, 117, 18, 3, 252, 33, 117, 18, 3, 251, 68, 117, + 18, 3, 250, 224, 117, 18, 3, 250, 214, 117, 18, 3, 74, 117, 18, 3, 211, + 194, 117, 18, 3, 194, 36, 117, 18, 3, 194, 202, 117, 18, 3, 71, 117, 18, + 3, 234, 88, 117, 18, 3, 234, 73, 117, 18, 3, 211, 252, 117, 18, 3, 70, + 117, 18, 3, 228, 58, 117, 18, 3, 228, 57, 117, 18, 3, 228, 56, 117, 18, + 3, 223, 116, 117, 18, 3, 223, 251, 117, 18, 3, 223, 224, 117, 18, 3, 223, + 78, 117, 18, 3, 223, 164, 117, 18, 3, 68, 117, 18, 3, 197, 119, 117, 18, + 3, 197, 118, 117, 18, 3, 197, 117, 117, 18, 3, 196, 251, 117, 18, 3, 197, + 101, 117, 18, 3, 197, 61, 117, 18, 3, 193, 148, 117, 18, 3, 193, 22, 117, + 18, 3, 251, 108, 117, 18, 3, 251, 104, 117, 18, 3, 234, 13, 117, 18, 3, + 207, 7, 234, 13, 117, 18, 3, 234, 21, 117, 18, 3, 207, 7, 234, 21, 117, + 18, 3, 251, 63, 117, 18, 3, 234, 150, 117, 18, 3, 250, 8, 117, 18, 3, + 211, 130, 117, 18, 3, 215, 151, 117, 18, 3, 214, 167, 117, 18, 3, 197, + 45, 117, 18, 3, 192, 194, 117, 18, 3, 211, 246, 117, 18, 3, 211, 253, + 117, 18, 3, 194, 213, 117, 18, 3, 223, 229, 117, 18, 3, 234, 199, 117, + 18, 3, 223, 114, 117, 18, 3, 197, 95, 117, 158, 207, 101, 117, 158, 198, + 249, 207, 101, 117, 158, 58, 117, 158, 63, 117, 1, 199, 16, 117, 1, 199, + 15, 117, 1, 199, 14, 117, 1, 199, 13, 117, 1, 199, 12, 117, 1, 199, 11, + 117, 1, 199, 10, 117, 1, 207, 232, 199, 17, 117, 1, 207, 232, 199, 16, + 117, 1, 207, 232, 199, 14, 117, 1, 207, 232, 199, 13, 117, 1, 207, 232, + 199, 12, 117, 1, 207, 232, 199, 10, 19, 223, 80, 77, 45, 223, 80, 77, 40, + 242, 200, 229, 15, 77, 40, 242, 200, 223, 80, 77, 37, 2, 27, 232, 247, + 196, 27, 250, 249, 208, 1, 122, 247, 19, 196, 27, 250, 249, 208, 1, 122, + 214, 64, 19, 242, 27, 19, 242, 26, 19, 242, 25, 19, 242, 24, 19, 242, 23, + 19, 242, 22, 19, 242, 21, 19, 242, 20, 19, 242, 19, 19, 242, 18, 19, 242, + 17, 19, 242, 16, 19, 242, 15, 19, 242, 14, 19, 242, 13, 19, 242, 12, 19, + 242, 11, 19, 242, 10, 19, 242, 9, 19, 242, 8, 19, 242, 7, 19, 242, 6, 19, + 242, 5, 19, 242, 4, 19, 242, 3, 19, 242, 2, 19, 242, 1, 19, 242, 0, 19, + 241, 255, 19, 241, 254, 19, 241, 253, 19, 241, 252, 19, 241, 251, 19, + 241, 250, 19, 241, 249, 19, 241, 248, 19, 241, 247, 19, 241, 246, 19, + 241, 245, 19, 241, 244, 19, 241, 243, 19, 241, 242, 19, 241, 241, 19, + 241, 240, 19, 241, 239, 19, 241, 238, 19, 241, 237, 19, 241, 236, 19, + 241, 235, 19, 241, 234, 19, 241, 233, 19, 241, 232, 19, 241, 231, 19, + 241, 230, 19, 241, 229, 19, 241, 228, 19, 241, 227, 19, 241, 226, 19, + 241, 225, 19, 241, 224, 19, 241, 223, 19, 241, 222, 19, 241, 221, 19, + 241, 220, 19, 241, 219, 19, 241, 218, 19, 241, 217, 19, 241, 216, 19, + 241, 215, 19, 241, 214, 19, 241, 213, 19, 241, 212, 19, 241, 211, 19, + 241, 210, 19, 241, 209, 19, 241, 208, 19, 241, 207, 19, 241, 206, 19, + 241, 205, 19, 241, 204, 19, 241, 203, 19, 241, 202, 19, 241, 201, 19, + 241, 200, 19, 241, 199, 19, 241, 198, 19, 241, 197, 19, 241, 196, 19, + 241, 195, 19, 241, 194, 19, 241, 193, 19, 241, 192, 19, 241, 191, 19, + 241, 190, 19, 241, 189, 19, 241, 188, 19, 241, 187, 19, 241, 186, 19, + 241, 185, 19, 241, 184, 19, 241, 183, 19, 241, 182, 19, 241, 181, 19, + 241, 180, 19, 241, 179, 19, 241, 178, 19, 241, 177, 19, 241, 176, 19, + 241, 175, 19, 241, 174, 19, 241, 173, 19, 241, 172, 19, 241, 171, 19, + 241, 170, 19, 241, 169, 19, 241, 168, 19, 241, 167, 19, 241, 166, 19, + 241, 165, 19, 241, 164, 19, 241, 163, 19, 241, 162, 19, 241, 161, 19, + 241, 160, 19, 241, 159, 19, 241, 158, 19, 241, 157, 19, 241, 156, 19, + 241, 155, 19, 241, 154, 19, 241, 153, 19, 241, 152, 19, 241, 151, 19, + 241, 150, 19, 241, 149, 19, 241, 148, 19, 241, 147, 19, 241, 146, 19, + 241, 145, 19, 241, 144, 19, 241, 143, 19, 241, 142, 19, 241, 141, 19, + 241, 140, 19, 241, 139, 19, 241, 138, 19, 241, 137, 19, 241, 136, 19, + 241, 135, 19, 241, 134, 19, 241, 133, 19, 241, 132, 19, 241, 131, 19, + 241, 130, 19, 241, 129, 19, 241, 128, 19, 241, 127, 19, 241, 126, 19, + 241, 125, 19, 241, 124, 19, 241, 123, 19, 241, 122, 19, 241, 121, 19, + 241, 120, 19, 241, 119, 19, 241, 118, 19, 241, 117, 19, 241, 116, 19, + 241, 115, 19, 241, 114, 19, 241, 113, 19, 241, 112, 19, 241, 111, 19, + 241, 110, 19, 241, 109, 19, 241, 108, 19, 241, 107, 19, 241, 106, 19, + 241, 105, 19, 241, 104, 19, 241, 103, 19, 241, 102, 19, 241, 101, 19, + 241, 100, 19, 241, 99, 19, 241, 98, 19, 241, 97, 19, 241, 96, 19, 241, + 95, 19, 241, 94, 19, 241, 93, 19, 241, 92, 19, 241, 91, 19, 241, 90, 19, + 241, 89, 19, 241, 88, 19, 241, 87, 19, 241, 86, 19, 241, 85, 19, 241, 84, + 19, 241, 83, 19, 241, 82, 19, 241, 81, 19, 241, 80, 19, 241, 79, 19, 241, + 78, 19, 241, 77, 19, 241, 76, 19, 241, 75, 19, 241, 74, 19, 241, 73, 19, + 241, 72, 19, 241, 71, 19, 241, 70, 19, 241, 69, 19, 241, 68, 19, 241, 67, + 19, 241, 66, 19, 241, 65, 19, 241, 64, 19, 241, 63, 19, 241, 62, 19, 241, + 61, 19, 241, 60, 19, 241, 59, 19, 241, 58, 19, 241, 57, 19, 241, 56, 19, + 241, 55, 19, 241, 54, 19, 241, 53, 19, 241, 52, 19, 241, 51, 19, 241, 50, + 19, 241, 49, 19, 241, 48, 19, 241, 47, 19, 241, 46, 19, 241, 45, 19, 241, + 44, 19, 241, 43, 19, 241, 42, 19, 241, 41, 19, 241, 40, 19, 241, 39, 19, + 241, 38, 19, 241, 37, 19, 241, 36, 19, 241, 35, 19, 241, 34, 19, 241, 33, + 19, 241, 32, 19, 241, 31, 19, 241, 30, 19, 241, 29, 19, 241, 28, 19, 241, + 27, 19, 241, 26, 19, 241, 25, 19, 241, 24, 19, 241, 23, 19, 241, 22, 19, + 241, 21, 19, 241, 20, 19, 241, 19, 19, 241, 18, 19, 241, 17, 19, 241, 16, + 19, 241, 15, 19, 241, 14, 19, 241, 13, 19, 241, 12, 19, 241, 11, 19, 241, + 10, 19, 241, 9, 19, 241, 8, 19, 241, 7, 19, 241, 6, 19, 241, 5, 19, 241, + 4, 19, 241, 3, 19, 241, 2, 19, 241, 1, 19, 241, 0, 19, 240, 255, 19, 240, + 254, 19, 240, 253, 19, 240, 252, 19, 240, 251, 19, 240, 250, 19, 240, + 249, 19, 240, 248, 19, 240, 247, 19, 240, 246, 19, 240, 245, 19, 240, + 244, 19, 240, 243, 19, 240, 242, 19, 240, 241, 19, 240, 240, 19, 240, + 239, 19, 240, 238, 19, 240, 237, 19, 240, 236, 19, 240, 235, 19, 240, + 234, 19, 240, 233, 19, 240, 232, 19, 240, 231, 19, 240, 230, 19, 240, + 229, 19, 240, 228, 19, 240, 227, 19, 240, 226, 19, 240, 225, 19, 240, + 224, 19, 240, 223, 19, 240, 222, 19, 240, 221, 19, 240, 220, 19, 240, + 219, 19, 240, 218, 19, 240, 217, 19, 240, 216, 19, 240, 215, 19, 240, + 214, 19, 240, 213, 19, 240, 212, 19, 240, 211, 19, 240, 210, 19, 240, + 209, 19, 240, 208, 19, 240, 207, 19, 240, 206, 19, 240, 205, 19, 240, + 204, 19, 240, 203, 19, 240, 202, 19, 240, 201, 19, 240, 200, 19, 240, + 199, 19, 240, 198, 19, 240, 197, 19, 240, 196, 19, 240, 195, 19, 240, + 194, 19, 240, 193, 19, 240, 192, 19, 240, 191, 19, 240, 190, 19, 240, + 189, 19, 240, 188, 19, 240, 187, 19, 240, 186, 19, 240, 185, 19, 240, + 184, 19, 240, 183, 19, 240, 182, 19, 240, 181, 19, 240, 180, 19, 240, + 179, 19, 240, 178, 19, 240, 177, 19, 240, 176, 19, 240, 175, 19, 240, + 174, 19, 240, 173, 19, 240, 172, 19, 240, 171, 19, 240, 170, 19, 240, + 169, 19, 240, 168, 19, 240, 167, 19, 240, 166, 19, 240, 165, 19, 240, + 164, 19, 240, 163, 19, 240, 162, 19, 240, 161, 19, 240, 160, 19, 240, + 159, 19, 240, 158, 19, 240, 157, 19, 240, 156, 19, 240, 155, 19, 240, + 154, 19, 240, 153, 19, 240, 152, 19, 240, 151, 19, 240, 150, 19, 240, + 149, 19, 240, 148, 19, 240, 147, 19, 240, 146, 19, 240, 145, 19, 240, + 144, 19, 240, 143, 19, 240, 142, 19, 240, 141, 19, 240, 140, 19, 240, + 139, 19, 240, 138, 19, 240, 137, 19, 240, 136, 19, 240, 135, 19, 240, + 134, 19, 240, 133, 19, 240, 132, 19, 240, 131, 19, 240, 130, 19, 240, + 129, 19, 240, 128, 19, 240, 127, 19, 240, 126, 19, 240, 125, 19, 240, + 124, 19, 240, 123, 19, 240, 122, 19, 240, 121, 19, 240, 120, 19, 240, + 119, 19, 240, 118, 19, 240, 117, 19, 240, 116, 19, 240, 115, 19, 240, + 114, 19, 240, 113, 19, 240, 112, 19, 240, 111, 19, 240, 110, 19, 240, + 109, 19, 240, 108, 19, 240, 107, 19, 240, 106, 19, 240, 105, 19, 240, + 104, 19, 240, 103, 19, 240, 102, 19, 240, 101, 19, 240, 100, 19, 240, 99, + 19, 240, 98, 19, 240, 97, 19, 240, 96, 19, 240, 95, 19, 240, 94, 19, 240, + 93, 19, 240, 92, 19, 240, 91, 19, 240, 90, 19, 240, 89, 19, 240, 88, 19, + 240, 87, 19, 240, 86, 19, 240, 85, 19, 240, 84, 19, 240, 83, 19, 240, 82, + 19, 240, 81, 19, 240, 80, 19, 240, 79, 19, 240, 78, 19, 240, 77, 19, 240, + 76, 19, 240, 75, 19, 240, 74, 19, 240, 73, 19, 240, 72, 19, 240, 71, 19, + 240, 70, 19, 240, 69, 19, 240, 68, 19, 240, 67, 19, 240, 66, 19, 240, 65, + 19, 240, 64, 19, 240, 63, 19, 240, 62, 19, 240, 61, 19, 240, 60, 19, 240, + 59, 19, 240, 58, 19, 240, 57, 19, 240, 56, 19, 240, 55, 19, 240, 54, 19, + 240, 53, 19, 240, 52, 19, 240, 51, 19, 240, 50, 19, 240, 49, 19, 240, 48, + 19, 240, 47, 19, 240, 46, 19, 240, 45, 19, 240, 44, 19, 240, 43, 19, 240, + 42, 19, 240, 41, 19, 240, 40, 19, 240, 39, 19, 240, 38, 19, 240, 37, 19, + 240, 36, 19, 240, 35, 19, 240, 34, 19, 240, 33, 19, 240, 32, 19, 240, 31, + 19, 240, 30, 19, 240, 29, 19, 240, 28, 19, 240, 27, 19, 240, 26, 19, 240, + 25, 19, 240, 24, 19, 240, 23, 19, 240, 22, 19, 240, 21, 19, 240, 20, 19, + 240, 19, 19, 240, 18, 19, 240, 17, 19, 240, 16, 19, 240, 15, 19, 240, 14, + 19, 240, 13, 19, 240, 12, 19, 240, 11, 19, 240, 10, 19, 240, 9, 19, 240, + 8, 19, 240, 7, 19, 240, 6, 19, 240, 5, 19, 240, 4, 19, 240, 3, 19, 240, + 2, 19, 240, 1, 19, 240, 0, 19, 239, 255, 19, 239, 254, 19, 239, 253, 19, + 239, 252, 19, 239, 251, 19, 239, 250, 19, 239, 249, 19, 239, 248, 19, + 239, 247, 19, 239, 246, 19, 239, 245, 19, 239, 244, 19, 239, 243, 19, + 239, 242, 19, 239, 241, 19, 239, 240, 19, 239, 239, 19, 239, 238, 19, + 239, 237, 19, 239, 236, 19, 239, 235, 19, 239, 234, 19, 239, 233, 19, + 239, 232, 19, 239, 231, 19, 239, 230, 19, 239, 229, 19, 239, 228, 19, + 239, 227, 19, 239, 226, 19, 239, 225, 19, 239, 224, 19, 239, 223, 19, + 239, 222, 19, 239, 221, 19, 239, 220, 19, 239, 219, 19, 239, 218, 19, + 239, 217, 19, 239, 216, 19, 239, 215, 19, 239, 214, 19, 239, 213, 19, + 239, 212, 19, 239, 211, 19, 239, 210, 19, 239, 209, 19, 239, 208, 19, + 239, 207, 19, 239, 206, 19, 239, 205, 19, 239, 204, 19, 239, 203, 19, + 239, 202, 19, 239, 201, 19, 239, 200, 19, 239, 199, 19, 239, 198, 19, + 239, 197, 19, 239, 196, 19, 239, 195, 19, 239, 194, 19, 239, 193, 19, + 239, 192, 19, 239, 191, 19, 239, 190, 19, 239, 189, 19, 239, 188, 19, + 239, 187, 19, 239, 186, 19, 239, 185, 19, 239, 184, 19, 239, 183, 19, + 239, 182, 19, 239, 181, 19, 239, 180, 19, 239, 179, 19, 239, 178, 19, + 239, 177, 19, 239, 176, 19, 239, 175, 19, 239, 174, 19, 239, 173, 19, + 239, 172, 19, 239, 171, 19, 239, 170, 19, 239, 169, 19, 239, 168, 19, + 239, 167, 19, 239, 166, 19, 239, 165, 19, 239, 164, 19, 239, 163, 19, + 239, 162, 19, 239, 161, 19, 239, 160, 19, 239, 159, 19, 239, 158, 19, + 239, 157, 19, 239, 156, 19, 239, 155, 19, 239, 154, 19, 239, 153, 19, + 239, 152, 19, 239, 151, 19, 239, 150, 19, 239, 149, 19, 239, 148, 19, + 239, 147, 19, 239, 146, 19, 239, 145, 19, 239, 144, 19, 239, 143, 19, + 239, 142, 19, 239, 141, 19, 239, 140, 19, 239, 139, 19, 239, 138, 19, + 239, 137, 19, 239, 136, 19, 239, 135, 19, 239, 134, 19, 239, 133, 19, + 239, 132, 19, 239, 131, 19, 239, 130, 19, 239, 129, 19, 239, 128, 19, + 239, 127, 19, 239, 126, 19, 239, 125, 19, 239, 124, 19, 239, 123, 19, + 239, 122, 19, 239, 121, 19, 239, 120, 19, 239, 119, 19, 239, 118, 19, + 239, 117, 19, 239, 116, 19, 239, 115, 19, 239, 114, 19, 239, 113, 19, + 239, 112, 19, 239, 111, 19, 239, 110, 19, 239, 109, 19, 239, 108, 19, + 239, 107, 19, 239, 106, 19, 239, 105, 19, 239, 104, 19, 239, 103, 19, + 239, 102, 19, 239, 101, 19, 239, 100, 19, 239, 99, 19, 239, 98, 19, 239, + 97, 19, 239, 96, 19, 239, 95, 19, 239, 94, 19, 239, 93, 19, 239, 92, 19, + 239, 91, 19, 239, 90, 19, 239, 89, 19, 239, 88, 19, 239, 87, 19, 239, 86, + 19, 239, 85, 19, 239, 84, 19, 239, 83, 19, 239, 82, 19, 239, 81, 19, 239, + 80, 19, 239, 79, 19, 239, 78, 19, 239, 77, 19, 239, 76, 19, 239, 75, 19, + 239, 74, 19, 239, 73, 19, 239, 72, 19, 239, 71, 19, 239, 70, 19, 239, 69, + 19, 239, 68, 19, 239, 67, 19, 239, 66, 19, 239, 65, 19, 239, 64, 19, 239, + 63, 19, 239, 62, 19, 239, 61, 19, 239, 60, 19, 239, 59, 19, 239, 58, 19, + 239, 57, 19, 239, 56, 19, 239, 55, 19, 239, 54, 19, 239, 53, 19, 239, 52, + 19, 239, 51, 19, 239, 50, 19, 239, 49, 19, 239, 48, 19, 239, 47, 19, 239, + 46, 19, 239, 45, 19, 239, 44, 19, 239, 43, 19, 239, 42, 19, 239, 41, 19, + 239, 40, 19, 239, 39, 19, 239, 38, 19, 239, 37, 19, 239, 36, 19, 239, 35, + 19, 239, 34, 19, 239, 33, 19, 239, 32, 19, 239, 31, 19, 239, 30, 19, 239, + 29, 19, 239, 28, 37, 2, 27, 246, 98, 37, 2, 27, 246, 97, 37, 2, 27, 246, + 96, 37, 2, 27, 246, 95, 37, 2, 27, 246, 94, 37, 2, 27, 246, 93, 37, 2, + 27, 246, 92, 37, 2, 27, 246, 91, 37, 2, 27, 246, 90, 37, 2, 27, 246, 89, + 37, 2, 27, 246, 88, 37, 2, 27, 246, 87, 37, 2, 27, 246, 86, 37, 2, 27, + 246, 85, 37, 2, 27, 246, 84, 37, 2, 27, 246, 83, 37, 2, 27, 246, 82, 37, + 2, 27, 246, 81, 37, 2, 27, 246, 80, 37, 2, 27, 246, 79, 37, 2, 27, 246, + 78, 37, 2, 27, 246, 77, 37, 2, 27, 246, 76, 37, 2, 27, 246, 75, 37, 2, + 27, 246, 74, 37, 2, 27, 246, 73, 37, 2, 27, 246, 72, 37, 2, 27, 246, 71, + 37, 2, 27, 246, 70, 37, 2, 27, 246, 69, 37, 2, 27, 246, 68, 37, 2, 27, + 246, 67, 37, 2, 27, 246, 66, 37, 2, 27, 246, 65, 37, 2, 27, 246, 64, 37, + 2, 27, 246, 63, 37, 2, 27, 246, 62, 37, 2, 27, 246, 61, 37, 2, 27, 246, + 60, 37, 2, 27, 246, 59, 37, 2, 27, 246, 58, 37, 2, 27, 246, 57, 37, 2, + 27, 246, 56, 37, 2, 27, 246, 55, 37, 2, 27, 246, 54, 37, 2, 27, 246, 53, + 37, 2, 27, 246, 52, 37, 2, 27, 246, 51, 37, 2, 27, 246, 50, 37, 2, 27, + 246, 49, 37, 2, 27, 246, 48, 37, 2, 27, 246, 47, 37, 2, 27, 246, 46, 37, + 2, 27, 246, 45, 37, 2, 27, 246, 44, 37, 2, 27, 246, 43, 37, 2, 27, 246, + 42, 37, 2, 27, 246, 41, 37, 2, 27, 246, 40, 37, 2, 27, 246, 39, 37, 2, + 27, 246, 38, 37, 2, 27, 246, 37, 37, 2, 27, 246, 36, 37, 2, 27, 246, 35, + 37, 2, 27, 246, 34, 37, 2, 27, 246, 33, 37, 2, 27, 246, 32, 37, 2, 27, + 246, 31, 37, 2, 27, 246, 30, 37, 2, 27, 246, 29, 37, 2, 27, 246, 28, 37, + 2, 27, 246, 27, 37, 2, 27, 246, 26, 37, 2, 27, 246, 25, 37, 2, 27, 246, + 24, 37, 2, 27, 246, 23, 37, 2, 27, 246, 22, 37, 2, 27, 246, 21, 37, 2, + 27, 246, 20, 37, 2, 27, 246, 19, 37, 2, 27, 246, 18, 37, 2, 27, 246, 17, + 37, 2, 27, 246, 16, 37, 2, 27, 246, 15, 37, 2, 27, 246, 14, 37, 2, 27, + 246, 13, 37, 2, 27, 246, 12, 37, 2, 27, 246, 11, 37, 2, 27, 246, 10, 37, + 2, 27, 246, 9, 37, 2, 27, 246, 8, 37, 2, 27, 246, 7, 37, 2, 27, 246, 6, + 37, 2, 27, 246, 5, 37, 2, 27, 246, 4, 37, 2, 27, 246, 3, 37, 2, 27, 246, + 2, 37, 2, 27, 246, 1, 37, 2, 27, 246, 0, 37, 2, 27, 245, 255, 37, 2, 27, + 245, 254, 37, 2, 27, 245, 253, 37, 2, 27, 245, 252, 37, 2, 27, 245, 251, + 37, 2, 27, 245, 250, 37, 2, 27, 245, 249, 37, 2, 27, 245, 248, 37, 2, 27, + 245, 247, 37, 2, 27, 245, 246, 37, 2, 27, 245, 245, 37, 2, 27, 245, 244, + 37, 2, 27, 245, 243, 37, 2, 27, 245, 242, 37, 2, 27, 245, 241, 37, 2, 27, + 245, 240, 37, 2, 27, 245, 239, 37, 2, 27, 245, 238, 37, 2, 27, 245, 237, + 37, 2, 27, 245, 236, 37, 2, 27, 245, 235, 37, 2, 27, 245, 234, 37, 2, 27, + 245, 233, 37, 2, 27, 245, 232, 37, 2, 27, 245, 231, 37, 2, 27, 245, 230, + 37, 2, 27, 245, 229, 37, 2, 27, 245, 228, 37, 2, 27, 245, 227, 37, 2, 27, + 245, 226, 37, 2, 27, 245, 225, 37, 2, 27, 245, 224, 37, 2, 27, 245, 223, + 37, 2, 27, 245, 222, 37, 2, 27, 245, 221, 37, 2, 27, 245, 220, 37, 2, 27, + 245, 219, 37, 2, 27, 245, 218, 37, 2, 27, 245, 217, 37, 2, 27, 245, 216, + 37, 2, 27, 245, 215, 37, 2, 27, 245, 214, 37, 2, 27, 245, 213, 37, 2, 27, + 245, 212, 37, 2, 27, 245, 211, 37, 2, 27, 245, 210, 37, 2, 27, 245, 209, + 37, 2, 27, 245, 208, 37, 2, 27, 245, 207, 37, 2, 27, 245, 206, 37, 2, 27, + 245, 205, 37, 2, 27, 245, 204, 37, 2, 27, 245, 203, 37, 2, 27, 245, 202, + 37, 2, 27, 245, 201, 37, 2, 27, 245, 200, 37, 2, 27, 245, 199, 37, 2, 27, + 245, 198, 37, 2, 27, 245, 197, 37, 2, 27, 245, 196, 37, 2, 27, 245, 195, + 37, 2, 27, 245, 194, 37, 2, 27, 245, 193, 37, 2, 27, 245, 192, 37, 2, 27, + 245, 191, 37, 2, 27, 245, 190, 37, 2, 27, 245, 189, 37, 2, 27, 245, 188, + 37, 2, 27, 245, 187, 37, 2, 27, 245, 186, 37, 2, 27, 245, 185, 37, 2, 27, + 245, 184, 37, 2, 27, 245, 183, 37, 2, 27, 245, 182, 37, 2, 27, 245, 181, + 37, 2, 27, 245, 180, 37, 2, 27, 245, 179, 37, 2, 27, 245, 178, 37, 2, 27, + 245, 177, 37, 2, 27, 245, 176, 37, 2, 27, 245, 175, 37, 2, 27, 245, 174, + 37, 2, 27, 245, 173, 37, 2, 27, 245, 172, 37, 2, 27, 245, 171, 37, 2, 27, + 245, 170, 37, 2, 27, 245, 169, 37, 2, 27, 245, 168, 37, 2, 27, 245, 167, + 37, 2, 27, 245, 166, 37, 2, 27, 245, 165, 37, 2, 27, 245, 164, 37, 2, 27, + 245, 163, 37, 2, 27, 245, 162, 37, 2, 27, 245, 161, 37, 2, 27, 245, 160, + 37, 2, 27, 245, 159, 37, 2, 27, 245, 158, 37, 2, 27, 245, 157, 37, 2, 27, + 245, 156, 37, 2, 27, 245, 155, 37, 2, 27, 245, 154, 37, 2, 27, 245, 153, + 37, 2, 27, 245, 152, 37, 2, 27, 245, 151, 37, 2, 27, 245, 150, 37, 2, 27, + 245, 149, 37, 2, 27, 245, 148, 37, 2, 27, 245, 147, 37, 2, 27, 245, 146, + 37, 2, 27, 245, 145, 37, 2, 27, 245, 144, 37, 2, 27, 245, 143, 37, 2, 27, + 245, 142, 37, 2, 27, 245, 141, 37, 2, 27, 245, 140, 37, 2, 27, 245, 139, + 37, 2, 27, 245, 138, 37, 2, 27, 245, 137, 37, 2, 27, 245, 136, 37, 2, 27, + 245, 135, 37, 2, 27, 245, 134, 37, 2, 27, 245, 133, 37, 2, 27, 245, 132, + 37, 2, 27, 245, 131, 37, 2, 27, 245, 130, 37, 2, 27, 245, 129, 37, 2, 27, + 245, 128, 37, 2, 27, 245, 127, 37, 2, 27, 245, 126, 37, 2, 27, 245, 125, + 37, 2, 27, 245, 124, 37, 2, 27, 245, 123, 37, 2, 27, 245, 122, 37, 2, 27, + 245, 121, 37, 2, 27, 245, 120, 37, 2, 27, 245, 119, 37, 2, 27, 245, 118, + 37, 2, 27, 245, 117, 37, 2, 27, 245, 116, 37, 2, 27, 245, 115, 37, 2, 27, + 245, 114, 37, 2, 27, 245, 113, 37, 2, 27, 245, 112, 37, 2, 27, 245, 111, + 37, 2, 27, 245, 110, 37, 2, 27, 245, 109, 37, 2, 27, 245, 108, 37, 2, 27, + 245, 107, 37, 2, 27, 245, 106, 37, 2, 27, 245, 105, 37, 2, 27, 245, 104, + 37, 2, 27, 245, 103, 37, 2, 27, 245, 102, 37, 2, 27, 245, 101, 37, 2, 27, + 245, 100, 37, 2, 27, 245, 99, 37, 2, 27, 245, 98, 37, 2, 27, 245, 97, 37, + 2, 27, 245, 96, 37, 2, 27, 245, 95, 37, 2, 27, 245, 94, 37, 2, 27, 245, + 93, 37, 2, 27, 245, 92, 37, 2, 27, 245, 91, 37, 2, 27, 245, 90, 37, 2, + 27, 245, 89, 37, 2, 27, 245, 88, 37, 2, 27, 245, 87, 37, 2, 27, 245, 86, + 37, 2, 27, 245, 85, 37, 2, 27, 245, 84, 37, 2, 27, 245, 83, 37, 2, 27, + 245, 82, 37, 2, 27, 245, 81, 37, 2, 27, 245, 80, 37, 2, 27, 245, 79, 37, + 2, 27, 245, 78, 37, 2, 27, 245, 77, 37, 2, 27, 245, 76, 37, 2, 27, 245, + 75, 37, 2, 27, 245, 74, 37, 2, 27, 245, 73, 37, 2, 27, 245, 72, 37, 2, + 27, 245, 71, 37, 2, 27, 245, 70, 37, 2, 27, 245, 69, 37, 2, 27, 245, 68, + 37, 2, 27, 245, 67, 37, 2, 27, 245, 66, 37, 2, 27, 245, 65, 37, 2, 27, + 245, 64, 37, 2, 27, 245, 63, 37, 2, 27, 245, 62, 37, 2, 27, 245, 61, 37, + 2, 27, 245, 60, 37, 2, 27, 245, 59, 37, 2, 27, 245, 58, 37, 2, 27, 245, + 57, 37, 2, 27, 245, 56, 37, 2, 27, 245, 55, 37, 2, 27, 245, 54, 37, 2, + 27, 245, 53, 37, 2, 27, 245, 52, 37, 2, 27, 245, 51, 37, 2, 27, 245, 50, + 37, 2, 27, 245, 49, 37, 2, 27, 245, 48, 37, 2, 27, 245, 47, 37, 2, 27, + 245, 46, 37, 2, 27, 245, 45, 37, 2, 27, 245, 44, 37, 2, 27, 245, 43, 37, + 2, 27, 245, 42, 37, 2, 27, 245, 41, 37, 2, 27, 245, 40, 37, 2, 27, 245, + 39, 37, 2, 27, 245, 38, 37, 2, 27, 245, 37, 37, 2, 27, 245, 36, 37, 2, + 27, 245, 35, 37, 2, 27, 245, 34, 37, 2, 27, 245, 33, 37, 2, 27, 245, 32, + 37, 2, 27, 245, 31, 37, 2, 27, 245, 30, 37, 2, 27, 245, 29, 37, 2, 27, + 245, 28, 37, 2, 27, 245, 27, 37, 2, 27, 245, 26, 37, 2, 27, 245, 25, 37, + 2, 27, 245, 24, 37, 2, 27, 245, 23, 37, 2, 27, 245, 22, 37, 2, 27, 245, + 21, 37, 2, 27, 245, 20, 37, 2, 27, 245, 19, 37, 2, 27, 245, 18, 37, 2, + 27, 245, 17, 37, 2, 27, 245, 16, 37, 2, 27, 245, 15, 37, 2, 27, 245, 14, + 37, 2, 27, 245, 13, 37, 2, 27, 245, 12, 37, 2, 27, 245, 11, 37, 2, 27, + 245, 10, 37, 2, 27, 245, 9, 37, 2, 27, 245, 8, 37, 2, 27, 245, 7, 37, 2, + 27, 245, 6, 37, 2, 27, 245, 5, 37, 2, 27, 245, 4, 37, 2, 27, 245, 3, 37, + 2, 27, 245, 2, 37, 2, 27, 245, 1, 37, 2, 27, 245, 0, 37, 2, 27, 244, 255, + 37, 2, 27, 244, 254, 37, 2, 27, 244, 253, 37, 2, 27, 244, 252, 37, 2, 27, + 244, 251, 37, 2, 27, 244, 250, 37, 2, 27, 244, 249, 37, 2, 27, 244, 248, + 37, 2, 27, 244, 247, 37, 2, 27, 244, 246, 37, 2, 27, 244, 245, 37, 2, 27, + 244, 244, 37, 2, 27, 244, 243, 37, 2, 27, 244, 242, 37, 2, 27, 244, 241, + 37, 2, 27, 244, 240, 37, 2, 27, 244, 239, 37, 2, 27, 244, 238, 37, 2, 27, + 244, 237, 37, 2, 27, 244, 236, 37, 2, 27, 244, 235, 37, 2, 27, 244, 234, + 37, 2, 27, 244, 233, 37, 2, 27, 244, 232, 37, 2, 27, 244, 231, 37, 2, 27, + 244, 230, 37, 2, 27, 244, 229, 37, 2, 27, 244, 228, 37, 2, 27, 244, 227, + 37, 2, 27, 244, 226, 37, 2, 27, 244, 225, 37, 2, 27, 244, 224, 37, 2, 27, + 244, 223, 37, 2, 27, 244, 222, 37, 2, 27, 244, 221, 37, 2, 27, 244, 220, + 37, 2, 27, 244, 219, 37, 2, 27, 244, 218, 37, 2, 27, 244, 217, 37, 2, 27, + 244, 216, 37, 2, 27, 244, 215, 37, 2, 27, 244, 214, 37, 2, 27, 244, 213, + 37, 2, 27, 244, 212, 37, 2, 27, 244, 211, 37, 2, 27, 244, 210, 37, 2, 27, + 244, 209, 37, 2, 27, 244, 208, 37, 2, 27, 244, 207, 37, 2, 27, 244, 206, + 37, 2, 27, 244, 205, 37, 2, 27, 244, 204, 37, 2, 27, 244, 203, 37, 2, 27, + 244, 202, 37, 2, 27, 244, 201, 37, 2, 27, 244, 200, 37, 2, 27, 244, 199, + 37, 2, 27, 244, 198, 37, 2, 27, 244, 197, 37, 2, 27, 244, 196, 37, 2, 27, + 244, 195, 37, 2, 27, 244, 194, 37, 2, 27, 244, 193, 37, 2, 27, 244, 192, + 37, 2, 27, 244, 191, 37, 2, 27, 244, 190, 37, 2, 27, 244, 189, 37, 2, 27, + 244, 188, 37, 2, 27, 244, 187, 37, 2, 27, 244, 186, 37, 2, 27, 244, 185, + 37, 2, 27, 244, 184, 37, 2, 27, 244, 183, 37, 2, 27, 244, 182, 37, 2, 27, + 244, 181, 37, 2, 27, 244, 180, 37, 2, 27, 244, 179, 37, 2, 27, 244, 178, + 37, 2, 27, 244, 177, 37, 2, 27, 244, 176, 37, 2, 27, 244, 175, 37, 2, 27, + 244, 174, 37, 2, 27, 244, 173, 37, 2, 27, 244, 172, 37, 2, 27, 244, 171, + 37, 2, 27, 244, 170, 37, 2, 27, 244, 169, 37, 2, 27, 244, 168, 37, 2, 27, + 244, 167, 37, 2, 27, 244, 166, 37, 2, 27, 244, 165, 37, 2, 27, 244, 164, + 37, 2, 27, 244, 163, 37, 2, 27, 244, 162, 37, 2, 27, 244, 161, 37, 2, 27, + 244, 160, 37, 2, 27, 244, 159, 37, 2, 27, 244, 158, 37, 2, 27, 244, 157, + 37, 2, 27, 244, 156, 37, 2, 27, 244, 155, 37, 2, 27, 244, 154, 37, 2, 27, + 244, 153, 37, 2, 27, 244, 152, 37, 2, 27, 244, 151, 37, 2, 27, 244, 150, + 37, 2, 27, 244, 149, 37, 2, 27, 244, 148, 37, 2, 27, 244, 147, 37, 2, 27, + 244, 146, 37, 2, 27, 244, 145, 37, 2, 27, 244, 144, 37, 2, 27, 244, 143, + 37, 2, 27, 244, 142, 37, 2, 27, 244, 141, 75, 1, 250, 112, 71, 229, 140, + 1, 250, 112, 193, 69, 59, 1, 255, 33, 59, 1, 255, 32, 59, 1, 255, 31, 59, + 1, 255, 27, 59, 1, 228, 96, 59, 1, 228, 95, 59, 1, 228, 94, 59, 1, 228, + 93, 59, 1, 197, 182, 59, 1, 197, 181, 59, 1, 197, 180, 59, 1, 197, 179, + 59, 1, 197, 178, 59, 1, 234, 251, 59, 1, 234, 250, 59, 1, 234, 249, 59, + 1, 234, 248, 59, 1, 234, 247, 59, 1, 212, 114, 59, 1, 212, 113, 59, 1, + 212, 112, 59, 1, 222, 173, 59, 1, 222, 170, 59, 1, 222, 169, 59, 1, 222, + 168, 59, 1, 222, 167, 59, 1, 222, 166, 59, 1, 222, 165, 59, 1, 222, 164, + 59, 1, 222, 163, 59, 1, 222, 172, 59, 1, 222, 171, 59, 1, 222, 162, 59, + 1, 221, 203, 59, 1, 221, 202, 59, 1, 221, 201, 59, 1, 221, 200, 59, 1, + 221, 199, 59, 1, 221, 198, 59, 1, 221, 197, 59, 1, 221, 196, 59, 1, 221, + 32, 59, 1, 221, 31, 59, 1, 221, 30, 59, 1, 221, 29, 59, 1, 221, 28, 59, + 1, 221, 27, 59, 1, 221, 26, 59, 1, 222, 56, 59, 1, 222, 55, 59, 1, 222, + 54, 59, 1, 222, 53, 59, 1, 222, 52, 59, 1, 222, 51, 59, 1, 221, 112, 59, + 1, 221, 111, 59, 1, 221, 110, 59, 1, 221, 109, 59, 1, 206, 100, 59, 1, + 206, 99, 59, 1, 206, 98, 59, 1, 206, 97, 59, 1, 206, 96, 59, 1, 206, 95, + 59, 1, 206, 94, 59, 1, 206, 93, 59, 1, 203, 124, 59, 1, 203, 123, 59, 1, + 203, 122, 59, 1, 203, 121, 59, 1, 203, 120, 59, 1, 203, 119, 59, 1, 201, + 183, 59, 1, 201, 182, 59, 1, 201, 181, 59, 1, 201, 180, 59, 1, 201, 179, + 59, 1, 201, 178, 59, 1, 201, 177, 59, 1, 201, 176, 59, 1, 205, 222, 59, + 1, 205, 221, 59, 1, 205, 220, 59, 1, 205, 219, 59, 1, 205, 218, 59, 1, + 202, 211, 59, 1, 202, 210, 59, 1, 202, 209, 59, 1, 202, 208, 59, 1, 202, + 207, 59, 1, 202, 206, 59, 1, 202, 205, 59, 1, 200, 180, 59, 1, 200, 179, + 59, 1, 200, 178, 59, 1, 200, 177, 59, 1, 199, 127, 59, 1, 199, 126, 59, + 1, 199, 125, 59, 1, 199, 124, 59, 1, 199, 123, 59, 1, 199, 122, 59, 1, + 199, 121, 59, 1, 198, 44, 59, 1, 198, 43, 59, 1, 198, 42, 59, 1, 198, 41, + 59, 1, 198, 40, 59, 1, 200, 78, 59, 1, 200, 77, 59, 1, 200, 76, 59, 1, + 200, 75, 59, 1, 200, 74, 59, 1, 200, 73, 59, 1, 200, 72, 59, 1, 200, 71, + 59, 1, 200, 70, 59, 1, 199, 36, 59, 1, 199, 35, 59, 1, 199, 34, 59, 1, + 199, 33, 59, 1, 199, 32, 59, 1, 199, 31, 59, 1, 199, 30, 59, 1, 215, 96, + 59, 1, 215, 95, 59, 1, 215, 94, 59, 1, 215, 93, 59, 1, 215, 92, 59, 1, + 215, 91, 59, 1, 215, 90, 59, 1, 215, 89, 59, 1, 215, 88, 59, 1, 214, 59, + 59, 1, 214, 58, 59, 1, 214, 57, 59, 1, 214, 56, 59, 1, 214, 55, 59, 1, + 214, 54, 59, 1, 214, 53, 59, 1, 214, 52, 59, 1, 213, 21, 59, 1, 213, 20, + 59, 1, 213, 19, 59, 1, 214, 213, 59, 1, 214, 212, 59, 1, 214, 211, 59, 1, + 214, 210, 59, 1, 214, 209, 59, 1, 214, 208, 59, 1, 214, 207, 59, 1, 213, + 141, 59, 1, 213, 140, 59, 1, 213, 139, 59, 1, 213, 138, 59, 1, 213, 137, + 59, 1, 230, 112, 59, 1, 230, 109, 59, 1, 230, 108, 59, 1, 230, 107, 59, + 1, 230, 106, 59, 1, 230, 105, 59, 1, 230, 104, 59, 1, 230, 103, 59, 1, + 230, 102, 59, 1, 230, 111, 59, 1, 230, 110, 59, 1, 229, 177, 59, 1, 229, + 176, 59, 1, 229, 175, 59, 1, 229, 174, 59, 1, 229, 173, 59, 1, 229, 172, + 59, 1, 229, 171, 59, 1, 228, 180, 59, 1, 228, 179, 59, 1, 228, 178, 59, + 1, 229, 254, 59, 1, 229, 253, 59, 1, 229, 252, 59, 1, 229, 251, 59, 1, + 229, 250, 59, 1, 229, 249, 59, 1, 229, 248, 59, 1, 229, 42, 59, 1, 229, + 41, 59, 1, 229, 40, 59, 1, 229, 39, 59, 1, 229, 38, 59, 1, 229, 37, 59, + 1, 229, 36, 59, 1, 229, 35, 59, 1, 217, 227, 59, 1, 217, 226, 59, 1, 217, + 225, 59, 1, 217, 224, 59, 1, 217, 223, 59, 1, 217, 222, 59, 1, 217, 221, + 59, 1, 216, 174, 59, 1, 216, 173, 59, 1, 216, 172, 59, 1, 216, 171, 59, + 1, 216, 170, 59, 1, 216, 169, 59, 1, 216, 168, 59, 1, 215, 240, 59, 1, + 215, 239, 59, 1, 215, 238, 59, 1, 215, 237, 59, 1, 217, 47, 59, 1, 217, + 46, 59, 1, 217, 45, 59, 1, 216, 90, 59, 1, 216, 89, 59, 1, 216, 88, 59, + 1, 216, 87, 59, 1, 216, 86, 59, 1, 216, 85, 59, 1, 193, 137, 59, 1, 193, + 136, 59, 1, 193, 135, 59, 1, 193, 134, 59, 1, 193, 133, 59, 1, 193, 130, + 59, 1, 192, 213, 59, 1, 192, 212, 59, 1, 192, 211, 59, 1, 192, 210, 59, + 1, 193, 0, 59, 1, 192, 255, 59, 1, 192, 254, 59, 1, 192, 253, 59, 1, 192, + 252, 59, 1, 192, 251, 59, 1, 208, 75, 59, 1, 208, 74, 59, 1, 208, 73, 59, + 1, 208, 72, 59, 1, 207, 150, 59, 1, 207, 149, 59, 1, 207, 148, 59, 1, + 207, 147, 59, 1, 207, 146, 59, 1, 207, 145, 59, 1, 207, 144, 59, 1, 206, + 217, 59, 1, 206, 216, 59, 1, 206, 215, 59, 1, 206, 214, 59, 1, 206, 213, + 59, 1, 206, 212, 59, 1, 208, 6, 59, 1, 208, 5, 59, 1, 208, 4, 59, 1, 208, + 3, 59, 1, 207, 54, 59, 1, 207, 53, 59, 1, 207, 52, 59, 1, 207, 51, 59, 1, + 207, 50, 59, 1, 207, 49, 59, 1, 194, 168, 59, 1, 194, 167, 59, 1, 194, + 166, 59, 1, 194, 165, 59, 1, 194, 164, 59, 1, 194, 71, 59, 1, 194, 70, + 59, 1, 194, 69, 59, 1, 194, 68, 59, 1, 194, 67, 59, 1, 194, 110, 59, 1, + 194, 109, 59, 1, 194, 108, 59, 1, 194, 107, 59, 1, 194, 35, 59, 1, 194, + 34, 59, 1, 194, 33, 59, 1, 194, 32, 59, 1, 194, 31, 59, 1, 194, 30, 59, + 1, 194, 29, 59, 1, 215, 148, 59, 1, 215, 147, 229, 140, 1, 2, 194, 72, + 229, 140, 1, 2, 194, 111, 229, 140, 1, 2, 194, 36, 75, 1, 2, 194, 72, 75, + 1, 2, 194, 111, 75, 1, 2, 194, 36, 75, 1, 2, 215, 151, 45, 244, 140, 45, + 244, 139, 45, 244, 138, 45, 244, 137, 45, 244, 136, 45, 244, 135, 45, + 244, 134, 45, 244, 133, 45, 244, 132, 45, 244, 131, 45, 244, 130, 45, + 244, 129, 45, 244, 128, 45, 244, 127, 45, 244, 126, 45, 244, 125, 45, + 244, 124, 45, 244, 123, 45, 244, 122, 45, 244, 121, 45, 244, 120, 45, + 244, 119, 45, 244, 118, 45, 244, 117, 45, 244, 116, 45, 244, 115, 45, + 244, 114, 45, 244, 113, 45, 244, 112, 45, 244, 111, 45, 244, 110, 45, + 244, 109, 45, 244, 108, 45, 244, 107, 45, 244, 106, 45, 244, 105, 45, + 244, 104, 45, 244, 103, 45, 244, 102, 45, 244, 101, 45, 244, 100, 45, + 244, 99, 45, 244, 98, 45, 244, 97, 45, 244, 96, 45, 244, 95, 45, 244, 94, + 45, 244, 93, 45, 244, 92, 45, 244, 91, 45, 244, 90, 45, 244, 89, 45, 244, + 88, 45, 244, 87, 45, 244, 86, 45, 244, 85, 45, 244, 84, 45, 244, 83, 45, + 244, 82, 45, 244, 81, 45, 244, 80, 45, 244, 79, 45, 244, 78, 45, 244, 77, + 45, 244, 76, 45, 244, 75, 45, 244, 74, 45, 244, 73, 45, 244, 72, 45, 244, + 71, 45, 244, 70, 45, 244, 69, 45, 244, 68, 45, 244, 67, 45, 244, 66, 45, + 244, 65, 45, 244, 64, 45, 244, 63, 45, 244, 62, 45, 244, 61, 45, 244, 60, + 45, 244, 59, 45, 244, 58, 45, 244, 57, 45, 244, 56, 45, 244, 55, 45, 244, + 54, 45, 244, 53, 45, 244, 52, 45, 244, 51, 45, 244, 50, 45, 244, 49, 45, + 244, 48, 45, 244, 47, 45, 244, 46, 45, 244, 45, 45, 244, 44, 45, 244, 43, + 45, 244, 42, 45, 244, 41, 45, 244, 40, 45, 244, 39, 45, 244, 38, 45, 244, + 37, 45, 244, 36, 45, 244, 35, 45, 244, 34, 45, 244, 33, 45, 244, 32, 45, + 244, 31, 45, 244, 30, 45, 244, 29, 45, 244, 28, 45, 244, 27, 45, 244, 26, + 45, 244, 25, 45, 244, 24, 45, 244, 23, 45, 244, 22, 45, 244, 21, 45, 244, + 20, 45, 244, 19, 45, 244, 18, 45, 244, 17, 45, 244, 16, 45, 244, 15, 45, + 244, 14, 45, 244, 13, 45, 244, 12, 45, 244, 11, 45, 244, 10, 45, 244, 9, + 45, 244, 8, 45, 244, 7, 45, 244, 6, 45, 244, 5, 45, 244, 4, 45, 244, 3, + 45, 244, 2, 45, 244, 1, 45, 244, 0, 45, 243, 255, 45, 243, 254, 45, 243, + 253, 45, 243, 252, 45, 243, 251, 45, 243, 250, 45, 243, 249, 45, 243, + 248, 45, 243, 247, 45, 243, 246, 45, 243, 245, 45, 243, 244, 45, 243, + 243, 45, 243, 242, 45, 243, 241, 45, 243, 240, 45, 243, 239, 45, 243, + 238, 45, 243, 237, 45, 243, 236, 45, 243, 235, 45, 243, 234, 45, 243, + 233, 45, 243, 232, 45, 243, 231, 45, 243, 230, 45, 243, 229, 45, 243, + 228, 45, 243, 227, 45, 243, 226, 45, 243, 225, 45, 243, 224, 45, 243, + 223, 45, 243, 222, 45, 243, 221, 45, 243, 220, 45, 243, 219, 45, 243, + 218, 45, 243, 217, 45, 243, 216, 45, 243, 215, 45, 243, 214, 45, 243, + 213, 45, 243, 212, 45, 243, 211, 45, 243, 210, 45, 243, 209, 45, 243, + 208, 45, 243, 207, 45, 243, 206, 45, 243, 205, 45, 243, 204, 45, 243, + 203, 45, 243, 202, 45, 243, 201, 45, 243, 200, 45, 243, 199, 45, 243, + 198, 45, 243, 197, 45, 243, 196, 45, 243, 195, 45, 243, 194, 45, 243, + 193, 45, 243, 192, 45, 243, 191, 45, 243, 190, 45, 243, 189, 45, 243, + 188, 45, 243, 187, 45, 243, 186, 45, 243, 185, 45, 243, 184, 45, 243, + 183, 45, 243, 182, 45, 243, 181, 45, 243, 180, 45, 243, 179, 45, 243, + 178, 45, 243, 177, 45, 243, 176, 45, 243, 175, 45, 243, 174, 45, 243, + 173, 45, 243, 172, 45, 243, 171, 45, 243, 170, 45, 243, 169, 45, 243, + 168, 45, 243, 167, 45, 243, 166, 45, 243, 165, 45, 243, 164, 45, 243, + 163, 45, 243, 162, 45, 243, 161, 45, 243, 160, 45, 243, 159, 45, 243, + 158, 45, 243, 157, 45, 243, 156, 45, 243, 155, 45, 243, 154, 45, 243, + 153, 45, 243, 152, 45, 243, 151, 45, 243, 150, 45, 243, 149, 45, 243, + 148, 45, 243, 147, 45, 243, 146, 45, 243, 145, 45, 243, 144, 45, 243, + 143, 45, 243, 142, 45, 243, 141, 45, 243, 140, 45, 243, 139, 45, 243, + 138, 45, 243, 137, 45, 243, 136, 45, 243, 135, 45, 243, 134, 45, 243, + 133, 45, 243, 132, 45, 243, 131, 45, 243, 130, 45, 243, 129, 45, 243, + 128, 45, 243, 127, 45, 243, 126, 45, 243, 125, 45, 243, 124, 45, 243, + 123, 45, 243, 122, 45, 243, 121, 45, 243, 120, 45, 243, 119, 45, 243, + 118, 45, 243, 117, 45, 243, 116, 45, 243, 115, 45, 243, 114, 45, 243, + 113, 45, 243, 112, 45, 243, 111, 45, 243, 110, 45, 243, 109, 45, 243, + 108, 45, 243, 107, 45, 243, 106, 45, 243, 105, 45, 243, 104, 45, 243, + 103, 45, 243, 102, 45, 243, 101, 45, 243, 100, 45, 243, 99, 45, 243, 98, + 45, 243, 97, 45, 243, 96, 45, 243, 95, 45, 243, 94, 45, 243, 93, 45, 243, + 92, 45, 243, 91, 45, 243, 90, 45, 243, 89, 45, 243, 88, 45, 243, 87, 45, + 243, 86, 45, 243, 85, 45, 243, 84, 45, 243, 83, 45, 243, 82, 45, 243, 81, + 45, 243, 80, 45, 243, 79, 45, 243, 78, 45, 243, 77, 45, 243, 76, 45, 243, + 75, 45, 243, 74, 45, 243, 73, 45, 243, 72, 45, 243, 71, 45, 243, 70, 45, + 243, 69, 45, 243, 68, 45, 243, 67, 45, 243, 66, 45, 243, 65, 45, 243, 64, + 45, 243, 63, 45, 243, 62, 45, 243, 61, 45, 243, 60, 45, 243, 59, 45, 243, + 58, 45, 243, 57, 45, 243, 56, 45, 243, 55, 45, 243, 54, 45, 243, 53, 45, + 243, 52, 45, 243, 51, 45, 243, 50, 45, 243, 49, 45, 243, 48, 45, 243, 47, + 45, 243, 46, 45, 243, 45, 45, 243, 44, 45, 243, 43, 45, 243, 42, 45, 243, + 41, 45, 243, 40, 45, 243, 39, 45, 243, 38, 45, 243, 37, 45, 243, 36, 45, + 243, 35, 45, 243, 34, 45, 243, 33, 45, 243, 32, 45, 243, 31, 45, 243, 30, + 45, 243, 29, 45, 243, 28, 45, 243, 27, 45, 243, 26, 45, 243, 25, 45, 243, + 24, 45, 243, 23, 45, 243, 22, 45, 243, 21, 45, 243, 20, 45, 243, 19, 45, + 243, 18, 45, 243, 17, 45, 243, 16, 45, 243, 15, 45, 243, 14, 45, 243, 13, + 45, 243, 12, 45, 243, 11, 45, 243, 10, 45, 243, 9, 45, 243, 8, 45, 243, + 7, 45, 243, 6, 45, 243, 5, 45, 243, 4, 45, 243, 3, 45, 243, 2, 45, 243, + 1, 121, 1, 230, 124, 121, 1, 193, 223, 121, 1, 211, 93, 121, 1, 200, 228, + 121, 1, 233, 163, 121, 1, 222, 184, 121, 1, 165, 121, 1, 249, 226, 121, + 1, 238, 95, 121, 1, 196, 236, 121, 1, 232, 44, 121, 1, 150, 121, 1, 211, + 94, 215, 151, 121, 1, 238, 96, 206, 158, 121, 1, 233, 164, 215, 151, 121, + 1, 222, 185, 218, 236, 121, 1, 208, 112, 206, 158, 121, 1, 199, 242, 121, + 1, 202, 246, 237, 41, 121, 1, 237, 41, 121, 1, 221, 140, 121, 1, 202, + 246, 223, 65, 121, 1, 229, 132, 121, 1, 219, 223, 121, 1, 207, 157, 121, + 1, 218, 236, 121, 1, 215, 151, 121, 1, 223, 65, 121, 1, 206, 158, 121, 1, + 218, 237, 215, 151, 121, 1, 215, 152, 218, 236, 121, 1, 223, 66, 218, + 236, 121, 1, 206, 159, 223, 65, 121, 1, 218, 237, 4, 236, 114, 121, 1, + 215, 152, 4, 236, 114, 121, 1, 223, 66, 4, 236, 114, 121, 1, 223, 66, 4, + 236, 112, 223, 146, 26, 58, 121, 1, 206, 159, 4, 236, 114, 121, 1, 206, + 159, 4, 78, 63, 121, 1, 218, 237, 206, 158, 121, 1, 215, 152, 206, 158, + 121, 1, 223, 66, 206, 158, 121, 1, 206, 159, 206, 158, 121, 1, 218, 237, + 215, 152, 206, 158, 121, 1, 215, 152, 218, 237, 206, 158, 121, 1, 223, + 66, 218, 237, 206, 158, 121, 1, 206, 159, 223, 66, 206, 158, 121, 1, 223, + 66, 206, 159, 4, 236, 114, 121, 1, 223, 66, 215, 151, 121, 1, 223, 66, + 215, 152, 206, 158, 121, 1, 206, 159, 200, 228, 121, 1, 206, 159, 200, + 229, 150, 121, 1, 206, 159, 211, 93, 121, 1, 206, 159, 211, 94, 150, 121, + 1, 200, 229, 206, 158, 121, 1, 200, 229, 208, 112, 206, 158, 121, 1, 194, + 202, 121, 1, 194, 83, 121, 1, 194, 203, 150, 121, 1, 206, 159, 215, 151, + 121, 1, 206, 159, 218, 236, 121, 1, 222, 185, 208, 112, 206, 158, 121, 1, + 232, 45, 208, 112, 206, 158, 121, 1, 206, 159, 222, 184, 121, 1, 206, + 159, 222, 185, 150, 121, 1, 64, 121, 1, 202, 246, 211, 106, 121, 1, 212, + 26, 121, 1, 74, 121, 1, 250, 164, 121, 1, 70, 121, 1, 71, 121, 1, 223, + 251, 121, 1, 203, 195, 70, 121, 1, 197, 95, 121, 1, 234, 171, 121, 1, + 202, 246, 234, 157, 121, 1, 207, 29, 70, 121, 1, 202, 246, 234, 171, 121, + 1, 184, 70, 121, 1, 193, 69, 121, 1, 68, 121, 1, 233, 230, 121, 1, 193, + 171, 121, 1, 124, 215, 151, 121, 1, 184, 68, 121, 1, 207, 29, 68, 121, 1, + 197, 97, 121, 1, 202, 246, 68, 121, 1, 211, 191, 121, 1, 211, 106, 121, + 1, 211, 130, 121, 1, 194, 169, 121, 1, 194, 36, 121, 1, 194, 72, 121, 1, + 194, 98, 121, 1, 194, 2, 121, 1, 215, 49, 68, 121, 1, 215, 49, 74, 121, + 1, 215, 49, 70, 121, 1, 215, 49, 64, 121, 1, 210, 122, 250, 224, 121, 1, + 210, 122, 250, 241, 121, 1, 202, 246, 234, 88, 121, 1, 202, 246, 250, + 224, 121, 1, 202, 246, 211, 211, 121, 1, 118, 218, 236, 121, 251, 87, 46, + 229, 5, 205, 213, 121, 251, 87, 216, 162, 229, 5, 205, 213, 121, 251, 87, + 51, 229, 5, 205, 213, 121, 251, 87, 132, 84, 205, 213, 121, 251, 87, 216, + 162, 84, 205, 213, 121, 251, 87, 139, 84, 205, 213, 121, 251, 87, 250, + 14, 205, 213, 121, 251, 87, 250, 14, 220, 19, 205, 213, 121, 251, 87, + 250, 14, 200, 120, 121, 251, 87, 250, 14, 200, 147, 121, 251, 87, 250, + 14, 234, 253, 128, 121, 251, 87, 250, 14, 228, 97, 128, 121, 251, 87, + 250, 14, 200, 121, 128, 121, 251, 87, 139, 251, 129, 121, 251, 87, 139, + 199, 107, 251, 129, 121, 251, 87, 139, 230, 210, 121, 251, 87, 139, 184, + 230, 210, 121, 251, 87, 139, 236, 114, 121, 251, 87, 139, 242, 130, 121, + 251, 87, 139, 219, 175, 121, 251, 87, 139, 194, 124, 121, 251, 87, 139, + 196, 105, 121, 251, 87, 132, 251, 129, 121, 251, 87, 132, 199, 107, 251, + 129, 121, 251, 87, 132, 230, 210, 121, 251, 87, 132, 184, 230, 210, 121, + 251, 87, 132, 236, 114, 121, 251, 87, 132, 242, 130, 121, 251, 87, 132, + 219, 175, 121, 251, 87, 132, 194, 124, 121, 251, 87, 132, 196, 105, 121, + 251, 87, 132, 54, 121, 3, 185, 4, 238, 183, 121, 199, 200, 1, 205, 189, + 121, 55, 77, 121, 209, 38, 242, 198, 232, 71, 201, 238, 203, 182, 232, + 135, 1, 211, 113, 203, 182, 232, 135, 238, 249, 211, 113, 203, 182, 232, + 135, 142, 201, 253, 203, 182, 232, 135, 130, 201, 253, 69, 35, 16, 209, + 55, 69, 35, 16, 237, 187, 69, 35, 16, 210, 126, 69, 35, 16, 211, 102, + 234, 128, 69, 35, 16, 211, 102, 236, 210, 69, 35, 16, 196, 141, 234, 128, + 69, 35, 16, 196, 141, 236, 210, 69, 35, 16, 222, 78, 69, 35, 16, 200, + 245, 69, 35, 16, 210, 237, 69, 35, 16, 192, 220, 69, 35, 16, 192, 221, + 236, 210, 69, 35, 16, 221, 51, 69, 35, 16, 250, 159, 234, 128, 69, 35, + 16, 233, 198, 234, 128, 69, 35, 16, 200, 43, 69, 35, 16, 222, 26, 69, 35, + 16, 250, 148, 69, 35, 16, 250, 149, 236, 210, 69, 35, 16, 200, 252, 69, + 35, 16, 199, 179, 69, 35, 16, 211, 222, 250, 110, 69, 35, 16, 230, 237, + 250, 110, 69, 35, 16, 209, 54, 69, 35, 16, 246, 108, 69, 35, 16, 196, + 130, 69, 35, 16, 223, 87, 250, 110, 69, 35, 16, 222, 28, 250, 110, 69, + 35, 16, 222, 27, 250, 110, 69, 35, 16, 206, 3, 69, 35, 16, 210, 227, 69, + 35, 16, 202, 7, 250, 152, 69, 35, 16, 211, 101, 250, 110, 69, 35, 16, + 196, 140, 250, 110, 69, 35, 16, 250, 153, 250, 110, 69, 35, 16, 250, 146, + 69, 35, 16, 221, 130, 69, 35, 16, 207, 164, 69, 35, 16, 210, 49, 250, + 110, 69, 35, 16, 199, 80, 69, 35, 16, 250, 220, 69, 35, 16, 205, 192, 69, + 35, 16, 201, 0, 250, 110, 69, 35, 16, 201, 0, 216, 241, 202, 5, 69, 35, + 16, 211, 96, 250, 110, 69, 35, 16, 199, 218, 69, 35, 16, 220, 6, 69, 35, + 16, 235, 20, 69, 35, 16, 198, 187, 69, 35, 16, 200, 11, 69, 35, 16, 221, + 54, 69, 35, 16, 250, 159, 233, 198, 214, 192, 69, 35, 16, 232, 79, 250, + 110, 69, 35, 16, 223, 203, 69, 35, 16, 198, 156, 250, 110, 69, 35, 16, + 222, 81, 198, 155, 69, 35, 16, 210, 156, 69, 35, 16, 209, 59, 69, 35, 16, + 221, 89, 69, 35, 16, 242, 180, 250, 110, 69, 35, 16, 208, 27, 69, 35, 16, + 210, 240, 250, 110, 69, 35, 16, 210, 238, 250, 110, 69, 35, 16, 228, 47, + 69, 35, 16, 215, 60, 69, 35, 16, 210, 104, 69, 35, 16, 221, 90, 251, 3, + 69, 35, 16, 198, 156, 251, 3, 69, 35, 16, 201, 232, 69, 35, 16, 230, 196, + 69, 35, 16, 223, 87, 214, 192, 69, 35, 16, 211, 222, 214, 192, 69, 35, + 16, 211, 102, 214, 192, 69, 35, 16, 210, 103, 69, 35, 16, 221, 74, 69, + 35, 16, 210, 102, 69, 35, 16, 221, 53, 69, 35, 16, 210, 157, 214, 192, + 69, 35, 16, 222, 27, 214, 193, 250, 190, 69, 35, 16, 222, 28, 214, 193, + 250, 190, 69, 35, 16, 192, 218, 69, 35, 16, 250, 149, 214, 192, 69, 35, + 16, 250, 150, 200, 253, 214, 192, 69, 35, 16, 192, 219, 69, 35, 16, 221, + 52, 69, 35, 16, 234, 123, 69, 35, 16, 246, 109, 69, 35, 16, 216, 133, + 223, 86, 69, 35, 16, 196, 141, 214, 192, 69, 35, 16, 210, 49, 214, 192, + 69, 35, 16, 209, 60, 214, 192, 69, 35, 16, 211, 218, 69, 35, 16, 250, + 177, 69, 35, 16, 218, 247, 69, 35, 16, 210, 238, 214, 192, 69, 35, 16, + 210, 240, 214, 192, 69, 35, 16, 233, 236, 210, 239, 69, 35, 16, 220, 206, + 69, 35, 16, 250, 178, 69, 35, 16, 198, 156, 214, 192, 69, 35, 16, 234, + 126, 69, 35, 16, 201, 0, 214, 192, 69, 35, 16, 200, 246, 69, 35, 16, 242, + 180, 214, 192, 69, 35, 16, 234, 38, 69, 35, 16, 205, 193, 214, 192, 69, + 35, 16, 193, 188, 221, 130, 69, 35, 16, 198, 153, 69, 35, 16, 209, 61, + 69, 35, 16, 198, 157, 69, 35, 16, 198, 154, 69, 35, 16, 209, 58, 69, 35, + 16, 198, 152, 69, 35, 16, 209, 57, 69, 35, 16, 230, 236, 69, 35, 16, 250, + 102, 69, 35, 16, 233, 236, 250, 102, 69, 35, 16, 211, 96, 214, 192, 69, + 35, 16, 199, 217, 233, 249, 69, 35, 16, 199, 217, 233, 197, 69, 35, 16, + 199, 219, 250, 154, 69, 35, 16, 199, 211, 222, 136, 250, 145, 69, 35, 16, + 222, 80, 69, 35, 16, 234, 75, 69, 35, 16, 193, 27, 222, 77, 69, 35, 16, + 193, 27, 250, 190, 69, 35, 16, 202, 6, 69, 35, 16, 221, 131, 250, 190, + 69, 35, 16, 236, 211, 250, 110, 69, 35, 16, 221, 55, 250, 110, 69, 35, + 16, 221, 55, 251, 3, 69, 35, 16, 221, 55, 214, 192, 69, 35, 16, 250, 153, + 214, 192, 69, 35, 16, 250, 155, 69, 35, 16, 236, 210, 69, 35, 16, 198, + 168, 69, 35, 16, 200, 1, 69, 35, 16, 221, 78, 69, 35, 16, 220, 11, 234, + 68, 242, 170, 69, 35, 16, 220, 11, 235, 21, 242, 171, 69, 35, 16, 220, + 11, 198, 171, 242, 171, 69, 35, 16, 220, 11, 200, 13, 242, 171, 69, 35, + 16, 220, 11, 223, 198, 242, 170, 69, 35, 16, 230, 237, 214, 193, 250, + 190, 69, 35, 16, 230, 237, 210, 228, 250, 98, 69, 35, 16, 230, 237, 210, + 228, 237, 45, 69, 35, 16, 236, 235, 69, 35, 16, 236, 236, 210, 228, 250, + 99, 222, 77, 69, 35, 16, 236, 236, 210, 228, 250, 99, 250, 190, 69, 35, + 16, 236, 236, 210, 228, 237, 45, 69, 35, 16, 198, 176, 69, 35, 16, 250, + 103, 69, 35, 16, 223, 205, 69, 35, 16, 237, 2, 69, 35, 16, 251, 74, 209, + 181, 250, 104, 69, 35, 16, 251, 74, 250, 101, 69, 35, 16, 251, 74, 250, + 104, 69, 35, 16, 251, 74, 216, 235, 69, 35, 16, 251, 74, 216, 246, 69, + 35, 16, 251, 74, 230, 238, 69, 35, 16, 251, 74, 230, 235, 69, 35, 16, + 251, 74, 209, 181, 230, 238, 69, 35, 16, 217, 116, 209, 67, 228, 45, 69, + 35, 16, 217, 116, 251, 5, 209, 67, 228, 45, 69, 35, 16, 217, 116, 237, + 44, 228, 45, 69, 35, 16, 217, 116, 251, 5, 237, 44, 228, 45, 69, 35, 16, + 217, 116, 198, 163, 228, 45, 69, 35, 16, 217, 116, 198, 177, 69, 35, 16, + 217, 116, 200, 6, 228, 45, 69, 35, 16, 217, 116, 200, 6, 220, 15, 228, + 45, 69, 35, 16, 217, 116, 220, 15, 228, 45, 69, 35, 16, 217, 116, 209, + 229, 228, 45, 69, 35, 16, 223, 94, 200, 36, 228, 46, 69, 35, 16, 250, + 150, 200, 36, 228, 46, 69, 35, 16, 233, 67, 200, 3, 69, 35, 16, 233, 67, + 216, 46, 69, 35, 16, 233, 67, 236, 241, 69, 35, 16, 217, 116, 196, 134, + 228, 45, 69, 35, 16, 217, 116, 209, 66, 228, 45, 69, 35, 16, 217, 116, + 209, 229, 200, 6, 228, 45, 69, 35, 16, 230, 232, 215, 152, 250, 154, 69, + 35, 16, 230, 232, 215, 152, 236, 209, 69, 35, 16, 234, 86, 222, 136, 232, + 79, 195, 231, 69, 35, 16, 223, 204, 69, 35, 16, 223, 202, 69, 35, 16, + 232, 79, 250, 111, 237, 43, 228, 44, 69, 35, 16, 232, 79, 237, 0, 166, + 69, 35, 16, 232, 79, 237, 0, 215, 60, 69, 35, 16, 232, 79, 215, 54, 228, + 45, 69, 35, 16, 232, 79, 237, 0, 237, 16, 69, 35, 16, 232, 79, 203, 12, + 236, 255, 237, 16, 69, 35, 16, 232, 79, 237, 0, 222, 57, 69, 35, 16, 232, + 79, 237, 0, 192, 8, 69, 35, 16, 232, 79, 237, 0, 214, 61, 222, 77, 69, + 35, 16, 232, 79, 237, 0, 214, 61, 250, 190, 69, 35, 16, 232, 79, 217, + 167, 242, 172, 236, 241, 69, 35, 16, 232, 79, 217, 167, 242, 172, 216, + 46, 69, 35, 16, 233, 12, 203, 12, 242, 172, 196, 133, 69, 35, 16, 232, + 79, 203, 12, 242, 172, 201, 1, 69, 35, 16, 232, 79, 214, 195, 69, 35, 16, + 242, 173, 191, 231, 69, 35, 16, 242, 173, 221, 129, 69, 35, 16, 242, 173, + 202, 151, 69, 35, 16, 232, 79, 228, 97, 193, 26, 200, 7, 69, 35, 16, 232, + 79, 234, 87, 250, 179, 69, 35, 16, 193, 26, 198, 164, 69, 35, 16, 236, + 249, 198, 164, 69, 35, 16, 236, 249, 200, 7, 69, 35, 16, 236, 249, 250, + 156, 235, 21, 236, 138, 69, 35, 16, 236, 249, 216, 44, 200, 12, 236, 138, + 69, 35, 16, 236, 249, 236, 232, 233, 210, 236, 138, 69, 35, 16, 236, 249, + 198, 174, 211, 228, 236, 138, 69, 35, 16, 193, 26, 250, 156, 235, 21, + 236, 138, 69, 35, 16, 193, 26, 216, 44, 200, 12, 236, 138, 69, 35, 16, + 193, 26, 236, 232, 233, 210, 236, 138, 69, 35, 16, 193, 26, 198, 174, + 211, 228, 236, 138, 69, 35, 16, 231, 140, 236, 248, 69, 35, 16, 231, 140, + 193, 25, 69, 35, 16, 237, 1, 250, 156, 216, 134, 69, 35, 16, 237, 1, 250, + 156, 217, 20, 69, 35, 16, 237, 1, 236, 210, 69, 35, 16, 237, 1, 199, 209, + 69, 35, 16, 203, 85, 199, 209, 69, 35, 16, 203, 85, 199, 210, 236, 193, + 69, 35, 16, 203, 85, 199, 210, 198, 165, 69, 35, 16, 203, 85, 199, 210, + 199, 255, 69, 35, 16, 203, 85, 250, 70, 69, 35, 16, 203, 85, 250, 71, + 236, 193, 69, 35, 16, 203, 85, 250, 71, 198, 165, 69, 35, 16, 203, 85, + 250, 71, 199, 255, 69, 35, 16, 236, 233, 231, 121, 69, 35, 16, 236, 240, + 211, 130, 69, 35, 16, 201, 248, 69, 35, 16, 250, 95, 166, 69, 35, 16, + 250, 95, 195, 231, 69, 35, 16, 250, 95, 231, 233, 69, 35, 16, 250, 95, + 237, 16, 69, 35, 16, 250, 95, 222, 57, 69, 35, 16, 250, 95, 192, 8, 69, + 35, 16, 250, 95, 214, 60, 69, 35, 16, 222, 27, 214, 193, 216, 245, 69, + 35, 16, 222, 28, 214, 193, 216, 245, 69, 35, 16, 222, 27, 214, 193, 222, + 77, 69, 35, 16, 222, 28, 214, 193, 222, 77, 69, 35, 16, 221, 131, 222, + 77, 69, 35, 16, 230, 237, 214, 193, 222, 77, 35, 16, 203, 74, 248, 189, + 35, 16, 55, 248, 189, 35, 16, 52, 248, 189, 35, 16, 207, 169, 52, 248, + 189, 35, 16, 237, 184, 248, 189, 35, 16, 203, 195, 248, 189, 35, 16, 46, + 207, 199, 57, 35, 16, 51, 207, 199, 57, 35, 16, 207, 199, 236, 111, 35, + 16, 237, 228, 205, 196, 35, 16, 238, 1, 246, 223, 35, 16, 205, 196, 35, + 16, 242, 56, 35, 16, 207, 197, 232, 255, 35, 16, 207, 197, 232, 254, 35, + 16, 207, 197, 232, 253, 35, 16, 233, 22, 35, 16, 233, 23, 63, 35, 16, + 247, 152, 77, 35, 16, 247, 9, 35, 16, 247, 166, 35, 16, 186, 35, 16, 211, + 206, 202, 28, 35, 16, 197, 219, 202, 28, 35, 16, 199, 155, 202, 28, 35, + 16, 232, 118, 202, 28, 35, 16, 232, 213, 202, 28, 35, 16, 203, 40, 202, + 28, 35, 16, 203, 38, 232, 96, 35, 16, 232, 116, 232, 96, 35, 16, 232, 45, + 242, 99, 35, 16, 232, 45, 242, 100, 211, 134, 250, 250, 35, 16, 232, 45, + 242, 100, 211, 134, 248, 172, 35, 16, 247, 53, 242, 99, 35, 16, 233, 164, + 242, 99, 35, 16, 233, 164, 242, 100, 211, 134, 250, 250, 35, 16, 233, + 164, 242, 100, 211, 134, 248, 172, 35, 16, 235, 68, 242, 98, 35, 16, 235, + 68, 242, 97, 35, 16, 215, 216, 217, 44, 207, 180, 35, 16, 55, 204, 25, + 35, 16, 55, 232, 195, 35, 16, 232, 196, 197, 41, 35, 16, 232, 196, 235, + 96, 35, 16, 215, 43, 197, 41, 35, 16, 215, 43, 235, 96, 35, 16, 204, 26, + 197, 41, 35, 16, 204, 26, 235, 96, 35, 16, 208, 168, 158, 204, 25, 35, + 16, 208, 168, 158, 232, 195, 35, 16, 242, 35, 199, 84, 35, 16, 238, 122, + 199, 84, 35, 16, 211, 134, 250, 250, 35, 16, 211, 134, 248, 172, 35, 16, + 208, 149, 250, 250, 35, 16, 208, 149, 248, 172, 35, 16, 215, 219, 207, + 180, 35, 16, 194, 73, 207, 180, 35, 16, 138, 207, 180, 35, 16, 208, 168, + 207, 180, 35, 16, 234, 144, 207, 180, 35, 16, 203, 34, 207, 180, 35, 16, + 199, 181, 207, 180, 35, 16, 203, 24, 207, 180, 35, 16, 90, 228, 163, 197, + 237, 207, 180, 35, 16, 193, 224, 213, 101, 35, 16, 102, 213, 101, 35, 16, + 242, 131, 193, 224, 213, 101, 35, 16, 50, 213, 102, 194, 75, 35, 16, 50, + 213, 102, 247, 248, 35, 16, 198, 186, 213, 102, 130, 194, 75, 35, 16, + 198, 186, 213, 102, 130, 247, 248, 35, 16, 198, 186, 213, 102, 46, 194, + 75, 35, 16, 198, 186, 213, 102, 46, 247, 248, 35, 16, 198, 186, 213, 102, + 51, 194, 75, 35, 16, 198, 186, 213, 102, 51, 247, 248, 35, 16, 198, 186, + 213, 102, 142, 194, 75, 35, 16, 198, 186, 213, 102, 142, 247, 248, 35, + 16, 198, 186, 213, 102, 130, 51, 194, 75, 35, 16, 198, 186, 213, 102, + 130, 51, 247, 248, 35, 16, 216, 30, 213, 102, 194, 75, 35, 16, 216, 30, + 213, 102, 247, 248, 35, 16, 198, 183, 213, 102, 142, 194, 75, 35, 16, + 198, 183, 213, 102, 142, 247, 248, 35, 16, 210, 231, 213, 101, 35, 16, + 195, 245, 213, 101, 35, 16, 213, 102, 247, 248, 35, 16, 212, 239, 213, + 101, 35, 16, 242, 68, 213, 102, 194, 75, 35, 16, 242, 68, 213, 102, 247, + 248, 35, 16, 247, 150, 35, 16, 194, 73, 213, 105, 35, 16, 138, 213, 105, + 35, 16, 208, 168, 213, 105, 35, 16, 234, 144, 213, 105, 35, 16, 203, 34, + 213, 105, 35, 16, 199, 181, 213, 105, 35, 16, 203, 24, 213, 105, 35, 16, + 90, 228, 163, 197, 237, 213, 105, 35, 16, 38, 201, 255, 35, 16, 38, 202, + 113, 201, 255, 35, 16, 38, 198, 194, 35, 16, 38, 198, 193, 35, 16, 38, + 198, 192, 35, 16, 232, 238, 198, 194, 35, 16, 232, 238, 198, 193, 35, 16, + 232, 238, 198, 192, 35, 16, 38, 250, 5, 236, 114, 35, 16, 38, 232, 205, + 35, 16, 38, 232, 204, 35, 16, 38, 232, 203, 35, 16, 38, 232, 202, 35, 16, + 38, 232, 201, 35, 16, 248, 100, 248, 120, 35, 16, 234, 80, 248, 120, 35, + 16, 248, 100, 199, 113, 35, 16, 234, 80, 199, 113, 35, 16, 248, 100, 202, + 237, 35, 16, 234, 80, 202, 237, 35, 16, 248, 100, 210, 58, 35, 16, 234, + 80, 210, 58, 35, 16, 38, 251, 143, 35, 16, 38, 202, 32, 35, 16, 38, 200, + 18, 35, 16, 38, 202, 33, 35, 16, 38, 217, 131, 35, 16, 38, 217, 130, 35, + 16, 38, 251, 142, 35, 16, 38, 219, 54, 35, 16, 250, 83, 197, 41, 35, 16, + 250, 83, 235, 96, 35, 16, 38, 236, 130, 35, 16, 38, 207, 77, 35, 16, 38, + 232, 184, 35, 16, 38, 202, 233, 35, 16, 38, 248, 78, 35, 16, 38, 55, 199, + 0, 35, 16, 38, 198, 170, 199, 0, 35, 16, 207, 83, 35, 16, 201, 166, 35, + 16, 192, 155, 35, 16, 210, 50, 35, 16, 216, 226, 35, 16, 232, 130, 35, + 16, 238, 195, 35, 16, 237, 102, 35, 16, 230, 227, 213, 106, 203, 4, 35, + 16, 230, 227, 213, 106, 213, 143, 203, 4, 35, 16, 198, 224, 35, 16, 198, + 9, 35, 16, 223, 121, 198, 9, 35, 16, 198, 10, 203, 4, 35, 16, 198, 10, + 197, 41, 35, 16, 211, 151, 201, 207, 35, 16, 211, 151, 201, 204, 35, 16, + 211, 151, 201, 203, 35, 16, 211, 151, 201, 202, 35, 16, 211, 151, 201, + 201, 35, 16, 211, 151, 201, 200, 35, 16, 211, 151, 201, 199, 35, 16, 211, + 151, 201, 198, 35, 16, 211, 151, 201, 197, 35, 16, 211, 151, 201, 206, + 35, 16, 211, 151, 201, 205, 35, 16, 230, 10, 35, 16, 214, 206, 35, 16, + 234, 80, 80, 201, 244, 35, 16, 237, 95, 203, 4, 35, 16, 38, 142, 247, + 180, 35, 16, 38, 130, 247, 180, 35, 16, 38, 230, 23, 35, 16, 38, 202, + 223, 209, 235, 35, 16, 210, 173, 77, 35, 16, 210, 173, 130, 77, 35, 16, + 138, 210, 173, 77, 35, 16, 231, 8, 197, 41, 35, 16, 231, 8, 235, 96, 35, + 16, 4, 232, 237, 35, 16, 237, 211, 35, 16, 237, 212, 251, 8, 35, 16, 217, + 94, 35, 16, 219, 75, 35, 16, 247, 147, 35, 16, 204, 184, 194, 75, 35, 16, + 204, 184, 247, 248, 35, 16, 216, 116, 35, 16, 216, 117, 247, 248, 35, 16, + 204, 178, 194, 75, 35, 16, 204, 178, 247, 248, 35, 16, 232, 62, 194, 75, + 35, 16, 232, 62, 247, 248, 35, 16, 219, 76, 210, 131, 207, 180, 35, 16, + 219, 76, 223, 195, 207, 180, 35, 16, 247, 148, 207, 180, 35, 16, 204, + 184, 207, 180, 35, 16, 216, 117, 207, 180, 35, 16, 204, 178, 207, 180, + 35, 16, 200, 32, 210, 129, 238, 153, 209, 77, 210, 130, 35, 16, 200, 32, + 210, 129, 238, 153, 209, 77, 223, 194, 35, 16, 200, 32, 210, 129, 238, + 153, 209, 77, 210, 131, 236, 220, 35, 16, 200, 32, 223, 193, 238, 153, + 209, 77, 210, 130, 35, 16, 200, 32, 223, 193, 238, 153, 209, 77, 223, + 194, 35, 16, 200, 32, 223, 193, 238, 153, 209, 77, 223, 195, 236, 220, + 35, 16, 200, 32, 223, 193, 238, 153, 209, 77, 223, 195, 236, 219, 35, 16, + 200, 32, 223, 193, 238, 153, 209, 77, 223, 195, 236, 218, 35, 16, 238, + 186, 35, 16, 230, 199, 247, 53, 242, 99, 35, 16, 230, 199, 233, 164, 242, + 99, 35, 16, 50, 249, 226, 35, 16, 196, 10, 35, 16, 209, 195, 35, 16, 242, + 89, 35, 16, 205, 249, 35, 16, 242, 94, 35, 16, 198, 242, 35, 16, 209, + 163, 35, 16, 209, 164, 232, 187, 35, 16, 205, 250, 232, 187, 35, 16, 198, + 243, 207, 177, 35, 16, 210, 112, 201, 156, 35, 16, 221, 186, 247, 53, + 242, 99, 35, 16, 221, 186, 234, 80, 80, 210, 42, 35, 16, 221, 186, 52, + 213, 105, 35, 16, 221, 186, 207, 249, 77, 35, 16, 221, 186, 194, 73, 213, + 105, 35, 16, 221, 186, 138, 213, 105, 35, 16, 221, 186, 208, 168, 213, + 106, 202, 0, 235, 96, 35, 16, 221, 186, 208, 168, 213, 106, 202, 0, 197, + 41, 35, 16, 221, 186, 234, 144, 213, 106, 202, 0, 235, 96, 35, 16, 221, + 186, 234, 144, 213, 106, 202, 0, 197, 41, 35, 16, 221, 186, 232, 196, 57, + 33, 195, 251, 213, 109, 201, 52, 33, 195, 251, 213, 109, 201, 41, 33, + 195, 251, 213, 109, 201, 31, 33, 195, 251, 213, 109, 201, 24, 33, 195, + 251, 213, 109, 201, 16, 33, 195, 251, 213, 109, 201, 10, 33, 195, 251, + 213, 109, 201, 9, 33, 195, 251, 213, 109, 201, 8, 33, 195, 251, 213, 109, + 201, 7, 33, 195, 251, 213, 109, 201, 51, 33, 195, 251, 213, 109, 201, 50, + 33, 195, 251, 213, 109, 201, 49, 33, 195, 251, 213, 109, 201, 48, 33, + 195, 251, 213, 109, 201, 47, 33, 195, 251, 213, 109, 201, 46, 33, 195, + 251, 213, 109, 201, 45, 33, 195, 251, 213, 109, 201, 44, 33, 195, 251, + 213, 109, 201, 43, 33, 195, 251, 213, 109, 201, 42, 33, 195, 251, 213, + 109, 201, 40, 33, 195, 251, 213, 109, 201, 39, 33, 195, 251, 213, 109, + 201, 38, 33, 195, 251, 213, 109, 201, 37, 33, 195, 251, 213, 109, 201, + 36, 33, 195, 251, 213, 109, 201, 15, 33, 195, 251, 213, 109, 201, 14, 33, + 195, 251, 213, 109, 201, 13, 33, 195, 251, 213, 109, 201, 12, 33, 195, + 251, 213, 109, 201, 11, 33, 223, 144, 213, 109, 201, 52, 33, 223, 144, + 213, 109, 201, 41, 33, 223, 144, 213, 109, 201, 24, 33, 223, 144, 213, + 109, 201, 16, 33, 223, 144, 213, 109, 201, 9, 33, 223, 144, 213, 109, + 201, 8, 33, 223, 144, 213, 109, 201, 50, 33, 223, 144, 213, 109, 201, 49, + 33, 223, 144, 213, 109, 201, 48, 33, 223, 144, 213, 109, 201, 47, 33, + 223, 144, 213, 109, 201, 44, 33, 223, 144, 213, 109, 201, 43, 33, 223, + 144, 213, 109, 201, 42, 33, 223, 144, 213, 109, 201, 37, 33, 223, 144, + 213, 109, 201, 36, 33, 223, 144, 213, 109, 201, 35, 33, 223, 144, 213, + 109, 201, 34, 33, 223, 144, 213, 109, 201, 33, 33, 223, 144, 213, 109, + 201, 32, 33, 223, 144, 213, 109, 201, 30, 33, 223, 144, 213, 109, 201, + 29, 33, 223, 144, 213, 109, 201, 28, 33, 223, 144, 213, 109, 201, 27, 33, + 223, 144, 213, 109, 201, 26, 33, 223, 144, 213, 109, 201, 25, 33, 223, + 144, 213, 109, 201, 23, 33, 223, 144, 213, 109, 201, 22, 33, 223, 144, + 213, 109, 201, 21, 33, 223, 144, 213, 109, 201, 20, 33, 223, 144, 213, + 109, 201, 19, 33, 223, 144, 213, 109, 201, 18, 33, 223, 144, 213, 109, + 201, 17, 33, 223, 144, 213, 109, 201, 15, 33, 223, 144, 213, 109, 201, + 14, 33, 223, 144, 213, 109, 201, 13, 33, 223, 144, 213, 109, 201, 12, 33, + 223, 144, 213, 109, 201, 11, 38, 33, 35, 198, 166, 38, 33, 35, 200, 0, + 38, 33, 35, 210, 142, 33, 35, 220, 10, 217, 91, 212, 234, 192, 76, 217, + 91, 212, 234, 101, 217, 91, 212, 234, 104, 217, 91, 212, 234, 133, 217, + 91, 212, 234, 134, 217, 91, 212, 234, 151, 217, 91, 212, 234, 170, 217, + 91, 212, 234, 179, 217, 91, 212, 234, 174, 217, 91, 212, 234, 182, 217, + 91, 212, 234, 200, 30, 217, 91, 212, 234, 234, 111, 217, 91, 212, 234, + 197, 244, 217, 91, 212, 234, 199, 186, 217, 91, 212, 234, 232, 113, 217, + 91, 212, 234, 233, 7, 217, 91, 212, 234, 203, 35, 217, 91, 212, 234, 204, + 143, 217, 91, 212, 234, 234, 145, 217, 91, 212, 234, 214, 13, 216, 45, + 39, 234, 189, 236, 234, 39, 229, 228, 234, 189, 236, 234, 39, 228, 167, + 234, 189, 236, 234, 39, 234, 188, 229, 229, 236, 234, 39, 234, 188, 228, + 166, 236, 234, 39, 234, 189, 200, 2, 39, 246, 137, 200, 2, 39, 232, 71, + 242, 130, 200, 2, 39, 216, 108, 200, 2, 39, 248, 184, 200, 2, 39, 222, + 45, 202, 236, 200, 2, 39, 238, 244, 200, 2, 39, 250, 56, 200, 2, 39, 211, + 169, 200, 2, 39, 247, 158, 211, 125, 200, 2, 39, 237, 97, 211, 164, 236, + 185, 200, 2, 39, 236, 182, 200, 2, 39, 192, 226, 200, 2, 39, 223, 181, + 200, 2, 39, 210, 152, 200, 2, 39, 208, 2, 200, 2, 39, 239, 0, 200, 2, 39, + 229, 26, 248, 252, 200, 2, 39, 194, 155, 200, 2, 39, 232, 159, 200, 2, + 39, 251, 111, 200, 2, 39, 207, 212, 200, 2, 39, 207, 184, 200, 2, 39, + 234, 187, 200, 2, 39, 222, 217, 200, 2, 39, 238, 251, 200, 2, 39, 234, + 78, 200, 2, 39, 235, 33, 200, 2, 39, 246, 104, 200, 2, 39, 237, 107, 200, + 2, 39, 28, 207, 183, 200, 2, 39, 211, 68, 200, 2, 39, 220, 14, 200, 2, + 39, 242, 82, 200, 2, 39, 221, 174, 200, 2, 39, 231, 182, 200, 2, 39, 201, + 219, 200, 2, 39, 209, 26, 200, 2, 39, 232, 70, 200, 2, 39, 207, 185, 200, + 2, 39, 220, 55, 211, 164, 216, 81, 200, 2, 39, 207, 181, 200, 2, 39, 230, + 247, 115, 217, 24, 200, 2, 39, 234, 81, 200, 2, 39, 201, 233, 200, 2, 39, + 230, 202, 200, 2, 39, 234, 71, 200, 2, 39, 210, 200, 200, 2, 39, 207, 70, + 200, 2, 39, 232, 185, 200, 2, 39, 196, 132, 211, 164, 194, 133, 200, 2, + 39, 239, 5, 200, 2, 39, 217, 43, 200, 2, 39, 233, 237, 200, 2, 39, 197, + 52, 200, 2, 39, 236, 221, 200, 2, 39, 242, 84, 216, 4, 200, 2, 39, 230, + 178, 200, 2, 39, 231, 183, 223, 190, 200, 2, 39, 217, 103, 200, 2, 39, + 251, 137, 200, 2, 39, 234, 97, 200, 2, 39, 235, 100, 200, 2, 39, 194, + 131, 200, 2, 39, 203, 69, 200, 2, 39, 223, 154, 200, 2, 39, 237, 64, 200, + 2, 39, 237, 189, 200, 2, 39, 236, 217, 200, 2, 39, 233, 201, 200, 2, 39, + 204, 139, 200, 2, 39, 201, 237, 200, 2, 39, 230, 25, 200, 2, 39, 242, 30, + 200, 2, 39, 242, 79, 200, 2, 39, 233, 76, 200, 2, 39, 251, 75, 200, 2, + 39, 242, 29, 200, 2, 39, 211, 212, 199, 225, 196, 108, 200, 2, 39, 236, + 243, 200, 2, 39, 220, 172, 200, 2, 39, 232, 122, 238, 210, 207, 38, 197, + 55, 17, 101, 238, 210, 207, 38, 197, 55, 17, 104, 238, 210, 207, 38, 197, + 55, 17, 133, 238, 210, 207, 38, 197, 55, 17, 134, 238, 210, 207, 38, 197, + 55, 17, 151, 238, 210, 207, 38, 197, 55, 17, 170, 238, 210, 207, 38, 197, + 55, 17, 179, 238, 210, 207, 38, 197, 55, 17, 174, 238, 210, 207, 38, 197, + 55, 17, 182, 238, 210, 207, 38, 200, 26, 17, 101, 238, 210, 207, 38, 200, + 26, 17, 104, 238, 210, 207, 38, 200, 26, 17, 133, 238, 210, 207, 38, 200, + 26, 17, 134, 238, 210, 207, 38, 200, 26, 17, 151, 238, 210, 207, 38, 200, + 26, 17, 170, 238, 210, 207, 38, 200, 26, 17, 179, 238, 210, 207, 38, 200, + 26, 17, 174, 238, 210, 207, 38, 200, 26, 17, 182, 149, 200, 130, 122, + 101, 149, 200, 130, 122, 104, 149, 200, 130, 122, 133, 149, 200, 130, + 122, 134, 149, 200, 130, 122, 151, 200, 130, 122, 101, 200, 130, 122, + 151, 13, 28, 6, 64, 13, 28, 6, 249, 226, 13, 28, 6, 247, 52, 13, 28, 6, + 238, 95, 13, 28, 6, 71, 13, 28, 6, 233, 163, 13, 28, 6, 232, 44, 13, 28, + 6, 230, 124, 13, 28, 6, 70, 13, 28, 6, 223, 65, 13, 28, 6, 222, 184, 13, + 28, 6, 165, 13, 28, 6, 218, 236, 13, 28, 6, 215, 151, 13, 28, 6, 74, 13, + 28, 6, 211, 93, 13, 28, 6, 208, 247, 13, 28, 6, 150, 13, 28, 6, 206, 158, + 13, 28, 6, 200, 228, 13, 28, 6, 68, 13, 28, 6, 196, 236, 13, 28, 6, 194, + 202, 13, 28, 6, 193, 223, 13, 28, 6, 193, 148, 13, 28, 6, 192, 155, 13, + 28, 2, 64, 13, 28, 2, 249, 226, 13, 28, 2, 247, 52, 13, 28, 2, 238, 95, + 13, 28, 2, 71, 13, 28, 2, 233, 163, 13, 28, 2, 232, 44, 13, 28, 2, 230, + 124, 13, 28, 2, 70, 13, 28, 2, 223, 65, 13, 28, 2, 222, 184, 13, 28, 2, + 165, 13, 28, 2, 218, 236, 13, 28, 2, 215, 151, 13, 28, 2, 74, 13, 28, 2, + 211, 93, 13, 28, 2, 208, 247, 13, 28, 2, 150, 13, 28, 2, 206, 158, 13, + 28, 2, 200, 228, 13, 28, 2, 68, 13, 28, 2, 196, 236, 13, 28, 2, 194, 202, + 13, 28, 2, 193, 223, 13, 28, 2, 193, 148, 13, 28, 2, 192, 155, 13, 43, 6, + 64, 13, 43, 6, 249, 226, 13, 43, 6, 247, 52, 13, 43, 6, 238, 95, 13, 43, + 6, 71, 13, 43, 6, 233, 163, 13, 43, 6, 232, 44, 13, 43, 6, 230, 124, 13, + 43, 6, 70, 13, 43, 6, 223, 65, 13, 43, 6, 222, 184, 13, 43, 6, 165, 13, + 43, 6, 218, 236, 13, 43, 6, 215, 151, 13, 43, 6, 74, 13, 43, 6, 211, 93, + 13, 43, 6, 208, 247, 13, 43, 6, 150, 13, 43, 6, 206, 158, 13, 43, 6, 200, + 228, 13, 43, 6, 68, 13, 43, 6, 196, 236, 13, 43, 6, 194, 202, 13, 43, 6, + 193, 223, 13, 43, 6, 193, 148, 13, 43, 6, 192, 155, 13, 43, 2, 64, 13, + 43, 2, 249, 226, 13, 43, 2, 247, 52, 13, 43, 2, 238, 95, 13, 43, 2, 71, + 13, 43, 2, 233, 163, 13, 43, 2, 232, 44, 13, 43, 2, 70, 13, 43, 2, 223, + 65, 13, 43, 2, 222, 184, 13, 43, 2, 165, 13, 43, 2, 218, 236, 13, 43, 2, + 215, 151, 13, 43, 2, 74, 13, 43, 2, 211, 93, 13, 43, 2, 208, 247, 13, 43, + 2, 150, 13, 43, 2, 206, 158, 13, 43, 2, 200, 228, 13, 43, 2, 68, 13, 43, + 2, 196, 236, 13, 43, 2, 194, 202, 13, 43, 2, 193, 223, 13, 43, 2, 193, + 148, 13, 43, 2, 192, 155, 13, 28, 43, 6, 64, 13, 28, 43, 6, 249, 226, 13, + 28, 43, 6, 247, 52, 13, 28, 43, 6, 238, 95, 13, 28, 43, 6, 71, 13, 28, + 43, 6, 233, 163, 13, 28, 43, 6, 232, 44, 13, 28, 43, 6, 230, 124, 13, 28, + 43, 6, 70, 13, 28, 43, 6, 223, 65, 13, 28, 43, 6, 222, 184, 13, 28, 43, + 6, 165, 13, 28, 43, 6, 218, 236, 13, 28, 43, 6, 215, 151, 13, 28, 43, 6, + 74, 13, 28, 43, 6, 211, 93, 13, 28, 43, 6, 208, 247, 13, 28, 43, 6, 150, + 13, 28, 43, 6, 206, 158, 13, 28, 43, 6, 200, 228, 13, 28, 43, 6, 68, 13, + 28, 43, 6, 196, 236, 13, 28, 43, 6, 194, 202, 13, 28, 43, 6, 193, 223, + 13, 28, 43, 6, 193, 148, 13, 28, 43, 6, 192, 155, 13, 28, 43, 2, 64, 13, + 28, 43, 2, 249, 226, 13, 28, 43, 2, 247, 52, 13, 28, 43, 2, 238, 95, 13, + 28, 43, 2, 71, 13, 28, 43, 2, 233, 163, 13, 28, 43, 2, 232, 44, 13, 28, + 43, 2, 230, 124, 13, 28, 43, 2, 70, 13, 28, 43, 2, 223, 65, 13, 28, 43, + 2, 222, 184, 13, 28, 43, 2, 165, 13, 28, 43, 2, 218, 236, 13, 28, 43, 2, + 215, 151, 13, 28, 43, 2, 74, 13, 28, 43, 2, 211, 93, 13, 28, 43, 2, 208, + 247, 13, 28, 43, 2, 150, 13, 28, 43, 2, 206, 158, 13, 28, 43, 2, 200, + 228, 13, 28, 43, 2, 68, 13, 28, 43, 2, 196, 236, 13, 28, 43, 2, 194, 202, + 13, 28, 43, 2, 193, 223, 13, 28, 43, 2, 193, 148, 13, 28, 43, 2, 192, + 155, 13, 27, 6, 64, 13, 27, 6, 247, 52, 13, 27, 6, 238, 95, 13, 27, 6, + 232, 44, 13, 27, 6, 223, 65, 13, 27, 6, 222, 184, 13, 27, 6, 215, 151, + 13, 27, 6, 74, 13, 27, 6, 211, 93, 13, 27, 6, 208, 247, 13, 27, 6, 206, + 158, 13, 27, 6, 200, 228, 13, 27, 6, 68, 13, 27, 6, 196, 236, 13, 27, 6, + 194, 202, 13, 27, 6, 193, 223, 13, 27, 6, 193, 148, 13, 27, 6, 192, 155, + 13, 27, 2, 64, 13, 27, 2, 249, 226, 13, 27, 2, 247, 52, 13, 27, 2, 238, + 95, 13, 27, 2, 233, 163, 13, 27, 2, 230, 124, 13, 27, 2, 70, 13, 27, 2, + 223, 65, 13, 27, 2, 222, 184, 13, 27, 2, 165, 13, 27, 2, 218, 236, 13, + 27, 2, 215, 151, 13, 27, 2, 211, 93, 13, 27, 2, 208, 247, 13, 27, 2, 150, + 13, 27, 2, 206, 158, 13, 27, 2, 200, 228, 13, 27, 2, 68, 13, 27, 2, 196, + 236, 13, 27, 2, 194, 202, 13, 27, 2, 193, 223, 13, 27, 2, 193, 148, 13, + 27, 2, 192, 155, 13, 28, 27, 6, 64, 13, 28, 27, 6, 249, 226, 13, 28, 27, + 6, 247, 52, 13, 28, 27, 6, 238, 95, 13, 28, 27, 6, 71, 13, 28, 27, 6, + 233, 163, 13, 28, 27, 6, 232, 44, 13, 28, 27, 6, 230, 124, 13, 28, 27, 6, + 70, 13, 28, 27, 6, 223, 65, 13, 28, 27, 6, 222, 184, 13, 28, 27, 6, 165, + 13, 28, 27, 6, 218, 236, 13, 28, 27, 6, 215, 151, 13, 28, 27, 6, 74, 13, + 28, 27, 6, 211, 93, 13, 28, 27, 6, 208, 247, 13, 28, 27, 6, 150, 13, 28, + 27, 6, 206, 158, 13, 28, 27, 6, 200, 228, 13, 28, 27, 6, 68, 13, 28, 27, + 6, 196, 236, 13, 28, 27, 6, 194, 202, 13, 28, 27, 6, 193, 223, 13, 28, + 27, 6, 193, 148, 13, 28, 27, 6, 192, 155, 13, 28, 27, 2, 64, 13, 28, 27, + 2, 249, 226, 13, 28, 27, 2, 247, 52, 13, 28, 27, 2, 238, 95, 13, 28, 27, + 2, 71, 13, 28, 27, 2, 233, 163, 13, 28, 27, 2, 232, 44, 13, 28, 27, 2, + 230, 124, 13, 28, 27, 2, 70, 13, 28, 27, 2, 223, 65, 13, 28, 27, 2, 222, + 184, 13, 28, 27, 2, 165, 13, 28, 27, 2, 218, 236, 13, 28, 27, 2, 215, + 151, 13, 28, 27, 2, 74, 13, 28, 27, 2, 211, 93, 13, 28, 27, 2, 208, 247, + 13, 28, 27, 2, 150, 13, 28, 27, 2, 206, 158, 13, 28, 27, 2, 200, 228, 13, + 28, 27, 2, 68, 13, 28, 27, 2, 196, 236, 13, 28, 27, 2, 194, 202, 13, 28, + 27, 2, 193, 223, 13, 28, 27, 2, 193, 148, 13, 28, 27, 2, 192, 155, 13, + 232, 106, 6, 64, 13, 232, 106, 6, 249, 226, 13, 232, 106, 6, 238, 95, 13, + 232, 106, 6, 71, 13, 232, 106, 6, 233, 163, 13, 232, 106, 6, 232, 44, 13, + 232, 106, 6, 223, 65, 13, 232, 106, 6, 222, 184, 13, 232, 106, 6, 165, + 13, 232, 106, 6, 218, 236, 13, 232, 106, 6, 215, 151, 13, 232, 106, 6, + 74, 13, 232, 106, 6, 211, 93, 13, 232, 106, 6, 208, 247, 13, 232, 106, 6, + 206, 158, 13, 232, 106, 6, 200, 228, 13, 232, 106, 6, 68, 13, 232, 106, + 6, 196, 236, 13, 232, 106, 6, 194, 202, 13, 232, 106, 6, 193, 223, 13, + 232, 106, 6, 193, 148, 13, 232, 106, 2, 64, 13, 232, 106, 2, 249, 226, + 13, 232, 106, 2, 247, 52, 13, 232, 106, 2, 238, 95, 13, 232, 106, 2, 71, + 13, 232, 106, 2, 233, 163, 13, 232, 106, 2, 232, 44, 13, 232, 106, 2, + 230, 124, 13, 232, 106, 2, 70, 13, 232, 106, 2, 223, 65, 13, 232, 106, 2, + 222, 184, 13, 232, 106, 2, 165, 13, 232, 106, 2, 218, 236, 13, 232, 106, + 2, 215, 151, 13, 232, 106, 2, 74, 13, 232, 106, 2, 211, 93, 13, 232, 106, + 2, 208, 247, 13, 232, 106, 2, 150, 13, 232, 106, 2, 206, 158, 13, 232, + 106, 2, 200, 228, 13, 232, 106, 2, 68, 13, 232, 106, 2, 196, 236, 13, + 232, 106, 2, 194, 202, 13, 232, 106, 2, 193, 223, 13, 232, 106, 2, 193, + 148, 13, 232, 106, 2, 192, 155, 13, 235, 102, 6, 64, 13, 235, 102, 6, + 249, 226, 13, 235, 102, 6, 238, 95, 13, 235, 102, 6, 71, 13, 235, 102, 6, + 233, 163, 13, 235, 102, 6, 232, 44, 13, 235, 102, 6, 70, 13, 235, 102, 6, + 223, 65, 13, 235, 102, 6, 222, 184, 13, 235, 102, 6, 165, 13, 235, 102, + 6, 218, 236, 13, 235, 102, 6, 74, 13, 235, 102, 6, 206, 158, 13, 235, + 102, 6, 200, 228, 13, 235, 102, 6, 68, 13, 235, 102, 6, 196, 236, 13, + 235, 102, 6, 194, 202, 13, 235, 102, 6, 193, 223, 13, 235, 102, 6, 193, + 148, 13, 235, 102, 2, 64, 13, 235, 102, 2, 249, 226, 13, 235, 102, 2, + 247, 52, 13, 235, 102, 2, 238, 95, 13, 235, 102, 2, 71, 13, 235, 102, 2, + 233, 163, 13, 235, 102, 2, 232, 44, 13, 235, 102, 2, 230, 124, 13, 235, + 102, 2, 70, 13, 235, 102, 2, 223, 65, 13, 235, 102, 2, 222, 184, 13, 235, + 102, 2, 165, 13, 235, 102, 2, 218, 236, 13, 235, 102, 2, 215, 151, 13, + 235, 102, 2, 74, 13, 235, 102, 2, 211, 93, 13, 235, 102, 2, 208, 247, 13, + 235, 102, 2, 150, 13, 235, 102, 2, 206, 158, 13, 235, 102, 2, 200, 228, + 13, 235, 102, 2, 68, 13, 235, 102, 2, 196, 236, 13, 235, 102, 2, 194, + 202, 13, 235, 102, 2, 193, 223, 13, 235, 102, 2, 193, 148, 13, 235, 102, + 2, 192, 155, 13, 28, 232, 106, 6, 64, 13, 28, 232, 106, 6, 249, 226, 13, + 28, 232, 106, 6, 247, 52, 13, 28, 232, 106, 6, 238, 95, 13, 28, 232, 106, + 6, 71, 13, 28, 232, 106, 6, 233, 163, 13, 28, 232, 106, 6, 232, 44, 13, + 28, 232, 106, 6, 230, 124, 13, 28, 232, 106, 6, 70, 13, 28, 232, 106, 6, + 223, 65, 13, 28, 232, 106, 6, 222, 184, 13, 28, 232, 106, 6, 165, 13, 28, + 232, 106, 6, 218, 236, 13, 28, 232, 106, 6, 215, 151, 13, 28, 232, 106, + 6, 74, 13, 28, 232, 106, 6, 211, 93, 13, 28, 232, 106, 6, 208, 247, 13, + 28, 232, 106, 6, 150, 13, 28, 232, 106, 6, 206, 158, 13, 28, 232, 106, 6, + 200, 228, 13, 28, 232, 106, 6, 68, 13, 28, 232, 106, 6, 196, 236, 13, 28, + 232, 106, 6, 194, 202, 13, 28, 232, 106, 6, 193, 223, 13, 28, 232, 106, + 6, 193, 148, 13, 28, 232, 106, 6, 192, 155, 13, 28, 232, 106, 2, 64, 13, + 28, 232, 106, 2, 249, 226, 13, 28, 232, 106, 2, 247, 52, 13, 28, 232, + 106, 2, 238, 95, 13, 28, 232, 106, 2, 71, 13, 28, 232, 106, 2, 233, 163, + 13, 28, 232, 106, 2, 232, 44, 13, 28, 232, 106, 2, 230, 124, 13, 28, 232, + 106, 2, 70, 13, 28, 232, 106, 2, 223, 65, 13, 28, 232, 106, 2, 222, 184, + 13, 28, 232, 106, 2, 165, 13, 28, 232, 106, 2, 218, 236, 13, 28, 232, + 106, 2, 215, 151, 13, 28, 232, 106, 2, 74, 13, 28, 232, 106, 2, 211, 93, + 13, 28, 232, 106, 2, 208, 247, 13, 28, 232, 106, 2, 150, 13, 28, 232, + 106, 2, 206, 158, 13, 28, 232, 106, 2, 200, 228, 13, 28, 232, 106, 2, 68, + 13, 28, 232, 106, 2, 196, 236, 13, 28, 232, 106, 2, 194, 202, 13, 28, + 232, 106, 2, 193, 223, 13, 28, 232, 106, 2, 193, 148, 13, 28, 232, 106, + 2, 192, 155, 13, 49, 6, 64, 13, 49, 6, 249, 226, 13, 49, 6, 247, 52, 13, + 49, 6, 238, 95, 13, 49, 6, 71, 13, 49, 6, 233, 163, 13, 49, 6, 232, 44, + 13, 49, 6, 230, 124, 13, 49, 6, 70, 13, 49, 6, 223, 65, 13, 49, 6, 222, + 184, 13, 49, 6, 165, 13, 49, 6, 218, 236, 13, 49, 6, 215, 151, 13, 49, 6, + 74, 13, 49, 6, 211, 93, 13, 49, 6, 208, 247, 13, 49, 6, 150, 13, 49, 6, + 206, 158, 13, 49, 6, 200, 228, 13, 49, 6, 68, 13, 49, 6, 196, 236, 13, + 49, 6, 194, 202, 13, 49, 6, 193, 223, 13, 49, 6, 193, 148, 13, 49, 6, + 192, 155, 13, 49, 2, 64, 13, 49, 2, 249, 226, 13, 49, 2, 247, 52, 13, 49, + 2, 238, 95, 13, 49, 2, 71, 13, 49, 2, 233, 163, 13, 49, 2, 232, 44, 13, + 49, 2, 230, 124, 13, 49, 2, 70, 13, 49, 2, 223, 65, 13, 49, 2, 222, 184, + 13, 49, 2, 165, 13, 49, 2, 218, 236, 13, 49, 2, 215, 151, 13, 49, 2, 74, + 13, 49, 2, 211, 93, 13, 49, 2, 208, 247, 13, 49, 2, 150, 13, 49, 2, 206, + 158, 13, 49, 2, 200, 228, 13, 49, 2, 68, 13, 49, 2, 196, 236, 13, 49, 2, + 194, 202, 13, 49, 2, 193, 223, 13, 49, 2, 193, 148, 13, 49, 2, 192, 155, + 13, 49, 28, 6, 64, 13, 49, 28, 6, 249, 226, 13, 49, 28, 6, 247, 52, 13, + 49, 28, 6, 238, 95, 13, 49, 28, 6, 71, 13, 49, 28, 6, 233, 163, 13, 49, + 28, 6, 232, 44, 13, 49, 28, 6, 230, 124, 13, 49, 28, 6, 70, 13, 49, 28, + 6, 223, 65, 13, 49, 28, 6, 222, 184, 13, 49, 28, 6, 165, 13, 49, 28, 6, + 218, 236, 13, 49, 28, 6, 215, 151, 13, 49, 28, 6, 74, 13, 49, 28, 6, 211, + 93, 13, 49, 28, 6, 208, 247, 13, 49, 28, 6, 150, 13, 49, 28, 6, 206, 158, + 13, 49, 28, 6, 200, 228, 13, 49, 28, 6, 68, 13, 49, 28, 6, 196, 236, 13, + 49, 28, 6, 194, 202, 13, 49, 28, 6, 193, 223, 13, 49, 28, 6, 193, 148, + 13, 49, 28, 6, 192, 155, 13, 49, 28, 2, 64, 13, 49, 28, 2, 249, 226, 13, + 49, 28, 2, 247, 52, 13, 49, 28, 2, 238, 95, 13, 49, 28, 2, 71, 13, 49, + 28, 2, 233, 163, 13, 49, 28, 2, 232, 44, 13, 49, 28, 2, 230, 124, 13, 49, + 28, 2, 70, 13, 49, 28, 2, 223, 65, 13, 49, 28, 2, 222, 184, 13, 49, 28, + 2, 165, 13, 49, 28, 2, 218, 236, 13, 49, 28, 2, 215, 151, 13, 49, 28, 2, + 74, 13, 49, 28, 2, 211, 93, 13, 49, 28, 2, 208, 247, 13, 49, 28, 2, 150, + 13, 49, 28, 2, 206, 158, 13, 49, 28, 2, 200, 228, 13, 49, 28, 2, 68, 13, + 49, 28, 2, 196, 236, 13, 49, 28, 2, 194, 202, 13, 49, 28, 2, 193, 223, + 13, 49, 28, 2, 193, 148, 13, 49, 28, 2, 192, 155, 13, 49, 43, 6, 64, 13, + 49, 43, 6, 249, 226, 13, 49, 43, 6, 247, 52, 13, 49, 43, 6, 238, 95, 13, + 49, 43, 6, 71, 13, 49, 43, 6, 233, 163, 13, 49, 43, 6, 232, 44, 13, 49, + 43, 6, 230, 124, 13, 49, 43, 6, 70, 13, 49, 43, 6, 223, 65, 13, 49, 43, + 6, 222, 184, 13, 49, 43, 6, 165, 13, 49, 43, 6, 218, 236, 13, 49, 43, 6, + 215, 151, 13, 49, 43, 6, 74, 13, 49, 43, 6, 211, 93, 13, 49, 43, 6, 208, + 247, 13, 49, 43, 6, 150, 13, 49, 43, 6, 206, 158, 13, 49, 43, 6, 200, + 228, 13, 49, 43, 6, 68, 13, 49, 43, 6, 196, 236, 13, 49, 43, 6, 194, 202, + 13, 49, 43, 6, 193, 223, 13, 49, 43, 6, 193, 148, 13, 49, 43, 6, 192, + 155, 13, 49, 43, 2, 64, 13, 49, 43, 2, 249, 226, 13, 49, 43, 2, 247, 52, + 13, 49, 43, 2, 238, 95, 13, 49, 43, 2, 71, 13, 49, 43, 2, 233, 163, 13, + 49, 43, 2, 232, 44, 13, 49, 43, 2, 230, 124, 13, 49, 43, 2, 70, 13, 49, + 43, 2, 223, 65, 13, 49, 43, 2, 222, 184, 13, 49, 43, 2, 165, 13, 49, 43, + 2, 218, 236, 13, 49, 43, 2, 215, 151, 13, 49, 43, 2, 74, 13, 49, 43, 2, + 211, 93, 13, 49, 43, 2, 208, 247, 13, 49, 43, 2, 150, 13, 49, 43, 2, 206, + 158, 13, 49, 43, 2, 200, 228, 13, 49, 43, 2, 68, 13, 49, 43, 2, 196, 236, + 13, 49, 43, 2, 194, 202, 13, 49, 43, 2, 193, 223, 13, 49, 43, 2, 193, + 148, 13, 49, 43, 2, 192, 155, 13, 49, 28, 43, 6, 64, 13, 49, 28, 43, 6, + 249, 226, 13, 49, 28, 43, 6, 247, 52, 13, 49, 28, 43, 6, 238, 95, 13, 49, + 28, 43, 6, 71, 13, 49, 28, 43, 6, 233, 163, 13, 49, 28, 43, 6, 232, 44, + 13, 49, 28, 43, 6, 230, 124, 13, 49, 28, 43, 6, 70, 13, 49, 28, 43, 6, + 223, 65, 13, 49, 28, 43, 6, 222, 184, 13, 49, 28, 43, 6, 165, 13, 49, 28, + 43, 6, 218, 236, 13, 49, 28, 43, 6, 215, 151, 13, 49, 28, 43, 6, 74, 13, + 49, 28, 43, 6, 211, 93, 13, 49, 28, 43, 6, 208, 247, 13, 49, 28, 43, 6, + 150, 13, 49, 28, 43, 6, 206, 158, 13, 49, 28, 43, 6, 200, 228, 13, 49, + 28, 43, 6, 68, 13, 49, 28, 43, 6, 196, 236, 13, 49, 28, 43, 6, 194, 202, + 13, 49, 28, 43, 6, 193, 223, 13, 49, 28, 43, 6, 193, 148, 13, 49, 28, 43, + 6, 192, 155, 13, 49, 28, 43, 2, 64, 13, 49, 28, 43, 2, 249, 226, 13, 49, + 28, 43, 2, 247, 52, 13, 49, 28, 43, 2, 238, 95, 13, 49, 28, 43, 2, 71, + 13, 49, 28, 43, 2, 233, 163, 13, 49, 28, 43, 2, 232, 44, 13, 49, 28, 43, + 2, 230, 124, 13, 49, 28, 43, 2, 70, 13, 49, 28, 43, 2, 223, 65, 13, 49, + 28, 43, 2, 222, 184, 13, 49, 28, 43, 2, 165, 13, 49, 28, 43, 2, 218, 236, + 13, 49, 28, 43, 2, 215, 151, 13, 49, 28, 43, 2, 74, 13, 49, 28, 43, 2, + 211, 93, 13, 49, 28, 43, 2, 208, 247, 13, 49, 28, 43, 2, 150, 13, 49, 28, + 43, 2, 206, 158, 13, 49, 28, 43, 2, 200, 228, 13, 49, 28, 43, 2, 68, 13, + 49, 28, 43, 2, 196, 236, 13, 49, 28, 43, 2, 194, 202, 13, 49, 28, 43, 2, + 193, 223, 13, 49, 28, 43, 2, 193, 148, 13, 49, 28, 43, 2, 192, 155, 13, + 216, 41, 6, 64, 13, 216, 41, 6, 249, 226, 13, 216, 41, 6, 247, 52, 13, + 216, 41, 6, 238, 95, 13, 216, 41, 6, 71, 13, 216, 41, 6, 233, 163, 13, + 216, 41, 6, 232, 44, 13, 216, 41, 6, 230, 124, 13, 216, 41, 6, 70, 13, + 216, 41, 6, 223, 65, 13, 216, 41, 6, 222, 184, 13, 216, 41, 6, 165, 13, + 216, 41, 6, 218, 236, 13, 216, 41, 6, 215, 151, 13, 216, 41, 6, 74, 13, + 216, 41, 6, 211, 93, 13, 216, 41, 6, 208, 247, 13, 216, 41, 6, 150, 13, + 216, 41, 6, 206, 158, 13, 216, 41, 6, 200, 228, 13, 216, 41, 6, 68, 13, + 216, 41, 6, 196, 236, 13, 216, 41, 6, 194, 202, 13, 216, 41, 6, 193, 223, + 13, 216, 41, 6, 193, 148, 13, 216, 41, 6, 192, 155, 13, 216, 41, 2, 64, + 13, 216, 41, 2, 249, 226, 13, 216, 41, 2, 247, 52, 13, 216, 41, 2, 238, + 95, 13, 216, 41, 2, 71, 13, 216, 41, 2, 233, 163, 13, 216, 41, 2, 232, + 44, 13, 216, 41, 2, 230, 124, 13, 216, 41, 2, 70, 13, 216, 41, 2, 223, + 65, 13, 216, 41, 2, 222, 184, 13, 216, 41, 2, 165, 13, 216, 41, 2, 218, + 236, 13, 216, 41, 2, 215, 151, 13, 216, 41, 2, 74, 13, 216, 41, 2, 211, + 93, 13, 216, 41, 2, 208, 247, 13, 216, 41, 2, 150, 13, 216, 41, 2, 206, + 158, 13, 216, 41, 2, 200, 228, 13, 216, 41, 2, 68, 13, 216, 41, 2, 196, + 236, 13, 216, 41, 2, 194, 202, 13, 216, 41, 2, 193, 223, 13, 216, 41, 2, + 193, 148, 13, 216, 41, 2, 192, 155, 13, 43, 2, 236, 113, 70, 13, 43, 2, + 236, 113, 223, 65, 13, 28, 6, 250, 252, 13, 28, 6, 248, 63, 13, 28, 6, + 231, 204, 13, 28, 6, 237, 76, 13, 28, 6, 234, 32, 13, 28, 6, 192, 75, 13, + 28, 6, 233, 240, 13, 28, 6, 199, 206, 13, 28, 6, 223, 111, 13, 28, 6, + 222, 106, 13, 28, 6, 220, 90, 13, 28, 6, 215, 241, 13, 28, 6, 213, 22, + 13, 28, 6, 193, 196, 13, 28, 6, 211, 214, 13, 28, 6, 210, 51, 13, 28, 6, + 207, 153, 13, 28, 6, 199, 207, 109, 13, 28, 6, 203, 99, 13, 28, 6, 200, + 100, 13, 28, 6, 197, 34, 13, 28, 6, 210, 77, 13, 28, 6, 242, 215, 13, 28, + 6, 209, 62, 13, 28, 6, 211, 216, 13, 28, 215, 79, 13, 28, 2, 250, 252, + 13, 28, 2, 248, 63, 13, 28, 2, 231, 204, 13, 28, 2, 237, 76, 13, 28, 2, + 234, 32, 13, 28, 2, 192, 75, 13, 28, 2, 233, 240, 13, 28, 2, 199, 206, + 13, 28, 2, 223, 111, 13, 28, 2, 222, 106, 13, 28, 2, 220, 90, 13, 28, 2, + 215, 241, 13, 28, 2, 213, 22, 13, 28, 2, 193, 196, 13, 28, 2, 211, 214, + 13, 28, 2, 210, 51, 13, 28, 2, 207, 153, 13, 28, 2, 52, 203, 99, 13, 28, + 2, 203, 99, 13, 28, 2, 200, 100, 13, 28, 2, 197, 34, 13, 28, 2, 210, 77, + 13, 28, 2, 242, 215, 13, 28, 2, 209, 62, 13, 28, 2, 211, 216, 13, 28, + 210, 222, 236, 244, 13, 28, 234, 33, 109, 13, 28, 199, 207, 109, 13, 28, + 222, 107, 109, 13, 28, 210, 78, 109, 13, 28, 207, 154, 109, 13, 28, 210, + 52, 109, 13, 43, 6, 250, 252, 13, 43, 6, 248, 63, 13, 43, 6, 231, 204, + 13, 43, 6, 237, 76, 13, 43, 6, 234, 32, 13, 43, 6, 192, 75, 13, 43, 6, + 233, 240, 13, 43, 6, 199, 206, 13, 43, 6, 223, 111, 13, 43, 6, 222, 106, + 13, 43, 6, 220, 90, 13, 43, 6, 215, 241, 13, 43, 6, 213, 22, 13, 43, 6, + 193, 196, 13, 43, 6, 211, 214, 13, 43, 6, 210, 51, 13, 43, 6, 207, 153, + 13, 43, 6, 199, 207, 109, 13, 43, 6, 203, 99, 13, 43, 6, 200, 100, 13, + 43, 6, 197, 34, 13, 43, 6, 210, 77, 13, 43, 6, 242, 215, 13, 43, 6, 209, + 62, 13, 43, 6, 211, 216, 13, 43, 215, 79, 13, 43, 2, 250, 252, 13, 43, 2, + 248, 63, 13, 43, 2, 231, 204, 13, 43, 2, 237, 76, 13, 43, 2, 234, 32, 13, + 43, 2, 192, 75, 13, 43, 2, 233, 240, 13, 43, 2, 199, 206, 13, 43, 2, 223, + 111, 13, 43, 2, 222, 106, 13, 43, 2, 220, 90, 13, 43, 2, 215, 241, 13, + 43, 2, 213, 22, 13, 43, 2, 193, 196, 13, 43, 2, 211, 214, 13, 43, 2, 210, + 51, 13, 43, 2, 207, 153, 13, 43, 2, 52, 203, 99, 13, 43, 2, 203, 99, 13, + 43, 2, 200, 100, 13, 43, 2, 197, 34, 13, 43, 2, 210, 77, 13, 43, 2, 242, + 215, 13, 43, 2, 209, 62, 13, 43, 2, 211, 216, 13, 43, 210, 222, 236, 244, + 13, 43, 234, 33, 109, 13, 43, 199, 207, 109, 13, 43, 222, 107, 109, 13, + 43, 210, 78, 109, 13, 43, 207, 154, 109, 13, 43, 210, 52, 109, 13, 28, + 43, 6, 250, 252, 13, 28, 43, 6, 248, 63, 13, 28, 43, 6, 231, 204, 13, 28, + 43, 6, 237, 76, 13, 28, 43, 6, 234, 32, 13, 28, 43, 6, 192, 75, 13, 28, + 43, 6, 233, 240, 13, 28, 43, 6, 199, 206, 13, 28, 43, 6, 223, 111, 13, + 28, 43, 6, 222, 106, 13, 28, 43, 6, 220, 90, 13, 28, 43, 6, 215, 241, 13, + 28, 43, 6, 213, 22, 13, 28, 43, 6, 193, 196, 13, 28, 43, 6, 211, 214, 13, + 28, 43, 6, 210, 51, 13, 28, 43, 6, 207, 153, 13, 28, 43, 6, 199, 207, + 109, 13, 28, 43, 6, 203, 99, 13, 28, 43, 6, 200, 100, 13, 28, 43, 6, 197, + 34, 13, 28, 43, 6, 210, 77, 13, 28, 43, 6, 242, 215, 13, 28, 43, 6, 209, + 62, 13, 28, 43, 6, 211, 216, 13, 28, 43, 215, 79, 13, 28, 43, 2, 250, + 252, 13, 28, 43, 2, 248, 63, 13, 28, 43, 2, 231, 204, 13, 28, 43, 2, 237, + 76, 13, 28, 43, 2, 234, 32, 13, 28, 43, 2, 192, 75, 13, 28, 43, 2, 233, + 240, 13, 28, 43, 2, 199, 206, 13, 28, 43, 2, 223, 111, 13, 28, 43, 2, + 222, 106, 13, 28, 43, 2, 220, 90, 13, 28, 43, 2, 215, 241, 13, 28, 43, 2, + 213, 22, 13, 28, 43, 2, 193, 196, 13, 28, 43, 2, 211, 214, 13, 28, 43, 2, + 210, 51, 13, 28, 43, 2, 207, 153, 13, 28, 43, 2, 52, 203, 99, 13, 28, 43, + 2, 203, 99, 13, 28, 43, 2, 200, 100, 13, 28, 43, 2, 197, 34, 13, 28, 43, + 2, 210, 77, 13, 28, 43, 2, 242, 215, 13, 28, 43, 2, 209, 62, 13, 28, 43, + 2, 211, 216, 13, 28, 43, 210, 222, 236, 244, 13, 28, 43, 234, 33, 109, + 13, 28, 43, 199, 207, 109, 13, 28, 43, 222, 107, 109, 13, 28, 43, 210, + 78, 109, 13, 28, 43, 207, 154, 109, 13, 28, 43, 210, 52, 109, 13, 49, 28, + 6, 250, 252, 13, 49, 28, 6, 248, 63, 13, 49, 28, 6, 231, 204, 13, 49, 28, + 6, 237, 76, 13, 49, 28, 6, 234, 32, 13, 49, 28, 6, 192, 75, 13, 49, 28, + 6, 233, 240, 13, 49, 28, 6, 199, 206, 13, 49, 28, 6, 223, 111, 13, 49, + 28, 6, 222, 106, 13, 49, 28, 6, 220, 90, 13, 49, 28, 6, 215, 241, 13, 49, + 28, 6, 213, 22, 13, 49, 28, 6, 193, 196, 13, 49, 28, 6, 211, 214, 13, 49, + 28, 6, 210, 51, 13, 49, 28, 6, 207, 153, 13, 49, 28, 6, 199, 207, 109, + 13, 49, 28, 6, 203, 99, 13, 49, 28, 6, 200, 100, 13, 49, 28, 6, 197, 34, + 13, 49, 28, 6, 210, 77, 13, 49, 28, 6, 242, 215, 13, 49, 28, 6, 209, 62, + 13, 49, 28, 6, 211, 216, 13, 49, 28, 215, 79, 13, 49, 28, 2, 250, 252, + 13, 49, 28, 2, 248, 63, 13, 49, 28, 2, 231, 204, 13, 49, 28, 2, 237, 76, + 13, 49, 28, 2, 234, 32, 13, 49, 28, 2, 192, 75, 13, 49, 28, 2, 233, 240, + 13, 49, 28, 2, 199, 206, 13, 49, 28, 2, 223, 111, 13, 49, 28, 2, 222, + 106, 13, 49, 28, 2, 220, 90, 13, 49, 28, 2, 215, 241, 13, 49, 28, 2, 213, + 22, 13, 49, 28, 2, 193, 196, 13, 49, 28, 2, 211, 214, 13, 49, 28, 2, 210, + 51, 13, 49, 28, 2, 207, 153, 13, 49, 28, 2, 52, 203, 99, 13, 49, 28, 2, + 203, 99, 13, 49, 28, 2, 200, 100, 13, 49, 28, 2, 197, 34, 13, 49, 28, 2, + 210, 77, 13, 49, 28, 2, 242, 215, 13, 49, 28, 2, 209, 62, 13, 49, 28, 2, + 211, 216, 13, 49, 28, 210, 222, 236, 244, 13, 49, 28, 234, 33, 109, 13, + 49, 28, 199, 207, 109, 13, 49, 28, 222, 107, 109, 13, 49, 28, 210, 78, + 109, 13, 49, 28, 207, 154, 109, 13, 49, 28, 210, 52, 109, 13, 49, 28, 43, + 6, 250, 252, 13, 49, 28, 43, 6, 248, 63, 13, 49, 28, 43, 6, 231, 204, 13, + 49, 28, 43, 6, 237, 76, 13, 49, 28, 43, 6, 234, 32, 13, 49, 28, 43, 6, + 192, 75, 13, 49, 28, 43, 6, 233, 240, 13, 49, 28, 43, 6, 199, 206, 13, + 49, 28, 43, 6, 223, 111, 13, 49, 28, 43, 6, 222, 106, 13, 49, 28, 43, 6, + 220, 90, 13, 49, 28, 43, 6, 215, 241, 13, 49, 28, 43, 6, 213, 22, 13, 49, + 28, 43, 6, 193, 196, 13, 49, 28, 43, 6, 211, 214, 13, 49, 28, 43, 6, 210, + 51, 13, 49, 28, 43, 6, 207, 153, 13, 49, 28, 43, 6, 199, 207, 109, 13, + 49, 28, 43, 6, 203, 99, 13, 49, 28, 43, 6, 200, 100, 13, 49, 28, 43, 6, + 197, 34, 13, 49, 28, 43, 6, 210, 77, 13, 49, 28, 43, 6, 242, 215, 13, 49, + 28, 43, 6, 209, 62, 13, 49, 28, 43, 6, 211, 216, 13, 49, 28, 43, 215, 79, + 13, 49, 28, 43, 2, 250, 252, 13, 49, 28, 43, 2, 248, 63, 13, 49, 28, 43, + 2, 231, 204, 13, 49, 28, 43, 2, 237, 76, 13, 49, 28, 43, 2, 234, 32, 13, + 49, 28, 43, 2, 192, 75, 13, 49, 28, 43, 2, 233, 240, 13, 49, 28, 43, 2, + 199, 206, 13, 49, 28, 43, 2, 223, 111, 13, 49, 28, 43, 2, 222, 106, 13, + 49, 28, 43, 2, 220, 90, 13, 49, 28, 43, 2, 215, 241, 13, 49, 28, 43, 2, + 213, 22, 13, 49, 28, 43, 2, 193, 196, 13, 49, 28, 43, 2, 211, 214, 13, + 49, 28, 43, 2, 210, 51, 13, 49, 28, 43, 2, 207, 153, 13, 49, 28, 43, 2, + 52, 203, 99, 13, 49, 28, 43, 2, 203, 99, 13, 49, 28, 43, 2, 200, 100, 13, + 49, 28, 43, 2, 197, 34, 13, 49, 28, 43, 2, 210, 77, 13, 49, 28, 43, 2, + 242, 215, 13, 49, 28, 43, 2, 209, 62, 13, 49, 28, 43, 2, 211, 216, 13, + 49, 28, 43, 210, 222, 236, 244, 13, 49, 28, 43, 234, 33, 109, 13, 49, 28, + 43, 199, 207, 109, 13, 49, 28, 43, 222, 107, 109, 13, 49, 28, 43, 210, + 78, 109, 13, 49, 28, 43, 207, 154, 109, 13, 49, 28, 43, 210, 52, 109, 13, + 28, 6, 236, 238, 13, 28, 2, 236, 238, 13, 28, 17, 192, 76, 13, 28, 17, + 101, 13, 28, 17, 104, 13, 28, 17, 133, 13, 28, 17, 134, 13, 28, 17, 151, + 13, 28, 17, 170, 13, 28, 17, 179, 13, 28, 17, 174, 13, 28, 17, 182, 13, + 235, 102, 17, 192, 76, 13, 235, 102, 17, 101, 13, 235, 102, 17, 104, 13, + 235, 102, 17, 133, 13, 235, 102, 17, 134, 13, 235, 102, 17, 151, 13, 235, + 102, 17, 170, 13, 235, 102, 17, 179, 13, 235, 102, 17, 174, 13, 235, 102, + 17, 182, 13, 49, 17, 192, 76, 13, 49, 17, 101, 13, 49, 17, 104, 13, 49, + 17, 133, 13, 49, 17, 134, 13, 49, 17, 151, 13, 49, 17, 170, 13, 49, 17, + 179, 13, 49, 17, 174, 13, 49, 17, 182, 13, 49, 28, 17, 192, 76, 13, 49, + 28, 17, 101, 13, 49, 28, 17, 104, 13, 49, 28, 17, 133, 13, 49, 28, 17, + 134, 13, 49, 28, 17, 151, 13, 49, 28, 17, 170, 13, 49, 28, 17, 179, 13, + 49, 28, 17, 174, 13, 49, 28, 17, 182, 13, 216, 41, 17, 192, 76, 13, 216, + 41, 17, 101, 13, 216, 41, 17, 104, 13, 216, 41, 17, 133, 13, 216, 41, 17, + 134, 13, 216, 41, 17, 151, 13, 216, 41, 17, 170, 13, 216, 41, 17, 179, + 13, 216, 41, 17, 174, 13, 216, 41, 17, 182, 23, 146, 223, 176, 23, 230, + 59, 223, 176, 23, 230, 55, 223, 176, 23, 230, 44, 223, 176, 23, 230, 48, + 223, 176, 23, 230, 61, 223, 176, 23, 146, 140, 248, 74, 23, 230, 59, 140, + 248, 74, 23, 146, 171, 197, 69, 140, 248, 74, 23, 146, 140, 208, 39, 221, + 116, 23, 146, 140, 238, 144, 23, 146, 140, 229, 144, 23, 146, 140, 229, + 145, 219, 52, 23, 230, 59, 140, 229, 146, 23, 146, 140, 216, 160, 23, + 230, 59, 140, 216, 160, 23, 146, 140, 85, 248, 74, 23, 146, 140, 85, 208, + 39, 221, 115, 23, 146, 140, 85, 229, 144, 23, 146, 140, 130, 85, 229, + 144, 23, 146, 140, 229, 145, 85, 197, 41, 23, 146, 140, 85, 239, 10, 23, + 146, 140, 85, 239, 11, 140, 248, 74, 23, 146, 140, 85, 239, 11, 85, 248, + 74, 23, 146, 140, 85, 239, 11, 238, 144, 23, 146, 140, 85, 239, 11, 229, + 144, 23, 146, 140, 85, 238, 179, 23, 230, 59, 140, 85, 238, 179, 23, 146, + 85, 248, 75, 136, 223, 176, 23, 146, 140, 248, 75, 136, 216, 160, 23, + 146, 140, 85, 199, 147, 23, 230, 59, 140, 85, 199, 147, 23, 146, 140, 85, + 201, 230, 171, 248, 74, 23, 146, 140, 85, 248, 75, 171, 201, 229, 23, + 146, 140, 85, 171, 248, 74, 23, 146, 140, 85, 229, 145, 202, 115, 171, + 203, 110, 23, 146, 140, 130, 85, 229, 145, 171, 203, 110, 23, 146, 140, + 130, 85, 229, 145, 171, 239, 10, 23, 146, 140, 229, 145, 85, 130, 171, + 203, 110, 23, 146, 140, 85, 130, 202, 115, 171, 232, 123, 23, 146, 140, + 85, 171, 238, 144, 23, 146, 140, 85, 171, 242, 129, 23, 146, 140, 85, + 171, 229, 13, 23, 146, 140, 85, 171, 229, 144, 23, 146, 171, 248, 61, + 140, 85, 201, 229, 23, 146, 140, 85, 239, 11, 171, 203, 110, 23, 146, + 140, 85, 239, 11, 171, 203, 111, 239, 10, 23, 146, 140, 85, 239, 11, 171, + 203, 111, 248, 74, 23, 146, 85, 171, 229, 14, 140, 197, 41, 23, 146, 140, + 171, 229, 14, 85, 197, 41, 23, 146, 140, 85, 239, 11, 229, 145, 171, 203, + 110, 23, 146, 140, 85, 238, 180, 171, 203, 110, 23, 146, 140, 85, 239, + 11, 171, 232, 123, 23, 146, 140, 85, 239, 11, 238, 145, 171, 232, 123, + 23, 146, 85, 171, 238, 145, 140, 197, 41, 23, 146, 140, 171, 238, 145, + 85, 197, 41, 23, 146, 85, 171, 47, 140, 197, 41, 23, 146, 85, 171, 47, + 140, 229, 144, 23, 146, 140, 171, 250, 206, 211, 126, 85, 197, 41, 23, + 146, 140, 171, 250, 206, 223, 191, 85, 197, 41, 23, 146, 140, 171, 47, + 85, 197, 41, 23, 146, 140, 85, 171, 239, 11, 229, 144, 23, 146, 140, 85, + 171, 250, 206, 211, 125, 23, 146, 140, 85, 171, 250, 205, 23, 146, 85, + 171, 250, 206, 211, 126, 140, 197, 41, 23, 146, 85, 171, 250, 206, 211, + 126, 140, 238, 179, 23, 146, 85, 171, 250, 206, 140, 197, 41, 23, 146, + 140, 171, 229, 14, 85, 229, 144, 23, 230, 50, 232, 119, 232, 235, 23, + 230, 50, 232, 119, 232, 236, 248, 74, 23, 230, 50, 232, 119, 232, 236, + 229, 144, 23, 230, 50, 232, 119, 232, 236, 239, 10, 23, 230, 50, 232, + 119, 232, 236, 239, 11, 202, 124, 23, 230, 57, 232, 119, 232, 236, 239, + 10, 23, 146, 232, 119, 232, 236, 239, 11, 248, 74, 23, 230, 48, 232, 119, + 232, 236, 239, 10, 23, 230, 50, 232, 214, 232, 236, 202, 114, 23, 230, + 50, 229, 223, 232, 214, 232, 236, 202, 114, 23, 230, 50, 232, 214, 232, + 236, 202, 115, 232, 119, 248, 74, 23, 230, 50, 229, 223, 232, 214, 232, + 236, 202, 115, 232, 119, 248, 74, 23, 230, 50, 232, 214, 232, 236, 202, + 115, 248, 74, 23, 230, 50, 229, 223, 232, 214, 232, 236, 202, 115, 248, + 74, 23, 230, 50, 232, 214, 232, 236, 202, 115, 171, 232, 123, 23, 230, + 55, 232, 214, 232, 236, 202, 114, 23, 230, 55, 232, 214, 232, 236, 202, + 115, 211, 183, 23, 230, 48, 232, 214, 232, 236, 202, 115, 211, 183, 23, + 230, 44, 232, 214, 232, 236, 202, 114, 23, 230, 50, 232, 214, 232, 236, + 202, 115, 229, 144, 23, 230, 50, 232, 214, 232, 236, 202, 115, 229, 145, + 171, 203, 110, 23, 230, 50, 232, 214, 232, 236, 202, 115, 229, 145, 213, + 143, 199, 147, 23, 230, 49, 23, 230, 50, 248, 61, 211, 41, 233, 83, 23, + 230, 50, 229, 222, 23, 230, 50, 171, 203, 110, 23, 230, 50, 229, 223, + 171, 203, 110, 23, 230, 50, 171, 248, 74, 23, 230, 50, 171, 232, 123, 23, + 230, 50, 202, 125, 140, 171, 203, 110, 23, 230, 50, 202, 125, 246, 137, + 23, 230, 50, 202, 125, 246, 138, 171, 203, 110, 23, 230, 50, 202, 125, + 246, 138, 171, 203, 111, 248, 74, 23, 230, 50, 202, 125, 219, 146, 23, + 230, 56, 23, 230, 57, 171, 203, 110, 23, 230, 57, 213, 143, 199, 147, 23, + 230, 57, 171, 232, 123, 23, 230, 46, 238, 140, 23, 230, 45, 23, 230, 55, + 211, 183, 23, 230, 54, 23, 230, 55, 211, 184, 171, 203, 110, 23, 230, 55, + 171, 203, 110, 23, 230, 55, 211, 184, 213, 143, 199, 147, 23, 230, 55, + 213, 143, 199, 147, 23, 230, 55, 211, 184, 171, 232, 123, 23, 230, 55, + 171, 232, 123, 23, 230, 53, 211, 183, 23, 230, 52, 23, 230, 58, 23, 230, + 43, 23, 230, 44, 171, 203, 110, 23, 230, 44, 213, 143, 199, 147, 23, 230, + 44, 171, 232, 123, 23, 230, 48, 211, 183, 23, 230, 48, 211, 184, 171, + 232, 123, 23, 230, 47, 23, 230, 48, 202, 236, 23, 230, 48, 211, 184, 171, + 203, 110, 23, 230, 48, 171, 203, 110, 23, 230, 48, 211, 184, 213, 143, + 199, 147, 23, 230, 48, 213, 143, 199, 147, 23, 230, 48, 171, 203, 111, + 198, 231, 223, 176, 23, 230, 48, 171, 248, 61, 85, 207, 81, 23, 230, 60, + 23, 146, 140, 85, 207, 81, 23, 230, 59, 140, 85, 207, 81, 23, 230, 48, + 140, 85, 207, 81, 23, 230, 61, 140, 85, 207, 81, 23, 230, 48, 219, 146, + 23, 146, 140, 85, 207, 82, 248, 74, 23, 146, 140, 85, 207, 82, 239, 10, + 23, 230, 48, 140, 85, 207, 82, 239, 10, 23, 146, 219, 147, 235, 96, 23, + 146, 219, 147, 142, 207, 76, 201, 229, 23, 146, 219, 147, 142, 207, 76, + 238, 129, 23, 146, 219, 147, 142, 211, 136, 242, 129, 23, 146, 219, 147, + 197, 41, 23, 146, 171, 197, 69, 219, 147, 197, 41, 23, 230, 59, 219, 147, + 197, 41, 23, 230, 44, 219, 147, 197, 41, 23, 230, 61, 219, 147, 197, 41, + 23, 146, 219, 147, 208, 39, 221, 116, 23, 146, 219, 147, 248, 74, 23, + 146, 219, 147, 198, 232, 199, 147, 23, 146, 219, 147, 199, 147, 23, 230, + 48, 219, 147, 199, 147, 23, 146, 219, 147, 140, 199, 147, 23, 230, 48, + 219, 147, 140, 199, 147, 23, 230, 61, 219, 147, 140, 171, 140, 171, 211, + 125, 23, 230, 61, 219, 147, 140, 171, 140, 199, 147, 23, 146, 219, 147, + 223, 176, 23, 230, 59, 219, 147, 223, 176, 23, 230, 48, 219, 147, 223, + 176, 23, 230, 61, 219, 147, 223, 176, 23, 146, 140, 85, 219, 146, 23, + 230, 59, 140, 85, 219, 146, 23, 230, 48, 140, 85, 219, 146, 23, 230, 48, + 207, 81, 23, 230, 61, 140, 85, 219, 146, 23, 146, 140, 85, 238, 184, 219, + 146, 23, 230, 59, 140, 85, 238, 184, 219, 146, 23, 146, 207, 82, 235, 96, + 23, 230, 48, 207, 82, 142, 140, 171, 229, 15, 216, 160, 23, 230, 61, 207, + 82, 142, 85, 171, 140, 238, 183, 23, 146, 207, 82, 197, 41, 23, 146, 207, + 82, 208, 39, 221, 116, 23, 146, 207, 82, 219, 146, 23, 230, 59, 207, 82, + 219, 146, 23, 230, 44, 207, 82, 219, 146, 23, 230, 61, 207, 82, 219, 146, + 23, 146, 207, 82, 216, 160, 23, 146, 207, 82, 85, 239, 10, 23, 146, 207, + 82, 85, 208, 39, 221, 115, 23, 146, 207, 82, 223, 176, 23, 146, 207, 82, + 199, 147, 23, 230, 46, 207, 82, 199, 147, 23, 146, 140, 207, 82, 219, + 146, 23, 230, 59, 140, 207, 82, 219, 146, 23, 230, 53, 140, 207, 82, 219, + 147, 211, 211, 23, 230, 46, 140, 207, 82, 219, 147, 211, 125, 23, 230, + 46, 140, 207, 82, 219, 147, 223, 190, 23, 230, 46, 140, 207, 82, 219, + 147, 197, 68, 23, 230, 55, 140, 207, 82, 219, 146, 23, 230, 48, 140, 207, + 82, 219, 146, 23, 230, 61, 140, 207, 82, 219, 147, 211, 125, 23, 230, 61, + 140, 207, 82, 219, 146, 23, 146, 85, 235, 96, 23, 230, 48, 216, 160, 23, + 146, 85, 197, 41, 23, 230, 59, 85, 197, 41, 23, 146, 85, 208, 39, 221, + 116, 23, 146, 85, 130, 171, 203, 110, 23, 230, 46, 85, 199, 147, 23, 146, + 85, 171, 219, 146, 23, 146, 85, 219, 146, 23, 146, 85, 207, 82, 219, 146, + 23, 230, 59, 85, 207, 82, 219, 146, 23, 230, 53, 85, 207, 82, 219, 147, + 211, 211, 23, 230, 55, 85, 207, 82, 219, 146, 23, 230, 48, 85, 207, 82, + 219, 146, 23, 230, 61, 85, 207, 82, 219, 147, 211, 125, 23, 230, 61, 85, + 207, 82, 219, 147, 223, 190, 23, 230, 61, 85, 207, 82, 219, 146, 23, 230, + 59, 85, 207, 82, 219, 147, 248, 74, 23, 230, 57, 85, 207, 82, 219, 147, + 239, 10, 23, 230, 57, 85, 207, 82, 219, 147, 239, 11, 203, 110, 23, 230, + 46, 85, 207, 82, 219, 147, 239, 11, 211, 125, 23, 230, 46, 85, 207, 82, + 219, 147, 239, 11, 223, 190, 23, 230, 46, 85, 207, 82, 219, 147, 239, 10, + 23, 230, 48, 140, 229, 144, 23, 146, 140, 171, 203, 110, 23, 230, 48, + 140, 171, 203, 110, 23, 146, 140, 171, 203, 111, 171, 237, 10, 23, 146, + 140, 171, 203, 111, 171, 239, 10, 23, 146, 140, 171, 203, 111, 171, 248, + 74, 23, 146, 140, 171, 203, 111, 140, 248, 74, 23, 146, 140, 171, 203, + 111, 247, 191, 248, 74, 23, 146, 140, 171, 203, 111, 140, 229, 146, 23, + 146, 140, 171, 232, 124, 140, 201, 229, 23, 146, 140, 171, 232, 124, 140, + 248, 74, 23, 146, 140, 171, 128, 23, 146, 140, 171, 238, 140, 23, 146, + 140, 171, 238, 132, 171, 223, 145, 23, 230, 57, 140, 171, 238, 132, 171, + 223, 145, 23, 146, 140, 171, 238, 132, 171, 197, 68, 23, 146, 140, 171, + 242, 130, 23, 230, 55, 140, 199, 147, 23, 230, 55, 140, 171, 211, 183, + 23, 230, 48, 140, 171, 211, 183, 23, 230, 48, 140, 171, 220, 72, 23, 230, + 48, 140, 199, 147, 23, 230, 48, 140, 171, 202, 236, 23, 230, 61, 140, + 171, 211, 125, 23, 230, 61, 140, 171, 223, 190, 23, 230, 61, 140, 199, + 147, 23, 146, 199, 147, 23, 146, 171, 229, 222, 23, 146, 171, 203, 111, + 237, 10, 23, 146, 171, 203, 111, 239, 10, 23, 146, 171, 203, 111, 248, + 74, 23, 146, 171, 232, 123, 23, 146, 171, 248, 61, 140, 216, 160, 23, + 146, 171, 248, 61, 85, 207, 81, 23, 146, 171, 248, 61, 207, 82, 219, 146, + 23, 146, 171, 197, 69, 103, 232, 235, 23, 146, 171, 136, 103, 232, 235, + 23, 146, 171, 197, 69, 112, 232, 235, 23, 146, 171, 197, 69, 232, 119, + 232, 235, 23, 146, 171, 136, 232, 119, 208, 39, 221, 115, 23, 230, 51, + 23, 146, 229, 222, 23, 198, 233, 203, 73, 23, 198, 233, 215, 215, 23, + 198, 233, 248, 60, 23, 230, 215, 203, 73, 23, 230, 215, 215, 215, 23, + 230, 215, 248, 60, 23, 201, 213, 203, 73, 23, 201, 213, 215, 215, 23, + 201, 213, 248, 60, 23, 247, 132, 203, 73, 23, 247, 132, 215, 215, 23, + 247, 132, 248, 60, 23, 206, 210, 203, 73, 23, 206, 210, 215, 215, 23, + 206, 210, 248, 60, 23, 201, 96, 201, 5, 23, 201, 96, 248, 60, 23, 202, + 102, 220, 73, 203, 73, 23, 202, 102, 2, 203, 73, 23, 202, 102, 220, 73, + 215, 215, 23, 202, 102, 2, 215, 215, 23, 202, 102, 204, 161, 23, 232, + 186, 220, 73, 203, 73, 23, 232, 186, 2, 203, 73, 23, 232, 186, 220, 73, + 215, 215, 23, 232, 186, 2, 215, 215, 23, 232, 186, 204, 161, 23, 202, + 102, 232, 186, 250, 246, 23, 215, 253, 130, 142, 220, 72, 23, 215, 253, + 130, 142, 202, 236, 23, 215, 253, 130, 204, 161, 23, 215, 253, 142, 204, + 161, 23, 215, 253, 130, 142, 250, 247, 220, 72, 23, 215, 253, 130, 142, + 250, 247, 202, 236, 23, 215, 253, 203, 111, 115, 203, 111, 205, 238, 23, + 215, 252, 232, 241, 239, 0, 23, 215, 254, 232, 241, 239, 0, 23, 215, 252, + 203, 74, 201, 230, 202, 236, 23, 215, 252, 203, 74, 201, 230, 217, 30, + 23, 215, 252, 203, 74, 201, 230, 220, 72, 23, 215, 252, 203, 74, 201, + 230, 220, 70, 23, 215, 252, 203, 74, 193, 248, 232, 189, 23, 215, 252, + 55, 201, 229, 23, 215, 252, 55, 193, 248, 232, 189, 23, 215, 252, 55, + 250, 246, 23, 215, 252, 55, 250, 247, 193, 248, 232, 189, 23, 215, 252, + 238, 183, 23, 215, 252, 198, 170, 201, 230, 216, 0, 23, 215, 252, 198, + 170, 193, 248, 232, 189, 23, 215, 252, 198, 170, 250, 246, 23, 215, 252, + 198, 170, 250, 247, 193, 248, 232, 189, 23, 215, 252, 248, 79, 202, 236, + 23, 215, 252, 248, 79, 217, 30, 23, 215, 252, 248, 79, 220, 72, 23, 215, + 252, 238, 224, 202, 236, 23, 215, 252, 238, 224, 217, 30, 23, 215, 252, + 238, 224, 220, 72, 23, 215, 252, 238, 224, 207, 14, 23, 215, 252, 242, + 244, 202, 236, 23, 215, 252, 242, 244, 217, 30, 23, 215, 252, 242, 244, + 220, 72, 23, 215, 252, 105, 202, 236, 23, 215, 252, 105, 217, 30, 23, + 215, 252, 105, 220, 72, 23, 215, 252, 192, 21, 202, 236, 23, 215, 252, + 192, 21, 217, 30, 23, 215, 252, 192, 21, 220, 72, 23, 215, 252, 210, 176, + 202, 236, 23, 215, 252, 210, 176, 217, 30, 23, 215, 252, 210, 176, 220, + 72, 23, 198, 200, 207, 12, 203, 73, 23, 198, 200, 207, 12, 235, 106, 23, + 198, 200, 207, 12, 250, 246, 23, 198, 200, 207, 13, 203, 73, 23, 198, + 200, 207, 13, 235, 106, 23, 198, 200, 207, 13, 250, 246, 23, 198, 200, + 204, 43, 23, 198, 200, 250, 93, 202, 133, 203, 73, 23, 198, 200, 250, 93, + 202, 133, 235, 106, 23, 198, 200, 250, 93, 202, 133, 198, 169, 23, 215, + 255, 249, 240, 202, 236, 23, 215, 255, 249, 240, 217, 30, 23, 215, 255, + 249, 240, 220, 72, 23, 215, 255, 249, 240, 220, 70, 23, 215, 255, 198, + 227, 202, 236, 23, 215, 255, 198, 227, 217, 30, 23, 215, 255, 198, 227, + 220, 72, 23, 215, 255, 198, 227, 220, 70, 23, 215, 255, 248, 61, 249, + 240, 202, 236, 23, 215, 255, 248, 61, 249, 240, 217, 30, 23, 215, 255, + 248, 61, 249, 240, 220, 72, 23, 215, 255, 248, 61, 249, 240, 220, 70, 23, + 215, 255, 248, 61, 198, 227, 202, 236, 23, 215, 255, 248, 61, 198, 227, + 217, 30, 23, 215, 255, 248, 61, 198, 227, 220, 72, 23, 215, 255, 248, 61, + 198, 227, 220, 70, 23, 215, 254, 203, 74, 201, 230, 202, 236, 23, 215, + 254, 203, 74, 201, 230, 217, 30, 23, 215, 254, 203, 74, 201, 230, 220, + 72, 23, 215, 254, 203, 74, 201, 230, 220, 70, 23, 215, 254, 203, 74, 193, + 248, 232, 189, 23, 215, 254, 55, 201, 229, 23, 215, 254, 55, 193, 248, + 232, 189, 23, 215, 254, 55, 250, 246, 23, 215, 254, 55, 250, 247, 193, + 248, 232, 189, 23, 215, 254, 238, 183, 23, 215, 254, 198, 170, 201, 230, + 216, 0, 23, 215, 254, 198, 170, 193, 248, 232, 189, 23, 215, 254, 198, + 170, 250, 247, 216, 0, 23, 215, 254, 198, 170, 250, 247, 193, 248, 232, + 189, 23, 215, 254, 248, 78, 23, 215, 254, 238, 224, 202, 236, 23, 215, + 254, 238, 224, 217, 30, 23, 215, 254, 238, 224, 220, 72, 23, 215, 254, + 242, 243, 23, 215, 254, 105, 202, 236, 23, 215, 254, 105, 217, 30, 23, + 215, 254, 105, 220, 72, 23, 215, 254, 192, 21, 202, 236, 23, 215, 254, + 192, 21, 217, 30, 23, 215, 254, 192, 21, 220, 72, 23, 215, 254, 210, 176, + 202, 236, 23, 215, 254, 210, 176, 217, 30, 23, 215, 254, 210, 176, 220, + 72, 23, 198, 201, 207, 13, 203, 73, 23, 198, 201, 207, 13, 235, 106, 23, + 198, 201, 207, 13, 250, 246, 23, 198, 201, 207, 12, 203, 73, 23, 198, + 201, 207, 12, 235, 106, 23, 198, 201, 207, 12, 250, 246, 23, 198, 201, + 204, 43, 23, 215, 252, 238, 132, 208, 168, 202, 236, 23, 215, 252, 238, + 132, 208, 168, 217, 30, 23, 215, 252, 238, 132, 208, 168, 220, 72, 23, + 215, 252, 238, 132, 208, 168, 220, 70, 23, 215, 252, 238, 132, 230, 75, + 202, 236, 23, 215, 252, 238, 132, 230, 75, 217, 30, 23, 215, 252, 238, + 132, 230, 75, 220, 72, 23, 215, 252, 238, 132, 230, 75, 220, 70, 23, 215, + 252, 238, 132, 199, 153, 242, 131, 202, 236, 23, 215, 252, 238, 132, 199, + 153, 242, 131, 217, 30, 23, 215, 252, 228, 165, 202, 236, 23, 215, 252, + 228, 165, 217, 30, 23, 215, 252, 228, 165, 220, 72, 23, 215, 252, 219, + 70, 202, 236, 23, 215, 252, 219, 70, 217, 30, 23, 215, 252, 219, 70, 220, + 72, 23, 215, 252, 219, 70, 2, 235, 106, 23, 215, 252, 194, 125, 238, 132, + 55, 202, 236, 23, 215, 252, 194, 125, 238, 132, 55, 217, 30, 23, 215, + 252, 194, 125, 238, 132, 55, 220, 72, 23, 215, 252, 194, 125, 238, 132, + 198, 170, 202, 236, 23, 215, 252, 194, 125, 238, 132, 198, 170, 217, 30, + 23, 215, 252, 194, 125, 238, 132, 198, 170, 220, 72, 23, 215, 252, 238, + 132, 199, 216, 201, 229, 23, 215, 252, 238, 130, 238, 184, 202, 236, 23, + 215, 252, 238, 130, 238, 184, 217, 30, 23, 207, 12, 203, 73, 23, 207, 12, + 235, 106, 23, 207, 12, 250, 248, 23, 215, 252, 204, 43, 23, 215, 252, + 238, 132, 229, 136, 232, 88, 194, 151, 23, 215, 252, 228, 165, 229, 136, + 232, 88, 194, 151, 23, 215, 252, 219, 70, 229, 136, 232, 88, 194, 151, + 23, 215, 252, 194, 125, 229, 136, 232, 88, 194, 151, 23, 207, 12, 203, + 74, 229, 136, 232, 88, 194, 151, 23, 207, 12, 55, 229, 136, 232, 88, 194, + 151, 23, 207, 12, 250, 247, 229, 136, 232, 88, 194, 151, 23, 215, 252, + 238, 132, 229, 136, 242, 224, 23, 215, 252, 228, 165, 229, 136, 242, 224, + 23, 215, 252, 219, 70, 229, 136, 242, 224, 23, 215, 252, 194, 125, 229, + 136, 242, 224, 23, 207, 12, 203, 74, 229, 136, 242, 224, 23, 207, 12, 55, + 229, 136, 242, 224, 23, 207, 12, 250, 247, 229, 136, 242, 224, 23, 215, + 252, 194, 125, 237, 11, 210, 203, 202, 236, 23, 215, 252, 194, 125, 237, + 11, 210, 203, 217, 30, 23, 215, 252, 194, 125, 237, 11, 210, 203, 220, + 72, 23, 215, 254, 238, 132, 229, 136, 246, 147, 202, 236, 23, 215, 254, + 238, 132, 229, 136, 246, 147, 220, 72, 23, 215, 254, 228, 165, 229, 136, + 246, 147, 2, 235, 106, 23, 215, 254, 228, 165, 229, 136, 246, 147, 220, + 73, 235, 106, 23, 215, 254, 228, 165, 229, 136, 246, 147, 2, 198, 169, + 23, 215, 254, 228, 165, 229, 136, 246, 147, 220, 73, 198, 169, 23, 215, + 254, 219, 70, 229, 136, 246, 147, 2, 203, 73, 23, 215, 254, 219, 70, 229, + 136, 246, 147, 220, 73, 203, 73, 23, 215, 254, 219, 70, 229, 136, 246, + 147, 2, 235, 106, 23, 215, 254, 219, 70, 229, 136, 246, 147, 220, 73, + 235, 106, 23, 215, 254, 194, 125, 229, 136, 246, 147, 202, 236, 23, 215, + 254, 194, 125, 229, 136, 246, 147, 220, 72, 23, 207, 13, 203, 74, 229, + 136, 246, 146, 23, 207, 13, 55, 229, 136, 246, 146, 23, 207, 13, 250, + 247, 229, 136, 246, 146, 23, 215, 254, 238, 132, 229, 136, 232, 183, 202, + 236, 23, 215, 254, 238, 132, 229, 136, 232, 183, 220, 72, 23, 215, 254, + 228, 165, 229, 136, 232, 183, 2, 235, 106, 23, 215, 254, 228, 165, 229, + 136, 232, 183, 220, 73, 235, 106, 23, 215, 254, 228, 165, 229, 136, 232, + 183, 198, 170, 2, 198, 169, 23, 215, 254, 228, 165, 229, 136, 232, 183, + 198, 170, 220, 73, 198, 169, 23, 215, 254, 219, 70, 229, 136, 232, 183, + 2, 203, 73, 23, 215, 254, 219, 70, 229, 136, 232, 183, 220, 73, 203, 73, + 23, 215, 254, 219, 70, 229, 136, 232, 183, 2, 235, 106, 23, 215, 254, + 219, 70, 229, 136, 232, 183, 220, 73, 235, 106, 23, 215, 254, 194, 125, + 229, 136, 232, 183, 202, 236, 23, 215, 254, 194, 125, 229, 136, 232, 183, + 220, 72, 23, 207, 13, 203, 74, 229, 136, 232, 182, 23, 207, 13, 55, 229, + 136, 232, 182, 23, 207, 13, 250, 247, 229, 136, 232, 182, 23, 215, 254, + 238, 132, 202, 236, 23, 215, 254, 238, 132, 217, 30, 23, 215, 254, 238, + 132, 220, 72, 23, 215, 254, 238, 132, 220, 70, 23, 215, 254, 238, 132, + 242, 42, 23, 215, 254, 228, 165, 202, 236, 23, 215, 254, 219, 70, 202, + 236, 23, 215, 254, 194, 125, 202, 224, 23, 215, 254, 194, 125, 202, 236, + 23, 215, 254, 194, 125, 220, 72, 23, 207, 13, 203, 73, 23, 207, 13, 235, + 106, 23, 207, 13, 250, 246, 23, 215, 254, 204, 44, 210, 235, 23, 215, + 252, 250, 93, 242, 131, 2, 203, 73, 23, 215, 252, 250, 93, 242, 131, 217, + 31, 203, 73, 23, 215, 252, 250, 93, 242, 131, 2, 235, 106, 23, 215, 252, + 250, 93, 242, 131, 217, 31, 235, 106, 23, 215, 254, 250, 93, 242, 131, + 229, 136, 194, 152, 2, 203, 73, 23, 215, 254, 250, 93, 242, 131, 229, + 136, 194, 152, 217, 31, 203, 73, 23, 215, 254, 250, 93, 242, 131, 229, + 136, 194, 152, 220, 73, 203, 73, 23, 215, 254, 250, 93, 242, 131, 229, + 136, 194, 152, 2, 235, 106, 23, 215, 254, 250, 93, 242, 131, 229, 136, + 194, 152, 217, 31, 235, 106, 23, 215, 254, 250, 93, 242, 131, 229, 136, + 194, 152, 220, 73, 235, 106, 23, 215, 252, 193, 248, 242, 131, 232, 88, + 203, 73, 23, 215, 252, 193, 248, 242, 131, 232, 88, 235, 106, 23, 215, + 254, 193, 248, 242, 131, 229, 136, 194, 152, 203, 73, 23, 215, 254, 193, + 248, 242, 131, 229, 136, 194, 152, 235, 106, 23, 215, 252, 232, 241, 242, + 128, 203, 73, 23, 215, 252, 232, 241, 242, 128, 235, 106, 23, 215, 254, + 232, 241, 242, 128, 229, 136, 194, 152, 203, 73, 23, 215, 254, 232, 241, + 242, 128, 229, 136, 194, 152, 235, 106, 23, 235, 22, 250, 78, 202, 236, + 23, 235, 22, 250, 78, 220, 72, 23, 235, 22, 233, 61, 23, 235, 22, 202, + 239, 23, 235, 22, 200, 23, 23, 235, 22, 207, 213, 23, 235, 22, 203, 80, + 23, 235, 22, 203, 81, 250, 246, 23, 235, 22, 233, 213, 211, 137, 199, 84, + 23, 235, 22, 230, 225, 23, 229, 245, 23, 229, 246, 207, 86, 23, 229, 246, + 215, 252, 201, 229, 23, 229, 246, 215, 252, 199, 87, 23, 229, 246, 215, + 254, 201, 229, 23, 229, 246, 215, 252, 238, 131, 23, 229, 246, 215, 254, + 238, 131, 23, 229, 246, 216, 1, 242, 130, 23, 233, 92, 236, 205, 209, + 160, 213, 113, 232, 124, 199, 85, 23, 233, 92, 236, 205, 209, 160, 213, + 113, 130, 211, 164, 235, 96, 23, 233, 92, 236, 205, 209, 160, 213, 113, + 130, 211, 164, 142, 199, 85, 23, 233, 179, 201, 230, 197, 41, 23, 233, + 179, 201, 230, 214, 178, 23, 233, 179, 201, 230, 235, 96, 23, 235, 80, + 233, 179, 214, 179, 235, 96, 23, 235, 80, 233, 179, 142, 214, 178, 23, + 235, 80, 233, 179, 130, 214, 178, 23, 235, 80, 233, 179, 214, 179, 197, + 41, 23, 232, 141, 214, 178, 23, 232, 141, 239, 0, 23, 232, 141, 193, 251, + 23, 233, 174, 211, 183, 23, 233, 174, 202, 101, 23, 233, 174, 242, 83, + 23, 233, 182, 247, 239, 203, 73, 23, 233, 182, 247, 239, 215, 215, 23, + 233, 174, 138, 211, 183, 23, 233, 174, 194, 64, 211, 183, 23, 233, 174, + 138, 242, 83, 23, 233, 174, 194, 62, 216, 0, 23, 233, 182, 194, 45, 23, + 233, 175, 197, 41, 23, 233, 175, 235, 96, 23, 233, 175, 232, 169, 23, + 233, 177, 201, 229, 23, 233, 177, 201, 230, 235, 106, 23, 233, 177, 201, + 230, 250, 246, 23, 233, 178, 201, 229, 23, 233, 178, 201, 230, 235, 106, + 23, 233, 178, 201, 230, 250, 246, 23, 233, 177, 238, 129, 23, 233, 178, + 238, 129, 23, 233, 177, 242, 125, 23, 242, 239, 209, 41, 23, 242, 239, + 214, 178, 23, 242, 239, 201, 143, 23, 200, 24, 242, 239, 229, 155, 23, + 200, 24, 242, 239, 216, 160, 23, 200, 24, 242, 239, 219, 52, 23, 234, + 191, 23, 213, 113, 214, 178, 23, 213, 113, 239, 0, 23, 213, 113, 193, + 249, 23, 213, 113, 194, 59, 23, 251, 53, 247, 225, 211, 125, 23, 251, 53, + 201, 142, 223, 190, 23, 251, 53, 247, 227, 2, 207, 11, 23, 251, 53, 201, + 144, 2, 207, 11, 23, 247, 152, 223, 162, 23, 247, 152, 233, 202, 23, 216, + 5, 242, 84, 214, 178, 23, 216, 5, 242, 84, 232, 123, 23, 216, 5, 242, 84, + 239, 0, 23, 216, 5, 202, 231, 23, 216, 5, 202, 232, 193, 251, 23, 216, 5, + 202, 232, 211, 183, 23, 216, 5, 232, 84, 23, 216, 5, 232, 85, 193, 251, + 23, 216, 5, 232, 85, 211, 183, 23, 216, 5, 211, 184, 242, 130, 23, 216, + 5, 211, 184, 232, 123, 23, 216, 5, 211, 184, 193, 251, 23, 216, 5, 211, + 184, 211, 118, 23, 216, 5, 211, 184, 211, 119, 193, 251, 23, 216, 5, 211, + 184, 211, 119, 193, 77, 23, 216, 5, 211, 184, 207, 242, 23, 216, 5, 211, + 184, 207, 243, 193, 251, 23, 216, 5, 211, 184, 207, 243, 193, 77, 23, + 216, 5, 221, 160, 23, 216, 5, 221, 161, 232, 123, 23, 216, 5, 221, 161, + 193, 251, 23, 216, 5, 200, 23, 23, 216, 5, 200, 24, 232, 123, 23, 216, 5, + 200, 24, 201, 143, 23, 219, 160, 209, 103, 199, 26, 23, 219, 162, 106, + 136, 197, 38, 23, 219, 162, 113, 136, 219, 47, 23, 216, 5, 238, 222, 23, + 216, 5, 193, 250, 203, 73, 23, 216, 5, 193, 250, 235, 106, 23, 199, 1, + 201, 249, 211, 126, 233, 63, 23, 199, 1, 219, 205, 219, 159, 23, 199, 1, + 199, 74, 248, 61, 219, 159, 23, 199, 1, 199, 74, 198, 231, 223, 146, 216, + 4, 23, 199, 1, 223, 146, 216, 5, 207, 213, 23, 199, 1, 215, 251, 251, 78, + 242, 240, 23, 199, 1, 246, 138, 201, 249, 211, 125, 23, 199, 1, 246, 138, + 223, 146, 216, 4, 23, 200, 52, 23, 200, 53, 216, 0, 23, 200, 53, 211, + 212, 199, 0, 23, 200, 53, 211, 212, 199, 1, 216, 0, 23, 200, 53, 211, + 212, 219, 159, 23, 200, 53, 211, 212, 219, 160, 216, 0, 23, 200, 53, 247, + 255, 219, 159, 23, 215, 252, 223, 45, 23, 215, 254, 223, 45, 23, 214, + 205, 23, 230, 86, 23, 233, 205, 23, 203, 177, 229, 143, 202, 134, 23, + 203, 177, 229, 143, 209, 158, 23, 194, 150, 203, 177, 229, 143, 216, 3, + 23, 232, 181, 203, 177, 229, 143, 216, 3, 23, 203, 177, 199, 86, 232, 89, + 194, 156, 23, 198, 238, 201, 230, 201, 217, 23, 198, 238, 238, 130, 248, + 78, 23, 198, 239, 197, 223, 23, 113, 247, 214, 199, 86, 232, 89, 229, + 143, 222, 227, 23, 219, 187, 242, 43, 23, 219, 187, 220, 1, 23, 219, 187, + 220, 0, 23, 219, 187, 219, 255, 23, 219, 187, 219, 254, 23, 219, 187, + 219, 253, 23, 219, 187, 219, 252, 23, 219, 187, 219, 251, 23, 232, 240, + 23, 219, 101, 202, 160, 23, 219, 102, 202, 160, 23, 219, 104, 229, 218, + 23, 219, 104, 194, 60, 23, 219, 104, 237, 63, 23, 219, 104, 229, 246, + 214, 205, 23, 219, 104, 198, 240, 23, 219, 104, 219, 186, 236, 237, 23, + 242, 38, 23, 232, 71, 201, 238, 23, 204, 180, 23, 242, 47, 23, 210, 230, + 23, 232, 250, 216, 67, 23, 232, 250, 216, 66, 23, 232, 250, 216, 65, 23, + 232, 250, 216, 64, 23, 232, 250, 216, 63, 23, 207, 15, 216, 67, 23, 207, + 15, 216, 66, 23, 207, 15, 216, 65, 23, 207, 15, 216, 64, 23, 207, 15, + 216, 63, 23, 207, 15, 216, 62, 23, 207, 15, 216, 61, 23, 207, 15, 216, + 60, 23, 207, 15, 216, 74, 23, 207, 15, 216, 73, 23, 207, 15, 216, 72, 23, + 207, 15, 216, 71, 23, 207, 15, 216, 70, 23, 207, 15, 216, 69, 23, 207, + 15, 216, 68, 38, 131, 1, 249, 227, 38, 131, 1, 247, 110, 38, 131, 1, 196, + 121, 38, 131, 1, 231, 13, 38, 131, 1, 236, 141, 38, 131, 1, 193, 38, 38, + 131, 1, 192, 55, 38, 131, 1, 192, 81, 38, 131, 1, 223, 69, 38, 131, 1, + 88, 223, 69, 38, 131, 1, 70, 38, 131, 1, 236, 162, 38, 131, 1, 222, 127, + 38, 131, 1, 219, 139, 38, 131, 1, 215, 155, 38, 131, 1, 215, 46, 38, 131, + 1, 211, 196, 38, 131, 1, 209, 185, 38, 131, 1, 207, 72, 38, 131, 1, 202, + 241, 38, 131, 1, 197, 251, 38, 131, 1, 197, 88, 38, 131, 1, 232, 92, 38, + 131, 1, 229, 198, 38, 131, 1, 203, 167, 38, 131, 1, 198, 97, 38, 131, 1, + 242, 174, 38, 131, 1, 204, 64, 38, 131, 1, 193, 47, 38, 131, 1, 193, 49, + 38, 131, 1, 193, 82, 38, 131, 1, 192, 214, 38, 131, 1, 2, 192, 179, 38, + 131, 1, 193, 1, 38, 131, 1, 223, 110, 2, 192, 179, 38, 131, 1, 248, 28, + 192, 179, 38, 131, 1, 223, 110, 248, 28, 192, 179, 38, 131, 1, 232, 216, + 212, 180, 209, 48, 89, 1, 172, 212, 180, 209, 48, 89, 1, 198, 118, 212, + 180, 209, 48, 89, 1, 213, 43, 212, 180, 209, 48, 89, 1, 189, 212, 180, + 209, 48, 89, 1, 144, 212, 180, 209, 48, 89, 1, 181, 212, 180, 209, 48, + 89, 1, 193, 209, 212, 180, 209, 48, 89, 1, 213, 210, 212, 180, 209, 48, + 89, 1, 247, 19, 212, 180, 209, 48, 89, 1, 177, 212, 180, 209, 48, 89, 1, + 188, 212, 180, 209, 48, 89, 1, 192, 112, 212, 180, 209, 48, 89, 1, 215, + 3, 212, 180, 209, 48, 89, 1, 213, 30, 212, 180, 209, 48, 89, 1, 160, 212, + 180, 209, 48, 89, 1, 238, 0, 212, 180, 209, 48, 89, 1, 212, 201, 212, + 180, 209, 48, 89, 1, 213, 88, 212, 180, 209, 48, 89, 1, 196, 157, 212, + 180, 209, 48, 89, 1, 213, 24, 212, 180, 209, 48, 89, 1, 197, 215, 212, + 180, 209, 48, 89, 1, 233, 97, 212, 180, 209, 48, 89, 1, 167, 212, 180, + 209, 48, 89, 1, 208, 239, 212, 180, 209, 48, 89, 1, 168, 212, 180, 209, + 48, 89, 1, 213, 90, 212, 180, 209, 48, 89, 1, 166, 212, 180, 209, 48, 89, + 1, 193, 164, 212, 180, 209, 48, 89, 1, 213, 92, 212, 180, 209, 48, 89, 1, + 236, 158, 212, 180, 209, 48, 89, 1, 213, 91, 212, 180, 209, 48, 89, 1, + 230, 89, 212, 180, 209, 48, 89, 1, 216, 98, 212, 180, 209, 48, 89, 1, + 209, 234, 212, 180, 209, 48, 89, 1, 231, 233, 212, 180, 209, 48, 89, 1, + 207, 3, 212, 180, 209, 48, 89, 1, 64, 212, 180, 209, 48, 89, 1, 252, 33, + 212, 180, 209, 48, 89, 1, 70, 212, 180, 209, 48, 89, 1, 68, 212, 180, + 209, 48, 89, 1, 74, 212, 180, 209, 48, 89, 1, 211, 194, 212, 180, 209, + 48, 89, 1, 71, 212, 180, 209, 48, 89, 1, 234, 171, 212, 180, 209, 48, 89, + 1, 194, 202, 212, 180, 209, 48, 89, 199, 9, 212, 180, 209, 48, 89, 199, + 5, 212, 180, 209, 48, 89, 199, 6, 212, 180, 209, 48, 89, 199, 3, 212, + 180, 209, 48, 89, 199, 4, 212, 180, 209, 48, 89, 199, 7, 212, 180, 209, + 48, 89, 199, 8, 212, 180, 209, 48, 89, 3, 39, 210, 116, 212, 180, 209, + 48, 89, 3, 39, 199, 194, 212, 180, 209, 48, 89, 3, 39, 219, 103, 212, + 180, 209, 48, 89, 3, 39, 250, 198, 212, 180, 209, 48, 89, 3, 39, 223, + 122, 212, 180, 209, 48, 89, 3, 193, 172, 193, 171, 212, 180, 209, 48, 89, + 5, 219, 250, 212, 180, 209, 48, 89, 17, 192, 76, 212, 180, 209, 48, 89, + 17, 101, 212, 180, 209, 48, 89, 17, 104, 212, 180, 209, 48, 89, 17, 133, + 212, 180, 209, 48, 89, 17, 134, 212, 180, 209, 48, 89, 17, 151, 212, 180, + 209, 48, 89, 17, 170, 212, 180, 209, 48, 89, 17, 179, 212, 180, 209, 48, + 89, 17, 174, 212, 180, 209, 48, 89, 17, 182, 212, 180, 209, 48, 89, 219, + 92, 212, 196, 212, 180, 209, 48, 89, 47, 247, 19, 194, 148, 1, 252, 33, + 194, 148, 1, 64, 194, 148, 1, 249, 3, 194, 148, 1, 247, 19, 194, 148, 1, + 238, 0, 194, 148, 1, 231, 233, 194, 148, 1, 168, 194, 148, 1, 210, 94, + 194, 148, 1, 177, 194, 148, 1, 181, 194, 148, 1, 166, 194, 148, 1, 189, + 194, 148, 1, 199, 240, 194, 148, 1, 233, 97, 194, 148, 1, 188, 194, 148, + 1, 204, 64, 194, 148, 1, 223, 62, 194, 148, 1, 192, 112, 194, 148, 1, + 194, 169, 194, 148, 1, 196, 157, 194, 148, 1, 160, 194, 148, 1, 74, 194, + 148, 1, 250, 8, 194, 148, 1, 167, 194, 148, 1, 172, 194, 148, 1, 221, + 250, 194, 148, 1, 144, 194, 148, 1, 71, 194, 148, 1, 70, 194, 148, 1, + 214, 165, 194, 148, 1, 68, 194, 148, 1, 219, 130, 194, 148, 1, 198, 118, + 194, 148, 1, 198, 223, 194, 148, 1, 211, 201, 194, 148, 1, 251, 248, 194, + 148, 1, 250, 214, 194, 148, 1, 223, 164, 194, 148, 1, 211, 211, 194, 148, + 1, 234, 88, 194, 148, 1, 251, 249, 194, 148, 1, 212, 201, 194, 148, 1, + 197, 100, 194, 148, 1, 193, 13, 194, 148, 158, 198, 18, 194, 148, 158, + 198, 17, 194, 148, 158, 221, 101, 194, 148, 158, 221, 100, 194, 148, 17, + 192, 76, 194, 148, 17, 101, 194, 148, 17, 104, 194, 148, 17, 133, 194, + 148, 17, 134, 194, 148, 17, 151, 194, 148, 17, 170, 194, 148, 17, 179, + 194, 148, 17, 174, 194, 148, 17, 182, 194, 148, 214, 73, 57, 83, 82, 5, + 218, 235, 221, 204, 83, 82, 5, 218, 231, 160, 83, 82, 5, 218, 229, 221, + 33, 83, 82, 5, 218, 105, 222, 48, 83, 82, 5, 218, 75, 222, 57, 83, 82, 5, + 218, 94, 221, 88, 83, 82, 5, 218, 122, 221, 113, 83, 82, 5, 217, 247, + 221, 20, 83, 82, 5, 218, 226, 194, 72, 83, 82, 5, 218, 224, 194, 169, 83, + 82, 5, 218, 222, 193, 244, 83, 82, 5, 218, 44, 194, 100, 83, 82, 5, 218, + 52, 194, 111, 83, 82, 5, 218, 56, 194, 17, 83, 82, 5, 218, 125, 194, 36, + 83, 82, 5, 217, 232, 193, 240, 83, 82, 5, 218, 27, 194, 98, 83, 82, 5, + 218, 109, 193, 228, 83, 82, 5, 218, 121, 193, 230, 83, 82, 5, 218, 31, + 193, 229, 83, 82, 5, 218, 220, 216, 120, 83, 82, 5, 218, 218, 217, 160, + 83, 82, 5, 218, 216, 215, 209, 83, 82, 5, 218, 111, 217, 5, 83, 82, 5, + 218, 76, 216, 55, 83, 82, 5, 218, 16, 215, 234, 83, 82, 5, 217, 237, 215, + 228, 83, 82, 5, 218, 214, 248, 41, 83, 82, 5, 218, 211, 249, 3, 83, 82, + 5, 218, 209, 247, 124, 83, 82, 5, 218, 20, 248, 108, 83, 82, 5, 218, 73, + 248, 123, 83, 82, 5, 218, 67, 247, 206, 83, 82, 5, 218, 32, 247, 220, 83, + 82, 5, 218, 199, 70, 83, 82, 5, 218, 197, 64, 83, 82, 5, 218, 195, 68, + 83, 82, 5, 218, 7, 234, 171, 83, 82, 5, 218, 70, 71, 83, 82, 5, 218, 5, + 211, 194, 83, 82, 5, 218, 23, 74, 83, 82, 5, 218, 33, 234, 150, 83, 82, + 5, 218, 39, 223, 190, 83, 82, 5, 218, 35, 223, 190, 83, 82, 5, 217, 231, + 250, 224, 83, 82, 5, 217, 248, 234, 88, 83, 82, 5, 218, 184, 203, 125, + 83, 82, 5, 218, 182, 188, 83, 82, 5, 218, 180, 201, 184, 83, 82, 5, 218, + 8, 205, 205, 83, 82, 5, 218, 54, 205, 223, 83, 82, 5, 218, 34, 202, 183, + 83, 82, 5, 218, 91, 202, 212, 83, 82, 5, 217, 230, 203, 118, 83, 82, 5, + 218, 170, 219, 209, 83, 82, 5, 218, 168, 177, 83, 82, 5, 218, 166, 219, + 36, 83, 82, 5, 218, 86, 220, 32, 83, 82, 5, 218, 97, 220, 42, 83, 82, 5, + 218, 116, 219, 73, 83, 82, 5, 218, 17, 219, 107, 83, 82, 5, 218, 60, 184, + 220, 42, 83, 82, 5, 218, 192, 237, 16, 83, 82, 5, 218, 189, 238, 0, 83, + 82, 5, 218, 186, 235, 62, 83, 82, 5, 218, 81, 237, 101, 83, 82, 5, 217, + 246, 236, 120, 83, 82, 5, 217, 245, 236, 146, 83, 82, 5, 218, 178, 199, + 128, 83, 82, 5, 218, 175, 189, 83, 82, 5, 218, 173, 198, 45, 83, 82, 5, + 218, 79, 200, 56, 83, 82, 5, 218, 115, 200, 79, 83, 82, 5, 218, 66, 198, + 254, 83, 82, 5, 218, 101, 155, 83, 82, 5, 218, 164, 223, 20, 83, 82, 5, + 218, 161, 223, 62, 83, 82, 5, 218, 159, 222, 214, 83, 82, 5, 218, 13, + 223, 39, 83, 82, 5, 218, 57, 223, 41, 83, 82, 5, 218, 10, 222, 223, 83, + 82, 5, 218, 107, 222, 233, 83, 82, 5, 217, 251, 184, 222, 233, 83, 82, 5, + 218, 157, 193, 22, 83, 82, 5, 218, 154, 168, 83, 82, 5, 218, 152, 192, + 214, 83, 82, 5, 218, 61, 193, 66, 83, 82, 5, 218, 90, 193, 69, 83, 82, 5, + 218, 29, 192, 235, 83, 82, 5, 218, 49, 193, 1, 83, 82, 5, 218, 148, 233, + 11, 83, 82, 5, 218, 146, 233, 97, 83, 82, 5, 218, 144, 232, 77, 83, 82, + 5, 218, 92, 233, 40, 83, 82, 5, 218, 95, 233, 47, 83, 82, 5, 218, 37, + 232, 152, 83, 82, 5, 218, 82, 232, 164, 83, 82, 5, 217, 229, 232, 76, 83, + 82, 5, 218, 69, 233, 68, 83, 82, 5, 218, 142, 214, 20, 83, 82, 5, 218, + 140, 215, 61, 83, 82, 5, 218, 138, 212, 230, 83, 82, 5, 218, 53, 214, + 196, 83, 82, 5, 218, 1, 213, 130, 83, 82, 5, 217, 250, 229, 178, 83, 82, + 5, 218, 133, 144, 83, 82, 5, 217, 240, 228, 181, 83, 82, 5, 218, 136, + 229, 225, 83, 82, 5, 218, 74, 229, 255, 83, 82, 5, 218, 131, 229, 16, 83, + 82, 5, 218, 30, 229, 43, 83, 82, 5, 218, 87, 229, 224, 83, 82, 5, 218, + 42, 229, 9, 83, 82, 5, 218, 117, 229, 148, 83, 82, 5, 218, 40, 230, 65, + 83, 82, 5, 218, 83, 228, 164, 83, 82, 5, 218, 118, 229, 208, 83, 82, 5, + 217, 233, 229, 19, 83, 82, 5, 218, 124, 228, 177, 83, 82, 5, 218, 80, + 214, 130, 83, 82, 5, 218, 129, 214, 144, 83, 82, 5, 218, 88, 214, 127, + 83, 82, 5, 218, 55, 214, 138, 83, 82, 5, 218, 24, 214, 139, 83, 82, 5, + 218, 14, 214, 128, 83, 82, 5, 218, 50, 214, 129, 83, 82, 5, 218, 11, 214, + 143, 83, 82, 5, 218, 43, 214, 126, 83, 82, 5, 218, 84, 184, 214, 139, 83, + 82, 5, 218, 64, 184, 214, 128, 83, 82, 5, 217, 243, 184, 214, 129, 83, + 82, 5, 218, 15, 231, 46, 83, 82, 5, 218, 59, 231, 233, 83, 82, 5, 218, 2, + 230, 186, 83, 82, 5, 217, 236, 231, 150, 83, 82, 5, 218, 4, 230, 172, 83, + 82, 5, 218, 3, 230, 182, 83, 82, 5, 217, 242, 214, 149, 83, 82, 5, 218, + 113, 214, 86, 83, 82, 5, 217, 249, 214, 75, 83, 82, 5, 218, 102, 210, 51, + 83, 82, 5, 218, 71, 166, 83, 82, 5, 218, 120, 209, 51, 83, 82, 5, 218, + 89, 210, 168, 83, 82, 5, 218, 119, 210, 181, 83, 82, 5, 218, 68, 209, + 172, 83, 82, 5, 218, 104, 209, 198, 83, 82, 5, 218, 25, 217, 67, 83, 82, + 5, 218, 108, 217, 82, 83, 82, 5, 218, 48, 217, 61, 83, 82, 5, 218, 123, + 217, 74, 83, 82, 5, 217, 238, 217, 74, 83, 82, 5, 218, 98, 217, 75, 83, + 82, 5, 217, 254, 217, 62, 83, 82, 5, 217, 252, 217, 63, 83, 82, 5, 217, + 239, 217, 55, 83, 82, 5, 218, 9, 184, 217, 75, 83, 82, 5, 218, 65, 184, + 217, 62, 83, 82, 5, 218, 28, 184, 217, 63, 83, 82, 5, 218, 38, 221, 61, + 83, 82, 5, 218, 78, 221, 69, 83, 82, 5, 218, 96, 221, 57, 83, 82, 5, 218, + 127, 221, 64, 83, 82, 5, 218, 62, 221, 65, 83, 82, 5, 218, 58, 221, 59, + 83, 82, 5, 218, 12, 221, 60, 83, 82, 5, 218, 46, 231, 167, 83, 82, 5, + 218, 114, 231, 175, 83, 82, 5, 218, 22, 231, 162, 83, 82, 5, 218, 77, + 231, 171, 83, 82, 5, 218, 63, 231, 172, 83, 82, 5, 218, 99, 231, 163, 83, + 82, 5, 218, 100, 231, 165, 83, 82, 5, 217, 255, 167, 83, 82, 5, 218, 47, + 214, 240, 83, 82, 5, 218, 41, 214, 255, 83, 82, 5, 218, 45, 214, 222, 83, + 82, 5, 217, 235, 214, 246, 83, 82, 5, 218, 51, 214, 247, 83, 82, 5, 218, + 103, 214, 227, 83, 82, 5, 218, 106, 214, 231, 83, 82, 5, 218, 18, 214, 0, + 83, 82, 5, 217, 234, 213, 226, 83, 82, 5, 218, 21, 213, 247, 83, 82, 5, + 218, 36, 213, 230, 83, 82, 5, 217, 244, 196, 39, 83, 82, 5, 217, 241, + 196, 157, 83, 82, 5, 218, 19, 194, 223, 83, 82, 5, 217, 253, 196, 118, + 83, 82, 5, 218, 85, 196, 123, 83, 82, 5, 218, 26, 195, 236, 83, 82, 5, + 218, 93, 195, 252, 83, 82, 5, 218, 6, 212, 174, 83, 82, 5, 218, 112, 212, + 194, 83, 82, 5, 218, 0, 212, 156, 83, 82, 5, 218, 72, 212, 186, 83, 82, + 5, 218, 110, 212, 163, 83, 82, 17, 101, 83, 82, 17, 104, 83, 82, 17, 133, + 83, 82, 17, 134, 83, 82, 17, 151, 83, 82, 17, 170, 83, 82, 17, 179, 83, + 82, 17, 174, 83, 82, 17, 182, 83, 82, 38, 31, 200, 54, 83, 82, 38, 31, + 200, 25, 83, 82, 38, 31, 228, 160, 83, 82, 38, 31, 199, 163, 83, 82, 38, + 31, 200, 31, 199, 163, 83, 82, 38, 31, 228, 163, 199, 163, 83, 82, 38, + 31, 216, 123, 251, 116, 6, 1, 251, 14, 251, 116, 6, 1, 237, 253, 251, + 116, 6, 1, 220, 182, 251, 116, 6, 1, 216, 136, 251, 116, 6, 1, 249, 3, + 251, 116, 6, 1, 203, 68, 251, 116, 6, 1, 210, 181, 251, 116, 6, 1, 248, + 49, 251, 116, 6, 1, 167, 251, 116, 6, 1, 71, 251, 116, 6, 1, 233, 97, + 251, 116, 6, 1, 70, 251, 116, 6, 1, 74, 251, 116, 6, 1, 237, 40, 251, + 116, 6, 1, 193, 23, 251, 116, 6, 1, 194, 119, 251, 116, 6, 1, 212, 230, + 251, 116, 6, 1, 222, 139, 251, 116, 6, 1, 168, 251, 116, 6, 1, 68, 251, + 116, 6, 1, 223, 11, 251, 116, 6, 1, 242, 215, 251, 116, 6, 1, 144, 251, + 116, 6, 1, 208, 237, 251, 116, 6, 1, 231, 233, 251, 116, 6, 1, 212, 201, + 251, 116, 6, 1, 198, 45, 251, 116, 6, 1, 214, 65, 251, 116, 6, 1, 196, + 157, 251, 116, 6, 1, 221, 250, 251, 116, 6, 1, 231, 172, 251, 116, 6, 1, + 192, 101, 251, 116, 6, 1, 221, 60, 251, 116, 6, 1, 204, 64, 251, 116, 2, + 1, 251, 14, 251, 116, 2, 1, 237, 253, 251, 116, 2, 1, 220, 182, 251, 116, + 2, 1, 216, 136, 251, 116, 2, 1, 249, 3, 251, 116, 2, 1, 203, 68, 251, + 116, 2, 1, 210, 181, 251, 116, 2, 1, 248, 49, 251, 116, 2, 1, 167, 251, + 116, 2, 1, 71, 251, 116, 2, 1, 233, 97, 251, 116, 2, 1, 70, 251, 116, 2, + 1, 74, 251, 116, 2, 1, 237, 40, 251, 116, 2, 1, 193, 23, 251, 116, 2, 1, + 194, 119, 251, 116, 2, 1, 212, 230, 251, 116, 2, 1, 222, 139, 251, 116, + 2, 1, 168, 251, 116, 2, 1, 68, 251, 116, 2, 1, 223, 11, 251, 116, 2, 1, + 242, 215, 251, 116, 2, 1, 144, 251, 116, 2, 1, 208, 237, 251, 116, 2, 1, + 231, 233, 251, 116, 2, 1, 212, 201, 251, 116, 2, 1, 198, 45, 251, 116, 2, + 1, 214, 65, 251, 116, 2, 1, 196, 157, 251, 116, 2, 1, 221, 250, 251, 116, + 2, 1, 231, 172, 251, 116, 2, 1, 192, 101, 251, 116, 2, 1, 221, 60, 251, + 116, 2, 1, 204, 64, 251, 116, 251, 15, 219, 250, 251, 116, 18, 219, 250, + 251, 116, 231, 146, 77, 251, 116, 230, 66, 251, 116, 116, 216, 75, 251, + 116, 231, 147, 116, 216, 75, 251, 116, 212, 241, 251, 116, 215, 48, 77, + 251, 116, 17, 192, 76, 251, 116, 17, 101, 251, 116, 17, 104, 251, 116, + 17, 133, 251, 116, 17, 134, 251, 116, 17, 151, 251, 116, 17, 170, 251, + 116, 17, 179, 251, 116, 17, 174, 251, 116, 17, 182, 251, 116, 88, 233, + 204, 77, 251, 116, 88, 208, 159, 77, 223, 174, 137, 31, 101, 223, 174, + 137, 31, 104, 223, 174, 137, 31, 133, 223, 174, 137, 31, 134, 223, 174, + 137, 31, 151, 223, 174, 137, 31, 170, 223, 174, 137, 31, 179, 223, 174, + 137, 31, 174, 223, 174, 137, 31, 182, 223, 174, 137, 31, 200, 30, 223, + 174, 137, 31, 197, 239, 223, 174, 137, 31, 199, 184, 223, 174, 137, 31, + 232, 126, 223, 174, 137, 31, 233, 3, 223, 174, 137, 31, 203, 25, 223, + 174, 137, 31, 204, 140, 223, 174, 137, 31, 234, 137, 223, 174, 137, 31, + 214, 11, 223, 174, 137, 31, 90, 228, 162, 223, 174, 137, 31, 103, 228, + 162, 223, 174, 137, 31, 112, 228, 162, 223, 174, 137, 31, 232, 119, 228, + 162, 223, 174, 137, 31, 232, 214, 228, 162, 223, 174, 137, 31, 203, 41, + 228, 162, 223, 174, 137, 31, 204, 146, 228, 162, 223, 174, 137, 31, 234, + 148, 228, 162, 223, 174, 137, 31, 214, 16, 228, 162, 223, 174, 137, 31, + 90, 180, 223, 174, 137, 31, 103, 180, 223, 174, 137, 31, 112, 180, 223, + 174, 137, 31, 232, 119, 180, 223, 174, 137, 31, 232, 214, 180, 223, 174, + 137, 31, 203, 41, 180, 223, 174, 137, 31, 204, 146, 180, 223, 174, 137, + 31, 234, 148, 180, 223, 174, 137, 31, 214, 16, 180, 223, 174, 137, 31, + 200, 31, 180, 223, 174, 137, 31, 197, 240, 180, 223, 174, 137, 31, 199, + 185, 180, 223, 174, 137, 31, 232, 127, 180, 223, 174, 137, 31, 233, 4, + 180, 223, 174, 137, 31, 203, 26, 180, 223, 174, 137, 31, 204, 141, 180, + 223, 174, 137, 31, 234, 138, 180, 223, 174, 137, 31, 214, 12, 180, 223, + 174, 137, 31, 220, 100, 223, 174, 137, 31, 220, 99, 223, 174, 137, 220, + 101, 77, 223, 174, 137, 31, 222, 94, 223, 174, 137, 31, 222, 93, 223, + 174, 137, 31, 209, 111, 101, 223, 174, 137, 31, 209, 111, 104, 223, 174, + 137, 31, 209, 111, 133, 223, 174, 137, 31, 209, 111, 134, 223, 174, 137, + 31, 209, 111, 151, 223, 174, 137, 31, 209, 111, 170, 223, 174, 137, 31, + 209, 111, 179, 223, 174, 137, 31, 209, 111, 174, 223, 174, 137, 31, 209, + 111, 182, 223, 174, 137, 209, 230, 223, 174, 137, 232, 109, 90, 208, 167, + 223, 174, 137, 232, 109, 90, 230, 78, 223, 174, 137, 232, 109, 112, 208, + 165, 223, 174, 137, 206, 186, 77, 223, 174, 137, 31, 250, 249, 101, 223, + 174, 137, 31, 250, 249, 104, 223, 174, 137, 31, 250, 249, 200, 31, 180, + 223, 174, 137, 250, 249, 220, 101, 77, 211, 132, 137, 31, 101, 211, 132, + 137, 31, 104, 211, 132, 137, 31, 133, 211, 132, 137, 31, 134, 211, 132, + 137, 31, 151, 211, 132, 137, 31, 170, 211, 132, 137, 31, 179, 211, 132, + 137, 31, 174, 211, 132, 137, 31, 182, 211, 132, 137, 31, 200, 30, 211, + 132, 137, 31, 197, 239, 211, 132, 137, 31, 199, 184, 211, 132, 137, 31, + 232, 126, 211, 132, 137, 31, 233, 3, 211, 132, 137, 31, 203, 25, 211, + 132, 137, 31, 204, 140, 211, 132, 137, 31, 234, 137, 211, 132, 137, 31, + 214, 11, 211, 132, 137, 31, 90, 228, 162, 211, 132, 137, 31, 103, 228, + 162, 211, 132, 137, 31, 112, 228, 162, 211, 132, 137, 31, 232, 119, 228, + 162, 211, 132, 137, 31, 232, 214, 228, 162, 211, 132, 137, 31, 203, 41, + 228, 162, 211, 132, 137, 31, 204, 146, 228, 162, 211, 132, 137, 31, 234, + 148, 228, 162, 211, 132, 137, 31, 214, 16, 228, 162, 211, 132, 137, 31, + 90, 180, 211, 132, 137, 31, 103, 180, 211, 132, 137, 31, 112, 180, 211, + 132, 137, 31, 232, 119, 180, 211, 132, 137, 31, 232, 214, 180, 211, 132, + 137, 31, 203, 41, 180, 211, 132, 137, 31, 204, 146, 180, 211, 132, 137, + 31, 234, 148, 180, 211, 132, 137, 31, 214, 16, 180, 211, 132, 137, 31, + 200, 31, 180, 211, 132, 137, 31, 197, 240, 180, 211, 132, 137, 31, 199, + 185, 180, 211, 132, 137, 31, 232, 127, 180, 211, 132, 137, 31, 233, 4, + 180, 211, 132, 137, 31, 203, 26, 180, 211, 132, 137, 31, 204, 141, 180, + 211, 132, 137, 31, 234, 138, 180, 211, 132, 137, 31, 214, 12, 180, 211, + 132, 137, 217, 120, 211, 132, 137, 250, 249, 31, 104, 211, 132, 137, 250, + 249, 31, 133, 211, 132, 137, 250, 249, 31, 134, 211, 132, 137, 250, 249, + 31, 151, 211, 132, 137, 250, 249, 31, 170, 211, 132, 137, 250, 249, 31, + 179, 211, 132, 137, 250, 249, 31, 174, 211, 132, 137, 250, 249, 31, 182, + 211, 132, 137, 250, 249, 31, 200, 30, 211, 132, 137, 250, 249, 31, 232, + 119, 228, 162, 211, 132, 137, 250, 249, 31, 203, 41, 228, 162, 211, 132, + 137, 250, 249, 31, 103, 180, 211, 132, 137, 250, 249, 31, 200, 31, 180, + 211, 132, 137, 232, 109, 90, 230, 78, 211, 132, 137, 232, 109, 90, 203, + 29, 9, 13, 251, 26, 9, 13, 248, 96, 9, 13, 223, 37, 9, 13, 237, 227, 9, + 13, 194, 119, 9, 13, 192, 103, 9, 13, 230, 89, 9, 13, 200, 151, 9, 13, + 193, 64, 9, 13, 222, 139, 9, 13, 220, 94, 9, 13, 217, 26, 9, 13, 213, + 123, 9, 13, 205, 201, 9, 13, 251, 57, 9, 13, 233, 34, 9, 13, 206, 86, 9, + 13, 208, 232, 9, 13, 207, 221, 9, 13, 204, 8, 9, 13, 200, 49, 9, 13, 199, + 220, 9, 13, 221, 245, 9, 13, 199, 232, 9, 13, 237, 250, 9, 13, 192, 106, + 9, 13, 231, 79, 9, 13, 236, 113, 248, 96, 9, 13, 236, 113, 213, 123, 9, + 13, 236, 113, 233, 34, 9, 13, 236, 113, 208, 232, 9, 13, 88, 248, 96, 9, + 13, 88, 223, 37, 9, 13, 88, 229, 220, 9, 13, 88, 230, 89, 9, 13, 88, 193, + 64, 9, 13, 88, 222, 139, 9, 13, 88, 220, 94, 9, 13, 88, 217, 26, 9, 13, + 88, 213, 123, 9, 13, 88, 205, 201, 9, 13, 88, 251, 57, 9, 13, 88, 233, + 34, 9, 13, 88, 206, 86, 9, 13, 88, 208, 232, 9, 13, 88, 204, 8, 9, 13, + 88, 200, 49, 9, 13, 88, 199, 220, 9, 13, 88, 221, 245, 9, 13, 88, 237, + 250, 9, 13, 88, 231, 79, 9, 13, 200, 146, 223, 37, 9, 13, 200, 146, 230, + 89, 9, 13, 200, 146, 193, 64, 9, 13, 200, 146, 220, 94, 9, 13, 200, 146, + 213, 123, 9, 13, 200, 146, 205, 201, 9, 13, 200, 146, 251, 57, 9, 13, + 200, 146, 206, 86, 9, 13, 200, 146, 208, 232, 9, 13, 200, 146, 204, 8, 9, + 13, 200, 146, 221, 245, 9, 13, 200, 146, 237, 250, 9, 13, 200, 146, 231, + 79, 9, 13, 200, 146, 236, 113, 213, 123, 9, 13, 200, 146, 236, 113, 208, + 232, 9, 13, 201, 216, 248, 96, 9, 13, 201, 216, 223, 37, 9, 13, 201, 216, + 229, 220, 9, 13, 201, 216, 230, 89, 9, 13, 201, 216, 200, 151, 9, 13, + 201, 216, 193, 64, 9, 13, 201, 216, 222, 139, 9, 13, 201, 216, 217, 26, + 9, 13, 201, 216, 213, 123, 9, 13, 201, 216, 205, 201, 9, 13, 201, 216, + 251, 57, 9, 13, 201, 216, 233, 34, 9, 13, 201, 216, 206, 86, 9, 13, 201, + 216, 208, 232, 9, 13, 201, 216, 204, 8, 9, 13, 201, 216, 200, 49, 9, 13, + 201, 216, 199, 220, 9, 13, 201, 216, 221, 245, 9, 13, 201, 216, 237, 250, + 9, 13, 201, 216, 192, 106, 9, 13, 201, 216, 231, 79, 9, 13, 201, 216, + 236, 113, 248, 96, 9, 13, 201, 216, 236, 113, 233, 34, 9, 13, 219, 68, + 251, 26, 9, 13, 219, 68, 248, 96, 9, 13, 219, 68, 223, 37, 9, 13, 219, + 68, 237, 227, 9, 13, 219, 68, 229, 220, 9, 13, 219, 68, 194, 119, 9, 13, + 219, 68, 192, 103, 9, 13, 219, 68, 230, 89, 9, 13, 219, 68, 200, 151, 9, + 13, 219, 68, 193, 64, 9, 13, 219, 68, 220, 94, 9, 13, 219, 68, 217, 26, + 9, 13, 219, 68, 213, 123, 9, 13, 219, 68, 205, 201, 9, 13, 219, 68, 251, + 57, 9, 13, 219, 68, 233, 34, 9, 13, 219, 68, 206, 86, 9, 13, 219, 68, + 208, 232, 9, 13, 219, 68, 207, 221, 9, 13, 219, 68, 204, 8, 9, 13, 219, + 68, 200, 49, 9, 13, 219, 68, 199, 220, 9, 13, 219, 68, 221, 245, 9, 13, + 219, 68, 199, 232, 9, 13, 219, 68, 237, 250, 9, 13, 219, 68, 192, 106, 9, + 13, 219, 68, 231, 79, 9, 13, 235, 102, 248, 96, 9, 13, 235, 102, 223, 37, + 9, 13, 235, 102, 237, 227, 9, 13, 235, 102, 194, 119, 9, 13, 235, 102, + 192, 103, 9, 13, 235, 102, 230, 89, 9, 13, 235, 102, 200, 151, 9, 13, + 235, 102, 193, 64, 9, 13, 235, 102, 220, 94, 9, 13, 235, 102, 217, 26, 9, + 13, 235, 102, 213, 123, 9, 13, 235, 102, 205, 201, 9, 13, 235, 102, 251, + 57, 9, 13, 235, 102, 233, 34, 9, 13, 235, 102, 206, 86, 9, 13, 235, 102, + 208, 232, 9, 13, 235, 102, 207, 221, 9, 13, 235, 102, 204, 8, 9, 13, 235, + 102, 200, 49, 9, 13, 235, 102, 199, 220, 9, 13, 235, 102, 221, 245, 9, + 13, 235, 102, 199, 232, 9, 13, 235, 102, 237, 250, 9, 13, 235, 102, 192, + 106, 9, 13, 235, 102, 231, 79, 9, 13, 211, 174, 91, 4, 176, 4, 200, 102, + 9, 13, 211, 174, 176, 4, 237, 227, 217, 182, 120, 234, 186, 194, 52, 217, + 182, 120, 202, 171, 194, 52, 217, 182, 120, 194, 91, 194, 52, 217, 182, + 120, 178, 194, 52, 217, 182, 120, 207, 237, 235, 84, 217, 182, 120, 230, + 201, 235, 84, 217, 182, 120, 62, 235, 84, 217, 182, 120, 90, 80, 243, 0, + 217, 182, 120, 103, 80, 243, 0, 217, 182, 120, 112, 80, 243, 0, 217, 182, + 120, 232, 119, 80, 243, 0, 217, 182, 120, 232, 214, 80, 243, 0, 217, 182, + 120, 203, 41, 80, 243, 0, 217, 182, 120, 204, 146, 80, 243, 0, 217, 182, + 120, 234, 148, 80, 243, 0, 217, 182, 120, 214, 16, 80, 243, 0, 217, 182, + 120, 90, 80, 248, 208, 217, 182, 120, 103, 80, 248, 208, 217, 182, 120, + 112, 80, 248, 208, 217, 182, 120, 232, 119, 80, 248, 208, 217, 182, 120, + 232, 214, 80, 248, 208, 217, 182, 120, 203, 41, 80, 248, 208, 217, 182, + 120, 204, 146, 80, 248, 208, 217, 182, 120, 234, 148, 80, 248, 208, 217, + 182, 120, 214, 16, 80, 248, 208, 217, 182, 120, 90, 80, 242, 127, 217, + 182, 120, 103, 80, 242, 127, 217, 182, 120, 112, 80, 242, 127, 217, 182, + 120, 232, 119, 80, 242, 127, 217, 182, 120, 232, 214, 80, 242, 127, 217, + 182, 120, 203, 41, 80, 242, 127, 217, 182, 120, 204, 146, 80, 242, 127, + 217, 182, 120, 234, 148, 80, 242, 127, 217, 182, 120, 214, 16, 80, 242, + 127, 217, 182, 120, 209, 210, 217, 182, 120, 211, 160, 217, 182, 120, + 248, 209, 217, 182, 120, 242, 169, 217, 182, 120, 202, 112, 217, 182, + 120, 201, 125, 217, 182, 120, 249, 250, 217, 182, 120, 194, 43, 217, 182, + 120, 222, 226, 217, 182, 120, 248, 252, 191, 191, 120, 229, 5, 248, 252, + 191, 191, 120, 229, 3, 191, 191, 120, 229, 2, 191, 191, 120, 229, 1, 191, + 191, 120, 229, 0, 191, 191, 120, 228, 255, 191, 191, 120, 228, 254, 191, + 191, 120, 228, 253, 191, 191, 120, 228, 252, 191, 191, 120, 228, 251, + 191, 191, 120, 228, 250, 191, 191, 120, 228, 249, 191, 191, 120, 228, + 248, 191, 191, 120, 228, 247, 191, 191, 120, 228, 246, 191, 191, 120, + 228, 245, 191, 191, 120, 228, 244, 191, 191, 120, 228, 243, 191, 191, + 120, 228, 242, 191, 191, 120, 228, 241, 191, 191, 120, 228, 240, 191, + 191, 120, 228, 239, 191, 191, 120, 228, 238, 191, 191, 120, 228, 237, + 191, 191, 120, 228, 236, 191, 191, 120, 228, 235, 191, 191, 120, 228, + 234, 191, 191, 120, 228, 233, 191, 191, 120, 228, 232, 191, 191, 120, + 228, 231, 191, 191, 120, 228, 230, 191, 191, 120, 228, 229, 191, 191, + 120, 228, 228, 191, 191, 120, 228, 227, 191, 191, 120, 228, 226, 191, + 191, 120, 228, 225, 191, 191, 120, 228, 224, 191, 191, 120, 228, 223, + 191, 191, 120, 228, 222, 191, 191, 120, 228, 221, 191, 191, 120, 228, + 220, 191, 191, 120, 228, 219, 191, 191, 120, 228, 218, 191, 191, 120, + 228, 217, 191, 191, 120, 228, 216, 191, 191, 120, 228, 215, 191, 191, + 120, 228, 214, 191, 191, 120, 228, 213, 191, 191, 120, 228, 212, 191, + 191, 120, 228, 211, 191, 191, 120, 84, 248, 252, 191, 191, 120, 196, 104, + 191, 191, 120, 196, 103, 191, 191, 120, 196, 102, 191, 191, 120, 196, + 101, 191, 191, 120, 196, 100, 191, 191, 120, 196, 99, 191, 191, 120, 196, + 98, 191, 191, 120, 196, 97, 191, 191, 120, 196, 96, 191, 191, 120, 196, + 95, 191, 191, 120, 196, 94, 191, 191, 120, 196, 93, 191, 191, 120, 196, + 92, 191, 191, 120, 196, 91, 191, 191, 120, 196, 90, 191, 191, 120, 196, + 89, 191, 191, 120, 196, 88, 191, 191, 120, 196, 87, 191, 191, 120, 196, + 86, 191, 191, 120, 196, 85, 191, 191, 120, 196, 84, 191, 191, 120, 196, + 83, 191, 191, 120, 196, 82, 191, 191, 120, 196, 81, 191, 191, 120, 196, + 80, 191, 191, 120, 196, 79, 191, 191, 120, 196, 78, 191, 191, 120, 196, + 77, 191, 191, 120, 196, 76, 191, 191, 120, 196, 75, 191, 191, 120, 196, + 74, 191, 191, 120, 196, 73, 191, 191, 120, 196, 72, 191, 191, 120, 196, + 71, 191, 191, 120, 196, 70, 191, 191, 120, 196, 69, 191, 191, 120, 196, + 68, 191, 191, 120, 196, 67, 191, 191, 120, 196, 66, 191, 191, 120, 196, + 65, 191, 191, 120, 196, 64, 191, 191, 120, 196, 63, 191, 191, 120, 196, + 62, 191, 191, 120, 196, 61, 191, 191, 120, 196, 60, 191, 191, 120, 196, + 59, 191, 191, 120, 196, 58, 191, 191, 120, 196, 57, 191, 191, 120, 196, + 56, 209, 220, 246, 216, 248, 252, 209, 220, 246, 216, 251, 136, 80, 202, + 157, 209, 220, 246, 216, 103, 80, 202, 157, 209, 220, 246, 216, 112, 80, + 202, 157, 209, 220, 246, 216, 232, 119, 80, 202, 157, 209, 220, 246, 216, + 232, 214, 80, 202, 157, 209, 220, 246, 216, 203, 41, 80, 202, 157, 209, + 220, 246, 216, 204, 146, 80, 202, 157, 209, 220, 246, 216, 234, 148, 80, + 202, 157, 209, 220, 246, 216, 214, 16, 80, 202, 157, 209, 220, 246, 216, + 200, 31, 80, 202, 157, 209, 220, 246, 216, 223, 60, 80, 202, 157, 209, + 220, 246, 216, 221, 123, 80, 202, 157, 209, 220, 246, 216, 208, 161, 80, + 202, 157, 209, 220, 246, 216, 221, 177, 80, 202, 157, 209, 220, 246, 216, + 251, 136, 80, 229, 231, 209, 220, 246, 216, 103, 80, 229, 231, 209, 220, + 246, 216, 112, 80, 229, 231, 209, 220, 246, 216, 232, 119, 80, 229, 231, + 209, 220, 246, 216, 232, 214, 80, 229, 231, 209, 220, 246, 216, 203, 41, + 80, 229, 231, 209, 220, 246, 216, 204, 146, 80, 229, 231, 209, 220, 246, + 216, 234, 148, 80, 229, 231, 209, 220, 246, 216, 214, 16, 80, 229, 231, + 209, 220, 246, 216, 200, 31, 80, 229, 231, 209, 220, 246, 216, 223, 60, + 80, 229, 231, 209, 220, 246, 216, 221, 123, 80, 229, 231, 209, 220, 246, + 216, 208, 161, 80, 229, 231, 209, 220, 246, 216, 221, 177, 80, 229, 231, + 209, 220, 246, 216, 207, 237, 222, 226, 209, 220, 246, 216, 251, 136, 80, + 237, 3, 209, 220, 246, 216, 103, 80, 237, 3, 209, 220, 246, 216, 112, 80, + 237, 3, 209, 220, 246, 216, 232, 119, 80, 237, 3, 209, 220, 246, 216, + 232, 214, 80, 237, 3, 209, 220, 246, 216, 203, 41, 80, 237, 3, 209, 220, + 246, 216, 204, 146, 80, 237, 3, 209, 220, 246, 216, 234, 148, 80, 237, 3, + 209, 220, 246, 216, 214, 16, 80, 237, 3, 209, 220, 246, 216, 200, 31, 80, + 237, 3, 209, 220, 246, 216, 223, 60, 80, 237, 3, 209, 220, 246, 216, 221, + 123, 80, 237, 3, 209, 220, 246, 216, 208, 161, 80, 237, 3, 209, 220, 246, + 216, 221, 177, 80, 237, 3, 209, 220, 246, 216, 60, 222, 226, 209, 220, + 246, 216, 251, 136, 80, 242, 69, 209, 220, 246, 216, 103, 80, 242, 69, + 209, 220, 246, 216, 112, 80, 242, 69, 209, 220, 246, 216, 232, 119, 80, + 242, 69, 209, 220, 246, 216, 232, 214, 80, 242, 69, 209, 220, 246, 216, + 203, 41, 80, 242, 69, 209, 220, 246, 216, 204, 146, 80, 242, 69, 209, + 220, 246, 216, 234, 148, 80, 242, 69, 209, 220, 246, 216, 214, 16, 80, + 242, 69, 209, 220, 246, 216, 200, 31, 80, 242, 69, 209, 220, 246, 216, + 223, 60, 80, 242, 69, 209, 220, 246, 216, 221, 123, 80, 242, 69, 209, + 220, 246, 216, 208, 161, 80, 242, 69, 209, 220, 246, 216, 221, 177, 80, + 242, 69, 209, 220, 246, 216, 62, 222, 226, 209, 220, 246, 216, 232, 150, + 209, 220, 246, 216, 198, 146, 209, 220, 246, 216, 198, 135, 209, 220, + 246, 216, 198, 132, 209, 220, 246, 216, 198, 131, 209, 220, 246, 216, + 198, 130, 209, 220, 246, 216, 198, 129, 209, 220, 246, 216, 198, 128, + 209, 220, 246, 216, 198, 127, 209, 220, 246, 216, 198, 126, 209, 220, + 246, 216, 198, 145, 209, 220, 246, 216, 198, 144, 209, 220, 246, 216, + 198, 143, 209, 220, 246, 216, 198, 142, 209, 220, 246, 216, 198, 141, + 209, 220, 246, 216, 198, 140, 209, 220, 246, 216, 198, 139, 209, 220, + 246, 216, 198, 138, 209, 220, 246, 216, 198, 137, 209, 220, 246, 216, + 198, 136, 209, 220, 246, 216, 198, 134, 209, 220, 246, 216, 198, 133, 17, + 192, 77, 232, 71, 201, 238, 17, 192, 77, 242, 38, 17, 90, 242, 38, 17, + 103, 242, 38, 17, 112, 242, 38, 17, 232, 119, 242, 38, 17, 232, 214, 242, + 38, 17, 203, 41, 242, 38, 17, 204, 146, 242, 38, 17, 234, 148, 242, 38, + 17, 214, 16, 242, 38, 236, 213, 47, 49, 17, 192, 76, 236, 213, 214, 199, + 47, 49, 17, 192, 76, 47, 192, 77, 4, 203, 4, 47, 250, 182, 54, 47, 236, + 127, 3, 4, 211, 115, 248, 247, 125, 8, 6, 1, 64, 125, 8, 6, 1, 249, 226, + 125, 8, 6, 1, 247, 52, 125, 8, 6, 1, 238, 95, 125, 8, 6, 1, 71, 125, 8, + 6, 1, 233, 163, 125, 8, 6, 1, 232, 44, 125, 8, 6, 1, 230, 124, 125, 8, 6, + 1, 70, 125, 8, 6, 1, 223, 65, 125, 8, 6, 1, 222, 184, 125, 8, 6, 1, 165, + 125, 8, 6, 1, 218, 236, 125, 8, 6, 1, 215, 151, 125, 8, 6, 1, 74, 125, 8, + 6, 1, 211, 93, 125, 8, 6, 1, 208, 247, 125, 8, 6, 1, 150, 125, 8, 6, 1, + 206, 158, 125, 8, 6, 1, 200, 228, 125, 8, 6, 1, 68, 125, 8, 6, 1, 196, + 236, 125, 8, 6, 1, 194, 202, 125, 8, 6, 1, 193, 223, 125, 8, 6, 1, 193, + 148, 125, 8, 6, 1, 192, 155, 198, 237, 204, 2, 247, 164, 8, 6, 1, 206, + 158, 47, 43, 8, 6, 1, 247, 52, 47, 43, 8, 6, 1, 150, 47, 246, 159, 47, + 193, 225, 238, 228, 109, 108, 8, 6, 1, 64, 108, 8, 6, 1, 249, 226, 108, + 8, 6, 1, 247, 52, 108, 8, 6, 1, 238, 95, 108, 8, 6, 1, 71, 108, 8, 6, 1, + 233, 163, 108, 8, 6, 1, 232, 44, 108, 8, 6, 1, 230, 124, 108, 8, 6, 1, + 70, 108, 8, 6, 1, 223, 65, 108, 8, 6, 1, 222, 184, 108, 8, 6, 1, 165, + 108, 8, 6, 1, 218, 236, 108, 8, 6, 1, 215, 151, 108, 8, 6, 1, 74, 108, 8, + 6, 1, 211, 93, 108, 8, 6, 1, 208, 247, 108, 8, 6, 1, 150, 108, 8, 6, 1, + 206, 158, 108, 8, 6, 1, 200, 228, 108, 8, 6, 1, 68, 108, 8, 6, 1, 196, + 236, 108, 8, 6, 1, 194, 202, 108, 8, 6, 1, 193, 223, 108, 8, 6, 1, 193, + 148, 108, 8, 6, 1, 192, 155, 108, 228, 148, 108, 215, 175, 108, 205, 225, + 108, 202, 95, 108, 209, 132, 108, 194, 112, 214, 199, 47, 8, 6, 1, 64, + 214, 199, 47, 8, 6, 1, 249, 226, 214, 199, 47, 8, 6, 1, 247, 52, 214, + 199, 47, 8, 6, 1, 238, 95, 214, 199, 47, 8, 6, 1, 71, 214, 199, 47, 8, 6, + 1, 233, 163, 214, 199, 47, 8, 6, 1, 232, 44, 214, 199, 47, 8, 6, 1, 230, + 124, 214, 199, 47, 8, 6, 1, 70, 214, 199, 47, 8, 6, 1, 223, 65, 214, 199, + 47, 8, 6, 1, 222, 184, 214, 199, 47, 8, 6, 1, 165, 214, 199, 47, 8, 6, 1, + 218, 236, 214, 199, 47, 8, 6, 1, 215, 151, 214, 199, 47, 8, 6, 1, 74, + 214, 199, 47, 8, 6, 1, 211, 93, 214, 199, 47, 8, 6, 1, 208, 247, 214, + 199, 47, 8, 6, 1, 150, 214, 199, 47, 8, 6, 1, 206, 158, 214, 199, 47, 8, + 6, 1, 200, 228, 214, 199, 47, 8, 6, 1, 68, 214, 199, 47, 8, 6, 1, 196, + 236, 214, 199, 47, 8, 6, 1, 194, 202, 214, 199, 47, 8, 6, 1, 193, 223, + 214, 199, 47, 8, 6, 1, 193, 148, 214, 199, 47, 8, 6, 1, 192, 155, 208, + 39, 217, 54, 57, 208, 39, 217, 51, 57, 208, 39, 215, 246, 57, 47, 246, + 182, 47, 247, 53, 4, 211, 115, 248, 247, 47, 228, 167, 233, 0, 214, 199, + 108, 8, 6, 1, 64, 214, 199, 108, 8, 6, 1, 249, 226, 214, 199, 108, 8, 6, + 1, 247, 52, 214, 199, 108, 8, 6, 1, 238, 95, 214, 199, 108, 8, 6, 1, 71, + 214, 199, 108, 8, 6, 1, 233, 163, 214, 199, 108, 8, 6, 1, 232, 44, 214, + 199, 108, 8, 6, 1, 230, 124, 214, 199, 108, 8, 6, 1, 70, 214, 199, 108, + 8, 6, 1, 223, 65, 214, 199, 108, 8, 6, 1, 222, 184, 214, 199, 108, 8, 6, + 1, 165, 214, 199, 108, 8, 6, 1, 218, 236, 214, 199, 108, 8, 6, 1, 215, + 151, 214, 199, 108, 8, 6, 1, 74, 214, 199, 108, 8, 6, 1, 211, 93, 214, + 199, 108, 8, 6, 1, 208, 247, 214, 199, 108, 8, 6, 1, 150, 214, 199, 108, + 8, 6, 1, 206, 158, 214, 199, 108, 8, 6, 1, 200, 228, 214, 199, 108, 8, 6, + 1, 68, 214, 199, 108, 8, 6, 1, 196, 236, 214, 199, 108, 8, 6, 1, 194, + 202, 214, 199, 108, 8, 6, 1, 193, 223, 214, 199, 108, 8, 6, 1, 193, 148, + 214, 199, 108, 8, 6, 1, 192, 155, 238, 180, 214, 199, 108, 8, 6, 1, 211, + 93, 214, 199, 108, 228, 51, 214, 199, 108, 166, 214, 199, 108, 188, 214, + 199, 108, 251, 238, 214, 199, 108, 194, 112, 50, 236, 166, 108, 242, 111, + 108, 238, 235, 108, 232, 99, 108, 228, 42, 108, 214, 176, 108, 214, 167, + 108, 211, 231, 108, 202, 178, 108, 130, 4, 233, 204, 77, 108, 195, 226, + 108, 112, 238, 95, 108, 205, 212, 205, 231, 108, 103, 222, 184, 108, 232, + 119, 222, 184, 108, 234, 148, 222, 184, 108, 232, 214, 209, 192, 101, + 108, 204, 146, 209, 192, 101, 108, 197, 228, 209, 192, 104, 108, 203, 26, + 211, 93, 108, 90, 228, 163, 197, 240, 211, 93, 108, 8, 2, 1, 238, 95, + 108, 230, 2, 108, 230, 1, 108, 229, 170, 108, 219, 61, 108, 203, 144, + 108, 197, 96, 108, 195, 249, 217, 107, 194, 9, 109, 207, 229, 223, 173, + 16, 1, 64, 207, 229, 223, 173, 16, 1, 249, 226, 207, 229, 223, 173, 16, + 1, 247, 52, 207, 229, 223, 173, 16, 1, 238, 95, 207, 229, 223, 173, 16, + 1, 71, 207, 229, 223, 173, 16, 1, 233, 163, 207, 229, 223, 173, 16, 1, + 232, 44, 207, 229, 223, 173, 16, 1, 230, 124, 207, 229, 223, 173, 16, 1, + 70, 207, 229, 223, 173, 16, 1, 223, 65, 207, 229, 223, 173, 16, 1, 222, + 184, 207, 229, 223, 173, 16, 1, 165, 207, 229, 223, 173, 16, 1, 218, 236, + 207, 229, 223, 173, 16, 1, 215, 151, 207, 229, 223, 173, 16, 1, 74, 207, + 229, 223, 173, 16, 1, 211, 93, 207, 229, 223, 173, 16, 1, 208, 247, 207, + 229, 223, 173, 16, 1, 150, 207, 229, 223, 173, 16, 1, 206, 158, 207, 229, + 223, 173, 16, 1, 200, 228, 207, 229, 223, 173, 16, 1, 68, 207, 229, 223, + 173, 16, 1, 196, 236, 207, 229, 223, 173, 16, 1, 194, 202, 207, 229, 223, + 173, 16, 1, 193, 223, 207, 229, 223, 173, 16, 1, 193, 148, 207, 229, 223, + 173, 16, 1, 192, 155, 50, 229, 140, 229, 29, 108, 75, 221, 96, 108, 75, + 188, 108, 12, 197, 59, 225, 242, 108, 12, 197, 59, 225, 246, 108, 12, + 197, 59, 225, 254, 108, 75, 237, 116, 108, 12, 197, 59, 226, 5, 108, 12, + 197, 59, 225, 248, 108, 12, 197, 59, 225, 220, 108, 12, 197, 59, 225, + 247, 108, 12, 197, 59, 226, 4, 108, 12, 197, 59, 225, 234, 108, 12, 197, + 59, 225, 227, 108, 12, 197, 59, 225, 236, 108, 12, 197, 59, 226, 1, 108, + 12, 197, 59, 225, 243, 108, 12, 197, 59, 226, 3, 108, 12, 197, 59, 225, + 235, 108, 12, 197, 59, 226, 2, 108, 12, 197, 59, 225, 221, 108, 12, 197, + 59, 225, 226, 108, 12, 197, 59, 225, 219, 108, 12, 197, 59, 225, 249, + 108, 12, 197, 59, 225, 251, 108, 12, 197, 59, 225, 229, 108, 12, 197, 59, + 225, 240, 108, 12, 197, 59, 225, 238, 108, 12, 197, 59, 226, 8, 108, 12, + 197, 59, 226, 7, 108, 12, 197, 59, 225, 217, 108, 12, 197, 59, 225, 244, + 108, 12, 197, 59, 226, 6, 108, 12, 197, 59, 225, 253, 108, 12, 197, 59, + 225, 239, 108, 12, 197, 59, 225, 218, 108, 12, 197, 59, 225, 241, 108, + 12, 197, 59, 225, 223, 108, 12, 197, 59, 225, 222, 108, 12, 197, 59, 225, + 252, 108, 12, 197, 59, 225, 230, 108, 12, 197, 59, 225, 232, 108, 12, + 197, 59, 225, 233, 108, 12, 197, 59, 225, 225, 108, 12, 197, 59, 226, 0, + 108, 12, 197, 59, 225, 250, 108, 12, 197, 59, 225, 216, 198, 237, 204, 2, + 247, 164, 12, 197, 59, 225, 231, 198, 237, 204, 2, 247, 164, 12, 197, 59, + 226, 7, 198, 237, 204, 2, 247, 164, 12, 197, 59, 226, 5, 198, 237, 204, + 2, 247, 164, 12, 197, 59, 225, 245, 198, 237, 204, 2, 247, 164, 12, 197, + 59, 225, 228, 198, 237, 204, 2, 247, 164, 12, 197, 59, 225, 241, 198, + 237, 204, 2, 247, 164, 12, 197, 59, 225, 224, 198, 237, 204, 2, 247, 164, + 12, 197, 59, 225, 255, 198, 237, 204, 2, 247, 164, 12, 197, 59, 225, 237, + 47, 228, 39, 251, 110, 47, 228, 39, 251, 141, 207, 7, 16, 39, 232, 77, + 207, 7, 16, 39, 219, 36, 207, 7, 16, 39, 203, 178, 207, 7, 16, 39, 193, + 196, 207, 7, 16, 39, 203, 161, 207, 7, 16, 39, 247, 7, 238, 106, 232, + 162, 242, 84, 197, 81, 214, 32, 4, 202, 16, 201, 118, 136, 216, 8, 201, + 117, 242, 115, 250, 27, 235, 35, 201, 116, 136, 247, 111, 208, 40, 247, + 143, 250, 27, 214, 31, 194, 130, 194, 124, 195, 242, 216, 128, 194, 114, + 234, 190, 231, 7, 233, 220, 234, 190, 231, 7, 250, 232, 234, 190, 231, 7, + 250, 46, 231, 7, 4, 216, 252, 214, 177, 216, 30, 109, 194, 116, 238, 194, + 216, 30, 109, 232, 226, 208, 168, 216, 30, 109, 194, 116, 231, 42, 216, + 30, 109, 232, 71, 216, 30, 109, 194, 144, 231, 42, 216, 30, 109, 220, 66, + 208, 168, 216, 30, 109, 194, 144, 238, 194, 216, 30, 109, 238, 194, 216, + 29, 214, 177, 216, 30, 4, 233, 91, 232, 226, 208, 168, 216, 30, 4, 233, + 91, 220, 66, 208, 168, 216, 30, 4, 233, 91, 232, 71, 216, 30, 4, 233, 91, + 201, 124, 4, 233, 91, 231, 3, 202, 19, 203, 200, 202, 19, 199, 212, 60, + 235, 70, 62, 201, 123, 62, 201, 124, 4, 2, 242, 75, 62, 201, 124, 248, + 93, 242, 75, 62, 201, 124, 248, 93, 242, 76, 4, 208, 41, 242, 76, 4, 208, + 41, 242, 76, 4, 202, 218, 242, 76, 4, 219, 192, 242, 76, 4, 198, 241, + 232, 163, 194, 53, 247, 225, 233, 91, 228, 202, 236, 134, 200, 158, 247, + 87, 242, 223, 205, 203, 233, 214, 198, 195, 237, 109, 198, 195, 211, 41, + 198, 195, 247, 12, 228, 202, 210, 135, 198, 29, 242, 227, 247, 228, 207, + 20, 229, 169, 201, 121, 247, 228, 234, 194, 80, 217, 171, 234, 194, 80, + 207, 139, 229, 203, 232, 119, 220, 38, 242, 74, 217, 139, 220, 37, 233, + 72, 220, 37, 220, 38, 232, 170, 223, 191, 194, 52, 215, 186, 199, 22, + 250, 7, 230, 218, 217, 14, 194, 128, 200, 119, 220, 5, 248, 204, 210, 0, + 207, 237, 250, 144, 230, 201, 250, 144, 210, 174, 210, 178, 242, 228, + 201, 221, 230, 71, 202, 252, 80, 209, 236, 217, 41, 211, 212, 247, 207, + 209, 144, 220, 16, 207, 140, 238, 200, 207, 140, 248, 217, 238, 238, 207, + 139, 238, 134, 26, 207, 139, 202, 2, 247, 177, 202, 156, 247, 156, 232, + 97, 232, 93, 207, 45, 201, 71, 209, 147, 237, 205, 212, 2, 201, 90, 232, + 94, 203, 170, 232, 225, 247, 6, 4, 201, 63, 237, 52, 202, 198, 228, 50, + 238, 198, 204, 20, 228, 49, 228, 50, 238, 198, 235, 99, 238, 237, 242, + 186, 161, 246, 233, 219, 88, 238, 125, 229, 18, 209, 149, 203, 184, 248, + 73, 247, 173, 209, 150, 80, 232, 151, 238, 236, 232, 140, 26, 221, 124, + 200, 67, 194, 39, 230, 40, 206, 70, 247, 190, 26, 238, 148, 194, 49, 231, + 11, 242, 58, 231, 11, 198, 150, 235, 77, 248, 104, 215, 226, 242, 91, + 248, 104, 215, 225, 248, 255, 247, 189, 232, 140, 26, 221, 125, 4, 209, + 221, 247, 190, 4, 209, 165, 238, 225, 209, 167, 207, 141, 193, 255, 209, + 106, 248, 10, 247, 5, 223, 59, 242, 176, 198, 195, 233, 55, 242, 175, + 232, 228, 232, 229, 202, 154, 248, 215, 210, 219, 209, 166, 239, 18, 248, + 217, 200, 123, 198, 195, 238, 180, 232, 200, 210, 1, 237, 106, 223, 50, + 236, 126, 246, 205, 201, 220, 194, 53, 242, 202, 216, 30, 196, 25, 246, + 124, 205, 244, 206, 18, 230, 224, 246, 226, 229, 234, 4, 199, 74, 211, + 212, 199, 225, 220, 28, 247, 183, 80, 232, 174, 216, 130, 217, 37, 207, + 208, 207, 141, 35, 222, 0, 4, 223, 58, 201, 191, 216, 164, 219, 228, 202, + 250, 238, 243, 221, 118, 248, 119, 250, 57, 35, 213, 100, 248, 119, 237, + 58, 35, 213, 100, 232, 244, 232, 103, 251, 114, 199, 115, 246, 206, 228, + 204, 233, 21, 194, 79, 207, 33, 242, 61, 232, 220, 209, 183, 26, 232, + 224, 216, 164, 215, 250, 246, 247, 242, 134, 229, 241, 250, 66, 211, 45, + 198, 249, 230, 18, 242, 120, 200, 22, 199, 116, 242, 106, 247, 216, 210, + 128, 250, 64, 196, 35, 231, 207, 236, 206, 229, 137, 202, 243, 217, 216, + 248, 23, 231, 208, 236, 252, 247, 176, 232, 176, 209, 220, 246, 214, 35, + 213, 105, 215, 216, 35, 213, 100, 206, 2, 230, 169, 35, 221, 255, 198, + 125, 196, 13, 35, 205, 236, 206, 192, 203, 215, 4, 206, 21, 200, 27, 208, + 60, 26, 248, 217, 203, 15, 26, 203, 15, 247, 200, 248, 174, 26, 229, 11, + 242, 229, 232, 206, 202, 217, 206, 193, 201, 95, 202, 118, 217, 37, 198, + 151, 228, 205, 208, 61, 250, 233, 232, 148, 206, 206, 232, 148, 201, 66, + 194, 96, 219, 197, 230, 244, 208, 62, 216, 16, 208, 62, 246, 217, 238, + 191, 248, 171, 26, 248, 217, 195, 241, 233, 10, 229, 32, 201, 250, 26, + 248, 217, 228, 50, 229, 32, 201, 250, 26, 209, 43, 200, 165, 200, 27, + 211, 64, 26, 248, 217, 202, 219, 246, 222, 216, 9, 246, 245, 248, 122, 4, + 197, 81, 247, 113, 239, 1, 228, 194, 247, 111, 242, 114, 237, 62, 228, + 194, 247, 112, 242, 104, 247, 112, 237, 54, 237, 55, 223, 89, 215, 44, + 210, 226, 202, 30, 228, 194, 247, 112, 228, 194, 4, 231, 191, 211, 249, + 247, 112, 223, 50, 209, 155, 211, 248, 233, 219, 209, 155, 211, 248, 228, + 203, 248, 198, 249, 252, 200, 37, 217, 216, 228, 199, 219, 53, 228, 199, + 238, 241, 201, 234, 205, 243, 237, 65, 201, 234, 233, 80, 223, 70, 220, + 78, 223, 50, 246, 195, 233, 219, 246, 195, 62, 210, 148, 60, 210, 148, + 194, 122, 62, 232, 206, 194, 122, 60, 232, 206, 207, 19, 60, 207, 19, + 220, 176, 248, 238, 208, 60, 26, 203, 147, 247, 181, 26, 54, 250, 228, + 234, 94, 73, 232, 215, 197, 204, 234, 94, 73, 232, 215, 197, 201, 234, + 94, 73, 232, 215, 197, 199, 234, 94, 73, 232, 215, 197, 197, 234, 94, 73, + 232, 215, 197, 195, 208, 22, 216, 6, 211, 103, 194, 130, 247, 117, 238, + 205, 199, 108, 219, 245, 208, 64, 246, 193, 235, 84, 238, 189, 194, 82, + 202, 226, 202, 224, 228, 204, 208, 34, 230, 250, 204, 6, 216, 49, 207, + 23, 242, 213, 236, 134, 210, 14, 247, 218, 234, 115, 212, 5, 202, 133, + 204, 1, 247, 116, 250, 186, 229, 17, 220, 167, 248, 102, 232, 224, 198, + 150, 232, 224, 247, 226, 198, 6, 230, 16, 242, 214, 248, 255, 242, 214, + 232, 87, 248, 255, 242, 214, 248, 13, 210, 150, 221, 107, 209, 171, 235, + 74, 246, 249, 248, 243, 246, 249, 236, 125, 216, 7, 233, 91, 238, 206, + 233, 91, 199, 109, 233, 91, 208, 65, 233, 91, 246, 194, 233, 91, 235, 85, + 233, 91, 202, 116, 194, 82, 228, 205, 233, 91, 216, 50, 233, 91, 236, + 135, 233, 91, 210, 15, 233, 91, 232, 91, 233, 91, 230, 68, 233, 91, 194, + 26, 233, 91, 248, 117, 233, 91, 211, 21, 233, 91, 210, 15, 213, 112, 210, + 194, 209, 92, 242, 197, 233, 173, 233, 181, 234, 193, 213, 112, 216, 4, + 199, 0, 62, 130, 209, 188, 248, 250, 223, 176, 62, 142, 209, 188, 248, + 250, 223, 176, 62, 46, 209, 188, 248, 250, 223, 176, 62, 51, 209, 188, + 248, 250, 223, 176, 232, 218, 230, 63, 57, 194, 122, 230, 63, 57, 211, + 232, 230, 63, 57, 199, 146, 130, 57, 199, 146, 142, 57, 242, 105, 230, + 38, 57, 211, 184, 230, 38, 57, 238, 174, 194, 22, 230, 18, 233, 176, 214, + 204, 200, 226, 223, 40, 235, 79, 221, 180, 248, 26, 194, 22, 242, 77, + 209, 23, 230, 42, 209, 145, 217, 148, 203, 207, 250, 22, 203, 207, 229, + 154, 203, 207, 194, 22, 206, 37, 194, 22, 247, 199, 232, 146, 247, 79, + 223, 191, 203, 91, 247, 78, 223, 191, 203, 91, 247, 171, 231, 23, 217, + 160, 194, 23, 233, 69, 217, 161, 26, 194, 24, 229, 26, 230, 37, 103, 217, + 6, 229, 26, 230, 37, 103, 194, 21, 229, 26, 230, 37, 209, 180, 211, 247, + 194, 24, 4, 247, 97, 234, 191, 247, 144, 4, 196, 114, 210, 117, 4, 247, + 230, 230, 86, 217, 161, 4, 230, 183, 210, 52, 217, 143, 217, 161, 4, 198, + 14, 211, 224, 217, 160, 211, 224, 194, 23, 248, 254, 239, 2, 194, 7, 209, + 97, 223, 50, 211, 242, 223, 50, 230, 249, 231, 54, 248, 255, 250, 212, + 233, 186, 251, 16, 251, 17, 216, 39, 223, 196, 203, 10, 223, 165, 237, + 51, 210, 116, 230, 177, 237, 210, 219, 158, 215, 69, 209, 179, 233, 92, + 217, 104, 230, 85, 248, 192, 209, 182, 200, 247, 210, 7, 221, 161, 77, + 219, 53, 219, 235, 207, 81, 231, 148, 201, 240, 221, 160, 247, 182, 238, + 209, 4, 229, 233, 194, 103, 248, 113, 229, 233, 247, 136, 229, 233, 103, + 229, 231, 202, 152, 229, 233, 230, 193, 229, 233, 229, 234, 4, 54, 247, + 224, 229, 233, 230, 201, 229, 233, 193, 62, 229, 233, 209, 24, 229, 233, + 229, 234, 4, 207, 141, 207, 162, 229, 231, 229, 234, 237, 106, 237, 5, + 204, 34, 4, 41, 78, 223, 145, 234, 119, 152, 247, 109, 250, 211, 109, + 247, 208, 202, 255, 109, 242, 49, 109, 202, 127, 201, 73, 109, 235, 70, + 237, 186, 109, 210, 8, 80, 209, 172, 232, 188, 248, 38, 236, 167, 109, + 202, 144, 248, 215, 199, 166, 248, 215, 62, 232, 175, 228, 163, 209, 186, + 109, 216, 54, 248, 236, 238, 137, 233, 206, 87, 236, 127, 57, 238, 196, + 246, 215, 248, 197, 4, 193, 60, 57, 248, 197, 4, 236, 127, 57, 248, 197, + 4, 233, 222, 57, 248, 197, 4, 209, 143, 57, 216, 54, 4, 194, 47, 242, + 253, 4, 197, 30, 198, 191, 26, 193, 60, 57, 205, 215, 210, 115, 239, 23, + 247, 142, 216, 118, 232, 180, 236, 192, 211, 167, 236, 198, 235, 30, 232, + 251, 232, 160, 211, 184, 232, 251, 232, 160, 211, 62, 4, 238, 142, 211, + 62, 233, 84, 197, 41, 246, 255, 200, 64, 246, 255, 246, 216, 223, 176, + 242, 253, 4, 197, 30, 198, 190, 242, 253, 4, 235, 92, 198, 190, 248, 194, + 242, 252, 242, 90, 209, 19, 207, 9, 209, 19, 210, 250, 201, 230, 206, + 200, 198, 182, 206, 200, 247, 204, 200, 163, 220, 33, 213, 103, 213, 104, + 4, 237, 105, 238, 208, 242, 84, 247, 205, 211, 184, 247, 205, 230, 201, + 247, 205, 247, 224, 247, 205, 211, 162, 247, 205, 247, 202, 215, 63, 248, + 240, 205, 228, 217, 7, 200, 42, 207, 251, 211, 60, 233, 52, 217, 216, + 206, 17, 250, 183, 209, 44, 251, 122, 219, 55, 242, 237, 217, 19, 211, + 124, 198, 199, 223, 187, 198, 199, 211, 69, 234, 246, 109, 223, 184, 234, + 52, 234, 53, 4, 235, 92, 61, 58, 242, 84, 217, 177, 4, 219, 46, 232, 206, + 242, 84, 217, 177, 4, 208, 39, 232, 206, 211, 184, 217, 177, 4, 208, 39, + 232, 206, 211, 184, 217, 177, 4, 219, 46, 232, 206, 209, 152, 209, 153, + 228, 208, 214, 172, 216, 83, 210, 60, 216, 83, 210, 61, 4, 94, 61, 250, + 27, 220, 28, 196, 38, 216, 82, 216, 83, 210, 61, 211, 250, 213, 143, 216, + 83, 210, 59, 250, 184, 4, 248, 182, 246, 247, 246, 248, 4, 232, 197, 196, + 35, 246, 247, 200, 39, 208, 55, 196, 34, 232, 244, 209, 78, 209, 162, + 201, 252, 209, 120, 248, 121, 197, 224, 94, 250, 73, 242, 86, 94, 26, + 114, 211, 184, 242, 131, 250, 73, 242, 86, 94, 26, 114, 211, 184, 242, + 131, 250, 74, 4, 47, 90, 211, 110, 242, 86, 235, 92, 26, 197, 30, 211, + 184, 242, 131, 250, 73, 250, 182, 235, 92, 26, 197, 30, 211, 184, 242, + 131, 250, 73, 132, 247, 140, 109, 139, 247, 140, 109, 202, 149, 4, 246, + 240, 111, 202, 148, 202, 149, 4, 90, 202, 174, 194, 124, 202, 149, 4, + 112, 202, 174, 194, 123, 248, 164, 234, 119, 209, 212, 220, 23, 217, 189, + 231, 11, 207, 96, 217, 189, 231, 11, 219, 99, 4, 223, 157, 210, 154, 242, + 84, 219, 99, 4, 222, 1, 222, 1, 219, 98, 211, 184, 219, 98, 248, 86, 248, + 87, 4, 246, 240, 111, 247, 203, 219, 166, 109, 208, 56, 247, 72, 248, + 253, 4, 114, 61, 58, 234, 80, 4, 114, 61, 58, 211, 212, 4, 233, 204, 122, + 4, 46, 51, 61, 58, 202, 182, 4, 94, 61, 58, 198, 249, 4, 197, 30, 61, 58, + 213, 143, 90, 197, 69, 234, 146, 109, 221, 254, 200, 30, 223, 151, 16, + 39, 8, 6, 219, 234, 223, 151, 16, 39, 8, 2, 219, 234, 223, 151, 16, 39, + 212, 235, 223, 151, 16, 39, 201, 5, 223, 151, 16, 39, 8, 219, 234, 232, + 231, 234, 119, 198, 244, 193, 253, 230, 69, 212, 218, 26, 247, 210, 229, + 33, 209, 242, 216, 163, 200, 40, 238, 164, 248, 217, 203, 41, 209, 190, + 202, 20, 4, 85, 236, 114, 223, 50, 16, 39, 248, 99, 198, 180, 234, 96, + 60, 50, 247, 72, 62, 50, 247, 72, 220, 73, 207, 237, 242, 130, 220, 73, + 247, 224, 242, 130, 220, 73, 211, 162, 237, 4, 220, 73, 247, 224, 237, 4, + 2, 211, 162, 237, 4, 2, 247, 224, 237, 4, 197, 40, 207, 237, 198, 185, + 235, 95, 207, 237, 198, 185, 197, 40, 2, 207, 237, 198, 185, 235, 95, 2, + 207, 237, 198, 185, 106, 51, 204, 50, 62, 242, 130, 113, 51, 204, 50, 62, + 242, 130, 47, 238, 184, 209, 176, 238, 184, 209, 177, 4, 230, 75, 63, + 238, 184, 209, 176, 213, 107, 46, 204, 183, 4, 112, 236, 111, 213, 107, + 51, 204, 183, 4, 112, 236, 111, 16, 39, 217, 121, 246, 102, 62, 8, 238, + 183, 87, 8, 238, 183, 246, 142, 238, 183, 211, 220, 109, 235, 98, 80, + 210, 179, 222, 157, 216, 22, 200, 255, 217, 2, 4, 214, 16, 247, 159, 247, + 178, 80, 228, 113, 242, 88, 233, 92, 90, 212, 11, 242, 88, 233, 92, 103, + 212, 11, 242, 88, 233, 92, 112, 212, 11, 242, 88, 233, 92, 232, 119, 212, + 11, 242, 88, 233, 92, 232, 214, 212, 11, 242, 88, 233, 92, 203, 41, 212, + 11, 242, 88, 233, 92, 204, 146, 212, 11, 242, 88, 233, 92, 234, 148, 212, + 11, 242, 88, 233, 92, 214, 16, 212, 11, 242, 88, 233, 92, 200, 31, 212, + 11, 242, 88, 233, 92, 234, 112, 212, 11, 242, 88, 233, 92, 197, 245, 212, + 11, 242, 88, 233, 92, 211, 204, 242, 88, 233, 92, 197, 218, 242, 88, 233, + 92, 199, 152, 242, 88, 233, 92, 232, 115, 242, 88, 233, 92, 232, 212, + 242, 88, 233, 92, 203, 37, 242, 88, 233, 92, 204, 145, 242, 88, 233, 92, + 234, 147, 242, 88, 233, 92, 214, 15, 242, 88, 233, 92, 200, 29, 242, 88, + 233, 92, 234, 110, 242, 88, 233, 92, 197, 243, 51, 202, 148, 51, 202, + 149, 4, 90, 202, 174, 194, 124, 51, 202, 149, 4, 112, 202, 174, 194, 123, + 247, 104, 247, 105, 4, 202, 174, 194, 123, 207, 79, 248, 86, 247, 205, + 246, 238, 217, 145, 242, 87, 60, 203, 11, 26, 238, 181, 213, 143, 209, + 248, 229, 25, 217, 161, 223, 191, 247, 81, 201, 137, 219, 227, 202, 253, + 211, 164, 202, 107, 237, 191, 201, 119, 202, 136, 202, 137, 194, 104, + 222, 215, 217, 161, 237, 209, 46, 230, 63, 200, 42, 207, 251, 200, 42, + 207, 252, 4, 211, 61, 51, 230, 63, 200, 42, 207, 251, 62, 198, 230, 200, + 41, 60, 198, 230, 200, 41, 200, 42, 211, 212, 198, 249, 80, 216, 79, 242, + 109, 216, 83, 210, 60, 248, 253, 80, 234, 52, 202, 26, 234, 52, 234, 53, + 4, 219, 192, 232, 167, 234, 52, 210, 155, 136, 202, 26, 234, 52, 219, + 165, 210, 249, 60, 209, 19, 106, 46, 210, 153, 106, 46, 248, 211, 210, + 154, 106, 46, 232, 121, 210, 154, 106, 46, 211, 54, 106, 46, 238, 199, + 46, 193, 247, 230, 62, 163, 211, 232, 230, 63, 57, 208, 39, 230, 63, 4, + 232, 236, 202, 126, 207, 168, 208, 39, 230, 63, 4, 232, 236, 202, 126, + 207, 168, 199, 146, 130, 57, 207, 168, 199, 146, 142, 57, 207, 168, 196, + 37, 230, 62, 207, 168, 230, 63, 4, 85, 232, 241, 233, 192, 208, 39, 230, + 63, 4, 210, 224, 248, 61, 85, 26, 207, 82, 232, 235, 62, 142, 209, 188, + 46, 230, 63, 223, 176, 203, 109, 62, 46, 209, 188, 223, 176, 203, 109, + 62, 51, 209, 188, 223, 176, 203, 109, 60, 46, 209, 188, 223, 176, 203, + 109, 60, 51, 209, 188, 223, 176, 60, 46, 209, 188, 248, 250, 223, 176, + 60, 51, 209, 188, 248, 250, 223, 176, 203, 109, 62, 130, 209, 188, 223, + 176, 203, 109, 62, 142, 209, 188, 223, 176, 203, 109, 60, 130, 209, 188, + 223, 176, 203, 109, 60, 142, 209, 188, 223, 176, 60, 130, 209, 188, 248, + 250, 223, 176, 60, 142, 209, 188, 248, 250, 223, 176, 60, 229, 233, 237, + 50, 239, 23, 222, 0, 26, 216, 6, 112, 214, 181, 239, 22, 209, 93, 209, + 196, 247, 1, 60, 230, 26, 204, 2, 232, 180, 236, 192, 62, 230, 26, 204, + 2, 232, 180, 236, 192, 202, 198, 204, 2, 232, 180, 236, 192, 200, 115, + 246, 199, 194, 42, 221, 255, 90, 247, 73, 216, 6, 103, 247, 73, 216, 6, + 112, 247, 73, 216, 6, 198, 221, 40, 210, 115, 239, 23, 230, 26, 236, 192, + 205, 231, 209, 94, 228, 43, 233, 52, 228, 43, 211, 167, 236, 199, 228, + 43, 236, 140, 4, 199, 244, 236, 140, 4, 199, 245, 26, 210, 44, 236, 140, + 4, 210, 44, 232, 105, 4, 210, 44, 232, 105, 4, 199, 88, 232, 105, 4, 250, + 225, 193, 223, 60, 232, 160, 232, 160, 211, 184, 232, 160, 246, 216, 140, + 236, 176, 246, 216, 232, 251, 247, 173, 232, 251, 247, 14, 234, 90, 213, + 105, 234, 90, 213, 106, 211, 61, 234, 90, 213, 106, 211, 67, 213, 105, + 213, 106, 211, 61, 213, 106, 211, 67, 234, 90, 236, 139, 234, 90, 211, + 61, 234, 90, 211, 59, 236, 139, 211, 61, 211, 59, 194, 134, 202, 133, + 213, 106, 211, 67, 202, 133, 247, 0, 211, 67, 237, 50, 194, 51, 216, 115, + 217, 93, 211, 113, 242, 86, 51, 26, 46, 204, 183, 250, 73, 246, 240, 193, + 223, 223, 182, 232, 153, 203, 21, 109, 237, 104, 232, 153, 203, 21, 109, + 239, 24, 40, 222, 1, 207, 34, 214, 172, 211, 62, 4, 47, 199, 244, 201, + 242, 242, 252, 237, 239, 221, 124, 219, 159, 202, 147, 229, 246, 223, + 191, 203, 91, 112, 208, 13, 58, 112, 208, 13, 63, 112, 208, 13, 220, 28, + 112, 208, 13, 207, 101, 46, 202, 144, 247, 122, 51, 202, 144, 247, 122, + 103, 202, 144, 247, 121, 112, 202, 144, 247, 121, 46, 199, 166, 247, 122, + 51, 199, 166, 247, 122, 46, 250, 211, 247, 122, 51, 250, 211, 247, 122, + 216, 34, 247, 122, 219, 193, 216, 34, 247, 122, 219, 193, 216, 33, 248, + 213, 105, 4, 248, 212, 248, 213, 27, 193, 223, 248, 213, 105, 4, 27, 193, + 223, 248, 213, 28, 27, 193, 223, 248, 213, 105, 4, 28, 27, 193, 223, 152, + 242, 244, 77, 248, 213, 105, 4, 28, 242, 243, 194, 6, 217, 141, 216, 11, + 232, 72, 199, 24, 198, 226, 202, 9, 80, 219, 207, 203, 92, 80, 223, 51, + 215, 248, 230, 197, 233, 91, 230, 197, 233, 92, 4, 202, 230, 233, 173, + 233, 92, 4, 200, 60, 80, 222, 217, 202, 230, 233, 92, 4, 211, 184, 216, + 4, 202, 230, 233, 92, 4, 211, 184, 216, 5, 26, 202, 230, 233, 173, 202, + 230, 233, 92, 4, 211, 184, 216, 5, 26, 242, 51, 201, 72, 202, 230, 233, + 92, 4, 211, 184, 216, 5, 26, 199, 106, 233, 173, 202, 230, 233, 92, 4, + 230, 74, 202, 230, 233, 92, 4, 228, 207, 194, 44, 233, 91, 202, 230, 233, + 92, 4, 202, 230, 233, 173, 233, 92, 206, 7, 237, 84, 232, 151, 207, 211, + 233, 91, 202, 230, 233, 92, 4, 229, 232, 233, 173, 202, 230, 233, 92, 4, + 201, 119, 202, 229, 233, 91, 214, 179, 233, 91, 233, 194, 233, 91, 197, + 75, 233, 91, 233, 92, 4, 242, 51, 201, 72, 210, 146, 233, 91, 239, 15, + 233, 91, 239, 16, 233, 91, 221, 159, 233, 91, 233, 92, 199, 149, 41, 221, + 160, 221, 159, 233, 92, 4, 202, 230, 233, 173, 221, 159, 233, 92, 4, 242, + 84, 233, 173, 233, 92, 4, 201, 192, 199, 0, 233, 92, 4, 201, 192, 199, 1, + 26, 194, 44, 233, 181, 233, 92, 4, 201, 192, 199, 1, 26, 199, 106, 233, + 173, 236, 200, 233, 91, 194, 4, 233, 91, 250, 203, 233, 91, 209, 142, + 233, 91, 238, 166, 233, 91, 210, 119, 233, 91, 233, 92, 4, 219, 72, 80, + 198, 162, 236, 200, 247, 77, 207, 211, 233, 91, 232, 83, 233, 92, 4, 211, + 184, 216, 4, 250, 201, 233, 91, 233, 45, 233, 91, 194, 105, 233, 91, 202, + 254, 233, 91, 199, 68, 233, 91, 230, 198, 233, 91, 219, 56, 238, 166, + 233, 91, 233, 92, 4, 211, 184, 216, 4, 228, 152, 233, 91, 233, 92, 4, + 211, 184, 216, 5, 26, 242, 51, 201, 72, 233, 92, 205, 233, 223, 191, 233, + 46, 250, 34, 233, 91, 232, 172, 233, 91, 202, 255, 233, 91, 236, 167, + 233, 91, 233, 92, 194, 39, 216, 4, 233, 92, 4, 217, 34, 217, 106, 230, + 197, 246, 194, 233, 92, 4, 202, 230, 233, 173, 246, 194, 233, 92, 4, 200, + 60, 80, 222, 217, 202, 230, 246, 194, 233, 92, 4, 211, 184, 216, 4, 202, + 230, 246, 194, 233, 92, 4, 229, 232, 233, 173, 246, 194, 233, 92, 4, 193, + 245, 202, 231, 221, 159, 246, 194, 233, 92, 4, 242, 84, 233, 173, 209, + 142, 246, 194, 233, 91, 238, 166, 246, 194, 233, 91, 194, 105, 246, 194, + 233, 91, 202, 248, 232, 83, 233, 91, 202, 248, 202, 230, 233, 91, 197, + 36, 233, 91, 233, 92, 4, 207, 32, 233, 173, 233, 92, 4, 213, 143, 230, + 241, 231, 125, 233, 92, 4, 211, 232, 231, 125, 210, 117, 247, 179, 237, + 99, 205, 204, 216, 49, 229, 236, 216, 49, 202, 150, 216, 49, 230, 29, + 210, 117, 208, 37, 90, 230, 62, 210, 117, 208, 37, 247, 191, 230, 38, + 223, 191, 246, 144, 210, 117, 232, 82, 210, 117, 4, 209, 142, 233, 91, + 210, 117, 4, 232, 161, 230, 37, 178, 194, 91, 209, 188, 220, 37, 202, + 171, 194, 91, 209, 188, 220, 37, 178, 234, 186, 209, 188, 220, 37, 202, + 171, 234, 186, 209, 188, 220, 37, 163, 178, 194, 91, 209, 188, 220, 37, + 163, 202, 171, 194, 91, 209, 188, 220, 37, 163, 178, 234, 186, 209, 188, + 220, 37, 163, 202, 171, 234, 186, 209, 188, 220, 37, 178, 194, 91, 209, + 188, 196, 19, 220, 37, 202, 171, 194, 91, 209, 188, 196, 19, 220, 37, + 178, 234, 186, 209, 188, 196, 19, 220, 37, 202, 171, 234, 186, 209, 188, + 196, 19, 220, 37, 87, 178, 194, 91, 209, 188, 196, 19, 220, 37, 87, 202, + 171, 194, 91, 209, 188, 196, 19, 220, 37, 87, 178, 234, 186, 209, 188, + 196, 19, 220, 37, 87, 202, 171, 234, 186, 209, 188, 196, 19, 220, 37, + 178, 194, 91, 209, 188, 247, 118, 202, 171, 194, 91, 209, 188, 247, 118, + 178, 234, 186, 209, 188, 247, 118, 202, 171, 234, 186, 209, 188, 247, + 118, 87, 178, 194, 91, 209, 188, 247, 118, 87, 202, 171, 194, 91, 209, + 188, 247, 118, 87, 178, 234, 186, 209, 188, 247, 118, 87, 202, 171, 234, + 186, 209, 188, 247, 118, 229, 24, 208, 152, 50, 211, 150, 229, 24, 208, + 152, 50, 211, 151, 223, 191, 60, 202, 106, 202, 191, 208, 152, 50, 211, + 150, 202, 191, 208, 152, 50, 211, 151, 223, 191, 60, 202, 106, 114, 207, + 39, 197, 30, 207, 39, 94, 207, 39, 235, 92, 207, 39, 27, 34, 233, 243, + 211, 150, 87, 27, 34, 233, 243, 211, 150, 34, 211, 184, 233, 243, 211, + 150, 87, 34, 211, 184, 233, 243, 211, 150, 87, 250, 230, 211, 150, 201, + 75, 250, 230, 211, 150, 49, 87, 55, 163, 242, 39, 208, 142, 122, 211, + 150, 49, 87, 55, 242, 39, 208, 142, 122, 211, 150, 49, 87, 132, 55, 242, + 39, 208, 142, 122, 211, 150, 87, 223, 131, 211, 150, 49, 223, 131, 211, + 150, 87, 49, 223, 131, 211, 150, 196, 53, 87, 202, 189, 196, 53, 87, 207, + 169, 202, 189, 242, 242, 247, 216, 207, 169, 242, 242, 247, 216, 207, 39, + 229, 215, 202, 4, 219, 96, 208, 44, 246, 217, 229, 151, 198, 213, 229, + 151, 198, 214, 4, 247, 107, 213, 112, 198, 213, 216, 233, 152, 208, 45, + 202, 10, 198, 211, 198, 212, 246, 217, 247, 82, 211, 208, 247, 82, 198, + 158, 247, 83, 201, 238, 216, 119, 250, 234, 232, 232, 234, 72, 209, 180, + 246, 217, 211, 208, 209, 180, 246, 217, 200, 89, 211, 208, 200, 89, 249, + 251, 211, 208, 249, 251, 207, 244, 196, 115, 237, 80, 198, 149, 250, 67, + 219, 63, 198, 220, 216, 42, 216, 10, 208, 43, 201, 89, 208, 43, 216, 10, + 247, 13, 251, 94, 198, 210, 203, 220, 207, 6, 202, 142, 229, 5, 198, 217, + 219, 195, 84, 198, 217, 219, 195, 239, 2, 57, 209, 180, 246, 201, 207, + 162, 219, 195, 198, 182, 232, 207, 211, 212, 209, 154, 236, 118, 213, + 143, 234, 58, 57, 202, 228, 109, 213, 143, 202, 228, 109, 209, 18, 219, + 148, 223, 191, 223, 79, 209, 232, 109, 236, 147, 213, 111, 219, 148, 109, + 209, 148, 194, 130, 109, 213, 127, 194, 130, 109, 248, 37, 213, 143, 248, + 36, 248, 35, 216, 10, 248, 35, 210, 170, 213, 143, 210, 169, 242, 205, + 238, 175, 217, 1, 109, 194, 20, 109, 207, 178, 248, 255, 109, 199, 25, + 194, 130, 242, 81, 203, 175, 248, 167, 248, 165, 210, 208, 238, 242, 238, + 123, 248, 232, 242, 110, 46, 219, 26, 198, 186, 4, 207, 7, 238, 222, 209, + 81, 57, 47, 223, 165, 202, 172, 247, 170, 109, 231, 22, 109, 238, 214, + 26, 220, 84, 202, 255, 251, 140, 203, 198, 248, 231, 248, 85, 248, 86, + 248, 109, 209, 232, 80, 194, 3, 212, 8, 57, 203, 198, 198, 159, 201, 188, + 211, 58, 229, 147, 200, 33, 228, 151, 234, 114, 230, 70, 26, 193, 253, + 203, 233, 211, 237, 235, 67, 216, 14, 208, 44, 198, 222, 216, 17, 247, + 215, 197, 40, 216, 130, 251, 50, 197, 40, 251, 50, 197, 40, 2, 251, 50, + 2, 251, 50, 213, 116, 251, 50, 251, 51, 237, 64, 251, 51, 250, 80, 206, + 16, 211, 208, 232, 232, 234, 72, 236, 250, 219, 96, 210, 212, 203, 220, + 205, 237, 216, 17, 205, 237, 246, 228, 203, 1, 232, 167, 206, 11, 203, + 17, 249, 253, 207, 137, 210, 45, 198, 149, 207, 33, 203, 18, 156, 16, 39, + 208, 148, 156, 16, 39, 251, 52, 156, 16, 39, 232, 231, 156, 16, 39, 234, + 189, 156, 16, 39, 194, 129, 156, 16, 39, 250, 133, 156, 16, 39, 250, 134, + 207, 231, 156, 16, 39, 250, 134, 207, 230, 156, 16, 39, 250, 134, 196, 2, + 156, 16, 39, 250, 134, 196, 1, 156, 16, 39, 196, 16, 156, 16, 39, 196, + 15, 156, 16, 39, 196, 14, 156, 16, 39, 201, 130, 156, 16, 39, 210, 69, + 201, 130, 156, 16, 39, 60, 201, 130, 156, 16, 39, 217, 0, 201, 161, 156, + 16, 39, 217, 0, 201, 160, 156, 16, 39, 217, 0, 201, 159, 156, 16, 39, + 242, 133, 156, 16, 39, 206, 55, 156, 16, 39, 214, 3, 156, 16, 39, 196, 0, + 156, 16, 39, 195, 255, 156, 16, 39, 207, 41, 206, 55, 156, 16, 39, 207, + 41, 206, 54, 156, 16, 39, 230, 245, 156, 16, 39, 203, 88, 156, 16, 39, + 223, 102, 211, 157, 156, 16, 39, 223, 102, 211, 156, 156, 16, 39, 238, + 188, 80, 223, 101, 156, 16, 39, 207, 227, 80, 223, 101, 156, 16, 39, 238, + 233, 211, 157, 156, 16, 39, 223, 100, 211, 157, 156, 16, 39, 201, 162, + 80, 238, 232, 156, 16, 39, 238, 188, 80, 238, 232, 156, 16, 39, 238, 188, + 80, 238, 231, 156, 16, 39, 238, 233, 250, 176, 156, 16, 39, 206, 56, 80, + 238, 233, 250, 176, 156, 16, 39, 201, 162, 80, 206, 56, 80, 238, 232, + 156, 16, 39, 196, 109, 156, 16, 39, 199, 81, 211, 157, 156, 16, 39, 220, + 41, 211, 157, 156, 16, 39, 250, 175, 211, 157, 156, 16, 39, 201, 162, 80, + 250, 174, 156, 16, 39, 206, 56, 80, 250, 174, 156, 16, 39, 201, 162, 80, + 206, 56, 80, 250, 174, 156, 16, 39, 196, 17, 80, 250, 174, 156, 16, 39, + 207, 227, 80, 250, 174, 156, 16, 39, 207, 227, 80, 250, 173, 156, 16, 39, + 207, 226, 156, 16, 39, 207, 225, 156, 16, 39, 207, 224, 156, 16, 39, 207, + 223, 156, 16, 39, 251, 11, 156, 16, 39, 251, 10, 156, 16, 39, 217, 132, + 156, 16, 39, 206, 62, 156, 16, 39, 250, 72, 156, 16, 39, 207, 255, 156, + 16, 39, 207, 254, 156, 16, 39, 249, 255, 156, 16, 39, 248, 3, 211, 157, + 156, 16, 39, 200, 110, 156, 16, 39, 200, 109, 156, 16, 39, 208, 154, 219, + 184, 156, 16, 39, 247, 196, 156, 16, 39, 247, 195, 156, 16, 39, 247, 194, + 156, 16, 39, 250, 243, 156, 16, 39, 211, 236, 156, 16, 39, 202, 129, 156, + 16, 39, 199, 79, 156, 16, 39, 230, 165, 156, 16, 39, 194, 117, 156, 16, + 39, 209, 141, 156, 16, 39, 246, 252, 156, 16, 39, 198, 1, 156, 16, 39, + 246, 219, 216, 23, 156, 16, 39, 205, 247, 80, 222, 219, 156, 16, 39, 247, + 10, 156, 16, 39, 198, 179, 156, 16, 39, 202, 17, 198, 179, 156, 16, 39, + 219, 95, 156, 16, 39, 202, 203, 156, 16, 39, 197, 19, 156, 16, 39, 228, + 205, 235, 45, 156, 16, 39, 250, 48, 156, 16, 39, 209, 150, 250, 48, 156, + 16, 39, 247, 145, 156, 16, 39, 209, 140, 247, 145, 156, 16, 39, 250, 240, + 156, 16, 39, 201, 225, 201, 111, 201, 224, 156, 16, 39, 201, 225, 201, + 111, 201, 223, 156, 16, 39, 201, 158, 156, 16, 39, 209, 113, 156, 16, 39, + 236, 187, 156, 16, 39, 236, 189, 156, 16, 39, 236, 188, 156, 16, 39, 209, + 27, 156, 16, 39, 209, 16, 156, 16, 39, 238, 173, 156, 16, 39, 238, 172, + 156, 16, 39, 238, 171, 156, 16, 39, 238, 170, 156, 16, 39, 238, 169, 156, + 16, 39, 251, 25, 156, 16, 39, 248, 168, 80, 217, 113, 156, 16, 39, 248, + 168, 80, 196, 143, 156, 16, 39, 207, 176, 156, 16, 39, 228, 197, 156, 16, + 39, 214, 31, 156, 16, 39, 237, 173, 156, 16, 39, 216, 37, 156, 16, 39, + 138, 235, 82, 156, 16, 39, 138, 211, 128, 60, 220, 23, 223, 85, 51, 198, + 185, 60, 197, 40, 223, 85, 51, 198, 185, 60, 207, 96, 223, 85, 51, 198, + 185, 60, 235, 95, 223, 85, 51, 198, 185, 60, 202, 248, 2, 242, 130, 217, + 31, 28, 62, 242, 130, 28, 62, 242, 130, 87, 62, 242, 130, 196, 53, 87, + 62, 242, 130, 233, 185, 87, 62, 242, 130, 62, 242, 131, 238, 254, 60, 2, + 242, 130, 207, 9, 200, 111, 60, 199, 76, 202, 106, 60, 202, 248, 2, 202, + 106, 152, 62, 202, 106, 217, 31, 62, 202, 106, 28, 62, 202, 106, 87, 62, + 202, 106, 196, 53, 87, 62, 202, 106, 233, 185, 87, 62, 202, 106, 62, 50, + 238, 254, 60, 196, 53, 2, 202, 106, 62, 50, 238, 254, 60, 217, 31, 202, + 106, 50, 200, 111, 60, 199, 76, 237, 4, 60, 196, 53, 2, 237, 4, 60, 217, + 31, 2, 237, 4, 62, 237, 5, 238, 254, 60, 196, 53, 2, 237, 4, 62, 237, 5, + 238, 254, 60, 217, 31, 237, 4, 237, 5, 200, 111, 60, 199, 76, 219, 43, + 60, 196, 53, 2, 219, 43, 60, 217, 31, 2, 219, 43, 62, 219, 44, 238, 254, + 60, 2, 219, 43, 199, 195, 33, 238, 183, 152, 33, 238, 183, 217, 31, 33, + 238, 183, 28, 33, 238, 183, 196, 53, 28, 33, 238, 183, 196, 53, 87, 33, + 238, 183, 233, 185, 87, 33, 238, 183, 199, 195, 206, 51, 152, 206, 51, + 217, 31, 206, 51, 28, 206, 51, 87, 206, 51, 196, 53, 87, 206, 51, 233, + 185, 87, 206, 51, 152, 232, 214, 202, 122, 250, 37, 217, 31, 232, 214, + 202, 122, 250, 37, 28, 232, 214, 202, 122, 250, 37, 87, 232, 214, 202, + 122, 250, 37, 196, 53, 87, 232, 214, 202, 122, 250, 37, 233, 185, 87, + 232, 214, 202, 122, 250, 37, 152, 203, 41, 202, 122, 250, 37, 217, 31, + 203, 41, 202, 122, 250, 37, 28, 203, 41, 202, 122, 250, 37, 87, 203, 41, + 202, 122, 250, 37, 196, 53, 87, 203, 41, 202, 122, 250, 37, 233, 185, 87, + 203, 41, 202, 122, 250, 37, 152, 234, 148, 202, 122, 250, 37, 217, 31, + 234, 148, 202, 122, 250, 37, 28, 234, 148, 202, 122, 250, 37, 87, 234, + 148, 202, 122, 250, 37, 196, 53, 87, 234, 148, 202, 122, 250, 37, 152, + 112, 209, 190, 60, 202, 19, 217, 31, 112, 209, 190, 60, 202, 19, 112, + 209, 190, 60, 202, 19, 217, 31, 112, 209, 190, 209, 254, 202, 19, 152, + 232, 119, 209, 190, 60, 202, 19, 217, 31, 232, 119, 209, 190, 60, 202, + 19, 232, 119, 209, 190, 60, 202, 19, 217, 31, 232, 119, 209, 190, 209, + 254, 202, 19, 207, 169, 152, 232, 119, 209, 190, 209, 254, 202, 19, 152, + 232, 214, 209, 190, 60, 202, 19, 87, 232, 214, 209, 190, 60, 202, 19, + 217, 31, 203, 41, 209, 190, 60, 202, 19, 87, 203, 41, 209, 190, 60, 202, + 19, 203, 41, 209, 190, 209, 254, 202, 19, 217, 31, 234, 148, 209, 190, + 60, 202, 19, 87, 234, 148, 209, 190, 60, 202, 19, 196, 53, 87, 234, 148, + 209, 190, 60, 202, 19, 87, 234, 148, 209, 190, 209, 254, 202, 19, 152, + 197, 245, 209, 190, 60, 202, 19, 87, 197, 245, 209, 190, 60, 202, 19, 87, + 197, 245, 209, 190, 209, 254, 202, 19, 47, 198, 185, 214, 199, 47, 198, + 185, 47, 202, 106, 214, 199, 47, 202, 106, 220, 73, 211, 162, 242, 130, + 220, 73, 193, 62, 242, 130, 220, 73, 230, 201, 242, 130, 220, 73, 209, + 24, 242, 130, 220, 73, 247, 133, 242, 130, 220, 73, 207, 237, 202, 106, + 220, 73, 247, 224, 202, 106, 220, 73, 211, 162, 202, 106, 220, 73, 193, + 62, 202, 106, 220, 73, 230, 201, 202, 106, 220, 73, 209, 24, 202, 106, + 220, 73, 247, 133, 202, 106, 114, 61, 4, 2, 198, 186, 250, 77, 197, 30, + 61, 4, 2, 198, 186, 250, 77, 94, 61, 4, 2, 198, 186, 250, 77, 235, 92, + 61, 4, 2, 198, 186, 250, 77, 114, 61, 4, 217, 31, 198, 186, 250, 77, 197, + 30, 61, 4, 217, 31, 198, 186, 250, 77, 94, 61, 4, 217, 31, 198, 186, 250, + 77, 235, 92, 61, 4, 217, 31, 198, 186, 250, 77, 114, 61, 4, 220, 73, 198, + 186, 250, 77, 197, 30, 61, 4, 220, 73, 198, 186, 250, 77, 94, 61, 4, 220, + 73, 198, 186, 250, 77, 235, 92, 61, 4, 220, 73, 198, 186, 250, 77, 114, + 61, 4, 2, 234, 24, 250, 77, 197, 30, 61, 4, 2, 234, 24, 250, 77, 94, 61, + 4, 2, 234, 24, 250, 77, 235, 92, 61, 4, 2, 234, 24, 250, 77, 114, 61, 4, + 234, 24, 250, 77, 197, 30, 61, 4, 234, 24, 250, 77, 94, 61, 4, 234, 24, + 250, 77, 235, 92, 61, 4, 234, 24, 250, 77, 87, 114, 61, 4, 234, 24, 250, + 77, 87, 197, 30, 61, 4, 234, 24, 250, 77, 87, 94, 61, 4, 234, 24, 250, + 77, 87, 235, 92, 61, 4, 234, 24, 250, 77, 87, 114, 61, 4, 220, 73, 234, + 24, 250, 77, 87, 197, 30, 61, 4, 220, 73, 234, 24, 250, 77, 87, 94, 61, + 4, 220, 73, 234, 24, 250, 77, 87, 235, 92, 61, 4, 220, 73, 234, 24, 250, + 77, 114, 198, 184, 61, 4, 215, 50, 204, 48, 197, 30, 198, 184, 61, 4, + 215, 50, 204, 48, 94, 198, 184, 61, 4, 215, 50, 204, 48, 235, 92, 198, + 184, 61, 4, 215, 50, 204, 48, 114, 198, 184, 61, 4, 217, 31, 204, 48, + 197, 30, 198, 184, 61, 4, 217, 31, 204, 48, 94, 198, 184, 61, 4, 217, 31, + 204, 48, 235, 92, 198, 184, 61, 4, 217, 31, 204, 48, 114, 198, 184, 61, + 4, 28, 204, 48, 197, 30, 198, 184, 61, 4, 28, 204, 48, 94, 198, 184, 61, + 4, 28, 204, 48, 235, 92, 198, 184, 61, 4, 28, 204, 48, 114, 198, 184, 61, + 4, 87, 204, 48, 197, 30, 198, 184, 61, 4, 87, 204, 48, 94, 198, 184, 61, + 4, 87, 204, 48, 235, 92, 198, 184, 61, 4, 87, 204, 48, 114, 198, 184, 61, + 4, 196, 53, 87, 204, 48, 197, 30, 198, 184, 61, 4, 196, 53, 87, 204, 48, + 94, 198, 184, 61, 4, 196, 53, 87, 204, 48, 235, 92, 198, 184, 61, 4, 196, + 53, 87, 204, 48, 114, 232, 239, 54, 197, 30, 232, 239, 54, 94, 232, 239, + 54, 235, 92, 232, 239, 54, 114, 108, 54, 197, 30, 108, 54, 94, 108, 54, + 235, 92, 108, 54, 114, 239, 25, 54, 197, 30, 239, 25, 54, 94, 239, 25, + 54, 235, 92, 239, 25, 54, 114, 87, 239, 25, 54, 197, 30, 87, 239, 25, 54, + 94, 87, 239, 25, 54, 235, 92, 87, 239, 25, 54, 114, 87, 54, 197, 30, 87, + 54, 94, 87, 54, 235, 92, 87, 54, 114, 49, 54, 197, 30, 49, 54, 94, 49, + 54, 235, 92, 49, 54, 178, 194, 91, 49, 54, 178, 234, 186, 49, 54, 202, + 171, 234, 186, 49, 54, 202, 171, 194, 91, 49, 54, 46, 51, 49, 54, 130, + 142, 49, 54, 194, 63, 114, 152, 173, 54, 194, 63, 197, 30, 152, 173, 54, + 194, 63, 94, 152, 173, 54, 194, 63, 235, 92, 152, 173, 54, 194, 63, 178, + 194, 91, 152, 173, 54, 194, 63, 178, 234, 186, 152, 173, 54, 194, 63, + 202, 171, 234, 186, 152, 173, 54, 194, 63, 202, 171, 194, 91, 152, 173, + 54, 194, 63, 114, 173, 54, 194, 63, 197, 30, 173, 54, 194, 63, 94, 173, + 54, 194, 63, 235, 92, 173, 54, 194, 63, 178, 194, 91, 173, 54, 194, 63, + 178, 234, 186, 173, 54, 194, 63, 202, 171, 234, 186, 173, 54, 194, 63, + 202, 171, 194, 91, 173, 54, 194, 63, 114, 217, 31, 173, 54, 194, 63, 197, + 30, 217, 31, 173, 54, 194, 63, 94, 217, 31, 173, 54, 194, 63, 235, 92, + 217, 31, 173, 54, 194, 63, 178, 194, 91, 217, 31, 173, 54, 194, 63, 178, + 234, 186, 217, 31, 173, 54, 194, 63, 202, 171, 234, 186, 217, 31, 173, + 54, 194, 63, 202, 171, 194, 91, 217, 31, 173, 54, 194, 63, 114, 87, 173, + 54, 194, 63, 197, 30, 87, 173, 54, 194, 63, 94, 87, 173, 54, 194, 63, + 235, 92, 87, 173, 54, 194, 63, 178, 194, 91, 87, 173, 54, 194, 63, 178, + 234, 186, 87, 173, 54, 194, 63, 202, 171, 234, 186, 87, 173, 54, 194, 63, + 202, 171, 194, 91, 87, 173, 54, 194, 63, 114, 196, 53, 87, 173, 54, 194, + 63, 197, 30, 196, 53, 87, 173, 54, 194, 63, 94, 196, 53, 87, 173, 54, + 194, 63, 235, 92, 196, 53, 87, 173, 54, 194, 63, 178, 194, 91, 196, 53, + 87, 173, 54, 194, 63, 178, 234, 186, 196, 53, 87, 173, 54, 194, 63, 202, + 171, 234, 186, 196, 53, 87, 173, 54, 194, 63, 202, 171, 194, 91, 196, 53, + 87, 173, 54, 114, 198, 186, 250, 77, 197, 30, 198, 186, 250, 77, 94, 198, + 186, 250, 77, 235, 92, 198, 186, 250, 77, 114, 62, 61, 194, 41, 198, 186, + 250, 77, 197, 30, 62, 61, 194, 41, 198, 186, 250, 77, 94, 62, 61, 194, + 41, 198, 186, 250, 77, 235, 92, 62, 61, 194, 41, 198, 186, 250, 77, 114, + 61, 4, 213, 107, 200, 147, 197, 30, 61, 4, 213, 107, 200, 147, 94, 61, 4, + 213, 107, 200, 147, 235, 92, 61, 4, 213, 107, 200, 147, 87, 61, 204, 49, + 194, 61, 101, 87, 61, 204, 49, 194, 61, 103, 199, 188, 87, 61, 204, 49, + 194, 61, 90, 230, 78, 87, 61, 204, 49, 194, 61, 90, 199, 191, 114, 247, + 185, 62, 54, 94, 247, 188, 204, 51, 62, 54, 114, 198, 249, 204, 51, 62, + 54, 94, 198, 249, 204, 51, 62, 54, 114, 220, 22, 62, 54, 94, 207, 95, 62, + 54, 114, 207, 95, 62, 54, 94, 220, 22, 62, 54, 114, 248, 251, 204, 50, + 62, 54, 94, 248, 251, 204, 50, 62, 54, 114, 232, 86, 204, 50, 62, 54, 94, + 232, 86, 204, 50, 62, 54, 62, 61, 204, 49, 194, 61, 101, 62, 61, 204, 49, + 194, 61, 103, 199, 188, 61, 209, 188, 197, 30, 199, 216, 178, 194, 90, + 61, 209, 188, 94, 199, 216, 238, 128, 202, 171, 194, 90, 47, 238, 184, + 232, 133, 4, 232, 119, 236, 111, 47, 238, 184, 232, 133, 4, 103, 236, + 111, 47, 238, 184, 232, 132, 46, 138, 242, 131, 4, 232, 119, 236, 111, + 46, 138, 242, 131, 4, 112, 236, 111, 46, 138, 242, 131, 4, 103, 236, 111, + 46, 138, 242, 131, 4, 236, 114, 46, 138, 242, 130, 235, 93, 233, 84, 128, + 235, 93, 233, 84, 213, 107, 128, 235, 93, 233, 84, 229, 15, 4, 236, 114, + 235, 93, 233, 84, 213, 107, 229, 15, 4, 236, 114, 210, 3, 232, 235, 62, + 229, 233, 247, 133, 229, 233, 210, 2, 230, 62, 192, 17, 233, 91, 216, 53, + 233, 91, 233, 92, 4, 199, 212, 214, 187, 233, 91, 199, 193, 233, 91, 233, + 92, 4, 229, 244, 207, 43, 233, 91, 228, 172, 233, 91, 3, 80, 199, 225, + 228, 207, 246, 254, 217, 49, 230, 62, 208, 39, 248, 253, 80, 230, 62, + 220, 27, 232, 219, 207, 100, 232, 219, 230, 36, 230, 63, 4, 140, 26, 85, + 232, 236, 238, 179, 228, 97, 219, 53, 192, 228, 230, 63, 57, 233, 92, 4, + 238, 204, 230, 18, 242, 73, 233, 91, 215, 39, 233, 91, 207, 32, 211, 212, + 199, 225, 232, 183, 220, 59, 235, 73, 233, 91, 218, 246, 233, 91, 233, + 92, 211, 40, 202, 222, 233, 91, 233, 92, 4, 90, 233, 180, 208, 38, 230, + 197, 233, 92, 4, 202, 20, 233, 173, 230, 197, 233, 92, 4, 90, 220, 73, + 26, 90, 2, 233, 181, 233, 92, 4, 232, 241, 238, 207, 242, 84, 219, 159, + 204, 157, 233, 92, 4, 201, 6, 238, 207, 216, 4, 202, 230, 233, 92, 4, + 202, 230, 233, 174, 26, 230, 63, 238, 207, 216, 4, 233, 92, 4, 211, 184, + 216, 5, 195, 237, 203, 209, 233, 92, 4, 233, 196, 229, 245, 209, 110, + 194, 23, 247, 153, 211, 39, 130, 199, 26, 204, 186, 209, 98, 217, 161, + 223, 191, 197, 253, 216, 19, 242, 175, 203, 168, 210, 117, 236, 131, 246, + 198, 222, 209, 233, 26, 216, 78, 210, 141, 193, 252, 194, 130, 209, 178, + 230, 41, 236, 173, 217, 106, 194, 55, 232, 175, 235, 68, 4, 235, 66, 242, + 91, 231, 10, 198, 25, 231, 11, 202, 119, 230, 252, 214, 182, 207, 102, + 232, 226, 209, 232, 217, 37, 205, 212, 209, 232, 217, 37, 199, 192, 209, + 232, 217, 37, 247, 172, 231, 5, 217, 117, 250, 65, 197, 58, 238, 139, + 201, 240, 220, 169, 201, 250, 26, 248, 217, 202, 197, 232, 167, 236, 198, + 238, 187, 249, 242, 238, 155, 248, 244, 209, 147, 246, 202, 248, 230, + 247, 156, 230, 201, 206, 60, 204, 41, 211, 26, 80, 232, 151, 201, 189, + 232, 194, 234, 162, 231, 12, 80, 216, 129, 210, 175, 221, 154, 211, 22, + 235, 50, 232, 128, 238, 237, 200, 139, 247, 173, 242, 182, 247, 178, 4, + 202, 119, 238, 149, 4, 201, 222, 242, 57, 247, 137, 210, 43, 209, 102, + 238, 122, 80, 217, 40, 206, 35, 246, 230, 232, 151, 220, 36, 230, 200, + 217, 152, 216, 30, 247, 5, 248, 233, 202, 230, 233, 92, 4, 202, 230, 233, + 174, 26, 112, 229, 231, 193, 76, 233, 91, 202, 230, 233, 92, 4, 200, 65, + 233, 92, 4, 210, 219, 228, 209, 26, 210, 219, 230, 18, 233, 92, 4, 197, + 62, 233, 174, 26, 194, 121, 216, 4, 211, 116, 233, 91, 232, 98, 233, 91, + 214, 10, 236, 196, 233, 91, 233, 92, 4, 209, 218, 233, 173, 206, 23, 220, + 178, 242, 60, 230, 248, 229, 149, 247, 200, 232, 196, 203, 207, 238, 201, + 219, 163, 233, 91, 205, 235, 198, 13, 197, 60, 233, 91, 234, 196, 235, + 58, 248, 170, 204, 27, 211, 105, 232, 111, 233, 91, 247, 74, 237, 98, + 230, 234, 219, 142, 207, 155, 203, 170, 202, 100, 231, 24, 233, 91, 192, + 83, 233, 91, 229, 226, 206, 8, 200, 227, 238, 190, 222, 116, 219, 134, + 210, 177, 229, 141, 210, 225, 208, 63, 219, 105, 216, 21, 216, 165, 248, + 239, 201, 77, 217, 162, 236, 137, 202, 242, 211, 133, 211, 161, 203, 9, + 232, 198, 211, 95, 248, 111, 248, 2, 205, 216, 230, 170, 236, 134, 209, + 87, 246, 232, 234, 94, 242, 28, 207, 237, 230, 86, 234, 94, 242, 28, 238, + 138, 230, 86, 234, 94, 242, 28, 248, 219, 234, 94, 242, 28, 62, 230, 86, + 247, 207, 220, 16, 232, 149, 198, 251, 201, 109, 201, 104, 206, 82, 196, + 51, 234, 194, 4, 229, 235, 251, 62, 216, 15, 194, 77, 217, 144, 194, 77, + 217, 39, 250, 92, 217, 39, 220, 16, 242, 236, 194, 102, 238, 147, 206, + 56, 204, 45, 248, 59, 247, 173, 231, 190, 211, 200, 233, 73, 194, 158, + 247, 75, 217, 100, 235, 77, 228, 50, 238, 157, 247, 123, 200, 68, 202, + 22, 210, 116, 221, 126, 210, 116, 237, 114, 210, 116, 233, 92, 4, 216, + 48, 251, 112, 242, 206, 211, 224, 251, 112, 248, 115, 210, 116, 210, 117, + 4, 229, 240, 210, 117, 223, 191, 202, 1, 207, 24, 210, 117, 242, 93, 210, + 117, 223, 191, 219, 58, 209, 159, 217, 192, 233, 75, 196, 146, 216, 249, + 234, 109, 231, 141, 192, 6, 247, 163, 211, 162, 229, 233, 248, 24, 246, + 226, 205, 248, 231, 4, 242, 60, 202, 200, 207, 237, 231, 36, 234, 52, + 232, 230, 223, 14, 209, 12, 210, 42, 200, 10, 198, 35, 210, 101, 236, + 194, 236, 148, 55, 229, 214, 242, 33, 251, 154, 232, 232, 233, 190, 198, + 253, 247, 145, 217, 190, 219, 26, 219, 59, 247, 189, 202, 120, 80, 199, + 162, 248, 218, 80, 193, 89, 206, 82, 210, 6, 200, 59, 248, 116, 247, 134, + 248, 175, 207, 35, 80, 210, 251, 248, 194, 80, 202, 203, 202, 121, 207, + 253, 215, 33, 250, 226, 214, 179, 242, 225, 221, 176, 214, 179, 242, 225, + 208, 160, 214, 179, 242, 225, 207, 25, 214, 179, 242, 225, 248, 5, 214, + 179, 242, 225, 221, 122, 214, 179, 242, 225, 210, 192, 62, 242, 225, 221, + 123, 207, 16, 232, 125, 237, 94, 60, 242, 225, 221, 123, 207, 16, 232, + 125, 237, 94, 214, 179, 242, 225, 221, 123, 207, 16, 232, 125, 237, 94, + 62, 242, 225, 221, 177, 207, 16, 214, 12, 237, 94, 62, 242, 225, 208, + 161, 207, 16, 214, 12, 237, 94, 62, 242, 225, 207, 26, 207, 16, 214, 12, + 237, 94, 62, 242, 225, 248, 6, 207, 16, 214, 12, 237, 94, 62, 242, 225, + 221, 123, 207, 16, 214, 12, 237, 94, 62, 242, 225, 210, 193, 207, 16, + 214, 12, 237, 94, 60, 242, 225, 221, 177, 207, 16, 214, 12, 237, 94, 60, + 242, 225, 208, 161, 207, 16, 214, 12, 237, 94, 60, 242, 225, 207, 26, + 207, 16, 214, 12, 237, 94, 60, 242, 225, 248, 6, 207, 16, 214, 12, 237, + 94, 60, 242, 225, 221, 123, 207, 16, 214, 12, 237, 94, 60, 242, 225, 210, + 193, 207, 16, 214, 12, 237, 94, 214, 179, 242, 225, 221, 177, 207, 16, + 214, 12, 237, 94, 214, 179, 242, 225, 208, 161, 207, 16, 214, 12, 237, + 94, 214, 179, 242, 225, 207, 26, 207, 16, 214, 12, 237, 94, 214, 179, + 242, 225, 248, 6, 207, 16, 214, 12, 237, 94, 214, 179, 242, 225, 221, + 123, 207, 16, 214, 12, 237, 94, 214, 179, 242, 225, 210, 193, 207, 16, + 214, 12, 237, 94, 62, 242, 225, 221, 123, 207, 16, 90, 228, 163, 199, + 183, 237, 94, 60, 242, 225, 221, 123, 207, 16, 90, 228, 163, 199, 183, + 237, 94, 214, 179, 242, 225, 221, 123, 207, 16, 90, 228, 163, 199, 183, + 237, 94, 62, 242, 225, 163, 221, 176, 62, 242, 225, 163, 208, 160, 62, + 242, 225, 163, 207, 25, 62, 242, 225, 163, 248, 5, 62, 242, 225, 163, + 221, 122, 62, 242, 225, 163, 210, 192, 60, 242, 225, 163, 221, 176, 60, + 242, 225, 163, 208, 160, 60, 242, 225, 163, 207, 25, 60, 242, 225, 163, + 248, 5, 60, 242, 225, 163, 221, 122, 60, 242, 225, 163, 210, 192, 214, + 179, 242, 225, 163, 221, 176, 214, 179, 242, 225, 163, 208, 160, 214, + 179, 242, 225, 163, 207, 25, 214, 179, 242, 225, 163, 248, 5, 214, 179, + 242, 225, 163, 221, 122, 214, 179, 242, 225, 163, 210, 192, 62, 242, 225, + 221, 123, 207, 16, 103, 228, 163, 197, 236, 237, 94, 60, 242, 225, 221, + 123, 207, 16, 103, 228, 163, 197, 236, 237, 94, 214, 179, 242, 225, 221, + 123, 207, 16, 103, 228, 163, 197, 236, 237, 94, 62, 242, 225, 221, 177, + 207, 16, 103, 228, 163, 204, 141, 237, 94, 62, 242, 225, 208, 161, 207, + 16, 103, 228, 163, 204, 141, 237, 94, 62, 242, 225, 207, 26, 207, 16, + 103, 228, 163, 204, 141, 237, 94, 62, 242, 225, 248, 6, 207, 16, 103, + 228, 163, 204, 141, 237, 94, 62, 242, 225, 221, 123, 207, 16, 103, 228, + 163, 204, 141, 237, 94, 62, 242, 225, 210, 193, 207, 16, 103, 228, 163, + 204, 141, 237, 94, 60, 242, 225, 221, 177, 207, 16, 103, 228, 163, 204, + 141, 237, 94, 60, 242, 225, 208, 161, 207, 16, 103, 228, 163, 204, 141, + 237, 94, 60, 242, 225, 207, 26, 207, 16, 103, 228, 163, 204, 141, 237, + 94, 60, 242, 225, 248, 6, 207, 16, 103, 228, 163, 204, 141, 237, 94, 60, + 242, 225, 221, 123, 207, 16, 103, 228, 163, 204, 141, 237, 94, 60, 242, + 225, 210, 193, 207, 16, 103, 228, 163, 204, 141, 237, 94, 214, 179, 242, + 225, 221, 177, 207, 16, 103, 228, 163, 204, 141, 237, 94, 214, 179, 242, + 225, 208, 161, 207, 16, 103, 228, 163, 204, 141, 237, 94, 214, 179, 242, + 225, 207, 26, 207, 16, 103, 228, 163, 204, 141, 237, 94, 214, 179, 242, + 225, 248, 6, 207, 16, 103, 228, 163, 204, 141, 237, 94, 214, 179, 242, + 225, 221, 123, 207, 16, 103, 228, 163, 204, 141, 237, 94, 214, 179, 242, + 225, 210, 193, 207, 16, 103, 228, 163, 204, 141, 237, 94, 62, 242, 225, + 221, 123, 207, 16, 112, 228, 163, 233, 8, 237, 94, 60, 242, 225, 221, + 123, 207, 16, 112, 228, 163, 233, 8, 237, 94, 214, 179, 242, 225, 221, + 123, 207, 16, 112, 228, 163, 233, 8, 237, 94, 62, 242, 225, 234, 25, 60, + 242, 225, 234, 25, 214, 179, 242, 225, 234, 25, 62, 242, 225, 234, 26, + 207, 16, 214, 12, 237, 94, 60, 242, 225, 234, 26, 207, 16, 214, 12, 237, + 94, 214, 179, 242, 225, 234, 26, 207, 16, 214, 12, 237, 94, 62, 242, 225, + 221, 120, 62, 242, 225, 221, 119, 62, 242, 225, 221, 121, 60, 242, 225, + 221, 120, 60, 242, 225, 221, 119, 60, 242, 225, 221, 121, 193, 194, 207, + 237, 231, 143, 193, 194, 207, 237, 217, 154, 193, 194, 207, 237, 234, + 115, 193, 194, 207, 237, 228, 204, 193, 194, 207, 237, 242, 254, 193, + 194, 207, 237, 246, 229, 193, 194, 207, 237, 202, 192, 193, 194, 60, 231, + 143, 193, 194, 60, 217, 154, 193, 194, 60, 234, 115, 193, 194, 60, 228, + 204, 193, 194, 60, 242, 254, 193, 194, 60, 246, 229, 193, 194, 60, 202, + 192, 248, 216, 203, 206, 211, 205, 201, 64, 247, 141, 203, 180, 199, 172, + 206, 37, 235, 72, 80, 247, 229, 251, 118, 248, 202, 201, 251, 192, 242, + 221, 157, 210, 245, 247, 201, 217, 191, 194, 147, 210, 4, 214, 184, 236, + 126, 207, 80, 209, 224, 246, 112, 208, 11, 249, 237, 236, 168, 220, 84, + 248, 200, 216, 130, 229, 210, 251, 139, 184, 235, 67, 242, 52, 246, 204, + 206, 6, 205, 230, 220, 168, 128, 216, 105, 194, 51, 209, 208, 204, 138, + 214, 202, 221, 117, 247, 120, 216, 7, 198, 203, 198, 250, 229, 238, 209, + 233, 207, 40, 232, 168, 194, 5, 248, 102, 242, 59, 209, 146, 209, 223, + 194, 16, 233, 42, 250, 221, 229, 233, 219, 17, 210, 140, 228, 171, 247, + 222, 248, 87, 210, 135, 211, 221, 232, 194, 200, 128, 232, 155, 200, 66, + 175, 204, 135, 175, 204, 105, 175, 204, 134, 175, 204, 90, 175, 204, 119, + 175, 204, 104, 175, 204, 133, 175, 204, 82, 175, 204, 112, 175, 204, 96, + 175, 204, 126, 175, 204, 89, 175, 204, 118, 175, 204, 103, 175, 204, 132, + 175, 204, 78, 175, 204, 108, 175, 204, 93, 175, 204, 122, 175, 204, 85, + 175, 204, 99, 175, 204, 129, 175, 204, 81, 175, 204, 111, 175, 204, 95, + 175, 204, 125, 175, 204, 88, 175, 204, 117, 175, 204, 102, 175, 204, 131, + 175, 204, 76, 175, 204, 106, 175, 204, 91, 175, 204, 120, 175, 204, 83, + 175, 204, 113, 175, 204, 97, 175, 204, 127, 175, 204, 79, 175, 204, 109, + 175, 204, 123, 175, 204, 86, 175, 204, 115, 175, 204, 100, 175, 204, 130, + 175, 204, 77, 175, 204, 107, 175, 204, 92, 175, 204, 121, 175, 204, 84, + 175, 204, 114, 175, 204, 98, 175, 204, 128, 175, 204, 80, 175, 204, 110, + 175, 204, 94, 175, 204, 124, 175, 204, 87, 175, 204, 116, 175, 204, 101, + 106, 46, 175, 237, 11, 106, 85, 46, 115, 106, 246, 137, 106, 46, 175, + 237, 11, 106, 85, 46, 115, 106, 207, 101, 106, 46, 175, 237, 11, 113, 85, + 46, 115, 106, 246, 137, 106, 46, 175, 237, 11, 113, 85, 46, 115, 106, + 207, 101, 106, 46, 175, 237, 11, 113, 46, 115, 106, 246, 137, 106, 51, + 175, 237, 11, 113, 85, 46, 115, 113, 246, 137, 106, 51, 175, 237, 11, + 113, 85, 46, 115, 113, 207, 101, 106, 51, 175, 237, 11, 106, 85, 46, 115, + 113, 246, 137, 106, 51, 175, 237, 11, 106, 85, 46, 115, 113, 207, 101, + 106, 51, 175, 237, 11, 106, 46, 115, 113, 246, 137, 106, 51, 175, 237, + 11, 106, 85, 46, 115, 113, 85, 207, 101, 106, 51, 175, 237, 11, 106, 246, + 138, 115, 106, 85, 207, 101, 106, 51, 175, 237, 11, 106, 46, 115, 106, + 85, 207, 101, 106, 51, 175, 237, 11, 106, 246, 138, 115, 113, 85, 207, + 101, 106, 51, 175, 237, 11, 106, 46, 115, 113, 85, 207, 101, 106, 51, + 175, 237, 11, 106, 246, 138, 115, 113, 207, 101, 106, 46, 175, 237, 11, + 113, 246, 138, 115, 113, 85, 207, 101, 106, 46, 175, 237, 11, 113, 46, + 115, 113, 85, 207, 101, 106, 46, 175, 237, 11, 113, 246, 138, 115, 106, + 85, 207, 101, 106, 46, 175, 237, 11, 113, 46, 115, 106, 85, 207, 101, + 106, 46, 175, 237, 11, 113, 246, 138, 115, 106, 207, 101, 106, 46, 175, + 237, 11, 113, 85, 46, 115, 106, 85, 207, 101, 113, 51, 175, 237, 11, 106, + 85, 46, 115, 106, 246, 137, 113, 51, 175, 237, 11, 106, 85, 46, 115, 106, + 207, 101, 113, 51, 175, 237, 11, 113, 85, 46, 115, 106, 246, 137, 113, + 51, 175, 237, 11, 113, 85, 46, 115, 106, 207, 101, 113, 51, 175, 237, 11, + 113, 46, 115, 106, 246, 137, 113, 46, 175, 237, 11, 113, 85, 46, 115, + 113, 246, 137, 113, 46, 175, 237, 11, 113, 85, 46, 115, 113, 207, 101, + 113, 46, 175, 237, 11, 106, 85, 46, 115, 113, 246, 137, 113, 46, 175, + 237, 11, 106, 85, 46, 115, 113, 207, 101, 113, 46, 175, 237, 11, 106, 46, + 115, 113, 246, 137, 113, 46, 175, 237, 11, 106, 85, 46, 115, 113, 85, + 207, 101, 113, 46, 175, 237, 11, 106, 246, 138, 115, 106, 85, 207, 101, + 113, 46, 175, 237, 11, 106, 46, 115, 106, 85, 207, 101, 113, 46, 175, + 237, 11, 106, 246, 138, 115, 113, 85, 207, 101, 113, 46, 175, 237, 11, + 106, 46, 115, 113, 85, 207, 101, 113, 46, 175, 237, 11, 106, 246, 138, + 115, 113, 207, 101, 113, 51, 175, 237, 11, 113, 246, 138, 115, 113, 85, + 207, 101, 113, 51, 175, 237, 11, 113, 46, 115, 113, 85, 207, 101, 113, + 51, 175, 237, 11, 113, 246, 138, 115, 106, 85, 207, 101, 113, 51, 175, + 237, 11, 113, 46, 115, 106, 85, 207, 101, 113, 51, 175, 237, 11, 113, + 246, 138, 115, 106, 207, 101, 113, 51, 175, 237, 11, 113, 85, 46, 115, + 106, 85, 207, 101, 113, 26, 51, 26, 106, 198, 182, 112, 208, 166, 247, + 238, 46, 26, 106, 26, 51, 198, 182, 112, 208, 166, 247, 238, 113, 26, 46, + 26, 106, 198, 182, 112, 208, 166, 247, 238, 46, 26, 113, 26, 51, 198, + 182, 112, 208, 166, 247, 238, 46, 198, 182, 90, 208, 168, 247, 238, 113, + 198, 182, 90, 208, 168, 247, 238, 51, 198, 182, 90, 208, 168, 247, 238, + 106, 198, 182, 90, 208, 168, 247, 238, 84, 90, 234, 144, 247, 236, 84, + 90, 234, 144, 247, 235, 84, 90, 234, 144, 247, 234, 84, 90, 234, 144, + 247, 233, 84, 90, 234, 144, 247, 232, 84, 90, 234, 144, 247, 231, 229, 5, + 90, 234, 144, 247, 236, 229, 5, 90, 234, 144, 247, 235, 229, 5, 90, 234, + 144, 247, 234, 229, 5, 90, 234, 144, 247, 233, 229, 5, 90, 234, 144, 247, + 232, 229, 5, 90, 234, 144, 247, 231, 46, 26, 106, 90, 234, 144, 247, 238, + 46, 26, 113, 90, 234, 144, 247, 238, 51, 26, 113, 90, 234, 144, 247, 238, + 51, 26, 106, 90, 234, 144, 247, 238, 113, 26, 106, 90, 234, 144, 247, + 238, 229, 5, 90, 234, 144, 247, 237, 113, 90, 208, 168, 247, 238, 113, + 112, 234, 142, 247, 238, 113, 232, 214, 234, 142, 247, 238, 113, 112, + 208, 166, 247, 238, 113, 204, 146, 234, 142, 247, 238, 51, 90, 208, 168, + 247, 238, 51, 112, 234, 142, 247, 238, 51, 232, 214, 234, 142, 247, 238, + 51, 112, 208, 166, 247, 238, 51, 204, 146, 234, 142, 247, 238, 46, 138, + 217, 31, 204, 52, 51, 138, 217, 31, 204, 52, 113, 138, 217, 31, 204, 52, + 106, 138, 217, 31, 204, 52, 223, 123, 217, 31, 204, 52, 113, 138, 175, + 26, 106, 138, 223, 123, 217, 31, 204, 52, 113, 138, 223, 123, 217, 31, + 204, 53, 26, 106, 138, 247, 238, 46, 138, 223, 123, 217, 31, 204, 53, 26, + 51, 138, 247, 238, 242, 242, 247, 217, 232, 249, 223, 123, 242, 242, 247, + 217, 232, 249, 87, 229, 5, 232, 249, 113, 46, 115, 106, 51, 232, 249, + 113, 51, 115, 106, 46, 232, 249, 113, 26, 106, 198, 182, 138, 247, 238, + 46, 26, 51, 198, 182, 138, 247, 238, 113, 46, 198, 182, 217, 31, 204, 52, + 113, 51, 198, 182, 217, 31, 204, 52, 106, 51, 198, 182, 217, 31, 204, 52, + 106, 46, 198, 182, 217, 31, 204, 52, 105, 119, 152, 237, 11, 113, 246, + 138, 115, 85, 220, 28, 105, 119, 152, 237, 11, 113, 246, 138, 115, 85, + 207, 101, 105, 119, 152, 237, 11, 85, 46, 115, 106, 246, 137, 105, 119, + 152, 237, 11, 85, 51, 115, 106, 246, 137, 105, 119, 152, 237, 11, 113, + 246, 138, 115, 85, 46, 115, 106, 246, 137, 105, 119, 152, 237, 11, 113, + 246, 138, 115, 85, 51, 115, 106, 246, 137, 105, 119, 152, 237, 11, 85, + 46, 115, 106, 246, 138, 115, 85, 207, 101, 105, 119, 152, 237, 11, 85, + 46, 115, 113, 246, 138, 115, 85, 207, 101, 105, 119, 152, 237, 11, 113, + 246, 138, 115, 85, 46, 26, 85, 51, 115, 106, 246, 137, 105, 119, 152, + 237, 11, 113, 246, 138, 115, 85, 51, 26, 85, 46, 115, 106, 246, 137, 105, + 119, 152, 237, 11, 113, 246, 138, 115, 85, 51, 115, 106, 246, 138, 115, + 85, 220, 28, 105, 119, 152, 237, 11, 113, 246, 138, 115, 85, 46, 115, + 106, 246, 138, 115, 85, 207, 101, 105, 119, 152, 237, 11, 85, 46, 115, + 113, 246, 138, 115, 85, 51, 115, 106, 246, 137, 105, 119, 152, 237, 11, + 85, 51, 115, 113, 246, 138, 115, 85, 46, 115, 106, 246, 137, 105, 119, + 152, 237, 11, 237, 4, 105, 119, 152, 229, 5, 4, 84, 111, 250, 76, 209, + 189, 223, 123, 242, 244, 77, 46, 138, 206, 192, 217, 160, 51, 138, 206, + 192, 217, 160, 223, 123, 235, 92, 61, 4, 199, 74, 220, 18, 114, 61, 26, + 113, 26, 106, 90, 234, 144, 247, 238, 94, 61, 26, 113, 26, 106, 90, 234, + 144, 247, 238, 235, 92, 61, 26, 51, 90, 234, 144, 247, 238, 197, 30, 61, + 26, 51, 90, 234, 144, 247, 238, 46, 138, 232, 160, 51, 138, 232, 160, + 195, 244, 33, 238, 183, 51, 211, 184, 108, 236, 114, 214, 199, 237, 11, + 238, 183, 214, 199, 237, 11, 85, 51, 115, 106, 246, 137, 214, 199, 237, + 11, 237, 4, 62, 87, 206, 52, 4, 207, 7, 238, 222, 46, 199, 192, 62, 51, + 209, 188, 223, 176, 85, 199, 192, 62, 51, 209, 188, 223, 176, 51, 199, + 192, 62, 51, 209, 188, 223, 176, 214, 199, 108, 208, 159, 77, 201, 250, + 233, 0, 201, 250, 233, 1, 4, 250, 89, 208, 38, 201, 250, 233, 1, 220, 35, + 220, 28, 201, 250, 233, 1, 220, 35, 207, 101, 201, 250, 233, 1, 4, 235, + 79, 62, 197, 40, 242, 220, 205, 197, 17, 192, 76, 205, 197, 17, 101, 205, + 197, 17, 104, 205, 197, 17, 133, 205, 197, 17, 134, 205, 197, 17, 151, + 205, 197, 17, 170, 205, 197, 17, 179, 205, 197, 17, 174, 205, 197, 17, + 182, 12, 15, 228, 38, 12, 15, 228, 37, 12, 15, 228, 36, 12, 15, 228, 35, + 12, 15, 228, 34, 12, 15, 228, 33, 12, 15, 228, 32, 12, 15, 228, 31, 12, + 15, 228, 30, 12, 15, 228, 29, 12, 15, 228, 28, 12, 15, 228, 27, 12, 15, + 228, 26, 12, 15, 228, 25, 12, 15, 228, 24, 12, 15, 228, 23, 12, 15, 228, + 22, 12, 15, 228, 21, 12, 15, 228, 20, 12, 15, 228, 19, 12, 15, 228, 18, + 12, 15, 228, 17, 12, 15, 228, 16, 12, 15, 228, 15, 12, 15, 228, 14, 12, + 15, 228, 13, 12, 15, 228, 12, 12, 15, 228, 11, 12, 15, 228, 10, 12, 15, + 228, 9, 12, 15, 228, 8, 12, 15, 228, 7, 12, 15, 228, 6, 12, 15, 228, 5, + 12, 15, 228, 4, 12, 15, 228, 3, 12, 15, 228, 2, 12, 15, 228, 1, 12, 15, + 228, 0, 12, 15, 227, 255, 12, 15, 227, 254, 12, 15, 227, 253, 12, 15, + 227, 252, 12, 15, 227, 251, 12, 15, 227, 250, 12, 15, 227, 249, 12, 15, + 227, 248, 12, 15, 227, 247, 12, 15, 227, 246, 12, 15, 227, 245, 12, 15, + 227, 244, 12, 15, 227, 243, 12, 15, 227, 242, 12, 15, 227, 241, 12, 15, + 227, 240, 12, 15, 227, 239, 12, 15, 227, 238, 12, 15, 227, 237, 12, 15, + 227, 236, 12, 15, 227, 235, 12, 15, 227, 234, 12, 15, 227, 233, 12, 15, + 227, 232, 12, 15, 227, 231, 12, 15, 227, 230, 12, 15, 227, 229, 12, 15, + 227, 228, 12, 15, 227, 227, 12, 15, 227, 226, 12, 15, 227, 225, 12, 15, + 227, 224, 12, 15, 227, 223, 12, 15, 227, 222, 12, 15, 227, 221, 12, 15, + 227, 220, 12, 15, 227, 219, 12, 15, 227, 218, 12, 15, 227, 217, 12, 15, + 227, 216, 12, 15, 227, 215, 12, 15, 227, 214, 12, 15, 227, 213, 12, 15, + 227, 212, 12, 15, 227, 211, 12, 15, 227, 210, 12, 15, 227, 209, 12, 15, + 227, 208, 12, 15, 227, 207, 12, 15, 227, 206, 12, 15, 227, 205, 12, 15, + 227, 204, 12, 15, 227, 203, 12, 15, 227, 202, 12, 15, 227, 201, 12, 15, + 227, 200, 12, 15, 227, 199, 12, 15, 227, 198, 12, 15, 227, 197, 12, 15, + 227, 196, 12, 15, 227, 195, 12, 15, 227, 194, 12, 15, 227, 193, 12, 15, + 227, 192, 12, 15, 227, 191, 12, 15, 227, 190, 12, 15, 227, 189, 12, 15, + 227, 188, 12, 15, 227, 187, 12, 15, 227, 186, 12, 15, 227, 185, 12, 15, + 227, 184, 12, 15, 227, 183, 12, 15, 227, 182, 12, 15, 227, 181, 12, 15, + 227, 180, 12, 15, 227, 179, 12, 15, 227, 178, 12, 15, 227, 177, 12, 15, + 227, 176, 12, 15, 227, 175, 12, 15, 227, 174, 12, 15, 227, 173, 12, 15, + 227, 172, 12, 15, 227, 171, 12, 15, 227, 170, 12, 15, 227, 169, 12, 15, + 227, 168, 12, 15, 227, 167, 12, 15, 227, 166, 12, 15, 227, 165, 12, 15, + 227, 164, 12, 15, 227, 163, 12, 15, 227, 162, 12, 15, 227, 161, 12, 15, + 227, 160, 12, 15, 227, 159, 12, 15, 227, 158, 12, 15, 227, 157, 12, 15, + 227, 156, 12, 15, 227, 155, 12, 15, 227, 154, 12, 15, 227, 153, 12, 15, + 227, 152, 12, 15, 227, 151, 12, 15, 227, 150, 12, 15, 227, 149, 12, 15, + 227, 148, 12, 15, 227, 147, 12, 15, 227, 146, 12, 15, 227, 145, 12, 15, + 227, 144, 12, 15, 227, 143, 12, 15, 227, 142, 12, 15, 227, 141, 12, 15, + 227, 140, 12, 15, 227, 139, 12, 15, 227, 138, 12, 15, 227, 137, 12, 15, + 227, 136, 12, 15, 227, 135, 12, 15, 227, 134, 12, 15, 227, 133, 12, 15, + 227, 132, 12, 15, 227, 131, 12, 15, 227, 130, 12, 15, 227, 129, 12, 15, + 227, 128, 12, 15, 227, 127, 12, 15, 227, 126, 12, 15, 227, 125, 12, 15, + 227, 124, 12, 15, 227, 123, 12, 15, 227, 122, 12, 15, 227, 121, 12, 15, + 227, 120, 12, 15, 227, 119, 12, 15, 227, 118, 12, 15, 227, 117, 12, 15, + 227, 116, 12, 15, 227, 115, 12, 15, 227, 114, 12, 15, 227, 113, 12, 15, + 227, 112, 12, 15, 227, 111, 12, 15, 227, 110, 12, 15, 227, 109, 12, 15, + 227, 108, 12, 15, 227, 107, 12, 15, 227, 106, 12, 15, 227, 105, 12, 15, + 227, 104, 12, 15, 227, 103, 12, 15, 227, 102, 12, 15, 227, 101, 12, 15, + 227, 100, 12, 15, 227, 99, 12, 15, 227, 98, 12, 15, 227, 97, 12, 15, 227, + 96, 12, 15, 227, 95, 12, 15, 227, 94, 12, 15, 227, 93, 12, 15, 227, 92, + 12, 15, 227, 91, 12, 15, 227, 90, 12, 15, 227, 89, 12, 15, 227, 88, 12, + 15, 227, 87, 12, 15, 227, 86, 12, 15, 227, 85, 12, 15, 227, 84, 12, 15, + 227, 83, 12, 15, 227, 82, 12, 15, 227, 81, 12, 15, 227, 80, 12, 15, 227, + 79, 12, 15, 227, 78, 12, 15, 227, 77, 12, 15, 227, 76, 12, 15, 227, 75, + 12, 15, 227, 74, 12, 15, 227, 73, 12, 15, 227, 72, 12, 15, 227, 71, 12, + 15, 227, 70, 12, 15, 227, 69, 12, 15, 227, 68, 12, 15, 227, 67, 12, 15, + 227, 66, 12, 15, 227, 65, 12, 15, 227, 64, 12, 15, 227, 63, 12, 15, 227, + 62, 12, 15, 227, 61, 12, 15, 227, 60, 12, 15, 227, 59, 12, 15, 227, 58, + 12, 15, 227, 57, 12, 15, 227, 56, 12, 15, 227, 55, 12, 15, 227, 54, 12, + 15, 227, 53, 12, 15, 227, 52, 12, 15, 227, 51, 12, 15, 227, 50, 12, 15, + 227, 49, 12, 15, 227, 48, 12, 15, 227, 47, 12, 15, 227, 46, 12, 15, 227, + 45, 12, 15, 227, 44, 12, 15, 227, 43, 12, 15, 227, 42, 12, 15, 227, 41, + 12, 15, 227, 40, 12, 15, 227, 39, 12, 15, 227, 38, 12, 15, 227, 37, 12, + 15, 227, 36, 12, 15, 227, 35, 12, 15, 227, 34, 12, 15, 227, 33, 12, 15, + 227, 32, 12, 15, 227, 31, 12, 15, 227, 30, 12, 15, 227, 29, 12, 15, 227, + 28, 12, 15, 227, 27, 12, 15, 227, 26, 12, 15, 227, 25, 12, 15, 227, 24, + 12, 15, 227, 23, 12, 15, 227, 22, 12, 15, 227, 21, 12, 15, 227, 20, 12, + 15, 227, 19, 12, 15, 227, 18, 12, 15, 227, 17, 12, 15, 227, 16, 12, 15, + 227, 15, 12, 15, 227, 14, 12, 15, 227, 13, 12, 15, 227, 12, 12, 15, 227, + 11, 12, 15, 227, 10, 12, 15, 227, 9, 12, 15, 227, 8, 12, 15, 227, 7, 12, + 15, 227, 6, 12, 15, 227, 5, 12, 15, 227, 4, 12, 15, 227, 3, 12, 15, 227, + 2, 12, 15, 227, 1, 12, 15, 227, 0, 12, 15, 226, 255, 12, 15, 226, 254, + 12, 15, 226, 253, 12, 15, 226, 252, 12, 15, 226, 251, 12, 15, 226, 250, + 12, 15, 226, 249, 12, 15, 226, 248, 12, 15, 226, 247, 12, 15, 226, 246, + 12, 15, 226, 245, 12, 15, 226, 244, 12, 15, 226, 243, 12, 15, 226, 242, + 12, 15, 226, 241, 12, 15, 226, 240, 12, 15, 226, 239, 12, 15, 226, 238, + 12, 15, 226, 237, 12, 15, 226, 236, 12, 15, 226, 235, 12, 15, 226, 234, + 12, 15, 226, 233, 12, 15, 226, 232, 12, 15, 226, 231, 12, 15, 226, 230, + 12, 15, 226, 229, 12, 15, 226, 228, 12, 15, 226, 227, 12, 15, 226, 226, + 12, 15, 226, 225, 12, 15, 226, 224, 12, 15, 226, 223, 12, 15, 226, 222, + 12, 15, 226, 221, 12, 15, 226, 220, 12, 15, 226, 219, 12, 15, 226, 218, + 12, 15, 226, 217, 12, 15, 226, 216, 12, 15, 226, 215, 12, 15, 226, 214, + 12, 15, 226, 213, 12, 15, 226, 212, 12, 15, 226, 211, 12, 15, 226, 210, + 12, 15, 226, 209, 12, 15, 226, 208, 12, 15, 226, 207, 12, 15, 226, 206, + 12, 15, 226, 205, 12, 15, 226, 204, 12, 15, 226, 203, 12, 15, 226, 202, + 12, 15, 226, 201, 12, 15, 226, 200, 12, 15, 226, 199, 12, 15, 226, 198, + 12, 15, 226, 197, 12, 15, 226, 196, 12, 15, 226, 195, 12, 15, 226, 194, + 12, 15, 226, 193, 12, 15, 226, 192, 12, 15, 226, 191, 12, 15, 226, 190, + 12, 15, 226, 189, 12, 15, 226, 188, 12, 15, 226, 187, 12, 15, 226, 186, + 12, 15, 226, 185, 12, 15, 226, 184, 12, 15, 226, 183, 12, 15, 226, 182, + 12, 15, 226, 181, 12, 15, 226, 180, 12, 15, 226, 179, 12, 15, 226, 178, + 12, 15, 226, 177, 12, 15, 226, 176, 12, 15, 226, 175, 12, 15, 226, 174, + 12, 15, 226, 173, 12, 15, 226, 172, 12, 15, 226, 171, 12, 15, 226, 170, + 12, 15, 226, 169, 12, 15, 226, 168, 12, 15, 226, 167, 12, 15, 226, 166, + 12, 15, 226, 165, 12, 15, 226, 164, 12, 15, 226, 163, 12, 15, 226, 162, + 12, 15, 226, 161, 12, 15, 226, 160, 12, 15, 226, 159, 12, 15, 226, 158, + 12, 15, 226, 157, 12, 15, 226, 156, 12, 15, 226, 155, 12, 15, 226, 154, + 12, 15, 226, 153, 12, 15, 226, 152, 12, 15, 226, 151, 12, 15, 226, 150, + 12, 15, 226, 149, 12, 15, 226, 148, 12, 15, 226, 147, 12, 15, 226, 146, + 12, 15, 226, 145, 12, 15, 226, 144, 12, 15, 226, 143, 12, 15, 226, 142, + 12, 15, 226, 141, 12, 15, 226, 140, 12, 15, 226, 139, 12, 15, 226, 138, + 12, 15, 226, 137, 12, 15, 226, 136, 12, 15, 226, 135, 12, 15, 226, 134, + 12, 15, 226, 133, 12, 15, 226, 132, 12, 15, 226, 131, 12, 15, 226, 130, + 12, 15, 226, 129, 12, 15, 226, 128, 12, 15, 226, 127, 12, 15, 226, 126, + 12, 15, 226, 125, 12, 15, 226, 124, 12, 15, 226, 123, 12, 15, 226, 122, + 12, 15, 226, 121, 12, 15, 226, 120, 12, 15, 226, 119, 12, 15, 226, 118, + 12, 15, 226, 117, 12, 15, 226, 116, 12, 15, 226, 115, 12, 15, 226, 114, + 12, 15, 226, 113, 12, 15, 226, 112, 12, 15, 226, 111, 12, 15, 226, 110, + 12, 15, 226, 109, 12, 15, 226, 108, 12, 15, 226, 107, 12, 15, 226, 106, + 12, 15, 226, 105, 12, 15, 226, 104, 12, 15, 226, 103, 12, 15, 226, 102, + 12, 15, 226, 101, 12, 15, 226, 100, 12, 15, 226, 99, 12, 15, 226, 98, 12, + 15, 226, 97, 12, 15, 226, 96, 12, 15, 226, 95, 12, 15, 226, 94, 12, 15, + 226, 93, 12, 15, 226, 92, 12, 15, 226, 91, 12, 15, 226, 90, 12, 15, 226, + 89, 12, 15, 226, 88, 12, 15, 226, 87, 12, 15, 226, 86, 12, 15, 226, 85, + 12, 15, 226, 84, 12, 15, 226, 83, 12, 15, 226, 82, 12, 15, 226, 81, 12, + 15, 226, 80, 12, 15, 226, 79, 12, 15, 226, 78, 12, 15, 226, 77, 12, 15, + 226, 76, 12, 15, 226, 75, 12, 15, 226, 74, 12, 15, 226, 73, 12, 15, 226, + 72, 12, 15, 226, 71, 12, 15, 226, 70, 12, 15, 226, 69, 12, 15, 226, 68, + 12, 15, 226, 67, 12, 15, 226, 66, 12, 15, 226, 65, 12, 15, 226, 64, 12, + 15, 226, 63, 12, 15, 226, 62, 12, 15, 226, 61, 12, 15, 226, 60, 12, 15, + 226, 59, 12, 15, 226, 58, 12, 15, 226, 57, 12, 15, 226, 56, 12, 15, 226, + 55, 12, 15, 226, 54, 12, 15, 226, 53, 12, 15, 226, 52, 12, 15, 226, 51, + 12, 15, 226, 50, 12, 15, 226, 49, 12, 15, 226, 48, 12, 15, 226, 47, 12, + 15, 226, 46, 12, 15, 226, 45, 12, 15, 226, 44, 12, 15, 226, 43, 12, 15, + 226, 42, 12, 15, 226, 41, 12, 15, 226, 40, 12, 15, 226, 39, 12, 15, 226, + 38, 12, 15, 226, 37, 12, 15, 226, 36, 12, 15, 226, 35, 12, 15, 226, 34, + 12, 15, 226, 33, 12, 15, 226, 32, 12, 15, 226, 31, 12, 15, 226, 30, 12, + 15, 226, 29, 12, 15, 226, 28, 12, 15, 226, 27, 12, 15, 226, 26, 12, 15, + 226, 25, 12, 15, 226, 24, 12, 15, 226, 23, 12, 15, 226, 22, 12, 15, 226, + 21, 12, 15, 226, 20, 12, 15, 226, 19, 12, 15, 226, 18, 12, 15, 226, 17, + 12, 15, 226, 16, 12, 15, 226, 15, 12, 15, 226, 14, 12, 15, 226, 13, 12, + 15, 226, 12, 12, 15, 226, 11, 12, 15, 226, 10, 12, 15, 226, 9, 220, 79, + 200, 155, 190, 202, 160, 190, 233, 204, 77, 190, 208, 142, 77, 190, 31, + 57, 190, 236, 127, 57, 190, 210, 133, 57, 190, 250, 229, 190, 250, 147, + 190, 46, 210, 230, 190, 51, 210, 230, 190, 250, 37, 190, 102, 57, 190, + 242, 38, 190, 228, 110, 190, 232, 71, 201, 238, 190, 202, 189, 190, 17, + 192, 76, 190, 17, 101, 190, 17, 104, 190, 17, 133, 190, 17, 134, 190, 17, + 151, 190, 17, 170, 190, 17, 179, 190, 17, 174, 190, 17, 182, 190, 242, + 47, 190, 204, 180, 190, 219, 240, 57, 190, 234, 30, 57, 190, 230, 204, + 57, 190, 208, 159, 77, 190, 242, 36, 250, 26, 190, 8, 6, 1, 64, 190, 8, + 6, 1, 249, 226, 190, 8, 6, 1, 247, 52, 190, 8, 6, 1, 238, 95, 190, 8, 6, + 1, 71, 190, 8, 6, 1, 233, 163, 190, 8, 6, 1, 232, 44, 190, 8, 6, 1, 230, + 124, 190, 8, 6, 1, 70, 190, 8, 6, 1, 223, 65, 190, 8, 6, 1, 222, 184, + 190, 8, 6, 1, 165, 190, 8, 6, 1, 218, 236, 190, 8, 6, 1, 215, 151, 190, + 8, 6, 1, 74, 190, 8, 6, 1, 211, 93, 190, 8, 6, 1, 208, 247, 190, 8, 6, 1, + 150, 190, 8, 6, 1, 206, 158, 190, 8, 6, 1, 200, 228, 190, 8, 6, 1, 68, + 190, 8, 6, 1, 196, 236, 190, 8, 6, 1, 194, 202, 190, 8, 6, 1, 193, 223, + 190, 8, 6, 1, 193, 148, 190, 8, 6, 1, 192, 155, 190, 46, 50, 186, 190, + 207, 169, 202, 189, 190, 51, 50, 186, 190, 242, 122, 251, 143, 190, 132, + 219, 175, 190, 230, 211, 251, 143, 190, 8, 2, 1, 64, 190, 8, 2, 1, 249, + 226, 190, 8, 2, 1, 247, 52, 190, 8, 2, 1, 238, 95, 190, 8, 2, 1, 71, 190, + 8, 2, 1, 233, 163, 190, 8, 2, 1, 232, 44, 190, 8, 2, 1, 230, 124, 190, 8, + 2, 1, 70, 190, 8, 2, 1, 223, 65, 190, 8, 2, 1, 222, 184, 190, 8, 2, 1, + 165, 190, 8, 2, 1, 218, 236, 190, 8, 2, 1, 215, 151, 190, 8, 2, 1, 74, + 190, 8, 2, 1, 211, 93, 190, 8, 2, 1, 208, 247, 190, 8, 2, 1, 150, 190, 8, + 2, 1, 206, 158, 190, 8, 2, 1, 200, 228, 190, 8, 2, 1, 68, 190, 8, 2, 1, + 196, 236, 190, 8, 2, 1, 194, 202, 190, 8, 2, 1, 193, 223, 190, 8, 2, 1, + 193, 148, 190, 8, 2, 1, 192, 155, 190, 46, 238, 138, 186, 190, 84, 219, + 175, 190, 51, 238, 138, 186, 190, 199, 90, 246, 242, 200, 155, 65, 205, + 110, 65, 205, 99, 65, 205, 88, 65, 205, 76, 65, 205, 65, 65, 205, 54, 65, + 205, 43, 65, 205, 32, 65, 205, 21, 65, 205, 13, 65, 205, 12, 65, 205, 11, + 65, 205, 10, 65, 205, 8, 65, 205, 7, 65, 205, 6, 65, 205, 5, 65, 205, 4, + 65, 205, 3, 65, 205, 2, 65, 205, 1, 65, 205, 0, 65, 204, 255, 65, 204, + 253, 65, 204, 252, 65, 204, 251, 65, 204, 250, 65, 204, 249, 65, 204, + 248, 65, 204, 247, 65, 204, 246, 65, 204, 245, 65, 204, 244, 65, 204, + 242, 65, 204, 241, 65, 204, 240, 65, 204, 239, 65, 204, 238, 65, 204, + 237, 65, 204, 236, 65, 204, 235, 65, 204, 234, 65, 204, 233, 65, 204, + 231, 65, 204, 230, 65, 204, 229, 65, 204, 228, 65, 204, 227, 65, 204, + 226, 65, 204, 225, 65, 204, 224, 65, 204, 223, 65, 204, 222, 65, 204, + 220, 65, 204, 219, 65, 204, 218, 65, 204, 217, 65, 204, 216, 65, 204, + 215, 65, 204, 214, 65, 204, 213, 65, 204, 212, 65, 204, 211, 65, 204, + 209, 65, 204, 208, 65, 204, 207, 65, 204, 206, 65, 204, 205, 65, 204, + 204, 65, 204, 203, 65, 204, 202, 65, 204, 201, 65, 204, 200, 65, 204, + 198, 65, 204, 197, 65, 204, 196, 65, 204, 195, 65, 204, 194, 65, 204, + 193, 65, 204, 192, 65, 204, 191, 65, 204, 190, 65, 204, 189, 65, 205, + 186, 65, 205, 185, 65, 205, 184, 65, 205, 183, 65, 205, 182, 65, 205, + 181, 65, 205, 180, 65, 205, 179, 65, 205, 178, 65, 205, 177, 65, 205, + 175, 65, 205, 174, 65, 205, 173, 65, 205, 172, 65, 205, 171, 65, 205, + 170, 65, 205, 169, 65, 205, 168, 65, 205, 167, 65, 205, 166, 65, 205, + 164, 65, 205, 163, 65, 205, 162, 65, 205, 161, 65, 205, 160, 65, 205, + 159, 65, 205, 158, 65, 205, 157, 65, 205, 156, 65, 205, 155, 65, 205, + 153, 65, 205, 152, 65, 205, 151, 65, 205, 150, 65, 205, 149, 65, 205, + 148, 65, 205, 147, 65, 205, 146, 65, 205, 145, 65, 205, 144, 65, 205, + 142, 65, 205, 141, 65, 205, 140, 65, 205, 139, 65, 205, 138, 65, 205, + 137, 65, 205, 136, 65, 205, 135, 65, 205, 134, 65, 205, 133, 65, 205, + 131, 65, 205, 130, 65, 205, 129, 65, 205, 128, 65, 205, 127, 65, 205, + 126, 65, 205, 125, 65, 205, 124, 65, 205, 123, 65, 205, 122, 65, 205, + 120, 65, 205, 119, 65, 205, 118, 65, 205, 117, 65, 205, 116, 65, 205, + 115, 65, 205, 114, 65, 205, 113, 65, 205, 112, 65, 205, 111, 65, 205, + 109, 65, 205, 108, 65, 205, 107, 65, 205, 106, 65, 205, 105, 65, 205, + 104, 65, 205, 103, 65, 205, 102, 65, 205, 101, 65, 205, 100, 65, 205, 98, + 65, 205, 97, 65, 205, 96, 65, 205, 95, 65, 205, 94, 65, 205, 93, 65, 205, + 92, 65, 205, 91, 65, 205, 90, 65, 205, 89, 65, 205, 87, 65, 205, 86, 65, + 205, 85, 65, 205, 84, 65, 205, 83, 65, 205, 82, 65, 205, 81, 65, 205, 80, + 65, 205, 79, 65, 205, 78, 65, 205, 75, 65, 205, 74, 65, 205, 73, 65, 205, + 72, 65, 205, 71, 65, 205, 70, 65, 205, 69, 65, 205, 68, 65, 205, 67, 65, + 205, 66, 65, 205, 64, 65, 205, 63, 65, 205, 62, 65, 205, 61, 65, 205, 60, + 65, 205, 59, 65, 205, 58, 65, 205, 57, 65, 205, 56, 65, 205, 55, 65, 205, + 53, 65, 205, 52, 65, 205, 51, 65, 205, 50, 65, 205, 49, 65, 205, 48, 65, + 205, 47, 65, 205, 46, 65, 205, 45, 65, 205, 44, 65, 205, 42, 65, 205, 41, + 65, 205, 40, 65, 205, 39, 65, 205, 38, 65, 205, 37, 65, 205, 36, 65, 205, + 35, 65, 205, 34, 65, 205, 33, 65, 205, 31, 65, 205, 30, 65, 205, 29, 65, + 205, 28, 65, 205, 27, 65, 205, 26, 65, 205, 25, 65, 205, 24, 65, 205, 23, + 65, 205, 22, 65, 205, 20, 65, 205, 19, 65, 205, 18, 65, 205, 17, 65, 205, + 16, 65, 205, 15, 65, 205, 14, 212, 238, 212, 240, 202, 15, 80, 229, 242, + 202, 193, 202, 15, 80, 199, 244, 201, 186, 234, 80, 80, 199, 244, 233, + 232, 234, 80, 80, 198, 208, 234, 42, 234, 66, 234, 67, 251, 134, 251, + 135, 251, 23, 248, 89, 248, 246, 247, 130, 246, 100, 200, 161, 229, 5, + 200, 161, 228, 186, 200, 166, 219, 176, 233, 38, 214, 177, 219, 175, 234, + 80, 80, 219, 175, 219, 224, 213, 204, 234, 45, 219, 176, 200, 161, 84, + 200, 161, 194, 225, 232, 136, 233, 38, 233, 15, 246, 203, 207, 172, 238, + 202, 203, 232, 211, 125, 219, 97, 101, 202, 212, 203, 232, 223, 190, 219, + 97, 192, 76, 203, 125, 237, 180, 219, 166, 234, 1, 236, 157, 237, 47, + 238, 243, 101, 237, 169, 237, 47, 238, 243, 104, 237, 168, 237, 47, 238, + 243, 133, 237, 167, 237, 47, 238, 243, 134, 237, 166, 214, 199, 251, 134, + 215, 67, 200, 254, 223, 253, 201, 2, 234, 80, 80, 198, 209, 247, 238, + 233, 239, 246, 241, 246, 243, 234, 80, 80, 217, 30, 234, 43, 201, 151, + 201, 169, 234, 1, 234, 2, 223, 165, 204, 166, 134, 232, 251, 204, 165, + 232, 81, 223, 165, 204, 166, 133, 230, 194, 204, 165, 230, 191, 223, 165, + 204, 166, 104, 207, 248, 204, 165, 206, 224, 223, 165, 204, 166, 101, + 197, 55, 204, 165, 197, 10, 202, 163, 237, 86, 237, 88, 211, 65, 246, 99, + 211, 67, 139, 212, 7, 209, 104, 229, 8, 247, 155, 210, 123, 229, 202, + 247, 169, 213, 143, 247, 155, 229, 202, 215, 28, 223, 176, 223, 178, 214, + 170, 219, 175, 214, 197, 202, 15, 80, 205, 191, 250, 106, 202, 92, 234, + 80, 80, 205, 191, 250, 106, 234, 4, 246, 100, 200, 162, 204, 151, 229, 5, + 200, 162, 204, 151, 228, 183, 246, 100, 200, 162, 4, 222, 196, 229, 5, + 200, 162, 4, 222, 196, 228, 184, 219, 176, 200, 162, 204, 151, 84, 200, + 162, 204, 151, 194, 224, 210, 222, 219, 176, 232, 123, 210, 222, 219, + 176, 235, 96, 209, 219, 210, 222, 219, 176, 248, 245, 210, 222, 219, 176, + 197, 41, 209, 213, 207, 169, 219, 176, 233, 38, 207, 169, 223, 176, 207, + 151, 203, 74, 203, 232, 104, 203, 71, 202, 94, 203, 74, 203, 232, 133, + 203, 70, 202, 93, 237, 47, 238, 243, 201, 210, 237, 164, 209, 89, 197, 9, + 101, 209, 89, 197, 7, 209, 50, 209, 89, 197, 9, 104, 209, 89, 197, 6, + 209, 49, 204, 152, 198, 207, 202, 12, 201, 193, 246, 242, 246, 99, 246, + 177, 216, 244, 194, 155, 215, 169, 202, 15, 80, 230, 179, 250, 106, 202, + 15, 80, 209, 68, 250, 106, 202, 162, 234, 80, 80, 230, 179, 250, 106, + 234, 80, 80, 209, 68, 250, 106, 234, 40, 202, 15, 80, 201, 210, 202, 178, + 203, 74, 230, 216, 246, 100, 223, 124, 204, 69, 203, 74, 246, 100, 223, + 124, 205, 239, 238, 243, 204, 162, 223, 124, 238, 163, 201, 211, 200, 15, + 202, 35, 211, 175, 200, 243, 242, 37, 211, 142, 209, 90, 216, 243, 209, + 201, 250, 143, 209, 83, 242, 37, 250, 160, 215, 16, 203, 134, 8, 6, 1, + 231, 84, 8, 2, 1, 231, 84, 246, 120, 251, 2, 200, 248, 201, 157, 242, 48, + 203, 16, 220, 28, 222, 115, 1, 219, 126, 220, 77, 1, 232, 165, 232, 156, + 220, 77, 1, 232, 165, 233, 50, 220, 77, 1, 207, 55, 220, 77, 1, 219, 107, + 86, 122, 247, 250, 203, 205, 231, 47, 216, 193, 207, 159, 30, 123, 193, + 43, 30, 123, 193, 39, 30, 123, 202, 70, 30, 123, 193, 44, 232, 58, 232, + 57, 232, 56, 215, 171, 191, 233, 191, 234, 191, 236, 219, 40, 207, 63, + 219, 42, 207, 65, 210, 184, 219, 39, 207, 62, 213, 174, 216, 95, 194, 38, + 219, 41, 207, 64, 232, 80, 210, 183, 194, 97, 234, 104, 232, 68, 216, + 167, 211, 212, 197, 11, 109, 216, 167, 237, 186, 109, 114, 198, 184, 61, + 4, 55, 84, 111, 94, 198, 184, 61, 4, 55, 84, 111, 11, 5, 223, 80, 77, + 195, 225, 195, 114, 195, 46, 195, 35, 195, 24, 195, 13, 195, 2, 194, 247, + 194, 236, 195, 224, 195, 213, 195, 202, 195, 191, 195, 180, 195, 169, + 195, 158, 209, 105, 232, 136, 39, 84, 51, 62, 219, 247, 186, 247, 57, + 211, 159, 77, 247, 209, 191, 235, 10, 3, 212, 248, 200, 19, 10, 3, 212, + 248, 136, 212, 248, 247, 90, 136, 247, 89, 217, 36, 6, 1, 230, 124, 217, + 36, 6, 1, 214, 167, 217, 36, 2, 1, 230, 124, 217, 36, 2, 1, 214, 167, 59, + 1, 234, 252, 69, 35, 16, 232, 79, 203, 12, 242, 172, 196, 133, 195, 147, + 195, 136, 195, 125, 195, 113, 195, 102, 195, 91, 195, 80, 195, 69, 195, + 58, 195, 50, 195, 49, 195, 48, 195, 47, 195, 45, 195, 44, 195, 43, 195, + 42, 195, 41, 195, 40, 195, 39, 195, 38, 195, 37, 195, 36, 195, 34, 195, + 33, 195, 32, 195, 31, 195, 30, 195, 29, 195, 28, 195, 27, 195, 26, 195, + 25, 195, 23, 195, 22, 195, 21, 195, 20, 195, 19, 195, 18, 195, 17, 195, + 16, 195, 15, 195, 14, 195, 12, 195, 11, 195, 10, 195, 9, 195, 8, 195, 7, + 195, 6, 195, 5, 195, 4, 195, 3, 195, 1, 195, 0, 194, 255, 194, 254, 194, + 253, 194, 252, 194, 251, 194, 250, 194, 249, 194, 248, 194, 246, 194, + 245, 194, 244, 194, 243, 194, 242, 194, 241, 194, 240, 194, 239, 194, + 238, 194, 237, 194, 235, 194, 234, 194, 233, 194, 232, 194, 231, 194, + 230, 194, 229, 194, 228, 194, 227, 194, 226, 195, 223, 195, 222, 195, + 221, 195, 220, 195, 219, 195, 218, 195, 217, 195, 216, 195, 215, 195, + 214, 195, 212, 195, 211, 195, 210, 195, 209, 195, 208, 195, 207, 195, + 206, 195, 205, 195, 204, 195, 203, 195, 201, 195, 200, 195, 199, 195, + 198, 195, 197, 195, 196, 195, 195, 195, 194, 195, 193, 195, 192, 195, + 190, 195, 189, 195, 188, 195, 187, 195, 186, 195, 185, 195, 184, 195, + 183, 195, 182, 195, 181, 195, 179, 195, 178, 195, 177, 195, 176, 195, + 175, 195, 174, 195, 173, 195, 172, 195, 171, 195, 170, 195, 168, 195, + 167, 195, 166, 195, 165, 195, 164, 195, 163, 195, 162, 195, 161, 195, + 160, 195, 159, 195, 157, 195, 156, 195, 155, 195, 154, 195, 153, 195, + 152, 195, 151, 195, 150, 195, 149, 195, 148, 195, 146, 195, 145, 195, + 144, 195, 143, 195, 142, 195, 141, 195, 140, 195, 139, 195, 138, 195, + 137, 195, 135, 195, 134, 195, 133, 195, 132, 195, 131, 195, 130, 195, + 129, 195, 128, 195, 127, 195, 126, 195, 124, 195, 123, 195, 122, 195, + 121, 195, 120, 195, 119, 195, 118, 195, 117, 195, 116, 195, 115, 195, + 112, 195, 111, 195, 110, 195, 109, 195, 108, 195, 107, 195, 106, 195, + 105, 195, 104, 195, 103, 195, 101, 195, 100, 195, 99, 195, 98, 195, 97, + 195, 96, 195, 95, 195, 94, 195, 93, 195, 92, 195, 90, 195, 89, 195, 88, + 195, 87, 195, 86, 195, 85, 195, 84, 195, 83, 195, 82, 195, 81, 195, 79, + 195, 78, 195, 77, 195, 76, 195, 75, 195, 74, 195, 73, 195, 72, 195, 71, + 195, 70, 195, 68, 195, 67, 195, 66, 195, 65, 195, 64, 195, 63, 195, 62, + 195, 61, 195, 60, 195, 59, 195, 57, 195, 56, 195, 55, 195, 54, 195, 53, + 195, 52, 195, 51, 221, 254, 31, 57, 221, 254, 250, 37, 221, 254, 17, 192, + 76, 221, 254, 17, 101, 221, 254, 17, 104, 221, 254, 17, 133, 221, 254, + 17, 134, 221, 254, 17, 151, 221, 254, 17, 170, 221, 254, 17, 179, 221, + 254, 17, 174, 221, 254, 17, 182, 8, 6, 1, 41, 4, 217, 215, 26, 230, 210, + 8, 2, 1, 41, 4, 217, 215, 26, 230, 210, 8, 6, 1, 228, 97, 4, 217, 215, + 26, 230, 210, 8, 2, 1, 228, 97, 4, 217, 215, 26, 230, 210, 8, 6, 1, 124, + 4, 217, 215, 26, 230, 210, 8, 2, 1, 124, 4, 217, 215, 26, 230, 210, 8, 6, + 1, 234, 253, 4, 84, 219, 176, 63, 8, 2, 1, 234, 253, 4, 84, 219, 176, 63, + 8, 6, 1, 234, 253, 4, 84, 219, 176, 248, 84, 26, 230, 210, 8, 2, 1, 234, + 253, 4, 84, 219, 176, 248, 84, 26, 230, 210, 8, 6, 1, 234, 253, 4, 84, + 219, 176, 248, 84, 26, 251, 129, 8, 2, 1, 234, 253, 4, 84, 219, 176, 248, + 84, 26, 251, 129, 8, 6, 1, 185, 4, 84, 219, 176, 63, 8, 2, 1, 185, 4, 84, + 219, 176, 63, 8, 6, 1, 185, 4, 84, 219, 176, 248, 84, 26, 230, 210, 8, 2, + 1, 185, 4, 84, 219, 176, 248, 84, 26, 230, 210, 8, 6, 1, 185, 4, 84, 219, + 176, 248, 84, 26, 251, 129, 8, 2, 1, 185, 4, 84, 219, 176, 248, 84, 26, + 251, 129, 8, 6, 1, 206, 159, 4, 84, 219, 176, 63, 8, 2, 1, 206, 159, 4, + 84, 219, 176, 63, 8, 6, 1, 234, 253, 4, 242, 122, 26, 217, 214, 8, 2, 1, + 234, 253, 4, 242, 122, 26, 217, 214, 8, 6, 1, 234, 253, 4, 242, 122, 26, + 246, 207, 8, 2, 1, 234, 253, 4, 242, 122, 26, 246, 207, 8, 2, 1, 228, 97, + 4, 78, 95, 26, 251, 129, 8, 2, 1, 214, 168, 4, 199, 91, 58, 8, 6, 1, 41, + 4, 211, 244, 26, 251, 129, 8, 2, 1, 41, 4, 211, 244, 26, 251, 129, 8, 6, + 1, 41, 4, 211, 244, 26, 199, 90, 8, 2, 1, 41, 4, 211, 244, 26, 199, 90, + 8, 6, 1, 234, 253, 4, 211, 244, 26, 251, 129, 8, 2, 1, 234, 253, 4, 211, + 244, 26, 251, 129, 8, 6, 1, 234, 253, 4, 211, 244, 26, 199, 90, 8, 2, 1, + 234, 253, 4, 211, 244, 26, 199, 90, 8, 6, 1, 234, 253, 4, 78, 95, 26, + 251, 129, 8, 2, 1, 234, 253, 4, 78, 95, 26, 251, 129, 8, 6, 1, 234, 253, + 4, 78, 95, 26, 199, 90, 8, 2, 1, 234, 253, 4, 78, 95, 26, 199, 90, 8, 2, + 1, 228, 97, 4, 78, 95, 26, 230, 210, 8, 2, 1, 228, 97, 4, 78, 95, 26, + 199, 90, 8, 6, 1, 228, 97, 4, 211, 244, 26, 251, 129, 8, 2, 1, 228, 97, + 4, 211, 244, 26, 78, 95, 26, 251, 129, 8, 6, 1, 228, 97, 4, 211, 244, 26, + 199, 90, 8, 2, 1, 228, 97, 4, 211, 244, 26, 78, 95, 26, 199, 90, 8, 6, 1, + 223, 66, 4, 199, 90, 8, 2, 1, 223, 66, 4, 78, 95, 26, 199, 90, 8, 6, 1, + 220, 202, 4, 199, 90, 8, 2, 1, 220, 202, 4, 199, 90, 8, 6, 1, 218, 237, + 4, 199, 90, 8, 2, 1, 218, 237, 4, 199, 90, 8, 6, 1, 208, 112, 4, 199, 90, + 8, 2, 1, 208, 112, 4, 199, 90, 8, 6, 1, 124, 4, 211, 244, 26, 251, 129, + 8, 2, 1, 124, 4, 211, 244, 26, 251, 129, 8, 6, 1, 124, 4, 211, 244, 26, + 199, 90, 8, 2, 1, 124, 4, 211, 244, 26, 199, 90, 8, 6, 1, 124, 4, 217, + 215, 26, 251, 129, 8, 2, 1, 124, 4, 217, 215, 26, 251, 129, 8, 6, 1, 124, + 4, 217, 215, 26, 199, 90, 8, 2, 1, 124, 4, 217, 215, 26, 199, 90, 8, 2, + 1, 251, 109, 4, 230, 210, 8, 2, 1, 211, 184, 185, 4, 230, 210, 8, 2, 1, + 211, 184, 185, 4, 251, 129, 8, 2, 1, 163, 196, 237, 4, 230, 210, 8, 2, 1, + 163, 196, 237, 4, 251, 129, 8, 2, 1, 205, 241, 4, 230, 210, 8, 2, 1, 205, + 241, 4, 251, 129, 8, 2, 1, 229, 14, 205, 241, 4, 230, 210, 8, 2, 1, 229, + 14, 205, 241, 4, 251, 129, 9, 204, 162, 97, 4, 230, 67, 95, 4, 251, 26, + 9, 204, 162, 97, 4, 230, 67, 95, 4, 194, 119, 9, 204, 162, 97, 4, 230, + 67, 95, 4, 157, 217, 168, 9, 204, 162, 97, 4, 230, 67, 95, 4, 212, 0, 9, + 204, 162, 97, 4, 230, 67, 95, 4, 68, 9, 204, 162, 97, 4, 230, 67, 95, 4, + 192, 214, 9, 204, 162, 97, 4, 230, 67, 95, 4, 71, 9, 204, 162, 97, 4, + 230, 67, 95, 4, 251, 108, 9, 204, 162, 213, 124, 4, 222, 39, 248, 76, 1, + 221, 224, 44, 116, 222, 184, 44, 116, 214, 167, 44, 116, 247, 52, 44, + 116, 212, 203, 44, 116, 198, 86, 44, 116, 213, 179, 44, 116, 200, 228, + 44, 116, 215, 151, 44, 116, 211, 93, 44, 116, 218, 236, 44, 116, 193, + 148, 44, 116, 150, 44, 116, 165, 44, 116, 196, 236, 44, 116, 219, 127, + 44, 116, 219, 138, 44, 116, 207, 4, 44, 116, 213, 161, 44, 116, 223, 65, + 44, 116, 204, 66, 44, 116, 202, 95, 44, 116, 206, 158, 44, 116, 230, 124, + 44, 116, 221, 48, 44, 5, 222, 159, 44, 5, 221, 204, 44, 5, 221, 183, 44, + 5, 221, 33, 44, 5, 220, 246, 44, 5, 222, 57, 44, 5, 222, 48, 44, 5, 222, + 135, 44, 5, 221, 113, 44, 5, 221, 88, 44, 5, 222, 76, 44, 5, 214, 164, + 44, 5, 214, 113, 44, 5, 214, 109, 44, 5, 214, 78, 44, 5, 214, 69, 44, 5, + 214, 152, 44, 5, 214, 150, 44, 5, 214, 161, 44, 5, 214, 90, 44, 5, 214, + 85, 44, 5, 214, 154, 44, 5, 247, 18, 44, 5, 242, 149, 44, 5, 242, 139, + 44, 5, 238, 162, 44, 5, 238, 120, 44, 5, 246, 158, 44, 5, 246, 150, 44, + 5, 247, 7, 44, 5, 242, 63, 44, 5, 238, 239, 44, 5, 246, 191, 44, 5, 212, + 200, 44, 5, 212, 181, 44, 5, 212, 175, 44, 5, 212, 158, 44, 5, 212, 150, + 44, 5, 212, 190, 44, 5, 212, 189, 44, 5, 212, 197, 44, 5, 212, 165, 44, + 5, 212, 162, 44, 5, 212, 193, 44, 5, 198, 82, 44, 5, 198, 62, 44, 5, 198, + 61, 44, 5, 198, 50, 44, 5, 198, 47, 44, 5, 198, 78, 44, 5, 198, 77, 44, + 5, 198, 81, 44, 5, 198, 60, 44, 5, 198, 59, 44, 5, 198, 80, 44, 5, 213, + 177, 44, 5, 213, 163, 44, 5, 213, 162, 44, 5, 213, 146, 44, 5, 213, 145, + 44, 5, 213, 173, 44, 5, 213, 172, 44, 5, 213, 176, 44, 5, 213, 148, 44, + 5, 213, 147, 44, 5, 213, 175, 44, 5, 200, 174, 44, 5, 199, 128, 44, 5, + 199, 105, 44, 5, 198, 45, 44, 5, 198, 0, 44, 5, 200, 79, 44, 5, 200, 56, + 44, 5, 200, 149, 44, 5, 155, 44, 5, 198, 254, 44, 5, 200, 100, 44, 5, + 215, 84, 44, 5, 214, 60, 44, 5, 214, 27, 44, 5, 213, 22, 44, 5, 212, 215, + 44, 5, 214, 214, 44, 5, 214, 203, 44, 5, 215, 70, 44, 5, 213, 142, 44, 5, + 213, 125, 44, 5, 215, 42, 44, 5, 211, 77, 44, 5, 210, 51, 44, 5, 210, 12, + 44, 5, 209, 51, 44, 5, 209, 15, 44, 5, 210, 181, 44, 5, 210, 168, 44, 5, + 211, 55, 44, 5, 209, 198, 44, 5, 209, 172, 44, 5, 210, 197, 44, 5, 217, + 219, 44, 5, 216, 175, 44, 5, 216, 137, 44, 5, 215, 241, 44, 5, 215, 181, + 44, 5, 217, 48, 44, 5, 217, 29, 44, 5, 217, 180, 44, 5, 216, 91, 44, 5, + 216, 35, 44, 5, 217, 96, 44, 5, 193, 129, 44, 5, 193, 22, 44, 5, 193, 12, + 44, 5, 192, 214, 44, 5, 192, 177, 44, 5, 193, 69, 44, 5, 193, 66, 44, 5, + 193, 108, 44, 5, 193, 1, 44, 5, 192, 235, 44, 5, 193, 80, 44, 5, 208, 68, + 44, 5, 207, 151, 44, 5, 207, 88, 44, 5, 206, 218, 44, 5, 206, 179, 44, 5, + 208, 7, 44, 5, 207, 234, 44, 5, 208, 48, 44, 5, 207, 55, 44, 5, 207, 28, + 44, 5, 208, 17, 44, 5, 220, 184, 44, 5, 219, 209, 44, 5, 219, 191, 44, 5, + 219, 36, 44, 5, 219, 6, 44, 5, 220, 42, 44, 5, 220, 32, 44, 5, 220, 155, + 44, 5, 219, 107, 44, 5, 219, 73, 44, 5, 220, 60, 44, 5, 196, 156, 44, 5, + 196, 39, 44, 5, 196, 22, 44, 5, 194, 223, 44, 5, 194, 215, 44, 5, 196, + 123, 44, 5, 196, 118, 44, 5, 196, 152, 44, 5, 195, 252, 44, 5, 195, 236, + 44, 5, 196, 129, 44, 5, 219, 125, 44, 5, 219, 120, 44, 5, 219, 119, 44, + 5, 219, 116, 44, 5, 219, 115, 44, 5, 219, 122, 44, 5, 219, 121, 44, 5, + 219, 124, 44, 5, 219, 118, 44, 5, 219, 117, 44, 5, 219, 123, 44, 5, 219, + 136, 44, 5, 219, 129, 44, 5, 219, 128, 44, 5, 219, 112, 44, 5, 219, 111, + 44, 5, 219, 132, 44, 5, 219, 131, 44, 5, 219, 135, 44, 5, 219, 114, 44, + 5, 219, 113, 44, 5, 219, 133, 44, 5, 207, 2, 44, 5, 206, 247, 44, 5, 206, + 246, 44, 5, 206, 239, 44, 5, 206, 232, 44, 5, 206, 254, 44, 5, 206, 253, + 44, 5, 207, 1, 44, 5, 206, 245, 44, 5, 206, 244, 44, 5, 207, 0, 44, 5, + 213, 159, 44, 5, 213, 154, 44, 5, 213, 153, 44, 5, 213, 150, 44, 5, 213, + 149, 44, 5, 213, 156, 44, 5, 213, 155, 44, 5, 213, 158, 44, 5, 213, 152, + 44, 5, 213, 151, 44, 5, 213, 157, 44, 5, 223, 61, 44, 5, 223, 20, 44, 5, + 223, 12, 44, 5, 222, 214, 44, 5, 222, 194, 44, 5, 223, 41, 44, 5, 223, + 39, 44, 5, 223, 55, 44, 5, 222, 233, 44, 5, 222, 223, 44, 5, 223, 48, 44, + 5, 204, 59, 44, 5, 203, 236, 44, 5, 203, 231, 44, 5, 203, 164, 44, 5, + 203, 146, 44, 5, 204, 12, 44, 5, 204, 10, 44, 5, 204, 47, 44, 5, 203, + 211, 44, 5, 203, 203, 44, 5, 204, 21, 44, 5, 202, 91, 44, 5, 202, 59, 44, + 5, 202, 55, 44, 5, 202, 46, 44, 5, 202, 43, 44, 5, 202, 65, 44, 5, 202, + 64, 44, 5, 202, 90, 44, 5, 202, 51, 44, 5, 202, 50, 44, 5, 202, 67, 44, + 5, 206, 91, 44, 5, 203, 125, 44, 5, 203, 97, 44, 5, 201, 184, 44, 5, 201, + 86, 44, 5, 205, 223, 44, 5, 205, 205, 44, 5, 206, 75, 44, 5, 202, 212, + 44, 5, 202, 183, 44, 5, 206, 12, 44, 5, 230, 99, 44, 5, 229, 178, 44, 5, + 229, 150, 44, 5, 228, 181, 44, 5, 228, 150, 44, 5, 229, 255, 44, 5, 229, + 225, 44, 5, 230, 88, 44, 5, 229, 43, 44, 5, 229, 16, 44, 5, 230, 11, 44, + 5, 221, 47, 44, 5, 221, 46, 44, 5, 221, 41, 44, 5, 221, 40, 44, 5, 221, + 37, 44, 5, 221, 36, 44, 5, 221, 43, 44, 5, 221, 42, 44, 5, 221, 45, 44, + 5, 221, 39, 44, 5, 221, 38, 44, 5, 221, 44, 44, 5, 203, 171, 159, 116, 3, + 193, 94, 159, 116, 3, 208, 36, 159, 116, 3, 207, 200, 98, 1, 197, 175, + 93, 116, 3, 242, 55, 160, 93, 116, 3, 242, 55, 221, 250, 93, 116, 3, 242, + 55, 221, 113, 93, 116, 3, 242, 55, 221, 220, 93, 116, 3, 242, 55, 214, + 90, 93, 116, 3, 242, 55, 247, 19, 93, 116, 3, 242, 55, 246, 117, 93, 116, + 3, 242, 55, 242, 63, 93, 116, 3, 242, 55, 242, 188, 93, 116, 3, 242, 55, + 212, 165, 93, 116, 3, 242, 55, 238, 0, 93, 116, 3, 242, 55, 198, 71, 93, + 116, 3, 242, 55, 236, 146, 93, 116, 3, 242, 55, 198, 66, 93, 116, 3, 242, + 55, 181, 93, 116, 3, 242, 55, 189, 93, 116, 3, 242, 55, 199, 240, 93, + 116, 3, 242, 55, 155, 93, 116, 3, 242, 55, 199, 176, 93, 116, 3, 242, 55, + 213, 142, 93, 116, 3, 242, 55, 249, 3, 93, 116, 3, 242, 55, 210, 94, 93, + 116, 3, 242, 55, 209, 198, 93, 116, 3, 242, 55, 210, 65, 93, 116, 3, 242, + 55, 216, 91, 93, 116, 3, 242, 55, 193, 1, 93, 116, 3, 242, 55, 207, 55, + 93, 116, 3, 242, 55, 219, 107, 93, 116, 3, 242, 55, 195, 252, 93, 116, 3, + 242, 55, 204, 64, 93, 116, 3, 242, 55, 202, 92, 93, 116, 3, 242, 55, 188, + 93, 116, 3, 242, 55, 144, 93, 116, 3, 242, 55, 177, 93, 18, 3, 242, 55, + 208, 239, 93, 223, 177, 18, 3, 242, 55, 208, 177, 93, 223, 177, 18, 3, + 242, 55, 206, 167, 93, 223, 177, 18, 3, 242, 55, 206, 160, 93, 223, 177, + 18, 3, 242, 55, 208, 219, 93, 18, 3, 211, 219, 93, 18, 3, 251, 250, 229, + 140, 1, 248, 34, 214, 165, 229, 140, 1, 248, 34, 214, 113, 229, 140, 1, + 248, 34, 214, 78, 229, 140, 1, 248, 34, 214, 152, 229, 140, 1, 248, 34, + 214, 90, 75, 1, 248, 34, 214, 165, 75, 1, 248, 34, 214, 113, 75, 1, 248, + 34, 214, 78, 75, 1, 248, 34, 214, 152, 75, 1, 248, 34, 214, 90, 75, 1, + 251, 55, 246, 158, 75, 1, 251, 55, 198, 45, 75, 1, 251, 55, 155, 75, 1, + 251, 55, 211, 93, 73, 1, 233, 188, 233, 187, 238, 247, 158, 161, 73, 1, + 233, 187, 233, 188, 238, 247, 158, 161, }; -static const unsigned short phrasebook_offset1[] = { +static const unsigned char phrasebook_offset1[] = { 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, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 105, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 130, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 104, 149, 150, 151, 152, 153, 154, 104, 155, 156, 157, 104, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 104, 169, 104, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 104, 179, 180, 104, 181, 182, - 183, 184, 104, 185, 186, 104, 187, 188, 189, 104, 104, 190, 191, 192, - 193, 104, 194, 104, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 216, 217, 218, 219, 220, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 221, 222, 223, 224, 225, - 226, 227, 228, 104, 104, 104, 104, 229, 230, 231, 232, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 233, 234, 235, 236, 237, 238, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 239, - 240, 241, 242, 243, 244, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 245, 246, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 247, 248, 249, 250, 251, 252, 253, - 104, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 268, 104, 269, - 104, 104, 270, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 271, - 272, 273, 104, 104, 104, 104, 104, 274, 275, 276, 104, 277, 278, 104, - 104, 279, 280, 281, 282, 283, 104, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 300, 301, 302, - 303, 304, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 305, 104, 306, 307, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 308, 309, 310, - 311, 312, 313, 314, 315, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 53, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 66, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 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, 52, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 111, + 112, 113, 114, 115, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 116, 117, 118, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 119, 120, 121, 122, 52, 52, 123, 124, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 125, 126, 127, 128, 129, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 130, 131, 132, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 133, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 52, 52, + 52, 52, 52, 145, 146, 147, 52, 52, 52, 52, 52, 148, 149, 52, 52, 150, + 151, 152, 52, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 165, 166, 167, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 168, + 169, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 170, 171, 172, 173, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, }; static const unsigned int phrasebook_offset2[] = { @@ -19711,1221 +20273,1222 @@ static const unsigned int phrasebook_offset2[] = { 339, 344, 349, 353, 356, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 366, 371, 374, 377, 380, 383, 386, 389, 391, 394, 400, 408, 411, 415, 418, 420, - 423, 426, 429, 432, 436, 439, 442, 445, 447, 450, 456, 464, 470, 476, - 482, 487, 494, 500, 507, 514, 521, 529, 534, 542, 550, 557, 565, 573, - 581, 588, 596, 604, 609, 617, 624, 630, 637, 644, 651, 654, 660, 667, - 673, 680, 687, 694, 699, 706, 713, 719, 726, 733, 740, 748, 753, 761, - 769, 776, 784, 792, 800, 807, 815, 823, 828, 836, 843, 849, 856, 863, - 870, 873, 879, 886, 892, 899, 906, 913, 918, 926, 933, 940, 947, 954, - 961, 968, 975, 982, 990, 998, 1006, 1014, 1022, 1030, 1038, 1046, 1053, - 1060, 1068, 1076, 1084, 1092, 1100, 1108, 1116, 1124, 1132, 1140, 1148, - 1156, 1164, 1172, 1180, 1188, 1196, 1204, 1212, 1220, 1227, 1234, 1242, - 1250, 1258, 1266, 1274, 1282, 1290, 1298, 1306, 1312, 1317, 1322, 1330, - 1338, 1346, 1354, 1359, 1366, 1373, 1381, 1389, 1397, 1405, 1414, 1423, - 1430, 1437, 1444, 1451, 1459, 1467, 1475, 1483, 1494, 1499, 1504, 1511, - 1518, 1525, 1532, 1539, 1546, 1551, 1556, 1563, 1570, 1578, 1586, 1594, - 1602, 1609, 1616, 1624, 1632, 1640, 1648, 1656, 1664, 1672, 1680, 1688, - 1696, 1703, 1710, 1717, 1724, 1731, 1738, 1745, 1752, 1760, 1768, 1775, - 1782, 1789, 1796, 1804, 1812, 1820, 1828, 1836, 1843, 1850, 1858, 1866, - 1874, 1882, 1888, 1894, 1900, 1907, 1914, 1919, 1924, 1929, 1936, 1943, - 1950, 1957, 1965, 1973, 1979, 1985, 1990, 1995, 2002, 2009, 2016, 2021, - 2026, 2031, 2038, 2045, 2052, 2059, 2066, 2072, 2080, 2090, 2098, 2105, - 2112, 2117, 2122, 2129, 2136, 2140, 2145, 2150, 2155, 2163, 2172, 2179, - 2186, 2195, 2202, 2209, 2214, 2221, 2228, 2235, 2242, 2249, 2254, 2261, - 2268, 2276, 2281, 2286, 2291, 2301, 2305, 2311, 2317, 2323, 2329, 2337, - 2350, 2358, 2363, 2373, 2378, 2383, 2393, 2398, 2405, 2412, 2420, 2428, - 2435, 2442, 2449, 2456, 2466, 2476, 2485, 2494, 2504, 2514, 2524, 2534, - 2539, 2549, 2559, 2569, 2579, 2587, 2595, 2602, 2609, 2617, 2625, 2633, - 2641, 2648, 2655, 2665, 2675, 2683, 2691, 2699, 2704, 2714, 2719, 2726, - 2733, 2738, 2743, 2751, 2759, 2769, 2779, 2786, 2793, 2802, 2811, 2819, - 2827, 2836, 2845, 2854, 2863, 2873, 2883, 2892, 2901, 2911, 2921, 2929, - 2937, 2946, 2955, 2964, 2973, 2983, 2993, 3001, 3009, 3018, 3027, 3036, - 3045, 3054, 3063, 3068, 3073, 3081, 3089, 3099, 3107, 3112, 3117, 3124, - 3131, 3138, 3145, 3153, 3161, 3171, 3181, 3191, 3201, 3208, 3215, 3225, - 3235, 3243, 3251, 3259, 3267, 3275, 3282, 3289, 3296, 3302, 3309, 3316, - 3323, 3332, 3342, 3352, 3359, 3366, 3372, 3377, 3383, 3390, 3397, 3404, - 3411, 3422, 3432, 3439, 3446, 3453, 3460, 3465, 3470, 3476, 3482, 3487, - 3495, 3503, 3510, 3516, 3521, 3528, 3533, 3540, 3550, 3559, 3568, 3575, - 3581, 3587, 3592, 3599, 3605, 3612, 3619, 3626, 3631, 3636, 3645, 3653, - 3662, 3667, 3673, 3683, 3690, 3698, 3707, 3713, 3719, 3725, 3732, 3737, - 3742, 3752, 3760, 3769, 3777, 3785, 3795, 3800, 3807, 3814, 3819, 3831, - 3840, 3848, 3854, 3863, 3868, 3873, 3880, 3886, 3892, 3898, 3904, 3913, - 3921, 3926, 3934, 3940, 3948, 3956, 3962, 3968, 3974, 3981, 3989, 3995, - 4003, 4009, 4014, 4021, 4029, 4039, 4046, 4053, 4063, 4070, 4077, 4087, - 4094, 4101, 4108, 4114, 4120, 4129, 4141, 4146, 4153, 4158, 4162, 4167, - 4175, 4182, 4187, 4192, 4196, 4201, 4206, 4210, 4216, 4222, 4228, 4234, - 4242, 4247, 4252, 4257, 4262, 4268, 4270, 4275, 4279, 4285, 4291, 4297, - 4302, 4309, 4316, 4322, 4329, 4337, 4345, 4350, 4355, 4359, 4364, 4366, - 4368, 4371, 4373, 4376, 4381, 4386, 4392, 4397, 4401, 4406, 4411, 4420, - 4426, 4431, 4437, 4442, 4448, 4456, 4464, 4468, 4472, 4477, 4483, 4489, - 4495, 4501, 4506, 4513, 4521, 4529, 4534, 4540, 4547, 4554, 4561, 4568, - 4572, 4577, 4582, 4587, 4592, 4597, 4600, 4603, 4606, 4609, 4612, 4615, - 4619, 4623, 4629, 4632, 4637, 4643, 4649, 4652, 4657, 4662, 4666, 4672, - 4678, 4684, 4690, 4695, 4700, 4705, 4708, 4714, 4719, 4724, 4728, 4733, - 4739, 4745, 4748, 4752, 4756, 4760, 4763, 4766, 4771, 4775, 4782, 4786, - 4792, 4796, 4802, 4806, 4810, 4814, 4819, 4824, 4831, 4837, 4844, 4850, - 4856, 4862, 4865, 4869, 4873, 4877, 4881, 4886, 4891, 4895, 4899, 4905, - 4909, 4913, 4918, 4924, 4929, 4935, 4939, 4946, 4951, 4956, 4961, 4966, - 4972, 4975, 4979, 4984, 4989, 4998, 5004, 5009, 5013, 5018, 5022, 5027, - 5031, 5035, 5040, 5044, 5050, 5055, 5060, 5065, 5070, 5075, 5080, 5086, - 5092, 5098, 5104, 5109, 5115, 5121, 5127, 5132, 5137, 5144, 5151, 5155, - 5161, 5168, 0, 0, 5175, 5178, 5187, 5196, 5207, 5211, 0, 0, 0, 0, 5216, - 5219, 5224, 5232, 5237, 5245, 5253, 0, 5261, 0, 5269, 5277, 5285, 5296, - 5301, 5306, 5311, 5316, 5321, 5326, 5331, 5336, 5341, 5346, 5351, 5356, - 5361, 5366, 5371, 5376, 0, 5381, 5386, 5391, 5396, 5401, 5406, 5411, - 5416, 5424, 5432, 5440, 5448, 5456, 5464, 5475, 5480, 5485, 5490, 5495, - 5500, 5505, 5510, 5515, 5520, 5525, 5530, 5535, 5540, 5545, 5550, 5555, - 5560, 5566, 5571, 5576, 5581, 5586, 5591, 5596, 5601, 5609, 5617, 5625, - 5633, 5641, 5646, 5650, 5654, 5661, 5671, 5681, 5685, 5689, 5693, 5699, - 5706, 5710, 5715, 5719, 5724, 5728, 5733, 5737, 5742, 5747, 5752, 5757, - 5762, 5767, 5772, 5777, 5782, 5787, 5792, 5797, 5802, 5807, 5812, 5816, - 5820, 5826, 5830, 5835, 5841, 5849, 5854, 5859, 5866, 5871, 5876, 5883, - 5892, 5901, 5912, 5920, 5925, 5930, 5935, 5942, 5947, 5953, 5958, 5963, - 5968, 5973, 5978, 5983, 5991, 5997, 6002, 6006, 6011, 6016, 6021, 6026, - 6031, 6036, 6041, 6045, 6051, 6055, 6060, 6065, 6070, 6074, 6079, 6084, - 6089, 6094, 6098, 6103, 6107, 6112, 6117, 6122, 6127, 6133, 6138, 6144, - 6148, 6153, 6157, 6161, 6166, 6171, 6176, 6181, 6186, 6191, 6196, 6200, - 6206, 6210, 6215, 6220, 6225, 6229, 6234, 6239, 6244, 6249, 6253, 6258, - 6262, 6267, 6272, 6277, 6282, 6288, 6293, 6299, 6303, 6308, 6312, 6320, - 6325, 6330, 6335, 6342, 6347, 6353, 6358, 6363, 6368, 6373, 6378, 6383, - 6391, 6397, 6402, 6407, 6412, 6417, 6422, 6428, 6434, 6441, 6448, 6457, - 6466, 6473, 6480, 6489, 6498, 6503, 6508, 6513, 6518, 6523, 6528, 6533, - 6538, 6549, 6560, 6565, 6570, 6577, 6584, 6592, 6600, 6605, 6610, 6615, - 6620, 6624, 6628, 6632, 6638, 6644, 6648, 6655, 6660, 6670, 6680, 6686, - 6692, 6700, 6708, 6716, 6724, 6731, 6738, 6746, 6754, 6762, 6770, 6778, - 6786, 6794, 6802, 6810, 6818, 6825, 6832, 6838, 6844, 6852, 6860, 6867, - 6874, 6882, 6890, 6896, 6902, 6910, 6918, 6926, 6934, 6940, 6946, 6954, - 6962, 6970, 6978, 6985, 6992, 7000, 7008, 7016, 7024, 7029, 7034, 7041, - 7048, 7058, 7068, 7072, 7080, 7088, 7095, 7102, 7110, 7118, 7125, 7132, - 7140, 7148, 7155, 7162, 7170, 7178, 7183, 7190, 7197, 7204, 7211, 7217, - 7223, 7231, 7239, 7244, 7249, 7257, 7265, 7273, 7281, 7289, 7297, 7304, - 7311, 7319, 7327, 7335, 7343, 7350, 7357, 7363, 7369, 7378, 7387, 7395, - 7403, 7410, 7417, 7424, 7431, 7438, 7445, 7453, 7461, 7469, 7477, 7485, - 7493, 7503, 7513, 7520, 7527, 7534, 7541, 7548, 7555, 7562, 7569, 7576, - 7583, 7590, 7597, 7604, 7611, 7618, 7625, 7632, 7639, 7646, 7653, 7660, - 7667, 7674, 7681, 7686, 7691, 7696, 7701, 7706, 7711, 7716, 7721, 7726, - 7731, 7737, 7743, 7751, 7759, 7767, 7775, 7783, 7791, 7799, 7807, 7815, - 7823, 7828, 7833, 7838, 7843, 7851, 0, 7859, 7865, 7871, 7877, 7883, - 7889, 7895, 7901, 7907, 7912, 7918, 7924, 7930, 7936, 7942, 7948, 7954, - 7960, 7966, 7972, 7978, 7984, 7990, 7996, 8002, 8008, 8014, 8020, 8025, - 8031, 8037, 8043, 8049, 8055, 8061, 8067, 8073, 8079, 0, 0, 8085, 8093, - 8097, 8102, 8107, 8111, 8116, 8121, 8128, 8134, 8140, 8146, 8152, 8158, - 8164, 8170, 8176, 8181, 8187, 8193, 8199, 8205, 8211, 8217, 8223, 8229, - 8235, 8241, 8247, 8253, 8259, 8265, 8271, 8277, 8283, 8289, 8294, 8300, - 8306, 8312, 8318, 8324, 8330, 8336, 8342, 8348, 8354, 8362, 8369, 8375, - 0, 0, 8379, 8386, 8393, 0, 8398, 8403, 8408, 8413, 8420, 8427, 8432, - 8437, 8442, 8447, 8452, 8457, 8462, 8469, 8474, 8481, 8488, 8493, 8500, - 8505, 8510, 8515, 8522, 8527, 8532, 8539, 8548, 8553, 8558, 8563, 8568, - 8574, 8579, 8586, 8593, 8600, 8605, 8610, 8615, 8620, 8625, 8630, 8640, - 8645, 8654, 8659, 8664, 8669, 8674, 8681, 8688, 8695, 8701, 8707, 8714, - 0, 0, 0, 0, 0, 0, 0, 0, 8721, 8725, 8729, 8733, 8737, 8741, 8745, 8749, - 8753, 8757, 8761, 8766, 8770, 8774, 8779, 8783, 8788, 8792, 8796, 8800, - 8805, 8809, 8814, 8818, 8822, 8826, 8830, 0, 0, 0, 0, 8834, 8839, 8846, - 8854, 8861, 8866, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8871, 8874, 8878, - 8883, 8887, 8891, 8895, 8901, 8907, 8910, 8917, 8926, 8929, 8932, 8937, - 8943, 8947, 8955, 8961, 8967, 8975, 8979, 8984, 8995, 9000, 9004, 9008, - 9012, 9015, 0, 9018, 9025, 9029, 9035, 9039, 9046, 9053, 9061, 9068, - 9075, 9079, 9083, 9089, 9093, 9097, 9101, 9105, 9109, 9113, 9117, 9121, - 9125, 9129, 9133, 9137, 9141, 9145, 9149, 9153, 9157, 9166, 9175, 9185, - 9195, 9205, 9208, 9212, 9216, 9220, 9224, 9228, 9232, 9236, 9240, 9245, - 9249, 9252, 9255, 9258, 9261, 9264, 9267, 9270, 9273, 9277, 9281, 9285, - 9290, 9295, 9301, 9304, 9311, 9320, 9325, 9330, 9337, 9343, 9348, 9352, - 9356, 9360, 9364, 9368, 9372, 9376, 9380, 9384, 9388, 9393, 9398, 9405, - 9411, 9417, 9423, 9428, 9437, 9446, 9451, 9458, 9465, 9472, 9479, 9483, - 9487, 9491, 9498, 9509, 9513, 9517, 9521, 9528, 9537, 9541, 9545, 9553, - 9557, 9561, 9565, 9572, 9579, 9591, 9595, 9599, 9603, 9614, 9624, 9628, - 9636, 9643, 9650, 9659, 9670, 9679, 9683, 9693, 9704, 9713, 9728, 9737, - 9746, 9755, 9764, 9770, 9779, 9786, 9790, 9799, 9803, 9810, 9819, 9823, - 9829, 9836, 9843, 9847, 9856, 9860, 9867, 9871, 9880, 9884, 9893, 9901, - 9908, 9917, 9926, 9933, 9939, 9943, 9950, 9959, 9965, 9972, 9979, 9985, - 9995, 10003, 10010, 10016, 10020, 10023, 10027, 10033, 10042, 10046, - 10052, 10058, 10065, 10072, 10075, 10083, 10088, 10097, 10102, 10106, - 10119, 10132, 10138, 10145, 10150, 10156, 10161, 10167, 10177, 10184, - 10193, 10203, 10209, 10214, 10219, 10223, 10227, 10232, 10237, 10243, - 10251, 10259, 10270, 10275, 10284, 10293, 10300, 10306, 10312, 10318, - 10324, 10330, 10336, 10342, 10348, 10354, 10361, 10368, 10375, 10381, - 10389, 10398, 10405, 10413, 10421, 10427, 10433, 10439, 10447, 10455, - 10465, 10475, 10479, 10485, 10491, 0, 10497, 10502, 10507, 10514, 10519, - 10524, 10531, 10536, 10545, 10550, 10555, 10560, 10565, 10570, 10577, - 10582, 10589, 10594, 10599, 10604, 10609, 10614, 10620, 10624, 10629, - 10636, 10641, 10646, 10651, 10656, 10661, 10668, 10675, 10682, 10687, - 10692, 10698, 10703, 10708, 10714, 10719, 10724, 10732, 10740, 10745, - 10750, 10756, 10761, 10766, 10770, 10776, 10780, 10784, 10791, 10798, - 10804, 10810, 10817, 10824, 10828, 0, 0, 10832, 10839, 10846, 10853, - 10864, 10877, 10890, 10909, 10922, 10933, 10941, 10949, 10961, 10977, - 10988, 10994, 11004, 11013, 11026, 11037, 11046, 11059, 11066, 11075, - 11088, 11094, 11100, 11109, 11117, 11125, 11131, 11142, 11150, 11161, - 11171, 11184, 11198, 11212, 11222, 11233, 11244, 11257, 11270, 11284, - 11296, 11308, 11321, 11334, 11346, 11359, 11368, 11377, 11382, 11387, - 11392, 11397, 11402, 11407, 11412, 11417, 11422, 11427, 11432, 11437, - 11442, 11447, 11452, 11457, 11462, 11467, 11472, 11477, 11482, 11487, - 11492, 11497, 11502, 11507, 11512, 11517, 11522, 11527, 11532, 11537, - 11541, 11546, 11551, 11556, 11561, 11566, 11570, 11574, 11578, 11582, - 11586, 11590, 11594, 11598, 11602, 11606, 11610, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 11615, 11620, 11624, 11628, 11632, 11636, 11640, 11644, - 11648, 11652, 11656, 11660, 11665, 11669, 11673, 11677, 11682, 11686, - 11691, 11696, 11701, 11705, 11709, 11714, 11719, 11724, 11728, 11733, - 11737, 11742, 11747, 11751, 11755, 11762, 11766, 11771, 11775, 11779, - 11784, 11788, 11795, 11802, 11809, 11815, 11823, 11831, 11840, 11848, - 11855, 11862, 11870, 11876, 11882, 11888, 11894, 11901, 11906, 11910, - 11915, 0, 0, 11919, 11923, 11928, 11933, 11938, 11943, 11948, 11953, - 11958, 11963, 11968, 11973, 11978, 11983, 11988, 11993, 11998, 12003, - 12008, 12013, 12018, 12023, 12028, 12033, 12038, 12043, 12048, 12053, - 12058, 12063, 12071, 12078, 12084, 12089, 12097, 12104, 12110, 12117, - 12123, 12128, 12135, 12142, 12148, 12153, 12158, 12164, 12169, 12174, - 12180, 0, 0, 12185, 12191, 12197, 12203, 12209, 12215, 12221, 12226, - 12234, 12240, 12246, 12252, 12258, 12264, 12272, 0, 12278, 12283, 12288, - 12293, 12298, 12303, 12308, 12313, 12318, 12323, 12328, 12333, 12338, - 12343, 12348, 12353, 12358, 12363, 12368, 12373, 12378, 12383, 12388, - 12393, 12398, 12403, 12408, 12413, 0, 0, 12418, 0, 12422, 12428, 12434, - 12440, 12446, 12452, 12458, 12464, 12469, 12475, 12481, 0, 0, 0, 0, 0, 0, + 423, 426, 429, 432, 436, 439, 442, 445, 447, 450, 456, 464, 471, 478, + 485, 490, 497, 504, 511, 518, 525, 533, 538, 546, 554, 562, 570, 578, + 586, 594, 602, 610, 615, 623, 630, 637, 644, 651, 658, 661, 667, 674, + 681, 688, 695, 703, 708, 715, 722, 729, 736, 743, 750, 758, 763, 771, + 779, 787, 795, 803, 811, 819, 827, 835, 840, 848, 855, 862, 869, 876, + 883, 886, 892, 899, 906, 913, 920, 928, 933, 941, 948, 955, 962, 969, + 976, 983, 991, 999, 1007, 1015, 1023, 1031, 1039, 1047, 1055, 1063, 1070, + 1077, 1085, 1093, 1101, 1109, 1117, 1125, 1133, 1141, 1149, 1157, 1165, + 1173, 1181, 1189, 1197, 1205, 1213, 1221, 1229, 1237, 1244, 1251, 1259, + 1267, 1275, 1283, 1291, 1299, 1307, 1315, 1323, 1329, 1334, 1339, 1347, + 1355, 1363, 1371, 1376, 1384, 1392, 1400, 1408, 1416, 1424, 1433, 1442, + 1449, 1456, 1464, 1472, 1480, 1488, 1496, 1504, 1515, 1520, 1525, 1532, + 1539, 1546, 1553, 1561, 1569, 1574, 1579, 1587, 1595, 1603, 1611, 1619, + 1627, 1635, 1643, 1651, 1659, 1667, 1675, 1683, 1691, 1699, 1707, 1715, + 1723, 1730, 1737, 1744, 1751, 1758, 1765, 1772, 1779, 1787, 1795, 1803, + 1811, 1818, 1825, 1833, 1841, 1849, 1857, 1865, 1873, 1881, 1889, 1897, + 1905, 1913, 1919, 1925, 1931, 1938, 1945, 1950, 1955, 1961, 1968, 1975, + 1982, 1989, 1997, 2005, 2011, 2017, 2022, 2028, 2035, 2042, 2049, 2054, + 2059, 2064, 2071, 2078, 2085, 2092, 2099, 2105, 2113, 2123, 2131, 2138, + 2145, 2150, 2155, 2162, 2169, 2173, 2178, 2183, 2188, 2196, 2205, 2212, + 2219, 2228, 2235, 2242, 2247, 2254, 2261, 2268, 2275, 2282, 2287, 2294, + 2301, 2309, 2314, 2319, 2324, 2334, 2338, 2344, 2350, 2356, 2362, 2370, + 2383, 2391, 2396, 2406, 2411, 2416, 2426, 2431, 2438, 2445, 2453, 2461, + 2468, 2475, 2482, 2489, 2499, 2509, 2519, 2529, 2539, 2549, 2559, 2569, + 2574, 2584, 2594, 2604, 2614, 2622, 2630, 2637, 2644, 2652, 2660, 2668, + 2676, 2683, 2690, 2700, 2710, 2718, 2726, 2734, 2739, 2749, 2754, 2762, + 2770, 2775, 2780, 2788, 2796, 2807, 2818, 2826, 2834, 2844, 2854, 2862, + 2870, 2879, 2888, 2897, 2906, 2916, 2926, 2935, 2944, 2954, 2964, 2972, + 2980, 2989, 2998, 3007, 3016, 3026, 3036, 3044, 3052, 3061, 3070, 3079, + 3088, 3097, 3106, 3111, 3116, 3124, 3132, 3142, 3150, 3155, 3160, 3167, + 3174, 3181, 3188, 3196, 3204, 3214, 3224, 3234, 3244, 3251, 3258, 3268, + 3278, 3286, 3294, 3302, 3310, 3318, 3325, 3332, 3339, 3345, 3352, 3359, + 3366, 3375, 3385, 3395, 3402, 3409, 3415, 3420, 3426, 3433, 3440, 3447, + 3454, 3465, 3475, 3482, 3489, 3496, 3503, 3508, 3513, 3519, 3525, 3531, + 3539, 3547, 3554, 3560, 3565, 3572, 3578, 3586, 3597, 3607, 3616, 3623, + 3629, 3635, 3640, 3647, 3653, 3660, 3667, 3674, 3679, 3684, 3693, 3701, + 3710, 3715, 3721, 3731, 3738, 3746, 3755, 3761, 3767, 3773, 3780, 3785, + 3790, 3800, 3808, 3817, 3825, 3833, 3843, 3848, 3855, 3862, 3867, 3879, + 3888, 3896, 3902, 3911, 3916, 3921, 3928, 3934, 3940, 3946, 3952, 3961, + 3969, 3974, 3982, 3988, 3996, 4004, 4010, 4016, 4022, 4030, 4038, 4044, + 4052, 4058, 4063, 4070, 4078, 4088, 4095, 4102, 4112, 4119, 4126, 4136, + 4143, 4150, 4157, 4163, 4169, 4178, 4190, 4195, 4202, 4207, 4211, 4216, + 4224, 4231, 4236, 4241, 4245, 4250, 4255, 4259, 4265, 4271, 4277, 4283, + 4291, 4296, 4301, 4306, 4311, 4317, 4319, 4324, 4328, 4334, 4340, 4346, + 4351, 4358, 4365, 4371, 4378, 4386, 4394, 4399, 4404, 4408, 4413, 4415, + 4417, 4420, 4422, 4425, 4430, 4435, 4441, 4446, 4450, 4455, 4460, 4469, + 4475, 4480, 4486, 4491, 4497, 4505, 4513, 4517, 4521, 4526, 4532, 4538, + 4544, 4550, 4555, 4562, 4570, 4578, 4583, 4589, 4596, 4603, 4610, 4617, + 4621, 4627, 4632, 4637, 4642, 4647, 4650, 4653, 4656, 4659, 4662, 4665, + 4669, 4673, 4679, 4682, 4687, 4693, 4699, 4702, 4707, 4712, 4716, 4722, + 4728, 4734, 4740, 4745, 4750, 4755, 4758, 4764, 4769, 4774, 4778, 4783, + 4789, 4795, 4798, 4802, 4806, 4810, 4813, 4816, 4821, 4825, 4832, 4836, + 4842, 4846, 4852, 4856, 4860, 4864, 4869, 4874, 4881, 4887, 4894, 4900, + 4906, 4912, 4915, 4919, 4923, 4927, 4931, 4936, 4941, 4945, 4949, 4955, + 4959, 4963, 4968, 4974, 4979, 4985, 4989, 4995, 5000, 5005, 5010, 5015, + 5021, 5024, 5028, 5033, 5038, 5047, 5053, 5058, 5062, 5067, 5071, 5076, + 5080, 5084, 5089, 5093, 5099, 5104, 5109, 5114, 5119, 5124, 5129, 5135, + 5141, 5147, 5153, 5158, 5164, 5170, 5176, 5181, 5186, 5193, 5200, 5204, + 5209, 5216, 0, 0, 5223, 5226, 5235, 5244, 5255, 5259, 0, 0, 0, 0, 5264, + 5267, 5272, 5280, 5285, 5293, 5301, 0, 5309, 0, 5317, 5325, 5333, 5344, + 5349, 5354, 5359, 5364, 5369, 5374, 5379, 5384, 5389, 5394, 5399, 5404, + 5409, 5414, 5419, 5424, 0, 5429, 5434, 5439, 5444, 5449, 5454, 5459, + 5464, 5472, 5480, 5488, 5496, 5504, 5512, 5523, 5528, 5533, 5538, 5543, + 5548, 5553, 5558, 5563, 5568, 5573, 5578, 5583, 5588, 5593, 5598, 5603, + 5608, 5614, 5619, 5624, 5629, 5634, 5639, 5644, 5649, 5657, 5665, 5673, + 5681, 5689, 5694, 5698, 5702, 5709, 5719, 5729, 5733, 5737, 5741, 5747, + 5754, 5758, 5763, 5767, 5772, 5776, 5781, 5785, 5790, 5795, 5800, 5805, + 5810, 5815, 5820, 5825, 5830, 5835, 5840, 5845, 5850, 5855, 5860, 5864, + 5868, 5874, 5878, 5883, 5889, 5897, 5902, 5907, 5914, 5919, 5924, 5931, + 5940, 5949, 5960, 5968, 5973, 5978, 5983, 5990, 5995, 6001, 6006, 6011, + 6016, 6021, 6026, 6031, 6039, 6045, 6050, 6054, 6059, 6064, 6069, 6074, + 6079, 6084, 6089, 6093, 6099, 6103, 6108, 6113, 6118, 6122, 6127, 6132, + 6137, 6142, 6146, 6151, 6155, 6160, 6165, 6170, 6175, 6181, 6186, 6192, + 6196, 6201, 6205, 6209, 6214, 6219, 6224, 6229, 6234, 6239, 6244, 6248, + 6254, 6258, 6263, 6268, 6273, 6277, 6282, 6287, 6292, 6297, 6301, 6306, + 6310, 6315, 6320, 6325, 6330, 6336, 6341, 6347, 6351, 6356, 6360, 6368, + 6373, 6378, 6383, 6390, 6395, 6401, 6406, 6411, 6416, 6421, 6426, 6431, + 6439, 6445, 6450, 6455, 6460, 6465, 6470, 6476, 6482, 6489, 6496, 6505, + 6514, 6521, 6528, 6537, 6546, 6551, 6556, 6561, 6566, 6571, 6576, 6581, + 6586, 6597, 6608, 6613, 6618, 6625, 6632, 6640, 6648, 6653, 6658, 6663, + 6668, 6672, 6676, 6680, 6686, 6692, 6696, 6703, 6708, 6718, 6728, 6734, + 6740, 6748, 6756, 6764, 6772, 6779, 6786, 6794, 6802, 6810, 6818, 6826, + 6834, 6842, 6850, 6858, 6866, 6873, 6880, 6886, 6892, 6900, 6908, 6915, + 6922, 6930, 6938, 6944, 6950, 6958, 6966, 6974, 6982, 6988, 6994, 7002, + 7010, 7018, 7026, 7033, 7040, 7048, 7056, 7064, 7072, 7077, 7082, 7089, + 7096, 7106, 7116, 7120, 7128, 7136, 7143, 7150, 7158, 7166, 7173, 7180, + 7188, 7196, 7203, 7210, 7218, 7226, 7231, 7238, 7245, 7252, 7259, 7265, + 7271, 7279, 7287, 7292, 7297, 7305, 7313, 7321, 7329, 7337, 7345, 7352, + 7359, 7367, 7375, 7383, 7391, 7398, 7405, 7411, 7417, 7426, 7435, 7443, + 7451, 7458, 7465, 7472, 7479, 7487, 7495, 7503, 7511, 7519, 7527, 7535, + 7543, 7553, 7563, 7570, 7577, 7584, 7591, 7598, 7605, 7612, 7619, 7626, + 7633, 7640, 7647, 7654, 7661, 7668, 7675, 7682, 7689, 7696, 7703, 7710, + 7717, 7724, 7731, 7736, 7741, 7746, 7751, 7756, 7761, 7766, 7771, 7776, + 7781, 7787, 7793, 7801, 7809, 7817, 7825, 7833, 7841, 7849, 7857, 7865, + 7873, 7878, 7883, 7888, 7893, 7901, 0, 7909, 7915, 7921, 7927, 7933, + 7939, 7945, 7951, 7957, 7962, 7968, 7974, 7980, 7986, 7992, 7998, 8004, + 8010, 8016, 8022, 8028, 8034, 8040, 8046, 8052, 8058, 8064, 8070, 8075, + 8081, 8087, 8093, 8099, 8105, 8111, 8117, 8123, 8129, 0, 0, 8135, 8143, + 8147, 8152, 8157, 8161, 8166, 8171, 8178, 8184, 8190, 8196, 8202, 8208, + 8214, 8220, 8226, 8231, 8237, 8243, 8249, 8255, 8261, 8267, 8273, 8279, + 8285, 8291, 8297, 8303, 8309, 8315, 8321, 8327, 8333, 8339, 8344, 8350, + 8356, 8362, 8368, 8374, 8380, 8386, 8392, 8398, 8404, 8412, 8419, 8425, + 0, 0, 8429, 8436, 8443, 0, 8448, 8453, 8458, 8463, 8470, 8477, 8482, + 8487, 8492, 8497, 8502, 8507, 8512, 8519, 8524, 8531, 8538, 8543, 8550, + 8555, 8560, 8565, 8572, 8577, 8582, 8589, 8598, 8603, 8608, 8613, 8618, + 8624, 8629, 8636, 8643, 8650, 8655, 8660, 8665, 8670, 8675, 8680, 8690, + 8695, 8704, 8709, 8714, 8719, 8724, 8731, 8738, 8745, 8750, 8755, 8762, + 0, 0, 0, 0, 0, 0, 0, 0, 8769, 8773, 8777, 8781, 8785, 8789, 8793, 8797, + 8801, 8805, 8809, 8814, 8818, 8822, 8827, 8831, 8836, 8840, 8844, 8848, + 8853, 8857, 8862, 8866, 8870, 8874, 8878, 0, 0, 0, 0, 8882, 8887, 8894, + 8902, 8909, 8914, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8919, 8922, 8926, + 8931, 8935, 8939, 8943, 8949, 8955, 8958, 8965, 8974, 8977, 8980, 8985, + 8991, 8995, 9003, 9009, 9015, 9023, 9027, 9032, 9043, 9048, 9052, 9056, + 9060, 9063, 0, 9066, 9073, 9077, 9083, 9087, 9094, 9101, 9109, 9116, + 9123, 9127, 9131, 9137, 9141, 9145, 9149, 9153, 9157, 9161, 9165, 9169, + 9173, 9177, 9181, 9185, 9189, 9193, 9197, 9201, 9205, 9214, 9223, 9233, + 9243, 9253, 9256, 9260, 9264, 9268, 9272, 9276, 9280, 9284, 9288, 9293, + 9297, 9300, 9303, 9306, 9309, 9312, 9315, 9318, 9321, 9325, 9329, 9333, + 9338, 9343, 9349, 9352, 9359, 9368, 9373, 9378, 9385, 9391, 9396, 9400, + 9404, 9408, 9412, 9416, 9420, 9424, 9428, 9432, 9436, 9441, 9446, 9453, + 9459, 9465, 9471, 9476, 9485, 9494, 9499, 9506, 9513, 9520, 9527, 9531, + 9535, 9539, 9546, 9557, 9561, 9565, 9569, 9576, 9585, 9589, 9593, 9601, + 9605, 9609, 9613, 9620, 9627, 9639, 9643, 9647, 9651, 9662, 9672, 9676, + 9684, 9691, 9698, 9707, 9718, 9727, 9731, 9741, 9752, 9761, 9776, 9785, + 9794, 9803, 9812, 9818, 9827, 9834, 9838, 9847, 9851, 9858, 9867, 9871, + 9877, 9884, 9891, 9895, 9904, 9908, 9915, 9919, 9928, 9932, 9941, 9949, + 9956, 9965, 9974, 9981, 9987, 9991, 9998, 10007, 10013, 10020, 10027, + 10033, 10043, 10051, 10058, 10064, 10068, 10071, 10075, 10081, 10090, + 10094, 10100, 10106, 10113, 10120, 10123, 10131, 10136, 10145, 10150, + 10154, 10167, 10180, 10186, 10193, 10198, 10204, 10209, 10215, 10225, + 10232, 10241, 10251, 10257, 10262, 10267, 10271, 10275, 10280, 10285, + 10291, 10299, 10307, 10318, 10323, 10332, 10341, 10348, 10354, 10360, + 10366, 10372, 10378, 10384, 10390, 10396, 10402, 10409, 10416, 10423, + 10429, 10437, 10446, 10453, 10461, 10469, 10475, 10481, 10487, 10495, + 10503, 10513, 10523, 10527, 10533, 10539, 0, 10545, 10550, 10555, 10562, + 10567, 10572, 10579, 10584, 10593, 10598, 10603, 10608, 10613, 10618, + 10625, 10630, 10637, 10642, 10647, 10652, 10657, 10662, 10668, 10672, + 10677, 10684, 10689, 10694, 10699, 10704, 10709, 10716, 10723, 10730, + 10735, 10740, 10746, 10751, 10756, 10762, 10767, 10772, 10780, 10788, + 10793, 10798, 10804, 10809, 10814, 10818, 10824, 10828, 10832, 10839, + 10846, 10852, 10858, 10865, 10872, 10876, 0, 0, 10880, 10887, 10894, + 10901, 10912, 10925, 10938, 10957, 10970, 10981, 10989, 10997, 11009, + 11025, 11036, 11042, 11052, 11061, 11074, 11085, 11094, 11107, 11114, + 11123, 11136, 11142, 11148, 11157, 11165, 11173, 11179, 11190, 11198, + 11209, 11219, 11232, 11246, 11260, 11270, 11281, 11292, 11305, 11318, + 11332, 11344, 11356, 11369, 11382, 11394, 11407, 11416, 11425, 11430, + 11435, 11440, 11445, 11450, 11455, 11460, 11465, 11470, 11475, 11480, + 11485, 11490, 11495, 11500, 11505, 11510, 11515, 11520, 11525, 11530, + 11535, 11540, 11545, 11550, 11555, 11560, 11565, 11570, 11575, 11580, + 11585, 11589, 11594, 11599, 11604, 11609, 11614, 11618, 11622, 11626, + 11630, 11634, 11638, 11642, 11646, 11650, 11654, 11658, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 11663, 11668, 11672, 11676, 11680, 11684, 11688, + 11692, 11696, 11700, 11704, 11708, 11713, 11717, 11721, 11725, 11730, + 11734, 11739, 11744, 11749, 11753, 11757, 11762, 11767, 11772, 11776, + 11781, 11785, 11790, 11795, 11799, 11803, 11810, 11814, 11819, 11823, + 11827, 11832, 11836, 11843, 11850, 11857, 11863, 11871, 11879, 11888, + 11896, 11903, 11910, 11918, 11924, 11930, 11936, 11942, 11949, 11954, + 11958, 11963, 0, 0, 11967, 11971, 11976, 11981, 11986, 11991, 11996, + 12001, 12006, 12011, 12016, 12021, 12026, 12031, 12036, 12041, 12046, + 12051, 12056, 12061, 12066, 12071, 12076, 12081, 12086, 12091, 12096, + 12101, 12106, 12111, 12119, 12126, 12132, 12137, 12145, 12152, 12158, + 12165, 12171, 12176, 12183, 12190, 12196, 12201, 12206, 12212, 12217, + 12222, 12228, 0, 0, 12233, 12239, 12245, 12251, 12257, 12263, 12269, + 12274, 12282, 12288, 12294, 12300, 12306, 12312, 12320, 0, 12326, 12331, + 12336, 12341, 12346, 12351, 12356, 12361, 12366, 12371, 12376, 12381, + 12386, 12391, 12396, 12401, 12406, 12411, 12416, 12421, 12426, 12431, + 12436, 12441, 12446, 12451, 12456, 12461, 0, 0, 12466, 0, 12470, 12476, + 12482, 12488, 12494, 12500, 12506, 12512, 12517, 12523, 12529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 12487, 12496, 12504, 12513, 12522, 12535, 12542, 12549, 12557, 12570, - 12582, 12589, 12597, 12603, 12608, 12617, 12626, 12634, 12640, 12650, - 12659, 0, 12666, 12674, 12682, 12691, 12700, 12714, 12720, 12726, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12732, 12737, - 12744, 12749, 12754, 12759, 12767, 12775, 12782, 12789, 12796, 12803, - 12810, 12817, 12824, 12830, 12838, 12843, 12848, 12853, 12858, 12863, - 12868, 12873, 12878, 12884, 12889, 12894, 12900, 12905, 12909, 12913, - 12917, 12922, 12928, 12934, 12940, 12945, 12950, 12955, 12960, 12966, - 12975, 12983, 12989, 12997, 13003, 13007, 13011, 13015, 13020, 13023, - 13027, 13030, 13034, 13037, 13041, 13045, 13049, 13054, 13059, 13062, - 13066, 13071, 13076, 13079, 13083, 13086, 13090, 13094, 13098, 13102, - 13106, 13110, 13114, 13118, 13122, 13126, 13130, 13134, 13138, 13142, - 13145, 13149, 13153, 13157, 13160, 13164, 13167, 13171, 13175, 13179, - 13182, 13185, 13188, 13192, 13195, 13199, 13203, 13207, 13211, 13215, - 13218, 13221, 13226, 13231, 13235, 13239, 13244, 13248, 13253, 13257, - 13262, 13267, 13273, 13279, 13285, 13289, 13294, 13300, 13306, 13310, - 13315, 13319, 13325, 13330, 13333, 13339, 13345, 13350, 13355, 13362, - 13367, 13372, 13376, 13380, 13384, 13388, 13392, 13396, 13400, 13404, - 13409, 13414, 13419, 13425, 13428, 13432, 13436, 13439, 13442, 13445, - 13448, 13451, 13454, 13457, 13460, 13463, 13467, 13474, 13479, 13483, - 13487, 13491, 13495, 13499, 13505, 13509, 13513, 13517, 13521, 13527, - 13531, 13535, 13539, 13544, 13549, 0, 13554, 13558, 13563, 13567, 13572, - 13576, 13581, 13586, 0, 0, 13591, 13595, 0, 0, 13600, 13604, 13609, - 13613, 13618, 13623, 13628, 13633, 13638, 13643, 13648, 13653, 13658, - 13663, 13668, 13673, 13678, 13683, 13687, 13692, 13697, 13702, 0, 13706, - 13710, 13715, 13720, 13725, 13729, 13733, 0, 13737, 0, 0, 0, 13741, - 13746, 13751, 13755, 0, 0, 13759, 13764, 13769, 13775, 13780, 13786, - 13791, 13797, 13803, 0, 0, 13810, 13815, 0, 0, 13821, 13826, 13832, - 13837, 0, 0, 0, 0, 0, 0, 0, 0, 13843, 0, 0, 0, 0, 13850, 13855, 0, 13860, - 13865, 13871, 13877, 13883, 0, 0, 13890, 13895, 13899, 13903, 13907, - 13911, 13915, 13919, 13923, 13927, 13931, 13940, 13950, 13955, 13960, - 13967, 13974, 13981, 13988, 14003, 14011, 14015, 14020, 14027, 14032, 0, - 0, 14037, 14044, 14049, 0, 14054, 14058, 14063, 14067, 14072, 14076, 0, - 0, 0, 0, 14081, 14086, 0, 0, 14091, 14096, 14101, 14105, 14110, 14115, - 14120, 14125, 14130, 14135, 14140, 14145, 14150, 14155, 14160, 14165, - 14170, 14175, 14179, 14184, 14189, 14194, 0, 14198, 14202, 14207, 14212, - 14217, 14221, 14225, 0, 14229, 14233, 0, 14238, 14243, 0, 14248, 14252, - 0, 0, 14256, 0, 14261, 14267, 14272, 14278, 14283, 0, 0, 0, 0, 14289, - 14295, 0, 0, 14301, 14307, 14313, 0, 0, 0, 14318, 0, 0, 0, 0, 0, 0, 0, - 14323, 14328, 14333, 14338, 0, 14343, 0, 0, 0, 0, 0, 0, 0, 14348, 14353, - 14357, 14361, 14365, 14369, 14373, 14377, 14381, 14385, 14389, 14393, - 14397, 14401, 14405, 14411, 14416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14421, - 14426, 14431, 0, 14436, 14440, 14445, 14449, 14454, 14458, 14463, 14468, - 14473, 0, 14479, 14483, 14488, 0, 14494, 14498, 14503, 14507, 14512, - 14517, 14522, 14527, 14532, 14537, 14542, 14547, 14552, 14557, 14562, - 14567, 14572, 14577, 14581, 14586, 14591, 14596, 0, 14600, 14604, 14609, - 14614, 14619, 14623, 14627, 0, 14631, 14635, 0, 14640, 14645, 14650, - 14655, 14659, 0, 0, 14663, 14668, 14673, 14679, 14684, 14690, 14695, - 14701, 14707, 14714, 0, 14721, 14726, 14732, 0, 14739, 14744, 14750, 0, - 0, 14755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14759, 14765, - 14771, 14777, 0, 0, 14784, 14789, 14793, 14797, 14801, 14805, 14809, - 14813, 14817, 14821, 14825, 14830, 0, 0, 0, 0, 0, 0, 0, 14835, 14840, - 14845, 14850, 14855, 14863, 14871, 0, 14879, 14884, 14889, 0, 14894, - 14898, 14903, 14907, 14912, 14916, 14921, 14926, 0, 0, 14931, 14935, 0, - 0, 14940, 14944, 14949, 14953, 14958, 14963, 14968, 14973, 14978, 14983, - 14988, 14993, 14998, 15003, 15008, 15013, 15018, 15023, 15027, 15032, - 15037, 15042, 0, 15046, 15050, 15055, 15060, 15065, 15069, 15073, 0, - 15077, 15081, 0, 15086, 15091, 15096, 15101, 15105, 0, 0, 15109, 15114, - 15119, 15125, 15130, 15136, 15141, 15147, 15153, 0, 0, 15160, 15165, 0, - 0, 15171, 15176, 15182, 0, 0, 0, 0, 0, 0, 0, 0, 15187, 15194, 0, 0, 0, 0, - 15201, 15206, 0, 15211, 15216, 15222, 15228, 15234, 0, 0, 15241, 15246, - 15250, 15254, 15258, 15262, 15266, 15270, 15274, 15278, 15282, 15286, - 15291, 15297, 15303, 15309, 15315, 15321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 15327, 15331, 0, 15335, 15338, 15342, 15345, 15349, 15352, 0, 0, 0, - 15356, 15359, 15363, 0, 15367, 15370, 15374, 15378, 0, 0, 0, 15381, - 15385, 0, 15389, 0, 15393, 15397, 0, 0, 0, 15401, 15405, 0, 0, 0, 15408, - 15411, 15415, 0, 0, 0, 15418, 15421, 15424, 15427, 15431, 15434, 15438, - 15442, 15446, 15450, 15454, 15457, 0, 0, 0, 0, 15460, 15465, 15469, - 15474, 15478, 0, 0, 0, 15483, 15487, 15492, 0, 15497, 15501, 15506, - 15511, 0, 0, 15515, 0, 0, 0, 0, 0, 0, 15518, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 15524, 15528, 15531, 15534, 15537, 15540, 15543, 15546, - 15549, 15552, 15555, 15559, 15564, 15568, 15572, 15576, 15580, 15584, - 15588, 15593, 15597, 0, 0, 0, 0, 0, 15600, 15607, 15612, 15617, 15622, - 15629, 15633, 15638, 15642, 15647, 15651, 15656, 15661, 0, 15666, 15670, - 15675, 0, 15680, 15684, 15689, 15694, 15698, 15703, 15708, 15713, 15718, - 15723, 15728, 15733, 15738, 15743, 15748, 15753, 15758, 15763, 15768, - 15772, 15777, 15782, 15787, 0, 15791, 15795, 15800, 15805, 15810, 15814, - 15818, 15822, 15827, 15831, 15836, 15841, 15846, 15851, 15856, 15860, 0, - 0, 0, 15864, 15869, 15875, 15880, 15886, 15891, 15897, 15903, 0, 15910, - 15915, 15921, 0, 15927, 15932, 15938, 15944, 0, 0, 0, 0, 0, 0, 0, 15949, - 15954, 0, 15961, 15966, 15971, 0, 0, 0, 0, 0, 15976, 15982, 15988, 15994, - 0, 0, 16001, 16006, 16010, 16014, 16018, 16022, 16026, 16030, 16034, - 16038, 0, 0, 0, 0, 0, 0, 0, 16042, 16047, 16060, 16072, 16084, 16096, - 16108, 16120, 16132, 16137, 16144, 16149, 16154, 16159, 16164, 16168, - 16173, 16177, 16182, 16186, 16191, 16196, 0, 16201, 16205, 16210, 0, - 16215, 16219, 16224, 16229, 16233, 16238, 16243, 16248, 16253, 16258, - 16263, 16268, 16273, 16278, 16283, 16288, 16293, 16298, 16303, 16307, - 16312, 16317, 16322, 0, 16326, 16330, 16335, 16340, 16345, 16349, 16353, - 16357, 16362, 16366, 0, 16371, 16376, 16381, 16386, 16390, 0, 0, 16394, - 16399, 16404, 16410, 16415, 16421, 16426, 16432, 16438, 0, 16445, 16450, - 16456, 0, 16462, 16467, 16473, 16479, 0, 0, 0, 0, 0, 0, 0, 16484, 16489, - 0, 0, 0, 0, 0, 0, 0, 16496, 0, 16501, 16507, 16513, 16519, 0, 0, 16526, - 16531, 16535, 16539, 16543, 16547, 16551, 16555, 16559, 16563, 0, 16567, - 16572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16577, 16583, 16587, 16591, - 0, 16595, 16598, 16602, 16605, 16609, 16612, 16616, 16620, 0, 16624, - 16627, 16631, 0, 16635, 16638, 16642, 16646, 16649, 16653, 16657, 16661, - 16665, 16669, 16673, 16677, 16681, 16685, 16689, 16693, 16697, 16701, - 16705, 16708, 16712, 16716, 16720, 16723, 16727, 16730, 16734, 16738, - 16742, 16745, 16748, 16751, 16755, 16758, 16762, 16766, 16770, 16774, - 16778, 16781, 16784, 16788, 16795, 16801, 16805, 16810, 16814, 16819, - 16823, 16828, 16833, 0, 16839, 16843, 16848, 0, 16853, 16857, 16862, - 16867, 16871, 16876, 0, 0, 0, 0, 16880, 16886, 16892, 16898, 16904, - 16909, 16914, 16919, 16924, 16929, 16934, 16939, 16945, 16950, 16955, - 16960, 0, 0, 16966, 16970, 16973, 16976, 16979, 16982, 16985, 16988, - 16991, 16994, 16997, 17001, 17006, 17010, 17015, 17020, 17025, 17030, - 17035, 17040, 17044, 17050, 17056, 17062, 17067, 17073, 0, 0, 17079, - 17083, 0, 17087, 17091, 17095, 17099, 17103, 17107, 17111, 17115, 17119, - 17123, 17127, 17131, 17135, 17139, 17143, 17147, 17151, 17155, 0, 0, 0, - 17159, 17165, 17171, 17177, 17183, 17189, 17195, 17201, 17207, 17213, - 17219, 17225, 17233, 17239, 17245, 17251, 17257, 17263, 17269, 17275, - 17281, 17287, 17293, 17299, 0, 17305, 17311, 17317, 17323, 17329, 17335, - 17339, 17345, 17349, 0, 17353, 0, 0, 17359, 17363, 17369, 17375, 17381, - 17385, 17391, 0, 0, 0, 17395, 0, 0, 0, 0, 17399, 17404, 17411, 17418, - 17425, 17432, 0, 17439, 0, 17446, 17451, 17456, 17463, 17470, 17479, - 17490, 17499, 0, 0, 0, 0, 0, 0, 17504, 17510, 17515, 17520, 17525, 17530, - 17535, 17540, 17545, 17550, 0, 0, 17555, 17562, 17569, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 17574, 17581, 17588, 17595, 17602, 17609, 17616, 17623, - 17630, 17637, 17644, 17651, 17658, 17665, 17672, 17679, 17686, 17693, - 17700, 17707, 17714, 17721, 17728, 17735, 17742, 17749, 17756, 17763, - 17770, 17777, 17784, 17791, 17798, 17804, 17811, 17818, 17823, 17830, - 17835, 17842, 17849, 17856, 17863, 17870, 17877, 17883, 17890, 17895, - 17901, 17908, 17915, 17922, 17928, 17935, 17942, 17949, 17955, 17962, 0, - 0, 0, 0, 17967, 17974, 17980, 17987, 17993, 18002, 18011, 18016, 18021, - 18026, 18033, 18040, 18047, 18054, 18059, 18064, 18069, 18074, 18079, - 18083, 18087, 18091, 18095, 18099, 18103, 18107, 18111, 18115, 18120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18125, 18130, 0, 18137, 0, 18144, - 18151, 18156, 18161, 18168, 0, 18175, 18182, 18187, 18194, 18201, 18208, - 18215, 18222, 18229, 18234, 18238, 18245, 18252, 18259, 18264, 18269, - 18274, 18281, 18288, 18295, 18302, 18309, 18314, 18319, 0, 18326, 0, - 18333, 18338, 18345, 18352, 18359, 18366, 18373, 18377, 18384, 18388, - 18393, 18401, 18407, 18413, 18418, 18424, 18430, 18436, 18441, 18447, - 18454, 18462, 18469, 0, 0, 18476, 18481, 18487, 18492, 18498, 0, 18504, - 0, 18509, 18516, 18523, 18530, 18537, 18542, 0, 0, 18546, 18551, 18555, - 18559, 18563, 18567, 18571, 18575, 18579, 18583, 0, 0, 18587, 18593, - 18599, 18606, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18613, 18617, 18628, 18643, 18658, - 18668, 18679, 18692, 18703, 18709, 18717, 18727, 18733, 18741, 18745, - 18751, 18757, 18765, 18775, 18783, 18796, 18802, 18810, 18818, 18830, - 18837, 18845, 18853, 18861, 18869, 18877, 18885, 18895, 18899, 18902, - 18905, 18908, 18911, 18914, 18917, 18920, 18923, 18926, 18930, 18934, - 18938, 18942, 18946, 18950, 18954, 18958, 18962, 18967, 18973, 18983, - 18997, 19007, 19013, 19019, 19027, 19035, 19043, 19051, 19057, 19063, - 19066, 19070, 19074, 19078, 19082, 19086, 19090, 0, 19094, 19098, 19102, - 19106, 19110, 19114, 19118, 19121, 19125, 19129, 19133, 19136, 19139, - 19143, 19147, 19151, 19154, 19158, 19162, 19166, 19170, 19174, 19178, - 19182, 19186, 19189, 19192, 19195, 19199, 19203, 19206, 19209, 19212, - 19216, 19221, 19225, 0, 0, 0, 0, 19229, 19234, 19238, 19243, 19247, - 19252, 19257, 19263, 19268, 19274, 19278, 19283, 19287, 19292, 19302, - 19308, 19314, 19321, 19331, 19337, 19341, 19345, 19351, 19357, 19365, - 19371, 19379, 19387, 19395, 19405, 19413, 19423, 19428, 19434, 19440, - 19446, 19452, 19458, 19464, 0, 19470, 19476, 19482, 19488, 19494, 19500, - 19506, 19511, 19517, 19523, 19529, 19534, 19539, 19545, 19551, 19557, - 19562, 19568, 19574, 19580, 19586, 19592, 19598, 19604, 19610, 19615, - 19620, 19625, 19631, 19637, 19642, 19647, 19652, 19658, 19666, 19673, 0, - 19680, 19687, 19700, 19707, 19714, 19722, 19730, 19736, 19742, 19748, - 19758, 19763, 19769, 19779, 19789, 0, 19799, 19809, 19817, 19829, 19841, - 19847, 19861, 19876, 19881, 19886, 19894, 19902, 19910, 0, 0, 0, 0, 0, 0, + 0, 0, 12535, 12544, 12552, 12561, 12570, 12583, 12590, 12597, 12605, + 12618, 12630, 12637, 12645, 12651, 12656, 12665, 12674, 12682, 12688, + 12698, 12707, 0, 12714, 12722, 12730, 12739, 12748, 12762, 12768, 12774, + 12780, 12788, 12796, 12804, 12812, 12820, 12829, 12840, 12849, 12858, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12869, 12874, 12881, 12886, 12891, 12896, + 12904, 12912, 12919, 12926, 12933, 12940, 12947, 12954, 12961, 12967, + 12975, 12980, 12985, 12990, 12995, 13000, 13005, 13010, 13015, 13021, + 13026, 13031, 13037, 13042, 13047, 13052, 13057, 13062, 13068, 13074, + 13080, 13085, 13090, 13095, 13100, 13106, 13115, 13123, 13129, 13137, + 13143, 13147, 13151, 13155, 13160, 13163, 13167, 13170, 13174, 13177, + 13181, 13185, 13189, 13194, 13199, 13202, 13206, 13211, 13216, 13219, + 13223, 13226, 13230, 13234, 13238, 13242, 13246, 13250, 13254, 13258, + 13262, 13266, 13270, 13274, 13278, 13282, 13285, 13289, 13293, 13297, + 13300, 13304, 13307, 13311, 13315, 13319, 13322, 13325, 13328, 13332, + 13335, 13339, 13343, 13347, 13351, 13355, 13358, 13361, 13366, 13371, + 13375, 13379, 13384, 13388, 13393, 13397, 13402, 13407, 13413, 13419, + 13425, 13429, 13434, 13440, 13446, 13450, 13455, 13459, 13465, 13470, + 13473, 13479, 13485, 13490, 13495, 13502, 13507, 13512, 13516, 13520, + 13524, 13528, 13532, 13536, 13540, 13544, 13549, 13554, 13559, 13565, + 13568, 13572, 13576, 13579, 13582, 13585, 13588, 13591, 13594, 13597, + 13600, 13603, 13607, 13614, 13619, 13623, 13627, 13631, 13635, 13639, + 13645, 13649, 13653, 13657, 13661, 13667, 13671, 13675, 13679, 13684, + 13689, 0, 13694, 13698, 13703, 13707, 13712, 13716, 13721, 13726, 0, 0, + 13731, 13735, 0, 0, 13740, 13744, 13749, 13753, 13758, 13763, 13768, + 13773, 13778, 13783, 13788, 13793, 13798, 13803, 13808, 13813, 13818, + 13823, 13827, 13832, 13837, 13842, 0, 13846, 13850, 13855, 13860, 13865, + 13869, 13873, 0, 13877, 0, 0, 0, 13881, 13886, 13891, 13895, 0, 0, 13899, + 13904, 13909, 13915, 13920, 13926, 13931, 13937, 13943, 0, 0, 13950, + 13955, 0, 0, 13961, 13966, 13972, 13977, 0, 0, 0, 0, 0, 0, 0, 0, 13983, + 0, 0, 0, 0, 13990, 13995, 0, 14000, 14005, 14011, 14017, 14023, 0, 0, + 14030, 14035, 14039, 14043, 14047, 14051, 14055, 14059, 14063, 14067, + 14071, 14080, 14089, 14094, 14099, 14106, 14113, 14120, 14127, 14142, + 14150, 14154, 14159, 14166, 14171, 0, 0, 14176, 14183, 14188, 0, 14193, + 14197, 14202, 14206, 14211, 14215, 0, 0, 0, 0, 14220, 14225, 0, 0, 14230, + 14235, 14240, 14244, 14249, 14254, 14259, 14264, 14269, 14274, 14279, + 14284, 14289, 14294, 14299, 14304, 14309, 14314, 14318, 14323, 14328, + 14333, 0, 14337, 14341, 14346, 14351, 14356, 14360, 14364, 0, 14368, + 14372, 0, 14377, 14382, 0, 14387, 14391, 0, 0, 14395, 0, 14400, 14406, + 14411, 14417, 14422, 0, 0, 0, 0, 14428, 14434, 0, 0, 14440, 14446, 14452, + 0, 0, 0, 14457, 0, 0, 0, 0, 0, 0, 0, 14462, 14467, 14472, 14477, 0, + 14482, 0, 0, 0, 0, 0, 0, 0, 14487, 14492, 14496, 14500, 14504, 14508, + 14512, 14516, 14520, 14524, 14528, 14532, 14536, 14540, 14544, 14550, + 14555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14560, 14565, 14570, 0, 14575, + 14579, 14584, 14588, 14593, 14597, 14602, 14607, 14612, 0, 14618, 14622, + 14627, 0, 14633, 14637, 14642, 14646, 14651, 14656, 14661, 14666, 14671, + 14676, 14681, 14686, 14691, 14696, 14701, 14706, 14711, 14716, 14720, + 14725, 14730, 14735, 0, 14739, 14743, 14748, 14753, 14758, 14762, 14766, + 0, 14770, 14774, 0, 14779, 14784, 14789, 14794, 14798, 0, 0, 14802, + 14807, 14812, 14818, 14823, 14829, 14834, 14840, 14846, 14853, 0, 14860, + 14865, 14871, 0, 14878, 14883, 14889, 0, 0, 14894, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 14898, 14904, 14910, 14916, 0, 0, 14923, 14928, + 14932, 14936, 14940, 14944, 14948, 14952, 14956, 14960, 14964, 14969, 0, + 0, 0, 0, 0, 0, 0, 14974, 14979, 14984, 14989, 14994, 15002, 15010, 0, + 15018, 15023, 15028, 0, 15033, 15037, 15042, 15046, 15051, 15055, 15060, + 15065, 0, 0, 15070, 15074, 0, 0, 15079, 15083, 15088, 15092, 15097, + 15102, 15107, 15112, 15117, 15122, 15127, 15132, 15137, 15142, 15147, + 15152, 15157, 15162, 15166, 15171, 15176, 15181, 0, 15185, 15189, 15194, + 15199, 15204, 15208, 15212, 0, 15216, 15220, 0, 15225, 15230, 15235, + 15240, 15244, 0, 0, 15248, 15253, 15258, 15264, 15269, 15275, 15280, + 15286, 15292, 0, 0, 15299, 15304, 0, 0, 15310, 15315, 15321, 0, 0, 0, 0, + 0, 0, 0, 15326, 15331, 15338, 0, 0, 0, 0, 15345, 15350, 0, 15355, 15360, + 15366, 15372, 15378, 0, 0, 15385, 15390, 15394, 15398, 15402, 15406, + 15410, 15414, 15418, 15422, 15426, 15430, 15435, 15442, 15449, 15456, + 15463, 15470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15477, 15481, 0, 15485, + 15488, 15492, 15495, 15499, 15502, 0, 0, 0, 15506, 15509, 15513, 0, + 15517, 15520, 15524, 15528, 0, 0, 0, 15531, 15535, 0, 15539, 0, 15543, + 15547, 0, 0, 0, 15551, 15555, 0, 0, 0, 15558, 15561, 15565, 0, 0, 0, + 15568, 15571, 15574, 15577, 15581, 15584, 15588, 15592, 15596, 15600, + 15604, 15607, 0, 0, 0, 0, 15610, 15615, 15619, 15624, 15628, 0, 0, 0, + 15633, 15637, 15642, 0, 15647, 15651, 15656, 15661, 0, 0, 15665, 0, 0, 0, + 0, 0, 0, 15668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15674, 15678, + 15681, 15684, 15687, 15690, 15693, 15696, 15699, 15702, 15705, 15709, + 15714, 15718, 15722, 15726, 15730, 15734, 15738, 15743, 15747, 0, 0, 0, + 0, 0, 15750, 15757, 15762, 15767, 15772, 15779, 15783, 15788, 15792, + 15797, 15801, 15806, 15811, 0, 15816, 15820, 15825, 0, 15830, 15834, + 15839, 15844, 15848, 15853, 15858, 15863, 15868, 15873, 15878, 15883, + 15888, 15893, 15898, 15903, 15908, 15913, 15918, 15922, 15927, 15932, + 15937, 0, 15941, 15945, 15950, 15955, 15960, 15964, 15968, 15972, 15977, + 15981, 15986, 15991, 15996, 16001, 16006, 16010, 0, 0, 0, 16014, 16019, + 16025, 16030, 16036, 16041, 16047, 16053, 0, 16060, 16065, 16071, 0, + 16077, 16082, 16088, 16094, 0, 0, 0, 0, 0, 0, 0, 16099, 16104, 0, 16111, + 16116, 16121, 0, 0, 0, 0, 0, 16126, 16132, 16138, 16144, 0, 0, 16151, + 16156, 16160, 16164, 16168, 16172, 16176, 16180, 16184, 16188, 0, 0, 0, + 0, 0, 0, 0, 16192, 16197, 16211, 16224, 16237, 16250, 16263, 16276, + 16289, 16294, 16301, 16306, 16311, 16316, 16321, 16325, 16330, 16334, + 16339, 16343, 16348, 16353, 0, 16358, 16362, 16367, 0, 16372, 16376, + 16381, 16386, 16390, 16395, 16400, 16405, 16410, 16415, 16420, 16425, + 16430, 16435, 16440, 16445, 16450, 16455, 16460, 16464, 16469, 16474, + 16479, 0, 16483, 16487, 16492, 16497, 16502, 16506, 16510, 16514, 16519, + 16523, 0, 16528, 16533, 16538, 16543, 16547, 0, 0, 16551, 16556, 16561, + 16567, 16572, 16578, 16583, 16589, 16595, 0, 16602, 16607, 16613, 0, + 16619, 16624, 16630, 16636, 0, 0, 0, 0, 0, 0, 0, 16641, 16646, 0, 0, 0, + 0, 0, 0, 0, 16653, 0, 16658, 16664, 16670, 16676, 0, 0, 16683, 16688, + 16692, 16696, 16700, 16704, 16708, 16712, 16716, 16720, 0, 16724, 16729, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16734, 16740, 16744, 16748, 16752, + 16758, 16761, 16765, 16768, 16772, 16775, 16779, 16783, 0, 16787, 16790, + 16794, 0, 16798, 16801, 16805, 16809, 16812, 16816, 16820, 16824, 16828, + 16832, 16836, 16840, 16844, 16848, 16852, 16856, 16860, 16864, 16868, + 16871, 16875, 16879, 16883, 16886, 16890, 16893, 16897, 16901, 16905, + 16908, 16911, 16914, 16918, 16921, 16925, 16929, 16933, 16937, 16941, + 16944, 16947, 16951, 16958, 16964, 16968, 16973, 16977, 16982, 16986, + 16991, 16996, 0, 17002, 17006, 17011, 0, 17016, 17020, 17025, 17030, + 17034, 17039, 0, 0, 0, 0, 17043, 17049, 17055, 17061, 17067, 17073, + 17079, 17085, 17091, 17097, 17103, 17109, 17115, 17120, 17125, 17130, 0, + 0, 17136, 17140, 17143, 17146, 17149, 17152, 17155, 17158, 17161, 17164, + 17167, 17171, 17176, 17180, 17186, 17192, 17198, 17204, 17210, 17216, + 17220, 17226, 17232, 17238, 17243, 17249, 0, 17255, 17259, 17263, 0, + 17267, 17271, 17275, 17279, 17283, 17287, 17291, 17295, 17299, 17303, + 17307, 17311, 17315, 17319, 17323, 17327, 17331, 17335, 0, 0, 0, 17339, + 17345, 17351, 17357, 17363, 17369, 17375, 17381, 17387, 17393, 17399, + 17405, 17413, 17419, 17425, 17431, 17437, 17443, 17449, 17455, 17461, + 17467, 17473, 17479, 0, 17485, 17491, 17497, 17503, 17509, 17515, 17519, + 17525, 17529, 0, 17533, 0, 0, 17539, 17543, 17549, 17555, 17561, 17565, + 17571, 0, 0, 0, 17575, 0, 0, 0, 0, 17579, 17584, 17591, 17598, 17605, + 17612, 0, 17619, 0, 17626, 17631, 17636, 17643, 17650, 17659, 17670, + 17679, 0, 0, 0, 0, 0, 0, 17684, 17690, 17695, 17700, 17705, 17710, 17715, + 17720, 17725, 17730, 0, 0, 17735, 17742, 17749, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17754, 17762, 17770, 17778, 17786, 17794, 17802, 17810, + 17818, 17826, 17834, 17842, 17850, 17858, 17866, 17873, 17881, 17889, + 17897, 17905, 17913, 17920, 17928, 17936, 17944, 17952, 17960, 17968, + 17976, 17984, 17992, 18000, 18008, 18015, 18023, 18031, 18037, 18045, + 18051, 18059, 18067, 18075, 18083, 18091, 18099, 18106, 18114, 18120, + 18127, 18135, 18143, 18151, 18158, 18166, 18174, 18182, 18189, 18197, 0, + 0, 0, 0, 18203, 18210, 18217, 18225, 18232, 18242, 18252, 18258, 18264, + 18270, 18278, 18286, 18294, 18302, 18308, 18314, 18320, 18326, 18331, + 18335, 18339, 18343, 18347, 18351, 18355, 18359, 18363, 18367, 18373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 19918, 19921, 19925, 19929, 19933, 19937, 19941, - 19945, 19949, 19953, 19957, 19961, 19965, 19969, 19973, 19977, 19981, - 19984, 19988, 19992, 19996, 19999, 20002, 20006, 20010, 20014, 20017, - 20020, 20023, 20026, 20030, 20033, 20036, 20040, 20043, 20048, 20051, - 20055, 20058, 20062, 20065, 20070, 20073, 20077, 20084, 20089, 20093, - 20098, 20102, 20107, 20111, 20116, 20123, 20129, 20135, 20139, 20143, - 20147, 20151, 20155, 20161, 20167, 20174, 20180, 20185, 20189, 20192, - 20195, 20198, 20201, 20204, 20207, 20210, 20213, 20216, 20222, 20226, - 20230, 20234, 20238, 20242, 20246, 20250, 20254, 20259, 20263, 20268, - 20273, 20279, 20284, 20290, 20296, 20302, 20308, 20314, 20322, 20330, - 20338, 20346, 20355, 20364, 20375, 20385, 20395, 20406, 20417, 20427, - 20437, 20447, 20457, 20467, 20477, 20487, 20497, 20505, 20512, 20518, - 20525, 20530, 20536, 20542, 20548, 20554, 20560, 20566, 20571, 20577, - 20583, 20589, 20595, 20600, 20609, 20616, 20622, 20630, 20638, 20644, - 20650, 20656, 20662, 20670, 20678, 20688, 20696, 20704, 20710, 20715, - 20720, 20725, 20730, 20735, 20740, 20745, 20750, 20755, 20761, 20767, - 20773, 20780, 20785, 20791, 20796, 20801, 20806, 20811, 20816, 20821, - 20826, 20831, 20836, 20841, 20846, 20851, 20856, 20861, 20866, 20871, - 20876, 20881, 20886, 20891, 20896, 20901, 20906, 20911, 20916, 20921, - 20926, 20931, 20936, 20941, 20946, 20951, 20956, 20961, 20966, 20971, - 20976, 0, 20981, 0, 0, 0, 0, 0, 20986, 0, 0, 20991, 20995, 20999, 21003, - 21007, 21011, 21015, 21019, 21023, 21027, 21031, 21035, 21039, 21043, - 21047, 21051, 21055, 21059, 21063, 21067, 21071, 21075, 21079, 21083, - 21087, 21091, 21095, 21099, 21103, 21107, 21111, 21115, 21119, 21123, - 21127, 21131, 21135, 21139, 21143, 21147, 21151, 21155, 21160, 21164, - 21169, 21174, 21178, 21183, 21188, 21192, 21196, 21200, 21204, 21208, - 21212, 21216, 21220, 21224, 21228, 21232, 21236, 21240, 21244, 21248, - 21252, 21256, 21260, 21264, 21268, 21272, 21276, 21280, 21284, 21288, - 21292, 21296, 21300, 21304, 21308, 21312, 21316, 21320, 21324, 21328, - 21332, 21336, 21340, 21344, 21348, 21352, 21356, 21360, 21364, 21368, - 21372, 21376, 21380, 21384, 21388, 21392, 21396, 21400, 21404, 21408, - 21412, 21416, 21420, 21424, 21428, 21432, 21436, 21440, 21444, 21448, - 21452, 21456, 21460, 21464, 21468, 21472, 21476, 21480, 21484, 21488, - 21492, 21496, 21500, 21504, 21508, 21512, 21516, 21520, 21524, 21528, - 21532, 21536, 21540, 21544, 21548, 21552, 21556, 21560, 21564, 21568, - 21572, 21577, 21581, 21586, 21590, 21595, 21600, 21604, 21609, 21614, - 21618, 21623, 21628, 21633, 21638, 21642, 21647, 21652, 21657, 21662, - 21667, 21672, 21676, 21681, 21686, 21691, 21696, 21701, 21706, 21711, - 21716, 21721, 21726, 21731, 21736, 21741, 21746, 21751, 21756, 21761, - 21766, 21771, 21776, 21781, 21786, 21791, 21796, 21801, 21806, 21811, - 21816, 21821, 21826, 21831, 21836, 21841, 21846, 21851, 21856, 21861, - 21866, 21871, 21876, 21881, 21886, 21891, 21896, 21901, 21906, 21911, - 21916, 21921, 21926, 21930, 21934, 21938, 21942, 21946, 21950, 21954, - 21958, 21962, 21966, 21970, 21974, 21978, 21982, 21986, 21990, 21994, - 21998, 22002, 22006, 22010, 22014, 22018, 22022, 22026, 22030, 22034, - 22038, 22042, 22046, 22050, 22054, 22058, 22062, 22066, 22070, 22074, - 22078, 22082, 22086, 22090, 22094, 22098, 22102, 22106, 22110, 22114, - 22118, 22122, 22126, 22130, 22134, 22138, 22142, 22146, 22150, 22154, - 22158, 22162, 22166, 22170, 22174, 22178, 22182, 22186, 22190, 22194, - 22198, 22202, 22206, 22210, 22214, 22218, 22222, 22226, 22230, 22234, - 22238, 22242, 22246, 22250, 22254, 22258, 22262, 22266, 22270, 22274, - 22278, 22281, 22285, 22289, 22293, 22297, 22301, 22305, 22309, 22312, - 22316, 22320, 22324, 22328, 22332, 22336, 22340, 22344, 22348, 22352, - 22356, 22360, 22364, 22368, 22372, 22375, 22379, 22383, 22387, 22391, - 22395, 22399, 22403, 22407, 22411, 22415, 22419, 22423, 22427, 22431, - 22435, 22438, 22442, 22446, 22450, 22454, 22458, 22462, 22466, 22469, - 22473, 22477, 22481, 22485, 22489, 22493, 22497, 22501, 22505, 22509, - 22513, 22517, 22521, 22525, 22529, 22533, 22537, 22541, 22545, 22549, - 22553, 22557, 22561, 0, 22565, 22569, 22573, 22577, 0, 0, 22581, 22585, - 22589, 22593, 22597, 22601, 22605, 0, 22609, 0, 22613, 22617, 22621, - 22625, 0, 0, 22629, 22633, 22637, 22641, 22645, 22649, 22653, 22657, - 22661, 22665, 22669, 22673, 22677, 22681, 22685, 22689, 22693, 22696, - 22700, 22704, 22708, 22712, 22716, 22719, 22723, 22727, 22731, 22735, - 22739, 22743, 22747, 22751, 22755, 22759, 22763, 22767, 22771, 22775, - 22779, 22783, 22787, 0, 22791, 22795, 22799, 22803, 0, 0, 22807, 22810, - 22814, 22818, 22822, 22826, 22830, 22834, 22838, 22842, 22846, 22850, - 22854, 22858, 22862, 22866, 22870, 22875, 22880, 22885, 22891, 22897, - 22902, 22907, 22913, 22916, 22920, 22924, 22928, 22932, 22936, 22940, - 22944, 0, 22948, 22952, 22956, 22960, 0, 0, 22964, 22968, 22972, 22976, - 22980, 22984, 22988, 0, 22992, 0, 22996, 23000, 23004, 23008, 0, 0, - 23012, 23016, 23020, 23024, 23028, 23032, 23036, 23040, 23044, 23049, - 23054, 23059, 23065, 23071, 23076, 0, 23081, 23085, 23089, 23093, 23097, - 23101, 23105, 23109, 23113, 23117, 23121, 23125, 23129, 23133, 23137, - 23141, 23145, 23148, 23152, 23156, 23160, 23164, 23168, 23172, 23176, - 23180, 23184, 23188, 23192, 23196, 23200, 23204, 23208, 23212, 23216, - 23220, 23224, 23228, 23232, 23236, 23240, 23244, 23248, 23252, 23256, - 23260, 23264, 23268, 23272, 23276, 23280, 23284, 23288, 23292, 23296, - 23300, 23304, 0, 23308, 23312, 23316, 23320, 0, 0, 23324, 23328, 23332, - 23336, 23340, 23344, 23348, 23352, 23356, 23360, 23364, 23368, 23372, - 23376, 23380, 23384, 23388, 23392, 23396, 23400, 23404, 23408, 23412, - 23416, 23420, 23424, 23428, 23432, 23436, 23440, 23444, 23448, 23452, - 23456, 23460, 23464, 23468, 23472, 23476, 23480, 23484, 23488, 23492, - 23496, 23500, 23504, 23508, 23512, 23516, 23520, 23524, 23528, 23532, - 23536, 23540, 23544, 23548, 23551, 23555, 23559, 23563, 23567, 23571, - 23575, 23579, 23583, 23587, 0, 0, 23591, 23600, 23606, 23611, 23615, - 23618, 23623, 23626, 23629, 23632, 23637, 23641, 23646, 23649, 23652, - 23655, 23658, 23661, 23664, 23667, 23670, 23673, 23677, 23681, 23685, - 23689, 23693, 23697, 23701, 23705, 23709, 23713, 0, 0, 0, 23718, 23724, - 23728, 23732, 23736, 23742, 23746, 23750, 23754, 23760, 23764, 23768, - 23772, 23778, 23782, 23786, 23790, 23796, 23802, 23808, 23816, 23822, - 23828, 23834, 23840, 23846, 0, 0, 0, 0, 0, 0, 23852, 23855, 23858, 23861, - 23864, 23867, 23871, 23875, 23878, 23882, 23886, 23890, 23894, 23898, - 23901, 23905, 23909, 23913, 23917, 23921, 23924, 23928, 23932, 23936, - 23940, 23944, 23947, 23951, 23955, 23959, 23963, 23966, 23970, 23974, - 23978, 23982, 23986, 23990, 23994, 23998, 24002, 24006, 24010, 24014, - 24018, 24021, 24025, 24029, 24033, 24037, 24041, 24045, 24049, 24052, - 24056, 24060, 24064, 24068, 24072, 24076, 24080, 24084, 24088, 24092, - 24096, 24100, 24104, 24108, 24112, 24116, 24120, 24124, 24128, 24132, - 24136, 24140, 24144, 24148, 24152, 24156, 24159, 24163, 24167, 24171, - 24175, 24179, 0, 0, 24183, 24188, 24193, 24198, 24203, 24208, 0, 0, - 24213, 24217, 24220, 24224, 24227, 24231, 24234, 24238, 24244, 24249, - 24253, 24256, 24260, 24264, 24270, 24274, 24280, 24284, 24290, 24294, - 24300, 24304, 24310, 24316, 24320, 24326, 24330, 24336, 24342, 24346, - 24352, 24358, 24362, 24367, 24375, 24383, 24390, 24395, 24400, 24409, - 24415, 24423, 24428, 24434, 24438, 24442, 24446, 24450, 24454, 24458, - 24462, 24466, 24470, 24474, 24480, 24485, 24490, 24493, 24497, 24501, - 24507, 24511, 24517, 24521, 24527, 24531, 24537, 24541, 24547, 24551, - 24557, 24561, 24567, 24573, 24577, 24583, 24588, 24592, 24596, 24600, - 24604, 24607, 24611, 24617, 24622, 24627, 24630, 24634, 24638, 24644, - 24648, 24654, 24658, 24664, 24667, 24672, 24676, 24682, 24686, 24692, - 24696, 24702, 24708, 24712, 24716, 24720, 24724, 24728, 24732, 24736, - 24740, 24744, 24748, 24752, 24758, 24761, 24765, 24769, 24775, 24779, - 24785, 24789, 24795, 24799, 24805, 24809, 24815, 24819, 24825, 24829, - 24835, 24841, 24845, 24849, 24855, 24861, 24867, 24873, 24877, 24881, - 24885, 24889, 24893, 24897, 24903, 24907, 24911, 24915, 24921, 24925, - 24931, 24935, 24941, 24945, 24951, 24955, 24961, 24965, 24971, 24975, - 24981, 24987, 24991, 24997, 25001, 25005, 25009, 25013, 25017, 25021, - 25027, 25030, 25034, 25038, 25044, 25048, 25054, 25058, 25064, 25068, - 25074, 25078, 25084, 25088, 25094, 25098, 25104, 25110, 25114, 25120, - 25124, 25130, 25136, 25140, 25144, 25148, 25152, 25156, 25160, 25166, - 25169, 25173, 25177, 25183, 25187, 25193, 25197, 25203, 25209, 25213, - 25218, 25222, 25226, 25230, 25234, 25238, 25242, 25246, 25252, 25255, - 25259, 25263, 25269, 25273, 25279, 25283, 25289, 25293, 25299, 25303, - 25309, 25313, 25319, 25323, 25329, 25332, 25337, 25342, 25346, 25350, - 25354, 25358, 25362, 25366, 25372, 25375, 25379, 25383, 25389, 25393, - 25399, 25403, 25409, 25413, 25419, 25423, 25429, 25433, 25439, 25443, - 25449, 25455, 25459, 25465, 25469, 25475, 25481, 25487, 25493, 25499, - 25505, 25511, 25517, 25521, 25525, 25529, 25533, 25537, 25541, 25545, - 25549, 25555, 25559, 25565, 25569, 25575, 25579, 25585, 25589, 25595, - 25599, 25605, 25609, 25615, 25619, 25623, 25627, 25631, 25635, 25639, - 25643, 25649, 25652, 25656, 25660, 25666, 25670, 25676, 25680, 25686, - 25690, 25696, 25700, 25706, 25710, 25716, 25720, 25726, 25732, 25736, - 25742, 25748, 25754, 25758, 25764, 25770, 25774, 25778, 25782, 25786, - 25790, 25796, 25799, 25803, 25808, 25812, 25818, 25821, 25826, 25831, - 25835, 25839, 25843, 25847, 25851, 25855, 25859, 25863, 25867, 25873, - 25877, 25881, 25887, 25891, 25897, 25901, 25907, 25911, 25915, 25919, - 25923, 25927, 25933, 25937, 25941, 25945, 25949, 25953, 25957, 25961, - 25965, 25969, 25973, 25979, 25985, 25991, 25997, 26003, 26008, 26014, - 26020, 26026, 26030, 26034, 26038, 26042, 26046, 26050, 26054, 26058, - 26062, 26066, 26070, 26074, 26078, 26084, 26090, 26096, 26101, 26105, - 26109, 26113, 26117, 26121, 26125, 26129, 26133, 26137, 26143, 26149, - 26155, 26161, 26167, 26173, 26179, 26185, 26191, 26195, 26199, 26203, - 26207, 26211, 26215, 26219, 26225, 26231, 26237, 26243, 26249, 26255, - 26261, 26267, 26273, 26278, 26283, 26288, 26293, 26299, 26305, 26311, - 26317, 26323, 26329, 26335, 26340, 26346, 26352, 26358, 26363, 26369, - 26375, 26381, 26386, 26391, 26396, 26401, 26406, 26411, 26416, 26421, - 26426, 26431, 26436, 26441, 26445, 26450, 26455, 26460, 26465, 26470, - 26475, 26480, 26485, 26490, 26495, 26500, 26505, 26510, 26515, 26520, - 26525, 26530, 26535, 26540, 26545, 26550, 26555, 26560, 26565, 26570, - 26575, 26580, 26585, 26590, 26594, 26599, 26604, 26609, 26614, 26619, - 26624, 26629, 26634, 26639, 26644, 26649, 26654, 26659, 26664, 26669, - 26674, 26679, 26684, 26689, 26694, 26699, 26704, 26709, 26714, 26719, - 26723, 26728, 26733, 26738, 26743, 26748, 26752, 26757, 26762, 26767, - 26772, 26777, 26781, 26786, 26792, 26797, 26802, 26807, 26812, 26818, - 26823, 26828, 26833, 26838, 26843, 26848, 26853, 26858, 26863, 26868, - 26873, 26878, 26882, 26887, 26892, 26897, 26902, 26907, 26912, 26917, - 26922, 26927, 26932, 26937, 26942, 26947, 26952, 26957, 26962, 26967, - 26972, 26977, 26982, 26987, 26992, 26997, 27002, 27007, 27012, 27017, - 27022, 27027, 27032, 27037, 27043, 27048, 27053, 27058, 27063, 27068, - 27073, 27078, 27083, 27088, 27093, 27098, 27102, 27107, 27112, 27117, - 27122, 27127, 27132, 27137, 27142, 27147, 27152, 27157, 27162, 27167, - 27172, 27177, 27182, 27187, 27192, 27197, 27202, 27207, 27212, 27217, - 27222, 27227, 27232, 27238, 27242, 27246, 27250, 27254, 27258, 27262, - 27266, 27270, 27276, 27282, 27288, 27294, 27300, 27306, 27312, 27319, - 27325, 27330, 27335, 27340, 27345, 27350, 27355, 27360, 27365, 27370, - 27375, 27380, 27385, 27390, 27395, 27400, 27405, 27410, 27415, 27420, - 27425, 27430, 27435, 27440, 27445, 27450, 27455, 27460, 27465, 0, 0, 0, - 27472, 27483, 27488, 27496, 27501, 27506, 27511, 27520, 27525, 27531, - 27537, 27543, 27548, 27554, 27560, 27564, 27569, 27574, 27584, 27589, - 27594, 27601, 27606, 27611, 27620, 27625, 27634, 27641, 27648, 27655, - 27662, 27673, 27680, 27685, 27695, 27699, 27706, 27711, 27718, 27724, - 27731, 27740, 27747, 27754, 27763, 27770, 27775, 27780, 27791, 27798, - 27803, 27814, 27821, 27826, 27831, 27839, 27848, 27855, 27862, 27872, - 27877, 27882, 27887, 27896, 27904, 27909, 27914, 27919, 27924, 27929, - 27934, 27939, 27944, 27949, 27954, 27959, 27965, 27971, 27977, 27982, - 27987, 27992, 27997, 28002, 28007, 28016, 28025, 28034, 28043, 0, 0, 0, - 0, 0, 0, 0, 28052, 28056, 28060, 28064, 28068, 28073, 28078, 28082, - 28087, 28091, 28095, 28100, 28104, 0, 28108, 28112, 28117, 28121, 28125, - 28130, 28135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28140, 28144, 28148, - 28152, 28156, 28161, 28166, 28170, 28175, 28179, 28183, 28188, 28192, - 28196, 28200, 28204, 28209, 28213, 28217, 28222, 28227, 28232, 28238, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 28243, 28247, 28251, 28255, 28259, 28264, 28269, - 28273, 28278, 28282, 28286, 28291, 28295, 28299, 28303, 28307, 28312, - 28316, 28320, 28325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28330, 28334, - 28338, 28342, 28346, 28351, 28356, 28360, 28365, 28369, 28373, 28378, - 28382, 0, 28386, 28390, 28395, 0, 28399, 28404, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 28409, 28412, 28416, 28420, 28424, 28428, 28432, 28436, - 28440, 28444, 28448, 28452, 28456, 28460, 28464, 28468, 28471, 28475, - 28478, 28482, 28486, 28490, 28494, 28498, 28502, 28506, 28510, 28514, - 28518, 28522, 28526, 28530, 28533, 28536, 28539, 28543, 28549, 28555, - 28561, 28567, 28573, 28579, 28585, 28591, 28597, 28603, 28609, 28615, - 28621, 28627, 28636, 28645, 28651, 28657, 28663, 28668, 28672, 28677, - 28682, 28687, 28691, 28696, 28701, 28706, 28710, 28715, 28719, 28724, - 28729, 28734, 28739, 28743, 28747, 28751, 28755, 28759, 28763, 28767, - 28771, 28775, 28779, 28785, 28789, 28793, 28797, 28801, 28805, 28813, - 28819, 28823, 28829, 28833, 28839, 28843, 0, 0, 28847, 28851, 28854, - 28857, 28860, 28863, 28866, 28869, 28872, 28875, 0, 0, 0, 0, 0, 0, 28878, - 28886, 28894, 28902, 28910, 28918, 28926, 28934, 28942, 28950, 0, 0, 0, - 0, 0, 0, 28958, 28961, 28964, 28967, 28972, 28975, 28980, 28987, 28995, - 29000, 29007, 29010, 29017, 29024, 29031, 0, 29035, 29039, 29042, 29045, - 29048, 29051, 29054, 29057, 29060, 29063, 0, 0, 0, 0, 0, 0, 29066, 29069, - 29072, 29075, 29078, 29081, 29085, 29089, 29093, 29096, 29100, 29104, - 29107, 29111, 29115, 29118, 29121, 29124, 29128, 29131, 29135, 29139, - 29143, 29146, 29149, 29153, 29157, 29160, 29164, 29168, 29172, 29176, - 29180, 29184, 29188, 29192, 29199, 29204, 29209, 29214, 29219, 29225, - 29231, 29237, 29243, 29248, 29254, 29260, 29265, 29270, 29276, 29282, - 29288, 29294, 29299, 29305, 29310, 29316, 29322, 29328, 29334, 29340, - 29345, 29350, 29356, 29362, 29367, 29373, 29378, 29384, 29389, 29394, - 29400, 29405, 29411, 29417, 29423, 29429, 29435, 29441, 29447, 29453, - 29459, 29465, 29470, 29475, 29480, 29486, 29492, 0, 0, 0, 0, 0, 0, 0, - 29500, 29509, 29518, 29526, 29534, 29544, 29552, 29561, 29568, 29575, - 29582, 29590, 29598, 29606, 29614, 29622, 29630, 29637, 29645, 29652, - 29660, 29668, 29676, 29684, 29692, 29701, 29711, 29721, 29731, 29741, - 29751, 29761, 29771, 29780, 29790, 29800, 29810, 29820, 29830, 29838, - 29846, 29856, 29864, 0, 0, 0, 0, 0, 29874, 29878, 29882, 29886, 29890, - 29894, 29898, 29902, 29906, 29910, 29914, 29918, 29922, 29926, 29930, - 29934, 29938, 29942, 29946, 29950, 29954, 29958, 29962, 29966, 29972, - 29976, 29982, 29986, 29992, 29996, 30002, 30006, 30010, 30014, 30018, - 30022, 30026, 30032, 30038, 30044, 30050, 30056, 30062, 30068, 30074, - 30080, 30086, 30092, 30099, 30105, 30111, 30117, 30121, 30125, 30129, - 30133, 30137, 30141, 30145, 30151, 30157, 30163, 30168, 30175, 30180, - 30185, 30191, 30196, 30203, 30210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30217, - 30223, 30227, 30232, 30237, 30242, 30247, 30252, 30257, 30262, 30267, - 30272, 30276, 30281, 30286, 30291, 30295, 30299, 30304, 30309, 30314, - 30318, 30322, 30326, 30330, 30335, 30340, 30345, 30349, 30353, 30358, 0, - 30363, 30368, 30373, 30378, 30384, 30390, 30396, 30402, 30407, 30412, - 30418, 30424, 0, 0, 0, 0, 30431, 30436, 30442, 30448, 30453, 30458, - 30463, 30468, 30473, 30478, 30483, 30488, 0, 0, 0, 0, 30493, 0, 0, 0, - 30498, 30503, 30508, 30513, 30517, 30521, 30525, 30529, 30533, 30537, - 30541, 30545, 30549, 30554, 30560, 30566, 30572, 30577, 30582, 30587, - 30593, 30598, 30603, 30609, 30614, 30620, 30626, 30631, 30637, 30643, - 30649, 30654, 30659, 30664, 30670, 30676, 30681, 30687, 30692, 30698, - 30703, 30709, 0, 0, 30715, 30721, 30727, 30733, 30739, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 30745, 30754, 30763, 30771, 30780, 30789, 30797, 30806, - 30815, 30824, 30832, 30840, 30849, 30857, 30865, 30873, 30882, 30890, - 30898, 30907, 30915, 30923, 30932, 30940, 30948, 30957, 30965, 30974, - 30983, 30991, 31000, 31009, 31017, 31025, 31034, 31043, 31051, 31060, - 31069, 31078, 31087, 31096, 31105, 31114, 0, 0, 0, 0, 31123, 31133, - 31142, 31151, 31159, 31168, 31176, 31185, 31193, 31202, 31211, 31220, - 31229, 31238, 31247, 31256, 31265, 31274, 31283, 31292, 31301, 31310, - 31319, 31328, 31337, 31345, 0, 0, 0, 0, 0, 0, 31353, 31361, 31368, 31375, - 31382, 31389, 31396, 31403, 31410, 31417, 31424, 0, 0, 0, 31432, 31440, - 31448, 31452, 31458, 31464, 31470, 31476, 31482, 31488, 31494, 31500, - 31506, 31512, 31518, 31524, 31530, 31536, 31542, 31546, 31552, 31558, - 31564, 31570, 31576, 31582, 31588, 31594, 31600, 31606, 31612, 31618, - 31624, 31630, 31636, 31640, 31645, 31650, 31655, 31659, 31664, 31668, - 31673, 31677, 31682, 31686, 31691, 31696, 31701, 31706, 31711, 31715, - 31719, 31723, 31728, 31732, 31736, 31740, 31745, 31750, 31755, 31760, 0, - 0, 31766, 31770, 31777, 31782, 31788, 31794, 31799, 31805, 31811, 31816, - 31822, 31828, 31834, 31839, 31845, 31850, 31855, 31861, 31866, 31872, - 31877, 31882, 31888, 31893, 31899, 31903, 31908, 31913, 31919, 31925, - 31930, 31936, 31942, 31946, 31951, 31956, 31960, 31965, 31969, 31974, - 31979, 31985, 31991, 31996, 32001, 32006, 32010, 32015, 32019, 32024, - 32028, 32033, 32038, 32043, 32048, 32054, 32061, 32068, 32078, 32087, - 32094, 32100, 32111, 32116, 32122, 0, 32127, 32132, 32137, 32145, 32151, - 32159, 32164, 32170, 32176, 32182, 32187, 32193, 32198, 32205, 32211, - 32216, 32222, 32228, 32234, 32241, 32248, 32255, 32260, 32265, 32272, - 32279, 32286, 32293, 32300, 0, 0, 32307, 32314, 32321, 32327, 32333, - 32339, 32345, 32351, 32357, 32363, 32369, 0, 0, 0, 0, 0, 0, 32375, 32381, - 32386, 32391, 32396, 32401, 32406, 32411, 32416, 32421, 0, 0, 0, 0, 0, 0, - 32426, 32431, 32436, 32441, 32446, 32451, 32456, 32465, 32472, 32477, - 32482, 32487, 32492, 32497, 0, 0, 32502, 32509, 32512, 32515, 32519, - 32524, 32528, 32534, 32538, 32543, 32550, 32558, 32562, 32567, 32571, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18379, 18384, 0, 18391, 0, 18398, + 18405, 18410, 18415, 18422, 0, 18429, 18436, 18441, 18448, 18455, 18462, + 18469, 18476, 18483, 18488, 18492, 18499, 18506, 18513, 18518, 18523, + 18528, 18535, 18542, 18549, 18556, 18563, 18568, 18573, 0, 18580, 0, + 18587, 18592, 18599, 18606, 18613, 18620, 18627, 18631, 18638, 18642, + 18647, 18655, 18661, 18667, 18672, 18678, 18684, 18690, 18695, 18701, + 18708, 18716, 18723, 0, 0, 18730, 18735, 18741, 18746, 18752, 0, 18758, + 0, 18763, 18770, 18777, 18784, 18791, 18796, 0, 0, 18800, 18805, 18809, + 18813, 18817, 18821, 18825, 18829, 18833, 18837, 0, 0, 18841, 18847, + 18853, 18860, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18867, 18871, 18882, 18897, 18912, + 18922, 18933, 18946, 18957, 18963, 18971, 18981, 18987, 18995, 18999, + 19005, 19011, 19019, 19029, 19037, 19050, 19056, 19064, 19072, 19084, + 19091, 19099, 19107, 19115, 19123, 19131, 19139, 19149, 19153, 19156, + 19159, 19162, 19165, 19168, 19171, 19174, 19177, 19180, 19184, 19188, + 19192, 19196, 19200, 19204, 19208, 19212, 19216, 19221, 19227, 19237, + 19251, 19261, 19267, 19273, 19281, 19289, 19297, 19305, 19311, 19317, + 19320, 19324, 19328, 19332, 19336, 19340, 19344, 0, 19348, 19352, 19356, + 19360, 19364, 19368, 19372, 19375, 19379, 19383, 19387, 19390, 19393, + 19397, 19401, 19405, 19408, 19412, 19416, 19420, 19424, 19428, 19432, + 19436, 19440, 19443, 19446, 19449, 19453, 19457, 19460, 19463, 19466, + 19470, 19475, 19479, 0, 0, 0, 0, 19483, 19488, 19492, 19497, 19501, + 19506, 19511, 19517, 19522, 19528, 19532, 19537, 19541, 19546, 19556, + 19562, 19568, 19575, 19585, 19591, 19595, 19599, 19605, 19611, 19619, + 19625, 19633, 19641, 19649, 19659, 19667, 19677, 19682, 19688, 19694, + 19700, 19706, 19712, 19718, 0, 19724, 19730, 19736, 19742, 19748, 19754, + 19760, 19765, 19771, 19777, 19783, 19788, 19793, 19799, 19805, 19811, + 19816, 19822, 19828, 19834, 19840, 19846, 19852, 19858, 19864, 19869, + 19874, 19879, 19885, 19891, 19896, 19901, 19906, 19912, 19920, 19927, 0, + 19934, 19941, 19954, 19961, 19968, 19976, 19984, 19990, 19996, 20002, + 20012, 20017, 20023, 20033, 20043, 0, 20053, 20063, 20071, 20083, 20095, + 20101, 20115, 20130, 20135, 20140, 20148, 20156, 20164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 20172, 20175, 20179, 20183, 20187, 20191, 20195, + 20199, 20203, 20207, 20211, 20215, 20219, 20223, 20227, 20231, 20235, + 20238, 20242, 20246, 20250, 20253, 20256, 20260, 20264, 20268, 20271, + 20274, 20277, 20280, 20284, 20287, 20290, 20294, 20297, 20302, 20305, + 20309, 20312, 20316, 20319, 20324, 20327, 20331, 20338, 20343, 20347, + 20352, 20356, 20361, 20365, 20370, 20377, 20383, 20389, 20393, 20397, + 20401, 20405, 20409, 20415, 20421, 20428, 20434, 20439, 20443, 20446, + 20449, 20452, 20455, 20458, 20461, 20464, 20467, 20470, 20476, 20480, + 20484, 20488, 20492, 20496, 20500, 20504, 20508, 20513, 20517, 20522, + 20527, 20533, 20538, 20544, 20550, 20556, 20562, 20568, 20576, 20584, + 20592, 20600, 20609, 20618, 20629, 20639, 20649, 20660, 20671, 20681, + 20691, 20701, 20711, 20721, 20731, 20741, 20751, 20759, 20766, 20772, + 20779, 20784, 20790, 20796, 20802, 20808, 20814, 20820, 20825, 20831, + 20837, 20843, 20849, 20854, 20863, 20870, 20876, 20884, 20892, 20898, + 20904, 20910, 20916, 20924, 20932, 20942, 20950, 20958, 20964, 20969, + 20974, 20979, 20984, 20989, 20994, 20999, 21004, 21009, 21015, 21021, + 21027, 21034, 21039, 21045, 21050, 21055, 21060, 21065, 21070, 21075, + 21080, 21085, 21090, 21095, 21100, 21105, 21110, 21115, 21120, 21125, + 21130, 21135, 21140, 21145, 21150, 21155, 21160, 21165, 21170, 21175, + 21180, 21185, 21190, 21195, 21200, 21205, 21210, 21215, 21220, 21225, + 21230, 0, 21235, 0, 0, 0, 0, 0, 21240, 0, 0, 21245, 21249, 21253, 21257, + 21261, 21265, 21269, 21273, 21277, 21281, 21285, 21289, 21293, 21297, + 21301, 21305, 21309, 21313, 21317, 21321, 21325, 21329, 21333, 21337, + 21341, 21345, 21349, 21353, 21357, 21361, 21365, 21369, 21373, 21377, + 21381, 21385, 21389, 21393, 21397, 21401, 21405, 21409, 21414, 21418, + 21423, 21428, 21432, 21437, 21442, 21446, 21450, 21454, 21458, 21462, + 21466, 21470, 21474, 21478, 21482, 21486, 21490, 21494, 21498, 21502, + 21506, 21510, 21514, 21518, 21522, 21526, 21530, 21534, 21538, 21542, + 21546, 21550, 21554, 21558, 21562, 21566, 21570, 21574, 21578, 21582, + 21586, 21590, 21594, 21598, 21602, 21606, 21610, 21614, 21618, 21622, + 21626, 21630, 21634, 21638, 21642, 21646, 21650, 21654, 21658, 21662, + 21666, 21670, 21674, 21678, 21682, 21686, 21690, 21694, 21698, 21702, + 21706, 21710, 21714, 21718, 21722, 21726, 21730, 21734, 21738, 21742, + 21746, 21750, 21754, 21758, 21762, 21766, 21770, 21774, 21778, 21782, + 21786, 21790, 21794, 21798, 21802, 21806, 21810, 21814, 21818, 21822, + 21826, 21831, 21835, 21840, 21844, 21849, 21854, 21858, 21863, 21868, + 21872, 21877, 21882, 21887, 21892, 21896, 21901, 21906, 21911, 21916, + 21921, 21926, 21930, 21935, 21940, 21945, 21950, 21955, 21960, 21965, + 21970, 21975, 21980, 21985, 21990, 21995, 22000, 22005, 22010, 22015, + 22020, 22025, 22030, 22035, 22040, 22045, 22050, 22055, 22060, 22065, + 22070, 22075, 22080, 22085, 22090, 22095, 22100, 22105, 22110, 22115, + 22120, 22125, 22130, 22135, 22140, 22145, 22150, 22155, 22160, 22165, + 22170, 22175, 22180, 22184, 22188, 22192, 22196, 22200, 22204, 22208, + 22212, 22216, 22220, 22224, 22228, 22232, 22236, 22240, 22244, 22248, + 22252, 22256, 22260, 22264, 22268, 22272, 22276, 22280, 22284, 22288, + 22292, 22296, 22300, 22304, 22308, 22312, 22316, 22320, 22324, 22328, + 22332, 22336, 22340, 22344, 22348, 22352, 22356, 22360, 22364, 22368, + 22372, 22376, 22380, 22384, 22388, 22392, 22396, 22400, 22404, 22408, + 22412, 22416, 22420, 22424, 22428, 22432, 22436, 22440, 22444, 22448, + 22452, 22456, 22460, 22464, 22468, 22472, 22476, 22480, 22484, 22488, + 22492, 22496, 22500, 22504, 22508, 22512, 22516, 22520, 22524, 22528, + 22532, 22535, 22539, 22543, 22547, 22551, 22555, 22559, 22563, 22566, + 22570, 22574, 22578, 22582, 22586, 22590, 22594, 22598, 22602, 22606, + 22610, 22614, 22618, 22622, 22626, 22629, 22633, 22637, 22641, 22645, + 22649, 22653, 22657, 22661, 22665, 22669, 22673, 22677, 22681, 22685, + 22689, 22692, 22696, 22700, 22704, 22708, 22712, 22716, 22720, 22723, + 22727, 22731, 22735, 22739, 22743, 22747, 22751, 22755, 22759, 22763, + 22767, 22771, 22775, 22779, 22783, 22787, 22791, 22795, 22799, 22803, + 22807, 22811, 22815, 0, 22819, 22823, 22827, 22831, 0, 0, 22835, 22839, + 22843, 22847, 22851, 22855, 22859, 0, 22863, 0, 22867, 22871, 22875, + 22879, 0, 0, 22883, 22887, 22891, 22895, 22899, 22903, 22907, 22911, + 22915, 22919, 22923, 22927, 22931, 22935, 22939, 22943, 22947, 22950, + 22954, 22958, 22962, 22966, 22970, 22973, 22977, 22981, 22985, 22989, + 22993, 22997, 23001, 23005, 23009, 23013, 23017, 23021, 23025, 23029, + 23033, 23037, 23041, 0, 23045, 23049, 23053, 23057, 0, 0, 23061, 23064, + 23068, 23072, 23076, 23080, 23084, 23088, 23092, 23096, 23100, 23104, + 23108, 23112, 23116, 23120, 23124, 23129, 23134, 23139, 23145, 23151, + 23156, 23161, 23167, 23170, 23174, 23178, 23182, 23186, 23190, 23194, + 23198, 0, 23202, 23206, 23210, 23214, 0, 0, 23218, 23222, 23226, 23230, + 23234, 23238, 23242, 0, 23246, 0, 23250, 23254, 23258, 23262, 0, 0, + 23266, 23270, 23274, 23278, 23282, 23286, 23290, 23294, 23298, 23303, + 23308, 23313, 23319, 23325, 23330, 0, 23335, 23339, 23343, 23347, 23351, + 23355, 23359, 23363, 23367, 23371, 23375, 23379, 23383, 23387, 23391, + 23395, 23399, 23402, 23406, 23410, 23414, 23418, 23422, 23426, 23430, + 23434, 23438, 23442, 23446, 23450, 23454, 23458, 23462, 23466, 23470, + 23474, 23478, 23482, 23486, 23490, 23494, 23498, 23502, 23506, 23510, + 23514, 23518, 23522, 23526, 23530, 23534, 23538, 23542, 23546, 23550, + 23554, 23558, 0, 23562, 23566, 23570, 23574, 0, 0, 23578, 23582, 23586, + 23590, 23594, 23598, 23602, 23606, 23610, 23614, 23618, 23622, 23626, + 23630, 23634, 23638, 23642, 23646, 23650, 23654, 23658, 23662, 23666, + 23670, 23674, 23678, 23682, 23686, 23690, 23694, 23698, 23702, 23706, + 23710, 23714, 23718, 23722, 23726, 23730, 23734, 23738, 23742, 23746, + 23750, 23754, 23758, 23762, 23766, 23770, 23774, 23778, 23782, 23786, + 23790, 23794, 23798, 23802, 23805, 23809, 23813, 23817, 23821, 23825, + 23829, 23833, 23837, 23841, 0, 0, 23845, 23854, 23860, 23865, 23869, + 23872, 23877, 23880, 23883, 23886, 23891, 23895, 23900, 23903, 23906, + 23909, 23912, 23915, 23918, 23921, 23924, 23927, 23931, 23935, 23939, + 23943, 23947, 23951, 23955, 23959, 23963, 23967, 0, 0, 0, 23972, 23978, + 23982, 23986, 23990, 23996, 24000, 24004, 24008, 24014, 24018, 24022, + 24026, 24032, 24036, 24040, 24044, 24050, 24056, 24062, 24070, 24076, + 24082, 24088, 24094, 24100, 0, 0, 0, 0, 0, 0, 24106, 24109, 24112, 24115, + 24118, 24121, 24125, 24129, 24132, 24136, 24140, 24144, 24148, 24152, + 24155, 24159, 24163, 24167, 24171, 24175, 24178, 24182, 24186, 24190, + 24194, 24198, 24201, 24205, 24209, 24213, 24217, 24220, 24224, 24228, + 24232, 24236, 24240, 24244, 24248, 24252, 24256, 24260, 24264, 24268, + 24272, 24275, 24279, 24283, 24287, 24291, 24295, 24299, 24303, 24306, + 24310, 24314, 24318, 24322, 24326, 24330, 24334, 24338, 24342, 24346, + 24350, 24354, 24358, 24362, 24366, 24370, 24374, 24378, 24382, 24386, + 24390, 24394, 24398, 24402, 24406, 24410, 24413, 24417, 24421, 24425, + 24429, 24433, 0, 0, 24437, 24442, 24447, 24452, 24457, 24462, 0, 0, + 24467, 24471, 24474, 24478, 24481, 24485, 24488, 24492, 24498, 24503, + 24507, 24510, 24514, 24518, 24524, 24528, 24534, 24538, 24544, 24548, + 24554, 24558, 24564, 24570, 24574, 24580, 24584, 24590, 24596, 24600, + 24606, 24612, 24617, 24622, 24630, 24638, 24645, 24650, 24656, 24665, + 24671, 24679, 24684, 24690, 24694, 24698, 24702, 24706, 24710, 24714, + 24718, 24722, 24726, 24730, 24736, 24741, 24746, 24749, 24753, 24757, + 24763, 24767, 24773, 24777, 24783, 24787, 24793, 24797, 24803, 24807, + 24813, 24817, 24823, 24829, 24833, 24839, 24844, 24848, 24852, 24856, + 24860, 24863, 24867, 24873, 24878, 24883, 24886, 24890, 24894, 24900, + 24904, 24910, 24914, 24920, 24923, 24928, 24932, 24938, 24942, 24948, + 24952, 24958, 24964, 24968, 24972, 24976, 24980, 24984, 24988, 24992, + 24996, 25000, 25004, 25008, 25014, 25017, 25021, 25025, 25031, 25035, + 25041, 25045, 25051, 25055, 25061, 25065, 25071, 25075, 25081, 25085, + 25091, 25097, 25101, 25105, 25111, 25117, 25123, 25129, 25133, 25137, + 25141, 25145, 25149, 25153, 25159, 25163, 25167, 25171, 25177, 25181, + 25187, 25191, 25197, 25201, 25207, 25211, 25217, 25221, 25227, 25231, + 25237, 25243, 25247, 25253, 25257, 25261, 25265, 25269, 25273, 25277, + 25283, 25286, 25290, 25294, 25300, 25304, 25310, 25314, 25320, 25324, + 25330, 25334, 25340, 25344, 25350, 25354, 25360, 25366, 25370, 25376, + 25380, 25386, 25392, 25396, 25400, 25404, 25408, 25412, 25416, 25422, + 25425, 25429, 25433, 25439, 25443, 25449, 25453, 25459, 25465, 25469, + 25474, 25478, 25482, 25486, 25490, 25494, 25498, 25502, 25508, 25511, + 25515, 25519, 25525, 25529, 25535, 25539, 25545, 25549, 25555, 25559, + 25565, 25569, 25575, 25579, 25585, 25588, 25593, 25598, 25602, 25606, + 25610, 25614, 25618, 25622, 25628, 25631, 25635, 25639, 25645, 25649, + 25655, 25659, 25665, 25669, 25675, 25679, 25685, 25689, 25695, 25699, + 25705, 25711, 25715, 25721, 25725, 25731, 25737, 25743, 25749, 25755, + 25761, 25767, 25773, 25777, 25781, 25785, 25789, 25793, 25797, 25801, + 25805, 25811, 25815, 25821, 25825, 25831, 25835, 25841, 25845, 25851, + 25855, 25861, 25865, 25871, 25875, 25879, 25883, 25887, 25891, 25895, + 25899, 25905, 25908, 25912, 25916, 25922, 25926, 25932, 25936, 25942, + 25946, 25952, 25956, 25962, 25966, 25972, 25976, 25982, 25988, 25992, + 25998, 26004, 26010, 26014, 26020, 26026, 26030, 26034, 26038, 26042, + 26046, 26052, 26055, 26059, 26064, 26068, 26074, 26077, 26082, 26087, + 26091, 26095, 26099, 26103, 26107, 26111, 26115, 26119, 26123, 26129, + 26133, 26137, 26143, 26147, 26153, 26157, 26163, 26167, 26171, 26175, + 26179, 26183, 26189, 26193, 26197, 26201, 26205, 26209, 26213, 26217, + 26221, 26225, 26229, 26235, 26241, 26247, 26253, 26259, 26264, 26270, + 26276, 26282, 26286, 26290, 26294, 26298, 26302, 26306, 26310, 26314, + 26318, 26322, 26326, 26330, 26334, 26340, 26346, 26352, 26357, 26361, + 26365, 26369, 26373, 26377, 26381, 26385, 26389, 26393, 26399, 26405, + 26411, 26417, 26423, 26429, 26435, 26441, 26447, 26451, 26455, 26459, + 26463, 26467, 26471, 26475, 26481, 26487, 26493, 26499, 26505, 26511, + 26517, 26523, 26529, 26534, 26539, 26544, 26549, 26555, 26561, 26567, + 26573, 26579, 26585, 26591, 26596, 26602, 26608, 26614, 26619, 26625, + 26631, 26637, 26642, 26647, 26652, 26657, 26662, 26667, 26672, 26677, + 26682, 26687, 26692, 26697, 26701, 26706, 26711, 26716, 26721, 26726, + 26731, 26736, 26741, 26746, 26751, 26756, 26761, 26766, 26771, 26776, + 26781, 26786, 26791, 26796, 26801, 26806, 26811, 26816, 26821, 26826, + 26831, 26836, 26841, 26846, 26850, 26855, 26860, 26865, 26870, 26875, + 26880, 26885, 26890, 26895, 26900, 26905, 26910, 26915, 26920, 26925, + 26930, 26935, 26940, 26945, 26950, 26955, 26960, 26965, 26970, 26975, + 26979, 26984, 26989, 26994, 26999, 27004, 27008, 27013, 27018, 27023, + 27028, 27033, 27037, 27042, 27048, 27053, 27058, 27063, 27068, 27074, + 27079, 27084, 27089, 27094, 27099, 27104, 27109, 27114, 27119, 27124, + 27129, 27134, 27138, 27143, 27148, 27153, 27158, 27163, 27168, 27173, + 27178, 27183, 27188, 27193, 27198, 27203, 27208, 27213, 27218, 27223, + 27228, 27233, 27238, 27243, 27248, 27253, 27258, 27263, 27268, 27273, + 27278, 27283, 27288, 27293, 27299, 27304, 27309, 27314, 27319, 27324, + 27329, 27334, 27339, 27344, 27349, 27354, 27358, 27363, 27368, 27373, + 27378, 27383, 27388, 27393, 27398, 27403, 27408, 27413, 27418, 27423, + 27428, 27433, 27438, 27443, 27448, 27453, 27458, 27463, 27468, 27473, + 27478, 27483, 27488, 27494, 27498, 27502, 27506, 27510, 27514, 27518, + 27522, 27526, 27532, 27538, 27544, 27550, 27556, 27562, 27568, 27575, + 27581, 27586, 27591, 27596, 27601, 27606, 27611, 27616, 27621, 27626, + 27631, 27636, 27641, 27646, 27651, 27656, 27661, 27666, 27671, 27676, + 27681, 27686, 27691, 27696, 27701, 27706, 27711, 27716, 27721, 0, 0, 0, + 27728, 27739, 27744, 27752, 27757, 27762, 27767, 27776, 27781, 27787, + 27793, 27799, 27804, 27810, 27816, 27820, 27825, 27830, 27840, 27845, + 27850, 27857, 27862, 27867, 27876, 27881, 27890, 27897, 27904, 27911, + 27918, 27929, 27936, 27941, 27951, 27955, 27962, 27967, 27974, 27980, + 27987, 27996, 28003, 28010, 28019, 28026, 28031, 28036, 28047, 28054, + 28059, 28070, 28077, 28082, 28087, 28095, 28104, 28111, 28118, 28128, + 28133, 28138, 28143, 28152, 28160, 28165, 28170, 28175, 28180, 28185, + 28190, 28195, 28200, 28205, 28210, 28215, 28221, 28227, 28233, 28238, + 28243, 28248, 28253, 28258, 28263, 28272, 28281, 28290, 28299, 0, 0, 0, + 0, 0, 0, 0, 28308, 28312, 28316, 28320, 28324, 28329, 28334, 28338, + 28343, 28347, 28351, 28356, 28360, 0, 28364, 28368, 28373, 28377, 28381, + 28386, 28391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28396, 28400, 28404, + 28408, 28412, 28417, 28422, 28426, 28431, 28435, 28439, 28444, 28448, + 28452, 28456, 28460, 28465, 28469, 28473, 28478, 28483, 28488, 28494, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 28499, 28503, 28507, 28511, 28515, 28520, 28525, + 28529, 28534, 28538, 28542, 28547, 28551, 28555, 28559, 28563, 28568, + 28572, 28576, 28581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28586, 28590, + 28594, 28598, 28602, 28607, 28612, 28616, 28621, 28625, 28629, 28634, + 28638, 0, 28642, 28646, 28651, 0, 28655, 28660, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 28665, 28668, 28672, 28676, 28680, 28684, 28688, 28692, + 28696, 28700, 28704, 28708, 28712, 28716, 28720, 28724, 28727, 28731, + 28734, 28738, 28742, 28746, 28750, 28754, 28758, 28762, 28766, 28770, + 28774, 28778, 28782, 28786, 28789, 28792, 28795, 28799, 28805, 28811, + 28817, 28823, 28829, 28835, 28841, 28847, 28853, 28859, 28865, 28871, + 28877, 28883, 28892, 28901, 28907, 28913, 28919, 28924, 28928, 28933, + 28938, 28943, 28947, 28952, 28957, 28962, 28966, 28971, 28975, 28980, + 28985, 28990, 28995, 28999, 29003, 29007, 29011, 29015, 29019, 29023, + 29027, 29031, 29035, 29041, 29045, 29049, 29053, 29057, 29061, 29069, + 29075, 29079, 29085, 29089, 29095, 29099, 0, 0, 29103, 29107, 29110, + 29113, 29116, 29119, 29122, 29125, 29128, 29131, 0, 0, 0, 0, 0, 0, 29134, + 29142, 29150, 29158, 29166, 29174, 29182, 29190, 29198, 29206, 0, 0, 0, + 0, 0, 0, 29214, 29217, 29220, 29223, 29228, 29231, 29236, 29243, 29251, + 29256, 29263, 29266, 29273, 29280, 29287, 0, 29291, 29295, 29298, 29301, + 29304, 29307, 29310, 29313, 29316, 29319, 0, 0, 0, 0, 0, 0, 29322, 29325, + 29328, 29331, 29334, 29337, 29341, 29345, 29349, 29352, 29356, 29360, + 29363, 29367, 29371, 29374, 29377, 29380, 29384, 29387, 29391, 29395, + 29399, 29402, 29405, 29409, 29413, 29416, 29420, 29424, 29428, 29432, + 29436, 29440, 29444, 29448, 29455, 29460, 29465, 29470, 29475, 29481, + 29487, 29493, 29499, 29504, 29510, 29516, 29521, 29526, 29532, 29538, + 29544, 29550, 29555, 29561, 29566, 29572, 29578, 29584, 29590, 29596, + 29601, 29606, 29612, 29618, 29623, 29629, 29634, 29640, 29645, 29650, + 29656, 29661, 29667, 29673, 29679, 29685, 29691, 29697, 29703, 29709, + 29715, 29721, 29726, 29731, 29736, 29742, 29748, 0, 0, 0, 0, 0, 0, 0, + 29756, 29765, 29774, 29782, 29790, 29800, 29808, 29817, 29824, 29831, + 29838, 29846, 29854, 29862, 29870, 29878, 29886, 29893, 29901, 29908, + 29916, 29924, 29932, 29940, 29948, 29957, 29967, 29977, 29987, 29997, + 30007, 30017, 30027, 30036, 30046, 30056, 30066, 30076, 30086, 30094, + 30102, 30112, 30120, 0, 0, 0, 0, 0, 30130, 30134, 30138, 30142, 30146, + 30150, 30154, 30158, 30162, 30166, 30170, 30174, 30178, 30182, 30186, + 30190, 30194, 30198, 30202, 30206, 30210, 30214, 30218, 30222, 30228, + 30232, 30238, 30242, 30248, 30252, 30258, 30262, 30266, 30270, 30274, + 30278, 30282, 30288, 30294, 30300, 30306, 30312, 30318, 30324, 30330, + 30336, 30342, 30348, 30355, 30361, 30367, 30373, 30377, 30381, 30385, + 30389, 30393, 30397, 30401, 30407, 30413, 30419, 30424, 30431, 30436, + 30441, 30447, 30452, 30459, 30466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30473, + 30479, 30483, 30488, 30493, 30498, 30503, 30508, 30513, 30518, 30523, + 30528, 30532, 30537, 30542, 30547, 30551, 30555, 30560, 30565, 30570, + 30574, 30578, 30582, 30586, 30591, 30596, 30601, 30605, 30609, 30614, 0, + 30619, 30624, 30629, 30634, 30640, 30646, 30652, 30658, 30663, 30668, + 30674, 30680, 0, 0, 0, 0, 30687, 30692, 30698, 30704, 30709, 30714, + 30719, 30724, 30729, 30734, 30739, 30744, 0, 0, 0, 0, 30749, 0, 0, 0, + 30754, 30759, 30764, 30769, 30773, 30777, 30781, 30785, 30789, 30793, + 30797, 30801, 30805, 30810, 30816, 30822, 30828, 30833, 30838, 30843, + 30849, 30854, 30859, 30865, 30870, 30876, 30882, 30887, 30893, 30899, + 30905, 30910, 30915, 30920, 30926, 30932, 30937, 30943, 30948, 30954, + 30959, 30965, 0, 0, 30971, 30977, 30983, 30989, 30995, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31001, 31010, 31019, 31027, 31036, 31045, 31053, 31062, + 31071, 31080, 31088, 31096, 31105, 31113, 31121, 31129, 31138, 31146, + 31154, 31163, 31171, 31179, 31188, 31196, 31204, 31213, 31221, 31230, + 31239, 31247, 31256, 31265, 31273, 31281, 31290, 31299, 31307, 31316, + 31325, 31334, 31343, 31352, 31361, 31370, 0, 0, 0, 0, 31379, 31389, + 31398, 31407, 31415, 31424, 31432, 31441, 31449, 31458, 31467, 31476, + 31485, 31494, 31503, 31512, 31521, 31530, 31539, 31548, 31557, 31566, + 31575, 31584, 31593, 31601, 0, 0, 0, 0, 0, 0, 31609, 31617, 31624, 31631, + 31638, 31645, 31652, 31659, 31666, 31673, 31680, 0, 0, 0, 31688, 31696, + 31704, 31708, 31714, 31720, 31726, 31732, 31738, 31744, 31750, 31756, + 31762, 31768, 31774, 31780, 31786, 31792, 31798, 31802, 31808, 31814, + 31820, 31826, 31832, 31838, 31844, 31850, 31856, 31862, 31868, 31874, + 31880, 31886, 31892, 31896, 31901, 31906, 31911, 31915, 31920, 31924, + 31929, 31933, 31938, 31942, 31947, 31952, 31957, 31962, 31967, 31971, + 31975, 31979, 31984, 31988, 31992, 31996, 32001, 32006, 32011, 32016, 0, + 0, 32022, 32026, 32033, 32038, 32044, 32050, 32055, 32061, 32067, 32072, + 32078, 32084, 32090, 32095, 32101, 32106, 32111, 32117, 32122, 32128, + 32133, 32138, 32144, 32149, 32155, 32159, 32164, 32169, 32175, 32181, + 32186, 32192, 32198, 32202, 32207, 32212, 32216, 32221, 32225, 32230, + 32235, 32241, 32247, 32252, 32257, 32262, 32266, 32271, 32275, 32280, + 32284, 32289, 32294, 32299, 32304, 32310, 32317, 32324, 32334, 32343, + 32350, 32356, 32367, 32372, 32378, 0, 32383, 32388, 32393, 32401, 32407, + 32415, 32420, 32426, 32432, 32438, 32443, 32449, 32454, 32461, 32467, + 32472, 32478, 32484, 32490, 32497, 32504, 32511, 32516, 32521, 32528, + 32535, 32542, 32549, 32556, 0, 0, 32563, 32570, 32577, 32583, 32589, + 32595, 32601, 32607, 32613, 32619, 32625, 0, 0, 0, 0, 0, 0, 32631, 32637, + 32642, 32647, 32652, 32657, 32662, 32667, 32672, 32677, 0, 0, 0, 0, 0, 0, + 32682, 32687, 32692, 32697, 32702, 32707, 32712, 32721, 32728, 32733, + 32738, 32743, 32748, 32753, 0, 0, 32758, 32765, 32768, 32771, 32775, + 32780, 32784, 32790, 32795, 32801, 32808, 32816, 32820, 32825, 32829, + 32834, 32841, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32576, 32582, 32588, - 32592, 32596, 32600, 32604, 32610, 32614, 32620, 32624, 32630, 32636, - 32644, 32650, 32658, 32662, 32666, 32670, 32676, 32679, 32685, 32689, - 32695, 32699, 32703, 32709, 32713, 32719, 32723, 32729, 32737, 32745, - 32753, 32759, 32762, 32768, 32772, 32778, 32781, 32784, 32790, 32794, - 32800, 32803, 32806, 32809, 32812, 32816, 32822, 32828, 32831, 32834, - 32838, 32843, 32848, 32855, 32860, 32867, 32874, 32883, 32890, 32899, - 32904, 32911, 32918, 32927, 32932, 32939, 32944, 32950, 32956, 32962, - 32968, 32974, 32980, 0, 0, 0, 0, 32986, 32990, 32993, 32996, 32999, - 33002, 33005, 33008, 33011, 33014, 33017, 33020, 33023, 33026, 33031, - 33036, 33041, 33044, 33049, 33054, 33059, 33064, 33071, 33076, 33081, - 33086, 33091, 33098, 33104, 33110, 33116, 33122, 33128, 33137, 33146, - 33152, 33158, 33166, 33174, 33183, 33192, 33200, 33208, 33217, 33226, 0, - 0, 0, 33234, 33239, 33244, 33249, 33253, 33257, 33261, 33266, 33270, - 33274, 33279, 33283, 33288, 33293, 33298, 33303, 33308, 33313, 33318, - 33322, 33327, 33331, 33335, 33340, 33345, 33350, 33354, 33358, 33362, - 33366, 33371, 33375, 33380, 33384, 33390, 33396, 33402, 33408, 33414, - 33420, 33426, 33432, 33438, 33443, 33448, 33455, 33463, 33468, 33473, - 33478, 33482, 33486, 33490, 33494, 33498, 33502, 33506, 33510, 33514, - 33518, 33523, 33528, 33533, 33539, 33545, 33549, 33555, 33559, 33565, - 33571, 33576, 33583, 33587, 33593, 33597, 33603, 33608, 33615, 33622, - 33627, 33634, 33639, 33644, 33648, 33654, 33658, 33664, 33670, 33676, - 33680, 33686, 33692, 33696, 33702, 33707, 33711, 33717, 33722, 33727, - 33732, 33737, 33741, 33745, 33750, 33755, 33762, 33768, 33773, 33780, - 33785, 33792, 33797, 33806, 33812, 33818, 33822, 0, 0, 0, 0, 0, 0, 0, 0, - 33826, 33835, 33842, 33849, 33856, 33860, 33865, 33870, 33875, 33880, - 33885, 33890, 33895, 33900, 33905, 33909, 33914, 33919, 33923, 33927, - 33932, 33937, 33942, 33947, 33952, 33957, 33961, 33966, 33971, 33976, - 33981, 33985, 33989, 33993, 33997, 34002, 34007, 34011, 34016, 34021, - 34025, 34031, 34037, 34043, 34048, 34053, 34059, 34064, 34070, 34075, - 34081, 34087, 34092, 34098, 34104, 34109, 34115, 34121, 34127, 34132, 0, - 0, 0, 34137, 34143, 34153, 34159, 34167, 34173, 34178, 34182, 34186, - 34190, 34194, 34198, 34202, 34206, 34210, 0, 0, 0, 34214, 34219, 34224, - 34229, 34236, 34242, 34248, 34254, 34260, 34266, 34272, 34278, 34284, - 34290, 34296, 34303, 34310, 34317, 34324, 34331, 34338, 34345, 34352, - 34359, 34366, 34373, 34380, 34387, 34394, 34401, 34408, 34415, 34422, - 34429, 34436, 34443, 34450, 34457, 34464, 34471, 34478, 34485, 34492, - 34499, 34507, 34515, 34523, 34529, 34535, 34541, 34549, 34558, 34565, - 34572, 34578, 34585, 34592, 34599, 34607, 34614, 0, 0, 0, 0, 0, 0, 0, - 34621, 34628, 34635, 34642, 34649, 34656, 34663, 34670, 34677, 34684, - 34691, 34698, 34705, 34712, 34719, 34726, 34733, 34740, 34747, 34754, - 34761, 34768, 34775, 34782, 34789, 34796, 34803, 34810, 34817, 34824, - 34831, 34838, 34845, 34852, 34859, 34866, 34873, 34880, 34887, 34894, - 34901, 34908, 34916, 0, 0, 34923, 34930, 34938, 34946, 34954, 34962, - 34970, 34978, 34988, 34998, 35008, 0, 0, 0, 0, 0, 0, 0, 0, 35018, 35023, - 35028, 35033, 35038, 35047, 35058, 35067, 35078, 35084, 35097, 35103, - 35110, 35117, 35122, 35129, 35136, 35147, 35156, 35163, 35170, 35179, - 35186, 35195, 35205, 35215, 35222, 35229, 35236, 35246, 35251, 35259, - 35265, 35273, 35282, 35287, 35294, 35300, 35305, 35310, 35315, 35321, - 35328, 0, 0, 0, 0, 0, 35336, 35341, 35347, 35353, 35361, 35367, 35373, - 35379, 35384, 35390, 35395, 35401, 35407, 35415, 35421, 35429, 35434, - 35440, 35446, 35453, 35461, 35467, 35473, 35480, 35487, 35493, 35500, - 35506, 35512, 35517, 35523, 35531, 35539, 35545, 35551, 35557, 35563, - 35571, 35575, 35581, 35587, 35593, 35599, 35605, 35611, 35615, 35620, - 35625, 35632, 35637, 35641, 35647, 35652, 35657, 35661, 35666, 35671, - 35675, 35680, 35685, 35692, 35696, 35701, 35706, 35710, 35715, 35719, - 35724, 35728, 35733, 35738, 35744, 35749, 35754, 35758, 35763, 35768, - 35774, 35779, 35784, 35789, 35794, 35799, 35803, 35808, 35815, 35822, - 35827, 35832, 35836, 35842, 35848, 35853, 35858, 35863, 35869, 35874, - 35880, 35885, 35891, 35897, 35903, 35910, 35917, 35924, 35931, 35938, - 35945, 35950, 35958, 35967, 35976, 35985, 35994, 36003, 36012, 36024, - 36033, 36042, 36051, 36057, 36062, 36069, 36077, 36085, 36092, 36099, - 36106, 36113, 36121, 36130, 36139, 36148, 36157, 36166, 36175, 36184, - 36193, 36202, 36211, 36220, 36229, 36238, 36247, 36255, 36264, 36275, - 36284, 36294, 36306, 36315, 36324, 36333, 36342, 36350, 36359, 36365, - 36370, 36378, 36383, 36390, 36395, 36404, 36410, 36416, 36423, 36428, - 36433, 36441, 36449, 36458, 36467, 36472, 36479, 36489, 36497, 36506, - 36512, 36518, 36523, 36530, 36535, 36544, 36549, 36554, 36559, 36566, - 36572, 36577, 36586, 36594, 36599, 36604, 36611, 36618, 36622, 36626, - 36629, 36632, 36635, 36638, 36641, 36644, 36651, 36654, 36657, 36662, - 36666, 36670, 36674, 36678, 36682, 36691, 36697, 36703, 36709, 36717, - 36725, 36731, 36737, 36744, 36750, 36755, 36761, 36768, 36774, 36781, - 36787, 36795, 36801, 36808, 36814, 36820, 36826, 36832, 36838, 36844, - 36855, 36865, 36871, 36877, 36887, 36893, 36901, 36909, 36917, 36922, - 36928, 36934, 36939, 0, 36947, 36951, 36958, 36965, 36970, 36979, 36987, - 36995, 37002, 37009, 37016, 37023, 37031, 37039, 37049, 37059, 37067, - 37075, 37083, 37091, 37100, 37109, 37117, 37125, 37134, 37143, 37154, - 37165, 37175, 37185, 37194, 37203, 37212, 37221, 37232, 37243, 37251, - 37259, 37267, 37275, 37283, 37291, 37299, 37307, 37315, 37323, 37331, - 37339, 37348, 37357, 37366, 37375, 37385, 37395, 37402, 37409, 37417, - 37425, 37434, 37443, 37451, 37459, 37471, 37483, 37492, 37501, 37510, - 37519, 37526, 37533, 37541, 37549, 37557, 37565, 37573, 37581, 37589, - 37597, 37606, 37615, 37624, 37633, 37642, 37651, 37661, 37671, 37681, - 37691, 37700, 37709, 37716, 37723, 37731, 37739, 37747, 37755, 37763, - 37771, 37783, 37795, 37804, 37813, 37821, 37829, 37837, 37845, 37856, - 37867, 37878, 37889, 37901, 37913, 37921, 37929, 37937, 37945, 37954, - 37963, 37972, 37981, 37989, 37997, 38005, 38013, 38021, 38029, 38038, - 38047, 38057, 38067, 38075, 38083, 38091, 38099, 38107, 38115, 38122, - 38129, 38137, 38145, 38153, 38161, 38169, 38177, 38185, 38193, 38201, - 38209, 38217, 38225, 38233, 38241, 38249, 38257, 38266, 38275, 38284, - 38292, 38301, 38310, 38319, 38328, 38338, 38347, 38354, 38359, 38366, - 38373, 38381, 38389, 38398, 38407, 38417, 38427, 38438, 38449, 38459, - 38469, 38479, 38489, 38498, 38507, 38517, 38527, 38538, 38549, 38559, - 38569, 38579, 38589, 38597, 38605, 38614, 38623, 38631, 38639, 38649, - 38659, 38670, 38681, 38693, 38705, 38716, 38727, 38738, 38749, 38758, - 38767, 38775, 38783, 38790, 38797, 38805, 38813, 38822, 38831, 38841, - 38851, 38862, 38873, 38883, 38893, 38903, 38913, 38922, 38931, 38941, - 38951, 38962, 38973, 38983, 38993, 39003, 39013, 39020, 39027, 39035, - 39043, 39052, 39061, 39071, 39081, 39092, 39103, 39113, 39123, 39133, - 39143, 39151, 39159, 39167, 39175, 39184, 39193, 39201, 39209, 39216, - 39223, 39230, 39237, 39245, 39253, 39261, 39269, 39280, 39291, 39302, - 39313, 39324, 39335, 39343, 39351, 39362, 39373, 39384, 39395, 39406, - 39417, 39425, 39433, 39444, 39455, 39466, 0, 0, 39477, 39485, 39493, - 39504, 39515, 39526, 0, 0, 39537, 39545, 39553, 39564, 39575, 39586, - 39597, 39608, 39619, 39627, 39635, 39646, 39657, 39668, 39679, 39690, - 39701, 39709, 39717, 39728, 39739, 39750, 39761, 39772, 39783, 39791, - 39799, 39810, 39821, 39832, 39843, 39854, 39865, 39873, 39881, 39892, - 39903, 39914, 0, 0, 39925, 39933, 39941, 39952, 39963, 39974, 0, 0, - 39985, 39993, 40001, 40012, 40023, 40034, 40045, 40056, 0, 40067, 0, - 40075, 0, 40086, 0, 40097, 40108, 40116, 40124, 40135, 40146, 40157, - 40168, 40179, 40190, 40198, 40206, 40217, 40228, 40239, 40250, 40261, - 40272, 40280, 40288, 40296, 40304, 40312, 40320, 40328, 40336, 40344, - 40352, 40360, 40368, 40376, 0, 0, 40384, 40395, 40406, 40420, 40434, - 40448, 40462, 40476, 40490, 40501, 40512, 40526, 40540, 40554, 40568, - 40582, 40596, 40607, 40618, 40632, 40646, 40660, 40674, 40688, 40702, - 40713, 40724, 40738, 40752, 40766, 40780, 40794, 40808, 40819, 40830, - 40844, 40858, 40872, 40886, 40900, 40914, 40925, 40936, 40950, 40964, - 40978, 40992, 41006, 41020, 41028, 41036, 41047, 41055, 0, 41066, 41074, - 41085, 41093, 41101, 41109, 41117, 41125, 41128, 41131, 41134, 41137, - 41143, 41154, 41162, 0, 41173, 41181, 41192, 41200, 41208, 41216, 41224, - 41232, 41238, 41244, 41250, 41258, 41266, 41277, 0, 0, 41288, 41296, - 41307, 41315, 41323, 41331, 0, 41339, 41345, 41351, 41357, 41365, 41373, - 41384, 41395, 41403, 41411, 41419, 41430, 41438, 41446, 41454, 41462, - 41470, 41476, 41482, 0, 0, 41485, 41496, 41504, 0, 41515, 41523, 41534, - 41542, 41550, 41558, 41566, 41574, 41577, 0, 41580, 41584, 41588, 41592, - 41596, 41600, 41604, 41608, 41612, 41616, 41620, 41624, 41630, 41636, - 41642, 41645, 41648, 41650, 41654, 41658, 41662, 41666, 41669, 41673, - 41677, 41683, 41689, 41696, 41703, 41708, 41713, 41719, 41725, 41727, - 41730, 41732, 41736, 41740, 41744, 41748, 41752, 41756, 41760, 41764, - 41768, 41774, 41778, 41782, 41788, 41793, 41800, 41802, 41805, 41809, - 41813, 41818, 41824, 41826, 41835, 41844, 41847, 41851, 41853, 41855, - 41857, 41860, 41866, 41868, 41872, 41875, 41882, 41889, 41893, 41898, - 41903, 41908, 41913, 41917, 41921, 41924, 41928, 41932, 41939, 41944, - 41948, 41952, 41957, 41961, 41965, 41970, 41975, 41979, 41983, 41987, - 41989, 41994, 41999, 42003, 42007, 42011, 42015, 0, 42019, 42023, 42027, - 42033, 42039, 42045, 42051, 42058, 42065, 42070, 42075, 42079, 0, 0, - 42085, 42088, 42091, 42094, 42097, 42100, 42103, 42107, 42111, 42116, - 42121, 42126, 42133, 42137, 42140, 42143, 42146, 42149, 42152, 42155, - 42158, 42161, 42164, 42168, 42172, 42177, 42182, 0, 42187, 42193, 42199, - 42205, 42212, 42219, 42226, 42233, 42239, 42246, 42253, 42260, 42267, 0, - 0, 0, 42274, 42277, 42280, 42283, 42288, 42291, 42294, 42297, 42300, - 42303, 42306, 42311, 42314, 42317, 42320, 42323, 42326, 42331, 42334, - 42337, 42340, 42343, 42346, 42351, 42354, 42357, 42362, 42367, 42371, - 42374, 42377, 42380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 42383, 42388, 42393, 42400, 42408, 42413, 42418, 42422, 42426, 42431, - 42438, 42445, 42450, 42456, 42461, 42466, 42471, 42478, 42483, 42488, - 42493, 42502, 42509, 42516, 42520, 42525, 42531, 42536, 42543, 42551, - 42559, 42563, 42567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42571, - 42575, 42583, 42588, 42592, 42597, 42601, 42605, 42609, 42611, 42615, - 42619, 42623, 42628, 42633, 42637, 42645, 42648, 42652, 42655, 42658, - 42664, 42669, 42672, 42678, 42682, 42687, 42692, 42695, 42699, 42703, - 42707, 42709, 42712, 42715, 42719, 42721, 42726, 42729, 42732, 42737, - 42742, 42748, 42751, 42754, 42758, 42763, 42766, 42769, 42772, 42776, - 42780, 42784, 42787, 42789, 42792, 42795, 42798, 42802, 42807, 42810, - 42815, 42820, 42825, 42830, 42836, 42841, 42845, 42850, 42855, 42861, - 42867, 42872, 42877, 42883, 42887, 42890, 42893, 42895, 42899, 42905, - 42911, 42917, 42923, 42929, 42935, 42941, 42947, 42953, 42960, 42966, - 42973, 42979, 42985, 42992, 42999, 43003, 43008, 43013, 43018, 43023, - 43028, 43033, 43038, 43043, 43048, 43054, 43060, 43066, 43072, 43079, - 43087, 43093, 43099, 43105, 43111, 43117, 43123, 43129, 43135, 43141, - 43147, 43154, 43161, 43168, 43175, 43183, 43192, 43199, 43210, 43217, - 43224, 43233, 43240, 43249, 43258, 43265, 43273, 43280, 43283, 0, 0, 0, - 0, 43286, 43288, 43291, 43293, 43296, 43299, 43302, 43306, 43310, 43315, - 43320, 43324, 43328, 43332, 43336, 43341, 43347, 43352, 43358, 43363, - 43368, 43373, 43379, 43384, 43390, 43396, 43400, 43404, 43409, 43414, - 43419, 43424, 43429, 43437, 43445, 43453, 43461, 43468, 43476, 43483, - 43490, 43498, 43510, 43516, 43522, 43529, 43536, 43544, 43552, 43559, - 43566, 43574, 43582, 43587, 43595, 43600, 43605, 43611, 43616, 43622, - 43629, 43636, 43641, 43647, 43652, 43655, 43659, 43662, 43666, 43670, - 43674, 43679, 43684, 43690, 43696, 43700, 43704, 43708, 43712, 43718, - 43724, 43728, 43733, 43737, 43742, 43747, 43752, 43755, 43759, 43762, - 43766, 43773, 43781, 43793, 43804, 43809, 43818, 43825, 43833, 43842, - 43846, 43852, 43860, 43864, 43869, 43874, 43880, 43886, 43892, 43899, - 43903, 43907, 43912, 43915, 43917, 43921, 43925, 43933, 43937, 43939, - 43941, 43945, 43953, 43958, 43964, 43974, 43981, 43986, 43990, 43994, - 43998, 44001, 44004, 44007, 44011, 44015, 44019, 44023, 44027, 44030, - 44034, 44038, 44041, 44043, 44046, 44048, 44052, 44056, 44058, 44064, - 44067, 44072, 44076, 44080, 44082, 44084, 44086, 44089, 44093, 44097, - 44101, 44105, 44109, 44115, 44121, 44123, 44125, 44127, 44129, 44132, - 44134, 44138, 44140, 44144, 44148, 44154, 44158, 44162, 44166, 44170, - 44174, 44180, 44184, 44194, 44204, 44208, 44214, 44221, 44225, 44229, - 44232, 44237, 44241, 44247, 44251, 44264, 44273, 44277, 44281, 44287, - 44291, 44294, 44296, 44299, 44303, 44307, 44314, 44318, 44322, 44326, - 44329, 44334, 44339, 44345, 44351, 44356, 44361, 44369, 44377, 44381, - 44385, 44387, 44392, 44396, 44400, 44408, 44416, 44423, 44430, 44439, - 44448, 44454, 44460, 44468, 44476, 44478, 44480, 44486, 44492, 44499, - 44506, 44512, 44518, 44522, 44526, 44533, 44540, 44547, 44554, 44564, - 44574, 44582, 44590, 44592, 44596, 44600, 44605, 44610, 44618, 44626, - 44629, 44632, 44635, 44638, 44641, 44646, 44650, 44655, 44660, 44663, - 44666, 44669, 44672, 44675, 44679, 44682, 44685, 44688, 44691, 44693, - 44695, 44697, 44699, 44707, 44715, 44721, 44725, 44731, 44741, 44747, - 44753, 44759, 44767, 44776, 44788, 44792, 44796, 44798, 44804, 44806, - 44808, 44810, 44812, 44818, 44821, 44827, 44833, 44837, 44841, 44845, - 44848, 44852, 44856, 44858, 44867, 44876, 44881, 44886, 44892, 44898, - 44904, 44907, 44910, 44913, 44916, 44918, 44923, 44928, 44933, 44939, - 44945, 44954, 44963, 44970, 44977, 44984, 44991, 45001, 45011, 45021, - 45031, 45041, 45051, 45060, 45069, 45078, 45087, 45095, 45107, 45118, - 45134, 45137, 45143, 45149, 45155, 45163, 45178, 45194, 45200, 45206, - 45213, 45219, 45228, 45235, 45249, 45264, 45269, 45275, 45283, 45286, - 45289, 45291, 45294, 45297, 45299, 45301, 45305, 45308, 45311, 45314, - 45317, 45322, 45327, 45332, 45337, 45342, 45345, 45347, 45349, 45351, - 45355, 45359, 45363, 45369, 45373, 45375, 45377, 45382, 45387, 45392, - 45397, 45402, 45407, 45409, 45411, 45421, 45425, 45433, 45442, 45444, - 45449, 45454, 45462, 45466, 45468, 45472, 45474, 45478, 45482, 45486, - 45488, 45490, 45492, 45499, 45508, 45517, 45526, 45535, 45544, 45553, - 45562, 45571, 45579, 45587, 45596, 45605, 45614, 45623, 45631, 45639, - 45648, 45657, 45666, 45676, 45685, 45695, 45704, 45714, 45723, 45733, - 45743, 45752, 45762, 45771, 45781, 45790, 45800, 45809, 45818, 45827, - 45836, 45845, 45855, 45864, 45873, 45882, 45892, 45901, 45910, 45919, - 45928, 45938, 45948, 45957, 45966, 45974, 45983, 45990, 45999, 46008, - 46019, 46028, 46038, 46048, 46055, 46062, 46069, 46078, 46087, 46096, - 46105, 46112, 46117, 46126, 46131, 46134, 46141, 46144, 46149, 46154, - 46157, 46160, 46168, 46171, 46176, 46179, 46187, 46192, 46200, 46203, - 46206, 46209, 46214, 46219, 46222, 46225, 46233, 46236, 46243, 46250, - 46254, 46258, 46263, 46268, 46274, 46279, 46285, 46291, 46296, 46302, - 46310, 46316, 46324, 46332, 46338, 46346, 46354, 46362, 46370, 46376, - 46384, 46392, 46400, 46404, 46410, 46424, 46438, 46442, 46446, 46450, - 46454, 46464, 46468, 46473, 46478, 46484, 46490, 46496, 46502, 46512, - 46522, 46530, 46541, 46552, 46560, 46571, 46582, 46590, 46601, 46612, - 46620, 46628, 46638, 46648, 46651, 46654, 46657, 46662, 46666, 46672, - 46679, 46686, 46694, 46701, 46705, 46709, 46713, 46717, 46719, 46723, - 46727, 46732, 46737, 46744, 46751, 46754, 46761, 46763, 46765, 46769, - 46773, 46778, 46784, 46790, 46796, 46802, 46811, 46820, 46829, 46833, - 46835, 46839, 46846, 46853, 46860, 46867, 46874, 46877, 46882, 46888, - 46891, 46896, 46901, 46906, 46911, 46915, 46922, 46929, 46936, 46943, - 46947, 46951, 46955, 46959, 46965, 46971, 46976, 46982, 46988, 46994, - 47000, 47008, 47015, 47022, 47029, 47036, 47042, 47048, 47057, 47061, - 47068, 47072, 47076, 47082, 47088, 47094, 47100, 47104, 47108, 47111, - 47114, 47118, 47125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 47132, 47135, 47139, 47143, 47149, 47155, 47161, - 47169, 47176, 47180, 47188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 47193, 47196, 47199, 47202, 47205, 47208, 47211, 47214, - 47217, 47220, 47224, 47228, 47232, 47236, 47240, 47244, 47248, 47252, - 47256, 47260, 47264, 47267, 47270, 47273, 47276, 47279, 47282, 47285, - 47288, 47291, 47295, 47299, 47303, 47307, 47311, 47315, 47319, 47323, - 47327, 47331, 47335, 47341, 47347, 47353, 47360, 47367, 47374, 47381, - 47388, 47395, 47402, 47409, 47416, 47423, 47430, 47437, 47444, 47451, - 47458, 47465, 47472, 47477, 47483, 47489, 47495, 47500, 47506, 47512, - 47518, 47523, 47529, 47535, 47540, 47546, 47552, 47557, 47563, 47569, - 47574, 47580, 47586, 47591, 47597, 47603, 47609, 47615, 47621, 47626, - 47632, 47638, 47644, 47649, 47655, 47661, 47667, 47672, 47678, 47684, - 47689, 47695, 47701, 47706, 47712, 47718, 47723, 47729, 47735, 47740, - 47746, 47752, 47758, 47764, 47770, 47775, 47781, 47787, 47793, 47798, - 47804, 47810, 47816, 47821, 47827, 47833, 47838, 47844, 47850, 47855, - 47861, 47867, 47872, 47878, 47884, 47889, 47895, 47901, 47907, 47913, - 47919, 47923, 47929, 47935, 47941, 47947, 47953, 47959, 47965, 47971, - 47977, 47983, 47987, 47991, 47995, 47999, 48003, 48007, 48011, 48015, - 48019, 48024, 48030, 48035, 48040, 48045, 48050, 48059, 48068, 48077, - 48086, 48095, 48104, 48113, 48122, 48129, 48137, 48145, 48152, 48159, - 48167, 48175, 48182, 48189, 48197, 48205, 48212, 48219, 48227, 48235, - 48242, 48249, 48257, 48266, 48275, 48283, 48292, 48301, 48308, 48315, - 48323, 48332, 48341, 48349, 48358, 48367, 48374, 48381, 48390, 48399, - 48408, 48417, 48426, 48435, 48442, 48449, 48458, 48467, 48476, 48485, - 48494, 48503, 48510, 48517, 48526, 48535, 48544, 48554, 48564, 48573, - 48583, 48593, 48603, 48613, 48623, 48633, 48642, 48651, 48658, 48666, - 48674, 48682, 48690, 48695, 48700, 48709, 48717, 48724, 48733, 48741, - 48748, 48757, 48765, 48772, 48781, 48789, 48796, 48805, 48813, 48820, - 48829, 48837, 48844, 48854, 48863, 48870, 48880, 48889, 48896, 48906, - 48915, 48922, 48931, 48940, 48949, 48958, 48972, 48986, 48993, 48998, - 49003, 49008, 49013, 49018, 49023, 49028, 49033, 49041, 49049, 49057, - 49065, 49070, 49077, 49084, 49091, 49096, 49104, 49111, 49119, 49123, - 49130, 49136, 49143, 49147, 49153, 49159, 49165, 49169, 49172, 49176, - 49180, 49187, 49193, 49199, 49205, 49211, 49225, 49235, 49249, 49263, - 49269, 49279, 49293, 49296, 49299, 49306, 49314, 49320, 49325, 49333, - 49345, 49357, 49365, 49369, 49373, 49376, 49379, 49383, 49387, 49390, - 49393, 49398, 49403, 49409, 49415, 49420, 49425, 49431, 49437, 49442, - 49447, 49452, 49457, 49463, 49469, 49474, 49479, 49485, 49491, 49496, - 49501, 49504, 49507, 49516, 49518, 49520, 49523, 49527, 49533, 49535, - 49538, 49545, 49552, 49560, 49568, 49578, 49592, 49597, 49602, 49606, - 49611, 49619, 49627, 49636, 49645, 49654, 49663, 49668, 49673, 49679, - 49685, 49691, 49697, 49700, 49706, 49712, 49722, 49732, 49740, 49748, - 49757, 49766, 49770, 49778, 49786, 49794, 49802, 49811, 49820, 49829, - 49838, 49843, 49848, 49853, 49858, 49863, 49869, 49875, 49880, 49886, - 49888, 49890, 49892, 49894, 49897, 49900, 49902, 49904, 49906, 49910, - 49914, 49916, 49918, 49921, 49924, 49928, 49934, 49940, 49942, 49949, - 49953, 49958, 49963, 49965, 49975, 49981, 49987, 49993, 49999, 50005, - 50011, 50016, 50019, 50022, 50025, 50027, 50029, 50033, 50037, 50042, - 50047, 50052, 50055, 50059, 50064, 50067, 50071, 50076, 50081, 50086, - 50091, 50096, 50101, 50106, 50111, 50116, 50121, 50126, 50131, 50137, - 50143, 50149, 50151, 50154, 50156, 50159, 50161, 50163, 50165, 50167, - 50169, 50171, 50173, 50175, 50177, 50179, 50181, 50183, 50185, 50187, - 50189, 50191, 50193, 50198, 50203, 50208, 50213, 50218, 50223, 50228, - 50233, 50238, 50243, 50248, 50253, 50258, 50263, 50268, 50273, 50278, - 50283, 50288, 50293, 50297, 50301, 50305, 50311, 50317, 50322, 50327, - 50332, 50338, 50344, 50349, 50357, 50365, 50373, 50381, 50389, 50397, - 50405, 50413, 50419, 50424, 50429, 50434, 50437, 50441, 50445, 50449, - 50453, 50457, 50461, 50468, 50475, 50483, 50491, 50496, 50501, 50508, - 50515, 50522, 50529, 50532, 50535, 50540, 50542, 50546, 50551, 50553, - 50555, 50557, 50559, 50564, 50567, 50569, 50574, 50581, 50588, 50591, - 50595, 50600, 50605, 50613, 50619, 50625, 50637, 50644, 50652, 50657, - 50662, 50668, 50671, 50674, 50679, 50681, 50685, 50687, 50689, 50691, - 50693, 50695, 50697, 50702, 50704, 50706, 50708, 50710, 50714, 50716, - 50719, 50724, 50729, 50734, 50739, 50745, 50751, 50753, 50756, 50763, - 50769, 50775, 50782, 50786, 50790, 50792, 50794, 50798, 50804, 50809, - 50811, 50815, 50824, 50832, 50840, 50846, 50852, 50857, 50863, 50868, - 50871, 50885, 50888, 50893, 50898, 50904, 50915, 50917, 50923, 50929, - 50933, 50940, 50944, 50946, 50948, 50952, 50958, 50963, 50969, 50971, - 50977, 50979, 50985, 50987, 50989, 50994, 50996, 51000, 51005, 51007, - 51012, 51017, 51021, 51028, 51038, 51043, 51049, 51052, 51058, 51061, - 51066, 51071, 51075, 51077, 51079, 51083, 51087, 51091, 51095, 51100, - 51102, 51107, 51110, 51113, 51116, 51120, 51124, 51129, 51133, 51138, - 51143, 51147, 51152, 51158, 51161, 51167, 51172, 51176, 51181, 51187, - 51193, 51200, 51206, 51213, 51220, 51222, 51229, 51233, 51239, 51245, - 51250, 51256, 51260, 51265, 51268, 51273, 51279, 51286, 51294, 51301, - 51310, 51320, 51327, 51333, 51337, 51344, 51349, 51358, 51361, 51364, - 51373, 51383, 51390, 51392, 51398, 51403, 51405, 51408, 51412, 51420, - 51429, 51432, 51437, 51443, 51451, 51459, 51467, 51475, 51481, 51487, - 51493, 51501, 51506, 51509, 51513, 51516, 51527, 51537, 51547, 51556, - 51567, 51577, 51586, 51592, 51600, 51604, 51612, 51616, 51624, 51631, - 51638, 51647, 51656, 51666, 51676, 51686, 51696, 51705, 51714, 51724, - 51734, 51743, 51752, 51759, 51766, 51773, 51780, 51787, 51794, 51801, - 51808, 51815, 51823, 51829, 51835, 51841, 51847, 51853, 51859, 51865, - 51871, 51877, 51884, 51892, 51900, 51908, 51916, 51924, 51932, 51940, - 51948, 51956, 51965, 51970, 51973, 51977, 51981, 51987, 51990, 51995, - 52001, 52006, 52010, 52015, 52021, 52028, 52031, 52038, 52045, 52049, - 52058, 52067, 52072, 52078, 52083, 52088, 52095, 52102, 52110, 52118, - 52127, 52131, 52140, 52145, 52149, 52156, 52160, 52166, 52174, 52179, - 52186, 52190, 52195, 52199, 52204, 52208, 52213, 52218, 52227, 52229, - 52232, 52235, 52242, 52249, 52255, 52263, 52269, 52276, 52281, 52284, - 52289, 52294, 52299, 52307, 52311, 52318, 52326, 52334, 52339, 52344, - 52350, 52355, 52360, 52366, 52371, 52374, 52378, 52382, 52389, 52399, - 52404, 52413, 52422, 52428, 52434, 52439, 52444, 52449, 52454, 52460, - 52466, 52474, 52482, 52488, 52494, 52499, 52504, 52511, 52518, 52524, - 52527, 52530, 52534, 52538, 52542, 52547, 52553, 52559, 52566, 52573, - 52578, 52582, 52586, 52590, 52594, 52598, 52602, 52606, 52610, 52614, - 52618, 52622, 52626, 52630, 52634, 52638, 52642, 52646, 52650, 52654, - 52658, 52662, 52666, 52670, 52674, 52678, 52682, 52686, 52690, 52694, - 52698, 52702, 52706, 52710, 52714, 52718, 52722, 52726, 52730, 52734, - 52738, 52742, 52746, 52750, 52754, 52758, 52762, 52766, 52770, 52774, - 52778, 52782, 52786, 52790, 52794, 52798, 52802, 52806, 52810, 52814, - 52818, 52822, 52826, 52830, 52834, 52838, 52842, 52846, 52850, 52854, - 52858, 52862, 52866, 52870, 52874, 52878, 52882, 52886, 52890, 52894, - 52898, 52902, 52906, 52910, 52914, 52918, 52922, 52926, 52930, 52934, - 52938, 52942, 52946, 52950, 52954, 52958, 52962, 52966, 52970, 52974, - 52978, 52982, 52986, 52990, 52994, 52998, 53002, 53006, 53010, 53014, - 53018, 53022, 53026, 53030, 53034, 53038, 53042, 53046, 53050, 53054, - 53058, 53062, 53066, 53070, 53074, 53078, 53082, 53086, 53090, 53094, - 53098, 53102, 53106, 53110, 53114, 53118, 53122, 53126, 53130, 53134, - 53138, 53142, 53146, 53150, 53154, 53158, 53162, 53166, 53170, 53174, - 53178, 53182, 53186, 53190, 53194, 53198, 53202, 53206, 53210, 53214, - 53218, 53222, 53226, 53230, 53234, 53238, 53242, 53246, 53250, 53254, - 53258, 53262, 53266, 53270, 53274, 53278, 53282, 53286, 53290, 53294, - 53298, 53302, 53306, 53310, 53314, 53318, 53322, 53326, 53330, 53334, - 53338, 53342, 53346, 53350, 53354, 53358, 53362, 53366, 53370, 53374, - 53378, 53382, 53386, 53390, 53394, 53398, 53402, 53406, 53410, 53414, - 53418, 53422, 53426, 53430, 53434, 53438, 53442, 53446, 53450, 53454, - 53458, 53462, 53466, 53470, 53474, 53478, 53482, 53486, 53490, 53494, - 53498, 53502, 53506, 53510, 53514, 53518, 53522, 53526, 53530, 53534, - 53538, 53542, 53546, 53550, 53554, 53558, 53562, 53566, 53570, 53574, - 53578, 53582, 53586, 53590, 53594, 53598, 53602, 53609, 53617, 53623, - 53629, 53636, 53643, 53649, 53655, 53662, 53669, 53674, 53679, 53684, - 53689, 53695, 53701, 53709, 53716, 53722, 53728, 53736, 53745, 53752, - 53762, 53773, 53776, 53779, 53783, 53787, 53794, 53801, 53812, 53823, - 53832, 53841, 53847, 53853, 53860, 53867, 53876, 53886, 53897, 53907, - 53917, 53927, 53938, 53949, 53959, 53970, 53980, 53990, 53999, 54009, - 54019, 54030, 54041, 54048, 54055, 54062, 54069, 54079, 54089, 54097, - 54105, 54112, 54119, 54126, 54133, 54140, 54145, 54150, 54156, 54164, - 54174, 54182, 54190, 54198, 54206, 54214, 54222, 54230, 54238, 54247, - 54256, 54266, 54276, 54285, 54294, 54304, 54314, 54323, 54332, 54342, - 54352, 54361, 54370, 54380, 54390, 54404, 54421, 54435, 54452, 54466, - 54480, 54494, 54508, 54518, 54529, 54539, 54550, 54567, 54584, 54592, - 54598, 54605, 54612, 54619, 54626, 54631, 54637, 54642, 54647, 54653, - 54658, 54663, 54668, 54673, 54678, 54685, 54691, 54699, 54704, 54709, - 54713, 54717, 54725, 54733, 54741, 54749, 54756, 54763, 54776, 54789, - 54802, 54815, 54823, 54831, 54837, 54843, 54850, 54857, 54864, 54871, - 54875, 54880, 54888, 54896, 54904, 54911, 54915, 54923, 54931, 54934, - 54938, 54943, 54950, 54958, 54966, 54985, 55004, 55023, 55042, 55061, - 55080, 55099, 55118, 55124, 55131, 55140, 55148, 55156, 55162, 55165, - 55168, 55173, 55176, 55196, 55203, 55209, 55215, 55219, 55222, 55225, - 55228, 55240, 55254, 55261, 55268, 55271, 55275, 55278, 55283, 55288, - 55293, 55299, 55308, 55315, 55322, 55330, 55337, 55344, 55347, 55353, - 55359, 55362, 55365, 55370, 55375, 55381, 55387, 55391, 55396, 55403, - 55407, 55413, 55417, 55421, 55429, 55441, 55450, 55454, 55456, 55465, - 55474, 55480, 55483, 55489, 55495, 55500, 55505, 55510, 55515, 55520, - 55525, 55527, 55533, 55538, 55546, 55550, 55556, 55559, 55563, 55570, - 55577, 55579, 55581, 55587, 55593, 55599, 55608, 55617, 55624, 55631, - 55637, 55644, 55649, 55654, 55659, 55665, 55671, 55676, 55683, 55687, - 55691, 55704, 55717, 55729, 55738, 55744, 55751, 55756, 55761, 55766, - 55771, 55776, 55778, 55785, 55793, 55801, 55809, 55816, 55824, 55830, - 55835, 55841, 55847, 55853, 55860, 55866, 55874, 55882, 55890, 55898, - 55906, 55912, 55918, 55927, 55931, 55940, 55949, 55958, 55966, 55970, - 55976, 55983, 55990, 55994, 56000, 56008, 56014, 56019, 56025, 56030, - 56035, 56042, 56049, 56054, 56059, 56067, 56075, 56085, 56095, 56102, - 56109, 56113, 56117, 56129, 56135, 56142, 56147, 56152, 56159, 56166, - 56172, 56178, 56188, 56195, 56203, 56211, 56220, 56227, 56233, 56240, - 56246, 56254, 56262, 56270, 56278, 56284, 56289, 56299, 56310, 56317, - 56326, 56332, 56337, 56342, 56352, 56359, 56365, 56371, 56379, 56384, - 56391, 56398, 56411, 56419, 56426, 56433, 56440, 56447, 56455, 56463, - 56476, 56489, 56501, 56513, 56527, 56541, 56547, 56553, 56562, 56571, - 56578, 56585, 56594, 56603, 56612, 56621, 56629, 56637, 56647, 56657, - 56671, 56685, 56694, 56703, 56716, 56729, 56738, 56747, 56758, 56769, - 56775, 56781, 56790, 56799, 56804, 56809, 56817, 56823, 56829, 56837, - 56845, 56858, 56871, 56875, 56879, 56887, 56895, 56902, 56910, 56918, - 56927, 56936, 56942, 56948, 56955, 56962, 56969, 56976, 56985, 56994, - 56997, 57000, 57005, 57010, 57016, 57022, 57029, 57036, 57047, 57058, - 57065, 57072, 57080, 57088, 57096, 57104, 57112, 57120, 57126, 57132, - 57136, 57140, 57148, 57156, 57161, 57166, 57171, 57176, 57182, 57196, - 57203, 57210, 57214, 57216, 57218, 57223, 57228, 57233, 57238, 57246, - 57253, 57260, 57268, 57280, 57288, 57296, 57307, 57311, 57315, 57321, - 57329, 57342, 57349, 57356, 57363, 57369, 57376, 57385, 57394, 57400, - 57406, 57412, 57422, 57432, 57440, 57449, 57454, 57457, 57462, 57467, - 57472, 57478, 57484, 57488, 57491, 57495, 57499, 57504, 57509, 57515, - 57521, 57525, 57529, 57536, 57543, 57550, 57557, 57564, 57571, 57581, - 57591, 57598, 57605, 57613, 57621, 57625, 57630, 57635, 57641, 57647, - 57650, 57653, 57656, 57659, 57664, 57669, 57674, 57679, 57684, 57689, - 57693, 57697, 57701, 57706, 57711, 57715, 57719, 57725, 57729, 57735, - 57740, 57747, 57755, 57762, 57770, 57777, 57785, 57794, 57801, 57811, - 57822, 57828, 57837, 57843, 57852, 57861, 57867, 57873, 57877, 57881, - 57890, 57899, 57906, 57913, 57922, 57931, 57938, 57944, 57951, 57956, - 57960, 57964, 57969, 57974, 57979, 57987, 57995, 57998, 58002, 58011, - 58021, 58030, 58040, 58052, 58066, 58070, 58075, 58079, 58084, 58089, - 58094, 58100, 58106, 58113, 58120, 58126, 58133, 58139, 58146, 58154, - 58162, 58169, 58177, 58184, 0, 0, 58192, 58201, 58210, 58220, 58230, - 58239, 58249, 58258, 58268, 58274, 58279, 58288, 58300, 58309, 58321, - 58328, 58336, 58343, 58351, 58356, 58362, 58367, 58373, 58381, 58390, - 58398, 58407, 58411, 58415, 58419, 58423, 58433, 0, 0, 58436, 58445, - 58455, 58464, 58474, 58480, 58487, 58493, 58500, 58511, 58522, 58533, - 58544, 58554, 58564, 58574, 58584, 58592, 58600, 58608, 58616, 58624, - 58632, 58640, 58648, 58654, 58660, 58666, 58672, 58678, 58684, 58690, - 58696, 58708, 58718, 58723, 58730, 58735, 58742, 58745, 58749, 58753, - 58758, 58762, 58767, 58770, 58779, 58788, 58797, 58806, 58811, 58817, - 58823, 58831, 58841, 58848, 58857, 58862, 58865, 58868, 58873, 58878, - 58883, 58888, 58890, 58892, 58894, 58896, 58898, 58900, 58905, 58912, - 58919, 58921, 58923, 58925, 58927, 58929, 58931, 58933, 58935, 58940, - 58945, 58952, 58959, 58968, 58978, 58987, 58997, 59002, 59007, 59009, - 59016, 59023, 59030, 59037, 59044, 59051, 59058, 59061, 59064, 59067, - 59070, 59075, 59080, 59085, 59090, 59095, 59100, 59105, 59110, 59115, - 59120, 59125, 59130, 59136, 59140, 59145, 59150, 59155, 59160, 59165, - 59170, 59175, 59180, 59185, 59190, 59195, 59200, 59205, 59210, 59215, - 59220, 59225, 59230, 59235, 59240, 59245, 59250, 59256, 59261, 59267, - 59276, 59281, 59289, 59296, 59305, 59310, 59315, 59320, 59326, 0, 59333, - 59338, 59343, 59348, 59353, 59358, 59363, 59368, 59373, 59378, 59383, - 59389, 59393, 59398, 59403, 59408, 59413, 59418, 59423, 59428, 59433, - 59438, 59443, 59448, 59453, 59458, 59463, 59468, 59473, 59478, 59483, - 59488, 59493, 59498, 59503, 59509, 59514, 59520, 59529, 59534, 59542, - 59549, 59558, 59563, 59568, 59573, 59579, 0, 59586, 59594, 59602, 59611, - 59618, 59626, 59632, 59641, 59649, 59657, 59665, 59673, 59681, 59689, - 59694, 59701, 59706, 59712, 59720, 59727, 59734, 59742, 59748, 59754, - 59761, 59769, 59778, 59788, 59794, 59801, 59806, 59816, 59826, 59831, - 59836, 59841, 59846, 59851, 59856, 59861, 59866, 59871, 59876, 59881, - 59886, 59891, 59896, 59901, 59906, 59911, 59916, 59921, 59926, 59931, - 59936, 59941, 59946, 59951, 59956, 59961, 59966, 59971, 59976, 59980, - 59984, 59989, 59994, 59999, 60004, 60009, 60014, 60019, 60024, 60029, - 60034, 60039, 60044, 60049, 60054, 60059, 60064, 60069, 60074, 60081, - 60088, 60095, 60102, 60109, 60116, 60123, 60130, 60137, 60144, 60151, - 60158, 60165, 60172, 60177, 60182, 60189, 60196, 60203, 60210, 60217, - 60224, 60231, 60238, 60245, 60252, 60259, 60266, 60272, 60278, 60284, - 60290, 60297, 60304, 60311, 60318, 60325, 60332, 60339, 60346, 60353, - 60360, 60368, 60376, 60384, 60392, 60400, 60408, 60416, 60424, 60428, - 60434, 60440, 60444, 60450, 60456, 60462, 60469, 60476, 60483, 60490, - 60495, 60501, 60507, 60514, 0, 0, 0, 0, 0, 60521, 60529, 60538, 60547, - 60555, 60560, 60565, 60570, 60575, 60580, 60585, 60590, 60595, 60600, - 60605, 60610, 60615, 60620, 60625, 60630, 60635, 60640, 60645, 60650, - 60655, 60660, 60665, 60670, 60675, 60680, 60685, 60690, 60695, 60700, - 60705, 60710, 60715, 60720, 60725, 60730, 60735, 60740, 60745, 60750, - 60755, 0, 60760, 0, 0, 0, 0, 0, 60765, 0, 0, 60770, 60774, 60779, 60784, - 60789, 60794, 60803, 60808, 60813, 60818, 60823, 60828, 60833, 60838, - 60843, 60850, 60855, 60860, 60869, 60876, 60881, 60886, 60891, 60898, - 60903, 60910, 60915, 60920, 60927, 60934, 60939, 60944, 60949, 60956, - 60963, 60968, 60973, 60978, 60983, 60988, 60995, 61002, 61007, 61012, - 61017, 61022, 61027, 61032, 61037, 61042, 61047, 61052, 61057, 61064, - 61069, 61074, 0, 0, 0, 0, 0, 0, 0, 61079, 61086, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 61091, 61096, 61100, 61104, 61108, 61112, 61116, 61120, - 61124, 61128, 61132, 61136, 61142, 61146, 61150, 61154, 61158, 61162, - 61166, 61170, 61174, 61178, 61182, 61186, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 61190, 61194, 61198, 61202, 61206, 61210, 61214, 0, 61218, 61222, 61226, - 61230, 61234, 61238, 61242, 0, 61246, 61250, 61254, 61258, 61262, 61266, - 61270, 0, 61274, 61278, 61282, 61286, 61290, 61294, 61298, 0, 61302, - 61306, 61310, 61314, 61318, 61322, 61326, 0, 61330, 61334, 61338, 61342, - 61346, 61350, 61354, 0, 61358, 61362, 61366, 61370, 61374, 61378, 61382, - 0, 61386, 61390, 61394, 61398, 61402, 61406, 61410, 0, 61414, 61419, - 61424, 61429, 61434, 61439, 61444, 61448, 61453, 61458, 61463, 61467, - 61472, 61477, 61482, 61487, 61491, 61496, 61501, 61506, 61511, 61516, - 61521, 61525, 61530, 61535, 61542, 61547, 61552, 61558, 61565, 61572, - 61581, 61588, 61597, 61601, 61605, 61611, 61617, 61623, 61631, 61637, - 61641, 61645, 61649, 61655, 61661, 61665, 61667, 61671, 61677, 61679, - 61683, 61687, 61691, 61697, 61702, 61706, 61710, 61715, 61721, 61726, - 61731, 61736, 61741, 61748, 61755, 61760, 61765, 61770, 61775, 61780, - 61785, 61789, 61793, 61801, 61809, 61815, 61819, 61824, 61827, 61831, - 61838, 61841, 61845, 61849, 61852, 61858, 61864, 61867, 61873, 61877, - 61881, 61887, 61892, 61897, 61899, 61902, 61906, 61912, 61918, 61922, - 61927, 61936, 61939, 61945, 61950, 61954, 61958, 61962, 61965, 61970, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32849, 32855, + 32861, 32865, 32869, 32873, 32877, 32883, 32887, 32893, 32897, 32903, + 32909, 32917, 32923, 32931, 32935, 32939, 32943, 32949, 32952, 32958, + 32962, 32968, 32972, 32976, 32982, 32986, 32992, 32996, 33002, 33010, + 33018, 33026, 33032, 33035, 33041, 33045, 33051, 33054, 33057, 33063, + 33067, 33073, 33076, 33079, 33082, 33085, 33089, 33095, 33101, 33104, + 33107, 33111, 33116, 33121, 33128, 33133, 33140, 33147, 33156, 33163, + 33172, 33177, 33184, 33191, 33200, 33205, 33212, 33217, 33223, 33229, + 33235, 33241, 33247, 33253, 0, 0, 0, 0, 33259, 33263, 33266, 33269, + 33272, 33275, 33278, 33281, 33284, 33287, 33290, 33293, 33296, 33299, + 33304, 33309, 33314, 33317, 33322, 33327, 33332, 33337, 33344, 33349, + 33354, 33359, 33364, 33371, 33377, 33383, 33389, 33395, 33401, 33410, + 33419, 33425, 33431, 33440, 33449, 33458, 33467, 33476, 33485, 33494, + 33503, 0, 0, 0, 33512, 33517, 33522, 33527, 33531, 33535, 33539, 33544, + 33548, 33552, 33557, 33561, 33566, 33571, 33576, 33581, 33586, 33591, + 33596, 33600, 33605, 33609, 33613, 33618, 33623, 33628, 33632, 33636, + 33640, 33644, 33649, 33653, 33658, 33662, 33668, 33674, 33680, 33686, + 33692, 33698, 33704, 33710, 33716, 33721, 33726, 33733, 33741, 33746, + 33751, 33756, 33760, 33764, 33768, 33772, 33776, 33780, 33784, 33788, + 33792, 33796, 33801, 33806, 33811, 33817, 33823, 33827, 33833, 33837, + 33843, 33849, 33854, 33861, 33865, 33871, 33875, 33881, 33886, 33893, + 33900, 33905, 33912, 33917, 33922, 33926, 33932, 33936, 33942, 33948, + 33954, 33958, 33964, 33970, 33974, 33980, 33985, 33989, 33995, 34000, + 34005, 34010, 34015, 34019, 34023, 34028, 34033, 34040, 34046, 34051, + 34058, 34063, 34070, 34075, 34084, 34090, 34096, 34100, 0, 0, 0, 0, 0, 0, + 0, 0, 34104, 34113, 34120, 34127, 34134, 34138, 34143, 34148, 34153, + 34158, 34163, 34168, 34173, 34178, 34183, 34187, 34192, 34197, 34201, + 34205, 34210, 34215, 34220, 34225, 34230, 34235, 34239, 34244, 34249, + 34254, 34259, 34263, 34267, 34271, 34275, 34280, 34285, 34289, 34294, + 34299, 34303, 34309, 34315, 34321, 34326, 34331, 34337, 34342, 34348, + 34353, 34359, 34365, 34370, 34376, 34382, 34387, 34393, 34399, 34405, + 34410, 0, 0, 0, 34415, 34421, 34431, 34437, 34445, 34451, 34456, 34460, + 34464, 34468, 34472, 34476, 34480, 34484, 34488, 0, 0, 0, 34492, 34497, + 34502, 34507, 34514, 34520, 34526, 34532, 34538, 34544, 34550, 34556, + 34562, 34568, 34574, 34581, 34588, 34595, 34602, 34609, 34616, 34623, + 34630, 34637, 34644, 34651, 34658, 34665, 34672, 34679, 34686, 34693, + 34700, 34707, 34714, 34721, 34728, 34735, 34742, 34749, 34756, 34763, + 34770, 34777, 34785, 34793, 34801, 34807, 34813, 34819, 34827, 34836, + 34843, 34850, 34856, 34863, 34870, 34877, 34885, 34892, 0, 0, 0, 0, 0, 0, + 0, 34899, 34906, 34913, 34920, 34927, 34934, 34941, 34948, 34955, 34962, + 34969, 34976, 34983, 34990, 34997, 35004, 35011, 35018, 35025, 35032, + 35039, 35046, 35053, 35060, 35067, 35074, 35081, 35088, 35095, 35102, + 35109, 35116, 35123, 35130, 35137, 35144, 35151, 35158, 35165, 35172, + 35179, 35186, 35194, 0, 0, 35201, 35208, 35216, 35224, 35232, 35240, + 35248, 35256, 35266, 35276, 35286, 0, 0, 0, 0, 0, 0, 0, 0, 35296, 35301, + 35306, 35311, 35316, 35325, 35336, 35345, 35356, 35362, 35375, 35381, + 35388, 35395, 35400, 35407, 35414, 35425, 35434, 35441, 35448, 35457, + 35464, 35473, 35483, 35493, 35500, 35507, 35514, 35524, 35529, 35537, + 35543, 35551, 35560, 35565, 35572, 35578, 35583, 35588, 35593, 35599, + 35606, 0, 0, 0, 0, 0, 35614, 35619, 35625, 35631, 35639, 35645, 35651, + 35657, 35662, 35669, 35674, 35680, 35686, 35694, 35700, 35708, 35713, + 35720, 35726, 35734, 35742, 35748, 35754, 35761, 35768, 35774, 35781, + 35787, 35793, 35798, 35804, 35812, 35820, 35826, 35832, 35838, 35844, + 35852, 35856, 35862, 35868, 35874, 35880, 35886, 35892, 35896, 35901, + 35906, 35913, 35918, 35922, 35928, 35933, 35938, 35942, 35947, 35952, + 35956, 35961, 35966, 35973, 35977, 35982, 35987, 35991, 35996, 36000, + 36005, 36009, 36014, 36019, 36025, 36030, 36035, 36039, 36044, 36050, + 36057, 36062, 36067, 36072, 36077, 36082, 36086, 36092, 36099, 36106, + 36111, 36116, 36120, 36126, 36132, 36137, 36142, 36147, 36153, 36158, + 36164, 36169, 36175, 36181, 36187, 36194, 36201, 36208, 36215, 36222, + 36229, 36234, 36242, 36251, 36260, 36269, 36278, 36287, 36296, 36308, + 36317, 36326, 36335, 36341, 36346, 36353, 36361, 36369, 36376, 36383, + 36390, 36397, 36405, 36414, 36423, 36432, 36441, 36450, 36459, 36468, + 36477, 36486, 36495, 36504, 36513, 36522, 36531, 36539, 36548, 36559, + 36568, 36579, 36592, 36601, 36610, 36620, 36629, 36637, 36646, 36652, + 36657, 36665, 36670, 36678, 36683, 36692, 36698, 36704, 36711, 36716, + 36721, 36729, 36737, 36746, 36755, 36760, 36767, 36777, 36785, 36794, + 36800, 36806, 36811, 36818, 36823, 36832, 36837, 36842, 36847, 36854, + 36860, 36865, 36874, 36882, 36887, 36892, 36899, 36906, 36910, 36914, + 36917, 36920, 36923, 36926, 36929, 36932, 36939, 36942, 36945, 36950, + 36954, 36958, 36962, 36966, 36970, 36980, 36986, 36992, 36998, 37006, + 37014, 37020, 37026, 37033, 37039, 37044, 37050, 37057, 37063, 37070, + 37076, 37084, 37090, 37097, 37103, 37109, 37115, 37121, 37127, 37133, + 37144, 37154, 37160, 37166, 37176, 37182, 37190, 37198, 37206, 37211, + 37217, 37223, 37228, 0, 37236, 37240, 37247, 37253, 37258, 37267, 37275, + 37283, 37290, 37297, 37304, 37311, 37319, 37327, 37338, 37349, 37357, + 37365, 37373, 37381, 37390, 37399, 37407, 37415, 37424, 37433, 37444, + 37455, 37466, 37477, 37486, 37495, 37504, 37513, 37524, 37535, 37543, + 37551, 37559, 37567, 37575, 37583, 37591, 37599, 37607, 37615, 37623, + 37631, 37640, 37649, 37658, 37667, 37678, 37689, 37697, 37705, 37713, + 37721, 37730, 37739, 37747, 37755, 37767, 37779, 37788, 37797, 37806, + 37815, 37823, 37831, 37839, 37847, 37855, 37863, 37871, 37879, 37887, + 37895, 37904, 37913, 37922, 37931, 37941, 37951, 37961, 37971, 37981, + 37991, 38001, 38011, 38019, 38027, 38035, 38043, 38051, 38059, 38067, + 38075, 38087, 38099, 38108, 38117, 38125, 38133, 38141, 38149, 38160, + 38171, 38182, 38193, 38205, 38217, 38225, 38233, 38241, 38249, 38258, + 38267, 38276, 38285, 38293, 38301, 38309, 38317, 38325, 38333, 38343, + 38353, 38363, 38373, 38381, 38389, 38397, 38405, 38413, 38421, 38429, + 38437, 38445, 38453, 38461, 38469, 38477, 38485, 38493, 38501, 38509, + 38517, 38525, 38533, 38541, 38549, 38557, 38565, 38574, 38583, 38592, + 38600, 38609, 38618, 38627, 38636, 38646, 38655, 38662, 38667, 38674, + 38681, 38689, 38697, 38707, 38717, 38727, 38737, 38748, 38759, 38769, + 38779, 38789, 38799, 38809, 38819, 38829, 38839, 38850, 38861, 38871, + 38881, 38891, 38901, 38909, 38917, 38926, 38935, 38943, 38951, 38962, + 38973, 38984, 38995, 39007, 39019, 39030, 39041, 39052, 39063, 39072, + 39081, 39089, 39097, 39104, 39111, 39119, 39127, 39137, 39147, 39157, + 39167, 39178, 39189, 39199, 39209, 39219, 39229, 39239, 39249, 39259, + 39269, 39280, 39291, 39301, 39311, 39321, 39331, 39338, 39345, 39353, + 39361, 39371, 39381, 39391, 39401, 39412, 39423, 39433, 39443, 39453, + 39463, 39471, 39479, 39487, 39495, 39504, 39513, 39521, 39529, 39536, + 39543, 39550, 39557, 39565, 39573, 39581, 39589, 39600, 39611, 39622, + 39633, 39644, 39655, 39663, 39671, 39682, 39693, 39704, 39715, 39726, + 39737, 39745, 39753, 39764, 39775, 39786, 0, 0, 39797, 39805, 39813, + 39824, 39835, 39846, 0, 0, 39857, 39865, 39873, 39884, 39895, 39906, + 39917, 39928, 39939, 39947, 39955, 39966, 39977, 39988, 39999, 40010, + 40021, 40029, 40037, 40048, 40059, 40070, 40081, 40092, 40103, 40111, + 40119, 40130, 40141, 40152, 40163, 40174, 40185, 40193, 40201, 40212, + 40223, 40234, 0, 0, 40245, 40253, 40261, 40272, 40283, 40294, 0, 0, + 40305, 40313, 40321, 40332, 40343, 40354, 40365, 40376, 0, 40387, 0, + 40395, 0, 40406, 0, 40417, 40428, 40436, 40444, 40455, 40466, 40477, + 40488, 40499, 40510, 40518, 40526, 40537, 40548, 40559, 40570, 40581, + 40592, 40600, 40608, 40616, 40624, 40632, 40640, 40648, 40656, 40664, + 40672, 40680, 40688, 40696, 0, 0, 40704, 40715, 40726, 40740, 40754, + 40768, 40782, 40796, 40810, 40821, 40832, 40846, 40860, 40874, 40888, + 40902, 40916, 40927, 40938, 40952, 40966, 40980, 40994, 41008, 41022, + 41033, 41044, 41058, 41072, 41086, 41100, 41114, 41128, 41139, 41150, + 41164, 41178, 41192, 41206, 41220, 41234, 41245, 41256, 41270, 41284, + 41298, 41312, 41326, 41340, 41348, 41356, 41367, 41375, 0, 41386, 41394, + 41405, 41413, 41421, 41429, 41437, 41445, 41448, 41451, 41454, 41457, + 41463, 41474, 41482, 0, 41493, 41501, 41512, 41520, 41528, 41536, 41544, + 41552, 41558, 41564, 41570, 41578, 41586, 41597, 0, 0, 41608, 41616, + 41627, 41635, 41643, 41651, 0, 41659, 41665, 41671, 41677, 41685, 41693, + 41704, 41715, 41723, 41731, 41739, 41750, 41758, 41766, 41774, 41782, + 41790, 41796, 41802, 0, 0, 41805, 41816, 41824, 0, 41835, 41843, 41854, + 41862, 41870, 41878, 41886, 41894, 41897, 0, 41900, 41904, 41908, 41912, + 41916, 41920, 41924, 41928, 41932, 41936, 41940, 41944, 41950, 41956, + 41962, 41965, 41968, 41970, 41974, 41978, 41982, 41986, 41989, 41993, + 41997, 42003, 42009, 42016, 42023, 42028, 42033, 42039, 42045, 42047, + 42050, 42052, 42056, 42060, 42064, 42068, 42072, 42076, 42080, 42084, + 42088, 42094, 42098, 42102, 42108, 42113, 42120, 42122, 42125, 42129, + 42133, 42138, 42144, 42146, 42155, 42164, 42167, 42171, 42173, 42175, + 42177, 42181, 42187, 42189, 42193, 42197, 42204, 42211, 42215, 42220, + 42225, 42230, 42235, 42239, 42243, 42246, 42250, 42254, 42261, 42266, + 42270, 42274, 42279, 42283, 42287, 42292, 42297, 42301, 42305, 42309, + 42311, 42316, 42321, 42325, 42329, 42333, 42337, 0, 42341, 42345, 42349, + 42355, 42361, 42367, 42373, 42380, 42387, 42392, 42397, 42401, 0, 0, + 42407, 42410, 42413, 42416, 42419, 42422, 42425, 42429, 42433, 42438, + 42443, 42448, 42455, 42459, 42462, 42465, 42468, 42471, 42474, 42477, + 42480, 42483, 42486, 42490, 42494, 42499, 42504, 0, 42509, 42515, 42521, + 42527, 42534, 42541, 42548, 42555, 42561, 42568, 42575, 42582, 42589, 0, + 0, 0, 42596, 42599, 42602, 42605, 42610, 42613, 42616, 42619, 42622, + 42625, 42628, 42633, 42636, 42639, 42642, 42645, 42648, 42653, 42656, + 42659, 42662, 42665, 42668, 42673, 42676, 42679, 42684, 42689, 42693, + 42696, 42699, 42702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 42705, 42710, 42715, 42722, 42730, 42735, 42740, 42744, 42748, 42753, + 42760, 42767, 42772, 42778, 42783, 42788, 42793, 42800, 42805, 42810, + 42815, 42824, 42831, 42838, 42842, 42847, 42853, 42858, 42865, 42873, + 42881, 42885, 42889, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42893, + 42897, 42904, 42909, 42913, 42918, 42922, 42926, 42930, 42932, 42936, + 42940, 42944, 42949, 42954, 42958, 42966, 42969, 42973, 42976, 42979, + 42985, 42990, 42993, 42999, 43003, 43008, 43013, 43016, 43020, 43024, + 43028, 43030, 43033, 43036, 43040, 43042, 43047, 43050, 43053, 43058, + 43063, 43069, 43072, 43075, 43079, 43084, 43087, 43090, 43093, 43097, + 43101, 43105, 43108, 43110, 43113, 43116, 43119, 43123, 43128, 43131, + 43136, 43141, 43146, 43151, 43157, 43162, 43166, 43171, 43176, 43182, + 43188, 43193, 43198, 43204, 43208, 43211, 43214, 43216, 43220, 43226, + 43233, 43240, 43247, 43254, 43261, 43268, 43275, 43282, 43290, 43297, + 43305, 43312, 43319, 43327, 43335, 43340, 43345, 43350, 43355, 43360, + 43365, 43370, 43375, 43380, 43385, 43391, 43397, 43403, 43409, 43416, + 43424, 43430, 43436, 43442, 43448, 43454, 43460, 43466, 43472, 43478, + 43484, 43491, 43498, 43505, 43512, 43520, 43529, 43536, 43547, 43554, + 43561, 43570, 43577, 43586, 43595, 43602, 43610, 43618, 43621, 0, 0, 0, + 0, 43624, 43626, 43629, 43631, 43634, 43637, 43640, 43644, 43648, 43653, + 43658, 43662, 43666, 43670, 43674, 43679, 43685, 43690, 43696, 43701, + 43706, 43711, 43717, 43722, 43728, 43734, 43738, 43742, 43747, 43752, + 43757, 43762, 43767, 43775, 43783, 43791, 43799, 43806, 43814, 43821, + 43828, 43835, 43845, 43852, 43859, 43866, 43873, 43881, 43889, 43896, + 43903, 43911, 43919, 43924, 43932, 43937, 43942, 43948, 43953, 43959, + 43966, 43973, 43978, 43984, 43989, 43992, 43996, 43999, 44003, 44007, + 44011, 44016, 44021, 44027, 44033, 44037, 44041, 44045, 44049, 44055, + 44061, 44065, 44070, 44074, 44079, 44083, 44087, 44090, 44094, 44097, + 44101, 44108, 44116, 44128, 44139, 44144, 44153, 44160, 44167, 44175, + 44179, 44185, 44193, 44197, 44202, 44207, 44213, 44219, 44225, 44232, + 44236, 44240, 44245, 44248, 44250, 44254, 44258, 44266, 44270, 44272, + 44274, 44278, 44286, 44291, 44297, 44307, 44314, 44319, 44323, 44327, + 44331, 44334, 44337, 44340, 44344, 44348, 44352, 44356, 44360, 44363, + 44367, 44371, 44374, 44376, 44379, 44381, 44385, 44389, 44391, 44397, + 44400, 44405, 44409, 44413, 44415, 44417, 44419, 44422, 44426, 44430, + 44434, 44438, 44442, 44448, 44454, 44456, 44458, 44460, 44462, 44465, + 44467, 44471, 44473, 44477, 44481, 44487, 44491, 44495, 44499, 44503, + 44507, 44513, 44517, 44527, 44537, 44541, 44547, 44554, 44558, 44562, + 44565, 44570, 44574, 44580, 44584, 44596, 44605, 44609, 44613, 44619, + 44623, 44626, 44628, 44631, 44635, 44639, 44645, 44649, 44653, 44657, + 44660, 44665, 44670, 44676, 44682, 44687, 44692, 44700, 44708, 44712, + 44716, 44718, 44723, 44727, 44731, 44739, 44747, 44754, 44761, 44770, + 44779, 44785, 44791, 44799, 44807, 44809, 44811, 44817, 44823, 44830, + 44837, 44843, 44849, 44853, 44857, 44864, 44871, 44878, 44885, 44895, + 44905, 44913, 44921, 44923, 44927, 44931, 44936, 44941, 44949, 44957, + 44960, 44963, 44966, 44969, 44972, 44977, 44981, 44986, 44991, 44994, + 44997, 45000, 45003, 45006, 45010, 45013, 45016, 45019, 45022, 45024, + 45026, 45028, 45030, 45038, 45046, 45052, 45056, 45062, 45072, 45078, + 45084, 45090, 45098, 45107, 45119, 45123, 45127, 45129, 45135, 45137, + 45139, 45141, 45143, 45149, 45152, 45158, 45164, 45168, 45172, 45176, + 45179, 45183, 45187, 45189, 45198, 45207, 45212, 45217, 45223, 45229, + 45235, 45238, 45241, 45244, 45247, 45249, 45254, 45259, 45264, 45270, + 45276, 45284, 45292, 45298, 45304, 45310, 45316, 45326, 45336, 45346, + 45356, 45366, 45376, 45385, 45394, 45403, 45412, 45420, 45432, 45443, + 45459, 45462, 45468, 45474, 45480, 45488, 45503, 45519, 45525, 45531, + 45538, 45544, 45553, 45560, 45574, 45589, 45594, 45600, 45608, 45611, + 45614, 45616, 45619, 45622, 45624, 45626, 45630, 45633, 45636, 45639, + 45642, 45647, 45652, 45657, 45662, 45667, 45670, 45672, 45674, 45676, + 45680, 45684, 45688, 45694, 45698, 45700, 45702, 45707, 45712, 45717, + 45722, 45727, 45732, 45734, 45736, 45746, 45750, 45757, 45766, 45768, + 45773, 45778, 45785, 45789, 45791, 45795, 45797, 45801, 45805, 45809, + 45811, 45813, 45815, 45822, 45831, 45840, 45849, 45858, 45867, 45876, + 45885, 45894, 45902, 45910, 45919, 45928, 45937, 45946, 45954, 45962, + 45971, 45980, 45989, 45999, 46008, 46018, 46027, 46037, 46046, 46056, + 46066, 46075, 46085, 46094, 46104, 46113, 46123, 46132, 46141, 46150, + 46159, 46168, 46178, 46187, 46196, 46205, 46215, 46224, 46233, 46242, + 46251, 46261, 46271, 46280, 46289, 46297, 46306, 46313, 46322, 46331, + 46342, 46351, 46361, 46371, 46378, 46385, 46392, 46401, 46410, 46419, + 46428, 46435, 46440, 46449, 46455, 46458, 46465, 46468, 46473, 46478, + 46481, 46484, 46492, 46495, 46500, 46503, 46511, 46516, 46524, 46527, + 46530, 46533, 46538, 46543, 46546, 46549, 46557, 46560, 46567, 46574, + 46578, 46582, 46587, 46592, 46597, 46602, 46607, 46612, 46617, 46622, + 46629, 46635, 46642, 46649, 46655, 46662, 46669, 46677, 46684, 46690, + 46697, 46705, 46712, 46716, 46722, 46734, 46746, 46750, 46754, 46758, + 46762, 46772, 46776, 46781, 46786, 46792, 46798, 46804, 46810, 46820, + 46830, 46838, 46849, 46860, 46868, 46879, 46890, 46898, 46909, 46920, + 46928, 46936, 46946, 46956, 46959, 46962, 46965, 46970, 46974, 46980, + 46987, 46994, 47002, 47009, 47013, 47017, 47021, 47025, 47027, 47031, + 47035, 47040, 47045, 47052, 47059, 47062, 47069, 47071, 47073, 47077, + 47081, 47086, 47092, 47098, 47104, 47110, 47119, 47128, 47137, 47141, + 47143, 47147, 47154, 47161, 47168, 47175, 47182, 47185, 47190, 47196, + 47199, 47204, 47209, 47214, 47219, 47223, 47230, 47237, 47244, 47251, + 47255, 47259, 47263, 47267, 47273, 47279, 47284, 47290, 47296, 47302, + 47308, 47316, 47323, 47330, 47337, 47344, 47350, 47356, 47365, 47369, + 47376, 47380, 47384, 47390, 47396, 47402, 47408, 47412, 47416, 47419, + 47423, 47427, 47434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 47441, 47444, 47448, 47452, 47458, 47464, 47470, + 47478, 47485, 47489, 47497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 47502, 47505, 47508, 47511, 47514, 47517, 47520, 47523, + 47526, 47529, 47533, 47537, 47541, 47545, 47549, 47553, 47557, 47561, + 47565, 47569, 47573, 47576, 47579, 47582, 47585, 47588, 47591, 47594, + 47597, 47600, 47604, 47608, 47612, 47616, 47620, 47624, 47628, 47632, + 47636, 47640, 47644, 47650, 47656, 47662, 47669, 47676, 47683, 47690, + 47697, 47704, 47711, 47718, 47725, 47732, 47739, 47746, 47753, 47760, + 47767, 47774, 47781, 47786, 47792, 47798, 47804, 47809, 47815, 47821, + 47827, 47832, 47838, 47844, 47849, 47855, 47861, 47866, 47872, 47878, + 47883, 47889, 47895, 47900, 47906, 47912, 47918, 47924, 47930, 47935, + 47941, 47947, 47953, 47958, 47964, 47970, 47976, 47981, 47987, 47993, + 47998, 48004, 48010, 48015, 48021, 48027, 48032, 48038, 48044, 48049, + 48055, 48061, 48067, 48073, 48079, 48084, 48090, 48096, 48102, 48107, + 48113, 48119, 48125, 48130, 48136, 48142, 48147, 48153, 48159, 48164, + 48170, 48176, 48181, 48187, 48193, 48198, 48204, 48210, 48216, 48222, + 48228, 48232, 48238, 48244, 48250, 48256, 48262, 48268, 48274, 48280, + 48286, 48292, 48296, 48300, 48304, 48308, 48312, 48316, 48320, 48324, + 48328, 48333, 48339, 48344, 48349, 48354, 48359, 48368, 48377, 48386, + 48395, 48404, 48413, 48422, 48431, 48438, 48446, 48454, 48461, 48468, + 48476, 48484, 48491, 48498, 48506, 48514, 48521, 48528, 48536, 48544, + 48551, 48558, 48566, 48575, 48584, 48592, 48601, 48610, 48617, 48624, + 48632, 48641, 48650, 48658, 48667, 48676, 48683, 48690, 48699, 48708, + 48717, 48726, 48735, 48744, 48751, 48758, 48767, 48776, 48785, 48794, + 48803, 48812, 48819, 48826, 48835, 48844, 48853, 48863, 48873, 48882, + 48892, 48902, 48912, 48922, 48932, 48942, 48951, 48960, 48967, 48975, + 48983, 48991, 48999, 49004, 49009, 49018, 49026, 49033, 49042, 49050, + 49057, 49066, 49074, 49081, 49090, 49098, 49105, 49114, 49122, 49129, + 49138, 49146, 49153, 49163, 49172, 49179, 49189, 49198, 49205, 49215, + 49224, 49231, 49240, 49249, 49258, 49267, 49278, 49289, 49296, 49301, + 49306, 49311, 49316, 49321, 49326, 49331, 49336, 49344, 49352, 49360, + 49368, 49372, 49378, 49384, 49390, 49394, 49401, 49407, 49414, 49418, + 49425, 49431, 49438, 49442, 49448, 49454, 49460, 49464, 49467, 49471, + 49475, 49481, 49487, 49492, 49497, 49502, 49513, 49521, 49532, 49543, + 49548, 49556, 49567, 49570, 49573, 49580, 49588, 49594, 49599, 49607, + 49616, 49625, 49633, 49637, 49641, 49644, 49647, 49651, 49655, 49658, + 49661, 49666, 49671, 49677, 49683, 49688, 49693, 49699, 49705, 49710, + 49715, 49720, 49725, 49731, 49737, 49742, 49747, 49753, 49759, 49764, + 49769, 49772, 49775, 49784, 49786, 49788, 49791, 49795, 49801, 49803, + 49806, 49813, 49820, 49827, 49834, 49843, 49856, 49861, 49866, 49870, + 49875, 49882, 49889, 49897, 49905, 49913, 49921, 49925, 49929, 49934, + 49939, 49944, 49949, 49952, 49958, 49964, 49973, 49982, 49990, 49998, + 50007, 50016, 50020, 50027, 50034, 50041, 50048, 50056, 50064, 50072, + 50080, 50084, 50088, 50092, 50097, 50102, 50108, 50114, 50118, 50124, + 50126, 50128, 50130, 50132, 50135, 50138, 50140, 50142, 50144, 50148, + 50152, 50154, 50156, 50159, 50162, 50166, 50172, 50178, 50180, 50187, + 50191, 50196, 50201, 50203, 50213, 50219, 50225, 50231, 50237, 50243, + 50249, 50254, 50257, 50260, 50263, 50265, 50267, 50271, 50275, 50280, + 50285, 50290, 50293, 50297, 50302, 50305, 50309, 50314, 50319, 50324, + 50329, 50334, 50339, 50344, 50349, 50354, 50359, 50364, 50369, 50375, + 50381, 50387, 50389, 50392, 50394, 50397, 50399, 50401, 50403, 50405, + 50407, 50409, 50411, 50413, 50415, 50417, 50419, 50421, 50423, 50425, + 50427, 50429, 50431, 50436, 50441, 50446, 50451, 50456, 50461, 50466, + 50471, 50476, 50481, 50486, 50491, 50496, 50501, 50506, 50511, 50516, + 50521, 50526, 50531, 50535, 50539, 50543, 50549, 50555, 50560, 50565, + 50570, 50576, 50582, 50587, 50595, 50603, 50611, 50619, 50627, 50635, + 50643, 50651, 50657, 50662, 50667, 50672, 50675, 50679, 50683, 50687, + 50691, 50695, 50699, 50706, 50713, 50721, 50729, 50734, 50739, 50746, + 50753, 50760, 50767, 50770, 50773, 50778, 50780, 50784, 50789, 50791, + 50793, 50795, 50797, 50802, 50805, 50807, 50812, 50819, 50826, 50829, + 50833, 50838, 50843, 50851, 50857, 50863, 50875, 50882, 50890, 50895, + 50900, 50906, 50909, 50912, 50917, 50919, 50923, 50925, 50927, 50929, + 50931, 50933, 50935, 50940, 50942, 50944, 50946, 50948, 50952, 50954, + 50957, 50962, 50967, 50972, 50977, 50983, 50989, 50991, 50994, 51001, + 51007, 51013, 51020, 51024, 51028, 51030, 51032, 51036, 51042, 51047, + 51049, 51053, 51062, 51070, 51078, 51084, 51090, 51095, 51101, 51106, + 51109, 51123, 51126, 51131, 51136, 51142, 51153, 51155, 51161, 51167, + 51171, 51178, 51182, 51184, 51186, 51190, 51196, 51201, 51207, 51209, + 51215, 51217, 51223, 51225, 51227, 51232, 51234, 51238, 51243, 51245, + 51250, 51255, 51259, 51266, 51276, 51281, 51286, 51289, 51294, 51297, + 51302, 51307, 51311, 51313, 51315, 51319, 51323, 51327, 51331, 51335, + 51337, 51341, 51344, 51347, 51350, 51354, 51358, 51363, 51367, 51372, + 51377, 51381, 51387, 51394, 51397, 51403, 51408, 51412, 51417, 51423, + 51429, 51436, 51442, 51449, 51456, 51458, 51465, 51469, 51476, 51482, + 51487, 51493, 51497, 51502, 51505, 51511, 51517, 51524, 51532, 51539, + 51548, 51558, 51565, 51571, 51575, 51583, 51588, 51597, 51600, 51603, + 51612, 51623, 51630, 51632, 51638, 51643, 51645, 51648, 51652, 51660, + 51669, 51672, 51677, 51683, 51690, 51697, 51704, 51711, 51717, 51723, + 51729, 51737, 51742, 51745, 51749, 51752, 51763, 51773, 51783, 51792, + 51803, 51813, 51822, 51828, 51836, 51840, 51848, 51852, 51860, 51867, + 51874, 51883, 51892, 51902, 51912, 51922, 51932, 51941, 51950, 51960, + 51970, 51979, 51988, 51995, 52002, 52009, 52016, 52023, 52030, 52037, + 52044, 52051, 52059, 52065, 52071, 52077, 52083, 52089, 52095, 52101, + 52107, 52113, 52120, 52128, 52136, 52144, 52152, 52160, 52168, 52176, + 52184, 52192, 52201, 52206, 52209, 52213, 52217, 52223, 52226, 52231, + 52237, 52242, 52246, 52251, 52257, 52264, 52267, 52274, 52281, 52285, + 52294, 52303, 52308, 52314, 52319, 52324, 52331, 52338, 52345, 52352, + 52360, 52364, 52372, 52377, 52381, 52388, 52392, 52398, 52406, 52411, + 52418, 52422, 52427, 52431, 52436, 52440, 52445, 52450, 52459, 52461, + 52465, 52469, 52476, 52483, 52489, 52497, 52503, 52510, 52515, 52518, + 52523, 52528, 52533, 52541, 52545, 52552, 52559, 52566, 52571, 52576, + 52582, 52587, 52592, 52598, 52603, 52606, 52610, 52614, 52621, 52631, + 52636, 52645, 52654, 52660, 52666, 52671, 52676, 52681, 52686, 52692, + 52698, 52706, 52714, 52720, 52726, 52731, 52736, 52743, 52750, 52756, + 52759, 52762, 52766, 52770, 52774, 52779, 52785, 52791, 52798, 52805, + 52810, 52814, 52818, 52822, 52826, 52830, 52834, 52838, 52842, 52846, + 52850, 52854, 52858, 52862, 52866, 52870, 52874, 52878, 52882, 52886, + 52890, 52894, 52898, 52902, 52906, 52910, 52914, 52918, 52922, 52926, + 52930, 52934, 52938, 52942, 52946, 52950, 52954, 52958, 52962, 52966, + 52970, 52974, 52978, 52982, 52986, 52990, 52994, 52998, 53002, 53006, + 53010, 53014, 53018, 53022, 53026, 53030, 53034, 53038, 53042, 53046, + 53050, 53054, 53058, 53062, 53066, 53070, 53074, 53078, 53082, 53086, + 53090, 53094, 53098, 53102, 53106, 53110, 53114, 53118, 53122, 53126, + 53130, 53134, 53138, 53142, 53146, 53150, 53154, 53158, 53162, 53166, + 53170, 53174, 53178, 53182, 53186, 53190, 53194, 53198, 53202, 53206, + 53210, 53214, 53218, 53222, 53226, 53230, 53234, 53238, 53242, 53246, + 53250, 53254, 53258, 53262, 53266, 53270, 53274, 53278, 53282, 53286, + 53290, 53294, 53298, 53302, 53306, 53310, 53314, 53318, 53322, 53326, + 53330, 53334, 53338, 53342, 53346, 53350, 53354, 53358, 53362, 53366, + 53370, 53374, 53378, 53382, 53386, 53390, 53394, 53398, 53402, 53406, + 53410, 53414, 53418, 53422, 53426, 53430, 53434, 53438, 53442, 53446, + 53450, 53454, 53458, 53462, 53466, 53470, 53474, 53478, 53482, 53486, + 53490, 53494, 53498, 53502, 53506, 53510, 53514, 53518, 53522, 53526, + 53530, 53534, 53538, 53542, 53546, 53550, 53554, 53558, 53562, 53566, + 53570, 53574, 53578, 53582, 53586, 53590, 53594, 53598, 53602, 53606, + 53610, 53614, 53618, 53622, 53626, 53630, 53634, 53638, 53642, 53646, + 53650, 53654, 53658, 53662, 53666, 53670, 53674, 53678, 53682, 53686, + 53690, 53694, 53698, 53702, 53706, 53710, 53714, 53718, 53722, 53726, + 53730, 53734, 53738, 53742, 53746, 53750, 53754, 53758, 53762, 53766, + 53770, 53774, 53778, 53782, 53786, 53790, 53794, 53798, 53802, 53806, + 53810, 53814, 53818, 53822, 53826, 53830, 53834, 53841, 53849, 53855, + 53861, 53868, 53875, 53881, 53887, 53894, 53901, 53906, 53911, 53916, + 53921, 53927, 53933, 53941, 53948, 53953, 53958, 53966, 53975, 53982, + 53992, 54003, 54006, 54009, 54013, 54017, 54023, 54029, 54039, 54049, + 54058, 54067, 54073, 54079, 54086, 54093, 54102, 54112, 54123, 54133, + 54143, 54153, 54164, 54175, 54185, 54196, 54206, 54216, 54225, 54235, + 54245, 54256, 54267, 54274, 54281, 54288, 54295, 54305, 54315, 54322, + 54329, 54336, 54343, 54350, 54357, 54364, 54369, 54374, 54380, 54388, + 54398, 54406, 54414, 54422, 54430, 54438, 54446, 54454, 54462, 54470, + 54478, 54487, 54496, 54504, 54512, 54521, 54530, 54539, 54548, 54558, + 54568, 54577, 54586, 54596, 54606, 54620, 54637, 54651, 54668, 54682, + 54696, 54710, 54724, 54734, 54745, 54755, 54766, 54783, 54800, 54808, + 54814, 54821, 54828, 54835, 54842, 54847, 54853, 54858, 54863, 54869, + 54874, 54879, 54884, 54889, 54894, 54901, 54907, 54915, 54920, 54925, + 54929, 54933, 54941, 54949, 54957, 54965, 54972, 54979, 54992, 55005, + 55018, 55031, 55039, 55047, 55053, 55059, 55066, 55073, 55080, 55087, + 55091, 55096, 55104, 55112, 55120, 55127, 55131, 55139, 55147, 55150, + 55154, 55159, 55166, 55174, 55182, 55202, 55222, 55242, 55262, 55282, + 55302, 55322, 55342, 55348, 55355, 55364, 55372, 55380, 55386, 55389, + 55392, 55397, 55400, 55420, 55427, 55433, 55439, 55443, 55446, 55449, + 55452, 55463, 55476, 55483, 55490, 55493, 55497, 55500, 55505, 55510, + 55515, 55521, 55530, 55537, 55544, 55552, 55559, 55566, 55569, 55575, + 55581, 55584, 55587, 55592, 55597, 55603, 55609, 55613, 55618, 55625, + 55629, 55635, 55639, 55643, 55651, 55663, 55671, 55675, 55677, 55686, + 55695, 55701, 55704, 55710, 55716, 55721, 55726, 55731, 55736, 55741, + 55746, 55748, 55754, 55759, 55767, 55771, 55777, 55780, 55784, 55791, + 55798, 55800, 55802, 55808, 55814, 55820, 55829, 55838, 55845, 55852, + 55858, 55865, 55870, 55875, 55880, 55886, 55892, 55897, 55904, 55908, + 55912, 55925, 55938, 55950, 55959, 55965, 55972, 55977, 55982, 55987, + 55992, 55997, 55999, 56006, 56014, 56022, 56030, 56037, 56045, 56051, + 56056, 56062, 56068, 56074, 56081, 56087, 56095, 56103, 56111, 56119, + 56127, 56133, 56139, 56148, 56152, 56161, 56170, 56179, 56187, 56191, + 56197, 56204, 56211, 56215, 56221, 56229, 56235, 56240, 56246, 56251, + 56256, 56263, 56270, 56275, 56280, 56288, 56296, 56306, 56316, 56323, + 56330, 56334, 56338, 56350, 56356, 56363, 56368, 56373, 56380, 56387, + 56393, 56399, 56409, 56416, 56424, 56432, 56441, 56448, 56454, 56461, + 56467, 56475, 56483, 56491, 56499, 56505, 56510, 56520, 56531, 56538, + 56547, 56553, 56558, 56563, 56572, 56579, 56585, 56591, 56599, 56604, + 56611, 56618, 56631, 56639, 56646, 56653, 56660, 56667, 56675, 56683, + 56695, 56707, 56718, 56729, 56742, 56755, 56761, 56767, 56776, 56785, + 56792, 56799, 56808, 56817, 56826, 56835, 56843, 56851, 56861, 56871, + 56885, 56899, 56907, 56915, 56927, 56939, 56947, 56955, 56965, 56975, + 56981, 56987, 56996, 57005, 57010, 57015, 57023, 57029, 57035, 57043, + 57051, 57064, 57077, 57081, 57085, 57093, 57101, 57108, 57116, 57124, + 57133, 57142, 57148, 57154, 57161, 57168, 57175, 57182, 57191, 57200, + 57203, 57206, 57211, 57216, 57222, 57228, 57235, 57242, 57252, 57262, + 57269, 57276, 57284, 57292, 57300, 57308, 57316, 57324, 57331, 57338, + 57342, 57346, 57354, 57362, 57367, 57372, 57377, 57382, 57388, 57402, + 57409, 57416, 57420, 57422, 57424, 57429, 57434, 57439, 57444, 57452, + 57459, 57466, 57474, 57486, 57494, 57502, 57513, 57517, 57521, 57527, + 57535, 57548, 57555, 57562, 57569, 57575, 57582, 57591, 57600, 57606, + 57612, 57618, 57628, 57638, 57646, 57655, 57660, 57663, 57668, 57673, + 57678, 57684, 57690, 57694, 57697, 57701, 57705, 57710, 57715, 57721, + 57727, 57731, 57735, 57742, 57749, 57756, 57763, 57770, 57777, 57786, + 57795, 57802, 57809, 57817, 57825, 57829, 57834, 57839, 57845, 57851, + 57854, 57857, 57860, 57863, 57868, 57873, 57878, 57883, 57888, 57893, + 57897, 57901, 57905, 57910, 57915, 57919, 57923, 57929, 57933, 57939, + 57944, 57951, 57959, 57966, 57974, 57981, 57989, 57998, 58005, 58015, + 58026, 58032, 58041, 58047, 58056, 58065, 58071, 58077, 58081, 58085, + 58094, 58103, 58110, 58117, 58126, 58135, 58142, 58148, 58155, 58160, + 58164, 58168, 58173, 58178, 58183, 58191, 58199, 58202, 58206, 58215, + 58225, 58234, 58244, 58256, 58270, 58274, 58279, 58283, 58288, 58293, + 58298, 58304, 58310, 58317, 58324, 58330, 58337, 58343, 58350, 58359, + 58368, 58374, 58381, 58387, 0, 0, 58394, 58402, 58410, 58419, 58428, + 58437, 58447, 58456, 58466, 58472, 58477, 58486, 58498, 58507, 58519, + 58526, 58534, 58541, 58549, 58554, 58560, 58565, 58571, 58579, 58588, + 58596, 58605, 58609, 58613, 58617, 58621, 58631, 0, 58634, 58641, 58650, + 58660, 58669, 58679, 58685, 58692, 58698, 58705, 58716, 58727, 58738, + 58749, 58759, 58769, 58779, 58789, 58797, 58805, 58813, 58821, 58829, + 58837, 58845, 58853, 58859, 58865, 58871, 58877, 58883, 58889, 58895, + 58901, 58913, 58923, 58928, 58935, 58940, 58947, 58950, 58954, 58958, + 58963, 58967, 58972, 58975, 58984, 58993, 59002, 59011, 59016, 59022, + 59028, 59036, 59046, 59053, 59062, 59067, 59070, 59073, 59078, 59083, + 59088, 59093, 59095, 59097, 59099, 59101, 59103, 59105, 59110, 59117, + 59124, 59126, 59128, 59130, 59132, 59134, 59136, 59138, 59140, 59145, + 59150, 59157, 59164, 59173, 59183, 59192, 59202, 59207, 59212, 59214, + 59221, 59228, 59235, 59242, 59249, 59256, 59263, 59266, 59269, 59272, + 59275, 59280, 59285, 59290, 59295, 59300, 59305, 59310, 59315, 59320, + 59325, 59330, 59335, 59341, 59345, 59350, 59355, 59360, 59365, 59370, + 59375, 59380, 59385, 59390, 59395, 59400, 59405, 59410, 59415, 59420, + 59425, 59430, 59435, 59440, 59445, 59450, 59455, 59461, 59466, 59472, + 59481, 59486, 59494, 59501, 59510, 59515, 59520, 59525, 59531, 0, 59538, + 59543, 59548, 59553, 59558, 59563, 59568, 59573, 59578, 59583, 59588, + 59594, 59598, 59603, 59608, 59613, 59618, 59623, 59628, 59633, 59638, + 59643, 59648, 59653, 59658, 59663, 59668, 59673, 59678, 59683, 59688, + 59693, 59698, 59703, 59708, 59714, 59719, 59725, 59734, 59739, 59747, + 59754, 59763, 59768, 59773, 59778, 59784, 0, 59791, 59799, 59807, 59816, + 59823, 59831, 59837, 59846, 59854, 59862, 59870, 59878, 59886, 59894, + 59899, 59906, 59911, 59917, 59925, 59932, 59939, 59947, 59953, 59959, + 59966, 59974, 59983, 59993, 59999, 60006, 60011, 60021, 60031, 60036, + 60041, 60046, 60051, 60056, 60061, 60066, 60071, 60076, 60081, 60086, + 60091, 60096, 60101, 60106, 60111, 60116, 60121, 60126, 60131, 60136, + 60141, 60146, 60151, 60156, 60161, 60166, 60171, 60176, 60181, 60185, + 60189, 60194, 60199, 60204, 60209, 60214, 60219, 60224, 60229, 60234, + 60239, 60244, 60249, 60254, 60259, 60264, 60269, 60274, 60279, 60286, + 60293, 60300, 60307, 60314, 60321, 60328, 60335, 60342, 60349, 60356, + 60363, 60370, 60377, 60382, 60387, 60394, 60401, 60408, 60415, 60422, + 60429, 60436, 60443, 60450, 60457, 60464, 60471, 60477, 60483, 60489, + 60495, 60502, 60509, 60516, 60523, 60530, 60537, 60544, 60551, 60558, + 60565, 60573, 60581, 60589, 60597, 60605, 60613, 60621, 60629, 60633, + 60639, 60645, 60649, 60655, 60661, 60667, 60674, 60681, 60688, 60695, + 60700, 60706, 60712, 60719, 0, 0, 0, 0, 0, 60726, 60734, 60743, 60752, + 60760, 60766, 60771, 60776, 60781, 60786, 60791, 60796, 60801, 60806, + 60811, 60816, 60821, 60826, 60831, 60836, 60841, 60846, 60851, 60856, + 60861, 60866, 60871, 60876, 60881, 60886, 60891, 60896, 60901, 60906, + 60911, 60916, 60921, 60926, 60931, 60936, 60941, 60946, 60951, 60956, + 60961, 0, 60966, 0, 0, 0, 0, 0, 60971, 0, 0, 60976, 60980, 60985, 60990, + 60995, 61000, 61009, 61014, 61019, 61024, 61029, 61034, 61039, 61044, + 61049, 61056, 61061, 61066, 61075, 61082, 61087, 61092, 61097, 61104, + 61109, 61116, 61121, 61126, 61133, 61140, 61145, 61150, 61155, 61162, + 61169, 61174, 61179, 61184, 61189, 61194, 61201, 61208, 61213, 61218, + 61223, 61228, 61233, 61238, 61243, 61248, 61253, 61258, 61263, 61270, + 61275, 61280, 0, 0, 0, 0, 0, 0, 0, 61285, 61292, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 61297, 61302, 61306, 61310, 61314, 61318, 61322, 61326, + 61330, 61334, 61338, 61342, 61348, 61352, 61356, 61360, 61364, 61368, + 61372, 61376, 61380, 61384, 61388, 61392, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 61396, 61400, 61404, 61408, 61412, 61416, 61420, 0, 61424, 61428, 61432, + 61436, 61440, 61444, 61448, 0, 61452, 61456, 61460, 61464, 61468, 61472, + 61476, 0, 61480, 61484, 61488, 61492, 61496, 61500, 61504, 0, 61508, + 61512, 61516, 61520, 61524, 61528, 61532, 0, 61536, 61540, 61544, 61548, + 61552, 61556, 61560, 0, 61564, 61568, 61572, 61576, 61580, 61584, 61588, + 0, 61592, 61596, 61600, 61604, 61608, 61612, 61616, 0, 61620, 61625, + 61630, 61635, 61640, 61645, 61650, 61654, 61659, 61664, 61669, 61673, + 61678, 61683, 61688, 61693, 61697, 61702, 61707, 61712, 61717, 61722, + 61727, 61731, 61736, 61741, 61748, 61753, 61758, 61764, 61771, 61778, + 61787, 61794, 61803, 61807, 61811, 61817, 61823, 61829, 61837, 61843, + 61847, 61851, 61855, 61861, 61867, 61871, 61873, 61877, 61883, 61885, + 61889, 61893, 61897, 61903, 61908, 61912, 61916, 61921, 61927, 61932, + 61937, 61942, 61947, 61954, 61961, 61966, 61971, 61976, 61981, 61986, + 61991, 61995, 61999, 62007, 62015, 62021, 62025, 62030, 62033, 62037, + 62044, 62047, 62051, 62055, 62058, 62064, 62070, 62073, 62079, 62083, + 62087, 62093, 62098, 62103, 62105, 62108, 62112, 62118, 62124, 62128, + 62133, 62142, 62145, 62151, 62156, 62160, 62164, 62168, 62171, 62176, + 62182, 62190, 62198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 61976, 61980, 61984, 61989, 61994, 61999, 62003, 62007, 62011, 62016, - 62021, 62025, 62029, 62033, 62037, 62042, 62047, 62052, 62057, 62061, - 62065, 62070, 62075, 62080, 62085, 62089, 0, 62093, 62097, 62101, 62105, - 62109, 62113, 62117, 62122, 62127, 62131, 62136, 62141, 62150, 62154, - 62158, 62162, 62169, 62173, 62178, 62183, 62187, 62191, 62197, 62202, - 62207, 62212, 62217, 62221, 62225, 62229, 62233, 62237, 62242, 62247, - 62251, 62255, 62260, 62265, 62270, 62274, 62278, 62283, 62288, 62294, - 62300, 62304, 62310, 62316, 62320, 62326, 62332, 62337, 62342, 62346, - 62352, 62356, 62360, 62366, 62372, 62377, 62382, 62386, 62390, 62398, - 62404, 62410, 62416, 62421, 62426, 62431, 62437, 62441, 62447, 62451, - 62455, 62461, 62467, 62473, 62479, 62485, 62491, 62497, 62503, 62509, - 62515, 62521, 62527, 62531, 62537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 62543, 62546, 62550, 62554, 62558, 62562, 62565, 62568, 62572, 62576, - 62580, 62584, 62587, 62592, 62596, 62600, 62604, 62609, 62613, 62617, - 62621, 62625, 62631, 62637, 62641, 62645, 62649, 62653, 62657, 62661, - 62665, 62669, 62673, 62677, 62681, 62687, 62691, 62695, 62699, 62703, - 62707, 62711, 62715, 62719, 62723, 62727, 62731, 62735, 62739, 62743, - 62747, 62751, 62757, 62763, 62768, 62773, 62777, 62781, 62785, 62789, - 62793, 62797, 62801, 62805, 62809, 62813, 62817, 62821, 62825, 62829, - 62833, 62837, 62841, 62845, 62849, 62853, 62857, 62861, 62865, 62869, - 62875, 62879, 62883, 62887, 62891, 62895, 62899, 62903, 62907, 62912, - 62919, 62923, 62927, 62931, 62935, 62939, 62943, 62947, 62951, 62955, - 62959, 62963, 62967, 62974, 62978, 62984, 62988, 62992, 62996, 63000, - 63004, 63007, 63011, 63015, 63019, 63023, 63027, 63031, 63035, 63039, - 63043, 63047, 63051, 63055, 63059, 63063, 63067, 63071, 63075, 63079, - 63083, 63087, 63091, 63095, 63099, 63103, 63107, 63111, 63115, 63119, - 63123, 63127, 63131, 63135, 63141, 63145, 63149, 63153, 63157, 63161, - 63165, 63169, 63173, 63177, 63181, 63185, 63189, 63193, 63197, 63201, - 63205, 63209, 63213, 63217, 63221, 63225, 63229, 63233, 63237, 63241, - 63245, 63249, 63257, 63261, 63265, 63269, 63273, 63277, 63283, 63287, - 63291, 63295, 63299, 63303, 63307, 63311, 63315, 63319, 63323, 63327, - 63331, 63335, 63341, 63345, 63349, 63353, 63357, 63361, 63365, 63369, - 63373, 63377, 63381, 63385, 63389, 63393, 63397, 63401, 63405, 63409, - 63413, 63417, 63421, 63425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63429, 63438, 63446, 63457, 63467, - 63475, 63484, 63493, 63503, 63515, 63527, 63539, 0, 0, 0, 0, 63545, - 63548, 63551, 63556, 63559, 63566, 63570, 63574, 63578, 63582, 63586, - 63591, 63596, 63600, 63604, 63609, 63614, 63619, 63624, 63627, 63630, - 63636, 63642, 63647, 63652, 63659, 63666, 63670, 63674, 63678, 63686, - 63692, 63699, 63704, 63709, 63714, 63719, 63724, 63729, 63734, 63739, - 63744, 63749, 63754, 63759, 63764, 63769, 63775, 63780, 63784, 63790, - 63801, 63811, 63826, 63836, 63840, 63850, 63856, 63862, 63868, 63873, - 63876, 63881, 63885, 0, 63891, 63895, 63898, 63902, 63905, 63909, 63912, - 63916, 63919, 63923, 63926, 63929, 63933, 63937, 63941, 63945, 63949, - 63953, 63957, 63961, 63965, 63968, 63972, 63976, 63980, 63984, 63988, - 63992, 63996, 64000, 64004, 64007, 64011, 64015, 64019, 64024, 64028, - 64032, 64036, 64040, 64043, 64047, 64050, 64054, 64058, 64062, 64066, - 64069, 64073, 64076, 64080, 64084, 64088, 64092, 64096, 64100, 64104, - 64108, 64112, 64116, 64120, 64124, 64127, 64131, 64135, 64139, 64143, - 64147, 64150, 64155, 64159, 64164, 64168, 64171, 64175, 64179, 64183, - 64187, 64192, 64196, 64200, 64204, 64208, 64212, 64216, 64220, 0, 0, - 64225, 64233, 64241, 64248, 64255, 64259, 64265, 64270, 64275, 64279, - 64282, 64286, 64289, 64293, 64296, 64300, 64303, 64307, 64310, 64313, - 64317, 64321, 64325, 64329, 64333, 64337, 64341, 64345, 64349, 64352, - 64356, 64360, 64364, 64368, 64372, 64376, 64380, 64384, 64388, 64391, - 64395, 64399, 64403, 64408, 64412, 64416, 64420, 64424, 64427, 64431, - 64434, 64438, 64442, 64446, 64450, 64453, 64457, 64460, 64464, 64468, - 64472, 64476, 64480, 64484, 64488, 64492, 64496, 64500, 64504, 64508, - 64511, 64515, 64519, 64523, 64527, 64531, 64534, 64539, 64543, 64548, - 64552, 64555, 64559, 64563, 64567, 64571, 64576, 64580, 64584, 64588, - 64592, 64596, 64600, 64604, 64609, 64613, 64617, 64621, 64625, 64629, - 64636, 64640, 64646, 0, 0, 0, 0, 0, 64651, 64656, 64661, 64666, 64671, - 64676, 64681, 64686, 64690, 64695, 64700, 64705, 64710, 64715, 64720, - 64725, 64730, 64735, 64739, 64744, 64749, 64754, 64758, 64762, 64766, - 64771, 64776, 64781, 64786, 64791, 64796, 64801, 64806, 64811, 64816, - 64820, 64824, 64829, 64834, 64839, 64844, 64849, 64856, 0, 64861, 64865, - 64869, 64873, 64877, 64881, 64885, 64889, 64893, 64897, 64901, 64905, - 64909, 64913, 64917, 64921, 64925, 64929, 64933, 64937, 64941, 64945, - 64949, 64953, 64957, 64961, 64965, 64969, 64973, 64977, 64981, 64984, - 64988, 64991, 64995, 64999, 65002, 65006, 65010, 65013, 65017, 65021, - 65025, 65029, 65032, 65036, 65040, 65044, 65048, 65052, 65056, 65059, - 65062, 65066, 65070, 65074, 65078, 65082, 65086, 65090, 65094, 65098, - 65102, 65106, 65110, 65114, 65118, 65122, 65126, 65130, 65134, 65138, - 65142, 65146, 65150, 65154, 65158, 65162, 65166, 65170, 65174, 65178, - 65182, 65186, 65190, 65194, 65198, 65202, 65206, 65210, 65214, 65218, - 65222, 65226, 0, 65230, 65236, 65242, 65247, 65252, 65257, 65263, 65269, - 65274, 65280, 65286, 65292, 65298, 65304, 65310, 65316, 65322, 65327, - 65332, 65337, 65342, 65347, 65352, 65357, 65362, 65367, 65372, 65377, - 65382, 65387, 65392, 65397, 65402, 65407, 65412, 65417, 65422, 65428, - 65434, 65440, 65446, 65451, 65456, 0, 0, 0, 0, 0, 65461, 65466, 65471, - 65476, 65481, 65486, 65491, 65496, 65501, 65506, 65511, 65516, 65521, - 65526, 65531, 65536, 65541, 65546, 65551, 65556, 65561, 65566, 65571, - 65576, 65581, 65586, 65591, 65596, 65601, 65606, 65611, 65616, 65621, - 65626, 65631, 65636, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65641, 65646, - 65651, 65656, 65660, 65665, 65669, 65674, 65679, 65684, 65689, 65694, - 65698, 65703, 65708, 65713, 65718, 65722, 65726, 65730, 65734, 65738, - 65742, 65746, 65750, 65754, 65758, 65762, 65766, 65770, 65774, 65779, - 65784, 65789, 65794, 65799, 65804, 65809, 65814, 65819, 65824, 65829, - 65834, 65839, 65844, 65849, 65855, 0, 65862, 65866, 65870, 65874, 65878, - 65882, 65886, 65890, 65894, 65898, 65903, 65908, 65913, 65918, 65923, - 65928, 65933, 65938, 65943, 65948, 65953, 65958, 65963, 65968, 65973, - 65978, 65983, 65988, 65993, 65998, 66003, 66008, 66013, 66018, 66023, - 66028, 66033, 66038, 66043, 66048, 66053, 66062, 66071, 66080, 66089, - 66098, 66107, 66116, 66125, 66128, 66133, 66138, 66143, 66148, 66153, - 66158, 66163, 66168, 66173, 66177, 66182, 66187, 66192, 66197, 66202, - 66206, 66210, 66214, 66218, 66222, 66226, 66230, 66234, 66238, 66242, - 66246, 66250, 66254, 66258, 66263, 66268, 66273, 66278, 66283, 66288, - 66293, 66298, 66303, 66308, 66313, 66318, 66323, 66328, 66334, 66340, - 66345, 66350, 66354, 66358, 66362, 66366, 66370, 66374, 66378, 66382, - 66386, 66391, 66396, 66401, 66406, 66411, 66416, 66421, 66426, 66431, - 66436, 66441, 66446, 66451, 66456, 66461, 66466, 66471, 66476, 66481, - 66486, 66491, 66496, 66501, 66506, 66511, 66516, 66521, 66526, 66531, - 66536, 66541, 66546, 66551, 66556, 66561, 66566, 66571, 66576, 66581, - 66586, 66591, 66596, 66601, 66606, 66610, 66615, 66620, 66625, 66630, - 66635, 66640, 66645, 66650, 66655, 66659, 66666, 66673, 66680, 66687, - 66694, 66701, 66708, 66715, 66722, 66729, 66736, 66743, 66746, 66749, - 66752, 66757, 66760, 66763, 66766, 66769, 66772, 66775, 66779, 66783, - 66787, 66791, 66794, 66798, 66802, 66806, 66810, 66813, 66817, 66821, - 66825, 66828, 66831, 66835, 66839, 66843, 66847, 66850, 66854, 66858, - 66862, 66866, 66869, 66873, 66877, 66881, 66885, 66888, 66892, 66896, - 66899, 66903, 66907, 66911, 66915, 66919, 66923, 66927, 66931, 66938, - 66941, 66944, 66947, 66950, 66953, 66956, 66959, 66962, 66965, 66968, - 66971, 66974, 66977, 66980, 66983, 66986, 66989, 66992, 66995, 66998, - 67001, 67004, 67007, 67010, 67013, 67016, 67019, 67022, 67025, 67028, - 67031, 67034, 67037, 67040, 67043, 67046, 67049, 67052, 67055, 67058, - 67061, 67064, 67067, 67070, 67073, 67076, 67079, 67082, 67085, 67088, - 67091, 67094, 67097, 67100, 67103, 67106, 67109, 67112, 67115, 67118, - 67121, 67124, 67127, 67130, 67133, 67136, 67139, 67142, 67145, 67148, - 67151, 67154, 67157, 67160, 67163, 67166, 67169, 67172, 67175, 67178, - 67181, 67184, 67187, 67190, 67193, 67196, 67199, 67202, 67211, 67219, - 67227, 67235, 67243, 67251, 67259, 67267, 67275, 67283, 67292, 67301, - 67310, 67319, 67328, 67337, 67346, 67355, 67364, 67373, 67382, 67391, - 67400, 67409, 67418, 67421, 67424, 67427, 67429, 67432, 67435, 67438, - 67443, 67448, 67451, 67458, 67465, 67472, 67479, 67482, 67487, 67489, - 67493, 67495, 67497, 67500, 67503, 67506, 67509, 67512, 67515, 67518, - 67523, 67528, 67531, 67534, 67537, 67540, 67543, 67546, 67549, 67553, - 67556, 67559, 67562, 67565, 67568, 67573, 67576, 67579, 67582, 67587, - 67592, 67597, 67602, 67607, 67612, 67617, 67622, 67628, 67636, 67638, - 67641, 67644, 67647, 67650, 67656, 67664, 67667, 67670, 67675, 67678, - 67681, 67684, 67689, 67692, 67695, 67700, 67703, 67706, 67711, 67714, - 67717, 67722, 67727, 67732, 67735, 67738, 67741, 67744, 67750, 67753, - 67756, 67759, 67761, 67764, 67767, 67770, 67775, 67778, 67781, 67784, - 67787, 67790, 67795, 67798, 67801, 67804, 67807, 67810, 67813, 67816, - 67819, 67822, 67828, 67833, 67841, 67849, 67857, 67865, 67873, 67881, - 67889, 67897, 67905, 67914, 67923, 67932, 67941, 67950, 67959, 67968, - 67977, 67986, 67995, 68004, 68013, 68022, 68031, 68040, 68049, 68058, - 68067, 68076, 68085, 68094, 68103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 62204, 62208, 62212, 62217, 62222, 62227, 62231, 62235, + 62239, 62244, 62249, 62253, 62257, 62261, 62265, 62270, 62275, 62280, + 62285, 62289, 62293, 62298, 62303, 62308, 62313, 62317, 0, 62321, 62325, + 62329, 62333, 62337, 62341, 62345, 62350, 62355, 62359, 62364, 62369, + 62378, 62382, 62386, 62390, 62397, 62401, 62406, 62411, 62415, 62419, + 62425, 62430, 62435, 62440, 62445, 62449, 62453, 62457, 62461, 62465, + 62470, 62475, 62479, 62483, 62488, 62493, 62498, 62502, 62506, 62511, + 62516, 62522, 62528, 62532, 62538, 62544, 62548, 62554, 62560, 62565, + 62570, 62574, 62580, 62584, 62588, 62594, 62600, 62605, 62610, 62614, + 62618, 62626, 62632, 62638, 62644, 62649, 62654, 62659, 62665, 62669, + 62675, 62679, 62683, 62689, 62695, 62701, 62707, 62713, 62719, 62725, + 62731, 62737, 62743, 62749, 62755, 62759, 62765, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 62771, 62774, 62778, 62782, 62786, 62790, 62793, 62796, + 62800, 62804, 62808, 62812, 62815, 62820, 62824, 62828, 62832, 62838, + 62842, 62846, 62850, 62854, 62861, 62867, 62871, 62875, 62879, 62883, + 62887, 62891, 62895, 62899, 62903, 62907, 62911, 62917, 62921, 62925, + 62929, 62933, 62937, 62941, 62945, 62949, 62953, 62957, 62961, 62965, + 62969, 62973, 62977, 62981, 62987, 62993, 62998, 63003, 63007, 63011, + 63015, 63019, 63023, 63027, 63031, 63035, 63039, 63043, 63047, 63051, + 63055, 63059, 63063, 63067, 63071, 63075, 63079, 63083, 63087, 63091, + 63095, 63099, 63105, 63109, 63113, 63117, 63121, 63125, 63129, 63133, + 63137, 63142, 63149, 63153, 63157, 63161, 63165, 63169, 63173, 63177, + 63181, 63185, 63189, 63193, 63197, 63204, 63208, 63214, 63218, 63222, + 63226, 63230, 63234, 63237, 63241, 63245, 63249, 63253, 63257, 63261, + 63265, 63269, 63273, 63277, 63281, 63285, 63289, 63293, 63297, 63301, + 63305, 63309, 63313, 63317, 63321, 63325, 63329, 63333, 63337, 63341, + 63345, 63349, 63353, 63357, 63361, 63365, 63371, 63375, 63379, 63383, + 63387, 63391, 63395, 63399, 63403, 63407, 63411, 63415, 63419, 63423, + 63427, 63431, 63435, 63439, 63443, 63447, 63451, 63455, 63459, 63463, + 63467, 63471, 63475, 63479, 63487, 63491, 63495, 63499, 63503, 63507, + 63513, 63517, 63521, 63525, 63529, 63533, 63537, 63541, 63545, 63549, + 63553, 63557, 63561, 63565, 63571, 63575, 63579, 63583, 63587, 63591, + 63595, 63599, 63603, 63607, 63611, 63615, 63619, 63623, 63627, 63631, + 63635, 63639, 63643, 63647, 63651, 63655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63659, 63668, 63676, + 63687, 63697, 63706, 63716, 63726, 63737, 63749, 63761, 63773, 0, 0, 0, + 0, 63780, 63783, 63786, 63791, 63794, 63801, 63805, 63809, 63813, 63817, + 63821, 63826, 63831, 63835, 63839, 63844, 63849, 63854, 63859, 63862, + 63865, 63871, 63877, 63882, 63887, 63894, 63901, 63905, 63909, 63913, + 63921, 63927, 63934, 63939, 63944, 63949, 63954, 63959, 63964, 63969, + 63974, 63979, 63984, 63989, 63994, 63999, 64004, 64010, 64015, 64019, + 64025, 64036, 64045, 64059, 64068, 64072, 64082, 64088, 64094, 64100, + 64105, 64108, 64113, 64117, 0, 64123, 64128, 64132, 64137, 64141, 64146, + 64150, 64155, 64159, 64164, 64168, 64172, 64177, 64182, 64187, 64192, + 64197, 64202, 64207, 64212, 64217, 64221, 64226, 64231, 64236, 64241, + 64246, 64251, 64256, 64261, 64266, 64270, 64275, 64280, 64285, 64291, + 64296, 64301, 64306, 64311, 64315, 64320, 64324, 64329, 64334, 64339, + 64344, 64348, 64353, 64357, 64362, 64367, 64372, 64377, 64382, 64387, + 64392, 64397, 64402, 64407, 64412, 64417, 64421, 64426, 64431, 64436, + 64441, 64446, 64450, 64456, 64461, 64467, 64472, 64476, 64481, 64486, + 64491, 64496, 64502, 64507, 64512, 64517, 64522, 64527, 64532, 64537, 0, + 0, 64543, 64551, 64559, 64566, 64573, 64578, 64585, 64591, 64596, 64600, + 64603, 64607, 64610, 64614, 64617, 64621, 64624, 64628, 64631, 64634, + 64638, 64642, 64646, 64650, 64654, 64658, 64662, 64666, 64670, 64673, + 64677, 64681, 64685, 64689, 64693, 64697, 64701, 64705, 64709, 64712, + 64716, 64720, 64724, 64729, 64733, 64737, 64741, 64745, 64748, 64752, + 64755, 64759, 64763, 64767, 64771, 64774, 64778, 64781, 64785, 64789, + 64793, 64797, 64801, 64805, 64809, 64813, 64817, 64821, 64825, 64829, + 64832, 64836, 64840, 64844, 64848, 64852, 64855, 64860, 64864, 64869, + 64873, 64876, 64880, 64884, 64888, 64892, 64897, 64901, 64905, 64909, + 64913, 64917, 64921, 64925, 64930, 64934, 64938, 64942, 64946, 64950, + 64957, 64961, 64967, 0, 0, 0, 0, 0, 64972, 64977, 64982, 64987, 64992, + 64997, 65002, 65007, 65011, 65016, 65021, 65026, 65031, 65036, 65041, + 65046, 65051, 65056, 65060, 65065, 65070, 65075, 65079, 65083, 65087, + 65092, 65097, 65102, 65107, 65112, 65117, 65122, 65127, 65132, 65137, + 65141, 65145, 65150, 65155, 65160, 65165, 65170, 65177, 0, 65182, 65186, + 65190, 65194, 65198, 65202, 65206, 65210, 65214, 65218, 65222, 65226, + 65230, 65234, 65238, 65242, 65246, 65250, 65254, 65258, 65262, 65266, + 65270, 65274, 65278, 65282, 65286, 65290, 65294, 65298, 65302, 65305, + 65309, 65312, 65316, 65320, 65323, 65327, 65331, 65334, 65338, 65342, + 65346, 65350, 65353, 65357, 65361, 65365, 65369, 65373, 65377, 65380, + 65383, 65387, 65391, 65395, 65399, 65403, 65407, 65411, 65415, 65419, + 65423, 65427, 65431, 65435, 65439, 65443, 65447, 65451, 65455, 65459, + 65463, 65467, 65471, 65475, 65479, 65483, 65487, 65491, 65495, 65499, + 65503, 65507, 65511, 65515, 65519, 65523, 65527, 65531, 65535, 65539, + 65543, 65547, 0, 65551, 65557, 65563, 65568, 65573, 65578, 65584, 65590, + 65595, 65601, 65607, 65613, 65619, 65625, 65631, 65637, 65643, 65648, + 65653, 65658, 65663, 65668, 65673, 65678, 65683, 65688, 65693, 65698, + 65703, 65708, 65713, 65718, 65723, 65728, 65733, 65738, 65743, 65749, + 65755, 65761, 65767, 65772, 65777, 65782, 65788, 65793, 65798, 65803, + 65808, 65813, 65818, 65823, 65828, 65833, 65838, 65843, 65848, 65853, + 65858, 65863, 65868, 65873, 65878, 65883, 65888, 65893, 65898, 65903, + 65908, 65913, 65918, 65923, 65928, 65933, 65938, 65943, 65948, 65953, + 65958, 65963, 65968, 65973, 65978, 65983, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 65988, 65993, 65998, 66003, 66007, 66012, 66016, 66021, 66026, + 66031, 66036, 66041, 66045, 66050, 66055, 66060, 66065, 66069, 66073, + 66077, 66081, 66085, 66089, 66093, 66097, 66101, 66105, 66109, 66113, + 66117, 66121, 66126, 66131, 66136, 66141, 66146, 66151, 66156, 66161, + 66166, 66171, 66176, 66181, 66186, 66191, 66196, 66203, 0, 66211, 66215, + 66219, 66223, 66227, 66231, 66235, 66239, 66243, 66247, 66252, 66257, + 66262, 66267, 66272, 66277, 66282, 66287, 66292, 66297, 66302, 66307, + 66312, 66317, 66322, 66327, 66332, 66337, 66342, 66347, 66352, 66357, + 66362, 66367, 66372, 66377, 66382, 66387, 66392, 66397, 66402, 66411, + 66420, 66429, 66438, 66447, 66456, 66465, 66474, 66477, 66482, 66487, + 66492, 66497, 66502, 66507, 66512, 66517, 66522, 66526, 66531, 66536, + 66541, 66546, 66551, 66555, 66559, 66563, 66567, 66571, 66575, 66579, + 66583, 66587, 66591, 66595, 66599, 66603, 66607, 66612, 66617, 66622, + 66627, 66632, 66637, 66642, 66647, 66652, 66657, 66662, 66667, 66672, + 66677, 66684, 66691, 66696, 66701, 66705, 66709, 66713, 66717, 66721, + 66725, 66729, 66733, 66737, 66742, 66747, 66752, 66757, 66762, 66767, + 66772, 66777, 66782, 66787, 66792, 66797, 66802, 66807, 66812, 66817, + 66822, 66827, 66832, 66837, 66842, 66847, 66852, 66857, 66862, 66867, + 66872, 66877, 66882, 66887, 66892, 66897, 66902, 66907, 66912, 66917, + 66922, 66927, 66932, 66937, 66942, 66947, 66952, 66957, 66961, 66966, + 66971, 66976, 66981, 66986, 66991, 66996, 67001, 67006, 67010, 67017, + 67024, 67031, 67038, 67045, 67052, 67059, 67066, 67073, 67080, 67087, + 67094, 67097, 67100, 67103, 67108, 67111, 67114, 67117, 67120, 67123, + 67126, 67130, 67134, 67138, 67142, 67145, 67149, 67153, 67157, 67161, + 67164, 67168, 67172, 67176, 67179, 67182, 67186, 67190, 67194, 67198, + 67201, 67205, 67209, 67213, 67217, 67220, 67224, 67228, 67232, 67236, + 67239, 67243, 67247, 67250, 67254, 67258, 67262, 67266, 67270, 67274, + 67278, 67282, 67289, 67292, 67295, 67298, 67301, 67304, 67307, 67310, + 67313, 67316, 67319, 67322, 67325, 67328, 67331, 67334, 67337, 67340, + 67343, 67346, 67349, 67352, 67355, 67358, 67361, 67364, 67367, 67370, + 67373, 67376, 67379, 67382, 67385, 67388, 67391, 67394, 67397, 67400, + 67403, 67406, 67409, 67412, 67415, 67418, 67421, 67424, 67427, 67430, + 67433, 67436, 67439, 67442, 67445, 67448, 67451, 67454, 67457, 67460, + 67463, 67466, 67469, 67472, 67475, 67478, 67481, 67484, 67487, 67490, + 67493, 67496, 67499, 67502, 67505, 67508, 67511, 67514, 67517, 67520, + 67523, 67526, 67529, 67532, 67535, 67538, 67541, 67544, 67547, 67550, + 67553, 67562, 67570, 67578, 67586, 67594, 67602, 67610, 67618, 67626, + 67634, 67643, 67652, 67661, 67670, 67679, 67688, 67697, 67706, 67715, + 67724, 67733, 67742, 67751, 67760, 67769, 67772, 67775, 67778, 67780, + 67783, 67786, 67789, 67794, 67799, 67802, 67809, 67816, 67823, 67830, + 67833, 67838, 67840, 67844, 67846, 67848, 67851, 67854, 67857, 67860, + 67863, 67866, 67869, 67874, 67879, 67882, 67885, 67888, 67891, 67894, + 67897, 67900, 67904, 67907, 67910, 67913, 67916, 67919, 67924, 67927, + 67930, 67933, 67938, 67943, 67948, 67953, 67958, 67963, 67968, 67973, + 67979, 67987, 67989, 67992, 67995, 67998, 68001, 68007, 68015, 68018, + 68021, 68026, 68029, 68032, 68035, 68040, 68043, 68046, 68051, 68054, + 68057, 68062, 68065, 68068, 68073, 68078, 68083, 68086, 68089, 68092, + 68095, 68101, 68104, 68107, 68110, 68112, 68115, 68118, 68121, 68126, + 68129, 68132, 68135, 68138, 68141, 68146, 68149, 68152, 68155, 68158, + 68161, 68164, 68167, 68170, 68173, 68179, 68184, 68192, 68200, 68208, + 68216, 68224, 68232, 68240, 68248, 68256, 68265, 68274, 68283, 68292, + 68301, 68310, 68319, 68328, 68337, 68346, 68355, 68364, 68373, 68382, + 68391, 68400, 68409, 68418, 68427, 68436, 68445, 68454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -20933,2589 +21496,2825 @@ static const unsigned int phrasebook_offset2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68106, 68115, 68124, 68135, 68142, - 68147, 68152, 68159, 68166, 68172, 68177, 68182, 68187, 68192, 68199, - 68204, 68209, 68214, 68225, 68230, 68235, 68242, 68247, 68254, 68259, - 68264, 68271, 68278, 68285, 68294, 68303, 68308, 68313, 68318, 68325, - 68330, 68340, 68347, 68352, 68357, 68362, 68367, 68372, 68377, 68386, - 68393, 68400, 68405, 68412, 68417, 68424, 68433, 68444, 68449, 68458, - 68463, 68470, 68479, 68488, 68493, 68498, 68505, 68511, 68518, 68525, - 68529, 68533, 68536, 68540, 68544, 68548, 68552, 68556, 68560, 68564, - 68567, 68571, 68575, 68579, 68583, 68587, 68591, 68594, 68598, 68602, - 68605, 68609, 68613, 68617, 68621, 68625, 68629, 68633, 68637, 68641, - 68645, 68649, 68653, 68657, 68661, 68665, 68669, 68673, 68677, 68681, - 68685, 68689, 68693, 68697, 68701, 68705, 68709, 68713, 68717, 68721, - 68725, 68729, 68733, 68737, 68741, 68745, 68749, 68753, 68757, 68761, - 68765, 68769, 68773, 68777, 68781, 68784, 68788, 68792, 68796, 68800, - 68804, 68808, 68812, 68816, 68820, 68824, 68828, 68832, 68836, 68840, - 68844, 68848, 68852, 68856, 68860, 68864, 68868, 68872, 68876, 68880, - 68884, 68888, 68892, 68896, 68900, 68904, 68908, 68912, 68916, 68920, - 68924, 68928, 68932, 68936, 68940, 68944, 68948, 68952, 68956, 68960, - 68964, 68968, 68972, 68976, 68980, 68984, 68988, 68992, 68996, 69000, - 69004, 69008, 69012, 69016, 69020, 69024, 69028, 69032, 69036, 69040, - 69044, 69048, 69052, 69056, 69060, 69064, 69068, 69072, 69076, 69080, - 69084, 69088, 69092, 69096, 69100, 69104, 69108, 69112, 69116, 69120, - 69124, 69128, 69132, 69136, 69140, 69144, 69148, 69152, 69156, 69160, - 69164, 69168, 69172, 69176, 69180, 69184, 69188, 69192, 69196, 69200, - 69204, 69208, 69212, 69216, 69220, 69224, 69228, 69232, 69236, 69240, - 69244, 69248, 69252, 69255, 69259, 69263, 69267, 69271, 69275, 69279, - 69283, 69287, 69291, 69295, 69299, 69303, 69307, 69311, 69315, 69319, - 69323, 69327, 69331, 69335, 69339, 69343, 69347, 69351, 69355, 69359, - 69363, 69367, 69371, 69375, 69379, 69383, 69387, 69391, 69395, 69399, - 69403, 69407, 69411, 69415, 69419, 69423, 69427, 69431, 69435, 69439, - 69443, 69447, 69451, 69455, 69459, 69463, 69467, 69471, 69475, 69479, - 69483, 69487, 69491, 69495, 69499, 69503, 69507, 69511, 69515, 69519, - 69523, 69527, 69531, 69535, 69539, 69543, 69547, 69551, 69555, 69559, - 69563, 69567, 69571, 69575, 69579, 69583, 69587, 69591, 69595, 69599, - 69603, 69607, 69611, 69615, 69619, 69623, 69627, 69631, 69635, 69639, - 69643, 69647, 69651, 69655, 69659, 69663, 69667, 69671, 69675, 69679, - 69683, 69686, 69690, 69694, 69698, 69702, 69706, 69710, 69714, 69717, - 69721, 69725, 69729, 69733, 69737, 69741, 69745, 69749, 69753, 69757, - 69761, 69765, 69769, 69773, 69777, 69781, 69785, 69789, 69793, 69797, - 69801, 69805, 69809, 69813, 69817, 69821, 69825, 69829, 69833, 69837, - 69841, 69845, 69849, 69853, 69857, 69861, 69865, 69869, 69873, 69877, - 69881, 69885, 69889, 69893, 69897, 69901, 69905, 69909, 69913, 69917, - 69921, 69925, 69929, 69933, 69937, 69941, 69945, 69949, 69953, 69957, - 69961, 69965, 69969, 69973, 69977, 69981, 69985, 69989, 69993, 69997, - 70001, 70005, 70009, 70013, 70017, 70021, 70025, 70029, 70033, 70037, - 70041, 70045, 70049, 70053, 70057, 70061, 70065, 70069, 70073, 70076, - 70080, 70084, 70088, 70092, 70096, 70100, 70104, 70108, 70112, 70116, - 70120, 70124, 70128, 70132, 70136, 70140, 70144, 70148, 70152, 70156, - 70160, 70164, 70168, 70172, 70176, 70180, 70184, 70188, 70192, 70196, - 70200, 70204, 70208, 70212, 70216, 70220, 70224, 70228, 70232, 70236, - 70240, 70244, 70248, 70252, 70256, 70260, 70264, 70268, 70272, 70276, - 70280, 70284, 70288, 70292, 70296, 70300, 70304, 70308, 70312, 70315, - 70319, 70323, 70327, 70331, 70335, 70339, 70343, 70347, 70351, 70355, - 70359, 70363, 70367, 70371, 70375, 70379, 70383, 70387, 70391, 70395, - 70399, 70403, 70407, 70411, 70415, 70419, 70423, 70427, 70431, 70435, - 70439, 70443, 70447, 70451, 70455, 70459, 70463, 70467, 70471, 70475, - 70479, 70483, 70487, 70491, 70495, 70499, 70503, 70507, 70511, 70515, - 70519, 70523, 70527, 70531, 70535, 70539, 70543, 70547, 70551, 70555, - 70559, 70563, 70567, 70570, 70574, 70578, 70582, 70586, 70590, 70594, - 70598, 70602, 70606, 70610, 70614, 70618, 70622, 70626, 70630, 70634, - 70638, 70642, 70646, 70650, 70654, 70658, 70662, 70666, 70670, 70674, - 70678, 70682, 70686, 70690, 70694, 70698, 70702, 70706, 70710, 70714, - 70718, 70722, 70726, 70730, 70734, 70738, 70742, 70746, 70750, 70754, - 70758, 70762, 70766, 70770, 70774, 70778, 70782, 70786, 70790, 70794, - 70798, 70802, 70806, 70810, 70814, 70818, 70822, 70826, 70830, 70834, - 70838, 70842, 70846, 70850, 70854, 70858, 70862, 70866, 70870, 70874, - 70878, 70882, 70886, 70890, 70894, 70898, 70902, 70906, 70910, 70914, - 70918, 70922, 70926, 70930, 70934, 70938, 70942, 70946, 70950, 70954, - 70958, 70962, 70966, 70970, 70974, 70978, 70982, 70986, 70990, 70994, - 70998, 71002, 71006, 71010, 71014, 71018, 71022, 71025, 71029, 71033, - 71037, 71041, 71045, 71049, 71053, 71057, 71061, 71065, 71069, 71073, - 71077, 71081, 71085, 71089, 71093, 71097, 71101, 71105, 71109, 71113, - 71117, 71121, 71125, 71129, 71133, 71137, 71141, 71145, 71149, 71153, - 71157, 71161, 71165, 71169, 71173, 71177, 71181, 71185, 71189, 71193, - 71197, 71201, 71205, 71209, 71213, 71217, 71221, 71225, 71229, 71233, - 71237, 71241, 71245, 71249, 71253, 71257, 71261, 71265, 71269, 71273, - 71277, 71281, 71285, 71289, 71293, 71297, 71301, 71305, 71309, 71313, - 71317, 71321, 71325, 71329, 71333, 71337, 71341, 71345, 71349, 71353, - 71357, 71361, 71365, 71369, 71373, 71377, 71381, 71385, 71389, 71393, - 71397, 71401, 71405, 71409, 71413, 71417, 71421, 71425, 71429, 71433, - 71437, 71441, 71445, 71449, 71453, 71457, 71461, 71465, 71469, 71473, - 71477, 71481, 71485, 71489, 71493, 71497, 71501, 71505, 71509, 71513, - 71517, 71521, 71525, 71529, 71533, 71537, 71541, 71545, 71549, 71553, - 71557, 71561, 71565, 71569, 71573, 71577, 71581, 71585, 71589, 71593, - 71597, 71601, 71605, 71609, 71613, 71617, 71621, 71625, 71628, 71632, - 71636, 71640, 71644, 71648, 71652, 71656, 71659, 71663, 71667, 71671, - 71675, 71679, 71683, 71687, 71691, 71695, 71699, 71703, 71707, 71711, - 71715, 71719, 71723, 71727, 71731, 71735, 71739, 71743, 71747, 71751, - 71755, 71759, 71763, 71767, 71771, 71775, 71779, 71783, 71787, 71791, - 71795, 71799, 71803, 71807, 71811, 71815, 71819, 71823, 71827, 71831, - 71835, 71839, 71843, 71847, 71851, 71855, 71859, 71863, 71867, 71871, - 71875, 71879, 71883, 71887, 71891, 71895, 71899, 71903, 71907, 71911, - 71915, 71919, 71923, 71927, 71931, 71935, 71939, 71943, 71947, 71951, - 71955, 71959, 71963, 71967, 71971, 71975, 71979, 71983, 71987, 71991, - 71995, 71999, 72003, 72007, 72011, 72015, 72019, 72023, 72027, 72031, - 72035, 72039, 72043, 72047, 72051, 72055, 72059, 72063, 72067, 72071, - 72075, 72079, 72083, 72087, 72091, 72095, 72099, 72103, 72107, 72111, - 72115, 72119, 72123, 72127, 72131, 72135, 72139, 72143, 72147, 72151, - 72155, 72159, 72163, 72167, 72171, 72175, 72179, 72183, 72187, 72191, - 72195, 72199, 72203, 72207, 72211, 72215, 72219, 72223, 72227, 72231, - 72235, 72239, 72243, 72247, 72251, 72255, 72259, 72263, 72267, 72271, - 72275, 72279, 72283, 72287, 72291, 72295, 72299, 72303, 72307, 72311, - 72315, 72319, 72323, 72327, 72331, 72335, 72339, 72343, 72347, 72351, - 72355, 72359, 72363, 72367, 72371, 72375, 72379, 72383, 72386, 72390, - 72394, 72398, 72402, 72406, 72410, 72414, 72418, 72422, 72426, 72430, - 72434, 72438, 72442, 72446, 72450, 72454, 72458, 72462, 72466, 72470, - 72474, 72478, 72482, 72486, 72490, 72494, 72498, 72502, 72506, 72510, - 72514, 72518, 72522, 72526, 72530, 72534, 72538, 72542, 72546, 72550, - 72554, 72558, 72562, 72566, 72570, 72574, 72578, 72582, 72586, 72590, - 72594, 72598, 72602, 72606, 72610, 72614, 72618, 72622, 72626, 72630, - 72634, 72638, 72642, 72646, 72650, 72654, 72658, 72662, 72666, 72670, - 72674, 72678, 72682, 72686, 72690, 72694, 72698, 72702, 72706, 72710, - 72714, 72718, 72722, 72726, 72730, 72734, 72738, 72742, 72746, 72750, - 72754, 72758, 72762, 72766, 72770, 72774, 72778, 72782, 72786, 72790, - 72794, 72798, 72802, 72806, 72810, 72814, 72818, 72822, 72826, 72830, - 72834, 72838, 72842, 72846, 72850, 72854, 72858, 72862, 72866, 72870, - 72874, 72878, 72882, 72886, 72890, 72894, 72898, 72902, 72906, 72910, - 72914, 72918, 72922, 72926, 72930, 72934, 72938, 72942, 72946, 72950, - 72954, 72958, 72962, 72966, 72970, 72974, 72978, 72982, 72986, 72990, - 72994, 72998, 73002, 73006, 73010, 73014, 73018, 73022, 73026, 73030, - 73034, 73038, 73042, 73046, 73050, 73054, 73058, 73062, 73066, 73070, - 73074, 73078, 73082, 73086, 73090, 73094, 73098, 73102, 73106, 73110, - 73114, 73118, 73122, 73126, 73130, 73134, 73138, 73142, 73146, 73150, - 73154, 73158, 73162, 73166, 0, 0, 0, 73170, 73174, 73178, 73182, 73186, - 73190, 73194, 73198, 73202, 73206, 73210, 73214, 73218, 73222, 73226, - 73230, 73234, 73238, 73242, 73246, 73250, 73254, 73258, 73262, 73266, - 73270, 73274, 73278, 73282, 73286, 73290, 73294, 73298, 73302, 73306, - 73310, 73314, 73318, 73322, 73326, 73330, 73334, 73338, 73342, 73346, - 73350, 73354, 73358, 73362, 73366, 73370, 73374, 73378, 73382, 73386, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 73390, 73395, 73399, 73404, 73409, 73413, 73418, - 73423, 73427, 73432, 73437, 73442, 73447, 73452, 73457, 73462, 73466, - 73470, 73474, 73478, 73483, 73488, 73493, 73497, 73502, 73507, 73512, - 73517, 73522, 73526, 73531, 73535, 73540, 73544, 73549, 73553, 73557, - 73561, 73566, 73571, 73576, 73584, 73592, 73600, 73608, 73615, 73623, - 73629, 73637, 73641, 73645, 73649, 73653, 73657, 73661, 73665, 73669, - 73673, 73677, 73681, 73685, 73689, 73693, 73697, 73701, 73705, 73709, - 73713, 73717, 73721, 73725, 73729, 73733, 73737, 73741, 73745, 73749, - 73753, 73757, 73761, 73765, 73769, 73773, 73777, 73781, 73784, 73788, - 73792, 73796, 73800, 73804, 73808, 73812, 73816, 73820, 73824, 73828, - 73832, 73836, 73840, 73844, 73848, 73852, 73856, 73860, 73864, 73868, - 73872, 73876, 73880, 73884, 73888, 73892, 73896, 73900, 73904, 73908, - 73912, 73916, 73920, 73924, 73928, 73931, 73935, 73939, 73942, 73946, - 73950, 73954, 73957, 73961, 73965, 73969, 73973, 73977, 73981, 73985, - 73989, 73993, 73996, 74000, 74004, 74008, 74011, 74014, 74018, 74022, - 74025, 74029, 74033, 74037, 74041, 74045, 74049, 74052, 74055, 74059, - 74063, 74067, 74070, 74073, 74077, 74081, 74085, 74089, 74093, 74097, - 74101, 74105, 74109, 74113, 74117, 74121, 74125, 74129, 74133, 74137, - 74141, 74145, 74149, 74153, 74157, 74161, 74165, 74169, 74173, 74177, - 74181, 74185, 74189, 74193, 74197, 74201, 74205, 74209, 74213, 74217, - 74221, 74224, 74228, 74232, 74236, 74240, 74244, 74248, 74252, 74256, - 74260, 74264, 74268, 74272, 74276, 74280, 74284, 74288, 74292, 74296, - 74300, 74304, 74308, 74312, 74316, 74320, 74324, 74328, 74332, 74336, - 74340, 74344, 74348, 74352, 74356, 74360, 74364, 74368, 74371, 74375, - 74379, 74383, 74387, 74391, 74395, 74399, 74403, 74407, 74411, 74415, - 74419, 74423, 74427, 74431, 74435, 74438, 74442, 74446, 74450, 74454, - 74458, 74462, 74466, 74470, 74474, 74478, 74482, 74486, 74490, 74494, - 74498, 74502, 74506, 74510, 74514, 74518, 74522, 74525, 74529, 74533, - 74537, 74541, 74545, 74549, 74553, 74557, 74561, 74565, 74569, 74573, - 74577, 74581, 74585, 74589, 74593, 74597, 74601, 74605, 74609, 74613, - 74617, 74621, 74625, 74629, 74633, 74637, 74641, 74645, 74649, 74653, - 74657, 74661, 74665, 74669, 74673, 74677, 74681, 74685, 74689, 74693, - 74697, 74700, 74705, 74709, 74715, 74720, 74726, 74730, 74734, 74738, - 74742, 74746, 74750, 74754, 74758, 74762, 74766, 74770, 74774, 74778, - 74782, 74785, 74788, 74791, 74794, 74797, 74800, 74803, 74806, 74809, - 74814, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74820, - 74825, 74830, 74835, 74840, 74847, 74854, 74859, 74864, 74869, 74874, - 74881, 74888, 74895, 74902, 74909, 74916, 74926, 74936, 74943, 74950, - 74957, 74964, 74970, 74976, 74985, 74994, 75001, 75008, 75019, 75030, - 75035, 75040, 75047, 75054, 75061, 75068, 75075, 75082, 75089, 75096, - 75102, 75108, 75114, 75120, 75127, 75134, 75139, 75143, 75150, 75157, - 75164, 75168, 75175, 75179, 75184, 75188, 75194, 75199, 75205, 75210, - 75214, 75218, 75221, 75224, 75229, 75234, 75239, 75244, 75249, 75254, - 75259, 75264, 75269, 75274, 75282, 75290, 75295, 75300, 75305, 75310, - 75315, 75320, 75325, 75330, 75335, 75340, 75345, 75350, 75355, 75360, - 75366, 75372, 75378, 75384, 75389, 75395, 75398, 75401, 75404, 75408, - 75412, 75416, 75420, 75423, 75427, 75430, 75433, 75436, 75440, 75444, - 75448, 75452, 75456, 75460, 75464, 75468, 75472, 75476, 75480, 75484, - 75488, 75492, 75496, 75500, 75504, 75508, 75512, 75516, 75520, 75524, - 75527, 75531, 75535, 75539, 75543, 75547, 75551, 75555, 75559, 75563, - 75567, 75571, 75575, 75579, 75583, 75587, 75591, 75595, 75599, 75603, - 75607, 75611, 75615, 75619, 75623, 75626, 75630, 75634, 75638, 75642, - 75646, 75650, 75654, 75657, 75661, 75665, 75669, 75673, 75677, 75681, - 75685, 75689, 75693, 75697, 75701, 75705, 75710, 75715, 75718, 75723, - 75726, 75729, 75732, 0, 0, 0, 0, 0, 0, 0, 0, 75736, 75745, 75754, 75763, - 75772, 75781, 75790, 75799, 75808, 75816, 75823, 75831, 75838, 75846, - 75856, 75865, 75875, 75884, 75894, 75902, 75909, 75917, 75924, 75932, - 75937, 75942, 75948, 75957, 75963, 75969, 75976, 75985, 75993, 76001, - 76009, 76016, 76023, 76030, 76037, 76042, 76047, 76052, 76057, 76062, - 76067, 76072, 76077, 76085, 76093, 76099, 76105, 76110, 76115, 76120, - 76125, 76130, 76135, 76140, 76145, 76154, 76163, 76168, 76173, 76183, - 76193, 76200, 76207, 76216, 76225, 76237, 76249, 76255, 76261, 76269, - 76277, 76287, 76297, 76304, 76311, 76316, 76321, 76333, 76345, 76353, - 76361, 76371, 76381, 76393, 76405, 76414, 76423, 76430, 76437, 76444, - 76451, 76460, 76469, 76474, 76479, 76486, 76493, 76500, 76507, 76519, - 76531, 76536, 76541, 76546, 76551, 76556, 76561, 76566, 76571, 76575, - 76580, 76585, 76590, 76595, 76600, 76606, 76611, 76616, 76623, 76630, - 76637, 76644, 76651, 76659, 76667, 76672, 76677, 76683, 76689, 76696, - 76703, 76710, 76717, 76724, 76728, 76735, 76740, 76745, 76751, 76764, - 76770, 76778, 76786, 76793, 76800, 76809, 76818, 76825, 76832, 76839, - 76846, 76853, 76860, 76867, 76874, 76881, 76888, 76897, 76906, 76915, - 76924, 76933, 76942, 76951, 76960, 76969, 76978, 76985, 76992, 76998, - 77006, 77012, 77018, 77024, 77030, 77038, 77043, 77048, 77053, 77058, - 77063, 77069, 77075, 77081, 77087, 77093, 77099, 77105, 0, 0, 77111, - 77118, 77125, 77134, 77141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 77150, 77157, 77164, 77170, 77177, 77185, - 77193, 77201, 77209, 77217, 77223, 77229, 77236, 77242, 77248, 77254, - 77261, 77268, 77275, 77282, 77289, 77296, 77303, 77310, 77317, 77324, - 77331, 77338, 77345, 77352, 77358, 77365, 77372, 77379, 77386, 77393, - 77400, 77407, 77414, 77421, 77428, 77435, 77442, 77449, 77456, 77463, - 77470, 77477, 77484, 77492, 77500, 77508, 77516, 0, 0, 0, 0, 77524, - 77531, 77538, 77545, 77552, 77559, 77566, 77572, 77578, 77584, 0, 0, 0, - 0, 0, 0, 77590, 77594, 77599, 77604, 77609, 77614, 77619, 77624, 77629, - 77633, 77638, 77643, 77647, 77651, 77656, 77661, 77665, 77670, 77675, - 77680, 77685, 77690, 77695, 77700, 77704, 77708, 77712, 77717, 77721, - 77725, 77729, 77733, 77737, 77741, 77745, 77750, 77755, 77760, 77765, - 77770, 77777, 77783, 77788, 77793, 77798, 77803, 77809, 77816, 77822, - 77829, 77835, 77841, 77846, 77853, 77859, 77864, 0, 0, 0, 0, 0, 0, 0, 0, - 77870, 77875, 77880, 77884, 77889, 77893, 77898, 77902, 77907, 77912, - 77918, 77923, 77929, 77933, 77938, 77943, 77947, 77952, 77957, 77961, - 77966, 77971, 77976, 77981, 77986, 77991, 77996, 78001, 78006, 78011, - 78016, 78021, 78026, 78031, 78035, 78040, 78045, 78050, 78054, 78058, - 78063, 78068, 78073, 78077, 78081, 78085, 78089, 78094, 78099, 78104, - 78108, 78112, 78117, 78123, 78129, 78134, 78140, 78145, 78151, 78157, - 78164, 78170, 78177, 78182, 78188, 78194, 78199, 78205, 78211, 78216, 0, - 0, 0, 0, 0, 0, 0, 0, 78221, 78225, 78230, 78235, 78239, 78243, 78247, - 78251, 78255, 78259, 78263, 78267, 0, 0, 0, 0, 0, 0, 78271, 78276, 78280, - 78284, 78288, 78292, 78296, 78300, 78304, 78308, 78312, 78316, 78320, - 78324, 78328, 78332, 78336, 78341, 78346, 78352, 78358, 78365, 78370, - 78375, 78381, 78385, 78390, 78393, 78396, 78400, 78405, 78409, 78414, - 78421, 78427, 78433, 78439, 78445, 78451, 78457, 78463, 78469, 78475, - 78481, 78488, 78495, 78502, 78508, 78515, 78522, 78529, 78535, 78542, - 78548, 78554, 78561, 78567, 78574, 78581, 78587, 78593, 78599, 78606, - 78613, 78619, 78626, 78633, 78639, 78646, 78652, 78659, 78666, 78672, - 78678, 78685, 78691, 78698, 78705, 78714, 78721, 78728, 78732, 78737, - 78742, 78746, 78751, 78755, 78759, 78764, 78768, 78773, 78778, 78783, - 78787, 78791, 78795, 78799, 78804, 78808, 78813, 78818, 78823, 78828, - 78832, 78837, 78842, 78847, 78853, 78858, 78864, 78870, 78876, 78882, - 78888, 78893, 78899, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78903, 78908, - 78912, 78916, 78920, 78924, 78928, 78932, 78936, 78940, 78944, 78948, - 78952, 78956, 78960, 78964, 78968, 78972, 78976, 78980, 78984, 78988, - 78992, 78996, 79000, 79004, 79008, 79012, 79016, 79020, 0, 0, 0, 79024, - 79029, 79034, 79039, 79044, 79048, 79055, 79059, 79064, 79068, 79075, - 79082, 79091, 79095, 79100, 79104, 79108, 79115, 79122, 79127, 79134, - 79139, 79144, 79151, 79156, 79163, 79170, 79175, 79180, 79187, 79192, - 79199, 79206, 79210, 79217, 79222, 79229, 79233, 79237, 79244, 79249, - 79256, 79260, 79264, 79268, 79275, 79279, 79284, 79291, 79298, 79302, - 79306, 79313, 79319, 79325, 79331, 79339, 79345, 79353, 79359, 79367, - 79373, 79379, 79385, 79391, 79395, 79400, 79405, 79411, 79417, 79423, - 79429, 79435, 79441, 79447, 79453, 79461, 79467, 0, 79474, 79478, 79483, - 79487, 79491, 79495, 79499, 79503, 79507, 79511, 79515, 0, 0, 0, 0, - 79519, 79527, 79533, 79539, 79545, 79551, 79557, 79563, 79569, 79576, - 79583, 79590, 79597, 79604, 79611, 79618, 79625, 79632, 79639, 79646, - 79652, 79658, 79664, 79670, 79676, 79682, 79688, 79694, 79700, 79707, - 79714, 79721, 79728, 0, 79735, 79739, 79743, 79747, 79751, 79756, 79760, - 79764, 79769, 79774, 79779, 79784, 79789, 79794, 79799, 79804, 79809, - 79814, 79819, 79824, 79828, 79833, 79838, 79843, 79848, 79852, 79857, - 79861, 79866, 79871, 79876, 79881, 79886, 79890, 79895, 79899, 79903, - 79907, 79912, 79917, 79921, 79925, 79931, 79936, 79942, 79948, 79953, - 79959, 79964, 79970, 79976, 79982, 79987, 79992, 79997, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 80003, 80009, 80015, 80021, 80028, 80034, 80040, 80046, 80052, - 80058, 80063, 80068, 80074, 80081, 0, 0, 80088, 80093, 80097, 80101, - 80105, 80109, 80113, 80117, 80121, 80125, 0, 0, 80129, 80135, 80141, - 80148, 80156, 80162, 80168, 80174, 80180, 80186, 80192, 80198, 80204, - 80210, 80216, 80222, 80227, 80232, 80237, 80243, 80249, 80256, 80262, - 80268, 80273, 80280, 80287, 80294, 80300, 80305, 80310, 80315, 80323, - 80330, 80337, 80345, 80353, 80360, 80367, 80374, 80381, 80388, 80395, - 80402, 80409, 80416, 80423, 80430, 80437, 80444, 80451, 80458, 80465, - 80472, 80479, 80486, 80493, 80499, 80505, 80512, 80519, 80526, 80533, - 80540, 80547, 80554, 80561, 80568, 80575, 80582, 80589, 80596, 80603, - 80610, 80617, 80624, 80631, 80638, 80645, 80652, 80659, 80666, 80673, - 80679, 80685, 80692, 80698, 80703, 80709, 80714, 80719, 80724, 80731, - 80737, 80743, 80749, 80755, 80761, 80767, 80773, 80781, 80789, 80797, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 80805, 80811, 80817, 80823, 80831, 80839, 80845, 80851, 80858, 80865, - 80872, 80879, 80886, 80893, 80900, 80907, 80914, 80922, 80930, 80938, - 80946, 80954, 80960, 80968, 80974, 80982, 80991, 80999, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 81005, 81009, 81013, 81017, 81021, 81025, 0, 0, 81029, 81033, - 81037, 81041, 81045, 81049, 0, 0, 81053, 81057, 81061, 81065, 81069, - 81073, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81077, 81081, 81085, 81089, 81093, - 81097, 81101, 0, 81105, 81109, 81113, 81117, 81121, 81125, 81129, 0, - 81133, 81140, 81146, 81152, 81158, 81166, 81173, 81182, 81194, 81204, - 81213, 81221, 81229, 81237, 81243, 81251, 81258, 81265, 81273, 81283, - 81290, 81299, 81305, 81315, 81324, 81329, 81337, 81346, 81351, 81360, - 81367, 81377, 81389, 81394, 81400, 81407, 81412, 81422, 81432, 81442, - 81452, 81467, 81480, 81491, 81499, 81504, 81516, 81525, 81532, 81539, - 81545, 81551, 81556, 81563, 81569, 81580, 0, 0, 0, 0, 0, 0, 0, 0, 81591, - 81595, 81599, 81603, 81607, 81611, 81616, 81621, 81625, 81630, 81635, - 81640, 81645, 81650, 81654, 81659, 81664, 81669, 81674, 81679, 81683, - 81688, 81693, 81698, 81703, 81708, 81712, 81717, 81722, 81727, 81732, - 81736, 81741, 81746, 81751, 81756, 81761, 81766, 81771, 81776, 81781, - 81786, 81791, 81796, 81801, 81805, 81810, 81815, 81820, 81825, 81830, - 81835, 81840, 81844, 81849, 81854, 81859, 81864, 81869, 81874, 81879, - 81884, 81889, 81894, 81899, 81904, 81909, 81914, 81919, 81924, 81929, - 81934, 81939, 81944, 81949, 81954, 81959, 81964, 81969, 81974, 81978, - 81985, 81992, 81999, 82006, 82012, 82018, 82025, 82032, 82039, 82046, - 82053, 82060, 82067, 82074, 82081, 82087, 82094, 82101, 82108, 82115, - 82122, 82129, 82136, 82143, 82150, 82157, 82164, 82173, 82182, 82191, - 82200, 82209, 82218, 82227, 82236, 82244, 82252, 82260, 82268, 82276, - 82284, 82292, 82300, 82306, 82314, 0, 0, 82322, 82329, 82335, 82341, - 82347, 82353, 82359, 82365, 82371, 82377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82383, 82388, - 82393, 82398, 82403, 82408, 82413, 82418, 82423, 82428, 82433, 82438, - 82443, 82448, 82453, 82458, 82463, 82468, 82473, 82478, 82483, 82488, - 82493, 0, 0, 0, 0, 82498, 82502, 82506, 82510, 82514, 82518, 82522, - 82526, 82530, 82534, 82538, 82542, 82546, 82550, 82554, 82558, 82562, - 82566, 82570, 82574, 82578, 82582, 82586, 82590, 82594, 82598, 82602, - 82606, 82610, 82614, 82618, 82622, 82626, 82630, 82634, 82638, 82642, - 82646, 82650, 82654, 82658, 82662, 82666, 82670, 82674, 82678, 82682, - 82686, 82690, 0, 0, 0, 0, 82694, 82698, 82702, 82706, 82710, 82714, - 82718, 82722, 82726, 82730, 82734, 82738, 82742, 82746, 82750, 82754, - 82758, 82762, 82766, 82770, 82774, 82778, 82782, 82786, 82790, 82794, - 82798, 82802, 82806, 82810, 82814, 82818, 82822, 82826, 82830, 82834, - 82838, 82842, 82846, 82850, 82854, 82858, 82862, 82866, 82870, 82874, - 82878, 82882, 82886, 82890, 82894, 82898, 82902, 82906, 82910, 82914, - 82918, 82922, 82926, 82930, 82934, 82938, 82942, 82946, 82950, 82954, - 82958, 82962, 82966, 82970, 82974, 82978, 82982, 82986, 82990, 82994, - 82998, 83002, 83006, 83010, 83014, 83018, 83022, 83026, 83030, 83034, - 83038, 83042, 83046, 83050, 83054, 83058, 83062, 83066, 83070, 83074, - 83078, 83082, 83086, 83090, 83094, 83098, 83102, 83106, 83110, 83114, - 83118, 83122, 83126, 83130, 83134, 83138, 83142, 83146, 83150, 83154, - 83158, 83162, 83166, 83170, 83174, 83178, 83182, 83186, 83190, 83194, - 83198, 83202, 83206, 83210, 83214, 83218, 83222, 83226, 83230, 83234, - 83238, 83242, 83246, 83250, 83254, 83258, 83262, 83266, 83270, 83274, - 83278, 83282, 83286, 83290, 83294, 83298, 83302, 83306, 83310, 83314, - 83318, 83322, 83326, 83330, 83334, 83338, 83342, 83346, 83350, 83354, - 83358, 83362, 83366, 83370, 83374, 83378, 83382, 83386, 83390, 83394, - 83398, 83402, 83406, 83410, 83414, 83418, 83422, 83426, 83430, 83434, - 83438, 83442, 83446, 83450, 83454, 83458, 83462, 83466, 83470, 83474, - 83478, 83482, 83486, 83490, 83494, 83498, 83502, 83506, 83510, 83514, - 83518, 83522, 83526, 83530, 83534, 83538, 83542, 83546, 83550, 83554, - 83558, 83562, 83566, 83570, 83574, 83578, 83582, 83586, 83590, 83594, - 83598, 83602, 83606, 83610, 83614, 83618, 83622, 83626, 83630, 83634, - 83638, 83642, 83646, 83650, 83654, 83658, 83662, 83666, 83670, 83674, - 83678, 83682, 83686, 83690, 83694, 83698, 83702, 83706, 83710, 83714, - 83718, 83722, 83726, 83730, 83734, 83738, 83742, 83746, 83750, 83754, - 83758, 83762, 83766, 83770, 83774, 83778, 83782, 83786, 83790, 83794, - 83798, 83802, 83806, 83810, 83814, 83818, 83822, 83826, 83830, 83834, - 83838, 83842, 83846, 83850, 83854, 83858, 83862, 83866, 83870, 83874, - 83878, 83882, 83886, 83890, 83894, 83898, 83902, 83906, 83910, 83914, - 83918, 83922, 83926, 83930, 83934, 83938, 83942, 83946, 83950, 83954, - 83958, 83962, 83966, 83970, 83974, 83978, 83982, 83986, 83990, 83994, - 83998, 84002, 84006, 84010, 84014, 84018, 84022, 84026, 84030, 84034, - 84038, 84042, 84046, 84050, 84054, 84058, 84062, 84066, 84070, 84074, - 84078, 84082, 84086, 84090, 84094, 84098, 84102, 84106, 84110, 84114, - 84118, 84122, 84126, 84130, 84134, 84138, 84142, 84146, 84150, 84154, 0, - 0, 84158, 84162, 84166, 84170, 84174, 84178, 84182, 84186, 84190, 84194, - 84198, 84202, 84206, 84210, 84214, 84218, 84222, 84226, 84230, 84234, - 84238, 84242, 84246, 84250, 84254, 84258, 84262, 84266, 84270, 84274, - 84278, 84282, 84286, 84290, 84294, 84298, 84302, 84306, 84310, 84314, - 84318, 84322, 84326, 84330, 84334, 84338, 84342, 84346, 84350, 84354, - 84358, 84362, 84366, 84370, 84374, 84378, 84382, 84386, 84390, 84394, - 84398, 84402, 84406, 84410, 84414, 84418, 84422, 84426, 84430, 84434, - 84438, 84442, 84446, 84450, 84454, 84458, 84462, 84466, 84470, 84474, - 84478, 84482, 84486, 84490, 84494, 84498, 84502, 84506, 84510, 84514, - 84518, 84522, 84526, 84530, 84534, 84538, 84542, 84546, 84550, 84554, - 84558, 84562, 84566, 84570, 84574, 84578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 84582, 84587, 84592, 84597, 84602, 84607, 84615, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 84620, 84628, 84636, 84644, 84652, 0, 0, 0, 0, 0, - 84660, 84667, 84674, 84684, 84690, 84696, 84702, 84708, 84714, 84720, - 84727, 84733, 84739, 84745, 84754, 84763, 84775, 84787, 84793, 84799, - 84805, 84812, 84819, 84826, 84833, 84840, 0, 84847, 84854, 84861, 84869, - 84876, 0, 84883, 0, 84890, 84897, 0, 84904, 84912, 0, 84919, 84926, - 84933, 84940, 84947, 84954, 84961, 84968, 84975, 84982, 84987, 84994, - 85001, 85007, 85013, 85019, 85026, 85032, 85038, 85044, 85051, 85057, - 85063, 85069, 85076, 85082, 85088, 85094, 85101, 85107, 85113, 85119, - 85126, 85132, 85138, 85144, 85151, 85157, 85163, 85169, 85176, 85182, - 85188, 85194, 85201, 85207, 85213, 85219, 85226, 85232, 85238, 85244, - 85251, 85257, 85263, 85269, 85276, 85282, 85288, 85294, 85301, 85307, - 85313, 85319, 85325, 85331, 85337, 85343, 85349, 85355, 85361, 85367, - 85373, 85379, 85385, 85391, 85398, 85404, 85410, 85416, 85423, 85429, - 85435, 85441, 85448, 85454, 85460, 85466, 85473, 85481, 85489, 85495, - 85501, 85507, 85514, 85523, 85532, 85540, 85548, 85556, 85565, 85573, - 85581, 85589, 85598, 85605, 85612, 85623, 85634, 85638, 85642, 85648, - 85654, 85660, 85666, 85676, 85686, 85693, 85700, 85707, 85715, 85723, - 85727, 85733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85739, - 85745, 85751, 85757, 85764, 85769, 85774, 85780, 85786, 85792, 85798, - 85807, 85813, 85819, 85827, 85835, 85843, 85851, 85857, 85863, 85869, - 85876, 85889, 85903, 85914, 85925, 85937, 85949, 85961, 85973, 85984, - 85995, 86007, 86019, 86031, 86043, 86055, 86067, 86079, 86096, 86113, - 86130, 86137, 86144, 86151, 86159, 86171, 86182, 86193, 86206, 86217, - 86226, 86234, 86243, 86251, 86261, 86269, 86278, 86286, 86295, 86303, - 86313, 86321, 86330, 86338, 86348, 86356, 86364, 86372, 86380, 86387, - 86396, 86404, 86412, 86421, 86429, 86438, 86446, 86454, 86462, 86471, - 86479, 86488, 86496, 86504, 86512, 86520, 86529, 86537, 86546, 86554, - 86563, 86571, 86580, 86588, 86598, 86606, 86614, 86622, 86632, 86640, - 86648, 86657, 86665, 86674, 86683, 86691, 86701, 86709, 86718, 86726, - 86735, 86743, 86753, 86761, 86769, 86776, 86784, 86791, 86800, 86807, - 86816, 86824, 86833, 86841, 86851, 86859, 86868, 86876, 86886, 86894, - 86902, 86909, 86917, 86924, 86933, 86940, 86950, 86960, 86971, 86980, - 86989, 86998, 87007, 87016, 87026, 87038, 87050, 87061, 87073, 87086, - 87097, 87106, 87115, 87123, 87132, 87142, 87150, 87159, 87168, 87176, - 87185, 87195, 87203, 87212, 87221, 87229, 87238, 87248, 87256, 87266, - 87274, 87284, 87292, 87300, 87309, 87317, 87327, 87335, 87343, 87353, - 87361, 87368, 87375, 87384, 87393, 87401, 87410, 87420, 87428, 87439, - 87447, 87455, 87462, 87470, 87479, 87486, 87498, 87509, 87521, 87532, - 87544, 87553, 87561, 87570, 87578, 87587, 87596, 87604, 87613, 87621, - 87630, 87638, 87646, 87654, 87662, 87669, 87678, 87686, 87695, 87703, - 87712, 87720, 87728, 87737, 87745, 87754, 87762, 87771, 87779, 87787, - 87795, 87804, 87812, 87821, 87829, 87838, 87846, 87855, 87863, 87871, - 87879, 87888, 87896, 87905, 87914, 87922, 87931, 87939, 87948, 87956, - 87965, 87973, 87980, 87988, 87995, 88004, 88012, 88021, 88029, 88038, - 88047, 88055, 88065, 88073, 88080, 88088, 88095, 88103, 88115, 88128, - 88137, 88147, 88156, 88166, 88175, 88185, 88194, 88204, 88213, 88223, - 88233, 88242, 88251, 88260, 88270, 88278, 88287, 88297, 88307, 88317, - 88327, 88335, 88345, 88353, 88363, 88371, 88381, 88389, 88399, 88407, - 88416, 88423, 88433, 88441, 88451, 88459, 88469, 88477, 88487, 88495, - 88504, 88512, 88521, 88529, 88538, 88547, 88556, 88565, 88575, 88583, - 88593, 88601, 88611, 88619, 88629, 88637, 88647, 88655, 88664, 88671, - 88681, 88689, 88699, 88707, 88717, 88725, 88735, 88743, 88752, 88760, - 88769, 88777, 88786, 88795, 88804, 88813, 88822, 88830, 88839, 88847, - 88856, 88865, 88873, 88883, 88892, 88902, 88912, 88921, 88931, 88940, - 88949, 88957, 88965, 88970, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 88975, 88986, 88997, 89008, 89018, 89029, 89040, 89050, 89061, 89071, - 89081, 89090, 89101, 89112, 89123, 89136, 89146, 89156, 89167, 89177, - 89187, 89197, 89207, 89217, 89227, 89237, 89248, 89259, 89270, 89280, - 89290, 89302, 89313, 89324, 89334, 89344, 89354, 89364, 89375, 89385, - 89395, 89407, 89417, 89427, 89439, 89450, 89461, 89471, 89481, 89491, - 89501, 89513, 89525, 89537, 89548, 89559, 89569, 89579, 89589, 89598, - 89607, 89617, 89627, 89638, 0, 0, 89648, 89659, 89670, 89680, 89690, - 89702, 89713, 89724, 89737, 89747, 89759, 89768, 89777, 89788, 89799, - 89812, 89823, 89836, 89846, 89858, 89868, 89880, 89892, 89905, 89915, - 89925, 89935, 89946, 89956, 89965, 89975, 89984, 89993, 90003, 90013, - 90023, 90033, 90043, 90053, 90064, 90074, 90085, 90095, 90106, 90117, - 90127, 90137, 90147, 90157, 90167, 90177, 90188, 90198, 90209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90220, 90235, 90250, 90256, 90262, - 90268, 90274, 90280, 90286, 90292, 90298, 90306, 90310, 90313, 0, 0, - 90321, 90324, 90327, 90330, 90333, 90336, 90339, 90342, 90345, 90348, - 90351, 90354, 90357, 90360, 90363, 90366, 90369, 90377, 90386, 90397, - 90405, 90413, 90422, 90431, 90442, 90454, 0, 0, 0, 0, 0, 0, 90464, 90469, - 90474, 90481, 90488, 90494, 90500, 90505, 90510, 90515, 90521, 90527, - 90533, 90539, 90545, 90552, 90559, 90569, 90579, 90589, 90598, 90609, - 90618, 90627, 90637, 90647, 90659, 90671, 90682, 90693, 90704, 90715, - 90725, 90735, 90745, 90755, 90766, 90777, 90781, 90786, 90795, 90804, - 90808, 90812, 90816, 90821, 90826, 90831, 90836, 90839, 90843, 0, 90848, - 90851, 90854, 90858, 90862, 90867, 90871, 90875, 90880, 90885, 90892, - 90899, 90902, 90905, 90908, 90911, 90914, 90918, 90922, 0, 90926, 90931, - 90935, 90939, 0, 0, 0, 0, 90944, 90949, 90956, 90961, 90966, 0, 90971, - 90976, 90982, 90987, 90993, 90998, 91004, 91009, 91015, 91020, 91026, - 91032, 91041, 91050, 91059, 91068, 91078, 91088, 91098, 91108, 91117, - 91126, 91135, 91145, 91150, 91155, 91161, 91167, 91173, 91180, 91188, - 91196, 91202, 91208, 91214, 91221, 91227, 91233, 91239, 91246, 91252, - 91258, 91264, 91271, 91276, 91281, 91286, 91292, 91298, 91304, 91310, - 91317, 91323, 91329, 91335, 91341, 91347, 91353, 91359, 91365, 91371, - 91377, 91383, 91390, 91396, 91402, 91408, 91415, 91421, 91427, 91433, - 91440, 91446, 91452, 91458, 91465, 91471, 91477, 91483, 91490, 91496, - 91502, 91508, 91515, 91521, 91527, 91533, 91540, 91546, 91552, 91558, - 91565, 91571, 91577, 91583, 91590, 91596, 91602, 91608, 91615, 91621, - 91627, 91633, 91640, 91646, 91652, 91658, 91665, 91670, 91675, 91680, - 91686, 91692, 91698, 91704, 91711, 91717, 91723, 91729, 91736, 91742, - 91748, 91755, 91762, 91767, 91772, 91777, 91783, 91795, 91807, 91819, - 91831, 91844, 91857, 91865, 0, 0, 91873, 0, 91881, 91885, 91889, 91892, - 91896, 91900, 91903, 91906, 91910, 91914, 91917, 91920, 91923, 91926, - 91931, 91934, 91938, 91941, 91944, 91947, 91950, 91953, 91956, 91959, - 91962, 91965, 91968, 91971, 91975, 91979, 91983, 91987, 91992, 91997, - 92003, 92009, 92015, 92020, 92026, 92032, 92038, 92043, 92049, 92055, - 92060, 92066, 92072, 92077, 92083, 92089, 92094, 92100, 92106, 92111, - 92117, 92123, 92129, 92135, 92141, 92145, 92150, 92154, 92159, 92163, - 92168, 92173, 92179, 92185, 92191, 92196, 92202, 92208, 92214, 92219, - 92225, 92231, 92236, 92242, 92248, 92253, 92259, 92265, 92270, 92276, - 92282, 92287, 92293, 92299, 92305, 92311, 92317, 92322, 92326, 92331, - 92334, 92339, 92344, 92350, 92355, 92360, 92364, 92369, 92374, 92379, - 92384, 92389, 92394, 92399, 92404, 92410, 92416, 92422, 92430, 92434, - 92438, 92442, 92446, 92450, 92454, 92459, 92464, 92469, 92474, 92478, - 92483, 92488, 92493, 92498, 92502, 92507, 92512, 92517, 92521, 92525, - 92530, 92535, 92540, 92545, 92549, 92554, 92559, 92564, 92569, 92573, - 92578, 92583, 92588, 92593, 92597, 92602, 92607, 92611, 92616, 92621, - 92626, 92631, 92636, 92641, 92648, 92655, 92659, 92664, 92669, 92674, - 92679, 92684, 92689, 92694, 92699, 92704, 92709, 92714, 92719, 92724, - 92729, 92734, 92739, 92744, 92749, 92754, 92759, 92764, 92769, 92774, - 92779, 92784, 92789, 92794, 92799, 92804, 0, 0, 0, 92809, 92813, 92818, - 92822, 92827, 92832, 0, 0, 92836, 92841, 92846, 92850, 92855, 92860, 0, - 0, 92865, 92870, 92874, 92879, 92884, 92889, 0, 0, 92894, 92899, 92904, - 0, 0, 0, 92908, 92912, 92916, 92920, 92923, 92927, 92931, 0, 92935, - 92941, 92944, 92948, 92951, 92955, 92959, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 92963, 92969, 92975, 92981, 92987, 0, 0, 92991, 92997, 93003, 93009, - 93015, 93021, 93028, 93035, 93042, 93049, 93056, 93063, 0, 93070, 93077, - 93084, 93090, 93097, 93104, 93111, 93118, 93124, 93131, 93138, 93145, - 93152, 93158, 93165, 93172, 93179, 93186, 93192, 93199, 93206, 93213, - 93220, 93227, 93234, 93241, 0, 93248, 93254, 93261, 93268, 93275, 93282, - 93288, 93295, 93302, 93309, 93316, 93322, 93329, 93336, 93342, 93349, - 93356, 93363, 93370, 0, 93377, 93384, 0, 93391, 93398, 93405, 93412, - 93419, 93426, 93433, 93440, 93447, 93454, 93461, 93468, 93475, 93482, - 93489, 0, 0, 93495, 93500, 93505, 93510, 93515, 93520, 93525, 93530, - 93535, 93540, 93545, 93550, 93555, 93560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 93565, 93572, 93579, 93586, 93593, 93600, 93607, 93614, 93621, 93628, - 93635, 93642, 93649, 93656, 93663, 93670, 93677, 93684, 93691, 93698, - 93706, 93714, 93721, 93728, 93733, 93741, 93749, 93756, 93763, 93768, - 93775, 93780, 93785, 93792, 93797, 93802, 93807, 93815, 93820, 93825, - 93832, 93837, 93842, 93849, 93856, 93861, 93866, 93871, 93876, 93881, - 93886, 93891, 93896, 93901, 93908, 93913, 93920, 93925, 93930, 93935, - 93940, 93945, 93950, 93955, 93960, 93965, 93970, 93975, 93982, 93989, - 93996, 94003, 94009, 94014, 94021, 94026, 94031, 94040, 94047, 94056, - 94063, 94068, 94073, 94081, 94086, 94091, 94096, 94101, 94106, 94113, - 94118, 94123, 94128, 94133, 94138, 94145, 94152, 94159, 94166, 94173, - 94180, 94187, 94194, 94201, 94208, 94215, 94222, 94229, 94236, 94243, - 94250, 94257, 94264, 94271, 94278, 94285, 94292, 94299, 94306, 94313, - 94320, 94327, 94334, 0, 0, 0, 0, 0, 94341, 94349, 94357, 0, 0, 0, 0, - 94362, 94366, 94370, 94374, 94378, 94382, 94386, 94390, 94394, 94398, - 94403, 94408, 94413, 94418, 94423, 94428, 94433, 94438, 94443, 94449, - 94455, 94461, 94468, 94475, 94482, 94489, 94496, 94503, 94508, 94513, - 94518, 94524, 94530, 94536, 94542, 94548, 94554, 94560, 94566, 94572, - 94578, 94584, 94590, 94596, 94602, 0, 0, 0, 94608, 94616, 94624, 94632, - 94640, 94648, 94658, 94668, 94676, 94684, 94692, 94700, 94708, 94714, - 94721, 94730, 94738, 94746, 94755, 94764, 94773, 94783, 94794, 94804, - 94815, 94824, 94833, 94842, 94852, 94863, 94873, 94884, 94895, 94904, - 94912, 94918, 94924, 94930, 94936, 94944, 94952, 94958, 94965, 94975, - 94982, 94989, 94996, 95003, 95010, 95020, 95027, 95034, 95042, 95050, - 95059, 95068, 95077, 95086, 95095, 95102, 95110, 95119, 95128, 95132, - 95139, 95144, 95149, 95153, 95157, 95161, 95165, 95170, 95175, 95181, - 95187, 95191, 95197, 95201, 95205, 95209, 95213, 95217, 95221, 95227, - 95231, 95236, 95240, 95244, 0, 95247, 95252, 95257, 95262, 95267, 95274, - 95279, 95284, 95289, 95294, 95299, 95304, 0, 0, 0, 0, 95309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95315, 95322, - 95331, 95340, 95347, 95354, 95361, 95368, 95375, 95382, 95388, 95395, - 95402, 95409, 95416, 95423, 95430, 95437, 95444, 95453, 95460, 95467, - 95474, 95481, 95488, 95495, 95502, 95509, 95518, 95525, 95532, 95539, - 95546, 95553, 95560, 95569, 95576, 95583, 95590, 95597, 95606, 95613, - 95620, 95627, 95635, 95644, 0, 0, 95653, 95657, 95661, 95666, 95671, - 95676, 95681, 95685, 95690, 95695, 95700, 95705, 95710, 95715, 95719, - 95724, 95729, 95734, 95739, 95743, 95748, 95753, 95757, 95762, 95767, - 95772, 95777, 95782, 95787, 0, 0, 0, 95792, 95796, 95801, 95806, 95810, - 95815, 95819, 95824, 95829, 95834, 95839, 95844, 95848, 95853, 95858, - 95863, 95868, 95873, 95878, 95882, 95887, 95892, 95897, 95902, 95907, - 95912, 95916, 95920, 95925, 95930, 95935, 95940, 95945, 95950, 95955, - 95960, 95965, 95970, 95975, 95980, 95985, 95990, 95995, 96000, 96005, - 96010, 96015, 96020, 96025, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 96030, 96036, 96041, 96046, 96051, 96056, 96061, 96066, 96071, 96076, - 96081, 96087, 96093, 96099, 96105, 96111, 96117, 96123, 96129, 96135, - 96142, 96149, 96156, 96164, 96172, 96180, 96188, 96196, 0, 0, 0, 0, - 96204, 96208, 96213, 96218, 96223, 96227, 96232, 96237, 96242, 96247, - 96251, 96255, 96260, 96265, 96270, 96275, 96279, 96284, 96289, 96294, - 96299, 96304, 96309, 96313, 96318, 96323, 96328, 96333, 96338, 96343, - 96348, 96353, 96358, 96363, 96368, 96374, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 96380, 96385, 96392, 96399, 96404, 96409, 96414, 96419, 96424, 96429, - 96434, 96439, 96444, 96449, 96454, 96459, 96464, 96469, 96474, 96479, - 96484, 96489, 96494, 96499, 96504, 96509, 96514, 96519, 96524, 96529, 0, - 0, 0, 0, 0, 96536, 96542, 96548, 96554, 96560, 96565, 96571, 96577, - 96583, 96589, 96594, 96600, 96606, 96612, 96618, 96624, 96630, 96636, - 96642, 96648, 96653, 96659, 96665, 96671, 96677, 96683, 96688, 96694, - 96700, 96705, 96711, 96717, 96723, 96729, 96735, 96741, 96747, 96752, - 96758, 96765, 96772, 96779, 96786, 0, 0, 0, 0, 0, 96793, 96798, 96803, - 96808, 96813, 96818, 96823, 96828, 96833, 96838, 96843, 96848, 96853, - 96858, 96863, 96868, 96873, 96878, 96883, 96888, 96893, 96898, 96903, - 96908, 96913, 96918, 96923, 96927, 96931, 96935, 0, 96940, 96946, 96951, - 96956, 96961, 96966, 96972, 96978, 96984, 96990, 96996, 97002, 97008, - 97013, 97019, 97025, 97031, 97037, 97043, 97048, 97054, 97060, 97065, - 97071, 97076, 97082, 97088, 97093, 97099, 97105, 97110, 97116, 97121, - 97126, 97132, 97138, 97144, 0, 0, 0, 0, 97149, 97155, 97161, 97167, - 97173, 97179, 97185, 97191, 97197, 97204, 97209, 97214, 97220, 97226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97232, 97238, 97244, - 97250, 97257, 97263, 97270, 97277, 97284, 97291, 97299, 97306, 97314, - 97320, 97326, 97332, 97338, 97344, 97350, 97356, 97362, 97368, 97374, - 97380, 97386, 97392, 97398, 97404, 97410, 97416, 97422, 97428, 97434, - 97440, 97446, 97452, 97458, 97464, 97470, 97476, 97482, 97488, 97494, - 97500, 97507, 97513, 97520, 97527, 97534, 97541, 97549, 97556, 97564, - 97570, 97576, 97582, 97588, 97594, 97600, 97606, 97612, 97618, 97624, - 97630, 97636, 97642, 97648, 97654, 97660, 97666, 97672, 97678, 97684, - 97690, 97696, 97702, 97708, 97714, 97720, 97726, 97732, 97737, 97742, - 97747, 97752, 97757, 97762, 97767, 97772, 97777, 97782, 97787, 97792, - 97797, 97802, 97807, 97812, 97817, 97822, 97827, 97832, 97837, 97842, - 97847, 97852, 97857, 97862, 97867, 97872, 97877, 97882, 97887, 97892, - 97897, 97902, 97907, 97912, 97917, 97922, 97927, 97932, 97937, 97942, - 97947, 97952, 97957, 97962, 97967, 97972, 97977, 97982, 97986, 97991, - 97996, 98001, 98006, 98010, 98014, 98019, 98024, 98029, 98034, 98039, - 98044, 98049, 98054, 98059, 98064, 98069, 98073, 98077, 98081, 98085, - 98089, 98093, 98097, 98102, 98107, 0, 0, 98112, 98117, 98121, 98125, - 98129, 98133, 98137, 98141, 98145, 98149, 0, 0, 0, 0, 0, 0, 98153, 98158, - 98164, 98170, 98176, 98182, 98188, 98194, 98199, 98205, 98210, 98216, - 98221, 98226, 98232, 98238, 98243, 98248, 98253, 98258, 98264, 98269, - 98275, 98280, 98286, 98291, 98297, 98303, 98309, 98315, 98321, 98326, - 98332, 98338, 98344, 98350, 0, 0, 0, 0, 98356, 98361, 98367, 98373, - 98379, 98385, 98391, 98397, 98402, 98408, 98413, 98419, 98424, 98429, - 98435, 98441, 98446, 98451, 98456, 98461, 98467, 98472, 98478, 98483, - 98489, 98494, 98500, 98506, 98512, 98518, 98524, 98529, 98535, 98541, - 98547, 98553, 0, 0, 0, 0, 98559, 98563, 98568, 98573, 98578, 98583, - 98588, 98593, 98598, 98602, 98607, 98612, 98617, 98622, 98626, 98631, - 98636, 98641, 98646, 98651, 98656, 98660, 98665, 98669, 98674, 98679, - 98684, 98689, 98694, 98699, 98704, 98709, 98713, 98718, 98723, 98728, - 98733, 98738, 98743, 98748, 0, 0, 0, 0, 0, 0, 0, 0, 98753, 98760, 98767, - 98774, 98781, 98788, 98795, 98802, 98809, 98816, 98823, 98830, 98837, - 98844, 98851, 98858, 98865, 98872, 98879, 98886, 98893, 98900, 98907, - 98914, 98921, 98928, 98935, 98942, 98949, 98956, 98963, 98970, 98977, - 98984, 98991, 98998, 99005, 99012, 99019, 99026, 99033, 99040, 99047, - 99054, 99061, 99068, 99075, 99082, 99089, 99096, 99103, 99110, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 99117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 99124, 99129, 99134, 99139, 99144, 99149, 99154, 99159, 99164, - 99169, 99174, 99179, 99184, 99189, 99194, 99199, 99204, 99209, 99214, - 99219, 99224, 99229, 99234, 99239, 99244, 99249, 99254, 99259, 99264, - 99269, 99274, 99279, 99284, 99289, 99294, 99299, 99304, 99309, 99314, - 99319, 99324, 99329, 99334, 99339, 99344, 99349, 99354, 99359, 99364, - 99369, 99374, 99379, 99384, 99389, 99394, 99399, 99404, 99409, 99414, - 99419, 99424, 99429, 99434, 99439, 99444, 99449, 99454, 99459, 99464, - 99469, 99474, 99479, 99484, 99489, 99494, 99499, 99504, 99509, 99514, - 99519, 99524, 99529, 99534, 99539, 99544, 99549, 99554, 99559, 99564, - 99569, 99574, 99579, 99584, 99589, 99594, 99599, 99604, 99609, 99614, - 99619, 99624, 99629, 99634, 99639, 99644, 99649, 99654, 99659, 99664, - 99669, 99674, 99679, 99684, 99689, 99694, 99699, 99704, 99709, 99714, - 99719, 99724, 99729, 99734, 99739, 99744, 99749, 99754, 99759, 99764, - 99769, 99774, 99779, 99784, 99789, 99794, 99799, 99804, 99809, 99814, - 99819, 99824, 99829, 99834, 99839, 99844, 99849, 99854, 99859, 99864, - 99869, 99874, 99879, 99884, 99889, 99894, 99899, 99904, 99909, 99914, - 99919, 99924, 99929, 99934, 99939, 99944, 99949, 99954, 99959, 99964, - 99969, 99974, 99979, 99984, 99989, 99994, 99999, 100004, 100009, 100014, - 100019, 100024, 100029, 100034, 100039, 100044, 100049, 100054, 100059, - 100064, 100069, 100074, 100079, 100084, 100089, 100094, 100099, 100104, - 100109, 100114, 100119, 100124, 100129, 100134, 100139, 100144, 100149, - 100154, 100159, 100164, 100169, 100174, 100179, 100184, 100189, 100194, - 100199, 100204, 100209, 100214, 100219, 100224, 100229, 100234, 100239, - 100244, 100249, 100254, 100259, 100264, 100269, 100274, 100279, 100284, - 100289, 100294, 100299, 100304, 100309, 100314, 100319, 100324, 100329, - 100334, 100339, 100344, 100349, 100354, 100359, 100364, 100369, 100374, - 100379, 100384, 100389, 100394, 100399, 100404, 100409, 100414, 100419, - 100424, 100429, 100434, 100439, 100444, 100449, 100454, 100459, 100464, - 100469, 100474, 100479, 100484, 100489, 100494, 100499, 100504, 100509, - 100514, 100519, 100524, 100529, 100534, 100539, 100544, 100549, 100554, - 100559, 100564, 100569, 100574, 100579, 100584, 100589, 100594, 100599, - 100604, 100609, 100614, 100619, 100624, 100629, 100634, 100639, 100644, - 100649, 100654, 100659, 100664, 100669, 100674, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 100679, 100685, 100692, 100699, 100705, 100712, 100719, 100726, - 100733, 100739, 100746, 100753, 100760, 100767, 100774, 100781, 100788, - 100795, 100802, 100809, 100816, 100823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 100830, 100835, 100840, 100845, 100850, 100855, 100860, 100865, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100870, - 100874, 100878, 100882, 100886, 100890, 0, 0, 100895, 0, 100900, 100904, - 100909, 100914, 100919, 100924, 100928, 100933, 100938, 100943, 100948, - 100952, 100957, 100962, 100967, 100972, 100976, 100981, 100986, 100991, - 100996, 101000, 101005, 101010, 101015, 101020, 101024, 101029, 101034, - 101039, 101044, 101048, 101053, 101058, 101063, 101068, 101072, 101077, - 101082, 101086, 101091, 101096, 101101, 101106, 0, 101111, 101116, 0, 0, - 0, 101121, 0, 0, 101126, 101131, 101138, 101145, 101152, 101159, 101166, - 101173, 101180, 101187, 101194, 101201, 101208, 101215, 101222, 101229, - 101236, 101243, 101250, 101257, 101264, 101271, 101278, 0, 101285, - 101292, 101298, 101304, 101310, 101317, 101324, 101332, 101339, 101347, - 101352, 101357, 101362, 101367, 101372, 101377, 101382, 101387, 101392, - 101397, 101402, 101407, 101412, 101418, 101423, 101428, 101433, 101438, - 101443, 101448, 101453, 101458, 101463, 101469, 101475, 101479, 101483, - 101487, 101491, 101495, 101500, 101505, 101511, 101516, 101522, 101527, - 101532, 101537, 101543, 101548, 101553, 101558, 101563, 101568, 101574, - 101579, 101585, 101590, 101596, 101601, 101607, 101612, 101618, 101623, - 101628, 101633, 101638, 101643, 101648, 101653, 101659, 101664, 0, 0, 0, - 0, 0, 0, 0, 0, 101669, 101673, 101677, 101681, 101685, 101691, 101695, - 101700, 101705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 101711, 101716, 101721, 101726, 101731, 101736, 101741, - 101746, 101751, 101756, 101761, 101766, 101771, 101776, 101781, 101786, - 101791, 101796, 101801, 0, 101806, 101811, 0, 0, 0, 0, 0, 101816, 101820, - 101824, 101829, 101834, 101840, 101845, 101850, 101855, 101860, 101865, - 101870, 101875, 101880, 101885, 101890, 101895, 101900, 101905, 101910, - 101915, 101920, 101925, 101930, 101935, 101940, 101945, 101950, 101954, - 101959, 101964, 101970, 101974, 0, 0, 0, 101978, 101984, 101988, 101993, - 101998, 102003, 102007, 102012, 102016, 102021, 102026, 102030, 102035, - 102040, 102044, 102048, 102053, 102058, 102062, 102067, 102072, 102077, - 102082, 102087, 102092, 102097, 102102, 0, 0, 0, 0, 0, 102107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102112, 102117, 102122, 102127, - 102132, 102137, 102143, 102149, 102155, 102160, 102165, 102170, 102176, - 102182, 102188, 102193, 102199, 102204, 102210, 102216, 102221, 102227, - 102233, 102238, 102244, 102249, 102255, 102261, 102267, 102272, 102278, - 102284, 102290, 102295, 102300, 102305, 102310, 102315, 102321, 102327, - 102332, 102337, 102342, 102348, 102353, 102358, 102364, 102370, 102375, - 102382, 102388, 102393, 102399, 102404, 102410, 102415, 0, 0, 0, 0, - 102421, 102429, 102436, 102443, 102450, 102455, 102460, 102465, 102470, - 102475, 102480, 102485, 102490, 102495, 102501, 102507, 102513, 102519, - 102525, 102531, 0, 0, 102537, 102544, 102551, 102558, 102566, 102574, - 102582, 102590, 102598, 102606, 102612, 102618, 102624, 102631, 102638, - 102645, 102652, 102659, 102666, 102673, 102680, 102687, 102694, 102701, - 102708, 102715, 102722, 102729, 102737, 102745, 102753, 102762, 102771, - 102780, 102789, 102798, 102807, 102814, 102821, 102828, 102836, 102844, - 102852, 102860, 102868, 102876, 102884, 102888, 102893, 102898, 0, - 102904, 102909, 0, 0, 0, 0, 0, 102914, 102920, 102927, 102932, 102937, - 102941, 102946, 102951, 0, 102956, 102961, 102966, 0, 102971, 102976, - 102981, 102986, 102991, 102996, 103001, 103005, 103010, 103015, 103020, - 103024, 103028, 103033, 103038, 103043, 103047, 103051, 103055, 103059, - 103064, 103069, 103074, 103078, 103083, 103087, 103092, 103097, 103102, - 0, 0, 103107, 103113, 103118, 0, 0, 0, 0, 103123, 103127, 103131, 103135, - 103139, 103143, 103148, 103153, 103159, 103164, 0, 0, 0, 0, 0, 0, 0, - 103170, 103176, 103183, 103189, 103196, 103202, 103208, 103214, 103221, - 0, 0, 0, 0, 0, 0, 0, 103227, 103235, 103243, 103251, 103259, 103267, - 103275, 103283, 103291, 103299, 103307, 103315, 103323, 103331, 103339, - 103347, 103355, 103363, 103371, 103379, 103387, 103395, 103403, 103411, - 103419, 103427, 103435, 103443, 103451, 103459, 103466, 103474, 103482, - 103489, 103496, 103503, 103510, 103517, 103524, 103531, 103538, 103545, - 103552, 103559, 103566, 103573, 103580, 103587, 103594, 103601, 103608, - 103615, 103622, 103629, 103636, 103643, 103650, 103657, 103664, 103671, - 103678, 103685, 103691, 103698, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103705, 103710, - 103715, 103720, 103725, 103730, 103735, 103740, 103745, 103750, 103755, - 103760, 103765, 103770, 103775, 103780, 103785, 103790, 103795, 103800, - 103805, 103810, 103815, 103820, 103825, 103830, 103835, 103840, 103845, - 103850, 103855, 103860, 103865, 103870, 103875, 103880, 103885, 103890, - 103896, 0, 0, 0, 0, 103902, 103906, 103910, 103915, 103920, 103926, - 103932, 103938, 103948, 103957, 103963, 103970, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 103978, 103982, 103987, 103992, 103997, 104002, 104007, 104012, - 104017, 104021, 104026, 104030, 104035, 104039, 104044, 104048, 104053, - 104058, 104063, 104068, 104073, 104078, 104083, 104088, 104093, 104098, - 104103, 104108, 104113, 104118, 104123, 104128, 104133, 104138, 104143, - 104148, 104153, 104158, 104163, 104168, 104173, 104178, 104183, 104188, - 104193, 104198, 104203, 104208, 104213, 104218, 104223, 104228, 104233, - 104238, 0, 0, 0, 104243, 104248, 104258, 104267, 104277, 104287, 104298, - 104309, 104316, 104323, 104330, 104337, 104344, 104351, 104358, 104365, - 104372, 104379, 104386, 104393, 104400, 104407, 104414, 104421, 104428, - 104435, 104442, 104449, 104456, 0, 0, 104463, 104469, 104475, 104481, - 104487, 104494, 104501, 104509, 104516, 104523, 104530, 104537, 104544, - 104551, 104558, 104565, 104572, 104579, 104586, 104593, 104600, 104607, - 104614, 104621, 104628, 104635, 104642, 0, 0, 0, 0, 0, 104649, 104655, - 104661, 104667, 104673, 104680, 104687, 104695, 104702, 104709, 104716, - 104723, 104730, 104737, 104744, 104751, 104758, 104765, 104772, 104779, - 104786, 104793, 104800, 104807, 104814, 104821, 0, 0, 0, 0, 0, 0, 0, - 104828, 104835, 104843, 104854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 104865, 104871, 104877, 104883, 104889, 104896, 104903, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68457, 68466, 68475, 68486, 68493, 68498, + 68503, 68510, 68517, 68523, 68528, 68533, 68538, 68543, 68550, 68555, + 68560, 68565, 68576, 68581, 68586, 68593, 68598, 68605, 68610, 68615, + 68622, 68629, 68636, 68645, 68654, 68659, 68664, 68669, 68676, 68681, + 68691, 68698, 68703, 68708, 68713, 68718, 68723, 68728, 68736, 68743, + 68750, 68755, 68762, 68767, 68774, 68783, 68794, 68799, 68808, 68813, + 68820, 68829, 68838, 68843, 68848, 68855, 68861, 68868, 68875, 68879, + 68883, 68886, 68890, 68894, 68898, 68902, 68906, 68910, 68914, 68917, + 68921, 68925, 68929, 68933, 68937, 68941, 68944, 68948, 68952, 68955, + 68959, 68963, 68967, 68971, 68975, 68979, 68983, 68987, 68991, 68995, + 68999, 69003, 69007, 69011, 69015, 69019, 69023, 69027, 69031, 69035, + 69039, 69043, 69047, 69051, 69055, 69059, 69063, 69067, 69071, 69075, + 69079, 69083, 69087, 69091, 69095, 69099, 69103, 69107, 69111, 69115, + 69119, 69123, 69127, 69131, 69134, 69138, 69142, 69146, 69150, 69154, + 69158, 69162, 69166, 69170, 69174, 69178, 69182, 69186, 69190, 69194, + 69198, 69202, 69206, 69210, 69214, 69218, 69222, 69226, 69230, 69234, + 69238, 69242, 69246, 69250, 69254, 69258, 69262, 69266, 69270, 69274, + 69278, 69282, 69286, 69290, 69294, 69298, 69302, 69306, 69310, 69314, + 69318, 69322, 69326, 69330, 69334, 69338, 69342, 69346, 69350, 69354, + 69358, 69362, 69366, 69370, 69374, 69378, 69382, 69386, 69390, 69394, + 69398, 69402, 69406, 69410, 69414, 69418, 69422, 69426, 69430, 69434, + 69438, 69442, 69446, 69450, 69454, 69458, 69462, 69466, 69470, 69474, + 69478, 69482, 69486, 69490, 69494, 69498, 69502, 69506, 69510, 69514, + 69518, 69522, 69526, 69530, 69534, 69538, 69542, 69546, 69550, 69554, + 69558, 69562, 69566, 69570, 69574, 69578, 69582, 69586, 69590, 69594, + 69598, 69602, 69605, 69609, 69613, 69617, 69621, 69625, 69629, 69633, + 69637, 69641, 69645, 69649, 69653, 69657, 69661, 69665, 69669, 69673, + 69677, 69681, 69685, 69689, 69693, 69697, 69701, 69705, 69709, 69713, + 69717, 69721, 69725, 69729, 69733, 69737, 69741, 69745, 69749, 69753, + 69757, 69761, 69765, 69769, 69773, 69777, 69781, 69785, 69789, 69793, + 69797, 69801, 69805, 69809, 69813, 69817, 69821, 69825, 69829, 69833, + 69837, 69841, 69845, 69849, 69853, 69857, 69861, 69865, 69869, 69873, + 69877, 69881, 69885, 69889, 69893, 69897, 69901, 69905, 69909, 69913, + 69917, 69921, 69925, 69929, 69933, 69937, 69941, 69945, 69949, 69953, + 69957, 69961, 69965, 69969, 69973, 69977, 69981, 69985, 69989, 69993, + 69997, 70001, 70005, 70009, 70013, 70017, 70021, 70025, 70029, 70033, + 70036, 70040, 70044, 70048, 70052, 70056, 70060, 70064, 70067, 70071, + 70075, 70079, 70083, 70087, 70091, 70095, 70099, 70103, 70107, 70111, + 70115, 70119, 70123, 70127, 70131, 70135, 70139, 70143, 70147, 70151, + 70155, 70159, 70163, 70167, 70171, 70175, 70179, 70183, 70187, 70191, + 70195, 70199, 70203, 70207, 70211, 70215, 70219, 70223, 70227, 70231, + 70235, 70239, 70243, 70247, 70251, 70255, 70259, 70263, 70267, 70271, + 70275, 70279, 70283, 70287, 70291, 70295, 70299, 70303, 70307, 70311, + 70315, 70319, 70323, 70327, 70331, 70335, 70339, 70343, 70347, 70351, + 70355, 70359, 70363, 70367, 70371, 70375, 70379, 70383, 70387, 70391, + 70395, 70399, 70403, 70407, 70411, 70415, 70419, 70423, 70426, 70430, + 70434, 70438, 70442, 70446, 70450, 70454, 70458, 70462, 70466, 70470, + 70474, 70478, 70482, 70486, 70490, 70494, 70498, 70502, 70506, 70510, + 70514, 70518, 70522, 70526, 70530, 70534, 70538, 70542, 70546, 70550, + 70554, 70558, 70562, 70566, 70570, 70574, 70578, 70582, 70586, 70590, + 70594, 70598, 70602, 70606, 70610, 70614, 70618, 70622, 70626, 70630, + 70634, 70638, 70642, 70646, 70650, 70654, 70658, 70662, 70665, 70669, + 70673, 70677, 70681, 70685, 70689, 70693, 70697, 70701, 70705, 70709, + 70713, 70717, 70721, 70725, 70729, 70733, 70737, 70741, 70745, 70749, + 70753, 70757, 70761, 70765, 70769, 70773, 70777, 70781, 70785, 70789, + 70793, 70797, 70801, 70805, 70809, 70813, 70817, 70821, 70825, 70829, + 70833, 70837, 70841, 70845, 70849, 70853, 70857, 70861, 70865, 70869, + 70873, 70877, 70881, 70885, 70889, 70893, 70897, 70901, 70905, 70909, + 70913, 70917, 70920, 70924, 70928, 70932, 70936, 70940, 70944, 70948, + 70952, 70956, 70960, 70964, 70968, 70972, 70976, 70980, 70984, 70988, + 70992, 70996, 71000, 71004, 71008, 71012, 71016, 71020, 71024, 71028, + 71032, 71036, 71040, 71044, 71048, 71052, 71056, 71060, 71064, 71068, + 71072, 71076, 71080, 71084, 71088, 71092, 71096, 71100, 71104, 71108, + 71112, 71116, 71120, 71124, 71128, 71132, 71136, 71140, 71144, 71148, + 71152, 71156, 71160, 71164, 71168, 71172, 71176, 71180, 71184, 71188, + 71192, 71196, 71200, 71204, 71208, 71212, 71216, 71220, 71224, 71228, + 71232, 71236, 71240, 71244, 71248, 71252, 71256, 71260, 71264, 71268, + 71272, 71276, 71280, 71284, 71288, 71292, 71296, 71300, 71304, 71308, + 71312, 71316, 71320, 71324, 71328, 71332, 71336, 71340, 71344, 71348, + 71352, 71356, 71360, 71364, 71368, 71372, 71375, 71379, 71383, 71387, + 71391, 71395, 71399, 71403, 71407, 71411, 71415, 71419, 71423, 71427, + 71431, 71435, 71439, 71443, 71447, 71451, 71455, 71459, 71463, 71467, + 71471, 71475, 71479, 71483, 71487, 71491, 71495, 71499, 71503, 71507, + 71511, 71515, 71519, 71523, 71527, 71531, 71535, 71539, 71543, 71547, + 71551, 71555, 71559, 71563, 71567, 71571, 71575, 71579, 71583, 71587, + 71591, 71595, 71599, 71603, 71607, 71611, 71615, 71619, 71623, 71627, + 71631, 71635, 71639, 71643, 71647, 71651, 71655, 71659, 71663, 71667, + 71671, 71675, 71679, 71683, 71687, 71691, 71695, 71699, 71703, 71707, + 71711, 71715, 71719, 71723, 71727, 71731, 71735, 71739, 71743, 71747, + 71751, 71755, 71759, 71763, 71767, 71771, 71775, 71779, 71783, 71787, + 71791, 71795, 71799, 71803, 71807, 71811, 71815, 71819, 71823, 71827, + 71831, 71835, 71839, 71843, 71847, 71851, 71855, 71859, 71863, 71867, + 71871, 71875, 71879, 71883, 71887, 71891, 71895, 71899, 71903, 71907, + 71911, 71915, 71919, 71923, 71927, 71931, 71935, 71939, 71943, 71947, + 71951, 71955, 71959, 71963, 71967, 71971, 71975, 71978, 71982, 71986, + 71990, 71994, 71998, 72002, 72006, 72009, 72013, 72017, 72021, 72025, + 72029, 72033, 72037, 72041, 72045, 72049, 72053, 72057, 72061, 72065, + 72069, 72073, 72077, 72081, 72085, 72089, 72093, 72097, 72101, 72105, + 72109, 72113, 72117, 72121, 72125, 72129, 72133, 72137, 72141, 72145, + 72149, 72153, 72157, 72161, 72165, 72169, 72173, 72177, 72181, 72185, + 72189, 72193, 72197, 72201, 72205, 72209, 72213, 72217, 72221, 72225, + 72229, 72233, 72237, 72241, 72245, 72249, 72253, 72257, 72261, 72265, + 72269, 72273, 72277, 72281, 72285, 72289, 72293, 72297, 72301, 72305, + 72309, 72313, 72317, 72321, 72325, 72329, 72333, 72337, 72341, 72345, + 72349, 72353, 72357, 72361, 72365, 72369, 72373, 72377, 72381, 72385, + 72389, 72393, 72397, 72401, 72405, 72409, 72413, 72417, 72421, 72425, + 72429, 72433, 72437, 72441, 72445, 72449, 72453, 72457, 72461, 72465, + 72469, 72473, 72477, 72481, 72485, 72489, 72493, 72497, 72501, 72505, + 72509, 72513, 72517, 72521, 72525, 72529, 72533, 72537, 72541, 72545, + 72549, 72553, 72557, 72561, 72565, 72569, 72573, 72577, 72581, 72585, + 72589, 72593, 72597, 72601, 72605, 72609, 72613, 72617, 72621, 72625, + 72629, 72633, 72637, 72641, 72645, 72649, 72653, 72657, 72661, 72665, + 72669, 72673, 72677, 72681, 72685, 72689, 72693, 72697, 72701, 72705, + 72709, 72713, 72717, 72721, 72725, 72729, 72733, 72736, 72740, 72744, + 72748, 72752, 72756, 72760, 72764, 72768, 72772, 72776, 72780, 72784, + 72788, 72792, 72796, 72800, 72804, 72808, 72812, 72816, 72820, 72824, + 72828, 72832, 72836, 72840, 72844, 72848, 72852, 72856, 72860, 72864, + 72868, 72872, 72876, 72880, 72884, 72888, 72892, 72896, 72900, 72904, + 72908, 72912, 72916, 72920, 72924, 72928, 72932, 72936, 72940, 72944, + 72948, 72952, 72956, 72960, 72964, 72968, 72972, 72976, 72980, 72984, + 72988, 72992, 72996, 73000, 73004, 73008, 73012, 73016, 73020, 73024, + 73028, 73032, 73036, 73040, 73044, 73048, 73052, 73056, 73060, 73064, + 73068, 73072, 73076, 73080, 73084, 73088, 73092, 73096, 73100, 73104, + 73108, 73112, 73116, 73120, 73124, 73128, 73132, 73136, 73140, 73144, + 73148, 73152, 73156, 73160, 73164, 73168, 73172, 73176, 73180, 73184, + 73188, 73192, 73196, 73200, 73204, 73208, 73212, 73216, 73220, 73224, + 73228, 73232, 73236, 73240, 73244, 73248, 73252, 73256, 73260, 73264, + 73268, 73272, 73276, 73280, 73284, 73288, 73292, 73296, 73300, 73304, + 73308, 73312, 73316, 73320, 73324, 73328, 73332, 73336, 73340, 73344, + 73348, 73352, 73356, 73360, 73364, 73368, 73372, 73376, 73380, 73384, + 73388, 73392, 73396, 73400, 73404, 73408, 73412, 73416, 73420, 73424, + 73428, 73432, 73436, 73440, 73444, 73448, 73452, 73456, 73460, 73464, + 73468, 73472, 73476, 73480, 73484, 73488, 73492, 73496, 73500, 73504, + 73508, 73512, 73516, 0, 0, 0, 73520, 73524, 73528, 73532, 73536, 73540, + 73544, 73548, 73552, 73556, 73560, 73564, 73568, 73572, 73576, 73580, + 73584, 73588, 73592, 73596, 73600, 73604, 73608, 73612, 73616, 73620, + 73624, 73628, 73632, 73636, 73640, 73644, 73648, 73652, 73656, 73660, + 73664, 73668, 73672, 73676, 73680, 73684, 73688, 73692, 73696, 73700, + 73704, 73708, 73712, 73716, 73720, 73724, 73728, 73732, 73736, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 73740, 73745, 73749, 73754, 73759, 73763, 73768, 73773, + 73777, 73782, 73787, 73792, 73797, 73802, 73807, 73812, 73816, 73820, + 73824, 73828, 73833, 73838, 73843, 73847, 73852, 73857, 73862, 73867, + 73872, 73876, 73881, 73885, 73890, 73894, 73899, 73903, 73907, 73911, + 73916, 73921, 73926, 73934, 73942, 73950, 73958, 73965, 73973, 73979, + 73987, 73991, 73995, 73999, 74003, 74007, 74011, 74015, 74019, 74023, + 74027, 74031, 74035, 74039, 74043, 74047, 74051, 74055, 74059, 74063, + 74067, 74071, 74075, 74079, 74083, 74087, 74091, 74095, 74099, 74103, + 74107, 74111, 74115, 74119, 74123, 74127, 74131, 74134, 74138, 74142, + 74146, 74150, 74154, 74158, 74162, 74166, 74170, 74174, 74178, 74182, + 74186, 74190, 74194, 74198, 74202, 74206, 74210, 74214, 74218, 74222, + 74226, 74230, 74234, 74238, 74242, 74246, 74250, 74254, 74258, 74262, + 74266, 74270, 74274, 74278, 74281, 74285, 74289, 74292, 74296, 74300, + 74304, 74307, 74311, 74315, 74319, 74323, 74327, 74331, 74335, 74339, + 74343, 74346, 74350, 74354, 74358, 74361, 74364, 74368, 74372, 74375, + 74379, 74383, 74387, 74391, 74395, 74399, 74402, 74405, 74409, 74413, + 74417, 74420, 74423, 74427, 74431, 74435, 74439, 74443, 74447, 74451, + 74455, 74459, 74463, 74467, 74471, 74475, 74479, 74483, 74487, 74491, + 74495, 74499, 74503, 74507, 74511, 74515, 74519, 74523, 74527, 74531, + 74535, 74539, 74543, 74547, 74551, 74555, 74559, 74563, 74567, 74571, + 74574, 74578, 74582, 74586, 74590, 74594, 74598, 74602, 74606, 74610, + 74614, 74618, 74622, 74626, 74630, 74634, 74638, 74642, 74646, 74650, + 74654, 74658, 74662, 74666, 74670, 74674, 74678, 74682, 74686, 74690, + 74694, 74698, 74702, 74706, 74710, 74714, 74718, 74721, 74725, 74729, + 74733, 74737, 74741, 74745, 74749, 74753, 74757, 74761, 74765, 74769, + 74773, 74777, 74781, 74785, 74788, 74792, 74796, 74800, 74804, 74808, + 74812, 74816, 74820, 74824, 74828, 74832, 74836, 74840, 74844, 74848, + 74852, 74856, 74860, 74864, 74868, 74872, 74875, 74879, 74883, 74887, + 74891, 74895, 74899, 74903, 74907, 74911, 74915, 74919, 74923, 74927, + 74931, 74935, 74939, 74943, 74947, 74951, 74955, 74959, 74963, 74967, + 74971, 74975, 74979, 74983, 74987, 74991, 74995, 74999, 75003, 75007, + 75011, 75015, 75019, 75023, 75027, 75031, 75035, 75039, 75043, 75047, + 75050, 75055, 75059, 75065, 75070, 75076, 75080, 75084, 75088, 75092, + 75096, 75100, 75104, 75108, 75112, 75116, 75120, 75124, 75128, 75132, + 75135, 75138, 75141, 75144, 75147, 75150, 75153, 75156, 75159, 75164, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75170, 75175, + 75180, 75185, 75190, 75197, 75204, 75209, 75214, 75219, 75224, 75231, + 75238, 75245, 75252, 75259, 75266, 75276, 75286, 75293, 75300, 75307, + 75314, 75320, 75326, 75335, 75344, 75351, 75358, 75369, 75380, 75385, + 75390, 75397, 75404, 75411, 75418, 75425, 75432, 75439, 75446, 75452, + 75458, 75464, 75470, 75477, 75484, 75489, 75493, 75500, 75507, 75514, + 75518, 75525, 75529, 75534, 75538, 75544, 75549, 75555, 75560, 75564, + 75568, 75571, 75574, 75579, 75584, 75589, 75594, 75599, 75604, 75609, + 75614, 75619, 75624, 75632, 75640, 75645, 75650, 75655, 75660, 75665, + 75670, 75675, 75680, 75685, 75690, 75695, 75700, 75705, 75710, 75716, + 75722, 75728, 75734, 75739, 75745, 75748, 75751, 75754, 75758, 75762, + 75766, 75770, 75773, 75777, 75780, 75783, 75786, 75790, 75794, 75798, + 75802, 75806, 75810, 75814, 75818, 75822, 75826, 75830, 75834, 75838, + 75842, 75846, 75850, 75854, 75858, 75862, 75866, 75870, 75874, 75877, + 75881, 75885, 75889, 75893, 75897, 75901, 75905, 75909, 75913, 75917, + 75921, 75925, 75929, 75933, 75937, 75941, 75945, 75949, 75953, 75957, + 75961, 75965, 75969, 75973, 75976, 75980, 75984, 75988, 75992, 75996, + 76000, 76004, 76007, 76011, 76015, 76019, 76023, 76027, 76031, 76035, + 76039, 76043, 76047, 76051, 76055, 76060, 76065, 76068, 76073, 76076, + 76079, 76082, 0, 0, 0, 0, 0, 0, 0, 0, 76086, 76095, 76104, 76113, 76122, + 76131, 76140, 76149, 76158, 76166, 76173, 76181, 76188, 76196, 76206, + 76215, 76225, 76234, 76244, 76252, 76259, 76267, 76274, 76282, 76287, + 76292, 76298, 76306, 76312, 76318, 76325, 76334, 76342, 76350, 76358, + 76365, 76372, 76379, 76386, 76391, 76396, 76401, 76406, 76411, 76416, + 76421, 76426, 76434, 76442, 76448, 76454, 76459, 76464, 76469, 76474, + 76479, 76484, 76489, 76494, 76503, 76512, 76517, 76522, 76532, 76542, + 76549, 76556, 76565, 76574, 76586, 76598, 76604, 76610, 76618, 76626, + 76636, 76646, 76653, 76660, 76665, 76670, 76682, 76694, 76702, 76710, + 76720, 76730, 76742, 76754, 76763, 76772, 76779, 76786, 76793, 76800, + 76809, 76818, 76823, 76828, 76835, 76842, 76849, 76856, 76868, 76880, + 76885, 76890, 76895, 76900, 76905, 76910, 76915, 76920, 76924, 76929, + 76934, 76939, 76944, 76949, 76955, 76960, 76965, 76972, 76979, 76986, + 76993, 77000, 77008, 77016, 77021, 77026, 77032, 77038, 77045, 77052, + 77059, 77066, 77073, 77077, 77084, 77089, 77094, 77100, 77113, 77119, + 77127, 77135, 77142, 77149, 77158, 77167, 77174, 77181, 77188, 77195, + 77202, 77209, 77216, 77223, 77230, 77237, 77246, 77255, 77264, 77273, + 77282, 77291, 77300, 77309, 77318, 77327, 77334, 77342, 77348, 77356, + 77362, 77368, 77374, 77380, 77388, 77393, 77398, 77403, 77408, 77413, + 77419, 77425, 77431, 77437, 77443, 77449, 77455, 0, 0, 77461, 77468, + 77475, 77484, 77491, 77500, 77512, 77524, 77536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77548, 77556, 77564, 77571, 77578, 77584, + 77591, 77599, 77607, 77615, 77623, 77631, 77637, 77643, 77650, 77656, + 77662, 77668, 77675, 77682, 77689, 77696, 77703, 77710, 77717, 77724, + 77731, 77738, 77745, 77752, 77759, 77766, 77772, 77779, 77786, 77793, + 77800, 77807, 77814, 77821, 77828, 77835, 77842, 77849, 77856, 77863, + 77870, 77877, 77884, 77891, 77898, 77906, 77914, 77922, 77930, 77938, 0, + 0, 0, 77947, 77955, 77963, 77971, 77979, 77987, 77995, 78001, 78007, + 78013, 0, 0, 0, 0, 0, 0, 78019, 78023, 78028, 78033, 78038, 78043, 78048, + 78053, 78058, 78062, 78067, 78072, 78076, 78080, 78085, 78090, 78094, + 78099, 78104, 78109, 78114, 78119, 78124, 78129, 78133, 78137, 78141, + 78146, 78150, 78154, 78158, 78162, 78166, 78170, 78174, 78179, 78184, + 78189, 78194, 78199, 78206, 78212, 78217, 78222, 78227, 78232, 78238, + 78245, 78251, 78258, 78264, 78270, 78275, 78282, 78288, 78293, 0, 0, 0, + 0, 0, 0, 0, 0, 78299, 78304, 78309, 78313, 78318, 78322, 78327, 78331, + 78336, 78341, 78347, 78352, 78358, 78362, 78367, 78372, 78376, 78381, + 78386, 78390, 78395, 78400, 78405, 78410, 78415, 78420, 78425, 78430, + 78435, 78440, 78445, 78450, 78455, 78460, 78464, 78469, 78474, 78479, + 78483, 78487, 78492, 78497, 78502, 78506, 78510, 78514, 78518, 78523, + 78528, 78533, 78537, 78541, 78546, 78552, 78558, 78563, 78569, 78574, + 78580, 78586, 78593, 78599, 78606, 78611, 78617, 78623, 78628, 78634, + 78640, 78645, 0, 0, 0, 0, 0, 0, 0, 0, 78650, 78654, 78659, 78664, 78668, + 78672, 78676, 78680, 78684, 78688, 78692, 78696, 0, 0, 0, 0, 0, 0, 78700, + 78705, 78709, 78713, 78717, 78721, 78725, 78729, 78733, 78737, 78741, + 78745, 78749, 78753, 78757, 78761, 78765, 78770, 78775, 78781, 78787, + 78794, 78799, 78804, 78810, 78814, 78819, 78822, 78825, 78829, 78834, + 78838, 78843, 78850, 78856, 78862, 78868, 78874, 78880, 78886, 78892, + 78898, 78904, 78910, 78917, 78924, 78931, 78937, 78944, 78951, 78958, + 78964, 78971, 78977, 78983, 78990, 78996, 79003, 79010, 79016, 79022, + 79028, 79035, 79042, 79048, 79055, 79062, 79068, 79075, 79081, 79088, + 79095, 79101, 79107, 79114, 79120, 79127, 79134, 79143, 79150, 79157, + 79161, 79166, 79171, 79175, 79180, 79184, 79188, 79193, 79197, 79202, + 79207, 79212, 79216, 79220, 79224, 79228, 79233, 79237, 79242, 79247, + 79252, 79257, 79261, 79266, 79271, 79276, 79282, 79287, 79293, 79299, + 79305, 79311, 79317, 79322, 79328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 79332, 79337, 79341, 79345, 79349, 79353, 79357, 79361, 79365, 79369, + 79373, 79377, 79381, 79385, 79389, 79393, 79397, 79401, 79405, 79409, + 79413, 79417, 79421, 79425, 79429, 79433, 79437, 79441, 79445, 79449, 0, + 0, 0, 79453, 79458, 79463, 79468, 79473, 79477, 79484, 79488, 79493, + 79497, 79504, 79511, 79520, 79524, 79529, 79533, 79537, 79544, 79551, + 79556, 79563, 79568, 79573, 79580, 79585, 79592, 79599, 79604, 79609, + 79616, 79621, 79628, 79635, 79639, 79646, 79651, 79658, 79662, 79666, + 79673, 79678, 79685, 79689, 79693, 79697, 79704, 79708, 79713, 79720, + 79727, 79731, 79735, 79742, 79748, 79754, 79760, 79768, 79774, 79782, + 79788, 79796, 79802, 79808, 79814, 79820, 79824, 79829, 79834, 79840, + 79846, 79852, 79858, 79864, 79870, 79876, 79882, 79890, 79896, 0, 79903, + 79907, 79912, 79916, 79920, 79924, 79928, 79932, 79936, 79940, 79944, 0, + 0, 0, 0, 79948, 79956, 79962, 79968, 79974, 79980, 79986, 79992, 79998, + 80005, 80012, 80019, 80026, 80033, 80040, 80047, 80054, 80061, 80068, + 80075, 80081, 80087, 80093, 80099, 80105, 80111, 80117, 80123, 80129, + 80136, 80143, 80150, 80157, 0, 80164, 80168, 80172, 80176, 80180, 80185, + 80189, 80193, 80198, 80203, 80208, 80213, 80218, 80223, 80228, 80233, + 80238, 80243, 80248, 80253, 80257, 80262, 80267, 80272, 80277, 80281, + 80286, 80290, 80295, 80300, 80305, 80310, 80315, 80319, 80324, 80328, + 80332, 80336, 80341, 80346, 80350, 80354, 80360, 80365, 80371, 80377, + 80382, 80388, 80393, 80399, 80405, 80411, 80416, 80421, 80426, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 80432, 80438, 80444, 80450, 80457, 80463, 80469, 80475, + 80481, 80487, 80492, 80497, 80503, 80510, 0, 0, 80517, 80522, 80526, + 80530, 80534, 80538, 80542, 80546, 80550, 80554, 0, 0, 80558, 80564, + 80570, 80577, 80585, 80591, 80597, 80603, 80609, 80615, 80621, 80627, + 80633, 80639, 80645, 80651, 80656, 80661, 80666, 80672, 80678, 80685, + 80691, 80697, 80702, 80709, 80716, 80723, 80729, 80734, 80739, 80744, + 80752, 80759, 80766, 80774, 80782, 80789, 80796, 80803, 80810, 80817, + 80824, 80831, 80838, 80845, 80852, 80859, 80866, 80873, 80880, 80887, + 80894, 80901, 80908, 80915, 80922, 80928, 80934, 80941, 80948, 80955, + 80962, 80969, 80976, 80983, 80990, 80997, 81004, 81011, 81018, 81025, + 81032, 81039, 81046, 81053, 81060, 81067, 81074, 81081, 81088, 81095, + 81102, 81108, 81114, 81121, 81127, 81132, 81138, 81143, 81148, 81153, + 81160, 81166, 81172, 81178, 81184, 81190, 81196, 81202, 81210, 81218, + 81226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 81234, 81240, 81246, 81252, 81260, 81268, 81274, 81280, 81287, + 81294, 81301, 81308, 81315, 81322, 81329, 81336, 81343, 81351, 81359, + 81367, 81375, 81383, 81389, 81397, 81403, 81411, 81420, 81428, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 81434, 81438, 81442, 81446, 81450, 81454, 0, 0, + 81458, 81462, 81466, 81470, 81474, 81478, 0, 0, 81482, 81486, 81490, + 81494, 81498, 81502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81506, 81510, 81514, + 81518, 81522, 81526, 81530, 0, 81534, 81538, 81542, 81546, 81550, 81554, + 81558, 0, 81562, 81569, 81575, 81581, 81587, 81595, 81602, 81611, 81623, + 81633, 81642, 81650, 81658, 81666, 81672, 81680, 81688, 81695, 81703, + 81713, 81720, 81729, 81735, 81745, 81754, 81759, 81767, 81776, 81781, + 81790, 81797, 81807, 81819, 81824, 81830, 81837, 81842, 81852, 81862, + 81872, 81882, 81897, 81910, 81921, 81929, 81934, 81946, 81955, 81962, + 81969, 81975, 81982, 81987, 81994, 82000, 82011, 82022, 82032, 82038, + 82043, 0, 0, 0, 0, 82048, 82052, 82056, 82060, 82064, 82068, 82073, + 82078, 82082, 82087, 82092, 82097, 82102, 82107, 82111, 82116, 82121, + 82126, 82131, 82136, 82140, 82145, 82150, 82155, 82160, 82165, 82169, + 82174, 82179, 82184, 82189, 82193, 82198, 82203, 82208, 82213, 82218, + 82223, 82228, 82233, 82238, 82243, 82248, 82253, 82258, 82262, 82267, + 82272, 82277, 82282, 82287, 82292, 82297, 82301, 82306, 82311, 82316, + 82321, 82326, 82331, 82336, 82341, 82346, 82351, 82356, 82361, 82366, + 82371, 82376, 82381, 82386, 82391, 82396, 82401, 82406, 82411, 82416, + 82421, 82426, 82431, 82435, 82442, 82449, 82456, 82463, 82469, 82475, + 82482, 82489, 82496, 82503, 82510, 82517, 82524, 82531, 82538, 82544, + 82551, 82558, 82565, 82572, 82579, 82586, 82593, 82600, 82607, 82614, + 82621, 82630, 82639, 82648, 82657, 82666, 82675, 82684, 82693, 82701, + 82709, 82717, 82725, 82733, 82741, 82749, 82757, 82763, 82771, 0, 0, + 82779, 82786, 82792, 82798, 82804, 82810, 82816, 82822, 82828, 82834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 104911, 104918, 104925, 104933, 104940, 104947, 104954, 104961, - 104969, 104977, 104985, 104993, 105001, 105009, 105017, 105025, 105033, - 105041, 105049, 105057, 105065, 105073, 105081, 105089, 105097, 105105, - 105113, 105121, 105129, 105137, 105145, 105153, 105161, 105169, 105177, - 105185, 105193, 105201, 105209, 105217, 105225, 105233, 105241, 105249, - 105257, 105265, 105273, 105281, 105289, 105297, 105305, 105313, 105321, - 105329, 105337, 105345, 105353, 105361, 105369, 105377, 105385, 105393, - 105401, 105409, 105417, 105425, 105433, 105441, 105449, 105457, 105465, - 105473, 105481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105489, 105494, 105500, 105506, - 105512, 105518, 105524, 105530, 105536, 105542, 105547, 105554, 105560, - 105566, 105572, 105578, 105584, 105589, 105595, 105601, 105607, 105613, - 105619, 105625, 105631, 105637, 105643, 105649, 105654, 105660, 105668, - 105676, 105682, 105688, 105694, 105700, 105708, 105714, 105720, 105726, - 105732, 105738, 105744, 105749, 105755, 105763, 105771, 105777, 105783, - 105789, 105796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105802, 105807, - 105813, 105819, 105825, 105831, 105837, 105843, 105849, 105855, 105860, - 105867, 105873, 105879, 105885, 105891, 105897, 105902, 105908, 105914, - 105920, 105926, 105932, 105938, 105944, 105950, 105956, 105962, 105967, - 105973, 105981, 105989, 105995, 106001, 106007, 106013, 106021, 106027, - 106033, 106039, 106045, 106051, 106057, 106062, 106068, 106076, 106084, - 106090, 106096, 106102, 106109, 0, 0, 0, 0, 0, 0, 0, 106115, 106119, - 106123, 106128, 106133, 106139, 106144, 106150, 106157, 106163, 106169, - 106176, 106183, 106190, 106196, 106203, 106210, 106217, 106224, 106230, - 106237, 106244, 106250, 106257, 106263, 106270, 106276, 106282, 106288, - 106295, 106304, 106310, 106318, 106325, 106332, 106339, 106345, 106351, - 106357, 106363, 106369, 106376, 106385, 106392, 106399, 106406, 0, 0, 0, - 0, 0, 0, 0, 0, 106413, 106420, 106426, 106432, 106438, 106444, 106450, - 106456, 106462, 106468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82840, 82845, 82850, 82855, 82860, + 82865, 82870, 82875, 82880, 82885, 82890, 82895, 82900, 82905, 82910, + 82915, 82920, 82925, 82930, 82935, 82940, 82945, 82950, 0, 0, 0, 0, + 82955, 82959, 82963, 82967, 82971, 82975, 82979, 82983, 82987, 82991, + 82995, 82999, 83003, 83007, 83011, 83015, 83019, 83023, 83027, 83031, + 83035, 83039, 83043, 83047, 83051, 83055, 83059, 83063, 83067, 83071, + 83075, 83079, 83083, 83087, 83091, 83095, 83099, 83103, 83107, 83111, + 83115, 83119, 83123, 83127, 83131, 83135, 83139, 83143, 83147, 0, 0, 0, + 0, 83151, 83155, 83159, 83163, 83167, 83171, 83175, 83179, 83183, 83187, + 83191, 83195, 83199, 83203, 83207, 83211, 83215, 83219, 83223, 83227, + 83231, 83235, 83239, 83243, 83247, 83251, 83255, 83259, 83263, 83267, + 83271, 83275, 83279, 83283, 83287, 83291, 83295, 83299, 83303, 83307, + 83311, 83315, 83319, 83323, 83327, 83331, 83335, 83339, 83343, 83347, + 83351, 83355, 83359, 83363, 83367, 83371, 83375, 83379, 83383, 83387, + 83391, 83395, 83399, 83403, 83407, 83411, 83415, 83419, 83423, 83427, + 83431, 83435, 83439, 83443, 83447, 83451, 83455, 83459, 83463, 83467, + 83471, 83475, 83479, 83483, 83487, 83491, 83495, 83499, 83503, 83507, + 83511, 83515, 83519, 83523, 83527, 83531, 83535, 83539, 83543, 83547, + 83551, 83555, 83559, 83563, 83567, 83571, 83575, 83579, 83583, 83587, + 83591, 83595, 83599, 83603, 83607, 83611, 83615, 83619, 83623, 83627, + 83631, 83635, 83639, 83643, 83647, 83651, 83655, 83659, 83663, 83667, + 83671, 83675, 83679, 83683, 83687, 83691, 83695, 83699, 83703, 83707, + 83711, 83715, 83719, 83723, 83727, 83731, 83735, 83739, 83743, 83747, + 83751, 83755, 83759, 83763, 83767, 83771, 83775, 83779, 83783, 83787, + 83791, 83795, 83799, 83803, 83807, 83811, 83815, 83819, 83823, 83827, + 83831, 83835, 83839, 83843, 83847, 83851, 83855, 83859, 83863, 83867, + 83871, 83875, 83879, 83883, 83887, 83891, 83895, 83899, 83903, 83907, + 83911, 83915, 83919, 83923, 83927, 83931, 83935, 83939, 83943, 83947, + 83951, 83955, 83959, 83963, 83967, 83971, 83975, 83979, 83983, 83987, + 83991, 83995, 83999, 84003, 84007, 84011, 84015, 84019, 84023, 84027, + 84031, 84035, 84039, 84043, 84047, 84051, 84055, 84059, 84063, 84067, + 84071, 84075, 84079, 84083, 84087, 84091, 84095, 84099, 84103, 84107, + 84111, 84115, 84119, 84123, 84127, 84131, 84135, 84139, 84143, 84147, + 84151, 84155, 84159, 84163, 84167, 84171, 84175, 84179, 84183, 84187, + 84191, 84195, 84199, 84203, 84207, 84211, 84215, 84219, 84223, 84227, + 84231, 84235, 84239, 84243, 84247, 84251, 84255, 84259, 84263, 84267, + 84271, 84275, 84279, 84283, 84287, 84291, 84295, 84299, 84303, 84307, + 84311, 84315, 84319, 84323, 84327, 84331, 84335, 84339, 84343, 84347, + 84351, 84355, 84359, 84363, 84367, 84371, 84375, 84379, 84383, 84387, + 84391, 84395, 84399, 84403, 84407, 84411, 84415, 84419, 84423, 84427, + 84431, 84435, 84439, 84443, 84447, 84451, 84455, 84459, 84463, 84467, + 84471, 84475, 84479, 84483, 84487, 84491, 84495, 84499, 84503, 84507, + 84511, 84515, 84519, 84523, 84527, 84531, 84535, 84539, 84543, 84547, + 84551, 84555, 84559, 84563, 84567, 84571, 84575, 84579, 84583, 84587, + 84591, 84595, 84599, 84603, 84607, 84611, 0, 0, 84615, 84619, 84623, + 84627, 84631, 84635, 84639, 84643, 84647, 84651, 84655, 84659, 84663, + 84667, 84671, 84675, 84679, 84683, 84687, 84691, 84695, 84699, 84703, + 84707, 84711, 84715, 84719, 84723, 84727, 84731, 84735, 84739, 84743, + 84747, 84751, 84755, 84759, 84763, 84767, 84771, 84775, 84779, 84783, + 84787, 84791, 84795, 84799, 84803, 84807, 84811, 84815, 84819, 84823, + 84827, 84831, 84835, 84839, 84843, 84847, 84851, 84855, 84859, 84863, + 84867, 84871, 84875, 84879, 84883, 84887, 84891, 84895, 84899, 84903, + 84907, 84911, 84915, 84919, 84923, 84927, 84931, 84935, 84939, 84943, + 84947, 84951, 84955, 84959, 84963, 84967, 84971, 84975, 84979, 84983, + 84987, 84991, 84995, 84999, 85003, 85007, 85011, 85015, 85019, 85023, + 85027, 85031, 85035, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85039, + 85044, 85049, 85054, 85059, 85064, 85072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 85077, 85085, 85093, 85101, 85109, 0, 0, 0, 0, 0, 85117, 85124, + 85131, 85141, 85147, 85153, 85159, 85165, 85171, 85177, 85184, 85190, + 85196, 85202, 85211, 85220, 85232, 85244, 85250, 85256, 85262, 85269, + 85276, 85283, 85290, 85297, 0, 85304, 85311, 85318, 85326, 85333, 0, + 85340, 0, 85347, 85354, 0, 85361, 85369, 0, 85376, 85383, 85390, 85397, + 85404, 85411, 85418, 85425, 85432, 85439, 85444, 85451, 85458, 85464, + 85470, 85476, 85483, 85489, 85495, 85501, 85508, 85514, 85520, 85526, + 85533, 85539, 85545, 85551, 85558, 85564, 85570, 85576, 85583, 85589, + 85595, 85601, 85608, 85614, 85620, 85626, 85633, 85639, 85645, 85651, + 85658, 85664, 85670, 85676, 85683, 85689, 85695, 85701, 85708, 85714, + 85720, 85726, 85733, 85739, 85745, 85751, 85758, 85764, 85770, 85776, + 85782, 85788, 85794, 85800, 85806, 85812, 85818, 85824, 85830, 85836, + 85842, 85848, 85855, 85861, 85867, 85873, 85880, 85886, 85892, 85898, + 85905, 85911, 85917, 85923, 85930, 85938, 85946, 85952, 85958, 85964, + 85971, 85980, 85989, 85997, 86005, 86013, 86022, 86030, 86038, 86046, + 86055, 86062, 86069, 86080, 86091, 86095, 86099, 86105, 86111, 86117, + 86123, 86133, 86143, 86150, 86157, 86164, 86172, 86180, 86184, 86190, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86196, 86202, 86208, + 86214, 86221, 86226, 86231, 86237, 86243, 86249, 86255, 86264, 86270, + 86276, 86284, 86292, 86300, 86308, 86314, 86320, 86326, 86333, 86346, + 86360, 86371, 86382, 86394, 86406, 86418, 86430, 86441, 86452, 86464, + 86476, 86488, 86500, 86512, 86524, 86536, 86553, 86570, 86587, 86594, + 86601, 86608, 86616, 86628, 86639, 86650, 86663, 86674, 86683, 86691, + 86700, 86708, 86718, 86726, 86735, 86743, 86752, 86760, 86770, 86778, + 86787, 86795, 86805, 86813, 86821, 86829, 86837, 86844, 86853, 86861, + 86869, 86878, 86886, 86895, 86903, 86911, 86919, 86928, 86936, 86945, + 86953, 86961, 86969, 86977, 86986, 86994, 87003, 87011, 87020, 87028, + 87037, 87045, 87055, 87063, 87071, 87079, 87089, 87097, 87105, 87114, + 87122, 87131, 87140, 87148, 87158, 87166, 87175, 87183, 87192, 87200, + 87210, 87218, 87226, 87233, 87241, 87248, 87257, 87264, 87273, 87281, + 87290, 87298, 87308, 87316, 87325, 87333, 87343, 87351, 87359, 87366, + 87374, 87381, 87390, 87397, 87407, 87417, 87428, 87437, 87446, 87455, + 87464, 87473, 87483, 87495, 87507, 87518, 87530, 87543, 87554, 87563, + 87572, 87580, 87589, 87599, 87607, 87616, 87625, 87633, 87642, 87652, + 87660, 87669, 87678, 87686, 87695, 87705, 87713, 87723, 87731, 87741, + 87749, 87757, 87766, 87774, 87784, 87792, 87800, 87810, 87818, 87825, + 87832, 87841, 87850, 87858, 87867, 87877, 87885, 87896, 87904, 87912, + 87919, 87927, 87936, 87943, 87955, 87966, 87978, 87989, 88001, 88010, + 88018, 88027, 88035, 88044, 88053, 88061, 88070, 88078, 88087, 88095, + 88103, 88111, 88119, 88126, 88135, 88143, 88152, 88160, 88169, 88177, + 88185, 88194, 88202, 88211, 88219, 88228, 88236, 88244, 88252, 88261, + 88269, 88278, 88286, 88295, 88303, 88312, 88320, 88328, 88336, 88345, + 88353, 88362, 88371, 88379, 88388, 88396, 88405, 88413, 88422, 88430, + 88437, 88445, 88452, 88461, 88469, 88478, 88486, 88495, 88504, 88512, + 88522, 88530, 88537, 88545, 88552, 88560, 88572, 88585, 88594, 88604, + 88613, 88623, 88632, 88642, 88651, 88661, 88670, 88680, 88690, 88699, + 88708, 88717, 88727, 88735, 88744, 88754, 88764, 88774, 88784, 88792, + 88802, 88810, 88820, 88828, 88838, 88846, 88856, 88864, 88873, 88880, + 88890, 88898, 88908, 88916, 88926, 88934, 88944, 88952, 88961, 88969, + 88978, 88986, 88995, 89004, 89013, 89022, 89032, 89040, 89050, 89058, + 89068, 89076, 89086, 89094, 89104, 89112, 89121, 89128, 89138, 89146, + 89156, 89164, 89174, 89182, 89192, 89200, 89209, 89217, 89226, 89234, + 89243, 89252, 89261, 89270, 89279, 89287, 89296, 89304, 89313, 89322, + 89330, 89340, 89349, 89359, 89369, 89378, 89388, 89397, 89406, 89414, + 89422, 89427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89432, + 89443, 89454, 89465, 89475, 89486, 89497, 89507, 89518, 89528, 89538, + 89547, 89558, 89569, 89580, 89593, 89603, 89613, 89624, 89634, 89644, + 89654, 89664, 89674, 89684, 89694, 89705, 89716, 89727, 89737, 89747, + 89759, 89770, 89781, 89791, 89801, 89811, 89821, 89832, 89842, 89852, + 89864, 89874, 89884, 89896, 89907, 89918, 89928, 89938, 89948, 89958, + 89970, 89982, 89994, 90005, 90016, 90026, 90036, 90046, 90055, 90064, + 90074, 90084, 90095, 0, 0, 90105, 90116, 90127, 90137, 90147, 90159, + 90170, 90181, 90194, 90204, 90216, 90225, 90234, 90245, 90256, 90269, + 90280, 90293, 90303, 90315, 90325, 90337, 90349, 90362, 90372, 90382, + 90392, 90403, 90413, 90422, 90432, 90441, 90450, 90460, 90470, 90480, + 90490, 90500, 90510, 90521, 90531, 90542, 90552, 90563, 90574, 90584, + 90594, 90604, 90614, 90624, 90634, 90645, 90655, 90666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 106474, 106478, 106482, 106486, 106490, 106494, 106498, - 106502, 106506, 106510, 106515, 106520, 106525, 106530, 106535, 106540, - 106545, 106550, 106555, 106561, 106567, 106573, 106580, 106587, 106594, - 106601, 106608, 106615, 106621, 106627, 106633, 0, 106639, 106645, - 106652, 106658, 106665, 106671, 106677, 106684, 106690, 106696, 106702, - 106708, 106714, 106720, 106726, 106732, 106739, 106750, 106756, 106762, - 106770, 106776, 106782, 106789, 106800, 106806, 106812, 106818, 106825, - 106836, 106841, 106846, 106851, 106856, 106861, 106867, 106873, 106879, - 106886, 106893, 0, 0, 0, 0, 0, 0, 0, 0, 106899, 106904, 106909, 106914, - 106919, 106924, 106929, 106934, 106939, 106944, 106949, 106954, 106959, - 106964, 106969, 106974, 106979, 106984, 106989, 106994, 106999, 107004, - 107010, 107015, 107022, 107027, 107034, 107040, 107046, 107052, 107058, - 107065, 107071, 107077, 107081, 107086, 107091, 107097, 107105, 107116, - 107125, 107135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90677, 90692, 90707, 90713, 90719, 90725, + 90731, 90737, 90743, 90749, 90755, 90763, 90767, 90770, 0, 0, 90778, + 90781, 90784, 90787, 90790, 90793, 90796, 90799, 90802, 90805, 90808, + 90811, 90814, 90817, 90820, 90823, 90826, 90834, 90843, 90854, 90862, + 90870, 90879, 90888, 90899, 90911, 0, 0, 0, 0, 0, 0, 90921, 90926, 90931, + 90938, 90945, 90951, 90957, 90962, 90967, 90972, 90978, 90984, 90990, + 90996, 91002, 91009, 91016, 91026, 91036, 91046, 91055, 91066, 91075, + 91084, 91094, 91104, 91116, 91128, 91139, 91150, 91161, 91172, 91182, + 91192, 91202, 91212, 91223, 91234, 91238, 91243, 91252, 91261, 91265, + 91269, 91273, 91278, 91283, 91288, 91293, 91296, 91300, 0, 91305, 91308, + 91311, 91315, 91319, 91324, 91328, 91332, 91337, 91342, 91349, 91356, + 91359, 91362, 91365, 91368, 91371, 91375, 91379, 0, 91383, 91388, 91392, + 91396, 0, 0, 0, 0, 91401, 91406, 91413, 91418, 91423, 0, 91428, 91433, + 91439, 91444, 91450, 91455, 91461, 91466, 91472, 91477, 91483, 91489, + 91498, 91507, 91516, 91525, 91535, 91545, 91555, 91565, 91574, 91583, + 91592, 91602, 91607, 91612, 91618, 91624, 91630, 91637, 91645, 91653, + 91659, 91665, 91671, 91678, 91684, 91690, 91696, 91703, 91709, 91715, + 91721, 91728, 91733, 91738, 91743, 91749, 91755, 91761, 91767, 91774, + 91780, 91786, 91792, 91798, 91804, 91810, 91816, 91822, 91828, 91834, + 91840, 91847, 91853, 91859, 91865, 91872, 91878, 91884, 91890, 91897, + 91903, 91909, 91915, 91922, 91928, 91934, 91940, 91947, 91953, 91959, + 91965, 91972, 91978, 91984, 91990, 91997, 92003, 92009, 92015, 92022, + 92028, 92034, 92040, 92047, 92053, 92059, 92065, 92072, 92078, 92084, + 92090, 92097, 92103, 92109, 92115, 92122, 92127, 92132, 92137, 92143, + 92149, 92155, 92161, 92168, 92174, 92180, 92186, 92193, 92199, 92205, + 92212, 92219, 92224, 92229, 92234, 92240, 92252, 92264, 92276, 92288, + 92301, 92314, 92322, 0, 0, 92330, 0, 92338, 92342, 92346, 92349, 92353, + 92357, 92360, 92363, 92367, 92371, 92374, 92377, 92380, 92383, 92388, + 92391, 92395, 92398, 92401, 92404, 92407, 92410, 92413, 92416, 92419, + 92422, 92425, 92428, 92432, 92436, 92440, 92444, 92449, 92454, 92460, + 92466, 92472, 92477, 92483, 92489, 92495, 92500, 92506, 92512, 92517, + 92523, 92529, 92534, 92540, 92546, 92551, 92557, 92563, 92568, 92574, + 92580, 92586, 92592, 92598, 92602, 92607, 92611, 92616, 92620, 92625, + 92630, 92636, 92642, 92648, 92653, 92659, 92665, 92671, 92676, 92682, + 92688, 92693, 92699, 92705, 92710, 92716, 92722, 92727, 92733, 92739, + 92744, 92750, 92756, 92762, 92768, 92774, 92779, 92783, 92788, 92791, + 92796, 92801, 92807, 92812, 92817, 92821, 92826, 92831, 92836, 92841, + 92846, 92851, 92856, 92861, 92867, 92873, 92879, 92887, 92891, 92895, + 92899, 92903, 92907, 92911, 92916, 92921, 92926, 92931, 92935, 92940, + 92945, 92950, 92955, 92959, 92964, 92969, 92974, 92978, 92982, 92987, + 92992, 92997, 93002, 93006, 93011, 93016, 93021, 93026, 93030, 93035, + 93040, 93045, 93050, 93054, 93059, 93064, 93068, 93073, 93078, 93083, + 93088, 93093, 93098, 93105, 93112, 93116, 93121, 93126, 93131, 93136, + 93141, 93146, 93151, 93156, 93161, 93166, 93171, 93176, 93181, 93186, + 93191, 93196, 93201, 93206, 93211, 93216, 93221, 93226, 93231, 93236, + 93241, 93246, 93251, 93256, 93261, 0, 0, 0, 93266, 93270, 93275, 93279, + 93284, 93289, 0, 0, 93293, 93298, 93303, 93307, 93312, 93317, 0, 0, + 93322, 93327, 93331, 93336, 93341, 93346, 0, 0, 93351, 93356, 93361, 0, + 0, 0, 93365, 93369, 93373, 93377, 93380, 93384, 93388, 0, 93392, 93398, + 93401, 93405, 93408, 93412, 93416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93420, + 93426, 93432, 93438, 93444, 0, 0, 93448, 93454, 93460, 93466, 93472, + 93478, 93485, 93492, 93499, 93506, 93513, 93520, 0, 93527, 93534, 93541, + 93547, 93554, 93561, 93568, 93575, 93581, 93588, 93595, 93602, 93609, + 93615, 93622, 93629, 93636, 93643, 93649, 93656, 93663, 93670, 93677, + 93684, 93691, 93698, 0, 93705, 93711, 93718, 93725, 93732, 93739, 93745, + 93752, 93759, 93766, 93773, 93779, 93786, 93793, 93799, 93806, 93813, + 93820, 93827, 0, 93834, 93841, 0, 93848, 93855, 93862, 93869, 93876, + 93883, 93890, 93897, 93904, 93911, 93918, 93925, 93932, 93939, 93946, 0, + 0, 93952, 93957, 93962, 93967, 93972, 93977, 93982, 93987, 93992, 93997, + 94002, 94007, 94012, 94017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94022, 94029, + 94036, 94043, 94050, 94057, 94064, 94071, 94078, 94085, 94092, 94099, + 94106, 94113, 94120, 94127, 94134, 94141, 94148, 94155, 94163, 94171, + 94178, 94185, 94190, 94198, 94206, 94213, 94220, 94225, 94232, 94237, + 94242, 94249, 94254, 94259, 94264, 94272, 94277, 94282, 94289, 94294, + 94299, 94306, 94313, 94318, 94323, 94328, 94333, 94338, 94343, 94348, + 94353, 94358, 94365, 94370, 94377, 94382, 94387, 94392, 94397, 94402, + 94407, 94412, 94417, 94422, 94427, 94432, 94439, 94446, 94453, 94460, + 94466, 94471, 94478, 94483, 94488, 94497, 94504, 94513, 94520, 94525, + 94530, 94538, 94543, 94548, 94553, 94558, 94563, 94570, 94575, 94580, + 94585, 94590, 94595, 94602, 94609, 94616, 94623, 94630, 94637, 94644, + 94651, 94658, 94665, 94672, 94679, 94686, 94693, 94700, 94707, 94714, + 94721, 94728, 94735, 94742, 94749, 94756, 94763, 94770, 94777, 94784, + 94791, 0, 0, 0, 0, 0, 94798, 94806, 94814, 0, 0, 0, 0, 94819, 94823, + 94827, 94831, 94835, 94839, 94843, 94847, 94851, 94855, 94860, 94865, + 94870, 94875, 94880, 94885, 94890, 94895, 94900, 94906, 94912, 94918, + 94925, 94932, 94939, 94946, 94953, 94960, 94965, 94970, 94975, 94981, + 94987, 94993, 94999, 95005, 95011, 95017, 95023, 95029, 95035, 95041, + 95047, 95053, 95059, 0, 0, 0, 95065, 95073, 95081, 95089, 95097, 95105, + 95115, 95125, 95133, 95141, 95149, 95157, 95165, 95171, 95178, 95187, + 95195, 95203, 95212, 95221, 95230, 95240, 95251, 95261, 95272, 95281, + 95290, 95299, 95309, 95320, 95330, 95341, 95352, 95361, 95369, 95375, + 95381, 95387, 95393, 95401, 95409, 95415, 95422, 95432, 95439, 95446, + 95453, 95460, 95467, 95477, 95484, 95491, 95499, 95507, 95516, 95525, + 95534, 95543, 95552, 95559, 95567, 95576, 95585, 95589, 95596, 95601, + 95606, 95610, 95614, 95618, 95622, 95627, 95632, 95638, 95644, 95648, + 95654, 95658, 95662, 95666, 95670, 95674, 95678, 95684, 95688, 95693, + 95697, 95701, 0, 95704, 95709, 95714, 95719, 95724, 95731, 95736, 95741, + 95746, 95751, 95756, 95761, 95766, 0, 0, 0, 95769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95775, 95782, 95791, + 95800, 95807, 95814, 95821, 95828, 95835, 95842, 95848, 95855, 95862, + 95869, 95876, 95883, 95890, 95897, 95904, 95913, 95920, 95927, 95934, + 95941, 95948, 95955, 95962, 95969, 95978, 95985, 95992, 95999, 96006, + 96013, 96020, 96029, 96036, 96043, 96050, 96057, 96066, 96073, 96080, + 96087, 96095, 96104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107145, 107150, - 107155, 107160, 107165, 107170, 107175, 107180, 107185, 107190, 107195, - 107200, 107205, 107210, 107215, 107220, 107225, 107230, 107235, 107240, - 107245, 107250, 107255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107260, 107264, - 107268, 107272, 107276, 107280, 107283, 107287, 107290, 107294, 107297, - 107301, 107305, 107310, 107314, 107319, 107322, 107326, 107329, 107333, - 107336, 107340, 107344, 107348, 107352, 107356, 107360, 107364, 107368, - 107372, 107376, 107380, 107384, 107388, 107392, 107395, 107399, 107403, - 107407, 107410, 107413, 107417, 107421, 107425, 107428, 107431, 107434, - 107437, 107441, 107445, 107449, 107452, 107455, 107459, 107465, 107471, - 107477, 107482, 107489, 107493, 107498, 107502, 107507, 107512, 107518, - 107523, 107529, 107533, 107538, 107542, 107547, 107550, 107553, 107557, - 107562, 107568, 107573, 107579, 0, 0, 0, 0, 107584, 107587, 107590, - 107593, 107596, 107599, 107602, 107605, 107608, 107611, 107615, 107619, - 107623, 107627, 107631, 107635, 107639, 107643, 107647, 107652, 107656, - 107660, 107663, 107666, 107669, 107672, 107675, 107678, 107681, 107684, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107687, 107691, 107696, - 107701, 107706, 107710, 107715, 107719, 107724, 107728, 107733, 107737, - 107742, 107746, 107751, 107755, 107760, 107765, 107770, 107775, 107780, - 107785, 107790, 107795, 107800, 107805, 107810, 107815, 107820, 107825, - 107830, 107835, 107839, 107844, 107849, 107854, 107858, 107862, 107867, - 107872, 107877, 107881, 107885, 107889, 107893, 107898, 107903, 107908, - 107912, 107916, 107922, 107927, 107933, 107938, 107944, 107949, 107955, - 107960, 107966, 107971, 107976, 107981, 107986, 107990, 107995, 108001, - 108005, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108010, 0, 0, 108015, 108022, - 108029, 108036, 108043, 108050, 108057, 108064, 108071, 108078, 108085, - 108092, 108099, 108106, 108113, 108120, 108127, 108134, 108141, 108148, - 108155, 108162, 108169, 108176, 108183, 0, 0, 0, 0, 0, 0, 0, 108190, - 108197, 108203, 108209, 108215, 108221, 108227, 108233, 108239, 108245, - 0, 0, 0, 0, 0, 0, 108251, 108256, 108261, 108266, 108271, 108275, 108279, - 108283, 108288, 108293, 108298, 108303, 108308, 108313, 108318, 108323, - 108328, 108333, 108338, 108343, 108348, 108353, 108358, 108363, 108368, - 108373, 108378, 108383, 108388, 108393, 108398, 108403, 108408, 108413, - 108418, 108423, 108428, 108433, 108438, 108443, 108448, 108453, 108459, - 108464, 108470, 108475, 108481, 108486, 108492, 108498, 108502, 108507, - 108511, 0, 108515, 108520, 108524, 108528, 108532, 108536, 108540, - 108544, 108548, 108552, 108556, 108561, 108565, 108570, 108575, 108580, - 108586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108592, 108596, 108600, 108604, - 108608, 108612, 108616, 108621, 108626, 108631, 108636, 108641, 108646, - 108651, 108656, 108661, 108666, 108671, 108676, 108681, 108685, 108690, - 108695, 108700, 108704, 108708, 108713, 108718, 108723, 108727, 108731, - 108735, 108740, 108744, 108748, 108753, 108758, 108763, 108768, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 108773, 108778, 108783, 108788, 108792, 108797, 108801, - 108806, 108810, 108815, 108820, 108826, 108831, 108837, 108841, 108846, - 108850, 108855, 108859, 108864, 108869, 108874, 108879, 108884, 108889, - 108894, 108899, 108904, 108909, 108914, 108919, 108924, 108929, 108933, - 108938, 108943, 108948, 108952, 108956, 108961, 108966, 108971, 108975, - 108979, 108983, 108987, 108992, 108997, 109002, 109007, 109011, 109015, - 109021, 109026, 109032, 109037, 109043, 109049, 109056, 109062, 109069, - 109074, 109080, 109085, 109091, 109096, 109101, 109106, 109111, 109115, - 109119, 109124, 109129, 109133, 109138, 109143, 109148, 109156, 0, 0, - 109161, 109166, 109170, 109174, 109178, 109182, 109186, 109190, 109194, - 109198, 109202, 109206, 109211, 109215, 109220, 109226, 0, 109232, - 109237, 109242, 109247, 109252, 109257, 109262, 109267, 109272, 109277, - 109283, 109289, 109295, 109301, 109307, 109313, 109319, 109325, 109331, - 109338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109344, 109348, 109353, 109357, - 109361, 109365, 109370, 109374, 109379, 109383, 109388, 109393, 109398, - 109403, 109408, 109413, 109418, 109423, 0, 109428, 109433, 109438, - 109443, 109448, 109453, 109458, 109462, 109467, 109472, 109477, 109482, - 109486, 109490, 109495, 109500, 109505, 109510, 109514, 109518, 109522, - 109526, 109531, 109535, 109539, 109544, 109550, 109555, 109561, 109566, - 109571, 109577, 109582, 109588, 109593, 109598, 109603, 109608, 109612, - 109617, 109623, 109628, 109634, 109639, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96113, 96117, 96121, + 96126, 96131, 96136, 96141, 96145, 96150, 96155, 96160, 96165, 96170, + 96175, 96179, 96184, 96189, 96194, 96199, 96203, 96208, 96213, 96217, + 96222, 96227, 96232, 96237, 96242, 96247, 0, 0, 0, 96252, 96256, 96261, + 96266, 96270, 96275, 96279, 96284, 96289, 96294, 96299, 96304, 96308, + 96313, 96318, 96323, 96328, 96333, 96338, 96342, 96347, 96352, 96357, + 96362, 96367, 96372, 96376, 96380, 96385, 96390, 96395, 96400, 96405, + 96410, 96415, 96420, 96425, 96430, 96435, 96440, 96445, 96450, 96455, + 96460, 96465, 96470, 96475, 96480, 96485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 96490, 96496, 96501, 96506, 96511, 96516, 96521, 96526, + 96531, 96536, 96541, 96547, 96553, 96559, 96565, 96571, 96577, 96583, + 96589, 96595, 96602, 96609, 96616, 96624, 96632, 96640, 96648, 96656, 0, + 0, 0, 0, 96664, 96668, 96673, 96678, 96683, 96687, 96692, 96697, 96702, + 96707, 96711, 96715, 96720, 96725, 96730, 96735, 96739, 96744, 96749, + 96754, 96759, 96764, 96769, 96773, 96778, 96783, 96788, 96793, 96798, + 96803, 96808, 96813, 96818, 96823, 96828, 96834, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96840, 96845, 96852, 96859, 96864, 96869, 96874, 96879, 96884, 96889, + 96894, 96899, 96904, 96909, 96914, 96919, 96924, 96929, 96934, 96939, + 96944, 96949, 96954, 96959, 96964, 96969, 96974, 96979, 96984, 96989, 0, + 0, 0, 0, 0, 96996, 97002, 97008, 97014, 97020, 97025, 97031, 97037, + 97043, 97049, 97054, 97060, 97066, 97072, 97078, 97084, 97090, 97096, + 97102, 97108, 97113, 97119, 97125, 97131, 97137, 97143, 97148, 97154, + 97160, 97165, 97171, 97177, 97183, 97189, 97195, 97201, 97207, 97212, + 97218, 97225, 97232, 97239, 97246, 0, 0, 0, 0, 0, 97253, 97258, 97263, + 97268, 97273, 97278, 97283, 97288, 97293, 97298, 97303, 97308, 97313, + 97318, 97323, 97328, 97333, 97338, 97343, 97348, 97353, 97358, 97363, + 97368, 97373, 97378, 97383, 97387, 97391, 97395, 0, 97400, 97406, 97411, + 97416, 97421, 97426, 97432, 97438, 97444, 97450, 97456, 97462, 97468, + 97473, 97479, 97485, 97491, 97497, 97503, 97508, 97514, 97520, 97525, + 97531, 97536, 97542, 97548, 97553, 97559, 97565, 97570, 97576, 97581, + 97586, 97592, 97598, 97604, 0, 0, 0, 0, 97609, 97615, 97621, 97627, + 97633, 97639, 97645, 97651, 97657, 97664, 97669, 97674, 97680, 97686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 109644, 109648, 109652, 109656, 109660, 109664, 109669, - 0, 109674, 0, 109679, 109684, 109689, 109694, 0, 109699, 109704, 109709, - 109714, 109719, 109724, 109729, 109734, 109738, 109743, 109748, 109753, - 109757, 109761, 109766, 0, 109771, 109776, 109780, 109784, 109788, - 109792, 109797, 109801, 109805, 109810, 109815, 0, 0, 0, 0, 0, 0, 109820, - 109824, 109829, 109833, 109838, 109842, 109847, 109851, 109856, 109860, - 109865, 109869, 109874, 109879, 109884, 109889, 109894, 109899, 109904, - 109909, 109914, 109919, 109924, 109929, 109934, 109939, 109944, 109949, - 109954, 109959, 109963, 109968, 109973, 109978, 109982, 109986, 109991, - 109996, 110001, 110006, 110010, 110014, 110018, 110022, 110027, 110032, - 110036, 110040, 110045, 110051, 110056, 110062, 110067, 110073, 110078, - 110084, 110089, 110095, 110100, 0, 0, 0, 0, 0, 110105, 110110, 110114, - 110118, 110122, 110126, 110130, 110134, 110138, 110142, 0, 0, 0, 0, 0, 0, - 110146, 110153, 110158, 110163, 0, 110168, 110172, 110177, 110181, - 110186, 110190, 110195, 110200, 0, 0, 110205, 110210, 0, 0, 110215, - 110220, 110225, 110229, 110234, 110239, 110244, 110249, 110254, 110259, - 110264, 110269, 110274, 110279, 110284, 110289, 110294, 110299, 110303, - 110308, 110313, 110318, 0, 110322, 110326, 110331, 110336, 110341, - 110345, 110349, 0, 110353, 110357, 0, 110362, 110367, 110372, 110377, - 110381, 0, 110385, 110389, 110394, 110399, 110405, 110410, 110416, - 110421, 110427, 110433, 0, 0, 110440, 110446, 0, 0, 110452, 110458, - 110464, 0, 0, 110469, 0, 0, 0, 0, 0, 0, 110473, 0, 0, 0, 0, 0, 110480, - 110485, 110492, 110500, 110506, 110512, 110518, 0, 0, 110525, 110531, - 110536, 110541, 110546, 110551, 110556, 0, 0, 0, 110561, 110566, 110571, - 110576, 110582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110587, 110591, 110596, - 110600, 110605, 110609, 110614, 110619, 110625, 110630, 110636, 110640, - 110645, 110649, 110654, 110658, 110663, 110668, 110673, 110678, 110683, - 110688, 110693, 110698, 110703, 110708, 110713, 110718, 110723, 110728, - 110733, 110738, 110742, 110747, 110752, 110757, 110761, 110766, 110770, - 110775, 110780, 110785, 110789, 110794, 110798, 110802, 110807, 110811, - 110816, 110821, 110826, 110831, 110835, 110839, 110845, 110850, 110856, - 110861, 110867, 110873, 110880, 110886, 110893, 110898, 110904, 110909, - 110915, 110920, 110925, 110930, 110935, 110940, 110945, 110951, 110955, - 110959, 110963, 110968, 110972, 110978, 110983, 110988, 110992, 110996, - 111000, 111004, 111008, 111012, 111016, 111020, 0, 111024, 0, 111029, - 111034, 111039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111046, 111050, 111054, 111059, - 111063, 111068, 111072, 111077, 111082, 111088, 111093, 111099, 111103, - 111108, 111112, 111117, 111121, 111126, 111131, 111136, 111141, 111146, - 111151, 111156, 111161, 111166, 111171, 111176, 111181, 111186, 111191, - 111195, 111200, 111205, 111210, 111214, 111218, 111223, 111228, 111233, - 111237, 111241, 111245, 111249, 111254, 111259, 111264, 111268, 111272, - 111278, 111283, 111289, 111294, 111300, 111306, 111313, 111319, 111326, - 111331, 111338, 111344, 111349, 111356, 111362, 111367, 111372, 111377, - 111382, 111387, 111392, 111396, 111401, 0, 0, 0, 0, 0, 0, 0, 0, 111405, - 111410, 111414, 111418, 111422, 111426, 111430, 111434, 111438, 111442, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97692, 97698, 97704, + 97710, 97717, 97723, 97730, 97737, 97744, 97751, 97759, 97766, 97774, + 97780, 97786, 97792, 97798, 97804, 97810, 97816, 97822, 97828, 97834, + 97840, 97846, 97852, 97858, 97864, 97870, 97876, 97882, 97888, 97894, + 97900, 97906, 97912, 97918, 97924, 97930, 97936, 97942, 97948, 97954, + 97960, 97967, 97973, 97980, 97987, 97994, 98001, 98009, 98016, 98024, + 98030, 98036, 98042, 98048, 98054, 98060, 98066, 98072, 98078, 98084, + 98090, 98096, 98102, 98108, 98114, 98120, 98126, 98132, 98138, 98144, + 98150, 98156, 98162, 98168, 98174, 98180, 98186, 98192, 98197, 98202, + 98207, 98212, 98217, 98222, 98227, 98232, 98237, 98242, 98247, 98252, + 98257, 98262, 98267, 98272, 98277, 98282, 98287, 98292, 98297, 98302, + 98307, 98312, 98317, 98322, 98327, 98332, 98337, 98342, 98347, 98352, + 98357, 98362, 98367, 98372, 98377, 98382, 98387, 98392, 98397, 98402, + 98407, 98412, 98417, 98422, 98427, 98432, 98437, 98442, 98446, 98451, + 98456, 98461, 98466, 98470, 98474, 98479, 98484, 98489, 98494, 98499, + 98504, 98509, 98514, 98519, 98524, 98529, 98533, 98537, 98541, 98545, + 98549, 98553, 98557, 98562, 98567, 0, 0, 98572, 98577, 98581, 98585, + 98589, 98593, 98597, 98601, 98605, 98609, 0, 0, 0, 0, 0, 0, 98613, 98618, + 98624, 98630, 98636, 98642, 98648, 98654, 98659, 98665, 98670, 98676, + 98681, 98686, 98692, 98698, 98703, 98708, 98713, 98718, 98724, 98729, + 98735, 98740, 98746, 98751, 98757, 98763, 98769, 98775, 98781, 98786, + 98792, 98798, 98804, 98810, 0, 0, 0, 0, 98816, 98821, 98827, 98833, + 98839, 98845, 98851, 98857, 98862, 98868, 98873, 98879, 98884, 98889, + 98895, 98901, 98906, 98911, 98916, 98921, 98927, 98932, 98938, 98943, + 98949, 98954, 98960, 98966, 98972, 98978, 98984, 98989, 98995, 99001, + 99007, 99013, 0, 0, 0, 0, 99019, 99023, 99028, 99033, 99038, 99043, + 99048, 99053, 99058, 99062, 99067, 99072, 99077, 99082, 99086, 99091, + 99096, 99101, 99106, 99111, 99116, 99120, 99125, 99129, 99134, 99139, + 99144, 99149, 99154, 99159, 99164, 99169, 99173, 99178, 99183, 99188, + 99193, 99198, 99203, 99208, 0, 0, 0, 0, 0, 0, 0, 0, 99213, 99220, 99227, + 99234, 99241, 99248, 99255, 99262, 99269, 99276, 99283, 99290, 99297, + 99304, 99311, 99318, 99325, 99332, 99339, 99346, 99353, 99360, 99367, + 99374, 99381, 99388, 99395, 99402, 99409, 99416, 99423, 99430, 99437, + 99444, 99451, 99458, 99465, 99472, 99479, 99486, 99493, 99500, 99507, + 99514, 99521, 99528, 99535, 99542, 99549, 99556, 99563, 99570, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 99577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111446, 111450, 111455, 111459, - 111464, 111468, 111473, 111478, 111484, 111489, 111495, 111499, 111504, - 111508, 111513, 111517, 111522, 111527, 111532, 111537, 111542, 111547, - 111552, 111557, 111562, 111567, 111572, 111577, 111582, 111587, 111591, - 111596, 111601, 111606, 111610, 111614, 111619, 111624, 111629, 111633, - 111637, 111641, 111645, 111650, 111655, 111660, 111664, 111668, 111674, - 111679, 111685, 111690, 111696, 111702, 0, 0, 111709, 111714, 111720, - 111725, 111731, 111736, 111741, 111746, 111751, 111756, 111761, 111765, - 111770, 111776, 111781, 111787, 111793, 111799, 111807, 111820, 111833, - 111846, 111860, 111875, 111883, 111894, 111903, 111913, 111923, 111933, - 111944, 111956, 111969, 111977, 111985, 111994, 112000, 112007, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 112015, 112019, 112024, 112028, 112033, 112037, - 112042, 112047, 112053, 112058, 112064, 112068, 112073, 112077, 112082, - 112086, 112091, 112096, 112101, 112106, 112111, 112116, 112121, 112126, - 112131, 112136, 112141, 112146, 112151, 112156, 112160, 112165, 112170, - 112175, 112179, 112183, 112188, 112193, 112198, 112202, 112206, 112210, - 112214, 112219, 112224, 112229, 112233, 112237, 112242, 112248, 112253, - 112259, 112264, 112270, 112276, 112283, 112289, 112296, 112301, 112307, - 112312, 112318, 112323, 112328, 112333, 112338, 112342, 112347, 112352, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112357, 112362, 112366, 112370, 112374, - 112378, 112382, 112386, 112390, 112394, 0, 0, 0, 0, 0, 0, 112398, 112404, - 112409, 112416, 112424, 112431, 112439, 112448, 112453, 112462, 112467, - 112475, 112484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 112494, 112498, 112503, 112507, 112512, 112516, 112521, 112525, 112530, - 112534, 112539, 112543, 112548, 112553, 112558, 112563, 112568, 112573, - 112578, 112583, 112588, 112593, 112598, 112603, 112608, 112613, 112617, - 112622, 112627, 112632, 112636, 112640, 112645, 112650, 112655, 112659, - 112663, 112667, 112671, 112676, 112681, 112685, 112689, 112694, 112699, - 112704, 112710, 112715, 112721, 112726, 112732, 112737, 112743, 112748, - 112754, 112759, 112764, 0, 0, 0, 0, 0, 0, 0, 112771, 112776, 112780, - 112784, 112788, 112792, 112796, 112800, 112804, 112808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 112812, 112816, 112821, 112826, 112830, 112834, 112840, 112844, 112849, - 112854, 112858, 112863, 112868, 112873, 112877, 112881, 112885, 112890, - 112894, 112898, 112903, 112908, 112913, 112920, 112925, 112930, 112935, - 0, 0, 112942, 112949, 112956, 112965, 112970, 112976, 112981, 112987, - 112992, 112998, 113003, 113009, 113014, 113020, 113026, 0, 0, 0, 0, - 113031, 113036, 113040, 113044, 113048, 113052, 113056, 113060, 113064, - 113068, 113072, 113077, 113082, 113088, 113093, 113098, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99584, 99589, 99594, 99599, 99604, 99609, + 99614, 99619, 99624, 99629, 99634, 99639, 99644, 99649, 99654, 99659, + 99664, 99669, 99674, 99679, 99684, 99689, 99694, 99699, 99704, 99709, + 99714, 99719, 99724, 99729, 99734, 99739, 99744, 99749, 99754, 99759, + 99764, 99769, 99774, 99779, 99784, 99789, 99794, 99799, 99804, 99809, + 99814, 99819, 99824, 99829, 99834, 99839, 99844, 99849, 99854, 99859, + 99864, 99869, 99874, 99879, 99884, 99889, 99894, 99899, 99904, 99909, + 99914, 99919, 99924, 99929, 99934, 99939, 99944, 99949, 99954, 99959, + 99964, 99969, 99974, 99979, 99984, 99989, 99994, 99999, 100004, 100009, + 100014, 100019, 100024, 100029, 100034, 100039, 100044, 100049, 100054, + 100059, 100064, 100069, 100074, 100079, 100084, 100089, 100094, 100099, + 100104, 100109, 100114, 100119, 100124, 100129, 100134, 100139, 100144, + 100149, 100154, 100159, 100164, 100169, 100174, 100179, 100184, 100189, + 100194, 100199, 100204, 100209, 100214, 100219, 100224, 100229, 100234, + 100239, 100244, 100249, 100254, 100259, 100264, 100269, 100274, 100279, + 100284, 100289, 100294, 100299, 100304, 100309, 100314, 100319, 100324, + 100329, 100334, 100339, 100344, 100349, 100354, 100359, 100364, 100369, + 100374, 100379, 100384, 100389, 100394, 100399, 100404, 100409, 100414, + 100419, 100424, 100429, 100434, 100439, 100444, 100449, 100454, 100459, + 100464, 100469, 100474, 100479, 100484, 100489, 100494, 100499, 100504, + 100509, 100514, 100519, 100524, 100529, 100534, 100539, 100544, 100549, + 100554, 100559, 100564, 100569, 100574, 100579, 100584, 100589, 100594, + 100599, 100604, 100609, 100614, 100619, 100624, 100629, 100634, 100639, + 100644, 100649, 100654, 100659, 100664, 100669, 100674, 100679, 100684, + 100689, 100694, 100699, 100704, 100709, 100714, 100719, 100724, 100729, + 100734, 100739, 100744, 100749, 100754, 100759, 100764, 100769, 100774, + 100779, 100784, 100789, 100794, 100799, 100804, 100809, 100814, 100819, + 100824, 100829, 100834, 100839, 100844, 100849, 100854, 100859, 100864, + 100869, 100874, 100879, 100884, 100889, 100894, 100899, 100904, 100909, + 100914, 100919, 100924, 100929, 100934, 100939, 100944, 100949, 100954, + 100959, 100964, 100969, 100974, 100979, 100984, 100989, 100994, 100999, + 101004, 101009, 101014, 101019, 101024, 101029, 101034, 101039, 101044, + 101049, 101054, 101059, 101064, 101069, 101074, 101079, 101084, 101089, + 101094, 101099, 101104, 101109, 101114, 101119, 101124, 101129, 101134, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 101139, 101145, 101152, 101159, 101165, + 101172, 101179, 101186, 101193, 101199, 101206, 101213, 101220, 101227, + 101234, 101241, 101248, 101255, 101262, 101269, 101276, 101283, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 101290, 101295, 101300, 101305, 101310, 101315, + 101320, 101325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113103, 113107, 113112, 113116, 113121, - 113125, 113130, 113134, 113139, 113143, 113148, 113152, 113157, 113162, - 113167, 113172, 113177, 113182, 113187, 113192, 113197, 113202, 113207, - 113212, 113217, 113222, 113226, 113231, 113236, 113241, 113245, 113249, - 113254, 113259, 113264, 113268, 113272, 113276, 113280, 113285, 113290, - 113295, 113299, 113303, 113308, 113314, 113319, 113325, 113330, 113336, - 113342, 113349, 113354, 113360, 113365, 113371, 113376, 113381, 113386, - 113391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 113396, 113404, 113411, 113419, 113427, 113434, 113442, - 113450, 113458, 113465, 113472, 113480, 113488, 113496, 113504, 113512, - 113520, 113528, 113536, 113544, 113552, 113560, 113568, 113576, 113584, - 113592, 113600, 113608, 113616, 113624, 113632, 113640, 113648, 113656, - 113663, 113671, 113679, 113686, 113694, 113702, 113710, 113717, 113724, - 113732, 113740, 113748, 113756, 113764, 113772, 113780, 113788, 113796, - 113804, 113812, 113820, 113828, 113836, 113844, 113852, 113860, 113868, - 113876, 113884, 113892, 113900, 113907, 113913, 113919, 113925, 113931, - 113937, 113943, 113949, 113955, 113961, 113968, 113975, 113982, 113989, - 113996, 114003, 114010, 114017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 114024, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114030, 114034, 114039, 114043, 114048, - 114052, 114057, 114062, 0, 0, 114068, 114072, 114077, 114081, 114086, - 114090, 114095, 114100, 114105, 114110, 114115, 114120, 114125, 114130, - 114135, 114140, 114145, 114150, 114155, 114160, 114164, 114169, 114174, - 114179, 114183, 114187, 114192, 114197, 114202, 114206, 114210, 114214, - 114218, 114223, 114228, 114233, 114237, 114241, 114246, 114251, 114257, - 114262, 114268, 114273, 114279, 114285, 0, 0, 114292, 114297, 114303, - 114308, 114314, 114319, 114324, 114329, 114334, 114339, 114343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 114350, 114355, 114361, 114368, 114374, 114380, 114387, 114393, 114400, - 114407, 114415, 114422, 114427, 114433, 114439, 114445, 114451, 114457, - 114463, 114469, 114475, 114481, 114487, 114493, 114499, 114505, 114510, - 114516, 114522, 114528, 114533, 114538, 114544, 114550, 114556, 114561, - 114567, 114573, 114579, 114585, 114591, 114597, 114603, 114608, 114613, - 114618, 114624, 114630, 114636, 114641, 114646, 114652, 114658, 114664, - 114670, 114679, 114688, 114694, 114700, 114707, 114714, 114721, 114728, - 114736, 114743, 114751, 114757, 114763, 114770, 114777, 114786, 114796, - 0, 0, 0, 0, 0, 0, 0, 0, 114801, 114805, 114810, 114816, 114821, 114826, - 114831, 114837, 114843, 114849, 114855, 114861, 114867, 114871, 114876, - 114881, 114886, 114891, 114896, 114901, 114906, 114911, 114916, 114921, - 114926, 114931, 114936, 114941, 114945, 114950, 114955, 114960, 114964, - 114968, 114973, 114978, 114983, 114987, 114992, 114997, 115002, 115007, - 115012, 115017, 115021, 115025, 115029, 115034, 115039, 115044, 115048, - 115052, 115057, 115062, 115067, 115073, 115079, 115086, 115092, 115099, - 115106, 115113, 115120, 115127, 115134, 115141, 115147, 115153, 115160, - 115167, 115174, 115179, 115184, 115189, 115193, 115198, 115203, 115209, - 115214, 115230, 115244, 115255, 115261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115267, 115275, - 115283, 115291, 115299, 115308, 115317, 115326, 115335, 115343, 115352, - 115361, 115369, 115378, 115387, 115395, 115404, 115412, 115421, 115429, - 115438, 115447, 115455, 115463, 115471, 115479, 115487, 115496, 115505, - 115515, 115525, 115535, 115545, 115555, 115564, 115574, 115584, 115594, - 115605, 115615, 115627, 115639, 115650, 115664, 115675, 115685, 115697, - 115708, 115718, 115730, 115742, 115753, 115764, 115774, 115784, 115796, - 115807, 0, 0, 0, 0, 0, 0, 0, 115819, 115823, 115828, 115832, 115837, - 115841, 115846, 115851, 115857, 0, 115862, 115866, 115871, 115875, - 115880, 115884, 115889, 115894, 115899, 115904, 115909, 115914, 115919, - 115924, 115929, 115934, 115939, 115944, 115949, 115954, 115958, 115963, - 115968, 115973, 115977, 115981, 115986, 115991, 115996, 116000, 116004, - 116008, 116012, 116017, 116022, 116027, 116031, 116035, 116041, 116046, - 116052, 116057, 116063, 116069, 116076, 0, 116082, 116087, 116093, - 116098, 116104, 116109, 116114, 116119, 116124, 116129, 116133, 116138, - 116144, 116150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116156, 116161, 116165, - 116169, 116173, 116177, 116181, 116185, 116189, 116193, 116197, 116201, - 116205, 116209, 116213, 116217, 116221, 116225, 116229, 116233, 116238, - 116243, 116248, 116253, 116258, 116263, 116268, 116273, 116278, 0, 0, 0, - 116285, 116290, 116295, 116299, 116304, 116309, 116314, 116319, 116324, - 116329, 116334, 116338, 116343, 116348, 116352, 116356, 116361, 116366, - 116370, 116375, 116380, 116385, 116390, 116395, 116400, 116405, 116409, - 116413, 116417, 116422, 116426, 116430, 0, 0, 116434, 116440, 116447, - 116454, 116461, 116468, 116475, 116482, 116489, 116495, 116502, 116509, - 116515, 116521, 116528, 116535, 116541, 116548, 116555, 116562, 116569, - 116576, 0, 116583, 116589, 116595, 116601, 116608, 116614, 116620, - 116626, 116632, 116637, 116642, 116647, 116652, 116657, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101330, 101334, 101338, 101342, + 101346, 101350, 0, 0, 101355, 0, 101360, 101364, 101369, 101374, 101379, + 101384, 101388, 101393, 101398, 101403, 101408, 101412, 101417, 101422, + 101427, 101432, 101436, 101441, 101446, 101451, 101456, 101460, 101465, + 101470, 101475, 101480, 101484, 101489, 101494, 101499, 101504, 101508, + 101513, 101518, 101523, 101528, 101532, 101537, 101542, 101546, 101551, + 101556, 101561, 101566, 0, 101571, 101576, 0, 0, 0, 101581, 0, 0, 101586, + 101591, 101598, 101605, 101612, 101619, 101626, 101633, 101640, 101647, + 101654, 101661, 101668, 101675, 101682, 101689, 101696, 101703, 101710, + 101717, 101724, 101731, 101738, 0, 101745, 101752, 101758, 101764, + 101770, 101777, 101784, 101792, 101799, 101807, 101812, 101817, 101822, + 101827, 101832, 101837, 101842, 101847, 101852, 101857, 101862, 101867, + 101872, 101878, 101883, 101888, 101893, 101898, 101903, 101908, 101913, + 101918, 101923, 101929, 101935, 101939, 101943, 101947, 101951, 101955, + 101960, 101965, 101971, 101976, 101982, 101987, 101992, 101997, 102003, + 102008, 102013, 102018, 102023, 102028, 102034, 102039, 102045, 102050, + 102056, 102061, 102067, 102072, 102078, 102083, 102088, 102093, 102098, + 102103, 102108, 102113, 102119, 102124, 0, 0, 0, 0, 0, 0, 0, 0, 102129, + 102133, 102137, 102141, 102145, 102151, 102155, 102160, 102165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102171, + 102176, 102181, 102186, 102191, 102196, 102201, 102206, 102211, 102216, + 102221, 102226, 102231, 102236, 102241, 102246, 102251, 102256, 102261, + 0, 102266, 102271, 0, 0, 0, 0, 0, 102276, 102280, 102284, 102289, 102294, + 102300, 102305, 102310, 102315, 102320, 102325, 102330, 102335, 102340, + 102345, 102350, 102355, 102360, 102365, 102370, 102375, 102380, 102385, + 102390, 102395, 102400, 102405, 102410, 102414, 102419, 102424, 102430, + 102434, 0, 0, 0, 102438, 102444, 102448, 102453, 102458, 102463, 102467, + 102472, 102476, 102481, 102486, 102490, 102495, 102500, 102504, 102508, + 102513, 102518, 102522, 102527, 102532, 102537, 102542, 102547, 102552, + 102557, 102562, 0, 0, 0, 0, 0, 102567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116662, 116667, - 116673, 116678, 116684, 116689, 116695, 0, 116700, 116706, 0, 116711, - 116717, 116722, 116728, 116734, 116740, 116746, 116752, 116758, 116764, - 116770, 116776, 116782, 116788, 116794, 116800, 116806, 116811, 116817, - 116823, 116829, 116834, 116839, 116845, 116851, 116857, 116862, 116867, - 116872, 116877, 116883, 116889, 116895, 116900, 116905, 116911, 116917, - 116923, 116929, 116936, 116942, 116949, 116955, 116962, 0, 0, 0, 116969, - 0, 116975, 116982, 0, 116988, 116995, 117001, 117007, 117013, 117019, - 117025, 117030, 117035, 0, 0, 0, 0, 0, 0, 0, 0, 117040, 117046, 117051, - 117056, 117061, 117066, 117071, 117076, 117081, 117086, 0, 0, 0, 0, 0, 0, - 117091, 117096, 117102, 117107, 117113, 117118, 0, 117124, 117130, 0, - 117136, 117142, 117148, 117153, 117159, 117165, 117171, 117176, 117181, - 117187, 117192, 117198, 117203, 117209, 117215, 117221, 117227, 117232, - 117238, 117244, 117250, 117256, 117262, 117268, 117274, 117280, 117286, - 117292, 117297, 117303, 117308, 117313, 117318, 117325, 117331, 117338, - 117344, 0, 117351, 117358, 0, 117365, 117372, 117379, 117385, 117391, - 117396, 0, 0, 0, 0, 0, 0, 0, 117401, 117407, 117412, 117417, 117422, - 117427, 117432, 117437, 117442, 117447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 102572, 102577, 102582, 102587, 102592, 102597, 102603, + 102609, 102615, 102620, 102625, 102630, 102636, 102642, 102648, 102653, + 102659, 102664, 102670, 102676, 102681, 102687, 102693, 102698, 102704, + 102709, 102715, 102721, 102727, 102732, 102738, 102744, 102750, 102755, + 102760, 102765, 102770, 102775, 102781, 102787, 102792, 102797, 102802, + 102808, 102813, 102818, 102824, 102830, 102835, 102842, 102848, 102853, + 102859, 102864, 102870, 102875, 0, 0, 0, 0, 102881, 102890, 102898, + 102905, 102912, 102917, 102922, 102927, 102932, 102937, 102942, 102947, + 102952, 102957, 102963, 102969, 102975, 102981, 102987, 102993, 0, 0, + 102999, 103006, 103013, 103020, 103028, 103036, 103044, 103052, 103060, + 103068, 103074, 103080, 103086, 103093, 103100, 103107, 103114, 103121, + 103128, 103135, 103142, 103149, 103156, 103163, 103170, 103177, 103184, + 103191, 103199, 103207, 103215, 103224, 103233, 103242, 103251, 103260, + 103269, 103277, 103285, 103293, 103302, 103311, 103320, 103329, 103338, + 103347, 103356, 103360, 103365, 103370, 0, 103376, 103381, 0, 0, 0, 0, 0, + 103386, 103392, 103399, 103404, 103409, 103413, 103418, 103423, 0, + 103428, 103433, 103438, 0, 103443, 103448, 103453, 103458, 103463, + 103468, 103473, 103477, 103482, 103487, 103492, 103496, 103500, 103505, + 103510, 103515, 103519, 103523, 103527, 103531, 103536, 103541, 103546, + 103550, 103555, 103559, 103564, 103569, 103574, 0, 0, 103579, 103585, + 103590, 0, 0, 0, 0, 103595, 103599, 103603, 103607, 103611, 103615, + 103620, 103625, 103631, 103636, 0, 0, 0, 0, 0, 0, 0, 103643, 103649, + 103656, 103662, 103669, 103675, 103681, 103687, 103694, 0, 0, 0, 0, 0, 0, + 0, 103700, 103708, 103716, 103724, 103732, 103740, 103748, 103756, + 103764, 103772, 103780, 103788, 103796, 103804, 103812, 103820, 103828, + 103836, 103844, 103852, 103860, 103868, 103876, 103884, 103892, 103900, + 103908, 103916, 103924, 103932, 103939, 103947, 103955, 103962, 103969, + 103976, 103983, 103990, 103997, 104004, 104011, 104018, 104025, 104032, + 104039, 104046, 104053, 104060, 104067, 104074, 104081, 104088, 104095, + 104102, 104109, 104116, 104123, 104130, 104137, 104144, 104151, 104158, + 104164, 104171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104178, 104183, 104188, 104193, + 104198, 104203, 104208, 104213, 104218, 104223, 104228, 104233, 104238, + 104243, 104248, 104253, 104258, 104263, 104268, 104273, 104278, 104283, + 104288, 104293, 104298, 104303, 104308, 104313, 104318, 104323, 104328, + 104333, 104338, 104343, 104348, 104353, 104358, 104363, 104369, 0, 0, 0, + 0, 104375, 104379, 104383, 104388, 104393, 104399, 104405, 104411, + 104421, 104430, 104436, 104443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104451, + 104455, 104460, 104465, 104470, 104475, 104480, 104485, 104490, 104494, + 104499, 104503, 104508, 104512, 104517, 104521, 104526, 104531, 104536, + 104541, 104546, 104551, 104556, 104561, 104566, 104571, 104576, 104581, + 104586, 104591, 104596, 104601, 104606, 104611, 104616, 104621, 104626, + 104631, 104636, 104641, 104646, 104651, 104656, 104661, 104666, 104671, + 104676, 104681, 104686, 104691, 104696, 104701, 104706, 104711, 0, 0, 0, + 104716, 104721, 104731, 104740, 104750, 104760, 104771, 104782, 104789, + 104796, 104803, 104810, 104817, 104824, 104831, 104838, 104845, 104852, + 104859, 104866, 104873, 104880, 104887, 104894, 104901, 104908, 104915, + 104922, 104929, 0, 0, 104936, 104942, 104948, 104954, 104960, 104967, + 104974, 104982, 104989, 104996, 105003, 105010, 105017, 105024, 105031, + 105038, 105045, 105052, 105059, 105066, 105073, 105080, 105087, 105094, + 105101, 105108, 105115, 0, 0, 0, 0, 0, 105122, 105128, 105134, 105140, + 105146, 105153, 105160, 105168, 105175, 105182, 105189, 105196, 105203, + 105210, 105217, 105224, 105231, 105238, 105245, 105252, 105259, 105266, + 105273, 105280, 105287, 105294, 0, 0, 0, 0, 0, 0, 0, 105301, 105308, + 105316, 105327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105338, 105344, + 105350, 105356, 105362, 105369, 105376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105384, + 105391, 105398, 105406, 105413, 105420, 105427, 105434, 105442, 105450, + 105458, 105466, 105474, 105482, 105490, 105498, 105506, 105514, 105522, + 105530, 105538, 105546, 105554, 105562, 105570, 105578, 105586, 105594, + 105602, 105610, 105618, 105626, 105634, 105642, 105650, 105658, 105666, + 105674, 105682, 105690, 105698, 105706, 105714, 105722, 105730, 105738, + 105746, 105754, 105762, 105770, 105778, 105786, 105794, 105802, 105810, + 105818, 105826, 105834, 105842, 105850, 105858, 105866, 105874, 105882, + 105890, 105898, 105906, 105914, 105922, 105930, 105938, 105946, 105954, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 105962, 105967, 105973, 105979, 105985, 105991, + 105997, 106003, 106009, 106015, 106020, 106027, 106033, 106039, 106045, + 106051, 106057, 106062, 106068, 106074, 106080, 106086, 106092, 106098, + 106104, 106110, 106116, 106122, 106127, 106133, 106141, 106149, 106155, + 106161, 106167, 106173, 106181, 106187, 106193, 106199, 106205, 106211, + 106217, 106222, 106228, 106236, 106244, 106250, 106256, 106262, 106269, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106275, 106280, 106286, 106292, + 106298, 106304, 106310, 106316, 106322, 106328, 106333, 106340, 106346, + 106352, 106358, 106364, 106370, 106375, 106381, 106387, 106393, 106399, + 106405, 106411, 106417, 106423, 106429, 106435, 106440, 106446, 106454, + 106462, 106468, 106474, 106480, 106486, 106494, 106500, 106506, 106512, + 106518, 106524, 106530, 106535, 106541, 106549, 106557, 106563, 106569, + 106575, 106582, 0, 0, 0, 0, 0, 0, 0, 106588, 106592, 106596, 106601, + 106606, 106612, 106617, 106623, 106630, 106636, 106642, 106649, 106656, + 106663, 106669, 106676, 106683, 106690, 106697, 106703, 106710, 106717, + 106723, 106730, 106736, 106743, 106749, 106755, 106761, 106768, 106777, + 106783, 106791, 106798, 106805, 106812, 106818, 106824, 106830, 106836, + 106842, 106849, 106858, 106865, 106872, 106879, 0, 0, 0, 0, 0, 0, 0, 0, + 106886, 106893, 106899, 106905, 106911, 106917, 106923, 106929, 106935, + 106941, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117452, 117456, 117461, 117466, 117470, 117475, 117479, 117483, - 117488, 117492, 117497, 117502, 117507, 117511, 117515, 117519, 117524, - 117528, 117532, 117536, 117541, 117546, 117551, 117556, 117560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117567, - 117572, 117577, 117582, 117587, 117592, 117597, 117602, 117607, 117612, - 117617, 117622, 117627, 117632, 117637, 117642, 117647, 117652, 117657, - 117662, 117667, 117675, 117679, 117683, 117687, 117691, 117695, 117699, - 117703, 117707, 117711, 117715, 117719, 117723, 117727, 117731, 117735, - 117741, 117747, 117751, 117757, 117763, 117768, 117772, 117777, 117781, - 117785, 117791, 117797, 117801, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117805, 117813, 117816, 117821, 117827, 117835, 117840, 117846, 117854, - 117860, 117866, 117870, 117874, 117881, 117890, 117897, 117906, 117912, - 117921, 117928, 117935, 117942, 117952, 117958, 117962, 117969, 117978, - 117988, 117995, 118002, 118006, 118010, 118017, 118027, 118031, 118038, - 118045, 118052, 118058, 118065, 118072, 118079, 118086, 118090, 118094, - 118098, 118105, 118109, 118116, 118123, 118137, 118146, 118150, 118154, - 118158, 118165, 118169, 118173, 118177, 118185, 118193, 118212, 118222, - 118242, 118246, 118250, 118254, 118258, 118262, 118266, 118270, 118277, - 118281, 118284, 118288, 118292, 118298, 118305, 118314, 118318, 118327, - 118336, 118344, 118348, 118355, 118359, 118363, 118367, 118371, 118382, - 118391, 118400, 118409, 118418, 118430, 118439, 118448, 118457, 118465, - 118474, 118486, 118495, 118503, 118512, 118524, 118533, 118542, 118554, - 118563, 118572, 118584, 118593, 118597, 118601, 118605, 118609, 118613, - 118617, 118621, 118628, 118632, 118636, 118647, 118651, 118655, 118662, - 118668, 118674, 118678, 118685, 118689, 118693, 118697, 118701, 118705, - 118709, 118715, 118723, 118727, 118731, 118734, 118741, 118753, 118757, - 118769, 118776, 118783, 118790, 118797, 118803, 118807, 118811, 118815, - 118819, 118826, 118835, 118842, 118850, 118858, 118864, 118868, 118872, - 118876, 118880, 118886, 118895, 118907, 118914, 118921, 118930, 118941, - 118947, 118956, 118965, 118972, 118981, 118988, 118994, 119004, 119011, - 119018, 119025, 119032, 119036, 119042, 119046, 119057, 119065, 119074, - 119086, 119093, 119100, 119110, 119117, 119126, 119133, 119142, 119149, - 119156, 119166, 119173, 119180, 119189, 119196, 119208, 119217, 119224, - 119231, 119238, 119247, 119257, 119270, 119277, 119286, 119296, 119303, - 119312, 119325, 119332, 119339, 119346, 119356, 119366, 119372, 119382, - 119389, 119396, 119406, 119412, 119419, 119426, 119433, 119443, 119450, - 119457, 119464, 119470, 119477, 119487, 119494, 119498, 119506, 119510, - 119522, 119526, 119540, 119544, 119548, 119552, 119556, 119562, 119569, - 119577, 119581, 119585, 119589, 119593, 119600, 119604, 119610, 119616, - 119624, 119628, 119635, 119643, 119647, 119651, 119657, 119661, 119670, - 119679, 119686, 119696, 119702, 119706, 119710, 119718, 119725, 119732, - 119738, 119742, 119750, 119754, 119761, 119773, 119780, 119790, 119796, - 119800, 119809, 119816, 119825, 119829, 119833, 119840, 119844, 119848, - 119852, 119856, 119859, 119865, 119871, 119875, 119879, 119886, 119893, - 119900, 119907, 119914, 119921, 119928, 119935, 119941, 119945, 119949, - 119956, 119963, 119970, 119977, 119984, 119988, 119991, 119996, 120000, - 120004, 120013, 120022, 120026, 120030, 120036, 120042, 120059, 120065, - 120069, 120078, 120082, 120086, 120093, 120101, 120109, 120115, 120119, - 120123, 120127, 120131, 120134, 120140, 120147, 120157, 120164, 120171, - 120178, 120184, 120191, 120198, 120205, 120212, 120219, 120228, 120235, - 120247, 120254, 120261, 120271, 120282, 120289, 120296, 120303, 120310, - 120317, 120324, 120331, 120338, 120345, 120352, 120362, 120372, 120382, - 120389, 120399, 120406, 120413, 120420, 120427, 120433, 120440, 120447, - 120454, 120461, 120468, 120475, 120482, 120489, 120495, 120502, 120509, - 120518, 120525, 120532, 120536, 120544, 120548, 120552, 120556, 120560, - 120564, 120571, 120575, 120584, 120588, 120595, 120603, 120607, 120611, - 120615, 120628, 120644, 120648, 120652, 120659, 120665, 120672, 120676, - 120680, 120684, 120688, 120692, 120699, 120703, 120721, 120725, 120729, - 120736, 120740, 120744, 120750, 120754, 120758, 120766, 120770, 120774, - 120777, 120781, 120787, 120798, 120807, 120816, 120823, 120830, 120841, - 120848, 120855, 120862, 120869, 120876, 120883, 120890, 120900, 120906, - 120913, 120923, 120932, 120939, 120948, 120958, 120965, 120972, 120979, - 120986, 120998, 121005, 121012, 121019, 121026, 121033, 121043, 121050, - 121057, 121067, 121080, 121092, 121099, 121109, 121116, 121123, 121130, - 121144, 121150, 121158, 121168, 121178, 121185, 121192, 121198, 121202, - 121209, 121219, 121225, 121238, 121242, 121246, 121253, 121257, 121264, - 121274, 121278, 121282, 121286, 121290, 121294, 121301, 121305, 121312, - 121319, 121326, 121335, 121344, 121354, 121361, 121368, 121375, 121385, - 121392, 121402, 121409, 121419, 121426, 121433, 121443, 121453, 121460, - 121466, 121474, 121482, 121488, 121494, 121498, 121502, 121509, 121517, - 121523, 121527, 121531, 121535, 121542, 121554, 121557, 121564, 121570, - 121574, 121578, 121582, 121586, 121590, 121594, 121598, 121602, 121606, - 121610, 121617, 121621, 121627, 121631, 121635, 121639, 121645, 121652, - 121659, 121666, 121677, 121685, 121689, 121695, 121704, 121711, 121717, - 121720, 121724, 121728, 121734, 121743, 121751, 121755, 121761, 121765, - 121769, 121773, 121779, 121786, 121792, 121796, 121802, 121806, 121810, - 121819, 121831, 121835, 121842, 121849, 121859, 121866, 121878, 121885, - 121892, 121899, 121910, 121920, 121933, 121943, 121950, 121954, 121958, - 121962, 121966, 121975, 121984, 121993, 122010, 122019, 122025, 122032, - 122040, 122053, 122057, 122066, 122075, 122084, 122093, 122104, 122113, - 122121, 122130, 122139, 122148, 122157, 122167, 122170, 122174, 122178, - 122182, 122186, 122190, 122196, 122203, 122210, 122217, 122223, 122229, - 122236, 122242, 122249, 122257, 122261, 122268, 122275, 122282, 122290, - 122293, 122297, 122301, 122305, 122308, 122314, 122318, 122324, 122331, - 122338, 122344, 122351, 122358, 122365, 122372, 122379, 122386, 122393, - 122400, 122407, 122414, 122421, 122428, 122435, 122442, 122448, 122452, - 122461, 122465, 122469, 122473, 122477, 122483, 122490, 122497, 122504, - 122511, 122518, 122524, 122532, 122536, 122540, 122544, 122548, 122554, - 122571, 122588, 122592, 122596, 122600, 122604, 122608, 122612, 122618, - 122625, 122629, 122635, 122642, 122649, 122656, 122663, 122670, 122679, - 122686, 122693, 122700, 122707, 122711, 122715, 122721, 122733, 122737, - 122741, 122750, 122754, 122758, 122762, 122768, 122772, 122776, 122785, - 122789, 122793, 122797, 122804, 122808, 122812, 122816, 122820, 122824, - 122828, 122832, 122835, 122841, 122848, 122855, 122861, 122865, 122882, - 122888, 122892, 122898, 122904, 122910, 122916, 122922, 122928, 122932, - 122936, 122940, 122946, 122950, 122956, 122960, 122964, 122971, 122978, - 122995, 122999, 123003, 123007, 123011, 123015, 123027, 123030, 123035, - 123040, 123055, 123065, 123077, 123081, 123085, 123089, 123095, 123102, - 123109, 123119, 123131, 123137, 123143, 123152, 123156, 123160, 123167, - 123177, 123184, 123190, 123194, 123198, 123205, 123211, 123215, 123221, - 123225, 123233, 123239, 123243, 123251, 123259, 123266, 123272, 123279, - 123286, 123296, 123306, 123310, 123314, 123318, 123322, 123328, 123335, - 123341, 123348, 123355, 123362, 123371, 123378, 123385, 123391, 123398, - 123405, 123412, 123419, 123426, 123433, 123439, 123446, 123453, 123460, - 123469, 123476, 123483, 123487, 123493, 123497, 123503, 123510, 123517, - 123524, 123528, 123532, 123536, 123540, 123544, 123551, 123555, 123559, - 123565, 123573, 123577, 123581, 123585, 123589, 123596, 123600, 123604, - 123612, 123616, 123620, 123624, 123628, 123634, 123638, 123642, 123648, - 123655, 123661, 123668, 123680, 123684, 123691, 123698, 123705, 123712, - 123724, 123731, 123735, 123739, 123743, 123750, 123757, 123764, 123771, - 123781, 123788, 123794, 123801, 123808, 123815, 123822, 123831, 123841, - 123848, 123852, 123859, 123863, 123867, 123871, 123878, 123885, 123895, - 123901, 123905, 123914, 123918, 123925, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123929, 123935, - 123941, 123948, 123955, 123962, 123969, 123976, 123983, 123989, 123996, - 124003, 124010, 124017, 124024, 124031, 124037, 124043, 124049, 124055, - 124061, 124067, 124073, 124079, 124085, 124092, 124099, 124106, 124113, - 124120, 124127, 124133, 124139, 124145, 124152, 124159, 124165, 124171, - 124180, 124187, 124194, 124201, 124208, 124215, 124222, 124228, 124234, - 124240, 124249, 124256, 124263, 124274, 124285, 124291, 124297, 124303, - 124312, 124319, 124326, 124336, 124346, 124357, 124368, 124380, 124393, - 124404, 124415, 124427, 124440, 124451, 124462, 124473, 124484, 124495, - 124507, 124515, 124523, 124532, 124541, 124550, 124556, 124562, 124568, - 124575, 124585, 124592, 124602, 124607, 124612, 124618, 124624, 124632, - 124640, 124649, 124660, 124671, 124679, 124687, 124696, 124705, 124713, - 124720, 124728, 124736, 124743, 124750, 124759, 124768, 124777, 124786, - 124795, 0, 124804, 124815, 124822, 124830, 124838, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 124846, 124855, 124862, 124869, 124878, 124885, 124892, - 124899, 124909, 124916, 124923, 124930, 124938, 124945, 124952, 124959, - 124970, 124977, 124984, 124991, 124998, 125005, 125014, 125021, 125027, - 125034, 125043, 125050, 125057, 125064, 125074, 125081, 125088, 125098, - 125108, 125115, 125122, 125129, 125136, 125143, 125150, 125159, 125166, - 125173, 125179, 125187, 125196, 125205, 125216, 125224, 125233, 125242, - 125251, 125260, 125267, 125274, 125283, 125295, 125305, 125312, 125319, - 125329, 125339, 125348, 125358, 125365, 125375, 125382, 125389, 125396, - 125406, 125416, 125423, 125430, 125440, 125446, 125457, 125466, 125476, - 125484, 125497, 125504, 125510, 125518, 125525, 125535, 125539, 125543, - 125547, 125551, 125555, 125559, 125563, 125572, 125576, 125583, 125587, - 125591, 125595, 125599, 125603, 125607, 125611, 125615, 125619, 125623, - 125627, 125631, 125635, 125639, 125643, 125647, 125651, 125655, 125659, - 125666, 125673, 125683, 125696, 125706, 125710, 125714, 125718, 125722, - 125726, 125730, 125734, 125738, 125742, 125746, 125750, 125757, 125764, - 125775, 125782, 125788, 125795, 125802, 125809, 125816, 125823, 125827, - 125831, 125838, 125845, 125852, 125861, 125868, 125881, 125891, 125898, - 125905, 125909, 125913, 125922, 125929, 125936, 125943, 125956, 125963, - 125970, 125980, 125990, 125999, 126006, 126013, 126020, 126027, 126034, - 126041, 126051, 126057, 126065, 126072, 126080, 126087, 126098, 126105, - 126111, 126118, 126125, 126132, 126139, 126149, 126159, 126166, 126173, - 126182, 126190, 126196, 126203, 126210, 126217, 126224, 126228, 126238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126248, 126252, 126256, 126260, - 126264, 126268, 126272, 126276, 126280, 126284, 126288, 126292, 126296, - 126300, 126304, 126308, 126312, 126316, 126320, 126324, 126328, 126332, - 126336, 126340, 126344, 126348, 126352, 126356, 126360, 126364, 126368, - 126372, 126376, 126380, 126384, 126388, 126392, 126396, 126400, 126404, - 126408, 126412, 126416, 126420, 126424, 126428, 126432, 126436, 126440, - 126444, 126448, 126452, 126456, 126460, 126464, 126468, 126472, 126476, - 126480, 126484, 126488, 126492, 126496, 126500, 126504, 126508, 126512, - 126516, 126520, 126524, 126528, 126532, 126536, 126540, 126544, 126548, - 126552, 126556, 126560, 126564, 126568, 126572, 126576, 126580, 126584, - 126588, 126592, 126596, 126600, 126604, 126608, 126612, 126616, 126620, - 126624, 126628, 126632, 126636, 126640, 126644, 126648, 126652, 126656, - 126660, 126664, 126668, 126672, 126676, 126680, 126684, 126688, 126692, - 126696, 126700, 126704, 126708, 126712, 126716, 126720, 126724, 126728, - 126732, 126736, 126740, 126744, 126748, 126752, 126756, 126760, 126764, - 126768, 126772, 126776, 126780, 126784, 126788, 126792, 126796, 126800, - 126804, 126808, 126812, 126816, 126820, 126824, 126828, 126832, 126836, - 126840, 126844, 126848, 126852, 126856, 126860, 126864, 126868, 126872, - 126876, 126880, 126884, 126888, 126892, 126896, 126900, 126904, 126908, - 126912, 126916, 126920, 126924, 126928, 126932, 126936, 126940, 126944, - 126948, 126952, 126956, 126960, 126964, 126968, 126972, 126976, 126980, - 126984, 126988, 126992, 126996, 127000, 127004, 127008, 127012, 127016, - 127020, 127024, 127028, 127032, 127036, 127040, 127044, 127048, 127052, - 127056, 127060, 127064, 127068, 127072, 127076, 127080, 127084, 127088, - 127092, 127096, 127100, 127104, 127108, 127112, 127116, 127120, 127124, - 127128, 127132, 127136, 127140, 127144, 127148, 127152, 127156, 127160, - 127164, 127168, 127172, 127176, 127180, 127184, 127188, 127192, 127196, - 127200, 127204, 127208, 127212, 127216, 127220, 127224, 127228, 127232, - 127236, 127240, 127244, 127248, 127252, 127256, 127260, 127264, 127268, - 127272, 127276, 127280, 127284, 127288, 127292, 127296, 127300, 127304, - 127308, 127312, 127316, 127320, 127324, 127328, 127332, 127336, 127340, - 127344, 127348, 127352, 127356, 127360, 127364, 127368, 127372, 127376, - 127380, 127384, 127388, 127392, 127396, 127400, 127404, 127408, 127412, - 127416, 127420, 127424, 127428, 127432, 127436, 127440, 127444, 127448, - 127452, 127456, 127460, 127464, 127468, 127472, 127476, 127480, 127484, - 127488, 127492, 127496, 127500, 127504, 127508, 127512, 127516, 127520, - 127524, 127528, 127532, 127536, 127540, 127544, 127548, 127552, 127556, - 127560, 127564, 127568, 127572, 127576, 127580, 127584, 127588, 127592, - 127596, 127600, 127604, 127608, 127612, 127616, 127620, 127624, 127628, - 127632, 127636, 127640, 127644, 127648, 127652, 127656, 127660, 127664, - 127668, 127672, 127676, 127680, 127684, 127688, 127692, 127696, 127700, - 127704, 127708, 127712, 127716, 127720, 127724, 127728, 127732, 127736, - 127740, 127744, 127748, 127752, 127756, 127760, 127764, 127768, 127772, - 127776, 127780, 127784, 127788, 127792, 127796, 127800, 127804, 127808, - 127812, 127816, 127820, 127824, 127828, 127832, 127836, 127840, 127844, - 127848, 127852, 127856, 127860, 127864, 127868, 127872, 127876, 127880, - 127884, 127888, 127892, 127896, 127900, 127904, 127908, 127912, 127916, - 127920, 127924, 127928, 127932, 127936, 127940, 127944, 127948, 127952, - 127956, 127960, 127964, 127968, 127972, 127976, 127980, 127984, 127988, - 127992, 127996, 128000, 128004, 128008, 128012, 128016, 128020, 128024, - 128028, 128032, 128036, 128040, 128044, 128048, 128052, 128056, 128060, - 128064, 128068, 128072, 128076, 128080, 128084, 128088, 128092, 128096, - 128100, 128104, 128108, 128112, 128116, 128120, 128124, 128128, 128132, - 128136, 128140, 128144, 128148, 128152, 128156, 128160, 128164, 128168, - 128172, 128176, 128180, 128184, 128188, 128192, 128196, 128200, 128204, - 128208, 128212, 128216, 128220, 128224, 128228, 128232, 128236, 128240, - 128244, 128248, 128252, 128256, 128260, 128264, 128268, 128272, 128276, - 128280, 128284, 128288, 128292, 128296, 128300, 128304, 128308, 128312, - 128316, 128320, 128324, 128328, 128332, 128336, 128340, 128344, 128348, - 128352, 128356, 128360, 128364, 128368, 128372, 128376, 128380, 128384, - 128388, 128392, 128396, 128400, 128404, 128408, 128412, 128416, 128420, - 128424, 128428, 128432, 128436, 128440, 128444, 128448, 128452, 128456, - 128460, 128464, 128468, 128472, 128476, 128480, 128484, 128488, 128492, - 128496, 128500, 128504, 128508, 128512, 128516, 128520, 128524, 128528, - 128532, 128536, 128540, 128544, 128548, 128552, 128556, 128560, 128564, - 128568, 128572, 128576, 128580, 128584, 128588, 128592, 128596, 128600, - 128604, 128608, 128612, 128616, 128620, 128624, 128628, 128632, 128636, - 128640, 128644, 128648, 128652, 128656, 128660, 128664, 128668, 128672, - 128676, 128680, 128684, 128688, 128692, 128696, 128700, 128704, 128708, - 128712, 128716, 128720, 128724, 128728, 128732, 128736, 128740, 128744, - 128748, 128752, 128756, 128760, 128764, 128768, 128772, 128776, 128780, - 128784, 128788, 128792, 128796, 128800, 128804, 128808, 128812, 128816, - 128820, 128824, 128828, 128832, 128836, 128840, 128844, 128848, 128852, - 128856, 128860, 128864, 128868, 128872, 128876, 128880, 128884, 128888, - 128892, 128896, 128900, 128904, 128908, 128912, 128916, 128920, 128924, - 128928, 128932, 128936, 128940, 128944, 128948, 128952, 128956, 128960, - 128964, 128968, 128972, 128976, 128980, 128984, 128988, 128992, 128996, - 129000, 129004, 129008, 129012, 129016, 129020, 129024, 129028, 129032, - 129036, 129040, 129044, 129048, 129052, 129056, 129060, 129064, 129068, - 129072, 129076, 129080, 129084, 129088, 129092, 129096, 129100, 129104, - 129108, 129112, 129116, 129120, 129124, 129128, 129132, 129136, 129140, - 129144, 129148, 129152, 129156, 129160, 129164, 129168, 129172, 129176, - 129180, 129184, 129188, 129192, 129196, 129200, 129204, 129208, 129212, - 129216, 129220, 129224, 129228, 129232, 129236, 129240, 129244, 129248, - 129252, 129256, 129260, 129264, 129268, 129272, 129276, 129280, 129284, - 129288, 129292, 129296, 129300, 129304, 129308, 129312, 129316, 129320, - 129324, 129328, 129332, 129336, 129340, 129344, 129348, 129352, 129356, - 129360, 129364, 129368, 129372, 129376, 129380, 129384, 129388, 129392, - 129396, 129400, 129404, 129408, 129412, 129416, 129420, 129424, 129428, - 129432, 129436, 129440, 129444, 129448, 129452, 129456, 129460, 129464, - 129468, 129472, 129476, 129480, 129484, 129488, 129492, 129496, 129500, - 129504, 129508, 129512, 129516, 129520, 129524, 129528, 129532, 129536, - 129540, 129544, 129548, 129552, 129556, 129560, 129564, 129568, 129572, - 129576, 129580, 129584, 129588, 129592, 129596, 129600, 129604, 129608, - 129612, 129616, 129620, 129624, 129628, 129632, 129636, 129640, 129644, - 129648, 129652, 129656, 129660, 129664, 129668, 129672, 129676, 129680, - 129684, 129688, 129692, 129696, 129700, 129704, 129708, 129712, 129716, - 129720, 129724, 129728, 129732, 129736, 129740, 129744, 129748, 129752, - 129756, 129760, 129764, 129768, 129772, 129776, 129780, 129784, 129788, - 129792, 129796, 129800, 129804, 129808, 129812, 129816, 129820, 129824, - 129828, 129832, 129836, 129840, 129844, 129848, 129852, 129856, 129860, - 129864, 129868, 129872, 129876, 129880, 129884, 129888, 129892, 129896, - 129900, 129904, 129908, 129912, 129916, 129920, 129924, 129928, 129932, - 129936, 129940, 129944, 129948, 129952, 129956, 129960, 129964, 129968, - 129972, 129976, 129980, 129984, 129988, 129992, 129996, 130000, 130004, - 130008, 130012, 130016, 130020, 130024, 130028, 130032, 130036, 130040, - 130044, 130048, 130052, 130056, 130060, 130064, 130068, 130072, 130076, - 130080, 130084, 130088, 130092, 130096, 130100, 130104, 130108, 130112, - 130116, 130120, 130124, 130128, 130132, 130136, 130140, 130144, 130148, - 130152, 130156, 130160, 130164, 130168, 130172, 130176, 130180, 130184, - 130188, 130192, 130196, 130200, 130204, 130208, 130212, 130216, 130220, - 130224, 130228, 130232, 130236, 130240, 130244, 130248, 130252, 130256, - 130260, 130264, 130268, 130272, 130276, 130280, 130284, 130288, 130292, - 130296, 130300, 130304, 130308, 130312, 130316, 130320, 130324, 130328, - 130332, 130336, 130340, 130344, 130348, 130352, 130356, 130360, 130364, - 130368, 130372, 130376, 130380, 130384, 130388, 130392, 130396, 130400, - 130404, 130408, 130412, 130416, 130420, 130424, 130428, 130432, 130436, - 130440, 130444, 130448, 130452, 130456, 130460, 130464, 130468, 130472, - 130476, 130480, 130484, 130488, 130492, 130496, 130500, 130504, 130508, - 130512, 130516, 130520, 130524, 130528, 0, 130532, 130537, 130543, - 130553, 130563, 130573, 130583, 130589, 130595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130601, 130605, 130609, - 130613, 130617, 130621, 130625, 130629, 130633, 130637, 130641, 130645, - 130649, 130653, 130657, 130661, 130665, 130669, 130673, 130677, 130681, - 130685, 130689, 130693, 130697, 130701, 130705, 130709, 130713, 130717, - 130721, 130725, 130729, 130733, 130737, 130741, 130745, 130749, 130753, - 130757, 130761, 130765, 130769, 130773, 130777, 130781, 130785, 130789, - 130793, 130797, 130801, 130805, 130809, 130813, 130817, 130821, 130825, - 130829, 130833, 130837, 130841, 130845, 130849, 130853, 130857, 130861, - 130865, 130869, 130873, 130877, 130881, 130885, 130889, 130893, 130897, - 130901, 130905, 130909, 130913, 130917, 130921, 130925, 130929, 130933, - 130937, 130941, 130945, 130949, 130953, 130957, 130961, 130965, 130969, - 130973, 130977, 130981, 130985, 130989, 130993, 130997, 131001, 131005, - 131009, 131013, 131017, 131021, 131025, 131029, 131033, 131037, 131041, - 131045, 131049, 131053, 131057, 131061, 131065, 131069, 131073, 131077, - 131081, 131085, 131089, 131093, 131097, 131101, 131105, 131109, 131113, - 131117, 131121, 131125, 131129, 131133, 131137, 131141, 131145, 131149, - 131153, 131157, 131161, 131165, 131169, 131173, 131177, 131181, 131185, - 131189, 131193, 131197, 131201, 131205, 131209, 131213, 131217, 131221, - 131225, 131229, 131233, 131237, 131241, 131245, 131249, 131253, 131257, - 131261, 131265, 131269, 131273, 131277, 131281, 131285, 131289, 131293, - 131297, 131301, 131305, 131309, 131313, 131317, 131321, 131325, 131329, - 131333, 131337, 131341, 131345, 131349, 131353, 131357, 131361, 131365, - 131369, 131373, 131377, 131381, 131385, 131389, 131393, 131397, 131401, - 131405, 131409, 131413, 131417, 131421, 131425, 131429, 131433, 131437, - 131441, 131445, 131449, 131453, 131457, 131461, 131465, 131469, 131473, - 131477, 131481, 131485, 131489, 131493, 131497, 131501, 131505, 131509, - 131513, 131517, 131521, 131525, 131529, 131533, 131537, 131541, 131545, - 131549, 131553, 131557, 131561, 131565, 131569, 131573, 131577, 131581, - 131585, 131589, 131593, 131597, 131601, 131605, 131609, 131613, 131617, - 131621, 131625, 131629, 131633, 131637, 131641, 131645, 131649, 131653, - 131657, 131661, 131665, 131669, 131673, 131677, 131681, 131685, 131689, - 131693, 131697, 131701, 131705, 131709, 131713, 131717, 131721, 131725, - 131729, 131733, 131737, 131741, 131745, 131749, 131753, 131757, 131761, - 131765, 131769, 131773, 131777, 131781, 131785, 131789, 131793, 131797, - 131801, 131805, 131809, 131813, 131817, 131821, 131825, 131829, 131833, - 131837, 131841, 131845, 131849, 131853, 131857, 131861, 131865, 131869, - 131873, 131877, 131881, 131885, 131889, 131893, 131897, 131901, 131905, - 131909, 131913, 131917, 131921, 131925, 131929, 131933, 131937, 131941, - 131945, 131949, 131953, 131957, 131961, 131965, 131969, 131973, 131977, - 131981, 131985, 131989, 131993, 131997, 132001, 132005, 132009, 132013, - 132017, 132021, 132025, 132029, 132033, 132037, 132041, 132045, 132049, - 132053, 132057, 132061, 132065, 132069, 132073, 132077, 132081, 132085, - 132089, 132093, 132097, 132101, 132105, 132109, 132113, 132117, 132121, - 132125, 132129, 132133, 132137, 132141, 132145, 132149, 132153, 132157, - 132161, 132165, 132169, 132173, 132177, 132181, 132185, 132189, 132193, - 132197, 132201, 132205, 132209, 132213, 132217, 132221, 132225, 132229, - 132233, 132237, 132241, 132245, 132249, 132253, 132257, 132261, 132265, - 132269, 132273, 132277, 132281, 132285, 132289, 132293, 132297, 132301, - 132305, 132309, 132313, 132317, 132321, 132325, 132329, 132333, 132343, - 132347, 132351, 132355, 132359, 132363, 132367, 132371, 132375, 132379, - 132383, 132387, 132392, 132396, 132400, 132404, 132408, 132412, 132416, + 0, 0, 0, 0, 0, 0, 0, 0, 106947, 106951, 106955, 106959, 106963, 106967, + 106971, 106975, 106979, 106983, 106988, 106993, 106998, 107003, 107008, + 107013, 107018, 107023, 107028, 107034, 107040, 107046, 107053, 107060, + 107067, 107074, 107081, 107088, 107095, 107102, 107109, 0, 107116, + 107121, 107126, 107131, 107136, 107141, 107146, 107151, 107156, 107161, + 107166, 107171, 107176, 107181, 107185, 107190, 107195, 107200, 107205, + 107210, 107215, 107220, 107224, 107229, 107234, 107239, 107244, 107249, + 107257, 107262, 107267, 107272, 107277, 107282, 107287, 107292, 107297, + 107302, 107307, 107312, 107317, 107322, 0, 107327, 107333, 107339, 0, 0, + 107344, 107352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107361, 107367, 107374, 107380, 107387, + 107393, 107399, 107406, 107412, 107418, 107424, 107430, 107436, 107442, + 107448, 107454, 107461, 107472, 107478, 107484, 107492, 107498, 107504, + 107511, 107522, 107528, 107534, 107540, 107547, 107558, 107563, 107568, + 107573, 107578, 107583, 107589, 107595, 107601, 107608, 107616, 0, 0, 0, + 0, 0, 0, 0, 0, 107622, 107627, 107632, 107637, 107642, 107647, 107652, + 107657, 107662, 107667, 107672, 107677, 107682, 107687, 107692, 107697, + 107702, 107707, 107712, 107717, 107722, 107727, 107733, 107738, 107745, + 107750, 107757, 107763, 107769, 107775, 107781, 107788, 107794, 107800, + 107804, 107809, 107814, 107820, 107828, 107839, 107848, 107858, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107868, 107873, 107879, 107884, 107889, + 107894, 107899, 107904, 107911, 107916, 107921, 107926, 107931, 107936, + 107941, 107946, 107951, 107956, 107961, 107966, 107971, 107976, 107980, + 107984, 107988, 107992, 107997, 108002, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 108008, 108013, 108018, 108023, 108028, + 108033, 108038, 108043, 108048, 108053, 108058, 108063, 108068, 108073, + 108078, 108083, 108088, 108093, 108098, 108103, 108108, 108113, 108118, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 108123, 108127, 108131, 108135, 108139, + 108143, 108146, 108150, 108153, 108157, 108160, 108164, 108168, 108173, + 108177, 108182, 108185, 108189, 108192, 108196, 108199, 108203, 108207, + 108211, 108215, 108219, 108223, 108227, 108231, 108235, 108239, 108243, + 108247, 108251, 108255, 108258, 108262, 108266, 108270, 108273, 108276, + 108280, 108284, 108288, 108291, 108294, 108297, 108300, 108304, 108308, + 108312, 108315, 108318, 108322, 108328, 108334, 108340, 108345, 108352, + 108356, 108361, 108365, 108370, 108375, 108381, 108386, 108392, 108396, + 108401, 108405, 108410, 108413, 108416, 108420, 108425, 108431, 108436, + 108442, 0, 0, 0, 0, 108447, 108450, 108453, 108456, 108459, 108462, + 108465, 108468, 108471, 108474, 108478, 108482, 108486, 108490, 108494, + 108498, 108502, 108506, 108510, 108515, 108519, 108523, 108526, 108529, + 108532, 108535, 108538, 108541, 108544, 108547, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 108550, 108554, 108559, 108564, 108569, 108573, + 108578, 108582, 108587, 108591, 108596, 108600, 108605, 108609, 108614, + 108618, 108623, 108628, 108633, 108638, 108643, 108648, 108653, 108658, + 108663, 108668, 108673, 108678, 108683, 108688, 108693, 108698, 108702, + 108707, 108712, 108717, 108721, 108725, 108730, 108735, 108740, 108744, + 108748, 108752, 108756, 108761, 108766, 108771, 108775, 108779, 108785, + 108790, 108796, 108801, 108807, 108812, 108818, 108823, 108829, 108834, + 108839, 108844, 108849, 108853, 108858, 108864, 108868, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 108873, 0, 0, 108878, 108885, 108892, 108899, 108906, + 108913, 108920, 108927, 108934, 108941, 108948, 108955, 108962, 108969, + 108976, 108983, 108990, 108997, 109004, 109011, 109018, 109025, 109032, + 109039, 109046, 0, 0, 0, 0, 0, 0, 0, 109053, 109060, 109066, 109072, + 109078, 109084, 109090, 109096, 109102, 109108, 0, 0, 0, 0, 0, 0, 109114, + 109119, 109124, 109129, 109134, 109138, 109142, 109146, 109151, 109156, + 109161, 109166, 109171, 109176, 109181, 109186, 109191, 109196, 109201, + 109206, 109211, 109216, 109221, 109226, 109231, 109236, 109241, 109246, + 109251, 109256, 109261, 109266, 109271, 109276, 109281, 109286, 109291, + 109296, 109301, 109306, 109311, 109316, 109322, 109327, 109333, 109338, + 109344, 109349, 109355, 109361, 109365, 109370, 109374, 0, 109378, + 109383, 109387, 109391, 109395, 109399, 109403, 109407, 109411, 109415, + 109419, 109424, 109428, 109433, 109438, 109443, 109449, 109455, 0, 0, 0, + 0, 0, 0, 0, 0, 109460, 109464, 109468, 109472, 109476, 109480, 109484, + 109489, 109494, 109499, 109504, 109509, 109514, 109519, 109524, 109529, + 109534, 109539, 109544, 109549, 109553, 109558, 109563, 109568, 109572, + 109576, 109581, 109586, 109591, 109595, 109599, 109603, 109608, 109612, + 109616, 109621, 109626, 109631, 109636, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 109641, 109646, 109651, 109656, 109660, 109665, 109669, 109674, 109678, + 109683, 109688, 109694, 109699, 109705, 109709, 109714, 109718, 109723, + 109727, 109732, 109737, 109742, 109747, 109752, 109757, 109762, 109767, + 109772, 109777, 109782, 109787, 109792, 109797, 109801, 109806, 109811, + 109816, 109820, 109824, 109829, 109834, 109839, 109843, 109847, 109851, + 109855, 109860, 109865, 109870, 109875, 109879, 109883, 109889, 109894, + 109900, 109905, 109911, 109917, 109924, 109930, 109937, 109942, 109948, + 109953, 109959, 109964, 109969, 109974, 109979, 109983, 109987, 109992, + 109997, 110001, 110006, 110011, 110016, 110024, 110029, 110036, 110043, + 110048, 110052, 110056, 110060, 110064, 110068, 110072, 110076, 110080, + 110084, 110088, 110093, 110097, 110102, 110108, 0, 110114, 110119, + 110124, 110129, 110134, 110139, 110144, 110149, 110154, 110159, 110165, + 110171, 110177, 110183, 110189, 110195, 110201, 110207, 110213, 110220, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110226, 110230, 110235, 110239, 110243, + 110247, 110252, 110256, 110261, 110265, 110270, 110275, 110280, 110285, + 110290, 110295, 110300, 110305, 0, 110310, 110315, 110320, 110325, + 110330, 110335, 110340, 110344, 110349, 110354, 110359, 110364, 110368, + 110372, 110377, 110382, 110387, 110392, 110396, 110400, 110404, 110408, + 110413, 110417, 110421, 110426, 110432, 110437, 110443, 110448, 110453, + 110459, 110464, 110470, 110475, 110480, 110485, 110490, 110494, 110499, + 110505, 110510, 110516, 110521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 110526, 110530, 110534, 110538, 110542, 110546, 110551, 0, + 110556, 0, 110561, 110566, 110571, 110576, 0, 110581, 110586, 110591, + 110596, 110601, 110606, 110611, 110616, 110620, 110625, 110630, 110635, + 110639, 110643, 110648, 0, 110653, 110658, 110662, 110666, 110670, + 110674, 110679, 110683, 110687, 110692, 110697, 0, 0, 0, 0, 0, 0, 110702, + 110706, 110711, 110715, 110720, 110724, 110729, 110733, 110738, 110742, + 110747, 110751, 110756, 110761, 110766, 110771, 110776, 110781, 110786, + 110791, 110796, 110801, 110806, 110811, 110816, 110821, 110826, 110831, + 110836, 110841, 110845, 110850, 110855, 110860, 110864, 110868, 110873, + 110878, 110883, 110888, 110892, 110896, 110900, 110904, 110909, 110914, + 110918, 110922, 110927, 110933, 110938, 110944, 110949, 110955, 110960, + 110966, 110971, 110977, 110982, 0, 0, 0, 0, 0, 110987, 110992, 110996, + 111000, 111004, 111008, 111012, 111016, 111020, 111024, 0, 0, 0, 0, 0, 0, + 111028, 111035, 111040, 111045, 0, 111050, 111054, 111059, 111063, + 111068, 111072, 111077, 111082, 0, 0, 111087, 111092, 0, 0, 111097, + 111102, 111107, 111111, 111116, 111121, 111126, 111131, 111136, 111141, + 111146, 111151, 111156, 111161, 111166, 111171, 111176, 111181, 111185, + 111190, 111195, 111200, 0, 111204, 111208, 111213, 111218, 111223, + 111227, 111231, 0, 111235, 111239, 0, 111244, 111249, 111254, 111259, + 111263, 0, 111267, 111271, 111276, 111281, 111287, 111292, 111298, + 111303, 111309, 111315, 0, 0, 111322, 111328, 0, 0, 111334, 111340, + 111346, 0, 0, 111351, 0, 0, 0, 0, 0, 0, 111355, 0, 0, 0, 0, 0, 111362, + 111367, 111374, 111382, 111388, 111394, 111400, 0, 0, 111407, 111413, + 111418, 111423, 111428, 111433, 111438, 0, 0, 0, 111443, 111448, 111453, + 111458, 111464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 111469, 111473, 111478, 111482, 111487, 111491, 111496, 111501, 111507, + 111512, 111518, 111522, 111527, 111531, 111536, 111540, 111545, 111550, + 111555, 111560, 111565, 111570, 111575, 111580, 111585, 111590, 111595, + 111600, 111605, 111610, 111615, 111620, 111624, 111629, 111634, 111639, + 111643, 111648, 111652, 111657, 111662, 111667, 111671, 111676, 111680, + 111684, 111689, 111693, 111698, 111703, 111708, 111713, 111717, 111721, + 111727, 111732, 111738, 111743, 111749, 111755, 111762, 111768, 111775, + 111780, 111786, 111791, 111797, 111802, 111807, 111812, 111817, 111822, + 111827, 111833, 111837, 111841, 111845, 111850, 111854, 111860, 111865, + 111870, 111874, 111878, 111882, 111886, 111890, 111894, 111898, 111902, + 111906, 111911, 0, 111916, 111921, 111926, 111933, 111938, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 111943, 111947, 111951, 111956, 111960, 111965, 111969, 111974, + 111979, 111985, 111990, 111996, 112000, 112005, 112009, 112014, 112018, + 112023, 112028, 112033, 112038, 112043, 112048, 112053, 112058, 112063, + 112068, 112073, 112078, 112083, 112088, 112092, 112097, 112102, 112107, + 112111, 112115, 112120, 112125, 112130, 112134, 112138, 112142, 112146, + 112151, 112156, 112161, 112165, 112169, 112175, 112180, 112186, 112191, + 112197, 112203, 112210, 112216, 112223, 112228, 112235, 112241, 112246, + 112253, 112259, 112264, 112269, 112274, 112279, 112284, 112289, 112293, + 112298, 0, 0, 0, 0, 0, 0, 0, 0, 112302, 112307, 112311, 112315, 112319, + 112323, 112327, 112331, 112335, 112339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112343, 112347, 112352, 112356, 112361, + 112365, 112370, 112375, 112381, 112386, 112392, 112396, 112401, 112405, + 112410, 112414, 112419, 112424, 112429, 112434, 112439, 112444, 112449, + 112454, 112459, 112464, 112469, 112474, 112479, 112484, 112488, 112493, + 112498, 112503, 112507, 112511, 112516, 112521, 112526, 112530, 112534, + 112538, 112542, 112547, 112552, 112557, 112561, 112565, 112571, 112576, + 112582, 112587, 112593, 112599, 0, 0, 112606, 112611, 112617, 112622, + 112628, 112633, 112638, 112643, 112648, 112653, 112658, 112662, 112667, + 112673, 112678, 112684, 112690, 112696, 112704, 112717, 112730, 112743, + 112757, 112772, 112780, 112791, 112800, 112810, 112820, 112830, 112841, + 112853, 112866, 112874, 112882, 112891, 112897, 112904, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 112912, 112916, 112921, 112925, 112930, 112934, 112939, + 112944, 112950, 112955, 112961, 112965, 112970, 112974, 112979, 112983, + 112988, 112993, 112998, 113003, 113008, 113013, 113018, 113023, 113028, + 113033, 113038, 113043, 113048, 113053, 113057, 113062, 113067, 113072, + 113076, 113080, 113085, 113090, 113095, 113099, 113103, 113107, 113111, + 113116, 113121, 113126, 113130, 113134, 113139, 113145, 113150, 113156, + 113161, 113167, 113173, 113180, 113186, 113193, 113198, 113204, 113209, + 113215, 113220, 113225, 113230, 113235, 113239, 113244, 113249, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 113254, 113259, 113263, 113267, 113271, 113275, + 113279, 113283, 113287, 113291, 0, 0, 0, 0, 0, 0, 113295, 113301, 113306, + 113313, 113321, 113328, 113336, 113345, 113350, 113359, 113364, 113372, + 113381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113391, + 113395, 113400, 113404, 113409, 113413, 113418, 113422, 113427, 113431, + 113436, 113440, 113445, 113450, 113455, 113460, 113465, 113470, 113475, + 113480, 113485, 113490, 113495, 113500, 113505, 113510, 113514, 113519, + 113524, 113529, 113533, 113537, 113542, 113547, 113552, 113556, 113560, + 113564, 113568, 113573, 113578, 113582, 113586, 113591, 113596, 113601, + 113607, 113612, 113618, 113623, 113629, 113634, 113640, 113645, 113651, + 113656, 113661, 0, 0, 0, 0, 0, 0, 0, 113668, 113673, 113677, 113681, + 113685, 113689, 113693, 113697, 113701, 113705, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113709, + 113713, 113718, 113723, 113727, 113731, 113737, 113741, 113746, 113751, + 113755, 113760, 113765, 113770, 113774, 113778, 113782, 113787, 113791, + 113795, 113800, 113805, 113810, 113817, 113822, 113827, 113832, 0, 0, + 113839, 113846, 113853, 113862, 113867, 113873, 113878, 113884, 113889, + 113895, 113900, 113906, 113911, 113917, 113923, 0, 0, 0, 0, 113928, + 113933, 113937, 113941, 113945, 113949, 113953, 113957, 113961, 113965, + 113969, 113974, 113979, 113985, 113990, 113995, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114000, 114004, 114009, + 114013, 114018, 114022, 114027, 114031, 114036, 114040, 114045, 114049, + 114054, 114059, 114064, 114069, 114074, 114079, 114084, 114089, 114094, + 114099, 114104, 114109, 114114, 114119, 114123, 114128, 114133, 114138, + 114142, 114146, 114151, 114156, 114161, 114165, 114169, 114173, 114177, + 114182, 114187, 114192, 114196, 114200, 114205, 114211, 114216, 114222, + 114227, 114233, 114239, 114246, 114251, 114257, 114262, 114268, 114273, + 114278, 114283, 114288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114293, 114301, 114308, 114316, + 114324, 114331, 114339, 114347, 114355, 114362, 114369, 114377, 114385, + 114393, 114401, 114409, 114417, 114425, 114433, 114441, 114449, 114457, + 114465, 114473, 114481, 114489, 114497, 114505, 114513, 114521, 114529, + 114537, 114545, 114553, 114560, 114568, 114576, 114583, 114591, 114599, + 114607, 114614, 114621, 114629, 114637, 114645, 114653, 114661, 114669, + 114677, 114685, 114693, 114701, 114709, 114717, 114725, 114733, 114741, + 114749, 114757, 114765, 114773, 114781, 114789, 114797, 114804, 114810, + 114816, 114822, 114828, 114834, 114840, 114846, 114852, 114858, 114865, + 114872, 114879, 114886, 114893, 114900, 114907, 114914, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 114921, 114927, 114933, 114940, 114946, 114953, 114959, + 114966, 0, 0, 114972, 0, 0, 114978, 114984, 114991, 114998, 115005, + 115012, 115019, 115026, 0, 115033, 115040, 0, 115047, 115054, 115061, + 115068, 115074, 115081, 115088, 115095, 115101, 115107, 115114, 115121, + 115128, 115134, 115140, 115147, 115153, 115159, 115166, 115173, 115180, + 115186, 115192, 115199, 115206, 115214, 115221, 115229, 115236, 115244, + 0, 115251, 115259, 0, 0, 115266, 115273, 115280, 115287, 115293, 115302, + 115309, 115315, 115322, 115329, 115336, 115344, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 115354, 115361, 115367, 115373, 115379, 115385, 115391, 115397, + 115403, 115409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 115415, 115419, 115424, 115428, 115433, 115437, 115442, 115447, + 0, 0, 115453, 115457, 115462, 115466, 115471, 115475, 115480, 115485, + 115490, 115495, 115500, 115505, 115510, 115515, 115520, 115525, 115530, + 115535, 115540, 115545, 115549, 115554, 115559, 115564, 115568, 115572, + 115577, 115582, 115587, 115591, 115595, 115599, 115603, 115608, 115613, + 115618, 115622, 115626, 115631, 115636, 115642, 115647, 115653, 115658, + 115664, 115670, 0, 0, 115677, 115682, 115688, 115693, 115699, 115704, + 115709, 115714, 115719, 115724, 115728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115735, 115740, 115746, + 115753, 115759, 115765, 115772, 115778, 115785, 115792, 115800, 115807, + 115812, 115818, 115824, 115830, 115836, 115842, 115848, 115854, 115860, + 115866, 115872, 115878, 115884, 115890, 115895, 115901, 115907, 115913, + 115918, 115923, 115929, 115935, 115941, 115946, 115952, 115958, 115964, + 115970, 115976, 115982, 115988, 115993, 115998, 116003, 116009, 116015, + 116021, 116026, 116031, 116037, 116043, 116049, 116055, 116064, 116073, + 116079, 116085, 116092, 116099, 116106, 116113, 116121, 116128, 116136, + 116142, 116148, 116155, 116162, 116171, 116181, 0, 0, 0, 0, 0, 0, 0, 0, + 116186, 116190, 116195, 116201, 116206, 116211, 116216, 116222, 116228, + 116234, 116240, 116246, 116252, 116256, 116261, 116266, 116271, 116276, + 116281, 116286, 116291, 116296, 116301, 116306, 116311, 116316, 116321, + 116326, 116330, 116335, 116340, 116345, 116349, 116353, 116358, 116363, + 116368, 116372, 116377, 116382, 116387, 116392, 116397, 116402, 116406, + 116410, 116414, 116419, 116424, 116429, 116433, 116437, 116442, 116447, + 116452, 116458, 116464, 116471, 116477, 116484, 116491, 116498, 116505, + 116512, 116519, 116526, 116532, 116538, 116545, 116552, 116559, 116564, + 116569, 116574, 116578, 116583, 116588, 116594, 116599, 116615, 116629, + 116640, 116646, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116652, 116660, 116668, 116676, 116684, + 116693, 116702, 116711, 116720, 116728, 116737, 116746, 116754, 116763, + 116772, 116780, 116789, 116797, 116806, 116814, 116823, 116832, 116840, + 116848, 116856, 116864, 116872, 116881, 116890, 116900, 116910, 116920, + 116930, 116940, 116949, 116959, 116969, 116979, 116990, 117000, 117012, + 117024, 117035, 117049, 117060, 117070, 117082, 117093, 117103, 117115, + 117127, 117138, 117149, 117159, 117169, 117181, 117192, 0, 0, 0, 0, 0, 0, + 0, 117204, 117208, 117213, 117217, 117222, 117226, 117231, 117236, + 117242, 0, 117247, 117251, 117256, 117260, 117265, 117269, 117274, + 117279, 117284, 117289, 117294, 117299, 117304, 117309, 117314, 117319, + 117324, 117329, 117334, 117339, 117343, 117348, 117353, 117358, 117362, + 117366, 117371, 117376, 117381, 117385, 117389, 117393, 117397, 117402, + 117407, 117412, 117416, 117420, 117426, 117431, 117437, 117442, 117448, + 117454, 117461, 0, 117467, 117472, 117478, 117483, 117489, 117494, + 117499, 117504, 117509, 117514, 117518, 117523, 117529, 117535, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 117541, 117546, 117550, 117554, 117558, 117562, + 117566, 117570, 117574, 117578, 117582, 117586, 117590, 117594, 117598, + 117602, 117606, 117610, 117614, 117618, 117623, 117628, 117633, 117638, + 117643, 117648, 117653, 117658, 117663, 0, 0, 0, 117670, 117675, 117680, + 117684, 117689, 117694, 117699, 117704, 117709, 117714, 117719, 117723, + 117728, 117733, 117737, 117741, 117746, 117751, 117755, 117760, 117765, + 117770, 117775, 117780, 117785, 117790, 117794, 117798, 117802, 117807, + 117811, 117815, 0, 0, 117819, 117825, 117832, 117839, 117846, 117853, + 117860, 117867, 117874, 117880, 117887, 117894, 117900, 117906, 117913, + 117920, 117926, 117933, 117940, 117947, 117954, 117961, 0, 117968, + 117974, 117980, 117986, 117993, 117999, 118005, 118011, 118017, 118022, + 118027, 118032, 118037, 118042, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118047, 118052, 118058, 118063, 118069, + 118074, 118080, 0, 118085, 118091, 0, 118096, 118102, 118107, 118113, + 118119, 118125, 118131, 118137, 118143, 118149, 118155, 118161, 118167, + 118173, 118179, 118185, 118191, 118196, 118202, 118208, 118214, 118219, + 118224, 118230, 118236, 118242, 118247, 118252, 118257, 118262, 118268, + 118274, 118280, 118285, 118290, 118296, 118302, 118308, 118314, 118321, + 118327, 118334, 118340, 118347, 0, 0, 0, 118354, 0, 118360, 118367, 0, + 118373, 118380, 118386, 118392, 118398, 118404, 118410, 118415, 118420, + 0, 0, 0, 0, 0, 0, 0, 0, 118425, 118431, 118436, 118441, 118446, 118451, + 118456, 118461, 118466, 118471, 0, 0, 0, 0, 0, 0, 118476, 118481, 118487, + 118492, 118498, 118503, 0, 118509, 118515, 0, 118521, 118527, 118533, + 118538, 118544, 118550, 118556, 118561, 118566, 118572, 118577, 118583, + 118588, 118594, 118600, 118606, 118612, 118617, 118623, 118629, 118635, + 118641, 118647, 118653, 118659, 118665, 118671, 118677, 118682, 118688, + 118693, 118698, 118703, 118710, 118716, 118723, 118729, 0, 118736, + 118743, 0, 118750, 118757, 118764, 118770, 118776, 118781, 0, 0, 0, 0, 0, + 0, 0, 118786, 118792, 118797, 118802, 118807, 118812, 118817, 118822, + 118827, 118832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 118837, 118841, 118846, 118851, 118855, 118860, 118864, 118868, + 118873, 118877, 118882, 118887, 118892, 118896, 118900, 118904, 118909, + 118913, 118917, 118921, 118926, 118931, 118936, 118941, 118945, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118952, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 118957, 118963, 118969, 118975, 118981, 118987, 118993, + 118999, 119005, 119011, 119017, 119023, 119029, 119035, 119041, 119047, + 119053, 119059, 119065, 119071, 119077, 119086, 119090, 119094, 119098, + 119102, 119106, 119110, 119114, 119118, 119122, 119126, 119130, 119134, + 119138, 119142, 119146, 119152, 119158, 119162, 119168, 119174, 119179, + 119183, 119188, 119192, 119196, 119202, 119208, 119212, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 119216, 119224, 119227, 119232, 119238, 119246, + 119251, 119257, 119265, 119271, 119277, 119281, 119285, 119292, 119301, + 119308, 119317, 119323, 119332, 119339, 119346, 119353, 119363, 119369, + 119373, 119380, 119389, 119399, 119406, 119413, 119417, 119421, 119428, + 119438, 119442, 119449, 119456, 119463, 119469, 119476, 119483, 119490, + 119497, 119501, 119505, 119509, 119516, 119520, 119527, 119534, 119548, + 119557, 119561, 119565, 119569, 119576, 119580, 119584, 119588, 119596, + 119604, 119623, 119633, 119653, 119657, 119661, 119665, 119669, 119673, + 119677, 119681, 119688, 119692, 119695, 119699, 119703, 119709, 119716, + 119725, 119729, 119738, 119747, 119755, 119759, 119766, 119770, 119774, + 119778, 119782, 119793, 119802, 119811, 119820, 119829, 119841, 119850, + 119859, 119868, 119876, 119885, 119897, 119906, 119914, 119923, 119935, + 119944, 119953, 119965, 119974, 119983, 119995, 120004, 120008, 120012, + 120016, 120020, 120024, 120028, 120032, 120039, 120043, 120047, 120058, + 120062, 120066, 120073, 120079, 120085, 120089, 120096, 120100, 120104, + 120108, 120112, 120116, 120120, 120126, 120134, 120138, 120142, 120145, + 120152, 120164, 120168, 120180, 120187, 120194, 120201, 120208, 120214, + 120218, 120222, 120226, 120230, 120237, 120246, 120253, 120261, 120269, + 120275, 120279, 120283, 120287, 120291, 120297, 120306, 120318, 120325, + 120332, 120341, 120352, 120358, 120367, 120376, 120383, 120392, 120399, + 120405, 120415, 120422, 120429, 120436, 120443, 120447, 120453, 120457, + 120468, 120476, 120485, 120497, 120504, 120511, 120521, 120528, 120537, + 120544, 120553, 120560, 120567, 120577, 120584, 120591, 120600, 120607, + 120619, 120628, 120635, 120642, 120649, 120658, 120668, 120681, 120688, + 120697, 120707, 120714, 120723, 120736, 120743, 120750, 120757, 120767, + 120777, 120783, 120793, 120800, 120807, 120817, 120823, 120830, 120837, + 120844, 120854, 120861, 120868, 120875, 120881, 120888, 120898, 120905, + 120909, 120917, 120921, 120933, 120937, 120951, 120955, 120959, 120963, + 120967, 120973, 120980, 120988, 120992, 120996, 121000, 121004, 121011, + 121015, 121021, 121027, 121035, 121039, 121046, 121054, 121058, 121062, + 121068, 121072, 121081, 121090, 121097, 121107, 121113, 121117, 121121, + 121129, 121136, 121143, 121149, 121153, 121161, 121165, 121172, 121184, + 121191, 121201, 121207, 121211, 121220, 121227, 121236, 121240, 121244, + 121251, 121255, 121259, 121263, 121267, 121270, 121276, 121282, 121286, + 121290, 121297, 121304, 121311, 121318, 121325, 121332, 121339, 121346, + 121352, 121356, 121360, 121367, 121374, 121381, 121388, 121395, 121399, + 121402, 121407, 121411, 121415, 121424, 121433, 121437, 121441, 121447, + 121453, 121470, 121476, 121480, 121489, 121493, 121497, 121504, 121512, + 121520, 121526, 121530, 121534, 121538, 121542, 121545, 121551, 121558, + 121568, 121575, 121582, 121589, 121595, 121602, 121609, 121616, 121623, + 121630, 121639, 121646, 121658, 121665, 121672, 121682, 121693, 121700, + 121707, 121714, 121721, 121728, 121735, 121742, 121749, 121756, 121763, + 121773, 121783, 121793, 121800, 121810, 121817, 121824, 121831, 121838, + 121844, 121851, 121858, 121865, 121872, 121879, 121886, 121893, 121900, + 121906, 121913, 121920, 121929, 121936, 121943, 121947, 121955, 121959, + 121963, 121967, 121971, 121975, 121982, 121986, 121995, 121999, 122006, + 122014, 122018, 122022, 122026, 122039, 122055, 122059, 122063, 122070, + 122076, 122083, 122087, 122091, 122095, 122099, 122103, 122110, 122114, + 122132, 122136, 122140, 122147, 122151, 122155, 122161, 122165, 122169, + 122177, 122181, 122185, 122188, 122192, 122198, 122209, 122218, 122227, + 122234, 122241, 122252, 122259, 122266, 122273, 122280, 122287, 122294, + 122301, 122311, 122317, 122324, 122334, 122343, 122350, 122359, 122369, + 122376, 122383, 122390, 122397, 122409, 122416, 122423, 122430, 122437, + 122444, 122454, 122461, 122468, 122478, 122491, 122503, 122510, 122520, + 122527, 122534, 122541, 122555, 122561, 122569, 122579, 122589, 122596, + 122603, 122609, 122613, 122620, 122630, 122636, 122649, 122653, 122657, + 122664, 122668, 122675, 122685, 122689, 122693, 122697, 122701, 122705, + 122712, 122716, 122723, 122730, 122737, 122746, 122755, 122765, 122772, + 122779, 122786, 122796, 122803, 122813, 122820, 122830, 122837, 122844, + 122854, 122864, 122871, 122877, 122885, 122893, 122899, 122905, 122909, + 122913, 122920, 122928, 122934, 122938, 122942, 122946, 122953, 122965, + 122968, 122975, 122981, 122985, 122989, 122993, 122997, 123001, 123005, + 123009, 123013, 123017, 123021, 123028, 123032, 123038, 123042, 123046, + 123050, 123056, 123063, 123070, 123077, 123088, 123096, 123100, 123106, + 123115, 123122, 123128, 123131, 123135, 123139, 123145, 123154, 123162, + 123166, 123172, 123176, 123180, 123184, 123190, 123197, 123203, 123207, + 123213, 123217, 123221, 123230, 123242, 123246, 123253, 123260, 123270, + 123277, 123289, 123296, 123303, 123310, 123321, 123331, 123344, 123354, + 123361, 123365, 123369, 123373, 123377, 123386, 123395, 123404, 123421, + 123430, 123436, 123443, 123451, 123464, 123468, 123477, 123486, 123495, + 123504, 123515, 123524, 123532, 123541, 123550, 123559, 123568, 123578, + 123581, 123585, 123589, 123593, 123597, 123601, 123607, 123614, 123621, + 123628, 123634, 123640, 123647, 123653, 123660, 123668, 123672, 123679, + 123686, 123693, 123701, 123704, 123708, 123712, 123716, 123719, 123725, + 123729, 123735, 123742, 123749, 123755, 123762, 123769, 123776, 123783, + 123790, 123797, 123804, 123811, 123818, 123825, 123832, 123839, 123846, + 123853, 123859, 123863, 123872, 123876, 123880, 123884, 123888, 123894, + 123901, 123908, 123915, 123922, 123929, 123935, 123943, 123947, 123951, + 123955, 123959, 123965, 123982, 123999, 124003, 124007, 124011, 124015, + 124019, 124023, 124029, 124036, 124040, 124046, 124053, 124060, 124067, + 124074, 124081, 124090, 124097, 124104, 124111, 124118, 124122, 124126, + 124132, 124144, 124148, 124152, 124161, 124165, 124169, 124173, 124179, + 124183, 124187, 124196, 124200, 124204, 124208, 124215, 124219, 124223, + 124227, 124231, 124235, 124239, 124243, 124246, 124252, 124259, 124266, + 124272, 124276, 124293, 124299, 124303, 124309, 124315, 124321, 124327, + 124333, 124339, 124343, 124347, 124351, 124357, 124361, 124367, 124371, + 124375, 124382, 124389, 124406, 124410, 124414, 124418, 124422, 124426, + 124438, 124441, 124446, 124451, 124466, 124476, 124488, 124492, 124496, + 124500, 124506, 124513, 124520, 124530, 124542, 124548, 124554, 124563, + 124567, 124571, 124578, 124588, 124595, 124601, 124605, 124609, 124616, + 124622, 124626, 124632, 124636, 124644, 124650, 124654, 124662, 124670, + 124677, 124683, 124690, 124697, 124707, 124717, 124721, 124725, 124729, + 124733, 124739, 124746, 124752, 124759, 124766, 124773, 124782, 124789, + 124796, 124802, 124809, 124816, 124823, 124830, 124837, 124844, 124850, + 124857, 124864, 124871, 124880, 124887, 124894, 124898, 124904, 124908, + 124914, 124921, 124928, 124935, 124939, 124943, 124947, 124951, 124955, + 124962, 124966, 124970, 124976, 124984, 124988, 124992, 124996, 125000, + 125007, 125011, 125015, 125023, 125027, 125031, 125035, 125039, 125045, + 125049, 125053, 125059, 125066, 125072, 125079, 125091, 125095, 125102, + 125109, 125116, 125123, 125135, 125142, 125146, 125150, 125154, 125161, + 125168, 125175, 125182, 125192, 125199, 125205, 125212, 125219, 125226, + 125233, 125242, 125252, 125259, 125263, 125270, 125274, 125278, 125282, + 125289, 125296, 125306, 125312, 125316, 125325, 125329, 125336, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 125340, 125346, 125352, 125359, 125366, 125373, 125380, 125387, + 125394, 125400, 125407, 125414, 125421, 125428, 125435, 125442, 125448, + 125454, 125460, 125466, 125472, 125478, 125484, 125490, 125496, 125503, + 125510, 125517, 125524, 125531, 125538, 125544, 125550, 125556, 125563, + 125570, 125576, 125582, 125591, 125598, 125605, 125612, 125619, 125626, + 125633, 125639, 125645, 125651, 125660, 125667, 125674, 125685, 125696, + 125702, 125708, 125714, 125723, 125730, 125737, 125747, 125757, 125768, + 125779, 125791, 125804, 125815, 125826, 125838, 125851, 125862, 125873, + 125884, 125895, 125906, 125918, 125926, 125934, 125943, 125952, 125961, + 125967, 125973, 125979, 125986, 125996, 126003, 126013, 126018, 126023, + 126029, 126035, 126043, 126051, 126060, 126071, 126082, 126090, 126098, + 126107, 126116, 126124, 126131, 126139, 126147, 126154, 126161, 126170, + 126179, 126188, 126197, 126206, 0, 126215, 126226, 126233, 126241, + 126249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126257, 126266, 126273, 126280, + 126289, 126296, 126303, 126310, 126320, 126327, 126334, 126341, 126349, + 126356, 126363, 126370, 126381, 126388, 126395, 126402, 126409, 126416, + 126425, 126432, 126438, 126445, 126454, 126461, 126468, 126475, 126485, + 126492, 126499, 126509, 126519, 126526, 126533, 126540, 126547, 126554, + 126561, 126570, 126577, 126584, 126590, 126598, 126607, 126616, 126627, + 126635, 126644, 126653, 126662, 126671, 126678, 126685, 126694, 126706, + 126716, 126723, 126730, 126740, 126750, 126759, 126769, 126776, 126786, + 126793, 126800, 126807, 126817, 126827, 126834, 126841, 126851, 126857, + 126868, 126877, 126887, 126895, 126908, 126915, 126921, 126929, 126936, + 126946, 126950, 126954, 126958, 126962, 126966, 126970, 126974, 126983, + 126987, 126994, 126998, 127002, 127006, 127010, 127014, 127018, 127022, + 127026, 127030, 127034, 127038, 127042, 127046, 127050, 127054, 127058, + 127062, 127066, 127070, 127077, 127084, 127094, 127107, 127117, 127121, + 127125, 127129, 127133, 127137, 127141, 127145, 127149, 127153, 127157, + 127161, 127168, 127175, 127186, 127193, 127199, 127206, 127213, 127220, + 127227, 127234, 127238, 127242, 127249, 127256, 127263, 127272, 127279, + 127292, 127302, 127309, 127316, 127320, 127324, 127333, 127340, 127347, + 127354, 127367, 127374, 127381, 127391, 127401, 127410, 127417, 127424, + 127431, 127438, 127445, 127452, 127462, 127468, 127476, 127483, 127491, + 127498, 127509, 127516, 127522, 127529, 127536, 127543, 127550, 127560, + 127570, 127577, 127584, 127593, 127601, 127607, 127614, 127621, 127628, + 127635, 127639, 127649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 127659, 127663, 127667, 127671, 127675, 127679, 127683, + 127687, 127691, 127695, 127699, 127703, 127707, 127711, 127715, 127719, + 127723, 127727, 127731, 127735, 127739, 127743, 127747, 127751, 127755, + 127759, 127763, 127767, 127771, 127775, 127779, 127783, 127787, 127791, + 127795, 127799, 127803, 127807, 127811, 127815, 127819, 127823, 127827, + 127831, 127835, 127839, 127843, 127847, 127851, 127855, 127859, 127863, + 127867, 127871, 127875, 127879, 127883, 127887, 127891, 127895, 127899, + 127903, 127907, 127911, 127915, 127919, 127923, 127927, 127931, 127935, + 127939, 127943, 127947, 127951, 127955, 127959, 127963, 127967, 127971, + 127975, 127979, 127983, 127987, 127991, 127995, 127999, 128003, 128007, + 128011, 128015, 128019, 128023, 128027, 128031, 128035, 128039, 128043, + 128047, 128051, 128055, 128059, 128063, 128067, 128071, 128075, 128079, + 128083, 128087, 128091, 128095, 128099, 128103, 128107, 128111, 128115, + 128119, 128123, 128127, 128131, 128135, 128139, 128143, 128147, 128151, + 128155, 128159, 128163, 128167, 128171, 128175, 128179, 128183, 128187, + 128191, 128195, 128199, 128203, 128207, 128211, 128215, 128219, 128223, + 128227, 128231, 128235, 128239, 128243, 128247, 128251, 128255, 128259, + 128263, 128267, 128271, 128275, 128279, 128283, 128287, 128291, 128295, + 128299, 128303, 128307, 128311, 128315, 128319, 128323, 128327, 128331, + 128335, 128339, 128343, 128347, 128351, 128355, 128359, 128363, 128367, + 128371, 128375, 128379, 128383, 128387, 128391, 128395, 128399, 128403, + 128407, 128411, 128415, 128419, 128423, 128427, 128431, 128435, 128439, + 128443, 128447, 128451, 128455, 128459, 128463, 128467, 128471, 128475, + 128479, 128483, 128487, 128491, 128495, 128499, 128503, 128507, 128511, + 128515, 128519, 128523, 128527, 128531, 128535, 128539, 128543, 128547, + 128551, 128555, 128559, 128563, 128567, 128571, 128575, 128579, 128583, + 128587, 128591, 128595, 128599, 128603, 128607, 128611, 128615, 128619, + 128623, 128627, 128631, 128635, 128639, 128643, 128647, 128651, 128655, + 128659, 128663, 128667, 128671, 128675, 128679, 128683, 128687, 128691, + 128695, 128699, 128703, 128707, 128711, 128715, 128719, 128723, 128727, + 128731, 128735, 128739, 128743, 128747, 128751, 128755, 128759, 128763, + 128767, 128771, 128775, 128779, 128783, 128787, 128791, 128795, 128799, + 128803, 128807, 128811, 128815, 128819, 128823, 128827, 128831, 128835, + 128839, 128843, 128847, 128851, 128855, 128859, 128863, 128867, 128871, + 128875, 128879, 128883, 128887, 128891, 128895, 128899, 128903, 128907, + 128911, 128915, 128919, 128923, 128927, 128931, 128935, 128939, 128943, + 128947, 128951, 128955, 128959, 128963, 128967, 128971, 128975, 128979, + 128983, 128987, 128991, 128995, 128999, 129003, 129007, 129011, 129015, + 129019, 129023, 129027, 129031, 129035, 129039, 129043, 129047, 129051, + 129055, 129059, 129063, 129067, 129071, 129075, 129079, 129083, 129087, + 129091, 129095, 129099, 129103, 129107, 129111, 129115, 129119, 129123, + 129127, 129131, 129135, 129139, 129143, 129147, 129151, 129155, 129159, + 129163, 129167, 129171, 129175, 129179, 129183, 129187, 129191, 129195, + 129199, 129203, 129207, 129211, 129215, 129219, 129223, 129227, 129231, + 129235, 129239, 129243, 129247, 129251, 129255, 129259, 129263, 129267, + 129271, 129275, 129279, 129283, 129287, 129291, 129295, 129299, 129303, + 129307, 129311, 129315, 129319, 129323, 129327, 129331, 129335, 129339, + 129343, 129347, 129351, 129355, 129359, 129363, 129367, 129371, 129375, + 129379, 129383, 129387, 129391, 129395, 129399, 129403, 129407, 129411, + 129415, 129419, 129423, 129427, 129431, 129435, 129439, 129443, 129447, + 129451, 129455, 129459, 129463, 129467, 129471, 129475, 129479, 129483, + 129487, 129491, 129495, 129499, 129503, 129507, 129511, 129515, 129519, + 129523, 129527, 129531, 129535, 129539, 129543, 129547, 129551, 129555, + 129559, 129563, 129567, 129571, 129575, 129579, 129583, 129587, 129591, + 129595, 129599, 129603, 129607, 129611, 129615, 129619, 129623, 129627, + 129631, 129635, 129639, 129643, 129647, 129651, 129655, 129659, 129663, + 129667, 129671, 129675, 129679, 129683, 129687, 129691, 129695, 129699, + 129703, 129707, 129711, 129715, 129719, 129723, 129727, 129731, 129735, + 129739, 129743, 129747, 129751, 129755, 129759, 129763, 129767, 129771, + 129775, 129779, 129783, 129787, 129791, 129795, 129799, 129803, 129807, + 129811, 129815, 129819, 129823, 129827, 129831, 129835, 129839, 129843, + 129847, 129851, 129855, 129859, 129863, 129867, 129871, 129875, 129879, + 129883, 129887, 129891, 129895, 129899, 129903, 129907, 129911, 129915, + 129919, 129923, 129927, 129931, 129935, 129939, 129943, 129947, 129951, + 129955, 129959, 129963, 129967, 129971, 129975, 129979, 129983, 129987, + 129991, 129995, 129999, 130003, 130007, 130011, 130015, 130019, 130023, + 130027, 130031, 130035, 130039, 130043, 130047, 130051, 130055, 130059, + 130063, 130067, 130071, 130075, 130079, 130083, 130087, 130091, 130095, + 130099, 130103, 130107, 130111, 130115, 130119, 130123, 130127, 130131, + 130135, 130139, 130143, 130147, 130151, 130155, 130159, 130163, 130167, + 130171, 130175, 130179, 130183, 130187, 130191, 130195, 130199, 130203, + 130207, 130211, 130215, 130219, 130223, 130227, 130231, 130235, 130239, + 130243, 130247, 130251, 130255, 130259, 130263, 130267, 130271, 130275, + 130279, 130283, 130287, 130291, 130295, 130299, 130303, 130307, 130311, + 130315, 130319, 130323, 130327, 130331, 130335, 130339, 130343, 130347, + 130351, 130355, 130359, 130363, 130367, 130371, 130375, 130379, 130383, + 130387, 130391, 130395, 130399, 130403, 130407, 130411, 130415, 130419, + 130423, 130427, 130431, 130435, 130439, 130443, 130447, 130451, 130455, + 130459, 130463, 130467, 130471, 130475, 130479, 130483, 130487, 130491, + 130495, 130499, 130503, 130507, 130511, 130515, 130519, 130523, 130527, + 130531, 130535, 130539, 130543, 130547, 130551, 130555, 130559, 130563, + 130567, 130571, 130575, 130579, 130583, 130587, 130591, 130595, 130599, + 130603, 130607, 130611, 130615, 130619, 130623, 130627, 130631, 130635, + 130639, 130643, 130647, 130651, 130655, 130659, 130663, 130667, 130671, + 130675, 130679, 130683, 130687, 130691, 130695, 130699, 130703, 130707, + 130711, 130715, 130719, 130723, 130727, 130731, 130735, 130739, 130743, + 130747, 130751, 130755, 130759, 130763, 130767, 130771, 130775, 130779, + 130783, 130787, 130791, 130795, 130799, 130803, 130807, 130811, 130815, + 130819, 130823, 130827, 130831, 130835, 130839, 130843, 130847, 130851, + 130855, 130859, 130863, 130867, 130871, 130875, 130879, 130883, 130887, + 130891, 130895, 130899, 130903, 130907, 130911, 130915, 130919, 130923, + 130927, 130931, 130935, 130939, 130943, 130947, 130951, 130955, 130959, + 130963, 130967, 130971, 130975, 130979, 130983, 130987, 130991, 130995, + 130999, 131003, 131007, 131011, 131015, 131019, 131023, 131027, 131031, + 131035, 131039, 131043, 131047, 131051, 131055, 131059, 131063, 131067, + 131071, 131075, 131079, 131083, 131087, 131091, 131095, 131099, 131103, + 131107, 131111, 131115, 131119, 131123, 131127, 131131, 131135, 131139, + 131143, 131147, 131151, 131155, 131159, 131163, 131167, 131171, 131175, + 131179, 131183, 131187, 131191, 131195, 131199, 131203, 131207, 131211, + 131215, 131219, 131223, 131227, 131231, 131235, 131239, 131243, 131247, + 131251, 131255, 131259, 131263, 131267, 131271, 131275, 131279, 131283, + 131287, 131291, 131295, 131299, 131303, 131307, 131311, 131315, 131319, + 131323, 131327, 131331, 131335, 131339, 131343, 131347, 131351, 131355, + 131359, 131363, 131367, 131371, 131375, 131379, 131383, 131387, 131391, + 131395, 131399, 131403, 131407, 131411, 131415, 131419, 131423, 131427, + 131431, 131435, 131439, 131443, 131447, 131451, 131455, 131459, 131463, + 131467, 131471, 131475, 131479, 131483, 131487, 131491, 131495, 131499, + 131503, 131507, 131511, 131515, 131519, 131523, 131527, 131531, 131535, + 131539, 131543, 131547, 131551, 131555, 131559, 131563, 131567, 131571, + 131575, 131579, 131583, 131587, 131591, 131595, 131599, 131603, 131607, + 131611, 131615, 131619, 131623, 131627, 131631, 131635, 131639, 131643, + 131647, 131651, 131655, 131659, 131663, 131667, 131671, 131675, 131679, + 131683, 131687, 131691, 131695, 131699, 131703, 131707, 131711, 131715, + 131719, 131723, 131727, 131731, 131735, 131739, 131743, 131747, 131751, + 131755, 131759, 131763, 131767, 131771, 131775, 131779, 131783, 131787, + 131791, 131795, 131799, 131803, 131807, 131811, 131815, 131819, 131823, + 131827, 131831, 131835, 131839, 131843, 131847, 131851, 131855, 131859, + 131863, 131867, 131871, 131875, 131879, 131883, 131887, 131891, 131895, + 131899, 131903, 131907, 131911, 131915, 131919, 131923, 131927, 131931, + 131935, 131939, 0, 131943, 131948, 131954, 131964, 131974, 131984, + 131994, 132000, 132006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132012, 132016, 132020, + 132024, 132028, 132032, 132036, 132040, 132044, 132048, 132052, 132056, + 132060, 132064, 132068, 132072, 132076, 132080, 132084, 132088, 132092, + 132096, 132100, 132104, 132108, 132112, 132116, 132120, 132124, 132128, + 132132, 132136, 132140, 132144, 132148, 132152, 132156, 132160, 132164, + 132168, 132172, 132176, 132180, 132184, 132188, 132192, 132196, 132200, + 132204, 132208, 132212, 132216, 132220, 132224, 132228, 132232, 132236, + 132240, 132244, 132248, 132252, 132256, 132260, 132264, 132268, 132272, + 132276, 132280, 132284, 132288, 132292, 132296, 132300, 132304, 132308, + 132312, 132316, 132320, 132324, 132328, 132332, 132336, 132340, 132344, + 132348, 132352, 132356, 132360, 132364, 132368, 132372, 132376, 132380, + 132384, 132388, 132392, 132396, 132400, 132404, 132408, 132412, 132416, 132420, 132424, 132428, 132432, 132436, 132440, 132444, 132448, 132452, - 132456, 132465, 132474, 132478, 132482, 132486, 132490, 132494, 132498, - 132502, 132506, 132510, 132514, 132518, 132522, 132526, 132530, 132534, - 132538, 132542, 132546, 132550, 132554, 132558, 132562, 132566, 132570, - 132574, 132578, 132582, 132586, 132590, 132594, 132598, 132602, 132606, - 132610, 132614, 132618, 132622, 132626, 132630, 132634, 132638, 132642, - 132646, 132650, 132654, 132658, 132662, 132666, 132670, 132674, 132678, - 132682, 132686, 132690, 132694, 132698, 132702, 132706, 132710, 132714, - 132718, 132722, 132726, 132730, 132734, 132738, 132742, 132746, 132750, - 132754, 132758, 132762, 132766, 132770, 132774, 132778, 132782, 132786, - 132790, 132794, 132798, 132802, 132806, 132810, 132814, 132818, 132822, - 132826, 132830, 132834, 132838, 132842, 132846, 132850, 132854, 132858, - 132862, 132866, 132870, 132874, 132878, 132882, 132886, 132890, 132894, - 132898, 132902, 132906, 132910, 132914, 132918, 132922, 132926, 132930, - 132934, 132938, 132942, 132946, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 132456, 132460, 132464, 132468, 132472, 132476, 132480, 132484, 132488, + 132492, 132496, 132500, 132504, 132508, 132512, 132516, 132520, 132524, + 132528, 132532, 132536, 132540, 132544, 132548, 132552, 132556, 132560, + 132564, 132568, 132572, 132576, 132580, 132584, 132588, 132592, 132596, + 132600, 132604, 132608, 132612, 132616, 132620, 132624, 132628, 132632, + 132636, 132640, 132644, 132648, 132652, 132656, 132660, 132664, 132668, + 132672, 132676, 132680, 132684, 132688, 132692, 132696, 132700, 132704, + 132708, 132712, 132716, 132720, 132724, 132728, 132732, 132736, 132740, + 132744, 132748, 132752, 132756, 132760, 132764, 132768, 132772, 132776, + 132780, 132784, 132788, 132792, 132796, 132800, 132804, 132808, 132812, + 132816, 132820, 132824, 132828, 132832, 132836, 132840, 132844, 132848, + 132852, 132856, 132860, 132864, 132868, 132872, 132876, 132880, 132884, + 132888, 132892, 132896, 132900, 132904, 132908, 132912, 132916, 132920, + 132924, 132928, 132932, 132936, 132940, 132944, 132948, 132952, 132956, + 132960, 132964, 132968, 132972, 132976, 132980, 132984, 132988, 132992, + 132996, 133000, 133004, 133008, 133012, 133016, 133020, 133024, 133028, + 133032, 133036, 133040, 133044, 133048, 133052, 133056, 133060, 133064, + 133068, 133072, 133076, 133080, 133084, 133088, 133092, 133096, 133100, + 133104, 133108, 133112, 133116, 133120, 133124, 133128, 133132, 133136, + 133140, 133144, 133148, 133152, 133156, 133160, 133164, 133168, 133172, + 133176, 133180, 133184, 133188, 133192, 133196, 133200, 133204, 133208, + 133212, 133216, 133220, 133224, 133228, 133232, 133236, 133240, 133244, + 133248, 133252, 133256, 133260, 133264, 133268, 133272, 133276, 133280, + 133284, 133288, 133292, 133296, 133300, 133304, 133308, 133312, 133316, + 133320, 133324, 133328, 133332, 133336, 133340, 133344, 133348, 133352, + 133356, 133360, 133364, 133368, 133372, 133376, 133380, 133384, 133388, + 133392, 133396, 133400, 133404, 133408, 133412, 133416, 133420, 133424, + 133428, 133432, 133436, 133440, 133444, 133448, 133452, 133456, 133460, + 133464, 133468, 133472, 133476, 133480, 133484, 133488, 133492, 133496, + 133500, 133504, 133508, 133512, 133516, 133520, 133524, 133528, 133532, + 133536, 133540, 133544, 133548, 133552, 133556, 133560, 133564, 133568, + 133572, 133576, 133580, 133584, 133588, 133592, 133596, 133600, 133604, + 133608, 133612, 133616, 133620, 133624, 133628, 133632, 133636, 133640, + 133644, 133648, 133652, 133656, 133660, 133664, 133668, 133672, 133676, + 133680, 133684, 133688, 133692, 133696, 133700, 133704, 133708, 133712, + 133716, 133720, 133724, 133728, 133732, 133736, 133740, 133744, 133754, + 133758, 133762, 133766, 133770, 133774, 133778, 133782, 133786, 133790, + 133794, 133798, 133803, 133807, 133811, 133815, 133819, 133823, 133827, + 133831, 133835, 133839, 133843, 133847, 133851, 133855, 133859, 133863, + 133867, 133876, 133885, 133889, 133893, 133897, 133901, 133905, 133909, + 133913, 133917, 133921, 133925, 133929, 133933, 133937, 133941, 133945, + 133949, 133953, 133957, 133961, 133965, 133969, 133973, 133977, 133981, + 133985, 133989, 133993, 133997, 134001, 134005, 134009, 134013, 134017, + 134021, 134025, 134029, 134033, 134037, 134041, 134045, 134049, 134053, + 134057, 134061, 134065, 134069, 134073, 134077, 134081, 134085, 134089, + 134093, 134097, 134101, 134105, 134109, 134113, 134117, 134121, 134125, + 134129, 134133, 134137, 134141, 134145, 134149, 134153, 134157, 134161, + 134165, 134169, 134173, 134177, 134181, 134185, 134189, 134193, 134197, + 134201, 134205, 134209, 134213, 134217, 134221, 134225, 134229, 134233, + 134237, 134241, 134245, 134249, 134253, 134257, 134261, 134265, 134269, + 134273, 134277, 134281, 134285, 134289, 134293, 134297, 134301, 134305, + 134309, 134313, 134317, 134321, 134325, 134329, 134333, 134337, 134341, + 134345, 134349, 134353, 134357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 134361, 134369, 134377, 134387, 134397, 134405, 134411, 134419, + 134427, 134437, 134449, 134461, 134467, 134475, 134481, 134487, 134493, + 134499, 134505, 134511, 134517, 134523, 134529, 134535, 134541, 134549, + 134557, 134563, 134569, 134575, 134581, 134589, 134597, 134606, 134612, + 134620, 134626, 134632, 134638, 134644, 134650, 134658, 134666, 134672, + 134678, 134684, 134690, 134696, 134702, 134708, 134714, 134720, 134726, + 134732, 134738, 134744, 134750, 134756, 134762, 134768, 134774, 134780, + 134788, 134794, 134800, 134810, 134818, 134824, 134830, 134836, 134842, + 134848, 134854, 134860, 134866, 134872, 134878, 134884, 134890, 134896, + 134902, 134908, 134914, 134920, 134926, 134932, 134938, 134944, 134950, + 134958, 134964, 134972, 134980, 134988, 134994, 135000, 135006, 135012, + 135018, 135026, 135036, 135044, 135052, 135058, 135064, 135072, 135080, + 135086, 135094, 135102, 135110, 135116, 135122, 135128, 135134, 135140, + 135146, 135154, 135162, 135168, 135174, 135180, 135186, 135192, 135200, + 135206, 135212, 135218, 135224, 135230, 135236, 135244, 135250, 135256, + 135262, 135268, 135276, 135284, 135290, 135296, 135302, 135307, 135313, + 135319, 135327, 135333, 135339, 135345, 135351, 135357, 135363, 135369, + 135375, 135381, 135391, 135399, 135405, 135411, 135417, 135425, 135431, + 135437, 135443, 135451, 135457, 135463, 135469, 135475, 135481, 135487, + 135493, 135499, 135505, 135511, 135517, 135525, 135531, 135539, 135545, + 135551, 135559, 135565, 135571, 135577, 135583, 135589, 135595, 135601, + 135607, 135613, 135619, 135625, 135631, 135637, 135643, 135649, 135655, + 135661, 135667, 135673, 135681, 135687, 135693, 135699, 135705, 135711, + 135717, 135723, 135729, 135735, 135741, 135747, 135753, 135759, 135767, + 135773, 135779, 135787, 135793, 135799, 135805, 135811, 135817, 135823, + 135829, 135835, 135841, 135847, 135855, 135861, 135867, 135873, 135879, + 135885, 135893, 135901, 135907, 135913, 135919, 135925, 135931, 135937, + 135942, 135947, 135952, 135957, 135962, 135967, 135972, 135977, 135982, + 135987, 135992, 135997, 136002, 136007, 136012, 136017, 136022, 136027, + 136032, 136037, 136042, 136047, 136052, 136057, 136062, 136067, 136072, + 136077, 136082, 136087, 136094, 136099, 136104, 136109, 136114, 136119, + 136124, 136129, 136134, 136139, 136144, 136149, 136154, 136159, 136164, + 136169, 136174, 136179, 136184, 136189, 136194, 136199, 136204, 136209, + 136214, 136219, 136224, 136229, 136234, 136239, 136244, 136249, 136254, + 136259, 136264, 136269, 136274, 136279, 136284, 136289, 136294, 136299, + 136304, 136309, 136314, 136319, 136324, 136329, 136334, 136339, 136344, + 136349, 136354, 136359, 136364, 136369, 136374, 136379, 136384, 136391, + 136396, 136401, 136406, 136411, 136416, 136421, 136426, 136431, 136436, + 136441, 136446, 136451, 136456, 136461, 136466, 136471, 136476, 136481, + 136486, 136491, 136496, 136503, 136508, 136513, 136519, 136524, 136529, + 136534, 136539, 136544, 136549, 136554, 136559, 136564, 136569, 136574, + 136579, 136584, 136589, 136594, 136599, 136604, 136609, 136614, 136619, + 136624, 136629, 136634, 136639, 136644, 136649, 136654, 136659, 136664, + 136669, 136674, 136679, 136684, 136689, 136694, 136699, 136704, 136709, + 136714, 136719, 136724, 136729, 136734, 136741, 136746, 136751, 136758, + 136765, 136770, 136775, 136780, 136785, 136790, 136795, 136800, 136805, + 136810, 136815, 136820, 136825, 136830, 136835, 136840, 136845, 136850, + 136855, 136860, 136865, 136870, 136875, 136880, 136885, 136890, 136897, + 136902, 136907, 136912, 136917, 136922, 136927, 136932, 136937, 136942, + 136947, 136952, 136957, 136962, 136967, 136972, 136977, 136982, 136987, + 136994, 136999, 137004, 137009, 137014, 137019, 137024, 137029, 137035, + 137040, 137045, 137050, 137055, 137060, 137065, 137070, 137075, 137082, + 137089, 137094, 137099, 137103, 137108, 137112, 137116, 137121, 137128, + 137133, 137138, 137147, 137152, 137157, 137162, 137167, 137174, 137181, + 137186, 137191, 137196, 137201, 137208, 137213, 137218, 137223, 137228, + 137233, 137238, 137243, 137248, 137253, 137258, 137263, 137268, 137275, + 137279, 137284, 137289, 137294, 137299, 137303, 137308, 137313, 137318, + 137323, 137328, 137333, 137338, 137343, 137348, 137354, 137360, 137366, + 137372, 137378, 137383, 137389, 137395, 137401, 137407, 137413, 137419, + 137425, 137431, 137437, 137443, 137449, 137455, 137461, 137467, 137473, + 137479, 137485, 137491, 137496, 137502, 137508, 137514, 137520, 137526, + 137532, 137538, 137544, 137550, 137556, 137562, 137568, 137574, 137580, + 137586, 137592, 137598, 137604, 137610, 137616, 137621, 137627, 137633, + 137639, 137645, 137651, 0, 0, 0, 0, 0, 0, 0, 137657, 137661, 137666, + 137671, 137676, 137681, 137686, 137690, 137695, 137700, 137705, 137710, + 137715, 137720, 137725, 137730, 137735, 137739, 137744, 137748, 137753, + 137758, 137763, 137768, 137773, 137777, 137782, 137787, 137791, 137796, + 137801, 0, 137806, 137811, 137815, 137819, 137823, 137827, 137831, + 137835, 137839, 137843, 0, 0, 0, 0, 137847, 137851, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137856, 137863, + 137869, 137876, 137883, 137890, 137897, 137904, 137911, 137918, 137925, + 137932, 137939, 137946, 137953, 137960, 137967, 137974, 137980, 137987, + 137994, 138001, 138007, 138014, 138020, 138026, 138033, 138039, 138046, + 138052, 0, 0, 138058, 138066, 138074, 138083, 138092, 138101, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 138109, 138114, 138119, 138124, 138129, 138134, 138139, + 138144, 138149, 138154, 138159, 138164, 138169, 138174, 138179, 138184, + 138189, 138194, 138199, 138204, 138209, 138214, 138219, 138224, 138229, + 138234, 138239, 138244, 138249, 138254, 138259, 138264, 138269, 138274, + 138279, 138284, 138289, 138294, 138299, 138304, 138309, 138314, 138319, + 138324, 138329, 138334, 138339, 138344, 138349, 138356, 138363, 138370, + 138377, 138384, 138391, 138398, 138405, 138414, 138421, 138428, 138435, + 138442, 138449, 138456, 138463, 138470, 138477, 138484, 138491, 138496, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138505, 138510, 138514, 138518, 138522, + 138526, 138530, 138534, 138538, 138542, 0, 138546, 138551, 138556, + 138563, 138568, 138575, 138582, 0, 138587, 138594, 138599, 138604, + 138611, 138618, 138623, 138628, 138633, 138638, 138643, 138650, 138657, + 138662, 138667, 138672, 138685, 138694, 138701, 138710, 138719, 0, 0, 0, + 0, 0, 138728, 138735, 138742, 138749, 138756, 138763, 138770, 138777, + 138784, 138791, 138798, 138805, 138812, 138819, 138826, 138833, 138840, + 138847, 138854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138861, 138867, 138873, 138879, + 138885, 138891, 138897, 138903, 138909, 138915, 138921, 138927, 138932, + 138938, 138943, 138949, 138954, 138960, 138966, 138971, 138977, 138982, + 138988, 138994, 139000, 139006, 139012, 139018, 139024, 139029, 139034, + 139040, 139046, 139052, 139058, 139064, 139070, 139076, 139082, 139088, + 139094, 139100, 139106, 139112, 139117, 139123, 139128, 139134, 139139, + 139145, 139151, 139156, 139162, 139167, 139173, 139179, 139185, 139191, + 139197, 139203, 139209, 139214, 139219, 139225, 139231, 139236, 139240, + 139244, 139248, 139252, 139256, 139260, 139264, 139268, 139272, 139277, + 139282, 139287, 139292, 139297, 139302, 139307, 139312, 139317, 139322, + 139329, 139336, 139343, 139347, 139353, 139358, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139364, + 139367, 139371, 139375, 139379, 139382, 139386, 139391, 139395, 139399, + 139403, 139406, 139410, 139415, 139419, 139423, 139427, 139430, 139434, + 139439, 139444, 139448, 139452, 139455, 139459, 139463, 139467, 139471, + 139475, 139479, 139483, 139486, 139490, 139494, 139498, 139502, 139506, + 139510, 139516, 139519, 139523, 139527, 139531, 139535, 139539, 139543, + 139547, 139551, 139555, 139560, 139565, 139571, 139575, 139579, 139583, + 139587, 139591, 139595, 139600, 139603, 139607, 139611, 139615, 139619, + 139625, 139629, 139633, 139637, 139641, 139645, 139649, 139653, 139657, + 139661, 139665, 0, 0, 0, 0, 139669, 139674, 139678, 139682, 139688, + 139694, 139698, 139703, 139708, 139713, 139718, 139722, 139727, 139732, + 139737, 139741, 139746, 139751, 139756, 139760, 139765, 139770, 139775, + 139780, 139785, 139790, 139795, 139800, 139804, 139809, 139814, 139819, + 139824, 139829, 139834, 139839, 139844, 139849, 139854, 139859, 139866, + 139871, 139878, 139883, 139888, 139893, 139898, 139903, 139908, 139913, + 139918, 139923, 139928, 139933, 139938, 139943, 139948, 0, 0, 0, 0, 0, 0, + 0, 139953, 139957, 139963, 139966, 139969, 139973, 139977, 139981, + 139985, 139989, 139993, 139997, 140003, 140009, 140015, 140021, 140027, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140033, 140037, 140041, + 140047, 140053, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140058, 140067, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140076, 140079, 140082, 140085, 140088, + 140091, 140094, 140097, 140100, 140103, 140106, 140109, 140112, 140115, + 140118, 140121, 140124, 140127, 140130, 140133, 140136, 140139, 140142, + 140145, 140148, 140151, 140154, 140157, 140160, 140163, 140166, 140169, + 140172, 140175, 140178, 140181, 140184, 140187, 140190, 140193, 140196, + 140199, 140202, 140205, 140208, 140211, 140214, 140217, 140220, 140223, + 140226, 140229, 140232, 140235, 140238, 140241, 140244, 140247, 140250, + 140253, 140256, 140259, 140262, 140265, 140268, 140271, 140274, 140277, + 140280, 140283, 140286, 140289, 140292, 140295, 140298, 140301, 140304, + 140307, 140310, 140313, 140316, 140319, 140322, 140325, 140328, 140331, + 140334, 140337, 140340, 140343, 140346, 140349, 140352, 140355, 140358, + 140361, 140364, 140367, 140370, 140373, 140376, 140379, 140382, 140385, + 140388, 140391, 140394, 140397, 140400, 140403, 140406, 140409, 140412, + 140415, 140418, 140421, 140424, 140427, 140430, 140433, 140436, 140439, + 140442, 140445, 140448, 140451, 140454, 140457, 140460, 140463, 140466, + 140469, 140472, 140475, 140478, 140481, 140484, 140487, 140490, 140493, + 140496, 140499, 140502, 140505, 140508, 140511, 140514, 140517, 140520, + 140523, 140526, 140529, 140532, 140535, 140538, 140541, 140544, 140547, + 140550, 140553, 140556, 140559, 140562, 140565, 140568, 140571, 140574, + 140577, 140580, 140583, 140586, 140589, 140592, 140595, 140598, 140601, + 140604, 140607, 140610, 140613, 140616, 140619, 140622, 140625, 140628, + 140631, 140634, 140637, 140640, 140643, 140646, 140649, 140652, 140655, + 140658, 140661, 140664, 140667, 140670, 140673, 140676, 140679, 140682, + 140685, 140688, 140691, 140694, 140697, 140700, 140703, 140706, 140709, + 140712, 140715, 140718, 140721, 140724, 140727, 140730, 140733, 140736, + 140739, 140742, 140745, 140748, 140751, 140754, 140757, 140760, 140763, + 140766, 140769, 140772, 140775, 140778, 140781, 140784, 140787, 140790, + 140793, 140796, 140799, 140802, 140805, 140808, 140811, 140814, 140817, + 140820, 140823, 140826, 140829, 140832, 140835, 140838, 140841, 140844, + 140847, 140850, 140853, 140856, 140859, 140862, 140865, 140868, 140871, + 140874, 140877, 140880, 140883, 140886, 140889, 140892, 140895, 140898, + 140901, 140904, 140907, 140910, 140913, 140916, 140919, 140922, 140925, + 140928, 140931, 140934, 140937, 140940, 140943, 140946, 140949, 140952, + 140955, 140958, 140961, 140964, 140967, 140970, 140973, 140976, 140979, + 140982, 140985, 140988, 140991, 140994, 140997, 141000, 141003, 141006, + 141009, 141012, 141015, 141018, 141021, 141024, 141027, 141030, 141033, + 141036, 141039, 141042, 141045, 141048, 141051, 141054, 141057, 141060, + 141063, 141066, 141069, 141072, 141075, 141078, 141081, 141084, 141087, + 141090, 141093, 141096, 141099, 141102, 141105, 141108, 141111, 141114, + 141117, 141120, 141123, 141126, 141129, 141132, 141135, 141138, 141141, + 141144, 141147, 141150, 141153, 141156, 141159, 141162, 141165, 141168, + 141171, 141174, 141177, 141180, 141183, 141186, 141189, 141192, 141195, + 141198, 141201, 141204, 141207, 141210, 141213, 141216, 141219, 141222, + 141225, 141228, 141231, 141234, 141237, 141240, 141243, 141246, 141249, + 141252, 141255, 141258, 141261, 141264, 141267, 141270, 141273, 141276, + 141279, 141282, 141285, 141288, 141291, 141294, 141297, 141300, 141303, + 141306, 141309, 141312, 141315, 141318, 141321, 141324, 141327, 141330, + 141333, 141336, 141339, 141342, 141345, 141348, 141351, 141354, 141357, + 141360, 141363, 141366, 141369, 141372, 141375, 141378, 141381, 141384, + 141387, 141390, 141393, 141396, 141399, 141402, 141405, 141408, 141411, + 141414, 141417, 141420, 141423, 141426, 141429, 141432, 141435, 141438, + 141441, 141444, 141447, 141450, 141453, 141456, 141459, 141462, 141465, + 141468, 141471, 141474, 141477, 141480, 141483, 141486, 141489, 141492, + 141495, 141498, 141501, 141504, 141507, 141510, 141513, 141516, 141519, + 141522, 141525, 141528, 141531, 141534, 141537, 141540, 141543, 141546, + 141549, 141552, 141555, 141558, 141561, 141564, 141567, 141570, 141573, + 141576, 141579, 141582, 141585, 141588, 141591, 141594, 141597, 141600, + 141603, 141606, 141609, 141612, 141615, 141618, 141621, 141624, 141627, + 141630, 141633, 141636, 141639, 141642, 141645, 141648, 141651, 141654, + 141657, 141660, 141663, 141666, 141669, 141672, 141675, 141678, 141681, + 141684, 141687, 141690, 141693, 141696, 141699, 141702, 141705, 141708, + 141711, 141714, 141717, 141720, 141723, 141726, 141729, 141732, 141735, + 141738, 141741, 141744, 141747, 141750, 141753, 141756, 141759, 141762, + 141765, 141768, 141771, 141774, 141777, 141780, 141783, 141786, 141789, + 141792, 141795, 141798, 141801, 141804, 141807, 141810, 141813, 141816, + 141819, 141822, 141825, 141828, 141831, 141834, 141837, 141840, 141843, + 141846, 141849, 141852, 141855, 141858, 141861, 141864, 141867, 141870, + 141873, 141876, 141879, 141882, 141885, 141888, 141891, 141894, 141897, + 141900, 141903, 141906, 141909, 141912, 141915, 141918, 141921, 141924, + 141927, 141930, 141933, 141936, 141939, 141942, 141945, 141948, 141951, + 141954, 141957, 141960, 141963, 141966, 141969, 141972, 141975, 141978, + 141981, 141984, 141987, 141990, 141993, 141996, 141999, 142002, 142005, + 142008, 142011, 142014, 142017, 142020, 142023, 142026, 142029, 142032, + 142035, 142038, 142041, 142044, 142047, 142050, 142053, 142056, 142059, + 142062, 142065, 142068, 142071, 142074, 142077, 142080, 142083, 142086, + 142089, 142092, 142095, 142098, 142101, 142104, 142107, 142110, 142113, + 142116, 142119, 142122, 142125, 142128, 142131, 142134, 142137, 142140, + 142143, 142146, 142149, 142152, 142155, 142158, 142161, 142164, 142167, + 142170, 142173, 142176, 142179, 142182, 142185, 142188, 142191, 142194, + 142197, 142200, 142203, 142206, 142209, 142212, 142215, 142218, 142221, + 142224, 142227, 142230, 142233, 142236, 142239, 142242, 142245, 142248, + 142251, 142254, 142257, 142260, 142263, 142266, 142269, 142272, 142275, + 142278, 142281, 142284, 142287, 142290, 142293, 142296, 142299, 142302, + 142305, 142308, 142311, 142314, 142317, 142320, 142323, 142326, 142329, + 142332, 142335, 142338, 142341, 142344, 142347, 142350, 142353, 142356, + 142359, 142362, 142365, 142368, 142371, 142374, 142377, 142380, 142385, + 142390, 142395, 142400, 142405, 142410, 142415, 142420, 142425, 142430, + 142435, 142440, 142445, 142450, 142455, 142460, 142465, 142470, 142475, + 142480, 142485, 142490, 142495, 142500, 142505, 142510, 142515, 142520, + 142525, 142530, 142535, 142540, 142545, 142550, 142555, 142560, 142565, + 142570, 142575, 142580, 142585, 142590, 142595, 142600, 142605, 142610, + 142615, 142620, 142625, 142630, 142635, 142640, 142645, 142650, 142655, + 142660, 142665, 142670, 142675, 142680, 142685, 142690, 142695, 142700, + 142705, 142710, 142715, 142720, 142725, 142730, 142735, 142740, 142745, + 142750, 142755, 142760, 142765, 142770, 142775, 142780, 142785, 142790, + 142795, 142800, 142805, 142810, 142815, 142820, 142825, 142830, 142835, + 142840, 142845, 142850, 142855, 142860, 142865, 142870, 142875, 142880, + 142885, 142890, 142895, 142900, 142905, 142910, 142915, 142920, 142925, + 142930, 142935, 142940, 142945, 142950, 142955, 142960, 142965, 142970, + 142975, 142980, 142985, 142990, 142995, 143000, 143005, 143010, 143015, + 143020, 143025, 143030, 143035, 143040, 143045, 143050, 143055, 143060, + 143065, 143070, 143075, 143080, 143085, 143090, 143095, 143100, 143105, + 143110, 143115, 143120, 143125, 143130, 143135, 143140, 143145, 143150, + 143155, 143160, 143165, 143170, 143175, 143180, 143185, 143190, 143195, + 143200, 143205, 143210, 143215, 143220, 143225, 143230, 143235, 143240, + 143245, 143250, 143255, 143260, 143265, 143270, 143275, 143280, 143285, + 143290, 143295, 143300, 143305, 143310, 143315, 143320, 143325, 143330, + 143335, 143340, 143345, 143350, 143355, 143360, 143365, 143370, 143375, + 143380, 143385, 143390, 143395, 143400, 143405, 143410, 143415, 143420, + 143425, 143430, 143435, 143440, 143445, 143450, 143455, 143460, 143465, + 143470, 143475, 143480, 143485, 143490, 143495, 143500, 143505, 143510, + 143515, 143520, 143525, 143530, 143535, 143540, 143545, 143550, 143555, + 143560, 143565, 143570, 143575, 143580, 143585, 143590, 143595, 143600, + 143605, 143610, 143615, 143620, 143625, 143630, 143635, 143640, 143645, + 143650, 143655, 143660, 143665, 143670, 143675, 143680, 143685, 143690, + 143695, 143700, 143705, 143710, 143715, 143720, 143725, 143730, 143735, + 143740, 143745, 143750, 143755, 143760, 143765, 143770, 143775, 143780, + 143785, 143790, 143795, 143800, 143805, 143810, 143815, 143820, 143825, + 143830, 143835, 143840, 143845, 143850, 143855, 143860, 143865, 143870, + 143875, 143880, 143885, 143890, 143895, 143900, 143905, 143910, 143915, + 143920, 143925, 143930, 143935, 143940, 143945, 143950, 143955, 143960, + 143965, 143970, 143975, 143980, 143985, 143990, 143995, 144000, 144005, + 144010, 144015, 144020, 144025, 144030, 144035, 144040, 144045, 144050, + 144055, 144060, 144065, 144070, 144075, 144080, 144085, 144090, 144095, + 144100, 144105, 144110, 144115, 144120, 144125, 144130, 144135, 144140, + 144145, 144150, 144155, 144160, 144165, 144170, 144175, 144180, 144185, + 144190, 144195, 144200, 144205, 144210, 144215, 144220, 144225, 144230, + 144235, 144240, 144245, 144250, 144255, 144260, 144265, 144270, 144275, + 144280, 144285, 144290, 144295, 144300, 144305, 144310, 144315, 144320, + 144325, 144330, 144335, 144340, 144345, 144350, 144355, 144360, 144365, + 144370, 144375, 144380, 144385, 144390, 144395, 144400, 144405, 144410, + 144415, 144420, 144425, 144430, 144435, 144440, 144445, 144450, 144455, + 144460, 144465, 144470, 144475, 144480, 144485, 144490, 144495, 144500, + 144505, 144510, 144515, 144520, 144525, 144530, 144535, 144540, 144545, + 144550, 144555, 144560, 144565, 144570, 144575, 144580, 144585, 144590, + 144595, 144600, 144605, 144610, 144615, 144620, 144625, 144630, 144635, + 144640, 144645, 144650, 144655, 144660, 144665, 144670, 144675, 144680, + 144685, 144690, 144695, 144700, 144705, 144710, 144715, 144720, 144725, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144730, 144735, + 144742, 144746, 144750, 144754, 144758, 144762, 144766, 144770, 144774, + 144778, 144782, 144786, 144790, 144794, 144798, 144802, 144806, 144810, + 144814, 144818, 144822, 144826, 144830, 144834, 144838, 144842, 144846, + 144850, 144854, 144858, 144862, 144866, 144870, 144874, 144878, 144882, + 144886, 144890, 144894, 144898, 144902, 144906, 144910, 144914, 144918, + 144922, 144926, 144930, 144934, 144938, 144942, 144946, 144950, 144954, + 144958, 144962, 144966, 144970, 144974, 144978, 144982, 144986, 144990, + 144994, 144998, 145002, 145006, 145010, 145014, 145018, 145022, 145026, + 145030, 145034, 145038, 145042, 145046, 145050, 145054, 145058, 145062, + 145066, 145070, 145074, 145078, 145082, 145086, 145090, 145094, 145098, + 145102, 145106, 145110, 145114, 145118, 145122, 145126, 145130, 145134, + 145138, 145142, 145146, 145150, 145154, 145158, 145162, 145166, 145170, + 145174, 145178, 145182, 145186, 145190, 145194, 145198, 145202, 145206, + 145210, 145214, 145218, 145222, 145226, 145230, 145234, 145238, 145242, + 145246, 145250, 145254, 145258, 145262, 145266, 145270, 145274, 145278, + 145282, 145286, 145290, 145294, 145298, 145302, 145306, 145310, 145314, + 145318, 145322, 145326, 145330, 145334, 145338, 145342, 145346, 145350, + 145354, 145358, 145362, 145366, 145370, 145374, 145378, 145382, 145386, + 145390, 145394, 145398, 145402, 145406, 145410, 145414, 145418, 145422, + 145426, 145430, 145434, 145438, 145442, 145446, 145450, 145454, 145458, + 145462, 145466, 145470, 145474, 145478, 145482, 145486, 145490, 145494, + 145498, 145502, 145506, 145510, 145514, 145518, 145522, 145526, 145530, + 145534, 145538, 145542, 145546, 145550, 145554, 145558, 145562, 145566, + 145570, 145574, 145578, 145582, 145586, 145590, 145594, 145598, 145602, + 145606, 145610, 145614, 145618, 145622, 145626, 145630, 145634, 145638, + 145642, 145646, 145650, 145654, 145658, 145662, 145666, 145670, 145674, + 145678, 145682, 145686, 145690, 145694, 145698, 145702, 145706, 145710, + 145714, 145718, 145722, 145726, 145730, 145734, 145738, 145742, 145746, + 145750, 145754, 145758, 145762, 145766, 145770, 145774, 145778, 145782, + 145786, 145790, 145794, 145798, 145802, 145806, 145810, 145814, 145818, + 145822, 145826, 145830, 145834, 145838, 145842, 145846, 145850, 145854, + 145858, 145862, 145866, 145870, 145874, 145878, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145882, 145888, + 145894, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145900, + 145905, 145910, 145915, 0, 0, 0, 0, 0, 0, 0, 0, 145920, 145923, 145926, + 145929, 145932, 145935, 145938, 145941, 145944, 145947, 145950, 145953, + 145956, 145959, 145962, 145965, 145968, 145971, 145974, 145977, 145980, + 145983, 145986, 145989, 145992, 145995, 145998, 146001, 146004, 146007, + 146010, 146013, 146016, 146019, 146022, 146025, 146028, 146031, 146034, + 146037, 146040, 146043, 146046, 146049, 146052, 146055, 146058, 146061, + 146064, 146067, 146070, 146073, 146076, 146079, 146082, 146085, 146088, + 146091, 146094, 146097, 146100, 146103, 146106, 146109, 146112, 146115, + 146118, 146121, 146124, 146127, 146130, 146133, 146136, 146139, 146142, + 146145, 146148, 146151, 146154, 146157, 146160, 146163, 146166, 146169, + 146172, 146175, 146178, 146181, 146184, 146187, 146190, 146193, 146196, + 146199, 146202, 146205, 146208, 146211, 146214, 146217, 146220, 146223, + 146226, 146229, 146232, 146235, 146238, 146241, 146244, 146247, 146250, + 146253, 146256, 146259, 146262, 146265, 146268, 146271, 146274, 146277, + 146280, 146283, 146286, 146289, 146292, 146295, 146298, 146301, 146304, + 146307, 146310, 146313, 146316, 146319, 146322, 146325, 146328, 146331, + 146334, 146337, 146340, 146343, 146346, 146349, 146352, 146355, 146358, + 146361, 146364, 146367, 146370, 146373, 146376, 146379, 146382, 146385, + 146388, 146391, 146394, 146397, 146400, 146403, 146406, 146409, 146412, + 146415, 146418, 146421, 146424, 146427, 146430, 146433, 146436, 146439, + 146442, 146445, 146448, 146451, 146454, 146457, 146460, 146463, 146466, + 146469, 146472, 146475, 146478, 146481, 146484, 146487, 146490, 146493, + 146496, 146499, 146502, 146505, 146508, 146511, 146514, 146517, 146520, + 146523, 146526, 146529, 146532, 146535, 146538, 146541, 146544, 146547, + 146550, 146553, 146556, 146559, 146562, 146565, 146568, 146571, 146574, + 146577, 146580, 146583, 146586, 146589, 146592, 146595, 146598, 146601, + 146604, 146607, 146610, 146613, 146616, 146619, 146622, 146625, 146628, + 146631, 146634, 146637, 146640, 146643, 146646, 146649, 146652, 146655, + 146658, 146661, 146664, 146667, 146670, 146673, 146676, 146679, 146682, + 146685, 146688, 146691, 146694, 146697, 146700, 146703, 146706, 146709, + 146712, 146715, 146718, 146721, 146724, 146727, 146730, 146733, 146736, + 146739, 146742, 146745, 146748, 146751, 146754, 146757, 146760, 146763, + 146766, 146769, 146772, 146775, 146778, 146781, 146784, 146787, 146790, + 146793, 146796, 146799, 146802, 146805, 146808, 146811, 146814, 146817, + 146820, 146823, 146826, 146829, 146832, 146835, 146838, 146841, 146844, + 146847, 146850, 146853, 146856, 146859, 146862, 146865, 146868, 146871, + 146874, 146877, 146880, 146883, 146886, 146889, 146892, 146895, 146898, + 146901, 146904, 146907, 146910, 146913, 146916, 146919, 146922, 146925, + 146928, 146931, 146934, 146937, 146940, 146943, 146946, 146949, 146952, + 146955, 146958, 146961, 146964, 146967, 146970, 146973, 146976, 146979, + 146982, 146985, 146988, 146991, 146994, 146997, 147000, 147003, 147006, + 147009, 147012, 147015, 147018, 147021, 147024, 147027, 147030, 147033, + 147036, 147039, 147042, 147045, 147048, 147051, 147054, 147057, 147060, + 147063, 147066, 147069, 147072, 147075, 147078, 147081, 147084, 147087, + 147090, 147093, 147096, 147099, 147102, 147105, 0, 0, 0, 0, 147108, + 147112, 147116, 147120, 147124, 147128, 147132, 147135, 147139, 147143, + 147147, 147151, 147154, 147160, 147166, 147172, 147178, 147184, 147188, + 147194, 147198, 147202, 147208, 147212, 147216, 147220, 147224, 147228, + 147232, 147236, 147242, 147248, 147254, 147260, 147267, 147274, 147281, + 147292, 147299, 147306, 147312, 147318, 147324, 147330, 147338, 147346, + 147354, 147362, 147371, 147377, 147385, 147391, 147398, 147404, 147411, + 147417, 147425, 147429, 147433, 147438, 147444, 147450, 147458, 147466, + 147472, 147479, 147482, 147488, 147492, 147495, 147499, 147502, 147505, + 147509, 147514, 147518, 147522, 147528, 147533, 147539, 147543, 147547, + 147550, 147554, 147558, 147563, 147567, 147572, 147576, 147581, 147585, + 147589, 147593, 147597, 147601, 147605, 147609, 147613, 147618, 147623, + 147628, 147633, 147639, 147645, 147651, 147657, 147663, 0, 0, 0, 0, 0, + 147668, 147676, 147685, 147693, 147700, 147708, 147715, 147722, 147731, + 147738, 147745, 147753, 147761, 0, 0, 0, 147769, 147775, 147783, 147789, + 147796, 147802, 147808, 147814, 147820, 0, 0, 0, 0, 0, 0, 0, 147826, + 147832, 147840, 147846, 147853, 147859, 147865, 147871, 147877, 147883, + 0, 0, 147888, 147894, 147900, 147903, 147912, 147919, 147927, 147934, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147941, 147946, + 147951, 147956, 147963, 147970, 147977, 147984, 147989, 147994, 147999, + 148004, 148011, 148016, 148023, 148030, 148035, 148040, 148045, 148052, + 148057, 148062, 148069, 148076, 148081, 148086, 148091, 148098, 148105, + 148112, 148117, 148122, 148129, 148136, 148143, 148150, 148155, 148160, + 148165, 148172, 148177, 148182, 148187, 148194, 148203, 148210, 148215, + 148220, 148225, 148230, 148235, 148240, 148249, 148256, 148261, 148268, + 148275, 148280, 148285, 148290, 148297, 148302, 148309, 148316, 148321, + 148326, 148331, 148338, 148345, 148350, 148355, 148362, 148369, 148376, + 148381, 148386, 148391, 148396, 148403, 148412, 148421, 148426, 148433, + 148442, 148447, 148452, 148457, 148462, 148469, 148476, 148483, 148490, + 148495, 148500, 148505, 148512, 148519, 148526, 148531, 148536, 148543, + 148548, 148555, 148560, 148567, 148572, 148579, 148586, 148591, 148596, + 148601, 148606, 148611, 148616, 148621, 148626, 148631, 148638, 148645, + 148652, 148659, 148666, 148675, 148680, 148685, 148692, 148699, 148704, + 148711, 148718, 148725, 148732, 148739, 148746, 148751, 148756, 148761, + 148766, 148771, 148780, 148789, 148798, 148807, 148816, 148825, 148834, + 148843, 148848, 148859, 148870, 148879, 148884, 148889, 148894, 148899, + 148908, 148915, 148922, 148929, 148936, 148943, 148950, 148959, 148968, + 148979, 148988, 148999, 149008, 149015, 149024, 149035, 149044, 149053, + 149062, 149071, 149078, 149085, 149092, 149101, 149110, 149121, 149130, + 149139, 149150, 149155, 149160, 149171, 149179, 149188, 149197, 149206, + 149217, 149226, 149235, 149246, 149257, 149268, 149279, 149290, 149301, + 149308, 149315, 149322, 149329, 149340, 149349, 149356, 149363, 149370, + 149381, 149392, 149403, 149414, 149425, 149436, 149447, 149458, 149465, + 149472, 149481, 149490, 149497, 149504, 149511, 149520, 149529, 149538, + 149545, 149554, 149563, 149572, 149579, 149586, 149591, 149597, 149604, + 149611, 149618, 149625, 149632, 149639, 149648, 149657, 149666, 149675, + 149682, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149691, 149697, 149702, 149707, + 149714, 149720, 149726, 149732, 149738, 149744, 149750, 149756, 149760, + 149764, 149770, 149776, 149782, 149786, 149791, 149796, 149800, 149804, + 149807, 149813, 149819, 149825, 149831, 149837, 149843, 149849, 149855, + 149861, 149871, 149881, 149887, 149893, 149903, 149913, 149919, 0, 0, + 149925, 149933, 149938, 149943, 149949, 149955, 149961, 149967, 149973, + 149979, 149986, 149993, 149999, 150005, 150011, 150017, 150023, 150029, + 150035, 150041, 150046, 150052, 150058, 150064, 150070, 150076, 150085, + 150091, 150096, 150104, 150111, 150118, 150127, 150136, 150145, 150154, + 150163, 150172, 150181, 150190, 150200, 150210, 150218, 150226, 150235, + 150244, 150250, 150256, 150262, 150268, 150276, 150284, 150288, 150294, + 150299, 150305, 150311, 150317, 150323, 150329, 150338, 150343, 150350, + 150355, 150360, 150365, 150371, 150377, 150383, 150390, 150395, 150400, + 150405, 150410, 150415, 150421, 150427, 150433, 150439, 150445, 150451, + 150457, 150463, 150468, 150473, 150478, 150483, 150488, 150493, 150498, + 150503, 150509, 150515, 150520, 150525, 150530, 150535, 150540, 150546, + 150553, 150557, 150561, 150565, 150569, 150573, 150577, 150581, 150585, + 150593, 150603, 150607, 150611, 150617, 150623, 150629, 150635, 150641, + 150647, 150653, 150659, 150665, 150671, 150677, 150683, 150689, 150695, + 150699, 150703, 150710, 150716, 150722, 150728, 150733, 150740, 150745, + 150751, 150757, 150763, 150769, 150774, 150778, 150784, 150788, 150792, + 150796, 150802, 150808, 150812, 150818, 150824, 150830, 150836, 150842, + 150850, 150858, 150864, 150870, 150876, 150882, 150894, 150906, 150920, + 150932, 150944, 150958, 150972, 150986, 150990, 150998, 151006, 151011, + 151015, 151019, 151023, 151027, 151031, 151035, 151039, 151045, 151051, + 151057, 151063, 151071, 151080, 151087, 151094, 151102, 151109, 151121, + 151133, 151145, 151157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 151164, 151171, 151178, 151185, 151192, 151199, + 151206, 151213, 151220, 151227, 151234, 151241, 151248, 151255, 151262, + 151269, 151276, 151283, 151290, 151297, 151304, 151311, 151318, 151325, + 151332, 151339, 151346, 151353, 151360, 151367, 151374, 151381, 151388, + 151395, 151402, 151409, 151416, 151423, 151430, 151437, 151444, 151451, + 151458, 151465, 151472, 151479, 151486, 151493, 151500, 151507, 151514, + 151521, 151528, 151535, 151542, 151549, 151556, 151563, 151570, 151577, + 151584, 151591, 151598, 151605, 151612, 151619, 151626, 151631, 151636, + 151641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151645, 151651, 151656, 151661, + 151666, 151671, 151676, 151681, 151686, 151691, 151696, 151702, 151708, + 151714, 151720, 151726, 151732, 151738, 151744, 151750, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 151756, 151761, 151768, 151775, 151782, 151789, 151794, + 151799, 151806, 151811, 151816, 151823, 151828, 151833, 151838, 151845, + 151854, 151859, 151864, 151869, 151874, 151879, 151884, 151891, 151896, + 151901, 151906, 151911, 151916, 151921, 151926, 151931, 151936, 151941, + 151946, 151951, 151957, 151962, 151967, 151972, 151977, 151982, 151987, + 151992, 151997, 152002, 152011, 152016, 152024, 152029, 152034, 152039, + 152044, 152049, 152054, 152059, 152068, 152073, 152078, 152083, 152088, + 152093, 152100, 152105, 152112, 152117, 152122, 152127, 152132, 152137, + 152142, 152147, 152152, 152157, 152162, 152167, 152172, 152177, 152182, + 152187, 152192, 152197, 152202, 152207, 152216, 152221, 152226, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 152231, 152239, 152247, 152255, 152263, 152271, 152279, + 152287, 152295, 152303, 152311, 152319, 152327, 152335, 152343, 152351, + 152359, 152367, 152375, 152380, 152385, 152390, 152395, 152400, 152404, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132950, 132958, - 132966, 132976, 132986, 132994, 133000, 133008, 133016, 133026, 133038, - 133050, 133056, 133064, 133070, 133076, 133082, 133088, 133094, 133100, - 133106, 133112, 133118, 133124, 133130, 133138, 133146, 133152, 133158, - 133164, 133170, 133178, 133186, 133195, 133201, 133209, 133215, 133221, - 133227, 133233, 133239, 133247, 133255, 133261, 133267, 133273, 133279, - 133285, 133291, 133297, 133303, 133309, 133315, 133321, 133327, 133333, - 133339, 133345, 133351, 133357, 133363, 133369, 133377, 133383, 133389, - 133399, 133407, 133413, 133419, 133425, 133431, 133437, 133443, 133449, - 133455, 133461, 133467, 133473, 133479, 133485, 133491, 133497, 133503, - 133509, 133515, 133521, 133527, 133533, 133539, 133547, 133553, 133561, - 133569, 133577, 133583, 133589, 133595, 133601, 133607, 133615, 133625, - 133633, 133641, 133647, 133653, 133661, 133669, 133675, 133683, 133691, - 133699, 133705, 133711, 133717, 133723, 133729, 133735, 133743, 133751, - 133757, 133763, 133769, 133775, 133781, 133789, 133795, 133801, 133807, - 133813, 133819, 133825, 133833, 133839, 133845, 133851, 133857, 133865, - 133873, 133879, 133885, 133891, 133896, 133902, 133908, 133915, 133920, - 133925, 133930, 133935, 133940, 133945, 133950, 133955, 133960, 133969, - 133976, 133981, 133986, 133991, 133998, 134003, 134008, 134013, 134020, - 134025, 134030, 134035, 134040, 134045, 134050, 134055, 134060, 134065, - 134070, 134075, 134082, 134087, 134094, 134099, 134104, 134111, 134116, - 134121, 134126, 134131, 134136, 134141, 134146, 134151, 134156, 134161, - 134166, 134171, 134176, 134181, 134186, 134191, 134196, 134201, 134206, - 134213, 134218, 134223, 134228, 134233, 134238, 134243, 134248, 134253, - 134258, 134263, 134268, 134273, 134278, 134285, 134290, 134295, 134302, - 134307, 134312, 134317, 134322, 134327, 134332, 134337, 134342, 134347, - 134352, 134359, 134364, 134369, 134374, 134379, 134384, 134391, 134398, - 134403, 134408, 134413, 134418, 134423, 134428, 134433, 134438, 134443, - 134448, 134453, 134458, 134463, 134468, 134473, 134478, 134483, 134488, - 134493, 134498, 134503, 134508, 134513, 134518, 134523, 134528, 134533, - 134538, 134543, 134548, 134553, 134558, 134563, 134568, 134573, 134578, - 134585, 134590, 134595, 134600, 134605, 134610, 134615, 134620, 134625, - 134630, 134635, 134640, 134645, 134650, 134655, 134660, 134665, 134670, - 134675, 134680, 134685, 134690, 134695, 134700, 134705, 134710, 134715, - 134720, 134725, 134730, 134735, 134740, 134745, 134750, 134755, 134760, - 134765, 134770, 134775, 134780, 134785, 134790, 134795, 134800, 134805, - 134810, 134815, 134820, 134825, 134830, 134835, 134840, 134845, 134850, - 134855, 134860, 134865, 134870, 134875, 134882, 134887, 134892, 134897, - 134902, 134907, 134912, 134917, 134922, 134927, 134932, 134937, 134942, - 134947, 134952, 134957, 134962, 134967, 134972, 134977, 134982, 134987, - 134994, 134999, 135004, 135010, 135015, 135020, 135025, 135030, 135035, - 135040, 135045, 135050, 135055, 135060, 135065, 135070, 135075, 135080, - 135085, 135090, 135095, 135100, 135105, 135110, 135115, 135120, 135125, - 135130, 135135, 135140, 135145, 135150, 135155, 135160, 135165, 135170, - 135175, 135180, 135185, 135190, 135195, 135200, 135205, 135210, 135215, - 135220, 135225, 135232, 135237, 135242, 135249, 135256, 135261, 135266, - 135271, 135276, 135281, 135286, 135291, 135296, 135301, 135306, 135311, - 135316, 135321, 135326, 135331, 135336, 135341, 135346, 135351, 135356, - 135361, 135366, 135371, 135376, 135381, 135388, 135393, 135398, 135403, - 135408, 135413, 135418, 135423, 135428, 135433, 135438, 135443, 135448, - 135453, 135458, 135463, 135468, 135473, 135478, 135485, 135490, 135495, - 135500, 135505, 135510, 135515, 135520, 135526, 135531, 135536, 135541, - 135546, 135551, 135556, 135561, 135566, 135573, 135580, 135585, 135590, - 135594, 135599, 135603, 135607, 135612, 135619, 135624, 135629, 135638, - 135643, 135648, 135653, 135658, 135665, 135672, 135677, 135682, 135687, - 135692, 135699, 135704, 135709, 135714, 135719, 135724, 135729, 135734, - 135739, 135744, 135749, 135754, 135759, 135766, 135770, 135775, 135780, - 135785, 135790, 135794, 135799, 135804, 135809, 135814, 135819, 135824, - 135829, 135834, 135839, 135845, 135851, 135857, 135863, 135869, 135874, - 135880, 135886, 135892, 135898, 135904, 135910, 135916, 135922, 135928, - 135934, 135940, 135946, 135952, 135958, 135964, 135970, 135976, 135982, - 135987, 135993, 135999, 136005, 136011, 136017, 136023, 136029, 136035, - 136041, 136047, 136053, 136059, 136065, 136071, 136077, 136083, 136089, - 136095, 136101, 136107, 136112, 136118, 136124, 136130, 136136, 136142, - 0, 0, 0, 0, 0, 0, 0, 136148, 136152, 136157, 136162, 136167, 136172, - 136177, 136181, 136186, 136191, 136196, 136201, 136206, 136211, 136216, - 136221, 136226, 136230, 136235, 136239, 136244, 136249, 136254, 136259, - 136264, 136268, 136273, 136278, 136282, 136287, 136292, 0, 136297, - 136302, 136306, 136310, 136314, 136318, 136322, 136326, 136330, 136334, - 0, 0, 0, 0, 136338, 136342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152408, 152412, 152417, + 152422, 152427, 152431, 152436, 152441, 152446, 152450, 152455, 152460, + 152464, 152469, 152474, 152478, 152483, 152488, 152492, 152497, 152502, + 152506, 152511, 152516, 152521, 152526, 152531, 152535, 152540, 152545, + 152550, 152554, 152559, 152564, 152569, 152573, 152578, 152583, 152587, + 152592, 152597, 152601, 152606, 152611, 152615, 152620, 152625, 152629, + 152634, 152639, 152644, 152649, 152654, 152658, 152663, 152668, 152673, + 152677, 152682, 152687, 152692, 152696, 152701, 152706, 152710, 152715, + 152720, 152724, 152729, 152734, 152738, 152743, 152748, 152752, 152757, + 152762, 152767, 152772, 152777, 152781, 152786, 152791, 152796, 152800, + 152805, 0, 152810, 152814, 152819, 152824, 152828, 152833, 152838, + 152842, 152847, 152852, 152856, 152861, 152866, 152870, 152875, 152880, + 152885, 152890, 152895, 152900, 152906, 152912, 152918, 152923, 152929, + 152935, 152941, 152946, 152952, 152958, 152963, 152969, 152975, 152980, + 152986, 152992, 152997, 153003, 153009, 153014, 153020, 153026, 153032, + 153038, 153044, 153049, 153055, 153061, 153067, 153072, 153078, 153084, + 153090, 153095, 153101, 153107, 153112, 153118, 153124, 153129, 153135, + 153141, 153146, 153152, 153158, 153163, 153169, 153175, 153181, 153187, + 153193, 0, 153197, 153202, 0, 0, 153207, 0, 0, 153212, 153217, 0, 0, + 153222, 153227, 153231, 153236, 0, 153241, 153246, 153251, 153255, + 153260, 153265, 153270, 153275, 153280, 153284, 153289, 153294, 0, + 153299, 0, 153304, 153309, 153313, 153318, 153323, 153327, 153332, 0, + 153337, 153342, 153347, 153351, 153356, 153361, 153365, 153370, 153375, + 153380, 153385, 153390, 153395, 153401, 153407, 153413, 153418, 153424, + 153430, 153436, 153441, 153447, 153453, 153458, 153464, 153470, 153475, + 153481, 153487, 153492, 153498, 153504, 153509, 153515, 153521, 153527, + 153533, 153539, 153544, 153550, 153556, 153562, 153567, 153573, 153579, + 153585, 153590, 153596, 153602, 153607, 153613, 153619, 153624, 153630, + 153636, 153641, 153647, 153653, 153658, 153664, 153670, 153676, 153682, + 153688, 153693, 0, 153699, 153705, 153710, 153716, 0, 0, 153722, 153728, + 153734, 153739, 153745, 153751, 153756, 153762, 0, 153768, 153774, + 153780, 153785, 153791, 153797, 153803, 0, 153809, 153814, 153820, + 153826, 153832, 153837, 153843, 153849, 153855, 153860, 153866, 153872, + 153877, 153883, 153889, 153894, 153900, 153906, 153911, 153917, 153923, + 153928, 153934, 153940, 153946, 153952, 153958, 153963, 0, 153969, + 153975, 153980, 153986, 0, 153992, 153997, 154003, 154009, 154014, 0, + 154020, 0, 0, 0, 154025, 154031, 154037, 154042, 154048, 154054, 154060, + 0, 154066, 154071, 154077, 154083, 154089, 154094, 154100, 154106, + 154112, 154117, 154123, 154129, 154134, 154140, 154146, 154151, 154157, + 154163, 154168, 154174, 154180, 154185, 154191, 154197, 154203, 154209, + 154215, 154221, 154228, 154235, 154242, 154248, 154255, 154262, 154269, + 154275, 154282, 154289, 154295, 154302, 154309, 154315, 154322, 154329, + 154335, 154342, 154349, 154355, 154362, 154369, 154376, 154383, 154390, + 154396, 154403, 154410, 154417, 154423, 154430, 154437, 154444, 154450, + 154457, 154464, 154470, 154477, 154484, 154490, 154497, 154504, 154510, + 154517, 154524, 154530, 154537, 154544, 154551, 154558, 154565, 154569, + 154574, 154579, 154584, 154588, 154593, 154598, 154603, 154607, 154612, + 154617, 154621, 154626, 154631, 154635, 154640, 154645, 154649, 154654, + 154659, 154663, 154668, 154673, 154678, 154683, 154688, 154692, 154697, + 154702, 154707, 154711, 154716, 154721, 154726, 154730, 154735, 154740, + 154744, 154749, 154754, 154758, 154763, 154768, 154772, 154777, 154782, + 154786, 154791, 154796, 154801, 154806, 154811, 154816, 154822, 154828, + 154834, 154839, 154845, 154851, 154857, 154862, 154868, 154874, 154879, + 154885, 154891, 154896, 154902, 154908, 154913, 154919, 154925, 154930, + 154936, 154942, 154948, 154954, 154960, 154965, 154971, 154977, 154983, + 154988, 154994, 155000, 155006, 155011, 155017, 155023, 155028, 155034, + 155040, 155045, 155051, 155057, 155062, 155068, 155074, 155079, 155085, + 155091, 155097, 155103, 155109, 155114, 155120, 155126, 155132, 155137, + 155143, 155149, 155155, 155160, 155166, 155172, 155177, 155183, 155189, + 155194, 155200, 155206, 155211, 155217, 155223, 155228, 155234, 155240, + 155246, 155252, 155258, 155263, 155269, 155275, 155281, 155286, 155292, + 155298, 155304, 155309, 155315, 155321, 155326, 155332, 155338, 155343, + 155349, 155355, 155360, 155366, 155372, 155377, 155383, 155389, 155395, + 155401, 155407, 155413, 155420, 155427, 155434, 155440, 155447, 155454, + 155461, 155467, 155474, 155481, 155487, 155494, 155501, 155507, 155514, + 155521, 155527, 155534, 155541, 155547, 155554, 155561, 155568, 155575, + 155582, 155588, 155595, 155602, 155609, 155615, 155622, 155629, 155636, + 155642, 155649, 155656, 155662, 155669, 155676, 155682, 155689, 155696, + 155702, 155709, 155716, 155722, 155729, 155736, 155743, 155750, 155757, + 155762, 155768, 155774, 155780, 155785, 155791, 155797, 155803, 155808, + 155814, 155820, 155825, 155831, 155837, 155842, 155848, 155854, 155859, + 155865, 155871, 155876, 155882, 155888, 155894, 155900, 155906, 155911, + 155917, 155923, 155929, 155934, 155940, 155946, 155952, 155957, 155963, + 155969, 155974, 155980, 155986, 155991, 155997, 156003, 156008, 156014, + 156020, 156025, 156031, 156037, 156043, 156049, 156055, 156061, 0, 0, + 156068, 156073, 156078, 156083, 156088, 156093, 156098, 156103, 156108, + 156113, 156118, 156123, 156128, 156133, 156138, 156143, 156148, 156153, + 156159, 156164, 156169, 156174, 156179, 156184, 156189, 156194, 156198, + 156203, 156208, 156213, 156218, 156223, 156228, 156233, 156238, 156243, + 156248, 156253, 156258, 156263, 156268, 156273, 156278, 156283, 156289, + 156294, 156299, 156304, 156309, 156314, 156319, 156324, 156330, 156335, + 156340, 156345, 156350, 156355, 156360, 156365, 156370, 156375, 156380, + 156385, 156390, 156395, 156400, 156405, 156410, 156415, 156420, 156425, + 156430, 156435, 156440, 156445, 156451, 156456, 156461, 156466, 156471, + 156476, 156481, 156486, 156490, 156495, 156500, 156505, 156510, 156515, + 156520, 156525, 156530, 156535, 156540, 156545, 156550, 156555, 156560, + 156565, 156570, 156575, 156581, 156586, 156591, 156596, 156601, 156606, + 156611, 156616, 156622, 156627, 156632, 156637, 156642, 156647, 156652, + 156658, 156664, 156670, 156676, 156682, 156688, 156694, 156700, 156706, + 156712, 156718, 156724, 156730, 156736, 156742, 156748, 156754, 156761, + 156767, 156773, 156779, 156785, 156791, 156797, 156803, 156808, 156814, + 156820, 156826, 156832, 156838, 156844, 156850, 156856, 156862, 156868, + 156874, 156880, 156886, 156892, 156898, 156904, 156910, 156917, 156923, + 156929, 156935, 156941, 156947, 156953, 156959, 156966, 156972, 156978, + 156984, 156990, 156996, 157002, 157008, 157014, 157020, 157026, 157032, + 157038, 157044, 157050, 157056, 157062, 157068, 157074, 157080, 157086, + 157092, 157098, 157104, 157111, 157117, 157123, 157129, 157135, 157141, + 157147, 157153, 157158, 157164, 157170, 157176, 157182, 157188, 157194, + 157200, 157206, 157212, 157218, 157224, 157230, 157236, 157242, 157248, + 157254, 157260, 157267, 157273, 157279, 157285, 157291, 157297, 157303, + 157309, 157316, 157322, 157328, 157334, 157340, 157346, 157352, 157359, + 157366, 157373, 157380, 157387, 157394, 157401, 157408, 157415, 157422, + 157429, 157436, 157443, 157450, 157457, 157464, 157471, 157479, 157486, + 157493, 157500, 157507, 157514, 157521, 157528, 157534, 157541, 157548, + 157555, 157562, 157569, 157576, 157583, 157590, 157597, 157604, 157611, + 157618, 157625, 157632, 157639, 157646, 157653, 157661, 157668, 157675, + 157682, 157689, 157696, 157703, 157710, 157718, 157725, 157732, 157739, + 157746, 157753, 157760, 157765, 0, 0, 157770, 157775, 157779, 157783, + 157787, 157791, 157795, 157799, 157803, 157807, 157811, 157817, 157822, + 157827, 157832, 157837, 157842, 157847, 157852, 157857, 157862, 157867, + 157871, 157875, 157879, 157883, 157887, 157891, 157895, 157899, 157903, + 157909, 157914, 157919, 157924, 157929, 157934, 157939, 157944, 157949, + 157954, 157960, 157965, 157970, 157975, 157980, 157985, 157990, 157995, + 158000, 158005, 158009, 158014, 158019, 158024, 158029, 158034, 158039, + 158045, 158053, 158060, 158065, 158070, 158077, 158083, 158088, 158094, + 158100, 158108, 158114, 158121, 158129, 158135, 158144, 158153, 158161, + 158169, 158175, 158182, 158190, 158198, 158204, 158211, 158220, 158229, + 158236, 158247, 158257, 158267, 158277, 158287, 158294, 158301, 158308, + 158315, 158324, 158333, 158344, 158355, 158364, 158373, 158384, 158393, + 158402, 158413, 158422, 158431, 158439, 158447, 158458, 158469, 158477, + 158486, 158495, 158502, 158513, 158524, 158533, 158542, 158549, 158558, + 158567, 158576, 158587, 158596, 158606, 158615, 158624, 158635, 158648, + 158663, 158674, 158687, 158699, 158708, 158719, 158730, 158739, 158750, + 158764, 158779, 158782, 158791, 158796, 158802, 158810, 158816, 158822, + 158831, 158838, 158848, 158860, 158867, 158870, 158876, 158883, 158889, + 158894, 158897, 158902, 158905, 158913, 158919, 158928, 158935, 158943, + 158949, 158954, 158957, 158960, 158963, 158969, 158976, 158982, 158987, + 158995, 158998, 159003, 159011, 159017, 159026, 159033, 159043, 159052, + 159055, 159061, 159068, 159075, 159082, 159087, 159095, 159103, 159112, + 159118, 159127, 159136, 159145, 159151, 159160, 159167, 159174, 159181, + 159189, 159195, 159203, 159209, 159216, 159223, 159231, 159242, 159252, + 159258, 159265, 159272, 159279, 159285, 159292, 159299, 159304, 159311, + 159319, 159328, 159334, 159346, 159357, 159363, 159371, 159377, 159384, + 159391, 159398, 159404, 159411, 159420, 159426, 159432, 159439, 159446, + 159454, 159464, 159474, 159484, 159494, 159502, 159510, 159520, 159528, + 159533, 159538, 159543, 159549, 159556, 159563, 159569, 159575, 159580, + 159587, 159595, 159605, 159613, 159621, 159631, 159641, 159649, 159659, + 159669, 159681, 159693, 159705, 159715, 159721, 159727, 159734, 159743, + 159752, 159761, 159770, 159780, 159789, 159798, 159807, 159812, 159818, + 159827, 159837, 159846, 159852, 159858, 159865, 159872, 159879, 159885, + 159892, 159899, 159906, 159912, 159916, 159921, 159928, 159935, 159942, + 159947, 159955, 159963, 159972, 159980, 159987, 159995, 160004, 160014, + 160017, 160021, 160026, 160031, 160036, 160041, 160046, 160051, 160056, + 160061, 160066, 160071, 160076, 160081, 160086, 160091, 160096, 160101, + 160106, 160113, 160119, 160126, 160132, 160137, 160144, 160150, 160157, + 160163, 160168, 160175, 160182, 160189, 160195, 160201, 160210, 160219, + 160229, 160236, 160243, 160252, 160261, 160270, 160279, 160288, 160294, + 160302, 160308, 160318, 160323, 160332, 160341, 160348, 160359, 160366, + 160373, 160380, 160387, 160394, 160401, 160408, 160415, 160422, 160429, + 160435, 160441, 160447, 160454, 160461, 160468, 160475, 160482, 160489, + 160496, 160503, 160510, 160517, 160524, 160531, 160536, 160545, 160554, + 160563, 160570, 160577, 160584, 160591, 160598, 160605, 160612, 160619, + 160628, 160637, 160646, 160655, 160664, 160673, 160682, 160691, 160700, + 160709, 160718, 160727, 160736, 160742, 160750, 160756, 160766, 160771, + 160780, 160789, 160798, 160809, 160814, 160821, 160828, 160835, 160840, + 160846, 160852, 160858, 160865, 160872, 160879, 160886, 160893, 160900, + 160907, 160914, 160921, 160928, 160935, 160942, 160947, 160956, 160965, + 160974, 160983, 160992, 161001, 161010, 161019, 161030, 161041, 161048, + 161055, 161062, 161069, 161076, 161083, 161091, 161101, 161111, 161121, + 161132, 161143, 161154, 161163, 161172, 161181, 161186, 161191, 161196, + 161201, 161212, 161223, 161234, 161245, 161256, 161266, 161277, 161286, + 161295, 161304, 161313, 161322, 161330, 161339, 161350, 161361, 161372, + 161383, 161394, 161406, 161419, 161431, 161444, 161456, 161469, 161481, + 161494, 161505, 161516, 161525, 161533, 161542, 161553, 161564, 161576, + 161589, 161603, 161618, 161630, 161643, 161655, 161668, 161679, 161690, + 161699, 161707, 161716, 161723, 161730, 161737, 161744, 161751, 161758, + 161765, 161772, 161779, 161786, 161791, 161796, 161801, 161808, 161818, + 161829, 161839, 161850, 161864, 161879, 161894, 161908, 161923, 161938, + 161949, 161960, 161973, 161986, 161995, 162004, 162017, 162030, 162037, + 162044, 162049, 162054, 162059, 162064, 162069, 162076, 162085, 162090, + 162093, 162098, 162105, 162112, 162119, 162126, 162133, 162140, 162153, + 162167, 162182, 162189, 162196, 162203, 162212, 162220, 162228, 162237, + 162242, 162247, 162252, 162257, 162262, 162267, 162274, 162281, 162287, + 162294, 162300, 162307, 162312, 162317, 162322, 162327, 162332, 162339, + 162346, 162351, 162358, 162365, 162370, 162375, 162380, 162385, 162390, + 162395, 162402, 162409, 162416, 162419, 162424, 162429, 162434, 162439, + 162446, 162453, 162461, 162469, 162474, 162479, 162486, 162493, 162500, + 162505, 162512, 162519, 162524, 162531, 162538, 162545, 162552, 162559, + 162566, 162575, 162584, 162591, 162600, 162609, 162614, 162621, 162628, + 162633, 162640, 162647, 162654, 162661, 162668, 162673, 162680, 162687, + 162696, 162703, 162712, 162723, 162732, 162741, 162750, 162759, 162762, + 162767, 162774, 162783, 162790, 162799, 162806, 162811, 162816, 162819, + 162822, 162825, 162832, 162839, 162848, 162857, 162866, 162873, 162880, + 162885, 162897, 162902, 162907, 162912, 162917, 162922, 162927, 162932, + 162937, 162940, 162945, 162950, 162955, 162960, 162965, 162972, 162977, + 162984, 162987, 162992, 162995, 162998, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 163001, 163006, 163011, 163016, 163021, 0, 163026, 163031, + 163036, 163041, 163046, 163051, 163056, 163061, 163066, 163071, 163076, + 163081, 163086, 163091, 163096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 136347, 136354, 136360, 136367, 136374, - 136381, 136388, 136395, 136402, 136409, 136416, 136423, 136430, 136437, - 136444, 136451, 136458, 136465, 136471, 136478, 136485, 136492, 136498, - 136505, 136511, 136517, 136524, 136530, 136537, 136543, 0, 0, 136549, - 136557, 136565, 136574, 136583, 136592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 136600, 136605, 136610, 136615, 136620, 136625, 136630, 136635, 136640, - 136645, 136650, 136655, 136660, 136665, 136670, 136675, 136680, 136685, - 136690, 136695, 136700, 136705, 136710, 136715, 136720, 136725, 136730, - 136735, 136740, 136745, 136750, 136755, 136760, 136765, 136770, 136775, - 136780, 136785, 136790, 136795, 136800, 136805, 136810, 136815, 136820, - 136825, 136830, 136835, 136840, 136847, 136854, 136861, 136868, 136875, - 136882, 136889, 136896, 136905, 136912, 136919, 136926, 136933, 136940, - 136947, 136954, 136961, 136968, 136975, 136982, 136987, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 136996, 137001, 137005, 137009, 137013, 137017, 137021, - 137025, 137029, 137033, 0, 137037, 137042, 137047, 137054, 137059, - 137066, 137073, 0, 137078, 137085, 137090, 137095, 137102, 137109, - 137114, 137119, 137124, 137129, 137134, 137141, 137148, 137153, 137158, - 137163, 137176, 137185, 137192, 137201, 137210, 0, 0, 0, 0, 0, 137219, - 137226, 137233, 137240, 137247, 137254, 137261, 137268, 137275, 137282, - 137289, 137296, 137303, 137310, 137317, 137324, 137331, 137338, 137345, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163101, 163106, + 163111, 163116, 163121, 163126, 163131, 0, 163136, 163141, 163146, + 163152, 163156, 163161, 163166, 163171, 163176, 163181, 163186, 163191, + 163196, 163201, 163206, 163211, 163216, 0, 0, 163221, 163226, 163231, + 163236, 163241, 163246, 163251, 0, 163256, 163261, 0, 163267, 163272, + 163280, 163287, 163296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 137352, 137358, 137364, 137370, 137376, 137382, - 137388, 137394, 137400, 137406, 137412, 137418, 137423, 137429, 137434, - 137440, 137445, 137451, 137457, 137462, 137468, 137473, 137479, 137485, - 137491, 137497, 137503, 137509, 137515, 137520, 137525, 137531, 137537, - 137543, 137549, 137555, 137561, 137567, 137573, 137579, 137585, 137591, - 137597, 137603, 137608, 137614, 137619, 137625, 137630, 137636, 137642, - 137647, 137653, 137658, 137664, 137670, 137676, 137682, 137688, 137694, - 137700, 137705, 137710, 137716, 137722, 137727, 137731, 137735, 137739, - 137743, 137747, 137751, 137755, 137759, 137763, 137768, 137773, 137778, - 137783, 137788, 137793, 137798, 137803, 137808, 137813, 137820, 137827, - 137834, 137838, 137844, 137849, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 163301, 163308, 163316, 163324, 163331, 163338, 163345, + 163353, 163361, 163369, 163376, 163383, 163391, 163399, 163407, 163414, + 163422, 163430, 163438, 163446, 163454, 163462, 163470, 163477, 163485, + 163492, 163500, 163507, 163515, 163523, 163531, 163539, 163547, 163555, + 163563, 163571, 163579, 163586, 163594, 163601, 163608, 163615, 163623, + 163630, 163638, 0, 0, 0, 163646, 163653, 163660, 163667, 163674, 163681, + 163688, 163695, 163704, 163713, 163722, 163731, 163740, 163750, 0, 0, + 163758, 163766, 163773, 163780, 163787, 163794, 163801, 163808, 163815, + 163822, 0, 0, 0, 0, 163829, 163838, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137855, 137858, 137862, - 137866, 137870, 137873, 137877, 137882, 137886, 137890, 137894, 137897, - 137901, 137906, 137910, 137914, 137918, 137921, 137925, 137930, 137935, - 137939, 137943, 137946, 137950, 137954, 137958, 137962, 137966, 137970, - 137974, 137977, 137981, 137985, 137989, 137993, 137997, 138001, 138007, - 138010, 138014, 138018, 138022, 138026, 138030, 138034, 138038, 138042, - 138046, 138051, 138056, 138062, 138066, 138070, 138074, 138078, 138082, - 138086, 138091, 138094, 138098, 138102, 138106, 138110, 138116, 138120, - 138124, 138128, 138132, 138136, 138140, 138144, 138148, 138152, 138156, - 0, 0, 0, 0, 138160, 138165, 138169, 138173, 138179, 138185, 138189, - 138194, 138199, 138204, 138209, 138213, 138218, 138223, 138228, 138232, - 138237, 138242, 138247, 138251, 138256, 138261, 138266, 138271, 138276, - 138281, 138286, 138291, 138295, 138300, 138305, 138310, 138315, 138320, - 138325, 138330, 138335, 138340, 138345, 138350, 138357, 138362, 138369, - 138374, 138379, 138384, 138389, 138394, 138399, 138404, 138409, 138414, - 138419, 138424, 138429, 138434, 138439, 0, 0, 0, 0, 0, 0, 0, 138444, - 138448, 138454, 138457, 138460, 138464, 138468, 138472, 138476, 138480, - 138484, 138488, 138494, 138500, 138506, 138512, 138518, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138524, 138528, 138532, 138538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 138544, 138547, 138550, 138553, 138556, 138559, 138562, 138565, 138568, - 138571, 138574, 138577, 138580, 138583, 138586, 138589, 138592, 138595, - 138598, 138601, 138604, 138607, 138610, 138613, 138616, 138619, 138622, - 138625, 138628, 138631, 138634, 138637, 138640, 138643, 138646, 138649, - 138652, 138655, 138658, 138661, 138664, 138667, 138670, 138673, 138676, - 138679, 138682, 138685, 138688, 138691, 138694, 138697, 138700, 138703, - 138706, 138709, 138712, 138715, 138718, 138721, 138724, 138727, 138730, - 138733, 138736, 138739, 138742, 138745, 138748, 138751, 138754, 138757, - 138760, 138763, 138766, 138769, 138772, 138775, 138778, 138781, 138784, - 138787, 138790, 138793, 138796, 138799, 138802, 138805, 138808, 138811, - 138814, 138817, 138820, 138823, 138826, 138829, 138832, 138835, 138838, - 138841, 138844, 138847, 138850, 138853, 138856, 138859, 138862, 138865, - 138868, 138871, 138874, 138877, 138880, 138883, 138886, 138889, 138892, - 138895, 138898, 138901, 138904, 138907, 138910, 138913, 138916, 138919, - 138922, 138925, 138928, 138931, 138934, 138937, 138940, 138943, 138946, - 138949, 138952, 138955, 138958, 138961, 138964, 138967, 138970, 138973, - 138976, 138979, 138982, 138985, 138988, 138991, 138994, 138997, 139000, - 139003, 139006, 139009, 139012, 139015, 139018, 139021, 139024, 139027, - 139030, 139033, 139036, 139039, 139042, 139045, 139048, 139051, 139054, - 139057, 139060, 139063, 139066, 139069, 139072, 139075, 139078, 139081, - 139084, 139087, 139090, 139093, 139096, 139099, 139102, 139105, 139108, - 139111, 139114, 139117, 139120, 139123, 139126, 139129, 139132, 139135, - 139138, 139141, 139144, 139147, 139150, 139153, 139156, 139159, 139162, - 139165, 139168, 139171, 139174, 139177, 139180, 139183, 139186, 139189, - 139192, 139195, 139198, 139201, 139204, 139207, 139210, 139213, 139216, - 139219, 139222, 139225, 139228, 139231, 139234, 139237, 139240, 139243, - 139246, 139249, 139252, 139255, 139258, 139261, 139264, 139267, 139270, - 139273, 139276, 139279, 139282, 139285, 139288, 139291, 139294, 139297, - 139300, 139303, 139306, 139309, 139312, 139315, 139318, 139321, 139324, - 139327, 139330, 139333, 139336, 139339, 139342, 139345, 139348, 139351, - 139354, 139357, 139360, 139363, 139366, 139369, 139372, 139375, 139378, - 139381, 139384, 139387, 139390, 139393, 139396, 139399, 139402, 139405, - 139408, 139411, 139414, 139417, 139420, 139423, 139426, 139429, 139432, - 139435, 139438, 139441, 139444, 139447, 139450, 139453, 139456, 139459, - 139462, 139465, 139468, 139471, 139474, 139477, 139480, 139483, 139486, - 139489, 139492, 139495, 139498, 139501, 139504, 139507, 139510, 139513, - 139516, 139519, 139522, 139525, 139528, 139531, 139534, 139537, 139540, - 139543, 139546, 139549, 139552, 139555, 139558, 139561, 139564, 139567, - 139570, 139573, 139576, 139579, 139582, 139585, 139588, 139591, 139594, - 139597, 139600, 139603, 139606, 139609, 139612, 139615, 139618, 139621, - 139624, 139627, 139630, 139633, 139636, 139639, 139642, 139645, 139648, - 139651, 139654, 139657, 139660, 139663, 139666, 139669, 139672, 139675, - 139678, 139681, 139684, 139687, 139690, 139693, 139696, 139699, 139702, - 139705, 139708, 139711, 139714, 139717, 139720, 139723, 139726, 139729, - 139732, 139735, 139738, 139741, 139744, 139747, 139750, 139753, 139756, - 139759, 139762, 139765, 139768, 139771, 139774, 139777, 139780, 139783, - 139786, 139789, 139792, 139795, 139798, 139801, 139804, 139807, 139810, - 139813, 139816, 139819, 139822, 139825, 139828, 139831, 139834, 139837, - 139840, 139843, 139846, 139849, 139852, 139855, 139858, 139861, 139864, - 139867, 139870, 139873, 139876, 139879, 139882, 139885, 139888, 139891, - 139894, 139897, 139900, 139903, 139906, 139909, 139912, 139915, 139918, - 139921, 139924, 139927, 139930, 139933, 139936, 139939, 139942, 139945, - 139948, 139951, 139954, 139957, 139960, 139963, 139966, 139969, 139972, - 139975, 139978, 139981, 139984, 139987, 139990, 139993, 139996, 139999, - 140002, 140005, 140008, 140011, 140014, 140017, 140020, 140023, 140026, - 140029, 140032, 140035, 140038, 140041, 140044, 140047, 140050, 140053, - 140056, 140059, 140062, 140065, 140068, 140071, 140074, 140077, 140080, - 140083, 140086, 140089, 140092, 140095, 140098, 140101, 140104, 140107, - 140110, 140113, 140116, 140119, 140122, 140125, 140128, 140131, 140134, - 140137, 140140, 140143, 140146, 140149, 140152, 140155, 140158, 140161, - 140164, 140167, 140170, 140173, 140176, 140179, 140182, 140185, 140188, - 140191, 140194, 140197, 140200, 140203, 140206, 140209, 140212, 140215, - 140218, 140221, 140224, 140227, 140230, 140233, 140236, 140239, 140242, - 140245, 140248, 140251, 140254, 140257, 140260, 140263, 140266, 140269, - 140272, 140275, 140278, 140281, 140284, 140287, 140290, 140293, 140296, - 140299, 140302, 140305, 140308, 140311, 140314, 140317, 140320, 140323, - 140326, 140329, 140332, 140335, 140338, 140341, 140344, 140347, 140350, - 140353, 140356, 140359, 140362, 140365, 140368, 140371, 140374, 140377, - 140380, 140383, 140386, 140389, 140392, 140395, 140398, 140401, 140404, - 140407, 140410, 140413, 140416, 140419, 140422, 140425, 140428, 140431, - 140434, 140437, 140440, 140443, 140446, 140449, 140452, 140455, 140458, - 140461, 140464, 140467, 140470, 140473, 140476, 140479, 140482, 140485, - 140488, 140491, 140494, 140497, 140500, 140503, 140506, 140509, 140512, - 140515, 140518, 140521, 140524, 140527, 140530, 140533, 140536, 140539, - 140542, 140545, 140548, 140551, 140554, 140557, 140560, 140563, 140566, - 140569, 140572, 140575, 140578, 140581, 140584, 140587, 140590, 140593, - 140596, 140599, 140602, 140605, 140608, 140611, 140614, 140617, 140620, - 140623, 140626, 140629, 140632, 140635, 140638, 140641, 140644, 140647, - 140650, 140653, 140656, 140659, 140662, 140665, 140668, 140671, 140674, - 140677, 140680, 140683, 140686, 140689, 140692, 140695, 140698, 140701, - 140704, 140707, 140710, 140713, 140716, 140719, 140722, 140725, 140728, - 140731, 140734, 140737, 140740, 140743, 140746, 140749, 140752, 140755, - 140758, 140761, 140764, 140767, 140770, 140773, 140776, 140779, 140782, - 140785, 140788, 140791, 140794, 140797, 140800, 140803, 140806, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140809, 140814, 140820, 140824, 140828, - 140832, 140836, 140840, 140844, 140848, 140852, 140856, 140860, 140864, - 140868, 140872, 140876, 140880, 140884, 140888, 140892, 140896, 140900, - 140904, 140908, 140912, 140916, 140920, 140924, 140928, 140932, 140936, - 140940, 140944, 140948, 140952, 140956, 140960, 140964, 140968, 140972, - 140976, 140980, 140984, 140988, 140992, 140996, 141000, 141004, 141008, - 141012, 141016, 141020, 141024, 141028, 141032, 141036, 141040, 141044, - 141048, 141052, 141056, 141060, 141064, 141068, 141072, 141076, 141080, - 141084, 141088, 141092, 141096, 141100, 141104, 141108, 141112, 141116, - 141120, 141124, 141128, 141132, 141136, 141140, 141144, 141148, 141152, - 141156, 141160, 141164, 141168, 141172, 141176, 141180, 141184, 141188, - 141192, 141196, 141200, 141204, 141208, 141212, 141216, 141220, 141224, - 141228, 141232, 141236, 141240, 141244, 141248, 141252, 141256, 141260, - 141264, 141268, 141272, 141276, 141280, 141284, 141288, 141292, 141296, - 141300, 141304, 141308, 141312, 141316, 141320, 141324, 141328, 141332, - 141336, 141340, 141344, 141348, 141352, 141356, 141360, 141364, 141368, - 141372, 141376, 141380, 141384, 141388, 141392, 141396, 141400, 141404, - 141408, 141412, 141416, 141420, 141424, 141428, 141432, 141436, 141440, - 141444, 141448, 141452, 141456, 141460, 141464, 141468, 141472, 141476, - 141480, 141484, 141488, 141492, 141496, 141500, 141504, 141508, 141512, - 141516, 141520, 141524, 141528, 141532, 141536, 141540, 141544, 141548, - 141552, 141556, 141560, 141564, 141568, 141572, 141576, 141580, 141584, - 141588, 141592, 141596, 141600, 141604, 141608, 141612, 141616, 141620, - 141624, 141628, 141632, 141636, 141640, 141644, 141648, 141652, 141656, - 141660, 141664, 141668, 141672, 141676, 141680, 141684, 141688, 141692, - 141696, 141700, 141704, 141708, 141712, 141716, 141720, 141724, 141728, - 141732, 141736, 141740, 141744, 141748, 141752, 141756, 141760, 141764, - 141768, 141772, 141776, 141780, 141784, 141788, 141792, 141796, 141800, - 141804, 141808, 141812, 141816, 141820, 141824, 141828, 141832, 141836, - 141840, 141844, 141848, 141852, 141856, 141860, 141864, 141868, 141872, - 141876, 141880, 141884, 141888, 141892, 141896, 141900, 141904, 141908, - 141912, 141916, 141920, 141924, 141928, 141932, 141936, 141940, 141944, - 141948, 141952, 141956, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 141960, 141965, 141970, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 141975, 141980, 141985, 141990, 0, 0, 0, 0, - 0, 0, 0, 0, 141995, 141998, 142001, 142004, 142007, 142010, 142013, - 142016, 142019, 142022, 142025, 142028, 142031, 142034, 142037, 142040, - 142043, 142046, 142049, 142052, 142055, 142058, 142061, 142064, 142067, - 142070, 142073, 142076, 142079, 142082, 142085, 142088, 142091, 142094, - 142097, 142100, 142103, 142106, 142109, 142112, 142115, 142118, 142121, - 142124, 142127, 142130, 142133, 142136, 142139, 142142, 142145, 142148, - 142151, 142154, 142157, 142160, 142163, 142166, 142169, 142172, 142175, - 142178, 142181, 142184, 142187, 142190, 142193, 142196, 142199, 142202, - 142205, 142208, 142211, 142214, 142217, 142220, 142223, 142226, 142229, - 142232, 142235, 142238, 142241, 142244, 142247, 142250, 142253, 142256, - 142259, 142262, 142265, 142268, 142271, 142274, 142277, 142280, 142283, - 142286, 142289, 142292, 142295, 142298, 142301, 142304, 142307, 142310, - 142313, 142316, 142319, 142322, 142325, 142328, 142331, 142334, 142337, - 142340, 142343, 142346, 142349, 142352, 142355, 142358, 142361, 142364, - 142367, 142370, 142373, 142376, 142379, 142382, 142385, 142388, 142391, - 142394, 142397, 142400, 142403, 142406, 142409, 142412, 142415, 142418, - 142421, 142424, 142427, 142430, 142433, 142436, 142439, 142442, 142445, - 142448, 142451, 142454, 142457, 142460, 142463, 142466, 142469, 142472, - 142475, 142478, 142481, 142484, 142487, 142490, 142493, 142496, 142499, - 142502, 142505, 142508, 142511, 142514, 142517, 142520, 142523, 142526, - 142529, 142532, 142535, 142538, 142541, 142544, 142547, 142550, 142553, - 142556, 142559, 142562, 142565, 142568, 142571, 142574, 142577, 142580, - 142583, 142586, 142589, 142592, 142595, 142598, 142601, 142604, 142607, - 142610, 142613, 142616, 142619, 142622, 142625, 142628, 142631, 142634, - 142637, 142640, 142643, 142646, 142649, 142652, 142655, 142658, 142661, - 142664, 142667, 142670, 142673, 142676, 142679, 142682, 142685, 142688, - 142691, 142694, 142697, 142700, 142703, 142706, 142709, 142712, 142715, - 142718, 142721, 142724, 142727, 142730, 142733, 142736, 142739, 142742, - 142745, 142748, 142751, 142754, 142757, 142760, 142763, 142766, 142769, - 142772, 142775, 142778, 142781, 142784, 142787, 142790, 142793, 142796, - 142799, 142802, 142805, 142808, 142811, 142814, 142817, 142820, 142823, - 142826, 142829, 142832, 142835, 142838, 142841, 142844, 142847, 142850, - 142853, 142856, 142859, 142862, 142865, 142868, 142871, 142874, 142877, - 142880, 142883, 142886, 142889, 142892, 142895, 142898, 142901, 142904, - 142907, 142910, 142913, 142916, 142919, 142922, 142925, 142928, 142931, - 142934, 142937, 142940, 142943, 142946, 142949, 142952, 142955, 142958, - 142961, 142964, 142967, 142970, 142973, 142976, 142979, 142982, 142985, - 142988, 142991, 142994, 142997, 143000, 143003, 143006, 143009, 143012, - 143015, 143018, 143021, 143024, 143027, 143030, 143033, 143036, 143039, - 143042, 143045, 143048, 143051, 143054, 143057, 143060, 143063, 143066, - 143069, 143072, 143075, 143078, 143081, 143084, 143087, 143090, 143093, - 143096, 143099, 143102, 143105, 143108, 143111, 143114, 143117, 143120, - 143123, 143126, 143129, 143132, 143135, 143138, 143141, 143144, 143147, - 143150, 143153, 143156, 143159, 143162, 143165, 143168, 143171, 143174, - 143177, 143180, 0, 0, 0, 0, 143183, 143187, 143191, 143195, 143199, - 143203, 143207, 143210, 143214, 143218, 143222, 143226, 143229, 143235, - 143241, 143247, 143253, 143259, 143263, 143269, 143273, 143277, 143283, - 143287, 143291, 143295, 143299, 143303, 143307, 143311, 143317, 143323, - 143329, 143335, 143342, 143349, 143356, 143367, 143374, 143381, 143387, - 143393, 143399, 143405, 143413, 143421, 143429, 143437, 143446, 143452, - 143460, 143466, 143473, 143479, 143486, 143492, 143500, 143504, 143508, - 143513, 143519, 143525, 143533, 143541, 143547, 143554, 143557, 143563, - 143567, 143570, 143574, 143577, 143580, 143584, 143589, 143593, 143597, - 143603, 143608, 143614, 143618, 143622, 143625, 143629, 143633, 143638, - 143642, 143647, 143651, 143656, 143660, 143664, 143668, 143672, 143676, - 143680, 143684, 143688, 143693, 143698, 143703, 143708, 143714, 143720, - 143726, 143732, 143738, 0, 0, 0, 0, 0, 143743, 143751, 143760, 143768, - 143775, 143783, 143790, 143797, 143806, 143813, 143820, 143828, 143836, - 0, 0, 0, 143844, 143849, 143856, 143862, 143869, 143875, 143881, 143887, - 143893, 0, 0, 0, 0, 0, 0, 0, 143899, 143904, 143911, 143917, 143924, - 143930, 143936, 143942, 143948, 143954, 0, 0, 143959, 143965, 143971, - 143974, 143983, 143990, 143998, 144005, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 144012, 144017, 144022, 144027, 144034, - 144041, 144048, 144055, 144060, 144065, 144070, 144075, 144082, 144087, - 144094, 144101, 144106, 144111, 144116, 144123, 144128, 144133, 144140, - 144147, 144152, 144157, 144162, 144169, 144176, 144183, 144188, 144193, - 144200, 144207, 144214, 144221, 144226, 144231, 144236, 144243, 144248, - 144253, 144258, 144265, 144274, 144281, 144286, 144291, 144296, 144301, - 144306, 144311, 144320, 144327, 144332, 144339, 144346, 144351, 144356, - 144361, 144368, 144373, 144380, 144387, 144392, 144397, 144402, 144409, - 144416, 144421, 144426, 144433, 144440, 144447, 144452, 144457, 144462, - 144467, 144474, 144483, 144492, 144497, 144504, 144513, 144518, 144523, - 144528, 144533, 144540, 144547, 144554, 144561, 144566, 144571, 144576, - 144583, 144590, 144597, 144602, 144607, 144614, 144619, 144626, 144631, - 144638, 144643, 144650, 144657, 144662, 144667, 144672, 144677, 144682, - 144687, 144692, 144697, 144702, 144709, 144716, 144723, 144730, 144737, - 144746, 144751, 144756, 144763, 144770, 144775, 144782, 144789, 144796, - 144803, 144810, 144817, 144822, 144827, 144832, 144837, 144842, 144851, - 144860, 144869, 144878, 144887, 144896, 144905, 144914, 144919, 144930, - 144941, 144950, 144955, 144960, 144965, 144970, 144979, 144986, 144993, - 145000, 145007, 145014, 145021, 145030, 145039, 145050, 145059, 145070, - 145079, 145086, 145095, 145106, 145115, 145124, 145133, 145142, 145149, - 145156, 145163, 145172, 145181, 145192, 145201, 145210, 145221, 145226, - 145231, 145242, 145250, 145259, 145268, 145277, 145288, 145297, 145306, - 145317, 145328, 145339, 145350, 145361, 145372, 145379, 145386, 145393, - 145400, 145411, 145420, 145427, 145434, 145441, 145452, 145463, 145474, - 145485, 145496, 145507, 145518, 145529, 145536, 145543, 145552, 145561, - 145568, 145575, 145582, 145591, 145600, 145609, 145616, 145625, 145634, - 145643, 145650, 145657, 145662, 145668, 145675, 145682, 145689, 145696, - 145703, 145710, 145719, 145728, 145737, 145746, 145753, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 145762, 145768, 145773, 145778, 145785, 145791, 145797, - 145803, 145809, 145815, 145821, 145827, 145831, 145835, 145841, 145847, - 145853, 145857, 145862, 145867, 145871, 145875, 145878, 145884, 145890, - 145896, 145902, 145908, 145914, 145920, 145926, 145932, 145942, 145952, - 145958, 145964, 145974, 145984, 145990, 0, 0, 145996, 146004, 146009, - 146014, 146020, 146026, 146032, 146038, 146044, 146050, 146057, 146064, - 146070, 146076, 146082, 146088, 146094, 146100, 146106, 146112, 146117, - 146123, 146129, 146135, 146141, 146147, 146156, 146162, 146167, 146175, - 146182, 146189, 146198, 146207, 146216, 146225, 146234, 146243, 146252, - 146261, 146271, 146281, 146289, 146297, 146306, 146315, 146321, 146327, - 146333, 146339, 146347, 146355, 146359, 146365, 146370, 146376, 146382, - 146388, 146394, 146400, 146409, 146414, 146421, 146426, 146431, 146436, - 146442, 146448, 146454, 146461, 146466, 146471, 146476, 146481, 146486, - 146492, 146498, 146504, 146510, 146516, 146522, 146528, 146534, 146539, - 146544, 146549, 146554, 146559, 146564, 146569, 146574, 146580, 146586, - 146591, 146596, 146601, 146606, 146611, 146617, 146624, 146628, 146632, - 146636, 146640, 146644, 146648, 146652, 146656, 146664, 146674, 146678, - 146682, 146688, 146694, 146700, 146706, 146712, 146718, 146724, 146730, - 146736, 146742, 146748, 146754, 146760, 146766, 146770, 146774, 146781, - 146787, 146793, 146799, 146804, 146811, 146816, 146822, 146828, 146834, - 146840, 146845, 146849, 146855, 146859, 146863, 146867, 146873, 146879, - 146883, 146889, 146895, 146901, 146907, 146913, 146921, 146929, 146935, - 146941, 146947, 146953, 146965, 146977, 146991, 147003, 147015, 147029, - 147043, 147057, 147061, 147069, 147077, 147082, 147086, 147090, 147094, - 147098, 147102, 147106, 147110, 147116, 147122, 147128, 147134, 147142, - 147151, 147158, 147165, 147173, 147180, 147192, 147204, 147216, 147228, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 147235, 147242, 147249, 147256, 147263, 147270, 147277, 147284, 147291, - 147298, 147305, 147312, 147319, 147326, 147333, 147340, 147347, 147354, - 147361, 147368, 147375, 147382, 147389, 147396, 147403, 147410, 147417, - 147424, 147431, 147438, 147445, 147452, 147459, 147466, 147473, 147480, - 147487, 147494, 147501, 147508, 147515, 147522, 147529, 147536, 147543, - 147550, 147557, 147564, 147571, 147578, 147585, 147592, 147599, 147606, - 147613, 147620, 147627, 147634, 147641, 147648, 147655, 147662, 147669, - 147676, 147683, 147690, 147697, 147702, 147707, 147712, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 147716, 147722, 147727, 147732, 147737, 147742, 147747, - 147752, 147757, 147762, 147767, 147773, 147779, 147785, 147791, 147797, - 147803, 147809, 147815, 147821, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 147827, 147832, 147839, 147846, 147853, 147860, 147865, 147870, 147877, - 147882, 147887, 147894, 147899, 147904, 147909, 147916, 147925, 147930, - 147935, 147940, 147945, 147950, 147955, 147962, 147967, 147972, 147977, - 147982, 147987, 147992, 147997, 148002, 148007, 148012, 148017, 148022, - 148028, 148033, 148038, 148043, 148048, 148053, 148058, 148063, 148068, - 148073, 148082, 148087, 148096, 148101, 148106, 148111, 148116, 148121, - 148126, 148131, 148140, 148145, 148150, 148155, 148160, 148165, 148172, - 148177, 148184, 148189, 148194, 148199, 148204, 148209, 148214, 148219, - 148224, 148229, 148234, 148239, 148244, 148249, 148254, 148259, 148264, - 148269, 148274, 148279, 148288, 148293, 148298, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 148303, 148311, 148319, 148327, 148335, 148343, 148351, 148359, - 148367, 148375, 148383, 148391, 148399, 148407, 148415, 148423, 148431, - 148439, 148447, 148452, 148457, 148462, 148467, 148472, 148476, 0, 0, 0, - 0, 0, 0, 0, 148480, 148484, 148489, 148494, 148499, 148503, 148508, - 148513, 148518, 148522, 148527, 148532, 148536, 148541, 148546, 148550, - 148555, 148560, 148564, 148569, 148574, 148578, 148583, 148588, 148593, - 148598, 148603, 148607, 148612, 148617, 148622, 148626, 148631, 148636, - 148641, 148645, 148650, 148655, 148659, 148664, 148669, 148673, 148678, - 148683, 148687, 148692, 148697, 148701, 148706, 148711, 148716, 148721, - 148726, 148730, 148735, 148740, 148745, 148749, 148754, 148759, 148764, - 148768, 148773, 148778, 148782, 148787, 148792, 148796, 148801, 148806, - 148810, 148815, 148820, 148824, 148829, 148834, 148839, 148844, 148849, - 148853, 148858, 148863, 148868, 148872, 148877, 0, 148882, 148886, - 148891, 148896, 148900, 148905, 148910, 148914, 148919, 148924, 148928, - 148933, 148938, 148942, 148947, 148952, 148957, 148962, 148967, 148972, - 148978, 148984, 148990, 148995, 149001, 149007, 149013, 149018, 149024, - 149030, 149035, 149041, 149047, 149052, 149058, 149064, 149069, 149075, - 149081, 149086, 149092, 149098, 149104, 149110, 149116, 149121, 149127, - 149133, 149139, 149144, 149150, 149156, 149162, 149167, 149173, 149179, - 149184, 149190, 149196, 149201, 149207, 149213, 149218, 149224, 149230, - 149235, 149241, 149247, 149253, 149259, 149265, 0, 149269, 149274, 0, 0, - 149279, 0, 0, 149284, 149289, 0, 0, 149294, 149299, 149303, 149308, 0, - 149313, 149318, 149323, 149327, 149332, 149337, 149342, 149347, 149352, - 149356, 149361, 149366, 0, 149371, 0, 149376, 149381, 149385, 149390, - 149395, 149399, 149404, 0, 149409, 149414, 149419, 149423, 149428, - 149433, 149437, 149442, 149447, 149452, 149457, 149462, 149467, 149473, - 149479, 149485, 149490, 149496, 149502, 149508, 149513, 149519, 149525, - 149530, 149536, 149542, 149547, 149553, 149559, 149564, 149570, 149576, - 149581, 149587, 149593, 149599, 149605, 149611, 149616, 149622, 149628, - 149634, 149639, 149645, 149651, 149657, 149662, 149668, 149674, 149679, - 149685, 149691, 149696, 149702, 149708, 149713, 149719, 149725, 149730, - 149736, 149742, 149748, 149754, 149760, 149764, 0, 149769, 149774, - 149778, 149783, 0, 0, 149788, 149793, 149798, 149802, 149807, 149812, - 149816, 149821, 0, 149826, 149831, 149836, 149840, 149845, 149850, - 149855, 0, 149860, 149864, 149869, 149874, 149879, 149883, 149888, - 149893, 149898, 149902, 149907, 149912, 149916, 149921, 149926, 149930, - 149935, 149940, 149944, 149949, 149954, 149958, 149963, 149968, 149973, - 149978, 149983, 149988, 0, 149994, 150000, 150005, 150011, 0, 150017, - 150022, 150028, 150034, 150039, 0, 150045, 0, 0, 0, 150050, 150056, - 150062, 150067, 150073, 150079, 150085, 0, 150091, 150096, 150102, - 150108, 150114, 150119, 150125, 150131, 150137, 150142, 150148, 150154, - 150159, 150165, 150171, 150176, 150182, 150188, 150193, 150199, 150205, - 150210, 150216, 150222, 150228, 150234, 150240, 150245, 150251, 150257, - 150263, 150268, 150274, 150280, 150286, 150291, 150297, 150303, 150308, - 150314, 150320, 150325, 150331, 150337, 150342, 150348, 150354, 150359, - 150365, 150371, 150377, 150383, 150389, 150394, 150400, 150406, 150412, - 150417, 150423, 150429, 150435, 150440, 150446, 150452, 150457, 150463, - 150469, 150474, 150480, 150486, 150491, 150497, 150503, 150508, 150514, - 150520, 150526, 150532, 150538, 150542, 150547, 150552, 150557, 150561, - 150566, 150571, 150576, 150580, 150585, 150590, 150594, 150599, 150604, - 150608, 150613, 150618, 150622, 150627, 150632, 150636, 150641, 150646, - 150651, 150656, 150661, 150665, 150670, 150675, 150680, 150684, 150689, - 150694, 150699, 150703, 150708, 150713, 150717, 150722, 150727, 150731, - 150736, 150741, 150745, 150750, 150755, 150759, 150764, 150769, 150774, - 150779, 150784, 150789, 150795, 150801, 150807, 150812, 150818, 150824, - 150830, 150835, 150841, 150847, 150852, 150858, 150864, 150869, 150875, - 150881, 150886, 150892, 150898, 150903, 150909, 150915, 150921, 150927, - 150933, 150938, 150944, 150950, 150956, 150961, 150967, 150973, 150979, - 150984, 150990, 150996, 151001, 151007, 151013, 151018, 151024, 151030, - 151035, 151041, 151047, 151052, 151058, 151064, 151070, 151076, 151082, - 151087, 151093, 151099, 151105, 151110, 151116, 151122, 151128, 151133, - 151139, 151145, 151150, 151156, 151162, 151167, 151173, 151179, 151184, - 151190, 151196, 151201, 151207, 151213, 151219, 151225, 151231, 151236, - 151242, 151248, 151254, 151259, 151265, 151271, 151277, 151282, 151288, - 151294, 151299, 151305, 151311, 151316, 151322, 151328, 151333, 151339, - 151345, 151350, 151356, 151362, 151368, 151374, 151380, 151386, 151393, - 151400, 151407, 151413, 151420, 151427, 151434, 151440, 151447, 151454, - 151460, 151467, 151474, 151480, 151487, 151494, 151500, 151507, 151514, - 151520, 151527, 151534, 151541, 151548, 151555, 151561, 151568, 151575, - 151582, 151588, 151595, 151602, 151609, 151615, 151622, 151629, 151635, - 151642, 151649, 151655, 151662, 151669, 151675, 151682, 151689, 151695, - 151702, 151709, 151716, 151723, 151730, 151735, 151741, 151747, 151753, - 151758, 151764, 151770, 151776, 151781, 151787, 151793, 151798, 151804, - 151810, 151815, 151821, 151827, 151832, 151838, 151844, 151849, 151855, - 151861, 151867, 151873, 151879, 151884, 151890, 151896, 151902, 151907, - 151913, 151919, 151925, 151930, 151936, 151942, 151947, 151953, 151959, - 151964, 151970, 151976, 151981, 151987, 151993, 151998, 152004, 152010, - 152016, 152022, 152028, 152034, 0, 0, 152041, 152046, 152051, 152056, - 152061, 152066, 152071, 152076, 152081, 152086, 152091, 152096, 152101, - 152106, 152111, 152116, 152121, 152126, 152132, 152137, 152142, 152147, - 152152, 152157, 152162, 152167, 152171, 152176, 152181, 152186, 152191, - 152196, 152201, 152206, 152211, 152216, 152221, 152226, 152231, 152236, - 152241, 152246, 152251, 152256, 152262, 152267, 152272, 152277, 152282, - 152287, 152292, 152297, 152303, 152308, 152313, 152318, 152323, 152328, - 152333, 152338, 152343, 152348, 152353, 152358, 152363, 152368, 152373, - 152378, 152383, 152388, 152393, 152398, 152403, 152408, 152413, 152418, - 152424, 152429, 152434, 152439, 152444, 152449, 152454, 152459, 152463, - 152468, 152473, 152478, 152483, 152488, 152493, 152498, 152503, 152508, - 152513, 152518, 152523, 152528, 152533, 152538, 152543, 152548, 152554, - 152559, 152564, 152569, 152574, 152579, 152584, 152589, 152595, 152600, - 152605, 152610, 152615, 152620, 152625, 152631, 152637, 152643, 152649, - 152655, 152661, 152667, 152673, 152679, 152685, 152691, 152697, 152703, - 152709, 152715, 152721, 152727, 152734, 152740, 152746, 152752, 152758, - 152764, 152770, 152776, 152781, 152787, 152793, 152799, 152805, 152811, - 152817, 152823, 152829, 152835, 152841, 152847, 152853, 152859, 152865, - 152871, 152877, 152883, 152890, 152896, 152902, 152908, 152914, 152920, - 152926, 152932, 152939, 152945, 152951, 152957, 152963, 152969, 152975, - 152981, 152987, 152993, 152999, 153005, 153011, 153017, 153023, 153029, - 153035, 153041, 153047, 153053, 153059, 153065, 153071, 153077, 153084, - 153090, 153096, 153102, 153108, 153114, 153120, 153126, 153131, 153137, - 153143, 153149, 153155, 153161, 153167, 153173, 153179, 153185, 153191, - 153197, 153203, 153209, 153215, 153221, 153227, 153233, 153240, 153246, - 153252, 153258, 153264, 153270, 153276, 153282, 153289, 153295, 153301, - 153307, 153313, 153319, 153325, 153332, 153339, 153346, 153353, 153360, - 153367, 153374, 153381, 153388, 153395, 153402, 153409, 153416, 153423, - 153430, 153437, 153444, 153452, 153459, 153466, 153473, 153480, 153487, - 153494, 153501, 153507, 153514, 153521, 153528, 153535, 153542, 153549, - 153556, 153563, 153570, 153577, 153584, 153591, 153598, 153605, 153612, - 153619, 153626, 153634, 153641, 153648, 153655, 153662, 153669, 153676, - 153683, 153691, 153698, 153705, 153712, 153719, 153726, 153733, 153738, - 0, 0, 153743, 153748, 153752, 153756, 153760, 153764, 153768, 153772, - 153776, 153780, 153784, 153790, 153795, 153800, 153805, 153810, 153815, - 153820, 153825, 153830, 153835, 153840, 153844, 153848, 153852, 153856, - 153860, 153864, 153868, 153872, 153876, 153882, 153887, 153892, 153897, - 153902, 153907, 153912, 153917, 153922, 153927, 153933, 153938, 153943, - 153948, 153953, 153958, 153963, 153968, 153973, 153978, 153982, 153987, - 153992, 153997, 154002, 154007, 154012, 154018, 154026, 154033, 154038, - 154043, 154050, 154056, 154061, 154067, 154073, 154081, 154087, 154094, - 154102, 154108, 154117, 154126, 154134, 154142, 154148, 154155, 154163, - 154171, 154177, 154184, 154193, 154202, 154209, 154220, 154230, 154240, - 154250, 154260, 154267, 154274, 154281, 154288, 154297, 154306, 154317, - 154328, 154337, 154346, 154357, 154366, 154375, 154386, 154395, 154404, - 154412, 154420, 154431, 154442, 154450, 154459, 154468, 154475, 154486, - 154497, 154506, 154515, 154522, 154531, 154540, 154549, 154560, 154569, - 154579, 154588, 154597, 154608, 154621, 154636, 154647, 154660, 154672, - 154681, 154692, 154703, 154712, 154723, 154737, 154752, 154755, 154764, - 154769, 154775, 154783, 154789, 154795, 154804, 154811, 154821, 154833, - 154840, 154843, 154849, 154856, 154862, 154867, 154870, 154875, 154878, - 154885, 154891, 154899, 154906, 154913, 154919, 154924, 154927, 154930, - 154933, 154939, 154946, 154952, 154957, 154964, 154967, 154972, 154979, - 154985, 154993, 155000, 155010, 155019, 155022, 155028, 155035, 155042, - 155049, 155054, 155062, 155070, 155079, 155085, 155094, 155103, 155112, - 155118, 155127, 155134, 155141, 155148, 155156, 155162, 155170, 155176, - 155183, 155190, 155198, 155209, 155219, 155225, 155232, 155239, 155246, - 155252, 155259, 155266, 155271, 155278, 155286, 155295, 155301, 155313, - 155324, 155330, 155338, 155344, 155351, 155358, 155365, 155371, 155378, - 155387, 155393, 155399, 155406, 155413, 155421, 155431, 155441, 155451, - 155461, 155469, 155477, 155487, 155495, 155500, 155505, 155510, 155516, - 155523, 155530, 155536, 155542, 155547, 155554, 155562, 155572, 155580, - 155588, 155598, 155608, 155616, 155626, 155636, 155648, 155660, 155672, - 155682, 155688, 155694, 155701, 155710, 155719, 155728, 155737, 155747, - 155756, 155765, 155774, 155779, 155785, 155794, 155804, 155813, 155819, - 155825, 155832, 155839, 155846, 155852, 155859, 155866, 155873, 155879, - 155883, 155888, 155895, 155902, 155909, 155914, 155922, 155930, 155939, - 155947, 155954, 155962, 155971, 155981, 155984, 155988, 155993, 155998, - 156003, 156008, 156013, 156018, 156023, 156028, 156033, 156038, 156043, - 156048, 156053, 156058, 156063, 156068, 156073, 156080, 156086, 156093, - 156099, 156104, 156111, 156117, 156124, 156130, 156135, 156142, 156149, - 156156, 156162, 156168, 156177, 156186, 156197, 156204, 156211, 156220, - 156229, 156238, 156247, 156256, 156262, 156270, 156276, 156286, 156291, - 156300, 156309, 156316, 156327, 156334, 156341, 156348, 156355, 156362, - 156369, 156376, 156383, 156390, 156397, 156403, 156409, 156415, 156422, - 156429, 156436, 156443, 156450, 156457, 156464, 156471, 156478, 156485, - 156492, 156499, 156504, 156513, 156522, 156531, 156538, 156545, 156552, - 156559, 156566, 156573, 156580, 156587, 156596, 156605, 156614, 156623, - 156632, 156641, 156650, 156659, 156668, 156677, 156686, 156695, 156704, - 156710, 156718, 156724, 156734, 156739, 156748, 156757, 156766, 156777, - 156782, 156789, 156796, 156803, 156808, 156814, 156820, 156826, 156833, - 156840, 156847, 156854, 156861, 156868, 156875, 156882, 156889, 156896, - 156903, 156910, 156915, 156924, 156933, 156942, 156951, 156960, 156969, - 156978, 156987, 156998, 157009, 157016, 157023, 157030, 157037, 157044, - 157051, 157059, 157069, 157079, 157089, 157100, 157111, 157122, 157131, - 157140, 157149, 157154, 157159, 157164, 157169, 157180, 157191, 157202, - 157213, 157224, 157234, 157245, 157254, 157263, 157272, 157281, 157290, - 157298, 157307, 157318, 157329, 157340, 157351, 157362, 157374, 157387, - 157399, 157412, 157424, 157437, 157449, 157462, 157473, 157484, 157493, - 157501, 157510, 157521, 157532, 157544, 157557, 157571, 157586, 157598, - 157611, 157623, 157636, 157647, 157658, 157667, 157675, 157684, 157691, - 157698, 157705, 157712, 157719, 157726, 157733, 157740, 157747, 157754, - 157759, 157764, 157769, 157776, 157786, 157797, 157807, 157818, 157832, - 157847, 157862, 157876, 157891, 157906, 157917, 157928, 157941, 157954, - 157963, 157972, 157985, 157998, 158005, 158012, 158017, 158022, 158027, - 158032, 158037, 158044, 158053, 158058, 158061, 158066, 158073, 158080, - 158087, 158094, 158101, 158108, 158121, 158135, 158150, 158157, 158164, - 158171, 158180, 158188, 158196, 158205, 158210, 158215, 158220, 158225, - 158230, 158235, 158242, 158249, 158255, 158262, 158268, 158275, 158280, - 158285, 158290, 158295, 158300, 158307, 158314, 158319, 158326, 158333, - 158338, 158343, 158348, 158353, 158358, 158363, 158370, 158377, 158384, - 158387, 158392, 158397, 158402, 158407, 158414, 158421, 158429, 158437, - 158442, 158447, 158454, 158461, 158468, 158473, 158480, 158487, 158492, - 158499, 158506, 158512, 158518, 158524, 158530, 158538, 158546, 158552, - 158560, 158568, 158573, 158580, 158587, 158592, 158599, 158606, 158613, - 158621, 158629, 158634, 158641, 158648, 158657, 158664, 158673, 158684, - 158693, 158702, 158711, 158720, 158723, 158728, 158735, 158744, 158751, - 158760, 158767, 158772, 158777, 158780, 158783, 158786, 158793, 158800, - 158809, 158818, 158827, 158834, 158841, 158846, 158859, 158864, 158869, - 158874, 158879, 158884, 158889, 158894, 158899, 158902, 158907, 158912, - 158917, 158922, 158927, 158934, 158939, 158946, 158949, 158954, 158957, - 158960, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 158963, 158968, - 158973, 158978, 158983, 0, 158988, 158993, 158998, 159003, 159008, - 159013, 159018, 159023, 159028, 159033, 159038, 159043, 159048, 159053, - 159058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163846, + 163851, 163855, 163860, 163865, 163870, 163875, 163879, 163884, 163888, + 163892, 163896, 163900, 163905, 163910, 163914, 163919, 163924, 163929, + 163934, 163939, 163943, 163947, 163952, 163956, 163960, 163965, 163969, + 163973, 163977, 163982, 163986, 163991, 163996, 164001, 164006, 164011, + 164016, 164021, 164026, 164031, 164036, 164041, 164046, 164051, 164056, + 164061, 164066, 164071, 164076, 164080, 164084, 164088, 164092, 164096, + 164100, 164104, 164108, 0, 0, 0, 0, 0, 164112, 164117, 164124, 164130, + 164137, 164144, 164151, 164158, 164165, 164172, 164179, 164186, 164193, + 164200, 164207, 164214, 164221, 164228, 164235, 164242, 164249, 164256, + 164263, 164270, 164277, 164284, 164291, 164298, 164305, 164312, 164319, + 164326, 164333, 164340, 164347, 164354, 164360, 164366, 164372, 164379, + 164385, 164392, 164398, 164405, 164412, 164419, 164426, 164433, 164440, + 164446, 164453, 164460, 164467, 164474, 164481, 164488, 164495, 164501, + 164508, 164515, 164522, 164529, 164536, 164544, 164551, 164558, 164565, + 164572, 164579, 164586, 164593, 164599, 164606, 164613, 164620, 164627, + 164633, 164640, 164647, 164654, 164661, 164668, 164675, 164682, 164690, + 164697, 164703, 164710, 164717, 164724, 164731, 164738, 164745, 164752, + 164759, 164766, 164773, 164780, 164787, 164794, 164801, 164808, 164815, + 164822, 164829, 164836, 164843, 164849, 164856, 164863, 164870, 164877, + 164884, 164891, 164898, 164905, 164912, 164919, 164926, 164933, 164940, + 164947, 164954, 164961, 164968, 164975, 164982, 164989, 164996, 165003, + 165011, 165019, 165027, 165034, 165041, 165048, 165055, 165062, 165069, + 165076, 165083, 165090, 165097, 165103, 165110, 165117, 165124, 165131, + 165138, 165145, 165152, 165159, 165166, 165173, 165180, 165187, 165194, + 165201, 165209, 165217, 165225, 165232, 165239, 165246, 165253, 165260, + 165267, 165274, 165281, 165288, 165295, 165302, 165309, 165316, 165323, + 165329, 165336, 165343, 165350, 165357, 165364, 165371, 165378, 165385, + 165392, 165399, 165406, 165413, 165420, 165427, 165434, 165441, 165448, + 165455, 165462, 165469, 165476, 165483, 0, 0, 165490, 165494, 165498, + 165502, 165506, 165510, 165514, 165518, 165522, 165526, 165532, 165538, + 165544, 165550, 165558, 165566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 165572, 165578, 165584, 165590, 165596, 165602, 165608, 165614, + 165620, 165625, 165630, 165636, 165641, 165646, 165652, 165658, 165664, + 165670, 165676, 165681, 165686, 165692, 165698, 165703, 165709, 165715, + 165721, 165727, 165733, 165739, 165745, 165751, 165757, 165763, 165769, + 165775, 165781, 165787, 165793, 165799, 165805, 165811, 165817, 165822, + 165827, 165833, 165838, 165843, 165849, 165855, 165861, 165867, 165873, + 165878, 165883, 165889, 165895, 165900, 165906, 165912, 165918, 165924, + 165930, 165936, 165942, 165948, 165954, 165960, 165966, 165972, 165977, + 165982, 165986, 165991, 165998, 166002, 0, 0, 0, 0, 166007, 166012, + 166016, 166020, 166024, 166028, 166032, 166036, 166040, 166044, 0, 0, 0, + 0, 166048, 166054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159063, 159068, 159073, 159078, 159083, - 159088, 159093, 0, 159098, 159103, 159108, 159114, 159118, 159123, - 159128, 159133, 159138, 159143, 159148, 159153, 159158, 159163, 159168, - 159173, 159178, 0, 0, 159183, 159188, 159193, 159198, 159203, 159208, - 159213, 0, 159218, 159223, 0, 159229, 159234, 159242, 159249, 159258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159263, 159270, 159278, 159286, - 159293, 159300, 159307, 159315, 159323, 159331, 159338, 159345, 159353, - 159361, 159369, 159376, 159384, 159392, 159400, 159408, 159416, 159424, - 159432, 159439, 159447, 159454, 159462, 159469, 159477, 159485, 159493, - 159501, 159509, 159517, 159525, 159533, 159541, 159548, 159556, 159563, - 159570, 159577, 159585, 159592, 159600, 0, 0, 0, 159608, 159615, 159622, - 159629, 159636, 159643, 159650, 159657, 159666, 159675, 159684, 159693, - 159702, 159712, 0, 0, 159720, 159728, 159735, 159742, 159749, 159756, - 159763, 159770, 159777, 159784, 0, 0, 0, 0, 159791, 159800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159808, 159813, 159817, 159822, - 159827, 159832, 159837, 159841, 159846, 159850, 159854, 159858, 159862, - 159867, 159872, 159876, 159881, 159886, 159891, 159896, 159901, 159905, - 159909, 159914, 159918, 159922, 159927, 159931, 159935, 159939, 159944, - 159948, 159953, 159958, 159963, 159968, 159973, 159978, 159983, 159988, - 159993, 159998, 160003, 160008, 160013, 160018, 160023, 160028, 160033, - 160038, 160042, 160046, 160050, 160054, 160058, 160062, 160066, 160070, - 0, 0, 0, 0, 0, 160074, 160079, 160086, 160092, 160099, 160106, 160113, - 160120, 160127, 160134, 160141, 160148, 160155, 160162, 160169, 160176, - 160183, 160190, 160197, 160204, 160211, 160218, 160225, 160232, 160239, - 160246, 160253, 160260, 160267, 160274, 160281, 160288, 160295, 160302, - 160309, 160316, 160322, 160328, 160334, 160341, 160347, 160354, 160360, - 160367, 160374, 160381, 160388, 160395, 160402, 160408, 160415, 160422, - 160429, 160436, 160443, 160450, 160457, 160463, 160470, 160477, 160484, - 160491, 160498, 160506, 160513, 160520, 160527, 160534, 160541, 160548, - 160555, 160561, 160568, 160575, 160582, 160589, 160595, 160602, 160609, - 160616, 160623, 160630, 160637, 160644, 160652, 160659, 160665, 160672, - 160679, 160686, 160693, 160700, 160707, 160714, 160721, 160728, 160735, - 160742, 160749, 160756, 160763, 160770, 160777, 160784, 160791, 160798, - 160805, 160811, 160818, 160825, 160832, 160839, 160846, 160853, 160860, - 160867, 160874, 160881, 160888, 160895, 160902, 160909, 160916, 160923, - 160930, 160937, 160944, 160951, 160958, 160965, 160973, 160981, 160989, - 160996, 161003, 161010, 161017, 161024, 161031, 161038, 161045, 161052, - 161059, 161065, 161072, 161079, 161086, 161093, 161100, 161107, 161114, - 161121, 161128, 161135, 161142, 161149, 161156, 161163, 161171, 161179, - 161187, 161194, 161201, 161208, 161215, 161222, 161229, 161236, 161243, - 161250, 161257, 161264, 161271, 161278, 161285, 161291, 161298, 161305, - 161312, 161319, 161326, 161333, 161340, 161347, 161354, 161361, 161368, - 161375, 161382, 161389, 161396, 161403, 161410, 161417, 161424, 161431, - 161438, 161445, 0, 0, 161452, 161456, 161460, 161464, 161468, 161472, - 161476, 161480, 161484, 161488, 161494, 161500, 161506, 161512, 161520, - 161528, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161534, 161540, - 161546, 161552, 161558, 161564, 161570, 161576, 161582, 161587, 161592, - 161598, 161603, 161608, 161614, 161620, 161626, 161632, 161638, 161643, - 161648, 161654, 161660, 161665, 161671, 161677, 161683, 161689, 161695, - 161701, 161707, 161713, 161719, 161725, 161731, 161737, 161743, 161749, - 161755, 161761, 161767, 161773, 161779, 161784, 161789, 161795, 161800, - 161805, 161811, 161817, 161823, 161829, 161835, 161840, 161845, 161851, - 161857, 161862, 161868, 161874, 161880, 161886, 161892, 161898, 161904, - 161910, 161916, 161922, 161928, 161934, 161939, 161944, 161948, 161953, - 161960, 161964, 0, 0, 0, 0, 161969, 161974, 161978, 161982, 161986, - 161990, 161994, 161998, 162002, 162006, 0, 0, 0, 0, 162010, 162016, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 166060, 166065, 166070, + 166075, 166080, 166085, 166090, 166095, 166100, 166105, 166111, 166117, + 166123, 166129, 166135, 166141, 166147, 166153, 166159, 166166, 166173, + 166180, 166188, 166196, 166204, 166212, 166220, 166228, 166234, 166240, + 166246, 166253, 166260, 166267, 166274, 166281, 166288, 166295, 166302, + 166309, 166316, 166323, 166330, 166337, 166344, 166351, 166357, 166363, + 166369, 166375, 166381, 166388, 166395, 166402, 166409, 166416, 166423, + 166430, 166437, 166444, 166449, 166457, 166465, 166473, 166479, 166486, + 166493, 166502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 166510, 166515, 166520, 166525, 166530, + 166535, 166540, 166545, 166550, 166555, 166561, 166567, 166573, 166579, + 166585, 166591, 166597, 166603, 166609, 166616, 166623, 166630, 166638, + 166646, 166654, 166662, 166670, 166678, 166684, 166690, 166696, 166703, + 166710, 166717, 166724, 166731, 166738, 166745, 166752, 166759, 166766, + 166773, 166780, 166787, 166794, 166801, 166806, 166813, 166820, 166827, + 166834, 166841, 166848, 166855, 166862, 166870, 166880, 166890, 166898, + 166907, 166915, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 162022, 162027, 162032, 162037, 162042, 162047, 162052, 162057, 162062, - 162067, 162073, 162079, 162085, 162091, 162097, 162103, 162109, 162115, - 162121, 162128, 162135, 162142, 162150, 162158, 162166, 162174, 162182, - 162190, 162196, 162202, 162208, 162215, 162222, 162229, 162236, 162243, - 162250, 162257, 162264, 162271, 162278, 162285, 162292, 162299, 162306, - 162313, 162319, 162325, 162331, 162337, 162343, 162350, 162357, 162364, - 162371, 162378, 162385, 162392, 162399, 162406, 162411, 162418, 162425, - 162432, 162438, 162445, 162452, 162461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162469, 162474, - 162479, 162484, 162489, 162494, 162499, 162504, 162509, 162514, 162520, - 162526, 162532, 162538, 162544, 162550, 162556, 162562, 162568, 162575, - 162582, 162589, 162597, 162605, 162613, 162621, 162629, 162637, 162643, - 162649, 162655, 162662, 162669, 162676, 162683, 162690, 162697, 162704, - 162711, 162718, 162725, 162732, 162739, 162746, 162753, 162760, 162765, - 162772, 162779, 162786, 162793, 162800, 162807, 162814, 162821, 162829, - 162839, 162849, 162857, 162866, 162873, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 162880, 162884, 162888, 162892, 0, 162896, 162900, - 162904, 162908, 162912, 162916, 162920, 162924, 162928, 162932, 162936, - 162940, 162944, 162948, 162952, 162956, 162960, 162964, 162968, 162972, - 162976, 162980, 162984, 162988, 162994, 163000, 163006, 0, 163012, - 163017, 0, 163022, 0, 0, 163027, 0, 163032, 163037, 163042, 163047, - 163052, 163057, 163062, 163067, 163072, 163077, 0, 163082, 163087, - 163092, 163097, 0, 163102, 0, 163107, 0, 0, 0, 0, 0, 0, 163112, 0, 0, 0, - 0, 163118, 0, 163124, 0, 163130, 0, 163136, 163142, 163148, 0, 163154, - 163160, 0, 163166, 0, 0, 163172, 0, 163178, 0, 163184, 0, 163190, 0, - 163198, 0, 163206, 163212, 0, 163218, 0, 0, 163224, 163230, 163236, - 163242, 0, 163248, 163254, 163260, 163266, 163272, 163278, 163284, 0, - 163290, 163296, 163302, 163308, 0, 163314, 163320, 163326, 163332, 0, - 163340, 0, 163348, 163354, 163360, 163366, 163372, 163378, 163384, - 163390, 163396, 163402, 0, 163408, 163414, 163420, 163426, 163432, - 163438, 163444, 163450, 163456, 163462, 163468, 163474, 163480, 163486, - 163492, 163498, 163504, 0, 0, 0, 0, 0, 163510, 163516, 163522, 0, 163528, - 163534, 163540, 163546, 163552, 0, 163558, 163564, 163570, 163576, - 163582, 163588, 163594, 163600, 163606, 163612, 163618, 163624, 163630, - 163636, 163642, 163648, 163654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163660, 163670, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 163678, 163685, 163692, 163699, 163705, - 163712, 163719, 163725, 163732, 163739, 163746, 163754, 163762, 163770, - 163778, 163786, 163794, 163801, 163808, 163815, 163823, 163831, 163839, - 163847, 163855, 163863, 163870, 163877, 163884, 163892, 163900, 163908, - 163916, 163924, 163932, 163937, 163942, 163947, 163952, 163957, 163962, - 163967, 163972, 163977, 0, 0, 0, 0, 163982, 163988, 163992, 163996, - 164000, 164004, 164008, 164012, 164016, 164020, 164024, 164028, 164032, - 164036, 164040, 164044, 164048, 164052, 164056, 164060, 164064, 164068, - 164072, 164076, 164080, 164084, 164088, 164092, 164096, 164100, 164104, - 164108, 164112, 164116, 164120, 164124, 164128, 164132, 164136, 164140, - 164144, 164148, 164152, 164156, 164160, 164164, 164168, 164172, 164176, - 164180, 164184, 164189, 164193, 164197, 164201, 164205, 164209, 164213, - 164217, 164221, 164225, 164229, 164233, 164237, 164241, 164245, 164249, - 164253, 164257, 164261, 164265, 164269, 164273, 164277, 164281, 164285, - 164289, 164293, 164297, 164301, 164305, 164309, 164313, 164317, 164321, - 164325, 164329, 164333, 164337, 164341, 164345, 164349, 164353, 164357, - 164361, 164365, 164369, 164373, 164377, 164381, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 164385, 164391, 164400, 164408, 164416, 164425, 164434, - 164443, 164452, 164461, 164470, 164479, 164488, 164497, 164506, 0, 0, - 164515, 164524, 164532, 164540, 164549, 164558, 164567, 164576, 164585, - 164594, 164603, 164612, 164621, 164630, 164639, 0, 164647, 164656, - 164664, 164672, 164681, 164690, 164699, 164708, 164717, 164726, 164735, - 164744, 164753, 164762, 164771, 0, 164778, 164787, 164795, 164803, - 164812, 164821, 164830, 164839, 164848, 164857, 164866, 164875, 164884, - 164893, 164902, 164909, 164915, 164921, 164927, 164933, 164939, 164945, - 164951, 164957, 164963, 164969, 164975, 164981, 164987, 164993, 164999, - 165005, 165011, 165017, 165023, 165029, 165035, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 165041, 165048, 165053, 165057, 165061, 165065, 165070, 165075, - 165080, 165085, 165090, 165095, 165102, 0, 0, 0, 165111, 165116, 165122, - 165128, 165134, 165139, 165145, 165151, 165157, 165162, 165168, 165174, - 165179, 165185, 165191, 165196, 165202, 165208, 165213, 165219, 165225, - 165230, 165236, 165242, 165248, 165254, 165260, 165271, 165278, 165284, - 165287, 165290, 165293, 165298, 165304, 165310, 165316, 165321, 165327, - 165333, 165339, 165344, 165350, 165356, 165361, 165367, 165373, 165378, - 165384, 165390, 165395, 165401, 165407, 165412, 165418, 165424, 165430, - 165436, 165442, 165445, 165448, 165451, 165454, 165457, 165460, 165467, - 165475, 165483, 165491, 165498, 165506, 165514, 165522, 165529, 165537, - 165545, 165552, 165560, 165568, 165575, 165583, 165591, 165598, 165606, - 165614, 165621, 165629, 165637, 165645, 165653, 165661, 165666, 165671, - 0, 0, 0, 165676, 165683, 165691, 165699, 165707, 165714, 165722, 165730, - 165738, 165745, 165753, 165761, 165768, 165776, 165784, 165791, 165799, - 165807, 165814, 165822, 165830, 165837, 165845, 165853, 165861, 165869, - 165877, 165887, 165892, 165896, 165900, 165905, 165910, 165913, 165916, - 165919, 165922, 165925, 165928, 165931, 165934, 165937, 165943, 165946, - 165950, 165955, 165959, 165964, 165969, 165975, 165981, 165987, 165992, - 166000, 166006, 166009, 166012, 166015, 166018, 166021, 166024, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 166923, 166927, 166931, 166935, 0, 166939, 166943, + 166947, 166951, 166955, 166959, 166963, 166967, 166971, 166975, 166979, + 166983, 166987, 166991, 166995, 166999, 167003, 167007, 167011, 167015, + 167019, 167023, 167027, 167031, 167037, 167043, 167049, 0, 167055, + 167060, 0, 167065, 0, 0, 167070, 0, 167075, 167080, 167085, 167090, + 167095, 167100, 167105, 167110, 167115, 167120, 0, 167125, 167130, + 167135, 167140, 0, 167145, 0, 167150, 0, 0, 0, 0, 0, 0, 167155, 0, 0, 0, + 0, 167161, 0, 167167, 0, 167173, 0, 167179, 167185, 167191, 0, 167197, + 167203, 0, 167209, 0, 0, 167215, 0, 167221, 0, 167227, 0, 167233, 0, + 167241, 0, 167249, 167255, 0, 167261, 0, 0, 167267, 167273, 167279, + 167285, 0, 167291, 167297, 167303, 167309, 167315, 167321, 167327, 0, + 167333, 167339, 167345, 167351, 0, 167357, 167363, 167369, 167375, 0, + 167383, 0, 167391, 167397, 167403, 167409, 167415, 167421, 167427, + 167433, 167439, 167445, 0, 167451, 167457, 167463, 167469, 167475, + 167481, 167487, 167493, 167499, 167505, 167511, 167517, 167523, 167529, + 167535, 167541, 167547, 0, 0, 0, 0, 0, 167553, 167559, 167565, 0, 167571, + 167577, 167583, 167589, 167595, 0, 167601, 167607, 167613, 167619, + 167625, 167631, 167637, 167643, 167649, 167655, 167661, 167667, 167673, + 167679, 167685, 167691, 167697, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 166027, 166034, 166042, 166050, 166058, 166065, 166073, - 166081, 166089, 166096, 166104, 166112, 166119, 166127, 166135, 166142, - 166150, 166158, 166165, 166173, 166181, 166188, 166196, 166204, 166212, - 166220, 166228, 166232, 166236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 166239, 166245, 166251, 166257, 166261, 166267, 166273, 166279, 166285, - 166291, 166297, 166303, 166309, 166315, 166321, 166327, 166333, 166339, - 166345, 166351, 166357, 166363, 166369, 166375, 166381, 166387, 166393, - 166399, 166405, 166411, 166417, 166423, 166429, 166435, 166441, 166447, - 166453, 166459, 166465, 166471, 166477, 166483, 166489, 166495, 0, 0, 0, - 0, 166501, 166512, 166523, 166534, 166545, 166556, 166567, 166578, - 166589, 0, 0, 0, 0, 0, 0, 0, 166600, 166605, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 166610, 166616, 166622, 166628, 166634, 166640, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 166646, 166648, 166650, 166654, 166659, 166664, 166666, 166672, 166677, - 166679, 166685, 166689, 166691, 166695, 166701, 166707, 166713, 166718, - 166723, 166730, 166737, 166744, 166749, 166756, 166763, 166770, 166774, - 166781, 166790, 166799, 166806, 166811, 166815, 166819, 166821, 166824, - 166827, 166834, 166841, 166851, 166856, 166861, 166866, 166871, 166873, - 166879, 166883, 166885, 166887, 166889, 166891, 166895, 166899, 166903, - 166905, 166909, 166911, 166915, 166917, 166919, 166921, 166923, 166928, - 166933, 166935, 166941, 166945, 166949, 166957, 166959, 166961, 166963, - 166965, 166967, 166969, 166971, 166973, 166975, 166977, 166981, 166985, - 166987, 166989, 166991, 166993, 166995, 167000, 167006, 167010, 167014, - 167018, 167022, 167027, 167031, 167033, 167035, 167039, 167045, 167047, - 167049, 167051, 167055, 167064, 167070, 167074, 167078, 167080, 167082, - 167085, 167087, 167089, 167091, 167095, 167097, 167101, 167106, 167108, - 167113, 167119, 167126, 167130, 167134, 167138, 167142, 167148, 167152, - 167160, 167167, 167169, 167171, 167175, 167179, 167181, 167185, 167189, - 167191, 167195, 167197, 167201, 167205, 167209, 167213, 167217, 167221, - 167225, 167229, 167235, 167239, 167243, 167254, 167259, 167263, 167267, - 167273, 167277, 167281, 167285, 167292, 167299, 167303, 167307, 167311, - 167315, 167319, 167326, 167328, 167332, 167334, 167336, 167340, 167344, - 167348, 167350, 167354, 167358, 167362, 167366, 167370, 167372, 167376, - 167378, 167384, 167387, 167392, 167394, 167396, 167399, 167401, 167403, - 167406, 167413, 167420, 167427, 167432, 167436, 167438, 167440, 167442, - 167446, 167448, 167452, 167456, 167460, 167462, 167466, 167468, 167472, - 167476, 167483, 167485, 167494, 167503, 167512, 167518, 167520, 167525, - 167529, 167533, 167535, 167541, 167545, 167547, 167551, 167555, 167557, - 167561, 167566, 167570, 167576, 167582, 167584, 167586, 167592, 167594, - 167598, 167602, 167604, 167608, 167610, 167614, 167618, 167622, 167625, - 167628, 167633, 167638, 167640, 167643, 167645, 167652, 167656, 167658, - 167665, 167672, 167679, 167686, 167693, 167695, 167697, 167699, 167703, - 167705, 167707, 167709, 167711, 167713, 167715, 167717, 167719, 167721, - 167723, 167725, 167727, 167729, 167731, 167733, 167735, 167737, 167739, - 167741, 167743, 167745, 167747, 167751, 167753, 167755, 167757, 167761, - 167763, 167767, 167769, 167771, 167775, 167779, 167785, 167787, 167789, - 167791, 167793, 167797, 167801, 167803, 167807, 167811, 167815, 167819, - 167823, 167827, 167831, 167835, 167839, 167843, 167847, 167851, 167855, - 167859, 167863, 167867, 167871, 167875, 167877, 167879, 167881, 167883, - 167885, 167887, 167889, 167897, 167905, 167913, 167921, 167926, 167931, - 167936, 167940, 167944, 167949, 167953, 167955, 167959, 167961, 167963, - 167965, 167967, 167969, 167971, 167973, 167977, 167979, 167981, 167983, - 167987, 167991, 167995, 167999, 168003, 168005, 168011, 168017, 168019, - 168021, 168023, 168025, 168027, 168036, 168043, 168050, 168054, 168061, - 168066, 168073, 168082, 168087, 168091, 168095, 168097, 168101, 168103, - 168107, 168111, 168113, 168117, 168121, 168125, 168127, 168129, 168135, - 168137, 168139, 168141, 168145, 168149, 168151, 168155, 168157, 168159, - 168162, 168166, 168168, 168172, 168174, 168176, 168181, 168183, 168187, - 168191, 168194, 168198, 168202, 168206, 168210, 168214, 168218, 168222, - 168227, 168231, 168235, 168244, 168249, 168252, 168254, 168257, 168260, - 168265, 168267, 168270, 168275, 168279, 168282, 168286, 168290, 168293, - 168298, 168302, 168306, 168310, 168314, 168320, 168326, 168332, 168338, - 168343, 168354, 168356, 168360, 168362, 168364, 168368, 168372, 168374, - 168378, 168383, 168388, 168394, 168396, 168400, 168404, 168411, 168418, - 168422, 168424, 168426, 168430, 168432, 168436, 168440, 168444, 168446, - 168448, 168455, 168459, 168462, 168466, 168470, 168474, 168476, 168480, - 168482, 168484, 168488, 168490, 168494, 168498, 168504, 168508, 168512, - 168516, 168518, 168521, 168525, 168532, 168541, 168550, 168558, 168566, - 168568, 168572, 168574, 168578, 168589, 168593, 168599, 168605, 168610, - 168612, 168617, 168621, 168623, 168625, 168627, 168631, 168635, 168639, - 168644, 168654, 168669, 168681, 168693, 168697, 168701, 168707, 168709, - 168717, 168725, 168727, 168731, 168737, 168743, 168750, 168757, 168759, - 168761, 168764, 168766, 168772, 168774, 168777, 168781, 168787, 168793, - 168804, 168810, 168817, 168825, 168829, 168837, 168845, 168851, 168857, - 168864, 168866, 168870, 168872, 168874, 168879, 168881, 168883, 168885, - 168887, 168891, 168901, 168907, 168911, 168915, 168919, 168925, 168931, - 168937, 168943, 168948, 168953, 168959, 168965, 168972, 168979, 168987, - 168995, 169000, 169008, 169012, 169021, 169030, 169036, 169040, 169044, - 169048, 169051, 169056, 169058, 169060, 169062, 169069, 169074, 169081, - 169088, 169095, 169103, 169111, 169119, 169127, 169135, 169143, 169151, - 169159, 169167, 169173, 169179, 169185, 169191, 169197, 169203, 169209, - 169215, 169221, 169227, 169233, 169239, 169242, 169251, 169260, 169262, - 169269, 169273, 169275, 169277, 169281, 169287, 169291, 169293, 169303, - 169309, 169313, 169315, 169319, 169321, 169325, 169332, 169339, 169346, - 169351, 169356, 169365, 169371, 169376, 169380, 169385, 169389, 169396, - 169400, 169403, 169408, 169415, 169422, 169427, 169432, 169437, 169443, - 169452, 169463, 169469, 169475, 169481, 169491, 169506, 169515, 169523, - 169531, 169539, 169547, 169555, 169563, 169571, 169579, 169587, 169595, - 169603, 169611, 169614, 169618, 169623, 169628, 169630, 169634, 169643, - 169652, 169660, 169664, 169668, 169673, 169678, 169683, 169685, 169690, - 169694, 169696, 169700, 169704, 169710, 169715, 169723, 169728, 169733, - 169738, 169745, 169748, 169750, 169753, 169758, 169764, 169768, 169772, - 169778, 169784, 169786, 169790, 169794, 169798, 169802, 169806, 169808, - 169810, 169812, 169814, 169820, 169826, 169830, 169832, 169834, 169836, - 169845, 169849, 169856, 169863, 169865, 169868, 169872, 169878, 169882, - 169886, 169888, 169896, 169900, 169904, 169909, 169914, 169919, 169924, - 169929, 169934, 169939, 169944, 169949, 169954, 169958, 169964, 169968, - 169974, 169979, 169986, 169992, 170000, 170004, 170011, 170015, 170019, - 170023, 170028, 170033, 170035, 170039, 170048, 170056, 170064, 170077, - 170090, 170103, 170110, 170117, 170121, 170130, 170138, 170142, 170151, - 170158, 170162, 170166, 170170, 170174, 170181, 170185, 170189, 170193, - 170197, 170204, 170213, 170222, 170229, 170241, 170253, 170257, 170261, - 170265, 170269, 170273, 170277, 170285, 170293, 170301, 170305, 170309, - 170313, 170317, 170321, 170325, 170331, 170337, 170341, 170352, 170360, - 170364, 170368, 170372, 170376, 170382, 170389, 170400, 170410, 170420, - 170431, 170440, 170451, 170457, 170463, 170469, 170475, 170481, 170485, - 170492, 170501, 170508, 170514, 170518, 170522, 170526, 170535, 170547, - 170551, 170558, 170565, 170572, 170580, 170587, 170595, 170603, 170612, - 170620, 170629, 170638, 170648, 170657, 170667, 170677, 170688, 170698, - 170709, 170716, 170724, 170731, 170739, 170747, 170756, 170764, 170773, - 170780, 170792, 170799, 170811, 170814, 170818, 170821, 170825, 170831, - 170838, 170844, 170851, 170856, 170862, 170873, 170883, 170894, 170899, - 170904, 170910, 170915, 170922, 170926, 170932, 170934, 170936, 170940, - 170944, 170948, 170957, 170959, 170961, 170964, 170966, 170968, 170972, - 170974, 170978, 170980, 170984, 170986, 170988, 170992, 170996, 171002, - 171004, 171008, 171010, 171014, 171018, 171022, 171026, 171028, 171030, - 171034, 171038, 171042, 171046, 171048, 171050, 171052, 171058, 171063, - 171066, 171074, 171082, 171084, 171089, 171092, 171097, 171108, 171115, - 171120, 171125, 171127, 171131, 171133, 171137, 171139, 171143, 171147, - 171150, 171153, 171155, 171158, 171160, 171164, 171166, 171168, 171170, - 171174, 171176, 171180, 171183, 171190, 171193, 171198, 171201, 171204, - 171209, 171213, 171217, 171221, 171223, 171228, 171231, 171235, 171237, - 171239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171243, 171248, 171250, 171254, - 171256, 171260, 171264, 171270, 171274, 171279, 171282, 171286, 171290, - 0, 0, 0, 171294, 171296, 171302, 171306, 171310, 171312, 171316, 171318, - 171320, 171324, 171326, 0, 0, 0, 0, 0, 171330, 171335, 171340, 171345, - 171350, 171355, 171360, 171367, 171374, 171381, 171388, 171393, 171398, - 171403, 171408, 171415, 171421, 171428, 171435, 171442, 171447, 171452, - 171457, 171462, 171467, 171474, 171481, 171486, 171491, 171498, 171505, - 171513, 171521, 171528, 171535, 171543, 171551, 171559, 171566, 171576, - 171587, 171592, 171599, 171606, 171613, 171621, 171629, 171640, 171648, - 171656, 171664, 171669, 171674, 171679, 171684, 171689, 171694, 171699, - 171704, 171709, 171714, 171719, 171724, 171731, 171736, 171741, 171748, - 171753, 171758, 171763, 171768, 171773, 171778, 171783, 171788, 171793, - 171798, 171803, 171808, 171815, 171823, 171828, 171833, 171840, 171845, - 171850, 171855, 171862, 171867, 171874, 171879, 171886, 171891, 171900, - 171909, 171914, 171919, 171924, 171929, 171934, 171939, 171944, 171949, - 171954, 171959, 171964, 171969, 171974, 171982, 171990, 171995, 172000, - 172005, 172010, 172015, 172021, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 172027, 172035, 172043, 172051, 172059, 172065, 172071, 172075, 172079, - 172085, 172091, 172100, 172104, 172109, 172115, 172119, 172124, 172128, - 172132, 172138, 172144, 172154, 172163, 172166, 172171, 172177, 172183, - 172194, 172204, 172208, 172213, 172219, 172225, 172234, 172239, 172243, - 172248, 172252, 172258, 172264, 172270, 172274, 172277, 172281, 172284, - 172287, 172292, 172297, 172304, 172312, 172319, 172326, 172335, 172344, - 172351, 172359, 172366, 172373, 172382, 172391, 172398, 172406, 172413, - 172420, 172429, 172436, 172444, 172450, 172459, 172467, 172476, 172483, - 172493, 172504, 172512, 172520, 172529, 172537, 172545, 172554, 172562, - 172572, 172581, 172589, 172597, 172606, 172609, 172614, 172617, 0, 0, 0, - 0, 0, 0, 0, 172622, 172628, 172634, 172640, 172646, 172652, 172658, - 172664, 172670, 172676, 172682, 172688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 172694, 172702, 172711, 172719, 172728, - 172737, 172747, 172756, 172766, 172775, 172785, 172794, 0, 0, 0, 0, - 172804, 172812, 172821, 172829, 172838, 172845, 172853, 172860, 172868, - 172876, 172885, 172893, 172902, 172912, 172923, 172933, 172944, 172953, - 172963, 172972, 172982, 172991, 173001, 173010, 173020, 173028, 173037, - 173045, 173054, 173062, 173071, 173079, 173088, 173098, 173109, 173119, - 173130, 173134, 173139, 173143, 173148, 173151, 173155, 173158, 173162, - 173166, 173171, 173175, 173180, 173185, 173191, 173196, 173202, 173205, - 173209, 173212, 0, 0, 0, 0, 0, 0, 0, 0, 173216, 173219, 173223, 173226, - 173230, 173235, 173240, 173246, 173252, 173256, 0, 0, 0, 0, 0, 0, 173260, - 173266, 173273, 173279, 173286, 173294, 173302, 173311, 173320, 173325, - 173331, 173336, 173342, 173349, 173356, 173364, 173372, 173379, 173387, - 173394, 173402, 173411, 173420, 173430, 173440, 173446, 173453, 173459, - 173466, 173474, 173482, 173491, 173500, 173508, 173517, 173525, 173534, - 173544, 173554, 173565, 0, 0, 0, 0, 0, 0, 0, 0, 173576, 173581, 173587, - 173592, 173598, 173607, 173617, 173626, 173636, 173643, 173651, 173658, - 173666, 173673, 173682, 173691, 173700, 173705, 173712, 173719, 173726, - 173731, 173736, 173741, 173746, 173753, 173760, 173767, 173774, 173781, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167703, 167713, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 167721, 167728, 167735, 167742, 167748, + 167755, 167762, 167768, 167775, 167782, 167789, 167797, 167805, 167813, + 167821, 167829, 167837, 167844, 167851, 167858, 167866, 167874, 167882, + 167890, 167898, 167906, 167913, 167920, 167927, 167935, 167943, 167951, + 167959, 167967, 167975, 167980, 167985, 167990, 167995, 168000, 168005, + 168010, 168015, 168020, 0, 0, 0, 0, 168025, 168032, 168037, 168042, + 168047, 168052, 168057, 168062, 168067, 168072, 168077, 168082, 168087, + 168092, 168097, 168102, 168107, 168112, 168117, 168122, 168127, 168132, + 168137, 168142, 168147, 168152, 168157, 168162, 168167, 168172, 168177, + 168182, 168187, 168192, 168197, 168202, 168207, 168212, 168217, 168222, + 168227, 168232, 168237, 168242, 168247, 168252, 168257, 168262, 168267, + 168272, 168277, 168283, 168288, 168293, 168298, 168303, 168308, 168313, + 168318, 168323, 168328, 168333, 168338, 168343, 168348, 168353, 168358, + 168363, 168368, 168373, 168378, 168383, 168388, 168393, 168398, 168403, + 168408, 168413, 168418, 168423, 168428, 168433, 168438, 168443, 168448, + 168453, 168458, 168463, 168468, 168473, 168478, 168483, 168488, 168493, + 168498, 168503, 168508, 168513, 168518, 168523, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 168528, 168534, 168543, 168551, 168559, 168568, 168577, + 168586, 168595, 168604, 168613, 168622, 168631, 168640, 168649, 0, 0, + 168658, 168667, 168675, 168683, 168692, 168701, 168710, 168719, 168728, + 168737, 168746, 168755, 168764, 168773, 168782, 0, 168790, 168799, + 168807, 168815, 168824, 168833, 168842, 168851, 168860, 168869, 168878, + 168887, 168896, 168905, 168914, 0, 168921, 168930, 168938, 168946, + 168955, 168964, 168973, 168982, 168991, 169000, 169009, 169018, 169027, + 169036, 169045, 169052, 169058, 169064, 169070, 169076, 169082, 169088, + 169094, 169100, 169106, 169112, 169118, 169124, 169130, 169136, 169142, + 169148, 169154, 169160, 169166, 169172, 169178, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 169184, 169191, 169196, 169200, 169204, 169208, 169213, 169218, + 169223, 169228, 169233, 169238, 169245, 169254, 169260, 169264, 169273, + 169278, 169284, 169290, 169296, 169301, 169307, 169313, 169319, 169324, + 169330, 169336, 169341, 169347, 169353, 169358, 169364, 169370, 169375, + 169381, 169387, 169392, 169398, 169404, 169410, 169416, 169422, 169433, + 169440, 169446, 169449, 169452, 169455, 169460, 169466, 169472, 169478, + 169483, 169489, 169495, 169501, 169506, 169512, 169518, 169523, 169529, + 169535, 169540, 169546, 169552, 169557, 169563, 169569, 169574, 169580, + 169586, 169592, 169598, 169604, 169607, 169610, 169613, 169616, 169619, + 169622, 169629, 169637, 169645, 169653, 169660, 169668, 169676, 169684, + 169691, 169699, 169707, 169714, 169722, 169730, 169737, 169745, 169753, + 169760, 169768, 169776, 169783, 169791, 169799, 169807, 169815, 169823, + 169828, 169833, 169838, 169841, 169849, 169854, 169861, 169869, 169877, + 169885, 169892, 169900, 169908, 169916, 169923, 169931, 169939, 169946, + 169954, 169962, 169969, 169977, 169985, 169992, 170000, 170008, 170015, + 170023, 170031, 170039, 170047, 170055, 170065, 170070, 170074, 170078, + 170083, 170088, 170091, 170094, 170097, 170100, 170103, 170106, 170109, + 170112, 170115, 170121, 170124, 170128, 170133, 170137, 170142, 170147, + 170153, 170159, 170165, 170170, 170178, 170184, 170187, 170190, 170193, + 170196, 170199, 170202, 170205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170210, 170217, + 170225, 170233, 170241, 170248, 170256, 170264, 170272, 170279, 170287, + 170295, 170302, 170310, 170318, 170325, 170333, 170341, 170348, 170356, + 170364, 170371, 170379, 170387, 170395, 170403, 170411, 170416, 170420, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170423, 170429, 170435, 170441, + 170445, 170451, 170457, 170463, 170469, 170475, 170481, 170487, 170493, + 170499, 170505, 170511, 170517, 170523, 170529, 170535, 170541, 170547, + 170553, 170559, 170565, 170571, 170577, 170583, 170589, 170595, 170601, + 170607, 170613, 170619, 170625, 170631, 170637, 170643, 170649, 170655, + 170661, 170667, 170673, 170679, 0, 0, 0, 0, 170685, 170696, 170707, + 170718, 170729, 170740, 170751, 170762, 170773, 0, 0, 0, 0, 0, 0, 0, + 170784, 170789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170794, 170800, + 170806, 170812, 170818, 170824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173790, 173800, 173809, 173814, 173823, - 173831, 173839, 173846, 173850, 173855, 173862, 173871, 0, 173882, - 173885, 173889, 173893, 173897, 173901, 173906, 173910, 173914, 173919, - 173923, 173927, 173933, 173939, 173946, 173950, 173954, 173956, 173966, - 173975, 173982, 173986, 173990, 174000, 174004, 174008, 174012, 174016, - 174024, 174033, 174046, 174057, 174068, 174084, 174092, 174101, 174105, - 174107, 174112, 174114, 174116, 174122, 174126, 174128, 174134, 174136, - 174138, 174142, 174144, 174148, 174150, 174154, 174158, 174163, 174167, - 174171, 174173, 174177, 174179, 174185, 174191, 174197, 174201, 174207, - 174211, 174218, 174220, 174224, 174226, 174228, 174230, 174232, 174234, - 174236, 174240, 174244, 174251, 174255, 174257, 174262, 174264, 174266, - 174268, 174270, 174274, 174278, 174280, 174285, 174290, 174292, 174294, - 174296, 174298, 174303, 174305, 174309, 174313, 174315, 174319, 174321, - 174334, 0, 174338, 174350, 174362, 174366, 0, 0, 0, 174370, 174377, - 174379, 174383, 174385, 174389, 174393, 174395, 174399, 174401, 174403, - 174407, 174409, 174411, 174413, 174415, 174417, 174421, 174423, 174425, - 174427, 174429, 174431, 174433, 174435, 174439, 174443, 174445, 174447, - 174449, 174451, 174453, 174455, 174457, 174459, 174461, 174463, 174465, - 174467, 174469, 174471, 0, 0, 174473, 174475, 174477, 174479, 174481, - 174483, 0, 0, 0, 174485, 174489, 174493, 174501, 174509, 174515, 174522, - 174524, 174526, 174528, 174530, 174532, 174534, 174538, 174545, 174549, - 174553, 174557, 174561, 174565, 174567, 174571, 174575, 174577, 174579, - 174581, 174583, 174585, 174589, 0, 0, 174593, 174597, 174601, 174605, - 174610, 174612, 174614, 174618, 174622, 174627, 174635, 174639, 174647, - 174649, 174651, 174653, 174655, 174657, 174659, 174661, 174663, 174667, - 174671, 174673, 174675, 174677, 174679, 174685, 174687, 174693, 174697, - 174701, 174706, 174708, 174710, 174714, 174716, 174718, 174720, 174722, - 174726, 174731, 174736, 174740, 174744, 174746, 174748, 174753, 174758, - 174760, 174762, 174766, 174772, 174778, 174784, 174790, 174796, 174802, - 174813, 174824, 174836, 174847, 174858, 174869, 174880, 174891, 174902, - 174913, 174924, 174935, 174946, 174957, 174968, 174980, 174992, 175004, - 175016, 175028, 175040, 175054, 175068, 175083, 175089, 175095, 175101, - 175107, 175113, 175119, 175125, 175131, 175137, 175143, 175149, 175155, - 175162, 175169, 175176, 175183, 175190, 175197, 175211, 175225, 175240, - 175254, 175268, 175282, 175296, 175310, 175324, 175338, 175352, 175366, - 175380, 175394, 175408, 175423, 175438, 175453, 175468, 175483, 175498, - 175512, 175526, 175541, 175546, 175551, 175557, 175568, 175579, 175591, - 175596, 175601, 175606, 175611, 175616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 175621, 175627, 175633, 175639, 175645, 175651, 175657, 175663, - 175668, 175673, 175678, 175683, 175688, 175693, 0, 0, 175698, 175702, - 175706, 175708, 0, 0, 0, 0, 175710, 175715, 175719, 0, 0, 0, 0, 0, - 175721, 175723, 175725, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175727, - 175731, 175733, 175735, 175737, 175741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 175743, 175747, 175751, 175755, 175759, 175763, 175767, 175771, 175775, - 175779, 175783, 175787, 175791, 175795, 175799, 175803, 175807, 175811, - 175815, 175819, 175823, 175827, 175831, 175835, 175839, 175843, 175847, - 175851, 175855, 175859, 175863, 175867, 175871, 175875, 175879, 175883, - 175887, 175891, 175895, 175899, 175903, 175907, 175911, 175915, 175919, - 175923, 175927, 175931, 175935, 175939, 175943, 175947, 175951, 175955, - 175959, 175963, 175967, 175971, 175975, 175979, 175983, 175987, 175991, - 175995, 175999, 176003, 176007, 176011, 176015, 176019, 176023, 176027, - 176031, 176035, 176039, 176043, 176047, 176051, 176055, 176059, 176063, - 176067, 176071, 176075, 176079, 176083, 176087, 176091, 176095, 176099, - 176103, 176107, 176111, 176115, 176119, 176123, 176127, 176131, 176135, - 176139, 176143, 176147, 176151, 176155, 176159, 176163, 176167, 176171, - 176175, 176179, 176183, 176187, 176191, 176195, 176199, 176203, 176207, - 176211, 176215, 176219, 176223, 176227, 176231, 176235, 176239, 176243, - 176247, 176251, 176255, 176259, 176263, 176267, 176271, 176275, 176279, - 176283, 176287, 176291, 176295, 176299, 176303, 176307, 176311, 176315, - 176319, 176323, 176327, 176331, 176335, 176339, 176343, 176347, 176351, - 176355, 176359, 176363, 176367, 176371, 176375, 176379, 176383, 176387, - 176391, 176395, 176399, 176403, 176407, 176411, 176415, 176419, 176423, - 176427, 176431, 176435, 176439, 176443, 176447, 176451, 176455, 176459, - 176463, 176467, 176471, 176475, 176479, 176483, 176487, 176491, 176495, - 176499, 176503, 176507, 176511, 176515, 176519, 176523, 176527, 176531, - 176535, 176539, 176543, 176547, 176551, 176555, 176559, 176563, 176567, - 176571, 176575, 176579, 176583, 176587, 176591, 176595, 176599, 176603, - 176607, 176611, 176615, 176619, 176623, 176627, 176631, 176635, 176639, - 176643, 176647, 176651, 176655, 176659, 176663, 176667, 176671, 176675, - 176679, 176683, 176687, 176691, 176695, 176699, 176703, 176707, 176711, - 176715, 176719, 176723, 176727, 176731, 176735, 176739, 176743, 176747, - 176751, 176755, 176759, 176763, 176767, 176771, 176775, 176779, 176783, - 176787, 176791, 176795, 176799, 176803, 176807, 176811, 176815, 176819, - 176823, 176827, 176831, 176835, 176839, 176843, 176847, 176851, 176855, - 176859, 176863, 176867, 176871, 176875, 176879, 176883, 176887, 176891, - 176895, 176899, 176903, 176907, 176911, 176915, 176919, 176923, 176927, - 176931, 176935, 176939, 176943, 176947, 176951, 176955, 176959, 176963, - 176967, 176971, 176975, 176979, 176983, 176987, 176991, 176995, 176999, - 177003, 177007, 177011, 177015, 177019, 177023, 177027, 177031, 177035, - 177039, 177043, 177047, 177051, 177055, 177059, 177063, 177067, 177071, - 177075, 177079, 177083, 177087, 177091, 177095, 177099, 177103, 177107, - 177111, 177115, 177119, 177123, 177127, 177131, 177135, 177139, 177143, - 177147, 177151, 177155, 177159, 177163, 177167, 177171, 177175, 177179, - 177183, 177187, 177191, 177195, 177199, 177203, 177207, 177211, 177215, - 177219, 177223, 177227, 177231, 177235, 177239, 177243, 177247, 177251, - 177255, 177259, 177263, 177267, 177271, 177275, 177279, 177283, 177287, - 177291, 177295, 177299, 177303, 177307, 177311, 177315, 177319, 177323, - 177327, 177331, 177335, 177339, 177343, 177347, 177351, 177355, 177359, - 177363, 177367, 177371, 177375, 177379, 177383, 177387, 177391, 177395, - 177399, 177403, 177407, 177411, 177415, 177419, 177423, 177427, 177431, - 177435, 177439, 177443, 177447, 177451, 177455, 177459, 177463, 177467, - 177471, 177475, 177479, 177483, 177487, 177491, 177495, 177499, 177503, - 177507, 177511, 177515, 177519, 177523, 177527, 177531, 177535, 177539, - 177543, 177547, 177551, 177555, 177559, 177563, 177567, 177571, 177575, - 177579, 177583, 177587, 177591, 177595, 177599, 177603, 177607, 177611, - 177615, 177619, 177623, 177627, 177631, 177635, 177639, 177643, 177647, - 177651, 177655, 177659, 177663, 177667, 177671, 177675, 177679, 177683, - 177687, 177691, 177695, 177699, 177703, 177707, 177711, 177715, 177719, - 177723, 177727, 177731, 177735, 177739, 177743, 177747, 177751, 177755, - 177759, 177763, 177767, 177771, 177775, 177779, 177783, 177787, 177791, - 177795, 177799, 177803, 177807, 177811, 177815, 177819, 177823, 177827, - 177831, 177835, 177839, 177843, 177847, 177851, 177855, 177859, 177863, - 177867, 177871, 177875, 177879, 177883, 177887, 177891, 177895, 177899, - 177903, 177907, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170830, + 170832, 170834, 170838, 170843, 170848, 170850, 170856, 170861, 170863, + 170869, 170873, 170875, 170879, 170885, 170891, 170897, 170902, 170907, + 170914, 170921, 170928, 170933, 170940, 170947, 170954, 170958, 170965, + 170974, 170983, 170990, 170995, 170999, 171003, 171005, 171008, 171011, + 171018, 171025, 171035, 171040, 171045, 171050, 171055, 171057, 171063, + 171067, 171069, 171071, 171073, 171075, 171079, 171083, 171087, 171089, + 171093, 171095, 171099, 171101, 171103, 171105, 171107, 171112, 171117, + 171119, 171125, 171129, 171133, 171141, 171143, 171145, 171147, 171149, + 171151, 171153, 171155, 171157, 171159, 171161, 171165, 171169, 171171, + 171173, 171175, 171177, 171179, 171184, 171190, 171194, 171198, 171202, + 171206, 171211, 171215, 171217, 171219, 171223, 171229, 171231, 171233, + 171235, 171239, 171248, 171254, 171258, 171262, 171264, 171266, 171269, + 171271, 171273, 171275, 171279, 171281, 171285, 171290, 171292, 171297, + 171303, 171310, 171314, 171318, 171322, 171326, 171332, 171336, 171344, + 171351, 171353, 171355, 171359, 171363, 171365, 171369, 171373, 171375, + 171379, 171381, 171385, 171389, 171393, 171397, 171401, 171405, 171409, + 171413, 171419, 171423, 171427, 171438, 171443, 171447, 171451, 171457, + 171461, 171465, 171469, 171476, 171483, 171487, 171491, 171495, 171499, + 171503, 171510, 171512, 171516, 171518, 171520, 171524, 171528, 171532, + 171534, 171538, 171542, 171546, 171550, 171554, 171556, 171560, 171562, + 171568, 171571, 171576, 171578, 171580, 171583, 171585, 171587, 171590, + 171597, 171604, 171611, 171616, 171620, 171622, 171624, 171626, 171630, + 171632, 171636, 171640, 171644, 171646, 171650, 171652, 171656, 171660, + 171667, 171669, 171678, 171687, 171696, 171702, 171704, 171709, 171713, + 171717, 171719, 171725, 171729, 171731, 171735, 171739, 171741, 171745, + 171750, 171754, 171760, 171766, 171768, 171770, 171776, 171778, 171782, + 171786, 171788, 171792, 171794, 171798, 171802, 171806, 171809, 171812, + 171817, 171822, 171824, 171827, 171829, 171836, 171840, 171842, 171849, + 171856, 171863, 171870, 171877, 171879, 171881, 171883, 171887, 171889, + 171891, 171893, 171895, 171897, 171899, 171901, 171903, 171905, 171907, + 171909, 171911, 171913, 171915, 171917, 171919, 171921, 171923, 171925, + 171927, 171929, 171931, 171935, 171937, 171939, 171941, 171945, 171947, + 171951, 171953, 171955, 171959, 171963, 171969, 171971, 171973, 171975, + 171977, 171981, 171985, 171987, 171991, 171995, 171999, 172003, 172007, + 172011, 172015, 172019, 172023, 172027, 172031, 172035, 172039, 172043, + 172047, 172051, 172055, 172059, 172061, 172063, 172065, 172067, 172069, + 172071, 172073, 172081, 172089, 172097, 172105, 172110, 172115, 172120, + 172124, 172128, 172133, 172138, 172140, 172144, 172146, 172148, 172150, + 172152, 172154, 172156, 172158, 172162, 172164, 172166, 172168, 172172, + 172176, 172180, 172184, 172188, 172190, 172196, 172202, 172204, 172206, + 172208, 172210, 172212, 172221, 172228, 172235, 172239, 172246, 172251, + 172258, 172267, 172272, 172276, 172280, 172282, 172286, 172288, 172292, + 172296, 172298, 172302, 172306, 172310, 172312, 172314, 172320, 172322, + 172324, 172326, 172330, 172334, 172336, 172340, 172342, 172344, 172347, + 172351, 172353, 172357, 172359, 172361, 172366, 172368, 172372, 172376, + 172379, 172383, 172387, 172391, 172395, 172399, 172403, 172407, 172412, + 172416, 172420, 172429, 172434, 172437, 172439, 172442, 172445, 172450, + 172452, 172455, 172460, 172464, 172467, 172471, 172475, 172478, 172483, + 172487, 172491, 172495, 172499, 172505, 172511, 172517, 172523, 172528, + 172539, 172541, 172545, 172547, 172549, 172553, 172557, 172559, 172563, + 172569, 172574, 172580, 172582, 172586, 172590, 172597, 172604, 172608, + 172610, 172612, 172616, 172618, 172622, 172626, 172630, 172632, 172634, + 172641, 172645, 172649, 172653, 172657, 172661, 172663, 172667, 172669, + 172671, 172675, 172677, 172681, 172685, 172691, 172695, 172699, 172703, + 172705, 172708, 172712, 172719, 172728, 172737, 172746, 172755, 172757, + 172761, 172763, 172767, 172778, 172782, 172788, 172794, 172799, 172801, + 172806, 172810, 172812, 172814, 172816, 172820, 172824, 172828, 172833, + 172844, 172860, 172873, 172886, 172890, 172894, 172900, 172902, 172910, + 172918, 172920, 172924, 172930, 172936, 172943, 172950, 172952, 172954, + 172958, 172960, 172966, 172968, 172971, 172975, 172981, 172987, 172998, + 173004, 173011, 173019, 173023, 173031, 173039, 173045, 173051, 173058, + 173060, 173064, 173066, 173068, 173073, 173075, 173077, 173079, 173081, + 173085, 173095, 173101, 173105, 173109, 173113, 173119, 173125, 173131, + 173137, 173142, 173147, 173153, 173159, 173166, 173173, 173180, 173187, + 173192, 173200, 173204, 173213, 173222, 173228, 173232, 173236, 173240, + 173243, 173248, 173250, 173252, 173254, 173261, 173266, 173273, 173280, + 173287, 173295, 173303, 173311, 173319, 173327, 173335, 173343, 173351, + 173359, 173365, 173371, 173377, 173383, 173389, 173395, 173401, 173407, + 173413, 173419, 173425, 173431, 173434, 173443, 173452, 173454, 173461, + 173465, 173467, 173469, 173473, 173479, 173483, 173485, 173495, 173501, + 173505, 173507, 173511, 173513, 173517, 173524, 173531, 173538, 173543, + 173548, 173557, 173563, 173568, 173572, 173577, 173581, 173588, 173592, + 173595, 173599, 173605, 173611, 173615, 173619, 173624, 173630, 173639, + 173650, 173656, 173662, 173668, 173678, 173693, 173702, 173710, 173718, + 173726, 173734, 173742, 173750, 173758, 173766, 173774, 173782, 173790, + 173798, 173801, 173805, 173810, 173815, 173817, 173821, 173830, 173839, + 173847, 173851, 173855, 173860, 173865, 173870, 173872, 173877, 173881, + 173883, 173887, 173891, 173897, 173902, 173910, 173915, 173920, 173925, + 173932, 173935, 173937, 173941, 173946, 173952, 173956, 173960, 173966, + 173972, 173974, 173978, 173982, 173986, 173990, 173994, 173996, 173998, + 174000, 174002, 174008, 174014, 174018, 174020, 174022, 174024, 174033, + 174037, 174044, 174051, 174053, 174056, 174060, 174066, 174070, 174074, + 174076, 174084, 174088, 174092, 174097, 174102, 174107, 174112, 174117, + 174122, 174127, 174132, 174137, 174142, 174146, 174152, 174156, 174162, + 174167, 174174, 174180, 174188, 174192, 174199, 174203, 174207, 174211, + 174216, 174221, 174223, 174227, 174236, 174244, 174253, 174267, 174281, + 174295, 174302, 174309, 174313, 174322, 174330, 174334, 174343, 174350, + 174354, 174358, 174362, 174366, 174373, 174377, 174381, 174385, 174389, + 174396, 174405, 174414, 174421, 174433, 174445, 174449, 174453, 174457, + 174461, 174465, 174469, 174477, 174485, 174494, 174498, 174502, 174506, + 174510, 174514, 174518, 174524, 174531, 174535, 174547, 174555, 174559, + 174563, 174567, 174571, 174577, 174584, 174595, 174605, 174616, 174627, + 174636, 174647, 174653, 174659, 174665, 174671, 174677, 174681, 174688, + 174697, 174704, 174710, 174714, 174718, 174722, 174731, 174743, 174747, + 174754, 174761, 174768, 174776, 174783, 174791, 174799, 174808, 174816, + 174825, 174834, 174844, 174853, 174863, 174873, 174884, 174894, 174905, + 174912, 174920, 174927, 174935, 174943, 174952, 174960, 174969, 174976, + 174988, 174995, 175007, 175010, 175014, 175017, 175021, 175027, 175034, + 175041, 175049, 175054, 175060, 175071, 175081, 175092, 175097, 175102, + 175108, 175113, 175120, 175124, 175130, 175132, 175134, 175138, 175142, + 175146, 175155, 175157, 175159, 175162, 175164, 175166, 175170, 175172, + 175176, 175178, 175182, 175184, 175186, 175190, 175194, 175200, 175202, + 175206, 175208, 175212, 175216, 175220, 175224, 175226, 175228, 175232, + 175236, 175240, 175244, 175246, 175248, 175250, 175256, 175261, 175264, + 175272, 175280, 175282, 175287, 175290, 175295, 175306, 175313, 175318, + 175323, 175325, 175329, 175331, 175335, 175337, 175341, 175345, 175348, + 175351, 175353, 175356, 175358, 175362, 175364, 175366, 175368, 175372, + 175374, 175378, 175381, 175388, 175391, 175396, 175399, 175402, 175407, + 175411, 175415, 175419, 175421, 175426, 175429, 175433, 175435, 175437, + 175441, 175443, 0, 0, 0, 0, 0, 0, 0, 0, 175445, 175450, 175452, 175456, + 175458, 175462, 175466, 175472, 175476, 175481, 175484, 175488, 175492, + 0, 0, 0, 175496, 175498, 175504, 175508, 175512, 175514, 175518, 175520, + 175522, 175526, 175528, 175532, 175536, 0, 0, 0, 175540, 175545, 175550, + 175555, 175560, 175565, 175570, 175577, 175584, 175591, 175598, 175603, + 175608, 175613, 175618, 175625, 175631, 175638, 175645, 175652, 175657, + 175662, 175667, 175672, 175677, 175684, 175691, 175696, 175701, 175708, + 175715, 175723, 175731, 175738, 175745, 175753, 175761, 175769, 175776, + 175786, 175797, 175802, 175809, 175816, 175823, 175831, 175839, 175850, + 175858, 175866, 175874, 175879, 175884, 175889, 175894, 175899, 175904, + 175909, 175914, 175919, 175924, 175929, 175934, 175941, 175946, 175951, + 175958, 175963, 175968, 175973, 175978, 175983, 175988, 175993, 175998, + 176003, 176008, 176013, 176018, 176025, 176033, 176038, 176043, 176050, + 176055, 176060, 176065, 176072, 176077, 176084, 176089, 176096, 176101, + 176110, 176119, 176124, 176129, 176134, 176139, 176144, 176149, 176154, + 176159, 176164, 176169, 176174, 176179, 176184, 176192, 176200, 176205, + 176210, 176215, 176220, 176225, 176231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 176237, 176245, 176253, 176261, 176269, 176275, 176281, 176285, + 176289, 176295, 176301, 176310, 176314, 176319, 176325, 176329, 176334, + 176338, 176342, 176348, 176354, 176364, 176373, 176376, 176381, 176387, + 176393, 176404, 176414, 176418, 176423, 176429, 176435, 176444, 176449, + 176453, 176458, 176462, 176468, 176474, 176480, 176484, 176487, 176491, + 176494, 176497, 176502, 176507, 176514, 176522, 176529, 176536, 176545, + 176554, 176561, 176569, 176576, 176583, 176592, 176601, 176608, 176616, + 176623, 176630, 176639, 176646, 176654, 176660, 176669, 176677, 176686, + 176693, 176703, 176714, 176722, 176730, 176739, 176747, 176755, 176764, + 176772, 176782, 176791, 176799, 176807, 176816, 176819, 176824, 176827, + 0, 0, 0, 0, 0, 0, 0, 176832, 176838, 176844, 176850, 176856, 176862, + 176868, 176874, 176880, 176886, 176892, 176898, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176904, 176912, 176921, 176929, + 176938, 176947, 176957, 176966, 176976, 176985, 176995, 177004, 0, 0, 0, + 0, 177014, 177022, 177031, 177039, 177048, 177055, 177063, 177070, + 177078, 177086, 177095, 177103, 177112, 177122, 177133, 177143, 177154, + 177163, 177173, 177182, 177192, 177201, 177211, 177220, 177230, 177238, + 177247, 177255, 177264, 177272, 177281, 177289, 177298, 177308, 177319, + 177329, 177340, 177344, 177349, 177353, 177358, 177361, 177365, 177368, + 177372, 177376, 177381, 177385, 177390, 177395, 177401, 177406, 177412, + 177415, 177419, 177422, 0, 0, 0, 0, 0, 0, 0, 0, 177426, 177429, 177433, + 177436, 177440, 177445, 177450, 177456, 177462, 177466, 0, 0, 0, 0, 0, 0, + 177470, 177476, 177483, 177489, 177496, 177504, 177512, 177521, 177530, + 177535, 177541, 177546, 177552, 177559, 177566, 177574, 177582, 177589, + 177597, 177604, 177612, 177621, 177630, 177640, 177650, 177656, 177663, + 177669, 177676, 177684, 177692, 177701, 177710, 177718, 177727, 177735, + 177744, 177754, 177764, 177775, 0, 0, 0, 0, 0, 0, 0, 0, 177786, 177791, + 177797, 177802, 177808, 177817, 177827, 177836, 177846, 177853, 177861, + 177868, 177876, 177883, 177892, 177901, 177910, 177915, 177922, 177929, + 177936, 177941, 177946, 177951, 177956, 177963, 177970, 177977, 177984, + 177991, 0, 0, 178000, 178010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178022, 178032, 178041, + 178046, 178055, 178063, 178071, 178078, 178082, 178087, 178094, 178103, + 178114, 178118, 178121, 178125, 178129, 178133, 178137, 178142, 178146, + 178150, 178155, 178159, 178163, 178169, 178175, 178182, 178186, 178190, + 178192, 178202, 178211, 178218, 178222, 178226, 178236, 178240, 178244, + 178248, 178252, 178260, 178269, 178282, 178293, 178304, 178320, 178329, + 178338, 178342, 178344, 178349, 178351, 178353, 178359, 178363, 178365, + 178371, 178373, 178375, 178379, 178381, 178385, 178387, 178391, 178395, + 178400, 178404, 178408, 178410, 178414, 178416, 178422, 178428, 178434, + 178438, 178444, 178448, 178455, 178457, 178461, 178463, 178465, 178467, + 178469, 178471, 178473, 178477, 178481, 178488, 178492, 178494, 178499, + 178501, 178503, 178505, 178507, 178511, 178515, 178517, 178522, 178527, + 178529, 178531, 178533, 178535, 178540, 178542, 178546, 178550, 178552, + 178556, 178558, 178571, 178575, 178582, 178594, 178606, 178610, 178614, + 178616, 0, 178620, 178627, 178629, 178633, 178635, 178639, 178643, + 178645, 178649, 178651, 178653, 178657, 178659, 178661, 178663, 178665, + 178667, 178671, 178673, 178675, 178677, 178679, 178681, 178683, 178685, + 178689, 178693, 178695, 178697, 178699, 178701, 178703, 178705, 178707, + 178709, 178711, 178713, 178715, 178717, 178719, 178721, 178723, 178725, + 178727, 178729, 178731, 178733, 178735, 178737, 178739, 178741, 178743, + 178745, 178749, 178753, 178761, 178769, 178775, 178782, 178784, 178786, + 178788, 178790, 178792, 178794, 178798, 178805, 178809, 178813, 178817, + 178821, 178825, 178827, 178831, 178835, 178837, 178839, 178841, 178843, + 178845, 178849, 178853, 0, 178857, 178861, 178865, 178869, 178874, + 178876, 178878, 178882, 178886, 178891, 178899, 178903, 178911, 178913, + 178915, 178917, 178919, 178921, 178923, 178925, 178927, 178931, 178935, + 178937, 178939, 178941, 178943, 178949, 178951, 178957, 178961, 178965, + 178970, 178972, 178974, 178978, 178980, 178982, 178984, 178986, 178990, + 178995, 179000, 179004, 179008, 179010, 179012, 179017, 179022, 179024, + 179026, 179030, 179036, 179042, 179048, 179054, 179060, 179066, 179077, + 179088, 179100, 179111, 179122, 179133, 179144, 179155, 179166, 179177, + 179188, 179199, 179210, 179221, 179232, 179244, 179256, 179268, 179280, + 179292, 179304, 179318, 179332, 179347, 179353, 179359, 179365, 179371, + 179377, 179383, 179389, 179395, 179401, 179407, 179413, 179419, 179426, + 179433, 179440, 179447, 179454, 179461, 179475, 179489, 179504, 179518, + 179532, 179546, 179560, 179574, 179588, 179602, 179616, 179630, 179644, + 179658, 179672, 179687, 179702, 179717, 179732, 179747, 179762, 179776, + 179790, 179805, 179810, 179815, 179821, 179832, 179843, 179855, 179860, + 179865, 179870, 179875, 179880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 179885, 179891, 179897, 179903, 179909, 179915, 179921, 179927, 179932, + 179937, 179942, 179947, 179952, 179957, 0, 0, 179962, 179966, 179970, + 179972, 179974, 0, 0, 0, 179978, 179983, 179987, 0, 0, 0, 0, 0, 179989, + 179991, 179993, 179995, 179997, 180001, 180003, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 180007, 180011, 180013, 180015, 180017, 180021, 180023, 180027, + 180029, 180032, 180034, 180038, 180040, 180042, 180043, 180045, 180047, + 180049, 180053, 180055, 180057, 180061, 180063, 180065, 180067, 0, 0, 0, + 0, 0, 0, 0, 180069, 180071, 180073, 180075, 180077, 180081, 180083, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 180085, 180089, 180091, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 180095, 180097, 180101, 180103, 180105, 180107, 180109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 177911, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177915, 177918, 177922, - 177926, 177929, 177933, 177937, 177940, 177943, 177947, 177951, 177954, - 177957, 177960, 177963, 177968, 177971, 177975, 177978, 177981, 177984, - 177987, 177990, 177993, 177996, 177999, 178002, 178005, 178008, 178012, - 178016, 178020, 178024, 178029, 178034, 178040, 178046, 178052, 178057, - 178063, 178069, 178075, 178080, 178086, 178092, 178097, 178103, 178109, - 178114, 178120, 178126, 178131, 178137, 178143, 178148, 178154, 178160, - 178166, 178172, 178178, 178182, 178187, 178191, 178196, 178200, 178205, - 178210, 178216, 178222, 178228, 178233, 178239, 178245, 178251, 178256, - 178262, 178268, 178273, 178279, 178285, 178290, 178296, 178302, 178307, - 178313, 178319, 178324, 178330, 178336, 178342, 178348, 178354, 178359, - 178363, 178368, 178371, 178375, 178378, 178381, 178384, 178387, 178390, - 178393, 178396, 178399, 178402, 178405, 178408, 178411, 178414, 178417, - 178420, 178423, 178426, 178429, 178432, 178435, 178438, 178441, 178444, - 178447, 178450, 178453, 178456, 178459, 178462, 178465, 178468, 178471, - 178474, 178477, 178480, 178483, 178486, 178489, 178492, 178495, 178498, - 178501, 178504, 178507, 178510, 178513, 178516, 178519, 178522, 178525, - 178528, 178531, 178534, 178537, 178540, 178543, 178546, 178549, 178552, - 178555, 178558, 178561, 178564, 178567, 178570, 178573, 178576, 178579, - 178582, 178585, 178588, 178591, 178594, 178597, 178600, 178603, 178606, - 178609, 178612, 178615, 178618, 178621, 178624, 178627, 178630, 178633, - 178636, 178639, 178642, 178645, 178648, 178651, 178654, 178657, 178660, - 178663, 178666, 178669, 178672, 178675, 178678, 178681, 178684, 178687, - 178690, 178693, 178696, 178699, 178702, 178705, 178708, 178711, 178714, - 178717, 178720, 178723, 178726, 178729, 178732, 178735, 178738, 178741, - 178744, 178747, 178750, 178753, 178756, 178759, 178762, 178765, 178768, - 178771, 178774, 178777, 178780, 178783, 178786, 178789, 178792, 178795, - 178798, 178801, 178804, 178807, 178810, 178813, 178816, 178819, 178822, - 178825, 178828, 178831, 178834, 178837, 178840, 178843, 178846, 178849, - 178852, 178855, 178858, 178861, 178864, 178867, 178870, 178873, 178876, - 178879, 178882, 178885, 178888, 178891, 178894, 178897, 178900, 178903, - 178906, 178909, 178912, 178915, 178918, 178921, 178924, 178927, 178930, - 178933, 178936, 178939, 178942, 178945, 178948, 178951, 178954, 178957, - 178960, 178963, 178966, 178969, 178972, 178975, 178978, 178981, 178984, - 178987, 178990, 178993, 178996, 178999, 179002, 179005, 179008, 179011, - 179014, 179017, 179020, 179023, 179026, 179029, 179032, 179035, 179038, - 179041, 179044, 179047, 179050, 179053, 179056, 179059, 179062, 179065, - 179068, 179071, 179074, 179077, 179080, 179083, 179086, 179089, 179092, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179095, 179097, 179099, - 179104, 179106, 179111, 179113, 179118, 179120, 179125, 179127, 179129, - 179131, 179133, 179135, 179137, 179139, 179141, 179143, 179146, 179150, - 179152, 179154, 179158, 179162, 179167, 179169, 179171, 179173, 179177, - 179180, 179182, 179186, 179188, 179192, 179194, 179198, 179201, 179203, - 179207, 179211, 179213, 179219, 179221, 179226, 179228, 179233, 179235, - 179240, 179242, 179247, 179249, 179253, 179255, 179259, 179261, 179268, - 179270, 179272, 179274, 179279, 179281, 179283, 179285, 179287, 179289, - 179294, 179298, 179300, 179305, 179309, 179311, 179316, 179320, 179322, - 179327, 179331, 179333, 179335, 179337, 179339, 179343, 179345, 179350, - 179352, 179358, 179360, 179366, 179368, 179370, 179372, 179376, 179378, - 179385, 179387, 179394, 179396, 179401, 179407, 179409, 179415, 179422, - 179424, 179430, 179435, 179437, 179443, 179449, 179451, 179457, 179463, - 179465, 179471, 179475, 179477, 179482, 179484, 179486, 179491, 179493, - 179495, 179501, 179503, 179508, 179512, 179514, 179519, 179523, 179525, - 179531, 179533, 179537, 179539, 179543, 179545, 179552, 179559, 179561, - 179568, 179575, 179577, 179582, 179584, 179591, 179593, 179598, 179600, - 179606, 179608, 179612, 179614, 179620, 179622, 179626, 179628, 179634, - 179636, 179638, 179640, 179645, 179650, 179652, 179654, 179664, 179669, - 179676, 179683, 179688, 179693, 179705, 179709, 179713, 179717, 179721, - 179723, 179725, 179727, 179729, 179731, 179733, 179735, 179737, 179739, - 179741, 179743, 179745, 179747, 179749, 179751, 179753, 179755, 179757, - 179759, 179761, 179763, 179769, 179776, 179781, 179789, 179797, 179802, - 179804, 179806, 179808, 179810, 179812, 179814, 179816, 179818, 179820, - 179822, 179824, 179826, 179828, 179830, 179832, 179834, 179845, 179850, - 179852, 179854, 179860, 179872, 179878, 179884, 179890, 179896, 179900, - 179911, 179913, 179915, 179917, 179919, 179921, 179923, 179925, 179927, - 179929, 179931, 179933, 179935, 179937, 179939, 179941, 179943, 179945, - 179947, 179949, 179951, 179953, 179955, 179957, 179959, 179961, 179963, - 179965, 179967, 179969, 179971, 179973, 179975, 179977, 179979, 179981, - 179983, 179985, 179987, 179989, 179991, 179993, 179995, 179997, 179999, - 180001, 180003, 180005, 180007, 180009, 180011, 180013, 180015, 180017, - 180019, 180021, 180023, 180025, 180027, 180029, 180031, 180033, 180035, - 180037, 180039, 180041, 180043, 180045, 180047, 180049, 180051, 180053, - 180055, 180057, 180059, 180061, 180063, 180065, 180067, 180069, 180071, - 180073, 180075, 180077, 180079, 180081, 180083, 180085, 180087, 180089, - 180091, 180093, 180095, 180097, 180099, 180101, 180103, 180105, 180107, - 180109, 180111, 180113, 180115, 180117, 180119, 180121, 180123, 180125, - 180127, 180129, 180131, 180133, 180135, 180137, 180139, 180141, 180143, - 180145, 180147, 180149, 180151, 180153, 180155, 180157, 180159, 180161, - 180163, 180165, 180167, 180169, 180171, 180173, 180175, 180177, 180179, - 180181, 180183, 180185, 180187, 180189, 180191, 180193, 180195, 180197, - 180199, 180201, 180203, 180205, 180207, 180209, 180211, 180213, 180215, - 180217, 180219, 180221, 180223, 180225, 180227, 180229, 180231, 180233, - 180235, 180237, 180239, 180241, 180243, 180245, 180247, 180249, 180251, - 180253, 180255, 180257, 180259, 180261, 180263, 180265, 180267, 180269, - 180271, 180273, 180275, 180277, 180279, 180281, 180283, 180285, 180287, - 180289, 180291, 180293, 180295, 180297, 180299, 180301, 180303, 180305, - 180307, 180309, 180311, 180313, 180315, 180317, 180319, 180321, 180323, - 180325, 180327, 180329, 180331, 180333, 180335, 180337, 180339, 180341, - 180343, 180345, 180347, 180349, 180351, 180353, 180355, 180357, 180359, - 180361, 180363, 180365, 180367, 180369, 180371, 180373, 180375, 180377, - 180379, 180381, 180383, 180385, 180387, 180389, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180111, 180114, 180117, + 180120, 180123, 180126, 180129, 180132, 180135, 180138, 180141, 180144, + 180147, 180150, 180153, 180156, 180159, 180162, 180165, 180168, 180171, + 180174, 180177, 180180, 180183, 180186, 180189, 180192, 180195, 180198, + 180201, 180204, 180207, 180210, 180213, 180216, 180219, 180222, 180225, + 180228, 180231, 180234, 180237, 180240, 180243, 180246, 180249, 180252, + 180255, 180258, 180261, 180264, 180267, 180270, 180273, 180276, 180279, + 180282, 180285, 180288, 180291, 180303, 180315, 180327, 180339, 180350, + 180362, 180374, 180386, 180398, 180409, 180422, 180435, 180447, 180460, + 180472, 180484, 180497, 180509, 180522, 180534, 180546, 180559, 180571, + 180583, 180595, 180607, 180618, 180630, 180642, 180654, 180666, 180677, + 180690, 180703, 180715, 180728, 180740, 180752, 180765, 180777, 180790, + 180802, 180814, 180827, 180839, 180851, 180863, 180875, 180883, 180891, + 180899, 180907, 180913, 180919, 180925, 180931, 180937, 180943, 180950, + 180957, 180964, 180971, 180978, 180985, 180993, 181001, 181009, 181017, + 181025, 181032, 181038, 181044, 181051, 181057, 181064, 181070, 181076, + 181083, 181089, 181096, 181102, 181108, 181114, 181120, 181126, 181138, + 0, 181151, 181164, 181170, 181178, 181183, 181190, 181197, 181205, + 181213, 181221, 181229, 181237, 181245, 181257, 181269, 181280, 181291, + 181306, 181321, 181336, 181351, 181369, 181387, 181406, 181425, 181443, + 181461, 181468, 181476, 181480, 181485, 181491, 181497, 181507, 181518, + 181529, 181539, 181549, 181553, 181557, 181562, 181568, 181574, 181584, + 181590, 181599, 181608, 181617, 181626, 181632, 181636, 181645, 181653, + 181661, 181668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 181673, 181678, + 181682, 181686, 181690, 181694, 181698, 181702, 181706, 181710, 0, 0, 0, + 0, 0, 0, 181714, 181718, 181722, 181726, 181730, 181734, 181738, 181742, + 181746, 181750, 181754, 181758, 181762, 181766, 181770, 181774, 181778, + 181782, 181786, 181790, 181794, 181798, 181802, 181806, 181810, 181814, + 181818, 181822, 181826, 181830, 181834, 181838, 181842, 181846, 181850, + 181854, 181858, 181862, 181866, 181870, 181874, 181878, 181882, 181886, + 181890, 181894, 181898, 181902, 181906, 181910, 181914, 181918, 181922, + 181926, 181930, 181934, 181938, 181942, 181946, 181950, 181954, 181958, + 181962, 181966, 181970, 181974, 181978, 181982, 181986, 181990, 181994, + 181998, 182002, 182006, 182010, 182014, 182018, 182022, 182026, 182030, + 182034, 182038, 182042, 182046, 182050, 182054, 182058, 182062, 182066, + 182070, 182074, 182078, 182082, 182086, 182090, 182094, 182098, 182102, + 182106, 182110, 182114, 182118, 182122, 182126, 182130, 182134, 182138, + 182142, 182146, 182150, 182154, 182158, 182162, 182166, 182170, 182174, + 182178, 182182, 182186, 182190, 182194, 182198, 182202, 182206, 182210, + 182214, 182218, 182222, 182226, 182230, 182234, 182238, 182242, 182246, + 182250, 182254, 182258, 182262, 182266, 182270, 182274, 182278, 182282, + 182286, 182290, 182294, 182298, 182302, 182306, 182310, 182314, 182318, + 182322, 182326, 182330, 182334, 182338, 182342, 182346, 182350, 182354, + 182358, 182362, 182366, 182370, 182374, 182378, 182382, 182386, 182390, + 182394, 182398, 182402, 182406, 182410, 182414, 182418, 182422, 182426, + 182430, 182434, 182438, 182442, 182446, 182450, 182454, 182458, 182462, + 182466, 182470, 182474, 182478, 182482, 182486, 182490, 182494, 182498, + 182502, 182506, 182510, 182514, 182518, 182522, 182526, 182530, 182534, + 182538, 182542, 182546, 182550, 182554, 182558, 182562, 182566, 182570, + 182574, 182578, 182582, 182586, 182590, 182594, 182598, 182602, 182606, + 182610, 182614, 182618, 182622, 182626, 182630, 182634, 182638, 182642, + 182646, 182650, 182654, 182658, 182662, 182666, 182670, 182674, 182678, + 182682, 182686, 182690, 182694, 182698, 182702, 182706, 182710, 182714, + 182718, 182722, 182726, 182730, 182734, 182738, 182742, 182746, 182750, + 182754, 182758, 182762, 182766, 182770, 182774, 182778, 182782, 182786, + 182790, 182794, 182798, 182802, 182806, 182810, 182814, 182818, 182822, + 182826, 182830, 182834, 182838, 182842, 182846, 182850, 182854, 182858, + 182862, 182866, 182870, 182874, 182878, 182882, 182886, 182890, 182894, + 182898, 182902, 182906, 182910, 182914, 182918, 182922, 182926, 182930, + 182934, 182938, 182942, 182946, 182950, 182954, 182958, 182962, 182966, + 182970, 182974, 182978, 182982, 182986, 182990, 182994, 182998, 183002, + 183006, 183010, 183014, 183018, 183022, 183026, 183030, 183034, 183038, + 183042, 183046, 183050, 183054, 183058, 183062, 183066, 183070, 183074, + 183078, 183082, 183086, 183090, 183094, 183098, 183102, 183106, 183110, + 183114, 183118, 183122, 183126, 183130, 183134, 183138, 183142, 183146, + 183150, 183154, 183158, 183162, 183166, 183170, 183174, 183178, 183182, + 183186, 183190, 183194, 183198, 183202, 183206, 183210, 183214, 183218, + 183222, 183226, 183230, 183234, 183238, 183242, 183246, 183250, 183254, + 183258, 183262, 183266, 183270, 183274, 183278, 183282, 183286, 183290, + 183294, 183298, 183302, 183306, 183310, 183314, 183318, 183322, 183326, + 183330, 183334, 183338, 183342, 183346, 183350, 183354, 183358, 183362, + 183366, 183370, 183374, 183378, 183382, 183386, 183390, 183394, 183398, + 183402, 183406, 183410, 183414, 183418, 183422, 183426, 183430, 183434, + 183438, 183442, 183446, 183450, 183454, 183458, 183462, 183466, 183470, + 183474, 183478, 183482, 183486, 183490, 183494, 183498, 183502, 183506, + 183510, 183514, 183518, 183522, 183526, 183530, 183534, 183538, 183542, + 183546, 183550, 183554, 183558, 183562, 183566, 183570, 183574, 183578, + 183582, 183586, 183590, 183594, 183598, 183602, 183606, 183610, 183614, + 183618, 183622, 183626, 183630, 183634, 183638, 183642, 183646, 183650, + 183654, 183658, 183662, 183666, 183670, 183674, 183678, 183682, 183686, + 183690, 183694, 183698, 183702, 183706, 183710, 183714, 183718, 183722, + 183726, 183730, 183734, 183738, 183742, 183746, 183750, 183754, 183758, + 183762, 183766, 183770, 183774, 183778, 183782, 183786, 183790, 183794, + 183798, 183802, 183806, 183810, 183814, 183818, 183822, 183826, 183830, + 183834, 183838, 183842, 183846, 183850, 183854, 183858, 183862, 183866, + 183870, 183874, 183878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180391, 180395, 180399, 180404, - 180408, 180412, 180416, 180420, 180424, 180428, 180432, 180436, 180440, - 180450, 180460, 180470, 180480, 180494, 180508, 180521, 180534, 180545, - 180556, 180567, 180578, 180589, 180600, 180610, 180619, 180628, 180637, - 180650, 180663, 180675, 180687, 180697, 180707, 180717, 180727, 180736, - 180745, 180755, 180765, 180775, 180785, 180796, 180807, 180817, 180827, - 180838, 180849, 180860, 180871, 180881, 180894, 180905, 180919, 180927, - 180938, 180946, 180954, 180962, 180970, 180978, 180986, 180995, 181004, - 181014, 181024, 181033, 181042, 181052, 181062, 181070, 181078, 181085, - 181094, 181102, 181110, 181117, 181127, 181136, 181147, 181158, 181170, - 181181, 181191, 181202, 181212, 181223, 181231, 181236, 181240, 181244, - 181248, 181252, 181256, 181260, 181264, 181268, 181272, 181276, 181280, - 181283, 181286, 181290, 181294, 181298, 181302, 181306, 181310, 181314, - 181318, 181322, 181326, 181330, 181334, 181338, 181342, 181346, 181350, - 181354, 181358, 181362, 181366, 181370, 181374, 181378, 181382, 181386, - 181390, 181394, 181398, 181402, 181406, 181410, 181414, 181418, 181422, - 181426, 181430, 181434, 181438, 181442, 181446, 181450, 181454, 181458, - 181462, 181466, 181470, 181474, 181478, 181482, 181486, 181490, 181494, - 181498, 181502, 181506, 181510, 181514, 181518, 181522, 181526, 181530, - 181534, 181538, 181542, 181546, 181550, 181554, 181558, 181562, 181566, - 181570, 181574, 181578, 181582, 181586, 181590, 181594, 181598, 181602, - 181606, 181610, 181614, 181618, 181622, 181626, 181629, 181633, 181637, - 181641, 181645, 181649, 181653, 181657, 181661, 181665, 181669, 181673, - 181677, 181681, 181685, 181689, 181693, 181697, 181701, 181705, 181709, - 181713, 181717, 181721, 181725, 181729, 181733, 181737, 181741, 181745, - 181749, 181753, 181757, 181761, 181765, 181769, 181773, 181777, 181781, - 181785, 181789, 181793, 181797, 181801, 181805, 181809, 181813, 181817, - 181821, 181825, 181829, 181833, 181837, 181841, 181845, 181849, 181853, - 181857, 181861, 181865, 181869, 181873, 181877, 181881, 181885, 181889, - 181893, 181897, 181901, 181905, 181909, 181913, 181917, 181921, 181925, - 181929, 181933, 181937, 181941, 181945, 181949, 181953, 181957, 181961, - 181965, 181969, 181973, 181977, 181981, 181985, 181989, 181993, 181997, - 182001, 182005, 182009, 182013, 182017, 182021, 182025, 182029, 182033, - 182037, 182041, 182045, 182049, 182053, 182057, 182061, 182065, 182069, - 182073, 182077, 182081, 182085, 182089, 182093, 182097, 182101, 182105, - 182109, 182113, 182117, 182121, 182125, 182129, 182133, 182137, 182141, - 182145, 182149, 182153, 182157, 182161, 182165, 182169, 182173, 182177, - 182181, 182185, 182189, 182193, 182197, 182201, 182205, 182209, 182213, - 182217, 182221, 182225, 182229, 182233, 182237, 182241, 182245, 182249, - 182253, 182257, 182261, 182265, 182269, 182273, 182277, 182281, 182285, - 182289, 182293, 182297, 182301, 182305, 182309, 182313, 182317, 182321, - 182325, 182329, 182333, 182337, 182341, 182345, 182349, 182353, 182357, - 182361, 182365, 182369, 182373, 182377, 182381, 182385, 182389, 182393, - 182398, 182403, 182408, 182412, 182418, 182425, 182432, 182439, 182446, - 182453, 182460, 182467, 182474, 182481, 182488, 182495, 182502, 182509, - 182515, 182521, 182528, 182534, 182541, 182548, 182555, 182562, 182569, - 182576, 182583, 182590, 182597, 182604, 182611, 182618, 182625, 182631, - 182637, 182643, 182650, 182659, 182668, 182677, 182686, 182691, 182696, - 182702, 182708, 182714, 182720, 182726, 182732, 182738, 182744, 182750, - 182756, 182762, 182768, 182773, 182779, 182789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183882, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183886, 183889, 183893, 183897, 183900, 183904, 183908, 183911, + 183914, 183918, 183922, 183925, 183928, 183931, 183934, 183939, 183942, + 183946, 183949, 183952, 183955, 183958, 183961, 183964, 183967, 183970, + 183973, 183976, 183979, 183983, 183987, 183991, 183995, 184000, 184005, + 184011, 184017, 184023, 184028, 184034, 184040, 184046, 184051, 184057, + 184063, 184068, 184074, 184080, 184085, 184091, 184097, 184102, 184108, + 184114, 184119, 184125, 184131, 184137, 184143, 184149, 184153, 184158, + 184162, 184167, 184171, 184176, 184181, 184187, 184193, 184199, 184204, + 184210, 184216, 184222, 184227, 184233, 184239, 184244, 184250, 184256, + 184261, 184267, 184273, 184278, 184284, 184290, 184295, 184301, 184307, + 184313, 184319, 184325, 184330, 184334, 184339, 184342, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 184346, 184349, 184352, 184355, 184358, 184361, 184364, 184367, + 184370, 184373, 184376, 184379, 184382, 184385, 184388, 184391, 184394, + 184397, 184400, 184403, 184406, 184409, 184412, 184415, 184418, 184421, + 184424, 184427, 184430, 184433, 184436, 184439, 184442, 184445, 184448, + 184451, 184454, 184457, 184460, 184463, 184466, 184469, 184472, 184475, + 184478, 184481, 184484, 184487, 184490, 184493, 184496, 184499, 184502, + 184505, 184508, 184511, 184514, 184517, 184520, 184523, 184526, 184529, + 184532, 184535, 184538, 184541, 184544, 184547, 184550, 184553, 184556, + 184559, 184562, 184565, 184568, 184571, 184574, 184577, 184580, 184583, + 184586, 184589, 184592, 184595, 184598, 184601, 184604, 184607, 184610, + 184613, 184616, 184619, 184622, 184625, 184628, 184631, 184634, 184637, + 184640, 184643, 184646, 184649, 184652, 184655, 184658, 184661, 184664, + 184667, 184670, 184673, 184676, 184679, 184682, 184685, 184688, 184691, + 184694, 184697, 184700, 184703, 184706, 184709, 184712, 184715, 184718, + 184721, 184724, 184727, 184730, 184733, 184736, 184739, 184742, 184745, + 184748, 184751, 184754, 184757, 184760, 184763, 184766, 184769, 184772, + 184775, 184778, 184781, 184784, 184787, 184790, 184793, 184796, 184799, + 184802, 184805, 184808, 184811, 184814, 184817, 184820, 184823, 184826, + 184829, 184832, 184835, 184838, 184841, 184844, 184847, 184850, 184853, + 184856, 184859, 184862, 184865, 184868, 184871, 184874, 184877, 184880, + 184883, 184886, 184889, 184892, 184895, 184898, 184901, 184904, 184907, + 184910, 184913, 184916, 184919, 184922, 184925, 184928, 184931, 184934, + 184937, 184940, 184943, 184946, 184949, 184952, 184955, 184958, 184961, + 184964, 184967, 184970, 184973, 184976, 184979, 184982, 184985, 184988, + 184991, 184994, 184997, 185000, 185003, 185006, 185009, 185012, 185015, + 185018, 185021, 185024, 185027, 185030, 185033, 185036, 185039, 185042, + 185045, 185048, 185051, 185054, 185057, 185060, 185063, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185066, 185068, 185070, 185075, 185077, + 185082, 185084, 185089, 185091, 185096, 185098, 185100, 185102, 185104, + 185106, 185108, 185110, 185112, 185114, 185118, 185122, 185124, 185126, + 185130, 185134, 185139, 185141, 185143, 185145, 185149, 185152, 185154, + 185158, 185160, 185164, 185166, 185170, 185173, 185175, 185179, 185183, + 185185, 185191, 185193, 185198, 185200, 185205, 185207, 185212, 185214, + 185219, 185221, 185225, 185227, 185231, 185233, 185240, 185242, 185244, + 185246, 185251, 185253, 185255, 185257, 185259, 185261, 185266, 185270, + 185272, 185277, 185281, 185283, 185288, 185292, 185294, 185299, 185303, + 185305, 185307, 185309, 185311, 185315, 185317, 185322, 185324, 185330, + 185332, 185338, 185340, 185342, 185344, 185348, 185350, 185357, 185359, + 185366, 185368, 185374, 185380, 185382, 185389, 185396, 185398, 185404, + 185409, 185411, 185417, 185423, 185425, 185431, 185437, 185439, 185445, + 185449, 185451, 185456, 185458, 185460, 185465, 185467, 185469, 185475, + 185477, 185482, 185486, 185488, 185493, 185497, 185499, 185505, 185507, + 185511, 185513, 185517, 185519, 185526, 185533, 185535, 185542, 185549, + 185551, 185556, 185558, 185566, 185568, 185574, 185576, 185582, 185584, + 185588, 185590, 185596, 185598, 185602, 185604, 185610, 185612, 185614, + 185616, 185621, 185626, 185628, 185630, 185640, 185645, 185652, 185659, + 185664, 185669, 185681, 185685, 185689, 185693, 185697, 185699, 185701, + 185703, 185705, 185707, 185709, 185711, 185713, 185715, 185717, 185719, + 185721, 185723, 185725, 185727, 185729, 185731, 185733, 185735, 185737, + 185739, 185745, 185752, 185757, 185765, 185773, 185778, 185780, 185782, + 185784, 185786, 185788, 185790, 185792, 185794, 185796, 185798, 185800, + 185802, 185804, 185806, 185808, 185810, 185821, 185826, 185828, 185830, + 185836, 185848, 185854, 185860, 185866, 185872, 185876, 185887, 185889, + 185891, 185893, 185895, 185897, 185899, 185901, 185903, 185905, 185907, + 185909, 185911, 185913, 185915, 185917, 185919, 185921, 185923, 185925, + 185927, 185929, 185931, 185933, 185935, 185937, 185939, 185941, 185943, + 185945, 185947, 185949, 185951, 185953, 185955, 185957, 185959, 185961, + 185963, 185965, 185967, 185969, 185971, 185973, 185975, 185977, 185979, + 185981, 185983, 185985, 185987, 185989, 185991, 185993, 185995, 185997, + 185999, 186001, 186003, 186005, 186007, 186009, 186011, 186013, 186015, + 186017, 186019, 186021, 186023, 186025, 186027, 186029, 186031, 186033, + 186035, 186037, 186039, 186041, 186043, 186045, 186047, 186049, 186051, + 186053, 186055, 186057, 186059, 186061, 186063, 186065, 186067, 186069, + 186071, 186073, 186075, 186077, 186079, 186081, 186083, 186085, 186087, + 186089, 186091, 186093, 186095, 186097, 186099, 186101, 186103, 186105, + 186107, 186109, 186111, 186113, 186115, 186117, 186119, 186121, 186123, + 186125, 186127, 186129, 186131, 186133, 186135, 186137, 186139, 186141, + 186143, 186145, 186147, 186149, 186151, 186153, 186155, 186157, 186159, + 186161, 186163, 186165, 186167, 186169, 186171, 186173, 186175, 186177, + 186179, 186181, 186183, 186185, 186187, 186189, 186191, 186193, 186195, + 186197, 186199, 186201, 186203, 186205, 186207, 186209, 186211, 186213, + 186215, 186217, 186219, 186221, 186223, 186225, 186227, 186229, 186231, + 186233, 186235, 186237, 186239, 186241, 186243, 186245, 186247, 186249, + 186251, 186253, 186255, 186257, 186259, 186261, 186263, 186265, 186267, + 186269, 186271, 186273, 186275, 186277, 186279, 186281, 186283, 186285, + 186287, 186289, 186291, 186293, 186295, 186297, 186299, 186301, 186303, + 186305, 186307, 186309, 186311, 186313, 186315, 186317, 186319, 186321, + 186323, 186325, 186327, 186329, 186331, 186333, 186335, 186337, 186339, + 186341, 186343, 186345, 186347, 186349, 186351, 186353, 186355, 186357, + 186359, 186361, 186363, 186365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 186367, 186371, 186375, 186380, 186384, 186388, 186392, + 186396, 186400, 186404, 186408, 186412, 186416, 186426, 186436, 186447, + 186458, 186468, 186478, 186488, 186498, 186512, 186526, 186540, 186554, + 186563, 186572, 186585, 186598, 186611, 186624, 186634, 186644, 186655, + 186666, 186677, 186688, 186699, 186708, 186718, 186728, 186738, 186748, + 186759, 186770, 186781, 186792, 186803, 186814, 186825, 186836, 186847, + 186858, 186869, 186883, 186894, 186908, 186916, 186927, 186935, 186943, + 186951, 186959, 186967, 186975, 186985, 186995, 187005, 187015, 187025, + 187035, 187045, 187055, 187063, 187072, 187081, 187090, 187099, 187107, + 187115, 187125, 187135, 187146, 187157, 187169, 187180, 187190, 187201, + 187211, 187222, 187230, 187235, 187239, 187243, 187247, 187251, 187255, + 187259, 187263, 187267, 187271, 187275, 187279, 187282, 187285, 187289, + 187293, 187297, 187301, 187305, 187309, 187313, 187317, 187321, 187325, + 187329, 187333, 187337, 187341, 187345, 187349, 187353, 187357, 187361, + 187365, 187369, 187373, 187377, 187381, 187385, 187389, 187393, 187397, + 187401, 187405, 187409, 187413, 187417, 187421, 187425, 187429, 187433, + 187437, 187441, 187445, 187449, 187453, 187457, 187461, 187465, 187469, + 187473, 187477, 187481, 187485, 187489, 187493, 187497, 187501, 187505, + 187509, 187513, 187517, 187521, 187525, 187529, 187533, 187537, 187541, + 187545, 187549, 187553, 187557, 187561, 187565, 187569, 187573, 187577, + 187581, 187585, 187589, 187593, 187597, 187601, 187605, 187609, 187613, + 187617, 187621, 187625, 187628, 187632, 187636, 187640, 187644, 187648, + 187652, 187656, 187660, 187664, 187668, 187672, 187676, 187680, 187684, + 187688, 187692, 187696, 187700, 187704, 187708, 187712, 187716, 187720, + 187724, 187728, 187732, 187736, 187740, 187744, 187748, 187752, 187756, + 187760, 187764, 187768, 187772, 187776, 187780, 187784, 187788, 187792, + 187796, 187800, 187804, 187808, 187812, 187816, 187820, 187824, 187828, + 187832, 187836, 187840, 187844, 187848, 187852, 187856, 187860, 187864, + 187868, 187872, 187876, 187880, 187884, 187888, 187892, 187896, 187900, + 187904, 187908, 187912, 187916, 187920, 187924, 187928, 187932, 187936, + 187940, 187944, 187948, 187952, 187956, 187960, 187964, 187968, 187972, + 187976, 187980, 187984, 187988, 187992, 187996, 188000, 188004, 188008, + 188012, 188016, 188020, 188024, 188028, 188032, 188036, 188040, 188044, + 188048, 188052, 188056, 188060, 188064, 188068, 188072, 188076, 188080, + 188084, 188088, 188092, 188096, 188100, 188104, 188108, 188112, 188116, + 188120, 188124, 188128, 188132, 188136, 188140, 188144, 188148, 188152, + 188156, 188160, 188164, 188168, 188172, 188176, 188180, 188184, 188188, + 188192, 188196, 188200, 188204, 188208, 188212, 188216, 188220, 188224, + 188228, 188232, 188236, 188240, 188244, 188248, 188252, 188256, 188260, + 188264, 188268, 188272, 188276, 188280, 188284, 188288, 188292, 188296, + 188300, 188304, 188308, 188312, 188316, 188320, 188324, 188328, 188332, + 188336, 188340, 188344, 188348, 188352, 188356, 188360, 188364, 188368, + 188372, 188376, 188380, 188384, 188388, 188392, 188397, 188402, 188407, + 188411, 188417, 188424, 188431, 188438, 188445, 188452, 188459, 188466, + 188473, 188480, 188487, 188494, 188501, 188508, 188514, 188520, 188527, + 188533, 188540, 188547, 188554, 188561, 188568, 188575, 188582, 188589, + 188596, 188603, 188610, 188617, 188624, 188630, 188636, 188642, 188649, + 188658, 188667, 188676, 188685, 188690, 188695, 188702, 188709, 188716, + 188723, 188730, 188736, 188742, 188748, 188754, 188760, 188766, 188772, + 188777, 188783, 188793, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, }; /* name->code dictionary */ static const unsigned int code_hash[] = { 74224, 4851, 0, 0, 0, 0, 7929, 0, 0, 0, 0, 127931, 0, 42833, 983091, - 12064, 0, 129548, 194597, 69850, 65842, 0, 0, 0, 78159, 68476, 72392, - 1373, 0, 0, 5816, 0, 0, 4231, 0, 0, 4233, 4234, 4232, 68885, 70351, 0, - 7404, 72393, 0, 0, 0, 0, 0, 41601, 8874, 0, 0, 0, 0, 0, 0, 41603, 9784, - 0, 9188, 41600, 0, 0, 0, 0, 3535, 0, 0, 0, 66797, 0, 74491, 0, 3404, - 100419, 0, 72411, 1759, 100417, 0, 100418, 69972, 11240, 121038, 100416, - 127764, 0, 0, 0, 0, 0, 69970, 0, 0, 9834, 43249, 2234, 983872, 0, 0, 0, - 0, 92417, 0, 74398, 12035, 0, 983074, 43548, 0, 0, 0, 0, 0, 64318, + 12064, 110752, 129548, 194597, 69850, 65842, 0, 0, 0, 78159, 68476, + 72392, 1373, 0, 0, 5816, 0, 0, 4231, 0, 0, 4233, 4234, 4232, 68885, + 70351, 0, 7404, 72393, 0, 0, 0, 0, 0, 41601, 8874, 0, 0, 0, 0, 0, 0, + 41603, 9784, 0, 9188, 41600, 0, 0, 0, 0, 3535, 0, 0, 0, 66797, 0, 74491, + 0, 3404, 100419, 0, 72411, 1759, 100417, 0, 100418, 69972, 11240, 121038, + 100416, 127764, 0, 0, 0, 0, 0, 69970, 0, 0, 9834, 43249, 2234, 983872, 0, + 0, 0, 0, 92417, 0, 74398, 12035, 0, 983074, 43548, 0, 0, 0, 0, 0, 64318, 917549, 0, 3390, 74483, 43265, 0, 983865, 0, 0, 0, 3400, 0, 0, 11647, 0, 0, 0, 0, 2121, 128741, 4043, 8712, 0, 983795, 0, 121172, 0, 129456, 0, 0, 93042, 0, 0, 983856, 0, 0, 0, 11851, 0, 3181, 66002, 0, 69601, 0, 66021, 0, 194588, 5457, 5440, 0, 93981, 65282, 2843, 5355, 0, 129333, 69971, 5194, 11657, 128353, 0, 0, 0, 0, 0, 0, 100525, 0, 0, 74350, 0, 10682, - 110820, 10602, 800, 70044, 118883, 0, 0, 64930, 118940, 67853, 0, 0, 762, - 120485, 0, 0, 0, 10906, 1353, 6960, 0, 0, 5828, 8724, 0, 0, 0, 0, 0, + 110820, 10602, 800, 70044, 118883, 0, 0, 64930, 118940, 67853, 72001, 0, + 762, 120485, 0, 0, 0, 10906, 1353, 6960, 0, 0, 5828, 8724, 0, 0, 0, 0, 0, 7080, 0, 0, 0, 0, 72388, 0, 0, 0, 0, 68878, 0, 0, 0, 7240, 0, 556, 0, 0, 0, 0, 0, 72397, 0, 0, 0, 0, 0, 0, 0, 0, 72986, 0, 0, 43931, 0, 11093, 0, 0, 125016, 7341, 66801, 68527, 0, 1874, 0, 0, 129314, 0, 0, 0, 0, 0, 0, @@ -23526,12 +24325,12 @@ static const unsigned int code_hash[] = { 0, 92928, 0, 0, 7233, 92929, 0, 0, 6639, 0, 0, 123149, 0, 1176, 0, 0, 8276, 128667, 0, 0, 68892, 42931, 0, 0, 0, 0, 0, 0, 0, 5388, 0, 0, 0, 11310, 0, 123607, 0, 68888, 4199, 119264, 0, 119020, 0, 0, 9560, 0, 0, - 43869, 0, 0, 0, 83172, 0, 0, 0, 83173, 121256, 128875, 0, 0, 74327, 0, 0, + 43869, 0, 0, 0, 83172, 0, 0, 0, 83173, 101559, 128875, 0, 0, 74327, 0, 0, 0, 0, 0, 123623, 68886, 0, 0, 0, 8408, 64704, 0, 0, 0, 0, 0, 67999, 0, 0, 0, 0, 43049, 0, 43050, 73028, 0, 0, 0, 0, 0, 127396, 0, 69847, 9322, 0, 0, 129321, 68192, 120507, 983634, 0, 0, 0, 6199, 67249, 0, 0, 0, 0, 11329, 66285, 0, 983086, 0, 0, 0, 0, 41335, 118866, 43401, 0, 41334, 0, - 0, 0, 983479, 0, 983478, 128114, 0, 42627, 0, 32, 6187, 0, 123619, + 0, 0, 983479, 71997, 983478, 128114, 0, 42627, 0, 32, 6187, 0, 123619, 983475, 3665, 121083, 42871, 983118, 41336, 0, 0, 983471, 0, 0, 0, 4412, 0, 0, 0, 0, 119533, 0, 4181, 0, 0, 127589, 0, 0, 71453, 6181, 74755, 917895, 0, 0, 0, 0, 121107, 0, 0, 10073, 0, 100738, 127186, 0, 42844, @@ -23552,45 +24351,46 @@ static const unsigned int code_hash[] = { 0, 0, 0, 0, 983507, 41323, 0, 0, 92289, 0, 0, 0, 983503, 41321, 12907, 3048, 7752, 41320, 0, 0, 12819, 111247, 72127, 0, 0, 0, 0, 0, 72971, 0, 0, 0, 0, 78650, 78649, 0, 41326, 0, 11806, 43167, 0, 1245, 0, 66463, 0, - 0, 0, 0, 0, 194619, 0, 0, 0, 0, 0, 0, 70403, 325, 12874, 0, 74178, 0, 0, - 119110, 0, 0, 0, 0, 0, 0, 983563, 92175, 0, 0, 0, 121049, 0, 0, 0, 0, 0, - 0, 110844, 11776, 0, 19908, 0, 0, 0, 8753, 0, 0, 0, 9511, 43493, 0, - 93032, 6205, 0, 0, 0, 0, 0, 0, 0, 0, 126577, 0, 41607, 0, 0, 120617, 0, - 0, 0, 7005, 41609, 9580, 0, 401, 0, 43779, 0, 127962, 0, 65486, 0, 12857, - 0, 11983, 0, 0, 0, 121371, 0, 194971, 74258, 0, 0, 0, 0, 0, 0, 8295, - 6200, 0, 127864, 0, 0, 71435, 0, 92523, 0, 128631, 0, 0, 125197, 0, 0, 0, - 127556, 0, 0, 0, 64775, 0, 68862, 120590, 0, 0, 0, 8074, 8199, 126641, - 1907, 127269, 4432, 127271, 10808, 120668, 127272, 127259, 3888, 127261, - 72724, 127263, 127262, 127265, 123169, 121195, 127250, 66879, 127252, - 100422, 66023, 67363, 7663, 0, 0, 0, 0, 66321, 0, 12814, 127248, 127169, - 0, 0, 194603, 7641, 92694, 0, 0, 0, 0, 74320, 120818, 120268, 0, 128475, - 0, 110627, 0, 9622, 128972, 120264, 0, 0, 0, 0, 68319, 0, 0, 71484, 0, 0, - 0, 69906, 0, 0, 947, 0, 194586, 129059, 10969, 119935, 7613, 119937, - 119936, 4795, 119930, 119933, 7376, 0, 0, 0, 0, 0, 0, 0, 0, 119919, 7216, - 119921, 7217, 119915, 7218, 119917, 7219, 119927, 119926, 119929, 119928, - 7213, 119922, 7214, 7215, 128622, 0, 8880, 7685, 128849, 0, 0, 119618, 0, - 8187, 119913, 12815, 7236, 7915, 71906, 0, 121284, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 10468, 0, 0, 0, 0, 0, 0, 0, 0, 917909, 0, 110633, 1616, - 3795, 67732, 11529, 0, 126225, 0, 0, 1138, 194577, 12677, 0, 0, 3239, 0, - 0, 194809, 194583, 0, 42164, 0, 11778, 0, 43259, 0, 119073, 0, 0, 0, - 67094, 129638, 0, 78421, 128123, 78418, 0, 0, 0, 0, 43959, 43960, 0, - 72257, 0, 9359, 78416, 0, 0, 0, 6662, 0, 0, 3863, 0, 41329, 55266, 0, - 127822, 41328, 75026, 194569, 129516, 0, 0, 0, 119595, 569, 0, 0, 0, - 119085, 110669, 0, 0, 11610, 11368, 0, 194570, 41331, 1006, 127747, - 120883, 1550, 8201, 0, 0, 5499, 43956, 77908, 77910, 77906, 43957, 77904, - 77905, 128410, 0, 0, 129581, 100447, 43955, 77913, 0, 0, 5511, 0, 983702, - 0, 69241, 8255, 5512, 128560, 119560, 127858, 64313, 127928, 5906, 1119, - 128180, 67088, 983362, 0, 113798, 0, 66423, 0, 0, 0, 67089, 0, 0, 0, 0, - 128177, 983709, 0, 0, 0, 5821, 6186, 0, 128034, 19961, 0, 983700, 0, - 65138, 302, 41113, 41115, 0, 6637, 5907, 128789, 0, 43642, 0, 128625, 0, - 70345, 5513, 6666, 100567, 78442, 5510, 0, 0, 0, 983706, 78437, 0, 0, 0, - 110838, 0, 0, 0, 92710, 0, 0, 0, 0, 0, 74497, 92395, 120511, 6929, 69412, - 0, 110835, 64442, 0, 0, 74496, 0, 6674, 43397, 0, 1476, 0, 0, 72276, - 3233, 0, 0, 10164, 0, 0, 3530, 67243, 0, 111219, 6656, 0, 0, 74647, 8512, - 72275, 74261, 8967, 0, 0, 0, 72277, 7986, 73782, 120556, 9006, 983562, - 72273, 0, 7853, 0, 983355, 0, 0, 0, 0, 983952, 0, 0, 0, 0, 0, 0, 0, 0, - 127971, 67983, 13296, 517, 0, 0, 0, 41528, 19923, 65454, 0, 0, 0, 10531, - 7784, 41526, 71727, 0, 8057, 1126, 73895, 0, 0, 0, 119186, 4251, 8235, + 0, 0, 0, 0, 194619, 0, 194618, 0, 0, 194620, 0, 70403, 325, 12874, 0, + 74178, 0, 0, 119110, 0, 0, 0, 0, 0, 0, 983563, 92175, 0, 0, 0, 121049, 0, + 0, 0, 0, 0, 0, 110844, 11776, 0, 19908, 0, 0, 0, 8753, 69278, 0, 0, 9511, + 43493, 0, 93032, 6205, 0, 0, 0, 0, 0, 0, 0, 0, 126577, 0, 41607, 0, 0, + 120617, 0, 0, 0, 7005, 41609, 9580, 0, 401, 0, 43779, 0, 127962, 0, + 65486, 0, 12857, 0, 11983, 0, 0, 0, 121371, 0, 194971, 74258, 0, 0, 0, 0, + 0, 0, 8295, 6200, 0, 127864, 0, 0, 71435, 0, 92523, 0, 128631, 0, 0, + 125197, 0, 0, 0, 127556, 0, 0, 0, 64775, 0, 68862, 120590, 0, 0, 129959, + 8074, 8199, 126641, 1907, 127269, 4432, 127271, 10808, 120668, 127272, + 127259, 3888, 127261, 72724, 127263, 127262, 127265, 123169, 121195, + 127250, 66879, 127252, 100422, 66023, 67363, 7663, 0, 0, 0, 0, 66321, 0, + 12814, 127248, 127169, 0, 0, 194603, 7641, 92694, 0, 0, 0, 0, 74320, + 120818, 120268, 0, 128475, 0, 110627, 0, 9622, 128972, 120264, 0, 0, 0, + 0, 68319, 0, 0, 71484, 0, 0, 0, 69906, 0, 0, 947, 0, 194586, 129059, + 10969, 119935, 7613, 119937, 119936, 4795, 119930, 119933, 7376, 0, 0, 0, + 0, 0, 0, 0, 0, 119919, 7216, 119921, 7217, 119915, 7218, 119917, 7219, + 119927, 119926, 119929, 119928, 7213, 119922, 7214, 7215, 128622, 0, + 8880, 7685, 128849, 0, 0, 119618, 119853, 8187, 119913, 12815, 7236, + 7915, 71906, 0, 121284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10468, 0, + 0, 0, 0, 0, 0, 0, 0, 917909, 0, 110633, 1616, 3795, 67732, 11529, 0, + 126225, 0, 0, 1138, 194577, 12677, 0, 0, 3239, 0, 0, 194809, 194583, 0, + 42164, 0, 11778, 0, 43259, 0, 119073, 0, 0, 0, 67094, 129638, 0, 78421, + 128123, 78418, 0, 0, 0, 0, 43959, 43960, 0, 72257, 0, 9359, 78416, 0, 0, + 0, 6662, 0, 0, 3863, 0, 41329, 55266, 0, 127822, 41328, 75026, 194569, + 129516, 0, 0, 0, 119595, 569, 0, 0, 0, 119085, 110669, 0, 0, 11610, + 11368, 0, 194570, 41331, 1006, 127747, 120883, 1550, 8201, 0, 194811, + 5499, 43956, 77908, 77910, 77906, 43957, 77904, 77905, 128410, 0, 0, + 129581, 100447, 43955, 77913, 0, 0, 5511, 0, 983702, 0, 69241, 8255, + 5512, 128560, 119560, 127858, 64313, 127928, 5906, 1119, 128180, 67088, + 983362, 0, 113798, 0, 66423, 0, 0, 0, 67089, 0, 0, 0, 0, 128177, 983709, + 0, 0, 0, 5821, 6186, 129960, 128034, 19961, 0, 983700, 0, 65138, 302, + 41113, 41115, 0, 6637, 5907, 128789, 0, 43642, 0, 128625, 0, 70345, 5513, + 6666, 100567, 78442, 5510, 0, 0, 0, 983706, 78437, 0, 0, 0, 110838, 0, 0, + 0, 92710, 0, 0, 0, 0, 0, 74497, 92395, 120511, 6929, 69412, 0, 110835, + 64442, 0, 0, 74496, 0, 6674, 43397, 0, 1476, 0, 0, 72276, 3233, 0, 0, + 10164, 0, 0, 3530, 67243, 0, 111219, 6656, 0, 0, 74647, 8512, 72275, + 74261, 8967, 0, 0, 0, 72277, 7986, 73782, 120556, 9006, 983562, 72273, 0, + 7853, 0, 983355, 0, 0, 0, 0, 983952, 0, 0, 0, 0, 0, 0, 0, 0, 127971, + 67983, 13296, 517, 0, 0, 0, 41528, 19923, 65454, 0, 0, 0, 10531, 7784, + 41526, 71727, 0, 8057, 1126, 73895, 0, 0, 130040, 119186, 4251, 8235, 43142, 0, 489, 71733, 4250, 71731, 110721, 43151, 94177, 71725, 0, 121238, 0, 0, 0, 110726, 0, 8711, 6183, 110722, 110723, 0, 0, 7623, 0, 0, 9235, 12760, 74176, 0, 0, 0, 0, 3743, 11514, 11078, 74582, 0, 0, 126597, @@ -23599,294 +24399,297 @@ static const unsigned int code_hash[] = { 0, 92541, 128017, 126087, 126590, 0, 12767, 0, 983375, 64261, 0, 127537, 70852, 70347, 0, 6673, 0, 0, 129346, 12438, 0, 0, 0, 71128, 0, 9053, 43954, 74523, 0, 0, 0, 6195, 0, 6660, 0, 917760, 917793, 0, 12629, 0, 0, - 0, 0, 0, 127940, 0, 0, 0, 65448, 0, 0, 121084, 0, 43949, 0, 78099, 0, 0, - 0, 0, 0, 5741, 1131, 0, 0, 74862, 0, 43952, 42533, 119598, 78107, 0, 0, - 43950, 121297, 118990, 7691, 43951, 578, 0, 0, 0, 42514, 74547, 74196, - 120608, 74561, 0, 983957, 0, 0, 0, 0, 0, 0, 0, 0, 7241, 0, 93846, 119167, - 0, 12811, 78082, 3946, 0, 10998, 66807, 673, 0, 0, 0, 0, 119301, 0, - 68890, 0, 0, 78085, 10267, 0, 74560, 78083, 0, 8729, 0, 0, 0, 0, 0, 0, 0, - 119296, 0, 0, 0, 120853, 983458, 731, 0, 71904, 128316, 0, 0, 0, 1175, 0, - 68167, 0, 0, 10793, 0, 67644, 7723, 983453, 0, 0, 0, 0, 5273, 0, 5269, 0, - 69607, 2404, 5267, 124967, 0, 0, 5277, 0, 0, 6189, 65469, 1314, 0, 0, - 118873, 8785, 0, 0, 127527, 68414, 43535, 9204, 0, 3879, 0, 71696, 6197, - 9497, 0, 7567, 64484, 78128, 41390, 41379, 41882, 67647, 67279, 70085, 0, - 121413, 41388, 64446, 41392, 64288, 41387, 0, 8706, 10675, 0, 700, 0, - 5775, 0, 7088, 74756, 7499, 0, 78120, 78111, 67251, 126557, 0, 0, 128945, - 10311, 78115, 6665, 11115, 0, 7618, 10821, 11455, 0, 64632, 64447, 0, 0, - 78093, 78091, 0, 0, 65033, 0, 6668, 0, 0, 0, 656, 69686, 65037, 0, 0, 0, - 0, 0, 0, 0, 73014, 0, 0, 917774, 9702, 0, 92273, 66580, 118895, 66683, - 43640, 3417, 0, 6832, 0, 917768, 0, 917767, 0, 4935, 11906, 0, 0, 67296, - 92896, 3651, 0, 67294, 70848, 0, 67292, 0, 12983, 0, 55272, 0, 0, 1439, - 0, 74897, 0, 0, 0, 78373, 0, 42087, 3063, 0, 0, 7838, 0, 129282, 0, 0, - 67968, 0, 128582, 9078, 92446, 0, 0, 0, 0, 0, 0, 119586, 0, 7750, 128422, - 68237, 6190, 0, 0, 0, 72340, 9857, 7014, 9856, 0, 92620, 120547, 0, 8481, - 0, 6202, 0, 10920, 67970, 0, 0, 983292, 0, 7843, 65818, 66824, 0, 0, 0, - 0, 0, 0, 0, 6657, 207, 0, 69728, 74819, 0, 0, 0, 0, 0, 0, 0, 0, 41368, - 43974, 488, 0, 0, 71339, 10157, 0, 43034, 11982, 0, 0, 0, 0, 0, 41372, - 6669, 8504, 72103, 0, 41367, 129328, 119272, 0, 11726, 8261, 0, 304, 0, - 0, 0, 0, 113683, 983235, 238, 74522, 0, 0, 19905, 120577, 983469, 0, - 41044, 67640, 67302, 64814, 9912, 65939, 983465, 0, 0, 0, 0, 0, 0, 309, - 6622, 0, 10858, 0, 67636, 0, 72749, 0, 0, 0, 67637, 123138, 9712, 68680, - 43970, 0, 65165, 93047, 0, 0, 0, 0, 0, 0, 6191, 12944, 0, 0, 67634, - 43763, 0, 0, 67635, 9370, 41381, 0, 0, 123148, 118817, 0, 3222, 121439, - 0, 0, 66663, 0, 0, 0, 0, 0, 65732, 121144, 0, 0, 0, 0, 67309, 72192, - 41383, 64568, 0, 0, 0, 0, 983990, 66725, 0, 0, 0, 0, 0, 67306, 3632, - 128246, 0, 8376, 3648, 0, 74844, 67639, 3636, 0, 3650, 8837, 0, 0, 0, - 43250, 41562, 0, 0, 68839, 3640, 127190, 0, 11781, 0, 0, 0, 0, 0, 0, - 126649, 0, 42080, 2529, 0, 78004, 0, 42083, 0, 0, 120531, 67619, 0, 0, - 9634, 0, 0, 0, 0, 0, 0, 0, 68841, 0, 92545, 68874, 0, 0, 0, 41987, - 119667, 67623, 983760, 0, 925, 127156, 0, 41985, 64441, 9586, 120988, - 41984, 9217, 128372, 0, 0, 9186, 67620, 4016, 983815, 0, 381, 0, 0, - 42077, 0, 128777, 67622, 42078, 0, 10810, 0, 4585, 19943, 5860, 67633, 0, - 0, 812, 0, 0, 0, 92518, 0, 0, 0, 0, 67629, 0, 10692, 0, 67630, 0, 924, 0, - 67631, 42616, 0, 0, 0, 67317, 67632, 0, 12771, 12736, 12753, 0, 983734, - 67626, 67722, 0, 0, 0, 0, 12751, 74906, 8542, 0, 0, 3626, 66706, 0, 0, - 3883, 64388, 0, 0, 0, 0, 0, 0, 126268, 67624, 0, 10932, 0, 65585, 64338, - 806, 0, 41884, 110845, 1318, 128828, 0, 0, 0, 983789, 3465, 2405, 983390, - 0, 12756, 65259, 69381, 983793, 12752, 5833, 1432, 110843, 41883, 110841, - 9799, 0, 41886, 0, 0, 2062, 0, 0, 0, 0, 129376, 0, 124969, 0, 0, 120971, - 0, 118832, 0, 0, 0, 68005, 10622, 0, 0, 0, 6566, 71195, 0, 73780, 0, - 68865, 0, 0, 0, 8284, 0, 0, 0, 0, 0, 43023, 0, 983285, 6642, 3977, 72743, - 64729, 836, 983381, 92947, 0, 0, 0, 0, 0, 0, 125239, 917923, 0, 0, 0, 0, - 0, 0, 1374, 65149, 119014, 67720, 0, 2273, 0, 0, 0, 11234, 0, 0, 9630, - 12597, 0, 0, 0, 6661, 0, 113751, 0, 125015, 0, 0, 72151, 0, 73674, 7718, - 113755, 0, 0, 0, 0, 983758, 0, 0, 0, 127841, 6365, 1887, 0, 0, 8080, - 113681, 0, 0, 0, 0, 1544, 0, 0, 64677, 0, 0, 0, 0, 119019, 0, 0, 12812, - 7342, 0, 73784, 0, 7904, 0, 0, 120910, 0, 0, 0, 0, 9724, 0, 983785, 9524, - 0, 0, 0, 0, 0, 129344, 0, 471, 0, 0, 128302, 0, 0, 0, 983750, 0, 0, 6918, - 0, 0, 5156, 0, 128683, 10232, 10615, 10213, 0, 0, 42528, 0, 0, 0, 0, - 65311, 74935, 0, 13306, 10533, 7870, 0, 7625, 0, 120544, 0, 0, 128816, - 126098, 0, 0, 0, 0, 0, 92341, 0, 12978, 128533, 0, 0, 43836, 42675, 0, - 12845, 0, 19942, 0, 0, 0, 0, 0, 120000, 120008, 120001, 0, 194894, 0, 0, - 0, 0, 7186, 73107, 0, 70093, 445, 0, 0, 0, 0, 73047, 0, 0, 128442, 0, 0, - 0, 3902, 68913, 0, 0, 0, 1560, 43958, 0, 4584, 0, 67862, 0, 10866, 92905, - 1118, 92209, 74888, 0, 1081, 7436, 11147, 7252, 0, 121188, 0, 0, 0, - 41386, 5162, 0, 1330, 0, 121270, 0, 12047, 7675, 0, 0, 1848, 74528, - 983147, 64708, 0, 0, 194880, 0, 0, 0, 983753, 12715, 128349, 0, 0, 0, - 66672, 73710, 66685, 0, 0, 92464, 0, 68884, 0, 72835, 0, 70800, 70101, - 120725, 0, 194893, 9214, 43494, 0, 0, 120841, 0, 0, 6313, 65513, 0, 0, 0, - 0, 2345, 72975, 0, 0, 0, 0, 3117, 0, 71882, 0, 73100, 0, 0, 0, 0, 78415, - 983232, 100907, 0, 13248, 0, 120241, 129416, 128415, 0, 121009, 12382, - 71120, 0, 0, 0, 0, 1471, 0, 113747, 0, 12378, 0, 69664, 0, 12374, 121357, - 0, 0, 0, 0, 0, 0, 12376, 0, 0, 0, 12380, 10557, 0, 12520, 11122, 2024, - 127180, 0, 0, 74588, 0, 0, 70120, 3853, 0, 0, 0, 983744, 0, 0, 12090, 0, - 12474, 92579, 9503, 0, 0, 983271, 68318, 0, 110834, 0, 0, 0, 12470, 0, - 74189, 2742, 12476, 66370, 10946, 0, 12472, 0, 0, 0, 0, 8213, 43824, - 7771, 6161, 983275, 68010, 0, 0, 0, 68235, 0, 0, 0, 120985, 0, 0, 0, 0, - 73791, 0, 68871, 0, 0, 0, 0, 0, 73704, 12015, 128561, 8275, 0, 43459, - 120927, 127555, 0, 0, 0, 68881, 71215, 0, 118841, 0, 12516, 4444, 0, - 119017, 120506, 10892, 118828, 0, 6473, 0, 0, 71735, 3591, 0, 0, 0, 0, - 72345, 0, 0, 0, 127547, 0, 0, 0, 0, 128253, 0, 0, 0, 0, 94060, 687, 0, 0, - 983399, 0, 0, 68671, 0, 128526, 285, 0, 0, 0, 4459, 0, 0, 74917, 0, 0, - 126255, 0, 119248, 0, 9743, 0, 0, 126535, 0, 0, 73104, 0, 69659, 0, 0, - 3081, 74577, 42921, 0, 0, 0, 0, 0, 0, 0, 9125, 119023, 0, 120820, 0, - 65221, 0, 0, 64852, 0, 0, 0, 0, 66578, 5001, 41879, 0, 0, 5003, 884, 0, - 0, 4943, 5150, 73889, 74182, 0, 41876, 0, 0, 42448, 42299, 72804, 0, 0, - 0, 0, 8491, 0, 0, 983635, 4530, 42409, 7126, 119526, 66200, 0, 0, 19929, - 0, 0, 0, 4242, 0, 0, 0, 0, 66034, 65941, 124929, 64522, 10740, 8958, - 128257, 9754, 119102, 983246, 74222, 983244, 983243, 119064, 983241, - 983240, 0, 0, 0, 74518, 66026, 4306, 41468, 68432, 0, 0, 66667, 0, 0, - 983494, 42200, 0, 0, 0, 120236, 6948, 0, 8524, 0, 0, 12385, 0, 74926, 0, - 1386, 73996, 0, 0, 0, 121184, 12392, 0, 8064, 0, 0, 78216, 119004, 2080, - 710, 128491, 12390, 1666, 42091, 0, 12383, 92968, 42092, 68418, 0, - 128106, 0, 0, 42096, 0, 3362, 12377, 127878, 0, 0, 0, 0, 1244, 4401, - 73786, 12683, 10662, 0, 8112, 0, 119021, 121017, 12379, 73108, 120534, 0, - 42208, 0, 12381, 0, 0, 0, 4327, 0, 0, 128350, 0, 78232, 0, 584, 12933, 0, - 12373, 73105, 13000, 0, 2935, 129113, 12665, 0, 43081, 73098, 120505, - 12427, 0, 983625, 78227, 0, 0, 0, 0, 0, 74551, 0, 0, 12426, 0, 0, 0, - 12428, 0, 0, 0, 0, 0, 12429, 6727, 0, 0, 0, 3387, 0, 0, 0, 0, 0, 0, - 74427, 0, 3536, 120589, 9752, 92397, 6162, 0, 0, 10113, 0, 0, 0, 12422, - 0, 439, 3072, 0, 42207, 74549, 120830, 0, 0, 0, 0, 8308, 0, 70807, 0, 0, - 0, 13218, 0, 0, 8082, 12424, 0, 6819, 3539, 93838, 0, 0, 74539, 0, 68181, - 0, 72964, 0, 72969, 12420, 11371, 0, 4600, 0, 127810, 0, 0, 0, 72962, - 128552, 6704, 4591, 72966, 0, 0, 0, 72960, 120623, 561, 12159, 78223, 0, - 78224, 0, 71068, 11932, 7172, 42687, 8368, 0, 0, 93068, 0, 0, 75010, 0, - 0, 0, 0, 42463, 0, 2924, 67183, 0, 0, 0, 128958, 0, 0, 42330, 73079, - 3969, 0, 0, 7169, 1992, 9652, 0, 0, 42086, 0, 100865, 0, 0, 0, 0, 0, 327, - 0, 0, 0, 0, 0, 12433, 0, 0, 0, 12431, 0, 12434, 983434, 0, 0, 0, 7712, + 0, 0, 0, 127940, 0, 0, 0, 65448, 0, 0, 121084, 129688, 43949, 0, 78099, + 0, 983380, 0, 0, 0, 5741, 1131, 0, 0, 74862, 0, 43952, 42533, 119598, + 78107, 0, 0, 43950, 121297, 118990, 7691, 43951, 578, 0, 0, 0, 42514, + 74547, 74196, 120608, 74561, 0, 983957, 0, 0, 0, 0, 0, 0, 0, 0, 7241, 0, + 93846, 119167, 0, 12811, 78082, 3946, 0, 10998, 66807, 673, 0, 0, 0, 0, + 119301, 0, 68890, 0, 0, 78085, 10267, 0, 74560, 78083, 0, 8729, 0, 0, 0, + 0, 0, 0, 0, 119296, 0, 0, 0, 120853, 983458, 731, 0, 71904, 128316, 0, 0, + 0, 1175, 0, 68167, 0, 0, 10793, 0, 67644, 7723, 983453, 0, 0, 0, 0, 5273, + 0, 5269, 0, 69607, 2404, 5267, 124967, 0, 0, 5277, 0, 0, 6189, 65469, + 1314, 0, 0, 118873, 8785, 0, 0, 127527, 68414, 43535, 9204, 0, 3879, 0, + 71696, 6197, 9497, 0, 7567, 64484, 78128, 41390, 41379, 41882, 67647, + 67279, 70085, 0, 121413, 41388, 64446, 41392, 64288, 41387, 0, 8706, + 10675, 0, 700, 0, 5775, 0, 7088, 74756, 7499, 0, 78120, 78111, 67251, + 126557, 0, 0, 128945, 10311, 78115, 6665, 11115, 0, 7618, 10821, 11455, + 0, 64632, 64447, 0, 0, 78093, 78091, 0, 0, 65033, 0, 6668, 0, 0, 0, 656, + 69686, 65037, 0, 0, 0, 0, 0, 0, 0, 73014, 0, 0, 917774, 9702, 0, 92273, + 66580, 118895, 66683, 43640, 3417, 0, 6832, 0, 917768, 0, 917767, 0, + 4935, 11906, 0, 0, 67296, 92896, 3651, 0, 67294, 70848, 0, 67292, 0, + 12983, 0, 55272, 0, 0, 1439, 0, 74897, 0, 0, 0, 78373, 0, 42087, 3063, 0, + 0, 7838, 0, 129282, 0, 0, 67968, 0, 128582, 9078, 92446, 0, 0, 0, 0, 0, + 0, 119586, 0, 7750, 128422, 68237, 6190, 0, 0, 0, 72340, 9857, 7014, + 9856, 0, 92620, 120547, 0, 8481, 0, 6202, 0, 10920, 67970, 0, 0, 983292, + 0, 7843, 65818, 66824, 0, 0, 0, 0, 0, 0, 0, 6657, 207, 0, 69728, 74819, + 0, 0, 0, 0, 0, 0, 0, 0, 41368, 43974, 488, 0, 0, 71339, 10157, 0, 43034, + 11982, 0, 0, 0, 0, 0, 41372, 6669, 8504, 72103, 0, 41367, 129328, 119272, + 0, 11726, 8261, 129793, 304, 129799, 129795, 129822, 129807, 113683, + 983235, 238, 74522, 0, 0, 19905, 120577, 983469, 129200, 41044, 67640, + 67302, 64814, 9912, 65939, 983465, 0, 0, 0, 0, 0, 0, 309, 6622, 0, 10858, + 0, 67636, 0, 72749, 0, 0, 0, 67637, 123138, 9712, 68680, 43970, 0, 65165, + 93047, 0, 0, 0, 0, 0, 0, 6191, 12944, 0, 0, 67634, 43763, 0, 0, 67635, + 9370, 41381, 0, 0, 123148, 118817, 0, 3222, 121439, 0, 0, 66663, 0, 0, 0, + 0, 0, 65732, 121144, 0, 0, 0, 0, 67309, 72192, 41383, 64568, 0, 0, 0, 0, + 983990, 66725, 0, 0, 0, 0, 0, 67306, 3632, 128246, 0, 8376, 3648, 0, + 74844, 67639, 3636, 0, 3650, 8837, 0, 0, 0, 43250, 41562, 0, 0, 68839, + 3640, 127190, 0, 11781, 0, 0, 0, 0, 0, 0, 126649, 0, 42080, 2529, 0, + 78004, 0, 42083, 0, 0, 120531, 67619, 0, 0, 9634, 0, 0, 0, 0, 0, 0, 0, + 68841, 0, 92545, 68874, 127399, 0, 0, 41987, 119667, 67623, 983760, 0, + 925, 127156, 0, 41985, 64441, 9586, 120988, 41984, 9217, 128372, 0, 0, + 9186, 67620, 4016, 983815, 0, 381, 983681, 0, 42077, 0, 128777, 67622, + 42078, 0, 10810, 0, 4585, 19943, 5860, 67633, 0, 0, 812, 0, 0, 0, 92518, + 0, 0, 0, 0, 67629, 0, 10692, 0, 67630, 0, 924, 0, 67631, 42616, 0, 0, 0, + 67317, 67632, 0, 12771, 12736, 12753, 0, 983734, 67626, 67722, 0, 0, 0, + 0, 12751, 74906, 8542, 0, 0, 3626, 66706, 0, 0, 3883, 64388, 0, 0, 0, 0, + 0, 0, 126268, 67624, 0, 10932, 0, 65585, 64338, 806, 0, 41884, 110845, + 1318, 128828, 0, 0, 0, 983789, 3465, 2405, 983390, 0, 12756, 65259, + 69381, 983793, 12752, 5833, 1432, 110843, 41883, 110841, 9799, 0, 41886, + 0, 0, 2062, 0, 0, 0, 0, 129376, 0, 124969, 983387, 0, 120971, 0, 118832, + 0, 983281, 0, 68005, 10622, 0, 0, 0, 6566, 71195, 0, 73780, 0, 68865, 0, + 0, 0, 8284, 0, 0, 0, 0, 0, 43023, 0, 983285, 6642, 3977, 72743, 64729, + 836, 983381, 92947, 0, 0, 0, 0, 0, 0, 125239, 917923, 0, 0, 0, 0, 0, 0, + 1374, 65149, 119014, 67720, 0, 2273, 0, 0, 0, 11234, 0, 0, 9630, 12597, + 0, 0, 0, 6661, 0, 113751, 120551, 125015, 0, 0, 72151, 0, 73674, 7718, + 113755, 0, 69570, 0, 0, 983758, 0, 0, 0, 127841, 6365, 1887, 983409, 0, + 8080, 113681, 0, 0, 0, 129855, 1544, 0, 0, 64677, 0, 0, 0, 0, 119019, 0, + 0, 12812, 7342, 0, 73784, 0, 7904, 0, 0, 120910, 0, 0, 0, 0, 9724, 0, + 983785, 9524, 0, 0, 0, 0, 0, 129344, 0, 471, 0, 0, 128302, 0, 0, 0, + 983750, 0, 0, 6918, 0, 0, 5156, 0, 128683, 10232, 10615, 10213, 0, 0, + 42528, 0, 0, 0, 0, 65311, 74935, 0, 13306, 10533, 7870, 0, 7625, 0, + 120544, 0, 0, 128816, 126098, 0, 0, 0, 0, 0, 92341, 0, 12978, 128533, 0, + 0, 43836, 42675, 0, 12845, 0, 19942, 0, 0, 0, 0, 0, 120000, 120008, + 120001, 0, 194894, 0, 0, 0, 0, 7186, 73107, 0, 70093, 445, 119028, 0, 0, + 0, 73047, 0, 0, 128442, 0, 0, 0, 3902, 68913, 129916, 0, 0, 1560, 43958, + 0, 4584, 0, 67862, 0, 10866, 92905, 1118, 92209, 74888, 0, 1081, 7436, + 11147, 7252, 0, 121188, 0, 0, 0, 41386, 5162, 129823, 1330, 0, 121270, 0, + 12047, 7675, 0, 0, 1848, 74528, 983147, 64708, 0, 0, 194880, 0, 0, 0, + 983753, 12715, 128349, 0, 0, 0, 66672, 73710, 66685, 0, 0, 92464, 0, + 68884, 0, 72835, 0, 70800, 70101, 120725, 0, 194893, 9214, 43494, 0, 0, + 120841, 0, 0, 6313, 65513, 0, 0, 0, 0, 2345, 72975, 0, 0, 129937, 0, + 3117, 0, 71882, 0, 73100, 0, 0, 0, 0, 78415, 983232, 100907, 0, 13248, 0, + 120241, 129416, 128415, 0, 94193, 12382, 71120, 0, 0, 0, 0, 1471, 0, + 113747, 0, 12378, 0, 69664, 0, 12374, 121357, 0, 0, 0, 0, 0, 0, 12376, 0, + 0, 0, 12380, 10557, 0, 12520, 11122, 2024, 127180, 0, 0, 74588, 0, 0, + 70120, 3853, 0, 0, 0, 983744, 0, 0, 12090, 0, 12474, 92579, 9503, 0, 0, + 983271, 68318, 0, 110834, 0, 0, 0, 12470, 0, 74189, 2742, 12476, 66370, + 10946, 0, 12472, 0, 0, 0, 0, 8213, 43824, 7771, 6161, 983275, 68010, 0, + 0, 0, 68235, 0, 0, 0, 120985, 0, 0, 0, 129814, 73791, 129830, 68871, 0, + 0, 0, 0, 0, 73704, 12015, 128561, 8275, 0, 43459, 120927, 127555, 0, 0, + 0, 68881, 71215, 0, 118841, 0, 12516, 4444, 0, 119017, 120506, 10892, + 118828, 0, 6473, 0, 0, 71735, 3591, 0, 0, 0, 0, 72345, 0, 0, 0, 127547, + 0, 0, 0, 0, 128253, 0, 0, 0, 0, 94060, 687, 0, 0, 983399, 0, 0, 43882, 0, + 128526, 285, 0, 0, 0, 4459, 0, 0, 74917, 0, 0, 126255, 0, 119248, 0, + 9743, 0, 0, 126535, 0, 0, 73104, 0, 69659, 0, 0, 3081, 74577, 42921, 0, + 0, 0, 0, 0, 0, 0, 9125, 119023, 0, 120820, 0, 65221, 0, 0, 64852, 0, 0, + 0, 0, 66578, 5001, 41879, 0, 0, 5003, 884, 0, 0, 4943, 5150, 73889, + 74182, 0, 41876, 0, 0, 42448, 42299, 72804, 0, 0, 0, 0, 8491, 0, 0, + 983635, 4530, 42409, 7126, 119526, 66200, 0, 0, 19929, 0, 0, 0, 4242, 0, + 0, 0, 0, 66034, 65941, 124929, 64522, 10740, 8958, 128257, 9754, 119102, + 983246, 74222, 983244, 983243, 119064, 983241, 983240, 0, 0, 0, 74518, + 66026, 4306, 41468, 68432, 0, 0, 66667, 0, 0, 983494, 42200, 0, 0, 0, + 120236, 6948, 0, 8524, 0, 0, 12385, 0, 74926, 0, 1386, 73996, 0, 0, 0, + 121184, 12392, 0, 8064, 0, 0, 78216, 119004, 2080, 710, 128491, 12390, + 1666, 42091, 0, 12383, 92968, 42092, 68418, 0, 128106, 0, 0, 42096, 0, + 3362, 12377, 127878, 0, 0, 0, 0, 1244, 4401, 73786, 12683, 10662, 0, + 8112, 129837, 119021, 121017, 12379, 73108, 120534, 0, 42208, 0, 12381, + 0, 0, 0, 4327, 0, 0, 128350, 0, 78232, 0, 584, 12933, 0, 12373, 73105, + 13000, 0, 2935, 129113, 12665, 0, 43081, 73098, 120505, 12427, 0, 983625, + 78227, 0, 0, 0, 0, 128760, 74551, 0, 0, 12426, 0, 0, 0, 12428, 0, 0, 0, + 0, 0, 12429, 6727, 0, 0, 0, 3387, 0, 0, 0, 0, 0, 0, 74427, 0, 3536, + 120589, 9752, 92397, 6162, 0, 0, 10113, 0, 0, 0, 12422, 0, 439, 3072, 0, + 42207, 74549, 120830, 0, 0, 0, 0, 8308, 0, 70807, 0, 0, 0, 13218, 0, 0, + 8082, 12424, 0, 6819, 3539, 93838, 0, 0, 74539, 0, 68181, 0, 72964, 0, + 72969, 12420, 11371, 0, 4600, 0, 127810, 0, 0, 0, 72962, 128552, 6704, + 4591, 72966, 0, 0, 0, 72960, 120623, 561, 12159, 78223, 0, 78224, 0, + 71068, 11932, 7172, 42687, 8368, 0, 0, 93068, 0, 0, 75010, 0, 0, 0, 0, + 42463, 0, 2924, 67183, 0, 129947, 0, 128958, 0, 0, 42330, 73079, 3969, 0, + 129973, 7169, 1992, 9652, 0, 0, 42086, 0, 100865, 0, 0, 0, 0, 0, 327, 0, + 0, 0, 0, 0, 12433, 0, 0, 0, 12431, 0, 12434, 983434, 0, 0, 0, 7712, 12432, 0, 69377, 129147, 100867, 0, 8212, 0, 128014, 0, 119066, 7333, 0, 0, 0, 67407, 70006, 128461, 0, 12436, 0, 43160, 0, 74896, 92757, 71360, 42350, 0, 0, 0, 100566, 0, 11348, 0, 0, 9194, 983184, 0, 55250, 0, 100569, 0, 0, 0, 0, 0, 64746, 66012, 100565, 3444, 75029, 64651, 0, 41503, 0, 0, 0, 0, 0, 0, 0, 120876, 0, 0, 129408, 65309, 12416, 0, 0, 0, - 0, 93024, 12418, 74111, 121046, 0, 0, 0, 0, 0, 4596, 66339, 12417, 66001, - 0, 126491, 12414, 8287, 0, 0, 0, 1143, 0, 0, 12415, 0, 0, 983242, 0, - 9021, 120783, 0, 11724, 0, 0, 0, 194794, 0, 0, 8027, 194796, 74257, + 0, 93024, 12418, 74111, 121046, 0, 0, 0, 119361, 0, 4596, 66339, 12417, + 66001, 0, 126491, 12414, 8287, 0, 0, 0, 1143, 0, 0, 12415, 0, 0, 983242, + 0, 9021, 120783, 0, 11724, 0, 0, 0, 194794, 0, 0, 8027, 194796, 74257, 127375, 11400, 74197, 194799, 66833, 194798, 0, 0, 983247, 0, 0, 1324, 0, 0, 0, 194878, 7715, 0, 0, 194777, 194780, 0, 0, 0, 194787, 0, 0, 0, 0, 0, 66289, 127109, 3889, 129561, 194800, 0, 0, 0, 0, 121226, 12999, 0, 120902, 0, 0, 0, 0, 0, 64802, 42210, 4597, 0, 0, 0, 12371, 67164, 0, 67163, 10805, 0, 0, 0, 0, 0, 12367, 0, 0, 92557, 12363, 0, 0, 128611, 0, - 0, 0, 8005, 12365, 0, 0, 3756, 12369, 10649, 0, 0, 0, 0, 0, 42923, 0, 0, - 0, 0, 0, 0, 66659, 0, 0, 0, 0, 5268, 4954, 0, 0, 5266, 126980, 5272, + 0, 0, 8005, 12365, 0, 0, 3756, 12369, 10649, 0, 70095, 0, 0, 0, 42923, 0, + 0, 0, 0, 0, 0, 66659, 0, 0, 0, 0, 5268, 4954, 0, 0, 5266, 126980, 5272, 92294, 0, 42230, 983961, 0, 9128, 0, 0, 0, 0, 6928, 9803, 42282, 9110, 1505, 0, 0, 5276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8722, 120805, 0, 0, 66695, 0, 0, 4383, 8900, 0, 0, 74930, 64297, 0, 0, 0, 0, 3419, 42229, 0, 0, 8911, 0, 42353, 0, 0, 0, 0, 0, 0, 0, 100629, 41576, 42215, 122888, 0, 0, 8578, 68178, 7573, 41575, 74789, 92310, 0, 73863, 0, 2670, 0, 0, 11723, - 0, 0, 0, 0, 0, 43414, 0, 0, 65675, 0, 67179, 67168, 12413, 0, 67177, 0, - 0, 0, 0, 12302, 0, 5250, 12407, 12245, 4404, 9189, 12401, 42007, 0, + 0, 0, 0, 0, 0, 43414, 0, 0, 65675, 0, 67179, 67168, 12413, 129746, 67177, + 0, 0, 0, 0, 12302, 0, 5250, 12407, 12245, 4404, 9189, 12401, 42007, 0, 42005, 65806, 43997, 122922, 42002, 12404, 0, 74928, 4940, 12410, 0, 128761, 0, 64567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11956, 0, 0, 122882, 0, - 6631, 128923, 0, 74583, 42218, 0, 0, 0, 0, 0, 0, 71058, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 43370, 0, 5016, 121052, 0, 0, 9491, 0, 0, 0, 0, 64922, 0, 0, 0, - 0, 92198, 0, 0, 0, 74619, 0, 0, 70422, 983669, 10565, 0, 12177, 0, 0, 0, - 0, 0, 12395, 127874, 12878, 92630, 12396, 0, 0, 92537, 0, 43113, 0, 0, 0, - 9781, 0, 4927, 0, 0, 0, 0, 12397, 129089, 128910, 0, 12394, 0, 0, 0, 0, - 0, 72789, 10781, 1546, 0, 5010, 0, 10507, 127891, 128291, 0, 0, 0, 0, - 7267, 0, 0, 0, 0, 2819, 0, 0, 71063, 0, 7266, 128553, 7264, 7265, 0, - 1363, 0, 119581, 65080, 0, 0, 0, 0, 43336, 0, 0, 126263, 73776, 0, 43339, - 0, 9836, 0, 0, 0, 43335, 41276, 0, 73795, 43337, 817, 11211, 9922, - 128841, 41274, 11340, 42408, 42447, 74932, 0, 0, 12386, 0, 0, 0, 12389, - 128398, 0, 41996, 41686, 0, 8269, 1147, 43849, 120896, 1987, 128540, - 43195, 42001, 41990, 41999, 12391, 0, 0, 4939, 12384, 0, 0, 43243, 0, 0, - 0, 0, 0, 0, 0, 0, 8247, 0, 0, 7545, 0, 43643, 121445, 0, 10036, 0, - 119813, 10178, 119816, 0, 119815, 11762, 119818, 0, 92282, 120597, 0, 0, - 119819, 0, 0, 7719, 0, 2486, 0, 119808, 1507, 0, 129185, 70301, 9687, - 119826, 0, 119811, 66196, 0, 5262, 0, 74642, 12681, 0, 0, 12406, 12219, - 0, 127528, 42810, 110991, 0, 983673, 128144, 121027, 126096, 120753, - 12403, 2500, 0, 0, 12409, 0, 0, 0, 74113, 2343, 12412, 19946, 74112, - 125042, 13112, 0, 120603, 67866, 110634, 0, 66369, 5861, 110632, 11999, - 12400, 0, 0, 12645, 0, 11320, 68410, 6748, 65040, 0, 64184, 12974, 66927, - 67613, 120645, 0, 0, 0, 0, 0, 1928, 0, 67649, 0, 0, 67609, 11235, 0, 0, - 67610, 8241, 0, 0, 4206, 0, 0, 0, 128298, 110980, 0, 67238, 0, 0, 0, - 1422, 8357, 0, 7187, 0, 120641, 0, 0, 0, 0, 125022, 111064, 92539, 10120, - 12405, 0, 72997, 0, 13278, 0, 6366, 0, 7945, 0, 4402, 0, 12402, 129372, - 0, 74754, 12408, 0, 44007, 0, 0, 0, 12411, 0, 120824, 128306, 121092, 0, - 1575, 0, 0, 0, 73003, 119622, 0, 0, 12399, 0, 6833, 0, 0, 0, 71878, 9692, - 0, 0, 100615, 6750, 66855, 0, 0, 0, 0, 43527, 0, 727, 0, 0, 0, 0, 6726, - 0, 0, 12370, 44023, 0, 126592, 2280, 0, 12372, 120642, 0, 0, 0, 0, 12366, - 10963, 6066, 1329, 0, 3052, 72987, 0, 66029, 0, 10803, 0, 0, 0, 92473, 0, - 0, 0, 0, 1499, 0, 0, 42740, 0, 0, 0, 0, 12056, 126484, 0, 3660, 69404, - 42192, 74253, 0, 42223, 67617, 125254, 0, 0, 0, 0, 9941, 0, 0, 1933, 0, - 0, 0, 0, 73866, 0, 0, 2487, 67614, 7361, 1804, 0, 67615, 0, 0, 12220, - 67616, 0, 0, 0, 68200, 6675, 0, 0, 67592, 126582, 0, 64771, 0, 9132, 0, - 111004, 510, 0, 0, 0, 4561, 7711, 92769, 92944, 111007, 0, 41569, 121282, - 0, 8167, 66885, 0, 0, 0, 69992, 66403, 6967, 0, 0, 0, 0, 333, 0, 0, - 10566, 66409, 0, 121373, 0, 72965, 110999, 66388, 6678, 0, 0, 12621, 0, - 128775, 10227, 4764, 0, 9981, 0, 70278, 11589, 0, 0, 42202, 12754, 0, 0, - 0, 0, 67594, 2048, 0, 4050, 67595, 0, 0, 43221, 11184, 72709, 0, 0, - 64175, 0, 72746, 0, 0, 0, 65461, 9798, 0, 71210, 0, 69841, 0, 952, - 128235, 125107, 0, 70296, 6449, 72102, 0, 0, 43098, 64171, 8142, 64160, - 0, 0, 0, 0, 0, 0, 0, 0, 67597, 6676, 3930, 42615, 73124, 69991, 67598, 0, - 0, 0, 65591, 41581, 128056, 1453, 0, 0, 0, 8500, 42222, 0, 119270, 72992, - 69996, 0, 0, 64676, 0, 0, 67606, 66385, 0, 42217, 13102, 0, 67607, 6672, - 0, 0, 0, 0, 67608, 0, 9001, 0, 11274, 67601, 0, 64210, 6664, 0, 42056, - 67602, 0, 0, 0, 0, 1469, 67603, 65381, 69921, 4988, 42372, 0, 9598, 904, - 352, 42225, 0, 8061, 10673, 0, 0, 128276, 67600, 0, 0, 127293, 8575, - 127295, 127296, 127289, 127290, 127291, 127292, 127285, 127286, 127287, - 118877, 127281, 127282, 9460, 823, 11587, 0, 0, 0, 127305, 12387, 0, 0, - 127301, 126979, 42783, 69998, 64208, 127298, 127299, 66031, 0, 11606, - 64784, 0, 69973, 0, 0, 0, 5152, 11048, 0, 120121, 67605, 0, 69604, 0, - 70276, 194847, 0, 127052, 42587, 42214, 41394, 0, 4763, 0, 118935, 0, - 5260, 0, 94038, 326, 120131, 74119, 0, 10771, 42198, 194920, 194837, - 194925, 41398, 127079, 41393, 127077, 127076, 453, 41396, 0, 13159, - 11227, 9572, 0, 0, 194576, 128835, 127081, 0, 126617, 43144, 0, 72972, - 194887, 0, 0, 0, 0, 0, 64061, 0, 0, 64056, 70310, 0, 0, 0, 194864, 0, - 111084, 64301, 72998, 10464, 0, 128393, 72847, 0, 11528, 64024, 128072, - 679, 0, 0, 5850, 758, 7536, 0, 0, 43712, 0, 64006, 983579, 64005, 70298, - 0, 126487, 0, 0, 0, 0, 0, 72999, 0, 64027, 64029, 0, 0, 64000, 0, 194874, - 0, 42201, 12421, 194876, 0, 1852, 0, 0, 73744, 0, 64041, 129127, 0, 0, 0, - 92322, 12423, 12854, 0, 3496, 0, 110966, 0, 194823, 0, 0, 6158, 8327, - 74553, 0, 12419, 0, 11570, 0, 0, 123618, 0, 7844, 983801, 194909, 0, - 1682, 93039, 194911, 42756, 6765, 128178, 0, 0, 0, 11412, 6768, 0, - 194830, 71316, 0, 0, 0, 11577, 0, 194829, 1833, 11576, 74334, 0, 0, - 42854, 69438, 0, 70307, 0, 194856, 8085, 0, 194850, 0, 72996, 128778, - 1949, 11614, 7847, 120489, 120997, 64483, 0, 0, 0, 0, 0, 0, 0, 126651, - 42864, 0, 64667, 74624, 0, 0, 43261, 11484, 127535, 67840, 0, 0, 128965, - 0, 72974, 0, 110928, 128454, 3455, 0, 0, 9879, 0, 0, 4158, 128050, 0, 0, - 110929, 0, 0, 0, 332, 118808, 0, 0, 2407, 0, 42199, 92386, 110865, 0, - 77921, 55217, 123161, 125199, 70043, 0, 0, 0, 121093, 1834, 0, 0, 71315, - 0, 65249, 0, 8662, 0, 0, 123153, 0, 11539, 10784, 0, 67674, 0, 92233, 0, - 0, 118858, 0, 0, 0, 0, 0, 0, 12499, 6280, 0, 0, 0, 0, 0, 0, 43851, 6279, - 12508, 0, 12502, 9161, 0, 1620, 0, 3601, 0, 0, 67246, 609, 11555, 0, - 12496, 0, 74181, 120492, 12505, 0, 194902, 0, 43567, 239, 0, 127085, 0, - 0, 42671, 0, 0, 83095, 43565, 127082, 983936, 12696, 127753, 0, 94062, - 12929, 0, 712, 0, 4197, 0, 42818, 0, 70306, 0, 0, 983805, 0, 43562, 0, - 129034, 68076, 0, 111074, 64628, 0, 0, 0, 0, 7494, 0, 4924, 0, 0, 0, 0, - 127088, 0, 127087, 69987, 64796, 0, 0, 12033, 0, 0, 0, 0, 0, 0, 0, 70299, - 0, 0, 68324, 72420, 0, 0, 0, 0, 70309, 127000, 0, 0, 0, 72418, 72963, 0, - 5699, 0, 983879, 9488, 74410, 119112, 70477, 11170, 0, 0, 72312, 0, 5265, - 0, 0, 0, 0, 12464, 0, 43264, 72977, 0, 43345, 0, 0, 120592, 6807, 0, - 9829, 69997, 0, 0, 43346, 11393, 795, 0, 72412, 12462, 72416, 72415, 0, - 0, 64362, 0, 0, 120811, 0, 12468, 8607, 1008, 0, 120670, 0, 0, 67855, - 125018, 127177, 6758, 0, 0, 1820, 41112, 0, 11202, 195083, 0, 13223, 0, - 64595, 0, 0, 0, 0, 12616, 0, 0, 0, 74467, 0, 0, 0, 0, 0, 0, 67233, - 119060, 0, 83448, 19920, 69897, 0, 129057, 0, 1130, 0, 0, 0, 11823, 0, 0, - 118896, 0, 0, 13280, 0, 10747, 118925, 0, 43509, 0, 0, 8959, 0, 6747, 0, - 0, 8568, 0, 120870, 0, 120803, 83060, 42670, 0, 11621, 12460, 0, 0, 0, 0, - 111190, 0, 66570, 72989, 121305, 126476, 120582, 0, 0, 0, 111191, 70308, - 11594, 0, 68333, 69427, 10491, 0, 0, 0, 0, 0, 127506, 0, 194910, 4923, - 65086, 8981, 0, 42133, 0, 72244, 0, 70294, 0, 0, 12485, 0, 8642, 0, - 42766, 0, 2210, 11109, 0, 0, 0, 0, 0, 7398, 0, 0, 0, 8041, 1461, 0, - 119133, 0, 6749, 0, 0, 0, 71705, 0, 0, 68071, 0, 67668, 0, 0, 9193, 0, 0, - 0, 0, 73810, 0, 0, 64305, 0, 0, 623, 781, 670, 10660, 5769, 613, 7543, 0, - 477, 92633, 92521, 0, 592, 0, 12459, 0, 0, 0, 12465, 119578, 654, 11345, - 653, 652, 111250, 647, 0, 633, 120744, 0, 111262, 12480, 74354, 0, 39, - 12487, 0, 0, 74803, 12482, 0, 12489, 0, 128962, 5550, 129175, 0, 0, 0, 0, - 1813, 0, 41311, 111205, 0, 11229, 0, 70496, 1675, 69840, 129435, 0, - 119078, 10070, 10595, 111207, 119077, 111206, 121162, 0, 0, 0, 11222, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 71716, 917841, 0, 0, 270, 0, 0, 0, 0, 0, - 120899, 0, 69741, 0, 0, 68251, 0, 71721, 364, 9595, 0, 0, 0, 707, 0, 0, - 9282, 0, 224, 0, 68670, 9332, 65581, 68677, 0, 68644, 0, 11764, 68634, 0, - 10732, 68640, 850, 0, 0, 71123, 0, 68619, 44008, 68627, 0, 0, 0, 0, 0, 0, - 0, 0, 12507, 0, 0, 128311, 0, 120529, 4375, 0, 0, 0, 12198, 0, 67339, 0, - 0, 72994, 74293, 128434, 0, 0, 64546, 0, 71208, 0, 0, 0, 42334, 42502, 0, - 120887, 72961, 0, 0, 5767, 0, 0, 71710, 8353, 0, 0, 0, 121233, 0, 0, 0, - 0, 119920, 0, 0, 121186, 0, 0, 0, 72719, 64604, 0, 6096, 0, 10063, 0, 0, - 119630, 3485, 12987, 0, 127522, 0, 0, 0, 0, 0, 0, 0, 0, 127173, 0, 0, - 68249, 0, 0, 118923, 0, 64574, 128794, 0, 1640, 12495, 66691, 0, 3138, - 12504, 11171, 1922, 0, 12498, 0, 0, 69939, 0, 65543, 0, 0, 0, 66643, 0, - 120734, 0, 4228, 0, 10303, 0, 0, 0, 10335, 3520, 0, 12490, 0, 0, 0, - 12493, 121452, 64636, 1002, 12491, 0, 0, 92615, 2096, 0, 0, 0, 0, 11611, - 66228, 0, 11241, 66224, 66221, 66226, 66229, 66219, 66231, 66216, 0, - 66236, 66211, 66218, 0, 66240, 78041, 66233, 66217, 0, 7909, 66234, - 11605, 0, 0, 66208, 0, 0, 128282, 73875, 0, 12898, 12494, 120939, 12492, - 0, 0, 0, 74153, 0, 127391, 127489, 4882, 13040, 0, 120762, 4885, 194732, - 0, 13042, 4880, 128834, 2429, 0, 8647, 0, 0, 0, 0, 0, 0, 68896, 0, - 119101, 66693, 0, 1870, 78040, 470, 68893, 78035, 78036, 983581, 78034, - 110607, 110608, 0, 12511, 74453, 12514, 0, 128609, 7239, 7001, 11974, - 121214, 0, 0, 7378, 12512, 11615, 13041, 0, 0, 128057, 13038, 0, 0, - 71717, 70195, 120836, 12510, 127070, 13039, 75019, 12513, 0, 12471, - 110761, 0, 121385, 70193, 0, 0, 0, 71714, 0, 12477, 0, 12473, 7666, - 67362, 237, 6281, 0, 0, 0, 0, 1312, 0, 0, 12469, 0, 0, 64335, 12475, 0, - 69382, 0, 11524, 10367, 10431, 74368, 13017, 3388, 129547, 74372, 0, 0, - 128725, 4932, 0, 0, 13015, 0, 0, 65451, 8185, 0, 0, 43024, 129362, 74375, - 10129, 0, 7948, 9236, 0, 0, 0, 92726, 43473, 6289, 10484, 0, 0, 0, 12082, - 12521, 3147, 110643, 110644, 12524, 110642, 2310, 0, 0, 0, 0, 13013, 0, - 8596, 983852, 10804, 70497, 0, 0, 13014, 12444, 0, 71697, 13016, 0, 0, 0, - 0, 12331, 0, 0, 8744, 726, 121090, 983849, 4155, 0, 0, 0, 71690, 12522, - 73128, 0, 0, 127805, 0, 110647, 0, 0, 983853, 12525, 0, 12523, 2152, - 11969, 120596, 403, 0, 11021, 0, 0, 11030, 8610, 92567, 0, 0, 63998, 0, - 0, 0, 0, 0, 0, 0, 12506, 0, 11146, 71477, 12500, 0, 12509, 0, 0, 0, 0, - 6608, 0, 0, 0, 0, 0, 77995, 0, 3608, 0, 0, 1107, 0, 129658, 0, 0, 0, 0, - 983937, 43217, 66571, 13222, 118963, 0, 126514, 10463, 11553, 0, 63995, - 9043, 128634, 71722, 0, 0, 127751, 92974, 12529, 8042, 0, 2344, 12528, 0, - 0, 0, 69719, 120956, 0, 0, 66512, 0, 12530, 0, 0, 68917, 12658, 0, 71683, - 0, 983237, 0, 127526, 469, 0, 4363, 3313, 0, 0, 2023, 0, 72251, 78225, - 65706, 10051, 78219, 78220, 0, 9920, 12215, 0, 4931, 1951, 12497, 119363, - 0, 0, 119336, 0, 0, 0, 0, 0, 1491, 128578, 129169, 0, 0, 0, 0, 78898, - 94086, 41993, 0, 67379, 0, 0, 0, 0, 9738, 41995, 1075, 0, 12535, 41992, - 0, 0, 0, 0, 128117, 0, 9940, 0, 7692, 0, 9727, 41131, 330, 8566, 0, - 41133, 41117, 128482, 12532, 78550, 78546, 43177, 0, 43235, 0, 917542, - 78229, 78231, 13031, 12910, 67710, 78555, 13028, 78553, 12537, 0, 0, - 71692, 12536, 2350, 13029, 78233, 0, 0, 13030, 0, 4527, 71250, 12538, 0, - 0, 0, 0, 0, 0, 0, 12484, 4032, 71459, 194728, 0, 64344, 0, 66700, 66000, - 8412, 0, 43466, 1296, 2325, 0, 121020, 10149, 74118, 0, 0, 12481, 121280, - 12488, 0, 0, 0, 67972, 0, 2354, 42619, 0, 73027, 6295, 901, 0, 0, 0, 0, - 0, 128653, 11927, 66584, 78559, 78560, 78557, 78558, 0, 74649, 0, 126241, - 67220, 194726, 78568, 67226, 78565, 70190, 78563, 78564, 2352, 67219, - 78569, 78570, 11289, 1407, 67973, 0, 13026, 6762, 10399, 70192, 13023, - 78578, 9777, 67208, 1871, 0, 0, 0, 13024, 983835, 0, 9325, 6818, 6283, - 11738, 0, 0, 0, 11741, 0, 0, 9216, 8263, 11279, 0, 983837, 0, 13021, - 71922, 3136, 0, 983840, 0, 13022, 129143, 9956, 0, 0, 0, 42580, 0, 0, 0, - 13020, 10024, 0, 94013, 0, 0, 0, 43001, 8029, 0, 0, 0, 3335, 0, 9209, - 13048, 73126, 0, 0, 0, 3333, 119100, 0, 0, 3342, 78582, 78583, 73056, - 78581, 4156, 0, 0, 0, 78591, 1611, 73058, 13018, 78586, 78588, 78584, - 3337, 4537, 78593, 11736, 0, 0, 0, 4214, 73790, 0, 0, 13046, 0, 425, + 6631, 128923, 0, 74583, 42218, 0, 0, 70094, 0, 0, 0, 71058, 0, 0, 0, + 127341, 0, 0, 0, 0, 0, 43370, 0, 5016, 121052, 0, 0, 9491, 0, 0, 0, 0, + 64922, 0, 0, 0, 0, 92198, 0, 0, 0, 74619, 0, 0, 70422, 983669, 10565, 0, + 12177, 0, 0, 0, 0, 0, 12395, 127874, 12878, 92630, 12396, 0, 0, 92537, 0, + 43113, 0, 0, 0, 9781, 0, 4927, 0, 0, 0, 0, 12397, 129089, 128910, 0, + 12394, 0, 0, 0, 0, 0, 72789, 10781, 1546, 0, 5010, 0, 10507, 127891, + 128291, 0, 0, 0, 0, 7267, 0, 0, 0, 0, 2819, 0, 0, 71063, 0, 7266, 128553, + 7264, 7265, 0, 1363, 0, 119581, 65080, 0, 0, 0, 0, 43336, 0, 0, 126263, + 73776, 0, 43339, 0, 9836, 0, 0, 0, 43335, 41276, 0, 73795, 43337, 817, + 11211, 2241, 128841, 41274, 11340, 42408, 42447, 74932, 0, 0, 12386, 0, + 0, 0, 12389, 128398, 0, 41996, 41686, 0, 8269, 1147, 43849, 120896, 1987, + 128540, 43195, 42001, 41990, 41999, 12391, 0, 0, 4939, 12384, 0, 0, + 43243, 0, 0, 70746, 0, 0, 0, 0, 0, 8247, 0, 0, 7545, 0, 43643, 121445, 0, + 10036, 0, 119813, 10178, 119816, 0, 119815, 11762, 119818, 0, 92282, + 120597, 0, 0, 119819, 0, 0, 7719, 0, 2486, 0, 119808, 1507, 0, 129185, + 70301, 9687, 119825, 0, 119811, 66196, 0, 5262, 0, 74642, 12681, 0, 0, + 12406, 12219, 0, 127528, 42810, 110991, 0, 983673, 128144, 121027, + 126096, 120753, 12403, 2500, 0, 0, 12409, 0, 0, 0, 74113, 2343, 12412, + 19946, 74112, 125042, 13112, 0, 120603, 67866, 110634, 0, 66369, 5861, + 110632, 11999, 12400, 0, 0, 12645, 0, 11320, 68410, 6748, 65040, 0, + 64184, 12974, 66927, 67613, 120645, 0, 0, 0, 0, 0, 1928, 0, 67649, 0, 0, + 67609, 11235, 0, 0, 67610, 8241, 0, 0, 4206, 0, 0, 0, 128298, 110980, 0, + 67238, 0, 0, 0, 1422, 8357, 0, 7187, 0, 120641, 0, 0, 0, 0, 125022, + 111064, 92539, 10120, 12405, 0, 72997, 0, 13278, 0, 6366, 0, 7945, 0, + 4402, 0, 12402, 129372, 0, 74754, 12408, 0, 44007, 0, 0, 0, 12411, 0, + 120824, 128306, 121092, 0, 1575, 0, 0, 0, 73003, 119622, 0, 0, 12399, 0, + 6833, 0, 0, 0, 71878, 9692, 0, 0, 100615, 6750, 66855, 0, 0, 0, 0, 43527, + 0, 727, 0, 0, 0, 0, 6726, 127387, 0, 12370, 44023, 0, 126592, 2280, 0, + 12372, 120642, 0, 0, 0, 0, 12366, 10963, 6066, 1329, 0, 3052, 72987, 0, + 66029, 0, 10803, 0, 0, 0, 92473, 0, 0, 0, 0, 1499, 0, 0, 42740, 0, 0, 0, + 0, 12056, 126484, 0, 3660, 69404, 42192, 74253, 0, 42223, 67617, 125254, + 0, 0, 0, 0, 9941, 0, 0, 1933, 0, 0, 0, 0, 73866, 0, 0, 2487, 67614, 7361, + 1804, 0, 67615, 0, 0, 12220, 67616, 0, 0, 0, 68200, 6675, 0, 0, 67592, + 126582, 0, 64771, 0, 9132, 0, 111004, 510, 0, 0, 0, 4561, 7711, 92769, + 92944, 111007, 0, 41569, 121282, 0, 8167, 66885, 123197, 0, 0, 69992, + 66403, 6967, 0, 0, 0, 0, 333, 0, 0, 10566, 66409, 0, 121373, 0, 72965, + 110999, 66388, 6678, 0, 0, 12621, 0, 128775, 10227, 4764, 0, 9981, 0, + 70278, 11589, 0, 0, 42202, 12754, 0, 0, 69576, 0, 67594, 2048, 0, 4050, + 67595, 0, 0, 43221, 11184, 72709, 0, 0, 64175, 0, 72746, 0, 0, 129966, + 65461, 9798, 0, 71210, 0, 69841, 0, 952, 128235, 125107, 0, 70296, 6449, + 72102, 0, 0, 43098, 64171, 8142, 64160, 0, 0, 0, 0, 0, 0, 0, 0, 67597, + 6676, 3930, 42615, 73124, 69991, 67598, 0, 0, 0, 65591, 41581, 128056, + 1453, 0, 0, 0, 8500, 42222, 0, 119270, 72992, 69996, 0, 0, 64676, 0, 0, + 67606, 66385, 0, 42217, 13102, 0, 67607, 6672, 0, 0, 0, 0, 67608, 0, + 9001, 0, 11274, 67601, 0, 64210, 6664, 0, 42056, 67602, 0, 0, 0, 0, 1469, + 67603, 65381, 69921, 4988, 42372, 0, 9598, 904, 352, 42225, 0, 8061, + 10673, 0, 0, 128276, 67600, 0, 0, 127293, 8575, 127295, 127296, 127289, + 127290, 127291, 127292, 127285, 127286, 127287, 118877, 127281, 127282, + 9460, 823, 11587, 0, 0, 0, 127305, 12387, 0, 0, 127301, 126979, 42783, + 69998, 64208, 127298, 127299, 66031, 0, 11606, 64784, 0, 69973, 0, 0, 0, + 5152, 11048, 0, 120121, 67605, 0, 69604, 0, 70276, 194847, 0, 127052, + 42587, 42214, 41394, 0, 4763, 0, 118935, 0, 5260, 0, 94038, 326, 120131, + 74119, 0, 10771, 42198, 194920, 194837, 194925, 41398, 127079, 41393, + 127077, 127076, 453, 41396, 0, 13159, 11227, 9572, 0, 0, 194576, 128835, + 127081, 0, 126617, 43144, 0, 72972, 194887, 0, 0, 0, 0, 0, 64061, 0, 0, + 64056, 70310, 0, 0, 0, 194864, 0, 111084, 64301, 72998, 10464, 0, 128393, + 72847, 0, 11528, 64024, 128072, 679, 0, 0, 5850, 758, 7536, 0, 0, 43712, + 0, 64006, 983589, 64005, 70298, 0, 126487, 0, 0, 0, 0, 0, 72999, 0, + 64027, 64029, 0, 0, 64000, 0, 194874, 0, 42201, 12421, 194875, 0, 1852, + 0, 0, 73744, 0, 64041, 129127, 0, 0, 0, 92322, 12423, 12854, 0, 3496, 0, + 110966, 0, 194823, 0, 0, 6158, 8327, 74553, 0, 12419, 0, 11570, 0, 0, + 123618, 0, 7844, 983801, 194909, 0, 1682, 93039, 194911, 42756, 6765, + 128178, 0, 0, 0, 11412, 6768, 0, 194830, 71316, 0, 0, 0, 11577, 0, + 194829, 1833, 11576, 74334, 0, 0, 42854, 69438, 0, 70307, 0, 194856, + 8085, 0, 194850, 0, 72996, 128778, 1949, 11614, 7847, 120489, 120997, + 64483, 0, 0, 0, 0, 0, 0, 0, 126651, 42864, 0, 64667, 74624, 0, 0, 43261, + 11484, 127535, 67840, 0, 0, 128965, 0, 72974, 0, 110928, 128454, 3455, 0, + 0, 9879, 0, 0, 4158, 128050, 0, 0, 110929, 0, 0, 0, 332, 118808, 0, 0, + 2407, 0, 42199, 92386, 110865, 0, 77921, 55217, 123161, 125199, 70043, 0, + 0, 0, 121093, 1834, 0, 0, 71315, 0, 65249, 0, 8662, 0, 0, 123153, 0, + 11539, 10784, 0, 67674, 0, 92233, 0, 0, 118858, 0, 0, 0, 0, 0, 0, 12499, + 6280, 0, 0, 0, 0, 0, 0, 43851, 6279, 12508, 0, 12502, 9161, 0, 1620, 0, + 3601, 0, 0, 67246, 609, 11555, 0, 12496, 0, 74181, 120492, 12505, 0, + 194902, 0, 43567, 239, 0, 127085, 0, 0, 42671, 0, 0, 83095, 43565, + 127082, 983936, 12696, 127753, 0, 94062, 12929, 0, 712, 0, 4197, 0, + 42818, 0, 70306, 0, 0, 983805, 0, 43562, 0, 129034, 68076, 0, 111074, + 64628, 0, 0, 0, 0, 7494, 0, 4924, 0, 0, 0, 0, 127088, 0, 127087, 69987, + 64796, 0, 0, 12033, 0, 0, 0, 0, 0, 0, 0, 70299, 0, 0, 68324, 72420, 0, 0, + 0, 0, 70309, 127000, 0, 0, 0, 72418, 72963, 0, 5699, 0, 983879, 9488, + 74410, 119112, 70477, 11170, 0, 0, 72312, 0, 5265, 0, 0, 0, 0, 12464, 0, + 43264, 72977, 0, 43345, 0, 0, 120592, 6807, 0, 9829, 69997, 0, 0, 43346, + 11393, 795, 0, 72412, 12462, 72416, 72415, 0, 0, 64362, 0, 0, 120811, 0, + 12468, 8607, 1008, 0, 120670, 0, 0, 67855, 125018, 127177, 6758, 0, 0, + 1820, 41112, 0, 11202, 129451, 0, 13223, 0, 64595, 0, 0, 0, 0, 12616, 0, + 0, 0, 74467, 0, 0, 0, 0, 0, 0, 67233, 119060, 0, 83448, 19920, 69897, 0, + 129057, 0, 1130, 0, 0, 0, 11823, 0, 0, 118896, 0, 0, 13280, 0, 10747, + 118925, 0, 43509, 0, 0, 8959, 0, 6747, 0, 0, 8568, 0, 120870, 0, 120803, + 83060, 42670, 0, 11621, 12460, 0, 0, 0, 0, 111190, 0, 66570, 72989, + 121305, 126476, 120582, 0, 0, 0, 111191, 70308, 11594, 0, 68333, 69427, + 10491, 0, 0, 0, 0, 0, 127506, 0, 194910, 4923, 65086, 8981, 0, 42133, 0, + 72244, 0, 70294, 0, 0, 12485, 0, 8642, 0, 42766, 0, 2210, 11109, 0, 0, 0, + 0, 0, 7398, 0, 0, 0, 8041, 1461, 0, 119133, 0, 6749, 0, 0, 0, 71705, 0, + 0, 68071, 0, 67668, 0, 0, 9193, 0, 0, 0, 0, 73810, 0, 0, 64305, 0, 0, + 623, 781, 670, 10660, 5769, 613, 7543, 0, 477, 92633, 92521, 0, 592, 0, + 12459, 0, 0, 0, 12465, 119578, 654, 11345, 653, 652, 111250, 647, 0, 633, + 120744, 0, 111262, 12480, 74354, 0, 39, 12487, 0, 0, 74803, 12482, 0, + 12489, 0, 128962, 5550, 129175, 0, 0, 0, 0, 1813, 0, 41311, 111205, 0, + 11229, 0, 70496, 1675, 69840, 129435, 0, 119078, 10070, 10595, 111207, + 119077, 111206, 121162, 0, 0, 0, 11222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 71716, 917841, 0, 0, 270, 0, 0, 0, 0, 0, 120899, 0, 69741, 0, 0, 68251, + 0, 71721, 364, 9595, 0, 0, 0, 707, 110603, 0, 9282, 0, 224, 0, 68670, + 9332, 65581, 68677, 0, 68644, 0, 11764, 68634, 0, 10732, 68640, 850, 0, + 0, 71123, 0, 68619, 44008, 68627, 0, 0, 0, 0, 0, 0, 0, 0, 12507, 0, 0, + 128311, 0, 120529, 4375, 0, 0, 0, 12198, 0, 67339, 0, 0, 72994, 74293, + 128434, 0, 0, 64546, 0, 71208, 0, 0, 0, 42334, 42502, 0, 120887, 72961, + 0, 0, 5767, 0, 0, 71710, 8353, 0, 0, 0, 121233, 0, 0, 0, 0, 119920, 0, 0, + 121186, 0, 0, 0, 72719, 64604, 0, 6096, 0, 10063, 0, 0, 119630, 3485, + 12987, 0, 127522, 0, 0, 0, 0, 0, 0, 0, 0, 127173, 0, 0, 68249, 0, 0, + 118923, 0, 64574, 128794, 0, 1640, 12495, 66691, 0, 3138, 12504, 11171, + 1922, 0, 12498, 0, 0, 69939, 0, 65543, 0, 0, 0, 66643, 0, 120734, 0, + 4228, 0, 10303, 0, 0, 0, 10335, 3520, 0, 12490, 0, 0, 0, 12493, 121452, + 64636, 1002, 12491, 0, 0, 92615, 2096, 0, 0, 0, 0, 11611, 66228, 0, + 11241, 66224, 66221, 66226, 66229, 66219, 66231, 66216, 0, 66236, 66211, + 66218, 0, 66240, 78041, 66233, 66217, 0, 7909, 66234, 11605, 0, 0, 66208, + 0, 0, 128282, 73875, 0, 12898, 12494, 120939, 12492, 0, 0, 0, 74153, 0, + 127391, 127489, 4882, 13040, 0, 120762, 4885, 194732, 0, 13042, 4880, + 128834, 2429, 0, 8647, 0, 0, 0, 0, 0, 0, 68896, 0, 119101, 66693, 0, + 1870, 78040, 470, 68893, 78035, 78036, 983577, 78034, 110607, 110608, 0, + 12511, 74453, 12514, 0, 128609, 7239, 7001, 11974, 121214, 0, 0, 7378, + 12512, 11615, 13041, 0, 0, 128057, 13038, 0, 0, 71717, 70195, 120836, + 12510, 127070, 13039, 75019, 12513, 71969, 12471, 110761, 0, 121385, + 70193, 0, 0, 0, 71714, 0, 12477, 0, 12473, 7666, 67362, 237, 6281, 0, 0, + 0, 0, 1312, 0, 0, 12469, 0, 0, 64335, 12475, 0, 69382, 0, 11524, 10367, + 10431, 74368, 13017, 3388, 129547, 69573, 0, 0, 128725, 4932, 0, 0, + 13015, 0, 0, 65451, 8185, 0, 0, 43024, 129362, 74375, 10129, 0, 7948, + 9236, 0, 0, 0, 92726, 43473, 6289, 10484, 0, 0, 0, 12082, 12521, 3147, + 110643, 110644, 12524, 110642, 2310, 0, 0, 0, 0, 13013, 0, 8596, 983852, + 10804, 70497, 0, 0, 13014, 12444, 0, 43088, 13016, 0, 0, 0, 0, 12331, 0, + 0, 8744, 726, 121090, 983849, 4155, 0, 0, 0, 71690, 12522, 73128, 0, 0, + 127805, 0, 110647, 0, 0, 983853, 12525, 0, 12523, 2152, 11969, 120596, + 403, 0, 11021, 0, 0, 11030, 8610, 92567, 0, 0, 63998, 0, 0, 0, 0, 0, 0, + 0, 12506, 0, 11146, 71477, 12500, 0, 12509, 0, 0, 0, 0, 6608, 0, 0, 0, 0, + 69288, 77995, 0, 3608, 0, 0, 1107, 0, 129658, 0, 0, 0, 0, 983937, 43217, + 66571, 13222, 118963, 0, 126514, 10463, 11553, 0, 63995, 9043, 128634, + 71722, 0, 0, 127751, 92974, 12529, 8042, 0, 2344, 12528, 0, 0, 0, 69719, + 120956, 0, 0, 66512, 0, 12530, 0, 0, 68917, 12658, 0, 71683, 0, 983237, + 0, 127526, 469, 0, 4363, 3313, 0, 0, 2023, 0, 72251, 78225, 65706, 10051, + 78219, 78220, 0, 9920, 12215, 0, 4931, 1951, 12497, 119363, 0, 0, 119336, + 0, 0, 0, 0, 0, 1491, 128578, 129169, 0, 0, 0, 0, 78898, 94086, 41993, 0, + 67379, 0, 0, 0, 0, 9738, 41995, 1075, 0, 12535, 41992, 0, 0, 0, 0, + 128117, 0, 9940, 0, 7692, 0, 9727, 41131, 330, 8566, 0, 41133, 41117, + 128482, 12532, 78550, 78546, 43177, 0, 43235, 0, 917542, 78229, 78231, + 13031, 12910, 67710, 78555, 13028, 78553, 12537, 0, 0, 71692, 12536, + 2350, 13029, 78233, 0, 0, 13030, 0, 4527, 71250, 12538, 0, 0, 0, 0, 0, 0, + 0, 12484, 4032, 71459, 194728, 0, 64344, 0, 66700, 66000, 8412, 0, 43466, + 1296, 2325, 0, 121020, 10149, 74118, 0, 0, 12481, 121280, 12488, 0, 0, 0, + 67972, 0, 2354, 42619, 0, 73027, 6295, 901, 0, 0, 0, 0, 0, 128653, 11927, + 66584, 78559, 78560, 78557, 78558, 0, 74649, 0, 126241, 67220, 194726, + 78568, 67226, 78565, 70190, 78563, 78564, 2352, 67219, 78569, 71945, + 11289, 1407, 67973, 0, 13026, 6762, 10399, 70192, 13023, 78578, 9777, + 67208, 1871, 0, 0, 0, 13024, 71936, 0, 9325, 6818, 6283, 11738, 0, 0, + 71938, 11741, 0, 0, 9216, 8263, 11279, 0, 983837, 0, 13021, 71922, 3136, + 0, 983840, 0, 13022, 129143, 9956, 0, 0, 0, 42580, 0, 0, 0, 13020, 10024, + 0, 94013, 0, 0, 0, 43001, 8029, 0, 0, 0, 3335, 127924, 9209, 13048, + 73126, 0, 0, 0, 3333, 119100, 0, 0, 3342, 78582, 78583, 73056, 78581, + 4156, 0, 0, 0, 78591, 1611, 73058, 13018, 78586, 78588, 78584, 3337, + 4537, 78593, 11736, 0, 0, 0, 4214, 73790, 0, 0, 13046, 194844, 425, 74763, 42066, 78595, 0, 2392, 13047, 0, 0, 12425, 13049, 0, 92243, 0, - 72715, 73944, 13050, 0, 0, 0, 0, 0, 0, 0, 8929, 0, 0, 0, 0, 983971, 0, - 13045, 0, 0, 7751, 0, 9726, 0, 3997, 0, 8768, 13044, 0, 0, 4024, 0, 0, + 72715, 73944, 13050, 0, 0, 0, 0, 983501, 0, 0, 8929, 0, 0, 0, 0, 983971, + 0, 13045, 0, 0, 7751, 0, 9726, 0, 3997, 0, 8768, 13044, 0, 0, 4024, 0, 0, 2419, 9757, 69736, 0, 0, 0, 129500, 0, 0, 0, 72735, 0, 0, 0, 0, 0, 11911, 124990, 0, 2346, 194691, 69931, 0, 9646, 3773, 43557, 68154, 42536, 0, 70108, 13043, 92686, 92494, 0, 208, 0, 43766, 0, 0, 0, 10699, 0, 0, 7825, @@ -23894,8 +24697,8 @@ static const unsigned int code_hash[] = { 8294, 42912, 129343, 0, 0, 4876, 111316, 0, 111326, 111282, 0, 0, 0, 73950, 13053, 9944, 0, 2811, 13051, 111313, 3143, 111246, 66374, 110759, 0, 0, 13052, 0, 0, 63972, 119071, 7025, 0, 0, 100464, 74161, 4154, 9863, - 0, 0, 0, 63970, 1564, 0, 0, 0, 0, 0, 9942, 0, 0, 111227, 0, 128471, 0, - 63957, 0, 1626, 0, 63983, 0, 111232, 0, 0, 121275, 111292, 6254, 4910, + 129686, 0, 0, 63970, 1564, 0, 0, 0, 0, 0, 9942, 0, 0, 111227, 0, 128471, + 0, 63957, 0, 1626, 0, 63983, 0, 111232, 0, 0, 121275, 111292, 6254, 4910, 69453, 0, 64753, 100458, 111303, 111298, 127404, 111297, 3229, 0, 42774, 0, 0, 111218, 111286, 2331, 0, 7085, 6137, 0, 70411, 0, 126070, 0, 128438, 0, 0, 65043, 0, 127588, 70412, 128921, 64721, 0, 0, 0, 0, 0, @@ -23905,7 +24708,7 @@ static const unsigned int code_hash[] = { 72750, 2342, 0, 0, 0, 4894, 0, 4890, 0, 0, 0, 4893, 128426, 6571, 0, 4888, 4157, 78048, 78049, 78046, 11263, 0, 78045, 64895, 121437, 0, 0, 0, 0, 0, 119041, 2332, 78063, 78060, 78061, 64932, 78059, 65125, 121098, 0, - 0, 0, 73941, 78066, 12203, 78064, 78065, 8913, 120390, 4875, 73678, + 0, 129991, 73941, 78066, 12203, 78064, 78065, 8913, 120390, 4875, 73678, 120396, 120389, 71854, 0, 120394, 120386, 120395, 13104, 78076, 78077, 120393, 78075, 0, 3134, 83096, 65696, 72432, 0, 0, 0, 8334, 0, 83207, 3449, 0, 0, 83215, 0, 0, 0, 83204, 0, 0, 0, 69707, 0, 0, 10734, 0, 83198, @@ -23928,10 +24731,10 @@ static const unsigned int code_hash[] = { 0, 0, 0, 42682, 0, 0, 0, 41227, 0, 71475, 0, 64848, 0, 78574, 0, 113792, 0, 0, 129133, 0, 66015, 74614, 959, 8885, 0, 0, 0, 9469, 9632, 128211, 74761, 64323, 100478, 0, 2266, 78575, 310, 0, 0, 68403, 100480, 72738, - 125279, 0, 0, 6497, 0, 0, 0, 19958, 0, 0, 74953, 0, 118998, 67332, 374, - 0, 41933, 120975, 0, 0, 41934, 7465, 0, 128168, 70666, 11151, 6101, 0, - 41936, 100476, 4879, 0, 65446, 0, 0, 0, 0, 5374, 0, 128059, 127390, 0, - 126618, 983571, 129146, 0, 0, 1929, 0, 12142, 0, 0, 0, 121472, 0, 12982, + 125279, 0, 0, 6497, 127320, 0, 0, 19958, 0, 0, 74953, 0, 118998, 67332, + 374, 0, 41933, 120975, 0, 0, 41934, 7465, 0, 128168, 70666, 11151, 6101, + 0, 41936, 100476, 4879, 0, 65446, 0, 0, 0, 0, 5374, 0, 128059, 127390, 0, + 126618, 983575, 129146, 0, 0, 1929, 0, 12142, 0, 0, 0, 121472, 0, 12982, 0, 5378, 0, 128679, 0, 0, 127869, 0, 0, 0, 0, 0, 78832, 74481, 0, 43262, 100511, 2421, 0, 2324, 828, 3611, 121055, 0, 64314, 0, 0, 0, 0, 0, 0, 7999, 0, 11217, 983261, 10634, 10942, 0, 2348, 0, 0, 0, 0, 119044, 9982, @@ -23942,231 +24745,233 @@ static const unsigned int code_hash[] = { 0, 8075, 55276, 123589, 8047, 0, 78827, 12634, 0, 78782, 71322, 0, 12174, 42610, 0, 0, 0, 1584, 0, 6045, 0, 0, 65218, 11559, 0, 0, 0, 124991, 0, 0, 64418, 0, 0, 0, 0, 0, 0, 67821, 0, 13092, 0, 128365, 0, 0, 0, 0, 0, - 11414, 0, 2531, 13034, 0, 0, 0, 13036, 0, 70866, 70198, 10394, 0, 13037, - 0, 0, 0, 0, 100496, 120640, 41129, 0, 42850, 13035, 0, 0, 5466, 0, 0, 0, - 0, 4535, 0, 4271, 0, 0, 6769, 0, 0, 67350, 6767, 0, 66273, 0, 6755, - 73827, 9046, 67355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83235, 2563, 13033, 247, - 83229, 0, 12338, 0, 83231, 11270, 0, 0, 0, 0, 70107, 0, 0, 0, 0, 3752, - 83243, 68895, 0, 68897, 0, 0, 0, 0, 5009, 0, 0, 0, 0, 119521, 78823, - 78824, 70353, 68399, 3877, 0, 78825, 10145, 43566, 0, 0, 10236, 0, 43782, - 0, 127329, 0, 69652, 118921, 120612, 128058, 0, 43200, 43777, 71253, 0, - 83254, 0, 71866, 43203, 0, 68894, 0, 127326, 0, 43778, 119538, 0, 0, - 43781, 11303, 65547, 0, 7031, 0, 0, 67343, 83237, 83267, 0, 67341, 0, - 8535, 0, 0, 0, 66032, 0, 0, 120786, 42233, 0, 9946, 7667, 0, 11822, 0, - 43189, 120673, 100507, 2979, 1579, 0, 0, 0, 0, 0, 12635, 0, 0, 94055, 0, - 1285, 64882, 0, 0, 83113, 12640, 83112, 7401, 0, 12625, 0, 71296, 72744, - 0, 74286, 55260, 3396, 12642, 0, 110719, 0, 12630, 0, 0, 10153, 0, 6166, - 120516, 0, 110680, 0, 0, 0, 9285, 913, 42259, 83017, 0, 2142, 0, 0, - 94012, 7878, 0, 72733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128918, 5263, 74782, 0, - 41939, 43702, 0, 917856, 0, 10139, 980, 43698, 0, 2208, 0, 43701, 0, - 125132, 0, 100528, 0, 10085, 0, 0, 119989, 100529, 0, 71699, 0, 8072, 0, - 43700, 0, 7304, 7783, 66894, 12398, 0, 0, 0, 0, 0, 0, 120565, 0, 2217, 0, - 94015, 6367, 0, 66688, 0, 0, 0, 0, 0, 92199, 7808, 1829, 0, 41937, 0, - 43272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6627, 0, 6258, 10683, 0, 0, 0, - 5649, 0, 0, 0, 1643, 127898, 0, 127846, 67244, 0, 42452, 0, 0, 0, 0, - 64291, 0, 0, 0, 6576, 74773, 0, 0, 66309, 0, 9886, 55225, 11292, 0, - 72867, 55227, 0, 12632, 0, 194817, 0, 7680, 0, 92745, 120714, 12639, - 3380, 8123, 0, 12638, 42262, 4501, 0, 0, 0, 0, 125131, 1494, 983146, 0, - 0, 0, 0, 10494, 0, 65872, 0, 0, 0, 0, 0, 0, 983575, 0, 0, 0, 0, 0, 0, 0, - 71077, 0, 127335, 121128, 0, 5570, 1881, 7210, 0, 1012, 66630, 0, 128982, - 7208, 66442, 5569, 113723, 42339, 92655, 0, 0, 0, 0, 92378, 65602, 0, - 92375, 64727, 9160, 0, 0, 0, 124928, 10503, 0, 3423, 3870, 8483, 10162, - 0, 4319, 0, 0, 0, 0, 0, 983116, 0, 0, 0, 0, 0, 0, 0, 0, 5571, 7630, 9740, - 9121, 5568, 0, 0, 42085, 0, 0, 65056, 0, 589, 0, 0, 0, 10233, 66252, - 66251, 78734, 66253, 0, 0, 42645, 0, 128424, 8583, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 12204, 92436, 0, 0, 0, 0, 0, 0, 0, 70311, 0, 0, 128012, 41063, 0, - 10664, 0, 0, 0, 4551, 129090, 74759, 0, 0, 0, 0, 72806, 0, 0, 12517, - 7806, 0, 12034, 0, 6355, 12519, 41004, 0, 0, 93849, 0, 71707, 0, 121231, - 7332, 129075, 12111, 3927, 0, 12515, 1474, 68768, 0, 6923, 0, 0, 127802, - 0, 43990, 74639, 126229, 121007, 0, 92706, 0, 0, 0, 0, 0, 9645, 0, - 121026, 5853, 0, 10363, 120729, 12956, 0, 0, 0, 0, 127888, 0, 0, 0, 0, 0, - 10514, 65517, 0, 0, 71101, 0, 0, 0, 43570, 2969, 43420, 0, 0, 0, 92366, - 70809, 0, 0, 0, 0, 0, 0, 12125, 41124, 0, 1164, 128817, 0, 120466, 0, 0, - 65014, 66009, 74451, 128760, 983128, 7469, 0, 0, 0, 69988, 120671, 83171, - 41123, 11176, 0, 0, 41126, 9991, 41128, 0, 0, 110949, 0, 0, 42877, 7994, - 0, 6104, 983612, 0, 0, 0, 0, 0, 0, 74438, 128272, 121409, 41981, 0, 0, - 42904, 0, 0, 74435, 126640, 0, 0, 0, 127968, 92442, 12703, 9661, 67360, - 67359, 7455, 70732, 11473, 119217, 128512, 0, 92323, 0, 0, 129632, 67358, - 0, 0, 0, 0, 174, 121131, 883, 4161, 128033, 42603, 0, 0, 72256, 0, 0, - 128356, 0, 0, 0, 0, 3846, 8070, 6150, 128109, 4370, 0, 0, 0, 74587, 0, 0, - 0, 0, 4986, 12189, 917553, 67648, 120499, 0, 4257, 71695, 123620, 6220, - 0, 65561, 0, 0, 0, 0, 0, 0, 0, 0, 69684, 0, 0, 128452, 120873, 0, 0, - 74922, 0, 71897, 0, 0, 67368, 67367, 8871, 67366, 0, 0, 0, 0, 0, 67361, - 0, 0, 67365, 67364, 3427, 4240, 67376, 67375, 67374, 67373, 0, 0, 0, - 67377, 0, 71689, 0, 0, 67372, 67371, 67370, 67369, 0, 0, 0, 124962, 0, 0, - 0, 0, 65898, 0, 65312, 0, 0, 0, 0, 4010, 121208, 41106, 0, 0, 0, 41105, - 0, 64803, 83456, 0, 0, 0, 0, 0, 0, 0, 11008, 0, 0, 71351, 41110, 71681, - 64892, 9113, 1954, 41108, 0, 42878, 0, 67405, 0, 0, 0, 0, 0, 119539, - 69435, 73463, 0, 4586, 129342, 0, 0, 0, 0, 0, 125233, 92307, 0, 0, 0, - 67382, 0, 9500, 0, 4957, 0, 2422, 2212, 0, 67381, 67380, 11045, 67378, 0, - 0, 3890, 12168, 121328, 0, 0, 0, 41947, 0, 120828, 74946, 917901, 0, - 1571, 66461, 41949, 42805, 8270, 943, 41946, 0, 2073, 0, 41980, 0, 0, 0, - 0, 4429, 6272, 0, 1460, 6954, 128572, 41120, 0, 65733, 0, 41119, 0, - 127006, 0, 0, 0, 129168, 12895, 0, 0, 0, 69440, 0, 1985, 6296, 0, 0, 0, - 0, 0, 41122, 0, 2457, 0, 0, 0, 0, 0, 0, 8840, 8035, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8681, 0, 121505, 128747, 0, 0, 70102, 0, 124976, 9605, 0, 13220, - 0, 67354, 11312, 0, 9246, 67349, 0, 0, 0, 0, 10012, 12123, 0, 0, 0, 0, 0, - 0, 0, 0, 67817, 0, 1272, 0, 0, 0, 983582, 0, 1467, 0, 917806, 0, 0, 0, - 70312, 0, 124955, 0, 70400, 0, 0, 72817, 0, 19935, 0, 92162, 0, 0, 0, - 128406, 5275, 0, 0, 44006, 129082, 0, 3789, 128205, 0, 0, 0, 11474, 0, 0, - 0, 129050, 0, 92194, 129503, 9537, 4496, 0, 120443, 2605, 4500, 0, 55224, - 8600, 0, 0, 41646, 11667, 0, 0, 0, 917905, 4499, 41649, 0, 0, 0, 0, 0, 0, - 0, 65804, 0, 70034, 41866, 0, 0, 0, 11174, 0, 0, 0, 9559, 128773, 41940, - 8299, 41945, 0, 41941, 5455, 7190, 0, 0, 917810, 65266, 0, 41943, 10762, - 0, 41931, 0, 0, 8106, 4128, 0, 0, 4494, 0, 0, 72405, 0, 119567, 42068, - 917808, 0, 11004, 12794, 65072, 5271, 7317, 0, 0, 0, 0, 0, 0, 92281, 0, - 0, 0, 0, 71880, 3868, 71881, 983569, 128431, 7703, 0, 64390, 0, 7406, 0, - 93850, 0, 3985, 66425, 0, 66615, 10177, 0, 41853, 71873, 12809, 0, 12193, - 0, 10879, 0, 0, 9055, 0, 3851, 8132, 0, 0, 119263, 917908, 0, 0, 0, 0, 0, - 42657, 0, 7643, 0, 0, 0, 43568, 0, 11949, 7650, 43569, 64951, 7647, 7649, - 0, 7646, 0, 0, 9651, 125005, 3891, 0, 0, 2337, 77831, 77832, 67860, - 129288, 0, 0, 43561, 67706, 119669, 0, 1860, 0, 68835, 5812, 12784, 0, 0, - 0, 0, 0, 7727, 0, 0, 69818, 66444, 128665, 42719, 0, 1569, 0, 12534, - 12124, 7690, 194871, 12533, 0, 68383, 67997, 0, 6969, 0, 0, 0, 67974, - 63895, 128650, 0, 0, 0, 42144, 0, 0, 0, 0, 92211, 119043, 0, 0, 917545, - 0, 0, 12791, 0, 0, 0, 4447, 71065, 12793, 0, 0, 43385, 0, 0, 12790, - 120256, 0, 983821, 12792, 120254, 0, 0, 12789, 128489, 12317, 74934, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 127840, 41652, 2974, 78689, 11476, 0, 0, 0, 0, - 43871, 0, 10894, 119176, 74557, 65686, 0, 0, 3724, 67335, 67334, 67333, - 67338, 67337, 0, 67336, 0, 65306, 0, 128421, 0, 8646, 129593, 77829, 0, - 0, 74852, 0, 0, 0, 0, 0, 220, 120252, 43551, 0, 10044, 0, 0, 983828, - 68659, 110825, 5707, 71362, 0, 0, 0, 0, 0, 0, 10297, 0, 41308, 67331, 0, - 0, 0, 0, 2467, 0, 6003, 0, 0, 8040, 0, 0, 4182, 0, 11135, 120501, 0, 0, - 2510, 0, 10208, 0, 78302, 70829, 0, 0, 6837, 0, 0, 67348, 0, 0, 0, 0, - 1559, 67342, 11104, 67340, 67347, 67346, 67345, 67344, 0, 0, 67357, - 67356, 0, 0, 0, 0, 67352, 67351, 5516, 2845, 7717, 8036, 65161, 67353, - 5514, 12045, 6278, 0, 5515, 0, 0, 0, 0, 0, 65194, 100387, 5517, 70116, - 92774, 0, 67884, 0, 67890, 42094, 67880, 67881, 67882, 67883, 0, 0, - 67879, 120411, 1902, 67887, 67888, 12976, 126546, 12483, 12368, 41769, - 42726, 41765, 0, 12787, 67874, 7556, 67878, 74351, 67897, 989, 42677, - 67889, 0, 6060, 0, 4326, 11000, 64601, 68478, 0, 0, 6917, 0, 120837, 0, - 0, 0, 6148, 8605, 74205, 0, 0, 0, 42715, 0, 101047, 0, 68663, 0, 41796, - 1269, 42703, 64754, 101049, 101042, 5144, 12221, 42716, 71048, 5133, - 4331, 0, 128675, 0, 5279, 121362, 71046, 0, 0, 42701, 0, 0, 0, 121470, 0, - 0, 0, 0, 0, 983608, 121259, 42666, 12207, 1067, 255, 12131, 0, 0, 0, 0, - 0, 0, 0, 70728, 43460, 0, 42723, 125216, 0, 70427, 0, 12797, 0, 0, - 983703, 0, 67977, 12799, 0, 92504, 9746, 5135, 0, 12796, 0, 0, 0, 5139, - 346, 74303, 121134, 12795, 125109, 5168, 0, 43845, 983708, 0, 8253, 8817, - 1136, 983716, 43563, 127774, 129542, 0, 0, 0, 0, 0, 0, 983619, 0, 0, - 4041, 0, 2357, 43240, 12786, 0, 0, 0, 44004, 7142, 0, 67984, 0, 0, 0, 0, - 12785, 0, 0, 7770, 10712, 64853, 42679, 118916, 42375, 0, 983123, 94074, - 12119, 0, 11059, 10791, 0, 450, 0, 0, 0, 0, 5450, 64691, 0, 0, 44009, 0, - 0, 111097, 94085, 1839, 94004, 0, 10927, 1701, 0, 129610, 41749, 41761, - 5453, 8361, 66045, 41758, 5444, 41763, 0, 0, 0, 66349, 983137, 121274, 0, - 0, 8801, 0, 4340, 0, 0, 0, 0, 70001, 41824, 0, 0, 0, 0, 42700, 0, 127980, - 0, 0, 0, 0, 0, 0, 4493, 4336, 129171, 2314, 983061, 41808, 0, 0, 0, - 64638, 0, 65937, 4489, 71331, 0, 0, 5358, 42717, 0, 71236, 0, 0, 0, - 127042, 41813, 2712, 0, 127044, 1410, 0, 0, 0, 0, 0, 0, 0, 0, 128587, 0, - 0, 0, 4892, 0, 0, 0, 0, 0, 5777, 0, 759, 0, 2079, 65248, 12788, 0, 64552, - 0, 41803, 68043, 0, 0, 0, 0, 128785, 0, 68492, 67991, 75071, 2340, 0, - 120638, 0, 983883, 0, 0, 0, 64749, 0, 2321, 3587, 0, 67236, 9953, 9952, - 0, 0, 42714, 9951, 0, 0, 127902, 74150, 0, 0, 74757, 127554, 0, 983807, - 2395, 0, 9976, 0, 125128, 0, 0, 0, 42809, 42807, 0, 66290, 70854, 4150, - 64424, 8318, 41790, 67976, 65559, 2360, 41794, 0, 0, 120987, 0, 0, 2418, - 0, 2411, 0, 41783, 0, 41786, 65108, 0, 0, 41772, 42813, 2317, 0, 118980, - 0, 0, 0, 0, 0, 0, 78682, 7753, 2351, 6655, 64489, 0, 0, 0, 4443, 41697, - 230, 65793, 0, 65943, 42803, 0, 0, 5441, 0, 0, 127053, 0, 855, 0, 6109, - 101021, 0, 119116, 69989, 0, 0, 72146, 0, 101023, 0, 72148, 0, 19915, - 41892, 0, 0, 128901, 41887, 0, 67980, 9735, 0, 0, 120591, 13082, 0, 0, 0, - 0, 0, 0, 0, 0, 289, 0, 0, 64504, 0, 126130, 120514, 0, 92962, 0, 42724, - 69977, 0, 0, 0, 0, 67994, 0, 0, 0, 3565, 0, 0, 127553, 43035, 69898, 0, - 0, 0, 0, 4891, 0, 0, 4602, 0, 121065, 0, 0, 121157, 0, 43978, 8988, 0, 0, - 0, 0, 0, 119184, 121436, 73902, 69740, 0, 0, 72976, 0, 0, 8771, 0, 0, 0, - 119209, 74974, 71737, 0, 0, 67987, 0, 0, 0, 67989, 0, 10065, 8207, 0, - 983578, 0, 0, 662, 0, 41927, 0, 0, 0, 0, 0, 0, 0, 41929, 0, 0, 0, 41926, - 69994, 0, 0, 0, 126230, 68013, 1433, 64648, 6475, 0, 120983, 0, 73876, 0, - 0, 0, 67992, 78052, 0, 3978, 0, 0, 0, 0, 120761, 12281, 0, 0, 13241, 0, - 0, 0, 0, 11765, 42577, 0, 0, 2641, 7192, 0, 0, 118809, 101015, 0, 101016, + 11414, 0, 2531, 13034, 0, 0, 0, 13036, 0, 70866, 70198, 10394, 129979, + 13037, 0, 129956, 0, 0, 100496, 120640, 41129, 0, 42850, 13035, 0, 0, + 5466, 0, 0, 0, 129439, 4535, 0, 4271, 0, 0, 6769, 0, 0, 67350, 6767, 0, + 66273, 0, 6755, 73827, 9046, 67355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83235, + 2563, 13033, 247, 83229, 0, 12338, 0, 83231, 11270, 0, 0, 0, 0, 70107, 0, + 0, 0, 0, 3752, 83243, 68895, 0, 68897, 0, 0, 0, 0, 5009, 0, 0, 0, 0, + 119521, 78823, 78824, 70353, 68399, 3877, 0, 78825, 10145, 43566, 0, 0, + 10236, 0, 43782, 0, 127329, 0, 69652, 2247, 120612, 128058, 0, 43200, + 43777, 71253, 0, 69558, 0, 71866, 43203, 0, 68894, 0, 127326, 0, 43778, + 119538, 0, 0, 43781, 11303, 65547, 0, 7031, 0, 0, 67343, 83237, 83267, 0, + 67341, 0, 8535, 0, 0, 0, 66032, 0, 0, 120786, 42233, 0, 9946, 7667, 0, + 11822, 0, 43189, 120673, 100507, 2979, 1579, 0, 0, 0, 0, 0, 12635, 0, 0, + 94055, 0, 1285, 64882, 0, 0, 83113, 12640, 83112, 7401, 0, 12625, 0, + 71296, 72744, 0, 74286, 55260, 3396, 12642, 0, 110719, 0, 12630, 0, 0, + 10153, 0, 6166, 120516, 0, 110680, 0, 0, 0, 9285, 913, 42259, 83017, 0, + 2142, 0, 0, 94012, 7878, 0, 72733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128918, + 5263, 74782, 0, 41939, 43702, 0, 917856, 0, 10139, 980, 43698, 0, 2208, + 0, 43701, 0, 125132, 0, 100528, 0, 10085, 0, 0, 119989, 100529, 0, 71699, + 0, 8072, 0, 43700, 0, 7304, 7783, 66894, 12398, 0, 0, 0, 0, 0, 0, 120565, + 0, 2217, 0, 94015, 6367, 0, 66688, 0, 0, 0, 0, 0, 92199, 7808, 1829, 0, + 41937, 0, 43272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92467, 6627, 0, 6258, + 10683, 0, 0, 0, 5649, 0, 0, 0, 1643, 127898, 0, 127846, 67244, 0, 42452, + 0, 0, 0, 0, 64291, 0, 0, 0, 6576, 74773, 0, 0, 66309, 0, 9886, 55225, + 11292, 0, 72867, 55227, 0, 12632, 0, 194817, 0, 7680, 0, 92745, 120714, + 12639, 3380, 8123, 0, 12638, 42262, 4501, 0, 0, 0, 0, 125131, 1494, + 983146, 0, 0, 0, 0, 10494, 0, 65872, 0, 0, 0, 0, 0, 0, 983587, 0, 0, 0, + 0, 0, 0, 0, 71077, 0, 127335, 121128, 0, 5570, 1881, 7210, 0, 1012, + 66630, 0, 128982, 7208, 66442, 5569, 113723, 42339, 92655, 0, 0, 0, 0, + 92378, 65602, 0, 92375, 64727, 9160, 0, 0, 0, 124928, 10503, 0, 3423, + 3870, 8483, 10162, 0, 4319, 0, 0, 0, 0, 0, 983116, 0, 69562, 0, 0, 0, 0, + 0, 0, 5571, 7630, 9740, 9121, 5568, 0, 0, 42085, 0, 0, 65056, 0, 589, 0, + 0, 0, 10233, 66252, 66251, 78734, 66253, 0, 0, 42645, 0, 128424, 8583, 0, + 0, 0, 129932, 0, 0, 0, 0, 0, 12204, 92436, 0, 0, 0, 0, 0, 0, 0, 70311, 0, + 0, 128012, 41063, 0, 10664, 0, 0, 0, 4551, 129090, 74759, 0, 0, 0, 0, + 72806, 0, 0, 12517, 7806, 0, 12034, 0, 6355, 12519, 41004, 0, 0, 93849, + 0, 71707, 0, 121231, 7332, 129075, 12111, 3927, 0, 12515, 1474, 68768, 0, + 6923, 0, 0, 127802, 0, 43990, 74639, 126229, 121007, 0, 92706, 0, 0, 0, + 0, 0, 9645, 0, 121026, 5853, 0, 10363, 120729, 12956, 0, 0, 0, 0, 127888, + 0, 0, 0, 0, 0, 10514, 65517, 0, 0, 71101, 0, 0, 0, 43570, 2969, 43420, + 129944, 0, 0, 92366, 70809, 0, 0, 0, 0, 0, 0, 12125, 41124, 0, 1164, + 128817, 0, 120466, 0, 0, 65014, 66009, 74451, 125075, 983128, 7469, 0, 0, + 0, 69988, 120671, 83171, 41123, 11176, 0, 0, 41126, 9991, 41128, 0, 0, + 110949, 0, 0, 42877, 7994, 0, 6104, 983612, 0, 129869, 0, 0, 0, 0, 74438, + 128272, 121409, 41981, 0, 69296, 42904, 0, 0, 74435, 126640, 0, 0, 0, + 127968, 92442, 12703, 9661, 67360, 67359, 7455, 70732, 11473, 119217, + 128512, 0, 92323, 0, 0, 129632, 67358, 0, 0, 0, 0, 174, 121131, 883, + 4161, 128033, 42603, 0, 0, 72256, 0, 0, 128356, 0, 0, 0, 0, 3846, 8070, + 6150, 128109, 4370, 0, 0, 0, 74587, 0, 0, 0, 0, 4986, 12189, 917553, + 67648, 120499, 0, 4257, 71695, 123620, 6220, 0, 65561, 0, 0, 0, 0, 0, 0, + 0, 0, 69684, 0, 0, 128452, 120873, 0, 0, 74922, 0, 71897, 0, 0, 67368, + 67367, 8871, 67366, 0, 0, 0, 0, 0, 67361, 0, 0, 67365, 67364, 3427, 4240, + 67376, 67375, 67374, 67373, 0, 0, 0, 67377, 0, 71689, 0, 0, 67372, 67371, + 67370, 67369, 0, 0, 0, 124962, 0, 0, 0, 0, 65898, 0, 65312, 0, 0, 0, 0, + 4010, 121208, 41106, 0, 0, 0, 41105, 0, 64803, 83456, 0, 0, 0, 0, 0, 0, + 0, 11008, 0, 0, 71351, 41110, 71681, 64892, 9113, 1954, 41108, 0, 42878, + 0, 67405, 0, 0, 0, 0, 0, 119539, 69435, 73463, 0, 4586, 129342, 0, 0, 0, + 0, 0, 125233, 92307, 0, 0, 0, 67382, 0, 9500, 0, 4957, 0, 2422, 2212, 0, + 67381, 67380, 11045, 67378, 0, 0, 3890, 12168, 121328, 0, 0, 0, 41947, 0, + 120828, 74946, 917901, 0, 1571, 66461, 41949, 42805, 8270, 943, 41946, 0, + 2073, 0, 41980, 0, 0, 0, 0, 4429, 6272, 0, 1460, 6954, 128572, 41120, 0, + 65733, 0, 41119, 0, 127006, 0, 0, 0, 129168, 12895, 0, 0, 0, 69440, 0, + 1985, 6296, 0, 0, 0, 0, 0, 41122, 0, 2457, 0, 0, 0, 0, 0, 0, 8840, 8035, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8681, 0, 121505, 128747, 0, 0, 70102, 0, + 124976, 9605, 0, 13220, 0, 67354, 11312, 0, 9246, 67349, 0, 0, 0, 0, + 10012, 12123, 0, 0, 0, 0, 0, 0, 0, 0, 67817, 0, 1272, 0, 0, 0, 983578, 0, + 1467, 0, 917806, 0, 0, 0, 70312, 0, 124955, 0, 70400, 0, 0, 72817, 0, + 19935, 0, 92162, 0, 0, 0, 128406, 5275, 0, 0, 44006, 129082, 0, 3789, + 128205, 0, 0, 0, 11474, 0, 0, 0, 129050, 0, 92194, 129503, 9537, 4496, 0, + 120443, 2605, 4500, 0, 55224, 8600, 0, 0, 41646, 11667, 69569, 0, 0, + 917905, 4499, 41649, 0, 0, 0, 69254, 0, 0, 0, 65804, 0, 70034, 41866, 0, + 0, 0, 11174, 0, 0, 0, 9559, 128773, 41940, 8299, 41945, 0, 41941, 5455, + 7190, 0, 0, 917810, 65266, 0, 41943, 10762, 0, 41931, 0, 0, 8106, 4128, + 0, 0, 4494, 0, 0, 72405, 0, 119567, 42068, 917808, 0, 11004, 12794, + 65072, 5271, 7317, 0, 0, 0, 0, 0, 0, 92281, 0, 0, 0, 0, 71880, 3868, + 71881, 983573, 128431, 7703, 0, 64390, 0, 7406, 0, 93850, 0, 3985, 66425, + 0, 66615, 10177, 0, 41853, 71873, 12809, 0, 12193, 0, 10879, 0, 0, 9055, + 0, 3851, 8132, 0, 0, 119263, 917908, 0, 0, 0, 0, 0, 42657, 0, 7643, 0, 0, + 0, 43568, 0, 11949, 7650, 43569, 64951, 7647, 7649, 0, 7646, 0, 0, 9651, + 125005, 3891, 0, 0, 2337, 77831, 77832, 67860, 129288, 0, 0, 43561, + 67706, 119669, 0, 1860, 0, 68835, 5812, 12784, 0, 0, 0, 0, 69260, 7727, + 0, 69292, 69818, 66444, 128665, 42719, 0, 1569, 0, 12534, 12124, 7690, + 194871, 12533, 0, 68383, 67997, 0, 6969, 0, 0, 0, 67974, 63895, 128650, + 0, 0, 0, 42144, 0, 0, 0, 0, 92211, 119043, 0, 0, 917545, 0, 0, 12791, 0, + 0, 0, 4447, 71065, 12793, 0, 0, 43385, 0, 0, 12790, 120256, 0, 983821, + 12792, 120254, 0, 0, 12789, 128489, 12317, 74934, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 127840, 41652, 2974, 78689, 11476, 0, 0, 0, 0, 43871, 0, 10894, + 119176, 74557, 65686, 0, 0, 3724, 67335, 67334, 67333, 67338, 67337, 0, + 67336, 0, 65306, 0, 128421, 0, 8646, 129593, 77829, 0, 0, 74852, 0, 0, 0, + 0, 0, 220, 120252, 43551, 0, 10044, 0, 0, 983828, 68659, 110825, 5707, + 71362, 0, 0, 0, 0, 0, 0, 10297, 0, 41308, 67331, 0, 0, 0, 0, 2467, 0, + 6003, 0, 0, 8040, 0, 0, 4182, 0, 11135, 120501, 0, 0, 2510, 0, 10208, 0, + 78302, 70829, 0, 0, 6837, 0, 0, 67348, 0, 0, 0, 0, 1559, 67342, 11104, + 67340, 67347, 67346, 67345, 67344, 0, 0, 67357, 67356, 0, 0, 0, 0, 67352, + 67351, 5516, 2845, 7717, 8036, 65161, 67353, 5514, 12045, 6278, 0, 5515, + 0, 0, 0, 0, 0, 65194, 100387, 5517, 70116, 92774, 0, 67884, 0, 67890, + 42094, 67880, 67881, 67882, 67883, 0, 0, 67879, 120411, 1902, 67887, + 67888, 12976, 126546, 12483, 12368, 41769, 42726, 41765, 69557, 12787, + 67874, 7556, 67878, 74351, 67897, 989, 42677, 67889, 0, 6060, 0, 4326, + 11000, 64601, 68478, 0, 0, 6917, 0, 120837, 0, 0, 0, 6148, 8605, 74205, + 0, 0, 0, 42715, 0, 101047, 0, 68663, 0, 41796, 1269, 42703, 64754, + 101049, 101042, 5144, 12221, 42716, 71048, 5133, 4331, 0, 128675, 0, + 5279, 121362, 71046, 0, 0, 42701, 0, 0, 0, 121470, 0, 0, 0, 0, 0, 983608, + 121259, 42666, 12207, 1067, 255, 12131, 0, 0, 0, 0, 0, 0, 0, 70728, + 43460, 0, 42723, 125216, 0, 70427, 0, 12797, 0, 0, 983703, 0, 67977, + 12799, 0, 92504, 9746, 5135, 0, 12796, 0, 0, 0, 5139, 346, 74303, 121134, + 12795, 125109, 5168, 0, 43845, 983708, 0, 8253, 8817, 1136, 983716, + 43563, 127774, 129542, 0, 0, 0, 0, 0, 0, 983619, 0, 0, 4041, 0, 2357, + 43240, 12786, 0, 0, 0, 44004, 7142, 0, 67984, 0, 0, 0, 0, 12785, 0, 0, + 7770, 10712, 64853, 42679, 118916, 42375, 0, 983123, 94074, 12119, 0, + 11059, 10791, 0, 450, 0, 0, 0, 0, 5450, 64691, 0, 0, 44009, 0, 0, 111097, + 94085, 1839, 94004, 0, 10927, 1701, 0, 129610, 41749, 41761, 5453, 8361, + 66045, 41758, 5444, 41763, 0, 0, 0, 66349, 983137, 121274, 0, 0, 8801, 0, + 4340, 0, 0, 0, 0, 70001, 41824, 0, 0, 0, 0, 42700, 0, 127980, 0, 0, 0, 0, + 0, 0, 4493, 4336, 129171, 2314, 983061, 41808, 0, 0, 0, 64638, 0, 65937, + 4489, 71331, 0, 0, 5358, 42717, 0, 71236, 0, 0, 0, 127042, 41813, 2712, + 0, 127044, 1410, 0, 0, 0, 0, 0, 0, 0, 0, 128587, 0, 0, 0, 4892, 0, 0, 0, + 0, 0, 5777, 0, 759, 0, 2079, 65248, 12788, 0, 64552, 0, 41803, 68043, 0, + 0, 0, 0, 128785, 0, 68492, 67991, 75071, 2340, 0, 120638, 0, 983883, 0, + 0, 0, 64749, 0, 2321, 3587, 0, 67236, 9953, 9952, 0, 0, 42714, 9951, 0, + 0, 127902, 74150, 0, 0, 74757, 127554, 0, 983807, 2395, 0, 9976, 0, + 125128, 0, 0, 0, 42809, 42807, 0, 66290, 70854, 4150, 64424, 8318, 41790, + 67976, 65559, 2360, 41794, 0, 0, 120987, 0, 0, 2418, 0, 2411, 0, 41783, + 0, 41786, 65108, 0, 0, 41772, 42813, 2317, 0, 118980, 0, 0, 0, 0, 0, 0, + 78682, 7753, 2351, 6655, 64489, 0, 0, 0, 4443, 41697, 230, 65793, 0, + 65943, 42803, 0, 0, 5441, 0, 0, 127053, 0, 855, 0, 6109, 101021, 0, + 119116, 69989, 0, 0, 72146, 0, 101023, 0, 72148, 0, 19915, 41892, 0, 0, + 128901, 41887, 0, 67980, 9735, 0, 0, 120591, 13082, 101026, 0, 0, 0, 0, + 0, 0, 0, 289, 0, 0, 64504, 0, 126130, 120514, 0, 92962, 0, 42724, 69977, + 0, 0, 0, 0, 67994, 0, 0, 0, 3565, 0, 0, 127553, 43035, 69898, 0, 0, 0, 0, + 4891, 0, 0, 4602, 0, 121065, 0, 0, 121157, 0, 43978, 8988, 0, 0, 0, 0, 0, + 119184, 121436, 73902, 69740, 0, 0, 72976, 0, 0, 8771, 0, 0, 0, 119209, + 74974, 71737, 0, 0, 67987, 0, 0, 0, 67989, 0, 10065, 8207, 0, 983588, 0, + 0, 662, 0, 41927, 0, 0, 0, 0, 0, 0, 0, 41929, 0, 0, 0, 41926, 69994, 0, + 0, 0, 126230, 68013, 1433, 64648, 6475, 0, 120983, 0, 73876, 0, 0, 0, + 67992, 78052, 0, 3978, 0, 0, 0, 0, 120761, 12281, 0, 0, 13241, 0, 0, 0, + 0, 11765, 42577, 0, 0, 2641, 7192, 0, 0, 118809, 101015, 0, 101016, 128948, 101013, 6479, 64294, 121194, 0, 0, 0, 64334, 0, 0, 0, 92266, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9478, 127339, 124964, 0, 202, 0, 0, 1242, 0, 121170, 0, 63940, 0, 0, 0, 63939, 11990, 92430, 67982, 0, 65440, 70068, 0, 0, 64829, 0, 0, 0, 0, 0, 2858, 0, 63989, 0, 69239, 0, 121152, 0, 77841, 0, 70078, 92574, 129519, 0, 0, 0, 128974, 0, 12922, 92498, 0, 66424, 71124, 0, 0, 0, 2856, 0, 47, 0, 126986, 65858, 0, 0, 0, 0, 0, - 8417, 65903, 0, 0, 0, 4033, 128164, 0, 0, 0, 0, 64600, 1903, 12320, 0, - 120894, 0, 0, 8915, 0, 945, 0, 0, 0, 0, 111068, 0, 74828, 0, 0, 9531, 0, - 8505, 0, 119238, 0, 0, 65538, 0, 0, 0, 0, 0, 0, 63935, 0, 0, 0, 0, 0, - 64787, 111060, 0, 0, 110828, 0, 2230, 0, 0, 71886, 9843, 0, 92419, - 111062, 129337, 92715, 0, 1320, 0, 1673, 0, 92383, 0, 9338, 128355, 0, 0, - 0, 0, 11997, 0, 0, 0, 0, 0, 0, 43308, 0, 0, 0, 0, 0, 0, 0, 63920, 0, 0, - 0, 0, 0, 0, 3514, 78723, 0, 7492, 0, 0, 0, 7514, 0, 63924, 0, 7502, 7587, - 0, 0, 0, 0, 0, 7610, 0, 0, 120759, 692, 43588, 0, 0, 75056, 9688, 0, - 9535, 0, 0, 0, 64530, 0, 125251, 194861, 0, 72209, 7453, 0, 8013, 66396, - 0, 0, 8895, 5356, 0, 5458, 0, 2866, 0, 127860, 71732, 71724, 6700, 0, - 111081, 120583, 0, 110614, 0, 9641, 63830, 65294, 0, 0, 67969, 0, 7441, - 0, 63826, 0, 0, 0, 0, 2844, 983953, 0, 63824, 12139, 67971, 0, 0, 3358, - 65295, 0, 3104, 0, 0, 0, 0, 65772, 0, 0, 0, 0, 2862, 11326, 0, 0, 94001, - 3268, 66591, 0, 6552, 42367, 7035, 120558, 0, 0, 1814, 195092, 10240, - 195093, 0, 0, 0, 0, 0, 71454, 0, 0, 2837, 4341, 0, 0, 0, 125064, 0, 0, 0, - 0, 0, 72721, 863, 129125, 0, 0, 43323, 0, 0, 0, 68054, 0, 3654, 0, 0, 0, - 0, 0, 7653, 0, 0, 66587, 0, 0, 92401, 0, 0, 12927, 0, 0, 0, 13056, 0, 0, - 3056, 0, 0, 195101, 0, 0, 74506, 73770, 0, 0, 0, 0, 0, 0, 0, 0, 983681, - 0, 5811, 0, 0, 0, 66817, 983836, 0, 0, 128636, 129311, 0, 128041, 0, - 67739, 120965, 0, 0, 0, 0, 68375, 0, 0, 70300, 0, 0, 0, 983679, 111078, - 0, 11991, 128079, 0, 92943, 1502, 74117, 127988, 0, 129478, 121253, 0, - 67661, 0, 0, 125084, 120758, 0, 74057, 68639, 0, 42898, 120742, 0, 74388, - 74838, 120822, 0, 0, 0, 0, 69452, 43214, 5893, 0, 0, 92496, 0, 0, 119907, - 119900, 0, 0, 0, 0, 41950, 0, 0, 68610, 0, 68626, 894, 0, 0, 12306, - 73846, 0, 0, 0, 8636, 0, 121028, 42503, 0, 92942, 0, 121468, 119241, 0, - 126569, 5096, 5095, 2863, 127505, 0, 10454, 42530, 5094, 0, 0, 13156, 0, - 111035, 5093, 127178, 983414, 0, 5092, 10708, 11327, 0, 5091, 0, 0, 9153, - 4104, 78599, 78601, 2929, 42712, 75067, 12272, 9832, 0, 0, 111105, 0, 0, - 0, 0, 0, 0, 13106, 0, 0, 129111, 0, 0, 0, 0, 9074, 111111, 0, 111110, 0, - 8113, 11168, 92563, 1786, 111109, 0, 111108, 0, 74423, 0, 586, 74414, - 64359, 1267, 0, 127531, 0, 65731, 0, 0, 0, 92932, 0, 0, 0, 0, 0, 0, 1228, - 0, 42846, 0, 0, 70343, 1714, 74406, 0, 0, 0, 127389, 66225, 0, 0, 42660, - 0, 0, 3804, 0, 0, 0, 0, 2826, 0, 0, 0, 128396, 0, 0, 0, 0, 0, 0, 12206, - 5839, 0, 68524, 74065, 0, 0, 0, 126240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 67241, 917821, 7030, 0, 10479, 64959, 2852, 0, 121225, 0, 0, 128586, 0, - 6963, 0, 0, 0, 74786, 0, 0, 0, 0, 121281, 0, 0, 0, 0, 113815, 121360, 0, - 9994, 0, 2864, 64719, 1148, 0, 41677, 0, 0, 2765, 0, 128181, 0, 0, 0, - 92516, 74777, 0, 0, 65206, 0, 0, 0, 0, 69391, 0, 0, 983751, 0, 41839, - 129616, 983754, 0, 0, 6931, 0, 0, 7177, 125137, 0, 0, 0, 93020, 0, 10722, - 0, 0, 128186, 121050, 0, 0, 127207, 0, 750, 0, 0, 63912, 0, 0, 7032, 0, - 0, 4314, 128600, 0, 128409, 730, 0, 127866, 0, 0, 41380, 0, 0, 0, 69697, - 8240, 92939, 0, 41378, 0, 6938, 70026, 0, 0, 66246, 0, 0, 0, 0, 0, 0, - 983094, 0, 92754, 41470, 64805, 0, 0, 0, 0, 0, 0, 0, 0, 92938, 68370, 0, - 0, 73831, 0, 0, 0, 2872, 0, 0, 0, 0, 604, 41097, 0, 0, 0, 0, 0, 127488, - 0, 2836, 0, 0, 9707, 0, 43202, 0, 0, 0, 0, 0, 120916, 2832, 92702, 9670, - 12937, 0, 0, 0, 0, 2822, 0, 0, 92519, 0, 73752, 0, 0, 0, 1331, 92603, 0, - 0, 0, 129432, 5090, 5089, 0, 3200, 0, 0, 0, 5088, 0, 0, 9477, 0, 0, 5087, - 92325, 0, 96, 5086, 0, 0, 0, 5085, 64286, 0, 0, 43820, 0, 983722, 0, 0, - 119042, 0, 0, 0, 0, 0, 0, 0, 127241, 120891, 7601, 0, 591, 0, 118953, 0, - 0, 0, 0, 0, 10939, 7246, 6933, 67142, 67141, 0, 74600, 120695, 0, 67138, - 65574, 0, 78058, 67140, 73851, 74598, 67139, 128094, 0, 6372, 0, 0, 7963, - 6371, 0, 0, 125040, 0, 0, 0, 0, 0, 0, 0, 8258, 123591, 0, 0, 65148, - 118919, 42, 0, 0, 0, 0, 0, 0, 0, 0, 67135, 67134, 67133, 0, 0, 0, 0, - 67136, 67130, 74597, 11550, 0, 67132, 65868, 0, 12826, 127872, 0, 126235, - 9737, 92448, 0, 0, 0, 8878, 0, 0, 0, 0, 0, 72220, 9086, 0, 0, 0, 7437, - 7454, 0, 0, 0, 0, 9042, 0, 0, 0, 0, 3805, 0, 67128, 44001, 67126, 0, - 44022, 19949, 12200, 43522, 983045, 43525, 0, 0, 0, 64422, 67125, 67124, - 7602, 0, 0, 43521, 0, 0, 43711, 43523, 41447, 8424, 68483, 8704, 2397, 0, - 0, 0, 0, 0, 10916, 0, 129290, 93998, 0, 0, 0, 127800, 67686, 9961, - 123203, 0, 68842, 10792, 8889, 121402, 6951, 0, 68827, 917835, 74342, 0, - 0, 0, 68816, 129152, 0, 42909, 66597, 70092, 0, 0, 10481, 4559, 0, 1956, - 43138, 0, 0, 43490, 43148, 0, 0, 0, 43140, 0, 0, 0, 0, 73013, 8533, 0, 0, - 0, 0, 0, 4357, 0, 70289, 983156, 0, 42911, 0, 0, 0, 10941, 0, 6962, 0, 0, - 113808, 0, 11014, 0, 8942, 12000, 0, 0, 0, 0, 0, 0, 42650, 0, 75016, - 63975, 0, 66210, 0, 0, 129150, 0, 11193, 0, 0, 0, 0, 0, 0, 0, 43476, 0, - 11024, 74811, 72787, 10563, 92954, 0, 0, 2462, 92955, 0, 0, 66213, 6957, - 0, 120559, 0, 0, 0, 74594, 983419, 92347, 0, 110702, 110708, 110707, - 127119, 3109, 127117, 119909, 0, 121434, 0, 0, 4042, 0, 0, 0, 127123, - 127122, 127121, 0, 127999, 0, 3503, 74444, 68300, 6694, 127997, 0, 0, - 74306, 0, 983738, 7736, 0, 0, 0, 10521, 0, 42173, 9705, 0, 0, 6955, - 71467, 0, 6149, 3887, 19956, 1411, 2824, 0, 0, 0, 1403, 0, 1347, 66282, - 127996, 0, 0, 0, 0, 8640, 0, 1178, 1654, 0, 0, 129529, 43314, 0, 0, 0, 0, - 2873, 0, 0, 0, 67085, 10861, 0, 0, 70377, 0, 67082, 67081, 41391, 67084, - 0, 376, 6987, 983181, 119904, 0, 8823, 0, 12943, 65185, 100988, 42099, 0, - 0, 100990, 0, 8301, 0, 0, 1684, 0, 0, 0, 120620, 0, 0, 0, 42121, 0, - 66781, 78067, 42115, 0, 127998, 0, 67080, 1493, 42111, 67077, 4097, 0, - 983748, 0, 65808, 41642, 0, 0, 67076, 41636, 67074, 65095, 110660, 72254, - 121240, 41629, 12154, 75073, 0, 128179, 74084, 64380, 0, 0, 0, 0, 0, - 71193, 65371, 7078, 0, 0, 0, 74592, 0, 0, 43275, 0, 41434, 6062, 0, 0, - 19916, 0, 6950, 9606, 9842, 0, 65744, 0, 0, 128659, 0, 41615, 10105, 0, - 0, 41632, 7493, 0, 0, 41622, 0, 0, 0, 0, 7632, 983215, 983214, 9805, - 5990, 900, 0, 0, 0, 0, 3612, 0, 64376, 0, 5389, 129469, 0, 0, 2839, 9621, + 8417, 65903, 0, 0, 0, 4033, 128164, 0, 0, 0, 129961, 64600, 1903, 12320, + 0, 120894, 0, 0, 8915, 0, 945, 0, 0, 0, 0, 111068, 0, 74828, 0, 69560, + 9531, 0, 8505, 0, 119238, 0, 0, 65538, 0, 0, 0, 0, 0, 0, 63935, 0, 0, 0, + 0, 0, 64787, 111060, 0, 0, 110828, 0, 2230, 0, 0, 71886, 9843, 0, 92419, + 111062, 129337, 92715, 0, 1320, 0, 1673, 0, 92383, 129902, 9338, 128355, + 0, 0, 0, 0, 11997, 0, 0, 0, 0, 0, 0, 43308, 0, 0, 0, 0, 0, 0, 0, 63920, + 0, 0, 0, 0, 0, 0, 3514, 78723, 0, 7492, 0, 0, 0, 7514, 0, 63924, 0, 7502, + 7587, 0, 0, 0, 0, 43881, 7610, 0, 0, 120759, 692, 43588, 0, 0, 75056, + 9688, 0, 9535, 0, 0, 0, 64530, 0, 125251, 194861, 0, 72209, 7453, 0, + 8013, 66396, 0, 0, 8895, 5356, 0, 5458, 0, 2866, 0, 127860, 71732, 71724, + 6700, 0, 111081, 120583, 0, 110614, 0, 9641, 63830, 65294, 0, 0, 67969, + 0, 7441, 0, 63826, 0, 0, 0, 0, 2844, 983953, 0, 63824, 12139, 67971, 0, + 0, 3358, 65295, 0, 3104, 0, 0, 0, 0, 65772, 0, 0, 0, 0, 2862, 11326, 0, + 0, 94001, 3268, 66591, 0, 6552, 42367, 7035, 120558, 0, 0, 1814, 195092, + 10240, 195093, 0, 0, 0, 0, 0, 71454, 0, 0, 2837, 4341, 0, 0, 129982, + 125064, 0, 0, 0, 0, 0, 72721, 863, 129125, 0, 0, 43323, 0, 0, 0, 68054, + 0, 3654, 0, 0, 0, 0, 0, 7653, 0, 0, 66587, 0, 0, 92401, 0, 0, 12927, 0, + 0, 129697, 13056, 0, 0, 3056, 0, 0, 195101, 0, 0, 74506, 73770, 0, 0, 0, + 0, 0, 0, 0, 0, 72233, 0, 5811, 0, 0, 0, 66817, 983836, 0, 0, 128636, + 129311, 0, 128041, 0, 67739, 120965, 0, 0, 0, 0, 68375, 0, 0, 70300, 0, + 0, 0, 983679, 111078, 0, 11991, 128079, 0, 92943, 1502, 74117, 127988, 0, + 129478, 121253, 0, 67661, 0, 0, 125084, 120758, 0, 74057, 68639, 0, + 42898, 120742, 0, 74388, 74838, 120822, 0, 0, 0, 0, 69452, 43214, 5893, + 0, 0, 92496, 0, 0, 119907, 119900, 0, 0, 0, 0, 41950, 0, 0, 68610, 0, + 68626, 894, 0, 0, 12306, 73846, 0, 0, 0, 8636, 0, 121028, 42503, 0, + 92942, 0, 121468, 119241, 0, 126569, 5096, 5095, 2863, 127505, 0, 10454, + 42530, 5094, 0, 0, 13156, 0, 111035, 5093, 127178, 983414, 0, 5092, + 10708, 11327, 0, 5091, 0, 0, 9153, 4104, 78599, 78601, 2929, 42712, + 75067, 12272, 9832, 0, 0, 111105, 0, 0, 0, 0, 0, 0, 13106, 0, 0, 129111, + 0, 0, 0, 0, 9074, 111111, 0, 111110, 0, 8113, 11168, 92563, 1786, 111109, + 0, 111108, 0, 74423, 0, 586, 74414, 64359, 1267, 0, 127531, 0, 65731, 0, + 0, 0, 92932, 0, 0, 0, 0, 0, 0, 1228, 0, 42846, 0, 0, 70343, 1714, 74406, + 0, 0, 0, 127389, 66225, 0, 0, 42660, 0, 0, 3804, 0, 0, 129859, 0, 2826, + 0, 0, 0, 128396, 0, 0, 0, 0, 0, 0, 12206, 5839, 0, 68524, 74065, 0, 0, 0, + 126240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67241, 917821, 7030, 0, 10479, + 64959, 2852, 0, 121225, 0, 0, 128586, 0, 6963, 0, 0, 0, 74786, 0, 0, 0, + 0, 121281, 0, 0, 0, 0, 113815, 121360, 0, 9994, 0, 2864, 64719, 1148, 0, + 41677, 0, 0, 2765, 0, 128181, 0, 0, 0, 92516, 74777, 0, 0, 65206, 0, 0, + 0, 0, 69391, 0, 0, 983751, 0, 41839, 129616, 983754, 0, 0, 6931, 0, 0, + 7177, 125137, 0, 0, 0, 93020, 0, 10722, 0, 0, 128186, 121050, 0, 0, + 127207, 0, 750, 0, 129453, 63912, 0, 0, 7032, 0, 0, 4314, 128600, 0, + 128409, 730, 0, 127866, 0, 0, 41380, 0, 0, 0, 69697, 8240, 92939, 0, + 41378, 0, 6938, 70026, 0, 0, 66246, 0, 0, 0, 0, 0, 0, 983094, 0, 92754, + 41470, 64805, 0, 0, 0, 0, 0, 0, 0, 0, 92938, 68370, 0, 0, 73831, 0, 0, 0, + 2872, 0, 0, 0, 0, 604, 41097, 0, 0, 0, 0, 0, 127488, 0, 2836, 0, 0, 9707, + 0, 43202, 0, 0, 0, 0, 0, 120916, 2832, 92702, 9670, 12937, 0, 0, 0, 0, + 2822, 0, 0, 92519, 0, 73752, 0, 0, 0, 1331, 92603, 0, 11856, 0, 129432, + 5090, 5089, 0, 3200, 0, 0, 0, 5088, 0, 0, 9477, 0, 0, 5087, 92325, 0, 96, + 5086, 0, 0, 0, 5085, 64286, 0, 0, 43820, 0, 983722, 0, 0, 119042, 0, 0, + 0, 0, 0, 0, 0, 127241, 120891, 7601, 0, 591, 0, 118953, 0, 0, 0, 0, 0, + 10939, 7246, 6933, 67142, 67141, 0, 74600, 120695, 0, 67138, 65574, 0, + 78058, 67140, 73851, 74598, 67139, 128094, 0, 6372, 0, 0, 7963, 6371, 0, + 0, 125040, 0, 0, 0, 0, 0, 0, 0, 8258, 123591, 0, 0, 65148, 118919, 42, 0, + 0, 0, 0, 0, 0, 0, 0, 67135, 67134, 67133, 0, 0, 0, 0, 67136, 67130, + 74597, 11550, 0, 67132, 65868, 0, 12826, 127872, 0, 126235, 9737, 92448, + 0, 0, 0, 8878, 0, 0, 0, 0, 0, 72220, 9086, 0, 0, 0, 7437, 7454, 0, 0, 0, + 0, 9042, 0, 0, 0, 0, 3805, 0, 67128, 44001, 67126, 0, 44022, 19949, + 12200, 43522, 983045, 43525, 0, 0, 0, 64422, 67125, 67124, 7602, 0, 0, + 43521, 0, 0, 43711, 43523, 41447, 8424, 68483, 8704, 2397, 0, 0, 0, 0, 0, + 10916, 0, 129290, 93998, 0, 0, 0, 127800, 67686, 9961, 123203, 0, 68842, + 10792, 8889, 121402, 6951, 0, 68827, 917835, 74342, 0, 0, 0, 68816, + 129152, 0, 42909, 66597, 70092, 0, 0, 10481, 4559, 0, 1956, 43138, 0, 0, + 43490, 43148, 0, 0, 0, 43140, 0, 0, 0, 0, 69268, 8533, 0, 0, 0, 0, 0, + 4357, 0, 70289, 983156, 0, 42911, 0, 0, 0, 10941, 0, 6962, 0, 0, 113808, + 0, 11014, 0, 8942, 12000, 0, 0, 0, 0, 0, 0, 42650, 0, 75016, 63975, 0, + 66210, 0, 0, 129150, 0, 11193, 0, 0, 0, 0, 0, 0, 0, 43476, 0, 11024, + 74811, 72787, 10563, 92954, 0, 0, 2462, 92955, 0, 0, 66213, 6957, 0, + 120559, 0, 0, 0, 74594, 983419, 92347, 0, 110702, 110708, 110707, 127119, + 3109, 127117, 119909, 0, 121434, 0, 0, 4042, 0, 0, 0, 127123, 127122, + 127121, 0, 127999, 0, 3503, 74444, 68300, 6694, 127997, 0, 0, 74306, 0, + 983738, 7736, 0, 0, 0, 10521, 0, 42173, 9705, 0, 0, 6955, 71467, 0, 6149, + 3887, 19956, 1411, 2824, 0, 0, 0, 1403, 0, 1347, 66282, 127996, 0, 0, 0, + 0, 8640, 0, 1178, 1654, 0, 0, 129529, 43314, 0, 0, 0, 0, 2873, 0, 0, 0, + 67085, 10861, 0, 0, 70377, 0, 67082, 11159, 41391, 67084, 0, 376, 6987, + 983181, 119904, 0, 8823, 0, 12943, 65185, 100988, 42099, 0, 0, 100990, 0, + 8301, 0, 0, 1684, 0, 0, 0, 120620, 0, 0, 0, 42121, 0, 66781, 78067, + 42115, 0, 127998, 0, 67080, 1493, 42111, 67077, 4097, 0, 983748, 0, + 65808, 41642, 0, 0, 67076, 41636, 67074, 65095, 110660, 72254, 121240, + 41629, 12154, 75073, 0, 128179, 74084, 64380, 0, 0, 0, 0, 0, 71193, + 65371, 7078, 0, 0, 0, 74592, 0, 0, 43275, 0, 41434, 6062, 0, 0, 19916, 0, + 6950, 9606, 9842, 0, 65744, 0, 0, 128659, 0, 41615, 10105, 0, 0, 41632, + 7493, 0, 0, 41622, 0, 0, 0, 0, 7632, 983215, 983214, 9805, 5990, 900, 0, + 983386, 0, 120869, 3612, 0, 64376, 0, 5389, 129469, 0, 0, 2839, 9621, 582, 0, 0, 3749, 0, 7569, 0, 0, 129472, 6956, 4403, 0, 0, 3299, 0, 0, - 119127, 65676, 0, 74373, 0, 983492, 7598, 69819, 42469, 42242, 1918, + 119127, 65676, 0, 74372, 0, 983492, 7598, 69819, 42469, 42242, 1918, 9542, 480, 7716, 0, 0, 0, 0, 0, 69918, 0, 8328, 0, 118894, 0, 0, 0, 0, 11132, 0, 66743, 74185, 100531, 2854, 66747, 0, 65755, 0, 67120, 67119, 65835, 67117, 66736, 67123, 67122, 67121, 9881, 100481, 65757, 100538, @@ -24188,17 +24993,17 @@ static const unsigned int code_hash[] = { 41998, 0, 6946, 77920, 0, 123610, 0, 0, 0, 121442, 42690, 9880, 0, 0, 64589, 0, 0, 127880, 68035, 0, 11360, 0, 0, 72242, 0, 0, 0, 0, 0, 64941, 0, 0, 0, 0, 65671, 11244, 73706, 6959, 41994, 42907, 0, 0, 122902, 8617, - 41982, 8860, 0, 0, 0, 0, 0, 9597, 0, 43172, 0, 10117, 0, 92297, 65865, 0, - 0, 128077, 0, 126065, 0, 187, 0, 65669, 0, 4963, 0, 0, 0, 8964, 0, 7775, - 0, 41948, 0, 0, 101010, 41942, 65449, 3160, 65922, 13226, 42665, 0, - 42663, 128210, 41766, 0, 78848, 78849, 41760, 1189, 905, 110620, 42658, - 78851, 67859, 9629, 6742, 0, 43625, 12952, 7888, 0, 3980, 0, 42656, 0, - 42055, 0, 0, 0, 64540, 0, 7867, 69218, 6236, 0, 0, 10505, 0, 12851, - 118948, 0, 5474, 128843, 3103, 0, 41753, 41733, 78051, 983472, 78844, - 78845, 41739, 78843, 70744, 10931, 41756, 43347, 68098, 122909, 41746, - 119147, 92591, 41259, 917848, 69930, 2691, 121338, 11231, 41244, 0, - 69800, 66364, 41262, 0, 0, 0, 41251, 0, 0, 11805, 0, 0, 68331, 94045, 0, - 0, 0, 74633, 41266, 126642, 0, 0, 0, 65741, 41737, 2275, 2666, 121232, + 41982, 8860, 0, 0, 121256, 0, 0, 9597, 0, 43172, 0, 10117, 0, 92297, + 65865, 0, 0, 128077, 0, 126065, 0, 187, 0, 65669, 0, 4963, 0, 0, 0, 8964, + 0, 7775, 0, 41948, 0, 0, 101010, 41942, 65449, 3160, 65922, 13226, 42665, + 0, 42663, 128210, 41766, 0, 78848, 78849, 41760, 1189, 905, 110620, + 42658, 78851, 67859, 9629, 6742, 0, 43625, 12952, 7888, 0, 3980, 0, + 42656, 0, 42055, 0, 0, 0, 64540, 0, 7867, 69218, 6236, 0, 0, 10505, 0, + 12851, 118948, 0, 5474, 128843, 3103, 0, 41753, 41733, 78051, 983472, + 78844, 78845, 41739, 78843, 70744, 10931, 41756, 43347, 68098, 122909, + 41746, 119147, 92591, 41259, 917848, 69930, 2691, 121338, 11231, 41244, + 0, 69800, 66364, 41262, 0, 0, 0, 41251, 0, 0, 11805, 0, 0, 68331, 94045, + 0, 0, 0, 74633, 41266, 126642, 0, 0, 0, 65741, 41737, 2275, 2666, 121232, 41738, 4967, 419, 13126, 0, 0, 42822, 0, 6434, 74913, 0, 0, 6432, 0, 69932, 128862, 769, 41742, 69927, 74805, 6433, 0, 547, 1943, 6439, 0, 4994, 487, 0, 0, 3754, 0, 0, 0, 0, 74780, 0, 0, 1595, 92777, 74431, 0, 0, @@ -24232,199 +25037,201 @@ static const unsigned int code_hash[] = { 120401, 12853, 43269, 7263, 120244, 6536, 120238, 120239, 65516, 12321, 120391, 120388, 55287, 2237, 120246, 9588, 120248, 120382, 120383, 120380, 120381, 0, 0, 3561, 0, 0, 10613, 0, 0, 0, 0, 0, 128689, 5006, - 64328, 68219, 917894, 0, 8825, 0, 0, 0, 0, 128616, 0, 119177, 0, 0, + 64328, 68219, 917894, 0, 8825, 129880, 0, 0, 0, 128616, 0, 119177, 0, 0, 128641, 120225, 71366, 120227, 120228, 438, 4510, 41707, 8721, 120233, 120234, 120235, 12840, 120229, 10845, 120231, 8096, 0, 120935, 0, 0, 65589, 8733, 0, 0, 0, 0, 0, 0, 93984, 11262, 73747, 128522, 0, 64591, - 42405, 0, 0, 1632, 127982, 128326, 0, 0, 0, 121477, 42444, 0, 0, 215, - 41258, 128494, 64494, 1953, 10185, 0, 1256, 3910, 41260, 917903, 0, 0, - 41257, 0, 8675, 10700, 0, 0, 0, 9333, 0, 121471, 0, 0, 0, 0, 0, 499, 0, - 70729, 42915, 0, 101000, 0, 100999, 0, 0, 73111, 0, 122897, 0, 125006, 0, - 11118, 0, 128009, 0, 0, 128980, 9180, 0, 0, 0, 100986, 43438, 0, 0, 0, 0, - 0, 120669, 64782, 0, 0, 73969, 565, 42484, 118913, 201, 0, 42292, 69610, - 0, 0, 119625, 43518, 0, 0, 1022, 113788, 3880, 74247, 0, 0, 0, 0, 0, 0, - 0, 0, 72272, 100997, 0, 0, 0, 74255, 0, 0, 92598, 0, 9903, 118993, 0, - 68226, 0, 0, 0, 127788, 100955, 83280, 7892, 0, 10777, 0, 0, 65562, 0, - 101002, 0, 8039, 3363, 101009, 0, 0, 0, 12596, 70812, 0, 0, 0, 0, 0, - 92425, 74992, 64541, 0, 0, 10520, 12802, 0, 12998, 0, 83270, 42861, - 83273, 11415, 0, 7541, 125068, 65878, 822, 0, 0, 5774, 194746, 43252, 0, - 92619, 7672, 129281, 0, 0, 7463, 0, 0, 0, 0, 0, 0, 121411, 0, 0, 0, 0, 0, - 475, 0, 120586, 7329, 0, 0, 195088, 66291, 10645, 0, 6543, 0, 0, 0, - 119065, 0, 0, 0, 983233, 195095, 0, 8923, 1645, 0, 0, 0, 3196, 72404, 0, - 0, 43595, 0, 0, 0, 0, 0, 195076, 0, 0, 5258, 4328, 0, 0, 0, 405, 11454, - 0, 0, 0, 0, 75052, 41245, 0, 0, 4523, 11369, 0, 0, 0, 195079, 0, 0, - 983505, 0, 100961, 10480, 74610, 0, 0, 0, 12610, 0, 41247, 0, 7609, - 118837, 0, 0, 92253, 0, 984, 0, 92621, 0, 0, 0, 983501, 0, 0, 0, 43369, - 0, 0, 0, 983502, 6634, 0, 0, 0, 0, 74214, 0, 67709, 0, 0, 0, 71114, 9552, - 0, 0, 0, 12997, 0, 0, 0, 0, 129109, 12883, 10994, 10529, 55283, 0, 74618, - 0, 67736, 10661, 19951, 9614, 2428, 0, 121023, 0, 126224, 100966, 71127, - 0, 124996, 119162, 1952, 92181, 8455, 100958, 0, 93033, 119566, 100960, - 0, 12183, 100951, 0, 64929, 0, 0, 0, 128290, 42509, 73087, 3922, 9187, - 983626, 0, 0, 119057, 0, 3353, 9358, 0, 0, 66680, 0, 73975, 12879, 0, - 9795, 68380, 0, 0, 0, 0, 0, 41027, 0, 0, 0, 983631, 0, 70378, 0, 11751, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129356, 0, 0, 0, 0, 41029, 0, 126513, 0, 0, - 0, 11294, 0, 66665, 0, 0, 127750, 0, 0, 70105, 0, 0, 0, 67843, 0, 0, - 121167, 983876, 0, 8088, 129412, 0, 0, 0, 983973, 6926, 72423, 0, 129569, - 42369, 4350, 0, 65145, 9041, 43559, 0, 0, 0, 41263, 0, 0, 0, 65825, 9577, - 68199, 0, 0, 983121, 0, 6793, 0, 70409, 0, 0, 0, 0, 64669, 0, 0, 0, - 11200, 72725, 2995, 0, 0, 0, 7868, 72720, 983560, 11386, 1009, 70405, - 66871, 2333, 0, 0, 0, 0, 0, 70407, 128121, 0, 0, 0, 0, 0, 0, 0, 74968, 0, - 0, 110601, 0, 0, 41261, 0, 0, 0, 0, 118989, 6736, 917883, 0, 43010, - 127889, 0, 69635, 73011, 983697, 0, 0, 7293, 0, 0, 0, 0, 111332, 0, - 128245, 69928, 0, 0, 127072, 64445, 111336, 6635, 0, 0, 72707, 74936, 0, - 0, 917876, 0, 93025, 0, 0, 111329, 0, 0, 128045, 65219, 11925, 0, 92434, - 0, 0, 9845, 0, 7546, 0, 0, 11230, 4985, 13288, 672, 8098, 0, 0, 0, - 128126, 42655, 0, 0, 1577, 11772, 78327, 0, 66673, 0, 65911, 122908, 0, - 0, 129391, 92180, 0, 0, 0, 125140, 0, 0, 0, 119593, 1539, 0, 74969, - 42731, 0, 74970, 71066, 0, 3051, 0, 73783, 0, 0, 0, 0, 78777, 0, 983160, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3505, 8707, 0, 6725, 128013, 0, 92314, 0, - 66391, 5479, 0, 6686, 0, 0, 983313, 42754, 0, 0, 0, 0, 0, 0, 128523, 0, - 0, 4433, 41156, 0, 74971, 1443, 9339, 0, 0, 10926, 0, 43511, 0, 0, - 983319, 0, 126086, 72236, 10021, 0, 0, 0, 65914, 0, 66749, 0, 6721, 217, - 12466, 0, 0, 10443, 0, 68654, 0, 0, 0, 78334, 0, 41250, 0, 129532, 0, 0, - 0, 69232, 0, 41252, 66682, 0, 119637, 41249, 1366, 0, 0, 0, 0, 0, 4397, - 0, 0, 0, 9545, 121219, 0, 0, 0, 3511, 0, 92190, 0, 0, 126244, 760, 0, - 12088, 0, 0, 42256, 0, 0, 417, 0, 111347, 41565, 74965, 0, 111355, 0, 0, - 0, 2284, 0, 0, 983257, 0, 0, 0, 0, 0, 0, 42273, 0, 69430, 0, 0, 126643, - 0, 65910, 0, 10246, 0, 68224, 12169, 128858, 4552, 0, 0, 0, 1375, 66705, + 42405, 0, 0, 1632, 127982, 128326, 0, 0, 121327, 121477, 42444, 0, 0, + 215, 41258, 128494, 64494, 1953, 10185, 0, 1256, 3910, 41260, 917903, 0, + 0, 41257, 0, 8675, 10700, 0, 124951, 0, 9333, 0, 121471, 0, 0, 0, 0, 0, + 499, 0, 70729, 42915, 0, 101000, 0, 100999, 0, 0, 73111, 0, 122897, 0, + 125006, 0, 11118, 0, 128009, 0, 0, 128980, 9180, 0, 0, 0, 100986, 43438, + 0, 0, 0, 0, 0, 120669, 64782, 0, 0, 73969, 565, 42484, 118913, 201, 0, + 42292, 69610, 0, 0, 119625, 43518, 0, 0, 1022, 113788, 3880, 74247, 0, 0, + 0, 0, 0, 0, 0, 0, 72272, 100997, 0, 0, 0, 74255, 0, 0, 92598, 0, 9903, + 118993, 0, 68226, 0, 0, 0, 127788, 100955, 83280, 7892, 0, 10777, 0, 0, + 65562, 0, 101002, 0, 8039, 3363, 101009, 0, 0, 0, 12596, 70812, 0, 0, 0, + 0, 71962, 92425, 74992, 64541, 0, 0, 10520, 12802, 0, 12998, 0, 83270, + 42861, 83273, 11415, 0, 7541, 125068, 65878, 822, 0, 0, 5774, 194746, + 43252, 0, 92619, 7672, 129281, 0, 0, 7463, 0, 0, 0, 0, 0, 0, 121411, 0, + 0, 0, 0, 0, 475, 0, 120586, 7329, 0, 0, 195088, 66291, 10645, 0, 6543, 0, + 0, 0, 119065, 0, 0, 0, 983233, 195095, 0, 8923, 1645, 0, 0, 0, 3196, + 72404, 0, 0, 43595, 0, 0, 0, 0, 0, 195076, 0, 0, 5258, 4328, 0, 0, 0, + 405, 11454, 0, 0, 0, 0, 75052, 41245, 0, 195078, 4523, 11369, 0, 0, 0, + 195079, 0, 0, 983505, 0, 100961, 10480, 74610, 0, 0, 0, 12610, 0, 41247, + 0, 7609, 118837, 0, 0, 92253, 0, 984, 0, 92621, 0, 0, 129885, 73982, 0, + 0, 0, 43369, 0, 0, 0, 983502, 6634, 0, 71952, 0, 0, 74214, 0, 67709, 0, + 0, 0, 71114, 9552, 0, 0, 0, 12997, 0, 0, 0, 0, 129109, 12883, 10994, + 10529, 55283, 0, 74618, 0, 67736, 10661, 19951, 9614, 2428, 0, 121023, 0, + 126224, 100966, 71127, 0, 124996, 119162, 1952, 92181, 8455, 100958, 0, + 93033, 119566, 100960, 0, 12183, 100951, 0, 64929, 0, 0, 0, 128290, + 42509, 73087, 3922, 9187, 983626, 0, 0, 119057, 0, 3353, 9358, 0, 0, + 66680, 0, 73975, 12879, 0, 9795, 68380, 0, 0, 0, 0, 0, 41027, 0, 0, 0, + 983631, 0, 70378, 0, 11751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129356, 0, 0, + 0, 0, 41029, 0, 126513, 0, 0, 0, 11294, 0, 66665, 0, 0, 127750, 0, 0, + 70105, 0, 0, 0, 67843, 0, 0, 121167, 983876, 0, 8088, 129412, 0, 0, 0, + 983973, 6926, 72423, 0, 129569, 42369, 4350, 0, 65145, 9041, 43559, 0, 0, + 0, 41263, 0, 0, 0, 65825, 9577, 68199, 0, 0, 983121, 0, 6793, 0, 70409, + 0, 0, 0, 0, 64669, 0, 0, 0, 11200, 72725, 2995, 0, 0, 0, 7868, 72720, + 72020, 11386, 1009, 70405, 66871, 2333, 0, 0, 0, 0, 0, 70407, 128121, 0, + 0, 0, 0, 0, 0, 0, 74968, 0, 0, 110601, 0, 0, 41261, 0, 0, 0, 0, 118989, + 6736, 917883, 0, 43010, 127889, 0, 69635, 73011, 983697, 0, 0, 7293, 0, + 0, 0, 0, 111332, 0, 128245, 69928, 0, 0, 127072, 64445, 111336, 6635, 0, + 0, 72707, 74936, 0, 0, 917876, 0, 93025, 0, 0, 111329, 0, 129887, 128045, + 65219, 11925, 0, 92434, 0, 0, 9845, 101317, 7546, 0, 0, 11230, 4985, + 13288, 672, 8098, 0, 0, 0, 128126, 42655, 0, 0, 1577, 11772, 78327, 0, + 66673, 0, 65911, 122908, 0, 0, 101303, 92180, 0, 0, 120566, 125140, 0, 0, + 0, 119593, 1539, 0, 74969, 42731, 0, 74970, 71066, 0, 3051, 0, 73783, 0, + 0, 0, 0, 78777, 0, 983160, 0, 0, 101310, 0, 0, 0, 0, 0, 0, 3505, 8707, 0, + 6725, 128013, 0, 92314, 0, 66391, 5479, 0, 6686, 0, 0, 983313, 42754, 0, + 0, 0, 0, 0, 0, 128523, 0, 0, 4433, 41156, 0, 74971, 1443, 9339, 0, 0, + 10926, 0, 43511, 0, 0, 983319, 0, 126086, 72236, 10021, 0, 101329, 0, + 65914, 0, 66749, 0, 6721, 217, 12466, 0, 0, 10443, 0, 68654, 0, 0, 0, + 78334, 0, 41250, 0, 129532, 128375, 0, 0, 69232, 0, 41252, 66682, 0, + 119637, 41249, 1366, 0, 0, 101326, 0, 0, 4397, 101324, 0, 0, 9545, + 101323, 0, 0, 0, 3511, 0, 92190, 0, 0, 126244, 760, 0, 12088, 0, 0, + 42256, 0, 0, 417, 0, 111347, 41565, 74965, 0, 111355, 0, 0, 0, 2284, 0, + 0, 983257, 0, 0, 0, 0, 0, 0, 42273, 0, 69430, 121041, 0, 126643, 0, + 65910, 0, 10246, 0, 68224, 12169, 128858, 4552, 0, 0, 0, 1375, 66705, 128412, 0, 3329, 0, 42811, 74251, 74192, 120794, 7840, 0, 0, 65374, 0, 0, 71072, 0, 4396, 0, 126608, 0, 10331, 125224, 0, 11543, 0, 8944, 0, 0, 0, 0, 0, 19965, 43025, 10299, 128436, 68845, 0, 69724, 67412, 92952, 0, - 43811, 0, 128924, 0, 11062, 128748, 0, 0, 0, 78364, 0, 7865, 0, 78354, 0, - 78347, 0, 0, 0, 66363, 0, 0, 0, 74967, 7414, 0, 0, 92691, 0, 128507, 885, - 64772, 65180, 0, 71267, 852, 0, 0, 0, 78614, 121174, 129092, 67809, 9609, - 12156, 0, 0, 43586, 11035, 10411, 0, 13268, 6710, 0, 0, 0, 43853, 77949, - 4315, 0, 111104, 0, 43639, 43343, 0, 0, 0, 73074, 0, 65812, 43431, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 994, 125222, 127104, 127103, 73966, 66890, 0, - 65291, 0, 0, 0, 0, 0, 66873, 4186, 92531, 127106, 127105, 6718, 7330, - 4406, 0, 8480, 7319, 64373, 128699, 4413, 0, 0, 3198, 0, 0, 92469, - 111126, 0, 128591, 128681, 0, 0, 0, 0, 73023, 742, 0, 2893, 78738, 0, 0, - 0, 2553, 42294, 6756, 0, 73020, 8363, 0, 2993, 128381, 3916, 4301, 0, - 1141, 42407, 0, 0, 7572, 973, 0, 125077, 0, 2415, 0, 0, 9640, 42333, 0, - 0, 129546, 42486, 43381, 65390, 0, 69434, 1202, 0, 0, 0, 0, 68484, 0, 0, - 64542, 3260, 0, 65388, 43502, 69904, 0, 6738, 0, 0, 74193, 0, 0, 0, - 74641, 6312, 0, 74556, 12446, 0, 0, 128076, 8229, 1235, 0, 11472, 83064, - 0, 0, 0, 0, 0, 1740, 12872, 0, 985, 0, 0, 0, 12068, 0, 0, 0, 0, 0, 0, - 13133, 65071, 110780, 12655, 12134, 0, 92934, 0, 66915, 120349, 119572, - 0, 93030, 41572, 0, 0, 0, 41573, 0, 3931, 0, 74143, 0, 127034, 0, 0, 0, - 0, 83067, 0, 129303, 0, 0, 0, 0, 0, 0, 83068, 0, 72740, 128637, 72717, - 92935, 120291, 0, 1780, 6936, 0, 0, 819, 0, 9694, 125228, 0, 0, 0, 0, - 8343, 8342, 8345, 8344, 8346, 8338, 7523, 6922, 8348, 8347, 7525, 3346, - 8339, 125004, 72705, 69462, 268, 0, 0, 5754, 0, 0, 110684, 8336, 0, 0, 0, - 8337, 8341, 0, 11388, 7522, 0, 0, 0, 11090, 6953, 125240, 0, 74973, - 120708, 0, 0, 0, 0, 0, 110782, 0, 9038, 7887, 0, 0, 42534, 64347, 0, 0, - 67660, 120341, 0, 0, 0, 120878, 0, 0, 73999, 0, 64580, 0, 0, 64643, 0, 0, - 74975, 0, 92227, 129052, 0, 83071, 83072, 83073, 119154, 0, 119153, 0, 0, - 5349, 72440, 0, 917554, 7411, 0, 983220, 0, 0, 0, 42736, 70747, 5756, - 983225, 92946, 0, 42764, 0, 0, 119529, 5752, 120600, 0, 0, 0, 0, 0, - 78893, 0, 0, 0, 125242, 0, 0, 120331, 0, 0, 0, 72826, 0, 10080, 83056, - 12647, 0, 0, 0, 66882, 0, 0, 0, 0, 0, 128351, 72845, 0, 0, 0, 0, 0, - 74213, 0, 0, 0, 0, 0, 6302, 0, 0, 0, 0, 1417, 983222, 0, 9452, 0, 74393, - 0, 0, 110850, 0, 65391, 63789, 0, 78659, 78660, 41264, 78658, 6426, - 42398, 9179, 78654, 64906, 41255, 42036, 0, 41269, 0, 41267, 42436, - 67759, 42323, 42034, 0, 0, 42475, 42033, 0, 0, 68916, 43948, 0, 78673, - 78674, 1659, 919, 42784, 1671, 0, 6069, 9219, 0, 1661, 0, 0, 92690, - 10140, 9713, 78400, 0, 125236, 0, 2306, 0, 0, 6068, 10612, 0, 0, 121314, - 92561, 41462, 0, 0, 0, 0, 0, 0, 0, 128204, 10635, 0, 983221, 0, 0, 0, - 983231, 92251, 0, 121029, 983223, 0, 8100, 0, 78669, 78670, 13301, 78667, - 9667, 78665, 0, 0, 11003, 9904, 0, 0, 0, 0, 0, 0, 78680, 78681, 78677, - 78678, 0, 10313, 0, 0, 64320, 10265, 78686, 129404, 78684, 78685, 8945, - 78683, 70750, 41, 0, 0, 0, 0, 8655, 0, 0, 0, 0, 0, 0, 0, 2585, 0, 65254, - 3126, 0, 74136, 10957, 0, 11160, 0, 0, 0, 0, 0, 11408, 0, 7443, 0, 0, - 6997, 68004, 0, 0, 8739, 11075, 0, 65216, 0, 69795, 2593, 0, 0, 0, 0, - 125062, 0, 0, 0, 4411, 0, 72837, 0, 43442, 78799, 0, 0, 0, 66351, 0, 0, - 13061, 0, 78687, 78688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119925, 0, - 983637, 0, 0, 0, 0, 83399, 127541, 83398, 8022, 78808, 0, 73794, 0, 0, - 83414, 119918, 0, 0, 0, 0, 0, 0, 63799, 78427, 12063, 78425, 78424, 0, 0, - 0, 75025, 0, 297, 0, 0, 68326, 0, 78429, 78428, 7077, 2497, 128651, 0, - 983111, 0, 0, 0, 4292, 0, 74815, 10512, 0, 74814, 119931, 0, 72841, 2503, - 73778, 1762, 69794, 2495, 0, 71230, 94069, 77984, 0, 12654, 0, 1899, 0, - 2507, 0, 8726, 0, 65594, 0, 71272, 8892, 0, 0, 0, 0, 0, 420, 0, 0, - 125130, 10797, 74637, 0, 0, 0, 0, 63796, 0, 66581, 0, 119205, 0, 0, - 194840, 0, 120788, 0, 0, 92956, 0, 0, 0, 0, 119230, 0, 0, 83496, 7399, 0, - 66434, 42779, 0, 92220, 42197, 92543, 5380, 0, 0, 1155, 11365, 43126, 0, - 77971, 65684, 0, 5601, 0, 42765, 78258, 0, 7987, 72843, 0, 69799, 0, 0, - 78735, 119165, 0, 0, 4473, 0, 72426, 0, 65347, 65346, 65345, 0, 127384, - 0, 69802, 0, 73868, 0, 64826, 0, 0, 0, 0, 6218, 78422, 69676, 4555, 0, - 83459, 70071, 128670, 65190, 0, 0, 65244, 0, 0, 42519, 74472, 0, 0, - 83466, 0, 0, 0, 83468, 92581, 0, 0, 65370, 65369, 65368, 65367, 65366, - 65365, 41086, 65363, 65362, 65361, 65360, 43410, 11323, 65357, 65356, - 65355, 5345, 65353, 65352, 65351, 761, 65349, 19959, 69718, 0, 0, 0, 0, - 64647, 0, 0, 4699, 126077, 0, 0, 0, 0, 0, 68074, 0, 0, 0, 128347, 0, - 72829, 0, 69773, 121438, 0, 0, 0, 73980, 78255, 78254, 83453, 43157, 0, - 0, 0, 7946, 12541, 0, 74615, 69780, 0, 0, 0, 0, 9005, 1225, 0, 0, 0, 0, - 68011, 8847, 0, 0, 0, 8329, 74590, 43878, 0, 0, 0, 3127, 2595, 71040, - 69766, 129188, 0, 41089, 0, 0, 70292, 983613, 12112, 0, 74200, 0, 8764, - 0, 0, 0, 67273, 67272, 67271, 71044, 0, 0, 0, 71042, 67266, 67265, 0, - 67270, 67269, 67268, 67267, 67282, 67281, 67280, 3572, 10023, 4959, 0, 0, - 67275, 9729, 125110, 0, 67278, 67277, 0, 67276, 0, 7996, 9907, 0, 13304, - 83392, 0, 72830, 0, 11095, 11100, 0, 83358, 83387, 10142, 0, 0, 0, 0, - 68022, 0, 83363, 128292, 19955, 0, 83366, 69807, 125246, 70124, 0, 72230, - 83373, 83385, 0, 0, 0, 0, 68020, 0, 0, 261, 8406, 7791, 0, 7362, 0, - 10696, 0, 0, 9838, 118920, 0, 83477, 0, 0, 0, 6437, 68830, 83476, 0, 0, - 74177, 0, 0, 67288, 67287, 0, 67286, 0, 83470, 0, 67289, 67283, 83471, - 70002, 0, 0, 0, 67285, 11499, 67297, 7816, 67295, 55247, 68015, 10929, - 67298, 0, 68017, 9642, 10912, 0, 67293, 11387, 67291, 67290, 70792, 0, - 67715, 0, 0, 68099, 13287, 74430, 10836, 0, 75053, 69775, 0, 128746, - 7450, 0, 0, 119648, 9697, 3606, 0, 0, 0, 0, 125029, 0, 0, 121262, 0, - 128873, 1389, 128871, 0, 0, 0, 12941, 0, 83438, 121062, 0, 12301, 83440, - 0, 41102, 66604, 0, 0, 0, 0, 66600, 523, 92642, 71100, 74436, 0, 0, 0, - 8608, 83435, 72828, 128704, 0, 127402, 11307, 66707, 67301, 67300, 67299, - 0, 67304, 67303, 0, 0, 0, 0, 127212, 5908, 0, 0, 6744, 67310, 1699, - 67308, 67307, 67314, 67313, 6306, 67311, 983207, 72150, 69862, 3766, - 2389, 67305, 74569, 6611, 65700, 0, 0, 0, 42386, 0, 0, 2599, 917972, - 119131, 119049, 65717, 0, 0, 119654, 0, 0, 0, 74203, 3760, 1718, 68160, - 0, 3776, 7335, 0, 0, 67324, 69861, 0, 69792, 0, 0, 3778, 0, 9462, 7824, - 0, 78896, 3768, 68142, 765, 72822, 3764, 0, 0, 113822, 0, 12947, 0, 0, 0, - 118806, 73753, 0, 0, 0, 6829, 5225, 66901, 0, 0, 0, 0, 67319, 67318, - 3162, 67316, 67323, 67322, 67321, 67320, 0, 5353, 0, 74179, 67315, 0, - 1010, 0, 0, 67326, 67325, 127870, 6952, 67329, 67328, 67327, 2590, - 120036, 65552, 120034, 120039, 7183, 120037, 120038, 120027, 120028, - 120025, 120026, 120031, 970, 120029, 74611, 120019, 120020, 120017, - 67330, 120023, 120024, 120021, 10961, 113693, 11148, 0, 0, 0, 128448, 0, - 113703, 64378, 0, 0, 0, 68821, 119649, 11358, 71172, 69797, 0, 11065, - 126464, 0, 68864, 0, 5694, 120839, 66784, 0, 4325, 3047, 0, 43652, - 120962, 93029, 69764, 0, 0, 0, 0, 5431, 6652, 0, 67753, 71460, 0, 0, 0, - 1129, 65016, 0, 65900, 1986, 7846, 0, 8661, 75058, 0, 0, 3845, 0, 0, 0, - 74400, 1456, 7530, 121382, 0, 0, 0, 0, 120016, 0, 0, 0, 917863, 127772, - 119966, 0, 11002, 7026, 8145, 68216, 0, 12138, 71464, 0, 0, 0, 12323, 0, - 917869, 0, 0, 0, 92316, 68494, 0, 0, 129384, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 42205, 0, 236, 0, 78867, 0, 0, 113784, 0, 0, 983982, 0, 0, 0, 8097, 0, - 0, 68012, 72820, 11194, 0, 72824, 0, 127974, 0, 0, 110603, 0, 10416, - 68070, 3872, 127508, 0, 0, 0, 0, 2838, 917867, 0, 917866, 119589, 0, 0, - 0, 0, 11096, 83019, 10553, 83421, 0, 0, 0, 0, 0, 0, 73742, 6436, 10096, - 0, 0, 0, 113687, 0, 4463, 68018, 0, 78074, 0, 983591, 7184, 0, 0, 0, 0, - 0, 0, 93825, 12818, 12032, 0, 0, 0, 0, 10357, 121418, 8170, 0, 8556, 0, - 9659, 0, 0, 0, 9556, 0, 4503, 92700, 9647, 64004, 78185, 0, 0, 64002, - 78889, 0, 0, 118910, 0, 6438, 0, 9109, 78884, 0, 64599, 0, 68009, 0, 0, - 2447, 0, 0, 0, 126545, 0, 119002, 0, 0, 0, 19937, 0, 1322, 0, 119204, - 254, 0, 0, 69392, 42425, 0, 0, 65204, 42312, 0, 128519, 0, 42826, 0, - 42464, 120567, 0, 67155, 74796, 64400, 64693, 126212, 77861, 0, 0, 67154, - 0, 0, 0, 68008, 11785, 0, 119142, 41978, 0, 0, 43244, 10536, 0, 9901, - 7103, 0, 7102, 71428, 120748, 3140, 0, 0, 68007, 0, 67258, 10909, 0, - 1428, 0, 67254, 67253, 7699, 12393, 67257, 0, 67256, 67255, 0, 0, 69389, - 0, 0, 0, 0, 0, 67153, 0, 0, 127383, 69376, 64554, 0, 3878, 0, 42352, - 1752, 0, 0, 42506, 0, 10199, 0, 983463, 125231, 0, 0, 0, 720, 0, 0, 0, - 68831, 0, 1464, 128339, 0, 7974, 0, 125017, 68082, 0, 0, 0, 0, 74787, 0, - 78865, 92258, 0, 0, 78863, 0, 1302, 66288, 0, 0, 0, 67152, 0, 983611, - 983618, 0, 0, 3995, 0, 65608, 3714, 0, 0, 67262, 67261, 67260, 67259, - 43251, 67264, 67263, 0, 120557, 92346, 8672, 68006, 11964, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 92610, 0, 468, 0, 0, 0, 983470, 0, 0, 128544, 129397, - 65907, 983163, 0, 0, 0, 0, 0, 983468, 41743, 0, 0, 0, 74880, 0, 121001, - 820, 41741, 0, 120667, 0, 64684, 126992, 128604, 126082, 69934, 65177, - 6226, 353, 43645, 0, 119612, 120738, 67700, 0, 0, 0, 0, 42457, 120276, 0, - 120277, 1884, 129637, 42418, 113678, 41157, 0, 42305, 120279, 0, 0, - 41151, 0, 71430, 0, 42344, 0, 0, 0, 42497, 0, 194870, 72754, 69933, - 73703, 0, 42521, 8539, 128606, 0, 123609, 69957, 4788, 0, 68023, 0, 0, - 983053, 0, 0, 0, 0, 41590, 0, 113754, 0, 0, 118901, 68637, 41136, 64351, - 0, 128453, 41154, 113731, 127038, 4038, 41143, 68232, 64859, 0, 0, 0, - 5435, 0, 6734, 41343, 127035, 0, 0, 41359, 66761, 0, 119835, 41349, 0, 0, - 10374, 10310, 0, 0, 10254, 119836, 10278, 10262, 69858, 41363, 0, 0, 0, - 119840, 0, 41356, 10314, 10282, 0, 10378, 0, 40976, 10266, 0, 119848, - 40975, 0, 129554, 0, 40978, 0, 92945, 0, 0, 0, 119098, 119083, 0, 71437, - 119854, 69936, 0, 0, 3525, 6824, 0, 0, 119858, 128451, 0, 72239, 113738, - 0, 71424, 0, 0, 0, 0, 0, 10727, 7212, 129071, 120551, 0, 0, 0, 67156, - 808, 7207, 42387, 0, 0, 0, 0, 0, 0, 0, 0, 9225, 121149, 0, 9145, 128060, + 43811, 0, 128924, 0, 11062, 128748, 0, 0, 0, 69276, 2901, 7865, 0, 78354, + 0, 78347, 0, 126123, 0, 66363, 0, 0, 0, 74967, 7414, 0, 0, 92691, 0, + 128507, 885, 64772, 65180, 0, 71267, 852, 0, 0, 0, 78614, 121174, 129092, + 67809, 9609, 12156, 0, 0, 43586, 11035, 10411, 0, 13268, 6710, 0, 0, 0, + 43853, 77949, 4315, 0, 111104, 0, 43639, 43343, 0, 0, 0, 73074, 0, 65812, + 43431, 0, 0, 0, 0, 0, 129890, 0, 0, 0, 0, 994, 125222, 127104, 127103, + 73966, 66890, 0, 65291, 70753, 0, 0, 0, 0, 66873, 4186, 92531, 127106, + 127105, 6718, 7330, 4406, 0, 8480, 7319, 64373, 128699, 4413, 0, 0, 3198, + 0, 0, 92469, 111126, 0, 128591, 128681, 0, 0, 0, 101321, 73023, 742, 0, + 2893, 78738, 0, 0, 0, 2553, 42294, 6756, 0, 73020, 8363, 0, 2993, 128381, + 3916, 4301, 0, 1141, 42407, 0, 0, 7572, 973, 0, 125077, 0, 2415, 0, 0, + 9640, 42333, 0, 0, 129546, 42486, 43381, 65390, 0, 69434, 1202, 0, 0, 0, + 0, 68484, 0, 0, 64542, 3260, 0, 65388, 43502, 69904, 0, 6738, 0, 0, + 74193, 0, 0, 0, 74641, 6312, 0, 74556, 12446, 0, 0, 128076, 8229, 1235, + 0, 11472, 83064, 0, 0, 101366, 0, 0, 1740, 12872, 0, 985, 0, 0, 0, 12068, + 0, 0, 101363, 0, 0, 0, 13133, 65071, 110780, 12655, 12134, 0, 92934, 0, + 66915, 120349, 119572, 0, 93030, 41572, 0, 0, 0, 41573, 0, 3931, 0, + 74143, 0, 127034, 0, 0, 0, 0, 83067, 0, 129303, 0, 0, 0, 0, 0, 0, 83068, + 0, 72740, 128637, 72717, 92935, 120291, 0, 1780, 6936, 0, 0, 819, 0, + 9694, 125228, 0, 0, 0, 0, 8343, 8342, 8345, 8344, 8346, 8338, 7523, 6922, + 8348, 8347, 7525, 3346, 8339, 125004, 72705, 69462, 268, 0, 0, 5754, 0, + 0, 110684, 8336, 0, 0, 0, 8337, 8341, 0, 11388, 7522, 0, 0, 0, 11090, + 6953, 125240, 0, 74973, 120708, 0, 0, 0, 0, 0, 110782, 0, 9038, 7887, 0, + 0, 42534, 64347, 0, 0, 67660, 120341, 0, 0, 0, 120878, 0, 0, 73999, 0, + 64580, 0, 0, 64643, 0, 0, 74975, 0, 92227, 129052, 0, 83071, 83072, + 83073, 119154, 0, 119153, 0, 0, 5349, 72440, 0, 917554, 7411, 0, 983220, + 0, 0, 0, 42736, 70747, 5756, 983225, 92946, 0, 42764, 0, 0, 119529, 5752, + 120600, 0, 0, 0, 0, 0, 78893, 0, 0, 0, 125242, 0, 0, 120331, 0, 0, 0, + 72826, 0, 10080, 83056, 12647, 0, 0, 69252, 66882, 0, 0, 0, 0, 0, 72005, + 72845, 0, 0, 0, 0, 0, 74213, 0, 0, 0, 0, 0, 6302, 0, 0, 0, 0, 1417, + 983222, 0, 9452, 0, 74393, 0, 0, 110850, 0, 65391, 63789, 69251, 78659, + 78660, 41264, 78658, 6426, 42398, 9179, 78654, 64906, 41255, 42036, 0, + 41269, 0, 41267, 42436, 67759, 42323, 42034, 0, 0, 42475, 42033, 0, 0, + 68916, 43948, 0, 78673, 78674, 1659, 919, 42784, 1671, 0, 6069, 9219, 0, + 1661, 119144, 0, 92690, 10140, 9713, 78400, 0, 125236, 0, 2306, 0, 0, + 6068, 10612, 0, 0, 121314, 92561, 41462, 0, 0, 0, 0, 0, 0, 0, 128204, + 10635, 0, 983221, 0, 0, 0, 983231, 92251, 0, 121029, 983223, 0, 8100, 0, + 78669, 78670, 13301, 78667, 9667, 78665, 0, 0, 11003, 9904, 0, 0, 0, 0, + 0, 0, 78680, 78681, 78677, 78678, 0, 10313, 0, 0, 64320, 10265, 78686, + 129404, 78684, 78685, 8945, 78683, 70750, 41, 0, 0, 0, 0, 8655, 0, 0, 0, + 0, 0, 0, 0, 2585, 0, 65254, 3126, 0, 74136, 10957, 0, 11160, 0, 0, 0, 0, + 0, 11408, 0, 7443, 0, 0, 6997, 68004, 0, 0, 8739, 11075, 0, 65216, 0, + 69795, 2593, 0, 0, 0, 0, 125062, 0, 0, 0, 4411, 0, 72837, 0, 43442, + 78799, 0, 0, 0, 66351, 0, 0, 13061, 0, 78687, 78688, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 119925, 0, 983637, 0, 0, 0, 0, 83399, 127541, 83398, 8022, + 78808, 0, 73794, 0, 0, 83414, 119918, 0, 0, 0, 0, 0, 0, 63799, 78427, + 12063, 78425, 78424, 0, 0, 0, 75025, 0, 297, 0, 0, 68326, 0, 78429, + 78428, 7077, 2497, 128651, 0, 983111, 0, 0, 0, 4292, 0, 74815, 10512, 0, + 74814, 119931, 0, 72841, 2503, 65070, 1762, 69794, 2495, 0, 71230, 94069, + 77984, 0, 12654, 0, 1899, 0, 2507, 0, 8726, 0, 65594, 0, 71272, 8892, 0, + 0, 0, 0, 0, 420, 0, 0, 125130, 10797, 74637, 0, 0, 0, 0, 63796, 0, 66581, + 0, 119205, 0, 0, 194840, 0, 120788, 0, 0, 92956, 0, 0, 0, 0, 119230, 0, + 0, 83496, 7399, 0, 66434, 42779, 0, 92220, 42197, 92543, 5380, 0, 0, + 1155, 11365, 43126, 0, 77971, 65684, 0, 5601, 0, 42765, 78258, 0, 7987, + 72843, 0, 69799, 0, 0, 78735, 119165, 0, 0, 4473, 0, 72426, 0, 65347, + 65346, 65345, 0, 127384, 0, 69802, 0, 73868, 0, 64826, 0, 0, 0, 0, 6218, + 78422, 69676, 4555, 0, 83459, 70071, 128670, 65190, 0, 0, 65244, 0, 0, + 42519, 74472, 0, 0, 83466, 0, 0, 0, 83468, 92581, 0, 0, 65370, 65369, + 65368, 65367, 65366, 65365, 41086, 65363, 65362, 65361, 65360, 43410, + 11323, 65357, 65356, 65355, 5345, 65353, 65352, 65351, 761, 65349, 19959, + 69718, 0, 0, 0, 0, 64647, 0, 0, 4699, 126077, 0, 129940, 0, 0, 0, 68074, + 0, 0, 0, 128347, 0, 72829, 0, 69773, 121438, 0, 0, 0, 73980, 78255, + 78254, 83453, 43157, 0, 0, 0, 7946, 12541, 0, 74615, 69780, 0, 0, 0, 0, + 9005, 1225, 0, 0, 0, 0, 68011, 8847, 0, 0, 0, 8329, 74590, 43878, 0, 0, + 0, 3127, 2595, 71040, 69766, 129188, 0, 41089, 0, 0, 70292, 983613, + 12112, 0, 74200, 0, 8764, 0, 0, 0, 67273, 67272, 67271, 71044, 0, 0, 0, + 71042, 67266, 67265, 0, 67270, 67269, 67268, 67267, 67282, 67281, 67280, + 3572, 10023, 4959, 0, 0, 67275, 9729, 125110, 0, 67278, 67277, 0, 67276, + 0, 7996, 9907, 0, 13304, 83392, 0, 72830, 0, 11095, 11100, 0, 83358, + 83387, 10142, 0, 0, 0, 0, 68022, 0, 83363, 128292, 19955, 0, 83366, + 69807, 125246, 70124, 0, 72230, 83373, 83385, 0, 0, 0, 0, 68020, 0, 2239, + 261, 8406, 7791, 0, 7362, 0, 10696, 0, 0, 9838, 118920, 0, 83477, 0, 0, + 0, 6437, 68830, 83476, 0, 0, 74177, 0, 0, 67288, 67287, 0, 67286, 0, + 83470, 0, 67289, 67283, 83471, 70002, 0, 0, 0, 67285, 11499, 67297, 7816, + 67295, 55247, 68015, 10929, 67298, 0, 68017, 9642, 10912, 0, 67293, + 11387, 67291, 67290, 70792, 0, 67715, 0, 0, 68099, 13287, 74430, 10836, + 0, 75053, 69775, 0, 128746, 7450, 0, 0, 119648, 9697, 3606, 0, 0, 0, 0, + 125029, 0, 0, 121262, 0, 128873, 1389, 128871, 0, 0, 0, 12941, 0, 83438, + 121062, 0, 12301, 83440, 0, 41102, 66604, 72025, 0, 0, 0, 66600, 523, + 92642, 71100, 74436, 0, 0, 0, 8608, 83435, 72828, 128704, 0, 127402, + 11307, 66707, 67301, 67300, 67299, 0, 67304, 67303, 0, 0, 0, 0, 127212, + 5908, 0, 0, 6744, 67310, 1699, 67308, 67307, 67314, 67313, 6306, 67311, + 983207, 72150, 69862, 3766, 2389, 67305, 74569, 6611, 65700, 0, 0, 0, + 42386, 0, 0, 2599, 917972, 119131, 119049, 65717, 0, 0, 119654, 0, 0, 0, + 74203, 3760, 1718, 68160, 0, 3776, 7335, 0, 0, 67324, 69861, 0, 69792, 0, + 0, 3778, 0, 9462, 7824, 0, 78896, 3768, 68142, 765, 72822, 3764, 0, 0, + 113822, 129667, 12947, 0, 0, 0, 118806, 73753, 0, 0, 0, 6829, 5225, + 66901, 0, 0, 0, 0, 67319, 67318, 3162, 67316, 67323, 67322, 67321, 67320, + 0, 5353, 0, 74179, 67315, 0, 1010, 0, 0, 67326, 67325, 127870, 6952, + 67329, 67328, 67327, 2590, 120036, 65552, 120034, 120039, 7183, 120037, + 120038, 120027, 120028, 120025, 120026, 120031, 970, 120029, 74611, + 120019, 120020, 120017, 67330, 120023, 120024, 120021, 10961, 113693, + 11148, 0, 0, 0, 128448, 0, 113703, 64378, 0, 0, 0, 68821, 119649, 11358, + 71172, 69797, 0, 11065, 126464, 0, 68864, 0, 5694, 120839, 66784, 0, + 4325, 3047, 0, 43652, 120962, 93029, 69764, 0, 0, 0, 0, 5431, 6652, 0, + 67753, 71460, 0, 0, 0, 1129, 65016, 0, 65900, 1986, 7846, 0, 8661, 75058, + 0, 0, 3845, 0, 0, 0, 74400, 1456, 7530, 121382, 0, 0, 0, 0, 120016, 0, 0, + 0, 917863, 127772, 119966, 0, 11002, 7026, 8145, 68216, 0, 12138, 71464, + 0, 0, 0, 12323, 130033, 917869, 0, 0, 0, 92316, 68494, 0, 0, 129384, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 42205, 0, 236, 0, 78867, 0, 0, 113784, 0, 0, + 983982, 0, 0, 917865, 8097, 0, 0, 68012, 72820, 11194, 0, 72824, 0, + 127974, 0, 0, 110602, 129948, 10416, 68070, 3872, 127508, 0, 0, 0, 0, + 2838, 917867, 0, 917866, 119589, 0, 0, 0, 0, 11096, 83019, 10553, 83421, + 0, 0, 0, 0, 0, 0, 73742, 6436, 10096, 0, 0, 0, 113687, 0, 4463, 68018, 0, + 78074, 0, 983591, 7184, 0, 0, 0, 0, 0, 0, 93825, 12818, 12032, 0, 0, 0, + 0, 10357, 121418, 8170, 0, 8556, 0, 9659, 0, 0, 0, 9556, 0, 4503, 92700, + 9647, 64004, 78185, 0, 0, 64002, 78889, 0, 0, 118910, 0, 6438, 0, 9109, + 78884, 0, 64599, 0, 68009, 0, 0, 2447, 129863, 0, 0, 126545, 0, 119002, + 0, 0, 0, 19937, 0, 1322, 0, 119204, 254, 0, 0, 69392, 42425, 0, 0, 65204, + 42312, 0, 128519, 0, 42826, 0, 42464, 120567, 0, 67155, 74796, 64400, + 64693, 126212, 77861, 0, 0, 67154, 0, 0, 0, 68008, 11785, 0, 119142, + 41978, 0, 0, 43244, 10536, 0, 9901, 7103, 0, 7102, 71428, 120748, 3140, + 0, 0, 68007, 0, 67258, 10909, 0, 1428, 0, 67254, 67253, 7699, 12393, + 67257, 0, 67256, 67255, 0, 0, 69389, 0, 0, 0, 0, 0, 67153, 0, 0, 127383, + 69376, 64554, 0, 3878, 0, 42352, 1752, 0, 0, 42506, 0, 10199, 0, 983463, + 125231, 0, 0, 0, 720, 0, 0, 0, 68831, 0, 1464, 128339, 0, 7974, 0, + 125017, 68082, 0, 0, 0, 0, 74787, 0, 78864, 92258, 0, 0, 78863, 0, 1302, + 66288, 0, 0, 0, 67152, 0, 983611, 983618, 0, 0, 3995, 0, 65608, 3714, 0, + 0, 67262, 67261, 67260, 67259, 43251, 67264, 67263, 0, 120557, 92346, + 8672, 68006, 11964, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92610, 0, 468, 0, 0, + 0, 983470, 0, 0, 128544, 129397, 65907, 983163, 0, 0, 0, 0, 0, 983468, + 41743, 0, 0, 0, 74880, 0, 121001, 820, 41741, 0, 120667, 0, 64684, + 126992, 128604, 126082, 69934, 65177, 6226, 353, 43645, 0, 119612, + 120738, 67700, 0, 0, 0, 0, 42457, 120276, 0, 120277, 1884, 129637, 42418, + 113678, 41157, 0, 42305, 120279, 0, 0, 41151, 0, 71430, 0, 42344, 0, 0, + 0, 42497, 0, 194870, 72754, 69933, 73703, 0, 42521, 8539, 128606, 0, + 123609, 69957, 4788, 0, 68023, 0, 0, 983053, 0, 0, 0, 0, 41590, 0, + 113754, 0, 0, 118901, 68637, 41136, 64351, 0, 128453, 41154, 113731, + 127038, 4038, 41143, 68232, 64859, 0, 129910, 0, 5435, 129911, 6734, + 41343, 127035, 0, 0, 41359, 66761, 0, 119835, 41349, 0, 129915, 10374, + 10310, 0, 0, 10254, 119836, 10278, 10262, 69858, 41363, 0, 0, 0, 119840, + 0, 41356, 10314, 10282, 0, 10378, 0, 40976, 10266, 0, 119848, 40975, 0, + 129554, 0, 40978, 0, 92945, 0, 0, 0, 119098, 119083, 0, 71437, 119854, + 69936, 0, 0, 3525, 6824, 0, 0, 119858, 128451, 0, 72239, 113738, 0, + 71424, 0, 0, 0, 0, 0, 10727, 7212, 129071, 71957, 0, 0, 0, 67156, 808, + 7207, 42387, 0, 0, 0, 0, 0, 0, 0, 0, 9225, 121149, 0, 9145, 128060, 41018, 67841, 983158, 42300, 0, 3084, 983155, 125014, 41025, 6037, 0, 194885, 0, 10290, 0, 3083, 10322, 111017, 129030, 0, 41036, 0, 0, 43321, 65606, 0, 41032, 42388, 0, 64700, 0, 1445, 40961, 0, 0, 0, 40960, 0, @@ -24432,588 +25239,612 @@ static const unsigned int code_hash[] = { 128469, 0, 0, 0, 0, 0, 0, 42585, 65032, 10704, 65030, 4787, 0, 917556, 0, 127015, 0, 128118, 0, 0, 9525, 0, 0, 68773, 0, 0, 0, 0, 40966, 0, 0, 3998, 0, 0, 65919, 71433, 11792, 2690, 0, 42836, 127150, 41954, 194921, - 194923, 6737, 0, 64933, 0, 3487, 194873, 71427, 72758, 65426, 72756, + 194923, 6737, 0, 64933, 126260, 3487, 194873, 71427, 72758, 65426, 72756, 66757, 0, 0, 41976, 9720, 74964, 11179, 41970, 0, 12116, 65024, 0, 127912, 9048, 65028, 65027, 65026, 65025, 64757, 0, 41488, 0, 8527, 0, - 126480, 0, 41480, 41053, 3266, 0, 0, 12093, 41466, 122881, 78642, 1519, - 983906, 3638, 65887, 65429, 0, 0, 0, 0, 8633, 0, 0, 0, 125118, 0, 70375, - 0, 0, 6368, 128124, 0, 70369, 8078, 0, 0, 70373, 72876, 0, 7002, 121003, - 41430, 0, 41051, 41484, 0, 0, 41050, 8872, 0, 13099, 71445, 70371, 0, - 6435, 72154, 11362, 0, 0, 0, 0, 41420, 0, 3625, 74915, 41409, 71441, 0, - 0, 0, 9672, 0, 0, 43317, 0, 0, 0, 41424, 917598, 0, 0, 0, 0, 41417, 1261, - 0, 0, 12102, 119662, 41401, 0, 127538, 129518, 0, 124943, 72765, 3275, - 92472, 0, 0, 0, 0, 0, 0, 0, 0, 125129, 983140, 10598, 0, 128633, 6711, 0, - 2920, 0, 0, 0, 0, 19928, 0, 0, 3917, 0, 113756, 0, 0, 66588, 128078, 0, - 0, 113721, 113758, 0, 0, 0, 41184, 0, 232, 0, 0, 74170, 0, 0, 0, 0, 9094, - 0, 0, 92585, 0, 1064, 0, 0, 10115, 0, 0, 0, 7862, 0, 13224, 0, 0, 66650, - 0, 0, 72877, 1878, 0, 71434, 2911, 0, 41178, 5427, 0, 0, 0, 12617, 41174, - 0, 67148, 67147, 0, 42413, 41167, 2406, 0, 0, 0, 0, 0, 9618, 128668, 0, - 0, 0, 0, 41436, 9337, 126067, 0, 41456, 0, 119086, 11333, 0, 6703, 0, - 125071, 1613, 0, 0, 0, 983191, 0, 0, 74500, 41460, 78197, 0, 0, 194899, - 67144, 65841, 0, 121109, 74064, 111146, 111144, 120375, 0, 111122, 0, - 111121, 64687, 111120, 42592, 3871, 0, 128305, 9111, 111163, 0, 111156, - 120366, 121462, 11150, 111154, 111175, 111179, 0, 111168, 0, 120362, - 41587, 70391, 0, 74322, 0, 194908, 111166, 111133, 0, 71443, 194844, 0, - 111151, 0, 0, 7928, 111127, 111140, 41595, 0, 0, 65801, 983600, 0, 0, 0, - 73712, 0, 41598, 3993, 121269, 1545, 40971, 121286, 72874, 0, 0, 0, - 120767, 65286, 0, 0, 0, 0, 0, 0, 0, 5402, 0, 0, 74462, 73457, 0, 0, - 78194, 64326, 40969, 0, 128110, 983684, 40968, 0, 983148, 0, 0, 0, 0, - 128513, 8020, 0, 41012, 0, 0, 65805, 41006, 0, 0, 74605, 0, 118942, - 43432, 0, 0, 92900, 0, 0, 0, 120687, 0, 92958, 0, 0, 68332, 0, 40992, 0, - 0, 0, 0, 0, 42235, 0, 1741, 42370, 0, 0, 0, 11413, 126583, 0, 0, 128769, - 6470, 0, 74517, 0, 0, 120651, 40984, 0, 42742, 0, 12916, 6284, 0, 41663, - 0, 0, 68313, 72840, 70164, 41648, 0, 0, 2299, 41666, 0, 0, 2056, 41656, - 0, 0, 71917, 42219, 0, 0, 78112, 41676, 0, 0, 0, 41670, 0, 92590, 2796, - 0, 0, 9902, 0, 67988, 64785, 82995, 128822, 42631, 983040, 71890, 0, - 74164, 41238, 10049, 11405, 0, 64368, 0, 120925, 0, 397, 12299, 42139, 0, - 9590, 0, 0, 43661, 43819, 0, 6651, 3544, 0, 0, 9620, 0, 0, 0, 92229, - 1333, 7104, 0, 6425, 0, 0, 0, 0, 0, 0, 11976, 8554, 13055, 0, 110733, 0, - 110731, 41218, 0, 0, 128673, 1883, 0, 0, 70443, 41225, 70788, 42419, - 983688, 129450, 0, 127896, 0, 65809, 11837, 0, 129104, 7141, 0, 0, 0, 0, - 0, 42363, 0, 0, 0, 0, 69949, 119157, 64732, 0, 0, 126983, 0, 0, 983678, - 7140, 42051, 0, 4164, 118799, 0, 120569, 42049, 42042, 0, 0, 0, 120637, - 69938, 0, 42047, 0, 0, 8470, 11807, 128935, 0, 0, 194825, 74300, 126267, - 0, 120517, 0, 0, 0, 0, 8736, 0, 42643, 72753, 0, 0, 0, 71432, 0, 93023, - 110730, 72869, 110728, 0, 0, 0, 0, 68445, 0, 0, 2106, 0, 11273, 120986, - 43004, 0, 82988, 0, 961, 64307, 0, 0, 0, 67711, 110615, 0, 1696, 0, 9762, - 12105, 0, 110622, 110623, 3264, 110621, 110618, 43003, 110616, 110617, 0, - 120359, 0, 128660, 0, 2322, 0, 70831, 11449, 128187, 42868, 0, 0, 0, 0, - 113746, 983234, 0, 129583, 66398, 0, 0, 0, 0, 0, 111135, 119224, 0, 0, - 64421, 0, 113739, 0, 65823, 0, 11182, 0, 0, 0, 7766, 55268, 0, 4598, 0, - 65839, 0, 0, 0, 10851, 0, 6179, 92602, 6180, 129524, 11952, 0, 78648, - 78651, 78646, 78647, 78644, 78645, 3801, 78643, 6176, 120580, 0, 0, 6177, - 0, 78652, 78653, 6178, 0, 0, 0, 0, 2214, 8754, 0, 0, 2137, 0, 0, 0, 0, - 66889, 0, 0, 0, 8974, 2308, 0, 74579, 0, 2318, 122920, 0, 8198, 0, 0, 0, - 74307, 0, 119524, 0, 0, 6970, 0, 0, 0, 41159, 0, 120363, 6385, 0, 128403, - 0, 0, 126258, 0, 72785, 42053, 2075, 42057, 0, 42052, 0, 0, 67651, 0, - 9665, 0, 0, 13181, 0, 0, 69379, 0, 0, 0, 0, 73010, 0, 0, 0, 41145, 0, 0, - 0, 41148, 0, 7594, 113686, 75033, 119090, 10869, 43458, 41146, 0, 0, - 121456, 917630, 0, 0, 0, 0, 0, 65184, 11780, 0, 42796, 0, 69742, 0, - 65146, 66803, 0, 0, 0, 7358, 78241, 0, 7988, 0, 0, 3271, 0, 0, 0, 0, 0, - 0, 983103, 13070, 113736, 42044, 0, 1095, 0, 3599, 0, 0, 0, 129087, - 66390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42043, 43232, 67656, 121014, 42046, + 126480, 0, 41480, 41053, 3266, 0, 194876, 12093, 41466, 122881, 78642, + 1519, 983906, 3638, 65887, 65429, 0, 0, 0, 0, 8633, 0, 0, 0, 125118, 0, + 70375, 0, 0, 6368, 128124, 0, 70369, 8078, 0, 0, 70373, 72876, 0, 7002, + 121003, 41430, 0, 41051, 41484, 0, 0, 41050, 8872, 0, 13099, 71445, + 70371, 0, 6435, 72154, 11362, 0, 0, 0, 0, 41420, 0, 3625, 74915, 41409, + 71441, 0, 0, 0, 9672, 0, 0, 43317, 0, 0, 0, 41424, 917598, 0, 0, 0, 0, + 41417, 1261, 0, 0, 12102, 119662, 41401, 0, 127538, 129518, 0, 124943, + 72765, 3275, 92472, 0, 0, 0, 0, 0, 0, 0, 0, 125129, 983140, 10598, 0, + 128633, 6711, 0, 2920, 0, 0, 0, 0, 19928, 0, 0, 3917, 0, 113756, 0, 0, + 66588, 128078, 0, 0, 113721, 113758, 983081, 0, 0, 41184, 0, 232, 0, 0, + 74170, 0, 0, 0, 0, 9094, 0, 0, 92585, 0, 1064, 0, 0, 10115, 0, 0, 0, + 7862, 0, 13224, 0, 0, 66650, 0, 0, 72877, 1878, 0, 71434, 2911, 0, 41178, + 5427, 0, 0, 0, 12617, 41174, 0, 67148, 67147, 0, 42413, 41167, 2406, 0, + 0, 0, 0, 0, 9618, 128668, 0, 0, 0, 0, 41436, 9337, 126067, 0, 41456, 0, + 119086, 11333, 0, 6703, 0, 125071, 1613, 0, 0, 0, 983191, 0, 0, 74500, + 41460, 78197, 0, 0, 194899, 67144, 65841, 0, 121109, 74064, 111146, + 111144, 120375, 0, 111122, 0, 111121, 64687, 111120, 42592, 3871, 0, + 128305, 9111, 111163, 0, 111156, 120366, 121462, 11150, 111154, 111175, + 111179, 0, 111168, 0, 120362, 41587, 70391, 0, 74322, 0, 194908, 111166, + 111133, 0, 71443, 194842, 0, 111151, 0, 0, 7928, 111127, 111140, 41595, + 0, 0, 65801, 983600, 0, 0, 0, 73712, 0, 41598, 3993, 121269, 1545, 40971, + 121286, 72874, 0, 0, 0, 120767, 65286, 0, 0, 0, 0, 0, 0, 0, 5402, 0, 0, + 74462, 73457, 0, 0, 78194, 64326, 40969, 0, 128110, 983684, 40968, 0, + 121139, 0, 0, 0, 0, 128513, 8020, 0, 41012, 0, 0, 65805, 41006, 0, 0, + 74605, 0, 118942, 43432, 0, 0, 92900, 0, 0, 68671, 120687, 0, 92958, 0, + 0, 68332, 0, 40992, 0, 0, 0, 0, 0, 42235, 0, 1741, 42370, 0, 0, 0, 11413, + 126583, 0, 0, 128769, 6470, 0, 74517, 0, 0, 120651, 40984, 0, 42742, 0, + 12916, 6284, 0, 41663, 0, 0, 68313, 72840, 70164, 41648, 0, 0, 2299, + 41666, 0, 0, 2056, 41656, 0, 0, 71917, 42219, 0, 0, 78112, 41676, 0, 0, + 0, 41670, 0, 92590, 2796, 0, 0, 9902, 0, 67988, 64785, 82995, 128822, + 42631, 983040, 71890, 0, 74164, 41238, 10049, 11405, 0, 64368, 0, 120925, + 0, 397, 12299, 42139, 0, 9590, 0, 0, 43661, 43819, 0, 6651, 3544, 0, 0, + 9620, 0, 0, 0, 92229, 1333, 7104, 0, 6425, 0, 0, 0, 0, 0, 0, 11976, 8554, + 13055, 0, 110733, 0, 110731, 41218, 0, 0, 128673, 1883, 0, 0, 70443, + 41225, 70788, 42419, 983688, 129450, 0, 127896, 0, 65809, 11837, 0, + 129104, 7141, 0, 0, 0, 0, 0, 42363, 0, 0, 0, 0, 69949, 119157, 64732, 0, + 0, 126983, 0, 0, 983678, 7140, 42051, 0, 4164, 118799, 0, 120569, 42049, + 42042, 0, 0, 0, 120637, 69938, 0, 42047, 0, 0, 8470, 11807, 128935, 0, 0, + 194825, 74300, 126267, 0, 120517, 0, 0, 0, 0, 8736, 0, 42643, 72753, + 129925, 0, 0, 71432, 0, 93023, 110730, 72869, 110728, 0, 0, 0, 0, 68445, + 0, 0, 2106, 0, 11273, 120986, 43004, 0, 82988, 0, 961, 64307, 0, 0, 0, + 67711, 110615, 0, 1696, 0, 9762, 12105, 0, 110622, 110623, 3264, 110621, + 110618, 43003, 110616, 110617, 0, 120359, 0, 128660, 0, 2322, 0, 70831, + 11449, 128187, 42868, 0, 0, 0, 0, 113746, 983234, 0, 129583, 66398, 0, 0, + 0, 0, 0, 111135, 119224, 0, 0, 64421, 0, 113739, 0, 65823, 0, 11182, 0, + 0, 0, 7766, 55268, 0, 4598, 0, 65839, 0, 0, 0, 10851, 0, 6179, 92602, + 6180, 129524, 11952, 0, 78648, 78651, 78646, 78647, 78644, 78645, 3801, + 78643, 6176, 120580, 0, 0, 6177, 0, 78652, 78653, 6178, 0, 0, 0, 0, 2214, + 8754, 0, 0, 2137, 0, 0, 0, 0, 66889, 0, 0, 0, 8974, 2308, 0, 74579, 0, + 2318, 122920, 0, 8198, 0, 0, 0, 74307, 0, 119524, 0, 0, 6970, 0, 0, 0, + 41159, 0, 120363, 6385, 0, 128403, 0, 0, 126258, 0, 72785, 42053, 2075, + 42057, 0, 42052, 0, 0, 67651, 0, 9665, 0, 0, 13181, 0, 0, 69379, 0, 0, 0, + 0, 73010, 0, 0, 0, 41145, 0, 0, 0, 41148, 0, 7594, 113686, 75033, 119090, + 10869, 43458, 41146, 0, 0, 121456, 917630, 0, 0, 0, 0, 0, 65184, 11780, + 0, 42796, 0, 69742, 0, 65146, 66803, 0, 0, 0, 7358, 78241, 0, 7988, + 101371, 101370, 3271, 101372, 0, 69281, 0, 0, 0, 101369, 13070, 113736, + 42044, 101365, 1095, 101367, 3599, 101361, 101364, 101157, 129087, 66390, + 101360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42043, 43232, 67656, 121014, 42046, 64355, 4036, 123601, 0, 0, 983062, 0, 11954, 0, 41191, 12986, 0, 194854, - 65441, 0, 72202, 0, 129338, 0, 0, 0, 12834, 0, 0, 0, 0, 0, 0, 0, 41190, - 0, 0, 4575, 41193, 0, 429, 119174, 124931, 194859, 0, 65792, 128754, - 78509, 0, 128866, 0, 0, 0, 66786, 0, 194862, 10590, 0, 0, 0, 0, 0, 0, - 6247, 10214, 65126, 68253, 0, 0, 0, 983680, 1617, 8050, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6352, 0, 0, 0, 0, 0, 0, 0, 0, 92335, 0, 0, 42926, 0, 0, 0, - 8689, 78750, 70067, 42896, 74147, 3559, 0, 0, 74526, 65850, 12327, 72763, - 119028, 0, 0, 72761, 0, 78903, 0, 0, 0, 0, 70079, 72751, 0, 12153, 0, 0, - 120654, 0, 0, 0, 0, 0, 0, 681, 129406, 703, 983461, 3272, 0, 0, 70077, 0, - 0, 70514, 78902, 92532, 71436, 42238, 124930, 3276, 0, 0, 65928, 0, 0, - 128949, 0, 0, 0, 78813, 78814, 3262, 78811, 42711, 0, 0, 0, 0, 92746, - 9995, 1655, 70131, 78818, 78815, 12479, 0, 0, 0, 70513, 42797, 0, 0, - 128371, 43112, 0, 43488, 0, 0, 0, 42684, 0, 0, 0, 0, 0, 128308, 0, 0, 0, - 0, 0, 0, 11031, 0, 0, 0, 70386, 10348, 10412, 0, 0, 74329, 0, 0, 0, - 129026, 0, 0, 0, 8810, 0, 686, 0, 0, 0, 0, 0, 110709, 0, 0, 12040, 0, 0, + 65441, 0, 72202, 0, 129338, 0, 101353, 101352, 12834, 0, 101349, 101348, + 101351, 101350, 101345, 101344, 41190, 101346, 129693, 4575, 41193, 0, + 429, 119174, 124931, 194859, 0, 65792, 128754, 78509, 0, 128866, 0, 0, 0, + 66786, 0, 194862, 10590, 0, 0, 0, 0, 0, 0, 6247, 10214, 65126, 68253, 0, + 0, 0, 983680, 1617, 8050, 0, 0, 0, 101358, 101357, 0, 101359, 101354, 0, + 101356, 6352, 0, 0, 0, 0, 0, 0, 0, 0, 92335, 0, 0, 42926, 0, 0, 0, 8689, + 78750, 70067, 42896, 74147, 3559, 101327, 0, 74526, 65850, 12327, 72763, + 101325, 0, 0, 72761, 0, 78903, 0, 0, 0, 0, 70079, 72751, 0, 12153, + 101340, 101343, 101342, 71940, 0, 101339, 101338, 0, 0, 681, 129406, 703, + 101335, 3272, 101337, 101332, 70077, 101334, 101333, 70514, 78902, 92532, + 71436, 42238, 124930, 3276, 0, 101311, 65928, 0, 0, 101307, 101306, + 101309, 101308, 78813, 78814, 3262, 78811, 42711, 101305, 0, 0, 101302, + 92746, 9995, 1655, 70131, 78818, 78815, 12479, 0, 0, 101296, 70513, + 42797, 0, 0, 128371, 43112, 101318, 43488, 101320, 101315, 101314, 42684, + 101316, 0, 0, 101313, 101312, 128308, 0, 0, 0, 0, 0, 0, 11031, 0, 0, 0, + 70386, 10348, 10412, 0, 0, 74329, 0, 0, 0, 101285, 101284, 101287, + 101286, 8810, 101280, 686, 101282, 0, 0, 0, 0, 110709, 0, 0, 12040, 0, 0, 65118, 110704, 0, 118891, 110599, 0, 110598, 0, 120543, 983660, 0, 65455, 74413, 94097, 0, 119129, 0, 0, 0, 78776, 0, 64467, 10300, 10161, 10396, - 0, 0, 0, 0, 78773, 0, 0, 0, 1458, 0, 0, 72429, 65120, 11479, 0, 0, 6350, - 0, 0, 71473, 1061, 69787, 9115, 43111, 0, 0, 0, 0, 983960, 0, 120907, - 1045, 0, 73913, 983564, 0, 0, 0, 0, 0, 0, 8486, 0, 0, 0, 4362, 0, 0, - 93054, 1025, 0, 0, 0, 0, 0, 92328, 128206, 0, 1774, 0, 122913, 0, 0, 0, - 11207, 0, 0, 3988, 0, 0, 983048, 0, 0, 8564, 983958, 0, 0, 0, 0, 0, 0, - 66513, 6256, 0, 579, 55218, 0, 0, 0, 127337, 0, 11814, 0, 4488, 128716, - 127336, 0, 10444, 118846, 78238, 0, 0, 127331, 4487, 127849, 42832, 1032, - 0, 43450, 0, 70155, 0, 614, 0, 127325, 0, 0, 128466, 0, 127323, 0, - 127322, 0, 0, 0, 1050, 7549, 127319, 0, 9314, 0, 0, 0, 0, 0, 70434, - 127314, 12527, 66504, 0, 0, 0, 0, 64333, 127312, 128547, 92594, 0, 0, 0, - 129316, 0, 124960, 10360, 6746, 0, 0, 0, 0, 13085, 9233, 0, 0, 0, 0, 0, - 0, 92766, 0, 121114, 983925, 74212, 42819, 10910, 0, 68044, 9896, 0, 0, - 120915, 0, 0, 7970, 0, 0, 0, 0, 113699, 9849, 0, 122910, 0, 0, 10487, - 69714, 0, 10103, 0, 4769, 0, 0, 0, 2283, 0, 0, 74785, 0, 0, 0, 110595, - 110596, 0, 110594, 64565, 4773, 0, 0, 0, 4770, 0, 0, 0, 65457, 69441, 0, - 0, 127338, 983593, 4774, 0, 68497, 2259, 0, 0, 10215, 0, 0, 0, 0, 0, - 74776, 92160, 4768, 0, 0, 4099, 0, 110699, 110700, 110697, 2225, 0, 0, 0, - 0, 125217, 11255, 42814, 880, 0, 0, 0, 0, 0, 67756, 65246, 0, 0, 129463, - 7095, 0, 0, 0, 0, 0, 0, 2427, 0, 7093, 0, 11585, 0, 9962, 0, 12223, 0, - 78211, 1434, 42939, 0, 11573, 0, 0, 0, 121257, 0, 0, 0, 0, 74437, 0, - 113711, 917596, 0, 8740, 0, 3782, 64331, 0, 65167, 1014, 0, 0, 0, 10835, - 0, 0, 0, 0, 0, 0, 118824, 7302, 0, 67707, 0, 1150, 10547, 0, 0, 68427, 0, - 0, 0, 0, 118788, 0, 0, 0, 42257, 8010, 0, 0, 0, 9643, 0, 0, 12864, 0, 0, - 0, 0, 0, 0, 0, 0, 1426, 68217, 0, 68447, 0, 0, 0, 0, 73701, 0, 0, 0, - 65383, 0, 0, 0, 0, 0, 0, 43196, 43194, 92549, 10744, 0, 990, 93772, 0, 0, - 0, 0, 0, 66470, 0, 0, 0, 3945, 0, 0, 0, 0, 0, 127546, 127746, 1020, - 73763, 92257, 0, 0, 64748, 0, 0, 10205, 0, 0, 10016, 0, 74051, 0, 43242, - 125096, 2667, 0, 125037, 0, 9911, 0, 0, 10097, 0, 0, 0, 118836, 0, 0, 0, - 0, 68889, 10159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 983338, 92291, 0, 127973, - 72882, 0, 1041, 127182, 6354, 0, 65364, 0, 0, 0, 72884, 0, 128477, 0, - 65906, 127819, 72883, 0, 128470, 5375, 72881, 0, 8215, 0, 10074, 0, 0, 0, - 69899, 0, 0, 121426, 41382, 0, 0, 5173, 65348, 527, 0, 0, 0, 128250, 0, - 0, 0, 0, 0, 0, 42695, 0, 42250, 0, 11187, 113695, 0, 1568, 66806, 0, 0, - 113705, 0, 0, 129487, 0, 0, 128839, 9069, 6144, 0, 0, 0, 0, 66783, 0, - 74027, 118934, 66787, 74580, 0, 110790, 6364, 0, 66794, 43508, 0, 92612, - 0, 0, 0, 0, 128405, 66449, 0, 0, 0, 0, 70714, 0, 70716, 0, 1044, 42411, - 0, 0, 0, 0, 43239, 0, 0, 0, 0, 42450, 0, 0, 68479, 119237, 0, 0, 0, 0, 0, - 69956, 11537, 0, 121206, 0, 0, 0, 0, 1057, 566, 0, 0, 10907, 42274, - 43464, 0, 0, 0, 78472, 71207, 42636, 0, 123603, 0, 0, 0, 64659, 0, - 127749, 0, 6357, 6362, 0, 0, 2216, 9090, 0, 0, 0, 0, 68227, 0, 0, 0, 0, - 1053, 12830, 0, 0, 0, 1052, 1051, 459, 1060, 0, 66479, 0, 0, 0, 128061, - 42490, 689, 6508, 4163, 42298, 8639, 983333, 4246, 0, 43514, 42362, 0, - 42337, 64596, 0, 0, 0, 0, 0, 6359, 0, 43471, 0, 0, 0, 127274, 0, 6358, - 6361, 1926, 6356, 0, 7898, 0, 10935, 0, 127972, 121285, 0, 43685, 0, 0, - 42910, 0, 8693, 0, 0, 44010, 0, 120991, 121454, 0, 0, 0, 0, 129514, 0, 0, - 0, 0, 73947, 0, 129361, 92412, 0, 66477, 0, 0, 0, 43854, 71913, 0, 0, 0, - 0, 72227, 65899, 92275, 0, 0, 0, 68887, 0, 71057, 0, 0, 0, 0, 119183, - 2923, 10853, 0, 0, 0, 0, 72864, 0, 72773, 72772, 0, 120801, 65251, 0, - 68228, 0, 128548, 0, 0, 5370, 70465, 2931, 73848, 0, 10188, 0, 118848, 0, - 983923, 0, 0, 0, 72212, 0, 10844, 121016, 128195, 92424, 0, 0, 0, 286, 0, - 1062, 0, 0, 0, 7395, 0, 1070, 128993, 0, 6095, 0, 0, 0, 127796, 126465, - 64497, 0, 0, 0, 0, 70054, 8189, 78272, 0, 0, 0, 0, 0, 113783, 42102, - 78276, 0, 0, 42101, 0, 78402, 67427, 33, 67425, 67424, 10824, 67430, - 67429, 67428, 427, 64723, 0, 0, 0, 0, 1031, 0, 0, 42104, 0, 0, 2328, 0, - 1071, 42899, 128486, 0, 7673, 0, 0, 1047, 0, 0, 42908, 0, 0, 10651, 0, 0, - 0, 72433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13216, 0, 69716, 0, 0, 0, - 0, 0, 92411, 69654, 0, 0, 0, 2761, 194834, 0, 0, 0, 0, 8643, 0, 0, 94021, - 2757, 11067, 0, 74498, 8910, 10689, 0, 0, 0, 71173, 0, 9196, 71214, 0, 0, - 0, 0, 118911, 0, 0, 0, 0, 0, 0, 0, 0, 68130, 119616, 0, 0, 42477, 0, 0, - 4495, 0, 0, 0, 0, 70080, 10992, 0, 0, 0, 0, 9318, 0, 6002, 0, 73808, 0, - 92601, 42249, 7639, 43995, 0, 0, 5454, 0, 0, 0, 0, 0, 0, 0, 121189, 0, - 119173, 0, 9704, 120686, 0, 78436, 78435, 11204, 0, 0, 1731, 0, 92937, 0, - 67990, 0, 0, 0, 126576, 127018, 0, 55265, 0, 0, 0, 0, 127257, 73826, 0, - 3840, 0, 41432, 0, 0, 68430, 0, 43253, 128284, 0, 3371, 92936, 0, 0, - 1479, 0, 0, 1109, 77997, 0, 129154, 0, 92782, 0, 0, 8868, 399, 67978, - 74842, 0, 0, 194839, 0, 551, 0, 10156, 0, 92572, 0, 2544, 65074, 0, 0, 0, - 0, 0, 0, 0, 128713, 0, 0, 74268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68045, 0, - 0, 0, 3447, 0, 0, 121414, 2549, 110818, 0, 0, 43564, 8946, 0, 74411, - 66864, 0, 70480, 7980, 0, 113698, 0, 119653, 66489, 0, 64695, 128063, 0, - 0, 0, 0, 0, 0, 43452, 0, 92993, 0, 10919, 0, 67810, 0, 0, 0, 0, 6450, - 10055, 0, 0, 0, 0, 42720, 0, 9626, 0, 128055, 74447, 0, 125127, 92573, 0, - 0, 0, 119075, 0, 0, 66486, 0, 0, 0, 0, 0, 0, 75028, 983864, 74839, 0, 0, - 0, 0, 0, 55286, 0, 1055, 917628, 0, 0, 0, 70516, 12146, 0, 73956, 66488, - 0, 0, 0, 0, 0, 0, 42518, 0, 0, 0, 7407, 74978, 0, 0, 0, 0, 0, 0, 0, - 10231, 0, 66626, 0, 0, 92951, 0, 65927, 0, 0, 69696, 0, 92389, 0, 0, 0, - 68095, 92950, 0, 10555, 0, 0, 9091, 10798, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 43222, 0, 74982, 0, 0, 120952, 0, 0, 2992, 7826, 74321, 0, 125103, 74981, - 92628, 0, 0, 128289, 128203, 4361, 129597, 1306, 78770, 1497, 983628, 0, - 0, 0, 8248, 0, 127253, 7973, 128706, 0, 0, 73122, 983930, 0, 0, 2963, - 120653, 0, 128554, 0, 0, 64258, 0, 0, 69677, 74983, 65103, 0, 0, 42625, - 0, 0, 0, 0, 64905, 0, 9512, 0, 119076, 6443, 983262, 0, 9135, 0, 0, + 0, 0, 0, 0, 78773, 101294, 101293, 0, 1458, 101290, 0, 72429, 65120, + 11479, 0, 0, 6350, 101289, 101288, 71473, 1061, 69787, 9115, 43111, 0, 0, + 0, 0, 983960, 0, 120907, 1045, 0, 73913, 983564, 0, 0, 0, 0, 0, 0, 8486, + 0, 0, 0, 4362, 0, 0, 93054, 1025, 0, 0, 0, 0, 0, 92328, 128206, 0, 1774, + 0, 122913, 0, 0, 0, 11207, 0, 0, 3988, 0, 0, 983048, 0, 0, 8564, 983958, + 0, 0, 0, 0, 0, 0, 66513, 6256, 0, 579, 55218, 0, 0, 0, 127337, 0, 11814, + 0, 4488, 128716, 127336, 0, 10444, 118846, 78238, 0, 0, 127331, 4487, + 127849, 42832, 1032, 0, 43450, 0, 70155, 0, 614, 0, 127325, 0, 0, 128466, + 0, 127323, 0, 127322, 0, 0, 0, 1050, 7549, 127319, 0, 9314, 0, 0, 0, 0, + 0, 70434, 127314, 12527, 66504, 0, 0, 0, 0, 64333, 127312, 128547, 92594, + 0, 0, 0, 129316, 0, 124960, 10360, 6746, 0, 0, 0, 0, 13085, 9233, 0, 0, + 0, 0, 0, 0, 92766, 0, 121114, 983925, 74212, 42819, 10910, 0, 68044, + 9896, 0, 0, 120915, 0, 0, 7970, 0, 0, 0, 0, 113699, 9849, 0, 122910, 0, + 0, 10487, 69714, 0, 10103, 0, 4769, 0, 129967, 0, 2283, 0, 0, 74785, 0, + 0, 0, 110595, 110596, 0, 110594, 64565, 4773, 0, 0, 0, 4770, 0, 0, 0, + 65457, 69441, 0, 0, 127338, 983593, 4774, 0, 68497, 2259, 0, 0, 10215, 0, + 0, 0, 0, 0, 74776, 92160, 4768, 0, 0, 4099, 0, 110699, 110700, 110697, + 2225, 0, 0, 0, 0, 125217, 11255, 42814, 880, 0, 0, 0, 0, 0, 67756, 65246, + 0, 0, 129463, 7095, 0, 0, 0, 0, 0, 0, 2427, 0, 7093, 0, 11585, 0, 9962, + 0, 12223, 0, 78211, 1434, 42939, 0, 11573, 0, 0, 0, 121257, 0, 0, 0, 0, + 74437, 0, 113711, 917596, 0, 8740, 0, 3782, 64331, 0, 65167, 1014, 0, 0, + 0, 10835, 129987, 0, 0, 0, 0, 0, 118824, 7302, 0, 67707, 0, 1150, 10547, + 0, 0, 68427, 0, 0, 0, 0, 118788, 0, 0, 0, 42257, 8010, 0, 0, 0, 9643, 0, + 0, 12864, 0, 0, 0, 0, 0, 0, 0, 0, 1426, 68217, 0, 68447, 129971, 0, 0, 0, + 73701, 0, 0, 0, 65383, 0, 0, 0, 0, 0, 0, 43196, 43194, 92549, 10744, 0, + 990, 93772, 0, 0, 0, 0, 0, 66470, 0, 0, 0, 3945, 0, 0, 0, 130039, 0, + 127546, 127746, 1020, 73763, 92257, 0, 0, 64748, 0, 0, 10205, 0, 0, + 10016, 0, 74051, 0, 43242, 125096, 2667, 0, 125037, 0, 9911, 0, 0, 10097, + 0, 0, 0, 118836, 0, 0, 0, 0, 68889, 10159, 113759, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 983338, 92291, 0, 127973, 72882, 0, 1041, 127182, 6354, 0, 65364, + 0, 0, 0, 72884, 0, 128477, 0, 65906, 127819, 72883, 0, 128470, 5375, + 72881, 0, 8215, 0, 10074, 0, 0, 0, 69899, 0, 0, 121426, 41382, 0, 0, + 5173, 65348, 527, 0, 0, 0, 128250, 0, 0, 0, 0, 0, 0, 42695, 0, 42250, 0, + 11187, 113695, 0, 1568, 66806, 0, 0, 113705, 0, 0, 129487, 0, 0, 128839, + 9069, 6144, 0, 0, 0, 0, 66783, 0, 74027, 118934, 66787, 74580, 0, 110790, + 6364, 0, 66794, 43508, 0, 92612, 0, 0, 0, 0, 128405, 66449, 0, 0, 0, 0, + 70714, 0, 70716, 0, 1044, 42411, 0, 0, 0, 0, 43239, 0, 0, 0, 0, 42450, 0, + 0, 68479, 119237, 0, 0, 0, 0, 0, 69956, 11537, 0, 121206, 0, 0, 0, 0, + 1057, 566, 0, 0, 10907, 42274, 43464, 0, 0, 0, 78472, 71207, 42636, 0, + 123603, 0, 0, 121171, 64659, 0, 127749, 0, 6357, 6362, 0, 0, 2216, 9090, + 0, 0, 0, 0, 68227, 0, 0, 0, 0, 1053, 12830, 0, 0, 0, 1052, 1051, 459, + 1060, 0, 66479, 0, 0, 0, 128061, 42490, 689, 6508, 4163, 42298, 8639, + 983333, 4246, 0, 43514, 42362, 0, 42337, 64596, 0, 0, 0, 0, 0, 6359, 0, + 43471, 0, 0, 0, 127274, 0, 6358, 6361, 1926, 6356, 0, 7898, 0, 10935, 0, + 127972, 121285, 0, 43685, 0, 0, 42910, 0, 8693, 0, 0, 44010, 0, 120991, + 121454, 0, 0, 0, 0, 129514, 0, 0, 0, 0, 73947, 0, 129361, 92412, 0, + 66477, 0, 0, 0, 43854, 71913, 0, 0, 0, 0, 72227, 65899, 92275, 0, 0, 0, + 68887, 0, 71057, 0, 0, 0, 0, 119183, 2923, 10853, 0, 0, 0, 0, 72864, 0, + 72773, 72772, 0, 120801, 65251, 0, 68228, 0, 128548, 0, 0, 5370, 70465, + 2931, 73848, 0, 10188, 0, 118848, 0, 983923, 0, 0, 0, 72212, 0, 10844, + 121016, 128195, 92424, 0, 0, 0, 286, 0, 1062, 0, 0, 0, 7395, 0, 1070, + 128993, 0, 6095, 0, 0, 0, 127796, 126465, 64497, 0, 0, 0, 0, 70054, 8189, + 78272, 0, 0, 0, 0, 0, 113783, 42102, 78276, 0, 0, 42101, 0, 78402, 67427, + 33, 67425, 67424, 10824, 67430, 67429, 67428, 427, 64723, 0, 0, 0, 0, + 1031, 0, 0, 42104, 0, 0, 2328, 0, 1071, 42899, 128486, 0, 7673, 0, 0, + 1047, 0, 0, 42908, 0, 0, 10651, 0, 0, 0, 72433, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 13216, 0, 69716, 0, 0, 0, 0, 0, 92411, 69654, 0, 0, 129904, + 2761, 129909, 0, 0, 0, 0, 8643, 0, 0, 94021, 2757, 11067, 0, 74498, 8910, + 10689, 0, 0, 0, 71173, 0, 9196, 71214, 0, 0, 0, 0, 118911, 0, 0, 0, 0, 0, + 0, 0, 0, 68130, 119616, 0, 0, 42477, 0, 0, 4495, 0, 0, 0, 0, 70080, + 10992, 0, 0, 0, 0, 9318, 0, 6002, 0, 73808, 0, 92601, 42249, 7639, 43995, + 0, 0, 5454, 0, 0, 0, 0, 0, 0, 0, 121189, 0, 119173, 0, 9704, 120686, 0, + 78436, 78435, 11204, 0, 0, 1731, 0, 92937, 0, 67990, 0, 0, 0, 126576, + 127018, 71951, 55265, 0, 0, 0, 0, 127257, 73826, 0, 3840, 0, 41432, 0, 0, + 68430, 0, 43253, 128284, 0, 3371, 92936, 0, 0, 1479, 69282, 0, 1109, + 77997, 0, 129154, 0, 92782, 0, 0, 8868, 399, 67978, 74842, 0, 0, 194839, + 0, 551, 0, 10156, 0, 92572, 0, 2544, 65074, 0, 0, 0, 0, 0, 0, 0, 128713, + 0, 0, 74268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68045, 0, 0, 0, 3447, 0, 0, + 121414, 2549, 110818, 0, 0, 43564, 8946, 0, 74411, 66864, 0, 70480, 7980, + 0, 113698, 0, 119653, 66489, 0, 64695, 128063, 0, 0, 0, 0, 0, 0, 43452, + 0, 92993, 0, 10919, 0, 67810, 0, 0, 0, 0, 6450, 10055, 0, 0, 0, 0, 42720, + 0, 9626, 0, 128055, 74447, 0, 125127, 92573, 0, 0, 0, 119075, 0, 0, + 66486, 0, 0, 0, 0, 0, 0, 75028, 983864, 74839, 0, 0, 0, 0, 0, 55286, 0, + 1055, 917628, 0, 0, 0, 70516, 12146, 0, 73956, 66488, 0, 0, 0, 0, 0, 0, + 42518, 0, 0, 0, 7407, 74978, 0, 0, 0, 0, 0, 0, 0, 10231, 0, 66626, 0, 0, + 92951, 0, 65927, 0, 0, 69696, 0, 92389, 0, 0, 0, 68095, 92950, 0, 10555, + 0, 0, 9091, 10798, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43222, 0, 74982, 0, 0, + 120952, 0, 0, 2992, 7826, 74321, 0, 125103, 74981, 92628, 0, 129903, + 128289, 128203, 4361, 129597, 1306, 78770, 1497, 983628, 0, 0, 0, 8248, + 0, 127253, 7973, 128706, 0, 0, 73122, 983930, 0, 0, 2963, 120653, 0, + 128554, 0, 0, 64258, 0, 0, 69677, 74983, 65103, 0, 125008, 42625, 0, + 72022, 0, 0, 64905, 0, 9512, 0, 119076, 6443, 983262, 0, 9135, 0, 0, 123202, 0, 0, 983863, 93788, 0, 0, 0, 93767, 64256, 0, 11669, 0, 0, 4524, 0, 129182, 128390, 0, 74266, 0, 0, 0, 70119, 78410, 69809, 121031, 55219, 69815, 93765, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2986, 0, 93763, 3437, 0, - 6203, 4247, 0, 11920, 8274, 68240, 0, 1657, 0, 121276, 0, 0, 2954, 43506, - 42837, 0, 0, 71179, 0, 0, 0, 66476, 68450, 0, 0, 0, 43362, 983134, + 6203, 4247, 0, 11920, 8274, 68240, 129694, 1657, 0, 121276, 0, 0, 2954, + 43506, 42837, 0, 0, 71179, 0, 0, 0, 66476, 68450, 0, 0, 0, 43362, 983134, 129596, 11705, 0, 0, 0, 127354, 0, 11710, 0, 0, 0, 0, 74429, 0, 0, 1058, - 0, 0, 0, 0, 1144, 0, 0, 0, 0, 0, 118972, 0, 65322, 0, 6441, 0, 0, 2547, - 66484, 43634, 0, 5871, 0, 0, 0, 0, 0, 0, 71204, 0, 0, 1865, 0, 0, 69950, - 0, 0, 73713, 0, 71199, 65826, 2069, 0, 119092, 43999, 2997, 0, 126588, 0, - 65319, 0, 12316, 0, 0, 123630, 8776, 0, 0, 66294, 13130, 0, 71191, - 126625, 0, 10030, 11709, 12364, 983834, 0, 11704, 0, 0, 68672, 0, 0, 0, - 0, 11706, 9710, 0, 82985, 0, 413, 65623, 0, 0, 0, 74446, 0, 1042, 0, - 128378, 12171, 119240, 0, 0, 4984, 0, 708, 11391, 0, 0, 0, 983911, 1308, - 0, 3673, 810, 0, 120933, 0, 0, 0, 1917, 3000, 0, 0, 0, 65628, 66387, - 74470, 0, 0, 0, 10027, 0, 0, 0, 0, 128831, 983167, 2980, 755, 0, 0, - 65622, 0, 121012, 7277, 121022, 0, 0, 0, 0, 8730, 0, 0, 0, 7274, 119250, - 0, 7275, 0, 935, 0, 0, 377, 42325, 121103, 0, 0, 127075, 0, 0, 0, 74911, - 2417, 0, 0, 19912, 0, 0, 0, 0, 0, 0, 0, 7248, 0, 0, 1781, 5496, 3627, 62, - 1649, 0, 964, 0, 0, 0, 0, 92897, 0, 0, 127364, 0, 43689, 127911, 66287, - 78812, 64389, 66575, 0, 73041, 0, 0, 0, 7677, 2991, 0, 0, 0, 0, 72201, 0, + 129555, 0, 0, 0, 1144, 0, 0, 0, 0, 0, 118972, 0, 65322, 0, 6441, 0, 0, + 2547, 66484, 43634, 0, 5871, 0, 0, 0, 0, 0, 0, 71204, 0, 0, 1865, 0, 0, + 69950, 0, 93021, 73713, 0, 71199, 65826, 2069, 0, 119092, 43999, 2997, 0, + 126588, 0, 65319, 0, 12316, 0, 0, 123630, 8776, 0, 0, 66294, 13130, 0, + 71191, 126625, 0, 10030, 11709, 12364, 983834, 0, 11704, 0, 0, 68672, 0, + 0, 0, 0, 11706, 9710, 0, 82985, 0, 413, 65623, 0, 0, 0, 74446, 0, 1042, + 0, 128378, 12171, 119240, 0, 69384, 4984, 0, 708, 11391, 0, 0, 0, 983911, + 1308, 0, 3673, 810, 0, 120933, 0, 0, 0, 1917, 3000, 0, 0, 0, 65628, + 66387, 74470, 0, 0, 0, 10027, 0, 0, 0, 0, 128831, 983167, 2980, 755, 0, + 0, 65622, 0, 121012, 7277, 121022, 0, 0, 0, 0, 8730, 0, 0, 0, 7274, + 119250, 0, 7275, 0, 935, 0, 0, 377, 42325, 121103, 0, 101133, 101132, + 101135, 101134, 0, 74911, 2417, 101130, 0, 19912, 0, 0, 101128, 101127, + 0, 101129, 101124, 7248, 101126, 101125, 1781, 5496, 3627, 62, 1649, 0, + 964, 0, 0, 0, 0, 92897, 0, 0, 127364, 0, 43689, 127911, 66287, 78812, + 64389, 66575, 0, 73041, 0, 129687, 0, 7677, 2991, 0, 0, 0, 0, 72201, 0, 11341, 127049, 0, 65625, 9714, 11692, 0, 0, 120850, 6478, 10195, 43673, - 65237, 6241, 0, 0, 0, 6238, 0, 0, 0, 4409, 0, 0, 67170, 0, 0, 0, 94047, - 6237, 5461, 66851, 9176, 92882, 121341, 65231, 0, 0, 121182, 128468, 0, - 44018, 0, 64765, 0, 0, 0, 5685, 0, 2461, 0, 7091, 0, 0, 0, 68163, 0, - 73030, 0, 0, 73928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68506, 0, 0, 0, 0, 0, - 2542, 0, 0, 0, 128176, 5776, 0, 0, 0, 0, 0, 11987, 0, 0, 75036, 68744, 0, - 0, 10039, 42828, 0, 0, 0, 0, 0, 10721, 67664, 43433, 0, 0, 41875, 0, - 41870, 266, 129066, 0, 41873, 71271, 0, 0, 0, 0, 0, 0, 41871, 66186, - 3734, 7734, 43683, 8750, 110600, 66011, 92899, 0, 127937, 0, 0, 10572, 0, - 42906, 0, 64349, 7287, 0, 0, 0, 0, 11167, 69220, 0, 43429, 0, 1697, 0, 0, - 68633, 7286, 0, 128738, 10031, 78754, 0, 68645, 8620, 0, 42162, 0, 0, - 7285, 0, 119577, 0, 66842, 43677, 41583, 0, 65799, 129332, 0, 0, 0, 0, - 110806, 0, 3609, 0, 129448, 0, 125116, 126254, 128108, 73948, 0, 0, 0, 0, - 129189, 42732, 92699, 74984, 68620, 11691, 74985, 0, 0, 0, 0, 0, 6348, - 243, 74075, 0, 0, 92309, 123585, 0, 0, 10648, 8538, 43687, 0, 0, 0, - 70515, 0, 118954, 92886, 13307, 129573, 92891, 0, 120770, 983831, 0, 0, - 0, 0, 214, 0, 0, 0, 65893, 0, 120488, 128386, 0, 92893, 0, 2603, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 1016, 0, 0, 0, 3885, 92, 65456, 64608, - 0, 0, 0, 70656, 113742, 0, 0, 0, 128128, 983838, 0, 0, 6791, 983842, - 127960, 0, 0, 0, 118976, 0, 7328, 92358, 0, 7995, 8759, 43421, 0, 68029, - 0, 0, 125272, 0, 3197, 0, 0, 0, 983150, 0, 11595, 0, 0, 43435, 0, 0, 0, - 0, 0, 70660, 0, 741, 83291, 5494, 0, 70668, 1990, 11107, 4498, 0, 0, - 70658, 0, 0, 2960, 73779, 0, 8969, 0, 43424, 0, 0, 2950, 0, 0, 129035, - 370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122900, 0, 0, 0, 0, 2964, 43663, 0, - 6344, 0, 0, 10144, 0, 8252, 729, 66016, 78446, 0, 0, 0, 78740, 43669, - 9032, 0, 0, 0, 0, 0, 0, 0, 0, 74612, 3761, 0, 0, 0, 0, 0, 0, 3850, 0, 0, + 65237, 6241, 0, 0, 0, 6238, 0, 129889, 0, 4409, 0, 0, 67170, 0, 0, 0, + 94047, 6237, 5461, 66851, 9176, 92882, 121341, 65231, 0, 0, 121182, + 128468, 0, 44018, 0, 64765, 0, 0, 0, 5685, 0, 2461, 0, 7091, 0, 0, 0, + 68163, 0, 73030, 0, 0, 73928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68506, 0, 0, 0, + 0, 0, 2542, 0, 0, 0, 128176, 5776, 0, 0, 0, 0, 0, 11987, 0, 0, 75036, + 68744, 0, 0, 10039, 42828, 0, 0, 0, 0, 0, 10721, 67664, 43433, 0, 0, + 41875, 0, 41870, 266, 129066, 0, 41873, 71271, 0, 0, 0, 0, 0, 0, 41871, + 66186, 3734, 7734, 43683, 8750, 110600, 66011, 92899, 0, 127937, 0, 0, + 10572, 0, 42906, 0, 64349, 7287, 0, 0, 0, 0, 11167, 69220, 0, 43429, 0, + 1697, 0, 0, 68633, 7286, 0, 128738, 10031, 78754, 0, 68645, 8620, 0, + 42162, 0, 0, 7285, 0, 119577, 0, 66842, 43677, 41583, 0, 65799, 129332, + 0, 0, 0, 0, 110806, 0, 3609, 0, 129448, 119074, 125116, 126254, 128108, + 73948, 0, 0, 0, 0, 129189, 42732, 92699, 74984, 68620, 11691, 74985, 0, + 0, 0, 0, 0, 6348, 243, 74075, 0, 0, 92309, 123585, 0, 0, 10648, 8538, + 43687, 0, 0, 0, 70515, 0, 118954, 92886, 13307, 129573, 92891, 0, 120770, + 983831, 0, 0, 0, 0, 214, 0, 0, 0, 65893, 0, 120488, 128386, 0, 92893, 0, + 2603, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 1016, 0, 0, 0, 3885, 92, + 65456, 64608, 0, 0, 0, 70656, 113742, 0, 0, 0, 128128, 983838, 0, 0, + 6791, 983842, 127960, 0, 0, 0, 118976, 0, 7328, 92358, 0, 7995, 8759, + 43421, 0, 68029, 0, 0, 125272, 0, 3197, 0, 0, 0, 983150, 0, 11595, 0, 0, + 43435, 0, 0, 0, 0, 0, 70660, 0, 741, 83291, 5494, 0, 70668, 1990, 11107, + 4498, 0, 0, 70658, 0, 0, 2960, 73779, 0, 8969, 101256, 43424, 0, 101257, + 2950, 101251, 101254, 101253, 370, 0, 101250, 101249, 0, 0, 0, 0, 0, 0, + 0, 122900, 0, 0, 983251, 0, 2964, 43663, 0, 6344, 0, 0, 10144, 0, 8252, + 729, 66016, 78446, 0, 0, 0, 78740, 43669, 9032, 0, 0, 0, 0, 0, 0, 0, 0, + 74612, 3761, 101261, 101260, 101263, 101262, 0, 0, 3850, 101258, 0, 128389, 0, 0, 0, 0, 8611, 0, 0, 0, 43691, 125032, 0, 41802, 120540, 0, 0, - 0, 0, 0, 3848, 0, 113800, 127536, 0, 0, 0, 983270, 663, 0, 0, 0, 0, 0, 0, - 0, 0, 13221, 0, 0, 0, 0, 0, 121348, 0, 65579, 12980, 68046, 12143, 0, - 128067, 0, 43441, 41804, 0, 0, 0, 0, 0, 0, 66329, 0, 72324, 0, 0, 125038, - 0, 129383, 0, 0, 0, 983871, 0, 0, 0, 0, 0, 1097, 129033, 0, 0, 0, 93828, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13110, 0, 983867, 68229, 1000, 0, 0, 0, - 1209, 0, 0, 0, 1073, 6321, 77878, 0, 0, 68213, 0, 12167, 0, 0, 0, 0, - 73673, 121500, 0, 121501, 0, 6587, 0, 0, 0, 9231, 0, 2959, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 42941, 0, 0, 68434, 0, 70742, 0, 0, 12290, 0, 0, 110801, - 0, 77873, 8205, 110803, 5131, 0, 0, 0, 0, 0, 0, 1944, 78453, 0, 0, - 119990, 119991, 12701, 78492, 11308, 119995, 0, 113702, 66836, 119999, - 74263, 92382, 120002, 120003, 7075, 120005, 120006, 120007, 41817, 75063, - 42275, 120011, 120012, 120013, 120014, 42943, 6041, 0, 41899, 0, 8002, 0, - 41902, 0, 0, 64332, 0, 7813, 119117, 0, 41900, 120633, 0, 7281, 78455, - 7279, 12041, 93027, 0, 12673, 0, 129123, 9660, 0, 72984, 0, 0, 0, 0, - 92901, 2970, 0, 0, 0, 77870, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3486, 0, 0, 0, 0, - 127799, 0, 0, 0, 69920, 0, 66834, 0, 983987, 0, 68312, 0, 65673, 1019, - 78495, 4148, 0, 12289, 0, 4316, 0, 13119, 983913, 0, 0, 0, 0, 0, 0, - 43434, 41865, 128218, 9163, 8659, 9072, 5867, 13302, 7622, 7120, 0, 0, 0, - 0, 7400, 5416, 0, 0, 10817, 0, 0, 0, 0, 68162, 41855, 41867, 0, 983224, - 0, 11536, 0, 0, 7115, 0, 0, 5498, 7337, 41536, 0, 0, 92587, 7221, 8997, - 0, 0, 0, 0, 0, 0, 127814, 0, 0, 0, 0, 0, 295, 0, 0, 0, 0, 121292, 0, - 43454, 63903, 63902, 63901, 0, 3971, 0, 0, 2952, 0, 11038, 10901, 63900, - 63899, 63898, 5198, 667, 43273, 63887, 63886, 128458, 78521, 66830, 0, - 92714, 4159, 0, 0, 63885, 63884, 63883, 63882, 63880, 8555, 63878, 63877, - 93057, 0, 0, 63881, 10746, 0, 118983, 0, 63876, 63875, 63874, 63873, - 7432, 1913, 41913, 63852, 0, 128971, 0, 983875, 0, 446, 41911, 0, 63851, - 63850, 41910, 0, 63846, 2972, 63844, 7262, 0, 63849, 63848, 63847, 72990, - 6570, 0, 7259, 63842, 4178, 63840, 121321, 41521, 63894, 63893, 63892, 0, - 0, 1105, 4180, 0, 7418, 0, 0, 63891, 63890, 63889, 63888, 0, 0, 0, 0, + 0, 0, 0, 3848, 101230, 113800, 127536, 101227, 101226, 101229, 101228, + 663, 0, 0, 0, 0, 0, 0, 0, 0, 13221, 0, 0, 101244, 101243, 101246, 101245, + 0, 65579, 12980, 68046, 12143, 0, 128067, 0, 43441, 41804, 101241, + 101240, 101235, 101234, 101237, 101236, 66329, 0, 72324, 101232, 0, + 125038, 0, 129383, 101214, 101213, 0, 101215, 101210, 0, 101212, 101211, + 0, 1097, 129033, 0, 101209, 101208, 93828, 0, 101205, 101204, 101207, + 101206, 101201, 101200, 101203, 101202, 0, 13110, 0, 983867, 68229, 1000, + 0, 0, 101222, 1209, 101224, 101223, 92354, 1073, 6321, 77878, 0, 0, + 68213, 0, 12167, 0, 0, 0, 0, 73673, 121500, 0, 121501, 0, 6587, 0, 0, 0, + 9231, 0, 2959, 101191, 0, 101193, 101188, 101187, 101190, 101189, 101184, + 0, 101186, 42941, 0, 0, 68434, 0, 70742, 0, 0, 12290, 0, 0, 110801, 0, + 77873, 8205, 110803, 5131, 0, 0, 0, 0, 0, 0, 1944, 78453, 0, 0, 119990, + 119991, 12701, 78492, 11308, 119995, 0, 113702, 66836, 119999, 74263, + 92382, 120002, 120003, 7075, 101196, 101199, 101198, 41817, 75063, 42275, + 101194, 120012, 120013, 120014, 42943, 6041, 0, 41899, 0, 8002, 0, 41902, + 0, 0, 64332, 0, 7813, 119117, 0, 41900, 120633, 101167, 7281, 78455, + 7279, 12041, 93027, 101165, 12673, 0, 129123, 9660, 0, 72984, 101161, 0, + 0, 0, 92901, 2970, 0, 101180, 101179, 77870, 101181, 0, 0, 101178, 0, 0, + 0, 0, 0, 3486, 101174, 101177, 101176, 101171, 101170, 101173, 101172, 0, + 69920, 101169, 66834, 0, 983987, 0, 68312, 101150, 65673, 1019, 78495, + 4148, 0, 12289, 101147, 4316, 0, 13119, 983913, 101145, 101144, 0, 0, + 101141, 101140, 43434, 41865, 101137, 9163, 8659, 9072, 5867, 13302, + 7622, 7120, 0, 0, 0, 0, 7400, 5416, 101160, 101159, 10817, 101153, + 101156, 101155, 0, 68162, 41855, 41867, 0, 983224, 0, 11536, 71988, 0, + 7115, 0, 0, 5498, 7337, 41536, 0, 0, 92587, 7221, 8997, 0, 0, 0, 71949, + 0, 0, 127814, 0, 0, 0, 0, 0, 295, 0, 0, 0, 0, 121292, 0, 43454, 63903, + 63902, 63901, 0, 3971, 0, 0, 2952, 0, 11038, 10901, 63900, 63899, 63898, + 5198, 667, 43273, 63887, 63886, 128458, 78521, 66830, 0, 92714, 4159, 0, + 0, 63885, 63884, 63883, 63882, 63880, 8555, 63878, 63877, 93057, 0, 0, + 63881, 10746, 0, 118983, 0, 63876, 63875, 63874, 63873, 7432, 1913, + 41913, 63852, 0, 128971, 0, 983875, 0, 446, 41911, 0, 63851, 63850, + 41910, 0, 63846, 2972, 63844, 7262, 0, 63849, 63848, 63847, 72990, 6570, + 0, 7259, 63842, 4178, 63840, 121321, 41521, 63894, 63893, 63892, 0, 0, + 1105, 4180, 0, 7418, 0, 129714, 63891, 63890, 63889, 63888, 0, 0, 0, 0, 1678, 0, 66909, 0, 0, 0, 0, 11192, 128360, 128404, 9159, 70089, 63861, 63860, 63859, 63858, 63865, 1615, 63863, 63862, 0, 0, 0, 0, 63857, 63856, 71902, 0, 1077, 0, 65099, 0, 0, 0, 0, 0, 0, 42773, 121331, 0, 0, 119220, - 120912, 129564, 0, 1112, 119122, 8686, 0, 0, 65081, 0, 0, 0, 11077, 0, - 7260, 0, 5327, 0, 63870, 63869, 3847, 63867, 0, 2903, 0, 3001, 66762, 0, - 43746, 0, 63866, 0, 0, 0, 0, 0, 127785, 68420, 2990, 0, 128254, 0, 0, 0, - 0, 1117, 118987, 12212, 129003, 129151, 63836, 63835, 63834, 0, 0, 63839, - 63838, 63837, 0, 125095, 63833, 6042, 66360, 0, 74808, 0, 63821, 63820, - 63819, 63818, 0, 0, 9047, 63822, 128328, 6091, 0, 10691, 0, 74344, 8226, - 0, 63812, 63811, 63810, 63809, 2289, 63815, 63814, 63813, 6047, 0, 0, - 780, 63808, 77925, 77922, 65147, 63931, 63930, 2076, 1093, 9882, 63934, - 2082, 63932, 75050, 63929, 63928, 63927, 77934, 9806, 65566, 77933, - 63922, 63921, 2086, 0, 63926, 2984, 5968, 63923, 0, 0, 129458, 11137, - 13169, 5290, 2089, 0, 63827, 1088, 63825, 7268, 1084, 1085, 63829, 1083, - 10131, 7283, 0, 0, 0, 1092, 0, 7273, 983272, 44016, 43627, 0, 0, 0, + 120912, 129564, 0, 1112, 119122, 8686, 120654, 0, 65081, 0, 0, 0, 11077, + 0, 7260, 0, 5327, 0, 63870, 63869, 3847, 63867, 0, 2903, 0, 3001, 66762, + 0, 43746, 0, 63866, 0, 0, 0, 0, 0, 127785, 68420, 2990, 0, 128254, 0, 0, + 0, 0, 1117, 118987, 12212, 129003, 129151, 63836, 63835, 63834, 0, 0, + 63839, 63838, 63837, 0, 125095, 63833, 6042, 66360, 0, 74808, 0, 63821, + 63820, 63819, 63818, 0, 0, 9047, 63822, 128328, 6091, 0, 10691, 0, 74344, + 8226, 0, 63812, 63811, 63810, 63809, 2289, 63815, 63814, 63813, 6047, 0, + 0, 780, 63808, 77925, 77922, 65147, 63931, 63930, 2076, 1093, 9882, + 63934, 2082, 63932, 75050, 63929, 63928, 63927, 77934, 9806, 65566, + 77933, 63922, 63921, 2086, 0, 63926, 2984, 5968, 63923, 0, 0, 129458, + 11137, 13169, 5290, 2089, 0, 63827, 1088, 63825, 7268, 1084, 1085, 63829, + 1083, 10131, 7283, 0, 0, 0, 1092, 0, 7273, 983272, 44016, 43627, 0, 0, 0, 11809, 0, 0, 0, 2965, 7258, 8808, 0, 1089, 7278, 63937, 63936, 43405, - 11106, 940, 5787, 10099, 63938, 0, 63897, 126123, 2994, 0, 0, 0, 121041, - 77939, 77940, 77937, 77938, 74343, 93043, 72704, 660, 10127, 666, 0, - 5532, 43667, 5533, 77941, 0, 0, 0, 979, 0, 0, 72706, 92652, 9108, 0, - 128374, 129403, 63951, 71685, 0, 0, 128782, 63946, 1707, 983824, 128612, - 63950, 63949, 63948, 63947, 63945, 6038, 63943, 63942, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 73884, 0, 1690, 63919, 63918, 63917, 70865, 43659, 0, 983829, - 0, 2054, 0, 78515, 63916, 9184, 63914, 69737, 63911, 63910, 63909, 63908, - 0, 0, 63913, 6044, 0, 0, 9061, 5534, 10672, 11653, 124932, 5531, 0, 0, 0, - 0, 0, 0, 11957, 0, 68668, 0, 0, 0, 10474, 43426, 0, 42354, 0, 0, 0, 0, 0, - 8413, 66841, 0, 7269, 7272, 0, 0, 0, 125008, 78460, 0, 0, 0, 0, 126639, - 0, 0, 0, 66840, 0, 0, 128441, 0, 0, 0, 92187, 7270, 0, 0, 6628, 1076, - 128700, 0, 0, 0, 0, 0, 0, 12807, 43413, 63906, 4548, 63904, 71187, 70393, - 41729, 44005, 1307, 0, 0, 0, 0, 0, 128268, 0, 8180, 0, 127778, 0, 0, - 5413, 43681, 123205, 3493, 0, 0, 0, 92544, 73937, 10517, 0, 4518, 10990, - 0, 5167, 4481, 3771, 0, 2710, 0, 66277, 0, 0, 43073, 0, 0, 0, 0, 0, 0, - 119659, 1628, 0, 0, 0, 65262, 66809, 10783, 11172, 0, 0, 70840, 113679, - 0, 119029, 0, 0, 41530, 66843, 4457, 0, 0, 0, 0, 0, 41529, 0, 0, 6031, - 65807, 70814, 0, 0, 0, 69705, 0, 0, 11926, 6033, 9656, 0, 0, 0, 68869, 0, - 128930, 0, 128100, 0, 42612, 43655, 0, 0, 0, 66468, 0, 0, 68623, 0, 0, 0, - 0, 120869, 983343, 0, 0, 1151, 0, 73709, 127544, 0, 71106, 0, 0, 0, 0, 0, - 0, 0, 11527, 118870, 0, 0, 11538, 127387, 0, 11020, 0, 66467, 0, 8087, - 71700, 0, 9894, 0, 0, 70824, 120854, 0, 78513, 8053, 0, 0, 0, 0, 120495, - 0, 0, 63845, 0, 0, 78602, 0, 13084, 70170, 8741, 0, 0, 0, 0, 64605, - 83051, 0, 473, 43415, 0, 0, 119271, 1087, 124966, 71275, 0, 0, 66439, - 43218, 0, 0, 7237, 0, 0, 0, 0, 0, 92261, 0, 121036, 4384, 74220, 983779, - 2058, 917561, 0, 0, 0, 0, 0, 3857, 0, 0, 0, 64630, 0, 0, 74168, 0, - 125088, 4421, 0, 0, 0, 66400, 0, 68431, 0, 0, 0, 83053, 0, 0, 69640, - 127861, 0, 437, 0, 0, 0, 0, 65236, 13290, 119180, 4997, 64306, 0, 0, - 4999, 0, 0, 0, 4711, 120769, 0, 2739, 0, 92915, 74834, 0, 127175, 0, 0, - 0, 0, 0, 1779, 6600, 6601, 0, 5325, 0, 128437, 13058, 0, 0, 0, 92186, 0, - 71845, 10575, 43399, 0, 0, 0, 1104, 0, 0, 10655, 0, 0, 0, 0, 1082, - 110878, 0, 67401, 0, 0, 0, 0, 6783, 0, 0, 42867, 69655, 44021, 6458, 0, - 0, 0, 0, 0, 0, 1273, 43407, 0, 0, 0, 0, 1313, 6322, 41720, 128627, 66433, - 0, 0, 0, 11216, 0, 0, 0, 43437, 93833, 0, 0, 0, 5122, 0, 72728, 129520, - 70161, 0, 0, 0, 0, 0, 8303, 0, 128926, 0, 10003, 0, 0, 0, 1686, 0, 0, - 42834, 3664, 0, 126088, 121346, 0, 0, 4324, 126, 0, 0, 0, 0, 0, 65166, 0, - 0, 0, 0, 43817, 0, 43822, 0, 0, 65600, 13002, 0, 0, 0, 1103, 0, 119575, - 0, 0, 13078, 0, 8116, 0, 2050, 0, 0, 1102, 0, 6555, 0, 0, 74003, 74794, - 0, 0, 42591, 127278, 0, 1111, 0, 75047, 4707, 0, 0, 0, 0, 43468, 4522, - 8645, 0, 74857, 0, 11352, 0, 0, 0, 2293, 0, 0, 0, 128265, 71709, 0, 0, 0, - 93827, 0, 0, 0, 128488, 0, 160, 2677, 0, 0, 120141, 0, 0, 70790, 0, - 42770, 0, 0, 0, 43821, 113769, 0, 0, 43816, 0, 0, 1079, 3867, 64817, 0, - 0, 0, 0, 64768, 0, 0, 4005, 983211, 0, 10991, 0, 92957, 917578, 917581, - 917580, 917575, 128314, 917577, 917576, 917571, 78534, 917573, 917572, 0, - 0, 128359, 73458, 0, 3339, 11448, 1106, 917591, 917590, 917593, 3340, - 917587, 917586, 917589, 917588, 917583, 10605, 1309, 74996, 120743, - 92650, 0, 0, 9485, 0, 0, 0, 0, 0, 125002, 92533, 128487, 0, 129285, 4338, - 11238, 0, 66825, 0, 0, 0, 0, 0, 0, 74128, 0, 0, 73680, 0, 129438, 9553, - 1590, 63777, 63776, 128677, 63782, 63781, 63780, 63779, 1583, 0, 0, 0, 0, - 128011, 0, 0, 41522, 0, 92168, 983784, 66759, 0, 983584, 0, 0, 0, 0, - 11394, 0, 983071, 0, 66823, 1334, 0, 4479, 0, 0, 120663, 0, 122883, - 10497, 0, 0, 983777, 66828, 0, 0, 0, 6809, 63786, 0, 0, 63791, 63790, - 1145, 63788, 119143, 63785, 63784, 63783, 10192, 65267, 0, 0, 8928, 0, 0, - 0, 0, 0, 74216, 66805, 0, 0, 63759, 63758, 3523, 1074, 0, 121340, 74077, - 0, 0, 0, 63757, 43145, 63755, 63754, 63752, 1349, 63750, 63749, 0, 0, 0, - 63753, 63802, 41084, 72784, 0, 41930, 63805, 63804, 11140, 63801, 41082, - 43843, 42787, 123197, 0, 0, 0, 63793, 63792, 0, 128241, 10201, 12238, - 63795, 42358, 92394, 43862, 0, 0, 41932, 66826, 0, 0, 0, 121136, 0, 7950, - 63772, 63771, 63770, 0, 63767, 63766, 2793, 63764, 0, 128501, 63769, - 9530, 0, 92398, 0, 128642, 63763, 63762, 4595, 63760, 792, 0, 0, 0, 8742, - 0, 0, 0, 63744, 0, 0, 120815, 63748, 63747, 63746, 63745, 5055, 0, 0, - 1090, 0, 125268, 11665, 127809, 4558, 0, 72211, 0, 0, 0, 11513, 0, 6157, - 63775, 63774, 63773, 0, 12170, 9067, 0, 0, 10872, 129643, 43891, 43893, - 43892, 0, 43933, 0, 128231, 0, 0, 0, 0, 0, 11063, 0, 43888, 0, 0, 128368, - 43889, 0, 73807, 983104, 7386, 0, 0, 70295, 0, 0, 0, 71201, 128460, 0, 0, - 0, 0, 69915, 2918, 66820, 65300, 0, 127859, 64726, 2790, 0, 3793, 42065, - 127829, 0, 129560, 0, 0, 0, 0, 0, 92712, 0, 12923, 5270, 0, 0, 0, 65813, - 0, 128499, 0, 75012, 0, 10888, 0, 93997, 0, 3330, 129417, 0, 0, 0, 0, 0, - 8220, 0, 0, 0, 0, 1627, 0, 0, 0, 5371, 118938, 0, 1826, 118794, 0, 0, - 70023, 0, 0, 0, 71108, 0, 0, 0, 0, 92207, 68125, 74898, 101069, 0, 0, - 71098, 70029, 0, 43116, 0, 70019, 64346, 0, 0, 66818, 0, 70031, 0, 12666, - 120413, 120420, 120414, 120406, 120428, 0, 120431, 0, 65509, 0, 7449, 0, - 0, 0, 7438, 0, 0, 9054, 971, 0, 0, 0, 65195, 64767, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 64303, 0, 2303, 0, 0, 0, 0, 65833, 0, 7271, 0, 0, 0, 0, 12229, 0, - 0, 43411, 73751, 0, 64813, 0, 0, 10476, 0, 0, 3932, 64958, 0, 0, 73989, - 0, 0, 0, 113816, 0, 0, 0, 0, 0, 0, 92645, 65474, 4796, 118892, 129357, - 65479, 0, 42895, 0, 65500, 0, 9899, 92608, 0, 404, 65484, 120639, 0, - 5788, 127852, 0, 65491, 1831, 66020, 0, 983993, 92588, 0, 1343, 120784, - 0, 0, 12018, 0, 0, 0, 0, 0, 4422, 4708, 3799, 119358, 119357, 0, 120510, - 0, 119361, 119360, 983095, 0, 1364, 0, 8038, 0, 0, 12868, 0, 70425, - 55223, 0, 64414, 110689, 0, 0, 0, 0, 0, 0, 118802, 0, 42855, 118856, - 42866, 0, 0, 0, 0, 66438, 0, 983977, 119356, 119355, 119354, 0, 983580, - 0, 0, 67685, 128062, 119350, 0, 64512, 10404, 10340, 119352, 1556, 5274, - 0, 0, 10017, 9733, 0, 129476, 0, 41373, 0, 0, 0, 0, 0, 349, 4863, 41371, - 0, 0, 0, 0, 72295, 4398, 8543, 65618, 128018, 0, 0, 0, 0, 12441, 0, - 119348, 119347, 4318, 10452, 0, 8032, 0, 119349, 119344, 0, 127844, - 121156, 0, 110729, 119345, 8597, 0, 110727, 9864, 0, 0, 0, 0, 0, 0, 0, - 7722, 0, 0, 0, 0, 0, 66590, 0, 0, 0, 0, 0, 0, 4965, 0, 917536, 0, 123196, - 0, 0, 0, 10436, 119342, 43147, 119340, 10356, 10420, 982, 2756, 0, - 983978, 0, 0, 11162, 119338, 0, 92914, 0, 65110, 0, 0, 983781, 78543, 0, - 118793, 0, 128112, 119179, 64476, 1694, 8216, 0, 0, 78539, 0, 65620, 0, - 78537, 0, 0, 42158, 65621, 69955, 120324, 120327, 120326, 120321, 120320, - 120323, 120322, 12314, 65616, 55221, 43825, 983553, 119337, 68060, - 119335, 0, 71874, 123628, 128537, 119332, 73089, 0, 41347, 0, 0, 8842, 0, - 0, 4379, 127393, 12692, 0, 0, 66353, 71875, 0, 0, 92907, 0, 0, 71877, - 120303, 65619, 9872, 0, 0, 1846, 120309, 120308, 119256, 71192, 120305, - 120304, 120307, 6442, 120317, 120316, 5379, 120318, 110717, 120312, - 120315, 71876, 0, 65934, 66497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6151, + 11106, 940, 5787, 10099, 63938, 101269, 63897, 101271, 2994, 101265, + 101264, 101267, 101266, 77939, 77940, 77937, 77938, 74343, 93043, 72704, + 660, 10127, 666, 0, 5532, 43667, 5533, 77941, 0, 0, 0, 979, 0, 0, 72706, + 92652, 9108, 0, 128374, 129403, 63951, 71685, 0, 0, 128782, 63946, 1707, + 983824, 128612, 63950, 63949, 63948, 63947, 63945, 6038, 63943, 63942, + 101274, 0, 101276, 101275, 0, 0, 0, 0, 0, 0, 73884, 0, 1690, 63919, + 63918, 63917, 70865, 43659, 0, 983829, 0, 2054, 0, 78515, 63916, 9184, + 63914, 69737, 63911, 63910, 63909, 63908, 0, 0, 63913, 6044, 0, 0, 9061, + 5534, 10672, 11653, 124932, 5531, 101501, 101500, 101503, 101502, 0, 0, + 11957, 101498, 68668, 0, 0, 0, 10474, 43426, 0, 42354, 101492, 101491, + 101494, 101493, 101488, 8413, 66841, 101489, 7269, 7272, 0, 0, 101471, + 101470, 78460, 0, 101467, 101466, 101469, 101468, 0, 0, 0, 66840, 0, + 101465, 128441, 0, 101462, 101461, 92187, 7270, 101458, 101457, 6628, + 1076, 128700, 0, 101456, 0, 0, 0, 0, 12807, 43413, 63906, 4548, 63904, + 71187, 70393, 41729, 44005, 1307, 0, 101473, 101472, 0, 0, 128268, 0, + 8180, 0, 127778, 0, 0, 5413, 43681, 123205, 3493, 0, 0, 0, 92544, 73937, + 10517, 0, 4518, 10990, 101447, 5167, 4481, 3771, 101443, 2710, 0, 66277, + 0, 0, 43073, 0, 0, 0, 0, 0, 0, 119659, 1628, 0, 0, 0, 65262, 66809, + 10783, 11172, 0, 0, 70840, 113679, 0, 119029, 0, 0, 41530, 66843, 4457, + 0, 0, 0, 0, 0, 41529, 0, 0, 6031, 65807, 70814, 0, 101455, 71984, 69705, + 101452, 101451, 11926, 6033, 9656, 0, 0, 0, 68869, 0, 128930, 0, 128100, + 0, 42612, 43655, 0, 0, 0, 66468, 0, 0, 68623, 101423, 0, 0, 101420, + 101419, 101422, 101421, 0, 1151, 101418, 73709, 127544, 0, 71106, 0, 0, + 0, 0, 0, 101437, 101436, 11527, 101438, 0, 0, 11538, 101434, 0, 11020, 0, + 66467, 101432, 8087, 71700, 101433, 9894, 101427, 101430, 70824, 101424, + 0, 78513, 8053, 0, 0, 0, 0, 101407, 101406, 0, 63845, 101403, 101402, + 78602, 101404, 13084, 70170, 8741, 0, 0, 101401, 0, 64605, 83051, 101397, + 473, 43415, 101394, 101393, 101396, 1087, 124966, 71275, 101392, 0, + 66439, 43218, 0, 0, 7237, 101414, 101417, 101416, 71996, 101410, 92261, + 101412, 121036, 4384, 74220, 101408, 2058, 917561, 0, 129462, 0, 0, 0, + 3857, 0, 0, 0, 64630, 0, 0, 74168, 0, 125088, 4421, 0, 0, 101381, 66400, + 101383, 68431, 101377, 101376, 101379, 83053, 0, 0, 69640, 127861, 0, + 437, 0, 0, 0, 0, 65236, 13290, 119180, 4997, 64306, 0, 0, 4999, 0, 0, 0, + 4711, 120769, 0, 2739, 0, 92915, 74834, 0, 127175, 0, 0, 0, 0, 0, 1779, + 6600, 6601, 0, 5325, 101390, 101389, 13058, 101391, 101386, 0, 92186, + 101387, 71845, 10575, 43399, 0, 101385, 101384, 1104, 0, 0, 10655, 0, 0, + 0, 0, 1082, 110878, 0, 67401, 0, 0, 0, 0, 6783, 0, 0, 42867, 69655, + 44021, 6458, 0, 0, 0, 0, 0, 0, 1273, 43407, 0, 0, 0, 0, 1313, 6322, + 41720, 128627, 66433, 0, 0, 0, 11216, 0, 0, 0, 43437, 93833, 0, 0, 0, + 5122, 0, 72728, 129520, 70161, 0, 0, 0, 0, 0, 8303, 0, 128926, 0, 10003, + 0, 0, 0, 1686, 0, 0, 42834, 3664, 0, 126088, 121346, 0, 0, 4324, 126, 0, + 0, 0, 0, 0, 65166, 0, 0, 0, 0, 43817, 0, 43822, 0, 0, 65600, 13002, 0, 0, + 0, 1103, 0, 119575, 129452, 0, 13078, 0, 8116, 0, 2050, 0, 0, 1102, 0, + 6555, 0, 0, 74003, 74794, 0, 0, 42591, 127278, 0, 1111, 0, 75047, 4707, + 0, 0, 0, 0, 43468, 4522, 8645, 0, 74857, 0, 11352, 0, 0, 0, 2293, 0, 0, + 0, 128265, 71709, 0, 0, 0, 93827, 0, 0, 0, 128488, 0, 160, 2677, 0, 0, + 120141, 0, 0, 70790, 0, 42770, 0, 71986, 0, 43821, 113769, 0, 0, 43816, + 0, 0, 1079, 3867, 64817, 0, 0, 0, 0, 64768, 0, 0, 4005, 983211, 0, 10991, + 0, 92957, 917578, 917581, 917580, 917575, 128314, 917577, 917576, 917571, + 78534, 917573, 917572, 0, 0, 128359, 73458, 0, 3339, 11448, 1106, 917591, + 917590, 917593, 3340, 917587, 917586, 917589, 917588, 917583, 10605, + 1309, 74996, 120743, 92650, 0, 0, 9485, 0, 0, 0, 0, 0, 125002, 92533, + 128487, 0, 129285, 4338, 11238, 0, 66825, 0, 0, 0, 0, 0, 0, 74128, 0, 0, + 73680, 0, 129438, 9553, 1590, 63777, 63776, 128677, 63782, 63781, 63780, + 63779, 1583, 101525, 101528, 101527, 101522, 101521, 101524, 101523, + 41522, 0, 92168, 983784, 66759, 0, 983580, 0, 0, 0, 0, 11394, 0, 983071, + 0, 66823, 1334, 0, 4479, 0, 0, 120663, 0, 122883, 10497, 0, 0, 983777, + 66828, 0, 0, 0, 6809, 63786, 0, 0, 63791, 63790, 1145, 63788, 101535, + 63785, 63784, 63783, 10192, 65267, 101533, 101532, 8928, 0, 0, 0, 0, 0, + 74216, 66805, 0, 0, 63759, 63758, 3523, 1074, 0, 121340, 74077, 0, 0, 0, + 63757, 43145, 63755, 63754, 63752, 1349, 63750, 63749, 0, 0, 0, 63753, + 63802, 41084, 72784, 0, 41930, 63805, 63804, 11140, 63801, 41082, 43843, + 42787, 101514, 0, 101516, 101515, 63793, 63792, 0, 128241, 10201, 12238, + 63795, 42358, 92394, 43862, 101511, 101510, 41932, 66826, 101507, 101506, + 0, 121136, 0, 7950, 63772, 63771, 63770, 0, 63767, 63766, 2793, 63764, 0, + 128501, 63769, 9530, 0, 92398, 0, 128642, 63763, 63762, 4595, 63760, 792, + 0, 0, 0, 8742, 0, 0, 0, 63744, 0, 0, 120815, 63748, 63747, 63746, 63745, + 5055, 0, 0, 1090, 0, 125268, 11665, 127809, 4558, 0, 72211, 0, 0, 0, + 11513, 0, 6157, 63775, 63774, 63773, 0, 12170, 9067, 0, 0, 10872, 129643, + 43891, 43893, 43892, 129747, 43933, 0, 128231, 0, 0, 0, 0, 0, 11063, 0, + 43888, 0, 0, 128368, 43889, 0, 73807, 983104, 7386, 0, 0, 70295, 0, 0, 0, + 71201, 128460, 0, 0, 0, 0, 69915, 2918, 66820, 65300, 0, 127859, 64726, + 2790, 0, 3793, 42065, 127829, 0, 129560, 0, 0, 0, 0, 0, 92712, 0, 12923, + 5270, 0, 0, 0, 65813, 0, 128499, 0, 75012, 0, 10888, 0, 93997, 94180, + 3330, 129417, 0, 0, 0, 0, 0, 8220, 0, 0, 101581, 101580, 1627, 101582, 0, + 0, 5371, 101578, 0, 1826, 118794, 0, 0, 70023, 0, 0, 0, 71108, 0, 0, 0, + 0, 92207, 68125, 74898, 101069, 0, 72006, 71098, 70029, 0, 43116, 101589, + 70019, 64346, 0, 101585, 66818, 101587, 70031, 0, 12666, 120413, 120420, + 120414, 101567, 120428, 0, 101564, 101563, 65509, 101565, 7449, 0, + 101562, 0, 7438, 0, 0, 9054, 971, 101558, 101561, 101560, 65195, 64767, + 101557, 101556, 0, 0, 101553, 101552, 0, 0, 0, 64303, 101576, 2303, 0, + 101577, 101572, 101571, 65833, 101573, 7271, 0, 101570, 101569, 0, 12229, + 0, 0, 43411, 73751, 0, 64813, 0, 0, 10476, 0, 0, 3932, 64958, 0, 0, + 73989, 0, 0, 101542, 101541, 101544, 101543, 101538, 101537, 101540, + 101539, 92645, 65474, 4796, 118892, 129357, 65479, 0, 42895, 11858, + 65500, 0, 9899, 92608, 0, 404, 65484, 120639, 0, 5788, 127852, 0, 65491, + 1831, 66020, 0, 983993, 92588, 0, 1343, 120784, 0, 0, 12018, 0, 0, 0, 0, + 0, 4422, 4708, 3799, 101550, 119357, 0, 101547, 101546, 101549, 101548, + 983095, 0, 1364, 0, 8038, 101545, 0, 12868, 0, 70425, 55223, 0, 64414, + 110689, 0, 0, 0, 0, 0, 0, 118802, 0, 42855, 118856, 42866, 0, 0, 0, 0, + 66438, 0, 983977, 119356, 119355, 119354, 0, 983576, 0, 73013, 67685, + 128062, 119350, 0, 64512, 10404, 10340, 119352, 1556, 5274, 0, 127821, + 10017, 9733, 0, 129476, 0, 41373, 0, 0, 0, 0, 0, 349, 4863, 41371, 0, 0, + 0, 0, 72295, 4398, 8543, 65618, 128018, 0, 0, 0, 0, 12441, 0, 119348, + 119347, 4318, 10452, 0, 8032, 0, 119349, 119344, 0, 127844, 121156, 0, + 110729, 119345, 8597, 0, 110727, 9864, 0, 0, 0, 0, 0, 0, 0, 7722, 0, 0, + 0, 0, 0, 66590, 0, 0, 129850, 0, 0, 0, 4965, 0, 917536, 0, 123196, 0, 0, + 0, 10436, 119342, 43147, 119340, 10356, 10420, 982, 2756, 0, 983978, 0, + 0, 11162, 119338, 0, 92914, 0, 65110, 0, 0, 983781, 78543, 0, 118793, 0, + 128112, 119179, 64476, 1694, 8216, 0, 0, 78539, 0, 65620, 0, 78537, 0, 0, + 42158, 65621, 69955, 120324, 120327, 120326, 120321, 120320, 120323, + 120322, 12314, 65616, 55221, 43825, 983553, 119337, 68060, 119335, 0, + 71874, 123628, 128537, 119332, 73089, 0, 41347, 0, 0, 8842, 0, 0, 4379, + 127393, 12692, 0, 0, 66353, 71875, 0, 0, 92907, 0, 0, 71877, 120303, + 65619, 9872, 0, 0, 1846, 120309, 120308, 119256, 71192, 120305, 120304, + 120307, 6442, 120317, 120316, 5379, 120318, 110717, 120312, 120315, + 71876, 0, 65934, 66497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72002, 0, 6151, 12110, 0, 0, 0, 0, 0, 0, 0, 0, 68335, 0, 0, 0, 0, 0, 0, 66041, 9676, 10202, 0, 0, 0, 64575, 126637, 11965, 0, 124936, 0, 0, 0, 0, 0, 9698, 66293, 0, 119651, 0, 0, 41921, 0, 0, 0, 119258, 0, 0, 0, 0, 0, 8012, 12355, 12353, 0, 0, 74107, 0, 0, 41925, 0, 41920, 65444, 0, 0, 41923, 12694, 0, 10112, 1294, 0, 120091, 0, 120092, 0, 0, 128474, 121400, 0, 0, 0, 8718, 0, 10284, 10268, 10380, 10316, 92593, 0, 71850, 0, 0, 92889, 0, - 0, 0, 0, 9342, 12829, 0, 0, 0, 127978, 0, 0, 69428, 0, 73767, 72347, 0, - 7956, 598, 0, 72329, 93837, 0, 0, 128860, 0, 120041, 0, 0, 0, 0, 0, 847, - 0, 9529, 0, 0, 0, 0, 120035, 0, 0, 0, 67411, 0, 0, 0, 120040, 0, 128580, - 0, 9624, 0, 0, 0, 65463, 1554, 0, 0, 0, 0, 71879, 0, 0, 0, 121161, 19963, - 123625, 0, 72326, 92933, 71887, 10324, 10292, 65546, 0, 68141, 8372, 0, - 0, 83018, 120022, 10175, 10388, 42799, 0, 983180, 10568, 0, 127400, 0, 0, - 0, 983743, 0, 4366, 0, 983786, 0, 0, 42608, 0, 9884, 0, 0, 0, 0, 129180, - 0, 0, 0, 0, 1609, 0, 92773, 73448, 0, 11661, 0, 5818, 0, 0, 0, 9540, 0, - 2554, 5158, 0, 2213, 0, 0, 78522, 43079, 0, 0, 8264, 11175, 64553, - 120863, 42155, 0, 0, 0, 0, 0, 0, 8676, 0, 0, 0, 451, 0, 0, 0, 0, 0, 0, - 123167, 43609, 0, 0, 1440, 0, 0, 0, 127061, 11005, 0, 66656, 127063, 0, - 0, 0, 127065, 43393, 0, 120643, 0, 0, 0, 0, 120798, 0, 0, 0, 0, 0, 0, - 70435, 64356, 0, 0, 0, 383, 7154, 127815, 43495, 128809, 121448, 0, 0, 0, - 11286, 0, 0, 0, 0, 0, 0, 0, 42644, 0, 0, 0, 8292, 0, 4980, 113726, 92674, - 70130, 0, 0, 0, 0, 74912, 0, 10631, 83330, 100488, 68042, 0, 0, 7900, 0, - 0, 78779, 4198, 128555, 0, 0, 0, 123159, 0, 0, 12931, 0, 0, 0, 2088, 0, - 72164, 129284, 0, 0, 124951, 0, 0, 0, 69694, 0, 0, 8593, 0, 0, 0, 0, 0, + 0, 0, 0, 9342, 12829, 0, 0, 101239, 127978, 0, 0, 69428, 0, 73767, 72347, + 0, 7956, 598, 0, 72329, 93837, 0, 0, 128860, 0, 120041, 0, 0, 101242, 0, + 0, 847, 0, 9529, 0, 0, 0, 101247, 120035, 0, 0, 0, 67411, 0, 0, 0, + 120040, 0, 128580, 0, 9624, 0, 0, 0, 65463, 1554, 0, 0, 0, 0, 71879, 0, + 0, 0, 121161, 19963, 123625, 0, 72326, 92933, 71887, 10324, 10292, 65546, + 0, 68141, 8372, 0, 0, 83018, 120022, 10175, 10388, 42799, 0, 983180, + 10568, 0, 127400, 0, 0, 0, 983743, 0, 4366, 0, 983786, 0, 0, 42608, 0, + 9884, 0, 0, 0, 0, 129180, 0, 0, 0, 0, 1609, 0, 92773, 73448, 0, 11661, 0, + 5818, 0, 0, 0, 9540, 0, 2554, 5158, 0, 2213, 0, 0, 78522, 43079, 0, 0, + 8264, 11175, 64553, 120863, 42155, 0, 0, 0, 0, 0, 69552, 8676, 0, 129927, + 0, 451, 0, 0, 0, 0, 0, 0, 123167, 43609, 0, 0, 1440, 0, 0, 0, 127061, + 11005, 0, 66656, 127063, 0, 129936, 0, 127065, 43393, 0, 120643, 0, 0, 0, + 0, 120798, 0, 0, 0, 0, 0, 0, 70435, 64356, 0, 0, 0, 383, 7154, 127815, + 43495, 128809, 121448, 0, 0, 0, 11286, 0, 0, 0, 0, 0, 0, 0, 42644, + 129824, 129797, 129801, 8292, 0, 4980, 113726, 92674, 70130, 0, 0, 0, 0, + 74912, 0, 10631, 83330, 100488, 68042, 0, 0, 7900, 101252, 0, 78779, + 4198, 128555, 0, 0, 0, 123159, 0, 0, 12931, 0, 0, 0, 2088, 0, 72164, + 129284, 0, 0, 69265, 0, 0, 0, 69694, 129808, 129794, 8593, 0, 0, 0, 0, 0, 0, 11798, 0, 100483, 0, 0, 0, 64211, 128865, 120494, 0, 0, 0, 121228, 68901, 128788, 0, 0, 65162, 0, 0, 0, 0, 0, 128130, 0, 92264, 127153, 0, - 128818, 0, 0, 61, 0, 0, 92182, 119554, 0, 0, 12089, 0, 65834, 83281, + 128818, 0, 0, 61, 0, 74373, 92182, 119554, 0, 0, 12089, 0, 65834, 83281, 119671, 128701, 0, 0, 42566, 42743, 0, 69824, 0, 92653, 0, 0, 42621, 0, 0, 0, 0, 0, 43266, 0, 0, 0, 74843, 0, 0, 119103, 64417, 0, 0, 64737, 0, 0, 8930, 0, 0, 66900, 10056, 1800, 0, 0, 0, 0, 121175, 7743, 0, 0, 119528, 92640, 92453, 9034, 6039, 129139, 10075, 0, 0, 0, 10748, 0, 0, 0, 0, 0, 92984, 0, 0, 128183, 129421, 0, 43064, 127558, 0, 7539, 0, 0, 0, 0, - 0, 0, 0, 92898, 42567, 0, 0, 73886, 0, 0, 12326, 0, 0, 0, 0, 11355, 0, 0, - 0, 0, 69437, 0, 0, 0, 119537, 72327, 43005, 65342, 118902, 0, 0, 8644, 0, - 0, 11186, 74296, 41909, 0, 128682, 2791, 0, 1891, 0, 0, 41907, 66647, 0, - 0, 41906, 0, 0, 10773, 70206, 0, 0, 0, 6412, 2061, 8520, 13146, 0, 0, - 83275, 65902, 2882, 0, 126232, 65852, 0, 983306, 0, 123627, 0, 0, 0, 0, - 0, 128098, 0, 0, 0, 70871, 0, 0, 0, 120087, 0, 0, 0, 93971, 0, 3844, - 6842, 0, 0, 6612, 0, 0, 0, 0, 0, 783, 0, 0, 0, 983064, 68032, 119225, 0, - 0, 68378, 4556, 67839, 68480, 78663, 120069, 120074, 67657, 10510, 4382, - 74218, 42194, 0, 0, 9177, 8902, 93958, 9839, 0, 120700, 0, 0, 63999, - 41904, 41917, 9788, 120973, 0, 1862, 0, 0, 0, 41915, 0, 41919, 63994, - 41914, 7981, 0, 0, 0, 0, 0, 0, 0, 120834, 0, 0, 0, 6784, 78788, 0, 0, 0, - 0, 127534, 127484, 127476, 0, 0, 983941, 64289, 65289, 0, 129539, 129575, - 64509, 0, 0, 126505, 11051, 0, 66635, 55259, 65885, 0, 128310, 0, 0, 0, - 0, 7500, 4506, 0, 0, 0, 0, 0, 126609, 4040, 128680, 6167, 0, 0, 0, 0, 0, - 0, 7830, 43036, 0, 0, 63990, 19947, 63988, 63987, 0, 63993, 10440, 9611, - 0, 71883, 0, 65260, 63986, 11446, 63984, 92641, 3435, 119652, 0, 119108, - 0, 128632, 0, 0, 12748, 0, 0, 92705, 0, 78790, 0, 0, 63956, 42458, 63954, - 63953, 63960, 63959, 63958, 11596, 0, 11469, 70025, 42306, 2723, 0, 0, - 70027, 0, 0, 0, 128093, 2880, 0, 0, 0, 0, 128506, 3498, 4378, 0, 0, 0, - 65551, 118928, 0, 43387, 0, 64415, 128898, 0, 0, 0, 0, 8161, 393, 12013, - 0, 92216, 126479, 63965, 63964, 63963, 42345, 0, 0, 63967, 42498, 0, - 2927, 0, 63961, 0, 0, 983927, 0, 69699, 0, 42340, 0, 0, 0, 10730, 0, - 69688, 0, 64187, 0, 0, 12437, 9813, 0, 42453, 1604, 9565, 0, 69701, - 69235, 42414, 110724, 129196, 0, 42301, 11372, 0, 917973, 0, 0, 63980, - 63979, 63978, 0, 128207, 12017, 63982, 63981, 73687, 0, 63977, 63976, - 72794, 0, 0, 0, 63971, 4347, 4416, 63968, 11009, 63974, 63973, 402, - 69390, 13147, 0, 0, 64646, 13228, 0, 0, 3515, 74252, 65261, 0, 0, 6259, - 0, 0, 0, 0, 0, 0, 74813, 74425, 0, 126998, 126114, 0, 0, 0, 0, 983698, 0, - 0, 74301, 0, 0, 0, 0, 74060, 0, 0, 66235, 5145, 0, 0, 128394, 0, 73120, - 0, 7402, 0, 0, 0, 7952, 7832, 43382, 66616, 0, 983931, 120852, 0, 127875, - 64866, 0, 0, 0, 78784, 74248, 0, 0, 983196, 0, 0, 0, 78656, 42390, 0, 0, - 983921, 0, 0, 0, 0, 9508, 0, 9544, 11520, 0, 0, 3377, 0, 129562, 0, 0, 0, - 0, 0, 66280, 0, 127198, 0, 0, 0, 1955, 119565, 0, 0, 3076, 0, 42168, - 73049, 66304, 0, 0, 8917, 42403, 301, 0, 0, 0, 0, 0, 0, 0, 0, 67819, - 92987, 0, 0, 0, 983204, 0, 69403, 3182, 0, 0, 0, 0, 0, 42169, 123162, - 74244, 0, 42329, 0, 66326, 6841, 0, 128913, 0, 1219, 3934, 71276, 11483, - 74510, 0, 0, 42442, 65470, 0, 0, 64622, 7759, 42482, 485, 0, 0, 42290, 0, - 0, 42280, 0, 0, 11655, 64379, 127913, 42431, 10126, 42318, 0, 119631, - 74397, 42470, 0, 68315, 0, 110829, 74041, 0, 0, 0, 5411, 0, 0, 0, 64205, - 0, 64206, 42393, 64478, 1310, 125007, 0, 12052, 10643, 55271, 72727, 0, - 121045, 0, 0, 118852, 0, 0, 0, 0, 113826, 0, 0, 64385, 0, 0, 0, 0, 0, 0, - 93848, 92560, 2713, 0, 9650, 0, 0, 120602, 1406, 0, 78174, 92659, 0, - 68223, 0, 0, 0, 0, 43475, 0, 65287, 1508, 127938, 8779, 10569, 75034, 0, - 0, 0, 0, 0, 0, 0, 70786, 0, 0, 128344, 9185, 0, 42932, 43403, 0, 0, 0, 0, - 0, 0, 0, 0, 12955, 0, 2888, 0, 0, 0, 0, 0, 0, 0, 2878, 0, 0, 0, 0, 0, 0, - 129028, 13203, 0, 10429, 10365, 0, 0, 127165, 7503, 0, 113676, 68381, - 119658, 0, 8986, 0, 10632, 11934, 11452, 1332, 0, 0, 0, 0, 73741, 1791, - 8850, 9288, 0, 2892, 0, 43394, 555, 0, 0, 0, 0, 64172, 118899, 0, 0, 0, - 0, 8854, 0, 5858, 73101, 10582, 0, 0, 1361, 0, 0, 7905, 0, 65256, 0, - 41210, 0, 0, 71884, 0, 0, 0, 6828, 0, 92302, 0, 1342, 68440, 0, 64161, - 10903, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64381, 0, 0, 0, 42245, 126467, - 41972, 0, 0, 0, 9127, 0, 66619, 126489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11620, - 0, 1149, 68316, 0, 0, 0, 0, 0, 92492, 0, 118784, 0, 0, 0, 12838, 0, - 118819, 0, 0, 0, 0, 41087, 0, 0, 0, 0, 12036, 0, 0, 0, 0, 0, 64428, - 12227, 0, 0, 0, 0, 125248, 120964, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1743, - 0, 0, 0, 65186, 0, 0, 0, 0, 0, 64439, 0, 68062, 0, 111259, 111258, 43866, - 0, 111263, 3395, 9362, 111260, 0, 111257, 111256, 111255, 0, 0, 41091, - 3426, 1344, 111249, 111248, 126215, 4735, 11111, 6119, 111251, 42699, 0, - 0, 74818, 1423, 0, 0, 0, 0, 12039, 10559, 0, 0, 0, 9472, 67734, 11929, 0, - 0, 0, 0, 128826, 0, 11579, 0, 0, 128364, 0, 92185, 0, 0, 1004, 92584, 0, - 0, 0, 0, 0, 2556, 0, 0, 72790, 0, 0, 9686, 0, 0, 0, 70109, 111102, 0, - 10718, 13154, 111100, 9139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41708, 12860, - 41703, 0, 42090, 5403, 10352, 73917, 129144, 111096, 0, 5140, 3753, - 118785, 41704, 0, 43078, 127789, 111092, 129360, 0, 983205, 92362, 0, 0, - 2410, 92525, 0, 0, 0, 0, 0, 0, 0, 0, 119253, 0, 126601, 0, 2066, 74199, - 0, 43463, 10659, 119623, 68863, 0, 1336, 0, 0, 69463, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 272, 0, 0, 0, 0, 983946, 128133, 0, 0, 124940, 0, 1190, - 42146, 1335, 42177, 43867, 0, 0, 10448, 0, 125041, 0, 0, 2099, 5120, - 2409, 7799, 0, 74424, 0, 126581, 4731, 0, 111199, 111198, 111197, 111196, - 11689, 0, 74977, 9913, 129430, 0, 0, 0, 111195, 111194, 11694, 0, 11690, - 111189, 111188, 111187, 11693, 111193, 111192, 43097, 11688, 0, 78797, - 194, 111186, 111185, 111184, 0, 0, 0, 11226, 4519, 70337, 10898, 43072, - 70205, 0, 0, 0, 73094, 10695, 0, 7540, 0, 110984, 41859, 6067, 0, 0, 0, - 110981, 13311, 0, 41857, 0, 8359, 121224, 12689, 0, 983131, 64577, - 111204, 111203, 68183, 111209, 111208, 6064, 110988, 0, 110979, 74142, 0, - 111201, 111200, 6051, 123613, 0, 0, 983369, 0, 0, 0, 0, 0, 110864, 10537, - 110862, 1276, 0, 6549, 6052, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1960, 0, 71232, - 66297, 0, 129313, 0, 0, 1345, 111213, 111212, 111211, 8956, 43083, 0, - 111215, 64682, 0, 6430, 0, 111210, 119814, 0, 0, 0, 119817, 0, 492, - 43087, 0, 0, 0, 0, 0, 2582, 0, 0, 7444, 72863, 0, 2297, 111243, 73837, 0, - 0, 65096, 197, 74183, 0, 71125, 111241, 111240, 0, 66515, 43550, 119829, - 111229, 111228, 93764, 111226, 0, 0, 111231, 111230, 71686, 1799, 0, - 42148, 74336, 0, 0, 65340, 111220, 110974, 2262, 111217, 111224, 74931, - 111222, 10896, 0, 0, 0, 0, 6338, 111003, 110997, 110994, 111006, 111002, - 111005, 0, 111279, 111278, 111277, 72133, 0, 111273, 111272, 110961, - 3171, 6623, 4961, 0, 886, 55216, 8654, 0, 111270, 74390, 64603, 111267, - 129283, 68122, 0, 43084, 0, 0, 0, 0, 69693, 8994, 10944, 65938, 111239, - 111238, 111237, 111236, 66279, 92890, 42510, 0, 0, 6804, 0, 1947, 0, 0, - 0, 42759, 0, 1705, 983345, 0, 0, 0, 0, 72722, 74036, 0, 0, 66720, 111281, - 111280, 0, 4909, 111285, 111284, 111283, 4904, 0, 43503, 1365, 9253, - 42757, 0, 7462, 0, 0, 0, 0, 119587, 0, 917579, 92526, 0, 125035, 0, - 111311, 111310, 0, 0, 0, 0, 93977, 0, 0, 0, 0, 3629, 0, 13005, 0, 3628, - 0, 111295, 0, 0, 0, 0, 111290, 64809, 2928, 4905, 111083, 851, 55233, - 111291, 111059, 43086, 9114, 43870, 42583, 9315, 4822, 4906, 121097, - 2847, 111028, 10330, 0, 1251, 7777, 41852, 125059, 111327, 111032, - 111325, 12646, 0, 10259, 0, 65821, 75046, 6018, 0, 111324, 111323, - 111322, 68372, 111319, 111318, 71893, 2558, 0, 64584, 111321, 111320, 0, - 0, 0, 0, 111309, 111308, 111307, 111306, 73987, 74599, 71895, 93012, 0, - 128715, 0, 12867, 111296, 0, 0, 11044, 111300, 111299, 8904, 11824, - 65857, 0, 128674, 129027, 4387, 0, 0, 0, 0, 0, 0, 0, 11842, 0, 0, 0, - 5136, 1968, 983041, 126627, 1337, 0, 0, 0, 0, 66506, 0, 0, 0, 0, 42314, - 121384, 0, 0, 6120, 0, 65670, 68128, 0, 43082, 6016, 0, 42284, 71894, - 4276, 111314, 3619, 41638, 69691, 0, 42322, 8853, 111043, 0, 490, 0, - 13231, 68384, 72310, 65350, 0, 0, 0, 68245, 42435, 6154, 0, 65354, 0, 0, - 42397, 334, 72732, 42416, 65359, 65273, 74634, 128227, 4442, 10364, 0, - 778, 41626, 42455, 7989, 0, 3227, 69907, 111053, 0, 2915, 11502, 983212, - 41702, 10309, 0, 0, 0, 0, 0, 0, 0, 127268, 127258, 127267, 65215, 64410, - 127260, 71175, 0, 0, 0, 0, 0, 0, 41700, 110651, 0, 126488, 0, 0, 42495, - 0, 0, 0, 10460, 43364, 0, 1356, 3728, 42713, 0, 0, 42342, 10914, 0, - 42489, 64310, 66896, 41861, 42297, 0, 0, 41860, 64862, 0, 0, 5289, 42336, - 128658, 0, 92529, 42410, 0, 120624, 0, 2649, 74493, 0, 126635, 0, 3382, - 42449, 9081, 1658, 11936, 93019, 113814, 11269, 0, 0, 43100, 69888, - 65508, 0, 0, 121451, 0, 0, 0, 0, 0, 4732, 128283, 0, 0, 0, 121113, 2236, - 126551, 0, 6048, 0, 0, 73965, 0, 0, 0, 0, 10151, 9681, 4475, 0, 64735, - 2100, 0, 0, 6035, 0, 123599, 10296, 0, 0, 0, 0, 0, 0, 0, 983307, 68488, - 10392, 10328, 0, 43462, 0, 0, 0, 8979, 0, 0, 983304, 0, 0, 0, 10977, 0, - 10344, 0, 65299, 10408, 0, 0, 121187, 66505, 0, 0, 0, 0, 0, 0, 43074, - 73799, 0, 0, 0, 0, 3446, 0, 0, 128692, 0, 0, 119582, 4474, 0, 43093, - 6282, 0, 0, 127372, 0, 0, 0, 0, 0, 0, 0, 0, 66910, 67811, 92277, 0, - 64948, 0, 74347, 0, 0, 0, 983962, 8194, 0, 121165, 11010, 0, 8893, 0, - 983969, 0, 0, 0, 983317, 7925, 0, 0, 113825, 0, 1352, 11069, 7707, 0, - 126486, 0, 0, 0, 0, 65605, 6040, 0, 10071, 0, 128156, 43750, 0, 8899, - 69873, 0, 0, 983311, 128208, 7820, 69615, 0, 0, 7746, 1492, 0, 0, 0, - 66866, 0, 11788, 65913, 0, 0, 43095, 0, 0, 92265, 2999, 0, 120720, 0, - 371, 0, 6023, 0, 0, 11708, 0, 0, 6323, 0, 0, 0, 8938, 6043, 65866, 0, 0, - 0, 72419, 0, 129480, 2589, 74332, 1689, 7802, 0, 0, 0, 0, 66704, 0, 0, 0, - 0, 128127, 6049, 0, 4027, 0, 0, 111334, 111333, 1503, 111331, 0, 111337, - 11951, 111335, 2387, 0, 0, 8289, 111330, 7326, 66514, 65514, 0, 64865, 0, - 9668, 0, 0, 0, 0, 93060, 6036, 92768, 4026, 74089, 127091, 0, 0, 75044, - 110821, 0, 110819, 0, 0, 0, 0, 6021, 0, 128288, 0, 43155, 0, 110822, 0, - 111343, 42691, 111341, 111340, 0, 166, 0, 0, 0, 10623, 408, 0, 111339, - 13298, 0, 7426, 43694, 0, 0, 8811, 0, 0, 0, 0, 0, 74134, 983054, 0, - 127811, 0, 0, 0, 6645, 646, 128813, 0, 42129, 0, 120880, 0, 8697, 0, - 120936, 0, 0, 0, 0, 5809, 1950, 0, 92432, 68339, 0, 42136, 0, 0, 0, 0, 0, - 0, 111354, 983965, 0, 0, 111349, 111348, 43330, 111346, 111353, 111352, - 41567, 111350, 0, 0, 0, 0, 111345, 111344, 8285, 0, 4509, 0, 128361, 0, - 0, 0, 0, 0, 41727, 0, 0, 0, 0, 0, 0, 0, 74512, 7027, 3886, 0, 74023, + 0, 0, 0, 92898, 42567, 0, 0, 73886, 0, 129988, 12326, 0, 0, 0, 0, 11355, + 0, 0, 0, 0, 69437, 0, 129803, 129811, 119537, 72327, 43005, 65342, + 118902, 0, 0, 8644, 0, 0, 11186, 74296, 41909, 0, 128682, 2791, 0, 1891, + 0, 0, 41907, 66647, 0, 0, 41906, 0, 0, 10773, 70206, 0, 0, 0, 6412, 2061, + 8520, 13146, 0, 0, 83275, 65902, 2882, 0, 126232, 65852, 0, 983306, 0, + 123627, 0, 0, 0, 0, 0, 128098, 0, 0, 0, 70871, 0, 0, 0, 120087, 0, 0, 0, + 93971, 0, 3844, 6842, 0, 0, 6612, 0, 0, 0, 0, 0, 783, 0, 0, 0, 983064, + 68032, 119225, 0, 0, 68378, 4556, 67839, 68480, 78663, 120069, 120074, + 67657, 10510, 4382, 74218, 42194, 0, 0, 9177, 8902, 93958, 9839, 0, + 120700, 0, 0, 63999, 41904, 41917, 9788, 120973, 0, 1862, 0, 0, 0, 41915, + 0, 41919, 63994, 41914, 7981, 0, 0, 0, 0, 0, 0, 0, 120834, 0, 0, 0, 6784, + 78788, 0, 0, 0, 0, 127534, 127484, 127476, 0, 0, 983941, 64289, 65289, 0, + 129539, 129575, 64509, 0, 0, 126505, 11051, 0, 66635, 55259, 65885, 0, + 128310, 0, 0, 0, 0, 7500, 4506, 0, 0, 0, 0, 0, 126609, 4040, 128680, + 6167, 0, 0, 0, 0, 0, 0, 7830, 43036, 0, 0, 63990, 19947, 63988, 63987, 0, + 63993, 10440, 9611, 2244, 71883, 0, 65260, 63986, 11446, 63984, 92641, + 3435, 119652, 0, 119108, 0, 128632, 0, 0, 12748, 0, 0, 92705, 0, 78790, + 0, 0, 63956, 42458, 63954, 63953, 63960, 63959, 63958, 11596, 0, 11469, + 69267, 42306, 2723, 0, 0, 70027, 0, 0, 0, 128093, 2880, 0, 0, 0, 0, + 128506, 3498, 4378, 0, 129825, 0, 65551, 118928, 0, 43387, 0, 64415, + 128898, 0, 0, 0, 0, 8161, 393, 12013, 0, 92216, 126479, 63965, 63964, + 63963, 42345, 0, 0, 63967, 42498, 0, 2927, 0, 63961, 0, 0, 983927, 0, + 69699, 0, 42340, 0, 0, 0, 10730, 0, 69688, 0, 64187, 0, 0, 12437, 9813, + 0, 42453, 1604, 9565, 0, 69701, 69235, 42414, 110724, 129196, 0, 42301, + 11372, 0, 917973, 0, 0, 63980, 63979, 63978, 0, 128207, 12017, 63982, + 63981, 73687, 0, 63977, 63976, 72794, 0, 0, 0, 63971, 4347, 4416, 63968, + 11009, 63974, 63973, 402, 69390, 13147, 0, 0, 64646, 13228, 0, 0, 3515, + 74252, 65261, 0, 0, 6259, 0, 0, 0, 0, 0, 0, 74813, 74425, 0, 126998, + 126114, 0, 0, 0, 129933, 983698, 0, 0, 74301, 0, 0, 0, 0, 74060, 0, 0, + 66235, 5145, 0, 0, 128394, 0, 73120, 0, 7402, 0, 0, 0, 7952, 7832, 43382, + 66616, 0, 983931, 120852, 0, 127875, 64866, 0, 0, 0, 78784, 74248, 0, 0, + 983196, 0, 0, 0, 78656, 42390, 0, 0, 983921, 0, 0, 0, 0, 9508, 0, 9544, + 11520, 0, 0, 3377, 0, 129562, 0, 0, 0, 0, 0, 66280, 0, 127198, 0, 0, 0, + 1955, 119565, 0, 0, 3076, 0, 42168, 73049, 66304, 0, 0, 8917, 42403, 301, + 0, 0, 0, 0, 0, 0, 0, 0, 67819, 92987, 0, 0, 0, 983204, 0, 69403, 3182, 0, + 0, 0, 0, 0, 42169, 123162, 74244, 0, 42329, 0, 66326, 6841, 0, 128913, 0, + 1219, 3934, 71276, 11483, 74510, 101122, 0, 42442, 65470, 69565, 0, + 64622, 7759, 42482, 485, 0, 0, 42290, 0, 0, 42280, 0, 0, 11655, 64379, + 127913, 42431, 10126, 42318, 0, 119631, 74397, 42470, 0, 68315, 0, + 110829, 74041, 0, 0, 0, 5411, 0, 0, 0, 64205, 0, 64206, 42393, 64478, + 1310, 125007, 0, 12052, 10643, 55271, 72727, 0, 121045, 0, 0, 118852, 0, + 0, 0, 0, 113826, 0, 0, 64385, 0, 0, 0, 0, 0, 0, 93848, 92560, 2713, 0, + 9650, 0, 0, 120602, 1406, 0, 78174, 92659, 0, 68223, 0, 0, 0, 0, 43475, + 0, 65287, 1508, 127938, 8779, 10569, 75034, 0, 0, 0, 0, 0, 0, 0, 70786, + 0, 0, 128344, 9185, 0, 42932, 43403, 0, 0, 0, 0, 0, 0, 0, 0, 12955, 0, + 2888, 0, 0, 0, 0, 0, 0, 0, 2878, 0, 0, 0, 0, 0, 0, 129028, 13203, 0, + 10429, 10365, 0, 0, 127165, 7503, 0, 113676, 68381, 119658, 0, 8986, 0, + 10632, 11934, 11452, 1332, 0, 0, 0, 0, 73741, 1791, 8850, 9288, 0, 2892, + 0, 43394, 555, 0, 0, 0, 0, 64172, 118899, 0, 0, 0, 0, 8854, 0, 5858, + 73101, 10582, 0, 0, 1361, 0, 0, 7905, 0, 65256, 0, 41210, 0, 0, 71884, 0, + 0, 0, 6828, 0, 92302, 0, 1342, 68440, 0, 64161, 10903, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 64381, 0, 0, 0, 42245, 126467, 41972, 0, 0, 0, 9127, 0, + 66619, 126489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11620, 0, 1149, 68316, 0, 0, 0, + 0, 0, 92492, 0, 118784, 0, 0, 0, 12838, 0, 118819, 0, 0, 0, 0, 41087, 0, + 0, 0, 0, 12036, 0, 0, 0, 0, 0, 64428, 12227, 0, 0, 0, 0, 125248, 120964, + 0, 0, 0, 0, 0, 69566, 0, 0, 0, 0, 0, 1743, 0, 0, 0, 65186, 0, 0, 0, 0, 0, + 64439, 0, 68062, 0, 111259, 111258, 43866, 0, 111263, 3395, 9362, 111260, + 0, 111257, 111256, 111255, 0, 0, 41091, 3426, 1344, 111249, 111248, + 126215, 4735, 11111, 6119, 111251, 42699, 0, 0, 74818, 1423, 0, 0, 0, 0, + 12039, 10559, 0, 0, 0, 9472, 67734, 11929, 0, 0, 0, 0, 128826, 0, 11579, + 0, 0, 128364, 0, 92185, 0, 0, 1004, 92584, 0, 0, 0, 0, 0, 2556, 0, 0, + 72790, 0, 0, 9686, 0, 0, 0, 70109, 111102, 0, 10718, 13154, 111100, 9139, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 130035, 41708, 12860, 41703, 0, 42090, 5403, + 10352, 73917, 129144, 111096, 0, 5140, 3753, 118785, 41704, 0, 43078, + 127789, 111092, 129360, 0, 983205, 92362, 0, 0, 2410, 92525, 0, 0, 0, 0, + 0, 0, 0, 0, 119253, 0, 126601, 0, 2066, 74199, 0, 43463, 10659, 119623, + 68863, 0, 1336, 0, 0, 69463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126639, 0, 272, + 0, 0, 0, 0, 983946, 128133, 0, 0, 124940, 0, 1190, 42146, 1335, 42177, + 43867, 0, 0, 10448, 0, 125041, 0, 0, 2099, 5120, 2409, 7799, 0, 74424, 0, + 126581, 4731, 0, 111199, 111198, 111197, 111196, 11689, 0, 74977, 9913, + 129430, 0, 0, 0, 111195, 111194, 11694, 0, 11690, 111189, 111188, 111187, + 11693, 111193, 111192, 43097, 11688, 0, 78797, 194, 111186, 111185, + 111184, 0, 0, 0, 11226, 4519, 70337, 10898, 43072, 70205, 0, 0, 0, 73094, + 10695, 0, 7540, 0, 110984, 41859, 6067, 0, 110982, 0, 110981, 13311, 0, + 41857, 0, 8359, 121224, 12689, 0, 983131, 64577, 111204, 111203, 68183, + 111209, 111208, 6064, 110988, 0, 110979, 74142, 0, 111201, 111200, 6051, + 123613, 0, 0, 983369, 0, 0, 0, 0, 0, 110864, 10537, 110862, 1276, 0, + 6549, 6052, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1960, 0, 71232, 66297, 0, 129313, + 0, 0, 1345, 111213, 111212, 111211, 8956, 43083, 0, 111215, 64682, 0, + 6430, 69563, 111210, 119814, 0, 0, 0, 119817, 0, 492, 43087, 0, 0, 0, 0, + 0, 2582, 0, 0, 7444, 72863, 0, 2297, 111243, 73837, 0, 0, 65096, 197, + 74183, 0, 69571, 111241, 111240, 0, 66515, 43550, 119829, 111229, 111228, + 93764, 111226, 0, 0, 111231, 111230, 71686, 1799, 0, 42148, 74336, 0, 0, + 65340, 111220, 110974, 2262, 111217, 111224, 74931, 111222, 10896, 0, 0, + 0, 0, 6338, 111003, 110997, 110994, 111006, 111002, 111005, 0, 111279, + 111278, 111277, 72133, 0, 111273, 111272, 110961, 3171, 6623, 4961, 0, + 886, 55216, 8654, 110965, 111270, 74390, 64603, 111267, 129283, 68122, 0, + 43084, 0, 0, 0, 0, 69693, 8994, 10944, 65938, 111239, 111238, 111237, + 111236, 66279, 92890, 42510, 0, 0, 6804, 0, 1947, 0, 0, 0, 42759, 0, + 1705, 983345, 0, 0, 0, 0, 72722, 74036, 0, 0, 66720, 111281, 111280, 0, + 4909, 111285, 111284, 111283, 4904, 0, 43503, 1365, 9253, 42757, 0, 7462, + 0, 0, 0, 0, 119587, 0, 917579, 92526, 0, 125035, 0, 111311, 111310, 0, 0, + 0, 0, 93977, 0, 0, 0, 0, 3629, 0, 13005, 0, 3628, 0, 111295, 0, 0, 0, 0, + 111290, 64809, 2928, 4905, 111083, 851, 55233, 111291, 111059, 43086, + 9114, 43870, 42583, 9315, 4822, 4906, 121097, 2847, 111028, 10330, 0, + 1251, 7777, 41852, 125059, 111327, 111032, 111325, 12646, 0, 10259, 0, + 65821, 75046, 6018, 0, 111324, 111323, 111322, 68372, 111319, 111318, + 71893, 2558, 0, 64584, 111321, 111320, 0, 0, 0, 0, 111309, 111308, + 111307, 111306, 73987, 74599, 71895, 93012, 0, 128715, 0, 12867, 111296, + 0, 0, 11044, 111300, 111299, 8904, 11824, 65857, 0, 128674, 129027, 4387, + 0, 0, 0, 0, 0, 0, 0, 11842, 0, 0, 0, 5136, 1968, 983041, 126627, 1337, 0, + 0, 0, 0, 66506, 0, 0, 0, 0, 42314, 121384, 0, 0, 6120, 0, 65670, 68128, + 0, 43082, 6016, 0, 42284, 71894, 4276, 111314, 3619, 41638, 69691, 0, + 42322, 8853, 111043, 0, 490, 0, 13231, 68384, 72310, 65350, 0, 0, 0, + 68245, 42435, 6154, 0, 65354, 0, 0, 42397, 334, 72732, 42416, 65359, + 65273, 74634, 128227, 4442, 10364, 0, 778, 41626, 42455, 7989, 0, 3227, + 69907, 111053, 0, 2915, 11502, 983212, 41702, 10309, 0, 0, 0, 0, 0, 0, 0, + 127268, 127258, 127267, 65215, 64410, 127260, 71175, 0, 0, 0, 0, 0, 0, + 41700, 110651, 69266, 126488, 0, 0, 42495, 0, 0, 0, 10460, 43364, 0, + 1356, 3728, 42713, 0, 0, 42342, 10914, 0, 42489, 64310, 66896, 41861, + 42297, 0, 0, 41860, 64862, 0, 0, 5289, 42336, 128658, 0, 92529, 42410, + 71129, 120624, 0, 2649, 74493, 0, 126635, 0, 3382, 42449, 9081, 1658, + 11936, 93019, 113814, 11269, 0, 0, 43100, 69888, 65508, 0, 0, 121451, 0, + 0, 0, 0, 69272, 4732, 128283, 0, 0, 0, 121113, 2236, 126551, 0, 6048, 0, + 0, 73965, 0, 0, 0, 0, 10151, 9681, 4475, 0, 64735, 2100, 0, 0, 6035, 0, + 123599, 10296, 0, 0, 0, 0, 0, 0, 0, 983307, 68488, 10392, 10328, 0, + 43462, 0, 0, 0, 8979, 0, 0, 983304, 0, 0, 0, 10977, 0, 10344, 0, 65299, + 10408, 0, 0, 121187, 66505, 0, 0, 0, 0, 0, 0, 43074, 73799, 0, 0, 0, 0, + 3446, 0, 129891, 128692, 0, 0, 119582, 4474, 0, 43093, 6282, 0, 0, + 127372, 0, 0, 0, 129881, 0, 0, 0, 0, 66910, 67811, 92277, 0, 64948, 0, + 74347, 0, 0, 0, 983962, 8194, 0, 121165, 11010, 0, 8893, 0, 983969, 0, 0, + 0, 983317, 7925, 0, 0, 113825, 0, 1352, 11069, 7707, 0, 126486, 0, 0, 0, + 0, 65605, 6040, 0, 10071, 0, 128156, 43750, 0, 8899, 69873, 0, 0, 983311, + 128208, 7820, 69615, 0, 0, 7746, 1492, 0, 0, 0, 66866, 0, 11788, 65913, + 0, 0, 43095, 0, 0, 92265, 2999, 0, 120720, 0, 371, 0, 6023, 0, 0, 11708, + 0, 0, 6323, 0, 0, 0, 8938, 6043, 65866, 0, 0, 0, 72419, 0, 129480, 2589, + 74332, 1689, 7802, 0, 0, 0, 0, 66704, 0, 129992, 0, 0, 128127, 6049, 0, + 4027, 0, 0, 111334, 111333, 1503, 111331, 0, 111337, 11951, 111335, 2387, + 0, 0, 8289, 111330, 7326, 66514, 65514, 0, 64865, 0, 9668, 0, 0, 0, 0, + 93060, 6036, 92768, 4026, 74089, 127091, 0, 0, 75044, 110821, 0, 110819, + 0, 0, 0, 0, 6021, 0, 128288, 0, 43155, 0, 110822, 0, 111343, 42691, + 111341, 111340, 2246, 166, 0, 0, 0, 10623, 408, 0, 111339, 13298, 0, + 7426, 43694, 0, 0, 8811, 0, 0, 0, 0, 0, 74134, 983054, 0, 127811, 0, 0, + 0, 6645, 646, 128813, 0, 42129, 0, 120880, 0, 8697, 0, 120936, 0, 0, 0, + 0, 5809, 1950, 0, 92432, 68339, 0, 42136, 0, 0, 0, 0, 0, 0, 111354, + 983965, 0, 0, 111349, 111348, 43330, 111346, 111353, 111352, 41567, + 111350, 0, 0, 0, 0, 111345, 111344, 8285, 0, 4509, 0, 128361, 0, 0, + 129851, 0, 0, 41727, 0, 0, 0, 0, 0, 0, 0, 74512, 7027, 3886, 0, 74023, 92888, 0, 0, 126092, 94058, 119855, 0, 121455, 11707, 119852, 0, 7939, 10342, 92460, 72747, 121408, 917569, 0, 71198, 94077, 119847, 0, 0, 7201, 0, 0, 120866, 983968, 1540, 0, 0, 0, 0, 0, 41718, 71177, 0, 0, 128001, 0, 0, 119040, 0, 9619, 120840, 0, 0, 0, 0, 3560, 0, 6070, 129000, 0, 2922, 6082, 70147, 65009, 983954, 0, 0, 0, 0, 0, 0, 3607, 65863, 0, 92487, - 42153, 121042, 0, 983843, 2032, 0, 0, 0, 0, 0, 0, 43085, 6057, 0, 0, 0, - 0, 0, 0, 0, 0, 638, 6083, 126976, 0, 0, 2305, 0, 0, 0, 6056, 10878, 0, 0, - 6085, 0, 0, 3915, 0, 0, 0, 0, 0, 0, 4028, 1787, 0, 43096, 0, 0, 1768, 0, - 0, 0, 128125, 0, 0, 583, 129137, 0, 0, 66004, 0, 0, 0, 0, 0, 55267, + 42153, 121042, 0, 983843, 2032, 0, 0, 0, 0, 129985, 0, 43085, 6057, 0, 0, + 0, 0, 0, 0, 0, 0, 638, 6083, 126976, 0, 0, 2305, 0, 0, 0, 6056, 10878, 0, + 0, 6085, 0, 0, 3915, 0, 0, 0, 0, 0, 0, 4028, 1787, 0, 43096, 0, 0, 1768, + 0, 0, 0, 128125, 0, 0, 583, 129137, 0, 0, 66004, 0, 0, 0, 0, 0, 55267, 120810, 128995, 43075, 65049, 0, 74531, 0, 93009, 70694, 0, 0, 129375, 9869, 128815, 1771, 0, 0, 0, 0, 0, 0, 119115, 113708, 0, 0, 74101, 0, 0, - 0, 0, 0, 0, 0, 0, 12539, 123631, 0, 0, 0, 73862, 69842, 9897, 0, 100561, - 0, 0, 0, 0, 0, 8931, 0, 1415, 8866, 74552, 0, 128312, 0, 983576, 43106, - 0, 71089, 1580, 92278, 68424, 0, 0, 7658, 3440, 78215, 1562, 0, 0, - 129031, 0, 0, 0, 0, 0, 0, 6028, 68900, 42892, 0, 111016, 0, 0, 0, 0, 0, - 128269, 0, 66776, 42946, 127276, 129124, 0, 0, 0, 11599, 0, 11602, 11591, - 11574, 11581, 11597, 11598, 6253, 11571, 11584, 70273, 11569, 0, 8906, 0, - 5755, 2636, 0, 10815, 11619, 129094, 0, 7815, 11616, 11617, 70064, 11618, - 11604, 7869, 11612, 0, 42152, 0, 0, 0, 92586, 126247, 0, 92173, 0, 0, - 6616, 0, 0, 120875, 391, 0, 0, 0, 42296, 11588, 0, 0, 0, 68397, 0, 0, - 42335, 983188, 0, 0, 7538, 94040, 0, 42491, 0, 0, 128088, 4576, 0, 0, - 43809, 4277, 0, 3563, 0, 42338, 368, 0, 0, 42412, 0, 78209, 0, 0, 43814, - 983616, 1849, 0, 9921, 42451, 4253, 0, 0, 0, 42404, 64657, 73919, 3618, - 78338, 0, 0, 0, 0, 0, 929, 6827, 42035, 0, 0, 0, 67847, 0, 0, 0, 0, 0, 0, - 0, 0, 4578, 64513, 0, 0, 0, 71049, 68090, 0, 43305, 0, 73462, 0, 0, - 42048, 10166, 0, 127095, 113810, 983127, 0, 983972, 0, 0, 42483, 0, 0, 0, - 42291, 0, 71047, 0, 6641, 525, 66404, 0, 8763, 125091, 0, 0, 0, 0, 0, - 42504, 42581, 74280, 6915, 42310, 0, 8559, 0, 983975, 125100, 0, 0, - 11666, 8679, 0, 1576, 42423, 0, 0, 73840, 983092, 11374, 0, 10889, - 129076, 0, 42462, 0, 77982, 0, 2718, 42424, 0, 0, 127166, 0, 1179, 0, 0, - 0, 363, 11015, 72229, 0, 43857, 0, 66692, 0, 0, 0, 11041, 0, 0, 0, 0, 0, - 125184, 0, 92520, 0, 9492, 66709, 9212, 12833, 0, 0, 1297, 0, 0, 0, 0, 0, - 0, 12924, 0, 0, 10090, 125249, 0, 42505, 0, 42507, 0, 42311, 92940, - 120919, 68401, 10759, 0, 0, 120924, 42351, 42919, 9398, 66292, 0, 9422, - 0, 0, 0, 0, 0, 129440, 92575, 1603, 0, 0, 0, 0, 0, 69703, 11250, 0, 0, - 10546, 0, 0, 11600, 0, 2797, 73821, 42427, 306, 714, 3058, 120154, 0, 0, - 0, 42395, 0, 11607, 0, 11198, 127512, 0, 72232, 129067, 0, 42433, 0, - 7603, 74063, 0, 42141, 0, 0, 0, 129085, 8244, 362, 125069, 0, 8037, 0, 0, - 0, 0, 41606, 66696, 77912, 0, 2093, 0, 0, 0, 41604, 0, 0, 0, 0, 10523, - 1446, 42320, 0, 0, 64773, 42472, 0, 0, 1722, 5581, 0, 64496, 0, 0, 64914, - 0, 42620, 128603, 124988, 0, 0, 10549, 0, 71190, 0, 0, 0, 0, 0, 71712, 0, - 0, 0, 0, 0, 0, 0, 7684, 66338, 0, 1174, 0, 0, 983621, 0, 0, 0, 42277, 0, - 42456, 65667, 0, 0, 0, 0, 42417, 0, 0, 120812, 42304, 0, 0, 0, 74443, - 127894, 0, 8313, 0, 0, 1316, 66690, 0, 0, 0, 0, 0, 0, 66844, 983696, 0, - 0, 0, 65200, 3383, 0, 0, 70063, 0, 0, 0, 42420, 119185, 0, 0, 983898, 0, - 121079, 0, 0, 42343, 124980, 42706, 1751, 42496, 65742, 13166, 0, 0, 0, - 0, 0, 42683, 12697, 0, 0, 0, 125047, 0, 42346, 0, 0, 3757, 0, 0, 121075, - 65869, 0, 9247, 74976, 3193, 0, 0, 42459, 7596, 7921, 0, 74095, 0, 42499, - 11590, 66006, 0, 42307, 0, 43953, 0, 0, 1023, 474, 0, 0, 0, 0, 42487, 0, - 0, 0, 42295, 0, 121474, 72237, 0, 9835, 0, 127782, 0, 12275, 0, 0, 8595, - 0, 0, 0, 0, 0, 10118, 0, 129156, 0, 0, 0, 0, 0, 0, 699, 0, 120923, 11601, - 0, 92941, 0, 7581, 0, 92530, 0, 0, 0, 7765, 65583, 0, 0, 64597, 43444, 0, - 92197, 0, 64279, 7036, 5823, 1937, 0, 917854, 65415, 13308, 65417, 0, - 65217, 0, 0, 11017, 0, 0, 7294, 0, 0, 0, 0, 42466, 65416, 68858, 0, - 71350, 65413, 92381, 126498, 12964, 42240, 1941, 0, 0, 1713, 0, 0, 0, - 11407, 42441, 128262, 6297, 0, 0, 0, 42481, 0, 0, 7179, 42289, 0, 120921, - 969, 0, 0, 0, 6165, 0, 0, 0, 0, 42402, 0, 0, 0, 129511, 0, 72234, 0, 0, - 64876, 92635, 6046, 0, 6208, 128870, 129309, 73749, 0, 0, 42422, 0, 0, - 128155, 73775, 338, 0, 121369, 0, 42328, 10767, 0, 8115, 0, 0, 0, 0, - 92687, 0, 0, 0, 0, 73029, 0, 0, 0, 71687, 4486, 128082, 0, 0, 10925, 0, - 0, 0, 0, 42309, 10257, 0, 10273, 7668, 10305, 42461, 74882, 42349, 8832, - 0, 0, 10644, 0, 129531, 42278, 0, 0, 69874, 0, 0, 42429, 0, 42316, 11223, - 0, 0, 42468, 0, 0, 0, 65402, 0, 0, 72235, 0, 0, 41963, 120990, 0, 0, - 125013, 6823, 42391, 1588, 65400, 0, 0, 0, 65398, 787, 0, 0, 0, 0, 2078, - 127239, 65399, 0, 0, 0, 65401, 0, 121196, 0, 0, 644, 0, 71335, 0, 3659, - 0, 0, 0, 13107, 92669, 0, 10502, 74457, 0, 11221, 41554, 0, 0, 0, 41557, + 0, 0, 0, 0, 0, 0, 12539, 123631, 0, 0, 129846, 73862, 69842, 9897, 0, + 100561, 0, 0, 0, 0, 0, 8931, 0, 1415, 8866, 74552, 0, 128312, 0, 983566, + 43106, 127275, 71089, 1580, 92278, 68424, 0, 0, 7658, 3440, 78215, 1562, + 0, 0, 129031, 0, 0, 0, 0, 0, 0, 6028, 68900, 42892, 0, 111016, 0, 0, 0, + 0, 0, 128269, 0, 66776, 42946, 127276, 129124, 0, 0, 120510, 11599, 0, + 11602, 11591, 11574, 11581, 11597, 11598, 6253, 11571, 11584, 70273, + 11569, 0, 8906, 0, 5755, 2636, 0, 10815, 11619, 129094, 0, 7815, 11616, + 11617, 70064, 11618, 11604, 7869, 11612, 0, 42152, 0, 0, 0, 92586, + 126247, 0, 92173, 0, 0, 6616, 0, 0, 120875, 391, 0, 0, 0, 42296, 11588, + 0, 0, 0, 68397, 0, 0, 42335, 983188, 0, 0, 7538, 94040, 0, 42491, 0, 0, + 128088, 4576, 0, 0, 43809, 4277, 0, 3563, 0, 42338, 368, 0, 0, 42412, 0, + 78209, 0, 0, 43814, 983616, 1849, 0, 9921, 42451, 4253, 0, 0, 0, 42404, + 64657, 73919, 3618, 78338, 0, 0, 0, 0, 0, 929, 6827, 42035, 0, 0, 0, + 67847, 0, 0, 0, 0, 0, 0, 0, 0, 4578, 64513, 0, 0, 0, 71049, 68090, + 127086, 43305, 0, 73462, 0, 0, 42048, 10166, 0, 127095, 113810, 983127, + 0, 983972, 0, 0, 42483, 0, 0, 0, 42291, 0, 71047, 0, 6641, 525, 66404, 0, + 8763, 125091, 0, 0, 0, 0, 0, 42504, 42581, 74280, 6915, 42310, 0, 8559, + 0, 983975, 125100, 0, 0, 11666, 8679, 0, 1576, 42423, 0, 0, 73840, + 983092, 11374, 0, 10889, 129076, 0, 42462, 0, 77982, 0, 2718, 42424, 0, + 0, 127166, 0, 1179, 0, 0, 0, 363, 11015, 72229, 0, 43857, 0, 66692, 0, 0, + 0, 11041, 72018, 0, 0, 0, 0, 125184, 0, 92520, 0, 9492, 66709, 9212, + 12833, 0, 0, 1297, 0, 0, 0, 0, 0, 0, 12924, 0, 0, 10090, 125249, 0, + 42505, 0, 42507, 0, 42311, 92940, 120919, 68401, 10759, 0, 0, 120924, + 42351, 42919, 9398, 66292, 0, 9422, 0, 0, 0, 0, 0, 129440, 92575, 1603, + 0, 0, 0, 0, 0, 69703, 11250, 0, 0, 10546, 0, 0, 11600, 0, 2797, 73821, + 42427, 306, 714, 3058, 120154, 0, 0, 0, 42395, 0, 11607, 0, 11198, + 127512, 0, 72232, 129067, 0, 42433, 0, 7603, 74063, 0, 42141, 0, 0, 0, + 129085, 8244, 362, 125069, 0, 8037, 0, 0, 0, 0, 41606, 66696, 77912, 0, + 2093, 0, 120676, 0, 41604, 0, 0, 0, 0, 10523, 1446, 42320, 0, 0, 64773, + 42472, 0, 0, 1722, 5581, 0, 64496, 0, 0, 64914, 0, 42620, 128603, 124988, + 0, 0, 10549, 0, 71190, 0, 0, 0, 0, 0, 71712, 0, 0, 0, 0, 0, 0, 0, 7684, + 66338, 0, 1174, 0, 0, 983621, 0, 0, 0, 42277, 0, 42456, 65667, 0, 0, 0, + 0, 42417, 0, 0, 120812, 42304, 0, 0, 0, 74443, 127894, 0, 8313, 0, 0, + 1316, 66690, 0, 0, 0, 0, 0, 0, 66844, 983696, 0, 0, 0, 65200, 3383, 0, 0, + 70063, 0, 0, 0, 42420, 119185, 0, 0, 983898, 0, 121079, 0, 0, 42343, + 124980, 42706, 1751, 42496, 65742, 13166, 0, 0, 0, 0, 0, 42683, 12697, 0, + 0, 0, 125047, 0, 42346, 0, 0, 3757, 0, 0, 121075, 65869, 0, 9247, 74976, + 3193, 0, 0, 42459, 7596, 7921, 0, 74095, 0, 42499, 11590, 66006, 0, + 42307, 0, 43953, 0, 0, 1023, 474, 0, 0, 0, 0, 42487, 0, 0, 0, 42295, 0, + 121474, 72237, 0, 9835, 0, 127782, 0, 12275, 0, 0, 8595, 0, 0, 0, 0, 0, + 10118, 0, 129156, 0, 0, 0, 0, 0, 0, 699, 0, 120923, 11601, 0, 92941, 0, + 7581, 0, 92530, 0, 0, 0, 7765, 65583, 0, 0, 64597, 43444, 0, 92197, 0, + 64279, 7036, 5823, 1937, 0, 917854, 65415, 13308, 65417, 0, 65217, 0, 0, + 11017, 0, 0, 7294, 0, 0, 0, 0, 42466, 65416, 68858, 0, 71350, 65413, + 92381, 126498, 12964, 42240, 1941, 0, 0, 1713, 0, 0, 0, 11407, 42441, + 128262, 6297, 0, 0, 0, 42481, 0, 0, 7179, 42289, 0, 120921, 969, 0, 0, 0, + 6165, 0, 0, 0, 0, 42402, 0, 0, 0, 129511, 0, 72234, 0, 0, 64876, 92635, + 6046, 0, 6208, 128870, 129309, 73749, 0, 0, 42422, 0, 0, 128155, 73775, + 338, 0, 121369, 0, 42328, 10767, 0, 8115, 0, 0, 0, 0, 92687, 0, 0, 0, 0, + 73029, 0, 0, 0, 71687, 4486, 128082, 0, 0, 10925, 0, 0, 0, 0, 42309, + 10257, 0, 10273, 7668, 10305, 42461, 74882, 42349, 8832, 0, 0, 10644, 0, + 129531, 42278, 0, 0, 69874, 0, 129949, 42429, 0, 42316, 11223, 0, 0, + 42468, 0, 0, 0, 65402, 0, 0, 72235, 0, 0, 41963, 120990, 0, 0, 125013, + 6823, 42391, 1588, 65400, 0, 0, 0, 65398, 787, 0, 0, 0, 0, 2078, 127239, + 65399, 0, 0, 0, 65401, 0, 121196, 0, 113816, 644, 0, 71335, 0, 3659, 0, + 0, 0, 13107, 92669, 0, 10502, 74457, 0, 11221, 41554, 0, 0, 0, 41557, 11209, 0, 11070, 119221, 0, 0, 73858, 41555, 9514, 0, 66771, 64641, 92447, 0, 7520, 73888, 77955, 0, 0, 0, 0, 0, 64527, 0, 0, 12723, 0, 68776, 0, 0, 0, 78835, 4055, 78826, 77960, 65212, 0, 127353, 12319, 0, 0, @@ -25024,53 +25855,54 @@ static const unsigned int code_hash[] = { 3588, 0, 12825, 0, 0, 128569, 0, 0, 0, 0, 0, 0, 0, 0, 128449, 64499, 65245, 127367, 1171, 127368, 69717, 127365, 1805, 8772, 0, 127363, 9930, 65247, 0, 0, 2338, 127362, 92695, 0, 0, 0, 69219, 0, 120104, 0, 120103, - 72221, 120106, 0, 118814, 8734, 4212, 0, 0, 66701, 0, 65862, 0, 120095, - 42903, 0, 0, 0, 126117, 426, 0, 120098, 8251, 0, 65436, 0, 2120, 43302, - 1224, 0, 65576, 0, 66876, 1764, 6074, 0, 12858, 0, 0, 65439, 6378, 74566, - 0, 41960, 0, 41644, 0, 2129, 0, 9222, 0, 0, 4259, 9092, 0, 41961, 0, 0, - 66357, 42331, 64935, 0, 0, 1293, 0, 2132, 0, 983589, 0, 2454, 0, 3613, - 128837, 71117, 0, 0, 69681, 10978, 10840, 0, 10668, 0, 127197, 9118, - 120164, 0, 0, 0, 1157, 64903, 8638, 0, 0, 0, 0, 0, 0, 0, 128981, 10086, - 0, 11128, 0, 0, 65430, 74013, 6079, 0, 10764, 127910, 64435, 128051, - 1339, 0, 65428, 1317, 8822, 0, 0, 0, 127143, 0, 0, 0, 43110, 0, 10428, 0, - 0, 0, 5742, 43076, 4692, 0, 0, 4007, 5004, 128781, 0, 751, 6595, 6596, 0, - 66373, 0, 0, 64908, 0, 6593, 72349, 12004, 119192, 74097, 43108, 0, 0, - 119333, 92188, 6598, 0, 6599, 0, 93031, 74194, 0, 121483, 66674, 6597, 0, - 73921, 0, 64745, 2281, 0, 0, 128996, 43790, 0, 2430, 41678, 0, 0, 43785, - 113716, 0, 121263, 0, 0, 1921, 0, 19927, 70390, 65406, 0, 43786, 4284, - 128346, 72210, 43789, 12841, 9229, 0, 42285, 0, 0, 0, 0, 3521, 0, 120888, - 8325, 0, 65403, 0, 1854, 0, 0, 0, 0, 0, 0, 0, 0, 4344, 0, 65433, 6076, 0, - 0, 74764, 12074, 0, 0, 0, 0, 12934, 119555, 65432, 128877, 0, 6071, - 65434, 0, 65435, 4053, 128623, 0, 0, 0, 0, 69823, 127463, 0, 121403, - 127473, 8421, 127472, 0, 43705, 502, 0, 65431, 0, 0, 0, 1303, 316, 7364, - 0, 2136, 0, 120796, 64365, 43480, 92639, 4860, 0, 127877, 0, 0, 9583, 0, - 5546, 0, 0, 0, 0, 0, 5544, 127475, 0, 70352, 5543, 128917, 72821, 12137, - 5548, 0, 0, 10007, 0, 127523, 6077, 0, 65452, 0, 119341, 11214, 65952, 0, - 72226, 0, 0, 1319, 74210, 65410, 67399, 92606, 0, 0, 119343, 0, 66716, - 83513, 4691, 128619, 9345, 621, 0, 0, 122889, 65411, 0, 74575, 121246, - 65408, 73899, 0, 9474, 2812, 119118, 65412, 3786, 65409, 8894, 83246, - 119611, 7923, 3716, 0, 0, 0, 0, 7012, 0, 128439, 9566, 0, 94176, 0, - 65012, 126242, 545, 9575, 0, 10050, 12718, 0, 8859, 6820, 0, 983979, - 120740, 0, 0, 9119, 2787, 0, 983981, 8507, 2012, 7985, 0, 0, 0, 0, - 194634, 0, 410, 0, 0, 120789, 120609, 0, 120378, 120379, 0, 0, 120374, - 72742, 120376, 120377, 120370, 120371, 120372, 120373, 3860, 120367, - 72205, 74031, 111131, 73685, 11748, 120365, 7941, 111134, 8749, 111132, - 12698, 111129, 361, 110793, 845, 0, 0, 0, 4562, 72241, 2926, 0, 4569, 0, - 110797, 43487, 0, 0, 0, 74287, 122885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6291, - 0, 0, 0, 9734, 0, 0, 0, 0, 127754, 7359, 83523, 43863, 0, 111150, 8769, - 111148, 111147, 111145, 4859, 111143, 111142, 0, 0, 0, 0, 12172, 111136, - 0, 127899, 111141, 64764, 4210, 111138, 0, 804, 0, 83520, 0, 70344, 0, 0, - 67202, 10091, 67200, 119257, 67206, 67205, 67204, 67203, 72302, 0, 0, 0, - 128959, 0, 1425, 92259, 119229, 11049, 0, 71480, 42649, 8482, 0, 0, - 66715, 67209, 11940, 67207, 664, 0, 0, 0, 70200, 127525, 0, 70194, 93061, - 111155, 68474, 111153, 6032, 67218, 67217, 7430, 194670, 70191, 0, 0, 0, - 0, 0, 41161, 0, 9765, 10993, 41162, 0, 70189, 1169, 111181, 0, 1905, - 6034, 41164, 64744, 43236, 0, 128800, 73110, 0, 0, 788, 0, 0, 111167, - 111128, 1663, 128976, 42901, 127237, 67211, 67210, 0, 0, 67215, 67214, - 67213, 67212, 111160, 111159, 111158, 111157, 0, 0, 0, 111161, 43612, 0, - 0, 0, 10855, 67223, 9355, 67221, 65198, 120355, 0, 221, 0, 0, 0, 121141, - 7191, 118930, 72208, 125212, 0, 0, 0, 0, 67228, 67227, 43333, 67225, 0, - 0, 0, 67229, 0, 7245, 0, 74405, 69922, 72219, 111178, 3873, 8367, 111174, + 72221, 120106, 129924, 118814, 8734, 4212, 0, 0, 66701, 0, 65862, 0, + 120095, 42903, 0, 0, 0, 126117, 426, 0, 120098, 8251, 0, 65436, 0, 2120, + 43302, 1224, 0, 65576, 0, 66876, 1764, 6074, 0, 12858, 0, 0, 65439, 6378, + 74566, 0, 41960, 0, 41644, 0, 2129, 0, 9222, 0, 0, 4259, 9092, 0, 41961, + 0, 0, 66357, 42331, 64935, 0, 0, 1293, 0, 2132, 0, 983569, 0, 2454, 0, + 3613, 128837, 71117, 0, 0, 69681, 10978, 10840, 0, 10668, 0, 127197, + 9118, 120164, 0, 0, 0, 1157, 64903, 8638, 0, 101295, 0, 0, 0, 0, 0, + 128981, 10086, 0, 11128, 0, 0, 65430, 74013, 6079, 0, 10764, 127910, + 64435, 128051, 1339, 0, 65428, 1317, 8822, 0, 0, 0, 127143, 0, 0, 0, + 43110, 0, 10428, 129848, 0, 0, 5742, 43076, 4692, 0, 0, 4007, 5004, + 128781, 0, 751, 6595, 6596, 0, 66373, 0, 0, 64908, 0, 6593, 72349, 12004, + 119192, 74097, 43108, 0, 0, 119333, 92188, 6598, 0, 6599, 0, 93031, + 74194, 0, 121483, 66674, 6597, 0, 73921, 0, 64745, 2281, 0, 0, 128996, + 43790, 0, 2430, 41678, 0, 0, 43785, 113716, 0, 121263, 0, 0, 1921, 0, + 19927, 70390, 65406, 0, 43786, 4284, 128346, 72210, 43789, 12841, 9229, + 0, 42285, 0, 0, 0, 0, 3521, 0, 120888, 8325, 0, 65403, 0, 1854, 0, 0, 0, + 0, 0, 0, 0, 0, 4344, 0, 65433, 6076, 0, 0, 74764, 12074, 0, 0, 0, 0, + 12934, 119555, 65432, 128877, 0, 6071, 65434, 0, 65435, 4053, 128623, 0, + 0, 0, 917934, 69823, 127463, 0, 121403, 127473, 8421, 127472, 0, 43705, + 502, 0, 65431, 0, 0, 0, 1303, 316, 7364, 0, 2136, 0, 120796, 64365, + 43480, 92639, 4860, 0, 127877, 0, 129728, 9583, 0, 5546, 0, 0, 0, 0, 0, + 5544, 127475, 0, 70352, 5543, 128917, 72821, 12137, 5548, 0, 0, 10007, 0, + 127523, 6077, 0, 65452, 0, 119341, 11214, 65952, 0, 72226, 0, 0, 1319, + 74210, 65410, 67399, 92606, 0, 0, 119343, 0, 66716, 83513, 4691, 128619, + 9345, 621, 0, 0, 122889, 65411, 0, 74575, 121246, 65408, 73899, 0, 9474, + 2812, 119118, 65412, 3786, 65409, 8894, 83246, 119611, 7923, 3716, 0, 0, + 0, 0, 7012, 0, 128439, 9566, 0, 94176, 0, 65012, 126242, 545, 9575, 0, + 10050, 12718, 0, 8859, 6820, 0, 129941, 120740, 0, 0, 9119, 2787, 0, + 983981, 8507, 2012, 7985, 0, 0, 0, 0, 194634, 0, 410, 0, 0, 120789, + 120609, 0, 120378, 120379, 0, 0, 120374, 72742, 120376, 120377, 120370, + 120371, 120372, 120373, 3860, 120367, 72205, 74031, 111131, 73685, 11748, + 120365, 7941, 111134, 8749, 111132, 12698, 111129, 361, 110793, 845, 0, + 0, 0, 4562, 72241, 2926, 0, 4569, 0, 110797, 43487, 0, 0, 0, 74287, + 122885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6291, 0, 0, 0, 9734, 0, 0, 0, 0, + 127754, 7359, 83523, 43863, 0, 111150, 8769, 111148, 111147, 111145, + 4859, 111143, 111142, 0, 0, 0, 0, 12172, 111136, 0, 127899, 111141, + 64764, 4210, 111138, 0, 804, 0, 83520, 0, 70344, 0, 0, 67202, 10091, + 67200, 119257, 67206, 67205, 67204, 67203, 72302, 0, 0, 0, 128959, 0, + 1425, 92259, 119229, 11049, 0, 71480, 42649, 8482, 0, 0, 66715, 67209, + 11940, 67207, 664, 0, 0, 0, 70200, 127525, 0, 70194, 93061, 111155, + 68474, 111153, 6032, 67218, 67217, 7430, 194670, 70191, 0, 0, 0, 0, 0, + 41161, 0, 9765, 10993, 41162, 0, 70189, 1169, 111181, 0, 1905, 6034, + 41164, 64744, 43236, 0, 128800, 73110, 0, 0, 788, 0, 0, 111167, 111128, + 1663, 128976, 42901, 127237, 67211, 67210, 0, 0, 67215, 67214, 67213, + 67212, 111160, 111159, 111158, 111157, 0, 0, 0, 111161, 43612, 0, 0, 0, + 10855, 67223, 9355, 67221, 65198, 120355, 0, 221, 0, 0, 0, 121141, 7191, + 118930, 72208, 125212, 0, 0, 0, 0, 67228, 67227, 43333, 67225, 0, 0, 0, + 67229, 0, 7245, 0, 74405, 69922, 72219, 111178, 3873, 8367, 111174, 111173, 111172, 43649, 0, 111177, 111176, 0, 11164, 0, 74403, 111171, 111170, 111169, 7682, 74404, 1462, 10235, 0, 0, 0, 0, 0, 111130, 0, 0, 74402, 0, 92299, 0, 0, 74052, 0, 126127, 120549, 0, 64295, 0, 0, 0, 0, 0, @@ -25079,185 +25911,188 @@ static const unsigned int code_hash[] = { 0, 8728, 0, 10904, 73446, 19936, 7833, 0, 0, 0, 0, 92546, 0, 0, 0, 8537, 0, 0, 0, 121244, 0, 0, 0, 128193, 0, 0, 0, 0, 3062, 0, 0, 0, 0, 0, 41160, 41147, 41158, 0, 120777, 0, 41155, 111116, 111115, 111114, 0, 121332, - 111119, 111118, 111117, 0, 0, 129091, 0, 0, 0, 64594, 2456, 66867, 0, 0, - 0, 0, 3721, 0, 0, 1230, 2678, 0, 3597, 917795, 0, 0, 92215, 0, 67737, - 8352, 0, 0, 0, 64515, 121378, 0, 129128, 67846, 0, 0, 92466, 0, 0, 71338, - 0, 8660, 0, 0, 0, 0, 0, 4483, 0, 0, 0, 6080, 0, 0, 1746, 1315, 0, 70201, - 0, 13140, 74508, 0, 0, 4480, 0, 111113, 111112, 0, 67979, 0, 6360, 10897, - 111106, 605, 68302, 110737, 69875, 110735, 110736, 66681, 0, 0, 0, 0, 0, - 0, 0, 10877, 118868, 64885, 0, 0, 0, 0, 0, 0, 345, 0, 0, 64606, 9917, 0, - 0, 92196, 0, 1776, 8422, 43992, 0, 0, 0, 126543, 43328, 0, 0, 1295, 0, - 42869, 0, 0, 0, 0, 128772, 65123, 125210, 11293, 11288, 0, 0, 65666, 0, - 92369, 65420, 0, 0, 4252, 0, 0, 0, 706, 72800, 0, 0, 0, 65419, 92177, 0, - 8419, 65421, 0, 66702, 0, 12670, 0, 0, 0, 0, 72825, 65422, 83008, 0, 0, - 0, 0, 0, 0, 9736, 4184, 65418, 0, 0, 74035, 0, 0, 0, 0, 0, 0, 129447, 0, - 7962, 12211, 9837, 83505, 0, 0, 5719, 0, 0, 119068, 73777, 1857, 0, 9927, - 0, 983940, 0, 10037, 0, 73695, 78322, 78319, 7818, 0, 0, 127769, 0, 0, 0, - 65077, 0, 78325, 78326, 78323, 43327, 43989, 0, 65828, 0, 0, 83499, 0, - 68390, 0, 110687, 78336, 78339, 9543, 78335, 78332, 78333, 0, 127964, 0, - 129552, 983895, 0, 69448, 0, 71429, 0, 0, 0, 11914, 69431, 0, 0, 0, 9949, - 0, 0, 119215, 0, 12073, 0, 0, 0, 0, 0, 2260, 0, 0, 0, 0, 0, 0, 1939, 0, - 0, 0, 69903, 0, 0, 0, 0, 6643, 92477, 0, 0, 78330, 78331, 78328, 78329, - 0, 92551, 0, 0, 0, 0, 0, 72417, 0, 0, 0, 0, 78341, 78342, 120944, 78340, - 129513, 127529, 92350, 3784, 78350, 0, 78348, 78349, 78345, 43324, 78343, - 78344, 2231, 0, 0, 0, 42467, 0, 0, 42894, 78363, 13281, 78360, 78361, - 78356, 78358, 78353, 64899, 0, 41149, 0, 43162, 68096, 41150, 0, 10571, - 67162, 67161, 67160, 67159, 6947, 41152, 887, 9249, 6565, 64806, 74366, - 0, 67158, 67157, 0, 10831, 67175, 67174, 120232, 65827, 43325, 67178, - 10168, 67176, 0, 0, 9190, 128497, 9666, 41997, 0, 0, 0, 0, 0, 0, 129411, - 0, 78508, 0, 78351, 78352, 0, 0, 72839, 983730, 0, 126604, 0, 0, 0, - 983417, 0, 2270, 0, 0, 0, 78365, 0, 67189, 72818, 0, 0, 0, 0, 0, 0, 0, - 72833, 0, 78366, 78367, 0, 0, 0, 0, 10137, 6121, 10995, 0, 71050, 8119, - 0, 71052, 0, 0, 0, 0, 0, 0, 0, 1394, 0, 0, 128960, 0, 67184, 2998, 67182, - 67181, 67188, 67187, 67186, 67185, 0, 0, 0, 0, 67180, 42003, 0, 0, 67193, - 67192, 67191, 67190, 67197, 67196, 67195, 67194, 0, 72770, 43315, 71051, - 0, 1593, 0, 125120, 619, 4635, 0, 72875, 0, 128859, 0, 0, 0, 0, 67199, - 67198, 0, 42790, 42006, 0, 0, 0, 128998, 10757, 9347, 127767, 0, 0, - 74227, 78904, 0, 74116, 128423, 121073, 120860, 0, 92427, 0, 0, 0, 0, - 64590, 0, 4371, 0, 0, 92478, 0, 0, 73977, 0, 0, 127847, 0, 120862, 0, - 64550, 73745, 70451, 0, 121013, 0, 0, 0, 129286, 0, 0, 0, 0, 9131, 0, - 125214, 0, 0, 0, 64260, 0, 12606, 0, 0, 0, 0, 562, 0, 0, 129648, 66455, - 127533, 3219, 0, 0, 0, 1037, 0, 64491, 0, 983676, 78572, 78580, 4568, - 549, 0, 0, 0, 0, 0, 128095, 70851, 0, 0, 0, 0, 0, 0, 0, 10825, 8079, - 118962, 0, 0, 0, 128855, 0, 13071, 0, 0, 41049, 42840, 43614, 129341, - 74881, 74596, 127191, 5212, 0, 66402, 119191, 0, 9747, 0, 0, 0, 983989, - 41047, 1668, 0, 0, 0, 1187, 0, 74416, 0, 0, 0, 0, 3240, 128518, 9213, 0, - 0, 0, 127174, 69822, 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, 0, 11272, 0, 73914, - 65048, 1909, 42172, 0, 0, 10736, 11580, 72228, 7615, 0, 0, 4237, 66576, - 0, 65815, 68083, 0, 0, 0, 3489, 0, 0, 0, 0, 0, 0, 127146, 3796, 6800, 0, - 65582, 0, 129521, 0, 0, 68036, 0, 0, 64857, 121213, 126493, 0, 66308, 0, - 0, 64634, 127817, 0, 0, 0, 0, 3246, 0, 43972, 128643, 0, 0, 0, 0, 120751, - 0, 0, 0, 0, 1496, 42827, 0, 942, 2378, 119213, 0, 0, 0, 0, 9510, 1232, - 8139, 0, 0, 0, 11409, 0, 6382, 0, 66319, 121237, 0, 0, 0, 127887, 2374, - 0, 8475, 120844, 66313, 0, 0, 64879, 119298, 0, 0, 70869, 0, 0, 129025, - 0, 7705, 11942, 0, 0, 3309, 0, 0, 0, 83345, 983847, 0, 0, 1280, 6998, - 128104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74239, 983073, 0, 0, 0, 6078, - 121354, 0, 1475, 0, 9938, 6084, 0, 983976, 0, 0, 0, 3256, 0, 43973, 0, 0, - 0, 8727, 0, 0, 0, 110831, 110832, 10562, 110830, 0, 0, 0, 3248, 0, 0, - 9015, 0, 0, 3635, 64337, 0, 0, 43852, 7195, 0, 2007, 64431, 0, 0, 0, 0, - 0, 0, 0, 65613, 77909, 0, 0, 0, 0, 119218, 7984, 11670, 74434, 127770, - 4176, 0, 2034, 69442, 11154, 65891, 0, 0, 318, 2038, 0, 0, 0, 3649, - 13149, 42145, 42798, 3634, 0, 0, 128483, 0, 0, 0, 11402, 120954, 94032, - 74238, 0, 43313, 0, 0, 7938, 0, 1761, 0, 65379, 68386, 128185, 1159, - 71183, 0, 0, 0, 66687, 120851, 0, 41680, 0, 0, 0, 1514, 11668, 67891, - 9313, 0, 128490, 67877, 0, 41681, 0, 0, 12848, 69982, 67873, 0, 74278, 0, - 0, 12649, 0, 0, 1194, 3242, 9761, 9555, 8598, 0, 120524, 0, 1551, 65447, + 111119, 111118, 111117, 129878, 0, 129091, 0, 0, 0, 64594, 2456, 66867, + 0, 0, 0, 0, 3721, 0, 0, 1230, 2678, 0, 3597, 917795, 0, 0, 92215, 0, + 67737, 8352, 0, 0, 0, 64515, 121378, 0, 129128, 67846, 0, 0, 92466, 0, 0, + 71338, 0, 8660, 0, 0, 0, 0, 0, 4483, 0, 0, 0, 6080, 0, 0, 1746, 1315, 0, + 70201, 0, 13140, 74508, 0, 0, 4480, 0, 111113, 111112, 0, 67979, 0, 6360, + 10897, 111106, 605, 68302, 110737, 69875, 110735, 110736, 66681, 0, 0, 0, + 0, 0, 0, 0, 10877, 118868, 64885, 0, 0, 0, 0, 0, 0, 345, 0, 0, 64606, + 9917, 0, 0, 92196, 0, 1776, 8422, 43992, 0, 0, 0, 126543, 43328, 0, 0, + 1295, 0, 42869, 0, 0, 0, 0, 128772, 65123, 125210, 11293, 11288, 0, 0, + 65666, 0, 92369, 65420, 0, 0, 4252, 0, 0, 0, 706, 72800, 0, 0, 129931, + 65419, 92177, 0, 8419, 65421, 0, 66702, 0, 12670, 0, 0, 0, 0, 72825, + 65422, 83008, 0, 0, 0, 0, 0, 0, 9736, 4184, 65418, 0, 0, 74035, 0, + 129955, 0, 0, 0, 0, 129447, 0, 7962, 12211, 9837, 83505, 0, 0, 5719, 0, + 0, 119068, 73777, 1857, 0, 9927, 0, 983940, 0, 10037, 0, 73695, 78322, + 78319, 7818, 0, 0, 127769, 0, 0, 0, 65077, 0, 78325, 78326, 78323, 43327, + 43989, 0, 65828, 0, 0, 83499, 0, 68390, 0, 110687, 78336, 78339, 9543, + 78335, 78332, 78333, 0, 127964, 0, 129552, 983895, 0, 69448, 0, 71429, 0, + 0, 0, 11914, 69431, 0, 0, 0, 9949, 0, 0, 119215, 0, 12073, 0, 0, 0, 0, + 101218, 2260, 0, 0, 0, 0, 0, 0, 1939, 0, 0, 0, 69903, 0, 0, 0, 0, 6643, + 92477, 0, 0, 78330, 78331, 78328, 78329, 0, 92551, 0, 0, 0, 0, 0, 72417, + 0, 0, 0, 0, 78341, 78342, 120944, 78340, 129513, 127529, 92350, 3784, + 78350, 0, 78348, 78349, 78345, 43324, 78343, 78344, 2231, 0, 0, 0, 42467, + 0, 0, 42894, 78363, 13281, 78360, 78361, 78356, 78358, 78353, 64899, 0, + 41149, 0, 43162, 68096, 41150, 0, 10571, 67162, 67161, 67160, 67159, + 6947, 41152, 887, 9249, 6565, 64806, 74366, 0, 67158, 67157, 0, 10831, + 67175, 67174, 120232, 65827, 43325, 67178, 10168, 67176, 0, 0, 9190, + 128497, 9666, 41997, 0, 0, 0, 0, 0, 0, 129411, 0, 78508, 0, 78351, 78352, + 0, 0, 72839, 983730, 0, 126604, 0, 0, 0, 983417, 0, 2270, 0, 129957, 0, + 78365, 0, 67189, 72818, 0, 0, 0, 0, 0, 0, 0, 72833, 101119, 78366, 78367, + 0, 0, 0, 0, 10137, 6121, 10995, 0, 71050, 8119, 0, 71052, 0, 0, 0, 0, 0, + 0, 0, 1394, 0, 0, 128960, 0, 67184, 2998, 67182, 67181, 67188, 67187, + 67186, 67185, 0, 101185, 0, 0, 67180, 42003, 0, 0, 67193, 67192, 67191, + 67190, 67197, 67196, 67195, 67194, 0, 72770, 43315, 71051, 0, 1593, 0, + 125120, 619, 4635, 0, 72875, 0, 128859, 0, 0, 0, 0, 67199, 67198, 0, + 42790, 42006, 0, 0, 0, 128998, 10757, 9347, 127767, 0, 0, 74227, 78904, + 0, 74116, 128423, 121073, 120860, 0, 92427, 0, 0, 0, 0, 64590, 0, 4371, + 0, 0, 92478, 0, 0, 73977, 0, 0, 127847, 0, 120862, 0, 64550, 73745, + 70451, 0, 121013, 0, 0, 0, 129286, 0, 0, 0, 0, 9131, 0, 125214, 0, 0, 0, + 64260, 0, 12606, 0, 0, 0, 0, 562, 0, 0, 129648, 66455, 127533, 3219, 0, + 0, 0, 1037, 0, 64491, 0, 983676, 78572, 78580, 4568, 549, 0, 0, 0, 0, 0, + 128095, 70851, 0, 0, 0, 0, 0, 129716, 0, 10825, 8079, 118962, 0, 0, 0, + 128855, 0, 13071, 0, 0, 41049, 42840, 43614, 129341, 74881, 74596, + 127191, 5212, 0, 66402, 119191, 0, 9747, 0, 0, 0, 983989, 41047, 1668, 0, + 0, 0, 1187, 0, 74416, 0, 0, 0, 0, 3240, 128518, 9213, 0, 0, 0, 127174, + 69822, 0, 0, 0, 0, 1623, 0, 0, 0, 0, 0, 0, 11272, 0, 73914, 65048, 1909, + 42172, 0, 0, 10736, 11580, 72228, 7615, 0, 0, 4237, 66576, 0, 65815, + 68083, 0, 0, 0, 3489, 0, 0, 0, 0, 0, 0, 127146, 3796, 6800, 0, 65582, 0, + 129521, 0, 0, 68036, 0, 0, 64857, 121213, 126493, 0, 66308, 0, 0, 64634, + 127817, 0, 0, 0, 0, 3246, 0, 43972, 128643, 0, 0, 0, 0, 120751, 0, 0, 0, + 0, 1496, 42827, 0, 942, 2378, 119213, 0, 0, 0, 0, 9510, 1232, 8139, 0, 0, + 0, 11409, 0, 6382, 0, 66319, 121237, 0, 0, 0, 127887, 2374, 0, 8475, + 120844, 66313, 0, 0, 64879, 119298, 0, 0, 70869, 0, 0, 129025, 0, 7705, + 11942, 0, 0, 3309, 0, 0, 0, 83345, 983847, 0, 0, 1280, 6998, 128104, 0, + 0, 0, 129945, 0, 0, 0, 0, 0, 0, 0, 74239, 983073, 0, 0, 0, 6078, 121354, + 0, 1475, 0, 9938, 6084, 0, 983976, 0, 0, 0, 3256, 0, 43973, 0, 0, 0, + 8727, 0, 0, 0, 110831, 110832, 10562, 110830, 0, 0, 0, 3248, 0, 0, 9015, + 0, 0, 3635, 64337, 0, 0, 43852, 7195, 0, 2007, 64431, 0, 0, 0, 0, 0, 0, + 0, 65613, 77909, 0, 0, 0, 0, 119218, 7984, 11670, 74434, 127770, 4176, + 69248, 2034, 69442, 11154, 65891, 0, 0, 318, 2038, 0, 0, 0, 3649, 13149, + 42145, 42798, 3634, 0, 0, 128483, 0, 0, 0, 11402, 120954, 94032, 74238, + 0, 43313, 0, 0, 7938, 0, 1761, 0, 65379, 68386, 128185, 1159, 71183, 0, + 0, 0, 66687, 120851, 0, 41680, 0, 0, 0, 1514, 11668, 67891, 9313, 0, + 128490, 67877, 0, 41681, 0, 0, 12848, 69982, 67873, 0, 74278, 0, 0, + 12649, 0, 0, 1194, 3242, 9761, 9555, 8598, 0, 120524, 0, 1551, 65447, 129414, 126211, 0, 0, 0, 67875, 0, 3495, 66648, 125079, 0, 73024, 983228, 0, 0, 10641, 0, 0, 0, 77845, 0, 0, 0, 0, 0, 11131, 0, 0, 0, 0, 0, 42685, - 92354, 193, 0, 0, 0, 42667, 0, 0, 92318, 119661, 0, 1362, 9558, 0, 0, 0, + 72017, 193, 0, 0, 0, 42667, 0, 0, 92318, 71958, 0, 1362, 9558, 0, 0, 0, 7351, 73789, 0, 0, 4426, 0, 0, 0, 0, 7276, 42163, 5220, 0, 0, 67822, 0, - 0, 0, 0, 41692, 0, 72283, 0, 0, 3223, 65492, 0, 0, 4549, 983687, 0, 0, 0, - 10807, 0, 0, 0, 42182, 8688, 12866, 0, 3294, 0, 0, 128101, 0, 64514, 0, - 43329, 0, 0, 0, 0, 119061, 0, 43422, 0, 0, 128618, 0, 42729, 0, 3215, - 120982, 68880, 917564, 0, 0, 0, 65682, 0, 0, 65924, 0, 983804, 0, 1501, - 0, 118807, 0, 0, 9607, 0, 65794, 72243, 983046, 10989, 0, 74399, 0, 0, - 7152, 0, 0, 129530, 7483, 125083, 0, 8104, 70128, 7474, 0, 72233, 0, 0, - 0, 8141, 0, 42537, 69612, 0, 0, 0, 0, 0, 127307, 42934, 0, 0, 0, 0, 0, 0, - 64517, 0, 0, 1650, 0, 0, 128502, 7901, 3238, 0, 65556, 0, 0, 65158, - 43416, 74959, 0, 7527, 0, 43319, 0, 0, 45, 0, 0, 0, 0, 0, 7347, 0, 0, 0, - 13129, 0, 9084, 0, 8737, 0, 0, 0, 66808, 9639, 7912, 2620, 0, 3564, 0, 0, - 0, 0, 75049, 0, 2853, 0, 0, 0, 0, 0, 2850, 8084, 0, 0, 71446, 92284, - 43122, 0, 0, 0, 0, 72214, 0, 74767, 0, 7331, 110646, 0, 8245, 0, 3158, - 92396, 3983, 0, 923, 0, 69397, 292, 0, 126548, 0, 3221, 1763, 0, 0, 0, 0, - 7253, 0, 68391, 75002, 0, 3637, 12996, 0, 70461, 0, 0, 3228, 0, 0, 0, 0, - 0, 0, 120833, 118939, 0, 7696, 0, 0, 0, 0, 43316, 4177, 0, 9089, 0, - 128805, 72116, 64500, 68133, 0, 0, 1856, 100572, 0, 6379, 0, 0, 0, 3208, - 0, 0, 0, 0, 0, 0, 129402, 0, 0, 0, 2033, 0, 0, 0, 55254, 7740, 0, 0, 0, - 128197, 0, 93988, 0, 67612, 0, 0, 41689, 129380, 0, 0, 6646, 0, 0, 0, - 983945, 0, 0, 4573, 0, 0, 0, 0, 0, 92961, 0, 128222, 41688, 0, 0, 0, + 0, 0, 0, 41692, 0, 72283, 0, 0, 3223, 65492, 0, 0, 4549, 983687, 0, 0, + 101162, 10807, 0, 0, 0, 42182, 8688, 12866, 0, 3294, 0, 0, 128101, 0, + 64514, 0, 43329, 129989, 0, 0, 0, 119061, 0, 43422, 0, 0, 128618, 0, + 42729, 0, 3215, 120982, 68880, 917564, 0, 0, 0, 65682, 0, 0, 65924, 0, + 983804, 0, 1501, 0, 118807, 0, 0, 9607, 0, 65794, 72243, 983046, 10989, + 0, 74399, 0, 0, 7152, 0, 0, 129530, 7483, 125083, 0, 8104, 70128, 7474, + 0, 5189, 0, 0, 0, 8141, 0, 42537, 69612, 0, 0, 0, 0, 0, 127307, 42934, 0, + 0, 0, 0, 0, 0, 64517, 0, 0, 1650, 0, 0, 128502, 7901, 3238, 0, 65556, 0, + 0, 65158, 43416, 74959, 0, 7527, 0, 43319, 0, 0, 45, 0, 0, 0, 0, 0, 7347, + 0, 0, 0, 13129, 0, 9084, 0, 8737, 0, 0, 0, 66808, 9639, 7912, 2620, 0, + 3564, 0, 0, 0, 0, 75049, 0, 2853, 0, 0, 0, 0, 0, 2850, 8084, 0, 0, 71446, + 92284, 43122, 0, 0, 0, 0, 72214, 0, 74767, 0, 7331, 110646, 0, 8245, 0, + 3158, 92396, 3983, 0, 923, 0, 69397, 292, 0, 126548, 0, 3221, 1763, 0, 0, + 0, 0, 7253, 0, 68391, 75002, 0, 3637, 12996, 0, 70461, 0, 0, 3228, 0, 0, + 0, 0, 0, 0, 120833, 118939, 0, 7696, 0, 0, 0, 0, 43316, 4177, 0, 9089, 0, + 128805, 72116, 64500, 68133, 0, 0, 1856, 100572, 0, 6379, 0, 118999, 0, + 3208, 0, 0, 0, 0, 0, 0, 129402, 0, 0, 0, 2033, 0, 0, 0, 55254, 7740, 0, + 0, 0, 128197, 0, 93988, 0, 67612, 0, 0, 41689, 129380, 0, 0, 6646, 0, 0, + 0, 983945, 0, 0, 4573, 0, 0, 0, 0, 0, 92961, 0, 128222, 41688, 0, 0, 0, 8314, 0, 0, 0, 0, 0, 66721, 0, 0, 121033, 0, 128226, 0, 0, 0, 13164, 0, 66237, 983963, 0, 0, 0, 3257, 0, 0, 1845, 0, 0, 0, 0, 128783, 0, 0, 0, 0, 3499, 8609, 0, 7145, 0, 0, 0, 0, 74829, 983988, 983291, 0, 0, 0, 7591, 0, - 0, 0, 983251, 70132, 128167, 0, 0, 0, 0, 119261, 0, 0, 0, 13083, 0, 0, 0, + 0, 0, 73778, 70132, 128167, 0, 0, 0, 0, 119261, 0, 0, 0, 13083, 0, 0, 0, 0, 66177, 983269, 5429, 0, 0, 68168, 66181, 0, 0, 983253, 0, 0, 5433, 67659, 0, 42776, 1547, 66176, 92428, 0, 5425, 4977, 9999, 0, 5423, 64560, 125094, 0, 0, 0, 74122, 0, 0, 0, 128003, 4418, 66199, 0, 92300, 0, 0, 0, 92224, 124995, 0, 11908, 0, 9360, 125101, 983202, 0, 66187, 12837, 983288, 0, 11112, 0, 92321, 43318, 0, 0, 0, 0, 126518, 120604, 0, 983286, - 0, 983281, 0, 983782, 0, 9958, 0, 125108, 0, 0, 0, 2433, 128602, 0, 3352, + 0, 129595, 0, 983782, 0, 9958, 0, 125108, 0, 0, 0, 2433, 128602, 0, 3352, 0, 0, 0, 0, 0, 0, 305, 567, 67662, 0, 69979, 65242, 0, 41695, 0, 0, 0, 7837, 917625, 129002, 5337, 917622, 7325, 43312, 917619, 68742, 917617, 74086, 68777, 917614, 917613, 10973, 917611, 1372, 128768, 917608, 917607, 1254, 917605, 917604, 93967, 917602, 65228, 113753, 0, 67723, 8068, 0, 0, 983951, 0, 3245, 64393, 119069, 0, 0, 0, 0, 0, 0, 0, 983279, - 0, 119563, 0, 0, 0, 126638, 0, 0, 43322, 0, 0, 0, 0, 92698, 3226, 67695, - 0, 0, 983939, 10200, 0, 128779, 127821, 0, 65610, 0, 0, 0, 3585, 250, - 129598, 43320, 0, 0, 0, 0, 1152, 0, 1688, 0, 0, 0, 0, 0, 121040, 128340, - 0, 0, 0, 2107, 0, 129048, 0, 0, 0, 43868, 0, 0, 0, 128239, 0, 0, 127777, - 0, 6927, 42267, 42261, 11464, 3365, 0, 0, 0, 0, 0, 41869, 0, 0, 0, 43326, - 0, 11519, 0, 5530, 5210, 0, 983970, 0, 5208, 0, 128842, 0, 2424, 7976, 0, - 0, 3244, 5529, 0, 73894, 128852, 5432, 0, 5527, 0, 78484, 0, 5528, 0, 0, - 120281, 0, 0, 43545, 120282, 0, 0, 73686, 42565, 0, 0, 3206, 120278, 0, - 0, 0, 0, 0, 211, 3216, 83407, 0, 120998, 3220, 68750, 0, 0, 8951, 5214, - 0, 8118, 0, 10768, 8735, 0, 5852, 124952, 0, 0, 0, 0, 0, 2623, 0, 0, 0, - 127388, 4698, 66509, 0, 0, 4701, 0, 120289, 74225, 120284, 8267, 0, 1421, - 66426, 0, 0, 2625, 92724, 0, 74309, 0, 0, 0, 7850, 120296, 69639, 127032, - 0, 0, 43384, 12660, 110663, 0, 0, 110706, 110661, 0, 92380, 0, 0, 69649, - 0, 713, 41073, 0, 3990, 0, 0, 0, 5017, 128313, 120352, 0, 0, 1030, 0, - 983120, 9513, 0, 0, 0, 4668, 0, 120350, 0, 6339, 0, 0, 0, 64650, 0, 0, - 74766, 983850, 8908, 0, 0, 0, 0, 10752, 13003, 68769, 0, 41307, 8732, - 120336, 0, 41310, 0, 4696, 0, 983934, 0, 120334, 3641, 5419, 0, 0, 0, 0, - 120344, 128129, 0, 7320, 65230, 11808, 0, 93970, 936, 13289, 0, 69892, - 65774, 0, 65243, 0, 19953, 0, 126469, 121375, 127256, 12913, 70722, - 68759, 0, 0, 70203, 0, 4113, 0, 2372, 1819, 0, 128053, 12152, 0, 682, - 7655, 120330, 0, 0, 10593, 1703, 0, 0, 8033, 69953, 0, 9810, 0, 0, - 127949, 0, 119159, 10109, 0, 73898, 0, 71730, 126704, 0, 0, 917620, 1965, - 917621, 0, 0, 73887, 0, 0, 0, 6314, 0, 8501, 0, 0, 0, 41317, 0, 5417, - 983586, 0, 0, 9353, 68148, 41315, 0, 11161, 0, 41314, 194892, 0, 126562, - 119236, 634, 0, 0, 0, 69779, 4355, 12016, 0, 9654, 12856, 6924, 7660, 0, - 0, 0, 0, 0, 42692, 0, 74604, 0, 0, 0, 680, 6274, 0, 1181, 0, 3174, 67248, - 0, 0, 0, 0, 113776, 10650, 917603, 92295, 70672, 118965, 0, 64644, - 126981, 0, 0, 0, 0, 983942, 0, 65302, 40989, 68239, 68230, 68234, 0, 0, - 124989, 0, 40987, 4667, 0, 983944, 8828, 0, 0, 0, 4746, 0, 0, 2269, 4749, - 0, 100598, 65192, 4744, 7345, 0, 242, 100595, 0, 8217, 0, 68919, 0, 0, 0, - 0, 66790, 10850, 0, 0, 0, 0, 0, 0, 64680, 0, 0, 120562, 0, 127324, 0, + 0, 119563, 129935, 78865, 0, 126638, 0, 0, 43322, 0, 0, 0, 0, 92698, + 3226, 67695, 0, 0, 983939, 10200, 0, 128779, 101143, 0, 65610, 0, 0, 0, + 3585, 250, 101142, 43320, 0, 0, 0, 0, 1152, 129849, 1688, 0, 0, 0, 0, 0, + 121040, 128340, 0, 0, 0, 2107, 0, 129048, 0, 0, 0, 43868, 129832, 129817, + 0, 128239, 0, 0, 127777, 0, 6927, 42267, 42261, 11464, 3365, 0, 0, 0, 0, + 0, 41869, 0, 0, 0, 43326, 0, 11519, 0, 5530, 5210, 0, 983970, 0, 5208, 0, + 128842, 0, 2424, 7976, 0, 0, 3244, 5529, 0, 73894, 128852, 5432, 0, 5527, + 0, 78484, 0, 5528, 0, 0, 120281, 0, 0, 43545, 120282, 0, 0, 73686, 42565, + 0, 0, 3206, 120278, 0, 0, 101149, 0, 0, 211, 3216, 83407, 0, 120998, + 3220, 68750, 0, 0, 8951, 5214, 0, 8118, 0, 10768, 8735, 0, 5852, 124952, + 0, 0, 121110, 0, 0, 2623, 0, 0, 0, 127388, 4698, 66509, 0, 0, 4701, 0, + 120289, 74225, 120284, 8267, 0, 1421, 66426, 0, 0, 2625, 92724, 0, 74309, + 0, 0, 0, 7850, 120296, 69639, 127032, 0, 0, 43384, 12660, 110663, 0, 0, + 110706, 110661, 0, 92380, 0, 0, 69649, 0, 713, 41073, 0, 3990, 0, 0, 0, + 5017, 128313, 120352, 0, 0, 1030, 0, 983120, 9513, 0, 0, 0, 4668, 0, + 120350, 0, 6339, 0, 0, 0, 64650, 0, 0, 74766, 983850, 8908, 0, 0, 0, 0, + 10752, 13003, 68769, 0, 41307, 8732, 120336, 0, 41310, 0, 4696, 0, + 983934, 0, 120334, 3641, 5419, 0, 0, 0, 0, 120344, 128129, 0, 7320, + 65230, 11808, 0, 93970, 936, 13289, 0, 69892, 65774, 0, 65243, 0, 19953, + 0, 126469, 121375, 127256, 12913, 70722, 68759, 0, 0, 70203, 0, 4113, 0, + 2372, 1819, 0, 128053, 12152, 0, 682, 7655, 120330, 129921, 0, 10593, + 1703, 0, 0, 8033, 69953, 0, 9810, 0, 0, 127949, 0, 119159, 10109, 0, + 73898, 0, 71730, 126704, 0, 0, 917620, 1965, 917621, 0, 0, 73887, 0, 0, + 0, 6314, 0, 8501, 0, 0, 0, 41317, 0, 5417, 983582, 0, 0, 9353, 68148, + 41315, 0, 11161, 0, 41314, 194892, 0, 126562, 119236, 634, 0, 0, 0, + 69779, 4355, 12016, 0, 9654, 12856, 6924, 7660, 0, 0, 0, 0, 0, 42692, 0, + 74604, 0, 0, 0, 680, 6274, 0, 1181, 0, 3174, 67248, 0, 0, 0, 0, 113776, + 10650, 917603, 92295, 70672, 118965, 0, 64644, 126981, 0, 0, 0, 0, + 983942, 0, 65302, 40989, 68239, 68230, 68234, 0, 0, 124989, 0, 40987, + 4667, 0, 983944, 8828, 0, 0, 0, 4746, 0, 129840, 2269, 4749, 0, 100598, + 65192, 4744, 7345, 0, 242, 100595, 0, 8217, 0, 68919, 0, 2245, 0, 0, + 66790, 10850, 0, 0, 0, 0, 0, 129853, 64680, 0, 0, 120562, 0, 127324, 0, 100551, 128721, 0, 7316, 0, 983610, 100552, 74157, 1646, 0, 0, 73995, 120857, 129047, 0, 7350, 0, 0, 0, 9099, 4107, 3441, 0, 2975, 194701, 0, 983947, 55220, 10084, 73943, 120845, 0, 0, 0, 3399, 0, 0, 11909, 0, 0, 7687, 0, 6789, 0, 0, 72739, 71367, 0, 0, 92589, 9151, 1137, 0, 749, 129320, 125076, 5385, 0, 69387, 0, 0, 41298, 0, 69461, 0, 0, 0, 0, 0, 0, 128455, 0, 519, 0, 64547, 5766, 0, 0, 0, 8848, 0, 41297, 0, 0, 0, 41300, - 74468, 65160, 0, 0, 127511, 0, 0, 6558, 0, 0, 128686, 92775, 0, 71450, - 41302, 127927, 0, 0, 128646, 68762, 11729, 8719, 9060, 0, 128796, 0, 0, - 0, 129682, 0, 11734, 93011, 11730, 73450, 9593, 5757, 2403, 0, 55275, 0, - 11728, 65894, 0, 0, 0, 68741, 0, 0, 0, 43489, 4282, 983845, 0, 83497, - 70328, 128103, 70324, 0, 0, 127509, 0, 8456, 0, 0, 0, 0, 78250, 0, 70320, - 120722, 9792, 0, 70326, 0, 0, 83500, 70322, 10019, 71701, 123617, 6568, - 4365, 0, 0, 3647, 0, 41134, 128341, 0, 125043, 41135, 0, 0, 0, 0, 0, - 123616, 0, 41137, 41139, 0, 6545, 0, 125139, 7597, 10528, 75054, 0, 3732, - 73910, 0, 0, 0, 7312, 983639, 9062, 93840, 11853, 0, 0, 128324, 41538, 0, - 0, 0, 0, 194706, 41531, 1263, 3720, 0, 68028, 0, 41524, 64692, 119635, 0, - 41534, 0, 92193, 0, 41168, 0, 67398, 127347, 3524, 0, 8831, 127349, - 127357, 0, 127360, 127352, 0, 0, 0, 0, 0, 0, 5845, 0, 0, 0, 71909, 8200, - 0, 68460, 0, 43283, 5551, 0, 0, 0, 6340, 983552, 100602, 0, 0, 0, 0, 0, - 5422, 0, 0, 0, 2471, 0, 0, 2749, 0, 73774, 10913, 72122, 0, 8666, 675, - 74093, 0, 194986, 0, 0, 0, 0, 0, 10928, 0, 41153, 0, 0, 0, 3738, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42347, 12092, 9615, 7234, 74047, 0, 0, 0, - 123639, 0, 0, 2934, 0, 0, 0, 0, 74507, 0, 74461, 0, 0, 74290, 0, 64562, - 0, 64473, 0, 0, 73728, 0, 11212, 0, 12128, 6534, 0, 0, 1901, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 69940, 65459, 68293, 92290, 128808, 3770, 0, 0, 0, - 64579, 128511, 0, 0, 983332, 983340, 0, 0, 0, 5941, 0, 0, 65079, 0, 0, 0, - 73961, 983334, 0, 0, 0, 0, 0, 0, 10638, 0, 0, 0, 71486, 0, 0, 983349, 0, - 43840, 129495, 0, 5233, 983346, 64792, 71233, 0, 983324, 0, 0, 9847, 0, - 1685, 595, 0, 73971, 1292, 8940, 0, 11088, 0, 10004, 0, 0, 6541, 0, 0, 0, - 5603, 9014, 5606, 0, 538, 128705, 5602, 8467, 74391, 6547, 0, 0, 0, 0, - 8458, 129534, 8495, 0, 0, 917552, 10981, 78314, 0, 2465, 0, 0, 0, 9730, - 9280, 0, 0, 74155, 72766, 113690, 0, 504, 0, 120715, 0, 983606, 0, 0, 0, - 123141, 125024, 0, 0, 732, 3737, 0, 1548, 0, 0, 1832, 5604, 0, 41141, 0, - 5607, 72854, 41142, 3745, 0, 0, 128137, 0, 0, 3869, 11937, 5725, 0, - 66566, 7416, 5728, 0, 0, 0, 11918, 66567, 5724, 118829, 5727, 0, 0, 0, - 5723, 0, 128116, 0, 0, 0, 0, 42532, 0, 12303, 0, 11423, 0, 983115, 68303, - 74074, 0, 128267, 6559, 64557, 71348, 0, 66763, 43019, 0, 10238, 0, 0, - 43377, 0, 71346, 124937, 9783, 42704, 0, 71719, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 41144, 129465, 0, 0, 0, 72793, 92176, 0, 70682, 0, 8820, 0, 0, - 0, 11515, 526, 0, 0, 0, 0, 0, 0, 8635, 0, 0, 8288, 11815, 0, 0, 0, 1543, - 3713, 0, 0, 0, 68041, 127816, 0, 0, 64357, 0, 42082, 0, 0, 8987, 42081, - 0, 0, 0, 0, 0, 0, 6553, 0, 0, 11253, 0, 0, 5475, 0, 0, 0, 119334, 12990, - 1160, 42084, 0, 123152, 0, 0, 360, 0, 0, 128274, 5863, 3137, 0, 983315, - 0, 0, 10959, 3146, 0, 127374, 0, 68341, 13076, 3135, 983298, 0, 0, 3142, - 0, 94068, 10819, 128479, 0, 74635, 12877, 119867, 73967, 0, 70808, 0, 0, - 0, 0, 6163, 0, 113728, 0, 0, 0, 8603, 0, 0, 3306, 0, 43392, 0, 0, 5751, - 0, 0, 0, 0, 0, 7403, 0, 118933, 0, 0, 64783, 92658, 0, 0, 129592, 0, 0, + 74468, 65160, 0, 129839, 127511, 0, 0, 6558, 0, 0, 128686, 92775, 0, + 71450, 41302, 127927, 0, 0, 128646, 68762, 11729, 8719, 9060, 0, 128796, + 0, 0, 0, 129682, 0, 11734, 93011, 11730, 73450, 9593, 5757, 2403, 0, + 55275, 0, 11728, 65894, 0, 0, 0, 68741, 0, 0, 0, 43489, 4282, 983845, 0, + 83497, 70328, 128103, 70324, 0, 0, 127509, 0, 8456, 0, 0, 74783, 0, + 78250, 0, 70320, 120722, 9792, 0, 70326, 0, 0, 83500, 70322, 10019, + 71701, 123617, 6568, 4365, 0, 0, 3647, 0, 41134, 128341, 0, 125043, + 41135, 0, 0, 0, 129938, 0, 123616, 0, 41137, 41139, 0, 6545, 0, 125139, + 7597, 10528, 75054, 0, 3732, 73910, 0, 0, 0, 7312, 983639, 9062, 93840, + 11853, 0, 0, 128324, 41538, 0, 0, 0, 0, 194706, 41531, 1263, 3720, 0, + 68028, 0, 41524, 64692, 119635, 0, 41534, 0, 92193, 0, 41168, 0, 67398, + 127347, 3524, 0, 8831, 127349, 127357, 0, 127360, 127352, 129816, 0, 0, + 0, 0, 0, 5845, 0, 0, 0, 71909, 8200, 0, 68460, 0, 43283, 5551, 0, 0, 0, + 6340, 983552, 100602, 0, 0, 0, 0, 0, 5422, 0, 0, 0, 2471, 0, 0, 2749, 0, + 73774, 10913, 72122, 0, 8666, 675, 74093, 0, 194986, 0, 69262, 0, 0, 0, + 10928, 0, 41153, 0, 0, 0, 3738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 42347, 12092, 9615, 7234, 74047, 0, 0, 0, 123639, 0, 0, 2934, 0, 0, 0, 0, + 74507, 0, 74461, 0, 0, 74290, 0, 64562, 129975, 64473, 0, 0, 73728, 0, + 11212, 0, 12128, 6534, 0, 0, 1901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69940, + 65459, 68293, 92290, 128808, 3770, 0, 0, 0, 64579, 128511, 0, 0, 983332, + 983340, 0, 0, 0, 5941, 0, 0, 65079, 0, 0, 0, 73961, 983334, 0, 0, 0, 0, + 0, 0, 10638, 0, 0, 0, 71486, 0, 0, 983349, 0, 43840, 129495, 0, 5233, + 983346, 64792, 71233, 0, 983324, 0, 0, 9847, 0, 1685, 595, 0, 73971, + 1292, 8940, 0, 11088, 0, 10004, 0, 0, 6541, 0, 0, 0, 5603, 9014, 5606, 0, + 538, 128705, 5602, 8467, 74391, 6547, 0, 0, 0, 0, 8458, 129534, 8495, 0, + 0, 917552, 10981, 78314, 0, 2465, 0, 0, 0, 9730, 9280, 0, 0, 74155, + 72766, 113690, 0, 504, 0, 120715, 0, 983606, 0, 0, 0, 123141, 125024, 0, + 0, 732, 3737, 0, 1548, 0, 0, 1832, 5604, 0, 41141, 0, 5607, 72854, 41142, + 3745, 0, 0, 128137, 0, 0, 3869, 11937, 5725, 0, 66566, 7416, 5728, 0, 0, + 0, 11918, 66567, 5724, 118829, 5727, 0, 0, 0, 5723, 0, 128116, 71999, 0, + 0, 0, 42532, 0, 12303, 0, 11423, 0, 983115, 68303, 74074, 0, 128267, + 6559, 64557, 71348, 0, 66763, 43019, 0, 10238, 0, 0, 43377, 0, 71346, + 124937, 9783, 42704, 0, 71719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41144, + 129465, 0, 0, 0, 72793, 92176, 0, 70682, 0, 8820, 0, 0, 0, 11515, 526, 0, + 0, 0, 0, 0, 0, 8635, 0, 0, 8288, 11815, 0, 0, 0, 1543, 3713, 0, 0, 0, + 68041, 127816, 0, 0, 64357, 0, 42082, 0, 0, 8987, 42081, 0, 0, 0, 0, 0, + 0, 6553, 0, 0, 11253, 0, 0, 5475, 0, 0, 0, 119334, 12990, 1160, 42084, 0, + 123152, 0, 0, 360, 0, 0, 128274, 5863, 3137, 0, 983315, 0, 0, 10959, + 3146, 0, 127374, 0, 68341, 13076, 3135, 983298, 0, 0, 3142, 0, 94068, + 10819, 128479, 0, 74635, 12877, 119867, 73967, 0, 70808, 0, 0, 0, 0, + 6163, 129745, 113728, 0, 0, 0, 8603, 0, 0, 3306, 0, 43392, 0, 0, 5751, 0, + 0, 0, 0, 0, 7403, 0, 118933, 0, 0, 64783, 92658, 0, 0, 129592, 0, 0, 65569, 7021, 0, 0, 0, 0, 0, 6540, 6974, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43585, 0, 6551, 983974, 0, 0, 0, 0, 0, 72216, 8977, 602, 120814, 0, 0, 0, 72119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 983624, 74812, 0, 0, 0, 9475, 0, 65105, 0, @@ -25286,34 +26121,35 @@ static const unsigned int code_hash[] = { 41360, 0, 0, 4743, 0, 0, 0, 0, 68398, 110781, 5890, 110779, 111103, 3739, 8695, 92514, 0, 3964, 8984, 111095, 68288, 0, 0, 70000, 111090, 111089, 111088, 3956, 82952, 111093, 6563, 111091, 41305, 0, 0, 12067, 41312, 0, - 0, 0, 0, 0, 8175, 0, 3600, 0, 934, 0, 0, 173, 0, 0, 110784, 110785, 1750, - 110783, 41358, 68368, 1807, 0, 92298, 0, 5889, 0, 0, 0, 67127, 0, 0, - 121395, 6982, 1721, 0, 7891, 0, 42160, 67129, 4512, 983771, 69460, 0, 0, - 0, 0, 0, 120716, 0, 0, 0, 0, 0, 119140, 3975, 72253, 74087, 0, 12672, 0, - 0, 0, 0, 0, 0, 121100, 0, 0, 41095, 3962, 68242, 2932, 41101, 3954, 6457, - 4513, 0, 0, 0, 0, 1468, 0, 0, 55237, 128230, 0, 127244, 55238, 41080, 0, - 0, 4320, 74104, 0, 0, 0, 0, 77918, 0, 128384, 8256, 0, 72413, 0, 8879, 0, - 0, 8770, 0, 0, 92214, 0, 0, 128786, 4283, 0, 0, 68361, 0, 74826, 0, 0, 0, - 0, 127954, 65106, 42761, 121516, 4581, 8411, 0, 0, 72259, 0, 93037, 0, 0, - 0, 92452, 4392, 0, 10786, 69661, 0, 8184, 0, 0, 7396, 0, 0, 69788, 0, - 43512, 7965, 111039, 111038, 111037, 111036, 41350, 0, 0, 0, 2294, 64501, - 68034, 0, 68405, 111034, 0, 0, 111030, 111029, 71105, 111027, 0, 111033, - 92200, 111031, 0, 6764, 0, 0, 111026, 111025, 111024, 65203, 128010, 0, - 0, 0, 3210, 0, 0, 0, 0, 82958, 127970, 82957, 0, 68875, 10043, 82963, - 1186, 41571, 0, 5209, 9464, 82960, 66657, 5207, 65062, 5213, 0, 0, 41348, - 41568, 128803, 3253, 111045, 111044, 74067, 111042, 111049, 5596, 111047, - 111046, 0, 64887, 0, 5217, 111041, 72252, 0, 0, 0, 0, 2635, 92760, 0, 0, - 0, 92742, 0, 113672, 0, 0, 0, 64558, 0, 0, 67083, 0, 0, 0, 5784, 0, 0, 0, - 0, 4011, 0, 0, 0, 0, 4254, 0, 111054, 5600, 111052, 111051, 10447, 5598, - 1207, 111055, 0, 3501, 42582, 0, 111050, 0, 1124, 5597, 983496, 983497, - 9321, 129464, 75040, 983493, 0, 1719, 68356, 68354, 9671, 1125, 2721, 0, - 983498, 983499, 7631, 5488, 111082, 0, 0, 5491, 111086, 8937, 0, 3236, - 74187, 5490, 0, 5489, 8522, 68358, 111069, 6300, 111067, 111066, 0, 0, - 111071, 111070, 0, 9875, 7593, 111065, 0, 0, 43182, 0, 68379, 3311, - 111058, 111057, 3746, 11016, 65752, 111061, 0, 43423, 68775, 0, 111056, - 72225, 0, 0, 127120, 0, 2232, 0, 0, 0, 0, 0, 126555, 0, 0, 8656, 0, - 128358, 0, 0, 983485, 983486, 917563, 983484, 983481, 983482, 0, 0, 0, 0, - 0, 111183, 128043, 983490, 1036, 983488, 111075, 1723, 111073, 111072, + 0, 0, 0, 0, 8175, 0, 3600, 0, 934, 0, 0, 173, 129844, 0, 110784, 110785, + 1750, 110783, 41358, 68368, 1807, 0, 92298, 0, 5889, 0, 0, 0, 67127, 0, + 0, 121395, 6982, 1721, 0, 7891, 0, 42160, 67129, 4512, 983771, 69460, 0, + 0, 0, 0, 0, 120716, 0, 0, 0, 0, 0, 119140, 3975, 72253, 74087, 0, 12672, + 0, 129821, 0, 0, 129836, 0, 121100, 0, 0, 41095, 3962, 68242, 2932, + 41101, 3954, 6457, 4513, 0, 0, 0, 0, 1468, 0, 0, 55237, 128230, 0, + 127244, 55238, 41080, 0, 0, 4320, 74104, 0, 0, 0, 0, 77918, 0, 128384, + 8256, 0, 72413, 0, 8879, 0, 0, 8770, 0, 0, 92214, 0, 0, 128786, 4283, + 129689, 0, 68361, 0, 74826, 0, 0, 0, 0, 127954, 65106, 42761, 121516, + 4581, 8411, 0, 0, 72259, 0, 93037, 0, 0, 0, 92452, 4392, 0, 10786, 69661, + 0, 8184, 0, 0, 7396, 0, 0, 69788, 0, 43512, 7965, 111039, 111038, 111037, + 111036, 41350, 0, 0, 0, 2294, 64501, 68034, 0, 68405, 111034, 0, 0, + 111030, 111029, 71105, 111027, 0, 111033, 92200, 111031, 0, 6764, 0, 0, + 111026, 111025, 111024, 65203, 128010, 0, 0, 0, 3210, 0, 129978, 0, 0, + 82958, 127970, 82957, 0, 68875, 10043, 71979, 1186, 41571, 0, 5209, 9464, + 82960, 66657, 5207, 65062, 5213, 0, 0, 41348, 41568, 128803, 3253, + 111045, 111044, 74067, 111042, 111049, 5596, 111047, 111046, 0, 64887, 0, + 5217, 111041, 72252, 0, 0, 0, 0, 2635, 92760, 0, 0, 0, 92742, 0, 113672, + 0, 0, 0, 64558, 67081, 0, 67083, 0, 0, 0, 5784, 0, 0, 0, 0, 4011, 0, 0, + 0, 0, 4254, 0, 111054, 5600, 111052, 111051, 10447, 5598, 1207, 111055, + 0, 3501, 42582, 0, 111050, 0, 1124, 5597, 983496, 983497, 9321, 129464, + 75040, 983493, 0, 1719, 68356, 68354, 9671, 1125, 2721, 0, 983498, + 983499, 7631, 5488, 111082, 0, 0, 5491, 111086, 8937, 0, 3236, 74187, + 5490, 0, 5489, 8522, 68358, 111069, 6300, 111067, 111066, 0, 0, 111071, + 111070, 0, 9875, 7593, 111065, 0, 0, 43182, 0, 68379, 3311, 111058, + 111057, 3746, 11016, 65752, 111061, 0, 43423, 68775, 0, 111056, 72225, 0, + 0, 127120, 0, 2232, 0, 0, 0, 0, 0, 126555, 0, 0, 8656, 0, 128358, 0, 0, + 983485, 983486, 917563, 983484, 983481, 983482, 0, 0, 0, 129669, 0, + 111183, 128043, 983490, 1036, 983488, 111075, 1723, 111073, 111072, 111079, 41579, 111077, 111076, 10705, 0, 983480, 74486, 71693, 740, 983476, 983477, 129645, 0, 0, 74846, 92255, 0, 0, 0, 0, 0, 10438, 74487, 73798, 13285, 0, 0, 0, 5690, 0, 93992, 0, 0, 13095, 0, 127857, 121419, @@ -25325,427 +26161,434 @@ static const unsigned int code_hash[] = { 983459, 983456, 983457, 983454, 983455, 42492, 43402, 125208, 3302, 0, 72842, 68809, 0, 0, 120885, 121300, 0, 7856, 8690, 0, 73076, 0, 0, 0, 73091, 0, 69925, 120635, 65153, 0, 0, 0, 0, 0, 0, 4540, 0, 0, 0, 0, - 11844, 121209, 8863, 0, 75061, 0, 6389, 0, 42371, 83205, 8790, 120911, 0, - 111125, 71168, 8869, 0, 0, 42060, 0, 9648, 111123, 71170, 10270, 10286, - 10318, 10382, 43529, 0, 0, 0, 0, 0, 70110, 43835, 119520, 70111, 127086, - 118815, 127084, 127083, 8767, 0, 0, 41281, 0, 5201, 0, 6215, 67072, 6214, - 13101, 0, 0, 65268, 67073, 0, 0, 127976, 72995, 127073, 10511, 42075, 0, - 127071, 129509, 0, 67115, 127069, 111293, 127068, 0, 127067, 0, 74845, 0, - 42071, 43156, 0, 0, 0, 0, 7954, 0, 0, 0, 8485, 4671, 0, 0, 4740, 0, 0, - 42618, 78294, 3064, 6212, 0, 0, 0, 9554, 0, 83044, 0, 126598, 0, 78291, - 0, 6213, 12885, 0, 129086, 64720, 0, 983907, 0, 0, 0, 11430, 0, 7518, - 9317, 0, 3729, 10406, 0, 119259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73825, 0, 0, - 129599, 8786, 10390, 0, 0, 917601, 93034, 0, 7924, 0, 43307, 0, 0, 0, 0, - 0, 0, 118843, 9623, 435, 0, 0, 12893, 8093, 9079, 0, 0, 0, 0, 0, 64430, - 0, 10294, 10326, 0, 0, 0, 0, 0, 0, 3623, 125188, 83378, 0, 43197, 0, 0, - 0, 78296, 0, 0, 0, 7914, 0, 92170, 0, 2624, 0, 0, 0, 120859, 67110, - 11058, 0, 67107, 0, 0, 0, 0, 120793, 0, 0, 6717, 10619, 0, 0, 0, 11832, - 128664, 0, 0, 0, 70202, 0, 0, 0, 3232, 73824, 74581, 0, 0, 0, 41889, 0, - 0, 1161, 41895, 74103, 9701, 0, 0, 129385, 73819, 120588, 5012, 0, 41362, - 0, 68507, 0, 0, 0, 0, 0, 41364, 0, 0, 41352, 41361, 0, 41366, 0, 70129, - 129065, 917, 0, 119934, 119923, 92421, 119912, 0, 119924, 119916, 0, - 71482, 0, 0, 0, 0, 128583, 0, 7022, 0, 4739, 0, 5802, 9816, 8615, 0, 0, - 491, 65837, 0, 0, 128644, 0, 8426, 11092, 9891, 0, 0, 0, 41881, 118823, - 3736, 7394, 42648, 0, 68448, 9095, 7741, 12684, 41885, 0, 0, 0, 0, 5815, - 0, 0, 0, 127392, 0, 0, 41878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120804, 0, 0, - 2267, 0, 78289, 78359, 78288, 0, 0, 78318, 65920, 0, 0, 7057, 9408, 9409, - 9410, 9411, 9412, 9413, 9414, 9415, 9416, 9417, 9418, 9419, 9420, 9421, - 5897, 9423, 917933, 127107, 0, 127108, 917937, 127963, 8955, 9399, 9400, - 9401, 9402, 9403, 9404, 9405, 9406, 9407, 0, 128626, 42669, 73832, 78261, - 67683, 2631, 0, 78259, 0, 78260, 3996, 0, 119307, 0, 0, 0, 0, 0, 0, - 64825, 917916, 917913, 917914, 917919, 5899, 917917, 917918, 12085, 0, - 574, 917922, 77825, 73828, 9473, 77824, 118918, 73900, 41735, 42211, 0, - 4190, 77834, 77835, 77830, 77833, 3616, 77828, 77837, 77838, 7708, 77836, - 2228, 113765, 0, 0, 4191, 0, 77844, 73800, 77842, 77843, 77839, 77840, 0, - 78311, 83375, 0, 0, 10415, 74102, 0, 5896, 0, 10351, 67151, 0, 73829, 0, - 127159, 0, 73998, 41355, 42883, 70736, 71212, 8021, 0, 119150, 983713, - 41357, 8011, 42885, 42887, 41354, 0, 0, 10026, 5472, 120554, 1191, - 121110, 5470, 128784, 5476, 0, 0, 0, 0, 42874, 78281, 42876, 6304, 78283, - 0, 2675, 120690, 0, 0, 128954, 0, 0, 5478, 5904, 0, 0, 0, 7291, 77848, - 43761, 13067, 0, 0, 126249, 120360, 69731, 77856, 77857, 77854, 77855, - 77852, 77853, 77850, 10750, 43714, 77858, 0, 0, 0, 12887, 120364, 127745, - 77866, 77867, 77864, 77865, 9929, 5199, 77859, 1120, 0, 0, 0, 9486, 7554, - 0, 77868, 72832, 0, 0, 5894, 70069, 0, 0, 92511, 70358, 1323, 13162, - 120937, 0, 0, 0, 77881, 66022, 0, 72857, 0, 0, 0, 0, 0, 1142, 0, 8271, 0, - 0, 126645, 12903, 43622, 4002, 0, 10442, 10676, 120368, 0, 120369, 0, 0, - 0, 0, 66642, 1277, 0, 7871, 0, 0, 78853, 0, 119015, 0, 0, 11784, 0, - 78012, 4700, 0, 78858, 0, 78855, 0, 0, 92400, 77879, 19932, 77876, 77877, - 74804, 77874, 77869, 77871, 0, 71487, 43118, 0, 0, 6774, 6773, 0, 194684, - 10346, 10410, 78860, 118974, 0, 110613, 6108, 0, 110612, 0, 0, 0, 121309, - 74166, 124973, 0, 0, 0, 69407, 0, 70357, 0, 0, 74217, 0, 64698, 4192, - 9289, 0, 0, 128847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11603, 0, 0, 0, 82976, 0, - 0, 67812, 0, 0, 0, 42572, 0, 128300, 119146, 1963, 11622, 0, 43237, - 82981, 7550, 67100, 5903, 82984, 78009, 0, 9662, 0, 128391, 0, 0, 0, 0, - 11013, 0, 0, 0, 128433, 67090, 0, 0, 0, 0, 0, 11568, 983685, 43367, 0, 0, - 7852, 0, 0, 0, 0, 0, 194676, 0, 194675, 0, 0, 416, 0, 0, 73834, 0, 68921, - 10984, 0, 0, 0, 0, 0, 0, 127013, 92423, 0, 983256, 121199, 0, 0, 12540, - 0, 0, 0, 0, 11445, 0, 2112, 0, 0, 0, 1021, 0, 9507, 10210, 78005, 8023, - 93963, 78006, 78001, 43181, 78003, 9532, 119094, 0, 0, 0, 0, 0, 1885, - 43268, 0, 0, 120542, 121153, 392, 7894, 4391, 0, 8221, 119597, 77999, - 77998, 0, 0, 0, 92967, 0, 3558, 0, 3913, 70429, 121376, 0, 0, 1265, 0, - 6309, 0, 12969, 0, 0, 0, 0, 0, 0, 0, 41864, 0, 0, 74294, 0, 167, 0, - 917584, 0, 93983, 72354, 68477, 0, 0, 917594, 0, 2493, 0, 0, 0, 0, - 917570, 0, 0, 0, 406, 917592, 0, 0, 0, 0, 0, 0, 0, 127161, 0, 128597, 0, - 0, 0, 3421, 10561, 0, 8365, 0, 0, 127569, 120787, 128669, 0, 0, 0, 0, - 7834, 0, 0, 917574, 10298, 6624, 4908, 0, 1639, 120842, 0, 0, 6327, 6724, - 0, 0, 0, 69910, 4817, 0, 0, 0, 68059, 0, 11022, 0, 0, 0, 118888, 0, 0, - 7548, 64794, 0, 12291, 983165, 0, 0, 0, 0, 0, 0, 1134, 1838, 0, 2057, 0, - 0, 0, 0, 0, 0, 5206, 0, 0, 42523, 0, 0, 0, 0, 65550, 8570, 4816, 0, - 127926, 0, 4821, 0, 0, 0, 4818, 125257, 119974, 119977, 0, 0, 119970, - 119973, 0, 119983, 119982, 119985, 119984, 119979, 119978, 0, 119980, - 119670, 129297, 0, 11284, 119987, 70097, 65155, 119988, 0, 9363, 0, 0, 0, - 5900, 93990, 7889, 2722, 128770, 0, 0, 0, 0, 2282, 0, 0, 0, 68093, 0, 0, - 0, 0, 0, 70150, 0, 0, 0, 0, 129651, 70146, 983079, 119967, 71330, 70148, - 0, 0, 94006, 70144, 119964, 110677, 110678, 110675, 110676, 0, 110674, - 4226, 0, 123165, 5732, 71327, 0, 0, 65119, 0, 0, 92971, 64770, 0, 0, - 6093, 0, 0, 1395, 0, 0, 0, 121179, 786, 0, 43174, 64340, 0, 125269, 0, - 983643, 125138, 10132, 0, 0, 0, 0, 0, 93956, 0, 68444, 0, 92437, 123143, - 0, 0, 92656, 0, 0, 0, 1399, 121463, 0, 121465, 121464, 120808, 241, - 121469, 4907, 0, 0, 0, 0, 0, 0, 0, 0, 127904, 0, 0, 42780, 0, 0, 0, 4217, - 0, 0, 0, 0, 72158, 0, 0, 43099, 3965, 0, 0, 0, 13300, 0, 0, 43057, 0, 0, - 0, 0, 0, 65372, 0, 6410, 126073, 125252, 70468, 0, 0, 0, 119558, 0, 0, 0, - 0, 0, 0, 43188, 2626, 7762, 0, 0, 0, 127183, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 67726, 0, 126993, 1542, 0, 0, 92550, 0, 0, 74311, 0, 0, 10181, 2150, - 0, 0, 0, 0, 0, 68053, 6029, 72852, 0, 0, 0, 0, 8993, 0, 0, 0, 93968, 606, - 0, 0, 0, 0, 4311, 0, 6027, 126615, 4322, 0, 65207, 0, 0, 983901, 0, 0, - 2735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70806, 0, 0, 0, 92783, 0, 0, - 65817, 55288, 127934, 66564, 8530, 0, 7709, 0, 121202, 66560, 128528, - 917595, 12876, 66561, 0, 121430, 983938, 7789, 5855, 809, 0, 0, 72853, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64386, 0, 74909, 0, 120607, 66416, 83360, - 6532, 0, 0, 0, 0, 128224, 0, 0, 0, 0, 43091, 92287, 0, 0, 129312, 0, 0, - 0, 11361, 0, 0, 8153, 128105, 0, 10741, 0, 0, 0, 0, 0, 64706, 0, 0, 0, - 78870, 9466, 78866, 9824, 0, 0, 0, 120977, 915, 0, 0, 43865, 0, 0, 0, - 67131, 70096, 67137, 0, 129614, 78864, 6730, 78862, 68161, 0, 78861, - 126542, 0, 0, 94010, 983683, 0, 0, 66043, 0, 0, 43107, 0, 0, 92343, 0, - 73879, 0, 0, 0, 6103, 0, 0, 92470, 0, 12889, 0, 127137, 0, 0, 0, 0, 0, 0, - 119262, 83028, 0, 0, 0, 0, 0, 0, 0, 13118, 7700, 917537, 9690, 0, 0, - 68080, 512, 0, 72792, 0, 0, 77892, 632, 77890, 77891, 42529, 0, 0, 0, 0, - 0, 0, 0, 128273, 0, 0, 7379, 64581, 5386, 0, 0, 10633, 72316, 64488, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 124956, 71307, 0, 0, 0, 0, 0, 92370, 0, 0, 0, 0, - 0, 71314, 1801, 0, 0, 120867, 0, 0, 77888, 2085, 702, 77887, 77884, - 77885, 13074, 77883, 66299, 0, 0, 12106, 0, 0, 1755, 0, 77897, 77898, - 1163, 3102, 77893, 77894, 0, 0, 0, 0, 69227, 0, 77901, 77902, 77899, - 77900, 65171, 0, 0, 0, 70157, 0, 0, 0, 0, 2908, 0, 11177, 64902, 64950, - 0, 128740, 66906, 124959, 70499, 0, 0, 0, 64352, 0, 125031, 1007, 0, - 9199, 0, 127371, 118992, 41890, 0, 2730, 119072, 0, 5428, 0, 73771, 0, 0, - 0, 0, 71458, 0, 0, 0, 68089, 0, 44012, 0, 71456, 0, 9158, 66878, 69905, - 92440, 0, 0, 0, 484, 0, 0, 0, 194742, 0, 0, 0, 0, 572, 7041, 2736, 0, 0, - 93962, 0, 68628, 0, 0, 5438, 5222, 5381, 43114, 0, 5193, 5125, 5456, - 5509, 0, 120664, 113700, 0, 0, 0, 3430, 0, 42905, 0, 74929, 6050, 0, 0, - 129197, 0, 0, 10908, 0, 0, 0, 64617, 0, 0, 3957, 0, 0, 0, 674, 0, 0, - 2946, 5354, 5251, 5328, 5307, 3759, 72318, 8364, 5123, 0, 5281, 5469, - 5121, 0, 0, 0, 5130, 0, 129608, 0, 0, 0, 1221, 2733, 0, 0, 0, 72321, 0, - 0, 0, 0, 0, 0, 5939, 0, 0, 0, 71867, 68400, 128216, 10321, 10289, 0, - 10385, 123164, 0, 0, 0, 0, 118943, 0, 11411, 0, 5938, 0, 120865, 0, 0, - 10401, 10337, 0, 0, 0, 0, 0, 0, 0, 78277, 0, 0, 12165, 0, 0, 9885, 0, - 8077, 0, 127908, 0, 0, 0, 0, 129138, 4220, 10725, 10433, 0, 68395, 4987, - 64519, 0, 0, 0, 123626, 120356, 0, 11733, 0, 120792, 0, 127233, 0, 0, 0, - 92345, 68254, 983642, 77991, 0, 2724, 0, 0, 12313, 110619, 515, 119947, - 119944, 119945, 119942, 119943, 119940, 119941, 119938, 8606, 4046, 4589, - 4521, 0, 9141, 0, 0, 2741, 0, 0, 1370, 0, 0, 0, 0, 0, 0, 66880, 0, 66003, - 0, 68630, 0, 0, 69458, 0, 11593, 68669, 68666, 68660, 0, 0, 2744, 72285, - 68638, 0, 814, 0, 119962, 119963, 119960, 119961, 101106, 43029, 119956, - 11623, 119954, 11955, 119952, 119953, 41986, 119951, 0, 120497, 4847, - 110975, 0, 0, 0, 0, 1581, 64920, 93830, 12954, 963, 110973, 110972, - 110971, 110969, 5278, 110967, 68621, 92222, 983449, 68625, 983447, 68617, - 110960, 0, 0, 110965, 110964, 110963, 110962, 0, 0, 983439, 983440, - 983437, 983438, 983435, 92648, 127379, 0, 65137, 6483, 65392, 0, 4213, - 129649, 41303, 0, 0, 0, 41306, 983217, 2698, 0, 0, 0, 68396, 0, 41304, - 824, 0, 78011, 72315, 78894, 110982, 78892, 64804, 9820, 119820, 110985, - 110976, 0, 6739, 0, 5481, 3490, 110978, 110977, 71706, 69947, 67702, - 9124, 12688, 119833, 0, 0, 119822, 119821, 119824, 68367, 42575, 119825, - 119828, 119827, 119948, 0, 71087, 68658, 119946, 8025, 0, 127024, 68675, - 92445, 71097, 69613, 0, 0, 0, 0, 983430, 2745, 11797, 110990, 983426, - 9202, 983424, 983425, 0, 0, 0, 10525, 5436, 74584, 110987, 110986, - 121506, 43080, 121508, 121507, 983415, 6246, 119958, 10921, 9723, 6777, - 6776, 6775, 0, 0, 70287, 92384, 0, 8669, 0, 0, 65093, 0, 78881, 2716, 0, - 0, 11252, 0, 68369, 0, 11060, 12985, 2711, 78872, 78027, 78026, 7992, 0, - 0, 42938, 78033, 78032, 78877, 70724, 78029, 78028, 78031, 78030, 64535, - 110998, 10130, 110996, 0, 0, 111001, 111000, 127914, 983412, 78014, 5713, - 110995, 7570, 110993, 110992, 0, 11190, 0, 9026, 0, 74864, 7547, 78891, - 0, 10008, 10222, 0, 129543, 9744, 0, 127193, 983408, 119656, 983406, - 94070, 983404, 983405, 983402, 9045, 78888, 4225, 78886, 78887, 68757, - 78885, 78882, 78883, 983397, 983398, 8405, 983396, 10423, 10359, 983391, - 983392, 0, 129149, 4215, 9789, 0, 4321, 12309, 983400, 41313, 0, 5368, - 66886, 0, 0, 5366, 0, 5372, 0, 0, 0, 7720, 7390, 2696, 0, 0, 8268, 0, - 1790, 0, 0, 118977, 0, 0, 0, 5376, 1835, 72313, 78704, 128089, 0, 0, - 68655, 1180, 0, 0, 0, 0, 0, 0, 0, 9122, 0, 11928, 0, 65283, 0, 0, 5971, - 121171, 43500, 1268, 65097, 983218, 0, 0, 0, 1427, 128440, 0, 5970, 3431, - 72299, 983386, 983387, 983384, 983385, 983382, 2738, 125066, 10455, 0, - 74026, 0, 4222, 6240, 0, 119013, 983389, 68377, 6248, 983373, 67815, - 983371, 917907, 92582, 0, 128698, 125215, 0, 2728, 65549, 64563, 983377, - 983378, 0, 128145, 0, 10713, 7166, 119559, 2622, 0, 0, 0, 0, 8954, 0, - 94008, 2632, 42617, 10108, 1011, 42852, 12080, 2709, 0, 5716, 0, 0, 0, 0, - 127100, 69378, 0, 9515, 127098, 66465, 6451, 0, 127097, 8918, 983556, 0, - 0, 19950, 0, 0, 0, 44003, 0, 0, 0, 0, 0, 0, 983495, 74022, 0, 128795, - 68643, 67410, 0, 5721, 0, 0, 0, 121074, 11267, 983364, 66464, 5720, - 983363, 0, 4219, 5718, 8696, 5717, 0, 983370, 983878, 983368, 541, - 983366, 983367, 128237, 119089, 68389, 983352, 119949, 56, 4216, 10577, - 0, 0, 77849, 69620, 983357, 983358, 66899, 983356, 0, 0, 67628, 0, 0, - 7086, 0, 67998, 67621, 0, 2734, 69616, 0, 67627, 118937, 0, 67625, 0, 0, - 0, 42593, 0, 128217, 0, 0, 119939, 0, 68180, 0, 0, 71104, 7442, 43665, - 359, 41253, 68392, 6239, 120599, 41256, 0, 67740, 111023, 111022, 111021, - 9346, 69660, 41254, 0, 43291, 78002, 0, 0, 124993, 93841, 0, 0, 0, 4368, - 983500, 0, 68137, 0, 0, 41024, 0, 0, 121359, 121420, 0, 0, 0, 4223, 0, - 8574, 83502, 0, 0, 0, 0, 0, 92718, 983636, 70432, 128323, 68382, 0, 0, 0, - 0, 0, 4144, 0, 83193, 6245, 0, 2732, 92644, 0, 0, 0, 83501, 0, 0, 0, - 128005, 0, 0, 0, 0, 3097, 0, 0, 77996, 0, 0, 10863, 111020, 111019, - 111018, 0, 111015, 111014, 111013, 111012, 118964, 0, 10216, 64293, 0, 0, - 69393, 128331, 12325, 111010, 8717, 111008, 0, 0, 0, 0, 8700, 0, 0, - 68363, 10426, 0, 71091, 10362, 0, 1715, 0, 0, 64918, 0, 43278, 42635, 0, - 0, 65275, 0, 0, 0, 0, 0, 1607, 466, 118949, 0, 0, 127918, 6243, 983882, - 1350, 74195, 64420, 1993, 5362, 10666, 2708, 92471, 0, 13143, 234, 3199, - 0, 41268, 6334, 6250, 0, 0, 73750, 0, 73762, 10458, 0, 8576, 127136, 0, - 2704, 64953, 0, 68211, 8322, 0, 5753, 0, 2694, 0, 0, 2439, 65104, 69804, - 0, 303, 74625, 92622, 0, 2437, 0, 9817, 4844, 0, 0, 0, 0, 0, 121120, - 43292, 0, 2441, 0, 0, 0, 0, 0, 2451, 2714, 0, 0, 43379, 127984, 74541, - 753, 5849, 0, 43089, 0, 0, 119534, 0, 0, 0, 0, 2726, 3107, 0, 0, 64937, - 0, 78841, 1408, 0, 4607, 0, 181, 0, 67728, 9539, 0, 0, 65201, 121121, - 92973, 64185, 4142, 64183, 0, 0, 0, 9706, 64178, 64177, 64176, 0, 64182, - 64181, 64180, 64179, 11401, 125124, 0, 1822, 0, 128581, 68055, 3865, - 122918, 0, 10500, 129602, 119024, 0, 110732, 9830, 0, 0, 0, 65131, 0, 0, - 0, 0, 74608, 9567, 0, 9599, 8748, 0, 0, 9557, 0, 0, 0, 11494, 0, 0, - 10865, 0, 43279, 64186, 68521, 0, 64191, 64190, 8898, 64188, 129153, - 41030, 78836, 0, 0, 78820, 126100, 0, 78805, 78806, 78801, 78802, 6745, - 78800, 0, 0, 0, 110866, 0, 0, 73679, 67838, 41039, 78809, 0, 0, 0, 0, - 110869, 127045, 110867, 110868, 127039, 4400, 0, 64207, 10275, 8925, - 10371, 10307, 64202, 4248, 0, 72802, 4541, 6299, 64204, 64203, 64201, - 64200, 64199, 64198, 126471, 0, 0, 0, 64193, 64192, 0, 9943, 64197, - 64196, 64195, 64194, 13282, 42652, 64174, 64173, 83495, 846, 72337, 9965, - 74495, 72330, 83493, 83494, 2543, 12163, 64170, 83490, 64167, 64166, - 64165, 64164, 72333, 0, 64169, 64168, 64949, 0, 10251, 10247, 64163, - 64162, 2295, 43299, 43301, 129363, 0, 70791, 0, 0, 550, 9910, 0, 0, - 66579, 0, 0, 0, 9504, 0, 0, 10373, 0, 0, 10261, 10253, 7821, 10277, 0, - 74823, 1552, 0, 0, 129420, 0, 121435, 19910, 0, 0, 118849, 121150, 0, - 43985, 68051, 0, 69890, 121329, 78355, 983757, 0, 66405, 2431, 3744, - 66852, 1809, 0, 0, 0, 73759, 1264, 0, 78676, 11697, 121278, 9785, 64716, - 0, 0, 0, 0, 121307, 0, 0, 42609, 128388, 0, 66912, 127016, 0, 983885, - 74229, 0, 6487, 93798, 70743, 0, 0, 0, 83484, 83485, 83486, 83487, 83480, - 8355, 7854, 83483, 954, 64927, 0, 41045, 0, 41438, 0, 0, 10711, 0, 0, 0, - 0, 64774, 13309, 10947, 66727, 0, 0, 0, 66795, 0, 0, 0, 0, 0, 0, 0, - 120634, 69228, 0, 0, 0, 0, 0, 0, 3060, 83478, 9986, 0, 83473, 83474, - 11698, 77880, 83469, 9916, 11701, 83472, 42586, 0, 8320, 0, 119095, 0, 0, - 1477, 43289, 0, 74358, 10884, 69446, 9908, 0, 0, 0, 3414, 74304, 0, 0, 0, - 0, 2110, 0, 68306, 0, 74532, 0, 0, 0, 0, 7164, 0, 0, 0, 11950, 5392, - 42248, 65129, 68656, 5397, 129579, 0, 68136, 0, 0, 5395, 72870, 5393, - 354, 68615, 0, 0, 0, 0, 0, 126236, 0, 0, 626, 0, 5895, 0, 0, 5780, 0, - 66407, 10220, 0, 71121, 43297, 0, 0, 11468, 64436, 0, 0, 0, 73818, 3918, - 0, 3797, 72786, 0, 0, 4140, 0, 71254, 0, 9030, 813, 0, 68131, 4146, - 119957, 5360, 0, 129498, 0, 0, 6249, 0, 0, 0, 0, 0, 73092, 0, 4911, 988, - 0, 73125, 0, 42948, 0, 0, 0, 0, 74972, 0, 0, 0, 9825, 0, 0, 12803, - 126977, 11032, 67654, 6244, 0, 0, 68662, 0, 129351, 0, 72131, 4169, 0, 0, - 0, 0, 121410, 120657, 0, 0, 68657, 128943, 78496, 0, 0, 5898, 74540, 0, - 41856, 93056, 917865, 125000, 127373, 83424, 83425, 83426, 73736, 83420, - 68870, 6448, 6835, 0, 4831, 83418, 83419, 67731, 0, 0, 0, 0, 0, 0, 0, - 78499, 0, 0, 0, 43288, 0, 0, 0, 0, 0, 43418, 0, 0, 0, 7876, 68132, - 917872, 0, 917870, 43378, 0, 0, 120890, 5892, 43605, 0, 0, 0, 129058, 0, - 0, 6251, 83409, 83410, 83411, 83412, 126512, 0, 71092, 83408, 10114, 0, - 0, 5387, 0, 0, 0, 0, 65553, 78346, 1747, 917849, 65109, 69240, 917852, - 126509, 0, 0, 0, 0, 125065, 0, 9850, 0, 367, 1472, 917859, 6687, 0, 0, - 5905, 12339, 8919, 73953, 65680, 0, 0, 78664, 0, 9134, 0, 78666, 43011, - 0, 126626, 0, 0, 0, 43013, 10614, 0, 0, 83413, 66646, 83415, 83416, 0, - 73881, 43012, 121127, 83293, 54, 43009, 73885, 0, 6211, 0, 0, 83295, - 68119, 43008, 10758, 0, 0, 0, 0, 0, 70018, 0, 0, 0, 0, 12765, 0, 0, 0, 0, - 126580, 0, 0, 43657, 0, 0, 0, 983718, 0, 83405, 917843, 0, 0, 83401, - 83402, 83403, 83404, 83397, 11363, 12057, 83400, 1567, 0, 0, 83396, 0, - 8957, 4139, 0, 0, 129336, 0, 0, 12740, 0, 92195, 12761, 127793, 12759, 0, - 72304, 67169, 83467, 44002, 0, 83462, 83463, 83464, 12755, 12762, 41022, - 67690, 64217, 476, 0, 983715, 0, 64212, 41020, 1382, 64209, 64216, 64215, - 64214, 64213, 0, 0, 0, 67584, 8720, 3908, 0, 0, 0, 0, 129434, 129576, 0, - 0, 3849, 92324, 94026, 9778, 917906, 5891, 917912, 55, 917910, 917911, 0, - 0, 7935, 67586, 0, 1114, 92599, 67585, 78675, 0, 83447, 83449, 0, 0, 0, - 64717, 0, 0, 0, 66884, 6292, 65303, 0, 6452, 917886, 917887, 66249, - 917885, 917890, 917891, 917888, 719, 0, 0, 917892, 0, 0, 0, 94083, 10868, - 121333, 2349, 5902, 917896, 6335, 917902, 917899, 917900, 0, 64369, 0, 0, - 0, 69245, 0, 126564, 0, 0, 128565, 0, 0, 0, 0, 0, 6454, 1229, 83457, - 83458, 83450, 83451, 83452, 65100, 120508, 8224, 917873, 917874, 917879, - 917880, 917877, 917878, 128929, 0, 917881, 917882, 5365, 67836, 8901, 0, - 0, 0, 0, 0, 5925, 83436, 64330, 128400, 83431, 83432, 83433, 83434, + 11844, 121209, 8863, 0, 75061, 71978, 6389, 0, 42371, 83205, 8790, + 120911, 0, 111125, 71168, 8869, 0, 0, 42060, 0, 9648, 111123, 71170, + 10270, 10286, 10318, 10382, 43529, 0, 0, 0, 0, 0, 70110, 43835, 119520, + 70111, 119360, 118815, 127084, 127083, 8767, 0, 128437, 41281, 0, 5201, + 0, 6215, 67072, 6214, 13101, 0, 0, 65268, 67073, 0, 0, 127976, 72995, + 127073, 10511, 42075, 0, 127071, 129509, 0, 67115, 127069, 111293, + 127068, 0, 127067, 0, 74845, 0, 42071, 43156, 0, 0, 0, 0, 7954, 0, 0, 0, + 8485, 4671, 0, 917574, 4740, 0, 0, 42618, 78294, 3064, 6212, 0, 0, 0, + 9554, 0, 83044, 0, 126598, 0, 78291, 0, 6213, 12885, 0, 129086, 64720, 0, + 983907, 0, 0, 0, 11430, 0, 7518, 9317, 0, 3729, 10406, 0, 119259, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 73825, 0, 0, 129599, 8786, 10390, 0, 0, 917601, + 93034, 0, 7924, 0, 43307, 0, 0, 0, 0, 0, 0, 118843, 9623, 435, 0, 0, + 12893, 8093, 9079, 0, 0, 0, 0, 0, 64430, 0, 10294, 10326, 0, 0, 0, 0, 0, + 0, 3623, 125188, 83378, 0, 43197, 0, 0, 0, 78296, 0, 0, 0, 7914, 0, + 92170, 0, 2624, 0, 0, 0, 120859, 67110, 11058, 0, 67107, 0, 0, 0, 0, + 120793, 0, 0, 6717, 10619, 0, 0, 0, 11832, 128664, 0, 0, 0, 70202, 0, 0, + 0, 3232, 73824, 74581, 0, 0, 0, 41889, 0, 0, 1161, 41895, 74103, 9701, 0, + 0, 129385, 73819, 120588, 5012, 0, 41362, 0, 68507, 0, 0, 0, 0, 0, 41364, + 0, 0, 41352, 41361, 0, 41366, 0, 70129, 129065, 917, 0, 119934, 119923, + 92421, 119912, 0, 119924, 119916, 0, 71482, 0, 0, 0, 125136, 128583, 0, + 7022, 0, 4739, 0, 5802, 9816, 8615, 0, 0, 491, 65837, 0, 0, 128644, 0, + 8426, 11092, 9891, 0, 0, 0, 41881, 118823, 3736, 7394, 42648, 0, 68448, + 9095, 7741, 12684, 41885, 0, 0, 0, 0, 5815, 0, 0, 0, 127392, 0, 0, 41878, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120804, 0, 0, 2267, 0, 78289, 78359, 78288, + 0, 0, 78318, 65920, 0, 0, 7057, 9408, 9409, 9410, 9411, 9412, 9413, 9414, + 9415, 9416, 9417, 9418, 9419, 9420, 9421, 5897, 9423, 917933, 127107, 0, + 127108, 917937, 127963, 8955, 9399, 9400, 9401, 9402, 9403, 9404, 9405, + 9406, 9407, 0, 128626, 42669, 73832, 78261, 67683, 2631, 119308, 78259, + 0, 78260, 3996, 0, 119307, 0, 0, 0, 0, 0, 0, 64825, 917916, 917913, + 917914, 917919, 5899, 917917, 129990, 12085, 0, 574, 917922, 77825, + 73828, 9473, 77824, 118918, 73900, 41735, 42211, 0, 4190, 77834, 77835, + 77830, 77833, 3616, 77828, 77837, 77838, 7708, 77836, 2228, 113765, 0, 0, + 4191, 0, 77844, 73800, 77842, 77843, 77839, 77840, 0, 78311, 83375, 0, 0, + 10415, 74102, 0, 5896, 0, 10351, 67151, 0, 73829, 0, 127159, 0, 73998, + 41355, 42883, 70736, 71212, 8021, 0, 119150, 983713, 41357, 8011, 42885, + 42887, 41354, 0, 0, 10026, 5472, 120554, 1191, 101217, 5470, 128784, + 5476, 101216, 0, 0, 0, 42874, 78281, 42876, 6304, 78283, 0, 2675, 120690, + 0, 0, 128954, 0, 0, 5478, 5904, 0, 0, 0, 7291, 77848, 43761, 13067, 0, 0, + 119271, 120360, 69731, 77856, 77857, 77854, 77855, 77852, 77853, 77850, + 10750, 43714, 77858, 0, 0, 0, 12887, 120364, 127745, 77866, 77867, 77864, + 77865, 9929, 5199, 77859, 1120, 0, 0, 0, 9486, 7554, 0, 77868, 72832, 0, + 0, 5894, 70069, 0, 0, 92511, 70358, 1323, 13162, 120937, 0, 0, 0, 77881, + 66022, 0, 72857, 0, 0, 0, 0, 0, 1142, 0, 8271, 0, 0, 126645, 12903, + 43622, 4002, 0, 10442, 10676, 120368, 0, 120369, 0, 0, 0, 0, 66642, 1277, + 0, 7871, 0, 0, 78853, 0, 119015, 0, 0, 11784, 0, 78012, 4700, 0, 78858, + 0, 78855, 0, 0, 92400, 77879, 19932, 77876, 77877, 74804, 77874, 77869, + 77871, 0, 71487, 43118, 0, 0, 6774, 6773, 0, 194684, 10346, 10410, 78860, + 118974, 0, 101197, 6108, 0, 110612, 0, 0, 0, 121309, 74166, 124973, 0, 0, + 0, 69407, 0, 70357, 0, 0, 74217, 0, 64698, 4192, 9289, 0, 0, 128847, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 11603, 0, 0, 101166, 82976, 0, 0, 67812, 0, + 101163, 0, 42572, 0, 128300, 119146, 1963, 11622, 0, 43237, 82981, 7550, + 67100, 5903, 82984, 78009, 129750, 9662, 0, 128391, 0, 0, 0, 0, 11013, 0, + 0, 0, 128433, 67090, 0, 0, 0, 0, 0, 11568, 983685, 43367, 0, 0, 7852, 0, + 0, 0, 0, 0, 194676, 0, 194675, 0, 0, 416, 129668, 0, 73834, 0, 68921, + 10984, 0, 0, 101175, 129838, 101182, 0, 127013, 92423, 0, 983256, 121199, + 0, 0, 12540, 0, 0, 0, 0, 11445, 101168, 2112, 0, 0, 0, 1021, 0, 9507, + 10210, 78005, 8023, 93963, 78006, 78001, 43181, 78003, 9532, 119094, 0, + 0, 0, 0, 0, 1885, 43268, 129802, 129798, 120542, 121153, 392, 7894, 4391, + 129810, 8221, 119597, 77999, 77998, 0, 0, 0, 92967, 0, 3558, 0, 3913, + 70429, 121376, 0, 0, 1265, 0, 6309, 0, 12969, 0, 101151, 0, 101146, 0, + 101139, 0, 41864, 0, 0, 74294, 0, 167, 0, 917584, 0, 93983, 72354, 68477, + 0, 0, 917594, 0, 2493, 129827, 0, 129804, 0, 917570, 0, 0, 0, 406, + 917592, 0, 0, 0, 0, 0, 0, 0, 127161, 0, 128597, 0, 0, 0, 3421, 10561, 0, + 8365, 0, 0, 127569, 120787, 128669, 0, 0, 0, 0, 7834, 0, 0, 101154, + 10298, 6624, 4908, 0, 1639, 120842, 0, 0, 6327, 6724, 0, 0, 0, 69910, + 4817, 0, 0, 0, 68059, 0, 11022, 0, 0, 0, 118888, 0, 0, 7548, 64794, 0, + 12291, 983165, 0, 0, 0, 0, 0, 0, 1134, 1838, 0, 2057, 0, 0, 0, 0, 0, 0, + 5206, 0, 0, 42523, 0, 0, 0, 0, 65550, 8570, 4816, 0, 127926, 0, 4821, 0, + 0, 0, 4818, 125257, 119974, 119977, 0, 0, 119970, 119973, 0, 119983, + 119982, 119985, 119984, 119979, 119978, 0, 119980, 119670, 129297, 0, + 11284, 119987, 70097, 65155, 119988, 0, 9363, 0, 0, 0, 5900, 93990, 7889, + 2722, 128770, 0, 0, 0, 0, 2282, 0, 0, 0, 68093, 0, 0, 0, 0, 0, 70150, 0, + 0, 0, 0, 129651, 70146, 983079, 119967, 71330, 70148, 0, 0, 94006, 70144, + 119964, 110677, 110678, 110675, 110676, 0, 110674, 4226, 0, 123165, 5732, + 71327, 0, 0, 65119, 0, 0, 92971, 64770, 0, 0, 6093, 0, 0, 1395, 0, 0, 0, + 121179, 786, 0, 43174, 64340, 0, 125269, 0, 983643, 125138, 10132, 0, 0, + 0, 0, 0, 93956, 0, 68444, 0, 92437, 123143, 0, 0, 92656, 0, 0, 0, 1399, + 121463, 0, 121465, 121464, 120808, 241, 121469, 4907, 0, 0, 0, 0, 0, 0, + 0, 0, 127904, 0, 0, 42780, 0, 0, 0, 4217, 0, 0, 0, 0, 72158, 0, 0, 43099, + 3965, 0, 0, 0, 13300, 0, 0, 43057, 0, 0, 0, 0, 0, 65372, 0, 6410, 126073, + 125252, 70468, 0, 0, 0, 119558, 0, 0, 0, 0, 0, 0, 43188, 2626, 7762, 0, + 0, 0, 127183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67726, 0, 126993, 1542, 0, 0, + 92550, 0, 0, 74311, 0, 0, 10181, 2150, 0, 0, 0, 0, 0, 68053, 6029, 72852, + 0, 0, 0, 0, 8993, 0, 0, 0, 93968, 606, 0, 0, 0, 0, 4311, 0, 6027, 126615, + 4322, 0, 65207, 0, 0, 983901, 0, 0, 2735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 70806, 0, 0, 0, 92783, 0, 0, 65817, 55288, 127934, 66564, 8530, 0, + 7709, 0, 121202, 66560, 128528, 917595, 12876, 66561, 0, 121430, 983938, + 7789, 5855, 809, 0, 0, 72853, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64386, 0, + 74909, 0, 120607, 66416, 83360, 6532, 0, 0, 0, 0, 128224, 0, 0, 0, 0, + 43091, 92287, 0, 0, 129312, 0, 0, 0, 11361, 0, 0, 8153, 128105, 0, 10741, + 0, 0, 0, 0, 0, 64706, 0, 0, 0, 78870, 9466, 78866, 9824, 0, 0, 0, 120977, + 915, 0, 0, 43865, 0, 0, 0, 67131, 70096, 67137, 0, 129614, 73648, 6730, + 78862, 68161, 0, 78861, 126542, 0, 0, 94010, 983683, 0, 0, 66043, 0, 0, + 43107, 0, 0, 92343, 0, 73879, 0, 0, 0, 6103, 0, 0, 92470, 0, 12889, 0, + 127137, 0, 0, 0, 0, 0, 0, 119262, 83028, 0, 0, 0, 69279, 0, 0, 0, 13118, + 7700, 917537, 9690, 0, 0, 68080, 512, 0, 72792, 0, 0, 77892, 632, 77890, + 77891, 42529, 0, 0, 0, 0, 0, 0, 0, 128273, 0, 0, 7379, 64581, 5386, 0, 0, + 10633, 72316, 64488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124956, 71307, 0, 0, 0, + 0, 0, 92370, 0, 0, 0, 0, 0, 71314, 1801, 0, 0, 120867, 0, 0, 77888, 2085, + 702, 77887, 77884, 77885, 13074, 77883, 66299, 0, 0, 12106, 0, 0, 1755, + 0, 77897, 77898, 1163, 3102, 77893, 77894, 0, 0, 0, 0, 69227, 0, 77901, + 77902, 77899, 77900, 65171, 0, 0, 0, 70157, 0, 0, 0, 0, 2908, 0, 11177, + 64902, 64950, 0, 128740, 66906, 124959, 70499, 0, 0, 0, 64352, 0, 125031, + 1007, 0, 9199, 0, 127371, 118992, 41890, 0, 2730, 119072, 0, 5428, 0, + 73771, 129993, 0, 0, 0, 71458, 0, 0, 0, 68089, 0, 44012, 0, 71456, 0, + 9158, 66878, 69905, 92440, 0, 101272, 0, 484, 0, 0, 0, 194742, 0, 0, 0, + 0, 572, 7041, 2736, 0, 0, 93962, 0, 68628, 0, 128727, 5438, 5222, 5381, + 43114, 0, 5193, 5125, 5456, 5509, 0, 120664, 113700, 0, 0, 0, 3430, 0, + 42905, 0, 74929, 6050, 0, 0, 129197, 0, 0, 10908, 0, 0, 0, 64617, 0, 0, + 3957, 0, 0, 0, 674, 0, 0, 2946, 5354, 5251, 5328, 5307, 3759, 72318, + 8364, 5123, 0, 5281, 5469, 5121, 0, 0, 0, 5130, 0, 129608, 0, 0, 0, 1221, + 2733, 0, 0, 0, 72321, 127245, 0, 0, 0, 101277, 0, 5939, 0, 0, 0, 71867, + 68400, 128216, 10321, 10289, 0, 10385, 123164, 0, 0, 0, 0, 118943, 0, + 11411, 0, 5938, 0, 120865, 0, 0, 10401, 10337, 0, 0, 0, 0, 0, 0, 0, + 71942, 0, 0, 12165, 0, 0, 9885, 0, 8077, 0, 127908, 0, 0, 0, 0, 129138, + 4220, 10725, 10433, 0, 68395, 4987, 64519, 0, 0, 0, 123626, 120356, 0, + 11733, 0, 120792, 0, 127233, 0, 0, 0, 92345, 68254, 983642, 77991, 0, + 2724, 0, 0, 12313, 110619, 515, 119947, 119944, 119945, 119942, 119943, + 119940, 119941, 119938, 8606, 4046, 4589, 4521, 0, 9141, 0, 0, 2741, 0, + 0, 1370, 0, 0, 0, 0, 0, 0, 66880, 0, 66003, 0, 64440, 0, 0, 69458, 0, + 11593, 68669, 68666, 68660, 0, 0, 2744, 72285, 68638, 0, 814, 0, 119962, + 119963, 119960, 119961, 101106, 43029, 119956, 11623, 119954, 11955, + 119952, 119953, 41986, 119951, 0, 120497, 4847, 110975, 0, 0, 0, 0, 1581, + 64920, 93830, 12954, 963, 110973, 110972, 110971, 110969, 5278, 110967, + 68621, 92222, 983449, 68625, 983447, 68617, 110960, 0, 101459, 101487, + 110964, 110963, 110962, 0, 0, 101464, 101483, 101463, 983438, 983435, + 92648, 127379, 0, 65137, 6483, 65392, 0, 4213, 129649, 41303, 0, 0, 0, + 41306, 983217, 2698, 0, 0, 0, 68396, 0, 41304, 824, 0, 78011, 72315, + 78894, 74827, 78892, 64804, 9820, 119820, 110985, 110976, 0, 6739, 0, + 5481, 3490, 110978, 110977, 71706, 69947, 67702, 9124, 12688, 119833, + 101496, 0, 101495, 119821, 119824, 68367, 42575, 101474, 101478, 119827, + 101481, 101476, 71087, 68658, 119946, 8025, 68630, 101490, 68675, 92445, + 71097, 69613, 0, 0, 0, 0, 983430, 2745, 11797, 110990, 983426, 9202, + 983424, 983425, 0, 0, 0, 10525, 5436, 74584, 110987, 110986, 121506, + 43080, 121508, 121507, 983415, 6246, 119958, 10921, 9723, 6777, 6776, + 6775, 0, 0, 70287, 92384, 0, 8669, 0, 0, 65093, 0, 78881, 2716, 0, 0, + 11252, 101475, 68369, 0, 11060, 12985, 2711, 78872, 78027, 78026, 7992, + 0, 0, 42938, 78033, 78032, 78877, 70724, 78029, 78028, 78031, 78030, + 64535, 110998, 10130, 110996, 0, 0, 111001, 111000, 127914, 983412, + 78014, 5713, 110995, 7570, 110993, 110992, 0, 11190, 129700, 9026, 0, + 74864, 7547, 78891, 0, 10008, 10222, 0, 129543, 9744, 0, 127193, 983408, + 119656, 983406, 94070, 983404, 983405, 983402, 9045, 78888, 4225, 78886, + 78887, 68757, 78885, 78882, 78883, 983397, 983398, 8405, 983396, 10423, + 10359, 983391, 983392, 0, 129149, 4215, 9789, 0, 4321, 12309, 983400, + 41313, 0, 5368, 66886, 0, 0, 5366, 0, 5372, 101482, 0, 0, 7720, 7390, + 2696, 0, 0, 8268, 0, 1790, 0, 0, 118977, 0, 0, 0, 5376, 1835, 72313, + 78704, 128089, 0, 0, 68655, 1180, 0, 0, 0, 0, 0, 0, 0, 9122, 0, 11928, 0, + 65283, 0, 101449, 5971, 101448, 43500, 1268, 65097, 983218, 0, 101445, 0, + 1427, 128440, 0, 5970, 3431, 72299, 101439, 101435, 983384, 983385, + 983382, 2738, 125066, 10455, 0, 74026, 0, 4222, 6240, 0, 119013, 983389, + 68377, 6248, 983373, 67815, 983371, 917907, 92582, 0, 101453, 125215, 0, + 2728, 65549, 64563, 101428, 101425, 101429, 128145, 0, 10713, 7166, + 119559, 2622, 101450, 0, 0, 0, 8954, 0, 94008, 2632, 42617, 10108, 1011, + 42852, 12080, 2709, 0, 5716, 0, 0, 0, 0, 127100, 69378, 0, 9515, 127098, + 66465, 6451, 0, 127097, 8918, 983556, 0, 0, 19950, 0, 0, 0, 44003, 0, 0, + 0, 0, 0, 0, 983495, 74022, 0, 128795, 68643, 67410, 0, 5721, 0, 0, 0, + 121074, 11267, 983364, 66464, 5720, 983363, 0, 4219, 5718, 8696, 5717, 0, + 983370, 983878, 983368, 541, 983366, 983367, 119948, 119089, 68389, + 983352, 119949, 56, 4216, 10577, 0, 0, 77849, 69620, 983357, 983358, + 66899, 983356, 0, 0, 67628, 0, 0, 7086, 0, 67998, 67621, 0, 2734, 69616, + 0, 67627, 118937, 0, 67625, 0, 0, 0, 42593, 0, 128217, 0, 0, 119939, 0, + 68180, 0, 0, 71104, 7442, 43665, 359, 41253, 68392, 6239, 120599, 41256, + 0, 67740, 111023, 111022, 111021, 9346, 69660, 41254, 0, 43291, 78002, 0, + 127024, 124993, 93841, 0, 0, 0, 4368, 983500, 0, 68137, 0, 0, 41024, 0, + 0, 121359, 121420, 0, 0, 0, 4223, 0, 8574, 83502, 0, 0, 0, 0, 0, 92718, + 983636, 70432, 128323, 68382, 0, 0, 0, 0, 0, 4144, 0, 83193, 6245, 0, + 2732, 92644, 0, 0, 0, 83501, 0, 0, 0, 128005, 0, 0, 129652, 983148, 3097, + 0, 0, 77996, 0, 0, 10863, 111020, 111019, 111018, 0, 111015, 111014, + 111013, 111012, 118964, 0, 10216, 64293, 0, 0, 69393, 128331, 12325, + 111010, 8717, 111008, 101413, 0, 101380, 0, 8700, 0, 101382, 68363, + 10426, 0, 71091, 10362, 0, 1715, 101378, 0, 64918, 101409, 43278, 42635, + 0, 0, 65275, 0, 0, 101319, 0, 0, 1607, 466, 118949, 0, 0, 127918, 6243, + 983882, 1350, 74195, 64420, 1993, 5362, 10666, 2708, 92471, 0, 13143, + 234, 3199, 0, 41268, 6334, 6250, 0, 0, 73750, 0, 73762, 10458, 0, 8576, + 127136, 0, 2704, 64953, 0, 68211, 8322, 0, 5753, 0, 2694, 0, 0, 2439, + 65104, 69804, 0, 303, 74625, 92622, 0, 2437, 0, 9817, 4844, 0, 0, 0, 0, + 0, 121120, 43292, 0, 2441, 0, 0, 0, 0, 0, 2451, 2714, 0, 0, 43379, + 127984, 74541, 753, 5849, 0, 43089, 0, 0, 119534, 0, 0, 0, 0, 2726, 3107, + 0, 0, 64937, 0, 78841, 1408, 0, 4607, 101299, 181, 0, 67728, 9539, 0, 0, + 65201, 121121, 92973, 64185, 4142, 64183, 0, 0, 0, 9706, 64178, 64177, + 64176, 0, 64182, 64181, 64180, 64179, 11401, 125124, 0, 1822, 0, 128581, + 68055, 3865, 122918, 0, 10500, 129602, 119024, 0, 110732, 9830, 0, 0, 0, + 65131, 0, 0, 0, 0, 74608, 9567, 0, 9599, 8748, 0, 0, 9557, 0, 0, 0, + 11494, 0, 0, 10865, 0, 43279, 64186, 68521, 0, 64191, 64190, 8898, 64188, + 129153, 41030, 78836, 0, 0, 78820, 126100, 0, 78805, 78806, 78801, 78802, + 6745, 78800, 0, 0, 0, 110866, 0, 0, 73679, 67838, 41039, 78809, 0, 0, + 129893, 0, 110869, 127045, 110867, 110868, 127039, 4400, 0, 64207, 10275, + 8925, 10371, 10307, 64202, 4248, 0, 72802, 4541, 6299, 64204, 64203, + 64201, 64200, 64199, 64198, 126471, 0, 0, 0, 64193, 64192, 0, 9943, + 64197, 64196, 64195, 64194, 13282, 42652, 64174, 64173, 83495, 846, + 72337, 9965, 74495, 72330, 83493, 83494, 2543, 12163, 64170, 83490, + 64167, 64166, 64165, 64164, 72333, 0, 64169, 64168, 64949, 0, 10251, + 10247, 64163, 64162, 2295, 43299, 43301, 129363, 0, 70791, 0, 0, 550, + 9910, 0, 0, 66579, 0, 0, 0, 9504, 0, 0, 10373, 0, 0, 10261, 10253, 7821, + 10277, 0, 74823, 1552, 0, 0, 129389, 0, 121435, 19910, 0, 0, 118849, + 121150, 0, 43985, 68051, 0, 69890, 121329, 78355, 983757, 0, 66405, 2431, + 3744, 66852, 1809, 0, 0, 0, 73759, 1264, 0, 78676, 11697, 121278, 9785, + 64716, 0, 0, 0, 0, 121307, 0, 0, 42609, 128388, 0, 66912, 127016, 0, + 983885, 74229, 0, 6487, 93798, 70743, 0, 0, 0, 83484, 83485, 83486, + 83487, 83480, 8355, 7854, 83483, 954, 64927, 0, 41045, 0, 41438, 0, 0, + 10711, 0, 0, 0, 0, 64774, 13309, 10947, 66727, 101426, 0, 0, 66795, 0, 0, + 0, 0, 0, 0, 0, 120634, 69228, 0, 0, 0, 0, 0, 0, 3060, 83478, 9986, 0, + 83473, 83474, 11698, 77880, 83469, 9916, 11701, 83472, 42586, 0, 8320, 0, + 119095, 0, 0, 1477, 43289, 0, 74358, 10884, 69446, 9908, 0, 0, 0, 3414, + 74304, 0, 0, 0, 0, 2110, 0, 68306, 0, 74532, 0, 129865, 0, 0, 7164, 0, 0, + 0, 11950, 5392, 42248, 65129, 68656, 5397, 129579, 0, 68136, 0, 0, 5395, + 72870, 5393, 354, 68615, 0, 0, 0, 0, 0, 126236, 0, 0, 626, 0, 5895, 0, 0, + 5780, 0, 66407, 10220, 0, 71121, 43297, 0, 0, 11468, 64436, 0, 0, 0, + 73818, 3918, 0, 3797, 72786, 0, 0, 4140, 0, 71254, 0, 9030, 813, 0, + 68131, 4146, 119957, 5360, 0, 129498, 0, 0, 6249, 0, 0, 0, 0, 0, 73092, + 0, 4911, 988, 0, 73125, 0, 42948, 0, 0, 0, 0, 74972, 0, 0, 0, 9825, 0, 0, + 12803, 126977, 11032, 67654, 6244, 0, 0, 68662, 0, 129351, 0, 72131, + 4169, 0, 0, 0, 129986, 121410, 120657, 0, 0, 68657, 128943, 78496, 0, 0, + 5898, 74540, 0, 41856, 93056, 194926, 125000, 127373, 83424, 83425, + 83426, 73736, 83420, 68870, 6448, 6835, 0, 4831, 83418, 83419, 67731, 0, + 0, 0, 0, 0, 0, 0, 78499, 0, 0, 0, 43288, 0, 0, 0, 0, 0, 43418, 0, 0, 0, + 7876, 68132, 917872, 0, 917870, 43378, 0, 0, 120890, 5892, 43605, 0, 0, + 0, 129058, 0, 0, 6251, 83409, 83410, 83411, 83412, 126512, 0, 71092, + 83408, 10114, 0, 0, 5387, 0, 0, 0, 0, 65553, 78346, 1747, 917849, 65109, + 69240, 917852, 126509, 0, 0, 0, 0, 125065, 0, 9850, 0, 367, 1472, 917859, + 6687, 0, 0, 5905, 12339, 8919, 73953, 65680, 0, 0, 78664, 0, 9134, 0, + 78666, 43011, 0, 126626, 0, 0, 0, 43013, 10614, 0, 0, 83413, 66646, + 83415, 83416, 0, 73881, 43012, 121127, 83293, 54, 43009, 73885, 0, 6211, + 0, 0, 83295, 68119, 43008, 10758, 0, 0, 0, 0, 0, 70018, 0, 0, 0, 0, + 12765, 0, 0, 0, 0, 126580, 0, 0, 43657, 0, 0, 0, 983718, 0, 83405, + 917843, 0, 0, 83401, 83402, 83403, 83404, 83397, 11363, 12057, 83400, + 1567, 0, 0, 83396, 0, 8957, 4139, 0, 0, 129336, 0, 0, 12740, 0, 92195, + 12761, 127793, 12759, 0, 72304, 67169, 83467, 44002, 0, 83462, 83463, + 83464, 12755, 12762, 41022, 67690, 64217, 476, 0, 983715, 0, 64212, + 41020, 1382, 64209, 64216, 64215, 64214, 64213, 0, 0, 0, 67584, 8720, + 3908, 0, 0, 0, 0, 101529, 129576, 0, 0, 3849, 92324, 94026, 9778, 917906, + 5891, 917912, 55, 917910, 917911, 0, 0, 7935, 67586, 0, 1114, 92599, + 67585, 78675, 0, 83447, 83449, 0, 0, 0, 64717, 0, 0, 0, 66884, 6292, + 65303, 0, 6452, 917886, 917887, 66249, 917885, 917890, 917891, 917888, + 719, 101446, 0, 917892, 0, 0, 0, 94083, 10868, 121333, 2349, 5902, + 917896, 6335, 917902, 917899, 917900, 0, 64369, 0, 0, 0, 69245, 0, + 126564, 0, 0, 128565, 0, 0, 0, 0, 0, 6454, 1229, 83457, 83458, 83450, + 83451, 83452, 65100, 120508, 8224, 917873, 917874, 917879, 917880, + 917877, 917878, 128929, 0, 917881, 917882, 5365, 67836, 8901, 0, 0, + 129951, 0, 69257, 5925, 83436, 64330, 128400, 83431, 83432, 83433, 83434, 83427, 83428, 83429, 83430, 64928, 10543, 0, 0, 83446, 414, 0, 0, 83442, 6456, 83444, 83445, 11905, 83439, 66284, 83441, 0, 68337, 0, 83437, 43832, 983139, 9751, 0, 128085, 11770, 0, 0, 69600, 65061, 0, 0, 0, 0, 0, - 0, 121087, 0, 0, 69924, 0, 0, 0, 69913, 0, 121387, 0, 0, 0, 42038, 387, - 0, 12737, 0, 0, 43368, 0, 0, 0, 0, 0, 129449, 121295, 0, 69400, 127309, - 0, 375, 0, 0, 0, 983886, 0, 0, 119202, 119203, 0, 43120, 0, 0, 119196, - 119197, 0, 4529, 119200, 119201, 119198, 119199, 0, 0, 69698, 13150, - 64492, 0, 0, 0, 0, 0, 42891, 66327, 74298, 0, 0, 0, 2587, 42193, 0, 6455, - 0, 4241, 0, 0, 0, 0, 0, 0, 0, 118821, 0, 0, 0, 125030, 0, 128684, 129390, - 0, 5373, 0, 0, 119232, 10015, 0, 0, 0, 68642, 0, 120855, 42040, 128827, - 5779, 0, 42037, 83282, 0, 0, 93040, 83283, 0, 0, 127320, 6983, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 119588, 0, 92495, 74558, 0, 68138, 70163, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 11144, 0, 2551, 0, 6453, 0, 6235, 0, 0, 129081, 72886, - 44020, 11826, 0, 7780, 5369, 118958, 0, 0, 5367, 66870, 0, 0, 5377, 0, - 68143, 128624, 78245, 5218, 0, 127333, 0, 0, 0, 0, 0, 1300, 0, 127334, - 64505, 0, 0, 119624, 1465, 0, 0, 0, 0, 0, 0, 0, 113694, 10729, 0, 0, - 8839, 119243, 0, 7785, 126530, 0, 0, 0, 0, 126603, 0, 0, 0, 3897, 0, - 92331, 74417, 113704, 0, 68127, 71425, 70688, 0, 0, 0, 0, 0, 3542, 0, - 120685, 7951, 68152, 118857, 0, 92972, 0, 0, 127311, 73683, 0, 65150, - 68031, 0, 0, 0, 0, 9985, 0, 127328, 0, 0, 0, 0, 10830, 0, 615, 64490, - 7574, 0, 0, 0, 12909, 73698, 64559, 127332, 73951, 0, 67996, 2020, 0, 0, - 0, 120701, 0, 983640, 0, 0, 0, 92991, 0, 0, 9070, 0, 68411, 11281, 42829, - 0, 1033, 0, 0, 0, 0, 0, 65226, 0, 0, 0, 0, 0, 3450, 0, 7397, 0, 0, 42778, - 10000, 41088, 449, 0, 0, 68458, 113725, 0, 0, 10738, 69634, 0, 0, 41085, - 0, 0, 0, 12764, 0, 93058, 3596, 7322, 0, 0, 0, 0, 0, 0, 0, 0, 2092, 0, 0, - 0, 121350, 10820, 0, 0, 126567, 1853, 0, 0, 93014, 0, 12770, 0, 0, - 124997, 0, 0, 0, 0, 0, 129053, 4828, 1258, 0, 2006, 0, 0, 74285, 127987, - 0, 120683, 122880, 983881, 983884, 8846, 128255, 0, 128091, 2650, 9182, - 1961, 121399, 11525, 0, 1959, 0, 55228, 11774, 41016, 0, 0, 128054, - 41017, 13109, 0, 10519, 66331, 3454, 19930, 0, 41019, 92894, 0, 0, 78362, - 41021, 0, 0, 0, 0, 0, 65531, 0, 0, 0, 0, 0, 0, 8865, 6402, 113827, 77923, - 0, 127924, 0, 7733, 0, 4998, 68493, 0, 0, 0, 4268, 0, 0, 0, 0, 128718, - 10881, 0, 0, 0, 0, 2014, 0, 71901, 0, 0, 195057, 0, 0, 78357, 65281, 0, - 0, 0, 0, 0, 2015, 0, 0, 71840, 66318, 74824, 0, 0, 0, 0, 0, 70061, 8094, - 10135, 0, 0, 794, 0, 0, 66335, 0, 121303, 4343, 0, 4833, 0, 0, 0, 0, 189, - 12611, 0, 72215, 0, 4838, 126214, 4834, 65078, 0, 126104, 4837, 118853, - 0, 121230, 4832, 128271, 0, 0, 127838, 0, 0, 0, 0, 0, 0, 0, 3976, 118995, - 128937, 0, 0, 0, 0, 0, 119010, 0, 121015, 0, 0, 0, 0, 2871, 0, 0, 999, 0, - 68177, 0, 0, 2017, 0, 67824, 0, 0, 0, 0, 0, 0, 4775, 12555, 12571, 12550, - 12583, 12560, 2019, 12556, 12584, 12586, 0, 12562, 12561, 12566, 12569, - 12554, 0, 83344, 0, 68882, 0, 12567, 1402, 0, 0, 83348, 125072, 83347, 0, - 83346, 0, 0, 0, 0, 64391, 0, 83341, 69602, 0, 1999, 0, 128141, 0, 0, 0, - 0, 0, 0, 0, 68873, 0, 0, 66913, 2377, 0, 0, 12572, 11318, 12557, 12559, - 9192, 12549, 12568, 2373, 9446, 9447, 9448, 9449, 0, 9480, 481, 0, 9438, - 9439, 9440, 9441, 9442, 9443, 9444, 9445, 9430, 9431, 9432, 9433, 9434, - 9435, 9436, 9437, 983097, 0, 9424, 9425, 9426, 9427, 9428, 7481, 0, 2362, - 9655, 0, 2004, 0, 9782, 0, 0, 0, 0, 0, 0, 0, 1108, 0, 92461, 0, 0, 0, - 64781, 0, 0, 0, 121126, 0, 1392, 0, 0, 917557, 0, 8065, 70710, 128739, 0, - 0, 0, 121068, 92418, 0, 0, 0, 43280, 0, 70718, 1812, 0, 73046, 0, 0, 0, - 0, 0, 6054, 10697, 3169, 0, 0, 70720, 11487, 70712, 0, 0, 0, 194716, 0, - 0, 41863, 0, 0, 2304, 0, 92326, 0, 118792, 0, 0, 64760, 11766, 0, 0, 0, - 0, 69236, 0, 0, 8773, 10733, 36, 0, 0, 0, 0, 0, 11074, 0, 64910, 983130, - 2009, 0, 0, 128036, 68114, 128906, 0, 0, 0, 0, 12852, 3031, 0, 0, 129088, - 0, 66414, 0, 0, 119950, 42613, 65933, 366, 0, 9892, 0, 11754, 0, 83329, - 65301, 44013, 83058, 67245, 10102, 0, 7739, 41026, 0, 0, 0, 0, 0, 0, 0, - 0, 78386, 129475, 71868, 113811, 13081, 10923, 129330, 0, 68145, 0, 0, - 74083, 0, 0, 128392, 83063, 83065, 0, 70706, 0, 0, 0, 70168, 66586, 4183, - 64967, 66250, 0, 92547, 0, 0, 113685, 0, 3792, 2011, 0, 0, 126503, 83332, - 0, 120595, 0, 68489, 41023, 0, 0, 11659, 7922, 12614, 2005, 8523, 0, 0, - 7513, 1863, 129436, 83337, 128969, 0, 120274, 120033, 0, 8144, 0, 73031, - 120269, 127524, 120270, 42241, 8783, 83326, 0, 0, 120735, 983959, 0, - 129367, 0, 10680, 0, 43293, 68771, 0, 119164, 83320, 92467, 10187, 0, 0, - 0, 83315, 0, 0, 0, 10968, 43296, 0, 0, 0, 0, 0, 1005, 43826, 120030, 0, - 2870, 0, 113759, 0, 0, 0, 0, 235, 1384, 0, 74887, 70494, 120409, 0, 9796, - 69895, 983812, 0, 0, 13186, 120407, 0, 0, 0, 0, 42527, 12911, 43427, - 1383, 0, 0, 0, 0, 6156, 68117, 0, 7993, 4288, 0, 0, 13238, 13244, 0, 0, - 120426, 13234, 120427, 0, 118904, 0, 11364, 0, 1380, 65617, 120253, - 120261, 13196, 13197, 120311, 120419, 9495, 0, 0, 120418, 0, 73976, - 128160, 0, 6941, 0, 13205, 13211, 5801, 0, 74271, 120319, 0, 120302, - 7670, 0, 68075, 983587, 0, 19957, 72314, 2021, 93811, 43877, 0, 0, 0, 0, - 3875, 0, 64341, 0, 9814, 43457, 13066, 3314, 7787, 0, 0, 0, 0, 0, 0, - 64531, 0, 0, 0, 0, 0, 0, 127138, 0, 0, 9742, 0, 0, 10800, 0, 8404, 0, - 92592, 0, 7089, 0, 78545, 0, 0, 0, 0, 0, 4772, 5771, 0, 0, 9841, 8843, 0, - 0, 0, 0, 120816, 0, 123137, 0, 0, 0, 0, 0, 0, 8849, 0, 0, 65112, 1796, 0, - 0, 69665, 8164, 41301, 3502, 0, 122884, 128387, 0, 983816, 5825, 0, 0, 0, - 0, 121322, 10983, 10354, 10418, 0, 2022, 0, 1409, 100789, 0, 0, 0, 0, - 1390, 0, 0, 10471, 65904, 5846, 126472, 0, 0, 0, 0, 0, 0, 66035, 0, 0, 0, - 0, 128190, 0, 3168, 67733, 0, 0, 2370, 0, 126243, 0, 195049, 0, 0, 1836, - 0, 121207, 119137, 118959, 125232, 0, 0, 0, 2390, 3944, 0, 0, 0, 0, - 69908, 125011, 0, 0, 123200, 0, 0, 8975, 64739, 0, 0, 0, 0, 64409, 0, 0, - 0, 0, 128564, 0, 0, 0, 0, 6204, 0, 0, 0, 10911, 64954, 119003, 74809, - 118903, 4267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92887, 0, 0, 0, 0, 121125, 0, + 0, 121087, 0, 0, 69924, 0, 0, 0, 69913, 0, 121387, 101513, 101504, + 101512, 42038, 387, 0, 12737, 0, 0, 43368, 0, 0, 0, 0, 129713, 129449, + 121295, 0, 69400, 127309, 0, 375, 0, 0, 0, 983886, 0, 0, 119202, 119203, + 0, 43120, 0, 0, 119196, 119197, 0, 4529, 119200, 119201, 119198, 119199, + 0, 0, 69698, 13150, 64492, 0, 0, 0, 0, 0, 42891, 66327, 74298, 0, 0, 0, + 2587, 42193, 0, 6455, 0, 4241, 0, 0, 0, 0, 0, 0, 0, 118821, 0, 0, 0, + 125030, 0, 128684, 129390, 0, 5373, 0, 0, 119232, 10015, 0, 0, 0, 68642, + 0, 120855, 42040, 128827, 5779, 129841, 42037, 83282, 0, 0, 93040, 83283, + 101116, 0, 101117, 6983, 0, 0, 101115, 0, 0, 0, 0, 101111, 0, 119588, 0, + 92495, 74558, 0, 68138, 70163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11144, 0, + 2551, 0, 6453, 0, 6235, 0, 0, 129081, 72886, 44020, 11826, 0, 7780, 5369, + 118958, 0, 0, 5367, 66870, 0, 0, 5377, 0, 68143, 128624, 78245, 5218, 0, + 127333, 0, 0, 129717, 0, 0, 1300, 0, 127334, 64505, 0, 0, 119624, 1465, + 0, 0, 0, 0, 0, 101109, 0, 113694, 10729, 0, 0, 8839, 119243, 0, 7785, + 126530, 0, 0, 0, 0, 126603, 0, 0, 0, 3897, 0, 92331, 74417, 113704, 0, + 68127, 71425, 70688, 0, 0, 0, 0, 69287, 3542, 0, 120685, 7951, 68152, + 118857, 0, 92972, 0, 0, 127311, 73683, 0, 65150, 68031, 0, 0, 0, 0, 9985, + 0, 127328, 0, 0, 0, 0, 10830, 0, 615, 64490, 7574, 0, 0, 0, 12909, 73698, + 64559, 127332, 73951, 0, 67996, 2020, 0, 0, 0, 120701, 0, 983640, 0, 0, + 0, 92991, 0, 0, 9070, 0, 68411, 11281, 42829, 0, 1033, 0, 0, 0, 0, 0, + 65226, 0, 0, 0, 0, 0, 3450, 0, 7397, 0, 0, 42778, 10000, 41088, 449, 0, + 0, 68458, 113725, 0, 0, 10738, 69634, 0, 0, 41085, 0, 0, 0, 12764, 0, + 93058, 3596, 7322, 0, 0, 0, 0, 0, 0, 0, 0, 2092, 0, 0, 0, 121350, 10820, + 0, 0, 126567, 1853, 0, 0, 93014, 0, 12770, 0, 0, 124997, 0, 0, 0, 0, 0, + 129053, 4828, 1258, 0, 2006, 0, 0, 74285, 127987, 0, 120683, 122880, + 983881, 983884, 8846, 128255, 0, 128091, 2650, 9182, 1961, 121399, 11525, + 0, 1959, 0, 55228, 11774, 41016, 0, 0, 128054, 41017, 13109, 0, 10519, + 66331, 3454, 19930, 0, 41019, 92894, 0, 0, 78362, 41021, 101566, 0, 0, 0, + 0, 65531, 0, 0, 0, 0, 0, 0, 8865, 6402, 113827, 77923, 0, 101536, 0, + 7733, 0, 4998, 68493, 0, 0, 0, 4268, 101368, 0, 0, 101555, 101579, 10881, + 0, 0, 0, 0, 2014, 0, 71901, 0, 0, 195057, 0, 0, 78357, 65281, 0, 0, 0, 0, + 0, 2015, 0, 0, 71840, 66318, 74824, 101575, 0, 101574, 0, 0, 70061, 8094, + 10135, 101551, 0, 794, 0, 0, 66335, 0, 121303, 4343, 0, 4833, 0, 0, 0, 0, + 189, 12611, 0, 72215, 0, 4838, 126214, 4834, 65078, 0, 126104, 4837, + 118853, 0, 121230, 4832, 128271, 0, 101584, 127838, 0, 0, 0, 0, 0, 0, 0, + 3976, 118995, 128937, 0, 0, 0, 0, 0, 119010, 0, 121015, 0, 0, 0, 0, 2871, + 0, 0, 999, 0, 68177, 0, 0, 2017, 0, 67824, 0, 0, 0, 0, 0, 0, 4775, 12555, + 12571, 12550, 12583, 12560, 2019, 12556, 12584, 12586, 0, 12562, 12561, + 12566, 12569, 12554, 0, 83344, 0, 68882, 0, 12567, 1402, 0, 0, 83348, + 125072, 83347, 0, 83346, 0, 0, 0, 0, 64391, 0, 83341, 69602, 0, 1999, 0, + 128141, 0, 0, 0, 0, 0, 0, 0, 68873, 0, 0, 66913, 2377, 0, 0, 12572, + 11318, 12557, 12559, 9192, 12549, 12568, 2373, 9446, 9447, 9448, 9449, 0, + 9480, 481, 0, 9438, 9439, 9440, 9441, 9442, 9443, 9444, 9445, 9430, 9431, + 9432, 9433, 9434, 9435, 9436, 9437, 983097, 0, 9424, 9425, 9426, 9427, + 9428, 7481, 0, 2362, 9655, 0, 2004, 0, 9782, 0, 0, 0, 0, 0, 0, 0, 1108, + 0, 92461, 0, 128764, 0, 64781, 0, 0, 0, 121126, 0, 1392, 0, 0, 917557, 0, + 8065, 70710, 128739, 0, 0, 0, 121068, 92418, 0, 0, 0, 43280, 0, 70718, + 1812, 0, 73046, 0, 0, 0, 0, 0, 6054, 10697, 3169, 0, 0, 70720, 11487, + 70712, 0, 0, 0, 194716, 0, 0, 41863, 0, 0, 2304, 0, 92326, 0, 42951, 0, + 0, 64760, 11766, 0, 0, 0, 0, 69236, 0, 0, 8773, 10733, 36, 0, 0, 0, 0, 0, + 11074, 0, 64910, 983130, 2009, 0, 0, 128036, 68114, 128906, 0, 0, 0, + 983979, 12852, 3031, 0, 0, 129088, 0, 66414, 0, 0, 119950, 42613, 65933, + 366, 0, 9892, 0, 11754, 101107, 83329, 65301, 44013, 83058, 67245, 10102, + 0, 7739, 41026, 0, 0, 0, 0, 0, 0, 0, 0, 78386, 129475, 71868, 113811, + 13081, 10923, 129330, 0, 68145, 0, 0, 74083, 0, 0, 128392, 83063, 83065, + 0, 70706, 0, 0, 0, 70168, 66586, 4183, 64967, 66250, 0, 92547, 0, 0, + 113685, 0, 3792, 2011, 0, 0, 126503, 83332, 0, 120595, 0, 68489, 41023, + 0, 0, 11659, 7922, 12614, 2005, 8523, 0, 0, 7513, 1863, 129436, 83337, + 128969, 0, 120274, 120033, 0, 8144, 0, 73031, 120269, 127524, 120270, + 42241, 8783, 83326, 0, 0, 120735, 983959, 0, 129367, 0, 10680, 0, 43293, + 68771, 0, 119164, 83320, 72003, 10187, 0, 0, 0, 83315, 0, 0, 0, 10968, + 43296, 0, 0, 0, 101400, 0, 1005, 43826, 120030, 0, 2870, 0, 101399, 0, 0, + 983779, 0, 235, 1384, 0, 74887, 70494, 120409, 0, 9796, 69895, 983812, 0, + 120406, 13186, 120407, 0, 0, 0, 0, 42527, 12911, 43427, 1383, 0, 0, 0, 0, + 6156, 68117, 0, 7993, 4288, 0, 0, 13238, 13244, 0, 0, 120426, 13234, + 120427, 0, 118904, 0, 11364, 0, 1380, 65617, 120253, 120261, 13196, + 13197, 120311, 120419, 9495, 0, 0, 120418, 0, 73976, 128160, 0, 6941, 0, + 13205, 13211, 5801, 0, 74271, 120319, 0, 120302, 7670, 0, 68075, 983583, + 0, 19957, 72314, 2021, 93811, 43877, 0, 0, 0, 0, 3875, 120431, 64341, 0, + 9814, 43457, 13066, 3314, 7787, 0, 0, 0, 0, 0, 0, 64531, 129860, 0, 0, 0, + 0, 0, 127138, 0, 0, 9742, 0, 0, 10800, 0, 8404, 0, 92592, 0, 7089, 0, + 78545, 0, 0, 0, 0, 0, 4772, 5771, 101405, 0, 9841, 8843, 0, 0, 0, 129862, + 120816, 0, 123137, 0, 0, 0, 0, 0, 0, 8849, 0, 0, 65112, 1796, 0, 0, + 69665, 8164, 41301, 3502, 0, 122884, 128387, 0, 983816, 5825, 0, 0, 0, 0, + 121322, 10983, 10354, 10418, 0, 2022, 0, 1409, 100789, 0, 0, 0, 0, 1390, + 0, 0, 10471, 65904, 5846, 126472, 0, 0, 0, 0, 0, 0, 66035, 0, 0, 0, 0, + 128190, 0, 3168, 67733, 0, 0, 2370, 0, 126243, 0, 195049, 0, 0, 1836, 0, + 121207, 119137, 118959, 125232, 0, 0, 0, 2390, 3944, 0, 0, 0, 0, 69908, + 125011, 0, 0, 123200, 0, 0, 8975, 64739, 0, 0, 0, 0, 64409, 0, 0, 0, 0, + 128564, 0, 0, 0, 0, 6204, 0, 0, 0, 10911, 64954, 119003, 74809, 118903, + 4267, 0, 0, 0, 0, 0, 0, 72023, 0, 0, 0, 92887, 0, 0, 0, 0, 121125, 0, 128337, 5842, 0, 41439, 0, 0, 0, 9328, 0, 120980, 120917, 0, 0, 2285, 0, 0, 0, 0, 0, 64555, 0, 0, 72162, 9541, 0, 0, 0, 41441, 0, 0, 0, 41040, 2459, 0, 0, 41041, 0, 0, 0, 0, 0, 10450, 0, 41043, 0, 0, 43125, 0, 0, 0, 0, 0, 121008, 68436, 128040, 0, 120649, 0, 0, 4312, 43927, 0, 0, 11923, - 42227, 0, 5763, 0, 4827, 74559, 42228, 64406, 0, 0, 0, 433, 119620, 0, - 2499, 67167, 67166, 0, 11973, 0, 4293, 42271, 42224, 0, 0, 66322, 42226, - 0, 0, 0, 74180, 0, 55277, 0, 0, 0, 983265, 0, 74632, 0, 0, 71103, 0, 0, - 0, 585, 2383, 0, 43263, 0, 4290, 0, 0, 68920, 0, 8511, 0, 0, 0, 119048, - 2380, 126119, 0, 71704, 2376, 0, 0, 0, 5197, 127046, 127047, 127048, - 2366, 127050, 127051, 73442, 0, 0, 0, 93835, 0, 93818, 0, 0, 74188, - 113813, 0, 0, 0, 983819, 0, 0, 0, 0, 1847, 0, 72771, 0, 42384, 0, 4227, - 74158, 0, 92501, 0, 0, 42365, 0, 128902, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 128563, 0, 983504, 127560, 2754, 0, 0, 128900, 0, 127867, 119638, 0, - 1711, 12984, 92365, 0, 6255, 0, 0, 0, 0, 0, 42063, 74184, 0, 0, 0, 0, 0, - 0, 0, 41035, 43274, 0, 11256, 119088, 0, 520, 0, 41037, 128162, 0, 0, + 42227, 0, 5763, 0, 4827, 74559, 42228, 64406, 0, 0, 129703, 433, 119620, + 0, 2499, 67167, 67166, 0, 11973, 0, 4293, 42271, 42224, 0, 0, 66322, + 42226, 0, 0, 0, 74180, 0, 55277, 0, 0, 0, 983265, 0, 74632, 0, 0, 71103, + 0, 0, 0, 585, 2383, 0, 43263, 0, 4290, 0, 0, 68920, 0, 8511, 0, 0, 0, + 119048, 2380, 126119, 0, 71704, 2376, 0, 0, 0, 5197, 127046, 127047, + 127048, 2366, 127050, 127051, 73442, 0, 0, 0, 93835, 0, 93818, 0, 0, + 74188, 113813, 0, 0, 0, 983819, 0, 0, 0, 0, 1847, 0, 72771, 0, 42384, 0, + 4227, 74158, 0, 92501, 0, 0, 42365, 0, 128902, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 128563, 0, 983504, 127560, 2754, 0, 0, 128900, 0, 127867, 119638, + 0, 1711, 12984, 92365, 0, 6255, 0, 0, 0, 0, 0, 42063, 74184, 0, 0, 0, 0, + 0, 0, 0, 41035, 43274, 0, 11256, 119088, 0, 520, 0, 41037, 128162, 0, 0, 41034, 0, 983810, 64815, 0, 0, 321, 41028, 0, 0, 0, 0, 0, 0, 0, 74191, 0, - 0, 72767, 1861, 0, 129666, 0, 0, 100770, 0, 0, 128530, 3859, 0, 41660, 0, - 70793, 0, 983737, 75014, 0, 127514, 41658, 0, 0, 0, 0, 0, 4414, 120766, - 0, 42632, 0, 0, 0, 0, 0, 1405, 0, 43220, 43341, 0, 0, 0, 0, 0, 983714, - 11199, 0, 3513, 0, 70341, 43342, 0, 65529, 0, 0, 0, 6485, 1397, 0, 0, - 92678, 0, 0, 0, 82961, 0, 82962, 0, 74270, 43287, 983712, 0, 0, 983719, - 0, 71914, 4317, 10490, 0, 0, 194867, 74463, 128952, 464, 41624, 0, 0, 0, - 1346, 128240, 917631, 64724, 128566, 423, 0, 0, 113748, 0, 128161, 0, 0, - 120563, 64960, 0, 0, 0, 0, 9584, 129106, 0, 125026, 0, 9718, 0, 42642, - 92977, 64750, 0, 0, 0, 0, 128333, 0, 3204, 64666, 0, 43530, 2752, 0, 0, - 119594, 0, 0, 0, 0, 92371, 0, 41983, 0, 7010, 0, 0, 41495, 92379, 5877, - 42252, 93070, 8009, 3305, 0, 0, 0, 0, 92293, 0, 0, 0, 100836, 0, 65915, - 1400, 75018, 10685, 75017, 2103, 0, 0, 43276, 0, 11169, 0, 6481, 0, 0, 0, - 100837, 72249, 100838, 74198, 0, 9116, 0, 0, 0, 0, 0, 0, 8129, 92994, 0, - 124992, 0, 11658, 0, 0, 3452, 41031, 0, 1385, 0, 0, 0, 43340, 11123, - 41033, 6493, 12758, 0, 0, 11426, 0, 1681, 100755, 1204, 11960, 69902, 0, - 69457, 0, 119322, 0, 7415, 43338, 0, 0, 67717, 64915, 0, 100759, 100850, - 41497, 65044, 0, 19960, 65358, 983601, 0, 0, 0, 73670, 0, 1789, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 64728, 0, 0, 0, 6506, 64312, 0, 2368, 0, 0, 0, 0, - 3439, 1825, 1192, 0, 73739, 10639, 0, 7790, 5430, 0, 0, 2848, 92981, 0, - 0, 7607, 0, 0, 0, 120658, 0, 0, 8883, 0, 728, 0, 0, 0, 0, 92931, 0, - 121372, 128348, 0, 68078, 8091, 11447, 0, 0, 126261, 0, 0, 70003, 0, 0, - 74419, 12335, 0, 0, 3443, 0, 0, 0, 127145, 0, 0, 0, 0, 11843, 0, 9205, - 8624, 128543, 92930, 43295, 0, 65445, 0, 6277, 41672, 0, 10010, 70186, - 983052, 0, 835, 71340, 0, 0, 0, 0, 0, 5426, 4258, 0, 64891, 5424, 0, - 8283, 0, 5434, 0, 0, 0, 0, 0, 11947, 0, 1404, 0, 11432, 0, 3464, 6486, - 4819, 0, 0, 570, 8095, 0, 0, 1498, 0, 0, 0, 431, 67820, 0, 0, 128096, 0, - 0, 13096, 0, 0, 43408, 0, 128538, 8835, 77875, 0, 0, 0, 0, 0, 0, 0, 0, - 3477, 227, 10488, 0, 382, 11418, 0, 5878, 0, 0, 0, 0, 6484, 92355, 66039, - 0, 0, 0, 78717, 0, 92662, 119665, 0, 0, 43290, 0, 0, 0, 0, 8782, 0, 0, - 4323, 128649, 0, 120903, 12094, 0, 0, 0, 0, 92953, 3856, 120970, 0, 5872, - 6495, 72306, 0, 0, 0, 67173, 67172, 67171, 3953, 0, 0, 93063, 11994, - 4339, 0, 92654, 0, 0, 0, 0, 128804, 0, 5228, 0, 9766, 0, 92741, 0, 0, 0, - 0, 68860, 0, 1162, 0, 2671, 0, 0, 92632, 92631, 72117, 0, 73811, 0, - 194895, 0, 68085, 0, 74331, 11424, 0, 10466, 121239, 0, 194890, 0, 4820, - 0, 0, 0, 194891, 0, 119212, 4896, 0, 4897, 42821, 64611, 0, 4438, 0, 0, - 1753, 11331, 6147, 0, 43282, 8833, 0, 0, 6504, 0, 0, 0, 0, 0, 1413, 0, 0, - 64353, 12141, 121138, 0, 0, 43163, 0, 72880, 64789, 127094, 838, 127092, - 120697, 127090, 5014, 0, 256, 0, 0, 42443, 42739, 0, 7542, 0, 70389, 0, - 6489, 10048, 74326, 0, 66573, 0, 125271, 78712, 11761, 126078, 129603, - 41094, 0, 0, 0, 0, 92689, 8453, 0, 0, 120942, 128184, 0, 11816, 0, 0, - 2930, 93845, 0, 41098, 92771, 41093, 0, 0, 6498, 41096, 0, 0, 1238, 200, - 0, 1660, 74476, 0, 0, 74362, 0, 0, 72301, 9224, 0, 0, 0, 0, 0, 0, 0, 0, - 72729, 43284, 0, 72110, 120561, 13183, 0, 0, 0, 1669, 10776, 0, 0, 0, 0, - 0, 1732, 4030, 0, 3963, 0, 0, 0, 6491, 0, 0, 914, 121394, 0, 0, 0, 78713, - 0, 92441, 74367, 0, 0, 0, 0, 0, 0, 0, 0, 65537, 0, 0, 43430, 5301, 0, - 92618, 0, 43285, 0, 0, 125186, 0, 0, 5876, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 11114, 74536, 0, 0, 0, 0, 983129, 0, 0, 0, 0, 10915, 983069, 12007, 0, - 0, 0, 0, 67655, 92604, 0, 8629, 0, 43168, 41872, 0, 0, 0, 42488, 0, 0, 0, - 0, 0, 64730, 70041, 0, 122895, 0, 0, 0, 92306, 11416, 4280, 128516, 8765, - 73451, 0, 1393, 0, 11157, 74386, 0, 0, 0, 0, 6683, 0, 93832, 12144, 0, - 74513, 13019, 74994, 0, 0, 0, 983267, 0, 6488, 357, 0, 41100, 0, 41104, - 0, 41099, 0, 71320, 0, 0, 0, 4434, 0, 0, 0, 74231, 83107, 0, 194914, 0, - 0, 72286, 68305, 0, 41759, 12757, 0, 0, 72769, 9790, 8995, 0, 121095, - 68209, 0, 41764, 0, 0, 72322, 2268, 0, 0, 0, 12743, 0, 6480, 0, 41779, 0, - 66601, 0, 74490, 10986, 66602, 0, 64807, 0, 0, 41767, 119629, 0, 0, 0, - 3955, 64571, 194918, 127089, 0, 70187, 69975, 9770, 12305, 12230, 0, - 78579, 0, 0, 74752, 0, 0, 123168, 128263, 74449, 0, 0, 69611, 0, 0, - 71131, 129505, 78573, 0, 0, 11116, 0, 5747, 0, 110667, 9802, 41092, - 120731, 0, 0, 0, 0, 0, 120733, 41090, 0, 0, 0, 11271, 57, 0, 0, 0, 0, - 71268, 121290, 43137, 0, 0, 0, 126221, 0, 0, 0, 0, 0, 277, 74385, 0, 0, - 0, 72155, 0, 13025, 8757, 0, 0, 1574, 0, 126124, 100800, 0, 5749, 0, 0, - 42824, 0, 1039, 9801, 0, 5745, 0, 41858, 0, 0, 120655, 0, 41862, 0, 0, 0, - 436, 4771, 194636, 42501, 0, 10573, 0, 0, 0, 917986, 9644, 0, 0, 0, 0, - 69837, 0, 0, 0, 0, 67409, 0, 0, 0, 125204, 11939, 0, 0, 0, 0, 0, 0, 0, - 3504, 0, 0, 0, 126209, 0, 10226, 65558, 0, 3594, 0, 0, 40, 0, 0, 0, 0, 0, - 74312, 72138, 74337, 0, 983667, 0, 0, 0, 70476, 0, 121143, 72317, 0, 0, - 4304, 0, 0, 78707, 0, 0, 0, 78597, 1348, 78596, 0, 0, 0, 70406, 92392, 0, - 7599, 0, 0, 13269, 0, 0, 0, 100804, 0, 74494, 6097, 7568, 43980, 4982, - 78592, 0, 0, 0, 0, 13270, 0, 0, 13138, 0, 9484, 0, 0, 71364, 0, 0, 0, - 9487, 0, 92913, 0, 71911, 78668, 73963, 6193, 0, 0, 0, 194848, 7228, - 10011, 194849, 194852, 194851, 11654, 194853, 126218, 194855, 0, 194857, - 3604, 0, 0, 0, 0, 0, 94110, 43740, 94109, 194860, 194863, 66750, 121021, - 0, 94111, 6995, 74173, 5437, 74174, 0, 8702, 7339, 194842, 0, 199, - 194843, 194846, 194845, 0, 126069, 0, 67818, 0, 7560, 0, 0, 0, 0, 6472, - 65814, 0, 128983, 70845, 0, 0, 9191, 0, 0, 0, 0, 0, 10196, 0, 0, 6585, 0, - 120750, 0, 0, 71872, 129129, 0, 0, 78590, 72308, 11382, 129499, 0, - 983651, 0, 194833, 194832, 194835, 129540, 94020, 194836, 42727, 194838, - 128252, 78585, 43874, 119610, 0, 0, 43248, 0, 194816, 0, 194818, 128845, - 194820, 194819, 5297, 194821, 13284, 6112, 93964, 93010, 73927, 42947, 0, - 65746, 0, 0, 194827, 194826, 4342, 42839, 194831, 1677, 0, 72135, 0, 0, - 0, 11011, 66399, 0, 0, 0, 10160, 0, 0, 0, 0, 2052, 4308, 92174, 43000, 0, + 0, 72767, 1861, 118938, 129666, 0, 0, 100770, 0, 0, 128530, 3859, 0, + 41660, 0, 70793, 0, 983737, 75014, 0, 127514, 41658, 0, 0, 0, 0, 0, 4414, + 120766, 0, 42632, 0, 0, 0, 0, 0, 1405, 0, 43220, 43341, 0, 0, 0, 0, 0, + 983714, 11199, 0, 3513, 0, 70341, 43342, 0, 65529, 0, 0, 0, 6485, 1397, + 0, 0, 92678, 0, 0, 0, 82961, 0, 82962, 0, 74270, 43287, 983712, 0, 0, + 983719, 0, 71914, 4317, 10490, 0, 0, 194867, 74463, 128952, 464, 41624, + 0, 0, 0, 1346, 128240, 69271, 64724, 128566, 423, 0, 0, 113748, 0, + 128161, 0, 0, 120563, 64960, 0, 0, 0, 0, 9584, 129106, 0, 125026, 0, + 9718, 0, 42642, 92977, 64750, 0, 0, 0, 0, 128333, 0, 3204, 64666, 0, + 43530, 2752, 0, 0, 119594, 0, 0, 0, 0, 92371, 0, 41983, 0, 7010, 0, 0, + 41495, 92379, 5877, 42252, 93070, 8009, 3305, 0, 0, 0, 0, 92293, 0, 0, 0, + 100836, 0, 65915, 1400, 75018, 10685, 75017, 2103, 0, 0, 43276, 0, 11169, + 0, 6481, 0, 0, 0, 100837, 72249, 100838, 74198, 0, 9116, 0, 0, 0, 0, 0, + 0, 8129, 92994, 0, 124992, 0, 11658, 0, 0, 3452, 41031, 0, 1385, 0, 0, 0, + 43340, 11123, 41033, 6493, 12758, 0, 0, 11426, 0, 1681, 100755, 1204, + 11960, 69902, 0, 69457, 0, 119322, 129483, 7415, 43338, 0, 0, 67717, + 64915, 0, 100759, 72021, 41497, 65044, 0, 19960, 65358, 983601, 0, 0, 0, + 73670, 0, 1789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64728, 0, 0, 0, 6506, + 64312, 0, 2368, 0, 0, 0, 0, 3439, 1825, 1192, 0, 73739, 10639, 0, 7790, + 5430, 0, 0, 2848, 92981, 0, 0, 7607, 0, 0, 0, 120658, 0, 0, 8883, 0, 728, + 0, 0, 0, 0, 92931, 0, 121372, 128348, 0, 68078, 8091, 11447, 0, 0, + 126261, 983710, 0, 70003, 0, 0, 74419, 12335, 0, 0, 3443, 0, 0, 0, + 127145, 0, 0, 0, 0, 11843, 0, 9205, 8624, 128543, 92930, 43295, 0, 65445, + 0, 6277, 41672, 0, 10010, 70186, 983052, 0, 835, 71340, 0, 0, 0, 0, 0, + 5426, 4258, 0, 64891, 5424, 0, 8283, 0, 5434, 0, 0, 0, 0, 0, 11947, 0, + 1404, 0, 11432, 0, 3464, 6486, 4819, 0, 0, 570, 8095, 0, 0, 1498, 0, 0, + 0, 431, 67820, 0, 0, 128096, 0, 0, 13096, 0, 0, 43408, 0, 128538, 8835, + 77875, 0, 0, 0, 0, 0, 0, 0, 0, 3477, 227, 10488, 0, 382, 11418, 0, 5878, + 0, 0, 0, 0, 6484, 92355, 66039, 0, 0, 0, 78717, 0, 92662, 119665, 0, 0, + 43290, 0, 0, 0, 0, 8782, 0, 0, 4323, 128649, 0, 120903, 12094, 0, 0, 0, + 0, 92953, 3856, 120970, 0, 5872, 6495, 72306, 0, 0, 0, 67173, 67172, + 67171, 3953, 0, 0, 93063, 11994, 4339, 0, 92654, 0, 0, 0, 0, 128804, 0, + 5228, 0, 9766, 0, 92741, 0, 0, 0, 0, 68860, 0, 1162, 0, 2671, 0, 0, + 92632, 92631, 72117, 0, 73811, 0, 194895, 0, 68085, 0, 74331, 11424, 0, + 10466, 121239, 0, 194890, 0, 4820, 0, 0, 0, 194891, 0, 119212, 4896, 0, + 4897, 42821, 64611, 0, 4438, 0, 0, 1753, 11331, 6147, 0, 43282, 8833, 0, + 0, 6504, 0, 0, 0, 0, 0, 1413, 0, 0, 64353, 12141, 121138, 0, 0, 43163, 0, + 72880, 64789, 127094, 838, 127092, 120697, 127090, 5014, 0, 256, 0, 0, + 42443, 42739, 0, 7542, 0, 70389, 0, 6489, 10048, 74326, 0, 66573, 0, + 125271, 78712, 11761, 126078, 129603, 41094, 0, 0, 0, 0, 92689, 8453, 0, + 0, 120942, 128184, 0, 11816, 0, 0, 2930, 93845, 0, 41098, 92771, 41093, + 0, 0, 6498, 41096, 0, 0, 1238, 200, 0, 1660, 74476, 0, 0, 74362, 0, 0, + 72301, 9224, 0, 0, 0, 0, 0, 0, 0, 0, 72729, 43284, 0, 72110, 120561, + 13183, 0, 0, 0, 1669, 10776, 0, 0, 0, 0, 0, 1732, 4030, 0, 3963, 0, 0, 0, + 6491, 0, 0, 914, 121394, 0, 0, 0, 78713, 0, 92441, 74367, 0, 0, 0, 0, 0, + 0, 0, 0, 65537, 0, 0, 43430, 5301, 0, 92618, 0, 43285, 0, 0, 125186, 0, + 0, 5876, 0, 69555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11114, 74536, 0, 0, 0, 0, + 983129, 0, 0, 0, 0, 10915, 983069, 12007, 0, 0, 0, 0, 67655, 92604, 0, + 8629, 0, 43168, 41872, 0, 0, 0, 42488, 0, 0, 0, 0, 0, 64730, 70041, 0, + 122895, 0, 0, 0, 92306, 11416, 4280, 128516, 8765, 73451, 0, 1393, 0, + 11157, 74386, 0, 0, 0, 0, 6683, 0, 93832, 12144, 0, 74513, 13019, 74994, + 0, 0, 0, 983267, 0, 6488, 357, 0, 41100, 0, 41104, 0, 41099, 0, 71320, 0, + 0, 0, 4434, 0, 0, 0, 74231, 83107, 0, 194914, 0, 0, 72286, 68305, 0, + 41759, 12757, 0, 0, 72769, 9790, 8995, 0, 121095, 68209, 0, 41764, 0, 0, + 72322, 2268, 0, 129845, 0, 12743, 0, 6480, 0, 41779, 0, 66601, 0, 74490, + 10986, 66602, 0, 64807, 0, 0, 41767, 119629, 0, 0, 0, 3955, 64571, + 194918, 127089, 0, 70187, 69975, 9770, 12305, 12230, 0, 78579, 0, 0, + 74752, 0, 0, 123168, 128263, 74449, 0, 65948, 69611, 0, 0, 71131, 129505, + 78573, 0, 0, 11116, 0, 5747, 0, 110667, 9802, 41092, 120731, 0, 0, 0, 0, + 0, 120733, 41090, 0, 0, 0, 11271, 57, 0, 0, 0, 0, 71268, 121290, 43137, + 0, 0, 0, 126221, 0, 0, 0, 0, 0, 277, 74385, 0, 0, 0, 72155, 0, 13025, + 8757, 0, 0, 1574, 0, 126124, 100800, 0, 5749, 129923, 0, 42824, 0, 1039, + 9801, 0, 5745, 0, 41858, 0, 0, 120655, 0, 41862, 0, 0, 0, 436, 4771, + 194636, 42501, 0, 10573, 0, 0, 0, 917986, 9644, 0, 0, 0, 0, 69837, 0, 0, + 0, 0, 67409, 0, 0, 0, 125204, 11939, 0, 0, 0, 0, 0, 0, 0, 3504, 0, 0, 0, + 126209, 0, 10226, 65558, 0, 3594, 0, 0, 40, 0, 0, 0, 0, 0, 74312, 72138, + 74337, 0, 69577, 0, 0, 0, 70476, 0, 121143, 72317, 0, 0, 4304, 0, 0, + 78707, 0, 0, 0, 78597, 1348, 78596, 0, 0, 0, 70406, 92392, 0, 7599, 0, 0, + 13269, 0, 129729, 0, 100804, 0, 74494, 6097, 7568, 43980, 4982, 78592, 0, + 0, 0, 0, 13270, 0, 0, 13138, 0, 9484, 0, 0, 71364, 0, 0, 0, 9487, 0, + 92913, 0, 71911, 78668, 73963, 6193, 0, 0, 0, 194848, 7228, 10011, + 194849, 194852, 194851, 11654, 194853, 126218, 194855, 0, 194857, 3604, + 0, 0, 0, 0, 0, 94110, 43740, 94109, 194860, 194863, 66750, 121021, 0, + 94111, 6995, 74173, 5437, 74174, 0, 8702, 7339, 129981, 0, 199, 194843, + 194846, 194845, 0, 126069, 0, 67818, 0, 7560, 0, 0, 0, 0, 6472, 65814, 0, + 128983, 70845, 0, 0, 9191, 0, 0, 0, 0, 0, 10196, 0, 0, 6585, 0, 120750, + 0, 0, 71872, 129129, 0, 0, 78590, 72308, 11382, 129499, 0, 983651, 0, + 194833, 194832, 194835, 129540, 94020, 194836, 42727, 194838, 128252, + 78585, 43874, 119610, 0, 0, 43248, 0, 194816, 0, 194818, 128845, 194820, + 194819, 5297, 194821, 13284, 6112, 93964, 93010, 73927, 42947, 0, 65746, + 0, 0, 194827, 194826, 4342, 42839, 194831, 1677, 0, 72135, 0, 0, 0, + 11011, 66399, 0, 0, 0, 10160, 0, 0, 0, 0, 2052, 4308, 92174, 43000, 0, 543, 64916, 0, 0, 0, 119170, 0, 118922, 2064, 0, 43158, 0, 0, 69984, 0, 0, 129187, 0, 0, 0, 0, 41631, 92728, 0, 0, 6228, 0, 0, 0, 0, 0, 0, 506, 0, 0, 65735, 2055, 43255, 121407, 0, 0, 0, 0, 0, 0, 194666, 2063, 0, 0, 0, 0, 72136, 0, 74333, 194912, 11827, 74308, 194913, 194916, 194915, 64564, 194917, 67986, 194919, 0, 11037, 0, 121102, 0, 0, 10560, 0, - 120756, 194922, 113737, 194924, 194927, 194926, 1931, 0, 0, 0, 128228, 0, + 120756, 194922, 113737, 194924, 194927, 120495, 1931, 0, 0, 0, 128228, 0, 12643, 8751, 123629, 0, 12294, 0, 78834, 9138, 78831, 78833, 12631, 78829, 11080, 78821, 0, 0, 1239, 0, 121067, 0, 12636, 0, 0, 0, 0, 0, 0, 8998, 0, 0, 9152, 0, 0, 0, 67589, 0, 64290, 0, 92393, 12615, 0, 129141, @@ -25754,9 +26597,9 @@ static const unsigned int code_hash[] = { 0, 0, 0, 67604, 70705, 0, 194882, 194881, 194884, 194883, 194886, 128914, 194888, 67599, 0, 194889, 0, 0, 0, 0, 3357, 0, 78852, 4207, 1288, 78842, 78839, 78840, 78837, 78838, 66354, 194872, 0, 128432, 0, 67618, 92664, 0, - 42788, 0, 64612, 194875, 10774, 194877, 0, 194879, 0, 0, 0, 997, 194901, + 42788, 0, 64612, 129897, 10774, 194877, 0, 194879, 0, 0, 0, 997, 194901, 0, 92577, 0, 11440, 11379, 42000, 13139, 0, 0, 74030, 72293, 73796, 0, 0, - 0, 0, 2818, 0, 0, 73793, 0, 4172, 93028, 126523, 124981, 0, 0, 0, 0, + 0, 0, 2818, 0, 0, 73793, 0, 4172, 93028, 126523, 124981, 0, 129896, 0, 0, 129522, 69706, 0, 6834, 0, 0, 194865, 126982, 121211, 194866, 194869, 194868, 766, 1257, 0, 0, 0, 3265, 66617, 3274, 0, 0, 94042, 0, 8373, 41989, 0, 73460, 3418, 3263, 0, 0, 0, 3270, 64539, 11489, 0, 118945, @@ -25775,29 +26618,29 @@ static const unsigned int code_hash[] = { 64010, 64008, 64007, 2003, 7706, 0, 0, 119050, 64009, 204, 0, 0, 4430, 8239, 64003, 10626, 64001, 64057, 13079, 64055, 64054, 0, 0, 43246, 9343, 64049, 64048, 0, 1133, 64053, 64052, 64051, 64050, 0, 0, 0, 66415, 12329, - 0, 0, 0, 1942, 0, 0, 0, 128249, 0, 68291, 10760, 64023, 64022, 64021, - 64020, 43670, 77924, 64025, 41412, 78243, 78244, 0, 0, 64019, 64018, - 64017, 64016, 0, 0, 78251, 78252, 78248, 78249, 77914, 78247, 0, 917560, - 77919, 6788, 13094, 0, 7532, 41414, 0, 3179, 70745, 64769, 0, 0, 0, 0, - 10751, 0, 0, 0, 0, 0, 0, 0, 2008, 64031, 64030, 294, 41874, 83383, 83384, - 65929, 83376, 129063, 83379, 83380, 64028, 11396, 64026, 83374, 0, 0, - 118795, 71739, 43247, 0, 70153, 0, 0, 0, 0, 0, 0, 0, 0, 7801, 83359, - 83361, 128931, 0, 3297, 83356, 83357, 1135, 83350, 83351, 73696, 1995, - 7927, 71738, 110742, 2552, 83372, 60, 0, 8649, 83368, 83369, 83370, - 83371, 10541, 83365, 78679, 43833, 0, 0, 2013, 83362, 0, 110636, 0, 0, - 12832, 110638, 8081, 8362, 120188, 0, 9137, 0, 0, 0, 0, 3466, 0, 0, 1996, - 0, 3453, 3412, 0, 2002, 2000, 120176, 0, 0, 0, 0, 1998, 0, 1842, 0, 0, - 9628, 68446, 0, 9826, 64502, 1767, 3413, 0, 0, 0, 0, 0, 0, 13108, 44024, - 120204, 0, 92693, 0, 0, 0, 70291, 12650, 983208, 0, 68061, 0, 3592, 0, 0, - 0, 0, 983956, 0, 66417, 128792, 10742, 0, 0, 1994, 9281, 3296, 64475, - 1997, 1895, 128936, 72387, 0, 0, 123184, 72391, 0, 8999, 0, 983633, 0, - 66480, 0, 0, 0, 983083, 0, 596, 0, 0, 120216, 8651, 120217, 0, 0, 12995, - 0, 0, 70740, 0, 42930, 119955, 64810, 917834, 6825, 0, 917839, 120208, - 64275, 120889, 128069, 120210, 6384, 917840, 126477, 0, 67698, 0, 0, 0, - 120496, 0, 43412, 0, 0, 0, 0, 0, 120172, 0, 120763, 0, 0, 0, 128343, - 1457, 0, 0, 6381, 2815, 0, 65240, 129664, 0, 0, 119522, 70487, 0, 0, 0, - 0, 0, 120572, 0, 0, 0, 0, 0, 125253, 0, 0, 0, 120574, 0, 0, 0, 3055, - 9852, 0, 65288, 0, 11398, 0, 0, 93016, 0, 0, 603, 128557, 0, 0, 0, + 0, 0, 129698, 1942, 0, 0, 0, 128249, 0, 68291, 10760, 64023, 64022, + 64021, 64020, 43670, 77924, 64025, 41412, 78243, 78244, 0, 0, 64019, + 64018, 64017, 64016, 0, 0, 78251, 78252, 78248, 78249, 77914, 78247, 0, + 917560, 77919, 6788, 13094, 0, 7532, 41414, 0, 3179, 70745, 64769, 0, 0, + 71967, 0, 10751, 0, 0, 0, 0, 0, 0, 0, 2008, 64031, 64030, 294, 41874, + 83383, 83384, 65929, 83376, 129063, 83379, 83380, 64028, 11396, 64026, + 83374, 0, 0, 118795, 71739, 43247, 0, 70153, 0, 0, 0, 0, 0, 0, 0, 0, + 7801, 83359, 83361, 128931, 0, 3297, 83356, 83357, 1135, 83350, 83351, + 73696, 1995, 7927, 71738, 110742, 2552, 83372, 60, 0, 8649, 83368, 83369, + 83370, 83371, 10541, 83365, 78679, 43833, 0, 0, 2013, 83362, 0, 110636, + 0, 0, 12832, 110638, 8081, 8362, 120188, 0, 9137, 0, 0, 0, 0, 3466, 0, 0, + 1996, 0, 3453, 3412, 0, 2002, 2000, 120176, 0, 0, 0, 0, 1998, 0, 1842, 0, + 0, 9628, 68446, 0, 9826, 64502, 1767, 3413, 0, 0, 0, 0, 0, 0, 13108, + 44024, 120204, 0, 92693, 0, 0, 0, 70291, 12650, 983208, 0, 68061, 0, + 3592, 0, 0, 0, 0, 983956, 0, 66417, 128792, 10742, 0, 0, 1994, 9281, + 3296, 64475, 1997, 1895, 128936, 72387, 0, 0, 123184, 72391, 0, 8999, 0, + 983633, 0, 66480, 0, 0, 0, 983083, 0, 596, 0, 0, 120216, 8651, 120217, 0, + 0, 12995, 0, 0, 70740, 0, 42930, 119955, 64810, 917834, 6825, 0, 917839, + 120208, 64275, 120889, 128069, 120210, 6384, 917840, 126477, 0, 67698, 0, + 0, 0, 120496, 0, 43412, 0, 0, 0, 0, 0, 120172, 0, 120763, 0, 0, 0, + 128343, 1457, 0, 0, 6381, 2815, 0, 65240, 129664, 0, 0, 119522, 70487, 0, + 0, 0, 0, 0, 120572, 0, 0, 0, 0, 0, 125253, 0, 0, 0, 120574, 0, 0, 0, + 3055, 9852, 0, 65288, 0, 11398, 0, 0, 93016, 0, 0, 603, 128557, 0, 0, 0, 129366, 3350, 0, 0, 917828, 917827, 68428, 917825, 73045, 917831, 917830, 917829, 0, 1919, 0, 110767, 83296, 83297, 83298, 66446, 64141, 8562, 64139, 64138, 64136, 64135, 64134, 64133, 11297, 0, 0, 11966, 64128, @@ -25815,180 +26658,183 @@ static const unsigned int code_hash[] = { 64118, 110659, 127842, 1177, 65601, 12322, 64106, 92169, 110654, 64102, 64101, 64100, 64099, 0, 10453, 64104, 64103, 7997, 0, 92534, 0, 8705, 64097, 64096, 9571, 0, 110652, 127398, 12132, 0, 0, 0, 110624, 73841, - 83339, 83340, 9056, 0, 0, 0, 6155, 64068, 64067, 64066, 64065, 64072, - 64071, 63, 64069, 127382, 0, 93822, 7257, 64064, 0, 0, 0, 0, 0, 0, 78748, - 0, 0, 0, 120519, 0, 66242, 66232, 4333, 9855, 64112, 0, 0, 0, 0, 0, 0, 0, - 66222, 0, 0, 0, 0, 69816, 0, 118796, 0, 8708, 0, 64077, 64076, 8996, - 4992, 4471, 83343, 64079, 64078, 92179, 0, 0, 129120, 64615, 0, 0, 12075, - 42041, 0, 0, 0, 0, 127557, 3123, 0, 983735, 0, 0, 0, 83328, 0, 9223, 0, - 83321, 83322, 73797, 83327, 1116, 0, 83319, 7136, 0, 0, 0, 0, 75031, 0, - 0, 0, 64092, 43675, 10104, 83338, 83331, 64095, 64094, 8111, 66247, 0, - 64089, 64088, 0, 70106, 42236, 11434, 64083, 64082, 43216, 7737, 64087, - 64086, 64085, 64084, 0, 0, 0, 4118, 1797, 83312, 0, 0, 46, 83308, 83309, - 298, 83303, 72402, 83305, 83306, 0, 0, 0, 128905, 11495, 0, 0, 0, 127377, - 194828, 127370, 0, 0, 0, 66239, 74945, 64403, 0, 0, 83314, 0, 0, 65758, - 43536, 0, 8544, 0, 0, 0, 0, 194824, 0, 0, 0, 0, 0, 3639, 11242, 194822, - 0, 0, 0, 0, 0, 0, 68409, 0, 0, 0, 0, 0, 0, 0, 128654, 8789, 126248, 0, 0, - 0, 0, 0, 0, 0, 65058, 0, 78234, 68064, 0, 66227, 71694, 5573, 118936, 0, - 44, 0, 66244, 118907, 0, 66238, 12844, 0, 1622, 129190, 1900, 0, 11458, - 0, 0, 6581, 5576, 128303, 0, 126122, 0, 113680, 8947, 0, 113812, 0, 0, 0, - 7908, 0, 0, 6579, 0, 0, 0, 0, 2138, 6583, 7761, 0, 0, 0, 66802, 5058, 0, - 0, 0, 5057, 125256, 0, 74538, 5054, 0, 0, 0, 0, 0, 0, 658, 3497, 128509, - 0, 5061, 5060, 4235, 0, 0, 0, 127757, 4236, 4727, 0, 0, 0, 128791, 0, - 7488, 128693, 7476, 0, 125259, 120646, 0, 0, 0, 66209, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9341, 119596, 0, 0, 0, 64668, 0, 8125, - 0, 6743, 119175, 0, 129441, 83406, 0, 127966, 119235, 74092, 0, 0, 43660, - 0, 0, 127901, 0, 0, 0, 264, 0, 74954, 0, 0, 0, 0, 0, 6019, 0, 0, 129121, - 0, 0, 0, 8800, 0, 66376, 0, 120948, 0, 100744, 0, 0, 92333, 725, 68014, - 0, 0, 72099, 0, 0, 0, 0, 74899, 0, 0, 0, 110804, 0, 72142, 5074, 5073, 0, - 0, 0, 0, 70723, 5072, 128576, 13098, 72403, 0, 11040, 0, 0, 0, 4929, 0, - 0, 0, 0, 0, 0, 0, 0, 67754, 4934, 0, 0, 9758, 0, 0, 70181, 42584, 0, - 4329, 0, 4979, 8663, 74521, 0, 983042, 74418, 0, 0, 5071, 0, 3642, 0, - 5070, 10042, 0, 3987, 5068, 120211, 8909, 0, 0, 69917, 0, 73981, 983141, - 70749, 4531, 120212, 9105, 0, 4921, 121059, 4926, 65544, 113786, 69621, - 0, 0, 0, 83269, 0, 120790, 4922, 0, 992, 119568, 4925, 0, 0, 9526, 4920, - 128617, 948, 0, 0, 4930, 0, 0, 0, 4933, 0, 0, 0, 4928, 0, 0, 0, 0, - 128379, 722, 0, 127483, 127482, 127485, 82997, 127487, 1509, 0, 5468, - 66214, 127474, 127477, 1672, 127479, 10864, 127481, 72132, 127467, 72159, - 127469, 127468, 127471, 127470, 68336, 82999, 120115, 1679, 120116, 0, - 120113, 127462, 127465, 127464, 127110, 120119, 120112, 0, 120109, 6968, - 5761, 342, 8553, 0, 8143, 127115, 127114, 127113, 624, 127111, 4057, 0, - 5078, 0, 0, 0, 5076, 0, 0, 0, 120097, 685, 9025, 1524, 8003, 0, 5539, - 113727, 113795, 120102, 7138, 120552, 0, 0, 0, 113724, 0, 8058, 9732, 0, - 5080, 0, 5036, 5035, 0, 42604, 72118, 0, 0, 275, 13291, 69995, 0, 0, - 983908, 5033, 0, 0, 4836, 70184, 73792, 0, 0, 0, 120681, 43704, 0, 2274, - 119000, 124983, 0, 8858, 6409, 0, 119585, 0, 0, 0, 0, 0, 68442, 0, 3432, - 10218, 0, 6094, 11232, 0, 0, 0, 0, 1676, 129157, 0, 0, 5030, 0, 118810, - 0, 73869, 0, 0, 69944, 6787, 0, 0, 0, 983595, 10544, 12919, 69425, 92218, - 0, 0, 0, 129172, 0, 67703, 0, 0, 0, 0, 0, 72290, 0, 0, 0, 0, 7018, 66241, - 0, 0, 0, 0, 0, 74056, 0, 11833, 0, 67975, 65232, 40964, 251, 12686, 7895, - 4395, 43538, 0, 0, 0, 78042, 0, 0, 40967, 5879, 0, 0, 0, 0, 0, 65540, - 128590, 625, 0, 120194, 1113, 0, 13103, 3630, 67224, 8179, 74264, 67886, - 9316, 10980, 2489, 120958, 8150, 1359, 121353, 70464, 127330, 127327, - 5042, 5041, 42769, 12084, 11196, 127321, 92279, 72398, 120535, 127317, - 127318, 127315, 12283, 127313, 11453, 0, 8795, 66245, 0, 0, 0, 5037, - 118864, 0, 0, 67724, 0, 66893, 74006, 0, 8431, 0, 0, 0, 0, 12620, 6826, - 73773, 70169, 5040, 0, 0, 0, 0, 0, 5039, 0, 0, 0, 5038, 0, 0, 0, 0, 0, - 65908, 0, 0, 0, 0, 0, 65157, 0, 0, 70182, 0, 73909, 4835, 0, 0, 0, 4309, - 7127, 0, 0, 0, 1301, 0, 0, 12222, 0, 73813, 711, 92439, 7133, 0, 0, 0, 0, - 0, 0, 0, 7661, 72263, 129541, 0, 0, 70453, 7627, 0, 5031, 92340, 42738, - 65784, 0, 65782, 3758, 0, 65781, 67865, 0, 2440, 65780, 70795, 8449, - 121393, 121479, 0, 2118, 0, 12121, 0, 0, 129510, 2128, 2130, 2131, 2126, - 2133, 0, 121250, 2114, 2116, 2455, 0, 2122, 2123, 2124, 2125, 983787, - 8714, 0, 2113, 0, 2115, 0, 127907, 43713, 5052, 66220, 66653, 65777, - 65778, 65775, 5051, 65773, 1429, 42647, 5050, 65769, 388, 70685, 735, 0, - 0, 128035, 0, 12726, 0, 0, 0, 0, 0, 5109, 5053, 0, 0, 0, 0, 0, 2470, 0, - 0, 1925, 71251, 0, 10971, 113770, 5048, 5047, 0, 0, 194946, 92313, 0, 0, - 0, 8089, 0, 639, 0, 68179, 0, 70180, 0, 4599, 0, 0, 0, 0, 983798, 648, - 194948, 65819, 0, 0, 0, 0, 94017, 0, 11777, 9750, 983122, 0, 0, 92367, - 70175, 5046, 66255, 0, 0, 65253, 0, 5045, 0, 1916, 74069, 5044, 92348, 0, - 0, 5043, 0, 0, 0, 74004, 9669, 12341, 0, 8402, 0, 0, 70174, 0, 3586, - 64508, 92456, 0, 0, 119606, 0, 42628, 10069, 0, 0, 0, 0, 123, 120703, 0, - 121326, 0, 10719, 129409, 120444, 10829, 120593, 0, 12130, 0, 0, 0, 0, - 3925, 0, 0, 75065, 71112, 92372, 71110, 71111, 0, 120441, 120452, 983178, - 0, 0, 0, 0, 0, 0, 0, 0, 69879, 8509, 120449, 0, 0, 0, 120448, 0, 118889, - 194858, 0, 0, 0, 66445, 0, 71109, 0, 0, 72425, 0, 12136, 0, 0, 0, 0, 0, - 0, 19922, 41768, 74002, 0, 0, 0, 0, 2458, 0, 0, 0, 41074, 4266, 0, 0, - 41077, 0, 9050, 0, 0, 73693, 0, 0, 41075, 2476, 0, 0, 0, 69761, 0, 0, - 74202, 78745, 0, 121324, 70152, 66033, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83106, - 0, 0, 0, 43693, 78753, 0, 12194, 66215, 0, 121273, 67216, 121499, 0, - 121118, 0, 78756, 0, 0, 55256, 0, 0, 0, 0, 43876, 0, 0, 0, 12948, 195003, - 195002, 195005, 195004, 195007, 195006, 0, 128320, 4287, 70183, 4902, - 74020, 0, 0, 0, 1816, 0, 0, 168, 0, 4898, 64298, 0, 78450, 4901, 1821, 0, - 43294, 3653, 0, 791, 9162, 6977, 121183, 0, 70160, 0, 73731, 8354, 0, 0, - 0, 7557, 0, 0, 8234, 194992, 78456, 194994, 194993, 194996, 194995, - 65925, 194997, 195000, 194999, 0, 195001, 0, 64397, 0, 0, 0, 71310, - 194977, 194976, 2448, 194978, 194981, 194980, 2452, 194982, 194985, - 194984, 78694, 72292, 7845, 0, 78692, 4408, 4122, 6772, 194988, 8723, - 72147, 194989, 119302, 67403, 119304, 119303, 2438, 119297, 119300, - 119299, 41953, 0, 42135, 373, 119172, 2119, 11457, 129618, 41955, 0, 0, - 0, 41952, 0, 0, 2127, 0, 128496, 5202, 0, 78765, 42823, 11291, 0, 0, - 12963, 0, 0, 4125, 41958, 12133, 0, 125099, 1271, 129427, 0, 66024, 0, - 3864, 127825, 0, 0, 0, 0, 4166, 0, 0, 0, 7459, 0, 119914, 5384, 0, 0, - 70154, 5759, 0, 0, 0, 0, 66744, 0, 120571, 0, 75066, 5552, 0, 0, 127192, - 5553, 0, 0, 0, 12906, 0, 0, 110787, 110792, 110788, 5554, 0, 12344, - 110786, 0, 0, 0, 0, 0, 8517, 0, 0, 0, 66017, 5555, 92317, 0, 983653, 0, - 0, 0, 9143, 0, 195067, 67995, 195069, 127162, 195071, 195070, 4577, - 64624, 0, 0, 125105, 983661, 4269, 983655, 983652, 983650, 0, 950, 0, - 983654, 983664, 983649, 0, 983656, 0, 119121, 0, 5098, 0, 0, 119099, - 5097, 0, 9848, 0, 10293, 983645, 72798, 0, 0, 70303, 983665, 5102, 5101, - 128370, 0, 8138, 4517, 1932, 5100, 195060, 195059, 1247, 10034, 195064, - 5099, 0, 1441, 0, 4724, 650, 0, 73954, 983266, 129348, 195040, 195043, - 9031, 195045, 195044, 195047, 8545, 66356, 195048, 0, 9154, 127243, 0, 0, - 2676, 2277, 0, 73812, 195051, 8599, 195053, 0, 195055, 65462, 0, 92524, - 195033, 71903, 0, 0, 41199, 0, 11399, 195035, 195034, 195037, 195036, - 195039, 195038, 5108, 5107, 0, 66019, 0, 0, 5541, 0, 0, 12613, 5284, 0, - 0, 128806, 4275, 74865, 854, 68147, 74381, 120918, 0, 5103, 124986, - 64348, 0, 0, 5221, 69811, 0, 0, 121163, 0, 0, 11438, 0, 0, 70158, 0, 0, - 5106, 195024, 110749, 65154, 69813, 195028, 5105, 195030, 69720, 195032, - 5104, 983761, 0, 3176, 0, 70149, 932, 0, 6567, 195009, 195008, 195011, - 195010, 70145, 43850, 195015, 195014, 195017, 195016, 0, 0, 0, 0, 10670, - 0, 13273, 0, 195020, 121370, 8803, 195021, 72431, 8151, 67145, 72436, 0, - 12553, 0, 0, 0, 0, 13065, 12570, 0, 0, 0, 983198, 124985, 0, 0, 66466, 0, - 0, 194595, 0, 194596, 11351, 43256, 0, 0, 0, 0, 41754, 0, 0, 2720, - 194975, 68462, 8232, 120760, 0, 0, 0, 0, 0, 0, 0, 93067, 10834, 0, 0, - 119266, 0, 0, 125025, 67679, 0, 75064, 7781, 0, 0, 126076, 0, 12077, 0, - 64586, 127164, 42396, 0, 3475, 0, 2479, 0, 0, 0, 120728, 0, 42434, - 194960, 194963, 194962, 110611, 67894, 42473, 194966, 110609, 1843, - 42283, 0, 0, 0, 0, 0, 194970, 0, 42321, 7284, 194974, 194973, 194950, - 194949, 194952, 194951, 0, 194953, 123614, 128645, 0, 0, 0, 0, 74952, - 194954, 194957, 194956, 66367, 194958, 41069, 67689, 9988, 0, 41068, 0, - 4295, 0, 0, 41951, 67835, 0, 785, 8236, 128647, 9027, 0, 194943, 0, 0, 0, - 0, 0, 0, 41071, 41059, 0, 92458, 129442, 0, 0, 0, 123612, 2067, 4310, 0, - 123611, 5180, 123605, 0, 73872, 0, 69880, 5184, 42385, 194947, 983755, - 128531, 0, 0, 119149, 0, 121334, 0, 983762, 0, 0, 5178, 194929, 120548, - 194931, 5188, 194933, 194932, 72245, 194934, 1166, 64429, 42639, 0, 0, 0, - 0, 128071, 2442, 10703, 194940, 194939, 194635, 42439, 0, 0, 0, 73933, - 983238, 42401, 0, 0, 0, 42288, 0, 0, 0, 13145, 0, 2468, 0, 42327, 0, 0, - 0, 42479, 0, 0, 0, 92580, 0, 74939, 120678, 0, 73733, 0, 0, 2715, 0, - 71257, 0, 74114, 0, 0, 0, 0, 0, 66325, 69603, 0, 9240, 0, 0, 129142, 0, - 0, 0, 9815, 0, 11246, 0, 73912, 42733, 0, 0, 2480, 0, 0, 0, 6494, 5537, - 0, 0, 0, 0, 1211, 0, 121379, 0, 0, 12318, 0, 113796, 0, 0, 0, 0, 0, - 64642, 0, 0, 0, 0, 64864, 0, 0, 0, 121212, 0, 0, 3589, 92719, 4035, 6492, - 92236, 4265, 6843, 0, 74186, 41778, 113764, 119216, 2488, 0, 4582, 0, - 71426, 41777, 12926, 72708, 7528, 10550, 113761, 0, 0, 11439, 0, 0, - 64878, 0, 0, 0, 0, 2286, 0, 0, 126646, 127909, 0, 400, 126500, 0, 0, 0, - 0, 0, 64827, 0, 74948, 390, 0, 71301, 0, 3473, 0, 0, 66742, 0, 55285, 0, - 0, 0, 92206, 0, 0, 8004, 0, 6763, 0, 0, 7006, 0, 0, 6757, 73707, 126648, - 0, 6766, 0, 0, 0, 6146, 0, 771, 0, 0, 41318, 0, 42272, 0, 0, 0, 0, 953, - 12917, 72287, 12300, 0, 11491, 68612, 0, 0, 71321, 7490, 11389, 7489, - 3379, 0, 7487, 72716, 7486, 7484, 7482, 6753, 7480, 7479, 7478, 7477, - 6501, 7475, 0, 7473, 7472, 2474, 7470, 7468, 124977, 0, 0, 0, 0, 71871, - 11834, 128376, 0, 6017, 0, 0, 0, 0, 0, 119365, 73949, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2472, 69945, 120699, 121133, 2139, 4256, 120776, 74380, 0, - 73847, 73844, 0, 0, 0, 0, 0, 0, 0, 0, 7083, 0, 8066, 7678, 0, 121124, 0, - 0, 0, 0, 0, 0, 0, 0, 120566, 0, 0, 0, 8330, 0, 0, 0, 0, 0, 0, 19934, 0, - 1770, 67091, 0, 128671, 129617, 110605, 110606, 73843, 110604, 0, 110602, - 67092, 0, 71334, 0, 0, 0, 0, 0, 8162, 0, 5996, 129644, 4903, 0, 0, 43063, - 0, 5172, 0, 7139, 0, 127385, 0, 0, 0, 0, 4334, 6324, 41975, 12186, 10674, - 12308, 0, 0, 0, 72807, 41977, 68002, 0, 126630, 2018, 121388, 41979, - 68003, 0, 68000, 0, 0, 126984, 68001, 9334, 0, 71440, 0, 7975, 0, 0, 0, - 66621, 4884, 70367, 983740, 0, 121010, 0, 0, 0, 0, 0, 0, 0, 0, 463, 0, 0, + 83339, 83340, 9056, 0, 129970, 0, 6155, 64068, 64067, 64066, 64065, + 64072, 64071, 63, 64069, 127382, 0, 93822, 7257, 64064, 0, 0, 0, 0, 0, 0, + 78748, 0, 0, 0, 120519, 0, 66242, 66232, 4333, 9855, 64112, 0, 0, 0, 0, + 0, 0, 0, 66222, 0, 0, 0, 0, 69816, 0, 118796, 0, 8708, 0, 64077, 64076, + 8996, 4992, 4471, 83343, 64079, 64078, 92179, 0, 0, 129120, 64615, 0, 0, + 12075, 42041, 0, 0, 0, 0, 127557, 3123, 0, 983735, 0, 0, 0, 83328, 0, + 9223, 0, 83321, 83322, 73797, 83327, 1116, 0, 83319, 7136, 0, 0, 0, 0, + 75031, 0, 0, 0, 64092, 43675, 10104, 83338, 83331, 64095, 64094, 8111, + 66247, 0, 64089, 64088, 0, 70106, 42236, 11434, 64083, 64082, 43216, + 7737, 64087, 64086, 64085, 64084, 0, 0, 0, 4118, 1797, 83312, 0, 0, 46, + 83308, 83309, 298, 83303, 72402, 83305, 83306, 0, 0, 0, 128905, 11495, 0, + 0, 0, 127377, 194828, 127370, 0, 0, 0, 66239, 74945, 64403, 0, 0, 83314, + 0, 0, 65758, 43536, 0, 8544, 0, 0, 0, 0, 194824, 0, 0, 0, 0, 0, 3639, + 11242, 194822, 0, 0, 0, 0, 0, 0, 68409, 0, 0, 0, 101121, 0, 0, 0, 128654, + 8789, 126248, 0, 0, 0, 0, 0, 0, 0, 65058, 0, 78234, 68064, 0, 66227, + 71694, 5573, 118936, 0, 44, 0, 66244, 118907, 0, 66238, 12844, 0, 1622, + 129190, 1900, 0, 11458, 0, 0, 6581, 5576, 128303, 0, 126122, 0, 113680, + 8947, 0, 113812, 0, 0, 0, 7908, 0, 0, 6579, 0, 0, 0, 0, 2138, 6583, 7761, + 0, 0, 0, 66802, 5058, 0, 0, 0, 5057, 125256, 0, 74538, 5054, 0, 0, 0, 0, + 0, 0, 658, 3497, 128509, 0, 5061, 5060, 4235, 0, 0, 0, 127757, 4236, + 4727, 0, 0, 0, 128791, 0, 7488, 128693, 7476, 0, 125259, 120646, 0, 0, 0, + 66209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9341, 119596, + 0, 0, 0, 64668, 0, 8125, 0, 6743, 119175, 0, 129441, 83406, 0, 127966, + 119235, 74092, 0, 0, 43660, 71125, 0, 127901, 0, 0, 0, 264, 0, 74954, 0, + 0, 0, 0, 0, 6019, 0, 0, 129121, 0, 0, 0, 8800, 0, 66376, 0, 120948, 0, + 100744, 0, 0, 92333, 725, 68014, 0, 0, 72099, 0, 0, 0, 0, 74899, 0, 0, 0, + 110804, 0, 72142, 5074, 5073, 0, 0, 128726, 0, 70723, 5072, 128576, + 13098, 72403, 0, 11040, 0, 0, 0, 4929, 0, 0, 0, 0, 0, 0, 0, 0, 67754, + 4934, 0, 0, 9758, 0, 0, 70181, 42584, 0, 4329, 0, 4979, 8663, 74521, 0, + 983042, 74418, 0, 0, 5071, 0, 3642, 0, 5070, 10042, 0, 3987, 5068, + 120209, 8909, 0, 0, 69917, 0, 73981, 983141, 70749, 4531, 120212, 9105, + 0, 4921, 121059, 4926, 65544, 113786, 69621, 0, 0, 0, 83269, 0, 120790, + 4922, 0, 992, 119568, 4925, 0, 0, 9526, 4920, 128617, 948, 0, 0, 4930, 0, + 0, 0, 4933, 0, 0, 0, 4928, 0, 0, 0, 0, 128379, 722, 0, 127483, 127482, + 127485, 82997, 127487, 1509, 0, 5468, 66214, 127474, 127477, 1672, + 127479, 10864, 127481, 72132, 127467, 72159, 127469, 127468, 127471, + 127470, 68336, 82999, 120115, 1679, 120116, 0, 120113, 127462, 127465, + 127464, 127110, 120119, 120112, 0, 120109, 6968, 5761, 342, 8553, 0, + 8143, 127115, 127114, 127113, 624, 127111, 4057, 0, 5078, 0, 0, 0, 5076, + 0, 0, 0, 120097, 685, 9025, 1524, 8003, 0, 5539, 113727, 113795, 120102, + 7138, 120552, 0, 0, 0, 113724, 0, 8058, 9732, 0, 5080, 0, 5036, 5035, 0, + 42604, 72118, 0, 0, 275, 13291, 69995, 0, 0, 983908, 5033, 0, 0, 4836, + 70184, 73792, 0, 0, 0, 120681, 43704, 0, 2274, 119000, 124983, 0, 8858, + 6409, 0, 119585, 0, 0, 0, 0, 0, 68442, 0, 3432, 10218, 0, 6094, 11232, 0, + 0, 0, 0, 1676, 129157, 0, 0, 5030, 0, 118810, 0, 73869, 0, 0, 69944, + 6787, 0, 0, 0, 983595, 10544, 12919, 69425, 92218, 0, 0, 0, 129172, 0, + 67703, 0, 0, 0, 0, 0, 72290, 0, 0, 0, 0, 7018, 66241, 0, 0, 0, 0, 0, + 74056, 0, 11833, 0, 67975, 65232, 40964, 251, 12686, 7895, 4395, 43538, + 0, 0, 0, 78042, 0, 0, 40967, 5879, 0, 0, 0, 0, 0, 65540, 128590, 625, 0, + 120194, 1113, 0, 13103, 3630, 67224, 8179, 74264, 67886, 9316, 10980, + 2489, 120958, 8150, 1359, 121353, 70464, 127330, 127327, 5042, 5041, + 42769, 12084, 11196, 127321, 92279, 72398, 120535, 127317, 127318, + 127315, 12283, 127313, 11453, 0, 8795, 66245, 0, 0, 0, 5037, 118864, 0, + 0, 67724, 0, 66893, 74006, 0, 8431, 0, 0, 0, 0, 12620, 6826, 73773, + 70169, 5040, 0, 0, 0, 0, 0, 5039, 0, 0, 0, 5038, 0, 0, 0, 0, 0, 65908, 0, + 0, 0, 0, 0, 65157, 0, 0, 70182, 0, 73909, 4835, 0, 0, 0, 4309, 7127, 0, + 0, 0, 1301, 0, 0, 12222, 0, 73813, 711, 92439, 7133, 0, 0, 0, 0, 0, 0, 0, + 7661, 72263, 129541, 0, 0, 70453, 7627, 0, 5031, 92340, 42738, 65784, 0, + 65782, 3758, 0, 65781, 67865, 0, 2440, 65780, 70795, 8449, 121393, + 121479, 0, 2118, 0, 12121, 0, 0, 129510, 2128, 2130, 2131, 2126, 2133, 0, + 121250, 2114, 2116, 2455, 0, 2122, 2123, 2124, 2125, 983787, 8714, 0, + 2113, 0, 2115, 0, 127907, 43713, 5052, 66220, 66653, 65777, 65778, 65775, + 5051, 65773, 1429, 42647, 5050, 65769, 388, 70685, 735, 0, 129899, + 128035, 0, 12726, 0, 0, 0, 0, 0, 5109, 5053, 0, 120854, 0, 0, 0, 2470, 0, + 0, 1925, 71251, 0, 10971, 113770, 5048, 5047, 0, 0, 194946, 92313, + 129972, 0, 0, 8089, 0, 639, 0, 68179, 0, 70180, 0, 4599, 0, 0, 0, 0, + 983798, 648, 194948, 65819, 0, 0, 0, 129968, 94017, 0, 11777, 9750, + 983122, 0, 0, 92367, 70175, 5046, 66255, 0, 0, 65253, 0, 5045, 0, 1916, + 74069, 5044, 92348, 0, 0, 5043, 0, 0, 0, 74004, 9669, 12341, 0, 8402, 0, + 0, 70174, 0, 3586, 64508, 92456, 0, 0, 119606, 0, 42628, 10069, 0, 0, 0, + 0, 123, 120703, 0, 121326, 0, 10719, 129409, 120444, 10829, 120593, 0, + 12130, 0, 0, 0, 0, 3925, 0, 0, 75065, 71112, 92372, 71110, 71111, 0, + 120441, 120452, 983178, 0, 0, 0, 0, 0, 0, 0, 0, 69879, 8509, 120449, 0, + 0, 0, 120448, 0, 118889, 194858, 0, 0, 0, 66445, 0, 71109, 0, 0, 72425, + 0, 12136, 0, 983629, 0, 0, 0, 0, 19922, 41768, 74002, 0, 0, 0, 0, 2458, + 0, 0, 0, 41074, 4266, 0, 0, 41077, 0, 9050, 0, 0, 73693, 0, 0, 41075, + 2476, 0, 0, 0, 69761, 0, 0, 74202, 78745, 0, 121324, 70152, 66033, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 83106, 0, 0, 0, 43693, 78753, 0, 12194, 66215, + 71987, 121273, 67216, 121499, 0, 121118, 0, 78756, 0, 0, 55256, 0, 0, 0, + 0, 43876, 0, 0, 0, 12948, 195003, 195002, 195005, 195004, 195007, 195006, + 0, 128320, 4287, 70183, 4902, 74020, 0, 0, 0, 1816, 0, 0, 168, 0, 4898, + 64298, 0, 78450, 4901, 1821, 0, 43294, 3653, 0, 791, 9162, 6977, 121183, + 0, 70160, 0, 73731, 8354, 0, 0, 0, 7557, 0, 0, 8234, 194992, 78456, + 194994, 194993, 194996, 101519, 65925, 194997, 195000, 194999, 0, 195001, + 0, 64397, 0, 0, 0, 71310, 194977, 194976, 2448, 194978, 194981, 194980, + 2452, 194982, 194985, 194984, 78694, 72292, 7845, 0, 78692, 4408, 4122, + 6772, 194988, 8723, 72147, 194989, 119302, 11857, 119304, 119303, 2438, + 119297, 119300, 119299, 41953, 0, 42135, 373, 119172, 2119, 11457, + 129618, 41955, 0, 0, 0, 41952, 0, 0, 2127, 0, 128496, 5202, 0, 78765, + 42823, 11291, 0, 0, 12963, 0, 0, 4125, 41958, 12133, 0, 125099, 1271, + 129427, 0, 66024, 0, 3864, 127825, 0, 0, 0, 0, 4166, 0, 0, 129917, 7459, + 0, 119914, 5384, 0, 0, 70154, 5759, 0, 0, 0, 0, 66744, 0, 120571, 0, + 75066, 5552, 0, 0, 127192, 5553, 0, 0, 0, 12906, 0, 0, 110787, 110792, + 110788, 5554, 0, 12344, 110786, 101508, 0, 0, 0, 0, 8517, 101509, 0, 0, + 66017, 5555, 92317, 0, 983653, 0, 0, 0, 9143, 0, 195067, 67995, 195069, + 127162, 195071, 195070, 4577, 64624, 0, 0, 125105, 983661, 4269, 983655, + 983652, 983650, 0, 950, 0, 983654, 983664, 983649, 0, 983656, 0, 119121, + 0, 5098, 0, 0, 119099, 5097, 0, 9848, 0, 10293, 983645, 72798, 0, 0, + 70303, 983665, 5102, 5101, 128370, 0, 8138, 4517, 1932, 5100, 195060, + 195059, 1247, 10034, 195064, 5099, 0, 1441, 0, 4724, 650, 0, 73954, + 983266, 129348, 195040, 195043, 9031, 195045, 195044, 195047, 8545, + 66356, 195048, 0, 9154, 127243, 0, 0, 2676, 2277, 0, 73812, 195051, 8599, + 195053, 917918, 195055, 65462, 0, 92524, 195033, 71903, 0, 0, 41199, 0, + 11399, 195035, 195034, 195037, 195036, 195039, 195038, 5108, 5107, 0, + 66019, 0, 0, 5541, 0, 0, 12613, 5284, 0, 0, 128806, 4275, 74865, 854, + 68147, 74381, 120918, 0, 5103, 124986, 64348, 0, 0, 5221, 69811, 0, 0, + 121163, 0, 0, 11438, 0, 0, 70158, 0, 0, 5106, 195024, 110749, 65154, + 69813, 195028, 5105, 195030, 69720, 195032, 5104, 983761, 0, 3176, + 127342, 70149, 932, 0, 6567, 195009, 195008, 195011, 195010, 70145, + 43850, 195015, 195014, 195017, 195016, 0, 0, 0, 0, 10670, 0, 13273, 0, + 195020, 121370, 8803, 195021, 72431, 8151, 67145, 72436, 0, 12553, 0, 0, + 0, 0, 13065, 12570, 0, 0, 0, 983198, 124985, 0, 0, 66466, 0, 0, 194595, + 0, 194596, 11351, 43256, 0, 0, 0, 0, 41754, 0, 0, 2720, 194975, 68462, + 8232, 120760, 0, 0, 0, 0, 0, 0, 0, 93067, 10834, 0, 0, 119266, 0, 0, + 125025, 67679, 0, 75064, 7781, 0, 0, 126076, 0, 12077, 0, 64586, 127164, + 42396, 0, 3475, 0, 2479, 0, 0, 0, 120728, 0, 42434, 194960, 194963, + 194962, 110611, 67894, 42473, 194966, 110609, 1843, 42283, 0, 0, 0, 0, 0, + 194970, 0, 42321, 7284, 194974, 194973, 194950, 194949, 194952, 194951, + 0, 194953, 123614, 128645, 0, 0, 0, 0, 74952, 194954, 194957, 194956, + 66367, 194958, 41069, 67689, 9988, 0, 41068, 0, 4295, 0, 0, 41951, 67835, + 0, 785, 8236, 128647, 9027, 0, 194943, 0, 0, 0, 0, 0, 0, 41071, 41059, 0, + 92458, 129442, 0, 0, 0, 123612, 2067, 4310, 0, 123611, 5180, 123605, 0, + 73872, 0, 69880, 5184, 42385, 194947, 983755, 128531, 0, 0, 119149, 0, + 121334, 0, 983762, 0, 0, 5178, 194929, 120548, 194931, 5188, 194933, + 194932, 72245, 194934, 1166, 64429, 42639, 0, 0, 0, 0, 128071, 2442, + 10703, 194940, 194939, 194635, 42439, 0, 0, 0, 73933, 983238, 42401, 0, + 0, 0, 42288, 0, 0, 0, 13145, 0, 2468, 0, 42327, 0, 0, 0, 42479, 128698, + 0, 0, 92580, 0, 74939, 120678, 0, 73733, 0, 0, 2715, 0, 71257, 0, 74114, + 0, 0, 0, 0, 0, 66325, 69603, 0, 9240, 0, 0, 129142, 0, 0, 0, 9815, 0, + 11246, 0, 73912, 42733, 0, 0, 2480, 0, 0, 0, 6494, 5537, 0, 0, 0, 0, + 1211, 0, 121379, 0, 0, 12318, 0, 113796, 0, 0, 0, 0, 0, 64642, 0, 0, 0, + 0, 64864, 0, 0, 0, 121212, 0, 0, 3589, 92719, 4035, 6492, 92236, 4265, + 6843, 0, 74186, 41778, 113764, 119216, 2488, 0, 4582, 0, 71426, 41777, + 12926, 72708, 7528, 10550, 113761, 0, 0, 11439, 0, 0, 64878, 0, 0, 0, 0, + 2286, 0, 0, 126646, 127909, 0, 400, 126500, 0, 0, 0, 0, 0, 64827, 0, + 74948, 390, 0, 71301, 0, 3473, 0, 0, 66742, 0, 55285, 0, 0, 0, 92206, 0, + 0, 8004, 0, 6763, 0, 0, 7006, 0, 0, 6757, 73707, 126648, 0, 6766, 0, 0, + 0, 6146, 0, 771, 0, 0, 41318, 0, 42272, 0, 120211, 69559, 0, 953, 12917, + 72287, 12300, 0, 11491, 68612, 0, 0, 71321, 7490, 11389, 7489, 3379, 0, + 7487, 72716, 7486, 7484, 7482, 6753, 7480, 7479, 7478, 7477, 6501, 7475, + 0, 7473, 7472, 2474, 7470, 7468, 124977, 0, 0, 0, 0, 71871, 11834, + 128376, 0, 6017, 0, 128763, 0, 0, 0, 119365, 73949, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2472, 69945, 120699, 121133, 2139, 4256, 120776, 74380, 0, + 73847, 73844, 0, 0, 101375, 0, 101374, 0, 0, 101347, 7083, 0, 8066, 7678, + 0, 121124, 101341, 101373, 101336, 0, 101331, 0, 101304, 0, 101301, 0, 0, + 0, 8330, 0, 101298, 101322, 101297, 0, 0, 19934, 0, 1770, 67091, 0, + 128671, 129617, 110605, 101355, 73843, 110604, 0, 101362, 67092, 0, + 71334, 0, 0, 0, 0, 0, 8162, 0, 5996, 129644, 4903, 0, 0, 43063, 0, 5172, + 0, 7139, 0, 127385, 0, 0, 0, 0, 4334, 6324, 41975, 12186, 10674, 12308, + 0, 0, 0, 72807, 41977, 68002, 0, 126630, 2018, 121388, 41979, 68003, 0, + 68000, 0, 0, 126984, 68001, 9334, 0, 71440, 0, 7975, 0, 0, 0, 66621, + 4884, 70367, 983740, 0, 121010, 0, 0, 0, 0, 127799, 0, 0, 0, 463, 0, 0, 69617, 6509, 5460, 0, 0, 0, 0, 42279, 0, 0, 0, 0, 0, 0, 0, 125027, 0, 121119, 0, 0, 0, 5663, 0, 0, 0, 0, 2482, 66202, 0, 0, 42247, 65174, 73925, 0, 100940, 0, 0, 126573, 0, 0, 2460, 0, 11944, 0, 0, 64679, 120835, 127310, 0, 0, 0, 5870, 0, 0, 0, 100931, 539, 100933, 100932, 100935, 9064, 100937, 100936, 100939, 100938, 0, 0, 0, 0, 0, 0, 41295, - 100941, 2478, 100943, 4162, 100945, 4260, 12953, 100950, 100949, 0, 0, 0, - 0, 0, 0, 0, 0, 5000, 0, 0, 0, 69672, 71439, 0, 74017, 0, 0, 6709, 0, 0, - 983720, 0, 0, 100922, 100921, 10301, 10333, 10397, 100925, 100928, + 100941, 2478, 100943, 4162, 100945, 4260, 12953, 100950, 100949, 129800, + 0, 0, 0, 0, 0, 0, 0, 5000, 0, 0, 0, 69672, 71439, 0, 74017, 0, 0, 6709, + 0, 0, 983720, 0, 0, 100922, 100921, 10301, 10333, 10397, 100925, 100928, 100927, 0, 0, 0, 127830, 0, 4014, 12842, 0, 67413, 0, 0, 3893, 0, 0, 12210, 0, 42147, 0, 983622, 74465, 0, 0, 0, 0, 0, 0, 0, 0, 110805, 8231, 0, 69946, 41968, 100929, 41973, 12935, 41969, 0, 2453, 0, 0, 78807, 122893, 0, 10349, 10413, 0, 41962, 3202, 119097, 0, 8316, 129174, 0, 7314, 0, 0, 0, 0, 1840, 0, 0, 0, 4883, 100908, 4723, 70099, 100909, 0, 0, 0, 0, 11089, 240, 19906, 0, 0, 0, 43600, 121004, 13134, 93065, 0, 65931, - 110649, 110650, 42634, 110648, 0, 121005, 11463, 0, 0, 0, 10445, 0, - 92969, 0, 2614, 0, 0, 1729, 0, 0, 100911, 0, 43334, 100912, 100915, + 110649, 110650, 42634, 110648, 0, 121005, 11463, 0, 0, 129861, 10445, 0, + 92969, 0, 2614, 0, 129954, 1729, 0, 0, 100911, 0, 43334, 100912, 100915, 100914, 66201, 100916, 69662, 100896, 100899, 100898, 4121, 100900, 70272, 82954, 63879, 0, 70872, 0, 0, 4039, 643, 7726, 120082, 0, 120068, 58, 0, 0, 0, 63872, 0, 0, 100891, 0, 10625, 100892, 100895, 100894, 1416, 120073, 917761, 67393, 0, 0, 0, 6996, 4264, 0, 100902, 66179, 66768, 100903, 13114, 72311, 0, 3094, 0, 0, 127074, 4437, 0, 0, 0, 55280, 42174, - 0, 42430, 0, 72246, 42355, 0, 0, 0, 0, 121251, 127401, 0, 0, 0, 0, 0, 0, - 100882, 100881, 74037, 100883, 0, 127099, 0, 0, 0, 0, 0, 69646, 65035, - 65034, 11480, 6116, 65039, 65038, 41180, 65036, 194565, 0, 12101, 5822, - 0, 0, 0, 0, 11663, 127873, 63854, 119657, 63853, 0, 0, 65810, 4289, + 0, 42430, 129796, 72246, 42355, 0, 0, 0, 0, 121251, 127401, 0, 0, 0, 0, + 0, 0, 100882, 100881, 74037, 100883, 0, 127099, 0, 0, 0, 0, 0, 69646, + 65035, 65034, 11480, 6116, 65039, 65038, 41180, 65036, 194565, 0, 12101, + 5822, 0, 0, 0, 0, 11663, 127873, 63854, 119657, 63853, 0, 0, 65810, 4289, 100885, 63896, 100887, 100890, 43621, 0, 0, 0, 129613, 194560, 7461, 73901, 0, 331, 0, 0, 0, 128029, 0, 0, 0, 74629, 0, 0, 0, 41964, 0, 63843, 2084, 41965, 0, 100864, 100863, 100866, 63841, 78549, 41220, 13032, @@ -26004,177 +26850,180 @@ static const unsigned int code_hash[] = { 0, 78504, 78830, 0, 0, 43873, 0, 0, 0, 0, 11988, 78510, 195, 68321, 41501, 0, 42031, 0, 13135, 0, 0, 0, 41499, 0, 0, 9680, 41498, 917794, 42025, 78567, 78556, 0, 0, 0, 0, 0, 0, 101074, 120502, 92597, 0, 0, - 917784, 7864, 129001, 0, 917788, 121106, 917786, 917785, 917792, 67816, - 917790, 2219, 0, 0, 0, 0, 0, 0, 121277, 0, 917777, 917776, 917775, 69644, - 917781, 917780, 917779, 917778, 8668, 0, 121383, 917782, 5999, 0, 0, - 129195, 128243, 43653, 1726, 1015, 0, 0, 0, 0, 64919, 0, 0, 0, 128478, 0, - 69791, 927, 0, 0, 42010, 0, 42021, 0, 0, 1299, 12240, 64537, 0, 0, 0, 0, - 0, 0, 69454, 0, 0, 0, 122903, 19914, 12179, 0, 2296, 0, 0, 63832, 917773, - 0, 63816, 2594, 63823, 63817, 11178, 0, 0, 0, 11265, 68295, 0, 0, 0, - 10554, 3972, 0, 121198, 0, 917766, 10816, 917764, 119608, 74374, 917769, - 11210, 93069, 8586, 3882, 8532, 120183, 1573, 128648, 0, 69916, 0, - 101051, 67719, 0, 0, 0, 0, 0, 0, 0, 128821, 119169, 0, 0, 6626, 42763, 0, - 118884, 128613, 0, 83128, 0, 0, 0, 0, 0, 983561, 0, 0, 0, 9171, 0, 0, - 71305, 983900, 121146, 0, 0, 128881, 119604, 126596, 0, 0, 0, 128214, - 42368, 0, 983105, 2271, 41487, 12118, 74124, 68651, 110836, 110833, 3009, - 41476, 41489, 69825, 3007, 1448, 3018, 0, 41491, 8521, 5083, 5082, 0, 0, - 8519, 0, 3014, 5081, 73926, 0, 128549, 0, 69951, 5079, 0, 2557, 128086, - 65532, 11828, 0, 71297, 11105, 0, 0, 0, 8518, 10779, 0, 71303, 0, 0, - 42170, 110769, 0, 629, 1924, 0, 12037, 0, 5987, 8462, 127744, 0, 63933, - 69735, 110770, 128295, 63941, 67981, 5077, 0, 10880, 64849, 5075, 0, - 128152, 65075, 0, 11007, 983717, 0, 0, 0, 66684, 72331, 3434, 72338, - 1904, 0, 0, 72730, 0, 10499, 4507, 9578, 63925, 0, 7979, 0, 9831, 66689, - 0, 461, 0, 0, 4504, 0, 0, 6325, 0, 43021, 0, 0, 55236, 0, 0, 5177, 41324, - 12055, 63831, 0, 41327, 12591, 0, 4114, 409, 0, 0, 8948, 41325, 0, 721, - 10182, 0, 71311, 0, 0, 94052, 74963, 83503, 5998, 0, 0, 74825, 0, 12587, - 0, 78571, 74889, 71328, 128955, 0, 74121, 0, 78822, 0, 0, 5995, 0, 42568, - 0, 0, 63944, 73860, 0, 0, 4167, 0, 43175, 0, 74120, 0, 65076, 938, 73857, - 73854, 11737, 9721, 0, 0, 0, 11742, 0, 0, 11493, 12334, 128762, 0, 66623, - 0, 9173, 0, 11978, 0, 73982, 113750, 113741, 0, 6759, 0, 0, 0, 126222, 0, - 70388, 129093, 13027, 42777, 7683, 1167, 0, 4983, 0, 861, 0, 0, 68297, 0, - 43757, 92978, 129298, 0, 0, 0, 0, 70815, 9616, 0, 0, 12816, 43759, 0, - 12710, 68674, 12721, 4101, 66185, 0, 5992, 7616, 0, 0, 12577, 0, 0, 853, - 42693, 0, 121088, 0, 0, 917915, 0, 42835, 0, 0, 0, 0, 0, 12712, 7105, - 127807, 65060, 66875, 9900, 0, 0, 0, 121482, 119265, 0, 64778, 12585, 0, - 0, 0, 0, 0, 0, 77826, 0, 4900, 125245, 0, 0, 0, 4119, 74768, 8971, 0, 0, - 0, 78594, 41132, 9245, 73060, 0, 4138, 194841, 0, 0, 0, 77827, 0, 13054, - 0, 0, 128416, 110760, 0, 0, 3948, 128878, 0, 0, 0, 1680, 0, 78589, 0, 0, - 120032, 0, 0, 0, 0, 74833, 74190, 5993, 42709, 0, 12706, 77846, 1893, 0, - 63915, 0, 0, 110744, 0, 0, 63997, 120018, 63996, 3077, 0, 0, 1512, 0, - 12589, 41479, 0, 0, 0, 0, 11831, 120727, 0, 41481, 0, 118912, 0, 3090, 0, - 3086, 1664, 1850, 0, 3079, 0, 0, 94080, 127140, 0, 0, 74401, 0, 917555, - 0, 0, 0, 0, 0, 11526, 63985, 5864, 0, 63992, 0, 63991, 0, 5480, 7858, 0, - 4116, 78149, 0, 0, 0, 63907, 0, 0, 126131, 63905, 119601, 0, 983190, 0, - 119666, 0, 0, 7534, 507, 91, 2042, 120775, 0, 0, 66028, 118811, 41844, - 70680, 774, 0, 0, 0, 5994, 0, 0, 0, 0, 0, 72297, 0, 0, 0, 0, 6026, 0, 0, - 0, 162, 0, 125247, 78151, 78152, 983590, 92709, 0, 68304, 0, 0, 0, 66658, - 0, 0, 0, 0, 121511, 2226, 121512, 129349, 10492, 0, 121510, 0, 43119, 0, - 0, 0, 66192, 0, 0, 4899, 12729, 0, 0, 0, 0, 4103, 0, 0, 77851, 69429, + 917784, 7864, 129001, 129704, 917788, 121106, 917786, 917785, 917792, + 67816, 129876, 2219, 0, 0, 0, 0, 0, 0, 121277, 0, 917777, 917776, 917775, + 69644, 917781, 917780, 917779, 917778, 8668, 0, 121383, 917782, 5999, 0, + 0, 129195, 128243, 43653, 1726, 1015, 0, 127247, 0, 0, 64919, 0, 0, 0, + 128478, 0, 69791, 927, 0, 0, 42010, 0, 42021, 0, 0, 1299, 12240, 64537, + 0, 0, 0, 0, 0, 0, 69454, 0, 0, 0, 122903, 19914, 12179, 0, 2296, 0, 0, + 63832, 917773, 0, 63816, 2594, 63823, 63817, 11178, 0, 0, 0, 11265, + 68295, 0, 0, 0, 10554, 3972, 0, 121198, 0, 917766, 10816, 917764, 119608, + 74374, 917769, 11210, 93069, 8586, 3882, 8532, 120183, 1573, 128648, 0, + 69916, 0, 101051, 67719, 0, 0, 0, 0, 0, 0, 0, 128821, 119169, 0, 0, 6626, + 42763, 130034, 118884, 128613, 0, 83128, 0, 0, 0, 0, 0, 983561, 0, 0, 0, + 9171, 0, 0, 71305, 983900, 121146, 0, 101095, 128881, 119604, 126596, 0, + 0, 0, 128214, 42368, 0, 983105, 2271, 41487, 12118, 74124, 68651, 110836, + 110833, 3009, 41476, 41489, 69825, 3007, 1448, 3018, 0, 41491, 8521, + 5083, 5082, 0, 0, 8519, 0, 3014, 5081, 73926, 0, 128549, 0, 69951, 5079, + 129963, 2557, 128086, 65532, 11828, 0, 71297, 11105, 0, 0, 0, 8518, + 10779, 0, 71303, 0, 0, 42170, 110769, 0, 629, 1924, 0, 12037, 0, 5987, + 8462, 127744, 0, 63933, 69735, 110770, 128295, 63941, 67981, 5077, 0, + 10880, 64849, 5075, 0, 128152, 65075, 0, 11007, 983717, 0, 0, 0, 66684, + 72331, 3434, 72338, 1904, 0, 0, 72730, 0, 10499, 4507, 9578, 63925, 0, + 7979, 0, 9831, 66689, 0, 461, 194834, 0, 4504, 0, 0, 6325, 0, 43021, 0, + 0, 55236, 0, 0, 5177, 41324, 12055, 63831, 0, 41327, 12591, 0, 4114, 409, + 0, 0, 8948, 41325, 0, 721, 10182, 0, 71311, 0, 0, 94052, 74963, 83503, + 5998, 0, 0, 74825, 0, 12587, 0, 78571, 74889, 71328, 128955, 0, 74121, + 78570, 78822, 0, 0, 5995, 0, 42568, 0, 0, 63944, 73860, 0, 0, 4167, 0, + 43175, 0, 74120, 0, 65076, 938, 73857, 73854, 11737, 9721, 0, 0, 0, + 11742, 0, 0, 11493, 12334, 128762, 0, 66623, 0, 9173, 0, 11978, 0, 12734, + 113750, 113741, 0, 6759, 0, 0, 0, 126222, 0, 70388, 129093, 13027, 42777, + 7683, 1167, 0, 4983, 0, 861, 0, 0, 68297, 0, 43757, 92978, 129298, 0, 0, + 0, 0, 70815, 9616, 0, 0, 12816, 43759, 0, 12710, 68674, 12721, 4101, + 66185, 0, 5992, 7616, 0, 0, 12577, 0, 0, 853, 42693, 0, 121088, 0, 0, + 917915, 0, 42835, 0, 0, 0, 0, 0, 12712, 7105, 127807, 65060, 66875, 9900, + 0, 0, 0, 121482, 119265, 0, 64778, 12585, 0, 0, 0, 0, 0, 0, 77826, 0, + 4900, 125245, 0, 0, 0, 4119, 74768, 8971, 0, 0, 0, 78594, 41132, 9245, + 73060, 0, 4138, 194841, 0, 0, 0, 77827, 0, 13054, 0, 0, 128416, 110760, + 0, 0, 3948, 128878, 0, 0, 0, 1680, 0, 78589, 0, 0, 120032, 0, 0, 0, 0, + 74833, 74190, 5993, 42709, 0, 12706, 77846, 1893, 0, 63915, 0, 0, 110744, + 129826, 0, 63997, 120018, 63996, 3077, 0, 0, 1512, 0, 12589, 41479, 0, 0, + 0, 0, 11831, 120727, 0, 41481, 0, 118912, 0, 3090, 0, 3086, 1664, 1850, + 0, 3079, 0, 0, 94080, 127140, 0, 0, 74401, 0, 917555, 0, 0, 0, 0, 0, + 11526, 63985, 5864, 0, 63992, 0, 63991, 0, 5480, 7858, 0, 4116, 78149, 0, + 0, 0, 63907, 0, 0, 126131, 63905, 119601, 0, 983190, 0, 119666, 0, 0, + 7534, 507, 91, 2042, 120775, 0, 0, 66028, 118811, 41844, 70680, 774, 0, + 0, 0, 5994, 0, 12733, 0, 0, 0, 72297, 0, 0, 0, 0, 6026, 0, 0, 0, 162, 0, + 125247, 78151, 78152, 983590, 92709, 0, 68304, 0, 0, 0, 66658, 0, 0, 0, + 0, 121511, 2226, 121512, 129349, 10492, 0, 121510, 0, 43119, 0, 0, 0, + 66192, 0, 0, 4899, 12729, 0, 0, 0, 0, 4103, 0, 129842, 77851, 69429, 129046, 0, 12859, 70087, 0, 0, 0, 0, 0, 0, 0, 0, 65264, 5146, 0, 194694, - 71684, 0, 0, 0, 983844, 0, 71688, 194693, 5147, 125019, 0, 74524, 71682, - 128435, 0, 194692, 5991, 3445, 0, 4976, 66193, 0, 0, 0, 0, 128309, 0, 0, - 0, 0, 63855, 0, 10138, 0, 0, 8897, 0, 75027, 0, 120931, 77862, 65836, 0, - 0, 77860, 0, 0, 1123, 4124, 41553, 77903, 0, 71680, 121386, 398, 0, 0, - 41551, 0, 0, 0, 41550, 9970, 0, 93062, 42392, 1305, 78901, 0, 0, 0, 7346, - 41464, 0, 0, 0, 41465, 983577, 8528, 9149, 0, 63955, 165, 3024, 11852, - 119163, 0, 9093, 0, 9147, 0, 0, 110989, 9148, 0, 4096, 53, 8296, 0, - 71352, 0, 9594, 0, 0, 63952, 0, 10997, 0, 0, 5805, 0, 0, 0, 42176, 71455, - 74601, 129604, 10591, 0, 0, 0, 0, 0, 0, 0, 0, 92475, 0, 0, 42379, 0, 0, - 9220, 0, 121425, 0, 0, 4132, 0, 0, 11239, 0, 0, 74837, 0, 66408, 0, 8055, - 0, 0, 0, 63962, 74042, 8924, 43123, 5988, 0, 63969, 0, 42718, 8788, 1357, - 77872, 65743, 0, 8774, 0, 0, 0, 0, 92748, 120598, 128234, 9564, 0, 0, - 119124, 0, 121241, 110983, 92975, 3121, 0, 0, 0, 70081, 0, 0, 0, 0, 0, - 64851, 0, 0, 73085, 119532, 0, 0, 0, 0, 1198, 0, 66708, 64619, 0, 64663, - 93991, 0, 0, 2101, 1398, 0, 92554, 0, 0, 92684, 11406, 0, 12127, 0, 840, - 0, 0, 7101, 120938, 0, 0, 12880, 0, 43104, 0, 0, 0, 2117, 0, 0, 0, 0, 0, - 0, 0, 7769, 0, 92413, 0, 0, 0, 0, 40986, 83117, 0, 0, 4127, 0, 0, 0, 0, - 0, 0, 70738, 0, 129466, 0, 0, 0, 0, 119081, 0, 10581, 0, 4533, 0, 128941, - 6490, 0, 12038, 0, 0, 68225, 0, 0, 69704, 0, 1948, 119007, 129607, - 128594, 0, 0, 0, 120802, 0, 9494, 0, 0, 0, 4843, 0, 74772, 4098, 0, 0, 0, - 3436, 0, 127279, 12817, 0, 126607, 0, 0, 0, 0, 74433, 0, 0, 0, 0, 121296, - 65916, 0, 0, 121458, 0, 129107, 93815, 0, 73743, 0, 0, 983132, 67676, 0, - 0, 74627, 128928, 0, 127892, 0, 71326, 67222, 0, 75013, 92435, 0, 128500, - 0, 0, 9613, 43425, 4526, 121415, 0, 64520, 71336, 0, 0, 55278, 10228, - 64957, 0, 0, 3807, 2081, 66640, 0, 0, 0, 0, 119269, 0, 128688, 0, 128142, - 1451, 0, 0, 4134, 0, 74847, 0, 74793, 0, 0, 74295, 9960, 1201, 0, 12846, - 121271, 0, 11919, 64962, 0, 43739, 0, 66358, 0, 0, 0, 43679, 72284, - 72289, 0, 129523, 1253, 983851, 65766, 500, 65764, 65765, 65762, 65763, - 65760, 65761, 70334, 983848, 9821, 11702, 110630, 110631, 110628, 110629, - 128481, 0, 7533, 66717, 92500, 92305, 0, 0, 0, 127758, 71332, 0, 0, 0, 0, - 11188, 0, 4112, 0, 0, 12890, 0, 0, 9915, 0, 68423, 0, 0, 2876, 0, 0, 0, - 0, 7382, 92415, 0, 128132, 0, 0, 0, 0, 0, 127915, 0, 7003, 0, 0, 7704, 0, - 0, 0, 4123, 0, 0, 9977, 0, 0, 65759, 0, 0, 128266, 9808, 0, 92611, 4126, - 0, 9521, 9589, 64755, 0, 0, 0, 69948, 0, 92368, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 93814, 0, 0, 92234, 0, 10693, 0, 0, 65897, 4058, 0, 0, 64660, 0, 0, 0, - 983711, 1139, 43298, 0, 71333, 8970, 0, 9934, 0, 11023, 128020, 42522, 0, - 0, 0, 78899, 3057, 128113, 7349, 121327, 128722, 68065, 110813, 0, - 128090, 67201, 0, 0, 0, 9528, 0, 0, 0, 9102, 627, 0, 6273, 129496, 0, 0, - 983210, 92966, 43300, 0, 983721, 11696, 0, 1018, 65554, 0, 74338, 0, - 7645, 0, 128321, 0, 0, 0, 0, 73814, 11544, 12563, 10728, 0, 0, 127340, - 43311, 64966, 0, 0, 0, 118946, 0, 0, 74779, 0, 185, 65085, 74533, 0, 0, - 7535, 0, 42525, 0, 9749, 41701, 6131, 0, 4117, 129062, 126988, 0, 92429, - 65693, 0, 73445, 0, 69695, 0, 0, 0, 0, 0, 0, 0, 1184, 0, 815, 0, 0, 0, 0, - 0, 71325, 0, 0, 64683, 983797, 0, 127959, 0, 0, 0, 0, 0, 0, 0, 68166, 0, - 0, 0, 0, 66799, 0, 128912, 0, 5142, 0, 69643, 0, 0, 83367, 93975, 0, 0, - 0, 123209, 0, 0, 0, 74855, 121330, 0, 0, 0, 0, 10940, 66030, 0, 70385, 0, - 0, 2652, 120527, 0, 0, 0, 126508, 0, 0, 0, 0, 0, 0, 1828, 0, 128357, 0, - 8531, 0, 74799, 12324, 72434, 65238, 68374, 0, 65573, 0, 68308, 68679, - 12904, 43445, 0, 0, 0, 11247, 0, 0, 41426, 0, 0, 0, 0, 0, 67250, 69451, - 83354, 71337, 0, 0, 0, 0, 0, 0, 637, 0, 0, 0, 121178, 0, 0, 74474, 71306, - 0, 7298, 128256, 0, 0, 0, 0, 8210, 0, 0, 0, 2046, 0, 0, 0, 70333, 0, - 1506, 69926, 0, 83353, 0, 12651, 0, 0, 0, 12058, 120626, 72111, 7803, 0, - 0, 65592, 118844, 0, 0, 355, 9719, 0, 118961, 0, 121077, 0, 0, 42178, 0, - 69760, 42571, 0, 0, 0, 0, 0, 0, 127176, 3178, 0, 0, 92704, 83381, 9080, - 120943, 67697, 0, 121342, 0, 0, 71485, 0, 917837, 0, 0, 78157, 0, 0, 0, - 0, 0, 71313, 0, 0, 128212, 0, 72238, 67858, 0, 0, 0, 0, 0, 0, 0, 10770, - 118994, 0, 465, 0, 0, 74348, 0, 0, 0, 0, 0, 0, 0, 10930, 0, 0, 0, 119091, - 69388, 983614, 0, 0, 0, 0, 0, 0, 10092, 0, 0, 0, 0, 0, 1766, 11282, - 11996, 66644, 4547, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120906, 4345, 0, 0, - 128947, 0, 0, 0, 0, 0, 5382, 0, 0, 0, 0, 0, 5406, 43127, 121139, 0, 3590, - 0, 0, 0, 0, 42016, 0, 0, 121002, 0, 7742, 0, 66562, 71323, 0, 0, 5310, 0, - 128173, 0, 43594, 0, 128260, 66723, 0, 73816, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1326, 128723, 0, 0, 74519, 0, 0, 0, 0, 71308, 0, 5410, 5783, 0, 8403, - 5400, 120526, 0, 128863, 0, 0, 0, 64412, 0, 0, 5587, 42865, 71858, 0, 0, - 0, 0, 113785, 0, 120755, 0, 69738, 0, 74867, 10461, 12103, 0, 0, 70701, - 0, 0, 0, 0, 0, 94009, 0, 0, 0, 8816, 41515, 0, 11802, 0, 7585, 910, 0, 0, - 0, 3658, 83386, 120525, 0, 7617, 0, 12888, 0, 0, 64631, 0, 41514, 11097, - 5703, 0, 41517, 41504, 41519, 0, 70104, 0, 65864, 0, 120533, 0, 121037, - 0, 0, 43553, 120774, 0, 0, 0, 0, 0, 1578, 0, 43449, 0, 0, 8225, 121191, - 94024, 72799, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110655, 0, 110656, 121247, - 72213, 0, 110658, 0, 74997, 0, 3195, 10999, 983566, 7897, 0, 1203, 74396, - 0, 64544, 0, 0, 0, 2877, 0, 0, 0, 121112, 0, 0, 128977, 119607, 0, 0, 0, - 0, 983623, 0, 0, 0, 0, 0, 0, 0, 0, 983078, 0, 0, 0, 9939, 0, 0, 0, 0, 0, - 0, 0, 10714, 0, 0, 0, 0, 0, 67738, 0, 74038, 0, 42897, 0, 0, 0, 0, 0, 0, - 7730, 0, 0, 0, 11163, 0, 0, 0, 113701, 4966, 128802, 70674, 129468, - 123207, 3841, 0, 0, 983227, 77886, 0, 4972, 0, 64699, 0, 0, 0, 0, 0, - 12705, 10203, 9608, 0, 0, 11962, 121397, 0, 1196, 67684, 0, 777, 0, 0, - 65271, 0, 0, 0, 0, 64824, 983194, 0, 9454, 63778, 8658, 0, 0, 2705, 0, - 64894, 0, 0, 11986, 92636, 0, 8280, 0, 2701, 0, 0, 0, 0, 0, 9809, 0, 0, - 0, 0, 0, 63761, 1748, 0, 65719, 121078, 0, 0, 0, 55244, 3061, 0, 63765, - 63787, 0, 41520, 0, 7694, 0, 8896, 63768, 55282, 0, 127781, 0, 0, 63807, - 1591, 0, 6386, 119144, 0, 0, 0, 983199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68289, - 0, 0, 7624, 0, 10996, 92247, 10609, 0, 127181, 10987, 0, 70370, 3894, 0, - 0, 0, 0, 493, 0, 0, 1717, 12228, 479, 917941, 129347, 129473, 917935, - 917939, 917924, 917932, 92303, 64315, 0, 0, 83522, 6233, 42681, 83525, - 83518, 83519, 64911, 83521, 0, 0, 83516, 83517, 983081, 8378, 11632, 0, - 0, 7323, 0, 120771, 0, 0, 0, 0, 120904, 83526, 0, 128710, 92672, 0, 0, 0, - 0, 0, 0, 0, 63806, 63800, 0, 0, 0, 63798, 63803, 244, 11542, 0, 0, 73761, - 0, 12669, 120310, 0, 0, 0, 0, 120680, 71908, 0, 0, 8612, 0, 0, 0, 0, 0, - 64662, 125056, 1360, 248, 0, 63797, 0, 63794, 0, 7292, 983666, 63756, - 42786, 74957, 0, 12663, 0, 0, 0, 0, 0, 0, 0, 4579, 0, 0, 0, 0, 0, 0, - 71130, 65545, 9602, 8623, 0, 128052, 0, 0, 0, 0, 0, 0, 0, 659, 6098, 0, - 12234, 83511, 83512, 8311, 83514, 7669, 83508, 83509, 83510, 0, 0, 0, 0, - 983932, 0, 0, 2323, 0, 2319, 77917, 120900, 77916, 2311, 83077, 4415, - 1586, 68050, 0, 128724, 83020, 2309, 83022, 8173, 83013, 83014, 83015, - 83016, 0, 83010, 83011, 83012, 9397, 0, 9395, 9396, 9393, 9394, 9391, - 9392, 9389, 6209, 9387, 9388, 9385, 9386, 9383, 9384, 0, 0, 0, 0, 0, - 11259, 0, 0, 0, 2313, 0, 0, 0, 0, 0, 0, 10570, 65776, 110968, 0, 83006, - 83007, 11998, 83009, 83002, 83003, 83004, 66406, 0, 128780, 83000, 11818, - 9381, 9382, 9379, 9380, 9377, 9378, 9375, 9376, 1683, 9374, 0, 9372, 0, - 0, 0, 0, 127801, 0, 42029, 11079, 0, 43451, 42032, 0, 0, 0, 0, 5005, 0, - 0, 42030, 5007, 78828, 126210, 0, 4951, 110776, 0, 110775, 0, 43309, - 121222, 92172, 0, 92334, 0, 9548, 0, 119138, 71896, 0, 0, 0, 0, 0, 0, - 65691, 65580, 64361, 10496, 0, 0, 0, 917975, 0, 0, 41046, 0, 0, 0, 13177, - 0, 64703, 0, 43499, 3389, 10589, 0, 11208, 120719, 78395, 73964, 78393, - 78392, 78391, 11314, 8281, 113732, 113667, 113745, 9076, 8862, 69743, - 41052, 78397, 64766, 69821, 0, 0, 0, 82992, 82994, 10671, 82998, 82987, - 82989, 82990, 6303, 113664, 498, 64471, 82986, 0, 0, 9349, 0, 0, 0, 8031, - 2414, 0, 128999, 3231, 0, 6422, 0, 0, 119339, 2537, 78405, 41429, 78403, - 78401, 78399, 0, 0, 41433, 4719, 41431, 0, 78411, 5211, 41428, 78407, - 82983, 1772, 0, 0, 82979, 66850, 64812, 82982, 82975, 68767, 82977, - 82978, 0, 0, 0, 0, 41064, 70368, 9663, 66838, 129381, 12304, 125113, 0, - 41062, 66847, 0, 0, 41061, 70454, 0, 127187, 83049, 83050, 41509, 83054, - 83045, 83046, 83047, 83048, 0, 43184, 41507, 1958, 0, 66816, 41506, 0, 0, - 0, 120717, 0, 0, 0, 74349, 72113, 8008, 0, 0, 0, 65083, 6839, 0, 126517, - 73803, 127055, 127056, 3508, 127058, 127059, 78038, 0, 120932, 0, 6411, - 128115, 0, 0, 128832, 100930, 0, 0, 0, 0, 0, 0, 128546, 0, 0, 120914, 0, - 0, 0, 0, 917822, 128810, 983657, 65599, 0, 9966, 12607, 4948, 128070, 0, - 128149, 0, 0, 6207, 0, 6117, 73916, 0, 0, 0, 0, 68244, 41511, 0, 129489, - 127304, 0, 121289, 0, 0, 83031, 83032, 0, 41556, 0, 0, 0, 128571, 73766, - 0, 0, 0, 41510, 7953, 0, 0, 41513, 0, 0, 0, 83038, 83039, 83040, 83041, - 83034, 83035, 848, 9868, 983149, 6424, 0, 83033, 0, 0, 0, 0, 0, 0, 893, - 64576, 13299, 0, 0, 0, 71447, 0, 0, 0, 0, 8903, 0, 0, 0, 8099, 0, 0, 0, - 0, 0, 0, 0, 0, 113713, 0, 0, 0, 0, 0, 83027, 41483, 83029, 83030, 83023, + 71684, 0, 0, 0, 983844, 0, 71688, 78463, 5147, 125019, 0, 74524, 71682, + 128435, 0, 194692, 5991, 3445, 0, 4976, 66193, 0, 0, 0, 0, 128309, + 128594, 129819, 69579, 0, 63855, 0, 10138, 0, 0, 8897, 0, 75027, 0, + 120931, 77862, 65836, 0, 0, 77860, 0, 0, 1123, 4124, 41553, 77903, 0, + 71680, 121386, 398, 0, 129035, 41551, 0, 0, 0, 41550, 9970, 0, 93062, + 42392, 1305, 78901, 0, 129292, 0, 7346, 41464, 0, 0, 0, 41465, 983567, + 8528, 9149, 0, 63955, 165, 3024, 11852, 119163, 0, 9093, 0, 9147, 0, 0, + 110989, 9148, 0, 4096, 53, 8296, 0, 71352, 0, 9594, 0, 0, 63952, 0, + 10997, 0, 0, 5805, 0, 0, 0, 42176, 71455, 74601, 129604, 10591, 0, 0, 0, + 0, 0, 0, 0, 0, 92475, 0, 0, 42379, 0, 0, 9220, 0, 121425, 0, 0, 4132, 0, + 0, 11239, 0, 0, 74837, 0, 66408, 0, 8055, 0, 0, 0, 63962, 74042, 8924, + 43123, 5988, 0, 63969, 0, 42718, 8788, 1357, 77872, 65743, 0, 8774, 0, 0, + 0, 0, 92748, 120598, 128234, 9564, 0, 0, 119124, 0, 121241, 110983, + 92975, 3121, 0, 0, 0, 70081, 0, 0, 0, 0, 0, 64851, 0, 0, 73085, 119532, + 0, 0, 0, 0, 1198, 69293, 66708, 64619, 0, 64663, 93991, 0, 0, 2101, 1398, + 0, 92554, 0, 0, 92684, 11406, 101588, 12127, 0, 840, 0, 0, 7101, 120938, + 0, 0, 12880, 0, 43104, 0, 0, 0, 2117, 0, 0, 0, 0, 0, 0, 0, 7769, 129867, + 92413, 0, 0, 0, 0, 40986, 83117, 0, 0, 4127, 0, 0, 0, 0, 0, 0, 70738, 0, + 129466, 0, 0, 0, 0, 119081, 0, 10581, 0, 4533, 0, 128941, 6490, 0, 12038, + 0, 0, 68225, 0, 0, 69704, 0, 1948, 119007, 129607, 101586, 0, 0, 0, + 120802, 0, 9494, 0, 0, 0, 4843, 0, 74772, 4098, 0, 0, 0, 3436, 0, 127279, + 12817, 0, 126607, 0, 0, 0, 0, 74433, 0, 0, 0, 0, 121296, 65916, 0, 0, + 121458, 0, 129107, 93815, 0, 73743, 0, 0, 983132, 67676, 0, 0, 74627, + 128928, 0, 127892, 0, 71326, 67222, 0, 75013, 92435, 0, 128500, 0, 0, + 9613, 43425, 4526, 121415, 0, 64520, 71336, 0, 0, 55278, 10228, 64957, 0, + 0, 3807, 2081, 66640, 0, 0, 0, 0, 119269, 0, 128688, 0, 128142, 1451, 0, + 0, 4134, 0, 74847, 0, 74793, 0, 0, 74295, 9960, 1201, 0, 12846, 121271, + 0, 11919, 64962, 0, 43739, 0, 66358, 0, 0, 0, 43679, 72284, 72289, 0, + 129523, 1253, 983851, 65766, 500, 65764, 65765, 65762, 65763, 65760, + 65761, 70334, 983848, 9821, 11702, 110630, 110631, 110628, 110629, + 128481, 0, 7533, 66717, 92500, 92305, 0, 0, 69277, 127758, 71332, 0, 0, + 0, 0, 11188, 0, 4112, 0, 0, 12890, 0, 0, 9915, 0, 68423, 0, 0, 2876, 0, + 0, 0, 0, 7382, 92415, 0, 128132, 0, 0, 0, 0, 69561, 127915, 0, 7003, 0, + 0, 7704, 0, 0, 0, 4123, 0, 0, 9977, 0, 0, 65759, 0, 0, 128266, 9808, 0, + 92611, 4126, 0, 9521, 9589, 64755, 0, 0, 0, 69948, 0, 92368, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 93814, 0, 0, 92234, 0, 10693, 0, 0, 65897, 4058, 0, 0, + 64660, 0, 0, 0, 983711, 1139, 43298, 0, 71333, 8970, 0, 9934, 0, 11023, + 128020, 42522, 0, 0, 0, 78899, 3057, 128113, 7349, 69959, 128722, 68065, + 110813, 0, 128090, 67201, 0, 0, 0, 9528, 0, 0, 0, 9102, 627, 0, 6273, + 129496, 0, 0, 983210, 92966, 43300, 0, 983721, 11696, 127343, 1018, + 65554, 0, 74338, 0, 7645, 0, 128321, 0, 0, 0, 0, 73814, 11544, 12563, + 10728, 0, 0, 127340, 43311, 64966, 0, 0, 0, 118946, 0, 0, 74779, 0, 185, + 65085, 74533, 0, 0, 7535, 0, 42525, 0, 9749, 41701, 6131, 0, 4117, + 129062, 126988, 0, 92429, 65693, 0, 73445, 0, 69695, 0, 0, 0, 0, 0, 0, 0, + 1184, 0, 815, 0, 0, 0, 0, 0, 71325, 0, 0, 64683, 983797, 0, 127959, 0, 0, + 0, 0, 0, 0, 0, 68166, 0, 0, 0, 0, 66799, 0, 128912, 0, 5142, 0, 69643, 0, + 0, 83367, 93975, 0, 0, 0, 123209, 0, 0, 0, 74855, 121330, 0, 0, 0, 0, + 10940, 66030, 0, 70385, 0, 0, 2652, 120527, 0, 129946, 0, 126508, 0, 0, + 0, 0, 0, 0, 1828, 0, 128357, 0, 8531, 0, 74799, 12324, 72434, 65238, + 68374, 0, 65573, 0, 68308, 68679, 12904, 43445, 0, 0, 0, 11247, 0, 0, + 41426, 0, 0, 0, 0, 0, 67250, 69451, 83354, 71337, 0, 0, 0, 0, 0, 0, 637, + 0, 0, 0, 121178, 0, 0, 74474, 71306, 0, 7298, 128256, 0, 0, 0, 0, 8210, + 0, 0, 0, 2046, 0, 0, 0, 70333, 0, 1506, 69926, 0, 83353, 0, 12651, 0, 0, + 0, 12058, 120626, 72111, 7803, 0, 0, 65592, 118844, 0, 0, 355, 9719, 0, + 118961, 0, 121077, 127246, 0, 42178, 0, 69760, 42571, 0, 0, 0, 0, 0, 0, + 127176, 3178, 0, 0, 92704, 83381, 9080, 120943, 67697, 0, 121342, 129875, + 0, 71485, 0, 917837, 0, 0, 78157, 0, 0, 0, 0, 0, 71313, 0, 0, 128212, 0, + 72238, 67858, 0, 0, 0, 0, 0, 0, 0, 10770, 118994, 0, 465, 0, 0, 74348, 0, + 0, 0, 0, 0, 0, 0, 10930, 0, 0, 0, 119091, 69388, 983614, 129918, 0, 0, 0, + 0, 0, 10092, 0, 0, 0, 0, 0, 1766, 11282, 11996, 66644, 4547, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 120906, 4345, 0, 0, 128947, 0, 0, 0, 0, 0, 5382, 0, 0, 0, + 0, 0, 5406, 43127, 120007, 0, 3590, 129874, 0, 0, 0, 42016, 0, 0, 121002, + 0, 7742, 0, 66562, 71323, 0, 0, 5310, 0, 128173, 0, 43594, 0, 128260, + 66723, 0, 73816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1326, 128723, 0, 0, 74519, 0, + 0, 0, 0, 71308, 0, 5410, 5783, 0, 8403, 5400, 120526, 0, 128863, 0, 0, 0, + 64412, 0, 0, 5587, 42865, 71858, 0, 0, 129854, 0, 113785, 0, 120755, 0, + 69738, 0, 74867, 10461, 12103, 0, 0, 70701, 0, 0, 0, 0, 0, 94009, 0, 0, + 0, 8816, 41515, 0, 11802, 0, 7585, 910, 0, 0, 0, 3658, 83386, 120525, 0, + 7617, 0, 12888, 0, 0, 64631, 0, 41514, 11097, 5703, 0, 41517, 41504, + 41519, 0, 70104, 0, 65864, 0, 120533, 0, 121037, 0, 0, 43553, 120774, 0, + 0, 0, 0, 0, 1578, 0, 43449, 0, 0, 8225, 121191, 94024, 72799, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 110655, 0, 110656, 121247, 72213, 0, 110658, 0, + 74997, 0, 3195, 10999, 983570, 7897, 0, 1203, 74396, 0, 64544, 0, 0, 0, + 2877, 0, 0, 0, 121112, 0, 0, 128977, 119607, 0, 0, 0, 0, 983623, 0, 0, 0, + 0, 0, 0, 0, 0, 983078, 0, 0, 0, 9939, 0, 0, 0, 0, 0, 0, 0, 10714, 0, 0, + 0, 0, 0, 67738, 0, 74038, 0, 42897, 0, 0, 0, 0, 0, 0, 7730, 0, 0, 0, + 11163, 0, 0, 0, 113701, 4966, 128802, 70674, 129468, 123207, 3841, 0, 0, + 983227, 77886, 0, 4972, 0, 64699, 0, 0, 0, 0, 0, 12705, 10203, 9608, 0, + 0, 11962, 121397, 0, 1196, 67684, 0, 777, 0, 0, 65271, 0, 0, 0, 0, 64824, + 983194, 0, 9454, 63778, 8658, 0, 0, 2705, 0, 64894, 0, 0, 11986, 92636, + 0, 8280, 0, 2701, 0, 0, 0, 0, 0, 9809, 0, 0, 0, 0, 0, 63761, 1748, 0, + 65719, 121078, 0, 0, 0, 55244, 3061, 0, 63765, 63787, 0, 41520, 0, 7694, + 0, 8896, 63768, 55282, 0, 127781, 0, 0, 63807, 1591, 0, 6386, 119143, 0, + 0, 0, 983199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68289, 0, 0, 7624, 0, 10996, + 92247, 10609, 0, 127181, 10987, 0, 70370, 3894, 0, 0, 0, 0, 493, 0, 0, + 1717, 12228, 479, 917941, 129347, 129473, 917935, 917939, 917924, 917932, + 92303, 64315, 0, 0, 83522, 6233, 42681, 83525, 83518, 83519, 64911, + 83521, 0, 0, 83516, 83517, 129843, 8378, 11632, 0, 0, 7323, 0, 120771, 0, + 0, 0, 0, 120904, 83526, 0, 128710, 92672, 0, 0, 0, 0, 0, 0, 0, 63806, + 63800, 0, 0, 0, 63798, 63803, 244, 11542, 0, 0, 73761, 0, 12669, 120310, + 0, 0, 0, 0, 120680, 71908, 0, 0, 8612, 0, 0, 0, 0, 0, 64662, 125056, + 1360, 248, 0, 63797, 0, 63794, 0, 7292, 983666, 63756, 42786, 74957, 0, + 12663, 0, 0, 0, 0, 0, 0, 0, 4579, 0, 0, 0, 0, 0, 0, 71130, 65545, 9602, + 8623, 0, 128052, 0, 0, 0, 0, 0, 0, 0, 659, 6098, 0, 12234, 83511, 83512, + 8311, 83514, 7669, 83508, 83509, 83510, 0, 0, 0, 0, 983932, 0, 0, 2323, + 0, 2319, 77917, 120900, 77916, 2311, 83077, 4415, 1586, 68050, 0, 128724, + 83020, 2309, 83022, 8173, 83013, 83014, 83015, 83016, 0, 83010, 69275, + 83012, 9397, 0, 9395, 9396, 9393, 9394, 9391, 9392, 9389, 6209, 9387, + 9388, 9385, 9386, 9383, 9384, 0, 0, 0, 0, 0, 11259, 0, 0, 0, 2313, 0, + 119661, 0, 0, 0, 0, 10570, 65776, 110968, 0, 83006, 83007, 11998, 83009, + 83002, 83003, 83004, 66406, 0, 128780, 83000, 11818, 9381, 9382, 9379, + 9380, 9377, 9378, 9375, 9376, 1683, 9374, 0, 9372, 0, 0, 0, 0, 127801, 0, + 42029, 11079, 0, 43451, 42032, 0, 0, 0, 0, 5005, 0, 0, 42030, 5007, + 78828, 126210, 0, 4951, 110776, 0, 110775, 0, 43309, 121222, 92172, 0, + 92334, 0, 9548, 0, 119138, 71896, 0, 0, 0, 0, 0, 0, 65691, 65580, 64361, + 10496, 0, 0, 0, 917975, 0, 0, 41046, 0, 0, 0, 13177, 0, 64703, 0, 43499, + 3389, 10589, 0, 11208, 120719, 78395, 73964, 78393, 78392, 78391, 11314, + 8281, 113732, 113667, 113745, 9076, 8862, 69743, 41052, 78397, 64766, + 69821, 0, 0, 0, 82992, 82994, 10671, 82998, 82987, 82989, 82990, 6303, + 113664, 498, 64471, 82986, 129901, 0, 9349, 0, 0, 0, 8031, 2414, 0, + 128999, 3231, 0, 6422, 0, 0, 119339, 2537, 78405, 41429, 78403, 78401, + 78399, 0, 0, 41433, 4719, 41431, 0, 78411, 5211, 41428, 78407, 82983, + 1772, 0, 0, 82979, 66850, 64812, 82982, 82975, 68767, 82977, 82978, 0, 0, + 0, 0, 41064, 70368, 9663, 66838, 129381, 12304, 125113, 0, 41062, 66847, + 0, 0, 41061, 70454, 0, 127187, 83049, 83050, 41509, 83054, 83045, 83046, + 83047, 83048, 0, 43184, 41507, 1958, 0, 66816, 41506, 0, 0, 0, 120717, 0, + 0, 0, 74349, 72113, 8008, 0, 0, 0, 65083, 6839, 0, 126517, 73803, 127055, + 127056, 3508, 127058, 127059, 78038, 0, 120932, 0, 6411, 128115, 0, 0, + 128832, 100930, 0, 0, 0, 0, 0, 0, 128546, 0, 0, 120914, 0, 0, 0, 0, + 917822, 128810, 983657, 65599, 0, 9966, 12607, 4948, 128070, 0, 128149, + 0, 0, 6207, 0, 6117, 73916, 0, 0, 0, 0, 68244, 41511, 0, 129489, 127304, + 0, 121289, 0, 0, 83031, 83032, 0, 41556, 0, 0, 0, 128571, 73766, 0, 0, 0, + 41510, 7953, 0, 0, 41513, 0, 0, 0, 83038, 83039, 83040, 83041, 83034, + 83035, 848, 9868, 983149, 6424, 0, 83033, 0, 0, 0, 0, 0, 0, 893, 64576, + 13299, 0, 0, 71998, 71447, 0, 0, 0, 0, 8903, 0, 0, 0, 8099, 0, 0, 0, 0, + 0, 0, 0, 0, 113713, 0, 0, 0, 0, 0, 83027, 41483, 83029, 83030, 83023, 83024, 69436, 83026, 194756, 41485, 194758, 194757, 194760, 41482, 42737, 64588, 0, 127787, 0, 10014, 0, 0, 194763, 194762, 68785, 194764, 194767, 194766, 0, 0, 0, 11377, 0, 0, 983792, 0, 0, 0, 9776, 0, 93824, 5215, @@ -26182,14 +27031,14 @@ static const unsigned int code_hash[] = { 129526, 6421, 0, 0, 121304, 0, 0, 0, 0, 92625, 119070, 67895, 983943, 0, 68608, 6482, 0, 0, 11945, 0, 0, 8838, 0, 4025, 10709, 0, 2108, 0, 73929, 0, 0, 10617, 194737, 128031, 194739, 194738, 68614, 194740, 68611, 9924, - 194745, 194744, 0, 0, 0, 3277, 0, 4947, 41055, 0, 194722, 194721, 194724, + 129952, 194744, 0, 0, 0, 3277, 0, 4947, 41055, 0, 194722, 129930, 194724, 194723, 64626, 194725, 42266, 194727, 8371, 194729, 127028, 12806, 41492, 0, 0, 73930, 194731, 194730, 41054, 1078, 194735, 194734, 41057, 0, 0, 0, - 0, 0, 92210, 73009, 0, 41496, 0, 9165, 1572, 0, 917934, 0, 128635, 9215, - 9330, 0, 10032, 41745, 43183, 6401, 5831, 0, 0, 0, 8056, 0, 65681, 92377, - 0, 0, 0, 121048, 0, 118887, 6408, 0, 0, 5661, 82972, 82973, 3603, 0, - 82967, 3548, 82969, 82970, 0, 82964, 82965, 9918, 118787, 11321, 0, 0, 0, - 128992, 0, 0, 0, 0, 0, 0, 41558, 41471, 0, 8158, 41561, 41472, 0, 0, + 0, 0, 92210, 73009, 0, 41496, 0, 9165, 1572, 0, 129712, 0, 128635, 9215, + 9330, 129809, 10032, 41745, 43183, 6401, 5831, 0, 0, 0, 8056, 0, 65681, + 92377, 0, 0, 0, 121048, 0, 118887, 6408, 0, 0, 5661, 82972, 82973, 3603, + 0, 82967, 3548, 82969, 82970, 0, 82964, 82965, 9918, 118787, 11321, 0, 0, + 0, 128992, 0, 0, 0, 0, 0, 0, 41558, 41471, 0, 8158, 41561, 41472, 0, 0, 194672, 43762, 77927, 6701, 41559, 1896, 66256, 66248, 194680, 5665, 0, 194681, 0, 0, 0, 74352, 0, 5664, 127895, 194682, 12310, 5662, 194687, 194686, 73924, 1121, 82953, 82955, 0, 74378, 0, 0, 74966, 0, 71892, 0, @@ -26197,7 +27046,7 @@ static const unsigned int code_hash[] = { 2795, 73923, 0, 69231, 0, 6275, 93957, 917927, 124972, 194655, 127786, 6423, 0, 0, 0, 68526, 12823, 0, 0, 42026, 42017, 0, 7524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12691, 68072, 42722, 69877, 82956, 78655, 78661, 82959, - 78662, 41265, 41065, 1795, 0, 118791, 10587, 0, 983114, 0, 194640, 0, + 78662, 41265, 41065, 1795, 0, 118791, 10587, 0, 917807, 0, 194640, 0, 12946, 194641, 71921, 194643, 9169, 70372, 194648, 194647, 68202, 194649, 73990, 65111, 0, 748, 41067, 6234, 194651, 9990, 72795, 194652, 194629, 194628, 194631, 194630, 67896, 194632, 0, 3593, 82948, 82949, 82950, @@ -26212,148 +27061,150 @@ static const unsigned int code_hash[] = { 74317, 0, 8319, 194714, 194717, 10960, 72196, 8305, 12573, 983620, 72193, 0, 13202, 0, 12582, 0, 72198, 69856, 0, 0, 78598, 0, 72195, 0, 65802, 74822, 7698, 12708, 74045, 0, 0, 70460, 4913, 127990, 0, 0, 0, 0, 12728, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 12588, 8821, 6153, 194705, 78900, 194707, - 194710, 194709, 194712, 194711, 118854, 194713, 651, 0, 0, 0, 0, 0, - 78468, 78469, 69433, 78467, 69614, 74905, 194695, 78461, 194697, 194696, - 0, 4716, 43277, 0, 78474, 78475, 128592, 120928, 194700, 55264, 194702, - 120676, 0, 12707, 0, 0, 0, 0, 121417, 8479, 4151, 0, 0, 0, 0, 0, 0, 0, 0, - 113799, 0, 74050, 0, 0, 0, 0, 0, 129467, 12278, 0, 129507, 0, 2700, - 12576, 7842, 0, 0, 0, 2699, 0, 0, 2985, 0, 126475, 0, 0, 119314, 0, - 119312, 9827, 119310, 119311, 119308, 119309, 119306, 11481, 0, 119305, - 0, 35, 78481, 78482, 66694, 78480, 78477, 78478, 0, 0, 64257, 0, 0, 0, - 78485, 78486, 78483, 4272, 0, 0, 40965, 0, 12704, 78487, 983588, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5244, 4189, 94108, 0, 127948, 4188, 1879, 0, 0, 0, - 43743, 0, 8873, 2279, 0, 0, 0, 12574, 0, 92749, 92753, 983902, 0, 0, - 75001, 0, 0, 0, 12578, 12720, 128628, 101088, 0, 12346, 128596, 101089, - 0, 0, 7251, 0, 0, 118850, 73025, 0, 0, 0, 0, 0, 12564, 66457, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 41564, 10976, 0, 121223, 0, 0, 10054, 9197, - 120618, 0, 9012, 65737, 74420, 0, 13215, 12730, 0, 0, 0, 0, 816, 0, - 129462, 0, 83191, 0, 0, 92752, 0, 4715, 94107, 94106, 71075, 0, 0, 0, - 67729, 0, 307, 0, 9585, 0, 0, 0, 0, 0, 125267, 0, 70727, 65567, 120498, - 75006, 120984, 983890, 0, 12236, 41419, 194618, 194621, 194620, 75003, - 194622, 73675, 120957, 41421, 75005, 4462, 0, 126599, 983892, 821, 0, - 2498, 5800, 100834, 100833, 1760, 94019, 4469, 64377, 100840, 100839, 0, - 757, 1185, 0, 100841, 0, 10628, 100842, 68849, 100844, 43971, 100846, - 100849, 64763, 0, 7713, 0, 0, 0, 4380, 194608, 128073, 194610, 194609, - 194612, 862, 65626, 194613, 65627, 65629, 5137, 194617, 0, 0, 0, 65069, - 7566, 64688, 67143, 194592, 100823, 100822, 100825, 4748, 92228, 100826, - 100829, 42260, 129494, 64107, 0, 0, 0, 0, 128189, 0, 194604, 13137, 8775, - 127945, 123633, 194607, 0, 8410, 4454, 194585, 0, 92542, 4449, 92330, - 127064, 75022, 92761, 70664, 194589, 339, 194591, 194590, 0, 70662, 0, - 100830, 41543, 0, 0, 0, 41542, 127066, 8916, 6705, 0, 129296, 0, 0, 0, 0, - 0, 41548, 6729, 119329, 0, 7348, 0, 0, 7537, 0, 11819, 0, 0, 123624, - 71269, 0, 7344, 100808, 129595, 9780, 0, 11117, 74993, 0, 194578, 10483, - 194580, 194579, 194582, 194581, 68781, 125114, 100820, 100819, 0, 4211, - 1259, 7517, 0, 0, 194561, 70827, 194563, 194562, 641, 5219, 94034, - 194566, 11064, 194568, 0, 0, 0, 0, 0, 0, 100812, 100811, 100814, 100813, - 100816, 100815, 100818, 100817, 100798, 100797, 41410, 100799, 64262, 0, - 41407, 75000, 0, 0, 93812, 0, 0, 72803, 74999, 78897, 0, 0, 67675, 0, 0, - 0, 0, 43647, 0, 0, 100792, 100791, 100794, 100793, 100796, 100795, 0, - 74630, 11933, 0, 0, 41903, 67892, 11001, 100801, 42255, 100803, 100802, - 100805, 41905, 100807, 100806, 10775, 9793, 0, 0, 74452, 0, 983063, - 42535, 0, 64529, 41408, 42853, 0, 0, 42674, 118915, 0, 0, 983788, 0, - 70838, 0, 0, 0, 64506, 0, 66738, 4747, 100783, 69844, 100785, 5832, 0, 0, - 5141, 42600, 0, 0, 0, 0, 0, 0, 93790, 0, 7657, 0, 71132, 74137, 0, - 128362, 73682, 73681, 859, 0, 0, 0, 6059, 126985, 55235, 0, 0, 0, 0, 0, - 100787, 11488, 72838, 100788, 0, 100790, 10558, 0, 0, 0, 126090, 71069, - 0, 0, 1788, 0, 0, 0, 0, 119571, 917961, 9028, 0, 69234, 73665, 0, 9905, - 128485, 41242, 70086, 0, 74109, 100765, 100764, 100767, 100766, 70830, - 83184, 70082, 3940, 0, 43754, 0, 128188, 8665, 0, 0, 0, 1653, 100775, - 42406, 100777, 100780, 70825, 120523, 0, 8815, 0, 65046, 0, 42445, 0, - 11180, 119318, 119315, 68454, 42485, 0, 0, 8211, 42293, 983602, 0, 0, 0, - 0, 65385, 100771, 42332, 100773, 78431, 78432, 78423, 78430, 78420, - 10022, 65387, 78419, 65384, 0, 0, 0, 65386, 0, 11248, 0, 43198, 64751, 0, - 0, 0, 0, 0, 0, 101102, 7363, 0, 0, 119323, 119324, 100752, 100751, 0, - 119320, 0, 983632, 0, 8237, 0, 0, 0, 0, 0, 0, 9914, 0, 100763, 100762, - 120009, 6351, 119993, 92740, 68766, 0, 120010, 41243, 0, 74108, 11467, - 120165, 119998, 4358, 0, 6353, 0, 0, 0, 93045, 1710, 0, 0, 92237, 0, 49, - 73871, 0, 78671, 0, 78672, 9741, 78443, 78444, 78441, 43443, 78439, - 78440, 69244, 78438, 3470, 0, 0, 0, 0, 0, 78445, 0, 1072, 78457, 78452, - 78454, 74230, 78451, 78447, 78449, 1080, 0, 74100, 0, 1101, 68404, 78458, - 78459, 71082, 0, 1086, 1869, 0, 0, 0, 65458, 0, 0, 41988, 0, 1091, 0, - 7977, 0, 67395, 0, 0, 0, 92758, 0, 0, 0, 0, 0, 71255, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 64582, 0, 0, 70794, 0, 120989, 128495, 74106, 0, 66883, 0, 0, 0, - 0, 0, 0, 0, 92553, 43752, 110592, 0, 0, 120886, 0, 0, 0, 0, 6063, 100857, - 0, 917995, 6053, 74096, 0, 0, 74169, 13100, 0, 917999, 0, 917998, 0, - 70387, 6055, 7800, 4279, 8490, 120114, 120111, 64786, 8602, 120110, - 83389, 92204, 0, 0, 74961, 0, 120117, 120118, 120099, 120100, 65087, - 64402, 3674, 120096, 0, 120094, 120107, 120108, 120105, 10107, 42159, - 42870, 120101, 69632, 0, 0, 43281, 127078, 0, 74098, 0, 0, 126497, 74099, - 129056, 0, 0, 0, 121123, 5847, 125258, 0, 0, 0, 0, 0, 66592, 64469, - 71698, 19966, 0, 42561, 0, 129170, 66854, 8120, 75042, 0, 0, 0, 0, 0, 0, - 126068, 8369, 0, 0, 122912, 3369, 0, 121094, 0, 0, 69238, 10495, 121365, - 0, 557, 9457, 0, 0, 121054, 73880, 127220, 0, 74937, 74094, 0, 0, 0, - 92171, 127219, 128175, 127939, 120424, 0, 127214, 2109, 67893, 127211, - 69656, 127217, 10604, 127215, 0, 0, 0, 0, 126561, 0, 0, 0, 0, 1618, 0, 0, - 83175, 10430, 0, 0, 13063, 917585, 0, 92982, 113666, 0, 78390, 83489, - 12060, 0, 113669, 0, 6329, 0, 0, 0, 74395, 2707, 8309, 0, 127054, 78398, - 0, 2697, 0, 78396, 127057, 2695, 0, 0, 68334, 0, 0, 0, 72325, 2693, - 74091, 0, 0, 2703, 113729, 70283, 41918, 983168, 127542, 8687, 127543, - 12178, 43361, 92540, 64075, 110705, 5248, 110703, 120538, 6427, 0, 0, 0, - 0, 110710, 0, 74990, 74989, 70703, 127031, 0, 9873, 0, 0, 0, 64762, 2053, - 0, 6591, 9340, 0, 1589, 0, 296, 67712, 128315, 12766, 118931, 74370, - 120417, 8922, 128068, 43829, 111202, 74836, 0, 12579, 0, 12575, 6416, - 5656, 0, 13262, 65590, 5299, 0, 0, 5449, 1252, 0, 78404, 0, 74369, 65373, - 5295, 0, 121066, 1223, 1642, 78408, 0, 12158, 5303, 0, 120546, 41413, - 3212, 127025, 3211, 74810, 41425, 127029, 0, 74450, 9728, 0, 10924, - 74778, 6636, 0, 0, 0, 0, 0, 9519, 0, 0, 983928, 129439, 68780, 0, 0, 0, - 126260, 0, 12104, 77942, 77951, 9004, 0, 74249, 10230, 0, 0, 0, 77947, 0, - 69679, 121475, 9890, 125049, 12971, 0, 92556, 0, 67903, 70051, 983905, 0, - 0, 9635, 12600, 0, 0, 0, 0, 6469, 0, 0, 65304, 4679, 0, 64300, 64867, - 6531, 0, 101099, 101098, 0, 101100, 42916, 0, 0, 0, 0, 0, 0, 4445, 72296, - 0, 11533, 0, 3416, 129148, 0, 0, 0, 78566, 0, 0, 101091, 0, 101093, 5447, - 72140, 101094, 101097, 101096, 0, 0, 0, 64448, 0, 43920, 70677, 0, 6232, - 101101, 101104, 101103, 43608, 101105, 0, 6538, 4335, 0, 3941, 74986, - 11061, 0, 74988, 74987, 0, 12155, 128278, 0, 0, 0, 0, 74578, 0, 65832, 0, + 129980, 0, 0, 101281, 0, 130038, 0, 101283, 0, 12588, 8821, 6153, 194705, + 78900, 194707, 194710, 194709, 194712, 194711, 118854, 194713, 651, 0, 0, + 0, 0, 0, 78468, 78469, 69433, 78467, 69614, 74905, 194695, 78461, 194697, + 194696, 0, 4716, 43277, 0, 78474, 78475, 128592, 120928, 194700, 55264, + 194702, 12732, 0, 12707, 0, 0, 0, 0, 121417, 8479, 4151, 0, 0, 0, 0, 0, + 0, 0, 0, 113799, 0, 74050, 0, 0, 0, 0, 0, 129467, 12278, 0, 129507, 0, + 2700, 12576, 7842, 0, 0, 0, 2699, 0, 0, 2985, 0, 126475, 0, 129873, + 119314, 0, 119312, 9827, 101292, 119311, 101291, 119309, 119306, 11481, + 0, 119305, 0, 35, 78481, 78482, 66694, 78480, 78477, 78478, 0, 0, 64257, + 0, 0, 0, 78485, 78486, 78483, 4272, 0, 0, 40965, 0, 12704, 78487, 983568, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5244, 4189, 94108, 0, 127948, 4188, 1879, 0, + 0, 0, 43743, 71974, 8873, 2279, 0, 0, 0, 12574, 12735, 92749, 92753, + 983902, 0, 0, 75001, 0, 0, 0, 12578, 12720, 128628, 101088, 0, 12346, + 128596, 101089, 0, 0, 7251, 0, 0, 118850, 73025, 0, 0, 0, 0, 0, 12564, + 66457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101131, 0, 41564, 10976, 0, 121223, + 0, 0, 10054, 9197, 120618, 0, 9012, 65737, 74420, 0, 13215, 12730, 0, 0, + 0, 0, 816, 0, 101123, 0, 83191, 0, 0, 92752, 101120, 4715, 94107, 94106, + 71075, 0, 0, 0, 67729, 0, 307, 0, 9585, 0, 0, 0, 101255, 0, 125267, 0, + 70727, 65567, 101238, 75006, 101231, 983890, 0, 12236, 41419, 101259, + 194621, 101248, 75003, 194622, 73675, 120957, 41421, 75005, 4462, 0, + 126599, 983892, 821, 0, 2498, 5800, 100834, 100833, 1760, 94019, 4469, + 64377, 100840, 100839, 0, 757, 1185, 0, 100841, 0, 10628, 100842, 68849, + 100844, 43971, 100846, 100849, 64763, 0, 7713, 0, 0, 0, 4380, 194608, + 128073, 194610, 194609, 194612, 862, 65626, 194613, 65627, 65629, 5137, + 194617, 0, 0, 0, 65069, 7566, 64688, 67143, 194592, 100823, 100822, + 100825, 4748, 92228, 100826, 100829, 42260, 129494, 64107, 0, 0, 0, 0, + 128189, 0, 194604, 13137, 8775, 127945, 123633, 194607, 0, 8410, 4454, + 194585, 0, 92542, 4449, 92330, 127064, 75022, 92761, 70664, 194589, 339, + 194591, 194590, 0, 70662, 0, 100830, 41543, 0, 0, 0, 41542, 127066, 8916, + 6705, 0, 129296, 0, 0, 0, 0, 0, 41548, 6729, 119329, 0, 7348, 0, 0, 7537, + 0, 11819, 0, 0, 123624, 71269, 0, 7344, 100808, 129073, 9780, 0, 11117, + 74993, 0, 194578, 10483, 194580, 194579, 194582, 194581, 68781, 125114, + 100820, 100819, 0, 4211, 1259, 7517, 0, 0, 194561, 70827, 194563, 194562, + 641, 5219, 94034, 194566, 11064, 194568, 0, 129820, 0, 0, 0, 0, 100812, + 100811, 100814, 100813, 100816, 100815, 100818, 100817, 100798, 100797, + 41410, 100799, 64262, 0, 41407, 75000, 0, 0, 93812, 0, 0, 72803, 74999, + 78897, 0, 0, 67675, 0, 0, 0, 0, 43647, 0, 0, 100792, 100791, 100794, + 100793, 100796, 100795, 0, 74630, 11933, 0, 0, 41903, 67892, 11001, + 100801, 42255, 100803, 100802, 100805, 41905, 100807, 100806, 10775, + 9793, 0, 0, 74452, 0, 983063, 42535, 0, 64529, 41408, 42853, 0, 0, 42674, + 118915, 0, 0, 983788, 0, 70838, 0, 0, 0, 64506, 0, 66738, 4747, 100783, + 69844, 100785, 5832, 0, 0, 5141, 42600, 0, 0, 0, 0, 0, 0, 93790, 0, 7657, + 0, 71132, 74137, 0, 128362, 73682, 73681, 859, 0, 0, 0, 6059, 126985, + 55235, 0, 0, 0, 0, 0, 100787, 11488, 72838, 100788, 0, 100790, 10558, 0, + 0, 0, 126090, 71069, 0, 0, 1788, 0, 0, 0, 0, 119571, 917961, 9028, 0, + 69234, 73665, 0, 9905, 128485, 41242, 70086, 0, 74109, 100765, 100764, + 100767, 100766, 70830, 83184, 70082, 3940, 0, 43754, 0, 128188, 8665, 0, + 0, 0, 1653, 100775, 42406, 100777, 100780, 70825, 120523, 0, 8815, 0, + 65046, 0, 42445, 0, 11180, 119318, 119315, 68454, 42485, 0, 0, 8211, + 42293, 983602, 0, 0, 0, 0, 65385, 100771, 42332, 100773, 78431, 78432, + 78423, 78430, 78420, 10022, 65387, 78419, 65384, 0, 0, 0, 65386, 0, + 11248, 0, 43198, 64751, 0, 0, 0, 0, 0, 0, 101102, 7363, 0, 0, 119323, + 119324, 100752, 100751, 0, 119320, 0, 983632, 0, 8237, 0, 0, 0, 0, 0, 0, + 9914, 0, 100763, 100762, 120009, 6351, 119993, 92740, 68766, 0, 120010, + 41243, 0, 74108, 11467, 120165, 119998, 4358, 0, 6353, 0, 0, 0, 93045, + 1710, 0, 0, 92237, 0, 49, 73871, 120005, 78671, 0, 78672, 9741, 78443, + 78444, 78441, 43443, 78439, 78440, 69244, 78438, 3470, 0, 0, 0, 0, 0, + 78445, 0, 1072, 78457, 78452, 78454, 74230, 78451, 78447, 78449, 1080, 0, + 74100, 0, 1101, 68404, 78458, 78459, 71082, 0, 1086, 1869, 0, 0, 0, + 65458, 0, 0, 41988, 0, 1091, 0, 7977, 0, 67395, 0, 0, 0, 92758, 0, 0, 0, + 0, 0, 71255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64582, 0, 0, 70794, 0, 120989, + 128495, 74106, 0, 66883, 0, 0, 0, 0, 0, 0, 0, 92553, 43752, 110592, 0, 0, + 120886, 0, 0, 0, 0, 6063, 100857, 101221, 917995, 6053, 74096, 0, 0, + 74169, 13100, 0, 917999, 0, 917998, 0, 70387, 6055, 7800, 4279, 8490, + 120114, 120111, 64786, 8602, 120110, 83389, 92204, 0, 0, 74961, 0, + 120117, 120118, 120099, 120100, 65087, 64402, 3674, 120096, 0, 120094, + 120107, 120108, 120105, 10107, 42159, 42870, 120101, 69632, 0, 0, 43281, + 127078, 0, 74098, 0, 0, 126497, 74099, 129056, 0, 0, 0, 121123, 5847, + 125258, 0, 0, 0, 0, 0, 66592, 64469, 71698, 19966, 0, 42561, 0, 129170, + 66854, 8120, 75042, 0, 0, 0, 0, 0, 0, 126068, 8369, 0, 0, 122912, 3369, + 0, 121094, 0, 0, 69238, 10495, 121365, 0, 557, 9457, 0, 0, 121054, 73880, + 127220, 0, 74937, 74094, 0, 0, 0, 92171, 127219, 128175, 127939, 120424, + 0, 127214, 2109, 67893, 127211, 69656, 127217, 10604, 127215, 0, 0, 0, 0, + 126561, 0, 0, 0, 0, 1618, 0, 0, 83175, 10430, 0, 0, 13063, 917585, 0, + 92982, 113666, 0, 78390, 83489, 12060, 0, 113669, 0, 6329, 0, 0, 0, + 74395, 2707, 8309, 0, 127054, 78398, 0, 2697, 0, 78396, 127057, 2695, 0, + 0, 68334, 0, 0, 0, 72325, 2693, 74091, 0, 0, 2703, 113729, 70283, 41918, + 983168, 127542, 8687, 127543, 12178, 43361, 92540, 64075, 110705, 5248, + 110703, 120538, 6427, 0, 0, 0, 0, 110710, 0, 74990, 74989, 70703, 127031, + 0, 9873, 0, 0, 0, 64762, 2053, 0, 6591, 9340, 0, 1589, 0, 296, 67712, + 128315, 12766, 118931, 74370, 120417, 8922, 128068, 43829, 111202, 74836, + 0, 12579, 0, 12575, 6416, 5656, 0, 13262, 65590, 5299, 0, 0, 5449, 1252, + 0, 78404, 0, 74369, 65373, 5295, 0, 121066, 1223, 1642, 78408, 0, 12158, + 5303, 0, 120546, 41413, 3212, 127025, 3211, 74810, 41425, 127029, 0, + 74450, 9728, 0, 10924, 74778, 6636, 0, 129884, 0, 0, 129882, 9519, 0, 0, + 983928, 101110, 68780, 0, 0, 0, 119182, 0, 12104, 77942, 77951, 9004, 0, + 74249, 10230, 0, 0, 0, 77947, 0, 69679, 121475, 9890, 125049, 12971, 0, + 92556, 0, 67903, 70051, 983905, 0, 0, 9635, 12600, 0, 0, 0, 118900, 6469, + 0, 101113, 65304, 4679, 101114, 64300, 64867, 6531, 101118, 101099, + 101098, 0, 101100, 42916, 0, 0, 0, 0, 0, 0, 4445, 72296, 0, 11533, 0, + 3416, 129148, 0, 0, 0, 78566, 0, 0, 101091, 0, 101093, 5447, 72140, + 70752, 101097, 101096, 0, 0, 0, 64448, 0, 43920, 70677, 0, 6232, 101101, + 101104, 101103, 43608, 101105, 101108, 6538, 4335, 0, 3941, 74986, 11061, + 0, 74988, 74987, 0, 12155, 128278, 0, 0, 0, 0, 74578, 0, 65832, 0, 129459, 70789, 0, 125050, 0, 0, 350, 10951, 101081, 509, 101083, 101086, 101085, 0, 0, 0, 917540, 0, 100905, 110970, 12162, 64741, 0, 9354, 0, 70802, 100901, 2496, 11516, 944, 128238, 0, 0, 1438, 0, 0, 120185, 70785, 1220, 917952, 93844, 0, 0, 5008, 42630, 70787, 101087, 101090, 68206, 564, 0, 312, 0, 0, 0, 70797, 8877, 269, 0, 128065, 9617, 0, 0, 100910, 0, - 0, 10862, 0, 0, 41416, 0, 4173, 0, 0, 0, 1906, 0, 41418, 74073, 101068, - 101067, 41415, 69622, 9582, 0, 64287, 0, 0, 11428, 1730, 0, 0, 19918, - 10469, 101076, 101079, 68088, 0, 101080, 72342, 0, 0, 0, 6129, 0, 0, 0, - 0, 7874, 0, 0, 11206, 13136, 0, 129305, 0, 64374, 74925, 0, 73892, 0, - 101073, 101072, 101075, 74960, 9228, 101054, 101057, 101056, 5240, 9811, - 0, 101060, 0, 0, 0, 74079, 65873, 0, 0, 0, 9501, 0, 68081, 72808, 65465, - 64654, 7467, 0, 0, 83460, 10040, 0, 3096, 0, 101053, 101052, 68820, - 83461, 0, 0, 0, 0, 0, 0, 0, 0, 68801, 0, 101062, 101061, 101064, 101063, - 0, 8637, 70741, 0, 77983, 77969, 11471, 43554, 0, 77968, 0, 0, 0, 2426, - 12042, 0, 0, 0, 3961, 12115, 129633, 0, 77972, 64561, 0, 4981, 74644, - 129558, 0, 0, 42686, 77976, 128776, 64686, 0, 77958, 7589, 0, 0, 3237, 0, - 68215, 0, 8541, 127157, 71067, 0, 0, 0, 0, 0, 0, 43555, 0, 0, 10060, - 111261, 100917, 0, 0, 0, 64877, 0, 0, 8614, 65220, 41493, 0, 0, 0, 43780, - 0, 0, 70689, 0, 0, 0, 0, 0, 0, 4012, 10395, 0, 0, 111253, 126511, 111254, - 125051, 695, 739, 696, 7611, 0, 42755, 68421, 9227, 7506, 7510, 69937, - 691, 738, 7511, 7512, 7515, 7501, 688, 41847, 690, 2548, 737, 974, 43386, - 0, 0, 0, 0, 0, 0, 65860, 0, 7051, 69777, 4682, 0, 983096, 6406, 4685, 0, - 0, 10347, 4680, 6341, 0, 0, 92607, 74325, 0, 0, 0, 0, 0, 0, 0, 0, 43505, - 92468, 11718, 42373, 11714, 0, 0, 129567, 11717, 0, 10594, 0, 11712, 0, - 0, 10967, 0, 0, 0, 66632, 0, 0, 0, 0, 1735, 0, 11134, 2363, 983135, 0, 0, - 70695, 128032, 0, 7491, 7495, 7580, 7496, 7497, 7584, 121478, 127853, 0, - 0, 128375, 0, 8498, 0, 8949, 3065, 0, 0, 0, 0, 0, 0, 11713, 0, 64939, 0, - 6418, 4543, 0, 0, 0, 74800, 0, 0, 0, 0, 0, 0, 0, 12282, 0, 0, 0, 64556, - 0, 9238, 0, 68063, 0, 0, 0, 65438, 0, 128525, 0, 119268, 0, 0, 12900, 0, - 10950, 0, 0, 0, 41400, 126636, 119664, 0, 42232, 0, 1744, 0, 41402, 0, 0, - 0, 41399, 0, 125028, 0, 0, 12690, 0, 0, 43672, 0, 0, 0, 100870, 11315, 0, - 278, 121204, 41405, 129345, 0, 10077, 129650, 70667, 0, 0, 0, 68210, 0, - 0, 11189, 70657, 0, 0, 0, 7934, 0, 93829, 120940, 0, 0, 0, 0, 0, 0, 6413, - 6550, 0, 1940, 2809, 43637, 70045, 0, 0, 10678, 0, 0, 0, 0, 78804, 6403, - 6556, 78803, 0, 0, 0, 0, 0, 0, 0, 0, 3742, 74408, 3959, 0, 0, 917969, 0, - 0, 128024, 0, 0, 127956, 0, 0, 0, 0, 4676, 983049, 9210, 0, 78143, - 983903, 0, 78168, 983100, 11540, 43546, 6692, 0, 0, 0, 0, 9083, 0, 0, - 78144, 128515, 0, 9677, 0, 70867, 74175, 0, 74070, 0, 0, 365, 0, 43027, - 0, 0, 128236, 0, 119574, 70284, 13151, 0, 0, 127935, 127950, 544, 13249, + 0, 10862, 0, 0, 41416, 0, 4173, 0, 0, 0, 1906, 983835, 41418, 74073, + 101068, 101067, 41415, 69622, 9582, 0, 64287, 0, 0, 11428, 1730, 0, 0, + 19918, 10469, 101076, 101079, 68088, 0, 101080, 72342, 0, 129692, 0, + 6129, 0, 0, 0, 0, 7874, 0, 0, 11206, 13136, 0, 129305, 0, 64374, 74925, + 0, 73892, 0, 101073, 101072, 101075, 74960, 9228, 101054, 101057, 101056, + 5240, 9811, 0, 101060, 129718, 0, 0, 74079, 65873, 0, 0, 0, 9501, 0, + 68081, 72808, 65465, 64654, 7467, 0, 0, 83460, 10040, 0, 3096, 0, 101053, + 101052, 68820, 83461, 0, 0, 0, 0, 0, 0, 83377, 0, 68801, 0, 101062, + 101061, 101064, 101063, 0, 8637, 70741, 0, 77983, 77969, 11471, 43554, 0, + 77968, 0, 0, 0, 2426, 12042, 0, 0, 0, 3961, 12115, 129633, 0, 77972, + 64561, 0, 4981, 74644, 129558, 0, 0, 42686, 77976, 128776, 64686, 0, + 77958, 7589, 0, 0, 3237, 0, 68215, 0, 8541, 127157, 71067, 120174, 0, 0, + 0, 0, 0, 43555, 0, 0, 10060, 111261, 100917, 0, 0, 0, 64877, 0, 0, 8614, + 65220, 41493, 0, 0, 0, 43780, 0, 0, 70689, 0, 0, 0, 0, 0, 0, 4012, 10395, + 0, 0, 111253, 126511, 111254, 125051, 695, 739, 696, 7611, 0, 42755, + 68421, 9227, 7506, 7510, 69937, 691, 738, 7511, 7512, 7515, 7501, 688, + 41847, 690, 2548, 737, 974, 43386, 0, 0, 0, 0, 0, 0, 65860, 0, 7051, + 69777, 4682, 0, 983096, 6406, 4685, 0, 0, 10347, 4680, 6341, 0, 0, 92607, + 74325, 0, 0, 0, 0, 0, 0, 0, 0, 43505, 92468, 11718, 42373, 11714, 0, 0, + 129567, 11717, 0, 10594, 0, 11712, 0, 0, 10967, 0, 0, 0, 66632, 0, 0, 0, + 0, 1735, 0, 11134, 2363, 983135, 0, 0, 70695, 128032, 0, 7491, 7495, + 7580, 7496, 7497, 7584, 121478, 127853, 0, 0, 70025, 0, 8498, 0, 8949, + 3065, 0, 0, 0, 0, 0, 0, 11713, 0, 64939, 0, 6418, 4543, 0, 0, 0, 74800, + 0, 0, 0, 0, 0, 0, 0, 12282, 0, 0, 0, 64556, 0, 9238, 0, 68063, 0, 0, 0, + 65438, 0, 128525, 0, 119268, 0, 0, 12900, 0, 10950, 0, 0, 0, 41400, + 126636, 119664, 0, 42232, 0, 1744, 0, 41402, 0, 0, 0, 41399, 0, 125028, + 0, 0, 12690, 0, 0, 43672, 0, 0, 0, 100870, 11315, 0, 278, 121204, 41405, + 129345, 0, 10077, 129650, 70667, 0, 0, 0, 68210, 0, 0, 11189, 70657, 0, + 0, 0, 7934, 0, 93829, 120940, 0, 0, 0, 0, 0, 0, 6413, 6550, 0, 1940, + 2809, 43637, 70045, 0, 0, 10678, 0, 0, 0, 129701, 78804, 6403, 6556, + 78803, 0, 0, 0, 0, 0, 0, 0, 0, 3742, 74408, 3959, 0, 0, 917969, 0, 0, + 128024, 0, 0, 127956, 0, 0, 0, 0, 4676, 983049, 9210, 0, 78143, 983903, + 0, 78168, 983100, 11540, 43546, 6692, 0, 0, 0, 0, 9083, 0, 0, 78144, + 128515, 0, 9677, 0, 70867, 74175, 0, 74070, 0, 0, 365, 0, 43027, 0, 0, + 128236, 0, 119574, 70284, 13151, 0, 0, 127935, 127950, 544, 13249, 119018, 0, 120846, 0, 0, 73671, 65339, 73000, 2211, 0, 0, 0, 0, 0, 0, 0, 0, 128037, 0, 0, 0, 0, 0, 0, 0, 127188, 0, 69708, 9638, 0, 100878, 0, 0, 0, 74545, 128820, 128819, 75062, 128963, 0, 0, 0, 11264, 43994, 0, 0, 0, 1311, 0, 0, 0, 0, 13068, 0, 0, 78164, 78155, 0, 949, 0, 0, 0, 78176, - 69709, 78177, 63828, 0, 0, 0, 70282, 0, 0, 0, 64822, 0, 6530, 0, 0, + 69709, 78177, 63828, 0, 0, 0, 70282, 0, 0, 0, 64822, 0, 6530, 983270, 0, 70493, 0, 129325, 0, 0, 4431, 118839, 127490, 983741, 73667, 127986, 0, 10336, 10400, 0, 0, 92959, 0, 0, 0, 42270, 128880, 6428, 0, 0, 0, 0, 43455, 0, 43526, 100888, 12835, 129501, 9493, 0, 0, 11793, 0, 127897, 74394, 0, 10653, 0, 0, 0, 0, 6560, 7016, 74274, 983627, 43556, 3929, - 123615, 6614, 2768, 0, 65609, 0, 11811, 0, 0, 0, 127513, 0, 6554, 0, + 123615, 6614, 2768, 0, 65609, 0, 11811, 129696, 0, 0, 127513, 0, 6554, 0, 6305, 66283, 4675, 118826, 78552, 0, 0, 74361, 0, 0, 68108, 0, 0, 92232, 0, 93022, 7392, 8230, 9365, 983723, 0, 0, 0, 0, 42925, 0, 0, 0, 0, 229, 43834, 119884, 0, 43552, 119881, 119880, 119883, 119882, 119877, 119876, @@ -26361,123 +27212,123 @@ static const unsigned int code_hash[] = { 0, 0, 128663, 0, 12239, 0, 0, 10432, 12097, 0, 194815, 1233, 0, 0, 127200, 0, 66395, 0, 0, 129504, 0, 0, 0, 0, 2388, 92555, 119868, 119871, 119870, 119865, 895, 92668, 119866, 64889, 7143, 119863, 119862, 0, 0, - 69983, 0, 74376, 3053, 0, 0, 2047, 0, 0, 0, 121279, 67985, 194801, 92600, - 194803, 194802, 194805, 194804, 194807, 194806, 129134, 194808, 0, 0, 0, - 10473, 129331, 0, 194810, 0, 194812, 194811, 194814, 194813, 123195, - 43528, 69673, 194791, 0, 194793, 1912, 120779, 10306, 10370, 0, 0, 8867, - 10250, 10258, 10274, 1635, 120152, 0, 0, 0, 129379, 0, 0, 9919, 120148, - 559, 128157, 41825, 127975, 92989, 0, 74016, 194781, 6542, 41957, 7318, - 0, 0, 41956, 65749, 65750, 65751, 121323, 64487, 0, 0, 10223, 42062, - 100640, 0, 125044, 3668, 65754, 43560, 12226, 0, 93973, 194784, 41959, - 194786, 194785, 194788, 43618, 65747, 10937, 2962, 0, 2953, 10062, 65745, - 71457, 8921, 66013, 129370, 0, 194769, 194768, 43409, 194770, 2949, - 194772, 194775, 194774, 2958, 194776, 74868, 2300, 2951, 120061, 0, - 120043, 194778, 0, 120051, 194779, 120056, 120065, 70798, 120048, 0, - 120062, 120055, 78178, 100668, 0, 0, 92269, 0, 0, 70796, 127818, 0, 0, - 64890, 0, 43630, 11336, 799, 0, 10276, 10308, 10372, 917541, 0, 0, 10252, - 10260, 68220, 55284, 0, 0, 10384, 0, 0, 0, 64523, 0, 0, 65736, 0, 0, 0, - 0, 0, 0, 0, 0, 43549, 65738, 42150, 65739, 0, 78195, 10288, 10320, 0, - 10596, 0, 67673, 65045, 121283, 78198, 2049, 10098, 0, 122904, 127943, - 10264, 10280, 10312, 10376, 7013, 0, 0, 0, 0, 66375, 0, 4862, 0, 6537, 0, - 128335, 3914, 92178, 93976, 9065, 64816, 0, 72218, 73026, 0, 0, 72139, - 4694, 11420, 4690, 0, 0, 983209, 4693, 0, 0, 0, 4688, 0, 0, 0, 0, 8238, - 3110, 0, 983920, 0, 6528, 0, 0, 0, 218, 0, 1520, 129577, 70039, 0, - 983594, 0, 0, 78167, 10088, 6548, 100786, 0, 0, 0, 8888, 0, 124954, 0, 0, - 126593, 68876, 0, 0, 0, 0, 0, 0, 0, 4689, 43541, 77954, 120157, 0, - 120156, 78810, 120163, 0, 0, 0, 0, 78121, 0, 0, 11450, 0, 71900, 92613, - 0, 121317, 74622, 128720, 9244, 0, 0, 127763, 0, 0, 0, 0, 0, 0, 71084, 0, - 0, 0, 0, 10513, 0, 0, 0, 52, 119178, 0, 0, 93961, 0, 0, 4812, 0, 0, 0, 0, - 0, 0, 128425, 0, 120453, 0, 77959, 10170, 120450, 6544, 0, 0, 69782, - 121517, 0, 0, 65258, 10369, 0, 1585, 74014, 10249, 422, 1500, 2036, 986, - 0, 64394, 0, 5599, 917981, 2494, 0, 0, 74021, 983877, 78203, 127808, 0, - 72871, 65102, 8961, 74305, 10243, 10245, 128170, 0, 0, 0, 0, 0, 2508, - 129591, 120440, 0, 120439, 0, 0, 0, 0, 0, 0, 64533, 983186, 0, 0, 74008, - 0, 0, 43375, 0, 2504, 0, 121313, 0, 983922, 6943, 0, 5859, 100677, 0, 0, - 72873, 983926, 0, 0, 983904, 92390, 2753, 1936, 2153, 67701, 2751, 12662, - 2763, 8953, 0, 10731, 0, 7052, 0, 0, 0, 0, 119899, 0, 66675, 0, 119897, - 0, 71053, 0, 119903, 0, 67829, 7899, 119901, 71119, 43798, 7072, 119902, - 122898, 11260, 0, 71059, 0, 0, 212, 0, 12350, 0, 0, 0, 0, 0, 128402, - 2759, 0, 0, 93064, 0, 0, 0, 1291, 0, 0, 121318, 119911, 0, 119910, 0, - 12062, 0, 121216, 0, 0, 121044, 120611, 8246, 0, 0, 0, 0, 0, 0, 73962, 0, - 0, 43524, 0, 64426, 0, 0, 0, 0, 65664, 6693, 0, 0, 8674, 0, 128812, 0, - 11846, 70690, 121461, 69395, 4811, 0, 5986, 0, 3046, 74480, 5985, 0, 0, - 0, 0, 12187, 83148, 71041, 5984, 0, 93817, 4393, 126264, 120206, 917599, - 0, 0, 0, 93806, 93805, 0, 3491, 0, 67146, 0, 93819, 0, 72428, 0, 0, 0, - 124968, 41284, 126228, 0, 0, 41287, 0, 100689, 0, 0, 92189, 0, 0, 219, - 120874, 0, 0, 0, 68485, 119672, 43241, 0, 7147, 0, 0, 0, 0, 0, 0, 64610, - 11804, 0, 7149, 64808, 0, 0, 0, 92301, 73690, 0, 5253, 0, 0, 0, 0, - 129045, 983596, 11098, 68433, 0, 120484, 111009, 0, 0, 0, 0, 0, 70801, - 100779, 0, 128198, 9604, 0, 0, 0, 0, 118941, 64392, 0, 0, 0, 0, 41974, - 126262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 983239, 5308, 0, 290, 0, 125278, - 128382, 2792, 0, 0, 120521, 0, 126237, 0, 126099, 0, 0, 0, 0, 128503, 0, - 0, 72816, 0, 0, 0, 92671, 0, 0, 42646, 7606, 2591, 73896, 0, 43513, - 64482, 0, 0, 65270, 0, 0, 983682, 9112, 0, 113763, 9490, 0, 0, 0, 0, 0, - 9071, 0, 0, 0, 0, 74607, 0, 2535, 65504, 43602, 0, 0, 71256, 0, 0, - 123147, 11845, 11006, 92315, 7807, 8073, 0, 10629, 0, 74088, 0, 10823, 0, - 113762, 8762, 0, 69689, 0, 43969, 65047, 10737, 3463, 72858, 129585, - 66645, 0, 4815, 0, 0, 12345, 983742, 0, 5195, 0, 0, 66639, 0, 0, 127316, - 0, 92759, 92385, 1262, 0, 6561, 19939, 0, 0, 100772, 123160, 0, 0, - 100774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5702, 3655, 0, 8430, 0, - 68807, 0, 0, 121137, 0, 0, 5254, 0, 0, 0, 0, 119107, 5129, 0, 70816, 0, - 92280, 5614, 0, 0, 11720, 0, 11721, 70804, 4798, 0, 120541, 66038, 4793, - 67851, 7352, 0, 0, 0, 0, 917600, 0, 300, 0, 0, 128575, 92660, 0, 0, 2562, - 70156, 120856, 0, 0, 92738, 0, 0, 127820, 71093, 0, 127969, 128221, 0, - 3424, 93843, 0, 0, 7074, 70873, 917926, 0, 0, 10832, 0, 0, 69852, 72430, - 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 1215, 0, 5744, 0, 66440, 0, 0, 0, - 42881, 0, 8980, 118988, 67861, 8844, 7433, 0, 0, 4278, 0, 0, 0, 70821, - 9312, 4348, 0, 128401, 65946, 0, 7087, 5255, 0, 661, 0, 0, 0, 0, 0, 0, 0, - 129073, 73694, 0, 123154, 0, 73688, 0, 127179, 3621, 83325, 66666, 72968, - 0, 6562, 12928, 0, 73991, 0, 0, 11383, 0, 0, 65588, 120739, 0, 0, 0, 0, - 0, 0, 0, 0, 11436, 2070, 64, 110824, 0, 10291, 10323, 10387, 0, 0, 0, - 42008, 9708, 42710, 0, 42011, 0, 92164, 0, 0, 1702, 1240, 128383, 6286, - 9689, 111080, 0, 0, 0, 1765, 0, 0, 92373, 0, 0, 0, 8401, 72991, 42014, 0, - 67237, 0, 0, 0, 0, 0, 0, 0, 70819, 0, 0, 0, 0, 12667, 0, 0, 10147, 0, - 127568, 126483, 72812, 0, 0, 0, 0, 123139, 128968, 0, 64947, 0, 0, 0, 0, - 10435, 11462, 0, 7084, 0, 0, 0, 0, 0, 126084, 0, 66662, 0, 0, 0, 0, - 125134, 0, 0, 77990, 263, 983728, 41288, 0, 0, 78387, 74340, 70313, - 129140, 0, 0, 0, 42022, 71265, 0, 0, 0, 0, 0, 0, 42020, 123146, 0, 6992, - 42019, 0, 41290, 0, 12295, 126233, 71304, 0, 0, 71300, 120631, 5954, - 64931, 69385, 100699, 198, 68453, 78129, 0, 121351, 0, 70818, 13165, - 7107, 0, 42804, 678, 72850, 118960, 0, 72985, 42806, 42808, 0, 0, 2097, - 0, 120560, 70823, 0, 0, 3892, 68632, 0, 6712, 917959, 0, 0, 0, 0, 123158, - 69954, 0, 497, 12100, 5953, 92667, 7796, 0, 43254, 0, 0, 11072, 5952, - 1281, 43747, 0, 69380, 10677, 0, 0, 0, 1859, 0, 72856, 3425, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 65199, 1738, 0, 122911, 0, 0, 0, 11101, 0, 0, 0, 0, - 127002, 69651, 4436, 194683, 73984, 0, 70305, 64872, 128296, 0, 0, 0, - 121377, 0, 0, 0, 43686, 983108, 0, 119109, 0, 70826, 319, 0, 43479, - 73001, 0, 0, 12849, 0, 7640, 71083, 9673, 0, 0, 0, 92670, 0, 92665, - 113717, 41422, 0, 100708, 74941, 3772, 0, 120660, 5011, 0, 0, 126587, - 111315, 0, 0, 6677, 111312, 0, 41427, 64419, 129445, 92262, 0, 70799, 0, - 0, 0, 6106, 0, 41271, 6760, 983739, 4534, 41270, 128876, 0, 0, 119561, 0, - 0, 3671, 8976, 123177, 0, 41275, 0, 128084, 55261, 0, 42013, 0, 568, 0, - 41273, 0, 0, 6728, 0, 9715, 0, 0, 121058, 74820, 0, 92268, 0, 194564, - 11191, 43688, 128023, 0, 0, 0, 126266, 0, 0, 0, 11958, 11165, 0, 125087, - 0, 0, 66336, 127944, 0, 0, 0, 0, 42858, 11789, 72878, 5557, 0, 69444, - 7300, 0, 9467, 5558, 64486, 43844, 0, 0, 6706, 10146, 0, 127185, 64566, - 0, 0, 0, 0, 0, 0, 0, 4546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64528, 123136, - 6307, 128966, 0, 7544, 0, 43469, 111317, 0, 10152, 0, 65091, 0, 0, 0, 0, - 66652, 0, 0, 0, 0, 64823, 5559, 0, 70711, 6702, 5556, 0, 0, 0, 0, 0, - 11166, 0, 0, 5506, 0, 1911, 73021, 0, 12598, 8845, 66698, 0, 73012, - 123145, 0, 2098, 0, 0, 0, 66622, 194678, 0, 0, 0, 9898, 0, 0, 7552, 0, 0, - 0, 7223, 65723, 0, 0, 0, 7024, 65728, 127155, 1210, 0, 65175, 10184, - 65726, 43654, 0, 0, 0, 38, 65729, 66669, 0, 0, 0, 0, 0, 0, 0, 0, 74233, - 73018, 119843, 42860, 111301, 92576, 65721, 65722, 0, 0, 0, 0, 68843, 0, - 68850, 0, 92388, 92267, 128536, 65577, 92213, 0, 127518, 11650, 5013, - 92663, 68810, 92568, 118914, 6613, 74371, 0, 0, 0, 0, 64714, 71479, 0, - 983778, 12120, 0, 0, 43124, 0, 0, 78037, 0, 0, 126219, 0, 0, 1837, + 69983, 0, 74376, 3053, 129829, 0, 2047, 0, 0, 0, 121279, 67985, 194801, + 92600, 194803, 194802, 194805, 194804, 194807, 194806, 129134, 194808, 0, + 0, 0, 10473, 129331, 0, 194810, 129806, 194812, 129813, 194814, 194813, + 123195, 43528, 69673, 194791, 0, 194793, 1912, 120779, 10306, 10370, 0, + 0, 8867, 10250, 10258, 10274, 1635, 120152, 0, 0, 0, 129379, 0, 0, 9919, + 120148, 559, 128157, 41825, 127975, 92989, 0, 74016, 194781, 6542, 41957, + 7318, 0, 0, 41956, 65749, 65750, 65751, 121323, 64487, 0, 0, 10223, + 42062, 100640, 101195, 125044, 3668, 65754, 43560, 12226, 0, 93973, + 194784, 41959, 194786, 194785, 194788, 43618, 65747, 10937, 2962, 0, + 2953, 10062, 65745, 71457, 8921, 66013, 129370, 0, 194769, 194768, 43409, + 194770, 2949, 194772, 194775, 194774, 2958, 194776, 74868, 2300, 2951, + 120061, 0, 120043, 194778, 0, 120051, 194779, 120056, 120065, 70798, + 120048, 0, 120062, 120055, 71989, 100668, 0, 0, 71985, 0, 71992, 70796, + 127818, 0, 0, 64890, 0, 43630, 11336, 799, 0, 10276, 10308, 10372, + 917541, 0, 0, 10252, 10260, 68220, 55284, 0, 0, 10384, 0, 0, 0, 64523, + 129744, 0, 65736, 0, 0, 0, 0, 0, 0, 0, 0, 43549, 65738, 42150, 65739, 0, + 78195, 10288, 10320, 0, 10596, 0, 67673, 65045, 121283, 78198, 2049, + 10098, 0, 122904, 127943, 10264, 10280, 10312, 10376, 7013, 0, 0, 0, 0, + 66375, 0, 4862, 0, 6537, 0, 128335, 3914, 92178, 93976, 9065, 64816, 0, + 72218, 73026, 0, 0, 72139, 4694, 11420, 4690, 0, 0, 983209, 4693, 0, 0, + 0, 4688, 0, 0, 0, 0, 8238, 3110, 0, 983920, 0, 6528, 0, 0, 0, 218, 0, + 1520, 129577, 70039, 0, 983594, 0, 0, 78167, 10088, 6548, 100786, 0, 0, + 0, 8888, 0, 124954, 0, 0, 126593, 68876, 0, 0, 0, 0, 0, 0, 0, 4689, + 43541, 77954, 120157, 0, 120156, 78810, 120163, 0, 0, 0, 0, 78121, 0, 0, + 11450, 0, 71900, 92613, 0, 121317, 74622, 128720, 9244, 0, 0, 127763, 0, + 0, 0, 0, 0, 0, 71084, 0, 0, 0, 0, 10513, 0, 0, 0, 52, 119178, 0, 0, + 93961, 0, 0, 4812, 0, 0, 0, 0, 0, 0, 128425, 0, 120453, 0, 77959, 10170, + 120450, 6544, 0, 0, 69782, 121517, 0, 0, 65258, 10369, 0, 1585, 74014, + 10249, 422, 1500, 2036, 986, 0, 64394, 0, 5599, 917981, 2494, 0, 0, + 74021, 983877, 78203, 127808, 0, 72871, 65102, 8961, 74305, 10243, 10245, + 128170, 0, 0, 0, 0, 0, 2508, 129591, 120440, 0, 120439, 0, 0, 0, 0, 0, 0, + 64533, 983186, 0, 0, 74008, 0, 0, 43375, 0, 2504, 0, 121313, 0, 983922, + 6943, 0, 5859, 100677, 0, 0, 72873, 983926, 0, 0, 983904, 92390, 2753, + 1936, 2153, 67701, 2751, 12662, 2763, 8953, 0, 10731, 0, 7052, 0, 0, 0, + 0, 119899, 0, 66675, 0, 119897, 0, 71053, 0, 119903, 0, 67829, 7899, + 119901, 71119, 43798, 7072, 119902, 122898, 11260, 0, 71059, 0, 0, 212, + 0, 12350, 0, 0, 0, 0, 0, 128402, 2759, 0, 0, 93064, 0, 0, 0, 1291, 0, 0, + 121318, 119911, 0, 119910, 0, 12062, 0, 121216, 0, 0, 121044, 120611, + 8246, 128874, 0, 0, 0, 0, 0, 73962, 0, 0, 43524, 0, 64426, 0, 0, 0, 0, + 65664, 6693, 0, 0, 8674, 0, 128812, 0, 11846, 70690, 121461, 69395, 4811, + 0, 5986, 0, 3046, 74480, 5985, 0, 0, 0, 0, 12187, 83148, 71041, 5984, 0, + 93817, 4393, 126264, 120206, 917599, 0, 0, 0, 93806, 93805, 0, 3491, 0, + 67146, 0, 93819, 0, 72428, 0, 0, 0, 124968, 41284, 126228, 0, 0, 41287, + 0, 100689, 0, 0, 92189, 0, 0, 219, 120874, 0, 0, 0, 68485, 119672, 43241, + 0, 7147, 0, 0, 0, 0, 0, 0, 64610, 11804, 0, 7149, 64808, 0, 0, 0, 92301, + 73690, 0, 5253, 0, 0, 0, 0, 129045, 983596, 11098, 68433, 0, 120484, + 111009, 0, 0, 0, 0, 0, 70801, 100779, 0, 128198, 9604, 0, 130036, 0, 0, + 118941, 64392, 0, 0, 0, 0, 41974, 126262, 0, 0, 0, 129818, 0, 129833, 0, + 0, 0, 0, 0, 983239, 5308, 0, 290, 0, 125278, 128382, 2792, 0, 0, 120521, + 0, 126237, 0, 126099, 0, 0, 0, 0, 128503, 0, 0, 72816, 0, 0, 0, 92671, 0, + 0, 42646, 7606, 2591, 73896, 0, 43513, 64482, 0, 0, 65270, 0, 0, 983682, + 9112, 0, 113763, 9490, 0, 0, 0, 0, 0, 9071, 0, 0, 0, 0, 74607, 0, 2535, + 65504, 43602, 0, 0, 71256, 0, 0, 123147, 11845, 11006, 92315, 7807, 8073, + 0, 10629, 0, 74088, 0, 10823, 0, 113762, 8762, 0, 69689, 0, 43969, 65047, + 10737, 3463, 72858, 129585, 66645, 0, 4815, 0, 0, 12345, 983742, 0, 5195, + 0, 0, 66639, 0, 0, 127316, 0, 92759, 92385, 1262, 0, 6561, 19939, 0, 0, + 100772, 123160, 69269, 0, 100774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5702, 3655, 0, 8430, 0, 68807, 0, 0, 121137, 0, 0, 5254, 0, 0, 0, 0, + 119107, 5129, 0, 70816, 0, 92280, 5614, 0, 0, 11720, 0, 11721, 70804, + 4798, 0, 120541, 66038, 4793, 67851, 7352, 0, 0, 0, 0, 917600, 0, 300, 0, + 0, 128575, 92660, 0, 0, 2562, 70156, 120856, 0, 0, 92738, 0, 0, 127820, + 71093, 0, 127969, 128221, 0, 3424, 93843, 0, 0, 7074, 70873, 917926, 0, + 0, 10832, 0, 0, 69852, 72430, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 1215, 0, + 5744, 0, 66440, 0, 0, 0, 42881, 0, 8980, 118988, 67861, 8844, 7433, 0, 0, + 4278, 0, 0, 0, 70821, 9312, 4348, 0, 128401, 65946, 0, 7087, 5255, 0, + 661, 0, 0, 0, 0, 0, 0, 0, 121009, 73694, 0, 123154, 0, 73688, 0, 127179, + 3621, 83325, 66666, 72968, 0, 6562, 12928, 0, 73991, 0, 0, 11383, 0, 0, + 65588, 120739, 0, 0, 0, 0, 0, 0, 0, 0, 11436, 2070, 64, 110824, 0, 10291, + 10323, 10387, 0, 0, 0, 42008, 9708, 42710, 0, 42011, 0, 92164, 0, 0, + 1702, 1240, 128383, 6286, 9689, 111080, 0, 0, 0, 1765, 0, 0, 92373, 0, 0, + 0, 8401, 72991, 42014, 0, 67237, 0, 0, 0, 0, 0, 0, 0, 70819, 0, 0, 0, 0, + 12667, 0, 0, 10147, 0, 127568, 126483, 72812, 0, 0, 0, 0, 123139, 128968, + 0, 64947, 0, 0, 0, 0, 10435, 11462, 0, 7084, 0, 0, 0, 0, 0, 126084, 0, + 66662, 0, 0, 0, 0, 125134, 0, 0, 77990, 263, 983728, 41288, 127953, 0, + 78387, 74340, 70313, 129140, 0, 0, 0, 42022, 71265, 0, 0, 0, 0, 0, 0, + 42020, 123146, 0, 6992, 42019, 0, 41290, 0, 12295, 126233, 71304, 0, + 120984, 71300, 120631, 5954, 64931, 69385, 100699, 198, 68453, 78129, 0, + 121351, 0, 70818, 13165, 7107, 0, 42804, 678, 72850, 118960, 0, 72985, + 42806, 42808, 0, 0, 2097, 0, 120560, 70823, 0, 0, 3892, 68632, 0, 6712, + 917959, 0, 0, 0, 0, 123158, 69954, 0, 497, 12100, 5953, 92667, 7796, 0, + 43254, 0, 0, 11072, 5952, 1281, 43747, 0, 69380, 10677, 0, 0, 0, 1859, 0, + 72856, 3425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65199, 1738, 0, 122911, 0, 0, + 0, 11101, 0, 0, 0, 0, 127002, 69651, 4436, 194683, 73984, 0, 70305, + 64872, 128296, 0, 0, 0, 121377, 0, 0, 0, 43686, 983108, 0, 119109, 0, + 70826, 319, 0, 43479, 73001, 0, 0, 12849, 0, 7640, 71083, 9673, 0, 0, 0, + 92670, 0, 92665, 113717, 41422, 0, 100708, 74941, 3772, 0, 120660, 5011, + 0, 0, 126587, 111315, 0, 0, 6677, 111312, 0, 41427, 64419, 129445, 92262, + 0, 70799, 0, 0, 0, 6106, 0, 41271, 6760, 983739, 4534, 41270, 128876, 0, + 0, 119561, 0, 0, 3671, 8976, 123177, 0, 41275, 0, 128084, 55261, 0, + 42013, 0, 568, 0, 41273, 0, 0, 6728, 0, 9715, 0, 0, 121058, 74820, 0, + 92268, 0, 194564, 11191, 43688, 128023, 0, 0, 0, 126266, 0, 0, 0, 11958, + 11165, 0, 125087, 0, 0, 66336, 127944, 0, 0, 0, 0, 42858, 11789, 72878, + 5557, 0, 69444, 7300, 0, 9467, 5558, 64486, 43844, 0, 0, 6706, 10146, 0, + 127185, 64566, 0, 0, 0, 0, 0, 0, 0, 4546, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 64528, 123136, 6307, 128966, 0, 7544, 0, 43469, 111317, 0, 10152, 0, + 65091, 0, 0, 0, 0, 66652, 0, 0, 0, 0, 64823, 5559, 0, 70711, 6702, 5556, + 0, 0, 0, 0, 0, 11166, 0, 0, 5506, 0, 1911, 73021, 0, 12598, 8845, 66698, + 0, 73012, 123145, 0, 2098, 0, 0, 0, 66622, 194678, 0, 0, 0, 9898, 0, 0, + 7552, 0, 0, 0, 7223, 65723, 0, 0, 0, 7024, 65728, 127155, 1210, 0, 65175, + 10184, 65726, 43654, 0, 0, 0, 38, 65729, 66669, 0, 0, 0, 0, 0, 0, 0, 0, + 74233, 73018, 119843, 42860, 111301, 92576, 65721, 65722, 0, 0, 0, 0, + 68843, 0, 68850, 0, 92388, 92267, 128536, 65577, 92213, 0, 127518, 11650, + 5013, 92663, 68810, 92568, 118914, 6613, 74371, 0, 0, 0, 0, 64714, 71479, + 0, 983778, 12120, 0, 0, 43124, 0, 0, 78037, 69263, 0, 126219, 0, 0, 1837, 125086, 0, 0, 0, 127210, 4952, 65718, 64405, 5504, 65720, 65714, 65715, - 65716, 10403, 127005, 0, 41449, 0, 74028, 127213, 0, 119234, 1127, 455, - 0, 0, 72860, 3483, 0, 1989, 0, 69678, 9104, 0, 65375, 0, 0, 0, 1864, 0, + 65716, 10403, 127005, 0, 41449, 0, 74028, 72019, 0, 119234, 1127, 455, 0, + 0, 72860, 3483, 0, 1989, 0, 69678, 9104, 0, 65375, 0, 0, 0, 1864, 0, 72810, 8107, 2540, 0, 0, 11257, 128807, 119576, 0, 120999, 0, 0, 8604, 0, - 0, 0, 0, 128270, 0, 0, 3115, 0, 10106, 127862, 118842, 0, 0, 9631, 0, 0, - 0, 0, 0, 0, 0, 258, 129079, 0, 0, 0, 92292, 0, 70699, 0, 11478, 0, + 0, 0, 0, 128270, 0, 0, 3115, 0, 10106, 127862, 118842, 101136, 0, 9631, + 0, 0, 0, 0, 0, 0, 0, 258, 129079, 0, 0, 0, 92292, 0, 70699, 0, 11478, 0, 129640, 11522, 0, 8549, 0, 128430, 0, 0, 0, 0, 0, 0, 123140, 0, 0, 0, 9221, 12590, 73048, 0, 0, 0, 67741, 111294, 12619, 0, 10154, 111266, 74439, 2039, 0, 7446, 0, 111276, 10974, 458, 72831, 0, 0, 0, 11916, 0, 0, 69671, 0, 121057, 12288, 0, 111288, 0, 111289, 983176, 0, 128199, 13080, 0, 67828, 6610, 6030, 8059, 7508, 123170, 0, 0, 0, 0, 41278, 129393, 0, - 128192, 41277, 64658, 983983, 0, 6625, 983159, 19904, 0, 0, 0, 0, 0, 0, - 833, 0, 6369, 0, 0, 42664, 0, 0, 0, 0, 0, 0, 6913, 933, 1341, 68828, + 128192, 41277, 64658, 983983, 101278, 6625, 983159, 19904, 0, 0, 0, 0, 0, + 0, 833, 0, 6369, 0, 0, 42664, 0, 0, 0, 0, 0, 0, 6913, 933, 1341, 68828, 6720, 0, 0, 983604, 0, 0, 7405, 128025, 0, 0, 0, 0, 0, 0, 0, 70704, 0, 0, 0, 0, 9716, 0, 0, 0, 70719, 0, 0, 0, 0, 72862, 70687, 0, 93987, 0, 0, 0, 70721, 9573, 0, 0, 111245, 83225, 83226, 6949, 126482, 74061, 83222, @@ -26491,58 +27342,58 @@ static const unsigned int code_hash[] = { 0, 0, 120809, 10599, 66892, 0, 0, 0, 0, 0, 0, 11437, 0, 0, 0, 0, 0, 0, 12624, 0, 41185, 72865, 69439, 8159, 0, 11686, 71478, 65224, 0, 4655, 0, 0, 92183, 0, 10343, 10407, 0, 0, 0, 111221, 0, 0, 0, 94057, 68201, - 129574, 0, 983568, 72156, 42792, 5743, 10424, 0, 0, 0, 0, 0, 8875, - 111225, 0, 917991, 13117, 12847, 4651, 118917, 0, 962, 0, 0, 64705, - 42564, 0, 1582, 0, 5508, 0, 0, 0, 10801, 123602, 118798, 73705, 0, 66911, - 10439, 66891, 0, 0, 7860, 0, 906, 917985, 0, 6405, 64722, 0, 83266, - 64694, 83268, 917990, 1153, 83263, 64788, 83265, 0, 12626, 83260, 83261, - 9964, 0, 0, 4642, 66574, 127886, 0, 0, 0, 0, 0, 9008, 100847, 0, 0, 0, - 83248, 917976, 917993, 123173, 42842, 83244, 83245, 83247, 83239, 83240, - 83241, 83242, 0, 11335, 92661, 83238, 3920, 0, 0, 0, 83255, 83256, 41967, - 83258, 83251, 83252, 83253, 8920, 0, 0, 83249, 83250, 0, 0, 43919, 0, 0, - 0, 0, 128021, 0, 68113, 65196, 0, 0, 128472, 0, 10111, 64875, 0, 83491, - 43998, 83232, 83233, 83234, 70691, 83228, 42149, 83230, 68508, 0, 0, 0, - 0, 0, 0, 0, 4110, 66005, 74034, 0, 0, 0, 66703, 0, 0, 983157, 6025, - 69242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70733, 0, 983043, 0, 0, 0, 68817, 0, 0, - 0, 0, 0, 0, 43286, 0, 68765, 0, 0, 0, 0, 983133, 65144, 0, 0, 83236, - 65840, 0, 0, 10081, 0, 0, 983893, 0, 0, 0, 127394, 65882, 0, 128758, 0, - 0, 3605, 10985, 0, 0, 128872, 93972, 1745, 0, 73835, 0, 0, 0, 0, 0, 0, - 8806, 7023, 0, 0, 0, 70702, 70304, 0, 0, 0, 0, 0, 0, 0, 0, 348, 10089, 0, - 9017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42515, 0, 0, 0, 0, 5391, 983236, 0, 0, - 0, 5561, 0, 9429, 0, 67150, 7933, 5562, 0, 0, 0, 0, 78039, 0, 0, 0, 0, - 3979, 71248, 0, 0, 0, 68847, 0, 0, 118847, 65847, 68836, 68838, 0, 10585, - 0, 92676, 7334, 0, 0, 0, 831, 0, 0, 10716, 0, 121325, 0, 12218, 0, 6939, - 70697, 65042, 0, 0, 916, 0, 0, 11968, 0, 0, 5563, 0, 0, 128830, 5560, - 41212, 41774, 0, 4497, 0, 0, 0, 9039, 70678, 41776, 0, 8716, 3567, - 119252, 0, 0, 74260, 0, 93954, 0, 0, 100827, 0, 128879, 70072, 68355, - 68357, 0, 0, 8634, 0, 0, 4209, 120702, 68832, 65879, 68825, 68819, 68822, - 0, 5679, 68813, 68815, 68811, 68812, 64697, 5678, 11821, 68802, 93969, 0, - 0, 0, 0, 70114, 0, 0, 0, 0, 0, 0, 0, 0, 7782, 0, 0, 0, 0, 0, 65711, - 65712, 1216, 0, 69409, 5792, 0, 0, 0, 0, 0, 12244, 0, 5683, 0, 120895, - 121336, 43448, 70670, 0, 0, 5682, 10242, 75043, 74520, 5680, 917568, - 10001, 0, 0, 1449, 10241, 0, 70708, 0, 0, 83180, 83182, 83183, 8584, - 83176, 5567, 83178, 83179, 0, 5564, 42886, 42884, 42882, 5565, 119022, - 120881, 0, 65708, 65709, 5566, 0, 65704, 65705, 11904, 42875, 0, 42873, - 5942, 0, 0, 10361, 10425, 65697, 65698, 65699, 0, 66598, 0, 64664, 10647, - 78702, 78703, 78690, 78700, 0, 65701, 1934, 0, 0, 0, 78710, 0, 78706, - 78709, 6087, 78705, 78716, 78719, 78711, 8043, 8950, 65694, 64485, 0, - 10457, 0, 78724, 78725, 78722, 72332, 78720, 78721, 0, 65515, 0, 10035, - 13069, 0, 0, 127773, 0, 0, 0, 125207, 0, 0, 1667, 0, 0, 42428, 110950, 0, - 0, 41750, 0, 0, 93999, 0, 8101, 3610, 113670, 41748, 110948, 0, 78394, - 119208, 0, 0, 113691, 64549, 68359, 0, 0, 65692, 92701, 0, 0, 12896, - 10456, 68298, 0, 0, 0, 0, 917962, 0, 0, 113665, 70502, 0, 65687, 0, 0, - 74009, 0, 113673, 8536, 70671, 0, 78726, 0, 724, 0, 113675, 78749, 9975, - 78746, 78747, 78744, 4175, 78741, 78743, 78751, 939, 0, 128799, 983119, - 0, 0, 0, 78763, 78764, 78760, 78761, 78758, 78759, 78755, 8425, 0, 0, 0, - 8188, 0, 0, 0, 0, 0, 6370, 0, 7827, 68441, 75008, 0, 917943, 0, 118863, - 0, 0, 0, 0, 121243, 73988, 0, 113668, 0, 11012, 0, 43764, 178, 12972, - 74620, 113671, 0, 113735, 0, 66764, 0, 0, 65690, 72339, 0, 0, 917950, - 9252, 0, 4652, 74259, 0, 917947, 0, 0, 0, 10806, 0, 0, 70016, 0, 6723, 0, - 0, 6993, 0, 0, 12855, 0, 0, 11390, 0, 0, 0, 92503, 0, 0, 983161, 125270, - 92627, 8278, 0, 4034, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12750, 9350, 66037, 0, - 0, 73700, 12747, 0, 0, 128064, 43153, 74640, 0, 0, 43150, 0, 983090, - 983088, 66779, 66777, 10813, 2592, 43139, 0, 0, 0, 0, 0, 71891, 0, 0, 0, - 0, 0, 0, 0, 0, 128825, 1596, 0, 0, 0, 0, 6838, 66572, 0, 126574, 120627, + 129574, 0, 983572, 72156, 42792, 5743, 10424, 0, 0, 0, 0, 0, 8875, + 111225, 0, 917991, 13117, 12847, 4651, 118917, 0, 962, 0, 0, 2242, 42564, + 0, 1582, 0, 5508, 0, 0, 0, 10801, 123602, 118798, 73705, 0, 66911, 10439, + 66891, 0, 0, 7860, 0, 906, 917985, 0, 6405, 64722, 0, 83266, 64694, + 83268, 917990, 1153, 83263, 64788, 83265, 0, 12626, 83260, 83261, 9964, + 0, 0, 4642, 66574, 127886, 0, 0, 0, 0, 0, 9008, 100847, 0, 0, 0, 83248, + 917976, 917993, 123173, 42842, 83244, 83245, 83247, 83239, 83240, 83241, + 83242, 0, 11335, 92661, 83238, 3920, 0, 0, 0, 83255, 83256, 41967, 83258, + 83251, 83252, 83253, 8920, 0, 0, 83249, 83250, 0, 0, 43919, 0, 0, 0, 0, + 128021, 0, 68113, 65196, 0, 0, 128472, 0, 10111, 64875, 0, 83491, 43998, + 83232, 83233, 83234, 70691, 83228, 42149, 83230, 68508, 0, 0, 0, 0, 0, 0, + 0, 4110, 66005, 74034, 0, 0, 0, 66703, 0, 0, 983157, 6025, 69242, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 70733, 0, 983043, 0, 0, 0, 68817, 0, 0, 0, 0, 0, 0, + 43286, 0, 68765, 0, 0, 0, 0, 129871, 65144, 0, 0, 83236, 65840, 0, 0, + 10081, 0, 0, 983893, 0, 0, 0, 127394, 65882, 0, 128758, 0, 0, 3605, + 10985, 0, 0, 128872, 93972, 1745, 0, 73835, 0, 0, 0, 0, 0, 0, 8806, 7023, + 0, 0, 0, 70702, 70304, 0, 0, 0, 0, 0, 0, 0, 0, 348, 10089, 0, 9017, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 42515, 0, 0, 0, 0, 5391, 983236, 0, 0, 0, 5561, 0, + 9429, 0, 67150, 7933, 5562, 0, 0, 0, 0, 78039, 0, 0, 0, 0, 3979, 71248, + 0, 0, 0, 68847, 0, 0, 118847, 65847, 68836, 68838, 0, 10585, 0, 92676, + 7334, 0, 0, 0, 831, 0, 0, 10716, 0, 121325, 0, 12218, 0, 6939, 70697, + 65042, 0, 0, 916, 0, 0, 11968, 0, 0, 5563, 0, 0, 128830, 5560, 41212, + 41774, 0, 4497, 0, 0, 0, 9039, 70678, 41776, 0, 8716, 3567, 119252, 0, 0, + 74260, 0, 93954, 0, 0, 100827, 0, 128879, 70072, 68355, 68357, 0, 0, + 8634, 0, 0, 4209, 120702, 68832, 65879, 68825, 68819, 68822, 0, 5679, + 68813, 68815, 68811, 68812, 64697, 5678, 11821, 68802, 93969, 0, 0, 0, 0, + 70114, 0, 0, 0, 0, 0, 0, 0, 0, 7782, 0, 0, 0, 0, 129977, 65711, 65712, + 1216, 0, 69409, 5792, 0, 0, 0, 0, 0, 12244, 0, 5683, 0, 120895, 121336, + 43448, 70670, 0, 0, 5682, 10242, 75043, 74520, 5680, 917568, 10001, 0, 0, + 1449, 10241, 0, 70708, 0, 0, 83180, 83182, 83183, 8584, 83176, 5567, + 83178, 83179, 0, 5564, 42886, 42884, 42882, 5565, 119022, 120881, 0, + 65708, 65709, 5566, 0, 65704, 65705, 11904, 42875, 0, 42873, 5942, 0, 0, + 10361, 10425, 65697, 65698, 65699, 0, 66598, 0, 64664, 10647, 78702, + 78703, 78690, 78700, 0, 65701, 1934, 0, 0, 0, 78710, 0, 78706, 78709, + 6087, 78705, 78716, 78719, 78711, 8043, 8950, 65694, 64485, 0, 10457, 0, + 78724, 78725, 78722, 72332, 78720, 78721, 0, 65515, 0, 10035, 13069, 0, + 0, 127773, 0, 0, 0, 125207, 0, 0, 1667, 0, 0, 42428, 110950, 0, 0, 41750, + 0, 0, 93999, 0, 8101, 3610, 113670, 41748, 110948, 0, 78394, 119208, 0, + 0, 113691, 64549, 68359, 0, 0, 65692, 92701, 0, 0, 12896, 10456, 68298, + 0, 0, 0, 0, 917962, 0, 0, 113665, 70502, 0, 65687, 0, 0, 74009, 0, + 113673, 8536, 70671, 0, 78726, 0, 724, 0, 113675, 78749, 9975, 78746, + 78747, 78744, 4175, 78741, 78743, 78751, 939, 0, 128799, 983119, 0, 0, 0, + 78763, 78764, 78760, 78761, 78758, 78759, 78755, 8425, 0, 0, 0, 8188, 0, + 0, 0, 0, 0, 6370, 0, 7827, 68441, 75008, 0, 917943, 0, 118863, 0, 0, 0, + 0, 121243, 73988, 0, 113668, 0, 11012, 0, 43764, 178, 12972, 74620, + 113671, 0, 113735, 0, 66764, 0, 0, 65690, 72339, 0, 0, 917950, 9252, 0, + 4652, 74259, 0, 917947, 0, 0, 0, 10806, 0, 0, 70016, 0, 6723, 0, 0, 6993, + 0, 0, 12855, 0, 0, 11390, 0, 0, 0, 92503, 0, 0, 983161, 125270, 92627, + 8278, 0, 4034, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12750, 9350, 66037, 0, 0, + 73700, 12747, 0, 0, 128064, 43153, 74640, 0, 0, 43150, 0, 983090, 983088, + 66779, 66777, 10813, 2592, 43139, 0, 0, 118870, 0, 0, 71891, 0, 0, 0, 0, + 0, 0, 71697, 0, 128825, 1596, 0, 0, 0, 0, 6838, 66572, 0, 126574, 120627, 8092, 12805, 41928, 0, 78406, 78409, 0, 0, 0, 9931, 0, 0, 0, 0, 0, 983759, 6107, 0, 0, 0, 0, 128745, 0, 335, 127003, 64689, 0, 0, 5765, 0, 0, 119227, 6092, 118851, 0, 8876, 83465, 74947, 83455, 129186, 83454, @@ -26550,22 +27401,22 @@ static const unsigned int code_hash[] = { 0, 0, 0, 0, 0, 843, 0, 71099, 0, 0, 41935, 0, 0, 0, 0, 1371, 0, 43818, 43159, 8069, 9579, 41938, 41608, 0, 92444, 6242, 0, 0, 128595, 128244, 0, 92499, 8805, 1742, 113722, 0, 8202, 72399, 0, 983197, 0, 0, 73882, - 100809, 0, 43467, 123636, 55290, 0, 1712, 5932, 0, 41762, 129389, 0, + 100809, 0, 43467, 123636, 55290, 0, 1712, 5932, 0, 41762, 71982, 0, 11967, 1775, 0, 75009, 0, 120398, 120387, 9458, 0, 126614, 0, 0, 43176, 101032, 101031, 42782, 101033, 101036, 101035, 101038, 101037, 101040, 101039, 0, 0, 0, 0, 101041, 5794, 92274, 2662, 101045, 101044, 8254, 101046, 10975, 101048, 120625, 101050, 917977, 4108, 8478, 917982, 194790, 0, 92263, 917980, 7507, 0, 43149, 0, 65031, 7961, 1636, 0, 65029, 0, 129665, 70188, 9674, 0, 99, 98, 97, 101022, 92203, 4049, 101027, - 101026, 7090, 101028, 0, 101030, 66589, 0, 65310, 66593, 66599, 0, 0, 0, - 7447, 66594, 0, 0, 0, 73920, 66595, 66596, 42570, 5593, 0, 0, 0, 0, 6061, - 64854, 119, 118, 117, 116, 0, 122, 121, 120, 111, 110, 109, 108, 115, - 114, 113, 112, 103, 102, 101, 100, 107, 106, 105, 104, 128504, 73974, - 534, 0, 67713, 1536, 73973, 73970, 0, 0, 0, 6020, 12716, 0, 12744, 65143, - 0, 13266, 127813, 0, 0, 0, 127116, 0, 1212, 65560, 0, 8134, 42935, 12129, - 73870, 0, 1866, 0, 0, 0, 0, 65073, 12059, 66585, 121391, 0, 0, 0, 5935, - 1250, 0, 8174, 9787, 6733, 9859, 9858, 9861, 9860, 101012, 1882, 1892, - 6731, 10882, 10795, 101018, 73911, 101020, 101019, 41169, 8939, 0, + 43880, 7090, 101028, 0, 101030, 66589, 0, 65310, 66593, 66599, 129805, 0, + 0, 7447, 66594, 0, 0, 0, 73920, 66595, 66596, 42570, 5593, 0, 0, 0, 0, + 6061, 64854, 119, 118, 117, 116, 0, 122, 121, 120, 111, 110, 109, 108, + 115, 114, 113, 112, 103, 102, 101, 100, 107, 106, 105, 104, 128504, + 73974, 534, 0, 67713, 1536, 73973, 73970, 0, 0, 0, 6020, 12716, 0, 12744, + 65143, 0, 13266, 127813, 0, 0, 0, 127116, 0, 1212, 65560, 0, 8134, 42935, + 12129, 73870, 0, 1866, 0, 0, 0, 0, 65073, 12059, 66585, 121391, 0, 0, 0, + 5935, 1250, 0, 8174, 9787, 6733, 9859, 9858, 9861, 9860, 101012, 1882, + 1892, 6731, 10882, 10795, 101018, 73911, 101020, 101019, 41169, 8939, 0, 120713, 41170, 1454, 0, 65130, 69732, 0, 0, 129611, 41172, 7855, 0, 71472, 0, 0, 0, 71691, 65901, 0, 0, 645, 100992, 100991, 100994, 100993, 100996, 100995, 100998, 65587, 0, 10688, 0, 0, 7729, 0, 101001, 120518, @@ -26604,22 +27455,22 @@ static const unsigned int code_hash[] = { 41296, 11747, 41291, 0, 0, 0, 41294, 41282, 5923, 120610, 0, 0, 0, 0, 66800, 5786, 68252, 42539, 119869, 119860, 0, 41474, 0, 0, 0, 5934, 74572, 66583, 119231, 0, 94072, 64481, 0, 0, 0, 0, 67240, 0, 0, 123201, - 0, 5819, 0, 0, 0, 0, 0, 129387, 0, 0, 0, 67993, 1237, 0, 0, 0, 983557, 0, - 0, 0, 0, 0, 0, 0, 69789, 11266, 69845, 0, 10506, 194747, 0, 0, 0, 0, - 43185, 0, 100533, 100532, 100535, 10769, 100537, 100536, 100539, 9753, - 121035, 100540, 0, 0, 121433, 0, 100542, 6072, 100544, 100543, 100546, - 100545, 100548, 100547, 100550, 100549, 0, 113744, 0, 0, 7222, 10283, - 10315, 10379, 4996, 0, 129294, 66517, 0, 10087, 127833, 74938, 0, 0, - 83492, 7565, 42890, 0, 77931, 43180, 77928, 74891, 77929, 43982, 100526, - 622, 77926, 100527, 100530, 1602, 0, 0, 0, 129559, 12160, 0, 10212, - 77936, 194605, 12071, 43143, 77935, 917983, 917984, 917989, 77932, - 917987, 917988, 10255, 10263, 10279, 4194, 10375, 93035, 0, 0, 12644, - 127516, 917994, 75007, 110791, 67408, 110789, 11501, 41177, 0, 0, 71912, - 0, 0, 8715, 0, 41179, 0, 0, 0, 41176, 0, 41181, 0, 8452, 121006, 13161, - 0, 70503, 5921, 0, 2597, 0, 5922, 72128, 0, 74242, 0, 0, 0, 0, 0, 0, 0, - 0, 127906, 0, 64944, 0, 0, 0, 0, 5924, 5920, 129508, 6921, 78081, 74007, - 78078, 8418, 11681, 43169, 10176, 0, 0, 0, 78087, 10772, 65276, 5937, - 1914, 78084, 11682, 0, 0, 0, 11685, 0, 100513, 7772, 11680, 100514, + 0, 5819, 0, 0, 0, 0, 0, 129387, 0, 0, 0, 67993, 1237, 194749, 0, 0, + 983557, 0, 0, 0, 0, 0, 0, 0, 69789, 11266, 69845, 0, 10506, 194747, 0, 0, + 0, 0, 43185, 194748, 100533, 100532, 100535, 10769, 100537, 100536, + 100539, 9753, 121035, 100540, 0, 0, 121433, 0, 100542, 6072, 100544, + 100543, 100546, 100545, 100548, 100547, 100550, 100549, 0, 113744, 0, 0, + 7222, 10283, 10315, 10379, 4996, 0, 129294, 66517, 0, 10087, 127833, + 74938, 0, 0, 83492, 7565, 42890, 0, 77931, 43180, 77928, 74891, 77929, + 43982, 100526, 622, 77926, 100527, 100530, 1602, 0, 0, 0, 129559, 12160, + 0, 10212, 77936, 194605, 12071, 43143, 77935, 917983, 917984, 917989, + 77932, 917987, 917988, 10255, 10263, 10279, 4194, 10375, 93035, 0, 0, + 12644, 127516, 917994, 75007, 110791, 67408, 110789, 11501, 41177, 0, 0, + 71912, 0, 0, 8715, 0, 41179, 0, 0, 0, 41176, 0, 41181, 0, 8452, 121006, + 13161, 0, 70503, 5921, 0, 2597, 0, 5922, 72128, 0, 74242, 0, 0, 0, 0, 0, + 0, 0, 0, 127906, 0, 64944, 0, 0, 0, 0, 5924, 5920, 129508, 6921, 78081, + 74007, 78078, 8418, 11681, 43169, 10176, 0, 0, 0, 78087, 10772, 65276, + 5937, 1914, 78084, 11682, 0, 0, 0, 11685, 0, 100513, 7772, 11680, 100514, 100517, 100516, 100519, 7417, 718, 100520, 70083, 100500, 120718, 3235, 0, 43164, 0, 8018, 0, 0, 128708, 6937, 67672, 128508, 0, 10067, 120849, 0, 0, 0, 0, 0, 100491, 0, 100493, 100492, 13116, 100494, 100497, 9945, @@ -26629,56 +27480,57 @@ static const unsigned int code_hash[] = { 78102, 71226, 10141, 0, 78280, 65298, 4476, 78109, 94005, 71216, 8907, 78105, 78106, 78103, 78104, 120898, 0, 10665, 64616, 128944, 0, 127545, 69605, 83159, 83160, 4554, 0, 83155, 83156, 83157, 83158, 0, 125123, 0, - 72258, 0, 0, 0, 0, 43179, 0, 0, 0, 717, 10754, 83168, 83169, 83162, - 83163, 83164, 83165, 78282, 0, 0, 83161, 68848, 10611, 72859, 126978, - 71474, 129426, 127871, 0, 0, 0, 12820, 0, 0, 7009, 70103, 0, 0, 67848, - 41173, 4574, 0, 0, 128338, 575, 78110, 43456, 8563, 100469, 0, 0, 65565, - 0, 5936, 7290, 78117, 78118, 74919, 308, 78113, 78114, 83151, 78123, - 83153, 83154, 0, 0, 0, 0, 78132, 5926, 68250, 78130, 78126, 78127, 78124, - 78125, 42513, 0, 0, 0, 11651, 13093, 78135, 0, 100471, 0, 100473, 100472, - 100475, 74048, 100477, 74783, 100457, 100456, 43703, 13097, 0, 100460, - 13283, 0, 0, 125073, 3488, 5933, 10033, 0, 0, 65570, 0, 12297, 0, 0, 0, - 128517, 42538, 0, 129293, 0, 100451, 0, 100453, 100452, 100455, 100454, - 121221, 0, 0, 7638, 0, 129193, 0, 43109, 7637, 0, 11213, 100461, 83355, - 100463, 100466, 100465, 0, 0, 7636, 0, 0, 0, 128848, 983087, 291, 0, 0, - 2027, 78141, 78142, 78136, 78137, 83481, 4640, 64713, 10224, 120429, - 11183, 83482, 120430, 0, 0, 0, 127148, 83479, 0, 0, 83488, 0, 0, 0, 0, - 68837, 5778, 0, 0, 0, 12680, 119130, 0, 67242, 93041, 0, 0, 0, 11552, 0, - 127855, 0, 70091, 0, 10172, 65453, 120408, 66014, 120410, 0, 4641, 11556, - 64819, 78269, 120416, 72341, 41469, 41467, 120412, 120415, 4646, 120425, - 865, 78275, 78274, 78273, 4645, 78271, 78270, 0, 983172, 7338, 0, 68840, - 0, 12565, 0, 0, 0, 195089, 119655, 195091, 195090, 2913, 13120, 128956, - 195094, 195097, 195096, 128019, 0, 71462, 0, 7916, 10485, 195098, 0, - 195100, 195099, 0, 67705, 195078, 195077, 195080, 129636, 129549, 195081, - 0, 0, 0, 10229, 10687, 826, 128081, 195082, 195085, 195084, 195087, - 195086, 0, 1808, 7848, 0, 0, 0, 0, 0, 0, 128897, 0, 42942, 67704, 0, 0, - 0, 0, 42940, 0, 9144, 0, 0, 92992, 9840, 0, 0, 0, 0, 0, 0, 74448, 83475, - 0, 10962, 66904, 113718, 983187, 0, 0, 74537, 195072, 1792, 195074, - 195073, 78266, 195075, 0, 0, 12066, 0, 385, 4152, 0, 0, 0, 67397, 0, 0, - 0, 0, 43258, 0, 0, 13157, 0, 0, 3570, 0, 0, 0, 67252, 0, 71218, 126631, - 7879, 68247, 128579, 0, 0, 70196, 0, 0, 8463, 7810, 917862, 7839, 983859, - 127768, 917860, 9691, 0, 129323, 0, 120385, 0, 917844, 0, 10066, 0, 0, 0, - 0, 0, 8016, 0, 983072, 64831, 0, 126103, 0, 119171, 1634, 68115, 0, - 11056, 0, 0, 0, 41165, 11328, 12450, 0, 41166, 0, 12456, 0, 171, 0, - 12452, 917544, 12458, 12531, 0, 917853, 0, 74162, 0, 0, 9969, 0, 12454, - 74160, 42132, 110755, 78878, 110753, 3230, 73711, 0, 0, 8932, 4399, 5810, - 64534, 8415, 0, 110756, 110757, 74159, 0, 0, 960, 74156, 6981, 92374, - 12938, 9201, 0, 983658, 74904, 0, 72866, 92270, 0, 0, 0, 0, 5851, 73833, - 5824, 0, 5844, 110848, 110849, 110846, 110847, 4663, 0, 0, 0, 0, 0, - 74085, 0, 0, 0, 0, 0, 92339, 0, 0, 5782, 0, 0, 0, 43796, 129639, 0, 0, - 125223, 128004, 0, 43861, 0, 0, 0, 92976, 0, 0, 0, 4659, 0, 0, 0, 0, - 129386, 0, 11129, 0, 329, 0, 92707, 121416, 0, 0, 0, 69943, 67692, 42167, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69618, 43671, 0, 64701, 0, 0, 0, 93055, - 1172, 125089, 6786, 43601, 0, 74126, 0, 0, 0, 0, 0, 0, 0, 0, 118804, 0, - 66741, 5347, 0, 983644, 0, 0, 10588, 0, 0, 0, 0, 5343, 0, 0, 0, 5341, 0, - 0, 74916, 5351, 0, 0, 917884, 0, 92692, 0, 121148, 128916, 0, 0, 66785, - 126256, 6638, 0, 0, 271, 0, 917904, 0, 0, 12653, 67588, 0, 0, 0, 0, - 128838, 11912, 128301, 983646, 0, 11800, 0, 0, 11103, 0, 7340, 0, 110695, - 0, 0, 0, 0, 2423, 0, 0, 0, 128136, 42705, 0, 0, 0, 11854, 0, 0, 0, 0, - 4916, 0, 380, 10958, 66563, 127790, 78284, 67587, 0, 12918, 0, 917897, 0, - 917898, 917893, 10684, 0, 125063, 92906, 0, 0, 8182, 0, 0, 0, 0, 0, 0, - 92904, 0, 6630, 100405, 0, 123191, 0, 0, 0, 65876, 5535, 0, 0, 0, 92609, - 0, 0, 6477, 43795, 92217, 129571, 72163, 0, 43848, 0, 0, 74256, 2665, + 72258, 129831, 0, 129815, 0, 43179, 0, 0, 0, 717, 10754, 83168, 83169, + 83162, 83163, 83164, 83165, 78282, 0, 0, 83161, 68848, 10611, 72859, + 126978, 71474, 129426, 127871, 0, 0, 0, 12820, 0, 0, 7009, 70103, 0, 0, + 67848, 41173, 4574, 0, 0, 128338, 575, 78110, 43456, 8563, 100469, 0, 0, + 65565, 0, 5936, 7290, 78117, 78118, 74919, 308, 78113, 78114, 83151, + 78123, 83153, 83154, 0, 0, 0, 0, 78132, 5926, 68250, 78130, 78126, 78127, + 78124, 78125, 42513, 0, 129026, 0, 11651, 13093, 78135, 0, 100471, 0, + 100473, 100472, 100475, 74048, 100477, 71995, 100457, 100456, 43703, + 13097, 0, 100460, 13283, 0, 0, 125073, 3488, 5933, 10033, 0, 0, 65570, 0, + 12297, 0, 0, 0, 128517, 42538, 0, 129293, 0, 100451, 0, 100453, 100452, + 100455, 100454, 121221, 0, 0, 7638, 0, 129193, 0, 43109, 7637, 0, 11213, + 100461, 83355, 100463, 100466, 100465, 0, 0, 7636, 0, 0, 0, 128848, + 983087, 291, 0, 0, 2027, 78141, 78142, 78136, 78137, 83481, 4640, 64713, + 10224, 120429, 11183, 83482, 120430, 0, 0, 0, 127148, 83479, 0, 0, 83488, + 0, 0, 0, 0, 68837, 5778, 0, 0, 0, 12680, 119130, 0, 67242, 93041, 0, 0, + 0, 11552, 0, 127855, 0, 70091, 0, 10172, 65453, 120408, 66014, 120410, 0, + 4641, 11556, 64819, 78269, 120416, 72341, 41469, 41467, 120412, 120415, + 4646, 120425, 865, 78275, 78274, 78273, 4645, 78271, 78270, 0, 983172, + 7338, 0, 68840, 0, 12565, 0, 0, 0, 195089, 119655, 195091, 195090, 2913, + 13120, 128956, 195094, 195097, 195096, 128019, 0, 71462, 0, 7916, 10485, + 195098, 0, 195100, 195099, 0, 67705, 128351, 195077, 195080, 129636, + 129549, 195081, 0, 0, 0, 10229, 10687, 826, 128081, 195082, 195085, + 195084, 195087, 195086, 0, 1808, 7848, 0, 0, 0, 0, 0, 0, 128897, 69255, + 42942, 67704, 0, 0, 0, 0, 42940, 0, 9144, 0, 0, 92992, 9840, 0, 0, 0, 0, + 0, 0, 74448, 83475, 0, 10962, 66904, 113718, 983187, 0, 0, 74537, 195072, + 1792, 195074, 195073, 78266, 195075, 0, 0, 12066, 0, 385, 4152, 0, 0, 0, + 67397, 0, 0, 0, 0, 43258, 0, 0, 13157, 0, 0, 3570, 0, 0, 0, 67252, 0, + 71218, 126631, 7879, 68247, 128579, 0, 0, 70196, 0, 0, 8463, 7810, + 917862, 7839, 983859, 127768, 917860, 9691, 0, 129323, 0, 120385, 0, + 917844, 0, 10066, 0, 983855, 0, 0, 0, 8016, 0, 983072, 64831, 0, 126103, + 0, 119171, 1634, 68115, 94192, 11056, 0, 0, 0, 41165, 11328, 12450, 0, + 41166, 0, 12456, 0, 171, 0, 12452, 917544, 12458, 12531, 0, 917853, 0, + 74162, 0, 0, 9969, 0, 12454, 74160, 42132, 110755, 78878, 110753, 3230, + 73711, 0, 0, 8932, 4399, 5810, 64534, 8415, 0, 110756, 110757, 74159, 0, + 0, 960, 74156, 6981, 92374, 12938, 9201, 0, 983658, 74904, 0, 72866, + 92270, 0, 0, 0, 129792, 5851, 73833, 5824, 0, 5844, 110848, 110849, + 110846, 110847, 4663, 0, 0, 0, 0, 0, 74085, 0, 0, 0, 0, 0, 92339, 0, 0, + 5782, 0, 0, 0, 43796, 129639, 0, 195083, 125223, 128004, 0, 43861, 0, 0, + 0, 92976, 0, 0, 0, 4659, 0, 0, 0, 0, 129386, 0, 11129, 2238, 329, 0, + 92707, 121416, 0, 0, 0, 69943, 67692, 42167, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 69618, 43671, 0, 64701, 0, 0, 0, 93055, 1172, 125089, 6786, 43601, + 0, 74126, 0, 0, 0, 0, 0, 0, 0, 0, 118804, 0, 66741, 5347, 0, 983644, 0, + 0, 10588, 0, 0, 0, 0, 5343, 0, 0, 0, 5341, 0, 0, 74916, 5351, 0, 0, + 917884, 0, 92692, 0, 121148, 128916, 0, 0, 66785, 126256, 6638, 0, 0, + 271, 0, 917904, 0, 0, 12653, 67588, 0, 0, 0, 0, 128838, 11912, 128301, + 983646, 0, 11800, 0, 0, 11103, 0, 7340, 0, 110695, 0, 0, 0, 0, 2423, 0, + 0, 0, 128136, 42705, 0, 0, 0, 11854, 0, 0, 0, 0, 4916, 0, 380, 10958, + 66563, 127790, 78284, 67587, 0, 12918, 0, 917897, 0, 917898, 917893, + 10684, 0, 125063, 92906, 0, 0, 8182, 0, 0, 129434, 0, 0, 0, 92904, 0, + 6630, 100405, 0, 123191, 0, 0, 0, 65876, 5535, 129892, 0, 0, 92609, 0, + 983343, 6477, 43795, 92217, 129571, 72163, 0, 43848, 0, 0, 74256, 2665, 11304, 43751, 0, 4970, 74353, 0, 8934, 0, 93996, 4492, 92908, 65011, 0, 0, 92909, 1188, 7254, 1100, 0, 0, 0, 2912, 11749, 92643, 0, 0, 65057, 0, 12343, 0, 78879, 0, 78880, 0, 0, 0, 70355, 0, 0, 11803, 0, 0, 41450, 0, @@ -26700,7 +27552,7 @@ static const unsigned int code_hash[] = { 0, 5622, 120436, 8477, 8474, 120433, 120432, 0, 0, 0, 41435, 4352, 0, 2435, 0, 5621, 0, 4201, 8450, 4203, 4202, 4205, 4204, 120447, 120446, 120445, 66792, 41440, 120442, 8473, 6373, 8469, 120438, 0, 4564, 125206, - 0, 0, 0, 8374, 73669, 0, 0, 66796, 0, 0, 0, 0, 0, 92885, 0, 5626, 43507, + 0, 0, 0, 8374, 73669, 0, 0, 66796, 0, 0, 0, 0, 0, 69297, 0, 5626, 43507, 11771, 0, 0, 0, 42614, 0, 5625, 0, 0, 0, 5623, 0, 0, 42623, 64277, 69942, 0, 0, 120752, 0, 5817, 5629, 0, 7551, 10325, 5632, 69674, 0, 0, 124946, 125194, 5628, 0, 5631, 0, 0, 2400, 5627, 0, 0, 118786, 74792, 0, 0, 0, @@ -26712,9 +27564,9 @@ static const unsigned int code_hash[] = { 69432, 0, 9568, 71318, 456, 0, 10437, 1168, 9251, 9082, 0, 0, 42781, 3866, 0, 41512, 0, 0, 68121, 41494, 0, 4660, 0, 10405, 0, 0, 0, 0, 0, 73918, 119627, 110686, 41454, 12605, 0, 126611, 41455, 917996, 983605, 0, - 8214, 0, 100413, 0, 41457, 0, 0, 1969, 127771, 0, 0, 7413, 0, 69426, - 10341, 43864, 78079, 5854, 0, 0, 0, 0, 72819, 0, 0, 0, 0, 0, 8429, 0, - 72328, 0, 6429, 0, 0, 0, 0, 110688, 83417, 0, 917864, 120813, 83423, + 8214, 0, 100413, 0, 41457, 0, 0, 1969, 127771, 0, 69554, 7413, 0, 69426, + 10341, 43864, 78079, 5854, 0, 0, 0, 129684, 72819, 0, 0, 0, 0, 0, 8429, + 0, 72328, 0, 6429, 0, 0, 0, 0, 110688, 83417, 0, 917864, 120813, 83423, 1662, 129588, 0, 0, 917871, 917868, 0, 0, 66, 65, 68, 67, 70, 69, 72, 71, 74, 73, 76, 75, 78, 77, 80, 79, 82, 81, 84, 83, 86, 85, 88, 87, 90, 89, 0, 0, 7385, 70508, 1704, 12993, 0, 0, 0, 0, 0, 0, 0, 0, 11353, 72207, 0, @@ -26730,192 +27582,194 @@ static const unsigned int code_hash[] = { 0, 0, 0, 72307, 43474, 0, 121190, 0, 0, 3420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110871, 9574, 120684, 110870, 0, 5204, 74774, 0, 11835, 0, 0, 983185, 0, 0, 0, 0, 0, 0, 11750, 68898, 127004, 0, 0, 0, 0, 8130, 0, 0, 0, 121268, - 0, 0, 0, 68455, 42863, 73839, 0, 0, 0, 0, 0, 0, 0, 612, 110875, 110876, - 72231, 10538, 0, 1674, 0, 0, 0, 12280, 0, 540, 74550, 0, 66422, 8432, 0, - 11073, 0, 64316, 0, 0, 7388, 0, 0, 0, 0, 126107, 0, 3359, 0, 0, 67284, 0, - 0, 65482, 129589, 0, 64742, 129304, 0, 0, 74273, 0, 19941, 0, 0, 0, 0, - 9481, 65555, 0, 66628, 129126, 1195, 64898, 0, 0, 0, 2010, 0, 0, 0, 0, 0, - 0, 4360, 127009, 9739, 0, 72885, 0, 0, 0, 126265, 72200, 0, 0, 0, 72199, - 0, 0, 65734, 0, 0, 0, 13075, 0, 94063, 0, 43532, 10837, 2492, 74516, - 983075, 120882, 0, 0, 11813, 9649, 0, 119617, 5128, 7377, 0, 65604, 0, 0, - 6771, 1648, 7819, 0, 0, 0, 125192, 128131, 12709, 6986, 0, 0, 0, 0, 0, - 12581, 0, 5175, 0, 73806, 0, 128420, 0, 0, 77950, 0, 0, 607, 0, 0, - 128846, 119605, 0, 129528, 65477, 0, 121130, 0, 8265, 0, 0, 0, 5840, - 42838, 0, 0, 68366, 0, 119255, 0, 0, 0, 127929, 0, 2550, 121011, 6779, - 70059, 0, 0, 0, 0, 0, 0, 5619, 65822, 0, 0, 0, 129392, 5616, 11486, 0, 0, - 0, 0, 5615, 0, 121319, 42380, 127958, 0, 66451, 74407, 0, 11347, 0, 1026, - 5620, 0, 0, 11350, 5617, 0, 0, 64639, 0, 0, 0, 1338, 0, 0, 0, 4603, 0, - 70715, 92484, 0, 9002, 0, 3974, 78213, 0, 0, 0, 0, 0, 0, 75038, 66040, - 70455, 0, 0, 0, 72982, 0, 0, 0, 0, 0, 0, 0, 0, 119105, 0, 0, 0, 0, 0, - 128883, 0, 66897, 0, 0, 0, 42594, 0, 0, 0, 0, 6714, 10083, 0, 121019, 0, - 69976, 0, 0, 9073, 0, 64302, 0, 128286, 9725, 0, 0, 121288, 73769, - 121306, 0, 9570, 0, 11500, 2689, 917626, 0, 983794, 66740, 0, 0, 0, - 917623, 13286, 5500, 42598, 42596, 503, 0, 0, 917618, 0, 0, 0, 0, 917615, - 1652, 772, 6688, 8310, 0, 0, 72124, 0, 10194, 43542, 0, 125054, 0, 6468, - 68110, 0, 917606, 11767, 0, 0, 5836, 12358, 0, 0, 65624, 12180, 0, - 127994, 0, 43699, 0, 0, 72114, 43706, 0, 12362, 12435, 12360, 0, 9020, 0, - 12356, 8616, 0, 42924, 2227, 0, 0, 7315, 12354, 83097, 83098, 83099, - 2358, 83092, 83093, 83094, 0, 0, 83089, 83090, 0, 11759, 71723, 0, 72834, - 83109, 41423, 0, 83103, 83104, 83105, 42237, 110653, 70717, 72260, 83102, - 0, 67856, 0, 128534, 110657, 129354, 129194, 0, 64395, 0, 73008, 120897, - 74816, 0, 0, 0, 83088, 0, 0, 94064, 83083, 83085, 83086, 83087, 83079, - 83080, 2041, 9178, 0, 64870, 0, 83076, 74924, 0, 0, 0, 0, 0, 78739, 0, 0, - 0, 0, 0, 0, 3726, 0, 0, 0, 0, 0, 121432, 129457, 0, 0, 0, 0, 0, 74901, 0, - 0, 0, 0, 0, 124944, 113781, 0, 7410, 2669, 903, 0, 0, 0, 127232, 74603, - 0, 128264, 0, 128411, 0, 0, 11732, 0, 72797, 41448, 41461, 124934, 0, - 917558, 0, 8819, 0, 0, 74606, 0, 121412, 74835, 0, 9168, 65786, 0, 73691, - 0, 67665, 0, 11758, 68425, 0, 0, 0, 128044, 0, 19924, 67312, 0, 128755, - 64551, 0, 8516, 0, 0, 7561, 983980, 74018, 0, 0, 0, 0, 83074, 83075, 0, - 11233, 83062, 83066, 3787, 83070, 83055, 41458, 83059, 41463, 65308, - 41459, 8683, 775, 0, 65584, 69923, 0, 110798, 110799, 110796, 43440, 0, - 0, 0, 3656, 0, 0, 0, 67694, 1599, 83138, 83139, 8514, 8513, 83036, 83135, - 83136, 110794, 110795, 83131, 83132, 0, 0, 0, 11684, 10542, 9937, 83150, - 0, 75037, 83145, 65730, 83147, 0, 8427, 83142, 55246, 0, 0, 11497, 0, 0, - 0, 119222, 0, 983598, 0, 10621, 0, 0, 129295, 119111, 120745, 0, 0, 0, - 11648, 83126, 83127, 42118, 83129, 83122, 65512, 83124, 83125, 0, 0, 0, - 83121, 74530, 128456, 0, 0, 0, 65724, 0, 0, 0, 65727, 0, 0, 64963, 73830, - 66042, 0, 0, 7875, 0, 0, 0, 0, 0, 0, 536, 0, 0, 0, 0, 65173, 129122, 0, - 70331, 0, 0, 0, 0, 129419, 0, 0, 0, 1687, 0, 0, 0, 0, 0, 0, 10526, 0, - 8323, 0, 83301, 11731, 0, 0, 65460, 12242, 0, 0, 10843, 11554, 0, 0, - 8266, 0, 121101, 0, 0, 0, 0, 67667, 0, 119155, 0, 0, 119636, 67857, 0, 0, - 0, 11755, 66305, 0, 0, 10917, 93979, 113688, 0, 2040, 92596, 0, 0, 0, 0, - 1227, 83119, 83120, 0, 0, 83115, 83116, 11149, 4978, 83111, 1984, 11830, - 83114, 128934, 74548, 0, 9373, 0, 0, 0, 0, 0, 0, 0, 0, 9237, 9390, 0, 0, - 0, 0, 0, 1830, 0, 0, 0, 0, 0, 128577, 983820, 68086, 0, 0, 0, 983059, 0, - 983144, 0, 0, 0, 72197, 55291, 11683, 0, 0, 0, 11451, 0, 72714, 3731, - 2359, 0, 67844, 0, 121503, 548, 121502, 983245, 121405, 983248, 0, 66272, - 0, 64678, 0, 9547, 0, 0, 1614, 0, 0, 66307, 128092, 1358, 120871, 428, 0, - 1466, 0, 10982, 0, 0, 0, 407, 0, 0, 0, 0, 0, 0, 5804, 73464, 0, 0, 0, - 70167, 9057, 42446, 0, 125097, 0, 0, 8250, 10952, 8048, 0, 129155, 0, - 118955, 0, 0, 126586, 4407, 74648, 0, 0, 0, 8448, 92491, 0, 0, 12675, - 12659, 0, 0, 983280, 68077, 55273, 10766, 12012, 2386, 0, 9170, 0, 9123, - 128194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8709, 0, 983585, 0, 0, 0, 0, 0, - 0, 0, 128342, 0, 577, 128610, 0, 0, 124999, 68087, 74840, 126474, 127036, - 0, 0, 0, 1414, 124963, 9683, 43486, 92231, 0, 2536, 0, 66330, 0, 0, 0, 0, - 0, 0, 0, 66317, 0, 66315, 66316, 0, 0, 0, 0, 0, 0, 0, 0, 66323, 66324, 0, - 0, 3106, 65917, 0, 0, 0, 891, 0, 0, 42624, 0, 0, 8824, 65089, 0, 10936, - 0, 0, 0, 0, 92688, 0, 0, 0, 0, 12745, 0, 0, 41285, 3547, 0, 0, 0, 0, 0, - 6089, 0, 68490, 120578, 4170, 1029, 127761, 0, 0, 42374, 0, 744, 917624, - 0, 0, 0, 93046, 0, 3551, 0, 0, 4623, 0, 0, 12340, 0, 65136, 0, 0, 0, 0, - 0, 0, 0, 72291, 0, 0, 120778, 0, 11972, 0, 78757, 0, 122886, 177, 122894, - 0, 0, 0, 0, 55243, 0, 0, 0, 70172, 120249, 120242, 128027, 120243, 0, 0, - 0, 120237, 120245, 94079, 0, 0, 9136, 120240, 120614, 41280, 0, 0, 0, 0, - 74149, 128327, 0, 0, 66361, 12601, 72194, 64360, 65163, 0, 0, 0, 0, 0, 0, - 5404, 43332, 3667, 7936, 12925, 0, 0, 0, 0, 0, 10874, 65505, 0, 0, 0, 0, - 128920, 983662, 0, 0, 0, 0, 0, 0, 0, 0, 66677, 0, 0, 0, 70088, 74148, 0, - 0, 72868, 120230, 120224, 74172, 0, 0, 94096, 0, 128414, 120636, 0, - 127519, 917609, 917616, 0, 128652, 0, 0, 11441, 0, 3512, 0, 0, 43597, 0, - 0, 72734, 68153, 41563, 0, 0, 129352, 41544, 0, 0, 0, 0, 129177, 0, 0, 0, - 118908, 0, 78108, 67396, 73804, 64711, 0, 0, 917610, 0, 0, 0, 11557, - 127776, 0, 12079, 0, 0, 0, 0, 128861, 0, 0, 0, 0, 0, 983200, 8103, 72303, - 128174, 92486, 110698, 0, 64587, 0, 0, 124961, 0, 0, 0, 126481, 0, 0, 0, - 0, 0, 70348, 1450, 0, 1340, 0, 0, 128970, 0, 0, 125117, 0, 0, 0, 0, 6539, - 92948, 0, 128213, 125060, 0, 0, 0, 3973, 0, 70504, 121193, 7982, 0, 0, - 127194, 0, 0, 0, 128408, 118968, 6417, 120619, 0, 0, 0, 0, 129455, 4919, - 65121, 110872, 7755, 0, 0, 64548, 0, 1621, 0, 0, 0, 0, 0, 12188, 0, 0, 0, - 0, 5015, 0, 0, 42590, 70354, 1756, 0, 0, 0, 120694, 0, 0, 7555, 73874, - 5408, 2817, 1214, 69919, 0, 983125, 0, 0, 125055, 127195, 7957, 0, 0, - 1056, 74944, 0, 0, 0, 0, 7073, 74979, 0, 70853, 0, 110874, 0, 0, 2341, - 126644, 8484, 0, 0, 68322, 0, 8461, 67721, 42269, 0, 0, 43709, 43708, - 9451, 7571, 13073, 43847, 126647, 0, 983258, 0, 0, 0, 8781, 12894, 78134, - 0, 92288, 0, 0, 78184, 0, 11338, 120768, 0, 0, 0, 0, 0, 121367, 65021, - 64795, 74574, 0, 10047, 0, 0, 0, 0, 0, 0, 119181, 163, 576, 9895, 0, 0, - 74591, 0, 0, 66888, 0, 0, 0, 0, 0, 0, 7017, 128111, 0, 0, 0, 0, 41591, + 0, 129443, 0, 68455, 42863, 73839, 0, 0, 0, 0, 0, 0, 0, 612, 110875, + 110876, 72231, 10538, 0, 1674, 0, 0, 0, 12280, 0, 540, 74550, 0, 66422, + 8432, 0, 11073, 0, 64316, 129894, 0, 7388, 0, 0, 0, 0, 126107, 0, 3359, + 0, 0, 67284, 0, 0, 65482, 129589, 0, 64742, 129304, 0, 0, 74273, 0, + 19941, 0, 0, 0, 0, 9481, 65555, 0, 66628, 129126, 1195, 64898, 0, 0, 0, + 2010, 0, 0, 0, 0, 0, 0, 4360, 127009, 9739, 0, 72885, 0, 0, 0, 126265, + 72200, 0, 0, 0, 72199, 0, 0, 65734, 0, 0, 129690, 13075, 0, 94063, 0, + 43532, 10837, 2492, 74516, 983075, 120882, 0, 0, 11813, 9649, 0, 119617, + 5128, 7377, 0, 65604, 0, 0, 6771, 1648, 7819, 0, 0, 0, 125192, 128131, + 12709, 6986, 0, 0, 0, 0, 0, 12581, 0, 5175, 0, 73806, 0, 128420, 0, 0, + 77950, 0, 0, 607, 0, 0, 128846, 119605, 0, 129528, 65477, 0, 121130, 0, + 8265, 0, 0, 0, 5840, 42838, 0, 0, 68366, 0, 119255, 0, 0, 0, 127929, 0, + 2550, 121011, 6779, 70059, 0, 0, 0, 0, 0, 0, 5619, 65822, 0, 0, 0, + 129392, 5616, 11486, 0, 0, 0, 0, 5615, 0, 121319, 42380, 127958, 0, + 66451, 74407, 0, 11347, 0, 1026, 5620, 0, 0, 11350, 5617, 0, 0, 64639, 0, + 0, 0, 1338, 0, 0, 0, 4603, 0, 70715, 92484, 0, 9002, 0, 3974, 78213, 0, + 0, 0, 0, 0, 0, 75038, 66040, 70455, 0, 0, 0, 72982, 0, 0, 0, 0, 0, 0, 0, + 0, 119105, 0, 0, 0, 0, 0, 128883, 0, 66897, 0, 0, 0, 42594, 0, 0, 0, 0, + 6714, 10083, 0, 121019, 0, 69976, 0, 0, 9073, 0, 64302, 0, 128286, 9725, + 0, 0, 121288, 73769, 121306, 0, 9570, 0, 11500, 2689, 917626, 0, 983794, + 66740, 0, 0, 0, 917623, 13286, 5500, 42598, 42596, 503, 0, 0, 917618, 0, + 0, 0, 0, 917615, 1652, 772, 6688, 8310, 0, 0, 72124, 0, 10194, 43542, 0, + 125054, 0, 6468, 68110, 0, 917606, 11767, 0, 0, 5836, 12358, 0, 0, 65624, + 12180, 0, 127994, 0, 43699, 0, 0, 72114, 43706, 0, 12362, 12435, 12360, + 0, 9020, 0, 12356, 8616, 0, 42924, 2227, 0, 0, 7315, 12354, 83097, 83098, + 83099, 2358, 83092, 83093, 83094, 0, 0, 83089, 83090, 0, 11759, 71723, 0, + 72834, 83109, 41423, 0, 83103, 83104, 83105, 42237, 110653, 70717, 72260, + 83102, 0, 67856, 0, 128534, 110657, 129354, 129194, 0, 64395, 0, 73008, + 120897, 74816, 0, 0, 0, 83088, 0, 0, 94064, 83083, 83085, 83086, 83087, + 83079, 83080, 2041, 9178, 0, 64870, 0, 83076, 74924, 0, 0, 0, 0, 0, + 78739, 0, 0, 0, 0, 0, 0, 3726, 0, 0, 0, 0, 0, 121432, 129457, 0, 0, 0, 0, + 0, 74901, 0, 0, 0, 0, 0, 124944, 113781, 0, 7410, 2669, 903, 0, 0, 0, + 127232, 74603, 0, 128264, 0, 128411, 0, 0, 11732, 0, 72797, 41448, 41461, + 124934, 0, 917558, 0, 8819, 0, 0, 74606, 0, 121412, 74835, 0, 9168, + 65786, 0, 73691, 0, 67665, 0, 11758, 68425, 0, 0, 0, 128044, 0, 19924, + 67312, 0, 128755, 64551, 0, 8516, 0, 0, 7561, 983980, 74018, 0, 0, 0, 0, + 83074, 83075, 0, 11233, 83062, 83066, 3787, 83070, 83055, 41458, 83059, + 41463, 65308, 41459, 8683, 775, 0, 65584, 69923, 0, 110798, 110799, + 110796, 43440, 0, 0, 0, 3656, 0, 0, 0, 67694, 1599, 83138, 83139, 8514, + 8513, 83036, 83135, 83136, 110794, 110795, 83131, 83132, 0, 0, 0, 11684, + 10542, 9937, 83150, 0, 75037, 83145, 65730, 83147, 0, 8427, 83142, 55246, + 0, 0, 11497, 0, 0, 0, 119222, 0, 983598, 0, 10621, 0, 0, 129295, 119111, + 120745, 0, 0, 0, 11648, 83126, 83127, 42118, 83129, 83122, 65512, 83124, + 83125, 0, 0, 0, 83121, 74530, 128456, 0, 0, 0, 65724, 0, 0, 0, 65727, 0, + 0, 64963, 73830, 66042, 0, 0, 7875, 0, 0, 0, 0, 0, 0, 536, 0, 0, 0, 0, + 65173, 129122, 0, 70331, 0, 0, 0, 0, 129419, 0, 0, 0, 1687, 0, 0, 0, 0, + 0, 0, 10526, 0, 8323, 0, 83301, 11731, 0, 0, 65460, 12242, 0, 0, 10843, + 11554, 0, 0, 8266, 0, 121101, 0, 0, 0, 0, 67667, 0, 119155, 0, 0, 119636, + 67857, 0, 0, 0, 11755, 66305, 0, 0, 10917, 93979, 113688, 0, 2040, 92596, + 0, 0, 0, 0, 1227, 83119, 83120, 0, 0, 83115, 83116, 11149, 4978, 83111, + 1984, 11830, 83114, 128934, 74548, 0, 9373, 0, 0, 0, 0, 0, 0, 0, 0, 9237, + 9390, 0, 0, 0, 0, 0, 1830, 0, 0, 0, 0, 0, 128577, 983820, 68086, 0, 0, 0, + 983059, 0, 983144, 0, 0, 0, 72197, 55291, 11683, 0, 0, 0, 11451, 0, + 72714, 3731, 2359, 0, 67844, 0, 121503, 548, 121502, 983245, 121405, + 983248, 0, 66272, 0, 64678, 0, 9547, 0, 0, 1614, 0, 0, 66307, 128092, + 1358, 120871, 428, 0, 1466, 0, 10982, 0, 0, 0, 407, 0, 0, 0, 0, 0, 0, + 5804, 73464, 0, 0, 0, 70167, 9057, 42446, 0, 125097, 0, 0, 8250, 10952, + 8048, 0, 129155, 0, 118955, 0, 0, 126586, 4407, 74648, 0, 0, 0, 8448, + 92491, 0, 0, 12675, 12659, 0, 0, 983280, 68077, 55273, 10766, 12012, + 2386, 0, 9170, 0, 9123, 128194, 0, 0, 0, 0, 129942, 0, 0, 0, 0, 0, 0, + 8709, 0, 983581, 0, 0, 0, 0, 0, 0, 0, 128342, 0, 577, 128610, 0, 0, + 124999, 68087, 74840, 126474, 127036, 0, 0, 0, 1414, 124963, 9683, 43486, + 92231, 0, 2536, 0, 66330, 0, 0, 0, 0, 0, 0, 0, 66317, 0, 66315, 66316, 0, + 0, 0, 0, 0, 0, 0, 0, 66323, 66324, 0, 0, 3106, 65917, 0, 0, 0, 891, 0, 0, + 42624, 0, 0, 8824, 65089, 0, 10936, 0, 0, 0, 0, 92688, 0, 0, 0, 0, 12745, + 0, 0, 41285, 3547, 0, 0, 129877, 0, 0, 6089, 0, 68490, 120578, 4170, + 1029, 127761, 0, 0, 42374, 0, 744, 917624, 0, 0, 0, 93046, 0, 3551, 0, 0, + 4623, 0, 0, 12340, 0, 65136, 0, 0, 0, 0, 0, 0, 0, 72291, 0, 0, 120778, 0, + 11972, 0, 78757, 0, 122886, 177, 122894, 0, 0, 0, 0, 55243, 0, 0, 0, + 70172, 120249, 120242, 128027, 120243, 0, 0, 0, 120237, 120245, 94079, 0, + 0, 9136, 120240, 120614, 41280, 0, 0, 0, 0, 74149, 128327, 0, 0, 66361, + 12601, 72194, 64360, 65163, 0, 0, 0, 0, 0, 0, 5404, 43332, 3667, 7936, + 12925, 0, 0, 0, 0, 0, 10874, 65505, 0, 0, 0, 0, 128920, 983662, 0, 0, 0, + 0, 0, 0, 0, 0, 66677, 0, 0, 0, 70088, 74148, 0, 0, 72868, 120230, 120224, + 74172, 0, 0, 94096, 0, 128414, 120636, 0, 127519, 917609, 917616, 0, + 128652, 0, 0, 11441, 0, 3512, 0, 0, 43597, 0, 0, 72734, 68153, 41563, 0, + 0, 129352, 41544, 0, 0, 0, 0, 129177, 0, 0, 0, 118908, 0, 78108, 67396, + 73804, 64711, 0, 0, 917610, 0, 0, 0, 11557, 127776, 0, 12079, 0, 0, 0, 0, + 128861, 0, 0, 0, 0, 0, 983200, 8103, 72303, 128174, 92486, 110698, 0, + 64587, 0, 0, 124961, 0, 0, 0, 126481, 0, 0, 0, 0, 0, 70348, 1450, 0, + 1340, 0, 0, 128970, 0, 0, 125117, 0, 0, 0, 0, 6539, 92948, 0, 128213, + 125060, 0, 0, 0, 3973, 0, 70504, 121193, 7982, 0, 0, 127194, 0, 0, 0, + 128408, 118968, 6417, 120619, 129748, 0, 0, 0, 129455, 4919, 65121, + 110872, 7755, 0, 0, 64548, 0, 1621, 0, 0, 0, 0, 0, 12188, 0, 0, 0, 0, + 5015, 0, 0, 42590, 70354, 1756, 0, 0, 0, 120694, 0, 0, 7555, 73874, 5408, + 2817, 1214, 69919, 0, 983125, 0, 0, 125055, 127195, 7957, 0, 0, 1056, + 74944, 0, 0, 0, 0, 7073, 74979, 0, 70853, 0, 110874, 0, 0, 2341, 126644, + 8484, 0, 0, 68322, 0, 8461, 67721, 42269, 0, 0, 43709, 43708, 9451, 7571, + 13073, 43847, 126647, 0, 983258, 0, 0, 0, 8781, 12894, 78134, 0, 92288, + 0, 0, 78184, 0, 11338, 120768, 0, 0, 0, 0, 0, 121367, 65021, 64795, + 74574, 0, 10047, 0, 0, 0, 0, 0, 0, 119181, 163, 576, 9895, 0, 0, 74591, + 0, 0, 66888, 0, 0, 0, 0, 0, 0, 7017, 128111, 0, 0, 129922, 0, 41591, 11036, 65252, 120795, 129488, 0, 0, 0, 0, 0, 0, 8887, 0, 7295, 71203, 0, - 127221, 0, 0, 0, 0, 8755, 0, 0, 8147, 73127, 0, 0, 0, 0, 129377, 0, + 127221, 0, 0, 0, 0, 8755, 0, 0, 8147, 73127, 0, 0, 121348, 0, 129377, 0, 74499, 0, 0, 0, 4619, 0, 6654, 123192, 0, 0, 0, 65689, 10128, 0, 129612, 0, 0, 92651, 0, 2401, 0, 8792, 0, 0, 74980, 0, 92246, 0, 0, 0, 12886, 0, 66624, 0, 0, 74133, 65170, 0, 74135, 0, 0, 9984, 73867, 3010, 0, 70349, 10698, 41475, 0, 119151, 0, 119152, 0, 0, 9100, 0, 0, 0, 78116, 64780, 2001, 0, 55230, 0, 4052, 0, 7626, 78080, 0, 0, 0, 41477, 0, 0, 0, 43707, - 74127, 0, 0, 0, 78086, 73758, 2335, 10663, 0, 0, 0, 119602, 0, 0, 70325, - 0, 41443, 0, 0, 0, 9711, 1523, 0, 0, 41445, 0, 0, 8567, 41442, 12821, 0, - 0, 118978, 0, 65274, 0, 94082, 0, 127515, 0, 0, 43446, 0, 0, 0, 0, - 127985, 0, 10206, 127167, 6375, 2673, 0, 0, 0, 43219, 129355, 0, 0, 0, 0, - 0, 11799, 0, 68466, 0, 0, 0, 0, 0, 120736, 0, 7203, 0, 0, 70361, 129077, - 120615, 127216, 0, 0, 0, 0, 43121, 0, 128366, 72161, 0, 0, 0, 121260, - 73781, 70365, 0, 68039, 70446, 10057, 0, 0, 0, 127399, 120963, 0, 2307, - 0, 0, 0, 0, 73873, 0, 94035, 0, 0, 0, 0, 0, 7327, 0, 0, 440, 0, 0, 68613, - 75059, 0, 0, 9957, 0, 0, 8046, 0, 119158, 0, 0, 68609, 0, 129405, 1521, - 129460, 92256, 65344, 0, 11850, 68737, 0, 0, 68914, 7303, 65770, 5243, 0, - 5239, 65771, 121429, 0, 5237, 0, 68756, 0, 5247, 0, 0, 0, 12873, 5764, 0, - 0, 3008, 118981, 128102, 0, 0, 55231, 41103, 0, 92756, 0, 0, 92717, - 70074, 7872, 74886, 917567, 8731, 65378, 0, 0, 11316, 128163, 126600, - 70360, 3019, 9997, 0, 0, 9456, 129545, 0, 0, 129555, 0, 0, 92682, 4281, - 0, 0, 0, 118982, 0, 69993, 78096, 0, 78095, 0, 78098, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2134, 0, 10116, 9877, 70679, 0, 0, 92723, 8379, 0, 6778, 0, 0, - 8243, 0, 0, 0, 0, 128008, 0, 0, 0, 983630, 119668, 0, 92722, 983098, - 5637, 125115, 0, 0, 120479, 0, 113730, 0, 0, 194990, 64432, 0, 70363, - 121368, 1156, 68052, 0, 0, 120482, 0, 68030, 0, 0, 0, 7634, 0, 0, 65536, - 0, 0, 0, 7702, 0, 78890, 0, 65779, 65783, 195066, 120961, 5700, 0, 0, - 92161, 2339, 92476, 5697, 0, 0, 0, 74923, 0, 5696, 92677, 0, 3862, 0, 0, - 0, 983055, 0, 0, 0, 0, 5701, 9722, 41490, 41370, 5698, 0, 0, 0, 42204, - 55270, 8571, 0, 0, 43859, 0, 78731, 0, 12184, 0, 0, 0, 0, 0, 5650, 0, - 64712, 120474, 0, 120458, 5647, 120473, 7387, 0, 92675, 11477, 5646, 0, - 11018, 0, 0, 0, 0, 0, 0, 0, 128459, 126128, 5651, 0, 0, 0, 5648, 0, - 120920, 0, 127517, 3545, 0, 6984, 0, 0, 0, 69414, 126613, 0, 10123, 0, 0, - 0, 0, 65020, 74885, 119166, 0, 0, 0, 0, 0, 1140, 78426, 0, 0, 0, 0, 8128, - 9889, 0, 0, 1815, 0, 890, 0, 3267, 0, 0, 0, 0, 4410, 125081, 10576, 8102, - 0, 580, 74232, 0, 0, 0, 0, 0, 19938, 0, 0, 0, 0, 3298, 6546, 0, 0, 0, 0, - 6134, 41246, 0, 0, 0, 917770, 0, 6264, 0, 0, 0, 0, 0, 0, 69445, 0, 0, 0, - 92697, 11915, 10377, 0, 10072, 0, 0, 2329, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 125136, 0, 11201, 92708, 74769, 0, 13263, 0, 0, 92404, 126066, 73822, 0, - 0, 64917, 0, 0, 494, 128026, 0, 65098, 0, 956, 125265, 129556, 0, 73740, - 0, 0, 0, 74281, 128638, 0, 0, 69217, 120930, 0, 0, 0, 0, 0, 43088, 0, - 126269, 100948, 0, 65229, 0, 0, 0, 0, 0, 0, 3907, 118833, 64526, 11829, - 68197, 0, 0, 11475, 70329, 3020, 42264, 0, 0, 0, 7098, 0, 0, 127967, 957, - 42696, 0, 3016, 0, 0, 0, 0, 0, 121248, 92510, 3006, 4620, 0, 0, 0, 0, - 129369, 129425, 0, 0, 0, 126246, 8626, 0, 128824, 0, 65377, 0, 983102, - 42920, 1698, 0, 64477, 0, 0, 43813, 100432, 100431, 100434, 100433, - 100436, 70321, 100438, 100437, 100440, 100439, 0, 121024, 0, 70327, - 100441, 55252, 100443, 100442, 100445, 100444, 66641, 100446, 100449, - 100448, 0, 100450, 113820, 74866, 64375, 0, 127850, 129477, 0, 0, 0, 0, - 983780, 0, 0, 120827, 0, 0, 123637, 0, 0, 0, 0, 8110, 100421, 0, 100423, - 5830, 100425, 100424, 100427, 100426, 100429, 100428, 42389, 78611, - 121398, 0, 0, 0, 0, 0, 0, 0, 83342, 983935, 0, 127147, 119187, 2135, - 11836, 0, 0, 78869, 42313, 5579, 0, 70384, 983082, 94002, 0, 5578, 11840, - 73006, 42023, 69849, 5669, 92559, 0, 0, 68833, 917845, 128275, 5583, 0, - 0, 42426, 5580, 42276, 0, 892, 2220, 42465, 74313, 73440, 5795, 194991, - 68774, 65702, 68770, 0, 65695, 0, 65710, 128399, 0, 0, 68783, 0, 0, 0, - 1638, 10966, 0, 917547, 0, 0, 0, 0, 0, 8172, 0, 0, 0, 0, 0, 0, 6374, 0, - 0, 120972, 0, 0, 0, 0, 0, 0, 0, 72204, 64900, 7153, 65785, 68826, 0, - 3015, 68743, 68740, 68738, 68805, 6400, 68749, 68748, 68760, 68758, - 11276, 68754, 100420, 372, 128829, 68761, 118874, 0, 41585, 128202, 0, - 74228, 276, 0, 74234, 0, 74226, 0, 9007, 0, 41588, 125001, 119189, 10763, - 0, 0, 0, 126097, 68525, 6257, 73112, 100393, 100396, 100395, 100398, - 92409, 100400, 100399, 0, 74848, 0, 983592, 100401, 66498, 100403, - 100402, 64790, 73454, 100407, 100406, 70356, 100408, 0, 100410, 66829, - 70817, 5711, 41633, 12098, 65571, 9166, 0, 5710, 0, 6790, 65213, 0, 0, 0, - 69726, 0, 73817, 0, 0, 5715, 0, 70408, 0, 5712, 100382, 41620, 100384, - 3074, 5722, 100389, 100388, 73768, 0, 118906, 0, 0, 0, 66419, 119992, 0, - 0, 0, 0, 128903, 78607, 0, 129074, 0, 0, 0, 0, 0, 0, 113682, 0, 11261, 0, - 0, 0, 8701, 0, 11236, 0, 129490, 100390, 0, 0, 0, 78293, 0, 0, 0, 64946, - 0, 0, 0, 70336, 0, 0, 93986, 68814, 42902, 0, 0, 0, 0, 92344, 0, 67845, - 42641, 71444, 0, 0, 70366, 0, 100369, 100368, 5084, 100370, 0, 118861, 0, - 733, 74646, 0, 0, 0, 125085, 0, 9218, 0, 100380, 100379, 71070, 0, 0, 0, - 0, 70323, 0, 0, 5155, 0, 0, 983756, 0, 0, 72351, 0, 0, 0, 122891, 0, 0, - 0, 100372, 100371, 100374, 100373, 100376, 100375, 100378, 100377, 4974, - 100357, 100360, 100359, 0, 0, 0, 12205, 0, 0, 64507, 0, 0, 0, 0, 0, 0, - 12149, 13088, 78290, 0, 12241, 0, 0, 0, 6932, 100352, 73676, 100354, + 74127, 0, 0, 0, 78086, 73758, 2335, 10663, 0, 0, 129872, 119602, 0, 0, + 70325, 0, 41443, 0, 0, 0, 9711, 1523, 0, 0, 41445, 0, 0, 8567, 41442, + 12821, 0, 0, 118978, 0, 65274, 0, 94082, 0, 127515, 0, 0, 43446, 0, 0, 0, + 0, 127985, 0, 10206, 127167, 6375, 2673, 0, 0, 0, 43219, 129355, 0, 0, 0, + 0, 129400, 11799, 101225, 68466, 0, 0, 0, 0, 0, 120736, 0, 7203, 0, 0, + 70361, 127213, 120615, 127216, 0, 0, 0, 0, 43121, 0, 128366, 72161, 0, + 129868, 0, 121260, 73781, 70365, 0, 68039, 70446, 10057, 0, 0, 0, 101219, + 120963, 101220, 2307, 0, 0, 0, 0, 73873, 0, 94035, 0, 0, 0, 0, 129983, + 7327, 0, 0, 440, 0, 0, 68613, 75059, 0, 0, 9957, 0, 0, 8046, 0, 119158, + 0, 0, 68609, 0, 129405, 1521, 129460, 92256, 65344, 0, 11850, 68737, 0, + 0, 68914, 7303, 65770, 5243, 0, 5239, 65771, 121429, 0, 5237, 0, 68756, + 0, 5247, 0, 0, 0, 12873, 5764, 0, 0, 3008, 118981, 128102, 0, 0, 55231, + 41103, 0, 92756, 0, 0, 92717, 70074, 7872, 74886, 917567, 8731, 65378, 0, + 0, 11316, 128163, 126600, 70360, 3019, 9997, 0, 0, 9456, 129545, 0, 0, + 101192, 0, 0, 92682, 4281, 0, 0, 0, 118982, 0, 69993, 78096, 0, 78095, 0, + 78098, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2134, 0, 10116, 9877, 70679, 0, 0, + 92723, 8379, 0, 6778, 0, 0, 8243, 0, 0, 0, 0, 128008, 0, 0, 0, 983630, + 119668, 129962, 92722, 983098, 5637, 125115, 0, 0, 120479, 0, 113730, 0, + 0, 194990, 64432, 0, 70363, 121368, 1156, 68052, 0, 0, 120482, 0, 68030, + 0, 0, 0, 7634, 0, 0, 65536, 0, 0, 0, 7702, 0, 78890, 0, 65779, 65783, + 195066, 120961, 5700, 0, 0, 92161, 2339, 92476, 5697, 0, 0, 0, 74923, 0, + 5696, 92677, 0, 3862, 0, 0, 0, 983055, 0, 0, 0, 0, 5701, 9722, 41490, + 41370, 5698, 0, 0, 0, 42204, 55270, 8571, 0, 0, 43859, 0, 78731, 0, + 12184, 0, 0, 0, 0, 0, 5650, 0, 64712, 120474, 0, 120458, 5647, 120473, + 7387, 0, 92675, 11477, 5646, 0, 11018, 0, 0, 0, 0, 0, 0, 69280, 128459, + 126128, 5651, 0, 0, 0, 5648, 0, 120920, 0, 127517, 3545, 0, 6984, 0, 0, + 0, 69414, 126613, 0, 10123, 0, 69274, 0, 0, 65020, 74885, 119166, 0, 0, + 0, 0, 0, 1140, 78426, 0, 0, 0, 0, 8128, 9889, 0, 0, 1815, 0, 890, 0, + 3267, 0, 0, 0, 983667, 4410, 125081, 10576, 8102, 0, 580, 74232, 0, 0, 0, + 0, 0, 19938, 0, 0, 0, 0, 3298, 6546, 0, 0, 0, 0, 6134, 41246, 0, 0, 0, + 917770, 0, 6264, 0, 0, 0, 0, 0, 0, 69445, 0, 0, 0, 92697, 11915, 10377, + 0, 10072, 0, 0, 2329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101164, 0, 11201, 92708, + 74769, 0, 13263, 0, 0, 92404, 126066, 73822, 0, 0, 64917, 0, 0, 494, + 128026, 0, 65098, 0, 956, 125265, 129556, 0, 73740, 0, 0, 0, 74281, + 128638, 0, 0, 69217, 120930, 0, 0, 0, 0, 0, 9922, 0, 126269, 100948, 0, + 65229, 0, 0, 0, 0, 0, 0, 3907, 118833, 64526, 11829, 68197, 0, 0, 11475, + 70329, 3020, 42264, 0, 0, 0, 7098, 0, 0, 127967, 957, 42696, 0, 3016, 0, + 0, 0, 0, 0, 121248, 92510, 3006, 4620, 0, 0, 0, 0, 129369, 129425, 0, 0, + 0, 126246, 8626, 0, 128824, 0, 65377, 0, 983102, 42920, 1698, 0, 64477, + 0, 0, 43813, 100432, 100431, 100434, 100433, 100436, 70321, 100438, + 100437, 100440, 100439, 0, 121024, 0, 70327, 100441, 55252, 100443, + 100442, 100445, 100444, 66641, 100446, 100449, 100448, 0, 100450, 113820, + 74866, 64375, 0, 127850, 129477, 0, 0, 0, 0, 983780, 0, 0, 120827, 0, 0, + 123637, 0, 0, 0, 101183, 8110, 100421, 0, 100423, 5830, 100425, 100424, + 100427, 100426, 100429, 100428, 42389, 78611, 121398, 0, 0, 0, 0, 0, 0, + 0, 83342, 983935, 0, 127147, 119187, 2135, 11836, 0, 0, 78869, 42313, + 5579, 0, 70384, 983082, 94002, 0, 5578, 11840, 73006, 42023, 69849, 5669, + 92559, 0, 0, 68833, 917845, 128275, 5583, 0, 0, 42426, 5580, 42276, 0, + 892, 2220, 42465, 74313, 73440, 5795, 194991, 68774, 65702, 68770, 0, + 65695, 0, 65710, 128399, 0, 0, 68783, 0, 0, 0, 1638, 10966, 0, 917547, 0, + 118921, 0, 0, 0, 8172, 0, 0, 0, 0, 0, 0, 6374, 0, 0, 120972, 0, 0, 0, 0, + 0, 0, 0, 72204, 64900, 7153, 65785, 68826, 0, 3015, 68743, 68740, 68738, + 68805, 6400, 68749, 68748, 68760, 68758, 11276, 68754, 100420, 372, + 101138, 68761, 118874, 0, 41585, 128202, 0, 74228, 276, 129895, 74234, 0, + 74226, 0, 9007, 0, 41588, 125001, 119189, 10763, 0, 0, 983560, 126097, + 68525, 6257, 73112, 100393, 100396, 100395, 100398, 92409, 100400, + 100399, 101148, 74848, 120006, 983592, 100401, 66498, 100403, 100402, + 64790, 73454, 100407, 100406, 70356, 100408, 0, 100410, 66829, 70817, + 5711, 41633, 12098, 65571, 9166, 0, 5710, 0, 6790, 65213, 0, 0, 0, 69726, + 0, 73817, 0, 0, 5715, 0, 70408, 0, 5712, 100382, 41620, 100384, 3074, + 5722, 100389, 100388, 73768, 0, 118906, 0, 0, 0, 66419, 71972, 0, 0, 0, + 0, 128903, 78607, 0, 129074, 0, 0, 0, 0, 0, 0, 113682, 0, 11261, 0, 0, 0, + 8701, 0, 11236, 0, 129490, 100390, 0, 0, 0, 78293, 0, 0, 0, 64946, 0, 0, + 0, 70336, 0, 0, 93986, 68814, 42902, 0, 0, 0, 0, 92344, 0, 67845, 42641, + 71444, 0, 0, 70366, 101152, 100369, 100368, 5084, 100370, 101158, 118861, + 0, 733, 74646, 0, 0, 0, 125085, 0, 9218, 0, 100380, 100379, 71070, 0, 0, + 0, 0, 70323, 0, 0, 5155, 0, 0, 983756, 0, 0, 72351, 0, 0, 0, 122891, 0, + 0, 0, 100372, 100371, 100374, 100373, 100376, 100375, 100378, 100377, + 4974, 100357, 100360, 100359, 0, 0, 0, 12205, 0, 0, 64507, 0, 0, 0, 0, 0, + 0, 12149, 13088, 78290, 0, 12241, 0, 0, 0, 6932, 100352, 73676, 100354, 100353, 100356, 351, 68764, 0, 0, 0, 0, 73443, 0, 0, 100361, 42377, - 100363, 100362, 100365, 100364, 100367, 9013, 4054, 0, 0, 113740, 0, + 100363, 100362, 100365, 100364, 100367, 9013, 4054, 0, 0, 71939, 0, 120782, 5585, 65881, 0, 0, 0, 0, 5584, 8358, 128975, 121177, 0, 0, 0, 41616, 0, 983796, 2218, 0, 5589, 0, 2664, 41613, 5586, 118890, 0, 11356, - 0, 0, 0, 78609, 0, 0, 0, 0, 0, 0, 0, 0, 8135, 129685, 0, 983791, 0, 0, 0, - 5657, 0, 12915, 121453, 0, 10179, 5654, 12939, 0, 120799, 0, 0, 5652, - 10945, 0, 0, 0, 113710, 0, 73449, 68069, 0, 70332, 0, 5659, 0, 0, 66729, - 5655, 0, 0, 0, 68806, 0, 128225, 66310, 73444, 0, 0, 70362, 0, 11609, 0, - 126990, 92949, 10272, 10304, 10368, 74511, 594, 10244, 10248, 10256, - 983899, 0, 0, 3467, 41010, 0, 3331, 946, 0, 1495, 13184, 74330, 128242, - 9562, 0, 123175, 0, 70036, 0, 0, 0, 123176, 0, 0, 0, 5666, 65227, 123174, - 68419, 0, 11796, 123178, 0, 0, 10186, 123172, 7732, 983736, 0, 0, 0, - 5668, 83334, 0, 74645, 5670, 0, 0, 12741, 126619, 123638, 5667, 19952, + 0, 0, 0, 78609, 0, 0, 0, 0, 0, 129870, 0, 0, 8135, 129685, 0, 983791, 0, + 0, 0, 5657, 0, 12915, 121453, 0, 10179, 5654, 12939, 0, 120799, 0, 0, + 5652, 10945, 0, 0, 0, 113710, 0, 73449, 68069, 0, 70332, 0, 5659, 0, 0, + 66729, 5655, 0, 0, 0, 68806, 0, 128225, 66310, 73444, 0, 0, 70362, 0, + 11609, 0, 126990, 92949, 10272, 10304, 10368, 74511, 594, 10244, 10248, + 10256, 983899, 0, 0, 3467, 41010, 0, 3331, 946, 0, 1495, 13184, 74330, + 128242, 9562, 0, 123175, 0, 70036, 0, 0, 0, 123176, 0, 0, 0, 5666, 65227, + 123174, 68419, 0, 11796, 123178, 0, 0, 10186, 123172, 7732, 983736, 0, 0, + 0, 5668, 83334, 0, 74645, 5670, 0, 0, 12741, 126619, 123638, 5667, 19952, 120807, 113766, 12749, 0, 67757, 2263, 0, 0, 119260, 129131, 9286, 83335, 128457, 83336, 70359, 0, 3571, 13247, 5874, 78279, 73447, 68435, 78278, 78267, 78268, 0, 78265, 553, 113768, 0, 93053, 5829, 0, 4587, 78285, - 78299, 0, 12746, 0, 70338, 0, 5633, 0, 94101, 94102, 94099, 94100, 94105, - 74856, 94103, 12742, 0, 983818, 0, 0, 0, 70330, 0, 983811, 0, 0, 0, - 12148, 0, 0, 0, 0, 0, 64938, 67234, 5634, 0, 0, 2146, 0, 118880, 2425, + 78299, 129699, 12746, 0, 70338, 0, 5633, 0, 94101, 94102, 94099, 94100, + 94105, 74856, 94103, 12742, 0, 983818, 0, 0, 0, 70330, 0, 983811, 0, 0, + 0, 12148, 0, 0, 0, 0, 0, 64938, 67234, 5634, 0, 0, 2146, 0, 118880, 2425, 65182, 983813, 43636, 0, 0, 328, 0, 68736, 0, 5636, 123163, 5329, 0, 5638, 0, 7940, 0, 43223, 43760, 5635, 3373, 72424, 78292, 74223, 73441, 68763, 78287, 9833, 0, 74208, 41635, 0, 0, 43040, 78297, 68778, 78295, @@ -26942,45 +27796,46 @@ static const unsigned int code_hash[] = { 124939, 0, 0, 42494, 3073, 0, 0, 42302, 0, 126553, 70810, 0, 72401, 0, 0, 0, 129319, 4877, 100681, 100684, 100683, 10548, 100685, 100688, 100687, 100690, 64798, 70805, 5346, 0, 126570, 0, 4874, 0, 0, 0, 0, 0, 65884, 0, - 0, 0, 11378, 0, 42785, 0, 3251, 11203, 0, 0, 0, 0, 11052, 0, 5342, 8317, - 0, 0, 5340, 0, 0, 128599, 0, 129538, 0, 128395, 0, 128510, 0, 0, 9142, 0, - 0, 0, 10938, 0, 0, 1182, 127381, 4829, 0, 0, 72438, 529, 0, 0, 0, 10586, - 10790, 10839, 121427, 41593, 100669, 0, 0, 41594, 225, 66418, 0, 0, - 983950, 11376, 0, 41596, 0, 0, 0, 0, 11084, 3194, 0, 78306, 78305, 0, 0, - 0, 11324, 0, 0, 8420, 127756, 128844, 0, 41338, 129683, 11485, 0, 41322, - 66605, 100671, 0, 100673, 100672, 100675, 5161, 41330, 100676, 100679, - 100678, 100659, 100658, 0, 100660, 0, 100485, 12361, 0, 12359, 983559, - 41369, 66412, 12191, 0, 0, 0, 0, 78221, 41376, 0, 9870, 0, 41385, 65824, - 100651, 11938, 100653, 100652, 100655, 100654, 42678, 100656, 0, 64649, - 0, 0, 0, 0, 0, 983948, 100662, 100661, 100664, 66334, 100666, 70280, 832, - 100667, 0, 78473, 66007, 78471, 65703, 0, 0, 0, 12357, 0, 41395, 0, 0, 0, - 0, 0, 0, 0, 0, 41114, 65466, 0, 983825, 6024, 0, 9979, 0, 0, 0, 0, 0, 0, - 0, 4285, 0, 0, 4230, 0, 7367, 0, 92353, 7563, 42376, 0, 128532, 0, 0, 0, - 0, 0, 0, 78466, 0, 12208, 128138, 0, 66311, 71309, 0, 41130, 78286, 0, 0, - 70047, 0, 6022, 0, 0, 0, 0, 0, 41125, 0, 66453, 0, 41107, 0, 41121, 5300, - 0, 0, 0, 0, 74801, 70855, 2074, 73456, 0, 0, 12453, 0, 0, 0, 0, 68159, - 12457, 0, 0, 66278, 0, 0, 0, 0, 0, 66637, 12455, 0, 128473, 0, 12449, 0, - 71224, 0, 0, 66908, 0, 10165, 0, 0, 113715, 0, 128223, 0, 0, 0, 0, 4993, - 0, 6168, 74033, 4995, 0, 69459, 120522, 4639, 0, 72223, 0, 0, 0, 0, 0, 0, - 69734, 0, 0, 0, 0, 0, 0, 83310, 0, 0, 0, 0, 0, 0, 0, 0, 129594, 4953, 0, - 0, 0, 0, 83311, 0, 73453, 65688, 0, 10125, 3517, 0, 0, 0, 65094, 74791, - 78262, 10627, 66333, 78256, 78257, 83304, 78253, 0, 71317, 64923, 0, - 65208, 10608, 78263, 78264, 0, 0, 0, 65883, 0, 0, 74914, 0, 0, 0, 0, 0, - 12912, 119012, 0, 128191, 0, 0, 129586, 0, 1290, 0, 0, 0, 0, 113719, - 71442, 0, 0, 8978, 0, 119135, 120979, 10527, 71079, 0, 0, 0, 0, 0, 0, - 5336, 0, 0, 6934, 0, 10780, 0, 0, 78767, 0, 0, 0, 347, 0, 0, 78775, - 64675, 41582, 78774, 78771, 68094, 74903, 78769, 69221, 69657, 0, 0, - 11153, 120981, 78526, 0, 0, 0, 0, 41584, 0, 69464, 0, 0, 0, 0, 43510, - 66661, 0, 66306, 78791, 66384, 0, 6609, 0, 0, 11319, 0, 128964, 0, 41730, - 0, 0, 127920, 0, 65172, 41728, 41721, 0, 0, 0, 41203, 0, 0, 41726, 0, 0, - 5758, 0, 0, 41140, 2028, 78092, 0, 0, 0, 92739, 983195, 41138, 0, 0, 0, - 125082, 1115, 127060, 9794, 127062, 67671, 92238, 12237, 78787, 66314, - 78785, 9290, 73668, 78783, 78780, 78781, 127144, 7926, 0, 0, 0, 64398, - 100924, 71274, 12311, 0, 78796, 78798, 78794, 78795, 78792, 78793, 0, 0, - 0, 73455, 0, 0, 0, 42142, 9968, 11583, 0, 7092, 0, 9627, 78536, 73677, - 78535, 0, 0, 1248, 10148, 127755, 0, 0, 0, 0, 66447, 0, 0, 0, 0, 65305, - 0, 4031, 42794, 119986, 0, 8154, 0, 0, 128028, 126259, 0, 125220, 73452, - 0, 0, 0, 6696, 0, 119599, 0, 0, 0, 4364, 0, 0, 0, 120976, 0, 120922, 0, + 0, 0, 11378, 0, 42785, 0, 3251, 11203, 0, 0, 0, 69568, 11052, 0, 5342, + 8317, 0, 0, 5340, 0, 0, 128599, 0, 129538, 0, 128395, 0, 128510, 0, 0, + 9142, 0, 0, 0, 10938, 0, 0, 1182, 127381, 4829, 0, 0, 72438, 529, 0, 0, + 0, 10586, 10790, 10839, 121427, 41593, 100669, 0, 0, 41594, 225, 66418, + 0, 0, 983950, 11376, 0, 41596, 0, 0, 0, 0, 11084, 3194, 0, 78306, 78305, + 0, 0, 0, 11324, 0, 0, 8420, 127756, 128844, 0, 41338, 129683, 11485, 0, + 41322, 66605, 100671, 0, 100673, 100672, 100675, 5161, 41330, 100676, + 100679, 100678, 100659, 100658, 0, 100660, 0, 100485, 12361, 0, 12359, + 983559, 41369, 66412, 12191, 0, 0, 0, 0, 78221, 41376, 0, 9870, 0, 41385, + 65824, 100651, 11938, 100653, 100652, 100655, 100654, 42678, 100656, 0, + 64649, 0, 0, 0, 0, 0, 983948, 100662, 100661, 100664, 66334, 100666, + 70280, 832, 100667, 2240, 78473, 66007, 78471, 65703, 0, 0, 0, 12357, 0, + 41395, 0, 0, 0, 0, 0, 0, 983461, 0, 41114, 65466, 0, 983825, 6024, 0, + 9979, 0, 0, 0, 0, 0, 0, 0, 4285, 0, 0, 4230, 0, 7367, 0, 92353, 7563, + 42376, 0, 128532, 0, 0, 0, 0, 0, 0, 78466, 0, 12208, 128138, 0, 66311, + 71309, 0, 41130, 78286, 0, 0, 70047, 0, 6022, 0, 0, 0, 0, 0, 41125, 0, + 66453, 0, 41107, 0, 41121, 5300, 0, 0, 0, 0, 74801, 70855, 2074, 73456, + 0, 0, 12453, 0, 0, 0, 0, 68159, 12457, 0, 0, 66278, 0, 0, 0, 0, 0, 66637, + 12455, 0, 128473, 0, 12449, 0, 71224, 0, 0, 66908, 0, 10165, 0, 0, + 113715, 0, 128223, 0, 0, 0, 0, 4993, 0, 6168, 74033, 4995, 0, 69459, + 120522, 4639, 0, 72223, 0, 0, 0, 0, 0, 0, 69734, 0, 0, 0, 0, 0, 0, 83310, + 0, 0, 0, 0, 0, 0, 0, 0, 129594, 4953, 0, 0, 0, 0, 83311, 0, 73453, 65688, + 0, 10125, 3517, 0, 0, 0, 65094, 74791, 78262, 10627, 66333, 78256, 78257, + 83304, 78253, 0, 71317, 64923, 0, 65208, 10608, 78263, 78264, 0, 0, 0, + 65883, 0, 0, 74914, 0, 0, 0, 0, 0, 12912, 119012, 0, 128191, 0, 0, + 129586, 0, 1290, 0, 0, 0, 0, 113719, 71442, 0, 0, 8978, 0, 119135, + 120979, 10527, 71079, 0, 0, 0, 0, 0, 0, 5336, 0, 0, 6934, 0, 10780, 0, 0, + 78767, 0, 0, 0, 347, 0, 0, 78775, 64675, 41582, 78774, 78771, 68094, + 74903, 78769, 69221, 69657, 0, 0, 11153, 120981, 78526, 0, 0, 0, 0, + 41584, 0, 69464, 0, 0, 0, 0, 43510, 66661, 0, 66306, 78791, 66384, 0, + 6609, 0, 0, 11319, 0, 128964, 0, 41730, 0, 0, 127920, 0, 65172, 41728, + 41721, 0, 0, 0, 41203, 0, 0, 41726, 0, 0, 5758, 0, 0, 41140, 2028, 78092, + 0, 0, 0, 92739, 983195, 41138, 0, 0, 0, 125082, 1115, 127060, 9794, + 127062, 67671, 92238, 12237, 78787, 66314, 78785, 9290, 73668, 78783, + 78780, 78781, 127144, 7926, 0, 0, 0, 64398, 100924, 71274, 12311, 101268, + 78796, 78798, 78794, 78795, 78792, 78793, 0, 101270, 0, 73455, 0, 0, 0, + 42142, 9968, 11583, 0, 7092, 129835, 9627, 78536, 73677, 78535, 0, 0, + 1248, 10148, 127755, 0, 0, 101273, 0, 66447, 0, 0, 0, 0, 65305, 0, 4031, + 42794, 119986, 0, 8154, 0, 0, 128028, 126259, 129926, 125220, 73452, 0, + 0, 0, 6696, 0, 119599, 0, 0, 0, 4364, 0, 0, 0, 120976, 0, 120922, 0, 10124, 7526, 8601, 0, 68246, 0, 129318, 1418, 10885, 0, 0, 0, 0, 0, 0, 4571, 0, 0, 0, 12078, 41597, 0, 10933, 0, 72129, 0, 0, 0, 41599, 0, 0, 0, 12950, 119190, 10498, 0, 66782, 4239, 0, 0, 66511, 68066, 2637, 110685, @@ -26989,419 +27844,425 @@ static const unsigned int code_hash[] = { 120730, 0, 0, 41732, 0, 41736, 983201, 41731, 0, 0, 70842, 0, 0, 0, 0, 129329, 0, 66853, 0, 0, 78742, 72755, 11277, 65892, 0, 10620, 92272, 0, 0, 0, 0, 73942, 0, 100479, 0, 119093, 3459, 0, 129398, 0, 0, 72130, - 92512, 0, 66377, 69781, 0, 0, 111304, 3161, 69981, 0, 0, 0, 0, 0, 9016, - 78153, 0, 0, 43641, 0, 121018, 0, 0, 0, 0, 0, 0, 0, 68342, 120950, 94043, - 0, 12332, 121310, 6086, 41722, 0, 120709, 0, 0, 111305, 0, 0, 128307, - 74288, 0, 74546, 0, 129178, 0, 0, 42460, 0, 0, 0, 0, 120941, 42421, 0, - 41723, 0, 64358, 11460, 983506, 0, 64718, 120838, 66869, 0, 42348, 0, - 6752, 452, 42500, 0, 128258, 0, 42308, 0, 0, 0, 12932, 0, 69968, 42950, - 66827, 917582, 0, 0, 8302, 0, 0, 0, 0, 7250, 13214, 10041, 8105, 65568, - 127780, 69969, 127759, 0, 0, 121467, 0, 121466, 73666, 0, 69878, 0, 5538, - 9987, 0, 118932, 129307, 0, 552, 0, 7357, 10785, 0, 0, 4557, 0, 0, 10171, - 68320, 0, 5540, 0, 0, 281, 0, 0, 42622, 0, 5536, 0, 0, 1388, 0, 0, 10504, - 0, 0, 11531, 74324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3663, 0, 121081, 70335, - 74859, 0, 5334, 0, 110738, 72319, 0, 11305, 0, 68456, 0, 66611, 0, 19907, - 64363, 3478, 7583, 7679, 74154, 0, 0, 1158, 0, 0, 73748, 0, 0, 1915, - 4846, 0, 120132, 118984, 120134, 120129, 120128, 805, 120130, 64438, - 120124, 8760, 120126, 72137, 120120, 120123, 94003, 0, 0, 0, 0, 0, 12225, - 0, 0, 0, 70173, 75045, 0, 129515, 8083, 0, 0, 0, 111094, 92626, 0, 0, 0, - 0, 0, 0, 110837, 0, 67699, 560, 5643, 0, 0, 0, 0, 0, 0, 0, 120144, 0, - 120661, 78304, 1597, 120143, 120142, 206, 70126, 120139, 120138, 8168, 0, - 73086, 0, 0, 0, 983827, 125036, 0, 0, 3546, 42573, 66811, 0, 0, 128397, - 8400, 0, 0, 0, 0, 0, 7903, 9287, 72791, 0, 0, 0, 0, 72134, 66603, 1695, - 917861, 0, 0, 111101, 0, 0, 0, 0, 0, 0, 0, 111099, 0, 111098, 4754, 0, - 69222, 128229, 0, 0, 7354, 7408, 0, 0, 121181, 0, 0, 0, 12739, 0, 1278, - 4187, 0, 42119, 42120, 0, 121158, 0, 12467, 0, 68902, 0, 12463, 0, 0, - 118827, 0, 9664, 70834, 74475, 0, 0, 0, 0, 0, 3661, 0, 0, 9022, 127955, - 0, 0, 126257, 0, 6118, 222, 126250, 3884, 0, 74151, 0, 6502, 0, 11085, - 121261, 0, 0, 0, 0, 0, 0, 0, 0, 12461, 0, 0, 0, 94059, 11254, 10860, - 64880, 0, 64685, 0, 0, 94087, 7776, 11219, 0, 0, 121339, 69730, 801, - 43165, 0, 78212, 0, 0, 13277, 0, 12951, 0, 9906, 5486, 2334, 128672, - 67680, 5483, 73732, 120884, 119128, 5484, 0, 127876, 2539, 0, 78507, - 5485, 195065, 42697, 0, 0, 113689, 4502, 68057, 253, 73672, 0, 0, 9203, - 0, 0, 0, 0, 0, 121242, 11127, 0, 0, 0, 13257, 0, 0, 0, 69645, 0, 0, 0, - 70431, 0, 5693, 64470, 0, 66610, 67678, 0, 983659, 0, 0, 0, 0, 0, 0, 0, - 94078, 0, 0, 66608, 3111, 0, 8804, 66607, 0, 0, 0, 66606, 0, 0, 0, 1436, - 0, 55226, 0, 111287, 7393, 41592, 0, 0, 1598, 78101, 0, 0, 65193, 4423, - 0, 113692, 10515, 41589, 0, 0, 0, 0, 1430, 0, 0, 120606, 0, 66223, 7619, - 3255, 128280, 74032, 11549, 10735, 93038, 100741, 6801, 100743, 100746, - 2148, 100748, 100747, 100750, 100749, 0, 121229, 0, 69243, 41724, 67716, - 69669, 41690, 111269, 983647, 8380, 100355, 983830, 0, 0, 0, 0, 0, 0, - 6333, 111264, 42315, 0, 129502, 111265, 0, 0, 5339, 74323, 0, 13004, 0, - 0, 0, 0, 0, 0, 5684, 0, 0, 0, 5689, 0, 0, 68464, 12633, 12870, 0, 65183, - 5688, 0, 0, 6310, 5686, 0, 0, 0, 120647, 70046, 50, 94095, 9871, 0, 0, - 121446, 0, 0, 0, 66905, 0, 4448, 0, 121406, 113734, 72125, 1321, 0, - 10640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12501, 0, 0, 0, 0, 8812, 0, - 69986, 8673, 0, 129024, 0, 0, 2105, 72101, 72712, 0, 0, 0, 0, 0, 4636, - 55262, 0, 4515, 2382, 0, 0, 7313, 0, 0, 0, 194626, 0, 0, 0, 0, 0, 0, 0, - 10197, 194719, 0, 0, 0, 194718, 0, 0, 0, 64189, 0, 1873, 0, 0, 0, 0, 0, - 983663, 0, 0, 0, 72282, 126991, 71113, 0, 0, 129340, 9489, 0, 70843, 0, - 0, 0, 0, 128030, 13295, 43191, 0, 0, 1154, 0, 1205, 0, 0, 0, 12958, 0, 0, - 0, 70846, 0, 10592, 0, 495, 0, 41712, 7983, 0, 0, 0, 6347, 69465, 7654, + 92512, 0, 66377, 69781, 128718, 0, 111304, 3161, 69981, 0, 0, 0, 0, 0, + 9016, 78153, 0, 0, 43641, 0, 121018, 0, 101279, 0, 0, 0, 0, 0, 68342, + 120950, 94043, 0, 12332, 121310, 6086, 41722, 0, 120709, 0, 0, 111305, 0, + 0, 128307, 74288, 0, 74546, 0, 129178, 129399, 0, 42460, 0, 0, 0, 0, + 120941, 42421, 0, 41723, 110606, 64358, 11460, 983506, 0, 64718, 120838, + 66869, 0, 42348, 0, 6752, 452, 42500, 0, 128258, 0, 42308, 0, 0, 0, + 12932, 0, 69968, 42950, 66827, 917582, 0, 0, 8302, 0, 0, 0, 0, 7250, + 13214, 10041, 8105, 65568, 127780, 69969, 127759, 0, 0, 121467, 0, + 121466, 73666, 0, 69878, 0, 5538, 9987, 0, 118932, 129307, 0, 552, 0, + 7357, 10785, 0, 0, 4557, 0, 0, 10171, 68320, 0, 5540, 0, 0, 281, 0, 0, + 42622, 0, 5536, 0, 0, 1388, 0, 0, 10504, 0, 0, 11531, 74324, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3663, 0, 121081, 70335, 74859, 0, 5334, 0, 110738, + 72319, 0, 11305, 0, 68456, 0, 66611, 0, 19907, 64363, 3478, 7583, 7679, + 74154, 0, 0, 1158, 0, 983871, 73748, 0, 0, 1915, 4846, 0, 120132, 118984, + 120134, 120129, 120128, 805, 120130, 64438, 120124, 8760, 120126, 72137, + 120120, 120123, 94003, 0, 0, 0, 0, 0, 12225, 0, 0, 0, 70173, 75045, 0, + 129515, 8083, 0, 0, 0, 111094, 92626, 0, 0, 0, 0, 0, 0, 110837, 0, 67699, + 560, 5643, 0, 0, 0, 0, 0, 0, 0, 120144, 0, 120661, 78304, 1597, 120143, + 120142, 206, 70126, 120139, 120138, 8168, 0, 73086, 0, 0, 0, 983827, + 125036, 0, 0, 3546, 42573, 66811, 0, 0, 128397, 8400, 0, 0, 0, 0, 0, + 7903, 9287, 72791, 0, 0, 0, 0, 72134, 66603, 1695, 917861, 0, 0, 111101, + 0, 0, 0, 0, 0, 0, 0, 111099, 0, 111098, 4754, 0, 69222, 128229, 0, 0, + 7354, 7408, 0, 0, 121181, 0, 0, 0, 12739, 0, 1278, 4187, 0, 42119, 42120, + 0, 121158, 0, 12467, 0, 68902, 0, 12463, 0, 0, 118827, 0, 9664, 70834, + 74475, 0, 0, 0, 0, 0, 3661, 0, 0, 9022, 127955, 0, 101460, 126257, 0, + 6118, 222, 126250, 3884, 0, 74151, 0, 6502, 0, 11085, 121261, 0, 0, 0, 0, + 0, 0, 0, 0, 12461, 0, 0, 0, 94059, 11254, 10860, 64880, 0, 64685, 0, 0, + 94087, 7776, 11219, 0, 0, 121339, 69730, 801, 43165, 0, 78212, 0, 0, + 13277, 0, 12951, 0, 9906, 5486, 2334, 128672, 67680, 5483, 73732, 120884, + 119128, 5484, 0, 127876, 2539, 0, 78507, 5485, 195065, 42697, 0, 0, + 113689, 4502, 68057, 253, 73672, 0, 0, 9203, 0, 0, 0, 0, 0, 121242, + 11127, 0, 0, 0, 13257, 0, 0, 0, 69645, 0, 0, 0, 70431, 0, 5693, 64470, 0, + 66610, 67678, 0, 983659, 0, 0, 0, 0, 0, 0, 0, 94078, 0, 0, 66608, 3111, + 0, 8804, 66607, 0, 0, 0, 66606, 0, 0, 0, 1436, 0, 55226, 0, 111287, 7393, + 41592, 0, 0, 1598, 78101, 0, 0, 65193, 4423, 0, 113692, 10515, 41589, 0, + 0, 0, 101485, 1430, 101486, 0, 120606, 0, 66223, 7619, 3255, 128280, + 74032, 11549, 10735, 93038, 100741, 6801, 100743, 100746, 2148, 100748, + 100747, 100750, 100749, 0, 121229, 101479, 69243, 41724, 67716, 69669, + 41690, 111269, 983647, 8380, 100355, 983830, 0, 101480, 0, 0, 0, 0, 6333, + 111264, 42315, 0, 129502, 111265, 0, 0, 5339, 74323, 0, 13004, 0, 0, 0, + 0, 0, 0, 5684, 0, 0, 0, 5689, 0, 0, 68464, 12633, 12870, 0, 65183, 5688, + 0, 0, 6310, 5686, 0, 0, 0, 120647, 70046, 50, 94095, 9871, 0, 0, 121446, + 0, 0, 0, 66905, 0, 4448, 0, 121406, 113734, 72125, 1321, 0, 10640, 0, 0, + 101497, 0, 0, 0, 0, 0, 0, 0, 0, 12501, 0, 0, 0, 0, 8812, 0, 69986, 8673, + 0, 129024, 0, 0, 2105, 72101, 72712, 0, 129929, 0, 0, 0, 4636, 55262, 0, + 4515, 2382, 0, 0, 7313, 101477, 0, 0, 194626, 0, 0, 0, 0, 0, 0, 0, 10197, + 194719, 0, 0, 0, 194718, 0, 0, 0, 64189, 0, 1873, 0, 0, 0, 0, 0, 983663, + 0, 0, 101499, 72282, 126991, 71113, 0, 0, 129340, 9489, 0, 70843, 0, 0, + 0, 0, 128030, 13295, 43191, 0, 0, 1154, 0, 1205, 0, 0, 0, 12958, 0, 0, 0, + 70846, 0, 10592, 0, 495, 0, 41712, 7983, 0, 0, 0, 6347, 69465, 7654, 41710, 4196, 0, 0, 41709, 73772, 70832, 0, 9465, 983764, 0, 0, 917612, 0, - 0, 41714, 0, 0, 0, 6343, 0, 0, 43996, 0, 8044, 0, 0, 41789, 0, 10809, 0, - 0, 0, 0, 8146, 11025, 0, 120513, 642, 0, 0, 0, 12875, 0, 0, 13229, 0, - 41788, 0, 0, 0, 41791, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8428, 6569, 0, 0, 0, - 0, 10167, 0, 68248, 8049, 0, 0, 0, 0, 128882, 4761, 0, 4766, 64623, 0, - 121180, 194653, 118876, 0, 6912, 9232, 7033, 0, 0, 41545, 0, 0, 72160, - 72107, 0, 0, 0, 3484, 0, 0, 0, 8503, 41539, 41527, 0, 0, 983823, 0, 0, 0, - 41537, 0, 41541, 8282, 11817, 0, 128219, 0, 0, 126132, 0, 0, 70115, - 66609, 111235, 65921, 0, 0, 194664, 0, 129326, 77970, 42246, 75030, - 120605, 0, 65926, 7744, 68859, 94056, 74277, 126108, 0, 6966, 194633, - 8136, 0, 0, 0, 0, 0, 4762, 0, 0, 0, 4765, 69443, 983573, 0, 4760, 0, 0, - 10871, 43199, 0, 0, 93955, 0, 0, 11546, 0, 337, 0, 0, 0, 12279, 7768, 0, - 128352, 0, 69812, 10143, 7883, 121444, 7880, 64618, 13012, 5704, 13010, - 0, 0, 119531, 0, 0, 0, 0, 66654, 0, 0, 0, 13008, 0, 4385, 0, 13011, 0, - 92569, 119161, 13009, 74771, 70159, 0, 0, 41793, 0, 74221, 120996, 41792, - 111242, 94054, 126094, 0, 111244, 5709, 120689, 71076, 0, 0, 0, 0, 0, - 5708, 0, 0, 0, 5706, 66362, 5705, 8791, 41797, 0, 10237, 66436, 0, 0, 0, - 0, 128083, 13170, 0, 0, 0, 0, 41377, 0, 0, 10058, 125225, 0, 0, 0, 0, 0, - 0, 0, 129641, 119525, 0, 0, 72350, 0, 983572, 2144, 0, 120765, 0, 0, - 1754, 92226, 13246, 864, 0, 118926, 8972, 0, 7849, 0, 0, 13240, 0, 5192, - 0, 0, 10948, 0, 13199, 0, 1236, 13208, 13261, 13189, 13188, 93993, 0, - 7440, 0, 0, 0, 1844, 125229, 0, 13178, 0, 0, 0, 125230, 0, 0, 13260, - 4550, 121249, 125227, 0, 71071, 0, 0, 68523, 0, 0, 11354, 94071, 0, - 42795, 129317, 0, 0, 0, 125237, 0, 13194, 13274, 0, 0, 129533, 65586, - 68311, 0, 119193, 4601, 194661, 0, 194658, 0, 194659, 0, 121422, 128790, - 194657, 41717, 67402, 0, 121129, 41716, 127376, 7910, 0, 0, 754, 41944, - 0, 8183, 120741, 2037, 0, 0, 0, 125, 0, 0, 0, 983124, 127922, 41719, 0, - 7990, 12637, 13258, 9536, 71056, 0, 4427, 0, 71200, 0, 12217, 0, 41532, - 129315, 0, 0, 0, 0, 111063, 83349, 0, 0, 120622, 0, 0, 0, 0, 43632, 0, 0, - 8140, 0, 6260, 0, 0, 66765, 129657, 0, 3898, 0, 0, 13200, 0, 0, 66582, 0, - 0, 0, 0, 1068, 71178, 13259, 12945, 0, 42203, 0, 3124, 69411, 0, 4386, - 12224, 6973, 129563, 0, 0, 119535, 0, 121312, 0, 12232, 0, 0, 5681, - 64578, 75023, 0, 13209, 0, 0, 0, 0, 0, 11053, 0, 74902, 128107, 128942, - 7588, 0, 1693, 74942, 43204, 65831, 0, 0, 0, 68803, 111216, 111223, 0, 0, - 65685, 9523, 65070, 0, 0, 0, 0, 0, 0, 0, 0, 13191, 0, 3500, 3139, 100643, - 3170, 100645, 100644, 100647, 100646, 13006, 64433, 0, 100650, 941, 0, 0, - 120967, 3727, 0, 0, 0, 0, 0, 0, 0, 94039, 129299, 92455, 0, 0, 64444, 0, - 0, 43603, 94075, 65397, 288, 0, 0, 0, 10025, 73692, 0, 0, 68182, 0, 0, 0, - 92438, 65395, 0, 0, 0, 65393, 83078, 121111, 0, 0, 0, 0, 0, 65394, 11548, - 72305, 0, 65396, 0, 0, 13256, 1282, 0, 0, 0, 111085, 0, 0, 0, 111087, - 72115, 0, 0, 0, 0, 0, 3304, 0, 0, 0, 126595, 72437, 68353, 0, 0, 42113, - 0, 0, 0, 0, 0, 43094, 0, 0, 94037, 68317, 9035, 0, 0, 0, 0, 0, 70822, - 128467, 164, 68309, 94067, 94000, 100631, 100634, 100633, 100636, 100635, - 100638, 100637, 68808, 100639, 110665, 73893, 11099, 110664, 13175, - 13207, 0, 127552, 0, 74643, 5929, 0, 0, 129192, 0, 11306, 0, 119059, - 3180, 125102, 0, 0, 0, 13062, 0, 129551, 128707, 0, 0, 74428, 0, 128000, - 0, 11251, 70204, 0, 10045, 0, 13275, 0, 11057, 0, 13276, 125133, 41525, - 983084, 128015, 11444, 0, 129158, 0, 0, 41523, 127765, 0, 0, 0, 0, 0, 0, - 0, 3858, 0, 119573, 0, 0, 0, 0, 0, 0, 101014, 369, 74908, 41784, 0, - 120994, 0, 71180, 0, 0, 13210, 41782, 0, 0, 0, 41781, 10486, 74058, - 43002, 0, 0, 0, 0, 0, 3741, 0, 0, 0, 0, 41222, 0, 128317, 3982, 0, 4388, - 126105, 746, 0, 0, 0, 13131, 0, 0, 0, 0, 0, 10434, 8794, 0, 0, 0, 0, 0, - 0, 11700, 4374, 0, 0, 0, 0, 0, 0, 917597, 0, 69814, 0, 6735, 73979, - 13174, 73968, 13225, 0, 69808, 0, 0, 2365, 7841, 71476, 0, 120934, 66510, - 128099, 0, 0, 0, 41785, 41171, 0, 13173, 4372, 0, 0, 0, 0, 128939, 0, 0, - 12965, 384, 0, 0, 12685, 41473, 0, 13242, 13236, 0, 0, 0, 41787, 0, - 70684, 0, 68486, 13272, 0, 13232, 13233, 65838, 0, 0, 11656, 0, 126110, - 119885, 12861, 0, 13271, 0, 92737, 1096, 0, 0, 0, 0, 0, 0, 0, 5203, 0, - 92902, 0, 13243, 13237, 12719, 0, 0, 0, 64884, 78043, 0, 0, 0, 0, 12014, - 0, 120785, 0, 0, 13195, 41452, 64961, 41535, 0, 10459, 0, 124949, 0, 0, - 0, 41533, 66337, 0, 92184, 0, 126091, 0, 0, 73849, 0, 43638, 0, 0, 6261, - 0, 129568, 0, 1957, 0, 0, 0, 13292, 13206, 0, 0, 2925, 73809, 42576, - 127559, 13212, 43238, 0, 13190, 13187, 0, 13198, 0, 0, 5242, 0, 0, - 128146, 0, 0, 6770, 43331, 127539, 0, 0, 71074, 126466, 0, 41444, 0, 0, - 64799, 5246, 119106, 13185, 9709, 0, 0, 92751, 0, 5238, 0, 71085, 0, - 5236, 40979, 0, 74201, 8286, 0, 3936, 0, 11699, 0, 127249, 13235, 0, - 41248, 127264, 13245, 13239, 0, 7969, 127266, 74832, 127251, 0, 120509, - 0, 983874, 734, 127270, 0, 127254, 70297, 127273, 64921, 120969, 66631, - 41771, 120490, 0, 983171, 41770, 1670, 42560, 0, 121349, 129634, 0, - 41163, 0, 11136, 0, 11506, 0, 42841, 13267, 126109, 0, 41775, 0, 7130, - 41773, 0, 0, 0, 0, 0, 0, 0, 42673, 65572, 0, 65250, 13265, 13264, 64518, - 66798, 6100, 0, 0, 6740, 71080, 67814, 12967, 70028, 68101, 4583, 0, 0, - 68097, 0, 0, 0, 0, 119211, 0, 0, 42653, 83181, 68102, 0, 7814, 71045, 0, - 73702, 0, 0, 0, 9756, 6985, 0, 0, 74219, 0, 0, 129069, 124987, 5674, 0, - 66421, 0, 5677, 5588, 0, 0, 0, 0, 5673, 0, 5676, 0, 94048, 0, 5672, 6476, - 0, 0, 110951, 42511, 1727, 0, 0, 0, 0, 0, 0, 0, 3550, 736, 0, 4505, 5873, - 74090, 5826, 55232, 5813, 0, 120712, 5841, 5837, 55234, 0, 3105, 64370, - 5838, 5796, 0, 119592, 5793, 0, 5866, 5797, 41011, 5865, 0, 0, 71899, 0, - 71235, 5806, 0, 0, 9037, 5671, 0, 0, 0, 0, 71266, 126616, 7296, 0, 0, 0, - 0, 6980, 0, 72108, 0, 0, 0, 0, 0, 64613, 983891, 0, 0, 0, 0, 7114, 0, - 72100, 43190, 93842, 128666, 72096, 42611, 42563, 0, 125080, 0, 6792, - 43201, 72098, 0, 128719, 0, 72106, 0, 0, 5644, 0, 66627, 69727, 0, 0, 0, - 65116, 0, 0, 0, 0, 66410, 94104, 41013, 0, 0, 0, 2869, 0, 41015, 0, 2785, - 120616, 0, 73907, 194689, 0, 0, 0, 194688, 4759, 0, 0, 43192, 0, 1170, - 43365, 69810, 73908, 0, 902, 0, 0, 0, 0, 8122, 66420, 129642, 0, 3861, 0, - 11028, 0, 73820, 5714, 0, 0, 0, 807, 127001, 0, 0, 976, 113782, 0, 0, 0, - 0, 0, 128657, 118801, 71043, 0, 127017, 0, 0, 5582, 0, 0, 5798, 0, 0, 0, - 128521, 0, 0, 68058, 120553, 983183, 0, 0, 74933, 74283, 0, 0, 194698, - 66044, 0, 0, 0, 0, 0, 10094, 0, 0, 10857, 69225, 0, 0, 93, 0, 10954, 0, - 0, 0, 8171, 0, 0, 82996, 0, 0, 0, 119001, 92634, 0, 0, 5187, 120711, - 71086, 0, 0, 0, 0, 5232, 0, 41009, 0, 41005, 0, 43205, 0, 0, 0, 194708, - 0, 71054, 10028, 66478, 7076, 13182, 100385, 0, 0, 0, 0, 7972, 78786, 0, - 0, 0, 78789, 11309, 3806, 73985, 0, 0, 0, 78819, 0, 125218, 0, 127532, 0, - 0, 0, 78817, 0, 64366, 65156, 8814, 0, 0, 0, 0, 12836, 42725, 120079, 0, - 0, 0, 0, 0, 13255, 0, 0, 7464, 0, 93831, 0, 0, 0, 0, 13213, 0, 0, 64516, - 0, 0, 0, 41007, 983910, 0, 40995, 12209, 983914, 119136, 123635, 0, 0, 0, - 0, 0, 69384, 43558, 5522, 0, 71061, 0, 74105, 3633, 983912, 119364, - 41234, 41231, 0, 9771, 983917, 13251, 0, 0, 6262, 2784, 0, 71078, 8126, - 66483, 0, 0, 441, 0, 0, 0, 41002, 40999, 0, 0, 7108, 0, 10890, 0, 74445, - 8324, 0, 0, 74817, 2813, 119056, 74853, 983671, 0, 0, 0, 1193, 10462, - 65197, 13253, 13252, 7829, 120992, 0, 0, 0, 0, 77911, 0, 77907, 0, 10386, - 0, 41042, 0, 65944, 65683, 10338, 66469, 0, 0, 0, 0, 0, 41966, 0, 0, 0, - 68915, 0, 0, 911, 983870, 128932, 40963, 0, 65159, 0, 0, 0, 5520, 0, 0, - 0, 0, 0, 0, 0, 71081, 0, 0, 0, 0, 0, 983873, 0, 0, 66839, 0, 0, 0, 68647, - 0, 5857, 68135, 92727, 119120, 983675, 13171, 0, 0, 0, 120338, 0, 0, 0, - 13250, 69663, 0, 92201, 66397, 0, 0, 0, 8761, 12942, 5748, 92713, 92414, - 0, 83174, 8796, 0, 0, 0, 43633, 0, 72805, 71073, 0, 0, 0, 0, 0, 12843, - 4520, 0, 0, 73004, 983672, 0, 0, 194935, 110754, 64345, 0, 0, 110752, 0, - 0, 0, 110750, 110758, 110751, 0, 0, 10427, 0, 73859, 0, 9755, 1110, - 65239, 0, 0, 0, 0, 0, 0, 0, 194936, 0, 983802, 0, 70437, 3620, 0, 0, - 72855, 0, 0, 0, 74250, 0, 0, 11980, 0, 66482, 67823, 0, 128345, 110768, - 0, 0, 0, 0, 12891, 983767, 983648, 0, 2016, 0, 65668, 92311, 67696, - 10366, 70117, 9155, 120652, 9786, 65082, 0, 8579, 0, 0, 0, 0, 4508, - 64883, 0, 92522, 0, 0, 64592, 74276, 67688, 0, 0, 0, 69456, 0, 113821, 0, - 12147, 9024, 66378, 66472, 0, 0, 0, 0, 0, 71935, 0, 0, 113697, 0, 0, 0, - 0, 74275, 0, 122896, 127941, 41214, 0, 0, 0, 0, 0, 7773, 0, 0, 9963, - 68649, 0, 73734, 0, 0, 0, 0, 6594, 983752, 0, 0, 3624, 70342, 0, 64655, - 121481, 0, 0, 0, 0, 0, 65932, 0, 983790, 6803, 120968, 7738, 0, 0, - 120628, 0, 66614, 122921, 0, 43810, 7029, 0, 41292, 118898, 0, 43115, - 9517, 11518, 0, 0, 0, 0, 64423, 0, 0, 0, 12503, 9591, 4516, 0, 118845, 0, - 0, 129479, 43650, 983192, 0, 0, 0, 68079, 0, 11397, 2884, 0, 0, 12678, 0, - 0, 41014, 73730, 917539, 4270, 92254, 127836, 68205, 6633, 118947, 0, - 5230, 101055, 0, 0, 983230, 121392, 0, 92985, 0, 0, 0, 0, 415, 0, 0, 0, - 0, 5183, 1877, 0, 0, 0, 0, 0, 4472, 0, 0, 0, 128285, 110682, 78230, 4756, - 0, 7081, 0, 0, 0, 78606, 0, 42922, 42103, 8628, 74861, 0, 0, 0, 43059, - 10539, 0, 0, 0, 0, 0, 0, 0, 0, 64873, 11992, 0, 0, 0, 11801, 3622, 0, 0, - 983213, 0, 0, 11521, 0, 1966, 43628, 111048, 0, 0, 0, 0, 0, 0, 42098, - 66671, 10694, 128520, 0, 0, 0, 0, 42100, 0, 111040, 0, 42097, 0, 0, 0, 0, - 11302, 120893, 129145, 43395, 83259, 0, 0, 92351, 0, 0, 11299, 1561, 0, - 92359, 92725, 93021, 0, 194733, 0, 0, 0, 127893, 11280, 0, 0, 983783, 0, - 0, 72760, 0, 12486, 65018, 66516, 5409, 0, 0, 194720, 5399, 9685, 0, - 983694, 5401, 0, 0, 66832, 0, 0, 5405, 0, 0, 0, 0, 0, 2235, 0, 11330, - 983692, 64690, 3254, 0, 0, 0, 0, 43678, 0, 0, 983145, 0, 6388, 3355, 0, - 9867, 0, 55258, 5611, 0, 128527, 0, 0, 129181, 0, 78228, 0, 0, 119119, 0, - 0, 194959, 0, 0, 1379, 246, 0, 0, 64736, 0, 0, 0, 121227, 0, 0, 0, 0, 0, - 0, 11855, 0, 0, 0, 0, 10656, 0, 65214, 119242, 0, 0, 13163, 0, 120831, 0, - 0, 0, 0, 0, 0, 0, 0, 4755, 0, 127879, 11443, 0, 0, 0, 608, 600, 0, 8580, - 128712, 0, 43635, 0, 0, 74485, 43808, 0, 0, 0, 13160, 0, 129418, 42268, - 128006, 70505, 9828, 0, 0, 0, 0, 9351, 7778, 0, 0, 0, 6916, 1208, 0, 0, - 194754, 0, 0, 0, 0, 0, 83318, 83317, 0, 43539, 0, 0, 0, 0, 0, 9150, - 66831, 0, 128322, 0, 66848, 0, 0, 12166, 128492, 194685, 0, 2546, 0, 213, - 0, 65611, 83316, 0, 0, 74310, 70836, 0, 65285, 5452, 0, 0, 92772, 0, 0, - 0, 0, 65518, 129029, 12609, 194679, 125255, 123193, 0, 0, 0, 74638, - 194677, 125190, 4143, 110854, 110855, 65748, 4141, 9682, 110851, 118790, - 194674, 0, 0, 8725, 0, 66638, 0, 42263, 4145, 6380, 0, 66613, 0, 119207, - 0, 0, 9550, 100621, 0, 100623, 100622, 78050, 100624, 65753, 100626, - 65756, 72731, 0, 100630, 0, 0, 0, 0, 9657, 9019, 121154, 0, 0, 5390, 0, - 0, 194965, 72144, 194964, 0, 6328, 0, 0, 0, 0, 0, 983047, 0, 5235, 803, - 0, 0, 0, 127979, 43838, 0, 119562, 43544, 0, 0, 0, 0, 0, 70426, 9107, - 5191, 119113, 0, 0, 0, 121099, 0, 0, 0, 0, 0, 128150, 983067, 0, 7289, - 74055, 0, 0, 0, 0, 0, 0, 0, 1784, 124947, 0, 0, 0, 0, 64868, 0, 13158, 0, - 7211, 0, 9371, 129378, 0, 0, 1625, 7664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4482, 118886, 0, 0, 0, 0, 0, 0, 0, 100612, 66849, 100614, 100613, 100616, - 444, 100618, 100617, 100620, 100619, 0, 0, 0, 11349, 40991, 0, 0, 129324, - 0, 0, 1197, 0, 40993, 0, 0, 0, 40990, 43765, 0, 3492, 0, 127942, 0, 0, - 100592, 100591, 100594, 19948, 100596, 3099, 92239, 100597, 100600, - 100599, 0, 129042, 0, 0, 100601, 194969, 100603, 8152, 100605, 100604, - 100607, 100606, 100609, 12828, 0, 75015, 0, 0, 0, 0, 0, 75068, 127507, 0, - 92680, 0, 0, 0, 0, 0, 0, 0, 118820, 0, 0, 0, 0, 0, 100581, 0, 100583, - 100582, 100585, 100584, 100587, 100586, 100589, 7576, 11995, 100590, - 43260, 0, 0, 64830, 0, 125046, 0, 0, 43979, 8870, 0, 0, 42357, 0, 0, - 12822, 0, 0, 0, 118944, 0, 0, 42637, 0, 0, 70725, 0, 194748, 0, 71344, 0, - 0, 0, 194749, 7170, 9596, 8277, 194743, 43629, 110610, 0, 0, 983567, - 128691, 0, 66699, 64440, 0, 0, 0, 43234, 66008, 12627, 0, 0, 0, 43619, - 43303, 11300, 0, 0, 8745, 0, 7558, 71342, 100570, 0, 0, 127881, 3461, - 121258, 129471, 0, 0, 0, 0, 73877, 74335, 124982, 0, 0, 0, 64620, 74762, - 12069, 10838, 92548, 43616, 0, 10061, 0, 125057, 10508, 209, 0, 43193, - 120581, 0, 0, 128049, 0, 10899, 69855, 100571, 100574, 100573, 100576, - 993, 100578, 100577, 100580, 100579, 100560, 100559, 7232, 0, 0, 0, 0, 0, - 0, 10489, 42166, 0, 128588, 0, 0, 4224, 7671, 41518, 121311, 0, 0, 0, 0, - 64820, 92538, 12966, 100554, 100553, 100556, 100555, 100558, 100557, - 4263, 8793, 0, 0, 41502, 0, 983, 0, 100563, 100562, 13086, 4109, 4274, - 841, 5888, 100568, 68522, 0, 43481, 0, 120926, 0, 7209, 0, 41505, 0, - 78698, 127012, 0, 2147, 0, 0, 66629, 0, 0, 1255, 4149, 0, 0, 66633, 0, 0, - 92352, 0, 65101, 0, 0, 0, 0, 5835, 128797, 66625, 10842, 0, 42123, 0, 0, - 66634, 1094, 66636, 0, 0, 0, 0, 0, 9972, 73865, 129289, 6114, 0, 0, 0, 0, - 93960, 0, 0, 0, 0, 12070, 0, 881, 7857, 0, 65164, 0, 0, 0, 0, 0, 64404, - 64321, 0, 125187, 0, 0, 11245, 129395, 0, 71859, 0, 0, 0, 1287, 121509, - 0, 0, 0, 125264, 74152, 120504, 64545, 0, 69668, 8985, 0, 0, 0, 0, 0, 0, - 3652, 0, 0, 0, 0, 0, 279, 0, 0, 0, 0, 1489, 125189, 0, 0, 3899, 0, 42124, - 43828, 42122, 0, 0, 0, 11985, 73755, 78600, 0, 0, 10988, 0, 0, 42138, - 78610, 0, 65768, 78608, 78604, 78605, 6285, 78603, 78612, 78613, 74339, - 65767, 8685, 0, 0, 0, 78622, 78623, 68475, 11470, 64538, 78618, 78615, - 78616, 0, 0, 0, 0, 2527, 0, 128209, 2799, 0, 0, 0, 9933, 0, 0, 767, 5524, - 7028, 0, 0, 0, 0, 0, 78633, 0, 0, 94011, 0, 6971, 0, 70731, 0, 0, 118979, - 126075, 2434, 94018, 0, 120579, 0, 4631, 0, 0, 6407, 0, 19931, 0, 0, 0, - 0, 3192, 0, 8414, 0, 0, 0, 0, 0, 9164, 66612, 93959, 8228, 0, 0, 0, 0, - 78624, 0, 0, 9993, 0, 0, 129350, 78631, 78632, 78629, 78630, 78627, + 0, 41714, 0, 0, 0, 6343, 0, 0, 43996, 0, 8044, 0, 0, 41789, 0, 10809, + 71953, 0, 0, 0, 8146, 11025, 0, 120513, 642, 0, 0, 0, 12875, 0, 0, 13229, + 71950, 41788, 0, 0, 0, 41791, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8428, 6569, + 0, 0, 0, 0, 10167, 0, 68248, 8049, 0, 0, 0, 0, 128882, 4761, 0, 4766, + 64623, 0, 121180, 194653, 118876, 0, 6912, 9232, 7033, 0, 0, 41545, 0, + 71970, 72160, 72107, 0, 0, 0, 3484, 0, 0, 0, 8503, 41539, 41527, 0, 0, + 983823, 0, 0, 0, 41537, 0, 41541, 8282, 11817, 129965, 128219, 0, 0, + 126132, 0, 0, 70115, 66609, 111235, 65921, 0, 0, 194664, 0, 129326, + 77970, 42246, 75030, 120605, 0, 65926, 7744, 68859, 94056, 74277, 126108, + 0, 6966, 194633, 8136, 0, 0, 0, 0, 0, 4762, 0, 0, 0, 4765, 69443, 983585, + 0, 4760, 0, 0, 10871, 43199, 194645, 0, 93955, 0, 0, 11546, 0, 337, 0, 0, + 0, 12279, 7768, 0, 128352, 0, 69812, 10143, 7883, 121444, 7880, 64618, + 13012, 5704, 13010, 0, 0, 119531, 0, 0, 0, 0, 66654, 0, 0, 0, 13008, 0, + 4385, 0, 13011, 0, 92569, 119161, 13009, 74771, 70159, 0, 0, 41793, 0, + 74221, 120996, 41792, 111242, 94054, 126094, 0, 111244, 5709, 120689, + 71076, 0, 0, 0, 0, 0, 5708, 0, 0, 0, 5706, 66362, 5705, 8791, 41797, 0, + 10237, 66436, 0, 0, 0, 0, 128083, 13170, 0, 127075, 0, 0, 41377, 0, 0, + 10058, 125225, 101431, 0, 0, 0, 0, 0, 0, 129641, 119525, 0, 0, 72350, 0, + 983584, 2144, 0, 120765, 0, 0, 1754, 92226, 13246, 864, 0, 118926, 8972, + 0, 7849, 0, 0, 13240, 0, 5192, 0, 0, 10948, 0, 13199, 0, 1236, 13208, + 13261, 13189, 13188, 93993, 0, 7440, 0, 0, 0, 1844, 125229, 0, 13178, 0, + 0, 0, 125230, 0, 0, 13260, 4550, 121249, 125227, 0, 71071, 0, 0, 68523, + 0, 0, 11354, 94071, 0, 42795, 129317, 0, 0, 0, 125237, 0, 13194, 13274, + 0, 0, 129533, 65586, 68311, 0, 119193, 4601, 194661, 101454, 194658, 0, + 194659, 0, 121422, 128790, 194657, 41717, 67402, 101444, 121129, 41716, + 127376, 7910, 0, 0, 754, 41944, 0, 8183, 120741, 2037, 101440, 0, 101441, + 125, 0, 0, 0, 983124, 101442, 41719, 0, 7990, 12637, 13258, 9536, 71056, + 0, 4427, 0, 71200, 0, 12217, 0, 41532, 129315, 0, 0, 0, 0, 111063, 83349, + 0, 0, 120622, 0, 0, 0, 0, 43632, 0, 0, 8140, 0, 6260, 0, 0, 66765, + 129657, 0, 3898, 0, 0, 13200, 0, 0, 66582, 0, 0, 0, 0, 1068, 71178, + 13259, 12945, 0, 42203, 0, 3124, 69411, 0, 4386, 12224, 6973, 129563, 0, + 0, 119535, 0, 121312, 0, 12232, 0, 0, 5681, 64578, 75023, 72016, 13209, + 0, 0, 0, 0, 0, 11053, 0, 74902, 128107, 128942, 7588, 0, 1693, 74942, + 43204, 65831, 0, 0, 0, 68803, 111216, 111223, 0, 0, 65685, 9523, 2243, 0, + 0, 0, 0, 0, 0, 0, 0, 13191, 0, 3500, 3139, 100643, 3170, 100645, 100644, + 100647, 100646, 13006, 64433, 0, 100650, 941, 0, 0, 120967, 3727, 0, 0, + 0, 0, 0, 0, 0, 94039, 129299, 92455, 0, 0, 64444, 0, 0, 43603, 94075, + 65397, 288, 0, 0, 0, 10025, 73692, 0, 0, 68182, 0, 0, 0, 92438, 65395, 0, + 0, 0, 65393, 83078, 121111, 0, 0, 0, 0, 0, 65394, 11548, 72305, 0, 65396, + 0, 0, 13256, 1282, 0, 0, 0, 111085, 0, 0, 0, 111087, 72115, 0, 0, 0, 0, + 0, 3304, 0, 0, 0, 126595, 72437, 68353, 0, 0, 42113, 0, 0, 0, 0, 0, + 43094, 0, 0, 94037, 68317, 9035, 0, 0, 0, 0, 0, 70822, 128467, 164, + 68309, 94067, 94000, 100631, 100634, 100633, 100636, 100635, 100638, + 100637, 68808, 100639, 110665, 73893, 11099, 110664, 13175, 13207, 0, + 127552, 0, 74643, 5929, 0, 0, 129192, 0, 11306, 0, 119059, 3180, 125102, + 0, 0, 0, 13062, 0, 129551, 128707, 0, 0, 74428, 0, 128000, 0, 11251, + 70204, 0, 10045, 0, 13275, 0, 11057, 0, 13276, 125133, 41525, 983084, + 128015, 11444, 0, 129158, 0, 0, 41523, 127765, 0, 0, 0, 0, 0, 0, 0, 3858, + 0, 119573, 0, 0, 0, 0, 0, 0, 101014, 369, 74908, 41784, 0, 120994, 0, + 71180, 0, 0, 13210, 41782, 0, 0, 101388, 41781, 10486, 74058, 43002, 0, + 0, 0, 0, 0, 3741, 0, 0, 0, 0, 41222, 0, 128317, 3982, 0, 4388, 126105, + 746, 0, 0, 0, 13131, 0, 0, 0, 0, 0, 10434, 8794, 0, 0, 0, 0, 0, 0, 11700, + 4374, 0, 0, 0, 0, 0, 0, 917597, 0, 69814, 0, 6735, 73979, 13174, 73968, + 13225, 0, 69808, 0, 0, 2365, 7841, 71476, 0, 120934, 66510, 128099, 0, 0, + 0, 41785, 41171, 0, 13173, 4372, 0, 0, 0, 0, 128939, 0, 0, 12965, 384, 0, + 0, 12685, 41473, 0, 13242, 13236, 0, 0, 0, 41787, 0, 70684, 0, 68486, + 13272, 0, 13232, 13233, 65838, 0, 0, 11656, 0, 126110, 119885, 12861, 0, + 13271, 0, 92737, 1096, 0, 0, 0, 0, 0, 0, 0, 5203, 0, 92902, 0, 13243, + 13237, 12719, 0, 0, 0, 64884, 78043, 43052, 0, 0, 0, 12014, 0, 101415, 0, + 0, 13195, 41452, 64961, 41535, 0, 10459, 0, 124949, 0, 0, 0, 41533, + 66337, 0, 92184, 0, 126091, 0, 0, 73849, 0, 43638, 0, 101398, 6261, 0, + 129568, 0, 1957, 0, 0, 0, 13292, 13206, 0, 0, 2925, 73809, 42576, 101395, + 13212, 43238, 0, 13190, 13187, 0, 13198, 0, 0, 5242, 0, 0, 128146, 0, 0, + 6770, 43331, 127539, 0, 0, 71074, 126466, 0, 41444, 0, 0, 64799, 5246, + 119106, 13185, 9709, 0, 0, 92751, 0, 5238, 0, 71085, 0, 5236, 40979, 0, + 74201, 8286, 0, 3936, 0, 11699, 0, 127249, 13235, 69578, 41248, 127264, + 13245, 13239, 0, 7969, 127266, 74832, 127251, 0, 120509, 0, 983874, 734, + 127270, 0, 127254, 70297, 127273, 64921, 120969, 66631, 41771, 120490, 0, + 983171, 41770, 1670, 42560, 0, 121349, 129634, 0, 41163, 0, 11136, 0, + 11506, 0, 42841, 13267, 126109, 0, 41775, 0, 7130, 41773, 0, 0, 0, 0, 0, + 0, 0, 42673, 65572, 0, 65250, 13265, 13264, 64518, 66798, 6100, 0, 0, + 6740, 71080, 67814, 12967, 70028, 68101, 4583, 0, 0, 68097, 0, 0, 0, 0, + 119211, 0, 0, 42653, 83181, 68102, 0, 7814, 71045, 0, 73702, 0, 0, 0, + 9756, 6985, 0, 0, 74219, 0, 0, 129069, 124987, 5674, 0, 66421, 0, 5677, + 5588, 0, 0, 0, 0, 5673, 0, 5676, 0, 94048, 0, 5672, 6476, 0, 0, 110951, + 42511, 1727, 0, 0, 0, 0, 0, 0, 0, 3550, 736, 0, 4505, 5873, 74090, 5826, + 55232, 5813, 0, 120712, 5841, 5837, 55234, 0, 3105, 64370, 5838, 5796, 0, + 119592, 5793, 0, 5866, 5797, 41011, 5865, 0, 0, 71899, 0, 71235, 5806, 0, + 0, 9037, 5671, 0, 0, 0, 0, 71266, 126616, 7296, 0, 0, 0, 0, 6980, 0, + 72108, 0, 0, 0, 0, 0, 64613, 983891, 0, 129969, 0, 78277, 7114, 0, 72100, + 43190, 93842, 128666, 72096, 42611, 42563, 0, 125080, 0, 6792, 43201, + 72098, 0, 128719, 0, 72106, 0, 0, 5644, 0, 66627, 69727, 0, 0, 0, 65116, + 0, 0, 0, 0, 66410, 94104, 41013, 0, 0, 0, 2869, 0, 41015, 0, 2785, + 120616, 0, 73907, 194689, 0, 0, 0, 194688, 4759, 0, 0, 43192, 129913, + 1170, 43365, 69810, 73908, 0, 902, 0, 0, 0, 0, 8122, 66420, 129642, 0, + 3861, 0, 11028, 0, 73820, 5714, 0, 0, 0, 807, 127001, 0, 0, 976, 113782, + 0, 0, 0, 0, 0, 128657, 118801, 71043, 0, 127017, 0, 0, 5582, 0, 0, 5798, + 0, 0, 0, 128521, 0, 0, 68058, 120553, 983183, 0, 0, 74933, 74283, 0, 0, + 194698, 66044, 0, 0, 0, 0, 0, 10094, 0, 0, 10857, 69225, 0, 0, 93, 0, + 10954, 0, 0, 0, 8171, 0, 0, 82996, 0, 0, 0, 119001, 92634, 0, 0, 5187, + 120711, 71086, 0, 0, 0, 0, 5232, 0, 41009, 0, 41005, 0, 43205, 0, 0, 0, + 194708, 0, 71054, 10028, 66478, 7076, 13182, 100385, 0, 0, 0, 0, 7972, + 78786, 0, 0, 0, 78789, 11309, 3806, 73985, 0, 0, 0, 78819, 0, 125218, 0, + 127532, 0, 0, 0, 78817, 0, 64366, 65156, 8814, 0, 0, 0, 0, 12836, 42725, + 120079, 0, 0, 0, 0, 69258, 13255, 0, 0, 7464, 0, 93831, 0, 0, 0, 0, + 13213, 0, 0, 64516, 0, 0, 0, 41007, 983910, 0, 40995, 12209, 983914, + 119136, 123635, 0, 0, 0, 0, 0, 69283, 43558, 5522, 0, 71061, 0, 74105, + 3633, 983912, 119364, 41234, 41231, 0, 9771, 983917, 13251, 0, 0, 6262, + 2784, 0, 71078, 8126, 66483, 0, 0, 441, 0, 0, 0, 41002, 40999, 0, 129394, + 7108, 0, 10890, 0, 74445, 8324, 0, 0, 74817, 2813, 119056, 74853, 983671, + 0, 0, 0, 1193, 10462, 65197, 13253, 13252, 7829, 120992, 130032, 0, 0, 0, + 77911, 0, 77907, 0, 10386, 0, 41042, 0, 65944, 65683, 10338, 66469, 0, 0, + 0, 0, 0, 41966, 0, 0, 0, 68915, 0, 0, 911, 983870, 128932, 40963, 0, + 65159, 0, 0, 0, 5520, 0, 0, 0, 0, 0, 0, 0, 71081, 0, 0, 0, 0, 0, 983873, + 0, 0, 66839, 0, 0, 0, 68647, 0, 5857, 68135, 92727, 119120, 983675, + 13171, 0, 0, 0, 120338, 0, 0, 0, 13250, 69663, 0, 92201, 66397, 0, 0, 0, + 8761, 12942, 5748, 92713, 92414, 0, 83174, 8796, 0, 0, 0, 43633, 0, + 72805, 71073, 0, 0, 0, 0, 0, 12843, 4520, 0, 0, 73004, 983672, 0, 0, + 194935, 110754, 64345, 0, 0, 3457, 0, 0, 0, 110750, 110758, 110751, 0, 0, + 10427, 0, 73859, 0, 9755, 1110, 65239, 0, 0, 0, 0, 0, 0, 0, 194936, 0, + 983802, 0, 70437, 3620, 0, 0, 72855, 0, 0, 0, 74250, 0, 0, 11980, 0, + 66482, 67823, 0, 128345, 110768, 0, 0, 0, 0, 12891, 983767, 983648, 0, + 2016, 0, 65668, 92311, 67696, 10366, 70117, 9155, 120652, 9786, 65082, 0, + 8579, 0, 0, 0, 0, 4508, 64883, 0, 92522, 129847, 0, 64592, 74276, 67688, + 0, 69270, 0, 69456, 0, 113821, 0, 12147, 9024, 66378, 66472, 0, 0, 0, 0, + 0, 71935, 0, 0, 113697, 0, 0, 69285, 0, 74275, 0, 122896, 127941, 41214, + 0, 0, 0, 0, 0, 7773, 0, 0, 9963, 68649, 0, 73734, 0, 0, 0, 0, 6594, + 983752, 0, 0, 3624, 70342, 0, 64655, 121481, 0, 0, 0, 0, 0, 65932, 0, + 983790, 6803, 120968, 7738, 0, 0, 120628, 0, 66614, 122921, 0, 43810, + 7029, 0, 41292, 118898, 0, 43115, 9517, 11518, 0, 0, 0, 0, 64423, 0, 0, + 0, 12503, 9591, 4516, 0, 118845, 0, 0, 129479, 43650, 983192, 69250, 0, + 0, 68079, 0, 11397, 2884, 0, 0, 12678, 0, 0, 41014, 73730, 917539, 4270, + 92254, 127836, 68205, 6633, 118947, 0, 5230, 101055, 0, 0, 983230, + 121392, 0, 92985, 0, 0, 0, 0, 415, 0, 0, 0, 0, 5183, 1877, 0, 0, 0, 0, 0, + 4472, 0, 0, 0, 128285, 110682, 78230, 4756, 0, 7081, 0, 0, 0, 78606, 0, + 42922, 42103, 8628, 74861, 0, 0, 0, 43059, 10539, 0, 0, 0, 0, 0, 0, 0, 0, + 64873, 11992, 129444, 0, 0, 11801, 3622, 0, 0, 983213, 0, 0, 11521, 0, + 1966, 43628, 111048, 0, 0, 0, 0, 0, 0, 42098, 66671, 10694, 128520, 0, 0, + 0, 0, 42100, 0, 111040, 0, 42097, 0, 0, 0, 0, 11302, 120893, 129145, + 43395, 83259, 0, 0, 92351, 0, 0, 11299, 1561, 0, 92359, 92725, 69253, 0, + 194733, 0, 0, 0, 127893, 11280, 0, 0, 983783, 0, 0, 72760, 0, 12486, + 65018, 66516, 5409, 0, 0, 194720, 5399, 9685, 0, 983694, 5401, 0, 0, + 66832, 0, 0, 5405, 0, 0, 0, 0, 0, 2235, 0, 11330, 983692, 64690, 3254, 0, + 129974, 0, 0, 43678, 0, 0, 983145, 0, 6388, 3355, 0, 9867, 0, 55258, + 5611, 0, 128527, 0, 0, 129181, 0, 78228, 0, 0, 119119, 0, 0, 194959, 0, + 0, 1379, 246, 0, 0, 64736, 0, 0, 0, 121227, 0, 0, 0, 0, 0, 0, 11855, 0, + 0, 0, 71961, 10656, 0, 65214, 119242, 0, 0, 13163, 0, 120831, 0, 0, + 101484, 0, 0, 0, 0, 0, 4755, 0, 127879, 11443, 0, 0, 0, 608, 600, 0, + 8580, 128712, 0, 43635, 0, 129695, 74485, 43808, 0, 0, 0, 13160, 0, + 129418, 42268, 128006, 70505, 9828, 0, 69261, 0, 0, 9351, 7778, 0, 0, 0, + 6916, 1208, 0, 0, 194754, 0, 0, 0, 0, 0, 83318, 83317, 0, 43539, 0, + 72024, 0, 0, 0, 9150, 66831, 0, 128322, 0, 66848, 0, 0, 12166, 128492, + 194685, 0, 2546, 0, 213, 0, 65611, 83316, 0, 0, 74310, 70836, 0, 65285, + 5452, 0, 0, 92772, 0, 0, 0, 0, 65518, 129029, 12609, 194679, 125255, + 123193, 0, 0, 0, 74638, 194677, 125190, 4143, 110854, 110855, 65748, + 4141, 9682, 110851, 118790, 194674, 0, 0, 8725, 0, 66638, 0, 42263, 4145, + 6380, 0, 66613, 0, 119207, 0, 0, 9550, 100621, 0, 100623, 100622, 78050, + 100624, 65753, 100626, 65756, 72731, 0, 100630, 0, 0, 0, 0, 9657, 9019, + 121154, 0, 0, 5390, 0, 0, 194965, 72144, 194964, 69286, 6328, 0, 0, 0, 0, + 0, 983047, 0, 5235, 803, 69289, 0, 0, 127979, 43838, 0, 119562, 43544, 0, + 0, 0, 0, 0, 70426, 9107, 5191, 119113, 0, 0, 0, 121099, 0, 0, 0, 0, 0, + 128150, 983067, 0, 7289, 74055, 0, 0, 0, 0, 0, 0, 0, 1784, 124947, 0, 0, + 0, 0, 64868, 0, 13158, 0, 7211, 0, 9371, 129378, 0, 0, 1625, 7664, 0, 0, + 0, 0, 0, 0, 69273, 0, 0, 0, 0, 4482, 118886, 0, 0, 0, 0, 0, 0, 0, 100612, + 66849, 100614, 100613, 100616, 444, 100618, 100617, 100620, 100619, 0, 0, + 0, 11349, 40991, 0, 0, 129324, 0, 0, 1197, 0, 40993, 0, 0, 0, 40990, + 43765, 0, 3492, 0, 127942, 0, 0, 100592, 100591, 100594, 19948, 100596, + 3099, 92239, 100597, 100600, 100599, 0, 129042, 0, 0, 100601, 194969, + 100603, 8152, 100605, 100604, 100607, 100606, 100609, 12828, 0, 75015, 0, + 0, 129950, 0, 0, 75068, 127507, 0, 92680, 0, 0, 129928, 129920, 0, + 130037, 0, 118820, 0, 0, 0, 0, 0, 100581, 0, 100583, 100582, 100585, + 100584, 100587, 100586, 100589, 7576, 11995, 100590, 43260, 0, 0, 64830, + 0, 125046, 101526, 0, 43979, 8870, 0, 0, 42357, 0, 0, 12822, 0, 0, 0, + 118944, 0, 0, 42637, 0, 0, 70725, 0, 129934, 0, 71344, 0, 0, 0, 194745, + 7170, 9596, 8277, 194743, 43629, 110610, 0, 0, 983571, 128691, 0, 66699, + 42952, 0, 0, 0, 43234, 66008, 12627, 0, 0, 0, 43619, 43303, 11300, 0, 0, + 8745, 0, 7558, 71342, 100570, 0, 0, 127881, 3461, 121258, 129471, 69264, + 0, 0, 0, 73877, 74335, 124982, 0, 0, 0, 64620, 74762, 12069, 10838, + 92548, 43616, 0, 10061, 0, 125057, 10508, 209, 0, 43193, 120581, 0, 0, + 128049, 0, 10899, 69855, 100571, 100574, 100573, 100576, 993, 100578, + 100577, 100580, 100579, 100560, 100559, 7232, 0, 0, 0, 0, 0, 0, 10489, + 42166, 0, 128588, 0, 0, 4224, 7671, 41518, 121311, 0, 0, 0, 0, 64820, + 92538, 12966, 100554, 100553, 100556, 100555, 100558, 100557, 4263, 8793, + 0, 0, 41502, 0, 983, 0, 100563, 100562, 13086, 4109, 4274, 841, 5888, + 100568, 68522, 0, 43481, 0, 120926, 0, 7209, 0, 41505, 0, 78698, 127012, + 0, 2147, 0, 0, 66629, 0, 0, 1255, 4149, 0, 0, 66633, 0, 129391, 92352, 0, + 65101, 0, 0, 0, 0, 5835, 128797, 66625, 10842, 0, 42123, 0, 0, 66634, + 1094, 66636, 0, 0, 0, 0, 0, 9972, 73865, 129289, 6114, 0, 0, 0, 0, 93960, + 0, 0, 0, 0, 12070, 0, 881, 7857, 0, 65164, 0, 0, 0, 0, 0, 64404, 64321, + 0, 125187, 0, 0, 11245, 129395, 0, 71859, 0, 0, 0, 1287, 121509, 0, 0, 0, + 125264, 74152, 120504, 64545, 0, 69668, 8985, 0, 0, 0, 0, 0, 0, 3652, 0, + 0, 0, 0, 0, 279, 0, 0, 0, 0, 1489, 125189, 0, 0, 3899, 0, 42124, 43828, + 42122, 0, 0, 0, 11985, 73755, 78600, 0, 0, 10988, 0, 0, 42138, 78610, 0, + 65768, 78608, 78604, 78605, 6285, 78603, 78612, 78613, 74339, 65767, + 8685, 0, 0, 0, 78622, 78623, 68475, 11470, 64538, 78618, 78615, 78616, 0, + 0, 0, 101534, 2527, 0, 128209, 2799, 0, 0, 0, 9933, 0, 0, 767, 5524, + 7028, 0, 101520, 0, 0, 0, 78633, 0, 0, 94011, 0, 6971, 0, 70731, 0, 0, + 118979, 126075, 2434, 94018, 0, 120579, 0, 4631, 0, 0, 6407, 0, 19931, 0, + 0, 0, 0, 3192, 0, 8414, 0, 0, 0, 0, 0, 9164, 66612, 93959, 8228, 0, 0, 0, + 0, 78624, 0, 0, 9993, 0, 0, 129350, 78631, 78632, 78629, 78630, 78627, 78628, 78625, 2399, 0, 92399, 71202, 41208, 0, 0, 8178, 2149, 3367, 0, 78640, 78641, 78636, 78638, 78634, 6337, 0, 92342, 0, 0, 11068, 0, 9331, 0, 74798, 9181, 0, 0, 8017, 0, 0, 0, 0, 0, 0, 0, 12126, 129184, 129306, - 0, 0, 69650, 0, 0, 0, 43436, 983725, 0, 0, 0, 0, 66845, 0, 0, 0, 5398, 0, - 127386, 93953, 0, 0, 0, 0, 0, 9476, 68899, 0, 12763, 0, 74788, 0, 42114, - 11181, 92502, 0, 0, 0, 3469, 42107, 42116, 0, 0, 0, 0, 9853, 69648, 9040, - 0, 64665, 119557, 0, 0, 0, 69638, 12602, 983068, 3852, 0, 67872, 12231, - 11317, 0, 119812, 0, 11410, 10964, 12274, 122890, 100524, 0, 119810, - 9865, 195019, 0, 0, 0, 0, 12276, 0, 0, 0, 0, 119613, 0, 111214, 10467, 0, - 2443, 10918, 0, 0, 1001, 9241, 1927, 0, 0, 0, 127885, 195022, 0, 113752, - 119830, 65678, 0, 0, 8260, 0, 7519, 11505, 119182, 0, 518, 0, 119832, 0, - 13204, 0, 857, 121252, 0, 0, 92336, 83177, 0, 0, 0, 0, 0, 0, 92762, 0, 0, - 120613, 67247, 1629, 0, 796, 0, 0, 74123, 72334, 127587, 72336, 43388, 0, - 43944, 72335, 478, 65151, 0, 128147, 0, 0, 0, 0, 0, 42933, 1206, 71209, - 43837, 0, 3843, 12011, 0, 3361, 0, 8121, 10715, 7578, 0, 0, 0, 10530, - 12348, 8653, 0, 0, 0, 9551, 0, 0, 784, 0, 0, 0, 0, 0, 0, 43937, 0, 0, - 43938, 43935, 73765, 66230, 0, 0, 0, 43936, 0, 43932, 11102, 0, 0, 42753, - 67165, 0, 78324, 0, 0, 6975, 917928, 5415, 12176, 0, 0, 3462, 43940, - 42629, 78691, 128016, 43942, 0, 9759, 0, 0, 78320, 8114, 78321, 78697, - 78696, 78695, 8710, 0, 118956, 0, 4051, 92657, 0, 71206, 0, 0, 0, 128857, - 0, 1619, 9703, 77986, 0, 42112, 0, 1875, 0, 42109, 0, 0, 71189, 121160, - 64907, 5396, 13144, 0, 0, 5575, 9675, 0, 5940, 226, 0, 6336, 0, 0, 0, - 5116, 64521, 0, 0, 0, 121390, 125048, 74138, 0, 74139, 128447, 92249, 0, - 0, 0, 0, 8935, 0, 0, 0, 0, 616, 78131, 65178, 4684, 78701, 983880, 74631, - 0, 0, 0, 74460, 42110, 0, 10870, 8557, 11054, 68664, 0, 0, 0, 0, 0, 0, 0, - 0, 65597, 0, 7651, 6846, 0, 0, 68868, 0, 0, 118966, 129302, 40997, - 127218, 0, 0, 40998, 0, 74488, 71182, 9800, 0, 0, 0, 41000, 0, 5114, - 55263, 3386, 70730, 42574, 0, 5115, 5394, 0, 128756, 5113, 0, 64855, 0, - 4425, 0, 0, 0, 43967, 0, 0, 0, 5112, 12173, 127037, 0, 0, 74998, 0, 0, 0, - 0, 0, 64874, 43964, 1587, 0, 0, 0, 0, 1369, 917931, 9959, 0, 43963, 4560, - 0, 0, 0, 0, 0, 0, 43961, 42601, 4514, 72149, 0, 0, 0, 65041, 10965, - 120905, 0, 0, 12542, 0, 65341, 0, 65829, 0, 0, 10475, 0, 0, 0, 0, 11795, - 0, 0, 0, 127102, 127101, 74956, 7099, 11275, 67681, 127096, 0, 9336, 0, - 42626, 43966, 7798, 64474, 64259, 0, 5730, 119809, 43018, 0, 93796, 0, 0, - 0, 69401, 0, 0, 5127, 11285, 0, 5495, 4273, 0, 74765, 10849, 6346, 5493, - 6342, 68636, 74319, 5492, 0, 0, 169, 5497, 125053, 0, 0, 68198, 0, 0, - 128417, 0, 0, 12738, 0, 983076, 5321, 0, 0, 0, 5323, 120732, 9773, - 125209, 4683, 74318, 0, 68823, 0, 0, 0, 0, 129553, 0, 0, 0, 0, 834, 0, - 1803, 0, 5733, 0, 0, 71312, 5731, 1381, 2891, 0, 0, 0, 64525, 0, 2881, - 92996, 93847, 9601, 2879, 0, 0, 73129, 5729, 0, 0, 0, 64881, 127905, - 9361, 0, 2887, 0, 3526, 6298, 0, 0, 0, 0, 0, 8572, 127863, 77896, 0, - 71174, 0, 0, 71197, 0, 12096, 0, 0, 0, 110745, 71176, 110746, 65279, 0, - 121236, 5734, 0, 0, 0, 0, 0, 41641, 12717, 0, 12552, 983615, 66713, 0, 0, - 41643, 110747, 0, 8713, 41640, 78657, 41645, 66712, 125196, 0, 66726, - 66711, 0, 93994, 0, 3472, 64863, 0, 121424, 0, 0, 0, 125203, 67837, 0, 0, - 0, 0, 0, 0, 121440, 0, 0, 129461, 119008, 92402, 65017, 0, 0, 66668, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121043, 66471, 12216, 0, - 40988, 0, 0, 0, 0, 0, 2396, 129078, 0, 0, 0, 64940, 0, 8321, 119823, - 128165, 100409, 83299, 996, 0, 0, 4249, 0, 83294, 92535, 8222, 0, 118875, - 71213, 0, 0, 0, 0, 8534, 72844, 40983, 0, 125195, 0, 12551, 73960, - 125193, 74469, 12558, 121039, 0, 10052, 40982, 129371, 0, 0, 0, 127403, - 0, 917559, 0, 0, 1563, 0, 0, 19911, 0, 0, 0, 71363, 0, 7797, 78708, - 10006, 0, 3308, 119134, 74940, 0, 0, 78488, 0, 0, 0, 0, 0, 128462, 9200, - 10046, 9612, 0, 8218, 66496, 0, 43742, 78489, 0, 0, 0, 0, 67826, 0, - 70056, 508, 128585, 0, 126539, 0, 0, 0, 0, 0, 0, 0, 124950, 0, 0, 0, 0, - 0, 0, 6659, 0, 0, 0, 0, 0, 0, 41634, 0, 41639, 71169, 11941, 0, 0, 0, - 42180, 68505, 43753, 3249, 41637, 93982, 12328, 501, 93985, 10601, 0, - 6503, 0, 92192, 0, 71181, 0, 6505, 74010, 0, 13064, 126112, 121105, 6500, - 5526, 0, 0, 0, 0, 92376, 0, 9678, 120832, 0, 41706, 0, 0, 0, 8936, 92964, - 119123, 4208, 0, 0, 0, 67742, 0, 74379, 128605, 0, 0, 92422, 983109, 0, - 66475, 0, 5027, 0, 0, 0, 5069, 0, 5028, 0, 0, 0, 5026, 0, 0, 6331, 0, 0, - 0, 0, 41076, 0, 74790, 0, 0, 0, 0, 5029, 0, 5317, 3598, 0, 41070, 92166, - 11185, 6663, 0, 6507, 0, 126079, 0, 1716, 983691, 0, 917824, 620, 41001, - 0, 917823, 43758, 0, 71116, 5024, 0, 41003, 0, 5025, 7297, 0, 75039, 0, - 119328, 65557, 0, 0, 983599, 0, 0, 0, 0, 43947, 43946, 0, 0, 128363, - 6105, 0, 119325, 983226, 0, 68203, 43945, 66491, 43939, 0, 68144, 78718, - 2301, 0, 0, 66490, 6979, 0, 7721, 0, 0, 1592, 0, 0, 121096, 41048, - 129358, 829, 0, 92406, 0, 120247, 0, 41056, 0, 0, 10953, 41066, 0, - 917813, 482, 0, 0, 0, 43606, 71185, 0, 0, 0, 72262, 110863, 72421, 12050, - 0, 5315, 917817, 0, 0, 42061, 917816, 0, 0, 68417, 917815, 0, 0, 42059, - 0, 0, 120723, 42058, 3960, 11043, 11337, 121358, 0, 0, 3958, 0, 0, - 917818, 0, 917819, 0, 0, 42064, 11959, 983695, 0, 0, 0, 0, 128498, 64336, - 10478, 92629, 70350, 120704, 0, 0, 42437, 1555, 0, 8691, 129656, 2215, - 41662, 119046, 0, 0, 0, 93952, 0, 66481, 41664, 0, 42578, 0, 41661, - 78715, 78714, 9356, 0, 129544, 0, 1286, 110701, 0, 0, 983206, 128925, - 42476, 0, 11156, 0, 0, 0, 0, 72123, 0, 10020, 43359, 72827, 0, 120946, - 41627, 0, 11979, 0, 41628, 533, 11931, 65225, 0, 125122, 0, 0, 68118, 0, - 4377, 0, 0, 8587, 72097, 13193, 64350, 68233, 0, 41924, 0, 7735, 0, - 127585, 120843, 0, 65820, 0, 0, 43461, 7757, 0, 0, 43787, 66493, 77943, - 4168, 43904, 73952, 0, 0, 121072, 4440, 43902, 77948, 66837, 77946, - 43903, 77944, 77945, 0, 120909, 120826, 120226, 66492, 43901, 64625, 0, - 0, 0, 0, 10013, 64434, 0, 983112, 0, 11782, 64382, 0, 0, 0, 0, 41630, - 630, 120960, 0, 0, 70165, 1043, 93017, 0, 0, 0, 124945, 313, 129590, 0, - 0, 65593, 7445, 43906, 5750, 42258, 0, 55222, 68222, 11268, 11225, 0, - 8526, 0, 0, 43894, 66495, 69990, 0, 92990, 0, 10707, 7863, 0, 0, 70692, - 631, 77952, 77953, 66443, 71171, 83313, 0, 0, 0, 13305, 77961, 43925, - 43924, 77956, 77957, 66903, 66328, 42381, 77962, 0, 0, 0, 0, 0, 0, 43899, - 66821, 77967, 9157, 77965, 77966, 77963, 77964, 0, 0, 180, 73904, 0, 0, - 66494, 12674, 43896, 0, 0, 43890, 43897, 0, 11535, 0, 66769, 5185, 7165, - 5521, 10334, 5519, 71329, 10302, 12351, 83333, 1027, 5181, 0, 5117, 0, - 5179, 73955, 6845, 991, 5189, 43676, 41647, 0, 73883, 92571, 77979, 3405, - 0, 0, 5523, 43915, 66487, 92459, 74943, 9549, 0, 125093, 43923, 0, 43682, - 74884, 120537, 0, 43921, 0, 71184, 0, 43922, 128709, 0, 10414, 9846, 0, - 10350, 0, 43918, 77981, 75075, 77978, 77980, 66485, 77977, 77973, 77974, - 78057, 43909, 73983, 12330, 0, 0, 0, 43910, 0, 3407, 6293, 0, 68149, - 43908, 129060, 0, 10209, 0, 4195, 0, 9010, 983686, 75072, 6332, 0, 0, - 65871, 0, 1736, 0, 3901, 0, 0, 65890, 128801, 10446, 0, 693, 9130, 314, - 78119, 64149, 0, 0, 0, 11026, 0, 5332, 6940, 0, 0, 127007, 119831, 0, - 273, 8165, 0, 83307, 0, 0, 12824, 43911, 4528, 5320, 6301, 43662, 6133, - 0, 9463, 73738, 127141, 10922, 121069, 0, 0, 0, 0, 0, 2569, 0, 2326, 0, - 2565, 0, 66401, 0, 0, 0, 0, 41848, 2567, 78620, 121145, 4044, 92646, 0, - 12233, 0, 9509, 0, 0, 127158, 7336, 0, 0, 0, 0, 0, 67235, 0, 0, 0, 0, - 2222, 66499, 0, 127170, 0, 10895, 0, 274, 983763, 1858, 0, 67849, 55251, - 0, 3133, 0, 71857, 0, 9610, 0, 8197, 0, 0, 0, 41665, 5868, 0, 0, 72120, - 0, 19940, 43668, 41667, 0, 0, 1923, 0, 0, 0, 0, 0, 0, 0, 0, 6464, 92750, - 2996, 125221, 0, 68481, 41835, 4047, 41842, 0, 0, 129601, 0, 0, 0, 0, - 293, 0, 0, 64791, 41827, 0, 0, 10579, 8560, 0, 0, 118835, 4803, 73805, - 1739, 0, 3900, 128967, 73737, 0, 0, 73957, 0, 66474, 41971, 0, 0, 0, 0, - 0, 11716, 66473, 0, 121071, 0, 128080, 0, 0, 0, 0, 0, 0, 0, 6632, 73861, - 0, 74770, 0, 0, 8914, 0, 0, 3183, 1435, 0, 0, 0, 0, 0, 0, 5746, 67392, 0, - 0, 0, 83506, 0, 7082, 71481, 12618, 5059, 983597, 83524, 43604, 0, 0, 0, - 0, 0, 0, 8227, 0, 1218, 0, 64416, 65848, 92884, 0, 0, 0, 126987, 0, 0, 0, - 0, 0, 0, 83515, 83507, 0, 0, 42672, 71194, 43224, 0, 0, 0, 0, 0, 0, 0, - 65905, 0, 42662, 0, 121159, 0, 129536, 0, 7794, 0, 0, 6377, 0, 126080, - 3669, 3968, 0, 71319, 69658, 129550, 0, 66296, 0, 0, 0, 0, 124998, 6699, + 0, 0, 69650, 0, 0, 0, 43436, 983725, 0, 0, 0, 0, 66845, 69249, 0, 0, + 5398, 0, 127386, 93953, 0, 0, 0, 0, 0, 9476, 68899, 0, 12763, 0, 74788, + 0, 42114, 11181, 92502, 0, 0, 0, 3469, 42107, 42116, 0, 0, 0, 0, 9853, + 69648, 9040, 101518, 64665, 119557, 0, 0, 0, 69638, 12602, 983068, 3852, + 0, 67872, 12231, 11317, 0, 119812, 0, 11410, 10964, 12274, 122890, + 100524, 0, 119810, 9865, 195019, 0, 0, 0, 0, 12276, 0, 0, 0, 0, 119613, + 0, 111214, 10467, 0, 2443, 10918, 0, 0, 1001, 9241, 1927, 0, 0, 0, + 127885, 195022, 0, 113752, 119830, 65678, 0, 0, 8260, 0, 7519, 11505, + 101505, 0, 518, 0, 119832, 0, 13204, 0, 857, 121252, 0, 0, 92336, 83177, + 0, 0, 0, 0, 0, 0, 92762, 0, 0, 120613, 67247, 1629, 0, 796, 0, 0, 74123, + 72334, 127587, 72336, 43388, 0, 43944, 72335, 478, 65151, 0, 128147, 0, + 0, 0, 0, 0, 42933, 1206, 71209, 43837, 0, 3843, 12011, 0, 3361, 0, 8121, + 10715, 7578, 0, 0, 0, 10530, 12348, 8653, 0, 0, 0, 9551, 0, 0, 784, 0, 0, + 0, 0, 0, 0, 43937, 0, 0, 43938, 43935, 73765, 66230, 0, 0, 0, 43936, 0, + 43932, 11102, 0, 0, 42753, 67165, 0, 78324, 0, 0, 6975, 917928, 5415, + 12176, 0, 0, 3462, 43940, 42629, 78691, 128016, 43942, 0, 9759, 0, 0, + 78320, 8114, 78321, 78697, 78696, 78695, 8710, 0, 118956, 0, 4051, 92657, + 0, 71206, 0, 0, 0, 128857, 0, 1619, 9703, 77986, 0, 42112, 0, 1875, 0, + 42109, 0, 0, 71189, 121160, 64907, 5396, 13144, 0, 0, 5575, 9675, 0, + 5940, 226, 0, 6336, 0, 0, 0, 5116, 64521, 0, 0, 0, 121390, 125048, 74138, + 0, 74139, 128447, 92249, 0, 0, 0, 0, 8935, 0, 0, 0, 0, 616, 78131, 65178, + 4684, 78701, 983880, 74631, 0, 0, 0, 74460, 42110, 0, 10870, 8557, 11054, + 68664, 0, 0, 0, 0, 0, 0, 0, 0, 65597, 0, 7651, 6846, 0, 0, 68868, 0, 0, + 118966, 129302, 40997, 127218, 0, 0, 40998, 0, 74488, 71182, 9800, 0, 0, + 0, 41000, 0, 5114, 55263, 3386, 70730, 42574, 0, 5115, 5394, 0, 128756, + 5113, 0, 64855, 0, 4425, 0, 0, 0, 43967, 0, 0, 0, 5112, 12173, 127037, 0, + 0, 74998, 0, 0, 0, 0, 0, 64874, 43964, 1587, 0, 0, 0, 0, 1369, 917931, + 9959, 0, 43963, 4560, 0, 0, 0, 0, 0, 0, 43961, 42601, 4514, 72149, 0, 0, + 0, 65041, 10965, 120905, 0, 0, 12542, 0, 65341, 0, 65829, 0, 0, 10475, 0, + 0, 0, 0, 11795, 0, 0, 0, 127102, 127101, 74956, 7099, 11275, 67681, + 127096, 0, 9336, 0, 42626, 43966, 7798, 64474, 64259, 0, 5730, 119809, + 43018, 983174, 93796, 0, 0, 0, 69401, 0, 0, 5127, 11285, 0, 5495, 4273, + 0, 74765, 10849, 6346, 5493, 6342, 68636, 74319, 5492, 0, 0, 169, 5497, + 125053, 0, 0, 68198, 0, 0, 128417, 0, 0, 12738, 0, 983076, 5321, 0, 0, 0, + 5323, 120732, 9773, 125209, 4683, 74318, 0, 68823, 0, 0, 0, 0, 129553, 0, + 0, 0, 0, 834, 0, 1803, 0, 5733, 0, 0, 71312, 5731, 1381, 2891, 0, 0, 0, + 64525, 0, 2881, 92996, 93847, 9601, 2879, 0, 0, 73129, 5729, 0, 0, 0, + 64881, 127905, 9361, 0, 2887, 0, 3526, 6298, 0, 121219, 0, 0, 0, 8572, + 127863, 77896, 0, 71174, 0, 0, 71197, 0, 12096, 0, 0, 0, 110745, 71176, + 110746, 65279, 0, 121236, 5734, 0, 0, 0, 0, 0, 41641, 12717, 0, 12552, + 983615, 66713, 0, 0, 41643, 110747, 0, 8713, 41640, 78657, 41645, 66712, + 125196, 0, 66726, 66711, 0, 93994, 0, 3472, 64863, 0, 121424, 0, 0, 0, + 125203, 67837, 0, 0, 0, 0, 0, 0, 121440, 0, 0, 129461, 119008, 92402, + 65017, 0, 0, 66668, 0, 0, 0, 0, 0, 119822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 121043, 66471, 12216, 0, 40988, 0, 0, 0, 0, 0, 2396, 129078, 0, 0, 0, + 64940, 0, 8321, 119823, 128165, 100409, 83299, 996, 0, 0, 4249, 0, 83294, + 92535, 8222, 0, 118875, 71213, 0, 0, 0, 0, 8534, 72844, 40983, 0, 125195, + 0, 12551, 73960, 125193, 74469, 12558, 121039, 0, 10052, 40982, 129371, + 0, 0, 0, 127403, 0, 917559, 0, 78364, 1563, 0, 0, 19911, 0, 0, 0, 71363, + 0, 7797, 78708, 10006, 0, 3308, 119134, 74940, 0, 0, 78488, 0, 0, 0, 0, + 0, 128462, 9200, 10046, 9612, 0, 8218, 66496, 0, 43742, 78489, 0, 0, 0, + 0, 67826, 0, 70056, 508, 128585, 0, 126539, 0, 0, 0, 0, 0, 0, 0, 124950, + 0, 194601, 0, 0, 0, 0, 6659, 0, 0, 0, 0, 0, 0, 41634, 0, 41639, 71169, + 11941, 0, 0, 0, 42180, 68505, 43753, 3249, 41637, 93982, 12328, 501, + 93985, 10601, 0, 6503, 0, 92192, 0, 71181, 0, 6505, 74010, 0, 13064, + 126112, 121105, 6500, 5526, 0, 128949, 0, 0, 92376, 0, 9678, 120832, 0, + 41706, 0, 0, 0, 8936, 92964, 119123, 4208, 0, 0, 0, 67742, 0, 74379, + 128605, 0, 0, 92422, 983109, 0, 66475, 0, 5027, 0, 0, 0, 5069, 0, 5028, + 0, 0, 0, 5026, 0, 0, 6331, 0, 0, 0, 0, 41076, 0, 74790, 0, 0, 0, 0, 5029, + 0, 5317, 3598, 0, 41070, 92166, 11185, 6663, 0, 6507, 0, 126079, 0, 1716, + 983691, 0, 917824, 620, 41001, 0, 917823, 43758, 0, 71116, 5024, 0, + 41003, 0, 5025, 7297, 0, 75039, 0, 119328, 65557, 0, 0, 983599, 0, 0, 0, + 0, 43947, 43946, 0, 0, 128363, 6105, 0, 119325, 983226, 0, 68203, 43945, + 66491, 43939, 0, 68144, 78718, 2301, 0, 0, 66490, 6979, 0, 7721, 0, 0, + 1592, 0, 0, 121096, 41048, 129358, 829, 0, 92406, 0, 120247, 0, 41056, 0, + 0, 10953, 41066, 0, 917813, 482, 101554, 0, 0, 43606, 71185, 0, 0, 0, + 72262, 110863, 72421, 12050, 0, 5315, 917817, 0, 0, 42061, 917816, 0, 0, + 68417, 917815, 0, 0, 42059, 0, 0, 120723, 42058, 3960, 11043, 11337, + 121358, 0, 0, 3958, 101568, 0, 917818, 0, 917819, 0, 0, 42064, 11959, + 983695, 0, 0, 0, 0, 128498, 64336, 10478, 92629, 70350, 120704, 0, 0, + 42437, 1555, 0, 8691, 129656, 2215, 41662, 119046, 0, 0, 0, 93952, 0, + 66481, 41664, 0, 42578, 0, 41661, 78715, 78714, 9356, 0, 129544, 0, 1286, + 110701, 0, 0, 983206, 128925, 42476, 0, 11156, 0, 0, 0, 101583, 72123, 0, + 10020, 43359, 72827, 0, 120946, 41627, 0, 11979, 0, 41628, 533, 11931, + 65225, 0, 125122, 129994, 0, 68118, 0, 4377, 0, 0, 8587, 72097, 13193, + 64350, 68233, 0, 41924, 0, 7735, 0, 127585, 120843, 0, 65820, 0, 0, + 43461, 7757, 0, 0, 43787, 66493, 77943, 4168, 43904, 73952, 0, 0, 121072, + 4440, 43902, 77948, 66837, 77946, 43903, 77944, 77945, 0, 120909, 120826, + 120226, 66492, 43901, 64625, 0, 0, 0, 0, 10013, 64434, 0, 983112, 0, + 11782, 64382, 0, 0, 0, 0, 41630, 630, 120960, 0, 0, 70165, 1043, 93017, + 0, 0, 0, 124945, 313, 129590, 0, 0, 65593, 7445, 43906, 5750, 42258, 0, + 55222, 68222, 11268, 11225, 0, 8526, 0, 0, 43894, 66495, 69990, 0, 92990, + 0, 10707, 7863, 0, 0, 70692, 631, 77952, 77953, 66443, 71171, 83313, 0, + 0, 0, 13305, 77961, 43925, 43924, 77956, 77957, 66903, 66328, 42381, + 77962, 0, 0, 0, 0, 0, 0, 43899, 66821, 77967, 9157, 77965, 77966, 77963, + 77964, 0, 0, 180, 73904, 0, 0, 66494, 12674, 43896, 0, 0, 43890, 43897, + 0, 11535, 0, 66769, 5185, 7165, 5521, 10334, 5519, 71329, 10302, 12351, + 83333, 1027, 5181, 0, 5117, 0, 5179, 73955, 6845, 991, 3332, 43676, + 41647, 0, 73883, 92571, 77979, 3405, 69572, 0, 5523, 43915, 66487, 92459, + 74943, 9549, 0, 125093, 43923, 0, 43682, 74884, 120537, 0, 43921, 0, + 71184, 0, 43922, 128709, 0, 10414, 9846, 0, 10350, 0, 43918, 77981, + 75075, 77978, 77980, 66485, 77977, 77973, 77974, 78057, 43909, 73983, + 12330, 0, 0, 0, 43910, 69291, 3407, 6293, 0, 68149, 43908, 129060, 0, + 10209, 0, 4195, 0, 9010, 983686, 75072, 6332, 0, 0, 65871, 0, 1736, 0, + 3901, 0, 0, 65890, 128801, 10446, 0, 693, 9130, 314, 78119, 64149, 0, 0, + 0, 11026, 0, 5332, 6940, 0, 0, 127007, 119831, 0, 273, 8165, 0, 83307, 0, + 0, 12824, 43911, 4528, 5320, 6301, 43662, 6133, 0, 9463, 73738, 127141, + 10922, 121069, 0, 0, 0, 0, 0, 2569, 0, 2326, 0, 2565, 0, 66401, 0, 0, 0, + 0, 41848, 2567, 78620, 121145, 4044, 92646, 0, 12233, 0, 9509, 0, 0, + 127158, 7336, 0, 0, 0, 129598, 0, 67235, 0, 0, 0, 0, 2222, 66499, 0, + 127170, 0, 10895, 0, 274, 983763, 1858, 0, 67849, 55251, 0, 3133, 0, + 71857, 0, 9610, 0, 8197, 0, 0, 0, 41665, 5868, 0, 0, 72120, 0, 19940, + 43668, 41667, 0, 0, 1923, 0, 0, 0, 0, 0, 0, 0, 0, 6464, 92750, 2996, + 125221, 0, 68481, 41835, 4047, 41842, 0, 0, 129601, 0, 0, 0, 0, 293, 0, + 0, 64791, 41827, 0, 0, 10579, 8560, 0, 0, 118835, 4803, 73805, 1739, 0, + 3900, 128967, 73737, 0, 0, 73957, 0, 66474, 41971, 0, 0, 0, 0, 0, 11716, + 66473, 0, 121071, 0, 128080, 0, 0, 0, 0, 0, 0, 0, 6632, 73861, 0, 74770, + 0, 0, 8914, 0, 0, 3183, 1435, 0, 0, 0, 0, 0, 0, 5746, 67392, 0, 0, 0, + 83506, 0, 7082, 71481, 12618, 5059, 983597, 83524, 43604, 0, 0, 0, 0, 0, + 0, 8227, 0, 1218, 0, 64416, 65848, 92884, 0, 0, 0, 126987, 0, 0, 0, 0, 0, + 0, 83515, 83507, 0, 0, 42672, 71194, 43224, 0, 0, 0, 0, 0, 0, 0, 65905, + 0, 42662, 0, 121159, 0, 129536, 0, 7794, 0, 42953, 6377, 0, 126080, 3669, + 3968, 0, 71319, 69658, 129550, 0, 66296, 0, 0, 0, 0, 124998, 6699, 126120, 0, 0, 66678, 0, 0, 0, 8409, 119527, 19967, 0, 0, 9502, 0, 0, 6115, 0, 41654, 0, 0, 0, 41655, 113779, 43975, 72427, 0, 0, 0, 0, 41657, - 10778, 0, 9533, 184, 1553, 128868, 0, 0, 0, 0, 0, 0, 0, 0, 73697, 0, - 92480, 0, 128938, 74292, 0, 5157, 4020, 0, 128154, 43788, 64818, 0, 0, 0, - 92979, 0, 0, 74377, 11029, 66651, 0, 0, 125202, 0, 0, 7877, 121070, 0, 0, - 127953, 2810, 9955, 0, 0, 42817, 0, 65122, 11715, 0, 0, 0, 71270, 0, 0, - 0, 0, 0, 70199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78222, 127981, 0, 0, 0, 0, - 0, 11290, 0, 0, 0, 0, 8315, 0, 0, 0, 74595, 0, 0, 0, 42531, 0, 0, 0, - 74589, 43993, 0, 0, 0, 0, 43690, 0, 119139, 42730, 0, 0, 0, 64926, 0, 0, - 43830, 65257, 0, 42728, 0, 128697, 123150, 0, 43540, 0, 0, 12725, 72993, - 78635, 127826, 223, 0, 69675, 0, 0, 0, 0, 0, 0, 42605, 0, 0, 0, 0, 0, 0, - 0, 0, 78621, 0, 78619, 119062, 0, 0, 0, 42676, 129353, 64800, 78617, - 83504, 68126, 1213, 0, 0, 797, 0, 0, 83021, 83005, 64387, 4115, 0, 0, 0, - 0, 10679, 83001, 121091, 0, 64276, 83498, 13168, 983710, 0, 10136, 0, 0, - 65088, 0, 4262, 0, 0, 0, 10701, 0, 3101, 0, 123204, 0, 0, 11373, 0, 0, 0, - 9117, 0, 0, 4539, 0, 0, 12727, 0, 0, 0, 43684, 74567, 68877, 983707, - 12724, 73940, 0, 0, 0, 0, 0, 7947, 12003, 0, 74593, 121140, 69653, 74807, - 42018, 0, 0, 0, 65888, 0, 0, 69683, 0, 120306, 0, 0, 12595, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 69848, 68307, 0, 4405, 0, 128336, 129032, 69216, 0, - 0, 0, 0, 6817, 67400, 120314, 0, 0, 998, 0, 13105, 120313, 64327, 1558, - 0, 1991, 7882, 0, 0, 0, 530, 0, 0, 0, 12002, 0, 68422, 0, 10979, 0, - 41823, 70696, 0, 0, 7896, 0, 66676, 0, 120325, 0, 0, 129407, 94033, 0, - 6311, 110725, 41698, 0, 12049, 78133, 0, 125020, 41705, 0, 0, 121298, 0, - 66822, 0, 65389, 0, 66027, 0, 0, 41699, 8340, 0, 69776, 0, 128639, 0, - 1988, 5407, 69978, 0, 65912, 93059, 0, 2336, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 126238, 0, 19913, 0, 113733, 0, 0, 74279, 0, 10956, 0, 41674, 19964, - 41679, 65084, 41675, 195031, 0, 0, 0, 0, 983089, 0, 10794, 128961, 13217, - 0, 0, 0, 5280, 0, 0, 12905, 41610, 11532, 0, 0, 768, 120545, 442, 0, 0, - 0, 64081, 41682, 0, 41693, 0, 77993, 77994, 0, 4804, 6994, 0, 0, 0, - 41696, 467, 983915, 0, 0, 0, 0, 8678, 0, 69682, 64801, 0, 0, 0, 0, 64093, - 12043, 0, 69666, 0, 2029, 65191, 119246, 42847, 0, 0, 0, 0, 0, 0, 0, - 70339, 126116, 0, 0, 8019, 73856, 0, 0, 0, 0, 2355, 12150, 65725, 77988, - 77989, 68033, 77987, 0, 77985, 0, 0, 68388, 0, 74171, 0, 0, 0, 11301, - 78013, 78008, 78010, 9874, 78007, 983326, 71064, 3050, 0, 0, 0, 78016, - 78017, 71852, 78015, 0, 0, 0, 92242, 0, 69642, 0, 0, 0, 0, 0, 0, 78025, - 0, 78023, 78024, 11847, 10545, 0, 10887, 0, 123179, 0, 0, 0, 83352, - 64942, 92363, 9996, 8508, 0, 0, 8195, 0, 42171, 0, 3722, 0, 63751, 0, 0, - 92637, 69670, 0, 41552, 69854, 0, 78639, 0, 0, 129374, 128978, 0, 0, 0, - 7920, 70285, 4021, 0, 0, 0, 119663, 0, 0, 78021, 78022, 78019, 78020, - 1802, 78018, 0, 74895, 41659, 41671, 1827, 0, 64396, 41668, 128524, - 41673, 0, 11422, 71846, 0, 11370, 0, 68412, 41345, 0, 0, 0, 0, 0, 0, - 65114, 0, 2104, 64858, 0, 0, 7553, 0, 41560, 11970, 0, 917920, 0, 68495, - 74131, 74130, 0, 0, 0, 611, 74129, 64871, 0, 0, 0, 0, 74854, 0, 70466, 0, - 0, 0, 121147, 0, 68487, 41669, 7094, 917921, 0, 123144, 74054, 0, 0, 0, - 839, 0, 7695, 0, 0, 0, 92202, 0, 121053, 123157, 67885, 0, 7206, 0, 6647, - 43986, 0, 0, 0, 0, 0, 0, 127936, 43748, 66746, 0, 12298, 110802, 983992, - 110800, 64924, 0, 73931, 9468, 74245, 0, 0, 74246, 0, 0, 118830, 0, - 71851, 1279, 0, 6224, 0, 92405, 128601, 0, 128997, 0, 0, 0, 5032, 0, 0, - 0, 0, 0, 5034, 0, 0, 72846, 42702, 0, 0, 13294, 0, 64869, 0, 67808, 9129, - 123632, 0, 0, 120819, 68387, 120168, 120169, 120170, 120171, 5518, 4174, - 120166, 120167, 120160, 120161, 120162, 434, 41437, 66212, 120158, - 120159, 0, 0, 118867, 0, 524, 0, 74029, 0, 126559, 0, 0, 0, 10355, 10419, - 74025, 77847, 0, 69725, 0, 120656, 0, 67876, 0, 0, 0, 74145, 74039, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 5445, 0, 93779, 71855, 7391, 8989, 0, 74068, 0, - 0, 0, 0, 4962, 0, 8855, 0, 70820, 0, 0, 0, 0, 71847, 0, 0, 0, 10451, 0, + 10778, 0, 9533, 184, 1553, 128868, 69574, 0, 0, 0, 129420, 0, 0, 0, + 73697, 0, 92480, 0, 128938, 74292, 0, 5157, 4020, 0, 128154, 43788, + 64818, 0, 0, 0, 92979, 0, 0, 74377, 11029, 66651, 0, 0, 125202, 0, 0, + 7877, 121070, 101411, 0, 119828, 2810, 9955, 0, 0, 42817, 0, 65122, + 11715, 0, 0, 0, 71270, 0, 0, 0, 0, 0, 70199, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 78222, 127981, 0, 0, 0, 0, 0, 11290, 0, 0, 0, 0, 8315, 0, 0, 0, 74595, + 0, 0, 0, 42531, 0, 0, 0, 74589, 43993, 0, 0, 0, 0, 43690, 0, 119139, + 42730, 0, 0, 0, 64926, 0, 0, 43830, 65257, 0, 42728, 0, 128697, 123150, + 0, 43540, 0, 0, 12725, 72993, 78635, 127826, 223, 0, 69675, 0, 0, 0, 0, + 0, 0, 42605, 0, 0, 0, 0, 0, 0, 0, 0, 78621, 0, 78619, 119062, 0, 0, 0, + 42676, 129353, 64800, 78617, 83504, 68126, 1213, 0, 0, 797, 0, 0, 83021, + 83005, 64387, 4115, 0, 0, 0, 129857, 10679, 83001, 121091, 0, 64276, + 83498, 13168, 83011, 0, 10136, 0, 0, 65088, 0, 4262, 129866, 0, 0, 10701, + 0, 3101, 0, 123204, 0, 0, 11373, 0, 0, 12731, 9117, 0, 0, 4539, 0, 0, + 12727, 0, 0, 0, 43684, 74567, 68877, 983707, 12724, 73940, 0, 0, 0, 0, 0, + 7947, 12003, 0, 74593, 121140, 69653, 74807, 42018, 0, 0, 0, 65888, 0, 0, + 69683, 0, 120306, 0, 0, 12595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69848, + 68307, 0, 4405, 0, 128336, 129032, 69216, 0, 128011, 0, 0, 6817, 67400, + 120314, 0, 0, 998, 0, 13105, 120313, 64327, 1558, 0, 1991, 7882, 0, 0, 0, + 530, 0, 0, 0, 12002, 0, 68422, 0, 10979, 0, 41823, 70696, 0, 0, 7896, 0, + 66676, 0, 120325, 0, 0, 129407, 94033, 0, 6311, 110725, 41698, 0, 12049, + 78133, 0, 125020, 41705, 0, 0, 121298, 0, 66822, 0, 65389, 0, 66027, 0, + 0, 41699, 8340, 0, 69776, 0, 128639, 0, 1988, 5407, 69978, 0, 65912, + 93059, 0, 2336, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126238, 0, 19913, 0, 113733, + 0, 0, 74279, 0, 10956, 0, 41674, 19964, 41679, 65084, 41675, 195031, 0, + 0, 0, 0, 983089, 0, 10794, 128961, 13217, 0, 0, 0, 5280, 0, 0, 12905, + 41610, 11532, 0, 0, 768, 120545, 442, 0, 0, 0, 64081, 41682, 0, 41693, 0, + 77993, 77994, 0, 4804, 6994, 983114, 0, 0, 41696, 467, 983915, 0, 0, 0, + 0, 8678, 0, 69682, 64801, 0, 0, 0, 0, 64093, 12043, 0, 69666, 0, 2029, + 65191, 119246, 42847, 0, 0, 0, 0, 0, 0, 0, 70339, 126116, 0, 0, 8019, + 73856, 0, 0, 0, 0, 2355, 12150, 65725, 77988, 77989, 68033, 77987, 0, + 77985, 0, 0, 68388, 0, 74171, 0, 0, 0, 11301, 78013, 78008, 78010, 9874, + 78007, 983326, 71064, 3050, 0, 0, 0, 78016, 78017, 71852, 78015, 0, 0, 0, + 92242, 0, 69642, 0, 0, 43883, 0, 0, 0, 78025, 0, 78023, 78024, 11847, + 10545, 0, 10887, 0, 123179, 0, 0, 0, 83352, 64942, 92363, 9996, 8508, 0, + 0, 8195, 0, 42171, 0, 3722, 0, 63751, 0, 0, 92637, 69670, 0, 41552, + 69854, 0, 78639, 0, 0, 129374, 128978, 0, 0, 0, 7920, 70285, 4021, 0, 0, + 0, 119663, 0, 0, 78021, 78022, 78019, 78020, 1802, 78018, 0, 74895, + 41659, 41671, 1827, 0, 64396, 41668, 128524, 41673, 0, 11422, 71846, 0, + 11370, 0, 68412, 41345, 0, 0, 0, 0, 0, 0, 65114, 0, 2104, 64858, 0, 0, + 7553, 0, 41560, 11970, 0, 917920, 0, 68495, 74131, 74130, 0, 0, 0, 611, + 74129, 64871, 129958, 0, 0, 0, 74854, 0, 70466, 0, 0, 0, 121147, 0, + 68487, 41669, 7094, 917921, 0, 123144, 74054, 0, 0, 0, 839, 0, 7695, 0, + 0, 0, 92202, 0, 121053, 123157, 67885, 0, 7206, 0, 6647, 43986, 0, 0, 0, + 0, 0, 0, 127936, 43748, 66746, 0, 12298, 110802, 983992, 110800, 64924, + 0, 73931, 9468, 74245, 0, 0, 74246, 0, 0, 118830, 0, 71851, 1279, 0, + 6224, 0, 92405, 128601, 129886, 128997, 0, 0, 0, 5032, 0, 0, 0, 0, 0, + 5034, 0, 0, 72846, 42702, 0, 0, 13294, 0, 64869, 0, 67808, 9129, 123632, + 0, 0, 120819, 68387, 120168, 120169, 120170, 120171, 5518, 4174, 120166, + 120167, 120160, 120161, 120162, 434, 41437, 66212, 120158, 120159, 0, 0, + 118867, 0, 524, 0, 74029, 0, 126559, 0, 0, 0, 10355, 10419, 74025, 77847, + 0, 69725, 0, 120656, 0, 67876, 0, 0, 0, 74145, 74039, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5445, 0, 93779, 71855, 7391, 8989, 0, 74068, 0, 0, 0, 0, + 4962, 983133, 8855, 0, 70820, 0, 0, 0, 0, 71847, 0, 0, 0, 10451, 0, 67653, 120153, 12443, 120155, 9947, 120149, 120150, 120151, 13128, 0, - 120146, 120147, 0, 0, 0, 0, 0, 0, 74059, 74062, 6217, 74053, 43846, 0, - 74049, 0, 0, 0, 0, 0, 0, 0, 0, 42595, 0, 68112, 118860, 0, 0, 92497, - 74949, 128953, 126245, 0, 0, 0, 129684, 0, 119251, 0, 0, 0, 0, 0, 6216, - 0, 0, 9455, 127027, 8124, 128851, 0, 6944, 0, 0, 0, 2828, 128550, 531, - 42638, 0, 0, 0, 43428, 0, 3614, 2827, 9696, 0, 0, 0, 4354, 0, 78562, + 120146, 120147, 0, 0, 0, 0, 0, 129715, 74059, 74062, 6217, 74053, 43846, + 0, 74049, 0, 0, 0, 0, 0, 0, 0, 0, 42595, 0, 68112, 118860, 0, 0, 92497, + 74949, 128953, 126245, 0, 0, 0, 42997, 0, 119251, 0, 0, 0, 0, 0, 6216, 0, + 0, 9455, 127027, 8124, 128851, 0, 6944, 0, 0, 0, 2828, 128550, 531, + 42638, 0, 0, 129888, 43428, 0, 3614, 2827, 9696, 0, 0, 0, 4354, 0, 78562, 78561, 0, 120691, 0, 42599, 42597, 0, 68829, 125012, 0, 127277, 0, 120421, 0, 983164, 0, 0, 10121, 120422, 74950, 123142, 69715, 0, 0, 120423, 120630, 12608, 125244, 0, 74144, 9700, 12580, 0, 128911, 0, @@ -27414,246 +28275,248 @@ static const unsigned int code_hash[] = { 0, 67682, 0, 120528, 122901, 74272, 0, 0, 0, 0, 69667, 0, 124933, 74456, 74302, 42589, 0, 0, 0, 0, 0, 0, 0, 0, 41508, 0, 323, 125211, 0, 42698, 8131, 0, 4625, 0, 4630, 0, 0, 0, 74316, 78417, 2668, 92483, 0, 42640, 0, - 2519, 0, 92474, 92479, 0, 983085, 5049, 42659, 119011, 0, 7754, 10854, - 8738, 74623, 0, 0, 0, 649, 0, 0, 0, 0, 0, 1013, 70707, 68212, 705, 0, 0, - 127803, 1183, 126519, 9320, 0, 0, 8157, 0, 0, 0, 0, 0, 0, 0, 11913, 0, - 42848, 0, 64925, 0, 0, 70693, 0, 0, 2051, 0, 0, 0, 0, 0, 0, 0, 8466, 0, - 4626, 8464, 8472, 68844, 4629, 8499, 0, 0, 4624, 194623, 0, 94025, 0, + 2519, 0, 92474, 92479, 0, 983085, 5049, 42659, 119011, 64705, 7754, + 10854, 8738, 74623, 0, 0, 0, 649, 0, 0, 0, 0, 0, 1013, 70707, 68212, 705, + 0, 0, 127803, 1183, 126519, 9320, 0, 0, 8157, 0, 0, 0, 0, 0, 0, 0, 11913, + 0, 42848, 0, 64925, 0, 0, 70693, 0, 0, 2051, 0, 0, 0, 0, 0, 0, 0, 8466, + 0, 4626, 8464, 8472, 68844, 4629, 8499, 0, 0, 4624, 194623, 0, 94025, 0, 7805, 0, 94007, 6935, 0, 0, 0, 0, 0, 0, 0, 8492, 0, 8459, 0, 8497, 8496, - 0, 0, 0, 0, 0, 0, 0, 0, 65849, 0, 0, 0, 12451, 3328, 8684, 0, 6102, 0, - 5298, 0, 5294, 0, 129615, 0, 0, 0, 0, 43617, 0, 0, 0, 0, 0, 77863, - 128695, 0, 0, 0, 0, 0, 5292, 0, 0, 42688, 5302, 3970, 0, 0, 1793, 0, 0, - 0, 0, 0, 65263, 0, 0, 0, 0, 0, 0, 13219, 9569, 0, 74383, 0, 0, 72157, 0, - 42949, 0, 0, 0, 5322, 0, 0, 43631, 5324, 0, 128694, 41614, 65269, 6230, - 0, 0, 0, 3360, 0, 11523, 72726, 92488, 9926, 7197, 0, 68429, 126575, - 41821, 1249, 0, 127951, 0, 123641, 0, 0, 0, 74459, 41807, 0, 41815, 0, 0, - 0, 0, 0, 128248, 0, 66835, 0, 0, 72145, 41800, 0, 0, 0, 41811, 74466, - 93966, 6670, 77882, 0, 0, 43092, 0, 0, 0, 0, 0, 128655, 0, 0, 0, 0, - 74501, 74005, 0, 74387, 69860, 315, 12813, 128556, 72409, 0, 72408, 0, 0, - 73061, 0, 0, 1378, 0, 0, 0, 72407, 3066, 0, 0, 72406, 0, 0, 0, 8787, - 194615, 0, 41618, 0, 0, 0, 194614, 64652, 194611, 42088, 125226, 0, 0, 0, - 0, 7176, 43756, 0, 0, 74492, 0, 74534, 0, 0, 0, 127199, 0, 128630, 74525, - 0, 194594, 12930, 7168, 74514, 0, 74515, 0, 128919, 43962, 9527, 120659, - 70123, 12977, 69723, 0, 93783, 194598, 41236, 92235, 65168, 118838, - 41237, 5848, 0, 194600, 3670, 194601, 0, 0, 0, 7890, 0, 11298, 0, 0, - 6229, 0, 0, 0, 194593, 128907, 0, 0, 0, 4120, 65337, 65336, 0, 0, 0, 0, - 9366, 0, 0, 0, 65327, 65326, 65325, 65324, 65323, 42216, 65321, 65320, - 65335, 65334, 65333, 65332, 65331, 65330, 65329, 42689, 0, 43943, 118885, - 42073, 6785, 68491, 0, 42076, 7196, 65318, 2035, 65316, 4106, 65314, - 65313, 42074, 0, 41228, 0, 0, 41241, 93786, 41239, 43533, 0, 7189, - 194602, 0, 43941, 0, 42802, 0, 8487, 0, 0, 4615, 12695, 0, 0, 12175, - 100414, 0, 0, 7809, 0, 0, 0, 0, 6590, 69762, 0, 64738, 0, 0, 0, 0, 0, 0, - 2025, 0, 0, 0, 10637, 71860, 0, 1570, 43839, 2835, 83052, 10624, 43623, - 194587, 0, 78433, 0, 42812, 0, 2825, 0, 128287, 0, 2821, 0, 92327, 7365, - 83043, 0, 68296, 0, 2823, 0, 0, 0, 2831, 0, 0, 11465, 0, 0, 0, 0, 0, - 7181, 0, 41332, 0, 12333, 0, 0, 0, 0, 0, 9883, 127294, 73906, 70751, 0, - 71863, 0, 0, 0, 0, 0, 0, 43741, 0, 8166, 70739, 0, 0, 74535, 0, 65297, - 68294, 571, 0, 8752, 0, 5288, 118822, 1541, 0, 127284, 8864, 0, 0, 0, 0, - 0, 113778, 12151, 0, 66874, 0, 1035, 0, 0, 7881, 701, 65936, 128493, 0, - 70462, 0, 11403, 0, 0, 82991, 0, 983142, 70472, 3994, 11421, 121217, - 127297, 127242, 127300, 70659, 127303, 0, 125205, 2855, 127828, 0, 41621, - 68214, 0, 0, 10654, 82945, 119226, 12164, 41623, 7906, 0, 74297, 7182, 0, - 83069, 0, 0, 0, 0, 121115, 0, 0, 747, 0, 92463, 12019, 43136, 0, 110861, - 0, 0, 8001, 0, 0, 69394, 0, 0, 0, 68373, 0, 0, 0, 128279, 0, 71915, 0, 0, - 7282, 94066, 0, 0, 0, 0, 0, 5286, 83061, 0, 3718, 0, 83057, 0, 194584, - 71905, 0, 128480, 0, 0, 0, 0, 9206, 82980, 113824, 6802, 0, 41653, 0, - 1241, 0, 0, 0, 0, 68124, 41651, 42937, 0, 83042, 41650, 0, 83037, 0, - 12914, 2814, 0, 119552, 0, 0, 0, 118900, 0, 0, 0, 917546, 71862, 0, 0, 0, - 3494, 10189, 69784, 0, 0, 71861, 0, 0, 65875, 0, 0, 127762, 0, 74215, - 43065, 0, 0, 7200, 0, 3261, 0, 0, 0, 65889, 71888, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 129424, 0, 635, 0, 0, 74753, 0, 92420, 73997, 0, 0, 43905, 0, - 118834, 126125, 0, 6667, 0, 983263, 0, 0, 125200, 0, 0, 0, 0, 83137, 0, - 0, 0, 0, 0, 121104, 127856, 125112, 71885, 0, 120125, 7866, 194573, - 92770, 194574, 0, 120140, 126074, 2849, 0, 0, 42157, 12960, 0, 11812, 0, - 74509, 0, 69881, 0, 0, 0, 123156, 7178, 0, 0, 0, 0, 129041, 11534, 1967, - 0, 0, 71361, 7015, 120298, 72757, 0, 12989, 0, 9368, 983638, 1624, 43270, - 0, 0, 10818, 0, 83091, 0, 120908, 0, 0, 0, 0, 0, 0, 6169, 12871, 0, 2798, - 65176, 4958, 42752, 119025, 0, 0, 0, 70346, 66448, 0, 113780, 68364, 0, - 0, 0, 68360, 0, 73746, 120945, 68352, 0, 73787, 83110, 2154, 7199, 64955, - 0, 0, 0, 0, 0, 66507, 0, 69853, 0, 0, 0, 0, 0, 0, 0, 92517, 118882, - 120301, 13297, 0, 129446, 0, 0, 0, 0, 6658, 8045, 0, 0, 983854, 92319, - 83101, 0, 72126, 0, 0, 0, 2416, 3310, 0, 0, 379, 0, 43755, 0, 0, 0, - 68362, 1284, 0, 73756, 0, 0, 83141, 70784, 0, 0, 0, 0, 8515, 83144, - 83143, 0, 0, 0, 8529, 93782, 0, 7564, 0, 0, 0, 0, 73757, 73760, 42359, 0, - 2031, 0, 7202, 0, 12676, 0, 0, 128418, 0, 7710, 1610, 73801, 0, 0, 0, - 983607, 43917, 0, 9974, 228, 0, 10398, 0, 0, 0, 92241, 70062, 118927, - 42999, 1725, 65533, 8196, 9352, 0, 0, 66868, 0, 8502, 5762, 0, 0, 43898, - 0, 0, 0, 0, 43914, 0, 126507, 64598, 13001, 9326, 83082, 43916, 1557, 0, - 983860, 6330, 6805, 8631, 2545, 70052, 0, 0, 0, 0, 70410, 0, 42762, 0, - 42914, 126516, 262, 1637, 0, 83025, 129491, 0, 128757, 0, 0, 0, 128922, - 0, 43658, 0, 0, 129183, 6419, 0, 0, 0, 0, 93989, 0, 0, 7194, 5291, 0, - 43666, 0, 0, 0, 0, 128293, 0, 12881, 123596, 0, 73842, 0, 9011, 0, 0, 0, - 70436, 179, 43644, 0, 0, 64747, 0, 118813, 0, 0, 121389, 0, 126629, 0, - 73850, 2801, 119837, 42069, 119839, 119838, 119841, 42072, 92736, 119842, - 0, 0, 0, 8377, 0, 42070, 119313, 119834, 119853, 4389, 43656, 1633, - 119857, 119856, 119859, 11119, 119845, 119844, 9967, 119846, 119849, - 4612, 119851, 119850, 42913, 70456, 0, 0, 10782, 66898, 0, 119141, 0, 0, - 0, 11541, 69636, 0, 0, 119614, 2731, 0, 0, 0, 4102, 0, 73878, 0, 0, 0, 0, - 0, 11283, 0, 0, 0, 0, 0, 43674, 0, 0, 126705, 0, 0, 0, 0, 11142, 128304, - 0, 12975, 0, 123208, 0, 0, 74072, 0, 55269, 0, 0, 0, 78577, 78576, 0, 0, - 82966, 82974, 70448, 0, 0, 82968, 0, 0, 0, 0, 0, 113809, 0, 69399, 64909, - 0, 11790, 74019, 0, 128066, 0, 8561, 94076, 129481, 125045, 0, 65674, - 7230, 0, 0, 8778, 0, 0, 67725, 2071, 0, 6459, 68325, 7628, 65092, 73903, - 0, 11342, 129388, 0, 0, 93965, 94081, 0, 11810, 70057, 10723, 967, 0, - 121116, 73905, 0, 6387, 0, 12307, 43913, 121089, 0, 127584, 0, 1886, 0, - 43895, 870, 7648, 0, 7662, 7652, 876, 871, 877, 7665, 878, 42015, 879, - 43692, 4563, 0, 0, 0, 73072, 867, 9520, 872, 7656, 868, 873, 7642, 7659, - 869, 874, 7644, 0, 875, 790, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68452, 0, - 0, 42067, 0, 0, 0, 12292, 0, 0, 0, 42012, 0, 0, 83388, 0, 0, 8494, 4611, - 0, 72344, 0, 9679, 0, 0, 0, 0, 93015, 0, 74364, 4628, 4245, 0, 0, 0, - 1851, 0, 127189, 0, 0, 0, 118897, 0, 64674, 124971, 983868, 8829, 983674, - 128864, 0, 0, 0, 0, 8809, 983677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7427, 0, - 4588, 43680, 72300, 74484, 0, 0, 0, 0, 113787, 74363, 129043, 0, 793, 0, - 11197, 0, 0, 0, 842, 0, 8208, 70833, 0, 1647, 0, 70841, 0, 0, 818, 0, 0, - 0, 0, 0, 0, 120594, 0, 0, 70179, 0, 13167, 66359, 0, 127172, 0, 4969, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2840, 0, 0, 0, 66887, 65877, 9068, 0, 68194, 0, - 0, 12991, 0, 2651, 68016, 983896, 0, 983259, 70835, 0, 70844, 43648, 0, - 0, 0, 0, 0, 0, 64372, 121064, 7458, 655, 752, 7457, 7456, 7452, 3285, - 74894, 11152, 73099, 0, 2391, 93766, 92271, 671, 7435, 7434, 618, 668, - 610, 42800, 7431, 7451, 42801, 640, 42927, 7448, 7439, 628, 3905, 100742, - 0, 0, 0, 67850, 0, 0, 0, 4605, 0, 100745, 43372, 65945, 72710, 0, 119590, - 0, 0, 70495, 987, 71229, 11572, 0, 0, 10002, 9971, 70673, 0, 0, 0, 0, 0, - 0, 11334, 0, 129493, 42364, 11503, 0, 0, 0, 4627, 70090, 127784, 0, 0, - 74046, 68872, 92562, 0, 0, 0, 0, 0, 0, 0, 42569, 64965, 0, 0, 10516, 0, - 12190, 0, 42140, 0, 0, 0, 0, 9887, 0, 4000, 7429, 7428, 665, 7424, 0, 0, - 7884, 0, 0, 0, 0, 0, 2509, 0, 120573, 0, 0, 92449, 0, 10690, 0, 119114, - 126226, 0, 0, 73080, 4590, 0, 74440, 0, 0, 0, 1708, 0, 0, 983609, 0, 0, - 69226, 69974, 8813, 0, 1066, 0, 0, 0, 127921, 70447, 0, 0, 0, 72343, 0, - 7516, 0, 0, 0, 8034, 0, 0, 3631, 110696, 0, 0, 8416, 110694, 0, 0, 0, - 110692, 74621, 0, 70185, 0, 74850, 0, 0, 12099, 70475, 0, 6252, 0, 0, 0, - 0, 0, 0, 66368, 0, 64956, 7071, 129070, 70457, 128159, 118800, 0, 0, 0, - 9357, 0, 1773, 0, 125092, 0, 68451, 7745, 9844, 0, 0, 94, 1880, 120929, - 0, 0, 0, 0, 0, 0, 0, 0, 11237, 0, 129173, 0, 0, 0, 1757, 6964, 42480, - 72823, 0, 120806, 0, 0, 7731, 0, 0, 127883, 0, 110810, 43988, 70423, - 74758, 0, 7592, 856, 74299, 0, 0, 0, 78138, 1459, 0, 0, 0, 0, 0, 1504, 0, - 0, 0, 0, 7529, 0, 0, 0, 0, 12594, 0, 0, 336, 0, 7509, 0, 0, 0, 0, 127882, - 0, 0, 0, 65859, 0, 983967, 43062, 124948, 0, 0, 0, 0, 12970, 0, 0, 0, 0, - 0, 0, 0, 119247, 0, 65068, 74291, 0, 7069, 0, 0, 0, 11130, 2087, 0, 0, 0, - 0, 0, 0, 92747, 0, 92614, 2091, 0, 2090, 0, 0, 7117, 2077, 72281, 0, - 77889, 2083, 0, 71196, 0, 0, 92649, 0, 0, 0, 0, 4165, 8746, 0, 0, 0, 0, - 129572, 7066, 0, 70415, 128135, 0, 0, 7786, 127766, 2233, 0, 124965, - 121122, 2302, 0, 0, 7056, 0, 0, 0, 0, 0, 0, 126506, 6920, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 983099, 70438, 2613, 0, 0, 110734, 0, 74571, 42760, 0, 0, - 0, 0, 0, 0, 71843, 0, 0, 70506, 1246, 74243, 0, 0, 41008, 0, 0, 0, 921, - 70048, 0, 12702, 0, 0, 1566, 8407, 0, 64653, 0, 74617, 0, 0, 72711, 5313, - 951, 0, 0, 0, 0, 0, 4009, 70277, 71844, 0, 83123, 0, 72250, 0, 119898, - 113760, 0, 0, 0, 0, 70024, 0, 0, 119892, 0, 0, 0, 119890, 2579, 119906, - 3177, 11357, 69224, 0, 0, 83130, 64734, 0, 9822, 110670, 70471, 110668, - 0, 110666, 0, 0, 0, 0, 9851, 983729, 110673, 9059, 110671, 110672, 0, - 41687, 129054, 0, 71842, 70178, 0, 0, 1777, 0, 10158, 69767, 0, 42366, - 70444, 0, 0, 0, 70127, 83377, 5989, 110716, 74636, 126999, 0, 41685, 0, - 0, 9769, 41684, 0, 6225, 111328, 11740, 0, 118840, 0, 2600, 0, 70416, 0, - 0, 3666, 70420, 0, 0, 0, 0, 74542, 69771, 0, 0, 0, 0, 0, 69765, 0, 252, - 0, 69769, 0, 194616, 0, 69763, 0, 0, 0, 0, 0, 0, 0, 120947, 0, 129410, 0, - 0, 0, 68323, 125219, 0, 119188, 0, 0, 121335, 0, 0, 0, 0, 0, 7764, - 983726, 11094, 120825, 0, 0, 92505, 8298, 0, 0, 0, 0, 0, 64449, 0, - 126650, 0, 0, 0, 70442, 0, 0, 0, 0, 7774, 10607, 0, 0, 0, 0, 0, 120764, - 0, 0, 0, 0, 3458, 0, 70053, 0, 120995, 0, 2602, 0, 0, 0, 74907, 0, 0, 0, - 0, 172, 0, 4971, 70419, 1889, 7238, 0, 0, 0, 8257, 0, 0, 0, 129570, 0, - 111342, 983855, 0, 43366, 43363, 9807, 0, 0, 0, 72247, 64479, 0, 0, 0, - 113707, 0, 10900, 121355, 0, 0, 12048, 0, 64292, 0, 0, 0, 6099, 94084, - 129486, 0, 0, 299, 0, 8525, 92356, 0, 0, 111338, 0, 92564, 3075, 0, - 94053, 0, 94050, 0, 0, 70440, 0, 123590, 0, 0, 0, 2581, 11395, 0, 0, 0, - 0, 128584, 0, 0, 129423, 0, 118855, 0, 0, 0, 7204, 70065, 2588, 2914, - 7011, 55281, 0, 7466, 0, 2883, 42253, 83118, 0, 0, 0, 123598, 0, 41230, - 68299, 0, 43571, 0, 6219, 0, 9980, 41232, 92245, 0, 66036, 41229, 118967, - 0, 120666, 94016, 0, 12711, 0, 0, 74289, 68472, 42857, 0, 0, 0, 0, - 127306, 119006, 0, 11380, 72348, 0, 0, 0, 0, 0, 0, 0, 983583, 12722, 0, - 922, 0, 0, 983126, 74958, 3218, 120471, 120470, 120469, 120476, 120475, - 8569, 11404, 70450, 120463, 3214, 120461, 120468, 74910, 3207, 120465, - 78729, 78728, 78727, 0, 120460, 7425, 3205, 0, 78737, 78736, 71729, - 43383, 78733, 78732, 2606, 78730, 73897, 0, 11496, 1173, 0, 0, 129135, 0, - 0, 0, 120737, 120953, 120872, 120629, 378, 2610, 0, 0, 0, 0, 0, 37, 7068, - 0, 120480, 70421, 3209, 120477, 0, 120483, 9768, 120481, 0, 0, 0, 0, 0, - 0, 65510, 0, 100625, 0, 0, 0, 100627, 0, 126633, 0, 7060, 100628, 0, - 127752, 0, 0, 70428, 71463, 0, 7380, 0, 0, 100593, 126997, 0, 128737, 0, - 71465, 121030, 3243, 0, 0, 0, 7050, 0, 70050, 0, 0, 0, 71466, 8203, - 71102, 68241, 0, 65211, 194599, 0, 0, 0, 779, 125061, 64367, 100906, - 69901, 8193, 55279, 0, 0, 0, 7065, 0, 4346, 0, 0, 908, 0, 0, 8982, 0, 0, - 0, 782, 0, 10883, 0, 0, 129396, 65542, 121302, 0, 68650, 100575, 92244, - 0, 0, 111351, 0, 4376, 0, 11787, 12961, 0, 0, 42888, 0, 100610, 6231, 0, - 65713, 100608, 1783, 0, 68238, 0, 0, 0, 194945, 0, 0, 0, 68653, 0, - 983051, 0, 764, 0, 0, 43531, 0, 9033, 0, 0, 6223, 11042, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 120648, 0, 0, 0, 0, 0, 0, 0, 0, 1478, 0, 11825, - 2607, 0, 0, 0, 74543, 0, 0, 100588, 6132, 0, 0, 0, 70058, 0, 0, 0, 43537, - 6761, 10093, 4369, 0, 0, 73735, 100564, 3947, 110778, 0, 0, 0, 0, 100942, - 0, 0, 0, 0, 0, 0, 7686, 0, 0, 0, 100934, 0, 100944, 66577, 41221, 0, - 42281, 0, 74024, 12293, 0, 94014, 11794, 0, 0, 1737, 0, 0, 0, 7205, 0, - 9335, 12850, 0, 2272, 7055, 0, 0, 0, 67751, 0, 0, 6780, 65067, 0, 1327, - 68393, 983570, 0, 41217, 0, 10018, 0, 0, 0, 100611, 68176, 41219, 0, - 4147, 983170, 41216, 983693, 2616, 70197, 68461, 65234, 0, 0, 0, 0, - 119660, 0, 0, 0, 0, 127930, 119580, 70675, 64943, 2608, 1470, 0, 0, 6227, - 0, 0, 74775, 0, 0, 72320, 101024, 0, 129535, 0, 0, 0, 0, 0, 10876, 92482, - 0, 0, 5834, 0, 6222, 0, 0, 12086, 0, 1600, 64309, 0, 0, 68883, 127957, - 93836, 0, 8882, 0, 129415, 2570, 0, 0, 194606, 0, 0, 1234, 0, 13115, - 110743, 110740, 100923, 5002, 110739, 41286, 100926, 127019, 0, 0, 0, 0, - 0, 0, 0, 41289, 0, 0, 75051, 41272, 0, 0, 0, 0, 0, 0, 0, 41279, 0, 0, 0, - 11081, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9637, 7112, 77975, 128984, 0, 10886, 0, - 8548, 983841, 0, 0, 0, 8076, 43048, 8290, 8291, 43051, 92570, 0, 2596, 0, - 0, 41293, 0, 0, 2393, 7058, 66432, 0, 68673, 0, 0, 0, 0, 0, 128558, 0, 0, - 0, 0, 0, 64696, 0, 0, 121086, 74165, 0, 0, 0, 0, 0, 0, 7063, 983182, - 64893, 73096, 0, 68038, 113757, 709, 0, 0, 1876, 0, 0, 120868, 8137, - 110662, 67752, 70850, 100832, 245, 100831, 11456, 41233, 7070, 0, 94046, - 6136, 100835, 0, 100781, 41235, 0, 0, 100782, 100642, 432, 0, 100784, - 65437, 0, 0, 128909, 0, 100641, 100649, 0, 100648, 0, 43215, 0, 0, 0, 0, - 9052, 0, 0, 110826, 110827, 74784, 10580, 0, 100845, 0, 64640, 983175, - 74455, 0, 0, 70035, 0, 12652, 12199, 127030, 0, 2566, 11971, 0, 0, 1065, - 0, 0, 0, 2576, 0, 66819, 0, 983986, 0, 0, 0, 983050, 983826, 0, 2921, - 119104, 0, 5772, 12968, 70055, 0, 0, 0, 2580, 983822, 0, 0, 70032, 0, 0, - 0, 128148, 0, 0, 121308, 11346, 0, 12054, 100824, 92426, 0, 0, 13091, 0, - 0, 100821, 100828, 0, 127026, 128334, 74821, 0, 66295, 68037, 68047, - 127865, 13090, 0, 0, 0, 118985, 0, 0, 0, 0, 0, 127824, 0, 0, 100776, - 119319, 42356, 42432, 100778, 119317, 0, 0, 0, 78752, 70030, 66914, 0, 0, - 7061, 0, 3854, 0, 70020, 68413, 0, 42319, 0, 0, 7067, 0, 0, 0, 0, 0, 0, - 127797, 9029, 43543, 0, 2353, 119316, 0, 100769, 0, 100768, 983177, 0, 0, - 43664, 0, 0, 0, 12277, 0, 78122, 11066, 65233, 0, 41224, 0, 0, 3747, - 10522, 0, 129582, 1691, 41226, 0, 917565, 0, 41223, 121135, 121299, 697, - 0, 121051, 4244, 0, 0, 0, 13121, 128573, 0, 0, 0, 0, 0, 0, 0, 0, 65816, - 68111, 0, 127933, 0, 0, 0, 0, 0, 0, 66895, 74602, 0, 7123, 70038, 5785, - 9198, 0, 100810, 0, 7383, 64656, 0, 0, 0, 0, 0, 0, 0, 0, 13122, 0, 191, - 70060, 8585, 126610, 64411, 0, 0, 64850, 41072, 118996, 0, 0, 0, 0, - 100754, 127010, 100753, 0, 100756, 683, 396, 0, 100758, 0, 100757, 43058, - 100760, 343, 7129, 42680, 0, 0, 0, 0, 0, 100761, 0, 74040, 0, 1724, 0, - 119321, 0, 0, 6263, 0, 0, 0, 6592, 0, 983044, 0, 0, 0, 0, 3730, 1778, 0, - 0, 128854, 121254, 0, 9018, 0, 0, 0, 0, 92763, 5547, 0, 0, 128950, 0, 0, - 284, 8108, 0, 0, 74001, 0, 66460, 7174, 92703, 126072, 0, 0, 4394, - 127480, 0, 0, 0, 101082, 66459, 0, 7180, 101084, 0, 101092, 68800, 42471, - 0, 0, 67232, 64304, 42243, 101095, 2583, 0, 127804, 0, 0, 0, 71702, 3855, - 0, 0, 0, 0, 0, 0, 0, 92416, 7132, 0, 92743, 0, 64756, 3798, 6578, 0, 0, - 92481, 9774, 1275, 0, 0, 983056, 0, 120515, 7873, 0, 0, 0, 0, 0, 0, - 73994, 73992, 0, 0, 0, 41851, 0, 41846, 126485, 92337, 7633, 41849, - 68385, 70726, 3224, 0, 69806, 0, 0, 0, 1510, 68129, 0, 0, 0, 0, 12109, 0, - 0, 0, 0, 0, 78377, 1910, 8671, 78374, 127118, 70290, 0, 0, 0, 2654, 7893, - 0, 0, 0, 72394, 0, 67394, 0, 118970, 70066, 78372, 78371, 78370, 78369, - 78368, 0, 0, 0, 1733, 0, 2568, 0, 0, 0, 0, 41486, 0, 127839, 7116, 0, 0, - 0, 7185, 0, 0, 0, 0, 0, 120575, 120829, 0, 0, 0, 0, 92489, 0, 0, 0, - 70022, 7171, 0, 340, 0, 0, 72980, 0, 128535, 0, 124979, 94073, 0, 0, 0, - 11392, 92509, 0, 0, 0, 0, 0, 0, 0, 100632, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11948, 0, 6999, 617, 983806, 0, 3675, 10600, 0, 0, 74616, 2617, 0, 0, 0, - 128446, 0, 0, 8630, 194771, 7288, 983809, 5545, 983799, 2586, 0, 0, - 73123, 983832, 0, 0, 0, 70847, 0, 0, 0, 0, 11195, 71708, 0, 7835, 70040, - 0, 0, 92285, 0, 0, 72973, 0, 0, 100852, 71118, 10029, 983166, 0, 0, - 70033, 124978, 0, 0, 194782, 0, 0, 118975, 0, 0, 3903, 100893, 983839, 0, - 120555, 0, 93036, 110645, 0, 983565, 0, 0, 194773, 0, 0, 0, 127238, - 983803, 100919, 0, 100918, 64752, 0, 983138, 100920, 0, 43045, 100904, 0, - 0, 0, 66394, 7128, 0, 0, 0, 0, 0, 43044, 2604, 0, 100851, 43046, 121421, - 69985, 11768, 43043, 10470, 0, 7122, 194789, 4390, 454, 41397, 194792, 0, - 78762, 0, 0, 120576, 64572, 0, 68091, 2394, 2575, 113749, 0, 0, 74802, - 100913, 129280, 0, 0, 11989, 0, 0, 128856, 0, 0, 8249, 128172, 0, 0, - 6640, 74806, 2598, 513, 0, 6586, 127521, 129301, 120710, 65008, 0, 0, - 92515, 0, 194795, 66755, 0, 126585, 0, 43152, 78637, 0, 194797, 0, 69893, - 6582, 0, 0, 12839, 0, 0, 0, 0, 2444, 128759, 66620, 0, 0, 0, 0, 69894, 0, - 0, 0, 0, 4238, 11071, 9459, 68437, 78140, 78139, 0, 10079, 0, 0, 0, 0, 0, - 11907, 43928, 0, 0, 0, 0, 92490, 43929, 0, 43926, 64498, 0, 9506, 6978, - 126234, 0, 0, 0, 0, 43934, 0, 1122, 65564, 0, 71055, 0, 0, 1920, 0, - 43930, 827, 0, 0, 0, 0, 6577, 1304, 64733, 0, 10606, 0, 0, 0, 9329, - 92997, 9239, 74422, 0, 129373, 1222, 11076, 0, 69229, 43615, 8262, 72280, - 64627, 19909, 983554, 72279, 0, 287, 0, 233, 0, 0, 42816, 0, 0, 65140, - 128158, 8830, 0, 0, 10524, 41175, 125033, 72294, 0, 5296, 0, 0, 0, 0, 0, + 0, 129864, 0, 0, 129834, 69553, 0, 0, 65849, 0, 0, 0, 12451, 3328, 8684, + 0, 6102, 0, 5298, 0, 5294, 0, 129615, 0, 0, 0, 0, 43617, 0, 0, 0, 0, 0, + 77863, 128695, 0, 0, 0, 0, 0, 5292, 0, 0, 42688, 5302, 3970, 0, 0, 1793, + 0, 0, 0, 0, 0, 65263, 0, 0, 0, 0, 0, 0, 13219, 9569, 69567, 74383, 0, 0, + 72157, 0, 42949, 0, 0, 0, 5322, 0, 0, 43631, 5324, 0, 128694, 41614, + 65269, 6230, 0, 0, 0, 3360, 0, 11523, 72726, 92488, 9926, 7197, 0, 68429, + 126575, 41821, 1249, 0, 127951, 0, 123641, 0, 0, 0, 74459, 41807, 0, + 41815, 0, 0, 0, 0, 0, 128248, 0, 66835, 0, 0, 72145, 41800, 0, 0, 0, + 41811, 74466, 93966, 6670, 77882, 0, 0, 43092, 0, 0, 0, 0, 0, 128655, 0, + 0, 0, 0, 74501, 74005, 0, 74387, 69860, 315, 12813, 128556, 72409, 0, + 72408, 0, 0, 73061, 0, 0, 1378, 0, 0, 0, 72407, 3066, 0, 0, 72406, 0, 0, + 0, 8787, 194615, 0, 41618, 0, 0, 0, 194614, 64652, 194611, 42088, 125226, + 0, 0, 0, 0, 7176, 43756, 0, 0, 74492, 0, 74534, 0, 0, 0, 127199, 0, + 128630, 74525, 0, 194594, 12930, 7168, 74514, 0, 74515, 0, 128919, 43962, + 9527, 120659, 70123, 12977, 69723, 0, 93783, 194598, 41236, 92235, 65168, + 118838, 41237, 5848, 0, 194600, 3670, 129905, 129906, 129907, 129908, + 7890, 0, 11298, 0, 0, 6229, 0, 0, 0, 194593, 128907, 0, 0, 0, 4120, + 65337, 65336, 0, 0, 0, 0, 9366, 0, 0, 0, 65327, 65326, 65325, 65324, + 65323, 42216, 65321, 65320, 65335, 65334, 65333, 65332, 65331, 65330, + 65329, 42689, 0, 43943, 118885, 42073, 6785, 68491, 0, 42076, 7196, + 65318, 2035, 65316, 4106, 65314, 65313, 42074, 0, 41228, 0, 0, 41241, + 93786, 41239, 43533, 0, 7189, 194602, 0, 43941, 0, 42802, 0, 8487, 0, 0, + 4615, 12695, 0, 0, 12175, 100414, 0, 0, 7809, 0, 0, 0, 0, 6590, 69762, 0, + 64738, 0, 0, 0, 0, 0, 0, 2025, 0, 0, 0, 10637, 71860, 0, 1570, 43839, + 2835, 83052, 10624, 43623, 194587, 0, 78433, 0, 42812, 0, 2825, 0, + 128287, 0, 2821, 0, 92327, 7365, 83043, 0, 68296, 0, 2823, 0, 0, 0, 2831, + 0, 0, 11465, 0, 0, 0, 0, 0, 7181, 0, 41332, 0, 12333, 0, 0, 0, 0, 0, + 9883, 127294, 73906, 70751, 0, 71863, 0, 0, 0, 0, 0, 0, 43741, 0, 8166, + 70739, 0, 0, 74535, 0, 65297, 68294, 571, 0, 8752, 0, 5288, 118822, 1541, + 0, 127284, 8864, 0, 0, 0, 0, 0, 113778, 12151, 0, 66874, 0, 1035, 0, 0, + 7881, 701, 65936, 128493, 0, 70462, 0, 11403, 0, 0, 82991, 0, 983142, + 70472, 3994, 11421, 121217, 127297, 127242, 127300, 70659, 127303, 0, + 125205, 2855, 127828, 0, 41621, 68214, 0, 0, 10654, 82945, 119226, 12164, + 41623, 7906, 0, 74297, 7182, 0, 83069, 0, 0, 0, 0, 121115, 0, 0, 747, 0, + 92463, 12019, 43136, 0, 110861, 0, 0, 8001, 0, 0, 69394, 0, 0, 0, 68373, + 0, 0, 0, 128279, 0, 71915, 0, 0, 7282, 94066, 0, 0, 0, 0, 0, 5286, 83061, + 0, 3718, 0, 83057, 0, 194584, 71905, 0, 128480, 0, 0, 0, 0, 9206, 82980, + 113824, 6802, 0, 41653, 0, 1241, 0, 0, 0, 0, 68124, 41651, 42937, 0, + 83042, 41650, 0, 83037, 0, 12914, 2814, 0, 119552, 0, 0, 0, 71968, 0, 0, + 0, 917546, 71862, 0, 0, 0, 3494, 10189, 69784, 0, 0, 71861, 0, 0, 65875, + 0, 0, 127762, 0, 74215, 43065, 0, 0, 7200, 0, 3261, 0, 0, 0, 65889, + 71888, 71975, 0, 0, 0, 0, 0, 0, 0, 0, 129424, 0, 635, 0, 0, 74753, 0, + 92420, 73997, 0, 0, 43905, 0, 118834, 126125, 0, 6667, 0, 983263, 0, 0, + 125200, 0, 0, 0, 0, 83137, 0, 0, 0, 0, 0, 121104, 127856, 125112, 71885, + 0, 120125, 7866, 194573, 92770, 194574, 0, 120140, 126074, 2849, 0, 0, + 42157, 12960, 0, 11812, 0, 74509, 0, 69881, 0, 0, 0, 123156, 7178, 0, 0, + 0, 0, 129041, 11534, 1967, 0, 0, 71361, 7015, 120298, 72757, 0, 12989, 0, + 9368, 983638, 1624, 43270, 0, 0, 10818, 0, 83091, 0, 120908, 0, 0, 0, 0, + 0, 0, 6169, 12871, 0, 2798, 65176, 4958, 42752, 119025, 0, 0, 0, 70346, + 66448, 0, 113780, 68364, 0, 0, 0, 68360, 0, 73746, 120945, 68352, 0, + 73787, 83110, 2154, 7199, 64955, 0, 0, 0, 0, 71980, 66507, 0, 69853, 0, + 0, 0, 0, 0, 0, 0, 92517, 118882, 120301, 13297, 0, 129446, 71963, 0, 0, + 0, 6658, 8045, 0, 0, 983854, 92319, 83101, 0, 72126, 0, 0, 0, 2416, 3310, + 0, 0, 379, 0, 43755, 0, 0, 0, 68362, 1284, 0, 73756, 0, 0, 83141, 70784, + 71977, 0, 0, 0, 8515, 83144, 83143, 0, 0, 0, 8529, 93782, 0, 7564, 0, 0, + 0, 0, 73757, 73760, 42359, 0, 2031, 0, 7202, 129984, 12676, 0, 0, 128418, + 0, 7710, 1610, 73801, 0, 0, 0, 983607, 43917, 0, 9974, 228, 0, 10398, 0, + 0, 0, 92241, 70062, 118927, 42999, 1725, 65533, 8196, 9352, 0, 0, 66868, + 0, 8502, 5762, 0, 0, 43898, 0, 0, 0, 0, 43914, 0, 126507, 64598, 13001, + 9326, 83082, 43916, 1557, 0, 983860, 6330, 6805, 8631, 2545, 70052, 0, 0, + 0, 42998, 70410, 0, 42762, 71941, 42914, 126516, 262, 1637, 0, 83025, + 129491, 0, 128757, 0, 0, 0, 128922, 0, 43658, 0, 0, 129183, 6419, 0, 0, + 0, 0, 93989, 0, 0, 7194, 5291, 129702, 43666, 0, 0, 0, 0, 128293, 0, + 12881, 123596, 0, 73842, 0, 9011, 0, 0, 0, 70436, 179, 43644, 0, 0, + 64747, 0, 118813, 0, 0, 121389, 92649, 126629, 0, 73850, 2801, 119837, + 42069, 119839, 119838, 119841, 42072, 92736, 119842, 0, 0, 0, 8377, 0, + 42070, 119313, 119834, 119310, 4389, 43656, 1633, 119857, 119856, 119859, + 11119, 119845, 119844, 9967, 119846, 119849, 4612, 119851, 119850, 42913, + 70456, 0, 71983, 10782, 66898, 0, 119141, 0, 0, 0, 11541, 69636, 0, 0, + 119614, 2731, 0, 0, 0, 4102, 0, 73878, 0, 0, 0, 0, 0, 11283, 0, 0, 0, 0, + 0, 43674, 0, 0, 126705, 0, 0, 0, 0, 11142, 128304, 0, 12975, 0, 123208, + 0, 0, 74072, 0, 55269, 0, 0, 0, 78577, 78576, 0, 0, 82966, 82974, 70448, + 0, 0, 82968, 0, 0, 0, 0, 0, 113809, 0, 69399, 64909, 0, 11790, 74019, 0, + 128066, 0, 8561, 94076, 129481, 125045, 69259, 65674, 7230, 0, 0, 8778, + 0, 0, 67725, 2071, 0, 6459, 68325, 7628, 65092, 73903, 0, 11342, 129388, + 0, 0, 93965, 94081, 0, 11810, 70057, 10723, 967, 0, 71973, 73905, 0, + 6387, 0, 12307, 43913, 121089, 0, 127584, 0, 1886, 0, 43895, 870, 7648, + 0, 7662, 7652, 876, 871, 877, 7665, 878, 42015, 879, 43692, 4563, 0, 0, + 0, 73072, 867, 9520, 872, 7656, 868, 873, 7642, 7659, 869, 874, 7644, 0, + 875, 790, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68452, 0, 0, 42067, 0, 0, 0, + 12292, 0, 0, 0, 42012, 0, 0, 83388, 0, 0, 8494, 4611, 0, 72344, 0, 9679, + 0, 0, 0, 0, 93015, 0, 74364, 4628, 4245, 0, 0, 0, 1851, 0, 127189, 0, 0, + 0, 118897, 0, 64674, 124971, 983868, 8829, 983674, 128864, 0, 0, 0, 0, + 8809, 983677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7427, 0, 4588, 43680, 72300, + 74484, 0, 0, 0, 0, 113787, 74363, 129043, 0, 793, 0, 11197, 0, 0, 0, 842, + 0, 8208, 70833, 0, 1647, 0, 70841, 0, 0, 818, 0, 0, 0, 0, 0, 0, 120594, + 0, 0, 70179, 0, 13167, 66359, 0, 127172, 0, 4969, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2840, 0, 0, 0, 66887, 65877, 9068, 0, 68194, 0, 0, 12991, 0, 2651, + 68016, 983896, 0, 983259, 70835, 0, 70844, 43648, 0, 0, 0, 0, 0, 0, + 64372, 121064, 7458, 655, 752, 7457, 7456, 7452, 3285, 74894, 11152, + 73099, 0, 2391, 93766, 92271, 671, 7435, 7434, 618, 668, 610, 42800, + 7431, 7451, 42801, 640, 42927, 7448, 7439, 628, 3905, 100742, 0, 0, 0, + 67850, 0, 0, 0, 4605, 0, 100745, 43372, 65945, 72710, 0, 119590, 0, 0, + 70495, 987, 71229, 11572, 0, 0, 10002, 9971, 70673, 0, 0, 0, 0, 0, 0, + 11334, 0, 129493, 42364, 11503, 0, 0, 0, 4627, 70090, 127784, 0, 0, + 74046, 68872, 92562, 0, 0, 129900, 0, 129812, 0, 0, 42569, 64965, 0, 0, + 10516, 129828, 12190, 0, 42140, 0, 0, 0, 0, 9887, 0, 4000, 7429, 7428, + 665, 7424, 0, 0, 7884, 0, 0, 0, 0, 0, 2509, 0, 120573, 0, 0, 92449, 0, + 10690, 0, 119114, 126226, 0, 0, 73080, 4590, 0, 74440, 0, 0, 0, 1708, 0, + 0, 983609, 0, 0, 69226, 69974, 8813, 0, 1066, 0, 0, 71965, 127921, 70447, + 0, 0, 0, 72343, 0, 7516, 0, 0, 0, 8034, 0, 0, 3631, 110696, 0, 0, 8416, + 110694, 71937, 0, 0, 110692, 74621, 0, 70185, 0, 74850, 0, 0, 12099, + 70475, 0, 6252, 0, 0, 0, 0, 0, 0, 66368, 0, 64956, 7071, 129070, 70457, + 128159, 118800, 0, 0, 0, 9357, 0, 1773, 0, 125092, 0, 68451, 7745, 9844, + 0, 0, 94, 1880, 120929, 0, 0, 0, 0, 0, 0, 0, 0, 11237, 0, 129173, 0, 0, + 0, 1757, 6964, 42480, 72823, 0, 120806, 0, 0, 7731, 0, 0, 127883, 0, + 110810, 43988, 70423, 74758, 0, 7592, 856, 74299, 0, 0, 0, 78138, 1459, + 0, 0, 0, 0, 0, 1504, 0, 0, 0, 0, 7529, 0, 0, 0, 0, 12594, 0, 0, 336, 0, + 7509, 0, 0, 0, 0, 127882, 0, 0, 0, 65859, 0, 983967, 43062, 124948, 0, 0, + 0, 0, 12970, 0, 0, 0, 0, 0, 0, 0, 119247, 0, 65068, 74291, 129943, 7069, + 0, 0, 0, 11130, 2087, 0, 0, 0, 0, 126249, 0, 92747, 0, 92614, 2091, 0, + 2090, 0, 0, 7117, 2077, 72281, 0, 77889, 2083, 0, 71196, 0, 0, 71981, 0, + 0, 0, 0, 4165, 8746, 0, 0, 0, 0, 129572, 7066, 0, 70415, 128135, 0, 0, + 7786, 127766, 2233, 0, 124965, 121122, 2302, 0, 0, 7056, 0, 0, 0, 0, 0, + 0, 126506, 6920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 983099, 70438, 2613, 0, 0, + 110734, 0, 74571, 42760, 0, 0, 0, 0, 0, 0, 71843, 0, 0, 70506, 1246, + 74243, 0, 0, 41008, 0, 0, 0, 921, 70048, 0, 12702, 0, 0, 1566, 8407, 0, + 64653, 0, 74617, 0, 0, 72711, 5313, 951, 0, 0, 0, 0, 0, 4009, 70277, + 71844, 0, 83123, 0, 72250, 0, 119898, 113760, 0, 0, 0, 0, 70024, 0, 0, + 119892, 0, 0, 0, 119890, 2579, 119906, 3177, 11357, 69224, 0, 0, 83130, + 64734, 0, 9822, 110670, 70471, 110668, 0, 110666, 0, 0, 0, 0, 9851, + 983729, 110673, 9059, 110671, 110672, 0, 41687, 129054, 0, 71842, 70178, + 0, 0, 1777, 0, 10158, 69767, 0, 42366, 70444, 0, 0, 0, 70127, 71955, + 5989, 110716, 74636, 126999, 0, 41685, 0, 0, 9769, 41684, 0, 6225, + 111328, 11740, 0, 118840, 0, 2600, 0, 70416, 0, 0, 3666, 70420, 0, 71976, + 0, 0, 74542, 69771, 0, 0, 0, 0, 0, 69765, 0, 252, 0, 69769, 0, 194616, 0, + 69763, 0, 0, 0, 0, 0, 0, 0, 120947, 0, 129410, 0, 0, 0, 68323, 125219, 0, + 119188, 0, 0, 121335, 0, 0, 0, 0, 0, 7764, 983726, 11094, 120825, 0, 0, + 92505, 8298, 0, 0, 0, 0, 0, 64449, 0, 126650, 0, 0, 0, 70442, 0, 0, 0, 0, + 7774, 10607, 0, 0, 0, 0, 0, 120764, 0, 0, 0, 0, 3458, 0, 70053, 0, + 120995, 0, 2602, 0, 0, 0, 74907, 0, 0, 0, 0, 172, 0, 4971, 70419, 1889, + 7238, 0, 0, 0, 8257, 0, 0, 0, 129570, 0, 111342, 71948, 0, 43366, 43363, + 9807, 0, 0, 0, 72247, 64479, 0, 0, 0, 113707, 0, 10900, 121355, 0, 0, + 12048, 0, 64292, 0, 0, 0, 6099, 94084, 129486, 0, 0, 299, 0, 8525, 92356, + 0, 0, 111338, 0, 92564, 3075, 0, 94053, 0, 94050, 0, 0, 70440, 0, 123590, + 0, 0, 0, 2581, 11395, 0, 0, 0, 0, 128584, 0, 0, 129423, 0, 118855, 0, 0, + 0, 7204, 70065, 2588, 2914, 7011, 55281, 0, 7466, 0, 2883, 42253, 83118, + 0, 0, 0, 123598, 0, 41230, 68299, 0, 43571, 0, 6219, 0, 9980, 41232, + 92245, 0, 66036, 41229, 118967, 0, 120666, 94016, 0, 12711, 0, 0, 74289, + 68472, 42857, 0, 0, 0, 0, 127306, 119006, 0, 11380, 72348, 0, 0, 0, 0, 0, + 0, 0, 983579, 12722, 0, 922, 0, 0, 983126, 74958, 3218, 120471, 120470, + 120469, 120476, 120475, 8569, 11404, 70450, 120463, 3214, 120461, 120468, + 74910, 3207, 120465, 78729, 78728, 78727, 0, 120460, 7425, 3205, 0, + 78737, 78736, 71729, 43383, 78733, 78732, 2606, 78730, 73897, 0, 11496, + 1173, 0, 0, 129135, 0, 0, 0, 120737, 120953, 120872, 120629, 378, 2610, + 0, 0, 0, 0, 0, 37, 7068, 0, 120480, 70421, 3209, 120477, 0, 120483, 9768, + 120481, 0, 0, 0, 0, 0, 0, 65510, 0, 100625, 0, 0, 0, 100627, 0, 126633, + 0, 7060, 100628, 0, 127752, 0, 69284, 70428, 71463, 0, 7380, 0, 0, + 100593, 126997, 0, 128737, 0, 71465, 121030, 3243, 0, 0, 0, 7050, 0, + 70050, 0, 0, 0, 71466, 8203, 71102, 68241, 0, 65211, 194599, 0, 0, 0, + 779, 125061, 64367, 100906, 69901, 8193, 55279, 0, 0, 0, 7065, 0, 4346, + 0, 0, 908, 0, 0, 8982, 0, 0, 0, 782, 0, 10883, 0, 0, 129396, 65542, + 121302, 0, 68650, 100575, 92244, 0, 0, 111351, 0, 4376, 0, 11787, 12961, + 0, 0, 42888, 0, 100610, 6231, 0, 65713, 100608, 1783, 0, 68238, 0, 0, 0, + 194945, 0, 0, 0, 68653, 0, 983051, 0, 764, 0, 0, 43531, 0, 9033, 0, 0, + 6223, 11042, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120648, 0, 0, 0, 0, 0, + 0, 71971, 0, 1478, 0, 11825, 2607, 0, 0, 0, 74543, 0, 0, 100588, 6132, 0, + 0, 0, 70058, 0, 0, 0, 43537, 6761, 10093, 4369, 0, 0, 73735, 100564, + 3947, 110778, 0, 0, 0, 0, 100942, 0, 0, 0, 0, 0, 0, 7686, 0, 0, 0, + 100934, 0, 100944, 66577, 41221, 0, 42281, 0, 74024, 12293, 0, 94014, + 11794, 0, 0, 1737, 0, 0, 0, 7205, 0, 9335, 12850, 0, 2272, 7055, 0, 0, 0, + 67751, 0, 0, 6780, 65067, 0, 1327, 68393, 983574, 0, 41217, 0, 10018, 0, + 0, 0, 100611, 68176, 41219, 0, 4147, 983170, 41216, 983693, 2616, 70197, + 68461, 65234, 0, 0, 0, 0, 119660, 0, 0, 0, 0, 127930, 119580, 70675, + 64943, 2608, 1470, 0, 0, 6227, 0, 0, 74775, 0, 0, 72320, 101024, 0, + 129535, 0, 0, 0, 0, 0, 10876, 92482, 0, 0, 5834, 0, 6222, 0, 0, 12086, 0, + 1600, 64309, 0, 0, 68883, 127957, 93836, 0, 8882, 0, 129415, 2570, 0, 0, + 194606, 0, 0, 1234, 0, 13115, 110743, 110740, 100923, 5002, 110739, + 41286, 100926, 127019, 0, 0, 0, 0, 0, 0, 0, 41289, 0, 0, 75051, 41272, 0, + 0, 0, 0, 0, 0, 0, 41279, 0, 0, 0, 11081, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9637, + 7112, 77975, 128984, 0, 10886, 0, 8548, 983841, 0, 0, 0, 8076, 43048, + 8290, 8291, 43051, 92570, 0, 2596, 0, 0, 41293, 0, 0, 2393, 7058, 66432, + 0, 68673, 0, 0, 0, 0, 0, 128558, 0, 0, 0, 0, 0, 64696, 0, 0, 121086, + 74165, 0, 0, 0, 0, 0, 0, 7063, 983182, 64893, 73096, 0, 68038, 113757, + 709, 0, 0, 1876, 0, 0, 120868, 8137, 110662, 67752, 70850, 100832, 245, + 100831, 11456, 41233, 7070, 0, 94046, 6136, 100835, 0, 100781, 41235, 0, + 0, 100782, 100642, 432, 0, 100784, 65437, 0, 0, 128909, 0, 100641, + 100649, 0, 100648, 0, 43215, 0, 0, 0, 0, 9052, 0, 0, 110826, 110827, + 74784, 10580, 0, 100845, 0, 64640, 983175, 74455, 0, 129670, 70035, 0, + 12652, 12199, 127030, 0, 2566, 11971, 0, 0, 1065, 0, 0, 0, 2576, 0, + 66819, 0, 983986, 129852, 0, 0, 983050, 983826, 0, 2921, 119104, 0, 5772, + 12968, 70055, 0, 0, 0, 2580, 983822, 0, 0, 70032, 0, 0, 0, 128148, 0, 0, + 121308, 11346, 0, 12054, 100824, 92426, 101112, 0, 13091, 0, 0, 100821, + 100828, 0, 127026, 128334, 74821, 0, 66295, 68037, 68047, 127865, 13090, + 0, 0, 0, 118985, 0, 0, 0, 0, 0, 127824, 0, 0, 100776, 119319, 42356, + 42432, 100778, 119317, 0, 0, 0, 78752, 70030, 66914, 0, 0, 7061, 0, 3854, + 0, 70020, 68413, 0, 42319, 0, 0, 7067, 0, 0, 0, 0, 0, 0, 127797, 9029, + 43543, 0, 2353, 119316, 0, 100769, 0, 100768, 983177, 0, 0, 43664, 0, 0, + 0, 12277, 0, 78122, 11066, 65233, 0, 41224, 0, 0, 3747, 10522, 0, 129582, + 1691, 41226, 0, 917565, 0, 41223, 121135, 121299, 697, 0, 121051, 4244, + 0, 0, 0, 13121, 128573, 0, 0, 0, 0, 0, 0, 129879, 0, 65816, 68111, 0, + 127933, 0, 0, 0, 0, 0, 0, 66895, 74602, 0, 7123, 70038, 5785, 9198, 0, + 100810, 0, 7383, 64656, 0, 0, 0, 0, 0, 0, 0, 0, 13122, 0, 191, 70060, + 8585, 126610, 64411, 0, 0, 64850, 41072, 118996, 0, 0, 0, 0, 100754, + 127010, 100753, 0, 100756, 683, 396, 0, 100758, 0, 100757, 43058, 100760, + 343, 7129, 42680, 0, 0, 0, 0, 0, 100761, 0, 74040, 0, 1724, 0, 119321, 0, + 0, 6263, 0, 0, 0, 6592, 0, 983044, 0, 0, 0, 0, 3730, 1778, 0, 0, 128854, + 121254, 0, 9018, 0, 0, 0, 0, 92763, 5547, 0, 0, 128950, 0, 0, 284, 8108, + 0, 0, 74001, 0, 66460, 7174, 92703, 126072, 0, 0, 4394, 127480, 0, 0, 0, + 101082, 66459, 0, 7180, 101084, 0, 101092, 68800, 42471, 0, 0, 67232, + 64304, 42243, 101094, 2583, 0, 127804, 0, 0, 0, 71702, 3855, 0, 0, 0, 0, + 0, 0, 0, 92416, 7132, 0, 92743, 0, 64756, 3798, 6578, 0, 0, 92481, 9774, + 1275, 0, 0, 983056, 0, 120515, 7873, 0, 0, 0, 0, 0, 0, 73994, 73992, 0, + 0, 0, 41851, 0, 41846, 126485, 92337, 7633, 41849, 68385, 70726, 3224, 0, + 69806, 0, 0, 0, 1510, 68129, 0, 0, 0, 0, 12109, 0, 0, 0, 0, 0, 78377, + 1910, 8671, 78374, 127118, 70290, 0, 0, 0, 2654, 7893, 0, 0, 0, 72394, 0, + 67394, 0, 118970, 70066, 78372, 78371, 78370, 78369, 78368, 0, 0, 0, + 1733, 0, 2568, 0, 0, 0, 0, 41486, 0, 127839, 7116, 0, 0, 0, 7185, 0, 0, + 0, 0, 0, 120575, 120829, 0, 0, 0, 0, 92489, 0, 0, 0, 70022, 7171, 0, 340, + 0, 0, 72980, 0, 128535, 0, 124979, 94073, 0, 0, 0, 11392, 92509, 0, 0, 0, + 0, 0, 0, 0, 100632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11948, 0, 6999, 617, + 983806, 0, 3675, 10600, 0, 0, 74616, 2617, 0, 0, 0, 128446, 0, 0, 8630, + 194771, 7288, 983809, 5545, 983799, 2586, 0, 0, 73123, 983832, 0, 0, 0, + 70847, 0, 0, 0, 0, 11195, 71708, 0, 7835, 70040, 0, 0, 92285, 0, 0, + 72973, 0, 0, 100852, 71118, 10029, 983166, 0, 0, 70033, 124978, 0, 0, + 194782, 0, 0, 118975, 0, 0, 3903, 100893, 983839, 0, 120555, 0, 93036, + 110645, 0, 983565, 0, 0, 194773, 0, 0, 0, 127238, 983803, 100919, 0, + 100918, 64752, 0, 983138, 100920, 0, 43045, 100904, 0, 0, 0, 66394, 7128, + 0, 0, 0, 0, 0, 43044, 2604, 0, 100851, 43046, 121421, 69985, 11768, + 43043, 10470, 0, 7122, 194789, 4390, 454, 41397, 194792, 0, 78762, 0, 0, + 120576, 64572, 0, 68091, 2394, 2575, 113749, 0, 0, 74802, 100913, 129280, + 0, 0, 11989, 0, 0, 128856, 0, 0, 8249, 128172, 0, 0, 6640, 74806, 2598, + 513, 0, 6586, 127521, 129301, 120710, 65008, 0, 0, 92515, 0, 194795, + 66755, 0, 126585, 0, 43152, 78637, 0, 194797, 0, 69893, 6582, 0, 0, + 12839, 0, 0, 0, 0, 2444, 128759, 66620, 0, 0, 0, 0, 69894, 0, 0, 0, 0, + 4238, 11071, 9459, 68437, 78140, 78139, 0, 10079, 0, 0, 0, 0, 0, 11907, + 43928, 0, 0, 0, 0, 92490, 43929, 0, 43926, 64498, 0, 9506, 6978, 126234, + 0, 0, 0, 0, 43934, 0, 1122, 65564, 0, 71055, 0, 0, 1920, 0, 43930, 827, + 0, 0, 0, 0, 6577, 1304, 64733, 0, 10606, 0, 0, 0, 9329, 92997, 9239, + 74422, 0, 129373, 1222, 11076, 0, 69229, 43615, 8262, 72280, 64627, + 19909, 983554, 72279, 0, 287, 0, 233, 0, 0, 42816, 0, 0, 65140, 128158, + 8830, 0, 0, 10524, 41175, 125033, 72294, 0, 5296, 0, 127559, 0, 0, 0, 127154, 74858, 6516, 6515, 6514, 6513, 6512, 0, 70870, 0, 0, 0, 12122, 92462, 100868, 43976, 1785, 92507, 0, 0, 917771, 5138, 0, 0, 0, 100884, 0, 0, 0, 0, 0, 5134, 69980, 322, 4643, 5132, 0, 194942, 0, 5143, 0, - 72309, 119628, 0, 0, 72112, 0, 0, 0, 0, 0, 0, 0, 0, 73097, 0, 0, 0, + 72309, 119628, 0, 0, 72112, 0, 129964, 0, 0, 0, 0, 0, 0, 73097, 0, 0, 0, 127923, 0, 0, 0, 0, 0, 3234, 0, 100886, 0, 100889, 118924, 0, 0, 100875, 68231, 74489, 100872, 120746, 0, 100876, 0, 12714, 0, 64585, 93775, 0, 0, 0, 129428, 0, 11027, 0, 10059, 0, 64524, 9767, 789, 1749, 0, 66766, @@ -27663,14 +28526,14 @@ static const unsigned int code_hash[] = { 0, 6653, 0, 0, 64510, 0, 41868, 0, 128823, 0, 0, 11613, 70737, 12603, 7131, 11108, 4566, 0, 0, 0, 0, 0, 124938, 127369, 0, 0, 5200, 0, 0, 0, 9183, 127361, 74458, 73075, 395, 5482, 1376, 4349, 0, 0, 5196, 0, 6113, - 42009, 5205, 0, 120530, 0, 118973, 70467, 0, 0, 0, 0, 9126, 70498, 0, 0, - 0, 0, 0, 3203, 192, 0, 3385, 125075, 128620, 5383, 0, 0, 0, 5738, 69449, - 3336, 0, 5361, 9633, 0, 0, 0, 0, 8581, 0, 1260, 3149, 5359, 12962, 74955, - 10441, 5357, 0, 0, 0, 5364, 0, 11431, 0, 9101, 0, 0, 0, 0, 78378, 121155, - 42917, 0, 129179, 0, 0, 0, 43360, 78385, 78384, 78383, 78382, 78381, - 78380, 78379, 9319, 7097, 0, 127748, 0, 0, 0, 120632, 0, 71205, 0, 0, 0, - 1720, 0, 0, 0, 8622, 0, 70430, 68772, 0, 0, 0, 73084, 0, 0, 11921, 0, - 11769, 68782, 0, 0, 0, 0, 194571, 41586, 0, 0, 0, 3356, 194572, 64709, + 42009, 5205, 0, 120530, 0, 118973, 70467, 0, 0, 129691, 0, 9126, 70498, + 0, 0, 0, 0, 0, 3203, 192, 0, 3385, 120785, 128620, 5383, 0, 0, 0, 5738, + 69449, 3336, 0, 5361, 9633, 0, 0, 0, 0, 8581, 0, 1260, 3149, 5359, 12962, + 74955, 10441, 5357, 0, 0, 0, 5364, 0, 11431, 0, 9101, 0, 0, 0, 0, 78378, + 121155, 42917, 0, 129179, 0, 0, 0, 43360, 78385, 78384, 78383, 78382, + 78381, 78380, 78379, 9319, 7097, 0, 127748, 0, 0, 0, 120632, 0, 71205, 0, + 0, 0, 1720, 0, 0, 0, 8622, 0, 70430, 68772, 0, 0, 0, 73084, 0, 0, 11921, + 0, 11769, 68782, 0, 0, 0, 0, 194571, 41586, 0, 0, 0, 3356, 194572, 64709, 194575, 0, 7134, 0, 78389, 0, 677, 0, 0, 0, 129474, 68747, 0, 68751, 3349, 74125, 0, 8927, 0, 0, 0, 0, 0, 0, 0, 6806, 0, 10190, 68755, 0, 0, 0, 0, 0, 0, 0, 7113, 7586, 0, 10852, 0, 0, 4606, 0, 0, 70084, 0, 0, 1046, @@ -27678,272 +28541,275 @@ static const unsigned int code_hash[] = { 5169, 11935, 0, 0, 3175, 0, 1537, 0, 5176, 8905, 4136, 4871, 78388, 0, 0, 0, 0, 1128, 0, 0, 0, 74066, 0, 73069, 0, 0, 3662, 113767, 3378, 0, 71298, 0, 127995, 6320, 71302, 983162, 10163, 0, 5165, 5126, 0, 66902, 41389, 0, - 71368, 3374, 0, 0, 7119, 0, 0, 3507, 0, 7629, 983629, 19925, 0, 68463, + 71368, 3374, 113740, 0, 7119, 0, 0, 3507, 0, 7629, 6848, 19925, 0, 68463, 183, 127208, 127209, 70811, 10636, 0, 128465, 0, 0, 78772, 0, 0, 0, 78768, 6580, 4332, 123584, 0, 10726, 66686, 127203, 127204, 127205, 127206, 0, 70813, 127201, 127202, 0, 0, 5448, 41058, 5446, 0, 0, 71369, 5442, 7135, 0, 0, 5451, 0, 78470, 0, 0, 0, 0, 11243, 10859, 65867, 10345, - 10409, 123606, 0, 0, 0, 42181, 0, 0, 2060, 0, 7111, 0, 0, 0, 0, 72741, 0, - 205, 0, 72346, 93771, 0, 9862, 6588, 43257, 0, 0, 0, 5505, 93789, 5503, - 65376, 0, 7125, 9819, 0, 0, 0, 5507, 12044, 194567, 0, 0, 0, 7109, 0, 0, - 7911, 10329, 10393, 8991, 125104, 69778, 11133, 129619, 8550, 0, 5592, - 2919, 0, 0, 5595, 0, 0, 4367, 0, 0, 5591, 41060, 5594, 0, 0, 13142, 5590, - 0, 72274, 118909, 75069, 123586, 9731, 71225, 64633, 0, 0, 71217, 121361, - 71227, 0, 0, 0, 0, 7137, 0, 0, 0, 10551, 10710, 0, 0, 0, 120570, 0, - 92364, 9936, 3348, 0, 0, 1444, 119058, 0, 74206, 983106, 0, 1442, 129080, - 0, 120959, 0, 0, 0, 0, 0, 0, 0, 3334, 73068, 118803, 0, 0, 71219, 69770, - 1651, 0, 8861, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43626, 0, 0, 3344, 0, 0, - 12920, 0, 0, 0, 71853, 3438, 128711, 0, 0, 0, 0, 129068, 0, 0, 65117, 0, - 0, 0, 0, 66366, 128915, 0, 69772, 0, 0, 0, 0, 4973, 8784, 0, 0, 0, 0, 0, - 0, 0, 125198, 983283, 0, 0, 66413, 0, 0, 0, 0, 0, 9243, 2464, 0, 0, 3372, - 0, 0, 0, 70364, 7121, 0, 0, 0, 92163, 0, 0, 0, 0, 0, 0, 0, 3354, 0, 0, 0, - 118999, 0, 3876, 0, 127983, 0, 43696, 43380, 0, 74240, 0, 0, 0, 983966, - 75074, 6589, 0, 0, 120993, 0, 0, 69609, 0, 121210, 0, 10630, 74827, 0, - 121293, 0, 0, 121287, 917942, 121337, 121215, 0, 0, 0, 0, 0, 917940, - 3366, 0, 917938, 0, 0, 0, 71062, 0, 121197, 0, 6925, 71856, 0, 917929, - 66780, 66274, 0, 72768, 0, 917930, 129482, 11138, 0, 6754, 7118, 0, - 64672, 65296, 0, 118957, 0, 0, 12296, 68457, 121320, 0, 5282, 0, 72278, - 0, 0, 0, 0, 0, 0, 66355, 0, 0, 68073, 64343, 0, 92744, 195058, 195029, 0, - 0, 195056, 195027, 0, 0, 128814, 195025, 6584, 195026, 10657, 0, 74544, - 0, 1200, 12243, 0, 195062, 0, 129300, 11545, 0, 120493, 3343, 4424, - 11047, 0, 69863, 3896, 0, 0, 2947, 0, 0, 42221, 0, 68139, 13059, 7942, 0, - 3381, 0, 0, 0, 0, 0, 0, 78235, 0, 0, 0, 7044, 65800, 78236, 0, 7045, - 7175, 7047, 127884, 11791, 0, 0, 3881, 0, 0, 127395, 0, 0, 67075, 7106, - 0, 0, 0, 74211, 41897, 92513, 0, 73040, 66745, 0, 0, 0, 0, 121245, 0, - 64354, 73083, 8777, 0, 129108, 8884, 2385, 73067, 92450, 0, 0, 0, 42027, - 12114, 0, 0, 64936, 0, 0, 0, 0, 0, 126605, 0, 0, 0, 0, 73064, 0, 0, 0, 0, - 0, 0, 0, 73057, 0, 123587, 0, 0, 0, 0, 0, 70803, 0, 0, 124953, 0, 0, 0, - 7048, 11087, 123600, 92536, 7043, 9600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42050, - 0, 55289, 0, 0, 657, 0, 195054, 4461, 92903, 0, 0, 126490, 0, 4468, 0, 0, - 0, 4456, 73070, 10720, 123588, 0, 127520, 0, 0, 0, 195046, 260, 7714, - 74163, 2045, 0, 65064, 4466, 0, 0, 128087, 0, 41403, 0, 0, 0, 41406, - 120692, 0, 0, 73939, 0, 0, 0, 41404, 1165, 0, 4451, 13087, 0, 11258, 0, - 73855, 0, 43014, 5439, 12061, 74586, 3375, 128869, 0, 0, 0, 0, 0, 0, 0, - 113823, 67078, 0, 67079, 0, 0, 0, 0, 68459, 0, 0, 0, 0, 0, 0, 7280, 0, 0, - 0, 4868, 8297, 0, 0, 42791, 0, 66737, 66739, 0, 0, 5182, 0, 0, 72764, 0, - 4465, 0, 12135, 0, 4464, 0, 0, 977, 4458, 43827, 0, 0, 0, 0, 344, 0, 0, - 0, 0, 0, 92240, 0, 64443, 126995, 73078, 129525, 0, 0, 0, 43026, 7612, - 119591, 64413, 0, 0, 0, 0, 0, 0, 0, 0, 123622, 0, 119160, 10204, 127947, - 73063, 0, 0, 127236, 0, 68746, 0, 8852, 0, 0, 0, 0, 128427, 123597, 7932, - 0, 128463, 0, 0, 0, 0, 0, 0, 0, 74893, 0, 0, 73095, 0, 8650, 0, 0, 0, - 69900, 118872, 0, 70868, 0, 6719, 0, 0, 0, 72836, 0, 0, 118991, 0, - 123594, 73815, 4420, 0, 10583, 7760, 0, 0, 128752, 71711, 0, 128407, 0, - 0, 0, 9066, 0, 74795, 0, 0, 0, 0, 0, 0, 0, 42825, 41854, 5304, 0, 124942, - 6919, 8619, 0, 10038, 66454, 9592, 129049, 0, 0, 110771, 110777, 110772, - 0, 0, 0, 0, 0, 78498, 110773, 43624, 0, 7779, 0, 0, 9479, 78493, 0, 0, - 2224, 0, 0, 0, 0, 0, 42378, 3368, 0, 66804, 7697, 69237, 0, 2030, 0, - 68236, 8370, 0, 127961, 0, 0, 983350, 127903, 983348, 983347, 5174, - 42831, 983344, 70439, 983342, 8881, 119047, 0, 70433, 0, 0, 0, 0, 0, 0, - 9576, 0, 3347, 4160, 5154, 0, 3794, 0, 0, 0, 0, 0, 127916, 73073, 8381, - 4572, 71129, 126101, 0, 0, 0, 0, 0, 0, 0, 92283, 0, 0, 5799, 983339, - 70100, 983337, 983336, 983335, 43031, 64425, 65128, 983331, 0, 73059, 0, - 68616, 0, 0, 0, 0, 0, 0, 0, 123604, 0, 0, 283, 68665, 0, 532, 0, 0, - 983808, 0, 0, 3370, 73077, 119132, 5443, 71431, 0, 0, 0, 0, 0, 2298, 0, - 0, 0, 983330, 983329, 983328, 983327, 7144, 983325, 119600, 983323, - 983322, 983321, 0, 78816, 128833, 0, 0, 0, 0, 0, 0, 0, 0, 73088, 0, - 123592, 983933, 0, 0, 0, 0, 5186, 7360, 127837, 0, 12108, 0, 65124, 0, 0, - 0, 6326, 43344, 0, 0, 42562, 0, 0, 0, 983320, 65495, 983318, 101066, - 983316, 101065, 983314, 65490, 983312, 125034, 0, 101070, 0, 55245, - 128927, 1630, 128232, 65483, 0, 0, 0, 65476, 0, 0, 119214, 9283, 10183, - 0, 0, 65499, 0, 64593, 66758, 3376, 0, 0, 0, 101077, 43872, 12940, 0, 0, - 78587, 101078, 5957, 0, 8926, 983310, 983309, 983308, 10745, 10174, - 983305, 113793, 983303, 983302, 983301, 0, 123593, 5056, 0, 0, 0, 120773, - 0, 9812, 0, 4460, 127792, 73066, 0, 128038, 0, 123608, 0, 64278, 0, 0, 0, - 66760, 0, 0, 70122, 0, 0, 917627, 0, 73823, 101071, 0, 2276, 0, 42579, 0, - 983300, 983299, 127831, 983297, 983296, 983295, 983294, 983293, 74207, - 121255, 10482, 12863, 73002, 2412, 0, 9522, 0, 983887, 120674, 101059, - 3384, 101058, 10702, 830, 0, 128166, 0, 8451, 0, 0, 121380, 69739, - 128957, 0, 0, 0, 0, 0, 0, 0, 4243, 92454, 73093, 0, 0, 4441, 0, 983290, - 983289, 66618, 983287, 125141, 411, 983284, 68068, 983282, 4056, 983894, - 0, 92666, 0, 983897, 983949, 0, 0, 3364, 42265, 64437, 0, 118816, 0, - 9684, 216, 0, 1401, 0, 0, 0, 0, 0, 0, 0, 11126, 5768, 3191, 0, 0, 0, 0, - 0, 0, 65895, 0, 0, 3338, 73935, 983278, 983277, 983276, 129605, 983274, - 983273, 2794, 8807, 0, 0, 110720, 0, 8312, 0, 110718, 11953, 11662, 0, 0, - 0, 0, 9534, 66767, 129040, 0, 11113, 0, 0, 73082, 0, 981, 0, 4330, - 119244, 120536, 1824, 0, 0, 7034, 41683, 123166, 0, 73754, 0, 0, 74478, - 128259, 983268, 983255, 983254, 43831, 983252, 66752, 983250, 983249, 0, - 70288, 65343, 0, 0, 43225, 0, 0, 0, 0, 126129, 0, 128608, 0, 0, 0, - 120726, 0, 983833, 11746, 0, 5216, 0, 0, 0, 0, 3468, 127149, 9230, 65942, - 0, 0, 5803, 120677, 0, 0, 13124, 0, 0, 0, 42843, 0, 0, 0, 66753, 11739, - 128318, 0, 128444, 0, 0, 0, 12448, 0, 121441, 13057, 73852, 124994, 0, 0, - 0, 0, 0, 0, 126612, 0, 68903, 0, 129470, 0, 917992, 0, 0, 0, 0, 0, 0, 0, - 92457, 0, 0, 0, 0, 0, 0, 0, 0, 125078, 0, 0, 0, 10970, 92208, 0, 0, 0, - 19944, 0, 9009, 8551, 0, 0, 0, 7575, 0, 0, 128899, 0, 129609, 78847, 0, - 78846, 0, 0, 0, 0, 0, 0, 0, 9775, 100682, 129191, 119052, 68629, 194703, - 0, 0, 78850, 92880, 0, 0, 0, 0, 0, 0, 0, 71273, 6184, 41540, 3303, 66182, + 10409, 123606, 0, 0, 129077, 42181, 0, 0, 2060, 0, 7111, 0, 0, 0, 0, + 72741, 0, 205, 0, 72346, 93771, 0, 9862, 6588, 43257, 0, 0, 0, 5505, + 93789, 5503, 65376, 0, 7125, 9819, 0, 0, 0, 5507, 12044, 194567, 0, 0, 0, + 7109, 0, 0, 7911, 10329, 10393, 8991, 125104, 69778, 11133, 129619, 8550, + 0, 5592, 2919, 0, 0, 5595, 0, 0, 4367, 0, 0, 5591, 41060, 5594, 0, 0, + 13142, 5590, 0, 72274, 118909, 75069, 123586, 9731, 71225, 64633, 0, 0, + 71217, 121361, 71227, 0, 0, 0, 0, 7137, 0, 0, 0, 10551, 10710, 0, 0, 0, + 120570, 0, 92364, 9936, 3348, 0, 0, 1444, 119058, 0, 74206, 983106, 0, + 1442, 129080, 0, 120959, 0, 0, 0, 0, 0, 0, 0, 3334, 73068, 118803, 0, 0, + 71219, 69770, 1651, 0, 8861, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43626, 0, + 0, 3344, 0, 0, 12920, 0, 0, 0, 71853, 3438, 128711, 0, 0, 0, 0, 129068, + 0, 0, 65117, 0, 0, 0, 0, 66366, 128915, 0, 69772, 0, 0, 0, 0, 4973, 8784, + 0, 0, 0, 0, 0, 0, 0, 125198, 983283, 0, 0, 66413, 0, 0, 0, 0, 0, 9243, + 2464, 0, 0, 3372, 0, 0, 0, 70364, 7121, 0, 0, 0, 92163, 0, 0, 0, 0, 0, 0, + 0, 3354, 0, 0, 983103, 101233, 0, 3876, 0, 127983, 0, 43696, 43380, 0, + 74240, 0, 0, 0, 983966, 75074, 6589, 0, 0, 120993, 0, 0, 69609, 0, + 121210, 0, 10630, 71960, 0, 121293, 0, 0, 121287, 917942, 121337, 121215, + 0, 0, 0, 0, 0, 917940, 3366, 0, 917938, 0, 0, 0, 71062, 0, 121197, 0, + 6925, 71856, 0, 917929, 66780, 66274, 0, 72768, 0, 917930, 129482, 11138, + 0, 6754, 7118, 0, 64672, 65296, 0, 118957, 0, 0, 12296, 68457, 121320, 0, + 5282, 0, 72278, 0, 0, 0, 0, 0, 0, 66355, 0, 0, 68073, 64343, 0, 92744, + 195058, 195029, 0, 0, 195056, 195027, 0, 0, 128814, 195025, 6584, 195026, + 10657, 0, 74544, 0, 1200, 12243, 92269, 195062, 0, 129300, 11545, 0, + 120493, 3343, 4424, 11047, 0, 69863, 3896, 0, 0, 2947, 0, 0, 42221, 0, + 68139, 13059, 7942, 0, 3381, 0, 0, 0, 0, 0, 0, 78235, 0, 0, 0, 7044, + 65800, 78236, 0, 7045, 7175, 7047, 127884, 11791, 0, 0, 3881, 0, 0, + 127395, 0, 0, 67075, 7106, 72000, 0, 0, 74211, 41897, 92513, 0, 73040, + 66745, 0, 0, 0, 0, 121245, 0, 64354, 73083, 8777, 0, 129108, 8884, 2385, + 73067, 92450, 0, 0, 0, 42027, 12114, 0, 0, 64936, 0, 0, 0, 0, 0, 126605, + 0, 0, 0, 0, 73064, 0, 0, 0, 0, 0, 0, 0, 73057, 0, 123587, 0, 0, 0, 0, 0, + 70803, 0, 0, 124953, 0, 0, 0, 7048, 11087, 123600, 92536, 7043, 9600, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 42050, 0, 55289, 0, 0, 657, 0, 195054, 4461, + 92903, 0, 0, 126490, 0, 4468, 0, 0, 0, 4456, 73070, 10720, 123588, 0, + 127520, 0, 0, 0, 195046, 260, 7714, 74163, 2045, 0, 65064, 4466, 0, 0, + 128087, 0, 41403, 0, 0, 0, 41406, 120692, 0, 0, 73939, 0, 0, 0, 41404, + 1165, 0, 4451, 13087, 0, 11258, 0, 73855, 0, 43014, 5439, 12061, 74586, + 3375, 128869, 0, 0, 0, 0, 0, 0, 0, 113823, 67078, 0, 67079, 0, 0, 0, 0, + 68459, 0, 0, 0, 0, 0, 0, 7280, 0, 0, 0, 4868, 8297, 0, 0, 42791, 0, + 66737, 66739, 0, 0, 5182, 0, 0, 72764, 0, 4465, 0, 12135, 0, 4464, 0, 0, + 977, 4458, 43827, 0, 0, 0, 0, 344, 0, 0, 0, 0, 0, 92240, 0, 64443, + 126995, 73078, 129525, 0, 0, 0, 43026, 7612, 119591, 64413, 0, 0, 0, 0, + 0, 0, 0, 0, 123622, 0, 119160, 10204, 127947, 73063, 0, 0, 127236, 0, + 68746, 0, 8852, 0, 0, 0, 0, 128427, 123597, 7932, 0, 128463, 0, 0, 0, 0, + 0, 0, 0, 74893, 0, 0, 73095, 0, 8650, 0, 0, 0, 69900, 118872, 0, 70868, + 0, 6719, 0, 0, 0, 72836, 0, 0, 118991, 0, 123594, 73815, 4420, 0, 10583, + 7760, 0, 0, 128752, 71711, 0, 128407, 0, 0, 0, 9066, 0, 74795, 0, 0, 0, + 0, 0, 0, 0, 42825, 41854, 5304, 0, 124942, 6919, 8619, 0, 10038, 66454, + 9592, 129049, 0, 0, 110771, 110777, 110772, 0, 0, 0, 0, 0, 78498, 110773, + 43624, 0, 7779, 0, 0, 9479, 78493, 0, 0, 2224, 0, 0, 0, 0, 0, 42378, + 3368, 0, 66804, 7697, 69237, 0, 2030, 0, 68236, 8370, 0, 127961, 0, 0, + 983350, 127903, 983348, 983347, 5174, 42831, 983344, 70439, 983342, 8881, + 119047, 0, 70433, 0, 0, 0, 0, 0, 0, 9576, 0, 3347, 4160, 5154, 0, 3794, + 0, 0, 0, 0, 0, 127916, 73073, 8381, 4572, 69564, 126101, 0, 0, 0, 0, 0, + 0, 0, 92283, 0, 0, 5799, 983339, 70100, 983337, 983336, 983335, 43031, + 64425, 65128, 983331, 0, 73059, 0, 68616, 0, 0, 0, 0, 119826, 0, 0, + 123604, 0, 0, 283, 68665, 0, 532, 0, 0, 983808, 0, 0, 3370, 73077, + 119132, 5443, 71431, 0, 0, 0, 0, 0, 2298, 0, 0, 0, 983330, 983329, + 983328, 983327, 7144, 983325, 119600, 983323, 983322, 983321, 0, 78816, + 128833, 0, 0, 0, 0, 0, 0, 0, 0, 73088, 0, 123592, 983933, 0, 0, 0, 0, + 5186, 7360, 127837, 0, 12108, 0, 65124, 0, 0, 0, 6326, 43344, 0, 0, + 42562, 0, 0, 0, 983320, 65495, 983318, 101066, 983316, 101065, 983314, + 65490, 983312, 125034, 0, 101070, 0, 55245, 128927, 1630, 128232, 65483, + 0, 0, 0, 65476, 0, 0, 119214, 9283, 10183, 0, 0, 65499, 0, 64593, 66758, + 3376, 0, 0, 0, 101077, 43872, 12940, 0, 0, 78587, 101078, 5957, 0, 8926, + 983310, 983309, 983308, 10745, 10174, 983305, 113793, 983303, 983302, + 983301, 0, 123593, 5056, 0, 0, 0, 120773, 0, 9812, 0, 4460, 127792, + 73066, 0, 128038, 0, 123608, 0, 64278, 0, 0, 0, 66760, 0, 0, 70122, 0, 0, + 917627, 0, 73823, 101071, 127922, 2276, 0, 42579, 0, 983300, 983299, + 127831, 983297, 983296, 983295, 983294, 983293, 74207, 121255, 10482, + 12863, 73002, 2412, 0, 9522, 0, 983887, 120674, 101059, 3384, 101058, + 10702, 830, 0, 128166, 0, 8451, 0, 0, 121380, 69739, 128957, 0, 0, 0, 0, + 0, 0, 0, 4243, 92454, 73093, 0, 0, 4441, 0, 983290, 983289, 66618, + 983287, 125141, 411, 983284, 68068, 983282, 4056, 983894, 0, 92666, 0, + 983897, 983949, 0, 0, 3364, 42265, 64437, 0, 118816, 0, 9684, 216, 0, + 1401, 0, 0, 0, 0, 0, 0, 0, 11126, 5768, 3191, 0, 0, 0, 0, 0, 0, 65895, 0, + 0, 3338, 73935, 983278, 983277, 983276, 129605, 983274, 983273, 2794, + 8807, 0, 0, 110720, 0, 8312, 0, 110718, 11953, 11662, 0, 0, 0, 0, 9534, + 66767, 129040, 0, 11113, 0, 0, 73082, 0, 981, 0, 4330, 119244, 120536, + 1824, 0, 0, 7034, 41683, 123166, 0, 73754, 0, 0, 74478, 128259, 983268, + 983255, 983254, 43831, 983252, 66752, 983250, 983249, 0, 70288, 65343, 0, + 0, 43225, 0, 0, 0, 0, 126129, 0, 128608, 0, 0, 0, 120726, 0, 983833, + 11746, 0, 5216, 0, 0, 0, 0, 3468, 127149, 9230, 65942, 0, 0, 5803, + 120677, 0, 0, 13124, 0, 0, 0, 42843, 0, 0, 0, 66753, 11739, 128318, 0, + 128444, 0, 0, 0, 12448, 0, 121441, 13057, 73852, 124994, 0, 0, 0, 0, 0, + 0, 126612, 0, 68903, 0, 129470, 0, 917992, 0, 0, 0, 0, 0, 0, 0, 92457, 0, + 0, 0, 0, 0, 0, 0, 0, 125078, 0, 0, 0, 10970, 92208, 0, 0, 0, 19944, 0, + 9009, 8551, 0, 0, 0, 7575, 0, 0, 128899, 0, 129609, 78847, 0, 78846, 0, + 0, 69256, 0, 0, 0, 0, 9775, 100682, 129191, 119052, 68629, 194703, 0, 0, + 78850, 92880, 0, 0, 0, 0, 0, 0, 0, 71273, 6184, 41540, 3303, 66182, 11786, 66180, 66203, 3422, 0, 68290, 43007, 4478, 66178, 0, 0, 126216, 0, 4477, 0, 69608, 66184, 66183, 66204, 66194, 0, 66198, 41880, 66188, 66197, 78148, 66195, 66190, 66191, 41111, 66189, 73788, 7788, 0, 0, 0, 0, 0, 2221, 78163, 6535, 78161, 78162, 430, 78160, 78156, 78158, 0, 0, 4945, 0, 4950, 0, 78165, 0, 67118, 0, 5964, 12908, 0, 0, 0, 74477, 83390, 0, 4949, 0, 443, 0, 4944, 5467, 119603, 983260, 0, 9364, 0, 119148, 4946, 0, - 3788, 126106, 983699, 0, 120847, 0, 74441, 0, 0, 12072, 92248, 0, 983689, - 0, 128676, 12091, 0, 0, 0, 4673, 0, 4678, 0, 0, 65059, 43860, 0, 0, 0, - 128151, 1199, 0, 8356, 0, 0, 4677, 0, 0, 0, 4672, 78173, 78175, 78171, - 78172, 72255, 78170, 78166, 4674, 128450, 194944, 0, 124970, 0, 119579, - 0, 0, 1855, 0, 0, 127806, 0, 0, 68912, 72323, 0, 12988, 121000, 0, 0, 0, - 4654, 6840, 983427, 0, 73993, 0, 4649, 65209, 983889, 93839, 4648, 0, - 121169, 983431, 126231, 983422, 66846, 7828, 4650, 983421, 72879, 0, - 4653, 7822, 0, 0, 43187, 0, 983574, 6821, 0, 0, 0, 0, 0, 0, 66756, - 983428, 0, 0, 0, 8547, 0, 42165, 0, 119228, 6836, 0, 0, 4662, 0, 0, 0, - 9146, 599, 4657, 0, 120754, 0, 4656, 0, 0, 7811, 40994, 0, 6414, 5967, - 4658, 3725, 0, 5814, 4661, 127760, 194961, 0, 0, 64904, 0, 10833, 0, 0, - 4867, 128717, 0, 11459, 3054, 0, 40996, 0, 7605, 4622, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 19926, 0, 0, 65307, 4617, 0, 0, 0, 4616, 10518, 0, 127160, 0, - 5958, 0, 983444, 4618, 0, 0, 120675, 4621, 0, 0, 522, 125213, 11139, - 65803, 194972, 0, 12201, 6135, 121060, 983420, 0, 983093, 0, 983418, - 983411, 983432, 4638, 983416, 0, 78242, 5965, 78240, 66569, 68646, 0, - 983450, 74392, 5335, 0, 0, 4633, 0, 119045, 983446, 4632, 0, 5542, 5333, - 0, 983423, 68648, 5331, 4634, 0, 0, 5338, 4637, 0, 0, 43477, 0, 42493, 0, - 42361, 0, 0, 73853, 0, 0, 0, 74204, 11343, 0, 10358, 10422, 4758, 0, - 1608, 5252, 0, 0, 4753, 78239, 11344, 78237, 0, 5231, 74384, 0, 0, 0, 0, - 0, 0, 0, 0, 5229, 4757, 0, 0, 5227, 4752, 0, 65235, 5234, 73044, 0, 0, 0, - 0, 0, 0, 7460, 0, 917936, 0, 0, 74760, 65189, 0, 92230, 0, 0, 5574, 0, 0, - 65139, 5577, 0, 0, 118871, 68641, 8965, 7635, 0, 5316, 70021, 5314, - 74555, 5572, 0, 5312, 0, 5525, 5330, 5319, 68292, 0, 65066, 0, 0, 983491, - 0, 0, 127851, 0, 74851, 0, 0, 64609, 0, 0, 128593, 0, 129339, 0, 8632, 0, - 0, 0, 195012, 5735, 195013, 1692, 0, 4610, 0, 4305, 0, 4609, 43478, 4614, - 0, 0, 5287, 5309, 5285, 0, 5961, 4647, 5283, 10743, 0, 71889, 601, 4613, - 0, 0, 9208, 4608, 74044, 71107, 5190, 0, 0, 92410, 43965, 2265, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 5960, 0, 8992, 65293, 0, 1782, 0, 0, 0, 0, 0, 5501, - 0, 42508, 69759, 120749, 0, 0, 195023, 983919, 43900, 128325, 0, 68134, - 111180, 74209, 0, 64740, 0, 0, 0, 983916, 3767, 5737, 0, 4865, 0, 5740, - 0, 5736, 7724, 0, 7193, 0, 0, 5739, 0, 4866, 0, 0, 0, 4869, 67093, 0, 0, - 128514, 6650, 983483, 0, 983474, 78376, 4870, 0, 68661, 6716, 983473, - 68667, 69786, 68676, 0, 10122, 4864, 66568, 0, 0, 0, 9603, 68652, 126213, - 42734, 745, 0, 0, 0, 4777, 0, 917925, 68631, 42775, 68196, 0, 0, 0, 0, - 5966, 0, 4778, 127890, 0, 0, 4781, 127196, 64407, 0, 74132, 8577, 71221, - 0, 71223, 0, 4782, 0, 0, 120757, 68618, 43472, 43056, 68622, 0, 92986, - 4776, 0, 11492, 0, 0, 13176, 0, 0, 0, 0, 0, 0, 0, 4849, 8242, 9561, - 73922, 0, 0, 0, 0, 5963, 0, 125201, 0, 4850, 72121, 0, 590, 4853, 0, - 4854, 0, 5164, 0, 1605, 5124, 0, 111165, 0, 8471, 0, 111164, 12445, 3785, - 0, 111162, 0, 0, 4848, 2530, 0, 2068, 1964, 0, 0, 10796, 0, 0, 0, 0, 0, - 4794, 0, 0, 0, 4797, 68040, 111152, 43465, 4792, 0, 0, 0, 0, 0, 110842, - 983101, 92963, 0, 0, 0, 4221, 92360, 118869, 0, 0, 0, 70042, 0, 0, 0, 0, - 10739, 65090, 0, 119327, 126541, 0, 0, 119326, 0, 0, 4937, 43376, 0, 0, - 10597, 0, 11722, 9248, 129566, 42879, 11725, 0, 0, 7579, 11141, 73958, - 4941, 0, 917538, 9140, 4936, 5261, 0, 0, 72298, 0, 4942, 0, 4938, 0, 0, - 5259, 9369, 983429, 111182, 5257, 0, 6844, 4964, 5264, 0, 0, 0, 41411, 0, + 3788, 126106, 983699, 0, 120847, 129858, 74441, 0, 0, 12072, 92248, 0, + 983689, 0, 128676, 12091, 0, 0, 0, 4673, 0, 4678, 0, 0, 65059, 43860, 0, + 0, 0, 128151, 1199, 0, 8356, 0, 0, 4677, 0, 0, 0, 4672, 78173, 78175, + 78171, 78172, 72255, 78170, 78166, 4674, 128450, 194944, 0, 124970, 0, + 119579, 0, 129919, 1855, 0, 0, 127806, 0, 0, 68912, 72323, 0, 12988, + 121000, 0, 0, 0, 4654, 6840, 983427, 0, 73993, 0, 4649, 65209, 983889, + 93839, 4648, 0, 121169, 983431, 126231, 983422, 66846, 7828, 4650, + 983421, 72879, 0, 4653, 7822, 0, 0, 43187, 0, 983586, 6821, 0, 0, 0, 0, + 0, 0, 66756, 983428, 0, 0, 0, 8547, 0, 42165, 0, 119228, 6836, 0, 0, + 4662, 0, 0, 0, 9146, 599, 4657, 0, 120754, 0, 4656, 0, 0, 7811, 40994, 0, + 6414, 5967, 4658, 3725, 0, 5814, 4661, 127760, 194961, 0, 0, 64904, 0, + 10833, 0, 0, 4867, 128717, 0, 11459, 3054, 0, 40996, 0, 7605, 4622, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19926, 0, 0, 65307, 4617, 0, 0, 0, 4616, 10518, 0, + 127160, 0, 5958, 0, 983444, 4618, 0, 983437, 120675, 4621, 0, 983439, + 522, 125213, 11139, 65803, 194972, 0, 12201, 6135, 121060, 983420, 0, + 983093, 0, 983418, 983411, 983432, 4638, 983416, 0, 78242, 5965, 78240, + 66569, 68646, 0, 983450, 74392, 5335, 0, 0, 4633, 0, 119045, 983446, + 4632, 0, 5542, 5333, 0, 983423, 68648, 5331, 4634, 0, 0, 5338, 4637, 0, + 0, 43477, 0, 42493, 0, 42361, 0, 0, 73853, 0, 0, 0, 74204, 11343, 0, + 10358, 10422, 4758, 0, 1608, 5252, 0, 0, 4753, 78239, 11344, 78237, 0, + 5231, 74384, 0, 0, 0, 0, 0, 0, 0, 71991, 5229, 4757, 0, 0, 5227, 4752, 0, + 65235, 5234, 73044, 0, 0, 0, 0, 0, 0, 7460, 0, 917936, 0, 0, 74760, + 65189, 0, 92230, 0, 0, 5574, 0, 0, 65139, 5577, 0, 0, 118871, 68641, + 8965, 7635, 0, 5316, 70021, 5314, 74555, 5572, 0, 5312, 0, 5525, 5330, + 5319, 68292, 0, 65066, 0, 0, 983491, 0, 0, 127851, 0, 74851, 0, 0, 64609, + 0, 0, 128593, 0, 129339, 0, 8632, 0, 0, 0, 195012, 5735, 195013, 1692, + 118792, 4610, 0, 4305, 0, 4609, 43478, 4614, 0, 0, 5287, 5309, 5285, 0, + 5961, 4647, 5283, 10743, 0, 71889, 601, 4613, 0, 0, 9208, 4608, 74044, + 71107, 5190, 0, 0, 92410, 43965, 2265, 0, 0, 0, 0, 0, 0, 0, 129953, 0, 0, + 5960, 0, 8992, 65293, 0, 1782, 0, 0, 0, 0, 0, 5501, 0, 42508, 69759, + 120749, 0, 0, 195023, 983919, 43900, 128325, 0, 68134, 111180, 74209, 0, + 64740, 0, 0, 0, 983916, 3767, 5737, 0, 4865, 0, 5740, 0, 5736, 7724, 0, + 7193, 0, 0, 5739, 0, 4866, 0, 0, 0, 4869, 67093, 0, 0, 128514, 6650, + 983483, 0, 983474, 78376, 4870, 0, 68661, 6716, 983473, 68667, 69786, + 68676, 0, 10122, 4864, 66568, 0, 0, 0, 9603, 68652, 126213, 42734, 745, + 0, 0, 0, 4777, 0, 917925, 68631, 42775, 68196, 0, 0, 0, 0, 5966, 0, 4778, + 127890, 0, 0, 4781, 127196, 64407, 0, 74132, 8577, 71221, 0, 71223, 0, + 4782, 0, 0, 120757, 68618, 43472, 43056, 68622, 0, 92986, 4776, 0, 11492, + 0, 0, 13176, 0, 0, 0, 0, 0, 0, 0, 4849, 8242, 9561, 73922, 0, 0, 0, 0, + 5963, 0, 125201, 0, 4850, 72121, 0, 590, 4853, 0, 4854, 0, 5164, 0, 1605, + 5124, 0, 111165, 0, 8471, 0, 111164, 12445, 3785, 0, 111162, 0, 0, 4848, + 2530, 0, 2068, 1964, 0, 0, 10796, 0, 0, 0, 0, 0, 4794, 0, 0, 0, 4797, + 68040, 111152, 43465, 4792, 0, 0, 0, 0, 0, 110842, 983101, 92963, 0, 0, + 0, 4221, 92360, 118869, 0, 0, 0, 70042, 0, 0, 0, 0, 10739, 65090, 0, + 119327, 126541, 0, 0, 119326, 0, 0, 4937, 43376, 0, 0, 10597, 983440, + 11722, 9248, 129566, 42879, 11725, 0, 0, 7579, 11141, 73958, 4941, 0, + 917538, 9140, 4936, 5261, 0, 0, 72298, 0, 4942, 0, 4938, 0, 0, 5259, + 9369, 983429, 111182, 5257, 0, 6844, 4964, 5264, 0, 0, 0, 41411, 0, 121473, 73684, 128233, 9482, 4873, 41991, 64707, 42526, 127989, 64480, 64725, 983442, 0, 0, 0, 0, 0, 0, 73043, 0, 389, 10893, 7521, 0, 4872, 5463, 0, 3125, 111124, 0, 4878, 5459, 4604, 0, 0, 5465, 0, 0, 0, 0, 9563, - 0, 0, 128419, 125273, 0, 0, 0, 0, 67735, 0, 0, 0, 0, 0, 78179, 0, 917838, - 0, 917833, 0, 917836, 0, 0, 3082, 0, 0, 0, 0, 0, 7079, 5856, 917842, - 5163, 0, 0, 1817, 66724, 0, 0, 10564, 7763, 13077, 0, 0, 68140, 111137, - 0, 0, 0, 111139, 0, 111149, 121457, 0, 0, 0, 983189, 73081, 0, 0, 983117, - 983077, 0, 42156, 0, 0, 0, 983080, 0, 0, 0, 119254, 120693, 0, 69386, 0, - 118881, 0, 78189, 0, 78186, 78188, 0, 0, 0, 0, 110877, 0, 3108, 9745, 0, - 0, 0, 118825, 0, 0, 0, 0, 0, 10972, 0, 0, 42768, 715, 983113, 121117, - 9453, 5348, 10943, 0, 983169, 0, 0, 0, 983153, 0, 0, 11551, 128464, 0, 0, - 9051, 0, 71728, 0, 120791, 119523, 0, 6404, 66458, 68376, 11984, 9156, - 65222, 74454, 78180, 0, 3128, 4789, 5067, 5066, 0, 4784, 0, 8827, 1146, - 5065, 78196, 78192, 78193, 78190, 78191, 5064, 5326, 0, 9450, 5063, - 120361, 78200, 78201, 5062, 69733, 74146, 0, 0, 0, 0, 77992, 0, 3933, 0, - 0, 12337, 0, 125023, 0, 0, 0, 194759, 0, 0, 82993, 42130, 0, 5151, - 917832, 120357, 0, 93980, 0, 7620, 3800, 0, 0, 0, 127952, 0, 0, 4786, - 127991, 4185, 0, 128742, 0, 983193, 73978, 0, 4593, 0, 120584, 0, 0, - 110715, 10532, 110713, 110714, 110711, 110712, 64759, 1325, 5166, 9888, - 0, 5148, 0, 0, 78205, 78206, 64140, 78204, 64131, 3119, 917814, 0, + 0, 0, 128419, 125273, 82963, 0, 0, 0, 67735, 0, 0, 0, 0, 0, 78179, 0, + 917838, 0, 917833, 0, 917836, 0, 0, 3082, 0, 0, 0, 0, 0, 7079, 5856, + 917842, 5163, 0, 0, 1817, 66724, 0, 0, 10564, 7763, 13077, 0, 0, 68140, + 111137, 0, 0, 0, 111139, 0, 111149, 121457, 0, 0, 0, 983189, 73081, 0, 0, + 983117, 983077, 0, 42156, 0, 0, 0, 983080, 0, 0, 0, 119254, 120693, 0, + 69386, 0, 118881, 0, 78189, 0, 78186, 78188, 0, 0, 0, 0, 110877, 0, 3108, + 9745, 0, 0, 0, 118825, 0, 0, 0, 0, 0, 10972, 0, 0, 42768, 715, 983113, + 121117, 9453, 5348, 10943, 0, 983169, 0, 0, 0, 983153, 0, 0, 11551, + 128464, 0, 0, 9051, 0, 71728, 0, 120791, 119523, 0, 6404, 66458, 68376, + 11984, 9156, 65222, 74454, 78180, 0, 3128, 4789, 5067, 5066, 0, 4784, 0, + 8827, 1146, 5065, 78196, 78192, 78193, 78190, 78191, 5064, 5326, 0, 9450, + 5063, 120361, 78200, 78201, 5062, 69733, 74146, 0, 0, 0, 0, 77992, 0, + 3933, 0, 0, 12337, 0, 125023, 0, 0, 0, 194759, 0, 0, 82993, 42130, 0, + 5151, 917832, 120357, 0, 93980, 0, 7620, 3800, 0, 0, 0, 127952, 0, 0, + 4786, 127991, 4185, 0, 128742, 0, 983193, 73978, 0, 4593, 0, 120584, 0, + 0, 110715, 10532, 110713, 110714, 110711, 110712, 64759, 1325, 5166, + 9888, 0, 5148, 0, 0, 78205, 78206, 64140, 78204, 64131, 3119, 917814, 0, 983433, 917820, 12095, 0, 0, 636, 128002, 0, 983464, 0, 78531, 7836, 42741, 64137, 0, 118969, 0, 92431, 0, 0, 0, 0, 0, 8618, 0, 41384, 0, 0, - 0, 3937, 12312, 128261, 0, 0, 0, 912, 6349, 4536, 0, 0, 126594, 0, 0, 0, - 3935, 120665, 0, 0, 0, 0, 118859, 0, 0, 0, 0, 12046, 12599, 0, 0, 0, 0, - 7227, 0, 0, 0, 983066, 0, 0, 0, 113817, 0, 78246, 0, 0, 0, 0, 0, 0, 0, 0, - 128874, 43907, 0, 0, 0, 0, 4644, 8818, 0, 0, 0, 0, 93066, 66452, 126081, - 1644, 101043, 9658, 43744, 11385, 65947, 983173, 43983, 0, 0, 0, 8962, 0, - 0, 2466, 42039, 67669, 0, 0, 42117, 100698, 0, 0, 0, 0, 43745, 5318, 0, - 917807, 0, 0, 0, 7054, 64147, 0, 917804, 68195, 6698, 0, 0, 0, 70849, - 11981, 12202, 0, 121364, 0, 7059, 11608, 975, 0, 65843, 170, 0, 67239, - 42708, 0, 0, 6058, 0, 0, 0, 70507, 0, 0, 9818, 0, 0, 42106, 0, 983065, - 4738, 42105, 7062, 0, 4737, 11779, 4742, 120564, 92391, 0, 41374, 41375, - 983376, 6715, 12700, 7049, 983374, 0, 0, 0, 4741, 42108, 983365, 64159, - 4736, 64148, 0, 849, 0, 128247, 983361, 0, 120913, 917997, 0, 983379, - 9496, 66371, 983403, 0, 11322, 0, 93008, 3928, 983152, 0, 10706, 7198, 0, - 4842, 12053, 0, 0, 4841, 0, 4171, 12008, 68416, 3923, 1490, 0, 0, 983393, - 40972, 5245, 72288, 983395, 126578, 0, 4845, 8332, 40974, 0, 4840, 9077, - 0, 2408, 72851, 4825, 0, 0, 0, 0, 126251, 0, 0, 983353, 0, 983354, 0, - 4826, 42440, 0, 0, 1274, 0, 74315, 0, 120384, 0, 121200, 0, 0, 0, 4830, - 983388, 129044, 0, 0, 119082, 0, 64105, 0, 0, 4824, 120397, 0, 0, 1888, - 64127, 7861, 125111, 78524, 41836, 0, 10873, 72439, 0, 64098, 12214, 0, - 41834, 0, 358, 128120, 41833, 11442, 0, 0, 0, 0, 64115, 0, 0, 0, 120721, - 119053, 0, 119055, 119054, 0, 0, 0, 0, 4017, 12827, 5241, 0, 73042, - 41118, 3924, 0, 11366, 0, 0, 0, 0, 41116, 69455, 0, 0, 0, 0, 11917, 0, - 74000, 4721, 129635, 983918, 0, 0, 0, 0, 0, 0, 122907, 0, 128702, 4722, - 6816, 124974, 0, 4725, 67099, 4726, 0, 0, 123171, 0, 123194, 0, 0, 0, - 4015, 0, 8052, 78766, 0, 0, 128294, 0, 0, 4720, 73090, 125003, 0, 0, - 1656, 41831, 0, 0, 41843, 0, 0, 1452, 13111, 0, 0, 0, 8552, 64113, 41845, - 64073, 120354, 0, 0, 120066, 120067, 7064, 64070, 9948, 0, 0, 0, 0, 2420, - 0, 0, 0, 0, 120052, 120053, 120050, 74920, 3938, 120057, 120054, 119249, - 120060, 71920, 120058, 120059, 120064, 72203, 7955, 64074, 4713, 128196, - 983107, 0, 0, 0, 65152, 10198, 120044, 120045, 120042, 6713, 4532, - 120049, 120046, 120047, 4717, 7046, 0, 66450, 4712, 75055, 0, 121085, 0, - 8155, 4718, 3942, 4714, 9625, 0, 6383, 0, 12006, 0, 0, 0, 0, 0, 65414, 0, - 0, 129061, 66437, 66025, 74115, 0, 0, 11228, 4809, 0, 92221, 72352, 0, 0, - 0, 65405, 0, 0, 0, 73934, 4545, 0, 917566, 0, 4813, 78699, 0, 0, 4808, 0, - 0, 65475, 0, 0, 4814, 72240, 4810, 0, 0, 68784, 10761, 71249, 3522, 0, - 78693, 65404, 0, 0, 0, 0, 0, 6691, 70125, 0, 126223, 0, 0, 0, 43858, 0, - 0, 12992, 65407, 0, 0, 3919, 0, 0, 0, 0, 0, 0, 12235, 110748, 0, 0, - 64091, 68739, 64080, 0, 64090, 0, 0, 0, 0, 0, 8454, 0, 0, 983858, 0, 0, - 0, 4780, 0, 0, 92764, 64621, 6732, 0, 0, 0, 0, 121363, 0, 0, 120817, - 6976, 0, 119005, 0, 93809, 0, 0, 0, 12526, 120399, 2315, 0, 1938, 0, 0, - 0, 0, 0, 0, 0, 120358, 93794, 0, 0, 0, 93810, 0, 2291, 0, 0, 0, 0, - 129429, 0, 10799, 0, 0, 66372, 0, 4193, 0, 0, 983057, 7998, 0, 0, 0, 0, - 2316, 0, 0, 0, 0, 125241, 0, 0, 74140, 0, 0, 0, 0, 3762, 93813, 120672, - 93820, 0, 0, 0, 70098, 3780, 12808, 8163, 983154, 0, 0, 3906, 12349, 0, - 8326, 0, 65498, 3763, 0, 5618, 0, 3779, 0, 43613, 0, 128007, 0, 0, 0, 0, - 280, 0, 126252, 983448, 13072, 1894, 0, 0, 65478, 43310, 7231, 0, 11773, - 0, 0, 0, 0, 0, 0, 7559, 11652, 10009, 110765, 110766, 110763, 110764, - 4470, 110762, 0, 0, 983441, 0, 5249, 0, 0, 8756, 0, 0, 41694, 120585, - 92349, 0, 0, 0, 69685, 983768, 983445, 113794, 0, 6808, 41319, 13125, - 66332, 127977, 0, 2290, 0, 983413, 0, 0, 3943, 0, 41205, 0, 0, 0, 0, - 5352, 0, 0, 41207, 0, 7384, 69647, 41204, 0, 41209, 69637, 0, 43607, 0, - 0, 5420, 0, 10134, 0, 0, 4018, 7150, 0, 0, 0, 0, 0, 129606, 2561, 0, 0, - 7148, 12076, 0, 0, 0, 0, 6276, 1706, 0, 0, 7146, 0, 128277, 41819, 74991, - 0, 10847, 41822, 72248, 860, 0, 0, 0, 69641, 10753, 41820, 126118, 0, - 71898, 0, 92617, 128567, 0, 0, 43016, 0, 0, 92225, 0, 0, 0, 0, 4022, 0, - 0, 110807, 0, 41691, 0, 75060, 0, 0, 65292, 0, 110812, 0, 3911, 110811, - 110808, 110809, 0, 125191, 7000, 3904, 118997, 72261, 0, 0, 0, 13123, - 10846, 0, 0, 0, 0, 0, 74082, 0, 0, 0, 0, 3777, 128329, 0, 9636, 71726, 0, - 0, 9367, 593, 0, 3999, 0, 41713, 0, 0, 67677, 0, 0, 0, 9763, 120280, - 120283, 12347, 124, 12981, 41127, 92527, 0, 0, 0, 0, 0, 43987, 0, 0, - 1769, 41715, 2463, 2151, 0, 0, 71222, 1538, 93044, 0, 0, 0, 7795, 120300, - 0, 92493, 10955, 0, 0, 0, 78208, 9498, 78207, 127033, 78210, 120288, - 3939, 120290, 120285, 8943, 120287, 120286, 120297, 4491, 120299, 42602, - 120293, 120292, 120295, 120294, 0, 0, 0, 0, 0, 0, 1511, 9324, 0, 0, 0, 0, - 0, 64536, 0, 0, 0, 124935, 6822, 12862, 0, 0, 42143, 41828, 0, 917629, - 70864, 118879, 0, 0, 0, 41826, 128413, 0, 0, 13279, 7917, 0, 0, 0, 0, 0, - 0, 92332, 0, 0, 43515, 0, 0, 0, 4013, 0, 0, 0, 72224, 125266, 0, 68243, - 2432, 0, 0, 0, 0, 0, 69952, 0, 0, 0, 10949, 0, 0, 0, 0, 0, 0, 0, 128574, - 43233, 0, 42517, 0, 0, 0, 0, 0, 64468, 119359, 6474, 127275, 43497, - 12656, 128122, 119353, 0, 1665, 0, 0, 0, 119351, 0, 0, 5256, 0, 0, 0, - 2859, 0, 0, 0, 0, 0, 0, 128220, 0, 770, 0, 811, 0, 0, 917551, 42244, - 64427, 0, 72222, 0, 3895, 0, 74341, 12087, 0, 42859, 10193, 3116, 7747, - 0, 0, 43496, 0, 0, 0, 0, 41877, 0, 65382, 64614, 0, 64296, 0, 6345, 0, - 2663, 0, 121234, 0, 0, 10150, 0, 64308, 1522, 597, 0, 0, 41201, 64731, 0, - 0, 41198, 0, 71483, 3092, 0, 0, 4783, 71448, 0, 0, 0, 10812, 0, 0, 0, - 3078, 0, 0, 0, 0, 0, 71703, 394, 3088, 0, 0, 0, 3991, 0, 129072, 0, 424, - 67652, 74927, 0, 0, 0, 0, 0, 0, 42231, 2209, 128215, 72983, 0, 41840, - 129136, 5344, 1298, 0, 13155, 0, 128973, 41838, 0, 8488, 1003, 41837, 0, - 0, 0, 48, 0, 0, 8493, 0, 0, 0, 65487, 0, 8465, 10332, 13172, 0, 0, 10449, - 126989, 127014, 69606, 69447, 3984, 129159, 0, 0, 0, 0, 0, 0, 0, 0, - 64758, 0, 100947, 0, 0, 9096, 0, 0, 9172, 128545, 0, 0, 5955, 67666, 0, - 0, 0, 0, 0, 74426, 3926, 71734, 0, 8798, 100946, 92165, 0, 0, 120696, 0, - 0, 0, 118805, 10353, 10417, 0, 0, 0, 128629, 4019, 0, 0, 0, 8219, 68402, - 0, 0, 121301, 0, 0, 0, 0, 0, 0, 0, 0, 110625, 42474, 10642, 3909, 9950, - 0, 128139, 69619, 68678, 92917, 0, 1049, 43517, 65707, 11943, 41806, 0, - 68635, 3921, 0, 11775, 121352, 69820, 1038, 42303, 9823, 0, 2145, 4008, - 68624, 0, 121025, 0, 0, 5153, 41805, 0, 0, 763, 9211, 0, 0, 0, 0, 0, - 127142, 0, 0, 65179, 0, 8621, 0, 118878, 0, 0, 0, 0, 182, 0, 0, 0, 0, - 72978, 9058, 8489, 0, 71188, 5969, 65909, 10848, 4570, 0, 128614, 4255, - 0, 0, 41189, 4003, 69785, 68109, 13293, 41192, 0, 0, 42251, 0, 0, 126085, - 11287, 6128, 121315, 11034, 0, 68207, 0, 65506, 42382, 0, 0, 66872, 9932, - 43516, 0, 125098, 0, 41814, 0, 71234, 0, 12117, 127040, 127041, 10540, - 127043, 9063, 78000, 0, 0, 0, 12897, 0, 0, 0, 6065, 0, 0, 0, 8692, 41186, - 41816, 0, 41818, 41187, 0, 42196, 0, 110690, 110691, 126115, 0, 0, - 125235, 4710, 0, 5956, 7621, 110641, 92624, 4705, 716, 74918, 110693, - 4704, 0, 0, 127112, 161, 0, 0, 0, 4706, 0, 0, 0, 4709, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1700, 119223, 0, 0, 128119, 4004, 0, 73071, 69383, 69914, 8506, - 0, 0, 126996, 2538, 937, 0, 4734, 0, 0, 0, 0, 0, 4729, 0, 0, 0, 4728, 0, + 0, 3937, 12312, 128261, 0, 0, 0, 912, 6349, 4536, 71964, 0, 126594, 0, 0, + 0, 3935, 120665, 0, 0, 0, 0, 118859, 0, 121116, 0, 0, 12046, 12599, 0, 0, + 0, 0, 7227, 0, 0, 0, 983066, 0, 0, 0, 113817, 0, 78246, 0, 0, 0, 0, 0, + 127405, 101531, 0, 101530, 43907, 0, 0, 0, 0, 4644, 8818, 0, 0, 0, 0, + 93066, 66452, 126081, 1644, 101043, 9658, 43744, 11385, 65947, 983173, + 43983, 0, 0, 0, 8962, 0, 0, 2466, 42039, 67669, 0, 0, 42117, 100698, 0, + 0, 0, 0, 43745, 5318, 0, 120498, 0, 0, 0, 7054, 64147, 0, 917804, 68195, + 6698, 0, 0, 0, 70849, 11981, 12202, 0, 121364, 0, 7059, 11608, 975, 0, + 65843, 170, 0, 67239, 42708, 0, 0, 6058, 0, 0, 0, 70507, 0, 0, 9818, 0, + 0, 42106, 0, 983065, 4738, 42105, 7062, 0, 4737, 11779, 4742, 120564, + 92391, 0, 41374, 41375, 983376, 6715, 12700, 7049, 983374, 0, 0, 0, 4741, + 42108, 983365, 64159, 4736, 64148, 0, 849, 0, 128247, 983361, 0, 120913, + 917997, 0, 983379, 9496, 66371, 983403, 983377, 11322, 0, 93008, 3928, + 983152, 0, 10706, 7198, 0, 4842, 12053, 0, 0, 4841, 0, 4171, 12008, + 68416, 3923, 1490, 0, 0, 983393, 40972, 5245, 72288, 983395, 126578, 0, + 4845, 8332, 40974, 0, 4840, 9077, 0, 2408, 72851, 4825, 0, 0, 0, 0, + 126251, 0, 0, 983353, 0, 983354, 0, 4826, 42440, 0, 0, 1274, 0, 74315, 0, + 120384, 0, 121200, 0, 0, 0, 4830, 983388, 129044, 0, 0, 119082, 0, 64105, + 0, 0, 4824, 120397, 0, 0, 1888, 64127, 7861, 125111, 78524, 41836, + 110613, 10873, 72439, 0, 64098, 12214, 0, 41834, 0, 358, 128120, 41833, + 11442, 0, 0, 0, 0, 64115, 0, 0, 0, 120721, 119053, 0, 119055, 119054, 0, + 0, 0, 0, 4017, 12827, 5241, 0, 73042, 41118, 3924, 0, 11366, 0, 0, 0, 0, + 41116, 69455, 0, 0, 0, 0, 11917, 0, 74000, 4721, 129635, 983918, 0, 0, 0, + 0, 0, 0, 122907, 0, 128702, 4722, 6816, 124974, 0, 4725, 67099, 4726, 0, + 129856, 123171, 0, 123194, 0, 0, 0, 4015, 0, 8052, 78766, 0, 0, 128294, + 0, 0, 4720, 73090, 125003, 0, 0, 1656, 41831, 0, 0, 41843, 0, 0, 1452, + 13111, 0, 0, 0, 8552, 64113, 41845, 64073, 120354, 0, 0, 120066, 120067, + 7064, 64070, 9948, 0, 0, 0, 0, 2420, 0, 0, 0, 0, 120052, 120053, 120050, + 74920, 3938, 120057, 120054, 119249, 120060, 71920, 120058, 120059, + 120064, 72203, 7955, 64074, 4713, 128196, 983107, 0, 0, 0, 65152, 10198, + 120044, 120045, 120042, 6713, 4532, 120049, 120046, 120047, 4717, 7046, + 0, 66450, 4712, 75055, 0, 121085, 0, 8155, 4718, 3942, 4714, 9625, 0, + 6383, 0, 12006, 0, 0, 0, 0, 0, 65414, 0, 0, 129061, 66437, 66025, 74115, + 0, 0, 11228, 4809, 0, 92221, 72352, 0, 0, 0, 65405, 129912, 0, 0, 73934, + 4545, 0, 917566, 0, 4813, 78699, 0, 0, 4808, 0, 0, 65475, 0, 0, 4814, + 72240, 4810, 0, 0, 68784, 10761, 71249, 3522, 0, 78693, 65404, 0, 0, 0, + 0, 0, 6691, 70125, 0, 126223, 0, 0, 0, 43858, 129914, 0, 12992, 65407, 0, + 0, 3919, 0, 0, 0, 0, 0, 0, 12235, 110748, 0, 0, 64091, 68739, 64080, 0, + 64090, 0, 0, 0, 0, 0, 8454, 0, 0, 983858, 0, 0, 0, 4780, 0, 0, 92764, + 64621, 6732, 0, 0, 0, 0, 121363, 0, 0, 120817, 6976, 0, 119005, 0, 93809, + 0, 93808, 0, 12526, 120399, 2315, 0, 1938, 0, 0, 0, 0, 0, 0, 0, 120358, + 93794, 0, 0, 0, 93810, 0, 2291, 0, 0, 0, 0, 129429, 0, 10799, 0, 0, + 66372, 0, 4193, 0, 0, 983057, 7998, 0, 0, 0, 0, 2316, 0, 0, 0, 0, 125241, + 0, 0, 74140, 0, 0, 0, 0, 3762, 93813, 120672, 93820, 0, 0, 0, 70098, + 3780, 12808, 8163, 983154, 0, 0, 3906, 12349, 0, 8326, 0, 65498, 3763, 0, + 5618, 0, 3779, 0, 43613, 0, 128007, 0, 0, 0, 0, 280, 0, 126252, 983448, + 13072, 1894, 0, 0, 65478, 43310, 7231, 0, 11773, 0, 0, 0, 101517, 0, 0, + 7559, 11652, 10009, 110765, 110766, 110763, 110764, 4470, 110762, 0, 0, + 983441, 0, 5249, 0, 0, 8756, 0, 0, 41694, 120585, 92349, 0, 0, 0, 69685, + 983768, 983445, 113794, 0, 6808, 41319, 13125, 66332, 127977, 0, 2290, 0, + 983413, 0, 0, 3943, 0, 41205, 0, 0, 0, 0, 5352, 0, 0, 41207, 0, 7384, + 69647, 41204, 0, 41209, 69637, 0, 43607, 0, 0, 5420, 0, 10134, 0, 0, + 4018, 7150, 0, 0, 0, 0, 0, 129606, 2561, 0, 0, 7148, 12076, 0, 0, 129201, + 0, 6276, 1706, 0, 0, 7146, 0, 128277, 41819, 74991, 0, 10847, 41822, + 72248, 860, 0, 0, 0, 69641, 10753, 41820, 126118, 0, 71898, 0, 92617, + 128567, 0, 0, 43016, 0, 0, 92225, 0, 0, 0, 0, 4022, 0, 0, 110807, 0, + 41691, 0, 75060, 0, 0, 65292, 0, 110812, 0, 3911, 110811, 110808, 110809, + 0, 125191, 7000, 3904, 118997, 72261, 0, 0, 0, 13123, 10846, 0, 0, 0, 0, + 0, 74082, 0, 0, 0, 0, 3777, 128329, 0, 9636, 71726, 0, 0, 9367, 593, 0, + 3999, 0, 41713, 0, 0, 67677, 0, 0, 0, 9763, 120280, 120283, 12347, 124, + 12981, 41127, 92527, 0, 0, 0, 0, 0, 43987, 0, 0, 1769, 41715, 2463, 2151, + 0, 0, 71222, 1538, 93044, 0, 0, 0, 7795, 120300, 0, 92493, 10955, 0, 0, + 0, 78208, 9498, 78207, 127033, 78210, 120288, 3939, 120290, 120285, 8943, + 120287, 120286, 120297, 4491, 120299, 42602, 120293, 120292, 120295, + 120294, 0, 0, 0, 0, 0, 0, 1511, 9324, 0, 0, 0, 0, 0, 64536, 0, 0, 0, + 124935, 6822, 12862, 0, 0, 42143, 41828, 0, 917629, 70864, 118879, 0, 0, + 0, 41826, 128413, 0, 0, 13279, 7917, 0, 0, 0, 0, 0, 0, 92332, 0, 0, + 43515, 0, 0, 0, 4013, 0, 0, 0, 72224, 125266, 0, 68243, 2432, 0, 0, 0, 0, + 0, 69952, 0, 0, 0, 10949, 0, 0, 0, 0, 0, 0, 0, 128574, 43233, 0, 42517, + 0, 0, 0, 0, 0, 64468, 119359, 6474, 119358, 43497, 12656, 128122, 119353, + 0, 1665, 0, 0, 0, 119351, 0, 0, 5256, 0, 0, 0, 2859, 0, 0, 0, 0, 0, 0, + 128220, 0, 770, 0, 811, 0, 0, 917551, 42244, 64427, 0, 72222, 0, 3895, 0, + 74341, 12087, 0, 42859, 10193, 3116, 7747, 0, 0, 43496, 0, 0, 0, 0, + 41877, 0, 65382, 64614, 0, 64296, 0, 6345, 0, 2663, 0, 121234, 0, 0, + 10150, 0, 64308, 1522, 597, 0, 0, 41201, 64731, 0, 0, 41198, 0, 71483, + 3092, 0, 0, 4783, 71448, 0, 0, 0, 10812, 0, 0, 0, 3078, 0, 0, 0, 0, 0, + 71703, 394, 3088, 0, 0, 0, 3991, 0, 129072, 0, 424, 67652, 74927, 0, 0, + 0, 0, 0, 0, 42231, 2209, 128215, 72983, 0, 41840, 129136, 5344, 1298, 0, + 13155, 0, 128973, 41838, 0, 8488, 1003, 41837, 0, 0, 0, 48, 0, 0, 8493, + 0, 0, 0, 65487, 0, 8465, 10332, 13172, 0, 0, 10449, 126989, 127014, + 69606, 69447, 3984, 129159, 0, 0, 0, 0, 0, 0, 0, 0, 64758, 0, 100947, 0, + 0, 9096, 0, 0, 9172, 128545, 0, 0, 5955, 67666, 0, 0, 0, 0, 0, 74426, + 3926, 71734, 0, 8798, 100946, 92165, 0, 0, 120696, 0, 0, 0, 118805, + 10353, 10417, 0, 0, 0, 128629, 4019, 0, 0, 0, 8219, 68402, 0, 0, 121301, + 128218, 0, 0, 0, 0, 0, 0, 0, 110625, 42474, 10642, 3909, 9950, 0, 128139, + 69619, 68678, 92917, 0, 1049, 43517, 65707, 11943, 41806, 0, 68635, 3921, + 0, 11775, 121352, 69820, 1038, 42303, 9823, 0, 2145, 4008, 68624, 0, + 121025, 0, 0, 5153, 41805, 0, 0, 763, 9211, 0, 0, 0, 0, 0, 127142, 0, 0, + 65179, 0, 8621, 0, 118878, 0, 0, 0, 0, 182, 0, 0, 0, 0, 72978, 9058, + 8489, 0, 71188, 5969, 65909, 10848, 4570, 0, 128614, 4255, 0, 0, 41189, + 4003, 69785, 68109, 13293, 41192, 0, 0, 42251, 0, 0, 126085, 11287, 6128, + 121315, 11034, 0, 68207, 0, 65506, 42382, 0, 0, 66872, 9932, 43516, 0, + 125098, 0, 41814, 0, 71234, 0, 12117, 127040, 127041, 10540, 127043, + 9063, 78000, 0, 0, 0, 12897, 0, 0, 0, 6065, 0, 0, 0, 8692, 41186, 41816, + 0, 41818, 41187, 0, 42196, 0, 110690, 110691, 126115, 0, 0, 125235, 4710, + 0, 5956, 7621, 110641, 92624, 4705, 716, 74918, 110693, 4704, 0, 0, + 127112, 161, 0, 0, 0, 4706, 0, 0, 0, 4709, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1700, 119223, 0, 0, 128119, 4004, 0, 73071, 69383, 69914, 8506, 128237, + 0, 126996, 2538, 937, 0, 4734, 0, 0, 0, 0, 0, 4729, 0, 0, 0, 4728, 0, 72809, 120644, 0, 8109, 43105, 11249, 4730, 447, 0, 1513, 4733, 0, 0, 0, 0, 0, 0, 0, 8565, 2469, 0, 6690, 0, 0, 43439, 78218, 43103, 78217, 2674, 0, 11922, 0, 0, 3510, 0, 129368, 0, 5605, 42095, 126572, 0, 9098, 120512, @@ -27963,7 +28829,7 @@ static const unsigned int code_hash[] = { 93799, 10618, 2584, 93793, 0, 0, 9998, 0, 0, 0, 66350, 0, 0, 0, 121374, 8279, 128169, 0, 4975, 70075, 0, 0, 1631, 0, 0, 0, 6290, 128994, 66386, 0, 64645, 0, 0, 0, 0, 0, 9242, 93807, 93802, 93801, 983264, 93803, 3122, - 93804, 7793, 0, 0, 0, 0, 12604, 93808, 6615, 67650, 0, 3986, 44025, 0, + 93804, 7793, 0, 0, 0, 0, 12604, 92885, 6615, 67650, 0, 3986, 44025, 0, 8912, 0, 7409, 0, 0, 0, 0, 0, 0, 8540, 11498, 0, 0, 0, 0, 0, 13060, 120682, 0, 0, 0, 0, 0, 121345, 0, 0, 7020, 120353, 3765, 92881, 0, 1606, 120348, 120351, 3093, 110593, 0, 0, 0, 0, 0, 0, 92892, 120337, 69402, @@ -27975,145 +28841,147 @@ static const unsigned int code_hash[] = { 0, 0, 0, 0, 0, 10381, 70839, 0, 0, 0, 0, 125121, 70837, 125070, 129431, 983372, 983360, 0, 983359, 0, 120063, 0, 0, 0, 75048, 0, 74900, 0, 0, 120978, 12161, 983351, 0, 10339, 0, 0, 0, 0, 0, 0, 0, 43032, 125010, 0, - 983380, 12671, 11384, 0, 0, 120901, 64797, 0, 5820, 0, 0, 0, 0, 0, + 983378, 12671, 11384, 0, 0, 120901, 64797, 0, 5820, 0, 0, 0, 0, 0, 120650, 42137, 9893, 8851, 12664, 0, 0, 13192, 0, 41799, 65530, 0, 0, - 43039, 3114, 0, 0, 0, 0, 0, 926, 0, 0, 0, 0, 0, 0, 0, 43037, 41798, 0, 0, - 123214, 41801, 0, 0, 0, 4200, 12699, 8331, 70118, 3091, 92980, 66298, - 70293, 8360, 0, 78044, 0, 4229, 64543, 126227, 65563, 0, 129310, 2861, - 43793, 10095, 121428, 9195, 121381, 121132, 0, 129578, 0, 0, 43041, 0, - 43794, 0, 83167, 0, 43797, 8209, 0, 129132, 12973, 0, 0, 0, 0, 0, 121235, - 5760, 0, 743, 0, 0, 0, 0, 0, 0, 83170, 128589, 129537, 0, 119063, 0, 0, - 0, 19919, 0, 64532, 0, 43710, 0, 0, 9483, 71115, 0, 43697, 0, 0, 83211, - 0, 0, 0, 7247, 0, 0, 0, 0, 0, 113674, 0, 7471, 120823, 128743, 12682, 0, - 0, 65679, 983143, 0, 0, 83201, 1099, 74241, 0, 10501, 0, 0, 113743, 0, - 64743, 128476, 67663, 0, 0, 92219, 0, 83197, 64897, 9973, 1818, 0, 0, - 8272, 127812, 0, 4218, 3087, 0, 127234, 0, 0, 65181, 9954, 10465, 0, 0, - 0, 9106, 0, 67406, 0, 0, 0, 0, 43038, 0, 0, 265, 0, 0, 0, 0, 0, 0, 69405, - 0, 59, 0, 0, 0, 0, 126239, 41810, 0, 126492, 0, 41809, 41888, 0, 41795, - 0, 42213, 0, 0, 43033, 511, 129413, 0, 13127, 0, 0, 0, 0, 111107, 0, - 4467, 41812, 41215, 0, 41211, 917783, 4453, 983409, 0, 983174, 0, 983407, - 41213, 118812, 0, 0, 0, 0, 41841, 6617, 0, 0, 92995, 462, 0, 10493, 0, - 55248, 0, 0, 74471, 6644, 0, 0, 0, 983383, 100484, 9581, 67104, 3098, 0, - 0, 983410, 125250, 0, 120621, 0, 0, 0, 129584, 101011, 0, 118789, 74473, - 3755, 64661, 7748, 7235, 3966, 0, 0, 127510, 0, 0, 0, 5726, 66456, 42175, - 100486, 0, 42212, 92681, 121443, 2851, 43017, 0, 121056, 4373, 0, 0, - 9587, 0, 6671, 128840, 3100, 0, 0, 0, 0, 0, 917789, 73836, 8190, 12083, - 917791, 0, 6689, 64629, 0, 0, 0, 4419, 917787, 101017, 0, 69851, 0, 0, - 8891, 3080, 0, 2347, 0, 0, 8990, 0, 121201, 0, 92528, 249, 0, 0, 69424, - 0, 0, 0, 55253, 0, 0, 11173, 995, 0, 121047, 119861, 0, 73708, 0, 0, - 19945, 0, 558, 983394, 12273, 0, 983862, 0, 69912, 120861, 129492, 67274, - 94178, 0, 68019, 43030, 3129, 0, 2102, 0, 0, 121450, 0, 7725, 0, 11120, - 0, 126111, 69246, 0, 0, 0, 41894, 0, 41898, 0, 41893, 74921, 128678, - 3540, 11848, 0, 73005, 120848, 0, 0, 126113, 73959, 0, 0, 0, 120858, 0, - 0, 9699, 128656, 41896, 0, 83196, 69230, 74951, 0, 72736, 0, 0, 3095, - 983670, 11946, 983866, 0, 0, 0, 0, 0, 113677, 3672, 119864, 0, 0, 0, - 128539, 8890, 93826, 0, 128182, 0, 0, 0, 126568, 0, 0, 983617, 9516, - 983436, 0, 0, 42220, 0, 4450, 0, 11547, 43417, 128542, 356, 0, 0, 0, 0, - 64901, 0, 0, 0, 0, 0, 0, 111302, 65940, 2541, 71231, 0, 123215, 126470, - 3549, 0, 0, 0, 2743, 0, 0, 0, 9097, 128896, 43015, 0, 0, 776, 2524, 0, - 8573, 100665, 126494, 0, 0, 42694, 71122, 8952, 10814, 118818, 0, 43646, - 128598, 0, 0, 0, 128380, 100663, 0, 65853, 42707, 1897, 93071, 0, 0, - 71907, 69410, 0, 125106, 0, 0, 0, 68473, 66778, 43573, 92638, 0, 0, 0, - 120955, 73986, 0, 0, 43022, 0, 74841, 0, 67714, 0, 0, 0, 0, 0, 4553, 0, - 0, 0, 0, 0, 19921, 0, 0, 983668, 4567, 41891, 0, 983800, 55249, 194663, - 0, 194662, 0, 194665, 43042, 121291, 1377, 12869, 0, 0, 9250, 0, 0, 0, 0, - 125039, 194642, 0, 74995, 0, 194644, 0, 0, 0, 194668, 121166, 0, 70275, - 1898, 0, 0, 0, 802, 0, 0, 0, 6648, 0, 2528, 0, 0, 194646, 194625, 194645, - 68804, 844, 0, 68824, 0, 68818, 194650, 0, 0, 0, 983724, 65464, 0, 0, 0, - 0, 83221, 0, 0, 100680, 0, 0, 64371, 70665, 0, 194654, 0, 0, 0, 0, 0, - 6196, 6945, 0, 0, 0, 120491, 0, 68846, 6210, 0, 70274, 0, 0, 0, 68067, - 68834, 194715, 588, 9760, 129112, 0, 983704, 128798, 0, 127992, 0, 0, - 118905, 0, 0, 92485, 110839, 69396, 0, 3394, 70734, 194639, 0, 0, 0, 0, - 0, 0, 194656, 7817, 1841, 11055, 0, 194979, 194983, 127011, 119074, - 194987, 7701, 194998, 0, 0, 1946, 121404, 0, 0, 0, 0, 0, 10934, 0, 70376, - 0, 0, 8071, 3538, 0, 2287, 65328, 0, 0, 7614, 0, 0, 0, 12009, 43968, 0, - 67852, 0, 0, 10841, 123640, 0, 0, 0, 0, 8960, 0, 0, 65317, 0, 0, 0, - 70374, 0, 0, 0, 65315, 0, 0, 0, 0, 0, 119621, 0, 11849, 12447, 0, 0, - 110741, 0, 0, 0, 0, 42767, 0, 0, 0, 43695, 120520, 11975, 194941, 983443, - 0, 2555, 0, 128640, 70070, 42936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66714, - 0, 0, 70076, 65596, 121034, 66710, 67658, 0, 126994, 65338, 7792, 0, 0, - 67871, 119027, 0, 8233, 43572, 0, 0, 0, 3442, 0, 2841, 12543, 0, 1473, - 42820, 64329, 127832, 917772, 126126, 7937, 0, 1048, 0, 0, 983924, 0, - 3406, 1054, 100701, 1040, 65450, 0, 92329, 1069, 917763, 128367, 128940, - 0, 917765, 0, 983705, 9693, 110873, 0, 0, 0, 983929, 4353, 0, 1059, - 127530, 0, 0, 0, 127093, 118862, 120500, 10646, 0, 100710, 917762, 70424, - 74830, 0, 0, 983701, 10221, 100706, 68255, 0, 0, 74346, 119619, 100707, - 64945, 12921, 0, 0, 0, 0, 0, 983776, 43020, 0, 0, 74254, 0, 983766, 0, 0, - 983773, 0, 0, 0, 0, 0, 0, 0, 0, 120503, 70663, 0, 2755, 0, 0, 0, 4857, 0, - 4428, 0, 0, 983772, 0, 0, 0, 43842, 0, 122899, 0, 7978, 0, 70392, 127080, - 11924, 43812, 0, 65015, 0, 563, 68340, 0, 12798, 0, 100727, 0, 0, 0, - 74110, 0, 94051, 0, 694, 0, 9876, 0, 119168, 0, 0, 0, 92361, 0, 0, 7229, - 0, 0, 0, 0, 64811, 0, 119087, 126478, 0, 7381, 0, 2525, 4852, 11586, - 68465, 41605, 126089, 0, 11582, 7151, 10155, 92578, 188, 0, 11592, 0, - 74015, 0, 0, 4858, 0, 0, 0, 4861, 0, 2786, 121431, 4856, 8051, 0, 119609, - 0, 113797, 71133, 0, 78448, 0, 0, 67842, 68084, 0, 0, 0, 0, 0, 10234, - 5843, 0, 71865, 66728, 0, 3157, 0, 0, 75035, 72788, 983731, 0, 10822, - 5149, 129517, 0, 65142, 129454, 4565, 0, 0, 0, 12657, 0, 0, 386, 0, 8834, - 120974, 0, 43574, 0, 0, 0, 70113, 7220, 11839, 124984, 74883, 194752, 0, - 65241, 74503, 8160, 0, 194753, 0, 0, 0, 0, 0, 121265, 0, 13303, 0, 0, - 194755, 0, 118865, 0, 194761, 0, 0, 74505, 0, 0, 0, 100518, 0, 8780, - 100512, 0, 68745, 110626, 66697, 0, 2672, 3735, 983641, 0, 68752, 11205, - 10724, 41202, 0, 100714, 0, 0, 0, 0, 194765, 3842, 0, 78183, 12442, - 78182, 9791, 78181, 0, 42516, 67730, 64821, 195061, 78463, 0, 78464, - 119219, 78465, 127466, 194690, 195063, 0, 0, 0, 0, 78540, 78541, 78538, - 1962, 78490, 78476, 65930, 11660, 0, 2072, 0, 0, 78544, 194704, 78542, - 10669, 110859, 110860, 110857, 110858, 0, 110856, 4105, 0, 194699, 0, 0, - 0, 13148, 195068, 78479, 9226, 0, 0, 10765, 127486, 71919, 121218, - 195050, 0, 195041, 0, 0, 0, 0, 0, 0, 92312, 7886, 0, 6682, 0, 6680, - 195042, 126473, 195052, 6679, 74412, 0, 72206, 74421, 66281, 0, 0, - 127478, 0, 0, 0, 6681, 0, 12693, 0, 0, 0, 0, 0, 65442, 129055, 0, 9989, - 74415, 194673, 0, 0, 983769, 0, 0, 0, 0, 7042, 127240, 119026, 7968, 0, - 983749, 194741, 194736, 983774, 0, 69889, 74389, 128696, 0, 0, 128979, - 5781, 0, 78199, 0, 0, 11091, 0, 2719, 0, 0, 0, 64495, 0, 0, 0, 65169, - 42845, 0, 128551, 983747, 7505, 72435, 0, 0, 0, 917855, 66670, 0, 983690, - 0, 0, 0, 7902, 0, 65265, 0, 0, 0, 0, 0, 0, 0, 12994, 0, 10828, 983955, 0, - 4307, 3482, 0, 0, 72389, 0, 64299, 74573, 41194, 7343, 0, 0, 41195, 0, - 8169, 0, 8841, 66770, 516, 72981, 41197, 119051, 34, 128850, 120186, - 11504, 1612, 120187, 120182, 120181, 120184, 12001, 120178, 120177, - 120180, 120179, 120174, 120173, 7749, 120175, 0, 1758, 0, 10667, 0, - 120197, 0, 1935, 11517, 120193, 120196, 120195, 120190, 120189, 120192, - 120191, 1217, 64702, 128075, 825, 0, 0, 0, 0, 66748, 0, 11050, 0, 123187, - 0, 0, 74554, 0, 0, 8677, 123188, 11313, 123185, 3403, 0, 123186, 64364, - 92683, 0, 0, 0, 0, 123189, 0, 0, 983861, 0, 69408, 41850, 0, 3433, - 127965, 0, 1594, 65607, 0, 66392, 0, 129291, 74565, 41353, 125119, 0, 0, - 0, 0, 918, 127280, 41351, 0, 0, 12140, 0, 12668, 72395, 0, 128753, 0, - 127302, 0, 127288, 129497, 127235, 573, 0, 0, 11417, 0, 127283, 0, 0, 0, - 72410, 0, 11482, 0, 3981, 74345, 0, 0, 0, 0, 0, 0, 125238, 0, 0, 42195, - 0, 123190, 0, 64602, 0, 0, 121366, 0, 121061, 128690, 0, 8423, 0, 448, - 66907, 9717, 0, 0, 0, 0, 0, 0, 0, 71910, 0, 0, 0, 120679, 65013, 78169, - 0, 72390, 0, 0, 127917, 0, 74892, 0, 0, 127798, 0, 0, 71252, 0, 0, 0, - 12197, 125074, 0, 121447, 0, 0, 0, 0, 0, 0, 0, 74563, 64828, 11419, 0, - 8592, 0, 0, 0, 11381, 0, 0, 74529, 0, 0, 0, 0, 72796, 0, 83257, 0, 0, 0, - 129437, 65672, 0, 0, 0, 0, 0, 0, 0, 0, 9505, 0, 0, 756, 0, 125243, - 100358, 110852, 7261, 0, 0, 0, 0, 0, 64401, 65830, 41365, 0, 0, 0, - 127834, 0, 0, 0, 0, 0, 74626, 123155, 11578, 0, 0, 0, 0, 0, 0, 74568, 0, - 113684, 1794, 68310, 120218, 120219, 120220, 120221, 120222, 120223, - 3617, 120209, 64886, 94061, 78202, 120213, 120214, 10225, 983060, 0, - 65223, 983058, 0, 0, 4452, 127779, 0, 0, 0, 0, 0, 0, 11425, 0, 0, 1231, - 0, 0, 0, 0, 8192, 0, 0, 0, 10616, 8694, 0, 68867, 128332, 123595, 120200, - 120201, 120202, 120203, 9878, 120205, 119626, 120207, 0, 8799, 42131, 0, - 127163, 0, 120198, 120199, 837, 120015, 72384, 0, 983817, 0, 11427, 0, - 78154, 0, 70171, 0, 78150, 42606, 0, 119615, 78147, 64637, 78146, 43060, - 78145, 125009, 3392, 0, 194783, 119067, 119650, 65468, 43498, 126083, 0, - 0, 0, 194928, 194937, 194938, 64681, 194930, 83264, 92451, 0, 194955, - 83262, 983732, 8973, 0, 194967, 70177, 194968, 0, 4800, 195018, 0, 0, - 11820, 70151, 0, 0, 4802, 4111, 111268, 0, 4805, 127308, 68193, 7885, - 121220, 0, 0, 0, 4767, 0, 0, 0, 0, 0, 125234, 100366, 43453, 0, 41340, 0, - 0, 10005, 65856, 41333, 0, 9518, 0, 0, 0, 42520, 0, 0, 0, 917562, 100506, - 0, 0, 0, 0, 0, 0, 9167, 42151, 124958, 0, 2026, 100848, 0, 0, 100534, - 12768, 0, 7582, 0, 0, 0, 0, 129557, 0, 120539, 68879, 0, 43547, 0, 8546, - 126071, 78520, 7604, 78518, 78519, 78514, 78517, 78511, 78512, 73802, - 128140, 0, 6708, 10535, 0, 68218, 55274, 68221, 92296, 0, 0, 0, 0, 0, - 72385, 0, 0, 0, 73727, 0, 120706, 74442, 0, 0, 0, 4351, 0, 119887, - 119888, 0, 119886, 119891, 68866, 119889, 11433, 119895, 119896, 0, - 119894, 65578, 0, 0, 0, 983070, 10681, 0, 0, 0, 0, 983110, 0, 6722, - 129364, 0, 119997, 41546, 64860, 68394, 0, 41549, 0, 72386, 0, 0, 0, 0, - 64710, 41547, 0, 0, 0, 78530, 78532, 78528, 78529, 71343, 78527, 78523, - 78525, 3537, 119908, 119905, 7155, 2264, 0, 78533, 67755, 0, 0, 0, 0, 0, - 0, 0, 64715, 0, 0, 537, 0, 4179, 0, 0, 0, 0, 0, 0, 0, 0, 12081, 0, 0, - 4048, 7053, 0, 0, 70459, 0, 124975, 0, 3059, 0, 0, 43491, 983814, 0, 0, - 127993, 4100, 920, 1811, 1355, 0, 0, 64383, 10078, 69398, 0, 0, 0, 65870, - 0, 129565, 0, 72400, 42918, 0, 66789, 0, 12865, 0, 73938, + 43039, 3114, 0, 0, 0, 0, 0, 926, 0, 72004, 0, 0, 0, 0, 0, 43037, 41798, + 0, 0, 123214, 41801, 0, 0, 0, 4200, 12699, 8331, 70118, 3091, 92980, + 66298, 70293, 8360, 0, 78044, 0, 4229, 64543, 126227, 65563, 0, 129310, + 2861, 43793, 10095, 121428, 9195, 121381, 121132, 0, 129578, 0, 0, 43041, + 0, 43794, 0, 83167, 0, 43797, 8209, 0, 129132, 12973, 0, 0, 0, 0, 0, + 121235, 5760, 0, 743, 0, 0, 0, 0, 0, 0, 83170, 128589, 129537, 0, 119063, + 0, 0, 0, 19919, 0, 64532, 0, 43710, 0, 0, 9483, 71115, 0, 43697, 0, 0, + 83211, 0, 0, 0, 7247, 0, 0, 0, 0, 0, 113674, 0, 7471, 120823, 128743, + 12682, 0, 0, 65679, 983143, 0, 0, 83201, 1099, 74241, 0, 10501, 0, 0, + 113743, 0, 64743, 128476, 67663, 0, 0, 92219, 0, 83197, 64897, 9973, + 1818, 0, 0, 8272, 127812, 0, 4218, 3087, 0, 127234, 0, 101300, 65181, + 9954, 10465, 0, 0, 0, 9106, 0, 67406, 0, 0, 0, 0, 43038, 0, 0, 265, 0, 0, + 0, 0, 0, 0, 69405, 0, 59, 0, 0, 0, 0, 126239, 41810, 0, 126492, 0, 41809, + 41888, 0, 41795, 0, 42213, 0, 0, 43033, 511, 129413, 0, 13127, 0, 0, 0, + 0, 111107, 0, 4467, 41812, 41215, 0, 41211, 917783, 4453, 69575, 0, + 129883, 0, 983407, 41213, 118812, 0, 0, 0, 129730, 41841, 6617, 130041, + 0, 92995, 462, 0, 10493, 0, 55248, 0, 0, 74471, 6644, 0, 0, 0, 983383, + 100484, 9581, 67104, 3098, 0, 0, 983410, 125250, 0, 120621, 0, 0, 0, + 129584, 101011, 0, 118789, 74473, 3755, 64661, 7748, 7235, 3966, 0, 0, + 127510, 0, 0, 0, 5726, 66456, 42175, 100486, 0, 42212, 92681, 121443, + 2851, 43017, 0, 121056, 4373, 0, 0, 9587, 0, 6671, 128840, 3100, 0, + 917790, 0, 0, 0, 917789, 73836, 8190, 12083, 917791, 0, 6689, 64629, 0, + 0, 0, 4419, 917787, 101017, 0, 69851, 0, 0, 8891, 3080, 0, 2347, 0, 0, + 8990, 0, 121201, 0, 92528, 249, 0, 0, 69424, 0, 0, 0, 55253, 0, 0, 11173, + 995, 0, 121047, 119861, 0, 73708, 0, 0, 19945, 0, 558, 983394, 12273, 0, + 983862, 0, 69912, 120861, 129492, 67274, 94178, 0, 68019, 43030, 3129, 0, + 2102, 0, 0, 121450, 0, 7725, 0, 11120, 0, 126111, 69246, 0, 0, 0, 41894, + 0, 41898, 0, 41893, 74921, 128678, 3540, 11848, 0, 73005, 120848, 0, 0, + 126113, 73959, 0, 0, 0, 120858, 0, 0, 9699, 128656, 41896, 0, 83196, + 69230, 74951, 0, 72736, 0, 0, 3095, 983670, 11946, 983866, 0, 0, 0, 0, 0, + 113677, 3672, 119864, 0, 0, 0, 128539, 8890, 93826, 0, 128182, 0, 0, 0, + 126568, 0, 0, 983617, 9516, 983436, 0, 0, 42220, 0, 4450, 0, 11547, + 43417, 128542, 356, 0, 0, 0, 0, 64901, 0, 0, 0, 0, 0, 0, 111302, 65940, + 2541, 71231, 0, 123215, 126470, 3549, 0, 0, 0, 2743, 0, 0, 0, 9097, + 128896, 43015, 0, 0, 776, 2524, 0, 8573, 100665, 126494, 0, 0, 42694, + 71122, 8952, 10814, 118818, 0, 43646, 128598, 0, 0, 0, 128380, 100663, 0, + 65853, 42707, 1897, 93071, 0, 0, 71907, 69410, 0, 125106, 0, 0, 0, 68473, + 66778, 43573, 92638, 0, 0, 0, 120955, 73986, 0, 0, 43022, 0, 74841, 0, + 67714, 0, 0, 0, 0, 0, 4553, 0, 0, 0, 0, 0, 19921, 0, 0, 983668, 4567, + 41891, 0, 983800, 55249, 194663, 0, 194662, 0, 194665, 43042, 121291, + 1377, 12869, 0, 0, 9250, 0, 0, 0, 0, 125039, 194642, 0, 74995, 0, 194644, + 0, 0, 101328, 194668, 121166, 0, 70275, 1898, 69556, 0, 0, 802, 0, 0, 0, + 6648, 0, 2528, 0, 0, 194646, 194625, 101330, 68804, 844, 0, 68824, 0, + 68818, 194650, 0, 0, 0, 983724, 65464, 0, 0, 0, 0, 83221, 0, 0, 100680, + 42954, 0, 64371, 70665, 0, 194654, 0, 0, 0, 0, 0, 6196, 6945, 0, 0, 0, + 120491, 0, 68846, 6210, 0, 70274, 0, 0, 0, 68067, 68834, 194715, 588, + 9760, 129112, 0, 983704, 128798, 0, 127992, 0, 0, 118905, 0, 0, 92485, + 110839, 69396, 0, 3394, 70734, 194639, 0, 0, 0, 0, 0, 0, 194656, 7817, + 1841, 11055, 0, 194979, 194983, 127011, 67403, 194987, 7701, 194998, 0, + 194995, 1946, 121404, 0, 0, 917631, 0, 0, 10934, 0, 70376, 0, 0, 8071, + 3538, 0, 2287, 65328, 0, 0, 7614, 0, 0, 0, 12009, 43968, 0, 67852, 0, 0, + 10841, 123640, 0, 0, 0, 0, 8960, 0, 0, 65317, 128829, 0, 0, 70374, 0, 0, + 0, 65315, 0, 0, 0, 0, 0, 119621, 0, 11849, 12447, 0, 0, 110741, 0, 0, 0, + 129976, 42767, 0, 0, 0, 43695, 120520, 11975, 194941, 983443, 0, 2555, 0, + 128640, 70070, 42936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66714, 0, 0, + 70076, 65596, 121034, 66710, 67658, 0, 126994, 65338, 7792, 0, 0, 67871, + 119027, 0, 8233, 43572, 0, 0, 0, 3442, 0, 2841, 12543, 0, 1473, 42820, + 64329, 127832, 917772, 126126, 7937, 0, 1048, 0, 0, 983924, 0, 3406, + 1054, 100701, 1040, 65450, 0, 92329, 1069, 917763, 128367, 128940, 0, + 917765, 0, 983705, 9693, 110873, 0, 0, 0, 983929, 4353, 0, 1059, 127530, + 0, 0, 0, 127093, 118862, 120500, 10646, 0, 100710, 917762, 70424, 74830, + 0, 0, 983701, 10221, 100706, 68255, 0, 0, 74346, 119619, 100707, 64945, + 12921, 0, 0, 0, 0, 0, 983776, 43020, 0, 0, 74254, 0, 983766, 0, 0, + 983773, 0, 71954, 0, 0, 0, 0, 0, 0, 120503, 70663, 0, 2755, 0, 0, 0, + 4857, 0, 4428, 0, 0, 983772, 0, 0, 0, 43842, 0, 122899, 0, 7978, 0, + 70392, 127080, 11924, 43812, 0, 65015, 0, 563, 68340, 0, 12798, 0, + 100727, 0, 0, 0, 74110, 0, 94051, 0, 694, 0, 9876, 0, 119168, 0, 0, 0, + 92361, 0, 0, 7229, 0, 0, 0, 0, 64811, 0, 119087, 126478, 0, 7381, 0, + 2525, 4852, 11586, 68465, 41605, 126089, 0, 11582, 7151, 10155, 92578, + 188, 0, 11592, 0, 74015, 0, 0, 4858, 0, 0, 0, 4861, 0, 2786, 121431, + 4856, 8051, 0, 119609, 0, 113797, 71133, 0, 78448, 0, 0, 67842, 68084, 0, + 0, 0, 0, 0, 10234, 5843, 0, 71865, 66728, 0, 3157, 0, 0, 75035, 72788, + 983731, 0, 10822, 5149, 129517, 0, 65142, 129454, 4565, 0, 0, 0, 12657, + 0, 0, 386, 0, 8834, 120974, 0, 43574, 0, 0, 0, 70113, 7220, 11839, + 124984, 74883, 194752, 0, 65241, 74503, 8160, 0, 194753, 0, 0, 0, 0, 0, + 121265, 6847, 13303, 0, 0, 194755, 0, 118865, 0, 194761, 0, 0, 74505, 0, + 0, 0, 100518, 194721, 8780, 100512, 0, 68745, 110626, 66697, 0, 2672, + 3735, 983641, 0, 68752, 11205, 10724, 41202, 0, 100714, 0, 0, 0, 0, + 194765, 3842, 0, 78183, 12442, 78182, 9791, 78181, 0, 42516, 67730, + 64821, 195061, 78178, 0, 78464, 119219, 78465, 127466, 194690, 195063, 0, + 0, 0, 0, 78540, 78541, 78538, 1962, 78490, 78476, 65930, 11660, 0, 2072, + 0, 0, 78544, 194704, 78542, 10669, 110859, 110860, 110857, 110858, + 129749, 110856, 4105, 0, 194699, 0, 0, 0, 13148, 195068, 78479, 9226, 0, + 0, 10765, 127486, 71919, 121218, 195050, 0, 195041, 0, 0, 0, 0, 0, 0, + 92312, 7886, 0, 6682, 0, 6680, 195042, 126473, 195052, 6679, 74412, 0, + 72206, 74421, 66281, 0, 0, 127478, 0, 0, 0, 6681, 0, 12693, 0, 0, 0, 0, + 0, 65442, 129055, 0, 9989, 74415, 194673, 0, 0, 983769, 0, 0, 0, 0, 7042, + 127240, 119026, 7968, 0, 983749, 194741, 194736, 983774, 0, 69889, 74389, + 128696, 0, 0, 128979, 5781, 0, 78199, 0, 0, 11091, 0, 2719, 0, 0, 0, + 64495, 0, 0, 0, 65169, 42845, 0, 128551, 983747, 7505, 72435, 0, 0, 0, + 917855, 66670, 0, 983690, 0, 0, 0, 7902, 0, 65265, 0, 0, 0, 0, 0, 0, 0, + 12994, 0, 10828, 983955, 0, 4307, 3482, 0, 0, 72389, 0, 64299, 74573, + 41194, 7343, 0, 0, 41195, 0, 8169, 0, 8841, 66770, 516, 72981, 41197, + 119051, 34, 128850, 120186, 11504, 1612, 120187, 120182, 120181, 120184, + 12001, 120178, 120177, 120180, 120179, 71966, 120173, 7749, 120175, 0, + 1758, 0, 10667, 0, 120197, 0, 1935, 11517, 120193, 120196, 120195, + 120190, 120189, 120192, 120191, 1217, 64702, 128075, 825, 0, 0, 0, 0, + 66748, 0, 11050, 0, 123187, 0, 0, 74554, 0, 0, 8677, 123188, 11313, + 123185, 3403, 0, 123186, 64364, 92683, 0, 0, 0, 0, 123189, 0, 0, 983861, + 0, 69408, 41850, 0, 3433, 127965, 0, 1594, 65607, 0, 66392, 0, 129291, + 74565, 41353, 125119, 0, 0, 0, 0, 918, 127280, 41351, 0, 0, 12140, 0, + 12668, 72395, 0, 128753, 0, 127302, 0, 127288, 129497, 127235, 573, 0, 0, + 11417, 0, 127283, 0, 0, 0, 72410, 0, 11482, 0, 3981, 74345, 0, 0, 0, 0, + 0, 0, 125238, 0, 0, 42195, 0, 123190, 0, 64602, 0, 0, 121366, 0, 121061, + 128690, 0, 8423, 0, 448, 66907, 9717, 0, 0, 0, 0, 0, 0, 0, 71910, 129898, + 0, 0, 120679, 65013, 78169, 0, 72390, 0, 0, 127917, 0, 74892, 0, 0, + 127798, 0, 0, 71252, 0, 0, 0, 12197, 125074, 0, 121447, 0, 0, 0, 0, 0, 0, + 0, 74563, 64828, 11419, 0, 8592, 0, 0, 0, 11381, 0, 0, 74529, 0, 0, + 83254, 0, 72796, 0, 83257, 0, 0, 0, 129437, 65672, 0, 0, 0, 0, 0, 0, 0, + 0, 9505, 0, 0, 756, 0, 125243, 100358, 110852, 7261, 0, 0, 0, 0, 0, + 64401, 65830, 41365, 0, 0, 0, 127834, 0, 0, 0, 0, 0, 74626, 123155, + 11578, 0, 0, 0, 0, 0, 0, 74568, 0, 113684, 1794, 68310, 120218, 120219, + 120220, 120221, 120222, 120223, 3617, 120011, 64886, 94061, 78202, + 120213, 120214, 10225, 983060, 0, 65223, 983058, 0, 0, 4452, 127779, 0, + 0, 0, 0, 0, 0, 11425, 0, 0, 1231, 0, 0, 0, 0, 8192, 0, 0, 0, 10616, 8694, + 0, 68867, 128332, 123595, 120200, 120201, 120202, 120203, 9878, 120205, + 119626, 120207, 0, 8799, 42131, 0, 127163, 0, 120198, 120199, 837, + 120015, 72384, 0, 983817, 0, 11427, 0, 78154, 0, 70171, 0, 78150, 42606, + 0, 119615, 78147, 64637, 78146, 43060, 78145, 125009, 3392, 0, 194783, + 119067, 119650, 65468, 43498, 126083, 0, 0, 0, 194928, 194937, 194938, + 64681, 194930, 83264, 92451, 0, 194955, 83262, 983732, 8973, 0, 194967, + 70177, 194968, 0, 4800, 195018, 0, 0, 11820, 70151, 0, 0, 4802, 4111, + 111268, 0, 4805, 127308, 68193, 7885, 121220, 0, 0, 0, 4767, 0, 0, 0, 0, + 0, 125234, 100366, 43453, 0, 41340, 0, 0, 10005, 65856, 41333, 0, 9518, + 0, 0, 0, 42520, 100850, 0, 0, 917562, 100506, 0, 0, 0, 0, 0, 0, 9167, + 42151, 124958, 0, 2026, 100848, 0, 0, 100534, 12768, 0, 7582, 0, 0, 0, 0, + 129557, 0, 120539, 68879, 0, 43547, 119992, 8546, 126071, 78520, 7604, + 78518, 78519, 78514, 78517, 78511, 78512, 73802, 128140, 0, 6708, 10535, + 0, 68218, 55274, 68221, 92296, 0, 0, 0, 0, 0, 72385, 0, 0, 0, 73727, 0, + 120706, 74442, 0, 0, 0, 4351, 0, 119887, 119888, 0, 119886, 119891, + 68866, 119889, 11433, 119895, 119896, 0, 119894, 65578, 194693, 0, 0, + 983070, 10681, 0, 0, 0, 0, 983110, 0, 6722, 129364, 0, 119997, 41546, + 64860, 68394, 0, 41549, 0, 72386, 0, 0, 0, 0, 64710, 41547, 0, 0, 0, + 78530, 78532, 78528, 78529, 71343, 78527, 78523, 78525, 3537, 119908, + 119905, 7155, 2264, 0, 78533, 67755, 0, 0, 0, 0, 0, 0, 0, 64715, 0, 0, + 537, 0, 4179, 0, 0, 0, 0, 0, 0, 0, 0, 12081, 0, 0, 4048, 7053, 0, 0, + 70459, 0, 124975, 0, 3059, 0, 0, 43491, 983814, 0, 0, 127993, 4100, 920, + 1811, 1355, 0, 0, 64383, 10078, 69398, 0, 0, 0, 65870, 0, 129565, 0, + 72400, 42918, 0, 66789, 0, 12865, 0, 73938, }; #define code_magic 47 @@ -28615,20 +29483,16 @@ static const named_sequence named_sequences[] = { {3, {0x0039, 0xFE0F, 0x20E3}}, {2, {0x0100, 0x0300}}, {2, {0x0101, 0x0300}}, + {2, {0x012A, 0x0300}}, + {2, {0x012B, 0x0300}}, + {2, {0x016A, 0x0300}}, + {2, {0x016B, 0x0300}}, {2, {0x0045, 0x0329}}, {2, {0x0065, 0x0329}}, {2, {0x00C8, 0x0329}}, {2, {0x00E8, 0x0329}}, {2, {0x00C9, 0x0329}}, {2, {0x00E9, 0x0329}}, - {2, {0x00CA, 0x0304}}, - {2, {0x00EA, 0x0304}}, - {2, {0x00CA, 0x030C}}, - {2, {0x00EA, 0x030C}}, - {2, {0x012A, 0x0300}}, - {2, {0x012B, 0x0300}}, - {3, {0x0069, 0x0307, 0x0301}}, - {3, {0x006E, 0x0360, 0x0067}}, {2, {0x004F, 0x0329}}, {2, {0x006F, 0x0329}}, {2, {0x00D2, 0x0329}}, @@ -28637,8 +29501,12 @@ static const named_sequence named_sequences[] = { {2, {0x00F3, 0x0329}}, {2, {0x0053, 0x0329}}, {2, {0x0073, 0x0329}}, - {2, {0x016A, 0x0300}}, - {2, {0x016B, 0x0300}}, + {2, {0x00CA, 0x0304}}, + {2, {0x00EA, 0x0304}}, + {2, {0x00CA, 0x030C}}, + {2, {0x00EA, 0x030C}}, + {3, {0x0069, 0x0307, 0x0301}}, + {3, {0x006E, 0x0360, 0x0067}}, {2, {0x0104, 0x0301}}, {2, {0x0105, 0x0301}}, {2, {0x0104, 0x0303}}, diff --git a/Modules/xxlimited.c b/Modules/xxlimited.c index ffc04e0310e392780625b13d62a850aaa66078e5..5b05a9454a05dac9817cef385f95169602b6eb90 100644 --- a/Modules/xxlimited.c +++ b/Modules/xxlimited.c @@ -25,7 +25,7 @@ typedef struct { static PyObject *Xxo_Type; -#define XxoObject_Check(v) (Py_TYPE(v) == Xxo_Type) +#define XxoObject_Check(v) Py_IS_TYPE(v, Xxo_Type) static XxoObject * newXxoObject(PyObject *arg) @@ -43,6 +43,7 @@ newXxoObject(PyObject *arg) static int Xxo_traverse(XxoObject *self, visitproc visit, void *arg) { + Py_VISIT(Py_TYPE(self)); Py_VISIT(self->x_attr); return 0; } diff --git a/Modules/xxmodule.c b/Modules/xxmodule.c index 0250031d722d3a97e2d501fcca7a716080d6a877..17b049c4b9a3755721970c9b37ddfbf049d06682 100644 --- a/Modules/xxmodule.c +++ b/Modules/xxmodule.c @@ -25,7 +25,7 @@ typedef struct { static PyTypeObject Xxo_Type; -#define XxoObject_Check(v) (Py_TYPE(v) == &Xxo_Type) +#define XxoObject_Check(v) Py_IS_TYPE(v, &Xxo_Type) static XxoObject * newXxoObject(PyObject *arg) diff --git a/Modules/xxsubtype.c b/Modules/xxsubtype.c index 031005d36e20f2a519e4675804cce284bd7443ac..7200337724e080b40ee77aae14de51e2e45eb558 100644 --- a/Modules/xxsubtype.c +++ b/Modules/xxsubtype.c @@ -1,5 +1,5 @@ #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef PyDoc_STRVAR(xxsubtype__doc__, "xxsubtype is an example module showing how to subtype builtin types from C.\n" diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c index a3d9ed6646dec8e265e0996689885567249248c7..fe27909ae8a75a64780c42adc4caef876dd87c8e 100644 --- a/Modules/zlibmodule.c +++ b/Modules/zlibmodule.c @@ -6,11 +6,10 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include "zlib.h" -#include "pythread.h" #define ENTER_ZLIB(obj) \ Py_BEGIN_ALLOW_THREADS; \ PyThread_acquire_lock((obj)->lock, 1); \ @@ -32,10 +31,23 @@ /* Initial buffer size. */ #define DEF_BUF_SIZE (16*1024) -static PyTypeObject Comptype; -static PyTypeObject Decomptype; +static PyModuleDef zlibmodule; -static PyObject *ZlibError; +typedef struct { + PyTypeObject *Comptype; + PyTypeObject *Decomptype; + PyObject *ZlibError; +} _zlibstate; + +static inline _zlibstate* +get_zlib_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (_zlibstate *)state; +} + +#define _zlibstate_global ((_zlibstate *)PyModule_GetState(PyState_FindModule(&zlibmodule))) typedef struct { @@ -73,9 +85,9 @@ zlib_error(z_stream zst, int err, const char *msg) } } if (zmsg == Z_NULL) - PyErr_Format(ZlibError, "Error %d %s", err, msg); + PyErr_Format(_zlibstate_global->ZlibError, "Error %d %s", err, msg); else - PyErr_Format(ZlibError, "Error %d %s: %.200s", err, msg, zmsg); + PyErr_Format(_zlibstate_global->ZlibError, "Error %d %s: %.200s", err, msg, zmsg); } /*[clinic input] @@ -226,7 +238,7 @@ zlib_compress_impl(PyObject *module, Py_buffer *data, int level) "Out of memory while compressing data"); goto error; case Z_STREAM_ERROR: - PyErr_SetString(ZlibError, "Bad compression level"); + PyErr_SetString(_zlibstate_global->ZlibError, "Bad compression level"); goto error; default: deflateEnd(&zst); @@ -462,7 +474,7 @@ zlib_compressobj_impl(PyObject *module, int level, int method, int wbits, goto error; } - self = newcompobject(&Comptype); + self = newcompobject(_zlibstate_global->Comptype); if (self == NULL) goto error; self->zst.opaque = NULL; @@ -558,7 +570,7 @@ zlib_decompressobj_impl(PyObject *module, int wbits, PyObject *zdict) return NULL; } - self = newcompobject(&Decomptype); + self = newcompobject(_zlibstate_global->Decomptype); if (self == NULL) return NULL; self->zst.opaque = NULL; @@ -581,7 +593,7 @@ zlib_decompressobj_impl(PyObject *module, int wbits, PyObject *zdict) return NULL; } #else - PyErr_Format(ZlibError, + PyErr_Format(_zlibstate_global->ZlibError, "zlib version %s does not allow raw inflate with dictionary", ZLIB_VERSION); Py_DECREF(self); @@ -608,11 +620,13 @@ zlib_decompressobj_impl(PyObject *module, int wbits, PyObject *zdict) static void Dealloc(compobject *self) { + PyObject *type = (PyObject *)Py_TYPE(self); PyThread_free_lock(self->lock); Py_XDECREF(self->unused_data); Py_XDECREF(self->unconsumed_tail); Py_XDECREF(self->zdict); PyObject_Del(self); + Py_DECREF(type); } static void @@ -944,7 +958,7 @@ zlib_Compress_copy_impl(compobject *self) compobject *retval = NULL; int err; - retval = newcompobject(&Comptype); + retval = newcompobject(_zlibstate_global->Comptype); if (!retval) return NULL; /* Copy the zstream state @@ -1025,7 +1039,7 @@ zlib_Decompress_copy_impl(compobject *self) compobject *retval = NULL; int err; - retval = newcompobject(&Decomptype); + retval = newcompobject(_zlibstate_global->Decomptype); if (!retval) return NULL; /* Copy the zstream state @@ -1309,67 +1323,33 @@ static PyMethodDef zlib_methods[] = {NULL, NULL} }; -static PyTypeObject Comptype = { - PyVarObject_HEAD_INIT(0, 0) +static PyType_Slot Comptype_slots[] = { + {Py_tp_dealloc, Comp_dealloc}, + {Py_tp_methods, comp_methods}, + {0, 0}, +}; + +static PyType_Spec Comptype_spec = { "zlib.Compress", sizeof(compobject), 0, - (destructor)Comp_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - comp_methods, /*tp_methods*/ + Py_TPFLAGS_DEFAULT, + Comptype_slots +}; + +static PyType_Slot Decomptype_slots[] = { + {Py_tp_dealloc, Decomp_dealloc}, + {Py_tp_methods, Decomp_methods}, + {Py_tp_members, Decomp_members}, + {0, 0}, }; -static PyTypeObject Decomptype = { - PyVarObject_HEAD_INIT(0, 0) +static PyType_Spec Decomptype_spec = { "zlib.Decompress", sizeof(compobject), 0, - (destructor)Decomp_dealloc, /*tp_dealloc*/ - 0, /*tp_vectorcall_offset*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_as_async*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - Decomp_methods, /*tp_methods*/ - Decomp_members, /*tp_members*/ + Py_TPFLAGS_DEFAULT, + Decomptype_slots }; PyDoc_STRVAR(zlib_module_documentation, @@ -1387,34 +1367,72 @@ PyDoc_STRVAR(zlib_module_documentation, "Compressor objects support compress() and flush() methods; decompressor\n" "objects support decompress() and flush()."); +static int +zlib_clear(PyObject *m) +{ + _zlibstate *state = get_zlib_state(m); + Py_CLEAR(state->Comptype); + Py_CLEAR(state->Decomptype); + Py_CLEAR(state->ZlibError); + return 0; +} + +static int +zlib_traverse(PyObject *m, visitproc visit, void *arg) +{ + _zlibstate *state = get_zlib_state(m); + Py_VISIT(state->Comptype); + Py_VISIT(state->Decomptype); + Py_VISIT(state->ZlibError); + return 0; +} + +static void +zlib_free(void *m) +{ + zlib_clear((PyObject *)m); +} + static struct PyModuleDef zlibmodule = { PyModuleDef_HEAD_INIT, "zlib", zlib_module_documentation, - -1, + sizeof(_zlibstate), zlib_methods, NULL, - NULL, - NULL, - NULL + zlib_traverse, + zlib_clear, + zlib_free, }; PyMODINIT_FUNC PyInit_zlib(void) { PyObject *m, *ver; - if (PyType_Ready(&Comptype) < 0) - return NULL; - if (PyType_Ready(&Decomptype) < 0) - return NULL; + m = PyState_FindModule(&zlibmodule); + if (m != NULL) { + Py_INCREF(m); + return m; + } m = PyModule_Create(&zlibmodule); if (m == NULL) return NULL; - ZlibError = PyErr_NewException("zlib.error", NULL, NULL); + PyTypeObject *Comptype = (PyTypeObject *)PyType_FromSpec(&Comptype_spec); + if (Comptype == NULL) + return NULL; + get_zlib_state(m)->Comptype = Comptype; + + PyTypeObject *Decomptype = (PyTypeObject *)PyType_FromSpec(&Decomptype_spec); + if (Decomptype == NULL) + return NULL; + get_zlib_state(m)->Decomptype = Decomptype; + + PyObject *ZlibError = PyErr_NewException("zlib.error", NULL, NULL); if (ZlibError != NULL) { Py_INCREF(ZlibError); PyModule_AddObject(m, "error", ZlibError); + get_zlib_state(m)->ZlibError = ZlibError; } PyModule_AddIntMacro(m, MAX_WBITS); PyModule_AddIntMacro(m, DEFLATED); @@ -1457,5 +1475,6 @@ PyInit_zlib(void) PyModule_AddStringConstant(m, "__version__", "1.0"); + PyState_AddModule(m, &zlibmodule); return m; } diff --git a/Objects/abstract.c b/Objects/abstract.c index 12237d570f7436a30ebe830c8642bce9d0798298..1922619ad85db051d22d8e0560fd75f3ac46584f 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -1,9 +1,12 @@ /* Abstract Object Interface (many thanks to Jim Fulton) */ #include "Python.h" -#include "pycore_pystate.h" +#include "pycore_abstract.h" // _PyIndex_Check() +#include "pycore_ceval.h" // _Py_EnterRecursiveCall() +#include "pycore_pyerrors.h" +#include "pycore_pystate.h" // _PyThreadState_GET() #include -#include "structmember.h" /* we need the offsetof() macro from there */ +#include // offsetof() #include "longintrepr.h" @@ -13,7 +16,7 @@ static PyObject * type_error(const char *msg, PyObject *obj) { - PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, msg, Py_TYPE(obj)->tp_name); return NULL; } @@ -37,7 +40,7 @@ PyObject_Type(PyObject *o) return null_error(); } - v = (PyObject *)o->ob_type; + v = (PyObject *)Py_TYPE(o); Py_INCREF(v); return v; } @@ -52,7 +55,7 @@ PyObject_Size(PyObject *o) return -1; } - m = o->ob_type->tp_as_sequence; + m = Py_TYPE(o)->tp_as_sequence; if (m && m->sq_length) { Py_ssize_t len = m->sq_length(o); assert(len >= 0 || PyErr_Occurred()); @@ -149,16 +152,16 @@ PyObject_GetItem(PyObject *o, PyObject *key) return null_error(); } - m = o->ob_type->tp_as_mapping; + m = Py_TYPE(o)->tp_as_mapping; if (m && m->mp_subscript) { PyObject *item = m->mp_subscript(o, key); assert((item != NULL) ^ (PyErr_Occurred() != NULL)); return item; } - ms = o->ob_type->tp_as_sequence; + ms = Py_TYPE(o)->tp_as_sequence; if (ms && ms->sq_item) { - if (PyIndex_Check(key)) { + if (_PyIndex_Check(key)) { Py_ssize_t key_value; key_value = PyNumber_AsSsize_t(key, PyExc_IndexError); if (key_value == -1 && PyErr_Occurred()) @@ -172,13 +175,19 @@ PyObject_GetItem(PyObject *o, PyObject *key) } if (PyType_Check(o)) { - PyObject *meth, *result, *stack[1] = {key}; + PyObject *meth, *result; _Py_IDENTIFIER(__class_getitem__); + + // Special case type[int], but disallow other types so str[int] fails + if ((PyTypeObject*)o == &PyType_Type) { + return Py_GenericAlias(o, key); + } + if (_PyObject_LookupAttrId(o, &PyId___class_getitem__, &meth) < 0) { return NULL; } if (meth) { - result = _PyObject_FastCall(meth, stack, 1); + result = PyObject_CallOneArg(meth, key); Py_DECREF(meth); return result; } @@ -196,19 +205,19 @@ PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value) null_error(); return -1; } - m = o->ob_type->tp_as_mapping; + m = Py_TYPE(o)->tp_as_mapping; if (m && m->mp_ass_subscript) return m->mp_ass_subscript(o, key, value); - if (o->ob_type->tp_as_sequence) { - if (PyIndex_Check(key)) { + if (Py_TYPE(o)->tp_as_sequence) { + if (_PyIndex_Check(key)) { Py_ssize_t key_value; key_value = PyNumber_AsSsize_t(key, PyExc_IndexError); if (key_value == -1 && PyErr_Occurred()) return -1; return PySequence_SetItem(o, key_value, value); } - else if (o->ob_type->tp_as_sequence->sq_ass_item) { + else if (Py_TYPE(o)->tp_as_sequence->sq_ass_item) { type_error("sequence index must be " "integer, not '%.200s'", key); return -1; @@ -228,19 +237,19 @@ PyObject_DelItem(PyObject *o, PyObject *key) null_error(); return -1; } - m = o->ob_type->tp_as_mapping; + m = Py_TYPE(o)->tp_as_mapping; if (m && m->mp_ass_subscript) return m->mp_ass_subscript(o, key, (PyObject*)NULL); - if (o->ob_type->tp_as_sequence) { - if (PyIndex_Check(key)) { + if (Py_TYPE(o)->tp_as_sequence) { + if (_PyIndex_Check(key)) { Py_ssize_t key_value; key_value = PyNumber_AsSsize_t(key, PyExc_IndexError); if (key_value == -1 && PyErr_Occurred()) return -1; return PySequence_DelItem(o, key_value); } - else if (o->ob_type->tp_as_sequence->sq_ass_item) { + else if (Py_TYPE(o)->tp_as_sequence->sq_ass_item) { type_error("sequence index must be " "integer, not '%.200s'", key); return -1; @@ -269,13 +278,23 @@ PyObject_DelItemString(PyObject *o, const char *key) return ret; } + +/* Return 1 if the getbuffer function is available, otherwise return 0. */ +int +PyObject_CheckBuffer(PyObject *obj) +{ + PyBufferProcs *tp_as_buffer = Py_TYPE(obj)->tp_as_buffer; + return (tp_as_buffer != NULL && tp_as_buffer->bf_getbuffer != NULL); +} + + /* We release the buffer right after use of this function which could cause issues later on. Don't use these functions in new code. */ int PyObject_CheckReadBuffer(PyObject *obj) { - PyBufferProcs *pb = obj->ob_type->tp_as_buffer; + PyBufferProcs *pb = Py_TYPE(obj)->tp_as_buffer; Py_buffer view; if (pb == NULL || @@ -333,7 +352,7 @@ int PyObject_AsWriteBuffer(PyObject *obj, null_error(); return -1; } - pb = obj->ob_type->tp_as_buffer; + pb = Py_TYPE(obj)->tp_as_buffer; if (pb == NULL || pb->bf_getbuffer == NULL || ((*pb->bf_getbuffer)(obj, &view, PyBUF_WRITABLE) != 0)) { @@ -353,7 +372,7 @@ int PyObject_AsWriteBuffer(PyObject *obj, int PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { - PyBufferProcs *pb = obj->ob_type->tp_as_buffer; + PyBufferProcs *pb = Py_TYPE(obj)->tp_as_buffer; if (pb == NULL || pb->bf_getbuffer == NULL) { PyErr_Format(PyExc_TypeError, @@ -495,6 +514,48 @@ _Py_add_one_to_index_C(int nd, Py_ssize_t *index, const Py_ssize_t *shape) } } +Py_ssize_t +PyBuffer_SizeFromFormat(const char *format) +{ + PyObject *structmodule = NULL; + PyObject *calcsize = NULL; + PyObject *res = NULL; + PyObject *fmt = NULL; + Py_ssize_t itemsize = -1; + + structmodule = PyImport_ImportModule("struct"); + if (structmodule == NULL) { + return itemsize; + } + + calcsize = PyObject_GetAttrString(structmodule, "calcsize"); + if (calcsize == NULL) { + goto done; + } + + fmt = PyUnicode_FromString(format); + if (fmt == NULL) { + goto done; + } + + res = PyObject_CallFunctionObjArgs(calcsize, fmt, NULL); + if (res == NULL) { + goto done; + } + + itemsize = PyLong_AsSsize_t(res); + if (itemsize < 0) { + goto done; + } + +done: + Py_DECREF(structmodule); + Py_XDECREF(calcsize); + Py_XDECREF(fmt); + Py_XDECREF(res); + return itemsize; +} + int PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort) { @@ -737,7 +798,7 @@ PyObject_Format(PyObject *obj, PyObject *format_spec) } /* And call it. */ - result = PyObject_CallFunctionObjArgs(meth, format_spec, NULL); + result = PyObject_CallOneArg(meth, format_spec); Py_DECREF(meth); if (result && !PyUnicode_Check(result)) { @@ -758,10 +819,10 @@ PyObject_Format(PyObject *obj, PyObject *format_spec) int PyNumber_Check(PyObject *o) { - return o && o->ob_type->tp_as_number && - (o->ob_type->tp_as_number->nb_index || - o->ob_type->tp_as_number->nb_int || - o->ob_type->tp_as_number->nb_float); + return o && Py_TYPE(o)->tp_as_number && + (Py_TYPE(o)->tp_as_number->nb_index || + Py_TYPE(o)->tp_as_number->nb_int || + Py_TYPE(o)->tp_as_number->nb_float); } /* Binary operators */ @@ -778,8 +839,8 @@ PyNumber_Check(PyObject *o) Order operations are tried until either a valid result or error: w.op(v,w)[*], v.op(v,w), w.op(v,w) - [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of - v->ob_type + [*] only when Py_TYPE(v) != Py_TYPE(w) && Py_TYPE(w) is a subclass of + Py_TYPE(v) */ static PyObject * @@ -789,16 +850,16 @@ binary_op1(PyObject *v, PyObject *w, const int op_slot) binaryfunc slotv = NULL; binaryfunc slotw = NULL; - if (v->ob_type->tp_as_number != NULL) - slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot); - if (w->ob_type != v->ob_type && - w->ob_type->tp_as_number != NULL) { - slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot); + if (Py_TYPE(v)->tp_as_number != NULL) + slotv = NB_BINOP(Py_TYPE(v)->tp_as_number, op_slot); + if (!Py_IS_TYPE(w, Py_TYPE(v)) && + Py_TYPE(w)->tp_as_number != NULL) { + slotw = NB_BINOP(Py_TYPE(w)->tp_as_number, op_slot); if (slotw == slotv) slotw = NULL; } if (slotv) { - if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) { + if (slotw && PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v))) { x = slotw(v, w); if (x != Py_NotImplemented) return x; @@ -826,8 +887,8 @@ binop_type_error(PyObject *v, PyObject *w, const char *op_name) "unsupported operand type(s) for %.100s: " "'%.100s' and '%.100s'", op_name, - v->ob_type->tp_name, - w->ob_type->tp_name); + Py_TYPE(v)->tp_name, + Py_TYPE(w)->tp_name); return NULL; } @@ -839,7 +900,7 @@ binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name) Py_DECREF(result); if (op_slot == NB_SLOT(nb_rshift) && - PyCFunction_Check(v) && + PyCFunction_CheckExact(v) && strcmp(((PyCFunctionObject *)v)->m_ml->ml_name, "print") == 0) { PyErr_Format(PyExc_TypeError, @@ -847,8 +908,8 @@ binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name) "'%.100s' and '%.100s'. Did you mean \"print(, " "file=)\"?", op_name, - v->ob_type->tp_name, - w->ob_type->tp_name); + Py_TYPE(v)->tp_name, + Py_TYPE(w)->tp_name); return NULL; } @@ -878,18 +939,17 @@ ternary_op(PyObject *v, ternaryfunc slotw = NULL; ternaryfunc slotz = NULL; - mv = v->ob_type->tp_as_number; - mw = w->ob_type->tp_as_number; + mv = Py_TYPE(v)->tp_as_number; + mw = Py_TYPE(w)->tp_as_number; if (mv != NULL) slotv = NB_TERNOP(mv, op_slot); - if (w->ob_type != v->ob_type && - mw != NULL) { + if (!Py_IS_TYPE(w, Py_TYPE(v)) && mw != NULL) { slotw = NB_TERNOP(mw, op_slot); if (slotw == slotv) slotw = NULL; } if (slotv) { - if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) { + if (slotw && PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v))) { x = slotw(v, w, z); if (x != Py_NotImplemented) return x; @@ -907,7 +967,7 @@ ternary_op(PyObject *v, return x; Py_DECREF(x); /* can't do it */ } - mz = z->ob_type->tp_as_number; + mz = Py_TYPE(z)->tp_as_number; if (mz != NULL) { slotz = NB_TERNOP(mz, op_slot); if (slotz == slotv || slotz == slotw) @@ -925,16 +985,16 @@ ternary_op(PyObject *v, PyExc_TypeError, "unsupported operand type(s) for ** or pow(): " "'%.100s' and '%.100s'", - v->ob_type->tp_name, - w->ob_type->tp_name); + Py_TYPE(v)->tp_name, + Py_TYPE(w)->tp_name); else PyErr_Format( PyExc_TypeError, "unsupported operand type(s) for pow(): " "'%.100s', '%.100s', '%.100s'", - v->ob_type->tp_name, - w->ob_type->tp_name, - z->ob_type->tp_name); + Py_TYPE(v)->tp_name, + Py_TYPE(w)->tp_name, + Py_TYPE(z)->tp_name); return NULL; } @@ -957,7 +1017,7 @@ PyNumber_Add(PyObject *v, PyObject *w) { PyObject *result = binary_op1(v, w, NB_SLOT(nb_add)); if (result == Py_NotImplemented) { - PySequenceMethods *m = v->ob_type->tp_as_sequence; + PySequenceMethods *m = Py_TYPE(v)->tp_as_sequence; Py_DECREF(result); if (m && m->sq_concat) { return (*m->sq_concat)(v, w); @@ -971,7 +1031,7 @@ static PyObject * sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n) { Py_ssize_t count; - if (PyIndex_Check(n)) { + if (_PyIndex_Check(n)) { count = PyNumber_AsSsize_t(n, PyExc_OverflowError); if (count == -1 && PyErr_Occurred()) return NULL; @@ -988,8 +1048,8 @@ PyNumber_Multiply(PyObject *v, PyObject *w) { PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply)); if (result == Py_NotImplemented) { - PySequenceMethods *mv = v->ob_type->tp_as_sequence; - PySequenceMethods *mw = w->ob_type->tp_as_sequence; + PySequenceMethods *mv = Py_TYPE(v)->tp_as_sequence; + PySequenceMethods *mw = Py_TYPE(w)->tp_as_sequence; Py_DECREF(result); if (mv && mv->sq_repeat) { return sequence_repeat(mv->sq_repeat, v, w); @@ -1051,7 +1111,7 @@ PyNumber_Power(PyObject *v, PyObject *w, PyObject *z) static PyObject * binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot) { - PyNumberMethods *mv = v->ob_type->tp_as_number; + PyNumberMethods *mv = Py_TYPE(v)->tp_as_number; if (mv != NULL) { binaryfunc slot = NB_BINOP(mv, iop_slot); if (slot) { @@ -1111,7 +1171,7 @@ PyNumber_InPlaceAdd(PyObject *v, PyObject *w) PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add), NB_SLOT(nb_add)); if (result == Py_NotImplemented) { - PySequenceMethods *m = v->ob_type->tp_as_sequence; + PySequenceMethods *m = Py_TYPE(v)->tp_as_sequence; Py_DECREF(result); if (m != NULL) { binaryfunc f = NULL; @@ -1133,8 +1193,8 @@ PyNumber_InPlaceMultiply(PyObject *v, PyObject *w) NB_SLOT(nb_multiply)); if (result == Py_NotImplemented) { ssizeargfunc f = NULL; - PySequenceMethods *mv = v->ob_type->tp_as_sequence; - PySequenceMethods *mw = w->ob_type->tp_as_sequence; + PySequenceMethods *mv = Py_TYPE(v)->tp_as_sequence; + PySequenceMethods *mw = Py_TYPE(w)->tp_as_sequence; Py_DECREF(result); if (mv != NULL) { f = mv->sq_inplace_repeat; @@ -1172,8 +1232,8 @@ PyNumber_InPlaceRemainder(PyObject *v, PyObject *w) PyObject * PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z) { - if (v->ob_type->tp_as_number && - v->ob_type->tp_as_number->nb_inplace_power != NULL) { + if (Py_TYPE(v)->tp_as_number && + Py_TYPE(v)->tp_as_number->nb_inplace_power != NULL) { return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**="); } else { @@ -1193,7 +1253,7 @@ PyNumber_Negative(PyObject *o) return null_error(); } - m = o->ob_type->tp_as_number; + m = Py_TYPE(o)->tp_as_number; if (m && m->nb_negative) return (*m->nb_negative)(o); @@ -1209,7 +1269,7 @@ PyNumber_Positive(PyObject *o) return null_error(); } - m = o->ob_type->tp_as_number; + m = Py_TYPE(o)->tp_as_number; if (m && m->nb_positive) return (*m->nb_positive)(o); @@ -1225,7 +1285,7 @@ PyNumber_Invert(PyObject *o) return null_error(); } - m = o->ob_type->tp_as_number; + m = Py_TYPE(o)->tp_as_number; if (m && m->nb_invert) return (*m->nb_invert)(o); @@ -1241,22 +1301,21 @@ PyNumber_Absolute(PyObject *o) return null_error(); } - m = o->ob_type->tp_as_number; + m = Py_TYPE(o)->tp_as_number; if (m && m->nb_absolute) return m->nb_absolute(o); return type_error("bad operand type for abs(): '%.200s'", o); } -#undef PyIndex_Check int PyIndex_Check(PyObject *obj) { - return obj->ob_type->tp_as_number != NULL && - obj->ob_type->tp_as_number->nb_index != NULL; + return _PyIndex_Check(obj); } + /* Return a Python int from the object item. Raise TypeError if the result is not an int or if the object cannot be interpreted as an index. @@ -1273,19 +1332,19 @@ PyNumber_Index(PyObject *item) Py_INCREF(item); return item; } - if (!PyIndex_Check(item)) { + if (!_PyIndex_Check(item)) { PyErr_Format(PyExc_TypeError, "'%.200s' object cannot be interpreted " - "as an integer", item->ob_type->tp_name); + "as an integer", Py_TYPE(item)->tp_name); return NULL; } - result = item->ob_type->tp_as_number->nb_index(item); + result = Py_TYPE(item)->tp_as_number->nb_index(item); if (!result || PyLong_CheckExact(result)) return result; if (!PyLong_Check(result)) { PyErr_Format(PyExc_TypeError, "__index__ returned non-int (type %.200s)", - result->ob_type->tp_name); + Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } @@ -1294,7 +1353,7 @@ PyNumber_Index(PyObject *item) "__index__ returned non-int (type %.200s). " "The ability to return an instance of a strict subclass of int " "is deprecated, and may be removed in a future version of Python.", - result->ob_type->tp_name)) { + Py_TYPE(result)->tp_name)) { Py_DECREF(result); return NULL; } @@ -1339,7 +1398,7 @@ PyNumber_AsSsize_t(PyObject *item, PyObject *err) /* Otherwise replace the error with caller's error object. */ PyErr_Format(err, "cannot fit '%.200s' into an index-sized integer", - item->ob_type->tp_name); + Py_TYPE(item)->tp_name); } finish: @@ -1365,7 +1424,7 @@ PyNumber_Long(PyObject *o) Py_INCREF(o); return o; } - m = o->ob_type->tp_as_number; + m = Py_TYPE(o)->tp_as_number; if (m && m->nb_int) { /* This should include subclasses of int */ result = _PyLong_FromNbInt(o); if (result != NULL && !PyLong_CheckExact(result)) { @@ -1393,12 +1452,12 @@ PyNumber_Long(PyObject *o) } /* __trunc__ is specified to return an Integral type, but int() needs to return an int. */ - m = result->ob_type->tp_as_number; + m = Py_TYPE(result)->tp_as_number; if (m == NULL || (m->nb_index == NULL && m->nb_int == NULL)) { PyErr_Format( PyExc_TypeError, "__trunc__ returned non-Integral (type %.200s)", - result->ob_type->tp_name); + Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } @@ -1460,7 +1519,7 @@ PyNumber_Float(PyObject *o) Py_INCREF(o); return o; } - m = o->ob_type->tp_as_number; + m = Py_TYPE(o)->tp_as_number; if (m && m->nb_float) { /* This should include subclasses of float */ PyObject *res = m->nb_float(o); double val; @@ -1470,7 +1529,7 @@ PyNumber_Float(PyObject *o) if (!PyFloat_Check(res)) { PyErr_Format(PyExc_TypeError, "%.50s.__float__ returned non-float (type %.50s)", - o->ob_type->tp_name, res->ob_type->tp_name); + Py_TYPE(o)->tp_name, Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL; } @@ -1479,7 +1538,7 @@ PyNumber_Float(PyObject *o) "%.50s.__float__ returned non-float (type %.50s). " "The ability to return an instance of a strict subclass of float " "is deprecated, and may be removed in a future version of Python.", - o->ob_type->tp_name, res->ob_type->tp_name)) { + Py_TYPE(o)->tp_name, Py_TYPE(res)->tp_name)) { Py_DECREF(res); return NULL; } @@ -1530,8 +1589,8 @@ PySequence_Check(PyObject *s) { if (PyDict_Check(s)) return 0; - return s->ob_type->tp_as_sequence && - s->ob_type->tp_as_sequence->sq_item != NULL; + return Py_TYPE(s)->tp_as_sequence && + Py_TYPE(s)->tp_as_sequence->sq_item != NULL; } Py_ssize_t @@ -1544,14 +1603,14 @@ PySequence_Size(PyObject *s) return -1; } - m = s->ob_type->tp_as_sequence; + m = Py_TYPE(s)->tp_as_sequence; if (m && m->sq_length) { Py_ssize_t len = m->sq_length(s); assert(len >= 0 || PyErr_Occurred()); return len; } - if (s->ob_type->tp_as_mapping && s->ob_type->tp_as_mapping->mp_length) { + if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_length) { type_error("%.200s is not a sequence", s); return -1; } @@ -1576,7 +1635,7 @@ PySequence_Concat(PyObject *s, PyObject *o) return null_error(); } - m = s->ob_type->tp_as_sequence; + m = Py_TYPE(s)->tp_as_sequence; if (m && m->sq_concat) return m->sq_concat(s, o); @@ -1601,7 +1660,7 @@ PySequence_Repeat(PyObject *o, Py_ssize_t count) return null_error(); } - m = o->ob_type->tp_as_sequence; + m = Py_TYPE(o)->tp_as_sequence; if (m && m->sq_repeat) return m->sq_repeat(o, count); @@ -1631,7 +1690,7 @@ PySequence_InPlaceConcat(PyObject *s, PyObject *o) return null_error(); } - m = s->ob_type->tp_as_sequence; + m = Py_TYPE(s)->tp_as_sequence; if (m && m->sq_inplace_concat) return m->sq_inplace_concat(s, o); if (m && m->sq_concat) @@ -1656,7 +1715,7 @@ PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count) return null_error(); } - m = o->ob_type->tp_as_sequence; + m = Py_TYPE(o)->tp_as_sequence; if (m && m->sq_inplace_repeat) return m->sq_inplace_repeat(o, count); if (m && m->sq_repeat) @@ -1686,7 +1745,7 @@ PySequence_GetItem(PyObject *s, Py_ssize_t i) return null_error(); } - m = s->ob_type->tp_as_sequence; + m = Py_TYPE(s)->tp_as_sequence; if (m && m->sq_item) { if (i < 0) { if (m->sq_length) { @@ -1701,7 +1760,7 @@ PySequence_GetItem(PyObject *s, Py_ssize_t i) return m->sq_item(s, i); } - if (s->ob_type->tp_as_mapping && s->ob_type->tp_as_mapping->mp_subscript) { + if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_subscript) { return type_error("%.200s is not a sequence", s); } return type_error("'%.200s' object does not support indexing", s); @@ -1716,7 +1775,7 @@ PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2) return null_error(); } - mp = s->ob_type->tp_as_mapping; + mp = Py_TYPE(s)->tp_as_mapping; if (mp && mp->mp_subscript) { PyObject *res; PyObject *slice = _PySlice_FromIndices(i1, i2); @@ -1740,7 +1799,7 @@ PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o) return -1; } - m = s->ob_type->tp_as_sequence; + m = Py_TYPE(s)->tp_as_sequence; if (m && m->sq_ass_item) { if (i < 0) { if (m->sq_length) { @@ -1755,7 +1814,7 @@ PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o) return m->sq_ass_item(s, i, o); } - if (s->ob_type->tp_as_mapping && s->ob_type->tp_as_mapping->mp_ass_subscript) { + if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_ass_subscript) { type_error("%.200s is not a sequence", s); return -1; } @@ -1773,7 +1832,7 @@ PySequence_DelItem(PyObject *s, Py_ssize_t i) return -1; } - m = s->ob_type->tp_as_sequence; + m = Py_TYPE(s)->tp_as_sequence; if (m && m->sq_ass_item) { if (i < 0) { if (m->sq_length) { @@ -1788,7 +1847,7 @@ PySequence_DelItem(PyObject *s, Py_ssize_t i) return m->sq_ass_item(s, i, (PyObject *)NULL); } - if (s->ob_type->tp_as_mapping && s->ob_type->tp_as_mapping->mp_ass_subscript) { + if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_ass_subscript) { type_error("%.200s is not a sequence", s); return -1; } @@ -1806,7 +1865,7 @@ PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o) return -1; } - mp = s->ob_type->tp_as_mapping; + mp = Py_TYPE(s)->tp_as_mapping; if (mp && mp->mp_ass_subscript) { int res; PyObject *slice = _PySlice_FromIndices(i1, i2); @@ -1831,7 +1890,7 @@ PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2) return -1; } - mp = s->ob_type->tp_as_mapping; + mp = Py_TYPE(s)->tp_as_mapping; if (mp && mp->mp_ass_subscript) { int res; PyObject *slice = _PySlice_FromIndices(i1, i2); @@ -2015,7 +2074,7 @@ _PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation) break; } - cmp = PyObject_RichCompareBool(obj, item, Py_EQ); + cmp = PyObject_RichCompareBool(item, obj, Py_EQ); Py_DECREF(item); if (cmp < 0) goto Fail; @@ -2083,7 +2142,7 @@ int PySequence_Contains(PyObject *seq, PyObject *ob) { Py_ssize_t result; - PySequenceMethods *sqm = seq->ob_type->tp_as_sequence; + PySequenceMethods *sqm = Py_TYPE(seq)->tp_as_sequence; if (sqm != NULL && sqm->sq_contains != NULL) return (*sqm->sq_contains)(seq, ob); result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS); @@ -2109,8 +2168,8 @@ PySequence_Index(PyObject *s, PyObject *o) int PyMapping_Check(PyObject *o) { - return o && o->ob_type->tp_as_mapping && - o->ob_type->tp_as_mapping->mp_subscript; + return o && Py_TYPE(o)->tp_as_mapping && + Py_TYPE(o)->tp_as_mapping->mp_subscript; } Py_ssize_t @@ -2123,14 +2182,14 @@ PyMapping_Size(PyObject *o) return -1; } - m = o->ob_type->tp_as_mapping; + m = Py_TYPE(o)->tp_as_mapping; if (m && m->mp_length) { Py_ssize_t len = m->mp_length(o); assert(len >= 0 || PyErr_Occurred()); return len; } - if (o->ob_type->tp_as_sequence && o->ob_type->tp_as_sequence->sq_length) { + if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_length) { type_error("%.200s is not a mapping", o); return -1; } @@ -2220,7 +2279,7 @@ method_output_as_list(PyObject *o, _Py_Identifier *meth_id) PyObject *it, *result, *meth_output; assert(o != NULL); - meth_output = _PyObject_CallMethodId(o, meth_id, NULL); + meth_output = _PyObject_CallMethodIdNoArgs(o, meth_id); if (meth_output == NULL || PyList_CheckExact(meth_output)) { return meth_output; } @@ -2230,7 +2289,7 @@ method_output_as_list(PyObject *o, _Py_Identifier *meth_id) PyErr_Format(PyExc_TypeError, "%.200s.%U() returned a non-iterable (type %.200s)", Py_TYPE(o)->tp_name, - meth_id->object, + _PyUnicode_FromId(meth_id), Py_TYPE(meth_output)->tp_name); } Py_DECREF(meth_output); @@ -2316,9 +2375,7 @@ abstract_get_bases(PyObject *cls) _Py_IDENTIFIER(__bases__); PyObject *bases; - Py_ALLOW_RECURSION (void)_PyObject_LookupAttrId(cls, &PyId___bases__, &bases); - Py_END_ALLOW_RECURSION if (bases != NULL && !PyTuple_Check(bases)) { Py_DECREF(bases); return NULL; @@ -2385,7 +2442,7 @@ check_class(PyObject *cls, const char *error) } static int -recursive_isinstance(PyObject *inst, PyObject *cls) +object_isinstance(PyObject *inst, PyObject *cls) { PyObject *icls; int retval; @@ -2396,7 +2453,7 @@ recursive_isinstance(PyObject *inst, PyObject *cls) if (retval == 0) { retval = _PyObject_LookupAttrId(inst, &PyId___class__, &icls); if (icls != NULL) { - if (icls != (PyObject *)(inst->ob_type) && PyType_Check(icls)) { + if (icls != (PyObject *)(Py_TYPE(inst)) && PyType_Check(icls)) { retval = PyType_IsSubtype( (PyTypeObject *)icls, (PyTypeObject *)cls); @@ -2422,63 +2479,77 @@ recursive_isinstance(PyObject *inst, PyObject *cls) return retval; } -int -PyObject_IsInstance(PyObject *inst, PyObject *cls) +static int +object_recursive_isinstance(PyThreadState *tstate, PyObject *inst, PyObject *cls) { _Py_IDENTIFIER(__instancecheck__); - PyObject *checker; /* Quick test for an exact match */ - if (Py_TYPE(inst) == (PyTypeObject *)cls) + if (Py_IS_TYPE(inst, (PyTypeObject *)cls)) { return 1; + } /* We know what type's __instancecheck__ does. */ if (PyType_CheckExact(cls)) { - return recursive_isinstance(inst, cls); + return object_isinstance(inst, cls); } if (PyTuple_Check(cls)) { - Py_ssize_t i; - Py_ssize_t n; - int r = 0; - - if (Py_EnterRecursiveCall(" in __instancecheck__")) + /* Not a general sequence -- that opens up the road to + recursion and stack overflow. */ + if (_Py_EnterRecursiveCall(tstate, " in __instancecheck__")) { return -1; - n = PyTuple_GET_SIZE(cls); - for (i = 0; i < n; ++i) { + } + Py_ssize_t n = PyTuple_GET_SIZE(cls); + int r = 0; + for (Py_ssize_t i = 0; i < n; ++i) { PyObject *item = PyTuple_GET_ITEM(cls, i); - r = PyObject_IsInstance(inst, item); - if (r != 0) + r = object_recursive_isinstance(tstate, inst, item); + if (r != 0) { /* either found it, or got an error */ break; + } } - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); return r; } - checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__); + PyObject *checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__); if (checker != NULL) { - PyObject *res; - int ok = -1; - if (Py_EnterRecursiveCall(" in __instancecheck__")) { + if (_Py_EnterRecursiveCall(tstate, " in __instancecheck__")) { Py_DECREF(checker); - return ok; + return -1; } - res = PyObject_CallFunctionObjArgs(checker, inst, NULL); - Py_LeaveRecursiveCall(); + + PyObject *res = PyObject_CallOneArg(checker, inst); + _Py_LeaveRecursiveCall(tstate); Py_DECREF(checker); - if (res != NULL) { - ok = PyObject_IsTrue(res); - Py_DECREF(res); + + if (res == NULL) { + return -1; } + int ok = PyObject_IsTrue(res); + Py_DECREF(res); + return ok; } - else if (PyErr_Occurred()) + else if (_PyErr_Occurred(tstate)) { return -1; - /* Probably never reached anymore. */ - return recursive_isinstance(inst, cls); + } + + /* cls has no __instancecheck__() method */ + return object_isinstance(inst, cls); +} + + +int +PyObject_IsInstance(PyObject *inst, PyObject *cls) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return object_recursive_isinstance(tstate, inst, cls); } + static int recursive_issubclass(PyObject *derived, PyObject *cls) { @@ -2497,8 +2568,8 @@ recursive_issubclass(PyObject *derived, PyObject *cls) return abstract_issubclass(derived, cls); } -int -PyObject_IsSubclass(PyObject *derived, PyObject *cls) +static int +object_issubclass(PyThreadState *tstate, PyObject *derived, PyObject *cls) { _Py_IDENTIFIER(__subclasscheck__); PyObject *checker; @@ -2512,34 +2583,32 @@ PyObject_IsSubclass(PyObject *derived, PyObject *cls) } if (PyTuple_Check(cls)) { - Py_ssize_t i; - Py_ssize_t n; - int r = 0; - if (Py_EnterRecursiveCall(" in __subclasscheck__")) + if (_Py_EnterRecursiveCall(tstate, " in __subclasscheck__")) { return -1; - n = PyTuple_GET_SIZE(cls); - for (i = 0; i < n; ++i) { + } + Py_ssize_t n = PyTuple_GET_SIZE(cls); + int r = 0; + for (Py_ssize_t i = 0; i < n; ++i) { PyObject *item = PyTuple_GET_ITEM(cls, i); - r = PyObject_IsSubclass(derived, item); + r = object_issubclass(tstate, derived, item); if (r != 0) /* either found it, or got an error */ break; } - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); return r; } checker = _PyObject_LookupSpecial(cls, &PyId___subclasscheck__); if (checker != NULL) { - PyObject *res; int ok = -1; - if (Py_EnterRecursiveCall(" in __subclasscheck__")) { + if (_Py_EnterRecursiveCall(tstate, " in __subclasscheck__")) { Py_DECREF(checker); return ok; } - res = PyObject_CallFunctionObjArgs(checker, derived, NULL); - Py_LeaveRecursiveCall(); + PyObject *res = PyObject_CallOneArg(checker, derived); + _Py_LeaveRecursiveCall(tstate); Py_DECREF(checker); if (res != NULL) { ok = PyObject_IsTrue(res); @@ -2547,16 +2616,27 @@ PyObject_IsSubclass(PyObject *derived, PyObject *cls) } return ok; } - else if (PyErr_Occurred()) + else if (_PyErr_Occurred(tstate)) { return -1; + } + /* Probably never reached anymore. */ return recursive_issubclass(derived, cls); } + +int +PyObject_IsSubclass(PyObject *derived, PyObject *cls) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return object_issubclass(tstate, derived, cls); +} + + int _PyObject_RealIsInstance(PyObject *inst, PyObject *cls) { - return recursive_isinstance(inst, cls); + return object_isinstance(inst, cls); } int @@ -2569,7 +2649,7 @@ _PyObject_RealIsSubclass(PyObject *derived, PyObject *cls) PyObject * PyObject_GetIter(PyObject *o) { - PyTypeObject *t = o->ob_type; + PyTypeObject *t = Py_TYPE(o); getiterfunc f; f = t->tp_iter; @@ -2584,7 +2664,7 @@ PyObject_GetIter(PyObject *o) PyErr_Format(PyExc_TypeError, "iter() returned non-iterator " "of type '%.100s'", - res->ob_type->tp_name); + Py_TYPE(res)->tp_name); Py_DECREF(res); res = NULL; } @@ -2596,8 +2676,8 @@ PyObject_GetIter(PyObject *o) int PyIter_Check(PyObject *obj) { - return obj->ob_type->tp_iternext != NULL && - obj->ob_type->tp_iternext != &_PyObject_NextNotImplemented; + return Py_TYPE(obj)->tp_iternext != NULL && + Py_TYPE(obj)->tp_iternext != &_PyObject_NextNotImplemented; } /* Return next item. @@ -2611,7 +2691,7 @@ PyObject * PyIter_Next(PyObject *iter) { PyObject *result; - result = (*iter->ob_type->tp_iternext)(iter); + result = (*Py_TYPE(iter)->tp_iternext)(iter); if (result == NULL && PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index d4d02336b6cf036289158c63e64e70ee0e66c2c9..97d7796769f8177b2723c3e0ed0237e7f69e2744 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -2,11 +2,9 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" +#include "pycore_abstract.h" // _PyIndex_Check() +#include "pycore_bytes_methods.h" #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" -#include "structmember.h" -#include "bytes_methods.h" #include "bytesobject.h" #include "pystrhex.h" @@ -89,8 +87,7 @@ _canresize(PyByteArrayObject *self) PyObject * PyByteArray_FromObject(PyObject *input) { - return PyObject_CallFunctionObjArgs((PyObject *)&PyByteArray_Type, - input, NULL); + return PyObject_CallOneArg((PyObject *)&PyByteArray_Type, input); } static PyObject * @@ -149,7 +146,7 @@ PyByteArray_FromStringAndSize(const char *bytes, Py_ssize_t size) memcpy(new->ob_bytes, bytes, size); new->ob_bytes[size] = '\0'; /* Trailing null byte */ } - Py_SIZE(new) = size; + Py_SET_SIZE(new, size); new->ob_alloc = alloc; new->ob_start = new->ob_bytes; new->ob_exports = 0; @@ -207,7 +204,7 @@ PyByteArray_Resize(PyObject *self, Py_ssize_t requested_size) } else { /* Minor downsize; quick exit */ - Py_SIZE(self) = size; + Py_SET_SIZE(self, size); PyByteArray_AS_STRING(self)[size] = '\0'; /* Trailing null */ return 0; } @@ -247,7 +244,7 @@ PyByteArray_Resize(PyObject *self, Py_ssize_t requested_size) } obj->ob_bytes = obj->ob_start = sval; - Py_SIZE(self) = size; + Py_SET_SIZE(self, size); obj->ob_alloc = alloc; obj->ob_bytes[size] = '\0'; /* Trailing null byte */ @@ -384,8 +381,6 @@ bytearray_irepeat(PyByteArrayObject *self, Py_ssize_t count) static PyObject * bytearray_getitem(PyByteArrayObject *self, Py_ssize_t i) { - if (i < 0) - i += Py_SIZE(self); if (i < 0 || i >= Py_SIZE(self)) { PyErr_SetString(PyExc_IndexError, "bytearray index out of range"); return NULL; @@ -396,7 +391,7 @@ bytearray_getitem(PyByteArrayObject *self, Py_ssize_t i) static PyObject * bytearray_subscript(PyByteArrayObject *self, PyObject *index) { - if (PyIndex_Check(index)) { + if (_PyIndex_Check(index)) { Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) @@ -503,7 +498,7 @@ bytearray_setslice_linear(PyByteArrayObject *self, } /* memmove() removed bytes, the bytearray object cannot be restored in its previous state. */ - Py_SIZE(self) += growth; + Py_SET_SIZE(self, Py_SIZE(self) + growth); res = -1; } buf = PyByteArray_AS_STRING(self); @@ -615,7 +610,7 @@ bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *valu char *buf, *bytes; buf = PyByteArray_AS_STRING(self); - if (PyIndex_Check(index)) { + if (_PyIndex_Check(index)) { Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) @@ -814,7 +809,7 @@ bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds) } /* Is it an int? */ - if (PyIndex_Check(arg)) { + if (_PyIndex_Check(arg)) { count = PyNumber_AsSsize_t(arg, PyExc_OverflowError); if (count == -1 && PyErr_Occurred()) { if (!PyErr_ExceptionMatches(PyExc_TypeError)) @@ -861,7 +856,7 @@ bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds) if (PyErr_ExceptionMatches(PyExc_TypeError)) { PyErr_Format(PyExc_TypeError, "cannot convert '%.200s' object to bytearray", - arg->ob_type->tp_name); + Py_TYPE(arg)->tp_name); } return -1; } @@ -891,7 +886,7 @@ bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds) /* Append the byte */ if (Py_SIZE(self) + 1 < self->ob_alloc) { - Py_SIZE(self)++; + Py_SET_SIZE(self, Py_SIZE(self) + 1); PyByteArray_AS_STRING(self)[Py_SIZE(self)] = '\0'; } else if (PyByteArray_Resize((PyObject *)self, Py_SIZE(self)+1) < 0) @@ -1001,8 +996,7 @@ bytearray_repr(PyByteArrayObject *self) static PyObject * bytearray_str(PyObject *op) { - PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; - if (config->bytes_warning) { + if (_Py_GetConfig()->bytes_warning) { if (PyErr_WarnEx(PyExc_BytesWarning, "str() on a bytearray instance", 1)) { return NULL; @@ -1027,8 +1021,7 @@ bytearray_richcompare(PyObject *self, PyObject *other, int op) if (rc < 0) return NULL; if (rc) { - PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; - if (config->bytes_warning && (op == Py_EQ || op == Py_NE)) { + if (_Py_GetConfig()->bytes_warning && (op == Py_EQ || op == Py_NE)) { if (PyErr_WarnEx(PyExc_BytesWarning, "Comparison between bytearray and string", 1)) return NULL; @@ -1190,6 +1183,71 @@ bytearray_endswith(PyByteArrayObject *self, PyObject *args) return _Py_bytes_endswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args); } +/*[clinic input] +bytearray.removeprefix as bytearray_removeprefix + + prefix: Py_buffer + / + +Return a bytearray with the given prefix string removed if present. + +If the bytearray starts with the prefix string, return +bytearray[len(prefix):]. Otherwise, return a copy of the original +bytearray. +[clinic start generated code]*/ + +static PyObject * +bytearray_removeprefix_impl(PyByteArrayObject *self, Py_buffer *prefix) +/*[clinic end generated code: output=6cabc585e7f502e0 input=968aada38aedd262]*/ +{ + const char *self_start = PyByteArray_AS_STRING(self); + Py_ssize_t self_len = PyByteArray_GET_SIZE(self); + const char *prefix_start = prefix->buf; + Py_ssize_t prefix_len = prefix->len; + + if (self_len >= prefix_len + && memcmp(self_start, prefix_start, prefix_len) == 0) + { + return PyByteArray_FromStringAndSize(self_start + prefix_len, + self_len - prefix_len); + } + + return PyByteArray_FromStringAndSize(self_start, self_len); +} + +/*[clinic input] +bytearray.removesuffix as bytearray_removesuffix + + suffix: Py_buffer + / + +Return a bytearray with the given suffix string removed if present. + +If the bytearray ends with the suffix string and that suffix is not +empty, return bytearray[:-len(suffix)]. Otherwise, return a copy of +the original bytearray. +[clinic start generated code]*/ + +static PyObject * +bytearray_removesuffix_impl(PyByteArrayObject *self, Py_buffer *suffix) +/*[clinic end generated code: output=2bc8cfb79de793d3 input=c1827e810b2f6b99]*/ +{ + const char *self_start = PyByteArray_AS_STRING(self); + Py_ssize_t self_len = PyByteArray_GET_SIZE(self); + const char *suffix_start = suffix->buf; + Py_ssize_t suffix_len = suffix->len; + + if (self_len >= suffix_len + && memcmp(self_start + self_len - suffix_len, + suffix_start, suffix_len) == 0) + { + return PyByteArray_FromStringAndSize(self_start, + self_len - suffix_len); + } + + return PyByteArray_FromStringAndSize(self_start, self_len); +} + /*[clinic input] bytearray.translate @@ -1635,7 +1693,7 @@ bytearray_extend(PyByteArrayObject *self, PyObject *iterable_of_ints) if (PyErr_ExceptionMatches(PyExc_TypeError)) { PyErr_Format(PyExc_TypeError, "can't extend bytearray with %.100s", - iterable_of_ints->ob_type->tp_name); + Py_TYPE(iterable_of_ints)->tp_name); } return NULL; } @@ -2020,8 +2078,7 @@ bytearray_fromhex_impl(PyTypeObject *type, PyObject *string) { PyObject *result = _PyBytes_FromHex(string, type == &PyByteArray_Type); if (type != &PyByteArray_Type && result != NULL) { - Py_SETREF(result, PyObject_CallFunctionObjArgs((PyObject *)type, - result, NULL)); + Py_SETREF(result, PyObject_CallOneArg((PyObject *)type, result)); } return result; } @@ -2213,6 +2270,8 @@ bytearray_methods[] = { BYTEARRAY_POP_METHODDEF BYTEARRAY_REMOVE_METHODDEF BYTEARRAY_REPLACE_METHODDEF + BYTEARRAY_REMOVEPREFIX_METHODDEF + BYTEARRAY_REMOVESUFFIX_METHODDEF BYTEARRAY_REVERSE_METHODDEF {"rfind", (PyCFunction)bytearray_rfind, METH_VARARGS, _Py_rfind__doc__}, {"rindex", (PyCFunction)bytearray_rindex, METH_VARARGS, _Py_rindex__doc__}, diff --git a/Objects/bytes_methods.c b/Objects/bytes_methods.c index db030be4fe7561600e8c968759e073981bc8d776..72daa1fdd554e0b26d4723075be4b92d013c0d65 100644 --- a/Objects/bytes_methods.c +++ b/Objects/bytes_methods.c @@ -1,6 +1,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "bytes_methods.h" +#include "pycore_abstract.h" // _PyIndex_Check() +#include "pycore_bytes_methods.h" PyDoc_STRVAR_shared(_Py_isspace__doc__, "B.isspace() -> bool\n\ @@ -466,7 +467,7 @@ parse_args_finds_byte(const char *function_name, PyObject *args, return 1; } - if (!PyIndex_Check(tmp_subobj)) { + if (!_PyIndex_Check(tmp_subobj)) { PyErr_Format(PyExc_TypeError, "argument should be integer or bytes-like object, " "not '%.200s'", diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index feeabcb8b4c7ad330947ca46a50b955ba8d8236f..25d9814dd6d8b52183a668970752a44b16d09c5b 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -3,11 +3,11 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" +#include "pycore_abstract.h" // _PyIndex_Check() +#include "pycore_bytes_methods.h" #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" +#include "pycore_pymem.h" // PYMEM_CLEANBYTE -#include "bytes_methods.h" #include "pystrhex.h" #include @@ -18,13 +18,11 @@ class bytes "PyBytesObject *" "&PyBytes_Type" #include "clinic/bytesobject.c.h" -#ifdef COUNT_ALLOCS -Py_ssize_t _Py_null_strings, _Py_one_strings; -#endif - static PyBytesObject *characters[UCHAR_MAX + 1]; static PyBytesObject *nullstring; +_Py_IDENTIFIER(__bytes__); + /* PyBytesObject_SIZE gives the basic size of a string; any memory allocation for a string of length n should request PyBytesObject_SIZE + n bytes. @@ -66,9 +64,6 @@ _PyBytes_FromSize(Py_ssize_t size, int use_calloc) assert(size >= 0); if (size == 0 && (op = nullstring) != NULL) { -#ifdef COUNT_ALLOCS - _Py_null_strings++; -#endif Py_INCREF(op); return (PyObject *)op; } @@ -110,9 +105,6 @@ PyBytes_FromStringAndSize(const char *str, Py_ssize_t size) if (size == 1 && str != NULL && (op = characters[*str & UCHAR_MAX]) != NULL) { -#ifdef COUNT_ALLOCS - _Py_one_strings++; -#endif Py_INCREF(op); return (PyObject *)op; } @@ -146,16 +138,10 @@ PyBytes_FromString(const char *str) return NULL; } if (size == 0 && (op = nullstring) != NULL) { -#ifdef COUNT_ALLOCS - _Py_null_strings++; -#endif Py_INCREF(op); return (PyObject *)op; } if (size == 1 && (op = characters[*str & UCHAR_MAX]) != NULL) { -#ifdef COUNT_ALLOCS - _Py_one_strings++; -#endif Py_INCREF(op); return (PyObject *)op; } @@ -543,7 +529,6 @@ static PyObject * format_obj(PyObject *v, const char **pbuf, Py_ssize_t *plen) { PyObject *func, *result; - _Py_IDENTIFIER(__bytes__); /* is it a bytes object? */ if (PyBytes_Check(v)) { *pbuf = PyBytes_AS_STRING(v); @@ -1074,52 +1059,10 @@ _PyBytes_FormatEx(const char *format, Py_ssize_t format_len, return NULL; } -/* Unescape a backslash-escaped string. If unicode is non-zero, - the string is a u-literal. If recode_encoding is non-zero, - the string is UTF-8 encoded and should be re-encoded in the - specified encoding. */ - -static char * -_PyBytes_DecodeEscapeRecode(const char **s, const char *end, - const char *errors, const char *recode_encoding, - _PyBytesWriter *writer, char *p) -{ - PyObject *u, *w; - const char* t; - - t = *s; - /* Decode non-ASCII bytes as UTF-8. */ - while (t < end && (*t & 0x80)) - t++; - u = PyUnicode_DecodeUTF8(*s, t - *s, errors); - if (u == NULL) - return NULL; - - /* Recode them in target encoding. */ - w = PyUnicode_AsEncodedString(u, recode_encoding, errors); - Py_DECREF(u); - if (w == NULL) - return NULL; - assert(PyBytes_Check(w)); - - /* Append bytes to output buffer. */ - writer->min_size--; /* subtract 1 preallocated byte */ - p = _PyBytesWriter_WriteBytes(writer, p, - PyBytes_AS_STRING(w), - PyBytes_GET_SIZE(w)); - Py_DECREF(w); - if (p == NULL) - return NULL; - - *s = t; - return p; -} - +/* Unescape a backslash-escaped string. */ PyObject *_PyBytes_DecodeEscape(const char *s, Py_ssize_t len, const char *errors, - Py_ssize_t unicode, - const char *recode_encoding, const char **first_invalid_escape) { int c; @@ -1139,18 +1082,7 @@ PyObject *_PyBytes_DecodeEscape(const char *s, end = s + len; while (s < end) { if (*s != '\\') { - non_esc: - if (!(recode_encoding && (*s & 0x80))) { - *p++ = *s++; - } - else { - /* non-ASCII character and need to recode */ - p = _PyBytes_DecodeEscapeRecode(&s, end, - errors, recode_encoding, - &writer, p); - if (p == NULL) - goto failed; - } + *p++ = *s++; continue; } @@ -1226,8 +1158,6 @@ PyObject *_PyBytes_DecodeEscape(const char *s, } *p++ = '\\'; s--; - goto non_esc; /* an arbitrary number of unescaped - UTF-8 bytes may follow. */ } } @@ -1241,12 +1171,11 @@ PyObject *_PyBytes_DecodeEscape(const char *s, PyObject *PyBytes_DecodeEscape(const char *s, Py_ssize_t len, const char *errors, - Py_ssize_t unicode, - const char *recode_encoding) + Py_ssize_t Py_UNUSED(unicode), + const char *Py_UNUSED(recode_encoding)) { const char* first_invalid_escape; - PyObject *result = _PyBytes_DecodeEscape(s, len, errors, unicode, - recode_encoding, + PyObject *result = _PyBytes_DecodeEscape(s, len, errors, &first_invalid_escape); if (result == NULL) return NULL; @@ -1335,12 +1264,14 @@ PyBytes_Repr(PyObject *obj, int smartquotes) Py_ssize_t i, length = Py_SIZE(op); Py_ssize_t newsize, squotes, dquotes; PyObject *v; - unsigned char quote, *s, *p; + unsigned char quote; + const unsigned char *s; + Py_UCS1 *p; /* Compute size of output string */ squotes = dquotes = 0; newsize = 3; /* b'' */ - s = (unsigned char*)op->ob_sval; + s = (const unsigned char*)op->ob_sval; for (i = 0; i < length; i++) { Py_ssize_t incr = 1; switch(s[i]) { @@ -1410,8 +1341,7 @@ bytes_repr(PyObject *op) static PyObject * bytes_str(PyObject *op) { - PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; - if (config->bytes_warning) { + if (_Py_GetConfig()->bytes_warning) { if (PyErr_WarnEx(PyExc_BytesWarning, "str() on a bytes instance", 1)) { return NULL; @@ -1568,8 +1498,7 @@ bytes_richcompare(PyBytesObject *a, PyBytesObject *b, int op) /* Make sure both arguments are strings. */ if (!(PyBytes_Check(a) && PyBytes_Check(b))) { - PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; - if (config->bytes_warning && (op == Py_EQ || op == Py_NE)) { + if (_Py_GetConfig()->bytes_warning && (op == Py_EQ || op == Py_NE)) { rc = PyObject_IsInstance((PyObject*)a, (PyObject*)&PyUnicode_Type); if (!rc) @@ -1650,7 +1579,7 @@ bytes_hash(PyBytesObject *a) static PyObject* bytes_subscript(PyBytesObject* self, PyObject* item) { - if (PyIndex_Check(item)) { + if (_PyIndex_Check(item)) { Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) return NULL; @@ -1666,7 +1595,7 @@ bytes_subscript(PyBytesObject* self, PyObject* item) else if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelength, i; size_t cur; - char* source_buf; + const char* source_buf; char* result_buf; PyObject* result; @@ -1931,7 +1860,7 @@ Py_LOCAL_INLINE(PyObject *) do_xstrip(PyBytesObject *self, int striptype, PyObject *sepobj) { Py_buffer vsep; - char *s = PyBytes_AS_STRING(self); + const char *s = PyBytes_AS_STRING(self); Py_ssize_t len = PyBytes_GET_SIZE(self); char *sep; Py_ssize_t seplen; @@ -1971,7 +1900,7 @@ do_xstrip(PyBytesObject *self, int striptype, PyObject *sepobj) Py_LOCAL_INLINE(PyObject *) do_strip(PyBytesObject *self, int striptype) { - char *s = PyBytes_AS_STRING(self); + const char *s = PyBytes_AS_STRING(self); Py_ssize_t len = PyBytes_GET_SIZE(self), i, j; i = 0; @@ -2088,7 +2017,8 @@ bytes_translate_impl(PyBytesObject *self, PyObject *table, PyObject *deletechars) /*[clinic end generated code: output=43be3437f1956211 input=0ecdf159f654233c]*/ { - char *input, *output; + const char *input; + char *output; Py_buffer table_view = {NULL, NULL}; Py_buffer del_table_view = {NULL, NULL}; const char *table_chars; @@ -2252,6 +2182,81 @@ bytes_replace_impl(PyBytesObject *self, Py_buffer *old, Py_buffer *new, /** End DALKE **/ +/*[clinic input] +bytes.removeprefix as bytes_removeprefix + + prefix: Py_buffer + / + +Return a bytes object with the given prefix string removed if present. + +If the bytes starts with the prefix string, return bytes[len(prefix):]. +Otherwise, return a copy of the original bytes. +[clinic start generated code]*/ + +static PyObject * +bytes_removeprefix_impl(PyBytesObject *self, Py_buffer *prefix) +/*[clinic end generated code: output=f006865331a06ab6 input=0c93bac817a8502c]*/ +{ + const char *self_start = PyBytes_AS_STRING(self); + Py_ssize_t self_len = PyBytes_GET_SIZE(self); + const char *prefix_start = prefix->buf; + Py_ssize_t prefix_len = prefix->len; + + if (self_len >= prefix_len + && prefix_len > 0 + && memcmp(self_start, prefix_start, prefix_len) == 0) + { + return PyBytes_FromStringAndSize(self_start + prefix_len, + self_len - prefix_len); + } + + if (PyBytes_CheckExact(self)) { + Py_INCREF(self); + return (PyObject *)self; + } + + return PyBytes_FromStringAndSize(self_start, self_len); +} + +/*[clinic input] +bytes.removesuffix as bytes_removesuffix + + suffix: Py_buffer + / + +Return a bytes object with the given suffix string removed if present. + +If the bytes ends with the suffix string and that suffix is not empty, +return bytes[:-len(prefix)]. Otherwise, return a copy of the original +bytes. +[clinic start generated code]*/ + +static PyObject * +bytes_removesuffix_impl(PyBytesObject *self, Py_buffer *suffix) +/*[clinic end generated code: output=d887d308e3242eeb input=9f4e1da8c637bbf1]*/ +{ + const char *self_start = PyBytes_AS_STRING(self); + Py_ssize_t self_len = PyBytes_GET_SIZE(self); + const char *suffix_start = suffix->buf; + Py_ssize_t suffix_len = suffix->len; + + if (self_len >= suffix_len + && suffix_len > 0 + && memcmp(self_start + self_len - suffix_len, + suffix_start, suffix_len) == 0) + { + return PyBytes_FromStringAndSize(self_start, + self_len - suffix_len); + } + + if (PyBytes_CheckExact(self)) { + Py_INCREF(self); + return (PyObject *)self; + } + + return PyBytes_FromStringAndSize(self_start, self_len); +} static PyObject * bytes_startswith(PyBytesObject *self, PyObject *args) @@ -2330,8 +2335,7 @@ bytes_fromhex_impl(PyTypeObject *type, PyObject *string) { PyObject *result = _PyBytes_FromHex(string, 0); if (type != &PyBytes_Type && result != NULL) { - Py_SETREF(result, PyObject_CallFunctionObjArgs((PyObject *)type, - result, NULL)); + Py_SETREF(result, PyObject_CallOneArg((PyObject *)type, result)); } return result; } @@ -2342,7 +2346,7 @@ _PyBytes_FromHex(PyObject *string, int use_bytearray) char *buf; Py_ssize_t hexlen, invalid_char; unsigned int top, bot; - Py_UCS1 *str, *end; + const Py_UCS1 *str, *end; _PyBytesWriter writer; _PyBytesWriter_Init(&writer); @@ -2354,7 +2358,7 @@ _PyBytes_FromHex(PyObject *string, int use_bytearray) hexlen = PyUnicode_GET_LENGTH(string); if (!PyUnicode_IS_ASCII(string)) { - void *data = PyUnicode_DATA(string); + const void *data = PyUnicode_DATA(string); unsigned int kind = PyUnicode_KIND(string); Py_ssize_t i; @@ -2440,7 +2444,7 @@ static PyObject * bytes_hex_impl(PyBytesObject *self, PyObject *sep, int bytes_per_sep) /*[clinic end generated code: output=1f134da504064139 input=f1238d3455990218]*/ { - char* argbuf = PyBytes_AS_STRING(self); + const char *argbuf = PyBytes_AS_STRING(self); Py_ssize_t arglen = PyBytes_GET_SIZE(self); return _Py_strhex_with_sep(argbuf, arglen, sep, bytes_per_sep); } @@ -2492,6 +2496,8 @@ bytes_methods[] = { BYTES_MAKETRANS_METHODDEF BYTES_PARTITION_METHODDEF BYTES_REPLACE_METHODDEF + BYTES_REMOVEPREFIX_METHODDEF + BYTES_REMOVESUFFIX_METHODDEF {"rfind", (PyCFunction)bytes_rfind, METH_VARARGS, _Py_rfind__doc__}, {"rindex", (PyCFunction)bytes_rindex, METH_VARARGS, _Py_rindex__doc__}, STRINGLIB_RJUST_METHODDEF @@ -2542,7 +2548,6 @@ bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwds) PyObject *func; Py_ssize_t size; static char *kwlist[] = {"source", "encoding", "errors", 0}; - _Py_IDENTIFIER(__bytes__); if (type != &PyBytes_Type) return bytes_subtype_new(type, args, kwds); @@ -2609,7 +2614,7 @@ bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; } /* Is it an integer? */ - if (PyIndex_Check(x)) { + if (_PyIndex_Check(x)) { size = PyNumber_AsSsize_t(x, PyExc_OverflowError); if (size == -1 && PyErr_Occurred()) { if (!PyErr_ExceptionMatches(PyExc_TypeError)) @@ -2835,7 +2840,7 @@ PyBytes_FromObject(PyObject *x) PyErr_Format(PyExc_TypeError, "cannot convert '%.200s' object to bytes", - x->ob_type->tp_name); + Py_TYPE(x)->tp_name); return NULL; } @@ -3021,8 +3026,12 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize) return (*pv == NULL) ? -1 : 0; } /* XXX UNREF/NEWREF interface should be more symmetrical */ - _Py_DEC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal--; +#endif +#ifdef Py_TRACE_REFS _Py_ForgetReference(v); +#endif *pv = (PyObject *) PyObject_REALLOC(v, PyBytesObject_SIZE + newsize); if (*pv == NULL) { @@ -3032,7 +3041,7 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize) } _Py_NewReference(*pv); sv = (PyBytesObject *) *pv; - Py_SIZE(sv) = newsize; + Py_SET_SIZE(sv, newsize); sv->ob_sval[newsize] = '\0'; sv->ob_shash = -1; /* invalidate cached hash value */ return 0; @@ -3044,7 +3053,7 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize) } void -PyBytes_Fini(void) +_PyBytes_Fini(void) { int i; for (i = 0; i < UCHAR_MAX + 1; i++) @@ -3254,7 +3263,7 @@ _PyBytesWriter_AsString(_PyBytesWriter *writer) Py_LOCAL_INLINE(Py_ssize_t) _PyBytesWriter_GetSize(_PyBytesWriter *writer, char *str) { - char *start = _PyBytesWriter_AsString(writer); + const char *start = _PyBytesWriter_AsString(writer); assert(str != NULL); assert(str >= start); assert(str - start <= writer->allocated); @@ -3265,7 +3274,7 @@ _PyBytesWriter_GetSize(_PyBytesWriter *writer, char *str) Py_LOCAL_INLINE(int) _PyBytesWriter_CheckConsistency(_PyBytesWriter *writer, char *str) { - char *start, *end; + const char *start, *end; if (writer->use_small_buffer) { assert(writer->buffer == NULL); diff --git a/Objects/call.c b/Objects/call.c index c66389854d8bf015c87fa65c5df64733ae7a3aa7..87dc0dbbdb504a86b882678074a0534e0fce348a 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -1,64 +1,75 @@ #include "Python.h" +#include "pycore_call.h" +#include "pycore_ceval.h" // _PyEval_EvalFrame() #include "pycore_object.h" -#include "pycore_pystate.h" +#include "pycore_pyerrors.h" +#include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_tupleobject.h" #include "frameobject.h" -static PyObject * -cfunction_call_varargs(PyObject *func, PyObject *args, PyObject *kwargs); +static PyObject *const * +_PyStack_UnpackDict(PyThreadState *tstate, + PyObject *const *args, Py_ssize_t nargs, + PyObject *kwargs, PyObject **p_kwnames); + +static void +_PyStack_UnpackDict_Free(PyObject *const *stack, Py_ssize_t nargs, + PyObject *kwnames); static PyObject * -null_error(void) +null_error(PyThreadState *tstate) { - if (!PyErr_Occurred()) - PyErr_SetString(PyExc_SystemError, - "null argument to internal routine"); + if (!_PyErr_Occurred(tstate)) { + _PyErr_SetString(tstate, PyExc_SystemError, + "null argument to internal routine"); + } return NULL; } PyObject* -_Py_CheckFunctionResult(PyObject *callable, PyObject *result, const char *where) +_Py_CheckFunctionResult(PyThreadState *tstate, PyObject *callable, + PyObject *result, const char *where) { - int err_occurred = (PyErr_Occurred() != NULL); - assert((callable != NULL) ^ (where != NULL)); if (result == NULL) { - if (!err_occurred) { + if (!_PyErr_Occurred(tstate)) { if (callable) - PyErr_Format(PyExc_SystemError, - "%R returned NULL without setting an error", - callable); + _PyErr_Format(tstate, PyExc_SystemError, + "%R returned NULL without setting an error", + callable); else - PyErr_Format(PyExc_SystemError, - "%s returned NULL without setting an error", - where); + _PyErr_Format(tstate, PyExc_SystemError, + "%s returned NULL without setting an error", + where); #ifdef Py_DEBUG - /* Ensure that the bug is caught in debug mode */ + /* Ensure that the bug is caught in debug mode. + Py_FatalError() logs the SystemError exception raised above. */ Py_FatalError("a function returned NULL without setting an error"); #endif return NULL; } } else { - if (err_occurred) { + if (_PyErr_Occurred(tstate)) { Py_DECREF(result); if (callable) { - _PyErr_FormatFromCause(PyExc_SystemError, - "%R returned a result with an error set", - callable); + _PyErr_FormatFromCauseTstate( + tstate, PyExc_SystemError, + "%R returned a result with an error set", callable); } else { - _PyErr_FormatFromCause(PyExc_SystemError, - "%s returned a result with an error set", - where); + _PyErr_FormatFromCauseTstate( + tstate, PyExc_SystemError, + "%s returned a result with an error set", where); } #ifdef Py_DEBUG - /* Ensure that the bug is caught in debug mode */ + /* Ensure that the bug is caught in debug mode. + Py_FatalError() logs the SystemError exception raised above. */ Py_FatalError("a function returned a result with an error set"); #endif return NULL; @@ -70,66 +81,87 @@ _Py_CheckFunctionResult(PyObject *callable, PyObject *result, const char *where) /* --- Core PyObject call functions ------------------------------- */ +/* Call a callable Python object without any arguments */ PyObject * -_PyObject_FastCallDict(PyObject *callable, PyObject *const *args, - size_t nargsf, PyObject *kwargs) +PyObject_CallNoArgs(PyObject *func) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return _PyObject_CallNoArgTstate(tstate, func); +} + + +PyObject * +_PyObject_FastCallDictTstate(PyThreadState *tstate, PyObject *callable, + PyObject *const *args, size_t nargsf, + PyObject *kwargs) { - /* _PyObject_FastCallDict() must not be called with an exception set, + assert(callable != NULL); + + /* PyObject_VectorcallDict() must not be called with an exception set, because it can clear it (directly or indirectly) and so the caller loses its exception */ - assert(!PyErr_Occurred()); - assert(callable != NULL); + assert(!_PyErr_Occurred(tstate)); Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); assert(nargs >= 0); assert(nargs == 0 || args != NULL); assert(kwargs == NULL || PyDict_Check(kwargs)); - vectorcallfunc func = _PyVectorcall_Function(callable); + vectorcallfunc func = PyVectorcall_Function(callable); if (func == NULL) { /* Use tp_call instead */ - return _PyObject_MakeTpCall(callable, args, nargs, kwargs); + return _PyObject_MakeTpCall(tstate, callable, args, nargs, kwargs); } PyObject *res; - if (kwargs == NULL) { + if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) { res = func(callable, args, nargsf, NULL); } else { PyObject *kwnames; PyObject *const *newargs; - if (_PyStack_UnpackDict(args, nargs, kwargs, &newargs, &kwnames) < 0) { + newargs = _PyStack_UnpackDict(tstate, + args, nargs, + kwargs, &kwnames); + if (newargs == NULL) { return NULL; } - res = func(callable, newargs, nargs, kwnames); - if (kwnames != NULL) { - Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames) + nargs; - for (i = 0; i < n; i++) { - Py_DECREF(newargs[i]); - } - PyMem_Free((PyObject **)newargs); - Py_DECREF(kwnames); - } + res = func(callable, newargs, + nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames); + _PyStack_UnpackDict_Free(newargs, nargs, kwnames); } - return _Py_CheckFunctionResult(callable, res, NULL); + return _Py_CheckFunctionResult(tstate, callable, res, NULL); +} + + +PyObject * +PyObject_VectorcallDict(PyObject *callable, PyObject *const *args, + size_t nargsf, PyObject *kwargs) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return _PyObject_FastCallDictTstate(tstate, callable, args, nargsf, kwargs); } PyObject * -_PyObject_MakeTpCall(PyObject *callable, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords) +_PyObject_MakeTpCall(PyThreadState *tstate, PyObject *callable, + PyObject *const *args, Py_ssize_t nargs, + PyObject *keywords) { + assert(nargs >= 0); + assert(nargs == 0 || args != NULL); + assert(keywords == NULL || PyTuple_Check(keywords) || PyDict_Check(keywords)); + /* Slow path: build a temporary tuple for positional arguments and a * temporary dictionary for keyword arguments (if any) */ ternaryfunc call = Py_TYPE(callable)->tp_call; if (call == NULL) { - PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable", - Py_TYPE(callable)->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "'%.200s' object is not callable", + Py_TYPE(callable)->tp_name); return NULL; } - assert(nargs >= 0); - assert(nargs == 0 || args != NULL); - assert(keywords == NULL || PyTuple_Check(keywords) || PyDict_Check(keywords)); PyObject *argstuple = _PyTuple_FromArray(args, nargs); if (argstuple == NULL) { return NULL; @@ -154,10 +186,10 @@ _PyObject_MakeTpCall(PyObject *callable, PyObject *const *args, Py_ssize_t nargs } PyObject *result = NULL; - if (Py_EnterRecursiveCall(" while calling a Python object") == 0) + if (_Py_EnterRecursiveCall(tstate, " while calling a Python object") == 0) { result = call(callable, argstuple, kwdict); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); } Py_DECREF(argstuple); @@ -165,53 +197,60 @@ _PyObject_MakeTpCall(PyObject *callable, PyObject *const *args, Py_ssize_t nargs Py_DECREF(kwdict); } - result = _Py_CheckFunctionResult(callable, result, NULL); - return result; + return _Py_CheckFunctionResult(tstate, callable, result, NULL); } PyObject * PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *kwargs) { - /* get vectorcallfunc as in _PyVectorcall_Function, but without - * the _Py_TPFLAGS_HAVE_VECTORCALL check */ + PyThreadState *tstate = _PyThreadState_GET(); + vectorcallfunc func; + + /* get vectorcallfunc as in PyVectorcall_Function, but without + * the Py_TPFLAGS_HAVE_VECTORCALL check */ Py_ssize_t offset = Py_TYPE(callable)->tp_vectorcall_offset; if (offset <= 0) { - PyErr_Format(PyExc_TypeError, "'%.200s' object does not support vectorcall", - Py_TYPE(callable)->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "'%.200s' object does not support vectorcall", + Py_TYPE(callable)->tp_name); return NULL; } - vectorcallfunc func = *(vectorcallfunc *)(((char *)callable) + offset); + memcpy(&func, (char *) callable + offset, sizeof(func)); if (func == NULL) { - PyErr_Format(PyExc_TypeError, "'%.200s' object does not support vectorcall", - Py_TYPE(callable)->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "'%.200s' object does not support vectorcall", + Py_TYPE(callable)->tp_name); return NULL; } + Py_ssize_t nargs = PyTuple_GET_SIZE(tuple); + + /* Fast path for no keywords */ + if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) { + return func(callable, _PyTuple_ITEMS(tuple), nargs, NULL); + } + /* Convert arguments & call */ PyObject *const *args; - Py_ssize_t nargs = PyTuple_GET_SIZE(tuple); PyObject *kwnames; - if (_PyStack_UnpackDict(_PyTuple_ITEMS(tuple), nargs, - kwargs, &args, &kwnames) < 0) { + args = _PyStack_UnpackDict(tstate, + _PyTuple_ITEMS(tuple), nargs, + kwargs, &kwnames); + if (args == NULL) { return NULL; } - PyObject *result = func(callable, args, nargs, kwnames); - if (kwnames != NULL) { - Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames) + nargs; - for (i = 0; i < n; i++) { - Py_DECREF(args[i]); - } - PyMem_Free((PyObject **)args); - Py_DECREF(kwnames); - } + PyObject *result = func(callable, args, + nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames); + _PyStack_UnpackDict_Free(args, nargs, kwnames); - return _Py_CheckFunctionResult(callable, result, NULL); + return _Py_CheckFunctionResult(tstate, callable, result, NULL); } PyObject * -PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs) +_PyObject_Call(PyThreadState *tstate, PyObject *callable, + PyObject *args, PyObject *kwargs) { ternaryfunc call; PyObject *result; @@ -219,68 +258,76 @@ PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs) /* PyObject_Call() must not be called with an exception set, because it can clear it (directly or indirectly) and so the caller loses its exception */ - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); assert(PyTuple_Check(args)); assert(kwargs == NULL || PyDict_Check(kwargs)); - if (_PyVectorcall_Function(callable) != NULL) { + if (PyVectorcall_Function(callable) != NULL) { return PyVectorcall_Call(callable, args, kwargs); } - else if (PyCFunction_Check(callable)) { - /* This must be a METH_VARARGS function, otherwise we would be - * in the previous case */ - return cfunction_call_varargs(callable, args, kwargs); - } else { - call = callable->ob_type->tp_call; + call = Py_TYPE(callable)->tp_call; if (call == NULL) { - PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable", - callable->ob_type->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "'%.200s' object is not callable", + Py_TYPE(callable)->tp_name); return NULL; } - if (Py_EnterRecursiveCall(" while calling a Python object")) + if (_Py_EnterRecursiveCall(tstate, " while calling a Python object")) { return NULL; + } result = (*call)(callable, args, kwargs); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); - return _Py_CheckFunctionResult(callable, result, NULL); + return _Py_CheckFunctionResult(tstate, callable, result, NULL); } } +PyObject * +PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return _PyObject_Call(tstate, callable, args, kwargs); +} + + +PyObject * +PyCFunction_Call(PyObject *callable, PyObject *args, PyObject *kwargs) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return _PyObject_Call(tstate, callable, args, kwargs); +} + /* --- PyFunction call functions ---------------------------------- */ static PyObject* _Py_HOT_FUNCTION -function_code_fastcall(PyCodeObject *co, PyObject *const *args, Py_ssize_t nargs, +function_code_fastcall(PyThreadState *tstate, PyCodeObject *co, + PyObject *const *args, Py_ssize_t nargs, PyObject *globals) { - PyFrameObject *f; - PyThreadState *tstate = _PyThreadState_GET(); - PyObject **fastlocals; - Py_ssize_t i; - PyObject *result; - + assert(tstate != NULL); assert(globals != NULL); + /* XXX Perhaps we should create a specialized _PyFrame_New_NoTrack() that doesn't take locals, but does take builtins without sanity checking them. */ - assert(tstate != NULL); - f = _PyFrame_New_NoTrack(tstate, co, globals, NULL); + PyFrameObject *f = _PyFrame_New_NoTrack(tstate, co, globals, NULL); if (f == NULL) { return NULL; } - fastlocals = f->f_localsplus; + PyObject **fastlocals = f->f_localsplus; - for (i = 0; i < nargs; i++) { + for (Py_ssize_t i = 0; i < nargs; i++) { Py_INCREF(*args); fastlocals[i] = *args++; } - result = PyEval_EvalFrameEx(f,0); + PyObject *result = _PyEval_EvalFrame(tstate, f, 0); if (Py_REFCNT(f) > 1) { Py_DECREF(f); @@ -295,483 +342,65 @@ function_code_fastcall(PyCodeObject *co, PyObject *const *args, Py_ssize_t nargs } -PyObject * -_PyFunction_FastCallDict(PyObject *func, PyObject *const *args, Py_ssize_t nargs, - PyObject *kwargs) -{ - PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); - PyObject *globals = PyFunction_GET_GLOBALS(func); - PyObject *argdefs = PyFunction_GET_DEFAULTS(func); - PyObject *kwdefs, *closure, *name, *qualname; - PyObject *kwtuple, **k; - PyObject **d; - Py_ssize_t nd, nk; - PyObject *result; - - assert(func != NULL); - assert(nargs >= 0); - assert(nargs == 0 || args != NULL); - assert(kwargs == NULL || PyDict_Check(kwargs)); - - if (co->co_kwonlyargcount == 0 && - (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) && - (co->co_flags & ~PyCF_MASK) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) - { - /* Fast paths */ - if (argdefs == NULL && co->co_argcount == nargs) { - return function_code_fastcall(co, args, nargs, globals); - } - else if (nargs == 0 && argdefs != NULL - && co->co_argcount == PyTuple_GET_SIZE(argdefs)) { - /* function called with no arguments, but all parameters have - a default value: use default values as arguments .*/ - args = _PyTuple_ITEMS(argdefs); - return function_code_fastcall(co, args, PyTuple_GET_SIZE(argdefs), - globals); - } - } - - nk = (kwargs != NULL) ? PyDict_GET_SIZE(kwargs) : 0; - if (nk != 0) { - Py_ssize_t pos, i; - - /* bpo-29318, bpo-27840: Caller and callee functions must not share - the dictionary: kwargs must be copied. */ - kwtuple = PyTuple_New(2 * nk); - if (kwtuple == NULL) { - return NULL; - } - - k = _PyTuple_ITEMS(kwtuple); - pos = i = 0; - while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { - /* We must hold strong references because keyword arguments can be - indirectly modified while the function is called: - see issue #2016 and test_extcall */ - Py_INCREF(k[i]); - Py_INCREF(k[i+1]); - i += 2; - } - assert(i / 2 == nk); - } - else { - kwtuple = NULL; - k = NULL; - } - - kwdefs = PyFunction_GET_KW_DEFAULTS(func); - closure = PyFunction_GET_CLOSURE(func); - name = ((PyFunctionObject *)func) -> func_name; - qualname = ((PyFunctionObject *)func) -> func_qualname; - - if (argdefs != NULL) { - d = _PyTuple_ITEMS(argdefs); - nd = PyTuple_GET_SIZE(argdefs); - } - else { - d = NULL; - nd = 0; - } - - result = _PyEval_EvalCodeWithName((PyObject*)co, globals, (PyObject *)NULL, - args, nargs, - k, k != NULL ? k + 1 : NULL, nk, 2, - d, nd, kwdefs, - closure, name, qualname); - Py_XDECREF(kwtuple); - return result; -} - - PyObject * _PyFunction_Vectorcall(PyObject *func, PyObject* const* stack, size_t nargsf, PyObject *kwnames) { - PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); - PyObject *globals = PyFunction_GET_GLOBALS(func); - PyObject *argdefs = PyFunction_GET_DEFAULTS(func); - PyObject *kwdefs, *closure, *name, *qualname; - PyObject **d; - Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames); - Py_ssize_t nd; - assert(PyFunction_Check(func)); + assert(kwnames == NULL || PyTuple_CheckExact(kwnames)); + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); assert(nargs >= 0); - assert(kwnames == NULL || PyTuple_CheckExact(kwnames)); + Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames); assert((nargs == 0 && nkwargs == 0) || stack != NULL); - /* kwnames must only contains str strings, no subclass, and all keys must - be unique */ + /* kwnames must only contain strings and all keys must be unique */ + + PyThreadState *tstate = _PyThreadState_GET(); + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); if (co->co_kwonlyargcount == 0 && nkwargs == 0 && (co->co_flags & ~PyCF_MASK) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { if (argdefs == NULL && co->co_argcount == nargs) { - return function_code_fastcall(co, stack, nargs, globals); + return function_code_fastcall(tstate, co, stack, nargs, globals); } else if (nargs == 0 && argdefs != NULL && co->co_argcount == PyTuple_GET_SIZE(argdefs)) { /* function called with no arguments, but all parameters have a default value: use default values as arguments .*/ stack = _PyTuple_ITEMS(argdefs); - return function_code_fastcall(co, stack, PyTuple_GET_SIZE(argdefs), + return function_code_fastcall(tstate, co, + stack, PyTuple_GET_SIZE(argdefs), globals); } } - kwdefs = PyFunction_GET_KW_DEFAULTS(func); - closure = PyFunction_GET_CLOSURE(func); - name = ((PyFunctionObject *)func) -> func_name; - qualname = ((PyFunctionObject *)func) -> func_qualname; + PyObject *kwdefs = PyFunction_GET_KW_DEFAULTS(func); + PyObject *closure = PyFunction_GET_CLOSURE(func); + PyObject *name = ((PyFunctionObject *)func) -> func_name; + PyObject *qualname = ((PyFunctionObject *)func) -> func_qualname; + PyObject **d; + Py_ssize_t nd; if (argdefs != NULL) { d = _PyTuple_ITEMS(argdefs); nd = PyTuple_GET_SIZE(argdefs); + assert(nd <= INT_MAX); } else { d = NULL; nd = 0; } - return _PyEval_EvalCodeWithName((PyObject*)co, globals, (PyObject *)NULL, - stack, nargs, - nkwargs ? _PyTuple_ITEMS(kwnames) : NULL, - stack + nargs, - nkwargs, 1, - d, (int)nd, kwdefs, - closure, name, qualname); -} - - -/* --- PyCFunction call functions --------------------------------- */ - -PyObject * -_PyMethodDef_RawFastCallDict(PyMethodDef *method, PyObject *self, - PyObject *const *args, Py_ssize_t nargs, - PyObject *kwargs) -{ - /* _PyMethodDef_RawFastCallDict() must not be called with an exception set, - because it can clear it (directly or indirectly) and so the - caller loses its exception */ - assert(!PyErr_Occurred()); - - assert(method != NULL); - assert(nargs >= 0); - assert(nargs == 0 || args != NULL); - assert(kwargs == NULL || PyDict_Check(kwargs)); - - PyCFunction meth = method->ml_meth; - int flags = method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST); - PyObject *result = NULL; - - if (Py_EnterRecursiveCall(" while calling a Python object")) { - return NULL; - } - - switch (flags) - { - case METH_NOARGS: - if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) { - goto no_keyword_error; - } - - if (nargs != 0) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes no arguments (%zd given)", - method->ml_name, nargs); - goto exit; - } - - result = (*meth) (self, NULL); - break; - - case METH_O: - if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) { - goto no_keyword_error; - } - - if (nargs != 1) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes exactly one argument (%zd given)", - method->ml_name, nargs); - goto exit; - } - - result = (*meth) (self, args[0]); - break; - - case METH_VARARGS: - if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) { - goto no_keyword_error; - } - /* fall through */ - - case METH_VARARGS | METH_KEYWORDS: - { - /* Slow-path: create a temporary tuple for positional arguments */ - PyObject *argstuple = _PyTuple_FromArray(args, nargs); - if (argstuple == NULL) { - goto exit; - } - - if (flags & METH_KEYWORDS) { - result = (*(PyCFunctionWithKeywords)(void(*)(void))meth) (self, argstuple, kwargs); - } - else { - result = (*meth) (self, argstuple); - } - Py_DECREF(argstuple); - break; - } - - case METH_FASTCALL: - { - if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) { - goto no_keyword_error; - } - - result = (*(_PyCFunctionFast)(void(*)(void))meth) (self, args, nargs); - break; - } - - case METH_FASTCALL | METH_KEYWORDS: - { - PyObject *const *stack; - PyObject *kwnames; - _PyCFunctionFastWithKeywords fastmeth = (_PyCFunctionFastWithKeywords)(void(*)(void))meth; - - if (_PyStack_UnpackDict(args, nargs, kwargs, &stack, &kwnames) < 0) { - goto exit; - } - - result = (*fastmeth) (self, stack, nargs, kwnames); - if (kwnames != NULL) { - Py_ssize_t i, n = nargs + PyTuple_GET_SIZE(kwnames); - for (i = 0; i < n; i++) { - Py_DECREF(stack[i]); - } - PyMem_Free((PyObject **)stack); - Py_DECREF(kwnames); - } - break; - } - - default: - PyErr_SetString(PyExc_SystemError, - "Bad call flags in _PyMethodDef_RawFastCallDict. " - "METH_OLDARGS is no longer supported!"); - goto exit; - } - - goto exit; - -no_keyword_error: - PyErr_Format(PyExc_TypeError, - "%.200s() takes no keyword arguments", - method->ml_name); - -exit: - Py_LeaveRecursiveCall(); - return result; -} - - -PyObject * -_PyCFunction_FastCallDict(PyObject *func, - PyObject *const *args, Py_ssize_t nargs, - PyObject *kwargs) -{ - PyObject *result; - - assert(func != NULL); - assert(PyCFunction_Check(func)); - - result = _PyMethodDef_RawFastCallDict(((PyCFunctionObject*)func)->m_ml, - PyCFunction_GET_SELF(func), - args, nargs, kwargs); - result = _Py_CheckFunctionResult(func, result, NULL); - return result; -} - - -PyObject * -_PyMethodDef_RawFastCallKeywords(PyMethodDef *method, PyObject *self, - PyObject *const *args, Py_ssize_t nargs, - PyObject *kwnames) -{ - /* _PyMethodDef_RawFastCallKeywords() must not be called with an exception set, - because it can clear it (directly or indirectly) and so the - caller loses its exception */ - assert(!PyErr_Occurred()); - - assert(method != NULL); - assert(nargs >= 0); - assert(kwnames == NULL || PyTuple_CheckExact(kwnames)); - /* kwnames must only contains str strings, no subclass, and all keys must - be unique */ - - PyCFunction meth = method->ml_meth; - int flags = method->ml_flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST); - Py_ssize_t nkwargs = kwnames == NULL ? 0 : PyTuple_GET_SIZE(kwnames); - PyObject *result = NULL; - - if (Py_EnterRecursiveCall(" while calling a Python object")) { - return NULL; - } - - switch (flags) - { - case METH_NOARGS: - if (nkwargs) { - goto no_keyword_error; - } - - if (nargs != 0) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes no arguments (%zd given)", - method->ml_name, nargs); - goto exit; - } - - result = (*meth) (self, NULL); - break; - - case METH_O: - if (nkwargs) { - goto no_keyword_error; - } - - if (nargs != 1) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes exactly one argument (%zd given)", - method->ml_name, nargs); - goto exit; - } - - result = (*meth) (self, args[0]); - break; - - case METH_FASTCALL: - if (nkwargs) { - goto no_keyword_error; - } - result = ((_PyCFunctionFast)(void(*)(void))meth) (self, args, nargs); - break; - - case METH_FASTCALL | METH_KEYWORDS: - /* Fast-path: avoid temporary dict to pass keyword arguments */ - result = ((_PyCFunctionFastWithKeywords)(void(*)(void))meth) (self, args, nargs, kwnames); - break; - - case METH_VARARGS: - if (nkwargs) { - goto no_keyword_error; - } - /* fall through */ - - case METH_VARARGS | METH_KEYWORDS: - { - /* Slow-path: create a temporary tuple for positional arguments - and a temporary dict for keyword arguments */ - PyObject *argtuple; - - argtuple = _PyTuple_FromArray(args, nargs); - if (argtuple == NULL) { - goto exit; - } - - if (flags & METH_KEYWORDS) { - PyObject *kwdict; - - if (nkwargs > 0) { - kwdict = _PyStack_AsDict(args + nargs, kwnames); - if (kwdict == NULL) { - Py_DECREF(argtuple); - goto exit; - } - } - else { - kwdict = NULL; - } - - result = (*(PyCFunctionWithKeywords)(void(*)(void))meth) (self, argtuple, kwdict); - Py_XDECREF(kwdict); - } - else { - result = (*meth) (self, argtuple); - } - Py_DECREF(argtuple); - break; - } - - default: - PyErr_SetString(PyExc_SystemError, - "Bad call flags in _PyMethodDef_RawFastCallKeywords. " - "METH_OLDARGS is no longer supported!"); - goto exit; - } - - goto exit; - -no_keyword_error: - PyErr_Format(PyExc_TypeError, - "%.200s() takes no keyword arguments", - method->ml_name); - -exit: - Py_LeaveRecursiveCall(); - return result; -} - - -static PyObject * -cfunction_call_varargs(PyObject *func, PyObject *args, PyObject *kwargs) -{ - assert(!PyErr_Occurred()); - assert(kwargs == NULL || PyDict_Check(kwargs)); - - PyCFunction meth = PyCFunction_GET_FUNCTION(func); - PyObject *self = PyCFunction_GET_SELF(func); - PyObject *result; - - assert(PyCFunction_GET_FLAGS(func) & METH_VARARGS); - if (PyCFunction_GET_FLAGS(func) & METH_KEYWORDS) { - if (Py_EnterRecursiveCall(" while calling a Python object")) { - return NULL; - } - - result = (*(PyCFunctionWithKeywords)(void(*)(void))meth)(self, args, kwargs); - - Py_LeaveRecursiveCall(); - } - else { - if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) { - PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", - ((PyCFunctionObject*)func)->m_ml->ml_name); - return NULL; - } - - if (Py_EnterRecursiveCall(" while calling a Python object")) { - return NULL; - } - - result = (*meth)(self, args); - - Py_LeaveRecursiveCall(); - } - - return _Py_CheckFunctionResult(func, result, NULL); -} - - -PyObject * -PyCFunction_Call(PyObject *func, PyObject *args, PyObject *kwargs) -{ - /* For METH_VARARGS, we cannot use vectorcall as the vectorcall pointer - * is NULL. This is intentional, since vectorcall would be slower. */ - if (PyCFunction_GET_FLAGS(func) & METH_VARARGS) { - return cfunction_call_varargs(func, args, kwargs); - } - return PyVectorcall_Call(func, args, kwargs); + return _PyEval_EvalCode(tstate, + (PyObject*)co, globals, (PyObject *)NULL, + stack, nargs, + nkwargs ? _PyTuple_ITEMS(kwnames) : NULL, + stack + nargs, + nkwargs, 1, + d, (int)nd, kwdefs, + closure, name, qualname); } @@ -783,30 +412,31 @@ PyObject * PyEval_CallObjectWithKeywords(PyObject *callable, PyObject *args, PyObject *kwargs) { + PyThreadState *tstate = _PyThreadState_GET(); #ifdef Py_DEBUG /* PyEval_CallObjectWithKeywords() must not be called with an exception set. It raises a new exception if parameters are invalid or if PyTuple_New() fails, and so the original exception is lost. */ - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); #endif if (args != NULL && !PyTuple_Check(args)) { - PyErr_SetString(PyExc_TypeError, - "argument list must be a tuple"); + _PyErr_SetString(tstate, PyExc_TypeError, + "argument list must be a tuple"); return NULL; } if (kwargs != NULL && !PyDict_Check(kwargs)) { - PyErr_SetString(PyExc_TypeError, - "keyword list must be a dictionary"); + _PyErr_SetString(tstate, PyExc_TypeError, + "keyword list must be a dictionary"); return NULL; } if (args == NULL) { - return _PyObject_FastCallDict(callable, NULL, 0, kwargs); + return _PyObject_FastCallDictTstate(tstate, callable, NULL, 0, kwargs); } else { - return PyObject_Call(callable, args, kwargs); + return _PyObject_Call(tstate, callable, args, kwargs); } } @@ -814,59 +444,31 @@ PyEval_CallObjectWithKeywords(PyObject *callable, PyObject * PyObject_CallObject(PyObject *callable, PyObject *args) { - return PyEval_CallObjectWithKeywords(callable, args, NULL); -} - - -/* Positional arguments are obj followed by args: - call callable(obj, *args, **kwargs) */ -PyObject * -_PyObject_FastCall_Prepend(PyObject *callable, PyObject *obj, - PyObject *const *args, Py_ssize_t nargs) -{ - PyObject *small_stack[_PY_FASTCALL_SMALL_STACK]; - PyObject **args2; - PyObject *result; - - nargs++; - if (nargs <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) { - args2 = small_stack; - } - else { - args2 = PyMem_Malloc(nargs * sizeof(PyObject *)); - if (args2 == NULL) { - PyErr_NoMemory(); - return NULL; - } - } - - /* use borrowed references */ - args2[0] = obj; - if (nargs > 1) { - memcpy(&args2[1], args, (nargs - 1) * sizeof(PyObject *)); + PyThreadState *tstate = _PyThreadState_GET(); + assert(!_PyErr_Occurred(tstate)); + if (args == NULL) { + return _PyObject_CallNoArgTstate(tstate, callable); } - - result = _PyObject_FastCall(callable, args2, nargs); - if (args2 != small_stack) { - PyMem_Free(args2); + if (!PyTuple_Check(args)) { + _PyErr_SetString(tstate, PyExc_TypeError, + "argument list must be a tuple"); + return NULL; } - return result; + return _PyObject_Call(tstate, callable, args, NULL); } /* Call callable(obj, *args, **kwargs). */ PyObject * -_PyObject_Call_Prepend(PyObject *callable, +_PyObject_Call_Prepend(PyThreadState *tstate, PyObject *callable, PyObject *obj, PyObject *args, PyObject *kwargs) { + assert(PyTuple_Check(args)); + PyObject *small_stack[_PY_FASTCALL_SMALL_STACK]; PyObject **stack; - Py_ssize_t argcount; - PyObject *result; - assert(PyTuple_Check(args)); - - argcount = PyTuple_GET_SIZE(args); + Py_ssize_t argcount = PyTuple_GET_SIZE(args); if (argcount + 1 <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) { stack = small_stack; } @@ -884,9 +486,9 @@ _PyObject_Call_Prepend(PyObject *callable, _PyTuple_ITEMS(args), argcount * sizeof(PyObject *)); - result = _PyObject_FastCallDict(callable, - stack, argcount + 1, - kwargs); + PyObject *result = _PyObject_FastCallDictTstate(tstate, callable, + stack, argcount + 1, + kwargs); if (stack != small_stack) { PyMem_Free(stack); } @@ -897,8 +499,8 @@ _PyObject_Call_Prepend(PyObject *callable, /* --- Call with a format string ---------------------------------- */ static PyObject * -_PyObject_CallFunctionVa(PyObject *callable, const char *format, - va_list va, int is_size_t) +_PyObject_CallFunctionVa(PyThreadState *tstate, PyObject *callable, + const char *format, va_list va, int is_size_t) { PyObject* small_stack[_PY_FASTCALL_SMALL_STACK]; const Py_ssize_t small_stack_len = Py_ARRAY_LENGTH(small_stack); @@ -907,11 +509,11 @@ _PyObject_CallFunctionVa(PyObject *callable, const char *format, PyObject *result; if (callable == NULL) { - return null_error(); + return null_error(tstate); } if (!format || !*format) { - return _PyObject_CallNoArg(callable); + return _PyObject_CallNoArgTstate(tstate, callable); } if (is_size_t) { @@ -932,12 +534,14 @@ _PyObject_CallFunctionVa(PyObject *callable, const char *format, - PyObject_CallFunction(func, "(OOO)", arg1, arg2, arg3) calls func(*(arg1, arg2, arg3)): func(arg1, arg2, arg3) */ PyObject *args = stack[0]; - result = _PyObject_FastCall(callable, - _PyTuple_ITEMS(args), - PyTuple_GET_SIZE(args)); + result = _PyObject_VectorcallTstate(tstate, callable, + _PyTuple_ITEMS(args), + PyTuple_GET_SIZE(args), + NULL); } else { - result = _PyObject_FastCall(callable, stack, nargs); + result = _PyObject_VectorcallTstate(tstate, callable, + stack, nargs, NULL); } for (i = 0; i < nargs; ++i) { @@ -955,9 +559,10 @@ PyObject_CallFunction(PyObject *callable, const char *format, ...) { va_list va; PyObject *result; + PyThreadState *tstate = _PyThreadState_GET(); va_start(va, format); - result = _PyObject_CallFunctionVa(callable, format, va, 0); + result = _PyObject_CallFunctionVa(tstate, callable, format, va, 0); va_end(va); return result; @@ -972,9 +577,10 @@ PyEval_CallFunction(PyObject *callable, const char *format, ...) { va_list va; PyObject *result; + PyThreadState *tstate = _PyThreadState_GET(); va_start(va, format); - result = _PyObject_CallFunctionVa(callable, format, va, 0); + result = _PyObject_CallFunctionVa(tstate, callable, format, va, 0); va_end(va); return result; @@ -984,11 +590,11 @@ PyEval_CallFunction(PyObject *callable, const char *format, ...) PyObject * _PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...) { - va_list va; - PyObject *result; + PyThreadState *tstate = _PyThreadState_GET(); + va_list va; va_start(va, format); - result = _PyObject_CallFunctionVa(callable, format, va, 1); + PyObject *result = _PyObject_CallFunctionVa(tstate, callable, format, va, 1); va_end(va); return result; @@ -996,37 +602,37 @@ _PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...) static PyObject* -callmethod(PyObject* callable, const char *format, va_list va, int is_size_t) +callmethod(PyThreadState *tstate, PyObject* callable, const char *format, va_list va, int is_size_t) { assert(callable != NULL); - if (!PyCallable_Check(callable)) { - PyErr_Format(PyExc_TypeError, - "attribute of type '%.200s' is not callable", - Py_TYPE(callable)->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "attribute of type '%.200s' is not callable", + Py_TYPE(callable)->tp_name); return NULL; } - return _PyObject_CallFunctionVa(callable, format, va, is_size_t); + return _PyObject_CallFunctionVa(tstate, callable, format, va, is_size_t); } PyObject * PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...) { - va_list va; - PyObject *callable, *retval; + PyThreadState *tstate = _PyThreadState_GET(); if (obj == NULL || name == NULL) { - return null_error(); + return null_error(tstate); } - callable = PyObject_GetAttrString(obj, name); - if (callable == NULL) + PyObject *callable = PyObject_GetAttrString(obj, name); + if (callable == NULL) { return NULL; + } + va_list va; va_start(va, format); - retval = callmethod(callable, format, va, 0); + PyObject *retval = callmethod(tstate, callable, format, va, 0); va_end(va); Py_DECREF(callable); @@ -1040,19 +646,19 @@ PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...) PyObject * PyEval_CallMethod(PyObject *obj, const char *name, const char *format, ...) { - va_list va; - PyObject *callable, *retval; - + PyThreadState *tstate = _PyThreadState_GET(); if (obj == NULL || name == NULL) { - return null_error(); + return null_error(tstate); } - callable = PyObject_GetAttrString(obj, name); - if (callable == NULL) + PyObject *callable = PyObject_GetAttrString(obj, name); + if (callable == NULL) { return NULL; + } + va_list va; va_start(va, format); - retval = callmethod(callable, format, va, 0); + PyObject *retval = callmethod(tstate, callable, format, va, 0); va_end(va); Py_DECREF(callable); @@ -1064,19 +670,19 @@ PyObject * _PyObject_CallMethodId(PyObject *obj, _Py_Identifier *name, const char *format, ...) { - va_list va; - PyObject *callable, *retval; - + PyThreadState *tstate = _PyThreadState_GET(); if (obj == NULL || name == NULL) { - return null_error(); + return null_error(tstate); } - callable = _PyObject_GetAttrId(obj, name); - if (callable == NULL) + PyObject *callable = _PyObject_GetAttrId(obj, name); + if (callable == NULL) { return NULL; + } + va_list va; va_start(va, format); - retval = callmethod(callable, format, va, 0); + PyObject *retval = callmethod(tstate, callable, format, va, 0); va_end(va); Py_DECREF(callable); @@ -1088,19 +694,19 @@ PyObject * _PyObject_CallMethod_SizeT(PyObject *obj, const char *name, const char *format, ...) { - va_list va; - PyObject *callable, *retval; - + PyThreadState *tstate = _PyThreadState_GET(); if (obj == NULL || name == NULL) { - return null_error(); + return null_error(tstate); } - callable = PyObject_GetAttrString(obj, name); - if (callable == NULL) + PyObject *callable = PyObject_GetAttrString(obj, name); + if (callable == NULL) { return NULL; + } + va_list va; va_start(va, format); - retval = callmethod(callable, format, va, 1); + PyObject *retval = callmethod(tstate, callable, format, va, 1); va_end(va); Py_DECREF(callable); @@ -1112,20 +718,19 @@ PyObject * _PyObject_CallMethodId_SizeT(PyObject *obj, _Py_Identifier *name, const char *format, ...) { - va_list va; - PyObject *callable, *retval; - + PyThreadState *tstate = _PyThreadState_GET(); if (obj == NULL || name == NULL) { - return null_error(); + return null_error(tstate); } - callable = _PyObject_GetAttrId(obj, name); + PyObject *callable = _PyObject_GetAttrId(obj, name); if (callable == NULL) { return NULL; } + va_list va; va_start(va, format); - retval = callmethod(callable, format, va, 1); + PyObject *retval = callmethod(tstate, callable, format, va, 1); va_end(va); Py_DECREF(callable); @@ -1136,7 +741,8 @@ _PyObject_CallMethodId_SizeT(PyObject *obj, _Py_Identifier *name, /* --- Call with "..." arguments ---------------------------------- */ static PyObject * -object_vacall(PyObject *base, PyObject *callable, va_list vargs) +object_vacall(PyThreadState *tstate, PyObject *base, + PyObject *callable, va_list vargs) { PyObject *small_stack[_PY_FASTCALL_SMALL_STACK]; PyObject **stack; @@ -1146,7 +752,7 @@ object_vacall(PyObject *base, PyObject *callable, va_list vargs) va_list countva; if (callable == NULL) { - return null_error(); + return null_error(tstate); } /* Count the number of arguments */ @@ -1183,7 +789,7 @@ object_vacall(PyObject *base, PyObject *callable, va_list vargs) } /* Call the function */ - result = _PyObject_FastCall(callable, stack, nargs); + result = _PyObject_VectorcallTstate(tstate, callable, stack, nargs, NULL); if (stack != small_stack) { PyMem_Free(stack); @@ -1192,14 +798,46 @@ object_vacall(PyObject *base, PyObject *callable, va_list vargs) } -/* Private API for the LOAD_METHOD opcode. */ -extern int _PyObject_GetMethod(PyObject *, PyObject *, PyObject **); +PyObject * +PyObject_VectorcallMethod(PyObject *name, PyObject *const *args, + size_t nargsf, PyObject *kwnames) +{ + assert(name != NULL); + assert(args != NULL); + assert(PyVectorcall_NARGS(nargsf) >= 1); + + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *callable = NULL; + /* Use args[0] as "self" argument */ + int unbound = _PyObject_GetMethod(args[0], name, &callable); + if (callable == NULL) { + return NULL; + } + + if (unbound) { + /* We must remove PY_VECTORCALL_ARGUMENTS_OFFSET since + * that would be interpreted as allowing to change args[-1] */ + nargsf &= ~PY_VECTORCALL_ARGUMENTS_OFFSET; + } + else { + /* Skip "self". We can keep PY_VECTORCALL_ARGUMENTS_OFFSET since + * args[-1] in the onward call is args[0] here. */ + args++; + nargsf--; + } + PyObject *result = _PyObject_VectorcallTstate(tstate, callable, + args, nargsf, kwnames); + Py_DECREF(callable); + return result; +} + PyObject * PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...) { + PyThreadState *tstate = _PyThreadState_GET(); if (obj == NULL || name == NULL) { - return null_error(); + return null_error(tstate); } PyObject *callable = NULL; @@ -1211,7 +849,7 @@ PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...) va_list vargs; va_start(vargs, name); - PyObject *result = object_vacall(obj, callable, vargs); + PyObject *result = object_vacall(tstate, obj, callable, vargs); va_end(vargs); Py_DECREF(callable); @@ -1223,8 +861,9 @@ PyObject * _PyObject_CallMethodIdObjArgs(PyObject *obj, struct _Py_Identifier *name, ...) { + PyThreadState *tstate = _PyThreadState_GET(); if (obj == NULL || name == NULL) { - return null_error(); + return null_error(tstate); } PyObject *oname = _PyUnicode_FromId(name); /* borrowed */ @@ -1241,7 +880,7 @@ _PyObject_CallMethodIdObjArgs(PyObject *obj, va_list vargs; va_start(vargs, name); - PyObject *result = object_vacall(obj, callable, vargs); + PyObject *result = object_vacall(tstate, obj, callable, vargs); va_end(vargs); Py_DECREF(callable); @@ -1252,11 +891,12 @@ _PyObject_CallMethodIdObjArgs(PyObject *obj, PyObject * PyObject_CallFunctionObjArgs(PyObject *callable, ...) { + PyThreadState *tstate = _PyThreadState_GET(); va_list vargs; PyObject *result; va_start(vargs, callable); - result = object_vacall(NULL, callable, vargs); + result = object_vacall(tstate, NULL, callable, vargs); va_end(vargs); return result; @@ -1292,54 +932,67 @@ _PyStack_AsDict(PyObject *const *values, PyObject *kwnames) } -int -_PyStack_UnpackDict(PyObject *const *args, Py_ssize_t nargs, PyObject *kwargs, - PyObject *const **p_stack, PyObject **p_kwnames) -{ - PyObject **stack, **kwstack; - Py_ssize_t nkwargs; - Py_ssize_t pos, i; - PyObject *key, *value; - PyObject *kwnames; +/* Convert (args, nargs, kwargs: dict) into a (stack, nargs, kwnames: tuple). - assert(nargs >= 0); - assert(kwargs == NULL || PyDict_CheckExact(kwargs)); + Allocate a new argument vector and keyword names tuple. Return the argument + vector; return NULL with exception set on error. Return the keyword names + tuple in *p_kwnames. - if (kwargs == NULL || (nkwargs = PyDict_GET_SIZE(kwargs)) == 0) { - *p_stack = args; - *p_kwnames = NULL; - return 0; - } + This also checks that all keyword names are strings. If not, a TypeError is + raised. + + The newly allocated argument vector supports PY_VECTORCALL_ARGUMENTS_OFFSET. - if ((size_t)nargs > PY_SSIZE_T_MAX / sizeof(stack[0]) - (size_t)nkwargs) { - PyErr_NoMemory(); - return -1; + When done, you must call _PyStack_UnpackDict_Free(stack, nargs, kwnames) */ +static PyObject *const * +_PyStack_UnpackDict(PyThreadState *tstate, + PyObject *const *args, Py_ssize_t nargs, + PyObject *kwargs, PyObject **p_kwnames) +{ + assert(nargs >= 0); + assert(kwargs != NULL); + assert(PyDict_Check(kwargs)); + + Py_ssize_t nkwargs = PyDict_GET_SIZE(kwargs); + /* Check for overflow in the PyMem_Malloc() call below. The subtraction + * in this check cannot overflow: both maxnargs and nkwargs are + * non-negative signed integers, so their difference fits in the type. */ + Py_ssize_t maxnargs = PY_SSIZE_T_MAX / sizeof(args[0]) - 1; + if (nargs > maxnargs - nkwargs) { + _PyErr_NoMemory(tstate); + return NULL; } - stack = PyMem_Malloc((nargs + nkwargs) * sizeof(stack[0])); + /* Add 1 to support PY_VECTORCALL_ARGUMENTS_OFFSET */ + PyObject **stack = PyMem_Malloc((1 + nargs + nkwargs) * sizeof(args[0])); if (stack == NULL) { - PyErr_NoMemory(); - return -1; + _PyErr_NoMemory(tstate); + return NULL; } - kwnames = PyTuple_New(nkwargs); + PyObject *kwnames = PyTuple_New(nkwargs); if (kwnames == NULL) { PyMem_Free(stack); - return -1; + return NULL; } + stack++; /* For PY_VECTORCALL_ARGUMENTS_OFFSET */ + /* Copy positional arguments */ - for (i = 0; i < nargs; i++) { + for (Py_ssize_t i = 0; i < nargs; i++) { Py_INCREF(args[i]); stack[i] = args[i]; } - kwstack = stack + nargs; - pos = i = 0; + PyObject **kwstack = stack + nargs; /* This loop doesn't support lookup function mutating the dictionary to change its size. It's a deliberate choice for speed, this function is called in the performance critical hot code. */ + Py_ssize_t pos = 0, i = 0; + PyObject *key, *value; + unsigned long keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS; while (PyDict_Next(kwargs, &pos, &key, &value)) { + keys_are_strings &= Py_TYPE(key)->tp_flags; Py_INCREF(key); Py_INCREF(value); PyTuple_SET_ITEM(kwnames, i, key); @@ -1347,7 +1000,30 @@ _PyStack_UnpackDict(PyObject *const *args, Py_ssize_t nargs, PyObject *kwargs, i++; } - *p_stack = stack; + /* keys_are_strings has the value Py_TPFLAGS_UNICODE_SUBCLASS if that + * flag is set for all keys. Otherwise, keys_are_strings equals 0. + * We do this check once at the end instead of inside the loop above + * because it simplifies the deallocation in the failing case. + * It happens to also make the loop above slightly more efficient. */ + if (!keys_are_strings) { + _PyErr_SetString(tstate, PyExc_TypeError, + "keywords must be strings"); + _PyStack_UnpackDict_Free(stack, nargs, kwnames); + return NULL; + } + *p_kwnames = kwnames; - return 0; + return stack; +} + +static void +_PyStack_UnpackDict_Free(PyObject *const *stack, Py_ssize_t nargs, + PyObject *kwnames) +{ + Py_ssize_t n = PyTuple_GET_SIZE(kwnames) + nargs; + for (Py_ssize_t i = 0; i < n; i++) { + Py_DECREF(stack[i]); + } + PyMem_Free((PyObject **)stack - 1); + Py_DECREF(kwnames); } diff --git a/Objects/capsule.c b/Objects/capsule.c index 599893a320dba6b4e20a06761c77350a3e11adb7..ed24cc1d6a2eb2be9c3d8d0142727f48b33ab1b6 100644 --- a/Objects/capsule.c +++ b/Objects/capsule.c @@ -50,7 +50,7 @@ PyCapsule_New(void *pointer, const char *name, PyCapsule_Destructor destructor) return NULL; } - capsule = PyObject_NEW(PyCapsule, &PyCapsule_Type); + capsule = PyObject_New(PyCapsule, &PyCapsule_Type); if (capsule == NULL) { return NULL; } diff --git a/Objects/cellobject.c b/Objects/cellobject.c index 911cf527a43485cabebc92b65e54feb72f1f3746..86a89f02e60d3c55e8ac784e918bf541f5b6fe6a 100644 --- a/Objects/cellobject.c +++ b/Objects/cellobject.c @@ -2,8 +2,6 @@ #include "Python.h" #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" PyObject * PyCell_New(PyObject *obj) @@ -112,7 +110,7 @@ cell_repr(PyCellObject *op) return PyUnicode_FromFormat("", op); return PyUnicode_FromFormat("", - op, op->ob_ref->ob_type->tp_name, + op, Py_TYPE(op->ob_ref)->tp_name, op->ob_ref); } diff --git a/Objects/classobject.c b/Objects/classobject.c index 12bb836cb716c0be93f0e3fde2dade887c3c6bc6..fd9f8757f84ab41d8a8199f66811fb5221158851 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -2,21 +2,12 @@ #include "Python.h" #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" -#include "structmember.h" +#include "pycore_pyerrors.h" +#include "pycore_pystate.h" // _PyThreadState_GET() +#include "structmember.h" // PyMemberDef #define TP_DESCR_GET(t) ((t)->tp_descr_get) -/* Free list for method objects to safe malloc/free overhead - * The im_self element is used to chain the elements. - */ -static PyMethodObject *free_list; -static int numfree = 0; -#ifndef PyMethod_MAXFREELIST -#define PyMethod_MAXFREELIST 256 -#endif - _Py_IDENTIFIER(__name__); _Py_IDENTIFIER(__qualname__); @@ -45,26 +36,29 @@ static PyObject * method_vectorcall(PyObject *method, PyObject *const *args, size_t nargsf, PyObject *kwnames) { - assert(Py_TYPE(method) == &PyMethod_Type); - PyObject *self, *func, *result; - self = PyMethod_GET_SELF(method); - func = PyMethod_GET_FUNCTION(method); + assert(Py_IS_TYPE(method, &PyMethod_Type)); + + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *self = PyMethod_GET_SELF(method); + PyObject *func = PyMethod_GET_FUNCTION(method); Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + PyObject *result; if (nargsf & PY_VECTORCALL_ARGUMENTS_OFFSET) { /* PY_VECTORCALL_ARGUMENTS_OFFSET is set, so we are allowed to mutate the vector */ PyObject **newargs = (PyObject**)args - 1; nargs += 1; PyObject *tmp = newargs[0]; newargs[0] = self; - result = _PyObject_Vectorcall(func, newargs, nargs, kwnames); + result = _PyObject_VectorcallTstate(tstate, func, newargs, + nargs, kwnames); newargs[0] = tmp; } else { Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames); Py_ssize_t totalargs = nargs + nkwargs; if (totalargs == 0) { - return _PyObject_Vectorcall(func, &self, 1, NULL); + return _PyObject_VectorcallTstate(tstate, func, &self, 1, NULL); } PyObject *newargs_stack[_PY_FASTCALL_SMALL_STACK]; @@ -75,7 +69,7 @@ method_vectorcall(PyObject *method, PyObject *const *args, else { newargs = PyMem_Malloc((totalargs+1) * sizeof(PyObject *)); if (newargs == NULL) { - PyErr_NoMemory(); + _PyErr_NoMemory(tstate); return NULL; } } @@ -86,7 +80,8 @@ method_vectorcall(PyObject *method, PyObject *const *args, * undefined behaviour. */ assert(args != NULL); memcpy(newargs + 1, args, totalargs * sizeof(PyObject *)); - result = _PyObject_Vectorcall(func, newargs, nargs+1, kwnames); + result = _PyObject_VectorcallTstate(tstate, func, + newargs, nargs+1, kwnames); if (newargs != newargs_stack) { PyMem_Free(newargs); } @@ -103,26 +98,18 @@ method_vectorcall(PyObject *method, PyObject *const *args, PyObject * PyMethod_New(PyObject *func, PyObject *self) { - PyMethodObject *im; if (self == NULL) { PyErr_BadInternalCall(); return NULL; } - im = free_list; - if (im != NULL) { - free_list = (PyMethodObject *)(im->im_self); - (void)PyObject_INIT(im, &PyMethod_Type); - numfree--; - } - else { - im = PyObject_GC_New(PyMethodObject, &PyMethod_Type); - if (im == NULL) - return NULL; + PyMethodObject *im = PyObject_GC_New(PyMethodObject, &PyMethod_Type); + if (im == NULL) { + return NULL; } im->im_weakreflist = NULL; Py_INCREF(func); im->im_func = func; - Py_XINCREF(self); + Py_INCREF(self); im->im_self = self; im->vectorcall = method_vectorcall; _PyObject_GC_TRACK(im); @@ -157,9 +144,9 @@ static PyMethodDef method_methods[] = { #define MO_OFF(x) offsetof(PyMethodObject, x) static PyMemberDef method_memberlist[] = { - {"__func__", T_OBJECT, MO_OFF(im_func), READONLY|RESTRICTED, + {"__func__", T_OBJECT, MO_OFF(im_func), READONLY, "the function (or other callable) implementing a method"}, - {"__self__", T_OBJECT, MO_OFF(im_self), READONLY|RESTRICTED, + {"__self__", T_OBJECT, MO_OFF(im_self), READONLY, "the instance to which a method is bound"}, {NULL} /* Sentinel */ }; @@ -190,7 +177,7 @@ static PyObject * method_getattro(PyObject *obj, PyObject *name) { PyMethodObject *im = (PyMethodObject *)obj; - PyTypeObject *tp = obj->ob_type; + PyTypeObject *tp = Py_TYPE(obj); PyObject *descr = NULL; { @@ -202,9 +189,9 @@ method_getattro(PyObject *obj, PyObject *name) } if (descr != NULL) { - descrgetfunc f = TP_DESCR_GET(descr->ob_type); + descrgetfunc f = TP_DESCR_GET(Py_TYPE(descr)); if (f != NULL) - return f(descr, obj, (PyObject *)obj->ob_type); + return f(descr, obj, (PyObject *)Py_TYPE(obj)); else { Py_INCREF(descr); return descr; @@ -252,14 +239,7 @@ method_dealloc(PyMethodObject *im) PyObject_ClearWeakRefs((PyObject *)im); Py_DECREF(im->im_func); Py_XDECREF(im->im_self); - if (numfree < PyMethod_MAXFREELIST) { - im->im_self = (PyObject *)free_list; - free_list = im; - numfree++; - } - else { - PyObject_GC_Del(im); - } + PyObject_GC_Del(im); } static PyObject * @@ -341,17 +321,6 @@ method_traverse(PyMethodObject *im, visitproc visit, void *arg) return 0; } -static PyObject * -method_call(PyObject *method, PyObject *args, PyObject *kwargs) -{ - PyObject *self, *func; - - self = PyMethod_GET_SELF(method); - func = PyMethod_GET_FUNCTION(method); - - return _PyObject_Call_Prepend(func, self, args, kwargs); -} - static PyObject * method_descr_get(PyObject *meth, PyObject *obj, PyObject *cls) { @@ -374,13 +343,13 @@ PyTypeObject PyMethod_Type = { 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)method_hash, /* tp_hash */ - method_call, /* tp_call */ + PyVectorcall_Call, /* tp_call */ 0, /* tp_str */ method_getattro, /* tp_getattro */ PyObject_GenericSetAttr, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | - _Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ + Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ method_doc, /* tp_doc */ (traverseproc)method_traverse, /* tp_traverse */ 0, /* tp_clear */ @@ -401,38 +370,6 @@ PyTypeObject PyMethod_Type = { method_new, /* tp_new */ }; -/* Clear out the free list */ - -int -PyMethod_ClearFreeList(void) -{ - int freelist_size = numfree; - - while (free_list) { - PyMethodObject *im = free_list; - free_list = (PyMethodObject *)(im->im_self); - PyObject_GC_Del(im); - numfree--; - } - assert(numfree == 0); - return freelist_size; -} - -void -PyMethod_Fini(void) -{ - (void)PyMethod_ClearFreeList(); -} - -/* Print summary info about the state of the optimized allocator */ -void -_PyMethod_DebugMallocStats(FILE *out) -{ - _PyDebugAllocatorStats(out, - "free PyMethodObject", - numfree, sizeof(PyMethodObject)); -} - /* ------------------------------------------------------------------------ * instance method */ @@ -462,7 +399,7 @@ PyInstanceMethod_Function(PyObject *im) #define IMO_OFF(x) offsetof(PyInstanceMethodObject, x) static PyMemberDef instancemethod_memberlist[] = { - {"__func__", T_OBJECT, IMO_OFF(func), READONLY|RESTRICTED, + {"__func__", T_OBJECT, IMO_OFF(func), READONLY, "the function (or other callable) implementing a method"}, {NULL} /* Sentinel */ }; @@ -487,7 +424,7 @@ static PyGetSetDef instancemethod_getset[] = { static PyObject * instancemethod_getattro(PyObject *self, PyObject *name) { - PyTypeObject *tp = self->ob_type; + PyTypeObject *tp = Py_TYPE(self); PyObject *descr = NULL; if (tp->tp_dict == NULL) { @@ -497,9 +434,9 @@ instancemethod_getattro(PyObject *self, PyObject *name) descr = _PyType_Lookup(tp, name); if (descr != NULL) { - descrgetfunc f = TP_DESCR_GET(descr->ob_type); + descrgetfunc f = TP_DESCR_GET(Py_TYPE(descr)); if (f != NULL) - return f(descr, self, (PyObject *)self->ob_type); + return f(descr, self, (PyObject *)Py_TYPE(self)); else { Py_INCREF(descr); return descr; diff --git a/Objects/clinic/bytearrayobject.c.h b/Objects/clinic/bytearrayobject.c.h index 05577077a5f8d4485907ae58d5ad2ef61a562f46..35ba1ff3d576d2c7e318aee9ba66c77df6cb30f6 100644 --- a/Objects/clinic/bytearrayobject.c.h +++ b/Objects/clinic/bytearrayobject.c.h @@ -38,6 +38,86 @@ bytearray_copy(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored)) return bytearray_copy_impl(self); } +PyDoc_STRVAR(bytearray_removeprefix__doc__, +"removeprefix($self, prefix, /)\n" +"--\n" +"\n" +"Return a bytearray with the given prefix string removed if present.\n" +"\n" +"If the bytearray starts with the prefix string, return\n" +"bytearray[len(prefix):]. Otherwise, return a copy of the original\n" +"bytearray."); + +#define BYTEARRAY_REMOVEPREFIX_METHODDEF \ + {"removeprefix", (PyCFunction)bytearray_removeprefix, METH_O, bytearray_removeprefix__doc__}, + +static PyObject * +bytearray_removeprefix_impl(PyByteArrayObject *self, Py_buffer *prefix); + +static PyObject * +bytearray_removeprefix(PyByteArrayObject *self, PyObject *arg) +{ + PyObject *return_value = NULL; + Py_buffer prefix = {NULL, NULL}; + + if (PyObject_GetBuffer(arg, &prefix, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&prefix, 'C')) { + _PyArg_BadArgument("removeprefix", "argument", "contiguous buffer", arg); + goto exit; + } + return_value = bytearray_removeprefix_impl(self, &prefix); + +exit: + /* Cleanup for prefix */ + if (prefix.obj) { + PyBuffer_Release(&prefix); + } + + return return_value; +} + +PyDoc_STRVAR(bytearray_removesuffix__doc__, +"removesuffix($self, suffix, /)\n" +"--\n" +"\n" +"Return a bytearray with the given suffix string removed if present.\n" +"\n" +"If the bytearray ends with the suffix string and that suffix is not\n" +"empty, return bytearray[:-len(suffix)]. Otherwise, return a copy of\n" +"the original bytearray."); + +#define BYTEARRAY_REMOVESUFFIX_METHODDEF \ + {"removesuffix", (PyCFunction)bytearray_removesuffix, METH_O, bytearray_removesuffix__doc__}, + +static PyObject * +bytearray_removesuffix_impl(PyByteArrayObject *self, Py_buffer *suffix); + +static PyObject * +bytearray_removesuffix(PyByteArrayObject *self, PyObject *arg) +{ + PyObject *return_value = NULL; + Py_buffer suffix = {NULL, NULL}; + + if (PyObject_GetBuffer(arg, &suffix, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&suffix, 'C')) { + _PyArg_BadArgument("removesuffix", "argument", "contiguous buffer", arg); + goto exit; + } + return_value = bytearray_removesuffix_impl(self, &suffix); + +exit: + /* Cleanup for suffix */ + if (suffix.obj) { + PyBuffer_Release(&suffix); + } + + return return_value; +} + PyDoc_STRVAR(bytearray_translate__doc__, "translate($self, table, /, delete=b\'\')\n" "--\n" @@ -1011,4 +1091,4 @@ bytearray_sizeof(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored)) { return bytearray_sizeof_impl(self); } -/*[clinic end generated code: output=508dce79cf2dffcc input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b2919f76709e48dc input=a9049054013a1b77]*/ diff --git a/Objects/clinic/bytesobject.c.h b/Objects/clinic/bytesobject.c.h index 22024ab155c8ecd2cff84e08295461b6300e5c73..063a3777b49074e291cbee8d54085fd04f350c9a 100644 --- a/Objects/clinic/bytesobject.c.h +++ b/Objects/clinic/bytesobject.c.h @@ -526,6 +526,85 @@ exit: return return_value; } +PyDoc_STRVAR(bytes_removeprefix__doc__, +"removeprefix($self, prefix, /)\n" +"--\n" +"\n" +"Return a bytes object with the given prefix string removed if present.\n" +"\n" +"If the bytes starts with the prefix string, return bytes[len(prefix):].\n" +"Otherwise, return a copy of the original bytes."); + +#define BYTES_REMOVEPREFIX_METHODDEF \ + {"removeprefix", (PyCFunction)bytes_removeprefix, METH_O, bytes_removeprefix__doc__}, + +static PyObject * +bytes_removeprefix_impl(PyBytesObject *self, Py_buffer *prefix); + +static PyObject * +bytes_removeprefix(PyBytesObject *self, PyObject *arg) +{ + PyObject *return_value = NULL; + Py_buffer prefix = {NULL, NULL}; + + if (PyObject_GetBuffer(arg, &prefix, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&prefix, 'C')) { + _PyArg_BadArgument("removeprefix", "argument", "contiguous buffer", arg); + goto exit; + } + return_value = bytes_removeprefix_impl(self, &prefix); + +exit: + /* Cleanup for prefix */ + if (prefix.obj) { + PyBuffer_Release(&prefix); + } + + return return_value; +} + +PyDoc_STRVAR(bytes_removesuffix__doc__, +"removesuffix($self, suffix, /)\n" +"--\n" +"\n" +"Return a bytes object with the given suffix string removed if present.\n" +"\n" +"If the bytes ends with the suffix string and that suffix is not empty,\n" +"return bytes[:-len(prefix)]. Otherwise, return a copy of the original\n" +"bytes."); + +#define BYTES_REMOVESUFFIX_METHODDEF \ + {"removesuffix", (PyCFunction)bytes_removesuffix, METH_O, bytes_removesuffix__doc__}, + +static PyObject * +bytes_removesuffix_impl(PyBytesObject *self, Py_buffer *suffix); + +static PyObject * +bytes_removesuffix(PyBytesObject *self, PyObject *arg) +{ + PyObject *return_value = NULL; + Py_buffer suffix = {NULL, NULL}; + + if (PyObject_GetBuffer(arg, &suffix, PyBUF_SIMPLE) != 0) { + goto exit; + } + if (!PyBuffer_IsContiguous(&suffix, 'C')) { + _PyArg_BadArgument("removesuffix", "argument", "contiguous buffer", arg); + goto exit; + } + return_value = bytes_removesuffix_impl(self, &suffix); + +exit: + /* Cleanup for suffix */ + if (suffix.obj) { + PyBuffer_Release(&suffix); + } + + return return_value; +} + PyDoc_STRVAR(bytes_decode__doc__, "decode($self, /, encoding=\'utf-8\', errors=\'strict\')\n" "--\n" @@ -755,4 +834,4 @@ skip_optional_pos: exit: return return_value; } -/*[clinic end generated code: output=ca60dfccf8d51e88 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=220388917d7bf751 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/dictobject.c.h b/Objects/clinic/dictobject.c.h index 8d5493330835e836408b47b96bad02849a809d32..7395e3bcebba8ac50e9a1072989a8817a7f27019 100644 --- a/Objects/clinic/dictobject.c.h +++ b/Objects/clinic/dictobject.c.h @@ -116,6 +116,42 @@ exit: return return_value; } +PyDoc_STRVAR(dict_pop__doc__, +"pop($self, key, default=, /)\n" +"--\n" +"\n" +"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n" +"\n" +"If key is not found, default is returned if given, otherwise KeyError is raised"); + +#define DICT_POP_METHODDEF \ + {"pop", (PyCFunction)(void(*)(void))dict_pop, METH_FASTCALL, dict_pop__doc__}, + +static PyObject * +dict_pop_impl(PyDictObject *self, PyObject *key, PyObject *default_value); + +static PyObject * +dict_pop(PyDictObject *self, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + PyObject *key; + PyObject *default_value = NULL; + + if (!_PyArg_CheckPositional("pop", nargs, 1, 2)) { + goto exit; + } + key = args[0]; + if (nargs < 2) { + goto skip_optional; + } + default_value = args[1]; +skip_optional: + return_value = dict_pop_impl(self, key, default_value); + +exit: + return return_value; +} + PyDoc_STRVAR(dict_popitem__doc__, "popitem($self, /)\n" "--\n" @@ -154,4 +190,4 @@ dict___reversed__(PyDictObject *self, PyObject *Py_UNUSED(ignored)) { return dict___reversed___impl(self); } -/*[clinic end generated code: output=676532dcc941d399 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=4d98145508da8fa3 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/floatobject.c.h b/Objects/clinic/floatobject.c.h index b684ba0ef27aaf35bdfc8bb1748d27e7b868b684..b7554832b5a8a268a0e766db02621d6f030c4ce0 100644 --- a/Objects/clinic/floatobject.c.h +++ b/Objects/clinic/floatobject.c.h @@ -38,6 +38,42 @@ float___trunc__(PyObject *self, PyObject *Py_UNUSED(ignored)) return float___trunc___impl(self); } +PyDoc_STRVAR(float___floor____doc__, +"__floor__($self, /)\n" +"--\n" +"\n" +"Return the floor as an Integral."); + +#define FLOAT___FLOOR___METHODDEF \ + {"__floor__", (PyCFunction)float___floor__, METH_NOARGS, float___floor____doc__}, + +static PyObject * +float___floor___impl(PyObject *self); + +static PyObject * +float___floor__(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + return float___floor___impl(self); +} + +PyDoc_STRVAR(float___ceil____doc__, +"__ceil__($self, /)\n" +"--\n" +"\n" +"Return the ceiling as an Integral."); + +#define FLOAT___CEIL___METHODDEF \ + {"__ceil__", (PyCFunction)float___ceil__, METH_NOARGS, float___ceil____doc__}, + +static PyObject * +float___ceil___impl(PyObject *self); + +static PyObject * +float___ceil__(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + return float___ceil___impl(self); +} + PyDoc_STRVAR(float___round____doc__, "__round__($self, ndigits=None, /)\n" "--\n" @@ -351,4 +387,4 @@ float___format__(PyObject *self, PyObject *arg) exit: return return_value; } -/*[clinic end generated code: output=1676433b9f04fbc9 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=25fbbe253f44e2df input=a9049054013a1b77]*/ diff --git a/Objects/clinic/listobject.c.h b/Objects/clinic/listobject.c.h index 57f0a48eb0838b18ada5dc60a8e15a05676c265d..ed137c95a8e109e5fae9d33c2ae01d451c9dd577 100644 --- a/Objects/clinic/listobject.c.h +++ b/Objects/clinic/listobject.c.h @@ -314,7 +314,7 @@ list___init__(PyObject *self, PyObject *args, PyObject *kwargs) int return_value = -1; PyObject *iterable = NULL; - if ((Py_TYPE(self) == &PyList_Type) && + if (Py_IS_TYPE(self, &PyList_Type) && !_PyArg_NoKeywords("list", kwargs)) { goto exit; } @@ -367,4 +367,4 @@ list___reversed__(PyListObject *self, PyObject *Py_UNUSED(ignored)) { return list___reversed___impl(self); } -/*[clinic end generated code: output=73718c0c33798c62 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=1ff61490c091d165 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/unicodeobject.c.h b/Objects/clinic/unicodeobject.c.h index 0d134064bab0917aaff72bc5dd8353487c4e988d..cf81df4af67b2cc1b478ffbfb5c1ec861cf911ba 100644 --- a/Objects/clinic/unicodeobject.c.h +++ b/Objects/clinic/unicodeobject.c.h @@ -754,6 +754,77 @@ exit: return return_value; } +PyDoc_STRVAR(unicode_removeprefix__doc__, +"removeprefix($self, prefix, /)\n" +"--\n" +"\n" +"Return a str with the given prefix string removed if present.\n" +"\n" +"If the string starts with the prefix string, return string[len(prefix):].\n" +"Otherwise, return a copy of the original string."); + +#define UNICODE_REMOVEPREFIX_METHODDEF \ + {"removeprefix", (PyCFunction)unicode_removeprefix, METH_O, unicode_removeprefix__doc__}, + +static PyObject * +unicode_removeprefix_impl(PyObject *self, PyObject *prefix); + +static PyObject * +unicode_removeprefix(PyObject *self, PyObject *arg) +{ + PyObject *return_value = NULL; + PyObject *prefix; + + if (!PyUnicode_Check(arg)) { + _PyArg_BadArgument("removeprefix", "argument", "str", arg); + goto exit; + } + if (PyUnicode_READY(arg) == -1) { + goto exit; + } + prefix = arg; + return_value = unicode_removeprefix_impl(self, prefix); + +exit: + return return_value; +} + +PyDoc_STRVAR(unicode_removesuffix__doc__, +"removesuffix($self, suffix, /)\n" +"--\n" +"\n" +"Return a str with the given suffix string removed if present.\n" +"\n" +"If the string ends with the suffix string and that suffix is not empty,\n" +"return string[:-len(suffix)]. Otherwise, return a copy of the original\n" +"string."); + +#define UNICODE_REMOVESUFFIX_METHODDEF \ + {"removesuffix", (PyCFunction)unicode_removesuffix, METH_O, unicode_removesuffix__doc__}, + +static PyObject * +unicode_removesuffix_impl(PyObject *self, PyObject *suffix); + +static PyObject * +unicode_removesuffix(PyObject *self, PyObject *arg) +{ + PyObject *return_value = NULL; + PyObject *suffix; + + if (!PyUnicode_Check(arg)) { + _PyArg_BadArgument("removesuffix", "argument", "str", arg); + goto exit; + } + if (PyUnicode_READY(arg) == -1) { + goto exit; + } + suffix = arg; + return_value = unicode_removesuffix_impl(self, suffix); + +exit: + return return_value; +} + PyDoc_STRVAR(unicode_rjust__doc__, "rjust($self, width, fillchar=\' \', /)\n" "--\n" @@ -1232,4 +1303,4 @@ unicode_sizeof(PyObject *self, PyObject *Py_UNUSED(ignored)) { return unicode_sizeof_impl(self); } -/*[clinic end generated code: output=e4ed33400979c7e8 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=b91233f3722643be input=a9049054013a1b77]*/ diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 522e1a9f2a41956089f535efc84e11e771126407..737635943aced57d3404782d287eb972c6545a9c 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -3,9 +3,10 @@ #include "Python.h" #include "code.h" #include "opcode.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include "pycore_code.h" -#include "pycore_pystate.h" +#include "pycore_interp.h" // PyInterpreterState.co_extra_freefuncs +#include "pycore_pystate.h" // _PyInterpreterState_GET() #include "pycore_tupleobject.h" #include "clinic/codeobject.c.h" @@ -38,7 +39,7 @@ all_name_chars(PyObject *o) return 1; } -static void +static int intern_strings(PyObject *tuple) { Py_ssize_t i; @@ -46,60 +47,70 @@ intern_strings(PyObject *tuple) for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) { PyObject *v = PyTuple_GET_ITEM(tuple, i); if (v == NULL || !PyUnicode_CheckExact(v)) { - Py_FatalError("non-string found in code slot"); + PyErr_SetString(PyExc_SystemError, + "non-string found in code slot"); + return -1; } PyUnicode_InternInPlace(&_PyTuple_ITEMS(tuple)[i]); } + return 0; } /* Intern selected string constants */ static int -intern_string_constants(PyObject *tuple) +intern_string_constants(PyObject *tuple, int *modified) { - int modified = 0; - Py_ssize_t i; - - for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) { + for (Py_ssize_t i = PyTuple_GET_SIZE(tuple); --i >= 0; ) { PyObject *v = PyTuple_GET_ITEM(tuple, i); if (PyUnicode_CheckExact(v)) { if (PyUnicode_READY(v) == -1) { - PyErr_Clear(); - continue; + return -1; } + if (all_name_chars(v)) { PyObject *w = v; PyUnicode_InternInPlace(&v); if (w != v) { PyTuple_SET_ITEM(tuple, i, v); - modified = 1; + if (modified) { + *modified = 1; + } } } } else if (PyTuple_CheckExact(v)) { - intern_string_constants(v); + if (intern_string_constants(v, NULL) < 0) { + return -1; + } } else if (PyFrozenSet_CheckExact(v)) { PyObject *w = v; PyObject *tmp = PySequence_Tuple(v); if (tmp == NULL) { - PyErr_Clear(); - continue; + return -1; } - if (intern_string_constants(tmp)) { + int tmp_modified = 0; + if (intern_string_constants(tmp, &tmp_modified) < 0) { + Py_DECREF(tmp); + return -1; + } + if (tmp_modified) { v = PyFrozenSet_New(tmp); if (v == NULL) { - PyErr_Clear(); + Py_DECREF(tmp); + return -1; } - else { - PyTuple_SET_ITEM(tuple, i, v); - Py_DECREF(w); - modified = 1; + + PyTuple_SET_ITEM(tuple, i, v); + Py_DECREF(w); + if (modified) { + *modified = 1; } } Py_DECREF(tmp); } } - return modified; + return 0; } PyCodeObject * @@ -139,11 +150,21 @@ PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount, return NULL; } - intern_strings(names); - intern_strings(varnames); - intern_strings(freevars); - intern_strings(cellvars); - intern_string_constants(consts); + if (intern_strings(names) < 0) { + return NULL; + } + if (intern_strings(varnames) < 0) { + return NULL; + } + if (intern_strings(freevars) < 0) { + return NULL; + } + if (intern_strings(cellvars) < 0) { + return NULL; + } + if (intern_string_constants(consts, NULL) < 0) { + return NULL; + } /* Check for any inner or outer closure references */ n_cellvars = PyTuple_GET_SIZE(cellvars); @@ -199,7 +220,7 @@ PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount, cell2arg = NULL; } } - co = PyObject_NEW(PyCodeObject, &PyCode_Type); + co = PyObject_New(PyCodeObject, &PyCode_Type); if (co == NULL) { if (cell2arg) PyMem_FREE(cell2arg); @@ -396,7 +417,7 @@ validate_and_copy_tuple(PyObject *tup) PyExc_TypeError, "name tuples must contain only " "strings, not '%.500s'", - item->ob_type->tp_name); + Py_TYPE(item)->tp_name); Py_DECREF(newtuple); return NULL; } @@ -513,7 +534,7 @@ code_new(PyTypeObject *type, PyObject *args, PyObject *kw) ourvarnames, ourfreevars, ourcellvars, filename, name, firstlineno, lnotab); - cleanup: + cleanup: Py_XDECREF(ournames); Py_XDECREF(ourvarnames); Py_XDECREF(ourfreevars); @@ -534,7 +555,7 @@ code_dealloc(PyCodeObject *co) co->co_opcache_size = 0; if (co->co_extra != NULL) { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); + PyInterpreterState *interp = _PyInterpreterState_GET(); _PyCodeObjectExtra *co_extra = co->co_extra; for (Py_ssize_t i = 0; i < co_extra->ce_size; i++) { @@ -1053,7 +1074,7 @@ _PyCode_GetExtra(PyObject *code, Py_ssize_t index, void **extra) int _PyCode_SetExtra(PyObject *code, Py_ssize_t index, void *extra) { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); + PyInterpreterState *interp = _PyInterpreterState_GET(); if (!PyCode_Check(code) || index < 0 || index >= interp->co_extra_user_count) { diff --git a/Objects/complexobject.c b/Objects/complexobject.c index e01409b971b0e16a73ae791e0d4467c3aa856bd3..a49037783be777561b013b2898f0965677f55d61 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -6,7 +6,7 @@ /* Submitted by Jim Hugunin */ #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef /*[clinic input] class complex "PyComplexObject *" "&PyComplex_Type" @@ -296,7 +296,7 @@ try_complex_special_method(PyObject *op) if (!PyComplex_Check(res)) { PyErr_Format(PyExc_TypeError, "__complex__ returned non-complex (type %.200s)", - res->ob_type->tp_name); + Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL; } @@ -305,7 +305,7 @@ try_complex_special_method(PyObject *op) "__complex__ returned non-complex (type %.200s). " "The ability to return an instance of a strict subclass of complex " "is deprecated, and may be removed in a future version of Python.", - res->ob_type->tp_name)) { + Py_TYPE(res)->tp_name)) { Py_DECREF(res); return NULL; } @@ -466,9 +466,7 @@ complex_add(PyObject *v, PyObject *w) Py_complex a, b; TO_COMPLEX(v, a); TO_COMPLEX(w, b); - PyFPE_START_PROTECT("complex_add", return 0) result = _Py_c_sum(a, b); - PyFPE_END_PROTECT(result) return PyComplex_FromCComplex(result); } @@ -479,9 +477,7 @@ complex_sub(PyObject *v, PyObject *w) Py_complex a, b; TO_COMPLEX(v, a); TO_COMPLEX(w, b); - PyFPE_START_PROTECT("complex_sub", return 0) result = _Py_c_diff(a, b); - PyFPE_END_PROTECT(result) return PyComplex_FromCComplex(result); } @@ -492,9 +488,7 @@ complex_mul(PyObject *v, PyObject *w) Py_complex a, b; TO_COMPLEX(v, a); TO_COMPLEX(w, b); - PyFPE_START_PROTECT("complex_mul", return 0) result = _Py_c_prod(a, b); - PyFPE_END_PROTECT(result) return PyComplex_FromCComplex(result); } @@ -505,10 +499,8 @@ complex_div(PyObject *v, PyObject *w) Py_complex a, b; TO_COMPLEX(v, a); TO_COMPLEX(w, b); - PyFPE_START_PROTECT("complex_div", return 0) errno = 0; quot = _Py_c_quot(a, b); - PyFPE_END_PROTECT(quot) if (errno == EDOM) { PyErr_SetString(PyExc_ZeroDivisionError, "complex division by zero"); return NULL; @@ -547,7 +539,6 @@ complex_pow(PyObject *v, PyObject *w, PyObject *z) PyErr_SetString(PyExc_ValueError, "complex modulo"); return NULL; } - PyFPE_START_PROTECT("complex_pow", return 0) errno = 0; exponent = b; int_exponent = (long)exponent.real; @@ -556,7 +547,6 @@ complex_pow(PyObject *v, PyObject *w, PyObject *z) else p = _Py_c_pow(a, exponent); - PyFPE_END_PROTECT(p) Py_ADJUST_ERANGE2(p.real, p.imag); if (errno == EDOM) { PyErr_SetString(PyExc_ZeroDivisionError, @@ -604,9 +594,7 @@ complex_abs(PyComplexObject *v) { double result; - PyFPE_START_PROTECT("complex_abs", return 0) result = _Py_c_abs(v->cval); - PyFPE_END_PROTECT(result) if (errno == ERANGE) { PyErr_SetString(PyExc_OverflowError, @@ -970,7 +958,7 @@ complex_new_impl(PyTypeObject *type, PyObject *r, PyObject *i) return NULL; } - nbr = r->ob_type->tp_as_number; + nbr = Py_TYPE(r)->tp_as_number; if (nbr == NULL || (nbr->nb_float == NULL && nbr->nb_index == NULL)) { PyErr_Format(PyExc_TypeError, "complex() first argument must be a string or a number, " @@ -982,7 +970,7 @@ complex_new_impl(PyTypeObject *type, PyObject *r, PyObject *i) return NULL; } if (i != NULL) { - nbi = i->ob_type->tp_as_number; + nbi = Py_TYPE(i)->tp_as_number; if (nbi == NULL || (nbi->nb_float == NULL && nbi->nb_index == NULL)) { PyErr_Format(PyExc_TypeError, "complex() second argument must be a number, " diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 729f42c50c81432f525a5909c467571757b78ed6..fce9cdd309077ea27b435b229cafae4185c06e33 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -1,10 +1,13 @@ /* Descriptors -- a new, flexible way to describe attributes */ #include "Python.h" +#include "pycore_ceval.h" // _Py_EnterRecursiveCall() #include "pycore_object.h" -#include "pycore_pystate.h" +#include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_tupleobject.h" -#include "structmember.h" /* Why is this not included in Python.h? */ +#include "structmember.h" // PyMemberDef + +_Py_IDENTIFIER(getattr); /*[clinic input] class mappingproxy "mappingproxyobject *" "&PyDictProxy_Type" @@ -82,7 +85,7 @@ descr_check(PyDescrObject *descr, PyObject *obj, PyObject **pres) "doesn't apply to a '%.100s' object", descr_name((PyDescrObject *)descr), "?", descr->d_type->tp_name, - obj->ob_type->tp_name); + Py_TYPE(obj)->tp_name); *pres = NULL; return 1; } @@ -95,7 +98,7 @@ classmethod_get(PyMethodDescrObject *descr, PyObject *obj, PyObject *type) /* Ensure a valid type. Class methods ignore obj. */ if (type == NULL) { if (obj != NULL) - type = (PyObject *)obj->ob_type; + type = (PyObject *)Py_TYPE(obj); else { /* Wot - no type?! */ PyErr_Format(PyExc_TypeError, @@ -112,7 +115,7 @@ classmethod_get(PyMethodDescrObject *descr, PyObject *obj, PyObject *type) "needs a type, not a '%.100s' as arg 2", descr_name((PyDescrObject *)descr), "?", PyDescr_TYPE(descr)->tp_name, - type->ob_type->tp_name); + Py_TYPE(type)->tp_name); return NULL; } if (!PyType_IsSubtype((PyTypeObject *)type, PyDescr_TYPE(descr))) { @@ -124,7 +127,11 @@ classmethod_get(PyMethodDescrObject *descr, PyObject *obj, PyObject *type) ((PyTypeObject *)type)->tp_name); return NULL; } - return PyCFunction_NewEx(descr->d_method, type, NULL); + PyTypeObject *cls = NULL; + if (descr->d_method->ml_flags & METH_METHOD) { + cls = descr->d_common.d_type; + } + return PyCMethod_New(descr->d_method, type, NULL, cls); } static PyObject * @@ -134,7 +141,19 @@ method_get(PyMethodDescrObject *descr, PyObject *obj, PyObject *type) if (descr_check((PyDescrObject *)descr, obj, &res)) return res; - return PyCFunction_NewEx(descr->d_method, obj, NULL); + if (descr->d_method->ml_flags & METH_METHOD) { + if (PyType_Check(type)) { + return PyCMethod_New(descr->d_method, obj, NULL, descr->d_common.d_type); + } else { + PyErr_Format(PyExc_TypeError, + "descriptor '%V' needs a type, not '%s', as arg 2", + descr_name((PyDescrObject *)descr), + Py_TYPE(type)->tp_name); + return NULL; + } + } else { + return PyCFunction_NewEx(descr->d_method, obj, NULL); + } } static PyObject * @@ -192,7 +211,7 @@ descr_setcheck(PyDescrObject *descr, PyObject *obj, PyObject *value, "doesn't apply to a '%.100s' object", descr_name(descr), "?", descr->d_type->tp_name, - obj->ob_type->tp_name); + Py_TYPE(obj)->tp_name); *pres = -1; return 1; } @@ -231,49 +250,42 @@ getset_set(PyGetSetDescrObject *descr, PyObject *obj, PyObject *value) * * First, common helpers */ -static const char * -get_name(PyObject *func) { - assert(PyObject_TypeCheck(func, &PyMethodDescr_Type)); - return ((PyMethodDescrObject *)func)->d_method->ml_name; -} - -typedef void (*funcptr)(void); - static inline int method_check_args(PyObject *func, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { assert(!PyErr_Occurred()); - assert(PyObject_TypeCheck(func, &PyMethodDescr_Type)); if (nargs < 1) { - PyErr_Format(PyExc_TypeError, - "descriptor '%.200s' of '%.100s' " - "object needs an argument", - get_name(func), PyDescr_TYPE(func)->tp_name); + PyObject *funcstr = _PyObject_FunctionStr(func); + if (funcstr != NULL) { + PyErr_Format(PyExc_TypeError, + "unbound method %U needs an argument", funcstr); + Py_DECREF(funcstr); + } return -1; } PyObject *self = args[0]; - if (!_PyObject_RealIsSubclass((PyObject *)Py_TYPE(self), - (PyObject *)PyDescr_TYPE(func))) - { - PyErr_Format(PyExc_TypeError, - "descriptor '%.200s' for '%.100s' objects " - "doesn't apply to a '%.100s' object", - get_name(func), PyDescr_TYPE(func)->tp_name, - Py_TYPE(self)->tp_name); + PyObject *dummy; + if (descr_check((PyDescrObject *)func, self, &dummy)) { return -1; } if (kwnames && PyTuple_GET_SIZE(kwnames)) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes no keyword arguments", get_name(func)); + PyObject *funcstr = _PyObject_FunctionStr(func); + if (funcstr != NULL) { + PyErr_Format(PyExc_TypeError, + "%U takes no keyword arguments", funcstr); + Py_DECREF(funcstr); + } return -1; } return 0; } +typedef void (*funcptr)(void); + static inline funcptr -method_enter_call(PyObject *func) +method_enter_call(PyThreadState *tstate, PyObject *func) { - if (Py_EnterRecursiveCall(" while calling a Python object")) { + if (_Py_EnterRecursiveCall(tstate, " while calling a Python object")) { return NULL; } return (funcptr)((PyMethodDescrObject *)func)->d_method->ml_meth; @@ -284,6 +296,7 @@ static PyObject * method_vectorcall_VARARGS( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { + PyThreadState *tstate = _PyThreadState_GET(); Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); if (method_check_args(func, args, nargs, kwnames)) { return NULL; @@ -292,14 +305,14 @@ method_vectorcall_VARARGS( if (argstuple == NULL) { return NULL; } - PyCFunction meth = (PyCFunction)method_enter_call(func); + PyCFunction meth = (PyCFunction)method_enter_call(tstate, func); if (meth == NULL) { Py_DECREF(argstuple); return NULL; } PyObject *result = meth(args[0], argstuple); Py_DECREF(argstuple); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); return result; } @@ -307,6 +320,7 @@ static PyObject * method_vectorcall_VARARGS_KEYWORDS( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { + PyThreadState *tstate = _PyThreadState_GET(); Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); if (method_check_args(func, args, nargs, NULL)) { return NULL; @@ -325,33 +339,54 @@ method_vectorcall_VARARGS_KEYWORDS( } } PyCFunctionWithKeywords meth = (PyCFunctionWithKeywords) - method_enter_call(func); + method_enter_call(tstate, func); if (meth == NULL) { goto exit; } result = meth(args[0], argstuple, kwdict); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); exit: Py_DECREF(argstuple); Py_XDECREF(kwdict); return result; } +static PyObject * +method_vectorcall_FASTCALL_KEYWORDS_METHOD( + PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + PyThreadState *tstate = _PyThreadState_GET(); + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + if (method_check_args(func, args, nargs, NULL)) { + return NULL; + } + PyCMethod meth = (PyCMethod) method_enter_call(tstate, func); + if (meth == NULL) { + return NULL; + } + PyObject *result = meth(args[0], + ((PyMethodDescrObject *)func)->d_common.d_type, + args+1, nargs-1, kwnames); + Py_LeaveRecursiveCall(); + return result; +} + static PyObject * method_vectorcall_FASTCALL( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { + PyThreadState *tstate = _PyThreadState_GET(); Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); if (method_check_args(func, args, nargs, kwnames)) { return NULL; } _PyCFunctionFast meth = (_PyCFunctionFast) - method_enter_call(func); + method_enter_call(tstate, func); if (meth == NULL) { return NULL; } PyObject *result = meth(args[0], args+1, nargs-1); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); return result; } @@ -359,17 +394,18 @@ static PyObject * method_vectorcall_FASTCALL_KEYWORDS( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { + PyThreadState *tstate = _PyThreadState_GET(); Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); if (method_check_args(func, args, nargs, NULL)) { return NULL; } _PyCFunctionFastWithKeywords meth = (_PyCFunctionFastWithKeywords) - method_enter_call(func); + method_enter_call(tstate, func); if (meth == NULL) { return NULL; } PyObject *result = meth(args[0], args+1, nargs-1, kwnames); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); return result; } @@ -377,21 +413,26 @@ static PyObject * method_vectorcall_NOARGS( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { + PyThreadState *tstate = _PyThreadState_GET(); Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); if (method_check_args(func, args, nargs, kwnames)) { return NULL; } if (nargs != 1) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes no arguments (%zd given)", get_name(func), nargs-1); + PyObject *funcstr = _PyObject_FunctionStr(func); + if (funcstr != NULL) { + PyErr_Format(PyExc_TypeError, + "%U takes no arguments (%zd given)", funcstr, nargs-1); + Py_DECREF(funcstr); + } return NULL; } - PyCFunction meth = (PyCFunction)method_enter_call(func); + PyCFunction meth = (PyCFunction)method_enter_call(tstate, func); if (meth == NULL) { return NULL; } PyObject *result = meth(args[0], NULL); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); return result; } @@ -399,36 +440,44 @@ static PyObject * method_vectorcall_O( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { + PyThreadState *tstate = _PyThreadState_GET(); Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); if (method_check_args(func, args, nargs, kwnames)) { return NULL; } if (nargs != 2) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes exactly one argument (%zd given)", - get_name(func), nargs-1); + PyObject *funcstr = _PyObject_FunctionStr(func); + if (funcstr != NULL) { + PyErr_Format(PyExc_TypeError, + "%U takes exactly one argument (%zd given)", + funcstr, nargs-1); + Py_DECREF(funcstr); + } return NULL; } - PyCFunction meth = (PyCFunction)method_enter_call(func); + PyCFunction meth = (PyCFunction)method_enter_call(tstate, func); if (meth == NULL) { return NULL; } PyObject *result = meth(args[0], args[1]); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); return result; } +/* Instances of classmethod_descriptor are unlikely to be called directly. + For one, the analogous class "classmethod" (for Python classes) is not + callable. Second, users are not likely to access a classmethod_descriptor + directly, since it means pulling it from the class __dict__. + + This is just an excuse to say that this doesn't need to be optimized: + we implement this simply by calling __get__ and then calling the result. +*/ static PyObject * classmethoddescr_call(PyMethodDescrObject *descr, PyObject *args, PyObject *kwds) { - Py_ssize_t argc; - PyObject *self, *result; - - /* Make sure that the first argument is acceptable as 'self' */ - assert(PyTuple_Check(args)); - argc = PyTuple_GET_SIZE(args); + Py_ssize_t argc = PyTuple_GET_SIZE(args); if (argc < 1) { PyErr_Format(PyExc_TypeError, "descriptor '%V' of '%.100s' " @@ -437,30 +486,15 @@ classmethoddescr_call(PyMethodDescrObject *descr, PyObject *args, PyDescr_TYPE(descr)->tp_name); return NULL; } - self = PyTuple_GET_ITEM(args, 0); - if (!PyType_Check(self)) { - PyErr_Format(PyExc_TypeError, - "descriptor '%V' requires a type " - "but received a '%.100s' instance", - descr_name((PyDescrObject *)descr), "?", - self->ob_type->tp_name); - return NULL; - } - if (!PyType_IsSubtype((PyTypeObject *)self, PyDescr_TYPE(descr))) { - PyErr_Format(PyExc_TypeError, - "descriptor '%V' requires a subtype of '%.100s' " - "but received '%.100s'", - descr_name((PyDescrObject *)descr), "?", - PyDescr_TYPE(descr)->tp_name, - ((PyTypeObject*)self)->tp_name); + PyObject *self = PyTuple_GET_ITEM(args, 0); + PyObject *bound = classmethod_get(descr, NULL, self); + if (bound == NULL) { return NULL; } - - result = _PyMethodDef_RawFastCallDict(descr->d_method, self, - &_PyTuple_ITEMS(args)[1], argc - 1, - kwds); - result = _Py_CheckFunctionResult((PyObject *)descr, result, NULL); - return result; + PyObject *res = PyObject_VectorcallDict(bound, _PyTuple_ITEMS(args)+1, + argc-1, kwds); + Py_DECREF(bound); + return res; } Py_LOCAL_INLINE(PyObject *) @@ -509,7 +543,7 @@ wrapperdescr_call(PyWrapperDescrObject *descr, PyObject *args, PyObject *kwds) "but received a '%.100s'", descr_name((PyDescrObject *)descr), "?", PyDescr_TYPE(descr)->tp_name, - self->ob_type->tp_name); + Py_TYPE(self)->tp_name); return NULL; } @@ -576,7 +610,6 @@ descr_get_qualname(PyDescrObject *descr, void *Py_UNUSED(ignored)) static PyObject * descr_reduce(PyDescrObject *descr, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(getattr); return Py_BuildValue("N(OO)", _PyEval_GetBuiltinId(&PyId_getattr), PyDescr_TYPE(descr), PyDescr_NAME(descr)); } @@ -677,7 +710,7 @@ PyTypeObject PyMethodDescr_Type = { 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | - _Py_TPFLAGS_HAVE_VECTORCALL | + Py_TPFLAGS_HAVE_VECTORCALL | Py_TPFLAGS_METHOD_DESCRIPTOR, /* tp_flags */ 0, /* tp_doc */ descr_traverse, /* tp_traverse */ @@ -871,7 +904,8 @@ PyDescr_NewMethod(PyTypeObject *type, PyMethodDef *method) { /* Figure out correct vectorcall function to use */ vectorcallfunc vectorcall; - switch (method->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS)) + switch (method->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | + METH_O | METH_KEYWORDS | METH_METHOD)) { case METH_VARARGS: vectorcall = method_vectorcall_VARARGS; @@ -891,6 +925,9 @@ PyDescr_NewMethod(PyTypeObject *type, PyMethodDef *method) case METH_O: vectorcall = method_vectorcall_O; break; + case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: + vectorcall = method_vectorcall_FASTCALL_KEYWORDS_METHOD; + break; default: PyErr_Format(PyExc_SystemError, "%s() method: bad call flags", method->ml_name); @@ -987,6 +1024,30 @@ static PyMappingMethods mappingproxy_as_mapping = { 0, /* mp_ass_subscript */ }; +static PyObject * +mappingproxy_or(PyObject *left, PyObject *right) +{ + if (PyObject_TypeCheck(left, &PyDictProxy_Type)) { + left = ((mappingproxyobject*)left)->mapping; + } + if (PyObject_TypeCheck(right, &PyDictProxy_Type)) { + right = ((mappingproxyobject*)right)->mapping; + } + return PyNumber_Or(left, right); +} + +static PyObject * +mappingproxy_ior(PyObject *self, PyObject *Py_UNUSED(other)) +{ + return PyErr_Format(PyExc_TypeError, + "'|=' is not supported by %s; use '|' instead", Py_TYPE(self)->tp_name); +} + +static PyNumberMethods mappingproxy_as_number = { + .nb_or = mappingproxy_or, + .nb_inplace_or = mappingproxy_ior, +}; + static int mappingproxy_contains(mappingproxyobject *pp, PyObject *key) { @@ -1010,50 +1071,64 @@ static PySequenceMethods mappingproxy_as_sequence = { }; static PyObject * -mappingproxy_get(mappingproxyobject *pp, PyObject *args) +mappingproxy_get(mappingproxyobject *pp, PyObject *const *args, Py_ssize_t nargs) { - PyObject *key, *def = Py_None; - _Py_IDENTIFIER(get); + /* newargs: mapping, key, default=None */ + PyObject *newargs[3]; + newargs[0] = pp->mapping; + newargs[2] = Py_None; - if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &def)) + if (!_PyArg_UnpackStack(args, nargs, "get", 1, 2, + &newargs[1], &newargs[2])) + { return NULL; - return _PyObject_CallMethodIdObjArgs(pp->mapping, &PyId_get, - key, def, NULL); + } + _Py_IDENTIFIER(get); + return _PyObject_VectorcallMethodId(&PyId_get, newargs, + 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, + NULL); } static PyObject * mappingproxy_keys(mappingproxyobject *pp, PyObject *Py_UNUSED(ignored)) { _Py_IDENTIFIER(keys); - return _PyObject_CallMethodId(pp->mapping, &PyId_keys, NULL); + return _PyObject_CallMethodIdNoArgs(pp->mapping, &PyId_keys); } static PyObject * mappingproxy_values(mappingproxyobject *pp, PyObject *Py_UNUSED(ignored)) { _Py_IDENTIFIER(values); - return _PyObject_CallMethodId(pp->mapping, &PyId_values, NULL); + return _PyObject_CallMethodIdNoArgs(pp->mapping, &PyId_values); } static PyObject * mappingproxy_items(mappingproxyobject *pp, PyObject *Py_UNUSED(ignored)) { _Py_IDENTIFIER(items); - return _PyObject_CallMethodId(pp->mapping, &PyId_items, NULL); + return _PyObject_CallMethodIdNoArgs(pp->mapping, &PyId_items); } static PyObject * mappingproxy_copy(mappingproxyobject *pp, PyObject *Py_UNUSED(ignored)) { _Py_IDENTIFIER(copy); - return _PyObject_CallMethodId(pp->mapping, &PyId_copy, NULL); + return _PyObject_CallMethodIdNoArgs(pp->mapping, &PyId_copy); +} + +static PyObject * +mappingproxy_reversed(mappingproxyobject *pp, PyObject *Py_UNUSED(ignored)) +{ + _Py_IDENTIFIER(__reversed__); + return _PyObject_CallMethodIdNoArgs(pp->mapping, &PyId___reversed__); } /* WARNING: mappingproxy methods must not give access to the underlying mapping */ static PyMethodDef mappingproxy_methods[] = { - {"get", (PyCFunction)mappingproxy_get, METH_VARARGS, + {"get", (PyCFunction)(void(*)(void))mappingproxy_get, METH_FASTCALL, PyDoc_STR("D.get(k[,d]) -> D[k] if k in D, else d." " d defaults to None.")}, {"keys", (PyCFunction)mappingproxy_keys, METH_NOARGS, @@ -1064,6 +1139,10 @@ static PyMethodDef mappingproxy_methods[] = { PyDoc_STR("D.items() -> list of D's (key, value) pairs, as 2-tuples")}, {"copy", (PyCFunction)mappingproxy_copy, METH_NOARGS, PyDoc_STR("D.copy() -> a shallow copy of D")}, + {"__class_getitem__", (PyCFunction)Py_GenericAlias, METH_O|METH_CLASS, + PyDoc_STR("See PEP 585")}, + {"__reversed__", (PyCFunction)mappingproxy_reversed, METH_NOARGS, + PyDoc_STR("D.__reversed__() -> reverse iterator")}, {0} }; @@ -1176,7 +1255,7 @@ typedef struct { PyObject *self; } wrapperobject; -#define Wrapper_Check(v) (Py_TYPE(v) == &_PyMethodWrapper_Type) +#define Wrapper_Check(v) Py_IS_TYPE(v, &_PyMethodWrapper_Type) static void wrapper_dealloc(wrapperobject *wp) @@ -1232,14 +1311,13 @@ wrapper_repr(wrapperobject *wp) { return PyUnicode_FromFormat("", wp->descr->d_base->name, - wp->self->ob_type->tp_name, + Py_TYPE(wp->self)->tp_name, wp->self); } static PyObject * wrapper_reduce(wrapperobject *wp, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(getattr); return Py_BuildValue("N(OO)", _PyEval_GetBuiltinId(&PyId_getattr), wp->self, PyDescr_NAME(wp->descr)); } @@ -1475,7 +1553,7 @@ property_dealloc(PyObject *self) Py_XDECREF(gs->prop_set); Py_XDECREF(gs->prop_del); Py_XDECREF(gs->prop_doc); - self->ob_type->tp_free(self); + Py_TYPE(self)->tp_free(self); } static PyObject * @@ -1492,8 +1570,7 @@ property_descr_get(PyObject *self, PyObject *obj, PyObject *type) return NULL; } - PyObject *args[1] = {obj}; - return _PyObject_FastCall(gs->prop_get, args, 1); + return PyObject_CallOneArg(gs->prop_get, obj); } static int @@ -1514,7 +1591,7 @@ property_descr_set(PyObject *self, PyObject *obj, PyObject *value) return -1; } if (value == NULL) - res = PyObject_CallFunctionObjArgs(func, obj, NULL); + res = PyObject_CallOneArg(func, obj); else res = PyObject_CallFunctionObjArgs(func, obj, value, NULL); if (res == NULL) @@ -1628,7 +1705,7 @@ property_init_impl(propertyobject *self, PyObject *fget, PyObject *fset, if (rc <= 0) { return rc; } - if (Py_TYPE(self) == &PyProperty_Type) { + if (Py_IS_TYPE(self, &PyProperty_Type)) { Py_XSETREF(self->prop_doc, get_doc); } else { @@ -1717,7 +1794,7 @@ PyTypeObject PyDictProxy_Type = { 0, /* tp_setattr */ 0, /* tp_as_async */ (reprfunc)mappingproxy_repr, /* tp_repr */ - 0, /* tp_as_number */ + &mappingproxy_as_number, /* tp_as_number */ &mappingproxy_as_sequence, /* tp_as_sequence */ &mappingproxy_as_mapping, /* tp_as_mapping */ 0, /* tp_hash */ diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 3c56f4a515e8a46be237dfc121866de0709e0789..8a056530a454593aec872222a569afc3bb904637 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -111,10 +111,11 @@ converting the dict to the combined table. #define PyDict_MINSIZE 8 #include "Python.h" +#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() #include "pycore_object.h" -#include "pycore_pystate.h" +#include "pycore_pystate.h" // _PyThreadState_GET() #include "dict-common.h" -#include "stringlib/eq.h" /* to get unicode_eq() */ +#include "stringlib/eq.h" // unicode_eq() /*[clinic input] class dict "PyDictObject *" "&PyDict_Type" @@ -249,42 +250,46 @@ static uint64_t pydict_global_version = 0; #ifndef PyDict_MAXFREELIST #define PyDict_MAXFREELIST 80 #endif + +#if PyDict_MAXFREELIST > 0 static PyDictObject *free_list[PyDict_MAXFREELIST]; static int numfree = 0; static PyDictKeysObject *keys_free_list[PyDict_MAXFREELIST]; static int numfreekeys = 0; +#endif #include "clinic/dictobject.c.h" -int -PyDict_ClearFreeList(void) +void +_PyDict_ClearFreeList(void) { - PyDictObject *op; - int ret = numfree + numfreekeys; +#if PyDict_MAXFREELIST > 0 while (numfree) { - op = free_list[--numfree]; + PyDictObject *op = free_list[--numfree]; assert(PyDict_CheckExact(op)); PyObject_GC_Del(op); } while (numfreekeys) { PyObject_FREE(keys_free_list[--numfreekeys]); } - return ret; +#endif } /* Print summary info about the state of the optimized allocator */ void _PyDict_DebugMallocStats(FILE *out) { +#if PyDict_MAXFREELIST > 0 _PyDebugAllocatorStats(out, "free PyDictObject", numfree, sizeof(PyDictObject)); +#endif } void -PyDict_Fini(void) +_PyDict_Fini(void) { - PyDict_ClearFreeList(); + _PyDict_ClearFreeList(); } #define DK_SIZE(dk) ((dk)->dk_size) @@ -311,7 +316,9 @@ static void free_keys_object(PyDictKeysObject *keys); static inline void dictkeys_incref(PyDictKeysObject *dk) { - _Py_INC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal++; +#endif dk->dk_refcnt++; } @@ -319,7 +326,9 @@ static inline void dictkeys_decref(PyDictKeysObject *dk) { assert(dk->dk_refcnt > 0); - _Py_DEC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal--; +#endif if (--dk->dk_refcnt == 0) { free_keys_object(dk); } @@ -327,27 +336,27 @@ dictkeys_decref(PyDictKeysObject *dk) /* lookup indices. returns DKIX_EMPTY, DKIX_DUMMY, or ix >=0 */ static inline Py_ssize_t -dictkeys_get_index(PyDictKeysObject *keys, Py_ssize_t i) +dictkeys_get_index(const PyDictKeysObject *keys, Py_ssize_t i) { Py_ssize_t s = DK_SIZE(keys); Py_ssize_t ix; if (s <= 0xff) { - int8_t *indices = (int8_t*)(keys->dk_indices); + const int8_t *indices = (const int8_t*)(keys->dk_indices); ix = indices[i]; } else if (s <= 0xffff) { - int16_t *indices = (int16_t*)(keys->dk_indices); + const int16_t *indices = (const int16_t*)(keys->dk_indices); ix = indices[i]; } #if SIZEOF_VOID_P > 4 else if (s > 0xffffffff) { - int64_t *indices = (int64_t*)(keys->dk_indices); + const int64_t *indices = (const int64_t*)(keys->dk_indices); ix = indices[i]; } #endif else { - int32_t *indices = (int32_t*)(keys->dk_indices); + const int32_t *indices = (const int32_t*)(keys->dk_indices); ix = indices[i]; } assert(ix >= DKIX_DUMMY); @@ -551,10 +560,13 @@ static PyDictKeysObject *new_keys_object(Py_ssize_t size) es = sizeof(Py_ssize_t); } +#if PyDict_MAXFREELIST > 0 if (size == PyDict_MINSIZE && numfreekeys > 0) { dk = keys_free_list[--numfreekeys]; } - else { + else +#endif + { dk = PyObject_MALLOC(sizeof(PyDictKeysObject) + es * size + sizeof(PyDictKeyEntry) * usable); @@ -563,7 +575,9 @@ static PyDictKeysObject *new_keys_object(Py_ssize_t size) return NULL; } } - _Py_INC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal++; +#endif dk->dk_refcnt = 1; dk->dk_size = size; dk->dk_usable = usable; @@ -583,10 +597,12 @@ free_keys_object(PyDictKeysObject *keys) Py_XDECREF(entries[i].me_key); Py_XDECREF(entries[i].me_value); } +#if PyDict_MAXFREELIST > 0 if (keys->dk_size == PyDict_MINSIZE && numfreekeys < PyDict_MAXFREELIST) { keys_free_list[numfreekeys++] = keys; return; } +#endif PyObject_FREE(keys); } @@ -599,13 +615,16 @@ new_dict(PyDictKeysObject *keys, PyObject **values) { PyDictObject *mp; assert(keys != NULL); +#if PyDict_MAXFREELIST > 0 if (numfree) { mp = free_list[--numfree]; assert (mp != NULL); - assert (Py_TYPE(mp) == &PyDict_Type); + assert (Py_IS_TYPE(mp, &PyDict_Type)); _Py_NewReference((PyObject *)mp); } - else { + else +#endif + { mp = PyObject_GC_New(PyDictObject, &PyDict_Type); if (mp == NULL) { dictkeys_decref(keys); @@ -687,10 +706,12 @@ clone_combined_dict(PyDictObject *orig) } /* Since we copied the keys table we now have an extra reference - in the system. Manually call _Py_INC_REFTOTAL to signal that + in the system. Manually call increment _Py_RefTotal to signal that we have it now; calling dictkeys_incref would be an error as keys->dk_refcnt is already set to 1 (after memcpy). */ - _Py_INC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal++; +#endif return (PyObject *)new; } @@ -1249,13 +1270,18 @@ dictresize(PyDictObject *mp, Py_ssize_t minsize) assert(oldkeys->dk_lookup != lookdict_split); assert(oldkeys->dk_refcnt == 1); +#ifdef Py_REF_DEBUG + _Py_RefTotal--; +#endif +#if PyDict_MAXFREELIST > 0 if (oldkeys->dk_size == PyDict_MINSIZE && - numfreekeys < PyDict_MAXFREELIST) { - _Py_DEC_REFTOTAL; + numfreekeys < PyDict_MAXFREELIST) + { keys_free_list[numfreekeys++] = oldkeys; } - else { - _Py_DEC_REFTOTAL; + else +#endif + { PyObject_FREE(oldkeys); } } @@ -1460,7 +1486,9 @@ _PyDict_GetItemIdWithError(PyObject *dp, struct _Py_Identifier *key) kv = _PyUnicode_FromId(key); /* borrowed */ if (kv == NULL) return NULL; - return PyDict_GetItemWithError(dp, kv); + Py_hash_t hash = ((PyASCIIObject *) kv)->hash; + assert (hash != -1); /* interned strings have their hash value initialised */ + return _PyDict_GetItem_KnownHash(dp, kv, hash); } PyObject * @@ -1997,10 +2025,15 @@ dict_dealloc(PyDictObject *mp) assert(keys->dk_refcnt == 1); dictkeys_decref(keys); } - if (numfree < PyDict_MAXFREELIST && Py_TYPE(mp) == &PyDict_Type) +#if PyDict_MAXFREELIST > 0 + if (numfree < PyDict_MAXFREELIST && Py_IS_TYPE(mp, &PyDict_Type)) { free_list[numfree++] = mp; + } else +#endif + { Py_TYPE(mp)->tp_free((PyObject *)mp); + } Py_TRASHCAN_END } @@ -2117,8 +2150,7 @@ dict_subscript(PyDictObject *mp, PyObject *key) _Py_IDENTIFIER(__missing__); missing = _PyObject_LookupSpecial((PyObject *)mp, &PyId___missing__); if (missing != NULL) { - res = PyObject_CallFunctionObjArgs(missing, - key, NULL); + res = PyObject_CallOneArg(missing, key); Py_DECREF(missing); return res; } @@ -2311,6 +2343,25 @@ dict_fromkeys_impl(PyTypeObject *type, PyObject *iterable, PyObject *value) return _PyDict_FromKeys((PyObject *)type, iterable, value); } +/* Single-arg dict update; used by dict_update_common and operators. */ +static int +dict_update_arg(PyObject *self, PyObject *arg) +{ + if (PyDict_CheckExact(arg)) { + return PyDict_Merge(self, arg, 1); + } + _Py_IDENTIFIER(keys); + PyObject *func; + if (_PyObject_LookupAttrId(arg, &PyId_keys, &func) < 0) { + return -1; + } + if (func != NULL) { + Py_DECREF(func); + return PyDict_Merge(self, arg, 1); + } + return PyDict_MergeFromSeq2(self, arg, 1); +} + static int dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, const char *methname) @@ -2322,18 +2373,7 @@ dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, result = -1; } else if (arg != NULL) { - _Py_IDENTIFIER(keys); - PyObject *func; - if (_PyObject_LookupAttrId(arg, &PyId_keys, &func) < 0) { - result = -1; - } - else if (func != NULL) { - Py_DECREF(func); - result = PyDict_Merge(self, arg, 1); - } - else { - result = PyDict_MergeFromSeq2(self, arg, 1); - } + result = dict_update_arg(self, arg); } if (result == 0 && kwds != NULL) { @@ -2993,37 +3033,23 @@ dict_clear(PyDictObject *mp, PyObject *Py_UNUSED(ignored)) Py_RETURN_NONE; } -/* -We don't use Argument Clinic for dict.pop because it doesn't support -custom signature for now. -*/ -PyDoc_STRVAR(dict_pop__doc__, -"D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n\ -If key is not found, d is returned if given, otherwise KeyError is raised"); +/*[clinic input] +dict.pop -#define DICT_POP_METHODDEF \ - {"pop", (PyCFunction)(void(*)(void))dict_pop, METH_FASTCALL, dict_pop__doc__}, + key: object + default: object = NULL + / -static PyObject * -dict_pop(PyDictObject *self, PyObject *const *args, Py_ssize_t nargs) -{ - PyObject *return_value = NULL; - PyObject *key; - PyObject *default_value = NULL; +D.pop(k[,d]) -> v, remove specified key and return the corresponding value. - if (!_PyArg_CheckPositional("pop", nargs, 1, 2)) { - goto exit; - } - key = args[0]; - if (nargs < 2) { - goto skip_optional; - } - default_value = args[1]; -skip_optional: - return_value = _PyDict_Pop((PyObject*)self, key, default_value); +If key is not found, default is returned if given, otherwise KeyError is raised +[clinic start generated code]*/ -exit: - return return_value; +static PyObject * +dict_pop_impl(PyDictObject *self, PyObject *key, PyObject *default_value) +/*[clinic end generated code: output=3abb47b89f24c21c input=eeebec7812190348]*/ +{ + return _PyDict_Pop((PyObject*)self, key, default_value); } /*[clinic input] @@ -3169,6 +3195,33 @@ dict_sizeof(PyDictObject *mp, PyObject *Py_UNUSED(ignored)) return PyLong_FromSsize_t(_PyDict_SizeOf(mp)); } +static PyObject * +dict_or(PyObject *self, PyObject *other) +{ + if (!PyDict_Check(self) || !PyDict_Check(other)) { + Py_RETURN_NOTIMPLEMENTED; + } + PyObject *new = PyDict_Copy(self); + if (new == NULL) { + return NULL; + } + if (dict_update_arg(new, other)) { + Py_DECREF(new); + return NULL; + } + return new; +} + +static PyObject * +dict_ior(PyObject *self, PyObject *other) +{ + if (dict_update_arg(self, other)) { + return NULL; + } + Py_INCREF(self); + return self; +} + PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]"); PyDoc_STRVAR(sizeof__doc__, @@ -3222,6 +3275,7 @@ static PyMethodDef mapp_methods[] = { {"copy", (PyCFunction)dict_copy, METH_NOARGS, copy__doc__}, DICT___REVERSED___METHODDEF + {"__class_getitem__", (PyCFunction)Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* sentinel */ }; @@ -3274,6 +3328,11 @@ static PySequenceMethods dict_as_sequence = { 0, /* sq_inplace_repeat */ }; +static PyNumberMethods dict_as_number = { + .nb_or = dict_or, + .nb_inplace_or = dict_ior, +}; + static PyObject * dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { @@ -3307,6 +3366,38 @@ dict_init(PyObject *self, PyObject *args, PyObject *kwds) return dict_update_common(self, args, kwds, "dict"); } +static PyObject * +dict_vectorcall(PyObject *type, PyObject * const*args, + size_t nargsf, PyObject *kwnames) +{ + assert(PyType_Check(type)); + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + if (!_PyArg_CheckPositional("dict", nargs, 0, 1)) { + return NULL; + } + + PyObject *self = dict_new((PyTypeObject *)type, NULL, NULL); + if (self == NULL) { + return NULL; + } + if (nargs == 1) { + if (dict_update_arg(self, args[0]) < 0) { + Py_DECREF(self); + return NULL; + } + args++; + } + if (kwnames != NULL) { + for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(kwnames); i++) { + if (PyDict_SetItem(self, PyTuple_GET_ITEM(kwnames, i), args[i]) < 0) { + Py_DECREF(self); + return NULL; + } + } + } + return self; +} + static PyObject * dict_iter(PyDictObject *dict) { @@ -3335,7 +3426,7 @@ PyTypeObject PyDict_Type = { 0, /* tp_setattr */ 0, /* tp_as_async */ (reprfunc)dict_repr, /* tp_repr */ - 0, /* tp_as_number */ + &dict_as_number, /* tp_as_number */ &dict_as_sequence, /* tp_as_sequence */ &dict_as_mapping, /* tp_as_mapping */ PyObject_HashNotImplemented, /* tp_hash */ @@ -3365,6 +3456,7 @@ PyTypeObject PyDict_Type = { PyType_GenericAlloc, /* tp_alloc */ dict_new, /* tp_new */ PyObject_GC_Del, /* tp_free */ + .tp_vectorcall = dict_vectorcall, }; PyObject * @@ -3769,6 +3861,11 @@ dictiter_iternextitem(dictiterobject *di) Py_INCREF(result); Py_DECREF(oldkey); Py_DECREF(oldvalue); + // bpo-42536: The GC may have untracked this result tuple. Since we're + // recycling it, make sure it's tracked again: + if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } } else { result = PyTuple_New(2); @@ -3864,15 +3961,15 @@ dictreviter_iternext(dictiterobject *di) di->di_pos = i-1; di->len--; - if (Py_TYPE(di) == &PyDictRevIterKey_Type) { + if (Py_IS_TYPE(di, &PyDictRevIterKey_Type)) { Py_INCREF(key); return key; } - else if (Py_TYPE(di) == &PyDictRevIterValue_Type) { + else if (Py_IS_TYPE(di, &PyDictRevIterValue_Type)) { Py_INCREF(value); return value; } - else if (Py_TYPE(di) == &PyDictRevIterItem_Type) { + else if (Py_IS_TYPE(di, &PyDictRevIterItem_Type)) { Py_INCREF(key); Py_INCREF(value); result = di->di_result; @@ -3884,6 +3981,11 @@ dictreviter_iternext(dictiterobject *di) Py_INCREF(result); Py_DECREF(oldkey); Py_DECREF(oldvalue); + // bpo-42536: The GC may have untracked this result tuple. Since + // we're recycling it, make sure it's tracked again: + if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } } else { result = PyTuple_New(2); @@ -4015,7 +4117,7 @@ _PyDictView_New(PyObject *dict, PyTypeObject *type) /* XXX Get rid of this restriction later */ PyErr_Format(PyExc_TypeError, "%s() requires a dict argument, not '%s'", - type->tp_name, dict->ob_type->tp_name); + type->tp_name, Py_TYPE(dict)->tp_name); return NULL; } dv = PyObject_GC_New(_PyDictViewObject, type); @@ -4174,17 +4276,34 @@ static PySequenceMethods dictkeys_as_sequence = { (objobjproc)dictkeys_contains, /* sq_contains */ }; +// Create an set object from dictviews object. +// Returns a new reference. +// This utility function is used by set operations. static PyObject* -dictviews_sub(PyObject* self, PyObject *other) -{ - PyObject *result = PySet_New(self); - PyObject *tmp; - _Py_IDENTIFIER(difference_update); +dictviews_to_set(PyObject *self) +{ + PyObject *left = self; + if (PyDictKeys_Check(self)) { + // PySet_New() has fast path for the dict object. + PyObject *dict = (PyObject *)((_PyDictViewObject *)self)->dv_dict; + if (PyDict_CheckExact(dict)) { + left = dict; + } + } + return PySet_New(left); +} - if (result == NULL) +static PyObject* +dictviews_sub(PyObject *self, PyObject *other) +{ + PyObject *result = dictviews_to_set(self); + if (result == NULL) { return NULL; + } - tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_difference_update, other, NULL); + _Py_IDENTIFIER(difference_update); + PyObject *tmp = _PyObject_CallMethodIdOneArg( + result, &PyId_difference_update, other); if (tmp == NULL) { Py_DECREF(result); return NULL; @@ -4194,57 +4313,120 @@ dictviews_sub(PyObject* self, PyObject *other) return result; } -PyObject* +static int +dictitems_contains(_PyDictViewObject *dv, PyObject *obj); + +PyObject * _PyDictView_Intersect(PyObject* self, PyObject *other) { - PyObject *result = PySet_New(self); - PyObject *tmp; - _Py_IDENTIFIER(intersection_update); + PyObject *result; + PyObject *it; + PyObject *key; + Py_ssize_t len_self; + int rv; + int (*dict_contains)(_PyDictViewObject *, PyObject *); + + /* Python interpreter swaps parameters when dict view + is on right side of & */ + if (!PyDictViewSet_Check(self)) { + PyObject *tmp = other; + other = self; + self = tmp; + } + + len_self = dictview_len((_PyDictViewObject *)self); + /* if other is a set and self is smaller than other, + reuse set intersection logic */ + if (Py_IS_TYPE(other, &PySet_Type) && len_self <= PyObject_Size(other)) { + _Py_IDENTIFIER(intersection); + return _PyObject_CallMethodIdObjArgs(other, &PyId_intersection, self, NULL); + } + + /* if other is another dict view, and it is bigger than self, + swap them */ + if (PyDictViewSet_Check(other)) { + Py_ssize_t len_other = dictview_len((_PyDictViewObject *)other); + if (len_other > len_self) { + PyObject *tmp = other; + other = self; + self = tmp; + } + } + + /* at this point, two things should be true + 1. self is a dictview + 2. if other is a dictview then it is smaller than self */ + result = PySet_New(NULL); if (result == NULL) return NULL; - tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_intersection_update, other, NULL); - if (tmp == NULL) { + it = PyObject_GetIter(other); + if (it == NULL) { Py_DECREF(result); return NULL; } - Py_DECREF(tmp); + if (PyDictKeys_Check(self)) { + dict_contains = dictkeys_contains; + } + /* else PyDictItems_Check(self) */ + else { + dict_contains = dictitems_contains; + } + + while ((key = PyIter_Next(it)) != NULL) { + rv = dict_contains((_PyDictViewObject *)self, key); + if (rv < 0) { + goto error; + } + if (rv) { + if (PySet_Add(result, key)) { + goto error; + } + } + Py_DECREF(key); + } + Py_DECREF(it); + if (PyErr_Occurred()) { + Py_DECREF(result); + return NULL; + } return result; + +error: + Py_DECREF(it); + Py_DECREF(result); + Py_DECREF(key); + return NULL; } static PyObject* dictviews_or(PyObject* self, PyObject *other) { - PyObject *result = PySet_New(self); - PyObject *tmp; - _Py_IDENTIFIER(update); - - if (result == NULL) + PyObject *result = dictviews_to_set(self); + if (result == NULL) { return NULL; + } - tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_update, other, NULL); - if (tmp == NULL) { + if (_PySet_Update(result, other) < 0) { Py_DECREF(result); return NULL; } - - Py_DECREF(tmp); return result; } static PyObject* dictviews_xor(PyObject* self, PyObject *other) { - PyObject *result = PySet_New(self); - PyObject *tmp; - _Py_IDENTIFIER(symmetric_difference_update); - - if (result == NULL) + PyObject *result = dictviews_to_set(self); + if (result == NULL) { return NULL; + } - tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_symmetric_difference_update, other, NULL); + _Py_IDENTIFIER(symmetric_difference_update); + PyObject *tmp = _PyObject_CallMethodIdOneArg( + result, &PyId_symmetric_difference_update, other); if (tmp == NULL) { Py_DECREF(result); return NULL; @@ -4417,7 +4599,7 @@ dictitems_contains(_PyDictViewObject *dv, PyObject *obj) return 0; } Py_INCREF(found); - result = PyObject_RichCompareBool(value, found, Py_EQ); + result = PyObject_RichCompareBool(found, value, Py_EQ); Py_DECREF(found); return result; } diff --git a/Objects/enumobject.c b/Objects/enumobject.c index 4786297c41ace0d904eb26d85321e4cff5804783..bdd0ea5f3971be2a30199df7138ad9f62b090247 100644 --- a/Objects/enumobject.c +++ b/Objects/enumobject.c @@ -1,6 +1,7 @@ /* enumerate object */ #include "Python.h" +#include "pycore_object.h" // _PyObject_GC_TRACK() #include "clinic/enumobject.c.h" @@ -122,7 +123,7 @@ enum_next_long(enumobject *en, PyObject* next_item) } en->en_longindex = stepped_up; - if (result->ob_refcnt == 1) { + if (Py_REFCNT(result) == 1) { Py_INCREF(result); old_index = PyTuple_GET_ITEM(result, 0); old_item = PyTuple_GET_ITEM(result, 1); @@ -130,6 +131,11 @@ enum_next_long(enumobject *en, PyObject* next_item) PyTuple_SET_ITEM(result, 1, next_item); Py_DECREF(old_index); Py_DECREF(old_item); + // bpo-42536: The GC may have untracked this result tuple. Since we're + // recycling it, make sure it's tracked again: + if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } return result; } result = PyTuple_New(2); @@ -167,7 +173,7 @@ enum_next(enumobject *en) } en->en_index++; - if (result->ob_refcnt == 1) { + if (Py_REFCNT(result) == 1) { Py_INCREF(result); old_index = PyTuple_GET_ITEM(result, 0); old_item = PyTuple_GET_ITEM(result, 1); @@ -175,6 +181,11 @@ enum_next(enumobject *en) PyTuple_SET_ITEM(result, 1, next_item); Py_DECREF(old_index); Py_DECREF(old_item); + // bpo-42536: The GC may have untracked this result tuple. Since we're + // recycling it, make sure it's tracked again: + if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } return result; } result = PyTuple_New(2); @@ -201,6 +212,8 @@ PyDoc_STRVAR(reduce_doc, "Return state information for pickling."); static PyMethodDef enum_methods[] = { {"__reduce__", (PyCFunction)enum_reduce, METH_NOARGS, reduce_doc}, + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* sentinel */ }; diff --git a/Objects/exceptions.c b/Objects/exceptions.c index 38723d93653c30dcf501fe14283f36f8a33767af..eb72de53e98c12bea83f5f4c7924aa5d0ed46ac2 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -8,10 +8,8 @@ #include #include "pycore_initconfig.h" #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" -#include "structmember.h" -#include "osdefs.h" +#include "structmember.h" // PyMemberDef +#include "osdefs.h" // SEP /* Compatibility aliases */ @@ -306,22 +304,33 @@ static PyGetSetDef BaseException_getset[] = { }; +static inline PyBaseExceptionObject* +_PyBaseExceptionObject_cast(PyObject *exc) +{ + assert(PyExceptionInstance_Check(exc)); + return (PyBaseExceptionObject *)exc; +} + + PyObject * -PyException_GetTraceback(PyObject *self) { - PyBaseExceptionObject *base_self = (PyBaseExceptionObject *)self; +PyException_GetTraceback(PyObject *self) +{ + PyBaseExceptionObject *base_self = _PyBaseExceptionObject_cast(self); Py_XINCREF(base_self->traceback); return base_self->traceback; } int -PyException_SetTraceback(PyObject *self, PyObject *tb) { - return BaseException_set_tb((PyBaseExceptionObject *)self, tb, NULL); +PyException_SetTraceback(PyObject *self, PyObject *tb) +{ + return BaseException_set_tb(_PyBaseExceptionObject_cast(self), tb, NULL); } PyObject * -PyException_GetCause(PyObject *self) { - PyObject *cause = ((PyBaseExceptionObject *)self)->cause; +PyException_GetCause(PyObject *self) +{ + PyObject *cause = _PyBaseExceptionObject_cast(self)->cause; Py_XINCREF(cause); return cause; } @@ -330,13 +339,15 @@ PyException_GetCause(PyObject *self) { void PyException_SetCause(PyObject *self, PyObject *cause) { - ((PyBaseExceptionObject *)self)->suppress_context = 1; - Py_XSETREF(((PyBaseExceptionObject *)self)->cause, cause); + PyBaseExceptionObject *base_self = _PyBaseExceptionObject_cast(self); + base_self->suppress_context = 1; + Py_XSETREF(base_self->cause, cause); } PyObject * -PyException_GetContext(PyObject *self) { - PyObject *context = ((PyBaseExceptionObject *)self)->context; +PyException_GetContext(PyObject *self) +{ + PyObject *context = _PyBaseExceptionObject_cast(self)->context; Py_XINCREF(context); return context; } @@ -345,7 +356,7 @@ PyException_GetContext(PyObject *self) { void PyException_SetContext(PyObject *self, PyObject *context) { - Py_XSETREF(((PyBaseExceptionObject *)self)->context, context); + Py_XSETREF(_PyBaseExceptionObject_cast(self)->context, context); } #undef PyExceptionClass_Name @@ -353,6 +364,7 @@ PyException_SetContext(PyObject *self, PyObject *context) const char * PyExceptionClass_Name(PyObject *ob) { + assert(PyExceptionClass_Check(ob)); return ((PyTypeObject*)ob)->tp_name; } @@ -405,7 +417,7 @@ static PyTypeObject _PyExc_BaseException = { BaseException_new, /* tp_new */ }; /* the CPython API expects exceptions to be (PyObject *) - both a hold-over -from the previous implmentation and also allowing Python objects to be used +from the previous implementation and also allowing Python objects to be used in the API */ PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException; @@ -875,7 +887,7 @@ oserror_init(PyOSErrorObject *self, PyObject **p_args, /* self->filename will remain Py_None otherwise */ if (filename && filename != Py_None) { - if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError && + if (Py_IS_TYPE(self, (PyTypeObject *) PyExc_BlockingIOError) && PyNumber_Check(filename)) { /* BlockingIOError's 3rd argument can be the number of * characters written. @@ -1379,7 +1391,7 @@ SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds) * Only applies to SyntaxError instances, not to subclasses such * as TabError or IndentationError (see issue #31161) */ - if ((PyObject*)Py_TYPE(self) == PyExc_SyntaxError && + if (Py_IS_TYPE(self, (PyTypeObject *)PyExc_SyntaxError) && self->text && PyUnicode_Check(self->text) && _report_missing_parentheses(self) < 0) { return -1; @@ -1428,7 +1440,7 @@ my_basename(PyObject *name) { Py_ssize_t i, size, offset; int kind; - void *data; + const void *data; if (PyUnicode_READY(name)) return NULL; @@ -1437,11 +1449,13 @@ my_basename(PyObject *name) size = PyUnicode_GET_LENGTH(name); offset = 0; for(i=0; i < size; i++) { - if (PyUnicode_READ(kind, data, i) == SEP) + if (PyUnicode_READ(kind, data, i) == SEP) { offset = i + 1; + } } - if (offset != 0) + if (offset != 0) { return PyUnicode_Substring(name, offset, size); + } else { Py_INCREF(name); return name; @@ -2268,8 +2282,12 @@ MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyBaseExceptionObject *self; - if (type != (PyTypeObject *) PyExc_MemoryError) + /* If this is a subclass of MemoryError, don't use the freelist + * and just return a fresh object */ + if (type != (PyTypeObject *) PyExc_MemoryError) { return BaseException_new(type, args, kwds); + } + if (memerrors_freelist == NULL) return BaseException_new(type, args, kwds); /* Fetch object from freelist and revive it */ @@ -2289,8 +2307,14 @@ MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds) static void MemoryError_dealloc(PyBaseExceptionObject *self) { - _PyObject_GC_UNTRACK(self); BaseException_clear(self); + + if (!Py_IS_TYPE(self, (PyTypeObject *) PyExc_MemoryError)) { + return Py_TYPE(self)->tp_free((PyObject *)self); + } + + _PyObject_GC_UNTRACK(self); + if (memerrors_numfree >= MEMERRORS_SAVE) Py_TYPE(self)->tp_free((PyObject *)self); else { @@ -2507,8 +2531,10 @@ _PyExc_Init(void) do { \ PyObject *_code = PyLong_FromLong(CODE); \ assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \ - if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \ + if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) { \ + Py_XDECREF(_code); \ return _PyStatus_ERR("errmap insertion problem."); \ + } \ Py_DECREF(_code); \ } while (0) @@ -2953,7 +2979,7 @@ _check_for_legacy_statements(PySyntaxErrorObject *self, Py_ssize_t start) static PyObject *exec_prefix = NULL; Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text), match; int kind = PyUnicode_KIND(self->text); - void *data = PyUnicode_DATA(self->text); + const void *data = PyUnicode_DATA(self->text); /* Ignore leading whitespace */ while (start < text_len) { diff --git a/Objects/fileobject.c b/Objects/fileobject.c index dd42d516898a5903de09a50dd6f5210938456536..1c6ecaf82c24eff0a9b68ddff6f1fedd6ec205e0 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -2,7 +2,7 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "pycore_pystate.h" +#include "pycore_runtime.h" // _PyRuntime #if defined(HAVE_GETC_UNLOCKED) && !defined(_Py_MEMORY_SANITIZER) /* clang MemorySanitizer doesn't yet understand getc_unlocked. */ @@ -25,6 +25,8 @@ extern "C" { #endif +_Py_IDENTIFIER(open); + /* External C interface */ PyObject * @@ -32,15 +34,14 @@ PyFile_FromFd(int fd, const char *name, const char *mode, int buffering, const c const char *errors, const char *newline, int closefd) { PyObject *io, *stream; - _Py_IDENTIFIER(open); /* 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, + stream = _PyObject_CallMethodId(io, &PyId_open, "isisssO", fd, mode, buffering, encoding, errors, - newline, closefd); + newline, closefd ? Py_True : Py_False); Py_DECREF(io); if (stream == NULL) return NULL; @@ -61,7 +62,7 @@ PyFile_GetLine(PyObject *f, int n) } if (n <= 0) { - result = _PyObject_CallMethodIdObjArgs(f, &PyId_readline, NULL); + result = _PyObject_CallMethodIdNoArgs(f, &PyId_readline); } else { result = _PyObject_CallMethodId(f, &PyId_readline, "i", n); @@ -75,7 +76,7 @@ PyFile_GetLine(PyObject *f, int n) } if (n < 0 && result != NULL && PyBytes_Check(result)) { - char *s = PyBytes_AS_STRING(result); + const char *s = PyBytes_AS_STRING(result); Py_ssize_t len = PyBytes_GET_SIZE(result); if (len == 0) { Py_DECREF(result); @@ -84,7 +85,7 @@ PyFile_GetLine(PyObject *f, int n) "EOF when reading a line"); } else if (s[len-1] == '\n') { - if (result->ob_refcnt == 1) + if (Py_REFCNT(result) == 1) _PyBytes_Resize(&result, len-1); else { PyObject *v; @@ -136,7 +137,7 @@ PyFile_WriteObject(PyObject *v, PyObject *f, int flags) Py_DECREF(writer); return -1; } - result = PyObject_CallFunctionObjArgs(writer, value, NULL); + result = PyObject_CallOneArg(writer, value); Py_DECREF(value); Py_DECREF(writer); if (result == NULL) @@ -547,7 +548,6 @@ 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'", diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 609f66f8b32ca93a3ec38bbf4e45b0069a55d5eb..9f5014092cf20a6124572c006a8775b6fb137c96 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -4,6 +4,7 @@ for any kind of float exception without losing portability. */ #include "Python.h" +#include "pycore_dtoa.h" #include #include @@ -221,7 +222,7 @@ float_dealloc(PyFloatObject *op) return; } numfree++; - Py_TYPE(op) = (struct _typeobject *)free_list; + Py_SET_TYPE(op, (PyTypeObject *)free_list); free_list = op; } else @@ -256,7 +257,7 @@ PyFloat_AsDouble(PyObject *op) return val; } PyErr_Format(PyExc_TypeError, "must be real number, not %.50s", - op->ob_type->tp_name); + Py_TYPE(op)->tp_name); return -1; } @@ -268,7 +269,7 @@ PyFloat_AsDouble(PyObject *op) if (!PyFloat_Check(res)) { PyErr_Format(PyExc_TypeError, "%.50s.__float__ returned non-float (type %.50s)", - op->ob_type->tp_name, res->ob_type->tp_name); + Py_TYPE(op)->tp_name, Py_TYPE(res)->tp_name); Py_DECREF(res); return -1; } @@ -276,7 +277,7 @@ PyFloat_AsDouble(PyObject *op) "%.50s.__float__ returned non-float (type %.50s). " "The ability to return an instance of a strict subclass of float " "is deprecated, and may be removed in a future version of Python.", - op->ob_type->tp_name, res->ob_type->tp_name)) { + Py_TYPE(op)->tp_name, Py_TYPE(res)->tp_name)) { Py_DECREF(res); return -1; } @@ -506,7 +507,6 @@ float_richcompare(PyObject *v, PyObject *w, int op) goto Unimplemented; Compare: - PyFPE_START_PROTECT("richcompare", return NULL) switch (op) { case Py_EQ: r = i == j; @@ -527,7 +527,6 @@ float_richcompare(PyObject *v, PyObject *w, int op) r = i > j; break; } - PyFPE_END_PROTECT(r) return PyBool_FromLong(r); Unimplemented: @@ -546,9 +545,7 @@ float_add(PyObject *v, PyObject *w) double a,b; CONVERT_TO_DOUBLE(v, a); CONVERT_TO_DOUBLE(w, b); - PyFPE_START_PROTECT("add", return 0) a = a + b; - PyFPE_END_PROTECT(a) return PyFloat_FromDouble(a); } @@ -558,9 +555,7 @@ float_sub(PyObject *v, PyObject *w) double a,b; CONVERT_TO_DOUBLE(v, a); CONVERT_TO_DOUBLE(w, b); - PyFPE_START_PROTECT("subtract", return 0) a = a - b; - PyFPE_END_PROTECT(a) return PyFloat_FromDouble(a); } @@ -570,9 +565,7 @@ float_mul(PyObject *v, PyObject *w) double a,b; CONVERT_TO_DOUBLE(v, a); CONVERT_TO_DOUBLE(w, b); - PyFPE_START_PROTECT("multiply", return 0) a = a * b; - PyFPE_END_PROTECT(a) return PyFloat_FromDouble(a); } @@ -587,9 +580,7 @@ float_div(PyObject *v, PyObject *w) "float division by zero"); return NULL; } - PyFPE_START_PROTECT("divide", return 0) a = a / b; - PyFPE_END_PROTECT(a) return PyFloat_FromDouble(a); } @@ -605,7 +596,6 @@ float_rem(PyObject *v, PyObject *w) "float modulo"); return NULL; } - PyFPE_START_PROTECT("modulo", return 0) mod = fmod(vx, wx); if (mod) { /* ensure the remainder has the same sign as the denominator */ @@ -619,34 +609,25 @@ float_rem(PyObject *v, PyObject *w) it has the same sign as the denominator. */ mod = copysign(0.0, wx); } - PyFPE_END_PROTECT(mod) return PyFloat_FromDouble(mod); } -static PyObject * -float_divmod(PyObject *v, PyObject *w) +static void +_float_div_mod(double vx, double wx, double *floordiv, double *mod) { - double vx, wx; - double div, mod, floordiv; - CONVERT_TO_DOUBLE(v, vx); - CONVERT_TO_DOUBLE(w, wx); - if (wx == 0.0) { - PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()"); - return NULL; - } - PyFPE_START_PROTECT("divmod", return 0) - mod = fmod(vx, wx); + double div; + *mod = fmod(vx, wx); /* fmod is typically exact, so vx-mod is *mathematically* an exact multiple of wx. But this is fp arithmetic, and fp vx - mod is an approximation; the result is that div may not be an exact integral value after the division, although it will always be very close to one. */ - div = (vx - mod) / wx; - if (mod) { + div = (vx - *mod) / wx; + if (*mod) { /* ensure the remainder has the same sign as the denominator */ - if ((wx < 0) != (mod < 0)) { - mod += wx; + if ((wx < 0) != (*mod < 0)) { + *mod += wx; div -= 1.0; } } @@ -654,35 +635,49 @@ float_divmod(PyObject *v, PyObject *w) /* the remainder is zero, and in the presence of signed zeroes fmod returns different results across platforms; ensure it has the same sign as the denominator. */ - mod = copysign(0.0, wx); + *mod = copysign(0.0, wx); } /* snap quotient to nearest integral value */ if (div) { - floordiv = floor(div); - if (div - floordiv > 0.5) - floordiv += 1.0; + *floordiv = floor(div); + if (div - *floordiv > 0.5) { + *floordiv += 1.0; + } } else { /* div is zero - get the same sign as the true quotient */ - floordiv = copysign(0.0, vx / wx); /* zero w/ sign of vx/wx */ + *floordiv = copysign(0.0, vx / wx); /* zero w/ sign of vx/wx */ + } +} + +static PyObject * +float_divmod(PyObject *v, PyObject *w) +{ + double vx, wx; + double mod, floordiv; + CONVERT_TO_DOUBLE(v, vx); + CONVERT_TO_DOUBLE(w, wx); + if (wx == 0.0) { + PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()"); + return NULL; } - PyFPE_END_PROTECT(floordiv) + _float_div_mod(vx, wx, &floordiv, &mod); return Py_BuildValue("(dd)", floordiv, mod); } static PyObject * float_floor_div(PyObject *v, PyObject *w) { - PyObject *t, *r; - - t = float_divmod(v, w); - if (t == NULL || t == Py_NotImplemented) - return t; - assert(PyTuple_CheckExact(t)); - r = PyTuple_GET_ITEM(t, 0); - Py_INCREF(r); - Py_DECREF(t); - return r; + double vx, wx; + double mod, floordiv; + CONVERT_TO_DOUBLE(v, vx); + CONVERT_TO_DOUBLE(w, wx); + if (wx == 0.0) { + PyErr_SetString(PyExc_ZeroDivisionError, "float floor division by zero"); + return NULL; + } + _float_div_mod(vx, wx, &floordiv, &mod); + return PyFloat_FromDouble(floordiv); } /* determine whether x is an odd integer or not; assumes that @@ -793,9 +788,7 @@ float_pow(PyObject *v, PyObject *w, PyObject *z) * the platform pow to step in and do the rest. */ errno = 0; - PyFPE_START_PROTECT("pow", return NULL) ix = pow(iv, iw); - PyFPE_END_PROTECT(ix) Py_ADJUST_ERANGE1(ix); if (negate_result) ix = -ix; @@ -849,9 +842,7 @@ float_is_integer_impl(PyObject *self) if (!Py_IS_FINITE(x)) Py_RETURN_FALSE; errno = 0; - PyFPE_START_PROTECT("is_integer", return NULL) o = (floor(x) == x) ? Py_True : Py_False; - PyFPE_END_PROTECT(x) if (errno != 0) { PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError : PyExc_ValueError); @@ -871,27 +862,35 @@ static PyObject * float___trunc___impl(PyObject *self) /*[clinic end generated code: output=dd3e289dd4c6b538 input=591b9ba0d650fdff]*/ { - double x = PyFloat_AsDouble(self); - double wholepart; /* integral portion of x, rounded toward 0 */ - - (void)modf(x, &wholepart); - /* Try to get out cheap if this fits in a Python int. The attempt - * to cast to long must be protected, as C doesn't define what - * happens if the double is too big to fit in a long. Some rare - * systems raise an exception then (RISCOS was mentioned as one, - * and someone using a non-default option on Sun also bumped into - * that). Note that checking for >= and <= LONG_{MIN,MAX} would - * still be vulnerable: if a long has more bits of precision than - * a double, casting MIN/MAX to double may yield an approximation, - * and if that's rounded up, then, e.g., wholepart=LONG_MAX+1 would - * yield true from the C expression wholepart<=LONG_MAX, despite - * that wholepart is actually greater than LONG_MAX. - */ - if (LONG_MIN < wholepart && wholepart < LONG_MAX) { - const long aslong = (long)wholepart; - return PyLong_FromLong(aslong); - } - return PyLong_FromDouble(wholepart); + return PyLong_FromDouble(PyFloat_AS_DOUBLE(self)); +} + +/*[clinic input] +float.__floor__ + +Return the floor as an Integral. +[clinic start generated code]*/ + +static PyObject * +float___floor___impl(PyObject *self) +/*[clinic end generated code: output=e0551dbaea8c01d1 input=77bb13eb12e268df]*/ +{ + double x = PyFloat_AS_DOUBLE(self); + return PyLong_FromDouble(floor(x)); +} + +/*[clinic input] +float.__ceil__ + +Return the ceiling as an Integral. +[clinic start generated code]*/ + +static PyObject * +float___ceil___impl(PyObject *self) +/*[clinic end generated code: output=a2fd8858f73736f9 input=79e41ae94aa0a516]*/ +{ + double x = PyFloat_AS_DOUBLE(self); + return PyLong_FromDouble(ceil(x)); } /* double_round: rounds a finite double to the closest multiple of @@ -1472,7 +1471,7 @@ float_fromhex(PyTypeObject *type, PyObject *string) goto parse_error; result = PyFloat_FromDouble(negate ? -x : x); if (type != &PyFloat_Type && result != NULL) { - Py_SETREF(result, PyObject_CallFunctionObjArgs((PyObject *)type, result, NULL)); + Py_SETREF(result, PyObject_CallOneArg((PyObject *)type, result)); } return result; @@ -1538,9 +1537,7 @@ float_as_integer_ratio_impl(PyObject *self) return NULL; } - PyFPE_START_PROTECT("as_integer_ratio", goto error); float_part = frexp(self_double, &exponent); /* self_double == float_part * 2**exponent exactly */ - PyFPE_END_PROTECT(float_part); for (i=0; i<300 && float_part != floor(float_part) ; i++) { float_part *= 2.0; @@ -1697,7 +1694,8 @@ float___getformat___impl(PyTypeObject *type, const char *typestr) case ieee_big_endian_format: return PyUnicode_FromString("IEEE, big-endian"); default: - Py_FatalError("insane float_format or double_format"); + PyErr_SetString(PyExc_RuntimeError, + "insane float_format or double_format"); return NULL; } } @@ -1818,6 +1816,8 @@ float___format___impl(PyObject *self, PyObject *format_spec) static PyMethodDef float_methods[] = { FLOAT_CONJUGATE_METHODDEF FLOAT___TRUNC___METHODDEF + FLOAT___FLOOR___METHODDEF + FLOAT___CEIL___METHODDEF FLOAT___ROUND___METHODDEF FLOAT_AS_INTEGER_RATIO_METHODDEF FLOAT_FROMHEX_METHODDEF @@ -1978,25 +1978,22 @@ _PyFloat_Init(void) return 1; } -int -PyFloat_ClearFreeList(void) +void +_PyFloat_ClearFreeList(void) { PyFloatObject *f = free_list, *next; - int i = numfree; - while (f) { + for (; f; f = next) { next = (PyFloatObject*) Py_TYPE(f); PyObject_FREE(f); - f = next; } free_list = NULL; numfree = 0; - return i; } void -PyFloat_Fini(void) +_PyFloat_Fini(void) { - (void)PyFloat_ClearFreeList(); + _PyFloat_ClearFreeList(); } /* Print summary info about the state of the optimized allocator */ diff --git a/Objects/frameobject.c b/Objects/frameobject.c index a796a59eee9e40afdc6e1fba5d4d07ad0501255e..a2fc0a423747f2389b5e05ea31cbb0d39246bb0c 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -2,12 +2,12 @@ #include "Python.h" #include "pycore_object.h" -#include "pycore_pystate.h" +#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() #include "code.h" #include "frameobject.h" #include "opcode.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #define OFF(x) offsetof(PyFrameObject, x) @@ -34,10 +34,13 @@ frame_getlocals(PyFrameObject *f, void *closure) int PyFrame_GetLineNumber(PyFrameObject *f) { - if (f->f_trace) + assert(f != NULL); + if (f->f_trace) { return f->f_lineno; - else + } + else { return PyCode_Addr2Line(f->f_code, f->f_lasti); + } } static PyObject * @@ -66,6 +69,245 @@ get_arg(const _Py_CODEUNIT *codestr, Py_ssize_t i) return oparg; } +typedef enum kind { + With = 1, + Loop = 2, + Try = 3, + Except = 4, +} Kind; + +#define BITS_PER_BLOCK 3 + +static inline int64_t +push_block(int64_t stack, Kind kind) +{ + assert(stack < ((int64_t)1)<<(BITS_PER_BLOCK*CO_MAXBLOCKS)); + return (stack << BITS_PER_BLOCK) | kind; +} + +static inline int64_t +pop_block(int64_t stack) +{ + assert(stack > 0); + return stack >> BITS_PER_BLOCK; +} + +static inline Kind +top_block(int64_t stack) +{ + return stack & ((1<co_code); + int64_t *blocks = PyMem_New(int64_t, len+1); + int i, j, opcode; + + if (blocks == NULL) { + PyErr_NoMemory(); + return NULL; + } + memset(blocks, -1, (len+1)*sizeof(int64_t)); + blocks[0] = 0; + int todo = 1; + while (todo) { + todo = 0; + for (i = 0; i < len; i++) { + int64_t block_stack = blocks[i]; + int64_t except_stack; + if (block_stack == -1) { + continue; + } + opcode = _Py_OPCODE(code[i]); + switch (opcode) { + case JUMP_IF_FALSE_OR_POP: + case JUMP_IF_TRUE_OR_POP: + case POP_JUMP_IF_FALSE: + case POP_JUMP_IF_TRUE: + case JUMP_IF_NOT_EXC_MATCH: + j = get_arg(code, i) / sizeof(_Py_CODEUNIT); + assert(j < len); + if (blocks[j] == -1 && j < i) { + todo = 1; + } + assert(blocks[j] == -1 || blocks[j] == block_stack); + blocks[j] = block_stack; + blocks[i+1] = block_stack; + break; + case JUMP_ABSOLUTE: + j = get_arg(code, i) / sizeof(_Py_CODEUNIT); + assert(j < len); + if (blocks[j] == -1 && j < i) { + todo = 1; + } + assert(blocks[j] == -1 || blocks[j] == block_stack); + blocks[j] = block_stack; + break; + case SETUP_FINALLY: + j = get_arg(code, i) / sizeof(_Py_CODEUNIT) + i + 1; + assert(j < len); + except_stack = push_block(block_stack, Except); + assert(blocks[j] == -1 || blocks[j] == except_stack); + blocks[j] = except_stack; + block_stack = push_block(block_stack, Try); + blocks[i+1] = block_stack; + break; + case SETUP_WITH: + case SETUP_ASYNC_WITH: + j = get_arg(code, i) / sizeof(_Py_CODEUNIT) + i + 1; + assert(j < len); + except_stack = push_block(block_stack, Except); + assert(blocks[j] == -1 || blocks[j] == except_stack); + blocks[j] = except_stack; + block_stack = push_block(block_stack, With); + blocks[i+1] = block_stack; + break; + case JUMP_FORWARD: + j = get_arg(code, i) / sizeof(_Py_CODEUNIT) + i + 1; + assert(j < len); + assert(blocks[j] == -1 || blocks[j] == block_stack); + blocks[j] = block_stack; + break; + case GET_ITER: + case GET_AITER: + block_stack = push_block(block_stack, Loop); + blocks[i+1] = block_stack; + break; + case FOR_ITER: + blocks[i+1] = block_stack; + block_stack = pop_block(block_stack); + j = get_arg(code, i) / sizeof(_Py_CODEUNIT) + i + 1; + assert(j < len); + assert(blocks[j] == -1 || blocks[j] == block_stack); + blocks[j] = block_stack; + break; + case POP_BLOCK: + case POP_EXCEPT: + block_stack = pop_block(block_stack); + blocks[i+1] = block_stack; + break; + case END_ASYNC_FOR: + block_stack = pop_block(pop_block(block_stack)); + blocks[i+1] = block_stack; + break; + case RETURN_VALUE: + case RAISE_VARARGS: + case RERAISE: + /* End of block */ + break; + default: + blocks[i+1] = block_stack; + + } + } + } + return blocks; +} + +static int +compatible_block_stack(int64_t from_stack, int64_t to_stack) +{ + if (to_stack < 0) { + return 0; + } + while(from_stack > to_stack) { + from_stack = pop_block(from_stack); + } + return from_stack == to_stack; +} + +static const char * +explain_incompatible_block_stack(int64_t to_stack) +{ + Kind target_kind = top_block(to_stack); + switch(target_kind) { + case Except: + return "can't jump into an 'except' block as there's no exception"; + case Try: + return "can't jump into the body of a try statement"; + case With: + return "can't jump into the body of a with statement"; + case Loop: + return "can't jump into the body of a for loop"; + default: + Py_UNREACHABLE(); + } +} + +static int * +marklines(PyCodeObject *code, int len) +{ + int *linestarts = PyMem_New(int, len); + if (linestarts == NULL) { + return NULL; + } + Py_ssize_t size = PyBytes_GET_SIZE(code->co_lnotab) / 2; + unsigned char *p = (unsigned char*)PyBytes_AS_STRING(code->co_lnotab); + int line = code->co_firstlineno; + int addr = 0; + int index = 0; + while (--size >= 0) { + addr += *p++; + if (index*2 < addr) { + linestarts[index++] = line; + } + while (index*2 < addr) { + linestarts[index++] = -1; + if (index >= len) { + break; + } + } + line += (signed char)*p; + p++; + } + if (index < len) { + linestarts[index++] = line; + } + while (index < len) { + linestarts[index++] = -1; + } + assert(index == len); + return linestarts; +} + +static int +first_line_not_before(int *lines, int len, int line) +{ + int result = INT_MAX; + for (int i = 0; i < len; i++) { + if (lines[i] < result && lines[i] >= line) { + result = lines[i]; + } + } + if (result == INT_MAX) { + return -1; + } + return result; +} + +static void +frame_stack_pop(PyFrameObject *f) +{ + PyObject *v = (*--f->f_stacktop); + Py_DECREF(v); +} + +static void +frame_block_unwind(PyFrameObject *f) +{ + assert(f->f_iblock > 0); + f->f_iblock--; + PyTryBlock *b = &f->f_blockstack[f->f_iblock]; + intptr_t delta = (f->f_stacktop - f->f_valuestack) - b->b_level; + while (delta > 0) { + frame_stack_pop(f); + delta--; + } +} + /* Setter for f_lineno - you can set f_lineno from within a trace function in * order to jump to a given line of code, subject to some restrictions. Most @@ -77,7 +319,8 @@ get_arg(const _Py_CODEUNIT *codestr, Py_ssize_t i) * o Lines with an 'except' statement on them can't be jumped to, because * they expect an exception to be on the top of the stack. * o Lines that live in a 'finally' block can't be jumped from or to, since - * the END_FINALLY expects to clean up the stack after the 'try' block. + * we cannot be sure which state the interpreter was in or would be in + * during execution of the finally block. * o 'try', 'with' and 'async with' blocks can't be jumped into because * the blockstack needs to be set up before their code runs. * o 'for' and 'async for' loops can't be jumped into because the @@ -89,22 +332,6 @@ get_arg(const _Py_CODEUNIT *codestr, Py_ssize_t i) static int frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignored)) { - int new_lineno = 0; /* The new value of f_lineno */ - long l_new_lineno; - int overflow; - int new_lasti = 0; /* The new value of f_lasti */ - unsigned char *code = NULL; /* The bytecode for the frame... */ - Py_ssize_t code_len = 0; /* ...and its length */ - unsigned char *lnotab = NULL; /* Iterating over co_lnotab */ - Py_ssize_t lnotab_len = 0; /* (ditto) */ - int offset = 0; /* (ditto) */ - int line = 0; /* (ditto) */ - int addr = 0; /* (ditto) */ - int delta_iblock = 0; /* Scanning the SETUPs and POPs */ - int delta = 0; - int blockstack[CO_MAXBLOCKS]; /* Walking the 'finally' blocks */ - int blockstack_top = 0; /* (ditto) */ - if (p_new_lineno == NULL) { PyErr_SetString(PyExc_AttributeError, "cannot delete attribute"); return -1; @@ -145,14 +372,18 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignore return -1; } - /* Fail if the line comes before the start of the code block. */ - l_new_lineno = PyLong_AsLongAndOverflow(p_new_lineno, &overflow); + int new_lineno; + + /* Fail if the line falls outside the code block and + select first line with actual code. */ + int overflow; + long l_new_lineno = PyLong_AsLongAndOverflow(p_new_lineno, &overflow); if (overflow #if SIZEOF_LONG > SIZEOF_INT || l_new_lineno > INT_MAX || l_new_lineno < INT_MIN #endif - ) { + ) { PyErr_SetString(PyExc_ValueError, "lineno out of range"); return -1; @@ -161,173 +392,90 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignore if (new_lineno < f->f_code->co_firstlineno) { PyErr_Format(PyExc_ValueError, - "line %d comes before the current code block", - new_lineno); + "line %d comes before the current code block", + new_lineno); return -1; } - else if (new_lineno == f->f_code->co_firstlineno) { - new_lasti = 0; - new_lineno = f->f_code->co_firstlineno; - } - else { - /* Find the bytecode offset for the start of the given - * line, or the first code-owning line after it. */ - char *tmp; - PyBytes_AsStringAndSize(f->f_code->co_lnotab, - &tmp, &lnotab_len); - lnotab = (unsigned char *) tmp; - addr = 0; - line = f->f_code->co_firstlineno; - new_lasti = -1; - for (offset = 0; offset < lnotab_len; offset += 2) { - addr += lnotab[offset]; - line += (signed char)lnotab[offset+1]; - if (line >= new_lineno) { - new_lasti = addr; - new_lineno = line; - break; - } - } - } - /* If we didn't reach the requested line, return an error. */ - if (new_lasti == -1) { - PyErr_Format(PyExc_ValueError, - "line %d comes after the current code block", - new_lineno); + int len = PyBytes_GET_SIZE(f->f_code->co_code)/sizeof(_Py_CODEUNIT); + int *lines = marklines(f->f_code, len); + if (lines == NULL) { return -1; } - /* We're now ready to look at the bytecode. */ - PyBytes_AsStringAndSize(f->f_code->co_code, (char **)&code, &code_len); - - /* The trace function is called with a 'return' trace event after the - * execution of a yield statement. */ - assert(f->f_lasti != -1); - if (code[f->f_lasti] == YIELD_VALUE || code[f->f_lasti] == YIELD_FROM) { - PyErr_SetString(PyExc_ValueError, - "can't jump from a yield statement"); + new_lineno = first_line_not_before(lines, len, new_lineno); + if (new_lineno < 0) { + PyErr_Format(PyExc_ValueError, + "line %d comes after the current code block", + (int)l_new_lineno); + PyMem_Free(lines); return -1; } - /* You can't jump onto a line with an 'except' statement on it - - * they expect to have an exception on the top of the stack, which - * won't be true if you jump to them. They always start with code - * that either pops the exception using POP_TOP (plain 'except:' - * lines do this) or duplicates the exception on the stack using - * DUP_TOP (if there's an exception type specified). See compile.c, - * 'com_try_except' for the full details. There aren't any other - * cases (AFAIK) where a line's code can start with DUP_TOP or - * POP_TOP, but if any ever appear, they'll be subject to the same - * restriction (but with a different error message). */ - if (code[new_lasti] == DUP_TOP || code[new_lasti] == POP_TOP) { - PyErr_SetString(PyExc_ValueError, - "can't jump to 'except' line as there's no exception"); + int64_t *blocks = markblocks(f->f_code, len); + if (blocks == NULL) { + PyMem_Free(lines); return -1; } - /* You can't jump into or out of a 'finally' block because the 'try' - * block leaves something on the stack for the END_FINALLY to clean up. - * So we walk the bytecode, maintaining a simulated blockstack. - * 'blockstack' is a stack of the bytecode addresses of the starts of - * the 'finally' blocks. */ - memset(blockstack, '\0', sizeof(blockstack)); - blockstack_top = 0; - unsigned char prevop = NOP; - for (addr = 0; addr < code_len; addr += sizeof(_Py_CODEUNIT)) { - unsigned char op = code[addr]; - switch (op) { - case SETUP_FINALLY: - case SETUP_WITH: - case SETUP_ASYNC_WITH: - case FOR_ITER: { - unsigned int oparg = get_arg((const _Py_CODEUNIT *)code, - addr / sizeof(_Py_CODEUNIT)); - int target_addr = addr + oparg + sizeof(_Py_CODEUNIT); - assert(target_addr < code_len); - /* Police block-jumping (you can't jump into the middle of a block) - * and ensure that the blockstack finishes up in a sensible state (by - * popping any blocks we're jumping out of). We look at all the - * blockstack operations between the current position and the new - * one, and keep track of how many blocks we drop out of on the way. - * By also keeping track of the lowest blockstack position we see, we - * can tell whether the jump goes into any blocks without coming out - * again - in that case we raise an exception below. */ - int first_in = addr < f->f_lasti && f->f_lasti < target_addr; - int second_in = addr < new_lasti && new_lasti < target_addr; - if (!first_in && second_in) { - PyErr_SetString(PyExc_ValueError, - "can't jump into the middle of a block"); - return -1; + int64_t target_block_stack = -1; + int64_t best_block_stack = -1; + int best_addr = -1; + int64_t start_block_stack = blocks[f->f_lasti/sizeof(_Py_CODEUNIT)]; + const char *msg = "cannot find bytecode for specified line"; + for (int i = 0; i < len; i++) { + if (lines[i] == new_lineno) { + target_block_stack = blocks[i]; + if (compatible_block_stack(start_block_stack, target_block_stack)) { + msg = NULL; + if (target_block_stack > best_block_stack) { + best_block_stack = target_block_stack; + best_addr = i*sizeof(_Py_CODEUNIT); + } } - int in_for_loop = op == FOR_ITER || code[target_addr] == END_ASYNC_FOR; - if (first_in && !second_in) { - if (!delta_iblock) { - if (in_for_loop) { - /* Pop the iterators of any 'for' and 'async for' loop - * we're jumping out of. */ - delta++; - } - else if (prevop == LOAD_CONST) { - /* Pops None pushed before SETUP_FINALLY. */ - delta++; - } + else if (msg) { + if (target_block_stack >= 0) { + msg = explain_incompatible_block_stack(target_block_stack); } - if (!in_for_loop) { - delta_iblock++; + else { + msg = "code may be unreachable."; } } - if (!in_for_loop) { - blockstack[blockstack_top++] = target_addr; - } - break; } + } + PyMem_Free(blocks); + PyMem_Free(lines); + if (msg != NULL) { + PyErr_SetString(PyExc_ValueError, msg); + return -1; + } - case END_FINALLY: { - assert(blockstack_top > 0); - int target_addr = blockstack[--blockstack_top]; - assert(target_addr <= addr); - int first_in = target_addr <= f->f_lasti && f->f_lasti <= addr; - int second_in = target_addr <= new_lasti && new_lasti <= addr; - if (first_in != second_in) { - op = code[target_addr]; - PyErr_Format(PyExc_ValueError, - "can't jump %s %s block", - second_in ? "into" : "out of", - (op == DUP_TOP || op == POP_TOP) ? - "an 'except'" : "a 'finally'"); - return -1; - } + /* Unwind block stack. */ + while (start_block_stack > best_block_stack) { + Kind kind = top_block(start_block_stack); + switch(kind) { + case Loop: + frame_stack_pop(f); break; + case Try: + frame_block_unwind(f); + break; + case With: + frame_block_unwind(f); + // Pop the exit function + frame_stack_pop(f); + break; + case Except: + PyErr_SetString(PyExc_ValueError, + "can't jump out of an 'except' block"); + return -1; } - } - prevop = op; - } - - /* Verify that the blockstack tracking code didn't get lost. */ - assert(blockstack_top == 0); - - /* Pop any blocks that we're jumping out of. */ - if (delta_iblock > 0) { - f->f_iblock -= delta_iblock; - PyTryBlock *b = &f->f_blockstack[f->f_iblock]; - delta += (int)(f->f_stacktop - f->f_valuestack) - b->b_level; - if (b->b_type == SETUP_FINALLY && - code[b->b_handler] == WITH_CLEANUP_START) - { - /* Pop the exit function. */ - delta++; - } - } - while (delta > 0) { - PyObject *v = (*--f->f_stacktop); - Py_DECREF(v); - delta--; + start_block_stack = pop_block(start_block_stack); } /* Finally set the new f_lineno and f_lasti and return OK. */ f->f_lineno = new_lineno; - f->f_lasti = new_lasti; + f->f_lasti = best_addr; return 0; } @@ -408,11 +556,13 @@ static PyGetSetDef frame_getsetlist[] = { free_list. Else programs creating lots of cyclic trash involving frames could provoke free_list into growing without bound. */ +/* max value for numfree */ +#define PyFrame_MAXFREELIST 200 +#if PyFrame_MAXFREELIST > 0 static PyFrameObject *free_list = NULL; static int numfree = 0; /* number of frames currently in free_list */ -/* max value for numfree */ -#define PyFrame_MAXFREELIST 200 +#endif static void _Py_HOT_FUNCTION frame_dealloc(PyFrameObject *f) @@ -442,26 +592,36 @@ frame_dealloc(PyFrameObject *f) Py_CLEAR(f->f_trace); co = f->f_code; - if (co->co_zombieframe == NULL) + if (co->co_zombieframe == NULL) { co->co_zombieframe = f; + } +#if PyFrame_MAXFREELIST > 0 else if (numfree < PyFrame_MAXFREELIST) { ++numfree; f->f_back = free_list; free_list = f; } - else +#endif + else { PyObject_GC_Del(f); + } Py_DECREF(co); Py_TRASHCAN_SAFE_END(f) } +static inline Py_ssize_t +frame_nslots(PyFrameObject *frame) +{ + PyCodeObject *code = frame->f_code; + return (code->co_nlocals + + PyTuple_GET_SIZE(code->co_cellvars) + + PyTuple_GET_SIZE(code->co_freevars)); +} + static int frame_traverse(PyFrameObject *f, visitproc visit, void *arg) { - PyObject **fastlocals, **p; - Py_ssize_t i, slots; - Py_VISIT(f->f_back); Py_VISIT(f->f_code); Py_VISIT(f->f_builtins); @@ -470,15 +630,16 @@ frame_traverse(PyFrameObject *f, visitproc visit, void *arg) Py_VISIT(f->f_trace); /* locals */ - slots = f->f_code->co_nlocals + PyTuple_GET_SIZE(f->f_code->co_cellvars) + PyTuple_GET_SIZE(f->f_code->co_freevars); - fastlocals = f->f_localsplus; - for (i = slots; --i >= 0; ++fastlocals) + PyObject **fastlocals = f->f_localsplus; + for (Py_ssize_t i = frame_nslots(f); --i >= 0; ++fastlocals) { Py_VISIT(*fastlocals); + } /* stack */ if (f->f_stacktop != NULL) { - for (p = f->f_valuestack; p < f->f_stacktop; p++) + for (PyObject **p = f->f_valuestack; p < f->f_stacktop; p++) { Py_VISIT(*p); + } } return 0; } @@ -486,30 +647,28 @@ frame_traverse(PyFrameObject *f, visitproc visit, void *arg) static int frame_tp_clear(PyFrameObject *f) { - PyObject **fastlocals, **p, **oldtop; - Py_ssize_t i, slots; - /* Before anything else, make sure that this frame is clearly marked * as being defunct! Else, e.g., a generator reachable from this * frame may also point to this frame, believe itself to still be * active, and try cleaning up this frame again. */ - oldtop = f->f_stacktop; + PyObject **oldtop = f->f_stacktop; f->f_stacktop = NULL; f->f_executing = 0; Py_CLEAR(f->f_trace); /* locals */ - slots = f->f_code->co_nlocals + PyTuple_GET_SIZE(f->f_code->co_cellvars) + PyTuple_GET_SIZE(f->f_code->co_freevars); - fastlocals = f->f_localsplus; - for (i = slots; --i >= 0; ++fastlocals) + PyObject **fastlocals = f->f_localsplus; + for (Py_ssize_t i = frame_nslots(f); --i >= 0; ++fastlocals) { Py_CLEAR(*fastlocals); + } /* stack */ if (oldtop != NULL) { - for (p = f->f_valuestack; p < oldtop; p++) + for (PyObject **p = f->f_valuestack; p < oldtop; p++) { Py_CLEAR(*p); + } } return 0; } @@ -538,10 +697,10 @@ frame_sizeof(PyFrameObject *f, PyObject *Py_UNUSED(ignored)) { Py_ssize_t res, extras, ncells, nfrees; - ncells = PyTuple_GET_SIZE(f->f_code->co_cellvars); - nfrees = PyTuple_GET_SIZE(f->f_code->co_freevars); - extras = f->f_code->co_stacksize + f->f_code->co_nlocals + - ncells + nfrees; + PyCodeObject *code = f->f_code; + ncells = PyTuple_GET_SIZE(code->co_cellvars); + nfrees = PyTuple_GET_SIZE(code->co_freevars); + extras = code->co_stacksize + code->co_nlocals + ncells + nfrees; /* subtract one as it is already included in PyFrameObject */ res = sizeof(PyFrameObject) + (extras-1) * sizeof(PyObject *); @@ -555,9 +714,10 @@ static PyObject * frame_repr(PyFrameObject *f) { int lineno = PyFrame_GetLineNumber(f); + PyCodeObject *code = f->f_code; return PyUnicode_FromFormat( "", - f, f->f_code->co_filename, lineno, f->f_code->co_name); + f, code->co_filename, lineno, code->co_name); } static PyMethodDef frame_methods[] = { @@ -605,98 +765,127 @@ PyTypeObject PyFrame_Type = { _Py_IDENTIFIER(__builtins__); -PyFrameObject* _Py_HOT_FUNCTION -_PyFrame_New_NoTrack(PyThreadState *tstate, PyCodeObject *code, - PyObject *globals, PyObject *locals) +static inline PyFrameObject* +frame_alloc(PyCodeObject *code) { - PyFrameObject *back = tstate->frame; PyFrameObject *f; - PyObject *builtins; - Py_ssize_t i; -#ifdef Py_DEBUG - if (code == NULL || globals == NULL || !PyDict_Check(globals) || - (locals != NULL && !PyMapping_Check(locals))) { - PyErr_BadInternalCall(); - return NULL; + f = code->co_zombieframe; + if (f != NULL) { + code->co_zombieframe = NULL; + _Py_NewReference((PyObject *)f); + assert(f->f_code == code); + return f; } + + Py_ssize_t ncells = PyTuple_GET_SIZE(code->co_cellvars); + Py_ssize_t nfrees = PyTuple_GET_SIZE(code->co_freevars); + Py_ssize_t extras = code->co_stacksize + code->co_nlocals + ncells + nfrees; +#if PyFrame_MAXFREELIST > 0 + if (free_list == NULL) #endif - if (back == NULL || back->f_globals != globals) { - builtins = _PyDict_GetItemIdWithError(globals, &PyId___builtins__); - if (builtins) { - if (PyModule_Check(builtins)) { - builtins = PyModule_GetDict(builtins); - assert(builtins != NULL); - } + { + f = PyObject_GC_NewVar(PyFrameObject, &PyFrame_Type, extras); + if (f == NULL) { + return NULL; } - if (builtins == NULL) { - if (PyErr_Occurred()) { + } +#if PyFrame_MAXFREELIST > 0 + else { + assert(numfree > 0); + --numfree; + f = free_list; + free_list = free_list->f_back; + if (Py_SIZE(f) < extras) { + PyFrameObject *new_f = PyObject_GC_Resize(PyFrameObject, f, extras); + if (new_f == NULL) { + PyObject_GC_Del(f); return NULL; } - /* No builtins! Make up a minimal one - Give them 'None', at least. */ - builtins = PyDict_New(); - if (builtins == NULL || - PyDict_SetItemString( - builtins, "None", Py_None) < 0) - return NULL; + f = new_f; } - else - Py_INCREF(builtins); + _Py_NewReference((PyObject *)f); + } +#endif + f->f_code = code; + extras = code->co_nlocals + ncells + nfrees; + f->f_valuestack = f->f_localsplus + extras; + for (Py_ssize_t i=0; if_localsplus[i] = NULL; } - else { + f->f_locals = NULL; + f->f_trace = NULL; + return f; +} + + +static inline PyObject * +frame_get_builtins(PyFrameObject *back, PyObject *globals) +{ + PyObject *builtins; + + if (back != NULL && back->f_globals == globals) { /* If we share the globals, we share the builtins. Save a lookup and a call. */ builtins = back->f_builtins; assert(builtins != NULL); Py_INCREF(builtins); + return builtins; } - if (code->co_zombieframe != NULL) { - f = code->co_zombieframe; - code->co_zombieframe = NULL; - _Py_NewReference((PyObject *)f); - assert(f->f_code == code); + + builtins = _PyDict_GetItemIdWithError(globals, &PyId___builtins__); + if (builtins != NULL && PyModule_Check(builtins)) { + builtins = PyModule_GetDict(builtins); + assert(builtins != NULL); + } + if (builtins != NULL) { + Py_INCREF(builtins); + return builtins; + } + + if (PyErr_Occurred()) { + return NULL; } - else { - Py_ssize_t extras, ncells, nfrees; - ncells = PyTuple_GET_SIZE(code->co_cellvars); - nfrees = PyTuple_GET_SIZE(code->co_freevars); - extras = code->co_stacksize + code->co_nlocals + ncells + - nfrees; - if (free_list == NULL) { - f = PyObject_GC_NewVar(PyFrameObject, &PyFrame_Type, - extras); - if (f == NULL) { - Py_DECREF(builtins); - return NULL; - } - } - else { - assert(numfree > 0); - --numfree; - f = free_list; - free_list = free_list->f_back; - if (Py_SIZE(f) < extras) { - PyFrameObject *new_f = PyObject_GC_Resize(PyFrameObject, f, extras); - if (new_f == NULL) { - PyObject_GC_Del(f); - Py_DECREF(builtins); - return NULL; - } - f = new_f; - } - _Py_NewReference((PyObject *)f); - } - f->f_code = code; - extras = code->co_nlocals + ncells + nfrees; - f->f_valuestack = f->f_localsplus + extras; - for (i=0; if_localsplus[i] = NULL; - f->f_locals = NULL; - f->f_trace = NULL; + /* No builtins! Make up a minimal one. + Give them 'None', at least. */ + builtins = PyDict_New(); + if (builtins == NULL) { + return NULL; } + if (PyDict_SetItemString(builtins, "None", Py_None) < 0) { + Py_DECREF(builtins); + return NULL; + } + return builtins; +} + + +PyFrameObject* _Py_HOT_FUNCTION +_PyFrame_New_NoTrack(PyThreadState *tstate, PyCodeObject *code, + PyObject *globals, PyObject *locals) +{ +#ifdef Py_DEBUG + if (code == NULL || globals == NULL || !PyDict_Check(globals) || + (locals != NULL && !PyMapping_Check(locals))) { + PyErr_BadInternalCall(); + return NULL; + } +#endif + + PyFrameObject *back = tstate->frame; + PyObject *builtins = frame_get_builtins(back, globals); + if (builtins == NULL) { + return NULL; + } + + PyFrameObject *f = frame_alloc(code); + if (f == NULL) { + Py_DECREF(builtins); + return NULL; + } + f->f_stacktop = f->f_valuestack; f->f_builtins = builtins; Py_XINCREF(back); @@ -731,6 +920,8 @@ _PyFrame_New_NoTrack(PyThreadState *tstate, PyCodeObject *code, f->f_trace_opcodes = 0; f->f_trace_lines = 1; + assert(f->f_code != NULL); + return f; } @@ -751,8 +942,9 @@ void PyFrame_BlockSetup(PyFrameObject *f, int type, int handler, int level) { PyTryBlock *b; - if (f->f_iblock >= CO_MAXBLOCKS) - Py_FatalError("XXX block stack overflow"); + if (f->f_iblock >= CO_MAXBLOCKS) { + Py_FatalError("block stack overflow"); + } b = &f->f_blockstack[f->f_iblock++]; b->b_type = type; b->b_level = level; @@ -763,8 +955,9 @@ PyTryBlock * PyFrame_BlockPop(PyFrameObject *f) { PyTryBlock *b; - if (f->f_iblock <= 0) - Py_FatalError("XXX block stack underflow"); + if (f->f_iblock <= 0) { + Py_FatalError("block stack underflow"); + } b = &f->f_blockstack[--f->f_iblock]; return b; } @@ -981,11 +1174,10 @@ PyFrame_LocalsToFast(PyFrameObject *f, int clear) } /* Clear out the free list */ -int -PyFrame_ClearFreeList(void) +void +_PyFrame_ClearFreeList(void) { - int freelist_size = numfree; - +#if PyFrame_MAXFREELIST > 0 while (free_list != NULL) { PyFrameObject *f = free_list; free_list = free_list->f_back; @@ -993,21 +1185,43 @@ PyFrame_ClearFreeList(void) --numfree; } assert(numfree == 0); - return freelist_size; +#endif } void -PyFrame_Fini(void) +_PyFrame_Fini(void) { - (void)PyFrame_ClearFreeList(); + _PyFrame_ClearFreeList(); } /* Print summary info about the state of the optimized allocator */ void _PyFrame_DebugMallocStats(FILE *out) { +#if PyFrame_MAXFREELIST > 0 _PyDebugAllocatorStats(out, "free PyFrameObject", numfree, sizeof(PyFrameObject)); +#endif } + +PyCodeObject * +PyFrame_GetCode(PyFrameObject *frame) +{ + assert(frame != NULL); + PyCodeObject *code = frame->f_code; + assert(code != NULL); + Py_INCREF(code); + return code; +} + + +PyFrameObject* +PyFrame_GetBack(PyFrameObject *frame) +{ + assert(frame != NULL); + PyFrameObject *back = frame->f_back; + Py_XINCREF(back); + return back; +} diff --git a/Objects/funcobject.c b/Objects/funcobject.c index df5cc2d3f570243ad3d5325971997ed45259141e..2c60275d90619c762b03a42e79b793bd861cfeb4 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -3,11 +3,9 @@ #include "Python.h" #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" #include "pycore_tupleobject.h" #include "code.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef PyObject * PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname) @@ -22,9 +20,23 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname return NULL; } + /* __module__: If module name is in globals, use it. + Otherwise, use None. */ + module = PyDict_GetItemWithError(globals, __name__); + if (module) { + Py_INCREF(module); + } + else if (PyErr_Occurred()) { + return NULL; + } + op = PyObject_GC_New(PyFunctionObject, &PyFunction_Type); - if (op == NULL) + if (op == NULL) { + Py_XDECREF(module); return NULL; + } + /* Note: No failures from this point on, since func_dealloc() does not + expect a partially-created object. */ op->func_weakreflist = NULL; Py_INCREF(code); @@ -37,6 +49,7 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname op->func_kwdefaults = NULL; /* No keyword only defaults */ op->func_closure = NULL; op->vectorcall = _PyFunction_Vectorcall; + op->func_module = module; consts = ((PyCodeObject *)code)->co_consts; if (PyTuple_Size(consts) >= 1) { @@ -50,20 +63,8 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname op->func_doc = doc; op->func_dict = NULL; - op->func_module = NULL; op->func_annotations = NULL; - /* __module__: If module name is in globals, use it. - Otherwise, use None. */ - module = PyDict_GetItemWithError(globals, __name__); - if (module) { - Py_INCREF(module); - op->func_module = module; - } - else if (PyErr_Occurred()) { - Py_DECREF(op); - return NULL; - } if (qualname) op->func_qualname = qualname; else @@ -196,7 +197,7 @@ PyFunction_SetClosure(PyObject *op, PyObject *closure) else { PyErr_Format(PyExc_SystemError, "expected tuple for closure, got '%.100s'", - closure->ob_type->tp_name); + Py_TYPE(closure)->tp_name); return -1; } Py_XSETREF(((PyFunctionObject *)op)->func_closure, closure); @@ -239,12 +240,10 @@ PyFunction_SetAnnotations(PyObject *op, PyObject *annotations) #define OFF(x) offsetof(PyFunctionObject, x) static PyMemberDef func_memberlist[] = { - {"__closure__", T_OBJECT, OFF(func_closure), - RESTRICTED|READONLY}, - {"__doc__", T_OBJECT, OFF(func_doc), PY_WRITE_RESTRICTED}, - {"__globals__", T_OBJECT, OFF(func_globals), - RESTRICTED|READONLY}, - {"__module__", T_OBJECT, OFF(func_module), PY_WRITE_RESTRICTED}, + {"__closure__", T_OBJECT, OFF(func_closure), READONLY}, + {"__doc__", T_OBJECT, OFF(func_doc), 0}, + {"__globals__", T_OBJECT, OFF(func_globals), READONLY}, + {"__module__", T_OBJECT, OFF(func_module), 0}, {NULL} /* Sentinel */ }; @@ -541,7 +540,7 @@ func_new_impl(PyTypeObject *type, PyCodeObject *code, PyObject *globals, if (!PyCell_Check(o)) { return PyErr_Format(PyExc_TypeError, "arg 5 (closure) expected cell, found %s", - o->ob_type->tp_name); + Py_TYPE(o)->tp_name); } } } @@ -622,17 +621,6 @@ func_traverse(PyFunctionObject *f, visitproc visit, void *arg) return 0; } -static PyObject * -function_call(PyObject *func, PyObject *args, PyObject *kwargs) -{ - PyObject **stack; - Py_ssize_t nargs; - - stack = _PyTuple_ITEMS(args); - nargs = PyTuple_GET_SIZE(args); - return _PyFunction_FastCallDict(func, stack, nargs, kwargs); -} - /* Bind a function to an object */ static PyObject * func_descr_get(PyObject *func, PyObject *obj, PyObject *type) @@ -659,13 +647,13 @@ PyTypeObject PyFunction_Type = { 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ - function_call, /* tp_call */ + PyVectorcall_Call, /* tp_call */ 0, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | - _Py_TPFLAGS_HAVE_VECTORCALL | + Py_TPFLAGS_HAVE_VECTORCALL | Py_TPFLAGS_METHOD_DESCRIPTOR, /* tp_flags */ func_new__doc__, /* tp_doc */ (traverseproc)func_traverse, /* tp_traverse */ @@ -752,6 +740,10 @@ cm_descr_get(PyObject *self, PyObject *obj, PyObject *type) } if (type == NULL) type = (PyObject *)(Py_TYPE(obj)); + if (Py_TYPE(cm->cm_callable)->tp_descr_get != NULL) { + return Py_TYPE(cm->cm_callable)->tp_descr_get(cm->cm_callable, type, + NULL); + } return PyMethod_New(cm->cm_callable, type); } diff --git a/Objects/genericaliasobject.c b/Objects/genericaliasobject.c new file mode 100644 index 0000000000000000000000000000000000000000..945d20593c7c90116af51b78d9854c16e4156a00 --- /dev/null +++ b/Objects/genericaliasobject.c @@ -0,0 +1,653 @@ +// types.GenericAlias -- used to represent e.g. list[int]. + +#include "Python.h" +#include "pycore_object.h" +#include "structmember.h" // PyMemberDef + +typedef struct { + PyObject_HEAD + PyObject *origin; + PyObject *args; + PyObject *parameters; + PyObject* weakreflist; +} gaobject; + +static void +ga_dealloc(PyObject *self) +{ + gaobject *alias = (gaobject *)self; + + _PyObject_GC_UNTRACK(self); + if (alias->weakreflist != NULL) { + PyObject_ClearWeakRefs((PyObject *)alias); + } + Py_XDECREF(alias->origin); + Py_XDECREF(alias->args); + Py_XDECREF(alias->parameters); + self->ob_type->tp_free(self); +} + +static int +ga_traverse(PyObject *self, visitproc visit, void *arg) +{ + gaobject *alias = (gaobject *)self; + Py_VISIT(alias->origin); + Py_VISIT(alias->args); + Py_VISIT(alias->parameters); + return 0; +} + +static int +ga_repr_item(_PyUnicodeWriter *writer, PyObject *p) +{ + _Py_IDENTIFIER(__module__); + _Py_IDENTIFIER(__qualname__); + _Py_IDENTIFIER(__origin__); + _Py_IDENTIFIER(__args__); + PyObject *qualname = NULL; + PyObject *module = NULL; + PyObject *r = NULL; + PyObject *tmp; + int err; + + if (p == Py_Ellipsis) { + // The Ellipsis object + r = PyUnicode_FromString("..."); + goto done; + } + + if (_PyObject_LookupAttrId(p, &PyId___origin__, &tmp) < 0) { + goto done; + } + if (tmp != NULL) { + Py_DECREF(tmp); + if (_PyObject_LookupAttrId(p, &PyId___args__, &tmp) < 0) { + goto done; + } + if (tmp != NULL) { + Py_DECREF(tmp); + // It looks like a GenericAlias + goto use_repr; + } + } + + if (_PyObject_LookupAttrId(p, &PyId___qualname__, &qualname) < 0) { + goto done; + } + if (qualname == NULL) { + goto use_repr; + } + if (_PyObject_LookupAttrId(p, &PyId___module__, &module) < 0) { + goto done; + } + if (module == NULL || module == Py_None) { + goto use_repr; + } + + // Looks like a class + if (PyUnicode_Check(module) && + _PyUnicode_EqualToASCIIString(module, "builtins")) + { + // builtins don't need a module name + r = PyObject_Str(qualname); + goto done; + } + else { + r = PyUnicode_FromFormat("%S.%S", module, qualname); + goto done; + } + +use_repr: + r = PyObject_Repr(p); + +done: + Py_XDECREF(qualname); + Py_XDECREF(module); + if (r == NULL) { + // error if any of the above PyObject_Repr/PyUnicode_From* fail + err = -1; + } + else { + err = _PyUnicodeWriter_WriteStr(writer, r); + Py_DECREF(r); + } + return err; +} + +static PyObject * +ga_repr(PyObject *self) +{ + gaobject *alias = (gaobject *)self; + Py_ssize_t len = PyTuple_GET_SIZE(alias->args); + + _PyUnicodeWriter writer; + _PyUnicodeWriter_Init(&writer); + + if (ga_repr_item(&writer, alias->origin) < 0) { + goto error; + } + if (_PyUnicodeWriter_WriteASCIIString(&writer, "[", 1) < 0) { + goto error; + } + for (Py_ssize_t i = 0; i < len; i++) { + if (i > 0) { + if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0) { + goto error; + } + } + PyObject *p = PyTuple_GET_ITEM(alias->args, i); + if (ga_repr_item(&writer, p) < 0) { + goto error; + } + } + if (len == 0) { + // for something like tuple[()] we should print a "()" + if (_PyUnicodeWriter_WriteASCIIString(&writer, "()", 2) < 0) { + goto error; + } + } + if (_PyUnicodeWriter_WriteASCIIString(&writer, "]", 1) < 0) { + goto error; + } + return _PyUnicodeWriter_Finish(&writer); +error: + _PyUnicodeWriter_Dealloc(&writer); + return NULL; +} + +// isinstance(obj, TypeVar) without importing typing.py. +// Returns -1 for errors. +static int +is_typevar(PyObject *obj) +{ + PyTypeObject *type = Py_TYPE(obj); + if (strcmp(type->tp_name, "TypeVar") != 0) { + return 0; + } + PyObject *module = PyObject_GetAttrString((PyObject *)type, "__module__"); + if (module == NULL) { + return -1; + } + int res = PyUnicode_Check(module) + && _PyUnicode_EqualToASCIIString(module, "typing"); + Py_DECREF(module); + return res; +} + +// Index of item in self[:len], or -1 if not found (self is a tuple) +static Py_ssize_t +tuple_index(PyObject *self, Py_ssize_t len, PyObject *item) +{ + for (Py_ssize_t i = 0; i < len; i++) { + if (PyTuple_GET_ITEM(self, i) == item) { + return i; + } + } + return -1; +} + +static int +tuple_add(PyObject *self, Py_ssize_t len, PyObject *item) +{ + if (tuple_index(self, len, item) < 0) { + Py_INCREF(item); + PyTuple_SET_ITEM(self, len, item); + return 1; + } + return 0; +} + +static PyObject * +make_parameters(PyObject *args) +{ + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + Py_ssize_t len = nargs; + PyObject *parameters = PyTuple_New(len); + if (parameters == NULL) + return NULL; + Py_ssize_t iparam = 0; + for (Py_ssize_t iarg = 0; iarg < nargs; iarg++) { + PyObject *t = PyTuple_GET_ITEM(args, iarg); + int typevar = is_typevar(t); + if (typevar < 0) { + Py_DECREF(parameters); + return NULL; + } + if (typevar) { + iparam += tuple_add(parameters, iparam, t); + } + else { + _Py_IDENTIFIER(__parameters__); + PyObject *subparams; + if (_PyObject_LookupAttrId(t, &PyId___parameters__, &subparams) < 0) { + Py_DECREF(parameters); + return NULL; + } + if (subparams && PyTuple_Check(subparams)) { + Py_ssize_t len2 = PyTuple_GET_SIZE(subparams); + Py_ssize_t needed = len2 - 1 - (iarg - iparam); + if (needed > 0) { + len += needed; + if (_PyTuple_Resize(¶meters, len) < 0) { + Py_DECREF(subparams); + Py_DECREF(parameters); + return NULL; + } + } + for (Py_ssize_t j = 0; j < len2; j++) { + PyObject *t2 = PyTuple_GET_ITEM(subparams, j); + iparam += tuple_add(parameters, iparam, t2); + } + } + Py_XDECREF(subparams); + } + } + if (iparam < len) { + if (_PyTuple_Resize(¶meters, iparam) < 0) { + Py_XDECREF(parameters); + return NULL; + } + } + return parameters; +} + +/* If obj is a generic alias, substitute type variables params + with substitutions argitems. For example, if obj is list[T], + params is (T, S), and argitems is (str, int), return list[str]. + If obj doesn't have a __parameters__ attribute or that's not + a non-empty tuple, return a new reference to obj. */ +static PyObject * +subs_tvars(PyObject *obj, PyObject *params, PyObject **argitems) +{ + _Py_IDENTIFIER(__parameters__); + PyObject *subparams; + if (_PyObject_LookupAttrId(obj, &PyId___parameters__, &subparams) < 0) { + return NULL; + } + if (subparams && PyTuple_Check(subparams) && PyTuple_GET_SIZE(subparams)) { + Py_ssize_t nparams = PyTuple_GET_SIZE(params); + Py_ssize_t nsubargs = PyTuple_GET_SIZE(subparams); + PyObject *subargs = PyTuple_New(nsubargs); + if (subargs == NULL) { + Py_DECREF(subparams); + return NULL; + } + for (Py_ssize_t i = 0; i < nsubargs; ++i) { + PyObject *arg = PyTuple_GET_ITEM(subparams, i); + Py_ssize_t iparam = tuple_index(params, nparams, arg); + if (iparam >= 0) { + arg = argitems[iparam]; + } + Py_INCREF(arg); + PyTuple_SET_ITEM(subargs, i, arg); + } + + obj = PyObject_GetItem(obj, subargs); + + Py_DECREF(subargs); + } + else { + Py_INCREF(obj); + } + Py_XDECREF(subparams); + return obj; +} + +static PyObject * +ga_getitem(PyObject *self, PyObject *item) +{ + gaobject *alias = (gaobject *)self; + // do a lookup for __parameters__ so it gets populated (if not already) + if (alias->parameters == NULL) { + alias->parameters = make_parameters(alias->args); + if (alias->parameters == NULL) { + return NULL; + } + } + Py_ssize_t nparams = PyTuple_GET_SIZE(alias->parameters); + if (nparams == 0) { + return PyErr_Format(PyExc_TypeError, + "There are no type variables left in %R", + self); + } + int is_tuple = PyTuple_Check(item); + Py_ssize_t nitems = is_tuple ? PyTuple_GET_SIZE(item) : 1; + PyObject **argitems = is_tuple ? &PyTuple_GET_ITEM(item, 0) : &item; + if (nitems != nparams) { + return PyErr_Format(PyExc_TypeError, + "Too %s arguments for %R", + nitems > nparams ? "many" : "few", + self); + } + /* Replace all type variables (specified by alias->parameters) + with corresponding values specified by argitems. + t = list[T]; t[int] -> newargs = [int] + t = dict[str, T]; t[int] -> newargs = [str, int] + t = dict[T, list[S]]; t[str, int] -> newargs = [str, list[int]] + */ + Py_ssize_t nargs = PyTuple_GET_SIZE(alias->args); + PyObject *newargs = PyTuple_New(nargs); + if (newargs == NULL) { + return NULL; + } + for (Py_ssize_t iarg = 0; iarg < nargs; iarg++) { + PyObject *arg = PyTuple_GET_ITEM(alias->args, iarg); + int typevar = is_typevar(arg); + if (typevar < 0) { + Py_DECREF(newargs); + return NULL; + } + if (typevar) { + Py_ssize_t iparam = tuple_index(alias->parameters, nparams, arg); + assert(iparam >= 0); + arg = argitems[iparam]; + Py_INCREF(arg); + } + else { + arg = subs_tvars(arg, alias->parameters, argitems); + if (arg == NULL) { + Py_DECREF(newargs); + return NULL; + } + } + PyTuple_SET_ITEM(newargs, iarg, arg); + } + + PyObject *res = Py_GenericAlias(alias->origin, newargs); + + Py_DECREF(newargs); + return res; +} + +static PyMappingMethods ga_as_mapping = { + .mp_subscript = ga_getitem, +}; + +static Py_hash_t +ga_hash(PyObject *self) +{ + gaobject *alias = (gaobject *)self; + // TODO: Hash in the hash for the origin + Py_hash_t h0 = PyObject_Hash(alias->origin); + if (h0 == -1) { + return -1; + } + Py_hash_t h1 = PyObject_Hash(alias->args); + if (h1 == -1) { + return -1; + } + return h0 ^ h1; +} + +static PyObject * +ga_call(PyObject *self, PyObject *args, PyObject *kwds) +{ + gaobject *alias = (gaobject *)self; + PyObject *obj = PyObject_Call(alias->origin, args, kwds); + if (obj != NULL) { + if (PyObject_SetAttrString(obj, "__orig_class__", self) < 0) { + if (!PyErr_ExceptionMatches(PyExc_AttributeError) && + !PyErr_ExceptionMatches(PyExc_TypeError)) + { + Py_DECREF(obj); + return NULL; + } + PyErr_Clear(); + } + } + return obj; +} + +static const char* const attr_exceptions[] = { + "__origin__", + "__args__", + "__parameters__", + "__mro_entries__", + "__reduce_ex__", // needed so we don't look up object.__reduce_ex__ + "__reduce__", + NULL, +}; + +static PyObject * +ga_getattro(PyObject *self, PyObject *name) +{ + gaobject *alias = (gaobject *)self; + if (PyUnicode_Check(name)) { + for (const char * const *p = attr_exceptions; ; p++) { + if (*p == NULL) { + return PyObject_GetAttr(alias->origin, name); + } + if (_PyUnicode_EqualToASCIIString(name, *p)) { + break; + } + } + } + return PyObject_GenericGetAttr(self, name); +} + +static PyObject * +ga_richcompare(PyObject *a, PyObject *b, int op) +{ + if (!PyObject_TypeCheck(a, &Py_GenericAliasType) || + !PyObject_TypeCheck(b, &Py_GenericAliasType) || + (op != Py_EQ && op != Py_NE)) + { + Py_RETURN_NOTIMPLEMENTED; + } + + if (op == Py_NE) { + PyObject *eq = ga_richcompare(a, b, Py_EQ); + if (eq == NULL) + return NULL; + Py_DECREF(eq); + if (eq == Py_True) { + Py_RETURN_FALSE; + } + else { + Py_RETURN_TRUE; + } + } + + gaobject *aa = (gaobject *)a; + gaobject *bb = (gaobject *)b; + int eq = PyObject_RichCompareBool(aa->origin, bb->origin, Py_EQ); + if (eq < 0) { + return NULL; + } + if (!eq) { + Py_RETURN_FALSE; + } + return PyObject_RichCompare(aa->args, bb->args, Py_EQ); +} + +static PyObject * +ga_mro_entries(PyObject *self, PyObject *args) +{ + gaobject *alias = (gaobject *)self; + return PyTuple_Pack(1, alias->origin); +} + +static PyObject * +ga_instancecheck(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + PyErr_SetString(PyExc_TypeError, + "isinstance() argument 2 cannot be a parameterized generic"); + return NULL; +} + +static PyObject * +ga_subclasscheck(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + PyErr_SetString(PyExc_TypeError, + "issubclass() argument 2 cannot be a parameterized generic"); + return NULL; +} + +static PyObject * +ga_reduce(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + gaobject *alias = (gaobject *)self; + return Py_BuildValue("O(OO)", Py_TYPE(alias), + alias->origin, alias->args); +} + +static PyObject * +ga_dir(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + gaobject *alias = (gaobject *)self; + PyObject *dir = PyObject_Dir(alias->origin); + if (dir == NULL) { + return NULL; + } + + PyObject *dir_entry = NULL; + for (const char * const *p = attr_exceptions; ; p++) { + if (*p == NULL) { + break; + } + else { + dir_entry = PyUnicode_FromString(*p); + if (dir_entry == NULL) { + goto error; + } + int contains = PySequence_Contains(dir, dir_entry); + if (contains < 0) { + goto error; + } + if (contains == 0 && PyList_Append(dir, dir_entry) < 0) { + goto error; + } + + Py_CLEAR(dir_entry); + } + } + return dir; + +error: + Py_DECREF(dir); + Py_XDECREF(dir_entry); + return NULL; +} + +static PyMethodDef ga_methods[] = { + {"__mro_entries__", ga_mro_entries, METH_O}, + {"__instancecheck__", ga_instancecheck, METH_O}, + {"__subclasscheck__", ga_subclasscheck, METH_O}, + {"__reduce__", ga_reduce, METH_NOARGS}, + {"__dir__", ga_dir, METH_NOARGS}, + {0} +}; + +static PyMemberDef ga_members[] = { + {"__origin__", T_OBJECT, offsetof(gaobject, origin), READONLY}, + {"__args__", T_OBJECT, offsetof(gaobject, args), READONLY}, + {0} +}; + +static PyObject * +ga_parameters(PyObject *self, void *unused) +{ + gaobject *alias = (gaobject *)self; + if (alias->parameters == NULL) { + alias->parameters = make_parameters(alias->args); + if (alias->parameters == NULL) { + return NULL; + } + } + Py_INCREF(alias->parameters); + return alias->parameters; +} + +static PyGetSetDef ga_properties[] = { + {"__parameters__", ga_parameters, (setter)NULL, "Type variables in the GenericAlias.", NULL}, + {0} +}; + +/* A helper function to create GenericAlias' args tuple and set its attributes. + * Returns 1 on success, 0 on failure. + */ +static inline int +setup_ga(gaobject *alias, PyObject *origin, PyObject *args) { + if (!PyTuple_Check(args)) { + args = PyTuple_Pack(1, args); + if (args == NULL) { + return 0; + } + } + else { + Py_INCREF(args); + } + + Py_INCREF(origin); + alias->origin = origin; + alias->args = args; + alias->parameters = NULL; + alias->weakreflist = NULL; + return 1; +} + +static PyObject * +ga_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + if (!_PyArg_NoKeywords("GenericAlias", kwds)) { + return NULL; + } + if (!_PyArg_CheckPositional("GenericAlias", PyTuple_GET_SIZE(args), 2, 2)) { + return NULL; + } + PyObject *origin = PyTuple_GET_ITEM(args, 0); + PyObject *arguments = PyTuple_GET_ITEM(args, 1); + gaobject *self = (gaobject *)type->tp_alloc(type, 0); + if (self == NULL) { + return NULL; + } + if (!setup_ga(self, origin, arguments)) { + type->tp_free((PyObject *)self); + return NULL; + } + return (PyObject *)self; +} + +// TODO: +// - argument clinic? +// - __doc__? +// - cache? +PyTypeObject Py_GenericAliasType = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + .tp_name = "types.GenericAlias", + .tp_doc = "Represent a PEP 585 generic type\n" + "\n" + "E.g. for t = list[int], t.__origin__ is list and t.__args__ is (int,).", + .tp_basicsize = sizeof(gaobject), + .tp_dealloc = ga_dealloc, + .tp_repr = ga_repr, + .tp_as_mapping = &ga_as_mapping, + .tp_hash = ga_hash, + .tp_call = ga_call, + .tp_getattro = ga_getattro, + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, + .tp_traverse = ga_traverse, + .tp_richcompare = ga_richcompare, + .tp_weaklistoffset = offsetof(gaobject, weakreflist), + .tp_methods = ga_methods, + .tp_members = ga_members, + .tp_alloc = PyType_GenericAlloc, + .tp_new = ga_new, + .tp_free = PyObject_GC_Del, + .tp_getset = ga_properties, +}; + +PyObject * +Py_GenericAlias(PyObject *origin, PyObject *args) +{ + gaobject *alias = PyObject_GC_New(gaobject, &Py_GenericAliasType); + if (alias == NULL) { + return NULL; + } + if (!setup_ga(alias, origin, args)) { + PyObject_GC_Del((PyObject *)alias); + return NULL; + } + _PyObject_GC_TRACK(alias); + return (PyObject *)alias; +} diff --git a/Objects/genobject.c b/Objects/genobject.c index ce7dd48a17cfb6ae36b36c99726520942b0a0c72..72c93f613e0eda607d69d4b7a2caf386d8845bdf 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -1,10 +1,12 @@ /* Generator object implementation */ #include "Python.h" +#include "pycore_ceval.h" // _PyEval_EvalFrame() #include "pycore_object.h" -#include "pycore_pystate.h" +#include "pycore_pyerrors.h" // _PyErr_ClearExcState() +#include "pycore_pystate.h" // _PyThreadState_GET() #include "frameobject.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include "opcode.h" static PyObject *gen_close(PyGenObject *, PyObject *); @@ -57,7 +59,7 @@ _PyGen_Finalize(PyObject *self) /* Save the current exception, if any. */ PyErr_Fetch(&error_type, &error_value, &error_traceback); - res = PyObject_CallFunctionObjArgs(finalizer, self, NULL); + res = PyObject_CallOneArg(finalizer, self); if (res == NULL) { PyErr_WriteUnraisable(self); @@ -98,21 +100,6 @@ _PyGen_Finalize(PyObject *self) PyErr_Restore(error_type, error_value, error_traceback); } -static inline void -exc_state_clear(_PyErr_StackItem *exc_state) -{ - PyObject *t, *v, *tb; - t = exc_state->exc_type; - v = exc_state->exc_value; - tb = exc_state->exc_traceback; - exc_state->exc_type = NULL; - exc_state->exc_value = NULL; - exc_state->exc_traceback = NULL; - Py_XDECREF(t); - Py_XDECREF(v); - Py_XDECREF(tb); -} - static void gen_dealloc(PyGenObject *gen) { @@ -145,7 +132,7 @@ gen_dealloc(PyGenObject *gen) Py_CLEAR(gen->gi_code); Py_CLEAR(gen->gi_name); Py_CLEAR(gen->gi_qualname); - exc_state_clear(&gen->gi_exc_state); + _PyErr_ClearExcState(&gen->gi_exc_state); PyObject_GC_Del(gen); } @@ -219,7 +206,13 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing) gen->gi_running = 1; gen->gi_exc_state.previous_item = tstate->exc_info; tstate->exc_info = &gen->gi_exc_state; - result = PyEval_EvalFrameEx(f, exc); + + if (exc) { + assert(_PyErr_Occurred(tstate)); + _PyErr_ChainStackItem(NULL); + } + + result = _PyEval_EvalFrame(tstate, f, exc); tstate->exc_info = gen->gi_exc_state.previous_item; gen->gi_exc_state.previous_item = NULL; gen->gi_running = 0; @@ -254,7 +247,7 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing) if (PyCoro_CheckExact(gen)) { msg = "coroutine raised StopIteration"; } - else if PyAsyncGen_CheckExact(gen) { + else if (PyAsyncGen_CheckExact(gen)) { msg = "async generator raised StopIteration"; } _PyErr_FormatFromCause(PyExc_RuntimeError, "%s", msg); @@ -273,7 +266,7 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing) if (!result || f->f_stacktop == NULL) { /* generator can't be rerun, so release the frame */ /* first clean reference cycle through stored exception traceback */ - exc_state_clear(&gen->gi_exc_state); + _PyErr_ClearExcState(&gen->gi_exc_state); gen->gi_frame->f_gen = NULL; gen->gi_frame = NULL; Py_DECREF(f); @@ -421,11 +414,21 @@ _gen_throw(PyGenObject *gen, int close_on_genexit, } if (PyGen_CheckExact(yf) || PyCoro_CheckExact(yf)) { /* `yf` is a generator or a coroutine. */ + PyThreadState *tstate = _PyThreadState_GET(); + PyFrameObject *f = tstate->frame; + gen->gi_running = 1; + /* Since we are fast-tracking things by skipping the eval loop, + we need to update the current frame so the stack trace + will be reported correctly to the user. */ + /* XXX We should probably be updating the current frame + somewhere in ceval.c. */ + tstate->frame = gen->gi_frame; /* Close the generator that we are currently iterating with 'yield from' or awaiting on with 'await'. */ ret = _gen_throw((PyGenObject *)yf, close_on_genexit, typ, val, tb); + tstate->frame = f; gen->gi_running = 0; } else { /* `yf` is an iterator or a coroutine-like object. */ @@ -562,7 +565,7 @@ _PyGen_SetStopIterationValue(PyObject *value) return 0; } /* Construct an exception instance manually with - * PyObject_CallFunctionObjArgs and pass it to PyErr_SetObject. + * PyObject_CallOneArg and pass it to PyErr_SetObject. * * We do this to handle a situation when "value" is a tuple, in which * case PyErr_SetObject would set the value of StopIteration to @@ -570,7 +573,7 @@ _PyGen_SetStopIterationValue(PyObject *value) * * (See PyErr_SetObject/_PyErr_CreateException code for details.) */ - e = PyObject_CallFunctionObjArgs(PyExc_StopIteration, value, NULL); + e = PyObject_CallOneArg(PyExc_StopIteration, value); if (e == NULL) { return -1; } @@ -819,22 +822,6 @@ PyGen_New(PyFrameObject *f) return gen_new_with_qualname(&PyGen_Type, f, NULL, NULL); } -int -PyGen_NeedsFinalizing(PyGenObject *gen) -{ - PyFrameObject *f = gen->gi_frame; - - if (f == NULL || f->f_stacktop == NULL) - return 0; /* no frame or empty blockstack == no finalization */ - - /* Any (exception-handling) block type requires cleanup. */ - if (f->f_iblock > 0) - return 1; - - /* No blocks, it's safe to skip finalization. */ - return 0; -} - /* Coroutine Object */ typedef struct { @@ -1132,11 +1119,11 @@ compute_cr_origin(int origin_depth) } frame = PyEval_GetFrame(); for (int i = 0; i < frame_count; ++i) { - PyObject *frameinfo = Py_BuildValue( - "OiO", - frame->f_code->co_filename, - PyFrame_GetLineNumber(frame), - frame->f_code->co_name); + PyCodeObject *code = frame->f_code; + PyObject *frameinfo = Py_BuildValue("OiO", + code->co_filename, + PyFrame_GetLineNumber(frame), + code->co_name); if (!frameinfo) { Py_DECREF(cr_origin); return NULL; @@ -1231,10 +1218,10 @@ static PyAsyncGenASend *ag_asend_freelist[_PyAsyncGen_MAXFREELIST]; static int ag_asend_freelist_free = 0; #define _PyAsyncGenWrappedValue_CheckExact(o) \ - (Py_TYPE(o) == &_PyAsyncGenWrappedValue_Type) + Py_IS_TYPE(o, &_PyAsyncGenWrappedValue_Type) #define PyAsyncGenASend_CheckExact(o) \ - (Py_TYPE(o) == &_PyAsyncGenASend_Type) + Py_IS_TYPE(o, &_PyAsyncGenASend_Type) static int @@ -1279,7 +1266,7 @@ async_gen_init_hooks(PyAsyncGenObject *o) PyObject *res; Py_INCREF(firstiter); - res = PyObject_CallFunctionObjArgs(firstiter, o, NULL); + res = PyObject_CallOneArg(firstiter, (PyObject *)o); Py_DECREF(firstiter); if (res == NULL) { return 1; @@ -1361,6 +1348,8 @@ static PyMethodDef async_gen_methods[] = { {"asend", (PyCFunction)async_gen_asend, METH_O, async_asend_doc}, {"athrow",(PyCFunction)async_gen_athrow, METH_VARARGS, async_athrow_doc}, {"aclose", (PyCFunction)async_gen_aclose, METH_NOARGS, async_aclose_doc}, + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* Sentinel */ }; @@ -1442,11 +1431,9 @@ PyAsyncGen_New(PyFrameObject *f, PyObject *name, PyObject *qualname) } -int -PyAsyncGen_ClearFreeLists(void) +void +_PyAsyncGen_ClearFreeLists(void) { - int ret = ag_value_freelist_free + ag_asend_freelist_free; - while (ag_value_freelist_free) { _PyAsyncGenWrappedValue *o; o = ag_value_freelist[--ag_value_freelist_free]; @@ -1457,17 +1444,15 @@ PyAsyncGen_ClearFreeLists(void) while (ag_asend_freelist_free) { PyAsyncGenASend *o; o = ag_asend_freelist[--ag_asend_freelist_free]; - assert(Py_TYPE(o) == &_PyAsyncGenASend_Type); + assert(Py_IS_TYPE(o, &_PyAsyncGenASend_Type)); PyObject_GC_Del(o); } - - return ret; } void -PyAsyncGen_Fini(void) +_PyAsyncGen_Fini(void) { - PyAsyncGen_ClearFreeLists(); + _PyAsyncGen_ClearFreeLists(); } diff --git a/Objects/interpreteridobject.c b/Objects/interpreteridobject.c index 94f5dd709bbda0906cb013712950bef5e928812b..39bde97269590b610561bf2ef8489f925368d62e 100644 --- a/Objects/interpreteridobject.c +++ b/Objects/interpreteridobject.c @@ -1,7 +1,8 @@ /* InterpreterID object */ #include "Python.h" -#include "internal/pycore_pystate.h" +#include "pycore_abstract.h" // _PyIndex_Check() +#include "pycore_interp.h" // _PyInterpreterState_LookUpID() #include "interpreteridobject.h" @@ -42,7 +43,7 @@ interp_id_converter(PyObject *arg, void *ptr) if (PyObject_TypeCheck(arg, &_PyInterpreterID_Type)) { id = ((interpid *)arg)->id; } - else if (PyIndex_Check(arg)) { + else if (_PyIndex_Check(arg)) { id = PyLong_AsLongLong(arg); if (id == -1 && PyErr_Occurred()) { return 0; @@ -56,7 +57,7 @@ interp_id_converter(PyObject *arg, void *ptr) else { PyErr_Format(PyExc_TypeError, "interpreter ID must be an int, got %.100s", - arg->ob_type->tp_name); + Py_TYPE(arg)->tp_name); return 0; } *(int64_t *)ptr = id; @@ -269,7 +270,7 @@ _PyInterpreterState_GetIDObject(PyInterpreterState *interp) if (_PyInterpreterState_IDInitref(interp) != 0) { return NULL; }; - PY_INT64_T id = PyInterpreterState_GetID(interp); + int64_t id = PyInterpreterState_GetID(interp); if (id < 0) { return NULL; } diff --git a/Objects/iterobject.c b/Objects/iterobject.c index da89298edc5cf65ab2a916c1f005bec5d4141236..6cac41ad539db121e3722ff4c1fc7f17584b9c61 100644 --- a/Objects/iterobject.c +++ b/Objects/iterobject.c @@ -2,8 +2,6 @@ #include "Python.h" #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" typedef struct { PyObject_HEAD @@ -11,6 +9,8 @@ typedef struct { PyObject *it_seq; /* Set to NULL when iterator is exhausted */ } seqiterobject; +_Py_IDENTIFIER(iter); + PyObject * PySeqIter_New(PyObject *seq) { @@ -104,7 +104,6 @@ PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list( static PyObject * iter_reduce(seqiterobject *it, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(iter); if (it->it_seq != NULL) return Py_BuildValue("N(O)n", _PyEval_GetBuiltinId(&PyId_iter), it->it_seq, it->it_index); @@ -244,7 +243,6 @@ calliter_iternext(calliterobject *it) static PyObject * calliter_reduce(calliterobject *it, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(iter); if (it->it_callable != NULL && it->it_sentinel != NULL) return Py_BuildValue("N(OO)", _PyEval_GetBuiltinId(&PyId_iter), it->it_callable, it->it_sentinel); diff --git a/Objects/listobject.c b/Objects/listobject.c index 30444089ffaf96122b581dff08caf8a25f5d8311..f9eb37064a9c975483a4517b158b1ea96db494a7 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -1,8 +1,8 @@ /* List object implementation */ #include "Python.h" +#include "pycore_abstract.h" // _PyIndex_Check() #include "pycore_object.h" -#include "pycore_pystate.h" #include "pycore_tupleobject.h" #include "pycore_accu.h" @@ -45,7 +45,7 @@ list_resize(PyListObject *self, Py_ssize_t newsize) */ if (allocated >= newsize && newsize >= (allocated >> 1)) { assert(self->ob_item != NULL || newsize == 0); - Py_SIZE(self) = newsize; + Py_SET_SIZE(self, newsize); return 0; } @@ -54,15 +54,17 @@ list_resize(PyListObject *self, Py_ssize_t newsize) * enough to give linear-time amortized behavior over a long * sequence of appends() in the presence of a poorly-performing * system realloc(). - * The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ... + * Add padding to make the allocated size multiple of 4. + * The growth pattern is: 0, 4, 8, 16, 24, 32, 40, 52, 64, 76, ... * Note: new_allocated won't overflow because the largest possible value * is PY_SSIZE_T_MAX * (9 / 8) + 6 which always fits in a size_t. */ - new_allocated = (size_t)newsize + (newsize >> 3) + (newsize < 9 ? 3 : 6); - if (new_allocated > (size_t)PY_SSIZE_T_MAX / sizeof(PyObject *)) { - PyErr_NoMemory(); - return -1; - } + new_allocated = ((size_t)newsize + (newsize >> 3) + 6) & ~(size_t)3; + /* Do not overallocate if the new size is closer to overalocated size + * than to the old size. + */ + if (newsize - Py_SIZE(self) > (Py_ssize_t)(new_allocated - newsize)) + new_allocated = ((size_t)newsize + 3) & ~(size_t)3; if (newsize == 0) new_allocated = 0; @@ -73,7 +75,7 @@ list_resize(PyListObject *self, Py_ssize_t newsize) return -1; } self->ob_item = items; - Py_SIZE(self) = newsize; + Py_SET_SIZE(self, newsize); self->allocated = new_allocated; return 0; } @@ -94,53 +96,28 @@ list_preallocate_exact(PyListObject *self, Py_ssize_t size) return 0; } -/* Debug statistic to compare allocations with reuse through the free list */ -#undef SHOW_ALLOC_COUNT -#ifdef SHOW_ALLOC_COUNT -static size_t count_alloc = 0; -static size_t count_reuse = 0; - -static void -show_alloc(void) -{ - PyInterpreterState *interp = _PyInterpreterState_Get(); - if (!interp->config.show_alloc_count) { - return; - } - - fprintf(stderr, "List allocations: %" PY_FORMAT_SIZE_T "d\n", - count_alloc); - fprintf(stderr, "List reuse through freelist: %" PY_FORMAT_SIZE_T - "d\n", count_reuse); - fprintf(stderr, "%.2f%% reuse rate\n\n", - (100.0*count_reuse/(count_alloc+count_reuse))); -} -#endif - /* Empty list reuse scheme to save calls to malloc and free */ #ifndef PyList_MAXFREELIST -#define PyList_MAXFREELIST 80 +# define PyList_MAXFREELIST 80 #endif + static PyListObject *free_list[PyList_MAXFREELIST]; static int numfree = 0; -int -PyList_ClearFreeList(void) +void +_PyList_ClearFreeList(void) { - PyListObject *op; - int ret = numfree; while (numfree) { - op = free_list[--numfree]; + PyListObject *op = free_list[--numfree]; assert(PyList_CheckExact(op)); PyObject_GC_Del(op); } - return ret; } void -PyList_Fini(void) +_PyList_Fini(void) { - PyList_ClearFreeList(); + _PyList_ClearFreeList(); } /* Print summary info about the state of the optimized allocator */ @@ -156,13 +133,6 @@ PyObject * PyList_New(Py_ssize_t size) { PyListObject *op; -#ifdef SHOW_ALLOC_COUNT - static int initialized = 0; - if (!initialized) { - Py_AtExit(show_alloc); - initialized = 1; - } -#endif if (size < 0) { PyErr_BadInternalCall(); @@ -172,16 +142,10 @@ PyList_New(Py_ssize_t size) numfree--; op = free_list[numfree]; _Py_NewReference((PyObject *)op); -#ifdef SHOW_ALLOC_COUNT - count_reuse++; -#endif } else { op = PyObject_GC_New(PyListObject, &PyList_Type); if (op == NULL) return NULL; -#ifdef SHOW_ALLOC_COUNT - count_alloc++; -#endif } if (size <= 0) op->ob_item = NULL; @@ -192,7 +156,7 @@ PyList_New(Py_ssize_t size) return PyErr_NoMemory(); } } - Py_SIZE(op) = size; + Py_SET_SIZE(op, size); op->allocated = size; _PyObject_GC_TRACK(op); return (PyObject *) op; @@ -452,7 +416,7 @@ list_contains(PyListObject *a, PyObject *el) for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i) { item = PyList_GET_ITEM(a, i); Py_INCREF(item); - cmp = PyObject_RichCompareBool(el, item, Py_EQ); + cmp = PyObject_RichCompareBool(item, el, Py_EQ); Py_DECREF(item); } return cmp; @@ -493,7 +457,7 @@ list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh) Py_INCREF(v); dest[i] = v; } - Py_SIZE(np) = len; + Py_SET_SIZE(np, len); return (PyObject *)np; } @@ -529,7 +493,7 @@ list_concat(PyListObject *a, PyObject *bb) if (!PyList_Check(bb)) { PyErr_Format(PyExc_TypeError, "can only concatenate list (not \"%.200s\") to list", - bb->ob_type->tp_name); + Py_TYPE(bb)->tp_name); return NULL; } #define b ((PyListObject *)bb) @@ -554,7 +518,7 @@ list_concat(PyListObject *a, PyObject *bb) Py_INCREF(v); dest[i] = v; } - Py_SIZE(np) = size; + Py_SET_SIZE(np, size); return (PyObject *)np; #undef b } @@ -597,7 +561,7 @@ list_repeat(PyListObject *a, Py_ssize_t n) } } } - Py_SIZE(np) = size; + Py_SET_SIZE(np, size); return (PyObject *) np; } @@ -610,7 +574,7 @@ _list_clear(PyListObject *a) /* Because XDECREF can recursively invoke operations on this list, we make it empty first. */ i = Py_SIZE(a); - Py_SIZE(a) = 0; + Py_SET_SIZE(a, 0); a->ob_item = NULL; a->allocated = 0; while (--i >= 0) { @@ -928,7 +892,7 @@ list_extend(PyListObject *self, PyObject *iterable) it = PyObject_GetIter(iterable); if (it == NULL) return NULL; - iternext = *it->ob_type->tp_iternext; + iternext = *Py_TYPE(it)->tp_iternext; /* Guess a result list size. */ n = PyObject_LengthHint(iterable, 8); @@ -949,7 +913,7 @@ list_extend(PyListObject *self, PyObject *iterable) if (list_resize(self, mn) < 0) goto error; /* Make the list sane again. */ - Py_SIZE(self) = m; + Py_SET_SIZE(self, m); } /* Run iterator to exhaustion. */ @@ -967,7 +931,7 @@ list_extend(PyListObject *self, PyObject *iterable) if (Py_SIZE(self) < self->allocated) { /* steals ref */ PyList_SET_ITEM(self, Py_SIZE(self), item); - ++Py_SIZE(self); + Py_SET_SIZE(self, Py_SIZE(self) + 1); } else { int status = app1(self, item); @@ -1215,7 +1179,7 @@ struct s_MergeState { /* This function is used by unsafe_object_compare to optimize comparisons * when we know our list is type-homogeneous but we can't assume anything else. - * In the pre-sort check it is set equal to key->ob_type->tp_richcompare */ + * In the pre-sort check it is set equal to Py_TYPE(key)->tp_richcompare */ PyObject *(*key_richcompare)(PyObject *, PyObject *, int); /* This function is used by unsafe_tuple_compare to compare the first elements @@ -2051,7 +2015,7 @@ unsafe_object_compare(PyObject *v, PyObject *w, MergeState *ms) PyObject *res_obj; int res; /* No assumptions, because we check first: */ - if (v->ob_type->tp_richcompare != ms->key_richcompare) + if (Py_TYPE(v)->tp_richcompare != ms->key_richcompare) return PyObject_RichCompareBool(v, w, Py_LT); assert(ms->key_richcompare != NULL); @@ -2088,8 +2052,8 @@ unsafe_latin_compare(PyObject *v, PyObject *w, MergeState *ms) int res; /* Modified from Objects/unicodeobject.c:unicode_compare, assuming: */ - assert(v->ob_type == w->ob_type); - assert(v->ob_type == &PyUnicode_Type); + assert(Py_IS_TYPE(v, &PyUnicode_Type)); + assert(Py_IS_TYPE(w, &PyUnicode_Type)); assert(PyUnicode_KIND(v) == PyUnicode_KIND(w)); assert(PyUnicode_KIND(v) == PyUnicode_1BYTE_KIND); @@ -2111,8 +2075,8 @@ unsafe_long_compare(PyObject *v, PyObject *w, MergeState *ms) PyLongObject *vl, *wl; sdigit v0, w0; int res; /* Modified from Objects/longobject.c:long_compare, assuming: */ - assert(v->ob_type == w->ob_type); - assert(v->ob_type == &PyLong_Type); + assert(Py_IS_TYPE(v, &PyLong_Type)); + assert(Py_IS_TYPE(w, &PyLong_Type)); assert(Py_ABS(Py_SIZE(v)) <= 1); assert(Py_ABS(Py_SIZE(w)) <= 1); @@ -2139,8 +2103,8 @@ unsafe_float_compare(PyObject *v, PyObject *w, MergeState *ms) int res; /* Modified from Objects/floatobject.c:float_richcompare, assuming: */ - assert(v->ob_type == w->ob_type); - assert(v->ob_type == &PyFloat_Type); + assert(Py_IS_TYPE(v, &PyFloat_Type)); + assert(Py_IS_TYPE(w, &PyFloat_Type)); res = PyFloat_AS_DOUBLE(v) < PyFloat_AS_DOUBLE(w); assert(res == PyObject_RichCompareBool(v, w, Py_LT)); @@ -2161,8 +2125,8 @@ unsafe_tuple_compare(PyObject *v, PyObject *w, MergeState *ms) int k; /* Modified from Objects/tupleobject.c:tuplerichcompare, assuming: */ - assert(v->ob_type == w->ob_type); - assert(v->ob_type == &PyTuple_Type); + assert(Py_IS_TYPE(v, &PyTuple_Type)); + assert(Py_IS_TYPE(w, &PyTuple_Type)); assert(Py_SIZE(v) > 0); assert(Py_SIZE(w) > 0); @@ -2240,7 +2204,7 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) saved_ob_size = Py_SIZE(self); saved_ob_item = self->ob_item; saved_allocated = self->allocated; - Py_SIZE(self) = 0; + Py_SET_SIZE(self, 0); self->ob_item = NULL; self->allocated = -1; /* any operation will reset it to >= 0 */ @@ -2262,8 +2226,7 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) } for (i = 0; i < saved_ob_size ; i++) { - keys[i] = PyObject_CallFunctionObjArgs(keyfunc, saved_ob_item[i], - NULL); + keys[i] = PyObject_CallOneArg(keyfunc, saved_ob_item[i]); if (keys[i] == NULL) { for (i=i-1 ; i>=0 ; i--) Py_DECREF(keys[i]); @@ -2284,12 +2247,12 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) * set ms appropriately. */ if (saved_ob_size > 1) { /* Assume the first element is representative of the whole list. */ - int keys_are_in_tuples = (lo.keys[0]->ob_type == &PyTuple_Type && + int keys_are_in_tuples = (Py_IS_TYPE(lo.keys[0], &PyTuple_Type) && Py_SIZE(lo.keys[0]) > 0); PyTypeObject* key_type = (keys_are_in_tuples ? - PyTuple_GET_ITEM(lo.keys[0], 0)->ob_type : - lo.keys[0]->ob_type); + Py_TYPE(PyTuple_GET_ITEM(lo.keys[0], 0)) : + Py_TYPE(lo.keys[0])); int keys_are_all_same_type = 1; int strings_are_latin = 1; @@ -2299,7 +2262,7 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) for (i=0; i < saved_ob_size; i++) { if (keys_are_in_tuples && - !(lo.keys[i]->ob_type == &PyTuple_Type && Py_SIZE(lo.keys[i]) != 0)) { + !(Py_IS_TYPE(lo.keys[i], &PyTuple_Type) && Py_SIZE(lo.keys[i]) != 0)) { keys_are_in_tuples = 0; keys_are_all_same_type = 0; break; @@ -2312,7 +2275,7 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) PyTuple_GET_ITEM(lo.keys[i], 0) : lo.keys[i]); - if (key->ob_type != key_type) { + if (!Py_IS_TYPE(key, key_type)) { keys_are_all_same_type = 0; /* If keys are in tuple we must loop over the whole list to make sure all items are tuples */ @@ -2458,7 +2421,7 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) keyfunc_fail: final_ob_item = self->ob_item; i = Py_SIZE(self); - Py_SIZE(self) = saved_ob_size; + Py_SET_SIZE(self, saved_ob_size); self->ob_item = saved_ob_item; self->allocated = saved_allocated; if (final_ob_item != NULL) { @@ -2680,8 +2643,7 @@ list_richcompare(PyObject *v, PyObject *w, int op) Py_INCREF(vitem); Py_INCREF(witem); - int k = PyObject_RichCompareBool(vl->ob_item[i], - wl->ob_item[i], Py_EQ); + int k = PyObject_RichCompareBool(vitem, witem, Py_EQ); Py_DECREF(vitem); Py_DECREF(witem); if (k < 0) @@ -2755,6 +2717,33 @@ list___init___impl(PyListObject *self, PyObject *iterable) return 0; } +static PyObject * +list_vectorcall(PyObject *type, PyObject * const*args, + size_t nargsf, PyObject *kwnames) +{ + if (!_PyArg_NoKwnames("list", kwnames)) { + return NULL; + } + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + if (!_PyArg_CheckPositional("list", nargs, 0, 1)) { + return NULL; + } + + assert(PyType_Check(type)); + PyObject *list = PyType_GenericAlloc((PyTypeObject *)type, 0); + if (list == NULL) { + return NULL; + } + if (nargs) { + if (list___init___impl((PyListObject *)list, args[0])) { + Py_DECREF(list); + return NULL; + } + } + return list; +} + + /*[clinic input] list.__sizeof__ @@ -2789,6 +2778,7 @@ static PyMethodDef list_methods[] = { LIST_COUNT_METHODDEF LIST_REVERSE_METHODDEF LIST_SORT_METHODDEF + {"__class_getitem__", (PyCFunction)Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* sentinel */ }; @@ -2808,7 +2798,7 @@ static PySequenceMethods list_as_sequence = { static PyObject * list_subscript(PyListObject* self, PyObject* item) { - if (PyIndex_Check(item)) { + if (_PyIndex_Check(item)) { Py_ssize_t i; i = PyNumber_AsSsize_t(item, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) @@ -2818,7 +2808,8 @@ list_subscript(PyListObject* self, PyObject* item) return list_item(self, i); } else if (PySlice_Check(item)) { - Py_ssize_t start, stop, step, slicelength, cur, i; + Py_ssize_t start, stop, step, slicelength, i; + size_t cur; PyObject* result; PyObject* it; PyObject **src, **dest; @@ -2847,14 +2838,14 @@ list_subscript(PyListObject* self, PyObject* item) Py_INCREF(it); dest[i] = it; } - Py_SIZE(result) = slicelength; + Py_SET_SIZE(result, slicelength); return result; } } else { PyErr_Format(PyExc_TypeError, "list indices must be integers or slices, not %.200s", - item->ob_type->tp_name); + Py_TYPE(item)->tp_name); return NULL; } } @@ -2862,7 +2853,7 @@ list_subscript(PyListObject* self, PyObject* item) static int list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) { - if (PyIndex_Check(item)) { + if (_PyIndex_Check(item)) { Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) return -1; @@ -2940,7 +2931,7 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) sizeof(PyObject *)); } - Py_SIZE(self) -= slicelength; + Py_SET_SIZE(self, Py_SIZE(self) - slicelength); res = list_resize(self, Py_SIZE(self)); for (i = 0; i < slicelength; i++) { @@ -2954,7 +2945,8 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) /* assign slice */ PyObject *ins, *seq; PyObject **garbage, **seqitems, **selfitems; - Py_ssize_t cur, i; + Py_ssize_t i; + size_t cur; /* protect against a[::-1] = a */ if (self == (PyListObject*)value) { @@ -3016,7 +3008,7 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) else { PyErr_Format(PyExc_TypeError, "list indices must be integers or slices, not %.200s", - item->ob_type->tp_name); + Py_TYPE(item)->tp_name); return -1; } } @@ -3068,6 +3060,7 @@ PyTypeObject PyList_Type = { PyType_GenericAlloc, /* tp_alloc */ PyType_GenericNew, /* tp_new */ PyObject_GC_Del, /* tp_free */ + .tp_vectorcall = list_vectorcall, }; /*********************** List Iterator **************************/ diff --git a/Objects/longobject.c b/Objects/longobject.c index 67dce97471522c575b72eb2140ad5bd59a6f327c..0ff0e80cd4269686b0330dcaafc010d3c266a797 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -3,6 +3,8 @@ /* XXX The functional organization of this file is terrible */ #include "Python.h" +#include "pycore_interp.h" // _PY_NSMALLPOSINTS +#include "pycore_pystate.h" // _Py_IsMainInterpreter() #include "longintrepr.h" #include @@ -15,12 +17,8 @@ class int "PyObject *" "&PyLong_Type" [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=ec0275e3422a36e3]*/ -#ifndef NSMALLPOSINTS -#define NSMALLPOSINTS 257 -#endif -#ifndef NSMALLNEGINTS -#define NSMALLNEGINTS 5 -#endif +#define NSMALLPOSINTS _PY_NSMALLPOSINTS +#define NSMALLNEGINTS _PY_NSMALLNEGINTS _Py_IDENTIFIER(little); _Py_IDENTIFIER(big); @@ -35,42 +33,25 @@ PyObject *_PyLong_Zero = NULL; PyObject *_PyLong_One = NULL; #if NSMALLNEGINTS + NSMALLPOSINTS > 0 -/* Small integers are preallocated in this array so that they - can be shared. - The integers that are preallocated are those in the range - -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive). -*/ -static PyLongObject small_ints[NSMALLNEGINTS + NSMALLPOSINTS]; -#ifdef COUNT_ALLOCS -Py_ssize_t _Py_quick_int_allocs, _Py_quick_neg_int_allocs; -#endif +#define IS_SMALL_INT(ival) (-NSMALLNEGINTS <= (ival) && (ival) < NSMALLPOSINTS) +#define IS_SMALL_UINT(ival) ((ival) < NSMALLPOSINTS) static PyObject * get_small_int(sdigit ival) { - PyObject *v; - assert(-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS); - v = (PyObject *)&small_ints[ival + NSMALLNEGINTS]; + assert(IS_SMALL_INT(ival)); + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *v = (PyObject*)tstate->interp->small_ints[ival + NSMALLNEGINTS]; Py_INCREF(v); -#ifdef COUNT_ALLOCS - if (ival >= 0) - _Py_quick_int_allocs++; - else - _Py_quick_neg_int_allocs++; -#endif return v; } -#define CHECK_SMALL_INT(ival) \ - do if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { \ - return get_small_int((sdigit)ival); \ - } while(0) static PyLongObject * maybe_small_long(PyLongObject *v) { if (v && Py_ABS(Py_SIZE(v)) <= 1) { sdigit ival = MEDIUM_VALUE(v); - if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { + if (IS_SMALL_INT(ival)) { Py_DECREF(v); return (PyLongObject *)get_small_int(ival); } @@ -78,7 +59,9 @@ maybe_small_long(PyLongObject *v) return v; } #else -#define CHECK_SMALL_INT(ival) +#define IS_SMALL_INT(ival) 0 +#define IS_SMALL_UINT(ival) 0 +#define get_small_int(ival) (Py_UNREACHABLE(), NULL) #define maybe_small_long(val) (val) #endif @@ -91,7 +74,7 @@ _PyLong_Negate(PyLongObject **x_p) x = (PyLongObject *)*x_p; if (Py_REFCNT(x) == 1) { - Py_SIZE(x) = -Py_SIZE(x); + Py_SET_SIZE(x, -Py_SIZE(x)); return; } @@ -130,8 +113,9 @@ long_normalize(PyLongObject *v) while (i > 0 && v->ob_digit[i-1] == 0) --i; - if (i != j) - Py_SIZE(v) = (Py_SIZE(v) < 0) ? -(i) : i; + if (i != j) { + Py_SET_SIZE(v, (Py_SIZE(v) < 0) ? -(i) : i); + } return v; } @@ -168,7 +152,7 @@ _PyLong_FromNbInt(PyObject *integral) if (!PyLong_Check(result)) { PyErr_Format(PyExc_TypeError, "__int__ returned non-int (type %.200s)", - result->ob_type->tp_name); + Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } @@ -177,7 +161,7 @@ _PyLong_FromNbInt(PyObject *integral) "__int__ returned non-int (type %.200s). " "The ability to return an instance of a strict subclass of int " "is deprecated, and may be removed in a future version of Python.", - result->ob_type->tp_name)) { + Py_TYPE(result)->tp_name)) { Py_DECREF(result); return NULL; } @@ -221,7 +205,7 @@ _PyLong_FromNbIndexOrNbInt(PyObject *integral) if (!PyLong_Check(result)) { PyErr_Format(PyExc_TypeError, "__index__ returned non-int (type %.200s)", - result->ob_type->tp_name); + Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } @@ -230,7 +214,7 @@ _PyLong_FromNbIndexOrNbInt(PyObject *integral) "__index__ returned non-int (type %.200s). " "The ability to return an instance of a strict subclass of int " "is deprecated, and may be removed in a future version of Python.", - result->ob_type->tp_name)) + Py_TYPE(result)->tp_name)) { Py_DECREF(result); return NULL; @@ -293,13 +277,16 @@ _PyLong_Copy(PyLongObject *src) i = -(i); if (i < 2) { sdigit ival = MEDIUM_VALUE(src); - CHECK_SMALL_INT(ival); + if (IS_SMALL_INT(ival)) { + return get_small_int(ival); + } } result = _PyLong_New(i); if (result != NULL) { - Py_SIZE(result) = Py_SIZE(src); - while (--i >= 0) + Py_SET_SIZE(result, Py_SIZE(src)); + while (--i >= 0) { result->ob_digit[i] = src->ob_digit[i]; + } } return (PyObject *)result; } @@ -315,7 +302,9 @@ PyLong_FromLong(long ival) int ndigits = 0; int sign; - CHECK_SMALL_INT(ival); + if (IS_SMALL_INT(ival)) { + return get_small_int((sdigit)ival); + } if (ival < 0) { /* negate: can't write this as abs_ival = -ival since that @@ -332,7 +321,7 @@ PyLong_FromLong(long ival) if (!(abs_ival >> PyLong_SHIFT)) { v = _PyLong_New(1); if (v) { - Py_SIZE(v) = sign; + Py_SET_SIZE(v, sign); v->ob_digit[0] = Py_SAFE_DOWNCAST( abs_ival, unsigned long, digit); } @@ -344,7 +333,7 @@ PyLong_FromLong(long ival) if (!(abs_ival >> 2*PyLong_SHIFT)) { v = _PyLong_New(2); if (v) { - Py_SIZE(v) = 2*sign; + Py_SET_SIZE(v, 2 * sign); v->ob_digit[0] = Py_SAFE_DOWNCAST( abs_ival & PyLong_MASK, unsigned long, digit); v->ob_digit[1] = Py_SAFE_DOWNCAST( @@ -363,7 +352,7 @@ PyLong_FromLong(long ival) v = _PyLong_New(ndigits); if (v != NULL) { digit *p = v->ob_digit; - Py_SIZE(v) = ndigits*sign; + Py_SET_SIZE(v, ndigits * sign); t = abs_ival; while (t) { *p++ = Py_SAFE_DOWNCAST( @@ -374,32 +363,52 @@ PyLong_FromLong(long ival) return (PyObject *)v; } +#define PYLONG_FROM_UINT(INT_TYPE, ival) \ + do { \ + if (IS_SMALL_UINT(ival)) { \ + return get_small_int((sdigit)(ival)); \ + } \ + /* Count the number of Python digits. */ \ + Py_ssize_t ndigits = 0; \ + INT_TYPE t = (ival); \ + while (t) { \ + ++ndigits; \ + t >>= PyLong_SHIFT; \ + } \ + PyLongObject *v = _PyLong_New(ndigits); \ + if (v == NULL) { \ + return NULL; \ + } \ + digit *p = v->ob_digit; \ + while ((ival)) { \ + *p++ = (digit)((ival) & PyLong_MASK); \ + (ival) >>= PyLong_SHIFT; \ + } \ + return (PyObject *)v; \ + } while(0) + /* Create a new int object from a C unsigned long int */ PyObject * PyLong_FromUnsignedLong(unsigned long ival) { - PyLongObject *v; - unsigned long t; - int ndigits = 0; + PYLONG_FROM_UINT(unsigned long, ival); +} - if (ival < PyLong_BASE) - return PyLong_FromLong(ival); - /* Count the number of Python digits. */ - t = ival; - while (t) { - ++ndigits; - t >>= PyLong_SHIFT; - } - v = _PyLong_New(ndigits); - if (v != NULL) { - digit *p = v->ob_digit; - while (ival) { - *p++ = (digit)(ival & PyLong_MASK); - ival >>= PyLong_SHIFT; - } - } - return (PyObject *)v; +/* Create a new int object from a C unsigned long long int. */ + +PyObject * +PyLong_FromUnsignedLongLong(unsigned long long ival) +{ + PYLONG_FROM_UINT(unsigned long long, ival); +} + +/* Create a new int object from a C size_t. */ + +PyObject * +PyLong_FromSize_t(size_t ival) +{ + PYLONG_FROM_UINT(size_t, ival); } /* Create a new int object from a C double */ @@ -407,6 +416,21 @@ PyLong_FromUnsignedLong(unsigned long ival) PyObject * PyLong_FromDouble(double dval) { + /* Try to get out cheap if this fits in a long. When a finite value of real + * floating type is converted to an integer type, the value is truncated + * toward zero. If the value of the integral part cannot be represented by + * the integer type, the behavior is undefined. Thus, we must check that + * value is in range (LONG_MIN - 1, LONG_MAX + 1). If a long has more bits + * of precision than a double, casting LONG_MIN - 1 to double may yield an + * approximation, but LONG_MAX + 1 is a power of two and can be represented + * as double exactly (assuming FLT_RADIX is 2 or 16), so for simplicity + * check against [-(LONG_MAX + 1), LONG_MAX + 1). + */ + const double int_max = (unsigned long)LONG_MAX + 1; + if (-int_max < dval && dval < int_max) { + return PyLong_FromLong((long)dval); + } + PyLongObject *v; double frac; int i, ndig, expo, neg; @@ -426,8 +450,7 @@ PyLong_FromDouble(double dval) dval = -dval; } frac = frexp(dval, &expo); /* dval = frac*2**expo; 0.0 <= frac < 1.0 */ - if (expo <= 0) - return PyLong_FromLong(0L); + assert(expo > 0); ndig = (expo-1) / PyLong_SHIFT + 1; /* Number of 'digits' in result */ v = _PyLong_New(ndig); if (v == NULL) @@ -439,8 +462,9 @@ PyLong_FromDouble(double dval) frac = frac - (double)bits; frac = ldexp(frac, PyLong_SHIFT); } - if (neg) - Py_SIZE(v) = -(Py_SIZE(v)); + if (neg) { + Py_SET_SIZE(v, -(Py_SIZE(v))); + } return (PyObject *)v; } @@ -787,26 +811,6 @@ _PyLong_Sign(PyObject *vv) return Py_SIZE(v) == 0 ? 0 : (Py_SIZE(v) < 0 ? -1 : 1); } -/* bits_in_digit(d) returns the unique integer k such that 2**(k-1) <= d < - 2**k if d is nonzero, else 0. */ - -static const unsigned char BitLengthTable[32] = { - 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 -}; - -static int -bits_in_digit(digit d) -{ - int d_bits = 0; - while (d >= 32) { - d_bits += 6; - d >>= 6; - } - d_bits += (int)BitLengthTable[d]; - return d_bits; -} - size_t _PyLong_NumBits(PyObject *vv) { @@ -824,7 +828,7 @@ _PyLong_NumBits(PyObject *vv) if ((size_t)(ndigits - 1) > SIZE_MAX / (size_t)PyLong_SHIFT) goto Overflow; result = (size_t)(ndigits - 1) * (size_t)PyLong_SHIFT; - msd_bits = bits_in_digit(msd); + msd_bits = _Py_bit_length(msd); if (SIZE_MAX - msd_bits < result) goto Overflow; result += msd_bits; @@ -944,7 +948,7 @@ _PyLong_FromByteArray(const unsigned char* bytes, size_t n, } } - Py_SIZE(v) = is_signed ? -idigit : idigit; + Py_SET_SIZE(v, is_signed ? -idigit : idigit); return (PyObject *)long_normalize(v); } @@ -1133,7 +1137,7 @@ PyLong_AsVoidPtr(PyObject *vv) * rewritten to use the newer PyLong_{As,From}ByteArray API. */ -#define PY_ABS_LLONG_MIN (0-(unsigned long long)PY_LLONG_MIN) +#define PY_ABS_LLONG_MIN (0-(unsigned long long)LLONG_MIN) /* Create a new int object from a C long long int. */ @@ -1146,7 +1150,10 @@ PyLong_FromLongLong(long long ival) int ndigits = 0; int negative = 0; - CHECK_SMALL_INT(ival); + if (IS_SMALL_INT(ival)) { + return get_small_int((sdigit)ival); + } + if (ival < 0) { /* avoid signed overflow on negation; see comments in PyLong_FromLong above. */ @@ -1169,7 +1176,7 @@ PyLong_FromLongLong(long long ival) v = _PyLong_New(ndigits); if (v != NULL) { digit *p = v->ob_digit; - Py_SIZE(v) = negative ? -ndigits : ndigits; + Py_SET_SIZE(v, negative ? -ndigits : ndigits); t = abs_ival; while (t) { *p++ = (digit)(t & PyLong_MASK); @@ -1179,34 +1186,6 @@ PyLong_FromLongLong(long long ival) return (PyObject *)v; } -/* Create a new int object from a C unsigned long long int. */ - -PyObject * -PyLong_FromUnsignedLongLong(unsigned long long ival) -{ - PyLongObject *v; - unsigned long long t; - int ndigits = 0; - - if (ival < PyLong_BASE) - return PyLong_FromLong((long)ival); - /* Count the number of Python digits. */ - t = ival; - while (t) { - ++ndigits; - t >>= PyLong_SHIFT; - } - v = _PyLong_New(ndigits); - if (v != NULL) { - digit *p = v->ob_digit; - while (ival) { - *p++ = (digit)(ival & PyLong_MASK); - ival >>= PyLong_SHIFT; - } - } - return (PyObject *)v; -} - /* Create a new int object from a C Py_ssize_t. */ PyObject * @@ -1218,7 +1197,10 @@ PyLong_FromSsize_t(Py_ssize_t ival) int ndigits = 0; int negative = 0; - CHECK_SMALL_INT(ival); + if (IS_SMALL_INT(ival)) { + return get_small_int((sdigit)ival); + } + if (ival < 0) { /* avoid signed overflow when ival = SIZE_T_MIN */ abs_ival = (size_t)(-1-ival)+1; @@ -1237,7 +1219,7 @@ PyLong_FromSsize_t(Py_ssize_t ival) v = _PyLong_New(ndigits); if (v != NULL) { digit *p = v->ob_digit; - Py_SIZE(v) = negative ? -ndigits : ndigits; + Py_SET_SIZE(v, negative ? -ndigits : ndigits); t = abs_ival; while (t) { *p++ = (digit)(t & PyLong_MASK); @@ -1247,35 +1229,6 @@ PyLong_FromSsize_t(Py_ssize_t ival) return (PyObject *)v; } -/* Create a new int object from a C size_t. */ - -PyObject * -PyLong_FromSize_t(size_t ival) -{ - PyLongObject *v; - size_t t; - int ndigits = 0; - - if (ival < PyLong_BASE) - return PyLong_FromLong((long)ival); - /* Count the number of Python digits. */ - t = ival; - while (t) { - ++ndigits; - t >>= PyLong_SHIFT; - } - v = _PyLong_New(ndigits); - if (v != NULL) { - digit *p = v->ob_digit; - Py_SIZE(v) = ndigits; - while (ival) { - *p++ = (digit)(ival & PyLong_MASK); - ival >>= PyLong_SHIFT; - } - } - return (PyObject *)v; -} - /* Get a C long long int from an int object or any object that has an __int__ method. Return -1 and set an error if overflow occurs. */ @@ -1488,11 +1441,11 @@ PyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow) /* Haven't lost any bits, but casting to long requires extra * care (see comment above). */ - if (x <= (unsigned long long)PY_LLONG_MAX) { + if (x <= (unsigned long long)LLONG_MAX) { res = (long long)x * sign; } else if (sign < 0 && x == PY_ABS_LLONG_MIN) { - res = PY_LLONG_MIN; + res = LLONG_MIN; } else { *overflow = sign; @@ -1985,7 +1938,7 @@ long_format_binary(PyObject *aa, int base, int alternate, return -1; } size_a_in_bits = (size_a - 1) * PyLong_SHIFT + - bits_in_digit(a->ob_digit[size_a - 1]); + _Py_bit_length(a->ob_digit[size_a - 1]); /* Allow 1 character for a '-' sign. */ sz = negative + (size_a_in_bits + (bits - 1)) / bits; } @@ -2290,7 +2243,7 @@ PyLong_FromString(const char *str, char **pend, int base) "int() arg 2 must be >= 2 and <= 36"); return NULL; } - while (*str != '\0' && Py_ISSPACE(Py_CHARMASK(*str))) { + while (*str != '\0' && Py_ISSPACE(*str)) { str++; } if (*str == '+') { @@ -2508,7 +2461,7 @@ digit beyond the first. if (z == NULL) { return NULL; } - Py_SIZE(z) = 0; + Py_SET_SIZE(z, 0); /* `convwidth` consecutive input digits are treated as a single * digit in base `convmultmax`. @@ -2558,7 +2511,7 @@ digit beyond the first. assert(c < PyLong_BASE); if (Py_SIZE(z) < size_z) { *pz = (digit)c; - ++Py_SIZE(z); + Py_SET_SIZE(z, Py_SIZE(z) + 1); } else { PyLongObject *tmp; @@ -2597,9 +2550,9 @@ digit beyond the first. goto onError; } if (sign < 0) { - Py_SIZE(z) = -(Py_SIZE(z)); + Py_SET_SIZE(z, -(Py_SIZE(z))); } - while (*str && Py_ISSPACE(Py_CHARMASK(*str))) { + while (*str && Py_ISSPACE(*str)) { str++; } if (*str != '\0') { @@ -2805,7 +2758,7 @@ x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem) /* normalize: shift w1 left so that its top digit is >= PyLong_BASE/2. shift v1 left by the same amount. Results go into w and v. */ - d = PyLong_SHIFT - bits_in_digit(w1->ob_digit[size_w-1]); + d = PyLong_SHIFT - _Py_bit_length(w1->ob_digit[size_w-1]); carry = v_lshift(w->ob_digit, w1->ob_digit, size_w, d); assert(carry == 0); carry = v_lshift(v->ob_digit, v1->ob_digit, size_v, d); @@ -2913,7 +2866,8 @@ _PyLong_Frexp(PyLongObject *a, Py_ssize_t *e) { Py_ssize_t a_size, a_bits, shift_digits, shift_bits, x_size; /* See below for why x_digits is always large enough. */ - digit rem, x_digits[2 + (DBL_MANT_DIG + 1) / PyLong_SHIFT]; + digit rem; + digit x_digits[2 + (DBL_MANT_DIG + 1) / PyLong_SHIFT] = {0,}; double dx; /* Correction term for round-half-to-even rounding. For a digit x, "x + half_even_correction[x & 7]" gives x rounded to the nearest @@ -2926,7 +2880,7 @@ _PyLong_Frexp(PyLongObject *a, Py_ssize_t *e) *e = 0; return 0.0; } - a_bits = bits_in_digit(a->ob_digit[a_size-1]); + a_bits = _Py_bit_length(a->ob_digit[a_size-1]); /* The following is an overflow-free version of the check "if ((a_size - 1) * PyLong_SHIFT + a_bits > PY_SSIZE_T_MAX) ..." */ if (a_size >= (PY_SSIZE_T_MAX - 1) / PyLong_SHIFT + 1 && @@ -2963,9 +2917,7 @@ _PyLong_Frexp(PyLongObject *a, Py_ssize_t *e) if (a_bits <= DBL_MANT_DIG + 2) { shift_digits = (DBL_MANT_DIG + 2 - a_bits) / PyLong_SHIFT; shift_bits = (DBL_MANT_DIG + 2 - a_bits) % PyLong_SHIFT; - x_size = 0; - while (x_size < shift_digits) - x_digits[x_size++] = 0; + x_size = shift_digits; rem = v_lshift(x_digits + x_size, a->ob_digit, a_size, (int)shift_bits); x_size += a_size; @@ -3053,33 +3005,32 @@ PyLong_AsDouble(PyObject *v) /* Methods */ -static int +/* if a < b, return a negative number + if a == b, return 0 + if a > b, return a positive number */ + +static Py_ssize_t long_compare(PyLongObject *a, PyLongObject *b) { - Py_ssize_t sign; - - if (Py_SIZE(a) != Py_SIZE(b)) { - sign = Py_SIZE(a) - Py_SIZE(b); - } - else { + Py_ssize_t sign = Py_SIZE(a) - Py_SIZE(b); + if (sign == 0) { Py_ssize_t i = Py_ABS(Py_SIZE(a)); - while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i]) - ; - if (i < 0) - sign = 0; - else { - sign = (sdigit)a->ob_digit[i] - (sdigit)b->ob_digit[i]; - if (Py_SIZE(a) < 0) - sign = -sign; + sdigit diff = 0; + while (--i >= 0) { + diff = (sdigit) a->ob_digit[i] - (sdigit) b->ob_digit[i]; + if (diff) { + break; + } } + sign = Py_SIZE(a) < 0 ? -diff : diff; } - return sign < 0 ? -1 : sign > 0 ? 1 : 0; + return sign; } static PyObject * long_richcompare(PyObject *self, PyObject *other, int op) { - int result; + Py_ssize_t result; CHECK_BINOP(self, other); if (self == other) result = 0; @@ -3231,9 +3182,9 @@ x_sub(PyLongObject *a, PyLongObject *b) } assert(borrow == 0); if (sign < 0) { - Py_SIZE(z) = -Py_SIZE(z); + Py_SET_SIZE(z, -Py_SIZE(z)); } - return long_normalize(z); + return maybe_small_long(long_normalize(z)); } static PyObject * @@ -3255,7 +3206,7 @@ long_add(PyLongObject *a, PyLongObject *b) That also means z is not an element of small_ints, so negating it in-place is safe. */ assert(Py_REFCNT(z) == 1); - Py_SIZE(z) = -(Py_SIZE(z)); + Py_SET_SIZE(z, -(Py_SIZE(z))); } } else @@ -3281,13 +3232,15 @@ long_sub(PyLongObject *a, PyLongObject *b) return PyLong_FromLong(MEDIUM_VALUE(a) - MEDIUM_VALUE(b)); } if (Py_SIZE(a) < 0) { - if (Py_SIZE(b) < 0) - z = x_sub(a, b); - else + if (Py_SIZE(b) < 0) { + z = x_sub(b, a); + } + else { z = x_add(a, b); - if (z != NULL) { - assert(Py_SIZE(z) == 0 || Py_REFCNT(z) == 1); - Py_SIZE(z) = -(Py_SIZE(z)); + if (z != NULL) { + assert(Py_SIZE(z) == 0 || Py_REFCNT(z) == 1); + Py_SET_SIZE(z, -(Py_SIZE(z))); + } } } else { @@ -3679,7 +3632,7 @@ k_lopsided_mul(PyLongObject *a, PyLongObject *b) /* Multiply the next slice of b by a. */ memcpy(bslice->ob_digit, b->ob_digit + nbdone, nbtouse * sizeof(digit)); - Py_SIZE(bslice) = nbtouse; + Py_SET_SIZE(bslice, nbtouse); product = k_mul(a, bslice); if (product == NULL) goto fail; @@ -4020,8 +3973,8 @@ long_true_divide(PyObject *v, PyObject *w) /* Extreme underflow */ goto underflow_or_zero; /* Next line is now safe from overflowing a Py_ssize_t */ - diff = diff * PyLong_SHIFT + bits_in_digit(a->ob_digit[a_size - 1]) - - bits_in_digit(b->ob_digit[b_size - 1]); + diff = diff * PyLong_SHIFT + _Py_bit_length(a->ob_digit[a_size - 1]) - + _Py_bit_length(b->ob_digit[b_size - 1]); /* Now diff = a_bits - b_bits. */ if (diff > DBL_MAX_EXP) goto overflow; @@ -4097,7 +4050,7 @@ long_true_divide(PyObject *v, PyObject *w) } x_size = Py_ABS(Py_SIZE(x)); assert(x_size > 0); /* result of division is never zero */ - x_bits = (x_size-1)*PyLong_SHIFT+bits_in_digit(x->ob_digit[x_size-1]); + x_bits = (x_size-1)*PyLong_SHIFT+_Py_bit_length(x->ob_digit[x_size-1]); /* The number of extra bits that have to be rounded away. */ extra_bits = Py_MAX(x_bits, DBL_MIN_EXP - shift) - DBL_MANT_DIG; @@ -4495,7 +4448,7 @@ long_neg(PyLongObject *v) return PyLong_FromLong(-MEDIUM_VALUE(v)); z = (PyLongObject *)_PyLong_Copy(v); if (z != NULL) - Py_SIZE(z) = -(Py_SIZE(v)); + Py_SET_SIZE(z, -(Py_SIZE(v))); return (PyObject *)z; } @@ -4640,7 +4593,7 @@ long_lshift1(PyLongObject *a, Py_ssize_t wordshift, digit remshift) return NULL; if (Py_SIZE(a) < 0) { assert(Py_REFCNT(z) == 1); - Py_SIZE(z) = -Py_SIZE(z); + Py_SET_SIZE(z, -Py_SIZE(z)); } for (i = 0; i < wordshift; i++) z->ob_digit[i] = 0; @@ -4824,7 +4777,7 @@ long_bitwise(PyLongObject *a, /* Complement result if negative. */ if (negz) { - Py_SIZE(z) = -(Py_SIZE(z)); + Py_SET_SIZE(z, -(Py_SIZE(z))); z->ob_digit[size_z] = PyLong_MASK; v_complement(z->ob_digit, z->ob_digit, size_z+1); } @@ -4911,7 +4864,7 @@ _PyLong_GCD(PyObject *aarg, PyObject *barg) alloc_b = Py_SIZE(b); /* reduce until a fits into 2 digits */ while ((size_a = Py_SIZE(a)) > 2) { - nbits = bits_in_digit(a->ob_digit[size_a-1]); + nbits = _Py_bit_length(a->ob_digit[size_a-1]); /* extract top 2*PyLong_SHIFT bits of a into x, along with corresponding bits of b into y */ size_b = Py_SIZE(b); @@ -4971,8 +4924,9 @@ _PyLong_GCD(PyObject *aarg, PyObject *barg) T = -A; A = -B; B = T; T = -C; C = -D; D = T; } - if (c != NULL) - Py_SIZE(c) = size_a; + if (c != NULL) { + Py_SET_SIZE(c, size_a); + } else if (Py_REFCNT(a) == 1) { Py_INCREF(a); c = a; @@ -4984,12 +4938,13 @@ _PyLong_GCD(PyObject *aarg, PyObject *barg) goto error; } - if (d != NULL) - Py_SIZE(d) = size_a; + if (d != NULL) { + Py_SET_SIZE(d, size_a); + } else if (Py_REFCNT(b) == 1 && size_a <= alloc_b) { Py_INCREF(b); d = b; - Py_SIZE(d) = size_a; + Py_SET_SIZE(d, size_a); } else { alloc_b = size_a; @@ -5045,7 +5000,7 @@ _PyLong_GCD(PyObject *aarg, PyObject *barg) /* a fits into a long, so b must too */ x = PyLong_AsLong((PyObject *)a); y = PyLong_AsLong((PyObject *)b); -#elif PY_LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT +#elif LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT x = PyLong_AsLongLong((PyObject *)a); y = PyLong_AsLongLong((PyObject *)b); #else @@ -5064,7 +5019,7 @@ _PyLong_GCD(PyObject *aarg, PyObject *barg) } #if LONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT return PyLong_FromLong(x); -#elif PY_LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT +#elif LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT return PyLong_FromLongLong(x); #else # error "_PyLong_GCD" @@ -5130,7 +5085,7 @@ long_new_impl(PyTypeObject *type, PyObject *x, PyObject *obase) if (PyUnicode_Check(x)) return PyLong_FromUnicodeObject(x, (int)base); else if (PyByteArray_Check(x) || PyBytes_Check(x)) { - char *string; + const char *string; if (PyByteArray_Check(x)) string = PyByteArray_AS_STRING(x); else @@ -5169,9 +5124,10 @@ long_subtype_new(PyTypeObject *type, PyObject *x, PyObject *obase) return NULL; } assert(PyLong_Check(newobj)); - Py_SIZE(newobj) = Py_SIZE(tmp); - for (i = 0; i < n; i++) + Py_SET_SIZE(newobj, Py_SIZE(tmp)); + for (i = 0; i < n; i++) { newobj->ob_digit[i] = tmp->ob_digit[i]; + } Py_DECREF(tmp); return (PyObject *)newobj; } @@ -5235,7 +5191,8 @@ _PyLong_DivmodNear(PyObject *a, PyObject *b) { PyLongObject *quo = NULL, *rem = NULL; PyObject *twice_rem, *result, *temp; - int cmp, quo_is_odd, quo_is_neg; + int quo_is_odd, quo_is_neg; + Py_ssize_t cmp; /* Equivalent Python code: @@ -5428,7 +5385,7 @@ int_bit_length_impl(PyObject *self) return PyLong_FromLong(0); msd = ((PyLongObject *)self)->ob_digit[ndigits-1]; - msd_bits = bits_in_digit(msd); + msd_bits = _Py_bit_length(msd); if (ndigits <= PY_SSIZE_T_MAX/PyLong_SHIFT) return PyLong_FromSsize_t((ndigits-1)*PyLong_SHIFT + msd_bits); @@ -5604,8 +5561,7 @@ int_from_bytes_impl(PyTypeObject *type, PyObject *bytes_obj, Py_DECREF(bytes); if (long_obj != NULL && type != &PyLong_Type) { - Py_SETREF(long_obj, PyObject_CallFunctionObjArgs((PyObject *)type, - long_obj, NULL)); + Py_SETREF(long_obj, PyObject_CallOneArg((PyObject *)type, long_obj)); } return long_obj; @@ -5796,68 +5752,58 @@ PyLong_GetInfo(void) } int -_PyLong_Init(void) +_PyLong_Init(PyThreadState *tstate) { #if NSMALLNEGINTS + NSMALLPOSINTS > 0 - int ival, size; - PyLongObject *v = small_ints; - - for (ival = -NSMALLNEGINTS; ival < NSMALLPOSINTS; ival++, v++) { - size = (ival < 0) ? -1 : ((ival == 0) ? 0 : 1); - if (Py_TYPE(v) == &PyLong_Type) { - /* The element is already initialized, most likely - * the Python interpreter was initialized before. - */ - Py_ssize_t refcnt; - PyObject* op = (PyObject*)v; - - refcnt = Py_REFCNT(op) < 0 ? 0 : Py_REFCNT(op); - _Py_NewReference(op); - /* _Py_NewReference sets the ref count to 1 but - * the ref count might be larger. Set the refcnt - * to the original refcnt + 1 */ - Py_REFCNT(op) = refcnt + 1; - assert(Py_SIZE(op) == size); - assert(v->ob_digit[0] == (digit)abs(ival)); - } - else { - (void)PyObject_INIT(v, &PyLong_Type); + for (Py_ssize_t i=0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++) { + sdigit ival = (sdigit)i - NSMALLNEGINTS; + int size = (ival < 0) ? -1 : ((ival == 0) ? 0 : 1); + + PyLongObject *v = _PyLong_New(1); + if (!v) { + return -1; } - Py_SIZE(v) = size; + + Py_SET_SIZE(v, size); v->ob_digit[0] = (digit)abs(ival); + + tstate->interp->small_ints[i] = v; } #endif - _PyLong_Zero = PyLong_FromLong(0); - if (_PyLong_Zero == NULL) - return 0; - _PyLong_One = PyLong_FromLong(1); - if (_PyLong_One == NULL) - return 0; - /* initialize int_info */ - if (Int_InfoType.tp_name == NULL) { - if (PyStructSequence_InitType2(&Int_InfoType, &int_info_desc) < 0) { + if (_Py_IsMainInterpreter(tstate)) { + _PyLong_Zero = PyLong_FromLong(0); + if (_PyLong_Zero == NULL) { return 0; } + + _PyLong_One = PyLong_FromLong(1); + if (_PyLong_One == NULL) { + return 0; + } + + /* initialize int_info */ + if (Int_InfoType.tp_name == NULL) { + if (PyStructSequence_InitType2(&Int_InfoType, &int_info_desc) < 0) { + return 0; + } + } } return 1; } void -PyLong_Fini(void) +_PyLong_Fini(PyThreadState *tstate) { - /* Integers are currently statically allocated. Py_DECREF is not - needed, but Python must forget about the reference or multiple - reinitializations will fail. */ - Py_CLEAR(_PyLong_One); - Py_CLEAR(_PyLong_Zero); + if (_Py_IsMainInterpreter(tstate)) { + Py_CLEAR(_PyLong_One); + Py_CLEAR(_PyLong_Zero); + } + #if NSMALLNEGINTS + NSMALLPOSINTS > 0 - int i; - PyLongObject *v = small_ints; - for (i = 0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++, v++) { - _Py_DEC_REFTOTAL; - _Py_ForgetReference((PyObject*)v); + for (Py_ssize_t i = 0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++) { + Py_CLEAR(tstate->interp->small_ints[i]); } #endif } diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index 0bbcbb2e7eefa7db595e7a418f3410ed2c3f8c1a..682bbe8a61e85e0ba190db2c1c75ba86c7190e1c 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -11,9 +11,8 @@ */ #include "Python.h" +#include "pycore_abstract.h" // _PyIndex_Check() #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" #include "pystrhex.h" #include @@ -1058,7 +1057,8 @@ _memory_release(PyMemoryViewObject *self) return -1; } - Py_FatalError("_memory_release(): negative export count"); + PyErr_SetString(PyExc_SystemError, + "_memory_release(): negative export count"); return -1; } @@ -1972,7 +1972,7 @@ struct_get_unpacker(const char *fmt, Py_ssize_t itemsize) if (format == NULL) goto error; - structobj = PyObject_CallFunctionObjArgs(Struct, format, NULL); + structobj = PyObject_CallOneArg(Struct, format); if (structobj == NULL) goto error; @@ -2011,7 +2011,7 @@ struct_unpack_single(const char *ptr, struct unpacker *x) PyObject *v; memcpy(x->item, ptr, x->itemsize); - v = PyObject_CallFunctionObjArgs(x->unpack_from, x->mview, NULL); + v = PyObject_CallOneArg(x->unpack_from, x->mview); if (v == NULL) return NULL; @@ -2420,8 +2420,9 @@ is_multiindex(PyObject *key) size = PyTuple_GET_SIZE(key); for (i = 0; i < size; i++) { PyObject *x = PyTuple_GET_ITEM(key, i); - if (!PyIndex_Check(x)) + if (!_PyIndex_Check(x)) { return 0; + } } return 1; } @@ -2458,7 +2459,7 @@ memory_subscript(PyMemoryViewObject *self, PyObject *key) } } - if (PyIndex_Check(key)) { + if (_PyIndex_Check(key)) { Py_ssize_t index; index = PyNumber_AsSsize_t(key, PyExc_IndexError); if (index == -1 && PyErr_Occurred()) @@ -2529,7 +2530,7 @@ memory_ass_sub(PyMemoryViewObject *self, PyObject *key, PyObject *value) } } - if (PyIndex_Check(key)) { + if (_PyIndex_Check(key)) { Py_ssize_t index; if (1 < view->ndim) { PyErr_SetString(PyExc_NotImplementedError, diff --git a/Objects/methodobject.c b/Objects/methodobject.c index 3604a55e5a1dc9458346a619f3811737aa698c31..7b430416c5a048715c1e8e91b4128c46ca25f828 100644 --- a/Objects/methodobject.c +++ b/Objects/methodobject.c @@ -2,32 +2,30 @@ /* Method object implementation */ #include "Python.h" +#include "pycore_ceval.h" // _Py_EnterRecursiveCall() #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" -#include "structmember.h" - -/* Free list for method objects to safe malloc/free overhead - * The m_self element is used to chain the objects. - */ -static PyCFunctionObject *free_list = NULL; -static int numfree = 0; -#ifndef PyCFunction_MAXFREELIST -#define PyCFunction_MAXFREELIST 256 -#endif +#include "pycore_pyerrors.h" +#include "pycore_pystate.h" // _PyThreadState_GET() +#include "structmember.h" // PyMemberDef /* undefine macro trampoline to PyCFunction_NewEx */ #undef PyCFunction_New +/* undefine macro trampoline to PyCMethod_New */ +#undef PyCFunction_NewEx /* Forward declarations */ static PyObject * cfunction_vectorcall_FASTCALL( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); static PyObject * cfunction_vectorcall_FASTCALL_KEYWORDS( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * cfunction_vectorcall_FASTCALL_KEYWORDS_METHOD( + PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); static PyObject * cfunction_vectorcall_NOARGS( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); static PyObject * cfunction_vectorcall_O( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); +static PyObject * cfunction_call( + PyObject *func, PyObject *args, PyObject *kwargs); PyObject * @@ -38,10 +36,17 @@ PyCFunction_New(PyMethodDef *ml, PyObject *self) PyObject * PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module) +{ + return PyCMethod_New(ml, self, module, NULL); +} + +PyObject * +PyCMethod_New(PyMethodDef *ml, PyObject *self, PyObject *module, PyTypeObject *cls) { /* Figure out correct vectorcall function to use */ vectorcallfunc vectorcall; - switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS)) + switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | + METH_O | METH_KEYWORDS | METH_METHOD)) { case METH_VARARGS: case METH_VARARGS | METH_KEYWORDS: @@ -61,24 +66,44 @@ PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module) case METH_O: vectorcall = cfunction_vectorcall_O; break; + case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: + vectorcall = cfunction_vectorcall_FASTCALL_KEYWORDS_METHOD; + break; default: PyErr_Format(PyExc_SystemError, "%s() method: bad call flags", ml->ml_name); return NULL; } - PyCFunctionObject *op; - op = free_list; - if (op != NULL) { - free_list = (PyCFunctionObject *)(op->m_self); - (void)PyObject_INIT(op, &PyCFunction_Type); - numfree--; - } - else { + PyCFunctionObject *op = NULL; + + if (ml->ml_flags & METH_METHOD) { + if (!cls) { + PyErr_SetString(PyExc_SystemError, + "attempting to create PyCMethod with a METH_METHOD " + "flag but no class"); + return NULL; + } + PyCMethodObject *om = PyObject_GC_New(PyCMethodObject, &PyCMethod_Type); + if (om == NULL) { + return NULL; + } + Py_INCREF(cls); + om->mm_class = cls; + op = (PyCFunctionObject *)om; + } else { + if (cls) { + PyErr_SetString(PyExc_SystemError, + "attempting to create PyCFunction with class " + "but no METH_METHOD flag"); + return NULL; + } op = PyObject_GC_New(PyCFunctionObject, &PyCFunction_Type); - if (op == NULL) + if (op == NULL) { return NULL; + } } + op->m_weakreflist = NULL; op->m_ml = ml; Py_XINCREF(self); @@ -120,6 +145,16 @@ PyCFunction_GetFlags(PyObject *op) return PyCFunction_GET_FLAGS(op); } +PyTypeObject * +PyCMethod_GetClass(PyObject *op) +{ + if (!PyCFunction_Check(op)) { + PyErr_BadInternalCall(); + return NULL; + } + return PyCFunction_GET_CLASS(op); +} + /* Methods (the standard built-in methods, that is) */ static void @@ -129,16 +164,12 @@ meth_dealloc(PyCFunctionObject *m) if (m->m_weakreflist != NULL) { PyObject_ClearWeakRefs((PyObject*) m); } + // Dereference class before m_self: PyCFunction_GET_CLASS accesses + // PyMethodDef m_ml, which could be kept alive by m_self + Py_XDECREF(PyCFunction_GET_CLASS(m)); Py_XDECREF(m->m_self); Py_XDECREF(m->m_module); - if (numfree < PyCFunction_MAXFREELIST) { - m->m_self = (PyObject *)free_list; - free_list = m; - numfree++; - } - else { - PyObject_GC_Del(m); - } + PyObject_GC_Del(m); } static PyObject * @@ -214,6 +245,7 @@ meth_get__qualname__(PyCFunctionObject *m, void *closure) static int meth_traverse(PyCFunctionObject *m, visitproc visit, void *arg) { + Py_VISIT(PyCFunction_GET_CLASS(m)); Py_VISIT(m->m_self); Py_VISIT(m->m_module); return 0; @@ -243,7 +275,7 @@ static PyGetSetDef meth_getsets [] = { #define OFF(x) offsetof(PyCFunctionObject, x) static PyMemberDef meth_members[] = { - {"__module__", T_OBJECT, OFF(m_module), PY_WRITE_RESTRICTED}, + {"__module__", T_OBJECT, OFF(m_module), 0}, {NULL} }; @@ -255,7 +287,7 @@ meth_repr(PyCFunctionObject *m) m->m_ml->ml_name); return PyUnicode_FromFormat("", m->m_ml->ml_name, - m->m_self->ob_type->tp_name, + Py_TYPE(m->m_self)->tp_name, m->m_self); } @@ -313,13 +345,13 @@ PyTypeObject PyCFunction_Type = { 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)meth_hash, /* tp_hash */ - PyCFunction_Call, /* tp_call */ + cfunction_call, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | - _Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ + Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ 0, /* tp_doc */ (traverseproc)meth_traverse, /* tp_traverse */ 0, /* tp_clear */ @@ -334,38 +366,12 @@ PyTypeObject PyCFunction_Type = { 0, /* tp_dict */ }; -/* Clear out the free list */ - -int -PyCFunction_ClearFreeList(void) -{ - int freelist_size = numfree; - - while (free_list) { - PyCFunctionObject *v = free_list; - free_list = (PyCFunctionObject *)(v->m_self); - PyObject_GC_Del(v); - numfree--; - } - assert(numfree == 0); - return freelist_size; -} - -void -PyCFunction_Fini(void) -{ - (void)PyCFunction_ClearFreeList(); -} - -/* Print summary info about the state of the optimized allocator */ -void -_PyCFunction_DebugMallocStats(FILE *out) -{ - _PyDebugAllocatorStats(out, - "free PyCFunctionObject", - numfree, sizeof(PyCFunctionObject)); -} - +PyTypeObject PyCMethod_Type = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + .tp_name = "builtin_method", + .tp_basicsize = sizeof(PyCMethodObject), + .tp_base = &PyCFunction_Type, +}; /* Vectorcall functions for each of the PyCFunction calling conventions, * except for METH_VARARGS (possibly combined with METH_KEYWORDS) which @@ -373,33 +379,30 @@ _PyCFunction_DebugMallocStats(FILE *out) * * First, common helpers */ -static const char * -get_name(PyObject *func) -{ - assert(PyCFunction_Check(func)); - PyMethodDef *method = ((PyCFunctionObject *)func)->m_ml; - return method->ml_name; -} - -typedef void (*funcptr)(void); static inline int -cfunction_check_kwargs(PyObject *func, PyObject *kwnames) +cfunction_check_kwargs(PyThreadState *tstate, PyObject *func, PyObject *kwnames) { - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); assert(PyCFunction_Check(func)); if (kwnames && PyTuple_GET_SIZE(kwnames)) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes no keyword arguments", get_name(func)); + PyObject *funcstr = _PyObject_FunctionStr(func); + if (funcstr != NULL) { + _PyErr_Format(tstate, PyExc_TypeError, + "%U takes no keyword arguments", funcstr); + Py_DECREF(funcstr); + } return -1; } return 0; } +typedef void (*funcptr)(void); + static inline funcptr -cfunction_enter_call(PyObject *func) +cfunction_enter_call(PyThreadState *tstate, PyObject *func) { - if (Py_EnterRecursiveCall(" while calling a Python object")) { + if (_Py_EnterRecursiveCall(tstate, " while calling a Python object")) { return NULL; } return (funcptr)PyCFunction_GET_FUNCTION(func); @@ -410,17 +413,18 @@ static PyObject * cfunction_vectorcall_FASTCALL( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { - if (cfunction_check_kwargs(func, kwnames)) { + PyThreadState *tstate = _PyThreadState_GET(); + if (cfunction_check_kwargs(tstate, func, kwnames)) { return NULL; } Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); _PyCFunctionFast meth = (_PyCFunctionFast) - cfunction_enter_call(func); + cfunction_enter_call(tstate, func); if (meth == NULL) { return NULL; } PyObject *result = meth(PyCFunction_GET_SELF(func), args, nargs); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); return result; } @@ -428,14 +432,31 @@ static PyObject * cfunction_vectorcall_FASTCALL_KEYWORDS( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { + PyThreadState *tstate = _PyThreadState_GET(); Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); _PyCFunctionFastWithKeywords meth = (_PyCFunctionFastWithKeywords) - cfunction_enter_call(func); + cfunction_enter_call(tstate, func); if (meth == NULL) { return NULL; } PyObject *result = meth(PyCFunction_GET_SELF(func), args, nargs, kwnames); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); + return result; +} + +static PyObject * +cfunction_vectorcall_FASTCALL_KEYWORDS_METHOD( + PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) +{ + PyThreadState *tstate = _PyThreadState_GET(); + PyTypeObject *cls = PyCFunction_GET_CLASS(func); + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + PyCMethod meth = (PyCMethod)cfunction_enter_call(tstate, func); + if (meth == NULL) { + return NULL; + } + PyObject *result = meth(PyCFunction_GET_SELF(func), cls, args, nargs, kwnames); + _Py_LeaveRecursiveCall(tstate); return result; } @@ -443,21 +464,26 @@ static PyObject * cfunction_vectorcall_NOARGS( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { - if (cfunction_check_kwargs(func, kwnames)) { + PyThreadState *tstate = _PyThreadState_GET(); + if (cfunction_check_kwargs(tstate, func, kwnames)) { return NULL; } Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); if (nargs != 0) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes no arguments (%zd given)", get_name(func), nargs); + PyObject *funcstr = _PyObject_FunctionStr(func); + if (funcstr != NULL) { + _PyErr_Format(tstate, PyExc_TypeError, + "%U takes no arguments (%zd given)", funcstr, nargs); + Py_DECREF(funcstr); + } return NULL; } - PyCFunction meth = (PyCFunction)cfunction_enter_call(func); + PyCFunction meth = (PyCFunction)cfunction_enter_call(tstate, func); if (meth == NULL) { return NULL; } PyObject *result = meth(PyCFunction_GET_SELF(func), NULL); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); return result; } @@ -465,21 +491,61 @@ static PyObject * cfunction_vectorcall_O( PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { - if (cfunction_check_kwargs(func, kwnames)) { + PyThreadState *tstate = _PyThreadState_GET(); + if (cfunction_check_kwargs(tstate, func, kwnames)) { return NULL; } Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); if (nargs != 1) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes exactly one argument (%zd given)", - get_name(func), nargs); + PyObject *funcstr = _PyObject_FunctionStr(func); + if (funcstr != NULL) { + _PyErr_Format(tstate, PyExc_TypeError, + "%U takes exactly one argument (%zd given)", funcstr, nargs); + Py_DECREF(funcstr); + } return NULL; } - PyCFunction meth = (PyCFunction)cfunction_enter_call(func); + PyCFunction meth = (PyCFunction)cfunction_enter_call(tstate, func); if (meth == NULL) { return NULL; } PyObject *result = meth(PyCFunction_GET_SELF(func), args[0]); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); return result; } + + +static PyObject * +cfunction_call(PyObject *func, PyObject *args, PyObject *kwargs) +{ + assert(kwargs == NULL || PyDict_Check(kwargs)); + + PyThreadState *tstate = _PyThreadState_GET(); + assert(!_PyErr_Occurred(tstate)); + + int flags = PyCFunction_GET_FLAGS(func); + if (!(flags & METH_VARARGS)) { + /* If this is not a METH_VARARGS function, delegate to vectorcall */ + return PyVectorcall_Call(func, args, kwargs); + } + + /* For METH_VARARGS, we cannot use vectorcall as the vectorcall pointer + * is NULL. This is intentional, since vectorcall would be slower. */ + PyCFunction meth = PyCFunction_GET_FUNCTION(func); + PyObject *self = PyCFunction_GET_SELF(func); + + PyObject *result; + if (flags & METH_KEYWORDS) { + result = (*(PyCFunctionWithKeywords)(void(*)(void))meth)(self, args, kwargs); + } + else { + if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) { + _PyErr_Format(tstate, PyExc_TypeError, + "%.200s() takes no keyword arguments", + ((PyCFunctionObject*)func)->m_ml->ml_name); + return NULL; + } + result = meth(self, args); + } + return _Py_CheckFunctionResult(tstate, func, result, NULL); +} diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index 85134c7a11c6bbb18d9759039cc8b0f19c6af7f6..ee4ed97588e29e6c41036b9604896582aa3267c2 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -2,11 +2,16 @@ /* Module object implementation */ #include "Python.h" -#include "pycore_pystate.h" -#include "structmember.h" +#include "pycore_interp.h" // PyInterpreterState.importlib +#include "pycore_pystate.h" // _PyInterpreterState_GET() +#include "structmember.h" // PyMemberDef static Py_ssize_t max_module_number; +_Py_IDENTIFIER(__doc__); +_Py_IDENTIFIER(__name__); +_Py_IDENTIFIER(__spec__); + typedef struct { PyObject_HEAD PyObject *md_dict; @@ -22,16 +27,6 @@ static PyMemberDef module_members[] = { }; -/* Helper for sanity check for traverse not handling m_state == NULL - * Issue #32374 */ -#ifdef Py_DEBUG -static int -bad_traverse_test(PyObject *self, void *arg) { - assert(self != NULL); - return 0; -} -#endif - PyTypeObject PyModuleDef_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "moduledef", /* tp_name */ @@ -47,8 +42,8 @@ PyModuleDef_Init(struct PyModuleDef* def) return NULL; if (def->m_base.m_index == 0) { max_module_number++; - Py_REFCNT(def) = 1; - Py_TYPE(def) = &PyModuleDef_Type; + Py_SET_REFCNT(def, 1); + Py_SET_TYPE(def, &PyModuleDef_Type); def->m_base.m_index = max_module_number; } return (PyObject*)def; @@ -58,11 +53,8 @@ static int module_init_dict(PyModuleObject *mod, PyObject *md_dict, PyObject *name, PyObject *doc) { - _Py_IDENTIFIER(__name__); - _Py_IDENTIFIER(__doc__); _Py_IDENTIFIER(__package__); _Py_IDENTIFIER(__loader__); - _Py_IDENTIFIER(__spec__); if (md_dict == NULL) return -1; @@ -173,8 +165,11 @@ _add_methods_to_object(PyObject *module, PyObject *name, PyMethodDef *functions) PyObject * PyModule_Create2(struct PyModuleDef* module, int module_api_version) { - if (!_PyImport_IsInitialized(_PyInterpreterState_Get())) - Py_FatalError("Python import machinery not initialized"); + if (!_PyImport_IsInitialized(_PyInterpreterState_GET())) { + PyErr_SetString(PyExc_SystemError, + "Python import machinery not initialized"); + return NULL; + } return _PyModule_CreateInitialized(module, module_api_version); } @@ -356,16 +351,6 @@ PyModule_FromDefAndSpec2(struct PyModuleDef* def, PyObject *spec, int module_api } } - /* Sanity check for traverse not handling m_state == NULL - * This doesn't catch all possible cases, but in many cases it should - * make many cases of invalid code crash or raise Valgrind issues - * sooner than they would otherwise. - * Issue #32374 */ -#ifdef Py_DEBUG - if (def->m_traverse != NULL) { - def->m_traverse(m, bad_traverse_test, NULL); - } -#endif Py_DECREF(nameobj); return m; @@ -458,7 +443,6 @@ int PyModule_SetDocString(PyObject *m, const char *doc) { PyObject *v; - _Py_IDENTIFIER(__doc__); v = PyUnicode_FromString(doc); if (v == NULL || _PyObject_SetAttrId(m, &PyId___doc__, v) != 0) { @@ -485,7 +469,6 @@ PyModule_GetDict(PyObject *m) PyObject* PyModule_GetNameObject(PyObject *m) { - _Py_IDENTIFIER(__name__); PyObject *d; PyObject *name; if (!PyModule_Check(m)) { @@ -590,7 +573,7 @@ _PyModule_ClearDict(PyObject *d) Py_ssize_t pos; PyObject *key, *value; - int verbose = _PyInterpreterState_GET_UNSAFE()->config.verbose; + int verbose = _Py_GetConfig()->verbose; /* First, clear only names starting with a single underscore */ pos = 0; @@ -677,16 +660,20 @@ module___init___impl(PyModuleObject *self, PyObject *name, PyObject *doc) static void module_dealloc(PyModuleObject *m) { - int verbose = _PyInterpreterState_GET_UNSAFE()->config.verbose; + int verbose = _Py_GetConfig()->verbose; PyObject_GC_UnTrack(m); if (verbose && m->md_name) { - PySys_FormatStderr("# destroy %S\n", m->md_name); + PySys_FormatStderr("# destroy %U\n", m->md_name); } if (m->md_weaklist != NULL) PyObject_ClearWeakRefs((PyObject *) m); - if (m->md_def && m->md_def->m_free) + /* bpo-39824: Don't call m_free() if m_size > 0 and md_state=NULL */ + if (m->md_def && m->md_def->m_free + && (m->md_def->m_size <= 0 || m->md_state != NULL)) + { m->md_def->m_free(m); + } Py_XDECREF(m->md_dict); Py_XDECREF(m->md_name); if (m->md_state != NULL) @@ -697,7 +684,7 @@ module_dealloc(PyModuleObject *m) static PyObject * module_repr(PyModuleObject *m) { - PyInterpreterState *interp = _PyInterpreterState_Get(); + PyInterpreterState *interp = _PyInterpreterState_GET(); return PyObject_CallMethod(interp->importlib, "_module_repr", "O", m); } @@ -736,13 +723,10 @@ module_getattro(PyModuleObject *m, PyObject *name) _Py_IDENTIFIER(__getattr__); getattr = _PyDict_GetItemId(m->md_dict, &PyId___getattr__); if (getattr) { - PyObject* stack[1] = {name}; - return _PyObject_FastCall(getattr, stack, 1); + return PyObject_CallOneArg(getattr, name); } - _Py_IDENTIFIER(__name__); mod_name = _PyDict_GetItemId(m->md_dict, &PyId___name__); if (mod_name && PyUnicode_Check(mod_name)) { - _Py_IDENTIFIER(__spec__); Py_INCREF(mod_name); PyObject *spec = _PyDict_GetItemId(m->md_dict, &PyId___spec__); Py_XINCREF(spec); @@ -771,7 +755,10 @@ module_getattro(PyModuleObject *m, PyObject *name) static int module_traverse(PyModuleObject *m, visitproc visit, void *arg) { - if (m->md_def && m->md_def->m_traverse) { + /* bpo-39824: Don't call m_traverse() if m_size > 0 and md_state=NULL */ + if (m->md_def && m->md_def->m_traverse + && (m->md_def->m_size <= 0 || m->md_state != NULL)) + { int res = m->md_def->m_traverse((PyObject*)m, visit, arg); if (res) return res; @@ -783,8 +770,17 @@ module_traverse(PyModuleObject *m, visitproc visit, void *arg) static int module_clear(PyModuleObject *m) { - if (m->md_def && m->md_def->m_clear) { + /* bpo-39824: Don't call m_clear() if m_size > 0 and md_state=NULL */ + if (m->md_def && m->md_def->m_clear + && (m->md_def->m_size <= 0 || m->md_state != NULL)) + { int res = m->md_def->m_clear((PyObject*)m); + if (PyErr_Occurred()) { + PySys_FormatStderr("Exception ignored in m_clear of module%s%V\n", + m->md_name ? " " : "", + m->md_name, ""); + PyErr_WriteUnraisable(NULL); + } if (res) return res; } diff --git a/Objects/namespaceobject.c b/Objects/namespaceobject.c index ddad39a910762bce10865f2358e8437cad64c51a..fa37ed250d30a4b7f777748785aca8433c5c0d36 100644 --- a/Objects/namespaceobject.c +++ b/Objects/namespaceobject.c @@ -1,7 +1,7 @@ // namespace object implementation #include "Python.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef typedef struct { @@ -72,8 +72,8 @@ namespace_repr(PyObject *ns) PyObject *separator, *pairsrepr, *repr = NULL; const char * name; - name = (Py_TYPE(ns) == &_PyNamespace_Type) ? "namespace" - : ns->ob_type->tp_name; + name = Py_IS_TYPE(ns, &_PyNamespace_Type) ? "namespace" + : Py_TYPE(ns)->tp_name; i = Py_ReprEnter(ns); if (i != 0) { @@ -91,8 +91,6 @@ namespace_repr(PyObject *ns) keys = PyDict_Keys(d); if (keys == NULL) goto error; - if (PyList_Sort(keys) != 0) - goto error; keys_iter = PyObject_GetIter(keys); if (keys_iter == NULL) diff --git a/Objects/object.c b/Objects/object.c index 74b1b15d30bbf57254907d064807e79d2ed103f8..623ee52eb1e22da042d881b6c6dcfffcc744d857 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -2,10 +2,14 @@ /* Generic object operations; and implementation of None */ #include "Python.h" +#include "pycore_ceval.h" // _Py_EnterRecursiveCall() +#include "pycore_context.h" #include "pycore_initconfig.h" #include "pycore_object.h" -#include "pycore_pystate.h" -#include "pycore_context.h" +#include "pycore_pyerrors.h" +#include "pycore_pylifecycle.h" +#include "pycore_pymem.h" // _PyMem_IsPtrFreed() +#include "pycore_pystate.h" // _PyThreadState_GET() #include "frameobject.h" #include "interpreteridobject.h" @@ -31,8 +35,7 @@ _PyObject_CheckConsistency(PyObject *op, int check_content) CHECK(!_PyObject_IsFreed(op)); CHECK(Py_REFCNT(op) >= 1); - CHECK(op->ob_type != NULL); - _PyType_CheckConsistency(op->ob_type); + _PyType_CheckConsistency(Py_TYPE(op)); if (PyUnicode_Check(op)) { _PyUnicode_CheckConsistency(op, check_content); @@ -56,7 +59,7 @@ _Py_GetRefTotal(void) Py_ssize_t total = _Py_RefTotal; o = _PySet_Dummy; if (o != NULL) - total -= o->ob_refcnt; + total -= Py_REFCNT(o); return total; } @@ -111,122 +114,6 @@ _Py_AddToAllObjects(PyObject *op, int force) } #endif /* Py_TRACE_REFS */ -#ifdef COUNT_ALLOCS -static PyTypeObject *type_list; -/* All types are added to type_list, at least when - they get one object created. That makes them - immortal, which unfortunately contributes to - garbage itself. If unlist_types_without_objects - is set, they will be removed from the type_list - once the last object is deallocated. */ -static int unlist_types_without_objects; -extern Py_ssize_t _Py_tuple_zero_allocs, _Py_fast_tuple_allocs; -extern Py_ssize_t _Py_quick_int_allocs, _Py_quick_neg_int_allocs; -extern Py_ssize_t _Py_null_strings, _Py_one_strings; -void -_Py_dump_counts(FILE* f) -{ - PyInterpreterState *interp = _PyInterpreterState_Get(); - if (!interp->config.show_alloc_count) { - return; - } - - PyTypeObject *tp; - for (tp = type_list; tp; tp = tp->tp_next) - fprintf(f, "%s alloc'd: %" PY_FORMAT_SIZE_T "d, " - "freed: %" PY_FORMAT_SIZE_T "d, " - "max in use: %" PY_FORMAT_SIZE_T "d\n", - tp->tp_name, tp->tp_allocs, tp->tp_frees, - tp->tp_maxalloc); - fprintf(f, "fast tuple allocs: %" PY_FORMAT_SIZE_T "d, " - "empty: %" PY_FORMAT_SIZE_T "d\n", - _Py_fast_tuple_allocs, _Py_tuple_zero_allocs); - fprintf(f, "fast int allocs: pos: %" PY_FORMAT_SIZE_T "d, " - "neg: %" PY_FORMAT_SIZE_T "d\n", - _Py_quick_int_allocs, _Py_quick_neg_int_allocs); - fprintf(f, "null strings: %" PY_FORMAT_SIZE_T "d, " - "1-strings: %" PY_FORMAT_SIZE_T "d\n", - _Py_null_strings, _Py_one_strings); -} - -PyObject * -_Py_get_counts(void) -{ - PyTypeObject *tp; - PyObject *result; - PyObject *v; - - result = PyList_New(0); - if (result == NULL) - return NULL; - for (tp = type_list; tp; tp = tp->tp_next) { - v = Py_BuildValue("(snnn)", tp->tp_name, tp->tp_allocs, - tp->tp_frees, tp->tp_maxalloc); - if (v == NULL) { - Py_DECREF(result); - return NULL; - } - if (PyList_Append(result, v) < 0) { - Py_DECREF(v); - Py_DECREF(result); - return NULL; - } - Py_DECREF(v); - } - return result; -} - -void -_Py_inc_count(PyTypeObject *tp) -{ - if (tp->tp_next == NULL && tp->tp_prev == NULL) { - /* first time; insert in linked list */ - if (tp->tp_next != NULL) /* sanity check */ - Py_FatalError("XXX _Py_inc_count sanity check"); - if (type_list) - type_list->tp_prev = tp; - tp->tp_next = type_list; - /* Note that as of Python 2.2, heap-allocated type objects - * can go away, but this code requires that they stay alive - * until program exit. That's why we're careful with - * refcounts here. type_list gets a new reference to tp, - * while ownership of the reference type_list used to hold - * (if any) was transferred to tp->tp_next in the line above. - * tp is thus effectively immortal after this. - */ - Py_INCREF(tp); - type_list = tp; -#ifdef Py_TRACE_REFS - /* Also insert in the doubly-linked list of all objects, - * if not already there. - */ - _Py_AddToAllObjects((PyObject *)tp, 0); -#endif - } - tp->tp_allocs++; - if (tp->tp_allocs - tp->tp_frees > tp->tp_maxalloc) - tp->tp_maxalloc = tp->tp_allocs - tp->tp_frees; -} - -void _Py_dec_count(PyTypeObject *tp) -{ - tp->tp_frees++; - if (unlist_types_without_objects && - tp->tp_allocs == tp->tp_frees) { - /* unlink the type from type_list */ - if (tp->tp_prev) - tp->tp_prev->tp_next = tp->tp_next; - else - type_list = tp->tp_next; - if (tp->tp_next) - tp->tp_next->tp_prev = tp->tp_prev; - tp->tp_next = tp->tp_prev = NULL; - Py_DECREF(tp); - } -} - -#endif - #ifdef Py_REF_DEBUG /* Log a fatal error; doesn't return. */ void @@ -253,36 +140,34 @@ Py_DecRef(PyObject *o) PyObject * PyObject_Init(PyObject *op, PyTypeObject *tp) { - if (op == NULL) + /* Any changes should be reflected in PyObject_INIT() macro */ + if (op == NULL) { return PyErr_NoMemory(); - /* Any changes should be reflected in PyObject_INIT (objimpl.h) */ - Py_TYPE(op) = tp; - if (PyType_GetFlags(tp) & Py_TPFLAGS_HEAPTYPE) { - Py_INCREF(tp); } - _Py_NewReference(op); - return op; + + return PyObject_INIT(op, tp); } PyVarObject * PyObject_InitVar(PyVarObject *op, PyTypeObject *tp, Py_ssize_t size) { - if (op == NULL) + /* Any changes should be reflected in PyObject_INIT_VAR() macro */ + if (op == NULL) { return (PyVarObject *) PyErr_NoMemory(); - /* Any changes should be reflected in PyObject_INIT_VAR */ - Py_SIZE(op) = size; - PyObject_Init((PyObject *)op, tp); - return op; + } + + return PyObject_INIT_VAR(op, tp, size); } PyObject * _PyObject_New(PyTypeObject *tp) { - PyObject *op; - op = (PyObject *) PyObject_MALLOC(_PyObject_SIZE(tp)); - if (op == NULL) + PyObject *op = (PyObject *) PyObject_MALLOC(_PyObject_SIZE(tp)); + if (op == NULL) { return PyErr_NoMemory(); - return PyObject_INIT(op, tp); + } + PyObject_INIT(op, tp); + return op; } PyVarObject * @@ -304,11 +189,11 @@ PyObject_CallFinalizer(PyObject *self) if (tp->tp_finalize == NULL) return; /* tp_finalize should only be called once. */ - if (PyType_IS_GC(tp) && _PyGC_FINALIZED(self)) + if (_PyType_IS_GC(tp) && _PyGC_FINALIZED(self)) return; tp->tp_finalize(self); - if (PyType_IS_GC(tp)) { + if (_PyType_IS_GC(tp)) { _PyGC_SET_FINALIZED(self); } } @@ -316,48 +201,41 @@ PyObject_CallFinalizer(PyObject *self) int PyObject_CallFinalizerFromDealloc(PyObject *self) { - Py_ssize_t refcnt; + if (Py_REFCNT(self) != 0) { + _PyObject_ASSERT_FAILED_MSG(self, + "PyObject_CallFinalizerFromDealloc called " + "on object with a non-zero refcount"); + } /* Temporarily resurrect the object. */ - if (self->ob_refcnt != 0) { - Py_FatalError("PyObject_CallFinalizerFromDealloc called on " - "object with a non-zero refcount"); - } - self->ob_refcnt = 1; + Py_SET_REFCNT(self, 1); PyObject_CallFinalizer(self); - /* Undo the temporary resurrection; can't use DECREF here, it would - * cause a recursive call. - */ _PyObject_ASSERT_WITH_MSG(self, - self->ob_refcnt > 0, + Py_REFCNT(self) > 0, "refcount is too small"); - if (--self->ob_refcnt == 0) + + /* Undo the temporary resurrection; can't use DECREF here, it would + * cause a recursive call. */ + Py_SET_REFCNT(self, Py_REFCNT(self) - 1); + if (Py_REFCNT(self) == 0) { return 0; /* this is the normal path out */ + } /* tp_finalize resurrected it! Make it look like the original Py_DECREF - * never happened. - */ - refcnt = self->ob_refcnt; + * never happened. */ + Py_ssize_t refcnt = Py_REFCNT(self); _Py_NewReference(self); - self->ob_refcnt = refcnt; + Py_SET_REFCNT(self, refcnt); _PyObject_ASSERT(self, - (!PyType_IS_GC(Py_TYPE(self)) + (!_PyType_IS_GC(Py_TYPE(self)) || _PyObject_GC_IS_TRACKED(self))); - /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so - * we need to undo that. */ - _Py_DEC_REFTOTAL; - /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object - * chain, so no more to do there. - * If COUNT_ALLOCS, the original decref bumped tp_frees, and - * _Py_NewReference bumped tp_allocs: both of those need to be - * undone. - */ -#ifdef COUNT_ALLOCS - --Py_TYPE(self)->tp_frees; - --Py_TYPE(self)->tp_allocs; + /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased + _Py_RefTotal, so we need to undo that. */ +#ifdef Py_REF_DEBUG + _Py_RefTotal--; #endif return -1; } @@ -381,12 +259,12 @@ PyObject_Print(PyObject *op, FILE *fp, int flags) Py_END_ALLOW_THREADS } else { - if (op->ob_refcnt <= 0) { + if (Py_REFCNT(op) <= 0) { /* XXX(twouters) cast refcount to long until %zd is universally available */ Py_BEGIN_ALLOW_THREADS fprintf(fp, "", - (long)op->ob_refcnt, (void *)op); + (long)Py_REFCNT(op), (void *)op); Py_END_ALLOW_THREADS } else { @@ -416,7 +294,7 @@ PyObject_Print(PyObject *op, FILE *fp, int flags) else { PyErr_Format(PyExc_TypeError, "str() or repr() returned '%.100s'", - s->ob_type->tp_name); + Py_TYPE(s)->tp_name); ret = -1; } Py_XDECREF(s); @@ -448,7 +326,7 @@ _Py_BreakPoint(void) int _PyObject_IsFreed(PyObject *op) { - if (_PyMem_IsPtrFreed(op) || _PyMem_IsPtrFreed(op->ob_type)) { + if (_PyMem_IsPtrFreed(op) || _PyMem_IsPtrFreed(Py_TYPE(op))) { return 1; } /* ignore op->ob_ref: its value can have be modified @@ -481,7 +359,7 @@ _PyObject_Dump(PyObject* op) fprintf(stderr, "object address : %p\n", (void *)op); /* XXX(twouters) cast refcount to long until %zd is universally available */ - fprintf(stderr, "object refcount : %ld\n", (long)op->ob_refcnt); + fprintf(stderr, "object refcount : %ld\n", (long)Py_REFCNT(op)); fflush(stderr); PyTypeObject *type = Py_TYPE(op); @@ -523,33 +401,39 @@ PyObject_Repr(PyObject *v) return PyUnicode_FromString(""); if (Py_TYPE(v)->tp_repr == NULL) return PyUnicode_FromFormat("<%s object at %p>", - v->ob_type->tp_name, v); + Py_TYPE(v)->tp_name, v); + PyThreadState *tstate = _PyThreadState_GET(); #ifdef Py_DEBUG /* PyObject_Repr() must not be called with an exception set, because it can clear it (directly or indirectly) and so the caller loses its exception */ - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); #endif /* It is possible for a type to have a tp_repr representation that loops infinitely. */ - if (Py_EnterRecursiveCall(" while getting the repr of an object")) + if (_Py_EnterRecursiveCall(tstate, + " while getting the repr of an object")) { return NULL; - res = (*v->ob_type->tp_repr)(v); - Py_LeaveRecursiveCall(); - if (res == NULL) + } + res = (*Py_TYPE(v)->tp_repr)(v); + _Py_LeaveRecursiveCall(tstate); + + if (res == NULL) { return NULL; + } if (!PyUnicode_Check(res)) { - PyErr_Format(PyExc_TypeError, - "__repr__ returned non-string (type %.200s)", - res->ob_type->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "__repr__ returned non-string (type %.200s)", + Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL; } #ifndef Py_DEBUG - if (PyUnicode_READY(res) < 0) + if (PyUnicode_READY(res) < 0) { return NULL; + } #endif return res; } @@ -579,31 +463,36 @@ PyObject_Str(PyObject *v) if (Py_TYPE(v)->tp_str == NULL) return PyObject_Repr(v); + PyThreadState *tstate = _PyThreadState_GET(); #ifdef Py_DEBUG /* PyObject_Str() must not be called with an exception set, because it can clear it (directly or indirectly) and so the caller loses its exception */ - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); #endif /* It is possible for a type to have a tp_str representation that loops infinitely. */ - if (Py_EnterRecursiveCall(" while getting the str of an object")) + if (_Py_EnterRecursiveCall(tstate, " while getting the str of an object")) { return NULL; + } res = (*Py_TYPE(v)->tp_str)(v); - Py_LeaveRecursiveCall(); - if (res == NULL) + _Py_LeaveRecursiveCall(tstate); + + if (res == NULL) { return NULL; + } if (!PyUnicode_Check(res)) { - PyErr_Format(PyExc_TypeError, - "__str__ returned non-string (type %.200s)", - Py_TYPE(res)->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "__str__ returned non-string (type %.200s)", + Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL; } #ifndef Py_DEBUG - if (PyUnicode_READY(res) < 0) + if (PyUnicode_READY(res) < 0) { return NULL; + } #endif assert(_PyUnicode_CheckConsistency(res, 1)); return res; @@ -669,6 +558,64 @@ PyObject_Bytes(PyObject *v) return PyBytes_FromObject(v); } + +/* +def _PyObject_FunctionStr(x): + try: + qualname = x.__qualname__ + except AttributeError: + return str(x) + try: + mod = x.__module__ + if mod is not None and mod != 'builtins': + return f"{x.__module__}.{qualname}()" + except AttributeError: + pass + return qualname +*/ +PyObject * +_PyObject_FunctionStr(PyObject *x) +{ + _Py_IDENTIFIER(__module__); + _Py_IDENTIFIER(__qualname__); + _Py_IDENTIFIER(builtins); + assert(!PyErr_Occurred()); + PyObject *qualname; + int ret = _PyObject_LookupAttrId(x, &PyId___qualname__, &qualname); + if (qualname == NULL) { + if (ret < 0) { + return NULL; + } + return PyObject_Str(x); + } + PyObject *module; + PyObject *result = NULL; + ret = _PyObject_LookupAttrId(x, &PyId___module__, &module); + if (module != NULL && module != Py_None) { + PyObject *builtinsname = _PyUnicode_FromId(&PyId_builtins); + if (builtinsname == NULL) { + goto done; + } + ret = PyObject_RichCompareBool(module, builtinsname, Py_NE); + if (ret < 0) { + // error + goto done; + } + if (ret > 0) { + result = PyUnicode_FromFormat("%S.%S()", module, qualname); + goto done; + } + } + else if (ret < 0) { + goto done; + } + result = PyUnicode_FromFormat("%S()", qualname); +done: + Py_DECREF(qualname); + Py_XDECREF(module); + return result; +} + /* For Python 3.0.1 and later, the old three-way comparison has been completely removed in favour of rich comparisons. PyObject_Compare() and PyObject_Cmp() are gone, and the builtin cmp function no longer exists. @@ -707,28 +654,28 @@ static const char * const opstrings[] = {"<", "<=", "==", "!=", ">", ">="}; /* Perform a rich comparison, raising TypeError when the requested comparison operator is not supported. */ static PyObject * -do_richcompare(PyObject *v, PyObject *w, int op) +do_richcompare(PyThreadState *tstate, PyObject *v, PyObject *w, int op) { richcmpfunc f; PyObject *res; int checked_reverse_op = 0; - if (v->ob_type != w->ob_type && - PyType_IsSubtype(w->ob_type, v->ob_type) && - (f = w->ob_type->tp_richcompare) != NULL) { + if (!Py_IS_TYPE(v, Py_TYPE(w)) && + PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v)) && + (f = Py_TYPE(w)->tp_richcompare) != NULL) { checked_reverse_op = 1; res = (*f)(w, v, _Py_SwappedOp[op]); if (res != Py_NotImplemented) return res; Py_DECREF(res); } - if ((f = v->ob_type->tp_richcompare) != NULL) { + if ((f = Py_TYPE(v)->tp_richcompare) != NULL) { res = (*f)(v, w, op); if (res != Py_NotImplemented) return res; Py_DECREF(res); } - if (!checked_reverse_op && (f = w->ob_type->tp_richcompare) != NULL) { + if (!checked_reverse_op && (f = Py_TYPE(w)->tp_richcompare) != NULL) { res = (*f)(w, v, _Py_SwappedOp[op]); if (res != Py_NotImplemented) return res; @@ -744,11 +691,11 @@ do_richcompare(PyObject *v, PyObject *w, int op) res = (v != w) ? Py_True : Py_False; break; default: - PyErr_Format(PyExc_TypeError, - "'%s' not supported between instances of '%.100s' and '%.100s'", - opstrings[op], - v->ob_type->tp_name, - w->ob_type->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "'%s' not supported between instances of '%.100s' and '%.100s'", + opstrings[op], + Py_TYPE(v)->tp_name, + Py_TYPE(w)->tp_name); return NULL; } Py_INCREF(res); @@ -761,18 +708,20 @@ do_richcompare(PyObject *v, PyObject *w, int op) PyObject * PyObject_RichCompare(PyObject *v, PyObject *w, int op) { - PyObject *res; + PyThreadState *tstate = _PyThreadState_GET(); assert(Py_LT <= op && op <= Py_GE); if (v == NULL || w == NULL) { - if (!PyErr_Occurred()) + if (!_PyErr_Occurred(tstate)) { PyErr_BadInternalCall(); + } return NULL; } - if (Py_EnterRecursiveCall(" in comparison")) + if (_Py_EnterRecursiveCall(tstate, " in comparison")) { return NULL; - res = do_richcompare(v, w, op); - Py_LeaveRecursiveCall(); + } + PyObject *res = do_richcompare(tstate, v, w, op); + _Py_LeaveRecursiveCall(tstate); return res; } @@ -934,7 +883,7 @@ PyObject_GetAttr(PyObject *v, PyObject *name) if (!PyUnicode_Check(name)) { PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", - name->ob_type->tp_name); + Py_TYPE(name)->tp_name); return NULL; } if (tp->tp_getattro != NULL) @@ -959,7 +908,7 @@ _PyObject_LookupAttr(PyObject *v, PyObject *name, PyObject **result) if (!PyUnicode_Check(name)) { PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", - name->ob_type->tp_name); + Py_TYPE(name)->tp_name); *result = NULL; return -1; } @@ -1035,7 +984,7 @@ PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value) if (!PyUnicode_Check(name)) { PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", - name->ob_type->tp_name); + Py_TYPE(name)->tp_name); return -1; } Py_INCREF(name); @@ -1057,7 +1006,7 @@ PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value) return err; } Py_DECREF(name); - _PyObject_ASSERT(name, name->ob_refcnt >= 1); + _PyObject_ASSERT(name, Py_REFCNT(name) >= 1); if (tp->tp_getattr == NULL && tp->tp_getattro == NULL) PyErr_Format(PyExc_TypeError, "'%.100s' object has no attributes " @@ -1087,13 +1036,11 @@ _PyObject_GetDictPtr(PyObject *obj) if (dictoffset == 0) return NULL; if (dictoffset < 0) { - Py_ssize_t tsize; - size_t size; - - tsize = ((PyVarObject *)obj)->ob_size; - if (tsize < 0) + Py_ssize_t tsize = Py_SIZE(obj); + if (tsize < 0) { tsize = -tsize; - size = _PyObject_VAR_SIZE(tp, tsize); + } + size_t size = _PyObject_VAR_SIZE(tp, tsize); dictoffset += (long)size; _PyObject_ASSERT(obj, dictoffset > 0); @@ -1158,12 +1105,12 @@ _PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) descr = _PyType_Lookup(tp, name); if (descr != NULL) { Py_INCREF(descr); - if (PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) { + if (_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) { meth_found = 1; } else { - f = descr->ob_type->tp_descr_get; + f = Py_TYPE(descr)->tp_descr_get; if (f != NULL && PyDescr_IsData(descr)) { - *method = f(descr, obj, (PyObject *)obj->ob_type); + *method = f(descr, obj, (PyObject *)Py_TYPE(obj)); Py_DECREF(descr); return 0; } @@ -1234,7 +1181,7 @@ _PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name, if (!PyUnicode_Check(name)){ PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", - name->ob_type->tp_name); + Py_TYPE(name)->tp_name); return NULL; } Py_INCREF(name); @@ -1249,9 +1196,9 @@ _PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name, f = NULL; if (descr != NULL) { Py_INCREF(descr); - f = descr->ob_type->tp_descr_get; + f = Py_TYPE(descr)->tp_descr_get; if (f != NULL && PyDescr_IsData(descr)) { - res = f(descr, obj, (PyObject *)obj->ob_type); + res = f(descr, obj, (PyObject *)Py_TYPE(obj)); if (res == NULL && suppress && PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); @@ -1265,13 +1212,11 @@ _PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name, dictoffset = tp->tp_dictoffset; if (dictoffset != 0) { if (dictoffset < 0) { - Py_ssize_t tsize; - size_t size; - - tsize = ((PyVarObject *)obj)->ob_size; - if (tsize < 0) + Py_ssize_t tsize = Py_SIZE(obj); + if (tsize < 0) { tsize = -tsize; - size = _PyObject_VAR_SIZE(tp, tsize); + } + size_t size = _PyObject_VAR_SIZE(tp, tsize); _PyObject_ASSERT(obj, size <= PY_SSIZE_T_MAX); dictoffset += (Py_ssize_t)size; @@ -1348,7 +1293,7 @@ _PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name, if (!PyUnicode_Check(name)){ PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", - name->ob_type->tp_name); + Py_TYPE(name)->tp_name); return -1; } @@ -1361,7 +1306,7 @@ _PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name, if (descr != NULL) { Py_INCREF(descr); - f = descr->ob_type->tp_descr_set; + f = Py_TYPE(descr)->tp_descr_set; if (f != NULL) { res = f(descr, obj, value); goto done; @@ -1454,15 +1399,15 @@ PyObject_IsTrue(PyObject *v) return 0; if (v == Py_None) return 0; - else if (v->ob_type->tp_as_number != NULL && - v->ob_type->tp_as_number->nb_bool != NULL) - res = (*v->ob_type->tp_as_number->nb_bool)(v); - else if (v->ob_type->tp_as_mapping != NULL && - v->ob_type->tp_as_mapping->mp_length != NULL) - res = (*v->ob_type->tp_as_mapping->mp_length)(v); - else if (v->ob_type->tp_as_sequence != NULL && - v->ob_type->tp_as_sequence->sq_length != NULL) - res = (*v->ob_type->tp_as_sequence->sq_length)(v); + else if (Py_TYPE(v)->tp_as_number != NULL && + Py_TYPE(v)->tp_as_number->nb_bool != NULL) + res = (*Py_TYPE(v)->tp_as_number->nb_bool)(v); + else if (Py_TYPE(v)->tp_as_mapping != NULL && + Py_TYPE(v)->tp_as_mapping->mp_length != NULL) + res = (*Py_TYPE(v)->tp_as_mapping->mp_length)(v); + else if (Py_TYPE(v)->tp_as_sequence != NULL && + Py_TYPE(v)->tp_as_sequence->sq_length != NULL) + res = (*Py_TYPE(v)->tp_as_sequence->sq_length)(v); else return 1; /* if it is negative, it should be either -1 or -2 */ @@ -1489,7 +1434,7 @@ PyCallable_Check(PyObject *x) { if (x == NULL) return 0; - return x->ob_type->tp_call != NULL; + return Py_TYPE(x)->tp_call != NULL; } @@ -1576,7 +1521,7 @@ none_repr(PyObject *op) } /* ARGUSED */ -static void +static void _Py_NO_RETURN none_dealloc(PyObject* ignore) { /* This should never get called, but we also don't want to SEGV if @@ -1714,7 +1659,7 @@ notimplemented_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) Py_RETURN_NOTIMPLEMENTED; } -static void +static void _Py_NO_RETURN notimplemented_dealloc(PyObject* ignore) { /* This should never get called, but we also don't want to SEGV if @@ -1723,6 +1668,22 @@ notimplemented_dealloc(PyObject* ignore) Py_FatalError("deallocating NotImplemented"); } +static int +notimplemented_bool(PyObject *v) +{ + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "NotImplemented should not be used in a boolean context", + 1) < 0) + { + return -1; + } + return 1; +} + +static PyNumberMethods notimplemented_as_number = { + .nb_bool = notimplemented_bool, +}; + PyTypeObject _PyNotImplemented_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "NotImplementedType", @@ -1733,8 +1694,8 @@ PyTypeObject _PyNotImplemented_Type = { 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_as_async*/ - NotImplemented_repr, /*tp_repr*/ - 0, /*tp_as_number*/ + NotImplemented_repr, /*tp_repr*/ + ¬implemented_as_number, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash */ @@ -1772,6 +1733,11 @@ PyObject _Py_NotImplementedStruct = { PyStatus _PyTypes_Init(void) { + PyStatus status = _PyTypes_InitSlotDefs(); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + #define INIT_TYPE(TYPE, NAME) \ do { \ if (PyType_Ready(TYPE) < 0) { \ @@ -1823,6 +1789,7 @@ _PyTypes_Init(void) INIT_TYPE(&PyCode_Type, "code"); INIT_TYPE(&PyFrame_Type, "frame"); INIT_TYPE(&PyCFunction_Type, "builtin function"); + INIT_TYPE(&PyCMethod_Type, "builtin method"); INIT_TYPE(&PyMethod_Type, "method"); INIT_TYPE(&PyFunction_Type, "function"); INIT_TYPE(&PyDictProxy_Type, "dict proxy"); @@ -1851,50 +1818,53 @@ _PyTypes_Init(void) } -#ifdef Py_TRACE_REFS - void _Py_NewReference(PyObject *op) { if (_Py_tracemalloc_config.tracing) { _PyTraceMalloc_NewReference(op); } - _Py_INC_REFTOTAL; - op->ob_refcnt = 1; +#ifdef Py_REF_DEBUG + _Py_RefTotal++; +#endif + Py_SET_REFCNT(op, 1); +#ifdef Py_TRACE_REFS _Py_AddToAllObjects(op, 1); - _Py_INC_TPALLOCS(op); +#endif } + +#ifdef Py_TRACE_REFS void _Py_ForgetReference(PyObject *op) { -#ifdef SLOW_UNREF_CHECK - PyObject *p; -#endif - if (op->ob_refcnt < 0) - Py_FatalError("UNREF negative refcnt"); + if (Py_REFCNT(op) < 0) { + _PyObject_ASSERT_FAILED_MSG(op, "negative refcnt"); + } + if (op == &refchain || - op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op) { - fprintf(stderr, "* ob\n"); - _PyObject_Dump(op); - fprintf(stderr, "* op->_ob_prev->_ob_next\n"); - _PyObject_Dump(op->_ob_prev->_ob_next); - fprintf(stderr, "* op->_ob_next->_ob_prev\n"); - _PyObject_Dump(op->_ob_next->_ob_prev); - Py_FatalError("UNREF invalid object"); + op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op) + { + _PyObject_ASSERT_FAILED_MSG(op, "invalid object chain"); } + #ifdef SLOW_UNREF_CHECK + PyObject *p; for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) { - if (p == op) + if (p == op) { break; + } + } + if (p == &refchain) { + /* Not found */ + _PyObject_ASSERT_FAILED_MSG(op, + "object not found in the objects list"); } - if (p == &refchain) /* Not found */ - Py_FatalError("UNREF unknown object"); #endif + op->_ob_next->_ob_prev = op->_ob_prev; op->_ob_prev->_ob_next = op->_ob_next; op->_ob_next = op->_ob_prev = NULL; - _Py_INC_TPFREES(op); } /* Print all live objects. Because PyObject_Print is called, the @@ -1906,7 +1876,7 @@ _Py_PrintReferences(FILE *fp) PyObject *op; fprintf(fp, "Remaining objects:\n"); for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) { - fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] ", (void *)op, op->ob_refcnt); + fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] ", (void *)op, Py_REFCNT(op)); if (PyObject_Print(op, fp, 0) != 0) PyErr_Clear(); putc('\n', fp); @@ -1923,7 +1893,7 @@ _Py_PrintReferenceAddresses(FILE *fp) fprintf(fp, "Remaining object addresses:\n"); for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] %s\n", (void *)op, - op->ob_refcnt, Py_TYPE(op)->tp_name); + Py_REFCNT(op), Py_TYPE(op)->tp_name); } PyObject * @@ -1941,7 +1911,7 @@ _Py_GetObjects(PyObject *self, PyObject *args) return NULL; for (i = 0; (n == 0 || i < n) && op != &refchain; i++) { while (op == self || op == args || op == res || op == t || - (t != NULL && Py_TYPE(op) != (PyTypeObject *) t)) { + (t != NULL && !Py_IS_TYPE(op, (PyTypeObject *) t))) { op = op->_ob_next; if (op == &refchain) return res; @@ -1965,12 +1935,10 @@ Py_ssize_t (*_Py_abstract_hack)(PyObject *) = PyObject_Size; void _PyObject_DebugTypeStats(FILE *out) { - _PyCFunction_DebugMallocStats(out); _PyDict_DebugMallocStats(out); _PyFloat_DebugMallocStats(out); _PyFrame_DebugMallocStats(out); _PyList_DebugMallocStats(out); - _PyMethod_DebugMallocStats(out); _PyTuple_DebugMallocStats(out); } @@ -2061,11 +2029,14 @@ Py_ReprLeave(PyObject *obj) void _PyTrash_deposit_object(PyObject *op) { - _PyObject_ASSERT(op, PyObject_IS_GC(op)); + PyThreadState *tstate = _PyThreadState_GET(); + struct _gc_runtime_state *gcstate = &tstate->interp->gc; + + _PyObject_ASSERT(op, _PyObject_IS_GC(op)); _PyObject_ASSERT(op, !_PyObject_GC_IS_TRACKED(op)); - _PyObject_ASSERT(op, op->ob_refcnt == 0); - _PyGCHead_SET_PREV(_Py_AS_GC(op), _PyRuntime.gc.trash_delete_later); - _PyRuntime.gc.trash_delete_later = op; + _PyObject_ASSERT(op, Py_REFCNT(op) == 0); + _PyGCHead_SET_PREV(_Py_AS_GC(op), gcstate->trash_delete_later); + gcstate->trash_delete_later = op; } /* The equivalent API, using per-thread state recursion info */ @@ -2073,24 +2044,27 @@ void _PyTrash_thread_deposit_object(PyObject *op) { PyThreadState *tstate = _PyThreadState_GET(); - _PyObject_ASSERT(op, PyObject_IS_GC(op)); + _PyObject_ASSERT(op, _PyObject_IS_GC(op)); _PyObject_ASSERT(op, !_PyObject_GC_IS_TRACKED(op)); - _PyObject_ASSERT(op, op->ob_refcnt == 0); + _PyObject_ASSERT(op, Py_REFCNT(op) == 0); _PyGCHead_SET_PREV(_Py_AS_GC(op), tstate->trash_delete_later); tstate->trash_delete_later = op; } -/* Dealloccate all the objects in the _PyTrash_delete_later list. Called when +/* Deallocate all the objects in the _PyTrash_delete_later list. Called when * the call-stack unwinds again. */ void _PyTrash_destroy_chain(void) { - while (_PyRuntime.gc.trash_delete_later) { - PyObject *op = _PyRuntime.gc.trash_delete_later; + PyThreadState *tstate = _PyThreadState_GET(); + struct _gc_runtime_state *gcstate = &tstate->interp->gc; + + while (gcstate->trash_delete_later) { + PyObject *op = gcstate->trash_delete_later; destructor dealloc = Py_TYPE(op)->tp_dealloc; - _PyRuntime.gc.trash_delete_later = + gcstate->trash_delete_later = (PyObject*) _PyGCHead_PREV(_Py_AS_GC(op)); /* Call the deallocator directly. This used to try to @@ -2099,10 +2073,10 @@ _PyTrash_destroy_chain(void) * assorted non-release builds calling Py_DECREF again ends * up distorting allocation statistics. */ - _PyObject_ASSERT(op, op->ob_refcnt == 0); - ++_PyRuntime.gc.trash_delete_nesting; + _PyObject_ASSERT(op, Py_REFCNT(op) == 0); + ++gcstate->trash_delete_nesting; (*dealloc)(op); - --_PyRuntime.gc.trash_delete_nesting; + --gcstate->trash_delete_nesting; } } @@ -2137,7 +2111,7 @@ _PyTrash_thread_destroy_chain(void) * assorted non-release builds calling Py_DECREF again ends * up distorting allocation statistics. */ - _PyObject_ASSERT(op, op->ob_refcnt == 0); + _PyObject_ASSERT(op, Py_REFCNT(op) == 0); (*dealloc)(op); assert(tstate->trash_delete_nesting == 1); } @@ -2145,7 +2119,31 @@ _PyTrash_thread_destroy_chain(void) } +int +_PyTrash_begin(PyThreadState *tstate, PyObject *op) +{ + if (tstate->trash_delete_nesting >= PyTrash_UNWIND_LEVEL) { + /* Store the object (to be deallocated later) and jump past + * Py_TRASHCAN_END, skipping the body of the deallocator */ + _PyTrash_thread_deposit_object(op); + return 1; + } + ++tstate->trash_delete_nesting; + return 0; +} + + void +_PyTrash_end(PyThreadState *tstate) +{ + --tstate->trash_delete_nesting; + if (tstate->trash_delete_later && tstate->trash_delete_nesting <= 0) { + _PyTrash_thread_destroy_chain(); + } +} + + +void _Py_NO_RETURN _PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg, const char *file, int line, const char *function) { @@ -2181,7 +2179,7 @@ _PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg, to crash than dumping the traceback. */ void *ptr; PyTypeObject *type = Py_TYPE(obj); - if (PyType_IS_GC(type)) { + if (_PyType_IS_GC(type)) { ptr = (void *)((char *)obj - sizeof(PyGC_Head)); } else { @@ -2201,20 +2199,24 @@ _PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg, } -#undef _Py_Dealloc - void _Py_Dealloc(PyObject *op) { destructor dealloc = Py_TYPE(op)->tp_dealloc; #ifdef Py_TRACE_REFS _Py_ForgetReference(op); -#else - _Py_INC_TPFREES(op); #endif (*dealloc)(op); } + +PyObject ** +PyObject_GET_WEAKREFS_LISTPTR(PyObject *op) +{ + return _PyObject_GET_WEAKREFS_LISTPTR(op); +} + + #ifdef __cplusplus } #endif diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index c483ff3e3b7018ef89222a757f5a5211fdc81602..eb34f10bddf993a45169563d220d97d238cb63c8 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -1,5 +1,5 @@ #include "Python.h" -#include "pycore_pymem.h" +#include "pycore_pymem.h" // _PyTraceMalloc_Config #include @@ -25,7 +25,7 @@ static void* _PyMem_DebugRealloc(void *ctx, void *ptr, size_t size); static void _PyMem_DebugFree(void *ctx, void *p); static void _PyObject_DebugDumpAddress(const void *p); -static void _PyMem_DebugCheckAddress(char api_id, const void *p); +static void _PyMem_DebugCheckAddress(const char *func, char api_id, const void *p); static void _PyMem_SetupDebugHooksDomain(PyMemAllocatorDomain domain); @@ -710,19 +710,21 @@ PyObject_Free(void *ptr) } -#ifdef WITH_PYMALLOC - -#ifdef WITH_VALGRIND -#include - /* If we're using GCC, use __builtin_expect() to reduce overhead of the valgrind checks */ #if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__) # define UNLIKELY(value) __builtin_expect((value), 0) +# define LIKELY(value) __builtin_expect((value), 1) #else # define UNLIKELY(value) (value) +# define LIKELY(value) (value) #endif +#ifdef WITH_PYMALLOC + +#ifdef WITH_VALGRIND +#include + /* -1 indicates that we haven't checked that we're running on valgrind yet. */ static int running_on_valgrind = -1; #endif @@ -1206,12 +1208,29 @@ static size_t ntimes_arena_allocated = 0; /* High water mark (max value ever seen) for narenas_currently_allocated. */ static size_t narenas_highwater = 0; -static Py_ssize_t _Py_AllocatedBlocks = 0; +static Py_ssize_t raw_allocated_blocks; Py_ssize_t _Py_GetAllocatedBlocks(void) { - return _Py_AllocatedBlocks; + Py_ssize_t n = raw_allocated_blocks; + /* add up allocated blocks for used pools */ + for (uint i = 0; i < maxarenas; ++i) { + /* Skip arenas which are not allocated. */ + if (arenas[i].address == 0) { + continue; + } + + uintptr_t base = (uintptr_t)_Py_ALIGN_UP(arenas[i].address, POOL_SIZE); + + /* visit every pool in the arena */ + assert(base <= (uintptr_t) arenas[i].pool_address); + for (; base < (uintptr_t) arenas[i].pool_address; base += POOL_SIZE) { + poolp p = (poolp)base; + n += p->ref.count; + } + } + return n; } @@ -1407,96 +1426,48 @@ address_in_range(void *p, poolp pool) /*==========================================================================*/ -/* pymalloc allocator - - The basic blocks are ordered by decreasing execution frequency, - which minimizes the number of jumps in the most common cases, - improves branching prediction and instruction scheduling (small - block allocations typically result in a couple of instructions). - Unless the optimizer reorders everything, being too smart... - - Return a pointer to newly allocated memory if pymalloc allocated memory. - - Return NULL if pymalloc failed to allocate the memory block: on bigger - requests, on error in the code below (as a last chance to serve the request) - or when the max memory limit has been reached. */ -static void* -pymalloc_alloc(void *ctx, size_t nbytes) +// Called when freelist is exhausted. Extend the freelist if there is +// space for a block. Otherwise, remove this pool from usedpools. +static void +pymalloc_pool_extend(poolp pool, uint size) { - block *bp; - poolp pool; - poolp next; - uint size; - -#ifdef WITH_VALGRIND - if (UNLIKELY(running_on_valgrind == -1)) { - running_on_valgrind = RUNNING_ON_VALGRIND; - } - if (UNLIKELY(running_on_valgrind)) { - return NULL; - } -#endif - - if (nbytes == 0) { - return NULL; - } - if (nbytes > SMALL_REQUEST_THRESHOLD) { - return NULL; + if (UNLIKELY(pool->nextoffset <= pool->maxnextoffset)) { + /* There is room for another block. */ + pool->freeblock = (block*)pool + pool->nextoffset; + pool->nextoffset += INDEX2SIZE(size); + *(block **)(pool->freeblock) = NULL; + return; } - /* - * Most frequent paths first - */ - size = (uint)(nbytes - 1) >> ALIGNMENT_SHIFT; - pool = usedpools[size + size]; - if (pool != pool->nextpool) { - /* - * There is a used pool for this size class. - * Pick up the head block of its free list. - */ - ++pool->ref.count; - bp = pool->freeblock; - assert(bp != NULL); - if ((pool->freeblock = *(block **)bp) != NULL) { - goto success; - } - - /* - * Reached the end of the free list, try to extend it. - */ - if (pool->nextoffset <= pool->maxnextoffset) { - /* There is room for another block. */ - pool->freeblock = (block*)pool + - pool->nextoffset; - pool->nextoffset += INDEX2SIZE(size); - *(block **)(pool->freeblock) = NULL; - goto success; - } - - /* Pool is full, unlink from used pools. */ - next = pool->nextpool; - pool = pool->prevpool; - next->prevpool = pool; - pool->nextpool = next; - goto success; - } + /* Pool is full, unlink from used pools. */ + poolp next; + next = pool->nextpool; + pool = pool->prevpool; + next->prevpool = pool; + pool->nextpool = next; +} +/* called when pymalloc_alloc can not allocate a block from usedpool. + * This function takes new pool and allocate a block from it. + */ +static void* +allocate_from_new_pool(uint size) +{ /* There isn't a pool of the right size class immediately * available: use a free pool. */ - if (usable_arenas == NULL) { + if (UNLIKELY(usable_arenas == NULL)) { /* No arena has a free pool: allocate a new arena. */ #ifdef WITH_MEMORY_LIMITS if (narenas_currently_allocated >= MAX_ARENAS) { - goto failed; + return NULL; } #endif usable_arenas = new_arena(); if (usable_arenas == NULL) { - goto failed; + return NULL; } - usable_arenas->nextarena = - usable_arenas->prevarena = NULL; + usable_arenas->nextarena = usable_arenas->prevarena = NULL; assert(nfp2lasta[usable_arenas->nfreepools] == NULL); nfp2lasta[usable_arenas->nfreepools] = usable_arenas; } @@ -1519,12 +1490,12 @@ pymalloc_alloc(void *ctx, size_t nbytes) } /* Try to get a cached free pool. */ - pool = usable_arenas->freepools; - if (pool != NULL) { + poolp pool = usable_arenas->freepools; + if (LIKELY(pool != NULL)) { /* Unlink from cached pools. */ usable_arenas->freepools = pool->nextpool; - --usable_arenas->nfreepools; - if (usable_arenas->nfreepools == 0) { + usable_arenas->nfreepools--; + if (UNLIKELY(usable_arenas->nfreepools == 0)) { /* Wholly allocated: remove. */ assert(usable_arenas->freepools == NULL); assert(usable_arenas->nextarena == NULL || @@ -1547,72 +1518,119 @@ pymalloc_alloc(void *ctx, size_t nbytes) (block*)usable_arenas->address + ARENA_SIZE - POOL_SIZE); } + } + else { + /* Carve off a new pool. */ + assert(usable_arenas->nfreepools > 0); + assert(usable_arenas->freepools == NULL); + pool = (poolp)usable_arenas->pool_address; + assert((block*)pool <= (block*)usable_arenas->address + + ARENA_SIZE - POOL_SIZE); + pool->arenaindex = (uint)(usable_arenas - arenas); + assert(&arenas[pool->arenaindex] == usable_arenas); + pool->szidx = DUMMY_SIZE_IDX; + usable_arenas->pool_address += POOL_SIZE; + --usable_arenas->nfreepools; - init_pool: - /* Frontlink to used pools. */ - next = usedpools[size + size]; /* == prev */ - pool->nextpool = next; - pool->prevpool = next; - next->nextpool = pool; - next->prevpool = pool; - pool->ref.count = 1; - if (pool->szidx == size) { - /* Luckily, this pool last contained blocks - * of the same size class, so its header - * and free list are already initialized. - */ - bp = pool->freeblock; - assert(bp != NULL); - pool->freeblock = *(block **)bp; - goto success; + if (usable_arenas->nfreepools == 0) { + assert(usable_arenas->nextarena == NULL || + usable_arenas->nextarena->prevarena == + usable_arenas); + /* Unlink the arena: it is completely allocated. */ + usable_arenas = usable_arenas->nextarena; + if (usable_arenas != NULL) { + usable_arenas->prevarena = NULL; + assert(usable_arenas->address != 0); + } } - /* - * Initialize the pool header, set up the free list to - * contain just the second block, and return the first - * block. + } + + /* Frontlink to used pools. */ + block *bp; + poolp next = usedpools[size + size]; /* == prev */ + pool->nextpool = next; + pool->prevpool = next; + next->nextpool = pool; + next->prevpool = pool; + pool->ref.count = 1; + if (pool->szidx == size) { + /* Luckily, this pool last contained blocks + * of the same size class, so its header + * and free list are already initialized. */ - pool->szidx = size; - size = INDEX2SIZE(size); - bp = (block *)pool + POOL_OVERHEAD; - pool->nextoffset = POOL_OVERHEAD + (size << 1); - pool->maxnextoffset = POOL_SIZE - size; - pool->freeblock = bp + size; - *(block **)(pool->freeblock) = NULL; - goto success; + bp = pool->freeblock; + assert(bp != NULL); + pool->freeblock = *(block **)bp; + return bp; } + /* + * Initialize the pool header, set up the free list to + * contain just the second block, and return the first + * block. + */ + pool->szidx = size; + size = INDEX2SIZE(size); + bp = (block *)pool + POOL_OVERHEAD; + pool->nextoffset = POOL_OVERHEAD + (size << 1); + pool->maxnextoffset = POOL_SIZE - size; + pool->freeblock = bp + size; + *(block **)(pool->freeblock) = NULL; + return bp; +} - /* Carve off a new pool. */ - assert(usable_arenas->nfreepools > 0); - assert(usable_arenas->freepools == NULL); - pool = (poolp)usable_arenas->pool_address; - assert((block*)pool <= (block*)usable_arenas->address + - ARENA_SIZE - POOL_SIZE); - pool->arenaindex = (uint)(usable_arenas - arenas); - assert(&arenas[pool->arenaindex] == usable_arenas); - pool->szidx = DUMMY_SIZE_IDX; - usable_arenas->pool_address += POOL_SIZE; - --usable_arenas->nfreepools; - - if (usable_arenas->nfreepools == 0) { - assert(usable_arenas->nextarena == NULL || - usable_arenas->nextarena->prevarena == - usable_arenas); - /* Unlink the arena: it is completely allocated. */ - usable_arenas = usable_arenas->nextarena; - if (usable_arenas != NULL) { - usable_arenas->prevarena = NULL; - assert(usable_arenas->address != 0); - } +/* pymalloc allocator + + Return a pointer to newly allocated memory if pymalloc allocated memory. + + Return NULL if pymalloc failed to allocate the memory block: on bigger + requests, on error in the code below (as a last chance to serve the request) + or when the max memory limit has been reached. +*/ +static inline void* +pymalloc_alloc(void *ctx, size_t nbytes) +{ +#ifdef WITH_VALGRIND + if (UNLIKELY(running_on_valgrind == -1)) { + running_on_valgrind = RUNNING_ON_VALGRIND; + } + if (UNLIKELY(running_on_valgrind)) { + return NULL; } +#endif - goto init_pool; + if (UNLIKELY(nbytes == 0)) { + return NULL; + } + if (UNLIKELY(nbytes > SMALL_REQUEST_THRESHOLD)) { + return NULL; + } -success: - assert(bp != NULL); - return (void *)bp; + uint size = (uint)(nbytes - 1) >> ALIGNMENT_SHIFT; + poolp pool = usedpools[size + size]; + block *bp; -failed: - return NULL; + if (LIKELY(pool != pool->nextpool)) { + /* + * There is a used pool for this size class. + * Pick up the head block of its free list. + */ + ++pool->ref.count; + bp = pool->freeblock; + assert(bp != NULL); + + if (UNLIKELY((pool->freeblock = *(block **)bp) == NULL)) { + // Reached the end of the free list, try to extend it. + pymalloc_pool_extend(pool, size); + } + } + else { + /* There isn't a pool of the right size class immediately + * available: use a free pool. + */ + bp = allocate_from_new_pool(size); + } + + return (void *)bp; } @@ -1620,14 +1638,13 @@ static void * _PyObject_Malloc(void *ctx, size_t nbytes) { void* ptr = pymalloc_alloc(ctx, nbytes); - if (ptr != NULL) { - _Py_AllocatedBlocks++; + if (LIKELY(ptr != NULL)) { return ptr; } ptr = PyMem_RawMalloc(nbytes); if (ptr != NULL) { - _Py_AllocatedBlocks++; + raw_allocated_blocks++; } return ptr; } @@ -1639,103 +1656,51 @@ _PyObject_Calloc(void *ctx, size_t nelem, size_t elsize) assert(elsize == 0 || nelem <= (size_t)PY_SSIZE_T_MAX / elsize); size_t nbytes = nelem * elsize; - void *ptr = pymalloc_alloc(ctx, nbytes); - if (ptr != NULL) { + void* ptr = pymalloc_alloc(ctx, nbytes); + if (LIKELY(ptr != NULL)) { memset(ptr, 0, nbytes); - _Py_AllocatedBlocks++; return ptr; } ptr = PyMem_RawCalloc(nelem, elsize); if (ptr != NULL) { - _Py_AllocatedBlocks++; + raw_allocated_blocks++; } return ptr; } -/* Free a memory block allocated by pymalloc_alloc(). - Return 1 if it was freed. - Return 0 if the block was not allocated by pymalloc_alloc(). */ -static int -pymalloc_free(void *ctx, void *p) +static void +insert_to_usedpool(poolp pool) { - poolp pool; - block *lastfree; - poolp next, prev; - uint size; - - assert(p != NULL); - -#ifdef WITH_VALGRIND - if (UNLIKELY(running_on_valgrind > 0)) { - return 0; - } -#endif + assert(pool->ref.count > 0); /* else the pool is empty */ - pool = POOL_ADDR(p); - if (!address_in_range(p, pool)) { - return 0; - } - /* We allocated this address. */ + uint size = pool->szidx; + poolp next = usedpools[size + size]; + poolp prev = next->prevpool; - /* Link p to the start of the pool's freeblock list. Since - * the pool had at least the p block outstanding, the pool - * wasn't empty (so it's already in a usedpools[] list, or - * was full and is in no list -- it's not in the freeblocks - * list in any case). - */ - assert(pool->ref.count > 0); /* else it was empty */ - *(block **)p = lastfree = pool->freeblock; - pool->freeblock = (block *)p; - if (!lastfree) { - /* Pool was full, so doesn't currently live in any list: - * link it to the front of the appropriate usedpools[] list. - * This mimics LRU pool usage for new allocations and - * targets optimal filling when several pools contain - * blocks of the same size class. - */ - --pool->ref.count; - assert(pool->ref.count > 0); /* else the pool is empty */ - size = pool->szidx; - next = usedpools[size + size]; - prev = next->prevpool; - - /* insert pool before next: prev <-> pool <-> next */ - pool->nextpool = next; - pool->prevpool = prev; - next->prevpool = pool; - prev->nextpool = pool; - goto success; - } - - struct arena_object* ao; - uint nf; /* ao->nfreepools */ + /* insert pool before next: prev <-> pool <-> next */ + pool->nextpool = next; + pool->prevpool = prev; + next->prevpool = pool; + prev->nextpool = pool; +} - /* freeblock wasn't NULL, so the pool wasn't full, - * and the pool is in a usedpools[] list. - */ - if (--pool->ref.count != 0) { - /* pool isn't empty: leave it in usedpools */ - goto success; - } - /* Pool is now empty: unlink from usedpools, and - * link to the front of freepools. This ensures that - * previously freed pools will be allocated later - * (being not referenced, they are perhaps paged out). - */ - next = pool->nextpool; - prev = pool->prevpool; +static void +insert_to_freepool(poolp pool) +{ + poolp next = pool->nextpool; + poolp prev = pool->prevpool; next->prevpool = prev; prev->nextpool = next; /* Link the pool to freepools. This is a singly-linked * list, and pool->prevpool isn't used there. */ - ao = &arenas[pool->arenaindex]; + struct arena_object *ao = &arenas[pool->arenaindex]; pool->nextpool = ao->freepools; ao->freepools = pool; - nf = ao->nfreepools; + uint nf = ao->nfreepools; /* If this is the rightmost arena with this number of free pools, * nfp2lasta[nf] needs to change. Caution: if nf is 0, there * are no arenas in usable_arenas with that value. @@ -1756,7 +1721,12 @@ pymalloc_free(void *ctx, void *p) /* All the rest is arena management. We just freed * a pool, and there are 4 cases for arena mgmt: * 1. If all the pools are free, return the arena to - * the system free(). + * the system free(). Except if this is the last + * arena in the list, keep it to avoid thrashing: + * keeping one wholly free arena in the list avoids + * pathological cases where a simple loop would + * otherwise provoke needing to allocate and free an + * arena on every iteration. See bpo-37257. * 2. If this is the only free pool in the arena, * add the arena back to the `usable_arenas` list. * 3. If the "next" arena has a smaller count of free @@ -1765,7 +1735,7 @@ pymalloc_free(void *ctx, void *p) * nfreepools. * 4. Else there's nothing more to do. */ - if (nf == ao->ntotalpools) { + if (nf == ao->ntotalpools && ao->nextarena != NULL) { /* Case 1. First unlink ao from usable_arenas. */ assert(ao->prevarena == NULL || @@ -1804,7 +1774,7 @@ pymalloc_free(void *ctx, void *p) ao->address = 0; /* mark unassociated */ --narenas_currently_allocated; - goto success; + return; } if (nf == 1) { @@ -1823,7 +1793,7 @@ pymalloc_free(void *ctx, void *p) nfp2lasta[1] = ao; } - goto success; + return; } /* If this arena is now out of order, we need to keep @@ -1840,7 +1810,7 @@ pymalloc_free(void *ctx, void *p) /* If this was the rightmost of the old size, it remains in place. */ if (ao == lastnf) { /* Case 4. Nothing to do. */ - goto success; + return; } /* If ao were the only arena in the list, the last block would have * gotten us out. @@ -1876,10 +1846,65 @@ pymalloc_free(void *ctx, void *p) assert(ao->nextarena == NULL || ao->nextarena->prevarena == ao); assert((usable_arenas == ao && ao->prevarena == NULL) || ao->prevarena->nextarena == ao); +} + +/* Free a memory block allocated by pymalloc_alloc(). + Return 1 if it was freed. + Return 0 if the block was not allocated by pymalloc_alloc(). */ +static inline int +pymalloc_free(void *ctx, void *p) +{ + assert(p != NULL); + +#ifdef WITH_VALGRIND + if (UNLIKELY(running_on_valgrind > 0)) { + return 0; + } +#endif + + poolp pool = POOL_ADDR(p); + if (UNLIKELY(!address_in_range(p, pool))) { + return 0; + } + /* We allocated this address. */ + + /* Link p to the start of the pool's freeblock list. Since + * the pool had at least the p block outstanding, the pool + * wasn't empty (so it's already in a usedpools[] list, or + * was full and is in no list -- it's not in the freeblocks + * list in any case). + */ + assert(pool->ref.count > 0); /* else it was empty */ + block *lastfree = pool->freeblock; + *(block **)p = lastfree; + pool->freeblock = (block *)p; + pool->ref.count--; - goto success; + if (UNLIKELY(lastfree == NULL)) { + /* Pool was full, so doesn't currently live in any list: + * link it to the front of the appropriate usedpools[] list. + * This mimics LRU pool usage for new allocations and + * targets optimal filling when several pools contain + * blocks of the same size class. + */ + insert_to_usedpool(pool); + return 1; + } -success: + /* freeblock wasn't NULL, so the pool wasn't full, + * and the pool is in a usedpools[] list. + */ + if (LIKELY(pool->ref.count != 0)) { + /* pool isn't empty: leave it in usedpools */ + return 1; + } + + /* Pool is now empty: unlink from usedpools, and + * link to the front of freepools. This ensures that + * previously freed pools will be allocated later + * (being not referenced, they are perhaps paged out). + */ + insert_to_freepool(pool); return 1; } @@ -1892,10 +1917,10 @@ _PyObject_Free(void *ctx, void *p) return; } - _Py_AllocatedBlocks--; - if (!pymalloc_free(ctx, p)) { + if (UNLIKELY(!pymalloc_free(ctx, p))) { /* pymalloc didn't allocate this address */ PyMem_RawFree(p); + raw_allocated_blocks--; } } @@ -2180,7 +2205,7 @@ _PyMem_DebugRawFree(void *ctx, void *p) uint8_t *q = (uint8_t *)p - 2*SST; /* address returned from malloc */ size_t nbytes; - _PyMem_DebugCheckAddress(api->api_id, p); + _PyMem_DebugCheckAddress(__func__, api->api_id, p); nbytes = read_size_t(q); nbytes += PYMEM_DEBUG_EXTRA_BYTES; memset(q, PYMEM_DEADBYTE, nbytes); @@ -2205,7 +2230,7 @@ _PyMem_DebugRawRealloc(void *ctx, void *p, size_t nbytes) #define ERASED_SIZE 64 uint8_t save[2*ERASED_SIZE]; /* A copy of erased bytes. */ - _PyMem_DebugCheckAddress(api->api_id, p); + _PyMem_DebugCheckAddress(__func__, api->api_id, p); data = (uint8_t *)p; head = data - 2*SST; @@ -2288,25 +2313,27 @@ _PyMem_DebugRawRealloc(void *ctx, void *p, size_t nbytes) return data; } -static void -_PyMem_DebugCheckGIL(void) +static inline void +_PyMem_DebugCheckGIL(const char *func) { - if (!PyGILState_Check()) - Py_FatalError("Python memory allocator called " - "without holding the GIL"); + if (!PyGILState_Check()) { + _Py_FatalErrorFunc(func, + "Python memory allocator called " + "without holding the GIL"); + } } static void * _PyMem_DebugMalloc(void *ctx, size_t nbytes) { - _PyMem_DebugCheckGIL(); + _PyMem_DebugCheckGIL(__func__); return _PyMem_DebugRawMalloc(ctx, nbytes); } static void * _PyMem_DebugCalloc(void *ctx, size_t nelem, size_t elsize) { - _PyMem_DebugCheckGIL(); + _PyMem_DebugCheckGIL(__func__); return _PyMem_DebugRawCalloc(ctx, nelem, elsize); } @@ -2314,7 +2341,7 @@ _PyMem_DebugCalloc(void *ctx, size_t nelem, size_t elsize) static void _PyMem_DebugFree(void *ctx, void *ptr) { - _PyMem_DebugCheckGIL(); + _PyMem_DebugCheckGIL(__func__); _PyMem_DebugRawFree(ctx, ptr); } @@ -2322,7 +2349,7 @@ _PyMem_DebugFree(void *ctx, void *ptr) static void * _PyMem_DebugRealloc(void *ctx, void *ptr, size_t nbytes) { - _PyMem_DebugCheckGIL(); + _PyMem_DebugCheckGIL(__func__); return _PyMem_DebugRawRealloc(ctx, ptr, nbytes); } @@ -2332,28 +2359,24 @@ _PyMem_DebugRealloc(void *ctx, void *ptr, size_t nbytes) * The API id, is also checked. */ static void -_PyMem_DebugCheckAddress(char api, const void *p) +_PyMem_DebugCheckAddress(const char *func, char api, const void *p) { + assert(p != NULL); + const uint8_t *q = (const uint8_t *)p; - char msgbuf[64]; - const char *msg; size_t nbytes; const uint8_t *tail; int i; char id; - if (p == NULL) { - msg = "didn't expect a NULL pointer"; - goto error; - } - /* Check the API id */ id = (char)q[-SST]; if (id != api) { - msg = msgbuf; - snprintf(msgbuf, sizeof(msgbuf), "bad ID: Allocated using API '%c', verified using API '%c'", id, api); - msgbuf[sizeof(msgbuf)-1] = 0; - goto error; + _PyObject_DebugDumpAddress(p); + _Py_FatalErrorFormat(func, + "bad ID: Allocated using API '%c', " + "verified using API '%c'", + id, api); } /* Check the stuff at the start of p first: if there's underwrite @@ -2362,8 +2385,8 @@ _PyMem_DebugCheckAddress(char api, const void *p) */ for (i = SST-1; i >= 1; --i) { if (*(q-i) != PYMEM_FORBIDDENBYTE) { - msg = "bad leading pad byte"; - goto error; + _PyObject_DebugDumpAddress(p); + _Py_FatalErrorFunc(func, "bad leading pad byte"); } } @@ -2371,16 +2394,10 @@ _PyMem_DebugCheckAddress(char api, const void *p) tail = q + nbytes; for (i = 0; i < SST; ++i) { if (tail[i] != PYMEM_FORBIDDENBYTE) { - msg = "bad trailing pad byte"; - goto error; + _PyObject_DebugDumpAddress(p); + _Py_FatalErrorFunc(func, "bad trailing pad byte"); } } - - return; - -error: - _PyObject_DebugDumpAddress(p); - Py_FatalError(msg); } /* Display info to stderr about the memory block at p. */ diff --git a/Objects/odictobject.c b/Objects/odictobject.c index ac0da9bd5bae3049a8bba3615c701986d81507d8..b9f2169a72a8ac2f04a77adc677bd7db7c9f3b3f 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -466,8 +466,7 @@ Potential Optimizations #include "Python.h" #include "pycore_object.h" -#include "pycore_pystate.h" -#include "structmember.h" +#include // offsetof() #include "dict-common.h" #include @@ -526,6 +525,8 @@ struct _odictnode { #define _odict_FOREACH(od, node) \ for (node = _odict_FIRST(od); node != NULL; node = _odictnode_NEXT(node)) +_Py_IDENTIFIER(items); + /* Return the index into the hash table, regardless of a valid node. */ static Py_ssize_t _odict_get_index_raw(PyODictObject *od, PyObject *key, Py_hash_t hash) @@ -849,6 +850,57 @@ static PyMappingMethods odict_as_mapping = { }; +/* ---------------------------------------------- + * OrderedDict number methods + */ + +static int mutablemapping_update_arg(PyObject*, PyObject*); + +static PyObject * +odict_or(PyObject *left, PyObject *right) +{ + PyTypeObject *type; + PyObject *other; + if (PyODict_Check(left)) { + type = Py_TYPE(left); + other = right; + } + else { + type = Py_TYPE(right); + other = left; + } + if (!PyDict_Check(other)) { + Py_RETURN_NOTIMPLEMENTED; + } + PyObject *new = PyObject_CallOneArg((PyObject*)type, left); + if (!new) { + return NULL; + } + if (mutablemapping_update_arg(new, right) < 0) { + Py_DECREF(new); + return NULL; + } + return new; +} + +static PyObject * +odict_inplace_or(PyObject *self, PyObject *other) +{ + if (mutablemapping_update_arg(self, other) < 0) { + return NULL; + } + Py_INCREF(self); + return self; +} + +/* tp_as_number */ + +static PyNumberMethods odict_as_number = { + .nb_or = odict_or, + .nb_inplace_or = odict_inplace_or, +}; + + /* ---------------------------------------------- * OrderedDict methods */ @@ -896,7 +948,6 @@ static PyObject * odict_reduce(register PyODictObject *od, PyObject *Py_UNUSED(ignored)) { _Py_IDENTIFIER(__dict__); - _Py_IDENTIFIER(items); PyObject *dict = NULL, *result = NULL; PyObject *items_iter, *items, *args = NULL; @@ -920,7 +971,7 @@ odict_reduce(register PyODictObject *od, PyObject *Py_UNUSED(ignored)) if (args == NULL) goto Done; - items = _PyObject_CallMethodIdObjArgs((PyObject *)od, &PyId_items, NULL); + items = _PyObject_CallMethodIdNoArgs((PyObject *)od, &PyId_items); if (items == NULL) goto Done; @@ -1375,7 +1426,6 @@ static PyObject * odict_repr(PyODictObject *self) { int i; - _Py_IDENTIFIER(items); PyObject *pieces = NULL, *result = NULL; if (PyODict_SIZE(self) == 0) @@ -1417,12 +1467,13 @@ odict_repr(PyODictObject *self) } count++; } - if (count < PyList_GET_SIZE(pieces)) - Py_SIZE(pieces) = count; + if (count < PyList_GET_SIZE(pieces)) { + Py_SET_SIZE(pieces, count); + } } else { - PyObject *items = _PyObject_CallMethodIdObjArgs((PyObject *)self, - &PyId_items, NULL); + PyObject *items = _PyObject_CallMethodIdNoArgs((PyObject *)self, + &PyId_items); if (items == NULL) goto Done; pieces = PySequence_List(items); @@ -1554,7 +1605,7 @@ PyTypeObject PyODict_Type = { 0, /* tp_setattr */ 0, /* tp_as_async */ (reprfunc)odict_repr, /* tp_repr */ - 0, /* tp_as_number */ + &odict_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ &odict_as_mapping, /* tp_as_mapping */ 0, /* tp_hash */ @@ -1766,6 +1817,11 @@ odictiter_iternext(odictiterobject *di) Py_INCREF(result); Py_DECREF(PyTuple_GET_ITEM(result, 0)); /* borrowed */ Py_DECREF(PyTuple_GET_ITEM(result, 1)); /* borrowed */ + // bpo-42536: The GC may have untracked this result tuple. Since we're + // recycling it, make sure it's tracked again: + if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } } else { result = PyTuple_New(2); @@ -2188,17 +2244,77 @@ mutablemapping_add_pairs(PyObject *self, PyObject *pairs) return 0; } -static PyObject * -mutablemapping_update(PyObject *self, PyObject *args, PyObject *kwargs) +static int +mutablemapping_update_arg(PyObject *self, PyObject *arg) { int res = 0; - Py_ssize_t len; - _Py_IDENTIFIER(items); + if (PyDict_CheckExact(arg)) { + PyObject *items = PyDict_Items(arg); + if (items == NULL) { + return -1; + } + res = mutablemapping_add_pairs(self, items); + Py_DECREF(items); + return res; + } _Py_IDENTIFIER(keys); + PyObject *func; + if (_PyObject_LookupAttrId(arg, &PyId_keys, &func) < 0) { + return -1; + } + if (func != NULL) { + PyObject *keys = _PyObject_CallNoArg(func); + Py_DECREF(func); + if (keys == NULL) { + return -1; + } + PyObject *iterator = PyObject_GetIter(keys); + Py_DECREF(keys); + if (iterator == NULL) { + return -1; + } + PyObject *key; + while (res == 0 && (key = PyIter_Next(iterator))) { + PyObject *value = PyObject_GetItem(arg, key); + if (value != NULL) { + res = PyObject_SetItem(self, key, value); + Py_DECREF(value); + } + else { + res = -1; + } + Py_DECREF(key); + } + Py_DECREF(iterator); + if (res != 0 || PyErr_Occurred()) { + return -1; + } + return 0; + } + if (_PyObject_LookupAttrId(arg, &PyId_items, &func) < 0) { + return -1; + } + if (func != NULL) { + PyObject *items = _PyObject_CallNoArg(func); + Py_DECREF(func); + if (items == NULL) { + return -1; + } + res = mutablemapping_add_pairs(self, items); + Py_DECREF(items); + return res; + } + res = mutablemapping_add_pairs(self, arg); + return res; +} +static PyObject * +mutablemapping_update(PyObject *self, PyObject *args, PyObject *kwargs) +{ + int res; /* first handle args, if any */ assert(args == NULL || PyTuple_Check(args)); - len = (args != NULL) ? PyTuple_GET_SIZE(args) : 0; + Py_ssize_t len = (args != NULL) ? PyTuple_GET_SIZE(args) : 0; if (len > 1) { const char *msg = "update() takes at most 1 positional argument (%zd given)"; PyErr_Format(PyExc_TypeError, msg, len); @@ -2206,83 +2322,16 @@ mutablemapping_update(PyObject *self, PyObject *args, PyObject *kwargs) } if (len) { - PyObject *func; PyObject *other = PyTuple_GET_ITEM(args, 0); /* borrowed reference */ assert(other != NULL); Py_INCREF(other); - if (PyDict_CheckExact(other)) { - PyObject *items = PyDict_Items(other); - Py_DECREF(other); - if (items == NULL) - return NULL; - res = mutablemapping_add_pairs(self, items); - Py_DECREF(items); - if (res == -1) - return NULL; - goto handle_kwargs; - } - - if (_PyObject_LookupAttrId(other, &PyId_keys, &func) < 0) { - Py_DECREF(other); - return NULL; - } - if (func != NULL) { - PyObject *keys, *iterator, *key; - keys = _PyObject_CallNoArg(func); - Py_DECREF(func); - if (keys == NULL) { - Py_DECREF(other); - return NULL; - } - iterator = PyObject_GetIter(keys); - Py_DECREF(keys); - if (iterator == NULL) { - Py_DECREF(other); - return NULL; - } - while (res == 0 && (key = PyIter_Next(iterator))) { - PyObject *value = PyObject_GetItem(other, key); - if (value != NULL) { - res = PyObject_SetItem(self, key, value); - Py_DECREF(value); - } - else { - res = -1; - } - Py_DECREF(key); - } - Py_DECREF(other); - Py_DECREF(iterator); - if (res != 0 || PyErr_Occurred()) - return NULL; - goto handle_kwargs; - } - - if (_PyObject_LookupAttrId(other, &PyId_items, &func) < 0) { - Py_DECREF(other); - return NULL; - } - if (func != NULL) { - PyObject *items; - Py_DECREF(other); - items = _PyObject_CallNoArg(func); - Py_DECREF(func); - if (items == NULL) - return NULL; - res = mutablemapping_add_pairs(self, items); - Py_DECREF(items); - if (res == -1) - return NULL; - goto handle_kwargs; - } - - res = mutablemapping_add_pairs(self, other); + res = mutablemapping_update_arg(self, other); Py_DECREF(other); - if (res != 0) + if (res < 0) { return NULL; + } } - handle_kwargs: /* now handle kwargs */ assert(kwargs == NULL || PyDict_Check(kwargs)); if (kwargs != NULL && PyDict_GET_SIZE(kwargs)) { diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index 239ace6f4235ede252a51664f2d2eb89197ba3ad..751dbb9815d822b195614ba6011d861b324046fa 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -1,7 +1,9 @@ /* Range object implementation */ #include "Python.h" -#include "structmember.h" +#include "pycore_abstract.h" // _PyIndex_Check() +#include "pycore_tupleobject.h" +#include "structmember.h" // PyMemberDef /* Support objects whose length is > PY_SSIZE_T_MAX. @@ -18,6 +20,8 @@ typedef struct { PyObject *length; } rangeobject; +_Py_IDENTIFIER(iter); + /* Helper function for validating step. Always returns a new reference or NULL on error. */ @@ -69,50 +73,57 @@ make_range_object(PyTypeObject *type, PyObject *start, range(0, 5, -1) */ static PyObject * -range_new(PyTypeObject *type, PyObject *args, PyObject *kw) +range_from_array(PyTypeObject *type, PyObject *const *args, Py_ssize_t num_args) { rangeobject *obj; PyObject *start = NULL, *stop = NULL, *step = NULL; - if (!_PyArg_NoKeywords("range", kw)) - return NULL; - - if (PyTuple_Size(args) <= 1) { - if (!PyArg_UnpackTuple(args, "range", 1, 1, &stop)) - return NULL; - stop = PyNumber_Index(stop); - if (!stop) - return NULL; - Py_INCREF(_PyLong_Zero); - start = _PyLong_Zero; - Py_INCREF(_PyLong_One); - step = _PyLong_One; - } - else { - if (!PyArg_UnpackTuple(args, "range", 2, 3, - &start, &stop, &step)) - return NULL; - - /* Convert borrowed refs to owned refs */ - start = PyNumber_Index(start); - if (!start) - return NULL; - stop = PyNumber_Index(stop); - if (!stop) { - Py_DECREF(start); + switch (num_args) { + case 3: + step = args[2]; + /* fallthrough */ + case 2: + /* Convert borrowed refs to owned refs */ + start = PyNumber_Index(args[0]); + if (!start) { + return NULL; + } + stop = PyNumber_Index(args[1]); + if (!stop) { + Py_DECREF(start); + return NULL; + } + step = validate_step(step); /* Caution, this can clear exceptions */ + if (!step) { + Py_DECREF(start); + Py_DECREF(stop); + return NULL; + } + break; + case 1: + stop = PyNumber_Index(args[0]); + if (!stop) { + return NULL; + } + Py_INCREF(_PyLong_Zero); + start = _PyLong_Zero; + Py_INCREF(_PyLong_One); + step = _PyLong_One; + break; + case 0: + PyErr_SetString(PyExc_TypeError, + "range expected at least 1 argument, got 0"); return NULL; - } - step = validate_step(step); /* Caution, this can clear exceptions */ - if (!step) { - Py_DECREF(start); - Py_DECREF(stop); + default: + PyErr_Format(PyExc_TypeError, + "range expected at most 3 arguments, got %zd", + num_args); return NULL; - } } - obj = make_range_object(type, start, stop, step); - if (obj != NULL) + if (obj != NULL) { return (PyObject *) obj; + } /* Failed to create object, release attributes */ Py_DECREF(start); @@ -121,6 +132,27 @@ range_new(PyTypeObject *type, PyObject *args, PyObject *kw) return NULL; } +static PyObject * +range_new(PyTypeObject *type, PyObject *args, PyObject *kw) +{ + if (!_PyArg_NoKeywords("range", kw)) + return NULL; + + return range_from_array(type, _PyTuple_ITEMS(args), PyTuple_GET_SIZE(args)); +} + + +static PyObject * +range_vectorcall(PyTypeObject *type, PyObject *const *args, + size_t nargsf, PyObject *kwnames) +{ + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + if (!_PyArg_NoKwnames("range", kwnames)) { + return NULL; + } + return range_from_array(type, args, nargs); +} + PyDoc_STRVAR(range_doc, "range(stop) -> range object\n\ range(start, stop[, step]) -> range object\n\ @@ -600,7 +632,7 @@ range_reduce(rangeobject *r, PyObject *args) static PyObject * range_subscript(rangeobject* self, PyObject* item) { - if (PyIndex_Check(item)) { + if (_PyIndex_Check(item)) { PyObject *i, *result; i = PyNumber_Index(item); if (!i) @@ -614,7 +646,7 @@ range_subscript(rangeobject* self, PyObject* item) } PyErr_Format(PyExc_TypeError, "range indices must be integers or slices, not %.200s", - item->ob_type->tp_name); + Py_TYPE(item)->tp_name); return NULL; } @@ -702,6 +734,7 @@ PyTypeObject PyRange_Type = { 0, /* tp_init */ 0, /* tp_alloc */ range_new, /* tp_new */ + .tp_vectorcall = (vectorcallfunc)range_vectorcall }; /*********************** range Iterator **************************/ @@ -742,7 +775,6 @@ PyDoc_STRVAR(length_hint_doc, static PyObject * rangeiter_reduce(rangeiterobject *r, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(iter); PyObject *start=NULL, *stop=NULL, *step=NULL; PyObject *range; @@ -900,7 +932,6 @@ longrangeiter_len(longrangeiterobject *r, PyObject *no_args) static PyObject * longrangeiter_reduce(longrangeiterobject *r, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(iter); PyObject *product, *stop=NULL; PyObject *range; diff --git a/Objects/setobject.c b/Objects/setobject.c index f8ae0c05e273cbd2affb0dd9c6086ecb0085c62f..76b1944db455886d68ce7ab56fb6d5b1ba0b23ad 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -32,9 +32,8 @@ */ #include "Python.h" -#include "pycore_object.h" -#include "pycore_pystate.h" -#include "structmember.h" +#include "pycore_object.h" // _PyObject_GC_UNTRACK() +#include // offsetof() /* Object used as dummy key to fill deleted entries */ static PyObject _dummy_struct; @@ -58,77 +57,43 @@ set_lookkey(PySetObject *so, PyObject *key, Py_hash_t hash) { setentry *table; setentry *entry; - size_t perturb; + size_t perturb = hash; size_t mask = so->mask; size_t i = (size_t)hash & mask; /* Unsigned for defined overflow behavior */ - size_t j; + int probes; int cmp; - entry = &so->table[i]; - if (entry->key == NULL) - return entry; - - perturb = hash; - while (1) { - if (entry->hash == hash) { - PyObject *startkey = entry->key; - /* startkey cannot be a dummy because the dummy hash field is -1 */ - assert(startkey != dummy); - if (startkey == key) - return entry; - if (PyUnicode_CheckExact(startkey) - && PyUnicode_CheckExact(key) - && _PyUnicode_EQ(startkey, key)) - return entry; - table = so->table; - Py_INCREF(startkey); - cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); - Py_DECREF(startkey); - if (cmp < 0) /* unlikely */ - return NULL; - if (table != so->table || entry->key != startkey) /* unlikely */ - return set_lookkey(so, key, hash); - if (cmp > 0) /* likely */ + entry = &so->table[i]; + probes = (i + LINEAR_PROBES <= mask) ? LINEAR_PROBES: 0; + do { + if (entry->hash == 0 && entry->key == NULL) return entry; - mask = so->mask; /* help avoid a register spill */ - } - - if (i + LINEAR_PROBES <= mask) { - for (j = 0 ; j < LINEAR_PROBES ; j++) { - entry++; - if (entry->hash == 0 && entry->key == NULL) + if (entry->hash == hash) { + PyObject *startkey = entry->key; + assert(startkey != dummy); + if (startkey == key) return entry; - if (entry->hash == hash) { - PyObject *startkey = entry->key; - assert(startkey != dummy); - if (startkey == key) - return entry; - if (PyUnicode_CheckExact(startkey) - && PyUnicode_CheckExact(key) - && _PyUnicode_EQ(startkey, key)) - return entry; - table = so->table; - Py_INCREF(startkey); - cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); - Py_DECREF(startkey); - if (cmp < 0) - return NULL; - if (table != so->table || entry->key != startkey) - return set_lookkey(so, key, hash); - if (cmp > 0) - return entry; - mask = so->mask; - } + if (PyUnicode_CheckExact(startkey) + && PyUnicode_CheckExact(key) + && _PyUnicode_EQ(startkey, key)) + return entry; + table = so->table; + Py_INCREF(startkey); + cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); + Py_DECREF(startkey); + if (cmp < 0) + return NULL; + if (table != so->table || entry->key != startkey) + return set_lookkey(so, key, hash); + if (cmp > 0) + return entry; + mask = so->mask; } - } - + entry++; + } while (probes--); perturb >>= PERTURB_SHIFT; i = (i * 5 + 1 + perturb) & mask; - - entry = &so->table[i]; - if (entry->key == NULL) - return entry; } } @@ -138,12 +103,11 @@ static int set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash) { setentry *table; - setentry *freeslot; setentry *entry; size_t perturb; size_t mask; size_t i; /* Unsigned for defined overflow behavior */ - size_t j; + int probes; int cmp; /* Pre-increment is necessary to prevent arbitrary code in the rich @@ -154,90 +118,41 @@ set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash) mask = so->mask; i = (size_t)hash & mask; - - entry = &so->table[i]; - if (entry->key == NULL) - goto found_unused; - - freeslot = NULL; perturb = hash; while (1) { - if (entry->hash == hash) { - PyObject *startkey = entry->key; - /* startkey cannot be a dummy because the dummy hash field is -1 */ - assert(startkey != dummy); - if (startkey == key) - goto found_active; - if (PyUnicode_CheckExact(startkey) - && PyUnicode_CheckExact(key) - && _PyUnicode_EQ(startkey, key)) - goto found_active; - table = so->table; - Py_INCREF(startkey); - cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); - Py_DECREF(startkey); - if (cmp > 0) /* likely */ - goto found_active; - if (cmp < 0) - goto comparison_error; - /* Continuing the search from the current entry only makes - sense if the table and entry are unchanged; otherwise, - we have to restart from the beginning */ - if (table != so->table || entry->key != startkey) - goto restart; - mask = so->mask; /* help avoid a register spill */ - } - else if (entry->hash == -1) - freeslot = entry; - - if (i + LINEAR_PROBES <= mask) { - for (j = 0 ; j < LINEAR_PROBES ; j++) { - entry++; - if (entry->hash == 0 && entry->key == NULL) - goto found_unused_or_dummy; - if (entry->hash == hash) { - PyObject *startkey = entry->key; - assert(startkey != dummy); - if (startkey == key) - goto found_active; - if (PyUnicode_CheckExact(startkey) - && PyUnicode_CheckExact(key) - && _PyUnicode_EQ(startkey, key)) - goto found_active; - table = so->table; - Py_INCREF(startkey); - cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); - Py_DECREF(startkey); - if (cmp > 0) - goto found_active; - if (cmp < 0) - goto comparison_error; - if (table != so->table || entry->key != startkey) - goto restart; - mask = so->mask; - } - else if (entry->hash == -1) - freeslot = entry; + entry = &so->table[i]; + probes = (i + LINEAR_PROBES <= mask) ? LINEAR_PROBES: 0; + do { + if (entry->hash == 0 && entry->key == NULL) + goto found_unused; + if (entry->hash == hash) { + PyObject *startkey = entry->key; + assert(startkey != dummy); + if (startkey == key) + goto found_active; + if (PyUnicode_CheckExact(startkey) + && PyUnicode_CheckExact(key) + && _PyUnicode_EQ(startkey, key)) + goto found_active; + table = so->table; + Py_INCREF(startkey); + cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); + Py_DECREF(startkey); + if (cmp > 0) + goto found_active; + if (cmp < 0) + goto comparison_error; + if (table != so->table || entry->key != startkey) + goto restart; + mask = so->mask; } - } - + entry++; + } while (probes--); perturb >>= PERTURB_SHIFT; i = (i * 5 + 1 + perturb) & mask; - - entry = &so->table[i]; - if (entry->key == NULL) - goto found_unused_or_dummy; } - found_unused_or_dummy: - if (freeslot == NULL) - goto found_unused; - so->used++; - freeslot->key = key; - freeslot->hash = hash; - return 0; - found_unused: so->fill++; so->used++; @@ -258,8 +173,7 @@ set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash) /* Internal routine used by set_table_resize() to insert an item which is -known to be absent from the set. This routine also assumes that -the set contains no deleted entries. Besides the performance benefit, +known to be absent from the set. Besides the performance benefit, there is also safety benefit since using set_add_entry() risks making a callback in the middle of a set_table_resize(), see issue 1456209. The caller is responsible for updating the key's reference count and @@ -608,7 +522,7 @@ set_repr(PySetObject *so) goto done; listrepr = tmp; - if (Py_TYPE(so) != &PySet_Type) + if (!Py_IS_TYPE(so, &PySet_Type)) result = PyUnicode_FromFormat("%s({%U})", Py_TYPE(so)->tp_name, listrepr); @@ -1024,6 +938,7 @@ PyDoc_STRVAR(update_doc, static PyObject * make_new_set(PyTypeObject *type, PyObject *iterable) { + assert(PyType_Check(type)); PySetObject *so; so = (PySetObject *)type->tp_alloc(type, 0); @@ -1064,37 +979,67 @@ make_new_set_basetype(PyTypeObject *type, PyObject *iterable) static PyObject *emptyfrozenset = NULL; static PyObject * -frozenset_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +make_new_frozenset(PyTypeObject *type, PyObject *iterable) { - PyObject *iterable = NULL, *result; - - if (type == &PyFrozenSet_Type && !_PyArg_NoKeywords("frozenset", kwds)) - return NULL; - - if (!PyArg_UnpackTuple(args, type->tp_name, 0, 1, &iterable)) - return NULL; - - if (type != &PyFrozenSet_Type) + if (type != &PyFrozenSet_Type) { return make_new_set(type, iterable); + } if (iterable != NULL) { - /* frozenset(f) is idempotent */ if (PyFrozenSet_CheckExact(iterable)) { + /* frozenset(f) is idempotent */ Py_INCREF(iterable); return iterable; } - result = make_new_set(type, iterable); - if (result == NULL || PySet_GET_SIZE(result)) - return result; - Py_DECREF(result); + PyObject *res = make_new_set((PyTypeObject *)type, iterable); + if (res == NULL || PySet_GET_SIZE(res) != 0) { + return res; + } + /* If the created frozenset is empty, return the empty frozenset singleton instead */ + Py_DECREF(res); + } + + // The empty frozenset is a singleton + if (emptyfrozenset == NULL) { + emptyfrozenset = make_new_set((PyTypeObject *)type, NULL); } - /* The empty frozenset is a singleton */ - if (emptyfrozenset == NULL) - emptyfrozenset = make_new_set(type, NULL); Py_XINCREF(emptyfrozenset); return emptyfrozenset; } +static PyObject * +frozenset_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + PyObject *iterable = NULL; + + if (type == &PyFrozenSet_Type && !_PyArg_NoKeywords("frozenset", kwds)) { + return NULL; + } + + if (!PyArg_UnpackTuple(args, type->tp_name, 0, 1, &iterable)) { + return NULL; + } + + return make_new_frozenset(type, iterable); +} + +static PyObject * +frozenset_vectorcall(PyObject *type, PyObject * const*args, + size_t nargsf, PyObject *kwnames) +{ + if (!_PyArg_NoKwnames("frozenset", kwnames)) { + return NULL; + } + + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + if (!_PyArg_CheckPositional("frozenset", nargs, 0, 1)) { + return NULL; + } + + PyObject *iterable = (nargs ? args[0] : NULL); + return make_new_frozenset((PyTypeObject *)type, iterable); +} + static PyObject * set_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { @@ -1463,9 +1408,25 @@ set_difference_update_internal(PySetObject *so, PyObject *other) setentry *entry; Py_ssize_t pos = 0; + /* Optimization: When the other set is more than 8 times + larger than the base set, replace the other set with + interesection of the two sets. + */ + if ((PySet_GET_SIZE(other) >> 3) > PySet_GET_SIZE(so)) { + other = set_intersection(so, other); + if (other == NULL) + return -1; + } else { + Py_INCREF(other); + } + while (set_next((PySetObject *)other, &pos, &entry)) - if (set_discard_entry(so, entry->key, entry->hash) < 0) + if (set_discard_entry(so, entry->key, entry->hash) < 0) { + Py_DECREF(other); return -1; + } + + Py_DECREF(other); } else { PyObject *key, *it; it = PyObject_GetIter(other); @@ -1998,6 +1959,28 @@ set_init(PySetObject *self, PyObject *args, PyObject *kwds) return set_update_internal(self, iterable); } +static PyObject* +set_vectorcall(PyObject *type, PyObject * const*args, + size_t nargsf, PyObject *kwnames) +{ + assert(PyType_Check(type)); + + if (!_PyArg_NoKwnames("set", kwnames)) { + return NULL; + } + + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + if (!_PyArg_CheckPositional("set", nargs, 0, 1)) { + return NULL; + } + + if (nargs) { + return make_new_set((PyTypeObject *)type, args[0]); + } + + return make_new_set((PyTypeObject *)type, NULL); +} + static PySequenceMethods set_as_sequence = { set_len, /* sq_length */ 0, /* sq_concat */ @@ -2063,6 +2046,7 @@ static PyMethodDef set_methods[] = { union_doc}, {"update", (PyCFunction)set_update, METH_VARARGS, update_doc}, + {"__class_getitem__", (PyCFunction)Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* sentinel */ }; @@ -2146,6 +2130,7 @@ PyTypeObject PySet_Type = { PyType_GenericAlloc, /* tp_alloc */ set_new, /* tp_new */ PyObject_GC_Del, /* tp_free */ + .tp_vectorcall = set_vectorcall, }; /* frozenset object ********************************************************/ @@ -2174,6 +2159,7 @@ static PyMethodDef frozenset_methods[] = { symmetric_difference_doc}, {"union", (PyCFunction)set_union, METH_VARARGS, union_doc}, + {"__class_getitem__", (PyCFunction)Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* sentinel */ }; @@ -2244,6 +2230,7 @@ PyTypeObject PyFrozenSet_Type = { PyType_GenericAlloc, /* tp_alloc */ frozenset_new, /* tp_new */ PyObject_GC_Del, /* tp_free */ + .tp_vectorcall = frozenset_vectorcall, }; @@ -2312,14 +2299,8 @@ PySet_Add(PyObject *anyset, PyObject *key) return set_add_key((PySetObject *)anyset, key); } -int -PySet_ClearFreeList(void) -{ - return 0; -} - void -PySet_Fini(void) +_PySet_Fini(void) { Py_CLEAR(emptyfrozenset); } @@ -2513,7 +2494,7 @@ dummy_repr(PyObject *op) return PyUnicode_FromString(""); } -static void +static void _Py_NO_RETURN dummy_dealloc(PyObject* ignore) { Py_FatalError("deallocating "); diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c index 7c10eb6f638d3a268dc47a04819e2e414b2e4c7d..391711f711aae0481ea126b85b55e2f89a1b364b 100644 --- a/Objects/sliceobject.c +++ b/Objects/sliceobject.c @@ -14,10 +14,9 @@ this type and there is exactly one in existence. */ #include "Python.h" +#include "pycore_abstract.h" // _PyIndex_Check() #include "pycore_object.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef static PyObject * ellipsis_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) @@ -100,7 +99,8 @@ PyObject _Py_EllipsisObject = { * created and then deleted again */ static PySliceObject *slice_cache = NULL; -void PySlice_Fini(void) + +void _PySlice_Fini(void) { PySliceObject *obj = slice_cache; if (obj != NULL) { @@ -353,7 +353,7 @@ static PyMemberDef slice_members[] = { static PyObject* evaluate_slice_index(PyObject *v) { - if (PyIndex_Check(v)) { + if (_PyIndex_Check(v)) { return PyNumber_Index(v); } else { diff --git a/Objects/stringlib/asciilib.h b/Objects/stringlib/asciilib.h index 8f83614488e844c0d830b739456fe9870fb730d8..e69a2c076e3a3cb391558181e9470ae7d50fb474 100644 --- a/Objects/stringlib/asciilib.h +++ b/Objects/stringlib/asciilib.h @@ -24,6 +24,3 @@ #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII - -#define _Py_InsertThousandsGrouping _PyUnicode_ascii_InsertThousandsGrouping - diff --git a/Objects/stringlib/codecs.h b/Objects/stringlib/codecs.h index 269a5581f70055261bbdf753a85a33fa4a9e85c4..9b2a29ba3b8c2a739813ddbfd67ef653a9031d9f 100644 --- a/Objects/stringlib/codecs.h +++ b/Objects/stringlib/codecs.h @@ -4,6 +4,8 @@ # error "codecs.h is specific to Unicode" #endif +#include "pycore_byteswap.h" // _Py_bswap32() + /* Mask to quickly check whether a C 'long' contains a non-ASCII, UTF8-encoded char. */ #if (SIZEOF_LONG == 8) @@ -153,7 +155,7 @@ STRINGLIB(utf8_decode)(const char **inptr, const char *end, /* Decoding UTF-8 sequences in range \xED\xA0\x80-\xED\xBF\xBF will result in surrogates in range D800-DFFF. Surrogates are not valid UTF-8 so they are rejected. - See http://www.unicode.org/versions/Unicode5.2.0/ch03.pdf + See https://www.unicode.org/versions/Unicode5.2.0/ch03.pdf (table 3-7) and http://www.rfc-editor.org/rfc/rfc3629.txt */ goto InvalidContinuation1; } @@ -256,9 +258,10 @@ STRINGLIB(utf8_decode)(const char **inptr, const char *end, /* UTF-8 encoder specialized for a Unicode kind to avoid the slow PyUnicode_READ() macro. Delete some parts of the code depending on the kind: UCS-1 strings don't need to handle surrogates for example. */ -Py_LOCAL_INLINE(PyObject *) -STRINGLIB(utf8_encoder)(PyObject *unicode, - STRINGLIB_CHAR *data, +Py_LOCAL_INLINE(char *) +STRINGLIB(utf8_encoder)(_PyBytesWriter *writer, + PyObject *unicode, + const STRINGLIB_CHAR *data, Py_ssize_t size, _Py_error_handler error_handler, const char *errors) @@ -277,17 +280,16 @@ STRINGLIB(utf8_encoder)(PyObject *unicode, #else /* STRINGLIB_SIZEOF_CHAR == 4 */ const Py_ssize_t max_char_size = 4; #endif - _PyBytesWriter writer; assert(size >= 0); - _PyBytesWriter_Init(&writer); - if (size > PY_SSIZE_T_MAX / max_char_size) { /* integer overflow */ - return PyErr_NoMemory(); + PyErr_NoMemory(); + return NULL; } - p = _PyBytesWriter_Alloc(&writer, size * max_char_size); + _PyBytesWriter_Init(writer); + p = _PyBytesWriter_Alloc(writer, size * max_char_size); if (p == NULL) return NULL; @@ -323,7 +325,7 @@ STRINGLIB(utf8_encoder)(PyObject *unicode, endpos++; /* Only overallocate the buffer if it's not the last write */ - writer.overallocate = (endpos < size); + writer->overallocate = (endpos < size); switch (error_handler) { @@ -347,8 +349,8 @@ STRINGLIB(utf8_encoder)(PyObject *unicode, case _Py_ERROR_BACKSLASHREPLACE: /* subtract preallocated bytes */ - writer.min_size -= max_char_size * (endpos - startpos); - p = backslashreplace(&writer, p, + writer->min_size -= max_char_size * (endpos - startpos); + p = backslashreplace(writer, p, unicode, startpos, endpos); if (p == NULL) goto error; @@ -357,8 +359,8 @@ STRINGLIB(utf8_encoder)(PyObject *unicode, case _Py_ERROR_XMLCHARREFREPLACE: /* subtract preallocated bytes */ - writer.min_size -= max_char_size * (endpos - startpos); - p = xmlcharrefreplace(&writer, p, + writer->min_size -= max_char_size * (endpos - startpos); + p = xmlcharrefreplace(writer, p, unicode, startpos, endpos); if (p == NULL) goto error; @@ -387,10 +389,10 @@ STRINGLIB(utf8_encoder)(PyObject *unicode, goto error; /* subtract preallocated bytes */ - writer.min_size -= max_char_size * (newpos - startpos); + writer->min_size -= max_char_size * (newpos - startpos); if (PyBytes_Check(rep)) { - p = _PyBytesWriter_WriteBytes(&writer, p, + p = _PyBytesWriter_WriteBytes(writer, p, PyBytes_AS_STRING(rep), PyBytes_GET_SIZE(rep)); } @@ -406,7 +408,7 @@ STRINGLIB(utf8_encoder)(PyObject *unicode, goto error; } - p = _PyBytesWriter_WriteBytes(&writer, p, + p = _PyBytesWriter_WriteBytes(writer, p, PyUnicode_DATA(rep), PyUnicode_GET_LENGTH(rep)); } @@ -420,7 +422,7 @@ STRINGLIB(utf8_encoder)(PyObject *unicode, /* If overallocation was disabled, ensure that it was the last write. Otherwise, we missed an optimization */ - assert(writer.overallocate || i == size); + assert(writer->overallocate || i == size); } else #if STRINGLIB_SIZEOF_CHAR > 2 @@ -449,14 +451,13 @@ STRINGLIB(utf8_encoder)(PyObject *unicode, Py_XDECREF(error_handler_obj); Py_XDECREF(exc); #endif - return _PyBytesWriter_Finish(&writer, p); + return p; #if STRINGLIB_SIZEOF_CHAR > 1 error: Py_XDECREF(rep); Py_XDECREF(error_handler_obj); Py_XDECREF(exc); - _PyBytesWriter_Dealloc(&writer); return NULL; #endif } @@ -733,24 +734,28 @@ STRINGLIB(utf16_encode)(const STRINGLIB_CHAR *in, #endif } +static inline uint32_t +STRINGLIB(SWAB4)(STRINGLIB_CHAR ch) +{ + uint32_t word = ch; #if STRINGLIB_SIZEOF_CHAR == 1 -# define SWAB4(CH, tmp) ((CH) << 24) /* high bytes are zero */ + /* high bytes are zero */ + return (word << 24); #elif STRINGLIB_SIZEOF_CHAR == 2 -# define SWAB4(CH, tmp) (tmp = (CH), \ - ((tmp & 0x00FFu) << 24) + ((tmp & 0xFF00u) << 8)) - /* high bytes are zero */ + /* high bytes are zero */ + return ((word & 0x00FFu) << 24) | ((word & 0xFF00u) << 8); #else -# define SWAB4(CH, tmp) (tmp = (CH), \ - tmp = ((tmp & 0x00FF00FFu) << 8) + ((tmp >> 8) & 0x00FF00FFu), \ - ((tmp & 0x0000FFFFu) << 16) + ((tmp >> 16) & 0x0000FFFFu)) + return _Py_bswap32(word); #endif +} + Py_LOCAL_INLINE(Py_ssize_t) STRINGLIB(utf32_encode)(const STRINGLIB_CHAR *in, Py_ssize_t len, - PY_UINT32_T **outptr, + uint32_t **outptr, int native_ordering) { - PY_UINT32_T *out = *outptr; + uint32_t *out = *outptr; const STRINGLIB_CHAR *end = in + len; if (native_ordering) { const STRINGLIB_CHAR *unrolled_end = in + _Py_SIZE_ROUND_DOWN(len, 4); @@ -784,7 +789,6 @@ STRINGLIB(utf32_encode)(const STRINGLIB_CHAR *in, const STRINGLIB_CHAR *unrolled_end = in + _Py_SIZE_ROUND_DOWN(len, 4); while (in < unrolled_end) { #if STRINGLIB_SIZEOF_CHAR > 1 - Py_UCS4 ch1, ch2, ch3, ch4; /* check if any character is a surrogate character */ if (((in[0] ^ 0xd800) & (in[1] ^ 0xd800) & @@ -792,10 +796,10 @@ STRINGLIB(utf32_encode)(const STRINGLIB_CHAR *in, (in[3] ^ 0xd800) & 0xf800) == 0) break; #endif - out[0] = SWAB4(in[0], ch1); - out[1] = SWAB4(in[1], ch2); - out[2] = SWAB4(in[2], ch3); - out[3] = SWAB4(in[3], ch4); + out[0] = STRINGLIB(SWAB4)(in[0]); + out[1] = STRINGLIB(SWAB4)(in[1]); + out[2] = STRINGLIB(SWAB4)(in[2]); + out[3] = STRINGLIB(SWAB4)(in[3]); in += 4; out += 4; } while (in < end) { @@ -806,7 +810,7 @@ STRINGLIB(utf32_encode)(const STRINGLIB_CHAR *in, goto fail; } #endif - *out++ = SWAB4(ch, ch); + *out++ = STRINGLIB(SWAB4)(ch); } } *outptr = out; @@ -817,6 +821,5 @@ STRINGLIB(utf32_encode)(const STRINGLIB_CHAR *in, return len - (end - in + 1); #endif } -#undef SWAB4 #endif diff --git a/Objects/stringlib/ctype.h b/Objects/stringlib/ctype.h index 843cfa22a84546d409b9d84e2ba69d3a6527a506..9b319b07d11bcb503cb7d52e77ca5bfbd236e83c 100644 --- a/Objects/stringlib/ctype.h +++ b/Objects/stringlib/ctype.h @@ -2,7 +2,7 @@ # error "ctype.h only compatible with byte-wise strings" #endif -#include "bytes_methods.h" +#include "pycore_bytes_methods.h" static PyObject* stringlib_isspace(PyObject *self, PyObject *Py_UNUSED(ignored)) diff --git a/Objects/stringlib/eq.h b/Objects/stringlib/eq.h index ff22f913712e8dfa88a90ad4f7b02e1b3be2975a..9c1058b86cbedbd5aa43c689eb18cb413f993ee6 100644 --- a/Objects/stringlib/eq.h +++ b/Objects/stringlib/eq.h @@ -6,13 +6,14 @@ Py_LOCAL_INLINE(int) unicode_eq(PyObject *aa, PyObject *bb) { + assert(PyUnicode_Check(aa)); + assert(PyUnicode_Check(bb)); + assert(PyUnicode_IS_READY(aa)); + assert(PyUnicode_IS_READY(bb)); + PyUnicodeObject *a = (PyUnicodeObject *)aa; PyUnicodeObject *b = (PyUnicodeObject *)bb; - if (PyUnicode_READY(a) == -1 || PyUnicode_READY(b) == -1) { - Py_UNREACHABLE(); - } - if (PyUnicode_GET_LENGTH(a) != PyUnicode_GET_LENGTH(b)) return 0; if (PyUnicode_GET_LENGTH(a) == 0) diff --git a/Objects/stringlib/join.h b/Objects/stringlib/join.h index 6f314e1524eb5403d719fc658a06c9c8d4d3ce2a..53bcbdea7ade9d3d60ba3f8fa57ea329d0a0f599 100644 --- a/Objects/stringlib/join.h +++ b/Objects/stringlib/join.h @@ -7,8 +7,8 @@ Py_LOCAL_INLINE(PyObject *) STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) { - char *sepstr = STRINGLIB_STR(sep); - const Py_ssize_t seplen = STRINGLIB_LEN(sep); + const char *sepstr = STRINGLIB_STR(sep); + Py_ssize_t seplen = STRINGLIB_LEN(sep); PyObject *res = NULL; char *p; Py_ssize_t seqlen = 0; @@ -18,6 +18,9 @@ STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) Py_buffer *buffers = NULL; #define NB_STATIC_BUFFERS 10 Py_buffer static_buffers[NB_STATIC_BUFFERS]; +#define GIL_THRESHOLD 1048576 + int drop_gil = 1; + PyThreadState *save = NULL; seq = PySequence_Fast(iterable, "can only join an iterable"); if (seq == NULL) { @@ -65,12 +68,21 @@ STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) buffers[i].buf = PyBytes_AS_STRING(item); buffers[i].len = PyBytes_GET_SIZE(item); } - else if (PyObject_GetBuffer(item, &buffers[i], PyBUF_SIMPLE) != 0) { - PyErr_Format(PyExc_TypeError, - "sequence item %zd: expected a bytes-like object, " - "%.80s found", - i, Py_TYPE(item)->tp_name); - goto error; + else { + if (PyObject_GetBuffer(item, &buffers[i], PyBUF_SIMPLE) != 0) { + PyErr_Format(PyExc_TypeError, + "sequence item %zd: expected a bytes-like object, " + "%.80s found", + i, Py_TYPE(item)->tp_name); + goto error; + } + /* If the backing objects are mutable, then dropping the GIL + * opens up race conditions where another thread tries to modify + * the object which we hold a buffer on it. Such code has data + * races anyway, but this is a conservative approach that avoids + * changing the behaviour of that data race. + */ + drop_gil = 0; } nbufs = i + 1; /* for error cleanup */ itemlen = buffers[i].len; @@ -102,6 +114,12 @@ STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) /* Catenate everything. */ p = STRINGLIB_STR(res); + if (sz < GIL_THRESHOLD) { + drop_gil = 0; /* Benefits are likely outweighed by the overheads */ + } + if (drop_gil) { + save = PyEval_SaveThread(); + } if (!seplen) { /* fast path */ for (i = 0; i < nbufs; i++) { @@ -110,19 +128,23 @@ STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) memcpy(p, q, n); p += n; } - goto done; } - for (i = 0; i < nbufs; i++) { - Py_ssize_t n; - char *q; - if (i) { - memcpy(p, sepstr, seplen); - p += seplen; + else { + for (i = 0; i < nbufs; i++) { + Py_ssize_t n; + char *q; + if (i) { + memcpy(p, sepstr, seplen); + p += seplen; + } + n = buffers[i].len; + q = buffers[i].buf; + memcpy(p, q, n); + p += n; } - n = buffers[i].len; - q = buffers[i].buf; - memcpy(p, q, n); - p += n; + } + if (drop_gil) { + PyEval_RestoreThread(save); } goto done; @@ -138,3 +160,4 @@ STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) } #undef NB_STATIC_BUFFERS +#undef GIL_THRESHOLD diff --git a/Objects/stringlib/split.h b/Objects/stringlib/split.h index 31f77a77243ea94fe83664205fc101593958b8b7..068047f9874a073b62d1d84c5dcca71152fd614f 100644 --- a/Objects/stringlib/split.h +++ b/Objects/stringlib/split.h @@ -48,7 +48,7 @@ /* Always force the list to the expected size. */ -#define FIX_PREALLOC_SIZE(list) Py_SIZE(list) = count +#define FIX_PREALLOC_SIZE(list) Py_SET_SIZE(list, count) Py_LOCAL_INLINE(PyObject *) STRINGLIB(split_whitespace)(PyObject* str_obj, diff --git a/Objects/stringlib/transmogrify.h b/Objects/stringlib/transmogrify.h index 9506019d5af2b8766b3f0cb052f7526651769319..e1165ea38e8256d3ef45a5d5c14355eb6cc68275 100644 --- a/Objects/stringlib/transmogrify.h +++ b/Objects/stringlib/transmogrify.h @@ -680,9 +680,13 @@ stringlib_replace(PyObject *self, const char *to_s, Py_ssize_t to_len, Py_ssize_t maxcount) { + if (STRINGLIB_LEN(self) < from_len) { + /* nothing to do; return the original bytes */ + return return_self(self); + } if (maxcount < 0) { maxcount = PY_SSIZE_T_MAX; - } else if (maxcount == 0 || STRINGLIB_LEN(self) == 0) { + } else if (maxcount == 0) { /* nothing to do; return the original bytes */ return return_self(self); } @@ -699,13 +703,6 @@ stringlib_replace(PyObject *self, return stringlib_replace_interleave(self, to_s, to_len, maxcount); } - /* Except for b"".replace(b"", b"A") == b"A" there is no way beyond this */ - /* point for an empty self bytes to generate a non-empty bytes */ - /* Special case so the remaining code always gets a non-empty bytes */ - if (STRINGLIB_LEN(self) == 0) { - return return_self(self); - } - if (to_len == 0) { /* delete all occurrences of 'from' bytes */ if (from_len == 1) { diff --git a/Objects/stringlib/ucs1lib.h b/Objects/stringlib/ucs1lib.h index ce1eb57f0d7da90bba0cf14217f69693bcec4517..bc4b104f112ccb31f9073ca189fabb388d9cbd4d 100644 --- a/Objects/stringlib/ucs1lib.h +++ b/Objects/stringlib/ucs1lib.h @@ -24,7 +24,3 @@ #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII - -#define _Py_InsertThousandsGrouping _PyUnicode_ucs1_InsertThousandsGrouping - - diff --git a/Objects/stringlib/ucs2lib.h b/Objects/stringlib/ucs2lib.h index f900cb65f8cede16d703d52530239db0b88cc14c..86a1dff1b5637855b1eb045486c4a1d5dcc786d8 100644 --- a/Objects/stringlib/ucs2lib.h +++ b/Objects/stringlib/ucs2lib.h @@ -24,6 +24,3 @@ #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII - -#define _Py_InsertThousandsGrouping _PyUnicode_ucs2_InsertThousandsGrouping - diff --git a/Objects/stringlib/ucs4lib.h b/Objects/stringlib/ucs4lib.h index 86a480f1e3a7eda9a5251cbe26ccc1b28ae7e124..3c32a93c96a1c74fa58e727229df62dfd974c089 100644 --- a/Objects/stringlib/ucs4lib.h +++ b/Objects/stringlib/ucs4lib.h @@ -25,5 +25,3 @@ #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII -#define _Py_InsertThousandsGrouping _PyUnicode_ucs4_InsertThousandsGrouping - diff --git a/Objects/stringlib/undef.h b/Objects/stringlib/undef.h index f9d3f1d3328d57b93af67e194933f25edf1833ad..c41e254fde6f4d4cee8bb99e2900e821830b0250 100644 --- a/Objects/stringlib/undef.h +++ b/Objects/stringlib/undef.h @@ -6,6 +6,5 @@ #undef STRINGLIB_STR #undef STRINGLIB_LEN #undef STRINGLIB_NEW -#undef _Py_InsertThousandsGrouping #undef STRINGLIB_IS_UNICODE diff --git a/Objects/stringlib/unicode_format.h b/Objects/stringlib/unicode_format.h index ddf1e26448693a9c12dcd23e85f62ab68c91545a..b526ad21b8205ddc9e884e2aab65b42698b4905e 100644 --- a/Objects/stringlib/unicode_format.h +++ b/Objects/stringlib/unicode_format.h @@ -828,7 +828,7 @@ output_markup(SubString *field_name, SubString *format_spec, tmp = NULL; } - /* if needed, recurively compute the format_spec */ + /* if needed, recursively compute the format_spec */ if (format_spec_needs_expanding) { tmp = build_string(format_spec, args, kwargs, recursion_depth-1, auto_number); diff --git a/Objects/structseq.c b/Objects/structseq.c index c158afccb97fdde8d562226e178e5e88e2754437..b17b1f99a5bc629cdad2282e91114636eca3e698 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -10,7 +10,7 @@ #include "Python.h" #include "pycore_tupleobject.h" #include "pycore_object.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef static const char visible_length_key[] = "n_sequence_fields"; static const char real_length_key[] = "n_fields"; @@ -18,7 +18,7 @@ static const char unnamed_fields_key[] = "n_unnamed_fields"; /* Fields with this name have only a field index, not a field name. They are only allowed for indices < n_visible_fields. */ -char *PyStructSequence_UnnamedField = "unnamed field"; +const char * const PyStructSequence_UnnamedField = "unnamed field"; _Py_IDENTIFIER(n_sequence_fields); _Py_IDENTIFIER(n_fields); _Py_IDENTIFIER(n_unnamed_fields); @@ -47,7 +47,7 @@ PyStructSequence_New(PyTypeObject *type) return NULL; /* Hack the size of the variable object, so invisible fields don't appear to Python code. */ - Py_SIZE(obj) = VISIBLE_SIZE_TP(type); + Py_SET_SIZE(obj, VISIBLE_SIZE_TP(type)); for (i = 0; i < size; i++) obj->ob_item[i] = NULL; @@ -70,6 +70,9 @@ PyStructSequence_GetItem(PyObject* op, Py_ssize_t i) static int structseq_traverse(PyStructSequence *obj, visitproc visit, void *arg) { + if (Py_TYPE(obj)->tp_flags & Py_TPFLAGS_HEAPTYPE) { + Py_VISIT(Py_TYPE(obj)); + } Py_ssize_t i, size; size = REAL_SIZE(obj); for (i = 0; i < size; ++i) { diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index bd580946b7eb9992ecb568a3034d057552c57c72..9092c9f8beea325064cbc2007bb8a8f5fef6453a 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -2,9 +2,10 @@ /* Tuple object implementation */ #include "Python.h" -#include "pycore_object.h" -#include "pycore_pystate.h" +#include "pycore_abstract.h" // _PyIndex_Check() #include "pycore_accu.h" +#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() +#include "pycore_object.h" /*[clinic input] class tuple "PyTupleObject *" "&PyTuple_Type" @@ -28,36 +29,12 @@ class tuple "PyTupleObject *" "&PyTuple_Type" static PyTupleObject *free_list[PyTuple_MAXSAVESIZE]; static int numfree[PyTuple_MAXSAVESIZE]; #endif -#ifdef COUNT_ALLOCS -Py_ssize_t _Py_fast_tuple_allocs; -Py_ssize_t _Py_tuple_zero_allocs; -#endif - -/* Debug statistic to count GC tracking of tuples. - Please note that tuples are only untracked when considered by the GC, and - many of them will be dead before. Therefore, a tracking rate close to 100% - does not necessarily prove that the heuristic is inefficient. -*/ -#ifdef SHOW_TRACK_COUNT -static Py_ssize_t count_untracked = 0; -static Py_ssize_t count_tracked = 0; -static void -show_track(void) +static inline void +tuple_gc_track(PyTupleObject *op) { - PyInterpreterState *interp = _PyInterpreterState_Get(); - if (!interp->config.show_alloc_count) { - return; - } - - fprintf(stderr, "Tuples created: %" PY_FORMAT_SIZE_T "d\n", - count_tracked + count_untracked); - fprintf(stderr, "Tuples tracked by the GC: %" PY_FORMAT_SIZE_T - "d\n", count_tracked); - fprintf(stderr, "%.2f%% tuple tracking rate\n\n", - (100.0*count_tracked/(count_untracked+count_tracked))); + _PyObject_GC_TRACK(op); } -#endif /* Print summary info about the state of the optimized allocator */ void @@ -76,30 +53,27 @@ _PyTuple_DebugMallocStats(FILE *out) #endif } -PyObject * -PyTuple_New(Py_ssize_t size) +/* Allocate an uninitialized tuple object. Before making it public following + steps must be done: + - initialize its items + - call tuple_gc_track() on it + Because the empty tuple is always reused and it's already tracked by GC, + this function must not be called with size == 0 (unless from PyTuple_New() + which wraps this function). +*/ +static PyTupleObject * +tuple_alloc(Py_ssize_t size) { PyTupleObject *op; - Py_ssize_t i; if (size < 0) { PyErr_BadInternalCall(); return NULL; } #if PyTuple_MAXSAVESIZE > 0 - if (size == 0 && free_list[0]) { - op = free_list[0]; - Py_INCREF(op); -#ifdef COUNT_ALLOCS - _Py_tuple_zero_allocs++; -#endif - return (PyObject *) op; - } if (size < PyTuple_MAXSAVESIZE && (op = free_list[size]) != NULL) { + assert(size != 0); free_list[size] = (PyTupleObject *) op->ob_item[0]; numfree[size]--; -#ifdef COUNT_ALLOCS - _Py_fast_tuple_allocs++; -#endif /* Inline PyObject_InitVar */ #ifdef Py_TRACE_REFS Py_SIZE(op) = size; @@ -111,16 +85,35 @@ PyTuple_New(Py_ssize_t size) #endif { /* Check for overflow */ - if ((size_t)size > ((size_t)PY_SSIZE_T_MAX - sizeof(PyTupleObject) - - sizeof(PyObject *)) / sizeof(PyObject *)) { - return PyErr_NoMemory(); + if ((size_t)size > ((size_t)PY_SSIZE_T_MAX - (sizeof(PyTupleObject) - + sizeof(PyObject *))) / sizeof(PyObject *)) { + return (PyTupleObject *)PyErr_NoMemory(); } op = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size); if (op == NULL) return NULL; } - for (i=0; i < size; i++) + return op; +} + +PyObject * +PyTuple_New(Py_ssize_t size) +{ + PyTupleObject *op; +#if PyTuple_MAXSAVESIZE > 0 + if (size == 0 && free_list[0]) { + op = free_list[0]; + Py_INCREF(op); + return (PyObject *) op; + } +#endif + op = tuple_alloc(size); + if (op == NULL) { + return NULL; + } + for (Py_ssize_t i = 0; i < size; i++) { op->ob_item[i] = NULL; + } #if PyTuple_MAXSAVESIZE > 0 if (size == 0) { free_list[0] = op; @@ -128,10 +121,7 @@ PyTuple_New(Py_ssize_t size) Py_INCREF(op); /* extra INCREF so that this is never freed */ } #endif -#ifdef SHOW_TRACK_COUNT - count_tracked++; -#endif - _PyObject_GC_TRACK(op); + tuple_gc_track(op); return (PyObject *) op; } @@ -164,7 +154,7 @@ int PyTuple_SetItem(PyObject *op, Py_ssize_t i, PyObject *newitem) { PyObject **p; - if (!PyTuple_Check(op) || op->ob_refcnt != 1) { + if (!PyTuple_Check(op) || Py_REFCNT(op) != 1) { Py_XDECREF(newitem); PyErr_BadInternalCall(); return -1; @@ -199,10 +189,6 @@ _PyTuple_MaybeUntrack(PyObject *op) _PyObject_GC_MAY_BE_TRACKED(elt)) return; } -#ifdef SHOW_TRACK_COUNT - count_tracked--; - count_untracked++; -#endif _PyObject_GC_UNTRACK(op); } @@ -211,24 +197,28 @@ PyTuple_Pack(Py_ssize_t n, ...) { Py_ssize_t i; PyObject *o; - PyObject *result; PyObject **items; va_list vargs; + if (n == 0) { + return PyTuple_New(0); + } + va_start(vargs, n); - result = PyTuple_New(n); + PyTupleObject *result = tuple_alloc(n); if (result == NULL) { va_end(vargs); return NULL; } - items = ((PyTupleObject *)result)->ob_item; + items = result->ob_item; for (i = 0; i < n; i++) { o = va_arg(vargs, PyObject *); Py_INCREF(o); items[i] = o; } va_end(vargs); - return result; + tuple_gc_track(result); + return (PyObject *)result; } @@ -248,7 +238,7 @@ tupledealloc(PyTupleObject *op) #if PyTuple_MAXSAVESIZE > 0 if (len < PyTuple_MAXSAVESIZE && numfree[len] < PyTuple_MAXFREELIST && - Py_TYPE(op) == &PyTuple_Type) + Py_IS_TYPE(op, &PyTuple_Type)) { op->ob_item[0] = (PyObject *) free_list[len]; numfree[len]++; @@ -258,7 +248,9 @@ tupledealloc(PyTupleObject *op) #endif } Py_TYPE(op)->tp_free((PyObject *)op); +#if PyTuple_MAXSAVESIZE > 0 done: +#endif Py_TRASHCAN_END } @@ -403,8 +395,7 @@ tuplecontains(PyTupleObject *a, PyObject *el) int cmp; for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i) - cmp = PyObject_RichCompareBool(el, PyTuple_GET_ITEM(a, i), - Py_EQ); + cmp = PyObject_RichCompareBool(PyTuple_GET_ITEM(a, i), el, Py_EQ); return cmp; } @@ -422,7 +413,11 @@ tupleitem(PyTupleObject *a, Py_ssize_t i) PyObject * _PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) { - PyTupleObject *tuple = (PyTupleObject *)PyTuple_New(n); + if (n == 0) { + return PyTuple_New(0); + } + + PyTupleObject *tuple = tuple_alloc(n); if (tuple == NULL) { return NULL; } @@ -432,6 +427,7 @@ _PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) Py_INCREF(item); dst[i] = item; } + tuple_gc_track(tuple); return (PyObject *)tuple; } @@ -487,7 +483,11 @@ tupleconcat(PyTupleObject *a, PyObject *bb) if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) return PyErr_NoMemory(); size = Py_SIZE(a) + Py_SIZE(b); - np = (PyTupleObject *) PyTuple_New(size); + if (size == 0) { + return PyTuple_New(0); + } + + np = tuple_alloc(size); if (np == NULL) { return NULL; } @@ -505,6 +505,7 @@ tupleconcat(PyTupleObject *a, PyObject *bb) Py_INCREF(v); dest[i] = v; } + tuple_gc_track(np); return (PyObject *)np; #undef b } @@ -516,8 +517,6 @@ tuplerepeat(PyTupleObject *a, Py_ssize_t n) Py_ssize_t size; PyTupleObject *np; PyObject **p, **items; - if (n < 0) - n = 0; if (Py_SIZE(a) == 0 || n == 1) { if (PyTuple_CheckExact(a)) { /* Since tuples are immutable, we can return a shared @@ -525,13 +524,14 @@ tuplerepeat(PyTupleObject *a, Py_ssize_t n) Py_INCREF(a); return (PyObject *)a; } - if (Py_SIZE(a) == 0) - return PyTuple_New(0); + } + if (Py_SIZE(a) == 0 || n <= 0) { + return PyTuple_New(0); } if (n > PY_SSIZE_T_MAX / Py_SIZE(a)) return PyErr_NoMemory(); size = Py_SIZE(a) * n; - np = (PyTupleObject *) PyTuple_New(size); + np = tuple_alloc(size); if (np == NULL) return NULL; p = np->ob_item; @@ -543,6 +543,7 @@ tuplerepeat(PyTupleObject *a, Py_ssize_t n) p++; } } + tuple_gc_track(np); return (PyObject *) np; } @@ -707,6 +708,25 @@ tuple_new_impl(PyTypeObject *type, PyObject *iterable) return PySequence_Tuple(iterable); } +static PyObject * +tuple_vectorcall(PyObject *type, PyObject * const*args, + size_t nargsf, PyObject *kwnames) +{ + if (!_PyArg_NoKwnames("tuple", kwnames)) { + return NULL; + } + + Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); + if (!_PyArg_CheckPositional("tuple", nargs, 0, 1)) { + return NULL; + } + + if (nargs) { + return tuple_new_impl((PyTypeObject *)type, args[0]); + } + return PyTuple_New(0); +} + static PyObject * tuple_subtype_new(PyTypeObject *type, PyObject *iterable) { @@ -746,7 +766,7 @@ static PySequenceMethods tuple_as_sequence = { static PyObject* tuplesubscript(PyTupleObject* self, PyObject* item) { - if (PyIndex_Check(item)) { + if (_PyIndex_Check(item)) { Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) return NULL; @@ -757,7 +777,6 @@ tuplesubscript(PyTupleObject* self, PyObject* item) else if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelength, i; size_t cur; - PyObject* result; PyObject* it; PyObject **src, **dest; @@ -777,11 +796,11 @@ tuplesubscript(PyTupleObject* self, PyObject* item) return (PyObject *)self; } else { - result = PyTuple_New(slicelength); + PyTupleObject* result = tuple_alloc(slicelength); if (!result) return NULL; src = self->ob_item; - dest = ((PyTupleObject *)result)->ob_item; + dest = result->ob_item; for (cur = start, i = 0; i < slicelength; cur += step, i++) { it = src[cur]; @@ -789,7 +808,8 @@ tuplesubscript(PyTupleObject* self, PyObject* item) dest[i] = it; } - return result; + tuple_gc_track(result); + return (PyObject *)result; } } else { @@ -815,6 +835,7 @@ static PyMethodDef tuple_methods[] = { TUPLE___GETNEWARGS___METHODDEF TUPLE_INDEX_METHODDEF TUPLE_COUNT_METHODDEF + {"__class_getitem__", (PyCFunction)Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} /* sentinel */ }; @@ -867,6 +888,7 @@ PyTypeObject PyTuple_Type = { 0, /* tp_alloc */ tuple_new, /* tp_new */ PyObject_GC_Del, /* tp_free */ + .tp_vectorcall = tuple_vectorcall, }; /* The following function breaks the notion that tuples are immutable: @@ -885,7 +907,7 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize) Py_ssize_t oldsize; v = (PyTupleObject *) *pv; - if (v == NULL || Py_TYPE(v) != &PyTuple_Type || + if (v == NULL || !Py_IS_TYPE(v, &PyTuple_Type) || (Py_SIZE(v) != 0 && Py_REFCNT(v) != 1)) { *pv = 0; Py_XDECREF(v); @@ -906,10 +928,15 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize) } /* XXX UNREF/NEWREF interface should be more symmetrical */ - _Py_DEC_REFTOTAL; - if (_PyObject_GC_IS_TRACKED(v)) +#ifdef Py_REF_DEBUG + _Py_RefTotal--; +#endif + if (_PyObject_GC_IS_TRACKED(v)) { _PyObject_GC_UNTRACK(v); + } +#ifdef Py_TRACE_REFS _Py_ForgetReference((PyObject *) v); +#endif /* DECREF items deleted by shrinkage */ for (i = newsize; i < oldsize; i++) { Py_CLEAR(v->ob_item[i]); @@ -930,40 +957,33 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize) return 0; } -int -PyTuple_ClearFreeList(void) +void +_PyTuple_ClearFreeList(void) { - int freelist_size = 0; #if PyTuple_MAXSAVESIZE > 0 - int i; - for (i = 1; i < PyTuple_MAXSAVESIZE; i++) { - PyTupleObject *p, *q; - p = free_list[i]; - freelist_size += numfree[i]; + for (Py_ssize_t i = 1; i < PyTuple_MAXSAVESIZE; i++) { + PyTupleObject *p = free_list[i]; free_list[i] = NULL; numfree[i] = 0; while (p) { - q = p; + PyTupleObject *q = p; p = (PyTupleObject *)(p->ob_item[0]); PyObject_GC_Del(q); } } + // the empty tuple singleton is only cleared by _PyTuple_Fini() #endif - return freelist_size; } void -PyTuple_Fini(void) +_PyTuple_Fini(void) { #if PyTuple_MAXSAVESIZE > 0 /* empty tuples are used all over the place and applications may * rely on the fact that an empty tuple is a singleton. */ Py_CLEAR(free_list[0]); - (void)PyTuple_ClearFreeList(); -#endif -#ifdef SHOW_TRACK_COUNT - show_track(); + _PyTuple_ClearFreeList(); #endif } diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 0acde714a87b146ea2c0dda0cc614083a96a8f7e..acbe3fa3b5a7f131035612c87409d98d74e4b3ab 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1,10 +1,13 @@ /* Type object implementation */ #include "Python.h" +#include "pycore_call.h" +#include "pycore_initconfig.h" #include "pycore_object.h" -#include "pycore_pystate.h" +#include "pycore_pyerrors.h" +#include "pycore_pystate.h" // _PyThreadState_GET() #include "frameobject.h" -#include "structmember.h" +#include "structmember.h" // PyMemberDef #include @@ -16,6 +19,9 @@ class object "PyObject *" "&PyBaseObject_Type" #include "clinic/typeobject.c.h" +#define MCACHE + +#ifdef MCACHE /* Support type attribute cache */ /* The cache can keep references to the names alive for longer than @@ -44,6 +50,7 @@ struct method_cache_entry { static struct method_cache_entry method_cache[1 << MCACHE_SIZE_EXP]; static unsigned int next_version_tag = 0; +#endif #define MCACHE_STATS 0 @@ -53,6 +60,8 @@ static size_t method_cache_misses = 0; static size_t method_cache_collisions = 0; #endif +#define INTERN_NAME_STRINGS + /* alphabetical order */ _Py_IDENTIFIER(__abstractmethods__); _Py_IDENTIFIER(__class__); @@ -71,6 +80,7 @@ _Py_IDENTIFIER(__new__); _Py_IDENTIFIER(__set_name__); _Py_IDENTIFIER(__setitem__); _Py_IDENTIFIER(builtins); +_Py_IDENTIFIER(mro); static PyObject * slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds); @@ -210,6 +220,7 @@ _PyType_GetTextSignatureFromInternalDoc(const char *name, const char *internal_d unsigned int PyType_ClearCache(void) { +#ifdef MCACHE Py_ssize_t i; unsigned int cur_version_tag = next_version_tag - 1; @@ -234,6 +245,9 @@ PyType_ClearCache(void) /* mark all version tags as invalid */ PyType_Modified(&PyBaseObject_Type); return cur_version_tag; +#else + return 0; +#endif } void @@ -268,7 +282,7 @@ PyType_Modified(PyTypeObject *type) PyObject *raw, *ref; Py_ssize_t i; - if (!PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) + if (!_PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) return; raw = type->tp_subclasses; @@ -301,16 +315,15 @@ type_mro_modified(PyTypeObject *type, PyObject *bases) { each subclass when their mro is recursively updated. */ Py_ssize_t i, n; - int custom = (Py_TYPE(type) != &PyType_Type); + int custom = !Py_IS_TYPE(type, &PyType_Type); int unbound; PyObject *mro_meth = NULL; PyObject *type_mro_meth = NULL; - if (!PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG)) + if (!_PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG)) return; if (custom) { - _Py_IDENTIFIER(mro); mro_meth = lookup_maybe_method( (PyObject *)type, &PyId_mro, &unbound); if (mro_meth == NULL) @@ -332,7 +345,7 @@ type_mro_modified(PyTypeObject *type, PyObject *bases) { assert(PyType_Check(b)); cls = (PyTypeObject *)b; - if (!PyType_HasFeature(cls, Py_TPFLAGS_HAVE_VERSION_TAG) || + if (!_PyType_HasFeature(cls, Py_TPFLAGS_HAVE_VERSION_TAG) || !PyType_IsSubtype(type, cls)) { goto clear; } @@ -345,6 +358,7 @@ type_mro_modified(PyTypeObject *type, PyObject *bases) { Py_TPFLAGS_VALID_VERSION_TAG); } +#ifdef MCACHE static int assign_version_tag(PyTypeObject *type) { @@ -356,11 +370,11 @@ assign_version_tag(PyTypeObject *type) Py_ssize_t i, n; PyObject *bases; - if (PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) + if (_PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) return 1; - if (!PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG)) + if (!_PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG)) return 0; - if (!PyType_HasFeature(type, Py_TPFLAGS_READY)) + if (!_PyType_HasFeature(type, Py_TPFLAGS_READY)) return 0; type->tp_version_tag = next_version_tag++; @@ -391,6 +405,7 @@ assign_version_tag(PyTypeObject *type) type->tp_flags |= Py_TPFLAGS_VALID_VERSION_TAG; return 1; } +#endif static PyMemberDef type_members[] = { @@ -431,6 +446,7 @@ check_set_special_type_attr(PyTypeObject *type, PyObject *value, const char *nam const char * _PyType_Name(PyTypeObject *type) { + assert(type->tp_name != NULL); const char *s = strrchr(type->tp_name, '.'); if (s == NULL) { s = type->tp_name; @@ -956,34 +972,50 @@ static PyObject * type_call(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *obj; - - if (type->tp_new == NULL) { - PyErr_Format(PyExc_TypeError, - "cannot create '%.100s' instances", - type->tp_name); - return NULL; - } + PyThreadState *tstate = _PyThreadState_GET(); #ifdef Py_DEBUG /* type_call() must not be called with an exception set, because it can clear it (directly or indirectly) and so the caller loses its exception */ - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); #endif + /* Special case: type(x) should return Py_TYPE(x) */ + /* We only want type itself to accept the one-argument form (#27157) */ + if (type == &PyType_Type) { + assert(args != NULL && PyTuple_Check(args)); + assert(kwds == NULL || PyDict_Check(kwds)); + Py_ssize_t nargs = PyTuple_GET_SIZE(args); + + if (nargs == 1 && (kwds == NULL || !PyDict_GET_SIZE(kwds))) { + obj = (PyObject *) Py_TYPE(PyTuple_GET_ITEM(args, 0)); + Py_INCREF(obj); + return obj; + } + + /* SF bug 475327 -- if that didn't trigger, we need 3 + arguments. But PyArg_ParseTuple in type_new may give + a msg saying type() needs exactly 3. */ + if (nargs != 3) { + PyErr_SetString(PyExc_TypeError, + "type() takes 1 or 3 arguments"); + return NULL; + } + } + + if (type->tp_new == NULL) { + _PyErr_Format(tstate, PyExc_TypeError, + "cannot create '%.100s' instances", + type->tp_name); + return NULL; + } + obj = type->tp_new(type, args, kwds); - obj = _Py_CheckFunctionResult((PyObject*)type, obj, NULL); + obj = _Py_CheckFunctionResult(tstate, (PyObject*)type, obj, NULL); if (obj == NULL) return NULL; - /* Ugly exception: when the call was type(something), - don't call tp_init on the result. */ - if (type == &PyType_Type && - PyTuple_Check(args) && PyTuple_GET_SIZE(args) == 1 && - (kwds == NULL || - (PyDict_Check(kwds) && PyDict_GET_SIZE(kwds) == 0))) - return obj; - /* If the returned object is not an instance of type, it won't be initialized. */ if (!PyType_IsSubtype(Py_TYPE(obj), type)) @@ -993,12 +1025,12 @@ type_call(PyTypeObject *type, PyObject *args, PyObject *kwds) if (type->tp_init != NULL) { int res = type->tp_init(obj, args, kwds); if (res < 0) { - assert(PyErr_Occurred()); + assert(_PyErr_Occurred(tstate)); Py_DECREF(obj); obj = NULL; } else { - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); } } return obj; @@ -1011,23 +1043,29 @@ PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems) const size_t size = _PyObject_VAR_SIZE(type, nitems+1); /* note that we need to add one, for the sentinel */ - if (PyType_IS_GC(type)) + if (_PyType_IS_GC(type)) { obj = _PyObject_GC_Malloc(size); - else + } + else { obj = (PyObject *)PyObject_MALLOC(size); + } - if (obj == NULL) + if (obj == NULL) { return PyErr_NoMemory(); + } memset(obj, '\0', size); - if (type->tp_itemsize == 0) + if (type->tp_itemsize == 0) { (void)PyObject_INIT(obj, type); - else + } + else { (void) PyObject_INIT_VAR((PyVarObject *)obj, type, nitems); + } - if (PyType_IS_GC(type)) + if (_PyType_IS_GC(type)) { _PyObject_GC_TRACK(obj); + } return obj; } @@ -1087,11 +1125,16 @@ subtype_traverse(PyObject *self, visitproc visit, void *arg) Py_VISIT(*dictptr); } - if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) + if (type->tp_flags & Py_TPFLAGS_HEAPTYPE + && (!basetraverse || !(base->tp_flags & Py_TPFLAGS_HEAPTYPE))) { /* For a heaptype, the instances count as references to the type. Traverse the type so the collector - can find cycles involving this link. */ + can find cycles involving this link. + Skip this visit if basetraverse belongs to a heap type: in that + case, basetraverse will visit the type when we call it later. + */ Py_VISIT(type); + } if (basetraverse) return basetraverse(self, visit, arg); @@ -1161,7 +1204,7 @@ subtype_dealloc(PyObject *self) /* Test whether the type has GC exactly once */ - if (!PyType_IS_GC(type)) { + if (!_PyType_IS_GC(type)) { /* A non GC dynamic type allows certain simplifications: there's no need to call clear_slots(), or DECREF the dict, or clear weakrefs. */ @@ -1173,8 +1216,9 @@ subtype_dealloc(PyObject *self) } if (type->tp_del) { type->tp_del(self); - if (self->ob_refcnt > 0) + if (Py_REFCNT(self) > 0) { return; + } } /* Find the nearest base with a different tp_dealloc */ @@ -1239,7 +1283,7 @@ subtype_dealloc(PyObject *self) if (type->tp_del) { _PyObject_GC_TRACK(self); type->tp_del(self); - if (self->ob_refcnt > 0) { + if (Py_REFCNT(self) > 0) { /* Resurrected */ goto endlabel; } @@ -1253,7 +1297,7 @@ subtype_dealloc(PyObject *self) if (type->tp_weaklistoffset && !base->tp_weaklistoffset) { /* Modeled after GET_WEAKREFS_LISTPTR() */ PyWeakReference **list = (PyWeakReference **) \ - PyObject_GET_WEAKREFS_LISTPTR(self); + _PyObject_GET_WEAKREFS_LISTPTR(self); while (*list) _PyWeakref_ClearRef(*list); } @@ -1286,8 +1330,9 @@ subtype_dealloc(PyObject *self) /* Call the base tp_dealloc(); first retrack self if * basedealloc knows about gc. */ - if (PyType_IS_GC(base)) + if (_PyType_IS_GC(base)) { _PyObject_GC_TRACK(self); + } assert(basedealloc); basedealloc(self); @@ -1374,7 +1419,7 @@ PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b) return 0; } else - /* a is not completely initilized yet; follow tp_base */ + /* a is not completely initialized yet; follow tp_base */ return type_is_subtype_base_chain(a, b); } @@ -1417,7 +1462,7 @@ lookup_maybe_method(PyObject *self, _Py_Identifier *attrid, int *unbound) return NULL; } - if (PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR)) { + if (_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR)) { /* Avoid temporary PyMethodObject */ *unbound = 1; Py_INCREF(res); @@ -1440,70 +1485,77 @@ lookup_method(PyObject *self, _Py_Identifier *attrid, int *unbound) { PyObject *res = lookup_maybe_method(self, attrid, unbound); if (res == NULL && !PyErr_Occurred()) { - PyErr_SetObject(PyExc_AttributeError, attrid->object); + PyErr_SetObject(PyExc_AttributeError, _PyUnicode_FromId(attrid)); } return res; } -static PyObject* -call_unbound(int unbound, PyObject *func, PyObject *self, - PyObject **args, Py_ssize_t nargs) + +static inline PyObject* +vectorcall_unbound(PyThreadState *tstate, int unbound, PyObject *func, + PyObject *const *args, Py_ssize_t nargs) { - if (unbound) { - return _PyObject_FastCall_Prepend(func, self, args, nargs); - } - else { - return _PyObject_FastCall(func, args, nargs); + size_t nargsf = nargs; + if (!unbound) { + /* Skip self argument, freeing up args[0] to use for + * PY_VECTORCALL_ARGUMENTS_OFFSET */ + args++; + nargsf = nargsf - 1 + PY_VECTORCALL_ARGUMENTS_OFFSET; } + return _PyObject_VectorcallTstate(tstate, func, args, nargsf, NULL); } static PyObject* call_unbound_noarg(int unbound, PyObject *func, PyObject *self) { if (unbound) { - PyObject *args[1] = {self}; - return _PyObject_FastCall(func, args, 1); + return PyObject_CallOneArg(func, self); } else { return _PyObject_CallNoArg(func); } } -/* A variation of PyObject_CallMethod* that uses lookup_maybe_method() - instead of PyObject_GetAttrString(). */ +/* A variation of PyObject_CallMethod* that uses lookup_method() + instead of PyObject_GetAttrString(). + + args is an argument vector of length nargs. The first element in this + vector is the special object "self" which is used for the method lookup */ static PyObject * -call_method(PyObject *obj, _Py_Identifier *name, - PyObject **args, Py_ssize_t nargs) +vectorcall_method(_Py_Identifier *name, + PyObject *const *args, Py_ssize_t nargs) { - int unbound; - PyObject *func, *retval; + assert(nargs >= 1); - func = lookup_method(obj, name, &unbound); + PyThreadState *tstate = _PyThreadState_GET(); + int unbound; + PyObject *self = args[0]; + PyObject *func = lookup_method(self, name, &unbound); if (func == NULL) { return NULL; } - retval = call_unbound(unbound, func, obj, args, nargs); + PyObject *retval = vectorcall_unbound(tstate, unbound, func, args, nargs); Py_DECREF(func); return retval; } -/* Clone of call_method() that returns NotImplemented when the lookup fails. */ - +/* Clone of vectorcall_method() that returns NotImplemented + * when the lookup fails. */ static PyObject * -call_maybe(PyObject *obj, _Py_Identifier *name, - PyObject **args, Py_ssize_t nargs) +vectorcall_maybe(PyThreadState *tstate, _Py_Identifier *name, + PyObject *const *args, Py_ssize_t nargs) { - int unbound; - PyObject *func, *retval; + assert(nargs >= 1); - func = lookup_maybe_method(obj, name, &unbound); + int unbound; + PyObject *self = args[0]; + PyObject *func = lookup_maybe_method(self, name, &unbound); if (func == NULL) { if (!PyErr_Occurred()) Py_RETURN_NOTIMPLEMENTED; return NULL; } - - retval = call_unbound(unbound, func, obj, args, nargs); + PyObject *retval = vectorcall_unbound(tstate, unbound, func, args, nargs); Py_DECREF(func); return retval; } @@ -1881,10 +1933,9 @@ mro_invoke(PyTypeObject *type) { PyObject *mro_result; PyObject *new_mro; - int custom = (Py_TYPE(type) != &PyType_Type); + const int custom = !Py_IS_TYPE(type, &PyType_Type); if (custom) { - _Py_IDENTIFIER(mro); int unbound; PyObject *mro_meth = lookup_method((PyObject *)type, &PyId_mro, &unbound); @@ -2002,7 +2053,7 @@ best_base(PyObject *bases) if (PyType_Ready(base_i) < 0) return NULL; } - if (!PyType_HasFeature(base_i, Py_TPFLAGS_BASETYPE)) { + if (!_PyType_HasFeature(base_i, Py_TPFLAGS_BASETYPE)) { PyErr_Format(PyExc_TypeError, "type '%.100s' is not an acceptable base type", base_i->tp_name); @@ -2338,29 +2389,6 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) assert(args != NULL && PyTuple_Check(args)); assert(kwds == NULL || PyDict_Check(kwds)); - /* Special case: type(x) should return x->ob_type */ - /* We only want type itself to accept the one-argument form (#27157) - Note: We don't call PyType_CheckExact as that also allows subclasses */ - if (metatype == &PyType_Type) { - const Py_ssize_t nargs = PyTuple_GET_SIZE(args); - const Py_ssize_t nkwds = kwds == NULL ? 0 : PyDict_GET_SIZE(kwds); - - if (nargs == 1 && nkwds == 0) { - PyObject *x = PyTuple_GET_ITEM(args, 0); - Py_INCREF(Py_TYPE(x)); - return (PyObject *) Py_TYPE(x); - } - - /* SF bug 475327 -- if that didn't trigger, we need 3 - arguments. but PyArg_ParseTuple below may give - a msg saying type() needs exactly 3. */ - if (nargs != 3) { - PyErr_SetString(PyExc_TypeError, - "type() takes 1 or 3 arguments"); - return NULL; - } - } - /* Check arguments: (name, bases, dict) */ if (!PyArg_ParseTuple(args, "UO!O!:type.__new__", &name, &PyTuple_Type, &bases, &PyDict_Type, &orig_dict)) @@ -2577,10 +2605,10 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) slots = NULL; /* Initialize tp_flags */ + // All heap types need GC, since we can create a reference cycle by storing + // an instance on one of its parents: type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE | - Py_TPFLAGS_BASETYPE; - if (base->tp_flags & Py_TPFLAGS_HAVE_GC) - type->tp_flags |= Py_TPFLAGS_HAVE_GC; + Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC; /* Initialize essential fields */ type->tp_as_async = &et->as_async; @@ -2646,6 +2674,9 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) if (qualname != NULL && _PyDict_DelItemId(dict, &PyId___qualname__) < 0) goto error; + /* Set ht_module */ + et->ht_module = NULL; + /* Set tp_doc to a copy of dict['__doc__'], if the latter is there and is a string. The __doc__ accessor will first look for tp_doc; if that fails, it will still look into __dict__. @@ -2777,21 +2808,11 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) } type->tp_dealloc = subtype_dealloc; - /* Enable GC unless this class is not adding new instance variables and - the base class did not use GC. */ - if ((base->tp_flags & Py_TPFLAGS_HAVE_GC) || - type->tp_basicsize > base->tp_basicsize) - type->tp_flags |= Py_TPFLAGS_HAVE_GC; - /* Always override allocation strategy to use regular heap */ type->tp_alloc = PyType_GenericAlloc; - if (type->tp_flags & Py_TPFLAGS_HAVE_GC) { - type->tp_free = PyObject_GC_Del; - type->tp_traverse = subtype_traverse; - type->tp_clear = subtype_clear; - } - else - type->tp_free = PyObject_Del; + type->tp_free = PyObject_GC_Del; + type->tp_traverse = subtype_traverse; + type->tp_clear = subtype_clear; /* store type in class' cell if one is supplied */ cell = _PyDict_GetItemIdWithError(dict, &PyId___classcell__); @@ -2847,22 +2868,45 @@ static const short slotoffsets[] = { PyObject * PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) +{ + return PyType_FromModuleAndSpec(NULL, spec, bases); +} + +PyObject * +PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) { PyHeapTypeObject *res; - PyMemberDef *memb; PyObject *modname; PyTypeObject *type, *base; - PyType_Slot *slot; - Py_ssize_t nmembers; - char *s, *res_start; + const PyType_Slot *slot; + Py_ssize_t nmembers, weaklistoffset, dictoffset, vectorcalloffset; + char *res_start; - nmembers = 0; + nmembers = weaklistoffset = dictoffset = vectorcalloffset = 0; for (slot = spec->slots; slot->slot; slot++) { if (slot->slot == Py_tp_members) { nmembers = 0; - for (memb = slot->pfunc; memb->name != NULL; memb++) { + for (const PyMemberDef *memb = slot->pfunc; memb->name != NULL; memb++) { nmembers++; + if (strcmp(memb->name, "__weaklistoffset__") == 0) { + // The PyMemberDef must be a Py_ssize_t and readonly + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + weaklistoffset = memb->offset; + } + if (strcmp(memb->name, "__dictoffset__") == 0) { + // The PyMemberDef must be a Py_ssize_t and readonly + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + dictoffset = memb->offset; + } + if (strcmp(memb->name, "__vectorcalloffset__") == 0) { + // The PyMemberDef must be a Py_ssize_t and readonly + assert(memb->type == T_PYSSIZET); + assert(memb->flags == READONLY); + vectorcalloffset = memb->offset; + } } } } @@ -2879,9 +2923,9 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) } /* Set the type name and qualname */ - s = strrchr(spec->name, '.'); + const char *s = strrchr(spec->name, '.'); if (s == NULL) - s = (char*)spec->name; + s = spec->name; else s++; @@ -2895,6 +2939,9 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) Py_INCREF(res->ht_qualname); type->tp_name = spec->name; + Py_XINCREF(module); + res->ht_module = module; + /* Adjust for empty tuple bases */ if (!bases) { base = &PyBaseObject_Type; @@ -2904,26 +2951,40 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) base = slot->pfunc; else if (slot->slot == Py_tp_bases) { bases = slot->pfunc; - Py_INCREF(bases); } } - if (!bases) + if (!bases) { bases = PyTuple_Pack(1, base); - if (!bases) + if (!bases) + goto fail; + } + else if (!PyTuple_Check(bases)) { + PyErr_SetString(PyExc_SystemError, "Py_tp_bases is not a tuple"); goto fail; + } + else { + Py_INCREF(bases); + } } - else + else if (!PyTuple_Check(bases)) { + PyErr_SetString(PyExc_SystemError, "bases is not a tuple"); + goto fail; + } + else { Py_INCREF(bases); + } /* Calculate best base, and check that all bases are type objects */ base = best_base(bases); if (base == NULL) { + Py_DECREF(bases); goto fail; } - if (!PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) { + if (!_PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) { PyErr_Format(PyExc_TypeError, "type '%.100s' is not an acceptable base type", base->tp_name); + Py_DECREF(bases); goto fail; } @@ -2935,7 +2996,6 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) type->tp_as_buffer = &res->as_buffer; /* Set tp_base and tp_bases */ type->tp_bases = bases; - bases = NULL; Py_INCREF(base); type->tp_base = base; @@ -2984,6 +3044,10 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) type->tp_dealloc = subtype_dealloc; } + if (vectorcalloffset) { + type->tp_vectorcall_offset = vectorcalloffset; + } + if (PyType_Ready(type) < 0) goto fail; @@ -2991,24 +3055,40 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) res->ht_cached_keys = _PyDict_NewKeysForClass(); } - /* Set type.__module__ */ - s = strrchr(spec->name, '.'); - if (s != NULL) { - int err; - modname = PyUnicode_FromStringAndSize( - spec->name, (Py_ssize_t)(s - spec->name)); - if (modname == NULL) { + if (weaklistoffset) { + type->tp_weaklistoffset = weaklistoffset; + if (PyDict_DelItemString((PyObject *)type->tp_dict, "__weaklistoffset__") < 0) goto fail; - } - err = _PyDict_SetItemId(type->tp_dict, &PyId___module__, modname); - Py_DECREF(modname); - if (err != 0) + } + if (dictoffset) { + type->tp_dictoffset = dictoffset; + if (PyDict_DelItemString((PyObject *)type->tp_dict, "__dictoffset__") < 0) goto fail; - } else { - if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, - "builtin type %.200s has no __module__ attribute", - spec->name)) + } + + /* Set type.__module__ */ + if (_PyDict_GetItemIdWithError(type->tp_dict, &PyId___module__) == NULL) { + if (PyErr_Occurred()) { goto fail; + } + s = strrchr(spec->name, '.'); + if (s != NULL) { + int err; + modname = PyUnicode_FromStringAndSize( + spec->name, (Py_ssize_t)(s - spec->name)); + if (modname == NULL) { + goto fail; + } + err = _PyDict_SetItemId(type->tp_dict, &PyId___module__, modname); + Py_DECREF(modname); + if (err != 0) + goto fail; + } else { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "builtin type %.200s has no __module__ attribute", + spec->name)) + goto fail; + } } return (PyObject*)res; @@ -3027,7 +3107,7 @@ PyType_FromSpec(PyType_Spec *spec) void * PyType_GetSlot(PyTypeObject *type, int slot) { - if (!PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE) || slot < 0) { + if (!_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE) || slot < 0) { PyErr_BadInternalCall(); return NULL; } @@ -3038,6 +3118,40 @@ PyType_GetSlot(PyTypeObject *type, int slot) return *(void**)(((char*)type) + slotoffsets[slot]); } +PyObject * +PyType_GetModule(PyTypeObject *type) +{ + assert(PyType_Check(type)); + if (!_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE)) { + PyErr_Format( + PyExc_TypeError, + "PyType_GetModule: Type '%s' is not a heap type", + type->tp_name); + return NULL; + } + + PyHeapTypeObject* et = (PyHeapTypeObject*)type; + if (!et->ht_module) { + PyErr_Format( + PyExc_TypeError, + "PyType_GetModule: Type '%s' has no associated module", + type->tp_name); + return NULL; + } + return et->ht_module; + +} + +void * +PyType_GetModuleState(PyTypeObject *type) +{ + PyObject *m = PyType_GetModule(type); + if (m == NULL) { + return NULL; + } + return PyModule_GetState(m); +} + /* Internal API to look for a name through the MRO, bypassing the method cache. This returns a borrowed reference, and might set an exception. 'error' is set to: -1: error with exception; 1: error without exception; 0: ok */ @@ -3107,12 +3221,12 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name) { PyObject *res; int error; - unsigned int h; +#ifdef MCACHE if (MCACHE_CACHEABLE_NAME(name) && - PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) { + _PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) { /* fast path */ - h = MCACHE_HASH_METHOD(type, name); + unsigned int h = MCACHE_HASH_METHOD(type, name); if (method_cache[h].version == type->tp_version_tag && method_cache[h].name == name) { #if MCACHE_STATS @@ -3121,6 +3235,7 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name) return method_cache[h].value; } } +#endif /* We may end up clearing live exceptions below, so make sure it's ours. */ assert(!PyErr_Occurred()); @@ -3142,8 +3257,9 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name) return NULL; } +#ifdef MCACHE if (MCACHE_CACHEABLE_NAME(name) && assign_version_tag(type)) { - h = MCACHE_HASH_METHOD(type, name); + unsigned int h = MCACHE_HASH_METHOD(type, name); method_cache[h].version = type->tp_version_tag; method_cache[h].value = res; /* borrowed */ Py_INCREF(name); @@ -3156,6 +3272,7 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name) #endif Py_SETREF(method_cache[h].name, name); } +#endif return res; } @@ -3178,7 +3295,7 @@ is_dunder_name(PyObject *name) int kind = PyUnicode_KIND(name); /* Special names contain at least "__x__" and are always ASCII. */ if (length > 4 && kind == PyUnicode_1BYTE_KIND) { - Py_UCS1 *characters = PyUnicode_1BYTE_DATA(name); + const Py_UCS1 *characters = PyUnicode_1BYTE_DATA(name); return ( ((characters[length-2] == '_') && (characters[length-1] == '_')) && ((characters[0] == '_') && (characters[1] == '_')) @@ -3200,7 +3317,7 @@ type_getattro(PyTypeObject *type, PyObject *name) if (!PyUnicode_Check(name)) { PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", - name->ob_type->tp_name); + Py_TYPE(name)->tp_name); return NULL; } @@ -3298,6 +3415,7 @@ type_setattro(PyTypeObject *type, PyObject *name, PyObject *value) if (name == NULL) return -1; } +#ifdef INTERN_NAME_STRINGS if (!PyUnicode_CHECK_INTERNED(name)) { PyUnicode_InternInPlace(&name); if (!PyUnicode_CHECK_INTERNED(name)) { @@ -3307,6 +3425,7 @@ type_setattro(PyTypeObject *type, PyObject *name, PyObject *value) return -1; } } +#endif } else { /* Will fail in _PyObject_GenericSetAttrWithDict. */ @@ -3360,8 +3479,10 @@ type_dealloc(PyTypeObject *type) Py_XDECREF(et->ht_name); Py_XDECREF(et->ht_qualname); Py_XDECREF(et->ht_slots); - if (et->ht_cached_keys) + if (et->ht_cached_keys) { _PyDictKeys_DecRef(et->ht_cached_keys); + } + Py_XDECREF(et->ht_module); Py_TYPE(type)->tp_free((PyObject *)type); } @@ -3541,9 +3662,9 @@ type_traverse(PyTypeObject *type, visitproc visit, void *arg) for heaptypes. */ if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { char msg[200]; - sprintf(msg, "type_traverse() called for non-heap type '%.100s'", + sprintf(msg, "type_traverse() called on non-heap type '%.100s'", type->tp_name); - Py_FatalError(msg); + _PyObject_ASSERT_FAILED_MSG((PyObject *)type, msg); } Py_VISIT(type->tp_dict); @@ -3551,6 +3672,7 @@ type_traverse(PyTypeObject *type, visitproc visit, void *arg) Py_VISIT(type->tp_mro); Py_VISIT(type->tp_bases); Py_VISIT(type->tp_base); + Py_VISIT(((PyHeapTypeObject *)type)->ht_module); /* There's no need to visit type->tp_subclasses or ((PyHeapTypeObject *)type)->ht_slots, because they can't be involved @@ -3572,10 +3694,13 @@ type_clear(PyTypeObject *type) the dict, so that other objects caught in a reference cycle don't start calling destroyed methods. - Otherwise, the only field we need to clear is tp_mro, which is + Otherwise, the we need to clear tp_mro, which is part of a hard cycle (its first element is the class itself) that won't be broken otherwise (it's a tuple and tuples don't have a - tp_clear handler). None of the other fields need to be + tp_clear handler). + We also need to clear ht_module, if present: the module usually holds a + reference to its class. None of the other fields need to be + cleared, and here's why: tp_cache: @@ -3600,8 +3725,11 @@ type_clear(PyTypeObject *type) ((PyHeapTypeObject *)type)->ht_cached_keys = NULL; _PyDictKeys_DecRef(cached_keys); } - if (type->tp_dict) + if (type->tp_dict) { PyDict_Clear(type->tp_dict); + } + Py_CLEAR(((PyHeapTypeObject *)type)->ht_module); + Py_CLEAR(type->tp_mro); return 0; @@ -3619,7 +3747,7 @@ PyTypeObject PyType_Type = { sizeof(PyHeapTypeObject), /* tp_basicsize */ sizeof(PyMemberDef), /* tp_itemsize */ (destructor)type_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ + offsetof(PyTypeObject, tp_vectorcall), /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ @@ -3634,7 +3762,8 @@ PyTypeObject PyType_Type = { (setattrofunc)type_setattro, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | - Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TYPE_SUBCLASS, /* tp_flags */ + Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TYPE_SUBCLASS | + Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ type_doc, /* tp_doc */ (traverseproc)type_traverse, /* tp_traverse */ (inquiry)type_clear, /* tp_clear */ @@ -3753,6 +3882,7 @@ object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) PyObject *joined; PyObject *comma; _Py_static_string(comma_id, ", "); + Py_ssize_t method_count; /* Compute ", ".join(sorted(type.__abstractmethods__)) into joined. */ @@ -3773,14 +3903,18 @@ object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; } joined = PyUnicode_Join(comma, sorted_methods); + method_count = PyObject_Length(sorted_methods); Py_DECREF(sorted_methods); if (joined == NULL) return NULL; + if (method_count == -1) + return NULL; PyErr_Format(PyExc_TypeError, "Can't instantiate abstract class %s " - "with abstract methods %U", + "with abstract method%s %U", type->tp_name, + method_count > 1 ? "s" : "", joined); Py_DECREF(joined); return NULL; @@ -3852,12 +3986,12 @@ object_richcompare(PyObject *self, PyObject *other, int op) case Py_NE: /* By default, __ne__() delegates to __eq__() and inverts the result, unless the latter returns NotImplemented. */ - if (self->ob_type->tp_richcompare == NULL) { + if (Py_TYPE(self)->tp_richcompare == NULL) { res = Py_NotImplemented; Py_INCREF(res); break; } - res = (*self->ob_type->tp_richcompare)(self, other, Py_EQ); + res = (*Py_TYPE(self)->tp_richcompare)(self, other, Py_EQ); if (res != NULL && res != Py_NotImplemented) { int ok = PyObject_IsTrue(res); Py_DECREF(res); @@ -4061,9 +4195,10 @@ object_set_class(PyObject *self, PyObject *value, void *closure) } if (compatible_for_assignment(oldto, newto, "__class__")) { - if (newto->tp_flags & Py_TPFLAGS_HEAPTYPE) + if (newto->tp_flags & Py_TPFLAGS_HEAPTYPE) { Py_INCREF(newto); - Py_TYPE(self) = newto; + } + Py_SET_TYPE(self, newto); if (oldto->tp_flags & Py_TPFLAGS_HEAPTYPE) Py_DECREF(oldto); return 0; @@ -4150,8 +4285,8 @@ _PyType_GetSlotNames(PyTypeObject *cls) /* Use _slotnames function from the copyreg module to find the slots by this class and its bases. This function will cache the result in __slotnames__. */ - slotnames = _PyObject_CallMethodIdObjArgs(copyreg, &PyId__slotnames, - cls, NULL); + slotnames = _PyObject_CallMethodIdOneArg(copyreg, &PyId__slotnames, + (PyObject *)cls); Py_DECREF(copyreg); if (slotnames == NULL) return NULL; @@ -4179,7 +4314,7 @@ _PyObject_GetState(PyObject *obj, int required) if (getstate == NULL) { PyObject *slotnames; - if (required && obj->ob_type->tp_itemsize) { + if (required && Py_TYPE(obj)->tp_itemsize) { PyErr_Format(PyExc_TypeError, "cannot pickle '%.200s' object", Py_TYPE(obj)->tp_name); @@ -4212,13 +4347,13 @@ _PyObject_GetState(PyObject *obj, int required) assert(slotnames == Py_None || PyList_Check(slotnames)); if (required) { Py_ssize_t basicsize = PyBaseObject_Type.tp_basicsize; - if (obj->ob_type->tp_dictoffset) + if (Py_TYPE(obj)->tp_dictoffset) basicsize += sizeof(PyObject *); - if (obj->ob_type->tp_weaklistoffset) + if (Py_TYPE(obj)->tp_weaklistoffset) basicsize += sizeof(PyObject *); if (slotnames != Py_None) basicsize += sizeof(PyObject *) * PyList_GET_SIZE(slotnames); - if (obj->ob_type->tp_basicsize > basicsize) { + if (Py_TYPE(obj)->tp_basicsize > basicsize) { Py_DECREF(slotnames); Py_DECREF(state); PyErr_Format(PyExc_TypeError, @@ -4430,7 +4565,7 @@ _PyObject_GetItemsIter(PyObject *obj, PyObject **listitems, PyObject *items; _Py_IDENTIFIER(items); - items = _PyObject_CallMethodIdObjArgs(obj, &PyId_items, NULL); + items = _PyObject_CallMethodIdNoArgs(obj, &PyId_items); if (items == NULL) { Py_CLEAR(*listitems); return -1; @@ -4689,7 +4824,7 @@ object___format___impl(PyObject *self, PyObject *format_spec) if (PyUnicode_GET_LENGTH(format_spec) > 0) { PyErr_Format(PyExc_TypeError, "unsupported format string passed to %.200s.__format__", - self->ob_type->tp_name); + Py_TYPE(self)->tp_name); return NULL; } return PyObject_Str(self); @@ -4708,10 +4843,10 @@ object___sizeof___impl(PyObject *self) Py_ssize_t res, isize; res = 0; - isize = self->ob_type->tp_itemsize; + isize = Py_TYPE(self)->tp_itemsize; if (isize > 0) res = Py_SIZE(self) * isize; - res += self->ob_type->tp_basicsize; + res += Py_TYPE(self)->tp_basicsize; return PyLong_FromSsize_t(res); } @@ -4758,7 +4893,7 @@ object___dir___impl(PyObject *self) if (_PyObject_LookupAttrId(self, &PyId___class__, &itsclass) < 0) { goto error; } - /* XXX(tomer): Perhaps fall back to obj->ob_type if no + /* XXX(tomer): Perhaps fall back to Py_TYPE(obj) if no __class__ exists? */ if (itsclass != NULL && merge_class_dict(dict, itsclass) < 0) goto error; @@ -5159,17 +5294,17 @@ inherit_slots(PyTypeObject *type, PyTypeObject *base) /* tp_hash see tp_richcompare */ { /* Always inherit tp_vectorcall_offset to support PyVectorcall_Call(). - * If _Py_TPFLAGS_HAVE_VECTORCALL is not inherited, then vectorcall + * If Py_TPFLAGS_HAVE_VECTORCALL is not inherited, then vectorcall * won't be used automatically. */ COPYSLOT(tp_vectorcall_offset); - /* Inherit _Py_TPFLAGS_HAVE_VECTORCALL for non-heap types + /* Inherit Py_TPFLAGS_HAVE_VECTORCALL for non-heap types * if tp_call is not overridden */ if (!type->tp_call && - (base->tp_flags & _Py_TPFLAGS_HAVE_VECTORCALL) && + (base->tp_flags & Py_TPFLAGS_HAVE_VECTORCALL) && !(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { - type->tp_flags |= _Py_TPFLAGS_HAVE_VECTORCALL; + type->tp_flags |= Py_TPFLAGS_HAVE_VECTORCALL; } COPYSLOT(tp_call); } @@ -5245,14 +5380,14 @@ PyType_Ready(PyTypeObject *type) /* Consistency checks for PEP 590: * - Py_TPFLAGS_METHOD_DESCRIPTOR requires tp_descr_get - * - _Py_TPFLAGS_HAVE_VECTORCALL requires tp_call and + * - Py_TPFLAGS_HAVE_VECTORCALL requires tp_call and * tp_vectorcall_offset > 0 * To avoid mistakes, we require this before inheriting. */ if (type->tp_flags & Py_TPFLAGS_METHOD_DESCRIPTOR) { _PyObject_ASSERT((PyObject *)type, type->tp_descr_get != NULL); } - if (type->tp_flags & _Py_TPFLAGS_HAVE_VECTORCALL) { + if (type->tp_flags & Py_TPFLAGS_HAVE_VECTORCALL) { _PyObject_ASSERT((PyObject *)type, type->tp_vectorcall_offset > 0); _PyObject_ASSERT((PyObject *)type, type->tp_call != NULL); } @@ -5298,8 +5433,9 @@ PyType_Ready(PyTypeObject *type) NULL when type is &PyBaseObject_Type, and we know its ob_type is not NULL (it's initialized to &PyType_Type). But coverity doesn't know that. */ - if (Py_TYPE(type) == NULL && base != NULL) - Py_TYPE(type) = Py_TYPE(base); + if (Py_IS_TYPE(type, NULL) && base != NULL) { + Py_SET_TYPE(type, Py_TYPE(base)); + } /* Initialize tp_bases */ bases = type->tp_bases; @@ -5372,7 +5508,7 @@ PyType_Ready(PyTypeObject *type) } /* Sanity check for tp_free. */ - if (PyType_IS_GC(type) && (type->tp_flags & Py_TPFLAGS_BASETYPE) && + if (_PyType_IS_GC(type) && (type->tp_flags & Py_TPFLAGS_BASETYPE) && (type->tp_free == NULL || type->tp_free == PyObject_Del)) { /* This base class needs to call tp_free, but doesn't have * one, or its tp_free is for non-gc'ed objects. @@ -6035,8 +6171,12 @@ tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds) PyTypeObject *type, *subtype, *staticbase; PyObject *arg0, *res; - if (self == NULL || !PyType_Check(self)) - Py_FatalError("__new__() called with non-type 'self'"); + if (self == NULL || !PyType_Check(self)) { + PyErr_Format(PyExc_SystemError, + "__new__() called with non-type 'self'"); + return NULL; + } + type = (PyTypeObject *)self; if (!PyTuple_Check(args) || PyTuple_GET_SIZE(args) < 1) { PyErr_Format(PyExc_TypeError, @@ -6123,17 +6263,18 @@ add_tp_new_wrapper(PyTypeObject *type) static PyObject * \ FUNCNAME(PyObject *self) \ { \ + PyObject* stack[1] = {self}; \ _Py_static_string(id, OPSTR); \ - return call_method(self, &id, NULL, 0); \ + return vectorcall_method(&id, stack, 1); \ } #define SLOT1(FUNCNAME, OPSTR, ARG1TYPE) \ static PyObject * \ FUNCNAME(PyObject *self, ARG1TYPE arg1) \ { \ - PyObject* stack[1] = {arg1}; \ + PyObject* stack[2] = {self, arg1}; \ _Py_static_string(id, OPSTR); \ - return call_method(self, &id, stack, 1); \ + return vectorcall_method(&id, stack, 2); \ } /* Boolean helper for SLOT1BINFULL(). @@ -6173,10 +6314,11 @@ method_is_overloaded(PyObject *left, PyObject *right, struct _Py_Identifier *nam static PyObject * \ FUNCNAME(PyObject *self, PyObject *other) \ { \ - PyObject* stack[1]; \ + PyObject* stack[2]; \ + PyThreadState *tstate = _PyThreadState_GET(); \ _Py_static_string(op_id, OPSTR); \ _Py_static_string(rop_id, ROPSTR); \ - int do_other = Py_TYPE(self) != Py_TYPE(other) && \ + int do_other = !Py_IS_TYPE(self, Py_TYPE(other)) && \ Py_TYPE(other)->tp_as_number != NULL && \ Py_TYPE(other)->tp_as_number->SLOTNAME == TESTFUNC; \ if (Py_TYPE(self)->tp_as_number != NULL && \ @@ -6188,24 +6330,27 @@ FUNCNAME(PyObject *self, PyObject *other) \ return NULL; \ } \ if (ok) { \ - stack[0] = self; \ - r = call_maybe(other, &rop_id, stack, 1); \ + stack[0] = other; \ + stack[1] = self; \ + r = vectorcall_maybe(tstate, &rop_id, stack, 2); \ if (r != Py_NotImplemented) \ return r; \ Py_DECREF(r); \ do_other = 0; \ } \ } \ - stack[0] = other; \ - r = call_maybe(self, &op_id, stack, 1); \ + stack[0] = self; \ + stack[1] = other; \ + r = vectorcall_maybe(tstate, &op_id, stack, 2); \ if (r != Py_NotImplemented || \ - Py_TYPE(other) == Py_TYPE(self)) \ + Py_IS_TYPE(other, Py_TYPE(self))) \ return r; \ Py_DECREF(r); \ } \ if (do_other) { \ - stack[0] = self; \ - return call_maybe(other, &rop_id, stack, 1); \ + stack[0] = other; \ + stack[1] = self; \ + return vectorcall_maybe(tstate, &rop_id, stack, 2); \ } \ Py_RETURN_NOTIMPLEMENTED; \ } @@ -6216,7 +6361,8 @@ FUNCNAME(PyObject *self, PyObject *other) \ static Py_ssize_t slot_sq_length(PyObject *self) { - PyObject *res = call_method(self, &PyId___len__, NULL, 0); + PyObject* stack[1] = {self}; + PyObject *res = vectorcall_method(&PyId___len__, stack, 1); Py_ssize_t len; if (res == NULL) @@ -6243,14 +6389,12 @@ slot_sq_length(PyObject *self) static PyObject * slot_sq_item(PyObject *self, Py_ssize_t i) { - PyObject *retval; - PyObject *args[1]; PyObject *ival = PyLong_FromSsize_t(i); if (ival == NULL) { return NULL; } - args[0] = ival; - retval = call_method(self, &PyId___getitem__, args, 1); + PyObject *stack[2] = {self, ival}; + PyObject *retval = vectorcall_method(&PyId___getitem__, stack, 2); Py_DECREF(ival); return retval; } @@ -6258,7 +6402,7 @@ slot_sq_item(PyObject *self, Py_ssize_t i) static int slot_sq_ass_item(PyObject *self, Py_ssize_t index, PyObject *value) { - PyObject *stack[2]; + PyObject *stack[3]; PyObject *res; PyObject *index_obj; @@ -6267,13 +6411,14 @@ slot_sq_ass_item(PyObject *self, Py_ssize_t index, PyObject *value) return -1; } - stack[0] = index_obj; + stack[0] = self; + stack[1] = index_obj; if (value == NULL) { - res = call_method(self, &PyId___delitem__, stack, 1); + res = vectorcall_method(&PyId___delitem__, stack, 2); } else { - stack[1] = value; - res = call_method(self, &PyId___setitem__, stack, 2); + stack[2] = value; + res = vectorcall_method(&PyId___setitem__, stack, 3); } Py_DECREF(index_obj); @@ -6287,6 +6432,7 @@ slot_sq_ass_item(PyObject *self, Py_ssize_t index, PyObject *value) static int slot_sq_contains(PyObject *self, PyObject *value) { + PyThreadState *tstate = _PyThreadState_GET(); PyObject *func, *res; int result = -1, unbound; _Py_IDENTIFIER(__contains__); @@ -6300,8 +6446,8 @@ slot_sq_contains(PyObject *self, PyObject *value) return -1; } if (func != NULL) { - PyObject *args[1] = {value}; - res = call_unbound(unbound, func, self, args, 1); + PyObject *args[2] = {self, value}; + res = vectorcall_unbound(tstate, unbound, func, args, 2); Py_DECREF(func); if (res != NULL) { result = PyObject_IsTrue(res); @@ -6323,16 +6469,17 @@ SLOT1(slot_mp_subscript, "__getitem__", PyObject *) static int slot_mp_ass_subscript(PyObject *self, PyObject *key, PyObject *value) { - PyObject *stack[2]; + PyObject *stack[3]; PyObject *res; - stack[0] = key; + stack[0] = self; + stack[1] = key; if (value == NULL) { - res = call_method(self, &PyId___delitem__, stack, 1); + res = vectorcall_method(&PyId___delitem__, stack, 2); } else { - stack[1] = value; - res = call_method(self, &PyId___setitem__, stack, 2); + stack[2] = value; + res = vectorcall_method(&PyId___setitem__, stack, 3); } if (res == NULL) @@ -6365,8 +6512,8 @@ slot_nb_power(PyObject *self, PyObject *other, PyObject *modulus) slot_nb_power, so check before calling self.__pow__. */ if (Py_TYPE(self)->tp_as_number != NULL && Py_TYPE(self)->tp_as_number->nb_power == slot_nb_power) { - PyObject* stack[2] = {other, modulus}; - return call_method(self, &PyId___pow__, stack, 2); + PyObject* stack[3] = {self, other, modulus}; + return vectorcall_method(&PyId___pow__, stack, 3); } Py_RETURN_NOTIMPLEMENTED; } @@ -6433,7 +6580,8 @@ static PyObject * slot_nb_index(PyObject *self) { _Py_IDENTIFIER(__index__); - return call_method(self, &PyId___index__, NULL, 0); + PyObject *stack[1] = {self}; + return vectorcall_method(&PyId___index__, stack, 1); } @@ -6455,9 +6603,9 @@ SLOT1(slot_nb_inplace_remainder, "__imod__", PyObject *) static PyObject * slot_nb_inplace_power(PyObject *self, PyObject * arg1, PyObject *arg2) { - PyObject *stack[1] = {arg1}; + PyObject *stack[2] = {self, arg1}; _Py_IDENTIFIER(__ipow__); - return call_method(self, &PyId___ipow__, stack, 1); + return vectorcall_method(&PyId___ipow__, stack, 2); } SLOT1(slot_nb_inplace_lshift, "__ilshift__", PyObject *) SLOT1(slot_nb_inplace_rshift, "__irshift__", PyObject *) @@ -6541,19 +6689,21 @@ slot_tp_hash(PyObject *self) static PyObject * slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds) { + PyThreadState *tstate = _PyThreadState_GET(); _Py_IDENTIFIER(__call__); int unbound; - PyObject *meth = lookup_method(self, &PyId___call__, &unbound); - PyObject *res; - if (meth == NULL) + PyObject *meth = lookup_method(self, &PyId___call__, &unbound); + if (meth == NULL) { return NULL; + } + PyObject *res; if (unbound) { - res = _PyObject_Call_Prepend(meth, self, args, kwds); + res = _PyObject_Call_Prepend(tstate, meth, self, args, kwds); } else { - res = PyObject_Call(meth, args, kwds); + res = _PyObject_Call(tstate, meth, args, kwds); } Py_DECREF(meth); @@ -6574,8 +6724,8 @@ slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds) static PyObject * slot_tp_getattro(PyObject *self, PyObject *name) { - PyObject *stack[1] = {name}; - return call_method(self, &PyId___getattribute__, stack, 1); + PyObject *stack[2] = {self, name}; + return vectorcall_method(&PyId___getattribute__, stack, 2); } static PyObject * @@ -6591,7 +6741,7 @@ call_attribute(PyObject *self, PyObject *attr, PyObject *name) else attr = descr; } - res = PyObject_CallFunctionObjArgs(attr, name, NULL); + res = PyObject_CallOneArg(attr, name); Py_XDECREF(descr); return res; } @@ -6622,7 +6772,7 @@ slot_tp_getattr_hook(PyObject *self, PyObject *name) needed, with call_attribute. */ getattribute = _PyType_LookupId(tp, &PyId___getattribute__); if (getattribute == NULL || - (Py_TYPE(getattribute) == &PyWrapperDescr_Type && + (Py_IS_TYPE(getattribute, &PyWrapperDescr_Type) && ((PyWrapperDescrObject *)getattribute)->d_wrapped == (void *)PyObject_GenericGetAttr)) res = PyObject_GenericGetAttr(self, name); @@ -6642,18 +6792,19 @@ slot_tp_getattr_hook(PyObject *self, PyObject *name) static int slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value) { - PyObject *stack[2]; + PyObject *stack[3]; PyObject *res; _Py_IDENTIFIER(__delattr__); _Py_IDENTIFIER(__setattr__); - stack[0] = name; + stack[0] = self; + stack[1] = name; if (value == NULL) { - res = call_method(self, &PyId___delattr__, stack, 1); + res = vectorcall_method(&PyId___delattr__, stack, 2); } else { - stack[1] = value; - res = call_method(self, &PyId___setattr__, stack, 2); + stack[2] = value; + res = vectorcall_method(&PyId___setattr__, stack, 3); } if (res == NULL) return -1; @@ -6662,28 +6813,28 @@ slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value) } static _Py_Identifier name_op[] = { - {0, "__lt__", 0}, - {0, "__le__", 0}, - {0, "__eq__", 0}, - {0, "__ne__", 0}, - {0, "__gt__", 0}, - {0, "__ge__", 0} + _Py_static_string_init("__lt__"), + _Py_static_string_init("__le__"), + _Py_static_string_init("__eq__"), + _Py_static_string_init("__ne__"), + _Py_static_string_init("__gt__"), + _Py_static_string_init("__ge__"), }; static PyObject * slot_tp_richcompare(PyObject *self, PyObject *other, int op) { - int unbound; - PyObject *func, *res; + PyThreadState *tstate = _PyThreadState_GET(); - func = lookup_maybe_method(self, &name_op[op], &unbound); + int unbound; + PyObject *func = lookup_maybe_method(self, &name_op[op], &unbound); if (func == NULL) { PyErr_Clear(); Py_RETURN_NOTIMPLEMENTED; } - PyObject *args[1] = {other}; - res = call_unbound(unbound, func, self, args, 1); + PyObject *stack[2] = {self, other}; + PyObject *res = vectorcall_unbound(tstate, unbound, func, stack, 2); Py_DECREF(func); return res; } @@ -6726,7 +6877,8 @@ static PyObject * slot_tp_iternext(PyObject *self) { _Py_IDENTIFIER(__next__); - return call_method(self, &PyId___next__, NULL, 0); + PyObject *stack[1] = {self}; + return vectorcall_method(&PyId___next__, stack, 1); } static PyObject * @@ -6754,18 +6906,19 @@ slot_tp_descr_get(PyObject *self, PyObject *obj, PyObject *type) static int slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value) { - PyObject* stack[2]; + PyObject* stack[3]; PyObject *res; _Py_IDENTIFIER(__delete__); _Py_IDENTIFIER(__set__); - stack[0] = target; + stack[0] = self; + stack[1] = target; if (value == NULL) { - res = call_method(self, &PyId___delete__, stack, 1); + res = vectorcall_method(&PyId___delete__, stack, 2); } else { - stack[1] = value; - res = call_method(self, &PyId___set__, stack, 2); + stack[2] = value; + res = vectorcall_method(&PyId___set__, stack, 3); } if (res == NULL) return -1; @@ -6776,18 +6929,21 @@ slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value) static int slot_tp_init(PyObject *self, PyObject *args, PyObject *kwds) { + PyThreadState *tstate = _PyThreadState_GET(); + _Py_IDENTIFIER(__init__); int unbound; PyObject *meth = lookup_method(self, &PyId___init__, &unbound); - PyObject *res; - - if (meth == NULL) + if (meth == NULL) { return -1; + } + + PyObject *res; if (unbound) { - res = _PyObject_Call_Prepend(meth, self, args, kwds); + res = _PyObject_Call_Prepend(tstate, meth, self, args, kwds); } else { - res = PyObject_Call(meth, args, kwds); + res = _PyObject_Call(tstate, meth, args, kwds); } Py_DECREF(meth); if (res == NULL) @@ -6806,6 +6962,7 @@ slot_tp_init(PyObject *self, PyObject *args, PyObject *kwds) static PyObject * slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { + PyThreadState *tstate = _PyThreadState_GET(); PyObject *func, *result; func = _PyObject_GetAttrId((PyObject *)type, &PyId___new__); @@ -6813,7 +6970,7 @@ slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; } - result = _PyObject_Call_Prepend(func, (PyObject *)type, args, kwds); + result = _PyObject_Call_Prepend(tstate, func, (PyObject *)type, args, kwds); Py_DECREF(func); return result; } @@ -6909,7 +7066,8 @@ which incorporates the additional structures used for numbers, sequences and mappings. Note that multiple names may map to the same slot (e.g. __eq__, __ne__ etc. all map to tp_richcompare) and one name may map to multiple slots (e.g. __str__ affects tp_str as well as tp_repr). The table is terminated with -an all-zero entry. (This table is further initialized in init_slotdefs().) +an all-zero entry. (This table is further initialized in +_PyTypes_InitSlotDefs().) */ typedef struct wrapperbase slotdef; @@ -7217,8 +7375,9 @@ resolve_slotdups(PyTypeObject *type, PyObject *name) *pp = NULL; } - /* Look in all matching slots of the type; if exactly one of these has - a filled-in slot, return its value. Otherwise return NULL. */ + /* Look in all slots of the type matching the name. If exactly one of these + has a filled-in slot, return a pointer to that slot. + Otherwise, return NULL. */ res = NULL; for (pp = ptrs; *pp; pp++) { ptr = slotptr(type, (*pp)->offset); @@ -7231,12 +7390,61 @@ resolve_slotdups(PyTypeObject *type, PyObject *name) return res; } -/* Common code for update_slots_callback() and fixup_slot_dispatchers(). This - does some incredibly complex thinking and then sticks something into the - slot. (It sees if the adjacent slotdefs for the same slot have conflicting - interests, and then stores a generic wrapper or a specific function into - the slot.) Return a pointer to the next slotdef with a different offset, - because that's convenient for fixup_slot_dispatchers(). */ + +/* Common code for update_slots_callback() and fixup_slot_dispatchers(). + * + * This is meant to set a "slot" like type->tp_repr or + * type->tp_as_sequence->sq_concat by looking up special methods like + * __repr__ or __add__. The opposite (adding special methods from slots) is + * done by add_operators(), called from PyType_Ready(). Since update_one_slot() + * calls PyType_Ready() if needed, the special methods are already in place. + * + * The special methods corresponding to each slot are defined in the "slotdef" + * array. Note that one slot may correspond to multiple special methods and vice + * versa. For example, tp_richcompare uses 6 methods __lt__, ..., __ge__ and + * tp_as_number->nb_add uses __add__ and __radd__. In the other direction, + * __add__ is used by the number and sequence protocols and __getitem__ by the + * sequence and mapping protocols. This causes a lot of complications. + * + * In detail, update_one_slot() does the following: + * + * First of all, if the slot in question does not exist, return immediately. + * This can happen for example if it's tp_as_number->nb_add but tp_as_number + * is NULL. + * + * For the given slot, we loop over all the special methods with a name + * corresponding to that slot (for example, for tp_descr_set, this would be + * __set__ and __delete__) and we look up these names in the MRO of the type. + * If we don't find any special method, the slot is set to NULL (regardless of + * what was in the slot before). + * + * Suppose that we find exactly one special method. If it's a wrapper_descriptor + * (i.e. a special method calling a slot, for example str.__repr__ which calls + * the tp_repr for the 'str' class) with the correct name ("__repr__" for + * tp_repr), for the right class, calling the right wrapper C function (like + * wrap_unaryfunc for tp_repr), then the slot is set to the slot that the + * wrapper_descriptor originally wrapped. For example, a class inheriting + * from 'str' and not redefining __repr__ will have tp_repr set to the tp_repr + * of 'str'. + * In all other cases where the special method exists, the slot is set to a + * wrapper calling the special method. There is one exception: if the special + * method is a wrapper_descriptor with the correct name but the type has + * precisely one slot set for that name and that slot is not the one that we + * are updating, then NULL is put in the slot (this exception is the only place + * in update_one_slot() where the *existing* slots matter). + * + * When there are multiple special methods for the same slot, the above is + * applied for each special method. As long as the results agree, the common + * resulting slot is applied. If the results disagree, then a wrapper for + * the special methods is installed. This is always safe, but less efficient + * because it uses method lookup instead of direct C calls. + * + * There are some further special cases for specific slots, like supporting + * __hash__ = None for tp_hash and special code for tp_new. + * + * When done, return a pointer to the next slotdef with a different offset, + * because that's convenient for fixup_slot_dispatchers(). This function never + * sets an exception: if an internal error happens (unlikely), it's ignored. */ static slotdef * update_one_slot(PyTypeObject *type, slotdef *p) { @@ -7261,7 +7469,7 @@ update_one_slot(PyTypeObject *type, slotdef *p) descr = find_name_in_mro(type, p->name_strobj, &error); if (descr == NULL) { if (error == -1) { - /* It is unlikely by not impossible that there has been an exception + /* It is unlikely but not impossible that there has been an exception during lookup. Since this function originally expected no errors, we ignore them here in order to keep up the interface. */ PyErr_Clear(); @@ -7271,7 +7479,7 @@ update_one_slot(PyTypeObject *type, slotdef *p) } continue; } - if (Py_TYPE(descr) == &PyWrapperDescr_Type && + if (Py_IS_TYPE(descr, &PyWrapperDescr_Type) && ((PyWrapperDescrObject *)descr)->d_base->name_strobj == p->name_strobj) { void **tptr = resolve_slotdups(type, p->name_strobj); if (tptr == NULL || tptr == ptr) @@ -7294,7 +7502,7 @@ update_one_slot(PyTypeObject *type, slotdef *p) use_generic = 1; } } - else if (Py_TYPE(descr) == &PyCFunction_Type && + else if (Py_IS_TYPE(descr, &PyCFunction_Type) && PyCFunction_GET_FUNCTION(descr) == (PyCFunction)(void(*)(void))tp_new_wrapper && ptr == (void**)&type->tp_new) @@ -7350,28 +7558,36 @@ update_slots_callback(PyTypeObject *type, void *data) static int slotdefs_initialized = 0; /* Initialize the slotdefs table by adding interned string objects for the names. */ -static void -init_slotdefs(void) +PyStatus +_PyTypes_InitSlotDefs(void) { - slotdef *p; + if (slotdefs_initialized) { + return _PyStatus_OK(); + } - if (slotdefs_initialized) - return; - for (p = slotdefs; p->name; p++) { + for (slotdef *p = slotdefs; p->name; p++) { /* Slots must be ordered by their offset in the PyHeapTypeObject. */ assert(!p[1].name || p->offset <= p[1].offset); +#ifdef INTERN_NAME_STRINGS p->name_strobj = PyUnicode_InternFromString(p->name); - if (!p->name_strobj || !PyUnicode_CHECK_INTERNED(p->name_strobj)) - Py_FatalError("Out of memory interning slotdef names"); + if (!p->name_strobj || !PyUnicode_CHECK_INTERNED(p->name_strobj)) { + return _PyStatus_NO_MEMORY(); + } +#else + p->name_strobj = PyUnicode_FromString(p->name); + if (!p->name_strobj) { + return _PyStatus_NO_MEMORY(); + } +#endif } slotdefs_initialized = 1; + return _PyStatus_OK(); } -/* Undo init_slotdefs, releasing the interned strings. */ +/* Undo _PyTypes_InitSlotDefs(), releasing the interned strings. */ static void clear_slotdefs(void) { - slotdef *p; - for (p = slotdefs; p->name; p++) { + for (slotdef *p = slotdefs; p->name; p++) { Py_CLEAR(p->name_strobj); } slotdefs_initialized = 0; @@ -7387,9 +7603,11 @@ update_slot(PyTypeObject *type, PyObject *name) int offset; assert(PyUnicode_CheckExact(name)); +#ifdef INTERN_NAME_STRINGS assert(PyUnicode_CHECK_INTERNED(name)); +#endif - init_slotdefs(); + assert(slotdefs_initialized); pp = ptrs; for (p = slotdefs; p->name; p++) { if (p->name_strobj == name) @@ -7417,7 +7635,7 @@ fixup_slot_dispatchers(PyTypeObject *type) { slotdef *p; - init_slotdefs(); + assert(slotdefs_initialized); for (p = slotdefs; p->name; ) p = update_one_slot(type, p); } @@ -7430,7 +7648,7 @@ update_all_slots(PyTypeObject* type) /* Clear the VALID_VERSION flag of 'type' and all its subclasses. */ PyType_Modified(type); - init_slotdefs(); + assert(slotdefs_initialized); for (p = slotdefs; p->name; p++) { /* update_slot returns int but can't actually fail */ update_slot(type, p->name_strobj); @@ -7457,7 +7675,7 @@ set_names(PyTypeObject *type) _PyErr_FormatFromCause(PyExc_RuntimeError, "Error calling __set_name__ on '%.100s' instance %R " "in '%.100s'", - value->ob_type->tp_name, key, type->tp_name); + Py_TYPE(value)->tp_name, key, type->tp_name); Py_DECREF(names_to_set); return -1; } @@ -7493,7 +7711,7 @@ init_subclass(PyTypeObject *type, PyObject *kwds) } - result = _PyObject_FastCallDict(func, NULL, 0, kwds); + result = PyObject_VectorcallDict(func, NULL, 0, kwds); Py_DECREF(func); if (result == NULL) { return -1; @@ -7590,7 +7808,7 @@ add_operators(PyTypeObject *type) PyObject *descr; void **ptr; - init_slotdefs(); + assert(slotdefs_initialized); for (p = slotdefs; p->name; p++) { if (p->wrapper == NULL) continue; @@ -7819,7 +8037,7 @@ super_descr_get(PyObject *self, PyObject *obj, PyObject *type) Py_INCREF(self); return self; } - if (Py_TYPE(su) != &PySuper_Type) + if (!Py_IS_TYPE(su, &PySuper_Type)) /* If su is an instance of a (strict) subclass of super, call its type */ return PyObject_CallFunctionObjArgs((PyObject *)Py_TYPE(su), @@ -7842,6 +8060,83 @@ super_descr_get(PyObject *self, PyObject *obj, PyObject *type) } } +static int +super_init_without_args(PyFrameObject *f, PyCodeObject *co, + PyTypeObject **type_p, PyObject **obj_p) +{ + if (co->co_argcount == 0) { + PyErr_SetString(PyExc_RuntimeError, + "super(): no arguments"); + return -1; + } + + PyObject *obj = f->f_localsplus[0]; + Py_ssize_t i, n; + if (obj == NULL && co->co_cell2arg) { + /* The first argument might be a cell. */ + n = PyTuple_GET_SIZE(co->co_cellvars); + for (i = 0; i < n; i++) { + if (co->co_cell2arg[i] == 0) { + PyObject *cell = f->f_localsplus[co->co_nlocals + i]; + assert(PyCell_Check(cell)); + obj = PyCell_GET(cell); + break; + } + } + } + if (obj == NULL) { + PyErr_SetString(PyExc_RuntimeError, + "super(): arg[0] deleted"); + return -1; + } + + if (co->co_freevars == NULL) { + n = 0; + } + else { + assert(PyTuple_Check(co->co_freevars)); + n = PyTuple_GET_SIZE(co->co_freevars); + } + + PyTypeObject *type = NULL; + for (i = 0; i < n; i++) { + PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i); + assert(PyUnicode_Check(name)); + if (_PyUnicode_EqualToASCIIId(name, &PyId___class__)) { + Py_ssize_t index = co->co_nlocals + + PyTuple_GET_SIZE(co->co_cellvars) + i; + PyObject *cell = f->f_localsplus[index]; + if (cell == NULL || !PyCell_Check(cell)) { + PyErr_SetString(PyExc_RuntimeError, + "super(): bad __class__ cell"); + return -1; + } + type = (PyTypeObject *) PyCell_GET(cell); + if (type == NULL) { + PyErr_SetString(PyExc_RuntimeError, + "super(): empty __class__ cell"); + return -1; + } + if (!PyType_Check(type)) { + PyErr_Format(PyExc_RuntimeError, + "super(): __class__ is not a type (%s)", + Py_TYPE(type)->tp_name); + return -1; + } + break; + } + } + if (type == NULL) { + PyErr_SetString(PyExc_RuntimeError, + "super(): __class__ cell not found"); + return -1; + } + + *type_p = type; + *obj_p = obj; + return 0; +} + static int super_init(PyObject *self, PyObject *args, PyObject *kwds) { @@ -7858,80 +8153,20 @@ super_init(PyObject *self, PyObject *args, PyObject *kwds) if (type == NULL) { /* Call super(), without args -- fill in from __class__ and first local variable on the stack. */ - PyFrameObject *f; - PyCodeObject *co; - Py_ssize_t i, n; - f = _PyThreadState_GET()->frame; - if (f == NULL) { + PyThreadState *tstate = _PyThreadState_GET(); + PyFrameObject *frame = PyThreadState_GetFrame(tstate); + if (frame == NULL) { PyErr_SetString(PyExc_RuntimeError, "super(): no current frame"); return -1; } - co = f->f_code; - if (co == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "super(): no code object"); - return -1; - } - if (co->co_argcount == 0) { - PyErr_SetString(PyExc_RuntimeError, - "super(): no arguments"); - return -1; - } - obj = f->f_localsplus[0]; - if (obj == NULL && co->co_cell2arg) { - /* The first argument might be a cell. */ - n = PyTuple_GET_SIZE(co->co_cellvars); - for (i = 0; i < n; i++) { - if (co->co_cell2arg[i] == 0) { - PyObject *cell = f->f_localsplus[co->co_nlocals + i]; - assert(PyCell_Check(cell)); - obj = PyCell_GET(cell); - break; - } - } - } - if (obj == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "super(): arg[0] deleted"); - return -1; - } - if (co->co_freevars == NULL) - n = 0; - else { - assert(PyTuple_Check(co->co_freevars)); - n = PyTuple_GET_SIZE(co->co_freevars); - } - for (i = 0; i < n; i++) { - PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i); - assert(PyUnicode_Check(name)); - if (_PyUnicode_EqualToASCIIId(name, &PyId___class__)) { - Py_ssize_t index = co->co_nlocals + - PyTuple_GET_SIZE(co->co_cellvars) + i; - PyObject *cell = f->f_localsplus[index]; - if (cell == NULL || !PyCell_Check(cell)) { - PyErr_SetString(PyExc_RuntimeError, - "super(): bad __class__ cell"); - return -1; - } - type = (PyTypeObject *) PyCell_GET(cell); - if (type == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "super(): empty __class__ cell"); - return -1; - } - if (!PyType_Check(type)) { - PyErr_Format(PyExc_RuntimeError, - "super(): __class__ is not a type (%s)", - Py_TYPE(type)->tp_name); - return -1; - } - break; - } - } - if (type == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "super(): __class__ cell not found"); + + PyCodeObject *code = PyFrame_GetCode(frame); + int res = super_init_without_args(frame, code, &type, &obj); + Py_DECREF(frame); + Py_DECREF(code); + + if (res < 0) { return -1; } } diff --git a/Objects/typeslots.inc b/Objects/typeslots.inc index dc750cc0c41975963fb3af1a94286c6a2e356e5f..ffc9bb2e1c7710bc3ed96ccd4183a8bc5f910048 100644 --- a/Objects/typeslots.inc +++ b/Objects/typeslots.inc @@ -1,6 +1,6 @@ /* Generated by typeslots.py */ -0, -0, +offsetof(PyHeapTypeObject, as_buffer.bf_getbuffer), +offsetof(PyHeapTypeObject, as_buffer.bf_releasebuffer), offsetof(PyHeapTypeObject, as_mapping.mp_ass_subscript), offsetof(PyHeapTypeObject, as_mapping.mp_length), offsetof(PyHeapTypeObject, as_mapping.mp_subscript), diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 4c2b42f959b838b56d4dc5f33af012d030fc3a6f..ffd13f7dd3892a97140995b998177a068c896dbb 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -40,13 +40,16 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "pycore_initconfig.h" +#include "pycore_abstract.h" // _PyIndex_Check() +#include "pycore_bytes_methods.h" #include "pycore_fileutils.h" +#include "pycore_initconfig.h" +#include "pycore_interp.h" // PyInterpreterState.fs_codec #include "pycore_object.h" +#include "pycore_pathconfig.h" #include "pycore_pylifecycle.h" -#include "pycore_pystate.h" +#include "pycore_pystate.h" // _PyInterpreterState_GET() #include "ucnhash.h" -#include "bytes_methods.h" #include "stringlib/eq.h" #ifdef MS_WINDOWS @@ -117,6 +120,13 @@ extern "C" { _PyUnicode_UTF8_LENGTH(op)) #define _PyUnicode_WSTR(op) \ (((PyASCIIObject*)(op))->wstr) + +/* Don't use deprecated macro of unicodeobject.h */ +#undef PyUnicode_WSTR_LENGTH +#define PyUnicode_WSTR_LENGTH(op) \ + (PyUnicode_IS_COMPACT_ASCII(op) ? \ + ((PyASCIIObject*)op)->length : \ + ((PyCompactUnicodeObject*)op)->wstr_length) #define _PyUnicode_WSTR_LENGTH(op) \ (((PyCompactUnicodeObject*)(op))->wstr_length) #define _PyUnicode_LENGTH(op) \ @@ -195,6 +205,8 @@ extern "C" { # define OVERALLOCATE_FACTOR 4 #endif +#define INTERNED_STRINGS + /* This dictionary holds all interned unicode strings. Note that references to strings in this dictionary are *not* counted in the string's ob_refcnt. When the interned string reaches a refcnt of 0 the string deallocation @@ -203,7 +215,9 @@ extern "C" { Another way to look at this is that to say that the actual reference count of a string is: s->ob_refcnt + (s->state ? 2 : 0) */ +#ifdef INTERNED_STRINGS static PyObject *interned = NULL; +#endif /* The empty Unicode object is shared to improve performance. */ static PyObject *unicode_empty = NULL; @@ -265,6 +279,8 @@ unicode_fill(enum PyUnicode_Kind kind, void *data, Py_UCS4 value, /* Forward declaration */ static inline int _PyUnicodeWriter_WriteCharInline(_PyUnicodeWriter *writer, Py_UCS4 ch); +static inline void +_PyUnicodeWriter_InitWithBuffer(_PyUnicodeWriter *writer, PyObject *buffer); static PyObject * unicode_encode_utf8(PyObject *unicode, _Py_error_handler error_handler, const char *errors); @@ -276,9 +292,13 @@ unicode_decode_utf8(const char *s, Py_ssize_t size, /* List of static strings. */ static _Py_Identifier *static_strings = NULL; +#define LATIN1_SINGLETONS + +#ifdef LATIN1_SINGLETONS /* Single character Unicode strings in the Latin-1 range are being shared as well. */ static PyObject *unicode_latin1[256] = {NULL}; +#endif /* Fast detection of the most frequent whitespace characters */ const unsigned char _Py_ascii_whitespace[] = { @@ -425,6 +445,54 @@ get_error_handler_wide(const wchar_t *errors) } +static inline int +unicode_check_encoding_errors(const char *encoding, const char *errors) +{ + if (encoding == NULL && errors == NULL) { + return 0; + } + + PyInterpreterState *interp = _PyInterpreterState_GET(); +#ifndef Py_DEBUG + /* In release mode, only check in development mode (-X dev) */ + if (!_PyInterpreterState_GetConfig(interp)->dev_mode) { + return 0; + } +#else + /* Always check in debug mode */ +#endif + + /* Avoid calling _PyCodec_Lookup() and PyCodec_LookupError() before the + codec registry is ready: before_PyUnicode_InitEncodings() is called. */ + if (!interp->unicode.fs_codec.encoding) { + return 0; + } + + /* Disable checks during Python finalization. For example, it allows to + call _PyObject_Dump() during finalization for debugging purpose. */ + if (interp->finalizing) { + return 0; + } + + if (encoding != NULL) { + PyObject *handler = _PyCodec_Lookup(encoding); + if (handler == NULL) { + return -1; + } + Py_DECREF(handler); + } + + if (errors != NULL) { + PyObject *handler = PyCodec_LookupError(errors); + if (handler == NULL) { + return -1; + } + Py_DECREF(handler); + } + return 0; +} + + /* The max unicode value is always 0x10FFFF while using the PEP-393 API. This function is kept for backward compatibility with the old API. */ Py_UNICODE @@ -526,7 +594,7 @@ _PyUnicode_CheckConsistency(PyObject *op, int check_content) if (check_content && kind != PyUnicode_WCHAR_KIND) { Py_ssize_t i; Py_UCS4 maxchar = 0; - void *data; + const void *data; Py_UCS4 ch; data = PyUnicode_DATA(ascii); @@ -609,8 +677,9 @@ unicode_result_ready(PyObject *unicode) return unicode_empty; } +#ifdef LATIN1_SINGLETONS if (length == 1) { - void *data = PyUnicode_DATA(unicode); + const void *data = PyUnicode_DATA(unicode); int kind = PyUnicode_KIND(unicode); Py_UCS4 ch = PyUnicode_READ(kind, data, 0); if (ch < 256) { @@ -630,6 +699,7 @@ unicode_result_ready(PyObject *unicode) } } } +#endif assert(_PyUnicode_CheckConsistency(unicode, 1)); return unicode; @@ -668,7 +738,7 @@ backslashreplace(_PyBytesWriter *writer, char *str, Py_ssize_t size, i; Py_UCS4 ch; enum PyUnicode_Kind kind; - void *data; + const void *data; assert(PyUnicode_IS_READY(unicode)); kind = PyUnicode_KIND(unicode); @@ -735,7 +805,7 @@ xmlcharrefreplace(_PyBytesWriter *writer, char *str, Py_ssize_t size, i; Py_UCS4 ch; enum PyUnicode_Kind kind; - void *data; + const void *data; assert(PyUnicode_IS_READY(unicode)); kind = PyUnicode_KIND(unicode); @@ -777,7 +847,11 @@ xmlcharrefreplace(_PyBytesWriter *writer, char *str, /* generate replacement */ for (i = collstart; i < collend; ++i) { - str += sprintf(str, "&#%d;", PyUnicode_READ(kind, data, i)); + size = sprintf(str, "&#%d;", PyUnicode_READ(kind, data, i)); + if (size < 0) { + return NULL; + } + str += size; } return str; } @@ -811,7 +885,7 @@ static BLOOM_MASK bloom_linebreak = ~(BLOOM_MASK)0; (BLOOM(bloom_linebreak, (ch)) && Py_UNICODE_ISLINEBREAK(ch))) static inline BLOOM_MASK -make_bloom_mask(int kind, void* ptr, Py_ssize_t len) +make_bloom_mask(int kind, const void* ptr, Py_ssize_t len) { #define BLOOM_UPDATE(TYPE, MASK, PTR, LEN) \ do { \ @@ -901,11 +975,14 @@ ensure_unicode(PyObject *obj) #include "stringlib/find_max_char.h" #include "stringlib/undef.h" +_Py_COMP_DIAG_PUSH +_Py_COMP_DIAG_IGNORE_DEPR_DECLS #include "stringlib/unicodedefs.h" #include "stringlib/fastsearch.h" #include "stringlib/count.h" #include "stringlib/find.h" #include "stringlib/undef.h" +_Py_COMP_DIAG_POP /* --- Unicode Object ----------------------------------------------------- */ @@ -992,8 +1069,12 @@ resize_compact(PyObject *unicode, Py_ssize_t length) _PyUnicode_UTF8(unicode) = NULL; _PyUnicode_UTF8_LENGTH(unicode) = 0; } - _Py_DEC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal--; +#endif +#ifdef Py_TRACE_REFS _Py_ForgetReference(unicode); +#endif new_unicode = (PyObject *)PyObject_REALLOC(unicode, new_size); if (new_unicode == NULL) { @@ -1246,16 +1327,16 @@ unicode_kind_name(PyObject *unicode) #ifdef Py_DEBUG /* Functions wrapping macros for use in debugger */ -char *_PyUnicode_utf8(void *unicode_raw){ +const char *_PyUnicode_utf8(void *unicode_raw){ PyObject *unicode = _PyObject_CAST(unicode_raw); return PyUnicode_UTF8(unicode); } -void *_PyUnicode_compact_data(void *unicode_raw) { +const void *_PyUnicode_compact_data(void *unicode_raw) { PyObject *unicode = _PyObject_CAST(unicode_raw); return _PyUnicode_COMPACT_DATA(unicode); } -void *_PyUnicode_data(void *unicode_raw) { +const void *_PyUnicode_data(void *unicode_raw) { PyObject *unicode = _PyObject_CAST(unicode_raw); printf("obj %p\n", (void*)unicode); printf("compact %d\n", PyUnicode_IS_COMPACT(unicode)); @@ -1272,7 +1353,7 @@ _PyUnicode_Dump(PyObject *op) PyASCIIObject *ascii = (PyASCIIObject *)op; PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op; PyUnicodeObject *unicode = (PyUnicodeObject *)op; - void *data; + const void *data; if (ascii->state.compact) { @@ -1472,7 +1553,8 @@ _copy_characters(PyObject *to, Py_ssize_t to_start, Py_ssize_t how_many, int check_maxchar) { unsigned int from_kind, to_kind; - void *from_data, *to_data; + const void *from_data; + void *to_data; assert(0 <= how_many); assert(0 <= from_start); @@ -1497,7 +1579,7 @@ _copy_characters(PyObject *to, Py_ssize_t to_start, if (!check_maxchar && PyUnicode_MAX_CHAR_VALUE(from) > PyUnicode_MAX_CHAR_VALUE(to)) { - const Py_UCS4 to_maxchar = PyUnicode_MAX_CHAR_VALUE(to); + Py_UCS4 to_maxchar = PyUnicode_MAX_CHAR_VALUE(to); Py_UCS4 ch; Py_ssize_t i; for (i=0; i < how_many; i++) { @@ -1515,12 +1597,12 @@ _copy_characters(PyObject *to, Py_ssize_t to_start, check that all written characters are pure ASCII */ Py_UCS4 max_char; max_char = ucs1lib_find_max_char(from_data, - (Py_UCS1*)from_data + how_many); + (const Py_UCS1*)from_data + how_many); if (max_char >= 128) return -1; } memcpy((char*)to_data + to_kind * to_start, - (char*)from_data + from_kind * from_start, + (const char*)from_data + from_kind * from_start, to_kind * how_many); } else if (from_kind == PyUnicode_1BYTE_KIND @@ -1804,7 +1886,7 @@ _PyUnicode_Ready(PyObject *unicode) _PyUnicode_WSTR_LENGTH(unicode) = 0; #endif } - /* maxchar exeeds 16 bit, wee need 4 bytes for unicode characters */ + /* maxchar exceeds 16 bit, wee need 4 bytes for unicode characters */ else { #if SIZEOF_WCHAR_T == 2 /* in case the native representation is 2-bytes, we need to allocate a @@ -1854,26 +1936,32 @@ unicode_dealloc(PyObject *unicode) case SSTATE_INTERNED_MORTAL: /* revive dead object temporarily for DelItem */ - Py_REFCNT(unicode) = 3; - if (PyDict_DelItem(interned, unicode) != 0) - Py_FatalError( - "deletion of interned string failed"); + Py_SET_REFCNT(unicode, 3); +#ifdef INTERNED_STRINGS + if (PyDict_DelItem(interned, unicode) != 0) { + _PyErr_WriteUnraisableMsg("deletion of interned string failed", + NULL); + } +#endif break; case SSTATE_INTERNED_IMMORTAL: - Py_FatalError("Immortal interned string died."); - /* fall through */ + _PyObject_ASSERT_FAILED_MSG(unicode, "Immortal interned string died"); + break; default: - Py_FatalError("Inconsistent interned string state."); + Py_UNREACHABLE(); } - if (_PyUnicode_HAS_WSTR_MEMORY(unicode)) + if (_PyUnicode_HAS_WSTR_MEMORY(unicode)) { PyObject_DEL(_PyUnicode_WSTR(unicode)); - if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) + } + if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) { PyObject_DEL(_PyUnicode_UTF8(unicode)); - if (!PyUnicode_IS_COMPACT(unicode) && _PyUnicode_DATA_ANY(unicode)) + } + if (!PyUnicode_IS_COMPACT(unicode) && _PyUnicode_DATA_ANY(unicode)) { PyObject_DEL(_PyUnicode_DATA_ANY(unicode)); + } Py_TYPE(unicode)->tp_free(unicode); } @@ -1882,15 +1970,18 @@ unicode_dealloc(PyObject *unicode) static int unicode_is_singleton(PyObject *unicode) { - PyASCIIObject *ascii = (PyASCIIObject *)unicode; - if (unicode == unicode_empty) + if (unicode == unicode_empty) { return 1; + } +#ifdef LATIN1_SINGLETONS + PyASCIIObject *ascii = (PyASCIIObject *)unicode; if (ascii->state.kind != PyUnicode_WCHAR_KIND && ascii->length == 1) { Py_UCS4 ch = PyUnicode_READ_CHAR(unicode, 0); if (ch < 256 && unicode_latin1[ch] == unicode) return 1; } +#endif return 0; } #endif @@ -1987,12 +2078,12 @@ unicode_write_cstr(PyObject *unicode, Py_ssize_t index, const char *str, Py_ssize_t len) { enum PyUnicode_Kind kind = PyUnicode_KIND(unicode); - void *data = PyUnicode_DATA(unicode); + const void *data = PyUnicode_DATA(unicode); const char *end = str + len; + assert(index + len <= PyUnicode_GET_LENGTH(unicode)); switch (kind) { case PyUnicode_1BYTE_KIND: { - assert(index + len <= PyUnicode_GET_LENGTH(unicode)); #ifdef Py_DEBUG if (PyUnicode_IS_ASCII(unicode)) { Py_UCS4 maxchar = ucs1lib_find_max_char( @@ -2007,7 +2098,6 @@ unicode_write_cstr(PyObject *unicode, Py_ssize_t index, case PyUnicode_2BYTE_KIND: { Py_UCS2 *start = (Py_UCS2 *)data + index; Py_UCS2 *ucs2 = start; - assert(index <= PyUnicode_GET_LENGTH(unicode)); for (; str < end; ++ucs2, ++str) *ucs2 = (Py_UCS2)*str; @@ -2015,33 +2105,46 @@ unicode_write_cstr(PyObject *unicode, Py_ssize_t index, assert((ucs2 - start) <= PyUnicode_GET_LENGTH(unicode)); break; } - default: { + case PyUnicode_4BYTE_KIND: { Py_UCS4 *start = (Py_UCS4 *)data + index; Py_UCS4 *ucs4 = start; - assert(kind == PyUnicode_4BYTE_KIND); - assert(index <= PyUnicode_GET_LENGTH(unicode)); for (; str < end; ++ucs4, ++str) *ucs4 = (Py_UCS4)*str; assert((ucs4 - start) <= PyUnicode_GET_LENGTH(unicode)); + break; } + default: + Py_UNREACHABLE(); } } static PyObject* get_latin1_char(unsigned char ch) { - PyObject *unicode = unicode_latin1[ch]; + PyObject *unicode; + +#ifdef LATIN1_SINGLETONS + unicode = unicode_latin1[ch]; + if (unicode) { + Py_INCREF(unicode); + return unicode; + } +#endif + + unicode = PyUnicode_New(1, ch); if (!unicode) { - unicode = PyUnicode_New(1, ch); - if (!unicode) - return NULL; - PyUnicode_1BYTE_DATA(unicode)[0] = ch; - assert(_PyUnicode_CheckConsistency(unicode, 1)); - unicode_latin1[ch] = unicode; + return NULL; } + + PyUnicode_1BYTE_DATA(unicode)[0] = ch; + assert(_PyUnicode_CheckConsistency(unicode, 1)); + +#ifdef LATIN1_SINGLETONS Py_INCREF(unicode); + unicode_latin1[ch] = unicode; +#endif return unicode; } @@ -2194,8 +2297,8 @@ _PyUnicode_FromId(_Py_Identifier *id) return id->object; } -void -_PyUnicode_ClearStaticStrings() +static void +unicode_clear_static_strings(void) { _Py_Identifier *tmp, *s = static_strings; while (s) { @@ -2342,7 +2445,7 @@ Py_UCS4 _PyUnicode_FindMaxChar(PyObject *unicode, Py_ssize_t start, Py_ssize_t end) { enum PyUnicode_Kind kind; - void *startptr, *endptr; + const void *startptr, *endptr; assert(PyUnicode_IS_READY(unicode)); assert(0 <= start); @@ -2405,13 +2508,15 @@ unicode_adjust_maxchar(PyObject **p_unicode) if (max_char >= 256) return; } - else { + else if (kind == PyUnicode_4BYTE_KIND) { const Py_UCS4 *u = PyUnicode_4BYTE_DATA(unicode); - assert(kind == PyUnicode_4BYTE_KIND); max_char = ucs4lib_find_max_char(u, u + len); if (max_char >= 0x10000) return; } + else + Py_UNREACHABLE(); + copy = PyUnicode_New(len, max_char); if (copy != NULL) _PyUnicode_FastCopyCharacters(copy, 0, unicode, 0, len); @@ -2448,22 +2553,12 @@ _PyUnicode_Copy(PyObject *unicode) /* Widen Unicode objects to larger buffers. Don't write terminating null character. Return NULL on error. */ -void* -_PyUnicode_AsKind(PyObject *s, unsigned int kind) +static void* +unicode_askind(unsigned int skind, void const *data, Py_ssize_t len, unsigned int kind) { - Py_ssize_t len; void *result; - unsigned int skind; - - if (PyUnicode_READY(s) == -1) - return NULL; - len = PyUnicode_GET_LENGTH(s); - skind = PyUnicode_KIND(s); - if (skind >= kind) { - PyErr_SetString(PyExc_SystemError, "invalid widening attempt"); - return NULL; - } + assert(skind < kind); switch (kind) { case PyUnicode_2BYTE_KIND: result = PyMem_New(Py_UCS2, len); @@ -2472,8 +2567,8 @@ _PyUnicode_AsKind(PyObject *s, unsigned int kind) assert(skind == PyUnicode_1BYTE_KIND); _PyUnicode_CONVERT_BYTES( Py_UCS1, Py_UCS2, - PyUnicode_1BYTE_DATA(s), - PyUnicode_1BYTE_DATA(s) + len, + (const Py_UCS1 *)data, + ((const Py_UCS1 *)data) + len, result); return result; case PyUnicode_4BYTE_KIND: @@ -2483,24 +2578,23 @@ _PyUnicode_AsKind(PyObject *s, unsigned int kind) if (skind == PyUnicode_2BYTE_KIND) { _PyUnicode_CONVERT_BYTES( Py_UCS2, Py_UCS4, - PyUnicode_2BYTE_DATA(s), - PyUnicode_2BYTE_DATA(s) + len, + (const Py_UCS2 *)data, + ((const Py_UCS2 *)data) + len, result); } else { assert(skind == PyUnicode_1BYTE_KIND); _PyUnicode_CONVERT_BYTES( Py_UCS1, Py_UCS4, - PyUnicode_1BYTE_DATA(s), - PyUnicode_1BYTE_DATA(s) + len, + (const Py_UCS1 *)data, + ((const Py_UCS1 *)data) + len, result); } return result; default: - break; + Py_UNREACHABLE(); + return NULL; } - PyErr_SetString(PyExc_SystemError, "invalid kind"); - return NULL; } static Py_UCS4* @@ -2508,7 +2602,7 @@ as_ucs4(PyObject *string, Py_UCS4 *target, Py_ssize_t targetsize, int copy_null) { int kind; - void *data; + const void *data; Py_ssize_t len, targetlen; if (PyUnicode_READY(string) == -1) return NULL; @@ -2535,17 +2629,19 @@ as_ucs4(PyObject *string, Py_UCS4 *target, Py_ssize_t targetsize, } } if (kind == PyUnicode_1BYTE_KIND) { - Py_UCS1 *start = (Py_UCS1 *) data; + const Py_UCS1 *start = (const Py_UCS1 *) data; _PyUnicode_CONVERT_BYTES(Py_UCS1, Py_UCS4, start, start + len, target); } else if (kind == PyUnicode_2BYTE_KIND) { - Py_UCS2 *start = (Py_UCS2 *) data; + const Py_UCS2 *start = (const Py_UCS2 *) data; _PyUnicode_CONVERT_BYTES(Py_UCS2, Py_UCS4, start, start + len, target); } - else { - assert(kind == PyUnicode_4BYTE_KIND); + else if (kind == PyUnicode_4BYTE_KIND) { memcpy(target, data, len * sizeof(Py_UCS4)); } + else { + Py_UNREACHABLE(); + } if (copy_null) target[len] = 0; return target; @@ -3215,12 +3311,15 @@ PyUnicode_FromEncodedObject(PyObject *obj, /* Decoding bytes objects is the most common case and should be fast */ if (PyBytes_Check(obj)) { - if (PyBytes_GET_SIZE(obj) == 0) + if (PyBytes_GET_SIZE(obj) == 0) { + if (unicode_check_encoding_errors(encoding, errors) < 0) { + return NULL; + } _Py_RETURN_UNICODE_EMPTY(); - v = PyUnicode_Decode( + } + return PyUnicode_Decode( PyBytes_AS_STRING(obj), PyBytes_GET_SIZE(obj), encoding, errors); - return v; } if (PyUnicode_Check(obj)) { @@ -3239,6 +3338,9 @@ PyUnicode_FromEncodedObject(PyObject *obj, if (buffer.len == 0) { PyBuffer_Release(&buffer); + if (unicode_check_encoding_errors(encoding, errors) < 0) { + return NULL; + } _Py_RETURN_UNICODE_EMPTY(); } @@ -3306,6 +3408,14 @@ PyUnicode_Decode(const char *s, Py_buffer info; char buflower[11]; /* strlen("iso-8859-1\0") == 11, longest shortcut */ + if (unicode_check_encoding_errors(encoding, errors) < 0) { + return NULL; + } + + if (size == 0) { + _Py_RETURN_UNICODE_EMPTY(); + } + if (encoding == NULL) { return PyUnicode_DecodeUTF8Stateful(s, size, errors, NULL); } @@ -3547,39 +3657,35 @@ PyUnicode_EncodeLocale(PyObject *unicode, const char *errors) PyObject * PyUnicode_EncodeFSDefault(PyObject *unicode) { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); -#ifdef _Py_FORCE_UTF8_FS_ENCODING - if (interp->fs_codec.encoding) { + PyInterpreterState *interp = _PyInterpreterState_GET(); + struct _Py_unicode_fs_codec *fs_codec = &interp->unicode.fs_codec; + if (fs_codec->utf8) { return unicode_encode_utf8(unicode, - interp->fs_codec.error_handler, - interp->fs_codec.errors); - } - else { - const wchar_t *filesystem_errors = interp->config.filesystem_errors; - _Py_error_handler errors; - errors = get_error_handler_wide(filesystem_errors); - assert(errors != _Py_ERROR_UNKNOWN); - return unicode_encode_utf8(unicode, errors, NULL); + fs_codec->error_handler, + fs_codec->errors); } -#else - /* Bootstrap check: if the filesystem codec is implemented in Python, we - cannot use it to encode and decode filenames before it is loaded. Load - the Python codec requires to encode at least its own filename. Use the C - implementation of the locale codec until the codec registry is - initialized and the Python codec is loaded. See initfsencoding(). */ - if (interp->fs_codec.encoding) { +#ifndef _Py_FORCE_UTF8_FS_ENCODING + else if (fs_codec->encoding) { return PyUnicode_AsEncodedString(unicode, - interp->fs_codec.encoding, - interp->fs_codec.errors); + fs_codec->encoding, + fs_codec->errors); } +#endif else { - const wchar_t *filesystem_errors = interp->config.filesystem_errors; - _Py_error_handler errors; - errors = get_error_handler_wide(filesystem_errors); + /* Before _PyUnicode_InitEncodings() is called, the Python codec + machinery is not ready and so cannot be used: + use wcstombs() in this case. */ + const PyConfig *config = _PyInterpreterState_GetConfig(interp); + const wchar_t *filesystem_errors = config->filesystem_errors; + assert(filesystem_errors != NULL); + _Py_error_handler errors = get_error_handler_wide(filesystem_errors); assert(errors != _Py_ERROR_UNKNOWN); +#ifdef _Py_FORCE_UTF8_FS_ENCODING + return unicode_encode_utf8(unicode, errors, NULL); +#else return unicode_encode_locale(unicode, errors, 0); - } #endif + } } PyObject * @@ -3595,6 +3701,10 @@ PyUnicode_AsEncodedString(PyObject *unicode, return NULL; } + if (unicode_check_encoding_errors(encoding, errors) < 0) { + return NULL; + } + if (encoding == NULL) { return _PyUnicode_AsUTF8String(unicode, errors); } @@ -3784,39 +3894,36 @@ PyUnicode_DecodeFSDefault(const char *s) { PyObject* PyUnicode_DecodeFSDefaultAndSize(const char *s, Py_ssize_t size) { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); -#ifdef _Py_FORCE_UTF8_FS_ENCODING - if (interp->fs_codec.encoding) { + PyInterpreterState *interp = _PyInterpreterState_GET(); + struct _Py_unicode_fs_codec *fs_codec = &interp->unicode.fs_codec; + if (fs_codec->utf8) { return unicode_decode_utf8(s, size, - interp->fs_codec.error_handler, - interp->fs_codec.errors, + fs_codec->error_handler, + fs_codec->errors, NULL); } +#ifndef _Py_FORCE_UTF8_FS_ENCODING + else if (fs_codec->encoding) { + return PyUnicode_Decode(s, size, + fs_codec->encoding, + fs_codec->errors); + } +#endif else { - const wchar_t *filesystem_errors = interp->config.filesystem_errors; - _Py_error_handler errors; - errors = get_error_handler_wide(filesystem_errors); + /* Before _PyUnicode_InitEncodings() is called, the Python codec + machinery is not ready and so cannot be used: + use mbstowcs() in this case. */ + const PyConfig *config = _PyInterpreterState_GetConfig(interp); + const wchar_t *filesystem_errors = config->filesystem_errors; + assert(filesystem_errors != NULL); + _Py_error_handler errors = get_error_handler_wide(filesystem_errors); assert(errors != _Py_ERROR_UNKNOWN); +#ifdef _Py_FORCE_UTF8_FS_ENCODING return unicode_decode_utf8(s, size, errors, NULL, NULL); - } #else - /* Bootstrap check: if the filesystem codec is implemented in Python, we - cannot use it to encode and decode filenames before it is loaded. Load - the Python codec requires to encode at least its own filename. Use the C - implementation of the locale codec until the codec registry is - initialized and the Python codec is loaded. See initfsencoding(). */ - if (interp->fs_codec.encoding) { - return PyUnicode_Decode(s, size, - interp->fs_codec.encoding, - interp->fs_codec.errors); - } - else { - const wchar_t *filesystem_errors = interp->config.filesystem_errors; - _Py_error_handler errors; - errors = get_error_handler_wide(filesystem_errors); return unicode_decode_locale(s, size, errors, 0); - } #endif + } } @@ -3826,7 +3933,7 @@ PyUnicode_FSConverter(PyObject* arg, void* addr) PyObject *path = NULL; PyObject *output = NULL; Py_ssize_t size; - void *data; + const char *data; if (arg == NULL) { Py_DECREF(*(PyObject**)addr); *(PyObject**)addr = NULL; @@ -3931,11 +4038,11 @@ PyUnicode_FSDecoder(PyObject* arg, void* addr) } +static int unicode_fill_utf8(PyObject *unicode); + const char * PyUnicode_AsUTF8AndSize(PyObject *unicode, Py_ssize_t *psize) { - PyObject *bytes; - if (!PyUnicode_Check(unicode)) { PyErr_BadArgument(); return NULL; @@ -3944,21 +4051,9 @@ PyUnicode_AsUTF8AndSize(PyObject *unicode, Py_ssize_t *psize) return NULL; if (PyUnicode_UTF8(unicode) == NULL) { - assert(!PyUnicode_IS_COMPACT_ASCII(unicode)); - bytes = _PyUnicode_AsUTF8String(unicode, NULL); - if (bytes == NULL) - return NULL; - _PyUnicode_UTF8(unicode) = PyObject_MALLOC(PyBytes_GET_SIZE(bytes) + 1); - if (_PyUnicode_UTF8(unicode) == NULL) { - PyErr_NoMemory(); - Py_DECREF(bytes); + if (unicode_fill_utf8(unicode) == -1) { return NULL; } - _PyUnicode_UTF8_LENGTH(unicode) = PyBytes_GET_SIZE(bytes); - memcpy(_PyUnicode_UTF8(unicode), - PyBytes_AS_STRING(bytes), - _PyUnicode_UTF8_LENGTH(unicode) + 1); - Py_DECREF(bytes); } if (psize) @@ -4006,6 +4101,11 @@ PyUnicode_AsUnicodeAndSize(PyObject *unicode, Py_ssize_t *size) return w; } +/* Deprecated APIs */ + +_Py_COMP_DIAG_PUSH +_Py_COMP_DIAG_IGNORE_DEPR_DECLS + Py_UNICODE * PyUnicode_AsUnicode(PyObject *unicode) { @@ -4044,6 +4144,8 @@ PyUnicode_GetSize(PyObject *unicode) return -1; } +_Py_COMP_DIAG_POP + Py_ssize_t PyUnicode_GetLength(PyObject *unicode) { @@ -4059,7 +4161,7 @@ PyUnicode_GetLength(PyObject *unicode) Py_UCS4 PyUnicode_ReadChar(PyObject *unicode, Py_ssize_t index) { - void *data; + const void *data; int kind; if (!PyUnicode_Check(unicode)) { @@ -4190,7 +4292,7 @@ unicode_decode_call_errorhandler_wchar( if (*exceptionObject == NULL) goto onError; - restuple = PyObject_CallFunctionObjArgs(*errorHandler, *exceptionObject, NULL); + restuple = PyObject_CallOneArg(*errorHandler, *exceptionObject); if (restuple == NULL) goto onError; if (!PyTuple_Check(restuple)) { @@ -4294,7 +4396,7 @@ unicode_decode_call_errorhandler_writer( if (*exceptionObject == NULL) goto onError; - restuple = PyObject_CallFunctionObjArgs(*errorHandler, *exceptionObject, NULL); + restuple = PyObject_CallOneArg(*errorHandler, *exceptionObject); if (restuple == NULL) goto onError; if (!PyTuple_Check(restuple)) { @@ -4661,7 +4763,7 @@ _PyUnicode_EncodeUTF7(PyObject *str, const char *errors) { int kind; - void *data; + const void *data; Py_ssize_t len; PyObject *v; int inShift = 0; @@ -4669,7 +4771,7 @@ _PyUnicode_EncodeUTF7(PyObject *str, unsigned int base64bits = 0; unsigned long base64buffer = 0; char * out; - char * start; + const char * start; if (PyUnicode_READY(str) == -1) return NULL; @@ -4883,16 +4985,6 @@ unicode_decode_utf8(const char *s, Py_ssize_t size, _Py_error_handler error_handler, const char *errors, Py_ssize_t *consumed) { - _PyUnicodeWriter writer; - const char *starts = s; - const char *end = s + size; - - Py_ssize_t startinpos; - Py_ssize_t endinpos; - const char *errmsg = ""; - PyObject *error_handler_obj = NULL; - PyObject *exc = NULL; - if (size == 0) { if (consumed) *consumed = 0; @@ -4906,13 +4998,29 @@ unicode_decode_utf8(const char *s, Py_ssize_t size, return get_latin1_char((unsigned char)s[0]); } - _PyUnicodeWriter_Init(&writer); - writer.min_length = size; - if (_PyUnicodeWriter_Prepare(&writer, writer.min_length, 127) == -1) - goto onError; + const char *starts = s; + const char *end = s + size; + + // fast path: try ASCII string. + PyObject *u = PyUnicode_New(size, 127); + if (u == NULL) { + return NULL; + } + s += ascii_decode(s, end, PyUnicode_1BYTE_DATA(u)); + if (s == end) { + return u; + } + + // Use _PyUnicodeWriter after fast path is failed. + _PyUnicodeWriter writer; + _PyUnicodeWriter_InitWithBuffer(&writer, u); + writer.pos = s - starts; + + Py_ssize_t startinpos, endinpos; + const char *errmsg = ""; + PyObject *error_handler_obj = NULL; + PyObject *exc = NULL; - writer.pos = ascii_decode(s, end, writer.data); - s += writer.pos; while (s < end) { Py_UCS4 ch; int kind = writer.kind; @@ -5315,10 +5423,6 @@ static PyObject * unicode_encode_utf8(PyObject *unicode, _Py_error_handler error_handler, const char *errors) { - enum PyUnicode_Kind kind; - void *data; - Py_ssize_t size; - if (!PyUnicode_Check(unicode)) { PyErr_BadArgument(); return NULL; @@ -5331,9 +5435,12 @@ unicode_encode_utf8(PyObject *unicode, _Py_error_handler error_handler, return PyBytes_FromStringAndSize(PyUnicode_UTF8(unicode), PyUnicode_UTF8_LENGTH(unicode)); - kind = PyUnicode_KIND(unicode); - data = PyUnicode_DATA(unicode); - size = PyUnicode_GET_LENGTH(unicode); + enum PyUnicode_Kind kind = PyUnicode_KIND(unicode); + const void *data = PyUnicode_DATA(unicode); + Py_ssize_t size = PyUnicode_GET_LENGTH(unicode); + + _PyBytesWriter writer; + char *end; switch (kind) { default: @@ -5341,12 +5448,73 @@ unicode_encode_utf8(PyObject *unicode, _Py_error_handler error_handler, case PyUnicode_1BYTE_KIND: /* the string cannot be ASCII, or PyUnicode_UTF8() would be set */ assert(!PyUnicode_IS_ASCII(unicode)); - return ucs1lib_utf8_encoder(unicode, data, size, error_handler, errors); + end = ucs1lib_utf8_encoder(&writer, unicode, data, size, error_handler, errors); + break; case PyUnicode_2BYTE_KIND: - return ucs2lib_utf8_encoder(unicode, data, size, error_handler, errors); + end = ucs2lib_utf8_encoder(&writer, unicode, data, size, error_handler, errors); + break; case PyUnicode_4BYTE_KIND: - return ucs4lib_utf8_encoder(unicode, data, size, error_handler, errors); + end = ucs4lib_utf8_encoder(&writer, unicode, data, size, error_handler, errors); + break; } + + if (end == NULL) { + _PyBytesWriter_Dealloc(&writer); + return NULL; + } + return _PyBytesWriter_Finish(&writer, end); +} + +static int +unicode_fill_utf8(PyObject *unicode) +{ + /* the string cannot be ASCII, or PyUnicode_UTF8() would be set */ + assert(!PyUnicode_IS_ASCII(unicode)); + + enum PyUnicode_Kind kind = PyUnicode_KIND(unicode); + const void *data = PyUnicode_DATA(unicode); + Py_ssize_t size = PyUnicode_GET_LENGTH(unicode); + + _PyBytesWriter writer; + char *end; + + switch (kind) { + default: + Py_UNREACHABLE(); + case PyUnicode_1BYTE_KIND: + end = ucs1lib_utf8_encoder(&writer, unicode, data, size, + _Py_ERROR_STRICT, NULL); + break; + case PyUnicode_2BYTE_KIND: + end = ucs2lib_utf8_encoder(&writer, unicode, data, size, + _Py_ERROR_STRICT, NULL); + break; + case PyUnicode_4BYTE_KIND: + end = ucs4lib_utf8_encoder(&writer, unicode, data, size, + _Py_ERROR_STRICT, NULL); + break; + } + if (end == NULL) { + _PyBytesWriter_Dealloc(&writer); + return -1; + } + + const char *start = writer.use_small_buffer ? writer.small_buffer : + PyBytes_AS_STRING(writer.buffer); + Py_ssize_t len = end - start; + + char *cache = PyObject_MALLOC(len + 1); + if (cache == NULL) { + _PyBytesWriter_Dealloc(&writer); + PyErr_NoMemory(); + return -1; + } + _PyUnicode_UTF8(unicode) = cache; + _PyUnicode_UTF8_LENGTH(unicode) = len; + memcpy(cache, start, len); + cache[len] = '\0'; + _PyBytesWriter_Dealloc(&writer); + return 0; } PyObject * @@ -6313,7 +6481,7 @@ PyUnicode_AsUnicodeEscapeString(PyObject *unicode) PyObject *repr; char *p; enum PyUnicode_Kind kind; - void *data; + const void *data; Py_ssize_t expandsize; /* Initial allocation is based on the longest-possible character @@ -6461,7 +6629,7 @@ PyUnicode_DecodeRawUnicodeEscape(const char *s, length after conversion to the true value. (But decoding error handler might have to resize the string) */ _PyUnicodeWriter_Init(&writer); - writer.min_length = size; + writer.min_length = size; if (_PyUnicodeWriter_Prepare(&writer, size, 127) < 0) { goto onError; } @@ -6567,7 +6735,7 @@ PyUnicode_AsRawUnicodeEscapeString(PyObject *unicode) char *p; Py_ssize_t expandsize, pos; int kind; - void *data; + const void *data; Py_ssize_t len; if (!PyUnicode_Check(unicode)) { @@ -6735,8 +6903,7 @@ unicode_encode_call_errorhandler(const char *errors, if (*exceptionObject == NULL) return NULL; - restuple = PyObject_CallFunctionObjArgs( - *errorHandler, *exceptionObject, NULL); + restuple = PyObject_CallOneArg(*errorHandler, *exceptionObject); if (restuple == NULL) return NULL; if (!PyTuple_Check(restuple)) { @@ -6774,7 +6941,7 @@ unicode_encode_ucs1(PyObject *unicode, /* input state */ Py_ssize_t pos=0, size; int kind; - void *data; + const void *data; /* pointer into the output */ char *str; const char *encoding = (limit == 256) ? "latin-1" : "ascii"; @@ -6985,13 +7152,7 @@ PyUnicode_DecodeASCII(const char *s, const char *errors) { const char *starts = s; - _PyUnicodeWriter writer; - int kind; - void *data; - Py_ssize_t startinpos; - Py_ssize_t endinpos; - Py_ssize_t outpos; - const char *e; + const char *e = s + size; PyObject *error_handler_obj = NULL; PyObject *exc = NULL; _Py_error_handler error_handler = _Py_ERROR_UNKNOWN; @@ -7003,20 +7164,25 @@ PyUnicode_DecodeASCII(const char *s, if (size == 1 && (unsigned char)s[0] < 128) return get_latin1_char((unsigned char)s[0]); - _PyUnicodeWriter_Init(&writer); - writer.min_length = size; - if (_PyUnicodeWriter_Prepare(&writer, writer.min_length, 127) < 0) + // Shortcut for simple case + PyObject *u = PyUnicode_New(size, 127); + if (u == NULL) { return NULL; + } + Py_ssize_t outpos = ascii_decode(s, e, PyUnicode_1BYTE_DATA(u)); + if (outpos == size) { + return u; + } - e = s + size; - data = writer.data; - outpos = ascii_decode(s, e, (Py_UCS1 *)data); + _PyUnicodeWriter writer; + _PyUnicodeWriter_InitWithBuffer(&writer, u); writer.pos = outpos; - if (writer.pos == size) - return _PyUnicodeWriter_Finish(&writer); - s += writer.pos; - kind = writer.kind; + s += outpos; + int kind = writer.kind; + void *data = writer.data; + Py_ssize_t startinpos, endinpos; + while (s < e) { unsigned char c = (unsigned char)*s; if (c < 128) { @@ -7690,7 +7856,7 @@ encode_code_page_errors(UINT code_page, PyObject **outbytes, else { Py_ssize_t i; enum PyUnicode_Kind kind; - void *data; + const void *data; if (PyUnicode_READY(rep) == -1) { Py_DECREF(rep); @@ -7848,7 +8014,7 @@ charmap_decode_string(const char *s, PyObject *errorHandler = NULL, *exc = NULL; Py_ssize_t maplen; enum PyUnicode_Kind mapkind; - void *mapdata; + const void *mapdata; Py_UCS4 x; unsigned char ch; @@ -7865,7 +8031,7 @@ charmap_decode_string(const char *s, /* fast-path for cp037, cp500 and iso8859_1 encodings. iso8859_1 * is disabled in encoding aliases, latin1 is preferred because * its implementation is faster. */ - Py_UCS1 *mapdata_ucs1 = (Py_UCS1 *)mapdata; + const Py_UCS1 *mapdata_ucs1 = (const Py_UCS1 *)mapdata; Py_UCS1 *outdata = (Py_UCS1 *)writer->data; Py_UCS4 maxchar = writer->maxchar; @@ -7889,7 +8055,7 @@ charmap_decode_string(const char *s, while (s < e) { if (mapkind == PyUnicode_2BYTE_KIND && maplen >= 256) { enum PyUnicode_Kind outkind = writer->kind; - Py_UCS2 *mapdata_ucs2 = (Py_UCS2 *)mapdata; + const Py_UCS2 *mapdata_ucs2 = (const Py_UCS2 *)mapdata; if (outkind == PyUnicode_1BYTE_KIND) { Py_UCS1 *outdata = (Py_UCS1 *)writer->data; Py_UCS4 maxchar = writer->maxchar; @@ -7998,7 +8164,7 @@ charmap_decode_mapping(const char *s, goto Undefined; if (value < 0 || value > MAX_UNICODE) { PyErr_Format(PyExc_TypeError, - "character mapping must be in range(0x%lx)", + "character mapping must be in range(0x%x)", (unsigned long)MAX_UNICODE + 1); goto onError; } @@ -8169,7 +8335,7 @@ PyUnicode_BuildEncodingMap(PyObject* string) unsigned char *mlevel1, *mlevel2, *mlevel3; int count2 = 0, count3 = 0; int kind; - void *data; + const void *data; Py_ssize_t length; Py_UCS4 ch; @@ -8337,7 +8503,7 @@ charmapencode_lookup(Py_UCS4 c, PyObject *mapping) /* wrong return value */ PyErr_Format(PyExc_TypeError, "character mapping must return integer, bytes or None, not %.400s", - x->ob_type->tp_name); + Py_TYPE(x)->tp_name); Py_DECREF(x); return NULL; } @@ -8372,7 +8538,7 @@ charmapencode_output(Py_UCS4 c, PyObject *mapping, char *outstart; Py_ssize_t outsize = PyBytes_GET_SIZE(*outobj); - if (Py_TYPE(mapping) == &EncodingMapType) { + if (Py_IS_TYPE(mapping, &EncodingMapType)) { int res = encoding_map_lookup(c, mapping); Py_ssize_t requiredsize = *outpos+1; if (res == -1) @@ -8433,7 +8599,7 @@ charmap_encoding_error( Py_ssize_t size, repsize; Py_ssize_t newpos; enum PyUnicode_Kind kind; - void *data; + const void *data; Py_ssize_t index; /* startpos for collecting unencodable chars */ Py_ssize_t collstartpos = *inpos; @@ -8451,7 +8617,7 @@ charmap_encoding_error( /* find all unencodable characters */ while (collendpos < size) { PyObject *rep; - if (Py_TYPE(mapping) == &EncodingMapType) { + if (Py_IS_TYPE(mapping, &EncodingMapType)) { ch = PyUnicode_READ_CHAR(unicode, collendpos); val = encoding_map_lookup(ch, mapping); if (val != -1) @@ -8583,7 +8749,7 @@ _PyUnicode_EncodeCharmap(PyObject *unicode, PyObject *error_handler_obj = NULL; PyObject *exc = NULL; _Py_error_handler error_handler = _Py_ERROR_UNKNOWN; - void *data; + const void *data; int kind; if (PyUnicode_READY(unicode) == -1) @@ -8719,8 +8885,7 @@ unicode_translate_call_errorhandler(const char *errors, if (*exceptionObject == NULL) return NULL; - restuple = PyObject_CallFunctionObjArgs( - *errorHandler, *exceptionObject, NULL); + restuple = PyObject_CallOneArg(*errorHandler, *exceptionObject); if (restuple == NULL) return NULL; if (!PyTuple_Check(restuple)) { @@ -8916,7 +9081,8 @@ unicode_fast_translate(PyObject *input, PyObject *mapping, { Py_UCS1 ascii_table[128], ch, ch2; Py_ssize_t len; - Py_UCS1 *in, *end, *out; + const Py_UCS1 *in, *end; + Py_UCS1 *out; int res = 0; len = PyUnicode_GET_LENGTH(input); @@ -8965,7 +9131,7 @@ _PyUnicode_TranslateCharmap(PyObject *input, const char *errors) { /* input object */ - char *data; + const void *data; Py_ssize_t size, i; int kind; /* output buffer */ @@ -8984,7 +9150,7 @@ _PyUnicode_TranslateCharmap(PyObject *input, if (PyUnicode_READY(input) == -1) return NULL; - data = (char*)PyUnicode_DATA(input); + data = PyUnicode_DATA(input); kind = PyUnicode_KIND(input); size = PyUnicode_GET_LENGTH(input); @@ -9162,7 +9328,7 @@ PyUnicode_TransformDecimalToASCII(Py_UNICODE *s, Py_ssize_t i; Py_UCS4 maxchar; enum PyUnicode_Kind kind; - void *data; + const void *data; maxchar = 127; for (i = 0; i < length; i++) { @@ -9204,7 +9370,7 @@ PyUnicode_EncodeDecimal(Py_UNICODE *s, PyObject *unicode; Py_ssize_t i; enum PyUnicode_Kind kind; - void *data; + const void *data; if (output == NULL) { PyErr_BadArgument(); @@ -9282,7 +9448,7 @@ any_find_slice(PyObject* s1, PyObject* s2, int direction) { int kind1, kind2; - void *buf1, *buf2; + const void *buf1, *buf2; Py_ssize_t len1, len2, result; kind1 = PyUnicode_KIND(s1); @@ -9309,7 +9475,7 @@ any_find_slice(PyObject* s1, PyObject* s2, } if (kind2 != kind1) { - buf2 = _PyUnicode_AsKind(s2, kind1); + buf2 = unicode_askind(kind2, buf2, len2, kind1); if (!buf2) return -2; } @@ -9351,8 +9517,9 @@ any_find_slice(PyObject* s1, PyObject* s2, } } + assert((kind2 != kind1) == (buf2 != PyUnicode_DATA(s2))); if (kind2 != kind1) - PyMem_Free(buf2); + PyMem_Free((void *)buf2); return result; } @@ -9511,7 +9678,7 @@ PyUnicode_Count(PyObject *str, { Py_ssize_t result; int kind1, kind2; - void *buf1 = NULL, *buf2 = NULL; + const void *buf1 = NULL, *buf2 = NULL; Py_ssize_t len1, len2; if (ensure_unicode(str) < 0 || ensure_unicode(substr) < 0) @@ -9531,7 +9698,7 @@ PyUnicode_Count(PyObject *str, buf1 = PyUnicode_DATA(str); buf2 = PyUnicode_DATA(substr); if (kind2 != kind1) { - buf2 = _PyUnicode_AsKind(substr, kind1); + buf2 = unicode_askind(kind2, buf2, len2, kind1); if (!buf2) goto onError; } @@ -9540,24 +9707,24 @@ PyUnicode_Count(PyObject *str, case PyUnicode_1BYTE_KIND: if (PyUnicode_IS_ASCII(str) && PyUnicode_IS_ASCII(substr)) result = asciilib_count( - ((Py_UCS1*)buf1) + start, end - start, + ((const Py_UCS1*)buf1) + start, end - start, buf2, len2, PY_SSIZE_T_MAX ); else result = ucs1lib_count( - ((Py_UCS1*)buf1) + start, end - start, + ((const Py_UCS1*)buf1) + start, end - start, buf2, len2, PY_SSIZE_T_MAX ); break; case PyUnicode_2BYTE_KIND: result = ucs2lib_count( - ((Py_UCS2*)buf1) + start, end - start, + ((const Py_UCS2*)buf1) + start, end - start, buf2, len2, PY_SSIZE_T_MAX ); break; case PyUnicode_4BYTE_KIND: result = ucs4lib_count( - ((Py_UCS4*)buf1) + start, end - start, + ((const Py_UCS4*)buf1) + start, end - start, buf2, len2, PY_SSIZE_T_MAX ); break; @@ -9565,13 +9732,15 @@ PyUnicode_Count(PyObject *str, Py_UNREACHABLE(); } + assert((kind2 != kind1) == (buf2 != PyUnicode_DATA(substr))); if (kind2 != kind1) - PyMem_Free(buf2); + PyMem_Free((void *)buf2); return result; onError: - if (kind2 != kind1 && buf2) - PyMem_Free(buf2); + assert((kind2 != kind1) == (buf2 != PyUnicode_DATA(substr))); + if (kind2 != kind1) + PyMem_Free((void *)buf2); return -1; } @@ -9619,8 +9788,8 @@ tailmatch(PyObject *self, { int kind_self; int kind_sub; - void *data_self; - void *data_sub; + const void *data_self; + const void *data_sub; Py_ssize_t offset; Py_ssize_t i; Py_ssize_t end_sub; @@ -9694,7 +9863,8 @@ static PyObject * ascii_upper_or_lower(PyObject *self, int lower) { Py_ssize_t len = PyUnicode_GET_LENGTH(self); - char *resdata, *data = PyUnicode_DATA(self); + const char *data = PyUnicode_DATA(self); + char *resdata; PyObject *res; res = PyUnicode_New(len, 127); @@ -9709,7 +9879,7 @@ ascii_upper_or_lower(PyObject *self, int lower) } static Py_UCS4 -handle_capital_sigma(int kind, void *data, Py_ssize_t length, Py_ssize_t i) +handle_capital_sigma(int kind, const void *data, Py_ssize_t length, Py_ssize_t i) { Py_ssize_t j; int final_sigma; @@ -9738,7 +9908,7 @@ handle_capital_sigma(int kind, void *data, Py_ssize_t length, Py_ssize_t i) } static int -lower_ucs4(int kind, void *data, Py_ssize_t length, Py_ssize_t i, +lower_ucs4(int kind, const void *data, Py_ssize_t length, Py_ssize_t i, Py_UCS4 c, Py_UCS4 *mapped) { /* Obscure special case. */ @@ -9750,7 +9920,7 @@ lower_ucs4(int kind, void *data, Py_ssize_t length, Py_ssize_t i, } static Py_ssize_t -do_capitalize(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) +do_capitalize(int kind, const void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) { Py_ssize_t i, k = 0; int n_res, j; @@ -9774,7 +9944,7 @@ do_capitalize(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *ma } static Py_ssize_t -do_swapcase(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) { +do_swapcase(int kind, const void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) { Py_ssize_t i, k = 0; for (i = 0; i < length; i++) { @@ -9799,7 +9969,7 @@ do_swapcase(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxc } static Py_ssize_t -do_upper_or_lower(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, +do_upper_or_lower(int kind, const void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar, int lower) { Py_ssize_t i, k = 0; @@ -9820,19 +9990,19 @@ do_upper_or_lower(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, } static Py_ssize_t -do_upper(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) +do_upper(int kind, const void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) { return do_upper_or_lower(kind, data, length, res, maxchar, 0); } static Py_ssize_t -do_lower(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) +do_lower(int kind, const void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) { return do_upper_or_lower(kind, data, length, res, maxchar, 1); } static Py_ssize_t -do_casefold(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) +do_casefold(int kind, const void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) { Py_ssize_t i, k = 0; @@ -9849,7 +10019,7 @@ do_casefold(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxc } static Py_ssize_t -do_title(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) +do_title(int kind, const void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar) { Py_ssize_t i, k = 0; int previous_is_cased; @@ -9877,12 +10047,13 @@ do_title(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *maxchar static PyObject * case_operation(PyObject *self, - Py_ssize_t (*perform)(int, void *, Py_ssize_t, Py_UCS4 *, Py_UCS4 *)) + Py_ssize_t (*perform)(int, const void *, Py_ssize_t, Py_UCS4 *, Py_UCS4 *)) { PyObject *res = NULL; Py_ssize_t length, newlength = 0; int kind, outkind; - void *data, *outdata; + const void *data; + void *outdata; Py_UCS4 maxchar = 0, *tmp, *tmpend; assert(PyUnicode_IS_READY(self)); @@ -10249,7 +10420,7 @@ split(PyObject *self, Py_ssize_t maxcount) { int kind1, kind2; - void *buf1, *buf2; + const void *buf1, *buf2; Py_ssize_t len1, len2; PyObject* out; @@ -10304,7 +10475,7 @@ split(PyObject *self, buf1 = PyUnicode_DATA(self); buf2 = PyUnicode_DATA(substring); if (kind2 != kind1) { - buf2 = _PyUnicode_AsKind(substring, kind1); + buf2 = unicode_askind(kind2, buf2, len2, kind1); if (!buf2) return NULL; } @@ -10329,8 +10500,9 @@ split(PyObject *self, default: out = NULL; } + assert((kind2 != kind1) == (buf2 != PyUnicode_DATA(substring))); if (kind2 != kind1) - PyMem_Free(buf2); + PyMem_Free((void *)buf2); return out; } @@ -10340,7 +10512,7 @@ rsplit(PyObject *self, Py_ssize_t maxcount) { int kind1, kind2; - void *buf1, *buf2; + const void *buf1, *buf2; Py_ssize_t len1, len2; PyObject* out; @@ -10395,7 +10567,7 @@ rsplit(PyObject *self, buf1 = PyUnicode_DATA(self); buf2 = PyUnicode_DATA(substring); if (kind2 != kind1) { - buf2 = _PyUnicode_AsKind(substring, kind1); + buf2 = unicode_askind(kind2, buf2, len2, kind1); if (!buf2) return NULL; } @@ -10420,14 +10592,15 @@ rsplit(PyObject *self, default: out = NULL; } + assert((kind2 != kind1) == (buf2 != PyUnicode_DATA(substring))); if (kind2 != kind1) - PyMem_Free(buf2); + PyMem_Free((void *)buf2); return out; } static Py_ssize_t -anylib_find(int kind, PyObject *str1, void *buf1, Py_ssize_t len1, - PyObject *str2, void *buf2, Py_ssize_t len2, Py_ssize_t offset) +anylib_find(int kind, PyObject *str1, const void *buf1, Py_ssize_t len1, + PyObject *str2, const void *buf2, Py_ssize_t len2, Py_ssize_t offset) { switch (kind) { case PyUnicode_1BYTE_KIND: @@ -10444,8 +10617,8 @@ anylib_find(int kind, PyObject *str1, void *buf1, Py_ssize_t len1, } static Py_ssize_t -anylib_count(int kind, PyObject *sstr, void* sbuf, Py_ssize_t slen, - PyObject *str1, void *buf1, Py_ssize_t len1, Py_ssize_t maxcount) +anylib_count(int kind, PyObject *sstr, const void* sbuf, Py_ssize_t slen, + PyObject *str1, const void *buf1, Py_ssize_t len1, Py_ssize_t maxcount) { switch (kind) { case PyUnicode_1BYTE_KIND: @@ -10491,9 +10664,9 @@ replace(PyObject *self, PyObject *str1, PyObject *str2, Py_ssize_t maxcount) { PyObject *u; - char *sbuf = PyUnicode_DATA(self); - char *buf1 = PyUnicode_DATA(str1); - char *buf2 = PyUnicode_DATA(str2); + const char *sbuf = PyUnicode_DATA(self); + const void *buf1 = PyUnicode_DATA(str1); + const void *buf2 = PyUnicode_DATA(str2); int srelease = 0, release1 = 0, release2 = 0; int skind = PyUnicode_KIND(self); int kind1 = PyUnicode_KIND(str1); @@ -10504,9 +10677,12 @@ replace(PyObject *self, PyObject *str1, int mayshrink; Py_UCS4 maxchar, maxchar_str1, maxchar_str2; + if (slen < len1) + goto nothing; + if (maxcount < 0) maxcount = PY_SSIZE_T_MAX; - else if (maxcount == 0 || slen == 0) + else if (maxcount == 0) goto nothing; if (str1 == str2) @@ -10551,7 +10727,7 @@ replace(PyObject *self, PyObject *str1, if (kind1 < rkind) { /* widen substring */ - buf1 = _PyUnicode_AsKind(str1, rkind); + buf1 = unicode_askind(kind1, buf1, len1, rkind); if (!buf1) goto error; release1 = 1; } @@ -10560,19 +10736,23 @@ replace(PyObject *self, PyObject *str1, goto nothing; if (rkind > kind2) { /* widen replacement */ - buf2 = _PyUnicode_AsKind(str2, rkind); + buf2 = unicode_askind(kind2, buf2, len2, rkind); if (!buf2) goto error; release2 = 1; } else if (rkind < kind2) { /* widen self and buf1 */ rkind = kind2; - if (release1) PyMem_Free(buf1); - release1 = 0; - sbuf = _PyUnicode_AsKind(self, rkind); + if (release1) { + assert(buf1 != PyUnicode_DATA(str1)); + PyMem_Free((void *)buf1); + buf1 = PyUnicode_DATA(str1); + release1 = 0; + } + sbuf = unicode_askind(skind, sbuf, slen, rkind); if (!sbuf) goto error; srelease = 1; - buf1 = _PyUnicode_AsKind(str1, rkind); + buf1 = unicode_askind(kind1, buf1, len1, rkind); if (!buf1) goto error; release1 = 1; } @@ -10610,7 +10790,7 @@ replace(PyObject *self, PyObject *str1, if (kind1 < rkind) { /* widen substring */ - buf1 = _PyUnicode_AsKind(str1, rkind); + buf1 = unicode_askind(kind1, buf1, len1, rkind); if (!buf1) goto error; release1 = 1; } @@ -10619,19 +10799,23 @@ replace(PyObject *self, PyObject *str1, goto nothing; if (kind2 < rkind) { /* widen replacement */ - buf2 = _PyUnicode_AsKind(str2, rkind); + buf2 = unicode_askind(kind2, buf2, len2, rkind); if (!buf2) goto error; release2 = 1; } else if (kind2 > rkind) { /* widen self and buf1 */ rkind = kind2; - sbuf = _PyUnicode_AsKind(self, rkind); + sbuf = unicode_askind(skind, sbuf, slen, rkind); if (!sbuf) goto error; srelease = 1; - if (release1) PyMem_Free(buf1); - release1 = 0; - buf1 = _PyUnicode_AsKind(str1, rkind); + if (release1) { + assert(buf1 != PyUnicode_DATA(str1)); + PyMem_Free((void *)buf1); + buf1 = PyUnicode_DATA(str1); + release1 = 0; + } + buf1 = unicode_askind(kind1, buf1, len1, rkind); if (!buf1) goto error; release1 = 1; } @@ -10719,32 +10903,41 @@ replace(PyObject *self, PyObject *str1, } done: + assert(srelease == (sbuf != PyUnicode_DATA(self))); + assert(release1 == (buf1 != PyUnicode_DATA(str1))); + assert(release2 == (buf2 != PyUnicode_DATA(str2))); if (srelease) - PyMem_FREE(sbuf); + PyMem_FREE((void *)sbuf); if (release1) - PyMem_FREE(buf1); + PyMem_FREE((void *)buf1); if (release2) - PyMem_FREE(buf2); + PyMem_FREE((void *)buf2); assert(_PyUnicode_CheckConsistency(u, 1)); return u; nothing: /* nothing to replace; return original string (when possible) */ + assert(srelease == (sbuf != PyUnicode_DATA(self))); + assert(release1 == (buf1 != PyUnicode_DATA(str1))); + assert(release2 == (buf2 != PyUnicode_DATA(str2))); if (srelease) - PyMem_FREE(sbuf); + PyMem_FREE((void *)sbuf); if (release1) - PyMem_FREE(buf1); + PyMem_FREE((void *)buf1); if (release2) - PyMem_FREE(buf2); + PyMem_FREE((void *)buf2); return unicode_result_unchanged(self); error: - if (srelease && sbuf) - PyMem_FREE(sbuf); - if (release1 && buf1) - PyMem_FREE(buf1); - if (release2 && buf2) - PyMem_FREE(buf2); + assert(srelease == (sbuf != PyUnicode_DATA(self))); + assert(release1 == (buf1 != PyUnicode_DATA(str1))); + assert(release2 == (buf2 != PyUnicode_DATA(str2))); + if (srelease) + PyMem_FREE((void *)sbuf); + if (release1) + PyMem_FREE((void *)buf1); + if (release2) + PyMem_FREE((void *)buf2); return NULL; } @@ -10881,7 +11074,7 @@ unicode_compare(PyObject *str1, PyObject *str2) while (0) int kind1, kind2; - void *data1, *data2; + const void *data1, *data2; Py_ssize_t len1, len2, len; kind1 = PyUnicode_KIND(str1); @@ -10982,7 +11175,7 @@ static int unicode_compare_eq(PyObject *str1, PyObject *str2) { int kind; - void *data1, *data2; + const void *data1, *data2; Py_ssize_t len; int cmp; @@ -11016,8 +11209,8 @@ PyUnicode_Compare(PyObject *left, PyObject *right) } PyErr_Format(PyExc_TypeError, "Can't compare %.100s and %.100s", - left->ob_type->tp_name, - right->ob_type->tp_name); + Py_TYPE(left)->tp_name, + Py_TYPE(right)->tp_name); return -1; } @@ -11067,7 +11260,7 @@ PyUnicode_CompareWithASCIIString(PyObject* uni, const char* str) return 0; } else { - void *data = PyUnicode_DATA(uni); + const void *data = PyUnicode_DATA(uni); /* Compare Unicode string and source character set string */ for (i = 0; (chr = PyUnicode_READ(kind, data, i)) && str[i]; i++) if (chr != (unsigned char)str[i]) @@ -11127,7 +11320,6 @@ int _PyUnicode_EqualToASCIIId(PyObject *left, _Py_Identifier *right) { PyObject *right_uni; - Py_hash_t hash; assert(_PyUnicode_CHECK(left)); assert(right->string); @@ -11159,10 +11351,12 @@ _PyUnicode_EqualToASCIIId(PyObject *left, _Py_Identifier *right) if (PyUnicode_CHECK_INTERNED(left)) return 0; +#ifdef INTERNED_STRINGS assert(_PyUnicode_HASH(right_uni) != -1); - hash = _PyUnicode_HASH(left); + Py_hash_t hash = _PyUnicode_HASH(left); if (hash != -1 && hash != _PyUnicode_HASH(right_uni)) return 0; +#endif return unicode_compare_eq(left, right_uni); } @@ -11216,7 +11410,7 @@ int PyUnicode_Contains(PyObject *str, PyObject *substr) { int kind1, kind2; - void *buf1, *buf2; + const void *buf1, *buf2; Py_ssize_t len1, len2; int result; @@ -11247,7 +11441,7 @@ PyUnicode_Contains(PyObject *str, PyObject *substr) return result; } if (kind2 != kind1) { - buf2 = _PyUnicode_AsKind(substr, kind1); + buf2 = unicode_askind(kind2, buf2, len2, kind1); if (!buf2) return -1; } @@ -11266,8 +11460,9 @@ PyUnicode_Contains(PyObject *str, PyObject *substr) Py_UNREACHABLE(); } + assert((kind2 == kind1) == (buf2 == PyUnicode_DATA(substr))); if (kind2 != kind1) - PyMem_Free(buf2); + PyMem_Free((void *)buf2); return result; } @@ -11287,7 +11482,7 @@ PyUnicode_Concat(PyObject *left, PyObject *right) if (!PyUnicode_Check(right)) { PyErr_Format(PyExc_TypeError, "can only concatenate str (not \"%.200s\") to str", - right->ob_type->tp_name); + Py_TYPE(right)->tp_name); return NULL; } if (PyUnicode_READY(right) < 0) @@ -11444,7 +11639,7 @@ unicode_count(PyObject *self, PyObject *args) Py_ssize_t end = PY_SSIZE_T_MAX; PyObject *result; int kind1, kind2; - void *buf1, *buf2; + const void *buf1, *buf2; Py_ssize_t len1, len2, iresult; if (!parse_args_finds_unicode("count", args, &substring, &start, &end)) @@ -11464,26 +11659,26 @@ unicode_count(PyObject *self, PyObject *args) buf1 = PyUnicode_DATA(self); buf2 = PyUnicode_DATA(substring); if (kind2 != kind1) { - buf2 = _PyUnicode_AsKind(substring, kind1); + buf2 = unicode_askind(kind2, buf2, len2, kind1); if (!buf2) return NULL; } switch (kind1) { case PyUnicode_1BYTE_KIND: iresult = ucs1lib_count( - ((Py_UCS1*)buf1) + start, end - start, + ((const Py_UCS1*)buf1) + start, end - start, buf2, len2, PY_SSIZE_T_MAX ); break; case PyUnicode_2BYTE_KIND: iresult = ucs2lib_count( - ((Py_UCS2*)buf1) + start, end - start, + ((const Py_UCS2*)buf1) + start, end - start, buf2, len2, PY_SSIZE_T_MAX ); break; case PyUnicode_4BYTE_KIND: iresult = ucs4lib_count( - ((Py_UCS4*)buf1) + start, end - start, + ((const Py_UCS4*)buf1) + start, end - start, buf2, len2, PY_SSIZE_T_MAX ); break; @@ -11493,8 +11688,9 @@ unicode_count(PyObject *self, PyObject *args) result = PyLong_FromSsize_t(iresult); + assert((kind2 == kind1) == (buf2 == PyUnicode_DATA(substring))); if (kind2 != kind1) - PyMem_Free(buf2); + PyMem_Free((void *)buf2); return result; } @@ -11538,7 +11734,8 @@ unicode_expandtabs_impl(PyObject *self, int tabsize) Py_ssize_t i, j, line_pos, src_len, incr; Py_UCS4 ch; PyObject *u; - void *src_data, *dest_data; + const void *src_data; + void *dest_data; int kind; int found; @@ -11644,7 +11841,7 @@ unicode_find(PyObject *self, PyObject *args) static PyObject * unicode_getitem(PyObject *self, Py_ssize_t index) { - void *data; + const void *data; enum PyUnicode_Kind kind; Py_UCS4 ch; @@ -11757,7 +11954,7 @@ unicode_islower_impl(PyObject *self) { Py_ssize_t i, length; int kind; - void *data; + const void *data; int cased; if (PyUnicode_READY(self) == -1) @@ -11802,7 +11999,7 @@ unicode_isupper_impl(PyObject *self) { Py_ssize_t i, length; int kind; - void *data; + const void *data; int cased; if (PyUnicode_READY(self) == -1) @@ -11847,7 +12044,7 @@ unicode_istitle_impl(PyObject *self) { Py_ssize_t i, length; int kind; - void *data; + const void *data; int cased, previous_is_cased; if (PyUnicode_READY(self) == -1) @@ -11905,7 +12102,7 @@ unicode_isspace_impl(PyObject *self) { Py_ssize_t i, length; int kind; - void *data; + const void *data; if (PyUnicode_READY(self) == -1) return NULL; @@ -11945,7 +12142,7 @@ unicode_isalpha_impl(PyObject *self) { Py_ssize_t i, length; int kind; - void *data; + const void *data; if (PyUnicode_READY(self) == -1) return NULL; @@ -11983,7 +12180,7 @@ unicode_isalnum_impl(PyObject *self) /*[clinic end generated code: output=a5a23490ffc3660c input=5c6579bf2e04758c]*/ { int kind; - void *data; + const void *data; Py_ssize_t len, i; if (PyUnicode_READY(self) == -1) @@ -12026,7 +12223,7 @@ unicode_isdecimal_impl(PyObject *self) { Py_ssize_t i, length; int kind; - void *data; + const void *data; if (PyUnicode_READY(self) == -1) return NULL; @@ -12065,7 +12262,7 @@ unicode_isdigit_impl(PyObject *self) { Py_ssize_t i, length; int kind; - void *data; + const void *data; if (PyUnicode_READY(self) == -1) return NULL; @@ -12105,7 +12302,7 @@ unicode_isnumeric_impl(PyObject *self) { Py_ssize_t i, length; int kind; - void *data; + const void *data; if (PyUnicode_READY(self) == -1) return NULL; @@ -12129,25 +12326,22 @@ unicode_isnumeric_impl(PyObject *self) Py_RETURN_TRUE; } -int -PyUnicode_IsIdentifier(PyObject *self) +Py_ssize_t +_PyUnicode_ScanIdentifier(PyObject *self) { - int kind; - void *data; Py_ssize_t i; - Py_UCS4 first; + if (PyUnicode_READY(self) == -1) + return -1; - if (PyUnicode_READY(self) == -1) { - Py_FatalError("identifier not ready"); + Py_ssize_t len = PyUnicode_GET_LENGTH(self); + if (len == 0) { + /* an empty string is not a valid identifier */ return 0; } - /* Special case for empty strings */ - if (PyUnicode_GET_LENGTH(self) == 0) - return 0; - kind = PyUnicode_KIND(self); - data = PyUnicode_DATA(self); - + int kind = PyUnicode_KIND(self); + const void *data = PyUnicode_DATA(self); + Py_UCS4 ch = PyUnicode_READ(kind, data, 0); /* PEP 3131 says that the first character must be in XID_Start and subsequent characters in XID_Continue, and for the ASCII range, the 2.x rules apply (i.e @@ -12156,14 +12350,70 @@ PyUnicode_IsIdentifier(PyObject *self) definition of XID_Start and XID_Continue, it is sufficient to check just for these, except that _ must be allowed as starting an identifier. */ - first = PyUnicode_READ(kind, data, 0); - if (!_PyUnicode_IsXidStart(first) && first != 0x5F /* LOW LINE */) + if (!_PyUnicode_IsXidStart(ch) && ch != 0x5F /* LOW LINE */) { return 0; + } - for (i = 1; i < PyUnicode_GET_LENGTH(self); i++) - if (!_PyUnicode_IsXidContinue(PyUnicode_READ(kind, data, i))) + for (i = 1; i < len; i++) { + ch = PyUnicode_READ(kind, data, i); + if (!_PyUnicode_IsXidContinue(ch)) { + return i; + } + } + return i; +} + +int +PyUnicode_IsIdentifier(PyObject *self) +{ + if (PyUnicode_IS_READY(self)) { + Py_ssize_t i = _PyUnicode_ScanIdentifier(self); + Py_ssize_t len = PyUnicode_GET_LENGTH(self); + /* an empty string is not a valid identifier */ + return len && i == len; + } + else { +_Py_COMP_DIAG_PUSH +_Py_COMP_DIAG_IGNORE_DEPR_DECLS + Py_ssize_t i = 0, len = PyUnicode_GET_SIZE(self); + if (len == 0) { + /* an empty string is not a valid identifier */ return 0; - return 1; + } + + const wchar_t *wstr = _PyUnicode_WSTR(self); + Py_UCS4 ch = wstr[i++]; +#if SIZEOF_WCHAR_T == 2 + if (Py_UNICODE_IS_HIGH_SURROGATE(ch) + && i < len + && Py_UNICODE_IS_LOW_SURROGATE(wstr[i])) + { + ch = Py_UNICODE_JOIN_SURROGATES(ch, wstr[i]); + i++; + } +#endif + if (!_PyUnicode_IsXidStart(ch) && ch != 0x5F /* LOW LINE */) { + return 0; + } + + while (i < len) { + ch = wstr[i++]; +#if SIZEOF_WCHAR_T == 2 + if (Py_UNICODE_IS_HIGH_SURROGATE(ch) + && i < len + && Py_UNICODE_IS_LOW_SURROGATE(wstr[i])) + { + ch = Py_UNICODE_JOIN_SURROGATES(ch, wstr[i]); + i++; + } +#endif + if (!_PyUnicode_IsXidContinue(ch)) { + return 0; + } + } + return 1; +_Py_COMP_DIAG_POP + } } /*[clinic input] @@ -12197,7 +12447,7 @@ unicode_isprintable_impl(PyObject *self) { Py_ssize_t i, length; int kind; - void *data; + const void *data; if (PyUnicode_READY(self) == -1) return NULL; @@ -12302,7 +12552,7 @@ static const char *stripfuncnames[] = {"lstrip", "rstrip", "strip"}; PyObject * _PyUnicode_XStrip(PyObject *self, int striptype, PyObject *sepobj) { - void *data; + const void *data; int kind; Py_ssize_t i, j, len; BLOOM_MASK sepmask; @@ -12352,7 +12602,7 @@ _PyUnicode_XStrip(PyObject *self, int striptype, PyObject *sepobj) PyObject* PyUnicode_Substring(PyObject *self, Py_ssize_t start, Py_ssize_t end) { - unsigned char *data; + const unsigned char *data; int kind; Py_ssize_t length; @@ -12375,7 +12625,7 @@ PyUnicode_Substring(PyObject *self, Py_ssize_t start, Py_ssize_t end) length = end - start; if (PyUnicode_IS_ASCII(self)) { data = PyUnicode_1BYTE_DATA(self); - return _PyUnicode_FromASCII((char*)(data + start), length); + return _PyUnicode_FromASCII((const char*)(data + start), length); } else { kind = PyUnicode_KIND(self); @@ -12397,7 +12647,7 @@ do_strip(PyObject *self, int striptype) len = PyUnicode_GET_LENGTH(self); if (PyUnicode_IS_ASCII(self)) { - Py_UCS1 *data = PyUnicode_1BYTE_DATA(self); + const Py_UCS1 *data = PyUnicode_1BYTE_DATA(self); i = 0; if (striptype != RIGHTSTRIP) { @@ -12423,7 +12673,7 @@ do_strip(PyObject *self, int striptype) } else { int kind = PyUnicode_KIND(self); - void *data = PyUnicode_DATA(self); + const void *data = PyUnicode_DATA(self); i = 0; if (striptype != RIGHTSTRIP) { @@ -12556,8 +12806,8 @@ unicode_repeat(PyObject *str, Py_ssize_t len) assert(PyUnicode_KIND(u) == PyUnicode_KIND(str)); if (PyUnicode_GET_LENGTH(str) == 1) { - const int kind = PyUnicode_KIND(str); - const Py_UCS4 fill_char = PyUnicode_READ(kind, PyUnicode_DATA(str), 0); + int kind = PyUnicode_KIND(str); + Py_UCS4 fill_char = PyUnicode_READ(kind, PyUnicode_DATA(str), 0); if (kind == PyUnicode_1BYTE_KIND) { void *to = PyUnicode_DATA(u); memset(to, (unsigned char)fill_char, len); @@ -12576,7 +12826,7 @@ unicode_repeat(PyObject *str, Py_ssize_t len) else { /* number of characters copied this far */ Py_ssize_t done = PyUnicode_GET_LENGTH(str); - const Py_ssize_t char_size = PyUnicode_KIND(str); + Py_ssize_t char_size = PyUnicode_KIND(str); char *to = (char *) PyUnicode_DATA(u); memcpy(to, PyUnicode_DATA(str), PyUnicode_GET_LENGTH(str) * char_size); @@ -12629,6 +12879,61 @@ unicode_replace_impl(PyObject *self, PyObject *old, PyObject *new, return replace(self, old, new, count); } +/*[clinic input] +str.removeprefix as unicode_removeprefix + + prefix: unicode + / + +Return a str with the given prefix string removed if present. + +If the string starts with the prefix string, return string[len(prefix):]. +Otherwise, return a copy of the original string. +[clinic start generated code]*/ + +static PyObject * +unicode_removeprefix_impl(PyObject *self, PyObject *prefix) +/*[clinic end generated code: output=f1e5945e9763bcb9 input=27ec40b99a37eb88]*/ +{ + int match = tailmatch(self, prefix, 0, PY_SSIZE_T_MAX, -1); + if (match == -1) { + return NULL; + } + if (match) { + return PyUnicode_Substring(self, PyUnicode_GET_LENGTH(prefix), + PyUnicode_GET_LENGTH(self)); + } + return unicode_result_unchanged(self); +} + +/*[clinic input] +str.removesuffix as unicode_removesuffix + + suffix: unicode + / + +Return a str with the given suffix string removed if present. + +If the string ends with the suffix string and that suffix is not empty, +return string[:-len(suffix)]. Otherwise, return a copy of the original +string. +[clinic start generated code]*/ + +static PyObject * +unicode_removesuffix_impl(PyObject *self, PyObject *suffix) +/*[clinic end generated code: output=d36629e227636822 input=12cc32561e769be4]*/ +{ + int match = tailmatch(self, suffix, 0, PY_SSIZE_T_MAX, +1); + if (match == -1) { + return NULL; + } + if (match) { + return PyUnicode_Substring(self, 0, PyUnicode_GET_LENGTH(self) + - PyUnicode_GET_LENGTH(suffix)); + } + return unicode_result_unchanged(self); +} + static PyObject * unicode_repr(PyObject *unicode) { @@ -12637,7 +12942,8 @@ unicode_repr(PyObject *unicode) Py_ssize_t osize, squote, dquote, i, o; Py_UCS4 max, quote; int ikind, okind, unchanged; - void *idata, *odata; + const void *idata; + void *odata; if (PyUnicode_READY(unicode) == -1) return NULL; @@ -12930,7 +13236,7 @@ PyUnicode_Partition(PyObject *str_obj, PyObject *sep_obj) { PyObject* out; int kind1, kind2; - void *buf1, *buf2; + const void *buf1, *buf2; Py_ssize_t len1, len2; if (ensure_unicode(str_obj) < 0 || ensure_unicode(sep_obj) < 0) @@ -12953,7 +13259,7 @@ PyUnicode_Partition(PyObject *str_obj, PyObject *sep_obj) buf1 = PyUnicode_DATA(str_obj); buf2 = PyUnicode_DATA(sep_obj); if (kind2 != kind1) { - buf2 = _PyUnicode_AsKind(sep_obj, kind1); + buf2 = unicode_askind(kind2, buf2, len2, kind1); if (!buf2) return NULL; } @@ -12975,8 +13281,9 @@ PyUnicode_Partition(PyObject *str_obj, PyObject *sep_obj) Py_UNREACHABLE(); } + assert((kind2 == kind1) == (buf2 == PyUnicode_DATA(sep_obj))); if (kind2 != kind1) - PyMem_Free(buf2); + PyMem_Free((void *)buf2); return out; } @@ -12987,7 +13294,7 @@ PyUnicode_RPartition(PyObject *str_obj, PyObject *sep_obj) { PyObject* out; int kind1, kind2; - void *buf1, *buf2; + const void *buf1, *buf2; Py_ssize_t len1, len2; if (ensure_unicode(str_obj) < 0 || ensure_unicode(sep_obj) < 0) @@ -13010,7 +13317,7 @@ PyUnicode_RPartition(PyObject *str_obj, PyObject *sep_obj) buf1 = PyUnicode_DATA(str_obj); buf2 = PyUnicode_DATA(sep_obj); if (kind2 != kind1) { - buf2 = _PyUnicode_AsKind(sep_obj, kind1); + buf2 = unicode_askind(kind2, buf2, len2, kind1); if (!buf2) return NULL; } @@ -13032,8 +13339,9 @@ PyUnicode_RPartition(PyObject *str_obj, PyObject *sep_obj) Py_UNREACHABLE(); } + assert((kind2 == kind1) == (buf2 == PyUnicode_DATA(sep_obj))); if (kind2 != kind1) - PyMem_Free(buf2); + PyMem_Free((void *)buf2); return out; } @@ -13189,7 +13497,7 @@ unicode_maketrans_impl(PyObject *x, PyObject *y, PyObject *z) return NULL; if (y != NULL) { int x_kind, y_kind, z_kind; - void *x_data, *y_data, *z_data; + const void *x_data, *y_data, *z_data; /* x must be a string too, of equal length */ if (!PyUnicode_Check(x)) { @@ -13238,7 +13546,7 @@ unicode_maketrans_impl(PyObject *x, PyObject *y, PyObject *z) } } else { int kind; - void *data; + const void *data; /* x must be a dict */ if (!PyDict_CheckExact(x)) { @@ -13339,7 +13647,7 @@ unicode_zfill_impl(PyObject *self, Py_ssize_t width) Py_ssize_t fill; PyObject *u; int kind; - void *data; + const void *data; Py_UCS4 chr; if (PyUnicode_READY(self) == -1) @@ -13520,6 +13828,16 @@ _PyUnicodeWriter_Init(_PyUnicodeWriter *writer) assert(writer->kind <= PyUnicode_1BYTE_KIND); } +// Initialize _PyUnicodeWriter with initial buffer +static inline void +_PyUnicodeWriter_InitWithBuffer(_PyUnicodeWriter *writer, PyObject *buffer) +{ + memset(writer, 0, sizeof(*writer)); + writer->buffer = buffer; + _PyUnicodeWriter_Update(writer); + writer->min_length = writer->size; +} + int _PyUnicodeWriter_PrepareInternal(_PyUnicodeWriter *writer, Py_ssize_t length, Py_UCS4 maxchar) @@ -13932,6 +14250,8 @@ static PyMethodDef unicode_methods[] = { UNICODE_UPPER_METHODDEF {"startswith", (PyCFunction) unicode_startswith, METH_VARARGS, startswith__doc__}, {"endswith", (PyCFunction) unicode_endswith, METH_VARARGS, endswith__doc__}, + UNICODE_REMOVEPREFIX_METHODDEF + UNICODE_REMOVESUFFIX_METHODDEF UNICODE_ISASCII_METHODDEF UNICODE_ISLOWER_METHODDEF UNICODE_ISUPPER_METHODDEF @@ -13991,7 +14311,7 @@ unicode_subscript(PyObject* self, PyObject* item) if (PyUnicode_READY(self) == -1) return NULL; - if (PyIndex_Check(item)) { + if (_PyIndex_Check(item)) { Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) return NULL; @@ -14002,7 +14322,8 @@ unicode_subscript(PyObject* self, PyObject* item) Py_ssize_t start, stop, step, slicelength, i; size_t cur; PyObject *result; - void *src_data, *dest_data; + const void *src_data; + void *dest_data; int src_kind, dest_kind; Py_UCS4 ch, max_char, kind_limit; @@ -14073,7 +14394,7 @@ struct unicode_formatter_t { enum PyUnicode_Kind fmtkind; Py_ssize_t fmtcnt, fmtpos; - void *fmtdata; + const void *fmtdata; PyObject *fmtstr; _PyUnicodeWriter writer; @@ -14747,7 +15068,7 @@ unicode_format_arg_output(struct unicode_formatter_t *ctx, { Py_ssize_t len; enum PyUnicode_Kind kind; - void *pbuf; + const void *pbuf; Py_ssize_t pindex; Py_UCS4 signchar; Py_ssize_t buflen; @@ -15251,33 +15572,31 @@ _PyUnicode_Init(void) return _PyStatus_OK(); } -/* Finalize the Unicode implementation */ - -int -PyUnicode_ClearFreeList(void) -{ - return 0; -} - void PyUnicode_InternInPlace(PyObject **p) { PyObject *s = *p; - PyObject *t; #ifdef Py_DEBUG assert(s != NULL); assert(_PyUnicode_CHECK(s)); #else - if (s == NULL || !PyUnicode_Check(s)) + if (s == NULL || !PyUnicode_Check(s)) { return; + } #endif + /* If it's a subclass, we don't really know what putting it in the interned dict might do. */ - if (!PyUnicode_CheckExact(s)) + if (!PyUnicode_CheckExact(s)) { return; - if (PyUnicode_CHECK_INTERNED(s)) + } + + if (PyUnicode_CHECK_INTERNED(s)) { return; + } + +#ifdef INTERNED_STRINGS if (interned == NULL) { interned = PyDict_New(); if (interned == NULL) { @@ -15285,22 +15604,26 @@ PyUnicode_InternInPlace(PyObject **p) return; } } - Py_ALLOW_RECURSION + + PyObject *t; t = PyDict_SetDefault(interned, s, s); - Py_END_ALLOW_RECURSION + if (t == NULL) { PyErr_Clear(); return; } + if (t != s) { Py_INCREF(t); Py_SETREF(*p, t); return; } + /* The two references in interned are not counted by refcnt. The deallocator will take care of this */ - Py_REFCNT(s) -= 2; + Py_SET_REFCNT(s, Py_REFCNT(s) - 2); _PyUnicode_STATE(s).interned = SSTATE_INTERNED_MORTAL; +#endif } void @@ -15328,14 +15651,10 @@ PyUnicode_InternFromString(const char *cp) static void unicode_release_interned(void) { - PyObject *keys; - PyObject *s; - Py_ssize_t i, n; - Py_ssize_t immortal_size = 0, mortal_size = 0; - - if (interned == NULL || !PyDict_Check(interned)) + if (interned == NULL || !PyDict_Check(interned)) { return; - keys = PyDict_Keys(interned); + } + PyObject *keys = PyDict_Keys(interned); if (keys == NULL || !PyList_Check(keys)) { PyErr_Clear(); return; @@ -15346,30 +15665,35 @@ unicode_release_interned(void) rather, we give them their stolen references back, and then clear and DECREF the interned dict. */ - n = PyList_GET_SIZE(keys); + Py_ssize_t n = PyList_GET_SIZE(keys); #ifdef INTERNED_STATS fprintf(stderr, "releasing %" PY_FORMAT_SIZE_T "d interned strings\n", n); + + Py_ssize_t immortal_size = 0, mortal_size = 0; #endif - for (i = 0; i < n; i++) { - s = PyList_GET_ITEM(keys, i); + for (Py_ssize_t i = 0; i < n; i++) { + PyObject *s = PyList_GET_ITEM(keys, i); if (PyUnicode_READY(s) == -1) { Py_UNREACHABLE(); } switch (PyUnicode_CHECK_INTERNED(s)) { - case SSTATE_NOT_INTERNED: - /* XXX Shouldn't happen */ - break; case SSTATE_INTERNED_IMMORTAL: Py_REFCNT(s) += 1; +#ifdef INTERNED_STATS immortal_size += PyUnicode_GET_LENGTH(s); +#endif break; case SSTATE_INTERNED_MORTAL: Py_REFCNT(s) += 2; +#ifdef INTERNED_STATS mortal_size += PyUnicode_GET_LENGTH(s); +#endif break; + case SSTATE_NOT_INTERNED: + /* fall through */ default: - Py_FatalError("Inconsistent interned string state."); + Py_UNREACHABLE(); } _PyUnicode_STATE(s).interned = SSTATE_NOT_INTERNED; } @@ -15421,7 +15745,7 @@ unicodeiter_next(unicodeiterobject *it) if (it->it_index < PyUnicode_GET_LENGTH(seq)) { int kind = PyUnicode_KIND(seq); - void *data = PyUnicode_DATA(seq); + const void *data = PyUnicode_DATA(seq); Py_UCS4 chr = PyUnicode_READ(kind, data, it->it_index); item = PyUnicode_FromOrdinal(chr); if (item != NULL) @@ -15642,7 +15966,10 @@ PyUnicode_AsUnicodeCopy(PyObject *unicode) PyErr_BadArgument(); return NULL; } +_Py_COMP_DIAG_PUSH +_Py_COMP_DIAG_IGNORE_DEPR_DECLS u = PyUnicode_AsUnicodeAndSize(unicode, &len); +_Py_COMP_DIAG_POP if (u == NULL) return NULL; /* Ensure we won't overflow the size. */ @@ -15730,7 +16057,7 @@ static PyStatus init_stdio_encoding(PyThreadState *tstate) { /* Update the stdio encoding to the normalized Python codec name. */ - PyConfig *config = &tstate->interp->config; + PyConfig *config = (PyConfig*)_PyInterpreterState_GetConfig(tstate->interp); if (config_get_codec_name(&config->stdio_encoding) < 0) { return _PyStatus_ERR("failed to get the Python codec name " "of the stdio encoding"); @@ -15742,7 +16069,7 @@ init_stdio_encoding(PyThreadState *tstate) static int init_fs_codec(PyInterpreterState *interp) { - PyConfig *config = &interp->config; + const PyConfig *config = _PyInterpreterState_GetConfig(interp); _Py_error_handler error_handler; error_handler = get_error_handler_wide(config->filesystem_errors); @@ -15765,11 +16092,18 @@ init_fs_codec(PyInterpreterState *interp) return -1; } - PyMem_RawFree(interp->fs_codec.encoding); - interp->fs_codec.encoding = encoding; - PyMem_RawFree(interp->fs_codec.errors); - interp->fs_codec.errors = errors; - interp->fs_codec.error_handler = error_handler; + struct _Py_unicode_fs_codec *fs_codec = &interp->unicode.fs_codec; + PyMem_RawFree(fs_codec->encoding); + fs_codec->encoding = encoding; + /* encoding has been normalized by init_fs_encoding() */ + fs_codec->utf8 = (strcmp(encoding, "utf-8") == 0); + PyMem_RawFree(fs_codec->errors); + fs_codec->errors = errors; + fs_codec->error_handler = error_handler; + +#ifdef _Py_FORCE_UTF8_FS_ENCODING + assert(fs_codec->utf8 == 1); +#endif /* At this point, PyUnicode_EncodeFSDefault() and PyUnicode_DecodeFSDefault() can now use the Python codec rather than @@ -15777,8 +16111,8 @@ init_fs_codec(PyInterpreterState *interp) /* Set Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors global configuration variables. */ - if (_Py_SetFileSystemEncoding(interp->fs_codec.encoding, - interp->fs_codec.errors) < 0) { + if (_Py_SetFileSystemEncoding(fs_codec->encoding, + fs_codec->errors) < 0) { PyErr_NoMemory(); return -1; } @@ -15794,7 +16128,7 @@ init_fs_encoding(PyThreadState *tstate) /* Update the filesystem encoding to the normalized Python codec name. For example, replace "ANSI_X3.4-1968" (locale encoding) with "ascii" (Python codec name). */ - PyConfig *config = &interp->config; + PyConfig *config = (PyConfig*)_PyInterpreterState_GetConfig(interp); if (config_get_codec_name(&config->filesystem_encoding) < 0) { _Py_DumpPathConfig(tstate); return _PyStatus_ERR("failed to get the Python codec " @@ -15820,12 +16154,24 @@ _PyUnicode_InitEncodings(PyThreadState *tstate) } +static void +_PyUnicode_FiniEncodings(struct _Py_unicode_fs_codec *fs_codec) +{ + PyMem_RawFree(fs_codec->encoding); + fs_codec->encoding = NULL; + fs_codec->utf8 = 0; + PyMem_RawFree(fs_codec->errors); + fs_codec->errors = NULL; + fs_codec->error_handler = _Py_ERROR_UNKNOWN; +} + + #ifdef MS_WINDOWS int _PyUnicode_EnableLegacyWindowsFSEncoding(void) { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - PyConfig *config = &interp->config; + PyInterpreterState *interp = _PyInterpreterState_GET(); + PyConfig *config = (PyConfig *)_PyInterpreterState_GetConfig(interp); /* Set the filesystem encoding to mbcs/replace (PEP 529) */ wchar_t *encoding = _PyMem_RawWcsdup(L"mbcs"); @@ -15848,34 +16194,33 @@ _PyUnicode_EnableLegacyWindowsFSEncoding(void) void -_PyUnicode_Fini(void) +_PyUnicode_Fini(PyThreadState *tstate) { + if (_Py_IsMainInterpreter(tstate)) { #if defined(WITH_VALGRIND) || defined(__INSURE__) - /* Insure++ is a memory analysis tool that aids in discovering - * memory leaks and other memory problems. On Python exit, the - * interned string dictionaries are flagged as being in use at exit - * (which it is). Under normal circumstances, this is fine because - * the memory will be automatically reclaimed by the system. Under - * memory debugging, it's a huge source of useless noise, so we - * trade off slower shutdown for less distraction in the memory - * reports. -baw - */ - unicode_release_interned(); + /* Insure++ is a memory analysis tool that aids in discovering + * memory leaks and other memory problems. On Python exit, the + * interned string dictionaries are flagged as being in use at exit + * (which it is). Under normal circumstances, this is fine because + * the memory will be automatically reclaimed by the system. Under + * memory debugging, it's a huge source of useless noise, so we + * trade off slower shutdown for less distraction in the memory + * reports. -baw + */ + unicode_release_interned(); #endif /* __INSURE__ */ - Py_CLEAR(unicode_empty); + Py_CLEAR(unicode_empty); - for (Py_ssize_t i = 0; i < 256; i++) { - Py_CLEAR(unicode_latin1[i]); +#ifdef LATIN1_SINGLETONS + for (Py_ssize_t i = 0; i < 256; i++) { + Py_CLEAR(unicode_latin1[i]); + } +#endif + unicode_clear_static_strings(); } - _PyUnicode_ClearStaticStrings(); - (void)PyUnicode_ClearFreeList(); - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - PyMem_RawFree(interp->fs_codec.encoding); - interp->fs_codec.encoding = NULL; - PyMem_RawFree(interp->fs_codec.errors); - interp->fs_codec.errors = NULL; + _PyUnicode_FiniEncodings(&tstate->interp->unicode.fs_codec); } diff --git a/Objects/unicodetype_db.h b/Objects/unicodetype_db.h index 693e0b3ef0b499f7972b30b2c3243bf80af249b1..f668ed7ad5f999eefe396afee8c4403b6c87d132 100644 --- a/Objects/unicodetype_db.h +++ b/Objects/unicodetype_db.h @@ -1782,71 +1782,71 @@ static const unsigned short index1[] = { 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 127, 128, 129, 130, 131, 132, 133, 34, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 144, 34, 34, 151, 144, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 144, 163, 144, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 144, 173, 174, 144, 175, 176, 177, 178, - 144, 179, 180, 144, 181, 182, 183, 144, 144, 184, 185, 186, 187, 144, - 188, 144, 189, 34, 34, 34, 34, 34, 34, 34, 190, 191, 34, 192, 144, 144, + 155, 156, 157, 158, 159, 160, 161, 162, 144, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 144, 174, 175, 144, 176, 177, 178, 179, + 144, 180, 181, 182, 183, 184, 185, 144, 144, 186, 187, 188, 189, 144, + 190, 144, 191, 34, 34, 34, 34, 34, 34, 34, 192, 193, 34, 194, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 34, 34, 34, 34, 34, 34, 34, 34, 193, 144, 144, + 144, 144, 144, 144, 144, 34, 34, 34, 34, 34, 34, 34, 34, 195, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 34, 34, 34, 34, 194, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 34, 34, 34, 34, 196, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 34, 34, 34, 34, 195, 196, 197, 198, 144, 144, 144, 144, 199, - 200, 201, 202, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 144, 144, 34, 34, 34, 34, 197, 198, 199, 200, 144, 144, 144, 144, 201, + 202, 203, 204, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 203, 34, 34, - 34, 34, 34, 204, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 205, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 206, 207, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 34, 34, 205, 34, 34, 206, 144, 144, + 144, 144, 144, 144, 144, 144, 34, 34, 208, 34, 34, 209, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 207, 208, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 210, 211, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 64, - 209, 210, 211, 212, 213, 214, 144, 215, 216, 217, 218, 219, 220, 221, - 222, 64, 64, 64, 64, 223, 224, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 225, 144, 226, 144, 144, 227, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 34, 228, 229, 144, 144, 144, 144, 144, 230, 231, 232, - 144, 233, 234, 144, 144, 235, 236, 237, 238, 239, 144, 64, 240, 64, 64, - 64, 64, 64, 241, 242, 243, 244, 245, 246, 247, 248, 249, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 250, 251, 252, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 86, 253, 34, 254, 255, 34, 34, 34, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 64, 212, + 213, 214, 215, 216, 217, 144, 218, 219, 220, 221, 222, 223, 224, 225, 64, + 64, 64, 64, 226, 227, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 228, 144, 229, 144, 144, 230, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 34, 231, 232, 144, 144, 144, 144, 144, 233, 234, 235, 144, 236, + 237, 144, 144, 238, 239, 240, 241, 242, 144, 64, 243, 64, 64, 64, 64, 64, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 64, 253, 144, 144, 144, 144, + 144, 144, 144, 144, 254, 255, 256, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 86, 257, 34, 258, 259, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 256, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 257, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 260, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 261, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 262, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 258, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 259, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 263, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 264, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 260, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 261, 34, - 262, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 265, 34, 266, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 263, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 267, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 264, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 34, 256, 34, 34, 265, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 268, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 34, 260, 34, 34, 269, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 270, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, @@ -2246,8 +2246,7 @@ static const unsigned short index1[] = { 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 266, 144, - 267, 268, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 271, 144, 272, 273, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, @@ -2283,7 +2282,7 @@ static const unsigned short index1[] = { 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 126, 126, 126, 126, 126, 126, 126, 126, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, @@ -2319,8 +2318,8 @@ static const unsigned short index1[] = { 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 269, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 274, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, @@ -2356,7 +2355,7 @@ static const unsigned short index1[] = { 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 269, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 274, }; static const unsigned short index2[] = { @@ -2435,7 +2434,7 @@ static const unsigned short index2[] = { 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 0, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 0, 0, 103, 5, 5, 5, 5, 5, 5, 20, 137, 137, 137, 137, + 136, 136, 136, 136, 0, 0, 103, 5, 5, 5, 5, 5, 6, 20, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 138, 20, 5, 5, 0, 0, 5, 5, 5, 0, 25, 25, @@ -2481,69 +2480,69 @@ static const unsigned short index2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 21, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 21, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 25, 18, 25, 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 18, - 18, 18, 18, 25, 18, 18, 55, 25, 25, 25, 25, 25, 25, 25, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 25, 25, 5, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 5, 103, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 25, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 0, 0, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 0, 0, 0, 55, 55, 55, - 55, 0, 0, 25, 55, 18, 18, 18, 25, 25, 25, 25, 0, 0, 18, 18, 0, 0, 18, 18, - 25, 55, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 55, 55, 0, 55, 55, 55, - 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 5, 5, 27, 27, - 27, 27, 27, 27, 5, 5, 55, 5, 25, 0, 0, 25, 25, 18, 0, 55, 55, 55, 55, 55, - 55, 0, 0, 0, 0, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, - 55, 0, 55, 55, 0, 55, 55, 0, 55, 55, 0, 0, 25, 0, 18, 18, 18, 25, 25, 0, - 0, 0, 0, 25, 25, 0, 0, 25, 25, 25, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 55, - 55, 55, 55, 0, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 25, 25, 55, 55, 55, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 18, - 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, 0, 0, - 25, 55, 18, 18, 18, 25, 25, 25, 25, 25, 0, 25, 25, 18, 0, 18, 18, 25, 0, - 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 25, 25, 0, 0, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 0, 0, 0, 0, 0, 0, 0, 55, 25, - 25, 25, 25, 25, 25, 0, 25, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, - 0, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, - 0, 55, 55, 55, 55, 55, 0, 0, 25, 55, 18, 25, 18, 25, 25, 25, 25, 0, 0, - 18, 18, 0, 0, 18, 18, 25, 0, 0, 0, 0, 0, 0, 0, 0, 25, 18, 0, 0, 0, 0, 55, - 55, 0, 55, 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, - 55, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 55, 0, 55, - 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 0, 55, 55, 55, 55, 0, 0, 0, 55, - 55, 0, 55, 0, 55, 55, 0, 0, 0, 55, 55, 0, 0, 0, 55, 55, 55, 0, 0, 0, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 18, 18, 25, 18, - 18, 0, 0, 0, 18, 18, 18, 0, 18, 18, 18, 25, 0, 0, 55, 0, 0, 0, 0, 0, 0, - 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 25, 18, - 18, 18, 25, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 0, 0, 0, 55, 25, 25, 25, 18, 18, 18, 18, 0, 25, 25, 25, 0, 25, 25, - 25, 25, 0, 0, 0, 0, 0, 0, 0, 25, 25, 0, 55, 55, 55, 0, 0, 0, 0, 0, 55, - 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, - 0, 5, 27, 27, 27, 27, 27, 27, 27, 5, 55, 25, 18, 18, 5, 55, 55, 55, 55, - 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 25, 25, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 25, 18, 25, 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, + 25, 25, 18, 18, 18, 18, 25, 18, 18, 55, 25, 25, 25, 25, 25, 25, 25, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 5, 5, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 5, 103, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 25, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, + 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 0, 0, 0, 55, + 55, 55, 55, 0, 0, 25, 55, 18, 18, 18, 25, 25, 25, 25, 0, 0, 18, 18, 0, 0, + 18, 18, 25, 55, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 55, 55, 0, 55, + 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 5, 5, + 27, 27, 27, 27, 27, 27, 5, 5, 55, 5, 25, 0, 0, 25, 25, 18, 0, 55, 55, 55, + 55, 55, 55, 0, 0, 0, 0, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 0, 0, 25, 55, 18, 25, 18, - 18, 18, 18, 18, 0, 25, 18, 18, 0, 18, 18, 25, 25, 0, 0, 0, 0, 0, 0, 0, - 18, 18, 0, 0, 0, 0, 0, 0, 0, 55, 0, 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, + 55, 55, 55, 0, 55, 55, 0, 55, 55, 0, 55, 55, 0, 0, 25, 0, 18, 18, 18, 25, + 25, 0, 0, 0, 0, 25, 25, 0, 0, 25, 25, 25, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, + 0, 55, 55, 55, 55, 0, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 25, 25, 55, 55, 55, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, + 25, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, + 0, 0, 25, 55, 18, 18, 18, 25, 25, 25, 25, 25, 0, 25, 25, 18, 0, 18, 18, + 25, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 25, + 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 0, 0, 0, 0, 0, 0, 0, + 55, 25, 25, 25, 25, 25, 25, 0, 25, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, + 55, 0, 0, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, + 55, 55, 0, 55, 55, 55, 55, 55, 0, 0, 25, 55, 18, 25, 18, 25, 25, 25, 25, + 0, 0, 18, 18, 0, 0, 18, 18, 25, 0, 0, 0, 0, 0, 0, 0, 25, 25, 18, 0, 0, 0, + 0, 55, 55, 0, 55, 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 5, 55, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 55, + 0, 55, 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 0, 55, 55, 55, 55, 0, 0, + 0, 55, 55, 0, 55, 0, 55, 55, 0, 0, 0, 55, 55, 0, 0, 0, 55, 55, 55, 0, 0, + 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 18, 18, + 25, 18, 18, 0, 0, 0, 18, 18, 18, 0, 18, 18, 18, 25, 0, 0, 55, 0, 0, 0, 0, + 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 25, + 18, 18, 18, 25, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 0, 0, 0, 55, 25, 25, 25, 18, 18, 18, 18, 0, 25, 25, 25, 0, 25, + 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 25, 25, 0, 55, 55, 55, 0, 0, 0, 0, 0, + 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, + 0, 0, 5, 27, 27, 27, 27, 27, 27, 27, 5, 55, 25, 18, 18, 5, 55, 55, 55, + 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 0, 0, 25, 55, 18, 25, + 18, 18, 18, 18, 18, 0, 25, 18, 18, 0, 18, 18, 25, 25, 0, 0, 0, 0, 0, 0, + 0, 18, 18, 0, 0, 0, 0, 0, 0, 0, 55, 0, 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 25, 25, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, + 25, 25, 18, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 55, 18, 18, 18, 25, 25, 25, 25, 0, 18, 18, 18, 0, 18, 18, 18, 25, 55, 5, 0, 0, 0, 0, 55, 55, 55, 18, 27, 27, 27, 27, 27, 27, 27, 55, 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 55, 55, 55, 55, 55, 55, 0, 0, 18, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 55, 55, 55, 55, 55, 55, 0, 25, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, @@ -2698,53 +2697,53 @@ static const unsigned short index2[] = { 0, 0, 25, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 103, 5, 5, 5, 5, 5, 5, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 25, 25, 6, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, - 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 25, 25, 25, - 25, 25, 18, 25, 18, 18, 18, 18, 18, 25, 18, 18, 55, 55, 55, 55, 55, 55, - 55, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, + 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 18, 25, 25, 25, 25, 18, 18, 25, 25, 18, 25, 25, 25, 55, - 55, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 25, 25, + 25, 25, 25, 18, 25, 18, 18, 18, 18, 18, 25, 18, 18, 55, 55, 55, 55, 55, + 55, 55, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 18, 25, 25, 25, 25, 18, 18, 25, 25, 18, 25, 25, + 25, 55, 55, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 25, 18, 25, 25, 18, 18, 18, 25, 18, 25, 25, 25, 18, 18, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 18, 18, 18, 18, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, - 25, 25, 18, 18, 25, 25, 0, 0, 0, 5, 5, 5, 5, 5, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 0, 0, 0, 55, 55, 55, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, + 55, 55, 25, 18, 25, 25, 18, 18, 18, 25, 18, 25, 25, 25, 18, 18, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, 103, 103, 103, 103, 103, - 5, 5, 245, 246, 247, 248, 249, 250, 251, 252, 253, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 18, 18, 18, 18, 18, 25, 25, 25, + 25, 25, 25, 25, 25, 18, 18, 25, 25, 0, 0, 0, 5, 5, 5, 5, 5, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 0, 0, 0, 55, 55, 55, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, 103, 103, + 103, 103, 103, 5, 5, 245, 246, 247, 248, 249, 250, 251, 252, 253, 0, 0, + 0, 0, 0, 0, 0, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 0, 0, 254, 254, 254, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, - 25, 25, 25, 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 18, - 25, 25, 25, 25, 25, 25, 25, 55, 55, 55, 55, 25, 55, 55, 55, 55, 55, 55, - 25, 55, 55, 18, 25, 25, 55, 0, 0, 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, + 254, 254, 254, 254, 0, 0, 254, 254, 254, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 25, 25, 25, 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 18, 25, 25, 25, 25, 25, 25, 25, 55, 55, 55, 55, 25, 55, 55, 55, + 55, 55, 55, 25, 55, 55, 18, 25, 25, 55, 0, 0, 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 20, 20, 20, 20, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 102, 255, 20, 20, 20, 256, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 257, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 102, 255, 20, 20, 20, 256, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 257, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 25, 25, 25, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 0, 25, 25, 25, 25, 25, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 25, 25, 25, 0, 25, 25, 25, 25, 25, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, @@ -2752,51 +2751,52 @@ static const unsigned short index2[] = { 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 258, 259, 260, 261, - 262, 263, 20, 20, 264, 20, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 258, 259, + 260, 261, 262, 263, 20, 20, 264, 20, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 265, 265, 265, 265, - 265, 265, 265, 265, 266, 266, 266, 266, 266, 266, 266, 266, 265, 265, - 265, 265, 265, 265, 0, 0, 266, 266, 266, 266, 266, 266, 0, 0, 265, 265, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 265, 265, 265, 265, 265, 265, 265, 265, 266, 266, 266, 266, 266, 266, 266, 266, + 265, 265, 265, 265, 265, 265, 0, 0, 266, 266, 266, 266, 266, 266, 0, 0, 265, 265, 265, 265, 265, 265, 265, 265, 266, 266, 266, 266, 266, 266, - 266, 266, 265, 265, 265, 265, 265, 265, 0, 0, 266, 266, 266, 266, 266, - 266, 0, 0, 267, 265, 268, 265, 269, 265, 270, 265, 0, 266, 0, 266, 0, - 266, 0, 266, 265, 265, 265, 265, 265, 265, 265, 265, 266, 266, 266, 266, - 266, 266, 266, 266, 271, 271, 272, 272, 272, 272, 273, 273, 274, 274, - 275, 275, 276, 276, 0, 0, 277, 278, 279, 280, 281, 282, 283, 284, 285, - 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 265, 265, 325, - 326, 327, 0, 328, 329, 266, 266, 330, 330, 331, 6, 332, 6, 6, 6, 333, - 334, 335, 0, 336, 337, 338, 338, 338, 338, 339, 6, 6, 6, 265, 265, 340, - 341, 0, 0, 342, 343, 266, 266, 344, 344, 0, 6, 6, 6, 265, 265, 345, 346, - 347, 127, 348, 349, 266, 266, 350, 350, 131, 6, 6, 6, 0, 0, 351, 352, - 353, 0, 354, 355, 356, 356, 357, 357, 358, 6, 6, 0, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 21, 21, 21, 21, 21, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 3, 3, 21, 21, 21, 21, 21, 2, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 21, 21, 21, 21, - 21, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 359, 102, 0, 0, 360, 361, - 362, 363, 364, 365, 5, 5, 5, 5, 5, 102, 359, 26, 22, 23, 360, 361, 362, - 363, 364, 365, 5, 5, 5, 5, 5, 0, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 6, 6, 6, 6, 25, 6, 6, 6, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 121, 5, 5, - 5, 5, 121, 5, 5, 20, 121, 121, 121, 20, 20, 121, 121, 121, 20, 5, 121, 5, - 5, 366, 121, 121, 121, 121, 121, 5, 5, 5, 5, 5, 5, 121, 5, 367, 5, 121, - 5, 368, 369, 121, 121, 366, 20, 121, 121, 370, 121, 20, 55, 55, 55, 55, - 20, 5, 5, 20, 20, 121, 121, 5, 5, 5, 5, 5, 121, 20, 20, 20, 20, 5, 5, 5, - 5, 371, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, - 372, 372, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, - 373, 373, 373, 373, 243, 243, 243, 30, 31, 243, 243, 243, 243, 27, 5, 5, - 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 266, 266, 265, 265, 265, 265, 265, 265, 265, 265, 266, 266, 266, 266, + 266, 266, 266, 266, 265, 265, 265, 265, 265, 265, 0, 0, 266, 266, 266, + 266, 266, 266, 0, 0, 267, 265, 268, 265, 269, 265, 270, 265, 0, 266, 0, + 266, 0, 266, 0, 266, 265, 265, 265, 265, 265, 265, 265, 265, 266, 266, + 266, 266, 266, 266, 266, 266, 271, 271, 272, 272, 272, 272, 273, 273, + 274, 274, 275, 275, 276, 276, 0, 0, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 265, + 265, 325, 326, 327, 0, 328, 329, 266, 266, 330, 330, 331, 6, 332, 6, 6, + 6, 333, 334, 335, 0, 336, 337, 338, 338, 338, 338, 339, 6, 6, 6, 265, + 265, 340, 341, 0, 0, 342, 343, 266, 266, 344, 344, 0, 6, 6, 6, 265, 265, + 345, 346, 347, 127, 348, 349, 266, 266, 350, 350, 131, 6, 6, 6, 0, 0, + 351, 352, 353, 0, 354, 355, 356, 356, 357, 357, 358, 6, 6, 0, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 21, 21, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 3, 3, 21, 21, 21, 21, 21, 2, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 21, + 21, 21, 21, 21, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 359, 102, 0, + 0, 360, 361, 362, 363, 364, 365, 5, 5, 5, 5, 5, 102, 359, 26, 22, 23, + 360, 361, 362, 363, 364, 365, 5, 5, 5, 5, 5, 0, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 6, 6, 6, 6, 25, 6, 6, 6, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 121, 5, 5, 5, 5, 121, 5, 5, 20, 121, 121, 121, 20, 20, 121, 121, + 121, 20, 5, 121, 5, 5, 366, 121, 121, 121, 121, 121, 5, 5, 5, 5, 5, 5, + 121, 5, 367, 5, 121, 5, 368, 369, 121, 121, 366, 20, 121, 121, 370, 121, + 20, 55, 55, 55, 55, 20, 5, 5, 20, 20, 121, 121, 5, 5, 5, 5, 5, 121, 20, + 20, 20, 20, 5, 5, 5, 5, 371, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, + 372, 372, 372, 372, 372, 372, 373, 373, 373, 373, 373, 373, 373, 373, + 373, 373, 373, 373, 373, 373, 373, 373, 243, 243, 243, 30, 31, 243, 243, + 243, 243, 27, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, @@ -2807,26 +2807,26 @@ static const unsigned short index2[] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 22, 23, 360, 361, 362, 363, 364, - 365, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 374, 374, 374, 374, - 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, - 374, 374, 374, 374, 374, 374, 374, 374, 375, 375, 375, 375, 375, 375, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 22, 23, 360, 361, 362, 363, 364, 365, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 22, 23, 360, 361, 362, + 363, 364, 365, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 22, 23, + 360, 361, 362, 363, 364, 365, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, + 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, - 375, 375, 375, 375, 375, 375, 359, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, 359, 5, 5, 5, 5, 5, 5, + 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 359, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, + 359, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 26, + 22, 23, 360, 361, 362, 363, 364, 365, 27, 26, 22, 23, 360, 361, 362, 363, + 364, 365, 27, 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 26, 22, 23, 360, 361, - 362, 363, 364, 365, 27, 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, 26, - 22, 23, 360, 361, 362, 363, 364, 365, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, @@ -2835,105 +2835,104 @@ static const unsigned short index2[] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 0, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 136, 136, 136, 136, 136, 0, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 0, 30, 31, 376, 377, 378, 379, 380, 30, 31, - 30, 31, 30, 31, 381, 382, 383, 384, 20, 30, 31, 20, 30, 31, 20, 20, 20, - 20, 20, 102, 102, 385, 385, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 0, 30, 31, 376, 377, + 378, 379, 380, 30, 31, 30, 31, 30, 31, 381, 382, 383, 384, 20, 30, 31, + 20, 30, 31, 20, 20, 20, 20, 20, 102, 102, 385, 385, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 20, - 5, 5, 5, 5, 5, 5, 30, 31, 30, 31, 25, 25, 25, 30, 31, 0, 0, 0, 0, 0, 5, - 5, 5, 5, 27, 5, 5, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 20, 5, 5, 5, 5, 5, 5, 30, 31, 30, 31, 25, 25, 25, 30, + 31, 0, 0, 0, 0, 0, 5, 5, 5, 5, 27, 5, 5, 386, 386, 386, 386, 386, 386, + 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, - 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 0, 386, - 0, 0, 0, 0, 0, 386, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 386, 386, 386, 386, 0, 386, 0, 0, 0, 0, 0, 386, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 103, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, + 0, 0, 0, 103, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, - 0, 55, 55, 55, 55, 55, 55, 55, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 387, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 387, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 0, 0, 0, 0, 2, 5, 5, 5, 5, 103, 55, 243, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 243, 243, 243, 243, 243, - 243, 243, 243, 243, 25, 25, 25, 25, 18, 18, 5, 103, 103, 103, 103, 103, - 5, 5, 243, 243, 243, 103, 55, 5, 5, 5, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 2, 5, 5, 5, 5, 103, 55, + 243, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 243, 243, 243, 243, 243, 243, 243, 243, 243, 25, 25, 25, 25, 18, + 18, 5, 103, 103, 103, 103, 103, 5, 5, 243, 243, 243, 103, 55, 5, 5, 5, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, 6, 6, 103, 103, 55, 5, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, 6, + 6, 103, 103, 55, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 103, 103, - 103, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 5, 103, 103, 103, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 0, 5, 5, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 0, 5, 5, 27, 27, 27, 27, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 5, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, - 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 27, 27, 27, 27, 27, 27, 27, 27, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -2942,7 +2941,7 @@ static const unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -2951,55 +2950,56 @@ static const unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 55, 55, 55, 55, 55, 55, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 388, 55, 55, 388, 55, 55, 55, 388, 55, 388, 55, 55, 55, + 388, 55, 55, 388, 55, 55, 55, 388, 55, 388, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, + 55, 55, 55, 55, 55, 388, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 388, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 388, 55, 55, 55, 55, 55, 55, 55, 388, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, - 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 388, 55, 388, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 388, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 388, 55, 388, 388, 388, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 388, 388, 388, 55, 55, 55, 55, - 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 388, 388, 388, 55, 55, + 55, 55, 55, 55, 55, 55, 388, 388, 388, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -3007,8 +3007,8 @@ static const unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -3016,24 +3016,23 @@ static const unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, - 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 388, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 388, 388, 388, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 388, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 388, 388, 388, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -3045,121 +3044,122 @@ static const unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 388, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, + 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 388, 55, + 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, 103, 103, 103, 103, 103, - 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, 5, 5, 5, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 55, 25, 6, 6, 6, - 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 103, 30, 31, 30, 31, 30, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, 103, 103, 103, 103, 103, 5, 5, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 103, 5, 5, 5, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 102, 102, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 55, 25, 6, 6, 6, 5, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 103, 30, 31, 30, 31, 30, 31, + 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, + 30, 31, 30, 31, 102, 102, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 243, 243, 243, 243, 243, 243, 243, 243, 243, - 243, 25, 25, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 103, 103, 103, 103, - 103, 103, 103, 103, 103, 6, 6, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 20, 20, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, + 55, 55, 55, 55, 55, 55, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 25, 25, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 6, 6, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, + 30, 31, 20, 20, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 102, 20, 20, 20, - 20, 20, 20, 20, 20, 30, 31, 30, 31, 389, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 103, 6, 6, 30, 31, 390, 20, 55, 30, 31, 30, 31, 391, 20, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 392, 393, 394, 395, 392, 20, 396, 397, 398, 399, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 0, 0, 30, 31, 400, 401, 402, 0, 0, 0, 0, 0, 0, 0, + 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 102, 20, 20, 20, 20, 20, + 20, 20, 20, 30, 31, 30, 31, 389, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, + 103, 6, 6, 30, 31, 390, 20, 55, 30, 31, 30, 31, 391, 20, 30, 31, 30, 31, + 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 392, 393, + 394, 395, 392, 20, 396, 397, 398, 399, 30, 31, 30, 31, 30, 31, 30, 31, + 30, 31, 30, 31, 0, 0, 30, 31, 400, 401, 402, 30, 31, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 102, 102, 20, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 55, 102, 102, 20, 55, 55, 55, 55, 55, 55, 55, 25, 55, 55, 55, 25, 55, 55, 55, 55, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 18, 18, 25, 25, 18, 5, 5, 5, 5, 0, 0, 0, 0, 27, 27, 27, 27, + 55, 55, 55, 18, 18, 25, 25, 18, 5, 5, 5, 5, 25, 0, 0, 0, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -3203,7 +3203,7 @@ static const unsigned short index2[] = { 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 403, 20, 20, 20, 20, 20, 20, 20, 6, 102, 102, 102, 102, 20, 20, 20, 20, - 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 404, 405, 406, 407, 408, 409, + 20, 20, 20, 20, 20, 103, 6, 6, 0, 0, 0, 0, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, @@ -3335,7 +3335,7 @@ static const unsigned short index2[] = { 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 27, 27, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, @@ -3473,175 +3473,188 @@ static const unsigned short index2[] = { 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 55, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 27, 27, 27, 27, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 25, 25, 5, 0, 0, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 27, 27, 27, 27, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 25, - 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, - 5, 5, 5, 0, 0, 0, 0, 26, 22, 23, 360, 361, 362, 363, 364, 365, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 18, 55, 55, 55, + 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 18, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 18, 18, 25, 25, 5, 5, - 21, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 26, 22, 23, 360, 361, 362, + 363, 364, 365, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, + 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 0, 0, 0, 0, 0, 0, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, + 25, 18, 18, 25, 25, 5, 5, 21, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 21, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 18, 25, 25, 25, 25, 25, - 25, 25, 25, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 5, 5, 55, 18, - 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, + 18, 25, 25, 25, 25, 25, 25, 25, 25, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 5, 5, 5, 5, 55, 18, 18, 55, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 25, 5, 5, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, - 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 5, 5, 55, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 18, 18, 55, 55, 55, 55, 5, 5, 5, 5, 25, - 25, 25, 25, 5, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 5, 55, 5, - 5, 5, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 18, 18, 18, 25, 25, 25, 18, 18, 25, 18, 25, 25, 5, 5, 5, 5, 5, 5, - 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 25, 18, 18, 55, 55, + 55, 55, 5, 5, 5, 5, 25, 25, 25, 25, 5, 18, 25, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 55, 5, 55, 5, 5, 5, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 18, 18, 25, + 18, 25, 25, 5, 5, 5, 5, 5, 5, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, - 55, 55, 0, 55, 0, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 0, - 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 0, 55, 55, 55, 55, 0, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 5, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 18, - 18, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 25, 25, 18, 18, 0, 55, 55, 55, 55, 55, - 55, 55, 55, 0, 0, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, - 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, 0, 25, 25, 55, 18, 18, 25, 18, - 18, 18, 18, 0, 0, 18, 18, 0, 0, 18, 18, 18, 0, 0, 55, 0, 0, 0, 0, 0, 0, - 18, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 18, 18, 0, 0, 25, 25, 25, 25, 25, - 25, 25, 0, 0, 0, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 25, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, + 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 25, 25, + 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, - 18, 25, 25, 25, 25, 25, 25, 25, 25, 18, 18, 25, 25, 25, 18, 25, 55, 55, - 55, 55, 5, 5, 5, 5, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 5, 0, 5, - 25, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, + 0, 25, 25, 55, 18, 18, 25, 18, 18, 18, 18, 0, 0, 18, 18, 0, 0, 18, 18, + 18, 0, 0, 55, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, + 18, 18, 0, 0, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, 18, 25, 18, 18, 18, 18, 25, 25, - 18, 25, 25, 55, 55, 5, 55, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 18, + 18, 25, 25, 25, 18, 25, 55, 55, 55, 55, 5, 5, 5, 5, 5, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 5, 5, 0, 5, 25, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 0, 0, 18, 18, 18, - 18, 25, 25, 18, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 25, + 25, 18, 25, 18, 18, 18, 18, 25, 25, 18, 25, 25, 55, 55, 5, 55, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, - 25, 25, 25, 25, 25, 25, 18, 18, 25, 18, 25, 25, 5, 5, 5, 55, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, - 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, + 18, 25, 25, 25, 25, 0, 0, 18, 18, 18, 18, 25, 25, 18, 25, 25, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, + 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 25, 18, - 18, 25, 25, 25, 25, 25, 25, 18, 25, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 0, 0, 25, 25, 25, 18, 18, 25, 25, 25, 25, 18, 25, 25, 25, 25, 25, 0, - 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 27, 27, 5, 5, 5, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 18, 18, 25, 18, + 25, 25, 5, 5, 5, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 25, 18, 25, 25, 5, 0, 0, 0, + 55, 55, 55, 55, 25, 18, 25, 18, 18, 25, 25, 25, 25, 25, 25, 18, 25, 55, + 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, 25, 18, 18, 25, 25, + 25, 25, 18, 25, 25, 25, 25, 25, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 27, 27, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 18, 25, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 19, 19, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, + 19, 19, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, + 55, 0, 0, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 18, 18, 18, 18, 18, 18, 0, 18, 18, 0, 0, 25, 25, 18, 25, + 55, 18, 55, 18, 25, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 0, 0, 25, 25, 18, 18, 18, 18, 25, - 55, 5, 55, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, + 25, 25, 25, 25, 0, 0, 25, 25, 18, 18, 18, 18, 25, 55, 5, 55, 18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, + 25, 25, 25, 18, 55, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 55, 25, 25, 25, 25, 25, 25, 18, 18, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 25, 25, 25, 25, 25, 25, 18, 55, 25, 25, 25, 25, 5, 5, 5, 5, - 5, 5, 5, 5, 25, 0, 0, 0, 0, 0, 0, 0, 0, 55, 25, 25, 25, 25, 25, 25, 18, - 18, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 18, 25, 25, 5, 5, 5, 55, 5, 5, 5, 5, - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 18, 25, 25, 5, 5, 5, 55, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 18, 25, 25, 25, 25, 25, 25, 25, 0, 25, 25, 25, 25, - 25, 25, 18, 25, 55, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 5, 5, 55, 55, 55, 55, 55, 55, + 55, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 18, 25, 25, 25, 25, 25, - 25, 25, 18, 25, 25, 18, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, + 25, 25, 25, 25, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, 18, 25, 55, 5, 5, + 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 0, 0, 0, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 0, 18, 25, 25, 25, 25, 25, 25, 25, 18, 25, 25, 18, + 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, - 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 25, 25, 25, 25, 25, 25, 0, 0, 0, 25, 0, 25, 25, 0, 25, 25, - 25, 25, 25, 25, 25, 55, 25, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, + 25, 25, 25, 0, 0, 0, 25, 0, 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 55, + 25, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, + 0, 0, 0, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 18, - 18, 0, 25, 25, 0, 18, 18, 25, 18, 25, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 18, 18, 0, 25, 25, 0, 18, 18, + 25, 18, 25, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 25, 25, 18, 18, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 18, 18, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 243, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, @@ -3649,95 +3662,100 @@ static const unsigned short index2[] = { 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, - 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 0, 5, 5, 5, 5, 5, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 243, 243, 243, 243, 243, 243, 0, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, + 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, - 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, + 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, 25, 25, - 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, 25, 25, 25, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 103, - 103, 103, 103, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 0, 27, 27, 27, 27, 27, 27, 27, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, + 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 103, 103, 103, 103, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 27, + 27, 27, 27, 27, 27, 27, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, - 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 27, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 25, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 25, 55, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 103, 103, 103, 103, 103, 103, - 103, 103, 103, 103, 103, 103, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, + 0, 0, 0, 0, 25, 25, 25, 25, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 103, 103, 5, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, + 103, 5, 103, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, + 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -3745,63 +3763,63 @@ static const unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 5, - 25, 25, 5, 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, + 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 5, 25, + 25, 5, 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 18, 25, 25, 25, - 5, 5, 5, 18, 18, 18, 18, 18, 18, 21, 21, 21, 21, 21, 21, 21, 21, 25, 25, - 25, 25, 25, 25, 25, 25, 5, 5, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 18, 25, 25, 25, 5, 5, + 5, 18, 18, 18, 18, 18, 18, 21, 21, 21, 21, 21, 21, 21, 21, 25, 25, 25, + 25, 25, 25, 25, 25, 5, 5, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 0, 0, 0, 0, 0, 0, 0, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, + 0, 0, 0, 0, 0, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, - 121, 121, 121, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 121, 121, 121, 121, 121, + 121, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, - 121, 121, 121, 121, 121, 121, 121, 20, 20, 20, 20, 20, 20, 20, 0, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 121, 121, + 121, 121, 121, 121, 121, 20, 20, 20, 20, 20, 20, 20, 0, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, - 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 20, 20, 20, 20, 20, 20, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 121, 0, 121, 121, 0, 0, 121, 0, 0, 121, 121, 0, 0, 121, 121, 121, + 20, 121, 0, 121, 121, 0, 0, 121, 0, 0, 121, 121, 0, 0, 121, 121, 121, 121, 0, 121, 121, 121, 121, 121, 121, 121, 121, 20, 20, 20, 20, 0, 20, 0, 20, 20, 20, 20, 20, 20, 20, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, @@ -3940,16 +3958,16 @@ static const unsigned short index2[] = { 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 359, 359, 26, 22, 23, 360, 361, 362, 363, 364, - 365, 27, 27, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 365, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 5, 5, 5, 5, 5, 5, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, - 502, 502, 502, 502, 502, 502, 502, 502, 5, 5, 5, 0, 0, 0, 502, 502, 502, + 502, 502, 502, 502, 502, 502, 502, 502, 5, 5, 5, 5, 5, 5, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3966,9 +3984,9 @@ static const unsigned short index2[] = { 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, @@ -3986,55 +4004,60 @@ static const unsigned short index2[] = { 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, - 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, - 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -4045,31 +4068,32 @@ static const unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, + 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, + 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -4080,33 +4104,31 @@ static const unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 388, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -4115,20 +4137,28 @@ static const unsigned short index2[] = { 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 25, 25, 25, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, @@ -4142,13 +4172,13 @@ static const unsigned short index2[] = { 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, }; /* Returns the numeric value as double for Unicode characters @@ -4221,6 +4251,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x116C0: case 0x11730: case 0x118E0: + case 0x11950: case 0x11C50: case 0x11D50: case 0x11DA0: @@ -4240,6 +4271,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1F101: case 0x1F10B: case 0x1F10C: + case 0x1FBF0: return (double) 0.0; case 0x0031: case 0x00B9: @@ -4332,6 +4364,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x10E60: case 0x10F1D: case 0x10F51: + case 0x10FC5: case 0x11052: case 0x11067: case 0x110F1: @@ -4345,6 +4378,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x116C1: case 0x11731: case 0x118E1: + case 0x11951: case 0x11C51: case 0x11C5A: case 0x11D51: @@ -4377,6 +4411,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1ECB1: case 0x1ED01: case 0x1F102: + case 0x1FBF1: case 0x2092A: return (double) 1.0; case 0x0D5C: @@ -4518,6 +4553,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x10E69: case 0x10F22: case 0x10F52: + case 0x10FC9: case 0x1105B: case 0x111EA: case 0x1173A: @@ -4561,6 +4597,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x10E72: case 0x10F25: case 0x10F54: + case 0x10FCB: case 0x11064: case 0x111F3: case 0x11C6C: @@ -4791,6 +4828,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x10D32: case 0x10E61: case 0x10F1E: + case 0x10FC6: case 0x11053: case 0x11068: case 0x110F2: @@ -4804,6 +4842,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x116C2: case 0x11732: case 0x118E2: + case 0x11952: case 0x11C52: case 0x11C5B: case 0x11D52: @@ -4840,6 +4879,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1ED02: case 0x1ED2F: case 0x1F103: + case 0x1FBF2: case 0x22390: return (double) 2.0; case 0x109F7: @@ -4880,6 +4920,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x10E6A: case 0x10F23: case 0x10F53: + case 0x10FCA: case 0x1105C: case 0x111EB: case 0x1173B: @@ -5012,6 +5053,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x10D33: case 0x10E62: case 0x10F1F: + case 0x10FC7: case 0x11054: case 0x11069: case 0x110F3: @@ -5025,6 +5067,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x116C3: case 0x11733: case 0x118E3: + case 0x11953: case 0x11C53: case 0x11C5C: case 0x11D53: @@ -5065,6 +5108,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1ED03: case 0x1ED30: case 0x1F104: + case 0x1FBF3: case 0x20AFD: case 0x20B19: case 0x22998: @@ -5231,6 +5275,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x10D34: case 0x10E63: case 0x10F20: + case 0x10FC8: case 0x11055: case 0x1106A: case 0x110F4: @@ -5244,6 +5289,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x116C4: case 0x11734: case 0x118E4: + case 0x11954: case 0x11C54: case 0x11C5D: case 0x11D54: @@ -5284,6 +5330,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1ED04: case 0x1ED31: case 0x1F105: + case 0x1FBF4: case 0x20064: case 0x200E2: case 0x2626D: @@ -5440,6 +5487,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x116C5: case 0x11735: case 0x118E5: + case 0x11955: case 0x11C55: case 0x11C5E: case 0x11D55: @@ -5477,6 +5525,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1ED05: case 0x1ED32: case 0x1F106: + case 0x1FBF5: case 0x20121: return (double) 5.0; case 0x109FA: @@ -5633,6 +5682,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x116C6: case 0x11736: case 0x118E6: + case 0x11956: case 0x11C56: case 0x11C5F: case 0x11D56: @@ -5664,6 +5714,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1ED06: case 0x1ED33: case 0x1F107: + case 0x1FBF6: case 0x20AEA: return (double) 6.0; case 0x109FB: @@ -5779,6 +5830,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x116C7: case 0x11737: case 0x118E7: + case 0x11957: case 0x11C57: case 0x11C60: case 0x11D57: @@ -5811,6 +5863,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1ED07: case 0x1ED34: case 0x1F108: + case 0x1FBF7: case 0x20001: return (double) 7.0; case 0x109FC: @@ -5927,6 +5980,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x116C8: case 0x11738: case 0x118E8: + case 0x11958: case 0x11C58: case 0x11C61: case 0x11D58: @@ -5958,6 +6012,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1ED08: case 0x1ED35: case 0x1F109: + case 0x1FBF8: return (double) 8.0; case 0x109FD: return (double) 8.0/12.0; @@ -6069,6 +6124,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x116C9: case 0x11739: case 0x118E9: + case 0x11959: case 0x11C59: case 0x11C62: case 0x11D59: @@ -6102,6 +6158,7 @@ double _PyUnicode_ToNumeric(Py_UCS4 ch) case 0x1ED09: case 0x1ED36: case 0x1F10A: + case 0x1FBF9: case 0x2F890: return (double) 9.0; case 0x109FE: diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c index 58fe09fa3b51b025a309c09ddeeb45b854292ab6..313e8abab5a25fe47d06670caa9eee1bc936ab6e 100644 --- a/Objects/weakrefobject.c +++ b/Objects/weakrefobject.c @@ -1,9 +1,10 @@ #include "Python.h" -#include "structmember.h" +#include "pycore_object.h" // _PyObject_GET_WEAKREFS_LISTPTR() +#include "structmember.h" // PyMemberDef #define GET_WEAKREFS_LISTPTR(o) \ - ((PyWeakReference **) PyObject_GET_WEAKREFS_LISTPTR(o)) + ((PyWeakReference **) _PyObject_GET_WEAKREFS_LISTPTR(o)) Py_ssize_t @@ -361,6 +362,12 @@ static PyMemberDef weakref_members[] = { {NULL} /* Sentinel */ }; +static PyMethodDef weakref_methods[] = { + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, + {NULL} /* Sentinel */ +}; + PyTypeObject _PyWeakref_RefType = { PyVarObject_HEAD_INIT(&PyType_Type, 0) @@ -391,7 +398,7 @@ _PyWeakref_RefType = { 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ - 0, /*tp_methods*/ + weakref_methods, /*tp_methods*/ weakref_members, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ @@ -478,7 +485,7 @@ proxy_checkref(PyWeakReference *proxy) _Py_IDENTIFIER(special); \ UNWRAP(proxy); \ Py_INCREF(proxy); \ - PyObject* res = _PyObject_CallMethodId(proxy, &PyId_##special, NULL); \ + PyObject* res = _PyObject_CallMethodIdNoArgs(proxy, &PyId_##special); \ Py_DECREF(proxy); \ return res; \ } @@ -658,10 +665,12 @@ proxy_iternext(PyWeakReference *proxy) WRAP_METHOD(proxy_bytes, __bytes__) +WRAP_METHOD(proxy_reversed, __reversed__) static PyMethodDef proxy_methods[] = { {"__bytes__", proxy_bytes, METH_NOARGS}, + {"__reversed__", proxy_reversed, METH_NOARGS}, {NULL, NULL} }; @@ -723,6 +732,21 @@ static PyMappingMethods proxy_as_mapping = { }; +static Py_hash_t +proxy_hash(PyObject *self) +{ + PyWeakReference *proxy = (PyWeakReference *)self; + if (!proxy_checkref(proxy)) { + return -1; + } + PyObject *obj = PyWeakref_GET_OBJECT(proxy); + Py_INCREF(obj); + Py_hash_t res = PyObject_Hash(obj); + Py_DECREF(obj); + return res; +} + + PyTypeObject _PyWeakref_ProxyType = { PyVarObject_HEAD_INIT(&PyType_Type, 0) @@ -739,7 +763,7 @@ _PyWeakref_ProxyType = { &proxy_as_number, /* tp_as_number */ &proxy_as_sequence, /* tp_as_sequence */ &proxy_as_mapping, /* tp_as_mapping */ - 0, /* tp_hash */ + proxy_hash, /* tp_hash */ 0, /* tp_call */ proxy_str, /* tp_str */ proxy_getattr, /* tp_getattro */ @@ -882,10 +906,12 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback) if (result != NULL) { PyWeakReference *prev; - if (PyCallable_Check(ob)) - Py_TYPE(result) = &_PyWeakref_CallableProxyType; - else - Py_TYPE(result) = &_PyWeakref_ProxyType; + if (PyCallable_Check(ob)) { + Py_SET_TYPE(result, &_PyWeakref_CallableProxyType); + } + else { + Py_SET_TYPE(result, &_PyWeakref_ProxyType); + } get_basic_refs(*list, &ref, &proxy); if (callback == NULL) { if (proxy != NULL) { @@ -931,7 +957,7 @@ PyWeakref_GetObject(PyObject *ref) static void handle_callback(PyWeakReference *ref, PyObject *callback) { - PyObject *cbresult = PyObject_CallFunctionObjArgs(callback, ref, NULL); + PyObject *cbresult = PyObject_CallOneArg(callback, (PyObject *)ref); if (cbresult == NULL) PyErr_WriteUnraisable(callback); @@ -952,7 +978,8 @@ PyObject_ClearWeakRefs(PyObject *object) if (object == NULL || !PyType_SUPPORTS_WEAKREFS(Py_TYPE(object)) - || object->ob_refcnt != 0) { + || Py_REFCNT(object) != 0) + { PyErr_BadInternalCall(); return; } @@ -975,8 +1002,9 @@ PyObject_ClearWeakRefs(PyObject *object) current->wr_callback = NULL; clear_weakref(current); if (callback != NULL) { - if (((PyObject *)current)->ob_refcnt > 0) + if (Py_REFCNT((PyObject *)current) > 0) { handle_callback(current, callback); + } Py_DECREF(callback); } } @@ -993,8 +1021,7 @@ PyObject_ClearWeakRefs(PyObject *object) for (i = 0; i < count; ++i) { PyWeakReference *next = current->wr_next; - if (((PyObject *)current)->ob_refcnt > 0) - { + if (Py_REFCNT((PyObject *)current) > 0) { Py_INCREF(current); PyTuple_SET_ITEM(tuple, i * 2, (PyObject *) current); PyTuple_SET_ITEM(tuple, i * 2 + 1, current->wr_callback); diff --git a/PC/_msi.c b/PC/_msi.c index 5079a524646f0e108ad2efa460028311a12b7551..58c1cfd997bf825fe023c196397e9cef3f204617 100644 --- a/PC/_msi.c +++ b/PC/_msi.c @@ -531,7 +531,7 @@ static PyTypeObject record_Type = { static PyObject* record_new(MSIHANDLE h) { - msiobj *result = PyObject_NEW(struct msiobj, &record_Type); + msiobj *result = PyObject_New(struct msiobj, &record_Type); if (!result) { MsiCloseHandle(h); @@ -882,7 +882,7 @@ msidb_openview(msiobj *msidb, PyObject *args) if ((status = MsiDatabaseOpenViewW(msidb->h, sql, &hView)) != ERROR_SUCCESS) return msierror(status); - result = PyObject_NEW(struct msiobj, &msiview_Type); + result = PyObject_New(struct msiobj, &msiview_Type); if (!result) { MsiCloseHandle(hView); return NULL; @@ -918,7 +918,7 @@ msidb_getsummaryinformation(msiobj *db, PyObject *args) if (status != ERROR_SUCCESS) return msierror(status); - oresult = PyObject_NEW(struct msiobj, &summary_Type); + oresult = PyObject_New(struct msiobj, &summary_Type); if (!oresult) { MsiCloseHandle(result); return NULL; @@ -1013,7 +1013,7 @@ static PyObject* msiopendb(PyObject *obj, PyObject *args) if (status != ERROR_SUCCESS) return msierror(status); - result = PyObject_NEW(struct msiobj, &msidb_Type); + result = PyObject_New(struct msiobj, &msidb_Type); if (!result) { MsiCloseHandle(h); return NULL; diff --git a/PC/_testconsole.c b/PC/_testconsole.c index 23d1286ed4f49805da6325c93110af64dbe4d4b8..b62f21c339aa410b4e3233028404905307e26ef8 100644 --- a/PC/_testconsole.c +++ b/PC/_testconsole.c @@ -55,16 +55,15 @@ _testconsole_write_input_impl(PyObject *module, PyObject *file, const wchar_t *p = (const wchar_t *)PyBytes_AS_STRING(s); DWORD size = (DWORD)PyBytes_GET_SIZE(s) / sizeof(wchar_t); - rec = (INPUT_RECORD*)PyMem_Malloc(sizeof(INPUT_RECORD) * size); + rec = (INPUT_RECORD*)PyMem_Calloc(size, sizeof(INPUT_RECORD)); if (!rec) goto error; - memset(rec, 0, sizeof(INPUT_RECORD) * size); INPUT_RECORD *prec = rec; for (DWORD i = 0; i < size; ++i, ++p, ++prec) { prec->EventType = KEY_EVENT; prec->Event.KeyEvent.bKeyDown = TRUE; - prec->Event.KeyEvent.wRepeatCount = 10; + prec->Event.KeyEvent.wRepeatCount = 1; prec->Event.KeyEvent.uChar.UnicodeChar = *p; } diff --git a/PC/bdist_wininst/bdist_wininst.vcxproj b/PC/bdist_wininst/bdist_wininst.vcxproj index d2f1bb75e30d87221e66cb06a31572a0e161fde1..390bf4e62728c7b3bee99c875228381839248631 100644 --- a/PC/bdist_wininst/bdist_wininst.vcxproj +++ b/PC/bdist_wininst/bdist_wininst.vcxproj @@ -87,7 +87,7 @@ MinSpace - $(PySourcePath)Modules\zlib;%(AdditionalIncludeDirectories) + $(zlibDir);%(AdditionalIncludeDirectories) _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) MultiThreadedDebug MultiThreaded @@ -102,15 +102,16 @@ - - - - - - + + + + + + + diff --git a/PC/bdist_wininst/bdist_wininst.vcxproj.filters b/PC/bdist_wininst/bdist_wininst.vcxproj.filters index b4b6a4d514db6c3434ddd75c3cc49dcb1f247501..c97742e723970ec24853ff2d92d629f6626bf51e 100644 --- a/PC/bdist_wininst/bdist_wininst.vcxproj.filters +++ b/PC/bdist_wininst/bdist_wininst.vcxproj.filters @@ -16,45 +16,51 @@ {0c77c1cf-3f87-4f87-bd86-b425211c2181} ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + {d10220c7-69e3-47c5-8d82-c8e0d4d2ac88} + - + Source Files - + Source Files - + Source Files\zlib - + Source Files\zlib - + Source Files\zlib - + Source Files\zlib - + Source Files\zlib - + Source Files\zlib - - Header Files - - - - + Resource Files - + + Header Files + + + Header Files\zlib + + + + Resource Files diff --git a/PC/bdist_wininst/install.c b/PC/bdist_wininst/install.c index 72d9837fe4f7f0f78b869ab2b5f8c56d15a27b4e..5d77542582a0d4caa620046229612b996215637b 100644 --- a/PC/bdist_wininst/install.c +++ b/PC/bdist_wininst/install.c @@ -2541,7 +2541,7 @@ int DoUninstall(int argc, char **argv) if (!lines) return SystemError(0, "Out of memory"); - /* Read the whole logfile, realloacting the buffer */ + /* Read the whole logfile, reallocating the buffer */ while (fgets(buffer, sizeof(buffer), logfile)) { int len = strlen(buffer); /* remove trailing white space */ diff --git a/PC/config.c b/PC/config.c index 8eaeb31c9b934bfa9263d81f242e25794b4c5430..32af2a81aeb41e69e3ca63802665b142449c2112 100644 --- a/PC/config.c +++ b/PC/config.c @@ -75,6 +75,8 @@ extern PyObject* PyInit__opcode(void); extern PyObject* PyInit__contextvars(void); +extern PyObject* PyInit__peg_parser(void); + /* tools/freeze/makeconfig.py marker for additional "extern" */ /* -- ADDMODULE MARKER 1 -- */ @@ -169,6 +171,7 @@ struct _inittab _PyImport_Inittab[] = { {"_opcode", PyInit__opcode}, {"_contextvars", PyInit__contextvars}, + {"_peg_parser", PyInit__peg_parser}, /* Sentinel */ {0, 0} diff --git a/PC/dl_nt.c b/PC/dl_nt.c index c87c51eb559f9734692e444e760c8da73f46075a..7f17ee168727f0e80587cbc8968c1f9507361468 100644 --- a/PC/dl_nt.c +++ b/PC/dl_nt.c @@ -12,78 +12,10 @@ forgotten) from the programmer. #include "windows.h" #ifdef Py_ENABLE_SHARED -#ifdef MS_DLL_ID -// The string is available at build, so fill the buffer immediately -char dllVersionBuffer[16] = MS_DLL_ID; -#else -char dllVersionBuffer[16] = ""; // a private buffer -#endif // Python Globals HMODULE PyWin_DLLhModule = NULL; -const char *PyWin_DLLVersionString = dllVersionBuffer; - -#if HAVE_SXS -// Windows "Activation Context" work. -// Our .pyd extension modules are generally built without a manifest (ie, -// those included with Python and those built with a default distutils. -// This requires we perform some "activation context" magic when loading our -// extensions. In summary: -// * As our DLL loads we save the context being used. -// * Before loading our extensions we re-activate our saved context. -// * After extension load is complete we restore the old context. -// As an added complication, this magic only works on XP or later - we simply -// use the existence (or not) of the relevant function pointers from kernel32. -// See bug 4566 (http://python.org/sf/4566) for more details. -// In Visual Studio 2010, side by side assemblies are no longer used by -// default. - -typedef BOOL (WINAPI * PFN_GETCURRENTACTCTX)(HANDLE *); -typedef BOOL (WINAPI * PFN_ACTIVATEACTCTX)(HANDLE, ULONG_PTR *); -typedef BOOL (WINAPI * PFN_DEACTIVATEACTCTX)(DWORD, ULONG_PTR); -typedef BOOL (WINAPI * PFN_ADDREFACTCTX)(HANDLE); -typedef BOOL (WINAPI * PFN_RELEASEACTCTX)(HANDLE); - -// locals and function pointers for this activation context magic. -static HANDLE PyWin_DLLhActivationContext = NULL; // one day it might be public -static PFN_GETCURRENTACTCTX pfnGetCurrentActCtx = NULL; -static PFN_ACTIVATEACTCTX pfnActivateActCtx = NULL; -static PFN_DEACTIVATEACTCTX pfnDeactivateActCtx = NULL; -static PFN_ADDREFACTCTX pfnAddRefActCtx = NULL; -static PFN_RELEASEACTCTX pfnReleaseActCtx = NULL; - -void _LoadActCtxPointers() -{ - HINSTANCE hKernel32 = GetModuleHandleW(L"kernel32.dll"); - if (hKernel32) - pfnGetCurrentActCtx = (PFN_GETCURRENTACTCTX) GetProcAddress(hKernel32, "GetCurrentActCtx"); - // If we can't load GetCurrentActCtx (ie, pre XP) , don't bother with the rest. - if (pfnGetCurrentActCtx) { - pfnActivateActCtx = (PFN_ACTIVATEACTCTX) GetProcAddress(hKernel32, "ActivateActCtx"); - pfnDeactivateActCtx = (PFN_DEACTIVATEACTCTX) GetProcAddress(hKernel32, "DeactivateActCtx"); - pfnAddRefActCtx = (PFN_ADDREFACTCTX) GetProcAddress(hKernel32, "AddRefActCtx"); - pfnReleaseActCtx = (PFN_RELEASEACTCTX) GetProcAddress(hKernel32, "ReleaseActCtx"); - } -} - -ULONG_PTR _Py_ActivateActCtx() -{ - ULONG_PTR ret = 0; - if (PyWin_DLLhActivationContext && pfnActivateActCtx) - if (!(*pfnActivateActCtx)(PyWin_DLLhActivationContext, &ret)) { - OutputDebugString("Python failed to activate the activation context before loading a DLL\n"); - ret = 0; // no promise the failing function didn't change it! - } - return ret; -} - -void _Py_DeactivateActCtx(ULONG_PTR cookie) -{ - if (cookie && pfnDeactivateActCtx) - if (!(*pfnDeactivateActCtx)(0, cookie)) - OutputDebugString("Python failed to de-activate the activation context\n"); -} -#endif /* HAVE_SXS */ +const char *PyWin_DLLVersionString = MS_DLL_ID; BOOL WINAPI DllMain (HANDLE hInst, ULONG ul_reason_for_call, @@ -93,27 +25,9 @@ BOOL WINAPI DllMain (HANDLE hInst, { case DLL_PROCESS_ATTACH: PyWin_DLLhModule = hInst; -#ifndef MS_DLL_ID - // If we have MS_DLL_ID, we don't need to load the string. - // 1000 is a magic number I picked out of the air. Could do with a #define, I spose... - LoadString(hInst, 1000, dllVersionBuffer, sizeof(dllVersionBuffer)); -#endif - -#if HAVE_SXS - // and capture our activation context for use when loading extensions. - _LoadActCtxPointers(); - if (pfnGetCurrentActCtx && pfnAddRefActCtx) - if ((*pfnGetCurrentActCtx)(&PyWin_DLLhActivationContext)) - if (!(*pfnAddRefActCtx)(PyWin_DLLhActivationContext)) - OutputDebugString("Python failed to load the default activation context\n"); -#endif break; case DLL_PROCESS_DETACH: -#if HAVE_SXS - if (pfnReleaseActCtx) - (*pfnReleaseActCtx)(PyWin_DLLhActivationContext); -#endif break; } return TRUE; diff --git a/PC/getpathp.c b/PC/getpathp.c index 8969fb554ab7cade54e849460050e9c155430310..53da3a6d05faee99b72db2ea2ee2095b01e950ea 100644 --- a/PC/getpathp.c +++ b/PC/getpathp.c @@ -80,9 +80,9 @@ #include "Python.h" -#include "pycore_initconfig.h" -#include "pycore_pystate.h" -#include "osdefs.h" +#include "pycore_initconfig.h" // PyStatus +#include "pycore_pathconfig.h" // _PyPathConfig +#include "osdefs.h" // SEP, ALTSEP #include #ifndef MS_WINDOWS @@ -90,6 +90,7 @@ #endif #include +#include #include #ifdef HAVE_SYS_TYPES_H @@ -249,43 +250,14 @@ ismodule(wchar_t *filename, int update_filename) stuff as fits will be appended. */ -static int _PathCchCombineEx_Initialized = 0; -typedef HRESULT(__stdcall *PPathCchCombineEx) (PWSTR pszPathOut, size_t cchPathOut, - PCWSTR pszPathIn, PCWSTR pszMore, - unsigned long dwFlags); -static PPathCchCombineEx _PathCchCombineEx; - static void join(wchar_t *buffer, const wchar_t *stuff) { - if (_PathCchCombineEx_Initialized == 0) { - HMODULE pathapi = LoadLibraryExW(L"api-ms-win-core-path-l1-1-0.dll", NULL, - LOAD_LIBRARY_SEARCH_SYSTEM32); - if (pathapi) { - _PathCchCombineEx = (PPathCchCombineEx)GetProcAddress(pathapi, "PathCchCombineEx"); - } - else { - _PathCchCombineEx = NULL; - } - _PathCchCombineEx_Initialized = 1; - } - - if (_PathCchCombineEx) { - if (FAILED(_PathCchCombineEx(buffer, MAXPATHLEN+1, buffer, stuff, 0))) { - Py_FatalError("buffer overflow in getpathp.c's join()"); - } - } else { - if (!PathCombineW(buffer, buffer, stuff)) { - Py_FatalError("buffer overflow in getpathp.c's join()"); - } + if (FAILED(PathCchCombineEx(buffer, MAXPATHLEN+1, buffer, stuff, 0))) { + Py_FatalError("buffer overflow in getpathp.c's join()"); } } -static int _PathCchCanonicalizeEx_Initialized = 0; -typedef HRESULT(__stdcall *PPathCchCanonicalizeEx) (PWSTR pszPathOut, size_t cchPathOut, - PCWSTR pszPathIn, unsigned long dwFlags); -static PPathCchCanonicalizeEx _PathCchCanonicalizeEx; - /* Call PathCchCanonicalizeEx(path): remove navigation elements such as "." and ".." to produce a direct, well-formed path. */ static PyStatus @@ -295,27 +267,8 @@ canonicalize(wchar_t *buffer, const wchar_t *path) return _PyStatus_NO_MEMORY(); } - if (_PathCchCanonicalizeEx_Initialized == 0) { - HMODULE pathapi = LoadLibraryExW(L"api-ms-win-core-path-l1-1-0.dll", NULL, - LOAD_LIBRARY_SEARCH_SYSTEM32); - if (pathapi) { - _PathCchCanonicalizeEx = (PPathCchCanonicalizeEx)GetProcAddress(pathapi, "PathCchCanonicalizeEx"); - } - else { - _PathCchCanonicalizeEx = NULL; - } - _PathCchCanonicalizeEx_Initialized = 1; - } - - if (_PathCchCanonicalizeEx) { - if (FAILED(_PathCchCanonicalizeEx(buffer, MAXPATHLEN + 1, path, 0))) { - return INIT_ERR_BUFFER_OVERFLOW(); - } - } - else { - if (!PathCanonicalizeW(buffer, path)) { - return INIT_ERR_BUFFER_OVERFLOW(); - } + if (FAILED(PathCchCanonicalizeEx(buffer, MAXPATHLEN + 1, path, 0))) { + return INIT_ERR_BUFFER_OVERFLOW(); } return _PyStatus_OK(); } @@ -437,11 +390,10 @@ getpythonregpath(HKEY keyBase, int skipcore) /* Allocate a temp array of char buffers, so we only need to loop reading the registry once */ - ppPaths = PyMem_RawMalloc( sizeof(WCHAR *) * numKeys ); + ppPaths = PyMem_RawCalloc(numKeys, sizeof(WCHAR *)); if (ppPaths==NULL) { goto done; } - memset(ppPaths, 0, sizeof(WCHAR *) * numKeys); /* Loop over all subkeys, allocating a temp sub-buffer. */ for(index=0;indexhome==NULL ? 0 : 1; #ifdef Py_ENABLE_SHARED - calculate->machine_path = getpythonregpath(HKEY_LOCAL_MACHINE, skiphome); - calculate->user_path = getpythonregpath(HKEY_CURRENT_USER, skiphome); + if (!Py_IgnoreEnvironmentFlag) { + calculate->machine_path = getpythonregpath(HKEY_LOCAL_MACHINE, + skiphome); + calculate->user_path = getpythonregpath(HKEY_CURRENT_USER, skiphome); + } #endif /* We only use the default relative PYTHONPATH if we haven't anything better to use! */ @@ -1021,7 +982,11 @@ calculate_path(PyCalculatePath *calculate, _PyPathConfig *pathconfig) goto done; } - calculate_pyvenv_file(calculate, argv0_path, Py_ARRAY_LENGTH(argv0_path)); + status = calculate_pyvenv_file(calculate, + argv0_path, Py_ARRAY_LENGTH(argv0_path)); + if (_PyStatus_EXCEPTION(status)) { + return status; + } /* Calculate zip archive path from DLL or exe path */ wchar_t zip_path[MAXPATHLEN+1]; diff --git a/PC/icons/idlex150.png b/PC/icons/idlex150.png new file mode 100644 index 0000000000000000000000000000000000000000..806cb0c8aa219be92c78937b5d291ba905cf9978 Binary files /dev/null and b/PC/icons/idlex150.png differ diff --git a/PC/icons/idlex44.png b/PC/icons/idlex44.png new file mode 100644 index 0000000000000000000000000000000000000000..3ef66e6c68e6bb77bf84fe310112a96908c23d73 Binary files /dev/null and b/PC/icons/idlex44.png differ diff --git a/PC/launcher.c b/PC/launcher.c index 2749a4e7054671b43804af442b97a5a7df473868..106fc660755f7e98cf51fa91e100224e1009e6da 100644 --- a/PC/launcher.c +++ b/PC/launcher.c @@ -1247,6 +1247,7 @@ static PYC_MAGIC magic_values[] = { { 3360, 3379, L"3.6" }, { 3390, 3399, L"3.7" }, { 3400, 3419, L"3.8" }, + { 3420, 3429, L"3.9" }, { 0 } }; @@ -1519,7 +1520,7 @@ show_help_text(wchar_t ** argv) Python Launcher for Windows Version %ls\n\n", version_text); fwprintf(stdout, L"\ usage:\n\ -%ls [launcher-args] [python-args] script [script-args]\n\n", argv[0]); +%ls [launcher-args] [python-args] [script [script-args]]\n\n", argv[0]); fputws(L"\ Launcher arguments:\n\n\ -2 : Launch the latest Python 2.x version\n\ @@ -1535,6 +1536,15 @@ Launcher arguments:\n\n\ } fputws(L"\n-0 --list : List the available pythons", stdout); fputws(L"\n-0p --list-paths : List with paths", stdout); + fputws(L"\n\n If no script is specified the specified interpreter is opened.", stdout); + fputws(L"\nIf an exact version is not given, using the latest version can be overridden by", stdout); + fputws(L"\nany of the following, (in priority order):", stdout); + fputws(L"\n An active virtual environment", stdout); + fputws(L"\n A shebang line in the script (if present)", stdout); + fputws(L"\n With -2 or -3 flag a matching PY_PYTHON2 or PY_PYTHON3 Enviroment variable", stdout); + fputws(L"\n A PY_PYTHON Enviroment variable", stdout); + fputws(L"\n From [defaults] in py.ini in your %LOCALAPPDATA%\\py.ini", stdout); + fputws(L"\n From [defaults] in py.ini beside py.exe (use `where py` to locate)", stdout); fputws(L"\n\nThe following help text is from Python:\n\n", stdout); fflush(stdout); } @@ -1830,7 +1840,7 @@ process(int argc, wchar_t ** argv) #if !defined(VENV_REDIRECT) /* bpo-35811: The __PYVENV_LAUNCHER__ variable is used to - * override sys.executable and locate the original prefix path. + * override sys.executable and locate the original prefix path. * However, if it is silently inherited by a non-venv Python * process, that process will believe it is running in the venv * still. This is the only place where *we* can clear it (that is, diff --git a/PC/layout/support/appxmanifest.py b/PC/layout/support/appxmanifest.py index 9a7439d027126da542baff39fdd195d593899b82..747c97a00699dd70d5a4c3afac41676e44d7988a 100644 --- a/PC/layout/support/appxmanifest.py +++ b/PC/layout/support/appxmanifest.py @@ -67,8 +67,8 @@ IDLE_VE_DATA = dict( DisplayName="IDLE (Python {})".format(VER_DOT), Description="IDLE editor for Python {}".format(VER_DOT), - Square150x150Logo="_resources/pythonwx150.png", - Square44x44Logo="_resources/pythonwx44.png", + Square150x150Logo="_resources/idlex150.png", + Square44x44Logo="_resources/idlex44.png", BackgroundColor="transparent", ) @@ -498,6 +498,11 @@ def get_appx_layout(ns): src = icons / "pythonwx{}.png".format(px) yield f"_resources/pythonwx{px}.png", src yield f"_resources/pythonwx{px}$targetsize-{px}_altform-unplated.png", src + if ns.include_idle and ns.include_launchers: + for px in [44, 150]: + src = icons / "idlex{}.png".format(px) + yield f"_resources/idlex{px}.png", src + yield f"_resources/idlex{px}$targetsize-{px}_altform-unplated.png", src yield f"_resources/py.png", icons / "py.png" sccd = ns.source / SCCD_FILENAME if sccd.is_file(): diff --git a/PC/pyconfig.h b/PC/pyconfig.h index b6b8d445869bcfe1cc38015a54e299866835ce59..d7d3cf081e05054150aa0413c73dcac6704af26b 100644 --- a/PC/pyconfig.h +++ b/PC/pyconfig.h @@ -135,9 +135,9 @@ WIN32 is still required for the locale module. #endif /* MS_WIN64 */ /* set the version macros for the windows headers */ -/* Python 3.5+ requires Windows Vista or greater */ -#define Py_WINVER 0x0600 /* _WIN32_WINNT_VISTA */ -#define Py_NTDDI NTDDI_VISTA +/* Python 3.9+ requires Windows 8 or greater */ +#define Py_WINVER 0x0602 /* _WIN32_WINNT_WIN8 */ +#define Py_NTDDI NTDDI_WIN8 /* We only set these values when building Python - we don't want to force these values on extensions, as that will affect the prototypes and @@ -193,12 +193,6 @@ typedef int pid_t; #define Py_IS_NAN _isnan #define Py_IS_INFINITY(X) (!_finite(X) && !_isnan(X)) #define Py_IS_FINITE(X) _finite(X) -#define copysign _copysign - -/* Side by Side assemblies supported in VS 2005 and VS 2008 but not 2010*/ -#if _MSC_VER >= 1400 && _MSC_VER < 1600 -#define HAVE_SXS 1 -#endif /* define some ANSI types that are not defined in earlier Win headers */ #if _MSC_VER >= 1200 @@ -274,11 +268,11 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */ file in their Makefile (other compilers are generally taken care of by distutils.) */ # if defined(_DEBUG) -# pragma comment(lib,"python38_d.lib") +# pragma comment(lib,"python39_d.lib") # elif defined(Py_LIMITED_API) # pragma comment(lib,"python3.lib") # else -# pragma comment(lib,"python38.lib") +# pragma comment(lib,"python39.lib") # endif /* _DEBUG */ # endif /* _MSC_VER */ # endif /* Py_BUILD_CORE */ @@ -296,7 +290,7 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */ # define SIZEOF_HKEY 8 # define SIZEOF_SIZE_T 8 /* configure.ac defines HAVE_LARGEFILE_SUPPORT iff - sizeof(off_t) > sizeof(long), and sizeof(PY_LONG_LONG) >= sizeof(off_t). + sizeof(off_t) > sizeof(long), and sizeof(long long) >= sizeof(off_t). On Win64 the second condition is not true, but if fpos_t replaces off_t then this is true. The uses of HAVE_LARGEFILE_SUPPORT imply that Win64 should define this. */ @@ -688,4 +682,6 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */ /* Define if libssl has X509_VERIFY_PARAM_set1_host and related function */ #define HAVE_X509_VERIFY_PARAM_SET1_HOST 1 +#define PLATLIBDIR "lib" + #endif /* !Py_CONFIG_H */ diff --git a/PC/python3.def b/PC/python3.def index 5d93c18af87ec2809c4480880f897684b9466450..d27d7d07128a410dad5dd6800707c41d5946c042 100644 --- a/PC/python3.def +++ b/PC/python3.def @@ -2,801 +2,810 @@ ; It is used when building python3dll.vcxproj LIBRARY "python3" EXPORTS - PyArg_Parse=python38.PyArg_Parse - PyArg_ParseTuple=python38.PyArg_ParseTuple - PyArg_ParseTupleAndKeywords=python38.PyArg_ParseTupleAndKeywords - PyArg_UnpackTuple=python38.PyArg_UnpackTuple - PyArg_VaParse=python38.PyArg_VaParse - PyArg_VaParseTupleAndKeywords=python38.PyArg_VaParseTupleAndKeywords - PyArg_ValidateKeywordArguments=python38.PyArg_ValidateKeywordArguments - PyBaseObject_Type=python38.PyBaseObject_Type DATA - PyBool_FromLong=python38.PyBool_FromLong - PyBool_Type=python38.PyBool_Type DATA - PyByteArrayIter_Type=python38.PyByteArrayIter_Type DATA - PyByteArray_AsString=python38.PyByteArray_AsString - PyByteArray_Concat=python38.PyByteArray_Concat - PyByteArray_FromObject=python38.PyByteArray_FromObject - PyByteArray_FromStringAndSize=python38.PyByteArray_FromStringAndSize - PyByteArray_Resize=python38.PyByteArray_Resize - PyByteArray_Size=python38.PyByteArray_Size - PyByteArray_Type=python38.PyByteArray_Type DATA - PyBytesIter_Type=python38.PyBytesIter_Type DATA - PyBytes_AsString=python38.PyBytes_AsString - PyBytes_AsStringAndSize=python38.PyBytes_AsStringAndSize - PyBytes_Concat=python38.PyBytes_Concat - PyBytes_ConcatAndDel=python38.PyBytes_ConcatAndDel - PyBytes_DecodeEscape=python38.PyBytes_DecodeEscape - PyBytes_FromFormat=python38.PyBytes_FromFormat - PyBytes_FromFormatV=python38.PyBytes_FromFormatV - PyBytes_FromObject=python38.PyBytes_FromObject - PyBytes_FromString=python38.PyBytes_FromString - PyBytes_FromStringAndSize=python38.PyBytes_FromStringAndSize - PyBytes_Repr=python38.PyBytes_Repr - PyBytes_Size=python38.PyBytes_Size - PyBytes_Type=python38.PyBytes_Type DATA - PyCFunction_Call=python38.PyCFunction_Call - PyCFunction_ClearFreeList=python38.PyCFunction_ClearFreeList - PyCFunction_GetFlags=python38.PyCFunction_GetFlags - PyCFunction_GetFunction=python38.PyCFunction_GetFunction - PyCFunction_GetSelf=python38.PyCFunction_GetSelf - PyCFunction_New=python38.PyCFunction_New - PyCFunction_NewEx=python38.PyCFunction_NewEx - PyCFunction_Type=python38.PyCFunction_Type DATA - PyCallIter_New=python38.PyCallIter_New - PyCallIter_Type=python38.PyCallIter_Type DATA - PyCallable_Check=python38.PyCallable_Check - PyCapsule_GetContext=python38.PyCapsule_GetContext - PyCapsule_GetDestructor=python38.PyCapsule_GetDestructor - PyCapsule_GetName=python38.PyCapsule_GetName - PyCapsule_GetPointer=python38.PyCapsule_GetPointer - PyCapsule_Import=python38.PyCapsule_Import - PyCapsule_IsValid=python38.PyCapsule_IsValid - PyCapsule_New=python38.PyCapsule_New - PyCapsule_SetContext=python38.PyCapsule_SetContext - PyCapsule_SetDestructor=python38.PyCapsule_SetDestructor - PyCapsule_SetName=python38.PyCapsule_SetName - PyCapsule_SetPointer=python38.PyCapsule_SetPointer - PyCapsule_Type=python38.PyCapsule_Type DATA - PyClassMethodDescr_Type=python38.PyClassMethodDescr_Type DATA - PyCodec_BackslashReplaceErrors=python38.PyCodec_BackslashReplaceErrors - PyCodec_Decode=python38.PyCodec_Decode - PyCodec_Decoder=python38.PyCodec_Decoder - PyCodec_Encode=python38.PyCodec_Encode - PyCodec_Encoder=python38.PyCodec_Encoder - PyCodec_IgnoreErrors=python38.PyCodec_IgnoreErrors - PyCodec_IncrementalDecoder=python38.PyCodec_IncrementalDecoder - PyCodec_IncrementalEncoder=python38.PyCodec_IncrementalEncoder - PyCodec_KnownEncoding=python38.PyCodec_KnownEncoding - PyCodec_LookupError=python38.PyCodec_LookupError - PyCodec_NameReplaceErrors=python38.PyCodec_NameReplaceErrors - PyCodec_Register=python38.PyCodec_Register - PyCodec_RegisterError=python38.PyCodec_RegisterError - PyCodec_ReplaceErrors=python38.PyCodec_ReplaceErrors - PyCodec_StreamReader=python38.PyCodec_StreamReader - PyCodec_StreamWriter=python38.PyCodec_StreamWriter - PyCodec_StrictErrors=python38.PyCodec_StrictErrors - PyCodec_XMLCharRefReplaceErrors=python38.PyCodec_XMLCharRefReplaceErrors - PyComplex_FromDoubles=python38.PyComplex_FromDoubles - PyComplex_ImagAsDouble=python38.PyComplex_ImagAsDouble - PyComplex_RealAsDouble=python38.PyComplex_RealAsDouble - PyComplex_Type=python38.PyComplex_Type DATA - PyDescr_NewClassMethod=python38.PyDescr_NewClassMethod - PyDescr_NewGetSet=python38.PyDescr_NewGetSet - PyDescr_NewMember=python38.PyDescr_NewMember - PyDescr_NewMethod=python38.PyDescr_NewMethod - PyDictItems_Type=python38.PyDictItems_Type DATA - PyDictIterItem_Type=python38.PyDictIterItem_Type DATA - PyDictIterKey_Type=python38.PyDictIterKey_Type DATA - PyDictIterValue_Type=python38.PyDictIterValue_Type DATA - PyDictKeys_Type=python38.PyDictKeys_Type DATA - PyDictProxy_New=python38.PyDictProxy_New - PyDictProxy_Type=python38.PyDictProxy_Type DATA - PyDictValues_Type=python38.PyDictValues_Type DATA - PyDict_Clear=python38.PyDict_Clear - PyDict_Contains=python38.PyDict_Contains - PyDict_Copy=python38.PyDict_Copy - PyDict_DelItem=python38.PyDict_DelItem - PyDict_DelItemString=python38.PyDict_DelItemString - PyDict_GetItem=python38.PyDict_GetItem - PyDict_GetItemString=python38.PyDict_GetItemString - PyDict_GetItemWithError=python38.PyDict_GetItemWithError - PyDict_Items=python38.PyDict_Items - PyDict_Keys=python38.PyDict_Keys - PyDict_Merge=python38.PyDict_Merge - PyDict_MergeFromSeq2=python38.PyDict_MergeFromSeq2 - PyDict_New=python38.PyDict_New - PyDict_Next=python38.PyDict_Next - PyDict_SetItem=python38.PyDict_SetItem - PyDict_SetItemString=python38.PyDict_SetItemString - PyDict_Size=python38.PyDict_Size - PyDict_Type=python38.PyDict_Type DATA - PyDict_Update=python38.PyDict_Update - PyDict_Values=python38.PyDict_Values - PyEllipsis_Type=python38.PyEllipsis_Type DATA - PyEnum_Type=python38.PyEnum_Type DATA - PyErr_BadArgument=python38.PyErr_BadArgument - PyErr_BadInternalCall=python38.PyErr_BadInternalCall - PyErr_CheckSignals=python38.PyErr_CheckSignals - PyErr_Clear=python38.PyErr_Clear - PyErr_Display=python38.PyErr_Display - PyErr_ExceptionMatches=python38.PyErr_ExceptionMatches - PyErr_Fetch=python38.PyErr_Fetch - PyErr_Format=python38.PyErr_Format - PyErr_FormatV=python38.PyErr_FormatV - PyErr_GetExcInfo=python38.PyErr_GetExcInfo - PyErr_GivenExceptionMatches=python38.PyErr_GivenExceptionMatches - PyErr_NewException=python38.PyErr_NewException - PyErr_NewExceptionWithDoc=python38.PyErr_NewExceptionWithDoc - PyErr_NoMemory=python38.PyErr_NoMemory - PyErr_NormalizeException=python38.PyErr_NormalizeException - PyErr_Occurred=python38.PyErr_Occurred - PyErr_Print=python38.PyErr_Print - PyErr_PrintEx=python38.PyErr_PrintEx - PyErr_ProgramText=python38.PyErr_ProgramText - PyErr_ResourceWarning=python38.PyErr_ResourceWarning - PyErr_Restore=python38.PyErr_Restore - PyErr_SetExcFromWindowsErr=python38.PyErr_SetExcFromWindowsErr - PyErr_SetExcFromWindowsErrWithFilename=python38.PyErr_SetExcFromWindowsErrWithFilename - PyErr_SetExcFromWindowsErrWithFilenameObject=python38.PyErr_SetExcFromWindowsErrWithFilenameObject - PyErr_SetExcFromWindowsErrWithFilenameObjects=python38.PyErr_SetExcFromWindowsErrWithFilenameObjects - PyErr_SetExcInfo=python38.PyErr_SetExcInfo - PyErr_SetFromErrno=python38.PyErr_SetFromErrno - PyErr_SetFromErrnoWithFilename=python38.PyErr_SetFromErrnoWithFilename - PyErr_SetFromErrnoWithFilenameObject=python38.PyErr_SetFromErrnoWithFilenameObject - PyErr_SetFromErrnoWithFilenameObjects=python38.PyErr_SetFromErrnoWithFilenameObjects - PyErr_SetFromWindowsErr=python38.PyErr_SetFromWindowsErr - PyErr_SetFromWindowsErrWithFilename=python38.PyErr_SetFromWindowsErrWithFilename - PyErr_SetImportError=python38.PyErr_SetImportError - PyErr_SetImportErrorSubclass=python38.PyErr_SetImportErrorSubclass - PyErr_SetInterrupt=python38.PyErr_SetInterrupt - PyErr_SetNone=python38.PyErr_SetNone - PyErr_SetObject=python38.PyErr_SetObject - PyErr_SetString=python38.PyErr_SetString - PyErr_SyntaxLocation=python38.PyErr_SyntaxLocation - PyErr_SyntaxLocationEx=python38.PyErr_SyntaxLocationEx - PyErr_WarnEx=python38.PyErr_WarnEx - PyErr_WarnExplicit=python38.PyErr_WarnExplicit - PyErr_WarnFormat=python38.PyErr_WarnFormat - PyErr_WriteUnraisable=python38.PyErr_WriteUnraisable - PyEval_AcquireLock=python38.PyEval_AcquireLock - PyEval_AcquireThread=python38.PyEval_AcquireThread - PyEval_CallFunction=python38.PyEval_CallFunction - PyEval_CallMethod=python38.PyEval_CallMethod - PyEval_CallObjectWithKeywords=python38.PyEval_CallObjectWithKeywords - PyEval_EvalCode=python38.PyEval_EvalCode - PyEval_EvalCodeEx=python38.PyEval_EvalCodeEx - PyEval_EvalFrame=python38.PyEval_EvalFrame - PyEval_EvalFrameEx=python38.PyEval_EvalFrameEx - PyEval_GetBuiltins=python38.PyEval_GetBuiltins - PyEval_GetCallStats=python38.PyEval_GetCallStats - PyEval_GetFrame=python38.PyEval_GetFrame - PyEval_GetFuncDesc=python38.PyEval_GetFuncDesc - PyEval_GetFuncName=python38.PyEval_GetFuncName - PyEval_GetGlobals=python38.PyEval_GetGlobals - PyEval_GetLocals=python38.PyEval_GetLocals - PyEval_InitThreads=python38.PyEval_InitThreads - PyEval_ReInitThreads=python38.PyEval_ReInitThreads - PyEval_ReleaseLock=python38.PyEval_ReleaseLock - PyEval_ReleaseThread=python38.PyEval_ReleaseThread - PyEval_RestoreThread=python38.PyEval_RestoreThread - PyEval_SaveThread=python38.PyEval_SaveThread - PyEval_ThreadsInitialized=python38.PyEval_ThreadsInitialized - PyExc_ArithmeticError=python38.PyExc_ArithmeticError DATA - PyExc_AssertionError=python38.PyExc_AssertionError DATA - PyExc_AttributeError=python38.PyExc_AttributeError DATA - PyExc_BaseException=python38.PyExc_BaseException DATA - PyExc_BlockingIOError=python38.PyExc_BlockingIOError DATA - PyExc_BrokenPipeError=python38.PyExc_BrokenPipeError DATA - PyExc_BufferError=python38.PyExc_BufferError DATA - PyExc_BytesWarning=python38.PyExc_BytesWarning DATA - PyExc_ChildProcessError=python38.PyExc_ChildProcessError DATA - PyExc_ConnectionAbortedError=python38.PyExc_ConnectionAbortedError DATA - PyExc_ConnectionError=python38.PyExc_ConnectionError DATA - PyExc_ConnectionRefusedError=python38.PyExc_ConnectionRefusedError DATA - PyExc_ConnectionResetError=python38.PyExc_ConnectionResetError DATA - PyExc_DeprecationWarning=python38.PyExc_DeprecationWarning DATA - PyExc_EOFError=python38.PyExc_EOFError DATA - PyExc_EnvironmentError=python38.PyExc_EnvironmentError DATA - PyExc_Exception=python38.PyExc_Exception DATA - PyExc_FileExistsError=python38.PyExc_FileExistsError DATA - PyExc_FileNotFoundError=python38.PyExc_FileNotFoundError DATA - PyExc_FloatingPointError=python38.PyExc_FloatingPointError DATA - PyExc_FutureWarning=python38.PyExc_FutureWarning DATA - PyExc_GeneratorExit=python38.PyExc_GeneratorExit DATA - PyExc_IOError=python38.PyExc_IOError DATA - PyExc_ImportError=python38.PyExc_ImportError DATA - PyExc_ImportWarning=python38.PyExc_ImportWarning DATA - PyExc_IndentationError=python38.PyExc_IndentationError DATA - PyExc_IndexError=python38.PyExc_IndexError DATA - PyExc_InterruptedError=python38.PyExc_InterruptedError DATA - PyExc_IsADirectoryError=python38.PyExc_IsADirectoryError DATA - PyExc_KeyError=python38.PyExc_KeyError DATA - PyExc_KeyboardInterrupt=python38.PyExc_KeyboardInterrupt DATA - PyExc_LookupError=python38.PyExc_LookupError DATA - PyExc_MemoryError=python38.PyExc_MemoryError DATA - PyExc_ModuleNotFoundError=python38.PyExc_ModuleNotFoundError DATA - PyExc_NameError=python38.PyExc_NameError DATA - PyExc_NotADirectoryError=python38.PyExc_NotADirectoryError DATA - PyExc_NotImplementedError=python38.PyExc_NotImplementedError DATA - PyExc_OSError=python38.PyExc_OSError DATA - PyExc_OverflowError=python38.PyExc_OverflowError DATA - PyExc_PendingDeprecationWarning=python38.PyExc_PendingDeprecationWarning DATA - PyExc_PermissionError=python38.PyExc_PermissionError DATA - PyExc_ProcessLookupError=python38.PyExc_ProcessLookupError DATA - PyExc_RecursionError=python38.PyExc_RecursionError DATA - PyExc_ReferenceError=python38.PyExc_ReferenceError DATA - PyExc_ResourceWarning=python38.PyExc_ResourceWarning DATA - PyExc_RuntimeError=python38.PyExc_RuntimeError DATA - PyExc_RuntimeWarning=python38.PyExc_RuntimeWarning DATA - PyExc_StopAsyncIteration=python38.PyExc_StopAsyncIteration DATA - PyExc_StopIteration=python38.PyExc_StopIteration DATA - PyExc_SyntaxError=python38.PyExc_SyntaxError DATA - PyExc_SyntaxWarning=python38.PyExc_SyntaxWarning DATA - PyExc_SystemError=python38.PyExc_SystemError DATA - PyExc_SystemExit=python38.PyExc_SystemExit DATA - PyExc_TabError=python38.PyExc_TabError DATA - PyExc_TimeoutError=python38.PyExc_TimeoutError DATA - PyExc_TypeError=python38.PyExc_TypeError DATA - PyExc_UnboundLocalError=python38.PyExc_UnboundLocalError DATA - PyExc_UnicodeDecodeError=python38.PyExc_UnicodeDecodeError DATA - PyExc_UnicodeEncodeError=python38.PyExc_UnicodeEncodeError DATA - PyExc_UnicodeError=python38.PyExc_UnicodeError DATA - PyExc_UnicodeTranslateError=python38.PyExc_UnicodeTranslateError DATA - PyExc_UnicodeWarning=python38.PyExc_UnicodeWarning DATA - PyExc_UserWarning=python38.PyExc_UserWarning DATA - PyExc_ValueError=python38.PyExc_ValueError DATA - PyExc_Warning=python38.PyExc_Warning DATA - PyExc_WindowsError=python38.PyExc_WindowsError DATA - PyExc_ZeroDivisionError=python38.PyExc_ZeroDivisionError DATA - PyExceptionClass_Name=python38.PyExceptionClass_Name - PyException_GetCause=python38.PyException_GetCause - PyException_GetContext=python38.PyException_GetContext - PyException_GetTraceback=python38.PyException_GetTraceback - PyException_SetCause=python38.PyException_SetCause - PyException_SetContext=python38.PyException_SetContext - PyException_SetTraceback=python38.PyException_SetTraceback - PyFile_FromFd=python38.PyFile_FromFd - PyFile_GetLine=python38.PyFile_GetLine - PyFile_WriteObject=python38.PyFile_WriteObject - PyFile_WriteString=python38.PyFile_WriteString - PyFilter_Type=python38.PyFilter_Type DATA - PyFloat_AsDouble=python38.PyFloat_AsDouble - PyFloat_FromDouble=python38.PyFloat_FromDouble - PyFloat_FromString=python38.PyFloat_FromString - PyFloat_GetInfo=python38.PyFloat_GetInfo - PyFloat_GetMax=python38.PyFloat_GetMax - PyFloat_GetMin=python38.PyFloat_GetMin - PyFloat_Type=python38.PyFloat_Type DATA - PyFrozenSet_New=python38.PyFrozenSet_New - PyFrozenSet_Type=python38.PyFrozenSet_Type DATA - PyGC_Collect=python38.PyGC_Collect - PyGILState_Ensure=python38.PyGILState_Ensure - PyGILState_GetThisThreadState=python38.PyGILState_GetThisThreadState - PyGILState_Release=python38.PyGILState_Release - PyGetSetDescr_Type=python38.PyGetSetDescr_Type DATA - PyImport_AddModule=python38.PyImport_AddModule - PyImport_AddModuleObject=python38.PyImport_AddModuleObject - PyImport_AppendInittab=python38.PyImport_AppendInittab - PyImport_Cleanup=python38.PyImport_Cleanup - PyImport_ExecCodeModule=python38.PyImport_ExecCodeModule - PyImport_ExecCodeModuleEx=python38.PyImport_ExecCodeModuleEx - PyImport_ExecCodeModuleObject=python38.PyImport_ExecCodeModuleObject - PyImport_ExecCodeModuleWithPathnames=python38.PyImport_ExecCodeModuleWithPathnames - PyImport_GetImporter=python38.PyImport_GetImporter - PyImport_GetMagicNumber=python38.PyImport_GetMagicNumber - PyImport_GetMagicTag=python38.PyImport_GetMagicTag - PyImport_GetModule=python38.PyImport_GetModule - PyImport_GetModuleDict=python38.PyImport_GetModuleDict - PyImport_Import=python38.PyImport_Import - PyImport_ImportFrozenModule=python38.PyImport_ImportFrozenModule - PyImport_ImportFrozenModuleObject=python38.PyImport_ImportFrozenModuleObject - PyImport_ImportModule=python38.PyImport_ImportModule - PyImport_ImportModuleLevel=python38.PyImport_ImportModuleLevel - PyImport_ImportModuleLevelObject=python38.PyImport_ImportModuleLevelObject - PyImport_ImportModuleNoBlock=python38.PyImport_ImportModuleNoBlock - PyImport_ReloadModule=python38.PyImport_ReloadModule - PyIndex_Check=python38.PyIndex_Check - PyInterpreterState_Clear=python38.PyInterpreterState_Clear - PyInterpreterState_Delete=python38.PyInterpreterState_Delete - PyInterpreterState_New=python38.PyInterpreterState_New - PyIter_Check=python38.PyIter_Check - PyIter_Next=python38.PyIter_Next - PyListIter_Type=python38.PyListIter_Type DATA - PyListRevIter_Type=python38.PyListRevIter_Type DATA - PyList_Append=python38.PyList_Append - PyList_AsTuple=python38.PyList_AsTuple - PyList_GetItem=python38.PyList_GetItem - PyList_GetSlice=python38.PyList_GetSlice - PyList_Insert=python38.PyList_Insert - PyList_New=python38.PyList_New - PyList_Reverse=python38.PyList_Reverse - PyList_SetItem=python38.PyList_SetItem - PyList_SetSlice=python38.PyList_SetSlice - PyList_Size=python38.PyList_Size - PyList_Sort=python38.PyList_Sort - PyList_Type=python38.PyList_Type DATA - PyLongRangeIter_Type=python38.PyLongRangeIter_Type DATA - PyLong_AsDouble=python38.PyLong_AsDouble - PyLong_AsLong=python38.PyLong_AsLong - PyLong_AsLongAndOverflow=python38.PyLong_AsLongAndOverflow - PyLong_AsLongLong=python38.PyLong_AsLongLong - PyLong_AsLongLongAndOverflow=python38.PyLong_AsLongLongAndOverflow - PyLong_AsSize_t=python38.PyLong_AsSize_t - PyLong_AsSsize_t=python38.PyLong_AsSsize_t - PyLong_AsUnsignedLong=python38.PyLong_AsUnsignedLong - PyLong_AsUnsignedLongLong=python38.PyLong_AsUnsignedLongLong - PyLong_AsUnsignedLongLongMask=python38.PyLong_AsUnsignedLongLongMask - PyLong_AsUnsignedLongMask=python38.PyLong_AsUnsignedLongMask - PyLong_AsVoidPtr=python38.PyLong_AsVoidPtr - PyLong_FromDouble=python38.PyLong_FromDouble - PyLong_FromLong=python38.PyLong_FromLong - PyLong_FromLongLong=python38.PyLong_FromLongLong - PyLong_FromSize_t=python38.PyLong_FromSize_t - PyLong_FromSsize_t=python38.PyLong_FromSsize_t - PyLong_FromString=python38.PyLong_FromString - PyLong_FromUnsignedLong=python38.PyLong_FromUnsignedLong - PyLong_FromUnsignedLongLong=python38.PyLong_FromUnsignedLongLong - PyLong_FromVoidPtr=python38.PyLong_FromVoidPtr - PyLong_GetInfo=python38.PyLong_GetInfo - PyLong_Type=python38.PyLong_Type DATA - PyMap_Type=python38.PyMap_Type DATA - PyMapping_Check=python38.PyMapping_Check - PyMapping_GetItemString=python38.PyMapping_GetItemString - PyMapping_HasKey=python38.PyMapping_HasKey - PyMapping_HasKeyString=python38.PyMapping_HasKeyString - PyMapping_Items=python38.PyMapping_Items - PyMapping_Keys=python38.PyMapping_Keys - PyMapping_Length=python38.PyMapping_Length - PyMapping_SetItemString=python38.PyMapping_SetItemString - PyMapping_Size=python38.PyMapping_Size - PyMapping_Values=python38.PyMapping_Values - PyMem_Calloc=python38.PyMem_Calloc - PyMem_Free=python38.PyMem_Free - PyMem_Malloc=python38.PyMem_Malloc - PyMem_Realloc=python38.PyMem_Realloc - PyMemberDescr_Type=python38.PyMemberDescr_Type DATA - PyMemoryView_FromMemory=python38.PyMemoryView_FromMemory - PyMemoryView_FromObject=python38.PyMemoryView_FromObject - PyMemoryView_GetContiguous=python38.PyMemoryView_GetContiguous - PyMemoryView_Type=python38.PyMemoryView_Type DATA - PyMethodDescr_Type=python38.PyMethodDescr_Type DATA - PyModuleDef_Init=python38.PyModuleDef_Init - PyModuleDef_Type=python38.PyModuleDef_Type DATA - PyModule_AddFunctions=python38.PyModule_AddFunctions - PyModule_AddIntConstant=python38.PyModule_AddIntConstant - PyModule_AddObject=python38.PyModule_AddObject - PyModule_AddStringConstant=python38.PyModule_AddStringConstant - PyModule_Create2=python38.PyModule_Create2 - PyModule_ExecDef=python38.PyModule_ExecDef - PyModule_FromDefAndSpec2=python38.PyModule_FromDefAndSpec2 - PyModule_GetDef=python38.PyModule_GetDef - PyModule_GetDict=python38.PyModule_GetDict - PyModule_GetFilename=python38.PyModule_GetFilename - PyModule_GetFilenameObject=python38.PyModule_GetFilenameObject - PyModule_GetName=python38.PyModule_GetName - PyModule_GetNameObject=python38.PyModule_GetNameObject - PyModule_GetState=python38.PyModule_GetState - PyModule_New=python38.PyModule_New - PyModule_NewObject=python38.PyModule_NewObject - PyModule_SetDocString=python38.PyModule_SetDocString - PyModule_Type=python38.PyModule_Type DATA - PyNullImporter_Type=python38.PyNullImporter_Type DATA - PyNumber_Absolute=python38.PyNumber_Absolute - PyNumber_Add=python38.PyNumber_Add - PyNumber_And=python38.PyNumber_And - PyNumber_AsSsize_t=python38.PyNumber_AsSsize_t - PyNumber_Check=python38.PyNumber_Check - PyNumber_Divmod=python38.PyNumber_Divmod - PyNumber_Float=python38.PyNumber_Float - PyNumber_FloorDivide=python38.PyNumber_FloorDivide - PyNumber_InPlaceAdd=python38.PyNumber_InPlaceAdd - PyNumber_InPlaceAnd=python38.PyNumber_InPlaceAnd - PyNumber_InPlaceFloorDivide=python38.PyNumber_InPlaceFloorDivide - PyNumber_InPlaceLshift=python38.PyNumber_InPlaceLshift - PyNumber_InPlaceMatrixMultiply=python38.PyNumber_InPlaceMatrixMultiply - PyNumber_InPlaceMultiply=python38.PyNumber_InPlaceMultiply - PyNumber_InPlaceOr=python38.PyNumber_InPlaceOr - PyNumber_InPlacePower=python38.PyNumber_InPlacePower - PyNumber_InPlaceRemainder=python38.PyNumber_InPlaceRemainder - PyNumber_InPlaceRshift=python38.PyNumber_InPlaceRshift - PyNumber_InPlaceSubtract=python38.PyNumber_InPlaceSubtract - PyNumber_InPlaceTrueDivide=python38.PyNumber_InPlaceTrueDivide - PyNumber_InPlaceXor=python38.PyNumber_InPlaceXor - PyNumber_Index=python38.PyNumber_Index - PyNumber_Invert=python38.PyNumber_Invert - PyNumber_Long=python38.PyNumber_Long - PyNumber_Lshift=python38.PyNumber_Lshift - PyNumber_MatrixMultiply=python38.PyNumber_MatrixMultiply - PyNumber_Multiply=python38.PyNumber_Multiply - PyNumber_Negative=python38.PyNumber_Negative - PyNumber_Or=python38.PyNumber_Or - PyNumber_Positive=python38.PyNumber_Positive - PyNumber_Power=python38.PyNumber_Power - PyNumber_Remainder=python38.PyNumber_Remainder - PyNumber_Rshift=python38.PyNumber_Rshift - PyNumber_Subtract=python38.PyNumber_Subtract - PyNumber_ToBase=python38.PyNumber_ToBase - PyNumber_TrueDivide=python38.PyNumber_TrueDivide - PyNumber_Xor=python38.PyNumber_Xor - PyODictItems_Type=python38.PyODictItems_Type DATA - PyODictIter_Type=python38.PyODictIter_Type DATA - PyODictKeys_Type=python38.PyODictKeys_Type DATA - PyODictValues_Type=python38.PyODictValues_Type DATA - PyODict_DelItem=python38.PyODict_DelItem - PyODict_New=python38.PyODict_New - PyODict_SetItem=python38.PyODict_SetItem - PyODict_Type=python38.PyODict_Type DATA - PyOS_AfterFork=python38.PyOS_AfterFork - PyOS_CheckStack=python38.PyOS_CheckStack - PyOS_FSPath=python38.PyOS_FSPath - PyOS_InitInterrupts=python38.PyOS_InitInterrupts - PyOS_InputHook=python38.PyOS_InputHook DATA - PyOS_InterruptOccurred=python38.PyOS_InterruptOccurred - PyOS_ReadlineFunctionPointer=python38.PyOS_ReadlineFunctionPointer DATA - PyOS_double_to_string=python38.PyOS_double_to_string - PyOS_getsig=python38.PyOS_getsig - PyOS_mystricmp=python38.PyOS_mystricmp - PyOS_mystrnicmp=python38.PyOS_mystrnicmp - PyOS_setsig=python38.PyOS_setsig - PyOS_snprintf=python38.PyOS_snprintf - PyOS_string_to_double=python38.PyOS_string_to_double - PyOS_strtol=python38.PyOS_strtol - PyOS_strtoul=python38.PyOS_strtoul - PyOS_vsnprintf=python38.PyOS_vsnprintf - PyObject_ASCII=python38.PyObject_ASCII - PyObject_AsCharBuffer=python38.PyObject_AsCharBuffer - PyObject_AsFileDescriptor=python38.PyObject_AsFileDescriptor - PyObject_AsReadBuffer=python38.PyObject_AsReadBuffer - PyObject_AsWriteBuffer=python38.PyObject_AsWriteBuffer - PyObject_Bytes=python38.PyObject_Bytes - PyObject_Call=python38.PyObject_Call - PyObject_CallFunction=python38.PyObject_CallFunction - PyObject_CallFunctionObjArgs=python38.PyObject_CallFunctionObjArgs - PyObject_CallMethod=python38.PyObject_CallMethod - PyObject_CallMethodObjArgs=python38.PyObject_CallMethodObjArgs - PyObject_CallObject=python38.PyObject_CallObject - PyObject_Calloc=python38.PyObject_Calloc - PyObject_CheckReadBuffer=python38.PyObject_CheckReadBuffer - PyObject_ClearWeakRefs=python38.PyObject_ClearWeakRefs - PyObject_DelItem=python38.PyObject_DelItem - PyObject_DelItemString=python38.PyObject_DelItemString - PyObject_Dir=python38.PyObject_Dir - PyObject_Format=python38.PyObject_Format - PyObject_Free=python38.PyObject_Free - PyObject_GC_Del=python38.PyObject_GC_Del - PyObject_GC_Track=python38.PyObject_GC_Track - PyObject_GC_UnTrack=python38.PyObject_GC_UnTrack - PyObject_GenericGetAttr=python38.PyObject_GenericGetAttr - PyObject_GenericSetAttr=python38.PyObject_GenericSetAttr - PyObject_GenericSetDict=python38.PyObject_GenericSetDict - PyObject_GetAttr=python38.PyObject_GetAttr - PyObject_GetAttrString=python38.PyObject_GetAttrString - PyObject_GetItem=python38.PyObject_GetItem - PyObject_GetIter=python38.PyObject_GetIter - PyObject_HasAttr=python38.PyObject_HasAttr - PyObject_HasAttrString=python38.PyObject_HasAttrString - PyObject_Hash=python38.PyObject_Hash - PyObject_HashNotImplemented=python38.PyObject_HashNotImplemented - PyObject_Init=python38.PyObject_Init - PyObject_InitVar=python38.PyObject_InitVar - PyObject_IsInstance=python38.PyObject_IsInstance - PyObject_IsSubclass=python38.PyObject_IsSubclass - PyObject_IsTrue=python38.PyObject_IsTrue - PyObject_Length=python38.PyObject_Length - PyObject_Malloc=python38.PyObject_Malloc - PyObject_Not=python38.PyObject_Not - PyObject_Realloc=python38.PyObject_Realloc - PyObject_Repr=python38.PyObject_Repr - PyObject_RichCompare=python38.PyObject_RichCompare - PyObject_RichCompareBool=python38.PyObject_RichCompareBool - PyObject_SelfIter=python38.PyObject_SelfIter - PyObject_SetAttr=python38.PyObject_SetAttr - PyObject_SetAttrString=python38.PyObject_SetAttrString - PyObject_SetItem=python38.PyObject_SetItem - PyObject_Size=python38.PyObject_Size - PyObject_Str=python38.PyObject_Str - PyObject_Type=python38.PyObject_Type - PyParser_SimpleParseFileFlags=python38.PyParser_SimpleParseFileFlags - PyParser_SimpleParseStringFlags=python38.PyParser_SimpleParseStringFlags - PyParser_SimpleParseStringFlagsFilename=python38.PyParser_SimpleParseStringFlagsFilename - PyProperty_Type=python38.PyProperty_Type DATA - PyRangeIter_Type=python38.PyRangeIter_Type DATA - PyRange_Type=python38.PyRange_Type DATA - PyReversed_Type=python38.PyReversed_Type DATA - PySeqIter_New=python38.PySeqIter_New - PySeqIter_Type=python38.PySeqIter_Type DATA - PySequence_Check=python38.PySequence_Check - PySequence_Concat=python38.PySequence_Concat - PySequence_Contains=python38.PySequence_Contains - PySequence_Count=python38.PySequence_Count - PySequence_DelItem=python38.PySequence_DelItem - PySequence_DelSlice=python38.PySequence_DelSlice - PySequence_Fast=python38.PySequence_Fast - PySequence_GetItem=python38.PySequence_GetItem - PySequence_GetSlice=python38.PySequence_GetSlice - PySequence_In=python38.PySequence_In - PySequence_InPlaceConcat=python38.PySequence_InPlaceConcat - PySequence_InPlaceRepeat=python38.PySequence_InPlaceRepeat - PySequence_Index=python38.PySequence_Index - PySequence_Length=python38.PySequence_Length - PySequence_List=python38.PySequence_List - PySequence_Repeat=python38.PySequence_Repeat - PySequence_SetItem=python38.PySequence_SetItem - PySequence_SetSlice=python38.PySequence_SetSlice - PySequence_Size=python38.PySequence_Size - PySequence_Tuple=python38.PySequence_Tuple - PySetIter_Type=python38.PySetIter_Type DATA - PySet_Add=python38.PySet_Add - PySet_Clear=python38.PySet_Clear - PySet_Contains=python38.PySet_Contains - PySet_Discard=python38.PySet_Discard - PySet_New=python38.PySet_New - PySet_Pop=python38.PySet_Pop - PySet_Size=python38.PySet_Size - PySet_Type=python38.PySet_Type DATA - PySlice_AdjustIndices=python38.PySlice_AdjustIndices - PySlice_GetIndices=python38.PySlice_GetIndices - PySlice_GetIndicesEx=python38.PySlice_GetIndicesEx - PySlice_New=python38.PySlice_New - PySlice_Type=python38.PySlice_Type DATA - PySlice_Unpack=python38.PySlice_Unpack - PySortWrapper_Type=python38.PySortWrapper_Type DATA - PyInterpreterState_GetID=python38.PyInterpreterState_GetID - PyState_AddModule=python38.PyState_AddModule - PyState_FindModule=python38.PyState_FindModule - PyState_RemoveModule=python38.PyState_RemoveModule - PyStructSequence_GetItem=python38.PyStructSequence_GetItem - PyStructSequence_New=python38.PyStructSequence_New - PyStructSequence_NewType=python38.PyStructSequence_NewType - PyStructSequence_SetItem=python38.PyStructSequence_SetItem - PySuper_Type=python38.PySuper_Type DATA - PySys_AddWarnOption=python38.PySys_AddWarnOption - PySys_AddWarnOptionUnicode=python38.PySys_AddWarnOptionUnicode - PySys_AddXOption=python38.PySys_AddXOption - PySys_FormatStderr=python38.PySys_FormatStderr - PySys_FormatStdout=python38.PySys_FormatStdout - PySys_GetObject=python38.PySys_GetObject - PySys_GetXOptions=python38.PySys_GetXOptions - PySys_HasWarnOptions=python38.PySys_HasWarnOptions - PySys_ResetWarnOptions=python38.PySys_ResetWarnOptions - PySys_SetArgv=python38.PySys_SetArgv - PySys_SetArgvEx=python38.PySys_SetArgvEx - PySys_SetObject=python38.PySys_SetObject - PySys_SetPath=python38.PySys_SetPath - PySys_WriteStderr=python38.PySys_WriteStderr - PySys_WriteStdout=python38.PySys_WriteStdout - PyThreadState_Clear=python38.PyThreadState_Clear - PyThreadState_Delete=python38.PyThreadState_Delete - PyThreadState_DeleteCurrent=python38.PyThreadState_DeleteCurrent - PyThreadState_Get=python38.PyThreadState_Get - PyThreadState_GetDict=python38.PyThreadState_GetDict - PyThreadState_New=python38.PyThreadState_New - PyThreadState_SetAsyncExc=python38.PyThreadState_SetAsyncExc - PyThreadState_Swap=python38.PyThreadState_Swap - PyThread_tss_alloc=python38.PyThread_tss_alloc - PyThread_tss_create=python38.PyThread_tss_create - PyThread_tss_delete=python38.PyThread_tss_delete - PyThread_tss_free=python38.PyThread_tss_free - PyThread_tss_get=python38.PyThread_tss_get - PyThread_tss_is_created=python38.PyThread_tss_is_created - PyThread_tss_set=python38.PyThread_tss_set - PyTraceBack_Here=python38.PyTraceBack_Here - PyTraceBack_Print=python38.PyTraceBack_Print - PyTraceBack_Type=python38.PyTraceBack_Type DATA - PyTupleIter_Type=python38.PyTupleIter_Type DATA - PyTuple_ClearFreeList=python38.PyTuple_ClearFreeList - PyTuple_GetItem=python38.PyTuple_GetItem - PyTuple_GetSlice=python38.PyTuple_GetSlice - PyTuple_New=python38.PyTuple_New - PyTuple_Pack=python38.PyTuple_Pack - PyTuple_SetItem=python38.PyTuple_SetItem - PyTuple_Size=python38.PyTuple_Size - PyTuple_Type=python38.PyTuple_Type DATA - PyType_ClearCache=python38.PyType_ClearCache - PyType_FromSpec=python38.PyType_FromSpec - PyType_FromSpecWithBases=python38.PyType_FromSpecWithBases - PyType_GenericAlloc=python38.PyType_GenericAlloc - PyType_GenericNew=python38.PyType_GenericNew - PyType_GetFlags=python38.PyType_GetFlags - PyType_GetSlot=python38.PyType_GetSlot - PyType_IsSubtype=python38.PyType_IsSubtype - PyType_Modified=python38.PyType_Modified - PyType_Ready=python38.PyType_Ready - PyType_Type=python38.PyType_Type DATA - PyUnicodeDecodeError_Create=python38.PyUnicodeDecodeError_Create - PyUnicodeDecodeError_GetEncoding=python38.PyUnicodeDecodeError_GetEncoding - PyUnicodeDecodeError_GetEnd=python38.PyUnicodeDecodeError_GetEnd - PyUnicodeDecodeError_GetObject=python38.PyUnicodeDecodeError_GetObject - PyUnicodeDecodeError_GetReason=python38.PyUnicodeDecodeError_GetReason - PyUnicodeDecodeError_GetStart=python38.PyUnicodeDecodeError_GetStart - PyUnicodeDecodeError_SetEnd=python38.PyUnicodeDecodeError_SetEnd - PyUnicodeDecodeError_SetReason=python38.PyUnicodeDecodeError_SetReason - PyUnicodeDecodeError_SetStart=python38.PyUnicodeDecodeError_SetStart - PyUnicodeEncodeError_GetEncoding=python38.PyUnicodeEncodeError_GetEncoding - PyUnicodeEncodeError_GetEnd=python38.PyUnicodeEncodeError_GetEnd - PyUnicodeEncodeError_GetObject=python38.PyUnicodeEncodeError_GetObject - PyUnicodeEncodeError_GetReason=python38.PyUnicodeEncodeError_GetReason - PyUnicodeEncodeError_GetStart=python38.PyUnicodeEncodeError_GetStart - PyUnicodeEncodeError_SetEnd=python38.PyUnicodeEncodeError_SetEnd - PyUnicodeEncodeError_SetReason=python38.PyUnicodeEncodeError_SetReason - PyUnicodeEncodeError_SetStart=python38.PyUnicodeEncodeError_SetStart - PyUnicodeIter_Type=python38.PyUnicodeIter_Type DATA - PyUnicodeTranslateError_GetEnd=python38.PyUnicodeTranslateError_GetEnd - PyUnicodeTranslateError_GetObject=python38.PyUnicodeTranslateError_GetObject - PyUnicodeTranslateError_GetReason=python38.PyUnicodeTranslateError_GetReason - PyUnicodeTranslateError_GetStart=python38.PyUnicodeTranslateError_GetStart - PyUnicodeTranslateError_SetEnd=python38.PyUnicodeTranslateError_SetEnd - PyUnicodeTranslateError_SetReason=python38.PyUnicodeTranslateError_SetReason - PyUnicodeTranslateError_SetStart=python38.PyUnicodeTranslateError_SetStart - PyUnicode_Append=python38.PyUnicode_Append - PyUnicode_AppendAndDel=python38.PyUnicode_AppendAndDel - PyUnicode_AsASCIIString=python38.PyUnicode_AsASCIIString - PyUnicode_AsCharmapString=python38.PyUnicode_AsCharmapString - PyUnicode_AsDecodedObject=python38.PyUnicode_AsDecodedObject - PyUnicode_AsDecodedUnicode=python38.PyUnicode_AsDecodedUnicode - PyUnicode_AsEncodedObject=python38.PyUnicode_AsEncodedObject - PyUnicode_AsEncodedString=python38.PyUnicode_AsEncodedString - PyUnicode_AsEncodedUnicode=python38.PyUnicode_AsEncodedUnicode - PyUnicode_AsLatin1String=python38.PyUnicode_AsLatin1String - PyUnicode_AsMBCSString=python38.PyUnicode_AsMBCSString - PyUnicode_AsRawUnicodeEscapeString=python38.PyUnicode_AsRawUnicodeEscapeString - PyUnicode_AsUCS4=python38.PyUnicode_AsUCS4 - PyUnicode_AsUCS4Copy=python38.PyUnicode_AsUCS4Copy - PyUnicode_AsUTF16String=python38.PyUnicode_AsUTF16String - PyUnicode_AsUTF32String=python38.PyUnicode_AsUTF32String - PyUnicode_AsUTF8String=python38.PyUnicode_AsUTF8String - PyUnicode_AsUnicodeEscapeString=python38.PyUnicode_AsUnicodeEscapeString - PyUnicode_AsWideChar=python38.PyUnicode_AsWideChar - PyUnicode_AsWideCharString=python38.PyUnicode_AsWideCharString - PyUnicode_BuildEncodingMap=python38.PyUnicode_BuildEncodingMap - PyUnicode_ClearFreeList=python38.PyUnicode_ClearFreeList - PyUnicode_Compare=python38.PyUnicode_Compare - PyUnicode_CompareWithASCIIString=python38.PyUnicode_CompareWithASCIIString - PyUnicode_Concat=python38.PyUnicode_Concat - PyUnicode_Contains=python38.PyUnicode_Contains - PyUnicode_Count=python38.PyUnicode_Count - PyUnicode_Decode=python38.PyUnicode_Decode - PyUnicode_DecodeASCII=python38.PyUnicode_DecodeASCII - PyUnicode_DecodeCharmap=python38.PyUnicode_DecodeCharmap - PyUnicode_DecodeCodePageStateful=python38.PyUnicode_DecodeCodePageStateful - PyUnicode_DecodeFSDefault=python38.PyUnicode_DecodeFSDefault - PyUnicode_DecodeFSDefaultAndSize=python38.PyUnicode_DecodeFSDefaultAndSize - PyUnicode_DecodeLatin1=python38.PyUnicode_DecodeLatin1 - PyUnicode_DecodeLocale=python38.PyUnicode_DecodeLocale - PyUnicode_DecodeLocaleAndSize=python38.PyUnicode_DecodeLocaleAndSize - PyUnicode_DecodeMBCS=python38.PyUnicode_DecodeMBCS - PyUnicode_DecodeMBCSStateful=python38.PyUnicode_DecodeMBCSStateful - PyUnicode_DecodeRawUnicodeEscape=python38.PyUnicode_DecodeRawUnicodeEscape - PyUnicode_DecodeUTF16=python38.PyUnicode_DecodeUTF16 - PyUnicode_DecodeUTF16Stateful=python38.PyUnicode_DecodeUTF16Stateful - PyUnicode_DecodeUTF32=python38.PyUnicode_DecodeUTF32 - PyUnicode_DecodeUTF32Stateful=python38.PyUnicode_DecodeUTF32Stateful - PyUnicode_DecodeUTF7=python38.PyUnicode_DecodeUTF7 - PyUnicode_DecodeUTF7Stateful=python38.PyUnicode_DecodeUTF7Stateful - PyUnicode_DecodeUTF8=python38.PyUnicode_DecodeUTF8 - PyUnicode_DecodeUTF8Stateful=python38.PyUnicode_DecodeUTF8Stateful - PyUnicode_DecodeUnicodeEscape=python38.PyUnicode_DecodeUnicodeEscape - PyUnicode_EncodeCodePage=python38.PyUnicode_EncodeCodePage - PyUnicode_EncodeFSDefault=python38.PyUnicode_EncodeFSDefault - PyUnicode_EncodeLocale=python38.PyUnicode_EncodeLocale - PyUnicode_FSConverter=python38.PyUnicode_FSConverter - PyUnicode_FSDecoder=python38.PyUnicode_FSDecoder - PyUnicode_Find=python38.PyUnicode_Find - PyUnicode_FindChar=python38.PyUnicode_FindChar - PyUnicode_Format=python38.PyUnicode_Format - PyUnicode_FromEncodedObject=python38.PyUnicode_FromEncodedObject - PyUnicode_FromFormat=python38.PyUnicode_FromFormat - PyUnicode_FromFormatV=python38.PyUnicode_FromFormatV - PyUnicode_FromObject=python38.PyUnicode_FromObject - PyUnicode_FromOrdinal=python38.PyUnicode_FromOrdinal - PyUnicode_FromString=python38.PyUnicode_FromString - PyUnicode_FromStringAndSize=python38.PyUnicode_FromStringAndSize - PyUnicode_FromWideChar=python38.PyUnicode_FromWideChar - PyUnicode_GetDefaultEncoding=python38.PyUnicode_GetDefaultEncoding - PyUnicode_GetLength=python38.PyUnicode_GetLength - PyUnicode_GetSize=python38.PyUnicode_GetSize - PyUnicode_InternFromString=python38.PyUnicode_InternFromString - PyUnicode_InternImmortal=python38.PyUnicode_InternImmortal - PyUnicode_InternInPlace=python38.PyUnicode_InternInPlace - PyUnicode_IsIdentifier=python38.PyUnicode_IsIdentifier - PyUnicode_Join=python38.PyUnicode_Join - PyUnicode_Partition=python38.PyUnicode_Partition - PyUnicode_RPartition=python38.PyUnicode_RPartition - PyUnicode_RSplit=python38.PyUnicode_RSplit - PyUnicode_ReadChar=python38.PyUnicode_ReadChar - PyUnicode_Replace=python38.PyUnicode_Replace - PyUnicode_Resize=python38.PyUnicode_Resize - PyUnicode_RichCompare=python38.PyUnicode_RichCompare - PyUnicode_Split=python38.PyUnicode_Split - PyUnicode_Splitlines=python38.PyUnicode_Splitlines - PyUnicode_Substring=python38.PyUnicode_Substring - PyUnicode_Tailmatch=python38.PyUnicode_Tailmatch - PyUnicode_Translate=python38.PyUnicode_Translate - PyUnicode_Type=python38.PyUnicode_Type DATA - PyUnicode_WriteChar=python38.PyUnicode_WriteChar - PyWeakref_GetObject=python38.PyWeakref_GetObject - PyWeakref_NewProxy=python38.PyWeakref_NewProxy - PyWeakref_NewRef=python38.PyWeakref_NewRef - PyWrapperDescr_Type=python38.PyWrapperDescr_Type DATA - PyWrapper_New=python38.PyWrapper_New - PyZip_Type=python38.PyZip_Type DATA - Py_AddPendingCall=python38.Py_AddPendingCall - Py_AtExit=python38.Py_AtExit - Py_BuildValue=python38.Py_BuildValue - Py_CompileString=python38.Py_CompileString - Py_DecRef=python38.Py_DecRef - Py_DecodeLocale=python38.Py_DecodeLocale - Py_EncodeLocale=python38.Py_EncodeLocale - Py_EndInterpreter=python38.Py_EndInterpreter - Py_Exit=python38.Py_Exit - Py_FatalError=python38.Py_FatalError - Py_FileSystemDefaultEncodeErrors=python38.Py_FileSystemDefaultEncodeErrors DATA - Py_FileSystemDefaultEncoding=python38.Py_FileSystemDefaultEncoding DATA - Py_Finalize=python38.Py_Finalize - Py_FinalizeEx=python38.Py_FinalizeEx - Py_GetBuildInfo=python38.Py_GetBuildInfo - Py_GetCompiler=python38.Py_GetCompiler - Py_GetCopyright=python38.Py_GetCopyright - Py_GetExecPrefix=python38.Py_GetExecPrefix - Py_GetPath=python38.Py_GetPath - Py_GetPlatform=python38.Py_GetPlatform - Py_GetPrefix=python38.Py_GetPrefix - Py_GetProgramFullPath=python38.Py_GetProgramFullPath - Py_GetProgramName=python38.Py_GetProgramName - Py_GetPythonHome=python38.Py_GetPythonHome - Py_GetRecursionLimit=python38.Py_GetRecursionLimit - Py_GetVersion=python38.Py_GetVersion - Py_HasFileSystemDefaultEncoding=python38.Py_HasFileSystemDefaultEncoding DATA - Py_IncRef=python38.Py_IncRef - Py_Initialize=python38.Py_Initialize - Py_InitializeEx=python38.Py_InitializeEx - Py_IsInitialized=python38.Py_IsInitialized - Py_Main=python38.Py_Main - Py_MakePendingCalls=python38.Py_MakePendingCalls - Py_NewInterpreter=python38.Py_NewInterpreter - Py_ReprEnter=python38.Py_ReprEnter - Py_ReprLeave=python38.Py_ReprLeave - Py_SetPath=python38.Py_SetPath - Py_SetProgramName=python38.Py_SetProgramName - Py_SetPythonHome=python38.Py_SetPythonHome - Py_SetRecursionLimit=python38.Py_SetRecursionLimit - Py_SymtableString=python38.Py_SymtableString - Py_UTF8Mode=python38.Py_UTF8Mode DATA - Py_VaBuildValue=python38.Py_VaBuildValue - _PyArg_ParseTupleAndKeywords_SizeT=python38._PyArg_ParseTupleAndKeywords_SizeT - _PyArg_ParseTuple_SizeT=python38._PyArg_ParseTuple_SizeT - _PyArg_Parse_SizeT=python38._PyArg_Parse_SizeT - _PyArg_VaParseTupleAndKeywords_SizeT=python38._PyArg_VaParseTupleAndKeywords_SizeT - _PyArg_VaParse_SizeT=python38._PyArg_VaParse_SizeT - _PyErr_BadInternalCall=python38._PyErr_BadInternalCall - _PyObject_CallFunction_SizeT=python38._PyObject_CallFunction_SizeT - _PyObject_CallMethod_SizeT=python38._PyObject_CallMethod_SizeT - _PyObject_GC_Malloc=python38._PyObject_GC_Malloc - _PyObject_GC_New=python38._PyObject_GC_New - _PyObject_GC_NewVar=python38._PyObject_GC_NewVar - _PyObject_GC_Resize=python38._PyObject_GC_Resize - _PyObject_New=python38._PyObject_New - _PyObject_NewVar=python38._PyObject_NewVar - _PyState_AddModule=python38._PyState_AddModule - _PyThreadState_Init=python38._PyThreadState_Init - _PyThreadState_Prealloc=python38._PyThreadState_Prealloc - _PyTrash_delete_later=python38._PyTrash_delete_later DATA - _PyTrash_delete_nesting=python38._PyTrash_delete_nesting DATA - _PyTrash_deposit_object=python38._PyTrash_deposit_object - _PyTrash_destroy_chain=python38._PyTrash_destroy_chain - _PyTrash_thread_deposit_object=python38._PyTrash_thread_deposit_object - _PyTrash_thread_destroy_chain=python38._PyTrash_thread_destroy_chain - _PyWeakref_CallableProxyType=python38._PyWeakref_CallableProxyType DATA - _PyWeakref_ProxyType=python38._PyWeakref_ProxyType DATA - _PyWeakref_RefType=python38._PyWeakref_RefType DATA - _Py_BuildValue_SizeT=python38._Py_BuildValue_SizeT - _Py_CheckRecursionLimit=python38._Py_CheckRecursionLimit DATA - _Py_CheckRecursiveCall=python38._Py_CheckRecursiveCall - _Py_Dealloc=python38._Py_Dealloc - _Py_EllipsisObject=python38._Py_EllipsisObject DATA - _Py_FalseStruct=python38._Py_FalseStruct DATA - _Py_NoneStruct=python38._Py_NoneStruct DATA - _Py_NotImplementedStruct=python38._Py_NotImplementedStruct DATA - _Py_SwappedOp=python38._Py_SwappedOp DATA - _Py_TrueStruct=python38._Py_TrueStruct DATA - _Py_VaBuildValue_SizeT=python38._Py_VaBuildValue_SizeT + PyArg_Parse=python39.PyArg_Parse + PyArg_ParseTuple=python39.PyArg_ParseTuple + PyArg_ParseTupleAndKeywords=python39.PyArg_ParseTupleAndKeywords + PyArg_UnpackTuple=python39.PyArg_UnpackTuple + PyArg_VaParse=python39.PyArg_VaParse + PyArg_VaParseTupleAndKeywords=python39.PyArg_VaParseTupleAndKeywords + PyArg_ValidateKeywordArguments=python39.PyArg_ValidateKeywordArguments + PyBaseObject_Type=python39.PyBaseObject_Type DATA + PyBool_FromLong=python39.PyBool_FromLong + PyBool_Type=python39.PyBool_Type DATA + PyByteArrayIter_Type=python39.PyByteArrayIter_Type DATA + PyByteArray_AsString=python39.PyByteArray_AsString + PyByteArray_Concat=python39.PyByteArray_Concat + PyByteArray_FromObject=python39.PyByteArray_FromObject + PyByteArray_FromStringAndSize=python39.PyByteArray_FromStringAndSize + PyByteArray_Resize=python39.PyByteArray_Resize + PyByteArray_Size=python39.PyByteArray_Size + PyByteArray_Type=python39.PyByteArray_Type DATA + PyBytesIter_Type=python39.PyBytesIter_Type DATA + PyBytes_AsString=python39.PyBytes_AsString + PyBytes_AsStringAndSize=python39.PyBytes_AsStringAndSize + PyBytes_Concat=python39.PyBytes_Concat + PyBytes_ConcatAndDel=python39.PyBytes_ConcatAndDel + PyBytes_DecodeEscape=python39.PyBytes_DecodeEscape + PyBytes_FromFormat=python39.PyBytes_FromFormat + PyBytes_FromFormatV=python39.PyBytes_FromFormatV + PyBytes_FromObject=python39.PyBytes_FromObject + PyBytes_FromString=python39.PyBytes_FromString + PyBytes_FromStringAndSize=python39.PyBytes_FromStringAndSize + PyBytes_Repr=python39.PyBytes_Repr + PyBytes_Size=python39.PyBytes_Size + PyBytes_Type=python39.PyBytes_Type DATA + PyCFunction_Call=python39.PyCFunction_Call + PyCFunction_GetFlags=python39.PyCFunction_GetFlags + PyCFunction_GetFunction=python39.PyCFunction_GetFunction + PyCFunction_GetSelf=python39.PyCFunction_GetSelf + PyCFunction_New=python39.PyCFunction_New + PyCFunction_NewEx=python39.PyCFunction_NewEx + PyCMethod_New=python39.PyCMethod_New + PyCFunction_Type=python39.PyCFunction_Type DATA + PyCallIter_New=python39.PyCallIter_New + PyCallIter_Type=python39.PyCallIter_Type DATA + PyCallable_Check=python39.PyCallable_Check + PyCapsule_GetContext=python39.PyCapsule_GetContext + PyCapsule_GetDestructor=python39.PyCapsule_GetDestructor + PyCapsule_GetName=python39.PyCapsule_GetName + PyCapsule_GetPointer=python39.PyCapsule_GetPointer + PyCapsule_Import=python39.PyCapsule_Import + PyCapsule_IsValid=python39.PyCapsule_IsValid + PyCapsule_New=python39.PyCapsule_New + PyCapsule_SetContext=python39.PyCapsule_SetContext + PyCapsule_SetDestructor=python39.PyCapsule_SetDestructor + PyCapsule_SetName=python39.PyCapsule_SetName + PyCapsule_SetPointer=python39.PyCapsule_SetPointer + PyCapsule_Type=python39.PyCapsule_Type DATA + PyClassMethodDescr_Type=python39.PyClassMethodDescr_Type DATA + PyCodec_BackslashReplaceErrors=python39.PyCodec_BackslashReplaceErrors + PyCodec_Decode=python39.PyCodec_Decode + PyCodec_Decoder=python39.PyCodec_Decoder + PyCodec_Encode=python39.PyCodec_Encode + PyCodec_Encoder=python39.PyCodec_Encoder + PyCodec_IgnoreErrors=python39.PyCodec_IgnoreErrors + PyCodec_IncrementalDecoder=python39.PyCodec_IncrementalDecoder + PyCodec_IncrementalEncoder=python39.PyCodec_IncrementalEncoder + PyCodec_KnownEncoding=python39.PyCodec_KnownEncoding + PyCodec_LookupError=python39.PyCodec_LookupError + PyCodec_NameReplaceErrors=python39.PyCodec_NameReplaceErrors + PyCodec_Register=python39.PyCodec_Register + PyCodec_RegisterError=python39.PyCodec_RegisterError + PyCodec_ReplaceErrors=python39.PyCodec_ReplaceErrors + PyCodec_StreamReader=python39.PyCodec_StreamReader + PyCodec_StreamWriter=python39.PyCodec_StreamWriter + PyCodec_StrictErrors=python39.PyCodec_StrictErrors + PyCodec_XMLCharRefReplaceErrors=python39.PyCodec_XMLCharRefReplaceErrors + PyComplex_FromDoubles=python39.PyComplex_FromDoubles + PyComplex_ImagAsDouble=python39.PyComplex_ImagAsDouble + PyComplex_RealAsDouble=python39.PyComplex_RealAsDouble + PyComplex_Type=python39.PyComplex_Type DATA + PyDescr_NewClassMethod=python39.PyDescr_NewClassMethod + PyDescr_NewGetSet=python39.PyDescr_NewGetSet + PyDescr_NewMember=python39.PyDescr_NewMember + PyDescr_NewMethod=python39.PyDescr_NewMethod + PyDictItems_Type=python39.PyDictItems_Type DATA + PyDictIterItem_Type=python39.PyDictIterItem_Type DATA + PyDictIterKey_Type=python39.PyDictIterKey_Type DATA + PyDictIterValue_Type=python39.PyDictIterValue_Type DATA + PyDictKeys_Type=python39.PyDictKeys_Type DATA + PyDictProxy_New=python39.PyDictProxy_New + PyDictProxy_Type=python39.PyDictProxy_Type DATA + PyDictValues_Type=python39.PyDictValues_Type DATA + PyDict_Clear=python39.PyDict_Clear + PyDict_Contains=python39.PyDict_Contains + PyDict_Copy=python39.PyDict_Copy + PyDict_DelItem=python39.PyDict_DelItem + PyDict_DelItemString=python39.PyDict_DelItemString + PyDict_GetItem=python39.PyDict_GetItem + PyDict_GetItemString=python39.PyDict_GetItemString + PyDict_GetItemWithError=python39.PyDict_GetItemWithError + PyDict_Items=python39.PyDict_Items + PyDict_Keys=python39.PyDict_Keys + PyDict_Merge=python39.PyDict_Merge + PyDict_MergeFromSeq2=python39.PyDict_MergeFromSeq2 + PyDict_New=python39.PyDict_New + PyDict_Next=python39.PyDict_Next + PyDict_SetItem=python39.PyDict_SetItem + PyDict_SetItemString=python39.PyDict_SetItemString + PyDict_Size=python39.PyDict_Size + PyDict_Type=python39.PyDict_Type DATA + PyDict_Update=python39.PyDict_Update + PyDict_Values=python39.PyDict_Values + PyEllipsis_Type=python39.PyEllipsis_Type DATA + PyEnum_Type=python39.PyEnum_Type DATA + PyErr_BadArgument=python39.PyErr_BadArgument + PyErr_BadInternalCall=python39.PyErr_BadInternalCall + PyErr_CheckSignals=python39.PyErr_CheckSignals + PyErr_Clear=python39.PyErr_Clear + PyErr_Display=python39.PyErr_Display + PyErr_ExceptionMatches=python39.PyErr_ExceptionMatches + PyErr_Fetch=python39.PyErr_Fetch + PyErr_Format=python39.PyErr_Format + PyErr_FormatV=python39.PyErr_FormatV + PyErr_GetExcInfo=python39.PyErr_GetExcInfo + PyErr_GivenExceptionMatches=python39.PyErr_GivenExceptionMatches + PyErr_NewException=python39.PyErr_NewException + PyErr_NewExceptionWithDoc=python39.PyErr_NewExceptionWithDoc + PyErr_NoMemory=python39.PyErr_NoMemory + PyErr_NormalizeException=python39.PyErr_NormalizeException + PyErr_Occurred=python39.PyErr_Occurred + PyErr_Print=python39.PyErr_Print + PyErr_PrintEx=python39.PyErr_PrintEx + PyErr_ProgramText=python39.PyErr_ProgramText + PyErr_ResourceWarning=python39.PyErr_ResourceWarning + PyErr_Restore=python39.PyErr_Restore + PyErr_SetExcFromWindowsErr=python39.PyErr_SetExcFromWindowsErr + PyErr_SetExcFromWindowsErrWithFilename=python39.PyErr_SetExcFromWindowsErrWithFilename + PyErr_SetExcFromWindowsErrWithFilenameObject=python39.PyErr_SetExcFromWindowsErrWithFilenameObject + PyErr_SetExcFromWindowsErrWithFilenameObjects=python39.PyErr_SetExcFromWindowsErrWithFilenameObjects + PyErr_SetExcInfo=python39.PyErr_SetExcInfo + PyErr_SetFromErrno=python39.PyErr_SetFromErrno + PyErr_SetFromErrnoWithFilename=python39.PyErr_SetFromErrnoWithFilename + PyErr_SetFromErrnoWithFilenameObject=python39.PyErr_SetFromErrnoWithFilenameObject + PyErr_SetFromErrnoWithFilenameObjects=python39.PyErr_SetFromErrnoWithFilenameObjects + PyErr_SetFromWindowsErr=python39.PyErr_SetFromWindowsErr + PyErr_SetFromWindowsErrWithFilename=python39.PyErr_SetFromWindowsErrWithFilename + PyErr_SetImportError=python39.PyErr_SetImportError + PyErr_SetImportErrorSubclass=python39.PyErr_SetImportErrorSubclass + PyErr_SetInterrupt=python39.PyErr_SetInterrupt + PyErr_SetNone=python39.PyErr_SetNone + PyErr_SetObject=python39.PyErr_SetObject + PyErr_SetString=python39.PyErr_SetString + PyErr_SyntaxLocation=python39.PyErr_SyntaxLocation + PyErr_SyntaxLocationEx=python39.PyErr_SyntaxLocationEx + PyErr_WarnEx=python39.PyErr_WarnEx + PyErr_WarnExplicit=python39.PyErr_WarnExplicit + PyErr_WarnFormat=python39.PyErr_WarnFormat + PyErr_WriteUnraisable=python39.PyErr_WriteUnraisable + PyEval_AcquireLock=python39.PyEval_AcquireLock + PyEval_AcquireThread=python39.PyEval_AcquireThread + PyEval_CallFunction=python39.PyEval_CallFunction + PyEval_CallMethod=python39.PyEval_CallMethod + PyEval_CallObjectWithKeywords=python39.PyEval_CallObjectWithKeywords + PyEval_EvalCode=python39.PyEval_EvalCode + PyEval_EvalCodeEx=python39.PyEval_EvalCodeEx + PyEval_EvalFrame=python39.PyEval_EvalFrame + PyEval_EvalFrameEx=python39.PyEval_EvalFrameEx + PyEval_GetBuiltins=python39.PyEval_GetBuiltins + PyEval_GetCallStats=python39.PyEval_GetCallStats + PyEval_GetFrame=python39.PyEval_GetFrame + PyEval_GetFuncDesc=python39.PyEval_GetFuncDesc + PyEval_GetFuncName=python39.PyEval_GetFuncName + PyEval_GetGlobals=python39.PyEval_GetGlobals + PyEval_GetLocals=python39.PyEval_GetLocals + PyEval_InitThreads=python39.PyEval_InitThreads + PyEval_ReInitThreads=python39.PyEval_ReInitThreads + PyEval_ReleaseLock=python39.PyEval_ReleaseLock + PyEval_ReleaseThread=python39.PyEval_ReleaseThread + PyEval_RestoreThread=python39.PyEval_RestoreThread + PyEval_SaveThread=python39.PyEval_SaveThread + PyEval_ThreadsInitialized=python39.PyEval_ThreadsInitialized + PyExc_ArithmeticError=python39.PyExc_ArithmeticError DATA + PyExc_AssertionError=python39.PyExc_AssertionError DATA + PyExc_AttributeError=python39.PyExc_AttributeError DATA + PyExc_BaseException=python39.PyExc_BaseException DATA + PyExc_BlockingIOError=python39.PyExc_BlockingIOError DATA + PyExc_BrokenPipeError=python39.PyExc_BrokenPipeError DATA + PyExc_BufferError=python39.PyExc_BufferError DATA + PyExc_BytesWarning=python39.PyExc_BytesWarning DATA + PyExc_ChildProcessError=python39.PyExc_ChildProcessError DATA + PyExc_ConnectionAbortedError=python39.PyExc_ConnectionAbortedError DATA + PyExc_ConnectionError=python39.PyExc_ConnectionError DATA + PyExc_ConnectionRefusedError=python39.PyExc_ConnectionRefusedError DATA + PyExc_ConnectionResetError=python39.PyExc_ConnectionResetError DATA + PyExc_DeprecationWarning=python39.PyExc_DeprecationWarning DATA + PyExc_EOFError=python39.PyExc_EOFError DATA + PyExc_EnvironmentError=python39.PyExc_EnvironmentError DATA + PyExc_Exception=python39.PyExc_Exception DATA + PyExc_FileExistsError=python39.PyExc_FileExistsError DATA + PyExc_FileNotFoundError=python39.PyExc_FileNotFoundError DATA + PyExc_FloatingPointError=python39.PyExc_FloatingPointError DATA + PyExc_FutureWarning=python39.PyExc_FutureWarning DATA + PyExc_GeneratorExit=python39.PyExc_GeneratorExit DATA + PyExc_IOError=python39.PyExc_IOError DATA + PyExc_ImportError=python39.PyExc_ImportError DATA + PyExc_ImportWarning=python39.PyExc_ImportWarning DATA + PyExc_IndentationError=python39.PyExc_IndentationError DATA + PyExc_IndexError=python39.PyExc_IndexError DATA + PyExc_InterruptedError=python39.PyExc_InterruptedError DATA + PyExc_IsADirectoryError=python39.PyExc_IsADirectoryError DATA + PyExc_KeyError=python39.PyExc_KeyError DATA + PyExc_KeyboardInterrupt=python39.PyExc_KeyboardInterrupt DATA + PyExc_LookupError=python39.PyExc_LookupError DATA + PyExc_MemoryError=python39.PyExc_MemoryError DATA + PyExc_ModuleNotFoundError=python39.PyExc_ModuleNotFoundError DATA + PyExc_NameError=python39.PyExc_NameError DATA + PyExc_NotADirectoryError=python39.PyExc_NotADirectoryError DATA + PyExc_NotImplementedError=python39.PyExc_NotImplementedError DATA + PyExc_OSError=python39.PyExc_OSError DATA + PyExc_OverflowError=python39.PyExc_OverflowError DATA + PyExc_PendingDeprecationWarning=python39.PyExc_PendingDeprecationWarning DATA + PyExc_PermissionError=python39.PyExc_PermissionError DATA + PyExc_ProcessLookupError=python39.PyExc_ProcessLookupError DATA + PyExc_RecursionError=python39.PyExc_RecursionError DATA + PyExc_ReferenceError=python39.PyExc_ReferenceError DATA + PyExc_ResourceWarning=python39.PyExc_ResourceWarning DATA + PyExc_RuntimeError=python39.PyExc_RuntimeError DATA + PyExc_RuntimeWarning=python39.PyExc_RuntimeWarning DATA + PyExc_StopAsyncIteration=python39.PyExc_StopAsyncIteration DATA + PyExc_StopIteration=python39.PyExc_StopIteration DATA + PyExc_SyntaxError=python39.PyExc_SyntaxError DATA + PyExc_SyntaxWarning=python39.PyExc_SyntaxWarning DATA + PyExc_SystemError=python39.PyExc_SystemError DATA + PyExc_SystemExit=python39.PyExc_SystemExit DATA + PyExc_TabError=python39.PyExc_TabError DATA + PyExc_TimeoutError=python39.PyExc_TimeoutError DATA + PyExc_TypeError=python39.PyExc_TypeError DATA + PyExc_UnboundLocalError=python39.PyExc_UnboundLocalError DATA + PyExc_UnicodeDecodeError=python39.PyExc_UnicodeDecodeError DATA + PyExc_UnicodeEncodeError=python39.PyExc_UnicodeEncodeError DATA + PyExc_UnicodeError=python39.PyExc_UnicodeError DATA + PyExc_UnicodeTranslateError=python39.PyExc_UnicodeTranslateError DATA + PyExc_UnicodeWarning=python39.PyExc_UnicodeWarning DATA + PyExc_UserWarning=python39.PyExc_UserWarning DATA + PyExc_ValueError=python39.PyExc_ValueError DATA + PyExc_Warning=python39.PyExc_Warning DATA + PyExc_WindowsError=python39.PyExc_WindowsError DATA + PyExc_ZeroDivisionError=python39.PyExc_ZeroDivisionError DATA + PyExceptionClass_Name=python39.PyExceptionClass_Name + PyException_GetCause=python39.PyException_GetCause + PyException_GetContext=python39.PyException_GetContext + PyException_GetTraceback=python39.PyException_GetTraceback + PyException_SetCause=python39.PyException_SetCause + PyException_SetContext=python39.PyException_SetContext + PyException_SetTraceback=python39.PyException_SetTraceback + PyFile_FromFd=python39.PyFile_FromFd + PyFile_GetLine=python39.PyFile_GetLine + PyFile_WriteObject=python39.PyFile_WriteObject + PyFile_WriteString=python39.PyFile_WriteString + PyFilter_Type=python39.PyFilter_Type DATA + PyFloat_AsDouble=python39.PyFloat_AsDouble + PyFloat_FromDouble=python39.PyFloat_FromDouble + PyFloat_FromString=python39.PyFloat_FromString + PyFloat_GetInfo=python39.PyFloat_GetInfo + PyFloat_GetMax=python39.PyFloat_GetMax + PyFloat_GetMin=python39.PyFloat_GetMin + PyFloat_Type=python39.PyFloat_Type DATA + PyFrame_GetCode=python39.PyFrame_GetCode + PyFrame_GetLineNumber=python39.PyFrame_GetLineNumber + PyFrozenSet_New=python39.PyFrozenSet_New + PyFrozenSet_Type=python39.PyFrozenSet_Type DATA + PyGC_Collect=python39.PyGC_Collect + PyGILState_Ensure=python39.PyGILState_Ensure + PyGILState_GetThisThreadState=python39.PyGILState_GetThisThreadState + PyGILState_Release=python39.PyGILState_Release + PyGetSetDescr_Type=python39.PyGetSetDescr_Type DATA + PyImport_AddModule=python39.PyImport_AddModule + PyImport_AddModuleObject=python39.PyImport_AddModuleObject + PyImport_AppendInittab=python39.PyImport_AppendInittab + PyImport_Cleanup=python39.PyImport_Cleanup + PyImport_ExecCodeModule=python39.PyImport_ExecCodeModule + PyImport_ExecCodeModuleEx=python39.PyImport_ExecCodeModuleEx + PyImport_ExecCodeModuleObject=python39.PyImport_ExecCodeModuleObject + PyImport_ExecCodeModuleWithPathnames=python39.PyImport_ExecCodeModuleWithPathnames + PyImport_GetImporter=python39.PyImport_GetImporter + PyImport_GetMagicNumber=python39.PyImport_GetMagicNumber + PyImport_GetMagicTag=python39.PyImport_GetMagicTag + PyImport_GetModule=python39.PyImport_GetModule + PyImport_GetModuleDict=python39.PyImport_GetModuleDict + PyImport_Import=python39.PyImport_Import + PyImport_ImportFrozenModule=python39.PyImport_ImportFrozenModule + PyImport_ImportFrozenModuleObject=python39.PyImport_ImportFrozenModuleObject + PyImport_ImportModule=python39.PyImport_ImportModule + PyImport_ImportModuleLevel=python39.PyImport_ImportModuleLevel + PyImport_ImportModuleLevelObject=python39.PyImport_ImportModuleLevelObject + PyImport_ImportModuleNoBlock=python39.PyImport_ImportModuleNoBlock + PyImport_ReloadModule=python39.PyImport_ReloadModule + PyIndex_Check=python39.PyIndex_Check + PyInterpreterState_Clear=python39.PyInterpreterState_Clear + PyInterpreterState_Delete=python39.PyInterpreterState_Delete + PyInterpreterState_New=python39.PyInterpreterState_New + PyIter_Check=python39.PyIter_Check + PyIter_Next=python39.PyIter_Next + PyListIter_Type=python39.PyListIter_Type DATA + PyListRevIter_Type=python39.PyListRevIter_Type DATA + PyList_Append=python39.PyList_Append + PyList_AsTuple=python39.PyList_AsTuple + PyList_GetItem=python39.PyList_GetItem + PyList_GetSlice=python39.PyList_GetSlice + PyList_Insert=python39.PyList_Insert + PyList_New=python39.PyList_New + PyList_Reverse=python39.PyList_Reverse + PyList_SetItem=python39.PyList_SetItem + PyList_SetSlice=python39.PyList_SetSlice + PyList_Size=python39.PyList_Size + PyList_Sort=python39.PyList_Sort + PyList_Type=python39.PyList_Type DATA + PyLongRangeIter_Type=python39.PyLongRangeIter_Type DATA + PyLong_AsDouble=python39.PyLong_AsDouble + PyLong_AsLong=python39.PyLong_AsLong + PyLong_AsLongAndOverflow=python39.PyLong_AsLongAndOverflow + PyLong_AsLongLong=python39.PyLong_AsLongLong + PyLong_AsLongLongAndOverflow=python39.PyLong_AsLongLongAndOverflow + PyLong_AsSize_t=python39.PyLong_AsSize_t + PyLong_AsSsize_t=python39.PyLong_AsSsize_t + PyLong_AsUnsignedLong=python39.PyLong_AsUnsignedLong + PyLong_AsUnsignedLongLong=python39.PyLong_AsUnsignedLongLong + PyLong_AsUnsignedLongLongMask=python39.PyLong_AsUnsignedLongLongMask + PyLong_AsUnsignedLongMask=python39.PyLong_AsUnsignedLongMask + PyLong_AsVoidPtr=python39.PyLong_AsVoidPtr + PyLong_FromDouble=python39.PyLong_FromDouble + PyLong_FromLong=python39.PyLong_FromLong + PyLong_FromLongLong=python39.PyLong_FromLongLong + PyLong_FromSize_t=python39.PyLong_FromSize_t + PyLong_FromSsize_t=python39.PyLong_FromSsize_t + PyLong_FromString=python39.PyLong_FromString + PyLong_FromUnsignedLong=python39.PyLong_FromUnsignedLong + PyLong_FromUnsignedLongLong=python39.PyLong_FromUnsignedLongLong + PyLong_FromVoidPtr=python39.PyLong_FromVoidPtr + PyLong_GetInfo=python39.PyLong_GetInfo + PyLong_Type=python39.PyLong_Type DATA + PyMap_Type=python39.PyMap_Type DATA + PyMapping_Check=python39.PyMapping_Check + PyMapping_GetItemString=python39.PyMapping_GetItemString + PyMapping_HasKey=python39.PyMapping_HasKey + PyMapping_HasKeyString=python39.PyMapping_HasKeyString + PyMapping_Items=python39.PyMapping_Items + PyMapping_Keys=python39.PyMapping_Keys + PyMapping_Length=python39.PyMapping_Length + PyMapping_SetItemString=python39.PyMapping_SetItemString + PyMapping_Size=python39.PyMapping_Size + PyMapping_Values=python39.PyMapping_Values + PyMem_Calloc=python39.PyMem_Calloc + PyMem_Free=python39.PyMem_Free + PyMem_Malloc=python39.PyMem_Malloc + PyMem_Realloc=python39.PyMem_Realloc + PyMemberDescr_Type=python39.PyMemberDescr_Type DATA + PyMemoryView_FromMemory=python39.PyMemoryView_FromMemory + PyMemoryView_FromObject=python39.PyMemoryView_FromObject + PyMemoryView_GetContiguous=python39.PyMemoryView_GetContiguous + PyMemoryView_Type=python39.PyMemoryView_Type DATA + PyMethodDescr_Type=python39.PyMethodDescr_Type DATA + PyModuleDef_Init=python39.PyModuleDef_Init + PyModuleDef_Type=python39.PyModuleDef_Type DATA + PyModule_AddFunctions=python39.PyModule_AddFunctions + PyModule_AddIntConstant=python39.PyModule_AddIntConstant + PyModule_AddObject=python39.PyModule_AddObject + PyModule_AddStringConstant=python39.PyModule_AddStringConstant + PyModule_Create2=python39.PyModule_Create2 + PyModule_ExecDef=python39.PyModule_ExecDef + PyModule_FromDefAndSpec2=python39.PyModule_FromDefAndSpec2 + PyModule_GetDef=python39.PyModule_GetDef + PyModule_GetDict=python39.PyModule_GetDict + PyModule_GetFilename=python39.PyModule_GetFilename + PyModule_GetFilenameObject=python39.PyModule_GetFilenameObject + PyModule_GetName=python39.PyModule_GetName + PyModule_GetNameObject=python39.PyModule_GetNameObject + PyModule_GetState=python39.PyModule_GetState + PyModule_New=python39.PyModule_New + PyModule_NewObject=python39.PyModule_NewObject + PyModule_SetDocString=python39.PyModule_SetDocString + PyModule_Type=python39.PyModule_Type DATA + PyNullImporter_Type=python39.PyNullImporter_Type DATA + PyNumber_Absolute=python39.PyNumber_Absolute + PyNumber_Add=python39.PyNumber_Add + PyNumber_And=python39.PyNumber_And + PyNumber_AsSsize_t=python39.PyNumber_AsSsize_t + PyNumber_Check=python39.PyNumber_Check + PyNumber_Divmod=python39.PyNumber_Divmod + PyNumber_Float=python39.PyNumber_Float + PyNumber_FloorDivide=python39.PyNumber_FloorDivide + PyNumber_InPlaceAdd=python39.PyNumber_InPlaceAdd + PyNumber_InPlaceAnd=python39.PyNumber_InPlaceAnd + PyNumber_InPlaceFloorDivide=python39.PyNumber_InPlaceFloorDivide + PyNumber_InPlaceLshift=python39.PyNumber_InPlaceLshift + PyNumber_InPlaceMatrixMultiply=python39.PyNumber_InPlaceMatrixMultiply + PyNumber_InPlaceMultiply=python39.PyNumber_InPlaceMultiply + PyNumber_InPlaceOr=python39.PyNumber_InPlaceOr + PyNumber_InPlacePower=python39.PyNumber_InPlacePower + PyNumber_InPlaceRemainder=python39.PyNumber_InPlaceRemainder + PyNumber_InPlaceRshift=python39.PyNumber_InPlaceRshift + PyNumber_InPlaceSubtract=python39.PyNumber_InPlaceSubtract + PyNumber_InPlaceTrueDivide=python39.PyNumber_InPlaceTrueDivide + PyNumber_InPlaceXor=python39.PyNumber_InPlaceXor + PyNumber_Index=python39.PyNumber_Index + PyNumber_Invert=python39.PyNumber_Invert + PyNumber_Long=python39.PyNumber_Long + PyNumber_Lshift=python39.PyNumber_Lshift + PyNumber_MatrixMultiply=python39.PyNumber_MatrixMultiply + PyNumber_Multiply=python39.PyNumber_Multiply + PyNumber_Negative=python39.PyNumber_Negative + PyNumber_Or=python39.PyNumber_Or + PyNumber_Positive=python39.PyNumber_Positive + PyNumber_Power=python39.PyNumber_Power + PyNumber_Remainder=python39.PyNumber_Remainder + PyNumber_Rshift=python39.PyNumber_Rshift + PyNumber_Subtract=python39.PyNumber_Subtract + PyNumber_ToBase=python39.PyNumber_ToBase + PyNumber_TrueDivide=python39.PyNumber_TrueDivide + PyNumber_Xor=python39.PyNumber_Xor + PyODictItems_Type=python39.PyODictItems_Type DATA + PyODictIter_Type=python39.PyODictIter_Type DATA + PyODictKeys_Type=python39.PyODictKeys_Type DATA + PyODictValues_Type=python39.PyODictValues_Type DATA + PyODict_DelItem=python39.PyODict_DelItem + PyODict_New=python39.PyODict_New + PyODict_SetItem=python39.PyODict_SetItem + PyODict_Type=python39.PyODict_Type DATA + PyOS_AfterFork=python39.PyOS_AfterFork + PyOS_CheckStack=python39.PyOS_CheckStack + PyOS_FSPath=python39.PyOS_FSPath + PyOS_InitInterrupts=python39.PyOS_InitInterrupts + PyOS_InputHook=python39.PyOS_InputHook DATA + PyOS_InterruptOccurred=python39.PyOS_InterruptOccurred + PyOS_ReadlineFunctionPointer=python39.PyOS_ReadlineFunctionPointer DATA + PyOS_double_to_string=python39.PyOS_double_to_string + PyOS_getsig=python39.PyOS_getsig + PyOS_mystricmp=python39.PyOS_mystricmp + PyOS_mystrnicmp=python39.PyOS_mystrnicmp + PyOS_setsig=python39.PyOS_setsig + PyOS_snprintf=python39.PyOS_snprintf + PyOS_string_to_double=python39.PyOS_string_to_double + PyOS_strtol=python39.PyOS_strtol + PyOS_strtoul=python39.PyOS_strtoul + PyOS_vsnprintf=python39.PyOS_vsnprintf + PyObject_ASCII=python39.PyObject_ASCII + PyObject_AsCharBuffer=python39.PyObject_AsCharBuffer + PyObject_AsFileDescriptor=python39.PyObject_AsFileDescriptor + PyObject_AsReadBuffer=python39.PyObject_AsReadBuffer + PyObject_AsWriteBuffer=python39.PyObject_AsWriteBuffer + PyObject_Bytes=python39.PyObject_Bytes + PyObject_Call=python39.PyObject_Call + PyObject_CallFunction=python39.PyObject_CallFunction + PyObject_CallFunctionObjArgs=python39.PyObject_CallFunctionObjArgs + PyObject_CallMethod=python39.PyObject_CallMethod + PyObject_CallMethodObjArgs=python39.PyObject_CallMethodObjArgs + PyObject_CallNoArgs=python39.PyObject_CallNoArgs + PyObject_CallObject=python39.PyObject_CallObject + PyObject_Calloc=python39.PyObject_Calloc + PyObject_CheckReadBuffer=python39.PyObject_CheckReadBuffer + PyObject_ClearWeakRefs=python39.PyObject_ClearWeakRefs + PyObject_DelItem=python39.PyObject_DelItem + PyObject_DelItemString=python39.PyObject_DelItemString + PyObject_Dir=python39.PyObject_Dir + PyObject_Format=python39.PyObject_Format + PyObject_Free=python39.PyObject_Free + PyObject_GC_Del=python39.PyObject_GC_Del + PyObject_GC_Track=python39.PyObject_GC_Track + PyObject_GC_UnTrack=python39.PyObject_GC_UnTrack + PyObject_GenericGetAttr=python39.PyObject_GenericGetAttr + PyObject_GenericSetAttr=python39.PyObject_GenericSetAttr + PyObject_GenericSetDict=python39.PyObject_GenericSetDict + PyObject_GetAttr=python39.PyObject_GetAttr + PyObject_GetAttrString=python39.PyObject_GetAttrString + PyObject_GetItem=python39.PyObject_GetItem + PyObject_GetIter=python39.PyObject_GetIter + PyObject_HasAttr=python39.PyObject_HasAttr + PyObject_HasAttrString=python39.PyObject_HasAttrString + PyObject_Hash=python39.PyObject_Hash + PyObject_HashNotImplemented=python39.PyObject_HashNotImplemented + PyObject_Init=python39.PyObject_Init + PyObject_InitVar=python39.PyObject_InitVar + PyObject_IsInstance=python39.PyObject_IsInstance + PyObject_IsSubclass=python39.PyObject_IsSubclass + PyObject_IsTrue=python39.PyObject_IsTrue + PyObject_Length=python39.PyObject_Length + PyObject_Malloc=python39.PyObject_Malloc + PyObject_Not=python39.PyObject_Not + PyObject_Realloc=python39.PyObject_Realloc + PyObject_Repr=python39.PyObject_Repr + PyObject_RichCompare=python39.PyObject_RichCompare + PyObject_RichCompareBool=python39.PyObject_RichCompareBool + PyObject_SelfIter=python39.PyObject_SelfIter + PyObject_SetAttr=python39.PyObject_SetAttr + PyObject_SetAttrString=python39.PyObject_SetAttrString + PyObject_SetItem=python39.PyObject_SetItem + PyObject_Size=python39.PyObject_Size + PyObject_Str=python39.PyObject_Str + PyObject_Type=python39.PyObject_Type + PyParser_SimpleParseFileFlags=python39.PyParser_SimpleParseFileFlags + PyParser_SimpleParseStringFlags=python39.PyParser_SimpleParseStringFlags + PyParser_SimpleParseStringFlagsFilename=python39.PyParser_SimpleParseStringFlagsFilename + PyProperty_Type=python39.PyProperty_Type DATA + PyRangeIter_Type=python39.PyRangeIter_Type DATA + PyRange_Type=python39.PyRange_Type DATA + PyReversed_Type=python39.PyReversed_Type DATA + PySeqIter_New=python39.PySeqIter_New + PySeqIter_Type=python39.PySeqIter_Type DATA + PySequence_Check=python39.PySequence_Check + PySequence_Concat=python39.PySequence_Concat + PySequence_Contains=python39.PySequence_Contains + PySequence_Count=python39.PySequence_Count + PySequence_DelItem=python39.PySequence_DelItem + PySequence_DelSlice=python39.PySequence_DelSlice + PySequence_Fast=python39.PySequence_Fast + PySequence_GetItem=python39.PySequence_GetItem + PySequence_GetSlice=python39.PySequence_GetSlice + PySequence_In=python39.PySequence_In + PySequence_InPlaceConcat=python39.PySequence_InPlaceConcat + PySequence_InPlaceRepeat=python39.PySequence_InPlaceRepeat + PySequence_Index=python39.PySequence_Index + PySequence_Length=python39.PySequence_Length + PySequence_List=python39.PySequence_List + PySequence_Repeat=python39.PySequence_Repeat + PySequence_SetItem=python39.PySequence_SetItem + PySequence_SetSlice=python39.PySequence_SetSlice + PySequence_Size=python39.PySequence_Size + PySequence_Tuple=python39.PySequence_Tuple + PySetIter_Type=python39.PySetIter_Type DATA + PySet_Add=python39.PySet_Add + PySet_Clear=python39.PySet_Clear + PySet_Contains=python39.PySet_Contains + PySet_Discard=python39.PySet_Discard + PySet_New=python39.PySet_New + PySet_Pop=python39.PySet_Pop + PySet_Size=python39.PySet_Size + PySet_Type=python39.PySet_Type DATA + PySlice_AdjustIndices=python39.PySlice_AdjustIndices + PySlice_GetIndices=python39.PySlice_GetIndices + PySlice_GetIndicesEx=python39.PySlice_GetIndicesEx + PySlice_New=python39.PySlice_New + PySlice_Type=python39.PySlice_Type DATA + PySlice_Unpack=python39.PySlice_Unpack + PySortWrapper_Type=python39.PySortWrapper_Type DATA + PyInterpreterState_GetID=python39.PyInterpreterState_GetID + PyState_AddModule=python39.PyState_AddModule + PyState_FindModule=python39.PyState_FindModule + PyState_RemoveModule=python39.PyState_RemoveModule + PyStructSequence_GetItem=python39.PyStructSequence_GetItem + PyStructSequence_New=python39.PyStructSequence_New + PyStructSequence_NewType=python39.PyStructSequence_NewType + PyStructSequence_SetItem=python39.PyStructSequence_SetItem + PySuper_Type=python39.PySuper_Type DATA + PySys_AddWarnOption=python39.PySys_AddWarnOption + PySys_AddWarnOptionUnicode=python39.PySys_AddWarnOptionUnicode + PySys_AddXOption=python39.PySys_AddXOption + PySys_FormatStderr=python39.PySys_FormatStderr + PySys_FormatStdout=python39.PySys_FormatStdout + PySys_GetObject=python39.PySys_GetObject + PySys_GetXOptions=python39.PySys_GetXOptions + PySys_HasWarnOptions=python39.PySys_HasWarnOptions + PySys_ResetWarnOptions=python39.PySys_ResetWarnOptions + PySys_SetArgv=python39.PySys_SetArgv + PySys_SetArgvEx=python39.PySys_SetArgvEx + PySys_SetObject=python39.PySys_SetObject + PySys_SetPath=python39.PySys_SetPath + PySys_WriteStderr=python39.PySys_WriteStderr + PySys_WriteStdout=python39.PySys_WriteStdout + PyThreadState_Clear=python39.PyThreadState_Clear + PyThreadState_Delete=python39.PyThreadState_Delete + PyThreadState_DeleteCurrent=python39.PyThreadState_DeleteCurrent + PyThreadState_Get=python39.PyThreadState_Get + PyThreadState_GetDict=python39.PyThreadState_GetDict + PyThreadState_GetFrame=python39.PyThreadState_GetFrame + PyThreadState_GetID=python39.PyThreadState_GetID + PyThreadState_GetInterpreter=python39.PyThreadState_GetInterpreter + PyThreadState_New=python39.PyThreadState_New + PyThreadState_SetAsyncExc=python39.PyThreadState_SetAsyncExc + PyThreadState_Swap=python39.PyThreadState_Swap + PyThread_tss_alloc=python39.PyThread_tss_alloc + PyThread_tss_create=python39.PyThread_tss_create + PyThread_tss_delete=python39.PyThread_tss_delete + PyThread_tss_free=python39.PyThread_tss_free + PyThread_tss_get=python39.PyThread_tss_get + PyThread_tss_is_created=python39.PyThread_tss_is_created + PyThread_tss_set=python39.PyThread_tss_set + PyTraceBack_Here=python39.PyTraceBack_Here + PyTraceBack_Print=python39.PyTraceBack_Print + PyTraceBack_Type=python39.PyTraceBack_Type DATA + PyTupleIter_Type=python39.PyTupleIter_Type DATA + PyTuple_GetItem=python39.PyTuple_GetItem + PyTuple_GetSlice=python39.PyTuple_GetSlice + PyTuple_New=python39.PyTuple_New + PyTuple_Pack=python39.PyTuple_Pack + PyTuple_SetItem=python39.PyTuple_SetItem + PyTuple_Size=python39.PyTuple_Size + PyTuple_Type=python39.PyTuple_Type DATA + PyType_ClearCache=python39.PyType_ClearCache + PyType_FromSpec=python39.PyType_FromSpec + PyType_FromSpecWithBases=python39.PyType_FromSpecWithBases + PyType_GenericAlloc=python39.PyType_GenericAlloc + PyType_GenericNew=python39.PyType_GenericNew + PyType_GetFlags=python39.PyType_GetFlags + PyType_GetSlot=python39.PyType_GetSlot + PyType_IsSubtype=python39.PyType_IsSubtype + PyType_Modified=python39.PyType_Modified + PyType_Ready=python39.PyType_Ready + PyType_Type=python39.PyType_Type DATA + PyUnicodeDecodeError_Create=python39.PyUnicodeDecodeError_Create + PyUnicodeDecodeError_GetEncoding=python39.PyUnicodeDecodeError_GetEncoding + PyUnicodeDecodeError_GetEnd=python39.PyUnicodeDecodeError_GetEnd + PyUnicodeDecodeError_GetObject=python39.PyUnicodeDecodeError_GetObject + PyUnicodeDecodeError_GetReason=python39.PyUnicodeDecodeError_GetReason + PyUnicodeDecodeError_GetStart=python39.PyUnicodeDecodeError_GetStart + PyUnicodeDecodeError_SetEnd=python39.PyUnicodeDecodeError_SetEnd + PyUnicodeDecodeError_SetReason=python39.PyUnicodeDecodeError_SetReason + PyUnicodeDecodeError_SetStart=python39.PyUnicodeDecodeError_SetStart + PyUnicodeEncodeError_GetEncoding=python39.PyUnicodeEncodeError_GetEncoding + PyUnicodeEncodeError_GetEnd=python39.PyUnicodeEncodeError_GetEnd + PyUnicodeEncodeError_GetObject=python39.PyUnicodeEncodeError_GetObject + PyUnicodeEncodeError_GetReason=python39.PyUnicodeEncodeError_GetReason + PyUnicodeEncodeError_GetStart=python39.PyUnicodeEncodeError_GetStart + PyUnicodeEncodeError_SetEnd=python39.PyUnicodeEncodeError_SetEnd + PyUnicodeEncodeError_SetReason=python39.PyUnicodeEncodeError_SetReason + PyUnicodeEncodeError_SetStart=python39.PyUnicodeEncodeError_SetStart + PyUnicodeIter_Type=python39.PyUnicodeIter_Type DATA + PyUnicodeTranslateError_GetEnd=python39.PyUnicodeTranslateError_GetEnd + PyUnicodeTranslateError_GetObject=python39.PyUnicodeTranslateError_GetObject + PyUnicodeTranslateError_GetReason=python39.PyUnicodeTranslateError_GetReason + PyUnicodeTranslateError_GetStart=python39.PyUnicodeTranslateError_GetStart + PyUnicodeTranslateError_SetEnd=python39.PyUnicodeTranslateError_SetEnd + PyUnicodeTranslateError_SetReason=python39.PyUnicodeTranslateError_SetReason + PyUnicodeTranslateError_SetStart=python39.PyUnicodeTranslateError_SetStart + PyUnicode_Append=python39.PyUnicode_Append + PyUnicode_AppendAndDel=python39.PyUnicode_AppendAndDel + PyUnicode_AsASCIIString=python39.PyUnicode_AsASCIIString + PyUnicode_AsCharmapString=python39.PyUnicode_AsCharmapString + PyUnicode_AsDecodedObject=python39.PyUnicode_AsDecodedObject + PyUnicode_AsDecodedUnicode=python39.PyUnicode_AsDecodedUnicode + PyUnicode_AsEncodedObject=python39.PyUnicode_AsEncodedObject + PyUnicode_AsEncodedString=python39.PyUnicode_AsEncodedString + PyUnicode_AsEncodedUnicode=python39.PyUnicode_AsEncodedUnicode + PyUnicode_AsLatin1String=python39.PyUnicode_AsLatin1String + PyUnicode_AsMBCSString=python39.PyUnicode_AsMBCSString + PyUnicode_AsRawUnicodeEscapeString=python39.PyUnicode_AsRawUnicodeEscapeString + PyUnicode_AsUCS4=python39.PyUnicode_AsUCS4 + PyUnicode_AsUCS4Copy=python39.PyUnicode_AsUCS4Copy + PyUnicode_AsUTF16String=python39.PyUnicode_AsUTF16String + PyUnicode_AsUTF32String=python39.PyUnicode_AsUTF32String + PyUnicode_AsUTF8String=python39.PyUnicode_AsUTF8String + PyUnicode_AsUnicodeEscapeString=python39.PyUnicode_AsUnicodeEscapeString + PyUnicode_AsWideChar=python39.PyUnicode_AsWideChar + PyUnicode_AsWideCharString=python39.PyUnicode_AsWideCharString + PyUnicode_BuildEncodingMap=python39.PyUnicode_BuildEncodingMap + PyUnicode_Compare=python39.PyUnicode_Compare + PyUnicode_CompareWithASCIIString=python39.PyUnicode_CompareWithASCIIString + PyUnicode_Concat=python39.PyUnicode_Concat + PyUnicode_Contains=python39.PyUnicode_Contains + PyUnicode_Count=python39.PyUnicode_Count + PyUnicode_Decode=python39.PyUnicode_Decode + PyUnicode_DecodeASCII=python39.PyUnicode_DecodeASCII + PyUnicode_DecodeCharmap=python39.PyUnicode_DecodeCharmap + PyUnicode_DecodeCodePageStateful=python39.PyUnicode_DecodeCodePageStateful + PyUnicode_DecodeFSDefault=python39.PyUnicode_DecodeFSDefault + PyUnicode_DecodeFSDefaultAndSize=python39.PyUnicode_DecodeFSDefaultAndSize + PyUnicode_DecodeLatin1=python39.PyUnicode_DecodeLatin1 + PyUnicode_DecodeLocale=python39.PyUnicode_DecodeLocale + PyUnicode_DecodeLocaleAndSize=python39.PyUnicode_DecodeLocaleAndSize + PyUnicode_DecodeMBCS=python39.PyUnicode_DecodeMBCS + PyUnicode_DecodeMBCSStateful=python39.PyUnicode_DecodeMBCSStateful + PyUnicode_DecodeRawUnicodeEscape=python39.PyUnicode_DecodeRawUnicodeEscape + PyUnicode_DecodeUTF16=python39.PyUnicode_DecodeUTF16 + PyUnicode_DecodeUTF16Stateful=python39.PyUnicode_DecodeUTF16Stateful + PyUnicode_DecodeUTF32=python39.PyUnicode_DecodeUTF32 + PyUnicode_DecodeUTF32Stateful=python39.PyUnicode_DecodeUTF32Stateful + PyUnicode_DecodeUTF7=python39.PyUnicode_DecodeUTF7 + PyUnicode_DecodeUTF7Stateful=python39.PyUnicode_DecodeUTF7Stateful + PyUnicode_DecodeUTF8=python39.PyUnicode_DecodeUTF8 + PyUnicode_DecodeUTF8Stateful=python39.PyUnicode_DecodeUTF8Stateful + PyUnicode_DecodeUnicodeEscape=python39.PyUnicode_DecodeUnicodeEscape + PyUnicode_EncodeCodePage=python39.PyUnicode_EncodeCodePage + PyUnicode_EncodeFSDefault=python39.PyUnicode_EncodeFSDefault + PyUnicode_EncodeLocale=python39.PyUnicode_EncodeLocale + PyUnicode_FSConverter=python39.PyUnicode_FSConverter + PyUnicode_FSDecoder=python39.PyUnicode_FSDecoder + PyUnicode_Find=python39.PyUnicode_Find + PyUnicode_FindChar=python39.PyUnicode_FindChar + PyUnicode_Format=python39.PyUnicode_Format + PyUnicode_FromEncodedObject=python39.PyUnicode_FromEncodedObject + PyUnicode_FromFormat=python39.PyUnicode_FromFormat + PyUnicode_FromFormatV=python39.PyUnicode_FromFormatV + PyUnicode_FromObject=python39.PyUnicode_FromObject + PyUnicode_FromOrdinal=python39.PyUnicode_FromOrdinal + PyUnicode_FromString=python39.PyUnicode_FromString + PyUnicode_FromStringAndSize=python39.PyUnicode_FromStringAndSize + PyUnicode_FromWideChar=python39.PyUnicode_FromWideChar + PyUnicode_GetDefaultEncoding=python39.PyUnicode_GetDefaultEncoding + PyUnicode_GetLength=python39.PyUnicode_GetLength + PyUnicode_GetSize=python39.PyUnicode_GetSize + PyUnicode_InternFromString=python39.PyUnicode_InternFromString + PyUnicode_InternImmortal=python39.PyUnicode_InternImmortal + PyUnicode_InternInPlace=python39.PyUnicode_InternInPlace + PyUnicode_IsIdentifier=python39.PyUnicode_IsIdentifier + PyUnicode_Join=python39.PyUnicode_Join + PyUnicode_Partition=python39.PyUnicode_Partition + PyUnicode_RPartition=python39.PyUnicode_RPartition + PyUnicode_RSplit=python39.PyUnicode_RSplit + PyUnicode_ReadChar=python39.PyUnicode_ReadChar + PyUnicode_Replace=python39.PyUnicode_Replace + PyUnicode_Resize=python39.PyUnicode_Resize + PyUnicode_RichCompare=python39.PyUnicode_RichCompare + PyUnicode_Split=python39.PyUnicode_Split + PyUnicode_Splitlines=python39.PyUnicode_Splitlines + PyUnicode_Substring=python39.PyUnicode_Substring + PyUnicode_Tailmatch=python39.PyUnicode_Tailmatch + PyUnicode_Translate=python39.PyUnicode_Translate + PyUnicode_Type=python39.PyUnicode_Type DATA + PyUnicode_WriteChar=python39.PyUnicode_WriteChar + PyWeakref_GetObject=python39.PyWeakref_GetObject + PyWeakref_NewProxy=python39.PyWeakref_NewProxy + PyWeakref_NewRef=python39.PyWeakref_NewRef + PyWrapperDescr_Type=python39.PyWrapperDescr_Type DATA + PyWrapper_New=python39.PyWrapper_New + PyZip_Type=python39.PyZip_Type DATA + Py_AddPendingCall=python39.Py_AddPendingCall + Py_AtExit=python39.Py_AtExit + Py_BuildValue=python39.Py_BuildValue + Py_CompileString=python39.Py_CompileString + Py_DecRef=python39.Py_DecRef + Py_DecodeLocale=python39.Py_DecodeLocale + Py_EncodeLocale=python39.Py_EncodeLocale + Py_EndInterpreter=python39.Py_EndInterpreter + Py_EnterRecursiveCall=python39.Py_EnterRecursiveCall + Py_Exit=python39.Py_Exit + Py_FatalError=python39.Py_FatalError + Py_FileSystemDefaultEncodeErrors=python39.Py_FileSystemDefaultEncodeErrors DATA + Py_FileSystemDefaultEncoding=python39.Py_FileSystemDefaultEncoding DATA + Py_Finalize=python39.Py_Finalize + Py_FinalizeEx=python39.Py_FinalizeEx + Py_GenericAlias=python39.Py_GenericAlias + Py_GenericAliasType=python39.Py_GenericAliasType + Py_GetArgcArgv=python39.Py_GetArgcArgv + Py_GetBuildInfo=python39.Py_GetBuildInfo + Py_GetCompiler=python39.Py_GetCompiler + Py_GetCopyright=python39.Py_GetCopyright + Py_GetExecPrefix=python39.Py_GetExecPrefix + Py_GetPath=python39.Py_GetPath + Py_GetPlatform=python39.Py_GetPlatform + Py_GetPrefix=python39.Py_GetPrefix + Py_GetProgramFullPath=python39.Py_GetProgramFullPath + Py_GetProgramName=python39.Py_GetProgramName + Py_GetPythonHome=python39.Py_GetPythonHome + Py_GetRecursionLimit=python39.Py_GetRecursionLimit + Py_GetVersion=python39.Py_GetVersion + Py_HasFileSystemDefaultEncoding=python39.Py_HasFileSystemDefaultEncoding DATA + Py_IncRef=python39.Py_IncRef + Py_Initialize=python39.Py_Initialize + Py_InitializeEx=python39.Py_InitializeEx + Py_IsInitialized=python39.Py_IsInitialized + Py_LeaveRecursiveCall=python39.Py_LeaveRecursiveCall + Py_Main=python39.Py_Main + Py_MakePendingCalls=python39.Py_MakePendingCalls + Py_NewInterpreter=python39.Py_NewInterpreter + Py_ReprEnter=python39.Py_ReprEnter + Py_ReprLeave=python39.Py_ReprLeave + Py_SetPath=python39.Py_SetPath + Py_SetProgramName=python39.Py_SetProgramName + Py_SetPythonHome=python39.Py_SetPythonHome + Py_SetRecursionLimit=python39.Py_SetRecursionLimit + Py_SymtableString=python39.Py_SymtableString + Py_UTF8Mode=python39.Py_UTF8Mode DATA + Py_VaBuildValue=python39.Py_VaBuildValue + _PyArg_ParseTupleAndKeywords_SizeT=python39._PyArg_ParseTupleAndKeywords_SizeT + _PyArg_ParseTuple_SizeT=python39._PyArg_ParseTuple_SizeT + _PyArg_Parse_SizeT=python39._PyArg_Parse_SizeT + _PyArg_VaParseTupleAndKeywords_SizeT=python39._PyArg_VaParseTupleAndKeywords_SizeT + _PyArg_VaParse_SizeT=python39._PyArg_VaParse_SizeT + _PyErr_BadInternalCall=python39._PyErr_BadInternalCall + _PyObject_CallFunction_SizeT=python39._PyObject_CallFunction_SizeT + _PyObject_CallMethod_SizeT=python39._PyObject_CallMethod_SizeT + _PyObject_GC_Malloc=python39._PyObject_GC_Malloc + _PyObject_GC_New=python39._PyObject_GC_New + _PyObject_GC_NewVar=python39._PyObject_GC_NewVar + _PyObject_GC_Resize=python39._PyObject_GC_Resize + _PyObject_New=python39._PyObject_New + _PyObject_NewVar=python39._PyObject_NewVar + _PyState_AddModule=python39._PyState_AddModule + _PyThreadState_Init=python39._PyThreadState_Init + _PyThreadState_Prealloc=python39._PyThreadState_Prealloc + _PyTrash_delete_later=python39._PyTrash_delete_later DATA + _PyTrash_delete_nesting=python39._PyTrash_delete_nesting DATA + _PyTrash_deposit_object=python39._PyTrash_deposit_object + _PyTrash_destroy_chain=python39._PyTrash_destroy_chain + _PyTrash_thread_deposit_object=python39._PyTrash_thread_deposit_object + _PyTrash_thread_destroy_chain=python39._PyTrash_thread_destroy_chain + _PyWeakref_CallableProxyType=python39._PyWeakref_CallableProxyType DATA + _PyWeakref_ProxyType=python39._PyWeakref_ProxyType DATA + _PyWeakref_RefType=python39._PyWeakref_RefType DATA + _Py_BuildValue_SizeT=python39._Py_BuildValue_SizeT + _Py_CheckRecursionLimit=python39._Py_CheckRecursionLimit DATA + _Py_CheckRecursiveCall=python39._Py_CheckRecursiveCall + _Py_Dealloc=python39._Py_Dealloc + _Py_EllipsisObject=python39._Py_EllipsisObject DATA + _Py_FalseStruct=python39._Py_FalseStruct DATA + _Py_NoneStruct=python39._Py_NoneStruct DATA + _Py_NotImplementedStruct=python39._Py_NotImplementedStruct DATA + _Py_SwappedOp=python39._Py_SwappedOp DATA + _Py_TrueStruct=python39._Py_TrueStruct DATA + _Py_VaBuildValue_SizeT=python39._Py_VaBuildValue_SizeT diff --git a/PC/python_nt.rc b/PC/python_nt.rc index fac6105d8a7721ab9293c5b80fb3d8aa2065e557..b5fb58f26b20281a1a3f640500b6a4cfafc96b6c 100644 --- a/PC/python_nt.rc +++ b/PC/python_nt.rc @@ -7,12 +7,6 @@ #include 2 RT_MANIFEST "python.manifest" -// String Tables -STRINGTABLE DISCARDABLE -BEGIN - 1000, MS_DLL_ID -END - ///////////////////////////////////////////////////////////////////////////// // // Version @@ -40,7 +34,7 @@ BEGIN VALUE "FileVersion", PYTHON_VERSION VALUE "InternalName", "Python DLL\0" VALUE "LegalCopyright", PYTHON_COPYRIGHT "\0" - VALUE "OriginalFilename", PYTHON_DLL_NAME "\0" + VALUE "OriginalFilename", ORIGINAL_FILENAME "\0" VALUE "ProductName", "Python\0" VALUE "ProductVersion", PYTHON_VERSION END diff --git a/PC/python_ver_rc.h b/PC/python_ver_rc.h index d725a9ba06ebd95456b85ab745ff1be982690532..90fc6ba1a1460c58ac6cf6cf2ca13596a41ded52 100644 --- a/PC/python_ver_rc.h +++ b/PC/python_ver_rc.h @@ -5,12 +5,11 @@ #include "winver.h" #define PYTHON_COMPANY "Python Software Foundation" -#define PYTHON_COPYRIGHT "Copyright \xA9 2001-2016 Python Software Foundation. Copyright \xA9 2000 BeOpen.com. Copyright \xA9 1995-2001 CNRI. Copyright \xA9 1991-1995 SMC." +#define PYTHON_COPYRIGHT "Copyright \xA9 2001-2021 Python Software Foundation. Copyright \xA9 2000 BeOpen.com. Copyright \xA9 1995-2001 CNRI. Copyright \xA9 1991-1995 SMC." #define MS_WINDOWS #include "modsupport.h" #include "patchlevel.h" -#include #ifdef _DEBUG # define PYTHON_DEBUG_EXT "_d" #else diff --git a/PC/store_info.txt b/PC/store_info.txt index 89f36998370fc9e7f6af98e2e006fff8141a9821..8c20412a5f0711a4c6c7ffdd7054136b6d520514 100644 --- a/PC/store_info.txt +++ b/PC/store_info.txt @@ -60,9 +60,19 @@ https://partner.microsoft.com/dashboard. We keep it here for convenience and to allow it to be updated via pull requests. +When submitting a new app, the HeadlessAppBypass waiver will be needed. +To request this, send an email to PartnerOps@microsoft.com with the app +ID (12 character token available from the dashboard). The waiver needs +to be applied *before* uploading the package (as of November 2019). + +Ensure that the new app is named "Python.3.X", where X is the minor +version of the release. If the name provided initially does not match +the name used when building the package, the upload will fail. The +display name shown to users can be set later. + ## Title -Python 3.8 +Python 3.9 ## Short Title @@ -78,7 +88,7 @@ The Python interpreter is easily extended with new functions and data types impl ## ShortDescription -The Python 3.8 interpreter and runtime. +The Python 3.9 interpreter and runtime. ## Copyright Trademark Information @@ -86,38 +96,38 @@ The Python 3.8 interpreter and runtime. ## Additional License Terms -Visit https://docs.python.org/3.8/license.html for latest license terms. +Visit https://docs.python.org/3.9/license.html for latest license terms. -PSF LICENSE AGREEMENT FOR PYTHON 3.8 +PSF LICENSE AGREEMENT FOR PYTHON 3.9 1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and the Individual or Organization ("Licensee") accessing and otherwise using Python - 3.8 software in source or binary form and its associated documentation. + 3.9 software in source or binary form and its associated documentation. 2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, - distribute, and otherwise use Python 3.8 alone or in any derivative + distribute, and otherwise use Python 3.9 alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright © 2001-2018 Python Software Foundation; All Rights - Reserved" are retained in Python 3.8 alone or in any derivative version + Reserved" are retained in Python 3.9 alone or in any derivative version prepared by Licensee. 3. In the event Licensee prepares a derivative work that is based on or - incorporates Python 3.8 or any part thereof, and wants to make the + incorporates Python 3.9 or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python - 3.8. + 3.9. -4. PSF is making Python 3.8 available to Licensee on an "AS IS" basis. +4. PSF is making Python 3.9 available to Licensee on an "AS IS" basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE - USE OF PYTHON 3.8 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. + USE OF PYTHON 3.9 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 3.8 +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 3.9 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF - MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 3.8, OR ANY DERIVATIVE + MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 3.9, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. 6. This License Agreement will automatically terminate upon a material breach of @@ -129,7 +139,7 @@ PSF LICENSE AGREEMENT FOR PYTHON 3.8 trademark sense to endorse or promote products or services of Licensee, or any third party. -8. By copying, installing or otherwise using Python 3.8, Licensee agrees +8. By copying, installing or otherwise using Python 3.9, Licensee agrees to be bound by the terms and conditions of this License Agreement. ## Features diff --git a/PC/winreg.c b/PC/winreg.c index caad18e045bcb9a71653401138da736a2a224f02..1305b7030fadafba4cbdadf77e86487f6a918d89 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -14,8 +14,8 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "structmember.h" -#include "windows.h" +#include "structmember.h" // PyMemberDef +#include static BOOL PyHKEY_AsHKEY(PyObject *ob, HKEY *pRes, BOOL bNoneOK); static BOOL clinic_HKEY_converter(PyObject *ob, void *p); @@ -390,7 +390,7 @@ PyTypeObject PyHKEY_Type = PyObject * PyHKEY_New(HKEY hInit) { - PyHKEYObject *key = PyObject_NEW(PyHKEYObject, &PyHKEY_Type); + PyHKEYObject *key = PyObject_New(PyHKEYObject, &PyHKEY_Type); if (key) key->hkey = hInit; return (PyObject *)key; diff --git a/PCbuild/_asyncio.vcxproj.filters b/PCbuild/_asyncio.vcxproj.filters index 10a186cdad1cd4a375dc23cff24420b74366db27..a09ae928a9b5ea598e286139fcb02cd5ce5d189f 100644 --- a/PCbuild/_asyncio.vcxproj.filters +++ b/PCbuild/_asyncio.vcxproj.filters @@ -1,16 +1,21 @@  - - - {2422278e-eeeb-4241-8182-433e2bc5a7fc} + + {41f1cd52-b682-46aa-a7fd-7bdf81a18010} + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_bz2.vcxproj.filters b/PCbuild/_bz2.vcxproj.filters index eac64dd29d6c0e88aa7afa82544a557af5a4b71f..7c0b5162537e06bddf78cb150f914b114f716eaf 100644 --- a/PCbuild/_bz2.vcxproj.filters +++ b/PCbuild/_bz2.vcxproj.filters @@ -4,10 +4,16 @@ {f53a859d-dad2-4d5b-ae41-f28d8b571f5a} - + + {b90c3cee-7700-4e87-bf85-0801866e8d0d} + + {7e0bed05-ae33-43b7-8797-656455bbb7f3} - + + {b53f67d8-fdf0-4e10-a987-e44475ff434a} + + {ed574b89-6983-4cdf-9f98-fe7048d9e89c} @@ -16,33 +22,38 @@ Source Files - bzip2 1.0.6 Source Files + Source Files\bzip2 - bzip2 1.0.6 Source Files + Source Files\bzip2 - bzip2 1.0.6 Source Files + Source Files\bzip2 - bzip2 1.0.6 Source Files + Source Files\bzip2 - bzip2 1.0.6 Source Files + Source Files\bzip2 - bzip2 1.0.6 Source Files + Source Files\bzip2 - bzip2 1.0.6 Source Files + Source Files\bzip2 - - bzip2 1.0.6 Header Files - - bzip2 1.0.6 Header Files + Header Files\bzip2 + + Header Files\bzip2 + + + + + Resource Files + - + \ No newline at end of file diff --git a/PCbuild/_ctypes.vcxproj.filters b/PCbuild/_ctypes.vcxproj.filters index 3123286347aeeed683e1887154166ae69d6afb59..118c4f0698ccb015fc6db4d4a83881df22349480 100644 --- a/PCbuild/_ctypes.vcxproj.filters +++ b/PCbuild/_ctypes.vcxproj.filters @@ -7,6 +7,9 @@ {dbdea1f2-ad8b-44ca-b782-fcf65d91559b} + + {31a37bb4-c384-41ff-9ec1-8ad98d482e22} + @@ -37,6 +40,8 @@ - + + Resource Files + \ No newline at end of file diff --git a/PCbuild/_ctypes_test.vcxproj.filters b/PCbuild/_ctypes_test.vcxproj.filters index c1e94ce1faa0a006947bae25d4eb79e8899e2534..5174196c52e4d05c46d02241af70f1a102b1a80c 100644 --- a/PCbuild/_ctypes_test.vcxproj.filters +++ b/PCbuild/_ctypes_test.vcxproj.filters @@ -7,6 +7,9 @@ {38abc486-e143-49dc-8cf0-8aefab0e0d3d} + + {5030ff8f-daf5-4bc8-b1dd-e8b59d34c511} + @@ -18,4 +21,9 @@ Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_decimal.vcxproj b/PCbuild/_decimal.vcxproj index 465a7ade9a01d1a4aef42c8dbdb1a1a53184ad43..4c71cdb6d1d77dc9b18d65d396dda45272d0e437 100644 --- a/PCbuild/_decimal.vcxproj +++ b/PCbuild/_decimal.vcxproj @@ -118,7 +118,6 @@ - @@ -131,7 +130,7 @@ - + diff --git a/PCbuild/_decimal.vcxproj.filters b/PCbuild/_decimal.vcxproj.filters index 7e19aa2f659615d7c1cc1cedb71f05453708377f..0cbd3d0736c2413f1b246e891f1ab1a06f10d987 100644 --- a/PCbuild/_decimal.vcxproj.filters +++ b/PCbuild/_decimal.vcxproj.filters @@ -7,58 +7,64 @@ {138089f8-faba-494f-b6ed-051f31fbaf2d} + + {632b24a3-0844-4e57-ad34-b0e4cef886dd} + + + {322d127c-1105-4a31-aed2-e29cdececc77} + + + {780c3b7a-7817-4e89-a2f2-fc522f2c5966} + - + Header Files + + Header Files\libmpdec + - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files - - - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files + Header Files\libmpdec - Header Files - - - Header Files + Header Files\libmpdec @@ -66,51 +72,56 @@ Source Files - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec - - Source Files + + Source Files\libmpdec - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec - Source Files + Source Files\libmpdec + + + Resource Files + + - Source Files + Source Files\libmpdec \ No newline at end of file diff --git a/PCbuild/_elementtree.vcxproj.filters b/PCbuild/_elementtree.vcxproj.filters index 6acdf35846ab1497167b9acd5aaf354b6f796816..bc14e31f32b95ce140d0edc8357e2417b2385dee 100644 --- a/PCbuild/_elementtree.vcxproj.filters +++ b/PCbuild/_elementtree.vcxproj.filters @@ -7,52 +7,61 @@ {7b5335ad-059f-486f-85e4-f4757e26a9bf} + + {37d3ef0a-1ea6-492d-bba7-b83865198caa} + + + {6099ed72-6668-4779-adb2-a2362e5da3b9} + + + {f99990ba-cd06-40cc-8f28-d2d424ec13be} + - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat - Header Files + Header Files\expat @@ -60,13 +69,18 @@ Source Files - Source Files + Source Files\expat - Source Files + Source Files\expat - Source Files + Source Files\expat - + + + Resource Files + + + \ No newline at end of file diff --git a/PCbuild/_freeze_importlib.vcxproj.filters b/PCbuild/_freeze_importlib.vcxproj.filters index ccad053a9f5362a5e10728a0f02b8d46ade48bf8..3ee9eb750d67e84e9b73cb8b83eb6cc85b5df298 100644 --- a/PCbuild/_freeze_importlib.vcxproj.filters +++ b/PCbuild/_freeze_importlib.vcxproj.filters @@ -5,13 +5,8 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + {eb238244-ace1-48fc-97a4-16ff886f8642} @@ -23,5 +18,11 @@ Source Files + + Python Files + + + Python Files + - + \ No newline at end of file diff --git a/PCbuild/_hashlib.vcxproj.filters b/PCbuild/_hashlib.vcxproj.filters index a9d993eb3ed4ada1e72f07c4ea076df1431c57fd..7a0700c007f6442d7197bf2ac9f69f1f5e695ba0 100644 --- a/PCbuild/_hashlib.vcxproj.filters +++ b/PCbuild/_hashlib.vcxproj.filters @@ -4,10 +4,18 @@ {cc45963d-bd25-4eb8-bdba-a5507090bca4} + + {67630fa4-76e4-4035-bced-043a6df1e2e0} + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_lzma.vcxproj.filters b/PCbuild/_lzma.vcxproj.filters index 0c5ed74608e6eb6d9a8533a3199b14eac3559227..e23e5399df449b6dcba1e89cdc7ace5258206ef5 100644 --- a/PCbuild/_lzma.vcxproj.filters +++ b/PCbuild/_lzma.vcxproj.filters @@ -4,10 +4,18 @@ {53e68eda-39fc-4336-a658-dc5f5d598760} + + {9e5ecf81-2940-4dd5-af98-58e98810d030} + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_msi.vcxproj.filters b/PCbuild/_msi.vcxproj.filters index 7dec52de0b3e55288f33012cc192d7bb08e8f7c2..a94fb18e61e485bb36983e4ba12e9161f0a049b1 100644 --- a/PCbuild/_msi.vcxproj.filters +++ b/PCbuild/_msi.vcxproj.filters @@ -4,10 +4,18 @@ {bdef7710-e433-4ac0-84e0-14f34454bd3e} + + {8513f324-7c13-4657-b463-5d686a8a5371} + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_multiprocessing.vcxproj.filters b/PCbuild/_multiprocessing.vcxproj.filters index 78133ec0ec84584a035656bd295732ac3bb2c1db..85caddb10db28db7f64a718d89a4ae9b79e8534b 100644 --- a/PCbuild/_multiprocessing.vcxproj.filters +++ b/PCbuild/_multiprocessing.vcxproj.filters @@ -7,6 +7,9 @@ {34615a62-f999-4659-83f5-19d17a644530} + + {1dcf6347-2248-42e1-ab3c-1b19f4f6f647} + @@ -21,4 +24,9 @@ Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_overlapped.vcxproj.filters b/PCbuild/_overlapped.vcxproj.filters index 78de895055905e8012c90c7b999f03cd17a297c0..29a9b77740b15a6cc7dee47c5cc312965ee90f1f 100644 --- a/PCbuild/_overlapped.vcxproj.filters +++ b/PCbuild/_overlapped.vcxproj.filters @@ -4,10 +4,18 @@ {6f67c8db-7de7-4714-a967-2b0d4bc71f2e} + + {83fe502d-eca2-4505-b626-eddec9b6ea9f} + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_queue.vcxproj.filters b/PCbuild/_queue.vcxproj.filters index 88b80826adfeecc641c3854d98c5e28c0407bc21..ec48e9d3aeddf72a6789357d12be65dc7bdd330e 100644 --- a/PCbuild/_queue.vcxproj.filters +++ b/PCbuild/_queue.vcxproj.filters @@ -1,16 +1,21 @@  - - - {c56a5dd3-7838-48e9-a781-855d8be7370f} + + {bc5dc97e-11b8-435a-82e7-2ef3c9b44f5e} + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_socket.vcxproj.filters b/PCbuild/_socket.vcxproj.filters index 790ffa80dd4c8f5d69b84badaa0efbb79ce8de44..453175c6a43a6abd3a5c4d92baca73af926d2274 100644 --- a/PCbuild/_socket.vcxproj.filters +++ b/PCbuild/_socket.vcxproj.filters @@ -7,6 +7,9 @@ {1edfe0d0-7b9d-4dc8-a335-b21fef7cc77a} + + {f8efff18-28ed-4c6b-8e8d-fa816d9a81a8} + @@ -18,4 +21,9 @@ Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_sqlite3.vcxproj.filters b/PCbuild/_sqlite3.vcxproj.filters index dce77c96a80599fb98aae9ceb4304a4dd4f5697d..51830f6a4451a45231ab21d8b11c896193ff7d23 100644 --- a/PCbuild/_sqlite3.vcxproj.filters +++ b/PCbuild/_sqlite3.vcxproj.filters @@ -7,6 +7,9 @@ {814b187d-44ad-4f2b-baa7-18ca8a8a6a77} + + {225f58de-2bad-4e4d-bc0b-fe74ed6bf5f1} + @@ -66,4 +69,9 @@ Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_ssl.vcxproj.filters b/PCbuild/_ssl.vcxproj.filters index bd46b609840b2d23abca41a010ecc1c6cc1e93b8..716a69a41af351780ea2ef20f600fd97de39c340 100644 --- a/PCbuild/_ssl.vcxproj.filters +++ b/PCbuild/_ssl.vcxproj.filters @@ -4,6 +4,9 @@ {695348f7-e9f6-4fe1-bc03-5f08ffc8095b} + + {1b18a2e6-040d-46c7-a9ac-ac2ec64fb5d6} + @@ -14,6 +17,8 @@ - + + Resource Files + \ No newline at end of file diff --git a/PCbuild/_testbuffer.vcxproj.filters b/PCbuild/_testbuffer.vcxproj.filters index eadf282750baa671de393f599d96691d923dd006..bea4260b9f7432be4c61df1fa75a7a63859c75ca 100644 --- a/PCbuild/_testbuffer.vcxproj.filters +++ b/PCbuild/_testbuffer.vcxproj.filters @@ -4,10 +4,18 @@ {8d232240-921a-4bc2-87c3-93ffd3462f0a} + + {1e73201a-cca4-4b45-9484-262709cafee7} + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_testcapi.vcxproj.filters b/PCbuild/_testcapi.vcxproj.filters index 7a6ad1a864eca4afed7325c3b13737b6becc8a6b..53f64b7aa1e1a20dd7326f324c4beb545159a9db 100644 --- a/PCbuild/_testcapi.vcxproj.filters +++ b/PCbuild/_testcapi.vcxproj.filters @@ -4,10 +4,18 @@ {a76a90d8-8e8b-4c36-8f58-8bd46abe9f5e} + + {071b2ff4-e5a1-4e79-b0c5-cf46b0094a80} + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_testconsole.vcxproj.filters b/PCbuild/_testconsole.vcxproj.filters index 0c25101e1b4fb0c2a980fadbf66c71e5455284d9..321e17785fddbb985133d27361942ad16e701b6a 100644 --- a/PCbuild/_testconsole.vcxproj.filters +++ b/PCbuild/_testconsole.vcxproj.filters @@ -5,18 +5,19 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_testembed.vcxproj.filters b/PCbuild/_testembed.vcxproj.filters index f7f9abeb1dfaae2be034b7148c015a795deb709e..b90fd85f79425f4efb1a6a23f373de872cb3da95 100644 --- a/PCbuild/_testembed.vcxproj.filters +++ b/PCbuild/_testembed.vcxproj.filters @@ -5,10 +5,6 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms @@ -19,4 +15,9 @@ Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_testimportmultiple.vcxproj.filters b/PCbuild/_testimportmultiple.vcxproj.filters index db0d0a65e12909188c6767d68471a06bb06853d5..8f63d13482513dcb767e632f38047a70e18619f4 100644 --- a/PCbuild/_testimportmultiple.vcxproj.filters +++ b/PCbuild/_testimportmultiple.vcxproj.filters @@ -4,10 +4,18 @@ {1ec38ad9-1abf-4b80-8628-ac43ccba324b} + + {0ff128a6-7814-4f8e-826e-860a858104ee} + Source Files - + + + Resource Files + + + \ No newline at end of file diff --git a/PCbuild/_testinternalcapi.vcxproj.filters b/PCbuild/_testinternalcapi.vcxproj.filters index 4644f230be1ce3a730f315ba7ce1e9b6f6e2d978..7734da0b7b426bed6140c48f687e0695a59a20f8 100644 --- a/PCbuild/_testinternalcapi.vcxproj.filters +++ b/PCbuild/_testinternalcapi.vcxproj.filters @@ -4,10 +4,18 @@ {136fc5eb-7fe4-4486-8c6d-b49f37a00199} + + {acecc890-f8dd-4942-b6d2-1fd8f73a5d6c} + Source Files - + + + Resource Files + + + \ No newline at end of file diff --git a/PCbuild/_testmultiphase.vcxproj.filters b/PCbuild/_testmultiphase.vcxproj.filters index 0c25101e1b4fb0c2a980fadbf66c71e5455284d9..8df0a42e9f3c772c8a3b3387157881288a5f6c9d 100644 --- a/PCbuild/_testmultiphase.vcxproj.filters +++ b/PCbuild/_testmultiphase.vcxproj.filters @@ -5,10 +5,6 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms @@ -19,4 +15,9 @@ Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_tkinter.vcxproj.filters b/PCbuild/_tkinter.vcxproj.filters index 4e5cd479e30b50857f3f8b8c0a912b340734f478..0d919439a76af68ca0a9eb7ee1ce86e68bd613b1 100644 --- a/PCbuild/_tkinter.vcxproj.filters +++ b/PCbuild/_tkinter.vcxproj.filters @@ -4,6 +4,9 @@ {b9ce64dd-cb95-472d-bbe8-5583b2cd375b} + + {2bd3a90c-5b2e-45fb-9b2a-fbf1a4faf5f9} + @@ -13,4 +16,9 @@ Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/_uuid.vcxproj b/PCbuild/_uuid.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..2437b7eb2d9399f40304af2ce09d43456f48773f --- /dev/null +++ b/PCbuild/_uuid.vcxproj @@ -0,0 +1,115 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + PGInstrument + ARM + + + PGInstrument + ARM64 + + + PGInstrument + Win32 + + + PGInstrument + x64 + + + PGUpdate + ARM + + + PGUpdate + ARM64 + + + PGUpdate + Win32 + + + PGUpdate + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {CB435430-EBB1-478B-8F4E-C256F6838F55} + _uuid + Win32Proj + false + + + + + DynamicLibrary + NotSet + + + + .pyd + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + + + + rpcrt4.lib;%(AdditionalDependencies) + + + + + + + + + + + {cf7ac3d1-e2df-41d2-bea6-1e2556cdea26} + false + + + + + + \ No newline at end of file diff --git a/PCbuild/_uuid.vcxproj.filters b/PCbuild/_uuid.vcxproj.filters new file mode 100644 index 0000000000000000000000000000000000000000..705902ff50c3a6c4e5fd5d13c125be4aeb035336 --- /dev/null +++ b/PCbuild/_uuid.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {4fa4dbfa-e069-4ab4-86a6-ad389b2ec407} + + + + + Source Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/PCbuild/_zoneinfo.vcxproj b/PCbuild/_zoneinfo.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..6e6389c3773397f84af786b997455bae499498b8 --- /dev/null +++ b/PCbuild/_zoneinfo.vcxproj @@ -0,0 +1,109 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + PGInstrument + ARM + + + PGInstrument + ARM64 + + + PGInstrument + Win32 + + + PGInstrument + x64 + + + PGUpdate + ARM + + + PGUpdate + ARM64 + + + PGUpdate + Win32 + + + PGUpdate + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742} + _zoneinfo + Win32Proj + + + + + DynamicLibrary + NotSet + + + + .pyd + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + + + + + + + + + + {cf7ac3d1-e2df-41d2-bea6-1e2556cdea26} + false + + + + + + diff --git a/PCbuild/_zoneinfo.vcxproj.filters b/PCbuild/_zoneinfo.vcxproj.filters new file mode 100644 index 0000000000000000000000000000000000000000..57f31e05d561a3b93a7acd379b3b319be804f2c4 --- /dev/null +++ b/PCbuild/_zoneinfo.vcxproj.filters @@ -0,0 +1,21 @@ + + + + + {2422278e-eeeb-4241-8182-433e2bc5a7fc} + + + {0616fb85-7891-4790-83c2-005f906cf555} + + + + + Source Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/PCbuild/build.bat b/PCbuild/build.bat index 7f9de1f5b3f55722881c35d162c39ec22cb509d8..5a41ca57b12391b6efa9764d0ed7d64594a07313 100644 --- a/PCbuild/build.bat +++ b/PCbuild/build.bat @@ -34,6 +34,7 @@ echo. automatically by the pythoncore project) echo. --pgo Build with Profile-Guided Optimization. This flag echo. overrides -c and -d echo. --test-marker Enable the test marker within the build. +echo. --regen Regenerate all opcodes, grammar and tokens echo. echo.Available flags to avoid building certain modules. echo.These flags have no effect if '-e' is not given: @@ -45,7 +46,7 @@ echo.Available arguments: echo. -c Release ^| Debug ^| PGInstrument ^| PGUpdate echo. Set the configuration (default: Release) echo. -p x64 ^| Win32 ^| ARM ^| ARM64 -echo. Set the platform (default: Win32) +echo. Set the platform (default: x64) echo. -t Build ^| Rebuild ^| Clean ^| CleanAll echo. Set the target manually echo. --pgo-job The job to use for PGO training; implies --pgo @@ -54,7 +55,7 @@ exit /b 127 :Run setlocal -set platf=Win32 +set platf=x64 set conf=Release set target=Build set dir=%~dp0 @@ -80,7 +81,8 @@ if "%~1"=="-k" (set kill=true) & shift & goto CheckOpts if "%~1"=="--pgo" (set do_pgo=true) & shift & goto CheckOpts if "%~1"=="--pgo-job" (set do_pgo=true) & (set pgo_job=%~2) & shift & shift & goto CheckOpts if "%~1"=="--test-marker" (set UseTestMarker=true) & shift & goto CheckOpts -if "%~1"=="-V" shift & goto :Version +if "%~1"=="-V" shift & goto Version +if "%~1"=="--regen" (set Regen=true) & shift & goto CheckOpts rem These use the actual property names used by MSBuild. We could just let rem them in through the environment, but we specify them on the command line rem anyway for visibility so set defaults after this @@ -158,6 +160,14 @@ echo on /p:UseTestMarker=%UseTestMarker% %GITProperty%^ %1 %2 %3 %4 %5 %6 %7 %8 %9 +@if not ERRORLEVEL 1 @if "%Regen%"=="true" ( + %MSBUILD% "%dir%regen.vcxproj" /t:%target% %parallel% %verbose%^ + /p:IncludeExternals=%IncludeExternals%^ + /p:Configuration=%conf% /p:Platform=%platf%^ + /p:UseTestMarker=%UseTestMarker% %GITProperty%^ + %1 %2 %3 %4 %5 %6 %7 %8 %9 +) + @echo off exit /b %ERRORLEVEL% diff --git a/PCbuild/env.bat b/PCbuild/env.bat index 9d4c9d1c32f7a4a345d41dfeb247e9cb1978d7be..2820e304582cff0428ba3283402122f9d4e00d9c 100644 --- a/PCbuild/env.bat +++ b/PCbuild/env.bat @@ -9,8 +9,19 @@ rem 'v110', 'v120' or 'v140') to the build script. echo Build environments: x86, amd64, x86_amd64 echo. -set VSTOOLS=%VS140COMNTOOLS% -if "%VSTOOLS%"=="" set VSTOOLS=%VS120COMNTOOLS% -if "%VSTOOLS%"=="" set VSTOOLS=%VS110COMNTOOLS% -if "%VSTOOLS%"=="" set VSTOOLS=%VS100COMNTOOLS% -call "%VSTOOLS%..\..\VC\vcvarsall.bat" %* +set _ARGS=%* +if NOT DEFINED _ARGS set _ARGS=amd64 + +if not exist "%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" goto :skip_vswhere +set VSTOOLS= +for /F "tokens=*" %%i in ('"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -property installationPath -latest -prerelease -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64') DO @(set VSTOOLS=%%i\VC\Auxiliary\Build\vcvarsall.bat) +if not defined VSTOOLS goto :skip_vswhere +call "%VSTOOLS%" %_ARGS% +exit /B 0 + +:skip_vswhere +if not defined VSTOOLS set VSTOOLS=%VS140COMNTOOLS% +if not defined VSTOOLS set VSTOOLS=%VS120COMNTOOLS% +if not defined VSTOOLS set VSTOOLS=%VS110COMNTOOLS% +if not defined VSTOOLS set VSTOOLS=%VS100COMNTOOLS% +call "%VSTOOLS%..\..\VC\vcvarsall.bat" %_ARGS% diff --git a/PCbuild/env.ps1 b/PCbuild/env.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..19d7ada4c10798f2a40acaf55f7ff1ec59151875 --- /dev/null +++ b/PCbuild/env.ps1 @@ -0,0 +1,2 @@ +$pcbuild = $script:MyInvocation.MyCommand.Path | Split-Path -parent; +& cmd /K "$pcbuild\env.bat" $args diff --git a/PCbuild/find_python.bat b/PCbuild/find_python.bat index 40937a67c33ac7a2e0ef08811018cddf6cd53c78..75413cdbfcf431e4bca85c1c140c746c1d34d26b 100644 --- a/PCbuild/find_python.bat +++ b/PCbuild/find_python.bat @@ -37,7 +37,7 @@ @if NOT "%HOST_PYTHON%"=="" @%HOST_PYTHON% -Ec "import sys; assert sys.version_info[:2] >= (3, 6)" >nul 2>nul && (set PYTHON="%HOST_PYTHON%") && (set _Py_Python_Source=found as HOST_PYTHON) && goto :found @rem If py.exe finds a recent enough version, use that one -@for %%p in (3.7 3.6) do @py -%%p -EV >nul 2>&1 && (set PYTHON=py -%%p) && (set _Py_Python_Source=found %%p with py.exe) && goto :found +@for %%p in (3.8 3.7 3.6) do @py -%%p -EV >nul 2>&1 && (set PYTHON=py -%%p) && (set _Py_Python_Source=found %%p with py.exe) && goto :found @if NOT exist "%_Py_EXTERNALS_DIR%" mkdir "%_Py_EXTERNALS_DIR%" @set _Py_NUGET=%NUGET% diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index 3ad7ce71ffba14f4020b479aa28956411f786369..1e783846a2b90849d49def040aa6bfdebf5cdd2e 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -52,9 +52,9 @@ echo.Fetching external libraries... set libraries= set libraries=%libraries% bzip2-1.0.6 -if NOT "%IncludeLibffiSrc%"=="false" set libraries=%libraries% libffi-3.3.0-rc0-r1 -if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-1.1.1g -set libraries=%libraries% sqlite-3.31.1.0 +if NOT "%IncludeLibffiSrc%"=="false" set libraries=%libraries% libffi +if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-1.1.1i +set libraries=%libraries% sqlite-3.34.0.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tcl-core-8.6.9.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tk-8.6.9.0 if NOT "%IncludeTkinterSrc%"=="false" set libraries=%libraries% tix-8.4.3.6 @@ -77,7 +77,7 @@ echo.Fetching external binaries... set binaries= if NOT "%IncludeLibffi%"=="false" set binaries=%binaries% libffi -if NOT "%IncludeSSL%"=="false" set binaries=%binaries% openssl-bin-1.1.1g +if NOT "%IncludeSSL%"=="false" set binaries=%binaries% openssl-bin-1.1.1i if NOT "%IncludeTkinter%"=="false" set binaries=%binaries% tcltk-8.6.9.0 if NOT "%IncludeSSLSrc%"=="false" set binaries=%binaries% nasm-2.11.06 diff --git a/PCbuild/idle.bat b/PCbuild/idle.bat index 1978b99f6ee19d531fc91ddee8c5a5e2b2d5dd84..70f3817f09769c5de4698fa730143e0c15fbb4e7 100644 --- a/PCbuild/idle.bat +++ b/PCbuild/idle.bat @@ -4,12 +4,24 @@ rem Usage: idle [-d] rem -d Run Debug build (python_d.exe). Else release build. setlocal -set exe=win32\python +set PCBUILD=%~dp0 +set exedir=%PCBUILD%\amd64 +set exe=python PATH %PATH%;..\externals\tcltk\bin -if "%1"=="-d" (set exe=%exe%_d) & shift +:CheckOpts +if "%1"=="-d" (set exe=%exe%_d) & shift & goto :CheckOpts +if "%1"=="-p" (call :SetExeDir %2) & shift & shift & goto :CheckOpts -set cmd=%exe% ../Lib/idlelib/idle.py %1 %2 %3 %4 %5 %6 %7 %8 %9 +set cmd=%exedir%\%exe% %PCBUILD%\..\Lib\idlelib\idle.py %1 %2 %3 %4 %5 %6 %7 %8 %9 echo on %cmd% +exit /B %LASTERRORCODE% + +:SetExeDir +if /I %1 EQU Win32 (set exedir=%PCBUILD%\win32) +if /I %1 EQU x64 (set exedir=%PCBUILD%\amd64) +if /I %1 EQU ARM (set exedir=%PCBUILD%\arm32) +if /I %1 EQU ARM64 (set exedir=%PCBUILD%\arm64) +exit /B 0 diff --git a/PCbuild/lib.pyproj b/PCbuild/lib.pyproj index 6e9d54511fef168dbe93de74dde9c7f08308e27e..f0c51edb9d1ca1ee476fb31944a28a409c12cb6b 100644 --- a/PCbuild/lib.pyproj +++ b/PCbuild/lib.pyproj @@ -250,7 +250,6 @@ - @@ -420,6 +419,7 @@ + @@ -831,7 +831,6 @@ - @@ -976,8 +975,6 @@ - - @@ -1129,6 +1126,8 @@ + + @@ -1195,7 +1194,6 @@ - @@ -1210,6 +1208,12 @@ + + + + + + @@ -1393,6 +1397,10 @@ + + + + @@ -1560,11 +1568,14 @@ + + + + - @@ -1791,6 +1802,7 @@ + diff --git a/PCbuild/liblzma.vcxproj.filters b/PCbuild/liblzma.vcxproj.filters new file mode 100644 index 0000000000000000000000000000000000000000..3f58351fa9edb6ab338f1e2fa163b6a3247b3b14 --- /dev/null +++ b/PCbuild/liblzma.vcxproj.filters @@ -0,0 +1,435 @@ + + + + + {cb1870af-3c7e-48ba-bd7f-3e87468f8ed7} + + + {58761ffe-2af0-42a8-9f93-4e57e1954c36} + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/PCbuild/pcbuild.proj b/PCbuild/pcbuild.proj index 22a9eed18d42bba591e279db28032a31d18d9e00..4d416c589e4c47e2cd51cd1c9aebb75226c6975c 100644 --- a/PCbuild/pcbuild.proj +++ b/PCbuild/pcbuild.proj @@ -51,7 +51,7 @@ - + diff --git a/PCbuild/pcbuild.sln b/PCbuild/pcbuild.sln index 6dc0139bc42af4bc541c86491f698426cae398cc..4b6dc1e6771dc3ddb942b3bdb87f8dd887140a97 100644 --- a/PCbuild/pcbuild.sln +++ b/PCbuild/pcbuild.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2024 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30028.174 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{553EC33E-9816-4996-A660-5D6186A0B0B3}" ProjectSection(SolutionItems) = preProject @@ -91,6 +91,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testconsole", "_testconsol EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_asyncio", "_asyncio.vcxproj", "{384C224A-7474-476E-A01B-750EA7DE918C}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_zoneinfo", "_zoneinfo.vcxproj", "{FCBE1EF2-E0F0-40B1-88B5-00A35D378742}" +EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_queue", "_queue.vcxproj", "{78D80A15-BD8C-44E2-B49E-1F05B0A0A687}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "liblzma", "liblzma.vcxproj", "{12728250-16EC-4DC6-94D7-E21DD88947F8}" @@ -103,6 +105,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "venvwlauncher", "venvwlaunc EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pythonw_uwp", "pythonw_uwp.vcxproj", "{AB603547-1E2A-45B3-9E09-B04596006393}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_uuid", "_uuid.vcxproj", "{CB435430-EBB1-478B-8F4E-C256F6838F55}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ARM = Debug|ARM @@ -1263,6 +1267,38 @@ Global {384C224A-7474-476E-A01B-750EA7DE918C}.Release|Win32.Build.0 = Release|Win32 {384C224A-7474-476E-A01B-750EA7DE918C}.Release|x64.ActiveCfg = Release|x64 {384C224A-7474-476E-A01B-750EA7DE918C}.Release|x64.Build.0 = Release|x64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Debug|ARM.ActiveCfg = Debug|ARM + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Debug|ARM.Build.0 = Debug|ARM + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Debug|ARM64.Build.0 = Debug|ARM64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Debug|Win32.ActiveCfg = Debug|Win32 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Debug|Win32.Build.0 = Debug|Win32 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Debug|x64.ActiveCfg = Debug|x64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Debug|x64.Build.0 = Debug|x64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Release|ARM.ActiveCfg = Release|ARM + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Release|ARM.Build.0 = Release|ARM + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Release|ARM64.ActiveCfg = Release|ARM64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Release|ARM64.Build.0 = Release|ARM64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Release|Win32.ActiveCfg = Release|Win32 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Release|Win32.Build.0 = Release|Win32 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Release|x64.ActiveCfg = Release|x64 + {FCBE1EF2-E0F0-40B1-88B5-00A35D378742}.Release|x64.Build.0 = Release|x64 {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Debug|ARM.ActiveCfg = Debug|ARM {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Debug|ARM.Build.0 = Debug|ARM {78D80A15-BD8C-44E2-B49E-1F05B0A0A687}.Debug|ARM64.ActiveCfg = Debug|ARM64 @@ -1440,6 +1476,38 @@ Global {AB603547-1E2A-45B3-9E09-B04596006393}.Release|Win32.Build.0 = Release|Win32 {AB603547-1E2A-45B3-9E09-B04596006393}.Release|x64.ActiveCfg = Release|x64 {AB603547-1E2A-45B3-9E09-B04596006393}.Release|x64.Build.0 = Release|x64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Debug|ARM.ActiveCfg = Debug|ARM + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Debug|ARM.Build.0 = Debug|ARM + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Debug|ARM64.Build.0 = Debug|ARM64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Debug|Win32.ActiveCfg = Debug|Win32 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Debug|Win32.Build.0 = Debug|Win32 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Debug|x64.ActiveCfg = Debug|x64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Debug|x64.Build.0 = Debug|x64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGInstrument|ARM.Build.0 = PGInstrument|ARM + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGInstrument|ARM64.Build.0 = PGInstrument|ARM64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGInstrument|x64.Build.0 = PGInstrument|x64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGUpdate|ARM.Build.0 = PGUpdate|ARM + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGUpdate|ARM64.Build.0 = PGUpdate|ARM64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.PGUpdate|x64.Build.0 = PGUpdate|x64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Release|ARM.ActiveCfg = Release|ARM + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Release|ARM.Build.0 = Release|ARM + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Release|ARM64.ActiveCfg = Release|ARM64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Release|ARM64.Build.0 = Release|ARM64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Release|Win32.ActiveCfg = Release|Win32 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Release|Win32.Build.0 = Release|Win32 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Release|x64.ActiveCfg = Release|x64 + {CB435430-EBB1-478B-8F4E-C256F6838F55}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/PCbuild/prepare_libffi.bat b/PCbuild/prepare_libffi.bat index f41ba83379af961e51467355867cf752ea979e24..922a47565c8da5807346e109c13b12d351328383 100644 --- a/PCbuild/prepare_libffi.bat +++ b/PCbuild/prepare_libffi.bat @@ -22,10 +22,10 @@ echo Based on https://github.com/libffi/libffi/blob/master/.appveyor.yml echo. echo. echo.Available flags: -echo. -x64 build for x64 -echo. -x86 build for x86 -echo. -arm32 build for arm32 -echo. -arm64 build for arm64 +echo. -x64 enable x64 build +echo. -x86 enable x86 build +echo. -arm32 enable arm32 build +echo. -arm64 enable arm64 build echo. -? this help echo. --install-cygwin install cygwin to c:\cygwin exit /b 127 @@ -44,6 +44,7 @@ set INSTALL_CYGWIN= if "%1"=="" goto :CheckOptsDone if /I "%1"=="-x64" (set BUILD_X64=1) & shift & goto :CheckOpts if /I "%1"=="-x86" (set BUILD_X86=1) & shift & goto :CheckOpts +if /I "%1"=="-win32" (set BUILD_X86=1) & shift & goto :CheckOpts if /I "%1"=="-arm32" (set BUILD_ARM32=1) & shift & goto :CheckOpts if /I "%1"=="-arm64" (set BUILD_ARM64=1) & shift & goto :CheckOpts if /I "%1"=="-pdb" (set BUILD_PDB=-g) & shift & goto :CheckOpts @@ -67,9 +68,7 @@ setlocal if NOT DEFINED SH if exist c:\cygwin\bin\sh.exe set SH=c:\cygwin\bin\sh.exe if NOT DEFINED VCVARSALL ( - if exist "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ( - set VCVARSALL="C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" - ) + for /F "tokens=*" %%i in ('"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -property installationPath -latest -prerelease -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64') DO @(set VCVARSALL="%%i\VC\Auxiliary\Build\vcvarsall.bat") ) if ^%VCVARSALL:~0,1% NEQ ^" SET VCVARSALL="%VCVARSALL%" diff --git a/PCbuild/pyexpat.vcxproj.filters b/PCbuild/pyexpat.vcxproj.filters index f8d46026c9c284dad57b1a140796523821d43938..fd22fc8c477df02b2f881dd1a7eeade51ae7cf5b 100644 --- a/PCbuild/pyexpat.vcxproj.filters +++ b/PCbuild/pyexpat.vcxproj.filters @@ -7,6 +7,9 @@ {5af9d40c-fc46-4640-ad84-3d1dd34a71d7} + + {f1dbbdb5-41e5-4a88-bf8e-13da010c0ce4} + @@ -30,4 +33,9 @@ Source Files - + + + Resource Files + + + \ No newline at end of file diff --git a/PCbuild/pylauncher.vcxproj.filters b/PCbuild/pylauncher.vcxproj.filters index e4b23d2af836649ce7b28032d537b1b5efef0612..17d0389ca50f1c8194c1682f4fbd7c2d07ca2e19 100644 --- a/PCbuild/pylauncher.vcxproj.filters +++ b/PCbuild/pylauncher.vcxproj.filters @@ -5,10 +5,6 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index 360b4eda230dd96e466a32069b98f874b1a58e90..98e5ab030321db10f1de6512844f388386f755a1 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -44,9 +44,9 @@ Default true true - NoExtensions OnlyExplicitInline OnlyExplicitInline + /utf-8 %(AdditionalOptions) Disabled @@ -82,7 +82,7 @@ $(PySourcePath)PC;$(PySourcePath)Include;$(IntDir);%(AdditionalIncludeDirectories) - $(_DebugPreprocessorDefinition)%(PreprocessorDefinitions) + ORIGINAL_FILENAME=\"$(TargetName)$(TargetExt)\";FIELD3=$(Field3Value);$(_DebugPreprocessorDefinition)%(PreprocessorDefinitions) 0x0409 @@ -97,21 +97,6 @@ - - - - - - - @@ -192,8 +177,8 @@ public override bool Execute() { $(registry:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Kits\Installed Roots@KitsRoot81)\bin\x86 $(registry:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Kits\Installed Roots@KitsRoot)\bin\x86 $(registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A@InstallationFolder)\Bin\ - <_SignCommand Condition="Exists($(SdkBinPath)) and '$(SigningCertificate)' != '' and $(SupportSigning)">"$(SdkBinPath)\signtool.exe" sign /a /n "$(SigningCertificate)" /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d "Python $(PythonVersion)" - <_SignCommand Condition="Exists($(SdkBinPath)) and '$(SigningCertificateSha1)' != '' and $(SupportSigning)">"$(SdkBinPath)\signtool.exe" sign /a /sha1 "$(SigningCertificateSha1)" /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d "Python $(PythonVersion)" + <_SignCommand Condition="Exists($(SdkBinPath)) and '$(SigningCertificate)' != '' and $(SupportSigning)">"$(SdkBinPath)\signtool.exe" sign /a /n "$(SigningCertificate)" /fd sha256 /tr http://timestamp.digicert.com/ /td sha256 /d "Python $(PythonVersion)" + <_SignCommand Condition="Exists($(SdkBinPath)) and '$(SigningCertificateSha1)' != '' and $(SupportSigning)">"$(SdkBinPath)\signtool.exe" sign /a /sha1 "$(SigningCertificateSha1)" /fd sha256 /tr http://timestamp.digicert.com/ /td sha256 /d "Python $(PythonVersion)" <_MakeCatCommand Condition="Exists($(SdkBinPath))">"$(SdkBinPath)\makecat.exe" diff --git a/PCbuild/pyshellext.vcxproj.filters b/PCbuild/pyshellext.vcxproj.filters index 648e499f6f402fa720be28740151c54b2c0a3107..36d1d1655f5dfdbfbdcf86086e7d9ef5d4d873de 100644 --- a/PCbuild/pyshellext.vcxproj.filters +++ b/PCbuild/pyshellext.vcxproj.filters @@ -5,10 +5,6 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms diff --git a/PCbuild/python.props b/PCbuild/python.props index bf6f3716ba51bce47c95f8b8cc08a14d6564a95c..3fa774816a75304e1fde7faf2f561d1b46916075 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -56,14 +56,14 @@ $(EXTERNALS_DIR) $([System.IO.Path]::GetFullPath(`$(PySourcePath)externals`)) $(ExternalsDir)\ - $(ExternalsDir)sqlite-3.31.1.0\ + $(ExternalsDir)sqlite-3.34.0.0\ $(ExternalsDir)bzip2-1.0.6\ $(ExternalsDir)xz-5.2.2\ $(ExternalsDir)libffi\ $(ExternalsDir)libffi\$(ArchName)\ $(libffiOutDir)include - $(ExternalsDir)openssl-1.1.1g\ - $(ExternalsDir)openssl-bin-1.1.1g\$(ArchName)\ + $(ExternalsDir)openssl-1.1.1i\ + $(ExternalsDir)openssl-bin-1.1.1i\$(ArchName)\ $(opensslOutDir)include $(ExternalsDir)\nasm-2.11.06\ $(ExternalsDir)\zlib-1.2.11\ diff --git a/PCbuild/python3dll.vcxproj.filters b/PCbuild/python3dll.vcxproj.filters index d250c45254e80d1c4a19def6390e98789f562054..a7566052e1204da47547a888aacc7c2d60889d76 100644 --- a/PCbuild/python3dll.vcxproj.filters +++ b/PCbuild/python3dll.vcxproj.filters @@ -5,10 +5,6 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav diff --git a/PCbuild/python_uwp.vcxproj.filters b/PCbuild/python_uwp.vcxproj.filters new file mode 100644 index 0000000000000000000000000000000000000000..79e87461eb1b7cce7cd238b4c8f0d4f171a713f8 --- /dev/null +++ b/PCbuild/python_uwp.vcxproj.filters @@ -0,0 +1,26 @@ + + + + + {fd8bf000-0bbe-4fd4-ac49-29036e5a5c5a} + + + {a0d4ce0b-a7b5-4a77-b6c2-d2ddb9bd49b8} + + + + + Resource Files + + + + + Resource Files + + + + + Source Files + + + \ No newline at end of file diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 0666b90f66cc9ce22192d250fa1e9a6dd1ef3c8d..2625d0293dde635d5fe5228c2c553115b5ce9d00 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -106,16 +106,17 @@ _Py_HAVE_ZLIB;%(PreprocessorDefinitions) - version.lib;shlwapi.lib;ws2_32.lib;%(AdditionalDependencies) + version.lib;shlwapi.lib;ws2_32.lib;pathcch.lib;%(AdditionalDependencies) + + - @@ -127,9 +128,19 @@ + + + + + + + + + + @@ -156,17 +167,27 @@ + + - + + + + + + + + + @@ -174,6 +195,8 @@ + + @@ -199,7 +222,6 @@ - @@ -208,21 +230,20 @@ + + - - + - - - - + + @@ -263,6 +284,8 @@ + + @@ -316,7 +339,6 @@ - @@ -325,6 +347,7 @@ + @@ -374,6 +397,7 @@ + @@ -405,6 +429,10 @@ + + + + @@ -437,6 +465,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index ebab1193018366526395ba76f3d140de808434d0..4b9eebde6a176368381a603d393388b63db07ae7 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -31,6 +31,15 @@ {c3e03a5c-56c7-45fd-8543-e5d2326b907d} + + {86ffb5eb-c423-43aa-b736-a8850d3277df} + + + {875bf4f2-ac42-46bd-b703-8371a824ec32} + + + {33dbdbe0-42c4-4478-bed2-a12cb1e68773} + @@ -48,9 +57,6 @@ Include - - Include - Include @@ -81,48 +87,6 @@ Include - - Include - - - Include - - - Include - - - Include - - - Include - - - Include - - - Include - - - Include - - - Include - - - Include - - - Include - - - Include - - - Include - - - Include - Include @@ -171,12 +135,24 @@ Include + + Include + Include Include + + Include + + + Include + + + Include + Include @@ -189,6 +165,9 @@ Include + + Include + Include @@ -201,9 +180,18 @@ Include + + Include + + + Include + Include + + Include + Include @@ -225,6 +213,12 @@ Include + + Include + + + Include + Include @@ -345,9 +339,6 @@ Include - - Include - Include @@ -513,38 +504,179 @@ Include - - Modules\zlib + + Include + + + Include\cpython + + + Include\cpython + + + Include\cpython + + + Include\cpython + + + Include\cpython + + + Include\cpython - - Modules\zlib + + Include\cpython - - Modules\zlib + + Include\cpython - - Modules\zlib + + Include\cpython - - Modules\zlib + + Include\cpython - - Modules\zlib + + Include\cpython - - Modules\zlib + + Include\cpython - - Modules\zlib + + Include\cpython - - Modules\zlib + + Include\cpython - - Modules\zlib + + Include\cpython - - Modules\zlib + + Include\cpython + + + Include\cpython + + + Include\cpython + + + Include\cpython + + + Include\cpython + + + Include\cpython + + + Include\cpython + + + Include\cpython + + + Include\cpython + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Include\internal + + + Parser\pegen + + + Parser\pegen + + + Include\internal @@ -593,9 +725,6 @@ Modules - - Modules - Modules @@ -659,9 +788,6 @@ Modules - - Modules - Modules @@ -692,9 +818,6 @@ Modules - - Modules - Modules\_io @@ -926,9 +1049,6 @@ Python - - Python - Python @@ -971,8 +1091,8 @@ Python - - Python + + Modules Python @@ -1082,53 +1202,47 @@ Modules - - Modules - PC Objects - - PC - Modules - - Modules\zlib + + Python - - Modules\zlib + + Parser - - Modules\zlib + + Modules - - Modules\zlib + + Python - - Modules\zlib + + Objects - - Modules\zlib + + Parser\pegen - - Modules\zlib + + Parser\pegen - - Modules\zlib + + Parser\pegen - - Modules\zlib + + Parser\pegen - - Modules\zlib + + Modules - - Modules\zlib + + Modules @@ -1136,4 +1250,4 @@ Resource Files - + \ No newline at end of file diff --git a/PCbuild/pythonw.vcxproj.filters b/PCbuild/pythonw.vcxproj.filters index 259866fbcc2f8682646e8635fdd18cacb77a288e..20d87051e2511dc3875aac892b4098419c3a88b0 100644 --- a/PCbuild/pythonw.vcxproj.filters +++ b/PCbuild/pythonw.vcxproj.filters @@ -8,14 +8,14 @@ {e1d8ea6b-c65d-42f4-9eed-6010846ed378} - - - Resource Files - - Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/pythonw_uwp.vcxproj.filters b/PCbuild/pythonw_uwp.vcxproj.filters new file mode 100644 index 0000000000000000000000000000000000000000..2f39bdea9e910dc9fca958245edf51f8c2c2c8bf --- /dev/null +++ b/PCbuild/pythonw_uwp.vcxproj.filters @@ -0,0 +1,26 @@ + + + + + {de05f656-4dcb-4fe7-9946-5c325ea2d842} + + + {4102e199-3e5c-42d0-b37b-d42394b20d9e} + + + + + Resource Files + + + + + Resource Files + + + + + Source Files + + + \ No newline at end of file diff --git a/PCbuild/pywlauncher.vcxproj.filters b/PCbuild/pywlauncher.vcxproj.filters index e4b23d2af836649ce7b28032d537b1b5efef0612..17d0389ca50f1c8194c1682f4fbd7c2d07ca2e19 100644 --- a/PCbuild/pywlauncher.vcxproj.filters +++ b/PCbuild/pywlauncher.vcxproj.filters @@ -5,10 +5,6 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt index ceed5dc9c3e72ca1266b152cdd6cca16124254b8..5a21c30af9487a672d045903589334344b9b1a1c 100644 --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -38,7 +38,7 @@ Debug Used to build Python with extra debugging capabilities, equivalent to using ./configure --with-pydebug on UNIX. All binaries built using this configuration have "_d" added to their name: - python38_d.dll, python_d.exe, parser_d.pyd, and so on. Both the + python39_d.dll, python_d.exe, parser_d.pyd, and so on. Both the build and rt (run test) batch files in this directory accept a -d option for debug builds. If you are building Python to help with development of CPython, you will most likely use this configuration. @@ -132,6 +132,7 @@ library which are implemented in C; each one builds a DLL (renamed to _asyncio _ctypes _ctypes_test +_zoneinfo _decimal _elementtree _hashlib @@ -165,7 +166,7 @@ _lzma Homepage: http://tukaani.org/xz/ _ssl - Python wrapper for version 1.1.1c of the OpenSSL secure sockets + Python wrapper for version 1.1.1i of the OpenSSL secure sockets library, which is downloaded from our binaries repository at https://github.com/python/cpython-bin-deps. @@ -184,7 +185,7 @@ _ssl again when building. _sqlite3 - Wraps SQLite 3.31.1.0, which is itself built by sqlite3.vcxproj + Wraps SQLite 3.34.0, which is itself built by sqlite3.vcxproj Homepage: http://www.sqlite.org/ _tkinter @@ -285,4 +286,4 @@ The pyproject property file defines all of the build settings for each project, with some projects overriding certain specific values. The GUI doesn't always reflect the correct settings and may confuse the user with false information, especially for settings that automatically adapt -for diffirent configurations. +for different configurations. diff --git a/PCbuild/regen.vcxproj b/PCbuild/regen.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..564a4dd71188ca45ae549c1b1c8ac49df7a9aae0 --- /dev/null +++ b/PCbuild/regen.vcxproj @@ -0,0 +1,230 @@ + + + + + Debug + ARM + + + Debug + Win32 + + + Debug + x64 + + + PGInstrument + ARM + + + PGInstrument + Win32 + + + PGInstrument + x64 + + + PGUpdate + ARM + + + PGUpdate + Win32 + + + PGUpdate + x64 + + + Release + ARM + + + Release + Win32 + + + Release + x64 + + + + {21CF2108-2CC9-4005-A6ED-B7965ADE3854} + Win32Proj + regen + false + 10.0 + + + + + Utility + Unicode + + + v142 + + + v142 + + + v142 + + + v142 + + + v142 + + + v142 + + + v142 + + + v142 + + + v142 + + + v142 + + + v142 + + + v142 + + + + + + + + + + + + _CONSOLE;%(PreprocessorDefinitions) + + + Console + + + + + + + + {cf7ac3d1-e2df-41d2-bea6-1e2556cdea26} + true + true + false + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PCbuild/rt.bat b/PCbuild/rt.bat index 59f757c0f5888add193905648ea39be12d8a03d4..29813c5a87fca76d628ecdb1a6c3b86fe3c58ac3 100644 --- a/PCbuild/rt.bat +++ b/PCbuild/rt.bat @@ -6,8 +6,9 @@ rem -O Run python.exe or python_d.exe (see -d) with -O. rem -q "quick" -- normally the tests are run twice, the first time rem after deleting all the .pyc files reachable from Lib/. rem -q runs the tests just once, and without deleting .pyc files. -rem -x64 Run the 64-bit build of python (or python_d if -d was specified) -rem When omitted, uses %PREFIX% if set or the 32-bit build +rem -p or -win32, -x64, -arm32, -arm64 +rem Run the specified architecture of python (or python_d if -d +rem was specified). If omitted, uses %PREFIX% if set or 64-bit. rem All leading instances of these switches are shifted off, and rem whatever remains (up to 9 arguments) is passed to regrtest.py. rem For example, @@ -38,12 +39,14 @@ set exe= if "%1"=="-O" (set dashO=-O) & shift & goto CheckOpts if "%1"=="-q" (set qmode=yes) & shift & goto CheckOpts if "%1"=="-d" (set suffix=_d) & shift & goto CheckOpts +if "%1"=="-win32" (set prefix=%pcbuild%win32) & shift & goto CheckOpts if "%1"=="-x64" (set prefix=%pcbuild%amd64) & shift & goto CheckOpts if "%1"=="-arm64" (set prefix=%pcbuild%arm64) & shift & goto CheckOpts if "%1"=="-arm32" (set prefix=%pcbuild%arm32) & shift & goto CheckOpts +if "%1"=="-p" (call :SetPlatform %~2) & shift & shift & goto CheckOpts if NOT "%1"=="" (set regrtestargs=%regrtestargs% %1) & shift & goto CheckOpts -if not defined prefix set prefix=%pcbuild%win32 +if not defined prefix set prefix=%pcbuild%amd64 set exe=%prefix%\python%suffix%.exe set cmd="%exe%" %dashO% -u -Wd -E -bb -m test %regrtestargs% if defined qmode goto Qmode @@ -60,6 +63,15 @@ echo on echo About to run again without deleting .pyc first: pause +goto Qmode + +:SetPlatform +if /I %1 EQU Win32 (set prefix=%pcbuild%win32) & exit /B 0 +if /I %1 EQU x64 (set prefix=%pcbuild%amd64) & exit /B 0 +if /I %1 EQU ARM64 (set prefix=%pcbuild%arm64) & exit /B 0 +if /I %1 EQU ARM (set prefix=%pcbuild%arm32) & exit /B 0 +echo Invalid platform "%1" +exit /B 1 :Qmode echo on diff --git a/PCbuild/select.vcxproj.filters b/PCbuild/select.vcxproj.filters index 55a2fc834a3575f2e49d1b87937cb7e8f82b9fb2..5354820dd49ccdb3cbd35fffc08a21a6bdb0b51c 100644 --- a/PCbuild/select.vcxproj.filters +++ b/PCbuild/select.vcxproj.filters @@ -4,10 +4,18 @@ {98346077-900c-4c7a-852f-a23470e37b40} + + {b47a8e6c-47c0-4490-aa91-1a3624a0905c} + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/sqlite3.vcxproj b/PCbuild/sqlite3.vcxproj index 90b4d3108fa557c64adad8e5a3a6778d0a5c9309..7351a6dda2c76354165ba3186eda8cd98d314d21 100644 --- a/PCbuild/sqlite3.vcxproj +++ b/PCbuild/sqlite3.vcxproj @@ -98,7 +98,7 @@ $(sqlite3Dir);%(AdditionalIncludeDirectories) - SQLITE_ENABLE_FTS4;SQLITE_ENABLE_FTS5;SQLITE_API=__declspec(dllexport);%(PreprocessorDefinitions) + SQLITE_ENABLE_JSON1;SQLITE_ENABLE_FTS4;SQLITE_ENABLE_FTS5;SQLITE_API=__declspec(dllexport);%(PreprocessorDefinitions) Level1 diff --git a/PCbuild/sqlite3.vcxproj.filters b/PCbuild/sqlite3.vcxproj.filters index 86680c1c383033ec47d07e243d8f664188e9f5fc..76662ed68d024006d1726e93367584d6feaf59ea 100644 --- a/PCbuild/sqlite3.vcxproj.filters +++ b/PCbuild/sqlite3.vcxproj.filters @@ -7,6 +7,9 @@ {0e842fe2-176b-4e83-9d1f-0ad13a859efd} + + {0248795a-00c9-4090-ad61-55ae23438598} + @@ -21,4 +24,9 @@ Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/unicodedata.vcxproj.filters b/PCbuild/unicodedata.vcxproj.filters index 20e640ee11ede74c8660f5900a0acc02342cf7ec..7ff97835c9623a65d9f5e43a73fb2d8d5e868073 100644 --- a/PCbuild/unicodedata.vcxproj.filters +++ b/PCbuild/unicodedata.vcxproj.filters @@ -7,6 +7,9 @@ {e2c055bb-ec62-4bbc-aa1c-d88da4d4ad1c} + + {d04f3447-67b0-42aa-b84f-9fc0029d5af7} + @@ -21,4 +24,9 @@ Source Files + + + Resource Files + + \ No newline at end of file diff --git a/PCbuild/venvlauncher.vcxproj.filters b/PCbuild/venvlauncher.vcxproj.filters new file mode 100644 index 0000000000000000000000000000000000000000..ec13936bf6cb7e61d7ffc9af469357766c1561b6 --- /dev/null +++ b/PCbuild/venvlauncher.vcxproj.filters @@ -0,0 +1,26 @@ + + + + + {8f3ab79e-3cba-4e6d-82b2-559ce946de58} + + + {4a2423af-e5d1-4c88-b308-d71b768977df} + + + + + Resource Files + + + + + Resource Files + + + + + Source Files + + + \ No newline at end of file diff --git a/PCbuild/venvwlauncher.vcxproj.filters b/PCbuild/venvwlauncher.vcxproj.filters new file mode 100644 index 0000000000000000000000000000000000000000..8addc13e977e7a7a8e32cfc84bc540629f35c4ae --- /dev/null +++ b/PCbuild/venvwlauncher.vcxproj.filters @@ -0,0 +1,26 @@ + + + + + {7683f248-9c32-4e72-a329-5bd84993f63a} + + + {61b34b26-ce53-405d-a743-b370ff505887} + + + + + Source Files + + + + + Resource Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/PCbuild/winsound.vcxproj.filters b/PCbuild/winsound.vcxproj.filters index 7d08931b186d9f1d449670d1181f5a050d2093af..6775802638205bb6e47509e457cc12c98ae7c015 100644 --- a/PCbuild/winsound.vcxproj.filters +++ b/PCbuild/winsound.vcxproj.filters @@ -5,10 +5,18 @@ {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + {6be42502-398f-4bec-8677-8809a2da0eef} + Source Files + + + Resource Files + + \ No newline at end of file diff --git a/Parser/Python.asdl b/Parser/Python.asdl index 126d478975bbbb449e600fcecff5072a7239bd94..889712b4b3d36e9f5965cec4af6657572c4cfd6a 100644 --- a/Parser/Python.asdl +++ b/Parser/Python.asdl @@ -1,16 +1,13 @@ --- ASDL's 5 builtin types are: --- identifier, int, string, object, constant +-- ASDL's 4 builtin types are: +-- identifier, int, string, constant module Python { - mod = Module(stmt* body, type_ignore *type_ignores) + mod = Module(stmt* body, type_ignore* type_ignores) | Interactive(stmt* body) | Expression(expr body) | FunctionType(expr* argtypes, expr returns) - -- not really an actual node but useful in Jython's typesystem. - | Suite(stmt* body) - stmt = FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment) @@ -51,7 +48,6 @@ module Python | Expr(expr value) | Pass | Break | Continue - -- XXX Jython will be different -- col_offset is the byte offset in the utf8 string the parser uses attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset) @@ -82,20 +78,19 @@ module Python -- the following expression can appear in assignment context | Attribute(expr value, identifier attr, expr_context ctx) - | Subscript(expr value, slice slice, expr_context ctx) + | Subscript(expr value, expr slice, expr_context ctx) | Starred(expr value, expr_context ctx) | Name(identifier id, expr_context ctx) | List(expr* elts, expr_context ctx) | Tuple(expr* elts, expr_context ctx) + -- can appear only in Subscript + | Slice(expr? lower, expr? upper, expr? step) + -- col_offset is the byte offset in the utf8 string the parser uses attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset) - expr_context = Load | Store | Del | AugLoad | AugStore | Param - - slice = Slice(expr? lower, expr? upper, expr? step) - | ExtSlice(slice* dims) - | Index(expr value) + expr_context = Load | Store | Del boolop = And | Or @@ -119,6 +114,7 @@ module Python -- keyword arguments supplied to call (NULL identifier for **kwargs) keyword = (identifier? arg, expr value) + attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset) -- import name with optional 'as' alias. alias = (identifier name, identifier? asname) diff --git a/Parser/asdl.py b/Parser/asdl.py index 62f5c19c99fd711455db750df3b07978dfa0b3a2..7f509488b96ed3998018662322435e907a57cf44 100644 --- a/Parser/asdl.py +++ b/Parser/asdl.py @@ -33,8 +33,7 @@ # See the EBNF at the top of the file to understand the logical connection # between the various node types. -builtin_types = {'identifier', 'string', 'bytes', 'int', 'object', 'singleton', - 'constant'} +builtin_types = {'identifier', 'string', 'int', 'constant'} class AST: def __repr__(self): @@ -72,6 +71,16 @@ def __init__(self, type, name=None, seq=False, opt=False): self.seq = seq self.opt = opt + def __str__(self): + if self.seq: + extra = "*" + elif self.opt: + extra = "?" + else: + extra = "" + + return "{}{} {}".format(self.type, extra, self.name) + def __repr__(self): if self.seq: extra = ", seq=True" diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index a708b66dbe917989d0bb043a9e074bb967d29cd4..6f3154aeb6fc26f9a7fa342324cea58cabe888c8 100644 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -1,12 +1,17 @@ #! /usr/bin/env python """Generate C code from an ASDL description.""" -import os, sys +import os +import sys + +from argparse import ArgumentParser +from pathlib import Path import asdl TABSIZE = 4 MAX_COL = 80 +AUTOGEN_MESSAGE = "/* File automatically generated by {}. */\n\n" def get_c_type(name): """Return a string for the C name of the type. @@ -60,6 +65,9 @@ def reflow_lines(s, depth): lines.append(padding + cur) return lines +def reflow_c_string(s, depth): + return '"%s"' % s.replace('\n', '\\n"\n%s"' % (' ' * depth * TABSIZE)) + def is_simple(sum): """Return True if a sum is a simple. @@ -71,6 +79,21 @@ def is_simple(sum): return False return True +def asdl_of(name, obj): + if isinstance(obj, asdl.Product) or isinstance(obj, asdl.Constructor): + fields = ", ".join(map(str, obj.fields)) + if fields: + fields = "({})".format(fields) + return "{}{}".format(name, fields) + else: + if is_simple(obj): + types = " | ".join(type.name for type in obj.types) + else: + sep = "\n{}| ".format(" " * (len(name) + 1)) + types = sep.join( + asdl_of(type.name, type) for type in obj.types + ) + return "{} = {}".format(name, types) class EmitVisitor(asdl.VisitorBase): """Visit that emits lines""" @@ -78,14 +101,18 @@ class EmitVisitor(asdl.VisitorBase): def __init__(self, file): self.file = file self.identifiers = set() + self.singletons = set() + self.types = set() super(EmitVisitor, self).__init__() def emit_identifier(self, name): - name = str(name) - if name in self.identifiers: - return - self.emit("_Py_IDENTIFIER(%s);" % name, 0) - self.identifiers.add(name) + self.identifiers.add(str(name)) + + def emit_singleton(self, name): + self.singletons.add(str(name)) + + def emit_type(self, name): + self.types.add(str(name)) def emit(self, s, depth, reflow=True): # XXX reflow long lines? @@ -301,7 +328,7 @@ def emit(s, depth=0, reflow=True): if not opt and argtype != "int": emit("if (!%s) {" % argname, 1) emit("PyErr_SetString(PyExc_ValueError,", 2) - msg = "field %s is required for %s" % (argname, name) + msg = "field '%s' is required for %s" % (argname, name) emit(' "%s");' % msg, 2, reflow=False) emit('return NULL;', 2) @@ -360,7 +387,7 @@ def visitField(self, sum): class Obj2ModPrototypeVisitor(PickleVisitor): def visitProduct(self, prod, name): - code = "static int obj2ast_%s(PyObject* obj, %s* out, PyArena* arena);" + code = "static int obj2ast_%s(astmodulestate *state, PyObject* obj, %s* out, PyArena* arena);" self.emit(code % (name, get_c_type(name)), 0) visitSum = visitProduct @@ -370,7 +397,7 @@ class Obj2ModVisitor(PickleVisitor): def funcHeader(self, name): ctype = get_c_type(name) self.emit("int", 0) - self.emit("obj2ast_%s(PyObject* obj, %s* out, PyArena* arena)" % (name, ctype), 0) + self.emit("obj2ast_%s(astmodulestate *state, PyObject* obj, %s* out, PyArena* arena)" % (name, ctype), 0) self.emit("{", 0) self.emit("int isinstance;", 1) self.emit("", 0) @@ -392,7 +419,7 @@ def simpleSum(self, sum, name): self.funcHeader(name) for t in sum.types: line = ("isinstance = PyObject_IsInstance(obj, " - "(PyObject *)%s_type);") + "state->%s_type);") self.emit(line % (t.name,), 1) self.emit("if (isinstance == -1) {", 1) self.emit("return 1;", 2) @@ -409,6 +436,7 @@ def buildArgs(self, fields): def complexSum(self, sum, name): self.funcHeader(name) self.emit("PyObject *tmp = NULL;", 1) + self.emit("PyObject *tp;", 1) for a in sum.attributes: self.visitAttributeDeclaration(a, name, sum=sum) self.emit("", 0) @@ -420,8 +448,8 @@ def complexSum(self, sum, name): for a in sum.attributes: self.visitField(a, name, sum=sum, depth=1) for t in sum.types: - line = "isinstance = PyObject_IsInstance(obj, (PyObject*)%s_type);" - self.emit(line % (t.name,), 1) + self.emit("tp = state->%s_type;" % (t.name,), 1) + self.emit("isinstance = PyObject_IsInstance(obj, tp);", 1) self.emit("if (isinstance == -1) {", 1) self.emit("return 1;", 2) self.emit("}", 1) @@ -451,7 +479,7 @@ def visitSum(self, sum, name): def visitProduct(self, prod, name): ctype = get_c_type(name) self.emit("int", 0) - self.emit("obj2ast_%s(PyObject* obj, %s* out, PyArena* arena)" % (name, ctype), 0) + self.emit("obj2ast_%s(astmodulestate *state, PyObject* obj, %s* out, PyArena* arena)" % (name, ctype), 0) self.emit("{", 0) self.emit("PyObject* tmp = NULL;", 1) for f in prod.fields: @@ -497,7 +525,8 @@ def isSimpleType(self, field): def visitField(self, field, name, sum=None, prod=None, depth=0): ctype = get_c_type(field.type) - self.emit("if (_PyObject_LookupAttrId(obj, &PyId_%s, &tmp) < 0) {" % field.name, depth) + line = "if (_PyObject_LookupAttr(obj, state->%s, &tmp) < 0) {" + self.emit(line % field.name, depth) self.emit("return 1;", depth+1) self.emit("}", depth) if not field.opt: @@ -524,7 +553,7 @@ def visitField(self, field, name, sum=None, prod=None, depth=0): self.emit("Py_ssize_t i;", depth+1) self.emit("if (!PyList_Check(tmp)) {", depth+1) self.emit("PyErr_Format(PyExc_TypeError, \"%s field \\\"%s\\\" must " - "be a list, not a %%.200s\", tmp->ob_type->tp_name);" % + "be a list, not a %%.200s\", _PyType_Name(Py_TYPE(tmp)));" % (name, field.name), depth+2, reflow=False) self.emit("goto failed;", depth+2) @@ -537,8 +566,11 @@ def visitField(self, field, name, sum=None, prod=None, depth=0): self.emit("if (%s == NULL) goto failed;" % field.name, depth+1) self.emit("for (i = 0; i < len; i++) {", depth+1) self.emit("%s val;" % ctype, depth+2) - self.emit("res = obj2ast_%s(PyList_GET_ITEM(tmp, i), &val, arena);" % + self.emit("PyObject *tmp2 = PyList_GET_ITEM(tmp, i);", depth+2) + self.emit("Py_INCREF(tmp2);", depth+2) + self.emit("res = obj2ast_%s(state, tmp2, &val, arena);" % field.type, depth+2, reflow=False) + self.emit("Py_DECREF(tmp2);", depth+2) self.emit("if (res != 0) goto failed;", depth+2) self.emit("if (len != PyList_GET_SIZE(tmp)) {", depth+2) self.emit("PyErr_SetString(PyExc_RuntimeError, \"%s field \\\"%s\\\" " @@ -550,7 +582,7 @@ def visitField(self, field, name, sum=None, prod=None, depth=0): self.emit("asdl_seq_SET(%s, i, val);" % field.name, depth+2) self.emit("}", depth+1) else: - self.emit("res = obj2ast_%s(tmp, &%s, arena);" % + self.emit("res = obj2ast_%s(state, tmp, &%s, arena);" % (field.type, field.name), depth+1) self.emit("if (res != 0) goto failed;", depth+1) @@ -571,50 +603,46 @@ def prototype(self, sum, name): class PyTypesDeclareVisitor(PickleVisitor): def visitProduct(self, prod, name): - self.emit("static PyTypeObject *%s_type;" % name, 0) - self.emit("static PyObject* ast2obj_%s(void*);" % name, 0) + self.emit_type("%s_type" % name) + self.emit("static PyObject* ast2obj_%s(astmodulestate *state, void*);" % name, 0) if prod.attributes: for a in prod.attributes: self.emit_identifier(a.name) - self.emit("static char *%s_attributes[] = {" % name, 0) + self.emit("static const char * const %s_attributes[] = {" % name, 0) for a in prod.attributes: self.emit('"%s",' % a.name, 1) self.emit("};", 0) if prod.fields: for f in prod.fields: self.emit_identifier(f.name) - self.emit("static char *%s_fields[]={" % name,0) + self.emit("static const char * const %s_fields[]={" % name,0) for f in prod.fields: self.emit('"%s",' % f.name, 1) self.emit("};", 0) def visitSum(self, sum, name): - self.emit("static PyTypeObject *%s_type;" % name, 0) + self.emit_type("%s_type" % name) if sum.attributes: for a in sum.attributes: self.emit_identifier(a.name) - self.emit("static char *%s_attributes[] = {" % name, 0) + self.emit("static const char * const %s_attributes[] = {" % name, 0) for a in sum.attributes: self.emit('"%s",' % a.name, 1) self.emit("};", 0) ptype = "void*" if is_simple(sum): ptype = get_c_type(name) - tnames = [] for t in sum.types: - tnames.append(str(t.name)+"_singleton") - tnames = ", *".join(tnames) - self.emit("static PyObject *%s;" % tnames, 0) - self.emit("static PyObject* ast2obj_%s(%s);" % (name, ptype), 0) + self.emit_singleton("%s_singleton" % t.name) + self.emit("static PyObject* ast2obj_%s(astmodulestate *state, %s);" % (name, ptype), 0) for t in sum.types: self.visitConstructor(t, name) def visitConstructor(self, cons, name): - self.emit("static PyTypeObject *%s_type;" % cons.name, 0) if cons.fields: for t in cons.fields: self.emit_identifier(t.name) - self.emit("static char *%s_fields[]={" % cons.name, 0) + self.emit("static const char * const %s_fields[]={" % cons.name, 0) for t in cons.fields: self.emit('"%s",' % t.name, 1) self.emit("};",0) @@ -623,8 +651,6 @@ class PyTypesVisitor(PickleVisitor): def visitModule(self, mod): self.emit(""" -_Py_IDENTIFIER(_fields); -_Py_IDENTIFIER(_attributes); typedef struct { PyObject_HEAD @@ -635,14 +661,19 @@ def visitModule(self, mod): ast_dealloc(AST_object *self) { /* bpo-31095: UnTrack is needed before calling any callbacks */ + PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); Py_CLEAR(self->dict); - Py_TYPE(self)->tp_free(self); + freefunc free_func = PyType_GetSlot(tp, Py_tp_free); + assert(free_func != NULL); + free_func(self); + Py_DECREF(tp); } static int ast_traverse(AST_object *self, visitproc visit, void *arg) { + Py_VISIT(Py_TYPE(self)); Py_VISIT(self->dict); return 0; } @@ -657,10 +688,15 @@ def visitModule(self, mod): static int ast_type_init(PyObject *self, PyObject *args, PyObject *kw) { + astmodulestate *state = get_global_ast_state(); + if (state == NULL) { + return -1; + } + Py_ssize_t i, numfields = 0; int res = -1; PyObject *key, *value, *fields; - if (_PyObject_LookupAttrId((PyObject*)Py_TYPE(self), &PyId__fields, &fields) < 0) { + if (_PyObject_LookupAttr((PyObject*)Py_TYPE(self), state->_fields, &fields) < 0) { goto cleanup; } if (fields) { @@ -674,7 +710,7 @@ def visitModule(self, mod): if (numfields < PyTuple_GET_SIZE(args)) { PyErr_Format(PyExc_TypeError, "%.400s constructor takes at most " "%zd positional argument%s", - Py_TYPE(self)->tp_name, + _PyType_Name(Py_TYPE(self)), numfields, numfields == 1 ? "" : "s"); res = -1; goto cleanup; @@ -728,9 +764,13 @@ def visitModule(self, mod): static PyObject * ast_type_reduce(PyObject *self, PyObject *unused) { - _Py_IDENTIFIER(__dict__); + astmodulestate *state = get_global_ast_state(); + if (state == NULL) { + return NULL; + } + PyObject *dict; - if (_PyObject_LookupAttrId(self, &PyId___dict__, &dict) < 0) { + if (_PyObject_LookupAttr(self, state->__dict__, &dict) < 0) { return NULL; } if (dict) { @@ -739,6 +779,11 @@ def visitModule(self, mod): return Py_BuildValue("O()", Py_TYPE(self)); } +static PyMemberDef ast_type_members[] = { + {"__dictoffset__", T_PYSSIZET, offsetof(AST_object, dict), READONLY}, + {NULL} /* Sentinel */ +}; + static PyMethodDef ast_type_methods[] = { {"__reduce__", ast_type_reduce, METH_NOARGS, NULL}, {NULL} @@ -749,96 +794,79 @@ def visitModule(self, mod): {NULL} }; -static PyTypeObject AST_type = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - "_ast.AST", +static PyType_Slot AST_type_slots[] = { + {Py_tp_dealloc, ast_dealloc}, + {Py_tp_getattro, PyObject_GenericGetAttr}, + {Py_tp_setattro, PyObject_GenericSetAttr}, + {Py_tp_traverse, ast_traverse}, + {Py_tp_clear, ast_clear}, + {Py_tp_members, ast_type_members}, + {Py_tp_methods, ast_type_methods}, + {Py_tp_getset, ast_type_getsets}, + {Py_tp_init, ast_type_init}, + {Py_tp_alloc, PyType_GenericAlloc}, + {Py_tp_new, PyType_GenericNew}, + {Py_tp_free, PyObject_GC_Del}, + {0, 0}, +}; + +static PyType_Spec AST_type_spec = { + "ast.AST", sizeof(AST_object), 0, - (destructor)ast_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - PyObject_GenericSetAttr, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags */ - 0, /* tp_doc */ - (traverseproc)ast_traverse, /* tp_traverse */ - (inquiry)ast_clear, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - ast_type_methods, /* tp_methods */ - 0, /* tp_members */ - ast_type_getsets, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - offsetof(AST_object, dict),/* tp_dictoffset */ - (initproc)ast_type_init, /* tp_init */ - PyType_GenericAlloc, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ - PyObject_GC_Del, /* tp_free */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + AST_type_slots }; - -static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int num_fields) +static PyObject * +make_type(astmodulestate *state, const char *type, PyObject* base, + const char* const* fields, int num_fields, const char *doc) { - _Py_IDENTIFIER(__module__); - _Py_IDENTIFIER(_ast); PyObject *fnames, *result; int i; fnames = PyTuple_New(num_fields); if (!fnames) return NULL; for (i = 0; i < num_fields; i++) { - PyObject *field = PyUnicode_FromString(fields[i]); + PyObject *field = PyUnicode_InternFromString(fields[i]); if (!field) { Py_DECREF(fnames); return NULL; } PyTuple_SET_ITEM(fnames, i, field); } - result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOO}", + result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOOOs}", type, base, - _PyUnicode_FromId(&PyId__fields), fnames, - _PyUnicode_FromId(&PyId___module__), - _PyUnicode_FromId(&PyId__ast)); + state->_fields, fnames, + state->__module__, + state->ast, + state->__doc__, doc); Py_DECREF(fnames); - return (PyTypeObject*)result; + return result; } -static int add_attributes(PyTypeObject* type, char**attrs, int num_fields) +static int +add_attributes(astmodulestate *state, PyObject *type, const char * const *attrs, int num_fields) { int i, result; PyObject *s, *l = PyTuple_New(num_fields); if (!l) return 0; for (i = 0; i < num_fields; i++) { - s = PyUnicode_FromString(attrs[i]); + s = PyUnicode_InternFromString(attrs[i]); if (!s) { Py_DECREF(l); return 0; } PyTuple_SET_ITEM(l, i, s); } - result = _PyObject_SetAttrId((PyObject*)type, &PyId__attributes, l) >= 0; + result = PyObject_SetAttr(type, state->_attributes, l) >= 0; Py_DECREF(l); return result; } /* Conversion AST -> Python */ -static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*)) +static PyObject* ast2obj_list(astmodulestate *state, asdl_seq *seq, PyObject* (*func)(astmodulestate *state, void*)) { Py_ssize_t i, n = asdl_seq_LEN(seq); PyObject *result = PyList_New(n); @@ -846,7 +874,7 @@ def visitModule(self, mod): if (!result) return NULL; for (i = 0; i < n; i++) { - value = func(asdl_seq_GET(seq, i)); + value = func(state, asdl_seq_GET(seq, i)); if (!value) { Py_DECREF(result); return NULL; @@ -856,27 +884,25 @@ def visitModule(self, mod): return result; } -static PyObject* ast2obj_object(void *o) +static PyObject* ast2obj_object(astmodulestate *Py_UNUSED(state), void *o) { if (!o) o = Py_None; Py_INCREF((PyObject*)o); return (PyObject*)o; } -#define ast2obj_singleton ast2obj_object #define ast2obj_constant ast2obj_object #define ast2obj_identifier ast2obj_object #define ast2obj_string ast2obj_object -#define ast2obj_bytes ast2obj_object -static PyObject* ast2obj_int(long b) +static PyObject* ast2obj_int(astmodulestate *Py_UNUSED(state), long b) { return PyLong_FromLong(b); } /* Conversion Python -> AST */ -static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_object(astmodulestate *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena) { if (obj == Py_None) obj = NULL; @@ -891,7 +917,7 @@ def visitModule(self, mod): return 0; } -static int obj2ast_constant(PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_constant(astmodulestate *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena) { if (PyArena_AddPyObject(arena, obj) < 0) { *out = NULL; @@ -902,25 +928,25 @@ def visitModule(self, mod): return 0; } -static int obj2ast_identifier(PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_identifier(astmodulestate *state, PyObject* obj, PyObject** out, PyArena* arena) { if (!PyUnicode_CheckExact(obj) && obj != Py_None) { PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str"); return 1; } - return obj2ast_object(obj, out, arena); + return obj2ast_object(state, obj, out, arena); } -static int obj2ast_string(PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_string(astmodulestate *state, PyObject* obj, PyObject** out, PyArena* arena) { if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) { PyErr_SetString(PyExc_TypeError, "AST string must be of type str"); return 1; } - return obj2ast_object(obj, out, arena); + return obj2ast_object(state, obj, out, arena); } -static int obj2ast_int(PyObject* obj, int* out, PyArena* arena) +static int obj2ast_int(astmodulestate* Py_UNUSED(state), PyObject* obj, int* out, PyArena* arena) { int i; if (!PyLong_Check(obj)) { @@ -935,16 +961,13 @@ def visitModule(self, mod): return 0; } -static int add_ast_fields(void) +static int add_ast_fields(astmodulestate *state) { - PyObject *empty_tuple, *d; - if (PyType_Ready(&AST_type) < 0) - return -1; - d = AST_type.tp_dict; + PyObject *empty_tuple; empty_tuple = PyTuple_New(0); if (!empty_tuple || - _PyDict_SetItemId(d, &PyId__fields, empty_tuple) < 0 || - _PyDict_SetItemId(d, &PyId__attributes, empty_tuple) < 0) { + PyObject_SetAttrString(state->AST_type, "_fields", empty_tuple) < 0 || + PyObject_SetAttrString(state->AST_type, "_attributes", empty_tuple) < 0) { Py_XDECREF(empty_tuple); return -1; } @@ -954,14 +977,16 @@ def visitModule(self, mod): """, 0, reflow=False) - self.emit("static int init_types(void)",0) + self.emit("static int init_types(astmodulestate *state)",0) self.emit("{", 0) - self.emit("static int initialized;", 1) - self.emit("if (initialized) return 1;", 1) - self.emit("if (add_ast_fields() < 0) return 0;", 1) + self.emit("if (state->initialized) return 1;", 1) + self.emit("if (init_identifiers(state) < 0) return 0;", 1) + self.emit("state->AST_type = PyType_FromSpec(&AST_type_spec);", 1) + self.emit("if (!state->AST_type) return 0;", 1) + self.emit("if (add_ast_fields(state) < 0) return 0;", 1) for dfn in mod.dfns: self.visit(dfn) - self.emit("initialized = 1;", 1) + self.emit("state->initialized = 1;", 1) self.emit("return 1;", 1); self.emit("}", 0) @@ -970,24 +995,32 @@ def visitProduct(self, prod, name): fields = name+"_fields" else: fields = "NULL" - self.emit('%s_type = make_type("%s", &AST_type, %s, %d);' % + self.emit('state->%s_type = make_type(state, "%s", state->AST_type, %s, %d,' % (name, name, fields, len(prod.fields)), 1) - self.emit("if (!%s_type) return 0;" % name, 1) + self.emit('%s);' % reflow_c_string(asdl_of(name, prod), 2), 2, reflow=False) + self.emit("if (!state->%s_type) return 0;" % name, 1) + self.emit_type("AST_type") + self.emit_type("%s_type" % name) if prod.attributes: - self.emit("if (!add_attributes(%s_type, %s_attributes, %d)) return 0;" % + self.emit("if (!add_attributes(state, state->%s_type, %s_attributes, %d)) return 0;" % (name, name, len(prod.attributes)), 1) else: - self.emit("if (!add_attributes(%s_type, NULL, 0)) return 0;" % name, 1) + self.emit("if (!add_attributes(state, state->%s_type, NULL, 0)) return 0;" % name, 1) + self.emit_defaults(name, prod.fields, 1) + self.emit_defaults(name, prod.attributes, 1) def visitSum(self, sum, name): - self.emit('%s_type = make_type("%s", &AST_type, NULL, 0);' % + self.emit('state->%s_type = make_type(state, "%s", state->AST_type, NULL, 0,' % (name, name), 1) - self.emit("if (!%s_type) return 0;" % name, 1) + self.emit('%s);' % reflow_c_string(asdl_of(name, sum), 2), 2, reflow=False) + self.emit_type("%s_type" % name) + self.emit("if (!state->%s_type) return 0;" % name, 1) if sum.attributes: - self.emit("if (!add_attributes(%s_type, %s_attributes, %d)) return 0;" % + self.emit("if (!add_attributes(state, state->%s_type, %s_attributes, %d)) return 0;" % (name, name, len(sum.attributes)), 1) else: - self.emit("if (!add_attributes(%s_type, NULL, 0)) return 0;" % name, 1) + self.emit("if (!add_attributes(state, state->%s_type, NULL, 0)) return 0;" % name, 1) + self.emit_defaults(name, sum.attributes, 1) simple = is_simple(sum) for t in sum.types: self.visitConstructor(t, name, simple) @@ -997,40 +1030,76 @@ def visitConstructor(self, cons, name, simple): fields = cons.name+"_fields" else: fields = "NULL" - self.emit('%s_type = make_type("%s", %s_type, %s, %d);' % + self.emit('state->%s_type = make_type(state, "%s", state->%s_type, %s, %d,' % (cons.name, cons.name, name, fields, len(cons.fields)), 1) - self.emit("if (!%s_type) return 0;" % cons.name, 1) + self.emit('%s);' % reflow_c_string(asdl_of(cons.name, cons), 2), 2, reflow=False) + self.emit("if (!state->%s_type) return 0;" % cons.name, 1) + self.emit_type("%s_type" % cons.name) + self.emit_defaults(cons.name, cons.fields, 1) if simple: - self.emit("%s_singleton = PyType_GenericNew(%s_type, NULL, NULL);" % + self.emit("state->%s_singleton = PyType_GenericNew((PyTypeObject *)" + "state->%s_type, NULL, NULL);" % (cons.name, cons.name), 1) - self.emit("if (!%s_singleton) return 0;" % cons.name, 1) + self.emit("if (!state->%s_singleton) return 0;" % cons.name, 1) + + def emit_defaults(self, name, fields, depth): + for field in fields: + if field.opt: + self.emit('if (PyObject_SetAttr(state->%s_type, state->%s, Py_None) == -1)' % + (name, field.name), depth) + self.emit("return 0;", depth+1) class ASTModuleVisitor(PickleVisitor): def visitModule(self, mod): - self.emit("static struct PyModuleDef _astmodule = {", 0) - self.emit(' PyModuleDef_HEAD_INIT, "_ast"', 0) - self.emit("};", 0) - self.emit("PyMODINIT_FUNC", 0) - self.emit("PyInit__ast(void)", 0) + self.emit("static int", 0) + self.emit("astmodule_exec(PyObject *m)", 0) self.emit("{", 0) - self.emit("PyObject *m, *d;", 1) - self.emit("if (!init_types()) return NULL;", 1) - self.emit('m = PyModule_Create(&_astmodule);', 1) - self.emit("if (!m) return NULL;", 1) - self.emit("d = PyModule_GetDict(m);", 1) - self.emit('if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL;', 1) - self.emit('if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0)', 1) - self.emit("return NULL;", 2) - self.emit('if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0)', 1) - self.emit("return NULL;", 2) - self.emit('if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0)', 1) - self.emit("return NULL;", 2) + self.emit('astmodulestate *state = get_ast_state(m);', 1) + self.emit("", 0) + + self.emit("if (!init_types(state)) {", 1) + self.emit("return -1;", 2) + self.emit("}", 1) + self.emit('if (PyModule_AddObject(m, "AST", state->AST_type) < 0) {', 1) + self.emit('return -1;', 2) + self.emit('}', 1) + self.emit('Py_INCREF(state->AST_type);', 1) + self.emit('if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0) {', 1) + self.emit("return -1;", 2) + self.emit('}', 1) + self.emit('if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0) {', 1) + self.emit("return -1;", 2) + self.emit('}', 1) + self.emit('if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0) {', 1) + self.emit("return -1;", 2) + self.emit('}', 1) for dfn in mod.dfns: self.visit(dfn) - self.emit("return m;", 1) + self.emit("return 0;", 1) self.emit("}", 0) + self.emit("", 0) + self.emit(""" +static PyModuleDef_Slot astmodule_slots[] = { + {Py_mod_exec, astmodule_exec}, + {0, NULL} +}; + +static struct PyModuleDef _astmodule = { + PyModuleDef_HEAD_INIT, + .m_name = "_ast", + // The _ast module uses a global state (global_ast_state). + .m_size = 0, + .m_slots = astmodule_slots, +}; + +PyMODINIT_FUNC +PyInit__ast(void) +{ + return PyModuleDef_Init(&_astmodule); +} +""".strip(), 0, reflow=False) def visitProduct(self, prod, name): self.addObj(name) @@ -1044,7 +1113,11 @@ def visitConstructor(self, cons, name): self.addObj(cons.name) def addObj(self, name): - self.emit('if (PyDict_SetItemString(d, "%s", (PyObject*)%s_type) < 0) return NULL;' % (name, name), 1) + self.emit("if (PyModule_AddObject(m, \"%s\", " + "state->%s_type) < 0) {" % (name, name), 1) + self.emit("return -1;", 2) + self.emit('}', 1) + self.emit("Py_INCREF(state->%s_type);" % name, 1) _SPECIALIZED_SEQUENCES = ('stmt', 'expr') @@ -1078,14 +1151,14 @@ class ObjVisitor(PickleVisitor): def func_begin(self, name): ctype = get_c_type(name) self.emit("PyObject*", 0) - self.emit("ast2obj_%s(void* _o)" % (name), 0) + self.emit("ast2obj_%s(astmodulestate *state, void* _o)" % (name), 0) self.emit("{", 0) self.emit("%s o = (%s)_o;" % (ctype, ctype), 1) self.emit("PyObject *result = NULL, *value = NULL;", 1) + self.emit("PyTypeObject *tp;", 1) self.emit('if (!o) {', 1) self.emit("Py_RETURN_NONE;", 2) self.emit("}", 1) - self.emit('', 0) def func_end(self): self.emit("return result;", 1) @@ -1107,46 +1180,44 @@ def visitSum(self, sum, name): self.visitConstructor(t, i + 1, name) self.emit("}", 1) for a in sum.attributes: - self.emit("value = ast2obj_%s(o->%s);" % (a.type, a.name), 1) + self.emit("value = ast2obj_%s(state, o->%s);" % (a.type, a.name), 1) self.emit("if (!value) goto failed;", 1) - self.emit('if (_PyObject_SetAttrId(result, &PyId_%s, value) < 0)' % a.name, 1) + self.emit('if (PyObject_SetAttr(result, state->%s, value) < 0)' % a.name, 1) self.emit('goto failed;', 2) self.emit('Py_DECREF(value);', 1) self.func_end() def simpleSum(self, sum, name): - self.emit("PyObject* ast2obj_%s(%s_ty o)" % (name, name), 0) + self.emit("PyObject* ast2obj_%s(astmodulestate *state, %s_ty o)" % (name, name), 0) self.emit("{", 0) self.emit("switch(o) {", 1) for t in sum.types: self.emit("case %s:" % t.name, 2) - self.emit("Py_INCREF(%s_singleton);" % t.name, 3) - self.emit("return %s_singleton;" % t.name, 3) - self.emit("default:", 2) - self.emit('/* should never happen, but just in case ... */', 3) - code = "PyErr_Format(PyExc_SystemError, \"unknown %s found\");" % name - self.emit(code, 3, reflow=False) - self.emit("return NULL;", 3) + self.emit("Py_INCREF(state->%s_singleton);" % t.name, 3) + self.emit("return state->%s_singleton;" % t.name, 3) self.emit("}", 1) + self.emit("Py_UNREACHABLE();", 1); self.emit("}", 0) def visitProduct(self, prod, name): self.func_begin(name) - self.emit("result = PyType_GenericNew(%s_type, NULL, NULL);" % name, 1); + self.emit("tp = (PyTypeObject *)state->%s_type;" % name, 1) + self.emit("result = PyType_GenericNew(tp, NULL, NULL);", 1); self.emit("if (!result) return NULL;", 1) for field in prod.fields: self.visitField(field, name, 1, True) for a in prod.attributes: - self.emit("value = ast2obj_%s(o->%s);" % (a.type, a.name), 1) + self.emit("value = ast2obj_%s(state, o->%s);" % (a.type, a.name), 1) self.emit("if (!value) goto failed;", 1) - self.emit('if (_PyObject_SetAttrId(result, &PyId_%s, value) < 0)' % a.name, 1) + self.emit("if (PyObject_SetAttr(result, state->%s, value) < 0)" % a.name, 1) self.emit('goto failed;', 2) self.emit('Py_DECREF(value);', 1) self.func_end() def visitConstructor(self, cons, enum, name): self.emit("case %s_kind:" % cons.name, 1) - self.emit("result = PyType_GenericNew(%s_type, NULL, NULL);" % cons.name, 2); + self.emit("tp = (PyTypeObject *)state->%s_type;" % cons.name, 2) + self.emit("result = PyType_GenericNew(tp, NULL, NULL);", 2); self.emit("if (!result) goto failed;", 2) for f in cons.fields: self.visitField(f, cons.name, 2, False) @@ -1161,7 +1232,7 @@ def emit(s, d): value = "o->v.%s.%s" % (name, field.name) self.set(field, value, depth) emit("if (!value) goto failed;", 0) - emit('if (_PyObject_SetAttrId(result, &PyId_%s, value) == -1)' % field.name, 0) + emit("if (PyObject_SetAttr(result, state->%s, value) == -1)" % field.name, 0) emit("goto failed;", 1) emit("Py_DECREF(value);", 0) @@ -1189,14 +1260,14 @@ def set(self, field, value, depth): self.emit("if (!value) goto failed;", depth+1) self.emit("for(i = 0; i < n; i++)", depth+1) # This cannot fail, so no need for error handling - self.emit("PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(%s, i)));" % value, + self.emit("PyList_SET_ITEM(value, i, ast2obj_cmpop(state, (cmpop_ty)asdl_seq_GET(%s, i)));" % value, depth+2, reflow=False) self.emit("}", depth) else: - self.emit("value = ast2obj_list(%s, ast2obj_%s);" % (value, field.type), depth) + self.emit("value = ast2obj_list(state, %s, ast2obj_%s);" % (value, field.type), depth) else: ctype = get_c_type(field.type) - self.emit("value = ast2obj_%s(%s);" % (field.type, value), depth, reflow=False) + self.emit("value = ast2obj_%s(state, %s);" % (field.type, value), depth, reflow=False) class PartingShots(StaticVisitor): @@ -1204,42 +1275,42 @@ class PartingShots(StaticVisitor): CODE = """ PyObject* PyAST_mod2obj(mod_ty t) { - if (!init_types()) + astmodulestate *state = get_global_ast_state(); + if (state == NULL) { return NULL; - return ast2obj_mod(t); + } + return ast2obj_mod(state, t); } /* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode) { - PyObject *req_type[3]; - char *req_name[] = {"Module", "Expression", "Interactive"}; + const char * const 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; + astmodulestate *state = get_global_ast_state(); + PyObject *req_type[3]; + req_type[0] = state->Module_type; + req_type[1] = state->Expression_type; + req_type[2] = state->Interactive_type; assert(0 <= mode && mode <= 2); - if (!init_types()) - return NULL; - isinstance = PyObject_IsInstance(ast, req_type[mode]); if (isinstance == -1) return NULL; if (!isinstance) { PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s", - req_name[mode], Py_TYPE(ast)->tp_name); + req_name[mode], _PyType_Name(Py_TYPE(ast))); return NULL; } mod_ty res = NULL; - if (obj2ast_mod(ast, &res, arena) != 0) + if (obj2ast_mod(state, ast, &res, arena) != 0) return NULL; else return res; @@ -1247,9 +1318,11 @@ class PartingShots(StaticVisitor): int PyAST_Check(PyObject* obj) { - if (!init_types()) + astmodulestate *state = get_global_ast_state(); + if (state == NULL) { return -1; - return PyObject_IsInstance(obj, (PyObject*)&AST_type); + } + return PyObject_IsInstance(obj, state->AST_type); } """ @@ -1262,87 +1335,160 @@ def visit(self, object): v.visit(object) v.emit("", 0) -common_msg = "/* File automatically generated by %s. */\n\n" -def main(srcfile, dump_module=False): - argv0 = sys.argv[0] - components = argv0.split(os.sep) - argv0 = os.sep.join(components[-2:]) - auto_gen_msg = common_msg % argv0 - mod = asdl.parse(srcfile) +def generate_module_def(f, mod): + # Gather all the data needed for ModuleSpec + visitor_list = set() + with open(os.devnull, "w") as devnull: + visitor = PyTypesDeclareVisitor(devnull) + visitor.visit(mod) + visitor_list.add(visitor) + visitor = PyTypesVisitor(devnull) + visitor.visit(mod) + visitor_list.add(visitor) + + state_strings = { + "ast", + "_fields", + "__doc__", + "__dict__", + "__module__", + "_attributes", + } + module_state = state_strings.copy() + for visitor in visitor_list: + for identifier in visitor.identifiers: + module_state.add(identifier) + state_strings.add(identifier) + for singleton in visitor.singletons: + module_state.add(singleton) + for tp in visitor.types: + module_state.add(tp) + state_strings = sorted(state_strings) + module_state = sorted(module_state) + f.write('typedef struct {\n') + f.write(' int initialized;\n') + for s in module_state: + f.write(' PyObject *' + s + ';\n') + f.write('} astmodulestate;\n\n') + f.write(""" +// Forward declaration +static int init_types(astmodulestate *state); + +// bpo-41194, bpo-41261, bpo-41631: The _ast module uses a global state. +static astmodulestate global_ast_state = {0}; + +static astmodulestate* +get_global_ast_state(void) +{ + astmodulestate* state = &global_ast_state; + if (!init_types(state)) { + return NULL; + } + return state; +} + +static astmodulestate* +get_ast_state(PyObject* Py_UNUSED(module)) +{ + astmodulestate* state = get_global_ast_state(); + // get_ast_state() must only be called after _ast module is imported, + // and astmodule_exec() calls init_types() + assert(state != NULL); + return state; +} + +void _PyAST_Fini() +{ + astmodulestate* state = &global_ast_state; +""") + for s in module_state: + f.write(" Py_CLEAR(state->" + s + ');\n') + f.write(""" + state->initialized = 0; +} + +""") + f.write('static int init_identifiers(astmodulestate *state)\n') + f.write('{\n') + for identifier in state_strings: + f.write(' if ((state->' + identifier) + f.write(' = PyUnicode_InternFromString("') + f.write(identifier + '")) == NULL) return 0;\n') + f.write(' return 1;\n') + f.write('};\n\n') + +def write_header(f, mod): + f.write('#ifndef Py_PYTHON_AST_H\n') + f.write('#define Py_PYTHON_AST_H\n') + f.write('#ifdef __cplusplus\n') + f.write('extern "C" {\n') + f.write('#endif\n') + f.write('\n') + f.write('#ifndef Py_LIMITED_API\n') + f.write('#include "asdl.h"\n') + f.write('\n') + f.write('#undef Yield /* undefine macro conflicting with */\n') + f.write('\n') + c = ChainOfVisitors(TypeDefVisitor(f), + StructVisitor(f)) + c.visit(mod) + f.write("// Note: these macros affect function definitions, not only call sites.\n") + PrototypeVisitor(f).visit(mod) + f.write("\n") + f.write("PyObject* PyAST_mod2obj(mod_ty t);\n") + f.write("mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode);\n") + f.write("int PyAST_Check(PyObject* obj);\n") + f.write("#endif /* !Py_LIMITED_API */\n") + f.write('\n') + f.write('#ifdef __cplusplus\n') + f.write('}\n') + f.write('#endif\n') + f.write('#endif /* !Py_PYTHON_AST_H */\n') + +def write_source(f, mod): + f.write('#include \n') + f.write('\n') + f.write('#include "Python.h"\n') + f.write('#include "%s-ast.h"\n' % mod.name) + f.write('#include "structmember.h" // PyMemberDef\n') + f.write('\n') + + generate_module_def(f, mod) + + v = ChainOfVisitors( + PyTypesDeclareVisitor(f), + PyTypesVisitor(f), + Obj2ModPrototypeVisitor(f), + FunctionVisitor(f), + ObjVisitor(f), + Obj2ModVisitor(f), + ASTModuleVisitor(f), + PartingShots(f), + ) + v.visit(mod) + +def main(input_file, c_file, h_file, dump_module=False): + auto_gen_msg = AUTOGEN_MESSAGE.format("/".join(Path(__file__).parts[-2:])) + mod = asdl.parse(input_file) if dump_module: print('Parsed Module:') print(mod) if not asdl.check(mod): sys.exit(1) - if H_FILE: - with open(H_FILE, "w") as f: - f.write(auto_gen_msg) - f.write('#ifndef Py_PYTHON_AST_H\n') - f.write('#define Py_PYTHON_AST_H\n') - f.write('#ifdef __cplusplus\n') - f.write('extern "C" {\n') - f.write('#endif\n') - f.write('\n') - f.write('#include "asdl.h"\n') - f.write('\n') - f.write('#undef Yield /* undefine macro conflicting with */\n') - f.write('\n') - c = ChainOfVisitors(TypeDefVisitor(f), - StructVisitor(f)) - - c.visit(mod) - f.write("// Note: these macros affect function definitions, not only call sites.\n") - PrototypeVisitor(f).visit(mod) - f.write("\n") - f.write("PyObject* PyAST_mod2obj(mod_ty t);\n") - f.write("mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode);\n") - f.write("int PyAST_Check(PyObject* obj);\n") - f.write('\n') - f.write('#ifdef __cplusplus\n') - f.write('}\n') - f.write('#endif\n') - f.write('#endif /* !Py_PYTHON_AST_H */\n') - - if C_FILE: - with open(C_FILE, "w") as f: - f.write(auto_gen_msg) - f.write('#include \n') - f.write('\n') - f.write('#include "Python.h"\n') - f.write('#include "%s-ast.h"\n' % mod.name) - f.write('\n') - f.write("static PyTypeObject AST_type;\n") - v = ChainOfVisitors( - PyTypesDeclareVisitor(f), - PyTypesVisitor(f), - Obj2ModPrototypeVisitor(f), - FunctionVisitor(f), - ObjVisitor(f), - Obj2ModVisitor(f), - ASTModuleVisitor(f), - PartingShots(f), - ) - v.visit(mod) + for file, writer in (c_file, write_source), (h_file, write_header): + if file is not None: + with file.open("w") as f: + f.write(auto_gen_msg) + writer(f, mod) + print(file, "regenerated.") if __name__ == "__main__": - import getopt - - H_FILE = '' - C_FILE = '' - dump_module = False - opts, args = getopt.getopt(sys.argv[1:], "dh:c:") - for o, v in opts: - if o == '-h': - H_FILE = v - elif o == '-c': - C_FILE = v - elif o == '-d': - dump_module = True - if H_FILE and C_FILE: - print('Must specify exactly one output file') - sys.exit(1) - elif len(args) != 1: - print('Must specify single input file') - sys.exit(1) - main(args[0], dump_module) + parser = ArgumentParser() + parser.add_argument("input_file", type=Path) + parser.add_argument("-C", "--c-file", type=Path, default=None) + parser.add_argument("-H", "--h-file", type=Path, default=None) + parser.add_argument("-d", "--dump-module", action="store_true") + + options = parser.parse_args() + main(**vars(options)) diff --git a/Parser/grammar1.c b/Parser/grammar1.c index e0b8fbb8b82886bea64db250d46ad9e9d84e3e33..c702040efdfabec15de6b192cbd263e290232319 100644 --- a/Parser/grammar1.c +++ b/Parser/grammar1.c @@ -41,7 +41,7 @@ PyGrammar_LabelRepr(label *lb) } } else { - Py_FatalError("invalid label"); + Py_FatalError("invalid grammar label"); return NULL; } } diff --git a/Parser/listnode.c b/Parser/listnode.c index 8f1a1163b63d5c137b0d0e3b01ac655339a8c73b..c806b98e48c35ed6dacc2699d76f84e1a2fd73e7 100644 --- a/Parser/listnode.c +++ b/Parser/listnode.c @@ -2,6 +2,8 @@ /* List a node on a file */ #include "Python.h" +#include "pycore_interp.h" // PyInterpreterState.parser +#include "pycore_pystate.h" // _PyInterpreterState_GET() #include "token.h" #include "node.h" @@ -15,19 +17,21 @@ PyNode_ListTree(node *n) listnode(stdout, n); } -static int level, atbol; - static void listnode(FILE *fp, node *n) { - level = 0; - atbol = 1; + PyInterpreterState *interp = _PyInterpreterState_GET(); + + interp->parser.listnode.level = 0; + interp->parser.listnode.atbol = 1; list1node(fp, n); } static void list1node(FILE *fp, node *n) { + PyInterpreterState *interp; + if (n == NULL) return; if (ISNONTERMINAL(TYPE(n))) { @@ -36,25 +40,26 @@ list1node(FILE *fp, node *n) list1node(fp, CHILD(n, i)); } else if (ISTERMINAL(TYPE(n))) { + interp = _PyInterpreterState_GET(); switch (TYPE(n)) { case INDENT: - ++level; + interp->parser.listnode.level++; break; case DEDENT: - --level; + interp->parser.listnode.level--; break; default: - if (atbol) { + if (interp->parser.listnode.atbol) { int i; - for (i = 0; i < level; ++i) + for (i = 0; i < interp->parser.listnode.level; ++i) fprintf(fp, "\t"); - atbol = 0; + interp->parser.listnode.atbol = 0; } if (TYPE(n) == NEWLINE) { if (STR(n) != NULL) fprintf(fp, "%s", STR(n)); fprintf(fp, "\n"); - atbol = 1; + interp->parser.listnode.atbol = 1; } else fprintf(fp, "%s ", STR(n)); diff --git a/Parser/myreadline.c b/Parser/myreadline.c index d7ed357faa383274e33dd00241b071a94c4630e2..143b41f1eab95ebfa3485953ee4eebea110c7c95 100644 --- a/Parser/myreadline.c +++ b/Parser/myreadline.c @@ -10,16 +10,15 @@ */ #include "Python.h" -#include "pycore_pystate.h" +#include "pycore_pystate.h" // _PyThreadState_GET() #ifdef MS_WINDOWS -#define WIN32_LEAN_AND_MEAN -#include "windows.h" +# define WIN32_LEAN_AND_MEAN +# include "windows.h" #endif /* MS_WINDOWS */ PyThreadState* _PyOS_ReadlineTState = NULL; -#include "pythread.h" static PyThread_type_lock _PyOS_ReadlineLock = NULL; int (*PyOS_InputHook)(void) = NULL; @@ -292,37 +291,16 @@ PyOS_StdioReadline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt) } #endif - n = 100; - p = (char *)PyMem_RawMalloc(n); - if (p == NULL) { - PyEval_RestoreThread(tstate); - PyErr_NoMemory(); - PyEval_SaveThread(); - return NULL; - } - fflush(sys_stdout); if (prompt) { fprintf(stderr, "%s", prompt); } fflush(stderr); - switch (my_fgets(tstate, p, (int)n, sys_stdin)) { - case 0: /* Normal case */ - break; - case 1: /* Interrupt */ - PyMem_RawFree(p); - return NULL; - case -1: /* EOF */ - case -2: /* Error */ - default: /* Shouldn't happen */ - *p = '\0'; - break; - } - - n = strlen(p); - while (n > 0 && p[n-1] != '\n') { - size_t incr = n+2; + n = 0; + p = NULL; + do { + size_t incr = (n > 0) ? n + 2 : 100; if (incr > INT_MAX) { PyMem_RawFree(p); PyEval_RestoreThread(tstate); @@ -330,7 +308,6 @@ PyOS_StdioReadline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt) PyEval_SaveThread(); return NULL; } - pr = (char *)PyMem_RawRealloc(p, n + incr); if (pr == NULL) { PyMem_RawFree(p); @@ -340,12 +317,18 @@ PyOS_StdioReadline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt) return NULL; } p = pr; - - if (my_fgets(tstate, p+n, (int)incr, sys_stdin) != 0) { + int err = my_fgets(tstate, p + n, (int)incr, sys_stdin); + if (err == 1) { + // Interrupt + PyMem_RawFree(p); + return NULL; + } else if (err != 0) { + // EOF or error + p[n] = '\0'; break; } - n += strlen(p+n); - } + n += strlen(p + n); + } while (p[n-1] != '\n'); pr = (char *)PyMem_RawRealloc(p, n+1); if (pr == NULL) { diff --git a/Parser/node.c b/Parser/node.c index f1b70e0f6815be206c96b18b56baa6b6a0bf4a9f..8789e01e9b848c34303edd9cf21e15c56a052a1c 100644 --- a/Parser/node.c +++ b/Parser/node.c @@ -14,6 +14,7 @@ PyNode_New(int type) n->n_str = NULL; n->n_lineno = 0; n->n_end_lineno = 0; + n->n_col_offset = 0; n->n_end_col_offset = -1; n->n_nchildren = 0; n->n_child = NULL; diff --git a/Parser/parser.c b/Parser/parser.c index 227b9184f471d22af132480ff26d18ef0a06e24c..a61b2f5ebf7a11f7e7b68c0fe7dea754f3123e1c 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -54,8 +54,9 @@ s_push(stack *s, const dfa *d, node *parent) static void s_pop(stack *s) { - if (s_empty(s)) - Py_FatalError("s_pop: parser stack underflow -- FATAL"); + if (s_empty(s)) { + Py_FatalError("parser stack underflow"); + } s->s_top++; } diff --git a/Parser/parsetok.c b/Parser/parsetok.c index 2bb733d0dcd66bc66eab1569c1335ec3511c4a35..1ecb2c4a16df9fe6987eabb57eab0178f3398ad7 100644 --- a/Parser/parsetok.c +++ b/Parser/parsetok.c @@ -37,11 +37,13 @@ growable_comment_array_init(growable_comment_array *arr, size_t initial_size) { static int growable_comment_array_add(growable_comment_array *arr, int lineno, char *comment) { if (arr->num_items >= arr->size) { - arr->size *= 2; - arr->items = realloc(arr->items, arr->size * sizeof(*arr->items)); - if (!arr->items) { + size_t new_size = arr->size * 2; + void *new_items_array = realloc(arr->items, new_size * sizeof(*arr->items)); + if (!new_items_array) { return 0; } + arr->items = new_items_array; + arr->size = new_size; } arr->items[arr->num_items].lineno = lineno; @@ -207,24 +209,6 @@ PyParser_ParseFileFlagsEx(FILE *fp, const char *filename, return n; } -#ifdef PY_PARSER_REQUIRES_FUTURE_KEYWORD -#if 0 -static const char with_msg[] = -"%s:%d: Warning: 'with' will become a reserved keyword in Python 2.6\n"; - -static const char as_msg[] = -"%s:%d: Warning: 'as' will become a reserved keyword in Python 2.6\n"; - -static void -warn(const char *msg, const char *filename, int lineno) -{ - if (filename == NULL) - filename = ""; - PySys_WriteStderr(msg, filename, lineno); -} -#endif -#endif - /* Parse input coming from the given tokenizer structure. Return error code. */ @@ -258,7 +242,7 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, #endif for (;;) { - char *a, *b; + const char *a, *b; int type; size_t len; char *str; @@ -267,25 +251,7 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, const char *line_start; type = PyTokenizer_Get(tok, &a, &b); - if (type == ERRORTOKEN) { - err_ret->error = tok->done; - break; - } - if (type == ENDMARKER && started) { - type = NEWLINE; /* Add an extra newline */ - started = 0; - /* Add the right number of dedent tokens, - except if a certain flag is given -- - codeop.py uses this. */ - if (tok->indent && - !(*flags & PyPARSE_DONT_IMPLY_DEDENT)) - { - tok->pendin = -tok->indent; - tok->indent = 0; - } - } - else - started = 1; + len = (a != NULL && b != NULL) ? b - a : 0; str = (char *) PyObject_MALLOC(len + 1); if (str == NULL) { @@ -344,10 +310,34 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, continue; } + if (type == ERRORTOKEN) { + err_ret->error = tok->done; + break; + } + if (type == ENDMARKER && started) { + type = NEWLINE; /* Add an extra newline */ + started = 0; + /* Add the right number of dedent tokens, + except if a certain flag is given -- + codeop.py uses this. */ + if (tok->indent && + !(*flags & PyPARSE_DONT_IMPLY_DEDENT)) + { + tok->pendin = -tok->indent; + tok->indent = 0; + } + } + else { + started = 1; + } + if ((err_ret->error = PyParser_AddToken(ps, (int)type, str, lineno, col_offset, tok->lineno, end_col_offset, &(err_ret->expected))) != E_OK) { + if (tok->done == E_EOF && !ISWHITESPACE(type)) { + tok->done = E_SYNTAX; + } if (err_ret->error != E_DONE) { PyObject_FREE(str); err_ret->token = type; @@ -389,7 +379,7 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, buffer after parsing. Trailing whitespace and comments are OK. */ if (err_ret->error == E_DONE && start == single_input) { - char *cur = tok->cur; + const char *cur = tok->cur; char c = *tok->cur; for (;;) { diff --git a/Parser/pegen/parse.c b/Parser/pegen/parse.c new file mode 100644 index 0000000000000000000000000000000000000000..98008a5fc1462a6a4b8f44b979407d40a8522b1a --- /dev/null +++ b/Parser/pegen/parse.c @@ -0,0 +1,25021 @@ +// @generated by pegen.py from ./Grammar/python.gram +#include "pegen.h" + +#if defined(Py_DEBUG) && defined(Py_BUILD_CORE) +extern int Py_DebugFlag; +#define D(x) if (Py_DebugFlag) x; +#else +#define D(x) +#endif +static const int n_keyword_lists = 15; +static KeywordToken *reserved_keywords[] = { + (KeywordToken[]) {{NULL, -1}}, + (KeywordToken[]) {{NULL, -1}}, + (KeywordToken[]) { + {"if", 510}, + {"in", 518}, + {"as", 520}, + {"is", 527}, + {"or", 532}, + {NULL, -1}, + }, + (KeywordToken[]) { + {"del", 503}, + {"try", 511}, + {"for", 517}, + {"def", 523}, + {"not", 526}, + {"and", 533}, + {NULL, -1}, + }, + (KeywordToken[]) { + {"pass", 502}, + {"from", 514}, + {"elif", 515}, + {"else", 516}, + {"with", 519}, + {"True", 528}, + {"None", 530}, + {NULL, -1}, + }, + (KeywordToken[]) { + {"raise", 501}, + {"yield", 504}, + {"break", 506}, + {"while", 512}, + {"class", 524}, + {"False", 529}, + {NULL, -1}, + }, + (KeywordToken[]) { + {"return", 500}, + {"assert", 505}, + {"global", 508}, + {"import", 513}, + {"except", 521}, + {"lambda", 525}, + {NULL, -1}, + }, + (KeywordToken[]) { + {"finally", 522}, + {NULL, -1}, + }, + (KeywordToken[]) { + {"continue", 507}, + {"nonlocal", 509}, + {NULL, -1}, + }, + (KeywordToken[]) {{NULL, -1}}, + (KeywordToken[]) {{NULL, -1}}, + (KeywordToken[]) {{NULL, -1}}, + (KeywordToken[]) {{NULL, -1}}, + (KeywordToken[]) {{NULL, -1}}, + (KeywordToken[]) { + {"__peg_parser__", 531}, + {NULL, -1}, + }, +}; +#define file_type 1000 +#define interactive_type 1001 +#define eval_type 1002 +#define func_type_type 1003 +#define fstring_type 1004 +#define type_expressions_type 1005 +#define statements_type 1006 +#define statement_type 1007 +#define statement_newline_type 1008 +#define simple_stmt_type 1009 +#define small_stmt_type 1010 +#define compound_stmt_type 1011 +#define assignment_type 1012 +#define augassign_type 1013 +#define global_stmt_type 1014 +#define nonlocal_stmt_type 1015 +#define yield_stmt_type 1016 +#define assert_stmt_type 1017 +#define del_stmt_type 1018 +#define import_stmt_type 1019 +#define import_name_type 1020 +#define import_from_type 1021 +#define import_from_targets_type 1022 +#define import_from_as_names_type 1023 +#define import_from_as_name_type 1024 +#define dotted_as_names_type 1025 +#define dotted_as_name_type 1026 +#define dotted_name_type 1027 // Left-recursive +#define if_stmt_type 1028 +#define elif_stmt_type 1029 +#define else_block_type 1030 +#define while_stmt_type 1031 +#define for_stmt_type 1032 +#define with_stmt_type 1033 +#define with_item_type 1034 +#define try_stmt_type 1035 +#define except_block_type 1036 +#define finally_block_type 1037 +#define return_stmt_type 1038 +#define raise_stmt_type 1039 +#define function_def_type 1040 +#define function_def_raw_type 1041 +#define func_type_comment_type 1042 +#define params_type 1043 +#define parameters_type 1044 +#define slash_no_default_type 1045 +#define slash_with_default_type 1046 +#define star_etc_type 1047 +#define kwds_type 1048 +#define param_no_default_type 1049 +#define param_with_default_type 1050 +#define param_maybe_default_type 1051 +#define param_type 1052 +#define annotation_type 1053 +#define default_type 1054 +#define decorators_type 1055 +#define class_def_type 1056 +#define class_def_raw_type 1057 +#define block_type 1058 +#define star_expressions_type 1059 +#define star_expression_type 1060 +#define star_named_expressions_type 1061 +#define star_named_expression_type 1062 +#define named_expression_type 1063 +#define annotated_rhs_type 1064 +#define expressions_type 1065 +#define expression_type 1066 +#define lambdef_type 1067 +#define lambda_params_type 1068 +#define lambda_parameters_type 1069 +#define lambda_slash_no_default_type 1070 +#define lambda_slash_with_default_type 1071 +#define lambda_star_etc_type 1072 +#define lambda_kwds_type 1073 +#define lambda_param_no_default_type 1074 +#define lambda_param_with_default_type 1075 +#define lambda_param_maybe_default_type 1076 +#define lambda_param_type 1077 +#define disjunction_type 1078 +#define conjunction_type 1079 +#define inversion_type 1080 +#define comparison_type 1081 +#define compare_op_bitwise_or_pair_type 1082 +#define eq_bitwise_or_type 1083 +#define noteq_bitwise_or_type 1084 +#define lte_bitwise_or_type 1085 +#define lt_bitwise_or_type 1086 +#define gte_bitwise_or_type 1087 +#define gt_bitwise_or_type 1088 +#define notin_bitwise_or_type 1089 +#define in_bitwise_or_type 1090 +#define isnot_bitwise_or_type 1091 +#define is_bitwise_or_type 1092 +#define bitwise_or_type 1093 // Left-recursive +#define bitwise_xor_type 1094 // Left-recursive +#define bitwise_and_type 1095 // Left-recursive +#define shift_expr_type 1096 // Left-recursive +#define sum_type 1097 // Left-recursive +#define term_type 1098 // Left-recursive +#define factor_type 1099 +#define power_type 1100 +#define await_primary_type 1101 +#define primary_type 1102 // Left-recursive +#define slices_type 1103 +#define slice_type 1104 +#define atom_type 1105 +#define strings_type 1106 +#define list_type 1107 +#define listcomp_type 1108 +#define tuple_type 1109 +#define group_type 1110 +#define genexp_type 1111 +#define set_type 1112 +#define setcomp_type 1113 +#define dict_type 1114 +#define dictcomp_type 1115 +#define double_starred_kvpairs_type 1116 +#define double_starred_kvpair_type 1117 +#define kvpair_type 1118 +#define for_if_clauses_type 1119 +#define for_if_clause_type 1120 +#define yield_expr_type 1121 +#define arguments_type 1122 +#define args_type 1123 +#define kwargs_type 1124 +#define starred_expression_type 1125 +#define kwarg_or_starred_type 1126 +#define kwarg_or_double_starred_type 1127 +#define star_targets_type 1128 +#define star_targets_list_seq_type 1129 +#define star_targets_tuple_seq_type 1130 +#define star_target_type 1131 +#define target_with_star_atom_type 1132 +#define star_atom_type 1133 +#define single_target_type 1134 +#define single_subscript_attribute_target_type 1135 +#define del_targets_type 1136 +#define del_target_type 1137 +#define del_t_atom_type 1138 +#define targets_type 1139 +#define target_type 1140 +#define t_primary_type 1141 // Left-recursive +#define t_lookahead_type 1142 +#define t_atom_type 1143 +#define invalid_arguments_type 1144 +#define invalid_kwarg_type 1145 +#define invalid_named_expression_type 1146 +#define invalid_assignment_type 1147 +#define invalid_ann_assign_target_type 1148 +#define invalid_del_stmt_type 1149 +#define invalid_block_type 1150 +#define invalid_primary_type 1151 // Left-recursive +#define invalid_comprehension_type 1152 +#define invalid_dict_comprehension_type 1153 +#define invalid_parameters_type 1154 +#define invalid_lambda_parameters_type 1155 +#define invalid_star_etc_type 1156 +#define invalid_lambda_star_etc_type 1157 +#define invalid_double_type_comments_type 1158 +#define invalid_with_item_type 1159 +#define invalid_for_target_type 1160 +#define invalid_group_type 1161 +#define invalid_import_from_targets_type 1162 +#define _loop0_1_type 1163 +#define _loop0_2_type 1164 +#define _loop0_4_type 1165 +#define _gather_3_type 1166 +#define _loop0_6_type 1167 +#define _gather_5_type 1168 +#define _loop0_8_type 1169 +#define _gather_7_type 1170 +#define _loop0_10_type 1171 +#define _gather_9_type 1172 +#define _loop1_11_type 1173 +#define _loop0_13_type 1174 +#define _gather_12_type 1175 +#define _tmp_14_type 1176 +#define _tmp_15_type 1177 +#define _tmp_16_type 1178 +#define _tmp_17_type 1179 +#define _tmp_18_type 1180 +#define _tmp_19_type 1181 +#define _tmp_20_type 1182 +#define _tmp_21_type 1183 +#define _loop1_22_type 1184 +#define _tmp_23_type 1185 +#define _tmp_24_type 1186 +#define _loop0_26_type 1187 +#define _gather_25_type 1188 +#define _loop0_28_type 1189 +#define _gather_27_type 1190 +#define _tmp_29_type 1191 +#define _tmp_30_type 1192 +#define _loop0_31_type 1193 +#define _loop1_32_type 1194 +#define _loop0_34_type 1195 +#define _gather_33_type 1196 +#define _tmp_35_type 1197 +#define _loop0_37_type 1198 +#define _gather_36_type 1199 +#define _tmp_38_type 1200 +#define _loop0_40_type 1201 +#define _gather_39_type 1202 +#define _loop0_42_type 1203 +#define _gather_41_type 1204 +#define _loop0_44_type 1205 +#define _gather_43_type 1206 +#define _loop0_46_type 1207 +#define _gather_45_type 1208 +#define _tmp_47_type 1209 +#define _loop1_48_type 1210 +#define _tmp_49_type 1211 +#define _tmp_50_type 1212 +#define _tmp_51_type 1213 +#define _tmp_52_type 1214 +#define _tmp_53_type 1215 +#define _loop0_54_type 1216 +#define _loop0_55_type 1217 +#define _loop0_56_type 1218 +#define _loop1_57_type 1219 +#define _loop0_58_type 1220 +#define _loop1_59_type 1221 +#define _loop1_60_type 1222 +#define _loop1_61_type 1223 +#define _loop0_62_type 1224 +#define _loop1_63_type 1225 +#define _loop0_64_type 1226 +#define _loop1_65_type 1227 +#define _loop0_66_type 1228 +#define _loop1_67_type 1229 +#define _loop1_68_type 1230 +#define _tmp_69_type 1231 +#define _loop1_70_type 1232 +#define _loop0_72_type 1233 +#define _gather_71_type 1234 +#define _loop1_73_type 1235 +#define _loop0_74_type 1236 +#define _loop0_75_type 1237 +#define _loop0_76_type 1238 +#define _loop1_77_type 1239 +#define _loop0_78_type 1240 +#define _loop1_79_type 1241 +#define _loop1_80_type 1242 +#define _loop1_81_type 1243 +#define _loop0_82_type 1244 +#define _loop1_83_type 1245 +#define _loop0_84_type 1246 +#define _loop1_85_type 1247 +#define _loop0_86_type 1248 +#define _loop1_87_type 1249 +#define _loop1_88_type 1250 +#define _loop1_89_type 1251 +#define _loop1_90_type 1252 +#define _tmp_91_type 1253 +#define _loop0_93_type 1254 +#define _gather_92_type 1255 +#define _tmp_94_type 1256 +#define _tmp_95_type 1257 +#define _tmp_96_type 1258 +#define _tmp_97_type 1259 +#define _loop1_98_type 1260 +#define _tmp_99_type 1261 +#define _tmp_100_type 1262 +#define _loop0_102_type 1263 +#define _gather_101_type 1264 +#define _loop1_103_type 1265 +#define _loop0_104_type 1266 +#define _loop0_105_type 1267 +#define _loop0_107_type 1268 +#define _gather_106_type 1269 +#define _tmp_108_type 1270 +#define _loop0_110_type 1271 +#define _gather_109_type 1272 +#define _loop0_112_type 1273 +#define _gather_111_type 1274 +#define _loop0_114_type 1275 +#define _gather_113_type 1276 +#define _loop0_116_type 1277 +#define _gather_115_type 1278 +#define _loop0_117_type 1279 +#define _loop0_119_type 1280 +#define _gather_118_type 1281 +#define _loop1_120_type 1282 +#define _tmp_121_type 1283 +#define _loop0_123_type 1284 +#define _gather_122_type 1285 +#define _loop0_125_type 1286 +#define _gather_124_type 1287 +#define _tmp_126_type 1288 +#define _loop0_127_type 1289 +#define _loop0_128_type 1290 +#define _loop0_129_type 1291 +#define _tmp_130_type 1292 +#define _tmp_131_type 1293 +#define _loop0_132_type 1294 +#define _tmp_133_type 1295 +#define _loop0_134_type 1296 +#define _tmp_135_type 1297 +#define _tmp_136_type 1298 +#define _tmp_137_type 1299 +#define _tmp_138_type 1300 +#define _tmp_139_type 1301 +#define _tmp_140_type 1302 +#define _tmp_141_type 1303 +#define _tmp_142_type 1304 +#define _tmp_143_type 1305 +#define _tmp_144_type 1306 +#define _tmp_145_type 1307 +#define _tmp_146_type 1308 +#define _tmp_147_type 1309 +#define _tmp_148_type 1310 +#define _tmp_149_type 1311 +#define _tmp_150_type 1312 +#define _tmp_151_type 1313 +#define _tmp_152_type 1314 +#define _loop1_153_type 1315 +#define _loop1_154_type 1316 +#define _tmp_155_type 1317 +#define _tmp_156_type 1318 + +static mod_ty file_rule(Parser *p); +static mod_ty interactive_rule(Parser *p); +static mod_ty eval_rule(Parser *p); +static mod_ty func_type_rule(Parser *p); +static expr_ty fstring_rule(Parser *p); +static asdl_seq* type_expressions_rule(Parser *p); +static asdl_seq* statements_rule(Parser *p); +static asdl_seq* statement_rule(Parser *p); +static asdl_seq* statement_newline_rule(Parser *p); +static asdl_seq* simple_stmt_rule(Parser *p); +static stmt_ty small_stmt_rule(Parser *p); +static stmt_ty compound_stmt_rule(Parser *p); +static stmt_ty assignment_rule(Parser *p); +static AugOperator* augassign_rule(Parser *p); +static stmt_ty global_stmt_rule(Parser *p); +static stmt_ty nonlocal_stmt_rule(Parser *p); +static stmt_ty yield_stmt_rule(Parser *p); +static stmt_ty assert_stmt_rule(Parser *p); +static stmt_ty del_stmt_rule(Parser *p); +static stmt_ty import_stmt_rule(Parser *p); +static stmt_ty import_name_rule(Parser *p); +static stmt_ty import_from_rule(Parser *p); +static asdl_seq* import_from_targets_rule(Parser *p); +static asdl_seq* import_from_as_names_rule(Parser *p); +static alias_ty import_from_as_name_rule(Parser *p); +static asdl_seq* dotted_as_names_rule(Parser *p); +static alias_ty dotted_as_name_rule(Parser *p); +static expr_ty dotted_name_rule(Parser *p); +static stmt_ty if_stmt_rule(Parser *p); +static stmt_ty elif_stmt_rule(Parser *p); +static asdl_seq* else_block_rule(Parser *p); +static stmt_ty while_stmt_rule(Parser *p); +static stmt_ty for_stmt_rule(Parser *p); +static stmt_ty with_stmt_rule(Parser *p); +static withitem_ty with_item_rule(Parser *p); +static stmt_ty try_stmt_rule(Parser *p); +static excepthandler_ty except_block_rule(Parser *p); +static asdl_seq* finally_block_rule(Parser *p); +static stmt_ty return_stmt_rule(Parser *p); +static stmt_ty raise_stmt_rule(Parser *p); +static stmt_ty function_def_rule(Parser *p); +static stmt_ty function_def_raw_rule(Parser *p); +static Token* func_type_comment_rule(Parser *p); +static arguments_ty params_rule(Parser *p); +static arguments_ty parameters_rule(Parser *p); +static asdl_seq* slash_no_default_rule(Parser *p); +static SlashWithDefault* slash_with_default_rule(Parser *p); +static StarEtc* star_etc_rule(Parser *p); +static arg_ty kwds_rule(Parser *p); +static arg_ty param_no_default_rule(Parser *p); +static NameDefaultPair* param_with_default_rule(Parser *p); +static NameDefaultPair* param_maybe_default_rule(Parser *p); +static arg_ty param_rule(Parser *p); +static expr_ty annotation_rule(Parser *p); +static expr_ty default_rule(Parser *p); +static asdl_seq* decorators_rule(Parser *p); +static stmt_ty class_def_rule(Parser *p); +static stmt_ty class_def_raw_rule(Parser *p); +static asdl_seq* block_rule(Parser *p); +static expr_ty star_expressions_rule(Parser *p); +static expr_ty star_expression_rule(Parser *p); +static asdl_seq* star_named_expressions_rule(Parser *p); +static expr_ty star_named_expression_rule(Parser *p); +static expr_ty named_expression_rule(Parser *p); +static expr_ty annotated_rhs_rule(Parser *p); +static expr_ty expressions_rule(Parser *p); +static expr_ty expression_rule(Parser *p); +static expr_ty lambdef_rule(Parser *p); +static arguments_ty lambda_params_rule(Parser *p); +static arguments_ty lambda_parameters_rule(Parser *p); +static asdl_seq* lambda_slash_no_default_rule(Parser *p); +static SlashWithDefault* lambda_slash_with_default_rule(Parser *p); +static StarEtc* lambda_star_etc_rule(Parser *p); +static arg_ty lambda_kwds_rule(Parser *p); +static arg_ty lambda_param_no_default_rule(Parser *p); +static NameDefaultPair* lambda_param_with_default_rule(Parser *p); +static NameDefaultPair* lambda_param_maybe_default_rule(Parser *p); +static arg_ty lambda_param_rule(Parser *p); +static expr_ty disjunction_rule(Parser *p); +static expr_ty conjunction_rule(Parser *p); +static expr_ty inversion_rule(Parser *p); +static expr_ty comparison_rule(Parser *p); +static CmpopExprPair* compare_op_bitwise_or_pair_rule(Parser *p); +static CmpopExprPair* eq_bitwise_or_rule(Parser *p); +static CmpopExprPair* noteq_bitwise_or_rule(Parser *p); +static CmpopExprPair* lte_bitwise_or_rule(Parser *p); +static CmpopExprPair* lt_bitwise_or_rule(Parser *p); +static CmpopExprPair* gte_bitwise_or_rule(Parser *p); +static CmpopExprPair* gt_bitwise_or_rule(Parser *p); +static CmpopExprPair* notin_bitwise_or_rule(Parser *p); +static CmpopExprPair* in_bitwise_or_rule(Parser *p); +static CmpopExprPair* isnot_bitwise_or_rule(Parser *p); +static CmpopExprPair* is_bitwise_or_rule(Parser *p); +static expr_ty bitwise_or_rule(Parser *p); +static expr_ty bitwise_xor_rule(Parser *p); +static expr_ty bitwise_and_rule(Parser *p); +static expr_ty shift_expr_rule(Parser *p); +static expr_ty sum_rule(Parser *p); +static expr_ty term_rule(Parser *p); +static expr_ty factor_rule(Parser *p); +static expr_ty power_rule(Parser *p); +static expr_ty await_primary_rule(Parser *p); +static expr_ty primary_rule(Parser *p); +static expr_ty slices_rule(Parser *p); +static expr_ty slice_rule(Parser *p); +static expr_ty atom_rule(Parser *p); +static expr_ty strings_rule(Parser *p); +static expr_ty list_rule(Parser *p); +static expr_ty listcomp_rule(Parser *p); +static expr_ty tuple_rule(Parser *p); +static expr_ty group_rule(Parser *p); +static expr_ty genexp_rule(Parser *p); +static expr_ty set_rule(Parser *p); +static expr_ty setcomp_rule(Parser *p); +static expr_ty dict_rule(Parser *p); +static expr_ty dictcomp_rule(Parser *p); +static asdl_seq* double_starred_kvpairs_rule(Parser *p); +static KeyValuePair* double_starred_kvpair_rule(Parser *p); +static KeyValuePair* kvpair_rule(Parser *p); +static asdl_seq* for_if_clauses_rule(Parser *p); +static comprehension_ty for_if_clause_rule(Parser *p); +static expr_ty yield_expr_rule(Parser *p); +static expr_ty arguments_rule(Parser *p); +static expr_ty args_rule(Parser *p); +static asdl_seq* kwargs_rule(Parser *p); +static expr_ty starred_expression_rule(Parser *p); +static KeywordOrStarred* kwarg_or_starred_rule(Parser *p); +static KeywordOrStarred* kwarg_or_double_starred_rule(Parser *p); +static expr_ty star_targets_rule(Parser *p); +static asdl_seq* star_targets_list_seq_rule(Parser *p); +static asdl_seq* star_targets_tuple_seq_rule(Parser *p); +static expr_ty star_target_rule(Parser *p); +static expr_ty target_with_star_atom_rule(Parser *p); +static expr_ty star_atom_rule(Parser *p); +static expr_ty single_target_rule(Parser *p); +static expr_ty single_subscript_attribute_target_rule(Parser *p); +static asdl_seq* del_targets_rule(Parser *p); +static expr_ty del_target_rule(Parser *p); +static expr_ty del_t_atom_rule(Parser *p); +static asdl_seq* targets_rule(Parser *p); +static expr_ty target_rule(Parser *p); +static expr_ty t_primary_rule(Parser *p); +static void *t_lookahead_rule(Parser *p); +static expr_ty t_atom_rule(Parser *p); +static void *invalid_arguments_rule(Parser *p); +static void *invalid_kwarg_rule(Parser *p); +static void *invalid_named_expression_rule(Parser *p); +static void *invalid_assignment_rule(Parser *p); +static expr_ty invalid_ann_assign_target_rule(Parser *p); +static void *invalid_del_stmt_rule(Parser *p); +static void *invalid_block_rule(Parser *p); +static void *invalid_primary_rule(Parser *p); +static void *invalid_comprehension_rule(Parser *p); +static void *invalid_dict_comprehension_rule(Parser *p); +static void *invalid_parameters_rule(Parser *p); +static void *invalid_lambda_parameters_rule(Parser *p); +static void *invalid_star_etc_rule(Parser *p); +static void *invalid_lambda_star_etc_rule(Parser *p); +static void *invalid_double_type_comments_rule(Parser *p); +static void *invalid_with_item_rule(Parser *p); +static void *invalid_for_target_rule(Parser *p); +static void *invalid_group_rule(Parser *p); +static void *invalid_import_from_targets_rule(Parser *p); +static asdl_seq *_loop0_1_rule(Parser *p); +static asdl_seq *_loop0_2_rule(Parser *p); +static asdl_seq *_loop0_4_rule(Parser *p); +static asdl_seq *_gather_3_rule(Parser *p); +static asdl_seq *_loop0_6_rule(Parser *p); +static asdl_seq *_gather_5_rule(Parser *p); +static asdl_seq *_loop0_8_rule(Parser *p); +static asdl_seq *_gather_7_rule(Parser *p); +static asdl_seq *_loop0_10_rule(Parser *p); +static asdl_seq *_gather_9_rule(Parser *p); +static asdl_seq *_loop1_11_rule(Parser *p); +static asdl_seq *_loop0_13_rule(Parser *p); +static asdl_seq *_gather_12_rule(Parser *p); +static void *_tmp_14_rule(Parser *p); +static void *_tmp_15_rule(Parser *p); +static void *_tmp_16_rule(Parser *p); +static void *_tmp_17_rule(Parser *p); +static void *_tmp_18_rule(Parser *p); +static void *_tmp_19_rule(Parser *p); +static void *_tmp_20_rule(Parser *p); +static void *_tmp_21_rule(Parser *p); +static asdl_seq *_loop1_22_rule(Parser *p); +static void *_tmp_23_rule(Parser *p); +static void *_tmp_24_rule(Parser *p); +static asdl_seq *_loop0_26_rule(Parser *p); +static asdl_seq *_gather_25_rule(Parser *p); +static asdl_seq *_loop0_28_rule(Parser *p); +static asdl_seq *_gather_27_rule(Parser *p); +static void *_tmp_29_rule(Parser *p); +static void *_tmp_30_rule(Parser *p); +static asdl_seq *_loop0_31_rule(Parser *p); +static asdl_seq *_loop1_32_rule(Parser *p); +static asdl_seq *_loop0_34_rule(Parser *p); +static asdl_seq *_gather_33_rule(Parser *p); +static void *_tmp_35_rule(Parser *p); +static asdl_seq *_loop0_37_rule(Parser *p); +static asdl_seq *_gather_36_rule(Parser *p); +static void *_tmp_38_rule(Parser *p); +static asdl_seq *_loop0_40_rule(Parser *p); +static asdl_seq *_gather_39_rule(Parser *p); +static asdl_seq *_loop0_42_rule(Parser *p); +static asdl_seq *_gather_41_rule(Parser *p); +static asdl_seq *_loop0_44_rule(Parser *p); +static asdl_seq *_gather_43_rule(Parser *p); +static asdl_seq *_loop0_46_rule(Parser *p); +static asdl_seq *_gather_45_rule(Parser *p); +static void *_tmp_47_rule(Parser *p); +static asdl_seq *_loop1_48_rule(Parser *p); +static void *_tmp_49_rule(Parser *p); +static void *_tmp_50_rule(Parser *p); +static void *_tmp_51_rule(Parser *p); +static void *_tmp_52_rule(Parser *p); +static void *_tmp_53_rule(Parser *p); +static asdl_seq *_loop0_54_rule(Parser *p); +static asdl_seq *_loop0_55_rule(Parser *p); +static asdl_seq *_loop0_56_rule(Parser *p); +static asdl_seq *_loop1_57_rule(Parser *p); +static asdl_seq *_loop0_58_rule(Parser *p); +static asdl_seq *_loop1_59_rule(Parser *p); +static asdl_seq *_loop1_60_rule(Parser *p); +static asdl_seq *_loop1_61_rule(Parser *p); +static asdl_seq *_loop0_62_rule(Parser *p); +static asdl_seq *_loop1_63_rule(Parser *p); +static asdl_seq *_loop0_64_rule(Parser *p); +static asdl_seq *_loop1_65_rule(Parser *p); +static asdl_seq *_loop0_66_rule(Parser *p); +static asdl_seq *_loop1_67_rule(Parser *p); +static asdl_seq *_loop1_68_rule(Parser *p); +static void *_tmp_69_rule(Parser *p); +static asdl_seq *_loop1_70_rule(Parser *p); +static asdl_seq *_loop0_72_rule(Parser *p); +static asdl_seq *_gather_71_rule(Parser *p); +static asdl_seq *_loop1_73_rule(Parser *p); +static asdl_seq *_loop0_74_rule(Parser *p); +static asdl_seq *_loop0_75_rule(Parser *p); +static asdl_seq *_loop0_76_rule(Parser *p); +static asdl_seq *_loop1_77_rule(Parser *p); +static asdl_seq *_loop0_78_rule(Parser *p); +static asdl_seq *_loop1_79_rule(Parser *p); +static asdl_seq *_loop1_80_rule(Parser *p); +static asdl_seq *_loop1_81_rule(Parser *p); +static asdl_seq *_loop0_82_rule(Parser *p); +static asdl_seq *_loop1_83_rule(Parser *p); +static asdl_seq *_loop0_84_rule(Parser *p); +static asdl_seq *_loop1_85_rule(Parser *p); +static asdl_seq *_loop0_86_rule(Parser *p); +static asdl_seq *_loop1_87_rule(Parser *p); +static asdl_seq *_loop1_88_rule(Parser *p); +static asdl_seq *_loop1_89_rule(Parser *p); +static asdl_seq *_loop1_90_rule(Parser *p); +static void *_tmp_91_rule(Parser *p); +static asdl_seq *_loop0_93_rule(Parser *p); +static asdl_seq *_gather_92_rule(Parser *p); +static void *_tmp_94_rule(Parser *p); +static void *_tmp_95_rule(Parser *p); +static void *_tmp_96_rule(Parser *p); +static void *_tmp_97_rule(Parser *p); +static asdl_seq *_loop1_98_rule(Parser *p); +static void *_tmp_99_rule(Parser *p); +static void *_tmp_100_rule(Parser *p); +static asdl_seq *_loop0_102_rule(Parser *p); +static asdl_seq *_gather_101_rule(Parser *p); +static asdl_seq *_loop1_103_rule(Parser *p); +static asdl_seq *_loop0_104_rule(Parser *p); +static asdl_seq *_loop0_105_rule(Parser *p); +static asdl_seq *_loop0_107_rule(Parser *p); +static asdl_seq *_gather_106_rule(Parser *p); +static void *_tmp_108_rule(Parser *p); +static asdl_seq *_loop0_110_rule(Parser *p); +static asdl_seq *_gather_109_rule(Parser *p); +static asdl_seq *_loop0_112_rule(Parser *p); +static asdl_seq *_gather_111_rule(Parser *p); +static asdl_seq *_loop0_114_rule(Parser *p); +static asdl_seq *_gather_113_rule(Parser *p); +static asdl_seq *_loop0_116_rule(Parser *p); +static asdl_seq *_gather_115_rule(Parser *p); +static asdl_seq *_loop0_117_rule(Parser *p); +static asdl_seq *_loop0_119_rule(Parser *p); +static asdl_seq *_gather_118_rule(Parser *p); +static asdl_seq *_loop1_120_rule(Parser *p); +static void *_tmp_121_rule(Parser *p); +static asdl_seq *_loop0_123_rule(Parser *p); +static asdl_seq *_gather_122_rule(Parser *p); +static asdl_seq *_loop0_125_rule(Parser *p); +static asdl_seq *_gather_124_rule(Parser *p); +static void *_tmp_126_rule(Parser *p); +static asdl_seq *_loop0_127_rule(Parser *p); +static asdl_seq *_loop0_128_rule(Parser *p); +static asdl_seq *_loop0_129_rule(Parser *p); +static void *_tmp_130_rule(Parser *p); +static void *_tmp_131_rule(Parser *p); +static asdl_seq *_loop0_132_rule(Parser *p); +static void *_tmp_133_rule(Parser *p); +static asdl_seq *_loop0_134_rule(Parser *p); +static void *_tmp_135_rule(Parser *p); +static void *_tmp_136_rule(Parser *p); +static void *_tmp_137_rule(Parser *p); +static void *_tmp_138_rule(Parser *p); +static void *_tmp_139_rule(Parser *p); +static void *_tmp_140_rule(Parser *p); +static void *_tmp_141_rule(Parser *p); +static void *_tmp_142_rule(Parser *p); +static void *_tmp_143_rule(Parser *p); +static void *_tmp_144_rule(Parser *p); +static void *_tmp_145_rule(Parser *p); +static void *_tmp_146_rule(Parser *p); +static void *_tmp_147_rule(Parser *p); +static void *_tmp_148_rule(Parser *p); +static void *_tmp_149_rule(Parser *p); +static void *_tmp_150_rule(Parser *p); +static void *_tmp_151_rule(Parser *p); +static void *_tmp_152_rule(Parser *p); +static asdl_seq *_loop1_153_rule(Parser *p); +static asdl_seq *_loop1_154_rule(Parser *p); +static void *_tmp_155_rule(Parser *p); +static void *_tmp_156_rule(Parser *p); + + +// file: statements? $ +static mod_ty +file_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + mod_ty _res = NULL; + int _mark = p->mark; + { // statements? $ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> file[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "statements? $")); + void *a; + Token * endmarker_var; + if ( + (a = statements_rule(p), 1) // statements? + && + (endmarker_var = _PyPegen_expect_token(p, ENDMARKER)) // token='ENDMARKER' + ) + { + D(fprintf(stderr, "%*c+ file[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "statements? $")); + _res = _PyPegen_make_module ( p , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s file[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "statements? $")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// interactive: statement_newline +static mod_ty +interactive_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + mod_ty _res = NULL; + int _mark = p->mark; + { // statement_newline + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> interactive[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "statement_newline")); + asdl_seq* a; + if ( + (a = statement_newline_rule(p)) // statement_newline + ) + { + D(fprintf(stderr, "%*c+ interactive[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "statement_newline")); + _res = Interactive ( a , p -> arena ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s interactive[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "statement_newline")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// eval: expressions NEWLINE* $ +static mod_ty +eval_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + mod_ty _res = NULL; + int _mark = p->mark; + { // expressions NEWLINE* $ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> eval[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expressions NEWLINE* $")); + asdl_seq * _loop0_1_var; + expr_ty a; + Token * endmarker_var; + if ( + (a = expressions_rule(p)) // expressions + && + (_loop0_1_var = _loop0_1_rule(p)) // NEWLINE* + && + (endmarker_var = _PyPegen_expect_token(p, ENDMARKER)) // token='ENDMARKER' + ) + { + D(fprintf(stderr, "%*c+ eval[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expressions NEWLINE* $")); + _res = Expression ( a , p -> arena ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s eval[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expressions NEWLINE* $")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// func_type: '(' type_expressions? ')' '->' expression NEWLINE* $ +static mod_ty +func_type_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + mod_ty _res = NULL; + int _mark = p->mark; + { // '(' type_expressions? ')' '->' expression NEWLINE* $ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> func_type[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' type_expressions? ')' '->' expression NEWLINE* $")); + Token * _literal; + Token * _literal_1; + Token * _literal_2; + asdl_seq * _loop0_2_var; + void *a; + expr_ty b; + Token * endmarker_var; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = type_expressions_rule(p), 1) // type_expressions? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + && + (_literal_2 = _PyPegen_expect_token(p, 51)) // token='->' + && + (b = expression_rule(p)) // expression + && + (_loop0_2_var = _loop0_2_rule(p)) // NEWLINE* + && + (endmarker_var = _PyPegen_expect_token(p, ENDMARKER)) // token='ENDMARKER' + ) + { + D(fprintf(stderr, "%*c+ func_type[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' type_expressions? ')' '->' expression NEWLINE* $")); + _res = FunctionType ( a , b , p -> arena ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s func_type[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' type_expressions? ')' '->' expression NEWLINE* $")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// fstring: star_expressions +static expr_ty +fstring_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // star_expressions + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> fstring[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ fstring[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s fstring[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// type_expressions: +// | ','.expression+ ',' '*' expression ',' '**' expression +// | ','.expression+ ',' '*' expression +// | ','.expression+ ',' '**' expression +// | '*' expression ',' '**' expression +// | '*' expression +// | '**' expression +// | ','.expression+ +static asdl_seq* +type_expressions_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // ','.expression+ ',' '*' expression ',' '**' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> type_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.expression+ ',' '*' expression ',' '**' expression")); + Token * _literal; + Token * _literal_1; + Token * _literal_2; + Token * _literal_3; + asdl_seq * a; + expr_ty b; + expr_ty c; + if ( + (a = _gather_3_rule(p)) // ','.expression+ + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (_literal_1 = _PyPegen_expect_token(p, 16)) // token='*' + && + (b = expression_rule(p)) // expression + && + (_literal_2 = _PyPegen_expect_token(p, 12)) // token=',' + && + (_literal_3 = _PyPegen_expect_token(p, 35)) // token='**' + && + (c = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.expression+ ',' '*' expression ',' '**' expression")); + _res = _PyPegen_seq_append_to_end ( p , CHECK ( _PyPegen_seq_append_to_end ( p , a , b ) ) , c ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s type_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.expression+ ',' '*' expression ',' '**' expression")); + } + { // ','.expression+ ',' '*' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> type_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.expression+ ',' '*' expression")); + Token * _literal; + Token * _literal_1; + asdl_seq * a; + expr_ty b; + if ( + (a = _gather_5_rule(p)) // ','.expression+ + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (_literal_1 = _PyPegen_expect_token(p, 16)) // token='*' + && + (b = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.expression+ ',' '*' expression")); + _res = _PyPegen_seq_append_to_end ( p , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s type_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.expression+ ',' '*' expression")); + } + { // ','.expression+ ',' '**' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> type_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.expression+ ',' '**' expression")); + Token * _literal; + Token * _literal_1; + asdl_seq * a; + expr_ty b; + if ( + (a = _gather_7_rule(p)) // ','.expression+ + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (_literal_1 = _PyPegen_expect_token(p, 35)) // token='**' + && + (b = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.expression+ ',' '**' expression")); + _res = _PyPegen_seq_append_to_end ( p , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s type_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.expression+ ',' '**' expression")); + } + { // '*' expression ',' '**' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> type_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' expression ',' '**' expression")); + Token * _literal; + Token * _literal_1; + Token * _literal_2; + expr_ty a; + expr_ty b; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (a = expression_rule(p)) // expression + && + (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' + && + (_literal_2 = _PyPegen_expect_token(p, 35)) // token='**' + && + (b = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' expression ',' '**' expression")); + _res = _PyPegen_seq_append_to_end ( p , CHECK ( _PyPegen_singleton_seq ( p , a ) ) , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s type_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' expression ',' '**' expression")); + } + { // '*' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> type_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' expression")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (a = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' expression")); + _res = _PyPegen_singleton_seq ( p , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s type_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' expression")); + } + { // '**' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> type_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**' expression")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 35)) // token='**' + && + (a = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' expression")); + _res = _PyPegen_singleton_seq ( p , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s type_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**' expression")); + } + { // ','.expression+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> type_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.expression+")); + asdl_seq * _gather_9_var; + if ( + (_gather_9_var = _gather_9_rule(p)) // ','.expression+ + ) + { + D(fprintf(stderr, "%*c+ type_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.expression+")); + _res = _gather_9_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s type_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.expression+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// statements: statement+ +static asdl_seq* +statements_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // statement+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> statements[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "statement+")); + asdl_seq * a; + if ( + (a = _loop1_11_rule(p)) // statement+ + ) + { + D(fprintf(stderr, "%*c+ statements[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "statement+")); + _res = _PyPegen_seq_flatten ( p , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s statements[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "statement+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// statement: compound_stmt | simple_stmt +static asdl_seq* +statement_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // compound_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> statement[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "compound_stmt")); + stmt_ty a; + if ( + (a = compound_stmt_rule(p)) // compound_stmt + ) + { + D(fprintf(stderr, "%*c+ statement[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "compound_stmt")); + _res = _PyPegen_singleton_seq ( p , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s statement[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "compound_stmt")); + } + { // simple_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> statement[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmt")); + asdl_seq* simple_stmt_var; + if ( + (simple_stmt_var = simple_stmt_rule(p)) // simple_stmt + ) + { + D(fprintf(stderr, "%*c+ statement[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "simple_stmt")); + _res = simple_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s statement[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "simple_stmt")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// statement_newline: compound_stmt NEWLINE | simple_stmt | NEWLINE | $ +static asdl_seq* +statement_newline_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // compound_stmt NEWLINE + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> statement_newline[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "compound_stmt NEWLINE")); + stmt_ty a; + Token * newline_var; + if ( + (a = compound_stmt_rule(p)) // compound_stmt + && + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + ) + { + D(fprintf(stderr, "%*c+ statement_newline[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "compound_stmt NEWLINE")); + _res = _PyPegen_singleton_seq ( p , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s statement_newline[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "compound_stmt NEWLINE")); + } + { // simple_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> statement_newline[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmt")); + asdl_seq* simple_stmt_var; + if ( + (simple_stmt_var = simple_stmt_rule(p)) // simple_stmt + ) + { + D(fprintf(stderr, "%*c+ statement_newline[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "simple_stmt")); + _res = simple_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s statement_newline[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "simple_stmt")); + } + { // NEWLINE + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> statement_newline[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + Token * newline_var; + if ( + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + ) + { + D(fprintf(stderr, "%*c+ statement_newline[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _PyPegen_singleton_seq ( p , CHECK ( _Py_Pass ( EXTRA ) ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s statement_newline[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE")); + } + { // $ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> statement_newline[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "$")); + Token * endmarker_var; + if ( + (endmarker_var = _PyPegen_expect_token(p, ENDMARKER)) // token='ENDMARKER' + ) + { + D(fprintf(stderr, "%*c+ statement_newline[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "$")); + _res = _PyPegen_interactive_exit ( p ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s statement_newline[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "$")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// simple_stmt: small_stmt !';' NEWLINE | ';'.small_stmt+ ';'? NEWLINE +static asdl_seq* +simple_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // small_stmt !';' NEWLINE + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "small_stmt !';' NEWLINE")); + stmt_ty a; + Token * newline_var; + if ( + (a = small_stmt_rule(p)) // small_stmt + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 13) // token=';' + && + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + ) + { + D(fprintf(stderr, "%*c+ simple_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "small_stmt !';' NEWLINE")); + _res = _PyPegen_singleton_seq ( p , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s simple_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "small_stmt !';' NEWLINE")); + } + { // ';'.small_stmt+ ';'? NEWLINE + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> simple_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';'.small_stmt+ ';'? NEWLINE")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + asdl_seq * a; + Token * newline_var; + if ( + (a = _gather_12_rule(p)) // ';'.small_stmt+ + && + (_opt_var = _PyPegen_expect_token(p, 13), 1) // ';'? + && + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + ) + { + D(fprintf(stderr, "%*c+ simple_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "';'.small_stmt+ ';'? NEWLINE")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s simple_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "';'.small_stmt+ ';'? NEWLINE")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// small_stmt: +// | assignment +// | star_expressions +// | &'return' return_stmt +// | &('import' | 'from') import_stmt +// | &'raise' raise_stmt +// | 'pass' +// | &'del' del_stmt +// | &'yield' yield_stmt +// | &'assert' assert_stmt +// | 'break' +// | 'continue' +// | &'global' global_stmt +// | &'nonlocal' nonlocal_stmt +static stmt_ty +small_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + if (_PyPegen_is_memoized(p, small_stmt_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // assignment + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "assignment")); + stmt_ty assignment_var; + if ( + (assignment_var = assignment_rule(p)) // assignment + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "assignment")); + _res = assignment_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "assignment")); + } + { // star_expressions + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty e; + if ( + (e = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Expr ( e , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + { // &'return' return_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'return' return_stmt")); + stmt_ty return_stmt_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 500) // token='return' + && + (return_stmt_var = return_stmt_rule(p)) // return_stmt + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'return' return_stmt")); + _res = return_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'return' return_stmt")); + } + { // &('import' | 'from') import_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('import' | 'from') import_stmt")); + stmt_ty import_stmt_var; + if ( + _PyPegen_lookahead(1, _tmp_14_rule, p) + && + (import_stmt_var = import_stmt_rule(p)) // import_stmt + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&('import' | 'from') import_stmt")); + _res = import_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&('import' | 'from') import_stmt")); + } + { // &'raise' raise_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'raise' raise_stmt")); + stmt_ty raise_stmt_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 501) // token='raise' + && + (raise_stmt_var = raise_stmt_rule(p)) // raise_stmt + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'raise' raise_stmt")); + _res = raise_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'raise' raise_stmt")); + } + { // 'pass' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'pass'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 502)) // token='pass' + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'pass'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Pass ( EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'pass'")); + } + { // &'del' del_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'del' del_stmt")); + stmt_ty del_stmt_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 503) // token='del' + && + (del_stmt_var = del_stmt_rule(p)) // del_stmt + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'del' del_stmt")); + _res = del_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'del' del_stmt")); + } + { // &'yield' yield_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'yield' yield_stmt")); + stmt_ty yield_stmt_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 504) // token='yield' + && + (yield_stmt_var = yield_stmt_rule(p)) // yield_stmt + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'yield' yield_stmt")); + _res = yield_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'yield' yield_stmt")); + } + { // &'assert' assert_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'assert' assert_stmt")); + stmt_ty assert_stmt_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 505) // token='assert' + && + (assert_stmt_var = assert_stmt_rule(p)) // assert_stmt + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'assert' assert_stmt")); + _res = assert_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'assert' assert_stmt")); + } + { // 'break' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'break'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 506)) // token='break' + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'break'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Break ( EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'break'")); + } + { // 'continue' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'continue'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 507)) // token='continue' + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'continue'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Continue ( EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'continue'")); + } + { // &'global' global_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'global' global_stmt")); + stmt_ty global_stmt_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 508) // token='global' + && + (global_stmt_var = global_stmt_rule(p)) // global_stmt + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'global' global_stmt")); + _res = global_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'global' global_stmt")); + } + { // &'nonlocal' nonlocal_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> small_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'nonlocal' nonlocal_stmt")); + stmt_ty nonlocal_stmt_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 509) // token='nonlocal' + && + (nonlocal_stmt_var = nonlocal_stmt_rule(p)) // nonlocal_stmt + ) + { + D(fprintf(stderr, "%*c+ small_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'nonlocal' nonlocal_stmt")); + _res = nonlocal_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s small_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'nonlocal' nonlocal_stmt")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, small_stmt_type, _res); + D(p->level--); + return _res; +} + +// compound_stmt: +// | &('def' | '@' | ASYNC) function_def +// | &'if' if_stmt +// | &('class' | '@') class_def +// | &('with' | ASYNC) with_stmt +// | &('for' | ASYNC) for_stmt +// | &'try' try_stmt +// | &'while' while_stmt +static stmt_ty +compound_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + { // &('def' | '@' | ASYNC) function_def + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('def' | '@' | ASYNC) function_def")); + stmt_ty function_def_var; + if ( + _PyPegen_lookahead(1, _tmp_15_rule, p) + && + (function_def_var = function_def_rule(p)) // function_def + ) + { + D(fprintf(stderr, "%*c+ compound_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&('def' | '@' | ASYNC) function_def")); + _res = function_def_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compound_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&('def' | '@' | ASYNC) function_def")); + } + { // &'if' if_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'if' if_stmt")); + stmt_ty if_stmt_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 510) // token='if' + && + (if_stmt_var = if_stmt_rule(p)) // if_stmt + ) + { + D(fprintf(stderr, "%*c+ compound_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'if' if_stmt")); + _res = if_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compound_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'if' if_stmt")); + } + { // &('class' | '@') class_def + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('class' | '@') class_def")); + stmt_ty class_def_var; + if ( + _PyPegen_lookahead(1, _tmp_16_rule, p) + && + (class_def_var = class_def_rule(p)) // class_def + ) + { + D(fprintf(stderr, "%*c+ compound_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&('class' | '@') class_def")); + _res = class_def_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compound_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&('class' | '@') class_def")); + } + { // &('with' | ASYNC) with_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('with' | ASYNC) with_stmt")); + stmt_ty with_stmt_var; + if ( + _PyPegen_lookahead(1, _tmp_17_rule, p) + && + (with_stmt_var = with_stmt_rule(p)) // with_stmt + ) + { + D(fprintf(stderr, "%*c+ compound_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&('with' | ASYNC) with_stmt")); + _res = with_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compound_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&('with' | ASYNC) with_stmt")); + } + { // &('for' | ASYNC) for_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&('for' | ASYNC) for_stmt")); + stmt_ty for_stmt_var; + if ( + _PyPegen_lookahead(1, _tmp_18_rule, p) + && + (for_stmt_var = for_stmt_rule(p)) // for_stmt + ) + { + D(fprintf(stderr, "%*c+ compound_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&('for' | ASYNC) for_stmt")); + _res = for_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compound_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&('for' | ASYNC) for_stmt")); + } + { // &'try' try_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'try' try_stmt")); + stmt_ty try_stmt_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 511) // token='try' + && + (try_stmt_var = try_stmt_rule(p)) // try_stmt + ) + { + D(fprintf(stderr, "%*c+ compound_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'try' try_stmt")); + _res = try_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compound_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'try' try_stmt")); + } + { // &'while' while_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compound_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'while' while_stmt")); + stmt_ty while_stmt_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 512) // token='while' + && + (while_stmt_var = while_stmt_rule(p)) // while_stmt + ) + { + D(fprintf(stderr, "%*c+ compound_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'while' while_stmt")); + _res = while_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compound_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'while' while_stmt")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// assignment: +// | NAME ':' expression ['=' annotated_rhs] +// | ('(' single_target ')' | single_subscript_attribute_target) ':' expression ['=' annotated_rhs] +// | ((star_targets '='))+ (yield_expr | star_expressions) !'=' TYPE_COMMENT? +// | single_target augassign ~ (yield_expr | star_expressions) +// | invalid_assignment +static stmt_ty +assignment_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // NAME ':' expression ['=' annotated_rhs] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME ':' expression ['=' annotated_rhs]")); + Token * _literal; + expr_ty a; + expr_ty b; + void *c; + if ( + (a = _PyPegen_name_token(p)) // NAME + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = expression_rule(p)) // expression + && + (c = _tmp_19_rule(p), 1) // ['=' annotated_rhs] + ) + { + D(fprintf(stderr, "%*c+ assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME ':' expression ['=' annotated_rhs]")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = CHECK_VERSION ( 6 , "Variable annotation syntax is" , _Py_AnnAssign ( CHECK ( _PyPegen_set_expr_context ( p , a , Store ) ) , b , c , 1 , EXTRA ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME ':' expression ['=' annotated_rhs]")); + } + { // ('(' single_target ')' | single_subscript_attribute_target) ':' expression ['=' annotated_rhs] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('(' single_target ')' | single_subscript_attribute_target) ':' expression ['=' annotated_rhs]")); + Token * _literal; + void *a; + expr_ty b; + void *c; + if ( + (a = _tmp_20_rule(p)) // '(' single_target ')' | single_subscript_attribute_target + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = expression_rule(p)) // expression + && + (c = _tmp_21_rule(p), 1) // ['=' annotated_rhs] + ) + { + D(fprintf(stderr, "%*c+ assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "('(' single_target ')' | single_subscript_attribute_target) ':' expression ['=' annotated_rhs]")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = CHECK_VERSION ( 6 , "Variable annotations syntax is" , _Py_AnnAssign ( a , b , c , 0 , EXTRA ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('(' single_target ')' | single_subscript_attribute_target) ':' expression ['=' annotated_rhs]")); + } + { // ((star_targets '='))+ (yield_expr | star_expressions) !'=' TYPE_COMMENT? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((star_targets '='))+ (yield_expr | star_expressions) !'=' TYPE_COMMENT?")); + asdl_seq * a; + void *b; + void *tc; + if ( + (a = _loop1_22_rule(p)) // ((star_targets '='))+ + && + (b = _tmp_23_rule(p)) // yield_expr | star_expressions + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='=' + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + ) + { + D(fprintf(stderr, "%*c+ assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "((star_targets '='))+ (yield_expr | star_expressions) !'=' TYPE_COMMENT?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Assign ( a , b , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "((star_targets '='))+ (yield_expr | star_expressions) !'=' TYPE_COMMENT?")); + } + { // single_target augassign ~ (yield_expr | star_expressions) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "single_target augassign ~ (yield_expr | star_expressions)")); + int _cut_var = 0; + expr_ty a; + AugOperator* b; + void *c; + if ( + (a = single_target_rule(p)) // single_target + && + (b = augassign_rule(p)) // augassign + && + (_cut_var = 1) + && + (c = _tmp_24_rule(p)) // yield_expr | star_expressions + ) + { + D(fprintf(stderr, "%*c+ assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "single_target augassign ~ (yield_expr | star_expressions)")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_AugAssign ( a , b -> kind , c , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "single_target augassign ~ (yield_expr | star_expressions)")); + if (_cut_var) { + D(p->level--); + return NULL; + } + } + if (p->call_invalid_rules) { // invalid_assignment + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_assignment")); + void *invalid_assignment_var; + if ( + (invalid_assignment_var = invalid_assignment_rule(p)) // invalid_assignment + ) + { + D(fprintf(stderr, "%*c+ assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_assignment")); + _res = invalid_assignment_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_assignment")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// augassign: +// | '+=' +// | '-=' +// | '*=' +// | '@=' +// | '/=' +// | '%=' +// | '&=' +// | '|=' +// | '^=' +// | '<<=' +// | '>>=' +// | '**=' +// | '//=' +static AugOperator* +augassign_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + AugOperator* _res = NULL; + int _mark = p->mark; + { // '+=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'+='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 36)) // token='+=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'+='")); + _res = _PyPegen_augoperator ( p , Add ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'+='")); + } + { // '-=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'-='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 37)) // token='-=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'-='")); + _res = _PyPegen_augoperator ( p , Sub ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'-='")); + } + { // '*=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 38)) // token='*=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*='")); + _res = _PyPegen_augoperator ( p , Mult ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*='")); + } + { // '@=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 50)) // token='@=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@='")); + _res = CHECK_VERSION ( 5 , "The '@' operator is" , _PyPegen_augoperator ( p , MatMult ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@='")); + } + { // '/=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'/='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 39)) // token='/=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'/='")); + _res = _PyPegen_augoperator ( p , Div ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'/='")); + } + { // '%=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'%='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 40)) // token='%=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'%='")); + _res = _PyPegen_augoperator ( p , Mod ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'%='")); + } + { // '&=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'&='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 41)) // token='&=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'&='")); + _res = _PyPegen_augoperator ( p , BitAnd ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'&='")); + } + { // '|=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'|='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 42)) // token='|=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'|='")); + _res = _PyPegen_augoperator ( p , BitOr ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'|='")); + } + { // '^=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'^='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 43)) // token='^=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'^='")); + _res = _PyPegen_augoperator ( p , BitXor ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'^='")); + } + { // '<<=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'<<='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 44)) // token='<<=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'<<='")); + _res = _PyPegen_augoperator ( p , LShift ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'<<='")); + } + { // '>>=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'>>='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 45)) // token='>>=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'>>='")); + _res = _PyPegen_augoperator ( p , RShift ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'>>='")); + } + { // '**=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 46)) // token='**=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**='")); + _res = _PyPegen_augoperator ( p , Pow ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**='")); + } + { // '//=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> augassign[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'//='")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 48)) // token='//=' + ) + { + D(fprintf(stderr, "%*c+ augassign[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'//='")); + _res = _PyPegen_augoperator ( p , FloorDiv ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s augassign[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'//='")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// global_stmt: 'global' ','.NAME+ +static stmt_ty +global_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'global' ','.NAME+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> global_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'global' ','.NAME+")); + Token * _keyword; + asdl_seq * a; + if ( + (_keyword = _PyPegen_expect_token(p, 508)) // token='global' + && + (a = _gather_25_rule(p)) // ','.NAME+ + ) + { + D(fprintf(stderr, "%*c+ global_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'global' ','.NAME+")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Global ( CHECK ( _PyPegen_map_names_to_ids ( p , a ) ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s global_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'global' ','.NAME+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// nonlocal_stmt: 'nonlocal' ','.NAME+ +static stmt_ty +nonlocal_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'nonlocal' ','.NAME+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> nonlocal_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'nonlocal' ','.NAME+")); + Token * _keyword; + asdl_seq * a; + if ( + (_keyword = _PyPegen_expect_token(p, 509)) // token='nonlocal' + && + (a = _gather_27_rule(p)) // ','.NAME+ + ) + { + D(fprintf(stderr, "%*c+ nonlocal_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'nonlocal' ','.NAME+")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Nonlocal ( CHECK ( _PyPegen_map_names_to_ids ( p , a ) ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s nonlocal_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'nonlocal' ','.NAME+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// yield_stmt: yield_expr +static stmt_ty +yield_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // yield_expr + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> yield_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty y; + if ( + (y = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ yield_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Expr ( y , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s yield_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// assert_stmt: 'assert' expression [',' expression] +static stmt_ty +assert_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'assert' expression [',' expression] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> assert_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'assert' expression [',' expression]")); + Token * _keyword; + expr_ty a; + void *b; + if ( + (_keyword = _PyPegen_expect_token(p, 505)) // token='assert' + && + (a = expression_rule(p)) // expression + && + (b = _tmp_29_rule(p), 1) // [',' expression] + ) + { + D(fprintf(stderr, "%*c+ assert_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'assert' expression [',' expression]")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Assert ( a , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s assert_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'assert' expression [',' expression]")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// del_stmt: 'del' del_targets &(';' | NEWLINE) | invalid_del_stmt +static stmt_ty +del_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'del' del_targets &(';' | NEWLINE) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> del_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'del' del_targets &(';' | NEWLINE)")); + Token * _keyword; + asdl_seq* a; + if ( + (_keyword = _PyPegen_expect_token(p, 503)) // token='del' + && + (a = del_targets_rule(p)) // del_targets + && + _PyPegen_lookahead(1, _tmp_30_rule, p) + ) + { + D(fprintf(stderr, "%*c+ del_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'del' del_targets &(';' | NEWLINE)")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Delete ( a , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s del_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'del' del_targets &(';' | NEWLINE)")); + } + if (p->call_invalid_rules) { // invalid_del_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> del_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_del_stmt")); + void *invalid_del_stmt_var; + if ( + (invalid_del_stmt_var = invalid_del_stmt_rule(p)) // invalid_del_stmt + ) + { + D(fprintf(stderr, "%*c+ del_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_del_stmt")); + _res = invalid_del_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s del_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_del_stmt")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// import_stmt: import_name | import_from +static stmt_ty +import_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + { // import_name + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "import_name")); + stmt_ty import_name_var; + if ( + (import_name_var = import_name_rule(p)) // import_name + ) + { + D(fprintf(stderr, "%*c+ import_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "import_name")); + _res = import_name_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "import_name")); + } + { // import_from + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "import_from")); + stmt_ty import_from_var; + if ( + (import_from_var = import_from_rule(p)) // import_from + ) + { + D(fprintf(stderr, "%*c+ import_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "import_from")); + _res = import_from_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "import_from")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// import_name: 'import' dotted_as_names +static stmt_ty +import_name_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'import' dotted_as_names + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_name[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'import' dotted_as_names")); + Token * _keyword; + asdl_seq* a; + if ( + (_keyword = _PyPegen_expect_token(p, 513)) // token='import' + && + (a = dotted_as_names_rule(p)) // dotted_as_names + ) + { + D(fprintf(stderr, "%*c+ import_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'import' dotted_as_names")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Import ( a , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_name[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'import' dotted_as_names")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// import_from: +// | 'from' (('.' | '...'))* dotted_name 'import' import_from_targets +// | 'from' (('.' | '...'))+ 'import' import_from_targets +static stmt_ty +import_from_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'from' (('.' | '...'))* dotted_name 'import' import_from_targets + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_from[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'from' (('.' | '...'))* dotted_name 'import' import_from_targets")); + Token * _keyword; + Token * _keyword_1; + asdl_seq * a; + expr_ty b; + asdl_seq* c; + if ( + (_keyword = _PyPegen_expect_token(p, 514)) // token='from' + && + (a = _loop0_31_rule(p)) // (('.' | '...'))* + && + (b = dotted_name_rule(p)) // dotted_name + && + (_keyword_1 = _PyPegen_expect_token(p, 513)) // token='import' + && + (c = import_from_targets_rule(p)) // import_from_targets + ) + { + D(fprintf(stderr, "%*c+ import_from[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'from' (('.' | '...'))* dotted_name 'import' import_from_targets")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_ImportFrom ( b -> v . Name . id , c , _PyPegen_seq_count_dots ( a ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_from[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'from' (('.' | '...'))* dotted_name 'import' import_from_targets")); + } + { // 'from' (('.' | '...'))+ 'import' import_from_targets + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_from[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'from' (('.' | '...'))+ 'import' import_from_targets")); + Token * _keyword; + Token * _keyword_1; + asdl_seq * a; + asdl_seq* b; + if ( + (_keyword = _PyPegen_expect_token(p, 514)) // token='from' + && + (a = _loop1_32_rule(p)) // (('.' | '...'))+ + && + (_keyword_1 = _PyPegen_expect_token(p, 513)) // token='import' + && + (b = import_from_targets_rule(p)) // import_from_targets + ) + { + D(fprintf(stderr, "%*c+ import_from[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'from' (('.' | '...'))+ 'import' import_from_targets")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_ImportFrom ( NULL , b , _PyPegen_seq_count_dots ( a ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_from[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'from' (('.' | '...'))+ 'import' import_from_targets")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// import_from_targets: +// | '(' import_from_as_names ','? ')' +// | import_from_as_names !',' +// | '*' +// | invalid_import_from_targets +static asdl_seq* +import_from_targets_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // '(' import_from_as_names ','? ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_from_targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' import_from_as_names ','? ')'")); + Token * _literal; + Token * _literal_1; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + asdl_seq* a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = import_from_as_names_rule(p)) // import_from_as_names + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ import_from_targets[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' import_from_as_names ','? ')'")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_from_targets[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' import_from_as_names ','? ')'")); + } + { // import_from_as_names !',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_from_targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "import_from_as_names !','")); + asdl_seq* import_from_as_names_var; + if ( + (import_from_as_names_var = import_from_as_names_rule(p)) // import_from_as_names + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 12) // token=',' + ) + { + D(fprintf(stderr, "%*c+ import_from_targets[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "import_from_as_names !','")); + _res = import_from_as_names_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_from_targets[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "import_from_as_names !','")); + } + { // '*' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_from_targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + ) + { + D(fprintf(stderr, "%*c+ import_from_targets[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*'")); + _res = _PyPegen_singleton_seq ( p , CHECK ( _PyPegen_alias_for_star ( p ) ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_from_targets[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*'")); + } + if (p->call_invalid_rules) { // invalid_import_from_targets + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_from_targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_import_from_targets")); + void *invalid_import_from_targets_var; + if ( + (invalid_import_from_targets_var = invalid_import_from_targets_rule(p)) // invalid_import_from_targets + ) + { + D(fprintf(stderr, "%*c+ import_from_targets[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_import_from_targets")); + _res = invalid_import_from_targets_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_from_targets[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_import_from_targets")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// import_from_as_names: ','.import_from_as_name+ +static asdl_seq* +import_from_as_names_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // ','.import_from_as_name+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_from_as_names[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.import_from_as_name+")); + asdl_seq * a; + if ( + (a = _gather_33_rule(p)) // ','.import_from_as_name+ + ) + { + D(fprintf(stderr, "%*c+ import_from_as_names[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.import_from_as_name+")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_from_as_names[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.import_from_as_name+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// import_from_as_name: NAME ['as' NAME] +static alias_ty +import_from_as_name_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + alias_ty _res = NULL; + int _mark = p->mark; + { // NAME ['as' NAME] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> import_from_as_name[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME ['as' NAME]")); + expr_ty a; + void *b; + if ( + (a = _PyPegen_name_token(p)) // NAME + && + (b = _tmp_35_rule(p), 1) // ['as' NAME] + ) + { + D(fprintf(stderr, "%*c+ import_from_as_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME ['as' NAME]")); + _res = _Py_alias ( a -> v . Name . id , ( b ) ? ( ( expr_ty ) b ) -> v . Name . id : NULL , p -> arena ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s import_from_as_name[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME ['as' NAME]")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// dotted_as_names: ','.dotted_as_name+ +static asdl_seq* +dotted_as_names_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // ','.dotted_as_name+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> dotted_as_names[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.dotted_as_name+")); + asdl_seq * a; + if ( + (a = _gather_36_rule(p)) // ','.dotted_as_name+ + ) + { + D(fprintf(stderr, "%*c+ dotted_as_names[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.dotted_as_name+")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s dotted_as_names[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.dotted_as_name+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// dotted_as_name: dotted_name ['as' NAME] +static alias_ty +dotted_as_name_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + alias_ty _res = NULL; + int _mark = p->mark; + { // dotted_name ['as' NAME] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> dotted_as_name[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_name ['as' NAME]")); + expr_ty a; + void *b; + if ( + (a = dotted_name_rule(p)) // dotted_name + && + (b = _tmp_38_rule(p), 1) // ['as' NAME] + ) + { + D(fprintf(stderr, "%*c+ dotted_as_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_name ['as' NAME]")); + _res = _Py_alias ( a -> v . Name . id , ( b ) ? ( ( expr_ty ) b ) -> v . Name . id : NULL , p -> arena ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s dotted_as_name[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dotted_name ['as' NAME]")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// Left-recursive +// dotted_name: dotted_name '.' NAME | NAME +static expr_ty dotted_name_raw(Parser *); +static expr_ty +dotted_name_rule(Parser *p) +{ + D(p->level++); + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, dotted_name_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + int _resmark = p->mark; + while (1) { + int tmpvar_0 = _PyPegen_update_memo(p, _mark, dotted_name_type, _res); + if (tmpvar_0) { + D(p->level--); + return _res; + } + p->mark = _mark; + void *_raw = dotted_name_raw(p); + if (p->error_indicator) + return NULL; + if (_raw == NULL || p->mark <= _resmark) + break; + _resmark = p->mark; + _res = _raw; + } + p->mark = _resmark; + D(p->level--); + return _res; +} +static expr_ty +dotted_name_raw(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // dotted_name '.' NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> dotted_name[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_name '.' NAME")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = dotted_name_rule(p)) // dotted_name + && + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + && + (b = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ dotted_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_name '.' NAME")); + _res = _PyPegen_join_names_with_dot ( p , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s dotted_name[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dotted_name '.' NAME")); + } + { // NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> dotted_name[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME")); + expr_ty name_var; + if ( + (name_var = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ dotted_name[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME")); + _res = name_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s dotted_name[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// if_stmt: +// | 'if' named_expression ':' block elif_stmt +// | 'if' named_expression ':' block else_block? +static stmt_ty +if_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'if' named_expression ':' block elif_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> if_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' named_expression ':' block elif_stmt")); + Token * _keyword; + Token * _literal; + expr_ty a; + asdl_seq* b; + stmt_ty c; + if ( + (_keyword = _PyPegen_expect_token(p, 510)) // token='if' + && + (a = named_expression_rule(p)) // named_expression + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + && + (c = elif_stmt_rule(p)) // elif_stmt + ) + { + D(fprintf(stderr, "%*c+ if_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' named_expression ':' block elif_stmt")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_If ( a , b , CHECK ( _PyPegen_singleton_seq ( p , c ) ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s if_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' named_expression ':' block elif_stmt")); + } + { // 'if' named_expression ':' block else_block? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> if_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' named_expression ':' block else_block?")); + Token * _keyword; + Token * _literal; + expr_ty a; + asdl_seq* b; + void *c; + if ( + (_keyword = _PyPegen_expect_token(p, 510)) // token='if' + && + (a = named_expression_rule(p)) // named_expression + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + && + (c = else_block_rule(p), 1) // else_block? + ) + { + D(fprintf(stderr, "%*c+ if_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' named_expression ':' block else_block?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_If ( a , b , c , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s if_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' named_expression ':' block else_block?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// elif_stmt: +// | 'elif' named_expression ':' block elif_stmt +// | 'elif' named_expression ':' block else_block? +static stmt_ty +elif_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'elif' named_expression ':' block elif_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> elif_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'elif' named_expression ':' block elif_stmt")); + Token * _keyword; + Token * _literal; + expr_ty a; + asdl_seq* b; + stmt_ty c; + if ( + (_keyword = _PyPegen_expect_token(p, 515)) // token='elif' + && + (a = named_expression_rule(p)) // named_expression + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + && + (c = elif_stmt_rule(p)) // elif_stmt + ) + { + D(fprintf(stderr, "%*c+ elif_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'elif' named_expression ':' block elif_stmt")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_If ( a , b , CHECK ( _PyPegen_singleton_seq ( p , c ) ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s elif_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'elif' named_expression ':' block elif_stmt")); + } + { // 'elif' named_expression ':' block else_block? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> elif_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'elif' named_expression ':' block else_block?")); + Token * _keyword; + Token * _literal; + expr_ty a; + asdl_seq* b; + void *c; + if ( + (_keyword = _PyPegen_expect_token(p, 515)) // token='elif' + && + (a = named_expression_rule(p)) // named_expression + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + && + (c = else_block_rule(p), 1) // else_block? + ) + { + D(fprintf(stderr, "%*c+ elif_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'elif' named_expression ':' block else_block?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_If ( a , b , c , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s elif_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'elif' named_expression ':' block else_block?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// else_block: 'else' ':' block +static asdl_seq* +else_block_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // 'else' ':' block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> else_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'else' ':' block")); + Token * _keyword; + Token * _literal; + asdl_seq* b; + if ( + (_keyword = _PyPegen_expect_token(p, 516)) // token='else' + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ else_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'else' ':' block")); + _res = b; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s else_block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'else' ':' block")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// while_stmt: 'while' named_expression ':' block else_block? +static stmt_ty +while_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'while' named_expression ':' block else_block? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> while_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'while' named_expression ':' block else_block?")); + Token * _keyword; + Token * _literal; + expr_ty a; + asdl_seq* b; + void *c; + if ( + (_keyword = _PyPegen_expect_token(p, 512)) // token='while' + && + (a = named_expression_rule(p)) // named_expression + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + && + (c = else_block_rule(p), 1) // else_block? + ) + { + D(fprintf(stderr, "%*c+ while_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'while' named_expression ':' block else_block?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_While ( a , b , c , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s while_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'while' named_expression ':' block else_block?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// for_stmt: +// | 'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block? +// | ASYNC 'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block? +// | invalid_for_target +static stmt_ty +for_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> for_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block?")); + int _cut_var = 0; + Token * _keyword; + Token * _keyword_1; + Token * _literal; + asdl_seq* b; + void *el; + expr_ty ex; + expr_ty t; + void *tc; + if ( + (_keyword = _PyPegen_expect_token(p, 517)) // token='for' + && + (t = star_targets_rule(p)) // star_targets + && + (_keyword_1 = _PyPegen_expect_token(p, 518)) // token='in' + && + (_cut_var = 1) + && + (ex = star_expressions_rule(p)) // star_expressions + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + && + (b = block_rule(p)) // block + && + (el = else_block_rule(p), 1) // else_block? + ) + { + D(fprintf(stderr, "%*c+ for_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_For ( t , ex , b , el , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s for_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block?")); + if (_cut_var) { + D(p->level--); + return NULL; + } + } + { // ASYNC 'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> for_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block?")); + int _cut_var = 0; + Token * _keyword; + Token * _keyword_1; + Token * _literal; + Token * async_var; + asdl_seq* b; + void *el; + expr_ty ex; + expr_ty t; + void *tc; + if ( + (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' + && + (_keyword = _PyPegen_expect_token(p, 517)) // token='for' + && + (t = star_targets_rule(p)) // star_targets + && + (_keyword_1 = _PyPegen_expect_token(p, 518)) // token='in' + && + (_cut_var = 1) + && + (ex = star_expressions_rule(p)) // star_expressions + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + && + (b = block_rule(p)) // block + && + (el = else_block_rule(p), 1) // else_block? + ) + { + D(fprintf(stderr, "%*c+ for_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = CHECK_VERSION ( 5 , "Async for loops are" , _Py_AsyncFor ( t , ex , b , el , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s for_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ star_expressions ':' TYPE_COMMENT? block else_block?")); + if (_cut_var) { + D(p->level--); + return NULL; + } + } + if (p->call_invalid_rules) { // invalid_for_target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> for_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_for_target")); + void *invalid_for_target_var; + if ( + (invalid_for_target_var = invalid_for_target_rule(p)) // invalid_for_target + ) + { + D(fprintf(stderr, "%*c+ for_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_for_target")); + _res = invalid_for_target_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s for_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_for_target")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// with_stmt: +// | 'with' '(' ','.with_item+ ','? ')' ':' block +// | 'with' ','.with_item+ ':' TYPE_COMMENT? block +// | ASYNC 'with' '(' ','.with_item+ ','? ')' ':' block +// | ASYNC 'with' ','.with_item+ ':' TYPE_COMMENT? block +static stmt_ty +with_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'with' '(' ','.with_item+ ','? ')' ':' block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'with' '(' ','.with_item+ ','? ')' ':' block")); + Token * _keyword; + Token * _literal; + Token * _literal_1; + Token * _literal_2; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + asdl_seq * a; + asdl_seq* b; + if ( + (_keyword = _PyPegen_expect_token(p, 519)) // token='with' + && + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = _gather_39_rule(p)) // ','.with_item+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + && + (_literal_2 = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ with_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'with' '(' ','.with_item+ ','? ')' ':' block")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_With ( a , b , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s with_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'with' '(' ','.with_item+ ','? ')' ':' block")); + } + { // 'with' ','.with_item+ ':' TYPE_COMMENT? block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'with' ','.with_item+ ':' TYPE_COMMENT? block")); + Token * _keyword; + Token * _literal; + asdl_seq * a; + asdl_seq* b; + void *tc; + if ( + (_keyword = _PyPegen_expect_token(p, 519)) // token='with' + && + (a = _gather_41_rule(p)) // ','.with_item+ + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + && + (b = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ with_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'with' ','.with_item+ ':' TYPE_COMMENT? block")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_With ( a , b , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s with_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'with' ','.with_item+ ':' TYPE_COMMENT? block")); + } + { // ASYNC 'with' '(' ','.with_item+ ','? ')' ':' block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC 'with' '(' ','.with_item+ ','? ')' ':' block")); + Token * _keyword; + Token * _literal; + Token * _literal_1; + Token * _literal_2; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + asdl_seq * a; + Token * async_var; + asdl_seq* b; + if ( + (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' + && + (_keyword = _PyPegen_expect_token(p, 519)) // token='with' + && + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = _gather_43_rule(p)) // ','.with_item+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + && + (_literal_2 = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ with_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC 'with' '(' ','.with_item+ ','? ')' ':' block")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = CHECK_VERSION ( 5 , "Async with statements are" , _Py_AsyncWith ( a , b , NULL , EXTRA ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s with_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC 'with' '(' ','.with_item+ ','? ')' ':' block")); + } + { // ASYNC 'with' ','.with_item+ ':' TYPE_COMMENT? block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> with_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC 'with' ','.with_item+ ':' TYPE_COMMENT? block")); + Token * _keyword; + Token * _literal; + asdl_seq * a; + Token * async_var; + asdl_seq* b; + void *tc; + if ( + (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' + && + (_keyword = _PyPegen_expect_token(p, 519)) // token='with' + && + (a = _gather_45_rule(p)) // ','.with_item+ + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + && + (b = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ with_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC 'with' ','.with_item+ ':' TYPE_COMMENT? block")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = CHECK_VERSION ( 5 , "Async with statements are" , _Py_AsyncWith ( a , b , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s with_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC 'with' ','.with_item+ ':' TYPE_COMMENT? block")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// with_item: +// | expression 'as' star_target &(',' | ')' | ':') +// | invalid_with_item +// | expression +static withitem_ty +with_item_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + withitem_ty _res = NULL; + int _mark = p->mark; + { // expression 'as' star_target &(',' | ')' | ':') + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> with_item[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression 'as' star_target &(',' | ')' | ':')")); + Token * _keyword; + expr_ty e; + expr_ty t; + if ( + (e = expression_rule(p)) // expression + && + (_keyword = _PyPegen_expect_token(p, 520)) // token='as' + && + (t = star_target_rule(p)) // star_target + && + _PyPegen_lookahead(1, _tmp_47_rule, p) + ) + { + D(fprintf(stderr, "%*c+ with_item[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression 'as' star_target &(',' | ')' | ':')")); + _res = _Py_withitem ( e , t , p -> arena ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s with_item[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression 'as' star_target &(',' | ')' | ':')")); + } + if (p->call_invalid_rules) { // invalid_with_item + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> with_item[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_with_item")); + void *invalid_with_item_var; + if ( + (invalid_with_item_var = invalid_with_item_rule(p)) // invalid_with_item + ) + { + D(fprintf(stderr, "%*c+ with_item[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_with_item")); + _res = invalid_with_item_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s with_item[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_with_item")); + } + { // expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> with_item[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression")); + expr_ty e; + if ( + (e = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ with_item[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression")); + _res = _Py_withitem ( e , NULL , p -> arena ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s with_item[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// try_stmt: +// | 'try' ':' block finally_block +// | 'try' ':' block except_block+ else_block? finally_block? +static stmt_ty +try_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'try' ':' block finally_block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> try_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'try' ':' block finally_block")); + Token * _keyword; + Token * _literal; + asdl_seq* b; + asdl_seq* f; + if ( + (_keyword = _PyPegen_expect_token(p, 511)) // token='try' + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + && + (f = finally_block_rule(p)) // finally_block + ) + { + D(fprintf(stderr, "%*c+ try_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'try' ':' block finally_block")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Try ( b , NULL , NULL , f , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s try_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'try' ':' block finally_block")); + } + { // 'try' ':' block except_block+ else_block? finally_block? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> try_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'try' ':' block except_block+ else_block? finally_block?")); + Token * _keyword; + Token * _literal; + asdl_seq* b; + void *el; + asdl_seq * ex; + void *f; + if ( + (_keyword = _PyPegen_expect_token(p, 511)) // token='try' + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + && + (ex = _loop1_48_rule(p)) // except_block+ + && + (el = else_block_rule(p), 1) // else_block? + && + (f = finally_block_rule(p), 1) // finally_block? + ) + { + D(fprintf(stderr, "%*c+ try_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'try' ':' block except_block+ else_block? finally_block?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Try ( b , ex , el , f , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s try_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'try' ':' block except_block+ else_block? finally_block?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// except_block: 'except' expression ['as' NAME] ':' block | 'except' ':' block +static excepthandler_ty +except_block_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + excepthandler_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'except' expression ['as' NAME] ':' block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' expression ['as' NAME] ':' block")); + Token * _keyword; + Token * _literal; + asdl_seq* b; + expr_ty e; + void *t; + if ( + (_keyword = _PyPegen_expect_token(p, 521)) // token='except' + && + (e = expression_rule(p)) // expression + && + (t = _tmp_49_rule(p), 1) // ['as' NAME] + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ except_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' expression ['as' NAME] ':' block")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_ExceptHandler ( e , ( t ) ? ( ( expr_ty ) t ) -> v . Name . id : NULL , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s except_block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' expression ['as' NAME] ':' block")); + } + { // 'except' ':' block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> except_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'except' ':' block")); + Token * _keyword; + Token * _literal; + asdl_seq* b; + if ( + (_keyword = _PyPegen_expect_token(p, 521)) // token='except' + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ except_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'except' ':' block")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_ExceptHandler ( NULL , NULL , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s except_block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'except' ':' block")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// finally_block: 'finally' ':' block +static asdl_seq* +finally_block_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // 'finally' ':' block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> finally_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'finally' ':' block")); + Token * _keyword; + Token * _literal; + asdl_seq* a; + if ( + (_keyword = _PyPegen_expect_token(p, 522)) // token='finally' + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (a = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ finally_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'finally' ':' block")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s finally_block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'finally' ':' block")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// return_stmt: 'return' star_expressions? +static stmt_ty +return_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'return' star_expressions? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> return_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'return' star_expressions?")); + Token * _keyword; + void *a; + if ( + (_keyword = _PyPegen_expect_token(p, 500)) // token='return' + && + (a = star_expressions_rule(p), 1) // star_expressions? + ) + { + D(fprintf(stderr, "%*c+ return_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'return' star_expressions?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Return ( a , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s return_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'return' star_expressions?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// raise_stmt: 'raise' expression ['from' expression] | 'raise' +static stmt_ty +raise_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'raise' expression ['from' expression] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> raise_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'raise' expression ['from' expression]")); + Token * _keyword; + expr_ty a; + void *b; + if ( + (_keyword = _PyPegen_expect_token(p, 501)) // token='raise' + && + (a = expression_rule(p)) // expression + && + (b = _tmp_50_rule(p), 1) // ['from' expression] + ) + { + D(fprintf(stderr, "%*c+ raise_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'raise' expression ['from' expression]")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Raise ( a , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s raise_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'raise' expression ['from' expression]")); + } + { // 'raise' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> raise_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'raise'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 501)) // token='raise' + ) + { + D(fprintf(stderr, "%*c+ raise_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'raise'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Raise ( NULL , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s raise_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'raise'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// function_def: decorators function_def_raw | function_def_raw +static stmt_ty +function_def_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + { // decorators function_def_raw + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> function_def[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "decorators function_def_raw")); + asdl_seq* d; + stmt_ty f; + if ( + (d = decorators_rule(p)) // decorators + && + (f = function_def_raw_rule(p)) // function_def_raw + ) + { + D(fprintf(stderr, "%*c+ function_def[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "decorators function_def_raw")); + _res = _PyPegen_function_def_decorators ( p , d , f ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s function_def[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "decorators function_def_raw")); + } + { // function_def_raw + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> function_def[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "function_def_raw")); + stmt_ty function_def_raw_var; + if ( + (function_def_raw_var = function_def_raw_rule(p)) // function_def_raw + ) + { + D(fprintf(stderr, "%*c+ function_def[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "function_def_raw")); + _res = function_def_raw_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s function_def[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "function_def_raw")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// function_def_raw: +// | 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block +// | ASYNC 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block +static stmt_ty +function_def_raw_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> function_def_raw[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block")); + Token * _keyword; + Token * _literal; + Token * _literal_1; + Token * _literal_2; + void *a; + asdl_seq* b; + expr_ty n; + void *params; + void *tc; + if ( + (_keyword = _PyPegen_expect_token(p, 523)) // token='def' + && + (n = _PyPegen_name_token(p)) // NAME + && + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (params = params_rule(p), 1) // params? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + && + (a = _tmp_51_rule(p), 1) // ['->' expression] + && + (_literal_2 = _PyPegen_expect_token(p, 11)) // token=':' + && + (tc = func_type_comment_rule(p), 1) // func_type_comment? + && + (b = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ function_def_raw[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_FunctionDef ( n -> v . Name . id , ( params ) ? params : CHECK ( _PyPegen_empty_arguments ( p ) ) , b , NULL , a , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s function_def_raw[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block")); + } + { // ASYNC 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> function_def_raw[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block")); + Token * _keyword; + Token * _literal; + Token * _literal_1; + Token * _literal_2; + void *a; + Token * async_var; + asdl_seq* b; + expr_ty n; + void *params; + void *tc; + if ( + (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' + && + (_keyword = _PyPegen_expect_token(p, 523)) // token='def' + && + (n = _PyPegen_name_token(p)) // NAME + && + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (params = params_rule(p), 1) // params? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + && + (a = _tmp_52_rule(p), 1) // ['->' expression] + && + (_literal_2 = _PyPegen_expect_token(p, 11)) // token=':' + && + (tc = func_type_comment_rule(p), 1) // func_type_comment? + && + (b = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ function_def_raw[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = CHECK_VERSION ( 5 , "Async functions are" , _Py_AsyncFunctionDef ( n -> v . Name . id , ( params ) ? params : CHECK ( _PyPegen_empty_arguments ( p ) ) , b , NULL , a , NEW_TYPE_COMMENT ( p , tc ) , EXTRA ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s function_def_raw[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC 'def' NAME '(' params? ')' ['->' expression] ':' func_type_comment? block")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// func_type_comment: +// | NEWLINE TYPE_COMMENT &(NEWLINE INDENT) +// | invalid_double_type_comments +// | TYPE_COMMENT +static Token* +func_type_comment_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + Token* _res = NULL; + int _mark = p->mark; + { // NEWLINE TYPE_COMMENT &(NEWLINE INDENT) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> func_type_comment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE TYPE_COMMENT &(NEWLINE INDENT)")); + Token * newline_var; + Token * t; + if ( + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + && + (t = _PyPegen_expect_token(p, TYPE_COMMENT)) // token='TYPE_COMMENT' + && + _PyPegen_lookahead(1, _tmp_53_rule, p) + ) + { + D(fprintf(stderr, "%*c+ func_type_comment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE TYPE_COMMENT &(NEWLINE INDENT)")); + _res = t; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s func_type_comment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE TYPE_COMMENT &(NEWLINE INDENT)")); + } + if (p->call_invalid_rules) { // invalid_double_type_comments + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> func_type_comment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_double_type_comments")); + void *invalid_double_type_comments_var; + if ( + (invalid_double_type_comments_var = invalid_double_type_comments_rule(p)) // invalid_double_type_comments + ) + { + D(fprintf(stderr, "%*c+ func_type_comment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_double_type_comments")); + _res = invalid_double_type_comments_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s func_type_comment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_double_type_comments")); + } + { // TYPE_COMMENT + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> func_type_comment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "TYPE_COMMENT")); + Token * type_comment_var; + if ( + (type_comment_var = _PyPegen_expect_token(p, TYPE_COMMENT)) // token='TYPE_COMMENT' + ) + { + D(fprintf(stderr, "%*c+ func_type_comment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "TYPE_COMMENT")); + _res = type_comment_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s func_type_comment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "TYPE_COMMENT")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// params: invalid_parameters | parameters +static arguments_ty +params_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + arguments_ty _res = NULL; + int _mark = p->mark; + if (p->call_invalid_rules) { // invalid_parameters + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> params[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_parameters")); + void *invalid_parameters_var; + if ( + (invalid_parameters_var = invalid_parameters_rule(p)) // invalid_parameters + ) + { + D(fprintf(stderr, "%*c+ params[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_parameters")); + _res = invalid_parameters_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s params[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_parameters")); + } + { // parameters + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> params[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "parameters")); + arguments_ty parameters_var; + if ( + (parameters_var = parameters_rule(p)) // parameters + ) + { + D(fprintf(stderr, "%*c+ params[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "parameters")); + _res = parameters_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s params[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "parameters")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// parameters: +// | slash_no_default param_no_default* param_with_default* star_etc? +// | slash_with_default param_with_default* star_etc? +// | param_no_default+ param_with_default* star_etc? +// | param_with_default+ star_etc? +// | star_etc +static arguments_ty +parameters_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + arguments_ty _res = NULL; + int _mark = p->mark; + { // slash_no_default param_no_default* param_with_default* star_etc? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_no_default param_no_default* param_with_default* star_etc?")); + asdl_seq* a; + asdl_seq * b; + asdl_seq * c; + void *d; + if ( + (a = slash_no_default_rule(p)) // slash_no_default + && + (b = _loop0_54_rule(p)) // param_no_default* + && + (c = _loop0_55_rule(p)) // param_with_default* + && + (d = star_etc_rule(p), 1) // star_etc? + ) + { + D(fprintf(stderr, "%*c+ parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_no_default param_no_default* param_with_default* star_etc?")); + _res = _PyPegen_make_arguments ( p , a , NULL , b , c , d ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_no_default param_no_default* param_with_default* star_etc?")); + } + { // slash_with_default param_with_default* star_etc? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default param_with_default* star_etc?")); + SlashWithDefault* a; + asdl_seq * b; + void *c; + if ( + (a = slash_with_default_rule(p)) // slash_with_default + && + (b = _loop0_56_rule(p)) // param_with_default* + && + (c = star_etc_rule(p), 1) // star_etc? + ) + { + D(fprintf(stderr, "%*c+ parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default param_with_default* star_etc?")); + _res = _PyPegen_make_arguments ( p , NULL , a , NULL , b , c ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_with_default param_with_default* star_etc?")); + } + { // param_no_default+ param_with_default* star_etc? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default+ param_with_default* star_etc?")); + asdl_seq * a; + asdl_seq * b; + void *c; + if ( + (a = _loop1_57_rule(p)) // param_no_default+ + && + (b = _loop0_58_rule(p)) // param_with_default* + && + (c = star_etc_rule(p), 1) // star_etc? + ) + { + D(fprintf(stderr, "%*c+ parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default+ param_with_default* star_etc?")); + _res = _PyPegen_make_arguments ( p , NULL , NULL , a , b , c ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default+ param_with_default* star_etc?")); + } + { // param_with_default+ star_etc? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default+ star_etc?")); + asdl_seq * a; + void *b; + if ( + (a = _loop1_59_rule(p)) // param_with_default+ + && + (b = star_etc_rule(p), 1) // star_etc? + ) + { + D(fprintf(stderr, "%*c+ parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_with_default+ star_etc?")); + _res = _PyPegen_make_arguments ( p , NULL , NULL , NULL , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default+ star_etc?")); + } + { // star_etc + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_etc")); + StarEtc* a; + if ( + (a = star_etc_rule(p)) // star_etc + ) + { + D(fprintf(stderr, "%*c+ parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_etc")); + _res = _PyPegen_make_arguments ( p , NULL , NULL , NULL , NULL , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_etc")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// slash_no_default: param_no_default+ '/' ',' | param_no_default+ '/' &')' +static asdl_seq* +slash_no_default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // param_no_default+ '/' ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> slash_no_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default+ '/' ','")); + Token * _literal; + Token * _literal_1; + asdl_seq * a; + if ( + (a = _loop1_60_rule(p)) // param_no_default+ + && + (_literal = _PyPegen_expect_token(p, 17)) // token='/' + && + (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ slash_no_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default+ '/' ','")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s slash_no_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default+ '/' ','")); + } + { // param_no_default+ '/' &')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> slash_no_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default+ '/' &')'")); + Token * _literal; + asdl_seq * a; + if ( + (a = _loop1_61_rule(p)) // param_no_default+ + && + (_literal = _PyPegen_expect_token(p, 17)) // token='/' + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 8) // token=')' + ) + { + D(fprintf(stderr, "%*c+ slash_no_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default+ '/' &')'")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s slash_no_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default+ '/' &')'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// slash_with_default: +// | param_no_default* param_with_default+ '/' ',' +// | param_no_default* param_with_default+ '/' &')' +static SlashWithDefault* +slash_with_default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + SlashWithDefault* _res = NULL; + int _mark = p->mark; + { // param_no_default* param_with_default+ '/' ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> slash_with_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default* param_with_default+ '/' ','")); + Token * _literal; + Token * _literal_1; + asdl_seq * a; + asdl_seq * b; + if ( + (a = _loop0_62_rule(p)) // param_no_default* + && + (b = _loop1_63_rule(p)) // param_with_default+ + && + (_literal = _PyPegen_expect_token(p, 17)) // token='/' + && + (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ slash_with_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default* param_with_default+ '/' ','")); + _res = _PyPegen_slash_with_default ( p , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s slash_with_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default* param_with_default+ '/' ','")); + } + { // param_no_default* param_with_default+ '/' &')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> slash_with_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default* param_with_default+ '/' &')'")); + Token * _literal; + asdl_seq * a; + asdl_seq * b; + if ( + (a = _loop0_64_rule(p)) // param_no_default* + && + (b = _loop1_65_rule(p)) // param_with_default+ + && + (_literal = _PyPegen_expect_token(p, 17)) // token='/' + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 8) // token=')' + ) + { + D(fprintf(stderr, "%*c+ slash_with_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default* param_with_default+ '/' &')'")); + _res = _PyPegen_slash_with_default ( p , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s slash_with_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default* param_with_default+ '/' &')'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// star_etc: +// | '*' param_no_default param_maybe_default* kwds? +// | '*' ',' param_maybe_default+ kwds? +// | kwds +// | invalid_star_etc +static StarEtc* +star_etc_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + StarEtc* _res = NULL; + int _mark = p->mark; + { // '*' param_no_default param_maybe_default* kwds? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' param_no_default param_maybe_default* kwds?")); + Token * _literal; + arg_ty a; + asdl_seq * b; + void *c; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (a = param_no_default_rule(p)) // param_no_default + && + (b = _loop0_66_rule(p)) // param_maybe_default* + && + (c = kwds_rule(p), 1) // kwds? + ) + { + D(fprintf(stderr, "%*c+ star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' param_no_default param_maybe_default* kwds?")); + _res = _PyPegen_star_etc ( p , a , b , c ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' param_no_default param_maybe_default* kwds?")); + } + { // '*' ',' param_maybe_default+ kwds? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' ',' param_maybe_default+ kwds?")); + Token * _literal; + Token * _literal_1; + asdl_seq * b; + void *c; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' + && + (b = _loop1_67_rule(p)) // param_maybe_default+ + && + (c = kwds_rule(p), 1) // kwds? + ) + { + D(fprintf(stderr, "%*c+ star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' ',' param_maybe_default+ kwds?")); + _res = _PyPegen_star_etc ( p , NULL , b , c ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' ',' param_maybe_default+ kwds?")); + } + { // kwds + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwds")); + arg_ty a; + if ( + (a = kwds_rule(p)) // kwds + ) + { + D(fprintf(stderr, "%*c+ star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwds")); + _res = _PyPegen_star_etc ( p , NULL , NULL , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwds")); + } + if (p->call_invalid_rules) { // invalid_star_etc + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_star_etc")); + void *invalid_star_etc_var; + if ( + (invalid_star_etc_var = invalid_star_etc_rule(p)) // invalid_star_etc + ) + { + D(fprintf(stderr, "%*c+ star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_star_etc")); + _res = invalid_star_etc_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_star_etc")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// kwds: '**' param_no_default +static arg_ty +kwds_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + arg_ty _res = NULL; + int _mark = p->mark; + { // '**' param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kwds[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**' param_no_default")); + Token * _literal; + arg_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 35)) // token='**' + && + (a = param_no_default_rule(p)) // param_no_default + ) + { + D(fprintf(stderr, "%*c+ kwds[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' param_no_default")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kwds[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**' param_no_default")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// param_no_default: param ',' TYPE_COMMENT? | param TYPE_COMMENT? &')' +static arg_ty +param_no_default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + arg_ty _res = NULL; + int _mark = p->mark; + { // param ',' TYPE_COMMENT? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> param_no_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param ',' TYPE_COMMENT?")); + Token * _literal; + arg_ty a; + void *tc; + if ( + (a = param_rule(p)) // param + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + ) + { + D(fprintf(stderr, "%*c+ param_no_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param ',' TYPE_COMMENT?")); + _res = _PyPegen_add_type_comment_to_arg ( p , a , tc ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s param_no_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param ',' TYPE_COMMENT?")); + } + { // param TYPE_COMMENT? &')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> param_no_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param TYPE_COMMENT? &')'")); + arg_ty a; + void *tc; + if ( + (a = param_rule(p)) // param + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 8) // token=')' + ) + { + D(fprintf(stderr, "%*c+ param_no_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param TYPE_COMMENT? &')'")); + _res = _PyPegen_add_type_comment_to_arg ( p , a , tc ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s param_no_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param TYPE_COMMENT? &')'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// param_with_default: param default ',' TYPE_COMMENT? | param default TYPE_COMMENT? &')' +static NameDefaultPair* +param_with_default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + NameDefaultPair* _res = NULL; + int _mark = p->mark; + { // param default ',' TYPE_COMMENT? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> param_with_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param default ',' TYPE_COMMENT?")); + Token * _literal; + arg_ty a; + expr_ty c; + void *tc; + if ( + (a = param_rule(p)) // param + && + (c = default_rule(p)) // default + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + ) + { + D(fprintf(stderr, "%*c+ param_with_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param default ',' TYPE_COMMENT?")); + _res = _PyPegen_name_default_pair ( p , a , c , tc ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s param_with_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param default ',' TYPE_COMMENT?")); + } + { // param default TYPE_COMMENT? &')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> param_with_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param default TYPE_COMMENT? &')'")); + arg_ty a; + expr_ty c; + void *tc; + if ( + (a = param_rule(p)) // param + && + (c = default_rule(p)) // default + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 8) // token=')' + ) + { + D(fprintf(stderr, "%*c+ param_with_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param default TYPE_COMMENT? &')'")); + _res = _PyPegen_name_default_pair ( p , a , c , tc ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s param_with_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param default TYPE_COMMENT? &')'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// param_maybe_default: +// | param default? ',' TYPE_COMMENT? +// | param default? TYPE_COMMENT? &')' +static NameDefaultPair* +param_maybe_default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + NameDefaultPair* _res = NULL; + int _mark = p->mark; + { // param default? ',' TYPE_COMMENT? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> param_maybe_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param default? ',' TYPE_COMMENT?")); + Token * _literal; + arg_ty a; + void *c; + void *tc; + if ( + (a = param_rule(p)) // param + && + (c = default_rule(p), 1) // default? + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + ) + { + D(fprintf(stderr, "%*c+ param_maybe_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param default? ',' TYPE_COMMENT?")); + _res = _PyPegen_name_default_pair ( p , a , c , tc ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s param_maybe_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param default? ',' TYPE_COMMENT?")); + } + { // param default? TYPE_COMMENT? &')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> param_maybe_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param default? TYPE_COMMENT? &')'")); + arg_ty a; + void *c; + void *tc; + if ( + (a = param_rule(p)) // param + && + (c = default_rule(p), 1) // default? + && + (tc = _PyPegen_expect_token(p, TYPE_COMMENT), 1) // TYPE_COMMENT? + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 8) // token=')' + ) + { + D(fprintf(stderr, "%*c+ param_maybe_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param default? TYPE_COMMENT? &')'")); + _res = _PyPegen_name_default_pair ( p , a , c , tc ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s param_maybe_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param default? TYPE_COMMENT? &')'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// param: NAME annotation? +static arg_ty +param_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + arg_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // NAME annotation? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> param[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME annotation?")); + expr_ty a; + void *b; + if ( + (a = _PyPegen_name_token(p)) // NAME + && + (b = annotation_rule(p), 1) // annotation? + ) + { + D(fprintf(stderr, "%*c+ param[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME annotation?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_arg ( a -> v . Name . id , b , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s param[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME annotation?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// annotation: ':' expression +static expr_ty +annotation_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // ':' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> annotation[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':' expression")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (a = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ annotation[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':' expression")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s annotation[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// default: '=' expression +static expr_ty +default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // '=' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'=' expression")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + && + (a = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' expression")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'=' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// decorators: (('@' named_expression NEWLINE))+ +static asdl_seq* +decorators_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // (('@' named_expression NEWLINE))+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> decorators[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(('@' named_expression NEWLINE))+")); + asdl_seq * a; + if ( + (a = _loop1_68_rule(p)) // (('@' named_expression NEWLINE))+ + ) + { + D(fprintf(stderr, "%*c+ decorators[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(('@' named_expression NEWLINE))+")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s decorators[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(('@' named_expression NEWLINE))+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// class_def: decorators class_def_raw | class_def_raw +static stmt_ty +class_def_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + { // decorators class_def_raw + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> class_def[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "decorators class_def_raw")); + asdl_seq* a; + stmt_ty b; + if ( + (a = decorators_rule(p)) // decorators + && + (b = class_def_raw_rule(p)) // class_def_raw + ) + { + D(fprintf(stderr, "%*c+ class_def[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "decorators class_def_raw")); + _res = _PyPegen_class_def_decorators ( p , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s class_def[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "decorators class_def_raw")); + } + { // class_def_raw + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> class_def[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "class_def_raw")); + stmt_ty class_def_raw_var; + if ( + (class_def_raw_var = class_def_raw_rule(p)) // class_def_raw + ) + { + D(fprintf(stderr, "%*c+ class_def[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "class_def_raw")); + _res = class_def_raw_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s class_def[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "class_def_raw")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// class_def_raw: 'class' NAME ['(' arguments? ')'] ':' block +static stmt_ty +class_def_raw_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + stmt_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'class' NAME ['(' arguments? ')'] ':' block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> class_def_raw[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'class' NAME ['(' arguments? ')'] ':' block")); + Token * _keyword; + Token * _literal; + expr_ty a; + void *b; + asdl_seq* c; + if ( + (_keyword = _PyPegen_expect_token(p, 524)) // token='class' + && + (a = _PyPegen_name_token(p)) // NAME + && + (b = _tmp_69_rule(p), 1) // ['(' arguments? ')'] + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (c = block_rule(p)) // block + ) + { + D(fprintf(stderr, "%*c+ class_def_raw[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'class' NAME ['(' arguments? ')'] ':' block")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_ClassDef ( a -> v . Name . id , ( b ) ? ( ( expr_ty ) b ) -> v . Call . args : NULL , ( b ) ? ( ( expr_ty ) b ) -> v . Call . keywords : NULL , c , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s class_def_raw[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'class' NAME ['(' arguments? ')'] ':' block")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// block: NEWLINE INDENT statements DEDENT | simple_stmt | invalid_block +static asdl_seq* +block_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + if (_PyPegen_is_memoized(p, block_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + { // NEWLINE INDENT statements DEDENT + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT statements DEDENT")); + asdl_seq* a; + Token * dedent_var; + Token * indent_var; + Token * newline_var; + if ( + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + && + (indent_var = _PyPegen_expect_token(p, INDENT)) // token='INDENT' + && + (a = statements_rule(p)) // statements + && + (dedent_var = _PyPegen_expect_token(p, DEDENT)) // token='DEDENT' + ) + { + D(fprintf(stderr, "%*c+ block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT statements DEDENT")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE INDENT statements DEDENT")); + } + { // simple_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "simple_stmt")); + asdl_seq* simple_stmt_var; + if ( + (simple_stmt_var = simple_stmt_rule(p)) // simple_stmt + ) + { + D(fprintf(stderr, "%*c+ block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "simple_stmt")); + _res = simple_stmt_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "simple_stmt")); + } + if (p->call_invalid_rules) { // invalid_block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_block")); + void *invalid_block_var; + if ( + (invalid_block_var = invalid_block_rule(p)) // invalid_block + ) + { + D(fprintf(stderr, "%*c+ block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_block")); + _res = invalid_block_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_block")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, block_type, _res); + D(p->level--); + return _res; +} + +// star_expressions: +// | star_expression ((',' star_expression))+ ','? +// | star_expression ',' +// | star_expression +static expr_ty +star_expressions_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // star_expression ((',' star_expression))+ ','? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expression ((',' star_expression))+ ','?")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + expr_ty a; + asdl_seq * b; + if ( + (a = star_expression_rule(p)) // star_expression + && + (b = _loop1_70_rule(p)) // ((',' star_expression))+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + ) + { + D(fprintf(stderr, "%*c+ star_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expression ((',' star_expression))+ ','?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Tuple ( CHECK ( _PyPegen_seq_insert_in_front ( p , a , b ) ) , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expression ((',' star_expression))+ ','?")); + } + { // star_expression ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expression ','")); + Token * _literal; + expr_ty a; + if ( + (a = star_expression_rule(p)) // star_expression + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ star_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expression ','")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Tuple ( CHECK ( _PyPegen_singleton_seq ( p , a ) ) , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expression ','")); + } + { // star_expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expression")); + expr_ty star_expression_var; + if ( + (star_expression_var = star_expression_rule(p)) // star_expression + ) + { + D(fprintf(stderr, "%*c+ star_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expression")); + _res = star_expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// star_expression: '*' bitwise_or | expression +static expr_ty +star_expression_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, star_expression_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '*' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' bitwise_or")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ star_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' bitwise_or")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Starred ( a , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' bitwise_or")); + } + { // expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression")); + expr_ty expression_var; + if ( + (expression_var = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ star_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression")); + _res = expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, star_expression_type, _res); + D(p->level--); + return _res; +} + +// star_named_expressions: ','.star_named_expression+ ','? +static asdl_seq* +star_named_expressions_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // ','.star_named_expression+ ','? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_named_expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.star_named_expression+ ','?")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + asdl_seq * a; + if ( + (a = _gather_71_rule(p)) // ','.star_named_expression+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + ) + { + D(fprintf(stderr, "%*c+ star_named_expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.star_named_expression+ ','?")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_named_expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.star_named_expression+ ','?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// star_named_expression: '*' bitwise_or | named_expression +static expr_ty +star_named_expression_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '*' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_named_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' bitwise_or")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ star_named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' bitwise_or")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Starred ( a , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_named_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' bitwise_or")); + } + { // named_expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_named_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression")); + expr_ty named_expression_var; + if ( + (named_expression_var = named_expression_rule(p)) // named_expression + ) + { + D(fprintf(stderr, "%*c+ star_named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression")); + _res = named_expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_named_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "named_expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// named_expression: NAME ':=' ~ expression | expression !':=' | invalid_named_expression +static expr_ty +named_expression_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // NAME ':=' ~ expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> named_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME ':=' ~ expression")); + int _cut_var = 0; + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = _PyPegen_name_token(p)) // NAME + && + (_literal = _PyPegen_expect_token(p, 53)) // token=':=' + && + (_cut_var = 1) + && + (b = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME ':=' ~ expression")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_NamedExpr ( CHECK ( _PyPegen_set_expr_context ( p , a , Store ) ) , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s named_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME ':=' ~ expression")); + if (_cut_var) { + D(p->level--); + return NULL; + } + } + { // expression !':=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> named_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression !':='")); + expr_ty expression_var; + if ( + (expression_var = expression_rule(p)) // expression + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 53) // token=':=' + ) + { + D(fprintf(stderr, "%*c+ named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression !':='")); + _res = expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s named_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression !':='")); + } + if (p->call_invalid_rules) { // invalid_named_expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> named_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_named_expression")); + void *invalid_named_expression_var; + if ( + (invalid_named_expression_var = invalid_named_expression_rule(p)) // invalid_named_expression + ) + { + D(fprintf(stderr, "%*c+ named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_named_expression")); + _res = invalid_named_expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s named_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_named_expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// annotated_rhs: yield_expr | star_expressions +static expr_ty +annotated_rhs_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> annotated_rhs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ annotated_rhs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s annotated_rhs[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> annotated_rhs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ annotated_rhs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s annotated_rhs[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// expressions: expression ((',' expression))+ ','? | expression ',' | expression +static expr_ty +expressions_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // expression ((',' expression))+ ','? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ((',' expression))+ ','?")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + expr_ty a; + asdl_seq * b; + if ( + (a = expression_rule(p)) // expression + && + (b = _loop1_73_rule(p)) // ((',' expression))+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + ) + { + D(fprintf(stderr, "%*c+ expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ((',' expression))+ ','?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Tuple ( CHECK ( _PyPegen_seq_insert_in_front ( p , a , b ) ) , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ((',' expression))+ ','?")); + } + { // expression ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ','")); + Token * _literal; + expr_ty a; + if ( + (a = expression_rule(p)) // expression + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ','")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Tuple ( CHECK ( _PyPegen_singleton_seq ( p , a ) ) , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ','")); + } + { // expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> expressions[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression")); + expr_ty expression_var; + if ( + (expression_var = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ expressions[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression")); + _res = expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s expressions[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// expression: disjunction 'if' disjunction 'else' expression | disjunction | lambdef +static expr_ty +expression_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, expression_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // disjunction 'if' disjunction 'else' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "disjunction 'if' disjunction 'else' expression")); + Token * _keyword; + Token * _keyword_1; + expr_ty a; + expr_ty b; + expr_ty c; + if ( + (a = disjunction_rule(p)) // disjunction + && + (_keyword = _PyPegen_expect_token(p, 510)) // token='if' + && + (b = disjunction_rule(p)) // disjunction + && + (_keyword_1 = _PyPegen_expect_token(p, 516)) // token='else' + && + (c = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "disjunction 'if' disjunction 'else' expression")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_IfExp ( b , a , c , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "disjunction 'if' disjunction 'else' expression")); + } + { // disjunction + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "disjunction")); + expr_ty disjunction_var; + if ( + (disjunction_var = disjunction_rule(p)) // disjunction + ) + { + D(fprintf(stderr, "%*c+ expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "disjunction")); + _res = disjunction_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "disjunction")); + } + { // lambdef + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambdef")); + expr_ty lambdef_var; + if ( + (lambdef_var = lambdef_rule(p)) // lambdef + ) + { + D(fprintf(stderr, "%*c+ expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambdef")); + _res = lambdef_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambdef")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, expression_type, _res); + D(p->level--); + return _res; +} + +// lambdef: 'lambda' lambda_params? ':' expression +static expr_ty +lambdef_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'lambda' lambda_params? ':' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambdef[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'lambda' lambda_params? ':' expression")); + Token * _keyword; + Token * _literal; + void *a; + expr_ty b; + if ( + (_keyword = _PyPegen_expect_token(p, 525)) // token='lambda' + && + (a = lambda_params_rule(p), 1) // lambda_params? + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ lambdef[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'lambda' lambda_params? ':' expression")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Lambda ( ( a ) ? a : CHECK ( _PyPegen_empty_arguments ( p ) ) , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambdef[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'lambda' lambda_params? ':' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lambda_params: invalid_lambda_parameters | lambda_parameters +static arguments_ty +lambda_params_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + arguments_ty _res = NULL; + int _mark = p->mark; + if (p->call_invalid_rules) { // invalid_lambda_parameters + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_params[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_lambda_parameters")); + void *invalid_lambda_parameters_var; + if ( + (invalid_lambda_parameters_var = invalid_lambda_parameters_rule(p)) // invalid_lambda_parameters + ) + { + D(fprintf(stderr, "%*c+ lambda_params[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_lambda_parameters")); + _res = invalid_lambda_parameters_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_params[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_lambda_parameters")); + } + { // lambda_parameters + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_params[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_parameters")); + arguments_ty lambda_parameters_var; + if ( + (lambda_parameters_var = lambda_parameters_rule(p)) // lambda_parameters + ) + { + D(fprintf(stderr, "%*c+ lambda_params[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_parameters")); + _res = lambda_parameters_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_params[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_parameters")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lambda_parameters: +// | lambda_slash_no_default lambda_param_no_default* lambda_param_with_default* lambda_star_etc? +// | lambda_slash_with_default lambda_param_with_default* lambda_star_etc? +// | lambda_param_no_default+ lambda_param_with_default* lambda_star_etc? +// | lambda_param_with_default+ lambda_star_etc? +// | lambda_star_etc +static arguments_ty +lambda_parameters_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + arguments_ty _res = NULL; + int _mark = p->mark; + { // lambda_slash_no_default lambda_param_no_default* lambda_param_with_default* lambda_star_etc? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default lambda_param_no_default* lambda_param_with_default* lambda_star_etc?")); + asdl_seq* a; + asdl_seq * b; + asdl_seq * c; + void *d; + if ( + (a = lambda_slash_no_default_rule(p)) // lambda_slash_no_default + && + (b = _loop0_74_rule(p)) // lambda_param_no_default* + && + (c = _loop0_75_rule(p)) // lambda_param_with_default* + && + (d = lambda_star_etc_rule(p), 1) // lambda_star_etc? + ) + { + D(fprintf(stderr, "%*c+ lambda_parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_no_default lambda_param_no_default* lambda_param_with_default* lambda_star_etc?")); + _res = _PyPegen_make_arguments ( p , a , NULL , b , c , d ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_no_default lambda_param_no_default* lambda_param_with_default* lambda_star_etc?")); + } + { // lambda_slash_with_default lambda_param_with_default* lambda_star_etc? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default lambda_param_with_default* lambda_star_etc?")); + SlashWithDefault* a; + asdl_seq * b; + void *c; + if ( + (a = lambda_slash_with_default_rule(p)) // lambda_slash_with_default + && + (b = _loop0_76_rule(p)) // lambda_param_with_default* + && + (c = lambda_star_etc_rule(p), 1) // lambda_star_etc? + ) + { + D(fprintf(stderr, "%*c+ lambda_parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default lambda_param_with_default* lambda_star_etc?")); + _res = _PyPegen_make_arguments ( p , NULL , a , NULL , b , c ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_with_default lambda_param_with_default* lambda_star_etc?")); + } + { // lambda_param_no_default+ lambda_param_with_default* lambda_star_etc? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default+ lambda_param_with_default* lambda_star_etc?")); + asdl_seq * a; + asdl_seq * b; + void *c; + if ( + (a = _loop1_77_rule(p)) // lambda_param_no_default+ + && + (b = _loop0_78_rule(p)) // lambda_param_with_default* + && + (c = lambda_star_etc_rule(p), 1) // lambda_star_etc? + ) + { + D(fprintf(stderr, "%*c+ lambda_parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default+ lambda_param_with_default* lambda_star_etc?")); + _res = _PyPegen_make_arguments ( p , NULL , NULL , a , b , c ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default+ lambda_param_with_default* lambda_star_etc?")); + } + { // lambda_param_with_default+ lambda_star_etc? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+ lambda_star_etc?")); + asdl_seq * a; + void *b; + if ( + (a = _loop1_79_rule(p)) // lambda_param_with_default+ + && + (b = lambda_star_etc_rule(p), 1) // lambda_star_etc? + ) + { + D(fprintf(stderr, "%*c+ lambda_parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+ lambda_star_etc?")); + _res = _PyPegen_make_arguments ( p , NULL , NULL , NULL , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default+ lambda_star_etc?")); + } + { // lambda_star_etc + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_star_etc")); + StarEtc* a; + if ( + (a = lambda_star_etc_rule(p)) // lambda_star_etc + ) + { + D(fprintf(stderr, "%*c+ lambda_parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_star_etc")); + _res = _PyPegen_make_arguments ( p , NULL , NULL , NULL , NULL , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_star_etc")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lambda_slash_no_default: +// | lambda_param_no_default+ '/' ',' +// | lambda_param_no_default+ '/' &':' +static asdl_seq* +lambda_slash_no_default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // lambda_param_no_default+ '/' ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_slash_no_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default+ '/' ','")); + Token * _literal; + Token * _literal_1; + asdl_seq * a; + if ( + (a = _loop1_80_rule(p)) // lambda_param_no_default+ + && + (_literal = _PyPegen_expect_token(p, 17)) // token='/' + && + (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ lambda_slash_no_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default+ '/' ','")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_slash_no_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default+ '/' ','")); + } + { // lambda_param_no_default+ '/' &':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_slash_no_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default+ '/' &':'")); + Token * _literal; + asdl_seq * a; + if ( + (a = _loop1_81_rule(p)) // lambda_param_no_default+ + && + (_literal = _PyPegen_expect_token(p, 17)) // token='/' + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 11) // token=':' + ) + { + D(fprintf(stderr, "%*c+ lambda_slash_no_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default+ '/' &':'")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_slash_no_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default+ '/' &':'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lambda_slash_with_default: +// | lambda_param_no_default* lambda_param_with_default+ '/' ',' +// | lambda_param_no_default* lambda_param_with_default+ '/' &':' +static SlashWithDefault* +lambda_slash_with_default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + SlashWithDefault* _res = NULL; + int _mark = p->mark; + { // lambda_param_no_default* lambda_param_with_default+ '/' ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_slash_with_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default* lambda_param_with_default+ '/' ','")); + Token * _literal; + Token * _literal_1; + asdl_seq * a; + asdl_seq * b; + if ( + (a = _loop0_82_rule(p)) // lambda_param_no_default* + && + (b = _loop1_83_rule(p)) // lambda_param_with_default+ + && + (_literal = _PyPegen_expect_token(p, 17)) // token='/' + && + (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ lambda_slash_with_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default* lambda_param_with_default+ '/' ','")); + _res = _PyPegen_slash_with_default ( p , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_slash_with_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default* lambda_param_with_default+ '/' ','")); + } + { // lambda_param_no_default* lambda_param_with_default+ '/' &':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_slash_with_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default* lambda_param_with_default+ '/' &':'")); + Token * _literal; + asdl_seq * a; + asdl_seq * b; + if ( + (a = _loop0_84_rule(p)) // lambda_param_no_default* + && + (b = _loop1_85_rule(p)) // lambda_param_with_default+ + && + (_literal = _PyPegen_expect_token(p, 17)) // token='/' + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 11) // token=':' + ) + { + D(fprintf(stderr, "%*c+ lambda_slash_with_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default* lambda_param_with_default+ '/' &':'")); + _res = _PyPegen_slash_with_default ( p , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_slash_with_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default* lambda_param_with_default+ '/' &':'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lambda_star_etc: +// | '*' lambda_param_no_default lambda_param_maybe_default* lambda_kwds? +// | '*' ',' lambda_param_maybe_default+ lambda_kwds? +// | lambda_kwds +// | invalid_lambda_star_etc +static StarEtc* +lambda_star_etc_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + StarEtc* _res = NULL; + int _mark = p->mark; + { // '*' lambda_param_no_default lambda_param_maybe_default* lambda_kwds? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' lambda_param_no_default lambda_param_maybe_default* lambda_kwds?")); + Token * _literal; + arg_ty a; + asdl_seq * b; + void *c; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (a = lambda_param_no_default_rule(p)) // lambda_param_no_default + && + (b = _loop0_86_rule(p)) // lambda_param_maybe_default* + && + (c = lambda_kwds_rule(p), 1) // lambda_kwds? + ) + { + D(fprintf(stderr, "%*c+ lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' lambda_param_no_default lambda_param_maybe_default* lambda_kwds?")); + _res = _PyPegen_star_etc ( p , a , b , c ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' lambda_param_no_default lambda_param_maybe_default* lambda_kwds?")); + } + { // '*' ',' lambda_param_maybe_default+ lambda_kwds? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' ',' lambda_param_maybe_default+ lambda_kwds?")); + Token * _literal; + Token * _literal_1; + asdl_seq * b; + void *c; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' + && + (b = _loop1_87_rule(p)) // lambda_param_maybe_default+ + && + (c = lambda_kwds_rule(p), 1) // lambda_kwds? + ) + { + D(fprintf(stderr, "%*c+ lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' ',' lambda_param_maybe_default+ lambda_kwds?")); + _res = _PyPegen_star_etc ( p , NULL , b , c ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' ',' lambda_param_maybe_default+ lambda_kwds?")); + } + { // lambda_kwds + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_kwds")); + arg_ty a; + if ( + (a = lambda_kwds_rule(p)) // lambda_kwds + ) + { + D(fprintf(stderr, "%*c+ lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_kwds")); + _res = _PyPegen_star_etc ( p , NULL , NULL , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_kwds")); + } + if (p->call_invalid_rules) { // invalid_lambda_star_etc + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_lambda_star_etc")); + void *invalid_lambda_star_etc_var; + if ( + (invalid_lambda_star_etc_var = invalid_lambda_star_etc_rule(p)) // invalid_lambda_star_etc + ) + { + D(fprintf(stderr, "%*c+ lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_lambda_star_etc")); + _res = invalid_lambda_star_etc_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_lambda_star_etc")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lambda_kwds: '**' lambda_param_no_default +static arg_ty +lambda_kwds_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + arg_ty _res = NULL; + int _mark = p->mark; + { // '**' lambda_param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_kwds[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**' lambda_param_no_default")); + Token * _literal; + arg_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 35)) // token='**' + && + (a = lambda_param_no_default_rule(p)) // lambda_param_no_default + ) + { + D(fprintf(stderr, "%*c+ lambda_kwds[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' lambda_param_no_default")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_kwds[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**' lambda_param_no_default")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lambda_param_no_default: lambda_param ',' | lambda_param &':' +static arg_ty +lambda_param_no_default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + arg_ty _res = NULL; + int _mark = p->mark; + { // lambda_param ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_param_no_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param ','")); + Token * _literal; + arg_ty a; + if ( + (a = lambda_param_rule(p)) // lambda_param + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ lambda_param_no_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param ','")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_param_no_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param ','")); + } + { // lambda_param &':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_param_no_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param &':'")); + arg_ty a; + if ( + (a = lambda_param_rule(p)) // lambda_param + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 11) // token=':' + ) + { + D(fprintf(stderr, "%*c+ lambda_param_no_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param &':'")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_param_no_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param &':'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lambda_param_with_default: lambda_param default ',' | lambda_param default &':' +static NameDefaultPair* +lambda_param_with_default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + NameDefaultPair* _res = NULL; + int _mark = p->mark; + { // lambda_param default ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_param_with_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param default ','")); + Token * _literal; + arg_ty a; + expr_ty c; + if ( + (a = lambda_param_rule(p)) // lambda_param + && + (c = default_rule(p)) // default + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ lambda_param_with_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param default ','")); + _res = _PyPegen_name_default_pair ( p , a , c , NULL ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_param_with_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param default ','")); + } + { // lambda_param default &':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_param_with_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param default &':'")); + arg_ty a; + expr_ty c; + if ( + (a = lambda_param_rule(p)) // lambda_param + && + (c = default_rule(p)) // default + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 11) // token=':' + ) + { + D(fprintf(stderr, "%*c+ lambda_param_with_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param default &':'")); + _res = _PyPegen_name_default_pair ( p , a , c , NULL ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_param_with_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param default &':'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lambda_param_maybe_default: lambda_param default? ',' | lambda_param default? &':' +static NameDefaultPair* +lambda_param_maybe_default_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + NameDefaultPair* _res = NULL; + int _mark = p->mark; + { // lambda_param default? ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_param_maybe_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param default? ','")); + Token * _literal; + arg_ty a; + void *c; + if ( + (a = lambda_param_rule(p)) // lambda_param + && + (c = default_rule(p), 1) // default? + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ lambda_param_maybe_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param default? ','")); + _res = _PyPegen_name_default_pair ( p , a , c , NULL ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_param_maybe_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param default? ','")); + } + { // lambda_param default? &':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_param_maybe_default[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param default? &':'")); + arg_ty a; + void *c; + if ( + (a = lambda_param_rule(p)) // lambda_param + && + (c = default_rule(p), 1) // default? + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 11) // token=':' + ) + { + D(fprintf(stderr, "%*c+ lambda_param_maybe_default[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param default? &':'")); + _res = _PyPegen_name_default_pair ( p , a , c , NULL ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_param_maybe_default[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param default? &':'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lambda_param: NAME +static arg_ty +lambda_param_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + arg_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lambda_param[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME")); + expr_ty a; + if ( + (a = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ lambda_param[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_arg ( a -> v . Name . id , NULL , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lambda_param[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// disjunction: conjunction (('or' conjunction))+ | conjunction +static expr_ty +disjunction_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, disjunction_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // conjunction (('or' conjunction))+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> disjunction[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "conjunction (('or' conjunction))+")); + expr_ty a; + asdl_seq * b; + if ( + (a = conjunction_rule(p)) // conjunction + && + (b = _loop1_88_rule(p)) // (('or' conjunction))+ + ) + { + D(fprintf(stderr, "%*c+ disjunction[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "conjunction (('or' conjunction))+")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BoolOp ( Or , CHECK ( _PyPegen_seq_insert_in_front ( p , a , b ) ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s disjunction[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "conjunction (('or' conjunction))+")); + } + { // conjunction + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> disjunction[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "conjunction")); + expr_ty conjunction_var; + if ( + (conjunction_var = conjunction_rule(p)) // conjunction + ) + { + D(fprintf(stderr, "%*c+ disjunction[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "conjunction")); + _res = conjunction_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s disjunction[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "conjunction")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, disjunction_type, _res); + D(p->level--); + return _res; +} + +// conjunction: inversion (('and' inversion))+ | inversion +static expr_ty +conjunction_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, conjunction_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // inversion (('and' inversion))+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> conjunction[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "inversion (('and' inversion))+")); + expr_ty a; + asdl_seq * b; + if ( + (a = inversion_rule(p)) // inversion + && + (b = _loop1_89_rule(p)) // (('and' inversion))+ + ) + { + D(fprintf(stderr, "%*c+ conjunction[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "inversion (('and' inversion))+")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BoolOp ( And , CHECK ( _PyPegen_seq_insert_in_front ( p , a , b ) ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s conjunction[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "inversion (('and' inversion))+")); + } + { // inversion + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> conjunction[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "inversion")); + expr_ty inversion_var; + if ( + (inversion_var = inversion_rule(p)) // inversion + ) + { + D(fprintf(stderr, "%*c+ conjunction[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "inversion")); + _res = inversion_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s conjunction[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "inversion")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, conjunction_type, _res); + D(p->level--); + return _res; +} + +// inversion: 'not' inversion | comparison +static expr_ty +inversion_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, inversion_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'not' inversion + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> inversion[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'not' inversion")); + Token * _keyword; + expr_ty a; + if ( + (_keyword = _PyPegen_expect_token(p, 526)) // token='not' + && + (a = inversion_rule(p)) // inversion + ) + { + D(fprintf(stderr, "%*c+ inversion[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'not' inversion")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_UnaryOp ( Not , a , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s inversion[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'not' inversion")); + } + { // comparison + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> inversion[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "comparison")); + expr_ty comparison_var; + if ( + (comparison_var = comparison_rule(p)) // comparison + ) + { + D(fprintf(stderr, "%*c+ inversion[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "comparison")); + _res = comparison_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s inversion[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "comparison")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, inversion_type, _res); + D(p->level--); + return _res; +} + +// comparison: bitwise_or compare_op_bitwise_or_pair+ | bitwise_or +static expr_ty +comparison_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // bitwise_or compare_op_bitwise_or_pair+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> comparison[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "bitwise_or compare_op_bitwise_or_pair+")); + expr_ty a; + asdl_seq * b; + if ( + (a = bitwise_or_rule(p)) // bitwise_or + && + (b = _loop1_90_rule(p)) // compare_op_bitwise_or_pair+ + ) + { + D(fprintf(stderr, "%*c+ comparison[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_or compare_op_bitwise_or_pair+")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Compare ( a , CHECK ( _PyPegen_get_cmpops ( p , b ) ) , CHECK ( _PyPegen_get_exprs ( p , b ) ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s comparison[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "bitwise_or compare_op_bitwise_or_pair+")); + } + { // bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> comparison[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "bitwise_or")); + expr_ty bitwise_or_var; + if ( + (bitwise_or_var = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ comparison[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_or")); + _res = bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s comparison[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// compare_op_bitwise_or_pair: +// | eq_bitwise_or +// | noteq_bitwise_or +// | lte_bitwise_or +// | lt_bitwise_or +// | gte_bitwise_or +// | gt_bitwise_or +// | notin_bitwise_or +// | in_bitwise_or +// | isnot_bitwise_or +// | is_bitwise_or +static CmpopExprPair* +compare_op_bitwise_or_pair_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // eq_bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compare_op_bitwise_or_pair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "eq_bitwise_or")); + CmpopExprPair* eq_bitwise_or_var; + if ( + (eq_bitwise_or_var = eq_bitwise_or_rule(p)) // eq_bitwise_or + ) + { + D(fprintf(stderr, "%*c+ compare_op_bitwise_or_pair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "eq_bitwise_or")); + _res = eq_bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compare_op_bitwise_or_pair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "eq_bitwise_or")); + } + { // noteq_bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compare_op_bitwise_or_pair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "noteq_bitwise_or")); + CmpopExprPair* noteq_bitwise_or_var; + if ( + (noteq_bitwise_or_var = noteq_bitwise_or_rule(p)) // noteq_bitwise_or + ) + { + D(fprintf(stderr, "%*c+ compare_op_bitwise_or_pair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "noteq_bitwise_or")); + _res = noteq_bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compare_op_bitwise_or_pair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "noteq_bitwise_or")); + } + { // lte_bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compare_op_bitwise_or_pair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lte_bitwise_or")); + CmpopExprPair* lte_bitwise_or_var; + if ( + (lte_bitwise_or_var = lte_bitwise_or_rule(p)) // lte_bitwise_or + ) + { + D(fprintf(stderr, "%*c+ compare_op_bitwise_or_pair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lte_bitwise_or")); + _res = lte_bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compare_op_bitwise_or_pair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lte_bitwise_or")); + } + { // lt_bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compare_op_bitwise_or_pair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lt_bitwise_or")); + CmpopExprPair* lt_bitwise_or_var; + if ( + (lt_bitwise_or_var = lt_bitwise_or_rule(p)) // lt_bitwise_or + ) + { + D(fprintf(stderr, "%*c+ compare_op_bitwise_or_pair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lt_bitwise_or")); + _res = lt_bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compare_op_bitwise_or_pair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lt_bitwise_or")); + } + { // gte_bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compare_op_bitwise_or_pair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "gte_bitwise_or")); + CmpopExprPair* gte_bitwise_or_var; + if ( + (gte_bitwise_or_var = gte_bitwise_or_rule(p)) // gte_bitwise_or + ) + { + D(fprintf(stderr, "%*c+ compare_op_bitwise_or_pair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "gte_bitwise_or")); + _res = gte_bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compare_op_bitwise_or_pair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "gte_bitwise_or")); + } + { // gt_bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compare_op_bitwise_or_pair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "gt_bitwise_or")); + CmpopExprPair* gt_bitwise_or_var; + if ( + (gt_bitwise_or_var = gt_bitwise_or_rule(p)) // gt_bitwise_or + ) + { + D(fprintf(stderr, "%*c+ compare_op_bitwise_or_pair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "gt_bitwise_or")); + _res = gt_bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compare_op_bitwise_or_pair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "gt_bitwise_or")); + } + { // notin_bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compare_op_bitwise_or_pair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "notin_bitwise_or")); + CmpopExprPair* notin_bitwise_or_var; + if ( + (notin_bitwise_or_var = notin_bitwise_or_rule(p)) // notin_bitwise_or + ) + { + D(fprintf(stderr, "%*c+ compare_op_bitwise_or_pair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "notin_bitwise_or")); + _res = notin_bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compare_op_bitwise_or_pair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "notin_bitwise_or")); + } + { // in_bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compare_op_bitwise_or_pair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "in_bitwise_or")); + CmpopExprPair* in_bitwise_or_var; + if ( + (in_bitwise_or_var = in_bitwise_or_rule(p)) // in_bitwise_or + ) + { + D(fprintf(stderr, "%*c+ compare_op_bitwise_or_pair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "in_bitwise_or")); + _res = in_bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compare_op_bitwise_or_pair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "in_bitwise_or")); + } + { // isnot_bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compare_op_bitwise_or_pair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "isnot_bitwise_or")); + CmpopExprPair* isnot_bitwise_or_var; + if ( + (isnot_bitwise_or_var = isnot_bitwise_or_rule(p)) // isnot_bitwise_or + ) + { + D(fprintf(stderr, "%*c+ compare_op_bitwise_or_pair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "isnot_bitwise_or")); + _res = isnot_bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compare_op_bitwise_or_pair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "isnot_bitwise_or")); + } + { // is_bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> compare_op_bitwise_or_pair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "is_bitwise_or")); + CmpopExprPair* is_bitwise_or_var; + if ( + (is_bitwise_or_var = is_bitwise_or_rule(p)) // is_bitwise_or + ) + { + D(fprintf(stderr, "%*c+ compare_op_bitwise_or_pair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "is_bitwise_or")); + _res = is_bitwise_or_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s compare_op_bitwise_or_pair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "is_bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// eq_bitwise_or: '==' bitwise_or +static CmpopExprPair* +eq_bitwise_or_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // '==' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> eq_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'==' bitwise_or")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 27)) // token='==' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ eq_bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'==' bitwise_or")); + _res = _PyPegen_cmpop_expr_pair ( p , Eq , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s eq_bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'==' bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// noteq_bitwise_or: ('!=') bitwise_or +static CmpopExprPair* +noteq_bitwise_or_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // ('!=') bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> noteq_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('!=') bitwise_or")); + void *_tmp_91_var; + expr_ty a; + if ( + (_tmp_91_var = _tmp_91_rule(p)) // '!=' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ noteq_bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "('!=') bitwise_or")); + _res = _PyPegen_cmpop_expr_pair ( p , NotEq , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s noteq_bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('!=') bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lte_bitwise_or: '<=' bitwise_or +static CmpopExprPair* +lte_bitwise_or_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // '<=' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lte_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'<=' bitwise_or")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 29)) // token='<=' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ lte_bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'<=' bitwise_or")); + _res = _PyPegen_cmpop_expr_pair ( p , LtE , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lte_bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'<=' bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// lt_bitwise_or: '<' bitwise_or +static CmpopExprPair* +lt_bitwise_or_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // '<' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> lt_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'<' bitwise_or")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 20)) // token='<' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ lt_bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'<' bitwise_or")); + _res = _PyPegen_cmpop_expr_pair ( p , Lt , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s lt_bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'<' bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// gte_bitwise_or: '>=' bitwise_or +static CmpopExprPair* +gte_bitwise_or_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // '>=' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> gte_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'>=' bitwise_or")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 30)) // token='>=' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ gte_bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'>=' bitwise_or")); + _res = _PyPegen_cmpop_expr_pair ( p , GtE , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s gte_bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'>=' bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// gt_bitwise_or: '>' bitwise_or +static CmpopExprPair* +gt_bitwise_or_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // '>' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> gt_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'>' bitwise_or")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 21)) // token='>' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ gt_bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'>' bitwise_or")); + _res = _PyPegen_cmpop_expr_pair ( p , Gt , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s gt_bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'>' bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// notin_bitwise_or: 'not' 'in' bitwise_or +static CmpopExprPair* +notin_bitwise_or_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // 'not' 'in' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> notin_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'not' 'in' bitwise_or")); + Token * _keyword; + Token * _keyword_1; + expr_ty a; + if ( + (_keyword = _PyPegen_expect_token(p, 526)) // token='not' + && + (_keyword_1 = _PyPegen_expect_token(p, 518)) // token='in' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ notin_bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'not' 'in' bitwise_or")); + _res = _PyPegen_cmpop_expr_pair ( p , NotIn , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s notin_bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'not' 'in' bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// in_bitwise_or: 'in' bitwise_or +static CmpopExprPair* +in_bitwise_or_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // 'in' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> in_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'in' bitwise_or")); + Token * _keyword; + expr_ty a; + if ( + (_keyword = _PyPegen_expect_token(p, 518)) // token='in' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ in_bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'in' bitwise_or")); + _res = _PyPegen_cmpop_expr_pair ( p , In , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s in_bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'in' bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// isnot_bitwise_or: 'is' 'not' bitwise_or +static CmpopExprPair* +isnot_bitwise_or_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // 'is' 'not' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> isnot_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'is' 'not' bitwise_or")); + Token * _keyword; + Token * _keyword_1; + expr_ty a; + if ( + (_keyword = _PyPegen_expect_token(p, 527)) // token='is' + && + (_keyword_1 = _PyPegen_expect_token(p, 526)) // token='not' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ isnot_bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'is' 'not' bitwise_or")); + _res = _PyPegen_cmpop_expr_pair ( p , IsNot , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s isnot_bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'is' 'not' bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// is_bitwise_or: 'is' bitwise_or +static CmpopExprPair* +is_bitwise_or_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + CmpopExprPair* _res = NULL; + int _mark = p->mark; + { // 'is' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> is_bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'is' bitwise_or")); + Token * _keyword; + expr_ty a; + if ( + (_keyword = _PyPegen_expect_token(p, 527)) // token='is' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ is_bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'is' bitwise_or")); + _res = _PyPegen_cmpop_expr_pair ( p , Is , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s is_bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'is' bitwise_or")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// Left-recursive +// bitwise_or: bitwise_or '|' bitwise_xor | bitwise_xor +static expr_ty bitwise_or_raw(Parser *); +static expr_ty +bitwise_or_rule(Parser *p) +{ + D(p->level++); + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, bitwise_or_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + int _resmark = p->mark; + while (1) { + int tmpvar_1 = _PyPegen_update_memo(p, _mark, bitwise_or_type, _res); + if (tmpvar_1) { + D(p->level--); + return _res; + } + p->mark = _mark; + void *_raw = bitwise_or_raw(p); + if (p->error_indicator) + return NULL; + if (_raw == NULL || p->mark <= _resmark) + break; + _resmark = p->mark; + _res = _raw; + } + p->mark = _resmark; + D(p->level--); + return _res; +} +static expr_ty +bitwise_or_raw(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // bitwise_or '|' bitwise_xor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "bitwise_or '|' bitwise_xor")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = bitwise_or_rule(p)) // bitwise_or + && + (_literal = _PyPegen_expect_token(p, 18)) // token='|' + && + (b = bitwise_xor_rule(p)) // bitwise_xor + ) + { + D(fprintf(stderr, "%*c+ bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_or '|' bitwise_xor")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , BitOr , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "bitwise_or '|' bitwise_xor")); + } + { // bitwise_xor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> bitwise_or[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "bitwise_xor")); + expr_ty bitwise_xor_var; + if ( + (bitwise_xor_var = bitwise_xor_rule(p)) // bitwise_xor + ) + { + D(fprintf(stderr, "%*c+ bitwise_or[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_xor")); + _res = bitwise_xor_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s bitwise_or[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "bitwise_xor")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// Left-recursive +// bitwise_xor: bitwise_xor '^' bitwise_and | bitwise_and +static expr_ty bitwise_xor_raw(Parser *); +static expr_ty +bitwise_xor_rule(Parser *p) +{ + D(p->level++); + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, bitwise_xor_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + int _resmark = p->mark; + while (1) { + int tmpvar_2 = _PyPegen_update_memo(p, _mark, bitwise_xor_type, _res); + if (tmpvar_2) { + D(p->level--); + return _res; + } + p->mark = _mark; + void *_raw = bitwise_xor_raw(p); + if (p->error_indicator) + return NULL; + if (_raw == NULL || p->mark <= _resmark) + break; + _resmark = p->mark; + _res = _raw; + } + p->mark = _resmark; + D(p->level--); + return _res; +} +static expr_ty +bitwise_xor_raw(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // bitwise_xor '^' bitwise_and + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> bitwise_xor[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "bitwise_xor '^' bitwise_and")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = bitwise_xor_rule(p)) // bitwise_xor + && + (_literal = _PyPegen_expect_token(p, 32)) // token='^' + && + (b = bitwise_and_rule(p)) // bitwise_and + ) + { + D(fprintf(stderr, "%*c+ bitwise_xor[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_xor '^' bitwise_and")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , BitXor , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s bitwise_xor[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "bitwise_xor '^' bitwise_and")); + } + { // bitwise_and + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> bitwise_xor[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "bitwise_and")); + expr_ty bitwise_and_var; + if ( + (bitwise_and_var = bitwise_and_rule(p)) // bitwise_and + ) + { + D(fprintf(stderr, "%*c+ bitwise_xor[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_and")); + _res = bitwise_and_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s bitwise_xor[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "bitwise_and")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// Left-recursive +// bitwise_and: bitwise_and '&' shift_expr | shift_expr +static expr_ty bitwise_and_raw(Parser *); +static expr_ty +bitwise_and_rule(Parser *p) +{ + D(p->level++); + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, bitwise_and_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + int _resmark = p->mark; + while (1) { + int tmpvar_3 = _PyPegen_update_memo(p, _mark, bitwise_and_type, _res); + if (tmpvar_3) { + D(p->level--); + return _res; + } + p->mark = _mark; + void *_raw = bitwise_and_raw(p); + if (p->error_indicator) + return NULL; + if (_raw == NULL || p->mark <= _resmark) + break; + _resmark = p->mark; + _res = _raw; + } + p->mark = _resmark; + D(p->level--); + return _res; +} +static expr_ty +bitwise_and_raw(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // bitwise_and '&' shift_expr + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> bitwise_and[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "bitwise_and '&' shift_expr")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = bitwise_and_rule(p)) // bitwise_and + && + (_literal = _PyPegen_expect_token(p, 19)) // token='&' + && + (b = shift_expr_rule(p)) // shift_expr + ) + { + D(fprintf(stderr, "%*c+ bitwise_and[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "bitwise_and '&' shift_expr")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , BitAnd , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s bitwise_and[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "bitwise_and '&' shift_expr")); + } + { // shift_expr + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> bitwise_and[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "shift_expr")); + expr_ty shift_expr_var; + if ( + (shift_expr_var = shift_expr_rule(p)) // shift_expr + ) + { + D(fprintf(stderr, "%*c+ bitwise_and[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "shift_expr")); + _res = shift_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s bitwise_and[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "shift_expr")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// Left-recursive +// shift_expr: shift_expr '<<' sum | shift_expr '>>' sum | sum +static expr_ty shift_expr_raw(Parser *); +static expr_ty +shift_expr_rule(Parser *p) +{ + D(p->level++); + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, shift_expr_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + int _resmark = p->mark; + while (1) { + int tmpvar_4 = _PyPegen_update_memo(p, _mark, shift_expr_type, _res); + if (tmpvar_4) { + D(p->level--); + return _res; + } + p->mark = _mark; + void *_raw = shift_expr_raw(p); + if (p->error_indicator) + return NULL; + if (_raw == NULL || p->mark <= _resmark) + break; + _resmark = p->mark; + _res = _raw; + } + p->mark = _resmark; + D(p->level--); + return _res; +} +static expr_ty +shift_expr_raw(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // shift_expr '<<' sum + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> shift_expr[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "shift_expr '<<' sum")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = shift_expr_rule(p)) // shift_expr + && + (_literal = _PyPegen_expect_token(p, 33)) // token='<<' + && + (b = sum_rule(p)) // sum + ) + { + D(fprintf(stderr, "%*c+ shift_expr[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "shift_expr '<<' sum")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , LShift , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s shift_expr[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "shift_expr '<<' sum")); + } + { // shift_expr '>>' sum + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> shift_expr[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "shift_expr '>>' sum")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = shift_expr_rule(p)) // shift_expr + && + (_literal = _PyPegen_expect_token(p, 34)) // token='>>' + && + (b = sum_rule(p)) // sum + ) + { + D(fprintf(stderr, "%*c+ shift_expr[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "shift_expr '>>' sum")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , RShift , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s shift_expr[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "shift_expr '>>' sum")); + } + { // sum + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> shift_expr[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "sum")); + expr_ty sum_var; + if ( + (sum_var = sum_rule(p)) // sum + ) + { + D(fprintf(stderr, "%*c+ shift_expr[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "sum")); + _res = sum_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s shift_expr[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "sum")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// Left-recursive +// sum: sum '+' term | sum '-' term | term +static expr_ty sum_raw(Parser *); +static expr_ty +sum_rule(Parser *p) +{ + D(p->level++); + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, sum_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + int _resmark = p->mark; + while (1) { + int tmpvar_5 = _PyPegen_update_memo(p, _mark, sum_type, _res); + if (tmpvar_5) { + D(p->level--); + return _res; + } + p->mark = _mark; + void *_raw = sum_raw(p); + if (p->error_indicator) + return NULL; + if (_raw == NULL || p->mark <= _resmark) + break; + _resmark = p->mark; + _res = _raw; + } + p->mark = _resmark; + D(p->level--); + return _res; +} +static expr_ty +sum_raw(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // sum '+' term + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> sum[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "sum '+' term")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = sum_rule(p)) // sum + && + (_literal = _PyPegen_expect_token(p, 14)) // token='+' + && + (b = term_rule(p)) // term + ) + { + D(fprintf(stderr, "%*c+ sum[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "sum '+' term")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , Add , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s sum[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "sum '+' term")); + } + { // sum '-' term + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> sum[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "sum '-' term")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = sum_rule(p)) // sum + && + (_literal = _PyPegen_expect_token(p, 15)) // token='-' + && + (b = term_rule(p)) // term + ) + { + D(fprintf(stderr, "%*c+ sum[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "sum '-' term")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , Sub , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s sum[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "sum '-' term")); + } + { // term + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> sum[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "term")); + expr_ty term_var; + if ( + (term_var = term_rule(p)) // term + ) + { + D(fprintf(stderr, "%*c+ sum[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "term")); + _res = term_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s sum[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "term")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// Left-recursive +// term: +// | term '*' factor +// | term '/' factor +// | term '//' factor +// | term '%' factor +// | term '@' factor +// | factor +static expr_ty term_raw(Parser *); +static expr_ty +term_rule(Parser *p) +{ + D(p->level++); + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, term_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + int _resmark = p->mark; + while (1) { + int tmpvar_6 = _PyPegen_update_memo(p, _mark, term_type, _res); + if (tmpvar_6) { + D(p->level--); + return _res; + } + p->mark = _mark; + void *_raw = term_raw(p); + if (p->error_indicator) + return NULL; + if (_raw == NULL || p->mark <= _resmark) + break; + _resmark = p->mark; + _res = _raw; + } + p->mark = _resmark; + D(p->level--); + return _res; +} +static expr_ty +term_raw(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // term '*' factor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> term[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "term '*' factor")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = term_rule(p)) // term + && + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (b = factor_rule(p)) // factor + ) + { + D(fprintf(stderr, "%*c+ term[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "term '*' factor")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , Mult , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s term[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "term '*' factor")); + } + { // term '/' factor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> term[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "term '/' factor")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = term_rule(p)) // term + && + (_literal = _PyPegen_expect_token(p, 17)) // token='/' + && + (b = factor_rule(p)) // factor + ) + { + D(fprintf(stderr, "%*c+ term[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "term '/' factor")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , Div , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s term[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "term '/' factor")); + } + { // term '//' factor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> term[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "term '//' factor")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = term_rule(p)) // term + && + (_literal = _PyPegen_expect_token(p, 47)) // token='//' + && + (b = factor_rule(p)) // factor + ) + { + D(fprintf(stderr, "%*c+ term[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "term '//' factor")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , FloorDiv , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s term[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "term '//' factor")); + } + { // term '%' factor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> term[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "term '%' factor")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = term_rule(p)) // term + && + (_literal = _PyPegen_expect_token(p, 24)) // token='%' + && + (b = factor_rule(p)) // factor + ) + { + D(fprintf(stderr, "%*c+ term[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "term '%' factor")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , Mod , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s term[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "term '%' factor")); + } + { // term '@' factor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> term[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "term '@' factor")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = term_rule(p)) // term + && + (_literal = _PyPegen_expect_token(p, 49)) // token='@' + && + (b = factor_rule(p)) // factor + ) + { + D(fprintf(stderr, "%*c+ term[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "term '@' factor")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = CHECK_VERSION ( 5 , "The '@' operator is" , _Py_BinOp ( a , MatMult , b , EXTRA ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s term[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "term '@' factor")); + } + { // factor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> term[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "factor")); + expr_ty factor_var; + if ( + (factor_var = factor_rule(p)) // factor + ) + { + D(fprintf(stderr, "%*c+ term[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "factor")); + _res = factor_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s term[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "factor")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// factor: '+' factor | '-' factor | '~' factor | power +static expr_ty +factor_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, factor_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '+' factor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> factor[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'+' factor")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 14)) // token='+' + && + (a = factor_rule(p)) // factor + ) + { + D(fprintf(stderr, "%*c+ factor[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'+' factor")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_UnaryOp ( UAdd , a , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s factor[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'+' factor")); + } + { // '-' factor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> factor[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'-' factor")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 15)) // token='-' + && + (a = factor_rule(p)) // factor + ) + { + D(fprintf(stderr, "%*c+ factor[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'-' factor")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_UnaryOp ( USub , a , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s factor[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'-' factor")); + } + { // '~' factor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> factor[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'~' factor")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 31)) // token='~' + && + (a = factor_rule(p)) // factor + ) + { + D(fprintf(stderr, "%*c+ factor[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'~' factor")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_UnaryOp ( Invert , a , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s factor[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'~' factor")); + } + { // power + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> factor[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "power")); + expr_ty power_var; + if ( + (power_var = power_rule(p)) // power + ) + { + D(fprintf(stderr, "%*c+ factor[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "power")); + _res = power_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s factor[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "power")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, factor_type, _res); + D(p->level--); + return _res; +} + +// power: await_primary '**' factor | await_primary +static expr_ty +power_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // await_primary '**' factor + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> power[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "await_primary '**' factor")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = await_primary_rule(p)) // await_primary + && + (_literal = _PyPegen_expect_token(p, 35)) // token='**' + && + (b = factor_rule(p)) // factor + ) + { + D(fprintf(stderr, "%*c+ power[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "await_primary '**' factor")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_BinOp ( a , Pow , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s power[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "await_primary '**' factor")); + } + { // await_primary + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> power[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "await_primary")); + expr_ty await_primary_var; + if ( + (await_primary_var = await_primary_rule(p)) // await_primary + ) + { + D(fprintf(stderr, "%*c+ power[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "await_primary")); + _res = await_primary_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s power[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "await_primary")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// await_primary: AWAIT primary | primary +static expr_ty +await_primary_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, await_primary_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // AWAIT primary + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> await_primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "AWAIT primary")); + expr_ty a; + Token * await_var; + if ( + (await_var = _PyPegen_expect_token(p, AWAIT)) // token='AWAIT' + && + (a = primary_rule(p)) // primary + ) + { + D(fprintf(stderr, "%*c+ await_primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "AWAIT primary")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = CHECK_VERSION ( 5 , "Await expressions are" , _Py_Await ( a , EXTRA ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s await_primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "AWAIT primary")); + } + { // primary + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> await_primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "primary")); + expr_ty primary_var; + if ( + (primary_var = primary_rule(p)) // primary + ) + { + D(fprintf(stderr, "%*c+ await_primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "primary")); + _res = primary_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s await_primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "primary")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, await_primary_type, _res); + D(p->level--); + return _res; +} + +// Left-recursive +// primary: +// | invalid_primary +// | primary '.' NAME +// | primary genexp +// | primary '(' arguments? ')' +// | primary '[' slices ']' +// | atom +static expr_ty primary_raw(Parser *); +static expr_ty +primary_rule(Parser *p) +{ + D(p->level++); + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, primary_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + int _resmark = p->mark; + while (1) { + int tmpvar_7 = _PyPegen_update_memo(p, _mark, primary_type, _res); + if (tmpvar_7) { + D(p->level--); + return _res; + } + p->mark = _mark; + void *_raw = primary_raw(p); + if (p->error_indicator) + return NULL; + if (_raw == NULL || p->mark <= _resmark) + break; + _resmark = p->mark; + _res = _raw; + } + p->mark = _resmark; + D(p->level--); + return _res; +} +static expr_ty +primary_raw(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + if (p->call_invalid_rules) { // invalid_primary + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_primary")); + void *invalid_primary_var; + if ( + (invalid_primary_var = invalid_primary_rule(p)) // invalid_primary + ) + { + D(fprintf(stderr, "%*c+ primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_primary")); + _res = invalid_primary_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_primary")); + } + { // primary '.' NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "primary '.' NAME")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = primary_rule(p)) // primary + && + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + && + (b = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "primary '.' NAME")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Attribute ( a , b -> v . Name . id , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "primary '.' NAME")); + } + { // primary genexp + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "primary genexp")); + expr_ty a; + expr_ty b; + if ( + (a = primary_rule(p)) // primary + && + (b = genexp_rule(p)) // genexp + ) + { + D(fprintf(stderr, "%*c+ primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "primary genexp")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Call ( a , CHECK ( _PyPegen_singleton_seq ( p , b ) ) , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "primary genexp")); + } + { // primary '(' arguments? ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "primary '(' arguments? ')'")); + Token * _literal; + Token * _literal_1; + expr_ty a; + void *b; + if ( + (a = primary_rule(p)) // primary + && + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (b = arguments_rule(p), 1) // arguments? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "primary '(' arguments? ')'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Call ( a , ( b ) ? ( ( expr_ty ) b ) -> v . Call . args : NULL , ( b ) ? ( ( expr_ty ) b ) -> v . Call . keywords : NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "primary '(' arguments? ')'")); + } + { // primary '[' slices ']' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "primary '[' slices ']'")); + Token * _literal; + Token * _literal_1; + expr_ty a; + expr_ty b; + if ( + (a = primary_rule(p)) // primary + && + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (b = slices_rule(p)) // slices + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + ) + { + D(fprintf(stderr, "%*c+ primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "primary '[' slices ']'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Subscript ( a , b , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "primary '[' slices ']'")); + } + { // atom + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "atom")); + expr_ty atom_var; + if ( + (atom_var = atom_rule(p)) // atom + ) + { + D(fprintf(stderr, "%*c+ primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "atom")); + _res = atom_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "atom")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// slices: slice !',' | ','.slice+ ','? +static expr_ty +slices_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // slice !',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> slices[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slice !','")); + expr_ty a; + if ( + (a = slice_rule(p)) // slice + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 12) // token=',' + ) + { + D(fprintf(stderr, "%*c+ slices[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slice !','")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s slices[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slice !','")); + } + { // ','.slice+ ','? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> slices[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.slice+ ','?")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + asdl_seq * a; + if ( + (a = _gather_92_rule(p)) // ','.slice+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + ) + { + D(fprintf(stderr, "%*c+ slices[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.slice+ ','?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Tuple ( a , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s slices[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.slice+ ','?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// slice: expression? ':' expression? [':' expression?] | expression +static expr_ty +slice_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // expression? ':' expression? [':' expression?] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> slice[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression? ':' expression? [':' expression?]")); + Token * _literal; + void *a; + void *b; + void *c; + if ( + (a = expression_rule(p), 1) // expression? + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = expression_rule(p), 1) // expression? + && + (c = _tmp_94_rule(p), 1) // [':' expression?] + ) + { + D(fprintf(stderr, "%*c+ slice[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression? ':' expression? [':' expression?]")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Slice ( a , b , c , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s slice[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression? ':' expression? [':' expression?]")); + } + { // expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> slice[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression")); + expr_ty a; + if ( + (a = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ slice[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s slice[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// atom: +// | NAME +// | 'True' +// | 'False' +// | 'None' +// | '__peg_parser__' +// | &STRING strings +// | NUMBER +// | &'(' (tuple | group | genexp) +// | &'[' (list | listcomp) +// | &'{' (dict | set | dictcomp | setcomp) +// | '...' +static expr_ty +atom_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME")); + expr_ty name_var; + if ( + (name_var = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME")); + _res = name_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME")); + } + { // 'True' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'True'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 528)) // token='True' + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'True'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Constant ( Py_True , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'True'")); + } + { // 'False' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'False'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 529)) // token='False' + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'False'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Constant ( Py_False , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'False'")); + } + { // 'None' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'None'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 530)) // token='None' + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'None'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Constant ( Py_None , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'None'")); + } + { // '__peg_parser__' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'__peg_parser__'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 531)) // token='__peg_parser__' + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'__peg_parser__'")); + _res = RAISE_SYNTAX_ERROR ( "You found it!" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'__peg_parser__'")); + } + { // &STRING strings + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&STRING strings")); + expr_ty strings_var; + if ( + _PyPegen_lookahead(1, _PyPegen_string_token, p) + && + (strings_var = strings_rule(p)) // strings + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&STRING strings")); + _res = strings_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&STRING strings")); + } + { // NUMBER + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NUMBER")); + expr_ty number_var; + if ( + (number_var = _PyPegen_number_token(p)) // NUMBER + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NUMBER")); + _res = number_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NUMBER")); + } + { // &'(' (tuple | group | genexp) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'(' (tuple | group | genexp)")); + void *_tmp_95_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 7) // token='(' + && + (_tmp_95_var = _tmp_95_rule(p)) // tuple | group | genexp + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'(' (tuple | group | genexp)")); + _res = _tmp_95_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'(' (tuple | group | genexp)")); + } + { // &'[' (list | listcomp) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'[' (list | listcomp)")); + void *_tmp_96_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 9) // token='[' + && + (_tmp_96_var = _tmp_96_rule(p)) // list | listcomp + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'[' (list | listcomp)")); + _res = _tmp_96_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'[' (list | listcomp)")); + } + { // &'{' (dict | set | dictcomp | setcomp) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "&'{' (dict | set | dictcomp | setcomp)")); + void *_tmp_97_var; + if ( + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 25) // token='{' + && + (_tmp_97_var = _tmp_97_rule(p)) // dict | set | dictcomp | setcomp + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "&'{' (dict | set | dictcomp | setcomp)")); + _res = _tmp_97_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "&'{' (dict | set | dictcomp | setcomp)")); + } + { // '...' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 52)) // token='...' + ) + { + D(fprintf(stderr, "%*c+ atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Constant ( Py_Ellipsis , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// strings: STRING+ +static expr_ty +strings_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, strings_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + { // STRING+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> strings[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "STRING+")); + asdl_seq * a; + if ( + (a = _loop1_98_rule(p)) // STRING+ + ) + { + D(fprintf(stderr, "%*c+ strings[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "STRING+")); + _res = _PyPegen_concatenate_strings ( p , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s strings[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "STRING+")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, strings_type, _res); + D(p->level--); + return _res; +} + +// list: '[' star_named_expressions? ']' +static expr_ty +list_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '[' star_named_expressions? ']' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> list[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'[' star_named_expressions? ']'")); + Token * _literal; + Token * _literal_1; + void *a; + if ( + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (a = star_named_expressions_rule(p), 1) // star_named_expressions? + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + ) + { + D(fprintf(stderr, "%*c+ list[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'[' star_named_expressions? ']'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_List ( a , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s list[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'[' star_named_expressions? ']'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// listcomp: '[' named_expression ~ for_if_clauses ']' | invalid_comprehension +static expr_ty +listcomp_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '[' named_expression ~ for_if_clauses ']' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> listcomp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'[' named_expression ~ for_if_clauses ']'")); + int _cut_var = 0; + Token * _literal; + Token * _literal_1; + expr_ty a; + asdl_seq* b; + if ( + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (a = named_expression_rule(p)) // named_expression + && + (_cut_var = 1) + && + (b = for_if_clauses_rule(p)) // for_if_clauses + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + ) + { + D(fprintf(stderr, "%*c+ listcomp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'[' named_expression ~ for_if_clauses ']'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_ListComp ( a , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s listcomp[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'[' named_expression ~ for_if_clauses ']'")); + if (_cut_var) { + D(p->level--); + return NULL; + } + } + if (p->call_invalid_rules) { // invalid_comprehension + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> listcomp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_comprehension")); + void *invalid_comprehension_var; + if ( + (invalid_comprehension_var = invalid_comprehension_rule(p)) // invalid_comprehension + ) + { + D(fprintf(stderr, "%*c+ listcomp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_comprehension")); + _res = invalid_comprehension_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s listcomp[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_comprehension")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// tuple: '(' [star_named_expression ',' star_named_expressions?] ')' +static expr_ty +tuple_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '(' [star_named_expression ',' star_named_expressions?] ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> tuple[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' [star_named_expression ',' star_named_expressions?] ')'")); + Token * _literal; + Token * _literal_1; + void *a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = _tmp_99_rule(p), 1) // [star_named_expression ',' star_named_expressions?] + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ tuple[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' [star_named_expression ',' star_named_expressions?] ')'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Tuple ( a , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s tuple[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' [star_named_expression ',' star_named_expressions?] ')'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// group: '(' (yield_expr | named_expression) ')' | invalid_group +static expr_ty +group_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // '(' (yield_expr | named_expression) ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> group[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' (yield_expr | named_expression) ')'")); + Token * _literal; + Token * _literal_1; + void *a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = _tmp_100_rule(p)) // yield_expr | named_expression + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ group[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' (yield_expr | named_expression) ')'")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s group[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' (yield_expr | named_expression) ')'")); + } + if (p->call_invalid_rules) { // invalid_group + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> group[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_group")); + void *invalid_group_var; + if ( + (invalid_group_var = invalid_group_rule(p)) // invalid_group + ) + { + D(fprintf(stderr, "%*c+ group[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_group")); + _res = invalid_group_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s group[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_group")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// genexp: '(' named_expression ~ for_if_clauses ')' | invalid_comprehension +static expr_ty +genexp_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '(' named_expression ~ for_if_clauses ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> genexp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' named_expression ~ for_if_clauses ')'")); + int _cut_var = 0; + Token * _literal; + Token * _literal_1; + expr_ty a; + asdl_seq* b; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = named_expression_rule(p)) // named_expression + && + (_cut_var = 1) + && + (b = for_if_clauses_rule(p)) // for_if_clauses + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ genexp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' named_expression ~ for_if_clauses ')'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_GeneratorExp ( a , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s genexp[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' named_expression ~ for_if_clauses ')'")); + if (_cut_var) { + D(p->level--); + return NULL; + } + } + if (p->call_invalid_rules) { // invalid_comprehension + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> genexp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_comprehension")); + void *invalid_comprehension_var; + if ( + (invalid_comprehension_var = invalid_comprehension_rule(p)) // invalid_comprehension + ) + { + D(fprintf(stderr, "%*c+ genexp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_comprehension")); + _res = invalid_comprehension_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s genexp[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_comprehension")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// set: '{' star_named_expressions '}' +static expr_ty +set_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '{' star_named_expressions '}' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> set[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' star_named_expressions '}'")); + Token * _literal; + Token * _literal_1; + asdl_seq* a; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (a = star_named_expressions_rule(p)) // star_named_expressions + && + (_literal_1 = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ set[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' star_named_expressions '}'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Set ( a , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s set[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' star_named_expressions '}'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// setcomp: '{' named_expression ~ for_if_clauses '}' | invalid_comprehension +static expr_ty +setcomp_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '{' named_expression ~ for_if_clauses '}' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> setcomp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' named_expression ~ for_if_clauses '}'")); + int _cut_var = 0; + Token * _literal; + Token * _literal_1; + expr_ty a; + asdl_seq* b; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (a = named_expression_rule(p)) // named_expression + && + (_cut_var = 1) + && + (b = for_if_clauses_rule(p)) // for_if_clauses + && + (_literal_1 = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ setcomp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' named_expression ~ for_if_clauses '}'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_SetComp ( a , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s setcomp[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' named_expression ~ for_if_clauses '}'")); + if (_cut_var) { + D(p->level--); + return NULL; + } + } + if (p->call_invalid_rules) { // invalid_comprehension + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> setcomp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_comprehension")); + void *invalid_comprehension_var; + if ( + (invalid_comprehension_var = invalid_comprehension_rule(p)) // invalid_comprehension + ) + { + D(fprintf(stderr, "%*c+ setcomp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_comprehension")); + _res = invalid_comprehension_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s setcomp[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_comprehension")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// dict: '{' double_starred_kvpairs? '}' +static expr_ty +dict_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '{' double_starred_kvpairs? '}' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> dict[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' double_starred_kvpairs? '}'")); + Token * _literal; + Token * _literal_1; + void *a; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (a = double_starred_kvpairs_rule(p), 1) // double_starred_kvpairs? + && + (_literal_1 = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ dict[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' double_starred_kvpairs? '}'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Dict ( CHECK ( _PyPegen_get_keys ( p , a ) ) , CHECK ( _PyPegen_get_values ( p , a ) ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s dict[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' double_starred_kvpairs? '}'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// dictcomp: '{' kvpair for_if_clauses '}' | invalid_dict_comprehension +static expr_ty +dictcomp_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '{' kvpair for_if_clauses '}' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> dictcomp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' kvpair for_if_clauses '}'")); + Token * _literal; + Token * _literal_1; + KeyValuePair* a; + asdl_seq* b; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (a = kvpair_rule(p)) // kvpair + && + (b = for_if_clauses_rule(p)) // for_if_clauses + && + (_literal_1 = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ dictcomp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' kvpair for_if_clauses '}'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_DictComp ( a -> key , a -> value , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s dictcomp[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' kvpair for_if_clauses '}'")); + } + if (p->call_invalid_rules) { // invalid_dict_comprehension + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> dictcomp[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_dict_comprehension")); + void *invalid_dict_comprehension_var; + if ( + (invalid_dict_comprehension_var = invalid_dict_comprehension_rule(p)) // invalid_dict_comprehension + ) + { + D(fprintf(stderr, "%*c+ dictcomp[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_dict_comprehension")); + _res = invalid_dict_comprehension_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s dictcomp[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_dict_comprehension")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// double_starred_kvpairs: ','.double_starred_kvpair+ ','? +static asdl_seq* +double_starred_kvpairs_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // ','.double_starred_kvpair+ ','? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> double_starred_kvpairs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.double_starred_kvpair+ ','?")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + asdl_seq * a; + if ( + (a = _gather_101_rule(p)) // ','.double_starred_kvpair+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + ) + { + D(fprintf(stderr, "%*c+ double_starred_kvpairs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.double_starred_kvpair+ ','?")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s double_starred_kvpairs[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.double_starred_kvpair+ ','?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// double_starred_kvpair: '**' bitwise_or | kvpair +static KeyValuePair* +double_starred_kvpair_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + KeyValuePair* _res = NULL; + int _mark = p->mark; + { // '**' bitwise_or + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> double_starred_kvpair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**' bitwise_or")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 35)) // token='**' + && + (a = bitwise_or_rule(p)) // bitwise_or + ) + { + D(fprintf(stderr, "%*c+ double_starred_kvpair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' bitwise_or")); + _res = _PyPegen_key_value_pair ( p , NULL , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s double_starred_kvpair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**' bitwise_or")); + } + { // kvpair + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> double_starred_kvpair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kvpair")); + KeyValuePair* kvpair_var; + if ( + (kvpair_var = kvpair_rule(p)) // kvpair + ) + { + D(fprintf(stderr, "%*c+ double_starred_kvpair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kvpair")); + _res = kvpair_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s double_starred_kvpair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kvpair")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// kvpair: expression ':' expression +static KeyValuePair* +kvpair_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + KeyValuePair* _res = NULL; + int _mark = p->mark; + { // expression ':' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kvpair[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ':' expression")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = expression_rule(p)) // expression + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (b = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ kvpair[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ':' expression")); + _res = _PyPegen_key_value_pair ( p , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kvpair[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ':' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// for_if_clauses: for_if_clause+ +static asdl_seq* +for_if_clauses_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // for_if_clause+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> for_if_clauses[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "for_if_clause+")); + asdl_seq * _loop1_103_var; + if ( + (_loop1_103_var = _loop1_103_rule(p)) // for_if_clause+ + ) + { + D(fprintf(stderr, "%*c+ for_if_clauses[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "for_if_clause+")); + _res = _loop1_103_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s for_if_clauses[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "for_if_clause+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// for_if_clause: +// | ASYNC 'for' star_targets 'in' ~ disjunction (('if' disjunction))* +// | 'for' star_targets 'in' ~ disjunction (('if' disjunction))* +// | invalid_for_target +static comprehension_ty +for_if_clause_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + comprehension_ty _res = NULL; + int _mark = p->mark; + { // ASYNC 'for' star_targets 'in' ~ disjunction (('if' disjunction))* + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> for_if_clause[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); + int _cut_var = 0; + Token * _keyword; + Token * _keyword_1; + expr_ty a; + Token * async_var; + expr_ty b; + asdl_seq * c; + if ( + (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' + && + (_keyword = _PyPegen_expect_token(p, 517)) // token='for' + && + (a = star_targets_rule(p)) // star_targets + && + (_keyword_1 = _PyPegen_expect_token(p, 518)) // token='in' + && + (_cut_var = 1) + && + (b = disjunction_rule(p)) // disjunction + && + (c = _loop0_104_rule(p)) // (('if' disjunction))* + ) + { + D(fprintf(stderr, "%*c+ for_if_clause[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); + _res = CHECK_VERSION ( 6 , "Async comprehensions are" , _Py_comprehension ( a , b , c , 1 , p -> arena ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s for_if_clause[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC 'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); + if (_cut_var) { + D(p->level--); + return NULL; + } + } + { // 'for' star_targets 'in' ~ disjunction (('if' disjunction))* + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> for_if_clause[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); + int _cut_var = 0; + Token * _keyword; + Token * _keyword_1; + expr_ty a; + expr_ty b; + asdl_seq * c; + if ( + (_keyword = _PyPegen_expect_token(p, 517)) // token='for' + && + (a = star_targets_rule(p)) // star_targets + && + (_keyword_1 = _PyPegen_expect_token(p, 518)) // token='in' + && + (_cut_var = 1) + && + (b = disjunction_rule(p)) // disjunction + && + (c = _loop0_105_rule(p)) // (('if' disjunction))* + ) + { + D(fprintf(stderr, "%*c+ for_if_clause[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); + _res = _Py_comprehension ( a , b , c , 0 , p -> arena ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s for_if_clause[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'for' star_targets 'in' ~ disjunction (('if' disjunction))*")); + if (_cut_var) { + D(p->level--); + return NULL; + } + } + if (p->call_invalid_rules) { // invalid_for_target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> for_if_clause[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_for_target")); + void *invalid_for_target_var; + if ( + (invalid_for_target_var = invalid_for_target_rule(p)) // invalid_for_target + ) + { + D(fprintf(stderr, "%*c+ for_if_clause[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_for_target")); + _res = invalid_for_target_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s for_if_clause[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_for_target")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// yield_expr: 'yield' 'from' expression | 'yield' star_expressions? +static expr_ty +yield_expr_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // 'yield' 'from' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> yield_expr[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'yield' 'from' expression")); + Token * _keyword; + Token * _keyword_1; + expr_ty a; + if ( + (_keyword = _PyPegen_expect_token(p, 504)) // token='yield' + && + (_keyword_1 = _PyPegen_expect_token(p, 514)) // token='from' + && + (a = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ yield_expr[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'yield' 'from' expression")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_YieldFrom ( a , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s yield_expr[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'yield' 'from' expression")); + } + { // 'yield' star_expressions? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> yield_expr[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'yield' star_expressions?")); + Token * _keyword; + void *a; + if ( + (_keyword = _PyPegen_expect_token(p, 504)) // token='yield' + && + (a = star_expressions_rule(p), 1) // star_expressions? + ) + { + D(fprintf(stderr, "%*c+ yield_expr[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'yield' star_expressions?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Yield ( a , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s yield_expr[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'yield' star_expressions?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// arguments: args ','? &')' | invalid_arguments +static expr_ty +arguments_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, arguments_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + { // args ','? &')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ','? &')'")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + expr_ty a; + if ( + (a = args_rule(p)) // args + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + && + _PyPegen_lookahead_with_int(1, _PyPegen_expect_token, p, 8) // token=')' + ) + { + D(fprintf(stderr, "%*c+ arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args ','? &')'")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s arguments[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args ','? &')'")); + } + if (p->call_invalid_rules) { // invalid_arguments + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_arguments")); + void *invalid_arguments_var; + if ( + (invalid_arguments_var = invalid_arguments_rule(p)) // invalid_arguments + ) + { + D(fprintf(stderr, "%*c+ arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_arguments")); + _res = invalid_arguments_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s arguments[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_arguments")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, arguments_type, _res); + D(p->level--); + return _res; +} + +// args: ','.(starred_expression | named_expression !'=')+ [',' kwargs] | kwargs +static expr_ty +args_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // ','.(starred_expression | named_expression !'=')+ [',' kwargs] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> args[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | named_expression !'=')+ [',' kwargs]")); + asdl_seq * a; + void *b; + if ( + (a = _gather_106_rule(p)) // ','.(starred_expression | named_expression !'=')+ + && + (b = _tmp_108_rule(p), 1) // [',' kwargs] + ) + { + D(fprintf(stderr, "%*c+ args[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.(starred_expression | named_expression !'=')+ [',' kwargs]")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _PyPegen_collect_call_seqs ( p , a , b , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s args[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.(starred_expression | named_expression !'=')+ [',' kwargs]")); + } + { // kwargs + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> args[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwargs")); + asdl_seq* a; + if ( + (a = kwargs_rule(p)) // kwargs + ) + { + D(fprintf(stderr, "%*c+ args[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwargs")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Call ( _PyPegen_dummy_name ( p ) , CHECK_NULL_ALLOWED ( _PyPegen_seq_extract_starred_exprs ( p , a ) ) , CHECK_NULL_ALLOWED ( _PyPegen_seq_delete_starred_exprs ( p , a ) ) , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s args[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwargs")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// kwargs: +// | ','.kwarg_or_starred+ ',' ','.kwarg_or_double_starred+ +// | ','.kwarg_or_starred+ +// | ','.kwarg_or_double_starred+ +static asdl_seq* +kwargs_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // ','.kwarg_or_starred+ ',' ','.kwarg_or_double_starred+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kwargs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+ ',' ','.kwarg_or_double_starred+")); + Token * _literal; + asdl_seq * a; + asdl_seq * b; + if ( + (a = _gather_109_rule(p)) // ','.kwarg_or_starred+ + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (b = _gather_111_rule(p)) // ','.kwarg_or_double_starred+ + ) + { + D(fprintf(stderr, "%*c+ kwargs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+ ',' ','.kwarg_or_double_starred+")); + _res = _PyPegen_join_sequences ( p , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kwargs[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.kwarg_or_starred+ ',' ','.kwarg_or_double_starred+")); + } + { // ','.kwarg_or_starred+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kwargs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+")); + asdl_seq * _gather_113_var; + if ( + (_gather_113_var = _gather_113_rule(p)) // ','.kwarg_or_starred+ + ) + { + D(fprintf(stderr, "%*c+ kwargs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_starred+")); + _res = _gather_113_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kwargs[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.kwarg_or_starred+")); + } + { // ','.kwarg_or_double_starred+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kwargs[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_double_starred+")); + asdl_seq * _gather_115_var; + if ( + (_gather_115_var = _gather_115_rule(p)) // ','.kwarg_or_double_starred+ + ) + { + D(fprintf(stderr, "%*c+ kwargs[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.kwarg_or_double_starred+")); + _res = _gather_115_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kwargs[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.kwarg_or_double_starred+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// starred_expression: '*' expression +static expr_ty +starred_expression_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '*' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> starred_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' expression")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (a = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ starred_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' expression")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Starred ( a , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s starred_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// kwarg_or_starred: NAME '=' expression | starred_expression | invalid_kwarg +static KeywordOrStarred* +kwarg_or_starred_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + KeywordOrStarred* _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // NAME '=' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kwarg_or_starred[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME '=' expression")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = _PyPegen_name_token(p)) // NAME + && + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + && + (b = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ kwarg_or_starred[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME '=' expression")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _PyPegen_keyword_or_starred ( p , CHECK ( _Py_keyword ( a -> v . Name . id , b , EXTRA ) ) , 1 ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kwarg_or_starred[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME '=' expression")); + } + { // starred_expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kwarg_or_starred[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); + expr_ty a; + if ( + (a = starred_expression_rule(p)) // starred_expression + ) + { + D(fprintf(stderr, "%*c+ kwarg_or_starred[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); + _res = _PyPegen_keyword_or_starred ( p , a , 0 ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kwarg_or_starred[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression")); + } + if (p->call_invalid_rules) { // invalid_kwarg + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kwarg_or_starred[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_kwarg")); + void *invalid_kwarg_var; + if ( + (invalid_kwarg_var = invalid_kwarg_rule(p)) // invalid_kwarg + ) + { + D(fprintf(stderr, "%*c+ kwarg_or_starred[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_kwarg")); + _res = invalid_kwarg_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kwarg_or_starred[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_kwarg")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// kwarg_or_double_starred: NAME '=' expression | '**' expression | invalid_kwarg +static KeywordOrStarred* +kwarg_or_double_starred_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + KeywordOrStarred* _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // NAME '=' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kwarg_or_double_starred[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME '=' expression")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = _PyPegen_name_token(p)) // NAME + && + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + && + (b = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ kwarg_or_double_starred[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME '=' expression")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _PyPegen_keyword_or_starred ( p , CHECK ( _Py_keyword ( a -> v . Name . id , b , EXTRA ) ) , 1 ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kwarg_or_double_starred[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME '=' expression")); + } + { // '**' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kwarg_or_double_starred[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**' expression")); + Token * _literal; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 35)) // token='**' + && + (a = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ kwarg_or_double_starred[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**' expression")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _PyPegen_keyword_or_starred ( p , CHECK ( _Py_keyword ( NULL , a , EXTRA ) ) , 1 ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kwarg_or_double_starred[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**' expression")); + } + if (p->call_invalid_rules) { // invalid_kwarg + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> kwarg_or_double_starred[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_kwarg")); + void *invalid_kwarg_var; + if ( + (invalid_kwarg_var = invalid_kwarg_rule(p)) // invalid_kwarg + ) + { + D(fprintf(stderr, "%*c+ kwarg_or_double_starred[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_kwarg")); + _res = invalid_kwarg_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s kwarg_or_double_starred[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_kwarg")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// star_targets: star_target !',' | star_target ((',' star_target))* ','? +static expr_ty +star_targets_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // star_target !',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_target !','")); + expr_ty a; + if ( + (a = star_target_rule(p)) // star_target + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 12) // token=',' + ) + { + D(fprintf(stderr, "%*c+ star_targets[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_target !','")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_targets[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_target !','")); + } + { // star_target ((',' star_target))* ','? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_target ((',' star_target))* ','?")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + expr_ty a; + asdl_seq * b; + if ( + (a = star_target_rule(p)) // star_target + && + (b = _loop0_117_rule(p)) // ((',' star_target))* + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + ) + { + D(fprintf(stderr, "%*c+ star_targets[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_target ((',' star_target))* ','?")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Tuple ( CHECK ( _PyPegen_seq_insert_in_front ( p , a , b ) ) , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_targets[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_target ((',' star_target))* ','?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// star_targets_list_seq: ','.star_target+ ','? +static asdl_seq* +star_targets_list_seq_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // ','.star_target+ ','? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_targets_list_seq[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.star_target+ ','?")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + asdl_seq * a; + if ( + (a = _gather_118_rule(p)) // ','.star_target+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + ) + { + D(fprintf(stderr, "%*c+ star_targets_list_seq[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.star_target+ ','?")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_targets_list_seq[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.star_target+ ','?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// star_targets_tuple_seq: star_target ((',' star_target))+ ','? | star_target ',' +static asdl_seq* +star_targets_tuple_seq_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // star_target ((',' star_target))+ ','? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_targets_tuple_seq[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_target ((',' star_target))+ ','?")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + expr_ty a; + asdl_seq * b; + if ( + (a = star_target_rule(p)) // star_target + && + (b = _loop1_120_rule(p)) // ((',' star_target))+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + ) + { + D(fprintf(stderr, "%*c+ star_targets_tuple_seq[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_target ((',' star_target))+ ','?")); + _res = _PyPegen_seq_insert_in_front ( p , a , b ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_targets_tuple_seq[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_target ((',' star_target))+ ','?")); + } + { // star_target ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_targets_tuple_seq[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_target ','")); + Token * _literal; + expr_ty a; + if ( + (a = star_target_rule(p)) // star_target + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ star_targets_tuple_seq[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_target ','")); + _res = _PyPegen_singleton_seq ( p , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_targets_tuple_seq[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_target ','")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// star_target: '*' (!'*' star_target) | target_with_star_atom +static expr_ty +star_target_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, star_target_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // '*' (!'*' star_target) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (!'*' star_target)")); + Token * _literal; + void *a; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (a = _tmp_121_rule(p)) // !'*' star_target + ) + { + D(fprintf(stderr, "%*c+ star_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (!'*' star_target)")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Starred ( CHECK ( _PyPegen_set_expr_context ( p , a , Store ) ) , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' (!'*' star_target)")); + } + { // target_with_star_atom + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "target_with_star_atom")); + expr_ty target_with_star_atom_var; + if ( + (target_with_star_atom_var = target_with_star_atom_rule(p)) // target_with_star_atom + ) + { + D(fprintf(stderr, "%*c+ star_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "target_with_star_atom")); + _res = target_with_star_atom_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "target_with_star_atom")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, star_target_type, _res); + D(p->level--); + return _res; +} + +// target_with_star_atom: +// | t_primary '.' NAME !t_lookahead +// | t_primary '[' slices ']' !t_lookahead +// | star_atom +static expr_ty +target_with_star_atom_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, target_with_star_atom_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // t_primary '.' NAME !t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> target_with_star_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + && + (b = _PyPegen_name_token(p)) // NAME + && + _PyPegen_lookahead(0, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ target_with_star_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Attribute ( a , b -> v . Name . id , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s target_with_star_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + } + { // t_primary '[' slices ']' !t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> target_with_star_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + Token * _literal; + Token * _literal_1; + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (b = slices_rule(p)) // slices + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + && + _PyPegen_lookahead(0, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ target_with_star_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Subscript ( a , b , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s target_with_star_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + } + { // star_atom + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> target_with_star_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_atom")); + expr_ty star_atom_var; + if ( + (star_atom_var = star_atom_rule(p)) // star_atom + ) + { + D(fprintf(stderr, "%*c+ target_with_star_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_atom")); + _res = star_atom_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s target_with_star_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_atom")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, target_with_star_atom_type, _res); + D(p->level--); + return _res; +} + +// star_atom: +// | NAME +// | '(' target_with_star_atom ')' +// | '(' star_targets_tuple_seq? ')' +// | '[' star_targets_list_seq? ']' +static expr_ty +star_atom_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME")); + expr_ty a; + if ( + (a = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ star_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME")); + _res = _PyPegen_set_expr_context ( p , a , Store ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME")); + } + { // '(' target_with_star_atom ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' target_with_star_atom ')'")); + Token * _literal; + Token * _literal_1; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = target_with_star_atom_rule(p)) // target_with_star_atom + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ star_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' target_with_star_atom ')'")); + _res = _PyPegen_set_expr_context ( p , a , Store ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' target_with_star_atom ')'")); + } + { // '(' star_targets_tuple_seq? ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' star_targets_tuple_seq? ')'")); + Token * _literal; + Token * _literal_1; + void *a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = star_targets_tuple_seq_rule(p), 1) // star_targets_tuple_seq? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ star_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' star_targets_tuple_seq? ')'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Tuple ( a , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' star_targets_tuple_seq? ')'")); + } + { // '[' star_targets_list_seq? ']' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> star_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'[' star_targets_list_seq? ']'")); + Token * _literal; + Token * _literal_1; + void *a; + if ( + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (a = star_targets_list_seq_rule(p), 1) // star_targets_list_seq? + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + ) + { + D(fprintf(stderr, "%*c+ star_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'[' star_targets_list_seq? ']'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_List ( a , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s star_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'[' star_targets_list_seq? ']'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// single_target: single_subscript_attribute_target | NAME | '(' single_target ')' +static expr_ty +single_target_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // single_subscript_attribute_target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> single_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "single_subscript_attribute_target")); + expr_ty single_subscript_attribute_target_var; + if ( + (single_subscript_attribute_target_var = single_subscript_attribute_target_rule(p)) // single_subscript_attribute_target + ) + { + D(fprintf(stderr, "%*c+ single_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "single_subscript_attribute_target")); + _res = single_subscript_attribute_target_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s single_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "single_subscript_attribute_target")); + } + { // NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> single_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME")); + expr_ty a; + if ( + (a = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ single_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME")); + _res = _PyPegen_set_expr_context ( p , a , Store ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s single_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME")); + } + { // '(' single_target ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> single_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' single_target ')'")); + Token * _literal; + Token * _literal_1; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = single_target_rule(p)) // single_target + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ single_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' single_target ')'")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s single_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' single_target ')'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// single_subscript_attribute_target: +// | t_primary '.' NAME !t_lookahead +// | t_primary '[' slices ']' !t_lookahead +static expr_ty +single_subscript_attribute_target_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // t_primary '.' NAME !t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> single_subscript_attribute_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + && + (b = _PyPegen_name_token(p)) // NAME + && + _PyPegen_lookahead(0, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ single_subscript_attribute_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Attribute ( a , b -> v . Name . id , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s single_subscript_attribute_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + } + { // t_primary '[' slices ']' !t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> single_subscript_attribute_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + Token * _literal; + Token * _literal_1; + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (b = slices_rule(p)) // slices + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + && + _PyPegen_lookahead(0, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ single_subscript_attribute_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Subscript ( a , b , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s single_subscript_attribute_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// del_targets: ','.del_target+ ','? +static asdl_seq* +del_targets_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // ','.del_target+ ','? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> del_targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.del_target+ ','?")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + asdl_seq * a; + if ( + (a = _gather_122_rule(p)) // ','.del_target+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + ) + { + D(fprintf(stderr, "%*c+ del_targets[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.del_target+ ','?")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s del_targets[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.del_target+ ','?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// del_target: +// | t_primary '.' NAME !t_lookahead +// | t_primary '[' slices ']' !t_lookahead +// | del_t_atom +static expr_ty +del_target_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, del_target_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // t_primary '.' NAME !t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> del_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + && + (b = _PyPegen_name_token(p)) // NAME + && + _PyPegen_lookahead(0, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ del_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Attribute ( a , b -> v . Name . id , Del , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s del_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + } + { // t_primary '[' slices ']' !t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> del_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + Token * _literal; + Token * _literal_1; + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (b = slices_rule(p)) // slices + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + && + _PyPegen_lookahead(0, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ del_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Subscript ( a , b , Del , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s del_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + } + { // del_t_atom + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> del_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "del_t_atom")); + expr_ty del_t_atom_var; + if ( + (del_t_atom_var = del_t_atom_rule(p)) // del_t_atom + ) + { + D(fprintf(stderr, "%*c+ del_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "del_t_atom")); + _res = del_t_atom_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s del_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "del_t_atom")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, del_target_type, _res); + D(p->level--); + return _res; +} + +// del_t_atom: NAME | '(' del_target ')' | '(' del_targets? ')' | '[' del_targets? ']' +static expr_ty +del_t_atom_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> del_t_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME")); + expr_ty a; + if ( + (a = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ del_t_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME")); + _res = _PyPegen_set_expr_context ( p , a , Del ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s del_t_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME")); + } + { // '(' del_target ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> del_t_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' del_target ')'")); + Token * _literal; + Token * _literal_1; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = del_target_rule(p)) // del_target + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ del_t_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' del_target ')'")); + _res = _PyPegen_set_expr_context ( p , a , Del ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s del_t_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' del_target ')'")); + } + { // '(' del_targets? ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> del_t_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' del_targets? ')'")); + Token * _literal; + Token * _literal_1; + void *a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = del_targets_rule(p), 1) // del_targets? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ del_t_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' del_targets? ')'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Tuple ( a , Del , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s del_t_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' del_targets? ')'")); + } + { // '[' del_targets? ']' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> del_t_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'[' del_targets? ']'")); + Token * _literal; + Token * _literal_1; + void *a; + if ( + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (a = del_targets_rule(p), 1) // del_targets? + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + ) + { + D(fprintf(stderr, "%*c+ del_t_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'[' del_targets? ']'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_List ( a , Del , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s del_t_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'[' del_targets? ']'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// targets: ','.target+ ','? +static asdl_seq* +targets_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq* _res = NULL; + int _mark = p->mark; + { // ','.target+ ','? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','.target+ ','?")); + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + asdl_seq * a; + if ( + (a = _gather_124_rule(p)) // ','.target+ + && + (_opt_var = _PyPegen_expect_token(p, 12), 1) // ','? + ) + { + D(fprintf(stderr, "%*c+ targets[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','.target+ ','?")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s targets[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','.target+ ','?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// target: +// | t_primary '.' NAME !t_lookahead +// | t_primary '[' slices ']' !t_lookahead +// | t_atom +static expr_ty +target_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, target_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // t_primary '.' NAME !t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + && + (b = _PyPegen_name_token(p)) // NAME + && + _PyPegen_lookahead(0, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Attribute ( a , b -> v . Name . id , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '.' NAME !t_lookahead")); + } + { // t_primary '[' slices ']' !t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + Token * _literal; + Token * _literal_1; + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (b = slices_rule(p)) // slices + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + && + _PyPegen_lookahead(0, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Subscript ( a , b , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '[' slices ']' !t_lookahead")); + } + { // t_atom + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_atom")); + expr_ty t_atom_var; + if ( + (t_atom_var = t_atom_rule(p)) // t_atom + ) + { + D(fprintf(stderr, "%*c+ target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_atom")); + _res = t_atom_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_atom")); + } + _res = NULL; + done: + _PyPegen_insert_memo(p, _mark, target_type, _res); + D(p->level--); + return _res; +} + +// Left-recursive +// t_primary: +// | t_primary '.' NAME &t_lookahead +// | t_primary '[' slices ']' &t_lookahead +// | t_primary genexp &t_lookahead +// | t_primary '(' arguments? ')' &t_lookahead +// | atom &t_lookahead +static expr_ty t_primary_raw(Parser *); +static expr_ty +t_primary_rule(Parser *p) +{ + D(p->level++); + expr_ty _res = NULL; + if (_PyPegen_is_memoized(p, t_primary_type, &_res)) { + D(p->level--); + return _res; + } + int _mark = p->mark; + int _resmark = p->mark; + while (1) { + int tmpvar_8 = _PyPegen_update_memo(p, _mark, t_primary_type, _res); + if (tmpvar_8) { + D(p->level--); + return _res; + } + p->mark = _mark; + void *_raw = t_primary_raw(p); + if (p->error_indicator) + return NULL; + if (_raw == NULL || p->mark <= _resmark) + break; + _resmark = p->mark; + _res = _raw; + } + p->mark = _resmark; + D(p->level--); + return _res; +} +static expr_ty +t_primary_raw(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // t_primary '.' NAME &t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '.' NAME &t_lookahead")); + Token * _literal; + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + && + (b = _PyPegen_name_token(p)) // NAME + && + _PyPegen_lookahead(1, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ t_primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '.' NAME &t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Attribute ( a , b -> v . Name . id , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '.' NAME &t_lookahead")); + } + { // t_primary '[' slices ']' &t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '[' slices ']' &t_lookahead")); + Token * _literal; + Token * _literal_1; + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (b = slices_rule(p)) // slices + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + && + _PyPegen_lookahead(1, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ t_primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '[' slices ']' &t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Subscript ( a , b , Load , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '[' slices ']' &t_lookahead")); + } + { // t_primary genexp &t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary genexp &t_lookahead")); + expr_ty a; + expr_ty b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (b = genexp_rule(p)) // genexp + && + _PyPegen_lookahead(1, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ t_primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary genexp &t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Call ( a , CHECK ( _PyPegen_singleton_seq ( p , b ) ) , NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary genexp &t_lookahead")); + } + { // t_primary '(' arguments? ')' &t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "t_primary '(' arguments? ')' &t_lookahead")); + Token * _literal; + Token * _literal_1; + expr_ty a; + void *b; + if ( + (a = t_primary_rule(p)) // t_primary + && + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (b = arguments_rule(p), 1) // arguments? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + && + _PyPegen_lookahead(1, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ t_primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "t_primary '(' arguments? ')' &t_lookahead")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Call ( a , ( b ) ? ( ( expr_ty ) b ) -> v . Call . args : NULL , ( b ) ? ( ( expr_ty ) b ) -> v . Call . keywords : NULL , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "t_primary '(' arguments? ')' &t_lookahead")); + } + { // atom &t_lookahead + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "atom &t_lookahead")); + expr_ty a; + if ( + (a = atom_rule(p)) // atom + && + _PyPegen_lookahead(1, t_lookahead_rule, p) + ) + { + D(fprintf(stderr, "%*c+ t_primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "atom &t_lookahead")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "atom &t_lookahead")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// t_lookahead: '(' | '[' | '.' +static void * +t_lookahead_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '(' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_lookahead[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + ) + { + D(fprintf(stderr, "%*c+ t_lookahead[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_lookahead[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'('")); + } + { // '[' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_lookahead[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + ) + { + D(fprintf(stderr, "%*c+ t_lookahead[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_lookahead[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'['")); + } + { // '.' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_lookahead[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + ) + { + D(fprintf(stderr, "%*c+ t_lookahead[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_lookahead[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// t_atom: NAME | '(' target ')' | '(' targets? ')' | '[' targets? ']' +static expr_ty +t_atom_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + int _start_lineno = p->tokens[_mark]->lineno; + UNUSED(_start_lineno); // Only used by EXTRA macro + int _start_col_offset = p->tokens[_mark]->col_offset; + UNUSED(_start_col_offset); // Only used by EXTRA macro + { // NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME")); + expr_ty a; + if ( + (a = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ t_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME")); + _res = _PyPegen_set_expr_context ( p , a , Store ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME")); + } + { // '(' target ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' target ')'")); + Token * _literal; + Token * _literal_1; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = target_rule(p)) // target + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ t_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' target ')'")); + _res = _PyPegen_set_expr_context ( p , a , Store ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' target ')'")); + } + { // '(' targets? ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' targets? ')'")); + Token * _literal; + Token * _literal_1; + void *b; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (b = targets_rule(p), 1) // targets? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ t_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' targets? ')'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_Tuple ( b , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' targets? ')'")); + } + { // '[' targets? ']' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> t_atom[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'[' targets? ']'")); + Token * _literal; + Token * _literal_1; + void *b; + if ( + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + && + (b = targets_rule(p), 1) // targets? + && + (_literal_1 = _PyPegen_expect_token(p, 10)) // token=']' + ) + { + D(fprintf(stderr, "%*c+ t_atom[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'[' targets? ']'")); + Token *_token = _PyPegen_get_last_nonnwhitespace_token(p); + if (_token == NULL) { + D(p->level--); + return NULL; + } + int _end_lineno = _token->end_lineno; + UNUSED(_end_lineno); // Only used by EXTRA macro + int _end_col_offset = _token->end_col_offset; + UNUSED(_end_col_offset); // Only used by EXTRA macro + _res = _Py_List ( b , Store , EXTRA ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s t_atom[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'[' targets? ']'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_arguments: +// | args ',' '*' +// | expression for_if_clauses ',' [args | expression for_if_clauses] +// | args for_if_clauses +// | args ',' expression for_if_clauses +// | args ',' args +static void * +invalid_arguments_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // args ',' '*' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ',' '*'")); + Token * _literal; + Token * _literal_1; + expr_ty args_var; + if ( + (args_var = args_rule(p)) // args + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (_literal_1 = _PyPegen_expect_token(p, 16)) // token='*' + ) + { + D(fprintf(stderr, "%*c+ invalid_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args ',' '*'")); + _res = RAISE_SYNTAX_ERROR ( "iterable argument unpacking follows keyword argument unpacking" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_arguments[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args ',' '*'")); + } + { // expression for_if_clauses ',' [args | expression for_if_clauses] + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses ',' [args | expression for_if_clauses]")); + Token * _literal; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + expr_ty a; + asdl_seq* for_if_clauses_var; + if ( + (a = expression_rule(p)) // expression + && + (for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (_opt_var = _tmp_126_rule(p), 1) // [args | expression for_if_clauses] + ) + { + D(fprintf(stderr, "%*c+ invalid_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses ',' [args | expression for_if_clauses]")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "Generator expression must be parenthesized" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_arguments[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression for_if_clauses ',' [args | expression for_if_clauses]")); + } + { // args for_if_clauses + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args for_if_clauses")); + expr_ty a; + asdl_seq* for_if_clauses_var; + if ( + (a = args_rule(p)) // args + && + (for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses + ) + { + D(fprintf(stderr, "%*c+ invalid_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args for_if_clauses")); + _res = _PyPegen_nonparen_genexp_in_call ( p , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_arguments[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args for_if_clauses")); + } + { // args ',' expression for_if_clauses + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ',' expression for_if_clauses")); + Token * _literal; + expr_ty a; + expr_ty args_var; + asdl_seq* for_if_clauses_var; + if ( + (args_var = args_rule(p)) // args + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (a = expression_rule(p)) // expression + && + (for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses + ) + { + D(fprintf(stderr, "%*c+ invalid_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args ',' expression for_if_clauses")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "Generator expression must be parenthesized" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_arguments[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args ',' expression for_if_clauses")); + } + { // args ',' args + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_arguments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args ',' args")); + Token * _literal; + expr_ty a; + expr_ty args_var; + if ( + (a = args_rule(p)) // args + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (args_var = args_rule(p)) // args + ) + { + D(fprintf(stderr, "%*c+ invalid_arguments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args ',' args")); + _res = _PyPegen_arguments_parsing_error ( p , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_arguments[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args ',' args")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_kwarg: expression '=' +static void * +invalid_kwarg_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // expression '=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_kwarg[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression '='")); + Token * _literal; + expr_ty a; + if ( + (a = expression_rule(p)) // expression + && + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + ) + { + D(fprintf(stderr, "%*c+ invalid_kwarg[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression '='")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "expression cannot contain assignment, perhaps you meant \"==\"?" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_kwarg[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression '='")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_named_expression: expression ':=' expression +static void * +invalid_named_expression_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // expression ':=' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_named_expression[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ':=' expression")); + Token * _literal; + expr_ty a; + expr_ty expression_var; + if ( + (a = expression_rule(p)) // expression + && + (_literal = _PyPegen_expect_token(p, 53)) // token=':=' + && + (expression_var = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ invalid_named_expression[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ':=' expression")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "cannot use assignment expressions with %s" , _PyPegen_get_expr_name ( a ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_named_expression[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ':=' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_assignment: +// | invalid_ann_assign_target ':' expression +// | star_named_expression ',' star_named_expressions* ':' expression +// | expression ':' expression +// | ((star_targets '='))* star_expressions '=' +// | ((star_targets '='))* yield_expr '=' +// | star_expressions augassign (yield_expr | star_expressions) +static void * +invalid_assignment_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // invalid_ann_assign_target ':' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "invalid_ann_assign_target ':' expression")); + Token * _literal; + expr_ty a; + expr_ty expression_var; + if ( + (a = invalid_ann_assign_target_rule(p)) // invalid_ann_assign_target + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (expression_var = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ invalid_assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "invalid_ann_assign_target ':' expression")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "only single target (not %s) can be annotated" , _PyPegen_get_expr_name ( a ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "invalid_ann_assign_target ':' expression")); + } + { // star_named_expression ',' star_named_expressions* ':' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions* ':' expression")); + Token * _literal; + Token * _literal_1; + asdl_seq * _loop0_127_var; + expr_ty a; + expr_ty expression_var; + if ( + (a = star_named_expression_rule(p)) // star_named_expression + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (_loop0_127_var = _loop0_127_rule(p)) // star_named_expressions* + && + (_literal_1 = _PyPegen_expect_token(p, 11)) // token=':' + && + (expression_var = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ invalid_assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions* ':' expression")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "only single target (not tuple) can be annotated" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression ',' star_named_expressions* ':' expression")); + } + { // expression ':' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression ':' expression")); + Token * _literal; + expr_ty a; + expr_ty expression_var; + if ( + (a = expression_rule(p)) // expression + && + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (expression_var = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ invalid_assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression ':' expression")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "illegal target for annotation" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression ':' expression")); + } + { // ((star_targets '='))* star_expressions '=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((star_targets '='))* star_expressions '='")); + Token * _literal; + asdl_seq * _loop0_128_var; + expr_ty a; + if ( + (_loop0_128_var = _loop0_128_rule(p)) // ((star_targets '='))* + && + (a = star_expressions_rule(p)) // star_expressions + && + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + ) + { + D(fprintf(stderr, "%*c+ invalid_assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "((star_targets '='))* star_expressions '='")); + _res = RAISE_SYNTAX_ERROR_INVALID_TARGET ( STAR_TARGETS , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "((star_targets '='))* star_expressions '='")); + } + { // ((star_targets '='))* yield_expr '=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "((star_targets '='))* yield_expr '='")); + Token * _literal; + asdl_seq * _loop0_129_var; + expr_ty a; + if ( + (_loop0_129_var = _loop0_129_rule(p)) // ((star_targets '='))* + && + (a = yield_expr_rule(p)) // yield_expr + && + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + ) + { + D(fprintf(stderr, "%*c+ invalid_assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "((star_targets '='))* yield_expr '='")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "assignment to yield expression not possible" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "((star_targets '='))* yield_expr '='")); + } + { // star_expressions augassign (yield_expr | star_expressions) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_assignment[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions augassign (yield_expr | star_expressions)")); + void *_tmp_130_var; + expr_ty a; + AugOperator* augassign_var; + if ( + (a = star_expressions_rule(p)) // star_expressions + && + (augassign_var = augassign_rule(p)) // augassign + && + (_tmp_130_var = _tmp_130_rule(p)) // yield_expr | star_expressions + ) + { + D(fprintf(stderr, "%*c+ invalid_assignment[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions augassign (yield_expr | star_expressions)")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "'%s' is an illegal expression for augmented assignment" , _PyPegen_get_expr_name ( a ) ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_assignment[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions augassign (yield_expr | star_expressions)")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_ann_assign_target: list | tuple | '(' invalid_ann_assign_target ')' +static expr_ty +invalid_ann_assign_target_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + expr_ty _res = NULL; + int _mark = p->mark; + { // list + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_ann_assign_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "list")); + expr_ty list_var; + if ( + (list_var = list_rule(p)) // list + ) + { + D(fprintf(stderr, "%*c+ invalid_ann_assign_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "list")); + _res = list_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_ann_assign_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "list")); + } + { // tuple + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_ann_assign_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tuple")); + expr_ty tuple_var; + if ( + (tuple_var = tuple_rule(p)) // tuple + ) + { + D(fprintf(stderr, "%*c+ invalid_ann_assign_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tuple")); + _res = tuple_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_ann_assign_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tuple")); + } + { // '(' invalid_ann_assign_target ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_ann_assign_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' invalid_ann_assign_target ')'")); + Token * _literal; + Token * _literal_1; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = invalid_ann_assign_target_rule(p)) // invalid_ann_assign_target + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ invalid_ann_assign_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' invalid_ann_assign_target ')'")); + _res = a; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_ann_assign_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' invalid_ann_assign_target ')'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_del_stmt: 'del' star_expressions +static void * +invalid_del_stmt_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'del' star_expressions + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_del_stmt[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'del' star_expressions")); + Token * _keyword; + expr_ty a; + if ( + (_keyword = _PyPegen_expect_token(p, 503)) // token='del' + && + (a = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ invalid_del_stmt[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'del' star_expressions")); + _res = RAISE_SYNTAX_ERROR_INVALID_TARGET ( DEL_TARGETS , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_del_stmt[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'del' star_expressions")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_block: NEWLINE !INDENT +static void * +invalid_block_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // NEWLINE !INDENT + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_block[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE !INDENT")); + Token * newline_var; + if ( + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, INDENT) // token=INDENT + ) + { + D(fprintf(stderr, "%*c+ invalid_block[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE !INDENT")); + _res = RAISE_INDENTATION_ERROR ( "expected an indented block" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_block[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE !INDENT")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// Left-recursive +// invalid_primary: primary '{' +static void * +invalid_primary_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // primary '{' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_primary[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "primary '{'")); + Token * a; + expr_ty primary_var; + if ( + (primary_var = primary_rule(p)) // primary + && + (a = _PyPegen_expect_token(p, 25)) // token='{' + ) + { + D(fprintf(stderr, "%*c+ invalid_primary[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "primary '{'")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "invalid syntax" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_primary[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "primary '{'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_comprehension: ('[' | '(' | '{') starred_expression for_if_clauses +static void * +invalid_comprehension_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ('[' | '(' | '{') starred_expression for_if_clauses + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('[' | '(' | '{') starred_expression for_if_clauses")); + void *_tmp_131_var; + expr_ty a; + asdl_seq* for_if_clauses_var; + if ( + (_tmp_131_var = _tmp_131_rule(p)) // '[' | '(' | '{' + && + (a = starred_expression_rule(p)) // starred_expression + && + (for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses + ) + { + D(fprintf(stderr, "%*c+ invalid_comprehension[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "('[' | '(' | '{') starred_expression for_if_clauses")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "iterable unpacking cannot be used in comprehension" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_comprehension[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('[' | '(' | '{') starred_expression for_if_clauses")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_dict_comprehension: '{' '**' bitwise_or for_if_clauses '}' +static void * +invalid_dict_comprehension_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '{' '**' bitwise_or for_if_clauses '}' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_dict_comprehension[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{' '**' bitwise_or for_if_clauses '}'")); + Token * _literal; + Token * _literal_1; + Token * a; + expr_ty bitwise_or_var; + asdl_seq* for_if_clauses_var; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + && + (a = _PyPegen_expect_token(p, 35)) // token='**' + && + (bitwise_or_var = bitwise_or_rule(p)) // bitwise_or + && + (for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses + && + (_literal_1 = _PyPegen_expect_token(p, 26)) // token='}' + ) + { + D(fprintf(stderr, "%*c+ invalid_dict_comprehension[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{' '**' bitwise_or for_if_clauses '}'")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "dict unpacking cannot be used in dict comprehension" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_dict_comprehension[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{' '**' bitwise_or for_if_clauses '}'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_parameters: +// | param_no_default* (slash_with_default | param_with_default+) param_no_default +static void * +invalid_parameters_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // param_no_default* (slash_with_default | param_with_default+) param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default* (slash_with_default | param_with_default+) param_no_default")); + asdl_seq * _loop0_132_var; + void *_tmp_133_var; + arg_ty param_no_default_var; + if ( + (_loop0_132_var = _loop0_132_rule(p)) // param_no_default* + && + (_tmp_133_var = _tmp_133_rule(p)) // slash_with_default | param_with_default+ + && + (param_no_default_var = param_no_default_rule(p)) // param_no_default + ) + { + D(fprintf(stderr, "%*c+ invalid_parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_no_default* (slash_with_default | param_with_default+) param_no_default")); + _res = RAISE_SYNTAX_ERROR ( "non-default argument follows default argument" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default* (slash_with_default | param_with_default+) param_no_default")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_lambda_parameters: +// | lambda_param_no_default* (lambda_slash_with_default | lambda_param_with_default+) lambda_param_no_default +static void * +invalid_lambda_parameters_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // lambda_param_no_default* (lambda_slash_with_default | lambda_param_with_default+) lambda_param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_lambda_parameters[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default* (lambda_slash_with_default | lambda_param_with_default+) lambda_param_no_default")); + asdl_seq * _loop0_134_var; + void *_tmp_135_var; + arg_ty lambda_param_no_default_var; + if ( + (_loop0_134_var = _loop0_134_rule(p)) // lambda_param_no_default* + && + (_tmp_135_var = _tmp_135_rule(p)) // lambda_slash_with_default | lambda_param_with_default+ + && + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + ) + { + D(fprintf(stderr, "%*c+ invalid_lambda_parameters[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default* (lambda_slash_with_default | lambda_param_with_default+) lambda_param_no_default")); + _res = RAISE_SYNTAX_ERROR ( "non-default argument follows default argument" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_lambda_parameters[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default* (lambda_slash_with_default | lambda_param_with_default+) lambda_param_no_default")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_star_etc: '*' (')' | ',' (')' | '**')) | '*' ',' TYPE_COMMENT +static void * +invalid_star_etc_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '*' (')' | ',' (')' | '**')) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (')' | ',' (')' | '**'))")); + Token * _literal; + void *_tmp_136_var; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (_tmp_136_var = _tmp_136_rule(p)) // ')' | ',' (')' | '**') + ) + { + D(fprintf(stderr, "%*c+ invalid_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (')' | ',' (')' | '**'))")); + _res = RAISE_SYNTAX_ERROR ( "named arguments must follow bare *" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' (')' | ',' (')' | '**'))")); + } + { // '*' ',' TYPE_COMMENT + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' ',' TYPE_COMMENT")); + Token * _literal; + Token * _literal_1; + Token * type_comment_var; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (_literal_1 = _PyPegen_expect_token(p, 12)) // token=',' + && + (type_comment_var = _PyPegen_expect_token(p, TYPE_COMMENT)) // token='TYPE_COMMENT' + ) + { + D(fprintf(stderr, "%*c+ invalid_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' ',' TYPE_COMMENT")); + _res = RAISE_SYNTAX_ERROR ( "bare * has associated type comment" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' ',' TYPE_COMMENT")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_lambda_star_etc: '*' (':' | ',' (':' | '**')) +static void * +invalid_lambda_star_etc_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '*' (':' | ',' (':' | '**')) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_lambda_star_etc[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'*' (':' | ',' (':' | '**'))")); + Token * _literal; + void *_tmp_137_var; + if ( + (_literal = _PyPegen_expect_token(p, 16)) // token='*' + && + (_tmp_137_var = _tmp_137_rule(p)) // ':' | ',' (':' | '**') + ) + { + D(fprintf(stderr, "%*c+ invalid_lambda_star_etc[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'*' (':' | ',' (':' | '**'))")); + _res = RAISE_SYNTAX_ERROR ( "named arguments must follow bare *" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_lambda_star_etc[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'*' (':' | ',' (':' | '**'))")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_double_type_comments: TYPE_COMMENT NEWLINE TYPE_COMMENT NEWLINE INDENT +static void * +invalid_double_type_comments_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // TYPE_COMMENT NEWLINE TYPE_COMMENT NEWLINE INDENT + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_double_type_comments[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "TYPE_COMMENT NEWLINE TYPE_COMMENT NEWLINE INDENT")); + Token * indent_var; + Token * newline_var; + Token * newline_var_1; + Token * type_comment_var; + Token * type_comment_var_1; + if ( + (type_comment_var = _PyPegen_expect_token(p, TYPE_COMMENT)) // token='TYPE_COMMENT' + && + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + && + (type_comment_var_1 = _PyPegen_expect_token(p, TYPE_COMMENT)) // token='TYPE_COMMENT' + && + (newline_var_1 = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + && + (indent_var = _PyPegen_expect_token(p, INDENT)) // token='INDENT' + ) + { + D(fprintf(stderr, "%*c+ invalid_double_type_comments[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "TYPE_COMMENT NEWLINE TYPE_COMMENT NEWLINE INDENT")); + _res = RAISE_SYNTAX_ERROR ( "Cannot have two type comments on def" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_double_type_comments[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "TYPE_COMMENT NEWLINE TYPE_COMMENT NEWLINE INDENT")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_with_item: expression 'as' expression +static void * +invalid_with_item_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // expression 'as' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_with_item[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression 'as' expression")); + Token * _keyword; + expr_ty a; + expr_ty expression_var; + if ( + (expression_var = expression_rule(p)) // expression + && + (_keyword = _PyPegen_expect_token(p, 520)) // token='as' + && + (a = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ invalid_with_item[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression 'as' expression")); + _res = RAISE_SYNTAX_ERROR_INVALID_TARGET ( STAR_TARGETS , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_with_item[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression 'as' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_for_target: ASYNC? 'for' star_expressions +static void * +invalid_for_target_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ASYNC? 'for' star_expressions + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_for_target[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC? 'for' star_expressions")); + Token * _keyword; + void *_opt_var; + UNUSED(_opt_var); // Silence compiler warnings + expr_ty a; + if ( + (_opt_var = _PyPegen_expect_token(p, ASYNC), 1) // ASYNC? + && + (_keyword = _PyPegen_expect_token(p, 517)) // token='for' + && + (a = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ invalid_for_target[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC? 'for' star_expressions")); + _res = RAISE_SYNTAX_ERROR_INVALID_TARGET ( FOR_TARGETS , a ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_for_target[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC? 'for' star_expressions")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_group: '(' starred_expression ')' +static void * +invalid_group_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '(' starred_expression ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_group[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' starred_expression ')'")); + Token * _literal; + Token * _literal_1; + expr_ty a; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (a = starred_expression_rule(p)) // starred_expression + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ invalid_group[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' starred_expression ')'")); + _res = RAISE_SYNTAX_ERROR_KNOWN_LOCATION ( a , "can't use starred expression here" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_group[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' starred_expression ')'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// invalid_import_from_targets: import_from_as_names ',' +static void * +invalid_import_from_targets_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // import_from_as_names ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> invalid_import_from_targets[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "import_from_as_names ','")); + Token * _literal; + asdl_seq* import_from_as_names_var; + if ( + (import_from_as_names_var = import_from_as_names_rule(p)) // import_from_as_names + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ invalid_import_from_targets[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "import_from_as_names ','")); + _res = RAISE_SYNTAX_ERROR ( "trailing comma not allowed without surrounding parentheses" ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s invalid_import_from_targets[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "import_from_as_names ','")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_1: NEWLINE +static asdl_seq * +_loop0_1_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // NEWLINE + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_1[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + Token * newline_var; + while ( + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + ) + { + _res = newline_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_1[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_1_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_2: NEWLINE +static asdl_seq * +_loop0_2_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // NEWLINE + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_2[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + Token * newline_var; + while ( + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + ) + { + _res = newline_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_2[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_2_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_4: ',' expression +static asdl_seq * +_loop0_4_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_4[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = expression_rule(p)) // expression + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_4[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_4_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_3: expression _loop0_4 +static asdl_seq * +_gather_3_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // expression _loop0_4 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_3[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_4")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = expression_rule(p)) // expression + && + (seq = _loop0_4_rule(p)) // _loop0_4 + ) + { + D(fprintf(stderr, "%*c+ _gather_3[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_4")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_3[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_4")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_6: ',' expression +static asdl_seq * +_loop0_6_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_6[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = expression_rule(p)) // expression + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_6[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_6_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_5: expression _loop0_6 +static asdl_seq * +_gather_5_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // expression _loop0_6 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_5[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_6")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = expression_rule(p)) // expression + && + (seq = _loop0_6_rule(p)) // _loop0_6 + ) + { + D(fprintf(stderr, "%*c+ _gather_5[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_6")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_5[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_6")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_8: ',' expression +static asdl_seq * +_loop0_8_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_8[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = expression_rule(p)) // expression + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_8[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_8_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_7: expression _loop0_8 +static asdl_seq * +_gather_7_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // expression _loop0_8 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_7[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_8")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = expression_rule(p)) // expression + && + (seq = _loop0_8_rule(p)) // _loop0_8 + ) + { + D(fprintf(stderr, "%*c+ _gather_7[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_8")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_7[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_8")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_10: ',' expression +static asdl_seq * +_loop0_10_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_10[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = expression_rule(p)) // expression + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_10[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_10_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_9: expression _loop0_10 +static asdl_seq * +_gather_9_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // expression _loop0_10 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_9[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression _loop0_10")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = expression_rule(p)) // expression + && + (seq = _loop0_10_rule(p)) // _loop0_10 + ) + { + D(fprintf(stderr, "%*c+ _gather_9[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression _loop0_10")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_9[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression _loop0_10")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop1_11: statement +static asdl_seq * +_loop1_11_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // statement + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_11[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "statement")); + asdl_seq* statement_var; + while ( + (statement_var = statement_rule(p)) // statement + ) + { + _res = statement_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_11[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "statement")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_11_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_13: ';' small_stmt +static asdl_seq * +_loop0_13_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ';' small_stmt + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_13[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';' small_stmt")); + Token * _literal; + stmt_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 13)) // token=';' + && + (elem = small_stmt_rule(p)) // small_stmt + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_13[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "';' small_stmt")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_13_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_12: small_stmt _loop0_13 +static asdl_seq * +_gather_12_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // small_stmt _loop0_13 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_12[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "small_stmt _loop0_13")); + stmt_ty elem; + asdl_seq * seq; + if ( + (elem = small_stmt_rule(p)) // small_stmt + && + (seq = _loop0_13_rule(p)) // _loop0_13 + ) + { + D(fprintf(stderr, "%*c+ _gather_12[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "small_stmt _loop0_13")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_12[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "small_stmt _loop0_13")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_14: 'import' | 'from' +static void * +_tmp_14_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'import' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_14[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'import'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 513)) // token='import' + ) + { + D(fprintf(stderr, "%*c+ _tmp_14[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'import'")); + _res = _keyword; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_14[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'import'")); + } + { // 'from' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_14[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'from'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 514)) // token='from' + ) + { + D(fprintf(stderr, "%*c+ _tmp_14[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'from'")); + _res = _keyword; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_14[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'from'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_15: 'def' | '@' | ASYNC +static void * +_tmp_15_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'def' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_15[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'def'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 523)) // token='def' + ) + { + D(fprintf(stderr, "%*c+ _tmp_15[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'def'")); + _res = _keyword; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_15[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'def'")); + } + { // '@' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_15[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 49)) // token='@' + ) + { + D(fprintf(stderr, "%*c+ _tmp_15[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_15[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@'")); + } + { // ASYNC + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_15[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC")); + Token * async_var; + if ( + (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' + ) + { + D(fprintf(stderr, "%*c+ _tmp_15[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC")); + _res = async_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_15[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_16: 'class' | '@' +static void * +_tmp_16_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'class' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_16[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'class'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 524)) // token='class' + ) + { + D(fprintf(stderr, "%*c+ _tmp_16[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'class'")); + _res = _keyword; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_16[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'class'")); + } + { // '@' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_16[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 49)) // token='@' + ) + { + D(fprintf(stderr, "%*c+ _tmp_16[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_16[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_17: 'with' | ASYNC +static void * +_tmp_17_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'with' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_17[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'with'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 519)) // token='with' + ) + { + D(fprintf(stderr, "%*c+ _tmp_17[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'with'")); + _res = _keyword; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_17[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'with'")); + } + { // ASYNC + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_17[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC")); + Token * async_var; + if ( + (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' + ) + { + D(fprintf(stderr, "%*c+ _tmp_17[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC")); + _res = async_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_17[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_18: 'for' | ASYNC +static void * +_tmp_18_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'for' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_18[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'for'")); + Token * _keyword; + if ( + (_keyword = _PyPegen_expect_token(p, 517)) // token='for' + ) + { + D(fprintf(stderr, "%*c+ _tmp_18[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'for'")); + _res = _keyword; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_18[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'for'")); + } + { // ASYNC + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_18[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "ASYNC")); + Token * async_var; + if ( + (async_var = _PyPegen_expect_token(p, ASYNC)) // token='ASYNC' + ) + { + D(fprintf(stderr, "%*c+ _tmp_18[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "ASYNC")); + _res = async_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_18[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "ASYNC")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_19: '=' annotated_rhs +static void * +_tmp_19_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '=' annotated_rhs + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_19[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); + Token * _literal; + expr_ty d; + if ( + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + && + (d = annotated_rhs_rule(p)) // annotated_rhs + ) + { + D(fprintf(stderr, "%*c+ _tmp_19[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); + _res = d; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_19[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'=' annotated_rhs")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_20: '(' single_target ')' | single_subscript_attribute_target +static void * +_tmp_20_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '(' single_target ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_20[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' single_target ')'")); + Token * _literal; + Token * _literal_1; + expr_ty b; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (b = single_target_rule(p)) // single_target + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ _tmp_20[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' single_target ')'")); + _res = b; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_20[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' single_target ')'")); + } + { // single_subscript_attribute_target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_20[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "single_subscript_attribute_target")); + expr_ty single_subscript_attribute_target_var; + if ( + (single_subscript_attribute_target_var = single_subscript_attribute_target_rule(p)) // single_subscript_attribute_target + ) + { + D(fprintf(stderr, "%*c+ _tmp_20[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "single_subscript_attribute_target")); + _res = single_subscript_attribute_target_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_20[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "single_subscript_attribute_target")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_21: '=' annotated_rhs +static void * +_tmp_21_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '=' annotated_rhs + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_21[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); + Token * _literal; + expr_ty d; + if ( + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + && + (d = annotated_rhs_rule(p)) // annotated_rhs + ) + { + D(fprintf(stderr, "%*c+ _tmp_21[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'=' annotated_rhs")); + _res = d; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_21[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'=' annotated_rhs")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop1_22: (star_targets '=') +static asdl_seq * +_loop1_22_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // (star_targets '=') + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_22[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); + void *_tmp_138_var; + while ( + (_tmp_138_var = _tmp_138_rule(p)) // star_targets '=' + ) + { + _res = _tmp_138_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_22[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_22_type, _seq); + D(p->level--); + return _seq; +} + +// _tmp_23: yield_expr | star_expressions +static void * +_tmp_23_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_23[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_23[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_23[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_23[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ _tmp_23[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_23[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_24: yield_expr | star_expressions +static void * +_tmp_24_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_24[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_24[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_24[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_24[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ _tmp_24[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_24[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_26: ',' NAME +static asdl_seq * +_loop0_26_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_26[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' NAME")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = _PyPegen_name_token(p)) // NAME + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_26[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' NAME")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_26_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_25: NAME _loop0_26 +static asdl_seq * +_gather_25_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // NAME _loop0_26 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_25[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME _loop0_26")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = _PyPegen_name_token(p)) // NAME + && + (seq = _loop0_26_rule(p)) // _loop0_26 + ) + { + D(fprintf(stderr, "%*c+ _gather_25[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME _loop0_26")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_25[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME _loop0_26")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_28: ',' NAME +static asdl_seq * +_loop0_28_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_28[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' NAME")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = _PyPegen_name_token(p)) // NAME + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_28[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' NAME")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_28_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_27: NAME _loop0_28 +static asdl_seq * +_gather_27_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // NAME _loop0_28 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_27[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NAME _loop0_28")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = _PyPegen_name_token(p)) // NAME + && + (seq = _loop0_28_rule(p)) // _loop0_28 + ) + { + D(fprintf(stderr, "%*c+ _gather_27[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NAME _loop0_28")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_27[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NAME _loop0_28")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_29: ',' expression +static void * +_tmp_29_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ',' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_29[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + Token * _literal; + expr_ty z; + if ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (z = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ _tmp_29[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_29[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_30: ';' | NEWLINE +static void * +_tmp_30_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ';' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_30[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "';'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 13)) // token=';' + ) + { + D(fprintf(stderr, "%*c+ _tmp_30[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "';'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_30[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "';'")); + } + { // NEWLINE + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_30[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + Token * newline_var; + if ( + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + ) + { + D(fprintf(stderr, "%*c+ _tmp_30[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE")); + _res = newline_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_30[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_31: ('.' | '...') +static asdl_seq * +_loop0_31_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ('.' | '...') + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_31[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); + void *_tmp_139_var; + while ( + (_tmp_139_var = _tmp_139_rule(p)) // '.' | '...' + ) + { + _res = _tmp_139_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_31[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('.' | '...')")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_31_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_32: ('.' | '...') +static asdl_seq * +_loop1_32_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ('.' | '...') + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_32[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('.' | '...')")); + void *_tmp_140_var; + while ( + (_tmp_140_var = _tmp_140_rule(p)) // '.' | '...' + ) + { + _res = _tmp_140_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_32[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('.' | '...')")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_32_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_34: ',' import_from_as_name +static asdl_seq * +_loop0_34_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' import_from_as_name + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_34[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' import_from_as_name")); + Token * _literal; + alias_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = import_from_as_name_rule(p)) // import_from_as_name + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_34[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' import_from_as_name")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_34_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_33: import_from_as_name _loop0_34 +static asdl_seq * +_gather_33_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // import_from_as_name _loop0_34 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_33[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "import_from_as_name _loop0_34")); + alias_ty elem; + asdl_seq * seq; + if ( + (elem = import_from_as_name_rule(p)) // import_from_as_name + && + (seq = _loop0_34_rule(p)) // _loop0_34 + ) + { + D(fprintf(stderr, "%*c+ _gather_33[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "import_from_as_name _loop0_34")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_33[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "import_from_as_name _loop0_34")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_35: 'as' NAME +static void * +_tmp_35_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'as' NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_35[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + Token * _keyword; + expr_ty z; + if ( + (_keyword = _PyPegen_expect_token(p, 520)) // token='as' + && + (z = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ _tmp_35[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_35[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_37: ',' dotted_as_name +static asdl_seq * +_loop0_37_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' dotted_as_name + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_37[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' dotted_as_name")); + Token * _literal; + alias_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = dotted_as_name_rule(p)) // dotted_as_name + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_37[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' dotted_as_name")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_37_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_36: dotted_as_name _loop0_37 +static asdl_seq * +_gather_36_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // dotted_as_name _loop0_37 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_36[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dotted_as_name _loop0_37")); + alias_ty elem; + asdl_seq * seq; + if ( + (elem = dotted_as_name_rule(p)) // dotted_as_name + && + (seq = _loop0_37_rule(p)) // _loop0_37 + ) + { + D(fprintf(stderr, "%*c+ _gather_36[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dotted_as_name _loop0_37")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_36[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dotted_as_name _loop0_37")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_38: 'as' NAME +static void * +_tmp_38_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'as' NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_38[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + Token * _keyword; + expr_ty z; + if ( + (_keyword = _PyPegen_expect_token(p, 520)) // token='as' + && + (z = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ _tmp_38[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_38[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_40: ',' with_item +static asdl_seq * +_loop0_40_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' with_item + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_40[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); + Token * _literal; + withitem_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = with_item_rule(p)) // with_item + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_40[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_40_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_39: with_item _loop0_40 +static asdl_seq * +_gather_39_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // with_item _loop0_40 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_39[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_40")); + withitem_ty elem; + asdl_seq * seq; + if ( + (elem = with_item_rule(p)) // with_item + && + (seq = _loop0_40_rule(p)) // _loop0_40 + ) + { + D(fprintf(stderr, "%*c+ _gather_39[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_40")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_39[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_40")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_42: ',' with_item +static asdl_seq * +_loop0_42_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' with_item + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_42[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); + Token * _literal; + withitem_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = with_item_rule(p)) // with_item + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_42[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_42_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_41: with_item _loop0_42 +static asdl_seq * +_gather_41_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // with_item _loop0_42 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_41[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_42")); + withitem_ty elem; + asdl_seq * seq; + if ( + (elem = with_item_rule(p)) // with_item + && + (seq = _loop0_42_rule(p)) // _loop0_42 + ) + { + D(fprintf(stderr, "%*c+ _gather_41[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_42")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_41[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_42")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_44: ',' with_item +static asdl_seq * +_loop0_44_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' with_item + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_44[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); + Token * _literal; + withitem_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = with_item_rule(p)) // with_item + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_44[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_44_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_43: with_item _loop0_44 +static asdl_seq * +_gather_43_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // with_item _loop0_44 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_43[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_44")); + withitem_ty elem; + asdl_seq * seq; + if ( + (elem = with_item_rule(p)) // with_item + && + (seq = _loop0_44_rule(p)) // _loop0_44 + ) + { + D(fprintf(stderr, "%*c+ _gather_43[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_44")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_43[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_44")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_46: ',' with_item +static asdl_seq * +_loop0_46_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' with_item + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_46[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' with_item")); + Token * _literal; + withitem_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = with_item_rule(p)) // with_item + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_46[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_46_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_45: with_item _loop0_46 +static asdl_seq * +_gather_45_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // with_item _loop0_46 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_45[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "with_item _loop0_46")); + withitem_ty elem; + asdl_seq * seq; + if ( + (elem = with_item_rule(p)) // with_item + && + (seq = _loop0_46_rule(p)) // _loop0_46 + ) + { + D(fprintf(stderr, "%*c+ _gather_45[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "with_item _loop0_46")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_45[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "with_item _loop0_46")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_47: ',' | ')' | ':' +static void * +_tmp_47_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ',' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_47[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "','")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + ) + { + D(fprintf(stderr, "%*c+ _tmp_47[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "','")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_47[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "','")); + } + { // ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_47[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ _tmp_47[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_47[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); + } + { // ':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_47[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + ) + { + D(fprintf(stderr, "%*c+ _tmp_47[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_47[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop1_48: except_block +static asdl_seq * +_loop1_48_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // except_block + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_48[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "except_block")); + excepthandler_ty except_block_var; + while ( + (except_block_var = except_block_rule(p)) // except_block + ) + { + _res = except_block_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_48[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_block")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_48_type, _seq); + D(p->level--); + return _seq; +} + +// _tmp_49: 'as' NAME +static void * +_tmp_49_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'as' NAME + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_49[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + Token * _keyword; + expr_ty z; + if ( + (_keyword = _PyPegen_expect_token(p, 520)) // token='as' + && + (z = _PyPegen_name_token(p)) // NAME + ) + { + D(fprintf(stderr, "%*c+ _tmp_49[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'as' NAME")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_49[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'as' NAME")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_50: 'from' expression +static void * +_tmp_50_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'from' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_50[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'from' expression")); + Token * _keyword; + expr_ty z; + if ( + (_keyword = _PyPegen_expect_token(p, 514)) // token='from' + && + (z = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ _tmp_50[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'from' expression")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_50[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'from' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_51: '->' expression +static void * +_tmp_51_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '->' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_51[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); + Token * _literal; + expr_ty z; + if ( + (_literal = _PyPegen_expect_token(p, 51)) // token='->' + && + (z = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ _tmp_51[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_51[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'->' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_52: '->' expression +static void * +_tmp_52_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '->' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_52[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'->' expression")); + Token * _literal; + expr_ty z; + if ( + (_literal = _PyPegen_expect_token(p, 51)) // token='->' + && + (z = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ _tmp_52[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'->' expression")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_52[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'->' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_53: NEWLINE INDENT +static void * +_tmp_53_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // NEWLINE INDENT + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_53[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT")); + Token * indent_var; + Token * newline_var; + if ( + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + && + (indent_var = _PyPegen_expect_token(p, INDENT)) // token='INDENT' + ) + { + D(fprintf(stderr, "%*c+ _tmp_53[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "NEWLINE INDENT")); + _res = _PyPegen_dummy_name(p, newline_var, indent_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_53[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE INDENT")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_54: param_no_default +static asdl_seq * +_loop0_54_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_54[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + arg_ty param_no_default_var; + while ( + (param_no_default_var = param_no_default_rule(p)) // param_no_default + ) + { + _res = param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_54[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_54_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_55: param_with_default +static asdl_seq * +_loop0_55_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_55[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + NameDefaultPair* param_with_default_var; + while ( + (param_with_default_var = param_with_default_rule(p)) // param_with_default + ) + { + _res = param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_55[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_55_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_56: param_with_default +static asdl_seq * +_loop0_56_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_56[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + NameDefaultPair* param_with_default_var; + while ( + (param_with_default_var = param_with_default_rule(p)) // param_with_default + ) + { + _res = param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_56[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_56_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_57: param_no_default +static asdl_seq * +_loop1_57_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_57[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + arg_ty param_no_default_var; + while ( + (param_no_default_var = param_no_default_rule(p)) // param_no_default + ) + { + _res = param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_57[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_57_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_58: param_with_default +static asdl_seq * +_loop0_58_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_58[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + NameDefaultPair* param_with_default_var; + while ( + (param_with_default_var = param_with_default_rule(p)) // param_with_default + ) + { + _res = param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_58[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_58_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_59: param_with_default +static asdl_seq * +_loop1_59_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_59[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + NameDefaultPair* param_with_default_var; + while ( + (param_with_default_var = param_with_default_rule(p)) // param_with_default + ) + { + _res = param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_59[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_59_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_60: param_no_default +static asdl_seq * +_loop1_60_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_60[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + arg_ty param_no_default_var; + while ( + (param_no_default_var = param_no_default_rule(p)) // param_no_default + ) + { + _res = param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_60[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_60_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_61: param_no_default +static asdl_seq * +_loop1_61_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_61[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + arg_ty param_no_default_var; + while ( + (param_no_default_var = param_no_default_rule(p)) // param_no_default + ) + { + _res = param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_61[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_61_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_62: param_no_default +static asdl_seq * +_loop0_62_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_62[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + arg_ty param_no_default_var; + while ( + (param_no_default_var = param_no_default_rule(p)) // param_no_default + ) + { + _res = param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_62[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_62_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_63: param_with_default +static asdl_seq * +_loop1_63_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_63[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + NameDefaultPair* param_with_default_var; + while ( + (param_with_default_var = param_with_default_rule(p)) // param_with_default + ) + { + _res = param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_63[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_63_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_64: param_no_default +static asdl_seq * +_loop0_64_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_64[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + arg_ty param_no_default_var; + while ( + (param_no_default_var = param_no_default_rule(p)) // param_no_default + ) + { + _res = param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_64[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_64_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_65: param_with_default +static asdl_seq * +_loop1_65_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_65[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + NameDefaultPair* param_with_default_var; + while ( + (param_with_default_var = param_with_default_rule(p)) // param_with_default + ) + { + _res = param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_65[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_65_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_66: param_maybe_default +static asdl_seq * +_loop0_66_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_maybe_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_66[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + NameDefaultPair* param_maybe_default_var; + while ( + (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default + ) + { + _res = param_maybe_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_66[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_66_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_67: param_maybe_default +static asdl_seq * +_loop1_67_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_maybe_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_67[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_maybe_default")); + NameDefaultPair* param_maybe_default_var; + while ( + (param_maybe_default_var = param_maybe_default_rule(p)) // param_maybe_default + ) + { + _res = param_maybe_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_67[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_67_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_68: ('@' named_expression NEWLINE) +static asdl_seq * +_loop1_68_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ('@' named_expression NEWLINE) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_68[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('@' named_expression NEWLINE)")); + void *_tmp_141_var; + while ( + (_tmp_141_var = _tmp_141_rule(p)) // '@' named_expression NEWLINE + ) + { + _res = _tmp_141_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_68[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('@' named_expression NEWLINE)")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_68_type, _seq); + D(p->level--); + return _seq; +} + +// _tmp_69: '(' arguments? ')' +static void * +_tmp_69_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '(' arguments? ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_69[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + Token * _literal; + Token * _literal_1; + void *z; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + && + (z = arguments_rule(p), 1) // arguments? + && + (_literal_1 = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ _tmp_69[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'(' arguments? ')'")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_69[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'(' arguments? ')'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop1_70: (',' star_expression) +static asdl_seq * +_loop1_70_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // (',' star_expression) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_70[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_expression)")); + void *_tmp_142_var; + while ( + (_tmp_142_var = _tmp_142_rule(p)) // ',' star_expression + ) + { + _res = _tmp_142_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_70[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_expression)")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_70_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_72: ',' star_named_expression +static asdl_seq * +_loop0_72_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' star_named_expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_72[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_named_expression")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = star_named_expression_rule(p)) // star_named_expression + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_72[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_named_expression")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_72_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_71: star_named_expression _loop0_72 +static asdl_seq * +_gather_71_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // star_named_expression _loop0_72 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_71[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_72")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = star_named_expression_rule(p)) // star_named_expression + && + (seq = _loop0_72_rule(p)) // _loop0_72 + ) + { + D(fprintf(stderr, "%*c+ _gather_71[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression _loop0_72")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_71[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression _loop0_72")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop1_73: (',' expression) +static asdl_seq * +_loop1_73_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // (',' expression) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_73[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' expression)")); + void *_tmp_143_var; + while ( + (_tmp_143_var = _tmp_143_rule(p)) // ',' expression + ) + { + _res = _tmp_143_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_73[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' expression)")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_73_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_74: lambda_param_no_default +static asdl_seq * +_loop0_74_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_74[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; + while ( + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + ) + { + _res = lambda_param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_74[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_74_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_75: lambda_param_with_default +static asdl_seq * +_loop0_75_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_75[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; + while ( + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default + ) + { + _res = lambda_param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_75[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_75_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_76: lambda_param_with_default +static asdl_seq * +_loop0_76_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_76[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; + while ( + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default + ) + { + _res = lambda_param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_76[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_76_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_77: lambda_param_no_default +static asdl_seq * +_loop1_77_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_77[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; + while ( + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + ) + { + _res = lambda_param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_77[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_77_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_78: lambda_param_with_default +static asdl_seq * +_loop0_78_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_78[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; + while ( + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default + ) + { + _res = lambda_param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_78[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_78_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_79: lambda_param_with_default +static asdl_seq * +_loop1_79_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_79[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; + while ( + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default + ) + { + _res = lambda_param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_79[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_79_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_80: lambda_param_no_default +static asdl_seq * +_loop1_80_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_80[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; + while ( + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + ) + { + _res = lambda_param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_80[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_80_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_81: lambda_param_no_default +static asdl_seq * +_loop1_81_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_81[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; + while ( + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + ) + { + _res = lambda_param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_81[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_81_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_82: lambda_param_no_default +static asdl_seq * +_loop0_82_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_82[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; + while ( + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + ) + { + _res = lambda_param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_82[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_82_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_83: lambda_param_with_default +static asdl_seq * +_loop1_83_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_83[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; + while ( + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default + ) + { + _res = lambda_param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_83[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_83_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_84: lambda_param_no_default +static asdl_seq * +_loop0_84_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_84[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; + while ( + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + ) + { + _res = lambda_param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_84[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_84_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_85: lambda_param_with_default +static asdl_seq * +_loop1_85_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_85[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; + while ( + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default + ) + { + _res = lambda_param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_85[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_85_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_86: lambda_param_maybe_default +static asdl_seq * +_loop0_86_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_maybe_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_86[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + NameDefaultPair* lambda_param_maybe_default_var; + while ( + (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default + ) + { + _res = lambda_param_maybe_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_86[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_86_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_87: lambda_param_maybe_default +static asdl_seq * +_loop1_87_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_maybe_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_87[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_maybe_default")); + NameDefaultPair* lambda_param_maybe_default_var; + while ( + (lambda_param_maybe_default_var = lambda_param_maybe_default_rule(p)) // lambda_param_maybe_default + ) + { + _res = lambda_param_maybe_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_87[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_87_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_88: ('or' conjunction) +static asdl_seq * +_loop1_88_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ('or' conjunction) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_88[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('or' conjunction)")); + void *_tmp_144_var; + while ( + (_tmp_144_var = _tmp_144_rule(p)) // 'or' conjunction + ) + { + _res = _tmp_144_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_88[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('or' conjunction)")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_88_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_89: ('and' inversion) +static asdl_seq * +_loop1_89_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ('and' inversion) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_89[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('and' inversion)")); + void *_tmp_145_var; + while ( + (_tmp_145_var = _tmp_145_rule(p)) // 'and' inversion + ) + { + _res = _tmp_145_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_89[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('and' inversion)")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_89_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_90: compare_op_bitwise_or_pair +static asdl_seq * +_loop1_90_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // compare_op_bitwise_or_pair + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_90[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "compare_op_bitwise_or_pair")); + CmpopExprPair* compare_op_bitwise_or_pair_var; + while ( + (compare_op_bitwise_or_pair_var = compare_op_bitwise_or_pair_rule(p)) // compare_op_bitwise_or_pair + ) + { + _res = compare_op_bitwise_or_pair_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_90[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "compare_op_bitwise_or_pair")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_90_type, _seq); + D(p->level--); + return _seq; +} + +// _tmp_91: '!=' +static void * +_tmp_91_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '!=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_91[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'!='")); + Token * tok; + if ( + (tok = _PyPegen_expect_token(p, 28)) // token='!=' + ) + { + D(fprintf(stderr, "%*c+ _tmp_91[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'!='")); + _res = _PyPegen_check_barry_as_flufl ( p , tok ) ? NULL : tok; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_91[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'!='")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_93: ',' slice +static asdl_seq * +_loop0_93_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' slice + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_93[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' slice")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = slice_rule(p)) // slice + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_93[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' slice")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_93_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_92: slice _loop0_93 +static asdl_seq * +_gather_92_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // slice _loop0_93 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_92[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slice _loop0_93")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = slice_rule(p)) // slice + && + (seq = _loop0_93_rule(p)) // _loop0_93 + ) + { + D(fprintf(stderr, "%*c+ _gather_92[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slice _loop0_93")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_92[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slice _loop0_93")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_94: ':' expression? +static void * +_tmp_94_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ':' expression? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_94[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':' expression?")); + Token * _literal; + void *d; + if ( + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + && + (d = expression_rule(p), 1) // expression? + ) + { + D(fprintf(stderr, "%*c+ _tmp_94[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':' expression?")); + _res = d; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_94[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':' expression?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_95: tuple | group | genexp +static void * +_tmp_95_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // tuple + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "tuple")); + expr_ty tuple_var; + if ( + (tuple_var = tuple_rule(p)) // tuple + ) + { + D(fprintf(stderr, "%*c+ _tmp_95[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "tuple")); + _res = tuple_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_95[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tuple")); + } + { // group + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "group")); + expr_ty group_var; + if ( + (group_var = group_rule(p)) // group + ) + { + D(fprintf(stderr, "%*c+ _tmp_95[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "group")); + _res = group_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_95[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "group")); + } + { // genexp + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_95[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "genexp")); + expr_ty genexp_var; + if ( + (genexp_var = genexp_rule(p)) // genexp + ) + { + D(fprintf(stderr, "%*c+ _tmp_95[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "genexp")); + _res = genexp_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_95[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "genexp")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_96: list | listcomp +static void * +_tmp_96_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // list + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "list")); + expr_ty list_var; + if ( + (list_var = list_rule(p)) // list + ) + { + D(fprintf(stderr, "%*c+ _tmp_96[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "list")); + _res = list_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_96[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "list")); + } + { // listcomp + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_96[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "listcomp")); + expr_ty listcomp_var; + if ( + (listcomp_var = listcomp_rule(p)) // listcomp + ) + { + D(fprintf(stderr, "%*c+ _tmp_96[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "listcomp")); + _res = listcomp_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_96[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "listcomp")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_97: dict | set | dictcomp | setcomp +static void * +_tmp_97_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // dict + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dict")); + expr_ty dict_var; + if ( + (dict_var = dict_rule(p)) // dict + ) + { + D(fprintf(stderr, "%*c+ _tmp_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dict")); + _res = dict_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_97[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dict")); + } + { // set + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "set")); + expr_ty set_var; + if ( + (set_var = set_rule(p)) // set + ) + { + D(fprintf(stderr, "%*c+ _tmp_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "set")); + _res = set_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_97[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "set")); + } + { // dictcomp + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "dictcomp")); + expr_ty dictcomp_var; + if ( + (dictcomp_var = dictcomp_rule(p)) // dictcomp + ) + { + D(fprintf(stderr, "%*c+ _tmp_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "dictcomp")); + _res = dictcomp_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_97[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "dictcomp")); + } + { // setcomp + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_97[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "setcomp")); + expr_ty setcomp_var; + if ( + (setcomp_var = setcomp_rule(p)) // setcomp + ) + { + D(fprintf(stderr, "%*c+ _tmp_97[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "setcomp")); + _res = setcomp_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_97[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "setcomp")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop1_98: STRING +static asdl_seq * +_loop1_98_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // STRING + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_98[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "STRING")); + expr_ty string_var; + while ( + (string_var = _PyPegen_string_token(p)) // STRING + ) + { + _res = string_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_98[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "STRING")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_98_type, _seq); + D(p->level--); + return _seq; +} + +// _tmp_99: star_named_expression ',' star_named_expressions? +static void * +_tmp_99_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // star_named_expression ',' star_named_expressions? + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_99[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?")); + Token * _literal; + expr_ty y; + void *z; + if ( + (y = star_named_expression_rule(p)) // star_named_expression + && + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (z = star_named_expressions_rule(p), 1) // star_named_expressions? + ) + { + D(fprintf(stderr, "%*c+ _tmp_99[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_named_expression ',' star_named_expressions?")); + _res = _PyPegen_seq_insert_in_front ( p , y , z ); + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_99[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expression ',' star_named_expressions?")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_100: yield_expr | named_expression +static void * +_tmp_100_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_100[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_100[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_100[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // named_expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_100[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression")); + expr_ty named_expression_var; + if ( + (named_expression_var = named_expression_rule(p)) // named_expression + ) + { + D(fprintf(stderr, "%*c+ _tmp_100[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression")); + _res = named_expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_100[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "named_expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_102: ',' double_starred_kvpair +static asdl_seq * +_loop0_102_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' double_starred_kvpair + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_102[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' double_starred_kvpair")); + Token * _literal; + KeyValuePair* elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = double_starred_kvpair_rule(p)) // double_starred_kvpair + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_102[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' double_starred_kvpair")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_102_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_101: double_starred_kvpair _loop0_102 +static asdl_seq * +_gather_101_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // double_starred_kvpair _loop0_102 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_101[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_102")); + KeyValuePair* elem; + asdl_seq * seq; + if ( + (elem = double_starred_kvpair_rule(p)) // double_starred_kvpair + && + (seq = _loop0_102_rule(p)) // _loop0_102 + ) + { + D(fprintf(stderr, "%*c+ _gather_101[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "double_starred_kvpair _loop0_102")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_101[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "double_starred_kvpair _loop0_102")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop1_103: for_if_clause +static asdl_seq * +_loop1_103_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // for_if_clause + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_103[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "for_if_clause")); + comprehension_ty for_if_clause_var; + while ( + (for_if_clause_var = for_if_clause_rule(p)) // for_if_clause + ) + { + _res = for_if_clause_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_103[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "for_if_clause")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_103_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_104: ('if' disjunction) +static asdl_seq * +_loop0_104_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ('if' disjunction) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_104[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); + void *_tmp_146_var; + while ( + (_tmp_146_var = _tmp_146_rule(p)) // 'if' disjunction + ) + { + _res = _tmp_146_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_104[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('if' disjunction)")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_104_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_105: ('if' disjunction) +static asdl_seq * +_loop0_105_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ('if' disjunction) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_105[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "('if' disjunction)")); + void *_tmp_147_var; + while ( + (_tmp_147_var = _tmp_147_rule(p)) // 'if' disjunction + ) + { + _res = _tmp_147_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_105[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('if' disjunction)")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_105_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_107: ',' (starred_expression | named_expression !'=') +static asdl_seq * +_loop0_107_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' (starred_expression | named_expression !'=') + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_107[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (starred_expression | named_expression !'=')")); + Token * _literal; + void *elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = _tmp_148_rule(p)) // starred_expression | named_expression !'=' + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_107[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (starred_expression | named_expression !'=')")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_107_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_106: (starred_expression | named_expression !'=') _loop0_107 +static asdl_seq * +_gather_106_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // (starred_expression | named_expression !'=') _loop0_107 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_106[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(starred_expression | named_expression !'=') _loop0_107")); + void *elem; + asdl_seq * seq; + if ( + (elem = _tmp_148_rule(p)) // starred_expression | named_expression !'=' + && + (seq = _loop0_107_rule(p)) // _loop0_107 + ) + { + D(fprintf(stderr, "%*c+ _gather_106[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "(starred_expression | named_expression !'=') _loop0_107")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_106[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(starred_expression | named_expression !'=') _loop0_107")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_108: ',' kwargs +static void * +_tmp_108_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ',' kwargs + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_108[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwargs")); + Token * _literal; + asdl_seq* k; + if ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (k = kwargs_rule(p)) // kwargs + ) + { + D(fprintf(stderr, "%*c+ _tmp_108[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' kwargs")); + _res = k; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_108[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwargs")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_110: ',' kwarg_or_starred +static asdl_seq * +_loop0_110_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' kwarg_or_starred + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_110[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_starred")); + Token * _literal; + KeywordOrStarred* elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = kwarg_or_starred_rule(p)) // kwarg_or_starred + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_110[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_starred")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_110_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_109: kwarg_or_starred _loop0_110 +static asdl_seq * +_gather_109_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // kwarg_or_starred _loop0_110 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_109[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_110")); + KeywordOrStarred* elem; + asdl_seq * seq; + if ( + (elem = kwarg_or_starred_rule(p)) // kwarg_or_starred + && + (seq = _loop0_110_rule(p)) // _loop0_110 + ) + { + D(fprintf(stderr, "%*c+ _gather_109[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_110")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_109[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_starred _loop0_110")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_112: ',' kwarg_or_double_starred +static asdl_seq * +_loop0_112_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' kwarg_or_double_starred + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_112[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_double_starred")); + Token * _literal; + KeywordOrStarred* elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_112[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_double_starred")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_112_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_111: kwarg_or_double_starred _loop0_112 +static asdl_seq * +_gather_111_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // kwarg_or_double_starred _loop0_112 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_111[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_112")); + KeywordOrStarred* elem; + asdl_seq * seq; + if ( + (elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred + && + (seq = _loop0_112_rule(p)) // _loop0_112 + ) + { + D(fprintf(stderr, "%*c+ _gather_111[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_112")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_111[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_double_starred _loop0_112")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_114: ',' kwarg_or_starred +static asdl_seq * +_loop0_114_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' kwarg_or_starred + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_114[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_starred")); + Token * _literal; + KeywordOrStarred* elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = kwarg_or_starred_rule(p)) // kwarg_or_starred + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_114[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_starred")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_114_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_113: kwarg_or_starred _loop0_114 +static asdl_seq * +_gather_113_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // kwarg_or_starred _loop0_114 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_113[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_114")); + KeywordOrStarred* elem; + asdl_seq * seq; + if ( + (elem = kwarg_or_starred_rule(p)) // kwarg_or_starred + && + (seq = _loop0_114_rule(p)) // _loop0_114 + ) + { + D(fprintf(stderr, "%*c+ _gather_113[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_starred _loop0_114")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_113[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_starred _loop0_114")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_116: ',' kwarg_or_double_starred +static asdl_seq * +_loop0_116_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' kwarg_or_double_starred + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_116[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' kwarg_or_double_starred")); + Token * _literal; + KeywordOrStarred* elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_116[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_double_starred")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_116_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_115: kwarg_or_double_starred _loop0_116 +static asdl_seq * +_gather_115_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // kwarg_or_double_starred _loop0_116 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_115[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_116")); + KeywordOrStarred* elem; + asdl_seq * seq; + if ( + (elem = kwarg_or_double_starred_rule(p)) // kwarg_or_double_starred + && + (seq = _loop0_116_rule(p)) // _loop0_116 + ) + { + D(fprintf(stderr, "%*c+ _gather_115[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "kwarg_or_double_starred _loop0_116")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_115[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "kwarg_or_double_starred _loop0_116")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_117: (',' star_target) +static asdl_seq * +_loop0_117_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // (',' star_target) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_117[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); + void *_tmp_149_var; + while ( + (_tmp_149_var = _tmp_149_rule(p)) // ',' star_target + ) + { + _res = _tmp_149_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_117[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_target)")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_117_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_119: ',' star_target +static asdl_seq * +_loop0_119_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' star_target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_119[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = star_target_rule(p)) // star_target + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_119[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_119_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_118: star_target _loop0_119 +static asdl_seq * +_gather_118_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // star_target _loop0_119 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_118[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_target _loop0_119")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = star_target_rule(p)) // star_target + && + (seq = _loop0_119_rule(p)) // _loop0_119 + ) + { + D(fprintf(stderr, "%*c+ _gather_118[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_target _loop0_119")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_118[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_target _loop0_119")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop1_120: (',' star_target) +static asdl_seq * +_loop1_120_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // (',' star_target) + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_120[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(',' star_target)")); + void *_tmp_150_var; + while ( + (_tmp_150_var = _tmp_150_rule(p)) // ',' star_target + ) + { + _res = _tmp_150_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_120[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_target)")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_120_type, _seq); + D(p->level--); + return _seq; +} + +// _tmp_121: !'*' star_target +static void * +_tmp_121_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // !'*' star_target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_121[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); + expr_ty star_target_var; + if ( + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 16) // token='*' + && + (star_target_var = star_target_rule(p)) // star_target + ) + { + D(fprintf(stderr, "%*c+ _tmp_121[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "!'*' star_target")); + _res = star_target_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_121[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "!'*' star_target")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_123: ',' del_target +static asdl_seq * +_loop0_123_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' del_target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_123[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' del_target")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = del_target_rule(p)) // del_target + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_123[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' del_target")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_123_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_122: del_target _loop0_123 +static asdl_seq * +_gather_122_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // del_target _loop0_123 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_122[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "del_target _loop0_123")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = del_target_rule(p)) // del_target + && + (seq = _loop0_123_rule(p)) // _loop0_123 + ) + { + D(fprintf(stderr, "%*c+ _gather_122[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "del_target _loop0_123")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_122[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "del_target _loop0_123")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_125: ',' target +static asdl_seq * +_loop0_125_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // ',' target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_125[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' target")); + Token * _literal; + expr_ty elem; + while ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (elem = target_rule(p)) // target + ) + { + _res = elem; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + PyMem_Free(_children); + D(p->level--); + return NULL; + } + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_125[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' target")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_125_type, _seq); + D(p->level--); + return _seq; +} + +// _gather_124: target _loop0_125 +static asdl_seq * +_gather_124_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + asdl_seq * _res = NULL; + int _mark = p->mark; + { // target _loop0_125 + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _gather_124[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "target _loop0_125")); + expr_ty elem; + asdl_seq * seq; + if ( + (elem = target_rule(p)) // target + && + (seq = _loop0_125_rule(p)) // _loop0_125 + ) + { + D(fprintf(stderr, "%*c+ _gather_124[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "target _loop0_125")); + _res = _PyPegen_seq_insert_in_front(p, elem, seq); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _gather_124[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "target _loop0_125")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_126: args | expression for_if_clauses +static void * +_tmp_126_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // args + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_126[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "args")); + expr_ty args_var; + if ( + (args_var = args_rule(p)) // args + ) + { + D(fprintf(stderr, "%*c+ _tmp_126[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "args")); + _res = args_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_126[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "args")); + } + { // expression for_if_clauses + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_126[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); + expr_ty expression_var; + asdl_seq* for_if_clauses_var; + if ( + (expression_var = expression_rule(p)) // expression + && + (for_if_clauses_var = for_if_clauses_rule(p)) // for_if_clauses + ) + { + D(fprintf(stderr, "%*c+ _tmp_126[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "expression for_if_clauses")); + _res = _PyPegen_dummy_name(p, expression_var, for_if_clauses_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_126[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "expression for_if_clauses")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_127: star_named_expressions +static asdl_seq * +_loop0_127_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // star_named_expressions + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_127[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_named_expressions")); + asdl_seq* star_named_expressions_var; + while ( + (star_named_expressions_var = star_named_expressions_rule(p)) // star_named_expressions + ) + { + _res = star_named_expressions_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_127[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expressions")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_127_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_128: (star_targets '=') +static asdl_seq * +_loop0_128_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // (star_targets '=') + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_128[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); + void *_tmp_151_var; + while ( + (_tmp_151_var = _tmp_151_rule(p)) // star_targets '=' + ) + { + _res = _tmp_151_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_128[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_128_type, _seq); + D(p->level--); + return _seq; +} + +// _loop0_129: (star_targets '=') +static asdl_seq * +_loop0_129_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // (star_targets '=') + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_129[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "(star_targets '=')")); + void *_tmp_152_var; + while ( + (_tmp_152_var = _tmp_152_rule(p)) // star_targets '=' + ) + { + _res = _tmp_152_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_129[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_129_type, _seq); + D(p->level--); + return _seq; +} + +// _tmp_130: yield_expr | star_expressions +static void * +_tmp_130_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // yield_expr + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_130[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "yield_expr")); + expr_ty yield_expr_var; + if ( + (yield_expr_var = yield_expr_rule(p)) // yield_expr + ) + { + D(fprintf(stderr, "%*c+ _tmp_130[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "yield_expr")); + _res = yield_expr_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_130[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "yield_expr")); + } + { // star_expressions + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_130[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_expressions")); + expr_ty star_expressions_var; + if ( + (star_expressions_var = star_expressions_rule(p)) // star_expressions + ) + { + D(fprintf(stderr, "%*c+ _tmp_130[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_expressions")); + _res = star_expressions_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_130[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_expressions")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_131: '[' | '(' | '{' +static void * +_tmp_131_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '[' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'['")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 9)) // token='[' + ) + { + D(fprintf(stderr, "%*c+ _tmp_131[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'['")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_131[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'['")); + } + { // '(' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'('")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 7)) // token='(' + ) + { + D(fprintf(stderr, "%*c+ _tmp_131[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'('")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_131[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'('")); + } + { // '{' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_131[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'{'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 25)) // token='{' + ) + { + D(fprintf(stderr, "%*c+ _tmp_131[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'{'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_131[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'{'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_132: param_no_default +static asdl_seq * +_loop0_132_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_132[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_no_default")); + arg_ty param_no_default_var; + while ( + (param_no_default_var = param_no_default_rule(p)) // param_no_default + ) + { + _res = param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_132[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_132_type, _seq); + D(p->level--); + return _seq; +} + +// _tmp_133: slash_with_default | param_with_default+ +static void * +_tmp_133_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // slash_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_133[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + SlashWithDefault* slash_with_default_var; + if ( + (slash_with_default_var = slash_with_default_rule(p)) // slash_with_default + ) + { + D(fprintf(stderr, "%*c+ _tmp_133[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "slash_with_default")); + _res = slash_with_default_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_133[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "slash_with_default")); + } + { // param_with_default+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_133[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default+")); + asdl_seq * _loop1_153_var; + if ( + (_loop1_153_var = _loop1_153_rule(p)) // param_with_default+ + ) + { + D(fprintf(stderr, "%*c+ _tmp_133[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "param_with_default+")); + _res = _loop1_153_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_133[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop0_134: lambda_param_no_default +static asdl_seq * +_loop0_134_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_no_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop0_134[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_no_default")); + arg_ty lambda_param_no_default_var; + while ( + (lambda_param_no_default_var = lambda_param_no_default_rule(p)) // lambda_param_no_default + ) + { + _res = lambda_param_no_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop0_134[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop0_134_type, _seq); + D(p->level--); + return _seq; +} + +// _tmp_135: lambda_slash_with_default | lambda_param_with_default+ +static void * +_tmp_135_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // lambda_slash_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_135[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + SlashWithDefault* lambda_slash_with_default_var; + if ( + (lambda_slash_with_default_var = lambda_slash_with_default_rule(p)) // lambda_slash_with_default + ) + { + D(fprintf(stderr, "%*c+ _tmp_135[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_slash_with_default")); + _res = lambda_slash_with_default_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_135[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_slash_with_default")); + } + { // lambda_param_with_default+ + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_135[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+")); + asdl_seq * _loop1_154_var; + if ( + (_loop1_154_var = _loop1_154_rule(p)) // lambda_param_with_default+ + ) + { + D(fprintf(stderr, "%*c+ _tmp_135[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default+")); + _res = _loop1_154_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_135[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default+")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_136: ')' | ',' (')' | '**') +static void * +_tmp_136_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ _tmp_136[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_136[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); + } + { // ',' (')' | '**') + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_136[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); + Token * _literal; + void *_tmp_155_var; + if ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (_tmp_155_var = _tmp_155_rule(p)) // ')' | '**' + ) + { + D(fprintf(stderr, "%*c+ _tmp_136[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (')' | '**')")); + _res = _PyPegen_dummy_name(p, _literal, _tmp_155_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_136[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (')' | '**')")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_137: ':' | ',' (':' | '**') +static void * +_tmp_137_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + ) + { + D(fprintf(stderr, "%*c+ _tmp_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_137[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); + } + { // ',' (':' | '**') + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_137[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); + Token * _literal; + void *_tmp_156_var; + if ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (_tmp_156_var = _tmp_156_rule(p)) // ':' | '**' + ) + { + D(fprintf(stderr, "%*c+ _tmp_137[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' (':' | '**')")); + _res = _PyPegen_dummy_name(p, _literal, _tmp_156_var); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_137[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (':' | '**')")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_138: star_targets '=' +static void * +_tmp_138_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // star_targets '=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_138[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + Token * _literal; + expr_ty z; + if ( + (z = star_targets_rule(p)) // star_targets + && + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + ) + { + D(fprintf(stderr, "%*c+ _tmp_138[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_138[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_139: '.' | '...' +static void * +_tmp_139_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '.' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + ) + { + D(fprintf(stderr, "%*c+ _tmp_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_139[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); + } + { // '...' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_139[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 52)) // token='...' + ) + { + D(fprintf(stderr, "%*c+ _tmp_139[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_139[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_140: '.' | '...' +static void * +_tmp_140_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '.' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'.'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 23)) // token='.' + ) + { + D(fprintf(stderr, "%*c+ _tmp_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'.'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_140[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'.'")); + } + { // '...' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_140[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'...'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 52)) // token='...' + ) + { + D(fprintf(stderr, "%*c+ _tmp_140[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'...'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_140[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'...'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_141: '@' named_expression NEWLINE +static void * +_tmp_141_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // '@' named_expression NEWLINE + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_141[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + Token * _literal; + expr_ty f; + Token * newline_var; + if ( + (_literal = _PyPegen_expect_token(p, 49)) // token='@' + && + (f = named_expression_rule(p)) // named_expression + && + (newline_var = _PyPegen_expect_token(p, NEWLINE)) // token='NEWLINE' + ) + { + D(fprintf(stderr, "%*c+ _tmp_141[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'@' named_expression NEWLINE")); + _res = f; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_141[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'@' named_expression NEWLINE")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_142: ',' star_expression +static void * +_tmp_142_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ',' star_expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_142[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + Token * _literal; + expr_ty c; + if ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (c = star_expression_rule(p)) // star_expression + ) + { + D(fprintf(stderr, "%*c+ _tmp_142[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_expression")); + _res = c; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_142[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_143: ',' expression +static void * +_tmp_143_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ',' expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_143[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' expression")); + Token * _literal; + expr_ty c; + if ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (c = expression_rule(p)) // expression + ) + { + D(fprintf(stderr, "%*c+ _tmp_143[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' expression")); + _res = c; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_143[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_144: 'or' conjunction +static void * +_tmp_144_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'or' conjunction + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_144[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + Token * _keyword; + expr_ty c; + if ( + (_keyword = _PyPegen_expect_token(p, 532)) // token='or' + && + (c = conjunction_rule(p)) // conjunction + ) + { + D(fprintf(stderr, "%*c+ _tmp_144[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'or' conjunction")); + _res = c; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_144[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'or' conjunction")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_145: 'and' inversion +static void * +_tmp_145_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'and' inversion + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_145[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + Token * _keyword; + expr_ty c; + if ( + (_keyword = _PyPegen_expect_token(p, 533)) // token='and' + && + (c = inversion_rule(p)) // inversion + ) + { + D(fprintf(stderr, "%*c+ _tmp_145[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'and' inversion")); + _res = c; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_145[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'and' inversion")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_146: 'if' disjunction +static void * +_tmp_146_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'if' disjunction + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_146[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + Token * _keyword; + expr_ty z; + if ( + (_keyword = _PyPegen_expect_token(p, 510)) // token='if' + && + (z = disjunction_rule(p)) // disjunction + ) + { + D(fprintf(stderr, "%*c+ _tmp_146[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_146[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_147: 'if' disjunction +static void * +_tmp_147_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // 'if' disjunction + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_147[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + Token * _keyword; + expr_ty z; + if ( + (_keyword = _PyPegen_expect_token(p, 510)) // token='if' + && + (z = disjunction_rule(p)) // disjunction + ) + { + D(fprintf(stderr, "%*c+ _tmp_147[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'if' disjunction")); + _res = z; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_147[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'if' disjunction")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_148: starred_expression | named_expression !'=' +static void * +_tmp_148_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // starred_expression + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "starred_expression")); + expr_ty starred_expression_var; + if ( + (starred_expression_var = starred_expression_rule(p)) // starred_expression + ) + { + D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "starred_expression")); + _res = starred_expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "starred_expression")); + } + { // named_expression !'=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_148[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); + expr_ty named_expression_var; + if ( + (named_expression_var = named_expression_rule(p)) // named_expression + && + _PyPegen_lookahead_with_int(0, _PyPegen_expect_token, p, 22) // token='=' + ) + { + D(fprintf(stderr, "%*c+ _tmp_148[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "named_expression !'='")); + _res = named_expression_var; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_148[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "named_expression !'='")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_149: ',' star_target +static void * +_tmp_149_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ',' star_target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_149[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + Token * _literal; + expr_ty c; + if ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (c = star_target_rule(p)) // star_target + ) + { + D(fprintf(stderr, "%*c+ _tmp_149[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); + _res = c; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_149[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_150: ',' star_target +static void * +_tmp_150_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ',' star_target + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_150[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "',' star_target")); + Token * _literal; + expr_ty c; + if ( + (_literal = _PyPegen_expect_token(p, 12)) // token=',' + && + (c = star_target_rule(p)) // star_target + ) + { + D(fprintf(stderr, "%*c+ _tmp_150[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "',' star_target")); + _res = c; + if (_res == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + D(p->level--); + return NULL; + } + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_150[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_target")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_151: star_targets '=' +static void * +_tmp_151_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // star_targets '=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_151[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + Token * _literal; + expr_ty star_targets_var; + if ( + (star_targets_var = star_targets_rule(p)) // star_targets + && + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + ) + { + D(fprintf(stderr, "%*c+ _tmp_151[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + _res = _PyPegen_dummy_name(p, star_targets_var, _literal); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_151[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_152: star_targets '=' +static void * +_tmp_152_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // star_targets '=' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_152[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + Token * _literal; + expr_ty star_targets_var; + if ( + (star_targets_var = star_targets_rule(p)) // star_targets + && + (_literal = _PyPegen_expect_token(p, 22)) // token='=' + ) + { + D(fprintf(stderr, "%*c+ _tmp_152[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "star_targets '='")); + _res = _PyPegen_dummy_name(p, star_targets_var, _literal); + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_152[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_targets '='")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _loop1_153: param_with_default +static asdl_seq * +_loop1_153_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_153[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "param_with_default")); + NameDefaultPair* param_with_default_var; + while ( + (param_with_default_var = param_with_default_rule(p)) // param_with_default + ) + { + _res = param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_153[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_153_type, _seq); + D(p->level--); + return _seq; +} + +// _loop1_154: lambda_param_with_default +static asdl_seq * +_loop1_154_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void *_res = NULL; + int _mark = p->mark; + int _start_mark = p->mark; + void **_children = PyMem_Malloc(sizeof(void *)); + if (!_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + ssize_t _children_capacity = 1; + ssize_t _n = 0; + { // lambda_param_with_default + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _loop1_154[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "lambda_param_with_default")); + NameDefaultPair* lambda_param_with_default_var; + while ( + (lambda_param_with_default_var = lambda_param_with_default_rule(p)) // lambda_param_with_default + ) + { + _res = lambda_param_with_default_var; + if (_n == _children_capacity) { + _children_capacity *= 2; + void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *)); + if (!_new_children) { + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + _children = _new_children; + } + _children[_n++] = _res; + _mark = p->mark; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _loop1_154[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + } + if (_n == 0 || p->error_indicator) { + PyMem_Free(_children); + D(p->level--); + return NULL; + } + asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena); + if (!_seq) { + PyMem_Free(_children); + p->error_indicator = 1; + PyErr_NoMemory(); + D(p->level--); + return NULL; + } + for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]); + PyMem_Free(_children); + _PyPegen_insert_memo(p, _start_mark, _loop1_154_type, _seq); + D(p->level--); + return _seq; +} + +// _tmp_155: ')' | '**' +static void * +_tmp_155_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ')' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "')'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 8)) // token=')' + ) + { + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "')'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "')'")); + } + { // '**' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_155[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 35)) // token='**' + ) + { + D(fprintf(stderr, "%*c+ _tmp_155[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_155[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +// _tmp_156: ':' | '**' +static void * +_tmp_156_rule(Parser *p) +{ + D(p->level++); + if (p->error_indicator) { + D(p->level--); + return NULL; + } + void * _res = NULL; + int _mark = p->mark; + { // ':' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "':'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 11)) // token=':' + ) + { + D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "':'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "':'")); + } + { // '**' + if (p->error_indicator) { + D(p->level--); + return NULL; + } + D(fprintf(stderr, "%*c> _tmp_156[%d-%d]: %s\n", p->level, ' ', _mark, p->mark, "'**'")); + Token * _literal; + if ( + (_literal = _PyPegen_expect_token(p, 35)) // token='**' + ) + { + D(fprintf(stderr, "%*c+ _tmp_156[%d-%d]: %s succeeded!\n", p->level, ' ', _mark, p->mark, "'**'")); + _res = _literal; + goto done; + } + p->mark = _mark; + D(fprintf(stderr, "%*c%s _tmp_156[%d-%d]: %s failed!\n", p->level, ' ', + p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'**'")); + } + _res = NULL; + done: + D(p->level--); + return _res; +} + +void * +_PyPegen_parse(Parser *p) +{ + // Initialize keywords + p->keywords = reserved_keywords; + p->n_keyword_lists = n_keyword_lists; + + // Run parser + void *result = NULL; + if (p->start_rule == Py_file_input) { + result = file_rule(p); + } else if (p->start_rule == Py_single_input) { + result = interactive_rule(p); + } else if (p->start_rule == Py_eval_input) { + result = eval_rule(p); + } else if (p->start_rule == Py_func_type_input) { + result = func_type_rule(p); + } else if (p->start_rule == Py_fstring_input) { + result = fstring_rule(p); + } + + return result; +} + +// The end diff --git a/Parser/pegen/parse_string.c b/Parser/pegen/parse_string.c new file mode 100644 index 0000000000000000000000000000000000000000..c852e5b827c0cc06332068aaede67af797799ada --- /dev/null +++ b/Parser/pegen/parse_string.c @@ -0,0 +1,1237 @@ +#include + +#include + +#include "../tokenizer.h" +#include "pegen.h" +#include "parse_string.h" + +//// STRING HANDLING FUNCTIONS //// + +// These functions are ported directly from Python/ast.c with some modifications +// to account for the use of "Parser *p", the fact that don't have parser nodes +// to pass around and the usage of some specialized APIs present only in this +// file (like "_PyPegen_raise_syntax_error"). + +static int +warn_invalid_escape_sequence(Parser *p, unsigned char first_invalid_escape_char, Token *t) +{ + PyObject *msg = + PyUnicode_FromFormat("invalid escape sequence \\%c", first_invalid_escape_char); + if (msg == NULL) { + return -1; + } + if (PyErr_WarnExplicitObject(PyExc_DeprecationWarning, msg, p->tok->filename, + t->lineno, NULL, NULL) < 0) { + if (PyErr_ExceptionMatches(PyExc_DeprecationWarning)) { + /* Replace the DeprecationWarning exception with a SyntaxError + to get a more accurate error report */ + PyErr_Clear(); + + /* This is needed, in order for the SyntaxError to point to the token t, + since _PyPegen_raise_error uses p->tokens[p->fill - 1] for the + error location, if p->known_err_token is not set. */ + p->known_err_token = t; + RAISE_SYNTAX_ERROR("invalid escape sequence \\%c", first_invalid_escape_char); + } + Py_DECREF(msg); + return -1; + } + Py_DECREF(msg); + return 0; +} + +static PyObject * +decode_utf8(const char **sPtr, const char *end) +{ + const char *s; + const char *t; + t = s = *sPtr; + while (s < end && (*s & 0x80)) { + s++; + } + *sPtr = s; + return PyUnicode_DecodeUTF8(t, s - t, NULL); +} + +static PyObject * +decode_unicode_with_escapes(Parser *parser, const char *s, size_t len, Token *t) +{ + PyObject *v; + PyObject *u; + char *buf; + char *p; + const char *end; + + /* check for integer overflow */ + if (len > SIZE_MAX / 6) { + return NULL; + } + /* "ä" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5 + "\ä" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */ + u = PyBytes_FromStringAndSize((char *)NULL, len * 6); + if (u == NULL) { + return NULL; + } + p = buf = PyBytes_AsString(u); + if (p == NULL) { + return NULL; + } + end = s + len; + while (s < end) { + if (*s == '\\') { + *p++ = *s++; + if (s >= end || *s & 0x80) { + strcpy(p, "u005c"); + p += 5; + if (s >= end) { + break; + } + } + } + if (*s & 0x80) { + PyObject *w; + int kind; + void *data; + Py_ssize_t w_len; + Py_ssize_t i; + w = decode_utf8(&s, end); + if (w == NULL) { + Py_DECREF(u); + return NULL; + } + kind = PyUnicode_KIND(w); + data = PyUnicode_DATA(w); + w_len = PyUnicode_GET_LENGTH(w); + for (i = 0; i < w_len; i++) { + Py_UCS4 chr = PyUnicode_READ(kind, data, i); + sprintf(p, "\\U%08x", chr); + p += 10; + } + /* Should be impossible to overflow */ + assert(p - buf <= PyBytes_GET_SIZE(u)); + Py_DECREF(w); + } + else { + *p++ = *s++; + } + } + len = p - buf; + s = buf; + + const char *first_invalid_escape; + v = _PyUnicode_DecodeUnicodeEscape(s, len, NULL, &first_invalid_escape); + + if (v != NULL && first_invalid_escape != NULL) { + if (warn_invalid_escape_sequence(parser, *first_invalid_escape, t) < 0) { + /* We have not decref u before because first_invalid_escape points + inside u. */ + Py_XDECREF(u); + Py_DECREF(v); + return NULL; + } + } + Py_XDECREF(u); + return v; +} + +static PyObject * +decode_bytes_with_escapes(Parser *p, const char *s, Py_ssize_t len, Token *t) +{ + const char *first_invalid_escape; + PyObject *result = _PyBytes_DecodeEscape(s, len, NULL, &first_invalid_escape); + if (result == NULL) { + return NULL; + } + + if (first_invalid_escape != NULL) { + if (warn_invalid_escape_sequence(p, *first_invalid_escape, t) < 0) { + Py_DECREF(result); + return NULL; + } + } + return result; +} + +/* s must include the bracketing quote characters, and r, b, u, + &/or f prefixes (if any), and embedded escape sequences (if any). + _PyPegen_parsestr parses it, and sets *result to decoded Python string object. + If the string is an f-string, set *fstr and *fstrlen to the unparsed + string object. Return 0 if no errors occurred. */ +int +_PyPegen_parsestr(Parser *p, int *bytesmode, int *rawmode, PyObject **result, + const char **fstr, Py_ssize_t *fstrlen, Token *t) +{ + const char *s = PyBytes_AsString(t->bytes); + if (s == NULL) { + return -1; + } + + size_t len; + int quote = Py_CHARMASK(*s); + int fmode = 0; + *bytesmode = 0; + *rawmode = 0; + *result = NULL; + *fstr = NULL; + if (Py_ISALPHA(quote)) { + while (!*bytesmode || !*rawmode) { + if (quote == 'b' || quote == 'B') { + quote =(unsigned char)*++s; + *bytesmode = 1; + } + else if (quote == 'u' || quote == 'U') { + quote = (unsigned char)*++s; + } + else if (quote == 'r' || quote == 'R') { + quote = (unsigned char)*++s; + *rawmode = 1; + } + else if (quote == 'f' || quote == 'F') { + quote = (unsigned char)*++s; + fmode = 1; + } + else { + break; + } + } + } + + /* fstrings are only allowed in Python 3.6 and greater */ + if (fmode && p->feature_version < 6) { + p->error_indicator = 1; + RAISE_SYNTAX_ERROR("Format strings are only supported in Python 3.6 and greater"); + return -1; + } + + if (fmode && *bytesmode) { + PyErr_BadInternalCall(); + return -1; + } + if (quote != '\'' && quote != '\"') { + PyErr_BadInternalCall(); + return -1; + } + /* Skip the leading quote char. */ + s++; + len = strlen(s); + if (len > INT_MAX) { + PyErr_SetString(PyExc_OverflowError, "string to parse is too long"); + return -1; + } + if (s[--len] != quote) { + /* Last quote char must match the first. */ + PyErr_BadInternalCall(); + return -1; + } + if (len >= 4 && s[0] == quote && s[1] == quote) { + /* A triple quoted string. We've already skipped one quote at + the start and one at the end of the string. Now skip the + two at the start. */ + s += 2; + len -= 2; + /* And check that the last two match. */ + if (s[--len] != quote || s[--len] != quote) { + PyErr_BadInternalCall(); + return -1; + } + } + + if (fmode) { + /* Just return the bytes. The caller will parse the resulting + string. */ + *fstr = s; + *fstrlen = len; + return 0; + } + + /* Not an f-string. */ + /* Avoid invoking escape decoding routines if possible. */ + *rawmode = *rawmode || strchr(s, '\\') == NULL; + if (*bytesmode) { + /* Disallow non-ASCII characters. */ + const char *ch; + for (ch = s; *ch; ch++) { + if (Py_CHARMASK(*ch) >= 0x80) { + RAISE_SYNTAX_ERROR( + "bytes can only contain ASCII " + "literal characters."); + return -1; + } + } + if (*rawmode) { + *result = PyBytes_FromStringAndSize(s, len); + } + else { + *result = decode_bytes_with_escapes(p, s, len, t); + } + } + else { + if (*rawmode) { + *result = PyUnicode_DecodeUTF8Stateful(s, len, NULL, NULL); + } + else { + *result = decode_unicode_with_escapes(p, s, len, t); + } + } + return *result == NULL ? -1 : 0; +} + + + +// FSTRING STUFF + +/* Fix locations for the given node and its children. + + `parent` is the enclosing node. + `n` is the node which locations are going to be fixed relative to parent. + `expr_str` is the child node's string representation, including braces. +*/ +static bool +fstring_find_expr_location(Token *parent, char *expr_str, int *p_lines, int *p_cols) +{ + *p_lines = 0; + *p_cols = 0; + if (parent && parent->bytes) { + char *parent_str = PyBytes_AsString(parent->bytes); + if (!parent_str) { + return false; + } + char *substr = strstr(parent_str, expr_str); + if (substr) { + // The following is needed, in order to correctly shift the column + // offset, in the case that (disregarding any whitespace) a newline + // immediately follows the opening curly brace of the fstring expression. + bool newline_after_brace = 1; + char *start = substr + 1; + while (start && *start != '}' && *start != '\n') { + if (*start != ' ' && *start != '\t' && *start != '\f') { + newline_after_brace = 0; + break; + } + start++; + } + + // Account for the characters from the last newline character to our + // left until the beginning of substr. + if (!newline_after_brace) { + start = substr; + while (start > parent_str && *start != '\n') { + start--; + } + *p_cols += (int)(substr - start); + } + /* adjust the start based on the number of newlines encountered + before the f-string expression */ + for (char* p = parent_str; p < substr; p++) { + if (*p == '\n') { + (*p_lines)++; + } + } + } + } + return true; +} + + +/* Compile this expression in to an expr_ty. Add parens around the + expression, in order to allow leading spaces in the expression. */ +static expr_ty +fstring_compile_expr(Parser *p, const char *expr_start, const char *expr_end, + Token *t) +{ + expr_ty expr = NULL; + char *str; + Py_ssize_t len; + const char *s; + expr_ty result = NULL; + + assert(expr_end >= expr_start); + assert(*(expr_start-1) == '{'); + assert(*expr_end == '}' || *expr_end == '!' || *expr_end == ':' || + *expr_end == '='); + + /* If the substring is all whitespace, it's an error. We need to catch this + here, and not when we call PyParser_SimpleParseStringFlagsFilename, + because turning the expression '' in to '()' would go from being invalid + to valid. */ + for (s = expr_start; s != expr_end; s++) { + char c = *s; + /* The Python parser ignores only the following whitespace + characters (\r already is converted to \n). */ + if (!(c == ' ' || c == '\t' || c == '\n' || c == '\f')) { + break; + } + } + if (s == expr_end) { + RAISE_SYNTAX_ERROR("f-string: empty expression not allowed"); + return NULL; + } + + len = expr_end - expr_start; + /* Allocate 3 extra bytes: open paren, close paren, null byte. */ + str = PyMem_Malloc(len + 3); + if (str == NULL) { + PyErr_NoMemory(); + return NULL; + } + + // The call to fstring_find_expr_location is responsible for finding the column offset + // the generated AST nodes need to be shifted to the right, which is equal to the number + // of the f-string characters before the expression starts. In order to correctly compute + // this offset, strstr gets called in fstring_find_expr_location which only succeeds + // if curly braces appear before and after the f-string expression (exactly like they do + // in the f-string itself), hence the following lines. + str[0] = '{'; + memcpy(str+1, expr_start, len); + str[len+1] = '}'; + str[len+2] = 0; + + int lines, cols; + if (!fstring_find_expr_location(t, str, &lines, &cols)) { + PyMem_FREE(str); + return NULL; + } + + // The parentheses are needed in order to allow for leading whitespace within + // the f-string expression. This consequently gets parsed as a group (see the + // group rule in python.gram). + str[0] = '('; + str[len+1] = ')'; + + struct tok_state* tok = PyTokenizer_FromString(str, 1); + if (tok == NULL) { + PyMem_Free(str); + return NULL; + } + Py_INCREF(p->tok->filename); + tok->filename = p->tok->filename; + + Parser *p2 = _PyPegen_Parser_New(tok, Py_fstring_input, p->flags, p->feature_version, + NULL, p->arena); + p2->starting_lineno = t->lineno + lines - 1; + p2->starting_col_offset = t->col_offset + cols; + + expr = _PyPegen_run_parser(p2); + + if (expr == NULL) { + goto exit; + } + result = expr; + +exit: + PyMem_Free(str); + _PyPegen_Parser_Free(p2); + PyTokenizer_Free(tok); + return result; +} + +/* Return -1 on error. + + Return 0 if we reached the end of the literal. + + Return 1 if we haven't reached the end of the literal, but we want + the caller to process the literal up to this point. Used for + doubled braces. +*/ +static int +fstring_find_literal(Parser *p, const char **str, const char *end, int raw, + PyObject **literal, int recurse_lvl, Token *t) +{ + /* Get any literal string. It ends when we hit an un-doubled left + brace (which isn't part of a unicode name escape such as + "\N{EULER CONSTANT}"), or the end of the string. */ + + const char *s = *str; + const char *literal_start = s; + int result = 0; + + assert(*literal == NULL); + while (s < end) { + char ch = *s++; + if (!raw && ch == '\\' && s < end) { + ch = *s++; + if (ch == 'N') { + if (s < end && *s++ == '{') { + while (s < end && *s++ != '}') { + } + continue; + } + break; + } + if (ch == '{' && warn_invalid_escape_sequence(p, ch, t) < 0) { + return -1; + } + } + if (ch == '{' || ch == '}') { + /* Check for doubled braces, but only at the top level. If + we checked at every level, then f'{0:{3}}' would fail + with the two closing braces. */ + if (recurse_lvl == 0) { + if (s < end && *s == ch) { + /* We're going to tell the caller that the literal ends + here, but that they should continue scanning. But also + skip over the second brace when we resume scanning. */ + *str = s + 1; + result = 1; + goto done; + } + + /* Where a single '{' is the start of a new expression, a + single '}' is not allowed. */ + if (ch == '}') { + *str = s - 1; + RAISE_SYNTAX_ERROR("f-string: single '}' is not allowed"); + return -1; + } + } + /* We're either at a '{', which means we're starting another + expression; or a '}', which means we're at the end of this + f-string (for a nested format_spec). */ + s--; + break; + } + } + *str = s; + assert(s <= end); + assert(s == end || *s == '{' || *s == '}'); +done: + if (literal_start != s) { + if (raw) { + *literal = PyUnicode_DecodeUTF8Stateful(literal_start, + s - literal_start, + NULL, NULL); + } else { + *literal = decode_unicode_with_escapes(p, literal_start, + s - literal_start, t); + } + if (!*literal) { + return -1; + } + } + return result; +} + +/* Forward declaration because parsing is recursive. */ +static expr_ty +fstring_parse(Parser *p, const char **str, const char *end, int raw, int recurse_lvl, + Token *first_token, Token* t, Token *last_token); + +/* Parse the f-string at *str, ending at end. We know *str starts an + expression (so it must be a '{'). Returns the FormattedValue node, which + includes the expression, conversion character, format_spec expression, and + optionally the text of the expression (if = is used). + + Note that I don't do a perfect job here: I don't make sure that a + closing brace doesn't match an opening paren, for example. It + doesn't need to error on all invalid expressions, just correctly + find the end of all valid ones. Any errors inside the expression + will be caught when we parse it later. + + *expression is set to the expression. For an '=' "debug" expression, + *expr_text is set to the debug text (the original text of the expression, + including the '=' and any whitespace around it, as a string object). If + not a debug expression, *expr_text set to NULL. */ +static int +fstring_find_expr(Parser *p, const char **str, const char *end, int raw, int recurse_lvl, + PyObject **expr_text, expr_ty *expression, Token *first_token, + Token *t, Token *last_token) +{ + /* Return -1 on error, else 0. */ + + const char *expr_start; + const char *expr_end; + expr_ty simple_expression; + expr_ty format_spec = NULL; /* Optional format specifier. */ + int conversion = -1; /* The conversion char. Use default if not + specified, or !r if using = and no format + spec. */ + + /* 0 if we're not in a string, else the quote char we're trying to + match (single or double quote). */ + char quote_char = 0; + + /* If we're inside a string, 1=normal, 3=triple-quoted. */ + int string_type = 0; + + /* Keep track of nesting level for braces/parens/brackets in + expressions. */ + Py_ssize_t nested_depth = 0; + char parenstack[MAXLEVEL]; + + *expr_text = NULL; + + /* Can only nest one level deep. */ + if (recurse_lvl >= 2) { + RAISE_SYNTAX_ERROR("f-string: expressions nested too deeply"); + goto error; + } + + /* The first char must be a left brace, or we wouldn't have gotten + here. Skip over it. */ + assert(**str == '{'); + *str += 1; + + expr_start = *str; + for (; *str < end; (*str)++) { + char ch; + + /* Loop invariants. */ + assert(nested_depth >= 0); + assert(*str >= expr_start && *str < end); + if (quote_char) { + assert(string_type == 1 || string_type == 3); + } else { + assert(string_type == 0); + } + + ch = **str; + /* Nowhere inside an expression is a backslash allowed. */ + if (ch == '\\') { + /* Error: can't include a backslash character, inside + parens or strings or not. */ + RAISE_SYNTAX_ERROR( + "f-string expression part " + "cannot include a backslash"); + goto error; + } + if (quote_char) { + /* We're inside a string. See if we're at the end. */ + /* This code needs to implement the same non-error logic + as tok_get from tokenizer.c, at the letter_quote + label. To actually share that code would be a + nightmare. But, it's unlikely to change and is small, + so duplicate it here. Note we don't need to catch all + of the errors, since they'll be caught when parsing the + expression. We just need to match the non-error + cases. Thus we can ignore \n in single-quoted strings, + for example. Or non-terminated strings. */ + if (ch == quote_char) { + /* Does this match the string_type (single or triple + quoted)? */ + if (string_type == 3) { + if (*str+2 < end && *(*str+1) == ch && *(*str+2) == ch) { + /* We're at the end of a triple quoted string. */ + *str += 2; + string_type = 0; + quote_char = 0; + continue; + } + } else { + /* We're at the end of a normal string. */ + quote_char = 0; + string_type = 0; + continue; + } + } + } else if (ch == '\'' || ch == '"') { + /* Is this a triple quoted string? */ + if (*str+2 < end && *(*str+1) == ch && *(*str+2) == ch) { + string_type = 3; + *str += 2; + } else { + /* Start of a normal string. */ + string_type = 1; + } + /* Start looking for the end of the string. */ + quote_char = ch; + } else if (ch == '[' || ch == '{' || ch == '(') { + if (nested_depth >= MAXLEVEL) { + RAISE_SYNTAX_ERROR("f-string: too many nested parenthesis"); + goto error; + } + parenstack[nested_depth] = ch; + nested_depth++; + } else if (ch == '#') { + /* Error: can't include a comment character, inside parens + or not. */ + RAISE_SYNTAX_ERROR("f-string expression part cannot include '#'"); + goto error; + } else if (nested_depth == 0 && + (ch == '!' || ch == ':' || ch == '}' || + ch == '=' || ch == '>' || ch == '<')) { + /* See if there's a next character. */ + if (*str+1 < end) { + char next = *(*str+1); + + /* For "!=". since '=' is not an allowed conversion character, + nothing is lost in this test. */ + if ((ch == '!' && next == '=') || /* != */ + (ch == '=' && next == '=') || /* == */ + (ch == '<' && next == '=') || /* <= */ + (ch == '>' && next == '=') /* >= */ + ) { + *str += 1; + continue; + } + /* Don't get out of the loop for these, if they're single + chars (not part of 2-char tokens). If by themselves, they + don't end an expression (unlike say '!'). */ + if (ch == '>' || ch == '<') { + continue; + } + } + + /* Normal way out of this loop. */ + break; + } else if (ch == ']' || ch == '}' || ch == ')') { + if (!nested_depth) { + RAISE_SYNTAX_ERROR("f-string: unmatched '%c'", ch); + goto error; + } + nested_depth--; + int opening = (unsigned char)parenstack[nested_depth]; + if (!((opening == '(' && ch == ')') || + (opening == '[' && ch == ']') || + (opening == '{' && ch == '}'))) + { + RAISE_SYNTAX_ERROR( + "f-string: closing parenthesis '%c' " + "does not match opening parenthesis '%c'", + ch, opening); + goto error; + } + } else { + /* Just consume this char and loop around. */ + } + } + expr_end = *str; + /* If we leave this loop in a string or with mismatched parens, we + don't care. We'll get a syntax error when compiling the + expression. But, we can produce a better error message, so + let's just do that.*/ + if (quote_char) { + RAISE_SYNTAX_ERROR("f-string: unterminated string"); + goto error; + } + if (nested_depth) { + int opening = (unsigned char)parenstack[nested_depth - 1]; + RAISE_SYNTAX_ERROR("f-string: unmatched '%c'", opening); + goto error; + } + + if (*str >= end) { + goto unexpected_end_of_string; + } + + /* Compile the expression as soon as possible, so we show errors + related to the expression before errors related to the + conversion or format_spec. */ + simple_expression = fstring_compile_expr(p, expr_start, expr_end, t); + if (!simple_expression) { + goto error; + } + + /* Check for =, which puts the text value of the expression in + expr_text. */ + if (**str == '=') { + if (p->feature_version < 8) { + RAISE_SYNTAX_ERROR("f-string: self documenting expressions are " + "only supported in Python 3.8 and greater"); + goto error; + } + *str += 1; + + /* Skip over ASCII whitespace. No need to test for end of string + here, since we know there's at least a trailing quote somewhere + ahead. */ + while (Py_ISSPACE(**str)) { + *str += 1; + } + + /* Set *expr_text to the text of the expression. */ + *expr_text = PyUnicode_FromStringAndSize(expr_start, *str-expr_start); + if (!*expr_text) { + goto error; + } + } + + /* Check for a conversion char, if present. */ + if (**str == '!') { + *str += 1; + if (*str >= end) { + goto unexpected_end_of_string; + } + + conversion = (unsigned char)**str; + *str += 1; + + /* Validate the conversion. */ + if (!(conversion == 's' || conversion == 'r' || conversion == 'a')) { + RAISE_SYNTAX_ERROR( + "f-string: invalid conversion character: " + "expected 's', 'r', or 'a'"); + goto error; + } + + } + + /* Check for the format spec, if present. */ + if (*str >= end) { + goto unexpected_end_of_string; + } + if (**str == ':') { + *str += 1; + if (*str >= end) { + goto unexpected_end_of_string; + } + + /* Parse the format spec. */ + format_spec = fstring_parse(p, str, end, raw, recurse_lvl+1, + first_token, t, last_token); + if (!format_spec) { + goto error; + } + } + + if (*str >= end || **str != '}') { + goto unexpected_end_of_string; + } + + /* We're at a right brace. Consume it. */ + assert(*str < end); + assert(**str == '}'); + *str += 1; + + /* If we're in = mode (detected by non-NULL expr_text), and have no format + spec and no explicit conversion, set the conversion to 'r'. */ + if (*expr_text && format_spec == NULL && conversion == -1) { + conversion = 'r'; + } + + /* And now create the FormattedValue node that represents this + entire expression with the conversion and format spec. */ + //TODO: Fix this + *expression = FormattedValue(simple_expression, conversion, + format_spec, first_token->lineno, + first_token->col_offset, last_token->end_lineno, + last_token->end_col_offset, p->arena); + if (!*expression) { + goto error; + } + + return 0; + +unexpected_end_of_string: + RAISE_SYNTAX_ERROR("f-string: expecting '}'"); + /* Falls through to error. */ + +error: + Py_XDECREF(*expr_text); + return -1; + +} + +/* Return -1 on error. + + Return 0 if we have a literal (possible zero length) and an + expression (zero length if at the end of the string. + + Return 1 if we have a literal, but no expression, and we want the + caller to call us again. This is used to deal with doubled + braces. + + When called multiple times on the string 'a{{b{0}c', this function + will return: + + 1. the literal 'a{' with no expression, and a return value + of 1. Despite the fact that there's no expression, the return + value of 1 means we're not finished yet. + + 2. the literal 'b' and the expression '0', with a return value of + 0. The fact that there's an expression means we're not finished. + + 3. literal 'c' with no expression and a return value of 0. The + combination of the return value of 0 with no expression means + we're finished. +*/ +static int +fstring_find_literal_and_expr(Parser *p, const char **str, const char *end, int raw, + int recurse_lvl, PyObject **literal, + PyObject **expr_text, expr_ty *expression, + Token *first_token, Token *t, Token *last_token) +{ + int result; + + assert(*literal == NULL && *expression == NULL); + + /* Get any literal string. */ + result = fstring_find_literal(p, str, end, raw, literal, recurse_lvl, t); + if (result < 0) { + goto error; + } + + assert(result == 0 || result == 1); + + if (result == 1) { + /* We have a literal, but don't look at the expression. */ + return 1; + } + + if (*str >= end || **str == '}') { + /* We're at the end of the string or the end of a nested + f-string: no expression. The top-level error case where we + expect to be at the end of the string but we're at a '}' is + handled later. */ + return 0; + } + + /* We must now be the start of an expression, on a '{'. */ + assert(**str == '{'); + + if (fstring_find_expr(p, str, end, raw, recurse_lvl, expr_text, + expression, first_token, t, last_token) < 0) { + goto error; + } + + return 0; + +error: + Py_CLEAR(*literal); + return -1; +} + +#ifdef NDEBUG +#define ExprList_check_invariants(l) +#else +static void +ExprList_check_invariants(ExprList *l) +{ + /* Check our invariants. Make sure this object is "live", and + hasn't been deallocated. */ + assert(l->size >= 0); + assert(l->p != NULL); + if (l->size <= EXPRLIST_N_CACHED) { + assert(l->data == l->p); + } +} +#endif + +static void +ExprList_Init(ExprList *l) +{ + l->allocated = EXPRLIST_N_CACHED; + l->size = 0; + + /* Until we start allocating dynamically, p points to data. */ + l->p = l->data; + + ExprList_check_invariants(l); +} + +static int +ExprList_Append(ExprList *l, expr_ty exp) +{ + ExprList_check_invariants(l); + if (l->size >= l->allocated) { + /* We need to alloc (or realloc) the memory. */ + Py_ssize_t new_size = l->allocated * 2; + + /* See if we've ever allocated anything dynamically. */ + if (l->p == l->data) { + Py_ssize_t i; + /* We're still using the cached data. Switch to + alloc-ing. */ + l->p = PyMem_Malloc(sizeof(expr_ty) * new_size); + if (!l->p) { + return -1; + } + /* Copy the cached data into the new buffer. */ + for (i = 0; i < l->size; i++) { + l->p[i] = l->data[i]; + } + } else { + /* Just realloc. */ + expr_ty *tmp = PyMem_Realloc(l->p, sizeof(expr_ty) * new_size); + if (!tmp) { + PyMem_Free(l->p); + l->p = NULL; + return -1; + } + l->p = tmp; + } + + l->allocated = new_size; + assert(l->allocated == 2 * l->size); + } + + l->p[l->size++] = exp; + + ExprList_check_invariants(l); + return 0; +} + +static void +ExprList_Dealloc(ExprList *l) +{ + ExprList_check_invariants(l); + + /* If there's been an error, or we've never dynamically allocated, + do nothing. */ + if (!l->p || l->p == l->data) { + /* Do nothing. */ + } else { + /* We have dynamically allocated. Free the memory. */ + PyMem_Free(l->p); + } + l->p = NULL; + l->size = -1; +} + +static asdl_seq * +ExprList_Finish(ExprList *l, PyArena *arena) +{ + asdl_seq *seq; + + ExprList_check_invariants(l); + + /* Allocate the asdl_seq and copy the expressions in to it. */ + seq = _Py_asdl_seq_new(l->size, arena); + if (seq) { + Py_ssize_t i; + for (i = 0; i < l->size; i++) { + asdl_seq_SET(seq, i, l->p[i]); + } + } + ExprList_Dealloc(l); + return seq; +} + +#ifdef NDEBUG +#define FstringParser_check_invariants(state) +#else +static void +FstringParser_check_invariants(FstringParser *state) +{ + if (state->last_str) { + assert(PyUnicode_CheckExact(state->last_str)); + } + ExprList_check_invariants(&state->expr_list); +} +#endif + +void +_PyPegen_FstringParser_Init(FstringParser *state) +{ + state->last_str = NULL; + state->fmode = 0; + ExprList_Init(&state->expr_list); + FstringParser_check_invariants(state); +} + +void +_PyPegen_FstringParser_Dealloc(FstringParser *state) +{ + FstringParser_check_invariants(state); + + Py_XDECREF(state->last_str); + ExprList_Dealloc(&state->expr_list); +} + +/* Make a Constant node, but decref the PyUnicode object being added. */ +static expr_ty +make_str_node_and_del(Parser *p, PyObject **str, Token* first_token, Token *last_token) +{ + PyObject *s = *str; + PyObject *kind = NULL; + *str = NULL; + assert(PyUnicode_CheckExact(s)); + if (PyArena_AddPyObject(p->arena, s) < 0) { + Py_DECREF(s); + return NULL; + } + const char* the_str = PyBytes_AsString(first_token->bytes); + if (the_str && the_str[0] == 'u') { + kind = _PyPegen_new_identifier(p, "u"); + } + + if (kind == NULL && PyErr_Occurred()) { + return NULL; + } + + return Constant(s, kind, first_token->lineno, first_token->col_offset, + last_token->end_lineno, last_token->end_col_offset, p->arena); + +} + + +/* Add a non-f-string (that is, a regular literal string). str is + decref'd. */ +int +_PyPegen_FstringParser_ConcatAndDel(FstringParser *state, PyObject *str) +{ + FstringParser_check_invariants(state); + + assert(PyUnicode_CheckExact(str)); + + if (PyUnicode_GET_LENGTH(str) == 0) { + Py_DECREF(str); + return 0; + } + + if (!state->last_str) { + /* We didn't have a string before, so just remember this one. */ + state->last_str = str; + } else { + /* Concatenate this with the previous string. */ + PyUnicode_AppendAndDel(&state->last_str, str); + if (!state->last_str) { + return -1; + } + } + FstringParser_check_invariants(state); + return 0; +} + +/* Parse an f-string. The f-string is in *str to end, with no + 'f' or quotes. */ +int +_PyPegen_FstringParser_ConcatFstring(Parser *p, FstringParser *state, const char **str, + const char *end, int raw, int recurse_lvl, + Token *first_token, Token* t, Token *last_token) +{ + FstringParser_check_invariants(state); + state->fmode = 1; + + /* Parse the f-string. */ + while (1) { + PyObject *literal = NULL; + PyObject *expr_text = NULL; + expr_ty expression = NULL; + + /* If there's a zero length literal in front of the + expression, literal will be NULL. If we're at the end of + the f-string, expression will be NULL (unless result == 1, + see below). */ + int result = fstring_find_literal_and_expr(p, str, end, raw, recurse_lvl, + &literal, &expr_text, + &expression, first_token, t, last_token); + if (result < 0) { + return -1; + } + + /* Add the literal, if any. */ + if (literal && _PyPegen_FstringParser_ConcatAndDel(state, literal) < 0) { + Py_XDECREF(expr_text); + return -1; + } + /* Add the expr_text, if any. */ + if (expr_text && _PyPegen_FstringParser_ConcatAndDel(state, expr_text) < 0) { + return -1; + } + + /* We've dealt with the literal and expr_text, their ownership has + been transferred to the state object. Don't look at them again. */ + + /* See if we should just loop around to get the next literal + and expression, while ignoring the expression this + time. This is used for un-doubling braces, as an + optimization. */ + if (result == 1) { + continue; + } + + if (!expression) { + /* We're done with this f-string. */ + break; + } + + /* We know we have an expression. Convert any existing string + to a Constant node. */ + if (!state->last_str) { + /* Do nothing. No previous literal. */ + } else { + /* Convert the existing last_str literal to a Constant node. */ + expr_ty last_str = make_str_node_and_del(p, &state->last_str, first_token, last_token); + if (!last_str || ExprList_Append(&state->expr_list, last_str) < 0) { + return -1; + } + } + + if (ExprList_Append(&state->expr_list, expression) < 0) { + return -1; + } + } + + /* If recurse_lvl is zero, then we must be at the end of the + string. Otherwise, we must be at a right brace. */ + + if (recurse_lvl == 0 && *str < end-1) { + RAISE_SYNTAX_ERROR("f-string: unexpected end of string"); + return -1; + } + if (recurse_lvl != 0 && **str != '}') { + RAISE_SYNTAX_ERROR("f-string: expecting '}'"); + return -1; + } + + FstringParser_check_invariants(state); + return 0; +} + +/* Convert the partial state reflected in last_str and expr_list to an + expr_ty. The expr_ty can be a Constant, or a JoinedStr. */ +expr_ty +_PyPegen_FstringParser_Finish(Parser *p, FstringParser *state, Token* first_token, + Token *last_token) +{ + asdl_seq *seq; + + FstringParser_check_invariants(state); + + /* If we're just a constant string with no expressions, return + that. */ + if (!state->fmode) { + assert(!state->expr_list.size); + if (!state->last_str) { + /* Create a zero length string. */ + state->last_str = PyUnicode_FromStringAndSize(NULL, 0); + if (!state->last_str) { + goto error; + } + } + return make_str_node_and_del(p, &state->last_str, first_token, last_token); + } + + /* Create a Constant node out of last_str, if needed. It will be the + last node in our expression list. */ + if (state->last_str) { + expr_ty str = make_str_node_and_del(p, &state->last_str, first_token, last_token); + if (!str || ExprList_Append(&state->expr_list, str) < 0) { + goto error; + } + } + /* This has already been freed. */ + assert(state->last_str == NULL); + + seq = ExprList_Finish(&state->expr_list, p->arena); + if (!seq) { + goto error; + } + + return _Py_JoinedStr(seq, first_token->lineno, first_token->col_offset, + last_token->end_lineno, last_token->end_col_offset, p->arena); + +error: + _PyPegen_FstringParser_Dealloc(state); + return NULL; +} + +/* Given an f-string (with no 'f' or quotes) that's in *str and ends + at end, parse it into an expr_ty. Return NULL on error. Adjust + str to point past the parsed portion. */ +static expr_ty +fstring_parse(Parser *p, const char **str, const char *end, int raw, + int recurse_lvl, Token *first_token, Token* t, Token *last_token) +{ + FstringParser state; + + _PyPegen_FstringParser_Init(&state); + if (_PyPegen_FstringParser_ConcatFstring(p, &state, str, end, raw, recurse_lvl, + first_token, t, last_token) < 0) { + _PyPegen_FstringParser_Dealloc(&state); + return NULL; + } + + return _PyPegen_FstringParser_Finish(p, &state, t, t); +} diff --git a/Parser/pegen/parse_string.h b/Parser/pegen/parse_string.h new file mode 100644 index 0000000000000000000000000000000000000000..cd85bd57d0a383308eb2d012a3eb84358997adf5 --- /dev/null +++ b/Parser/pegen/parse_string.h @@ -0,0 +1,46 @@ +#ifndef STRINGS_H +#define STRINGS_H + +#include +#include +#include "pegen.h" + +#define EXPRLIST_N_CACHED 64 + +typedef struct { + /* Incrementally build an array of expr_ty, so be used in an + asdl_seq. Cache some small but reasonably sized number of + expr_ty's, and then after that start dynamically allocating, + doubling the number allocated each time. Note that the f-string + f'{0}a{1}' contains 3 expr_ty's: 2 FormattedValue's, and one + Constant for the literal 'a'. So you add expr_ty's about twice as + fast as you add expressions in an f-string. */ + + Py_ssize_t allocated; /* Number we've allocated. */ + Py_ssize_t size; /* Number we've used. */ + expr_ty *p; /* Pointer to the memory we're actually + using. Will point to 'data' until we + start dynamically allocating. */ + expr_ty data[EXPRLIST_N_CACHED]; +} ExprList; + +/* The FstringParser is designed to add a mix of strings and + f-strings, and concat them together as needed. Ultimately, it + generates an expr_ty. */ +typedef struct { + PyObject *last_str; + ExprList expr_list; + int fmode; +} FstringParser; + +void _PyPegen_FstringParser_Init(FstringParser *); +int _PyPegen_parsestr(Parser *, int *, int *, PyObject **, + const char **, Py_ssize_t *, Token *); +int _PyPegen_FstringParser_ConcatFstring(Parser *, FstringParser *, const char **, + const char *, int, int, Token *, Token *, + Token *); +int _PyPegen_FstringParser_ConcatAndDel(FstringParser *, PyObject *); +expr_ty _PyPegen_FstringParser_Finish(Parser *, FstringParser *, Token *, Token *); +void _PyPegen_FstringParser_Dealloc(FstringParser *); + +#endif diff --git a/Parser/pegen/peg_api.c b/Parser/pegen/peg_api.c new file mode 100644 index 0000000000000000000000000000000000000000..5e71ecdb13cf0cc7168d3f591192272d14005dac --- /dev/null +++ b/Parser/pegen/peg_api.c @@ -0,0 +1,54 @@ +#include "pegen_interface.h" + +#include "../tokenizer.h" +#include "pegen.h" + +mod_ty +PyPegen_ASTFromString(const char *str, const char *filename, int mode, + PyCompilerFlags *flags, PyArena *arena) +{ + PyObject *filename_ob = PyUnicode_FromString(filename); + if (filename_ob == NULL) { + return NULL; + } + mod_ty result = PyPegen_ASTFromStringObject(str, filename_ob, mode, flags, arena); + Py_XDECREF(filename_ob); + return result; +} + +mod_ty +PyPegen_ASTFromStringObject(const char *str, PyObject* filename, int mode, + PyCompilerFlags *flags, PyArena *arena) +{ + if (PySys_Audit("compile", "yO", str, filename) < 0) { + return NULL; + } + + mod_ty result = _PyPegen_run_parser_from_string(str, mode, filename, flags, arena); + return result; +} + +mod_ty +PyPegen_ASTFromFilename(const char *filename, int mode, PyCompilerFlags *flags, PyArena *arena) +{ + PyObject *filename_ob = PyUnicode_FromString(filename); + if (filename_ob == NULL) { + return NULL; + } + + mod_ty result = _PyPegen_run_parser_from_file(filename, mode, filename_ob, flags, arena); + Py_XDECREF(filename_ob); + return result; +} + +mod_ty +PyPegen_ASTFromFileObject(FILE *fp, PyObject *filename_ob, int mode, + const char *enc, const char *ps1, const char* ps2, + PyCompilerFlags *flags, int *errcode, PyArena *arena) +{ + if (PySys_Audit("compile", "OO", Py_None, filename_ob) < 0) { + return NULL; + } + return _PyPegen_run_parser_from_file_pointer(fp, mode, filename_ob, enc, ps1, ps2, + flags, errcode, arena); +} diff --git a/Parser/pegen/pegen.c b/Parser/pegen/pegen.c new file mode 100644 index 0000000000000000000000000000000000000000..4e742a5ec717510c80073162094c71df942a5d72 --- /dev/null +++ b/Parser/pegen/pegen.c @@ -0,0 +1,2267 @@ +#include +#include +#include "../tokenizer.h" + +#include "pegen.h" +#include "parse_string.h" +#include "ast.h" + +PyObject * +_PyPegen_new_type_comment(Parser *p, char *s) +{ + PyObject *res = PyUnicode_DecodeUTF8(s, strlen(s), NULL); + if (res == NULL) { + return NULL; + } + if (PyArena_AddPyObject(p->arena, res) < 0) { + Py_DECREF(res); + return NULL; + } + return res; +} + +arg_ty +_PyPegen_add_type_comment_to_arg(Parser *p, arg_ty a, Token *tc) +{ + if (tc == NULL) { + return a; + } + char *bytes = PyBytes_AsString(tc->bytes); + if (bytes == NULL) { + return NULL; + } + PyObject *tco = _PyPegen_new_type_comment(p, bytes); + if (tco == NULL) { + return NULL; + } + return arg(a->arg, a->annotation, tco, + a->lineno, a->col_offset, a->end_lineno, a->end_col_offset, + p->arena); +} + +static int +init_normalization(Parser *p) +{ + if (p->normalize) { + return 1; + } + PyObject *m = PyImport_ImportModuleNoBlock("unicodedata"); + if (!m) + { + return 0; + } + p->normalize = PyObject_GetAttrString(m, "normalize"); + Py_DECREF(m); + if (!p->normalize) + { + return 0; + } + return 1; +} + +/* Checks if the NOTEQUAL token is valid given the current parser flags +0 indicates success and nonzero indicates failure (an exception may be set) */ +int +_PyPegen_check_barry_as_flufl(Parser *p, Token* t) { + assert(t->bytes != NULL); + assert(t->type == NOTEQUAL); + + char* tok_str = PyBytes_AS_STRING(t->bytes); + if (p->flags & PyPARSE_BARRY_AS_BDFL && strcmp(tok_str, "<>") != 0) { + RAISE_SYNTAX_ERROR("with Barry as BDFL, use '<>' instead of '!='"); + return -1; + } + if (!(p->flags & PyPARSE_BARRY_AS_BDFL)) { + return strcmp(tok_str, "!="); + } + return 0; +} + +PyObject * +_PyPegen_new_identifier(Parser *p, char *n) +{ + PyObject *id = PyUnicode_DecodeUTF8(n, strlen(n), NULL); + if (!id) { + goto error; + } + /* PyUnicode_DecodeUTF8 should always return a ready string. */ + assert(PyUnicode_IS_READY(id)); + /* Check whether there are non-ASCII characters in the + identifier; if so, normalize to NFKC. */ + if (!PyUnicode_IS_ASCII(id)) + { + PyObject *id2; + if (!init_normalization(p)) + { + Py_DECREF(id); + goto error; + } + PyObject *form = PyUnicode_InternFromString("NFKC"); + if (form == NULL) + { + Py_DECREF(id); + goto error; + } + PyObject *args[2] = {form, id}; + id2 = _PyObject_FastCall(p->normalize, args, 2); + Py_DECREF(id); + Py_DECREF(form); + if (!id2) { + goto error; + } + if (!PyUnicode_Check(id2)) + { + PyErr_Format(PyExc_TypeError, + "unicodedata.normalize() must return a string, not " + "%.200s", + _PyType_Name(Py_TYPE(id2))); + Py_DECREF(id2); + goto error; + } + id = id2; + } + PyUnicode_InternInPlace(&id); + if (PyArena_AddPyObject(p->arena, id) < 0) + { + Py_DECREF(id); + goto error; + } + return id; + +error: + p->error_indicator = 1; + return NULL; +} + +static PyObject * +_create_dummy_identifier(Parser *p) +{ + return _PyPegen_new_identifier(p, ""); +} + +static inline Py_ssize_t +byte_offset_to_character_offset(PyObject *line, Py_ssize_t col_offset) +{ + const char *str = PyUnicode_AsUTF8(line); + if (!str) { + return 0; + } + assert(col_offset >= 0 && (unsigned long)col_offset <= strlen(str)); + PyObject *text = PyUnicode_DecodeUTF8(str, col_offset, "replace"); + if (!text) { + return 0; + } + Py_ssize_t size = PyUnicode_GET_LENGTH(text); + Py_DECREF(text); + return size; +} + +const char * +_PyPegen_get_expr_name(expr_ty e) +{ + assert(e != NULL); + switch (e->kind) { + case Attribute_kind: + return "attribute"; + case Subscript_kind: + return "subscript"; + case Starred_kind: + return "starred"; + case Name_kind: + return "name"; + case List_kind: + return "list"; + case Tuple_kind: + return "tuple"; + case Lambda_kind: + return "lambda"; + case Call_kind: + return "function call"; + case BoolOp_kind: + case BinOp_kind: + case UnaryOp_kind: + return "operator"; + case GeneratorExp_kind: + return "generator expression"; + case Yield_kind: + case YieldFrom_kind: + return "yield expression"; + case Await_kind: + return "await expression"; + case ListComp_kind: + return "list comprehension"; + case SetComp_kind: + return "set comprehension"; + case DictComp_kind: + return "dict comprehension"; + case Dict_kind: + return "dict display"; + case Set_kind: + return "set display"; + case JoinedStr_kind: + case FormattedValue_kind: + return "f-string expression"; + case Constant_kind: { + PyObject *value = e->v.Constant.value; + if (value == Py_None) { + return "None"; + } + if (value == Py_False) { + return "False"; + } + if (value == Py_True) { + return "True"; + } + if (value == Py_Ellipsis) { + return "Ellipsis"; + } + return "literal"; + } + case Compare_kind: + return "comparison"; + case IfExp_kind: + return "conditional expression"; + case NamedExpr_kind: + return "named expression"; + default: + PyErr_Format(PyExc_SystemError, + "unexpected expression in assignment %d (line %d)", + e->kind, e->lineno); + return NULL; + } +} + +static int +raise_decode_error(Parser *p) +{ + assert(PyErr_Occurred()); + const char *errtype = NULL; + if (PyErr_ExceptionMatches(PyExc_UnicodeError)) { + errtype = "unicode error"; + } + else if (PyErr_ExceptionMatches(PyExc_ValueError)) { + errtype = "value error"; + } + if (errtype) { + PyObject *type; + PyObject *value; + PyObject *tback; + PyObject *errstr; + PyErr_Fetch(&type, &value, &tback); + errstr = PyObject_Str(value); + if (errstr) { + RAISE_SYNTAX_ERROR("(%s) %U", errtype, errstr); + Py_DECREF(errstr); + } + else { + PyErr_Clear(); + RAISE_SYNTAX_ERROR("(%s) unknown error", errtype); + } + Py_XDECREF(type); + Py_XDECREF(value); + Py_XDECREF(tback); + } + + return -1; +} + +static void +raise_tokenizer_init_error(PyObject *filename) +{ + if (!(PyErr_ExceptionMatches(PyExc_LookupError) + || PyErr_ExceptionMatches(PyExc_ValueError) + || PyErr_ExceptionMatches(PyExc_UnicodeDecodeError))) { + return; + } + PyObject *errstr = NULL; + PyObject *tuple = NULL; + PyObject *type; + PyObject *value; + PyObject *tback; + PyErr_Fetch(&type, &value, &tback); + errstr = PyObject_Str(value); + if (!errstr) { + goto error; + } + + PyObject *tmp = Py_BuildValue("(OiiO)", filename, 0, -1, Py_None); + if (!tmp) { + goto error; + } + + tuple = PyTuple_Pack(2, errstr, tmp); + Py_DECREF(tmp); + if (!value) { + goto error; + } + PyErr_SetObject(PyExc_SyntaxError, tuple); + +error: + Py_XDECREF(type); + Py_XDECREF(value); + Py_XDECREF(tback); + Py_XDECREF(errstr); + Py_XDECREF(tuple); +} + +static int +tokenizer_error(Parser *p) +{ + if (PyErr_Occurred()) { + return -1; + } + + const char *msg = NULL; + PyObject* errtype = PyExc_SyntaxError; + switch (p->tok->done) { + case E_TOKEN: + msg = "invalid token"; + break; + case E_EOFS: + RAISE_SYNTAX_ERROR("EOF while scanning triple-quoted string literal"); + return -1; + case E_EOLS: + RAISE_SYNTAX_ERROR("EOL while scanning string literal"); + return -1; + case E_EOF: + RAISE_SYNTAX_ERROR("unexpected EOF while parsing"); + return -1; + case E_DEDENT: + RAISE_INDENTATION_ERROR("unindent does not match any outer indentation level"); + return -1; + case E_INTR: + if (!PyErr_Occurred()) { + PyErr_SetNone(PyExc_KeyboardInterrupt); + } + return -1; + case E_NOMEM: + PyErr_NoMemory(); + return -1; + case E_TABSPACE: + errtype = PyExc_TabError; + msg = "inconsistent use of tabs and spaces in indentation"; + break; + case E_TOODEEP: + errtype = PyExc_IndentationError; + msg = "too many levels of indentation"; + break; + case E_LINECONT: + msg = "unexpected character after line continuation character"; + break; + default: + msg = "unknown parsing error"; + } + + PyErr_Format(errtype, msg); + // There is no reliable column information for this error + PyErr_SyntaxLocationObject(p->tok->filename, p->tok->lineno, 0); + + return -1; +} + +void * +_PyPegen_raise_error(Parser *p, PyObject *errtype, const char *errmsg, ...) +{ + Token *t = p->known_err_token != NULL ? p->known_err_token : p->tokens[p->fill - 1]; + Py_ssize_t col_offset; + if (t->col_offset == -1) { + col_offset = Py_SAFE_DOWNCAST(p->tok->cur - p->tok->buf, + intptr_t, int); + } else { + col_offset = t->col_offset + 1; + } + + va_list va; + va_start(va, errmsg); + _PyPegen_raise_error_known_location(p, errtype, t->lineno, + col_offset, errmsg, va); + va_end(va); + + return NULL; +} + +void * +_PyPegen_raise_error_known_location(Parser *p, PyObject *errtype, + Py_ssize_t lineno, Py_ssize_t col_offset, + const char *errmsg, va_list va) +{ + PyObject *value = NULL; + PyObject *errstr = NULL; + PyObject *error_line = NULL; + PyObject *tmp = NULL; + p->error_indicator = 1; + + if (p->start_rule == Py_fstring_input) { + const char *fstring_msg = "f-string: "; + Py_ssize_t len = strlen(fstring_msg) + strlen(errmsg); + + char *new_errmsg = PyMem_RawMalloc(len + 1); // Lengths of both strings plus NULL character + if (!new_errmsg) { + return (void *) PyErr_NoMemory(); + } + + // Copy both strings into new buffer + memcpy(new_errmsg, fstring_msg, strlen(fstring_msg)); + memcpy(new_errmsg + strlen(fstring_msg), errmsg, strlen(errmsg)); + new_errmsg[len] = 0; + errmsg = new_errmsg; + } + errstr = PyUnicode_FromFormatV(errmsg, va); + if (!errstr) { + goto error; + } + + if (p->start_rule == Py_file_input) { + error_line = PyErr_ProgramTextObject(p->tok->filename, (int) lineno); + } + + if (!error_line) { + Py_ssize_t size = p->tok->inp - p->tok->buf; + error_line = PyUnicode_DecodeUTF8(p->tok->buf, size, "replace"); + if (!error_line) { + goto error; + } + } + + if (p->start_rule == Py_fstring_input) { + col_offset -= p->starting_col_offset; + } + Py_ssize_t col_number = col_offset; + + if (p->tok->encoding != NULL) { + col_number = byte_offset_to_character_offset(error_line, col_offset); + } + + tmp = Py_BuildValue("(OiiN)", p->tok->filename, lineno, col_number, error_line); + if (!tmp) { + goto error; + } + value = PyTuple_Pack(2, errstr, tmp); + Py_DECREF(tmp); + if (!value) { + goto error; + } + PyErr_SetObject(errtype, value); + + Py_DECREF(errstr); + Py_DECREF(value); + if (p->start_rule == Py_fstring_input) { + PyMem_RawFree((void *)errmsg); + } + return NULL; + +error: + Py_XDECREF(errstr); + Py_XDECREF(error_line); + if (p->start_rule == Py_fstring_input) { + PyMem_RawFree((void *)errmsg); + } + return NULL; +} + +#if 0 +static const char * +token_name(int type) +{ + if (0 <= type && type <= N_TOKENS) { + return _PyParser_TokenNames[type]; + } + return ""; +} +#endif + +// Here, mark is the start of the node, while p->mark is the end. +// If node==NULL, they should be the same. +int +_PyPegen_insert_memo(Parser *p, int mark, int type, void *node) +{ + // Insert in front + Memo *m = PyArena_Malloc(p->arena, sizeof(Memo)); + if (m == NULL) { + return -1; + } + m->type = type; + m->node = node; + m->mark = p->mark; + m->next = p->tokens[mark]->memo; + p->tokens[mark]->memo = m; + return 0; +} + +// Like _PyPegen_insert_memo(), but updates an existing node if found. +int +_PyPegen_update_memo(Parser *p, int mark, int type, void *node) +{ + for (Memo *m = p->tokens[mark]->memo; m != NULL; m = m->next) { + if (m->type == type) { + // Update existing node. + m->node = node; + m->mark = p->mark; + return 0; + } + } + // Insert new node. + return _PyPegen_insert_memo(p, mark, type, node); +} + +// Return dummy NAME. +void * +_PyPegen_dummy_name(Parser *p, ...) +{ + static void *cache = NULL; + + if (cache != NULL) { + return cache; + } + + PyObject *id = _create_dummy_identifier(p); + if (!id) { + return NULL; + } + cache = Name(id, Load, 1, 0, 1, 0, p->arena); + return cache; +} + +static int +_get_keyword_or_name_type(Parser *p, const char *name, int name_len) +{ + assert(name_len > 0); + if (name_len >= p->n_keyword_lists || + p->keywords[name_len] == NULL || + p->keywords[name_len]->type == -1) { + return NAME; + } + for (KeywordToken *k = p->keywords[name_len]; k != NULL && k->type != -1; k++) { + if (strncmp(k->str, name, name_len) == 0) { + return k->type; + } + } + return NAME; +} + +static int +growable_comment_array_init(growable_comment_array *arr, size_t initial_size) { + assert(initial_size > 0); + arr->items = PyMem_Malloc(initial_size * sizeof(*arr->items)); + arr->size = initial_size; + arr->num_items = 0; + + return arr->items != NULL; +} + +static int +growable_comment_array_add(growable_comment_array *arr, int lineno, char *comment) { + if (arr->num_items >= arr->size) { + size_t new_size = arr->size * 2; + void *new_items_array = PyMem_Realloc(arr->items, new_size * sizeof(*arr->items)); + if (!new_items_array) { + return 0; + } + arr->items = new_items_array; + arr->size = new_size; + } + + arr->items[arr->num_items].lineno = lineno; + arr->items[arr->num_items].comment = comment; // Take ownership + arr->num_items++; + return 1; +} + +static void +growable_comment_array_deallocate(growable_comment_array *arr) { + for (unsigned i = 0; i < arr->num_items; i++) { + PyMem_Free(arr->items[i].comment); + } + PyMem_Free(arr->items); +} + +int +_PyPegen_fill_token(Parser *p) +{ + const char *start; + const char *end; + int type = PyTokenizer_Get(p->tok, &start, &end); + + // Record and skip '# type: ignore' comments + while (type == TYPE_IGNORE) { + Py_ssize_t len = end - start; + char *tag = PyMem_Malloc(len + 1); + if (tag == NULL) { + PyErr_NoMemory(); + return -1; + } + strncpy(tag, start, len); + tag[len] = '\0'; + // Ownership of tag passes to the growable array + if (!growable_comment_array_add(&p->type_ignore_comments, p->tok->lineno, tag)) { + PyErr_NoMemory(); + return -1; + } + type = PyTokenizer_Get(p->tok, &start, &end); + } + + if (type == ENDMARKER && p->start_rule == Py_single_input && p->parsing_started) { + type = NEWLINE; /* Add an extra newline */ + p->parsing_started = 0; + + if (p->tok->indent && !(p->flags & PyPARSE_DONT_IMPLY_DEDENT)) { + p->tok->pendin = -p->tok->indent; + p->tok->indent = 0; + } + } + else { + p->parsing_started = 1; + } + + if (p->fill == p->size) { + int newsize = p->size * 2; + Token **new_tokens = PyMem_Realloc(p->tokens, newsize * sizeof(Token *)); + if (new_tokens == NULL) { + PyErr_NoMemory(); + return -1; + } + p->tokens = new_tokens; + + for (int i = p->size; i < newsize; i++) { + p->tokens[i] = PyMem_Malloc(sizeof(Token)); + if (p->tokens[i] == NULL) { + p->size = i; // Needed, in order to cleanup correctly after parser fails + PyErr_NoMemory(); + return -1; + } + memset(p->tokens[i], '\0', sizeof(Token)); + } + p->size = newsize; + } + + Token *t = p->tokens[p->fill]; + t->type = (type == NAME) ? _get_keyword_or_name_type(p, start, (int)(end - start)) : type; + t->bytes = PyBytes_FromStringAndSize(start, end - start); + if (t->bytes == NULL) { + return -1; + } + PyArena_AddPyObject(p->arena, t->bytes); + + int lineno = type == STRING ? p->tok->first_lineno : p->tok->lineno; + const char *line_start = type == STRING ? p->tok->multi_line_start : p->tok->line_start; + int end_lineno = p->tok->lineno; + int col_offset = -1; + int end_col_offset = -1; + if (start != NULL && start >= line_start) { + col_offset = (int)(start - line_start); + } + if (end != NULL && end >= p->tok->line_start) { + end_col_offset = (int)(end - p->tok->line_start); + } + + t->lineno = p->starting_lineno + lineno; + t->col_offset = p->tok->lineno == 1 ? p->starting_col_offset + col_offset : col_offset; + t->end_lineno = p->starting_lineno + end_lineno; + t->end_col_offset = p->tok->lineno == 1 ? p->starting_col_offset + end_col_offset : end_col_offset; + + p->fill += 1; + + if (type == ERRORTOKEN) { + if (p->tok->done == E_DECODE) { + return raise_decode_error(p); + } + return tokenizer_error(p); + + } + + return 0; +} + +// Instrumentation to count the effectiveness of memoization. +// The array counts the number of tokens skipped by memoization, +// indexed by type. + +#define NSTATISTICS 2000 +static long memo_statistics[NSTATISTICS]; + +void +_PyPegen_clear_memo_statistics() +{ + for (int i = 0; i < NSTATISTICS; i++) { + memo_statistics[i] = 0; + } +} + +PyObject * +_PyPegen_get_memo_statistics() +{ + PyObject *ret = PyList_New(NSTATISTICS); + if (ret == NULL) { + return NULL; + } + for (int i = 0; i < NSTATISTICS; i++) { + PyObject *value = PyLong_FromLong(memo_statistics[i]); + if (value == NULL) { + Py_DECREF(ret); + return NULL; + } + // PyList_SetItem borrows a reference to value. + if (PyList_SetItem(ret, i, value) < 0) { + Py_DECREF(ret); + return NULL; + } + } + return ret; +} + +int // bool +_PyPegen_is_memoized(Parser *p, int type, void *pres) +{ + if (p->mark == p->fill) { + if (_PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + return -1; + } + } + + Token *t = p->tokens[p->mark]; + + for (Memo *m = t->memo; m != NULL; m = m->next) { + if (m->type == type) { + if (0 <= type && type < NSTATISTICS) { + long count = m->mark - p->mark; + // A memoized negative result counts for one. + if (count <= 0) { + count = 1; + } + memo_statistics[type] += count; + } + p->mark = m->mark; + *(void **)(pres) = m->node; + return 1; + } + } + return 0; +} + +int +_PyPegen_lookahead_with_name(int positive, expr_ty (func)(Parser *), Parser *p) +{ + int mark = p->mark; + void *res = func(p); + p->mark = mark; + return (res != NULL) == positive; +} + +int +_PyPegen_lookahead_with_string(int positive, expr_ty (func)(Parser *, const char*), Parser *p, const char* arg) +{ + int mark = p->mark; + void *res = func(p, arg); + p->mark = mark; + return (res != NULL) == positive; +} + +int +_PyPegen_lookahead_with_int(int positive, Token *(func)(Parser *, int), Parser *p, int arg) +{ + int mark = p->mark; + void *res = func(p, arg); + p->mark = mark; + return (res != NULL) == positive; +} + +int +_PyPegen_lookahead(int positive, void *(func)(Parser *), Parser *p) +{ + int mark = p->mark; + void *res = (void*)func(p); + p->mark = mark; + return (res != NULL) == positive; +} + +Token * +_PyPegen_expect_token(Parser *p, int type) +{ + if (p->mark == p->fill) { + if (_PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + return NULL; + } + } + Token *t = p->tokens[p->mark]; + if (t->type != type) { + return NULL; + } + p->mark += 1; + return t; +} + +expr_ty +_PyPegen_expect_soft_keyword(Parser *p, const char *keyword) +{ + if (p->mark == p->fill) { + if (_PyPegen_fill_token(p) < 0) { + p->error_indicator = 1; + return NULL; + } + } + Token *t = p->tokens[p->mark]; + if (t->type != NAME) { + return NULL; + } + char* s = PyBytes_AsString(t->bytes); + if (!s) { + p->error_indicator = 1; + return NULL; + } + if (strcmp(s, keyword) != 0) { + return NULL; + } + return _PyPegen_name_token(p); +} + +Token * +_PyPegen_get_last_nonnwhitespace_token(Parser *p) +{ + assert(p->mark >= 0); + Token *token = NULL; + for (int m = p->mark - 1; m >= 0; m--) { + token = p->tokens[m]; + if (token->type != ENDMARKER && (token->type < NEWLINE || token->type > DEDENT)) { + break; + } + } + return token; +} + +expr_ty +_PyPegen_name_token(Parser *p) +{ + Token *t = _PyPegen_expect_token(p, NAME); + if (t == NULL) { + return NULL; + } + char* s = PyBytes_AsString(t->bytes); + if (!s) { + p->error_indicator = 1; + return NULL; + } + PyObject *id = _PyPegen_new_identifier(p, s); + if (id == NULL) { + p->error_indicator = 1; + return NULL; + } + return Name(id, Load, t->lineno, t->col_offset, t->end_lineno, t->end_col_offset, + p->arena); +} + +void * +_PyPegen_string_token(Parser *p) +{ + return _PyPegen_expect_token(p, STRING); +} + +static PyObject * +parsenumber_raw(const char *s) +{ + const char *end; + long x; + double dx; + Py_complex compl; + int imflag; + + assert(s != NULL); + errno = 0; + end = s + strlen(s) - 1; + imflag = *end == 'j' || *end == 'J'; + if (s[0] == '0') { + x = (long)PyOS_strtoul(s, (char **)&end, 0); + if (x < 0 && errno == 0) { + return PyLong_FromString(s, (char **)0, 0); + } + } + else { + x = PyOS_strtol(s, (char **)&end, 0); + } + if (*end == '\0') { + if (errno != 0) { + return PyLong_FromString(s, (char **)0, 0); + } + return PyLong_FromLong(x); + } + /* XXX Huge floats may silently fail */ + if (imflag) { + compl.real = 0.; + compl.imag = PyOS_string_to_double(s, (char **)&end, NULL); + if (compl.imag == -1.0 && PyErr_Occurred()) { + return NULL; + } + return PyComplex_FromCComplex(compl); + } + dx = PyOS_string_to_double(s, NULL, NULL); + if (dx == -1.0 && PyErr_Occurred()) { + return NULL; + } + return PyFloat_FromDouble(dx); +} + +static PyObject * +parsenumber(const char *s) +{ + char *dup; + char *end; + PyObject *res = NULL; + + assert(s != NULL); + + if (strchr(s, '_') == NULL) { + return parsenumber_raw(s); + } + /* Create a duplicate without underscores. */ + dup = PyMem_Malloc(strlen(s) + 1); + if (dup == NULL) { + return PyErr_NoMemory(); + } + end = dup; + for (; *s; s++) { + if (*s != '_') { + *end++ = *s; + } + } + *end = '\0'; + res = parsenumber_raw(dup); + PyMem_Free(dup); + return res; +} + +expr_ty +_PyPegen_number_token(Parser *p) +{ + Token *t = _PyPegen_expect_token(p, NUMBER); + if (t == NULL) { + return NULL; + } + + char *num_raw = PyBytes_AsString(t->bytes); + if (num_raw == NULL) { + p->error_indicator = 1; + return NULL; + } + + if (p->feature_version < 6 && strchr(num_raw, '_') != NULL) { + p->error_indicator = 1; + return RAISE_SYNTAX_ERROR("Underscores in numeric literals are only supported " + "in Python 3.6 and greater"); + } + + PyObject *c = parsenumber(num_raw); + + if (c == NULL) { + p->error_indicator = 1; + return NULL; + } + + if (PyArena_AddPyObject(p->arena, c) < 0) { + Py_DECREF(c); + p->error_indicator = 1; + return NULL; + } + + return Constant(c, NULL, t->lineno, t->col_offset, t->end_lineno, t->end_col_offset, + p->arena); +} + +static int // bool +newline_in_string(Parser *p, const char *cur) +{ + for (const char *c = cur; c >= p->tok->buf; c--) { + if (*c == '\'' || *c == '"') { + return 1; + } + } + return 0; +} + +/* Check that the source for a single input statement really is a single + statement by looking at what is left in the buffer after parsing. + Trailing whitespace and comments are OK. */ +static int // bool +bad_single_statement(Parser *p) +{ + const char *cur = strchr(p->tok->buf, '\n'); + + /* Newlines are allowed if preceded by a line continuation character + or if they appear inside a string. */ + if (!cur || (cur != p->tok->buf && *(cur - 1) == '\\') + || newline_in_string(p, cur)) { + return 0; + } + char c = *cur; + + for (;;) { + while (c == ' ' || c == '\t' || c == '\n' || c == '\014') { + c = *++cur; + } + + if (!c) { + return 0; + } + + if (c != '#') { + return 1; + } + + /* Suck up comment. */ + while (c && c != '\n') { + c = *++cur; + } + } +} + +void +_PyPegen_Parser_Free(Parser *p) +{ + Py_XDECREF(p->normalize); + for (int i = 0; i < p->size; i++) { + PyMem_Free(p->tokens[i]); + } + PyMem_Free(p->tokens); + growable_comment_array_deallocate(&p->type_ignore_comments); + PyMem_Free(p); +} + +static int +compute_parser_flags(PyCompilerFlags *flags) +{ + int parser_flags = 0; + if (!flags) { + return 0; + } + if (flags->cf_flags & PyCF_DONT_IMPLY_DEDENT) { + parser_flags |= PyPARSE_DONT_IMPLY_DEDENT; + } + if (flags->cf_flags & PyCF_IGNORE_COOKIE) { + parser_flags |= PyPARSE_IGNORE_COOKIE; + } + if (flags->cf_flags & CO_FUTURE_BARRY_AS_BDFL) { + parser_flags |= PyPARSE_BARRY_AS_BDFL; + } + if (flags->cf_flags & PyCF_TYPE_COMMENTS) { + parser_flags |= PyPARSE_TYPE_COMMENTS; + } + if ((flags->cf_flags & PyCF_ONLY_AST) && flags->cf_feature_version < 7) { + parser_flags |= PyPARSE_ASYNC_HACKS; + } + return parser_flags; +} + +Parser * +_PyPegen_Parser_New(struct tok_state *tok, int start_rule, int flags, + int feature_version, int *errcode, PyArena *arena) +{ + Parser *p = PyMem_Malloc(sizeof(Parser)); + if (p == NULL) { + return (Parser *) PyErr_NoMemory(); + } + assert(tok != NULL); + tok->type_comments = (flags & PyPARSE_TYPE_COMMENTS) > 0; + tok->async_hacks = (flags & PyPARSE_ASYNC_HACKS) > 0; + p->tok = tok; + p->keywords = NULL; + p->n_keyword_lists = -1; + p->tokens = PyMem_Malloc(sizeof(Token *)); + if (!p->tokens) { + PyMem_Free(p); + return (Parser *) PyErr_NoMemory(); + } + p->tokens[0] = PyMem_Calloc(1, sizeof(Token)); + if (!p->tokens) { + PyMem_Free(p->tokens); + PyMem_Free(p); + return (Parser *) PyErr_NoMemory(); + } + if (!growable_comment_array_init(&p->type_ignore_comments, 10)) { + PyMem_Free(p->tokens[0]); + PyMem_Free(p->tokens); + PyMem_Free(p); + return (Parser *) PyErr_NoMemory(); + } + + p->mark = 0; + p->fill = 0; + p->size = 1; + + p->errcode = errcode; + p->arena = arena; + p->start_rule = start_rule; + p->parsing_started = 0; + p->normalize = NULL; + p->error_indicator = 0; + + p->starting_lineno = 0; + p->starting_col_offset = 0; + p->flags = flags; + p->feature_version = feature_version; + p->known_err_token = NULL; + p->level = 0; + p->call_invalid_rules = 0; + + return p; +} + +static void +reset_parser_state(Parser *p) +{ + for (int i = 0; i < p->fill; i++) { + p->tokens[i]->memo = NULL; + } + p->mark = 0; + p->call_invalid_rules = 1; +} + +void * +_PyPegen_run_parser(Parser *p) +{ + void *res = _PyPegen_parse(p); + if (res == NULL) { + reset_parser_state(p); + _PyPegen_parse(p); + if (PyErr_Occurred()) { + return NULL; + } + if (p->fill == 0) { + RAISE_SYNTAX_ERROR("error at start before reading any input"); + } + else if (p->tok->done == E_EOF) { + RAISE_SYNTAX_ERROR("unexpected EOF while parsing"); + } + else { + if (p->tokens[p->fill-1]->type == INDENT) { + RAISE_INDENTATION_ERROR("unexpected indent"); + } + else if (p->tokens[p->fill-1]->type == DEDENT) { + RAISE_INDENTATION_ERROR("unexpected unindent"); + } + else { + RAISE_SYNTAX_ERROR("invalid syntax"); + } + } + return NULL; + } + + if (p->start_rule == Py_single_input && bad_single_statement(p)) { + p->tok->done = E_BADSINGLE; // This is not necessary for now, but might be in the future + return RAISE_SYNTAX_ERROR("multiple statements found while compiling a single statement"); + } + +#if defined(Py_DEBUG) && defined(Py_BUILD_CORE) + if (p->start_rule == Py_single_input || + p->start_rule == Py_file_input || + p->start_rule == Py_eval_input) + { + assert(PyAST_Validate(res)); + } +#endif + return res; +} + +mod_ty +_PyPegen_run_parser_from_file_pointer(FILE *fp, int start_rule, PyObject *filename_ob, + const char *enc, const char *ps1, const char *ps2, + PyCompilerFlags *flags, int *errcode, PyArena *arena) +{ + struct tok_state *tok = PyTokenizer_FromFile(fp, enc, ps1, ps2); + if (tok == NULL) { + if (PyErr_Occurred()) { + raise_tokenizer_init_error(filename_ob); + return NULL; + } + return NULL; + } + // This transfers the ownership to the tokenizer + tok->filename = filename_ob; + Py_INCREF(filename_ob); + + // From here on we need to clean up even if there's an error + mod_ty result = NULL; + + int parser_flags = compute_parser_flags(flags); + Parser *p = _PyPegen_Parser_New(tok, start_rule, parser_flags, PY_MINOR_VERSION, + errcode, arena); + if (p == NULL) { + goto error; + } + + result = _PyPegen_run_parser(p); + _PyPegen_Parser_Free(p); + +error: + PyTokenizer_Free(tok); + return result; +} + +mod_ty +_PyPegen_run_parser_from_file(const char *filename, int start_rule, + PyObject *filename_ob, PyCompilerFlags *flags, PyArena *arena) +{ + FILE *fp = fopen(filename, "rb"); + if (fp == NULL) { + PyErr_SetFromErrnoWithFilename(PyExc_OSError, filename); + return NULL; + } + + mod_ty result = _PyPegen_run_parser_from_file_pointer(fp, start_rule, filename_ob, + NULL, NULL, NULL, flags, NULL, arena); + + fclose(fp); + return result; +} + +mod_ty +_PyPegen_run_parser_from_string(const char *str, int start_rule, PyObject *filename_ob, + PyCompilerFlags *flags, PyArena *arena) +{ + int exec_input = start_rule == Py_file_input; + + struct tok_state *tok; + if (flags == NULL || flags->cf_flags & PyCF_IGNORE_COOKIE) { + tok = PyTokenizer_FromUTF8(str, exec_input); + } else { + tok = PyTokenizer_FromString(str, exec_input); + } + if (tok == NULL) { + if (PyErr_Occurred()) { + raise_tokenizer_init_error(filename_ob); + } + return NULL; + } + // This transfers the ownership to the tokenizer + tok->filename = filename_ob; + Py_INCREF(filename_ob); + + // We need to clear up from here on + mod_ty result = NULL; + + int parser_flags = compute_parser_flags(flags); + int feature_version = flags && (flags->cf_flags & PyCF_ONLY_AST) ? + flags->cf_feature_version : PY_MINOR_VERSION; + Parser *p = _PyPegen_Parser_New(tok, start_rule, parser_flags, feature_version, + NULL, arena); + if (p == NULL) { + goto error; + } + + result = _PyPegen_run_parser(p); + _PyPegen_Parser_Free(p); + +error: + PyTokenizer_Free(tok); + return result; +} + +void * +_PyPegen_interactive_exit(Parser *p) +{ + if (p->errcode) { + *(p->errcode) = E_EOF; + } + return NULL; +} + +/* Creates a single-element asdl_seq* that contains a */ +asdl_seq * +_PyPegen_singleton_seq(Parser *p, void *a) +{ + assert(a != NULL); + asdl_seq *seq = _Py_asdl_seq_new(1, p->arena); + if (!seq) { + return NULL; + } + asdl_seq_SET(seq, 0, a); + return seq; +} + +/* Creates a copy of seq and prepends a to it */ +asdl_seq * +_PyPegen_seq_insert_in_front(Parser *p, void *a, asdl_seq *seq) +{ + assert(a != NULL); + if (!seq) { + return _PyPegen_singleton_seq(p, a); + } + + asdl_seq *new_seq = _Py_asdl_seq_new(asdl_seq_LEN(seq) + 1, p->arena); + if (!new_seq) { + return NULL; + } + + asdl_seq_SET(new_seq, 0, a); + for (Py_ssize_t i = 1, l = asdl_seq_LEN(new_seq); i < l; i++) { + asdl_seq_SET(new_seq, i, asdl_seq_GET(seq, i - 1)); + } + return new_seq; +} + +/* Creates a copy of seq and appends a to it */ +asdl_seq * +_PyPegen_seq_append_to_end(Parser *p, asdl_seq *seq, void *a) +{ + assert(a != NULL); + if (!seq) { + return _PyPegen_singleton_seq(p, a); + } + + asdl_seq *new_seq = _Py_asdl_seq_new(asdl_seq_LEN(seq) + 1, p->arena); + if (!new_seq) { + return NULL; + } + + for (Py_ssize_t i = 0, l = asdl_seq_LEN(new_seq); i + 1 < l; i++) { + asdl_seq_SET(new_seq, i, asdl_seq_GET(seq, i)); + } + asdl_seq_SET(new_seq, asdl_seq_LEN(new_seq) - 1, a); + return new_seq; +} + +static Py_ssize_t +_get_flattened_seq_size(asdl_seq *seqs) +{ + Py_ssize_t size = 0; + for (Py_ssize_t i = 0, l = asdl_seq_LEN(seqs); i < l; i++) { + asdl_seq *inner_seq = asdl_seq_GET(seqs, i); + size += asdl_seq_LEN(inner_seq); + } + return size; +} + +/* Flattens an asdl_seq* of asdl_seq*s */ +asdl_seq * +_PyPegen_seq_flatten(Parser *p, asdl_seq *seqs) +{ + Py_ssize_t flattened_seq_size = _get_flattened_seq_size(seqs); + assert(flattened_seq_size > 0); + + asdl_seq *flattened_seq = _Py_asdl_seq_new(flattened_seq_size, p->arena); + if (!flattened_seq) { + return NULL; + } + + int flattened_seq_idx = 0; + for (Py_ssize_t i = 0, l = asdl_seq_LEN(seqs); i < l; i++) { + asdl_seq *inner_seq = asdl_seq_GET(seqs, i); + for (Py_ssize_t j = 0, li = asdl_seq_LEN(inner_seq); j < li; j++) { + asdl_seq_SET(flattened_seq, flattened_seq_idx++, asdl_seq_GET(inner_seq, j)); + } + } + assert(flattened_seq_idx == flattened_seq_size); + + return flattened_seq; +} + +/* Creates a new name of the form . */ +expr_ty +_PyPegen_join_names_with_dot(Parser *p, expr_ty first_name, expr_ty second_name) +{ + assert(first_name != NULL && second_name != NULL); + PyObject *first_identifier = first_name->v.Name.id; + PyObject *second_identifier = second_name->v.Name.id; + + if (PyUnicode_READY(first_identifier) == -1) { + return NULL; + } + if (PyUnicode_READY(second_identifier) == -1) { + return NULL; + } + const char *first_str = PyUnicode_AsUTF8(first_identifier); + if (!first_str) { + return NULL; + } + const char *second_str = PyUnicode_AsUTF8(second_identifier); + if (!second_str) { + return NULL; + } + Py_ssize_t len = strlen(first_str) + strlen(second_str) + 1; // +1 for the dot + + PyObject *str = PyBytes_FromStringAndSize(NULL, len); + if (!str) { + return NULL; + } + + char *s = PyBytes_AS_STRING(str); + if (!s) { + return NULL; + } + + strcpy(s, first_str); + s += strlen(first_str); + *s++ = '.'; + strcpy(s, second_str); + s += strlen(second_str); + *s = '\0'; + + PyObject *uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str), PyBytes_GET_SIZE(str), NULL); + Py_DECREF(str); + if (!uni) { + return NULL; + } + PyUnicode_InternInPlace(&uni); + if (PyArena_AddPyObject(p->arena, uni) < 0) { + Py_DECREF(uni); + return NULL; + } + + return _Py_Name(uni, Load, EXTRA_EXPR(first_name, second_name)); +} + +/* Counts the total number of dots in seq's tokens */ +int +_PyPegen_seq_count_dots(asdl_seq *seq) +{ + int number_of_dots = 0; + for (Py_ssize_t i = 0, l = asdl_seq_LEN(seq); i < l; i++) { + Token *current_expr = asdl_seq_GET(seq, i); + switch (current_expr->type) { + case ELLIPSIS: + number_of_dots += 3; + break; + case DOT: + number_of_dots += 1; + break; + default: + Py_UNREACHABLE(); + } + } + + return number_of_dots; +} + +/* Creates an alias with '*' as the identifier name */ +alias_ty +_PyPegen_alias_for_star(Parser *p) +{ + PyObject *str = PyUnicode_InternFromString("*"); + if (!str) { + return NULL; + } + if (PyArena_AddPyObject(p->arena, str) < 0) { + Py_DECREF(str); + return NULL; + } + return alias(str, NULL, p->arena); +} + +/* Creates a new asdl_seq* with the identifiers of all the names in seq */ +asdl_seq * +_PyPegen_map_names_to_ids(Parser *p, asdl_seq *seq) +{ + Py_ssize_t len = asdl_seq_LEN(seq); + assert(len > 0); + + asdl_seq *new_seq = _Py_asdl_seq_new(len, p->arena); + if (!new_seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + expr_ty e = asdl_seq_GET(seq, i); + asdl_seq_SET(new_seq, i, e->v.Name.id); + } + return new_seq; +} + +/* Constructs a CmpopExprPair */ +CmpopExprPair * +_PyPegen_cmpop_expr_pair(Parser *p, cmpop_ty cmpop, expr_ty expr) +{ + assert(expr != NULL); + CmpopExprPair *a = PyArena_Malloc(p->arena, sizeof(CmpopExprPair)); + if (!a) { + return NULL; + } + a->cmpop = cmpop; + a->expr = expr; + return a; +} + +asdl_int_seq * +_PyPegen_get_cmpops(Parser *p, asdl_seq *seq) +{ + Py_ssize_t len = asdl_seq_LEN(seq); + assert(len > 0); + + asdl_int_seq *new_seq = _Py_asdl_int_seq_new(len, p->arena); + if (!new_seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + CmpopExprPair *pair = asdl_seq_GET(seq, i); + asdl_seq_SET(new_seq, i, pair->cmpop); + } + return new_seq; +} + +asdl_seq * +_PyPegen_get_exprs(Parser *p, asdl_seq *seq) +{ + Py_ssize_t len = asdl_seq_LEN(seq); + assert(len > 0); + + asdl_seq *new_seq = _Py_asdl_seq_new(len, p->arena); + if (!new_seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + CmpopExprPair *pair = asdl_seq_GET(seq, i); + asdl_seq_SET(new_seq, i, pair->expr); + } + return new_seq; +} + +/* Creates an asdl_seq* where all the elements have been changed to have ctx as context */ +static asdl_seq * +_set_seq_context(Parser *p, asdl_seq *seq, expr_context_ty ctx) +{ + Py_ssize_t len = asdl_seq_LEN(seq); + if (len == 0) { + return NULL; + } + + asdl_seq *new_seq = _Py_asdl_seq_new(len, p->arena); + if (!new_seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + expr_ty e = asdl_seq_GET(seq, i); + asdl_seq_SET(new_seq, i, _PyPegen_set_expr_context(p, e, ctx)); + } + return new_seq; +} + +static expr_ty +_set_name_context(Parser *p, expr_ty e, expr_context_ty ctx) +{ + return _Py_Name(e->v.Name.id, ctx, EXTRA_EXPR(e, e)); +} + +static expr_ty +_set_tuple_context(Parser *p, expr_ty e, expr_context_ty ctx) +{ + return _Py_Tuple(_set_seq_context(p, e->v.Tuple.elts, ctx), ctx, EXTRA_EXPR(e, e)); +} + +static expr_ty +_set_list_context(Parser *p, expr_ty e, expr_context_ty ctx) +{ + return _Py_List(_set_seq_context(p, e->v.List.elts, ctx), ctx, EXTRA_EXPR(e, e)); +} + +static expr_ty +_set_subscript_context(Parser *p, expr_ty e, expr_context_ty ctx) +{ + return _Py_Subscript(e->v.Subscript.value, e->v.Subscript.slice, ctx, EXTRA_EXPR(e, e)); +} + +static expr_ty +_set_attribute_context(Parser *p, expr_ty e, expr_context_ty ctx) +{ + return _Py_Attribute(e->v.Attribute.value, e->v.Attribute.attr, ctx, EXTRA_EXPR(e, e)); +} + +static expr_ty +_set_starred_context(Parser *p, expr_ty e, expr_context_ty ctx) +{ + return _Py_Starred(_PyPegen_set_expr_context(p, e->v.Starred.value, ctx), ctx, EXTRA_EXPR(e, e)); +} + +/* Creates an `expr_ty` equivalent to `expr` but with `ctx` as context */ +expr_ty +_PyPegen_set_expr_context(Parser *p, expr_ty expr, expr_context_ty ctx) +{ + assert(expr != NULL); + + expr_ty new = NULL; + switch (expr->kind) { + case Name_kind: + new = _set_name_context(p, expr, ctx); + break; + case Tuple_kind: + new = _set_tuple_context(p, expr, ctx); + break; + case List_kind: + new = _set_list_context(p, expr, ctx); + break; + case Subscript_kind: + new = _set_subscript_context(p, expr, ctx); + break; + case Attribute_kind: + new = _set_attribute_context(p, expr, ctx); + break; + case Starred_kind: + new = _set_starred_context(p, expr, ctx); + break; + default: + new = expr; + } + return new; +} + +/* Constructs a KeyValuePair that is used when parsing a dict's key value pairs */ +KeyValuePair * +_PyPegen_key_value_pair(Parser *p, expr_ty key, expr_ty value) +{ + KeyValuePair *a = PyArena_Malloc(p->arena, sizeof(KeyValuePair)); + if (!a) { + return NULL; + } + a->key = key; + a->value = value; + return a; +} + +/* Extracts all keys from an asdl_seq* of KeyValuePair*'s */ +asdl_seq * +_PyPegen_get_keys(Parser *p, asdl_seq *seq) +{ + Py_ssize_t len = asdl_seq_LEN(seq); + asdl_seq *new_seq = _Py_asdl_seq_new(len, p->arena); + if (!new_seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + KeyValuePair *pair = asdl_seq_GET(seq, i); + asdl_seq_SET(new_seq, i, pair->key); + } + return new_seq; +} + +/* Extracts all values from an asdl_seq* of KeyValuePair*'s */ +asdl_seq * +_PyPegen_get_values(Parser *p, asdl_seq *seq) +{ + Py_ssize_t len = asdl_seq_LEN(seq); + asdl_seq *new_seq = _Py_asdl_seq_new(len, p->arena); + if (!new_seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + KeyValuePair *pair = asdl_seq_GET(seq, i); + asdl_seq_SET(new_seq, i, pair->value); + } + return new_seq; +} + +/* Constructs a NameDefaultPair */ +NameDefaultPair * +_PyPegen_name_default_pair(Parser *p, arg_ty arg, expr_ty value, Token *tc) +{ + NameDefaultPair *a = PyArena_Malloc(p->arena, sizeof(NameDefaultPair)); + if (!a) { + return NULL; + } + a->arg = _PyPegen_add_type_comment_to_arg(p, arg, tc); + a->value = value; + return a; +} + +/* Constructs a SlashWithDefault */ +SlashWithDefault * +_PyPegen_slash_with_default(Parser *p, asdl_seq *plain_names, asdl_seq *names_with_defaults) +{ + SlashWithDefault *a = PyArena_Malloc(p->arena, sizeof(SlashWithDefault)); + if (!a) { + return NULL; + } + a->plain_names = plain_names; + a->names_with_defaults = names_with_defaults; + return a; +} + +/* Constructs a StarEtc */ +StarEtc * +_PyPegen_star_etc(Parser *p, arg_ty vararg, asdl_seq *kwonlyargs, arg_ty kwarg) +{ + StarEtc *a = PyArena_Malloc(p->arena, sizeof(StarEtc)); + if (!a) { + return NULL; + } + a->vararg = vararg; + a->kwonlyargs = kwonlyargs; + a->kwarg = kwarg; + return a; +} + +asdl_seq * +_PyPegen_join_sequences(Parser *p, asdl_seq *a, asdl_seq *b) +{ + Py_ssize_t first_len = asdl_seq_LEN(a); + Py_ssize_t second_len = asdl_seq_LEN(b); + asdl_seq *new_seq = _Py_asdl_seq_new(first_len + second_len, p->arena); + if (!new_seq) { + return NULL; + } + + int k = 0; + for (Py_ssize_t i = 0; i < first_len; i++) { + asdl_seq_SET(new_seq, k++, asdl_seq_GET(a, i)); + } + for (Py_ssize_t i = 0; i < second_len; i++) { + asdl_seq_SET(new_seq, k++, asdl_seq_GET(b, i)); + } + + return new_seq; +} + +static asdl_seq * +_get_names(Parser *p, asdl_seq *names_with_defaults) +{ + Py_ssize_t len = asdl_seq_LEN(names_with_defaults); + asdl_seq *seq = _Py_asdl_seq_new(len, p->arena); + if (!seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + NameDefaultPair *pair = asdl_seq_GET(names_with_defaults, i); + asdl_seq_SET(seq, i, pair->arg); + } + return seq; +} + +static asdl_seq * +_get_defaults(Parser *p, asdl_seq *names_with_defaults) +{ + Py_ssize_t len = asdl_seq_LEN(names_with_defaults); + asdl_seq *seq = _Py_asdl_seq_new(len, p->arena); + if (!seq) { + return NULL; + } + for (Py_ssize_t i = 0; i < len; i++) { + NameDefaultPair *pair = asdl_seq_GET(names_with_defaults, i); + asdl_seq_SET(seq, i, pair->value); + } + return seq; +} + +/* Constructs an arguments_ty object out of all the parsed constructs in the parameters rule */ +arguments_ty +_PyPegen_make_arguments(Parser *p, asdl_seq *slash_without_default, + SlashWithDefault *slash_with_default, asdl_seq *plain_names, + asdl_seq *names_with_default, StarEtc *star_etc) +{ + asdl_seq *posonlyargs; + if (slash_without_default != NULL) { + posonlyargs = slash_without_default; + } + else if (slash_with_default != NULL) { + asdl_seq *slash_with_default_names = + _get_names(p, slash_with_default->names_with_defaults); + if (!slash_with_default_names) { + return NULL; + } + posonlyargs = _PyPegen_join_sequences(p, slash_with_default->plain_names, slash_with_default_names); + if (!posonlyargs) { + return NULL; + } + } + else { + posonlyargs = _Py_asdl_seq_new(0, p->arena); + if (!posonlyargs) { + return NULL; + } + } + + asdl_seq *posargs; + if (plain_names != NULL && names_with_default != NULL) { + asdl_seq *names_with_default_names = _get_names(p, names_with_default); + if (!names_with_default_names) { + return NULL; + } + posargs = _PyPegen_join_sequences(p, plain_names, names_with_default_names); + if (!posargs) { + return NULL; + } + } + else if (plain_names == NULL && names_with_default != NULL) { + posargs = _get_names(p, names_with_default); + if (!posargs) { + return NULL; + } + } + else if (plain_names != NULL && names_with_default == NULL) { + posargs = plain_names; + } + else { + posargs = _Py_asdl_seq_new(0, p->arena); + if (!posargs) { + return NULL; + } + } + + asdl_seq *posdefaults; + if (slash_with_default != NULL && names_with_default != NULL) { + asdl_seq *slash_with_default_values = + _get_defaults(p, slash_with_default->names_with_defaults); + if (!slash_with_default_values) { + return NULL; + } + asdl_seq *names_with_default_values = _get_defaults(p, names_with_default); + if (!names_with_default_values) { + return NULL; + } + posdefaults = _PyPegen_join_sequences(p, slash_with_default_values, names_with_default_values); + if (!posdefaults) { + return NULL; + } + } + else if (slash_with_default == NULL && names_with_default != NULL) { + posdefaults = _get_defaults(p, names_with_default); + if (!posdefaults) { + return NULL; + } + } + else if (slash_with_default != NULL && names_with_default == NULL) { + posdefaults = _get_defaults(p, slash_with_default->names_with_defaults); + if (!posdefaults) { + return NULL; + } + } + else { + posdefaults = _Py_asdl_seq_new(0, p->arena); + if (!posdefaults) { + return NULL; + } + } + + arg_ty vararg = NULL; + if (star_etc != NULL && star_etc->vararg != NULL) { + vararg = star_etc->vararg; + } + + asdl_seq *kwonlyargs; + if (star_etc != NULL && star_etc->kwonlyargs != NULL) { + kwonlyargs = _get_names(p, star_etc->kwonlyargs); + if (!kwonlyargs) { + return NULL; + } + } + else { + kwonlyargs = _Py_asdl_seq_new(0, p->arena); + if (!kwonlyargs) { + return NULL; + } + } + + asdl_seq *kwdefaults; + if (star_etc != NULL && star_etc->kwonlyargs != NULL) { + kwdefaults = _get_defaults(p, star_etc->kwonlyargs); + if (!kwdefaults) { + return NULL; + } + } + else { + kwdefaults = _Py_asdl_seq_new(0, p->arena); + if (!kwdefaults) { + return NULL; + } + } + + arg_ty kwarg = NULL; + if (star_etc != NULL && star_etc->kwarg != NULL) { + kwarg = star_etc->kwarg; + } + + return _Py_arguments(posonlyargs, posargs, vararg, kwonlyargs, kwdefaults, kwarg, + posdefaults, p->arena); +} + +/* Constructs an empty arguments_ty object, that gets used when a function accepts no + * arguments. */ +arguments_ty +_PyPegen_empty_arguments(Parser *p) +{ + asdl_seq *posonlyargs = _Py_asdl_seq_new(0, p->arena); + if (!posonlyargs) { + return NULL; + } + asdl_seq *posargs = _Py_asdl_seq_new(0, p->arena); + if (!posargs) { + return NULL; + } + asdl_seq *posdefaults = _Py_asdl_seq_new(0, p->arena); + if (!posdefaults) { + return NULL; + } + asdl_seq *kwonlyargs = _Py_asdl_seq_new(0, p->arena); + if (!kwonlyargs) { + return NULL; + } + asdl_seq *kwdefaults = _Py_asdl_seq_new(0, p->arena); + if (!kwdefaults) { + return NULL; + } + + return _Py_arguments(posonlyargs, posargs, NULL, kwonlyargs, kwdefaults, NULL, kwdefaults, + p->arena); +} + +/* Encapsulates the value of an operator_ty into an AugOperator struct */ +AugOperator * +_PyPegen_augoperator(Parser *p, operator_ty kind) +{ + AugOperator *a = PyArena_Malloc(p->arena, sizeof(AugOperator)); + if (!a) { + return NULL; + } + a->kind = kind; + return a; +} + +/* Construct a FunctionDef equivalent to function_def, but with decorators */ +stmt_ty +_PyPegen_function_def_decorators(Parser *p, asdl_seq *decorators, stmt_ty function_def) +{ + assert(function_def != NULL); + if (function_def->kind == AsyncFunctionDef_kind) { + return _Py_AsyncFunctionDef( + function_def->v.FunctionDef.name, function_def->v.FunctionDef.args, + function_def->v.FunctionDef.body, decorators, function_def->v.FunctionDef.returns, + function_def->v.FunctionDef.type_comment, function_def->lineno, + function_def->col_offset, function_def->end_lineno, function_def->end_col_offset, + p->arena); + } + + return _Py_FunctionDef(function_def->v.FunctionDef.name, function_def->v.FunctionDef.args, + function_def->v.FunctionDef.body, decorators, + function_def->v.FunctionDef.returns, + function_def->v.FunctionDef.type_comment, function_def->lineno, + function_def->col_offset, function_def->end_lineno, + function_def->end_col_offset, p->arena); +} + +/* Construct a ClassDef equivalent to class_def, but with decorators */ +stmt_ty +_PyPegen_class_def_decorators(Parser *p, asdl_seq *decorators, stmt_ty class_def) +{ + assert(class_def != NULL); + return _Py_ClassDef(class_def->v.ClassDef.name, class_def->v.ClassDef.bases, + class_def->v.ClassDef.keywords, class_def->v.ClassDef.body, decorators, + class_def->lineno, class_def->col_offset, class_def->end_lineno, + class_def->end_col_offset, p->arena); +} + +/* Construct a KeywordOrStarred */ +KeywordOrStarred * +_PyPegen_keyword_or_starred(Parser *p, void *element, int is_keyword) +{ + KeywordOrStarred *a = PyArena_Malloc(p->arena, sizeof(KeywordOrStarred)); + if (!a) { + return NULL; + } + a->element = element; + a->is_keyword = is_keyword; + return a; +} + +/* Get the number of starred expressions in an asdl_seq* of KeywordOrStarred*s */ +static int +_seq_number_of_starred_exprs(asdl_seq *seq) +{ + int n = 0; + for (Py_ssize_t i = 0, l = asdl_seq_LEN(seq); i < l; i++) { + KeywordOrStarred *k = asdl_seq_GET(seq, i); + if (!k->is_keyword) { + n++; + } + } + return n; +} + +/* Extract the starred expressions of an asdl_seq* of KeywordOrStarred*s */ +asdl_seq * +_PyPegen_seq_extract_starred_exprs(Parser *p, asdl_seq *kwargs) +{ + int new_len = _seq_number_of_starred_exprs(kwargs); + if (new_len == 0) { + return NULL; + } + asdl_seq *new_seq = _Py_asdl_seq_new(new_len, p->arena); + if (!new_seq) { + return NULL; + } + + int idx = 0; + for (Py_ssize_t i = 0, len = asdl_seq_LEN(kwargs); i < len; i++) { + KeywordOrStarred *k = asdl_seq_GET(kwargs, i); + if (!k->is_keyword) { + asdl_seq_SET(new_seq, idx++, k->element); + } + } + return new_seq; +} + +/* Return a new asdl_seq* with only the keywords in kwargs */ +asdl_seq * +_PyPegen_seq_delete_starred_exprs(Parser *p, asdl_seq *kwargs) +{ + Py_ssize_t len = asdl_seq_LEN(kwargs); + Py_ssize_t new_len = len - _seq_number_of_starred_exprs(kwargs); + if (new_len == 0) { + return NULL; + } + asdl_seq *new_seq = _Py_asdl_seq_new(new_len, p->arena); + if (!new_seq) { + return NULL; + } + + int idx = 0; + for (Py_ssize_t i = 0; i < len; i++) { + KeywordOrStarred *k = asdl_seq_GET(kwargs, i); + if (k->is_keyword) { + asdl_seq_SET(new_seq, idx++, k->element); + } + } + return new_seq; +} + +expr_ty +_PyPegen_concatenate_strings(Parser *p, asdl_seq *strings) +{ + Py_ssize_t len = asdl_seq_LEN(strings); + assert(len > 0); + + Token *first = asdl_seq_GET(strings, 0); + Token *last = asdl_seq_GET(strings, len - 1); + + int bytesmode = 0; + PyObject *bytes_str = NULL; + + FstringParser state; + _PyPegen_FstringParser_Init(&state); + + for (Py_ssize_t i = 0; i < len; i++) { + Token *t = asdl_seq_GET(strings, i); + + int this_bytesmode; + int this_rawmode; + PyObject *s; + const char *fstr; + Py_ssize_t fstrlen = -1; + + if (_PyPegen_parsestr(p, &this_bytesmode, &this_rawmode, &s, &fstr, &fstrlen, t) != 0) { + goto error; + } + + /* Check that we are not mixing bytes with unicode. */ + if (i != 0 && bytesmode != this_bytesmode) { + RAISE_SYNTAX_ERROR("cannot mix bytes and nonbytes literals"); + Py_XDECREF(s); + goto error; + } + bytesmode = this_bytesmode; + + if (fstr != NULL) { + assert(s == NULL && !bytesmode); + + int result = _PyPegen_FstringParser_ConcatFstring(p, &state, &fstr, fstr + fstrlen, + this_rawmode, 0, first, t, last); + if (result < 0) { + goto error; + } + } + else { + /* String or byte string. */ + assert(s != NULL && fstr == NULL); + assert(bytesmode ? PyBytes_CheckExact(s) : PyUnicode_CheckExact(s)); + + if (bytesmode) { + if (i == 0) { + bytes_str = s; + } + else { + PyBytes_ConcatAndDel(&bytes_str, s); + if (!bytes_str) { + goto error; + } + } + } + else { + /* This is a regular string. Concatenate it. */ + if (_PyPegen_FstringParser_ConcatAndDel(&state, s) < 0) { + goto error; + } + } + } + } + + if (bytesmode) { + if (PyArena_AddPyObject(p->arena, bytes_str) < 0) { + goto error; + } + return Constant(bytes_str, NULL, first->lineno, first->col_offset, last->end_lineno, + last->end_col_offset, p->arena); + } + + return _PyPegen_FstringParser_Finish(p, &state, first, last); + +error: + Py_XDECREF(bytes_str); + _PyPegen_FstringParser_Dealloc(&state); + if (PyErr_Occurred()) { + raise_decode_error(p); + } + return NULL; +} + +mod_ty +_PyPegen_make_module(Parser *p, asdl_seq *a) { + asdl_seq *type_ignores = NULL; + Py_ssize_t num = p->type_ignore_comments.num_items; + if (num > 0) { + // Turn the raw (comment, lineno) pairs into TypeIgnore objects in the arena + type_ignores = _Py_asdl_seq_new(num, p->arena); + if (type_ignores == NULL) { + return NULL; + } + for (int i = 0; i < num; i++) { + PyObject *tag = _PyPegen_new_type_comment(p, p->type_ignore_comments.items[i].comment); + if (tag == NULL) { + return NULL; + } + type_ignore_ty ti = TypeIgnore(p->type_ignore_comments.items[i].lineno, tag, p->arena); + if (ti == NULL) { + return NULL; + } + asdl_seq_SET(type_ignores, i, ti); + } + } + return Module(a, type_ignores, p->arena); +} + +// Error reporting helpers + +expr_ty +_PyPegen_get_invalid_target(expr_ty e, TARGETS_TYPE targets_type) +{ + if (e == NULL) { + return NULL; + } + +#define VISIT_CONTAINER(CONTAINER, TYPE) do { \ + Py_ssize_t len = asdl_seq_LEN(CONTAINER->v.TYPE.elts);\ + for (Py_ssize_t i = 0; i < len; i++) {\ + expr_ty other = asdl_seq_GET(CONTAINER->v.TYPE.elts, i);\ + expr_ty child = _PyPegen_get_invalid_target(other, targets_type);\ + if (child != NULL) {\ + return child;\ + }\ + }\ + } while (0) + + // We only need to visit List and Tuple nodes recursively as those + // are the only ones that can contain valid names in targets when + // they are parsed as expressions. Any other kind of expression + // that is a container (like Sets or Dicts) is directly invalid and + // we don't need to visit it recursively. + + switch (e->kind) { + case List_kind: + VISIT_CONTAINER(e, List); + return NULL; + case Tuple_kind: + VISIT_CONTAINER(e, Tuple); + return NULL; + case Starred_kind: + if (targets_type == DEL_TARGETS) { + return e; + } + return _PyPegen_get_invalid_target(e->v.Starred.value, targets_type); + case Compare_kind: + // This is needed, because the `a in b` in `for a in b` gets parsed + // as a comparison, and so we need to search the left side of the comparison + // for invalid targets. + if (targets_type == FOR_TARGETS) { + cmpop_ty cmpop = (cmpop_ty) asdl_seq_GET(e->v.Compare.ops, 0); + if (cmpop == In) { + return _PyPegen_get_invalid_target(e->v.Compare.left, targets_type); + } + return NULL; + } + return e; + case Name_kind: + case Subscript_kind: + case Attribute_kind: + return NULL; + default: + return e; + } +} + +void *_PyPegen_arguments_parsing_error(Parser *p, expr_ty e) { + int kwarg_unpacking = 0; + for (Py_ssize_t i = 0, l = asdl_seq_LEN(e->v.Call.keywords); i < l; i++) { + keyword_ty keyword = asdl_seq_GET(e->v.Call.keywords, i); + if (!keyword->arg) { + kwarg_unpacking = 1; + } + } + + const char *msg = NULL; + if (kwarg_unpacking) { + msg = "positional argument follows keyword argument unpacking"; + } else { + msg = "positional argument follows keyword argument"; + } + + return RAISE_SYNTAX_ERROR(msg); +} + +void * +_PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args) +{ + /* The rule that calls this function is 'args for_if_clauses'. + For the input f(L, x for x in y), L and x are in args and + the for is parsed as a for_if_clause. We have to check if + len <= 1, so that input like dict((a, b) for a, b in x) + gets successfully parsed and then we pass the last + argument (x in the above example) as the location of the + error */ + Py_ssize_t len = asdl_seq_LEN(args->v.Call.args); + if (len <= 1) { + return NULL; + } + + return RAISE_SYNTAX_ERROR_KNOWN_LOCATION( + (expr_ty) asdl_seq_GET(args->v.Call.args, len - 1), + "Generator expression must be parenthesized" + ); +} + + +expr_ty _PyPegen_collect_call_seqs(Parser *p, asdl_seq *a, asdl_seq *b, + int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena) { + Py_ssize_t args_len = asdl_seq_LEN(a); + Py_ssize_t total_len = args_len; + + if (b == NULL) { + return _Py_Call(_PyPegen_dummy_name(p), a, NULL, lineno, col_offset, + end_lineno, end_col_offset, arena); + + } + + asdl_seq *starreds = _PyPegen_seq_extract_starred_exprs(p, b); + asdl_seq *keywords = _PyPegen_seq_delete_starred_exprs(p, b); + + if (starreds) { + total_len += asdl_seq_LEN(starreds); + } + + asdl_seq *args = _Py_asdl_seq_new(total_len, arena); + + Py_ssize_t i = 0; + for (i = 0; i < args_len; i++) { + asdl_seq_SET(args, i, asdl_seq_GET(a, i)); + } + for (; i < total_len; i++) { + asdl_seq_SET(args, i, asdl_seq_GET(starreds, i - args_len)); + } + + return _Py_Call(_PyPegen_dummy_name(p), args, keywords, lineno, + col_offset, end_lineno, end_col_offset, arena); + + +} diff --git a/Parser/pegen/pegen.h b/Parser/pegen/pegen.h new file mode 100644 index 0000000000000000000000000000000000000000..a2f524a597d232990f1aa4879c123eff0341a6e8 --- /dev/null +++ b/Parser/pegen/pegen.h @@ -0,0 +1,306 @@ +#ifndef PEGEN_H +#define PEGEN_H + +#define PY_SSIZE_T_CLEAN +#include +#include +#include +#include + +#if 0 +#define PyPARSE_YIELD_IS_KEYWORD 0x0001 +#endif + +#define PyPARSE_DONT_IMPLY_DEDENT 0x0002 + +#if 0 +#define PyPARSE_WITH_IS_KEYWORD 0x0003 +#define PyPARSE_PRINT_IS_FUNCTION 0x0004 +#define PyPARSE_UNICODE_LITERALS 0x0008 +#endif + +#define PyPARSE_IGNORE_COOKIE 0x0010 +#define PyPARSE_BARRY_AS_BDFL 0x0020 +#define PyPARSE_TYPE_COMMENTS 0x0040 +#define PyPARSE_ASYNC_HACKS 0x0080 + +typedef struct _memo { + int type; + void *node; + int mark; + struct _memo *next; +} Memo; + +typedef struct { + int type; + PyObject *bytes; + int lineno, col_offset, end_lineno, end_col_offset; + Memo *memo; +} Token; + +typedef struct { + char *str; + int type; +} KeywordToken; + + +typedef struct { + struct { + int lineno; + char *comment; // The " " in "# type: ignore " + } *items; + size_t size; + size_t num_items; +} growable_comment_array; + +typedef struct { + struct tok_state *tok; + Token **tokens; + int mark; + int fill, size; + PyArena *arena; + KeywordToken **keywords; + int n_keyword_lists; + int start_rule; + int *errcode; + int parsing_started; + PyObject* normalize; + int starting_lineno; + int starting_col_offset; + int error_indicator; + int flags; + int feature_version; + growable_comment_array type_ignore_comments; + Token *known_err_token; + int level; + int call_invalid_rules; +} Parser; + +typedef struct { + cmpop_ty cmpop; + expr_ty expr; +} CmpopExprPair; + +typedef struct { + expr_ty key; + expr_ty value; +} KeyValuePair; + +typedef struct { + arg_ty arg; + expr_ty value; +} NameDefaultPair; + +typedef struct { + asdl_seq *plain_names; + asdl_seq *names_with_defaults; // asdl_seq* of NameDefaultsPair's +} SlashWithDefault; + +typedef struct { + arg_ty vararg; + asdl_seq *kwonlyargs; // asdl_seq* of NameDefaultsPair's + arg_ty kwarg; +} StarEtc; + +typedef struct { + operator_ty kind; +} AugOperator; + +typedef struct { + void *element; + int is_keyword; +} KeywordOrStarred; + +void _PyPegen_clear_memo_statistics(void); +PyObject *_PyPegen_get_memo_statistics(void); + +int _PyPegen_insert_memo(Parser *p, int mark, int type, void *node); +int _PyPegen_update_memo(Parser *p, int mark, int type, void *node); +int _PyPegen_is_memoized(Parser *p, int type, void *pres); + +int _PyPegen_lookahead_with_name(int, expr_ty (func)(Parser *), Parser *); +int _PyPegen_lookahead_with_string(int , expr_ty (func)(Parser *, const char*), Parser *, const char*); +int _PyPegen_lookahead_with_int(int, Token *(func)(Parser *, int), Parser *, int); +int _PyPegen_lookahead(int, void *(func)(Parser *), Parser *); + +Token *_PyPegen_expect_token(Parser *p, int type); +expr_ty _PyPegen_expect_soft_keyword(Parser *p, const char *keyword); +Token *_PyPegen_get_last_nonnwhitespace_token(Parser *); +int _PyPegen_fill_token(Parser *p); +expr_ty _PyPegen_name_token(Parser *p); +expr_ty _PyPegen_number_token(Parser *p); +void *_PyPegen_string_token(Parser *p); +const char *_PyPegen_get_expr_name(expr_ty); +void *_PyPegen_raise_error(Parser *p, PyObject *errtype, const char *errmsg, ...); +void *_PyPegen_raise_error_known_location(Parser *p, PyObject *errtype, + Py_ssize_t lineno, Py_ssize_t col_offset, + const char *errmsg, va_list va); +void *_PyPegen_dummy_name(Parser *p, ...); + +Py_LOCAL_INLINE(void *) +RAISE_ERROR_KNOWN_LOCATION(Parser *p, PyObject *errtype, int lineno, + int col_offset, const char *errmsg, ...) +{ + va_list va; + va_start(va, errmsg); + _PyPegen_raise_error_known_location(p, errtype, lineno, col_offset + 1, + errmsg, va); + va_end(va); + return NULL; +} + + +#define UNUSED(expr) do { (void)(expr); } while (0) +#define EXTRA_EXPR(head, tail) head->lineno, head->col_offset, tail->end_lineno, tail->end_col_offset, p->arena +#define EXTRA _start_lineno, _start_col_offset, _end_lineno, _end_col_offset, p->arena +#define RAISE_SYNTAX_ERROR(msg, ...) _PyPegen_raise_error(p, PyExc_SyntaxError, msg, ##__VA_ARGS__) +#define RAISE_INDENTATION_ERROR(msg, ...) _PyPegen_raise_error(p, PyExc_IndentationError, msg, ##__VA_ARGS__) +#define RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, msg, ...) \ + RAISE_ERROR_KNOWN_LOCATION(p, PyExc_SyntaxError, (a)->lineno, (a)->col_offset, msg, ##__VA_ARGS__) + +Py_LOCAL_INLINE(void *) +CHECK_CALL(Parser *p, void *result) +{ + if (result == NULL) { + assert(PyErr_Occurred()); + p->error_indicator = 1; + } + return result; +} + +/* This is needed for helper functions that are allowed to + return NULL without an error. Example: _PyPegen_seq_extract_starred_exprs */ +Py_LOCAL_INLINE(void *) +CHECK_CALL_NULL_ALLOWED(Parser *p, void *result) +{ + if (result == NULL && PyErr_Occurred()) { + p->error_indicator = 1; + } + return result; +} + +#define CHECK(result) CHECK_CALL(p, result) +#define CHECK_NULL_ALLOWED(result) CHECK_CALL_NULL_ALLOWED(p, result) + +PyObject *_PyPegen_new_type_comment(Parser *, char *); + +Py_LOCAL_INLINE(PyObject *) +NEW_TYPE_COMMENT(Parser *p, Token *tc) +{ + if (tc == NULL) { + return NULL; + } + char *bytes = PyBytes_AsString(tc->bytes); + if (bytes == NULL) { + goto error; + } + PyObject *tco = _PyPegen_new_type_comment(p, bytes); + if (tco == NULL) { + goto error; + } + return tco; + error: + p->error_indicator = 1; // Inline CHECK_CALL + return NULL; +} + +Py_LOCAL_INLINE(void *) +INVALID_VERSION_CHECK(Parser *p, int version, char *msg, void *node) +{ + if (node == NULL) { + p->error_indicator = 1; // Inline CHECK_CALL + return NULL; + } + if (p->feature_version < version) { + p->error_indicator = 1; + return RAISE_SYNTAX_ERROR("%s only supported in Python 3.%i and greater", + msg, version); + } + return node; +} + +#define CHECK_VERSION(version, msg, node) INVALID_VERSION_CHECK(p, version, msg, node) + +arg_ty _PyPegen_add_type_comment_to_arg(Parser *, arg_ty, Token *); +PyObject *_PyPegen_new_identifier(Parser *, char *); +Parser *_PyPegen_Parser_New(struct tok_state *, int, int, int, int *, PyArena *); +void _PyPegen_Parser_Free(Parser *); +mod_ty _PyPegen_run_parser_from_file_pointer(FILE *, int, PyObject *, const char *, + const char *, const char *, PyCompilerFlags *, int *, PyArena *); +void *_PyPegen_run_parser(Parser *); +mod_ty _PyPegen_run_parser_from_file(const char *, int, PyObject *, PyCompilerFlags *, PyArena *); +mod_ty _PyPegen_run_parser_from_string(const char *, int, PyObject *, PyCompilerFlags *, PyArena *); +void *_PyPegen_interactive_exit(Parser *); +asdl_seq *_PyPegen_singleton_seq(Parser *, void *); +asdl_seq *_PyPegen_seq_insert_in_front(Parser *, void *, asdl_seq *); +asdl_seq *_PyPegen_seq_append_to_end(Parser *, asdl_seq *, void *); +asdl_seq *_PyPegen_seq_flatten(Parser *, asdl_seq *); +expr_ty _PyPegen_join_names_with_dot(Parser *, expr_ty, expr_ty); +int _PyPegen_seq_count_dots(asdl_seq *); +alias_ty _PyPegen_alias_for_star(Parser *); +asdl_seq *_PyPegen_map_names_to_ids(Parser *, asdl_seq *); +CmpopExprPair *_PyPegen_cmpop_expr_pair(Parser *, cmpop_ty, expr_ty); +asdl_int_seq *_PyPegen_get_cmpops(Parser *p, asdl_seq *); +asdl_seq *_PyPegen_get_exprs(Parser *, asdl_seq *); +expr_ty _PyPegen_set_expr_context(Parser *, expr_ty, expr_context_ty); +KeyValuePair *_PyPegen_key_value_pair(Parser *, expr_ty, expr_ty); +asdl_seq *_PyPegen_get_keys(Parser *, asdl_seq *); +asdl_seq *_PyPegen_get_values(Parser *, asdl_seq *); +NameDefaultPair *_PyPegen_name_default_pair(Parser *, arg_ty, expr_ty, Token *); +SlashWithDefault *_PyPegen_slash_with_default(Parser *, asdl_seq *, asdl_seq *); +StarEtc *_PyPegen_star_etc(Parser *, arg_ty, asdl_seq *, arg_ty); +arguments_ty _PyPegen_make_arguments(Parser *, asdl_seq *, SlashWithDefault *, + asdl_seq *, asdl_seq *, StarEtc *); +arguments_ty _PyPegen_empty_arguments(Parser *); +AugOperator *_PyPegen_augoperator(Parser*, operator_ty type); +stmt_ty _PyPegen_function_def_decorators(Parser *, asdl_seq *, stmt_ty); +stmt_ty _PyPegen_class_def_decorators(Parser *, asdl_seq *, stmt_ty); +KeywordOrStarred *_PyPegen_keyword_or_starred(Parser *, void *, int); +asdl_seq *_PyPegen_seq_extract_starred_exprs(Parser *, asdl_seq *); +asdl_seq *_PyPegen_seq_delete_starred_exprs(Parser *, asdl_seq *); +expr_ty _PyPegen_collect_call_seqs(Parser *, asdl_seq *, asdl_seq *, + int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena); +expr_ty _PyPegen_concatenate_strings(Parser *p, asdl_seq *); +asdl_seq *_PyPegen_join_sequences(Parser *, asdl_seq *, asdl_seq *); +int _PyPegen_check_barry_as_flufl(Parser *, Token *); +mod_ty _PyPegen_make_module(Parser *, asdl_seq *); + +// Error reporting helpers +typedef enum { + STAR_TARGETS, + DEL_TARGETS, + FOR_TARGETS +} TARGETS_TYPE; +expr_ty _PyPegen_get_invalid_target(expr_ty e, TARGETS_TYPE targets_type); +#define RAISE_SYNTAX_ERROR_INVALID_TARGET(type, e) _RAISE_SYNTAX_ERROR_INVALID_TARGET(p, type, e) + +Py_LOCAL_INLINE(void *) +_RAISE_SYNTAX_ERROR_INVALID_TARGET(Parser *p, TARGETS_TYPE type, void *e) +{ + expr_ty invalid_target = CHECK_NULL_ALLOWED(_PyPegen_get_invalid_target(e, type)); + if (invalid_target != NULL) { + const char *msg; + if (type == STAR_TARGETS || type == FOR_TARGETS) { + msg = "cannot assign to %s"; + } + else { + msg = "cannot delete %s"; + } + return RAISE_SYNTAX_ERROR_KNOWN_LOCATION( + invalid_target, + msg, + _PyPegen_get_expr_name(invalid_target) + ); + } + return RAISE_SYNTAX_ERROR("invalid syntax"); +} + +void *_PyPegen_arguments_parsing_error(Parser *, expr_ty); +void *_PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args); + + +// Generated function in parse.c - function definition in python.gram +void *_PyPegen_parse(Parser *); + +#endif diff --git a/Parser/pgen/__main__.py b/Parser/pgen/__main__.py index eea52618422e41b752b10045d2b8fecedb8a2596..d3780a7b77de8af5b1e8492e6a3808e5e4aefb91 100644 --- a/Parser/pgen/__main__.py +++ b/Parser/pgen/__main__.py @@ -8,24 +8,32 @@ def main(): parser.add_argument( "grammar", type=str, help="The file with the grammar definition in EBNF format" ) - parser.add_argument( - "tokens", type=str, help="The file with the token definitions" - ) + parser.add_argument("tokens", type=str, help="The file with the token definitions") parser.add_argument( "graminit_h", - type=argparse.FileType('w'), + type=argparse.FileType("w"), help="The path to write the grammar's non-terminals as #defines", ) parser.add_argument( "graminit_c", - type=argparse.FileType('w'), + type=argparse.FileType("w"), help="The path to write the grammar as initialized data", ) parser.add_argument("--verbose", "-v", action="count") + parser.add_argument( + "--graph", + type=argparse.FileType("w"), + action="store", + metavar="GRAPH_OUTPUT_FILE", + help="Dumps a DOT representation of the generated automata in a file", + ) + args = parser.parse_args() - p = ParserGenerator(args.grammar, args.tokens, verbose=args.verbose) + p = ParserGenerator( + args.grammar, args.tokens, verbose=args.verbose, graph_file=args.graph + ) grammar = p.make_grammar() grammar.produce_graminit_h(args.graminit_h.write) grammar.produce_graminit_c(args.graminit_c.write) diff --git a/Parser/pgen/automata.py b/Parser/pgen/automata.py new file mode 100644 index 0000000000000000000000000000000000000000..f2ed221e2852c97ee3cd458b5c5e069f8dc00ef7 --- /dev/null +++ b/Parser/pgen/automata.py @@ -0,0 +1,400 @@ +"""Classes representing state-machine concepts""" + +class NFA: + """A non deterministic finite automata + + A non deterministic automata is a form of a finite state + machine. An NFA's rules are less restrictive than a DFA. + The NFA rules are: + + * A transition can be non-deterministic and can result in + nothing, one, or two or more states. + + * An epsilon transition consuming empty input is valid. + Transitions consuming labeled symbols are also permitted. + + This class assumes that there is only one starting state and one + accepting (ending) state. + + Attributes: + name (str): The name of the rule the NFA is representing. + start (NFAState): The starting state. + end (NFAState): The ending state + """ + + def __init__(self, start, end): + self.name = start.rule_name + self.start = start + self.end = end + + def __repr__(self): + return "NFA(start={}, end={})".format(self.start, self.end) + + def dump(self, writer=print): + """Dump a graphical representation of the NFA""" + todo = [self.start] + for i, state in enumerate(todo): + writer(" State", i, state is self.end and "(final)" or "") + for arc in state.arcs: + label = arc.label + next = arc.target + if next in todo: + j = todo.index(next) + else: + j = len(todo) + todo.append(next) + if label is None: + writer(" -> %d" % j) + else: + writer(" %s -> %d" % (label, j)) + + def dump_graph(self, writer): + """Dump a DOT representation of the NFA""" + writer('digraph %s_nfa {\n' % self.name) + todo = [self.start] + for i, state in enumerate(todo): + writer(' %d [label="State %d %s"];\n' % (i, i, state is self.end and "(final)" or "")) + for arc in state.arcs: + label = arc.label + next = arc.target + if next in todo: + j = todo.index(next) + else: + j = len(todo) + todo.append(next) + if label is None: + writer(" %d -> %d [style=dotted label=ε];\n" % (i, j)) + else: + writer(" %d -> %d [label=%s];\n" % (i, j, label.replace("'", '"'))) + writer('}\n') + + +class NFAArc: + """An arc representing a transition between two NFA states. + + NFA states can be connected via two ways: + + * A label transition: An input equal to the label must + be consumed to perform the transition. + * An epsilon transition: The transition can be taken without + consuming any input symbol. + + Attributes: + target (NFAState): The ending state of the transition arc. + label (Optional[str]): The label that must be consumed to make + the transition. An epsilon transition is represented + using `None`. + """ + + def __init__(self, target, label): + self.target = target + self.label = label + + def __repr__(self): + return "<%s: %s>" % (self.__class__.__name__, self.label) + + +class NFAState: + """A state of a NFA, non deterministic finite automata. + + Attributes: + target (rule_name): The name of the rule used to represent the NFA's + ending state after a transition. + arcs (Dict[Optional[str], NFAState]): A mapping representing transitions + between the current NFA state and another NFA state via following + a label. + """ + + def __init__(self, rule_name): + self.rule_name = rule_name + self.arcs = [] + + def add_arc(self, target, label=None): + """Add a new arc to connect the state to a target state within the NFA + + The method adds a new arc to the list of arcs available as transitions + from the present state. An optional label indicates a named transition + that consumes an input while the absence of a label represents an epsilon + transition. + + Attributes: + target (NFAState): The end of the transition that the arc represents. + label (Optional[str]): The label that must be consumed for making + the transition. If the label is not provided the transition is assumed + to be an epsilon-transition. + """ + assert label is None or isinstance(label, str) + assert isinstance(target, NFAState) + self.arcs.append(NFAArc(target, label)) + + def __repr__(self): + return "<%s: from %s>" % (self.__class__.__name__, self.rule_name) + + +class DFA: + """A deterministic finite automata + + A deterministic finite automata is a form of a finite state machine + that obeys the following rules: + + * Each of the transitions is uniquely determined by + the source state and input symbol + * Reading an input symbol is required for each state + transition (no epsilon transitions). + + The finite-state machine will accept or reject a string of symbols + and only produces a unique computation of the automaton for each input + string. The DFA must have a unique starting state (represented as the first + element in the list of states) but can have multiple final states. + + Attributes: + name (str): The name of the rule the DFA is representing. + states (List[DFAState]): A collection of DFA states. + """ + + def __init__(self, name, states): + self.name = name + self.states = states + + @classmethod + def from_nfa(cls, nfa): + """Constructs a DFA from a NFA using the Rabin–Scott construction algorithm. + + To simulate the operation of a DFA on a given input string, it's + necessary to keep track of a single state at any time, or more precisely, + the state that the automaton will reach after seeing a prefix of the + input. In contrast, to simulate an NFA, it's necessary to keep track of + a set of states: all of the states that the automaton could reach after + seeing the same prefix of the input, according to the nondeterministic + choices made by the automaton. There are two possible sources of + non-determinism: + + 1) Multiple (one or more) transitions with the same label + + 'A' +-------+ + +----------->+ State +----------->+ + | | 2 | + +-------+ +-------+ + | State | + | 1 | +-------+ + +-------+ | State | + +----------->+ 3 +----------->+ + 'A' +-------+ + + 2) Epsilon transitions (transitions that can be taken without consuming any input) + + +-------+ +-------+ + | State | ε | State | + | 1 +----------->+ 2 +----------->+ + +-------+ +-------+ + + Looking at the first case above, we can't determine which transition should be + followed when given an input A. We could choose whether or not to follow the + transition while in the second case the problem is that we can choose both to + follow the transition or not doing it. To solve this problem we can imagine that + we follow all possibilities at the same time and we construct new states from the + set of all possible reachable states. For every case in the previous example: + + + 1) For multiple transitions with the same label we colapse all of the + final states under the same one + + +-------+ +-------+ + | State | 'A' | State | + | 1 +----------->+ 2-3 +----------->+ + +-------+ +-------+ + + 2) For epsilon transitions we collapse all epsilon-reachable states + into the same one + + +-------+ + | State | + | 1-2 +-----------> + +-------+ + + Because the DFA states consist of sets of NFA states, an n-state NFA + may be converted to a DFA with at most 2**n states. Notice that the + constructed DFA is not minimal and can be simplified or reduced + afterwards. + + Parameters: + name (NFA): The NFA to transform to DFA. + """ + assert isinstance(nfa, NFA) + + def add_closure(nfa_state, base_nfa_set): + """Calculate the epsilon-closure of a given state + + Add to the *base_nfa_set* all the states that are + reachable from *nfa_state* via epsilon-transitions. + """ + assert isinstance(nfa_state, NFAState) + if nfa_state in base_nfa_set: + return + base_nfa_set.add(nfa_state) + for nfa_arc in nfa_state.arcs: + if nfa_arc.label is None: + add_closure(nfa_arc.target, base_nfa_set) + + # Calculate the epsilon-closure of the starting state + base_nfa_set = set() + add_closure(nfa.start, base_nfa_set) + + # Start by visiting the NFA starting state (there is only one). + states = [DFAState(nfa.name, base_nfa_set, nfa.end)] + + for state in states: # NB states grow while we're iterating + + # Find transitions from the current state to other reachable states + # and store them in mapping that correlates the label to all the + # possible reachable states that can be obtained by consuming a + # token equal to the label. Each set of all the states that can + # be reached after following a label will be the a DFA state. + arcs = {} + for nfa_state in state.nfa_set: + for nfa_arc in nfa_state.arcs: + if nfa_arc.label is not None: + nfa_set = arcs.setdefault(nfa_arc.label, set()) + # All states that can be reached by epsilon-transitions + # are also included in the set of reachable states. + add_closure(nfa_arc.target, nfa_set) + + # Now create new DFAs by visiting all posible transitions between + # the current DFA state and the new power-set states (each nfa_set) + # via the different labels. As the nodes are appended to *states* this + # is performing a breadth-first search traversal over the power-set of + # the states of the original NFA. + for label, nfa_set in sorted(arcs.items()): + for exisisting_state in states: + if exisisting_state.nfa_set == nfa_set: + # The DFA state already exists for this rule. + next_state = exisisting_state + break + else: + next_state = DFAState(nfa.name, nfa_set, nfa.end) + states.append(next_state) + + # Add a transition between the current DFA state and the new + # DFA state (the power-set state) via the current label. + state.add_arc(next_state, label) + + return cls(nfa.name, states) + + def __iter__(self): + return iter(self.states) + + def simplify(self): + """Attempt to reduce the number of states of the DFA + + Transform the DFA into an equivalent DFA that has fewer states. Two + classes of states can be removed or merged from the original DFA without + affecting the language it accepts to minimize it: + + * Unreachable states can not be reached from the initial + state of the DFA, for any input string. + * Nondistinguishable states are those that cannot be distinguished + from one another for any input string. + + This algorithm does not achieve the optimal fully-reduced solution, but it + works well enough for the particularities of the Python grammar. The + algorithm repeatedly looks for two states that have the same set of + arcs (same labels pointing to the same nodes) and unifies them, until + things stop changing. + """ + changes = True + while changes: + changes = False + for i, state_i in enumerate(self.states): + for j in range(i + 1, len(self.states)): + state_j = self.states[j] + if state_i == state_j: + del self.states[j] + for state in self.states: + state.unifystate(state_j, state_i) + changes = True + break + + def dump(self, writer=print): + """Dump a graphical representation of the DFA""" + for i, state in enumerate(self.states): + writer(" State", i, state.is_final and "(final)" or "") + for label, next in sorted(state.arcs.items()): + writer(" %s -> %d" % (label, self.states.index(next))) + + def dump_graph(self, writer): + """Dump a DOT representation of the DFA""" + writer('digraph %s_dfa {\n' % self.name) + for i, state in enumerate(self.states): + writer(' %d [label="State %d %s"];\n' % (i, i, state.is_final and "(final)" or "")) + for label, next in sorted(state.arcs.items()): + writer(" %d -> %d [label=%s];\n" % (i, self.states.index(next), label.replace("'", '"'))) + writer('}\n') + + +class DFAState(object): + """A state of a DFA + + Attributes: + rule_name (rule_name): The name of the DFA rule containing the represented state. + nfa_set (Set[NFAState]): The set of NFA states used to create this state. + final (bool): True if the state represents an accepting state of the DFA + containing this state. + arcs (Dict[label, DFAState]): A mapping representing transitions between + the current DFA state and another DFA state via following a label. + """ + + def __init__(self, rule_name, nfa_set, final): + assert isinstance(nfa_set, set) + assert isinstance(next(iter(nfa_set)), NFAState) + assert isinstance(final, NFAState) + self.rule_name = rule_name + self.nfa_set = nfa_set + self.arcs = {} # map from terminals/nonterminals to DFAState + self.is_final = final in nfa_set + + def add_arc(self, target, label): + """Add a new arc to the current state. + + Parameters: + target (DFAState): The DFA state at the end of the arc. + label (str): The label respresenting the token that must be consumed + to perform this transition. + """ + assert isinstance(label, str) + assert label not in self.arcs + assert isinstance(target, DFAState) + self.arcs[label] = target + + def unifystate(self, old, new): + """Replace all arcs from the current node to *old* with *new*. + + Parameters: + old (DFAState): The DFA state to remove from all existing arcs. + new (DFAState): The DFA state to replace in all existing arcs. + """ + for label, next_ in self.arcs.items(): + if next_ is old: + self.arcs[label] = new + + def __eq__(self, other): + # The nfa_set does not matter for equality + assert isinstance(other, DFAState) + if self.is_final != other.is_final: + return False + # We cannot just return self.arcs == other.arcs because that + # would invoke this method recursively if there are any cycles. + if len(self.arcs) != len(other.arcs): + return False + for label, next_ in self.arcs.items(): + if next_ is not other.arcs.get(label): + return False + return True + + __hash__ = None # For Py3 compatibility. + + def __repr__(self): + return "<%s: %s is_final=%s>" % ( + self.__class__.__name__, + self.rule_name, + self.is_final, + ) diff --git a/Parser/pgen/grammar.py b/Parser/pgen/grammar.py index 5cd652426b475573a4fb22588d0742be86193fda..ce40e160ca886a70672b129be9957846d0ec3505 100644 --- a/Parser/pgen/grammar.py +++ b/Parser/pgen/grammar.py @@ -61,13 +61,14 @@ def produce_graminit_h(self, writer): def produce_graminit_c(self, writer): writer("/* Generated by Parser/pgen */\n\n") + writer('#include "exports.h"\n') writer('#include "grammar.h"\n') - writer("grammar _PyParser_Grammar;\n") + writer("Py_EXPORTED_SYMBOL grammar _PyParser_Grammar;\n") self.print_dfas(writer) self.print_labels(writer) - writer("grammar _PyParser_Grammar = {\n") + writer("Py_EXPORTED_SYMBOL grammar _PyParser_Grammar = {\n") writer(" {n_dfas},\n".format(n_dfas=len(self.dfas))) writer(" dfas,\n") writer(" {{{n_labels}, labels}},\n".format(n_labels=len(self.labels))) @@ -76,12 +77,14 @@ def produce_graminit_c(self, writer): def print_labels(self, writer): writer( - "static const label labels[{n_labels}] = {{\n".format(n_labels=len(self.labels)) + "static const label labels[{n_labels}] = {{\n".format( + n_labels=len(self.labels) + ) ) for label, name in self.labels: label_name = '"{}"'.format(name) if name is not None else 0 writer( - ' {{{label}, {label_name}}},\n'.format( + " {{{label}, {label_name}}},\n".format( label=label, label_name=label_name ) ) diff --git a/Parser/pgen/keywordgen.py b/Parser/pgen/keywordgen.py index eeb3ef739fadefcbb0a897020deaba8956f3310c..f0234a81b62da860bf60af7856ea28be3c5cb2bb 100644 --- a/Parser/pgen/keywordgen.py +++ b/Parser/pgen/keywordgen.py @@ -32,17 +32,16 @@ def main(): - parser = argparse.ArgumentParser(description="Generate the Lib/keywords.py " - "file from the grammar.") - parser.add_argument( - "grammar", type=str, help="The file with the grammar definition in EBNF format" + parser = argparse.ArgumentParser( + description="Generate the Lib/keywords.py " "file from the grammar." ) parser.add_argument( - "tokens", type=str, help="The file with the token definitions" + "grammar", type=str, help="The file with the grammar definition in EBNF format" ) + parser.add_argument("tokens", type=str, help="The file with the token definitions") parser.add_argument( "keyword_file", - type=argparse.FileType('w'), + type=argparse.FileType("w"), help="The path to write the keyword definitions", ) args = parser.parse_args() diff --git a/Parser/pgen/metaparser.py b/Parser/pgen/metaparser.py new file mode 100644 index 0000000000000000000000000000000000000000..074a083fb74b8b73592777f35f573b3a0b9de098 --- /dev/null +++ b/Parser/pgen/metaparser.py @@ -0,0 +1,152 @@ +"""Parser for the Python metagrammar""" + +import io +import tokenize # from stdlib + +from .automata import NFA, NFAState + + +class GrammarParser: + """Parser for Python grammar files.""" + + _translation_table = { + tokenize.NAME: "NAME", + tokenize.STRING: "STRING", + tokenize.NEWLINE: "NEWLINE", + tokenize.NL: "NL", + tokenize.OP: "OP", + tokenize.ENDMARKER: "ENDMARKER", + tokenize.COMMENT: "COMMENT", + } + + def __init__(self, grammar): + self.grammar = grammar + grammar_adaptor = io.StringIO(grammar) + self.generator = tokenize.generate_tokens(grammar_adaptor.readline) + self._gettoken() # Initialize lookahead + self._current_rule_name = None + + def parse(self): + """Turn the grammar into a collection of NFAs""" + # grammar: (NEWLINE | rule)* ENDMARKER + while self.type != tokenize.ENDMARKER: + while self.type == tokenize.NEWLINE: + self._gettoken() + # rule: NAME ':' rhs NEWLINE + self._current_rule_name = self._expect(tokenize.NAME) + self._expect(tokenize.OP, ":") + a, z = self._parse_rhs() + self._expect(tokenize.NEWLINE) + + yield NFA(a, z) + + def _parse_rhs(self): + # rhs: items ('|' items)* + a, z = self._parse_items() + if self.value != "|": + return a, z + else: + aa = NFAState(self._current_rule_name) + zz = NFAState(self._current_rule_name) + while True: + # Allow to transit directly to the previous state and connect the end of the + # previous state to the end of the current one, effectively allowing to skip + # the current state. + aa.add_arc(a) + z.add_arc(zz) + if self.value != "|": + break + + self._gettoken() + a, z = self._parse_items() + return aa, zz + + def _parse_items(self): + # items: item+ + a, b = self._parse_item() + while self.type in (tokenize.NAME, tokenize.STRING) or self.value in ("(", "["): + c, d = self._parse_item() + # Allow a transition between the end of the previous state + # and the beginning of the new one, connecting all the items + # together. In this way we can only reach the end if we visit + # all the items. + b.add_arc(c) + b = d + return a, b + + def _parse_item(self): + # item: '[' rhs ']' | atom ['+' | '*'] + if self.value == "[": + self._gettoken() + a, z = self._parse_rhs() + self._expect(tokenize.OP, "]") + # Make a transition from the beginning to the end so it is possible to + # advance for free to the next state of this item # without consuming + # anything from the rhs. + a.add_arc(z) + return a, z + else: + a, z = self._parse_atom() + value = self.value + if value not in ("+", "*"): + return a, z + self._gettoken() + z.add_arc(a) + if value == "+": + # Create a cycle to the beginning so we go back to the old state in this + # item and repeat. + return a, z + else: + # The end state is the same as the beginning, so we can cycle arbitrarily + # and end in the beginning if necessary. + return a, a + + def _parse_atom(self): + # atom: '(' rhs ')' | NAME | STRING + if self.value == "(": + self._gettoken() + a, z = self._parse_rhs() + self._expect(tokenize.OP, ")") + return a, z + elif self.type in (tokenize.NAME, tokenize.STRING): + a = NFAState(self._current_rule_name) + z = NFAState(self._current_rule_name) + # We can transit to the next state only if we consume the value. + a.add_arc(z, self.value) + self._gettoken() + return a, z + else: + self._raise_error( + "expected (...) or NAME or STRING, got {} ({})", + self._translation_table.get(self.type, self.type), + self.value, + ) + + def _expect(self, type_, value=None): + if self.type != type_: + self._raise_error( + "expected {}, got {} ({})", + self._translation_table.get(type_, type_), + self._translation_table.get(self.type, self.type), + self.value, + ) + if value is not None and self.value != value: + self._raise_error("expected {}, got {}", value, self.value) + value = self.value + self._gettoken() + return value + + def _gettoken(self): + tup = next(self.generator) + while tup[0] in (tokenize.COMMENT, tokenize.NL): + tup = next(self.generator) + self.type, self.value, self.begin, self.end, self.line = tup + + def _raise_error(self, msg, *args): + if args: + try: + msg = msg.format(*args) + except Exception: + msg = " ".join([msg] + list(map(str, args))) + line = self.grammar.splitlines()[self.begin[0] - 1] + raise SyntaxError(msg, ("", self.begin[0], self.begin[1], line)) diff --git a/Parser/pgen/pgen.py b/Parser/pgen/pgen.py index d52d58f64e41cc6c9c14aac87130cea430f44c43..03032d4ed8ccf222bc8e2fc5fe116145d2115de1 100644 --- a/Parser/pgen/pgen.py +++ b/Parser/pgen/pgen.py @@ -1,42 +1,185 @@ +"""Python parser generator + + +This parser generator transforms a Python grammar file into parsing tables +that can be consumed by Python's LL(1) parser written in C. + +Concepts +-------- + +* An LL(1) parser (Left-to-right, Leftmost derivation, 1 token-lookahead) is a + top-down parser for a subset of context-free languages. It parses the input + from Left to right, performing Leftmost derivation of the sentence, and can + only use 1 token of lookahead when parsing a sentence. + +* A parsing table is a collection of data that a generic implementation of the + LL(1) parser consumes to know how to parse a given context-free grammar. In + this case the collection of data involves Deterministic Finite Automatons, + calculated first sets, keywords and transition labels. + +* A grammar is defined by production rules (or just 'productions') that specify + which symbols may replace which other symbols; these rules may be used to + generate strings, or to parse them. Each such rule has a head, or left-hand + side, which consists of the string that may be replaced, and a body, or + right-hand side, which consists of a string that may replace it. In the + Python grammar, rules are written in the form + + rule_name: rule_description; + + meaning the rule 'a: b' specifies that a can be replaced by b. A context-free + grammar is a grammar in which the left-hand side of each production rule + consists of only a single nonterminal symbol. Context-free grammars can + always be recognized by a Non-Deterministic Automatons. + +* Terminal symbols are literal symbols which may appear in the outputs of the + production rules of the grammar and which cannot be changed using the rules + of the grammar. Applying the rules recursively to a source string of symbols + will usually terminate in a final output string consisting only of terminal + symbols. + +* Nonterminal symbols are those symbols which can be replaced. The grammar + includes a start symbol a designated member of the set of nonterminals from + which all the strings in the language may be derived by successive + applications of the production rules. + +* The language defined by the grammar is defined as the set of terminal strings + that can be derived using the production rules. + +* The first sets of a rule (FIRST(rule)) are defined to be the set of terminals + that can appear in the first position of any string derived from the rule. + This is useful for LL(1) parsers as the parser is only allowed to look at the + next token in the input to know which rule needs to parse. For example, given + this grammar: + + start: '(' A | B ')' + A: 'a' '<' + B: 'b' '<' + + and the input '(b<)' the parser can only look at 'b' to know if it needs + to parse A o B. Because FIRST(A) = {'a'} and FIRST(B) = {'b'} it knows + that needs to continue parsing rule B because only that rule can start + with 'b'. + +Description +----------- + +The input for the parser generator is a grammar in extended BNF form (using * +for repetition, + for at-least-once repetition, [] for optional parts, | for +alternatives and () for grouping). + +Each rule in the grammar file is considered as a regular expression in its +own right. It is turned into a Non-deterministic Finite Automaton (NFA), +which is then turned into a Deterministic Finite Automaton (DFA), which is +then optimized to reduce the number of states. See [Aho&Ullman 77] chapter 3, +or similar compiler books (this technique is more often used for lexical +analyzers). + +The DFA's are used by the parser as parsing tables in a special way that's +probably unique. Before they are usable, the FIRST sets of all non-terminals +are computed so the LL(1) parser consuming the parsing tables can distinguish +between different transitions. +Reference +--------- + +[Aho&Ullman 77] + Aho&Ullman, Principles of Compiler Design, Addison-Wesley 1977 + (first edition) +""" + +from ast import literal_eval import collections -import tokenize # from stdlib from . import grammar, token +from .automata import DFA +from .metaparser import GrammarParser +import enum -class ParserGenerator(object): - def __init__(self, grammar_file, token_file, stream=None, verbose=False): - close_stream = None - if stream is None: - stream = open(grammar_file) - close_stream = stream.close +class LabelType(enum.Enum): + NONTERMINAL = 0 + NAMED_TOKEN = 1 + KEYWORD = 2 + OPERATOR = 3 + NONE = 4 + + +class Label(str): + def __init__(self, value): + self.type = self._get_type() + + def _get_type(self): + if self[0].isalpha(): + if self.upper() == self: + # NAMED tokens (ASYNC, NAME...) are all uppercase by convention + return LabelType.NAMED_TOKEN + else: + # If is not uppercase it must be a non terminal. + return LabelType.NONTERMINAL + else: + # Keywords and operators are wrapped in quotes + assert self[0] == self[-1] in ('"', "'"), self + value = literal_eval(self) + if value[0].isalpha(): + return LabelType.KEYWORD + else: + return LabelType.OPERATOR + + def __repr__(self): + return "{}({})".format(self.type, super().__repr__()) + + +class ParserGenerator(object): + def __init__(self, grammar_file, token_file, verbose=False, graph_file=None): + with open(grammar_file) as f: + self.grammar = f.read() with open(token_file) as tok_file: token_lines = tok_file.readlines() self.tokens = dict(token.generate_tokens(token_lines)) self.opmap = dict(token.generate_opmap(token_lines)) # Manually add <> so it does not collide with != - self.opmap['<>'] = "NOTEQUAL" + self.opmap["<>"] = "NOTEQUAL" self.verbose = verbose self.filename = grammar_file - self.stream = stream - self.generator = tokenize.generate_tokens(stream.readline) - self.gettoken() # Initialize lookahead - self.dfas, self.startsymbol = self.parse() - if close_stream is not None: - close_stream() - self.first = {} # map from symbol name to set of tokens - self.addfirstsets() + self.graph_file = graph_file + self.dfas, self.startsymbol = self.create_dfas() + self.first = {} # map from symbol name to set of tokens + self.calculate_first_sets() + + def create_dfas(self): + rule_to_dfas = collections.OrderedDict() + start_nonterminal = None + for nfa in GrammarParser(self.grammar).parse(): + if self.verbose: + print("Dump of NFA for", nfa.name) + nfa.dump() + if self.graph_file is not None: + nfa.dump_graph(self.graph_file.write) + dfa = DFA.from_nfa(nfa) + if self.verbose: + print("Dump of DFA for", dfa.name) + dfa.dump() + dfa.simplify() + if self.graph_file is not None: + dfa.dump_graph(self.graph_file.write) + rule_to_dfas[dfa.name] = dfa + + if start_nonterminal is None: + start_nonterminal = dfa.name + + return rule_to_dfas, start_nonterminal def make_grammar(self): c = grammar.Grammar() + c.all_labels = set() names = list(self.dfas.keys()) names.remove(self.startsymbol) names.insert(0, self.startsymbol) for name in names: i = 256 + len(c.symbol2number) - c.symbol2number[name] = i - c.number2symbol[i] = name + c.symbol2number[Label(name)] = i + c.number2symbol[i] = Label(name) + c.all_labels.add(name) for name in names: self.make_label(c, name) dfa = self.dfas[name] @@ -44,12 +187,13 @@ def make_grammar(self): for state in dfa: arcs = [] for label, next in sorted(state.arcs.items()): - arcs.append((self.make_label(c, label), dfa.index(next))) - if state.isfinal: - arcs.append((0, dfa.index(state))) + c.all_labels.add(label) + arcs.append((self.make_label(c, label), dfa.states.index(next))) + if state.is_final: + arcs.append((0, dfa.states.index(state))) states.append(arcs) c.states.append(states) - c.dfas[c.symbol2number[name]] = (states, self.make_first(c, name)) + c.dfas[c.symbol2number[name]] = (states, self.make_first_sets(c, name)) c.start = c.symbol2number[self.startsymbol] if self.verbose: @@ -68,7 +212,7 @@ def make_grammar(self): ) return c - def make_first(self, c, name): + def make_first_sets(self, c, name): rawfirst = self.first[name] first = set() for label in sorted(rawfirst): @@ -78,67 +222,65 @@ def make_first(self, c, name): return first def make_label(self, c, label): - # XXX Maybe this should be a method on a subclass of converter? + label = Label(label) ilabel = len(c.labels) - if label[0].isalpha(): - # Either a symbol name or a named token - if label in c.symbol2number: - # A symbol name (a non-terminal) - if label in c.symbol2label: - return c.symbol2label[label] - else: - c.labels.append((c.symbol2number[label], None)) - c.symbol2label[label] = ilabel - return ilabel + + if label.type == LabelType.NONTERMINAL: + if label in c.symbol2label: + return c.symbol2label[label] else: - # A named token (NAME, NUMBER, STRING) - itoken = self.tokens.get(label, None) - assert isinstance(itoken, int), label - assert itoken in self.tokens.values(), label - if itoken in c.tokens: - return c.tokens[itoken] - else: - c.labels.append((itoken, None)) - c.tokens[itoken] = ilabel - return ilabel - else: - # Either a keyword or an operator - assert label[0] in ('"', "'"), label - value = eval(label) - if value[0].isalpha(): - # A keyword - if value in c.keywords: - return c.keywords[value] - else: - c.labels.append((self.tokens["NAME"], value)) - c.keywords[value] = ilabel - return ilabel + c.labels.append((c.symbol2number[label], None)) + c.symbol2label[label] = ilabel + return ilabel + elif label.type == LabelType.NAMED_TOKEN: + # A named token (NAME, NUMBER, STRING) + itoken = self.tokens.get(label, None) + assert isinstance(itoken, int), label + assert itoken in self.tokens.values(), label + if itoken in c.tokens: + return c.tokens[itoken] else: - # An operator (any non-numeric token) - tok_name = self.opmap[value] # Fails if unknown token - itoken = self.tokens[tok_name] - if itoken in c.tokens: - return c.tokens[itoken] - else: - c.labels.append((itoken, None)) - c.tokens[itoken] = ilabel - return ilabel + c.labels.append((itoken, None)) + c.tokens[itoken] = ilabel + return ilabel + elif label.type == LabelType.KEYWORD: + # A keyword + value = literal_eval(label) + if value in c.keywords: + return c.keywords[value] + else: + c.labels.append((self.tokens["NAME"], value)) + c.keywords[value] = ilabel + return ilabel + elif label.type == LabelType.OPERATOR: + # An operator (any non-numeric token) + value = literal_eval(label) + tok_name = self.opmap[value] # Fails if unknown token + itoken = self.tokens[tok_name] + if itoken in c.tokens: + return c.tokens[itoken] + else: + c.labels.append((itoken, None)) + c.tokens[itoken] = ilabel + return ilabel + else: + raise ValueError("Cannot categorize label {}".format(label)) - def addfirstsets(self): + def calculate_first_sets(self): names = list(self.dfas.keys()) for name in names: if name not in self.first: - self.calcfirst(name) + self.calculate_first_sets_for_rule(name) if self.verbose: print("First set for {dfa_name}".format(dfa_name=name)) for item in self.first[name]: print(" - {terminal}".format(terminal=item)) - def calcfirst(self, name): + def calculate_first_sets_for_rule(self, name): dfa = self.dfas[name] - self.first[name] = None # dummy to detect left recursion - state = dfa[0] + self.first[name] = None # dummy to detect left recursion + state = dfa.states[0] totalset = set() overlapcheck = {} for label, next in state.arcs.items(): @@ -148,7 +290,7 @@ def calcfirst(self, name): if fset is None: raise ValueError("recursion for rule %r" % name) else: - self.calcfirst(label) + self.calculate_first_sets_for_rule(label) fset = self.first[label] totalset.update(fset) overlapcheck[label] = fset @@ -159,248 +301,10 @@ def calcfirst(self, name): for label, itsfirst in overlapcheck.items(): for symbol in itsfirst: if symbol in inverse: - raise ValueError("rule %s is ambiguous; %s is in the" - " first sets of %s as well as %s" % - (name, symbol, label, inverse[symbol])) + raise ValueError( + "rule %s is ambiguous; %s is in the" + " first sets of %s as well as %s" + % (name, symbol, label, inverse[symbol]) + ) inverse[symbol] = label self.first[name] = totalset - - def parse(self): - dfas = collections.OrderedDict() - startsymbol = None - # MSTART: (NEWLINE | RULE)* ENDMARKER - while self.type != tokenize.ENDMARKER: - while self.type == tokenize.NEWLINE: - self.gettoken() - # RULE: NAME ':' RHS NEWLINE - name = self.expect(tokenize.NAME) - if self.verbose: - print("Processing rule {dfa_name}".format(dfa_name=name)) - self.expect(tokenize.OP, ":") - a, z = self.parse_rhs() - self.expect(tokenize.NEWLINE) - if self.verbose: - self.dump_nfa(name, a, z) - dfa = self.make_dfa(a, z) - if self.verbose: - self.dump_dfa(name, dfa) - self.simplify_dfa(dfa) - dfas[name] = dfa - if startsymbol is None: - startsymbol = name - return dfas, startsymbol - - def make_dfa(self, start, finish): - # To turn an NFA into a DFA, we define the states of the DFA - # to correspond to *sets* of states of the NFA. Then do some - # state reduction. Let's represent sets as dicts with 1 for - # values. - assert isinstance(start, NFAState) - assert isinstance(finish, NFAState) - def closure(state): - base = set() - addclosure(state, base) - return base - def addclosure(state, base): - assert isinstance(state, NFAState) - if state in base: - return - base.add(state) - for label, next in state.arcs: - if label is None: - addclosure(next, base) - states = [DFAState(closure(start), finish)] - for state in states: # NB states grows while we're iterating - arcs = {} - for nfastate in state.nfaset: - for label, next in nfastate.arcs: - if label is not None: - addclosure(next, arcs.setdefault(label, set())) - for label, nfaset in sorted(arcs.items()): - for st in states: - if st.nfaset == nfaset: - break - else: - st = DFAState(nfaset, finish) - states.append(st) - state.addarc(st, label) - return states # List of DFAState instances; first one is start - - def dump_nfa(self, name, start, finish): - print("Dump of NFA for", name) - todo = [start] - for i, state in enumerate(todo): - print(" State", i, state is finish and "(final)" or "") - for label, next in state.arcs: - if next in todo: - j = todo.index(next) - else: - j = len(todo) - todo.append(next) - if label is None: - print(" -> %d" % j) - else: - print(" %s -> %d" % (label, j)) - - def dump_dfa(self, name, dfa): - print("Dump of DFA for", name) - for i, state in enumerate(dfa): - print(" State", i, state.isfinal and "(final)" or "") - for label, next in sorted(state.arcs.items()): - print(" %s -> %d" % (label, dfa.index(next))) - - def simplify_dfa(self, dfa): - # This is not theoretically optimal, but works well enough. - # Algorithm: repeatedly look for two states that have the same - # set of arcs (same labels pointing to the same nodes) and - # unify them, until things stop changing. - - # dfa is a list of DFAState instances - changes = True - while changes: - changes = False - for i, state_i in enumerate(dfa): - for j in range(i+1, len(dfa)): - state_j = dfa[j] - if state_i == state_j: - #print " unify", i, j - del dfa[j] - for state in dfa: - state.unifystate(state_j, state_i) - changes = True - break - - def parse_rhs(self): - # RHS: ALT ('|' ALT)* - a, z = self.parse_alt() - if self.value != "|": - return a, z - else: - aa = NFAState() - zz = NFAState() - aa.addarc(a) - z.addarc(zz) - while self.value == "|": - self.gettoken() - a, z = self.parse_alt() - aa.addarc(a) - z.addarc(zz) - return aa, zz - - def parse_alt(self): - # ALT: ITEM+ - a, b = self.parse_item() - while (self.value in ("(", "[") or - self.type in (tokenize.NAME, tokenize.STRING)): - c, d = self.parse_item() - b.addarc(c) - b = d - return a, b - - def parse_item(self): - # ITEM: '[' RHS ']' | ATOM ['+' | '*'] - if self.value == "[": - self.gettoken() - a, z = self.parse_rhs() - self.expect(tokenize.OP, "]") - a.addarc(z) - return a, z - else: - a, z = self.parse_atom() - value = self.value - if value not in ("+", "*"): - return a, z - self.gettoken() - z.addarc(a) - if value == "+": - return a, z - else: - return a, a - - def parse_atom(self): - # ATOM: '(' RHS ')' | NAME | STRING - if self.value == "(": - self.gettoken() - a, z = self.parse_rhs() - self.expect(tokenize.OP, ")") - return a, z - elif self.type in (tokenize.NAME, tokenize.STRING): - a = NFAState() - z = NFAState() - a.addarc(z, self.value) - self.gettoken() - return a, z - else: - self.raise_error("expected (...) or NAME or STRING, got %s/%s", - self.type, self.value) - - def expect(self, type, value=None): - if self.type != type or (value is not None and self.value != value): - self.raise_error("expected %s/%s, got %s/%s", - type, value, self.type, self.value) - value = self.value - self.gettoken() - return value - - def gettoken(self): - tup = next(self.generator) - while tup[0] in (tokenize.COMMENT, tokenize.NL): - tup = next(self.generator) - self.type, self.value, self.begin, self.end, self.line = tup - # print(getattr(tokenize, 'tok_name')[self.type], repr(self.value)) - - def raise_error(self, msg, *args): - if args: - try: - msg = msg % args - except Exception: - msg = " ".join([msg] + list(map(str, args))) - raise SyntaxError(msg, (self.filename, self.end[0], - self.end[1], self.line)) - -class NFAState(object): - - def __init__(self): - self.arcs = [] # list of (label, NFAState) pairs - - def addarc(self, next, label=None): - assert label is None or isinstance(label, str) - assert isinstance(next, NFAState) - self.arcs.append((label, next)) - -class DFAState(object): - - def __init__(self, nfaset, final): - assert isinstance(nfaset, set) - assert isinstance(next(iter(nfaset)), NFAState) - assert isinstance(final, NFAState) - self.nfaset = nfaset - self.isfinal = final in nfaset - self.arcs = {} # map from label to DFAState - - def addarc(self, next, label): - assert isinstance(label, str) - assert label not in self.arcs - assert isinstance(next, DFAState) - self.arcs[label] = next - - def unifystate(self, old, new): - for label, next in self.arcs.items(): - if next is old: - self.arcs[label] = new - - def __eq__(self, other): - # Equality test -- ignore the nfaset instance variable - assert isinstance(other, DFAState) - if self.isfinal != other.isfinal: - return False - # Can't just return self.arcs == other.arcs, because that - # would invoke this method recursively, with cycles... - if len(self.arcs) != len(other.arcs): - return False - for label, next in self.arcs.items(): - if next is not other.arcs.get(label): - return False - return True - - __hash__ = None # For Py3 compatibility. diff --git a/Parser/pgen/token.py b/Parser/pgen/token.py index 008e241e175e7f9da94899dcf9b4994db85c8c53..2cff62ce3b23e0004d2cadaacb84ac9ff8acef57 100644 --- a/Parser/pgen/token.py +++ b/Parser/pgen/token.py @@ -6,25 +6,21 @@ def generate_tokens(tokens): for line in tokens: line = line.strip() - if not line: - continue - if line.strip().startswith('#'): + if not line or line.startswith("#"): continue name = line.split()[0] yield (name, next(numbers)) - yield ('N_TOKENS', next(numbers)) - yield ('NT_OFFSET', 256) + yield ("N_TOKENS", next(numbers)) + yield ("NT_OFFSET", 256) def generate_opmap(tokens): for line in tokens: line = line.strip() - if not line: - continue - if line.strip().startswith('#'): + if not line or line.startswith("#"): continue pieces = line.split() @@ -39,4 +35,4 @@ def generate_opmap(tokens): # with the token generation in "generate_tokens" because if this # symbol is included in Grammar/Tokens, it will collide with != # as it has the same name (NOTEQUAL). - yield ('<>', 'NOTEQUAL') + yield ("<>", "NOTEQUAL") diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index aecbcebb917e8370327940e7a98b40684ad5d303..f3c1d9b20ade112743ec005d9e0c6b0bf0ef8b92 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -32,10 +32,6 @@ || c == '_'\ || (c >= 128)) -extern char *PyOS_Readline(FILE *, FILE *, const char *); -/* Return malloc'ed string including trailing \n; - empty malloc'ed string for EOF; - NULL if interrupted */ /* Don't ever change this -- it would break the portability of Python code */ #define TABSIZE 8 @@ -59,7 +55,9 @@ tok_new(void) sizeof(struct tok_state)); if (tok == NULL) return NULL; - tok->buf = tok->cur = tok->end = tok->inp = tok->start = NULL; + tok->buf = tok->cur = tok->inp = NULL; + tok->start = NULL; + tok->end = NULL; tok->done = E_OK; tok->fp = NULL; tok->input = NULL; @@ -111,7 +109,9 @@ error_ret(struct tok_state *tok) /* XXX */ tok->decoding_erred = 1; if (tok->fp != NULL && tok->buf != NULL) /* see PyTokenizer_Free */ PyMem_FREE(tok->buf); - tok->buf = tok->cur = tok->end = tok->inp = tok->start = NULL; + tok->buf = tok->cur = tok->inp = NULL; + tok->start = NULL; + tok->end = NULL; tok->done = E_DECODE; return NULL; /* as if it were EOF */ } @@ -664,11 +664,11 @@ translate_newlines(const char *s, int exec_input, struct tok_state *tok) { Look for encoding declarations inside STR, and record them inside TOK. */ -static const char * +static char * decode_str(const char *input, int single, struct tok_state *tok) { PyObject* utf8 = NULL; - const char *str; + char *str; const char *s; const char *newl[2] = {NULL, NULL}; int lineno = 0; @@ -726,16 +726,18 @@ struct tok_state * PyTokenizer_FromString(const char *str, int exec_input) { struct tok_state *tok = tok_new(); + char *decoded; + if (tok == NULL) return NULL; - str = decode_str(str, exec_input, tok); - if (str == NULL) { + decoded = decode_str(str, exec_input, tok); + if (decoded == NULL) { PyTokenizer_Free(tok); return NULL; } - /* XXX: constify members. */ - tok->buf = tok->cur = tok->end = tok->inp = (char*)str; + tok->buf = tok->cur = tok->inp = decoded; + tok->end = decoded; return tok; } @@ -743,17 +745,18 @@ struct tok_state * PyTokenizer_FromUTF8(const char *str, int exec_input) { struct tok_state *tok = tok_new(); + char *translated; if (tok == NULL) return NULL; - tok->input = str = translate_newlines(str, exec_input, tok); - if (str == NULL) { + tok->input = translated = translate_newlines(str, exec_input, tok); + if (translated == NULL) { PyTokenizer_Free(tok); return NULL; } tok->decoding_state = STATE_RAW; tok->read_coding_spec = 1; tok->enc = NULL; - tok->str = str; + tok->str = translated; tok->encoding = (char *)PyMem_MALLOC(6); if (!tok->encoding) { PyTokenizer_Free(tok); @@ -761,8 +764,8 @@ PyTokenizer_FromUTF8(const char *str, int exec_input) } strcpy(tok->encoding, "utf-8"); - /* XXX: constify members. */ - tok->buf = tok->cur = tok->end = tok->inp = (char*)str; + tok->buf = tok->cur = tok->inp = translated; + tok->end = translated; return tok; } @@ -812,7 +815,7 @@ PyTokenizer_Free(struct tok_state *tok) if (tok->fp != NULL && tok->buf != NULL) PyMem_FREE(tok->buf); if (tok->input) - PyMem_FREE((char *)tok->input); + PyMem_FREE(tok->input); PyMem_FREE(tok); } @@ -1024,10 +1027,12 @@ static void tok_backup(struct tok_state *tok, int c) { if (c != EOF) { - if (--tok->cur < tok->buf) - Py_FatalError("tok_backup: beginning of buffer"); - if (*tok->cur != c) + if (--tok->cur < tok->buf) { + Py_FatalError("tokenizer beginning of buffer"); + } + if (*tok->cur != c) { *tok->cur = c; + } } } @@ -1092,24 +1097,53 @@ static int verify_identifier(struct tok_state *tok) { PyObject *s; - int result; if (tok->decoding_erred) return 0; s = PyUnicode_DecodeUTF8(tok->start, tok->cur - tok->start, NULL); if (s == NULL) { if (PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) { - PyErr_Clear(); - tok->done = E_IDENTIFIER; - } else { + tok->done = E_DECODE; + } + else { tok->done = E_ERROR; } return 0; } - result = PyUnicode_IsIdentifier(s); + Py_ssize_t invalid = _PyUnicode_ScanIdentifier(s); + if (invalid < 0) { + Py_DECREF(s); + tok->done = E_ERROR; + return 0; + } + assert(PyUnicode_GET_LENGTH(s) > 0); + if (invalid < PyUnicode_GET_LENGTH(s)) { + Py_UCS4 ch = PyUnicode_READ_CHAR(s, invalid); + if (invalid + 1 < PyUnicode_GET_LENGTH(s)) { + /* Determine the offset in UTF-8 encoded input */ + Py_SETREF(s, PyUnicode_Substring(s, 0, invalid + 1)); + if (s != NULL) { + Py_SETREF(s, PyUnicode_AsUTF8String(s)); + } + if (s == NULL) { + tok->done = E_ERROR; + return 0; + } + tok->cur = (char *)tok->start + PyBytes_GET_SIZE(s); + } + Py_DECREF(s); + // PyUnicode_FromFormatV() does not support %X + char hex[9]; + (void)PyOS_snprintf(hex, sizeof(hex), "%04X", ch); + if (Py_UNICODE_ISPRINTABLE(ch)) { + syntaxerror(tok, "invalid character '%c' (U+%s)", ch, hex); + } + else { + syntaxerror(tok, "invalid non-printable character U+%s", hex); + } + return 0; + } Py_DECREF(s); - if (result == 0) - tok->done = E_IDENTIFIER; - return result; + return 1; } static int @@ -1137,7 +1171,7 @@ tok_decimal_tail(struct tok_state *tok) /* Get next token, after space stripping etc. */ static int -tok_get(struct tok_state *tok, char **p_start, char **p_end) +tok_get(struct tok_state *tok, const char **p_start, const char **p_end) { int c; int blankline, nonascii; @@ -1169,8 +1203,9 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) } } tok_backup(tok, c); - if (c == '#' || c == '\n') { + if (c == '#' || c == '\n' || c == '\\') { /* Lines with only whitespace and/or comments + and/or a line continuation character shouldn't affect the indentation and are not passed to the parser as NEWLINE tokens, except *totally* empty lines in interactive @@ -1320,7 +1355,7 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) && ((unsigned char)ignore_end[0] >= 128 || Py_ISALNUM(ignore_end[0])))); if (is_type_ignore) { - *p_start = (char *) ignore_end; + *p_start = ignore_end; *p_end = tok->cur; /* If this type ignore is the only thing on the line, consume the newline also. */ @@ -1330,7 +1365,7 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) } return TYPE_IGNORE; } else { - *p_start = (char *) type_start; /* after type_comment_prefix */ + *p_start = type_start; /* after type_comment_prefix */ *p_end = tok->cur; return TYPE_COMMENT; } @@ -1382,6 +1417,7 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) if (nonascii && !verify_identifier(tok)) { return ERRORTOKEN; } + *p_start = tok->start; *p_end = tok->cur; @@ -1409,7 +1445,8 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) Look ahead one token to see if that is 'def'. */ struct tok_state ahead_tok; - char *ahead_tok_start = NULL, *ahead_tok_end = NULL; + const char *ahead_tok_start = NULL; + const char *ahead_tok_end = NULL; int ahead_tok_kind; memcpy(&ahead_tok, tok, sizeof(ahead_tok)); @@ -1797,7 +1834,7 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) } int -PyTokenizer_Get(struct tok_state *tok, char **p_start, char **p_end) +PyTokenizer_Get(struct tok_state *tok, const char **p_start, const char **p_end) { int result = tok_get(tok, p_start, p_end); if (tok->decoding_erred) { @@ -1822,7 +1859,9 @@ PyTokenizer_FindEncodingFilename(int fd, PyObject *filename) { struct tok_state *tok; FILE *fp; - char *p_start =NULL , *p_end =NULL , *encoding = NULL; + const char *p_start = NULL; + const char *p_end = NULL; + char *encoding = NULL; fd = _Py_dup(fd); if (fd < 0) { diff --git a/Parser/tokenizer.h b/Parser/tokenizer.h index 92669bfd8a1607fbe450ee9f904f949dac9075f4..5660ea38e9443d44f0b2729ce2a927d4a7ffea80 100644 --- a/Parser/tokenizer.h +++ b/Parser/tokenizer.h @@ -26,8 +26,8 @@ struct tok_state { char *buf; /* Input buffer, or NULL; malloc'ed if fp != NULL */ char *cur; /* Next character in buffer */ char *inp; /* End of data in buffer */ - char *end; /* End of input buffer if buf != NULL */ - char *start; /* Start of current token if not NULL */ + const char *end; /* End of input buffer if buf != NULL */ + const char *start; /* Start of current token if not NULL */ int done; /* E_OK normally, E_EOF at EOF, otherwise error code */ /* NB If done != E_OK, cur must be == inp!!! */ FILE *fp; /* Rest of input; NULL if tokenizing a string */ @@ -60,8 +60,8 @@ struct tok_state { PyObject *decoding_readline; /* open(...).readline */ PyObject *decoding_buffer; const char* enc; /* Encoding for the current str. */ - const char* str; - const char* input; /* Tokenizer's newline translated copy of the string. */ + char* str; + char* input; /* Tokenizer's newline translated copy of the string. */ int type_comments; /* Whether to look for type comments */ @@ -78,7 +78,7 @@ extern struct tok_state *PyTokenizer_FromUTF8(const char *, int); extern struct tok_state *PyTokenizer_FromFile(FILE *, const char*, const char *, const char *); extern void PyTokenizer_Free(struct tok_state *); -extern int PyTokenizer_Get(struct tok_state *, char **, char **); +extern int PyTokenizer_Get(struct tok_state *, const char **, const char **); #define tok_dump _Py_tok_dump diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 460d70ccadefd5ea78aba3b42f27017effbe8116..3bf0c37a47209eaa3e41d449f69368660a464056 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -6,10 +6,9 @@ #undef NDEBUG #include -#include "pycore_initconfig.h" /* _PyConfig_InitCompatConfig() */ -#include "pycore_pystate.h" /* _PyRuntime */ +#include "pycore_initconfig.h" // _PyConfig_InitCompatConfig() +#include "pycore_runtime.h" // _PyRuntime #include -#include "pythread.h" #include #include #include @@ -62,7 +61,6 @@ static int test_repeated_init_and_subinterpreters(void) _testembed_Py_Initialize(); mainstate = PyThreadState_Get(); - PyEval_InitThreads(); PyEval_ReleaseThread(mainstate); gilstate = PyGILState_Ensure(); @@ -252,9 +250,8 @@ static int test_bpo20891(void) /* the test doesn't support custom memory allocators */ putenv("PYTHONMALLOC="); - /* bpo-20891: Calling PyGILState_Ensure in a non-Python thread before - calling PyEval_InitThreads() must not crash. PyGILState_Ensure() must - call PyEval_InitThreads() for us in this case. */ + /* bpo-20891: Calling PyGILState_Ensure in a non-Python thread must not + crash. */ PyThread_type_lock lock = PyThread_allocate_lock(); if (!lock) { fprintf(stderr, "PyThread_allocate_lock failed!"); @@ -488,6 +485,9 @@ static int test_init_from_config(void) config.install_signal_handlers = 0; + putenv("PYTHONOLDPARSER=1"); + config._use_peg_parser = 0; + /* FIXME: test use_environment */ putenv("PYTHONHASHSEED=42"); @@ -506,7 +506,6 @@ static int test_init_from_config(void) config.import_time = 1; config.show_ref_count = 1; - config.show_alloc_count = 1; /* FIXME: test dump_refs: bpo-34223 */ putenv("PYTHONMALLOCSTATS=0"); @@ -549,6 +548,13 @@ static int test_init_from_config(void) /* FIXME: test home */ /* FIXME: test path config: module_search_path .. dll_path */ + putenv("PYTHONPLATLIBDIR=env_platlibdir"); + status = PyConfig_SetBytesString(&config, &config.platlibdir, "my_platlibdir"); + if (PyStatus_Exception(status)) { + PyConfig_Clear(&config); + Py_ExitStatusException(status); + } + putenv("PYTHONVERBOSE=0"); Py_VerboseFlag = 0; config.verbose = 1; @@ -604,6 +610,8 @@ static int test_init_from_config(void) Py_FrozenFlag = 0; config.pathconfig_warnings = 0; + config._isolated_interpreter = 1; + init_from_config_clear(&config); dump_config(); @@ -666,6 +674,8 @@ static void set_most_env_vars(void) putenv("PYTHONNOUSERSITE=1"); putenv("PYTHONFAULTHANDLER=1"); putenv("PYTHONIOENCODING=iso8859-1:replace"); + putenv("PYTHONOLDPARSER=1"); + putenv("PYTHONPLATLIBDIR=env_platlibdir"); } @@ -1332,6 +1342,7 @@ static int test_init_read_set(void) return 0; fail: + PyConfig_Clear(&config); Py_ExitStatusException(status); } @@ -1590,6 +1601,46 @@ static int test_run_main(void) } +static int test_get_argc_argv(void) +{ + PyConfig config; + PyConfig_InitPythonConfig(&config); + + wchar_t *argv[] = {L"python3", L"-c", + (L"import sys; " + L"print(f'Py_RunMain(): sys.argv={sys.argv}')"), + L"arg2"}; + config_set_argv(&config, Py_ARRAY_LENGTH(argv), argv); + config_set_string(&config, &config.program_name, L"./python3"); + + // Calling PyConfig_Read() twice must not change Py_GetArgcArgv() result. + // The second call is done by Py_InitializeFromConfig(). + PyStatus status = PyConfig_Read(&config); + if (PyStatus_Exception(status)) { + PyConfig_Clear(&config); + Py_ExitStatusException(status); + } + + init_from_config_clear(&config); + + int get_argc; + wchar_t **get_argv; + Py_GetArgcArgv(&get_argc, &get_argv); + printf("argc: %i\n", get_argc); + assert(get_argc == Py_ARRAY_LENGTH(argv)); + for (int i=0; i < get_argc; i++) { + printf("argv[%i]: %ls\n", i, get_argv[i]); + assert(wcscmp(get_argv[i], argv[i]) == 0); + } + + Py_Finalize(); + + printf("\n"); + printf("test ok\n"); + return 0; +} + + /* ********************************************************* * List of test cases and the function that implements it. * @@ -1647,6 +1698,7 @@ static struct TestCase TestCases[] = { {"test_init_setpythonhome", test_init_setpythonhome}, {"test_init_warnoptions", test_init_warnoptions}, {"test_run_main", test_run_main}, + {"test_get_argc_argv", test_get_argc_argv}, {"test_open_code_hook", test_open_code_hook}, {"test_audit", test_audit}, diff --git a/Programs/python.c b/Programs/python.c index 1cc3c42cfcbf9323c93134c039666be895198bbd..84148f7767a7e3c4bc2c4f36c996931e3bbac184 100644 --- a/Programs/python.c +++ b/Programs/python.c @@ -1,7 +1,6 @@ /* Minimal main program -- everything is loaded from the library */ #include "Python.h" -#include "pycore_pylifecycle.h" #ifdef MS_WINDOWS int diff --git a/Python/Python-ast.c b/Python/Python-ast.c index bcf9456942c6fc44b51b28d1ff1bb43618936bad..9e86f43178957d30d0ff45078791f11a3a9b055f 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -4,54 +4,574 @@ #include "Python.h" #include "Python-ast.h" +#include "structmember.h" // PyMemberDef -static PyTypeObject AST_type; -static PyTypeObject *mod_type; -static PyObject* ast2obj_mod(void*); -static PyTypeObject *Module_type; -_Py_IDENTIFIER(body); -_Py_IDENTIFIER(type_ignores); -static char *Module_fields[]={ +typedef struct { + int initialized; + PyObject *AST_type; + PyObject *Add_singleton; + PyObject *Add_type; + PyObject *And_singleton; + PyObject *And_type; + PyObject *AnnAssign_type; + PyObject *Assert_type; + PyObject *Assign_type; + PyObject *AsyncFor_type; + PyObject *AsyncFunctionDef_type; + PyObject *AsyncWith_type; + PyObject *Attribute_type; + PyObject *AugAssign_type; + PyObject *Await_type; + PyObject *BinOp_type; + PyObject *BitAnd_singleton; + PyObject *BitAnd_type; + PyObject *BitOr_singleton; + PyObject *BitOr_type; + PyObject *BitXor_singleton; + PyObject *BitXor_type; + PyObject *BoolOp_type; + PyObject *Break_type; + PyObject *Call_type; + PyObject *ClassDef_type; + PyObject *Compare_type; + PyObject *Constant_type; + PyObject *Continue_type; + PyObject *Del_singleton; + PyObject *Del_type; + PyObject *Delete_type; + PyObject *DictComp_type; + PyObject *Dict_type; + PyObject *Div_singleton; + PyObject *Div_type; + PyObject *Eq_singleton; + PyObject *Eq_type; + PyObject *ExceptHandler_type; + PyObject *Expr_type; + PyObject *Expression_type; + PyObject *FloorDiv_singleton; + PyObject *FloorDiv_type; + PyObject *For_type; + PyObject *FormattedValue_type; + PyObject *FunctionDef_type; + PyObject *FunctionType_type; + PyObject *GeneratorExp_type; + PyObject *Global_type; + PyObject *GtE_singleton; + PyObject *GtE_type; + PyObject *Gt_singleton; + PyObject *Gt_type; + PyObject *IfExp_type; + PyObject *If_type; + PyObject *ImportFrom_type; + PyObject *Import_type; + PyObject *In_singleton; + PyObject *In_type; + PyObject *Interactive_type; + PyObject *Invert_singleton; + PyObject *Invert_type; + PyObject *IsNot_singleton; + PyObject *IsNot_type; + PyObject *Is_singleton; + PyObject *Is_type; + PyObject *JoinedStr_type; + PyObject *LShift_singleton; + PyObject *LShift_type; + PyObject *Lambda_type; + PyObject *ListComp_type; + PyObject *List_type; + PyObject *Load_singleton; + PyObject *Load_type; + PyObject *LtE_singleton; + PyObject *LtE_type; + PyObject *Lt_singleton; + PyObject *Lt_type; + PyObject *MatMult_singleton; + PyObject *MatMult_type; + PyObject *Mod_singleton; + PyObject *Mod_type; + PyObject *Module_type; + PyObject *Mult_singleton; + PyObject *Mult_type; + PyObject *Name_type; + PyObject *NamedExpr_type; + PyObject *Nonlocal_type; + PyObject *NotEq_singleton; + PyObject *NotEq_type; + PyObject *NotIn_singleton; + PyObject *NotIn_type; + PyObject *Not_singleton; + PyObject *Not_type; + PyObject *Or_singleton; + PyObject *Or_type; + PyObject *Pass_type; + PyObject *Pow_singleton; + PyObject *Pow_type; + PyObject *RShift_singleton; + PyObject *RShift_type; + PyObject *Raise_type; + PyObject *Return_type; + PyObject *SetComp_type; + PyObject *Set_type; + PyObject *Slice_type; + PyObject *Starred_type; + PyObject *Store_singleton; + PyObject *Store_type; + PyObject *Sub_singleton; + PyObject *Sub_type; + PyObject *Subscript_type; + PyObject *Try_type; + PyObject *Tuple_type; + PyObject *TypeIgnore_type; + PyObject *UAdd_singleton; + PyObject *UAdd_type; + PyObject *USub_singleton; + PyObject *USub_type; + PyObject *UnaryOp_type; + PyObject *While_type; + PyObject *With_type; + PyObject *YieldFrom_type; + PyObject *Yield_type; + PyObject *__dict__; + PyObject *__doc__; + PyObject *__module__; + PyObject *_attributes; + PyObject *_fields; + PyObject *alias_type; + PyObject *annotation; + PyObject *arg; + PyObject *arg_type; + PyObject *args; + PyObject *argtypes; + PyObject *arguments_type; + PyObject *asname; + PyObject *ast; + PyObject *attr; + PyObject *bases; + PyObject *body; + PyObject *boolop_type; + PyObject *cause; + PyObject *cmpop_type; + PyObject *col_offset; + PyObject *comparators; + PyObject *comprehension_type; + PyObject *context_expr; + PyObject *conversion; + PyObject *ctx; + PyObject *decorator_list; + PyObject *defaults; + PyObject *elt; + PyObject *elts; + PyObject *end_col_offset; + PyObject *end_lineno; + PyObject *exc; + PyObject *excepthandler_type; + PyObject *expr_context_type; + PyObject *expr_type; + PyObject *finalbody; + PyObject *format_spec; + PyObject *func; + PyObject *generators; + PyObject *handlers; + PyObject *id; + PyObject *ifs; + PyObject *is_async; + PyObject *items; + PyObject *iter; + PyObject *key; + PyObject *keys; + PyObject *keyword_type; + PyObject *keywords; + PyObject *kind; + PyObject *kw_defaults; + PyObject *kwarg; + PyObject *kwonlyargs; + PyObject *left; + PyObject *level; + PyObject *lineno; + PyObject *lower; + PyObject *mod_type; + PyObject *module; + PyObject *msg; + PyObject *name; + PyObject *names; + PyObject *op; + PyObject *operand; + PyObject *operator_type; + PyObject *ops; + PyObject *optional_vars; + PyObject *orelse; + PyObject *posonlyargs; + PyObject *returns; + PyObject *right; + PyObject *simple; + PyObject *slice; + PyObject *step; + PyObject *stmt_type; + PyObject *tag; + PyObject *target; + PyObject *targets; + PyObject *test; + PyObject *type; + PyObject *type_comment; + PyObject *type_ignore_type; + PyObject *type_ignores; + PyObject *unaryop_type; + PyObject *upper; + PyObject *value; + PyObject *values; + PyObject *vararg; + PyObject *withitem_type; +} astmodulestate; + + +// Forward declaration +static int init_types(astmodulestate *state); + +// bpo-41194, bpo-41261, bpo-41631: The _ast module uses a global state. +static astmodulestate global_ast_state = {0}; + +static astmodulestate* +get_global_ast_state(void) +{ + astmodulestate* state = &global_ast_state; + if (!init_types(state)) { + return NULL; + } + return state; +} + +static astmodulestate* +get_ast_state(PyObject* Py_UNUSED(module)) +{ + astmodulestate* state = get_global_ast_state(); + // get_ast_state() must only be called after _ast module is imported, + // and astmodule_exec() calls init_types() + assert(state != NULL); + return state; +} + +void _PyAST_Fini() +{ + astmodulestate* state = &global_ast_state; + Py_CLEAR(state->AST_type); + Py_CLEAR(state->Add_singleton); + Py_CLEAR(state->Add_type); + Py_CLEAR(state->And_singleton); + Py_CLEAR(state->And_type); + Py_CLEAR(state->AnnAssign_type); + Py_CLEAR(state->Assert_type); + Py_CLEAR(state->Assign_type); + Py_CLEAR(state->AsyncFor_type); + Py_CLEAR(state->AsyncFunctionDef_type); + Py_CLEAR(state->AsyncWith_type); + Py_CLEAR(state->Attribute_type); + Py_CLEAR(state->AugAssign_type); + Py_CLEAR(state->Await_type); + Py_CLEAR(state->BinOp_type); + Py_CLEAR(state->BitAnd_singleton); + Py_CLEAR(state->BitAnd_type); + Py_CLEAR(state->BitOr_singleton); + Py_CLEAR(state->BitOr_type); + Py_CLEAR(state->BitXor_singleton); + Py_CLEAR(state->BitXor_type); + Py_CLEAR(state->BoolOp_type); + Py_CLEAR(state->Break_type); + Py_CLEAR(state->Call_type); + Py_CLEAR(state->ClassDef_type); + Py_CLEAR(state->Compare_type); + Py_CLEAR(state->Constant_type); + Py_CLEAR(state->Continue_type); + Py_CLEAR(state->Del_singleton); + Py_CLEAR(state->Del_type); + Py_CLEAR(state->Delete_type); + Py_CLEAR(state->DictComp_type); + Py_CLEAR(state->Dict_type); + Py_CLEAR(state->Div_singleton); + Py_CLEAR(state->Div_type); + Py_CLEAR(state->Eq_singleton); + Py_CLEAR(state->Eq_type); + Py_CLEAR(state->ExceptHandler_type); + Py_CLEAR(state->Expr_type); + Py_CLEAR(state->Expression_type); + Py_CLEAR(state->FloorDiv_singleton); + Py_CLEAR(state->FloorDiv_type); + Py_CLEAR(state->For_type); + Py_CLEAR(state->FormattedValue_type); + Py_CLEAR(state->FunctionDef_type); + Py_CLEAR(state->FunctionType_type); + Py_CLEAR(state->GeneratorExp_type); + Py_CLEAR(state->Global_type); + Py_CLEAR(state->GtE_singleton); + Py_CLEAR(state->GtE_type); + Py_CLEAR(state->Gt_singleton); + Py_CLEAR(state->Gt_type); + Py_CLEAR(state->IfExp_type); + Py_CLEAR(state->If_type); + Py_CLEAR(state->ImportFrom_type); + Py_CLEAR(state->Import_type); + Py_CLEAR(state->In_singleton); + Py_CLEAR(state->In_type); + Py_CLEAR(state->Interactive_type); + Py_CLEAR(state->Invert_singleton); + Py_CLEAR(state->Invert_type); + Py_CLEAR(state->IsNot_singleton); + Py_CLEAR(state->IsNot_type); + Py_CLEAR(state->Is_singleton); + Py_CLEAR(state->Is_type); + Py_CLEAR(state->JoinedStr_type); + Py_CLEAR(state->LShift_singleton); + Py_CLEAR(state->LShift_type); + Py_CLEAR(state->Lambda_type); + Py_CLEAR(state->ListComp_type); + Py_CLEAR(state->List_type); + Py_CLEAR(state->Load_singleton); + Py_CLEAR(state->Load_type); + Py_CLEAR(state->LtE_singleton); + Py_CLEAR(state->LtE_type); + Py_CLEAR(state->Lt_singleton); + Py_CLEAR(state->Lt_type); + Py_CLEAR(state->MatMult_singleton); + Py_CLEAR(state->MatMult_type); + Py_CLEAR(state->Mod_singleton); + Py_CLEAR(state->Mod_type); + Py_CLEAR(state->Module_type); + Py_CLEAR(state->Mult_singleton); + Py_CLEAR(state->Mult_type); + Py_CLEAR(state->Name_type); + Py_CLEAR(state->NamedExpr_type); + Py_CLEAR(state->Nonlocal_type); + Py_CLEAR(state->NotEq_singleton); + Py_CLEAR(state->NotEq_type); + Py_CLEAR(state->NotIn_singleton); + Py_CLEAR(state->NotIn_type); + Py_CLEAR(state->Not_singleton); + Py_CLEAR(state->Not_type); + Py_CLEAR(state->Or_singleton); + Py_CLEAR(state->Or_type); + Py_CLEAR(state->Pass_type); + Py_CLEAR(state->Pow_singleton); + Py_CLEAR(state->Pow_type); + Py_CLEAR(state->RShift_singleton); + Py_CLEAR(state->RShift_type); + Py_CLEAR(state->Raise_type); + Py_CLEAR(state->Return_type); + Py_CLEAR(state->SetComp_type); + Py_CLEAR(state->Set_type); + Py_CLEAR(state->Slice_type); + Py_CLEAR(state->Starred_type); + Py_CLEAR(state->Store_singleton); + Py_CLEAR(state->Store_type); + Py_CLEAR(state->Sub_singleton); + Py_CLEAR(state->Sub_type); + Py_CLEAR(state->Subscript_type); + Py_CLEAR(state->Try_type); + Py_CLEAR(state->Tuple_type); + Py_CLEAR(state->TypeIgnore_type); + Py_CLEAR(state->UAdd_singleton); + Py_CLEAR(state->UAdd_type); + Py_CLEAR(state->USub_singleton); + Py_CLEAR(state->USub_type); + Py_CLEAR(state->UnaryOp_type); + Py_CLEAR(state->While_type); + Py_CLEAR(state->With_type); + Py_CLEAR(state->YieldFrom_type); + Py_CLEAR(state->Yield_type); + Py_CLEAR(state->__dict__); + Py_CLEAR(state->__doc__); + Py_CLEAR(state->__module__); + Py_CLEAR(state->_attributes); + Py_CLEAR(state->_fields); + Py_CLEAR(state->alias_type); + Py_CLEAR(state->annotation); + Py_CLEAR(state->arg); + Py_CLEAR(state->arg_type); + Py_CLEAR(state->args); + Py_CLEAR(state->argtypes); + Py_CLEAR(state->arguments_type); + Py_CLEAR(state->asname); + Py_CLEAR(state->ast); + Py_CLEAR(state->attr); + Py_CLEAR(state->bases); + Py_CLEAR(state->body); + Py_CLEAR(state->boolop_type); + Py_CLEAR(state->cause); + Py_CLEAR(state->cmpop_type); + Py_CLEAR(state->col_offset); + Py_CLEAR(state->comparators); + Py_CLEAR(state->comprehension_type); + Py_CLEAR(state->context_expr); + Py_CLEAR(state->conversion); + Py_CLEAR(state->ctx); + Py_CLEAR(state->decorator_list); + Py_CLEAR(state->defaults); + Py_CLEAR(state->elt); + Py_CLEAR(state->elts); + Py_CLEAR(state->end_col_offset); + Py_CLEAR(state->end_lineno); + Py_CLEAR(state->exc); + Py_CLEAR(state->excepthandler_type); + Py_CLEAR(state->expr_context_type); + Py_CLEAR(state->expr_type); + Py_CLEAR(state->finalbody); + Py_CLEAR(state->format_spec); + Py_CLEAR(state->func); + Py_CLEAR(state->generators); + Py_CLEAR(state->handlers); + Py_CLEAR(state->id); + Py_CLEAR(state->ifs); + Py_CLEAR(state->is_async); + Py_CLEAR(state->items); + Py_CLEAR(state->iter); + Py_CLEAR(state->key); + Py_CLEAR(state->keys); + Py_CLEAR(state->keyword_type); + Py_CLEAR(state->keywords); + Py_CLEAR(state->kind); + Py_CLEAR(state->kw_defaults); + Py_CLEAR(state->kwarg); + Py_CLEAR(state->kwonlyargs); + Py_CLEAR(state->left); + Py_CLEAR(state->level); + Py_CLEAR(state->lineno); + Py_CLEAR(state->lower); + Py_CLEAR(state->mod_type); + Py_CLEAR(state->module); + Py_CLEAR(state->msg); + Py_CLEAR(state->name); + Py_CLEAR(state->names); + Py_CLEAR(state->op); + Py_CLEAR(state->operand); + Py_CLEAR(state->operator_type); + Py_CLEAR(state->ops); + Py_CLEAR(state->optional_vars); + Py_CLEAR(state->orelse); + Py_CLEAR(state->posonlyargs); + Py_CLEAR(state->returns); + Py_CLEAR(state->right); + Py_CLEAR(state->simple); + Py_CLEAR(state->slice); + Py_CLEAR(state->step); + Py_CLEAR(state->stmt_type); + Py_CLEAR(state->tag); + Py_CLEAR(state->target); + Py_CLEAR(state->targets); + Py_CLEAR(state->test); + Py_CLEAR(state->type); + Py_CLEAR(state->type_comment); + Py_CLEAR(state->type_ignore_type); + Py_CLEAR(state->type_ignores); + Py_CLEAR(state->unaryop_type); + Py_CLEAR(state->upper); + Py_CLEAR(state->value); + Py_CLEAR(state->values); + Py_CLEAR(state->vararg); + Py_CLEAR(state->withitem_type); + + state->initialized = 0; +} + +static int init_identifiers(astmodulestate *state) +{ + if ((state->__dict__ = PyUnicode_InternFromString("__dict__")) == NULL) return 0; + if ((state->__doc__ = PyUnicode_InternFromString("__doc__")) == NULL) return 0; + if ((state->__module__ = PyUnicode_InternFromString("__module__")) == NULL) return 0; + if ((state->_attributes = PyUnicode_InternFromString("_attributes")) == NULL) return 0; + if ((state->_fields = PyUnicode_InternFromString("_fields")) == NULL) return 0; + if ((state->annotation = PyUnicode_InternFromString("annotation")) == NULL) return 0; + if ((state->arg = PyUnicode_InternFromString("arg")) == NULL) return 0; + if ((state->args = PyUnicode_InternFromString("args")) == NULL) return 0; + if ((state->argtypes = PyUnicode_InternFromString("argtypes")) == NULL) return 0; + if ((state->asname = PyUnicode_InternFromString("asname")) == NULL) return 0; + if ((state->ast = PyUnicode_InternFromString("ast")) == NULL) return 0; + if ((state->attr = PyUnicode_InternFromString("attr")) == NULL) return 0; + if ((state->bases = PyUnicode_InternFromString("bases")) == NULL) return 0; + if ((state->body = PyUnicode_InternFromString("body")) == NULL) return 0; + if ((state->cause = PyUnicode_InternFromString("cause")) == NULL) return 0; + if ((state->col_offset = PyUnicode_InternFromString("col_offset")) == NULL) return 0; + if ((state->comparators = PyUnicode_InternFromString("comparators")) == NULL) return 0; + if ((state->context_expr = PyUnicode_InternFromString("context_expr")) == NULL) return 0; + if ((state->conversion = PyUnicode_InternFromString("conversion")) == NULL) return 0; + if ((state->ctx = PyUnicode_InternFromString("ctx")) == NULL) return 0; + if ((state->decorator_list = PyUnicode_InternFromString("decorator_list")) == NULL) return 0; + if ((state->defaults = PyUnicode_InternFromString("defaults")) == NULL) return 0; + if ((state->elt = PyUnicode_InternFromString("elt")) == NULL) return 0; + if ((state->elts = PyUnicode_InternFromString("elts")) == NULL) return 0; + if ((state->end_col_offset = PyUnicode_InternFromString("end_col_offset")) == NULL) return 0; + if ((state->end_lineno = PyUnicode_InternFromString("end_lineno")) == NULL) return 0; + if ((state->exc = PyUnicode_InternFromString("exc")) == NULL) return 0; + if ((state->finalbody = PyUnicode_InternFromString("finalbody")) == NULL) return 0; + if ((state->format_spec = PyUnicode_InternFromString("format_spec")) == NULL) return 0; + if ((state->func = PyUnicode_InternFromString("func")) == NULL) return 0; + if ((state->generators = PyUnicode_InternFromString("generators")) == NULL) return 0; + if ((state->handlers = PyUnicode_InternFromString("handlers")) == NULL) return 0; + if ((state->id = PyUnicode_InternFromString("id")) == NULL) return 0; + if ((state->ifs = PyUnicode_InternFromString("ifs")) == NULL) return 0; + if ((state->is_async = PyUnicode_InternFromString("is_async")) == NULL) return 0; + if ((state->items = PyUnicode_InternFromString("items")) == NULL) return 0; + if ((state->iter = PyUnicode_InternFromString("iter")) == NULL) return 0; + if ((state->key = PyUnicode_InternFromString("key")) == NULL) return 0; + if ((state->keys = PyUnicode_InternFromString("keys")) == NULL) return 0; + if ((state->keywords = PyUnicode_InternFromString("keywords")) == NULL) return 0; + if ((state->kind = PyUnicode_InternFromString("kind")) == NULL) return 0; + if ((state->kw_defaults = PyUnicode_InternFromString("kw_defaults")) == NULL) return 0; + if ((state->kwarg = PyUnicode_InternFromString("kwarg")) == NULL) return 0; + if ((state->kwonlyargs = PyUnicode_InternFromString("kwonlyargs")) == NULL) return 0; + if ((state->left = PyUnicode_InternFromString("left")) == NULL) return 0; + if ((state->level = PyUnicode_InternFromString("level")) == NULL) return 0; + if ((state->lineno = PyUnicode_InternFromString("lineno")) == NULL) return 0; + if ((state->lower = PyUnicode_InternFromString("lower")) == NULL) return 0; + if ((state->module = PyUnicode_InternFromString("module")) == NULL) return 0; + if ((state->msg = PyUnicode_InternFromString("msg")) == NULL) return 0; + if ((state->name = PyUnicode_InternFromString("name")) == NULL) return 0; + if ((state->names = PyUnicode_InternFromString("names")) == NULL) return 0; + if ((state->op = PyUnicode_InternFromString("op")) == NULL) return 0; + if ((state->operand = PyUnicode_InternFromString("operand")) == NULL) return 0; + if ((state->ops = PyUnicode_InternFromString("ops")) == NULL) return 0; + if ((state->optional_vars = PyUnicode_InternFromString("optional_vars")) == NULL) return 0; + if ((state->orelse = PyUnicode_InternFromString("orelse")) == NULL) return 0; + if ((state->posonlyargs = PyUnicode_InternFromString("posonlyargs")) == NULL) return 0; + if ((state->returns = PyUnicode_InternFromString("returns")) == NULL) return 0; + if ((state->right = PyUnicode_InternFromString("right")) == NULL) return 0; + if ((state->simple = PyUnicode_InternFromString("simple")) == NULL) return 0; + if ((state->slice = PyUnicode_InternFromString("slice")) == NULL) return 0; + if ((state->step = PyUnicode_InternFromString("step")) == NULL) return 0; + if ((state->tag = PyUnicode_InternFromString("tag")) == NULL) return 0; + if ((state->target = PyUnicode_InternFromString("target")) == NULL) return 0; + if ((state->targets = PyUnicode_InternFromString("targets")) == NULL) return 0; + if ((state->test = PyUnicode_InternFromString("test")) == NULL) return 0; + if ((state->type = PyUnicode_InternFromString("type")) == NULL) return 0; + if ((state->type_comment = PyUnicode_InternFromString("type_comment")) == NULL) return 0; + if ((state->type_ignores = PyUnicode_InternFromString("type_ignores")) == NULL) return 0; + if ((state->upper = PyUnicode_InternFromString("upper")) == NULL) return 0; + if ((state->value = PyUnicode_InternFromString("value")) == NULL) return 0; + if ((state->values = PyUnicode_InternFromString("values")) == NULL) return 0; + if ((state->vararg = PyUnicode_InternFromString("vararg")) == NULL) return 0; + return 1; +}; + +static PyObject* ast2obj_mod(astmodulestate *state, void*); +static const char * const Module_fields[]={ "body", "type_ignores", }; -static PyTypeObject *Interactive_type; -static char *Interactive_fields[]={ +static const char * const Interactive_fields[]={ "body", }; -static PyTypeObject *Expression_type; -static char *Expression_fields[]={ +static const char * const Expression_fields[]={ "body", }; -static PyTypeObject *FunctionType_type; -_Py_IDENTIFIER(argtypes); -_Py_IDENTIFIER(returns); -static char *FunctionType_fields[]={ +static const char * const FunctionType_fields[]={ "argtypes", "returns", }; -static PyTypeObject *Suite_type; -static char *Suite_fields[]={ - "body", -}; -static PyTypeObject *stmt_type; -_Py_IDENTIFIER(lineno); -_Py_IDENTIFIER(col_offset); -_Py_IDENTIFIER(end_lineno); -_Py_IDENTIFIER(end_col_offset); -static char *stmt_attributes[] = { +static const char * const stmt_attributes[] = { "lineno", "col_offset", "end_lineno", "end_col_offset", }; -static PyObject* ast2obj_stmt(void*); -static PyTypeObject *FunctionDef_type; -_Py_IDENTIFIER(name); -_Py_IDENTIFIER(args); -_Py_IDENTIFIER(decorator_list); -_Py_IDENTIFIER(type_comment); -static char *FunctionDef_fields[]={ +static PyObject* ast2obj_stmt(astmodulestate *state, void*); +static const char * const FunctionDef_fields[]={ "name", "args", "body", @@ -59,8 +579,7 @@ static char *FunctionDef_fields[]={ "returns", "type_comment", }; -static PyTypeObject *AsyncFunctionDef_type; -static char *AsyncFunctionDef_fields[]={ +static const char * const AsyncFunctionDef_fields[]={ "name", "args", "body", @@ -68,414 +587,245 @@ static char *AsyncFunctionDef_fields[]={ "returns", "type_comment", }; -static PyTypeObject *ClassDef_type; -_Py_IDENTIFIER(bases); -_Py_IDENTIFIER(keywords); -static char *ClassDef_fields[]={ +static const char * const ClassDef_fields[]={ "name", "bases", "keywords", "body", "decorator_list", }; -static PyTypeObject *Return_type; -_Py_IDENTIFIER(value); -static char *Return_fields[]={ +static const char * const Return_fields[]={ "value", }; -static PyTypeObject *Delete_type; -_Py_IDENTIFIER(targets); -static char *Delete_fields[]={ +static const char * const Delete_fields[]={ "targets", }; -static PyTypeObject *Assign_type; -static char *Assign_fields[]={ +static const char * const Assign_fields[]={ "targets", "value", "type_comment", }; -static PyTypeObject *AugAssign_type; -_Py_IDENTIFIER(target); -_Py_IDENTIFIER(op); -static char *AugAssign_fields[]={ +static const char * const AugAssign_fields[]={ "target", "op", "value", }; -static PyTypeObject *AnnAssign_type; -_Py_IDENTIFIER(annotation); -_Py_IDENTIFIER(simple); -static char *AnnAssign_fields[]={ +static const char * const AnnAssign_fields[]={ "target", "annotation", "value", "simple", }; -static PyTypeObject *For_type; -_Py_IDENTIFIER(iter); -_Py_IDENTIFIER(orelse); -static char *For_fields[]={ +static const char * const For_fields[]={ "target", "iter", "body", "orelse", "type_comment", }; -static PyTypeObject *AsyncFor_type; -static char *AsyncFor_fields[]={ +static const char * const AsyncFor_fields[]={ "target", "iter", "body", "orelse", "type_comment", }; -static PyTypeObject *While_type; -_Py_IDENTIFIER(test); -static char *While_fields[]={ +static const char * const While_fields[]={ "test", "body", "orelse", }; -static PyTypeObject *If_type; -static char *If_fields[]={ +static const char * const If_fields[]={ "test", "body", "orelse", }; -static PyTypeObject *With_type; -_Py_IDENTIFIER(items); -static char *With_fields[]={ +static const char * const With_fields[]={ "items", "body", "type_comment", }; -static PyTypeObject *AsyncWith_type; -static char *AsyncWith_fields[]={ +static const char * const AsyncWith_fields[]={ "items", "body", "type_comment", }; -static PyTypeObject *Raise_type; -_Py_IDENTIFIER(exc); -_Py_IDENTIFIER(cause); -static char *Raise_fields[]={ +static const char * const Raise_fields[]={ "exc", "cause", }; -static PyTypeObject *Try_type; -_Py_IDENTIFIER(handlers); -_Py_IDENTIFIER(finalbody); -static char *Try_fields[]={ +static const char * const Try_fields[]={ "body", "handlers", "orelse", "finalbody", }; -static PyTypeObject *Assert_type; -_Py_IDENTIFIER(msg); -static char *Assert_fields[]={ +static const char * const Assert_fields[]={ "test", "msg", }; -static PyTypeObject *Import_type; -_Py_IDENTIFIER(names); -static char *Import_fields[]={ +static const char * const Import_fields[]={ "names", }; -static PyTypeObject *ImportFrom_type; -_Py_IDENTIFIER(module); -_Py_IDENTIFIER(level); -static char *ImportFrom_fields[]={ +static const char * const ImportFrom_fields[]={ "module", "names", "level", }; -static PyTypeObject *Global_type; -static char *Global_fields[]={ +static const char * const Global_fields[]={ "names", }; -static PyTypeObject *Nonlocal_type; -static char *Nonlocal_fields[]={ +static const char * const Nonlocal_fields[]={ "names", }; -static PyTypeObject *Expr_type; -static char *Expr_fields[]={ +static const char * const Expr_fields[]={ "value", }; -static PyTypeObject *Pass_type; -static PyTypeObject *Break_type; -static PyTypeObject *Continue_type; -static PyTypeObject *expr_type; -static char *expr_attributes[] = { +static const char * const expr_attributes[] = { "lineno", "col_offset", "end_lineno", "end_col_offset", }; -static PyObject* ast2obj_expr(void*); -static PyTypeObject *BoolOp_type; -_Py_IDENTIFIER(values); -static char *BoolOp_fields[]={ +static PyObject* ast2obj_expr(astmodulestate *state, void*); +static const char * const BoolOp_fields[]={ "op", "values", }; -static PyTypeObject *NamedExpr_type; -static char *NamedExpr_fields[]={ +static const char * const NamedExpr_fields[]={ "target", "value", }; -static PyTypeObject *BinOp_type; -_Py_IDENTIFIER(left); -_Py_IDENTIFIER(right); -static char *BinOp_fields[]={ +static const char * const BinOp_fields[]={ "left", "op", "right", }; -static PyTypeObject *UnaryOp_type; -_Py_IDENTIFIER(operand); -static char *UnaryOp_fields[]={ +static const char * const UnaryOp_fields[]={ "op", "operand", }; -static PyTypeObject *Lambda_type; -static char *Lambda_fields[]={ +static const char * const Lambda_fields[]={ "args", "body", }; -static PyTypeObject *IfExp_type; -static char *IfExp_fields[]={ +static const char * const IfExp_fields[]={ "test", "body", "orelse", }; -static PyTypeObject *Dict_type; -_Py_IDENTIFIER(keys); -static char *Dict_fields[]={ +static const char * const Dict_fields[]={ "keys", "values", }; -static PyTypeObject *Set_type; -_Py_IDENTIFIER(elts); -static char *Set_fields[]={ +static const char * const Set_fields[]={ "elts", }; -static PyTypeObject *ListComp_type; -_Py_IDENTIFIER(elt); -_Py_IDENTIFIER(generators); -static char *ListComp_fields[]={ +static const char * const ListComp_fields[]={ "elt", "generators", }; -static PyTypeObject *SetComp_type; -static char *SetComp_fields[]={ +static const char * const SetComp_fields[]={ "elt", "generators", }; -static PyTypeObject *DictComp_type; -_Py_IDENTIFIER(key); -static char *DictComp_fields[]={ +static const char * const DictComp_fields[]={ "key", "value", "generators", }; -static PyTypeObject *GeneratorExp_type; -static char *GeneratorExp_fields[]={ +static const char * const GeneratorExp_fields[]={ "elt", "generators", }; -static PyTypeObject *Await_type; -static char *Await_fields[]={ +static const char * const Await_fields[]={ "value", }; -static PyTypeObject *Yield_type; -static char *Yield_fields[]={ +static const char * const Yield_fields[]={ "value", }; -static PyTypeObject *YieldFrom_type; -static char *YieldFrom_fields[]={ +static const char * const YieldFrom_fields[]={ "value", }; -static PyTypeObject *Compare_type; -_Py_IDENTIFIER(ops); -_Py_IDENTIFIER(comparators); -static char *Compare_fields[]={ +static const char * const Compare_fields[]={ "left", "ops", "comparators", }; -static PyTypeObject *Call_type; -_Py_IDENTIFIER(func); -static char *Call_fields[]={ +static const char * const Call_fields[]={ "func", "args", "keywords", }; -static PyTypeObject *FormattedValue_type; -_Py_IDENTIFIER(conversion); -_Py_IDENTIFIER(format_spec); -static char *FormattedValue_fields[]={ +static const char * const FormattedValue_fields[]={ "value", "conversion", "format_spec", }; -static PyTypeObject *JoinedStr_type; -static char *JoinedStr_fields[]={ +static const char * const JoinedStr_fields[]={ "values", }; -static PyTypeObject *Constant_type; -_Py_IDENTIFIER(kind); -static char *Constant_fields[]={ +static const char * const Constant_fields[]={ "value", "kind", }; -static PyTypeObject *Attribute_type; -_Py_IDENTIFIER(attr); -_Py_IDENTIFIER(ctx); -static char *Attribute_fields[]={ +static const char * const Attribute_fields[]={ "value", "attr", "ctx", }; -static PyTypeObject *Subscript_type; -_Py_IDENTIFIER(slice); -static char *Subscript_fields[]={ +static const char * const Subscript_fields[]={ "value", "slice", "ctx", }; -static PyTypeObject *Starred_type; -static char *Starred_fields[]={ +static const char * const Starred_fields[]={ "value", "ctx", }; -static PyTypeObject *Name_type; -_Py_IDENTIFIER(id); -static char *Name_fields[]={ +static const char * const Name_fields[]={ "id", "ctx", }; -static PyTypeObject *List_type; -static char *List_fields[]={ +static const char * const List_fields[]={ "elts", "ctx", }; -static PyTypeObject *Tuple_type; -static char *Tuple_fields[]={ +static const char * const Tuple_fields[]={ "elts", "ctx", }; -static PyTypeObject *expr_context_type; -static PyObject *Load_singleton, *Store_singleton, *Del_singleton, -*AugLoad_singleton, *AugStore_singleton, *Param_singleton; -static PyObject* ast2obj_expr_context(expr_context_ty); -static PyTypeObject *Load_type; -static PyTypeObject *Store_type; -static PyTypeObject *Del_type; -static PyTypeObject *AugLoad_type; -static PyTypeObject *AugStore_type; -static PyTypeObject *Param_type; -static PyTypeObject *slice_type; -static PyObject* ast2obj_slice(void*); -static PyTypeObject *Slice_type; -_Py_IDENTIFIER(lower); -_Py_IDENTIFIER(upper); -_Py_IDENTIFIER(step); -static char *Slice_fields[]={ +static const char * const Slice_fields[]={ "lower", "upper", "step", }; -static PyTypeObject *ExtSlice_type; -_Py_IDENTIFIER(dims); -static char *ExtSlice_fields[]={ - "dims", -}; -static PyTypeObject *Index_type; -static char *Index_fields[]={ - "value", -}; -static PyTypeObject *boolop_type; -static PyObject *And_singleton, *Or_singleton; -static PyObject* ast2obj_boolop(boolop_ty); -static PyTypeObject *And_type; -static PyTypeObject *Or_type; -static PyTypeObject *operator_type; -static PyObject *Add_singleton, *Sub_singleton, *Mult_singleton, -*MatMult_singleton, *Div_singleton, *Mod_singleton, *Pow_singleton, -*LShift_singleton, *RShift_singleton, *BitOr_singleton, *BitXor_singleton, -*BitAnd_singleton, *FloorDiv_singleton; -static PyObject* ast2obj_operator(operator_ty); -static PyTypeObject *Add_type; -static PyTypeObject *Sub_type; -static PyTypeObject *Mult_type; -static PyTypeObject *MatMult_type; -static PyTypeObject *Div_type; -static PyTypeObject *Mod_type; -static PyTypeObject *Pow_type; -static PyTypeObject *LShift_type; -static PyTypeObject *RShift_type; -static PyTypeObject *BitOr_type; -static PyTypeObject *BitXor_type; -static PyTypeObject *BitAnd_type; -static PyTypeObject *FloorDiv_type; -static PyTypeObject *unaryop_type; -static PyObject *Invert_singleton, *Not_singleton, *UAdd_singleton, -*USub_singleton; -static PyObject* ast2obj_unaryop(unaryop_ty); -static PyTypeObject *Invert_type; -static PyTypeObject *Not_type; -static PyTypeObject *UAdd_type; -static PyTypeObject *USub_type; -static PyTypeObject *cmpop_type; -static PyObject *Eq_singleton, *NotEq_singleton, *Lt_singleton, *LtE_singleton, -*Gt_singleton, *GtE_singleton, *Is_singleton, *IsNot_singleton, *In_singleton, -*NotIn_singleton; -static PyObject* ast2obj_cmpop(cmpop_ty); -static PyTypeObject *Eq_type; -static PyTypeObject *NotEq_type; -static PyTypeObject *Lt_type; -static PyTypeObject *LtE_type; -static PyTypeObject *Gt_type; -static PyTypeObject *GtE_type; -static PyTypeObject *Is_type; -static PyTypeObject *IsNot_type; -static PyTypeObject *In_type; -static PyTypeObject *NotIn_type; -static PyTypeObject *comprehension_type; -static PyObject* ast2obj_comprehension(void*); -_Py_IDENTIFIER(ifs); -_Py_IDENTIFIER(is_async); -static char *comprehension_fields[]={ +static PyObject* ast2obj_expr_context(astmodulestate *state, expr_context_ty); +static PyObject* ast2obj_boolop(astmodulestate *state, boolop_ty); +static PyObject* ast2obj_operator(astmodulestate *state, operator_ty); +static PyObject* ast2obj_unaryop(astmodulestate *state, unaryop_ty); +static PyObject* ast2obj_cmpop(astmodulestate *state, cmpop_ty); +static PyObject* ast2obj_comprehension(astmodulestate *state, void*); +static const char * const comprehension_fields[]={ "target", "iter", "ifs", "is_async", }; -static PyTypeObject *excepthandler_type; -static char *excepthandler_attributes[] = { +static const char * const excepthandler_attributes[] = { "lineno", "col_offset", "end_lineno", "end_col_offset", }; -static PyObject* ast2obj_excepthandler(void*); -static PyTypeObject *ExceptHandler_type; -_Py_IDENTIFIER(type); -static char *ExceptHandler_fields[]={ +static PyObject* ast2obj_excepthandler(astmodulestate *state, void*); +static const char * const ExceptHandler_fields[]={ "type", "name", "body", }; -static PyTypeObject *arguments_type; -static PyObject* ast2obj_arguments(void*); -_Py_IDENTIFIER(posonlyargs); -_Py_IDENTIFIER(vararg); -_Py_IDENTIFIER(kwonlyargs); -_Py_IDENTIFIER(kw_defaults); -_Py_IDENTIFIER(kwarg); -_Py_IDENTIFIER(defaults); -static char *arguments_fields[]={ +static PyObject* ast2obj_arguments(astmodulestate *state, void*); +static const char * const arguments_fields[]={ "posonlyargs", "args", "vararg", @@ -484,53 +834,46 @@ static char *arguments_fields[]={ "kwarg", "defaults", }; -static PyTypeObject *arg_type; -static PyObject* ast2obj_arg(void*); -static char *arg_attributes[] = { +static PyObject* ast2obj_arg(astmodulestate *state, void*); +static const char * const arg_attributes[] = { "lineno", "col_offset", "end_lineno", "end_col_offset", }; -_Py_IDENTIFIER(arg); -static char *arg_fields[]={ +static const char * const arg_fields[]={ "arg", "annotation", "type_comment", }; -static PyTypeObject *keyword_type; -static PyObject* ast2obj_keyword(void*); -static char *keyword_fields[]={ +static PyObject* ast2obj_keyword(astmodulestate *state, void*); +static const char * const keyword_attributes[] = { + "lineno", + "col_offset", + "end_lineno", + "end_col_offset", +}; +static const char * const keyword_fields[]={ "arg", "value", }; -static PyTypeObject *alias_type; -static PyObject* ast2obj_alias(void*); -_Py_IDENTIFIER(asname); -static char *alias_fields[]={ +static PyObject* ast2obj_alias(astmodulestate *state, void*); +static const char * const alias_fields[]={ "name", "asname", }; -static PyTypeObject *withitem_type; -static PyObject* ast2obj_withitem(void*); -_Py_IDENTIFIER(context_expr); -_Py_IDENTIFIER(optional_vars); -static char *withitem_fields[]={ +static PyObject* ast2obj_withitem(astmodulestate *state, void*); +static const char * const withitem_fields[]={ "context_expr", "optional_vars", }; -static PyTypeObject *type_ignore_type; -static PyObject* ast2obj_type_ignore(void*); -static PyTypeObject *TypeIgnore_type; -_Py_IDENTIFIER(tag); -static char *TypeIgnore_fields[]={ +static PyObject* ast2obj_type_ignore(astmodulestate *state, void*); +static const char * const TypeIgnore_fields[]={ "lineno", "tag", }; -_Py_IDENTIFIER(_fields); -_Py_IDENTIFIER(_attributes); typedef struct { PyObject_HEAD @@ -541,14 +884,19 @@ static void ast_dealloc(AST_object *self) { /* bpo-31095: UnTrack is needed before calling any callbacks */ + PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); Py_CLEAR(self->dict); - Py_TYPE(self)->tp_free(self); + freefunc free_func = PyType_GetSlot(tp, Py_tp_free); + assert(free_func != NULL); + free_func(self); + Py_DECREF(tp); } static int ast_traverse(AST_object *self, visitproc visit, void *arg) { + Py_VISIT(Py_TYPE(self)); Py_VISIT(self->dict); return 0; } @@ -563,10 +911,15 @@ ast_clear(AST_object *self) static int ast_type_init(PyObject *self, PyObject *args, PyObject *kw) { + astmodulestate *state = get_global_ast_state(); + if (state == NULL) { + return -1; + } + Py_ssize_t i, numfields = 0; int res = -1; PyObject *key, *value, *fields; - if (_PyObject_LookupAttrId((PyObject*)Py_TYPE(self), &PyId__fields, &fields) < 0) { + if (_PyObject_LookupAttr((PyObject*)Py_TYPE(self), state->_fields, &fields) < 0) { goto cleanup; } if (fields) { @@ -580,7 +933,7 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw) if (numfields < PyTuple_GET_SIZE(args)) { PyErr_Format(PyExc_TypeError, "%.400s constructor takes at most " "%zd positional argument%s", - Py_TYPE(self)->tp_name, + _PyType_Name(Py_TYPE(self)), numfields, numfields == 1 ? "" : "s"); res = -1; goto cleanup; @@ -634,9 +987,13 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw) static PyObject * ast_type_reduce(PyObject *self, PyObject *unused) { - _Py_IDENTIFIER(__dict__); + astmodulestate *state = get_global_ast_state(); + if (state == NULL) { + return NULL; + } + PyObject *dict; - if (_PyObject_LookupAttrId(self, &PyId___dict__, &dict) < 0) { + if (_PyObject_LookupAttr(self, state->__dict__, &dict) < 0) { return NULL; } if (dict) { @@ -645,6 +1002,11 @@ ast_type_reduce(PyObject *self, PyObject *unused) return Py_BuildValue("O()", Py_TYPE(self)); } +static PyMemberDef ast_type_members[] = { + {"__dictoffset__", T_PYSSIZET, offsetof(AST_object, dict), READONLY}, + {NULL} /* Sentinel */ +}; + static PyMethodDef ast_type_methods[] = { {"__reduce__", ast_type_reduce, METH_NOARGS, NULL}, {NULL} @@ -655,96 +1017,79 @@ static PyGetSetDef ast_type_getsets[] = { {NULL} }; -static PyTypeObject AST_type = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - "_ast.AST", +static PyType_Slot AST_type_slots[] = { + {Py_tp_dealloc, ast_dealloc}, + {Py_tp_getattro, PyObject_GenericGetAttr}, + {Py_tp_setattro, PyObject_GenericSetAttr}, + {Py_tp_traverse, ast_traverse}, + {Py_tp_clear, ast_clear}, + {Py_tp_members, ast_type_members}, + {Py_tp_methods, ast_type_methods}, + {Py_tp_getset, ast_type_getsets}, + {Py_tp_init, ast_type_init}, + {Py_tp_alloc, PyType_GenericAlloc}, + {Py_tp_new, PyType_GenericNew}, + {Py_tp_free, PyObject_GC_Del}, + {0, 0}, +}; + +static PyType_Spec AST_type_spec = { + "ast.AST", sizeof(AST_object), 0, - (destructor)ast_dealloc, /* tp_dealloc */ - 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ - PyObject_GenericSetAttr, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags */ - 0, /* tp_doc */ - (traverseproc)ast_traverse, /* tp_traverse */ - (inquiry)ast_clear, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - ast_type_methods, /* tp_methods */ - 0, /* tp_members */ - ast_type_getsets, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - offsetof(AST_object, dict),/* tp_dictoffset */ - (initproc)ast_type_init, /* tp_init */ - PyType_GenericAlloc, /* tp_alloc */ - PyType_GenericNew, /* tp_new */ - PyObject_GC_Del, /* tp_free */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + AST_type_slots }; - -static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int num_fields) +static PyObject * +make_type(astmodulestate *state, const char *type, PyObject* base, + const char* const* fields, int num_fields, const char *doc) { - _Py_IDENTIFIER(__module__); - _Py_IDENTIFIER(_ast); PyObject *fnames, *result; int i; fnames = PyTuple_New(num_fields); if (!fnames) return NULL; for (i = 0; i < num_fields; i++) { - PyObject *field = PyUnicode_FromString(fields[i]); + PyObject *field = PyUnicode_InternFromString(fields[i]); if (!field) { Py_DECREF(fnames); return NULL; } PyTuple_SET_ITEM(fnames, i, field); } - result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOO}", + result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){OOOOOs}", type, base, - _PyUnicode_FromId(&PyId__fields), fnames, - _PyUnicode_FromId(&PyId___module__), - _PyUnicode_FromId(&PyId__ast)); + state->_fields, fnames, + state->__module__, + state->ast, + state->__doc__, doc); Py_DECREF(fnames); - return (PyTypeObject*)result; + return result; } -static int add_attributes(PyTypeObject* type, char**attrs, int num_fields) +static int +add_attributes(astmodulestate *state, PyObject *type, const char * const *attrs, int num_fields) { int i, result; PyObject *s, *l = PyTuple_New(num_fields); if (!l) return 0; for (i = 0; i < num_fields; i++) { - s = PyUnicode_FromString(attrs[i]); + s = PyUnicode_InternFromString(attrs[i]); if (!s) { Py_DECREF(l); return 0; } PyTuple_SET_ITEM(l, i, s); } - result = _PyObject_SetAttrId((PyObject*)type, &PyId__attributes, l) >= 0; + result = PyObject_SetAttr(type, state->_attributes, l) >= 0; Py_DECREF(l); return result; } /* Conversion AST -> Python */ -static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*)) +static PyObject* ast2obj_list(astmodulestate *state, asdl_seq *seq, PyObject* (*func)(astmodulestate *state, void*)) { Py_ssize_t i, n = asdl_seq_LEN(seq); PyObject *result = PyList_New(n); @@ -752,7 +1097,7 @@ static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*)) if (!result) return NULL; for (i = 0; i < n; i++) { - value = func(asdl_seq_GET(seq, i)); + value = func(state, asdl_seq_GET(seq, i)); if (!value) { Py_DECREF(result); return NULL; @@ -762,27 +1107,25 @@ static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*)) return result; } -static PyObject* ast2obj_object(void *o) +static PyObject* ast2obj_object(astmodulestate *Py_UNUSED(state), void *o) { if (!o) o = Py_None; Py_INCREF((PyObject*)o); return (PyObject*)o; } -#define ast2obj_singleton ast2obj_object #define ast2obj_constant ast2obj_object #define ast2obj_identifier ast2obj_object #define ast2obj_string ast2obj_object -#define ast2obj_bytes ast2obj_object -static PyObject* ast2obj_int(long b) +static PyObject* ast2obj_int(astmodulestate *Py_UNUSED(state), long b) { return PyLong_FromLong(b); } /* Conversion Python -> AST */ -static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_object(astmodulestate *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena) { if (obj == Py_None) obj = NULL; @@ -797,7 +1140,7 @@ static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena) return 0; } -static int obj2ast_constant(PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_constant(astmodulestate *Py_UNUSED(state), PyObject* obj, PyObject** out, PyArena* arena) { if (PyArena_AddPyObject(arena, obj) < 0) { *out = NULL; @@ -808,25 +1151,25 @@ static int obj2ast_constant(PyObject* obj, PyObject** out, PyArena* arena) return 0; } -static int obj2ast_identifier(PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_identifier(astmodulestate *state, PyObject* obj, PyObject** out, PyArena* arena) { if (!PyUnicode_CheckExact(obj) && obj != Py_None) { PyErr_SetString(PyExc_TypeError, "AST identifier must be of type str"); return 1; } - return obj2ast_object(obj, out, arena); + return obj2ast_object(state, obj, out, arena); } -static int obj2ast_string(PyObject* obj, PyObject** out, PyArena* arena) +static int obj2ast_string(astmodulestate *state, PyObject* obj, PyObject** out, PyArena* arena) { if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) { PyErr_SetString(PyExc_TypeError, "AST string must be of type str"); return 1; } - return obj2ast_object(obj, out, arena); + return obj2ast_object(state, obj, out, arena); } -static int obj2ast_int(PyObject* obj, int* out, PyArena* arena) +static int obj2ast_int(astmodulestate* Py_UNUSED(state), PyObject* obj, int* out, PyArena* arena) { int i; if (!PyLong_Check(obj)) { @@ -841,16 +1184,13 @@ static int obj2ast_int(PyObject* obj, int* out, PyArena* arena) return 0; } -static int add_ast_fields(void) +static int add_ast_fields(astmodulestate *state) { - PyObject *empty_tuple, *d; - if (PyType_Ready(&AST_type) < 0) - return -1; - d = AST_type.tp_dict; + PyObject *empty_tuple; empty_tuple = PyTuple_New(0); if (!empty_tuple || - _PyDict_SetItemId(d, &PyId__fields, empty_tuple) < 0 || - _PyDict_SetItemId(d, &PyId__attributes, empty_tuple) < 0) { + PyObject_SetAttrString(state->AST_type, "_fields", empty_tuple) < 0 || + PyObject_SetAttrString(state->AST_type, "_attributes", empty_tuple) < 0) { Py_XDECREF(empty_tuple); return -1; } @@ -859,359 +1199,717 @@ static int add_ast_fields(void) } -static int init_types(void) +static int init_types(astmodulestate *state) { - static int initialized; - if (initialized) return 1; - if (add_ast_fields() < 0) return 0; - mod_type = make_type("mod", &AST_type, NULL, 0); - if (!mod_type) return 0; - if (!add_attributes(mod_type, NULL, 0)) return 0; - Module_type = make_type("Module", mod_type, Module_fields, 2); - if (!Module_type) return 0; - Interactive_type = make_type("Interactive", mod_type, Interactive_fields, - 1); - if (!Interactive_type) return 0; - Expression_type = make_type("Expression", mod_type, Expression_fields, 1); - if (!Expression_type) return 0; - FunctionType_type = make_type("FunctionType", mod_type, - FunctionType_fields, 2); - if (!FunctionType_type) return 0; - Suite_type = make_type("Suite", mod_type, Suite_fields, 1); - if (!Suite_type) return 0; - stmt_type = make_type("stmt", &AST_type, NULL, 0); - if (!stmt_type) return 0; - if (!add_attributes(stmt_type, stmt_attributes, 4)) return 0; - FunctionDef_type = make_type("FunctionDef", stmt_type, FunctionDef_fields, - 6); - if (!FunctionDef_type) return 0; - AsyncFunctionDef_type = make_type("AsyncFunctionDef", stmt_type, - AsyncFunctionDef_fields, 6); - if (!AsyncFunctionDef_type) return 0; - ClassDef_type = make_type("ClassDef", stmt_type, ClassDef_fields, 5); - if (!ClassDef_type) return 0; - Return_type = make_type("Return", stmt_type, Return_fields, 1); - if (!Return_type) return 0; - Delete_type = make_type("Delete", stmt_type, Delete_fields, 1); - if (!Delete_type) return 0; - Assign_type = make_type("Assign", stmt_type, Assign_fields, 3); - if (!Assign_type) return 0; - AugAssign_type = make_type("AugAssign", stmt_type, AugAssign_fields, 3); - if (!AugAssign_type) return 0; - AnnAssign_type = make_type("AnnAssign", stmt_type, AnnAssign_fields, 4); - if (!AnnAssign_type) return 0; - For_type = make_type("For", stmt_type, For_fields, 5); - if (!For_type) return 0; - AsyncFor_type = make_type("AsyncFor", stmt_type, AsyncFor_fields, 5); - if (!AsyncFor_type) return 0; - While_type = make_type("While", stmt_type, While_fields, 3); - if (!While_type) return 0; - If_type = make_type("If", stmt_type, If_fields, 3); - if (!If_type) return 0; - With_type = make_type("With", stmt_type, With_fields, 3); - if (!With_type) return 0; - AsyncWith_type = make_type("AsyncWith", stmt_type, AsyncWith_fields, 3); - if (!AsyncWith_type) return 0; - Raise_type = make_type("Raise", stmt_type, Raise_fields, 2); - if (!Raise_type) return 0; - Try_type = make_type("Try", stmt_type, Try_fields, 4); - if (!Try_type) return 0; - Assert_type = make_type("Assert", stmt_type, Assert_fields, 2); - if (!Assert_type) return 0; - Import_type = make_type("Import", stmt_type, Import_fields, 1); - if (!Import_type) return 0; - ImportFrom_type = make_type("ImportFrom", stmt_type, ImportFrom_fields, 3); - if (!ImportFrom_type) return 0; - Global_type = make_type("Global", stmt_type, Global_fields, 1); - if (!Global_type) return 0; - Nonlocal_type = make_type("Nonlocal", stmt_type, Nonlocal_fields, 1); - if (!Nonlocal_type) return 0; - Expr_type = make_type("Expr", stmt_type, Expr_fields, 1); - if (!Expr_type) return 0; - Pass_type = make_type("Pass", stmt_type, NULL, 0); - if (!Pass_type) return 0; - Break_type = make_type("Break", stmt_type, NULL, 0); - if (!Break_type) return 0; - Continue_type = make_type("Continue", stmt_type, NULL, 0); - if (!Continue_type) return 0; - expr_type = make_type("expr", &AST_type, NULL, 0); - if (!expr_type) return 0; - if (!add_attributes(expr_type, expr_attributes, 4)) return 0; - BoolOp_type = make_type("BoolOp", expr_type, BoolOp_fields, 2); - if (!BoolOp_type) return 0; - NamedExpr_type = make_type("NamedExpr", expr_type, NamedExpr_fields, 2); - if (!NamedExpr_type) return 0; - BinOp_type = make_type("BinOp", expr_type, BinOp_fields, 3); - if (!BinOp_type) return 0; - UnaryOp_type = make_type("UnaryOp", expr_type, UnaryOp_fields, 2); - if (!UnaryOp_type) return 0; - Lambda_type = make_type("Lambda", expr_type, Lambda_fields, 2); - if (!Lambda_type) return 0; - IfExp_type = make_type("IfExp", expr_type, IfExp_fields, 3); - if (!IfExp_type) return 0; - Dict_type = make_type("Dict", expr_type, Dict_fields, 2); - if (!Dict_type) return 0; - Set_type = make_type("Set", expr_type, Set_fields, 1); - if (!Set_type) return 0; - ListComp_type = make_type("ListComp", expr_type, ListComp_fields, 2); - if (!ListComp_type) return 0; - SetComp_type = make_type("SetComp", expr_type, SetComp_fields, 2); - if (!SetComp_type) return 0; - DictComp_type = make_type("DictComp", expr_type, DictComp_fields, 3); - if (!DictComp_type) return 0; - GeneratorExp_type = make_type("GeneratorExp", expr_type, - GeneratorExp_fields, 2); - if (!GeneratorExp_type) return 0; - Await_type = make_type("Await", expr_type, Await_fields, 1); - if (!Await_type) return 0; - Yield_type = make_type("Yield", expr_type, Yield_fields, 1); - if (!Yield_type) return 0; - YieldFrom_type = make_type("YieldFrom", expr_type, YieldFrom_fields, 1); - if (!YieldFrom_type) return 0; - Compare_type = make_type("Compare", expr_type, Compare_fields, 3); - if (!Compare_type) return 0; - Call_type = make_type("Call", expr_type, Call_fields, 3); - if (!Call_type) return 0; - FormattedValue_type = make_type("FormattedValue", expr_type, - FormattedValue_fields, 3); - if (!FormattedValue_type) return 0; - JoinedStr_type = make_type("JoinedStr", expr_type, JoinedStr_fields, 1); - if (!JoinedStr_type) return 0; - Constant_type = make_type("Constant", expr_type, Constant_fields, 2); - if (!Constant_type) return 0; - Attribute_type = make_type("Attribute", expr_type, Attribute_fields, 3); - if (!Attribute_type) return 0; - Subscript_type = make_type("Subscript", expr_type, Subscript_fields, 3); - if (!Subscript_type) return 0; - Starred_type = make_type("Starred", expr_type, Starred_fields, 2); - if (!Starred_type) return 0; - Name_type = make_type("Name", expr_type, Name_fields, 2); - if (!Name_type) return 0; - List_type = make_type("List", expr_type, List_fields, 2); - if (!List_type) return 0; - Tuple_type = make_type("Tuple", expr_type, Tuple_fields, 2); - if (!Tuple_type) return 0; - expr_context_type = make_type("expr_context", &AST_type, NULL, 0); - if (!expr_context_type) return 0; - if (!add_attributes(expr_context_type, NULL, 0)) return 0; - Load_type = make_type("Load", expr_context_type, NULL, 0); - if (!Load_type) return 0; - Load_singleton = PyType_GenericNew(Load_type, NULL, NULL); - if (!Load_singleton) return 0; - Store_type = make_type("Store", expr_context_type, NULL, 0); - if (!Store_type) return 0; - Store_singleton = PyType_GenericNew(Store_type, NULL, NULL); - if (!Store_singleton) return 0; - Del_type = make_type("Del", expr_context_type, NULL, 0); - if (!Del_type) return 0; - Del_singleton = PyType_GenericNew(Del_type, NULL, NULL); - if (!Del_singleton) return 0; - AugLoad_type = make_type("AugLoad", expr_context_type, NULL, 0); - if (!AugLoad_type) return 0; - AugLoad_singleton = PyType_GenericNew(AugLoad_type, NULL, NULL); - if (!AugLoad_singleton) return 0; - AugStore_type = make_type("AugStore", expr_context_type, NULL, 0); - if (!AugStore_type) return 0; - AugStore_singleton = PyType_GenericNew(AugStore_type, NULL, NULL); - if (!AugStore_singleton) return 0; - Param_type = make_type("Param", expr_context_type, NULL, 0); - if (!Param_type) return 0; - Param_singleton = PyType_GenericNew(Param_type, NULL, NULL); - if (!Param_singleton) return 0; - slice_type = make_type("slice", &AST_type, NULL, 0); - if (!slice_type) return 0; - if (!add_attributes(slice_type, NULL, 0)) return 0; - Slice_type = make_type("Slice", slice_type, Slice_fields, 3); - if (!Slice_type) return 0; - ExtSlice_type = make_type("ExtSlice", slice_type, ExtSlice_fields, 1); - if (!ExtSlice_type) return 0; - Index_type = make_type("Index", slice_type, Index_fields, 1); - if (!Index_type) return 0; - boolop_type = make_type("boolop", &AST_type, NULL, 0); - if (!boolop_type) return 0; - if (!add_attributes(boolop_type, NULL, 0)) return 0; - And_type = make_type("And", boolop_type, NULL, 0); - if (!And_type) return 0; - And_singleton = PyType_GenericNew(And_type, NULL, NULL); - if (!And_singleton) return 0; - Or_type = make_type("Or", boolop_type, NULL, 0); - if (!Or_type) return 0; - Or_singleton = PyType_GenericNew(Or_type, NULL, NULL); - if (!Or_singleton) return 0; - operator_type = make_type("operator", &AST_type, NULL, 0); - if (!operator_type) return 0; - if (!add_attributes(operator_type, NULL, 0)) return 0; - Add_type = make_type("Add", operator_type, NULL, 0); - if (!Add_type) return 0; - Add_singleton = PyType_GenericNew(Add_type, NULL, NULL); - if (!Add_singleton) return 0; - Sub_type = make_type("Sub", operator_type, NULL, 0); - if (!Sub_type) return 0; - Sub_singleton = PyType_GenericNew(Sub_type, NULL, NULL); - if (!Sub_singleton) return 0; - Mult_type = make_type("Mult", operator_type, NULL, 0); - if (!Mult_type) return 0; - Mult_singleton = PyType_GenericNew(Mult_type, NULL, NULL); - if (!Mult_singleton) return 0; - MatMult_type = make_type("MatMult", operator_type, NULL, 0); - if (!MatMult_type) return 0; - MatMult_singleton = PyType_GenericNew(MatMult_type, NULL, NULL); - if (!MatMult_singleton) return 0; - Div_type = make_type("Div", operator_type, NULL, 0); - if (!Div_type) return 0; - Div_singleton = PyType_GenericNew(Div_type, NULL, NULL); - if (!Div_singleton) return 0; - Mod_type = make_type("Mod", operator_type, NULL, 0); - if (!Mod_type) return 0; - Mod_singleton = PyType_GenericNew(Mod_type, NULL, NULL); - if (!Mod_singleton) return 0; - Pow_type = make_type("Pow", operator_type, NULL, 0); - if (!Pow_type) return 0; - Pow_singleton = PyType_GenericNew(Pow_type, NULL, NULL); - if (!Pow_singleton) return 0; - LShift_type = make_type("LShift", operator_type, NULL, 0); - if (!LShift_type) return 0; - LShift_singleton = PyType_GenericNew(LShift_type, NULL, NULL); - if (!LShift_singleton) return 0; - RShift_type = make_type("RShift", operator_type, NULL, 0); - if (!RShift_type) return 0; - RShift_singleton = PyType_GenericNew(RShift_type, NULL, NULL); - if (!RShift_singleton) return 0; - BitOr_type = make_type("BitOr", operator_type, NULL, 0); - if (!BitOr_type) return 0; - BitOr_singleton = PyType_GenericNew(BitOr_type, NULL, NULL); - if (!BitOr_singleton) return 0; - BitXor_type = make_type("BitXor", operator_type, NULL, 0); - if (!BitXor_type) return 0; - BitXor_singleton = PyType_GenericNew(BitXor_type, NULL, NULL); - if (!BitXor_singleton) return 0; - BitAnd_type = make_type("BitAnd", operator_type, NULL, 0); - if (!BitAnd_type) return 0; - BitAnd_singleton = PyType_GenericNew(BitAnd_type, NULL, NULL); - if (!BitAnd_singleton) return 0; - FloorDiv_type = make_type("FloorDiv", operator_type, NULL, 0); - if (!FloorDiv_type) return 0; - FloorDiv_singleton = PyType_GenericNew(FloorDiv_type, NULL, NULL); - if (!FloorDiv_singleton) return 0; - unaryop_type = make_type("unaryop", &AST_type, NULL, 0); - if (!unaryop_type) return 0; - if (!add_attributes(unaryop_type, NULL, 0)) return 0; - Invert_type = make_type("Invert", unaryop_type, NULL, 0); - if (!Invert_type) return 0; - Invert_singleton = PyType_GenericNew(Invert_type, NULL, NULL); - if (!Invert_singleton) return 0; - Not_type = make_type("Not", unaryop_type, NULL, 0); - if (!Not_type) return 0; - Not_singleton = PyType_GenericNew(Not_type, NULL, NULL); - if (!Not_singleton) return 0; - UAdd_type = make_type("UAdd", unaryop_type, NULL, 0); - if (!UAdd_type) return 0; - UAdd_singleton = PyType_GenericNew(UAdd_type, NULL, NULL); - if (!UAdd_singleton) return 0; - USub_type = make_type("USub", unaryop_type, NULL, 0); - if (!USub_type) return 0; - USub_singleton = PyType_GenericNew(USub_type, NULL, NULL); - if (!USub_singleton) return 0; - cmpop_type = make_type("cmpop", &AST_type, NULL, 0); - if (!cmpop_type) return 0; - if (!add_attributes(cmpop_type, NULL, 0)) return 0; - Eq_type = make_type("Eq", cmpop_type, NULL, 0); - if (!Eq_type) return 0; - Eq_singleton = PyType_GenericNew(Eq_type, NULL, NULL); - if (!Eq_singleton) return 0; - NotEq_type = make_type("NotEq", cmpop_type, NULL, 0); - if (!NotEq_type) return 0; - NotEq_singleton = PyType_GenericNew(NotEq_type, NULL, NULL); - if (!NotEq_singleton) return 0; - Lt_type = make_type("Lt", cmpop_type, NULL, 0); - if (!Lt_type) return 0; - Lt_singleton = PyType_GenericNew(Lt_type, NULL, NULL); - if (!Lt_singleton) return 0; - LtE_type = make_type("LtE", cmpop_type, NULL, 0); - if (!LtE_type) return 0; - LtE_singleton = PyType_GenericNew(LtE_type, NULL, NULL); - if (!LtE_singleton) return 0; - Gt_type = make_type("Gt", cmpop_type, NULL, 0); - if (!Gt_type) return 0; - Gt_singleton = PyType_GenericNew(Gt_type, NULL, NULL); - if (!Gt_singleton) return 0; - GtE_type = make_type("GtE", cmpop_type, NULL, 0); - if (!GtE_type) return 0; - GtE_singleton = PyType_GenericNew(GtE_type, NULL, NULL); - if (!GtE_singleton) return 0; - Is_type = make_type("Is", cmpop_type, NULL, 0); - if (!Is_type) return 0; - Is_singleton = PyType_GenericNew(Is_type, NULL, NULL); - if (!Is_singleton) return 0; - IsNot_type = make_type("IsNot", cmpop_type, NULL, 0); - if (!IsNot_type) return 0; - IsNot_singleton = PyType_GenericNew(IsNot_type, NULL, NULL); - if (!IsNot_singleton) return 0; - In_type = make_type("In", cmpop_type, NULL, 0); - if (!In_type) return 0; - In_singleton = PyType_GenericNew(In_type, NULL, NULL); - if (!In_singleton) return 0; - NotIn_type = make_type("NotIn", cmpop_type, NULL, 0); - if (!NotIn_type) return 0; - NotIn_singleton = PyType_GenericNew(NotIn_type, NULL, NULL); - if (!NotIn_singleton) return 0; - comprehension_type = make_type("comprehension", &AST_type, - comprehension_fields, 4); - if (!comprehension_type) return 0; - if (!add_attributes(comprehension_type, NULL, 0)) return 0; - excepthandler_type = make_type("excepthandler", &AST_type, NULL, 0); - if (!excepthandler_type) return 0; - if (!add_attributes(excepthandler_type, excepthandler_attributes, 4)) - return 0; - ExceptHandler_type = make_type("ExceptHandler", excepthandler_type, - ExceptHandler_fields, 3); - if (!ExceptHandler_type) return 0; - arguments_type = make_type("arguments", &AST_type, arguments_fields, 7); - if (!arguments_type) return 0; - if (!add_attributes(arguments_type, NULL, 0)) return 0; - arg_type = make_type("arg", &AST_type, arg_fields, 3); - if (!arg_type) return 0; - if (!add_attributes(arg_type, arg_attributes, 4)) return 0; - keyword_type = make_type("keyword", &AST_type, keyword_fields, 2); - if (!keyword_type) return 0; - if (!add_attributes(keyword_type, NULL, 0)) return 0; - alias_type = make_type("alias", &AST_type, alias_fields, 2); - if (!alias_type) return 0; - if (!add_attributes(alias_type, NULL, 0)) return 0; - withitem_type = make_type("withitem", &AST_type, withitem_fields, 2); - if (!withitem_type) return 0; - if (!add_attributes(withitem_type, NULL, 0)) return 0; - type_ignore_type = make_type("type_ignore", &AST_type, NULL, 0); - if (!type_ignore_type) return 0; - if (!add_attributes(type_ignore_type, NULL, 0)) return 0; - TypeIgnore_type = make_type("TypeIgnore", type_ignore_type, - TypeIgnore_fields, 2); - if (!TypeIgnore_type) return 0; - initialized = 1; + if (state->initialized) return 1; + if (init_identifiers(state) < 0) return 0; + state->AST_type = PyType_FromSpec(&AST_type_spec); + if (!state->AST_type) return 0; + if (add_ast_fields(state) < 0) return 0; + state->mod_type = make_type(state, "mod", state->AST_type, NULL, 0, + "mod = Module(stmt* body, type_ignore* type_ignores)\n" + " | Interactive(stmt* body)\n" + " | Expression(expr body)\n" + " | FunctionType(expr* argtypes, expr returns)"); + if (!state->mod_type) return 0; + if (!add_attributes(state, state->mod_type, NULL, 0)) return 0; + state->Module_type = make_type(state, "Module", state->mod_type, + Module_fields, 2, + "Module(stmt* body, type_ignore* type_ignores)"); + if (!state->Module_type) return 0; + state->Interactive_type = make_type(state, "Interactive", state->mod_type, + Interactive_fields, 1, + "Interactive(stmt* body)"); + if (!state->Interactive_type) return 0; + state->Expression_type = make_type(state, "Expression", state->mod_type, + Expression_fields, 1, + "Expression(expr body)"); + if (!state->Expression_type) return 0; + state->FunctionType_type = make_type(state, "FunctionType", + state->mod_type, FunctionType_fields, + 2, + "FunctionType(expr* argtypes, expr returns)"); + if (!state->FunctionType_type) return 0; + state->stmt_type = make_type(state, "stmt", state->AST_type, NULL, 0, + "stmt = FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)\n" + " | AsyncFunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)\n" + " | ClassDef(identifier name, expr* bases, keyword* keywords, stmt* body, expr* decorator_list)\n" + " | Return(expr? value)\n" + " | Delete(expr* targets)\n" + " | Assign(expr* targets, expr value, string? type_comment)\n" + " | AugAssign(expr target, operator op, expr value)\n" + " | AnnAssign(expr target, expr annotation, expr? value, int simple)\n" + " | For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)\n" + " | AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)\n" + " | While(expr test, stmt* body, stmt* orelse)\n" + " | If(expr test, stmt* body, stmt* orelse)\n" + " | With(withitem* items, stmt* body, string? type_comment)\n" + " | AsyncWith(withitem* items, stmt* body, string? type_comment)\n" + " | Raise(expr? exc, expr? cause)\n" + " | Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)\n" + " | Assert(expr test, expr? msg)\n" + " | Import(alias* names)\n" + " | ImportFrom(identifier? module, alias* names, int? level)\n" + " | Global(identifier* names)\n" + " | Nonlocal(identifier* names)\n" + " | Expr(expr value)\n" + " | Pass\n" + " | Break\n" + " | Continue"); + if (!state->stmt_type) return 0; + if (!add_attributes(state, state->stmt_type, stmt_attributes, 4)) return 0; + if (PyObject_SetAttr(state->stmt_type, state->end_lineno, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->stmt_type, state->end_col_offset, Py_None) == + -1) + return 0; + state->FunctionDef_type = make_type(state, "FunctionDef", state->stmt_type, + FunctionDef_fields, 6, + "FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)"); + if (!state->FunctionDef_type) return 0; + if (PyObject_SetAttr(state->FunctionDef_type, state->returns, Py_None) == + -1) + return 0; + if (PyObject_SetAttr(state->FunctionDef_type, state->type_comment, Py_None) + == -1) + return 0; + state->AsyncFunctionDef_type = make_type(state, "AsyncFunctionDef", + state->stmt_type, + AsyncFunctionDef_fields, 6, + "AsyncFunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)"); + if (!state->AsyncFunctionDef_type) return 0; + if (PyObject_SetAttr(state->AsyncFunctionDef_type, state->returns, Py_None) + == -1) + return 0; + if (PyObject_SetAttr(state->AsyncFunctionDef_type, state->type_comment, + Py_None) == -1) + return 0; + state->ClassDef_type = make_type(state, "ClassDef", state->stmt_type, + ClassDef_fields, 5, + "ClassDef(identifier name, expr* bases, keyword* keywords, stmt* body, expr* decorator_list)"); + if (!state->ClassDef_type) return 0; + state->Return_type = make_type(state, "Return", state->stmt_type, + Return_fields, 1, + "Return(expr? value)"); + if (!state->Return_type) return 0; + if (PyObject_SetAttr(state->Return_type, state->value, Py_None) == -1) + return 0; + state->Delete_type = make_type(state, "Delete", state->stmt_type, + Delete_fields, 1, + "Delete(expr* targets)"); + if (!state->Delete_type) return 0; + state->Assign_type = make_type(state, "Assign", state->stmt_type, + Assign_fields, 3, + "Assign(expr* targets, expr value, string? type_comment)"); + if (!state->Assign_type) return 0; + if (PyObject_SetAttr(state->Assign_type, state->type_comment, Py_None) == + -1) + return 0; + state->AugAssign_type = make_type(state, "AugAssign", state->stmt_type, + AugAssign_fields, 3, + "AugAssign(expr target, operator op, expr value)"); + if (!state->AugAssign_type) return 0; + state->AnnAssign_type = make_type(state, "AnnAssign", state->stmt_type, + AnnAssign_fields, 4, + "AnnAssign(expr target, expr annotation, expr? value, int simple)"); + if (!state->AnnAssign_type) return 0; + if (PyObject_SetAttr(state->AnnAssign_type, state->value, Py_None) == -1) + return 0; + state->For_type = make_type(state, "For", state->stmt_type, For_fields, 5, + "For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)"); + if (!state->For_type) return 0; + if (PyObject_SetAttr(state->For_type, state->type_comment, Py_None) == -1) + return 0; + state->AsyncFor_type = make_type(state, "AsyncFor", state->stmt_type, + AsyncFor_fields, 5, + "AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)"); + if (!state->AsyncFor_type) return 0; + if (PyObject_SetAttr(state->AsyncFor_type, state->type_comment, Py_None) == + -1) + return 0; + state->While_type = make_type(state, "While", state->stmt_type, + While_fields, 3, + "While(expr test, stmt* body, stmt* orelse)"); + if (!state->While_type) return 0; + state->If_type = make_type(state, "If", state->stmt_type, If_fields, 3, + "If(expr test, stmt* body, stmt* orelse)"); + if (!state->If_type) return 0; + state->With_type = make_type(state, "With", state->stmt_type, With_fields, + 3, + "With(withitem* items, stmt* body, string? type_comment)"); + if (!state->With_type) return 0; + if (PyObject_SetAttr(state->With_type, state->type_comment, Py_None) == -1) + return 0; + state->AsyncWith_type = make_type(state, "AsyncWith", state->stmt_type, + AsyncWith_fields, 3, + "AsyncWith(withitem* items, stmt* body, string? type_comment)"); + if (!state->AsyncWith_type) return 0; + if (PyObject_SetAttr(state->AsyncWith_type, state->type_comment, Py_None) + == -1) + return 0; + state->Raise_type = make_type(state, "Raise", state->stmt_type, + Raise_fields, 2, + "Raise(expr? exc, expr? cause)"); + if (!state->Raise_type) return 0; + if (PyObject_SetAttr(state->Raise_type, state->exc, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->Raise_type, state->cause, Py_None) == -1) + return 0; + state->Try_type = make_type(state, "Try", state->stmt_type, Try_fields, 4, + "Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)"); + if (!state->Try_type) return 0; + state->Assert_type = make_type(state, "Assert", state->stmt_type, + Assert_fields, 2, + "Assert(expr test, expr? msg)"); + if (!state->Assert_type) return 0; + if (PyObject_SetAttr(state->Assert_type, state->msg, Py_None) == -1) + return 0; + state->Import_type = make_type(state, "Import", state->stmt_type, + Import_fields, 1, + "Import(alias* names)"); + if (!state->Import_type) return 0; + state->ImportFrom_type = make_type(state, "ImportFrom", state->stmt_type, + ImportFrom_fields, 3, + "ImportFrom(identifier? module, alias* names, int? level)"); + if (!state->ImportFrom_type) return 0; + if (PyObject_SetAttr(state->ImportFrom_type, state->module, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->ImportFrom_type, state->level, Py_None) == -1) + return 0; + state->Global_type = make_type(state, "Global", state->stmt_type, + Global_fields, 1, + "Global(identifier* names)"); + if (!state->Global_type) return 0; + state->Nonlocal_type = make_type(state, "Nonlocal", state->stmt_type, + Nonlocal_fields, 1, + "Nonlocal(identifier* names)"); + if (!state->Nonlocal_type) return 0; + state->Expr_type = make_type(state, "Expr", state->stmt_type, Expr_fields, + 1, + "Expr(expr value)"); + if (!state->Expr_type) return 0; + state->Pass_type = make_type(state, "Pass", state->stmt_type, NULL, 0, + "Pass"); + if (!state->Pass_type) return 0; + state->Break_type = make_type(state, "Break", state->stmt_type, NULL, 0, + "Break"); + if (!state->Break_type) return 0; + state->Continue_type = make_type(state, "Continue", state->stmt_type, NULL, + 0, + "Continue"); + if (!state->Continue_type) return 0; + state->expr_type = make_type(state, "expr", state->AST_type, NULL, 0, + "expr = BoolOp(boolop op, expr* values)\n" + " | NamedExpr(expr target, expr value)\n" + " | BinOp(expr left, operator op, expr right)\n" + " | UnaryOp(unaryop op, expr operand)\n" + " | Lambda(arguments args, expr body)\n" + " | IfExp(expr test, expr body, expr orelse)\n" + " | Dict(expr* keys, expr* values)\n" + " | Set(expr* elts)\n" + " | ListComp(expr elt, comprehension* generators)\n" + " | SetComp(expr elt, comprehension* generators)\n" + " | DictComp(expr key, expr value, comprehension* generators)\n" + " | GeneratorExp(expr elt, comprehension* generators)\n" + " | Await(expr value)\n" + " | Yield(expr? value)\n" + " | YieldFrom(expr value)\n" + " | Compare(expr left, cmpop* ops, expr* comparators)\n" + " | Call(expr func, expr* args, keyword* keywords)\n" + " | FormattedValue(expr value, int? conversion, expr? format_spec)\n" + " | JoinedStr(expr* values)\n" + " | Constant(constant value, string? kind)\n" + " | Attribute(expr value, identifier attr, expr_context ctx)\n" + " | Subscript(expr value, expr slice, expr_context ctx)\n" + " | Starred(expr value, expr_context ctx)\n" + " | Name(identifier id, expr_context ctx)\n" + " | List(expr* elts, expr_context ctx)\n" + " | Tuple(expr* elts, expr_context ctx)\n" + " | Slice(expr? lower, expr? upper, expr? step)"); + if (!state->expr_type) return 0; + if (!add_attributes(state, state->expr_type, expr_attributes, 4)) return 0; + if (PyObject_SetAttr(state->expr_type, state->end_lineno, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->expr_type, state->end_col_offset, Py_None) == + -1) + return 0; + state->BoolOp_type = make_type(state, "BoolOp", state->expr_type, + BoolOp_fields, 2, + "BoolOp(boolop op, expr* values)"); + if (!state->BoolOp_type) return 0; + state->NamedExpr_type = make_type(state, "NamedExpr", state->expr_type, + NamedExpr_fields, 2, + "NamedExpr(expr target, expr value)"); + if (!state->NamedExpr_type) return 0; + state->BinOp_type = make_type(state, "BinOp", state->expr_type, + BinOp_fields, 3, + "BinOp(expr left, operator op, expr right)"); + if (!state->BinOp_type) return 0; + state->UnaryOp_type = make_type(state, "UnaryOp", state->expr_type, + UnaryOp_fields, 2, + "UnaryOp(unaryop op, expr operand)"); + if (!state->UnaryOp_type) return 0; + state->Lambda_type = make_type(state, "Lambda", state->expr_type, + Lambda_fields, 2, + "Lambda(arguments args, expr body)"); + if (!state->Lambda_type) return 0; + state->IfExp_type = make_type(state, "IfExp", state->expr_type, + IfExp_fields, 3, + "IfExp(expr test, expr body, expr orelse)"); + if (!state->IfExp_type) return 0; + state->Dict_type = make_type(state, "Dict", state->expr_type, Dict_fields, + 2, + "Dict(expr* keys, expr* values)"); + if (!state->Dict_type) return 0; + state->Set_type = make_type(state, "Set", state->expr_type, Set_fields, 1, + "Set(expr* elts)"); + if (!state->Set_type) return 0; + state->ListComp_type = make_type(state, "ListComp", state->expr_type, + ListComp_fields, 2, + "ListComp(expr elt, comprehension* generators)"); + if (!state->ListComp_type) return 0; + state->SetComp_type = make_type(state, "SetComp", state->expr_type, + SetComp_fields, 2, + "SetComp(expr elt, comprehension* generators)"); + if (!state->SetComp_type) return 0; + state->DictComp_type = make_type(state, "DictComp", state->expr_type, + DictComp_fields, 3, + "DictComp(expr key, expr value, comprehension* generators)"); + if (!state->DictComp_type) return 0; + state->GeneratorExp_type = make_type(state, "GeneratorExp", + state->expr_type, GeneratorExp_fields, + 2, + "GeneratorExp(expr elt, comprehension* generators)"); + if (!state->GeneratorExp_type) return 0; + state->Await_type = make_type(state, "Await", state->expr_type, + Await_fields, 1, + "Await(expr value)"); + if (!state->Await_type) return 0; + state->Yield_type = make_type(state, "Yield", state->expr_type, + Yield_fields, 1, + "Yield(expr? value)"); + if (!state->Yield_type) return 0; + if (PyObject_SetAttr(state->Yield_type, state->value, Py_None) == -1) + return 0; + state->YieldFrom_type = make_type(state, "YieldFrom", state->expr_type, + YieldFrom_fields, 1, + "YieldFrom(expr value)"); + if (!state->YieldFrom_type) return 0; + state->Compare_type = make_type(state, "Compare", state->expr_type, + Compare_fields, 3, + "Compare(expr left, cmpop* ops, expr* comparators)"); + if (!state->Compare_type) return 0; + state->Call_type = make_type(state, "Call", state->expr_type, Call_fields, + 3, + "Call(expr func, expr* args, keyword* keywords)"); + if (!state->Call_type) return 0; + state->FormattedValue_type = make_type(state, "FormattedValue", + state->expr_type, + FormattedValue_fields, 3, + "FormattedValue(expr value, int? conversion, expr? format_spec)"); + if (!state->FormattedValue_type) return 0; + if (PyObject_SetAttr(state->FormattedValue_type, state->conversion, + Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->FormattedValue_type, state->format_spec, + Py_None) == -1) + return 0; + state->JoinedStr_type = make_type(state, "JoinedStr", state->expr_type, + JoinedStr_fields, 1, + "JoinedStr(expr* values)"); + if (!state->JoinedStr_type) return 0; + state->Constant_type = make_type(state, "Constant", state->expr_type, + Constant_fields, 2, + "Constant(constant value, string? kind)"); + if (!state->Constant_type) return 0; + if (PyObject_SetAttr(state->Constant_type, state->kind, Py_None) == -1) + return 0; + state->Attribute_type = make_type(state, "Attribute", state->expr_type, + Attribute_fields, 3, + "Attribute(expr value, identifier attr, expr_context ctx)"); + if (!state->Attribute_type) return 0; + state->Subscript_type = make_type(state, "Subscript", state->expr_type, + Subscript_fields, 3, + "Subscript(expr value, expr slice, expr_context ctx)"); + if (!state->Subscript_type) return 0; + state->Starred_type = make_type(state, "Starred", state->expr_type, + Starred_fields, 2, + "Starred(expr value, expr_context ctx)"); + if (!state->Starred_type) return 0; + state->Name_type = make_type(state, "Name", state->expr_type, Name_fields, + 2, + "Name(identifier id, expr_context ctx)"); + if (!state->Name_type) return 0; + state->List_type = make_type(state, "List", state->expr_type, List_fields, + 2, + "List(expr* elts, expr_context ctx)"); + if (!state->List_type) return 0; + state->Tuple_type = make_type(state, "Tuple", state->expr_type, + Tuple_fields, 2, + "Tuple(expr* elts, expr_context ctx)"); + if (!state->Tuple_type) return 0; + state->Slice_type = make_type(state, "Slice", state->expr_type, + Slice_fields, 3, + "Slice(expr? lower, expr? upper, expr? step)"); + if (!state->Slice_type) return 0; + if (PyObject_SetAttr(state->Slice_type, state->lower, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->Slice_type, state->upper, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->Slice_type, state->step, Py_None) == -1) + return 0; + state->expr_context_type = make_type(state, "expr_context", + state->AST_type, NULL, 0, + "expr_context = Load | Store | Del"); + if (!state->expr_context_type) return 0; + if (!add_attributes(state, state->expr_context_type, NULL, 0)) return 0; + state->Load_type = make_type(state, "Load", state->expr_context_type, NULL, + 0, + "Load"); + if (!state->Load_type) return 0; + state->Load_singleton = PyType_GenericNew((PyTypeObject *)state->Load_type, + NULL, NULL); + if (!state->Load_singleton) return 0; + state->Store_type = make_type(state, "Store", state->expr_context_type, + NULL, 0, + "Store"); + if (!state->Store_type) return 0; + state->Store_singleton = PyType_GenericNew((PyTypeObject + *)state->Store_type, NULL, NULL); + if (!state->Store_singleton) return 0; + state->Del_type = make_type(state, "Del", state->expr_context_type, NULL, 0, + "Del"); + if (!state->Del_type) return 0; + state->Del_singleton = PyType_GenericNew((PyTypeObject *)state->Del_type, + NULL, NULL); + if (!state->Del_singleton) return 0; + state->boolop_type = make_type(state, "boolop", state->AST_type, NULL, 0, + "boolop = And | Or"); + if (!state->boolop_type) return 0; + if (!add_attributes(state, state->boolop_type, NULL, 0)) return 0; + state->And_type = make_type(state, "And", state->boolop_type, NULL, 0, + "And"); + if (!state->And_type) return 0; + state->And_singleton = PyType_GenericNew((PyTypeObject *)state->And_type, + NULL, NULL); + if (!state->And_singleton) return 0; + state->Or_type = make_type(state, "Or", state->boolop_type, NULL, 0, + "Or"); + if (!state->Or_type) return 0; + state->Or_singleton = PyType_GenericNew((PyTypeObject *)state->Or_type, + NULL, NULL); + if (!state->Or_singleton) return 0; + state->operator_type = make_type(state, "operator", state->AST_type, NULL, + 0, + "operator = Add | Sub | Mult | MatMult | Div | Mod | Pow | LShift | RShift | BitOr | BitXor | BitAnd | FloorDiv"); + if (!state->operator_type) return 0; + if (!add_attributes(state, state->operator_type, NULL, 0)) return 0; + state->Add_type = make_type(state, "Add", state->operator_type, NULL, 0, + "Add"); + if (!state->Add_type) return 0; + state->Add_singleton = PyType_GenericNew((PyTypeObject *)state->Add_type, + NULL, NULL); + if (!state->Add_singleton) return 0; + state->Sub_type = make_type(state, "Sub", state->operator_type, NULL, 0, + "Sub"); + if (!state->Sub_type) return 0; + state->Sub_singleton = PyType_GenericNew((PyTypeObject *)state->Sub_type, + NULL, NULL); + if (!state->Sub_singleton) return 0; + state->Mult_type = make_type(state, "Mult", state->operator_type, NULL, 0, + "Mult"); + if (!state->Mult_type) return 0; + state->Mult_singleton = PyType_GenericNew((PyTypeObject *)state->Mult_type, + NULL, NULL); + if (!state->Mult_singleton) return 0; + state->MatMult_type = make_type(state, "MatMult", state->operator_type, + NULL, 0, + "MatMult"); + if (!state->MatMult_type) return 0; + state->MatMult_singleton = PyType_GenericNew((PyTypeObject + *)state->MatMult_type, NULL, + NULL); + if (!state->MatMult_singleton) return 0; + state->Div_type = make_type(state, "Div", state->operator_type, NULL, 0, + "Div"); + if (!state->Div_type) return 0; + state->Div_singleton = PyType_GenericNew((PyTypeObject *)state->Div_type, + NULL, NULL); + if (!state->Div_singleton) return 0; + state->Mod_type = make_type(state, "Mod", state->operator_type, NULL, 0, + "Mod"); + if (!state->Mod_type) return 0; + state->Mod_singleton = PyType_GenericNew((PyTypeObject *)state->Mod_type, + NULL, NULL); + if (!state->Mod_singleton) return 0; + state->Pow_type = make_type(state, "Pow", state->operator_type, NULL, 0, + "Pow"); + if (!state->Pow_type) return 0; + state->Pow_singleton = PyType_GenericNew((PyTypeObject *)state->Pow_type, + NULL, NULL); + if (!state->Pow_singleton) return 0; + state->LShift_type = make_type(state, "LShift", state->operator_type, NULL, + 0, + "LShift"); + if (!state->LShift_type) return 0; + state->LShift_singleton = PyType_GenericNew((PyTypeObject + *)state->LShift_type, NULL, + NULL); + if (!state->LShift_singleton) return 0; + state->RShift_type = make_type(state, "RShift", state->operator_type, NULL, + 0, + "RShift"); + if (!state->RShift_type) return 0; + state->RShift_singleton = PyType_GenericNew((PyTypeObject + *)state->RShift_type, NULL, + NULL); + if (!state->RShift_singleton) return 0; + state->BitOr_type = make_type(state, "BitOr", state->operator_type, NULL, 0, + "BitOr"); + if (!state->BitOr_type) return 0; + state->BitOr_singleton = PyType_GenericNew((PyTypeObject + *)state->BitOr_type, NULL, NULL); + if (!state->BitOr_singleton) return 0; + state->BitXor_type = make_type(state, "BitXor", state->operator_type, NULL, + 0, + "BitXor"); + if (!state->BitXor_type) return 0; + state->BitXor_singleton = PyType_GenericNew((PyTypeObject + *)state->BitXor_type, NULL, + NULL); + if (!state->BitXor_singleton) return 0; + state->BitAnd_type = make_type(state, "BitAnd", state->operator_type, NULL, + 0, + "BitAnd"); + if (!state->BitAnd_type) return 0; + state->BitAnd_singleton = PyType_GenericNew((PyTypeObject + *)state->BitAnd_type, NULL, + NULL); + if (!state->BitAnd_singleton) return 0; + state->FloorDiv_type = make_type(state, "FloorDiv", state->operator_type, + NULL, 0, + "FloorDiv"); + if (!state->FloorDiv_type) return 0; + state->FloorDiv_singleton = PyType_GenericNew((PyTypeObject + *)state->FloorDiv_type, NULL, + NULL); + if (!state->FloorDiv_singleton) return 0; + state->unaryop_type = make_type(state, "unaryop", state->AST_type, NULL, 0, + "unaryop = Invert | Not | UAdd | USub"); + if (!state->unaryop_type) return 0; + if (!add_attributes(state, state->unaryop_type, NULL, 0)) return 0; + state->Invert_type = make_type(state, "Invert", state->unaryop_type, NULL, + 0, + "Invert"); + if (!state->Invert_type) return 0; + state->Invert_singleton = PyType_GenericNew((PyTypeObject + *)state->Invert_type, NULL, + NULL); + if (!state->Invert_singleton) return 0; + state->Not_type = make_type(state, "Not", state->unaryop_type, NULL, 0, + "Not"); + if (!state->Not_type) return 0; + state->Not_singleton = PyType_GenericNew((PyTypeObject *)state->Not_type, + NULL, NULL); + if (!state->Not_singleton) return 0; + state->UAdd_type = make_type(state, "UAdd", state->unaryop_type, NULL, 0, + "UAdd"); + if (!state->UAdd_type) return 0; + state->UAdd_singleton = PyType_GenericNew((PyTypeObject *)state->UAdd_type, + NULL, NULL); + if (!state->UAdd_singleton) return 0; + state->USub_type = make_type(state, "USub", state->unaryop_type, NULL, 0, + "USub"); + if (!state->USub_type) return 0; + state->USub_singleton = PyType_GenericNew((PyTypeObject *)state->USub_type, + NULL, NULL); + if (!state->USub_singleton) return 0; + state->cmpop_type = make_type(state, "cmpop", state->AST_type, NULL, 0, + "cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn"); + if (!state->cmpop_type) return 0; + if (!add_attributes(state, state->cmpop_type, NULL, 0)) return 0; + state->Eq_type = make_type(state, "Eq", state->cmpop_type, NULL, 0, + "Eq"); + if (!state->Eq_type) return 0; + state->Eq_singleton = PyType_GenericNew((PyTypeObject *)state->Eq_type, + NULL, NULL); + if (!state->Eq_singleton) return 0; + state->NotEq_type = make_type(state, "NotEq", state->cmpop_type, NULL, 0, + "NotEq"); + if (!state->NotEq_type) return 0; + state->NotEq_singleton = PyType_GenericNew((PyTypeObject + *)state->NotEq_type, NULL, NULL); + if (!state->NotEq_singleton) return 0; + state->Lt_type = make_type(state, "Lt", state->cmpop_type, NULL, 0, + "Lt"); + if (!state->Lt_type) return 0; + state->Lt_singleton = PyType_GenericNew((PyTypeObject *)state->Lt_type, + NULL, NULL); + if (!state->Lt_singleton) return 0; + state->LtE_type = make_type(state, "LtE", state->cmpop_type, NULL, 0, + "LtE"); + if (!state->LtE_type) return 0; + state->LtE_singleton = PyType_GenericNew((PyTypeObject *)state->LtE_type, + NULL, NULL); + if (!state->LtE_singleton) return 0; + state->Gt_type = make_type(state, "Gt", state->cmpop_type, NULL, 0, + "Gt"); + if (!state->Gt_type) return 0; + state->Gt_singleton = PyType_GenericNew((PyTypeObject *)state->Gt_type, + NULL, NULL); + if (!state->Gt_singleton) return 0; + state->GtE_type = make_type(state, "GtE", state->cmpop_type, NULL, 0, + "GtE"); + if (!state->GtE_type) return 0; + state->GtE_singleton = PyType_GenericNew((PyTypeObject *)state->GtE_type, + NULL, NULL); + if (!state->GtE_singleton) return 0; + state->Is_type = make_type(state, "Is", state->cmpop_type, NULL, 0, + "Is"); + if (!state->Is_type) return 0; + state->Is_singleton = PyType_GenericNew((PyTypeObject *)state->Is_type, + NULL, NULL); + if (!state->Is_singleton) return 0; + state->IsNot_type = make_type(state, "IsNot", state->cmpop_type, NULL, 0, + "IsNot"); + if (!state->IsNot_type) return 0; + state->IsNot_singleton = PyType_GenericNew((PyTypeObject + *)state->IsNot_type, NULL, NULL); + if (!state->IsNot_singleton) return 0; + state->In_type = make_type(state, "In", state->cmpop_type, NULL, 0, + "In"); + if (!state->In_type) return 0; + state->In_singleton = PyType_GenericNew((PyTypeObject *)state->In_type, + NULL, NULL); + if (!state->In_singleton) return 0; + state->NotIn_type = make_type(state, "NotIn", state->cmpop_type, NULL, 0, + "NotIn"); + if (!state->NotIn_type) return 0; + state->NotIn_singleton = PyType_GenericNew((PyTypeObject + *)state->NotIn_type, NULL, NULL); + if (!state->NotIn_singleton) return 0; + state->comprehension_type = make_type(state, "comprehension", + state->AST_type, + comprehension_fields, 4, + "comprehension(expr target, expr iter, expr* ifs, int is_async)"); + if (!state->comprehension_type) return 0; + if (!add_attributes(state, state->comprehension_type, NULL, 0)) return 0; + state->excepthandler_type = make_type(state, "excepthandler", + state->AST_type, NULL, 0, + "excepthandler = ExceptHandler(expr? type, identifier? name, stmt* body)"); + if (!state->excepthandler_type) return 0; + if (!add_attributes(state, state->excepthandler_type, + excepthandler_attributes, 4)) return 0; + if (PyObject_SetAttr(state->excepthandler_type, state->end_lineno, Py_None) + == -1) + return 0; + if (PyObject_SetAttr(state->excepthandler_type, state->end_col_offset, + Py_None) == -1) + return 0; + state->ExceptHandler_type = make_type(state, "ExceptHandler", + state->excepthandler_type, + ExceptHandler_fields, 3, + "ExceptHandler(expr? type, identifier? name, stmt* body)"); + if (!state->ExceptHandler_type) return 0; + if (PyObject_SetAttr(state->ExceptHandler_type, state->type, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->ExceptHandler_type, state->name, Py_None) == -1) + return 0; + state->arguments_type = make_type(state, "arguments", state->AST_type, + arguments_fields, 7, + "arguments(arg* posonlyargs, arg* args, arg? vararg, arg* kwonlyargs, expr* kw_defaults, arg? kwarg, expr* defaults)"); + if (!state->arguments_type) return 0; + if (!add_attributes(state, state->arguments_type, NULL, 0)) return 0; + if (PyObject_SetAttr(state->arguments_type, state->vararg, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->arguments_type, state->kwarg, Py_None) == -1) + return 0; + state->arg_type = make_type(state, "arg", state->AST_type, arg_fields, 3, + "arg(identifier arg, expr? annotation, string? type_comment)"); + if (!state->arg_type) return 0; + if (!add_attributes(state, state->arg_type, arg_attributes, 4)) return 0; + if (PyObject_SetAttr(state->arg_type, state->annotation, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->arg_type, state->type_comment, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->arg_type, state->end_lineno, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->arg_type, state->end_col_offset, Py_None) == -1) + return 0; + state->keyword_type = make_type(state, "keyword", state->AST_type, + keyword_fields, 2, + "keyword(identifier? arg, expr value)"); + if (!state->keyword_type) return 0; + if (!add_attributes(state, state->keyword_type, keyword_attributes, 4)) + return 0; + if (PyObject_SetAttr(state->keyword_type, state->arg, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->keyword_type, state->end_lineno, Py_None) == -1) + return 0; + if (PyObject_SetAttr(state->keyword_type, state->end_col_offset, Py_None) + == -1) + return 0; + state->alias_type = make_type(state, "alias", state->AST_type, + alias_fields, 2, + "alias(identifier name, identifier? asname)"); + if (!state->alias_type) return 0; + if (!add_attributes(state, state->alias_type, NULL, 0)) return 0; + if (PyObject_SetAttr(state->alias_type, state->asname, Py_None) == -1) + return 0; + state->withitem_type = make_type(state, "withitem", state->AST_type, + withitem_fields, 2, + "withitem(expr context_expr, expr? optional_vars)"); + if (!state->withitem_type) return 0; + if (!add_attributes(state, state->withitem_type, NULL, 0)) return 0; + if (PyObject_SetAttr(state->withitem_type, state->optional_vars, Py_None) + == -1) + return 0; + state->type_ignore_type = make_type(state, "type_ignore", state->AST_type, + NULL, 0, + "type_ignore = TypeIgnore(int lineno, string tag)"); + if (!state->type_ignore_type) return 0; + if (!add_attributes(state, state->type_ignore_type, NULL, 0)) return 0; + state->TypeIgnore_type = make_type(state, "TypeIgnore", + state->type_ignore_type, + TypeIgnore_fields, 2, + "TypeIgnore(int lineno, string tag)"); + if (!state->TypeIgnore_type) return 0; + state->initialized = 1; return 1; } -static int obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena); -static int obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena); -static int obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena); -static int obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena* - arena); -static int obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena); -static int obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena); -static int obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena); -static int obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena); -static int obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena); -static int obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* - arena); -static int obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* - arena); -static int obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena); -static int obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena); -static int obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena); -static int obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena); -static int obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena); -static int obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena* - arena); +static int obj2ast_mod(astmodulestate *state, PyObject* obj, mod_ty* out, + PyArena* arena); +static int obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, + PyArena* arena); +static int obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, + PyArena* arena); +static int obj2ast_expr_context(astmodulestate *state, PyObject* obj, + expr_context_ty* out, PyArena* arena); +static int obj2ast_boolop(astmodulestate *state, PyObject* obj, boolop_ty* out, + PyArena* arena); +static int obj2ast_operator(astmodulestate *state, PyObject* obj, operator_ty* + out, PyArena* arena); +static int obj2ast_unaryop(astmodulestate *state, PyObject* obj, unaryop_ty* + out, PyArena* arena); +static int obj2ast_cmpop(astmodulestate *state, PyObject* obj, cmpop_ty* out, + PyArena* arena); +static int obj2ast_comprehension(astmodulestate *state, PyObject* obj, + comprehension_ty* out, PyArena* arena); +static int obj2ast_excepthandler(astmodulestate *state, PyObject* obj, + excepthandler_ty* out, PyArena* arena); +static int obj2ast_arguments(astmodulestate *state, PyObject* obj, + arguments_ty* out, PyArena* arena); +static int obj2ast_arg(astmodulestate *state, PyObject* obj, arg_ty* out, + PyArena* arena); +static int obj2ast_keyword(astmodulestate *state, PyObject* obj, keyword_ty* + out, PyArena* arena); +static int obj2ast_alias(astmodulestate *state, PyObject* obj, alias_ty* out, + PyArena* arena); +static int obj2ast_withitem(astmodulestate *state, PyObject* obj, withitem_ty* + out, PyArena* arena); +static int obj2ast_type_ignore(astmodulestate *state, PyObject* obj, + type_ignore_ty* out, PyArena* arena); mod_ty Module(asdl_seq * body, asdl_seq * type_ignores, PyArena *arena) @@ -1244,7 +1942,7 @@ Expression(expr_ty body, PyArena *arena) mod_ty p; if (!body) { PyErr_SetString(PyExc_ValueError, - "field body is required for Expression"); + "field 'body' is required for Expression"); return NULL; } p = (mod_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1261,7 +1959,7 @@ FunctionType(asdl_seq * argtypes, expr_ty returns, PyArena *arena) mod_ty p; if (!returns) { PyErr_SetString(PyExc_ValueError, - "field returns is required for FunctionType"); + "field 'returns' is required for FunctionType"); return NULL; } p = (mod_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1273,18 +1971,6 @@ FunctionType(asdl_seq * argtypes, expr_ty returns, PyArena *arena) return p; } -mod_ty -Suite(asdl_seq * body, PyArena *arena) -{ - mod_ty p; - p = (mod_ty)PyArena_Malloc(arena, sizeof(*p)); - if (!p) - return NULL; - p->kind = Suite_kind; - p->v.Suite.body = body; - return p; -} - stmt_ty FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq * decorator_list, expr_ty returns, string type_comment, int lineno, @@ -1293,12 +1979,12 @@ FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq * stmt_ty p; if (!name) { PyErr_SetString(PyExc_ValueError, - "field name is required for FunctionDef"); + "field 'name' is required for FunctionDef"); return NULL; } if (!args) { PyErr_SetString(PyExc_ValueError, - "field args is required for FunctionDef"); + "field 'args' is required for FunctionDef"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1327,12 +2013,12 @@ AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq stmt_ty p; if (!name) { PyErr_SetString(PyExc_ValueError, - "field name is required for AsyncFunctionDef"); + "field 'name' is required for AsyncFunctionDef"); return NULL; } if (!args) { PyErr_SetString(PyExc_ValueError, - "field args is required for AsyncFunctionDef"); + "field 'args' is required for AsyncFunctionDef"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1360,7 +2046,7 @@ ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, asdl_seq * stmt_ty p; if (!name) { PyErr_SetString(PyExc_ValueError, - "field name is required for ClassDef"); + "field 'name' is required for ClassDef"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1420,7 +2106,7 @@ Assign(asdl_seq * targets, expr_ty value, string type_comment, int lineno, int stmt_ty p; if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for Assign"); + "field 'value' is required for Assign"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1444,17 +2130,17 @@ AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int stmt_ty p; if (!target) { PyErr_SetString(PyExc_ValueError, - "field target is required for AugAssign"); + "field 'target' is required for AugAssign"); return NULL; } if (!op) { PyErr_SetString(PyExc_ValueError, - "field op is required for AugAssign"); + "field 'op' is required for AugAssign"); return NULL; } if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for AugAssign"); + "field 'value' is required for AugAssign"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1479,12 +2165,12 @@ AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple, int stmt_ty p; if (!target) { PyErr_SetString(PyExc_ValueError, - "field target is required for AnnAssign"); + "field 'target' is required for AnnAssign"); return NULL; } if (!annotation) { PyErr_SetString(PyExc_ValueError, - "field annotation is required for AnnAssign"); + "field 'annotation' is required for AnnAssign"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1510,12 +2196,12 @@ For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, string stmt_ty p; if (!target) { PyErr_SetString(PyExc_ValueError, - "field target is required for For"); + "field 'target' is required for For"); return NULL; } if (!iter) { PyErr_SetString(PyExc_ValueError, - "field iter is required for For"); + "field 'iter' is required for For"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1542,12 +2228,12 @@ AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, stmt_ty p; if (!target) { PyErr_SetString(PyExc_ValueError, - "field target is required for AsyncFor"); + "field 'target' is required for AsyncFor"); return NULL; } if (!iter) { PyErr_SetString(PyExc_ValueError, - "field iter is required for AsyncFor"); + "field 'iter' is required for AsyncFor"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1573,7 +2259,7 @@ While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int stmt_ty p; if (!test) { PyErr_SetString(PyExc_ValueError, - "field test is required for While"); + "field 'test' is required for While"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1597,7 +2283,7 @@ If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int stmt_ty p; if (!test) { PyErr_SetString(PyExc_ValueError, - "field test is required for If"); + "field 'test' is required for If"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1698,7 +2384,7 @@ Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, int end_lineno, stmt_ty p; if (!test) { PyErr_SetString(PyExc_ValueError, - "field test is required for Assert"); + "field 'test' is required for Assert"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1791,7 +2477,7 @@ Expr(expr_ty value, int lineno, int col_offset, int end_lineno, int stmt_ty p; if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for Expr"); + "field 'value' is required for Expr"); return NULL; } p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1861,7 +2547,7 @@ BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, int expr_ty p; if (!op) { PyErr_SetString(PyExc_ValueError, - "field op is required for BoolOp"); + "field 'op' is required for BoolOp"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1884,12 +2570,12 @@ NamedExpr(expr_ty target, expr_ty value, int lineno, int col_offset, int expr_ty p; if (!target) { PyErr_SetString(PyExc_ValueError, - "field target is required for NamedExpr"); + "field 'target' is required for NamedExpr"); return NULL; } if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for NamedExpr"); + "field 'value' is required for NamedExpr"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1912,17 +2598,17 @@ BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset, expr_ty p; if (!left) { PyErr_SetString(PyExc_ValueError, - "field left is required for BinOp"); + "field 'left' is required for BinOp"); return NULL; } if (!op) { PyErr_SetString(PyExc_ValueError, - "field op is required for BinOp"); + "field 'op' is required for BinOp"); return NULL; } if (!right) { PyErr_SetString(PyExc_ValueError, - "field right is required for BinOp"); + "field 'right' is required for BinOp"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1946,12 +2632,12 @@ UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, int expr_ty p; if (!op) { PyErr_SetString(PyExc_ValueError, - "field op is required for UnaryOp"); + "field 'op' is required for UnaryOp"); return NULL; } if (!operand) { PyErr_SetString(PyExc_ValueError, - "field operand is required for UnaryOp"); + "field 'operand' is required for UnaryOp"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1974,12 +2660,12 @@ Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, int expr_ty p; if (!args) { PyErr_SetString(PyExc_ValueError, - "field args is required for Lambda"); + "field 'args' is required for Lambda"); return NULL; } if (!body) { PyErr_SetString(PyExc_ValueError, - "field body is required for Lambda"); + "field 'body' is required for Lambda"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2002,17 +2688,17 @@ IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset, expr_ty p; if (!test) { PyErr_SetString(PyExc_ValueError, - "field test is required for IfExp"); + "field 'test' is required for IfExp"); return NULL; } if (!body) { PyErr_SetString(PyExc_ValueError, - "field body is required for IfExp"); + "field 'body' is required for IfExp"); return NULL; } if (!orelse) { PyErr_SetString(PyExc_ValueError, - "field orelse is required for IfExp"); + "field 'orelse' is required for IfExp"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2071,7 +2757,7 @@ ListComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int expr_ty p; if (!elt) { PyErr_SetString(PyExc_ValueError, - "field elt is required for ListComp"); + "field 'elt' is required for ListComp"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2094,7 +2780,7 @@ SetComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, int expr_ty p; if (!elt) { PyErr_SetString(PyExc_ValueError, - "field elt is required for SetComp"); + "field 'elt' is required for SetComp"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2117,12 +2803,12 @@ DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int lineno, int expr_ty p; if (!key) { PyErr_SetString(PyExc_ValueError, - "field key is required for DictComp"); + "field 'key' is required for DictComp"); return NULL; } if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for DictComp"); + "field 'value' is required for DictComp"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2146,7 +2832,7 @@ GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, expr_ty p; if (!elt) { PyErr_SetString(PyExc_ValueError, - "field elt is required for GeneratorExp"); + "field 'elt' is required for GeneratorExp"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2169,7 +2855,7 @@ Await(expr_ty value, int lineno, int col_offset, int end_lineno, int expr_ty p; if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for Await"); + "field 'value' is required for Await"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2208,7 +2894,7 @@ YieldFrom(expr_ty value, int lineno, int col_offset, int end_lineno, int expr_ty p; if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for YieldFrom"); + "field 'value' is required for YieldFrom"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2230,7 +2916,7 @@ Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno, expr_ty p; if (!left) { PyErr_SetString(PyExc_ValueError, - "field left is required for Compare"); + "field 'left' is required for Compare"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2254,7 +2940,7 @@ Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int lineno, int expr_ty p; if (!func) { PyErr_SetString(PyExc_ValueError, - "field func is required for Call"); + "field 'func' is required for Call"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2279,7 +2965,7 @@ FormattedValue(expr_ty value, int conversion, expr_ty format_spec, int lineno, expr_ty p; if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for FormattedValue"); + "field 'value' is required for FormattedValue"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2320,7 +3006,7 @@ Constant(constant value, string kind, int lineno, int col_offset, int expr_ty p; if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for Constant"); + "field 'value' is required for Constant"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2343,17 +3029,17 @@ Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int expr_ty p; if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for Attribute"); + "field 'value' is required for Attribute"); return NULL; } if (!attr) { PyErr_SetString(PyExc_ValueError, - "field attr is required for Attribute"); + "field 'attr' is required for Attribute"); return NULL; } if (!ctx) { PyErr_SetString(PyExc_ValueError, - "field ctx is required for Attribute"); + "field 'ctx' is required for Attribute"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2371,23 +3057,23 @@ Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int } expr_ty -Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno, int +Subscript(expr_ty value, expr_ty slice, expr_context_ty ctx, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena) { expr_ty p; if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for Subscript"); + "field 'value' is required for Subscript"); return NULL; } if (!slice) { PyErr_SetString(PyExc_ValueError, - "field slice is required for Subscript"); + "field 'slice' is required for Subscript"); return NULL; } if (!ctx) { PyErr_SetString(PyExc_ValueError, - "field ctx is required for Subscript"); + "field 'ctx' is required for Subscript"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2411,12 +3097,12 @@ Starred(expr_ty value, expr_context_ty ctx, int lineno, int col_offset, int expr_ty p; if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for Starred"); + "field 'value' is required for Starred"); return NULL; } if (!ctx) { PyErr_SetString(PyExc_ValueError, - "field ctx is required for Starred"); + "field 'ctx' is required for Starred"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2439,12 +3125,12 @@ Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, int expr_ty p; if (!id) { PyErr_SetString(PyExc_ValueError, - "field id is required for Name"); + "field 'id' is required for Name"); return NULL; } if (!ctx) { PyErr_SetString(PyExc_ValueError, - "field ctx is required for Name"); + "field 'ctx' is required for Name"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2467,7 +3153,7 @@ List(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int expr_ty p; if (!ctx) { PyErr_SetString(PyExc_ValueError, - "field ctx is required for List"); + "field 'ctx' is required for List"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2490,7 +3176,7 @@ Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int expr_ty p; if (!ctx) { PyErr_SetString(PyExc_ValueError, - "field ctx is required for Tuple"); + "field 'ctx' is required for Tuple"); return NULL; } p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2506,46 +3192,22 @@ Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, int return p; } -slice_ty -Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena) +expr_ty +Slice(expr_ty lower, expr_ty upper, expr_ty step, int lineno, int col_offset, + int end_lineno, int end_col_offset, PyArena *arena) { - slice_ty p; - p = (slice_ty)PyArena_Malloc(arena, sizeof(*p)); + expr_ty p; + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); if (!p) return NULL; p->kind = Slice_kind; p->v.Slice.lower = lower; p->v.Slice.upper = upper; p->v.Slice.step = step; - return p; -} - -slice_ty -ExtSlice(asdl_seq * dims, PyArena *arena) -{ - slice_ty p; - p = (slice_ty)PyArena_Malloc(arena, sizeof(*p)); - if (!p) - return NULL; - p->kind = ExtSlice_kind; - p->v.ExtSlice.dims = dims; - return p; -} - -slice_ty -Index(expr_ty value, PyArena *arena) -{ - slice_ty p; - if (!value) { - PyErr_SetString(PyExc_ValueError, - "field value is required for Index"); - return NULL; - } - p = (slice_ty)PyArena_Malloc(arena, sizeof(*p)); - if (!p) - return NULL; - p->kind = Index_kind; - p->v.Index.value = value; + p->lineno = lineno; + p->col_offset = col_offset; + p->end_lineno = end_lineno; + p->end_col_offset = end_col_offset; return p; } @@ -2556,12 +3218,12 @@ comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, int is_async, comprehension_ty p; if (!target) { PyErr_SetString(PyExc_ValueError, - "field target is required for comprehension"); + "field 'target' is required for comprehension"); return NULL; } if (!iter) { PyErr_SetString(PyExc_ValueError, - "field iter is required for comprehension"); + "field 'iter' is required for comprehension"); return NULL; } p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2619,7 +3281,7 @@ arg(identifier arg, expr_ty annotation, string type_comment, int lineno, int arg_ty p; if (!arg) { PyErr_SetString(PyExc_ValueError, - "field arg is required for arg"); + "field 'arg' is required for arg"); return NULL; } p = (arg_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2636,12 +3298,13 @@ arg(identifier arg, expr_ty annotation, string type_comment, int lineno, int } keyword_ty -keyword(identifier arg, expr_ty value, PyArena *arena) +keyword(identifier arg, expr_ty value, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena) { keyword_ty p; if (!value) { PyErr_SetString(PyExc_ValueError, - "field value is required for keyword"); + "field 'value' is required for keyword"); return NULL; } p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2649,6 +3312,10 @@ keyword(identifier arg, expr_ty value, PyArena *arena) return NULL; p->arg = arg; p->value = value; + p->lineno = lineno; + p->col_offset = col_offset; + p->end_lineno = end_lineno; + p->end_col_offset = end_col_offset; return p; } @@ -2658,7 +3325,7 @@ alias(identifier name, identifier asname, PyArena *arena) alias_ty p; if (!name) { PyErr_SetString(PyExc_ValueError, - "field name is required for alias"); + "field 'name' is required for alias"); return NULL; } p = (alias_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2675,7 +3342,7 @@ withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena) withitem_ty p; if (!context_expr) { PyErr_SetString(PyExc_ValueError, - "field context_expr is required for withitem"); + "field 'context_expr' is required for withitem"); return NULL; } p = (withitem_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2692,7 +3359,7 @@ TypeIgnore(int lineno, string tag, PyArena *arena) type_ignore_ty p; if (!tag) { PyErr_SetString(PyExc_ValueError, - "field tag is required for TypeIgnore"); + "field 'tag' is required for TypeIgnore"); return NULL; } p = (type_ignore_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -2706,67 +3373,63 @@ TypeIgnore(int lineno, string tag, PyArena *arena) PyObject* -ast2obj_mod(void* _o) +ast2obj_mod(astmodulestate *state, void* _o) { mod_ty o = (mod_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - switch (o->kind) { case Module_kind: - result = PyType_GenericNew(Module_type, NULL, NULL); + tp = (PyTypeObject *)state->Module_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Module.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.Module.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.Module.type_ignores, ast2obj_type_ignore); + value = ast2obj_list(state, o->v.Module.type_ignores, + ast2obj_type_ignore); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_type_ignores, value) == -1) + if (PyObject_SetAttr(result, state->type_ignores, value) == -1) goto failed; Py_DECREF(value); break; case Interactive_kind: - result = PyType_GenericNew(Interactive_type, NULL, NULL); + tp = (PyTypeObject *)state->Interactive_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Interactive.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.Interactive.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); break; case Expression_kind: - result = PyType_GenericNew(Expression_type, NULL, NULL); + tp = (PyTypeObject *)state->Expression_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Expression.body); + value = ast2obj_expr(state, o->v.Expression.body); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); break; case FunctionType_kind: - result = PyType_GenericNew(FunctionType_type, NULL, NULL); + tp = (PyTypeObject *)state->FunctionType_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.FunctionType.argtypes, ast2obj_expr); + value = ast2obj_list(state, o->v.FunctionType.argtypes, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_argtypes, value) == -1) + if (PyObject_SetAttr(result, state->argtypes, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.FunctionType.returns); + value = ast2obj_expr(state, o->v.FunctionType.returns); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1) - goto failed; - Py_DECREF(value); - break; - case Suite_kind: - result = PyType_GenericNew(Suite_type, NULL, NULL); - if (!result) goto failed; - value = ast2obj_list(o->v.Suite.body, ast2obj_stmt); - if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->returns, value) == -1) goto failed; Py_DECREF(value); break; @@ -2779,465 +3442,491 @@ failed: } PyObject* -ast2obj_stmt(void* _o) +ast2obj_stmt(astmodulestate *state, void* _o) { stmt_ty o = (stmt_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - switch (o->kind) { case FunctionDef_kind: - result = PyType_GenericNew(FunctionDef_type, NULL, NULL); + tp = (PyTypeObject *)state->FunctionDef_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_identifier(o->v.FunctionDef.name); + value = ast2obj_identifier(state, o->v.FunctionDef.name); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_name, value) == -1) + if (PyObject_SetAttr(result, state->name, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_arguments(o->v.FunctionDef.args); + value = ast2obj_arguments(state, o->v.FunctionDef.args); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_args, value) == -1) + if (PyObject_SetAttr(result, state->args, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.FunctionDef.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.FunctionDef.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.FunctionDef.decorator_list, ast2obj_expr); + value = ast2obj_list(state, o->v.FunctionDef.decorator_list, + ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1) + if (PyObject_SetAttr(result, state->decorator_list, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.FunctionDef.returns); + value = ast2obj_expr(state, o->v.FunctionDef.returns); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1) + if (PyObject_SetAttr(result, state->returns, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_string(o->v.FunctionDef.type_comment); + value = ast2obj_string(state, o->v.FunctionDef.type_comment); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + if (PyObject_SetAttr(result, state->type_comment, value) == -1) goto failed; Py_DECREF(value); break; case AsyncFunctionDef_kind: - result = PyType_GenericNew(AsyncFunctionDef_type, NULL, NULL); + tp = (PyTypeObject *)state->AsyncFunctionDef_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_identifier(o->v.AsyncFunctionDef.name); + value = ast2obj_identifier(state, o->v.AsyncFunctionDef.name); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_name, value) == -1) + if (PyObject_SetAttr(result, state->name, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_arguments(o->v.AsyncFunctionDef.args); + value = ast2obj_arguments(state, o->v.AsyncFunctionDef.args); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_args, value) == -1) + if (PyObject_SetAttr(result, state->args, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.AsyncFunctionDef.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.AsyncFunctionDef.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.AsyncFunctionDef.decorator_list, + value = ast2obj_list(state, o->v.AsyncFunctionDef.decorator_list, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1) + if (PyObject_SetAttr(result, state->decorator_list, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.AsyncFunctionDef.returns); + value = ast2obj_expr(state, o->v.AsyncFunctionDef.returns); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1) + if (PyObject_SetAttr(result, state->returns, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_string(o->v.AsyncFunctionDef.type_comment); + value = ast2obj_string(state, o->v.AsyncFunctionDef.type_comment); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + if (PyObject_SetAttr(result, state->type_comment, value) == -1) goto failed; Py_DECREF(value); break; case ClassDef_kind: - result = PyType_GenericNew(ClassDef_type, NULL, NULL); + tp = (PyTypeObject *)state->ClassDef_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_identifier(o->v.ClassDef.name); + value = ast2obj_identifier(state, o->v.ClassDef.name); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_name, value) == -1) + if (PyObject_SetAttr(result, state->name, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.ClassDef.bases, ast2obj_expr); + value = ast2obj_list(state, o->v.ClassDef.bases, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_bases, value) == -1) + if (PyObject_SetAttr(result, state->bases, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.ClassDef.keywords, ast2obj_keyword); + value = ast2obj_list(state, o->v.ClassDef.keywords, ast2obj_keyword); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1) + if (PyObject_SetAttr(result, state->keywords, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.ClassDef.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.ClassDef.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.ClassDef.decorator_list, ast2obj_expr); + value = ast2obj_list(state, o->v.ClassDef.decorator_list, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1) + if (PyObject_SetAttr(result, state->decorator_list, value) == -1) goto failed; Py_DECREF(value); break; case Return_kind: - result = PyType_GenericNew(Return_type, NULL, NULL); + tp = (PyTypeObject *)state->Return_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Return.value); + value = ast2obj_expr(state, o->v.Return.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); break; case Delete_kind: - result = PyType_GenericNew(Delete_type, NULL, NULL); + tp = (PyTypeObject *)state->Delete_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Delete.targets, ast2obj_expr); + value = ast2obj_list(state, o->v.Delete.targets, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1) + if (PyObject_SetAttr(result, state->targets, value) == -1) goto failed; Py_DECREF(value); break; case Assign_kind: - result = PyType_GenericNew(Assign_type, NULL, NULL); + tp = (PyTypeObject *)state->Assign_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Assign.targets, ast2obj_expr); + value = ast2obj_list(state, o->v.Assign.targets, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1) + if (PyObject_SetAttr(result, state->targets, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.Assign.value); + value = ast2obj_expr(state, o->v.Assign.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_string(o->v.Assign.type_comment); + value = ast2obj_string(state, o->v.Assign.type_comment); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + if (PyObject_SetAttr(result, state->type_comment, value) == -1) goto failed; Py_DECREF(value); break; case AugAssign_kind: - result = PyType_GenericNew(AugAssign_type, NULL, NULL); + tp = (PyTypeObject *)state->AugAssign_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.AugAssign.target); + value = ast2obj_expr(state, o->v.AugAssign.target); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_target, value) == -1) + if (PyObject_SetAttr(result, state->target, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_operator(o->v.AugAssign.op); + value = ast2obj_operator(state, o->v.AugAssign.op); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_op, value) == -1) + if (PyObject_SetAttr(result, state->op, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.AugAssign.value); + value = ast2obj_expr(state, o->v.AugAssign.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); break; case AnnAssign_kind: - result = PyType_GenericNew(AnnAssign_type, NULL, NULL); + tp = (PyTypeObject *)state->AnnAssign_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.AnnAssign.target); + value = ast2obj_expr(state, o->v.AnnAssign.target); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_target, value) == -1) + if (PyObject_SetAttr(result, state->target, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.AnnAssign.annotation); + value = ast2obj_expr(state, o->v.AnnAssign.annotation); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1) + if (PyObject_SetAttr(result, state->annotation, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.AnnAssign.value); + value = ast2obj_expr(state, o->v.AnnAssign.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_int(o->v.AnnAssign.simple); + value = ast2obj_int(state, o->v.AnnAssign.simple); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_simple, value) == -1) + if (PyObject_SetAttr(result, state->simple, value) == -1) goto failed; Py_DECREF(value); break; case For_kind: - result = PyType_GenericNew(For_type, NULL, NULL); + tp = (PyTypeObject *)state->For_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.For.target); + value = ast2obj_expr(state, o->v.For.target); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_target, value) == -1) + if (PyObject_SetAttr(result, state->target, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.For.iter); + value = ast2obj_expr(state, o->v.For.iter); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1) + if (PyObject_SetAttr(result, state->iter, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.For.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.For.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.For.orelse, ast2obj_stmt); + value = ast2obj_list(state, o->v.For.orelse, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1) + if (PyObject_SetAttr(result, state->orelse, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_string(o->v.For.type_comment); + value = ast2obj_string(state, o->v.For.type_comment); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + if (PyObject_SetAttr(result, state->type_comment, value) == -1) goto failed; Py_DECREF(value); break; case AsyncFor_kind: - result = PyType_GenericNew(AsyncFor_type, NULL, NULL); + tp = (PyTypeObject *)state->AsyncFor_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.AsyncFor.target); + value = ast2obj_expr(state, o->v.AsyncFor.target); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_target, value) == -1) + if (PyObject_SetAttr(result, state->target, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.AsyncFor.iter); + value = ast2obj_expr(state, o->v.AsyncFor.iter); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1) + if (PyObject_SetAttr(result, state->iter, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.AsyncFor.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.AsyncFor.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.AsyncFor.orelse, ast2obj_stmt); + value = ast2obj_list(state, o->v.AsyncFor.orelse, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1) + if (PyObject_SetAttr(result, state->orelse, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_string(o->v.AsyncFor.type_comment); + value = ast2obj_string(state, o->v.AsyncFor.type_comment); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + if (PyObject_SetAttr(result, state->type_comment, value) == -1) goto failed; Py_DECREF(value); break; case While_kind: - result = PyType_GenericNew(While_type, NULL, NULL); + tp = (PyTypeObject *)state->While_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.While.test); + value = ast2obj_expr(state, o->v.While.test); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_test, value) == -1) + if (PyObject_SetAttr(result, state->test, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.While.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.While.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.While.orelse, ast2obj_stmt); + value = ast2obj_list(state, o->v.While.orelse, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1) + if (PyObject_SetAttr(result, state->orelse, value) == -1) goto failed; Py_DECREF(value); break; case If_kind: - result = PyType_GenericNew(If_type, NULL, NULL); + tp = (PyTypeObject *)state->If_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.If.test); + value = ast2obj_expr(state, o->v.If.test); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_test, value) == -1) + if (PyObject_SetAttr(result, state->test, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.If.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.If.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.If.orelse, ast2obj_stmt); + value = ast2obj_list(state, o->v.If.orelse, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1) + if (PyObject_SetAttr(result, state->orelse, value) == -1) goto failed; Py_DECREF(value); break; case With_kind: - result = PyType_GenericNew(With_type, NULL, NULL); + tp = (PyTypeObject *)state->With_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.With.items, ast2obj_withitem); + value = ast2obj_list(state, o->v.With.items, ast2obj_withitem); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_items, value) == -1) + if (PyObject_SetAttr(result, state->items, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.With.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.With.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_string(o->v.With.type_comment); + value = ast2obj_string(state, o->v.With.type_comment); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + if (PyObject_SetAttr(result, state->type_comment, value) == -1) goto failed; Py_DECREF(value); break; case AsyncWith_kind: - result = PyType_GenericNew(AsyncWith_type, NULL, NULL); + tp = (PyTypeObject *)state->AsyncWith_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.AsyncWith.items, ast2obj_withitem); + value = ast2obj_list(state, o->v.AsyncWith.items, ast2obj_withitem); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_items, value) == -1) + if (PyObject_SetAttr(result, state->items, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.AsyncWith.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.AsyncWith.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_string(o->v.AsyncWith.type_comment); + value = ast2obj_string(state, o->v.AsyncWith.type_comment); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + if (PyObject_SetAttr(result, state->type_comment, value) == -1) goto failed; Py_DECREF(value); break; case Raise_kind: - result = PyType_GenericNew(Raise_type, NULL, NULL); + tp = (PyTypeObject *)state->Raise_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Raise.exc); + value = ast2obj_expr(state, o->v.Raise.exc); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_exc, value) == -1) + if (PyObject_SetAttr(result, state->exc, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.Raise.cause); + value = ast2obj_expr(state, o->v.Raise.cause); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_cause, value) == -1) + if (PyObject_SetAttr(result, state->cause, value) == -1) goto failed; Py_DECREF(value); break; case Try_kind: - result = PyType_GenericNew(Try_type, NULL, NULL); + tp = (PyTypeObject *)state->Try_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Try.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.Try.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.Try.handlers, ast2obj_excepthandler); + value = ast2obj_list(state, o->v.Try.handlers, ast2obj_excepthandler); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_handlers, value) == -1) + if (PyObject_SetAttr(result, state->handlers, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.Try.orelse, ast2obj_stmt); + value = ast2obj_list(state, o->v.Try.orelse, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1) + if (PyObject_SetAttr(result, state->orelse, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.Try.finalbody, ast2obj_stmt); + value = ast2obj_list(state, o->v.Try.finalbody, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_finalbody, value) == -1) + if (PyObject_SetAttr(result, state->finalbody, value) == -1) goto failed; Py_DECREF(value); break; case Assert_kind: - result = PyType_GenericNew(Assert_type, NULL, NULL); + tp = (PyTypeObject *)state->Assert_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Assert.test); + value = ast2obj_expr(state, o->v.Assert.test); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_test, value) == -1) + if (PyObject_SetAttr(result, state->test, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.Assert.msg); + value = ast2obj_expr(state, o->v.Assert.msg); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_msg, value) == -1) + if (PyObject_SetAttr(result, state->msg, value) == -1) goto failed; Py_DECREF(value); break; case Import_kind: - result = PyType_GenericNew(Import_type, NULL, NULL); + tp = (PyTypeObject *)state->Import_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Import.names, ast2obj_alias); + value = ast2obj_list(state, o->v.Import.names, ast2obj_alias); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_names, value) == -1) + if (PyObject_SetAttr(result, state->names, value) == -1) goto failed; Py_DECREF(value); break; case ImportFrom_kind: - result = PyType_GenericNew(ImportFrom_type, NULL, NULL); + tp = (PyTypeObject *)state->ImportFrom_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_identifier(o->v.ImportFrom.module); + value = ast2obj_identifier(state, o->v.ImportFrom.module); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_module, value) == -1) + if (PyObject_SetAttr(result, state->module, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.ImportFrom.names, ast2obj_alias); + value = ast2obj_list(state, o->v.ImportFrom.names, ast2obj_alias); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_names, value) == -1) + if (PyObject_SetAttr(result, state->names, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_int(o->v.ImportFrom.level); + value = ast2obj_int(state, o->v.ImportFrom.level); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_level, value) == -1) + if (PyObject_SetAttr(result, state->level, value) == -1) goto failed; Py_DECREF(value); break; case Global_kind: - result = PyType_GenericNew(Global_type, NULL, NULL); + tp = (PyTypeObject *)state->Global_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Global.names, ast2obj_identifier); + value = ast2obj_list(state, o->v.Global.names, ast2obj_identifier); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_names, value) == -1) + if (PyObject_SetAttr(result, state->names, value) == -1) goto failed; Py_DECREF(value); break; case Nonlocal_kind: - result = PyType_GenericNew(Nonlocal_type, NULL, NULL); + tp = (PyTypeObject *)state->Nonlocal_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Nonlocal.names, ast2obj_identifier); + value = ast2obj_list(state, o->v.Nonlocal.names, ast2obj_identifier); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_names, value) == -1) + if (PyObject_SetAttr(result, state->names, value) == -1) goto failed; Py_DECREF(value); break; case Expr_kind: - result = PyType_GenericNew(Expr_type, NULL, NULL); + tp = (PyTypeObject *)state->Expr_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Expr.value); + value = ast2obj_expr(state, o->v.Expr.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); break; case Pass_kind: - result = PyType_GenericNew(Pass_type, NULL, NULL); + tp = (PyTypeObject *)state->Pass_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; break; case Break_kind: - result = PyType_GenericNew(Break_type, NULL, NULL); + tp = (PyTypeObject *)state->Break_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; break; case Continue_kind: - result = PyType_GenericNew(Continue_type, NULL, NULL); + tp = (PyTypeObject *)state->Continue_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; break; } - value = ast2obj_int(o->lineno); + value = ast2obj_int(state, o->lineno); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0) + if (PyObject_SetAttr(result, state->lineno, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->col_offset); + value = ast2obj_int(state, o->col_offset); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0) + if (PyObject_SetAttr(result, state->col_offset, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->end_lineno); + value = ast2obj_int(state, o->end_lineno); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0) + if (PyObject_SetAttr(result, state->end_lineno, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->end_col_offset); + value = ast2obj_int(state, o->end_col_offset); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0) + if (PyObject_SetAttr(result, state->end_col_offset, value) < 0) goto failed; Py_DECREF(value); return result; @@ -3248,227 +3937,246 @@ failed: } PyObject* -ast2obj_expr(void* _o) +ast2obj_expr(astmodulestate *state, void* _o) { expr_ty o = (expr_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - switch (o->kind) { case BoolOp_kind: - result = PyType_GenericNew(BoolOp_type, NULL, NULL); + tp = (PyTypeObject *)state->BoolOp_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_boolop(o->v.BoolOp.op); + value = ast2obj_boolop(state, o->v.BoolOp.op); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_op, value) == -1) + if (PyObject_SetAttr(result, state->op, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.BoolOp.values, ast2obj_expr); + value = ast2obj_list(state, o->v.BoolOp.values, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_values, value) == -1) + if (PyObject_SetAttr(result, state->values, value) == -1) goto failed; Py_DECREF(value); break; case NamedExpr_kind: - result = PyType_GenericNew(NamedExpr_type, NULL, NULL); + tp = (PyTypeObject *)state->NamedExpr_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.NamedExpr.target); + value = ast2obj_expr(state, o->v.NamedExpr.target); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_target, value) == -1) + if (PyObject_SetAttr(result, state->target, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.NamedExpr.value); + value = ast2obj_expr(state, o->v.NamedExpr.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); break; case BinOp_kind: - result = PyType_GenericNew(BinOp_type, NULL, NULL); + tp = (PyTypeObject *)state->BinOp_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.BinOp.left); + value = ast2obj_expr(state, o->v.BinOp.left); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_left, value) == -1) + if (PyObject_SetAttr(result, state->left, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_operator(o->v.BinOp.op); + value = ast2obj_operator(state, o->v.BinOp.op); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_op, value) == -1) + if (PyObject_SetAttr(result, state->op, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.BinOp.right); + value = ast2obj_expr(state, o->v.BinOp.right); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_right, value) == -1) + if (PyObject_SetAttr(result, state->right, value) == -1) goto failed; Py_DECREF(value); break; case UnaryOp_kind: - result = PyType_GenericNew(UnaryOp_type, NULL, NULL); + tp = (PyTypeObject *)state->UnaryOp_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_unaryop(o->v.UnaryOp.op); + value = ast2obj_unaryop(state, o->v.UnaryOp.op); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_op, value) == -1) + if (PyObject_SetAttr(result, state->op, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.UnaryOp.operand); + value = ast2obj_expr(state, o->v.UnaryOp.operand); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_operand, value) == -1) + if (PyObject_SetAttr(result, state->operand, value) == -1) goto failed; Py_DECREF(value); break; case Lambda_kind: - result = PyType_GenericNew(Lambda_type, NULL, NULL); + tp = (PyTypeObject *)state->Lambda_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_arguments(o->v.Lambda.args); + value = ast2obj_arguments(state, o->v.Lambda.args); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_args, value) == -1) + if (PyObject_SetAttr(result, state->args, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.Lambda.body); + value = ast2obj_expr(state, o->v.Lambda.body); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); break; case IfExp_kind: - result = PyType_GenericNew(IfExp_type, NULL, NULL); + tp = (PyTypeObject *)state->IfExp_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.IfExp.test); + value = ast2obj_expr(state, o->v.IfExp.test); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_test, value) == -1) + if (PyObject_SetAttr(result, state->test, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.IfExp.body); + value = ast2obj_expr(state, o->v.IfExp.body); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.IfExp.orelse); + value = ast2obj_expr(state, o->v.IfExp.orelse); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1) + if (PyObject_SetAttr(result, state->orelse, value) == -1) goto failed; Py_DECREF(value); break; case Dict_kind: - result = PyType_GenericNew(Dict_type, NULL, NULL); + tp = (PyTypeObject *)state->Dict_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Dict.keys, ast2obj_expr); + value = ast2obj_list(state, o->v.Dict.keys, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_keys, value) == -1) + if (PyObject_SetAttr(result, state->keys, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.Dict.values, ast2obj_expr); + value = ast2obj_list(state, o->v.Dict.values, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_values, value) == -1) + if (PyObject_SetAttr(result, state->values, value) == -1) goto failed; Py_DECREF(value); break; case Set_kind: - result = PyType_GenericNew(Set_type, NULL, NULL); + tp = (PyTypeObject *)state->Set_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Set.elts, ast2obj_expr); + value = ast2obj_list(state, o->v.Set.elts, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1) + if (PyObject_SetAttr(result, state->elts, value) == -1) goto failed; Py_DECREF(value); break; case ListComp_kind: - result = PyType_GenericNew(ListComp_type, NULL, NULL); + tp = (PyTypeObject *)state->ListComp_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.ListComp.elt); + value = ast2obj_expr(state, o->v.ListComp.elt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1) + if (PyObject_SetAttr(result, state->elt, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.ListComp.generators, ast2obj_comprehension); + value = ast2obj_list(state, o->v.ListComp.generators, + ast2obj_comprehension); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1) + if (PyObject_SetAttr(result, state->generators, value) == -1) goto failed; Py_DECREF(value); break; case SetComp_kind: - result = PyType_GenericNew(SetComp_type, NULL, NULL); + tp = (PyTypeObject *)state->SetComp_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.SetComp.elt); + value = ast2obj_expr(state, o->v.SetComp.elt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1) + if (PyObject_SetAttr(result, state->elt, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.SetComp.generators, ast2obj_comprehension); + value = ast2obj_list(state, o->v.SetComp.generators, + ast2obj_comprehension); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1) + if (PyObject_SetAttr(result, state->generators, value) == -1) goto failed; Py_DECREF(value); break; case DictComp_kind: - result = PyType_GenericNew(DictComp_type, NULL, NULL); + tp = (PyTypeObject *)state->DictComp_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.DictComp.key); + value = ast2obj_expr(state, o->v.DictComp.key); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_key, value) == -1) + if (PyObject_SetAttr(result, state->key, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.DictComp.value); + value = ast2obj_expr(state, o->v.DictComp.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.DictComp.generators, ast2obj_comprehension); + value = ast2obj_list(state, o->v.DictComp.generators, + ast2obj_comprehension); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1) + if (PyObject_SetAttr(result, state->generators, value) == -1) goto failed; Py_DECREF(value); break; case GeneratorExp_kind: - result = PyType_GenericNew(GeneratorExp_type, NULL, NULL); + tp = (PyTypeObject *)state->GeneratorExp_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.GeneratorExp.elt); + value = ast2obj_expr(state, o->v.GeneratorExp.elt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1) + if (PyObject_SetAttr(result, state->elt, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.GeneratorExp.generators, + value = ast2obj_list(state, o->v.GeneratorExp.generators, ast2obj_comprehension); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1) + if (PyObject_SetAttr(result, state->generators, value) == -1) goto failed; Py_DECREF(value); break; case Await_kind: - result = PyType_GenericNew(Await_type, NULL, NULL); + tp = (PyTypeObject *)state->Await_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Await.value); + value = ast2obj_expr(state, o->v.Await.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); break; case Yield_kind: - result = PyType_GenericNew(Yield_type, NULL, NULL); + tp = (PyTypeObject *)state->Yield_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Yield.value); + value = ast2obj_expr(state, o->v.Yield.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); break; case YieldFrom_kind: - result = PyType_GenericNew(YieldFrom_type, NULL, NULL); + tp = (PyTypeObject *)state->YieldFrom_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.YieldFrom.value); + value = ast2obj_expr(state, o->v.YieldFrom.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); break; case Compare_kind: - result = PyType_GenericNew(Compare_type, NULL, NULL); + tp = (PyTypeObject *)state->Compare_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Compare.left); + value = ast2obj_expr(state, o->v.Compare.left); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_left, value) == -1) + if (PyObject_SetAttr(result, state->left, value) == -1) goto failed; Py_DECREF(value); { @@ -3476,192 +4184,222 @@ ast2obj_expr(void* _o) value = PyList_New(n); if (!value) goto failed; for(i = 0; i < n; i++) - PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i))); + PyList_SET_ITEM(value, i, ast2obj_cmpop(state, (cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i))); } if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_ops, value) == -1) + if (PyObject_SetAttr(result, state->ops, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.Compare.comparators, ast2obj_expr); + value = ast2obj_list(state, o->v.Compare.comparators, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_comparators, value) == -1) + if (PyObject_SetAttr(result, state->comparators, value) == -1) goto failed; Py_DECREF(value); break; case Call_kind: - result = PyType_GenericNew(Call_type, NULL, NULL); + tp = (PyTypeObject *)state->Call_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Call.func); + value = ast2obj_expr(state, o->v.Call.func); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_func, value) == -1) + if (PyObject_SetAttr(result, state->func, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.Call.args, ast2obj_expr); + value = ast2obj_list(state, o->v.Call.args, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_args, value) == -1) + if (PyObject_SetAttr(result, state->args, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.Call.keywords, ast2obj_keyword); + value = ast2obj_list(state, o->v.Call.keywords, ast2obj_keyword); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1) + if (PyObject_SetAttr(result, state->keywords, value) == -1) goto failed; Py_DECREF(value); break; case FormattedValue_kind: - result = PyType_GenericNew(FormattedValue_type, NULL, NULL); + tp = (PyTypeObject *)state->FormattedValue_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.FormattedValue.value); + value = ast2obj_expr(state, o->v.FormattedValue.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_int(o->v.FormattedValue.conversion); + value = ast2obj_int(state, o->v.FormattedValue.conversion); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_conversion, value) == -1) + if (PyObject_SetAttr(result, state->conversion, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->v.FormattedValue.format_spec); + value = ast2obj_expr(state, o->v.FormattedValue.format_spec); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_format_spec, value) == -1) + if (PyObject_SetAttr(result, state->format_spec, value) == -1) goto failed; Py_DECREF(value); break; case JoinedStr_kind: - result = PyType_GenericNew(JoinedStr_type, NULL, NULL); + tp = (PyTypeObject *)state->JoinedStr_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.JoinedStr.values, ast2obj_expr); + value = ast2obj_list(state, o->v.JoinedStr.values, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_values, value) == -1) + if (PyObject_SetAttr(result, state->values, value) == -1) goto failed; Py_DECREF(value); break; case Constant_kind: - result = PyType_GenericNew(Constant_type, NULL, NULL); + tp = (PyTypeObject *)state->Constant_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_constant(o->v.Constant.value); + value = ast2obj_constant(state, o->v.Constant.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_string(o->v.Constant.kind); + value = ast2obj_string(state, o->v.Constant.kind); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_kind, value) == -1) + if (PyObject_SetAttr(result, state->kind, value) == -1) goto failed; Py_DECREF(value); break; case Attribute_kind: - result = PyType_GenericNew(Attribute_type, NULL, NULL); + tp = (PyTypeObject *)state->Attribute_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Attribute.value); + value = ast2obj_expr(state, o->v.Attribute.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_identifier(o->v.Attribute.attr); + value = ast2obj_identifier(state, o->v.Attribute.attr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_attr, value) == -1) + if (PyObject_SetAttr(result, state->attr, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr_context(o->v.Attribute.ctx); + value = ast2obj_expr_context(state, o->v.Attribute.ctx); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1) + if (PyObject_SetAttr(result, state->ctx, value) == -1) goto failed; Py_DECREF(value); break; case Subscript_kind: - result = PyType_GenericNew(Subscript_type, NULL, NULL); + tp = (PyTypeObject *)state->Subscript_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Subscript.value); + value = ast2obj_expr(state, o->v.Subscript.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_slice(o->v.Subscript.slice); + value = ast2obj_expr(state, o->v.Subscript.slice); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_slice, value) == -1) + if (PyObject_SetAttr(result, state->slice, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr_context(o->v.Subscript.ctx); + value = ast2obj_expr_context(state, o->v.Subscript.ctx); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1) + if (PyObject_SetAttr(result, state->ctx, value) == -1) goto failed; Py_DECREF(value); break; case Starred_kind: - result = PyType_GenericNew(Starred_type, NULL, NULL); + tp = (PyTypeObject *)state->Starred_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.Starred.value); + value = ast2obj_expr(state, o->v.Starred.value); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->value, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr_context(o->v.Starred.ctx); + value = ast2obj_expr_context(state, o->v.Starred.ctx); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1) + if (PyObject_SetAttr(result, state->ctx, value) == -1) goto failed; Py_DECREF(value); break; case Name_kind: - result = PyType_GenericNew(Name_type, NULL, NULL); + tp = (PyTypeObject *)state->Name_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_identifier(o->v.Name.id); + value = ast2obj_identifier(state, o->v.Name.id); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_id, value) == -1) + if (PyObject_SetAttr(result, state->id, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr_context(o->v.Name.ctx); + value = ast2obj_expr_context(state, o->v.Name.ctx); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1) + if (PyObject_SetAttr(result, state->ctx, value) == -1) goto failed; Py_DECREF(value); break; case List_kind: - result = PyType_GenericNew(List_type, NULL, NULL); + tp = (PyTypeObject *)state->List_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.List.elts, ast2obj_expr); + value = ast2obj_list(state, o->v.List.elts, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1) + if (PyObject_SetAttr(result, state->elts, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr_context(o->v.List.ctx); + value = ast2obj_expr_context(state, o->v.List.ctx); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1) + if (PyObject_SetAttr(result, state->ctx, value) == -1) goto failed; Py_DECREF(value); break; case Tuple_kind: - result = PyType_GenericNew(Tuple_type, NULL, NULL); + tp = (PyTypeObject *)state->Tuple_type; + result = PyType_GenericNew(tp, NULL, NULL); + if (!result) goto failed; + value = ast2obj_list(state, o->v.Tuple.elts, ast2obj_expr); + if (!value) goto failed; + if (PyObject_SetAttr(result, state->elts, value) == -1) + goto failed; + Py_DECREF(value); + value = ast2obj_expr_context(state, o->v.Tuple.ctx); + if (!value) goto failed; + if (PyObject_SetAttr(result, state->ctx, value) == -1) + goto failed; + Py_DECREF(value); + break; + case Slice_kind: + tp = (PyTypeObject *)state->Slice_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_list(o->v.Tuple.elts, ast2obj_expr); + value = ast2obj_expr(state, o->v.Slice.lower); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1) + if (PyObject_SetAttr(result, state->lower, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr_context(o->v.Tuple.ctx); + value = ast2obj_expr(state, o->v.Slice.upper); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1) + if (PyObject_SetAttr(result, state->upper, value) == -1) + goto failed; + Py_DECREF(value); + value = ast2obj_expr(state, o->v.Slice.step); + if (!value) goto failed; + if (PyObject_SetAttr(result, state->step, value) == -1) goto failed; Py_DECREF(value); break; } - value = ast2obj_int(o->lineno); + value = ast2obj_int(state, o->lineno); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0) + if (PyObject_SetAttr(result, state->lineno, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->col_offset); + value = ast2obj_int(state, o->col_offset); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0) + if (PyObject_SetAttr(result, state->col_offset, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->end_lineno); + value = ast2obj_int(state, o->end_lineno); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0) + if (PyObject_SetAttr(result, state->end_lineno, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->end_col_offset); + value = ast2obj_int(state, o->end_col_offset); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0) + if (PyObject_SetAttr(result, state->end_col_offset, value) < 0) goto failed; Py_DECREF(value); return result; @@ -3671,240 +4409,162 @@ failed: return NULL; } -PyObject* ast2obj_expr_context(expr_context_ty o) +PyObject* ast2obj_expr_context(astmodulestate *state, expr_context_ty o) { switch(o) { case Load: - Py_INCREF(Load_singleton); - return Load_singleton; + Py_INCREF(state->Load_singleton); + return state->Load_singleton; case Store: - Py_INCREF(Store_singleton); - return Store_singleton; + Py_INCREF(state->Store_singleton); + return state->Store_singleton; case Del: - Py_INCREF(Del_singleton); - return Del_singleton; - case AugLoad: - Py_INCREF(AugLoad_singleton); - return AugLoad_singleton; - case AugStore: - Py_INCREF(AugStore_singleton); - return AugStore_singleton; - case Param: - Py_INCREF(Param_singleton); - return Param_singleton; - default: - /* should never happen, but just in case ... */ - PyErr_Format(PyExc_SystemError, "unknown expr_context found"); - return NULL; - } -} -PyObject* -ast2obj_slice(void* _o) -{ - slice_ty o = (slice_ty)_o; - PyObject *result = NULL, *value = NULL; - if (!o) { - Py_RETURN_NONE; - } - - switch (o->kind) { - case Slice_kind: - result = PyType_GenericNew(Slice_type, NULL, NULL); - if (!result) goto failed; - value = ast2obj_expr(o->v.Slice.lower); - if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_lower, value) == -1) - goto failed; - Py_DECREF(value); - value = ast2obj_expr(o->v.Slice.upper); - if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_upper, value) == -1) - goto failed; - Py_DECREF(value); - value = ast2obj_expr(o->v.Slice.step); - if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_step, value) == -1) - goto failed; - Py_DECREF(value); - break; - case ExtSlice_kind: - result = PyType_GenericNew(ExtSlice_type, NULL, NULL); - if (!result) goto failed; - value = ast2obj_list(o->v.ExtSlice.dims, ast2obj_slice); - if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_dims, value) == -1) - goto failed; - Py_DECREF(value); - break; - case Index_kind: - result = PyType_GenericNew(Index_type, NULL, NULL); - if (!result) goto failed; - value = ast2obj_expr(o->v.Index.value); - if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) - goto failed; - Py_DECREF(value); - break; + Py_INCREF(state->Del_singleton); + return state->Del_singleton; } - return result; -failed: - Py_XDECREF(value); - Py_XDECREF(result); - return NULL; + Py_UNREACHABLE(); } - -PyObject* ast2obj_boolop(boolop_ty o) +PyObject* ast2obj_boolop(astmodulestate *state, boolop_ty o) { switch(o) { case And: - Py_INCREF(And_singleton); - return And_singleton; + Py_INCREF(state->And_singleton); + return state->And_singleton; case Or: - Py_INCREF(Or_singleton); - return Or_singleton; - default: - /* should never happen, but just in case ... */ - PyErr_Format(PyExc_SystemError, "unknown boolop found"); - return NULL; + Py_INCREF(state->Or_singleton); + return state->Or_singleton; } + Py_UNREACHABLE(); } -PyObject* ast2obj_operator(operator_ty o) +PyObject* ast2obj_operator(astmodulestate *state, operator_ty o) { switch(o) { case Add: - Py_INCREF(Add_singleton); - return Add_singleton; + Py_INCREF(state->Add_singleton); + return state->Add_singleton; case Sub: - Py_INCREF(Sub_singleton); - return Sub_singleton; + Py_INCREF(state->Sub_singleton); + return state->Sub_singleton; case Mult: - Py_INCREF(Mult_singleton); - return Mult_singleton; + Py_INCREF(state->Mult_singleton); + return state->Mult_singleton; case MatMult: - Py_INCREF(MatMult_singleton); - return MatMult_singleton; + Py_INCREF(state->MatMult_singleton); + return state->MatMult_singleton; case Div: - Py_INCREF(Div_singleton); - return Div_singleton; + Py_INCREF(state->Div_singleton); + return state->Div_singleton; case Mod: - Py_INCREF(Mod_singleton); - return Mod_singleton; + Py_INCREF(state->Mod_singleton); + return state->Mod_singleton; case Pow: - Py_INCREF(Pow_singleton); - return Pow_singleton; + Py_INCREF(state->Pow_singleton); + return state->Pow_singleton; case LShift: - Py_INCREF(LShift_singleton); - return LShift_singleton; + Py_INCREF(state->LShift_singleton); + return state->LShift_singleton; case RShift: - Py_INCREF(RShift_singleton); - return RShift_singleton; + Py_INCREF(state->RShift_singleton); + return state->RShift_singleton; case BitOr: - Py_INCREF(BitOr_singleton); - return BitOr_singleton; + Py_INCREF(state->BitOr_singleton); + return state->BitOr_singleton; case BitXor: - Py_INCREF(BitXor_singleton); - return BitXor_singleton; + Py_INCREF(state->BitXor_singleton); + return state->BitXor_singleton; case BitAnd: - Py_INCREF(BitAnd_singleton); - return BitAnd_singleton; + Py_INCREF(state->BitAnd_singleton); + return state->BitAnd_singleton; case FloorDiv: - Py_INCREF(FloorDiv_singleton); - return FloorDiv_singleton; - default: - /* should never happen, but just in case ... */ - PyErr_Format(PyExc_SystemError, "unknown operator found"); - return NULL; + Py_INCREF(state->FloorDiv_singleton); + return state->FloorDiv_singleton; } + Py_UNREACHABLE(); } -PyObject* ast2obj_unaryop(unaryop_ty o) +PyObject* ast2obj_unaryop(astmodulestate *state, unaryop_ty o) { switch(o) { case Invert: - Py_INCREF(Invert_singleton); - return Invert_singleton; + Py_INCREF(state->Invert_singleton); + return state->Invert_singleton; case Not: - Py_INCREF(Not_singleton); - return Not_singleton; + Py_INCREF(state->Not_singleton); + return state->Not_singleton; case UAdd: - Py_INCREF(UAdd_singleton); - return UAdd_singleton; + Py_INCREF(state->UAdd_singleton); + return state->UAdd_singleton; case USub: - Py_INCREF(USub_singleton); - return USub_singleton; - default: - /* should never happen, but just in case ... */ - PyErr_Format(PyExc_SystemError, "unknown unaryop found"); - return NULL; + Py_INCREF(state->USub_singleton); + return state->USub_singleton; } + Py_UNREACHABLE(); } -PyObject* ast2obj_cmpop(cmpop_ty o) +PyObject* ast2obj_cmpop(astmodulestate *state, cmpop_ty o) { switch(o) { case Eq: - Py_INCREF(Eq_singleton); - return Eq_singleton; + Py_INCREF(state->Eq_singleton); + return state->Eq_singleton; case NotEq: - Py_INCREF(NotEq_singleton); - return NotEq_singleton; + Py_INCREF(state->NotEq_singleton); + return state->NotEq_singleton; case Lt: - Py_INCREF(Lt_singleton); - return Lt_singleton; + Py_INCREF(state->Lt_singleton); + return state->Lt_singleton; case LtE: - Py_INCREF(LtE_singleton); - return LtE_singleton; + Py_INCREF(state->LtE_singleton); + return state->LtE_singleton; case Gt: - Py_INCREF(Gt_singleton); - return Gt_singleton; + Py_INCREF(state->Gt_singleton); + return state->Gt_singleton; case GtE: - Py_INCREF(GtE_singleton); - return GtE_singleton; + Py_INCREF(state->GtE_singleton); + return state->GtE_singleton; case Is: - Py_INCREF(Is_singleton); - return Is_singleton; + Py_INCREF(state->Is_singleton); + return state->Is_singleton; case IsNot: - Py_INCREF(IsNot_singleton); - return IsNot_singleton; + Py_INCREF(state->IsNot_singleton); + return state->IsNot_singleton; case In: - Py_INCREF(In_singleton); - return In_singleton; + Py_INCREF(state->In_singleton); + return state->In_singleton; case NotIn: - Py_INCREF(NotIn_singleton); - return NotIn_singleton; - default: - /* should never happen, but just in case ... */ - PyErr_Format(PyExc_SystemError, "unknown cmpop found"); - return NULL; + Py_INCREF(state->NotIn_singleton); + return state->NotIn_singleton; } + Py_UNREACHABLE(); } PyObject* -ast2obj_comprehension(void* _o) +ast2obj_comprehension(astmodulestate *state, void* _o) { comprehension_ty o = (comprehension_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - - result = PyType_GenericNew(comprehension_type, NULL, NULL); + tp = (PyTypeObject *)state->comprehension_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) return NULL; - value = ast2obj_expr(o->target); + value = ast2obj_expr(state, o->target); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_target, value) == -1) + if (PyObject_SetAttr(result, state->target, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->iter); + value = ast2obj_expr(state, o->iter); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1) + if (PyObject_SetAttr(result, state->iter, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->ifs, ast2obj_expr); + value = ast2obj_list(state, o->ifs, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_ifs, value) == -1) + if (PyObject_SetAttr(result, state->ifs, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_int(o->is_async); + value = ast2obj_int(state, o->is_async); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_is_async, value) == -1) + if (PyObject_SetAttr(result, state->is_async, value) == -1) goto failed; Py_DECREF(value); return result; @@ -3915,53 +4575,54 @@ failed: } PyObject* -ast2obj_excepthandler(void* _o) +ast2obj_excepthandler(astmodulestate *state, void* _o) { excepthandler_ty o = (excepthandler_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - switch (o->kind) { case ExceptHandler_kind: - result = PyType_GenericNew(ExceptHandler_type, NULL, NULL); + tp = (PyTypeObject *)state->ExceptHandler_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_expr(o->v.ExceptHandler.type); + value = ast2obj_expr(state, o->v.ExceptHandler.type); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_type, value) == -1) + if (PyObject_SetAttr(result, state->type, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_identifier(o->v.ExceptHandler.name); + value = ast2obj_identifier(state, o->v.ExceptHandler.name); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_name, value) == -1) + if (PyObject_SetAttr(result, state->name, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->v.ExceptHandler.body, ast2obj_stmt); + value = ast2obj_list(state, o->v.ExceptHandler.body, ast2obj_stmt); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) + if (PyObject_SetAttr(result, state->body, value) == -1) goto failed; Py_DECREF(value); break; } - value = ast2obj_int(o->lineno); + value = ast2obj_int(state, o->lineno); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0) + if (PyObject_SetAttr(result, state->lineno, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->col_offset); + value = ast2obj_int(state, o->col_offset); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0) + if (PyObject_SetAttr(result, state->col_offset, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->end_lineno); + value = ast2obj_int(state, o->end_lineno); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0) + if (PyObject_SetAttr(result, state->end_lineno, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->end_col_offset); + value = ast2obj_int(state, o->end_col_offset); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0) + if (PyObject_SetAttr(result, state->end_col_offset, value) < 0) goto failed; Py_DECREF(value); return result; @@ -3972,49 +4633,50 @@ failed: } PyObject* -ast2obj_arguments(void* _o) +ast2obj_arguments(astmodulestate *state, void* _o) { arguments_ty o = (arguments_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - - result = PyType_GenericNew(arguments_type, NULL, NULL); + tp = (PyTypeObject *)state->arguments_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) return NULL; - value = ast2obj_list(o->posonlyargs, ast2obj_arg); + value = ast2obj_list(state, o->posonlyargs, ast2obj_arg); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_posonlyargs, value) == -1) + if (PyObject_SetAttr(result, state->posonlyargs, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->args, ast2obj_arg); + value = ast2obj_list(state, o->args, ast2obj_arg); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_args, value) == -1) + if (PyObject_SetAttr(result, state->args, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_arg(o->vararg); + value = ast2obj_arg(state, o->vararg); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_vararg, value) == -1) + if (PyObject_SetAttr(result, state->vararg, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->kwonlyargs, ast2obj_arg); + value = ast2obj_list(state, o->kwonlyargs, ast2obj_arg); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_kwonlyargs, value) == -1) + if (PyObject_SetAttr(result, state->kwonlyargs, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->kw_defaults, ast2obj_expr); + value = ast2obj_list(state, o->kw_defaults, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_kw_defaults, value) == -1) + if (PyObject_SetAttr(result, state->kw_defaults, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_arg(o->kwarg); + value = ast2obj_arg(state, o->kwarg); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_kwarg, value) == -1) + if (PyObject_SetAttr(result, state->kwarg, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_list(o->defaults, ast2obj_expr); + value = ast2obj_list(state, o->defaults, ast2obj_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_defaults, value) == -1) + if (PyObject_SetAttr(result, state->defaults, value) == -1) goto failed; Py_DECREF(value); return result; @@ -4025,49 +4687,50 @@ failed: } PyObject* -ast2obj_arg(void* _o) +ast2obj_arg(astmodulestate *state, void* _o) { arg_ty o = (arg_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - - result = PyType_GenericNew(arg_type, NULL, NULL); + tp = (PyTypeObject *)state->arg_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) return NULL; - value = ast2obj_identifier(o->arg); + value = ast2obj_identifier(state, o->arg); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1) + if (PyObject_SetAttr(result, state->arg, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->annotation); + value = ast2obj_expr(state, o->annotation); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1) + if (PyObject_SetAttr(result, state->annotation, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_string(o->type_comment); + value = ast2obj_string(state, o->type_comment); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + if (PyObject_SetAttr(result, state->type_comment, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_int(o->lineno); + value = ast2obj_int(state, o->lineno); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0) + if (PyObject_SetAttr(result, state->lineno, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->col_offset); + value = ast2obj_int(state, o->col_offset); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0) + if (PyObject_SetAttr(result, state->col_offset, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->end_lineno); + value = ast2obj_int(state, o->end_lineno); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_end_lineno, value) < 0) + if (PyObject_SetAttr(result, state->end_lineno, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_int(o->end_col_offset); + value = ast2obj_int(state, o->end_col_offset); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_end_col_offset, value) < 0) + if (PyObject_SetAttr(result, state->end_col_offset, value) < 0) goto failed; Py_DECREF(value); return result; @@ -4078,24 +4741,45 @@ failed: } PyObject* -ast2obj_keyword(void* _o) +ast2obj_keyword(astmodulestate *state, void* _o) { keyword_ty o = (keyword_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - - result = PyType_GenericNew(keyword_type, NULL, NULL); + tp = (PyTypeObject *)state->keyword_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) return NULL; - value = ast2obj_identifier(o->arg); + value = ast2obj_identifier(state, o->arg); + if (!value) goto failed; + if (PyObject_SetAttr(result, state->arg, value) == -1) + goto failed; + Py_DECREF(value); + value = ast2obj_expr(state, o->value); + if (!value) goto failed; + if (PyObject_SetAttr(result, state->value, value) == -1) + goto failed; + Py_DECREF(value); + value = ast2obj_int(state, o->lineno); + if (!value) goto failed; + if (PyObject_SetAttr(result, state->lineno, value) < 0) + goto failed; + Py_DECREF(value); + value = ast2obj_int(state, o->col_offset); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1) + if (PyObject_SetAttr(result, state->col_offset, value) < 0) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->value); + value = ast2obj_int(state, o->end_lineno); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) + if (PyObject_SetAttr(result, state->end_lineno, value) < 0) + goto failed; + Py_DECREF(value); + value = ast2obj_int(state, o->end_col_offset); + if (!value) goto failed; + if (PyObject_SetAttr(result, state->end_col_offset, value) < 0) goto failed; Py_DECREF(value); return result; @@ -4106,24 +4790,25 @@ failed: } PyObject* -ast2obj_alias(void* _o) +ast2obj_alias(astmodulestate *state, void* _o) { alias_ty o = (alias_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - - result = PyType_GenericNew(alias_type, NULL, NULL); + tp = (PyTypeObject *)state->alias_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) return NULL; - value = ast2obj_identifier(o->name); + value = ast2obj_identifier(state, o->name); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_name, value) == -1) + if (PyObject_SetAttr(result, state->name, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_identifier(o->asname); + value = ast2obj_identifier(state, o->asname); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_asname, value) == -1) + if (PyObject_SetAttr(result, state->asname, value) == -1) goto failed; Py_DECREF(value); return result; @@ -4134,24 +4819,25 @@ failed: } PyObject* -ast2obj_withitem(void* _o) +ast2obj_withitem(astmodulestate *state, void* _o) { withitem_ty o = (withitem_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - - result = PyType_GenericNew(withitem_type, NULL, NULL); + tp = (PyTypeObject *)state->withitem_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) return NULL; - value = ast2obj_expr(o->context_expr); + value = ast2obj_expr(state, o->context_expr); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_context_expr, value) == -1) + if (PyObject_SetAttr(result, state->context_expr, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_expr(o->optional_vars); + value = ast2obj_expr(state, o->optional_vars); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_optional_vars, value) == -1) + if (PyObject_SetAttr(result, state->optional_vars, value) == -1) goto failed; Py_DECREF(value); return result; @@ -4162,26 +4848,27 @@ failed: } PyObject* -ast2obj_type_ignore(void* _o) +ast2obj_type_ignore(astmodulestate *state, void* _o) { type_ignore_ty o = (type_ignore_ty)_o; PyObject *result = NULL, *value = NULL; + PyTypeObject *tp; if (!o) { Py_RETURN_NONE; } - switch (o->kind) { case TypeIgnore_kind: - result = PyType_GenericNew(TypeIgnore_type, NULL, NULL); + tp = (PyTypeObject *)state->TypeIgnore_type; + result = PyType_GenericNew(tp, NULL, NULL); if (!result) goto failed; - value = ast2obj_int(o->v.TypeIgnore.lineno); + value = ast2obj_int(state, o->v.TypeIgnore.lineno); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_lineno, value) == -1) + if (PyObject_SetAttr(result, state->lineno, value) == -1) goto failed; Py_DECREF(value); - value = ast2obj_string(o->v.TypeIgnore.tag); + value = ast2obj_string(state, o->v.TypeIgnore.tag); if (!value) goto failed; - if (_PyObject_SetAttrId(result, &PyId_tag, value) == -1) + if (PyObject_SetAttr(result, state->tag, value) == -1) goto failed; Py_DECREF(value); break; @@ -4195,17 +4882,19 @@ failed: int -obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) +obj2ast_mod(astmodulestate *state, PyObject* obj, mod_ty* out, PyArena* arena) { int isinstance; PyObject *tmp = NULL; + PyObject *tp; if (obj == Py_None) { *out = NULL; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Module_type); + tp = state->Module_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -4213,7 +4902,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) asdl_seq* body; asdl_seq* type_ignores; - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4225,7 +4914,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4233,7 +4922,10 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Module field \"body\" changed size during iteration"); @@ -4243,7 +4935,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_type_ignores, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->type_ignores, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4255,7 +4947,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Module field \"type_ignores\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Module field \"type_ignores\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4263,7 +4955,10 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) if (type_ignores == NULL) goto failed; for (i = 0; i < len; i++) { type_ignore_ty val; - res = obj2ast_type_ignore(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_type_ignore(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Module field \"type_ignores\" changed size during iteration"); @@ -4277,14 +4972,15 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Interactive_type); + tp = state->Interactive_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { asdl_seq* body; - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4296,7 +4992,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4304,7 +5000,10 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Interactive field \"body\" changed size during iteration"); @@ -4318,14 +5017,15 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Expression_type); + tp = state->Expression_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { expr_ty body; - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4334,7 +5034,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &body, arena); + res = obj2ast_expr(state, tmp, &body, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -4342,7 +5042,8 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionType_type); + tp = state->FunctionType_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -4350,7 +5051,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) asdl_seq* argtypes; expr_ty returns; - if (_PyObject_LookupAttrId(obj, &PyId_argtypes, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->argtypes, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4362,7 +5063,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "FunctionType field \"argtypes\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "FunctionType field \"argtypes\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4370,7 +5071,10 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) if (argtypes == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "FunctionType field \"argtypes\" changed size during iteration"); @@ -4380,7 +5084,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->returns, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4389,7 +5093,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &returns, arena); + res = obj2ast_expr(state, tmp, &returns, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -4397,47 +5101,6 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Suite_type); - if (isinstance == -1) { - return 1; - } - if (isinstance) { - asdl_seq* body; - - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { - return 1; - } - if (tmp == NULL) { - PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Suite"); - return 1; - } - else { - int res; - Py_ssize_t len; - Py_ssize_t i; - if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Suite field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); - goto failed; - } - len = PyList_GET_SIZE(tmp); - body = _Py_asdl_seq_new(len, arena); - if (body == NULL) goto failed; - for (i = 0; i < len; i++) { - stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); - if (res != 0) goto failed; - if (len != PyList_GET_SIZE(tmp)) { - PyErr_SetString(PyExc_RuntimeError, "Suite field \"body\" changed size during iteration"); - goto failed; - } - asdl_seq_SET(body, i, val); - } - Py_CLEAR(tmp); - } - *out = Suite(body, arena); - if (*out == NULL) goto failed; - return 0; - } PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %R", obj); failed: @@ -4446,11 +5109,12 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) } int -obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) +obj2ast_stmt(astmodulestate *state, PyObject* obj, stmt_ty* out, PyArena* arena) { int isinstance; PyObject *tmp = NULL; + PyObject *tp; int lineno; int col_offset; int end_lineno; @@ -4460,7 +5124,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) *out = NULL; return 0; } - if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4469,11 +5133,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &lineno, arena); + res = obj2ast_int(state, tmp, &lineno, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4482,11 +5146,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &col_offset, arena); + res = obj2ast_int(state, tmp, &col_offset, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -4495,11 +5159,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &end_lineno, arena); + res = obj2ast_int(state, tmp, &end_lineno, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -4508,11 +5172,12 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &end_col_offset, arena); + res = obj2ast_int(state, tmp, &end_col_offset, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionDef_type); + tp = state->FunctionDef_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -4524,7 +5189,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) expr_ty returns; string type_comment; - if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4533,11 +5198,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &name, arena); + res = obj2ast_identifier(state, tmp, &name, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4546,11 +5211,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_arguments(tmp, &args, arena); + res = obj2ast_arguments(state, tmp, &args, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4562,7 +5227,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4570,7 +5235,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"body\" changed size during iteration"); @@ -4580,7 +5248,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->decorator_list, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4592,7 +5260,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4600,7 +5268,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (decorator_list == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "FunctionDef field \"decorator_list\" changed size during iteration"); @@ -4610,7 +5281,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->returns, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -4619,11 +5290,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &returns, arena); + res = obj2ast_expr(state, tmp, &returns, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -4632,7 +5303,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_string(tmp, &type_comment, arena); + res = obj2ast_string(state, tmp, &type_comment, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -4642,7 +5313,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFunctionDef_type); + tp = state->AsyncFunctionDef_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -4654,7 +5326,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) expr_ty returns; string type_comment; - if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4663,11 +5335,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &name, arena); + res = obj2ast_identifier(state, tmp, &name, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4676,11 +5348,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_arguments(tmp, &args, arena); + res = obj2ast_arguments(state, tmp, &args, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4692,7 +5364,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4700,7 +5372,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"body\" changed size during iteration"); @@ -4710,7 +5385,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->decorator_list, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4722,7 +5397,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "AsyncFunctionDef field \"decorator_list\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4730,7 +5405,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (decorator_list == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "AsyncFunctionDef field \"decorator_list\" changed size during iteration"); @@ -4740,7 +5418,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->returns, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -4749,11 +5427,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &returns, arena); + res = obj2ast_expr(state, tmp, &returns, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -4762,7 +5440,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_string(tmp, &type_comment, arena); + res = obj2ast_string(state, tmp, &type_comment, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -4772,7 +5450,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)ClassDef_type); + tp = state->ClassDef_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -4783,7 +5462,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) asdl_seq* body; asdl_seq* decorator_list; - if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4792,11 +5471,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &name, arena); + res = obj2ast_identifier(state, tmp, &name, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_bases, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->bases, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4808,7 +5487,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4816,7 +5495,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (bases == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"bases\" changed size during iteration"); @@ -4826,7 +5508,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->keywords, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4838,7 +5520,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4846,7 +5528,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (keywords == NULL) goto failed; for (i = 0; i < len; i++) { keyword_ty val; - res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_keyword(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"keywords\" changed size during iteration"); @@ -4856,7 +5541,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4868,7 +5553,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4876,7 +5561,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"body\" changed size during iteration"); @@ -4886,7 +5574,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_decorator_list, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->decorator_list, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4898,7 +5586,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4906,7 +5594,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (decorator_list == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "ClassDef field \"decorator_list\" changed size during iteration"); @@ -4921,14 +5612,15 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Return_type); + tp = state->Return_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { expr_ty value; - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -4937,7 +5629,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -4946,14 +5638,15 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Delete_type); + tp = state->Delete_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { asdl_seq* targets; - if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->targets, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -4965,7 +5658,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -4973,7 +5666,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (targets == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Delete field \"targets\" changed size during iteration"); @@ -4988,7 +5684,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Assign_type); + tp = state->Assign_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -4997,7 +5694,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) expr_ty value; string type_comment; - if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->targets, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5009,7 +5706,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5017,7 +5714,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (targets == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Assign field \"targets\" changed size during iteration"); @@ -5027,7 +5727,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5036,11 +5736,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -5049,7 +5749,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_string(tmp, &type_comment, arena); + res = obj2ast_string(state, tmp, &type_comment, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5058,7 +5758,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)AugAssign_type); + tp = state->AugAssign_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5067,7 +5768,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) operator_ty op; expr_ty value; - if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5076,11 +5777,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &target, arena); + res = obj2ast_expr(state, tmp, &target, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5089,11 +5790,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_operator(tmp, &op, arena); + res = obj2ast_operator(state, tmp, &op, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5102,7 +5803,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5111,7 +5812,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)AnnAssign_type); + tp = state->AnnAssign_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5121,7 +5823,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) expr_ty value; int simple; - if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5130,11 +5832,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &target, arena); + res = obj2ast_expr(state, tmp, &target, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->annotation, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5143,11 +5845,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &annotation, arena); + res = obj2ast_expr(state, tmp, &annotation, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -5156,11 +5858,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_simple, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->simple, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5169,7 +5871,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &simple, arena); + res = obj2ast_int(state, tmp, &simple, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5178,7 +5880,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)For_type); + tp = state->For_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5189,7 +5892,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) asdl_seq* orelse; string type_comment; - if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5198,11 +5901,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &target, arena); + res = obj2ast_expr(state, tmp, &target, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->iter, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5211,11 +5914,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &iter, arena); + res = obj2ast_expr(state, tmp, &iter, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5227,7 +5930,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5235,7 +5938,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "For field \"body\" changed size during iteration"); @@ -5245,7 +5951,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5257,7 +5963,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5265,7 +5971,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "For field \"orelse\" changed size during iteration"); @@ -5275,7 +5984,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -5284,7 +5993,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_string(tmp, &type_comment, arena); + res = obj2ast_string(state, tmp, &type_comment, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5293,7 +6002,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncFor_type); + tp = state->AsyncFor_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5304,7 +6014,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) asdl_seq* orelse; string type_comment; - if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5313,11 +6023,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &target, arena); + res = obj2ast_expr(state, tmp, &target, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->iter, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5326,11 +6036,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &iter, arena); + res = obj2ast_expr(state, tmp, &iter, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5342,7 +6052,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "AsyncFor field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "AsyncFor field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5350,7 +6060,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"body\" changed size during iteration"); @@ -5360,7 +6073,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5372,7 +6085,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "AsyncFor field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "AsyncFor field \"orelse\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5380,7 +6093,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "AsyncFor field \"orelse\" changed size during iteration"); @@ -5390,7 +6106,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -5399,7 +6115,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_string(tmp, &type_comment, arena); + res = obj2ast_string(state, tmp, &type_comment, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5408,7 +6124,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)While_type); + tp = state->While_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5417,7 +6134,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) asdl_seq* body; asdl_seq* orelse; - if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5426,11 +6143,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &test, arena); + res = obj2ast_expr(state, tmp, &test, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5442,7 +6159,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5450,7 +6167,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "While field \"body\" changed size during iteration"); @@ -5460,7 +6180,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5472,7 +6192,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5480,7 +6200,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "While field \"orelse\" changed size during iteration"); @@ -5495,7 +6218,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)If_type); + tp = state->If_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5504,7 +6228,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) asdl_seq* body; asdl_seq* orelse; - if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5513,11 +6237,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &test, arena); + res = obj2ast_expr(state, tmp, &test, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5529,7 +6253,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5537,7 +6261,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "If field \"body\" changed size during iteration"); @@ -5547,7 +6274,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5559,7 +6286,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5567,7 +6294,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "If field \"orelse\" changed size during iteration"); @@ -5582,7 +6312,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)With_type); + tp = state->With_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5591,7 +6322,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) asdl_seq* body; string type_comment; - if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->items, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5603,7 +6334,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5611,7 +6342,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (items == NULL) goto failed; for (i = 0; i < len; i++) { withitem_ty val; - res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_withitem(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "With field \"items\" changed size during iteration"); @@ -5621,7 +6355,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5633,7 +6367,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5641,7 +6375,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "With field \"body\" changed size during iteration"); @@ -5651,7 +6388,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -5660,7 +6397,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_string(tmp, &type_comment, arena); + res = obj2ast_string(state, tmp, &type_comment, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5669,7 +6406,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)AsyncWith_type); + tp = state->AsyncWith_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5678,7 +6416,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) asdl_seq* body; string type_comment; - if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->items, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5690,7 +6428,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "AsyncWith field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "AsyncWith field \"items\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5698,7 +6436,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (items == NULL) goto failed; for (i = 0; i < len; i++) { withitem_ty val; - res = obj2ast_withitem(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_withitem(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"items\" changed size during iteration"); @@ -5708,7 +6449,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5720,7 +6461,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "AsyncWith field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "AsyncWith field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5728,7 +6469,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "AsyncWith field \"body\" changed size during iteration"); @@ -5738,7 +6482,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -5747,7 +6491,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_string(tmp, &type_comment, arena); + res = obj2ast_string(state, tmp, &type_comment, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5756,7 +6500,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Raise_type); + tp = state->Raise_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5764,7 +6509,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) expr_ty exc; expr_ty cause; - if (_PyObject_LookupAttrId(obj, &PyId_exc, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->exc, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -5773,11 +6518,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &exc, arena); + res = obj2ast_expr(state, tmp, &exc, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_cause, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->cause, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -5786,7 +6531,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &cause, arena); + res = obj2ast_expr(state, tmp, &cause, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5795,7 +6540,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Try_type); + tp = state->Try_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5805,7 +6551,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) asdl_seq* orelse; asdl_seq* finalbody; - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5817,7 +6563,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5825,7 +6571,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Try field \"body\" changed size during iteration"); @@ -5835,7 +6584,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_handlers, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->handlers, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5847,7 +6596,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5855,7 +6604,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (handlers == NULL) goto failed; for (i = 0; i < len; i++) { excepthandler_ty val; - res = obj2ast_excepthandler(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_excepthandler(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Try field \"handlers\" changed size during iteration"); @@ -5865,7 +6617,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5877,7 +6629,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5885,7 +6637,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (orelse == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Try field \"orelse\" changed size during iteration"); @@ -5895,7 +6650,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_finalbody, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->finalbody, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5907,7 +6662,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5915,7 +6670,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (finalbody == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Try field \"finalbody\" changed size during iteration"); @@ -5930,7 +6688,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Assert_type); + tp = state->Assert_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -5938,7 +6697,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) expr_ty test; expr_ty msg; - if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5947,11 +6706,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &test, arena); + res = obj2ast_expr(state, tmp, &test, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_msg, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->msg, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -5960,7 +6719,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &msg, arena); + res = obj2ast_expr(state, tmp, &msg, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -5969,14 +6728,15 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Import_type); + tp = state->Import_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { asdl_seq* names; - if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -5988,7 +6748,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -5996,7 +6756,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (names == NULL) goto failed; for (i = 0; i < len; i++) { alias_ty val; - res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_alias(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Import field \"names\" changed size during iteration"); @@ -6011,7 +6774,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)ImportFrom_type); + tp = state->ImportFrom_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6020,7 +6784,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) asdl_seq* names; int level; - if (_PyObject_LookupAttrId(obj, &PyId_module, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->module, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -6029,11 +6793,11 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &module, arena); + res = obj2ast_identifier(state, tmp, &module, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6045,7 +6809,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6053,7 +6817,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (names == NULL) goto failed; for (i = 0; i < len; i++) { alias_ty val; - res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_alias(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "ImportFrom field \"names\" changed size during iteration"); @@ -6063,7 +6830,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_level, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->level, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -6072,7 +6839,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &level, arena); + res = obj2ast_int(state, tmp, &level, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6081,14 +6848,15 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Global_type); + tp = state->Global_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { asdl_seq* names; - if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6100,7 +6868,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6108,7 +6876,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (names == NULL) goto failed; for (i = 0; i < len; i++) { identifier val; - res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_identifier(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Global field \"names\" changed size during iteration"); @@ -6123,14 +6894,15 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Nonlocal_type); + tp = state->Nonlocal_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { asdl_seq* names; - if (_PyObject_LookupAttrId(obj, &PyId_names, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->names, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6142,7 +6914,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6150,7 +6922,10 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (names == NULL) goto failed; for (i = 0; i < len; i++) { identifier val; - res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_identifier(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Nonlocal field \"names\" changed size during iteration"); @@ -6165,14 +6940,15 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Expr_type); + tp = state->Expr_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { expr_ty value; - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6181,7 +6957,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6190,7 +6966,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Pass_type); + tp = state->Pass_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6200,7 +6977,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Break_type); + tp = state->Break_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6210,7 +6988,8 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Continue_type); + tp = state->Continue_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6228,11 +7007,12 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } int -obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) +obj2ast_expr(astmodulestate *state, PyObject* obj, expr_ty* out, PyArena* arena) { int isinstance; PyObject *tmp = NULL; + PyObject *tp; int lineno; int col_offset; int end_lineno; @@ -6242,7 +7022,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) *out = NULL; return 0; } - if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6251,11 +7031,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &lineno, arena); + res = obj2ast_int(state, tmp, &lineno, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6264,11 +7044,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &col_offset, arena); + res = obj2ast_int(state, tmp, &col_offset, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -6277,11 +7057,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &end_lineno, arena); + res = obj2ast_int(state, tmp, &end_lineno, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -6290,11 +7070,12 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &end_col_offset, arena); + res = obj2ast_int(state, tmp, &end_col_offset, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - isinstance = PyObject_IsInstance(obj, (PyObject*)BoolOp_type); + tp = state->BoolOp_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6302,7 +7083,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) boolop_ty op; asdl_seq* values; - if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6311,11 +7092,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_boolop(tmp, &op, arena); + res = obj2ast_boolop(state, tmp, &op, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6327,7 +7108,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6335,7 +7116,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (values == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "BoolOp field \"values\" changed size during iteration"); @@ -6350,7 +7134,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)NamedExpr_type); + tp = state->NamedExpr_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6358,7 +7143,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) expr_ty target; expr_ty value; - if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6367,11 +7152,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &target, arena); + res = obj2ast_expr(state, tmp, &target, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6380,7 +7165,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6389,7 +7174,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)BinOp_type); + tp = state->BinOp_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6398,7 +7184,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) operator_ty op; expr_ty right; - if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->left, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6407,11 +7193,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &left, arena); + res = obj2ast_expr(state, tmp, &left, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6420,11 +7206,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_operator(tmp, &op, arena); + res = obj2ast_operator(state, tmp, &op, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_right, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->right, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6433,7 +7219,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &right, arena); + res = obj2ast_expr(state, tmp, &right, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6442,7 +7228,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)UnaryOp_type); + tp = state->UnaryOp_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6450,7 +7237,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) unaryop_ty op; expr_ty operand; - if (_PyObject_LookupAttrId(obj, &PyId_op, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->op, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6459,11 +7246,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_unaryop(tmp, &op, arena); + res = obj2ast_unaryop(state, tmp, &op, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_operand, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->operand, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6472,7 +7259,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &operand, arena); + res = obj2ast_expr(state, tmp, &operand, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6481,7 +7268,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Lambda_type); + tp = state->Lambda_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6489,7 +7277,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) arguments_ty args; expr_ty body; - if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6498,11 +7286,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_arguments(tmp, &args, arena); + res = obj2ast_arguments(state, tmp, &args, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6511,7 +7299,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &body, arena); + res = obj2ast_expr(state, tmp, &body, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6520,7 +7308,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)IfExp_type); + tp = state->IfExp_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6529,7 +7318,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) expr_ty body; expr_ty orelse; - if (_PyObject_LookupAttrId(obj, &PyId_test, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->test, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6538,11 +7327,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &test, arena); + res = obj2ast_expr(state, tmp, &test, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6551,11 +7340,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &body, arena); + res = obj2ast_expr(state, tmp, &body, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_orelse, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->orelse, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6564,7 +7353,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &orelse, arena); + res = obj2ast_expr(state, tmp, &orelse, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6573,7 +7362,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Dict_type); + tp = state->Dict_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6581,7 +7371,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) asdl_seq* keys; asdl_seq* values; - if (_PyObject_LookupAttrId(obj, &PyId_keys, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->keys, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6593,7 +7383,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6601,7 +7391,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (keys == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Dict field \"keys\" changed size during iteration"); @@ -6611,7 +7404,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6623,7 +7416,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6631,7 +7424,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (values == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Dict field \"values\" changed size during iteration"); @@ -6646,14 +7442,15 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Set_type); + tp = state->Set_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { asdl_seq* elts; - if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6665,7 +7462,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6673,7 +7470,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (elts == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Set field \"elts\" changed size during iteration"); @@ -6687,7 +7487,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)ListComp_type); + tp = state->ListComp_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6695,7 +7496,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) expr_ty elt; asdl_seq* generators; - if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6704,11 +7505,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &elt, arena); + res = obj2ast_expr(state, tmp, &elt, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6720,7 +7521,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6728,7 +7529,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty val; - res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_comprehension(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "ListComp field \"generators\" changed size during iteration"); @@ -6743,7 +7547,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)SetComp_type); + tp = state->SetComp_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6751,7 +7556,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) expr_ty elt; asdl_seq* generators; - if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6760,11 +7565,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &elt, arena); + res = obj2ast_expr(state, tmp, &elt, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6776,7 +7581,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6784,7 +7589,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty val; - res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_comprehension(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "SetComp field \"generators\" changed size during iteration"); @@ -6799,7 +7607,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)DictComp_type); + tp = state->DictComp_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6808,7 +7617,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) expr_ty value; asdl_seq* generators; - if (_PyObject_LookupAttrId(obj, &PyId_key, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->key, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6817,11 +7626,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &key, arena); + res = obj2ast_expr(state, tmp, &key, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6830,11 +7639,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6846,7 +7655,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6854,7 +7663,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty val; - res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_comprehension(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "DictComp field \"generators\" changed size during iteration"); @@ -6869,7 +7681,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)GeneratorExp_type); + tp = state->GeneratorExp_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -6877,7 +7690,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) expr_ty elt; asdl_seq* generators; - if (_PyObject_LookupAttrId(obj, &PyId_elt, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->elt, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6886,11 +7699,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &elt, arena); + res = obj2ast_expr(state, tmp, &elt, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_generators, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->generators, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6902,7 +7715,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -6910,7 +7723,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (generators == NULL) goto failed; for (i = 0; i < len; i++) { comprehension_ty val; - res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_comprehension(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "GeneratorExp field \"generators\" changed size during iteration"); @@ -6925,14 +7741,15 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Await_type); + tp = state->Await_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { expr_ty value; - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6941,7 +7758,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6950,14 +7767,15 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Yield_type); + tp = state->Yield_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { expr_ty value; - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -6966,7 +7784,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -6975,14 +7793,15 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)YieldFrom_type); + tp = state->YieldFrom_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { expr_ty value; - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -6991,7 +7810,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7000,7 +7819,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Compare_type); + tp = state->Compare_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -7009,7 +7829,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) asdl_int_seq* ops; asdl_seq* comparators; - if (_PyObject_LookupAttrId(obj, &PyId_left, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->left, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7018,11 +7838,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &left, arena); + res = obj2ast_expr(state, tmp, &left, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_ops, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->ops, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7034,7 +7854,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -7042,7 +7862,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (ops == NULL) goto failed; for (i = 0; i < len; i++) { cmpop_ty val; - res = obj2ast_cmpop(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_cmpop(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Compare field \"ops\" changed size during iteration"); @@ -7052,7 +7875,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_comparators, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->comparators, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7064,7 +7887,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -7072,7 +7895,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (comparators == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Compare field \"comparators\" changed size during iteration"); @@ -7087,7 +7913,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Call_type); + tp = state->Call_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -7096,7 +7923,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) asdl_seq* args; asdl_seq* keywords; - if (_PyObject_LookupAttrId(obj, &PyId_func, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->func, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7105,11 +7932,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &func, arena); + res = obj2ast_expr(state, tmp, &func, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7121,7 +7948,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -7129,7 +7956,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (args == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Call field \"args\" changed size during iteration"); @@ -7139,7 +7969,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_keywords, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->keywords, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7151,7 +7981,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -7159,7 +7989,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (keywords == NULL) goto failed; for (i = 0; i < len; i++) { keyword_ty val; - res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_keyword(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Call field \"keywords\" changed size during iteration"); @@ -7174,7 +8007,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)FormattedValue_type); + tp = state->FormattedValue_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -7183,7 +8017,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) int conversion; expr_ty format_spec; - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7192,11 +8026,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_conversion, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->conversion, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -7205,11 +8039,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &conversion, arena); + res = obj2ast_int(state, tmp, &conversion, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_format_spec, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->format_spec, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -7218,7 +8052,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &format_spec, arena); + res = obj2ast_expr(state, tmp, &format_spec, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7227,14 +8061,15 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)JoinedStr_type); + tp = state->JoinedStr_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { asdl_seq* values; - if (_PyObject_LookupAttrId(obj, &PyId_values, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->values, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7246,7 +8081,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "JoinedStr field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "JoinedStr field \"values\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -7254,7 +8089,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (values == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "JoinedStr field \"values\" changed size during iteration"); @@ -7269,7 +8107,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Constant_type); + tp = state->Constant_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -7277,7 +8116,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) constant value; string kind; - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7286,11 +8125,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_constant(tmp, &value, arena); + res = obj2ast_constant(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_kind, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->kind, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -7299,7 +8138,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_string(tmp, &kind, arena); + res = obj2ast_string(state, tmp, &kind, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7308,7 +8147,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Attribute_type); + tp = state->Attribute_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -7317,7 +8157,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) identifier attr; expr_context_ty ctx; - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7326,11 +8166,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_attr, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->attr, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7339,11 +8179,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &attr, arena); + res = obj2ast_identifier(state, tmp, &attr, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7352,7 +8192,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr_context(tmp, &ctx, arena); + res = obj2ast_expr_context(state, tmp, &ctx, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7361,16 +8201,17 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Subscript_type); + tp = state->Subscript_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } if (isinstance) { expr_ty value; - slice_ty slice; + expr_ty slice; expr_context_ty ctx; - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7379,11 +8220,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_slice, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->slice, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7392,11 +8233,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_slice(tmp, &slice, arena); + res = obj2ast_expr(state, tmp, &slice, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7405,7 +8246,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr_context(tmp, &ctx, arena); + res = obj2ast_expr_context(state, tmp, &ctx, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7414,7 +8255,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Starred_type); + tp = state->Starred_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -7422,7 +8264,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) expr_ty value; expr_context_ty ctx; - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7431,11 +8273,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7444,7 +8286,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr_context(tmp, &ctx, arena); + res = obj2ast_expr_context(state, tmp, &ctx, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7453,7 +8295,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Name_type); + tp = state->Name_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -7461,7 +8304,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) identifier id; expr_context_ty ctx; - if (_PyObject_LookupAttrId(obj, &PyId_id, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->id, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7470,11 +8313,11 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &id, arena); + res = obj2ast_identifier(state, tmp, &id, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7483,7 +8326,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr_context(tmp, &ctx, arena); + res = obj2ast_expr_context(state, tmp, &ctx, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7492,7 +8335,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)List_type); + tp = state->List_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -7500,7 +8344,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) asdl_seq* elts; expr_context_ty ctx; - if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7512,7 +8356,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -7520,7 +8364,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (elts == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "List field \"elts\" changed size during iteration"); @@ -7530,7 +8377,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7539,7 +8386,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr_context(tmp, &ctx, arena); + res = obj2ast_expr_context(state, tmp, &ctx, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7548,7 +8395,8 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Tuple_type); + tp = state->Tuple_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -7556,7 +8404,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) asdl_seq* elts; expr_context_ty ctx; - if (_PyObject_LookupAttrId(obj, &PyId_elts, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->elts, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7568,7 +8416,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -7576,7 +8424,10 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (elts == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "Tuple field \"elts\" changed size during iteration"); @@ -7586,7 +8437,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_ctx, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->ctx, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -7595,7 +8446,7 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr_context(tmp, &ctx, arena); + res = obj2ast_expr_context(state, tmp, &ctx, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -7604,92 +8455,17 @@ obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } + tp = state->Slice_type; + isinstance = PyObject_IsInstance(obj, tp); + if (isinstance == -1) { + return 1; + } + if (isinstance) { + expr_ty lower; + expr_ty upper; + expr_ty step; - PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %R", obj); - failed: - Py_XDECREF(tmp); - return 1; -} - -int -obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena* arena) -{ - int isinstance; - - isinstance = PyObject_IsInstance(obj, (PyObject *)Load_type); - if (isinstance == -1) { - return 1; - } - if (isinstance) { - *out = Load; - return 0; - } - isinstance = PyObject_IsInstance(obj, (PyObject *)Store_type); - if (isinstance == -1) { - return 1; - } - if (isinstance) { - *out = Store; - return 0; - } - isinstance = PyObject_IsInstance(obj, (PyObject *)Del_type); - if (isinstance == -1) { - return 1; - } - if (isinstance) { - *out = Del; - return 0; - } - isinstance = PyObject_IsInstance(obj, (PyObject *)AugLoad_type); - if (isinstance == -1) { - return 1; - } - if (isinstance) { - *out = AugLoad; - return 0; - } - isinstance = PyObject_IsInstance(obj, (PyObject *)AugStore_type); - if (isinstance == -1) { - return 1; - } - if (isinstance) { - *out = AugStore; - return 0; - } - isinstance = PyObject_IsInstance(obj, (PyObject *)Param_type); - if (isinstance == -1) { - return 1; - } - if (isinstance) { - *out = Param; - return 0; - } - - PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj); - return 1; -} - -int -obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena) -{ - int isinstance; - - PyObject *tmp = NULL; - - if (obj == Py_None) { - *out = NULL; - return 0; - } - isinstance = PyObject_IsInstance(obj, (PyObject*)Slice_type); - if (isinstance == -1) { - return 1; - } - if (isinstance) { - expr_ty lower; - expr_ty upper; - expr_ty step; - - if (_PyObject_LookupAttrId(obj, &PyId_lower, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->lower, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -7698,11 +8474,11 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &lower, arena); + res = obj2ast_expr(state, tmp, &lower, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_upper, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->upper, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -7711,11 +8487,11 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &upper, arena); + res = obj2ast_expr(state, tmp, &upper, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_step, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->step, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -7724,92 +8500,64 @@ obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &step, arena); + res = obj2ast_expr(state, tmp, &step, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - *out = Slice(lower, upper, step, arena); + *out = Slice(lower, upper, step, lineno, col_offset, end_lineno, + end_col_offset, arena); if (*out == NULL) goto failed; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)ExtSlice_type); + + PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %R", obj); + failed: + Py_XDECREF(tmp); + return 1; +} + +int +obj2ast_expr_context(astmodulestate *state, PyObject* obj, expr_context_ty* + out, PyArena* arena) +{ + int isinstance; + + isinstance = PyObject_IsInstance(obj, state->Load_type); if (isinstance == -1) { return 1; } if (isinstance) { - asdl_seq* dims; - - if (_PyObject_LookupAttrId(obj, &PyId_dims, &tmp) < 0) { - return 1; - } - if (tmp == NULL) { - PyErr_SetString(PyExc_TypeError, "required field \"dims\" missing from ExtSlice"); - return 1; - } - else { - int res; - Py_ssize_t len; - Py_ssize_t i; - if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ExtSlice field \"dims\" must be a list, not a %.200s", tmp->ob_type->tp_name); - goto failed; - } - len = PyList_GET_SIZE(tmp); - dims = _Py_asdl_seq_new(len, arena); - if (dims == NULL) goto failed; - for (i = 0; i < len; i++) { - slice_ty val; - res = obj2ast_slice(PyList_GET_ITEM(tmp, i), &val, arena); - if (res != 0) goto failed; - if (len != PyList_GET_SIZE(tmp)) { - PyErr_SetString(PyExc_RuntimeError, "ExtSlice field \"dims\" changed size during iteration"); - goto failed; - } - asdl_seq_SET(dims, i, val); - } - Py_CLEAR(tmp); - } - *out = ExtSlice(dims, arena); - if (*out == NULL) goto failed; + *out = Load; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)Index_type); + isinstance = PyObject_IsInstance(obj, state->Store_type); if (isinstance == -1) { return 1; } if (isinstance) { - expr_ty value; - - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { - return 1; - } - if (tmp == NULL) { - PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Index"); - return 1; - } - else { - int res; - res = obj2ast_expr(tmp, &value, arena); - if (res != 0) goto failed; - Py_CLEAR(tmp); - } - *out = Index(value, arena); - if (*out == NULL) goto failed; + *out = Store; + return 0; + } + isinstance = PyObject_IsInstance(obj, state->Del_type); + if (isinstance == -1) { + return 1; + } + if (isinstance) { + *out = Del; return 0; } - PyErr_Format(PyExc_TypeError, "expected some sort of slice, but got %R", obj); - failed: - Py_XDECREF(tmp); + PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %R", obj); return 1; } int -obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena) +obj2ast_boolop(astmodulestate *state, PyObject* obj, boolop_ty* out, PyArena* + arena) { int isinstance; - isinstance = PyObject_IsInstance(obj, (PyObject *)And_type); + isinstance = PyObject_IsInstance(obj, state->And_type); if (isinstance == -1) { return 1; } @@ -7817,7 +8565,7 @@ obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena) *out = And; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)Or_type); + isinstance = PyObject_IsInstance(obj, state->Or_type); if (isinstance == -1) { return 1; } @@ -7831,11 +8579,12 @@ obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena) } int -obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) +obj2ast_operator(astmodulestate *state, PyObject* obj, operator_ty* out, + PyArena* arena) { int isinstance; - isinstance = PyObject_IsInstance(obj, (PyObject *)Add_type); + isinstance = PyObject_IsInstance(obj, state->Add_type); if (isinstance == -1) { return 1; } @@ -7843,7 +8592,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = Add; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)Sub_type); + isinstance = PyObject_IsInstance(obj, state->Sub_type); if (isinstance == -1) { return 1; } @@ -7851,7 +8600,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = Sub; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)Mult_type); + isinstance = PyObject_IsInstance(obj, state->Mult_type); if (isinstance == -1) { return 1; } @@ -7859,7 +8608,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = Mult; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)MatMult_type); + isinstance = PyObject_IsInstance(obj, state->MatMult_type); if (isinstance == -1) { return 1; } @@ -7867,7 +8616,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = MatMult; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)Div_type); + isinstance = PyObject_IsInstance(obj, state->Div_type); if (isinstance == -1) { return 1; } @@ -7875,7 +8624,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = Div; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)Mod_type); + isinstance = PyObject_IsInstance(obj, state->Mod_type); if (isinstance == -1) { return 1; } @@ -7883,7 +8632,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = Mod; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)Pow_type); + isinstance = PyObject_IsInstance(obj, state->Pow_type); if (isinstance == -1) { return 1; } @@ -7891,7 +8640,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = Pow; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)LShift_type); + isinstance = PyObject_IsInstance(obj, state->LShift_type); if (isinstance == -1) { return 1; } @@ -7899,7 +8648,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = LShift; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)RShift_type); + isinstance = PyObject_IsInstance(obj, state->RShift_type); if (isinstance == -1) { return 1; } @@ -7907,7 +8656,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = RShift; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)BitOr_type); + isinstance = PyObject_IsInstance(obj, state->BitOr_type); if (isinstance == -1) { return 1; } @@ -7915,7 +8664,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = BitOr; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)BitXor_type); + isinstance = PyObject_IsInstance(obj, state->BitXor_type); if (isinstance == -1) { return 1; } @@ -7923,7 +8672,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = BitXor; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)BitAnd_type); + isinstance = PyObject_IsInstance(obj, state->BitAnd_type); if (isinstance == -1) { return 1; } @@ -7931,7 +8680,7 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = BitAnd; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)FloorDiv_type); + isinstance = PyObject_IsInstance(obj, state->FloorDiv_type); if (isinstance == -1) { return 1; } @@ -7945,11 +8694,12 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) } int -obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena) +obj2ast_unaryop(astmodulestate *state, PyObject* obj, unaryop_ty* out, PyArena* + arena) { int isinstance; - isinstance = PyObject_IsInstance(obj, (PyObject *)Invert_type); + isinstance = PyObject_IsInstance(obj, state->Invert_type); if (isinstance == -1) { return 1; } @@ -7957,7 +8707,7 @@ obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena) *out = Invert; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)Not_type); + isinstance = PyObject_IsInstance(obj, state->Not_type); if (isinstance == -1) { return 1; } @@ -7965,7 +8715,7 @@ obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena) *out = Not; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)UAdd_type); + isinstance = PyObject_IsInstance(obj, state->UAdd_type); if (isinstance == -1) { return 1; } @@ -7973,7 +8723,7 @@ obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena) *out = UAdd; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)USub_type); + isinstance = PyObject_IsInstance(obj, state->USub_type); if (isinstance == -1) { return 1; } @@ -7987,11 +8737,12 @@ obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena) } int -obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) +obj2ast_cmpop(astmodulestate *state, PyObject* obj, cmpop_ty* out, PyArena* + arena) { int isinstance; - isinstance = PyObject_IsInstance(obj, (PyObject *)Eq_type); + isinstance = PyObject_IsInstance(obj, state->Eq_type); if (isinstance == -1) { return 1; } @@ -7999,7 +8750,7 @@ obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) *out = Eq; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)NotEq_type); + isinstance = PyObject_IsInstance(obj, state->NotEq_type); if (isinstance == -1) { return 1; } @@ -8007,7 +8758,7 @@ obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) *out = NotEq; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)Lt_type); + isinstance = PyObject_IsInstance(obj, state->Lt_type); if (isinstance == -1) { return 1; } @@ -8015,7 +8766,7 @@ obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) *out = Lt; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)LtE_type); + isinstance = PyObject_IsInstance(obj, state->LtE_type); if (isinstance == -1) { return 1; } @@ -8023,7 +8774,7 @@ obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) *out = LtE; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)Gt_type); + isinstance = PyObject_IsInstance(obj, state->Gt_type); if (isinstance == -1) { return 1; } @@ -8031,7 +8782,7 @@ obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) *out = Gt; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)GtE_type); + isinstance = PyObject_IsInstance(obj, state->GtE_type); if (isinstance == -1) { return 1; } @@ -8039,7 +8790,7 @@ obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) *out = GtE; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)Is_type); + isinstance = PyObject_IsInstance(obj, state->Is_type); if (isinstance == -1) { return 1; } @@ -8047,7 +8798,7 @@ obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) *out = Is; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)IsNot_type); + isinstance = PyObject_IsInstance(obj, state->IsNot_type); if (isinstance == -1) { return 1; } @@ -8055,7 +8806,7 @@ obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) *out = IsNot; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)In_type); + isinstance = PyObject_IsInstance(obj, state->In_type); if (isinstance == -1) { return 1; } @@ -8063,7 +8814,7 @@ obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) *out = In; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject *)NotIn_type); + isinstance = PyObject_IsInstance(obj, state->NotIn_type); if (isinstance == -1) { return 1; } @@ -8077,7 +8828,8 @@ obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena) } int -obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena) +obj2ast_comprehension(astmodulestate *state, PyObject* obj, comprehension_ty* + out, PyArena* arena) { PyObject* tmp = NULL; expr_ty target; @@ -8085,7 +8837,7 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena) asdl_seq* ifs; int is_async; - if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->target, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8094,11 +8846,11 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &target, arena); + res = obj2ast_expr(state, tmp, &target, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_iter, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->iter, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8107,11 +8859,11 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &iter, arena); + res = obj2ast_expr(state, tmp, &iter, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_ifs, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->ifs, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8123,7 +8875,7 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -8131,7 +8883,10 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena) if (ifs == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "comprehension field \"ifs\" changed size during iteration"); @@ -8141,7 +8896,7 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_is_async, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->is_async, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8150,7 +8905,7 @@ obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &is_async, arena); + res = obj2ast_int(state, tmp, &is_async, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8162,11 +8917,13 @@ failed: } int -obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) +obj2ast_excepthandler(astmodulestate *state, PyObject* obj, excepthandler_ty* + out, PyArena* arena) { int isinstance; PyObject *tmp = NULL; + PyObject *tp; int lineno; int col_offset; int end_lineno; @@ -8176,7 +8933,7 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) *out = NULL; return 0; } - if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8185,11 +8942,11 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &lineno, arena); + res = obj2ast_int(state, tmp, &lineno, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8198,11 +8955,11 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &col_offset, arena); + res = obj2ast_int(state, tmp, &col_offset, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8211,11 +8968,11 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &end_lineno, arena); + res = obj2ast_int(state, tmp, &end_lineno, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8224,11 +8981,12 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &end_col_offset, arena); + res = obj2ast_int(state, tmp, &end_col_offset, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - isinstance = PyObject_IsInstance(obj, (PyObject*)ExceptHandler_type); + tp = state->ExceptHandler_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -8237,7 +8995,7 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) identifier name; asdl_seq* body; - if (_PyObject_LookupAttrId(obj, &PyId_type, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->type, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8246,11 +9004,11 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &type, arena); + res = obj2ast_expr(state, tmp, &type, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8259,11 +9017,11 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &name, arena); + res = obj2ast_identifier(state, tmp, &name, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->body, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8275,7 +9033,7 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -8283,7 +9041,10 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) if (body == NULL) goto failed; for (i = 0; i < len; i++) { stmt_ty val; - res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_stmt(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "ExceptHandler field \"body\" changed size during iteration"); @@ -8306,7 +9067,8 @@ obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena) } int -obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) +obj2ast_arguments(astmodulestate *state, PyObject* obj, arguments_ty* out, + PyArena* arena) { PyObject* tmp = NULL; asdl_seq* posonlyargs; @@ -8317,7 +9079,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) arg_ty kwarg; asdl_seq* defaults; - if (_PyObject_LookupAttrId(obj, &PyId_posonlyargs, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->posonlyargs, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8329,7 +9091,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "arguments field \"posonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "arguments field \"posonlyargs\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -8337,7 +9099,10 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) if (posonlyargs == NULL) goto failed; for (i = 0; i < len; i++) { arg_ty val; - res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_arg(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "arguments field \"posonlyargs\" changed size during iteration"); @@ -8347,7 +9112,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_args, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->args, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8359,7 +9124,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -8367,7 +9132,10 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) if (args == NULL) goto failed; for (i = 0; i < len; i++) { arg_ty val; - res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_arg(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "arguments field \"args\" changed size during iteration"); @@ -8377,7 +9145,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_vararg, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->vararg, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8386,11 +9154,11 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) } else { int res; - res = obj2ast_arg(tmp, &vararg, arena); + res = obj2ast_arg(state, tmp, &vararg, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_kwonlyargs, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->kwonlyargs, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8402,7 +9170,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -8410,7 +9178,10 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) if (kwonlyargs == NULL) goto failed; for (i = 0; i < len; i++) { arg_ty val; - res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_arg(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "arguments field \"kwonlyargs\" changed size during iteration"); @@ -8420,7 +9191,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_kw_defaults, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->kw_defaults, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8432,7 +9203,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -8440,7 +9211,10 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) if (kw_defaults == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "arguments field \"kw_defaults\" changed size during iteration"); @@ -8450,7 +9224,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_kwarg, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->kwarg, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8459,11 +9233,11 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) } else { int res; - res = obj2ast_arg(tmp, &kwarg, arena); + res = obj2ast_arg(state, tmp, &kwarg, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_defaults, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->defaults, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8475,7 +9249,7 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) Py_ssize_t len; Py_ssize_t i; if (!PyList_Check(tmp)) { - PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp))); goto failed; } len = PyList_GET_SIZE(tmp); @@ -8483,7 +9257,10 @@ obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena) if (defaults == NULL) goto failed; for (i = 0; i < len; i++) { expr_ty val; - res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + PyObject *tmp2 = PyList_GET_ITEM(tmp, i); + Py_INCREF(tmp2); + res = obj2ast_expr(state, tmp2, &val, arena); + Py_DECREF(tmp2); if (res != 0) goto failed; if (len != PyList_GET_SIZE(tmp)) { PyErr_SetString(PyExc_RuntimeError, "arguments field \"defaults\" changed size during iteration"); @@ -8502,7 +9279,7 @@ failed: } int -obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) +obj2ast_arg(astmodulestate *state, PyObject* obj, arg_ty* out, PyArena* arena) { PyObject* tmp = NULL; identifier arg; @@ -8513,7 +9290,7 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) int end_lineno; int end_col_offset; - if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->arg, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8522,11 +9299,11 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &arg, arena); + res = obj2ast_identifier(state, tmp, &arg, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_annotation, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->annotation, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8535,11 +9312,11 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &annotation, arena); + res = obj2ast_expr(state, tmp, &annotation, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->type_comment, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8548,11 +9325,11 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) } else { int res; - res = obj2ast_string(tmp, &type_comment, arena); + res = obj2ast_string(state, tmp, &type_comment, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8561,11 +9338,11 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &lineno, arena); + res = obj2ast_int(state, tmp, &lineno, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_col_offset, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8574,11 +9351,11 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &col_offset, arena); + res = obj2ast_int(state, tmp, &col_offset, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_end_lineno, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8587,11 +9364,11 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &end_lineno, arena); + res = obj2ast_int(state, tmp, &end_lineno, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_end_col_offset, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8600,7 +9377,7 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &end_col_offset, arena); + res = obj2ast_int(state, tmp, &end_col_offset, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8613,13 +9390,18 @@ failed: } int -obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena) +obj2ast_keyword(astmodulestate *state, PyObject* obj, keyword_ty* out, PyArena* + arena) { PyObject* tmp = NULL; identifier arg; expr_ty value; + int lineno; + int col_offset; + int end_lineno; + int end_col_offset; - if (_PyObject_LookupAttrId(obj, &PyId_arg, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->arg, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8628,11 +9410,11 @@ obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &arg, arena); + res = obj2ast_identifier(state, tmp, &arg, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_value, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->value, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8641,11 +9423,64 @@ obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &value, arena); + res = obj2ast_expr(state, tmp, &value, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } + if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) { + return 1; + } + if (tmp == NULL) { + PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from keyword"); + return 1; + } + else { + int res; + res = obj2ast_int(state, tmp, &lineno, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - *out = keyword(arg, value, arena); + if (_PyObject_LookupAttr(obj, state->col_offset, &tmp) < 0) { + return 1; + } + if (tmp == NULL) { + PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from keyword"); + return 1; + } + else { + int res; + res = obj2ast_int(state, tmp, &col_offset, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } + if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) { + return 1; + } + if (tmp == NULL || tmp == Py_None) { + Py_CLEAR(tmp); + end_lineno = 0; + } + else { + int res; + res = obj2ast_int(state, tmp, &end_lineno, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } + if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) { + return 1; + } + if (tmp == NULL || tmp == Py_None) { + Py_CLEAR(tmp); + end_col_offset = 0; + } + else { + int res; + res = obj2ast_int(state, tmp, &end_col_offset, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } + *out = keyword(arg, value, lineno, col_offset, end_lineno, end_col_offset, + arena); return 0; failed: Py_XDECREF(tmp); @@ -8653,13 +9488,14 @@ failed: } int -obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena) +obj2ast_alias(astmodulestate *state, PyObject* obj, alias_ty* out, PyArena* + arena) { PyObject* tmp = NULL; identifier name; identifier asname; - if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->name, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8668,11 +9504,11 @@ obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &name, arena); + res = obj2ast_identifier(state, tmp, &name, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_asname, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->asname, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8681,7 +9517,7 @@ obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena) } else { int res; - res = obj2ast_identifier(tmp, &asname, arena); + res = obj2ast_identifier(state, tmp, &asname, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8693,13 +9529,14 @@ failed: } int -obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena) +obj2ast_withitem(astmodulestate *state, PyObject* obj, withitem_ty* out, + PyArena* arena) { PyObject* tmp = NULL; expr_ty context_expr; expr_ty optional_vars; - if (_PyObject_LookupAttrId(obj, &PyId_context_expr, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->context_expr, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8708,11 +9545,11 @@ obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &context_expr, arena); + res = obj2ast_expr(state, tmp, &context_expr, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_optional_vars, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->optional_vars, &tmp) < 0) { return 1; } if (tmp == NULL || tmp == Py_None) { @@ -8721,7 +9558,7 @@ obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena) } else { int res; - res = obj2ast_expr(tmp, &optional_vars, arena); + res = obj2ast_expr(state, tmp, &optional_vars, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8733,17 +9570,20 @@ failed: } int -obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena* arena) +obj2ast_type_ignore(astmodulestate *state, PyObject* obj, type_ignore_ty* out, + PyArena* arena) { int isinstance; PyObject *tmp = NULL; + PyObject *tp; if (obj == Py_None) { *out = NULL; return 0; } - isinstance = PyObject_IsInstance(obj, (PyObject*)TypeIgnore_type); + tp = state->TypeIgnore_type; + isinstance = PyObject_IsInstance(obj, tp); if (isinstance == -1) { return 1; } @@ -8751,7 +9591,7 @@ obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena* arena) int lineno; string tag; - if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->lineno, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8760,11 +9600,11 @@ obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena* arena) } else { int res; - res = obj2ast_int(tmp, &lineno, arena); + res = obj2ast_int(state, tmp, &lineno, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } - if (_PyObject_LookupAttrId(obj, &PyId_tag, &tmp) < 0) { + if (_PyObject_LookupAttr(obj, state->tag, &tmp) < 0) { return 1; } if (tmp == NULL) { @@ -8773,7 +9613,7 @@ obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena* arena) } else { int res; - res = obj2ast_string(tmp, &tag, arena); + res = obj2ast_string(state, tmp, &tag, arena); if (res != 0) goto failed; Py_CLEAR(tmp); } @@ -8789,257 +9629,514 @@ obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena* arena) } +static int +astmodule_exec(PyObject *m) +{ + astmodulestate *state = get_ast_state(m); + + if (!init_types(state)) { + return -1; + } + if (PyModule_AddObject(m, "AST", state->AST_type) < 0) { + return -1; + } + Py_INCREF(state->AST_type); + if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0) { + return -1; + } + if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0) { + return -1; + } + if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0) { + return -1; + } + if (PyModule_AddObject(m, "mod", state->mod_type) < 0) { + return -1; + } + Py_INCREF(state->mod_type); + if (PyModule_AddObject(m, "Module", state->Module_type) < 0) { + return -1; + } + Py_INCREF(state->Module_type); + if (PyModule_AddObject(m, "Interactive", state->Interactive_type) < 0) { + return -1; + } + Py_INCREF(state->Interactive_type); + if (PyModule_AddObject(m, "Expression", state->Expression_type) < 0) { + return -1; + } + Py_INCREF(state->Expression_type); + if (PyModule_AddObject(m, "FunctionType", state->FunctionType_type) < 0) { + return -1; + } + Py_INCREF(state->FunctionType_type); + if (PyModule_AddObject(m, "stmt", state->stmt_type) < 0) { + return -1; + } + Py_INCREF(state->stmt_type); + if (PyModule_AddObject(m, "FunctionDef", state->FunctionDef_type) < 0) { + return -1; + } + Py_INCREF(state->FunctionDef_type); + if (PyModule_AddObject(m, "AsyncFunctionDef", state->AsyncFunctionDef_type) + < 0) { + return -1; + } + Py_INCREF(state->AsyncFunctionDef_type); + if (PyModule_AddObject(m, "ClassDef", state->ClassDef_type) < 0) { + return -1; + } + Py_INCREF(state->ClassDef_type); + if (PyModule_AddObject(m, "Return", state->Return_type) < 0) { + return -1; + } + Py_INCREF(state->Return_type); + if (PyModule_AddObject(m, "Delete", state->Delete_type) < 0) { + return -1; + } + Py_INCREF(state->Delete_type); + if (PyModule_AddObject(m, "Assign", state->Assign_type) < 0) { + return -1; + } + Py_INCREF(state->Assign_type); + if (PyModule_AddObject(m, "AugAssign", state->AugAssign_type) < 0) { + return -1; + } + Py_INCREF(state->AugAssign_type); + if (PyModule_AddObject(m, "AnnAssign", state->AnnAssign_type) < 0) { + return -1; + } + Py_INCREF(state->AnnAssign_type); + if (PyModule_AddObject(m, "For", state->For_type) < 0) { + return -1; + } + Py_INCREF(state->For_type); + if (PyModule_AddObject(m, "AsyncFor", state->AsyncFor_type) < 0) { + return -1; + } + Py_INCREF(state->AsyncFor_type); + if (PyModule_AddObject(m, "While", state->While_type) < 0) { + return -1; + } + Py_INCREF(state->While_type); + if (PyModule_AddObject(m, "If", state->If_type) < 0) { + return -1; + } + Py_INCREF(state->If_type); + if (PyModule_AddObject(m, "With", state->With_type) < 0) { + return -1; + } + Py_INCREF(state->With_type); + if (PyModule_AddObject(m, "AsyncWith", state->AsyncWith_type) < 0) { + return -1; + } + Py_INCREF(state->AsyncWith_type); + if (PyModule_AddObject(m, "Raise", state->Raise_type) < 0) { + return -1; + } + Py_INCREF(state->Raise_type); + if (PyModule_AddObject(m, "Try", state->Try_type) < 0) { + return -1; + } + Py_INCREF(state->Try_type); + if (PyModule_AddObject(m, "Assert", state->Assert_type) < 0) { + return -1; + } + Py_INCREF(state->Assert_type); + if (PyModule_AddObject(m, "Import", state->Import_type) < 0) { + return -1; + } + Py_INCREF(state->Import_type); + if (PyModule_AddObject(m, "ImportFrom", state->ImportFrom_type) < 0) { + return -1; + } + Py_INCREF(state->ImportFrom_type); + if (PyModule_AddObject(m, "Global", state->Global_type) < 0) { + return -1; + } + Py_INCREF(state->Global_type); + if (PyModule_AddObject(m, "Nonlocal", state->Nonlocal_type) < 0) { + return -1; + } + Py_INCREF(state->Nonlocal_type); + if (PyModule_AddObject(m, "Expr", state->Expr_type) < 0) { + return -1; + } + Py_INCREF(state->Expr_type); + if (PyModule_AddObject(m, "Pass", state->Pass_type) < 0) { + return -1; + } + Py_INCREF(state->Pass_type); + if (PyModule_AddObject(m, "Break", state->Break_type) < 0) { + return -1; + } + Py_INCREF(state->Break_type); + if (PyModule_AddObject(m, "Continue", state->Continue_type) < 0) { + return -1; + } + Py_INCREF(state->Continue_type); + if (PyModule_AddObject(m, "expr", state->expr_type) < 0) { + return -1; + } + Py_INCREF(state->expr_type); + if (PyModule_AddObject(m, "BoolOp", state->BoolOp_type) < 0) { + return -1; + } + Py_INCREF(state->BoolOp_type); + if (PyModule_AddObject(m, "NamedExpr", state->NamedExpr_type) < 0) { + return -1; + } + Py_INCREF(state->NamedExpr_type); + if (PyModule_AddObject(m, "BinOp", state->BinOp_type) < 0) { + return -1; + } + Py_INCREF(state->BinOp_type); + if (PyModule_AddObject(m, "UnaryOp", state->UnaryOp_type) < 0) { + return -1; + } + Py_INCREF(state->UnaryOp_type); + if (PyModule_AddObject(m, "Lambda", state->Lambda_type) < 0) { + return -1; + } + Py_INCREF(state->Lambda_type); + if (PyModule_AddObject(m, "IfExp", state->IfExp_type) < 0) { + return -1; + } + Py_INCREF(state->IfExp_type); + if (PyModule_AddObject(m, "Dict", state->Dict_type) < 0) { + return -1; + } + Py_INCREF(state->Dict_type); + if (PyModule_AddObject(m, "Set", state->Set_type) < 0) { + return -1; + } + Py_INCREF(state->Set_type); + if (PyModule_AddObject(m, "ListComp", state->ListComp_type) < 0) { + return -1; + } + Py_INCREF(state->ListComp_type); + if (PyModule_AddObject(m, "SetComp", state->SetComp_type) < 0) { + return -1; + } + Py_INCREF(state->SetComp_type); + if (PyModule_AddObject(m, "DictComp", state->DictComp_type) < 0) { + return -1; + } + Py_INCREF(state->DictComp_type); + if (PyModule_AddObject(m, "GeneratorExp", state->GeneratorExp_type) < 0) { + return -1; + } + Py_INCREF(state->GeneratorExp_type); + if (PyModule_AddObject(m, "Await", state->Await_type) < 0) { + return -1; + } + Py_INCREF(state->Await_type); + if (PyModule_AddObject(m, "Yield", state->Yield_type) < 0) { + return -1; + } + Py_INCREF(state->Yield_type); + if (PyModule_AddObject(m, "YieldFrom", state->YieldFrom_type) < 0) { + return -1; + } + Py_INCREF(state->YieldFrom_type); + if (PyModule_AddObject(m, "Compare", state->Compare_type) < 0) { + return -1; + } + Py_INCREF(state->Compare_type); + if (PyModule_AddObject(m, "Call", state->Call_type) < 0) { + return -1; + } + Py_INCREF(state->Call_type); + if (PyModule_AddObject(m, "FormattedValue", state->FormattedValue_type) < + 0) { + return -1; + } + Py_INCREF(state->FormattedValue_type); + if (PyModule_AddObject(m, "JoinedStr", state->JoinedStr_type) < 0) { + return -1; + } + Py_INCREF(state->JoinedStr_type); + if (PyModule_AddObject(m, "Constant", state->Constant_type) < 0) { + return -1; + } + Py_INCREF(state->Constant_type); + if (PyModule_AddObject(m, "Attribute", state->Attribute_type) < 0) { + return -1; + } + Py_INCREF(state->Attribute_type); + if (PyModule_AddObject(m, "Subscript", state->Subscript_type) < 0) { + return -1; + } + Py_INCREF(state->Subscript_type); + if (PyModule_AddObject(m, "Starred", state->Starred_type) < 0) { + return -1; + } + Py_INCREF(state->Starred_type); + if (PyModule_AddObject(m, "Name", state->Name_type) < 0) { + return -1; + } + Py_INCREF(state->Name_type); + if (PyModule_AddObject(m, "List", state->List_type) < 0) { + return -1; + } + Py_INCREF(state->List_type); + if (PyModule_AddObject(m, "Tuple", state->Tuple_type) < 0) { + return -1; + } + Py_INCREF(state->Tuple_type); + if (PyModule_AddObject(m, "Slice", state->Slice_type) < 0) { + return -1; + } + Py_INCREF(state->Slice_type); + if (PyModule_AddObject(m, "expr_context", state->expr_context_type) < 0) { + return -1; + } + Py_INCREF(state->expr_context_type); + if (PyModule_AddObject(m, "Load", state->Load_type) < 0) { + return -1; + } + Py_INCREF(state->Load_type); + if (PyModule_AddObject(m, "Store", state->Store_type) < 0) { + return -1; + } + Py_INCREF(state->Store_type); + if (PyModule_AddObject(m, "Del", state->Del_type) < 0) { + return -1; + } + Py_INCREF(state->Del_type); + if (PyModule_AddObject(m, "boolop", state->boolop_type) < 0) { + return -1; + } + Py_INCREF(state->boolop_type); + if (PyModule_AddObject(m, "And", state->And_type) < 0) { + return -1; + } + Py_INCREF(state->And_type); + if (PyModule_AddObject(m, "Or", state->Or_type) < 0) { + return -1; + } + Py_INCREF(state->Or_type); + if (PyModule_AddObject(m, "operator", state->operator_type) < 0) { + return -1; + } + Py_INCREF(state->operator_type); + if (PyModule_AddObject(m, "Add", state->Add_type) < 0) { + return -1; + } + Py_INCREF(state->Add_type); + if (PyModule_AddObject(m, "Sub", state->Sub_type) < 0) { + return -1; + } + Py_INCREF(state->Sub_type); + if (PyModule_AddObject(m, "Mult", state->Mult_type) < 0) { + return -1; + } + Py_INCREF(state->Mult_type); + if (PyModule_AddObject(m, "MatMult", state->MatMult_type) < 0) { + return -1; + } + Py_INCREF(state->MatMult_type); + if (PyModule_AddObject(m, "Div", state->Div_type) < 0) { + return -1; + } + Py_INCREF(state->Div_type); + if (PyModule_AddObject(m, "Mod", state->Mod_type) < 0) { + return -1; + } + Py_INCREF(state->Mod_type); + if (PyModule_AddObject(m, "Pow", state->Pow_type) < 0) { + return -1; + } + Py_INCREF(state->Pow_type); + if (PyModule_AddObject(m, "LShift", state->LShift_type) < 0) { + return -1; + } + Py_INCREF(state->LShift_type); + if (PyModule_AddObject(m, "RShift", state->RShift_type) < 0) { + return -1; + } + Py_INCREF(state->RShift_type); + if (PyModule_AddObject(m, "BitOr", state->BitOr_type) < 0) { + return -1; + } + Py_INCREF(state->BitOr_type); + if (PyModule_AddObject(m, "BitXor", state->BitXor_type) < 0) { + return -1; + } + Py_INCREF(state->BitXor_type); + if (PyModule_AddObject(m, "BitAnd", state->BitAnd_type) < 0) { + return -1; + } + Py_INCREF(state->BitAnd_type); + if (PyModule_AddObject(m, "FloorDiv", state->FloorDiv_type) < 0) { + return -1; + } + Py_INCREF(state->FloorDiv_type); + if (PyModule_AddObject(m, "unaryop", state->unaryop_type) < 0) { + return -1; + } + Py_INCREF(state->unaryop_type); + if (PyModule_AddObject(m, "Invert", state->Invert_type) < 0) { + return -1; + } + Py_INCREF(state->Invert_type); + if (PyModule_AddObject(m, "Not", state->Not_type) < 0) { + return -1; + } + Py_INCREF(state->Not_type); + if (PyModule_AddObject(m, "UAdd", state->UAdd_type) < 0) { + return -1; + } + Py_INCREF(state->UAdd_type); + if (PyModule_AddObject(m, "USub", state->USub_type) < 0) { + return -1; + } + Py_INCREF(state->USub_type); + if (PyModule_AddObject(m, "cmpop", state->cmpop_type) < 0) { + return -1; + } + Py_INCREF(state->cmpop_type); + if (PyModule_AddObject(m, "Eq", state->Eq_type) < 0) { + return -1; + } + Py_INCREF(state->Eq_type); + if (PyModule_AddObject(m, "NotEq", state->NotEq_type) < 0) { + return -1; + } + Py_INCREF(state->NotEq_type); + if (PyModule_AddObject(m, "Lt", state->Lt_type) < 0) { + return -1; + } + Py_INCREF(state->Lt_type); + if (PyModule_AddObject(m, "LtE", state->LtE_type) < 0) { + return -1; + } + Py_INCREF(state->LtE_type); + if (PyModule_AddObject(m, "Gt", state->Gt_type) < 0) { + return -1; + } + Py_INCREF(state->Gt_type); + if (PyModule_AddObject(m, "GtE", state->GtE_type) < 0) { + return -1; + } + Py_INCREF(state->GtE_type); + if (PyModule_AddObject(m, "Is", state->Is_type) < 0) { + return -1; + } + Py_INCREF(state->Is_type); + if (PyModule_AddObject(m, "IsNot", state->IsNot_type) < 0) { + return -1; + } + Py_INCREF(state->IsNot_type); + if (PyModule_AddObject(m, "In", state->In_type) < 0) { + return -1; + } + Py_INCREF(state->In_type); + if (PyModule_AddObject(m, "NotIn", state->NotIn_type) < 0) { + return -1; + } + Py_INCREF(state->NotIn_type); + if (PyModule_AddObject(m, "comprehension", state->comprehension_type) < 0) { + return -1; + } + Py_INCREF(state->comprehension_type); + if (PyModule_AddObject(m, "excepthandler", state->excepthandler_type) < 0) { + return -1; + } + Py_INCREF(state->excepthandler_type); + if (PyModule_AddObject(m, "ExceptHandler", state->ExceptHandler_type) < 0) { + return -1; + } + Py_INCREF(state->ExceptHandler_type); + if (PyModule_AddObject(m, "arguments", state->arguments_type) < 0) { + return -1; + } + Py_INCREF(state->arguments_type); + if (PyModule_AddObject(m, "arg", state->arg_type) < 0) { + return -1; + } + Py_INCREF(state->arg_type); + if (PyModule_AddObject(m, "keyword", state->keyword_type) < 0) { + return -1; + } + Py_INCREF(state->keyword_type); + if (PyModule_AddObject(m, "alias", state->alias_type) < 0) { + return -1; + } + Py_INCREF(state->alias_type); + if (PyModule_AddObject(m, "withitem", state->withitem_type) < 0) { + return -1; + } + Py_INCREF(state->withitem_type); + if (PyModule_AddObject(m, "type_ignore", state->type_ignore_type) < 0) { + return -1; + } + Py_INCREF(state->type_ignore_type); + if (PyModule_AddObject(m, "TypeIgnore", state->TypeIgnore_type) < 0) { + return -1; + } + Py_INCREF(state->TypeIgnore_type); + return 0; +} + +static PyModuleDef_Slot astmodule_slots[] = { + {Py_mod_exec, astmodule_exec}, + {0, NULL} +}; + static struct PyModuleDef _astmodule = { - PyModuleDef_HEAD_INIT, "_ast" + PyModuleDef_HEAD_INIT, + .m_name = "_ast", + // The _ast module uses a global state (global_ast_state). + .m_size = 0, + .m_slots = astmodule_slots, }; + PyMODINIT_FUNC PyInit__ast(void) { - PyObject *m, *d; - if (!init_types()) return NULL; - m = PyModule_Create(&_astmodule); - if (!m) return NULL; - d = PyModule_GetDict(m); - if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL; - if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0) - return NULL; - if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0) - return NULL; - if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0) - return NULL; - if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Interactive", (PyObject*)Interactive_type) < - 0) return NULL; - if (PyDict_SetItemString(d, "Expression", (PyObject*)Expression_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "FunctionType", (PyObject*)FunctionType_type) < - 0) return NULL; - if (PyDict_SetItemString(d, "Suite", (PyObject*)Suite_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "stmt", (PyObject*)stmt_type) < 0) return NULL; - if (PyDict_SetItemString(d, "FunctionDef", (PyObject*)FunctionDef_type) < - 0) return NULL; - if (PyDict_SetItemString(d, "AsyncFunctionDef", - (PyObject*)AsyncFunctionDef_type) < 0) return NULL; - if (PyDict_SetItemString(d, "ClassDef", (PyObject*)ClassDef_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Return", (PyObject*)Return_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Delete", (PyObject*)Delete_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Assign", (PyObject*)Assign_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "AugAssign", (PyObject*)AugAssign_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "AnnAssign", (PyObject*)AnnAssign_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "For", (PyObject*)For_type) < 0) return NULL; - if (PyDict_SetItemString(d, "AsyncFor", (PyObject*)AsyncFor_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "While", (PyObject*)While_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "If", (PyObject*)If_type) < 0) return NULL; - if (PyDict_SetItemString(d, "With", (PyObject*)With_type) < 0) return NULL; - if (PyDict_SetItemString(d, "AsyncWith", (PyObject*)AsyncWith_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Raise", (PyObject*)Raise_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Try", (PyObject*)Try_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Assert", (PyObject*)Assert_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Import", (PyObject*)Import_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "ImportFrom", (PyObject*)ImportFrom_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Global", (PyObject*)Global_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Nonlocal", (PyObject*)Nonlocal_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Expr", (PyObject*)Expr_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Pass", (PyObject*)Pass_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Break", (PyObject*)Break_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Continue", (PyObject*)Continue_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "expr", (PyObject*)expr_type) < 0) return NULL; - if (PyDict_SetItemString(d, "BoolOp", (PyObject*)BoolOp_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "NamedExpr", (PyObject*)NamedExpr_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "BinOp", (PyObject*)BinOp_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "UnaryOp", (PyObject*)UnaryOp_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Lambda", (PyObject*)Lambda_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "IfExp", (PyObject*)IfExp_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Dict", (PyObject*)Dict_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Set", (PyObject*)Set_type) < 0) return NULL; - if (PyDict_SetItemString(d, "ListComp", (PyObject*)ListComp_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "SetComp", (PyObject*)SetComp_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "DictComp", (PyObject*)DictComp_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "GeneratorExp", (PyObject*)GeneratorExp_type) < - 0) return NULL; - if (PyDict_SetItemString(d, "Await", (PyObject*)Await_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Yield", (PyObject*)Yield_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "YieldFrom", (PyObject*)YieldFrom_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Compare", (PyObject*)Compare_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Call", (PyObject*)Call_type) < 0) return NULL; - if (PyDict_SetItemString(d, "FormattedValue", - (PyObject*)FormattedValue_type) < 0) return NULL; - if (PyDict_SetItemString(d, "JoinedStr", (PyObject*)JoinedStr_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Constant", (PyObject*)Constant_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Attribute", (PyObject*)Attribute_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Subscript", (PyObject*)Subscript_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Starred", (PyObject*)Starred_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Name", (PyObject*)Name_type) < 0) return NULL; - if (PyDict_SetItemString(d, "List", (PyObject*)List_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Tuple", (PyObject*)Tuple_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "expr_context", (PyObject*)expr_context_type) < - 0) return NULL; - if (PyDict_SetItemString(d, "Load", (PyObject*)Load_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Store", (PyObject*)Store_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Del", (PyObject*)Del_type) < 0) return NULL; - if (PyDict_SetItemString(d, "AugLoad", (PyObject*)AugLoad_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "AugStore", (PyObject*)AugStore_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Param", (PyObject*)Param_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "slice", (PyObject*)slice_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Slice", (PyObject*)Slice_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "ExtSlice", (PyObject*)ExtSlice_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Index", (PyObject*)Index_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "boolop", (PyObject*)boolop_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "And", (PyObject*)And_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Or", (PyObject*)Or_type) < 0) return NULL; - if (PyDict_SetItemString(d, "operator", (PyObject*)operator_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "Add", (PyObject*)Add_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Sub", (PyObject*)Sub_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Mult", (PyObject*)Mult_type) < 0) return NULL; - if (PyDict_SetItemString(d, "MatMult", (PyObject*)MatMult_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Div", (PyObject*)Div_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Mod", (PyObject*)Mod_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Pow", (PyObject*)Pow_type) < 0) return NULL; - if (PyDict_SetItemString(d, "LShift", (PyObject*)LShift_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "RShift", (PyObject*)RShift_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "BitOr", (PyObject*)BitOr_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "BitXor", (PyObject*)BitXor_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "BitAnd", (PyObject*)BitAnd_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "FloorDiv", (PyObject*)FloorDiv_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "unaryop", (PyObject*)unaryop_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Invert", (PyObject*)Invert_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Not", (PyObject*)Not_type) < 0) return NULL; - if (PyDict_SetItemString(d, "UAdd", (PyObject*)UAdd_type) < 0) return NULL; - if (PyDict_SetItemString(d, "USub", (PyObject*)USub_type) < 0) return NULL; - if (PyDict_SetItemString(d, "cmpop", (PyObject*)cmpop_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Eq", (PyObject*)Eq_type) < 0) return NULL; - if (PyDict_SetItemString(d, "NotEq", (PyObject*)NotEq_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "Lt", (PyObject*)Lt_type) < 0) return NULL; - if (PyDict_SetItemString(d, "LtE", (PyObject*)LtE_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Gt", (PyObject*)Gt_type) < 0) return NULL; - if (PyDict_SetItemString(d, "GtE", (PyObject*)GtE_type) < 0) return NULL; - if (PyDict_SetItemString(d, "Is", (PyObject*)Is_type) < 0) return NULL; - if (PyDict_SetItemString(d, "IsNot", (PyObject*)IsNot_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "In", (PyObject*)In_type) < 0) return NULL; - if (PyDict_SetItemString(d, "NotIn", (PyObject*)NotIn_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "comprehension", (PyObject*)comprehension_type) - < 0) return NULL; - if (PyDict_SetItemString(d, "excepthandler", (PyObject*)excepthandler_type) - < 0) return NULL; - if (PyDict_SetItemString(d, "ExceptHandler", (PyObject*)ExceptHandler_type) - < 0) return NULL; - if (PyDict_SetItemString(d, "arguments", (PyObject*)arguments_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "arg", (PyObject*)arg_type) < 0) return NULL; - if (PyDict_SetItemString(d, "keyword", (PyObject*)keyword_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "alias", (PyObject*)alias_type) < 0) return - NULL; - if (PyDict_SetItemString(d, "withitem", (PyObject*)withitem_type) < 0) - return NULL; - if (PyDict_SetItemString(d, "type_ignore", (PyObject*)type_ignore_type) < - 0) return NULL; - if (PyDict_SetItemString(d, "TypeIgnore", (PyObject*)TypeIgnore_type) < 0) - return NULL; - return m; + return PyModuleDef_Init(&_astmodule); } PyObject* PyAST_mod2obj(mod_ty t) { - if (!init_types()) + astmodulestate *state = get_global_ast_state(); + if (state == NULL) { return NULL; - return ast2obj_mod(t); + } + return ast2obj_mod(state, t); } /* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode) { - PyObject *req_type[3]; - char *req_name[] = {"Module", "Expression", "Interactive"}; + const char * const 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; + astmodulestate *state = get_global_ast_state(); + PyObject *req_type[3]; + req_type[0] = state->Module_type; + req_type[1] = state->Expression_type; + req_type[2] = state->Interactive_type; assert(0 <= mode && mode <= 2); - if (!init_types()) - return NULL; - isinstance = PyObject_IsInstance(ast, req_type[mode]); if (isinstance == -1) return NULL; if (!isinstance) { PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s", - req_name[mode], Py_TYPE(ast)->tp_name); + req_name[mode], _PyType_Name(Py_TYPE(ast))); return NULL; } mod_ty res = NULL; - if (obj2ast_mod(ast, &res, arena) != 0) + if (obj2ast_mod(state, ast, &res, arena) != 0) return NULL; else return res; @@ -9047,9 +10144,11 @@ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode) int PyAST_Check(PyObject* obj) { - if (!init_types()) + astmodulestate *state = get_global_ast_state(); + if (state == NULL) { return -1; - return PyObject_IsInstance(obj, (PyObject*)&AST_type); + } + return PyObject_IsInstance(obj, state->AST_type); } diff --git a/Python/_warnings.c b/Python/_warnings.c index 52a13dfc62ccca8c0b19dc27bce7ff53714eb55d..91a78fe72b3bc504765ca7e2ae006615e6ff0efe 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -1,6 +1,9 @@ #include "Python.h" -#include "pycore_pystate.h" -#include "frameobject.h" +#include "pycore_initconfig.h" +#include "pycore_interp.h" // PyInterpreterState.warnings +#include "pycore_pyerrors.h" +#include "pycore_pystate.h" // _PyThreadState_GET() +#include "frameobject.h" // PyFrame_GetBack() #include "clinic/_warnings.c.h" #define MODULE_NAME "_warnings" @@ -23,14 +26,17 @@ typedef struct _warnings_runtime_state WarningsState; /* Forward declaration of the _warnings module definition. */ static struct PyModuleDef warningsmodule; +_Py_IDENTIFIER(__name__); + /* Given a module object, get its per-module state. */ static WarningsState * -_Warnings_GetState() +warnings_get_state(void) { - PyThreadState *tstate = PyThreadState_GET(); + PyThreadState *tstate = _PyThreadState_GET(); if (tstate == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "_Warnings_GetState: could not identify current interpreter"); + _PyErr_SetString(tstate, PyExc_RuntimeError, + "warnings_get_state: could not identify " + "current interpreter"); return NULL; } return &tstate->interp->warnings; @@ -38,7 +44,7 @@ _Warnings_GetState() /* Clear the given warnings module state. */ static void -_Warnings_ClearState(WarningsState *st) +warnings_clear_state(WarningsState *st) { Py_CLEAR(st->filters); Py_CLEAR(st->once_registry); @@ -63,11 +69,14 @@ create_filter(PyObject *category, _Py_Identifier *id, const char *modname) } } else { modname_obj = Py_None; + Py_INCREF(modname_obj); } /* This assumes the line number is zero for now. */ - return PyTuple_Pack(5, action_str, Py_None, - category, modname_obj, _PyLong_Zero); + PyObject *filter = PyTuple_Pack(5, action_str, Py_None, + category, modname_obj, _PyLong_Zero); + Py_DECREF(modname_obj); + return filter; } #endif @@ -108,7 +117,7 @@ init_filters(void) /* Initialize the given warnings module state. */ static int -_Warnings_InitState(WarningsState *st) +warnings_init_state(WarningsState *st) { if (st->filters == NULL) { st->filters = init_filters(); @@ -136,7 +145,7 @@ _Warnings_InitState(WarningsState *st) return 0; error: - _Warnings_ClearState(st); + warnings_clear_state(st); return -1; } @@ -164,7 +173,7 @@ check_matched(PyObject *obj, PyObject *arg) } /* Otherwise assume a regex filter and call its match() method */ - result = _PyObject_CallMethodIdObjArgs(obj, &PyId_match, arg, NULL); + result = _PyObject_CallMethodIdOneArg(obj, &PyId_match, arg); if (result == NULL) return -1; @@ -206,7 +215,7 @@ get_warnings_attr(_Py_Identifier *attr_id, int try_import) gone, then we can't even use PyImport_GetModule without triggering an interpreter abort. */ - if (!_PyInterpreterState_GET_UNSAFE()->modules) { + if (!_PyInterpreterState_GET()->modules) { return NULL; } warnings_module = PyImport_GetModule(warnings_str); @@ -282,7 +291,7 @@ get_filter(PyObject *category, PyObject *text, Py_ssize_t lineno, Py_ssize_t i; PyObject *warnings_filters; _Py_IDENTIFIER(filters); - WarningsState *st = _Warnings_GetState(); + WarningsState *st = warnings_get_state(); if (st == NULL) { return NULL; } @@ -384,7 +393,7 @@ already_warned(PyObject *registry, PyObject *key, int should_set) if (key == NULL) return -1; - WarningsState *st = _Warnings_GetState(); + WarningsState *st = warnings_get_state(); if (st == NULL) { return -1; } @@ -430,7 +439,7 @@ normalize_module(PyObject *filename) { PyObject *module; int kind; - void *data; + const void *data; Py_ssize_t len; len = PyUnicode_GetLength(filename); @@ -482,13 +491,13 @@ show_warning(PyObject *filename, int lineno, PyObject *text, PyObject *f_stderr; PyObject *name; char lineno_str[128]; - _Py_IDENTIFIER(__name__); PyOS_snprintf(lineno_str, sizeof(lineno_str), ":%d: ", lineno); name = _PyObject_GetAttrId(category, &PyId___name__); - if (name == NULL) /* XXX Can an object lack a '__name__' attribute? */ + if (name == NULL) { goto error; + } f_stderr = _PySys_GetObjectId(&PyId_stderr); if (f_stderr == NULL) { @@ -514,7 +523,7 @@ show_warning(PyObject *filename, int lineno, PyObject *text, /* Print " source_line\n" */ if (sourceline) { int kind; - void *data; + const void *data; Py_ssize_t i, len; Py_UCS4 ch; PyObject *truncated; @@ -590,7 +599,7 @@ call_show_warning(PyObject *category, PyObject *text, PyObject *message, if (msg == NULL) goto error; - res = PyObject_CallFunctionObjArgs(show_fn, msg, NULL); + res = PyObject_CallOneArg(show_fn, msg); Py_DECREF(show_fn); Py_DECREF(msg); @@ -647,11 +656,11 @@ warn_explicit(PyObject *category, PyObject *message, text = PyObject_Str(message); if (text == NULL) goto cleanup; - category = (PyObject*)message->ob_type; + category = (PyObject*)Py_TYPE(message); } else { text = message; - message = PyObject_CallFunctionObjArgs(category, message, NULL); + message = PyObject_CallOneArg(category, message); if (message == NULL) goto cleanup; } @@ -703,7 +712,7 @@ warn_explicit(PyObject *category, PyObject *message, if (_PyUnicode_EqualToASCIIString(action, "once")) { if (registry == NULL || registry == Py_None) { - WarningsState *st = _Warnings_GetState(); + WarningsState *st = warnings_get_state(); if (st == NULL) { goto cleanup; } @@ -756,7 +765,6 @@ is_internal_frame(PyFrameObject *frame) { static PyObject *importlib_string = NULL; static PyObject *bootstrap_string = NULL; - PyObject *filename; int contains; if (importlib_string == NULL) { @@ -774,14 +782,21 @@ is_internal_frame(PyFrameObject *frame) Py_INCREF(bootstrap_string); } - if (frame == NULL || frame->f_code == NULL || - frame->f_code->co_filename == NULL) { + if (frame == NULL) { + return 0; + } + + PyCodeObject *code = PyFrame_GetCode(frame); + PyObject *filename = code->co_filename; + Py_DECREF(code); + + if (filename == NULL) { return 0; } - filename = frame->f_code->co_filename; if (!PyUnicode_Check(filename)) { return 0; } + contains = PyUnicode_Contains(filename, importlib_string); if (contains < 0) { return 0; @@ -803,7 +818,9 @@ static PyFrameObject * next_external_frame(PyFrameObject *frame) { do { - frame = frame->f_back; + PyFrameObject *back = PyFrame_GetBack(frame); + Py_DECREF(frame); + frame = back; } while (frame != NULL && is_internal_frame(frame)); return frame; @@ -816,16 +833,18 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno, PyObject **module, PyObject **registry) { _Py_IDENTIFIER(__warningregistry__); - _Py_IDENTIFIER(__name__); PyObject *globals; /* Setup globals, filename and lineno. */ - PyFrameObject *f = _PyThreadState_GET()->frame; + PyThreadState *tstate = _PyThreadState_GET(); + PyFrameObject *f = PyThreadState_GetFrame(tstate); // Stack level comparisons to Python code is off by one as there is no // warnings-related stack level to avoid. if (stack_level <= 0 || is_internal_frame(f)) { while (--stack_level > 0 && f != NULL) { - f = f->f_back; + PyFrameObject *back = PyFrame_GetBack(f); + Py_DECREF(f); + f = back; } } else { @@ -835,15 +854,18 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno, } if (f == NULL) { - globals = _PyInterpreterState_GET_UNSAFE()->sysdict; + globals = _PyInterpreterState_GET()->sysdict; *filename = PyUnicode_FromString("sys"); *lineno = 1; } else { globals = f->f_globals; - *filename = f->f_code->co_filename; + PyCodeObject *code = PyFrame_GetCode(f); + *filename = code->co_filename; + Py_DECREF(code); Py_INCREF(*filename); *lineno = PyFrame_GetLineNumber(f); + Py_DECREF(f); } *module = NULL; @@ -855,7 +877,7 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno, if (*registry == NULL) { int rc; - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { goto handle_error; } *registry = PyDict_New(); @@ -874,7 +896,7 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno, if (*module == Py_None || (*module != NULL && PyUnicode_Check(*module))) { Py_INCREF(*module); } - else if (PyErr_Occurred()) { + else if (_PyErr_Occurred(tstate)) { goto handle_error; } else { @@ -903,7 +925,7 @@ get_category(PyObject *message, PyObject *category) return NULL; if (rc == 1) - category = (PyObject*)message->ob_type; + category = (PyObject*)Py_TYPE(message); else if (category == NULL || category == Py_None) category = PyExc_UserWarning; @@ -966,7 +988,6 @@ get_source_line(PyObject *module_globals, int lineno) { _Py_IDENTIFIER(get_source); _Py_IDENTIFIER(__loader__); - _Py_IDENTIFIER(__name__); PyObject *loader; PyObject *module_name; PyObject *get_source; @@ -995,7 +1016,7 @@ get_source_line(PyObject *module_globals, int lineno) return NULL; } /* Call get_source() to get the source code. */ - source = PyObject_CallFunctionObjArgs(get_source, module_name, NULL); + source = PyObject_CallOneArg(get_source, module_name); Py_DECREF(get_source); Py_DECREF(module_name); if (!source) { @@ -1064,7 +1085,7 @@ warnings_warn_explicit(PyObject *self, PyObject *args, PyObject *kwds) static PyObject * warnings_filters_mutated(PyObject *self, PyObject *args) { - WarningsState *st = _Warnings_GetState(); + WarningsState *st = warnings_get_state(); if (st == NULL) { return NULL; } @@ -1126,6 +1147,23 @@ PyErr_WarnFormat(PyObject *category, Py_ssize_t stack_level, return res; } +static int +_PyErr_WarnFormat(PyObject *source, PyObject *category, Py_ssize_t stack_level, + const char *format, ...) +{ + int res; + va_list vargs; + +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, format); +#else + va_start(vargs); +#endif + res = _PyErr_WarnFormatV(source, category, stack_level, format, vargs); + va_end(vargs); + return res; +} + int PyErr_ResourceWarning(PyObject *source, Py_ssize_t stack_level, const char *format, ...) @@ -1282,7 +1320,7 @@ _PyErr_WarnUnawaitedCoroutine(PyObject *coro) int warned = 0; PyObject *fn = get_warnings_attr(&PyId__warn_unawaited_coroutine, 1); if (fn) { - PyObject *res = PyObject_CallFunctionObjArgs(fn, coro, NULL); + PyObject *res = PyObject_CallOneArg(fn, coro); Py_DECREF(fn); if (res || PyErr_ExceptionMatches(PyExc_RuntimeWarning)) { warned = 1; @@ -1294,9 +1332,9 @@ _PyErr_WarnUnawaitedCoroutine(PyObject *coro) PyErr_WriteUnraisable(coro); } if (!warned) { - if (PyErr_WarnFormat(PyExc_RuntimeWarning, 1, - "coroutine '%.50S' was never awaited", - ((PyCoroObject *)coro)->cr_qualname) < 0) + if (_PyErr_WarnFormat(coro, PyExc_RuntimeWarning, 1, + "coroutine '%S' was never awaited", + ((PyCoroObject *)coro)->cr_qualname) < 0) { PyErr_WriteUnraisable(coro); } @@ -1331,6 +1369,16 @@ static struct PyModuleDef warningsmodule = { }; +PyStatus +_PyWarnings_InitState(PyThreadState *tstate) +{ + if (warnings_init_state(&tstate->interp->warnings) < 0) { + return _PyStatus_ERR("can't initialize warnings"); + } + return _PyStatus_OK(); +} + + PyMODINIT_FUNC _PyWarnings_Init(void) { @@ -1341,11 +1389,11 @@ _PyWarnings_Init(void) return NULL; } - WarningsState *st = _Warnings_GetState(); + WarningsState *st = warnings_get_state(); if (st == NULL) { goto error; } - if (_Warnings_InitState(st) < 0) { + if (warnings_init_state(st) < 0) { goto error; } @@ -1368,7 +1416,7 @@ _PyWarnings_Init(void) error: if (st != NULL) { - _Warnings_ClearState(st); + warnings_clear_state(st); } Py_DECREF(m); return NULL; @@ -1378,5 +1426,5 @@ _PyWarnings_Init(void) void _PyWarnings_Fini(PyInterpreterState *interp) { - _Warnings_ClearState(&interp->warnings); + warnings_clear_state(&interp->warnings); } diff --git a/Python/ast.c b/Python/ast.c index 7c1d24dea7184fac9619e3f41c1adf171bbdcc66..c7ba4d9c544c8c41e5f86aed40c37a6695fb1ea3 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -58,31 +58,6 @@ validate_comprehension(asdl_seq *gens) return 1; } -static int -validate_slice(slice_ty slice) -{ - switch (slice->kind) { - case Slice_kind: - return (!slice->v.Slice.lower || validate_expr(slice->v.Slice.lower, Load)) && - (!slice->v.Slice.upper || validate_expr(slice->v.Slice.upper, Load)) && - (!slice->v.Slice.step || validate_expr(slice->v.Slice.step, Load)); - case ExtSlice_kind: { - Py_ssize_t i; - if (!validate_nonempty_seq(slice->v.ExtSlice.dims, "dims", "ExtSlice")) - return 0; - for (i = 0; i < asdl_seq_LEN(slice->v.ExtSlice.dims); i++) - if (!validate_slice(asdl_seq_GET(slice->v.ExtSlice.dims, i))) - return 0; - return 1; - } - case Index_kind: - return validate_expr(slice->v.Index.value, Load); - default: - PyErr_SetString(PyExc_SystemError, "unknown slice node"); - return 0; - } -} - static int validate_keywords(asdl_seq *keywords) { @@ -115,12 +90,6 @@ expr_context_name(expr_context_ty ctx) return "Store"; case Del: return "Del"; - case AugLoad: - return "AugLoad"; - case AugStore: - return "AugStore"; - case Param: - return "Param"; default: Py_UNREACHABLE(); } @@ -197,6 +166,11 @@ validate_constant(PyObject *value) return 1; } + if (!PyErr_Occurred()) { + PyErr_Format(PyExc_TypeError, + "got an invalid type in Constant: %s", + _PyType_Name(Py_TYPE(value))); + } return 0; } @@ -314,9 +288,6 @@ validate_expr(expr_ty exp, expr_context_ty ctx) validate_keywords(exp->v.Call.keywords); case Constant_kind: if (!validate_constant(exp->v.Constant.value)) { - PyErr_Format(PyExc_TypeError, - "got an invalid type in Constant: %s", - Py_TYPE(exp->v.Constant.value)->tp_name); return 0; } return 1; @@ -331,10 +302,14 @@ validate_expr(expr_ty exp, expr_context_ty ctx) case Attribute_kind: return validate_expr(exp->v.Attribute.value, Load); case Subscript_kind: - return validate_slice(exp->v.Subscript.slice) && + return validate_expr(exp->v.Subscript.slice, Load) && validate_expr(exp->v.Subscript.value, Load); case Starred_kind: return validate_expr(exp->v.Starred.value, ctx); + case Slice_kind: + return (!exp->v.Slice.lower || validate_expr(exp->v.Slice.lower, Load)) && + (!exp->v.Slice.upper || validate_expr(exp->v.Slice.upper, Load)) && + (!exp->v.Slice.step || validate_expr(exp->v.Slice.step, Load)); case List_kind: return validate_exprs(exp->v.List.elts, ctx, 0); case Tuple_kind: @@ -567,9 +542,6 @@ PyAST_Validate(mod_ty mod) case Expression_kind: res = validate_expr(mod->v.Expression.body, Load); break; - case Suite_kind: - PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler"); - break; default: PyErr_SetString(PyExc_SystemError, "impossible module node"); res = 0; @@ -640,12 +612,11 @@ new_identifier(const char *n, struct compiling *c) identifier; if so, normalize to NFKC. */ if (!PyUnicode_IS_ASCII(id)) { PyObject *id2; - _Py_IDENTIFIER(NFKC); if (!c->c_normalize && !init_normalization(c)) { Py_DECREF(id); return NULL; } - PyObject *form = _PyUnicode_FromId(&PyId_NFKC); + PyObject *form = PyUnicode_InternFromString("NFKC"); if (form == NULL) { Py_DECREF(id); return NULL; @@ -653,13 +624,14 @@ new_identifier(const char *n, struct compiling *c) PyObject *args[2] = {form, id}; id2 = _PyObject_FastCall(c->c_normalize, args, 2); Py_DECREF(id); + Py_DECREF(form); if (!id2) return NULL; if (!PyUnicode_Check(id2)) { PyErr_Format(PyExc_TypeError, "unicodedata.normalize() must return a string, not " "%.200s", - Py_TYPE(id2)->tp_name); + _PyType_Name(Py_TYPE(id2))); Py_DECREF(id2); return NULL; } @@ -777,11 +749,8 @@ num_stmts(const node *n) return l; } default: { - char buf[128]; - - sprintf(buf, "Non-statement found: %d %d", - TYPE(n), NCH(n)); - Py_FatalError(buf); + _Py_FatalErrorFormat(__func__, "Non-statement found: %d %d", + TYPE(n), NCH(n)); } } Py_UNREACHABLE(); @@ -1148,14 +1117,7 @@ set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n) { asdl_seq *s = NULL; - /* The ast defines augmented store and load contexts, but the - implementation here doesn't actually use them. The code may be - a little more complex than necessary as a result. It also means - that expressions in an augmented assignment have a Store context. - Consider restructuring so that augmented assignment uses - set_context(), too. - */ - assert(ctx != AugStore && ctx != AugLoad); + /* Expressions in an augmented assignment have a Store context. */ switch (e->kind) { case Attribute_kind: @@ -1714,80 +1676,16 @@ ast_for_arguments(struct compiling *c, const node *n) return arguments(posonlyargs, posargs, vararg, kwonlyargs, kwdefaults, kwarg, posdefaults, c->c_arena); } -static expr_ty -ast_for_dotted_name(struct compiling *c, const node *n) -{ - expr_ty e; - identifier id; - int lineno, col_offset; - int i; - node *ch; - - REQ(n, dotted_name); - - lineno = LINENO(n); - col_offset = n->n_col_offset; - - ch = CHILD(n, 0); - id = NEW_IDENTIFIER(ch); - if (!id) - return NULL; - e = Name(id, Load, lineno, col_offset, - ch->n_end_lineno, ch->n_end_col_offset, c->c_arena); - if (!e) - return NULL; - - for (i = 2; i < NCH(n); i+=2) { - const node *child = CHILD(n, i); - id = NEW_IDENTIFIER(child); - if (!id) - return NULL; - e = Attribute(e, id, Load, lineno, col_offset, - child->n_end_lineno, child->n_end_col_offset, c->c_arena); - if (!e) - return NULL; - } - - return e; -} - static expr_ty ast_for_decorator(struct compiling *c, const node *n) { - /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */ - expr_ty d = NULL; - expr_ty name_expr; + /* decorator: '@' namedexpr_test NEWLINE */ REQ(n, decorator); REQ(CHILD(n, 0), AT); - REQ(RCHILD(n, -1), NEWLINE); - - name_expr = ast_for_dotted_name(c, CHILD(n, 1)); - if (!name_expr) - return NULL; - - if (NCH(n) == 3) { /* No arguments */ - d = name_expr; - name_expr = NULL; - } - else if (NCH(n) == 5) { /* Call with no arguments */ - d = Call(name_expr, NULL, NULL, - name_expr->lineno, name_expr->col_offset, - CHILD(n, 3)->n_end_lineno, CHILD(n, 3)->n_end_col_offset, - c->c_arena); - if (!d) - return NULL; - name_expr = NULL; - } - else { - d = ast_for_call(c, CHILD(n, 3), name_expr, - CHILD(n, 1), CHILD(n, 2), CHILD(n, 4)); - if (!d) - return NULL; - name_expr = NULL; - } + REQ(CHILD(n, 2), NEWLINE); - return d; + return ast_for_expr(c, CHILD(n, 1)); } static asdl_seq* @@ -2561,7 +2459,7 @@ ast_for_atom(struct compiling *c, const node *n) } } -static slice_ty +static expr_ty ast_for_slice(struct compiling *c, const node *n) { node *ch; @@ -2575,13 +2473,7 @@ ast_for_slice(struct compiling *c, const node *n) */ ch = CHILD(n, 0); if (NCH(n) == 1 && TYPE(ch) == test) { - /* 'step' variable hold no significance in terms of being used over - other vars */ - step = ast_for_expr(c, ch); - if (!step) - return NULL; - - return Index(step, c->c_arena); + return ast_for_expr(c, ch); } if (TYPE(ch) == test) { @@ -2623,7 +2515,8 @@ ast_for_slice(struct compiling *c, const node *n) } } - return Slice(lower, upper, step, c->c_arena); + return Slice(lower, upper, step, LINENO(n), n->n_col_offset, + n->n_end_lineno, n->n_end_col_offset, c->c_arena); } static expr_ty @@ -2711,7 +2604,7 @@ ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr, const nod REQ(CHILD(n, 2), RSQB); n = CHILD(n, 1); if (NCH(n) == 1) { - slice_ty slc = ast_for_slice(c, CHILD(n, 0)); + expr_ty slc = ast_for_slice(c, CHILD(n, 0)); if (!slc) return NULL; return Subscript(left_expr, slc, Load, LINENO(start), start->n_col_offset, @@ -2719,47 +2612,27 @@ ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr, const nod c->c_arena); } else { - /* The grammar is ambiguous here. The ambiguity is resolved - by treating the sequence as a tuple literal if there are - no slice features. - */ - Py_ssize_t j; - slice_ty slc; - expr_ty e; - int simple = 1; - asdl_seq *slices, *elts; - slices = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); - if (!slices) + int j; + expr_ty slc, e; + asdl_seq *elts; + elts = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena); + if (!elts) return NULL; for (j = 0; j < NCH(n); j += 2) { slc = ast_for_slice(c, CHILD(n, j)); if (!slc) return NULL; - if (slc->kind != Index_kind) - simple = 0; - asdl_seq_SET(slices, j / 2, slc); - } - if (!simple) { - return Subscript(left_expr, ExtSlice(slices, c->c_arena), - Load, LINENO(start), start->n_col_offset, - n_copy->n_end_lineno, n_copy->n_end_col_offset, c->c_arena); - } - /* extract Index values and put them in a Tuple */ - elts = _Py_asdl_seq_new(asdl_seq_LEN(slices), c->c_arena); - if (!elts) - return NULL; - for (j = 0; j < asdl_seq_LEN(slices); ++j) { - slc = (slice_ty)asdl_seq_GET(slices, j); - assert(slc->kind == Index_kind && slc->v.Index.value); - asdl_seq_SET(elts, j, slc->v.Index.value); + asdl_seq_SET(elts, j / 2, slc); } e = Tuple(elts, Load, LINENO(n), n->n_col_offset, - n->n_end_lineno, n->n_end_col_offset, c->c_arena); + n->n_end_lineno, n->n_end_col_offset, + c->c_arena); if (!e) return NULL; - return Subscript(left_expr, Index(e, c->c_arena), + return Subscript(left_expr, e, Load, LINENO(start), start->n_col_offset, - n_copy->n_end_lineno, n_copy->n_end_col_offset, c->c_arena); + n_copy->n_end_lineno, n_copy->n_end_col_offset, + c->c_arena); } } } @@ -3163,7 +3036,8 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func, e = ast_for_expr(c, CHILD(ch, 1)); if (!e) return NULL; - kw = keyword(NULL, e, c->c_arena); + kw = keyword(NULL, e, chch->n_lineno, chch->n_col_offset, + e->end_lineno, e->end_col_offset, c->c_arena); asdl_seq_SET(keywords, nkeywords++, kw); ndoublestars++; } @@ -3197,8 +3071,7 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func, else { /* a keyword argument */ keyword_ty kw; - identifier key, tmp; - int k; + identifier key; // To remain LL(1), the grammar accepts any test (basically, any // expression) in the keyword slot of a call site. So, we need @@ -3242,18 +3115,12 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func, if (forbidden_name(c, key, chch, 1)) { return NULL; } - for (k = 0; k < nkeywords; k++) { - tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg; - if (tmp && !PyUnicode_Compare(tmp, key)) { - ast_error(c, chch, - "keyword argument repeated"); - return NULL; - } - } e = ast_for_expr(c, CHILD(ch, 2)); if (!e) return NULL; - kw = keyword(key, e, c->c_arena); + kw = keyword(key, e, chch->n_lineno, chch->n_col_offset, + e->end_lineno, e->end_col_offset, c->c_arena); + if (!kw) return NULL; asdl_seq_SET(keywords, nkeywords++, kw); @@ -3320,10 +3187,7 @@ ast_for_expr_stmt(struct compiling *c, const node *n) expr1 = ast_for_testlist(c, ch); if (!expr1) return NULL; - if(!set_context(c, expr1, Store, ch)) - return NULL; - /* set_context checks that most expressions are not the left side. - Augmented assignments can only have a name, a subscript, or an + /* Augmented assignments can only have a name, a subscript, or an attribute on the left, though, so we have to explicitly check for those. */ switch (expr1->kind) { @@ -3332,10 +3196,16 @@ ast_for_expr_stmt(struct compiling *c, const node *n) case Subscript_kind: break; default: - ast_error(c, ch, "illegal expression for augmented assignment"); + ast_error(c, ch, "'%s' is an illegal expression for augmented assignment", + get_expr_name(expr1)); return NULL; } + /* set_context checks that most expressions are not the left side. */ + if(!set_context(c, expr1, Store, ch)) { + return NULL; + } + ch = CHILD(n, 2); if (TYPE(ch) == testlist) expr2 = ast_for_testlist(c, ch); @@ -3707,9 +3577,6 @@ alias_for_import_name(struct compiling *c, const node *n, int store) "unexpected import name: %d", TYPE(n)); return NULL; } - - PyErr_SetString(PyExc_SystemError, "unhandled import name condition"); - return NULL; } static stmt_ty @@ -4747,7 +4614,7 @@ decode_unicode_with_escapes(struct compiling *c, const node *n, const char *s, if (*s & 0x80) { /* XXX inefficient */ PyObject *w; int kind; - void *data; + const void *data; Py_ssize_t len, i; w = decode_utf8(c, &s, end); if (w == NULL) { @@ -4793,7 +4660,7 @@ decode_bytes_with_escapes(struct compiling *c, const node *n, const char *s, size_t len) { const char *first_invalid_escape; - PyObject *result = _PyBytes_DecodeEscape(s, len, NULL, 0, NULL, + PyObject *result = _PyBytes_DecodeEscape(s, len, NULL, &first_invalid_escape); if (result == NULL) return NULL; @@ -5289,7 +5156,7 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, *str += 1; /* If we're in = mode (detected by non-NULL expr_text), and have no format - spec and no explict conversion, set the conversion to 'r'. */ + spec and no explicit conversion, set the conversion to 'r'. */ if (*expr_text && format_spec == NULL && conversion == -1) { conversion = 'r'; } diff --git a/Python/ast_opt.c b/Python/ast_opt.c index f2a2c259149932e8a4c0377c4bb5d8a7a70f51f1..ff786d6f8d63ef1392652919f38260fcd2cea262 100644 --- a/Python/ast_opt.c +++ b/Python/ast_opt.c @@ -19,6 +19,7 @@ make_const(expr_ty node, PyObject *val, PyArena *arena) return 0; } node->kind = Constant_kind; + node->v.Constant.kind = NULL; node->v.Constant.value = val; return 1; } @@ -35,7 +36,7 @@ unary_not(PyObject *v) } static int -fold_unaryop(expr_ty node, PyArena *arena, int optimize) +fold_unaryop(expr_ty node, PyArena *arena, _PyASTOptimizeState *state) { expr_ty arg = node->v.UnaryOp.operand; @@ -212,7 +213,7 @@ safe_mod(PyObject *v, PyObject *w) } static int -fold_binop(expr_ty node, PyArena *arena, int optimize) +fold_binop(expr_ty node, PyArena *arena, _PyASTOptimizeState *state) { expr_ty lhs, rhs; lhs = node->v.BinOp.left; @@ -294,7 +295,7 @@ make_const_tuple(asdl_seq *elts) } static int -fold_tuple(expr_ty node, PyArena *arena, int optimize) +fold_tuple(expr_ty node, PyArena *arena, _PyASTOptimizeState *state) { PyObject *newval; @@ -306,24 +307,20 @@ fold_tuple(expr_ty node, PyArena *arena, int optimize) } static int -fold_subscr(expr_ty node, PyArena *arena, int optimize) +fold_subscr(expr_ty node, PyArena *arena, _PyASTOptimizeState *state) { PyObject *newval; expr_ty arg, idx; - slice_ty slice; arg = node->v.Subscript.value; - slice = node->v.Subscript.slice; + idx = node->v.Subscript.slice; if (node->v.Subscript.ctx != Load || arg->kind != Constant_kind || - /* TODO: handle other types of slices */ - slice->kind != Index_kind || - slice->v.Index.value->kind != Constant_kind) + idx->kind != Constant_kind) { return 1; } - idx = slice->v.Index.value; newval = PyObject_GetItem(arg->v.Constant.value, idx->v.Constant.value); return make_const(node, newval, arena); } @@ -335,7 +332,7 @@ fold_subscr(expr_ty node, PyArena *arena, int optimize) in "for" loop and comprehensions. */ static int -fold_iter(expr_ty arg, PyArena *arena, int optimize) +fold_iter(expr_ty arg, PyArena *arena, _PyASTOptimizeState *state) { PyObject *newval; if (arg->kind == List_kind) { @@ -368,7 +365,7 @@ fold_iter(expr_ty arg, PyArena *arena, int optimize) } static int -fold_compare(expr_ty node, PyArena *arena, int optimize) +fold_compare(expr_ty node, PyArena *arena, _PyASTOptimizeState *state) { asdl_int_seq *ops; asdl_seq *args; @@ -382,29 +379,28 @@ fold_compare(expr_ty node, PyArena *arena, int optimize) i = asdl_seq_LEN(ops) - 1; int op = asdl_seq_GET(ops, i); if (op == In || op == NotIn) { - if (!fold_iter((expr_ty)asdl_seq_GET(args, i), arena, optimize)) { + if (!fold_iter((expr_ty)asdl_seq_GET(args, i), arena, state)) { return 0; } } return 1; } -static int astfold_mod(mod_ty node_, PyArena *ctx_, int optimize_); -static int astfold_stmt(stmt_ty node_, PyArena *ctx_, int optimize_); -static int astfold_expr(expr_ty node_, PyArena *ctx_, int optimize_); -static int astfold_arguments(arguments_ty node_, PyArena *ctx_, int optimize_); -static int astfold_comprehension(comprehension_ty node_, PyArena *ctx_, int optimize_); -static int astfold_keyword(keyword_ty node_, PyArena *ctx_, int optimize_); -static int astfold_slice(slice_ty node_, PyArena *ctx_, int optimize_); -static int astfold_arg(arg_ty node_, PyArena *ctx_, int optimize_); -static int astfold_withitem(withitem_ty node_, PyArena *ctx_, int optimize_); -static int astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, int optimize_); +static int astfold_mod(mod_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); +static int astfold_stmt(stmt_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); +static int astfold_expr(expr_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); +static int astfold_arguments(arguments_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); +static int astfold_comprehension(comprehension_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); +static int astfold_keyword(keyword_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); +static int astfold_arg(arg_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); +static int astfold_withitem(withitem_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); +static int astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, _PyASTOptimizeState *state); #define CALL(FUNC, TYPE, ARG) \ - if (!FUNC((ARG), ctx_, optimize_)) \ + if (!FUNC((ARG), ctx_, state)) \ return 0; #define CALL_OPT(FUNC, TYPE, ARG) \ - if ((ARG) != NULL && !FUNC((ARG), ctx_, optimize_)) \ + if ((ARG) != NULL && !FUNC((ARG), ctx_, state)) \ return 0; #define CALL_SEQ(FUNC, TYPE, ARG) { \ @@ -412,7 +408,7 @@ static int astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, int opti asdl_seq *seq = (ARG); /* avoid variable capture */ \ for (i = 0; i < asdl_seq_LEN(seq); i++) { \ TYPE elt = (TYPE)asdl_seq_GET(seq, i); \ - if (elt != NULL && !FUNC(elt, ctx_, optimize_)) \ + if (elt != NULL && !FUNC(elt, ctx_, state)) \ return 0; \ } \ } @@ -422,13 +418,13 @@ static int astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, int opti asdl_int_seq *seq = (ARG); /* avoid variable capture */ \ for (i = 0; i < asdl_seq_LEN(seq); i++) { \ TYPE elt = (TYPE)asdl_seq_GET(seq, i); \ - if (!FUNC(elt, ctx_, optimize_)) \ + if (!FUNC(elt, ctx_, state)) \ return 0; \ } \ } static int -astfold_body(asdl_seq *stmts, PyArena *ctx_, int optimize_) +astfold_body(asdl_seq *stmts, PyArena *ctx_, _PyASTOptimizeState *state) { int docstring = _PyAST_GetDocString(stmts) != NULL; CALL_SEQ(astfold_stmt, stmt_ty, stmts); @@ -450,7 +446,7 @@ astfold_body(asdl_seq *stmts, PyArena *ctx_, int optimize_) } static int -astfold_mod(mod_ty node_, PyArena *ctx_, int optimize_) +astfold_mod(mod_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { switch (node_->kind) { case Module_kind: @@ -462,9 +458,6 @@ astfold_mod(mod_ty node_, PyArena *ctx_, int optimize_) case Expression_kind: CALL(astfold_expr, expr_ty, node_->v.Expression.body); break; - case Suite_kind: - CALL_SEQ(astfold_stmt, stmt_ty, node_->v.Suite.body); - break; default: break; } @@ -472,7 +465,7 @@ astfold_mod(mod_ty node_, PyArena *ctx_, int optimize_) } static int -astfold_expr(expr_ty node_, PyArena *ctx_, int optimize_) +astfold_expr(expr_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { switch (node_->kind) { case BoolOp_kind: @@ -551,12 +544,17 @@ astfold_expr(expr_ty node_, PyArena *ctx_, int optimize_) break; case Subscript_kind: CALL(astfold_expr, expr_ty, node_->v.Subscript.value); - CALL(astfold_slice, slice_ty, node_->v.Subscript.slice); + CALL(astfold_expr, expr_ty, node_->v.Subscript.slice); CALL(fold_subscr, expr_ty, node_); break; case Starred_kind: CALL(astfold_expr, expr_ty, node_->v.Starred.value); break; + case Slice_kind: + CALL_OPT(astfold_expr, expr_ty, node_->v.Slice.lower); + CALL_OPT(astfold_expr, expr_ty, node_->v.Slice.upper); + CALL_OPT(astfold_expr, expr_ty, node_->v.Slice.step); + break; case List_kind: CALL_SEQ(astfold_expr, expr_ty, node_->v.List.elts); break; @@ -565,8 +563,9 @@ astfold_expr(expr_ty node_, PyArena *ctx_, int optimize_) CALL(fold_tuple, expr_ty, node_); break; case Name_kind: - if (_PyUnicode_EqualToASCIIString(node_->v.Name.id, "__debug__")) { - return make_const(node_, PyBool_FromLong(!optimize_), ctx_); + if (node_->v.Name.ctx == Load && + _PyUnicode_EqualToASCIIString(node_->v.Name.id, "__debug__")) { + return make_const(node_, PyBool_FromLong(!state->optimize), ctx_); } break; default: @@ -576,35 +575,14 @@ astfold_expr(expr_ty node_, PyArena *ctx_, int optimize_) } static int -astfold_slice(slice_ty node_, PyArena *ctx_, int optimize_) -{ - switch (node_->kind) { - case Slice_kind: - CALL_OPT(astfold_expr, expr_ty, node_->v.Slice.lower); - CALL_OPT(astfold_expr, expr_ty, node_->v.Slice.upper); - CALL_OPT(astfold_expr, expr_ty, node_->v.Slice.step); - break; - case ExtSlice_kind: - CALL_SEQ(astfold_slice, slice_ty, node_->v.ExtSlice.dims); - break; - case Index_kind: - CALL(astfold_expr, expr_ty, node_->v.Index.value); - break; - default: - break; - } - return 1; -} - -static int -astfold_keyword(keyword_ty node_, PyArena *ctx_, int optimize_) +astfold_keyword(keyword_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { CALL(astfold_expr, expr_ty, node_->value); return 1; } static int -astfold_comprehension(comprehension_ty node_, PyArena *ctx_, int optimize_) +astfold_comprehension(comprehension_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { CALL(astfold_expr, expr_ty, node_->target); CALL(astfold_expr, expr_ty, node_->iter); @@ -615,7 +593,7 @@ astfold_comprehension(comprehension_ty node_, PyArena *ctx_, int optimize_) } static int -astfold_arguments(arguments_ty node_, PyArena *ctx_, int optimize_) +astfold_arguments(arguments_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { CALL_SEQ(astfold_arg, arg_ty, node_->posonlyargs); CALL_SEQ(astfold_arg, arg_ty, node_->args); @@ -628,27 +606,33 @@ astfold_arguments(arguments_ty node_, PyArena *ctx_, int optimize_) } static int -astfold_arg(arg_ty node_, PyArena *ctx_, int optimize_) +astfold_arg(arg_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { - CALL_OPT(astfold_expr, expr_ty, node_->annotation); + if (!(state->ff_features & CO_FUTURE_ANNOTATIONS)) { + CALL_OPT(astfold_expr, expr_ty, node_->annotation); + } return 1; } static int -astfold_stmt(stmt_ty node_, PyArena *ctx_, int optimize_) +astfold_stmt(stmt_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { switch (node_->kind) { case FunctionDef_kind: CALL(astfold_arguments, arguments_ty, node_->v.FunctionDef.args); CALL(astfold_body, asdl_seq, node_->v.FunctionDef.body); CALL_SEQ(astfold_expr, expr_ty, node_->v.FunctionDef.decorator_list); - CALL_OPT(astfold_expr, expr_ty, node_->v.FunctionDef.returns); + if (!(state->ff_features & CO_FUTURE_ANNOTATIONS)) { + CALL_OPT(astfold_expr, expr_ty, node_->v.FunctionDef.returns); + } break; case AsyncFunctionDef_kind: CALL(astfold_arguments, arguments_ty, node_->v.AsyncFunctionDef.args); CALL(astfold_body, asdl_seq, node_->v.AsyncFunctionDef.body); CALL_SEQ(astfold_expr, expr_ty, node_->v.AsyncFunctionDef.decorator_list); - CALL_OPT(astfold_expr, expr_ty, node_->v.AsyncFunctionDef.returns); + if (!(state->ff_features & CO_FUTURE_ANNOTATIONS)) { + CALL_OPT(astfold_expr, expr_ty, node_->v.AsyncFunctionDef.returns); + } break; case ClassDef_kind: CALL_SEQ(astfold_expr, expr_ty, node_->v.ClassDef.bases); @@ -672,7 +656,9 @@ astfold_stmt(stmt_ty node_, PyArena *ctx_, int optimize_) break; case AnnAssign_kind: CALL(astfold_expr, expr_ty, node_->v.AnnAssign.target); - CALL(astfold_expr, expr_ty, node_->v.AnnAssign.annotation); + if (!(state->ff_features & CO_FUTURE_ANNOTATIONS)) { + CALL(astfold_expr, expr_ty, node_->v.AnnAssign.annotation); + } CALL_OPT(astfold_expr, expr_ty, node_->v.AnnAssign.value); break; case For_kind: @@ -731,7 +717,7 @@ astfold_stmt(stmt_ty node_, PyArena *ctx_, int optimize_) } static int -astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, int optimize_) +astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { switch (node_->kind) { case ExceptHandler_kind: @@ -745,7 +731,7 @@ astfold_excepthandler(excepthandler_ty node_, PyArena *ctx_, int optimize_) } static int -astfold_withitem(withitem_ty node_, PyArena *ctx_, int optimize_) +astfold_withitem(withitem_ty node_, PyArena *ctx_, _PyASTOptimizeState *state) { CALL(astfold_expr, expr_ty, node_->context_expr); CALL_OPT(astfold_expr, expr_ty, node_->optional_vars); @@ -758,9 +744,9 @@ astfold_withitem(withitem_ty node_, PyArena *ctx_, int optimize_) #undef CALL_INT_SEQ int -_PyAST_Optimize(mod_ty mod, PyArena *arena, int optimize) +_PyAST_Optimize(mod_ty mod, PyArena *arena, _PyASTOptimizeState *state) { - int ret = astfold_mod(mod, arena, optimize); + int ret = astfold_mod(mod, arena, state); assert(ret || PyErr_Occurred()); return ret; } diff --git a/Python/ast_unparse.c b/Python/ast_unparse.c index af9604eb45b18366e30d6bc1630d9d53e51d5e56..e699751a05a0559842d2f94d506092a6b3ffaf58 100644 --- a/Python/ast_unparse.c +++ b/Python/ast_unparse.c @@ -1,3 +1,4 @@ +#include /* DBL_MAX_10_EXP */ #include #include "Python.h" #include "Python-ast.h" @@ -6,6 +7,8 @@ static PyObject *_str_open_br; static PyObject *_str_dbl_open_br; static PyObject *_str_close_br; static PyObject *_str_dbl_close_br; +static PyObject *_str_inf; +static PyObject *_str_replace_inf; /* Forward declarations for recursion via helper functions. */ static PyObject * @@ -15,9 +18,9 @@ append_ast_expr(_PyUnicodeWriter *writer, expr_ty e, int level); static int append_joinedstr(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec); static int -append_formattedvalue(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec); +append_formattedvalue(_PyUnicodeWriter *writer, expr_ty e); static int -append_ast_slice(_PyUnicodeWriter *writer, slice_ty slice); +append_ast_slice(_PyUnicodeWriter *writer, expr_ty e); static int append_charp(_PyUnicodeWriter *writer, const char *charp) @@ -61,13 +64,28 @@ append_charp(_PyUnicodeWriter *writer, const char *charp) static int append_repr(_PyUnicodeWriter *writer, PyObject *obj) { - int ret; - PyObject *repr; - repr = PyObject_Repr(obj); + PyObject *repr = PyObject_Repr(obj); + if (!repr) { return -1; } - ret = _PyUnicodeWriter_WriteStr(writer, repr); + + if ((PyFloat_CheckExact(obj) && Py_IS_INFINITY(PyFloat_AS_DOUBLE(obj))) || + PyComplex_CheckExact(obj)) + { + PyObject *new_repr = PyUnicode_Replace( + repr, + _str_inf, + _str_replace_inf, + -1 + ); + Py_DECREF(repr); + if (!new_repr) { + return -1; + } + repr = new_repr; + } + int ret = _PyUnicodeWriter_WriteStr(writer, repr); Py_DECREF(repr); return ret; } @@ -583,7 +601,7 @@ append_fstring_element(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec) case JoinedStr_kind: return append_joinedstr(writer, e, is_format_spec); case FormattedValue_kind: - return append_formattedvalue(writer, e, is_format_spec); + return append_formattedvalue(writer, e); default: PyErr_SetString(PyExc_SystemError, "unknown expression kind inside f-string"); @@ -640,7 +658,7 @@ append_joinedstr(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec) } static int -append_formattedvalue(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec) +append_formattedvalue(_PyUnicodeWriter *writer, expr_ty e) { const char *conversion; const char *outer_brace = "{"; @@ -697,6 +715,28 @@ append_formattedvalue(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec) APPEND_STR_FINISH("}"); } +static int +append_ast_constant(_PyUnicodeWriter *writer, PyObject *constant) +{ + if (PyTuple_CheckExact(constant)) { + Py_ssize_t i, elem_count; + + elem_count = PyTuple_GET_SIZE(constant); + APPEND_STR("("); + for (i = 0; i < elem_count; i++) { + APPEND_STR_IF(i > 0, ", "); + if (append_ast_constant(writer, PyTuple_GET_ITEM(constant, i)) < 0) { + return -1; + } + } + + APPEND_STR_IF(elem_count == 1, ","); + APPEND_STR(")"); + return 0; + } + return append_repr(writer, constant); +} + static int append_ast_attribute(_PyUnicodeWriter *writer, expr_ty e) { @@ -718,79 +758,42 @@ append_ast_attribute(_PyUnicodeWriter *writer, expr_ty e) } static int -append_ast_simple_slice(_PyUnicodeWriter *writer, slice_ty slice) +append_ast_slice(_PyUnicodeWriter *writer, expr_ty e) { - if (slice->v.Slice.lower) { - APPEND_EXPR(slice->v.Slice.lower, PR_TEST); + if (e->v.Slice.lower) { + APPEND_EXPR(e->v.Slice.lower, PR_TEST); } APPEND_STR(":"); - if (slice->v.Slice.upper) { - APPEND_EXPR(slice->v.Slice.upper, PR_TEST); + if (e->v.Slice.upper) { + APPEND_EXPR(e->v.Slice.upper, PR_TEST); } - if (slice->v.Slice.step) { + if (e->v.Slice.step) { APPEND_STR(":"); - APPEND_EXPR(slice->v.Slice.step, PR_TEST); - } - return 0; -} - -static int -append_ast_ext_slice(_PyUnicodeWriter *writer, slice_ty slice) -{ - Py_ssize_t i, dims_count; - dims_count = asdl_seq_LEN(slice->v.ExtSlice.dims); - for (i = 0; i < dims_count; i++) { - APPEND_STR_IF(i > 0, ", "); - APPEND(slice, (slice_ty)asdl_seq_GET(slice->v.ExtSlice.dims, i)); + APPEND_EXPR(e->v.Slice.step, PR_TEST); } - APPEND_STR_IF(dims_count == 1, ","); return 0; } static int -append_ast_index_slice(_PyUnicodeWriter *writer, slice_ty slice) +append_ast_subscript(_PyUnicodeWriter *writer, expr_ty e) { + APPEND_EXPR(e->v.Subscript.value, PR_ATOM); int level = PR_TUPLE; - expr_ty value = slice->v.Index.value; - if (value->kind == Tuple_kind) { - for (Py_ssize_t i = 0; i < asdl_seq_LEN(value->v.Tuple.elts); i++) { - expr_ty element = asdl_seq_GET(value->v.Tuple.elts, i); + expr_ty slice = e->v.Subscript.slice; + if (slice->kind == Tuple_kind) { + for (Py_ssize_t i = 0; i < asdl_seq_LEN(slice->v.Tuple.elts); i++) { + expr_ty element = asdl_seq_GET(slice->v.Tuple.elts, i); if (element->kind == Starred_kind) { ++level; break; } } } - APPEND_EXPR(value, level); - return 0; -} - -static int -append_ast_slice(_PyUnicodeWriter *writer, slice_ty slice) -{ - switch (slice->kind) { - case Slice_kind: - return append_ast_simple_slice(writer, slice); - case ExtSlice_kind: - return append_ast_ext_slice(writer, slice); - case Index_kind: - return append_ast_index_slice(writer, slice); - default: - PyErr_SetString(PyExc_SystemError, - "unexpected slice kind"); - return -1; - } -} - -static int -append_ast_subscript(_PyUnicodeWriter *writer, expr_ty e) -{ - APPEND_EXPR(e->v.Subscript.value, PR_ATOM); APPEND_STR("["); - APPEND(slice, e->v.Subscript.slice); + APPEND_EXPR(e->v.Subscript.slice, level); APPEND_STR_FINISH("]"); } @@ -837,7 +840,7 @@ append_named_expr(_PyUnicodeWriter *writer, expr_ty e, int level) { APPEND_STR_IF(level > PR_TUPLE, "("); APPEND_EXPR(e->v.NamedExpr.target, PR_ATOM); - APPEND_STR(":="); + APPEND_STR(" := "); APPEND_EXPR(e->v.NamedExpr.value, PR_ATOM); APPEND_STR_IF(level > PR_TUPLE, ")"); return 0; @@ -883,11 +886,15 @@ append_ast_expr(_PyUnicodeWriter *writer, expr_ty e, int level) if (e->v.Constant.value == Py_Ellipsis) { APPEND_STR_FINISH("..."); } - return append_repr(writer, e->v.Constant.value); + if (e->v.Constant.kind != NULL + && -1 == _PyUnicodeWriter_WriteStr(writer, e->v.Constant.kind)) { + return -1; + } + return append_ast_constant(writer, e->v.Constant.value); case JoinedStr_kind: return append_joinedstr(writer, e, false); case FormattedValue_kind: - return append_formattedvalue(writer, e, false); + return append_formattedvalue(writer, e); /* The following exprs can be assignment targets. */ case Attribute_kind: return append_ast_attribute(writer, e); @@ -895,6 +902,8 @@ append_ast_expr(_PyUnicodeWriter *writer, expr_ty e, int level) return append_ast_subscript(writer, e); case Starred_kind: return append_ast_starred(writer, e); + case Slice_kind: + return append_ast_slice(writer, e); case Name_kind: return _PyUnicodeWriter_WriteStr(writer, e->v.Name.id); case List_kind: @@ -929,6 +938,14 @@ maybe_init_static_strings(void) !(_str_dbl_close_br = PyUnicode_InternFromString("}}"))) { return -1; } + if (!_str_inf && + !(_str_inf = PyUnicode_FromString("inf"))) { + return -1; + } + if (!_str_replace_inf && + !(_str_replace_inf = PyUnicode_FromFormat("1e%d", 1 + DBL_MAX_10_EXP))) { + return -1; + } return 0; } diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index e42d5f246c37a6913d1fa867a9d3b69764d66c43..614012df9b12a2bf8ce0a87ba5a40a654152ab0a 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -4,7 +4,9 @@ #include #include "ast.h" #undef Yield /* undefine macro conflicting with */ -#include "pycore_pystate.h" +#include "pycore_object.h" +#include "pycore_pyerrors.h" +#include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_tupleobject.h" _Py_IDENTIFIER(__builtins__); @@ -29,7 +31,6 @@ update_bases(PyObject *bases, PyObject *const *args, Py_ssize_t nargs) { Py_ssize_t i, j; PyObject *base, *meth, *new_base, *result, *new_bases = NULL; - PyObject *stack[1] = {bases}; assert(PyTuple_Check(bases)); for (i = 0; i < nargs; i++) { @@ -55,7 +56,7 @@ update_bases(PyObject *bases, PyObject *const *args, Py_ssize_t nargs) } continue; } - new_base = _PyObject_FastCall(meth, stack, 1); + new_base = PyObject_CallOneArg(meth, bases); Py_DECREF(meth); if (!new_base) { goto error; @@ -169,7 +170,7 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs, /* else get the type of the first base */ else { PyObject *base0 = PyTuple_GET_ITEM(bases, 0); - meta = (PyObject *) (base0->ob_type); + meta = (PyObject *)Py_TYPE(base0); } Py_INCREF(meta); isclass = 1; /* meta is really a class */ @@ -202,7 +203,7 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs, } else { PyObject *pargs[2] = {name, bases}; - ns = _PyObject_FastCallDict(prep, pargs, 2, mkw); + ns = PyObject_VectorcallDict(prep, pargs, 2, mkw); Py_DECREF(prep); } if (ns == NULL) { @@ -228,7 +229,7 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs, } } PyObject *margs[3] = {name, bases, ns}; - cls = _PyObject_FastCallDict(meta, margs, 3, mkw); + cls = PyObject_VectorcallDict(meta, margs, 3, mkw); if (cls != NULL && PyType_Check(cls) && PyCell_Check(cell)) { PyObject *cell_cls = PyCell_GET(cell); if (cell_cls != cls) { @@ -488,7 +489,7 @@ builtin_breakpoint(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb } Py_INCREF(hook); - PyObject *retval = _PyObject_Vectorcall(hook, args, nargs, keywords); + PyObject *retval = PyObject_Vectorcall(hook, args, nargs, keywords); Py_DECREF(hook); return retval; } @@ -574,7 +575,7 @@ filter_next(filterobject *lz) ok = PyObject_IsTrue(item); } else { PyObject *good; - good = PyObject_CallFunctionObjArgs(lz->func, item, NULL); + good = PyObject_CallOneArg(lz->func, item); if (good == NULL) { Py_DECREF(item); return NULL; @@ -816,6 +817,7 @@ builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename, goto error; result = Py_CompileStringObject(str, filename, start[compile_mode], &cf, optimize); + Py_XDECREF(source_copy); goto finally; @@ -1001,13 +1003,13 @@ builtin_exec_impl(PyObject *module, PyObject *source, PyObject *globals, if (!PyDict_Check(globals)) { PyErr_Format(PyExc_TypeError, "exec() globals must be a dict, not %.100s", - globals->ob_type->tp_name); + Py_TYPE(globals)->tp_name); return NULL; } if (!PyMapping_Check(locals)) { PyErr_Format(PyExc_TypeError, "locals must be a mapping or None, not %.100s", - locals->ob_type->tp_name); + Py_TYPE(locals)->tp_name); return NULL; } if (_PyDict_GetItemIdWithError(globals, &PyId___builtins__) == NULL) { @@ -1255,23 +1257,23 @@ map_next(mapobject *lz) { PyObject *small_stack[_PY_FASTCALL_SMALL_STACK]; PyObject **stack; - Py_ssize_t niters, nargs, i; PyObject *result = NULL; + PyThreadState *tstate = _PyThreadState_GET(); - niters = PyTuple_GET_SIZE(lz->iters); + const Py_ssize_t niters = PyTuple_GET_SIZE(lz->iters); if (niters <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) { stack = small_stack; } else { stack = PyMem_Malloc(niters * sizeof(stack[0])); if (stack == NULL) { - PyErr_NoMemory(); + _PyErr_NoMemory(tstate); return NULL; } } - nargs = 0; - for (i=0; i < niters; i++) { + Py_ssize_t nargs = 0; + for (Py_ssize_t i=0; i < niters; i++) { PyObject *it = PyTuple_GET_ITEM(lz->iters, i); PyObject *val = Py_TYPE(it)->tp_iternext(it); if (val == NULL) { @@ -1281,10 +1283,10 @@ map_next(mapobject *lz) nargs++; } - result = _PyObject_FastCall(lz->func, stack, nargs); + result = _PyObject_VectorcallTstate(tstate, lz->func, stack, nargs, NULL); exit: - for (i=0; i < nargs; i++) { + for (Py_ssize_t i=0; i < nargs; i++) { Py_DECREF(stack[i]); } if (stack != small_stack) { @@ -1382,11 +1384,11 @@ builtin_next(PyObject *self, PyObject *const *args, Py_ssize_t nargs) if (!PyIter_Check(it)) { PyErr_Format(PyExc_TypeError, "'%.200s' object is not an iterator", - it->ob_type->tp_name); + Py_TYPE(it)->tp_name); return NULL; } - res = (*it->ob_type->tp_iternext)(it); + res = (*Py_TYPE(it)->tp_iternext)(it); if (res != NULL) { return res; } else if (nargs > 1) { @@ -1589,10 +1591,15 @@ min_max(PyObject *args, PyObject *kwds, int op) const int positional = PyTuple_Size(args) > 1; int ret; - if (positional) + if (positional) { v = args; - else if (!PyArg_UnpackTuple(args, name, 1, 1, &v)) + } + else if (!PyArg_UnpackTuple(args, name, 1, 1, &v)) { + if (PyExceptionClass_Check(PyExc_TypeError)) { + PyErr_Format(PyExc_TypeError, "%s expected at least 1 argument, got 0", name); + } return NULL; + } emptytuple = PyTuple_New(0); if (emptytuple == NULL) @@ -1625,7 +1632,7 @@ min_max(PyObject *args, PyObject *kwds, int op) while (( item = PyIter_Next(it) )) { /* get the value from the key function */ if (keyfunc != NULL) { - val = PyObject_CallFunctionObjArgs(keyfunc, item, NULL); + val = PyObject_CallOneArg(keyfunc, item); if (val == NULL) goto Fail_it_item; } @@ -1782,7 +1789,7 @@ builtin_ord(PyObject *module, PyObject *c) else { PyErr_Format(PyExc_TypeError, "ord() expected string of length 1, but " \ - "%.200s found", c->ob_type->tp_name); + "%.200s found", Py_TYPE(c)->tp_name); return NULL; } @@ -1821,8 +1828,9 @@ static PyObject * builtin_print(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { static const char * const _keywords[] = {"sep", "end", "file", "flush", 0}; - static struct _PyArg_Parser _parser = {"|OOOO:print", _keywords, 0}; - PyObject *sep = NULL, *end = NULL, *file = NULL, *flush = NULL; + static struct _PyArg_Parser _parser = {"|OOOp:print", _keywords, 0}; + PyObject *sep = NULL, *end = NULL, *file = NULL; + int flush = 0; int i, err; if (kwnames != NULL && @@ -1849,7 +1857,7 @@ builtin_print(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject else if (sep && !PyUnicode_Check(sep)) { PyErr_Format(PyExc_TypeError, "sep must be None or a string, not %.200s", - sep->ob_type->tp_name); + Py_TYPE(sep)->tp_name); return NULL; } if (end == Py_None) { @@ -1858,7 +1866,7 @@ builtin_print(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject else if (end && !PyUnicode_Check(end)) { PyErr_Format(PyExc_TypeError, "end must be None or a string, not %.200s", - end->ob_type->tp_name); + Py_TYPE(end)->tp_name); return NULL; } @@ -1884,18 +1892,11 @@ builtin_print(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject if (err) return NULL; - if (flush != NULL) { - PyObject *tmp; - int do_flush = PyObject_IsTrue(flush); - if (do_flush == -1) + if (flush) { + PyObject *tmp = _PyObject_CallMethodIdNoArgs(file, &PyId_flush); + if (tmp == NULL) return NULL; - else if (do_flush) { - tmp = _PyObject_CallMethodId(file, &PyId_flush, NULL); - if (tmp == NULL) - return NULL; - else - Py_DECREF(tmp); - } + Py_DECREF(tmp); } Py_RETURN_NONE; @@ -1960,7 +1961,7 @@ builtin_input_impl(PyObject *module, PyObject *prompt) } /* First of all, flush stderr */ - tmp = _PyObject_CallMethodId(ferr, &PyId_flush, NULL); + tmp = _PyObject_CallMethodIdNoArgs(ferr, &PyId_flush); if (tmp == NULL) PyErr_Clear(); else @@ -1969,7 +1970,7 @@ builtin_input_impl(PyObject *module, PyObject *prompt) /* We should only use (GNU) readline if Python's sys.stdin and sys.stdout are the same as C's stdin and stdout, because we need to pass it those. */ - tmp = _PyObject_CallMethodId(fin, &PyId_fileno, NULL); + tmp = _PyObject_CallMethodIdNoArgs(fin, &PyId_fileno); if (tmp == NULL) { PyErr_Clear(); tty = 0; @@ -1982,7 +1983,7 @@ builtin_input_impl(PyObject *module, PyObject *prompt) tty = fd == fileno(stdin) && isatty(fd); } if (tty) { - tmp = _PyObject_CallMethodId(fout, &PyId_fileno, NULL); + tmp = _PyObject_CallMethodIdNoArgs(fout, &PyId_fileno); if (tmp == NULL) { PyErr_Clear(); tty = 0; @@ -2020,7 +2021,7 @@ builtin_input_impl(PyObject *module, PyObject *prompt) stdin_errors_str = PyUnicode_AsUTF8(stdin_errors); if (!stdin_encoding_str || !stdin_errors_str) goto _readline_errors; - tmp = _PyObject_CallMethodId(fout, &PyId_flush, NULL); + tmp = _PyObject_CallMethodIdNoArgs(fout, &PyId_flush); if (tmp == NULL) PyErr_Clear(); else @@ -2115,7 +2116,7 @@ builtin_input_impl(PyObject *module, PyObject *prompt) if (PyFile_WriteObject(prompt, fout, Py_PRINT_RAW) != 0) return NULL; } - tmp = _PyObject_CallMethodId(fout, &PyId_flush, NULL); + tmp = _PyObject_CallMethodIdNoArgs(fout, &PyId_flush); if (tmp == NULL) PyErr_Clear(); else @@ -2178,7 +2179,7 @@ builtin_round_impl(PyObject *module, PyObject *number, PyObject *ndigits) if (ndigits == Py_None) result = _PyObject_CallNoArg(round); else - result = PyObject_CallFunctionObjArgs(round, ndigits, NULL); + result = PyObject_CallOneArg(round, ndigits); Py_DECREF(round); return result; } @@ -2234,7 +2235,7 @@ builtin_sorted(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject } assert(nargs >= 1); - v = _PyObject_Vectorcall(callable, args + 1, nargs - 1, kwnames); + v = PyObject_Vectorcall(callable, args + 1, nargs - 1, kwnames); Py_DECREF(callable); if (v == NULL) { Py_DECREF(newlist); @@ -2349,7 +2350,7 @@ builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start) return NULL; return PyLong_FromLong(i_result); } - if (PyLong_CheckExact(item)) { + if (PyLong_CheckExact(item) || PyBool_Check(item)) { long b = PyLong_AsLongAndOverflow(item, &overflow); if (overflow == 0 && (i_result >= 0 ? (b <= LONG_MAX - i_result) @@ -2391,20 +2392,16 @@ builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start) return PyFloat_FromDouble(f_result); } if (PyFloat_CheckExact(item)) { - PyFPE_START_PROTECT("add", Py_DECREF(item); Py_DECREF(iter); return 0) f_result += PyFloat_AS_DOUBLE(item); - PyFPE_END_PROTECT(f_result) Py_DECREF(item); continue; } - if (PyLong_CheckExact(item)) { + if (PyLong_Check(item)) { long value; int overflow; value = PyLong_AsLongAndOverflow(item, &overflow); if (!overflow) { - PyFPE_START_PROTECT("add", Py_DECREF(item); Py_DECREF(iter); return 0) f_result += (double)value; - PyFPE_END_PROTECT(f_result) Py_DECREF(item); continue; } @@ -2445,7 +2442,11 @@ builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start) empty = [] sum([[x] for x in range(10)], empty) - would change the value of empty. */ + would change the value of empty. In fact, using + in-place addition rather that binary addition for + any of the steps introduces subtle behavior changes: + + https://bugs.python.org/issue18305 */ temp = PyNumber_Add(result, item); Py_DECREF(result); Py_DECREF(item); @@ -2618,6 +2619,11 @@ zip_next(zipobject *lz) PyTuple_SET_ITEM(result, i, item); Py_DECREF(olditem); } + // bpo-42536: The GC may have untracked this result tuple. Since we're + // recycling it, make sure it's tracked again: + if (!_PyObject_GC_IS_TRACKED(result)) { + _PyObject_GC_TRACK(result); + } } else { result = PyTuple_New(tuplesize); if (result == NULL) @@ -2769,11 +2775,11 @@ static struct PyModuleDef builtinsmodule = { PyObject * -_PyBuiltin_Init(void) +_PyBuiltin_Init(PyThreadState *tstate) { PyObject *mod, *dict, *debug; - const PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; + const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); if (PyType_Ready(&PyFilter_Type) < 0 || PyType_Ready(&PyMap_Type) < 0 || diff --git a/Python/bootstrap_hash.c b/Python/bootstrap_hash.c index eb2b6d08d8e1429a514500ffc6138c88e3ef7b1a..a212f69870ed10f314ecc5e017402c4fb098e182 100644 --- a/Python/bootstrap_hash.c +++ b/Python/bootstrap_hash.c @@ -25,6 +25,16 @@ # include #endif +#if defined(__APPLE__) && defined(__has_builtin) +# if __has_builtin(__builtin_available) +# define HAVE_GETENTRYPY_GETRANDOM_RUNTIME __builtin_available(macOS 10.12, iOS 10.10, tvOS 10.0, watchOS 3.0, *) +# endif +#endif +#ifndef HAVE_GETENTRYPY_GETRANDOM_RUNTIME +# define HAVE_GETENTRYPY_GETRANDOM_RUNTIME 1 +#endif + + #ifdef Py_DEBUG int _Py_HashSecret_Initialized = 0; #else @@ -163,7 +173,7 @@ py_getrandom(void *buffer, Py_ssize_t size, int blocking, int raise) } /* getrandom(GRND_NONBLOCK) fails with EAGAIN if the system urandom - is not initialiazed yet. For _PyRandom_Init(), we ignore the + is not initialized yet. For _PyRandom_Init(), we ignore the error and fall back on reading /dev/urandom which never blocks, even if the system urandom is not initialized yet: see the PEP 524. */ @@ -208,6 +218,16 @@ py_getrandom(void *buffer, Py_ssize_t size, int blocking, int raise) error. getentropy() is retried if it failed with EINTR: interrupted by a signal. */ + +#if defined(__APPLE__) && defined(__has_attribute) && __has_attribute(availability) +static int +py_getentropy(char *buffer, Py_ssize_t size, int raise) + __attribute__((availability(macos,introduced=10.12))) + __attribute__((availability(ios,introduced=10.0))) + __attribute__((availability(tvos,introduced=10.0))) + __attribute__((availability(watchos,introduced=3.0))); +#endif + static int py_getentropy(char *buffer, Py_ssize_t size, int raise) { @@ -498,19 +518,21 @@ pyurandom(void *buffer, Py_ssize_t size, int blocking, int raise) #else #if defined(PY_GETRANDOM) || defined(PY_GETENTROPY) + if (HAVE_GETENTRYPY_GETRANDOM_RUNTIME) { #ifdef PY_GETRANDOM - res = py_getrandom(buffer, size, blocking, raise); + res = py_getrandom(buffer, size, blocking, raise); #else - res = py_getentropy(buffer, size, raise); + res = py_getentropy(buffer, size, raise); #endif - if (res < 0) { - return -1; - } - if (res == 1) { - return 0; - } - /* getrandom() or getentropy() function is not available: failed with - ENOSYS or EPERM. Fall back on reading from /dev/urandom. */ + if (res < 0) { + return -1; + } + if (res == 1) { + return 0; + } + /* getrandom() or getentropy() function is not available: failed with + ENOSYS or EPERM. Fall back on reading from /dev/urandom. */ + } /* end of availability block */ #endif return dev_urandom(buffer, size, raise); @@ -580,7 +602,7 @@ _Py_HashRandomization_Init(const PyConfig *config) res = pyurandom(secret, secret_size, 0, 0); if (res < 0) { return _PyStatus_ERR("failed to get random numbers " - "to initialize Python"); + "to initialize Python"); } } return _PyStatus_OK(); diff --git a/Python/ceval.c b/Python/ceval.c index 1873e37cf608e88e93b2351b37aa906fc71e75df..91e879e804204450251a59e4be0bccf012171222 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -10,12 +10,17 @@ #define PY_LOCAL_AGGRESSIVE #include "Python.h" +#include "pycore_abstract.h" // _PyIndex_Check() +#include "pycore_call.h" #include "pycore_ceval.h" #include "pycore_code.h" +#include "pycore_initconfig.h" #include "pycore_object.h" #include "pycore_pyerrors.h" #include "pycore_pylifecycle.h" -#include "pycore_pystate.h" +#include "pycore_pymem.h" // _PyMem_IsPtrFreed() +#include "pycore_pystate.h" // _PyInterpreterState_GET() +#include "pycore_sysmodule.h" #include "pycore_tupleobject.h" #include "code.h" @@ -24,7 +29,6 @@ #include "opcode.h" #include "pydtrace.h" #include "setobject.h" -#include "structmember.h" #include @@ -38,10 +42,7 @@ # error "ceval.c must be build with Py_BUILD_CORE define for best performance" #endif -/* Private API for the LOAD_METHOD opcode. */ -extern int _PyObject_GetMethod(PyObject *, PyObject *, PyObject **); - -typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *); +_Py_IDENTIFIER(__name__); /* Forward declarations */ Py_LOCAL_INLINE(PyObject *) call_function( @@ -70,7 +71,6 @@ static void maybe_dtrace_line(PyFrameObject *, int *, int *, int *); static void dtrace_function_entry(PyFrameObject *); static void dtrace_function_return(PyFrameObject *); -static PyObject * cmp_outcome(PyThreadState *, int, PyObject *, PyObject *); static PyObject * import_name(PyThreadState *, PyFrameObject *, PyObject *, PyObject *, PyObject *); static PyObject * import_from(PyThreadState *, PyObject *, PyObject *); @@ -82,7 +82,7 @@ static PyObject * unicode_concatenate(PyThreadState *, PyObject *, PyObject *, static PyObject * special_lookup(PyThreadState *, PyObject *, _Py_Identifier *); static int check_args_iterable(PyThreadState *, PyObject *func, PyObject *vararg); static void format_kwargs_error(PyThreadState *, PyObject *func, PyObject *kwargs); -static void format_awaitable_error(PyThreadState *, PyTypeObject *, int); +static void format_awaitable_error(PyThreadState *, PyTypeObject *, int, int); #define NAME_ERROR_MSG \ "name '%.200s' is not defined" @@ -122,129 +122,199 @@ static size_t opcache_global_hits = 0; static size_t opcache_global_misses = 0; #endif -#define GIL_REQUEST _Py_atomic_load_relaxed(&ceval->gil_drop_request) + +#ifndef NDEBUG +/* Ensure that tstate is valid: sanity check for PyEval_AcquireThread() and + PyEval_RestoreThread(). Detect if tstate memory was freed. It can happen + when a thread continues to run after Python finalization, especially + daemon threads. */ +static int +is_tstate_valid(PyThreadState *tstate) +{ + assert(!_PyMem_IsPtrFreed(tstate)); + assert(!_PyMem_IsPtrFreed(tstate->interp)); + return 1; +} +#endif + /* This can set eval_breaker to 0 even though gil_drop_request became 1. We believe this is all right because the eval loop will release the GIL eventually anyway. */ -#define COMPUTE_EVAL_BREAKER(ceval) \ - _Py_atomic_store_relaxed( \ - &(ceval)->eval_breaker, \ - GIL_REQUEST | \ - _Py_atomic_load_relaxed(&(ceval)->signals_pending) | \ - _Py_atomic_load_relaxed(&(ceval)->pending.calls_to_do) | \ - (ceval)->pending.async_exc) - -#define SET_GIL_DROP_REQUEST(ceval) \ - do { \ - _Py_atomic_store_relaxed(&(ceval)->gil_drop_request, 1); \ - _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ - } while (0) +static inline void +COMPUTE_EVAL_BREAKER(PyInterpreterState *interp, + struct _ceval_runtime_state *ceval, + struct _ceval_state *ceval2) +{ + _Py_atomic_store_relaxed(&ceval2->eval_breaker, + _Py_atomic_load_relaxed(&ceval2->gil_drop_request) + | (_Py_atomic_load_relaxed(&ceval->signals_pending) + && _Py_ThreadCanHandleSignals(interp)) + | (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do) + && _Py_ThreadCanHandlePendingCalls()) + | ceval2->pending.async_exc); +} -#define RESET_GIL_DROP_REQUEST(ceval) \ - do { \ - _Py_atomic_store_relaxed(&(ceval)->gil_drop_request, 0); \ - COMPUTE_EVAL_BREAKER(ceval); \ - } while (0) -/* Pending calls are only modified under pending_lock */ -#define SIGNAL_PENDING_CALLS(ceval) \ - do { \ - _Py_atomic_store_relaxed(&(ceval)->pending.calls_to_do, 1); \ - _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ - } while (0) +static inline void +SET_GIL_DROP_REQUEST(PyInterpreterState *interp) +{ + struct _ceval_state *ceval2 = &interp->ceval; + _Py_atomic_store_relaxed(&ceval2->gil_drop_request, 1); + _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1); +} -#define UNSIGNAL_PENDING_CALLS(ceval) \ - do { \ - _Py_atomic_store_relaxed(&(ceval)->pending.calls_to_do, 0); \ - COMPUTE_EVAL_BREAKER(ceval); \ - } while (0) -#define SIGNAL_PENDING_SIGNALS(ceval) \ - do { \ - _Py_atomic_store_relaxed(&(ceval)->signals_pending, 1); \ - _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ - } while (0) +static inline void +RESET_GIL_DROP_REQUEST(PyInterpreterState *interp) +{ + struct _ceval_runtime_state *ceval = &interp->runtime->ceval; + struct _ceval_state *ceval2 = &interp->ceval; + _Py_atomic_store_relaxed(&ceval2->gil_drop_request, 0); + COMPUTE_EVAL_BREAKER(interp, ceval, ceval2); +} -#define UNSIGNAL_PENDING_SIGNALS(ceval) \ - do { \ - _Py_atomic_store_relaxed(&(ceval)->signals_pending, 0); \ - COMPUTE_EVAL_BREAKER(ceval); \ - } while (0) -#define SIGNAL_ASYNC_EXC(ceval) \ - do { \ - (ceval)->pending.async_exc = 1; \ - _Py_atomic_store_relaxed(&(ceval)->eval_breaker, 1); \ - } while (0) +static inline void +SIGNAL_PENDING_CALLS(PyInterpreterState *interp) +{ + struct _ceval_runtime_state *ceval = &interp->runtime->ceval; + struct _ceval_state *ceval2 = &interp->ceval; + _Py_atomic_store_relaxed(&ceval2->pending.calls_to_do, 1); + COMPUTE_EVAL_BREAKER(interp, ceval, ceval2); +} -#define UNSIGNAL_ASYNC_EXC(ceval) \ - do { \ - (ceval)->pending.async_exc = 0; \ - COMPUTE_EVAL_BREAKER(ceval); \ - } while (0) + +static inline void +UNSIGNAL_PENDING_CALLS(PyInterpreterState *interp) +{ + struct _ceval_runtime_state *ceval = &interp->runtime->ceval; + struct _ceval_state *ceval2 = &interp->ceval; + _Py_atomic_store_relaxed(&ceval2->pending.calls_to_do, 0); + COMPUTE_EVAL_BREAKER(interp, ceval, ceval2); +} + + +static inline void +SIGNAL_PENDING_SIGNALS(PyInterpreterState *interp, int force) +{ + struct _ceval_runtime_state *ceval = &interp->runtime->ceval; + struct _ceval_state *ceval2 = &interp->ceval; + _Py_atomic_store_relaxed(&ceval->signals_pending, 1); + if (force) { + _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1); + } + else { + /* eval_breaker is not set to 1 if thread_can_handle_signals() is false */ + COMPUTE_EVAL_BREAKER(interp, ceval, ceval2); + } +} + + +static inline void +UNSIGNAL_PENDING_SIGNALS(PyInterpreterState *interp) +{ + struct _ceval_runtime_state *ceval = &interp->runtime->ceval; + struct _ceval_state *ceval2 = &interp->ceval; + _Py_atomic_store_relaxed(&ceval->signals_pending, 0); + COMPUTE_EVAL_BREAKER(interp, ceval, ceval2); +} + + +static inline void +SIGNAL_ASYNC_EXC(PyInterpreterState *interp) +{ + struct _ceval_state *ceval2 = &interp->ceval; + ceval2->pending.async_exc = 1; + _Py_atomic_store_relaxed(&ceval2->eval_breaker, 1); +} + + +static inline void +UNSIGNAL_ASYNC_EXC(PyInterpreterState *interp) +{ + struct _ceval_runtime_state *ceval = &interp->runtime->ceval; + struct _ceval_state *ceval2 = &interp->ceval; + ceval2->pending.async_exc = 0; + COMPUTE_EVAL_BREAKER(interp, ceval, ceval2); +} #ifdef HAVE_ERRNO_H #include #endif -#include "pythread.h" #include "ceval_gil.h" +void _Py_NO_RETURN +_Py_FatalError_TstateNULL(const char *func) +{ + _Py_FatalErrorFunc(func, + "the function must be called with the GIL held, " + "but the GIL is released " + "(the current Python thread state is NULL)"); +} + + int -PyEval_ThreadsInitialized(void) +_PyEval_ThreadsInitialized(_PyRuntimeState *runtime) { - return gil_created(&_PyRuntime.ceval.gil); + return gil_created(&runtime->ceval.gil); } -void -PyEval_InitThreads(void) +int +PyEval_ThreadsInitialized(void) { _PyRuntimeState *runtime = &_PyRuntime; - struct _ceval_runtime_state *ceval = &runtime->ceval; - struct _gil_runtime_state *gil = &ceval->gil; - if (gil_created(gil)) { - return; + return _PyEval_ThreadsInitialized(runtime); +} + +PyStatus +_PyEval_InitGIL(PyThreadState *tstate) +{ + if (!_Py_IsMainInterpreter(tstate)) { + /* Currently, the GIL is shared by all interpreters, + and only the main interpreter is responsible to create + and destroy it. */ + return _PyStatus_OK(); } + struct _gil_runtime_state *gil = &tstate->interp->runtime->ceval.gil; + assert(!gil_created(gil)); + PyThread_init_thread(); create_gil(gil); - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - take_gil(ceval, tstate); - struct _pending_calls *pending = &ceval->pending; - pending->lock = PyThread_allocate_lock(); - if (pending->lock == NULL) { - Py_FatalError("Can't initialize threads for pending calls"); - } + take_gil(tstate); + + assert(gil_created(gil)); + return _PyStatus_OK(); } void -_PyEval_FiniThreads(struct _ceval_runtime_state *ceval) +_PyEval_FiniGIL(PyThreadState *tstate) { - struct _gil_runtime_state *gil = &ceval->gil; + if (!_Py_IsMainInterpreter(tstate)) { + /* Currently, the GIL is shared by all interpreters, + and only the main interpreter is responsible to create + and destroy it. */ + return; + } + + struct _gil_runtime_state *gil = &tstate->interp->runtime->ceval.gil; if (!gil_created(gil)) { + /* First Py_InitializeFromConfig() call: the GIL doesn't exist + yet: do nothing. */ return; } destroy_gil(gil); assert(!gil_created(gil)); - - struct _pending_calls *pending = &ceval->pending; - if (pending->lock != NULL) { - PyThread_free_lock(pending->lock); - pending->lock = NULL; - } } -static inline void -exit_thread_if_finalizing(_PyRuntimeState *runtime, PyThreadState *tstate) +void +PyEval_InitThreads(void) { - /* _Py_Finalizing is protected by the GIL */ - if (runtime->finalizing != NULL && !_Py_CURRENTLY_FINALIZING(runtime, tstate)) { - drop_gil(&runtime->ceval, tstate); - PyThread_exit_thread(); - } + /* Do nothing: kept for backward compatibility */ } void @@ -280,13 +350,10 @@ void PyEval_AcquireLock(void) { _PyRuntimeState *runtime = &_PyRuntime; - struct _ceval_runtime_state *ceval = &runtime->ceval; PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - if (tstate == NULL) { - Py_FatalError("PyEval_AcquireLock: current thread state is NULL"); - } - take_gil(ceval, tstate); - exit_thread_if_finalizing(runtime, tstate); + _Py_EnsureTstateNotNULL(tstate); + + take_gil(tstate); } void @@ -296,45 +363,49 @@ PyEval_ReleaseLock(void) PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); /* This function must succeed when the current thread state is NULL. We therefore avoid PyThreadState_Get() which dumps a fatal error - in debug mode. - */ - drop_gil(&runtime->ceval, tstate); + in debug mode. */ + struct _ceval_runtime_state *ceval = &runtime->ceval; + struct _ceval_state *ceval2 = &tstate->interp->ceval; + drop_gil(ceval, ceval2, tstate); +} + +void +_PyEval_ReleaseLock(PyThreadState *tstate) +{ + struct _ceval_runtime_state *ceval = &tstate->interp->runtime->ceval; + struct _ceval_state *ceval2 = &tstate->interp->ceval; + drop_gil(ceval, ceval2, tstate); } void PyEval_AcquireThread(PyThreadState *tstate) { - if (tstate == NULL) { - Py_FatalError("PyEval_AcquireThread: NULL new thread state"); - } + _Py_EnsureTstateNotNULL(tstate); - _PyRuntimeState *runtime = &_PyRuntime; - struct _ceval_runtime_state *ceval = &runtime->ceval; + take_gil(tstate); - /* Check someone has called PyEval_InitThreads() to create the lock */ - assert(gil_created(&ceval->gil)); - take_gil(ceval, tstate); - exit_thread_if_finalizing(runtime, tstate); - if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) { - Py_FatalError("PyEval_AcquireThread: non-NULL old thread state"); + struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate; + if (_PyThreadState_Swap(gilstate, tstate) != NULL) { + Py_FatalError("non-NULL old thread state"); } } void PyEval_ReleaseThread(PyThreadState *tstate) { - if (tstate == NULL) { - Py_FatalError("PyEval_ReleaseThread: NULL thread state"); - } + assert(is_tstate_valid(tstate)); - _PyRuntimeState *runtime = &_PyRuntime; + _PyRuntimeState *runtime = tstate->interp->runtime; PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL); if (new_tstate != tstate) { - Py_FatalError("PyEval_ReleaseThread: wrong thread state"); + Py_FatalError("wrong thread state"); } - drop_gil(&runtime->ceval, tstate); + struct _ceval_runtime_state *ceval = &runtime->ceval; + struct _ceval_state *ceval2 = &tstate->interp->ceval; + drop_gil(ceval, ceval2, tstate); } +#ifdef HAVE_FORK /* This function is called from PyOS_AfterFork_Child to destroy all threads * which are not running in the child process, and clear internal locks * which might be held by those threads. @@ -343,64 +414,60 @@ PyEval_ReleaseThread(PyThreadState *tstate) void _PyEval_ReInitThreads(_PyRuntimeState *runtime) { - struct _ceval_runtime_state *ceval = &runtime->ceval; - if (!gil_created(&ceval->gil)) { + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + _Py_EnsureTstateNotNULL(tstate); + + struct _gil_runtime_state *gil = &runtime->ceval.gil; + if (!gil_created(gil)) { return; } - recreate_gil(&ceval->gil); - PyThreadState *current_tstate = _PyRuntimeState_GetThreadState(runtime); - take_gil(ceval, current_tstate); + recreate_gil(gil); - struct _pending_calls *pending = &ceval->pending; - pending->lock = PyThread_allocate_lock(); - if (pending->lock == NULL) { + take_gil(tstate); + + struct _pending_calls *pending = &tstate->interp->ceval.pending; + if (_PyThread_at_fork_reinit(&pending->lock) < 0) { Py_FatalError("Can't initialize threads for pending calls"); } /* Destroy all threads except the current one */ - _PyThreadState_DeleteExcept(runtime, current_tstate); + _PyThreadState_DeleteExcept(runtime, tstate); } +#endif /* This function is used to signal that async exceptions are waiting to be raised. */ void -_PyEval_SignalAsyncExc(struct _ceval_runtime_state *ceval) +_PyEval_SignalAsyncExc(PyThreadState *tstate) { - SIGNAL_ASYNC_EXC(ceval); + assert(is_tstate_valid(tstate)); + SIGNAL_ASYNC_EXC(tstate->interp); } PyThreadState * PyEval_SaveThread(void) { _PyRuntimeState *runtime = &_PyRuntime; - struct _ceval_runtime_state *ceval = &runtime->ceval; PyThreadState *tstate = _PyThreadState_Swap(&runtime->gilstate, NULL); - if (tstate == NULL) { - Py_FatalError("PyEval_SaveThread: NULL tstate"); - } + _Py_EnsureTstateNotNULL(tstate); + + struct _ceval_runtime_state *ceval = &runtime->ceval; + struct _ceval_state *ceval2 = &tstate->interp->ceval; assert(gil_created(&ceval->gil)); - drop_gil(ceval, tstate); + drop_gil(ceval, ceval2, tstate); return tstate; } void PyEval_RestoreThread(PyThreadState *tstate) { - _PyRuntimeState *runtime = &_PyRuntime; - struct _ceval_runtime_state *ceval = &runtime->ceval; - - if (tstate == NULL) { - Py_FatalError("PyEval_RestoreThread: NULL tstate"); - } - assert(gil_created(&ceval->gil)); + _Py_EnsureTstateNotNULL(tstate); - int err = errno; - take_gil(ceval, tstate); - exit_thread_if_finalizing(runtime, tstate); - errno = err; + take_gil(tstate); - _PyThreadState_Swap(&runtime->gilstate, tstate); + struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate; + _PyThreadState_Swap(gilstate, tstate); } @@ -427,12 +494,24 @@ PyEval_RestoreThread(PyThreadState *tstate) */ void -_PyEval_SignalReceived(struct _ceval_runtime_state *ceval) +_PyEval_SignalReceived(PyInterpreterState *interp) { +#ifdef MS_WINDOWS + // bpo-42296: On Windows, _PyEval_SignalReceived() is called from a signal + // handler which can run in a thread different than the Python thread, in + // which case _Py_ThreadCanHandleSignals() is wrong. Ignore + // _Py_ThreadCanHandleSignals() and always set eval_breaker to 1. + // + // The next eval_frame_handle_pending() call will call + // _Py_ThreadCanHandleSignals() to recompute eval_breaker. + int force = 1; +#else + int force = 0; +#endif /* bpo-30703: Function called when the C signal handler of Python gets a - signal. We cannot queue a callback using Py_AddPendingCall() since + signal. We cannot queue a callback using _PyEval_AddPendingCall() since that function is not async-signal-safe. */ - SIGNAL_PENDING_SIGNALS(ceval); + SIGNAL_PENDING_SIGNALS(interp, force); } /* Push one item onto the queue while holding the lock. */ @@ -472,91 +551,96 @@ _pop_pending_call(struct _pending_calls *pending, */ int -_PyEval_AddPendingCall(PyThreadState *tstate, - struct _ceval_runtime_state *ceval, +_PyEval_AddPendingCall(PyInterpreterState *interp, int (*func)(void *), void *arg) { - struct _pending_calls *pending = &ceval->pending; + struct _pending_calls *pending = &interp->ceval.pending; - PyThread_acquire_lock(pending->lock, WAIT_LOCK); - if (pending->finishing) { - PyThread_release_lock(pending->lock); + /* Ensure that _PyEval_InitPendingCalls() was called + and that _PyEval_FiniPendingCalls() is not called yet. */ + assert(pending->lock != NULL); - PyObject *exc, *val, *tb; - _PyErr_Fetch(tstate, &exc, &val, &tb); - _PyErr_SetString(tstate, PyExc_SystemError, - "Py_AddPendingCall: cannot add pending calls " - "(Python shutting down)"); - _PyErr_Print(tstate); - _PyErr_Restore(tstate, exc, val, tb); - return -1; - } + PyThread_acquire_lock(pending->lock, WAIT_LOCK); int result = _push_pending_call(pending, func, arg); PyThread_release_lock(pending->lock); /* signal main loop */ - SIGNAL_PENDING_CALLS(ceval); + SIGNAL_PENDING_CALLS(interp); return result; } int Py_AddPendingCall(int (*func)(void *), void *arg) { - _PyRuntimeState *runtime = &_PyRuntime; - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - return _PyEval_AddPendingCall(tstate, &runtime->ceval, func, arg); + /* Best-effort to support subinterpreters and calls with the GIL released. + + First attempt _PyThreadState_GET() since it supports subinterpreters. + + If the GIL is released, _PyThreadState_GET() returns NULL . In this + case, use PyGILState_GetThisThreadState() which works even if the GIL + is released. + + Sadly, PyGILState_GetThisThreadState() doesn't support subinterpreters: + see bpo-10915 and bpo-15751. + + Py_AddPendingCall() doesn't require the caller to hold the GIL. */ + PyThreadState *tstate = _PyThreadState_GET(); + if (tstate == NULL) { + tstate = PyGILState_GetThisThreadState(); + } + + PyInterpreterState *interp; + if (tstate != NULL) { + interp = tstate->interp; + } + else { + /* Last resort: use the main interpreter */ + interp = _PyRuntime.interpreters.main; + } + return _PyEval_AddPendingCall(interp, func, arg); } static int -handle_signals(_PyRuntimeState *runtime) +handle_signals(PyThreadState *tstate) { - /* Only handle signals on main thread. PyEval_InitThreads must - * have been called already. - */ - if (PyThread_get_thread_ident() != runtime->main_thread) { - return 0; - } - /* - * Ensure that the thread isn't currently running some other - * interpreter. - */ - PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp; - if (interp != runtime->interpreters.main) { + assert(is_tstate_valid(tstate)); + if (!_Py_ThreadCanHandleSignals(tstate->interp)) { return 0; } - struct _ceval_runtime_state *ceval = &runtime->ceval; - UNSIGNAL_PENDING_SIGNALS(ceval); - if (_PyErr_CheckSignals() < 0) { - SIGNAL_PENDING_SIGNALS(ceval); /* We're not done yet */ + UNSIGNAL_PENDING_SIGNALS(tstate->interp); + if (_PyErr_CheckSignalsTstate(tstate) < 0) { + /* On failure, re-schedule a call to handle_signals(). */ + SIGNAL_PENDING_SIGNALS(tstate->interp, 0); return -1; } return 0; } static int -make_pending_calls(_PyRuntimeState *runtime) +make_pending_calls(PyThreadState *tstate) { - static int busy = 0; + assert(is_tstate_valid(tstate)); - /* only service pending calls on main thread */ - if (PyThread_get_thread_ident() != runtime->main_thread) { + /* only execute pending calls on main thread */ + if (!_Py_ThreadCanHandlePendingCalls()) { return 0; } /* don't perform recursive pending calls */ + static int busy = 0; if (busy) { return 0; } busy = 1; - struct _ceval_runtime_state *ceval = &runtime->ceval; + /* unsignal before starting to call callbacks, so that any callback added in-between re-signals */ - UNSIGNAL_PENDING_CALLS(ceval); + UNSIGNAL_PENDING_CALLS(tstate->interp); int res = 0; /* perform a bounded number of calls, in case of recursion */ - struct _pending_calls *pending = &ceval->pending; + struct _pending_calls *pending = &tstate->interp->ceval.pending; for (int i=0; iinterp); return res; } void -_Py_FinishPendingCalls(_PyRuntimeState *runtime) +_Py_FinishPendingCalls(PyThreadState *tstate) { assert(PyGILState_Check()); - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - struct _pending_calls *pending = &runtime->ceval.pending; - - PyThread_acquire_lock(pending->lock, WAIT_LOCK); - pending->finishing = 1; - PyThread_release_lock(pending->lock); + struct _pending_calls *pending = &tstate->interp->ceval.pending; if (!_Py_atomic_load_relaxed(&(pending->calls_to_do))) { return; } - if (make_pending_calls(runtime) < 0) { + if (make_pending_calls(tstate) < 0) { PyObject *exc, *val, *tb; _PyErr_Fetch(tstate, &exc, &val, &tb); PyErr_BadInternalCall(); @@ -617,15 +696,16 @@ Py_MakePendingCalls(void) { assert(PyGILState_Check()); + PyThreadState *tstate = _PyThreadState_GET(); + /* Python signal handler doesn't really queue a callback: it only signals that a signal was received, see _PyEval_SignalReceived(). */ - _PyRuntimeState *runtime = &_PyRuntime; - int res = handle_signals(runtime); + int res = handle_signals(tstate); if (res != 0) { return res; } - res = make_pending_calls(runtime); + res = make_pending_calls(tstate); if (res != 0) { return res; } @@ -642,38 +722,64 @@ Py_MakePendingCalls(void) int _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT; void -_PyEval_Initialize(struct _ceval_runtime_state *state) +_PyEval_InitRuntimeState(struct _ceval_runtime_state *ceval) { - state->recursion_limit = Py_DEFAULT_RECURSION_LIMIT; _Py_CheckRecursionLimit = Py_DEFAULT_RECURSION_LIMIT; - _gil_initialize(&state->gil); + _gil_initialize(&ceval->gil); +} + +int +_PyEval_InitState(struct _ceval_state *ceval) +{ + ceval->recursion_limit = Py_DEFAULT_RECURSION_LIMIT; + + struct _pending_calls *pending = &ceval->pending; + assert(pending->lock == NULL); + + pending->lock = PyThread_allocate_lock(); + if (pending->lock == NULL) { + return -1; + } + + return 0; +} + +void +_PyEval_FiniState(struct _ceval_state *ceval) +{ + struct _pending_calls *pending = &ceval->pending; + if (pending->lock != NULL) { + PyThread_free_lock(pending->lock); + pending->lock = NULL; + } } int Py_GetRecursionLimit(void) { - return _PyRuntime.ceval.recursion_limit; + PyThreadState *tstate = _PyThreadState_GET(); + return tstate->interp->ceval.recursion_limit; } void Py_SetRecursionLimit(int new_limit) { - struct _ceval_runtime_state *ceval = &_PyRuntime.ceval; - ceval->recursion_limit = new_limit; - _Py_CheckRecursionLimit = ceval->recursion_limit; + PyThreadState *tstate = _PyThreadState_GET(); + tstate->interp->ceval.recursion_limit = new_limit; + if (_Py_IsMainInterpreter(tstate)) { + _Py_CheckRecursionLimit = new_limit; + } } -/* the macro Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall() +/* The function _Py_EnterRecursiveCall() only calls _Py_CheckRecursiveCall() if the recursion_depth reaches _Py_CheckRecursionLimit. If USE_STACKCHECK, the macro decrements _Py_CheckRecursionLimit to guarantee that _Py_CheckRecursiveCall() is regularly called. Without USE_STACKCHECK, there is no need for this. */ int -_Py_CheckRecursiveCall(const char *where) +_Py_CheckRecursiveCall(PyThreadState *tstate, const char *where) { - _PyRuntimeState *runtime = &_PyRuntime; - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - int recursion_limit = runtime->ceval.recursion_limit; + int recursion_limit = tstate->interp->ceval.recursion_limit; #ifdef USE_STACKCHECK tstate->stackcheck_counter = 0; @@ -682,8 +788,10 @@ _Py_CheckRecursiveCall(const char *where) _PyErr_SetString(tstate, PyExc_MemoryError, "Stack overflow"); return -1; } - /* Needed for ABI backwards-compatibility (see bpo-31857) */ - _Py_CheckRecursionLimit = recursion_limit; + if (_Py_IsMainInterpreter(tstate)) { + /* Needed for ABI backwards-compatibility (see bpo-31857) */ + _Py_CheckRecursionLimit = recursion_limit; + } #endif if (tstate->recursion_critical) /* Somebody asked that we don't check for recursion. */ @@ -727,23 +835,90 @@ PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals) /* Interpreter main loop */ PyObject * -PyEval_EvalFrame(PyFrameObject *f) { - /* This is for backward compatibility with extension modules that - used this API; core interpreter code should call - PyEval_EvalFrameEx() */ - return PyEval_EvalFrameEx(f, 0); +PyEval_EvalFrame(PyFrameObject *f) +{ + /* Function kept for backward compatibility */ + PyThreadState *tstate = _PyThreadState_GET(); + return _PyEval_EvalFrame(tstate, f, 0); } PyObject * PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - return interp->eval_frame(f, throwflag); + PyThreadState *tstate = _PyThreadState_GET(); + return _PyEval_EvalFrame(tstate, f, throwflag); +} + + +/* Handle signals, pending calls, GIL drop request + and asynchronous exception */ +static int +eval_frame_handle_pending(PyThreadState *tstate) +{ + _PyRuntimeState * const runtime = &_PyRuntime; + struct _ceval_runtime_state *ceval = &runtime->ceval; + + /* Pending signals */ + if (_Py_atomic_load_relaxed(&ceval->signals_pending)) { + if (handle_signals(tstate) != 0) { + return -1; + } + } + + /* Pending calls */ + struct _ceval_state *ceval2 = &tstate->interp->ceval; + if (_Py_atomic_load_relaxed(&ceval2->pending.calls_to_do)) { + if (make_pending_calls(tstate) != 0) { + return -1; + } + } + + /* GIL drop request */ + if (_Py_atomic_load_relaxed(&ceval2->gil_drop_request)) { + /* Give another thread a chance */ + if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) { + Py_FatalError("tstate mix-up"); + } + drop_gil(ceval, ceval2, tstate); + + /* Other threads may run now */ + + take_gil(tstate); + + if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) { + Py_FatalError("orphan tstate"); + } + } + + /* Check for asynchronous exception. */ + if (tstate->async_exc != NULL) { + PyObject *exc = tstate->async_exc; + tstate->async_exc = NULL; + UNSIGNAL_ASYNC_EXC(tstate->interp); + _PyErr_SetNone(tstate, exc); + Py_DECREF(exc); + return -1; + } + +#ifdef MS_WINDOWS + // bpo-42296: On Windows, _PyEval_SignalReceived() can be called in a + // different thread than the Python thread, in which case + // _Py_ThreadCanHandleSignals() is wrong. Recompute eval_breaker in the + // current Python thread with the correct _Py_ThreadCanHandleSignals() + // value. It prevents to interrupt the eval loop at every instruction if + // the current Python thread cannot handle signals (if + // _Py_ThreadCanHandleSignals() is false). + COMPUTE_EVAL_BREAKER(tstate->interp, ceval, ceval2); +#endif + + return 0; } PyObject* _Py_HOT_FUNCTION -_PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) +_PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) { + _Py_EnsureTstateNotNULL(tstate); + #ifdef DXPAIRS int lastopcode = 0; #endif @@ -753,10 +928,8 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) int oparg; /* Current opcode argument, if any */ PyObject **fastlocals, **freevars; PyObject *retval = NULL; /* Return value */ - _PyRuntimeState * const runtime = &_PyRuntime; - PyThreadState * const tstate = _PyRuntimeState_GetThreadState(runtime); - struct _ceval_runtime_state * const ceval = &runtime->ceval; - _Py_atomic_int * const eval_breaker = &ceval->eval_breaker; + struct _ceval_state * const ceval2 = &tstate->interp->ceval; + _Py_atomic_int * const eval_breaker = &ceval2->eval_breaker; PyCodeObject *co; /* when tracing we set things up so that @@ -844,7 +1017,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) #ifdef LLTRACE #define FAST_DISPATCH() \ { \ - if (!lltrace && !_Py_TracingPossible(ceval) && !PyDTrace_LINE_ENABLED()) { \ + if (!lltrace && !_Py_TracingPossible(ceval2) && !PyDTrace_LINE_ENABLED()) { \ f->f_lasti = INSTR_OFFSET(); \ NEXTOPARG(); \ goto *opcode_targets[opcode]; \ @@ -854,7 +1027,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) #else #define FAST_DISPATCH() \ { \ - if (!_Py_TracingPossible(ceval) && !PyDTrace_LINE_ENABLED()) { \ + if (!_Py_TracingPossible(ceval2) && !PyDTrace_LINE_ENABLED()) { \ f->f_lasti = INSTR_OFFSET(); \ NEXTOPARG(); \ goto *opcode_targets[opcode]; \ @@ -926,21 +1099,23 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) */ +#define PREDICT_ID(op) PRED_##op + #if defined(DYNAMIC_EXECUTION_PROFILE) || USE_COMPUTED_GOTOS -#define PREDICT(op) if (0) goto PRED_##op +#define PREDICT(op) if (0) goto PREDICT_ID(op) #else #define PREDICT(op) \ - do{ \ + do { \ _Py_CODEUNIT word = *next_instr; \ opcode = _Py_OPCODE(word); \ - if (opcode == op){ \ + if (opcode == op) { \ oparg = _Py_OPARG(word); \ next_instr++; \ - goto PRED_##op; \ + goto PREDICT_ID(op); \ } \ } while(0) #endif -#define PREDICTED(op) PRED_##op: +#define PREDICTED(op) PREDICT_ID(op): /* Stack manipulation macros */ @@ -1077,8 +1252,9 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) /* Start of code */ /* push frame */ - if (Py_EnterRecursiveCall("")) + if (_Py_EnterRecursiveCall(tstate, "")) { return NULL; + } tstate->frame = f; @@ -1178,7 +1354,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) goto error; #ifdef Py_DEBUG - /* PyEval_EvalFrameEx() must not be called with an exception set, + /* _PyEval_EvalFrameDefault() must not be called with an exception set, because it can clear it (directly or indirectly) and so the caller loses its exception */ assert(!_PyErr_Occurred(tstate)); @@ -1193,7 +1369,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) /* Do periodic things. Doing this every time through the loop would add too much overhead, so we do it only every Nth instruction. We also do it if - ``pendingcalls_to_do'' is set, i.e. when an asynchronous + ``pending.calls_to_do'' is set, i.e. when an asynchronous event needs attention (e.g. a signal handler or async I/O handler); see Py_AddPendingCall() and Py_MakePendingCalls() above. */ @@ -1223,42 +1399,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) goto fast_next_opcode; } - if (_Py_atomic_load_relaxed(&ceval->signals_pending)) { - if (handle_signals(runtime) != 0) { - goto error; - } - } - if (_Py_atomic_load_relaxed(&ceval->pending.calls_to_do)) { - if (make_pending_calls(runtime) != 0) { - goto error; - } - } - - if (_Py_atomic_load_relaxed(&ceval->gil_drop_request)) { - /* Give another thread a chance */ - if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) { - Py_FatalError("ceval: tstate mix-up"); - } - drop_gil(ceval, tstate); - - /* Other threads may run now */ - - take_gil(ceval, tstate); - - /* Check if we should make a quick exit. */ - exit_thread_if_finalizing(runtime, tstate); - - if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) { - Py_FatalError("ceval: orphan tstate"); - } - } - /* Check for asynchronous exceptions. */ - if (tstate->async_exc != NULL) { - PyObject *exc = tstate->async_exc; - tstate->async_exc = NULL; - UNSIGNAL_ASYNC_EXC(ceval); - _PyErr_SetNone(tstate, exc); - Py_DECREF(exc); + if (eval_frame_handle_pending(tstate) != 0) { goto error; } } @@ -1271,7 +1412,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) /* line-by-line tracing support */ - if (_Py_TracingPossible(ceval) && + if (_Py_TracingPossible(ceval2) && tstate->c_tracefunc != NULL && !tstate->tracing) { int err; /* see maybe_call_line_trace @@ -1878,7 +2019,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) Py_DECREF(value); goto error; } - res = PyObject_CallFunctionObjArgs(hook, value, NULL); + res = PyObject_CallOneArg(hook, value); Py_DECREF(value); if (res == NULL) goto error; @@ -1911,7 +2052,8 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) case TARGET(RETURN_VALUE): { retval = POP(); assert(f->f_iblock == 0); - goto exit_returning; + assert(EMPTY()); + goto exiting; } case TARGET(GET_AITER): { @@ -2015,7 +2157,12 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PyObject *iter = _PyCoro_GetAwaitableIter(iterable); if (iter == NULL) { + int opcode_at_minus_3 = 0; + if ((next_instr - first_instr) > 2) { + opcode_at_minus_3 = _Py_OPCODE(next_instr[-3]); + } format_awaitable_error(tstate, Py_TYPE(iterable), + opcode_at_minus_3, _Py_OPCODE(next_instr[-2])); } @@ -2056,7 +2203,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) if (v == Py_None) retval = Py_TYPE(receiver)->tp_iternext(receiver); else - retval = _PyObject_CallMethodIdObjArgs(receiver, &PyId_send, v, NULL); + retval = _PyObject_CallMethodIdOneArg(receiver, &PyId_send, v); } Py_DECREF(v); if (retval == NULL) { @@ -2076,7 +2223,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) /* and repeat... */ assert(f->f_lasti >= (int)sizeof(_Py_CODEUNIT)); f->f_lasti -= sizeof(_Py_CODEUNIT); - goto exit_yielding; + goto exiting; } case TARGET(YIELD_VALUE): { @@ -2093,7 +2240,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } f->f_stacktop = stack_pointer; - goto exit_yielding; + goto exiting; } case TARGET(POP_EXCEPT): { @@ -2126,104 +2273,13 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) DISPATCH(); } - case TARGET(POP_FINALLY): { - /* If oparg is 0 at the top of the stack are 1 or 6 values: - Either: - - TOP = NULL or an integer - or: - - (TOP, SECOND, THIRD) = exc_info() - - (FOURTH, FITH, SIXTH) = previous exception for EXCEPT_HANDLER - - If oparg is 1 the value for 'return' was additionally pushed - at the top of the stack. - */ - PyObject *res = NULL; - if (oparg) { - res = POP(); - } - PyObject *exc = POP(); - if (exc == NULL || PyLong_CheckExact(exc)) { - Py_XDECREF(exc); - } - else { - Py_DECREF(exc); - Py_DECREF(POP()); - Py_DECREF(POP()); - - PyObject *type, *value, *traceback; - _PyErr_StackItem *exc_info; - PyTryBlock *b = PyFrame_BlockPop(f); - if (b->b_type != EXCEPT_HANDLER) { - _PyErr_SetString(tstate, PyExc_SystemError, - "popped block is not an except handler"); - Py_XDECREF(res); - goto error; - } - assert(STACK_LEVEL() == (b)->b_level + 3); - exc_info = tstate->exc_info; - type = exc_info->exc_type; - value = exc_info->exc_value; - traceback = exc_info->exc_traceback; - exc_info->exc_type = POP(); - exc_info->exc_value = POP(); - exc_info->exc_traceback = POP(); - Py_XDECREF(type); - Py_XDECREF(value); - Py_XDECREF(traceback); - } - if (oparg) { - PUSH(res); - } - DISPATCH(); - } - - case TARGET(CALL_FINALLY): { - PyObject *ret = PyLong_FromLong(INSTR_OFFSET()); - if (ret == NULL) { - goto error; - } - PUSH(ret); - JUMPBY(oparg); - FAST_DISPATCH(); - } - - case TARGET(BEGIN_FINALLY): { - /* Push NULL onto the stack for using it in END_FINALLY, - POP_FINALLY, WITH_CLEANUP_START and WITH_CLEANUP_FINISH. - */ - PUSH(NULL); - FAST_DISPATCH(); - } - - case TARGET(END_FINALLY): { - PREDICTED(END_FINALLY); - /* At the top of the stack are 1 or 6 values: - Either: - - TOP = NULL or an integer - or: - - (TOP, SECOND, THIRD) = exc_info() - - (FOURTH, FITH, SIXTH) = previous exception for EXCEPT_HANDLER - */ + case TARGET(RERAISE): { PyObject *exc = POP(); - if (exc == NULL) { - FAST_DISPATCH(); - } - else if (PyLong_CheckExact(exc)) { - int ret = _PyLong_AsInt(exc); - Py_DECREF(exc); - if (ret == -1 && _PyErr_Occurred(tstate)) { - goto error; - } - JUMPTO(ret); - FAST_DISPATCH(); - } - else { - assert(PyExceptionClass_Check(exc)); - PyObject *val = POP(); - PyObject *tb = POP(); - _PyErr_Restore(tstate, exc, val, tb); - goto exception_unwind; - } + PyObject *val = POP(); + PyObject *tb = POP(); + assert(PyExceptionClass_Check(exc)); + _PyErr_Restore(tstate, exc, val, tb); + goto exception_unwind; } case TARGET(END_ASYNC_FOR): { @@ -2246,6 +2302,13 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } } + case TARGET(LOAD_ASSERTION_ERROR): { + PyObject *value = PyExc_AssertionError; + Py_INCREF(value); + PUSH(value); + FAST_DISPATCH(); + } + case TARGET(LOAD_BUILD_CLASS): { _Py_IDENTIFIER(__build_class__); @@ -2698,46 +2761,46 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) DISPATCH(); } - case TARGET(BUILD_TUPLE_UNPACK_WITH_CALL): - case TARGET(BUILD_TUPLE_UNPACK): - case TARGET(BUILD_LIST_UNPACK): { - int convert_to_tuple = opcode != BUILD_LIST_UNPACK; - Py_ssize_t i; - PyObject *sum = PyList_New(0); - PyObject *return_value; - - if (sum == NULL) + case TARGET(LIST_TO_TUPLE): { + PyObject *list = POP(); + PyObject *tuple = PyList_AsTuple(list); + Py_DECREF(list); + if (tuple == NULL) { goto error; + } + PUSH(tuple); + DISPATCH(); + } - for (i = oparg; i > 0; i--) { - PyObject *none_val; - - none_val = _PyList_Extend((PyListObject *)sum, PEEK(i)); - if (none_val == NULL) { - if (opcode == BUILD_TUPLE_UNPACK_WITH_CALL && - _PyErr_ExceptionMatches(tstate, PyExc_TypeError)) - { - check_args_iterable(tstate, PEEK(1 + oparg), PEEK(i)); - } - Py_DECREF(sum); - goto error; + case TARGET(LIST_EXTEND): { + PyObject *iterable = POP(); + PyObject *list = PEEK(oparg); + PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable); + if (none_val == NULL) { + if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) && + (Py_TYPE(iterable)->tp_iter == NULL && !PySequence_Check(iterable))) + { + _PyErr_Clear(tstate); + _PyErr_Format(tstate, PyExc_TypeError, + "Value after * must be an iterable, not %.200s", + Py_TYPE(iterable)->tp_name); } - Py_DECREF(none_val); + Py_DECREF(iterable); + goto error; } + Py_DECREF(none_val); + Py_DECREF(iterable); + DISPATCH(); + } - if (convert_to_tuple) { - return_value = PyList_AsTuple(sum); - Py_DECREF(sum); - if (return_value == NULL) - goto error; - } - else { - return_value = sum; + case TARGET(SET_UPDATE): { + PyObject *iterable = POP(); + PyObject *set = PEEK(oparg); + int err = _PySet_Update(set, iterable); + Py_DECREF(iterable); + if (err < 0) { + goto error; } - - while (oparg--) - Py_DECREF(POP()); - PUSH(return_value); DISPATCH(); } @@ -2751,33 +2814,14 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PyObject *item = PEEK(i); if (err == 0) err = PySet_Add(set, item); - Py_DECREF(item); - } - STACK_SHRINK(oparg); - if (err != 0) { - Py_DECREF(set); - goto error; - } - PUSH(set); - DISPATCH(); - } - - case TARGET(BUILD_SET_UNPACK): { - Py_ssize_t i; - PyObject *sum = PySet_New(NULL); - if (sum == NULL) + Py_DECREF(item); + } + STACK_SHRINK(oparg); + if (err != 0) { + Py_DECREF(set); goto error; - - for (i = oparg; i > 0; i--) { - if (_PySet_Update(sum, PEEK(i)) < 0) { - Py_DECREF(sum); - goto error; - } } - - while (oparg--) - Py_DECREF(POP()); - PUSH(sum); + PUSH(set); DISPATCH(); } @@ -2897,49 +2941,33 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) DISPATCH(); } - case TARGET(BUILD_MAP_UNPACK): { - Py_ssize_t i; - PyObject *sum = PyDict_New(); - if (sum == NULL) - goto error; - - for (i = oparg; i > 0; i--) { - PyObject *arg = PEEK(i); - if (PyDict_Update(sum, arg) < 0) { - if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { - _PyErr_Format(tstate, PyExc_TypeError, - "'%.200s' object is not a mapping", - arg->ob_type->tp_name); - } - Py_DECREF(sum); - goto error; + case TARGET(DICT_UPDATE): { + PyObject *update = POP(); + PyObject *dict = PEEK(oparg); + if (PyDict_Update(dict, update) < 0) { + if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { + _PyErr_Format(tstate, PyExc_TypeError, + "'%.200s' object is not a mapping", + Py_TYPE(update)->tp_name); } + Py_DECREF(update); + goto error; } - - while (oparg--) - Py_DECREF(POP()); - PUSH(sum); + Py_DECREF(update); DISPATCH(); } - case TARGET(BUILD_MAP_UNPACK_WITH_CALL): { - Py_ssize_t i; - PyObject *sum = PyDict_New(); - if (sum == NULL) - goto error; + case TARGET(DICT_MERGE): { + PyObject *update = POP(); + PyObject *dict = PEEK(oparg); - for (i = oparg; i > 0; i--) { - PyObject *arg = PEEK(i); - if (_PyDict_MergeEx(sum, arg, 2) < 0) { - Py_DECREF(sum); - format_kwargs_error(tstate, PEEK(2 + oparg), arg); - goto error; - } + if (_PyDict_MergeEx(dict, update, 2) < 0) { + format_kwargs_error(tstate, PEEK(2 + oparg), update); + Py_DECREF(update); + goto error; } - - while (oparg--) - Py_DECREF(POP()); - PUSH(sum); + Py_DECREF(update); + PREDICT(CALL_FUNCTION_EX); DISPATCH(); } @@ -2972,12 +3000,13 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } case TARGET(COMPARE_OP): { + assert(oparg <= Py_GE); PyObject *right = POP(); PyObject *left = TOP(); - PyObject *res = cmp_outcome(tstate, oparg, left, right); + PyObject *res = PyObject_RichCompare(left, right, oparg); + SET_TOP(res); Py_DECREF(left); Py_DECREF(right); - SET_TOP(res); if (res == NULL) goto error; PREDICT(POP_JUMP_IF_FALSE); @@ -2985,6 +3014,81 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) DISPATCH(); } + case TARGET(IS_OP): { + PyObject *right = POP(); + PyObject *left = TOP(); + int res = (left == right)^oparg; + PyObject *b = res ? Py_True : Py_False; + Py_INCREF(b); + SET_TOP(b); + Py_DECREF(left); + Py_DECREF(right); + PREDICT(POP_JUMP_IF_FALSE); + PREDICT(POP_JUMP_IF_TRUE); + FAST_DISPATCH(); + } + + case TARGET(CONTAINS_OP): { + PyObject *right = POP(); + PyObject *left = POP(); + int res = PySequence_Contains(right, left); + Py_DECREF(left); + Py_DECREF(right); + if (res < 0) { + goto error; + } + PyObject *b = (res^oparg) ? Py_True : Py_False; + Py_INCREF(b); + PUSH(b); + PREDICT(POP_JUMP_IF_FALSE); + PREDICT(POP_JUMP_IF_TRUE); + FAST_DISPATCH(); + } + +#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\ + "BaseException is not allowed" + + case TARGET(JUMP_IF_NOT_EXC_MATCH): { + PyObject *right = POP(); + PyObject *left = POP(); + if (PyTuple_Check(right)) { + Py_ssize_t i, length; + length = PyTuple_GET_SIZE(right); + for (i = 0; i < length; i++) { + PyObject *exc = PyTuple_GET_ITEM(right, i); + if (!PyExceptionClass_Check(exc)) { + _PyErr_SetString(tstate, PyExc_TypeError, + CANNOT_CATCH_MSG); + Py_DECREF(left); + Py_DECREF(right); + goto error; + } + } + } + else { + if (!PyExceptionClass_Check(right)) { + _PyErr_SetString(tstate, PyExc_TypeError, + CANNOT_CATCH_MSG); + Py_DECREF(left); + Py_DECREF(right); + goto error; + } + } + int res = PyErr_GivenExceptionMatches(left, right); + Py_DECREF(left); + Py_DECREF(right); + if (res > 0) { + /* Exception matches -- Do nothing */; + } + else if (res == 0) { + JUMPTO(oparg); + } + else { + goto error; + } + DISPATCH(); + } + case TARGET(IMPORT_NAME): { PyObject *name = GETITEM(names, oparg); PyObject *fromlist = POP(); @@ -3199,7 +3303,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PREDICTED(FOR_ITER); /* before: [iter]; after: [iter, iter()] *or* [] */ PyObject *iter = TOP(); - PyObject *next = (*iter->ob_type->tp_iternext)(iter); + PyObject *next = (*Py_TYPE(iter)->tp_iternext)(iter); if (next != NULL) { PUSH(next); PREDICT(STORE_FAST); @@ -3224,31 +3328,27 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } case TARGET(SETUP_FINALLY): { - /* NOTE: If you add any new block-setup opcodes that - are not try/except/finally handlers, you may need - to update the PyGen_NeedsFinalizing() function. - */ - PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg, STACK_LEVEL()); DISPATCH(); } case TARGET(BEFORE_ASYNC_WITH): { - _Py_IDENTIFIER(__aexit__); _Py_IDENTIFIER(__aenter__); - + _Py_IDENTIFIER(__aexit__); PyObject *mgr = TOP(); - PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__), - *enter; + PyObject *enter = special_lookup(tstate, mgr, &PyId___aenter__); PyObject *res; - if (exit == NULL) + if (enter == NULL) { + goto error; + } + PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__); + if (exit == NULL) { + Py_DECREF(enter); goto error; + } SET_TOP(exit); - enter = special_lookup(tstate, mgr, &PyId___aenter__); Py_DECREF(mgr); - if (enter == NULL) - goto error; res = _PyObject_CallNoArg(enter); Py_DECREF(enter); if (res == NULL) @@ -3269,8 +3369,8 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } case TARGET(SETUP_WITH): { - _Py_IDENTIFIER(__exit__); _Py_IDENTIFIER(__enter__); + _Py_IDENTIFIER(__exit__); PyObject *mgr = TOP(); PyObject *enter = special_lookup(tstate, mgr, &PyId___enter__); PyObject *res; @@ -3297,113 +3397,31 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) DISPATCH(); } - case TARGET(WITH_CLEANUP_START): { - /* At the top of the stack are 1 or 6 values indicating - how/why we entered the finally clause: - - TOP = NULL + case TARGET(WITH_EXCEPT_START): { + /* At the top of the stack are 7 values: - (TOP, SECOND, THIRD) = exc_info() - (FOURTH, FITH, SIXTH) = previous exception for EXCEPT_HANDLER - Below them is EXIT, the context.__exit__ or context.__aexit__ - bound method. - In the first case, we must call - EXIT(None, None, None) - otherwise we must call - EXIT(TOP, SECOND, THIRD) - - In the first case, we remove EXIT from the - stack, leaving TOP, and push TOP on the stack. - Otherwise we shift the bottom 3 values of the - stack down, replace the empty spot with NULL, and push - None on the stack. - - Finally we push the result of the call. + - (FOURTH, FIFTH, SIXTH) = previous exception for EXCEPT_HANDLER + - SEVENTH: the context.__exit__ bound method + We call SEVENTH(TOP, SECOND, THIRD). + Then we push again the TOP exception and the __exit__ + return value. */ - PyObject *stack[3]; PyObject *exit_func; PyObject *exc, *val, *tb, *res; - val = tb = Py_None; exc = TOP(); - if (exc == NULL) { - STACK_SHRINK(1); - exit_func = TOP(); - SET_TOP(exc); - exc = Py_None; - } - else { - assert(PyExceptionClass_Check(exc)); - PyObject *tp2, *exc2, *tb2; - PyTryBlock *block; - val = SECOND(); - tb = THIRD(); - tp2 = FOURTH(); - exc2 = PEEK(5); - tb2 = PEEK(6); - exit_func = PEEK(7); - SET_VALUE(7, tb2); - SET_VALUE(6, exc2); - SET_VALUE(5, tp2); - /* UNWIND_EXCEPT_HANDLER will pop this off. */ - SET_FOURTH(NULL); - /* We just shifted the stack down, so we have - to tell the except handler block that the - values are lower than it expects. */ - assert(f->f_iblock > 0); - block = &f->f_blockstack[f->f_iblock - 1]; - assert(block->b_type == EXCEPT_HANDLER); - assert(block->b_level > 0); - block->b_level--; - } - - stack[0] = exc; - stack[1] = val; - stack[2] = tb; - res = _PyObject_FastCall(exit_func, stack, 3); - Py_DECREF(exit_func); + val = SECOND(); + tb = THIRD(); + assert(exc != Py_None); + assert(!PyLong_Check(exc)); + exit_func = PEEK(7); + PyObject *stack[4] = {NULL, exc, val, tb}; + res = PyObject_Vectorcall(exit_func, stack + 1, + 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); if (res == NULL) goto error; - Py_INCREF(exc); /* Duplicating the exception on the stack */ - PUSH(exc); PUSH(res); - PREDICT(WITH_CLEANUP_FINISH); - DISPATCH(); - } - - case TARGET(WITH_CLEANUP_FINISH): { - PREDICTED(WITH_CLEANUP_FINISH); - /* TOP = the result of calling the context.__exit__ bound method - SECOND = either None or exception type - - If SECOND is None below is NULL or the return address, - otherwise below are 7 values representing an exception. - */ - PyObject *res = POP(); - PyObject *exc = POP(); - int err; - - if (exc != Py_None) - err = PyObject_IsTrue(res); - else - err = 0; - - Py_DECREF(res); - Py_DECREF(exc); - - if (err < 0) - goto error; - else if (err > 0) { - /* There was an exception and a True return. - * We must manually unwind the EXCEPT_HANDLER block - * which was created when the exception was caught, - * otherwise the stack will be in an inconsistent state. - */ - PyTryBlock *b = PyFrame_BlockPop(f); - assert(b->b_type == EXCEPT_HANDLER); - UNWIND_EXCEPT_HANDLER(b); - PUSH(NULL); - } - PREDICT(END_FINALLY); DISPATCH(); } @@ -3510,7 +3528,9 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PyObject **sp, *res, *names; names = POP(); - assert(PyTuple_CheckExact(names) && PyTuple_GET_SIZE(names) <= oparg); + assert(PyTuple_Check(names)); + assert(PyTuple_GET_SIZE(names) <= oparg); + /* We assume without checking that names contains only strings */ sp = stack_pointer; res = call_function(tstate, &sp, oparg, names); stack_pointer = sp; @@ -3524,6 +3544,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) } case TARGET(CALL_FUNCTION_EX): { + PREDICTED(CALL_FUNCTION_EX); PyObject *func, *callargs, *kwargs = NULL, *result; if (oparg & 0x01) { kwargs = POP(); @@ -3770,6 +3791,16 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) PUSH(val); PUSH(exc); JUMPTO(handler); + if (_Py_TracingPossible(ceval2)) { + int needs_new_execution_window = (f->f_lasti < instr_lb || f->f_lasti >= instr_ub); + int needs_line_update = (f->f_lasti == instr_lb || f->f_lasti < instr_prev); + /* Make sure that we trace line after exception if we are in a new execution + * window or we don't need a line update and we are not in the first instruction + * of the line. */ + if (needs_new_execution_window || (!needs_line_update && instr_lb > 0)) { + instr_prev = INT_MAX; + } + } /* Resume normal execution */ goto main_loop; } @@ -3782,15 +3813,13 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) assert(retval == NULL); assert(_PyErr_Occurred(tstate)); -exit_returning: - /* Pop remaining stack entries. */ while (!EMPTY()) { PyObject *o = POP(); Py_XDECREF(o); } -exit_yielding: +exiting: if (tstate->use_tracing) { if (tstate->c_tracefunc) { if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj, @@ -3810,11 +3839,11 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag) exit_eval_frame: if (PyDTrace_FUNCTION_RETURN_ENABLED()) dtrace_function_return(f); - Py_LeaveRecursiveCall(); + _Py_LeaveRecursiveCall(tstate); f->f_executing = 0; tstate->frame = f->f_back; - return _Py_CheckFunctionResult(NULL, retval, "PyEval_EvalFrameEx"); + return _Py_CheckFunctionResult(tstate, NULL, retval, __func__); } static void @@ -4042,7 +4071,8 @@ positional_only_passed_as_keyword(PyThreadState *tstate, PyCodeObject *co, the test in the if statements in Misc/gdbinit (pystack and pystackv). */ PyObject * -_PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, +_PyEval_EvalCode(PyThreadState *tstate, + PyObject *_co, PyObject *globals, PyObject *locals, PyObject *const *args, Py_ssize_t argcount, PyObject *const *kwnames, PyObject *const *kwargs, Py_ssize_t kwcount, int kwstep, @@ -4050,6 +4080,8 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, PyObject *kwdefs, PyObject *closure, PyObject *name, PyObject *qualname) { + assert(is_tstate_valid(tstate)); + PyCodeObject* co = (PyCodeObject*)_co; PyFrameObject *f; PyObject *retval = NULL; @@ -4059,9 +4091,6 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, Py_ssize_t i, j, n; PyObject *kwdict; - PyThreadState *tstate = _PyThreadState_GET(); - assert(tstate != NULL); - if (globals == NULL) { _PyErr_SetString(tstate, PyExc_SystemError, "PyEval_EvalCodeEx: NULL globals"); @@ -4295,7 +4324,7 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, return gen; } - retval = PyEval_EvalFrameEx(f,0); + retval = _PyEval_EvalFrame(tstate, f, 0); fail: /* Jump here from prelude on failure */ @@ -4304,7 +4333,6 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, current Python frame (f), the associated C stack is still in use, so recursion_depth must be boosted for the duration. */ - assert(tstate != NULL); if (Py_REFCNT(f) > 1) { Py_DECREF(f); _PyObject_GC_TRACK(f); @@ -4317,6 +4345,26 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, return retval; } + +PyObject * +_PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals, + PyObject *const *args, Py_ssize_t argcount, + PyObject *const *kwnames, PyObject *const *kwargs, + Py_ssize_t kwcount, int kwstep, + PyObject *const *defs, Py_ssize_t defcount, + PyObject *kwdefs, PyObject *closure, + PyObject *name, PyObject *qualname) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return _PyEval_EvalCode(tstate, _co, globals, locals, + args, argcount, + kwnames, kwargs, + kwcount, kwstep, + defs, defcount, + kwdefs, closure, + name, qualname); +} + PyObject * PyEval_EvalCodeEx(PyObject *_co, PyObject *globals, PyObject *locals, PyObject *const *args, int argcount, @@ -4339,7 +4387,7 @@ special_lookup(PyThreadState *tstate, PyObject *o, _Py_Identifier *id) PyObject *res; res = _PyObject_LookupSpecial(o, id); if (res == NULL && !_PyErr_Occurred(tstate)) { - _PyErr_SetObject(tstate, PyExc_AttributeError, id->object); + _PyErr_SetObject(tstate, PyExc_AttributeError, _PyUnicode_FromId(id)); return NULL; } return res; @@ -4432,7 +4480,7 @@ do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause) } _PyErr_SetObject(tstate, type, value); - /* PyErr_SetObject incref's its arguments */ + /* _PyErr_SetObject incref's its arguments */ Py_DECREF(value); Py_DECREF(type); return 0; @@ -4466,11 +4514,11 @@ unpack_iterable(PyThreadState *tstate, PyObject *v, it = PyObject_GetIter(v); if (it == NULL) { if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) && - v->ob_type->tp_iter == NULL && !PySequence_Check(v)) + Py_TYPE(v)->tp_iter == NULL && !PySequence_Check(v)) { _PyErr_Format(tstate, PyExc_TypeError, "cannot unpack non-iterable %.200s object", - v->ob_type->tp_name); + Py_TYPE(v)->tp_name); } return 0; } @@ -4533,7 +4581,7 @@ unpack_iterable(PyThreadState *tstate, PyObject *v, *--sp = PyList_GET_ITEM(l, ll - j); } /* Resize the list. */ - Py_SIZE(l) = ll - argcntafter; + Py_SET_SIZE(l, ll - argcntafter); Py_DECREF(it); return 1; @@ -4682,58 +4730,97 @@ maybe_call_line_trace(Py_tracefunc func, PyObject *obj, return result; } -void -PyEval_SetProfile(Py_tracefunc func, PyObject *arg) +int +_PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg) { - if (PySys_Audit("sys.setprofile", NULL) < 0) { - _PyErr_WriteUnraisableMsg("in PyEval_SetProfile", NULL); - return; + assert(is_tstate_valid(tstate)); + /* The caller must hold the GIL */ + assert(PyGILState_Check()); + + /* Call _PySys_Audit() in the context of the current thread state, + even if tstate is not the current thread state. */ + PyThreadState *current_tstate = _PyThreadState_GET(); + if (_PySys_Audit(current_tstate, "sys.setprofile", NULL) < 0) { + return -1; } - PyThreadState *tstate = _PyThreadState_GET(); - PyObject *temp = tstate->c_profileobj; - Py_XINCREF(arg); + PyObject *profileobj = tstate->c_profileobj; + tstate->c_profilefunc = NULL; tstate->c_profileobj = NULL; - /* Must make sure that tracing is not ignored if 'temp' is freed */ + /* Must make sure that tracing is not ignored if 'profileobj' is freed */ tstate->use_tracing = tstate->c_tracefunc != NULL; - Py_XDECREF(temp); - tstate->c_profilefunc = func; + Py_XDECREF(profileobj); + + Py_XINCREF(arg); tstate->c_profileobj = arg; + tstate->c_profilefunc = func; + /* Flag that tracing or profiling is turned on */ tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL); + return 0; } void -PyEval_SetTrace(Py_tracefunc func, PyObject *arg) +PyEval_SetProfile(Py_tracefunc func, PyObject *arg) { - if (PySys_Audit("sys.settrace", NULL) < 0) { - _PyErr_WriteUnraisableMsg("in PyEval_SetTrace", NULL); - return; + PyThreadState *tstate = _PyThreadState_GET(); + if (_PyEval_SetProfile(tstate, func, arg) < 0) { + /* Log _PySys_Audit() error */ + _PyErr_WriteUnraisableMsg("in PyEval_SetProfile", NULL); } +} + +int +_PyEval_SetTrace(PyThreadState *tstate, Py_tracefunc func, PyObject *arg) +{ + assert(is_tstate_valid(tstate)); + /* The caller must hold the GIL */ + assert(PyGILState_Check()); + + /* Call _PySys_Audit() in the context of the current thread state, + even if tstate is not the current thread state. */ + PyThreadState *current_tstate = _PyThreadState_GET(); + if (_PySys_Audit(current_tstate, "sys.settrace", NULL) < 0) { + return -1; + } + + struct _ceval_state *ceval2 = &tstate->interp->ceval; + PyObject *traceobj = tstate->c_traceobj; + ceval2->tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL); - _PyRuntimeState *runtime = &_PyRuntime; - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - PyObject *temp = tstate->c_traceobj; - runtime->ceval.tracing_possible += (func != NULL) - (tstate->c_tracefunc != NULL); - Py_XINCREF(arg); tstate->c_tracefunc = NULL; tstate->c_traceobj = NULL; - /* Must make sure that profiling is not ignored if 'temp' is freed */ - tstate->use_tracing = tstate->c_profilefunc != NULL; - Py_XDECREF(temp); - tstate->c_tracefunc = func; + /* Must make sure that profiling is not ignored if 'traceobj' is freed */ + tstate->use_tracing = (tstate->c_profilefunc != NULL); + Py_XDECREF(traceobj); + + Py_XINCREF(arg); tstate->c_traceobj = arg; + tstate->c_tracefunc = func; + /* Flag that tracing or profiling is turned on */ tstate->use_tracing = ((func != NULL) || (tstate->c_profilefunc != NULL)); + + return 0; +} + +void +PyEval_SetTrace(Py_tracefunc func, PyObject *arg) +{ + PyThreadState *tstate = _PyThreadState_GET(); + if (_PyEval_SetTrace(tstate, func, arg) < 0) { + /* Log _PySys_Audit() error */ + _PyErr_WriteUnraisableMsg("in PyEval_SetTrace", NULL); + } } + void -_PyEval_SetCoroutineOriginTrackingDepth(int new_depth) +_PyEval_SetCoroutineOriginTrackingDepth(PyThreadState *tstate, int new_depth) { assert(new_depth >= 0); - PyThreadState *tstate = _PyThreadState_GET(); tstate->coroutine_origin_tracking_depth = new_depth; } @@ -4744,6 +4831,20 @@ _PyEval_GetCoroutineOriginTrackingDepth(void) return tstate->coroutine_origin_tracking_depth; } +int +_PyEval_SetAsyncGenFirstiter(PyObject *firstiter) +{ + PyThreadState *tstate = _PyThreadState_GET(); + + if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_firstiter", NULL) < 0) { + return -1; + } + + Py_XINCREF(firstiter); + Py_XSETREF(tstate->async_gen_firstiter, firstiter); + return 0; +} + PyObject * _PyEval_GetAsyncGenFirstiter(void) { @@ -4751,31 +4852,39 @@ _PyEval_GetAsyncGenFirstiter(void) return tstate->async_gen_firstiter; } -PyObject * -_PyEval_GetAsyncGenFinalizer(void) +int +_PyEval_SetAsyncGenFinalizer(PyObject *finalizer) { PyThreadState *tstate = _PyThreadState_GET(); - return tstate->async_gen_finalizer; + + if (_PySys_Audit(tstate, "sys.set_asyncgen_hook_finalizer", NULL) < 0) { + return -1; + } + + Py_XINCREF(finalizer); + Py_XSETREF(tstate->async_gen_finalizer, finalizer); + return 0; } -static PyFrameObject * -_PyEval_GetFrame(PyThreadState *tstate) +PyObject * +_PyEval_GetAsyncGenFinalizer(void) { - return _PyRuntime.gilstate.getframe(tstate); + PyThreadState *tstate = _PyThreadState_GET(); + return tstate->async_gen_finalizer; } PyFrameObject * PyEval_GetFrame(void) { PyThreadState *tstate = _PyThreadState_GET(); - return _PyEval_GetFrame(tstate); + return tstate->frame; } PyObject * PyEval_GetBuiltins(void) { PyThreadState *tstate = _PyThreadState_GET(); - PyFrameObject *current_frame = _PyEval_GetFrame(tstate); + PyFrameObject *current_frame = tstate->frame; if (current_frame == NULL) return tstate->interp->builtins; else @@ -4801,7 +4910,7 @@ PyObject * PyEval_GetLocals(void) { PyThreadState *tstate = _PyThreadState_GET(); - PyFrameObject *current_frame = _PyEval_GetFrame(tstate); + PyFrameObject *current_frame = tstate->frame; if (current_frame == NULL) { _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist"); return NULL; @@ -4819,7 +4928,7 @@ PyObject * PyEval_GetGlobals(void) { PyThreadState *tstate = _PyThreadState_GET(); - PyFrameObject *current_frame = _PyEval_GetFrame(tstate); + PyFrameObject *current_frame = tstate->frame; if (current_frame == NULL) { return NULL; } @@ -4832,7 +4941,7 @@ int PyEval_MergeCompilerFlags(PyCompilerFlags *cf) { PyThreadState *tstate = _PyThreadState_GET(); - PyFrameObject *current_frame = _PyEval_GetFrame(tstate); + PyFrameObject *current_frame = tstate->frame; int result = cf->cf_flags != 0; if (current_frame != NULL) { @@ -4863,7 +4972,7 @@ PyEval_GetFuncName(PyObject *func) else if (PyCFunction_Check(func)) return ((PyCFunctionObject*)func)->m_ml->ml_name; else - return func->ob_type->tp_name; + return Py_TYPE(func)->tp_name; } const char * @@ -4918,11 +5027,11 @@ trace_call_function(PyThreadState *tstate, PyObject *kwnames) { PyObject *x; - if (PyCFunction_Check(func)) { - C_TRACE(x, _PyObject_Vectorcall(func, args, nargs, kwnames)); + if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) { + C_TRACE(x, PyObject_Vectorcall(func, args, nargs, kwnames)); return x; } - else if (Py_TYPE(func) == &PyMethodDescr_Type && nargs > 0) { + else if (Py_IS_TYPE(func, &PyMethodDescr_Type) && nargs > 0) { /* We need to create a temporary bound method as argument for profiling. @@ -4935,13 +5044,13 @@ trace_call_function(PyThreadState *tstate, if (func == NULL) { return NULL; } - C_TRACE(x, _PyObject_Vectorcall(func, + C_TRACE(x, PyObject_Vectorcall(func, args+1, nargs-1, kwnames)); Py_DECREF(func); return x; } - return _PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames); + return PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames); } /* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault() @@ -4960,7 +5069,7 @@ call_function(PyThreadState *tstate, PyObject ***pp_stack, Py_ssize_t oparg, PyO x = trace_call_function(tstate, func, stack, nargs, kwnames); } else { - x = _PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames); + x = PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames); } assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL)); @@ -4979,11 +5088,11 @@ do_call_core(PyThreadState *tstate, PyObject *func, PyObject *callargs, PyObject { PyObject *result; - if (PyCFunction_Check(func)) { - C_TRACE(result, PyCFunction_Call(func, callargs, kwdict)); + if (PyCFunction_CheckExact(func) || PyCMethod_CheckExact(func)) { + C_TRACE(result, PyObject_Call(func, callargs, kwdict)); return result; } - else if (Py_TYPE(func) == &PyMethodDescr_Type) { + else if (Py_IS_TYPE(func, &PyMethodDescr_Type)) { Py_ssize_t nargs = PyTuple_GET_SIZE(callargs); if (nargs > 0 && tstate->use_tracing) { /* We need to create a temporary bound method as argument @@ -4999,10 +5108,11 @@ do_call_core(PyThreadState *tstate, PyObject *func, PyObject *callargs, PyObject return NULL; } - C_TRACE(result, _PyObject_FastCallDict(func, - &_PyTuple_ITEMS(callargs)[1], - nargs - 1, - kwdict)); + C_TRACE(result, _PyObject_FastCallDictTstate( + tstate, func, + &_PyTuple_ITEMS(callargs)[1], + nargs - 1, + kwdict)); Py_DECREF(func); return result; } @@ -5022,7 +5132,7 @@ _PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi) PyThreadState *tstate = _PyThreadState_GET(); if (v != Py_None) { Py_ssize_t x; - if (PyIndex_Check(v)) { + if (_PyIndex_Check(v)) { x = PyNumber_AsSsize_t(v, NULL); if (x == -1 && _PyErr_Occurred(tstate)) return 0; @@ -5043,7 +5153,7 @@ _PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi) { PyThreadState *tstate = _PyThreadState_GET(); Py_ssize_t x; - if (PyIndex_Check(v)) { + if (_PyIndex_Check(v)) { x = PyNumber_AsSsize_t(v, NULL); if (x == -1 && _PyErr_Occurred(tstate)) return 0; @@ -5058,62 +5168,6 @@ _PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi) return 1; } - -#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\ - "BaseException is not allowed" - -static PyObject * -cmp_outcome(PyThreadState *tstate, int op, PyObject *v, PyObject *w) -{ - int res = 0; - switch (op) { - case PyCmp_IS: - res = (v == w); - break; - case PyCmp_IS_NOT: - res = (v != w); - break; - case PyCmp_IN: - res = PySequence_Contains(w, v); - if (res < 0) - return NULL; - break; - case PyCmp_NOT_IN: - res = PySequence_Contains(w, v); - if (res < 0) - return NULL; - res = !res; - break; - case PyCmp_EXC_MATCH: - if (PyTuple_Check(w)) { - Py_ssize_t i, length; - length = PyTuple_Size(w); - for (i = 0; i < length; i += 1) { - PyObject *exc = PyTuple_GET_ITEM(w, i); - if (!PyExceptionClass_Check(exc)) { - _PyErr_SetString(tstate, PyExc_TypeError, - CANNOT_CATCH_MSG); - return NULL; - } - } - } - else { - if (!PyExceptionClass_Check(w)) { - _PyErr_SetString(tstate, PyExc_TypeError, - CANNOT_CATCH_MSG); - return NULL; - } - } - res = PyErr_GivenExceptionMatches(v, w); - break; - default: - return PyObject_RichCompare(v, w, op); - } - v = res ? Py_True : Py_False; - Py_INCREF(v); - return v; -} - static PyObject * import_name(PyThreadState *tstate, PyFrameObject *f, PyObject *name, PyObject *fromlist, PyObject *level) @@ -5161,7 +5215,6 @@ static PyObject * import_from(PyThreadState *tstate, PyObject *v, PyObject *name) { PyObject *x; - _Py_IDENTIFIER(__name__); PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg; if (_PyObject_LookupAttr(v, name, &x) != 0) { @@ -5237,7 +5290,6 @@ import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v) { _Py_IDENTIFIER(__all__); _Py_IDENTIFIER(__dict__); - _Py_IDENTIFIER(__name__); PyObject *all, *dict, *name, *value; int skip_leading_underscores = 0; int pos, err; @@ -5327,13 +5379,18 @@ import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v) static int check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args) { - if (args->ob_type->tp_iter == NULL && !PySequence_Check(args)) { - _PyErr_Format(tstate, PyExc_TypeError, - "%.200s%.200s argument after * " - "must be an iterable, not %.200s", - PyEval_GetFuncName(func), - PyEval_GetFuncDesc(func), - args->ob_type->tp_name); + if (Py_TYPE(args)->tp_iter == NULL && !PySequence_Check(args)) { + /* check_args_iterable() may be called with a live exception: + * clear it to prevent calling _PyObject_FunctionStr() with an + * exception set. */ + _PyErr_Clear(tstate); + PyObject *funcstr = _PyObject_FunctionStr(func); + if (funcstr != NULL) { + _PyErr_Format(tstate, PyExc_TypeError, + "%U argument after * must be an iterable, not %.200s", + funcstr, Py_TYPE(args)->tp_name); + Py_DECREF(funcstr); + } return -1; } return 0; @@ -5349,31 +5406,29 @@ format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs) * is not a mapping. */ if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { - _PyErr_Format(tstate, PyExc_TypeError, - "%.200s%.200s argument after ** " - "must be a mapping, not %.200s", - PyEval_GetFuncName(func), - PyEval_GetFuncDesc(func), - kwargs->ob_type->tp_name); + _PyErr_Clear(tstate); + PyObject *funcstr = _PyObject_FunctionStr(func); + if (funcstr != NULL) { + _PyErr_Format( + tstate, PyExc_TypeError, + "%U argument after ** must be a mapping, not %.200s", + funcstr, Py_TYPE(kwargs)->tp_name); + Py_DECREF(funcstr); + } } else if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { PyObject *exc, *val, *tb; _PyErr_Fetch(tstate, &exc, &val, &tb); if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) { - PyObject *key = PyTuple_GET_ITEM(val, 0); - if (!PyUnicode_Check(key)) { - _PyErr_Format(tstate, PyExc_TypeError, - "%.200s%.200s keywords must be strings", - PyEval_GetFuncName(func), - PyEval_GetFuncDesc(func)); - } - else { - _PyErr_Format(tstate, PyExc_TypeError, - "%.200s%.200s got multiple " - "values for keyword argument '%U'", - PyEval_GetFuncName(func), - PyEval_GetFuncDesc(func), - key); + _PyErr_Clear(tstate); + PyObject *funcstr = _PyObject_FunctionStr(func); + if (funcstr != NULL) { + PyObject *key = PyTuple_GET_ITEM(val, 0); + _PyErr_Format( + tstate, PyExc_TypeError, + "%U got multiple values for keyword argument '%S'", + funcstr, key); + Py_DECREF(funcstr); } Py_XDECREF(exc); Py_XDECREF(val); @@ -5424,7 +5479,7 @@ format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg) } static void -format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevopcode) +format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevprevopcode, int prevopcode) { if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) { if (prevopcode == BEFORE_ASYNC_WITH) { @@ -5433,7 +5488,7 @@ format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevopcode "that does not implement __await__: %.100s", type->tp_name); } - else if (prevopcode == WITH_CLEANUP_START) { + else if (prevopcode == WITH_EXCEPT_START || (prevopcode == CALL_FUNCTION && prevprevopcode == DUP_TOP)) { _PyErr_Format(tstate, PyExc_TypeError, "'async with' received an object from __aexit__ " "that does not implement __await__: %.100s", @@ -5545,7 +5600,7 @@ _Py_GetDXProfile(PyObject *self, PyObject *args) Py_ssize_t _PyEval_RequestCodeExtraIndex(freefunc free) { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); + PyInterpreterState *interp = _PyInterpreterState_GET(); Py_ssize_t new_index; if (interp->co_extra_user_count == MAX_CO_EXTRA_USERS - 1) { @@ -5563,9 +5618,10 @@ dtrace_function_entry(PyFrameObject *f) const char *funcname; int lineno; - filename = PyUnicode_AsUTF8(f->f_code->co_filename); - funcname = PyUnicode_AsUTF8(f->f_code->co_name); - lineno = PyCode_Addr2Line(f->f_code, f->f_lasti); + PyCodeObject *code = f->f_code; + filename = PyUnicode_AsUTF8(code->co_filename); + funcname = PyUnicode_AsUTF8(code->co_name); + lineno = PyCode_Addr2Line(code, f->f_lasti); PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno); } @@ -5577,9 +5633,10 @@ dtrace_function_return(PyFrameObject *f) const char *funcname; int lineno; - filename = PyUnicode_AsUTF8(f->f_code->co_filename); - funcname = PyUnicode_AsUTF8(f->f_code->co_name); - lineno = PyCode_Addr2Line(f->f_code, f->f_lasti); + PyCodeObject *code = f->f_code; + filename = PyUnicode_AsUTF8(code->co_filename); + funcname = PyUnicode_AsUTF8(code->co_name); + lineno = PyCode_Addr2Line(code, f->f_lasti); PyDTrace_FUNCTION_RETURN(filename, funcname, lineno); } @@ -5617,3 +5674,21 @@ maybe_dtrace_line(PyFrameObject *frame, } *instr_prev = frame->f_lasti; } + + +/* Implement Py_EnterRecursiveCall() and Py_LeaveRecursiveCall() as functions + for the limited API. */ + +#undef Py_EnterRecursiveCall + +int Py_EnterRecursiveCall(const char *where) +{ + return _Py_EnterRecursiveCall_inline(where); +} + +#undef Py_LeaveRecursiveCall + +void Py_LeaveRecursiveCall(void) +{ + _Py_LeaveRecursiveCall_inline(); +} diff --git a/Python/ceval_gil.h b/Python/ceval_gil.h index 34d48c990c44796e72a13c26fc20ff1a18c0e8e5..3510675a69b8b9a78585663d2eba2f7a0f58da37 100644 --- a/Python/ceval_gil.h +++ b/Python/ceval_gil.h @@ -141,7 +141,8 @@ static void recreate_gil(struct _gil_runtime_state *gil) } static void -drop_gil(struct _ceval_runtime_state *ceval, PyThreadState *tstate) +drop_gil(struct _ceval_runtime_state *ceval, struct _ceval_state *ceval2, + PyThreadState *tstate) { struct _gil_runtime_state *gil = &ceval->gil; if (!_Py_atomic_load_relaxed(&gil->locked)) { @@ -163,12 +164,13 @@ drop_gil(struct _ceval_runtime_state *ceval, PyThreadState *tstate) MUTEX_UNLOCK(gil->mutex); #ifdef FORCE_SWITCHING - if (_Py_atomic_load_relaxed(&ceval->gil_drop_request) && tstate != NULL) { + if (_Py_atomic_load_relaxed(&ceval2->gil_drop_request) && tstate != NULL) { MUTEX_LOCK(gil->switch_mutex); /* Not switched yet => wait */ if (((PyThreadState*)_Py_atomic_load_relaxed(&gil->last_holder)) == tstate) { - RESET_GIL_DROP_REQUEST(ceval); + assert(is_tstate_valid(tstate)); + RESET_GIL_DROP_REQUEST(tstate->interp); /* NOTE: if COND_WAIT does not atomically start waiting when releasing the mutex, another thread can run through, take the GIL and drop it again, and reset the condition @@ -180,15 +182,57 @@ drop_gil(struct _ceval_runtime_state *ceval, PyThreadState *tstate) #endif } + +/* Check if a Python thread must exit immediately, rather than taking the GIL + if Py_Finalize() has been called. + + When this function is called by a daemon thread after Py_Finalize() has been + called, the GIL does no longer exist. + + tstate must be non-NULL. */ +static inline int +tstate_must_exit(PyThreadState *tstate) +{ + /* bpo-39877: Access _PyRuntime directly rather than using + tstate->interp->runtime to support calls from Python daemon threads. + After Py_Finalize() has been called, tstate can be a dangling pointer: + point to PyThreadState freed memory. */ + PyThreadState *finalizing = _PyRuntimeState_GetFinalizing(&_PyRuntime); + return (finalizing != NULL && finalizing != tstate); +} + + +/* Take the GIL. + + The function saves errno at entry and restores its value at exit. + + tstate must be non-NULL. */ static void -take_gil(struct _ceval_runtime_state *ceval, PyThreadState *tstate) +take_gil(PyThreadState *tstate) { - if (tstate == NULL) { - Py_FatalError("take_gil: NULL tstate"); + int err = errno; + + assert(tstate != NULL); + + if (tstate_must_exit(tstate)) { + /* bpo-39877: If Py_Finalize() has been called and tstate is not the + thread which called Py_Finalize(), exit immediately the thread. + + This code path can be reached by a daemon thread after Py_Finalize() + completes. In this case, tstate is a dangling pointer: points to + PyThreadState freed memory. */ + PyThread_exit_thread(); } + assert(is_tstate_valid(tstate)); + PyInterpreterState *interp = tstate->interp; + struct _ceval_runtime_state *ceval = &interp->runtime->ceval; + struct _ceval_state *ceval2 = &interp->ceval; struct _gil_runtime_state *gil = &ceval->gil; - int err = errno; + + /* Check that _PyEval_InitThreads() was called to create the lock */ + assert(gil_created(gil)); + MUTEX_LOCK(gil->mutex); if (!_Py_atomic_load_relaxed(&gil->locked)) { @@ -196,23 +240,28 @@ take_gil(struct _ceval_runtime_state *ceval, PyThreadState *tstate) } while (_Py_atomic_load_relaxed(&gil->locked)) { - int timed_out = 0; - unsigned long saved_switchnum; - - saved_switchnum = gil->switch_number; - + unsigned long saved_switchnum = gil->switch_number; unsigned long interval = (gil->interval >= 1 ? gil->interval : 1); + int timed_out = 0; COND_TIMED_WAIT(gil->cond, gil->mutex, interval, timed_out); + /* If we timed out and no switch occurred in the meantime, it is time to ask the GIL-holding thread to drop it. */ if (timed_out && _Py_atomic_load_relaxed(&gil->locked) && gil->switch_number == saved_switchnum) { - SET_GIL_DROP_REQUEST(ceval); + if (tstate_must_exit(tstate)) { + MUTEX_UNLOCK(gil->mutex); + PyThread_exit_thread(); + } + assert(is_tstate_valid(tstate)); + + SET_GIL_DROP_REQUEST(interp); } } + _ready: #ifdef FORCE_SWITCHING /* This mutex must be taken before modifying gil->last_holder: @@ -232,23 +281,51 @@ take_gil(struct _ceval_runtime_state *ceval, PyThreadState *tstate) COND_SIGNAL(gil->switch_cond); MUTEX_UNLOCK(gil->switch_mutex); #endif - if (_Py_atomic_load_relaxed(&ceval->gil_drop_request)) { - RESET_GIL_DROP_REQUEST(ceval); + + if (tstate_must_exit(tstate)) { + /* bpo-36475: If Py_Finalize() has been called and tstate is not + the thread which called Py_Finalize(), exit immediately the + thread. + + This code path can be reached by a daemon thread which was waiting + in take_gil() while the main thread called + wait_for_thread_shutdown() from Py_Finalize(). */ + MUTEX_UNLOCK(gil->mutex); + drop_gil(ceval, ceval2, tstate); + PyThread_exit_thread(); + } + assert(is_tstate_valid(tstate)); + + if (_Py_atomic_load_relaxed(&ceval2->gil_drop_request)) { + RESET_GIL_DROP_REQUEST(interp); } + else { + /* bpo-40010: eval_breaker should be recomputed to be set to 1 if there + is a pending signal: signal received by another thread which cannot + handle signals. + + Note: RESET_GIL_DROP_REQUEST() calls COMPUTE_EVAL_BREAKER(). */ + COMPUTE_EVAL_BREAKER(interp, ceval, ceval2); + } + + /* Don't access tstate if the thread must exit */ if (tstate->async_exc != NULL) { - _PyEval_SignalAsyncExc(ceval); + _PyEval_SignalAsyncExc(tstate); } MUTEX_UNLOCK(gil->mutex); + errno = err; } void _PyEval_SetSwitchInterval(unsigned long microseconds) { - _PyRuntime.ceval.gil.interval = microseconds; + struct _gil_runtime_state *gil = &_PyRuntime.ceval.gil; + gil->interval = microseconds; } unsigned long _PyEval_GetSwitchInterval() { - return _PyRuntime.ceval.gil.interval; + struct _gil_runtime_state *gil = &_PyRuntime.ceval.gil; + return gil->interval; } diff --git a/Python/clinic/sysmodule.c.h b/Python/clinic/sysmodule.c.h index d2d1503926205d0be172849ad176793764ad0516..4615ebaab5de2b5e7f6bc7569376ee860d051bce 100644 --- a/Python/clinic/sysmodule.c.h +++ b/Python/clinic/sysmodule.c.h @@ -281,62 +281,6 @@ sys_getprofile(PyObject *module, PyObject *Py_UNUSED(ignored)) return sys_getprofile_impl(module); } -PyDoc_STRVAR(sys_setcheckinterval__doc__, -"setcheckinterval($module, n, /)\n" -"--\n" -"\n" -"Set the async event check interval to n instructions.\n" -"\n" -"This tells the Python interpreter to check for asynchronous events\n" -"every n instructions.\n" -"\n" -"This also affects how often thread switches occur."); - -#define SYS_SETCHECKINTERVAL_METHODDEF \ - {"setcheckinterval", (PyCFunction)sys_setcheckinterval, METH_O, sys_setcheckinterval__doc__}, - -static PyObject * -sys_setcheckinterval_impl(PyObject *module, int n); - -static PyObject * -sys_setcheckinterval(PyObject *module, PyObject *arg) -{ - PyObject *return_value = NULL; - int n; - - if (PyFloat_Check(arg)) { - PyErr_SetString(PyExc_TypeError, - "integer argument expected, got float" ); - goto exit; - } - n = _PyLong_AsInt(arg); - if (n == -1 && PyErr_Occurred()) { - goto exit; - } - return_value = sys_setcheckinterval_impl(module, n); - -exit: - return return_value; -} - -PyDoc_STRVAR(sys_getcheckinterval__doc__, -"getcheckinterval($module, /)\n" -"--\n" -"\n" -"Return the current check interval; see sys.setcheckinterval()."); - -#define SYS_GETCHECKINTERVAL_METHODDEF \ - {"getcheckinterval", (PyCFunction)sys_getcheckinterval, METH_NOARGS, sys_getcheckinterval__doc__}, - -static PyObject * -sys_getcheckinterval_impl(PyObject *module); - -static PyObject * -sys_getcheckinterval(PyObject *module, PyObject *Py_UNUSED(ignored)) -{ - return sys_getcheckinterval_impl(module); -} - PyDoc_STRVAR(sys_setswitchinterval__doc__, "setswitchinterval($module, interval, /)\n" "--\n" @@ -814,27 +758,6 @@ exit: return return_value; } -#if defined(COUNT_ALLOCS) - -PyDoc_STRVAR(sys_getcounts__doc__, -"getcounts($module, /)\n" -"--\n" -"\n"); - -#define SYS_GETCOUNTS_METHODDEF \ - {"getcounts", (PyCFunction)sys_getcounts, METH_NOARGS, sys_getcounts__doc__}, - -static PyObject * -sys_getcounts_impl(PyObject *module); - -static PyObject * -sys_getcounts(PyObject *module, PyObject *Py_UNUSED(ignored)) -{ - return sys_getcounts_impl(module); -} - -#endif /* defined(COUNT_ALLOCS) */ - PyDoc_STRVAR(sys__getframe__doc__, "_getframe($module, depth=0, /)\n" "--\n" @@ -941,43 +864,6 @@ exit: return return_value; } -PyDoc_STRVAR(sys_callstats__doc__, -"callstats($module, /)\n" -"--\n" -"\n" -"Return a tuple of function call statistics.\n" -"\n" -"A tuple is returned only if CALL_PROFILE was defined when Python was\n" -"built. Otherwise, this returns None.\n" -"\n" -"When enabled, this function returns detailed, implementation-specific\n" -"details about the number of function calls executed. The return value\n" -"is a 11-tuple where the entries in the tuple are counts of:\n" -"0. all function calls\n" -"1. calls to PyFunction_Type objects\n" -"2. PyFunction calls that do not create an argument tuple\n" -"3. PyFunction calls that do not create an argument tuple\n" -" and bypass PyEval_EvalCodeEx()\n" -"4. PyMethod calls\n" -"5. PyMethod calls on bound methods\n" -"6. PyType calls\n" -"7. PyCFunction calls\n" -"8. generator calls\n" -"9. All other calls\n" -"10. Number of stack pops performed by call_function()"); - -#define SYS_CALLSTATS_METHODDEF \ - {"callstats", (PyCFunction)sys_callstats, METH_NOARGS, sys_callstats__doc__}, - -static PyObject * -sys_callstats_impl(PyObject *module); - -static PyObject * -sys_callstats(PyObject *module, PyObject *Py_UNUSED(ignored)) -{ - return sys_callstats_impl(module); -} - PyDoc_STRVAR(sys__debugmallocstats__doc__, "_debugmallocstats($module, /)\n" "--\n" @@ -1081,11 +967,7 @@ sys_getandroidapilevel(PyObject *module, PyObject *Py_UNUSED(ignored)) #define SYS_GETTOTALREFCOUNT_METHODDEF #endif /* !defined(SYS_GETTOTALREFCOUNT_METHODDEF) */ -#ifndef SYS_GETCOUNTS_METHODDEF - #define SYS_GETCOUNTS_METHODDEF -#endif /* !defined(SYS_GETCOUNTS_METHODDEF) */ - #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF #define SYS_GETANDROIDAPILEVEL_METHODDEF #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */ -/*[clinic end generated code: output=273f9cec8bfcab91 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=39eb34a01fb9a919 input=a9049054013a1b77]*/ diff --git a/Python/codecs.c b/Python/codecs.c index 4bd28ec9c761cae99ddef8047ac759ea38cf7828..0f18c27e5fe461c32ba5f4b15a9c3c3475f957fd 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -9,7 +9,8 @@ Copyright (c) Corporation for National Research Initiatives. ------------------------------------------------------------------------ */ #include "Python.h" -#include "pycore_pystate.h" +#include "pycore_interp.h" // PyInterpreterState.codec_search_path +#include "pycore_pystate.h" // _PyInterpreterState_GET() #include "ucnhash.h" #include @@ -32,7 +33,7 @@ static int _PyCodecRegistry_Init(void); /* Forward */ int PyCodec_Register(PyObject *search_function) { - PyInterpreterState *interp = _PyInterpreterState_Get(); + PyInterpreterState *interp = _PyInterpreterState_GET(); if (interp->codec_search_path == NULL && _PyCodecRegistry_Init()) goto onError; if (search_function == NULL) { @@ -49,15 +50,16 @@ int PyCodec_Register(PyObject *search_function) return -1; } -/* Convert a string to a normalized Python string: all characters are - converted to lower case, spaces are replaced with underscores. */ +extern int _Py_normalize_encoding(const char *, char *, size_t); + +/* Convert a string to a normalized Python string(decoded from UTF-8): all characters are + converted to lower case, spaces and hyphens are replaced with underscores. */ static PyObject *normalizestring(const char *string) { - size_t i; size_t len = strlen(string); - char *p; + char *encoding; PyObject *v; if (len > PY_SSIZE_T_MAX) { @@ -65,20 +67,19 @@ PyObject *normalizestring(const char *string) return NULL; } - p = PyMem_Malloc(len + 1); - if (p == NULL) + encoding = PyMem_Malloc(len + 1); + if (encoding == NULL) return PyErr_NoMemory(); - for (i = 0; i < len; i++) { - char ch = string[i]; - if (ch == ' ') - ch = '-'; - else - ch = Py_TOLOWER(Py_CHARMASK(ch)); - p[i] = ch; + + if (!_Py_normalize_encoding(string, encoding, len + 1)) + { + PyErr_SetString(PyExc_RuntimeError, "_Py_normalize_encoding() failed"); + PyMem_Free(encoding); + return NULL; } - p[i] = '\0'; - v = PyUnicode_FromString(p); - PyMem_Free(p); + + v = PyUnicode_FromString(encoding); + PyMem_Free(encoding); return v; } @@ -99,47 +100,38 @@ PyObject *normalizestring(const char *string) PyObject *_PyCodec_Lookup(const char *encoding) { - PyObject *result, *args = NULL, *v; - Py_ssize_t i, len; - if (encoding == NULL) { PyErr_BadArgument(); - goto onError; + return NULL; } - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - if (interp->codec_search_path == NULL && _PyCodecRegistry_Init()) - goto onError; + PyInterpreterState *interp = _PyInterpreterState_GET(); + if (interp->codec_search_path == NULL && _PyCodecRegistry_Init()) { + return NULL; + } /* Convert the encoding to a normalized Python string: all characters are converted to lower case, spaces and hyphens are replaced with underscores. */ - v = normalizestring(encoding); - if (v == NULL) - goto onError; + PyObject *v = normalizestring(encoding); + if (v == NULL) { + return NULL; + } PyUnicode_InternInPlace(&v); /* First, try to lookup the name in the registry dictionary */ - result = PyDict_GetItemWithError(interp->codec_search_cache, v); + PyObject *result = PyDict_GetItemWithError(interp->codec_search_cache, v); if (result != NULL) { Py_INCREF(result); Py_DECREF(v); return result; } else if (PyErr_Occurred()) { - Py_DECREF(v); - return NULL; + goto onError; } /* Next, scan the search functions in order of registration */ - args = PyTuple_New(1); - if (args == NULL) { - Py_DECREF(v); - return NULL; - } - PyTuple_SET_ITEM(args,0,v); - - len = PyList_Size(interp->codec_search_path); + const Py_ssize_t len = PyList_Size(interp->codec_search_path); if (len < 0) goto onError; if (len == 0) { @@ -149,13 +141,14 @@ PyObject *_PyCodec_Lookup(const char *encoding) goto onError; } + Py_ssize_t i; for (i = 0; i < len; i++) { PyObject *func; func = PyList_GetItem(interp->codec_search_path, i); if (func == NULL) goto onError; - result = PyEval_CallObject(func, args); + result = PyObject_CallOneArg(func, v); if (result == NULL) goto onError; if (result == Py_None) { @@ -182,11 +175,11 @@ PyObject *_PyCodec_Lookup(const char *encoding) Py_DECREF(result); goto onError; } - Py_DECREF(args); + Py_DECREF(v); return result; onError: - Py_XDECREF(args); + Py_DECREF(v); return NULL; } @@ -195,7 +188,7 @@ int _PyCodec_Forget(const char *encoding) PyObject *v; int result; - PyInterpreterState *interp = _PyInterpreterState_Get(); + PyInterpreterState *interp = _PyInterpreterState_GET(); if (interp->codec_search_path == NULL) { return -1; } @@ -325,7 +318,7 @@ PyObject *codec_getstreamcodec(const char *encoding, if (errors != NULL) streamcodec = PyObject_CallFunction(codeccls, "Os", stream, errors); else - streamcodec = PyObject_CallFunctionObjArgs(codeccls, stream, NULL); + streamcodec = PyObject_CallOneArg(codeccls, stream); Py_DECREF(codecs); return streamcodec; } @@ -424,7 +417,7 @@ _PyCodec_EncodeInternal(PyObject *object, if (args == NULL) goto onError; - result = PyEval_CallObject(encoder, args); + result = PyObject_Call(encoder, args, NULL); if (result == NULL) { wrap_codec_error("encoding", encoding); goto onError; @@ -470,7 +463,7 @@ _PyCodec_DecodeInternal(PyObject *object, if (args == NULL) goto onError; - result = PyEval_CallObject(decoder,args); + result = PyObject_Call(decoder, args, NULL); if (result == NULL) { wrap_codec_error("decoding", encoding); goto onError; @@ -628,7 +621,7 @@ PyObject *_PyCodec_DecodeText(PyObject *object, Return 0 on success, -1 on error */ int PyCodec_RegisterError(const char *name, PyObject *error) { - PyInterpreterState *interp = _PyInterpreterState_Get(); + PyInterpreterState *interp = _PyInterpreterState_GET(); if (interp->codec_search_path == NULL && _PyCodecRegistry_Init()) return -1; if (!PyCallable_Check(error)) { @@ -646,7 +639,7 @@ PyObject *PyCodec_LookupError(const char *name) { PyObject *handler = NULL; - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); + PyInterpreterState *interp = _PyInterpreterState_GET(); if (interp->codec_search_path == NULL && _PyCodecRegistry_Init()) return NULL; @@ -666,7 +659,7 @@ static void wrong_exception_type(PyObject *exc) { PyErr_Format(PyExc_TypeError, "don't know how to handle %.200s in error callback", - exc->ob_type->tp_name); + Py_TYPE(exc)->tp_name); } PyObject *PyCodec_StrictErrors(PyObject *exc) @@ -709,8 +702,7 @@ PyObject *PyCodec_ReplaceErrors(PyObject *exc) if (PyObject_TypeCheck(exc, (PyTypeObject *)PyExc_UnicodeEncodeError)) { PyObject *res; - int kind; - void *data; + Py_UCS1 *outp; if (PyUnicodeEncodeError_GetStart(exc, &start)) return NULL; if (PyUnicodeEncodeError_GetEnd(exc, &end)) @@ -719,10 +711,10 @@ PyObject *PyCodec_ReplaceErrors(PyObject *exc) res = PyUnicode_New(len, '?'); if (res == NULL) return NULL; - kind = PyUnicode_KIND(res); - data = PyUnicode_DATA(res); + assert(PyUnicode_KIND(res) == PyUnicode_1BYTE_KIND); + outp = PyUnicode_1BYTE_DATA(res); for (i = 0; i < len; ++i) - PyUnicode_WRITE(kind, data, i, '?'); + outp[i] = '?'; assert(_PyUnicode_CheckConsistency(res, 1)); return Py_BuildValue("(Nn)", res, end); } @@ -735,8 +727,7 @@ PyObject *PyCodec_ReplaceErrors(PyObject *exc) } else if (PyObject_TypeCheck(exc, (PyTypeObject *)PyExc_UnicodeTranslateError)) { PyObject *res; - int kind; - void *data; + Py_UCS2 *outp; if (PyUnicodeTranslateError_GetStart(exc, &start)) return NULL; if (PyUnicodeTranslateError_GetEnd(exc, &end)) @@ -745,10 +736,10 @@ PyObject *PyCodec_ReplaceErrors(PyObject *exc) res = PyUnicode_New(len, Py_UNICODE_REPLACEMENT_CHARACTER); if (res == NULL) return NULL; - kind = PyUnicode_KIND(res); - data = PyUnicode_DATA(res); - for (i=0; i < len; i++) - PyUnicode_WRITE(kind, data, i, Py_UNICODE_REPLACEMENT_CHARACTER); + assert(PyUnicode_KIND(res) == PyUnicode_2BYTE_KIND); + outp = PyUnicode_2BYTE_DATA(res); + for (i = 0; i < len; i++) + outp[i] = Py_UNICODE_REPLACEMENT_CHARACTER; assert(_PyUnicode_CheckConsistency(res, 1)); return Py_BuildValue("(Nn)", res, end); } @@ -767,7 +758,7 @@ PyObject *PyCodec_XMLCharRefReplaceErrors(PyObject *exc) Py_ssize_t start; Py_ssize_t end; PyObject *res; - unsigned char *outp; + Py_UCS1 *outp; Py_ssize_t ressize; Py_UCS4 ch; if (PyUnicodeEncodeError_GetStart(exc, &start)) @@ -863,7 +854,7 @@ PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc) Py_ssize_t start; Py_ssize_t end; PyObject *res; - unsigned char *outp; + Py_UCS1 *outp; int ressize; Py_UCS4 c; @@ -974,7 +965,7 @@ PyObject *PyCodec_NameReplaceErrors(PyObject *exc) Py_ssize_t start; Py_ssize_t end; PyObject *res; - unsigned char *outp; + Py_UCS1 *outp; Py_ssize_t ressize; int replsize; Py_UCS4 c; @@ -1500,34 +1491,39 @@ static int _PyCodecRegistry_Init(void) } }; - PyInterpreterState *interp = _PyInterpreterState_Get(); + PyInterpreterState *interp = _PyInterpreterState_GET(); PyObject *mod; - unsigned i; if (interp->codec_search_path != NULL) return 0; interp->codec_search_path = PyList_New(0); + if (interp->codec_search_path == NULL) { + return -1; + } + interp->codec_search_cache = PyDict_New(); + if (interp->codec_search_cache == NULL) { + return -1; + } + interp->codec_error_registry = PyDict_New(); + if (interp->codec_error_registry == NULL) { + return -1; + } - if (interp->codec_error_registry) { - for (i = 0; i < Py_ARRAY_LENGTH(methods); ++i) { - PyObject *func = PyCFunction_NewEx(&methods[i].def, NULL, NULL); - int res; - if (!func) - Py_FatalError("can't initialize codec error registry"); - res = PyCodec_RegisterError(methods[i].name, func); - Py_DECREF(func); - if (res) - Py_FatalError("can't initialize codec error registry"); + for (size_t i = 0; i < Py_ARRAY_LENGTH(methods); ++i) { + PyObject *func = PyCFunction_NewEx(&methods[i].def, NULL, NULL); + if (!func) { + return -1; } - } - if (interp->codec_search_path == NULL || - interp->codec_search_cache == NULL || - interp->codec_error_registry == NULL) - Py_FatalError("can't initialize codec registry"); + int res = PyCodec_RegisterError(methods[i].name, func); + Py_DECREF(func); + if (res) { + return -1; + } + } mod = PyImport_ImportModuleNoBlock("encodings"); if (mod == NULL) { diff --git a/Python/compile.c b/Python/compile.c index 3259e8a47f2d8d1be87ad9c345e7953e9aeddd06..722d52dbcefb1a7ddfdd9fe77ad6ed17180cb196 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -23,7 +23,6 @@ #include "Python.h" -#include "pycore_pystate.h" /* _PyInterpreterState_GET_UNSAFE() */ #include "Python-ast.h" #include "ast.h" #include "code.h" @@ -85,14 +84,16 @@ It's called a frame block to distinguish it from a basic block in the compiler IR. */ -enum fblocktype { WHILE_LOOP, FOR_LOOP, EXCEPT, FINALLY_TRY, FINALLY_TRY2, FINALLY_END, - WITH, ASYNC_WITH, HANDLER_CLEANUP }; +enum fblocktype { WHILE_LOOP, FOR_LOOP, TRY_EXCEPT, FINALLY_TRY, FINALLY_END, + WITH, ASYNC_WITH, HANDLER_CLEANUP, POP_VALUE, EXCEPTION_HANDLER }; struct fblockinfo { enum fblocktype fb_type; basicblock *fb_block; /* (optional) type-specific exit or cleanup block */ basicblock *fb_exit; + /* (optional) additional information required for unwinding */ + void *fb_datum; }; enum { @@ -140,8 +141,6 @@ struct compiler_unit { int u_firstlineno; /* the first lineno of the block */ int u_lineno; /* the lineno for the current stmt */ int u_col_offset; /* the offset of the current stmt */ - int u_lineno_set; /* boolean to indicate whether instr - has been generated with current lineno */ }; /* This struct captures the global state of a compilation. @@ -181,7 +180,7 @@ struct compiler { static int compiler_enter_scope(struct compiler *, identifier, int, void *, int); static void compiler_free(struct compiler *); static basicblock *compiler_new_block(struct compiler *); -static int compiler_next_instr(struct compiler *, basicblock *); +static int compiler_next_instr(basicblock *); static int compiler_addop(struct compiler *, int); static int compiler_addop_i(struct compiler *, int, Py_ssize_t); static int compiler_addop_j(struct compiler *, int, basicblock *, int); @@ -195,10 +194,11 @@ static int compiler_visit_keyword(struct compiler *, keyword_ty); static int compiler_visit_expr(struct compiler *, expr_ty); static int compiler_augassign(struct compiler *, stmt_ty); static int compiler_annassign(struct compiler *, stmt_ty); -static int compiler_visit_slice(struct compiler *, slice_ty, - expr_context_ty); +static int compiler_subscript(struct compiler *, expr_ty); +static int compiler_slice(struct compiler *, expr_ty); -static int inplace_binop(struct compiler *, operator_ty); +static int inplace_binop(operator_ty); +static int are_all_items_const(asdl_seq *, Py_ssize_t, Py_ssize_t); static int expr_constant(expr_ty); static int compiler_with(struct compiler *, stmt_ty, int); @@ -213,11 +213,13 @@ static int compiler_set_qualname(struct compiler *); static int compiler_sync_comprehension_generator( struct compiler *c, asdl_seq *generators, int gen_index, + int depth, expr_ty elt, expr_ty val, int type); static int compiler_async_comprehension_generator( struct compiler *c, asdl_seq *generators, int gen_index, + int depth, expr_ty elt, expr_ty val, int type); static PyCodeObject *assemble(struct compiler *, int addNone); @@ -320,7 +322,6 @@ PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags, PyCodeObject *co = NULL; PyCompilerFlags local_flags = _PyCompilerFlags_INIT; int merged; - PyConfig *config = &_PyInterpreterState_GET_UNSAFE()->config; if (!__doc__) { __doc__ = PyUnicode_InternFromString("__doc__"); @@ -347,11 +348,15 @@ PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags, c.c_future->ff_features = merged; flags->cf_flags = merged; c.c_flags = flags; - c.c_optimize = (optimize == -1) ? config->optimization_level : optimize; + c.c_optimize = (optimize == -1) ? _Py_GetConfig()->optimization_level : optimize; c.c_nestlevel = 0; c.c_do_not_emit_bytecode = 0; - if (!_PyAST_Optimize(mod, arena, c.c_optimize)) { + _PyASTOptimizeState state; + state.optimize = c.c_optimize; + state.ff_features = merged; + + if (!_PyAST_Optimize(mod, arena, &state)) { goto finally; } @@ -554,13 +559,12 @@ compiler_enter_scope(struct compiler *c, identifier name, struct compiler_unit *u; basicblock *block; - u = (struct compiler_unit *)PyObject_Malloc(sizeof( + u = (struct compiler_unit *)PyObject_Calloc(1, sizeof( struct compiler_unit)); if (!u) { PyErr_NoMemory(); return 0; } - memset(u, 0, sizeof(struct compiler_unit)); u->u_scope_type = scope_type; u->u_argcount = 0; u->u_posonlyargcount = 0; @@ -609,7 +613,6 @@ compiler_enter_scope(struct compiler *c, identifier name, u->u_firstlineno = lineno; u->u_lineno = 0; u->u_col_offset = 0; - u->u_lineno_set = 0; u->u_consts = PyDict_New(); if (!u->u_consts) { compiler_unit_free(u); @@ -764,12 +767,11 @@ compiler_new_block(struct compiler *c) struct compiler_unit *u; u = c->u; - b = (basicblock *)PyObject_Malloc(sizeof(basicblock)); + b = (basicblock *)PyObject_Calloc(1, sizeof(basicblock)); if (b == NULL) { PyErr_NoMemory(); return NULL; } - memset((void *)b, 0, sizeof(basicblock)); /* Extend the singly linked list of blocks with new block. */ b->b_list = u->u_blocks; u->u_blocks = b; @@ -802,19 +804,17 @@ compiler_use_next_block(struct compiler *c, basicblock *block) */ static int -compiler_next_instr(struct compiler *c, basicblock *b) +compiler_next_instr(basicblock *b) { assert(b != NULL); if (b->b_instr == NULL) { - b->b_instr = (struct instr *)PyObject_Malloc( - sizeof(struct instr) * DEFAULT_BLOCK_SIZE); + b->b_instr = (struct instr *)PyObject_Calloc( + DEFAULT_BLOCK_SIZE, sizeof(struct instr)); if (b->b_instr == NULL) { PyErr_NoMemory(); return -1; } b->b_ialloc = DEFAULT_BLOCK_SIZE; - memset((char *)b->b_instr, 0, - sizeof(struct instr) * DEFAULT_BLOCK_SIZE); } else if (b->b_iused == b->b_ialloc) { struct instr *tmp; @@ -844,28 +844,18 @@ compiler_next_instr(struct compiler *c, basicblock *b) return b->b_iused++; } -/* Set the i_lineno member of the instruction at offset off if the - line number for the current expression/statement has not - already been set. If it has been set, the call has no effect. +/* Set the line number and column offset for the following instructions. The line number is reset in the following cases: - when entering a new scope - on each statement - - on each expression that start a new line + - on each expression and sub-expression - before the "except" and "finally" clauses - - before the "for" and "while" expressions */ -static void -compiler_set_lineno(struct compiler *c, int off) -{ - basicblock *b; - if (c->u->u_lineno_set) - return; - c->u->u_lineno_set = 1; - b = c->u->u_curblock; - b->b_instr[off].i_lineno = c->u->u_lineno; -} +#define SET_LOC(c, x) \ + (c)->u->u_lineno = (x)->lineno; \ + (c)->u->u_col_offset = (x)->col_offset; /* Return the stack effect of opcode with argument oparg. @@ -964,12 +954,6 @@ stack_effect(int opcode, int oparg, int jump) * Restore the stack position and push 6 values before jumping to * the handler if an exception be raised. */ return jump ? 6 : 1; - case WITH_CLEANUP_START: - return 2; /* or 1, depending on TOS */ - case WITH_CLEANUP_FINISH: - /* Pop a variable number of values pushed by WITH_CLEANUP_START - * + __exit__ or __aexit__. */ - return -3; case RETURN_VALUE: return -1; case IMPORT_STAR: @@ -984,10 +968,6 @@ stack_effect(int opcode, int oparg, int jump) return 0; case POP_EXCEPT: return -3; - case END_FINALLY: - case POP_FINALLY: - /* Pop 6 values when an exception was raised. */ - return -6; case STORE_NAME: return -1; @@ -1018,13 +998,6 @@ stack_effect(int opcode, int oparg, int jump) case BUILD_SET: case BUILD_STRING: return 1-oparg; - case BUILD_LIST_UNPACK: - case BUILD_TUPLE_UNPACK: - case BUILD_TUPLE_UNPACK_WITH_CALL: - case BUILD_SET_UNPACK: - case BUILD_MAP_UNPACK: - case BUILD_MAP_UNPACK_WITH_CALL: - return 1 - oparg; case BUILD_MAP: return 1 - 2*oparg; case BUILD_CONST_KEY_MAP: @@ -1032,7 +1005,11 @@ stack_effect(int opcode, int oparg, int jump) case LOAD_ATTR: return 0; case COMPARE_OP: + case IS_OP: + case CONTAINS_OP: return -1; + case JUMP_IF_NOT_EXC_MATCH: + return -2; case IMPORT_NAME: return -1; case IMPORT_FROM: @@ -1060,14 +1037,11 @@ stack_effect(int opcode, int oparg, int jump) * Restore the stack position and push 6 values before jumping to * the handler if an exception be raised. */ return jump ? 6 : 0; - case BEGIN_FINALLY: - /* Actually pushes 1 value, but count 6 for balancing with - * END_FINALLY and POP_FINALLY. - * This is the main reason of using this opcode instead of - * "LOAD_CONST None". */ - return 6; - case CALL_FINALLY: - return jump ? 1 : 0; + case RERAISE: + return -3; + + case WITH_EXCEPT_START: + return 1; case LOAD_FAST: return 1; @@ -1133,6 +1107,15 @@ stack_effect(int opcode, int oparg, int jump) return (oparg & FVS_MASK) == FVS_HAVE_SPEC ? -1 : 0; case LOAD_METHOD: return 1; + case LOAD_ASSERTION_ERROR: + return 1; + case LIST_TO_TUPLE: + return 0; + case LIST_EXTEND: + case SET_UPDATE: + case DICT_MERGE: + case DICT_UPDATE: + return -1; default: return PY_INVALID_STACK_EFFECT; } @@ -1165,7 +1148,7 @@ compiler_addop(struct compiler *c, int opcode) if (c->c_do_not_emit_bytecode) { return 1; } - off = compiler_next_instr(c, c->u->u_curblock); + off = compiler_next_instr(c->u->u_curblock); if (off < 0) return 0; b = c->u->u_curblock; @@ -1174,12 +1157,12 @@ compiler_addop(struct compiler *c, int opcode) i->i_oparg = 0; if (opcode == RETURN_VALUE) b->b_return = 1; - compiler_set_lineno(c, off); + i->i_lineno = c->u->u_lineno; return 1; } static Py_ssize_t -compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o) +compiler_add_o(PyObject *dict, PyObject *o) { PyObject *v; Py_ssize_t arg; @@ -1327,7 +1310,7 @@ compiler_add_const(struct compiler *c, PyObject *o) return -1; } - Py_ssize_t arg = compiler_add_o(c, c->u->u_consts, key); + Py_ssize_t arg = compiler_add_o(c->u->u_consts, key); Py_DECREF(key); return arg; } @@ -1353,7 +1336,7 @@ compiler_addop_o(struct compiler *c, int opcode, PyObject *dict, return 1; } - Py_ssize_t arg = compiler_add_o(c, dict, o); + Py_ssize_t arg = compiler_add_o(dict, o); if (arg < 0) return 0; return compiler_addop_i(c, opcode, arg); @@ -1372,7 +1355,7 @@ compiler_addop_name(struct compiler *c, int opcode, PyObject *dict, PyObject *mangled = _Py_Mangle(c->u->u_private, o); if (!mangled) return 0; - arg = compiler_add_o(c, dict, mangled); + arg = compiler_add_o(dict, mangled); Py_DECREF(mangled); if (arg < 0) return 0; @@ -1403,13 +1386,13 @@ compiler_addop_i(struct compiler *c, int opcode, Py_ssize_t oparg) assert(HAS_ARG(opcode)); assert(0 <= oparg && oparg <= 2147483647); - off = compiler_next_instr(c, c->u->u_curblock); + off = compiler_next_instr(c->u->u_curblock); if (off < 0) return 0; i = &c->u->u_curblock->b_instr[off]; i->i_opcode = opcode; i->i_oparg = Py_SAFE_DOWNCAST(oparg, Py_ssize_t, int); - compiler_set_lineno(c, off); + i->i_lineno = c->u->u_lineno; return 1; } @@ -1425,7 +1408,7 @@ compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute) assert(HAS_ARG(opcode)); assert(b != NULL); - off = compiler_next_instr(c, c->u->u_curblock); + off = compiler_next_instr(c->u->u_curblock); if (off < 0) return 0; i = &c->u->u_curblock->b_instr[off]; @@ -1435,7 +1418,7 @@ compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute) i->i_jabs = 1; else i->i_jrel = 1; - compiler_set_lineno(c, off); + i->i_lineno = c->u->u_lineno; return 1; } @@ -1514,6 +1497,12 @@ compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute) return 0; \ } + +#define ADDOP_COMPARE(C, CMP) { \ + if (!compiler_addcompare((C), (cmpop_ty)(CMP))) \ + return 0; \ +} + /* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use the ASDL name to synthesize the name of the C type and the visit function. */ @@ -1631,18 +1620,17 @@ find_ann(asdl_seq *stmts) static int compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b, - basicblock *exit) + basicblock *exit, void *datum) { struct fblockinfo *f; if (c->u->u_nfblocks >= CO_MAXBLOCKS) { - PyErr_SetString(PyExc_SyntaxError, - "too many statically nested blocks"); - return 0; + return compiler_error(c, "too many statically nested blocks"); } f = &c->u->u_fblock[c->u->u_nfblocks++]; f->fb_type = t; f->fb_block = b; f->fb_exit = exit; + f->fb_datum = datum; return 1; } @@ -1656,8 +1644,19 @@ compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b) assert(u->u_fblock[u->u_nfblocks].fb_block == b); } +static int +compiler_call_exit_with_nones(struct compiler *c) { + ADDOP_O(c, LOAD_CONST, Py_None, consts); + ADDOP(c, DUP_TOP); + ADDOP(c, DUP_TOP); + ADDOP_I(c, CALL_FUNCTION, 3); + return 1; +} + /* Unwind a frame block. If preserve_tos is true, the TOS before - * popping the blocks will be restored afterwards. + * popping the blocks will be restored afterwards, unless another + * return, break or continue is found. In which case, the TOS will + * be popped. */ static int compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info, @@ -1665,15 +1664,7 @@ compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info, { switch (info->fb_type) { case WHILE_LOOP: - return 1; - - case FINALLY_END: - info->fb_exit = NULL; - ADDOP_I(c, POP_FINALLY, preserve_tos); - if (preserve_tos) { - ADDOP(c, ROT_TWO); - } - ADDOP(c, POP_TOP); + case EXCEPTION_HANDLER: return 1; case FOR_LOOP: @@ -1684,26 +1675,37 @@ compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info, ADDOP(c, POP_TOP); return 1; - case EXCEPT: + case TRY_EXCEPT: ADDOP(c, POP_BLOCK); return 1; case FINALLY_TRY: ADDOP(c, POP_BLOCK); - ADDOP_JREL(c, CALL_FINALLY, info->fb_exit); + if (preserve_tos) { + if (!compiler_push_fblock(c, POP_VALUE, NULL, NULL, NULL)) { + return 0; + } + } + /* Emit the finally block, restoring the line number when done */ + int saved_lineno = c->u->u_lineno; + VISIT_SEQ(c, stmt, info->fb_datum); + c->u->u_lineno = saved_lineno; + if (preserve_tos) { + compiler_pop_fblock(c, POP_VALUE, NULL); + } return 1; - case FINALLY_TRY2: - ADDOP(c, POP_BLOCK); + case FINALLY_END: if (preserve_tos) { - ADDOP(c, ROT_TWO); - ADDOP(c, POP_TOP); - ADDOP_JREL(c, CALL_FINALLY, info->fb_exit); + ADDOP(c, ROT_FOUR); } - else { - ADDOP_JREL(c, CALL_FINALLY, info->fb_exit); - ADDOP(c, POP_TOP); + ADDOP(c, POP_TOP); + ADDOP(c, POP_TOP); + ADDOP(c, POP_TOP); + if (preserve_tos) { + ADDOP(c, ROT_FOUR); } + ADDOP(c, POP_EXCEPT); return 1; case WITH: @@ -1712,34 +1714,66 @@ compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info, if (preserve_tos) { ADDOP(c, ROT_TWO); } - ADDOP(c, BEGIN_FINALLY); - ADDOP(c, WITH_CLEANUP_START); + if(!compiler_call_exit_with_nones(c)) { + return 0; + } if (info->fb_type == ASYNC_WITH) { ADDOP(c, GET_AWAITABLE); ADDOP_LOAD_CONST(c, Py_None); ADDOP(c, YIELD_FROM); } - ADDOP(c, WITH_CLEANUP_FINISH); - ADDOP_I(c, POP_FINALLY, 0); + ADDOP(c, POP_TOP); return 1; case HANDLER_CLEANUP: + if (info->fb_datum) { + ADDOP(c, POP_BLOCK); + } if (preserve_tos) { ADDOP(c, ROT_FOUR); } - if (info->fb_exit) { - ADDOP(c, POP_BLOCK); - ADDOP(c, POP_EXCEPT); - ADDOP_JREL(c, CALL_FINALLY, info->fb_exit); + ADDOP(c, POP_EXCEPT); + if (info->fb_datum) { + ADDOP_LOAD_CONST(c, Py_None); + compiler_nameop(c, info->fb_datum, Store); + compiler_nameop(c, info->fb_datum, Del); } - else { - ADDOP(c, POP_EXCEPT); + return 1; + + case POP_VALUE: + if (preserve_tos) { + ADDOP(c, ROT_TWO); } + ADDOP(c, POP_TOP); return 1; } Py_UNREACHABLE(); } +/** Unwind block stack. If loop is not NULL, then stop when the first loop is encountered. */ +static int +compiler_unwind_fblock_stack(struct compiler *c, int preserve_tos, struct fblockinfo **loop) { + if (c->u->u_nfblocks == 0) { + return 1; + } + struct fblockinfo *top = &c->u->u_fblock[c->u->u_nfblocks-1]; + if (loop != NULL && (top->fb_type == WHILE_LOOP || top->fb_type == FOR_LOOP)) { + *loop = top; + return 1; + } + struct fblockinfo copy = *top; + c->u->u_nfblocks--; + if (!compiler_unwind_fblock(c, ©, preserve_tos)) { + return 0; + } + if (!compiler_unwind_fblock_stack(c, preserve_tos, loop)) { + return 0; + } + c->u->u_fblock[c->u->u_nfblocks] = copy; + c->u->u_nfblocks++; + return 1; +} + /* Compile a sequence of statements, checking for a docstring and for annotations. */ @@ -1754,10 +1788,9 @@ compiler_body(struct compiler *c, asdl_seq *stmts) This way line number for SETUP_ANNOTATIONS will always coincide with the line number of first "real" statement in module. If body is empty, then lineno will be set later in assemble. */ - if (c->u->u_scope_type == COMPILER_SCOPE_MODULE && - !c->u->u_lineno && asdl_seq_LEN(stmts)) { + if (c->u->u_scope_type == COMPILER_SCOPE_MODULE && asdl_seq_LEN(stmts)) { st = (stmt_ty)asdl_seq_GET(stmts, 0); - c->u->u_lineno = st->lineno; + SET_LOC(c, st); } /* Every annotated class and module should have __annotations__. */ if (find_ann(stmts)) { @@ -1815,10 +1848,6 @@ compiler_mod(struct compiler *c, mod_ty mod) VISIT_IN_SCOPE(c, expr, mod->v.Expression.body); addNone = 0; break; - case Suite_kind: - PyErr_SetString(PyExc_SystemError, - "suite should not be possible"); - return 0; default: PyErr_Format(PyExc_SystemError, "module kind %d should not be possible", @@ -1844,18 +1873,15 @@ get_ref_type(struct compiler *c, PyObject *name) return CELL; scope = PyST_GetScope(c->u->u_ste, name); if (scope == 0) { - char buf[350]; - PyOS_snprintf(buf, sizeof(buf), - "unknown scope for %.100s in %.100s(%s)\n" - "symbols: %s\nlocals: %s\nglobals: %s", - PyUnicode_AsUTF8(name), - PyUnicode_AsUTF8(c->u->u_name), - PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_id)), - PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_symbols)), - PyUnicode_AsUTF8(PyObject_Repr(c->u->u_varnames)), - PyUnicode_AsUTF8(PyObject_Repr(c->u->u_names)) - ); - Py_FatalError(buf); + _Py_FatalErrorFormat(__func__, + "unknown scope for %.100s in %.100s(%s)\n" + "symbols: %s\nlocals: %s\nglobals: %s", + PyUnicode_AsUTF8(name), + PyUnicode_AsUTF8(c->u->u_name), + PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_id)), + PyUnicode_AsUTF8(PyObject_Repr(c->u->u_ste->ste_symbols)), + PyUnicode_AsUTF8(PyObject_Repr(c->u->u_varnames)), + PyUnicode_AsUTF8(PyObject_Repr(c->u->u_names))); } return scope; @@ -1890,7 +1916,7 @@ compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t flags, Py free variable that has the same name as a method, the name will be considered free *and* local in the class. It should be handled by the closure, as - well as by the normal name loookup logic. + well as by the normal name lookup logic. */ reftype = get_ref_type(c, name); if (reftype == CELL) @@ -1898,7 +1924,7 @@ compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t flags, Py else /* (reftype == FREE) */ arg = compiler_lookup_arg(c->u->u_freevars, name); if (arg == -1) { - fprintf(stderr, + _Py_FatalErrorFormat(__func__, "lookup %s in %s %d %d\n" "freevars of %s: %s\n", PyUnicode_AsUTF8(PyObject_Repr(name)), @@ -1906,7 +1932,6 @@ compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t flags, Py reftype, arg, PyUnicode_AsUTF8(co->co_name), PyUnicode_AsUTF8(PyObject_Repr(co->co_freevars))); - Py_FatalError("compiler_make_closure()"); } ADDOP_I(c, LOAD_CLOSURE, arg); } @@ -2126,6 +2151,55 @@ compiler_default_arguments(struct compiler *c, arguments_ty args) return funcflags; } +static int +forbidden_name(struct compiler *c, identifier name, expr_context_ty ctx) +{ + + if (ctx == Store && _PyUnicode_EqualToASCIIString(name, "__debug__")) { + compiler_error(c, "cannot assign to __debug__"); + return 1; + } + return 0; +} + +static int +compiler_check_debug_one_arg(struct compiler *c, arg_ty arg) +{ + if (arg != NULL) { + if (forbidden_name(c, arg->arg, Store)) + return 0; + } + return 1; +} + +static int +compiler_check_debug_args_seq(struct compiler *c, asdl_seq *args) +{ + if (args != NULL) { + for (Py_ssize_t i = 0, n = asdl_seq_LEN(args); i < n; i++) { + if (!compiler_check_debug_one_arg(c, asdl_seq_GET(args, i))) + return 0; + } + } + return 1; +} + +static int +compiler_check_debug_args(struct compiler *c, arguments_ty args) +{ + if (!compiler_check_debug_args_seq(c, args->posonlyargs)) + return 0; + if (!compiler_check_debug_args_seq(c, args->args)) + return 0; + if (!compiler_check_debug_one_arg(c, args->vararg)) + return 0; + if (!compiler_check_debug_args_seq(c, args->kwonlyargs)) + return 0; + if (!compiler_check_debug_one_arg(c, args->kwarg)) + return 0; + return 1; +} + static int compiler_function(struct compiler *c, stmt_ty s, int is_async) { @@ -2163,6 +2237,9 @@ compiler_function(struct compiler *c, stmt_ty s, int is_async) scope_type = COMPILER_SCOPE_FUNCTION; } + if (!compiler_check_debug_args(c, args)) + return 0; + if (!compiler_decorators(c, decos)) return 0; @@ -2398,35 +2475,49 @@ check_compare(struct compiler *c, expr_ty e) return 1; } -static int -cmpop(cmpop_ty op) +static int compiler_addcompare(struct compiler *c, cmpop_ty op) { + int cmp; switch (op) { case Eq: - return PyCmp_EQ; + cmp = Py_EQ; + break; case NotEq: - return PyCmp_NE; + cmp = Py_NE; + break; case Lt: - return PyCmp_LT; + cmp = Py_LT; + break; case LtE: - return PyCmp_LE; + cmp = Py_LE; + break; case Gt: - return PyCmp_GT; + cmp = Py_GT; + break; case GtE: - return PyCmp_GE; + cmp = Py_GE; + break; case Is: - return PyCmp_IS; + ADDOP_I(c, IS_OP, 0); + return 1; case IsNot: - return PyCmp_IS_NOT; + ADDOP_I(c, IS_OP, 1); + return 1; case In: - return PyCmp_IN; + ADDOP_I(c, CONTAINS_OP, 0); + return 1; case NotIn: - return PyCmp_NOT_IN; + ADDOP_I(c, CONTAINS_OP, 1); + return 1; default: - return PyCmp_BAD; + Py_UNREACHABLE(); } + ADDOP_I(c, COMPARE_OP, cmp); + return 1; } + + static int compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond) { @@ -2491,14 +2582,12 @@ compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond) (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i)); ADDOP(c, DUP_TOP); ADDOP(c, ROT_THREE); - ADDOP_I(c, COMPARE_OP, - cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, i)))); + ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i)); ADDOP_JABS(c, POP_JUMP_IF_FALSE, cleanup); NEXT_BLOCK(c); } VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n)); - ADDOP_I(c, COMPARE_OP, - cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n)))); + ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n)); ADDOP_JABS(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next); basicblock *end = compiler_new_block(c); if (end == NULL) @@ -2558,6 +2647,9 @@ compiler_lambda(struct compiler *c, expr_ty e) arguments_ty args = e->v.Lambda.args; assert(e->kind == Lambda_kind); + if (!compiler_check_debug_args(c, args)) + return 0; + if (!name) { name = PyUnicode_InternFromString(""); if (!name) @@ -2636,10 +2728,12 @@ compiler_if(struct compiler *c, stmt_ty s) if (next == NULL) return 0; } - else + else { next = end; - if (!compiler_jump_if(c, s->v.If.test, next, 0)) + } + if (!compiler_jump_if(c, s->v.If.test, next, 0)) { return 0; + } VISIT_SEQ(c, stmt, s->v.If.body); if (asdl_seq_LEN(s->v.If.orelse)) { ADDOP_JREL(c, JUMP_FORWARD, end); @@ -2659,12 +2753,12 @@ compiler_for(struct compiler *c, stmt_ty s) start = compiler_new_block(c); cleanup = compiler_new_block(c); end = compiler_new_block(c); - if (start == NULL || end == NULL || cleanup == NULL) + if (start == NULL || end == NULL || cleanup == NULL) { return 0; - - if (!compiler_push_fblock(c, FOR_LOOP, start, end)) + } + if (!compiler_push_fblock(c, FOR_LOOP, start, end, NULL)) { return 0; - + } VISIT(c, expr, s->v.For.iter); ADDOP(c, GET_ITER); compiler_use_next_block(c, start); @@ -2696,16 +2790,16 @@ compiler_async_for(struct compiler *c, stmt_ty s) except = compiler_new_block(c); end = compiler_new_block(c); - if (start == NULL || except == NULL || end == NULL) + if (start == NULL || except == NULL || end == NULL) { return 0; - + } VISIT(c, expr, s->v.AsyncFor.iter); ADDOP(c, GET_AITER); compiler_use_next_block(c, start); - if (!compiler_push_fblock(c, FOR_LOOP, start, end)) + if (!compiler_push_fblock(c, FOR_LOOP, start, end, NULL)) { return 0; - + } /* SETUP_FINALLY to guard the __anext__ call */ ADDOP_JREL(c, SETUP_FINALLY, except); ADDOP(c, GET_ANEXT); @@ -2743,7 +2837,7 @@ compiler_while(struct compiler *c, stmt_ty s) // Push a dummy block so the VISIT_SEQ knows that we are // inside a while loop so it can correctly evaluate syntax // errors. - if (!compiler_push_fblock(c, WHILE_LOOP, NULL, NULL)) { + if (!compiler_push_fblock(c, WHILE_LOOP, NULL, NULL, NULL)) { return 0; } VISIT_SEQ(c, stmt, s->v.While.body); @@ -2773,7 +2867,7 @@ compiler_while(struct compiler *c, stmt_ty s) orelse = NULL; compiler_use_next_block(c, loop); - if (!compiler_push_fblock(c, WHILE_LOOP, loop, end)) + if (!compiler_push_fblock(c, WHILE_LOOP, loop, end, NULL)) return 0; if (constant == -1) { if (!compiler_jump_if(c, s->v.While.test, anchor, 0)) @@ -2813,12 +2907,8 @@ compiler_return(struct compiler *c, stmt_ty s) if (preserve_tos) { VISIT(c, expr, s->v.Return.value); } - for (int depth = c->u->u_nfblocks; depth--;) { - struct fblockinfo *info = &c->u->u_fblock[depth]; - - if (!compiler_unwind_fblock(c, info, preserve_tos)) - return 0; - } + if (!compiler_unwind_fblock_stack(c, preserve_tos, NULL)) + return 0; if (s->v.Return.value == NULL) { ADDOP_LOAD_CONST(c, Py_None); } @@ -2833,33 +2923,32 @@ compiler_return(struct compiler *c, stmt_ty s) static int compiler_break(struct compiler *c) { - for (int depth = c->u->u_nfblocks; depth--;) { - struct fblockinfo *info = &c->u->u_fblock[depth]; - - if (!compiler_unwind_fblock(c, info, 0)) - return 0; - if (info->fb_type == WHILE_LOOP || info->fb_type == FOR_LOOP) { - ADDOP_JABS(c, JUMP_ABSOLUTE, info->fb_exit); - return 1; - } + struct fblockinfo *loop = NULL; + if (!compiler_unwind_fblock_stack(c, 0, &loop)) { + return 0; + } + if (loop == NULL) { + return compiler_error(c, "'break' outside loop"); + } + if (!compiler_unwind_fblock(c, loop, 0)) { + return 0; } - return compiler_error(c, "'break' outside loop"); + ADDOP_JABS(c, JUMP_ABSOLUTE, loop->fb_exit); + return 1; } static int compiler_continue(struct compiler *c) { - for (int depth = c->u->u_nfblocks; depth--;) { - struct fblockinfo *info = &c->u->u_fblock[depth]; - - if (info->fb_type == WHILE_LOOP || info->fb_type == FOR_LOOP) { - ADDOP_JABS(c, JUMP_ABSOLUTE, info->fb_block); - return 1; - } - if (!compiler_unwind_fblock(c, info, 0)) - return 0; + struct fblockinfo *loop = NULL; + if (!compiler_unwind_fblock_stack(c, 0, &loop)) { + return 0; + } + if (loop == NULL) { + return compiler_error(c, "'continue' not properly in loop"); } - return compiler_error(c, "'continue' not properly in loop"); + ADDOP_JABS(c, JUMP_ABSOLUTE, loop->fb_block); + return 1; } @@ -2868,10 +2957,11 @@ compiler_continue(struct compiler *c) SETUP_FINALLY L POP_BLOCK - BEGIN_FINALLY + + JUMP E L: - END_FINALLY + E: The special instructions use the block stack. Each block stack entry contains the instruction that created it (here @@ -2883,11 +2973,6 @@ compiler_continue(struct compiler *c) onto the block stack. POP_BLOCK: Pops en entry from the block stack. - BEGIN_FINALLY - Pushes NULL onto the value stack. - END_FINALLY: - Pops 1 (NULL or int) or 6 entries from the *value* stack and restore - the raised and the caught exceptions they specify. The block stack is unwound when an exception is raised: when a SETUP_FINALLY entry is found, the raised and the caught @@ -2899,47 +2984,18 @@ compiler_continue(struct compiler *c) static int compiler_try_finally(struct compiler *c, stmt_ty s) { - basicblock *start, *newcurblock, *body, *end; - int break_finally = 1; + basicblock *body, *end, *exit; body = compiler_new_block(c); end = compiler_new_block(c); - if (body == NULL || end == NULL) - return 0; - - start = c->u->u_curblock; - - /* `finally` block. Compile it first to determine if any of "break", - "continue" or "return" are used in it. */ - compiler_use_next_block(c, end); - if (!compiler_push_fblock(c, FINALLY_END, end, end)) + exit = compiler_new_block(c); + if (body == NULL || end == NULL || exit == NULL) return 0; - VISIT_SEQ(c, stmt, s->v.Try.finalbody); - ADDOP(c, END_FINALLY); - break_finally = (c->u->u_fblock[c->u->u_nfblocks - 1].fb_exit == NULL); - if (break_finally) { - /* Pops a placeholder. See below */ - ADDOP(c, POP_TOP); - } - compiler_pop_fblock(c, FINALLY_END, end); - - newcurblock = c->u->u_curblock; - c->u->u_curblock = start; - start->b_next = NULL; /* `try` block */ - c->u->u_lineno_set = 0; - c->u->u_lineno = s->lineno; - c->u->u_col_offset = s->col_offset; - if (break_finally) { - /* Pushes a placeholder for the value of "return" in the "try" block - to balance the stack for "break", "continue" and "return" in - the "finally" block. */ - ADDOP_LOAD_CONST(c, Py_None); - } ADDOP_JREL(c, SETUP_FINALLY, end); compiler_use_next_block(c, body); - if (!compiler_push_fblock(c, break_finally ? FINALLY_TRY2 : FINALLY_TRY, body, end)) + if (!compiler_push_fblock(c, FINALLY_TRY, body, end, s->v.Try.finalbody)) return 0; if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) { if (!compiler_try_except(c, s)) @@ -2949,12 +3005,17 @@ compiler_try_finally(struct compiler *c, stmt_ty s) VISIT_SEQ(c, stmt, s->v.Try.body); } ADDOP(c, POP_BLOCK); - ADDOP(c, BEGIN_FINALLY); - compiler_pop_fblock(c, break_finally ? FINALLY_TRY2 : FINALLY_TRY, body); - - c->u->u_curblock->b_next = end; - c->u->u_curblock = newcurblock; - + compiler_pop_fblock(c, FINALLY_TRY, body); + VISIT_SEQ(c, stmt, s->v.Try.finalbody); + ADDOP_JREL(c, JUMP_FORWARD, exit); + /* `finally` block */ + compiler_use_next_block(c, end); + if (!compiler_push_fblock(c, FINALLY_END, end, NULL, NULL)) + return 0; + VISIT_SEQ(c, stmt, s->v.Try.finalbody); + compiler_pop_fblock(c, FINALLY_END, end); + ADDOP(c, RERAISE); + compiler_use_next_block(c, exit); return 1; } @@ -2972,8 +3033,7 @@ compiler_try_finally(struct compiler *c, stmt_ty s) [tb, val, exc] L1: DUP ) [tb, val, exc, exc] ) - [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1 - [tb, val, exc, 1-or-0] POP_JUMP_IF_FALSE L2 ) + [tb, val, exc, exc, E1] JUMP_IF_NOT_EXC_MATCH L2 ) only if E1 [tb, val, exc] POP [tb, val] (or POP if no V1) [tb] POP @@ -2983,7 +3043,7 @@ compiler_try_finally(struct compiler *c, stmt_ty s) [tb, val, exc] L2: DUP .............................etc....................... - [tb, val, exc] Ln+1: END_FINALLY # re-raise exception + [tb, val, exc] Ln+1: RERAISE # re-raise exception [] L0: @@ -3003,30 +3063,30 @@ compiler_try_except(struct compiler *c, stmt_ty s) return 0; ADDOP_JREL(c, SETUP_FINALLY, except); compiler_use_next_block(c, body); - if (!compiler_push_fblock(c, EXCEPT, body, NULL)) + if (!compiler_push_fblock(c, TRY_EXCEPT, body, NULL, NULL)) return 0; VISIT_SEQ(c, stmt, s->v.Try.body); ADDOP(c, POP_BLOCK); - compiler_pop_fblock(c, EXCEPT, body); + compiler_pop_fblock(c, TRY_EXCEPT, body); ADDOP_JREL(c, JUMP_FORWARD, orelse); n = asdl_seq_LEN(s->v.Try.handlers); compiler_use_next_block(c, except); + /* Runtime will push a block here, so we need to account for that */ + if (!compiler_push_fblock(c, EXCEPTION_HANDLER, NULL, NULL, NULL)) + return 0; for (i = 0; i < n; i++) { excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET( s->v.Try.handlers, i); if (!handler->v.ExceptHandler.type && i < n-1) return compiler_error(c, "default 'except:' must be last"); - c->u->u_lineno_set = 0; - c->u->u_lineno = handler->lineno; - c->u->u_col_offset = handler->col_offset; + SET_LOC(c, handler); except = compiler_new_block(c); if (except == NULL) return 0; if (handler->v.ExceptHandler.type) { ADDOP(c, DUP_TOP); VISIT(c, expr, handler->v.ExceptHandler.type); - ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH); - ADDOP_JABS(c, POP_JUMP_IF_FALSE, except); + ADDOP_JABS(c, JUMP_IF_NOT_EXC_MATCH, except); } ADDOP(c, POP_TOP); if (handler->v.ExceptHandler.name) { @@ -3055,28 +3115,29 @@ compiler_try_except(struct compiler *c, stmt_ty s) /* second try: */ ADDOP_JREL(c, SETUP_FINALLY, cleanup_end); compiler_use_next_block(c, cleanup_body); - if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, cleanup_end)) + if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, handler->v.ExceptHandler.name)) return 0; /* second # body */ VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body); - ADDOP(c, POP_BLOCK); - ADDOP(c, BEGIN_FINALLY); compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body); + ADDOP(c, POP_BLOCK); + ADDOP(c, POP_EXCEPT); + /* name = None; del name */ + ADDOP_LOAD_CONST(c, Py_None); + compiler_nameop(c, handler->v.ExceptHandler.name, Store); + compiler_nameop(c, handler->v.ExceptHandler.name, Del); + ADDOP_JREL(c, JUMP_FORWARD, end); - /* finally: */ + /* except: */ compiler_use_next_block(c, cleanup_end); - if (!compiler_push_fblock(c, FINALLY_END, cleanup_end, NULL)) - return 0; /* name = None; del name */ ADDOP_LOAD_CONST(c, Py_None); compiler_nameop(c, handler->v.ExceptHandler.name, Store); compiler_nameop(c, handler->v.ExceptHandler.name, Del); - ADDOP(c, END_FINALLY); - ADDOP(c, POP_EXCEPT); - compiler_pop_fblock(c, FINALLY_END, cleanup_end); + ADDOP(c, RERAISE); } else { basicblock *cleanup_body; @@ -3088,16 +3149,17 @@ compiler_try_except(struct compiler *c, stmt_ty s) ADDOP(c, POP_TOP); ADDOP(c, POP_TOP); compiler_use_next_block(c, cleanup_body); - if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL)) + if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, NULL)) return 0; VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body); - ADDOP(c, POP_EXCEPT); compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body); + ADDOP(c, POP_EXCEPT); + ADDOP_JREL(c, JUMP_FORWARD, end); } - ADDOP_JREL(c, JUMP_FORWARD, end); compiler_use_next_block(c, except); } - ADDOP(c, END_FINALLY); + compiler_pop_fblock(c, EXCEPTION_HANDLER, NULL); + ADDOP(c, RERAISE); compiler_use_next_block(c, orelse); VISIT_SEQ(c, stmt, s->v.Try.orelse); compiler_use_next_block(c, end); @@ -3265,16 +3327,10 @@ compiler_from_import(struct compiler *c, stmt_ty s) static int compiler_assert(struct compiler *c, stmt_ty s) { - static PyObject *assertion_error = NULL; basicblock *end; if (c->c_optimize) return 1; - if (assertion_error == NULL) { - assertion_error = PyUnicode_InternFromString("AssertionError"); - if (assertion_error == NULL) - return 0; - } if (s->v.Assert.test->kind == Tuple_kind && asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) { @@ -3289,7 +3345,7 @@ compiler_assert(struct compiler *c, stmt_ty s) return 0; if (!compiler_jump_if(c, s->v.Assert.test, end, 1)) return 0; - ADDOP_O(c, LOAD_GLOBAL, assertion_error, names); + ADDOP(c, LOAD_ASSERTION_ERROR); if (s->v.Assert.msg) { VISIT(c, expr, s->v.Assert.msg); ADDOP_I(c, CALL_FUNCTION, 1); @@ -3324,9 +3380,7 @@ compiler_visit_stmt(struct compiler *c, stmt_ty s) Py_ssize_t i, n; /* Always assign a lineno to the next instruction for a stmt. */ - c->u->u_lineno = s->lineno; - c->u->u_col_offset = s->col_offset; - c->u->u_lineno_set = 0; + SET_LOC(c, s); switch (s->kind) { case FunctionDef_kind: @@ -3422,7 +3476,7 @@ unaryop(unaryop_ty op) } static int -binop(struct compiler *c, operator_ty op) +binop(operator_ty op) { switch (op) { case Add: @@ -3459,7 +3513,7 @@ binop(struct compiler *c, operator_ty op) } static int -inplace_binop(struct compiler *c, operator_ty op) +inplace_binop(operator_ty op) { switch (op) { case Add: @@ -3504,12 +3558,14 @@ compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx) PyObject *dict = c->u->u_names; PyObject *mangled; - /* XXX AugStore isn't used anywhere! */ assert(!_PyUnicode_EqualToASCIIString(name, "None") && !_PyUnicode_EqualToASCIIString(name, "True") && !_PyUnicode_EqualToASCIIString(name, "False")); + if (forbidden_name(c, name, ctx)) + return 0; + mangled = _Py_Mangle(c->u->u_private, name); if (!mangled) return 0; @@ -3551,76 +3607,36 @@ compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx) case Load: op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF; break; - case Store: - op = STORE_DEREF; - break; - case AugLoad: - case AugStore: - break; + case Store: op = STORE_DEREF; break; case Del: op = DELETE_DEREF; break; - case Param: - default: - PyErr_SetString(PyExc_SystemError, - "param invalid for deref variable"); - return 0; } break; case OP_FAST: switch (ctx) { case Load: op = LOAD_FAST; break; - case Store: - op = STORE_FAST; - break; + case Store: op = STORE_FAST; break; case Del: op = DELETE_FAST; break; - case AugLoad: - case AugStore: - break; - case Param: - default: - PyErr_SetString(PyExc_SystemError, - "param invalid for local variable"); - return 0; } ADDOP_N(c, op, mangled, varnames); return 1; case OP_GLOBAL: switch (ctx) { case Load: op = LOAD_GLOBAL; break; - case Store: - op = STORE_GLOBAL; - break; + case Store: op = STORE_GLOBAL; break; case Del: op = DELETE_GLOBAL; break; - case AugLoad: - case AugStore: - break; - case Param: - default: - PyErr_SetString(PyExc_SystemError, - "param invalid for global variable"); - return 0; } break; case OP_NAME: switch (ctx) { case Load: op = LOAD_NAME; break; - case Store: - op = STORE_NAME; - break; + case Store: op = STORE_NAME; break; case Del: op = DELETE_NAME; break; - case AugLoad: - case AugStore: - break; - case Param: - default: - PyErr_SetString(PyExc_SystemError, - "param invalid for name variable"); - return 0; } break; } assert(op); - arg = compiler_add_o(c, dict, mangled); + arg = compiler_add_o(dict, mangled); Py_DECREF(mangled); if (arg < 0) return 0; @@ -3656,36 +3672,79 @@ compiler_boolop(struct compiler *c, expr_ty e) } static int -starunpack_helper(struct compiler *c, asdl_seq *elts, - int single_op, int inner_op, int outer_op) +starunpack_helper(struct compiler *c, asdl_seq *elts, int pushed, + int build, int add, int extend, int tuple) { Py_ssize_t n = asdl_seq_LEN(elts); - Py_ssize_t i, nsubitems = 0, nseen = 0; + Py_ssize_t i, seen_star = 0; + if (n > 2 && are_all_items_const(elts, 0, n)) { + PyObject *folded = PyTuple_New(n); + if (folded == NULL) { + return 0; + } + PyObject *val; + for (i = 0; i < n; i++) { + val = ((expr_ty)asdl_seq_GET(elts, i))->v.Constant.value; + Py_INCREF(val); + PyTuple_SET_ITEM(folded, i, val); + } + if (tuple) { + ADDOP_LOAD_CONST_NEW(c, folded); + } else { + if (add == SET_ADD) { + Py_SETREF(folded, PyFrozenSet_New(folded)); + if (folded == NULL) { + return 0; + } + } + ADDOP_I(c, build, pushed); + ADDOP_LOAD_CONST_NEW(c, folded); + ADDOP_I(c, extend, 1); + } + return 1; + } + for (i = 0; i < n; i++) { expr_ty elt = asdl_seq_GET(elts, i); if (elt->kind == Starred_kind) { - if (nseen) { - ADDOP_I(c, inner_op, nseen); - nseen = 0; - nsubitems++; + seen_star = 1; + } + } + if (seen_star) { + seen_star = 0; + for (i = 0; i < n; i++) { + expr_ty elt = asdl_seq_GET(elts, i); + if (elt->kind == Starred_kind) { + if (seen_star == 0) { + ADDOP_I(c, build, i+pushed); + seen_star = 1; + } + VISIT(c, expr, elt->v.Starred.value); + ADDOP_I(c, extend, 1); + } + else { + VISIT(c, expr, elt); + if (seen_star) { + ADDOP_I(c, add, 1); + } } - VISIT(c, expr, elt->v.Starred.value); - nsubitems++; } - else { - VISIT(c, expr, elt); - nseen++; + assert(seen_star); + if (tuple) { + ADDOP(c, LIST_TO_TUPLE); } } - if (nsubitems) { - if (nseen) { - ADDOP_I(c, inner_op, nseen); - nsubitems++; + else { + for (i = 0; i < n; i++) { + expr_ty elt = asdl_seq_GET(elts, i); + VISIT(c, expr, elt); + } + if (tuple) { + ADDOP_I(c, BUILD_TUPLE, n+pushed); + } else { + ADDOP_I(c, build, n+pushed); } - ADDOP_I(c, outer_op, nsubitems); } - else - ADDOP_I(c, single_op, nseen); return 1; } @@ -3705,17 +3764,19 @@ assignment_helper(struct compiler *c, asdl_seq *elts) "star-unpacking assignment"); ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8))); seen_star = 1; - asdl_seq_SET(elts, i, elt->v.Starred.value); } else if (elt->kind == Starred_kind) { return compiler_error(c, - "two starred expressions in assignment"); + "multiple starred expressions in assignment"); } } if (!seen_star) { ADDOP_I(c, UNPACK_SEQUENCE, n); } - VISIT_SEQ(c, expr, elts); + for (i = 0; i < n; i++) { + expr_ty elt = asdl_seq_GET(elts, i); + VISIT(c, expr, elt->kind != Starred_kind ? elt : elt->v.Starred.value); + } return 1; } @@ -3727,8 +3788,8 @@ compiler_list(struct compiler *c, expr_ty e) return assignment_helper(c, elts); } else if (e->v.List.ctx == Load) { - return starunpack_helper(c, elts, - BUILD_LIST, BUILD_TUPLE, BUILD_LIST_UNPACK); + return starunpack_helper(c, elts, 0, BUILD_LIST, + LIST_APPEND, LIST_EXTEND, 0); } else VISIT_SEQ(c, expr, elts); @@ -3743,8 +3804,8 @@ compiler_tuple(struct compiler *c, expr_ty e) return assignment_helper(c, elts); } else if (e->v.Tuple.ctx == Load) { - return starunpack_helper(c, elts, - BUILD_TUPLE, BUILD_TUPLE, BUILD_TUPLE_UNPACK); + return starunpack_helper(c, elts, 0, BUILD_LIST, + LIST_APPEND, LIST_EXTEND, 1); } else VISIT_SEQ(c, expr, elts); @@ -3754,8 +3815,8 @@ compiler_tuple(struct compiler *c, expr_ty e) static int compiler_set(struct compiler *c, expr_ty e) { - return starunpack_helper(c, e->v.Set.elts, BUILD_SET, - BUILD_SET, BUILD_SET_UNPACK); + return starunpack_helper(c, e->v.Set.elts, 0, BUILD_SET, + SET_ADD, SET_UPDATE, 0); } static int @@ -3805,38 +3866,59 @@ static int compiler_dict(struct compiler *c, expr_ty e) { Py_ssize_t i, n, elements; - int containers; + int have_dict; int is_unpacking = 0; n = asdl_seq_LEN(e->v.Dict.values); - containers = 0; + have_dict = 0; elements = 0; for (i = 0; i < n; i++) { is_unpacking = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i) == NULL; - if (elements == 0xFFFF || (elements && is_unpacking)) { - if (!compiler_subdict(c, e, i - elements, i)) - return 0; - containers++; - elements = 0; - } if (is_unpacking) { + if (elements) { + if (!compiler_subdict(c, e, i - elements, i)) { + return 0; + } + if (have_dict) { + ADDOP_I(c, DICT_UPDATE, 1); + } + have_dict = 1; + elements = 0; + } + if (have_dict == 0) { + ADDOP_I(c, BUILD_MAP, 0); + have_dict = 1; + } VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i)); - containers++; + ADDOP_I(c, DICT_UPDATE, 1); } else { - elements++; - } - } - if (elements || containers == 0) { - if (!compiler_subdict(c, e, n - elements, n)) - return 0; - containers++; - } - /* If there is more than one dict, they need to be merged into a new - * dict. If there is one dict and it's an unpacking, then it needs - * to be copied into a new dict." */ - if (containers > 1 || is_unpacking) { - ADDOP_I(c, BUILD_MAP_UNPACK, containers); - } + if (elements == 0xFFFF) { + if (!compiler_subdict(c, e, i - elements, i + 1)) { + return 0; + } + if (have_dict) { + ADDOP_I(c, DICT_UPDATE, 1); + } + have_dict = 1; + elements = 0; + } + else { + elements++; + } + } + } + if (elements) { + if (!compiler_subdict(c, e, n - elements, n)) { + return 0; + } + if (have_dict) { + ADDOP_I(c, DICT_UPDATE, 1); + } + have_dict = 1; + } + if (!have_dict) { + ADDOP_I(c, BUILD_MAP, 0); + } return 1; } @@ -3853,8 +3935,7 @@ compiler_compare(struct compiler *c, expr_ty e) n = asdl_seq_LEN(e->v.Compare.ops) - 1; if (n == 0) { VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0)); - ADDOP_I(c, COMPARE_OP, - cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, 0)))); + ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, 0)); } else { basicblock *cleanup = compiler_new_block(c); @@ -3865,14 +3946,12 @@ compiler_compare(struct compiler *c, expr_ty e) (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i)); ADDOP(c, DUP_TOP); ADDOP(c, ROT_THREE); - ADDOP_I(c, COMPARE_OP, - cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, i)))); + ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i)); ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup); NEXT_BLOCK(c); } VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n)); - ADDOP_I(c, COMPARE_OP, - cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n)))); + ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n)); basicblock *end = compiler_new_block(c); if (end == NULL) return 0; @@ -3908,7 +3987,7 @@ infer_type(expr_ty e) case FormattedValue_kind: return &PyUnicode_Type; case Constant_kind: - return e->v.Constant.value->ob_type; + return Py_TYPE(e->v.Constant.value); default: return NULL; } @@ -3965,14 +4044,11 @@ check_subscripter(struct compiler *c, expr_ty e) } static int -check_index(struct compiler *c, expr_ty e, slice_ty s) +check_index(struct compiler *c, expr_ty e, expr_ty s) { PyObject *v; - if (s->kind != Index_kind) { - return 1; - } - PyTypeObject *index_type = infer_type(s->v.Index.value); + PyTypeObject *index_type = infer_type(s); if (index_type == NULL || PyType_FastSubclass(index_type, Py_TPFLAGS_LONG_SUBCLASS) || index_type == &PySlice_Type) { @@ -4032,6 +4108,35 @@ maybe_optimize_method_call(struct compiler *c, expr_ty e) return 1; } +static int +validate_keywords(struct compiler *c, asdl_seq *keywords) +{ + Py_ssize_t nkeywords = asdl_seq_LEN(keywords); + for (Py_ssize_t i = 0; i < nkeywords; i++) { + keyword_ty key = ((keyword_ty)asdl_seq_GET(keywords, i)); + if (key->arg == NULL) { + continue; + } + if (forbidden_name(c, key->arg, Store)) { + return -1; + } + for (Py_ssize_t j = i + 1; j < nkeywords; j++) { + keyword_ty other = ((keyword_ty)asdl_seq_GET(keywords, j)); + if (other->arg && !PyUnicode_Compare(key->arg, other->arg)) { + PyObject *msg = PyUnicode_FromFormat("keyword argument repeated: %U", key->arg); + if (msg == NULL) { + return -1; + } + c->u->u_col_offset = other->col_offset; + compiler_error(c, PyUnicode_AsUTF8(msg)); + Py_DECREF(msg); + return -1; + } + } + } + return 0; +} + static int compiler_call(struct compiler *c, expr_ty e) { @@ -4147,70 +4252,90 @@ compiler_call_helper(struct compiler *c, asdl_seq *keywords) { Py_ssize_t i, nseen, nelts, nkwelts; - int mustdictunpack = 0; - /* the number of tuples and dictionaries on the stack */ - Py_ssize_t nsubargs = 0, nsubkwargs = 0; + if (validate_keywords(c, keywords) == -1) { + return 0; + } nelts = asdl_seq_LEN(args); nkwelts = asdl_seq_LEN(keywords); + for (i = 0; i < nelts; i++) { + expr_ty elt = asdl_seq_GET(args, i); + if (elt->kind == Starred_kind) { + goto ex_call; + } + } for (i = 0; i < nkwelts; i++) { keyword_ty kw = asdl_seq_GET(keywords, i); if (kw->arg == NULL) { - mustdictunpack = 1; - break; + goto ex_call; } } - nseen = n; /* the number of positional arguments on the stack */ + /* No * or ** args, so can use faster calling sequence */ for (i = 0; i < nelts; i++) { expr_ty elt = asdl_seq_GET(args, i); - if (elt->kind == Starred_kind) { - /* A star-arg. If we've seen positional arguments, - pack the positional arguments into a tuple. */ - if (nseen) { - ADDOP_I(c, BUILD_TUPLE, nseen); - nseen = 0; - nsubargs++; - } - VISIT(c, expr, elt->v.Starred.value); - nsubargs++; + assert(elt->kind != Starred_kind); + VISIT(c, expr, elt); + } + if (nkwelts) { + PyObject *names; + VISIT_SEQ(c, keyword, keywords); + names = PyTuple_New(nkwelts); + if (names == NULL) { + return 0; } - else { - VISIT(c, expr, elt); - nseen++; + for (i = 0; i < nkwelts; i++) { + keyword_ty kw = asdl_seq_GET(keywords, i); + Py_INCREF(kw->arg); + PyTuple_SET_ITEM(names, i, kw->arg); } + ADDOP_LOAD_CONST_NEW(c, names); + ADDOP_I(c, CALL_FUNCTION_KW, n + nelts + nkwelts); + return 1; + } + else { + ADDOP_I(c, CALL_FUNCTION, n + nelts); + return 1; } - /* Same dance again for keyword arguments */ - if (nsubargs || mustdictunpack) { - if (nseen) { - /* Pack up any trailing positional arguments. */ - ADDOP_I(c, BUILD_TUPLE, nseen); - nsubargs++; - } - if (nsubargs > 1) { - /* If we ended up with more than one stararg, we need - to concatenate them into a single sequence. */ - ADDOP_I(c, BUILD_TUPLE_UNPACK_WITH_CALL, nsubargs); - } - else if (nsubargs == 0) { - ADDOP_I(c, BUILD_TUPLE, 0); - } +ex_call: + + /* Do positional arguments. */ + if (n ==0 && nelts == 1 && ((expr_ty)asdl_seq_GET(args, 0))->kind == Starred_kind) { + VISIT(c, expr, ((expr_ty)asdl_seq_GET(args, 0))->v.Starred.value); + } + else if (starunpack_helper(c, args, n, BUILD_LIST, + LIST_APPEND, LIST_EXTEND, 1) == 0) { + return 0; + } + /* Then keyword arguments */ + if (nkwelts) { + /* Has a new dict been pushed */ + int have_dict = 0; + nseen = 0; /* the number of keyword arguments on the stack following */ for (i = 0; i < nkwelts; i++) { keyword_ty kw = asdl_seq_GET(keywords, i); if (kw->arg == NULL) { /* A keyword argument unpacking. */ if (nseen) { - if (!compiler_subkwargs(c, keywords, i - nseen, i)) + if (!compiler_subkwargs(c, keywords, i - nseen, i)) { return 0; - nsubkwargs++; + } + if (have_dict) { + ADDOP_I(c, DICT_MERGE, 1); + } + have_dict = 1; nseen = 0; } + if (!have_dict) { + ADDOP_I(c, BUILD_MAP, 0); + have_dict = 1; + } VISIT(c, expr, kw->value); - nsubkwargs++; + ADDOP_I(c, DICT_MERGE, 1); } else { nseen++; @@ -4218,37 +4343,18 @@ compiler_call_helper(struct compiler *c, } if (nseen) { /* Pack up any trailing keyword arguments. */ - if (!compiler_subkwargs(c, keywords, nkwelts - nseen, nkwelts)) + if (!compiler_subkwargs(c, keywords, nkwelts - nseen, nkwelts)) { return 0; - nsubkwargs++; - } - if (nsubkwargs > 1) { - /* Pack it all up */ - ADDOP_I(c, BUILD_MAP_UNPACK_WITH_CALL, nsubkwargs); - } - ADDOP_I(c, CALL_FUNCTION_EX, nsubkwargs > 0); - return 1; - } - else if (nkwelts) { - PyObject *names; - VISIT_SEQ(c, keyword, keywords); - names = PyTuple_New(nkwelts); - if (names == NULL) { - return 0; - } - for (i = 0; i < nkwelts; i++) { - keyword_ty kw = asdl_seq_GET(keywords, i); - Py_INCREF(kw->arg); - PyTuple_SET_ITEM(names, i, kw->arg); + } + if (have_dict) { + ADDOP_I(c, DICT_MERGE, 1); + } + have_dict = 1; } - ADDOP_LOAD_CONST_NEW(c, names); - ADDOP_I(c, CALL_FUNCTION_KW, n + nelts + nkwelts); - return 1; - } - else { - ADDOP_I(c, CALL_FUNCTION, n + nelts); - return 1; + assert(have_dict); } + ADDOP_I(c, CALL_FUNCTION_EX, nkwelts > 0); + return 1; } @@ -4269,22 +4375,24 @@ compiler_call_helper(struct compiler *c, static int compiler_comprehension_generator(struct compiler *c, asdl_seq *generators, int gen_index, + int depth, expr_ty elt, expr_ty val, int type) { comprehension_ty gen; gen = (comprehension_ty)asdl_seq_GET(generators, gen_index); if (gen->is_async) { return compiler_async_comprehension_generator( - c, generators, gen_index, elt, val, type); + c, generators, gen_index, depth, elt, val, type); } else { return compiler_sync_comprehension_generator( - c, generators, gen_index, elt, val, type); + c, generators, gen_index, depth, elt, val, type); } } static int compiler_sync_comprehension_generator(struct compiler *c, asdl_seq *generators, int gen_index, + int depth, expr_ty elt, expr_ty val, int type) { /* generate code for the iterator, then each of the ifs, @@ -4312,12 +4420,38 @@ compiler_sync_comprehension_generator(struct compiler *c, } else { /* Sub-iter - calculate on the fly */ - VISIT(c, expr, gen->iter); - ADDOP(c, GET_ITER); + /* Fast path for the temporary variable assignment idiom: + for y in [f(x)] + */ + asdl_seq *elts; + switch (gen->iter->kind) { + case List_kind: + elts = gen->iter->v.List.elts; + break; + case Tuple_kind: + elts = gen->iter->v.Tuple.elts; + break; + default: + elts = NULL; + } + if (asdl_seq_LEN(elts) == 1) { + expr_ty elt = asdl_seq_GET(elts, 0); + if (elt->kind != Starred_kind) { + VISIT(c, expr, elt); + start = NULL; + } + } + if (start) { + VISIT(c, expr, gen->iter); + ADDOP(c, GET_ITER); + } + } + if (start) { + depth++; + compiler_use_next_block(c, start); + ADDOP_JREL(c, FOR_ITER, anchor); + NEXT_BLOCK(c); } - compiler_use_next_block(c, start); - ADDOP_JREL(c, FOR_ITER, anchor); - NEXT_BLOCK(c); VISIT(c, expr, gen->target); /* XXX this needs to be cleaned up...a lot! */ @@ -4331,7 +4465,7 @@ compiler_sync_comprehension_generator(struct compiler *c, if (++gen_index < asdl_seq_LEN(generators)) if (!compiler_comprehension_generator(c, - generators, gen_index, + generators, gen_index, depth, elt, val, type)) return 0; @@ -4346,18 +4480,18 @@ compiler_sync_comprehension_generator(struct compiler *c, break; case COMP_LISTCOMP: VISIT(c, expr, elt); - ADDOP_I(c, LIST_APPEND, gen_index + 1); + ADDOP_I(c, LIST_APPEND, depth + 1); break; case COMP_SETCOMP: VISIT(c, expr, elt); - ADDOP_I(c, SET_ADD, gen_index + 1); + ADDOP_I(c, SET_ADD, depth + 1); break; case COMP_DICTCOMP: /* With '{k: v}', k is evaluated before v, so we do the same. */ VISIT(c, expr, elt); VISIT(c, expr, val); - ADDOP_I(c, MAP_ADD, gen_index + 1); + ADDOP_I(c, MAP_ADD, depth + 1); break; default: return 0; @@ -4366,8 +4500,10 @@ compiler_sync_comprehension_generator(struct compiler *c, compiler_use_next_block(c, skip); } compiler_use_next_block(c, if_cleanup); - ADDOP_JABS(c, JUMP_ABSOLUTE, start); - compiler_use_next_block(c, anchor); + if (start) { + ADDOP_JABS(c, JUMP_ABSOLUTE, start); + compiler_use_next_block(c, anchor); + } return 1; } @@ -4375,6 +4511,7 @@ compiler_sync_comprehension_generator(struct compiler *c, static int compiler_async_comprehension_generator(struct compiler *c, asdl_seq *generators, int gen_index, + int depth, expr_ty elt, expr_ty val, int type) { comprehension_ty gen; @@ -4418,9 +4555,10 @@ compiler_async_comprehension_generator(struct compiler *c, NEXT_BLOCK(c); } + depth++; if (++gen_index < asdl_seq_LEN(generators)) if (!compiler_comprehension_generator(c, - generators, gen_index, + generators, gen_index, depth, elt, val, type)) return 0; @@ -4435,18 +4573,18 @@ compiler_async_comprehension_generator(struct compiler *c, break; case COMP_LISTCOMP: VISIT(c, expr, elt); - ADDOP_I(c, LIST_APPEND, gen_index + 1); + ADDOP_I(c, LIST_APPEND, depth + 1); break; case COMP_SETCOMP: VISIT(c, expr, elt); - ADDOP_I(c, SET_ADD, gen_index + 1); + ADDOP_I(c, SET_ADD, depth + 1); break; case COMP_DICTCOMP: /* With '{k: v}', k is evaluated before v, so we do the same. */ VISIT(c, expr, elt); VISIT(c, expr, val); - ADDOP_I(c, MAP_ADD, gen_index + 1); + ADDOP_I(c, MAP_ADD, depth + 1); break; default: return 0; @@ -4511,7 +4649,7 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, ADDOP_I(c, op, 0); } - if (!compiler_comprehension_generator(c, generators, 0, elt, + if (!compiler_comprehension_generator(c, generators, 0, 0, elt, val, type)) goto error_in_scope; @@ -4643,6 +4781,22 @@ expr_constant(expr_ty e) return -1; } +static int +compiler_with_except_finish(struct compiler *c) { + basicblock *exit; + exit = compiler_new_block(c); + if (exit == NULL) + return 0; + ADDOP_JABS(c, POP_JUMP_IF_TRUE, exit); + ADDOP(c, RERAISE); + compiler_use_next_block(c, exit); + ADDOP(c, POP_TOP); + ADDOP(c, POP_TOP); + ADDOP(c, POP_TOP); + ADDOP(c, POP_EXCEPT); + ADDOP(c, POP_TOP); + return 1; +} /* Implements the async with statement. @@ -4671,7 +4825,7 @@ expr_constant(expr_ty e) static int compiler_async_with(struct compiler *c, stmt_ty s, int pos) { - basicblock *block, *finally; + basicblock *block, *final, *exit; withitem_ty item = asdl_seq_GET(s->v.AsyncWith.items, pos); assert(s->kind == AsyncWith_kind); @@ -4682,8 +4836,9 @@ compiler_async_with(struct compiler *c, stmt_ty s, int pos) } block = compiler_new_block(c); - finally = compiler_new_block(c); - if (!block || !finally) + final = compiler_new_block(c); + exit = compiler_new_block(c); + if (!block || !final || !exit) return 0; /* Evaluate EXPR */ @@ -4694,11 +4849,11 @@ compiler_async_with(struct compiler *c, stmt_ty s, int pos) ADDOP_LOAD_CONST(c, Py_None); ADDOP(c, YIELD_FROM); - ADDOP_JREL(c, SETUP_ASYNC_WITH, finally); + ADDOP_JREL(c, SETUP_ASYNC_WITH, final); /* SETUP_ASYNC_WITH pushes a finally block. */ compiler_use_next_block(c, block); - if (!compiler_push_fblock(c, ASYNC_WITH, block, finally)) { + if (!compiler_push_fblock(c, ASYNC_WITH, block, final, NULL)) { return 0; } @@ -4717,76 +4872,80 @@ compiler_async_with(struct compiler *c, stmt_ty s, int pos) else if (!compiler_async_with(c, s, pos)) return 0; - /* End of try block; start the finally block */ - ADDOP(c, POP_BLOCK); - ADDOP(c, BEGIN_FINALLY); compiler_pop_fblock(c, ASYNC_WITH, block); + ADDOP(c, POP_BLOCK); + /* End of body; start the cleanup */ - compiler_use_next_block(c, finally); - if (!compiler_push_fblock(c, FINALLY_END, finally, NULL)) + /* For successful outcome: + * call __exit__(None, None, None) + */ + if(!compiler_call_exit_with_nones(c)) return 0; + ADDOP(c, GET_AWAITABLE); + ADDOP_O(c, LOAD_CONST, Py_None, consts); + ADDOP(c, YIELD_FROM); + + ADDOP(c, POP_TOP); + + ADDOP_JABS(c, JUMP_ABSOLUTE, exit); - /* Finally block starts; context.__exit__ is on the stack under - the exception or return information. Just issue our magic - opcode. */ - ADDOP(c, WITH_CLEANUP_START); + /* For exceptional outcome: */ + compiler_use_next_block(c, final); + ADDOP(c, WITH_EXCEPT_START); ADDOP(c, GET_AWAITABLE); ADDOP_LOAD_CONST(c, Py_None); ADDOP(c, YIELD_FROM); + compiler_with_except_finish(c); - ADDOP(c, WITH_CLEANUP_FINISH); - - /* Finally block ends. */ - ADDOP(c, END_FINALLY); - compiler_pop_fblock(c, FINALLY_END, finally); +compiler_use_next_block(c, exit); return 1; } /* Implements the with statement from PEP 343. - - The semantics outlined in that PEP are as follows: - with EXPR as VAR: BLOCK - - It is implemented roughly as: - - context = EXPR - exit = context.__exit__ # not calling it - value = context.__enter__() - try: - VAR = value # if VAR present in the syntax - BLOCK - finally: - if an exception was raised: - exc = copy of (exception, instance, traceback) - else: - exc = (None, None, None) - exit(*exc) + is implemented as: + + SETUP_WITH E + or POP_TOP + + LOAD_CONST (None, None, None) + CALL_FUNCTION_EX 0 + JUMP_FORWARD EXIT + E: WITH_EXCEPT_START (calls EXPR.__exit__) + POP_JUMP_IF_TRUE T: + RERAISE + T: POP_TOP * 3 (remove exception from stack) + POP_EXCEPT + POP_TOP + EXIT: */ + static int compiler_with(struct compiler *c, stmt_ty s, int pos) { - basicblock *block, *finally; + basicblock *block, *final, *exit; withitem_ty item = asdl_seq_GET(s->v.With.items, pos); assert(s->kind == With_kind); block = compiler_new_block(c); - finally = compiler_new_block(c); - if (!block || !finally) + final = compiler_new_block(c); + exit = compiler_new_block(c); + if (!block || !final || !exit) return 0; /* Evaluate EXPR */ VISIT(c, expr, item->context_expr); - ADDOP_JREL(c, SETUP_WITH, finally); + /* Will push bound __exit__ */ + ADDOP_JREL(c, SETUP_WITH, final); /* SETUP_WITH pushes a finally block. */ compiler_use_next_block(c, block); - if (!compiler_push_fblock(c, WITH, block, finally)) { + if (!compiler_push_fblock(c, WITH, block, final, NULL)) { return 0; } @@ -4805,24 +4964,26 @@ compiler_with(struct compiler *c, stmt_ty s, int pos) else if (!compiler_with(c, s, pos)) return 0; - /* End of try block; start the finally block */ ADDOP(c, POP_BLOCK); - ADDOP(c, BEGIN_FINALLY); compiler_pop_fblock(c, WITH, block); - compiler_use_next_block(c, finally); - if (!compiler_push_fblock(c, FINALLY_END, finally, NULL)) + /* End of body; start the cleanup. */ + + /* For successful outcome: + * call __exit__(None, None, None) + */ + if (!compiler_call_exit_with_nones(c)) return 0; + ADDOP(c, POP_TOP); + ADDOP_JREL(c, JUMP_FORWARD, exit); - /* Finally block starts; context.__exit__ is on the stack under - the exception or return information. Just issue our magic - opcode. */ - ADDOP(c, WITH_CLEANUP_START); - ADDOP(c, WITH_CLEANUP_FINISH); + /* For exceptional outcome: */ + compiler_use_next_block(c, final); - /* Finally block ends. */ - ADDOP(c, END_FINALLY); - compiler_pop_fblock(c, FINALLY_END, finally); + ADDOP(c, WITH_EXCEPT_START); + compiler_with_except_finish(c); + + compiler_use_next_block(c, exit); return 1; } @@ -4840,7 +5001,7 @@ compiler_visit_expr1(struct compiler *c, expr_ty e) case BinOp_kind: VISIT(c, expr, e->v.BinOp.left); VISIT(c, expr, e->v.BinOp.right); - ADDOP(c, binop(c, e->v.BinOp.op)); + ADDOP(c, binop(e->v.BinOp.op)); break; case UnaryOp_kind: VISIT(c, expr, e->v.UnaryOp.operand); @@ -4915,65 +5076,23 @@ compiler_visit_expr1(struct compiler *c, expr_ty e) return compiler_formatted_value(c, e); /* The following exprs can be assignment targets. */ case Attribute_kind: - if (e->v.Attribute.ctx != AugStore) - VISIT(c, expr, e->v.Attribute.value); + VISIT(c, expr, e->v.Attribute.value); switch (e->v.Attribute.ctx) { - case AugLoad: - ADDOP(c, DUP_TOP); - /* Fall through */ case Load: ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names); break; - case AugStore: - ADDOP(c, ROT_TWO); - /* Fall through */ case Store: + if (forbidden_name(c, e->v.Attribute.attr, e->v.Attribute.ctx)) + return 0; ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names); break; case Del: ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names); break; - case Param: - default: - PyErr_SetString(PyExc_SystemError, - "param invalid in attribute expression"); - return 0; } break; case Subscript_kind: - switch (e->v.Subscript.ctx) { - case AugLoad: - VISIT(c, expr, e->v.Subscript.value); - VISIT_SLICE(c, e->v.Subscript.slice, AugLoad); - break; - case Load: - if (!check_subscripter(c, e->v.Subscript.value)) { - return 0; - } - if (!check_index(c, e->v.Subscript.value, e->v.Subscript.slice)) { - return 0; - } - VISIT(c, expr, e->v.Subscript.value); - VISIT_SLICE(c, e->v.Subscript.slice, Load); - break; - case AugStore: - VISIT_SLICE(c, e->v.Subscript.slice, AugStore); - break; - case Store: - VISIT(c, expr, e->v.Subscript.value); - VISIT_SLICE(c, e->v.Subscript.slice, Store); - break; - case Del: - VISIT(c, expr, e->v.Subscript.value); - VISIT_SLICE(c, e->v.Subscript.slice, Del); - break; - case Param: - default: - PyErr_SetString(PyExc_SystemError, - "param invalid in subscript expression"); - return 0; - } - break; + return compiler_subscript(c, e); case Starred_kind: switch (e->v.Starred.ctx) { case Store: @@ -4985,6 +5104,9 @@ compiler_visit_expr1(struct compiler *c, expr_ty e) return compiler_error(c, "can't use starred expression here"); } + break; + case Slice_kind: + return compiler_slice(c, e); case Name_kind: return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx); /* child nodes of List and Tuple will have expr_context set */ @@ -4999,24 +5121,11 @@ compiler_visit_expr1(struct compiler *c, expr_ty e) static int compiler_visit_expr(struct compiler *c, expr_ty e) { - /* If expr e has a different line number than the last expr/stmt, - set a new line number for the next instruction. - */ int old_lineno = c->u->u_lineno; int old_col_offset = c->u->u_col_offset; - if (e->lineno != c->u->u_lineno) { - c->u->u_lineno = e->lineno; - c->u->u_lineno_set = 0; - } - /* Updating the column offset is always harmless. */ - c->u->u_col_offset = e->col_offset; - + SET_LOC(c, e); int res = compiler_visit_expr1(c, e); - - if (old_lineno != c->u->u_lineno) { - c->u->u_lineno = old_lineno; - c->u->u_lineno_set = 0; - } + c->u->u_lineno = old_lineno; c->u->u_col_offset = old_col_offset; return res; } @@ -5024,48 +5133,58 @@ compiler_visit_expr(struct compiler *c, expr_ty e) static int compiler_augassign(struct compiler *c, stmt_ty s) { + assert(s->kind == AugAssign_kind); expr_ty e = s->v.AugAssign.target; - expr_ty auge; - assert(s->kind == AugAssign_kind); + int old_lineno = c->u->u_lineno; + int old_col_offset = c->u->u_col_offset; + SET_LOC(c, e); switch (e->kind) { case Attribute_kind: - auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr, - AugLoad, e->lineno, e->col_offset, - e->end_lineno, e->end_col_offset, c->c_arena); - if (auge == NULL) - return 0; - VISIT(c, expr, auge); - VISIT(c, expr, s->v.AugAssign.value); - ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); - auge->v.Attribute.ctx = AugStore; - VISIT(c, expr, auge); + VISIT(c, expr, e->v.Attribute.value); + ADDOP(c, DUP_TOP); + ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names); break; case Subscript_kind: - auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice, - AugLoad, e->lineno, e->col_offset, - e->end_lineno, e->end_col_offset, c->c_arena); - if (auge == NULL) - return 0; - VISIT(c, expr, auge); - VISIT(c, expr, s->v.AugAssign.value); - ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); - auge->v.Subscript.ctx = AugStore; - VISIT(c, expr, auge); + VISIT(c, expr, e->v.Subscript.value); + VISIT(c, expr, e->v.Subscript.slice); + ADDOP(c, DUP_TOP_TWO); + ADDOP(c, BINARY_SUBSCR); break; case Name_kind: if (!compiler_nameop(c, e->v.Name.id, Load)) return 0; - VISIT(c, expr, s->v.AugAssign.value); - ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); - return compiler_nameop(c, e->v.Name.id, Store); + break; default: PyErr_Format(PyExc_SystemError, "invalid node type (%d) for augmented assignment", e->kind); return 0; } + + c->u->u_lineno = old_lineno; + c->u->u_col_offset = old_col_offset; + + VISIT(c, expr, s->v.AugAssign.value); + ADDOP(c, inplace_binop(s->v.AugAssign.op)); + + SET_LOC(c, e); + + switch (e->kind) { + case Attribute_kind: + ADDOP(c, ROT_TWO); + ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names); + break; + case Subscript_kind: + ADDOP(c, ROT_THREE); + ADDOP(c, STORE_SUBSCR); + break; + case Name_kind: + return compiler_nameop(c, e->v.Name.id, Store); + default: + Py_UNREACHABLE(); + } return 1; } @@ -5089,68 +5208,35 @@ check_annotation(struct compiler *c, stmt_ty s) } static int -check_ann_slice(struct compiler *c, slice_ty sl) +check_ann_subscr(struct compiler *c, expr_ty e) { - switch(sl->kind) { - case Index_kind: - return check_ann_expr(c, sl->v.Index.value); + /* We check that everything in a subscript is defined at runtime. */ + switch (e->kind) { case Slice_kind: - if (sl->v.Slice.lower && !check_ann_expr(c, sl->v.Slice.lower)) { - return 0; - } - if (sl->v.Slice.upper && !check_ann_expr(c, sl->v.Slice.upper)) { + if (e->v.Slice.lower && !check_ann_expr(c, e->v.Slice.lower)) { return 0; } - if (sl->v.Slice.step && !check_ann_expr(c, sl->v.Slice.step)) { + if (e->v.Slice.upper && !check_ann_expr(c, e->v.Slice.upper)) { return 0; } - break; - default: - PyErr_SetString(PyExc_SystemError, - "unexpected slice kind"); - return 0; - } - return 1; -} - -static int -check_ann_subscr(struct compiler *c, slice_ty sl) -{ - /* We check that everything in a subscript is defined at runtime. */ - Py_ssize_t i, n; - - switch (sl->kind) { - case Index_kind: - case Slice_kind: - if (!check_ann_slice(c, sl)) { + if (e->v.Slice.step && !check_ann_expr(c, e->v.Slice.step)) { return 0; } - break; - case ExtSlice_kind: - n = asdl_seq_LEN(sl->v.ExtSlice.dims); + return 1; + case Tuple_kind: { + /* extended slice */ + asdl_seq *elts = e->v.Tuple.elts; + Py_ssize_t i, n = asdl_seq_LEN(elts); for (i = 0; i < n; i++) { - slice_ty subsl = (slice_ty)asdl_seq_GET(sl->v.ExtSlice.dims, i); - switch (subsl->kind) { - case Index_kind: - case Slice_kind: - if (!check_ann_slice(c, subsl)) { - return 0; - } - break; - case ExtSlice_kind: - default: - PyErr_SetString(PyExc_SystemError, - "extended slice invalid in nested slice"); + if (!check_ann_subscr(c, asdl_seq_GET(elts, i))) { return 0; } } - break; + return 1; + } default: - PyErr_Format(PyExc_SystemError, - "invalid subscript kind %d", sl->kind); - return 0; + return check_ann_expr(c, e); } - return 1; } static int @@ -5168,6 +5254,8 @@ compiler_annassign(struct compiler *c, stmt_ty s) } switch (targ->kind) { case Name_kind: + if (forbidden_name(c, targ->v.Name.id, Store)) + return 0; /* If we have a simple name in a module or class, store annotation. */ if (s->v.AnnAssign.simple && (c->u->u_scope_type == COMPILER_SCOPE_MODULE || @@ -5185,6 +5273,8 @@ compiler_annassign(struct compiler *c, stmt_ty s) } break; case Attribute_kind: + if (forbidden_name(c, targ->v.Attribute.attr, Store)) + return 0; if (!s->v.AnnAssign.value && !check_ann_expr(c, targ->v.Attribute.value)) { return 0; @@ -5276,36 +5366,34 @@ compiler_warn(struct compiler *c, const char *format, ...) } static int -compiler_handle_subscr(struct compiler *c, const char *kind, - expr_context_ty ctx) +compiler_subscript(struct compiler *c, expr_ty e) { + expr_context_ty ctx = e->v.Subscript.ctx; int op = 0; - /* XXX this code is duplicated */ + if (ctx == Load) { + if (!check_subscripter(c, e->v.Subscript.value)) { + return 0; + } + if (!check_index(c, e->v.Subscript.value, e->v.Subscript.slice)) { + return 0; + } + } + switch (ctx) { - case AugLoad: /* fall through to Load */ case Load: op = BINARY_SUBSCR; break; - case AugStore:/* fall through to Store */ case Store: op = STORE_SUBSCR; break; case Del: op = DELETE_SUBSCR; break; - case Param: - PyErr_Format(PyExc_SystemError, - "invalid %s kind %d in subscript\n", - kind, ctx); - return 0; - } - if (ctx == AugLoad) { - ADDOP(c, DUP_TOP_TWO); - } - else if (ctx == AugStore) { - ADDOP(c, ROT_THREE); } + assert(op); + VISIT(c, expr, e->v.Subscript.value); + VISIT(c, expr, e->v.Subscript.slice); ADDOP(c, op); return 1; } static int -compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx) +compiler_slice(struct compiler *c, expr_ty s) { int n = 2; assert(s->kind == Slice_kind); @@ -5333,64 +5421,6 @@ compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx) return 1; } -static int -compiler_visit_nested_slice(struct compiler *c, slice_ty s, - expr_context_ty ctx) -{ - switch (s->kind) { - case Slice_kind: - return compiler_slice(c, s, ctx); - case Index_kind: - VISIT(c, expr, s->v.Index.value); - break; - case ExtSlice_kind: - default: - PyErr_SetString(PyExc_SystemError, - "extended slice invalid in nested slice"); - return 0; - } - return 1; -} - -static int -compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx) -{ - const char * kindname = NULL; - switch (s->kind) { - case Index_kind: - kindname = "index"; - if (ctx != AugStore) { - VISIT(c, expr, s->v.Index.value); - } - break; - case Slice_kind: - kindname = "slice"; - if (ctx != AugStore) { - if (!compiler_slice(c, s, ctx)) - return 0; - } - break; - case ExtSlice_kind: - kindname = "extended slice"; - if (ctx != AugStore) { - Py_ssize_t i, n = asdl_seq_LEN(s->v.ExtSlice.dims); - for (i = 0; i < n; i++) { - slice_ty sub = (slice_ty)asdl_seq_GET( - s->v.ExtSlice.dims, i); - if (!compiler_visit_nested_slice(c, sub, ctx)) - return 0; - } - ADDOP_I(c, BUILD_TUPLE, n); - } - break; - default: - PyErr_Format(PyExc_SystemError, - "invalid subscript kind %d", s->kind); - return 0; - } - return compiler_handle_subscr(c, kindname, ctx); -} - /* End of the compiler section, beginning of the assembler section */ /* do depth-first search of basic block graph, starting with block. @@ -5440,7 +5470,7 @@ Py_LOCAL_INLINE(void) stackdepth_push(basicblock ***sp, basicblock *b, int depth) { assert(b->b_startdepth < 0 || b->b_startdepth == depth); - if (b->b_startdepth < depth) { + if (b->b_startdepth < depth && b->b_startdepth < 100) { assert(b->b_startdepth < 0); b->b_startdepth = depth; *(*sp)++ = b; @@ -5480,8 +5510,8 @@ stackdepth(struct compiler *c) struct instr *instr = &b->b_instr[i]; int effect = stack_effect(instr->i_opcode, instr->i_oparg, 0); if (effect == PY_INVALID_STACK_EFFECT) { - fprintf(stderr, "opcode = %d\n", instr->i_opcode); - Py_FatalError("PyCompile_OpcodeStackEffect()"); + _Py_FatalErrorFormat(__func__, + "opcode = %d", instr->i_opcode); } int new_depth = depth + effect; if (new_depth > maxdepth) { @@ -5496,19 +5526,14 @@ stackdepth(struct compiler *c) maxdepth = target_depth; } assert(target_depth >= 0); /* invalid code or bug in stackdepth() */ - if (instr->i_opcode == CALL_FINALLY) { - assert(instr->i_target->b_startdepth >= 0); - assert(instr->i_target->b_startdepth >= target_depth); - depth = new_depth; - continue; - } stackdepth_push(&sp, instr->i_target, target_depth); } depth = new_depth; if (instr->i_opcode == JUMP_ABSOLUTE || instr->i_opcode == JUMP_FORWARD || instr->i_opcode == RETURN_VALUE || - instr->i_opcode == RAISE_VARARGS) + instr->i_opcode == RAISE_VARARGS || + instr->i_opcode == RERAISE) { /* remaining code is dead */ next = NULL; @@ -5578,14 +5603,14 @@ assemble_lnotab(struct assembler *a, struct instr *i) Py_ssize_t len; unsigned char *lnotab; - d_bytecode = (a->a_offset - a->a_lineno_off) * sizeof(_Py_CODEUNIT); d_lineno = i->i_lineno - a->a_lineno; + if (d_lineno == 0) { + return 1; + } + d_bytecode = (a->a_offset - a->a_lineno_off) * sizeof(_Py_CODEUNIT); assert(d_bytecode >= 0); - if(d_bytecode == 0 && d_lineno == 0) - return 1; - if (d_bytecode > 255) { int j, nbytes, ncodes = d_bytecode / 255; nbytes = a->a_lnotab_off + 2 * ncodes; @@ -5934,7 +5959,7 @@ makecode(struct compiler *c, struct assembler *a) goto error; } co = PyCode_NewWithPosOnlyArgs(posonlyargcount+posorkeywordargcount, - posonlyargcount, kwonlyargcount, nlocals_int, + posonlyargcount, kwonlyargcount, nlocals_int, maxdepth, flags, bytecode, consts, names, varnames, freevars, cellvars, c->c_filename, c->u->u_name, c->u->u_firstlineno, a->a_lnotab); diff --git a/Python/context.c b/Python/context.c index 5c30e47f35dd7896f099711cffac547045237800..bacc7010c458e1f927c24bbb467feaeb53eea390 100644 --- a/Python/context.c +++ b/Python/context.c @@ -1,10 +1,12 @@ #include "Python.h" #include "pycore_context.h" +#include "pycore_gc.h" // _PyObject_GC_MAY_BE_TRACKED() #include "pycore_hamt.h" #include "pycore_object.h" -#include "pycore_pystate.h" -#include "structmember.h" +#include "pycore_pyerrors.h" +#include "pycore_pystate.h" // _PyThreadState_GET() +#include "structmember.h" // PyMemberDef #define CONTEXT_FREELIST_MAXLEN 255 @@ -101,21 +103,18 @@ PyContext_CopyCurrent(void) } -int -PyContext_Enter(PyObject *octx) +static int +_PyContext_Enter(PyThreadState *ts, PyObject *octx) { ENSURE_Context(octx, -1) PyContext *ctx = (PyContext *)octx; if (ctx->ctx_entered) { - PyErr_Format(PyExc_RuntimeError, - "cannot enter context: %R is already entered", ctx); + _PyErr_Format(ts, PyExc_RuntimeError, + "cannot enter context: %R is already entered", ctx); return -1; } - PyThreadState *ts = _PyThreadState_GET(); - assert(ts != NULL); - ctx->ctx_prev = (PyContext *)ts->context; /* borrow */ ctx->ctx_entered = 1; @@ -128,7 +127,16 @@ PyContext_Enter(PyObject *octx) int -PyContext_Exit(PyObject *octx) +PyContext_Enter(PyObject *octx) +{ + PyThreadState *ts = _PyThreadState_GET(); + assert(ts != NULL); + return _PyContext_Enter(ts, octx); +} + + +static int +_PyContext_Exit(PyThreadState *ts, PyObject *octx) { ENSURE_Context(octx, -1) PyContext *ctx = (PyContext *)octx; @@ -139,9 +147,6 @@ PyContext_Exit(PyObject *octx) return -1; } - PyThreadState *ts = _PyThreadState_GET(); - assert(ts != NULL); - if (ts->context != (PyObject *)ctx) { /* Can only happen if someone misuses the C API */ PyErr_SetString(PyExc_RuntimeError, @@ -159,6 +164,14 @@ PyContext_Exit(PyObject *octx) return 0; } +int +PyContext_Exit(PyObject *octx) +{ + PyThreadState *ts = _PyThreadState_GET(); + assert(ts != NULL); + return _PyContext_Exit(ts, octx); +} + PyObject * PyContextVar_New(const char *name, PyObject *def) @@ -621,20 +634,22 @@ static PyObject * context_run(PyContext *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { + PyThreadState *ts = _PyThreadState_GET(); + if (nargs < 1) { - PyErr_SetString(PyExc_TypeError, - "run() missing 1 required positional argument"); + _PyErr_SetString(ts, PyExc_TypeError, + "run() missing 1 required positional argument"); return NULL; } - if (PyContext_Enter((PyObject *)self)) { + if (_PyContext_Enter(ts, (PyObject *)self)) { return NULL; } - PyObject *call_result = _PyObject_Vectorcall( - args[0], args + 1, nargs - 1, kwnames); + PyObject *call_result = _PyObject_VectorcallTstate( + ts, args[0], args + 1, nargs - 1, kwnames); - if (PyContext_Exit((PyObject *)self)) { + if (_PyContext_Exit(ts, (PyObject *)self)) { return NULL; } @@ -1009,13 +1024,6 @@ _contextvars_ContextVar_reset(PyContextVar *self, PyObject *token) } -static PyObject * -contextvar_cls_getitem(PyObject *self, PyObject *arg) -{ - Py_INCREF(self); - return self; -} - static PyMemberDef PyContextVar_members[] = { {"name", T_OBJECT, offsetof(PyContextVar, var_name), READONLY}, {NULL} @@ -1025,8 +1033,8 @@ static PyMethodDef PyContextVar_methods[] = { _CONTEXTVARS_CONTEXTVAR_GET_METHODDEF _CONTEXTVARS_CONTEXTVAR_SET_METHODDEF _CONTEXTVARS_CONTEXTVAR_RESET_METHODDEF - {"__class_getitem__", contextvar_cls_getitem, - METH_O | METH_CLASS, NULL}, + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, {NULL, NULL} }; @@ -1165,10 +1173,17 @@ static PyGetSetDef PyContextTokenType_getsetlist[] = { {NULL} }; +static PyMethodDef PyContextTokenType_methods[] = { + {"__class_getitem__", (PyCFunction)Py_GenericAlias, + METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, + {NULL} +}; + PyTypeObject PyContextToken_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "Token", sizeof(PyContextToken), + .tp_methods = PyContextTokenType_methods, .tp_getset = PyContextTokenType_getsetlist, .tp_dealloc = (destructor)token_tp_dealloc, .tp_getattro = PyObject_GenericGetAttr, @@ -1255,18 +1270,15 @@ get_token_missing(void) /////////////////////////// -int -PyContext_ClearFreeList(void) +void +_PyContext_ClearFreeList(void) { - int size = ctx_freelist_len; - while (ctx_freelist_len) { + for (; ctx_freelist_len; ctx_freelist_len--) { PyContext *ctx = ctx_freelist; ctx_freelist = (PyContext *)ctx->ctx_weakreflist; ctx->ctx_weakreflist = NULL; PyObject_GC_Del(ctx); - ctx_freelist_len--; } - return size; } @@ -1274,8 +1286,8 @@ void _PyContext_Fini(void) { Py_CLEAR(_token_missing); - (void)PyContext_ClearFreeList(); - (void)_PyHamt_Fini(); + _PyContext_ClearFreeList(); + _PyHamt_Fini(); } diff --git a/Python/dtoa.c b/Python/dtoa.c index b7bb7acfb6c215a46840d3c5696968c261f0225a..e629b296426f318153903cad5f53832df1a17900 100644 --- a/Python/dtoa.c +++ b/Python/dtoa.c @@ -64,6 +64,9 @@ * 7. _Py_dg_strtod has been modified so that it doesn't accept strings with * leading whitespace. * + * 8. A corner case where _Py_dg_dtoa didn't strip trailing zeros has been + * fixed. (bugs.python.org/issue40780) + * ***************************************************************/ /* Please send bug reports for the original dtoa.c code to David M. Gay (dmg @@ -115,6 +118,7 @@ /* Linking of Python's #defines to Gay's #defines starts here. */ #include "Python.h" +#include "pycore_dtoa.h" /* if PY_NO_SHORT_FLOAT_REPR is defined, then don't even try to compile the following code */ @@ -2562,6 +2566,14 @@ _Py_dg_dtoa(double dd, int mode, int ndigits, } ++*s++; } + else { + /* Strip trailing zeros. This branch was missing from the + original dtoa.c, leading to surplus trailing zeros in + some cases. See bugs.python.org/issue40780. */ + while (s > s0 && s[-1] == '0') { + --s; + } + } break; } } diff --git a/Python/dynload_aix.c b/Python/dynload_aix.c index b3ff8e288c1a6ae53cc6cd392f79b884ae2b1e9c..97f7698ef4b2d94540f10f1b3ba3e497e4699c92 100644 --- a/Python/dynload_aix.c +++ b/Python/dynload_aix.c @@ -140,14 +140,20 @@ aix_loaderror(const char *pathname) if (nerr == load_errtab[j].errNo && load_errtab[j].errstr) ERRBUF_APPEND(load_errtab[j].errstr); } - while (Py_ISDIGIT(Py_CHARMASK(*message[i]))) message[i]++ ; + while (Py_ISDIGIT(*message[i])) message[i]++ ; ERRBUF_APPEND(message[i]); ERRBUF_APPEND("\n"); } - errbuf[strlen(errbuf)-1] = '\0'; /* trim off last newline */ - pathname_ob = PyUnicode_FromString(pathname); - errbuf_ob = PyUnicode_FromString(errbuf); - PyErr_SetImportError(errbuf_ob, NULL, pathname); + /* Subtract 1 from the length to trim off trailing newline */ + errbuf_ob = PyUnicode_DecodeLocaleAndSize(errbuf, strlen(errbuf)-1, "surrogateescape"); + if (errbuf_ob == NULL) + return; + pathname_ob = PyUnicode_DecodeFSDefault(pathname); + if (pathname_ob == NULL) { + Py_DECREF(errbuf_ob); + return; + } + PyErr_SetImportError(errbuf_ob, NULL, pathname_ob); Py_DECREF(pathname_ob); Py_DECREF(errbuf_ob); return; diff --git a/Python/dynload_hpux.c b/Python/dynload_hpux.c index e59d00435ec7d494b0f59f471e4807f1ced867d5..e36d608c6dca4481ff1d97b55b079b1c9c207693 100644 --- a/Python/dynload_hpux.c +++ b/Python/dynload_hpux.c @@ -6,7 +6,6 @@ #include "Python.h" #include "importdl.h" -#include "pycore_pystate.h" #if defined(__hp9000s300) #define FUNCNAME_PATTERN "_%.20s_%.200s" @@ -21,7 +20,7 @@ dl_funcptr _PyImport_FindSharedFuncptr(const char *prefix, const char *pathname, FILE *fp) { int flags = BIND_FIRST | BIND_DEFERRED; - int verbose = _PyInterpreterState_GET_UNSAFE()->config.verbose; + int verbose = _Py_GetConfig()->verbose; if (verbose) { flags = BIND_FIRST | BIND_IMMEDIATE | BIND_NONFATAL | BIND_VERBOSE; @@ -37,9 +36,20 @@ dl_funcptr _PyImport_FindSharedFuncptr(const char *prefix, char buf[256]; PyOS_snprintf(buf, sizeof(buf), "Failed to load %.200s", pathname); - PyObject *buf_ob = PyUnicode_FromString(buf); + PyObject *buf_ob = PyUnicode_DecodeFSDefault(buf); + if (buf_ob == NULL) + return NULL; PyObject *shortname_ob = PyUnicode_FromString(shortname); - PyObject *pathname_ob = PyUnicode_FromString(pathname); + if (shortname_ob == NULL) { + Py_DECREF(buf_ob); + return NULL; + } + PyObject *pathname_ob = PyUnicode_DecodeFSDefault(pathname); + if (pathname_ob == NULL) { + Py_DECREF(buf_ob); + Py_DECREF(shortname_ob); + return NULL; + } PyErr_SetImportError(buf_ob, shortname_ob, pathname_ob); Py_DECREF(buf_ob); Py_DECREF(shortname_ob); diff --git a/Python/dynload_shlib.c b/Python/dynload_shlib.c index c51f97abd286306ac4bf981945acdd0668e5a251..23828898d35a5d50df3ca09b4a2283a0fa54a3ee 100644 --- a/Python/dynload_shlib.c +++ b/Python/dynload_shlib.c @@ -2,7 +2,8 @@ /* Support for dynamic loading of extension modules */ #include "Python.h" -#include "pycore_pystate.h" +#include "pycore_interp.h" // _PyInterpreterState.dlopenflags +#include "pycore_pystate.h" // _PyInterpreterState_GET() #include "importdl.h" #include @@ -94,7 +95,7 @@ _PyImport_FindSharedFuncptr(const char *prefix, } } - dlopenflags = _PyInterpreterState_Get()->dlopenflags; + dlopenflags = _PyInterpreterState_GET()->dlopenflags; handle = dlopen(pathname, dlopenflags); @@ -105,7 +106,7 @@ _PyImport_FindSharedFuncptr(const char *prefix, const char *error = dlerror(); if (error == NULL) error = "unknown dlopen() error"; - error_ob = PyUnicode_FromString(error); + error_ob = PyUnicode_DecodeLocale(error, "surrogateescape"); if (error_ob == NULL) return NULL; mod_name = PyUnicode_FromString(shortname); @@ -113,7 +114,7 @@ _PyImport_FindSharedFuncptr(const char *prefix, Py_DECREF(error_ob); return NULL; } - path = PyUnicode_FromString(pathname); + path = PyUnicode_DecodeFSDefault(pathname); if (path == NULL) { Py_DECREF(error_ob); Py_DECREF(mod_name); diff --git a/Python/dynload_win.c b/Python/dynload_win.c index 4896c6dc8c25dd0a6c826d0e3853d366a2aed541..8431c5b3b2f308eb55090d1afbc439fb6dd0a669 100644 --- a/Python/dynload_win.c +++ b/Python/dynload_win.c @@ -12,12 +12,6 @@ #include "patchlevel.h" #include -// "activation context" magic - see dl_nt.c... -#if HAVE_SXS -extern ULONG_PTR _Py_ActivateActCtx(); -void _Py_DeactivateActCtx(ULONG_PTR cookie); -#endif - #ifdef _DEBUG #define PYD_DEBUG_SUFFIX "_d" #else @@ -185,16 +179,10 @@ dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix, { HINSTANCE hDLL = NULL; unsigned int old_mode; -#if HAVE_SXS - ULONG_PTR cookie = 0; -#endif /* Don't display a message box when Python can't load a DLL */ old_mode = SetErrorMode(SEM_FAILCRITICALERRORS); -#if HAVE_SXS - cookie = _Py_ActivateActCtx(); -#endif /* bpo-36085: We use LoadLibraryEx with restricted search paths to avoid DLL preloading attacks and enable use of the AddDllDirectory function. We add SEARCH_DLL_LOAD_DIR to @@ -204,9 +192,6 @@ dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix, LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR); Py_END_ALLOW_THREADS -#if HAVE_SXS - _Py_DeactivateActCtx(cookie); -#endif /* restore old error mode settings */ SetErrorMode(old_mode); diff --git a/Python/errors.c b/Python/errors.c index 1360c0d91a33fa3ccced80aa0fb09df9da34fd6d..87af39d527a512668dfc16ab44baf0da01e3a6af 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -4,7 +4,8 @@ #include "Python.h" #include "pycore_initconfig.h" #include "pycore_pyerrors.h" -#include "pycore_pystate.h" +#include "pycore_pystate.h" // _PyThreadState_GET() +#include "pycore_sysmodule.h" #include "pycore_traceback.h" #ifndef __STDC__ @@ -24,11 +25,11 @@ extern char *strerror(int); extern "C" { #endif +_Py_IDENTIFIER(__module__); _Py_IDENTIFIER(builtins); _Py_IDENTIFIER(stderr); _Py_IDENTIFIER(flush); - /* Forward declarations */ static PyObject * _PyErr_FormatV(PyThreadState *tstate, PyObject *exception, @@ -93,7 +94,7 @@ _PyErr_CreateException(PyObject *exception, PyObject *value) return PyObject_Call(exception, value, NULL); } else { - return PyObject_CallFunctionObjArgs(exception, value, NULL); + return PyObject_CallOneArg(exception, value); } } @@ -106,7 +107,8 @@ _PyErr_SetObject(PyThreadState *tstate, PyObject *exception, PyObject *value) if (exception != NULL && !PyExceptionClass_Check(exception)) { _PyErr_Format(tstate, PyExc_SystemError, - "exception %R not a BaseException subclass", + "_PyErr_SetObject: " + "exception %R is not a BaseException subclass", exception); return; } @@ -218,6 +220,9 @@ PyErr_SetString(PyObject *exception, const char *string) PyObject* _Py_HOT_FUNCTION PyErr_Occurred(void) { + /* The caller must hold the GIL. */ + assert(PyGILState_Check()); + PyThreadState *tstate = _PyThreadState_GET(); return _PyErr_Occurred(tstate); } @@ -430,21 +435,27 @@ PyErr_Clear(void) void -PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) +_PyErr_GetExcInfo(PyThreadState *tstate, + PyObject **p_type, PyObject **p_value, PyObject **p_traceback) { - PyThreadState *tstate = _PyThreadState_GET(); - _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate); *p_type = exc_info->exc_type; *p_value = exc_info->exc_value; *p_traceback = exc_info->exc_traceback; - Py_XINCREF(*p_type); Py_XINCREF(*p_value); Py_XINCREF(*p_traceback); } + +void +PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) +{ + PyThreadState *tstate = _PyThreadState_GET(); + _PyErr_GetExcInfo(tstate, p_type, p_value, p_traceback); +} + void PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback) { @@ -466,7 +477,9 @@ PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback) /* Like PyErr_Restore(), but if an exception is already set, set the context associated with it. - */ + + The caller is responsible for ensuring that this call won't create + any cycles in the exception context chain. */ void _PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb) { @@ -474,6 +487,15 @@ _PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb) return; PyThreadState *tstate = _PyThreadState_GET(); + + if (!PyExceptionClass_Check(exc)) { + _PyErr_Format(tstate, PyExc_SystemError, + "_PyErr_ChainExceptions: " + "exception %R is not a BaseException subclass", + exc); + return; + } + if (_PyErr_Occurred(tstate)) { PyObject *exc2, *val2, *tb2; _PyErr_Fetch(tstate, &exc2, &val2, &tb2); @@ -492,6 +514,62 @@ _PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb) } } +/* Set the currently set exception's context to the given exception. + + If the provided exc_info is NULL, then the current Python thread state's + exc_info will be used for the context instead. + + This function can only be called when _PyErr_Occurred() is true. + Also, this function won't create any cycles in the exception context + chain to the extent that _PyErr_SetObject ensures this. */ +void +_PyErr_ChainStackItem(_PyErr_StackItem *exc_info) +{ + PyThreadState *tstate = _PyThreadState_GET(); + assert(_PyErr_Occurred(tstate)); + + int exc_info_given; + if (exc_info == NULL) { + exc_info_given = 0; + exc_info = tstate->exc_info; + } else { + exc_info_given = 1; + } + if (exc_info->exc_type == NULL || exc_info->exc_type == Py_None) { + return; + } + + _PyErr_StackItem *saved_exc_info; + if (exc_info_given) { + /* Temporarily set the thread state's exc_info since this is what + _PyErr_SetObject uses for implicit exception chaining. */ + saved_exc_info = tstate->exc_info; + tstate->exc_info = exc_info; + } + + PyObject *exc, *val, *tb; + _PyErr_Fetch(tstate, &exc, &val, &tb); + + PyObject *exc2, *val2, *tb2; + exc2 = exc_info->exc_type; + val2 = exc_info->exc_value; + tb2 = exc_info->exc_traceback; + _PyErr_NormalizeException(tstate, &exc2, &val2, &tb2); + if (tb2 != NULL) { + PyException_SetTraceback(val2, tb2); + } + + /* _PyErr_SetObject sets the context from PyThreadState. */ + _PyErr_SetObject(tstate, exc, val); + Py_DECREF(exc); // since _PyErr_Occurred was true + Py_XDECREF(val); + Py_XDECREF(tb); + + if (exc_info_given) { + tstate->exc_info = saved_exc_info; + } +} + static PyObject * _PyErr_FormatVFromCause(PyThreadState *tstate, PyObject *exception, const char *format, va_list vargs) @@ -520,6 +598,21 @@ _PyErr_FormatVFromCause(PyThreadState *tstate, PyObject *exception, return NULL; } +PyObject * +_PyErr_FormatFromCauseTstate(PyThreadState *tstate, PyObject *exception, + const char *format, ...) +{ + va_list vargs; +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, format); +#else + va_start(vargs); +#endif + _PyErr_FormatVFromCause(tstate, exception, format, vargs); + va_end(vargs); + return NULL; +} + PyObject * _PyErr_FormatFromCause(PyObject *exception, const char *format, ...) { @@ -547,10 +640,9 @@ PyErr_BadArgument(void) } PyObject * -PyErr_NoMemory(void) +_PyErr_NoMemory(PyThreadState *tstate) { - PyThreadState *tstate = _PyThreadState_GET(); - if (Py_TYPE(PyExc_MemoryError) == NULL) { + if (Py_IS_TYPE(PyExc_MemoryError, NULL)) { /* PyErr_NoMemory() has been called before PyExc_MemoryError has been initialized by _PyExc_Init() */ Py_FatalError("Out of memory and PyExc_MemoryError is not " @@ -560,6 +652,13 @@ PyErr_NoMemory(void) return NULL; } +PyObject * +PyErr_NoMemory(void) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return _PyErr_NoMemory(tstate); +} + PyObject * PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject) { @@ -877,7 +976,7 @@ PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg, goto done; } - error = _PyObject_FastCallDict(exception, &msg, 1, kwargs); + error = PyObject_VectorcallDict(exception, &msg, 1, kwargs); if (error != NULL) { _PyErr_SetObject(tstate, (PyObject *)Py_TYPE(error), error); Py_DECREF(error); @@ -979,7 +1078,6 @@ PyObject * PyErr_NewException(const char *name, PyObject *base, PyObject *dict) { PyThreadState *tstate = _PyThreadState_GET(); - _Py_IDENTIFIER(__module__); PyObject *modulename = NULL; PyObject *classname = NULL; PyObject *mydict = NULL; @@ -1205,7 +1303,6 @@ write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type, } } - _Py_IDENTIFIER(__module__); PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__); if (moduleName == NULL || !PyUnicode_Check(moduleName)) { Py_XDECREF(moduleName); @@ -1257,7 +1354,7 @@ write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type, } /* Explicitly call file.flush() */ - PyObject *res = _PyObject_CallMethodId(file, &PyId_flush, NULL); + PyObject *res = _PyObject_CallMethodIdNoArgs(file, &PyId_flush); if (!res) { return -1; } @@ -1293,7 +1390,7 @@ _PyErr_WriteUnraisableDefaultHook(PyObject *args) { PyThreadState *tstate = _PyThreadState_GET(); - if (Py_TYPE(args) != &UnraisableHookArgsType) { + if (!Py_IS_TYPE(args, &UnraisableHookArgsType)) { _PyErr_SetString(tstate, PyExc_TypeError, "sys.unraisablehook argument type " "must be UnraisableHookArgs"); @@ -1329,7 +1426,7 @@ void _PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj) { PyThreadState *tstate = _PyThreadState_GET(); - assert(tstate != NULL); + _Py_EnsureTstateNotNULL(tstate); PyObject *err_msg = NULL; PyObject *exc_type, *exc_value, *exc_tb; @@ -1343,7 +1440,7 @@ _PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj) } if (exc_tb == NULL) { - struct _frame *frame = tstate->frame; + PyFrameObject *frame = tstate->frame; if (frame != NULL) { exc_tb = _PyTraceBack_FromFrame(NULL, frame); if (exc_tb == NULL) { @@ -1382,7 +1479,7 @@ _PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj) goto default_hook; } - if (PySys_Audit("sys.unraisablehook", "OO", hook, hook_args) < 0) { + if (_PySys_Audit(tstate, "sys.unraisablehook", "OO", hook, hook_args) < 0) { Py_DECREF(hook_args); err_msg_str = "Exception ignored in audit hook"; obj = NULL; @@ -1394,8 +1491,7 @@ _PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj) goto default_hook; } - PyObject *args[1] = {hook_args}; - PyObject *res = _PyObject_FastCall(hook, args, 1); + PyObject *res = PyObject_CallOneArg(hook, hook_args); Py_DECREF(hook_args); if (res != NULL) { Py_DECREF(res); @@ -1552,16 +1648,18 @@ err_programtext(PyThreadState *tstate, FILE *fp, int lineno) { int i; char linebuf[1000]; - - if (fp == NULL) + if (fp == NULL) { return NULL; + } + for (i = 0; i < lineno; i++) { char *pLastChar = &linebuf[sizeof(linebuf) - 2]; do { *pLastChar = '\0'; if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf, - fp, NULL) == NULL) - break; + fp, NULL) == NULL) { + goto after_loop; + } /* fgets read *something*; if it didn't get as far as pLastChar, it must have found a newline or hit the end of the file; if pLastChar is \n, @@ -1569,6 +1667,8 @@ err_programtext(PyThreadState *tstate, FILE *fp, int lineno) yet seen a newline, so must continue */ } while (*pLastChar != '\0' && *pLastChar != '\n'); } + +after_loop: fclose(fp); if (i == lineno) { PyObject *res; diff --git a/Python/fileutils.c b/Python/fileutils.c index b274116745efe1744a71c65a6ffa0c80441da8e7..ddc090988f1589507b1f5e76ccec1ac78f95f671 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1,6 +1,6 @@ #include "Python.h" #include "pycore_fileutils.h" -#include "osdefs.h" +#include "osdefs.h" // SEP #include #ifdef MS_WINDOWS @@ -1165,6 +1165,13 @@ set_inheritable(int fd, int inheritable, int raise, int *atomic_flag_works) return 0; } +#ifdef __linux__ + if (errno == EBADF) { + // On Linux, ioctl(FIOCLEX) will fail with EBADF for O_PATH file descriptors + // Fall through to the fcntl() path + } + else +#endif if (errno != ENOTTY && errno != EACCES) { if (raise) PyErr_SetFromErrno(PyExc_OSError); @@ -1467,7 +1474,7 @@ _Py_fopen_obj(PyObject *path, const char *mode) && errno == EINTR && !(async_err = PyErr_CheckSignals())); #else PyObject *bytes; - char *path_bytes; + const char *path_bytes; assert(PyGILState_Check()); @@ -1684,8 +1691,9 @@ _Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t buflen) { char *cpath; char cbuf[MAXPATHLEN]; + size_t cbuf_len = Py_ARRAY_LENGTH(cbuf); wchar_t *wbuf; - int res; + Py_ssize_t res; size_t r1; cpath = _Py_EncodeLocaleRaw(path, NULL); @@ -1693,11 +1701,12 @@ _Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t buflen) errno = EINVAL; return -1; } - res = (int)readlink(cpath, cbuf, Py_ARRAY_LENGTH(cbuf)); + res = readlink(cpath, cbuf, cbuf_len); PyMem_RawFree(cpath); - if (res == -1) + if (res == -1) { return -1; - if (res == Py_ARRAY_LENGTH(cbuf)) { + } + if ((size_t)res == cbuf_len) { errno = EINVAL; return -1; } @@ -1762,6 +1771,103 @@ _Py_wrealpath(const wchar_t *path, } #endif + +#ifndef MS_WINDOWS +int +_Py_isabs(const wchar_t *path) +{ + return (path[0] == SEP); +} +#endif + + +/* Get an absolute path. + On error (ex: fail to get the current directory), return -1. + On memory allocation failure, set *abspath_p to NULL and return 0. + On success, return a newly allocated to *abspath_p to and return 0. + The string must be freed by PyMem_RawFree(). */ +int +_Py_abspath(const wchar_t *path, wchar_t **abspath_p) +{ +#ifdef MS_WINDOWS + wchar_t woutbuf[MAX_PATH], *woutbufp = woutbuf; + DWORD result; + + result = GetFullPathNameW(path, + Py_ARRAY_LENGTH(woutbuf), woutbuf, + NULL); + if (!result) { + return -1; + } + + if (result > Py_ARRAY_LENGTH(woutbuf)) { + if ((size_t)result <= (size_t)PY_SSIZE_T_MAX / sizeof(wchar_t)) { + woutbufp = PyMem_RawMalloc((size_t)result * sizeof(wchar_t)); + } + else { + woutbufp = NULL; + } + if (!woutbufp) { + *abspath_p = NULL; + return 0; + } + + result = GetFullPathNameW(path, result, woutbufp, NULL); + if (!result) { + PyMem_RawFree(woutbufp); + return -1; + } + } + + if (woutbufp != woutbuf) { + *abspath_p = woutbufp; + return 0; + } + + *abspath_p = _PyMem_RawWcsdup(woutbufp); + return 0; +#else + if (_Py_isabs(path)) { + *abspath_p = _PyMem_RawWcsdup(path); + return 0; + } + + wchar_t cwd[MAXPATHLEN + 1]; + cwd[Py_ARRAY_LENGTH(cwd) - 1] = 0; + if (!_Py_wgetcwd(cwd, Py_ARRAY_LENGTH(cwd) - 1)) { + /* unable to get the current directory */ + return -1; + } + + size_t cwd_len = wcslen(cwd); + size_t path_len = wcslen(path); + size_t len = cwd_len + 1 + path_len + 1; + if (len <= (size_t)PY_SSIZE_T_MAX / sizeof(wchar_t)) { + *abspath_p = PyMem_RawMalloc(len * sizeof(wchar_t)); + } + else { + *abspath_p = NULL; + } + if (*abspath_p == NULL) { + return 0; + } + + wchar_t *abspath = *abspath_p; + memcpy(abspath, cwd, cwd_len * sizeof(wchar_t)); + abspath += cwd_len; + + *abspath = (wchar_t)SEP; + abspath++; + + memcpy(abspath, path, path_len * sizeof(wchar_t)); + abspath += path_len; + + *abspath = 0; + return 0; +#endif +} + + /* Get the current directory. buflen is the buffer size in wide characters including the null character. Decode the path from the locale encoding. @@ -1933,6 +2039,7 @@ _Py_GetLocaleconvNumeric(struct lconv *lc, assert(decimal_point != NULL); assert(thousands_sep != NULL); +#ifndef MS_WINDOWS int change_locale = 0; if ((strlen(lc->decimal_point) > 1 || ((unsigned char)lc->decimal_point[0]) > 127)) { change_locale = 1; @@ -1971,14 +2078,20 @@ _Py_GetLocaleconvNumeric(struct lconv *lc, } } +#define GET_LOCALE_STRING(ATTR) PyUnicode_DecodeLocale(lc->ATTR, NULL) +#else /* MS_WINDOWS */ +/* Use _W_* fields of Windows strcut lconv */ +#define GET_LOCALE_STRING(ATTR) PyUnicode_FromWideChar(lc->_W_ ## ATTR, -1) +#endif /* MS_WINDOWS */ + int res = -1; - *decimal_point = PyUnicode_DecodeLocale(lc->decimal_point, NULL); + *decimal_point = GET_LOCALE_STRING(decimal_point); if (*decimal_point == NULL) { goto done; } - *thousands_sep = PyUnicode_DecodeLocale(lc->thousands_sep, NULL); + *thousands_sep = GET_LOCALE_STRING(thousands_sep); if (*thousands_sep == NULL) { goto done; } @@ -1986,9 +2099,13 @@ _Py_GetLocaleconvNumeric(struct lconv *lc, res = 0; done: +#ifndef MS_WINDOWS if (loc != NULL) { setlocale(LC_CTYPE, oldloc); } PyMem_Free(oldloc); +#endif return res; + +#undef GET_LOCALE_STRING } diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c index 7c4ecf0b3e2cb7770248308823a7a5bd803a7093..ed95f267d476c7bab41e74d81a34afb5fc96b395 100644 --- a/Python/formatter_unicode.c +++ b/Python/formatter_unicode.c @@ -62,7 +62,7 @@ get_integer(PyObject *str, Py_ssize_t *ppos, Py_ssize_t end, Py_ssize_t accumulator, digitval, pos = *ppos; int numdigits; int kind = PyUnicode_KIND(str); - void *data = PyUnicode_DATA(str); + const void *data = PyUnicode_DATA(str); accumulator = numdigits = 0; for (; pos < end; pos++, numdigits++) { @@ -170,7 +170,7 @@ parse_internal_render_format_spec(PyObject *format_spec, { Py_ssize_t pos = start; int kind = PyUnicode_KIND(format_spec); - void *data = PyUnicode_DATA(format_spec); + const void *data = PyUnicode_DATA(format_spec); /* end-pos is used throughout this code to specify the length of the input string */ #define READ_spec(index) PyUnicode_READ(kind, data, index) @@ -252,8 +252,10 @@ parse_internal_render_format_spec(PyObject *format_spec, ++pos; } if (end-pos && READ_spec(pos) == ',') { - invalid_comma_and_underscore(); - return 0; + if (format->thousands_separators == LT_UNDERSCORE_LOCALE) { + invalid_comma_and_underscore(); + return 0; + } } /* Parse field precision */ @@ -443,7 +445,7 @@ parse_number(PyObject *s, Py_ssize_t pos, Py_ssize_t end, { Py_ssize_t remainder; int kind = PyUnicode_KIND(s); - void *data = PyUnicode_DATA(s); + const void *data = PyUnicode_DATA(s); while (posn_lpadding = n_padding; break; default: - /* Shouldn't get here, but treat it as '>' */ + /* Shouldn't get here */ Py_UNREACHABLE(); } } @@ -595,7 +597,7 @@ calc_number_widths(NumberFieldWidths *spec, Py_ssize_t n_prefix, Return -1 on error, or 0 on success. */ static int fill_number(_PyUnicodeWriter *writer, const NumberFieldWidths *spec, - PyObject *digits, Py_ssize_t d_start, Py_ssize_t d_end, + PyObject *digits, Py_ssize_t d_start, PyObject *prefix, Py_ssize_t p_start, Py_UCS4 fill_char, LocaleInfo *locale, int toupper) @@ -983,7 +985,7 @@ format_long_internal(PyObject *value, const InternalFormatSpec *format, goto done; /* Calculate how much memory we'll need. */ - n_total = calc_number_widths(&spec, n_prefix, sign_char, tmp, inumeric_chars, + n_total = calc_number_widths(&spec, n_prefix, sign_char, inumeric_chars, inumeric_chars + n_digits, n_remainder, 0, &locale, format, &maxchar); if (n_total == -1) { @@ -996,7 +998,7 @@ format_long_internal(PyObject *value, const InternalFormatSpec *format, /* Populate the memory. */ result = fill_number(writer, &spec, - tmp, inumeric_chars, inumeric_chars + n_digits, + tmp, inumeric_chars, tmp, prefix, format->fill_char, &locale, format->type == 'X'); @@ -1131,7 +1133,7 @@ format_float_internal(PyObject *value, goto done; /* Calculate how much memory we'll need. */ - n_total = calc_number_widths(&spec, 0, sign_char, unicode_tmp, index, + n_total = calc_number_widths(&spec, 0, sign_char, index, index + n_digits, n_remainder, has_decimal, &locale, format, &maxchar); if (n_total == -1) { @@ -1144,7 +1146,7 @@ format_float_internal(PyObject *value, /* Populate the memory. */ result = fill_number(writer, &spec, - unicode_tmp, index, index + n_digits, + unicode_tmp, index, NULL, 0, format->fill_char, &locale, 0); @@ -1316,7 +1318,7 @@ format_complex_internal(PyObject *value, tmp_format.width = -1; /* Calculate how much memory we'll need. */ - n_re_total = calc_number_widths(&re_spec, 0, re_sign_char, re_unicode_tmp, + n_re_total = calc_number_widths(&re_spec, 0, re_sign_char, i_re, i_re + n_re_digits, n_re_remainder, re_has_decimal, &locale, &tmp_format, &maxchar); @@ -1329,7 +1331,7 @@ format_complex_internal(PyObject *value, * requested by the original format. */ if (!skip_re) tmp_format.sign = '+'; - n_im_total = calc_number_widths(&im_spec, 0, im_sign_char, im_unicode_tmp, + n_im_total = calc_number_widths(&im_spec, 0, im_sign_char, i_im, i_im + n_im_digits, n_im_remainder, im_has_decimal, &locale, &tmp_format, &maxchar); @@ -1366,7 +1368,7 @@ format_complex_internal(PyObject *value, if (!skip_re) { result = fill_number(writer, &re_spec, - re_unicode_tmp, i_re, i_re + n_re_digits, + re_unicode_tmp, i_re, NULL, 0, 0, &locale, 0); @@ -1374,7 +1376,7 @@ format_complex_internal(PyObject *value, goto done; } result = fill_number(writer, &im_spec, - im_unicode_tmp, i_im, i_im + n_im_digits, + im_unicode_tmp, i_im, NULL, 0, 0, &locale, 0); @@ -1447,7 +1449,7 @@ _PyUnicode_FormatAdvancedWriter(_PyUnicodeWriter *writer, return format_string_internal(obj, &format, writer); default: /* unknown */ - unknown_presentation_type(format.type, obj->ob_type->tp_name); + unknown_presentation_type(format.type, Py_TYPE(obj)->tp_name); return -1; } } @@ -1458,7 +1460,7 @@ _PyLong_FormatAdvancedWriter(_PyUnicodeWriter *writer, PyObject *format_spec, Py_ssize_t start, Py_ssize_t end) { - PyObject *tmp = NULL, *str = NULL; + PyObject *tmp = NULL; InternalFormatSpec format; int result = -1; @@ -1505,13 +1507,12 @@ _PyLong_FormatAdvancedWriter(_PyUnicodeWriter *writer, default: /* unknown */ - unknown_presentation_type(format.type, obj->ob_type->tp_name); + unknown_presentation_type(format.type, Py_TYPE(obj)->tp_name); goto done; } done: Py_XDECREF(tmp); - Py_XDECREF(str); return result; } @@ -1549,7 +1550,7 @@ _PyFloat_FormatAdvancedWriter(_PyUnicodeWriter *writer, default: /* unknown */ - unknown_presentation_type(format.type, obj->ob_type->tp_name); + unknown_presentation_type(format.type, Py_TYPE(obj)->tp_name); return -1; } } @@ -1587,7 +1588,7 @@ _PyComplex_FormatAdvancedWriter(_PyUnicodeWriter *writer, default: /* unknown */ - unknown_presentation_type(format.type, obj->ob_type->tp_name); + unknown_presentation_type(format.type, Py_TYPE(obj)->tp_name); return -1; } } diff --git a/Python/frozenmain.c b/Python/frozenmain.c index 7f9cc193173605f5cfc1d0e643d4e1a2c719984b..dd04d609d24f9315f910d96f327c0210c70ab634 100644 --- a/Python/frozenmain.c +++ b/Python/frozenmain.c @@ -2,7 +2,7 @@ /* Python interpreter main program for frozen scripts */ #include "Python.h" -#include "pycore_pystate.h" +#include "pycore_runtime.h" // _PyRuntime_Initialize() #include #ifdef MS_WINDOWS @@ -99,7 +99,7 @@ Py_FrozenMain(int argc, char **argv) n = PyImport_ImportFrozenModule("__main__"); if (n == 0) - Py_FatalError("__main__ not frozen"); + Py_FatalError("the __main__ module is not frozen"); if (n < 0) { PyErr_Print(); sts = 1; diff --git a/Python/getargs.c b/Python/getargs.c index c1b7b1a275b00900c6a7ab2a7992590d023c8457..d4a531a5efb57e02729128dd2034bc4abd3394bc 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -106,7 +106,7 @@ PyArg_Parse(PyObject *args, const char *format, ...) return retval; } -int +PyAPI_FUNC(int) _PyArg_Parse_SizeT(PyObject *args, const char *format, ...) { int retval; @@ -131,7 +131,7 @@ PyArg_ParseTuple(PyObject *args, const char *format, ...) return retval; } -int +PyAPI_FUNC(int) _PyArg_ParseTuple_SizeT(PyObject *args, const char *format, ...) { int retval; @@ -156,7 +156,7 @@ _PyArg_ParseStack(PyObject *const *args, Py_ssize_t nargs, const char *format, . return retval; } -int +PyAPI_FUNC(int) _PyArg_ParseStack_SizeT(PyObject *const *args, Py_ssize_t nargs, const char *format, ...) { int retval; @@ -182,7 +182,7 @@ PyArg_VaParse(PyObject *args, const char *format, va_list va) return retval; } -int +PyAPI_FUNC(int) _PyArg_VaParse_SizeT(PyObject *args, const char *format, va_list va) { va_list lva; @@ -312,7 +312,7 @@ vgetargs1_impl(PyObject *compat_args, PyObject *const *stack, Py_ssize_t nargs, break; default: if (level == 0) { - if (Py_ISALPHA(Py_CHARMASK(c))) + if (Py_ISALPHA(c)) if (c != 'e') /* skip encoded */ max++; } @@ -397,7 +397,7 @@ vgetargs1_impl(PyObject *compat_args, PyObject *const *stack, Py_ssize_t nargs, } } - if (*format != '\0' && !Py_ISALPHA(Py_CHARMASK(*format)) && + if (*format != '\0' && !Py_ISALPHA(*format) && *format != '(' && *format != '|' && *format != ':' && *format != ';') { PyErr_Format(PyExc_SystemError, @@ -521,7 +521,7 @@ converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags, } else if (c == ':' || c == ';' || c == '\0') break; - else if (level == 0 && Py_ISALPHA(Py_CHARMASK(c))) + else if (level == 0 && Py_ISALPHA(c)) n++; } @@ -531,7 +531,7 @@ converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags, toplevel ? "expected %d arguments, not %.50s" : "must be %d-item sequence, not %.50s", n, - arg == Py_None ? "None" : arg->ob_type->tp_name); + arg == Py_None ? "None" : Py_TYPE(arg)->tp_name); return msgbuf; } @@ -621,7 +621,7 @@ _PyArg_BadArgument(const char *fname, const char *displayname, PyErr_Format(PyExc_TypeError, "%.200s() %.200s must be %.50s, not %.50s", fname, displayname, expected, - arg == Py_None ? "None" : arg->ob_type->tp_name); + arg == Py_None ? "None" : Py_TYPE(arg)->tp_name); } static const char * @@ -636,7 +636,7 @@ converterr(const char *expected, PyObject *arg, char *msgbuf, size_t bufsize) else { PyOS_snprintf(msgbuf, bufsize, "must be %.50s, not %.50s", expected, - arg == Py_None ? "None" : arg->ob_type->tp_name); + arg == Py_None ? "None" : Py_TYPE(arg)->tp_name); } return msgbuf; } @@ -923,7 +923,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, case 'C': {/* unicode char */ int *p = va_arg(*p_va, int *); int kind; - void *data; + const void *data; if (!PyUnicode_Check(arg)) return converterr("a unicode character", arg, msgbuf, bufsize); @@ -1070,6 +1070,9 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, case 'u': /* raw unicode buffer (Py_UNICODE *) */ case 'Z': /* raw unicode buffer or None */ { + // TODO: Raise DeprecationWarning +_Py_COMP_DIAG_PUSH +_Py_COMP_DIAG_IGNORE_DEPR_DECLS Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **); if (*format == '#') { @@ -1109,6 +1112,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, arg, msgbuf, bufsize); } break; +_Py_COMP_DIAG_POP } case 'e': {/* encoded string */ @@ -1331,7 +1335,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, type = va_arg(*p_va, PyTypeObject*); p = va_arg(*p_va, PyObject **); format++; - if (PyType_IsSubtype(arg->ob_type, type)) + if (PyType_IsSubtype(Py_TYPE(arg), type)) *p = arg; else return converterr(type->tp_name, arg, msgbuf, bufsize); @@ -1466,7 +1470,7 @@ PyArg_ParseTupleAndKeywords(PyObject *args, return retval; } -int +PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywords_SizeT(PyObject *args, PyObject *keywords, const char *format, @@ -1517,7 +1521,7 @@ PyArg_VaParseTupleAndKeywords(PyObject *args, return retval; } -int +PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args, PyObject *keywords, const char *format, @@ -1543,7 +1547,7 @@ _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args, return retval; } -int +PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords, struct _PyArg_Parser *parser, ...) { @@ -1556,7 +1560,7 @@ _PyArg_ParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords, return retval; } -int +PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords, struct _PyArg_Parser *parser, ...) { @@ -1569,7 +1573,7 @@ _PyArg_ParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords, return retval; } -int +PyAPI_FUNC(int) _PyArg_ParseStackAndKeywords(PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames, struct _PyArg_Parser *parser, ...) { @@ -1582,7 +1586,7 @@ _PyArg_ParseStackAndKeywords(PyObject *const *args, Py_ssize_t nargs, PyObject * return retval; } -int +PyAPI_FUNC(int) _PyArg_ParseStackAndKeywords_SizeT(PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames, struct _PyArg_Parser *parser, ...) { @@ -1596,7 +1600,7 @@ _PyArg_ParseStackAndKeywords_SizeT(PyObject *const *args, Py_ssize_t nargs, PyOb } -int +PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords, struct _PyArg_Parser *parser, va_list va) { @@ -1610,7 +1614,7 @@ _PyArg_VaParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords, return retval; } -int +PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords, struct _PyArg_Parser *parser, va_list va) { @@ -2053,19 +2057,19 @@ find_keyword(PyObject *kwnames, PyObject *const *kwstack, PyObject *key) Py_ssize_t i, nkwargs; nkwargs = PyTuple_GET_SIZE(kwnames); - for (i=0; i < nkwargs; i++) { + for (i = 0; i < nkwargs; i++) { PyObject *kwname = PyTuple_GET_ITEM(kwnames, i); - /* ptr==ptr should match in most cases since keyword keys - should be interned strings */ + /* kwname == key will normally find a match in since keyword keys + should be interned strings; if not retry below in a new loop. */ if (kwname == key) { return kwstack[i]; } - if (!PyUnicode_Check(kwname)) { - /* ignore non-string keyword keys: - an error will be raised below */ - continue; - } + } + + for (i = 0; i < nkwargs; i++) { + PyObject *kwname = PyTuple_GET_ITEM(kwnames, i); + assert(PyUnicode_Check(kwname)); if (_PyUnicode_EQ(kwname, key)) { return kwstack[i]; } @@ -2293,16 +2297,11 @@ vgetargskeywordsfast_impl(PyObject *const *args, Py_ssize_t nargs, j++; } - if (!PyUnicode_Check(keyword)) { - PyErr_SetString(PyExc_TypeError, - "keywords must be strings"); - return cleanreturn(0, &freelist); - } match = PySequence_Contains(kwtuple, keyword); if (match <= 0) { if (!match) { PyErr_Format(PyExc_TypeError, - "'%U' is an invalid keyword " + "'%S' is an invalid keyword " "argument for %.200s%s", keyword, (parser->fname == NULL) ? "this function" : parser->fname, @@ -2523,16 +2522,11 @@ _PyArg_UnpackKeywords(PyObject *const *args, Py_ssize_t nargs, j++; } - if (!PyUnicode_Check(keyword)) { - PyErr_SetString(PyExc_TypeError, - "keywords must be strings"); - return NULL; - } match = PySequence_Contains(kwtuple, keyword); if (match <= 0) { if (!match) { PyErr_Format(PyExc_TypeError, - "'%U' is an invalid keyword " + "'%S' is an invalid keyword " "argument for %.200s%s", keyword, (parser->fname == NULL) ? "this function" : parser->fname, @@ -2797,6 +2791,7 @@ _PyArg_UnpackStack(PyObject *const *args, Py_ssize_t nargs, const char *name, #undef _PyArg_NoKeywords +#undef _PyArg_NoKwnames #undef _PyArg_NoPositional /* For type constructors that don't take keyword args @@ -2823,7 +2818,6 @@ _PyArg_NoKeywords(const char *funcname, PyObject *kwargs) return 0; } - int _PyArg_NoPositional(const char *funcname, PyObject *args) { @@ -2841,6 +2835,23 @@ _PyArg_NoPositional(const char *funcname, PyObject *args) return 0; } +int +_PyArg_NoKwnames(const char *funcname, PyObject *kwnames) +{ + if (kwnames == NULL) { + return 1; + } + + assert(PyTuple_CheckExact(kwnames)); + + if (PyTuple_GET_SIZE(kwnames) == 0) { + return 1; + } + + PyErr_Format(PyExc_TypeError, "%s() takes no keyword arguments", funcname); + return 0; +} + void _PyArg_Fini(void) { diff --git a/Python/getcopyright.c b/Python/getcopyright.c index 299ccc08c44f8348ae3a13bbe69b9401eb607090..7fdeb314d5261b97ceea5c876b82a58bc2a238d5 100644 --- a/Python/getcopyright.c +++ b/Python/getcopyright.c @@ -4,7 +4,7 @@ static const char cprt[] = "\ -Copyright (c) 2001-2020 Python Software Foundation.\n\ +Copyright (c) 2001-2021 Python Software Foundation.\n\ All Rights Reserved.\n\ \n\ Copyright (c) 2000 BeOpen.com.\n\ diff --git a/Python/getopt.c b/Python/getopt.c index 249ad1e8736075eedcf3331a4eb06493db75fd00..2e3891aae2d16ae0ab09b3a75190f43bf1909cfa 100644 --- a/Python/getopt.c +++ b/Python/getopt.c @@ -18,10 +18,6 @@ * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA, OR PROFITS, WHETHER * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Nevertheless, I would like to know about bugs in this library or - * suggestions for improvment. Send bug reports and feedback to - * davegottner@delphi.com. *---------------------------------------------------------------------------*/ /* Modified to support --help and --version, as well as /? on Windows diff --git a/Python/graminit.c b/Python/graminit.c index 7c40ce933c1d61672b0f760f265e6d843219b909..b7aa52895f8ae4b3491f5ae68be563c1a11c56e1 100644 --- a/Python/graminit.c +++ b/Python/graminit.c @@ -1,7 +1,8 @@ /* Generated by Parser/pgen */ +#include "exports.h" #include "grammar.h" -grammar _PyParser_Grammar; +Py_EXPORTED_SYMBOL grammar _PyParser_Grammar; static const arc arcs_0_0[3] = { {2, 1}, {3, 2}, @@ -51,31 +52,17 @@ static const arc arcs_3_0[1] = { static const arc arcs_3_1[1] = { {49, 2}, }; -static const arc arcs_3_2[2] = { - {5, 3}, - {2, 4}, -}; -static const arc arcs_3_3[2] = { - {50, 5}, - {51, 6}, -}; -static const arc arcs_3_4[1] = { - {0, 4}, -}; -static const arc arcs_3_5[1] = { - {2, 4}, +static const arc arcs_3_2[1] = { + {2, 3}, }; -static const arc arcs_3_6[1] = { - {50, 5}, +static const arc arcs_3_3[1] = { + {0, 3}, }; -static state states_3[7] = { +static state states_3[4] = { {1, arcs_3_0}, {1, arcs_3_1}, - {2, arcs_3_2}, - {2, arcs_3_3}, - {1, arcs_3_4}, - {1, arcs_3_5}, - {1, arcs_3_6}, + {1, arcs_3_2}, + {1, arcs_3_3}, }; static const arc arcs_4_0[1] = { {48, 1}, @@ -89,12 +76,12 @@ static state states_4[2] = { {2, arcs_4_1}, }; static const arc arcs_5_0[1] = { - {52, 1}, + {50, 1}, }; static const arc arcs_5_1[3] = { + {52, 2}, + {53, 2}, {54, 2}, - {55, 2}, - {56, 2}, }; static const arc arcs_5_2[1] = { {0, 2}, @@ -108,7 +95,7 @@ static const arc arcs_6_0[1] = { {38, 1}, }; static const arc arcs_6_1[1] = { - {56, 2}, + {54, 2}, }; static const arc arcs_6_2[1] = { {0, 2}, @@ -125,24 +112,24 @@ static const arc arcs_7_1[1] = { {40, 2}, }; static const arc arcs_7_2[1] = { - {57, 3}, + {55, 3}, }; static const arc arcs_7_3[2] = { - {58, 4}, - {59, 5}, + {56, 4}, + {57, 5}, }; static const arc arcs_7_4[1] = { - {60, 6}, + {58, 6}, }; static const arc arcs_7_5[2] = { - {61, 7}, - {62, 8}, + {59, 7}, + {60, 8}, }; static const arc arcs_7_6[1] = { - {59, 5}, + {57, 5}, }; static const arc arcs_7_7[1] = { - {62, 8}, + {60, 8}, }; static const arc arcs_7_8[1] = { {0, 8}, @@ -162,14 +149,14 @@ static const arc arcs_8_0[1] = { {5, 1}, }; static const arc arcs_8_1[2] = { - {50, 2}, - {63, 3}, + {61, 2}, + {62, 3}, }; static const arc arcs_8_2[1] = { {0, 2}, }; static const arc arcs_8_3[1] = { - {50, 2}, + {61, 2}, }; static state states_8[4] = { {1, arcs_8_0}, @@ -179,217 +166,217 @@ static state states_8[4] = { }; static const arc arcs_9_0[3] = { {6, 1}, - {64, 2}, - {65, 3}, + {63, 2}, + {64, 3}, }; static const arc arcs_9_1[4] = { - {66, 4}, - {61, 5}, - {65, 6}, + {65, 4}, + {59, 5}, + {64, 6}, {0, 1}, }; static const arc arcs_9_2[1] = { - {65, 7}, + {64, 7}, }; static const arc arcs_9_3[4] = { - {66, 8}, - {67, 9}, - {61, 5}, + {65, 8}, + {66, 9}, + {59, 5}, {0, 3}, }; static const arc arcs_9_4[4] = { - {64, 2}, - {61, 10}, - {65, 11}, + {63, 2}, + {59, 10}, + {64, 11}, {0, 4}, }; static const arc arcs_9_5[1] = { {0, 5}, }; static const arc arcs_9_6[3] = { - {66, 4}, - {61, 5}, + {65, 4}, + {59, 5}, {0, 6}, }; static const arc arcs_9_7[3] = { - {66, 12}, - {61, 5}, + {65, 12}, + {59, 5}, {0, 7}, }; static const arc arcs_9_8[6] = { {6, 13}, - {64, 2}, - {68, 14}, - {61, 15}, - {65, 3}, + {63, 2}, + {67, 14}, + {59, 15}, + {64, 3}, {0, 8}, }; static const arc arcs_9_9[1] = { - {60, 16}, + {58, 16}, }; static const arc arcs_9_10[3] = { - {64, 2}, - {65, 11}, + {63, 2}, + {64, 11}, {0, 10}, }; static const arc arcs_9_11[4] = { - {66, 4}, - {67, 17}, - {61, 5}, + {65, 4}, + {66, 17}, + {59, 5}, {0, 11}, }; static const arc arcs_9_12[2] = { - {61, 5}, + {59, 5}, {0, 12}, }; static const arc arcs_9_13[4] = { - {66, 18}, - {61, 5}, - {65, 19}, + {65, 18}, + {59, 5}, + {64, 19}, {0, 13}, }; static const arc arcs_9_14[2] = { - {66, 20}, + {65, 20}, {0, 14}, }; static const arc arcs_9_15[5] = { {6, 13}, - {64, 2}, - {68, 14}, - {65, 3}, + {63, 2}, + {67, 14}, + {64, 3}, {0, 15}, }; static const arc arcs_9_16[3] = { - {66, 8}, - {61, 5}, + {65, 8}, + {59, 5}, {0, 16}, }; static const arc arcs_9_17[1] = { - {60, 6}, + {58, 6}, }; static const arc arcs_9_18[4] = { - {64, 2}, - {61, 21}, - {65, 22}, + {63, 2}, + {59, 21}, + {64, 22}, {0, 18}, }; static const arc arcs_9_19[3] = { - {66, 18}, - {61, 5}, + {65, 18}, + {59, 5}, {0, 19}, }; static const arc arcs_9_20[5] = { {6, 23}, - {64, 2}, - {61, 24}, - {65, 25}, + {63, 2}, + {59, 24}, + {64, 25}, {0, 20}, }; static const arc arcs_9_21[3] = { - {64, 2}, - {65, 22}, + {63, 2}, + {64, 22}, {0, 21}, }; static const arc arcs_9_22[4] = { - {66, 18}, - {67, 26}, - {61, 5}, + {65, 18}, + {66, 26}, + {59, 5}, {0, 22}, }; static const arc arcs_9_23[4] = { - {66, 27}, - {61, 5}, - {65, 28}, + {65, 27}, + {59, 5}, + {64, 28}, {0, 23}, }; static const arc arcs_9_24[1] = { - {65, 25}, + {64, 25}, }; static const arc arcs_9_25[4] = { - {66, 29}, - {67, 30}, - {61, 5}, + {65, 29}, + {66, 30}, + {59, 5}, {0, 25}, }; static const arc arcs_9_26[1] = { - {60, 19}, + {58, 19}, }; static const arc arcs_9_27[4] = { - {64, 2}, - {61, 31}, - {65, 32}, + {63, 2}, + {59, 31}, + {64, 32}, {0, 27}, }; static const arc arcs_9_28[3] = { - {66, 27}, - {61, 5}, + {65, 27}, + {59, 5}, {0, 28}, }; static const arc arcs_9_29[5] = { {6, 33}, - {64, 2}, - {61, 34}, - {65, 25}, + {63, 2}, + {59, 34}, + {64, 25}, {0, 29}, }; static const arc arcs_9_30[1] = { - {60, 35}, + {58, 35}, }; static const arc arcs_9_31[3] = { - {64, 2}, - {65, 32}, + {63, 2}, + {64, 32}, {0, 31}, }; static const arc arcs_9_32[4] = { - {66, 27}, - {67, 36}, - {61, 5}, + {65, 27}, + {66, 36}, + {59, 5}, {0, 32}, }; static const arc arcs_9_33[4] = { - {66, 37}, - {61, 5}, - {65, 38}, + {65, 37}, + {59, 5}, + {64, 38}, {0, 33}, }; static const arc arcs_9_34[4] = { {6, 33}, - {64, 2}, - {65, 25}, + {63, 2}, + {64, 25}, {0, 34}, }; static const arc arcs_9_35[3] = { - {66, 29}, - {61, 5}, + {65, 29}, + {59, 5}, {0, 35}, }; static const arc arcs_9_36[1] = { - {60, 28}, + {58, 28}, }; static const arc arcs_9_37[4] = { - {64, 2}, - {61, 39}, - {65, 40}, + {63, 2}, + {59, 39}, + {64, 40}, {0, 37}, }; static const arc arcs_9_38[3] = { - {66, 37}, - {61, 5}, + {65, 37}, + {59, 5}, {0, 38}, }; static const arc arcs_9_39[3] = { - {64, 2}, - {65, 40}, + {63, 2}, + {64, 40}, {0, 39}, }; static const arc arcs_9_40[4] = { - {66, 37}, - {67, 41}, - {61, 5}, + {65, 37}, + {66, 41}, + {59, 5}, {0, 40}, }; static const arc arcs_9_41[1] = { - {60, 38}, + {58, 38}, }; static state states_9[42] = { {3, arcs_9_0}, @@ -439,11 +426,11 @@ static const arc arcs_10_0[1] = { {40, 1}, }; static const arc arcs_10_1[2] = { - {59, 2}, + {57, 2}, {0, 1}, }; static const arc arcs_10_2[1] = { - {60, 3}, + {58, 3}, }; static const arc arcs_10_3[1] = { {0, 3}, @@ -456,153 +443,153 @@ static state states_10[4] = { }; static const arc arcs_11_0[3] = { {6, 1}, - {64, 2}, - {70, 3}, + {63, 2}, + {69, 3}, }; static const arc arcs_11_1[3] = { - {66, 4}, - {70, 5}, + {65, 4}, + {69, 5}, {0, 1}, }; static const arc arcs_11_2[1] = { - {70, 6}, + {69, 6}, }; static const arc arcs_11_3[3] = { - {66, 7}, - {67, 8}, + {65, 7}, + {66, 8}, {0, 3}, }; static const arc arcs_11_4[3] = { - {64, 2}, - {70, 9}, + {63, 2}, + {69, 9}, {0, 4}, }; static const arc arcs_11_5[2] = { - {66, 4}, + {65, 4}, {0, 5}, }; static const arc arcs_11_6[2] = { - {66, 10}, + {65, 10}, {0, 6}, }; static const arc arcs_11_7[5] = { {6, 11}, - {64, 2}, - {68, 12}, - {70, 3}, + {63, 2}, + {67, 12}, + {69, 3}, {0, 7}, }; static const arc arcs_11_8[1] = { - {60, 13}, + {58, 13}, }; static const arc arcs_11_9[3] = { - {66, 4}, - {67, 14}, + {65, 4}, + {66, 14}, {0, 9}, }; static const arc arcs_11_10[1] = { {0, 10}, }; static const arc arcs_11_11[3] = { - {66, 15}, - {70, 16}, + {65, 15}, + {69, 16}, {0, 11}, }; static const arc arcs_11_12[2] = { - {66, 17}, + {65, 17}, {0, 12}, }; static const arc arcs_11_13[2] = { - {66, 7}, + {65, 7}, {0, 13}, }; static const arc arcs_11_14[1] = { - {60, 5}, + {58, 5}, }; static const arc arcs_11_15[3] = { - {64, 2}, - {70, 18}, + {63, 2}, + {69, 18}, {0, 15}, }; static const arc arcs_11_16[2] = { - {66, 15}, + {65, 15}, {0, 16}, }; static const arc arcs_11_17[4] = { {6, 19}, - {64, 2}, - {70, 20}, + {63, 2}, + {69, 20}, {0, 17}, }; static const arc arcs_11_18[3] = { - {66, 15}, - {67, 21}, + {65, 15}, + {66, 21}, {0, 18}, }; static const arc arcs_11_19[3] = { - {66, 22}, - {70, 23}, + {65, 22}, + {69, 23}, {0, 19}, }; static const arc arcs_11_20[3] = { - {66, 24}, - {67, 25}, + {65, 24}, + {66, 25}, {0, 20}, }; static const arc arcs_11_21[1] = { - {60, 16}, + {58, 16}, }; static const arc arcs_11_22[3] = { - {64, 2}, - {70, 26}, + {63, 2}, + {69, 26}, {0, 22}, }; static const arc arcs_11_23[2] = { - {66, 22}, + {65, 22}, {0, 23}, }; static const arc arcs_11_24[4] = { {6, 27}, - {64, 2}, - {70, 20}, + {63, 2}, + {69, 20}, {0, 24}, }; static const arc arcs_11_25[1] = { - {60, 28}, + {58, 28}, }; static const arc arcs_11_26[3] = { - {66, 22}, - {67, 29}, + {65, 22}, + {66, 29}, {0, 26}, }; static const arc arcs_11_27[3] = { - {66, 30}, - {70, 31}, + {65, 30}, + {69, 31}, {0, 27}, }; static const arc arcs_11_28[2] = { - {66, 24}, + {65, 24}, {0, 28}, }; static const arc arcs_11_29[1] = { - {60, 23}, + {58, 23}, }; static const arc arcs_11_30[3] = { - {64, 2}, - {70, 32}, + {63, 2}, + {69, 32}, {0, 30}, }; static const arc arcs_11_31[2] = { - {66, 30}, + {65, 30}, {0, 31}, }; static const arc arcs_11_32[3] = { - {66, 30}, - {67, 33}, + {65, 30}, + {66, 33}, {0, 32}, }; static const arc arcs_11_33[1] = { - {60, 31}, + {58, 31}, }; static state states_11[34] = { {3, arcs_11_0}, @@ -662,15 +649,15 @@ static state states_13[2] = { {1, arcs_13_1}, }; static const arc arcs_14_0[1] = { - {71, 1}, + {70, 1}, }; static const arc arcs_14_1[2] = { - {72, 2}, + {71, 2}, {2, 3}, }; static const arc arcs_14_2[2] = { {2, 3}, - {71, 1}, + {70, 1}, }; static const arc arcs_14_3[1] = { {0, 3}, @@ -682,6 +669,7 @@ static state states_14[4] = { {1, arcs_14_3}, }; static const arc arcs_15_0[8] = { + {72, 1}, {73, 1}, {74, 1}, {75, 1}, @@ -689,7 +677,6 @@ static const arc arcs_15_0[8] = { {77, 1}, {78, 1}, {79, 1}, - {80, 1}, }; static const arc arcs_15_1[1] = { {0, 1}, @@ -699,28 +686,28 @@ static state states_15[2] = { {1, arcs_15_1}, }; static const arc arcs_16_0[1] = { - {81, 1}, + {80, 1}, }; static const arc arcs_16_1[4] = { - {67, 2}, - {82, 3}, - {83, 4}, + {66, 2}, + {81, 3}, + {82, 4}, {0, 1}, }; static const arc arcs_16_2[2] = { - {81, 5}, - {84, 5}, + {80, 5}, + {83, 5}, }; static const arc arcs_16_3[1] = { {0, 3}, }; static const arc arcs_16_4[2] = { {47, 3}, - {84, 3}, + {83, 3}, }; static const arc arcs_16_5[3] = { - {67, 2}, - {61, 3}, + {66, 2}, + {59, 3}, {0, 5}, }; static state states_16[6] = { @@ -732,18 +719,18 @@ static state states_16[6] = { {3, arcs_16_5}, }; static const arc arcs_17_0[1] = { - {59, 1}, + {57, 1}, }; static const arc arcs_17_1[1] = { - {60, 2}, + {58, 2}, }; static const arc arcs_17_2[2] = { - {67, 3}, + {66, 3}, {0, 2}, }; static const arc arcs_17_3[2] = { - {81, 4}, - {84, 4}, + {80, 4}, + {83, 4}, }; static const arc arcs_17_4[1] = { {0, 4}, @@ -756,16 +743,16 @@ static state states_17[5] = { {1, arcs_17_4}, }; static const arc arcs_18_0[2] = { - {85, 1}, - {60, 1}, + {84, 1}, + {58, 1}, }; static const arc arcs_18_1[2] = { - {66, 2}, + {65, 2}, {0, 1}, }; static const arc arcs_18_2[3] = { - {85, 1}, - {60, 1}, + {84, 1}, + {58, 1}, {0, 2}, }; static state states_18[3] = { @@ -774,6 +761,7 @@ static state states_18[3] = { {3, arcs_18_2}, }; static const arc arcs_19_0[13] = { + {85, 1}, {86, 1}, {87, 1}, {88, 1}, @@ -786,7 +774,6 @@ static const arc arcs_19_0[13] = { {95, 1}, {96, 1}, {97, 1}, - {98, 1}, }; static const arc arcs_19_1[1] = { {0, 1}, @@ -799,7 +786,7 @@ static const arc arcs_20_0[1] = { {20, 1}, }; static const arc arcs_20_1[1] = { - {99, 2}, + {98, 2}, }; static const arc arcs_20_2[1] = { {0, 2}, @@ -820,11 +807,11 @@ static state states_21[2] = { {1, arcs_21_1}, }; static const arc arcs_22_0[5] = { + {99, 1}, {100, 1}, {101, 1}, {102, 1}, {103, 1}, - {104, 1}, }; static const arc arcs_22_1[1] = { {0, 1}, @@ -857,7 +844,7 @@ static const arc arcs_25_0[1] = { {31, 1}, }; static const arc arcs_25_1[2] = { - {81, 2}, + {80, 2}, {0, 1}, }; static const arc arcs_25_2[1] = { @@ -869,7 +856,7 @@ static state states_25[3] = { {1, arcs_25_2}, }; static const arc arcs_26_0[1] = { - {84, 1}, + {83, 1}, }; static const arc arcs_26_1[1] = { {0, 1}, @@ -882,7 +869,7 @@ static const arc arcs_27_0[1] = { {30, 1}, }; static const arc arcs_27_1[2] = { - {60, 2}, + {58, 2}, {0, 1}, }; static const arc arcs_27_2[2] = { @@ -890,7 +877,7 @@ static const arc arcs_27_2[2] = { {0, 2}, }; static const arc arcs_27_3[1] = { - {60, 4}, + {58, 4}, }; static const arc arcs_27_4[1] = { {0, 4}, @@ -903,8 +890,8 @@ static state states_27[5] = { {1, arcs_27_4}, }; static const arc arcs_28_0[2] = { + {104, 1}, {105, 1}, - {106, 1}, }; static const arc arcs_28_1[1] = { {0, 1}, @@ -917,7 +904,7 @@ static const arc arcs_29_0[1] = { {25, 1}, }; static const arc arcs_29_1[1] = { - {107, 2}, + {106, 2}, }; static const arc arcs_29_2[1] = { {0, 2}, @@ -931,15 +918,15 @@ static const arc arcs_30_0[1] = { {22, 1}, }; static const arc arcs_30_1[3] = { - {108, 2}, + {107, 2}, {9, 2}, - {49, 3}, + {108, 3}, }; static const arc arcs_30_2[4] = { - {108, 2}, + {107, 2}, {9, 2}, {25, 4}, - {49, 3}, + {108, 3}, }; static const arc arcs_30_3[1] = { {25, 4}, @@ -956,7 +943,7 @@ static const arc arcs_30_6[1] = { {0, 6}, }; static const arc arcs_30_7[1] = { - {50, 6}, + {61, 6}, }; static state states_30[8] = { {1, arcs_30_0}, @@ -988,7 +975,7 @@ static state states_31[4] = { {1, arcs_31_3}, }; static const arc arcs_32_0[1] = { - {49, 1}, + {108, 1}, }; static const arc arcs_32_1[2] = { {111, 2}, @@ -1010,7 +997,7 @@ static const arc arcs_33_0[1] = { {110, 1}, }; static const arc arcs_33_1[2] = { - {66, 2}, + {65, 2}, {0, 1}, }; static const arc arcs_33_2[2] = { @@ -1026,7 +1013,7 @@ static const arc arcs_34_0[1] = { {112, 1}, }; static const arc arcs_34_1[2] = { - {66, 0}, + {65, 0}, {0, 1}, }; static state states_34[2] = { @@ -1037,7 +1024,7 @@ static const arc arcs_35_0[1] = { {40, 1}, }; static const arc arcs_35_1[2] = { - {108, 0}, + {107, 0}, {0, 1}, }; static state states_35[2] = { @@ -1051,7 +1038,7 @@ static const arc arcs_36_1[1] = { {40, 2}, }; static const arc arcs_36_2[2] = { - {66, 1}, + {65, 1}, {0, 2}, }; static state states_36[3] = { @@ -1066,7 +1053,7 @@ static const arc arcs_37_1[1] = { {40, 2}, }; static const arc arcs_37_2[2] = { - {66, 1}, + {65, 1}, {0, 2}, }; static state states_37[3] = { @@ -1078,14 +1065,14 @@ static const arc arcs_38_0[1] = { {15, 1}, }; static const arc arcs_38_1[1] = { - {60, 2}, + {58, 2}, }; static const arc arcs_38_2[2] = { - {66, 3}, + {65, 3}, {0, 2}, }; static const arc arcs_38_3[1] = { - {60, 4}, + {58, 4}, }; static const arc arcs_38_4[1] = { {0, 4}, @@ -1099,10 +1086,10 @@ static state states_38[5] = { }; static const arc arcs_39_0[9] = { {113, 1}, - {55, 1}, {53, 1}, + {51, 1}, {114, 1}, - {56, 1}, + {54, 1}, {115, 1}, {116, 1}, {117, 1}, @@ -1120,7 +1107,7 @@ static const arc arcs_40_0[1] = { }; static const arc arcs_40_1[3] = { {114, 2}, - {56, 2}, + {54, 2}, {118, 2}, }; static const arc arcs_40_2[1] = { @@ -1135,24 +1122,24 @@ static const arc arcs_41_0[1] = { {24, 1}, }; static const arc arcs_41_1[1] = { - {119, 2}, + {49, 2}, }; static const arc arcs_41_2[1] = { - {59, 3}, + {57, 3}, }; static const arc arcs_41_3[1] = { - {120, 4}, + {119, 4}, }; static const arc arcs_41_4[3] = { - {121, 1}, - {122, 5}, + {120, 1}, + {121, 5}, {0, 4}, }; static const arc arcs_41_5[1] = { - {59, 6}, + {57, 6}, }; static const arc arcs_41_6[1] = { - {120, 7}, + {119, 7}, }; static const arc arcs_41_7[1] = { {0, 7}, @@ -1171,23 +1158,23 @@ static const arc arcs_42_0[1] = { {33, 1}, }; static const arc arcs_42_1[1] = { - {119, 2}, + {49, 2}, }; static const arc arcs_42_2[1] = { - {59, 3}, + {57, 3}, }; static const arc arcs_42_3[1] = { - {120, 4}, + {119, 4}, }; static const arc arcs_42_4[2] = { - {122, 5}, + {121, 5}, {0, 4}, }; static const arc arcs_42_5[1] = { - {59, 6}, + {57, 6}, }; static const arc arcs_42_6[1] = { - {120, 7}, + {119, 7}, }; static const arc arcs_42_7[1] = { {0, 7}, @@ -1206,33 +1193,33 @@ static const arc arcs_43_0[1] = { {21, 1}, }; static const arc arcs_43_1[1] = { - {99, 2}, + {98, 2}, }; static const arc arcs_43_2[1] = { - {123, 3}, + {122, 3}, }; static const arc arcs_43_3[1] = { {47, 4}, }; static const arc arcs_43_4[1] = { - {59, 5}, + {57, 5}, }; static const arc arcs_43_5[2] = { - {61, 6}, - {120, 7}, + {59, 6}, + {119, 7}, }; static const arc arcs_43_6[1] = { - {120, 7}, + {119, 7}, }; static const arc arcs_43_7[2] = { - {122, 8}, + {121, 8}, {0, 7}, }; static const arc arcs_43_8[1] = { - {59, 9}, + {57, 9}, }; static const arc arcs_43_9[1] = { - {120, 10}, + {119, 10}, }; static const arc arcs_43_10[1] = { {0, 10}, @@ -1254,44 +1241,44 @@ static const arc arcs_44_0[1] = { {32, 1}, }; static const arc arcs_44_1[1] = { - {59, 2}, + {57, 2}, }; static const arc arcs_44_2[1] = { - {120, 3}, + {119, 3}, }; static const arc arcs_44_3[2] = { - {124, 4}, - {125, 5}, + {123, 4}, + {124, 5}, }; static const arc arcs_44_4[1] = { - {59, 6}, + {57, 6}, }; static const arc arcs_44_5[1] = { - {59, 7}, + {57, 7}, }; static const arc arcs_44_6[1] = { - {120, 8}, + {119, 8}, }; static const arc arcs_44_7[1] = { - {120, 9}, + {119, 9}, }; static const arc arcs_44_8[1] = { {0, 8}, }; static const arc arcs_44_9[4] = { - {122, 10}, - {124, 4}, - {125, 5}, + {121, 10}, + {123, 4}, + {124, 5}, {0, 9}, }; static const arc arcs_44_10[1] = { - {59, 11}, + {57, 11}, }; static const arc arcs_44_11[1] = { - {120, 12}, + {119, 12}, }; static const arc arcs_44_12[2] = { - {124, 4}, + {123, 4}, {0, 12}, }; static state states_44[13] = { @@ -1313,18 +1300,18 @@ static const arc arcs_45_0[1] = { {34, 1}, }; static const arc arcs_45_1[1] = { - {126, 2}, + {125, 2}, }; static const arc arcs_45_2[2] = { - {66, 1}, - {59, 3}, + {65, 1}, + {57, 3}, }; static const arc arcs_45_3[2] = { - {61, 4}, - {120, 5}, + {59, 4}, + {119, 5}, }; static const arc arcs_45_4[1] = { - {120, 5}, + {119, 5}, }; static const arc arcs_45_5[1] = { {0, 5}, @@ -1338,14 +1325,14 @@ static state states_45[6] = { {1, arcs_45_5}, }; static const arc arcs_46_0[1] = { - {60, 1}, + {58, 1}, }; static const arc arcs_46_1[2] = { {111, 2}, {0, 1}, }; static const arc arcs_46_2[1] = { - {127, 3}, + {126, 3}, }; static const arc arcs_46_3[1] = { {0, 3}, @@ -1357,10 +1344,10 @@ static state states_46[4] = { {1, arcs_46_3}, }; static const arc arcs_47_0[1] = { - {128, 1}, + {127, 1}, }; static const arc arcs_47_1[2] = { - {60, 2}, + {58, 2}, {0, 1}, }; static const arc arcs_47_2[2] = { @@ -1385,7 +1372,7 @@ static const arc arcs_48_0[2] = { {4, 2}, }; static const arc arcs_48_1[1] = { - {129, 3}, + {128, 3}, }; static const arc arcs_48_2[1] = { {0, 2}, @@ -1394,7 +1381,7 @@ static const arc arcs_48_3[1] = { {45, 4}, }; static const arc arcs_48_4[2] = { - {130, 2}, + {129, 2}, {45, 4}, }; static state states_48[5] = { @@ -1405,14 +1392,14 @@ static state states_48[5] = { {2, arcs_48_4}, }; static const arc arcs_49_0[1] = { - {60, 1}, + {58, 1}, }; static const arc arcs_49_1[2] = { - {131, 2}, + {130, 2}, {0, 1}, }; static const arc arcs_49_2[1] = { - {60, 3}, + {58, 3}, }; static const arc arcs_49_3[1] = { {0, 3}, @@ -1424,8 +1411,8 @@ static state states_49[4] = { {1, arcs_49_3}, }; static const arc arcs_50_0[2] = { - {132, 1}, - {133, 2}, + {131, 1}, + {132, 2}, }; static const arc arcs_50_1[1] = { {0, 1}, @@ -1435,13 +1422,13 @@ static const arc arcs_50_2[2] = { {0, 2}, }; static const arc arcs_50_3[1] = { - {133, 4}, + {132, 4}, }; static const arc arcs_50_4[1] = { - {122, 5}, + {121, 5}, }; static const arc arcs_50_5[1] = { - {60, 1}, + {58, 1}, }; static state states_50[6] = { {2, arcs_50_0}, @@ -1452,8 +1439,8 @@ static state states_50[6] = { {1, arcs_50_5}, }; static const arc arcs_51_0[2] = { - {135, 1}, - {133, 1}, + {134, 1}, + {132, 1}, }; static const arc arcs_51_1[1] = { {0, 1}, @@ -1466,14 +1453,14 @@ static const arc arcs_52_0[1] = { {26, 1}, }; static const arc arcs_52_1[2] = { - {59, 2}, - {69, 3}, + {57, 2}, + {68, 3}, }; static const arc arcs_52_2[1] = { - {60, 4}, + {58, 4}, }; static const arc arcs_52_3[1] = { - {59, 2}, + {57, 2}, }; static const arc arcs_52_4[1] = { {0, 4}, @@ -1489,14 +1476,14 @@ static const arc arcs_53_0[1] = { {26, 1}, }; static const arc arcs_53_1[2] = { - {59, 2}, - {69, 3}, + {57, 2}, + {68, 3}, }; static const arc arcs_53_2[1] = { - {134, 4}, + {133, 4}, }; static const arc arcs_53_3[1] = { - {59, 2}, + {57, 2}, }; static const arc arcs_53_4[1] = { {0, 4}, @@ -1509,10 +1496,10 @@ static state states_53[5] = { {1, arcs_53_4}, }; static const arc arcs_54_0[1] = { - {136, 1}, + {135, 1}, }; static const arc arcs_54_1[2] = { - {137, 0}, + {136, 0}, {0, 1}, }; static state states_54[2] = { @@ -1520,10 +1507,10 @@ static state states_54[2] = { {2, arcs_54_1}, }; static const arc arcs_55_0[1] = { - {138, 1}, + {137, 1}, }; static const arc arcs_55_1[2] = { - {139, 0}, + {138, 0}, {0, 1}, }; static state states_55[2] = { @@ -1532,10 +1519,10 @@ static state states_55[2] = { }; static const arc arcs_56_0[2] = { {28, 1}, - {140, 2}, + {139, 2}, }; static const arc arcs_56_1[1] = { - {138, 2}, + {137, 2}, }; static const arc arcs_56_2[1] = { {0, 2}, @@ -1546,10 +1533,10 @@ static state states_56[3] = { {1, arcs_56_2}, }; static const arc arcs_57_0[1] = { - {127, 1}, + {126, 1}, }; static const arc arcs_57_1[2] = { - {141, 0}, + {140, 0}, {0, 1}, }; static state states_57[2] = { @@ -1557,15 +1544,15 @@ static state states_57[2] = { {2, arcs_57_1}, }; static const arc arcs_58_0[10] = { + {141, 1}, {142, 1}, {143, 1}, + {141, 1}, {144, 1}, - {142, 1}, {145, 1}, {146, 1}, - {147, 1}, - {123, 1}, - {148, 2}, + {122, 1}, + {147, 2}, {28, 3}, }; static const arc arcs_58_1[1] = { @@ -1576,7 +1563,7 @@ static const arc arcs_58_2[2] = { {0, 2}, }; static const arc arcs_58_3[1] = { - {123, 1}, + {122, 1}, }; static state states_58[4] = { {10, arcs_58_0}, @@ -1588,7 +1575,7 @@ static const arc arcs_59_0[1] = { {6, 1}, }; static const arc arcs_59_1[1] = { - {127, 2}, + {126, 2}, }; static const arc arcs_59_2[1] = { {0, 2}, @@ -1599,10 +1586,10 @@ static state states_59[3] = { {1, arcs_59_2}, }; static const arc arcs_60_0[1] = { - {149, 1}, + {148, 1}, }; static const arc arcs_60_1[2] = { - {150, 0}, + {149, 0}, {0, 1}, }; static state states_60[2] = { @@ -1610,10 +1597,10 @@ static state states_60[2] = { {2, arcs_60_1}, }; static const arc arcs_61_0[1] = { - {151, 1}, + {150, 1}, }; static const arc arcs_61_1[2] = { - {152, 0}, + {151, 0}, {0, 1}, }; static state states_61[2] = { @@ -1621,10 +1608,10 @@ static state states_61[2] = { {2, arcs_61_1}, }; static const arc arcs_62_0[1] = { - {153, 1}, + {152, 1}, }; static const arc arcs_62_1[2] = { - {154, 0}, + {153, 0}, {0, 1}, }; static state states_62[2] = { @@ -1632,11 +1619,11 @@ static state states_62[2] = { {2, arcs_62_1}, }; static const arc arcs_63_0[1] = { - {155, 1}, + {154, 1}, }; static const arc arcs_63_1[3] = { + {155, 0}, {156, 0}, - {157, 0}, {0, 1}, }; static state states_63[2] = { @@ -1644,7 +1631,7 @@ static state states_63[2] = { {3, arcs_63_1}, }; static const arc arcs_64_0[1] = { - {158, 1}, + {157, 1}, }; static const arc arcs_64_1[3] = { {7, 0}, @@ -1656,13 +1643,13 @@ static state states_64[2] = { {3, arcs_64_1}, }; static const arc arcs_65_0[1] = { - {159, 1}, + {158, 1}, }; static const arc arcs_65_1[6] = { - {160, 0}, + {159, 0}, {6, 0}, - {68, 0}, - {161, 0}, + {67, 0}, + {160, 0}, {10, 0}, {0, 1}, }; @@ -1674,10 +1661,10 @@ static const arc arcs_66_0[4] = { {7, 1}, {8, 1}, {37, 1}, - {162, 2}, + {161, 2}, }; static const arc arcs_66_1[1] = { - {159, 2}, + {158, 2}, }; static const arc arcs_66_2[1] = { {0, 2}, @@ -1688,14 +1675,14 @@ static state states_66[3] = { {1, arcs_66_2}, }; static const arc arcs_67_0[1] = { - {163, 1}, + {162, 1}, }; static const arc arcs_67_1[2] = { - {64, 2}, + {63, 2}, {0, 1}, }; static const arc arcs_67_2[1] = { - {159, 3}, + {158, 3}, }; static const arc arcs_67_3[1] = { {0, 3}, @@ -1708,13 +1695,13 @@ static state states_67[4] = { }; static const arc arcs_68_0[2] = { {39, 1}, - {164, 2}, + {163, 2}, }; static const arc arcs_68_1[1] = { - {164, 2}, + {163, 2}, }; static const arc arcs_68_2[2] = { - {165, 2}, + {164, 2}, {0, 2}, }; static state states_68[3] = { @@ -1735,33 +1722,33 @@ static const arc arcs_69_0[10] = { {42, 5}, }; static const arc arcs_69_1[3] = { - {50, 2}, - {166, 6}, - {84, 6}, + {61, 2}, + {165, 6}, + {83, 6}, }; static const arc arcs_69_2[1] = { {0, 2}, }; static const arc arcs_69_3[2] = { - {167, 2}, - {166, 7}, + {166, 2}, + {165, 7}, }; static const arc arcs_69_4[2] = { - {168, 2}, - {169, 8}, + {167, 2}, + {168, 8}, }; static const arc arcs_69_5[2] = { {42, 5}, {0, 5}, }; static const arc arcs_69_6[1] = { - {50, 2}, + {61, 2}, }; static const arc arcs_69_7[1] = { - {167, 2}, + {166, 2}, }; static const arc arcs_69_8[1] = { - {168, 2}, + {167, 2}, }; static state states_69[9] = { {10, arcs_69_0}, @@ -1775,24 +1762,24 @@ static state states_69[9] = { {1, arcs_69_8}, }; static const arc arcs_70_0[2] = { - {119, 1}, - {85, 1}, + {49, 1}, + {84, 1}, }; static const arc arcs_70_1[3] = { - {66, 2}, - {170, 3}, + {65, 2}, + {169, 3}, {0, 1}, }; static const arc arcs_70_2[3] = { - {119, 4}, - {85, 4}, + {49, 4}, + {84, 4}, {0, 2}, }; static const arc arcs_70_3[1] = { {0, 3}, }; static const arc arcs_70_4[2] = { - {66, 2}, + {65, 2}, {0, 4}, }; static state states_70[5] = { @@ -1804,12 +1791,12 @@ static state states_70[5] = { }; static const arc arcs_71_0[3] = { {5, 1}, - {108, 2}, + {107, 2}, {14, 3}, }; static const arc arcs_71_1[2] = { - {50, 4}, - {51, 5}, + {61, 4}, + {170, 5}, }; static const arc arcs_71_2[1] = { {40, 4}, @@ -1821,10 +1808,10 @@ static const arc arcs_71_4[1] = { {0, 4}, }; static const arc arcs_71_5[1] = { - {50, 4}, + {61, 4}, }; static const arc arcs_71_6[1] = { - {167, 4}, + {166, 4}, }; static state states_71[7] = { {3, arcs_71_0}, @@ -1839,7 +1826,7 @@ static const arc arcs_72_0[1] = { {172, 1}, }; static const arc arcs_72_1[2] = { - {66, 2}, + {65, 2}, {0, 1}, }; static const arc arcs_72_2[2] = { @@ -1852,16 +1839,16 @@ static state states_72[3] = { {2, arcs_72_2}, }; static const arc arcs_73_0[2] = { - {59, 1}, - {60, 2}, + {57, 1}, + {58, 2}, }; static const arc arcs_73_1[3] = { {173, 3}, - {60, 4}, + {58, 4}, {0, 1}, }; static const arc arcs_73_2[2] = { - {59, 1}, + {57, 1}, {0, 2}, }; static const arc arcs_73_3[1] = { @@ -1879,10 +1866,10 @@ static state states_73[5] = { {2, arcs_73_4}, }; static const arc arcs_74_0[1] = { - {59, 1}, + {57, 1}, }; static const arc arcs_74_1[2] = { - {60, 2}, + {58, 2}, {0, 1}, }; static const arc arcs_74_2[1] = { @@ -1894,16 +1881,16 @@ static state states_74[3] = { {1, arcs_74_2}, }; static const arc arcs_75_0[2] = { - {127, 1}, - {85, 1}, + {126, 1}, + {84, 1}, }; static const arc arcs_75_1[2] = { - {66, 2}, + {65, 2}, {0, 1}, }; static const arc arcs_75_2[3] = { - {127, 1}, - {85, 1}, + {126, 1}, + {84, 1}, {0, 2}, }; static state states_75[3] = { @@ -1912,14 +1899,14 @@ static state states_75[3] = { {3, arcs_75_2}, }; static const arc arcs_76_0[1] = { - {60, 1}, + {58, 1}, }; static const arc arcs_76_1[2] = { - {66, 2}, + {65, 2}, {0, 1}, }; static const arc arcs_76_2[2] = { - {60, 1}, + {58, 1}, {0, 2}, }; static state states_76[3] = { @@ -1928,61 +1915,61 @@ static state states_76[3] = { {2, arcs_76_2}, }; static const arc arcs_77_0[3] = { - {64, 1}, - {85, 2}, - {60, 3}, + {63, 1}, + {84, 2}, + {58, 3}, }; static const arc arcs_77_1[1] = { - {127, 4}, + {126, 4}, }; static const arc arcs_77_2[3] = { - {66, 5}, - {170, 6}, + {65, 5}, + {169, 6}, {0, 2}, }; static const arc arcs_77_3[4] = { - {66, 5}, - {59, 7}, - {170, 6}, + {65, 5}, + {57, 7}, + {169, 6}, {0, 3}, }; static const arc arcs_77_4[3] = { - {66, 8}, - {170, 6}, + {65, 8}, + {169, 6}, {0, 4}, }; static const arc arcs_77_5[3] = { - {85, 9}, - {60, 9}, + {84, 9}, + {58, 9}, {0, 5}, }; static const arc arcs_77_6[1] = { {0, 6}, }; static const arc arcs_77_7[1] = { - {60, 4}, + {58, 4}, }; static const arc arcs_77_8[3] = { - {64, 10}, - {60, 11}, + {63, 10}, + {58, 11}, {0, 8}, }; static const arc arcs_77_9[2] = { - {66, 5}, + {65, 5}, {0, 9}, }; static const arc arcs_77_10[1] = { - {127, 12}, + {126, 12}, }; static const arc arcs_77_11[1] = { - {59, 13}, + {57, 13}, }; static const arc arcs_77_12[2] = { - {66, 8}, + {65, 8}, {0, 12}, }; static const arc arcs_77_13[1] = { - {60, 12}, + {58, 12}, }; static state states_77[14] = { {3, arcs_77_0}, @@ -2008,20 +1995,20 @@ static const arc arcs_78_1[1] = { }; static const arc arcs_78_2[2] = { {5, 3}, - {59, 4}, + {57, 4}, }; static const arc arcs_78_3[2] = { - {50, 5}, - {51, 6}, + {61, 5}, + {170, 6}, }; static const arc arcs_78_4[1] = { - {120, 7}, + {119, 7}, }; static const arc arcs_78_5[1] = { - {59, 4}, + {57, 4}, }; static const arc arcs_78_6[1] = { - {50, 5}, + {61, 5}, }; static const arc arcs_78_7[1] = { {0, 7}, @@ -2040,7 +2027,7 @@ static const arc arcs_79_0[1] = { {174, 1}, }; static const arc arcs_79_1[2] = { - {66, 2}, + {65, 2}, {0, 1}, }; static const arc arcs_79_2[2] = { @@ -2054,16 +2041,16 @@ static state states_79[3] = { }; static const arc arcs_80_0[3] = { {6, 1}, - {64, 1}, - {60, 2}, + {63, 1}, + {58, 2}, }; static const arc arcs_80_1[1] = { - {60, 3}, + {58, 3}, }; static const arc arcs_80_2[4] = { - {131, 1}, - {67, 1}, - {170, 3}, + {130, 1}, + {66, 1}, + {169, 3}, {0, 2}, }; static const arc arcs_80_3[1] = { @@ -2076,7 +2063,7 @@ static state states_80[4] = { {1, arcs_80_3}, }; static const arc arcs_81_0[2] = { - {170, 1}, + {169, 1}, {176, 1}, }; static const arc arcs_81_1[1] = { @@ -2090,13 +2077,13 @@ static const arc arcs_82_0[1] = { {21, 1}, }; static const arc arcs_82_1[1] = { - {99, 2}, + {98, 2}, }; static const arc arcs_82_2[1] = { - {123, 3}, + {122, 3}, }; static const arc arcs_82_3[1] = { - {133, 4}, + {132, 4}, }; static const arc arcs_82_4[2] = { {175, 5}, @@ -2132,7 +2119,7 @@ static const arc arcs_84_0[1] = { {24, 1}, }; static const arc arcs_84_1[1] = { - {134, 2}, + {133, 2}, }; static const arc arcs_84_2[2] = { {175, 3}, @@ -2174,10 +2161,10 @@ static state states_86[3] = { }; static const arc arcs_87_0[2] = { {22, 1}, - {81, 2}, + {80, 2}, }; static const arc arcs_87_1[1] = { - {60, 2}, + {58, 2}, }; static const arc arcs_87_2[1] = { {0, 2}, @@ -2192,8 +2179,8 @@ static const arc arcs_88_0[2] = { {4, 2}, }; static const arc arcs_88_1[2] = { - {129, 3}, - {61, 4}, + {128, 3}, + {59, 4}, }; static const arc arcs_88_2[1] = { {0, 2}, @@ -2205,11 +2192,11 @@ static const arc arcs_88_4[1] = { {2, 6}, }; static const arc arcs_88_5[2] = { - {130, 2}, + {129, 2}, {45, 5}, }; static const arc arcs_88_6[1] = { - {129, 3}, + {128, 3}, }; static state states_88[7] = { {2, arcs_88_0}, @@ -2239,17 +2226,17 @@ static const arc arcs_90_0[1] = { {5, 1}, }; static const arc arcs_90_1[2] = { - {50, 2}, + {61, 2}, {182, 3}, }; static const arc arcs_90_2[1] = { - {58, 4}, + {56, 4}, }; static const arc arcs_90_3[1] = { - {50, 2}, + {61, 2}, }; static const arc arcs_90_4[1] = { - {60, 5}, + {58, 5}, }; static const arc arcs_90_5[1] = { {0, 5}, @@ -2264,27 +2251,27 @@ static state states_90[6] = { }; static const arc arcs_91_0[3] = { {6, 1}, - {64, 2}, - {60, 3}, + {63, 2}, + {58, 3}, }; static const arc arcs_91_1[3] = { - {66, 4}, - {60, 5}, + {65, 4}, + {58, 5}, {0, 1}, }; static const arc arcs_91_2[1] = { - {60, 6}, + {58, 6}, }; static const arc arcs_91_3[2] = { - {66, 7}, + {65, 7}, {0, 3}, }; static const arc arcs_91_4[2] = { - {64, 2}, - {60, 5}, + {63, 2}, + {58, 5}, }; static const arc arcs_91_5[2] = { - {66, 4}, + {65, 4}, {0, 5}, }; static const arc arcs_91_6[1] = { @@ -2292,21 +2279,21 @@ static const arc arcs_91_6[1] = { }; static const arc arcs_91_7[4] = { {6, 8}, - {64, 2}, - {60, 3}, + {63, 2}, + {58, 3}, {0, 7}, }; static const arc arcs_91_8[3] = { - {66, 9}, - {60, 10}, + {65, 9}, + {58, 10}, {0, 8}, }; static const arc arcs_91_9[2] = { - {64, 2}, - {60, 10}, + {63, 2}, + {58, 10}, }; static const arc arcs_91_10[2] = { - {66, 9}, + {65, 9}, {0, 10}, }; static state states_91[11] = { @@ -2329,7 +2316,7 @@ static const dfa dfas[92] = { "\344\377\377\377\377\027\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {258, "eval_input", 3, states_2, "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {259, "decorator", 7, states_3, + {259, "decorator", 4, states_3, "\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {260, "decorators", 2, states_4, "\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, @@ -2342,11 +2329,11 @@ static const dfa dfas[92] = { {264, "parameters", 4, states_8, "\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {265, "typedargslist", 42, states_9, - "\100\000\000\000\000\001\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\100\000\000\000\000\001\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {266, "tfpdef", 4, states_10, "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {267, "varargslist", 34, states_11, - "\100\000\000\000\000\001\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\100\000\000\000\000\001\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {268, "vfpdef", 2, states_12, "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {269, "stmt", 2, states_13, @@ -2358,11 +2345,11 @@ static const dfa dfas[92] = { {272, "expr_stmt", 6, states_16, "\340\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {273, "annassign", 5, states_17, - "\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {274, "testlist_star_expr", 3, states_18, "\340\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {275, "augassign", 2, states_19, - "\000\000\000\000\000\000\000\000\000\000\300\377\007\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\340\377\003\000\000\000\000\000\000\000\000\000\000"}, {276, "del_stmt", 3, states_20, "\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {277, "pass_stmt", 2, states_21, @@ -2418,7 +2405,7 @@ static const dfa dfas[92] = { {302, "with_item", 4, states_46, "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {303, "except_clause", 5, states_47, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000"}, {304, "suite", 5, states_48, "\344\373\325\376\270\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {305, "namedexpr_test", 4, states_49, @@ -2440,7 +2427,7 @@ static const dfa dfas[92] = { {313, "comparison", 2, states_57, "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {314, "comp_op", 4, states_58, - "\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\010\000\300\037\000\000\000\000"}, + "\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\004\000\340\017\000\000\000\000"}, {315, "star_expr", 3, states_59, "\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {316, "expr", 2, states_60, @@ -2466,25 +2453,25 @@ static const dfa dfas[92] = { {326, "testlist_comp", 5, states_70, "\340\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {327, "trailer", 7, states_71, - "\040\100\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000"}, + "\040\100\000\000\000\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000"}, {328, "subscriptlist", 3, states_72, - "\240\173\000\024\260\007\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\024\260\007\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {329, "subscript", 5, states_73, - "\240\173\000\024\260\007\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\240\173\000\024\260\007\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {330, "sliceop", 3, states_74, - "\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {331, "exprlist", 3, states_75, "\340\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {332, "testlist", 3, states_76, "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {333, "dictorsetmaker", 14, states_77, - "\340\173\000\024\260\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\340\173\000\024\260\007\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {334, "classdef", 8, states_78, "\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {335, "arglist", 3, states_79, - "\340\173\000\024\260\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\340\173\000\024\260\007\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {336, "argument", 4, states_80, - "\340\173\000\024\260\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\340\173\000\024\260\007\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {337, "comp_iter", 2, states_81, "\000\000\040\001\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {338, "sync_comp_for", 6, states_82, @@ -2506,7 +2493,7 @@ static const dfa dfas[92] = { {346, "func_type", 6, states_90, "\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {347, "typelist", 11, states_91, - "\340\173\000\024\260\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\340\173\000\024\260\007\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, }; static const label labels[183] = { {0, "EMPTY"}, @@ -2558,9 +2545,7 @@ static const label labels[183] = { {258, 0}, {332, 0}, {259, 0}, - {291, 0}, - {8, 0}, - {335, 0}, + {305, 0}, {260, 0}, {261, 0}, {262, 0}, @@ -2572,6 +2557,7 @@ static const label labels[183] = { {306, 0}, {58, 0}, {344, 0}, + {8, 0}, {265, 0}, {35, 0}, {266, 0}, @@ -2618,6 +2604,7 @@ static const label labels[183] = { {285, 0}, {290, 0}, {23, 0}, + {291, 0}, {289, 0}, {287, 0}, {1, "as"}, @@ -2628,7 +2615,6 @@ static const label labels[183] = { {300, 0}, {298, 0}, {301, 0}, - {305, 0}, {304, 0}, {1, "elif"}, {1, "else"}, @@ -2680,6 +2666,7 @@ static const label labels[183] = { {26, 0}, {333, 0}, {339, 0}, + {335, 0}, {328, 0}, {329, 0}, {330, 0}, @@ -2693,7 +2680,7 @@ static const label labels[183] = { {346, 0}, {347, 0}, }; -grammar _PyParser_Grammar = { +Py_EXPORTED_SYMBOL grammar _PyParser_Grammar = { 92, dfas, {183, labels}, diff --git a/Python/hamt.c b/Python/hamt.c index 5efc8d7fabe8e33322b7179892967b1b8190a11b..8801c5ea418c7f5694767760b9799e25caa4fc4d 100644 --- a/Python/hamt.c +++ b/Python/hamt.c @@ -1,9 +1,8 @@ #include "Python.h" #include "pycore_hamt.h" -#include "pycore_object.h" -#include "pycore_pystate.h" -#include "structmember.h" +#include "pycore_object.h" // _PyObject_GC_TRACK() +#include // offsetof() /* This file provides an implementation of an immutable mapping using the @@ -274,9 +273,9 @@ to introspect the tree: */ -#define IS_ARRAY_NODE(node) (Py_TYPE(node) == &_PyHamt_ArrayNode_Type) -#define IS_BITMAP_NODE(node) (Py_TYPE(node) == &_PyHamt_BitmapNode_Type) -#define IS_COLLISION_NODE(node) (Py_TYPE(node) == &_PyHamt_CollisionNode_Type) +#define IS_ARRAY_NODE(node) Py_IS_TYPE(node, &_PyHamt_ArrayNode_Type) +#define IS_BITMAP_NODE(node) Py_IS_TYPE(node, &_PyHamt_BitmapNode_Type) +#define IS_COLLISION_NODE(node) Py_IS_TYPE(node, &_PyHamt_CollisionNode_Type) /* Return type for 'find' (lookup a key) functions. @@ -551,7 +550,7 @@ hamt_node_bitmap_new(Py_ssize_t size) return NULL; } - Py_SIZE(node) = size; + Py_SET_SIZE(node, size); for (i = 0; i < size; i++) { node->b_array[i] = NULL; @@ -830,7 +829,7 @@ hamt_node_bitmap_assoc(PyHamtNode_Bitmap *self, Instead we start using an Array node, which has simpler (faster) implementation at the expense of - having prealocated 32 pointers for its keys/values + having preallocated 32 pointers for its keys/values pairs. Small hamt objects (<30 keys) usually don't have any @@ -1288,7 +1287,7 @@ hamt_node_collision_new(int32_t hash, Py_ssize_t size) node->c_array[i] = NULL; } - Py_SIZE(node) = size; + Py_SET_SIZE(node, size); node->c_hash = hash; _PyObject_GC_TRACK(node); diff --git a/Modules/hashtable.c b/Python/hashtable.c similarity index 37% rename from Modules/hashtable.c rename to Python/hashtable.c index 4a36a1e71cdd05518403662cc3985abc666b911c..09501de199b0e61fc0be38527443adb872e08fe4 100644 --- a/Modules/hashtable.c +++ b/Python/hashtable.c @@ -45,7 +45,7 @@ */ #include "Python.h" -#include "hashtable.h" +#include "pycore_hashtable.h" #define HASHTABLE_MIN_SIZE 16 #define HASHTABLE_HIGH 0.50 @@ -58,25 +58,9 @@ ((_Py_hashtable_entry_t *)_Py_SLIST_HEAD(&(HT)->buckets[BUCKET])) #define ENTRY_NEXT(ENTRY) \ ((_Py_hashtable_entry_t *)_Py_SLIST_ITEM_NEXT(ENTRY)) -#define HASHTABLE_ITEM_SIZE(HT) \ - (sizeof(_Py_hashtable_entry_t) + (HT)->key_size + (HT)->data_size) - -#define ENTRY_READ_PDATA(TABLE, ENTRY, DATA_SIZE, PDATA) \ - do { \ - assert((DATA_SIZE) == (TABLE)->data_size); \ - memcpy((PDATA), _Py_HASHTABLE_ENTRY_PDATA(TABLE, (ENTRY)), \ - (DATA_SIZE)); \ - } while (0) - -#define ENTRY_WRITE_PDATA(TABLE, ENTRY, DATA_SIZE, PDATA) \ - do { \ - assert((DATA_SIZE) == (TABLE)->data_size); \ - memcpy((void *)_Py_HASHTABLE_ENTRY_PDATA((TABLE), (ENTRY)), \ - (PDATA), (DATA_SIZE)); \ - } while (0) /* Forward declaration */ -static void hashtable_rehash(_Py_hashtable_t *ht); +static int hashtable_rehash(_Py_hashtable_t *ht); static void _Py_slist_init(_Py_slist_t *list) @@ -105,21 +89,16 @@ _Py_slist_remove(_Py_slist_t *list, _Py_slist_item_t *previous, Py_uhash_t -_Py_hashtable_hash_ptr(struct _Py_hashtable_t *ht, const void *pkey) +_Py_hashtable_hash_ptr(const void *key) { - void *key; - - _Py_HASHTABLE_READ_KEY(ht, pkey, key); - return (Py_uhash_t)_Py_HashPointer(key); + return (Py_uhash_t)_Py_HashPointerRaw(key); } int -_Py_hashtable_compare_direct(_Py_hashtable_t *ht, const void *pkey, - const _Py_hashtable_entry_t *entry) +_Py_hashtable_compare_direct(const void *key1, const void *key2) { - const void *pkey2 = _Py_HASHTABLE_ENTRY_PKEY(entry); - return (memcmp(pkey, pkey2, ht->key_size) == 0); + return (key1 == key2); } @@ -137,350 +116,298 @@ round_size(size_t s) } -_Py_hashtable_t * -_Py_hashtable_new_full(size_t key_size, size_t data_size, - size_t init_size, - _Py_hashtable_hash_func hash_func, - _Py_hashtable_compare_func compare_func, - _Py_hashtable_allocator_t *allocator) -{ - _Py_hashtable_t *ht; - size_t buckets_size; - _Py_hashtable_allocator_t alloc; - - if (allocator == NULL) { - alloc.malloc = PyMem_RawMalloc; - alloc.free = PyMem_RawFree; - } - else - alloc = *allocator; - - ht = (_Py_hashtable_t *)alloc.malloc(sizeof(_Py_hashtable_t)); - if (ht == NULL) - return ht; - - ht->num_buckets = round_size(init_size); - ht->entries = 0; - ht->key_size = key_size; - ht->data_size = data_size; - - buckets_size = ht->num_buckets * sizeof(ht->buckets[0]); - ht->buckets = alloc.malloc(buckets_size); - if (ht->buckets == NULL) { - alloc.free(ht); - return NULL; - } - memset(ht->buckets, 0, buckets_size); - - ht->hash_func = hash_func; - ht->compare_func = compare_func; - ht->alloc = alloc; - return ht; -} - - -_Py_hashtable_t * -_Py_hashtable_new(size_t key_size, size_t data_size, - _Py_hashtable_hash_func hash_func, - _Py_hashtable_compare_func compare_func) -{ - return _Py_hashtable_new_full(key_size, data_size, - HASHTABLE_MIN_SIZE, - hash_func, compare_func, - NULL); -} - - size_t -_Py_hashtable_size(_Py_hashtable_t *ht) +_Py_hashtable_size(const _Py_hashtable_t *ht) { - size_t size; - - size = sizeof(_Py_hashtable_t); - + size_t size = sizeof(_Py_hashtable_t); /* buckets */ - size += ht->num_buckets * sizeof(_Py_hashtable_entry_t *); - + size += ht->nbuckets * sizeof(_Py_hashtable_entry_t *); /* entries */ - size += ht->entries * HASHTABLE_ITEM_SIZE(ht); - + size += ht->nentries * sizeof(_Py_hashtable_entry_t); return size; } -#ifdef Py_DEBUG -void -_Py_hashtable_print_stats(_Py_hashtable_t *ht) +_Py_hashtable_entry_t * +_Py_hashtable_get_entry_generic(_Py_hashtable_t *ht, const void *key) { - size_t size; - size_t chain_len, max_chain_len, total_chain_len, nchains; - _Py_hashtable_entry_t *entry; - size_t hv; - double load; - - size = _Py_hashtable_size(ht); - - load = (double)ht->entries / ht->num_buckets; - - max_chain_len = 0; - total_chain_len = 0; - nchains = 0; - for (hv = 0; hv < ht->num_buckets; hv++) { - entry = TABLE_HEAD(ht, hv); - if (entry != NULL) { - chain_len = 0; - for (; entry; entry = ENTRY_NEXT(entry)) { - chain_len++; - } - if (chain_len > max_chain_len) - max_chain_len = chain_len; - total_chain_len += chain_len; - nchains++; + Py_uhash_t key_hash = ht->hash_func(key); + size_t index = key_hash & (ht->nbuckets - 1); + _Py_hashtable_entry_t *entry = TABLE_HEAD(ht, index); + while (1) { + if (entry == NULL) { + return NULL; + } + if (entry->key_hash == key_hash && ht->compare_func(key, entry->key)) { + break; } + entry = ENTRY_NEXT(entry); } - printf("hash table %p: entries=%" - PY_FORMAT_SIZE_T "u/%" PY_FORMAT_SIZE_T "u (%.0f%%), ", - (void *)ht, ht->entries, ht->num_buckets, load * 100.0); - if (nchains) - printf("avg_chain_len=%.1f, ", (double)total_chain_len / nchains); - printf("max_chain_len=%" PY_FORMAT_SIZE_T "u, %" PY_FORMAT_SIZE_T "u KiB\n", - max_chain_len, size / 1024); + return entry; } -#endif -_Py_hashtable_entry_t * -_Py_hashtable_get_entry(_Py_hashtable_t *ht, - size_t key_size, const void *pkey) +// Specialized for: +// hash_func == _Py_hashtable_hash_ptr +// compare_func == _Py_hashtable_compare_direct +static _Py_hashtable_entry_t * +_Py_hashtable_get_entry_ptr(_Py_hashtable_t *ht, const void *key) { - Py_uhash_t key_hash; - size_t index; - _Py_hashtable_entry_t *entry; - - assert(key_size == ht->key_size); - - key_hash = ht->hash_func(ht, pkey); - index = key_hash & (ht->num_buckets - 1); - - for (entry = TABLE_HEAD(ht, index); entry != NULL; entry = ENTRY_NEXT(entry)) { - if (entry->key_hash == key_hash && ht->compare_func(ht, pkey, entry)) + Py_uhash_t key_hash = _Py_hashtable_hash_ptr(key); + size_t index = key_hash & (ht->nbuckets - 1); + _Py_hashtable_entry_t *entry = TABLE_HEAD(ht, index); + while (1) { + if (entry == NULL) { + return NULL; + } + // Compare directly keys (ignore entry->key_hash) + if (entry->key == key) { break; + } + entry = ENTRY_NEXT(entry); } - return entry; } -static int -_Py_hashtable_pop_entry(_Py_hashtable_t *ht, size_t key_size, const void *pkey, - void *data, size_t data_size) +void* +_Py_hashtable_steal(_Py_hashtable_t *ht, const void *key) { - Py_uhash_t key_hash; - size_t index; - _Py_hashtable_entry_t *entry, *previous; - - assert(key_size == ht->key_size); - - key_hash = ht->hash_func(ht, pkey); - index = key_hash & (ht->num_buckets - 1); - - previous = NULL; - for (entry = TABLE_HEAD(ht, index); entry != NULL; entry = ENTRY_NEXT(entry)) { - if (entry->key_hash == key_hash && ht->compare_func(ht, pkey, entry)) + Py_uhash_t key_hash = ht->hash_func(key); + size_t index = key_hash & (ht->nbuckets - 1); + + _Py_hashtable_entry_t *entry = TABLE_HEAD(ht, index); + _Py_hashtable_entry_t *previous = NULL; + while (1) { + if (entry == NULL) { + // not found + return NULL; + } + if (entry->key_hash == key_hash && ht->compare_func(key, entry->key)) { break; + } previous = entry; + entry = ENTRY_NEXT(entry); } - if (entry == NULL) - return 0; - _Py_slist_remove(&ht->buckets[index], (_Py_slist_item_t *)previous, (_Py_slist_item_t *)entry); - ht->entries--; + ht->nentries--; - if (data != NULL) - ENTRY_READ_PDATA(ht, entry, data_size, data); + void *value = entry->value; ht->alloc.free(entry); - if ((float)ht->entries / (float)ht->num_buckets < HASHTABLE_LOW) + if ((float)ht->nentries / (float)ht->nbuckets < HASHTABLE_LOW) { + // Ignore failure: error cannot be reported to the caller hashtable_rehash(ht); - return 1; + } + return value; } int -_Py_hashtable_set(_Py_hashtable_t *ht, size_t key_size, const void *pkey, - size_t data_size, const void *data) +_Py_hashtable_set(_Py_hashtable_t *ht, const void *key, void *value) { - Py_uhash_t key_hash; - size_t index; _Py_hashtable_entry_t *entry; - assert(key_size == ht->key_size); - - assert(data != NULL || data_size == 0); #ifndef NDEBUG /* Don't write the assertion on a single line because it is interesting to know the duplicated entry if the assertion failed. The entry can be read using a debugger. */ - entry = _Py_hashtable_get_entry(ht, key_size, pkey); + entry = ht->get_entry_func(ht, key); assert(entry == NULL); #endif - key_hash = ht->hash_func(ht, pkey); - index = key_hash & (ht->num_buckets - 1); - entry = ht->alloc.malloc(HASHTABLE_ITEM_SIZE(ht)); + entry = ht->alloc.malloc(sizeof(_Py_hashtable_entry_t)); if (entry == NULL) { /* memory allocation failed */ return -1; } - entry->key_hash = key_hash; - memcpy((void *)_Py_HASHTABLE_ENTRY_PKEY(entry), pkey, ht->key_size); - if (data) - ENTRY_WRITE_PDATA(ht, entry, data_size, data); + entry->key_hash = ht->hash_func(key); + entry->key = (void *)key; + entry->value = value; - _Py_slist_prepend(&ht->buckets[index], (_Py_slist_item_t*)entry); - ht->entries++; + ht->nentries++; + if ((float)ht->nentries / (float)ht->nbuckets > HASHTABLE_HIGH) { + if (hashtable_rehash(ht) < 0) { + ht->nentries--; + ht->alloc.free(entry); + return -1; + } + } - if ((float)ht->entries / (float)ht->num_buckets > HASHTABLE_HIGH) - hashtable_rehash(ht); + size_t index = entry->key_hash & (ht->nbuckets - 1); + _Py_slist_prepend(&ht->buckets[index], (_Py_slist_item_t*)entry); return 0; } -int -_Py_hashtable_get(_Py_hashtable_t *ht, size_t key_size,const void *pkey, - size_t data_size, void *data) +void* +_Py_hashtable_get(_Py_hashtable_t *ht, const void *key) { - _Py_hashtable_entry_t *entry; - - assert(data != NULL); - - entry = _Py_hashtable_get_entry(ht, key_size, pkey); - if (entry == NULL) - return 0; - ENTRY_READ_PDATA(ht, entry, data_size, data); - return 1; + _Py_hashtable_entry_t *entry = ht->get_entry_func(ht, key); + if (entry != NULL) { + return entry->value; + } + else { + return NULL; + } } int -_Py_hashtable_pop(_Py_hashtable_t *ht, size_t key_size, const void *pkey, - size_t data_size, void *data) +_Py_hashtable_foreach(_Py_hashtable_t *ht, + _Py_hashtable_foreach_func func, + void *user_data) { - assert(data != NULL); - return _Py_hashtable_pop_entry(ht, key_size, pkey, data, data_size); + for (size_t hv = 0; hv < ht->nbuckets; hv++) { + _Py_hashtable_entry_t *entry = TABLE_HEAD(ht, hv); + while (entry != NULL) { + int res = func(ht, entry->key, entry->value, user_data); + if (res) { + return res; + } + entry = ENTRY_NEXT(entry); + } + } + return 0; } -/* Code commented since the function is not needed in Python */ -#if 0 -void -_Py_hashtable_delete(_Py_hashtable_t *ht, size_t key_size, const void *pkey) +static int +hashtable_rehash(_Py_hashtable_t *ht) { -#ifndef NDEBUG - int found = _Py_hashtable_pop_entry(ht, key_size, pkey, NULL, 0); - assert(found); -#else - (void)_Py_hashtable_pop_entry(ht, key_size, pkey, NULL, 0); -#endif -} -#endif + size_t new_size = round_size((size_t)(ht->nentries * HASHTABLE_REHASH_FACTOR)); + if (new_size == ht->nbuckets) { + return 0; + } + size_t buckets_size = new_size * sizeof(ht->buckets[0]); + _Py_slist_t *new_buckets = ht->alloc.malloc(buckets_size); + if (new_buckets == NULL) { + /* memory allocation failed */ + return -1; + } + memset(new_buckets, 0, buckets_size); -int -_Py_hashtable_foreach(_Py_hashtable_t *ht, - _Py_hashtable_foreach_func func, - void *arg) -{ - _Py_hashtable_entry_t *entry; - size_t hv; + for (size_t bucket = 0; bucket < ht->nbuckets; bucket++) { + _Py_hashtable_entry_t *entry = BUCKETS_HEAD(ht->buckets[bucket]); + while (entry != NULL) { + assert(ht->hash_func(entry->key) == entry->key_hash); + _Py_hashtable_entry_t *next = ENTRY_NEXT(entry); + size_t entry_index = entry->key_hash & (new_size - 1); - for (hv = 0; hv < ht->num_buckets; hv++) { - for (entry = TABLE_HEAD(ht, hv); entry; entry = ENTRY_NEXT(entry)) { - int res = func(ht, entry, arg); - if (res) - return res; + _Py_slist_prepend(&new_buckets[entry_index], (_Py_slist_item_t*)entry); + + entry = next; } } + + ht->alloc.free(ht->buckets); + ht->nbuckets = new_size; + ht->buckets = new_buckets; return 0; } -static void -hashtable_rehash(_Py_hashtable_t *ht) +_Py_hashtable_t * +_Py_hashtable_new_full(_Py_hashtable_hash_func hash_func, + _Py_hashtable_compare_func compare_func, + _Py_hashtable_destroy_func key_destroy_func, + _Py_hashtable_destroy_func value_destroy_func, + _Py_hashtable_allocator_t *allocator) { - size_t buckets_size, new_size, bucket; - _Py_slist_t *old_buckets = NULL; - size_t old_num_buckets; + _Py_hashtable_allocator_t alloc; + if (allocator == NULL) { + alloc.malloc = PyMem_Malloc; + alloc.free = PyMem_Free; + } + else { + alloc = *allocator; + } - new_size = round_size((size_t)(ht->entries * HASHTABLE_REHASH_FACTOR)); - if (new_size == ht->num_buckets) - return; + _Py_hashtable_t *ht = (_Py_hashtable_t *)alloc.malloc(sizeof(_Py_hashtable_t)); + if (ht == NULL) { + return ht; + } - old_num_buckets = ht->num_buckets; + ht->nbuckets = HASHTABLE_MIN_SIZE; + ht->nentries = 0; - buckets_size = new_size * sizeof(ht->buckets[0]); - old_buckets = ht->buckets; - ht->buckets = ht->alloc.malloc(buckets_size); + size_t buckets_size = ht->nbuckets * sizeof(ht->buckets[0]); + ht->buckets = alloc.malloc(buckets_size); if (ht->buckets == NULL) { - /* cancel rehash on memory allocation failure */ - ht->buckets = old_buckets ; - /* memory allocation failed */ - return; + alloc.free(ht); + return NULL; } memset(ht->buckets, 0, buckets_size); - ht->num_buckets = new_size; + ht->get_entry_func = _Py_hashtable_get_entry_generic; + ht->hash_func = hash_func; + ht->compare_func = compare_func; + ht->key_destroy_func = key_destroy_func; + ht->value_destroy_func = value_destroy_func; + ht->alloc = alloc; + if (ht->hash_func == _Py_hashtable_hash_ptr + && ht->compare_func == _Py_hashtable_compare_direct) + { + ht->get_entry_func = _Py_hashtable_get_entry_ptr; + } + return ht; +} - for (bucket = 0; bucket < old_num_buckets; bucket++) { - _Py_hashtable_entry_t *entry, *next; - for (entry = BUCKETS_HEAD(old_buckets[bucket]); entry != NULL; entry = next) { - size_t entry_index; +_Py_hashtable_t * +_Py_hashtable_new(_Py_hashtable_hash_func hash_func, + _Py_hashtable_compare_func compare_func) +{ + return _Py_hashtable_new_full(hash_func, compare_func, + NULL, NULL, NULL); +} - assert(ht->hash_func(ht, _Py_HASHTABLE_ENTRY_PKEY(entry)) == entry->key_hash); - next = ENTRY_NEXT(entry); - entry_index = entry->key_hash & (new_size - 1); - _Py_slist_prepend(&ht->buckets[entry_index], (_Py_slist_item_t*)entry); - } +static void +_Py_hashtable_destroy_entry(_Py_hashtable_t *ht, _Py_hashtable_entry_t *entry) +{ + if (ht->key_destroy_func) { + ht->key_destroy_func(entry->key); } - - ht->alloc.free(old_buckets); + if (ht->value_destroy_func) { + ht->value_destroy_func(entry->value); + } + ht->alloc.free(entry); } void _Py_hashtable_clear(_Py_hashtable_t *ht) { - _Py_hashtable_entry_t *entry, *next; - size_t i; - - for (i=0; i < ht->num_buckets; i++) { - for (entry = TABLE_HEAD(ht, i); entry != NULL; entry = next) { - next = ENTRY_NEXT(entry); - ht->alloc.free(entry); + for (size_t i=0; i < ht->nbuckets; i++) { + _Py_hashtable_entry_t *entry = TABLE_HEAD(ht, i); + while (entry != NULL) { + _Py_hashtable_entry_t *next = ENTRY_NEXT(entry); + _Py_hashtable_destroy_entry(ht, entry); + entry = next; } _Py_slist_init(&ht->buckets[i]); } - ht->entries = 0; - hashtable_rehash(ht); + ht->nentries = 0; + // Ignore failure: clear function is not expected to fail + // because of a memory allocation failure. + (void)hashtable_rehash(ht); } void _Py_hashtable_destroy(_Py_hashtable_t *ht) { - size_t i; - - for (i = 0; i < ht->num_buckets; i++) { - _Py_slist_item_t *entry = ht->buckets[i].head; + for (size_t i = 0; i < ht->nbuckets; i++) { + _Py_hashtable_entry_t *entry = TABLE_HEAD(ht, i); while (entry) { - _Py_slist_item_t *entry_next = entry->next; - ht->alloc.free(entry); + _Py_hashtable_entry_t *entry_next = ENTRY_NEXT(entry); + _Py_hashtable_destroy_entry(ht, entry); entry = entry_next; } } @@ -488,37 +415,3 @@ _Py_hashtable_destroy(_Py_hashtable_t *ht) ht->alloc.free(ht->buckets); ht->alloc.free(ht); } - - -_Py_hashtable_t * -_Py_hashtable_copy(_Py_hashtable_t *src) -{ - const size_t key_size = src->key_size; - const size_t data_size = src->data_size; - _Py_hashtable_t *dst; - _Py_hashtable_entry_t *entry; - size_t bucket; - int err; - - dst = _Py_hashtable_new_full(key_size, data_size, - src->num_buckets, - src->hash_func, - src->compare_func, - &src->alloc); - if (dst == NULL) - return NULL; - - for (bucket=0; bucket < src->num_buckets; bucket++) { - entry = TABLE_HEAD(src, bucket); - for (; entry; entry = ENTRY_NEXT(entry)) { - const void *pkey = _Py_HASHTABLE_ENTRY_PKEY(entry); - const void *pdata = _Py_HASHTABLE_ENTRY_PDATA(src, entry); - err = _Py_hashtable_set(dst, key_size, pkey, data_size, pdata); - if (err) { - _Py_hashtable_destroy(dst); - return NULL; - } - } - } - return dst; -} diff --git a/Python/import.c b/Python/import.c index b73fe2f93e26c293188f8d56289e1bad47e2683d..5e39a2fb9a02e587fcdaf21d3d61feda105be67d 100644 --- a/Python/import.c +++ b/Python/import.c @@ -4,15 +4,17 @@ #include "Python-ast.h" #undef Yield /* undefine macro conflicting with */ +#include "pycore_initconfig.h" +#include "pycore_pyerrors.h" #include "pycore_pyhash.h" #include "pycore_pylifecycle.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" +#include "pycore_pymem.h" // _PyMem_SetDefaultAllocator() +#include "pycore_interp.h" // _PyInterpreterState_ClearModules() +#include "pycore_pystate.h" // _PyInterpreterState_GET() +#include "pycore_sysmodule.h" #include "errcode.h" #include "marshal.h" #include "code.h" -#include "frameobject.h" -#include "osdefs.h" #include "importdl.h" #include "pydtrace.h" @@ -25,6 +27,9 @@ extern "C" { #define CACHEDIR "__pycache__" +/* Forward references */ +static PyObject *import_add_module(PyThreadState *tstate, PyObject *name); + /* See _PyImport_FixupExtensionObject() below */ static PyObject *extensions = NULL; @@ -34,6 +39,9 @@ extern struct _inittab _PyImport_Inittab[]; struct _inittab *PyImport_Inittab = _PyImport_Inittab; static struct _inittab *inittab_copy = NULL; +_Py_IDENTIFIER(__path__); +_Py_IDENTIFIER(__spec__); + /*[clinic input] module _imp [clinic start generated code]*/ @@ -44,17 +52,7 @@ module _imp /* Initialize things */ PyStatus -_PyImport_Init(PyInterpreterState *interp) -{ - interp->builtins_copy = PyDict_Copy(interp->builtins); - if (interp->builtins_copy == NULL) { - return _PyStatus_ERR("Can't backup builtins dict"); - } - return _PyStatus_OK(); -} - -PyStatus -_PyImportHooks_Init(void) +_PyImportHooks_Init(PyThreadState *tstate) { PyObject *v, *path_hooks = NULL; int err = 0; @@ -85,31 +83,32 @@ _PyImportHooks_Init(void) return _PyStatus_OK(); error: - PyErr_Print(); + _PyErr_Print(tstate); return _PyStatus_ERR("initializing sys.meta_path, sys.path_hooks, " "or path_importer_cache failed"); } PyStatus -_PyImportZip_Init(PyInterpreterState *interp) +_PyImportZip_Init(PyThreadState *tstate) { PyObject *path_hooks, *zipimport; int err = 0; path_hooks = PySys_GetObject("path_hooks"); if (path_hooks == NULL) { - PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path_hooks"); + _PyErr_SetString(tstate, PyExc_RuntimeError, + "unable to get sys.path_hooks"); goto error; } - int verbose = interp->config.verbose; + int verbose = _PyInterpreterState_GetConfig(tstate->interp)->verbose; if (verbose) { PySys_WriteStderr("# installing zipimport hook\n"); } zipimport = PyImport_ImportModule("zipimport"); if (zipimport == NULL) { - PyErr_Clear(); /* No zip import module -- okay */ + _PyErr_Clear(tstate); /* No zip import module -- okay */ if (verbose) { PySys_WriteStderr("# can't import zipimport\n"); } @@ -120,7 +119,7 @@ _PyImportZip_Init(PyInterpreterState *interp) &PyId_zipimporter); Py_DECREF(zipimport); if (zipimporter == NULL) { - PyErr_Clear(); /* No zipimporter object -- okay */ + _PyErr_Clear(tstate); /* No zipimporter object -- okay */ if (verbose) { PySys_WriteStderr("# can't import zipimport.zipimporter\n"); } @@ -149,8 +148,6 @@ _PyImportZip_Init(PyInterpreterState *interp) in different threads to return with a partially loaded module. These calls are serialized by the global interpreter lock. */ -#include "pythread.h" - static PyThread_type_lock import_lock = 0; static unsigned long import_lock_thread = PYTHREAD_INVALID_THREAD_ID; static int import_lock_level = 0; @@ -199,6 +196,7 @@ _PyImport_ReleaseLock(void) return 1; } +#ifdef HAVE_FORK /* This function is called from PyOS_AfterFork_Child to ensure that newly created child processes do not share locks with the parent. We now acquire the import lock around fork() calls but on some platforms @@ -208,9 +206,8 @@ void _PyImport_ReInitLock(void) { if (import_lock != NULL) { - import_lock = PyThread_allocate_lock(); - if (import_lock == NULL) { - Py_FatalError("PyImport_ReInitLock failed to create a new lock"); + if (_PyThread_at_fork_reinit(&import_lock) < 0) { + _Py_FatalErrorFunc(__func__, "failed to create a new lock"); } } if (import_lock_level > 1) { @@ -228,6 +225,7 @@ _PyImport_ReInitLock(void) import_lock_level = 0; } } +#endif /*[clinic input] _imp.lock_held @@ -310,9 +308,9 @@ _PyImport_Fini2(void) PyObject * PyImport_GetModuleDict(void) { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); + PyInterpreterState *interp = _PyInterpreterState_GET(); if (interp->modules == NULL) { - Py_FatalError("PyImport_GetModuleDict: no module dictionary!"); + Py_FatalError("interpreter has no modules dictionary"); } return interp->modules; } @@ -342,26 +340,30 @@ _PyImport_GetModuleId(struct _Py_Identifier *nameid) int _PyImport_SetModule(PyObject *name, PyObject *m) { - PyObject *modules = PyImport_GetModuleDict(); + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *modules = tstate->interp->modules; return PyObject_SetItem(modules, name, m); } int _PyImport_SetModuleString(const char *name, PyObject *m) { - PyObject *modules = PyImport_GetModuleDict(); + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *modules = tstate->interp->modules; return PyMapping_SetItemString(modules, name, m); } -PyObject * -PyImport_GetModule(PyObject *name) +static PyObject * +import_get_module(PyThreadState *tstate, PyObject *name) { - PyObject *m; - PyObject *modules = PyImport_GetModuleDict(); + PyObject *modules = tstate->interp->modules; if (modules == NULL) { - PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules"); + _PyErr_SetString(tstate, PyExc_RuntimeError, + "unable to get sys.modules"); return NULL; } + + PyObject *m; Py_INCREF(modules); if (PyDict_CheckExact(modules)) { m = PyDict_GetItemWithError(modules, name); /* borrowed */ @@ -369,8 +371,8 @@ PyImport_GetModule(PyObject *name) } else { m = PyObject_GetItem(modules, name); - if (m == NULL && PyErr_ExceptionMatches(PyExc_KeyError)) { - PyErr_Clear(); + if (m == NULL && _PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { + _PyErr_Clear(tstate); } } Py_DECREF(modules); @@ -378,6 +380,35 @@ PyImport_GetModule(PyObject *name) } +static int +import_ensure_initialized(PyThreadState *tstate, PyObject *mod, PyObject *name) +{ + PyInterpreterState *interp = tstate->interp; + PyObject *spec; + + _Py_IDENTIFIER(_lock_unlock_module); + + /* Optimization: only call _bootstrap._lock_unlock_module() if + __spec__._initializing is true. + NOTE: because of this, initializing must be set *before* + stuffing the new module in sys.modules. + */ + spec = _PyObject_GetAttrId(mod, &PyId___spec__); + int busy = _PyModuleSpec_IsInitializing(spec); + Py_XDECREF(spec); + if (busy) { + /* Wait until module is done importing. */ + PyObject *value = _PyObject_CallMethodIdOneArg( + interp->importlib, &PyId__lock_unlock_module, name); + if (value == NULL) { + return -1; + } + Py_DECREF(value); + } + return 0; +} + + /* List of names to clear in sys */ static const char * const sys_deletes[] = { "path", "argv", "ps1", "ps2", @@ -397,17 +428,14 @@ static const char * const sys_files[] = { /* Un-initialize things, as good as we can */ void -PyImport_Cleanup(void) +_PyImport_Cleanup(PyThreadState *tstate) { - Py_ssize_t pos; - PyObject *key, *value, *dict; - PyInterpreterState *interp = _PyInterpreterState_Get(); - PyObject *modules = PyImport_GetModuleDict(); - PyObject *weaklist = NULL; - const char * const *p; - - if (modules == NULL) - return; /* Already done */ + PyInterpreterState *interp = tstate->interp; + PyObject *modules = interp->modules; + if (modules == NULL) { + /* Already done */ + return; + } /* Delete some special variables first. These are common places where user values hide and people complain when their @@ -417,7 +445,7 @@ PyImport_Cleanup(void) /* XXX Perhaps these precautions are obsolete. Who knows? */ - int verbose = interp->config.verbose; + int verbose = _PyInterpreterState_GetConfig(interp)->verbose; if (verbose) { PySys_WriteStderr("# clear builtins._\n"); } @@ -425,6 +453,7 @@ PyImport_Cleanup(void) PyErr_WriteUnraisable(NULL); } + const char * const *p; for (p = sys_deletes; *p != NULL; p++) { if (verbose) { PySys_WriteStderr("# clear sys.%s\n", *p); @@ -437,9 +466,10 @@ PyImport_Cleanup(void) if (verbose) { PySys_WriteStderr("# restore sys.%s\n", *p); } - value = _PyDict_GetItemStringWithError(interp->sysdict, *(p+1)); + PyObject *value = _PyDict_GetItemStringWithError(interp->sysdict, + *(p+1)); if (value == NULL) { - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { PyErr_WriteUnraisable(NULL); } value = Py_None; @@ -453,7 +483,7 @@ PyImport_Cleanup(void) modules when they are removed from sys.modules. The name is used for diagnosis messages (in verbose mode), while the weakref helps detect those modules which have been held alive. */ - weaklist = PyList_New(0); + PyObject *weaklist = PyList_New(0); if (weaklist == NULL) { PyErr_WriteUnraisable(NULL); } @@ -487,7 +517,8 @@ PyImport_Cleanup(void) /* Remove all modules from sys.modules, hoping that garbage collection can reclaim most of them. */ if (PyDict_CheckExact(modules)) { - pos = 0; + Py_ssize_t pos = 0; + PyObject *key, *value; while (PyDict_Next(modules, &pos, &key, &value)) { CLEAR_MODULE(key, value); } @@ -498,8 +529,9 @@ PyImport_Cleanup(void) PyErr_WriteUnraisable(NULL); } else { + PyObject *key; while ((key = PyIter_Next(iterator))) { - value = PyObject_GetItem(modules, key); + PyObject *value = PyObject_GetItem(modules, key); if (value == NULL) { PyErr_WriteUnraisable(NULL); continue; @@ -521,28 +553,26 @@ PyImport_Cleanup(void) } else { _Py_IDENTIFIER(clear); - if (_PyObject_CallMethodId(modules, &PyId_clear, "") == NULL) { + if (_PyObject_CallMethodIdNoArgs(modules, &PyId_clear) == NULL) { PyErr_WriteUnraisable(NULL); } } /* Restore the original builtins dict, to ensure that any user data gets cleared. */ - dict = PyDict_Copy(interp->builtins); + PyObject *dict = PyDict_Copy(interp->builtins); if (dict == NULL) { PyErr_WriteUnraisable(NULL); } PyDict_Clear(interp->builtins); if (PyDict_Update(interp->builtins, interp->builtins_copy)) { - PyErr_Clear(); + _PyErr_Clear(tstate); } Py_XDECREF(dict); - /* Clear module dict copies stored in the interpreter state */ - _PyState_ClearModules(); /* Collect references */ _PyGC_CollectNoFail(); /* Dump GC stats before it's too late, since it uses the warnings machinery. */ - _PyGC_DumpShutdownStats(&_PyRuntime); + _PyGC_DumpShutdownStats(tstate); /* Now, if there are any modules left alive, clear their globals to minimize potential leaks. All C extension modules actually end @@ -589,6 +619,9 @@ PyImport_Cleanup(void) } _PyModule_ClearDict(interp->builtins); + /* Clear module dict copies stored in the interpreter state */ + _PyInterpreterState_ClearModules(interp); + /* Clear and delete the modules directory. Actual modules will still be there only if imported during the execution of some destructor. */ @@ -609,7 +642,7 @@ long PyImport_GetMagicNumber(void) { long res; - PyInterpreterState *interp = _PyInterpreterState_Get(); + PyInterpreterState *interp = _PyInterpreterState_GET(); PyObject *external, *pyc_magic; external = PyObject_GetAttrString(interp->importlib, "_bootstrap_external"); @@ -652,52 +685,64 @@ PyImport_GetMagicTag(void) int _PyImport_FixupExtensionObject(PyObject *mod, PyObject *name, - PyObject *filename, PyObject *modules) + PyObject *filename, PyObject *modules) { - PyObject *dict, *key; - struct PyModuleDef *def; - int res; - if (extensions == NULL) { - extensions = PyDict_New(); - if (extensions == NULL) - return -1; - } if (mod == NULL || !PyModule_Check(mod)) { PyErr_BadInternalCall(); return -1; } - def = PyModule_GetDef(mod); + + struct PyModuleDef *def = PyModule_GetDef(mod); if (!def) { PyErr_BadInternalCall(); return -1; } - if (PyObject_SetItem(modules, name, mod) < 0) + + PyThreadState *tstate = _PyThreadState_GET(); + if (PyObject_SetItem(modules, name, mod) < 0) { return -1; - if (_PyState_AddModule(mod, def) < 0) { + } + if (_PyState_AddModule(tstate, mod, def) < 0) { PyMapping_DelItem(modules, name); return -1; } - if (def->m_size == -1) { - if (def->m_base.m_copy) { - /* Somebody already imported the module, - likely under a different name. - XXX this should really not happen. */ - Py_CLEAR(def->m_base.m_copy); + + if (_Py_IsMainInterpreter(tstate)) { + if (def->m_size == -1) { + if (def->m_base.m_copy) { + /* Somebody already imported the module, + likely under a different name. + XXX this should really not happen. */ + Py_CLEAR(def->m_base.m_copy); + } + PyObject *dict = PyModule_GetDict(mod); + if (dict == NULL) { + return -1; + } + def->m_base.m_copy = PyDict_Copy(dict); + if (def->m_base.m_copy == NULL) { + return -1; + } + } + + if (extensions == NULL) { + extensions = PyDict_New(); + if (extensions == NULL) { + return -1; + } } - dict = PyModule_GetDict(mod); - if (dict == NULL) + + PyObject *key = PyTuple_Pack(2, filename, name); + if (key == NULL) { return -1; - def->m_base.m_copy = PyDict_Copy(dict); - if (def->m_base.m_copy == NULL) + } + int res = PyDict_SetItem(extensions, key, (PyObject *)def); + Py_DECREF(key); + if (res < 0) { return -1; + } } - key = PyTuple_Pack(2, filename, name); - if (key == NULL) - return -1; - res = PyDict_SetItem(extensions, key, (PyObject *)def); - Py_DECREF(key); - if (res < 0) - return -1; + return 0; } @@ -714,33 +759,32 @@ _PyImport_FixupBuiltin(PyObject *mod, const char *name, PyObject *modules) return res; } -PyObject * -_PyImport_FindExtensionObject(PyObject *name, PyObject *filename) -{ - PyObject *modules = PyImport_GetModuleDict(); - return _PyImport_FindExtensionObjectEx(name, filename, modules); -} - -PyObject * -_PyImport_FindExtensionObjectEx(PyObject *name, PyObject *filename, - PyObject *modules) +static PyObject * +import_find_extension(PyThreadState *tstate, PyObject *name, + PyObject *filename) { - PyObject *mod, *mdict, *key; - PyModuleDef* def; - if (extensions == NULL) + if (extensions == NULL) { return NULL; - key = PyTuple_Pack(2, filename, name); - if (key == NULL) + } + + PyObject *key = PyTuple_Pack(2, filename, name); + if (key == NULL) { return NULL; - def = (PyModuleDef *)PyDict_GetItemWithError(extensions, key); + } + PyModuleDef* def = (PyModuleDef *)PyDict_GetItemWithError(extensions, key); Py_DECREF(key); - if (def == NULL) + if (def == NULL) { return NULL; + } + + PyObject *mod, *mdict; + PyObject *modules = tstate->interp->modules; + if (def->m_size == -1) { /* Module does not support repeated initialization */ if (def->m_base.m_copy == NULL) return NULL; - mod = _PyImport_AddModuleObject(name, modules); + mod = import_add_module(tstate, name); if (mod == NULL) return NULL; mdict = PyModule_GetDict(mod); @@ -761,27 +805,35 @@ _PyImport_FindExtensionObjectEx(PyObject *name, PyObject *filename, } Py_DECREF(mod); } - if (_PyState_AddModule(mod, def) < 0) { + if (_PyState_AddModule(tstate, mod, def) < 0) { PyMapping_DelItem(modules, name); return NULL; } - int verbose = _PyInterpreterState_Get()->config.verbose; + + int verbose = _PyInterpreterState_GetConfig(tstate->interp)->verbose; if (verbose) { PySys_FormatStderr("import %U # previously loaded (%R)\n", name, filename); } return mod; +} +PyObject * +_PyImport_FindExtensionObject(PyObject *name, PyObject *filename) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return import_find_extension(tstate, name, filename); } + PyObject * -_PyImport_FindBuiltin(const char *name, PyObject *modules) +_PyImport_FindBuiltin(PyThreadState *tstate, const char *name) { PyObject *res, *nameobj; nameobj = PyUnicode_InternFromString(name); if (nameobj == NULL) return NULL; - res = _PyImport_FindExtensionObjectEx(nameobj, nameobj, modules); + res = import_find_extension(tstate, nameobj, nameobj); Py_DECREF(nameobj); return res; } @@ -792,29 +844,29 @@ _PyImport_FindBuiltin(const char *name, PyObject *modules) Because the former action is most common, THIS DOES NOT RETURN A 'NEW' REFERENCE! */ -PyObject * -PyImport_AddModuleObject(PyObject *name) +static PyObject * +import_add_module(PyThreadState *tstate, PyObject *name) { - PyObject *modules = PyImport_GetModuleDict(); - return _PyImport_AddModuleObject(name, modules); -} + PyObject *modules = tstate->interp->modules; + if (modules == NULL) { + _PyErr_SetString(tstate, PyExc_RuntimeError, + "no import module dictionary"); + return NULL; + } -PyObject * -_PyImport_AddModuleObject(PyObject *name, PyObject *modules) -{ PyObject *m; if (PyDict_CheckExact(modules)) { m = PyDict_GetItemWithError(modules, name); } else { m = PyObject_GetItem(modules, name); - // For backward-comaptibility we copy the behavior + // For backward-compatibility we copy the behavior // of PyDict_GetItemWithError(). - if (PyErr_ExceptionMatches(PyExc_KeyError)) { - PyErr_Clear(); + if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { + _PyErr_Clear(tstate); } } - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { return NULL; } if (m != NULL && PyModule_Check(m)) { @@ -832,35 +884,50 @@ _PyImport_AddModuleObject(PyObject *name, PyObject *modules) return m; } +PyObject * +PyImport_AddModuleObject(PyObject *name) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return import_add_module(tstate, name); +} + + PyObject * PyImport_AddModule(const char *name) { - PyObject *nameobj, *module; - nameobj = PyUnicode_FromString(name); - if (nameobj == NULL) + PyObject *nameobj = PyUnicode_FromString(name); + if (nameobj == NULL) { return NULL; - module = PyImport_AddModuleObject(nameobj); + } + PyObject *module = PyImport_AddModuleObject(nameobj); Py_DECREF(nameobj); return module; } -/* Remove name from sys.modules, if it's there. */ +/* Remove name from sys.modules, if it's there. + * Can be called with an exception raised. + * If fail to remove name a new exception will be chained with the old + * exception, otherwise the old exception is preserved. + */ static void -remove_module(PyObject *name) +remove_module(PyThreadState *tstate, PyObject *name) { PyObject *type, *value, *traceback; - PyErr_Fetch(&type, &value, &traceback); - PyObject *modules = PyImport_GetModuleDict(); - if (!PyMapping_HasKey(modules, name)) { - goto out; + _PyErr_Fetch(tstate, &type, &value, &traceback); + + PyObject *modules = tstate->interp->modules; + if (PyDict_CheckExact(modules)) { + PyObject *mod = _PyDict_Pop(modules, name, Py_None); + Py_XDECREF(mod); } - if (PyMapping_DelItem(modules, name) < 0) { - Py_FatalError("import: deleting existing key in " - "sys.modules failed"); + else if (PyMapping_DelItem(modules, name) < 0) { + if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { + _PyErr_Clear(tstate); + } } -out: - PyErr_Restore(type, value, traceback); + + _PyErr_ChainExceptions(type, value, traceback); } @@ -914,20 +981,18 @@ PyImport_ExecCodeModuleWithPathnames(const char *name, PyObject *co, goto error; } else if (cpathobj != NULL) { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); + PyInterpreterState *interp = _PyInterpreterState_GET(); _Py_IDENTIFIER(_get_sourcefile); if (interp == NULL) { - Py_FatalError("PyImport_ExecCodeModuleWithPathnames: " - "no interpreter!"); + Py_FatalError("no current interpreter"); } external= PyObject_GetAttrString(interp->importlib, "_bootstrap_external"); if (external != NULL) { - pathobj = _PyObject_CallMethodIdObjArgs(external, - &PyId__get_sourcefile, cpathobj, - NULL); + pathobj = _PyObject_CallMethodIdOneArg( + external, &PyId__get_sourcefile, cpathobj); Py_DECREF(external); } if (pathobj == NULL) @@ -945,23 +1010,23 @@ PyImport_ExecCodeModuleWithPathnames(const char *name, PyObject *co, } static PyObject * -module_dict_for_exec(PyObject *name) +module_dict_for_exec(PyThreadState *tstate, PyObject *name) { _Py_IDENTIFIER(__builtins__); PyObject *m, *d = NULL; - m = PyImport_AddModuleObject(name); + m = import_add_module(tstate, name); if (m == NULL) return NULL; /* If the module is being reloaded, we get the old module back and re-use its dict to exec the new code. */ d = PyModule_GetDict(m); if (_PyDict_GetItemIdWithError(d, &PyId___builtins__) == NULL) { - if (PyErr_Occurred() || + if (_PyErr_Occurred(tstate) || _PyDict_SetItemId(d, &PyId___builtins__, PyEval_GetBuiltins()) != 0) { - remove_module(name); + remove_module(tstate, name); return NULL; } } @@ -970,22 +1035,23 @@ module_dict_for_exec(PyObject *name) } static PyObject * -exec_code_in_module(PyObject *name, PyObject *module_dict, PyObject *code_object) +exec_code_in_module(PyThreadState *tstate, PyObject *name, + PyObject *module_dict, PyObject *code_object) { PyObject *v, *m; v = PyEval_EvalCode(code_object, module_dict, module_dict); if (v == NULL) { - remove_module(name); + remove_module(tstate, name); return NULL; } Py_DECREF(v); - m = PyImport_GetModule(name); - if (m == NULL && !PyErr_Occurred()) { - PyErr_Format(PyExc_ImportError, - "Loaded module %R not found in sys.modules", - name); + m = import_get_module(tstate, name); + if (m == NULL && !_PyErr_Occurred(tstate)) { + _PyErr_Format(tstate, PyExc_ImportError, + "Loaded module %R not found in sys.modules", + name); } return m; @@ -995,11 +1061,11 @@ PyObject* PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, PyObject *cpathname) { + PyThreadState *tstate = _PyThreadState_GET(); PyObject *d, *external, *res; - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); _Py_IDENTIFIER(_fix_up_module); - d = module_dict_for_exec(name); + d = module_dict_for_exec(tstate, name); if (d == NULL) { return NULL; } @@ -1007,7 +1073,8 @@ PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, if (pathname == NULL) { pathname = ((PyCodeObject *)co)->co_filename; } - external = PyObject_GetAttrString(interp->importlib, "_bootstrap_external"); + external = PyObject_GetAttrString(tstate->interp->importlib, + "_bootstrap_external"); if (external == NULL) return NULL; res = _PyObject_CallMethodIdObjArgs(external, @@ -1016,7 +1083,7 @@ PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, Py_DECREF(external); if (res != NULL) { Py_DECREF(res); - res = exec_code_in_module(name, d, co); + res = exec_code_in_module(tstate, name, d, co); } return res; } @@ -1115,8 +1182,8 @@ is_builtin(PyObject *name) Returns a borrowed reference. */ static PyObject * -get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks, - PyObject *p) +get_path_importer(PyThreadState *tstate, PyObject *path_importer_cache, + PyObject *path_hooks, PyObject *p) { PyObject *importer; Py_ssize_t j, nhooks; @@ -1130,7 +1197,7 @@ get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks, return NULL; /* Shouldn't happen */ importer = PyDict_GetItemWithError(path_importer_cache, p); - if (importer != NULL || PyErr_Occurred()) + if (importer != NULL || _PyErr_Occurred(tstate)) return importer; /* set path_importer_cache[p] to None to avoid recursion */ @@ -1141,14 +1208,14 @@ get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks, PyObject *hook = PyList_GetItem(path_hooks, j); if (hook == NULL) return NULL; - importer = PyObject_CallFunctionObjArgs(hook, p, NULL); + importer = PyObject_CallOneArg(hook, p); if (importer != NULL) break; - if (!PyErr_ExceptionMatches(PyExc_ImportError)) { + if (!_PyErr_ExceptionMatches(tstate, PyExc_ImportError)) { return NULL; } - PyErr_Clear(); + _PyErr_Clear(tstate); } if (importer == NULL) { return Py_None; @@ -1163,13 +1230,15 @@ get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks, } PyObject * -PyImport_GetImporter(PyObject *path) { +PyImport_GetImporter(PyObject *path) +{ + PyThreadState *tstate = _PyThreadState_GET(); PyObject *importer=NULL, *path_importer_cache=NULL, *path_hooks=NULL; path_importer_cache = PySys_GetObject("path_importer_cache"); path_hooks = PySys_GetObject("path_hooks"); if (path_importer_cache != NULL && path_hooks != NULL) { - importer = get_path_importer(path_importer_cache, + importer = get_path_importer(tstate, path_importer_cache, path_hooks, path); } Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */ @@ -1189,6 +1258,7 @@ static PyObject * _imp_create_builtin(PyObject *module, PyObject *spec) /*[clinic end generated code: output=ace7ff22271e6f39 input=37f966f890384e47]*/ { + PyThreadState *tstate = _PyThreadState_GET(); struct _inittab *p; PyObject *name; const char *namestr; @@ -1200,7 +1270,7 @@ _imp_create_builtin(PyObject *module, PyObject *spec) } mod = _PyImport_FindExtensionObject(name, name); - if (mod || PyErr_Occurred()) { + if (mod || _PyErr_Occurred(tstate)) { Py_DECREF(name); Py_XINCREF(mod); return mod; @@ -1212,7 +1282,7 @@ _imp_create_builtin(PyObject *module, PyObject *spec) return NULL; } - PyObject *modules = NULL; + PyObject *modules = tstate->interp->modules; for (p = PyImport_Inittab; p->name != NULL; p++) { PyModuleDef *def; if (_PyUnicode_EqualToASCIIString(name, p->name)) { @@ -1238,9 +1308,6 @@ _imp_create_builtin(PyObject *module, PyObject *spec) return NULL; } def->m_base.m_init = p->initfunc; - if (modules == NULL) { - modules = PyImport_GetModuleDict(); - } if (_PyImport_FixupExtensionObject(mod, name, name, modules) < 0) { Py_DECREF(name); @@ -1329,6 +1396,7 @@ is_frozen_package(PyObject *name) int PyImport_ImportFrozenModuleObject(PyObject *name) { + PyThreadState *tstate = _PyThreadState_GET(); const struct _frozen *p; PyObject *co, *m, *d; int ispackage; @@ -1339,9 +1407,9 @@ PyImport_ImportFrozenModuleObject(PyObject *name) if (p == NULL) return 0; if (p->code == NULL) { - PyErr_Format(PyExc_ImportError, - "Excluded frozen object named %R", - name); + _PyErr_Format(tstate, PyExc_ImportError, + "Excluded frozen object named %R", + name); return -1; } size = p->size; @@ -1352,16 +1420,16 @@ PyImport_ImportFrozenModuleObject(PyObject *name) if (co == NULL) return -1; if (!PyCode_Check(co)) { - PyErr_Format(PyExc_TypeError, - "frozen object %R is not a code object", - name); + _PyErr_Format(tstate, PyExc_TypeError, + "frozen object %R is not a code object", + name); goto err_return; } if (ispackage) { /* Set __path__ to the empty list */ PyObject *l; int err; - m = PyImport_AddModuleObject(name); + m = import_add_module(tstate, name); if (m == NULL) goto err_return; d = PyModule_GetDict(m); @@ -1374,16 +1442,18 @@ PyImport_ImportFrozenModuleObject(PyObject *name) if (err != 0) goto err_return; } - d = module_dict_for_exec(name); + d = module_dict_for_exec(tstate, name); if (d == NULL) { goto err_return; } - m = exec_code_in_module(name, d, co); - if (m == NULL) + m = exec_code_in_module(tstate, name, d, co); + if (m == NULL) { goto err_return; + } Py_DECREF(co); Py_DECREF(m); return 1; + err_return: Py_DECREF(co); return -1; @@ -1420,6 +1490,7 @@ PyImport_ImportModule(const char *name) return result; } + /* Import a module without blocking * * At first it tries to fetch the module from sys.modules. If the module was @@ -1439,7 +1510,7 @@ PyImport_ImportModuleNoBlock(const char *name) /* Remove importlib frames from the traceback, * except in Verbose mode. */ static void -remove_importlib_frames(PyInterpreterState *interp) +remove_importlib_frames(PyThreadState *tstate) { const char *importlib_filename = ""; const char *external_filename = ""; @@ -1453,8 +1524,8 @@ remove_importlib_frames(PyInterpreterState *interp) from the traceback. We always trim chunks which end with a call to "_call_with_frames_removed". */ - PyErr_Fetch(&exception, &value, &base_tb); - if (!exception || interp->config.verbose) { + _PyErr_Fetch(tstate, &exception, &value, &base_tb); + if (!exception || _PyInterpreterState_GetConfig(tstate->interp)->verbose) { goto done; } @@ -1468,7 +1539,7 @@ remove_importlib_frames(PyInterpreterState *interp) PyTracebackObject *traceback = (PyTracebackObject *)tb; PyObject *next = (PyObject *) traceback->tb_next; PyFrameObject *frame = traceback->tb_frame; - PyCodeObject *code = frame->f_code; + PyCodeObject *code = PyFrame_GetCode(frame); int now_in_importlib; assert(PyTraceBack_Check(tb)); @@ -1490,19 +1561,18 @@ remove_importlib_frames(PyInterpreterState *interp) else { prev_link = (PyObject **) &traceback->tb_next; } + Py_DECREF(code); tb = next; } done: - PyErr_Restore(exception, value, base_tb); + _PyErr_Restore(tstate, exception, value, base_tb); } static PyObject * -resolve_name(PyObject *name, PyObject *globals, int level) +resolve_name(PyThreadState *tstate, PyObject *name, PyObject *globals, int level) { - _Py_IDENTIFIER(__spec__); _Py_IDENTIFIER(__package__); - _Py_IDENTIFIER(__path__); _Py_IDENTIFIER(__name__); _Py_IDENTIFIER(parent); PyObject *abs_name; @@ -1513,29 +1583,30 @@ resolve_name(PyObject *name, PyObject *globals, int level) int level_up; if (globals == NULL) { - PyErr_SetString(PyExc_KeyError, "'__name__' not in globals"); + _PyErr_SetString(tstate, PyExc_KeyError, "'__name__' not in globals"); goto error; } if (!PyDict_Check(globals)) { - PyErr_SetString(PyExc_TypeError, "globals must be a dict"); + _PyErr_SetString(tstate, PyExc_TypeError, "globals must be a dict"); goto error; } package = _PyDict_GetItemIdWithError(globals, &PyId___package__); if (package == Py_None) { package = NULL; } - else if (package == NULL && PyErr_Occurred()) { + else if (package == NULL && _PyErr_Occurred(tstate)) { goto error; } spec = _PyDict_GetItemIdWithError(globals, &PyId___spec__); - if (spec == NULL && PyErr_Occurred()) { + if (spec == NULL && _PyErr_Occurred(tstate)) { goto error; } if (package != NULL) { Py_INCREF(package); if (!PyUnicode_Check(package)) { - PyErr_SetString(PyExc_TypeError, "package must be a string"); + _PyErr_SetString(tstate, PyExc_TypeError, + "package must be a string"); goto error; } else if (spec != NULL && spec != Py_None) { @@ -1564,8 +1635,8 @@ resolve_name(PyObject *name, PyObject *globals, int level) goto error; } else if (!PyUnicode_Check(package)) { - PyErr_SetString(PyExc_TypeError, - "__spec__.parent must be a string"); + _PyErr_SetString(tstate, PyExc_TypeError, + "__spec__.parent must be a string"); goto error; } } @@ -1578,22 +1649,24 @@ resolve_name(PyObject *name, PyObject *globals, int level) package = _PyDict_GetItemIdWithError(globals, &PyId___name__); if (package == NULL) { - if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_KeyError, "'__name__' not in globals"); + if (!_PyErr_Occurred(tstate)) { + _PyErr_SetString(tstate, PyExc_KeyError, + "'__name__' not in globals"); } goto error; } Py_INCREF(package); if (!PyUnicode_Check(package)) { - PyErr_SetString(PyExc_TypeError, "__name__ must be a string"); + _PyErr_SetString(tstate, PyExc_TypeError, + "__name__ must be a string"); goto error; } if (_PyDict_GetItemIdWithError(globals, &PyId___path__) == NULL) { Py_ssize_t dot; - if (PyErr_Occurred() || PyUnicode_READY(package) < 0) { + if (_PyErr_Occurred(tstate) || PyUnicode_READY(package) < 0) { goto error; } @@ -1624,9 +1697,9 @@ resolve_name(PyObject *name, PyObject *globals, int level) goto error; } else if (last_dot == -1) { - PyErr_SetString(PyExc_ValueError, - "attempted relative import beyond top-level " - "package"); + _PyErr_SetString(tstate, PyExc_ImportError, + "attempted relative import beyond top-level " + "package"); goto error; } } @@ -1642,7 +1715,7 @@ resolve_name(PyObject *name, PyObject *globals, int level) return abs_name; no_parent_error: - PyErr_SetString(PyExc_ImportError, + _PyErr_SetString(tstate, PyExc_ImportError, "attempted relative import " "with no known parent package"); @@ -1652,12 +1725,12 @@ resolve_name(PyObject *name, PyObject *globals, int level) } static PyObject * -import_find_and_load(PyObject *abs_name) +import_find_and_load(PyThreadState *tstate, PyObject *abs_name) { _Py_IDENTIFIER(_find_and_load); PyObject *mod = NULL; - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - int import_time = interp->config.import_time; + PyInterpreterState *interp = tstate->interp; + int import_time = _PyInterpreterState_GetConfig(interp)->import_time; static int import_level; static _PyTime_t accumulated; @@ -1666,10 +1739,10 @@ import_find_and_load(PyObject *abs_name) 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) { + if (_PySys_Audit(tstate, "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; } @@ -1718,21 +1791,39 @@ import_find_and_load(PyObject *abs_name) return mod; } +PyObject * +PyImport_GetModule(PyObject *name) +{ + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *mod; + + mod = import_get_module(tstate, name); + if (mod != NULL && mod != Py_None) { + if (import_ensure_initialized(tstate, mod, name) < 0) { + Py_DECREF(mod); + remove_importlib_frames(tstate); + return NULL; + } + } + return mod; +} + PyObject * PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level) { + PyThreadState *tstate = _PyThreadState_GET(); _Py_IDENTIFIER(_handle_fromlist); PyObject *abs_name = NULL; PyObject *final_mod = NULL; PyObject *mod = NULL; PyObject *package = NULL; - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); + PyInterpreterState *interp = tstate->interp; int has_from; if (name == NULL) { - PyErr_SetString(PyExc_ValueError, "Empty module name"); + _PyErr_SetString(tstate, PyExc_ValueError, "Empty module name"); goto error; } @@ -1740,62 +1831,45 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, for added performance. */ if (!PyUnicode_Check(name)) { - PyErr_SetString(PyExc_TypeError, "module name must be a string"); + _PyErr_SetString(tstate, PyExc_TypeError, + "module name must be a string"); goto error; } if (PyUnicode_READY(name) < 0) { goto error; } if (level < 0) { - PyErr_SetString(PyExc_ValueError, "level must be >= 0"); + _PyErr_SetString(tstate, PyExc_ValueError, "level must be >= 0"); goto error; } if (level > 0) { - abs_name = resolve_name(name, globals, level); + abs_name = resolve_name(tstate, name, globals, level); if (abs_name == NULL) goto error; } else { /* level == 0 */ if (PyUnicode_GET_LENGTH(name) == 0) { - PyErr_SetString(PyExc_ValueError, "Empty module name"); + _PyErr_SetString(tstate, PyExc_ValueError, "Empty module name"); goto error; } abs_name = name; Py_INCREF(abs_name); } - mod = PyImport_GetModule(abs_name); - if (mod == NULL && PyErr_Occurred()) { + mod = import_get_module(tstate, abs_name); + if (mod == NULL && _PyErr_Occurred(tstate)) { goto error; } if (mod != NULL && mod != Py_None) { - _Py_IDENTIFIER(__spec__); - _Py_IDENTIFIER(_lock_unlock_module); - PyObject *spec; - - /* Optimization: only call _bootstrap._lock_unlock_module() if - __spec__._initializing is true. - NOTE: because of this, initializing must be set *before* - stuffing the new module in sys.modules. - */ - spec = _PyObject_GetAttrId(mod, &PyId___spec__); - if (_PyModuleSpec_IsInitializing(spec)) { - PyObject *value = _PyObject_CallMethodIdObjArgs(interp->importlib, - &PyId__lock_unlock_module, abs_name, - NULL); - if (value == NULL) { - Py_DECREF(spec); - goto error; - } - Py_DECREF(value); + if (import_ensure_initialized(tstate, mod, name) < 0) { + goto error; } - Py_XDECREF(spec); } else { Py_XDECREF(mod); - mod = import_find_and_load(abs_name); + mod = import_find_and_load(tstate, abs_name); if (mod == NULL) { goto error; } @@ -1842,13 +1916,13 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, goto error; } - final_mod = PyImport_GetModule(to_return); + final_mod = import_get_module(tstate, to_return); Py_DECREF(to_return); if (final_mod == NULL) { - if (!PyErr_Occurred()) { - PyErr_Format(PyExc_KeyError, - "%R not in sys.modules as expected", - to_return); + if (!_PyErr_Occurred(tstate)) { + _PyErr_Format(tstate, PyExc_KeyError, + "%R not in sys.modules as expected", + to_return); } goto error; } @@ -1860,7 +1934,6 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, } } else { - _Py_IDENTIFIER(__path__); PyObject *path; if (_PyObject_LookupAttrId(mod, &PyId___path__, &path) < 0) { goto error; @@ -1882,7 +1955,7 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, Py_XDECREF(mod); Py_XDECREF(package); if (final_mod == NULL) { - remove_importlib_frames(interp); + remove_importlib_frames(tstate); } return final_mod; } @@ -1923,7 +1996,7 @@ PyImport_ReloadModule(PyObject *m) } } - reloaded_module = _PyObject_CallMethodIdObjArgs(importlib, &PyId_reload, m, NULL); + reloaded_module = _PyObject_CallMethodIdOneArg(importlib, &PyId_reload, m); Py_DECREF(importlib); return reloaded_module; } @@ -1941,6 +2014,7 @@ PyImport_ReloadModule(PyObject *m) PyObject * PyImport_Import(PyObject *module_name) { + PyThreadState *tstate = _PyThreadState_GET(); static PyObject *silly_list = NULL; static PyObject *builtins_str = NULL; static PyObject *import_str = NULL; @@ -1984,8 +2058,9 @@ PyImport_Import(PyObject *module_name) /* Get the __import__ function from the builtins */ if (PyDict_Check(builtins)) { import = PyObject_GetItem(builtins, import_str); - if (import == NULL) - PyErr_SetObject(PyExc_KeyError, import_str); + if (import == NULL) { + _PyErr_SetObject(tstate, PyExc_KeyError, import_str); + } } else import = PyObject_GetAttr(builtins, import_str); @@ -2001,9 +2076,9 @@ PyImport_Import(PyObject *module_name) goto err; Py_DECREF(r); - r = PyImport_GetModule(module_name); - if (r == NULL && !PyErr_Occurred()) { - PyErr_SetObject(PyExc_KeyError, module_name); + r = import_get_module(tstate, module_name); + if (r == NULL && !_PyErr_Occurred(tstate)) { + _PyErr_SetObject(tstate, PyExc_KeyError, module_name); } err: @@ -2064,6 +2139,7 @@ static PyObject * _imp_init_frozen_impl(PyObject *module, PyObject *name) /*[clinic end generated code: output=fc0511ed869fd69c input=13019adfc04f3fb3]*/ { + PyThreadState *tstate = _PyThreadState_GET(); int ret; PyObject *m; @@ -2073,7 +2149,7 @@ _imp_init_frozen_impl(PyObject *module, PyObject *name) if (ret == 0) { Py_RETURN_NONE; } - m = PyImport_AddModuleObject(name); + m = import_add_module(tstate, name); Py_XINCREF(m); return m; } @@ -2340,7 +2416,7 @@ PyInit__imp(void) goto failure; } - const wchar_t *mode = _PyInterpreterState_Get()->config.check_hash_pycs_mode; + const wchar_t *mode = _Py_GetConfig()->check_hash_pycs_mode; PyObject *pyc_mode = PyUnicode_FromWideChar(mode, -1); if (pyc_mode == NULL) { goto failure; diff --git a/Python/importdl.c b/Python/importdl.c index 1d0d32a2371f80044d8b4e31a2e81876ed8bda98..fbeb9fb75403e608d01de02ad6e7c8df389043bb 100644 --- a/Python/importdl.c +++ b/Python/importdl.c @@ -181,7 +181,7 @@ _PyImport_LoadDynamicModuleWithSpec(PyObject *spec, FILE *fp) m = NULL; goto error; } - if (Py_TYPE(m) == NULL) { + if (Py_IS_TYPE(m, NULL)) { /* This can happen when a PyModuleDef is returned without calling * PyModuleDef_Init on it */ diff --git a/Python/importlib.h b/Python/importlib.h index 67195747d8d90c7bd58313aa6d6f9446b417fee3..1fb877a75341975db122e0b6edea1f8c5f30373f 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -118,894 +118,903 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 58,0,0,0,115,12,0,0,0,0,1,10,1,10,1,6, 1,6,1,6,1,122,20,95,77,111,100,117,108,101,76,111, 99,107,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,60,0,0,0,116,0,160,1,161,0,125, - 1,124,0,106,2,125,2,116,3,160,4,124,2,161,1,125, - 3,124,3,100,0,107,8,114,36,100,1,83,0,124,3,106, - 2,125,2,124,2,124,1,107,2,114,14,100,2,83,0,113, - 14,100,0,83,0,41,3,78,70,84,41,5,114,23,0,0, - 0,218,9,103,101,116,95,105,100,101,110,116,114,26,0,0, - 0,218,12,95,98,108,111,99,107,105,110,103,95,111,110,218, - 3,103,101,116,41,4,114,30,0,0,0,90,2,109,101,218, - 3,116,105,100,114,24,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,12,104,97,115,95,100,101, - 97,100,108,111,99,107,66,0,0,0,115,16,0,0,0,0, - 2,8,1,6,2,10,1,8,1,4,1,6,1,8,1,122, - 24,95,77,111,100,117,108,101,76,111,99,107,46,104,97,115, - 95,100,101,97,100,108,111,99,107,99,1,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,9,0,0,0,67,0, - 0,0,115,178,0,0,0,116,0,160,1,161,0,125,1,124, - 0,116,2,124,1,60,0,122,148,124,0,106,3,143,110,1, - 0,124,0,106,4,100,1,107,2,115,46,124,0,106,5,124, - 1,107,2,114,84,124,1,124,0,95,5,124,0,4,0,106, - 4,100,2,55,0,2,0,95,4,87,0,53,0,81,0,82, - 0,163,0,87,0,162,86,100,3,83,0,124,0,160,6,161, - 0,114,104,116,7,100,4,124,0,22,0,131,1,130,1,124, - 0,106,8,160,9,100,5,161,1,114,130,124,0,4,0,106, - 10,100,2,55,0,2,0,95,10,87,0,53,0,81,0,82, - 0,88,0,124,0,106,8,160,9,161,0,1,0,124,0,106, - 8,160,11,161,0,1,0,113,18,87,0,53,0,116,2,124, - 1,61,0,88,0,100,6,83,0,41,7,122,185,10,32,32, - 32,32,32,32,32,32,65,99,113,117,105,114,101,32,116,104, - 101,32,109,111,100,117,108,101,32,108,111,99,107,46,32,32, - 73,102,32,97,32,112,111,116,101,110,116,105,97,108,32,100, - 101,97,100,108,111,99,107,32,105,115,32,100,101,116,101,99, - 116,101,100,44,10,32,32,32,32,32,32,32,32,97,32,95, - 68,101,97,100,108,111,99,107,69,114,114,111,114,32,105,115, - 32,114,97,105,115,101,100,46,10,32,32,32,32,32,32,32, - 32,79,116,104,101,114,119,105,115,101,44,32,116,104,101,32, - 108,111,99,107,32,105,115,32,97,108,119,97,121,115,32,97, - 99,113,117,105,114,101,100,32,97,110,100,32,84,114,117,101, - 32,105,115,32,114,101,116,117,114,110,101,100,46,10,32,32, - 32,32,32,32,32,32,114,22,0,0,0,233,1,0,0,0, - 84,122,23,100,101,97,100,108,111,99,107,32,100,101,116,101, - 99,116,101,100,32,98,121,32,37,114,70,78,41,12,114,23, - 0,0,0,114,32,0,0,0,114,33,0,0,0,114,24,0, - 0,0,114,27,0,0,0,114,26,0,0,0,114,36,0,0, - 0,114,19,0,0,0,114,25,0,0,0,218,7,97,99,113, - 117,105,114,101,114,28,0,0,0,218,7,114,101,108,101,97, - 115,101,169,2,114,30,0,0,0,114,35,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,38,0, - 0,0,78,0,0,0,115,30,0,0,0,0,6,8,1,8, - 1,2,2,8,1,20,1,6,1,14,1,18,1,8,1,12, - 1,12,1,24,2,10,1,16,2,122,19,95,77,111,100,117, - 108,101,76,111,99,107,46,97,99,113,117,105,114,101,99,1, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,9, - 0,0,0,67,0,0,0,115,122,0,0,0,116,0,160,1, - 161,0,125,1,124,0,106,2,143,98,1,0,124,0,106,3, - 124,1,107,3,114,34,116,4,100,1,131,1,130,1,124,0, - 106,5,100,2,107,4,115,48,116,6,130,1,124,0,4,0, - 106,5,100,3,56,0,2,0,95,5,124,0,106,5,100,2, - 107,2,114,108,100,0,124,0,95,3,124,0,106,7,114,108, - 124,0,4,0,106,7,100,3,56,0,2,0,95,7,124,0, - 106,8,160,9,161,0,1,0,87,0,53,0,81,0,82,0, - 88,0,100,0,83,0,41,4,78,250,31,99,97,110,110,111, - 116,32,114,101,108,101,97,115,101,32,117,110,45,97,99,113, - 117,105,114,101,100,32,108,111,99,107,114,22,0,0,0,114, - 37,0,0,0,41,10,114,23,0,0,0,114,32,0,0,0, - 114,24,0,0,0,114,26,0,0,0,218,12,82,117,110,116, - 105,109,101,69,114,114,111,114,114,27,0,0,0,218,14,65, - 115,115,101,114,116,105,111,110,69,114,114,111,114,114,28,0, - 0,0,114,25,0,0,0,114,39,0,0,0,114,40,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,39,0,0,0,103,0,0,0,115,22,0,0,0,0,1, - 8,1,8,1,10,1,8,1,14,1,14,1,10,1,6,1, - 6,1,14,1,122,19,95,77,111,100,117,108,101,76,111,99, - 107,46,114,101,108,101,97,115,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,18,0,0,0,100,1,160,0,124,0,106,1,116, - 2,124,0,131,1,161,2,83,0,41,2,78,122,23,95,77, - 111,100,117,108,101,76,111,99,107,40,123,33,114,125,41,32, - 97,116,32,123,125,169,3,218,6,102,111,114,109,97,116,114, - 17,0,0,0,218,2,105,100,169,1,114,30,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,8, - 95,95,114,101,112,114,95,95,116,0,0,0,115,2,0,0, - 0,0,1,122,20,95,77,111,100,117,108,101,76,111,99,107, - 46,95,95,114,101,112,114,95,95,78,41,9,114,1,0,0, - 0,114,0,0,0,0,114,2,0,0,0,114,3,0,0,0, - 114,31,0,0,0,114,36,0,0,0,114,38,0,0,0,114, - 39,0,0,0,114,48,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,20,0, - 0,0,52,0,0,0,115,12,0,0,0,8,1,4,5,8, - 8,8,12,8,25,8,13,114,20,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,48,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,83,0,41,11,218,16,95,68, - 117,109,109,121,77,111,100,117,108,101,76,111,99,107,122,86, - 65,32,115,105,109,112,108,101,32,95,77,111,100,117,108,101, - 76,111,99,107,32,101,113,117,105,118,97,108,101,110,116,32, - 102,111,114,32,80,121,116,104,111,110,32,98,117,105,108,100, - 115,32,119,105,116,104,111,117,116,10,32,32,32,32,109,117, - 108,116,105,45,116,104,114,101,97,100,105,110,103,32,115,117, - 112,112,111,114,116,46,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, - 16,0,0,0,124,1,124,0,95,0,100,1,124,0,95,1, - 100,0,83,0,114,21,0,0,0,41,2,114,17,0,0,0, - 114,27,0,0,0,114,29,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,31,0,0,0,124,0, - 0,0,115,4,0,0,0,0,1,6,1,122,25,95,68,117, - 109,109,121,77,111,100,117,108,101,76,111,99,107,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,3,0,0,0,67,0,0,0,115, - 18,0,0,0,124,0,4,0,106,0,100,1,55,0,2,0, - 95,0,100,2,83,0,41,3,78,114,37,0,0,0,84,41, - 1,114,27,0,0,0,114,47,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,38,0,0,0,128, - 0,0,0,115,4,0,0,0,0,1,14,1,122,24,95,68, - 117,109,109,121,77,111,100,117,108,101,76,111,99,107,46,97, + 0,0,0,0,0,0,0,0,5,0,0,0,3,0,0,0, + 67,0,0,0,115,88,0,0,0,116,0,160,1,161,0,125, + 1,124,0,106,2,125,2,116,3,131,0,125,3,116,4,160, + 5,124,2,161,1,125,4,124,4,100,0,117,0,114,42,100, + 1,83,0,124,4,106,2,125,2,124,2,124,1,107,2,114, + 60,100,2,83,0,124,2,124,3,118,0,114,72,100,1,83, + 0,124,3,160,6,124,2,161,1,1,0,113,20,100,0,83, + 0,41,3,78,70,84,41,7,114,23,0,0,0,218,9,103, + 101,116,95,105,100,101,110,116,114,26,0,0,0,218,3,115, + 101,116,218,12,95,98,108,111,99,107,105,110,103,95,111,110, + 218,3,103,101,116,218,3,97,100,100,41,5,114,30,0,0, + 0,90,2,109,101,218,3,116,105,100,90,4,115,101,101,110, + 114,24,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,12,104,97,115,95,100,101,97,100,108,111, + 99,107,66,0,0,0,115,24,0,0,0,0,2,8,1,6, + 1,6,2,10,1,8,1,4,1,6,1,8,1,4,1,8, + 6,4,1,122,24,95,77,111,100,117,108,101,76,111,99,107, + 46,104,97,115,95,100,101,97,100,108,111,99,107,99,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,8,0, + 0,0,67,0,0,0,115,210,0,0,0,116,0,160,1,161, + 0,125,1,124,0,116,2,124,1,60,0,122,180,124,0,106, + 3,143,126,1,0,124,0,106,4,100,1,107,2,115,46,124, + 0,106,5,124,1,107,2,114,90,124,1,124,0,95,5,124, + 0,4,0,106,4,100,2,55,0,2,0,95,4,87,0,100, + 3,4,0,4,0,131,3,1,0,87,0,116,2,124,1,61, + 0,100,4,83,0,124,0,160,6,161,0,114,110,116,7,100, + 5,124,0,22,0,131,1,130,1,124,0,106,8,160,9,100, + 6,161,1,114,136,124,0,4,0,106,10,100,2,55,0,2, + 0,95,10,87,0,100,3,4,0,4,0,131,3,1,0,110, + 16,49,0,115,156,48,0,1,0,1,0,1,0,89,0,1, + 0,124,0,106,8,160,9,161,0,1,0,124,0,106,8,160, + 11,161,0,1,0,113,18,87,0,116,2,124,1,61,0,110, + 8,116,2,124,1,61,0,48,0,100,3,83,0,41,7,122, + 185,10,32,32,32,32,32,32,32,32,65,99,113,117,105,114, + 101,32,116,104,101,32,109,111,100,117,108,101,32,108,111,99, + 107,46,32,32,73,102,32,97,32,112,111,116,101,110,116,105, + 97,108,32,100,101,97,100,108,111,99,107,32,105,115,32,100, + 101,116,101,99,116,101,100,44,10,32,32,32,32,32,32,32, + 32,97,32,95,68,101,97,100,108,111,99,107,69,114,114,111, + 114,32,105,115,32,114,97,105,115,101,100,46,10,32,32,32, + 32,32,32,32,32,79,116,104,101,114,119,105,115,101,44,32, + 116,104,101,32,108,111,99,107,32,105,115,32,97,108,119,97, + 121,115,32,97,99,113,117,105,114,101,100,32,97,110,100,32, + 84,114,117,101,32,105,115,32,114,101,116,117,114,110,101,100, + 46,10,32,32,32,32,32,32,32,32,114,22,0,0,0,233, + 1,0,0,0,78,84,122,23,100,101,97,100,108,111,99,107, + 32,100,101,116,101,99,116,101,100,32,98,121,32,37,114,70, + 41,12,114,23,0,0,0,114,32,0,0,0,114,34,0,0, + 0,114,24,0,0,0,114,27,0,0,0,114,26,0,0,0, + 114,38,0,0,0,114,19,0,0,0,114,25,0,0,0,218, + 7,97,99,113,117,105,114,101,114,28,0,0,0,218,7,114, + 101,108,101,97,115,101,169,2,114,30,0,0,0,114,37,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,114,40,0,0,0,87,0,0,0,115,34,0,0,0,0, + 6,8,1,8,1,2,2,8,1,20,1,6,1,14,1,14, + 9,6,247,4,1,8,1,12,1,12,1,44,2,10,1,14, + 2,122,19,95,77,111,100,117,108,101,76,111,99,107,46,97, 99,113,117,105,114,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, - 36,0,0,0,124,0,106,0,100,1,107,2,114,18,116,1, - 100,2,131,1,130,1,124,0,4,0,106,0,100,3,56,0, - 2,0,95,0,100,0,83,0,41,4,78,114,22,0,0,0, - 114,41,0,0,0,114,37,0,0,0,41,2,114,27,0,0, - 0,114,42,0,0,0,114,47,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,39,0,0,0,132, - 0,0,0,115,6,0,0,0,0,1,10,1,8,1,122,24, + 0,0,0,2,0,0,0,8,0,0,0,67,0,0,0,115, + 142,0,0,0,116,0,160,1,161,0,125,1,124,0,106,2, + 143,108,1,0,124,0,106,3,124,1,107,3,114,34,116,4, + 100,1,131,1,130,1,124,0,106,5,100,2,107,4,115,48, + 74,0,130,1,124,0,4,0,106,5,100,3,56,0,2,0, + 95,5,124,0,106,5,100,2,107,2,114,108,100,0,124,0, + 95,3,124,0,106,6,114,108,124,0,4,0,106,6,100,3, + 56,0,2,0,95,6,124,0,106,7,160,8,161,0,1,0, + 87,0,100,0,4,0,4,0,131,3,1,0,110,16,49,0, + 115,128,48,0,1,0,1,0,1,0,89,0,1,0,100,0, + 83,0,41,4,78,250,31,99,97,110,110,111,116,32,114,101, + 108,101,97,115,101,32,117,110,45,97,99,113,117,105,114,101, + 100,32,108,111,99,107,114,22,0,0,0,114,39,0,0,0, + 41,9,114,23,0,0,0,114,32,0,0,0,114,24,0,0, + 0,114,26,0,0,0,218,12,82,117,110,116,105,109,101,69, + 114,114,111,114,114,27,0,0,0,114,28,0,0,0,114,25, + 0,0,0,114,41,0,0,0,114,42,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,41,0,0, + 0,112,0,0,0,115,22,0,0,0,0,1,8,1,8,1, + 10,1,8,1,14,1,14,1,10,1,6,1,6,1,14,1, + 122,19,95,77,111,100,117,108,101,76,111,99,107,46,114,101, + 108,101,97,115,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,18, + 0,0,0,100,1,160,0,124,0,106,1,116,2,124,0,131, + 1,161,2,83,0,41,2,78,122,23,95,77,111,100,117,108, + 101,76,111,99,107,40,123,33,114,125,41,32,97,116,32,123, + 125,169,3,218,6,102,111,114,109,97,116,114,17,0,0,0, + 218,2,105,100,169,1,114,30,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,8,95,95,114,101, + 112,114,95,95,125,0,0,0,115,2,0,0,0,0,1,122, + 20,95,77,111,100,117,108,101,76,111,99,107,46,95,95,114, + 101,112,114,95,95,78,41,9,114,1,0,0,0,114,0,0, + 0,0,114,2,0,0,0,114,3,0,0,0,114,31,0,0, + 0,114,38,0,0,0,114,40,0,0,0,114,41,0,0,0, + 114,49,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,20,0,0,0,52,0, + 0,0,115,12,0,0,0,8,1,4,5,8,8,8,21,8, + 25,8,13,114,20,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,48,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,83,0,41,11,218,16,95,68,117,109,109,121, + 77,111,100,117,108,101,76,111,99,107,122,86,65,32,115,105, + 109,112,108,101,32,95,77,111,100,117,108,101,76,111,99,107, + 32,101,113,117,105,118,97,108,101,110,116,32,102,111,114,32, + 80,121,116,104,111,110,32,98,117,105,108,100,115,32,119,105, + 116,104,111,117,116,10,32,32,32,32,109,117,108,116,105,45, + 116,104,114,101,97,100,105,110,103,32,115,117,112,112,111,114, + 116,46,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,16,0,0,0, + 124,1,124,0,95,0,100,1,124,0,95,1,100,0,83,0, + 114,21,0,0,0,41,2,114,17,0,0,0,114,27,0,0, + 0,114,29,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,31,0,0,0,133,0,0,0,115,4, + 0,0,0,0,1,6,1,122,25,95,68,117,109,109,121,77, + 111,100,117,108,101,76,111,99,107,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,3,0,0,0,67,0,0,0,115,18,0,0,0, + 124,0,4,0,106,0,100,1,55,0,2,0,95,0,100,2, + 83,0,41,3,78,114,39,0,0,0,84,41,1,114,27,0, + 0,0,114,48,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,40,0,0,0,137,0,0,0,115, + 4,0,0,0,0,1,14,1,122,24,95,68,117,109,109,121, + 77,111,100,117,108,101,76,111,99,107,46,97,99,113,117,105, + 114,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,36,0,0,0, + 124,0,106,0,100,1,107,2,114,18,116,1,100,2,131,1, + 130,1,124,0,4,0,106,0,100,3,56,0,2,0,95,0, + 100,0,83,0,41,4,78,114,22,0,0,0,114,43,0,0, + 0,114,39,0,0,0,41,2,114,27,0,0,0,114,44,0, + 0,0,114,48,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,41,0,0,0,141,0,0,0,115, + 6,0,0,0,0,1,10,1,8,1,122,24,95,68,117,109, + 109,121,77,111,100,117,108,101,76,111,99,107,46,114,101,108, + 101,97,115,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,18,0, + 0,0,100,1,160,0,124,0,106,1,116,2,124,0,131,1, + 161,2,83,0,41,2,78,122,28,95,68,117,109,109,121,77, + 111,100,117,108,101,76,111,99,107,40,123,33,114,125,41,32, + 97,116,32,123,125,114,45,0,0,0,114,48,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,49, + 0,0,0,146,0,0,0,115,2,0,0,0,0,1,122,25, 95,68,117,109,109,121,77,111,100,117,108,101,76,111,99,107, - 46,114,101,108,101,97,115,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,18,0,0,0,100,1,160,0,124,0,106,1,116,2, - 124,0,131,1,161,2,83,0,41,2,78,122,28,95,68,117, - 109,109,121,77,111,100,117,108,101,76,111,99,107,40,123,33, - 114,125,41,32,97,116,32,123,125,114,44,0,0,0,114,47, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,48,0,0,0,137,0,0,0,115,2,0,0,0, - 0,1,122,25,95,68,117,109,109,121,77,111,100,117,108,101, - 76,111,99,107,46,95,95,114,101,112,114,95,95,78,41,8, - 114,1,0,0,0,114,0,0,0,0,114,2,0,0,0,114, - 3,0,0,0,114,31,0,0,0,114,38,0,0,0,114,39, + 46,95,95,114,101,112,114,95,95,78,41,8,114,1,0,0, + 0,114,0,0,0,0,114,2,0,0,0,114,3,0,0,0, + 114,31,0,0,0,114,40,0,0,0,114,41,0,0,0,114, + 49,0,0,0,114,10,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,50,0,0,0,129,0,0, + 0,115,10,0,0,0,8,1,4,3,8,4,8,4,8,5, + 114,50,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,36, + 0,0,0,101,0,90,1,100,0,90,2,100,1,100,2,132, + 0,90,3,100,3,100,4,132,0,90,4,100,5,100,6,132, + 0,90,5,100,7,83,0,41,8,218,18,95,77,111,100,117, + 108,101,76,111,99,107,77,97,110,97,103,101,114,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,16,0,0,0,124,1,124,0,95, + 0,100,0,124,0,95,1,100,0,83,0,114,13,0,0,0, + 41,2,218,5,95,110,97,109,101,218,5,95,108,111,99,107, + 114,29,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,31,0,0,0,152,0,0,0,115,4,0, + 0,0,0,1,6,1,122,27,95,77,111,100,117,108,101,76, + 111,99,107,77,97,110,97,103,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,26,0,0, + 0,116,0,124,0,106,1,131,1,124,0,95,2,124,0,106, + 2,160,3,161,0,1,0,100,0,83,0,114,13,0,0,0, + 41,4,218,16,95,103,101,116,95,109,111,100,117,108,101,95, + 108,111,99,107,114,52,0,0,0,114,53,0,0,0,114,40, 0,0,0,114,48,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,49,0,0, - 0,120,0,0,0,115,10,0,0,0,8,1,4,3,8,4, - 8,4,8,5,114,49,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,36,0,0,0,101,0,90,1,100,0,90,2,100, - 1,100,2,132,0,90,3,100,3,100,4,132,0,90,4,100, - 5,100,6,132,0,90,5,100,7,83,0,41,8,218,18,95, - 77,111,100,117,108,101,76,111,99,107,77,97,110,97,103,101, - 114,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,16,0,0,0,124, - 1,124,0,95,0,100,0,124,0,95,1,100,0,83,0,114, - 13,0,0,0,41,2,218,5,95,110,97,109,101,218,5,95, - 108,111,99,107,114,29,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,31,0,0,0,143,0,0, - 0,115,4,0,0,0,0,1,6,1,122,27,95,77,111,100, - 117,108,101,76,111,99,107,77,97,110,97,103,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,26,0,0,0,116,0,124,0,106,1,131,1,124,0,95, - 2,124,0,106,2,160,3,161,0,1,0,100,0,83,0,114, - 13,0,0,0,41,4,218,16,95,103,101,116,95,109,111,100, - 117,108,101,95,108,111,99,107,114,51,0,0,0,114,52,0, - 0,0,114,38,0,0,0,114,47,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,9,95,95,101, - 110,116,101,114,95,95,147,0,0,0,115,4,0,0,0,0, - 1,12,1,122,28,95,77,111,100,117,108,101,76,111,99,107, - 77,97,110,97,103,101,114,46,95,95,101,110,116,101,114,95, - 95,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,2,0,0,0,79,0,0,0,115,14,0,0,0,124, - 0,106,0,160,1,161,0,1,0,100,0,83,0,114,13,0, - 0,0,41,2,114,52,0,0,0,114,39,0,0,0,41,3, - 114,30,0,0,0,218,4,97,114,103,115,90,6,107,119,97, - 114,103,115,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,8,95,95,101,120,105,116,95,95,151,0,0,0, - 115,2,0,0,0,0,1,122,27,95,77,111,100,117,108,101, - 76,111,99,107,77,97,110,97,103,101,114,46,95,95,101,120, - 105,116,95,95,78,41,6,114,1,0,0,0,114,0,0,0, - 0,114,2,0,0,0,114,31,0,0,0,114,54,0,0,0, - 114,56,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,50,0,0,0,141,0, - 0,0,115,6,0,0,0,8,2,8,4,8,4,114,50,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,8,0,0,0,67,0,0,0,115,130,0,0,0, - 116,0,160,1,161,0,1,0,122,106,122,14,116,3,124,0, - 25,0,131,0,125,1,87,0,110,24,4,0,116,4,107,10, - 114,48,1,0,1,0,1,0,100,1,125,1,89,0,110,2, - 88,0,124,1,100,1,107,8,114,112,116,5,100,1,107,8, - 114,76,116,6,124,0,131,1,125,1,110,8,116,7,124,0, - 131,1,125,1,124,0,102,1,100,2,100,3,132,1,125,2, - 116,8,160,9,124,1,124,2,161,2,116,3,124,0,60,0, - 87,0,53,0,116,0,160,2,161,0,1,0,88,0,124,1, - 83,0,41,4,122,139,71,101,116,32,111,114,32,99,114,101, - 97,116,101,32,116,104,101,32,109,111,100,117,108,101,32,108, - 111,99,107,32,102,111,114,32,97,32,103,105,118,101,110,32, - 109,111,100,117,108,101,32,110,97,109,101,46,10,10,32,32, - 32,32,65,99,113,117,105,114,101,47,114,101,108,101,97,115, - 101,32,105,110,116,101,114,110,97,108,108,121,32,116,104,101, - 32,103,108,111,98,97,108,32,105,109,112,111,114,116,32,108, - 111,99,107,32,116,111,32,112,114,111,116,101,99,116,10,32, - 32,32,32,95,109,111,100,117,108,101,95,108,111,99,107,115, - 46,78,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,8,0,0,0,83,0,0,0,115,48,0,0,0, - 116,0,160,1,161,0,1,0,122,24,116,3,160,4,124,1, - 161,1,124,0,107,8,114,30,116,3,124,1,61,0,87,0, - 53,0,116,0,160,2,161,0,1,0,88,0,100,0,83,0, - 114,13,0,0,0,41,5,218,4,95,105,109,112,218,12,97, - 99,113,117,105,114,101,95,108,111,99,107,218,12,114,101,108, - 101,97,115,101,95,108,111,99,107,218,13,95,109,111,100,117, - 108,101,95,108,111,99,107,115,114,34,0,0,0,41,2,218, - 3,114,101,102,114,17,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,2,99,98,176,0,0,0, - 115,10,0,0,0,0,1,8,1,2,4,14,1,10,2,122, - 28,95,103,101,116,95,109,111,100,117,108,101,95,108,111,99, - 107,46,60,108,111,99,97,108,115,62,46,99,98,41,10,114, - 57,0,0,0,114,58,0,0,0,114,59,0,0,0,114,60, - 0,0,0,218,8,75,101,121,69,114,114,111,114,114,23,0, - 0,0,114,49,0,0,0,114,20,0,0,0,218,8,95,119, - 101,97,107,114,101,102,114,61,0,0,0,41,3,114,17,0, - 0,0,114,24,0,0,0,114,62,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,53,0,0,0, - 157,0,0,0,115,28,0,0,0,0,6,8,1,2,1,2, - 1,14,1,14,1,10,2,8,1,8,1,10,2,8,2,12, - 11,20,2,10,2,114,53,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,8,0,0,0,67, - 0,0,0,115,54,0,0,0,116,0,124,0,131,1,125,1, - 122,12,124,1,160,1,161,0,1,0,87,0,110,20,4,0, - 116,2,107,10,114,40,1,0,1,0,1,0,89,0,110,10, - 88,0,124,1,160,3,161,0,1,0,100,1,83,0,41,2, - 122,189,65,99,113,117,105,114,101,115,32,116,104,101,110,32, - 114,101,108,101,97,115,101,115,32,116,104,101,32,109,111,100, - 117,108,101,32,108,111,99,107,32,102,111,114,32,97,32,103, - 105,118,101,110,32,109,111,100,117,108,101,32,110,97,109,101, - 46,10,10,32,32,32,32,84,104,105,115,32,105,115,32,117, - 115,101,100,32,116,111,32,101,110,115,117,114,101,32,97,32, - 109,111,100,117,108,101,32,105,115,32,99,111,109,112,108,101, - 116,101,108,121,32,105,110,105,116,105,97,108,105,122,101,100, - 44,32,105,110,32,116,104,101,10,32,32,32,32,101,118,101, - 110,116,32,105,116,32,105,115,32,98,101,105,110,103,32,105, - 109,112,111,114,116,101,100,32,98,121,32,97,110,111,116,104, - 101,114,32,116,104,114,101,97,100,46,10,32,32,32,32,78, - 41,4,114,53,0,0,0,114,38,0,0,0,114,19,0,0, - 0,114,39,0,0,0,41,2,114,17,0,0,0,114,24,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,19,95,108,111,99,107,95,117,110,108,111,99,107,95, - 109,111,100,117,108,101,194,0,0,0,115,12,0,0,0,0, - 6,8,1,2,1,12,1,14,3,6,2,114,65,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,3,0,0,0,79,0,0,0,115,10,0,0,0,124,0, - 124,1,124,2,142,1,83,0,41,1,97,46,1,0,0,114, - 101,109,111,118,101,95,105,109,112,111,114,116,108,105,98,95, - 102,114,97,109,101,115,32,105,110,32,105,109,112,111,114,116, - 46,99,32,119,105,108,108,32,97,108,119,97,121,115,32,114, - 101,109,111,118,101,32,115,101,113,117,101,110,99,101,115,10, - 32,32,32,32,111,102,32,105,109,112,111,114,116,108,105,98, - 32,102,114,97,109,101,115,32,116,104,97,116,32,101,110,100, - 32,119,105,116,104,32,97,32,99,97,108,108,32,116,111,32, - 116,104,105,115,32,102,117,110,99,116,105,111,110,10,10,32, - 32,32,32,85,115,101,32,105,116,32,105,110,115,116,101,97, - 100,32,111,102,32,97,32,110,111,114,109,97,108,32,99,97, - 108,108,32,105,110,32,112,108,97,99,101,115,32,119,104,101, - 114,101,32,105,110,99,108,117,100,105,110,103,32,116,104,101, - 32,105,109,112,111,114,116,108,105,98,10,32,32,32,32,102, - 114,97,109,101,115,32,105,110,116,114,111,100,117,99,101,115, - 32,117,110,119,97,110,116,101,100,32,110,111,105,115,101,32, - 105,110,116,111,32,116,104,101,32,116,114,97,99,101,98,97, - 99,107,32,40,101,46,103,46,32,119,104,101,110,32,101,120, - 101,99,117,116,105,110,103,10,32,32,32,32,109,111,100,117, - 108,101,32,99,111,100,101,41,10,32,32,32,32,114,10,0, - 0,0,41,3,218,1,102,114,55,0,0,0,90,4,107,119, - 100,115,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,25,95,99,97,108,108,95,119,105,116,104,95,102,114, - 97,109,101,115,95,114,101,109,111,118,101,100,211,0,0,0, - 115,2,0,0,0,0,8,114,67,0,0,0,114,37,0,0, - 0,41,1,218,9,118,101,114,98,111,115,105,116,121,99,1, - 0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,4, - 0,0,0,71,0,0,0,115,54,0,0,0,116,0,106,1, - 106,2,124,1,107,5,114,50,124,0,160,3,100,1,161,1, - 115,30,100,2,124,0,23,0,125,0,116,4,124,0,106,5, - 124,2,142,0,116,0,106,6,100,3,141,2,1,0,100,4, - 83,0,41,5,122,61,80,114,105,110,116,32,116,104,101,32, - 109,101,115,115,97,103,101,32,116,111,32,115,116,100,101,114, - 114,32,105,102,32,45,118,47,80,89,84,72,79,78,86,69, - 82,66,79,83,69,32,105,115,32,116,117,114,110,101,100,32, - 111,110,46,41,2,250,1,35,122,7,105,109,112,111,114,116, - 32,122,2,35,32,41,1,90,4,102,105,108,101,78,41,7, - 114,15,0,0,0,218,5,102,108,97,103,115,218,7,118,101, - 114,98,111,115,101,218,10,115,116,97,114,116,115,119,105,116, - 104,218,5,112,114,105,110,116,114,45,0,0,0,218,6,115, - 116,100,101,114,114,41,3,218,7,109,101,115,115,97,103,101, - 114,68,0,0,0,114,55,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,16,95,118,101,114,98, - 111,115,101,95,109,101,115,115,97,103,101,222,0,0,0,115, - 8,0,0,0,0,2,12,1,10,1,8,1,114,76,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,3,0,0,0,3,0,0,0,115,26,0,0,0,135, - 0,102,1,100,1,100,2,132,8,125,1,116,0,124,1,136, - 0,131,2,1,0,124,1,83,0,41,3,122,49,68,101,99, - 111,114,97,116,111,114,32,116,111,32,118,101,114,105,102,121, - 32,116,104,101,32,110,97,109,101,100,32,109,111,100,117,108, - 101,32,105,115,32,98,117,105,108,116,45,105,110,46,99,2, + 0,0,114,11,0,0,0,218,9,95,95,101,110,116,101,114, + 95,95,156,0,0,0,115,4,0,0,0,0,1,12,1,122, + 28,95,77,111,100,117,108,101,76,111,99,107,77,97,110,97, + 103,101,114,46,95,95,101,110,116,101,114,95,95,99,1,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0, + 0,0,79,0,0,0,115,14,0,0,0,124,0,106,0,160, + 1,161,0,1,0,100,0,83,0,114,13,0,0,0,41,2, + 114,53,0,0,0,114,41,0,0,0,41,3,114,30,0,0, + 0,218,4,97,114,103,115,90,6,107,119,97,114,103,115,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,8, + 95,95,101,120,105,116,95,95,160,0,0,0,115,2,0,0, + 0,0,1,122,27,95,77,111,100,117,108,101,76,111,99,107, + 77,97,110,97,103,101,114,46,95,95,101,120,105,116,95,95, + 78,41,6,114,1,0,0,0,114,0,0,0,0,114,2,0, + 0,0,114,31,0,0,0,114,55,0,0,0,114,57,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,51,0,0,0,150,0,0,0,115,6, + 0,0,0,8,2,8,4,8,4,114,51,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8, + 0,0,0,67,0,0,0,115,136,0,0,0,116,0,160,1, + 161,0,1,0,122,112,122,14,116,2,124,0,25,0,131,0, + 125,1,87,0,110,22,4,0,116,3,121,46,1,0,1,0, + 1,0,100,1,125,1,89,0,110,2,48,0,124,1,100,1, + 117,0,114,110,116,4,100,1,117,0,114,74,116,5,124,0, + 131,1,125,1,110,8,116,6,124,0,131,1,125,1,124,0, + 102,1,100,2,100,3,132,1,125,2,116,7,160,8,124,1, + 124,2,161,2,116,2,124,0,60,0,87,0,116,0,160,9, + 161,0,1,0,110,10,116,0,160,9,161,0,1,0,48,0, + 124,1,83,0,41,4,122,139,71,101,116,32,111,114,32,99, + 114,101,97,116,101,32,116,104,101,32,109,111,100,117,108,101, + 32,108,111,99,107,32,102,111,114,32,97,32,103,105,118,101, + 110,32,109,111,100,117,108,101,32,110,97,109,101,46,10,10, + 32,32,32,32,65,99,113,117,105,114,101,47,114,101,108,101, + 97,115,101,32,105,110,116,101,114,110,97,108,108,121,32,116, + 104,101,32,103,108,111,98,97,108,32,105,109,112,111,114,116, + 32,108,111,99,107,32,116,111,32,112,114,111,116,101,99,116, + 10,32,32,32,32,95,109,111,100,117,108,101,95,108,111,99, + 107,115,46,78,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,8,0,0,0,83,0,0,0,115,56,0, + 0,0,116,0,160,1,161,0,1,0,122,32,116,2,160,3, + 124,1,161,1,124,0,117,0,114,30,116,2,124,1,61,0, + 87,0,116,0,160,4,161,0,1,0,110,10,116,0,160,4, + 161,0,1,0,48,0,100,0,83,0,114,13,0,0,0,41, + 5,218,4,95,105,109,112,218,12,97,99,113,117,105,114,101, + 95,108,111,99,107,218,13,95,109,111,100,117,108,101,95,108, + 111,99,107,115,114,35,0,0,0,218,12,114,101,108,101,97, + 115,101,95,108,111,99,107,41,2,218,3,114,101,102,114,17, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,2,99,98,185,0,0,0,115,10,0,0,0,0, + 1,8,1,2,4,14,1,8,2,122,28,95,103,101,116,95, + 109,111,100,117,108,101,95,108,111,99,107,46,60,108,111,99, + 97,108,115,62,46,99,98,41,10,114,58,0,0,0,114,59, + 0,0,0,114,60,0,0,0,218,8,75,101,121,69,114,114, + 111,114,114,23,0,0,0,114,50,0,0,0,114,20,0,0, + 0,218,8,95,119,101,97,107,114,101,102,114,62,0,0,0, + 114,61,0,0,0,41,3,114,17,0,0,0,114,24,0,0, + 0,114,63,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,54,0,0,0,166,0,0,0,115,28, + 0,0,0,0,6,8,1,2,1,2,1,14,1,12,1,10, + 2,8,1,8,1,10,2,8,2,12,11,18,2,20,2,114, + 54,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,8,0,0,0,67,0,0,0,115,52,0, + 0,0,116,0,124,0,131,1,125,1,122,12,124,1,160,1, + 161,0,1,0,87,0,110,18,4,0,116,2,121,38,1,0, + 1,0,1,0,89,0,110,10,48,0,124,1,160,3,161,0, + 1,0,100,1,83,0,41,2,122,189,65,99,113,117,105,114, + 101,115,32,116,104,101,110,32,114,101,108,101,97,115,101,115, + 32,116,104,101,32,109,111,100,117,108,101,32,108,111,99,107, + 32,102,111,114,32,97,32,103,105,118,101,110,32,109,111,100, + 117,108,101,32,110,97,109,101,46,10,10,32,32,32,32,84, + 104,105,115,32,105,115,32,117,115,101,100,32,116,111,32,101, + 110,115,117,114,101,32,97,32,109,111,100,117,108,101,32,105, + 115,32,99,111,109,112,108,101,116,101,108,121,32,105,110,105, + 116,105,97,108,105,122,101,100,44,32,105,110,32,116,104,101, + 10,32,32,32,32,101,118,101,110,116,32,105,116,32,105,115, + 32,98,101,105,110,103,32,105,109,112,111,114,116,101,100,32, + 98,121,32,97,110,111,116,104,101,114,32,116,104,114,101,97, + 100,46,10,32,32,32,32,78,41,4,114,54,0,0,0,114, + 40,0,0,0,114,19,0,0,0,114,41,0,0,0,41,2, + 114,17,0,0,0,114,24,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,218,19,95,108,111,99,107, + 95,117,110,108,111,99,107,95,109,111,100,117,108,101,203,0, + 0,0,115,12,0,0,0,0,6,8,1,2,1,12,1,12, + 3,6,2,114,66,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,4,0,0,0,79,0,0, + 0,115,14,0,0,0,124,0,124,1,105,0,124,2,164,1, + 142,1,83,0,41,1,97,46,1,0,0,114,101,109,111,118, + 101,95,105,109,112,111,114,116,108,105,98,95,102,114,97,109, + 101,115,32,105,110,32,105,109,112,111,114,116,46,99,32,119, + 105,108,108,32,97,108,119,97,121,115,32,114,101,109,111,118, + 101,32,115,101,113,117,101,110,99,101,115,10,32,32,32,32, + 111,102,32,105,109,112,111,114,116,108,105,98,32,102,114,97, + 109,101,115,32,116,104,97,116,32,101,110,100,32,119,105,116, + 104,32,97,32,99,97,108,108,32,116,111,32,116,104,105,115, + 32,102,117,110,99,116,105,111,110,10,10,32,32,32,32,85, + 115,101,32,105,116,32,105,110,115,116,101,97,100,32,111,102, + 32,97,32,110,111,114,109,97,108,32,99,97,108,108,32,105, + 110,32,112,108,97,99,101,115,32,119,104,101,114,101,32,105, + 110,99,108,117,100,105,110,103,32,116,104,101,32,105,109,112, + 111,114,116,108,105,98,10,32,32,32,32,102,114,97,109,101, + 115,32,105,110,116,114,111,100,117,99,101,115,32,117,110,119, + 97,110,116,101,100,32,110,111,105,115,101,32,105,110,116,111, + 32,116,104,101,32,116,114,97,99,101,98,97,99,107,32,40, + 101,46,103,46,32,119,104,101,110,32,101,120,101,99,117,116, + 105,110,103,10,32,32,32,32,109,111,100,117,108,101,32,99, + 111,100,101,41,10,32,32,32,32,114,10,0,0,0,41,3, + 218,1,102,114,56,0,0,0,90,4,107,119,100,115,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,218,25,95, + 99,97,108,108,95,119,105,116,104,95,102,114,97,109,101,115, + 95,114,101,109,111,118,101,100,220,0,0,0,115,2,0,0, + 0,0,8,114,68,0,0,0,114,39,0,0,0,41,1,218, + 9,118,101,114,98,111,115,105,116,121,99,1,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,4,0,0,0,71, + 0,0,0,115,54,0,0,0,116,0,106,1,106,2,124,1, + 107,5,114,50,124,0,160,3,100,1,161,1,115,30,100,2, + 124,0,23,0,125,0,116,4,124,0,106,5,124,2,142,0, + 116,0,106,6,100,3,141,2,1,0,100,4,83,0,41,5, + 122,61,80,114,105,110,116,32,116,104,101,32,109,101,115,115, + 97,103,101,32,116,111,32,115,116,100,101,114,114,32,105,102, + 32,45,118,47,80,89,84,72,79,78,86,69,82,66,79,83, + 69,32,105,115,32,116,117,114,110,101,100,32,111,110,46,41, + 2,250,1,35,122,7,105,109,112,111,114,116,32,122,2,35, + 32,41,1,90,4,102,105,108,101,78,41,7,114,15,0,0, + 0,218,5,102,108,97,103,115,218,7,118,101,114,98,111,115, + 101,218,10,115,116,97,114,116,115,119,105,116,104,218,5,112, + 114,105,110,116,114,46,0,0,0,218,6,115,116,100,101,114, + 114,41,3,218,7,109,101,115,115,97,103,101,114,69,0,0, + 0,114,56,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,16,95,118,101,114,98,111,115,101,95, + 109,101,115,115,97,103,101,231,0,0,0,115,8,0,0,0, + 0,2,12,1,10,1,8,1,114,77,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, + 0,0,3,0,0,0,115,26,0,0,0,135,0,102,1,100, + 1,100,2,132,8,125,1,116,0,124,1,136,0,131,2,1, + 0,124,1,83,0,41,3,122,49,68,101,99,111,114,97,116, + 111,114,32,116,111,32,118,101,114,105,102,121,32,116,104,101, + 32,110,97,109,101,100,32,109,111,100,117,108,101,32,105,115, + 32,98,117,105,108,116,45,105,110,46,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,19, + 0,0,0,115,38,0,0,0,124,1,116,0,106,1,118,1, + 114,28,116,2,100,1,160,3,124,1,161,1,124,1,100,2, + 141,2,130,1,136,0,124,0,124,1,131,2,83,0,41,3, + 78,250,29,123,33,114,125,32,105,115,32,110,111,116,32,97, + 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, + 114,16,0,0,0,41,4,114,15,0,0,0,218,20,98,117, + 105,108,116,105,110,95,109,111,100,117,108,101,95,110,97,109, + 101,115,218,11,73,109,112,111,114,116,69,114,114,111,114,114, + 46,0,0,0,169,2,114,30,0,0,0,218,8,102,117,108, + 108,110,97,109,101,169,1,218,3,102,120,110,114,10,0,0, + 0,114,11,0,0,0,218,25,95,114,101,113,117,105,114,101, + 115,95,98,117,105,108,116,105,110,95,119,114,97,112,112,101, + 114,241,0,0,0,115,10,0,0,0,0,1,10,1,10,1, + 2,255,6,2,122,52,95,114,101,113,117,105,114,101,115,95, + 98,117,105,108,116,105,110,46,60,108,111,99,97,108,115,62, + 46,95,114,101,113,117,105,114,101,115,95,98,117,105,108,116, + 105,110,95,119,114,97,112,112,101,114,169,1,114,12,0,0, + 0,41,2,114,84,0,0,0,114,85,0,0,0,114,10,0, + 0,0,114,83,0,0,0,114,11,0,0,0,218,17,95,114, + 101,113,117,105,114,101,115,95,98,117,105,108,116,105,110,239, + 0,0,0,115,6,0,0,0,0,2,12,5,10,1,114,87, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,3,0,0,0,3,0,0,0,115,26,0,0, + 0,135,0,102,1,100,1,100,2,132,8,125,1,116,0,124, + 1,136,0,131,2,1,0,124,1,83,0,41,3,122,47,68, + 101,99,111,114,97,116,111,114,32,116,111,32,118,101,114,105, + 102,121,32,116,104,101,32,110,97,109,101,100,32,109,111,100, + 117,108,101,32,105,115,32,102,114,111,122,101,110,46,99,2, 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, - 0,0,0,19,0,0,0,115,38,0,0,0,124,1,116,0, - 106,1,107,7,114,28,116,2,100,1,160,3,124,1,161,1, + 0,0,0,19,0,0,0,115,38,0,0,0,116,0,160,1, + 124,1,161,1,115,28,116,2,100,1,160,3,124,1,161,1, 124,1,100,2,141,2,130,1,136,0,124,0,124,1,131,2, - 83,0,41,3,78,250,29,123,33,114,125,32,105,115,32,110, - 111,116,32,97,32,98,117,105,108,116,45,105,110,32,109,111, - 100,117,108,101,114,16,0,0,0,41,4,114,15,0,0,0, - 218,20,98,117,105,108,116,105,110,95,109,111,100,117,108,101, - 95,110,97,109,101,115,218,11,73,109,112,111,114,116,69,114, - 114,111,114,114,45,0,0,0,169,2,114,30,0,0,0,218, - 8,102,117,108,108,110,97,109,101,169,1,218,3,102,120,110, - 114,10,0,0,0,114,11,0,0,0,218,25,95,114,101,113, - 117,105,114,101,115,95,98,117,105,108,116,105,110,95,119,114, - 97,112,112,101,114,232,0,0,0,115,10,0,0,0,0,1, - 10,1,10,1,2,255,6,2,122,52,95,114,101,113,117,105, - 114,101,115,95,98,117,105,108,116,105,110,46,60,108,111,99, - 97,108,115,62,46,95,114,101,113,117,105,114,101,115,95,98, - 117,105,108,116,105,110,95,119,114,97,112,112,101,114,169,1, - 114,12,0,0,0,41,2,114,83,0,0,0,114,84,0,0, - 0,114,10,0,0,0,114,82,0,0,0,114,11,0,0,0, - 218,17,95,114,101,113,117,105,114,101,115,95,98,117,105,108, - 116,105,110,230,0,0,0,115,6,0,0,0,0,2,12,5, - 10,1,114,86,0,0,0,99,1,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0, - 115,26,0,0,0,135,0,102,1,100,1,100,2,132,8,125, - 1,116,0,124,1,136,0,131,2,1,0,124,1,83,0,41, - 3,122,47,68,101,99,111,114,97,116,111,114,32,116,111,32, - 118,101,114,105,102,121,32,116,104,101,32,110,97,109,101,100, - 32,109,111,100,117,108,101,32,105,115,32,102,114,111,122,101, - 110,46,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,4,0,0,0,19,0,0,0,115,38,0,0,0, - 116,0,160,1,124,1,161,1,115,28,116,2,100,1,160,3, - 124,1,161,1,124,1,100,2,141,2,130,1,136,0,124,0, - 124,1,131,2,83,0,169,3,78,122,27,123,33,114,125,32, - 105,115,32,110,111,116,32,97,32,102,114,111,122,101,110,32, - 109,111,100,117,108,101,114,16,0,0,0,41,4,114,57,0, - 0,0,218,9,105,115,95,102,114,111,122,101,110,114,79,0, - 0,0,114,45,0,0,0,114,80,0,0,0,114,82,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,24,95,114,101, - 113,117,105,114,101,115,95,102,114,111,122,101,110,95,119,114, - 97,112,112,101,114,243,0,0,0,115,10,0,0,0,0,1, - 10,1,10,1,2,255,6,2,122,50,95,114,101,113,117,105, - 114,101,115,95,102,114,111,122,101,110,46,60,108,111,99,97, - 108,115,62,46,95,114,101,113,117,105,114,101,115,95,102,114, - 111,122,101,110,95,119,114,97,112,112,101,114,114,85,0,0, - 0,41,2,114,83,0,0,0,114,89,0,0,0,114,10,0, - 0,0,114,82,0,0,0,114,11,0,0,0,218,16,95,114, - 101,113,117,105,114,101,115,95,102,114,111,122,101,110,241,0, - 0,0,115,6,0,0,0,0,2,12,5,10,1,114,90,0, - 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,3,0,0,0,67,0,0,0,115,62,0,0,0, - 116,0,124,1,124,0,131,2,125,2,124,1,116,1,106,2, - 107,6,114,50,116,1,106,2,124,1,25,0,125,3,116,3, - 124,2,124,3,131,2,1,0,116,1,106,2,124,1,25,0, - 83,0,116,4,124,2,131,1,83,0,100,1,83,0,41,2, - 122,128,76,111,97,100,32,116,104,101,32,115,112,101,99,105, - 102,105,101,100,32,109,111,100,117,108,101,32,105,110,116,111, - 32,115,121,115,46,109,111,100,117,108,101,115,32,97,110,100, - 32,114,101,116,117,114,110,32,105,116,46,10,10,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,108,111,97,100,101,114,46,101,120,101,99,95,109,111,100, - 117,108,101,32,105,110,115,116,101,97,100,46,10,10,32,32, - 32,32,78,41,5,218,16,115,112,101,99,95,102,114,111,109, - 95,108,111,97,100,101,114,114,15,0,0,0,218,7,109,111, - 100,117,108,101,115,218,5,95,101,120,101,99,218,5,95,108, - 111,97,100,41,4,114,30,0,0,0,114,81,0,0,0,218, - 4,115,112,101,99,218,6,109,111,100,117,108,101,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,17,95,108, - 111,97,100,95,109,111,100,117,108,101,95,115,104,105,109,253, - 0,0,0,115,12,0,0,0,0,6,10,1,10,1,10,1, - 10,1,10,2,114,97,0,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,5,0,0,0,8,0,0,0,67,0, - 0,0,115,226,0,0,0,116,0,124,0,100,1,100,0,131, - 3,125,1,116,1,124,1,100,2,131,2,114,56,122,12,124, - 1,160,2,124,0,161,1,87,0,83,0,4,0,116,3,107, - 10,114,54,1,0,1,0,1,0,89,0,110,2,88,0,122, - 10,124,0,106,4,125,2,87,0,110,20,4,0,116,5,107, - 10,114,86,1,0,1,0,1,0,89,0,110,18,88,0,124, - 2,100,0,107,9,114,104,116,6,124,2,131,1,83,0,122, - 10,124,0,106,7,125,3,87,0,110,24,4,0,116,5,107, - 10,114,138,1,0,1,0,1,0,100,3,125,3,89,0,110, - 2,88,0,122,10,124,0,106,8,125,4,87,0,110,58,4, - 0,116,5,107,10,114,208,1,0,1,0,1,0,124,1,100, - 0,107,8,114,188,100,4,160,9,124,3,161,1,6,0,89, - 0,83,0,100,5,160,9,124,3,124,1,161,2,6,0,89, - 0,83,0,89,0,110,14,88,0,100,6,160,9,124,3,124, - 4,161,2,83,0,100,0,83,0,41,7,78,218,10,95,95, - 108,111,97,100,101,114,95,95,218,11,109,111,100,117,108,101, - 95,114,101,112,114,250,1,63,250,13,60,109,111,100,117,108, - 101,32,123,33,114,125,62,250,20,60,109,111,100,117,108,101, - 32,123,33,114,125,32,40,123,33,114,125,41,62,250,23,60, - 109,111,100,117,108,101,32,123,33,114,125,32,102,114,111,109, - 32,123,33,114,125,62,41,10,114,6,0,0,0,114,4,0, - 0,0,114,99,0,0,0,218,9,69,120,99,101,112,116,105, - 111,110,218,8,95,95,115,112,101,99,95,95,218,14,65,116, - 116,114,105,98,117,116,101,69,114,114,111,114,218,22,95,109, - 111,100,117,108,101,95,114,101,112,114,95,102,114,111,109,95, - 115,112,101,99,114,1,0,0,0,218,8,95,95,102,105,108, - 101,95,95,114,45,0,0,0,41,5,114,96,0,0,0,218, - 6,108,111,97,100,101,114,114,95,0,0,0,114,17,0,0, - 0,218,8,102,105,108,101,110,97,109,101,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,12,95,109,111,100, - 117,108,101,95,114,101,112,114,13,1,0,0,115,46,0,0, - 0,0,2,12,1,10,4,2,1,12,1,14,1,6,1,2, - 1,10,1,14,1,6,2,8,1,8,4,2,1,10,1,14, - 1,10,1,2,1,10,1,14,1,8,1,14,2,22,2,114, - 111,0,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,114,0, - 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, - 100,2,100,2,100,3,156,3,100,4,100,5,132,2,90,4, - 100,6,100,7,132,0,90,5,100,8,100,9,132,0,90,6, - 101,7,100,10,100,11,132,0,131,1,90,8,101,8,106,9, - 100,12,100,11,132,0,131,1,90,8,101,7,100,13,100,14, - 132,0,131,1,90,10,101,7,100,15,100,16,132,0,131,1, - 90,11,101,11,106,9,100,17,100,16,132,0,131,1,90,11, - 100,2,83,0,41,18,218,10,77,111,100,117,108,101,83,112, - 101,99,97,208,5,0,0,84,104,101,32,115,112,101,99,105, - 102,105,99,97,116,105,111,110,32,102,111,114,32,97,32,109, - 111,100,117,108,101,44,32,117,115,101,100,32,102,111,114,32, - 108,111,97,100,105,110,103,46,10,10,32,32,32,32,65,32, - 109,111,100,117,108,101,39,115,32,115,112,101,99,32,105,115, - 32,116,104,101,32,115,111,117,114,99,101,32,102,111,114,32, - 105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117, - 116,32,116,104,101,32,109,111,100,117,108,101,46,32,32,70, - 111,114,10,32,32,32,32,100,97,116,97,32,97,115,115,111, - 99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32, - 109,111,100,117,108,101,44,32,105,110,99,108,117,100,105,110, - 103,32,115,111,117,114,99,101,44,32,117,115,101,32,116,104, - 101,32,115,112,101,99,39,115,10,32,32,32,32,108,111,97, - 100,101,114,46,10,10,32,32,32,32,96,110,97,109,101,96, - 32,105,115,32,116,104,101,32,97,98,115,111,108,117,116,101, - 32,110,97,109,101,32,111,102,32,116,104,101,32,109,111,100, - 117,108,101,46,32,32,96,108,111,97,100,101,114,96,32,105, - 115,32,116,104,101,32,108,111,97,100,101,114,10,32,32,32, - 32,116,111,32,117,115,101,32,119,104,101,110,32,108,111,97, - 100,105,110,103,32,116,104,101,32,109,111,100,117,108,101,46, - 32,32,96,112,97,114,101,110,116,96,32,105,115,32,116,104, - 101,32,110,97,109,101,32,111,102,32,116,104,101,10,32,32, - 32,32,112,97,99,107,97,103,101,32,116,104,101,32,109,111, - 100,117,108,101,32,105,115,32,105,110,46,32,32,84,104,101, - 32,112,97,114,101,110,116,32,105,115,32,100,101,114,105,118, - 101,100,32,102,114,111,109,32,116,104,101,32,110,97,109,101, - 46,10,10,32,32,32,32,96,105,115,95,112,97,99,107,97, - 103,101,96,32,100,101,116,101,114,109,105,110,101,115,32,105, - 102,32,116,104,101,32,109,111,100,117,108,101,32,105,115,32, - 99,111,110,115,105,100,101,114,101,100,32,97,32,112,97,99, - 107,97,103,101,32,111,114,10,32,32,32,32,110,111,116,46, - 32,32,79,110,32,109,111,100,117,108,101,115,32,116,104,105, - 115,32,105,115,32,114,101,102,108,101,99,116,101,100,32,98, - 121,32,116,104,101,32,96,95,95,112,97,116,104,95,95,96, - 32,97,116,116,114,105,98,117,116,101,46,10,10,32,32,32, - 32,96,111,114,105,103,105,110,96,32,105,115,32,116,104,101, - 32,115,112,101,99,105,102,105,99,32,108,111,99,97,116,105, - 111,110,32,117,115,101,100,32,98,121,32,116,104,101,32,108, - 111,97,100,101,114,32,102,114,111,109,32,119,104,105,99,104, - 32,116,111,10,32,32,32,32,108,111,97,100,32,116,104,101, - 32,109,111,100,117,108,101,44,32,105,102,32,116,104,97,116, - 32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32, - 97,118,97,105,108,97,98,108,101,46,32,32,87,104,101,110, - 32,102,105,108,101,110,97,109,101,32,105,115,10,32,32,32, - 32,115,101,116,44,32,111,114,105,103,105,110,32,119,105,108, - 108,32,109,97,116,99,104,46,10,10,32,32,32,32,96,104, - 97,115,95,108,111,99,97,116,105,111,110,96,32,105,110,100, - 105,99,97,116,101,115,32,116,104,97,116,32,97,32,115,112, - 101,99,39,115,32,34,111,114,105,103,105,110,34,32,114,101, - 102,108,101,99,116,115,32,97,32,108,111,99,97,116,105,111, - 110,46,10,32,32,32,32,87,104,101,110,32,116,104,105,115, - 32,105,115,32,84,114,117,101,44,32,96,95,95,102,105,108, - 101,95,95,96,32,97,116,116,114,105,98,117,116,101,32,111, - 102,32,116,104,101,32,109,111,100,117,108,101,32,105,115,32, - 115,101,116,46,10,10,32,32,32,32,96,99,97,99,104,101, - 100,96,32,105,115,32,116,104,101,32,108,111,99,97,116,105, - 111,110,32,111,102,32,116,104,101,32,99,97,99,104,101,100, - 32,98,121,116,101,99,111,100,101,32,102,105,108,101,44,32, - 105,102,32,97,110,121,46,32,32,73,116,10,32,32,32,32, - 99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116, - 104,101,32,96,95,95,99,97,99,104,101,100,95,95,96,32, - 97,116,116,114,105,98,117,116,101,46,10,10,32,32,32,32, - 96,115,117,98,109,111,100,117,108,101,95,115,101,97,114,99, - 104,95,108,111,99,97,116,105,111,110,115,96,32,105,115,32, - 116,104,101,32,115,101,113,117,101,110,99,101,32,111,102,32, - 112,97,116,104,32,101,110,116,114,105,101,115,32,116,111,10, - 32,32,32,32,115,101,97,114,99,104,32,119,104,101,110,32, - 105,109,112,111,114,116,105,110,103,32,115,117,98,109,111,100, - 117,108,101,115,46,32,32,73,102,32,115,101,116,44,32,105, - 115,95,112,97,99,107,97,103,101,32,115,104,111,117,108,100, - 32,98,101,10,32,32,32,32,84,114,117,101,45,45,97,110, - 100,32,70,97,108,115,101,32,111,116,104,101,114,119,105,115, - 101,46,10,10,32,32,32,32,80,97,99,107,97,103,101,115, - 32,97,114,101,32,115,105,109,112,108,121,32,109,111,100,117, - 108,101,115,32,116,104,97,116,32,40,109,97,121,41,32,104, - 97,118,101,32,115,117,98,109,111,100,117,108,101,115,46,32, - 32,73,102,32,97,32,115,112,101,99,10,32,32,32,32,104, - 97,115,32,97,32,110,111,110,45,78,111,110,101,32,118,97, - 108,117,101,32,105,110,32,96,115,117,98,109,111,100,117,108, - 101,95,115,101,97,114,99,104,95,108,111,99,97,116,105,111, - 110,115,96,44,32,116,104,101,32,105,109,112,111,114,116,10, - 32,32,32,32,115,121,115,116,101,109,32,119,105,108,108,32, - 99,111,110,115,105,100,101,114,32,109,111,100,117,108,101,115, - 32,108,111,97,100,101,100,32,102,114,111,109,32,116,104,101, - 32,115,112,101,99,32,97,115,32,112,97,99,107,97,103,101, - 115,46,10,10,32,32,32,32,79,110,108,121,32,102,105,110, - 100,101,114,115,32,40,115,101,101,32,105,109,112,111,114,116, - 108,105,98,46,97,98,99,46,77,101,116,97,80,97,116,104, - 70,105,110,100,101,114,32,97,110,100,10,32,32,32,32,105, - 109,112,111,114,116,108,105,98,46,97,98,99,46,80,97,116, - 104,69,110,116,114,121,70,105,110,100,101,114,41,32,115,104, - 111,117,108,100,32,109,111,100,105,102,121,32,77,111,100,117, - 108,101,83,112,101,99,32,105,110,115,116,97,110,99,101,115, - 46,10,10,32,32,32,32,78,41,3,218,6,111,114,105,103, - 105,110,218,12,108,111,97,100,101,114,95,115,116,97,116,101, - 218,10,105,115,95,112,97,99,107,97,103,101,99,3,0,0, - 0,0,0,0,0,3,0,0,0,6,0,0,0,2,0,0, - 0,67,0,0,0,115,54,0,0,0,124,1,124,0,95,0, - 124,2,124,0,95,1,124,3,124,0,95,2,124,4,124,0, - 95,3,124,5,114,32,103,0,110,2,100,0,124,0,95,4, - 100,1,124,0,95,5,100,0,124,0,95,6,100,0,83,0, - 169,2,78,70,41,7,114,17,0,0,0,114,109,0,0,0, - 114,113,0,0,0,114,114,0,0,0,218,26,115,117,98,109, - 111,100,117,108,101,95,115,101,97,114,99,104,95,108,111,99, - 97,116,105,111,110,115,218,13,95,115,101,116,95,102,105,108, - 101,97,116,116,114,218,7,95,99,97,99,104,101,100,41,6, - 114,30,0,0,0,114,17,0,0,0,114,109,0,0,0,114, - 113,0,0,0,114,114,0,0,0,114,115,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,31,0, - 0,0,86,1,0,0,115,14,0,0,0,0,2,6,1,6, - 1,6,1,6,1,14,3,6,1,122,19,77,111,100,117,108, - 101,83,112,101,99,46,95,95,105,110,105,116,95,95,99,1, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,6, - 0,0,0,67,0,0,0,115,102,0,0,0,100,1,160,0, - 124,0,106,1,161,1,100,2,160,0,124,0,106,2,161,1, - 103,2,125,1,124,0,106,3,100,0,107,9,114,52,124,1, - 160,4,100,3,160,0,124,0,106,3,161,1,161,1,1,0, - 124,0,106,5,100,0,107,9,114,80,124,1,160,4,100,4, - 160,0,124,0,106,5,161,1,161,1,1,0,100,5,160,0, - 124,0,106,6,106,7,100,6,160,8,124,1,161,1,161,2, - 83,0,41,7,78,122,9,110,97,109,101,61,123,33,114,125, - 122,11,108,111,97,100,101,114,61,123,33,114,125,122,11,111, - 114,105,103,105,110,61,123,33,114,125,122,29,115,117,98,109, + 83,0,169,3,78,122,27,123,33,114,125,32,105,115,32,110, + 111,116,32,97,32,102,114,111,122,101,110,32,109,111,100,117, + 108,101,114,16,0,0,0,41,4,114,58,0,0,0,218,9, + 105,115,95,102,114,111,122,101,110,114,80,0,0,0,114,46, + 0,0,0,114,81,0,0,0,114,83,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,24,95,114,101,113,117,105,114, + 101,115,95,102,114,111,122,101,110,95,119,114,97,112,112,101, + 114,252,0,0,0,115,10,0,0,0,0,1,10,1,10,1, + 2,255,6,2,122,50,95,114,101,113,117,105,114,101,115,95, + 102,114,111,122,101,110,46,60,108,111,99,97,108,115,62,46, + 95,114,101,113,117,105,114,101,115,95,102,114,111,122,101,110, + 95,119,114,97,112,112,101,114,114,86,0,0,0,41,2,114, + 84,0,0,0,114,90,0,0,0,114,10,0,0,0,114,83, + 0,0,0,114,11,0,0,0,218,16,95,114,101,113,117,105, + 114,101,115,95,102,114,111,122,101,110,250,0,0,0,115,6, + 0,0,0,0,2,12,5,10,1,114,91,0,0,0,99,2, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,3, + 0,0,0,67,0,0,0,115,62,0,0,0,116,0,124,1, + 124,0,131,2,125,2,124,1,116,1,106,2,118,0,114,50, + 116,1,106,2,124,1,25,0,125,3,116,3,124,2,124,3, + 131,2,1,0,116,1,106,2,124,1,25,0,83,0,116,4, + 124,2,131,1,83,0,100,1,83,0,41,2,122,128,76,111, + 97,100,32,116,104,101,32,115,112,101,99,105,102,105,101,100, + 32,109,111,100,117,108,101,32,105,110,116,111,32,115,121,115, + 46,109,111,100,117,108,101,115,32,97,110,100,32,114,101,116, + 117,114,110,32,105,116,46,10,10,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,108,111,97, + 100,101,114,46,101,120,101,99,95,109,111,100,117,108,101,32, + 105,110,115,116,101,97,100,46,10,10,32,32,32,32,78,41, + 5,218,16,115,112,101,99,95,102,114,111,109,95,108,111,97, + 100,101,114,114,15,0,0,0,218,7,109,111,100,117,108,101, + 115,218,5,95,101,120,101,99,218,5,95,108,111,97,100,41, + 4,114,30,0,0,0,114,82,0,0,0,218,4,115,112,101, + 99,218,6,109,111,100,117,108,101,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,218,17,95,108,111,97,100,95, + 109,111,100,117,108,101,95,115,104,105,109,6,1,0,0,115, + 12,0,0,0,0,6,10,1,10,1,10,1,10,1,10,2, + 114,98,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,5,0,0,0,8,0,0,0,67,0,0,0,115,218, + 0,0,0,116,0,124,0,100,1,100,0,131,3,125,1,116, + 1,124,1,100,2,131,2,114,54,122,12,124,1,160,2,124, + 0,161,1,87,0,83,0,4,0,116,3,121,52,1,0,1, + 0,1,0,89,0,110,2,48,0,122,10,124,0,106,4,125, + 2,87,0,110,18,4,0,116,5,121,82,1,0,1,0,1, + 0,89,0,110,18,48,0,124,2,100,0,117,1,114,100,116, + 6,124,2,131,1,83,0,122,10,124,0,106,7,125,3,87, + 0,110,22,4,0,116,5,121,132,1,0,1,0,1,0,100, + 3,125,3,89,0,110,2,48,0,122,10,124,0,106,8,125, + 4,87,0,110,56,4,0,116,5,121,200,1,0,1,0,1, + 0,124,1,100,0,117,0,114,180,100,4,160,9,124,3,161, + 1,6,0,89,0,83,0,100,5,160,9,124,3,124,1,161, + 2,6,0,89,0,83,0,89,0,110,14,48,0,100,6,160, + 9,124,3,124,4,161,2,83,0,100,0,83,0,41,7,78, + 218,10,95,95,108,111,97,100,101,114,95,95,218,11,109,111, + 100,117,108,101,95,114,101,112,114,250,1,63,250,13,60,109, + 111,100,117,108,101,32,123,33,114,125,62,250,20,60,109,111, + 100,117,108,101,32,123,33,114,125,32,40,123,33,114,125,41, + 62,250,23,60,109,111,100,117,108,101,32,123,33,114,125,32, + 102,114,111,109,32,123,33,114,125,62,41,10,114,6,0,0, + 0,114,4,0,0,0,114,100,0,0,0,218,9,69,120,99, + 101,112,116,105,111,110,218,8,95,95,115,112,101,99,95,95, + 218,14,65,116,116,114,105,98,117,116,101,69,114,114,111,114, + 218,22,95,109,111,100,117,108,101,95,114,101,112,114,95,102, + 114,111,109,95,115,112,101,99,114,1,0,0,0,218,8,95, + 95,102,105,108,101,95,95,114,46,0,0,0,41,5,114,97, + 0,0,0,218,6,108,111,97,100,101,114,114,96,0,0,0, + 114,17,0,0,0,218,8,102,105,108,101,110,97,109,101,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,12, + 95,109,111,100,117,108,101,95,114,101,112,114,22,1,0,0, + 115,46,0,0,0,0,2,12,1,10,4,2,1,12,1,12, + 1,6,1,2,1,10,1,12,1,6,2,8,1,8,4,2, + 1,10,1,12,1,10,1,2,1,10,1,12,1,8,1,14, + 2,22,2,114,112,0,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,114,0,0,0,101,0,90,1,100,0,90,2,100,1, + 90,3,100,2,100,2,100,2,100,3,156,3,100,4,100,5, + 132,2,90,4,100,6,100,7,132,0,90,5,100,8,100,9, + 132,0,90,6,101,7,100,10,100,11,132,0,131,1,90,8, + 101,8,106,9,100,12,100,11,132,0,131,1,90,8,101,7, + 100,13,100,14,132,0,131,1,90,10,101,7,100,15,100,16, + 132,0,131,1,90,11,101,11,106,9,100,17,100,16,132,0, + 131,1,90,11,100,2,83,0,41,18,218,10,77,111,100,117, + 108,101,83,112,101,99,97,208,5,0,0,84,104,101,32,115, + 112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114, + 32,97,32,109,111,100,117,108,101,44,32,117,115,101,100,32, + 102,111,114,32,108,111,97,100,105,110,103,46,10,10,32,32, + 32,32,65,32,109,111,100,117,108,101,39,115,32,115,112,101, + 99,32,105,115,32,116,104,101,32,115,111,117,114,99,101,32, + 102,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32, + 97,98,111,117,116,32,116,104,101,32,109,111,100,117,108,101, + 46,32,32,70,111,114,10,32,32,32,32,100,97,116,97,32, + 97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32, + 116,104,101,32,109,111,100,117,108,101,44,32,105,110,99,108, + 117,100,105,110,103,32,115,111,117,114,99,101,44,32,117,115, + 101,32,116,104,101,32,115,112,101,99,39,115,10,32,32,32, + 32,108,111,97,100,101,114,46,10,10,32,32,32,32,96,110, + 97,109,101,96,32,105,115,32,116,104,101,32,97,98,115,111, + 108,117,116,101,32,110,97,109,101,32,111,102,32,116,104,101, + 32,109,111,100,117,108,101,46,32,32,96,108,111,97,100,101, + 114,96,32,105,115,32,116,104,101,32,108,111,97,100,101,114, + 10,32,32,32,32,116,111,32,117,115,101,32,119,104,101,110, + 32,108,111,97,100,105,110,103,32,116,104,101,32,109,111,100, + 117,108,101,46,32,32,96,112,97,114,101,110,116,96,32,105, + 115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104, + 101,10,32,32,32,32,112,97,99,107,97,103,101,32,116,104, + 101,32,109,111,100,117,108,101,32,105,115,32,105,110,46,32, + 32,84,104,101,32,112,97,114,101,110,116,32,105,115,32,100, + 101,114,105,118,101,100,32,102,114,111,109,32,116,104,101,32, + 110,97,109,101,46,10,10,32,32,32,32,96,105,115,95,112, + 97,99,107,97,103,101,96,32,100,101,116,101,114,109,105,110, + 101,115,32,105,102,32,116,104,101,32,109,111,100,117,108,101, + 32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97, + 32,112,97,99,107,97,103,101,32,111,114,10,32,32,32,32, + 110,111,116,46,32,32,79,110,32,109,111,100,117,108,101,115, + 32,116,104,105,115,32,105,115,32,114,101,102,108,101,99,116, + 101,100,32,98,121,32,116,104,101,32,96,95,95,112,97,116, + 104,95,95,96,32,97,116,116,114,105,98,117,116,101,46,10, + 10,32,32,32,32,96,111,114,105,103,105,110,96,32,105,115, + 32,116,104,101,32,115,112,101,99,105,102,105,99,32,108,111, + 99,97,116,105,111,110,32,117,115,101,100,32,98,121,32,116, + 104,101,32,108,111,97,100,101,114,32,102,114,111,109,32,119, + 104,105,99,104,32,116,111,10,32,32,32,32,108,111,97,100, + 32,116,104,101,32,109,111,100,117,108,101,44,32,105,102,32, + 116,104,97,116,32,105,110,102,111,114,109,97,116,105,111,110, + 32,105,115,32,97,118,97,105,108,97,98,108,101,46,32,32, + 87,104,101,110,32,102,105,108,101,110,97,109,101,32,105,115, + 10,32,32,32,32,115,101,116,44,32,111,114,105,103,105,110, + 32,119,105,108,108,32,109,97,116,99,104,46,10,10,32,32, + 32,32,96,104,97,115,95,108,111,99,97,116,105,111,110,96, + 32,105,110,100,105,99,97,116,101,115,32,116,104,97,116,32, + 97,32,115,112,101,99,39,115,32,34,111,114,105,103,105,110, + 34,32,114,101,102,108,101,99,116,115,32,97,32,108,111,99, + 97,116,105,111,110,46,10,32,32,32,32,87,104,101,110,32, + 116,104,105,115,32,105,115,32,84,114,117,101,44,32,96,95, + 95,102,105,108,101,95,95,96,32,97,116,116,114,105,98,117, + 116,101,32,111,102,32,116,104,101,32,109,111,100,117,108,101, + 32,105,115,32,115,101,116,46,10,10,32,32,32,32,96,99, + 97,99,104,101,100,96,32,105,115,32,116,104,101,32,108,111, + 99,97,116,105,111,110,32,111,102,32,116,104,101,32,99,97, + 99,104,101,100,32,98,121,116,101,99,111,100,101,32,102,105, + 108,101,44,32,105,102,32,97,110,121,46,32,32,73,116,10, + 32,32,32,32,99,111,114,114,101,115,112,111,110,100,115,32, + 116,111,32,116,104,101,32,96,95,95,99,97,99,104,101,100, + 95,95,96,32,97,116,116,114,105,98,117,116,101,46,10,10, + 32,32,32,32,96,115,117,98,109,111,100,117,108,101,95,115, + 101,97,114,99,104,95,108,111,99,97,116,105,111,110,115,96, + 32,105,115,32,116,104,101,32,115,101,113,117,101,110,99,101, + 32,111,102,32,112,97,116,104,32,101,110,116,114,105,101,115, + 32,116,111,10,32,32,32,32,115,101,97,114,99,104,32,119, + 104,101,110,32,105,109,112,111,114,116,105,110,103,32,115,117, + 98,109,111,100,117,108,101,115,46,32,32,73,102,32,115,101, + 116,44,32,105,115,95,112,97,99,107,97,103,101,32,115,104, + 111,117,108,100,32,98,101,10,32,32,32,32,84,114,117,101, + 45,45,97,110,100,32,70,97,108,115,101,32,111,116,104,101, + 114,119,105,115,101,46,10,10,32,32,32,32,80,97,99,107, + 97,103,101,115,32,97,114,101,32,115,105,109,112,108,121,32, + 109,111,100,117,108,101,115,32,116,104,97,116,32,40,109,97, + 121,41,32,104,97,118,101,32,115,117,98,109,111,100,117,108, + 101,115,46,32,32,73,102,32,97,32,115,112,101,99,10,32, + 32,32,32,104,97,115,32,97,32,110,111,110,45,78,111,110, + 101,32,118,97,108,117,101,32,105,110,32,96,115,117,98,109, 111,100,117,108,101,95,115,101,97,114,99,104,95,108,111,99, - 97,116,105,111,110,115,61,123,125,122,6,123,125,40,123,125, - 41,122,2,44,32,41,9,114,45,0,0,0,114,17,0,0, - 0,114,109,0,0,0,114,113,0,0,0,218,6,97,112,112, - 101,110,100,114,117,0,0,0,218,9,95,95,99,108,97,115, - 115,95,95,114,1,0,0,0,218,4,106,111,105,110,41,2, - 114,30,0,0,0,114,55,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,48,0,0,0,98,1, - 0,0,115,20,0,0,0,0,1,10,1,10,255,4,2,10, - 1,18,1,10,1,8,1,4,255,6,2,122,19,77,111,100, - 117,108,101,83,112,101,99,46,95,95,114,101,112,114,95,95, - 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,106,0,0,0,124,0, - 106,0,125,2,122,72,124,0,106,1,124,1,106,1,107,2, - 111,76,124,0,106,2,124,1,106,2,107,2,111,76,124,0, - 106,3,124,1,106,3,107,2,111,76,124,2,124,1,106,0, - 107,2,111,76,124,0,106,4,124,1,106,4,107,2,111,76, - 124,0,106,5,124,1,106,5,107,2,87,0,83,0,4,0, - 116,6,107,10,114,100,1,0,1,0,1,0,89,0,100,1, - 83,0,88,0,100,0,83,0,114,116,0,0,0,41,7,114, - 117,0,0,0,114,17,0,0,0,114,109,0,0,0,114,113, - 0,0,0,218,6,99,97,99,104,101,100,218,12,104,97,115, - 95,108,111,99,97,116,105,111,110,114,106,0,0,0,41,3, - 114,30,0,0,0,90,5,111,116,104,101,114,90,4,115,109, - 115,108,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,6,95,95,101,113,95,95,108,1,0,0,115,30,0, - 0,0,0,1,6,1,2,1,12,1,10,255,2,2,10,254, - 2,3,8,253,2,4,10,252,2,5,10,251,4,6,14,1, - 122,17,77,111,100,117,108,101,83,112,101,99,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,58,0,0, - 0,124,0,106,0,100,0,107,8,114,52,124,0,106,1,100, - 0,107,9,114,52,124,0,106,2,114,52,116,3,100,0,107, - 8,114,38,116,4,130,1,116,3,160,5,124,0,106,1,161, - 1,124,0,95,0,124,0,106,0,83,0,114,13,0,0,0, - 41,6,114,119,0,0,0,114,113,0,0,0,114,118,0,0, - 0,218,19,95,98,111,111,116,115,116,114,97,112,95,101,120, - 116,101,114,110,97,108,218,19,78,111,116,73,109,112,108,101, - 109,101,110,116,101,100,69,114,114,111,114,90,11,95,103,101, - 116,95,99,97,99,104,101,100,114,47,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,123,0,0, - 0,120,1,0,0,115,12,0,0,0,0,2,10,1,16,1, - 8,1,4,1,14,1,122,17,77,111,100,117,108,101,83,112, - 101,99,46,99,97,99,104,101,100,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,10,0,0,0,124,1,124,0,95,0,100,0,83, - 0,114,13,0,0,0,41,1,114,119,0,0,0,41,2,114, - 30,0,0,0,114,123,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,123,0,0,0,129,1,0, - 0,115,2,0,0,0,0,2,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,36,0,0,0,124,0,106,0,100,1,107,8,114,26, - 124,0,106,1,160,2,100,2,161,1,100,3,25,0,83,0, - 124,0,106,1,83,0,100,1,83,0,41,4,122,32,84,104, - 101,32,110,97,109,101,32,111,102,32,116,104,101,32,109,111, - 100,117,108,101,39,115,32,112,97,114,101,110,116,46,78,218, - 1,46,114,22,0,0,0,41,3,114,117,0,0,0,114,17, - 0,0,0,218,10,114,112,97,114,116,105,116,105,111,110,114, - 47,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,6,112,97,114,101,110,116,133,1,0,0,115, - 6,0,0,0,0,3,10,1,16,2,122,17,77,111,100,117, - 108,101,83,112,101,99,46,112,97,114,101,110,116,99,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0, - 0,0,67,0,0,0,115,6,0,0,0,124,0,106,0,83, - 0,114,13,0,0,0,41,1,114,118,0,0,0,114,47,0, + 97,116,105,111,110,115,96,44,32,116,104,101,32,105,109,112, + 111,114,116,10,32,32,32,32,115,121,115,116,101,109,32,119, + 105,108,108,32,99,111,110,115,105,100,101,114,32,109,111,100, + 117,108,101,115,32,108,111,97,100,101,100,32,102,114,111,109, + 32,116,104,101,32,115,112,101,99,32,97,115,32,112,97,99, + 107,97,103,101,115,46,10,10,32,32,32,32,79,110,108,121, + 32,102,105,110,100,101,114,115,32,40,115,101,101,32,105,109, + 112,111,114,116,108,105,98,46,97,98,99,46,77,101,116,97, + 80,97,116,104,70,105,110,100,101,114,32,97,110,100,10,32, + 32,32,32,105,109,112,111,114,116,108,105,98,46,97,98,99, + 46,80,97,116,104,69,110,116,114,121,70,105,110,100,101,114, + 41,32,115,104,111,117,108,100,32,109,111,100,105,102,121,32, + 77,111,100,117,108,101,83,112,101,99,32,105,110,115,116,97, + 110,99,101,115,46,10,10,32,32,32,32,78,41,3,218,6, + 111,114,105,103,105,110,218,12,108,111,97,100,101,114,95,115, + 116,97,116,101,218,10,105,115,95,112,97,99,107,97,103,101, + 99,3,0,0,0,0,0,0,0,3,0,0,0,6,0,0, + 0,2,0,0,0,67,0,0,0,115,54,0,0,0,124,1, + 124,0,95,0,124,2,124,0,95,1,124,3,124,0,95,2, + 124,4,124,0,95,3,124,5,114,32,103,0,110,2,100,0, + 124,0,95,4,100,1,124,0,95,5,100,0,124,0,95,6, + 100,0,83,0,41,2,78,70,41,7,114,17,0,0,0,114, + 110,0,0,0,114,114,0,0,0,114,115,0,0,0,218,26, + 115,117,98,109,111,100,117,108,101,95,115,101,97,114,99,104, + 95,108,111,99,97,116,105,111,110,115,218,13,95,115,101,116, + 95,102,105,108,101,97,116,116,114,218,7,95,99,97,99,104, + 101,100,41,6,114,30,0,0,0,114,17,0,0,0,114,110, + 0,0,0,114,114,0,0,0,114,115,0,0,0,114,116,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,124,0,0,0,141,1,0,0,115,2,0,0,0,0, - 2,122,23,77,111,100,117,108,101,83,112,101,99,46,104,97, - 115,95,108,111,99,97,116,105,111,110,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,14,0,0,0,116,0,124,1,131,1,124,0, - 95,1,100,0,83,0,114,13,0,0,0,41,2,218,4,98, - 111,111,108,114,118,0,0,0,41,2,114,30,0,0,0,218, - 5,118,97,108,117,101,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,124,0,0,0,145,1,0,0,115,2, - 0,0,0,0,2,41,12,114,1,0,0,0,114,0,0,0, - 0,114,2,0,0,0,114,3,0,0,0,114,31,0,0,0, - 114,48,0,0,0,114,125,0,0,0,218,8,112,114,111,112, - 101,114,116,121,114,123,0,0,0,218,6,115,101,116,116,101, - 114,114,130,0,0,0,114,124,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 112,0,0,0,49,1,0,0,115,32,0,0,0,8,1,4, - 36,4,1,2,255,12,12,8,10,8,12,2,1,10,8,4, - 1,10,3,2,1,10,7,2,1,10,3,4,1,114,112,0, - 0,0,169,2,114,113,0,0,0,114,115,0,0,0,99,2, - 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,8, - 0,0,0,67,0,0,0,115,154,0,0,0,116,0,124,1, - 100,1,131,2,114,74,116,1,100,2,107,8,114,22,116,2, - 130,1,116,1,106,3,125,4,124,3,100,2,107,8,114,48, - 124,4,124,0,124,1,100,3,141,2,83,0,124,3,114,56, - 103,0,110,2,100,2,125,5,124,4,124,0,124,1,124,5, - 100,4,141,3,83,0,124,3,100,2,107,8,114,138,116,0, - 124,1,100,5,131,2,114,134,122,14,124,1,160,4,124,0, - 161,1,125,3,87,0,113,138,4,0,116,5,107,10,114,130, - 1,0,1,0,1,0,100,2,125,3,89,0,113,138,88,0, - 110,4,100,6,125,3,116,6,124,0,124,1,124,2,124,3, - 100,7,141,4,83,0,41,8,122,53,82,101,116,117,114,110, - 32,97,32,109,111,100,117,108,101,32,115,112,101,99,32,98, - 97,115,101,100,32,111,110,32,118,97,114,105,111,117,115,32, - 108,111,97,100,101,114,32,109,101,116,104,111,100,115,46,90, - 12,103,101,116,95,102,105,108,101,110,97,109,101,78,41,1, - 114,109,0,0,0,41,2,114,109,0,0,0,114,117,0,0, - 0,114,115,0,0,0,70,114,135,0,0,0,41,7,114,4, - 0,0,0,114,126,0,0,0,114,127,0,0,0,218,23,115, - 112,101,99,95,102,114,111,109,95,102,105,108,101,95,108,111, - 99,97,116,105,111,110,114,115,0,0,0,114,79,0,0,0, - 114,112,0,0,0,41,6,114,17,0,0,0,114,109,0,0, - 0,114,113,0,0,0,114,115,0,0,0,114,136,0,0,0, - 90,6,115,101,97,114,99,104,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,91,0,0,0,150,1,0,0, - 115,36,0,0,0,0,2,10,1,8,1,4,1,6,2,8, - 1,12,1,12,1,6,1,2,255,6,3,8,1,10,1,2, - 1,14,1,14,1,12,3,4,2,114,91,0,0,0,99,3, - 0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,8, - 0,0,0,67,0,0,0,115,56,1,0,0,122,10,124,0, - 106,0,125,3,87,0,110,20,4,0,116,1,107,10,114,30, - 1,0,1,0,1,0,89,0,110,14,88,0,124,3,100,0, - 107,9,114,44,124,3,83,0,124,0,106,2,125,4,124,1, - 100,0,107,8,114,90,122,10,124,0,106,3,125,1,87,0, - 110,20,4,0,116,1,107,10,114,88,1,0,1,0,1,0, - 89,0,110,2,88,0,122,10,124,0,106,4,125,5,87,0, - 110,24,4,0,116,1,107,10,114,124,1,0,1,0,1,0, - 100,0,125,5,89,0,110,2,88,0,124,2,100,0,107,8, - 114,184,124,5,100,0,107,8,114,180,122,10,124,1,106,5, - 125,2,87,0,113,184,4,0,116,1,107,10,114,176,1,0, - 1,0,1,0,100,0,125,2,89,0,113,184,88,0,110,4, - 124,5,125,2,122,10,124,0,106,6,125,6,87,0,110,24, - 4,0,116,1,107,10,114,218,1,0,1,0,1,0,100,0, - 125,6,89,0,110,2,88,0,122,14,116,7,124,0,106,8, - 131,1,125,7,87,0,110,26,4,0,116,1,107,10,144,1, - 114,4,1,0,1,0,1,0,100,0,125,7,89,0,110,2, - 88,0,116,9,124,4,124,1,124,2,100,1,141,3,125,3, - 124,5,100,0,107,8,144,1,114,34,100,2,110,2,100,3, - 124,3,95,10,124,6,124,3,95,11,124,7,124,3,95,12, - 124,3,83,0,41,4,78,169,1,114,113,0,0,0,70,84, - 41,13,114,105,0,0,0,114,106,0,0,0,114,1,0,0, - 0,114,98,0,0,0,114,108,0,0,0,218,7,95,79,82, - 73,71,73,78,218,10,95,95,99,97,99,104,101,100,95,95, - 218,4,108,105,115,116,218,8,95,95,112,97,116,104,95,95, - 114,112,0,0,0,114,118,0,0,0,114,123,0,0,0,114, - 117,0,0,0,41,8,114,96,0,0,0,114,109,0,0,0, - 114,113,0,0,0,114,95,0,0,0,114,17,0,0,0,90, - 8,108,111,99,97,116,105,111,110,114,123,0,0,0,114,117, + 0,114,31,0,0,0,95,1,0,0,115,14,0,0,0,0, + 2,6,1,6,1,6,1,6,1,14,3,6,1,122,19,77, + 111,100,117,108,101,83,112,101,99,46,95,95,105,110,105,116, + 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,6,0,0,0,67,0,0,0,115,102,0,0,0, + 100,1,160,0,124,0,106,1,161,1,100,2,160,0,124,0, + 106,2,161,1,103,2,125,1,124,0,106,3,100,0,117,1, + 114,52,124,1,160,4,100,3,160,0,124,0,106,3,161,1, + 161,1,1,0,124,0,106,5,100,0,117,1,114,80,124,1, + 160,4,100,4,160,0,124,0,106,5,161,1,161,1,1,0, + 100,5,160,0,124,0,106,6,106,7,100,6,160,8,124,1, + 161,1,161,2,83,0,41,7,78,122,9,110,97,109,101,61, + 123,33,114,125,122,11,108,111,97,100,101,114,61,123,33,114, + 125,122,11,111,114,105,103,105,110,61,123,33,114,125,122,29, + 115,117,98,109,111,100,117,108,101,95,115,101,97,114,99,104, + 95,108,111,99,97,116,105,111,110,115,61,123,125,122,6,123, + 125,40,123,125,41,122,2,44,32,41,9,114,46,0,0,0, + 114,17,0,0,0,114,110,0,0,0,114,114,0,0,0,218, + 6,97,112,112,101,110,100,114,117,0,0,0,218,9,95,95, + 99,108,97,115,115,95,95,114,1,0,0,0,218,4,106,111, + 105,110,41,2,114,30,0,0,0,114,56,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,49,0, + 0,0,107,1,0,0,115,20,0,0,0,0,1,10,1,10, + 255,4,2,10,1,18,1,10,1,8,1,4,255,6,2,122, + 19,77,111,100,117,108,101,83,112,101,99,46,95,95,114,101, + 112,114,95,95,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,106,0, + 0,0,124,0,106,0,125,2,122,72,124,0,106,1,124,1, + 106,1,107,2,111,76,124,0,106,2,124,1,106,2,107,2, + 111,76,124,0,106,3,124,1,106,3,107,2,111,76,124,2, + 124,1,106,0,107,2,111,76,124,0,106,4,124,1,106,4, + 107,2,111,76,124,0,106,5,124,1,106,5,107,2,87,0, + 83,0,4,0,116,6,121,100,1,0,1,0,1,0,116,7, + 6,0,89,0,83,0,48,0,100,0,83,0,114,13,0,0, + 0,41,8,114,117,0,0,0,114,17,0,0,0,114,110,0, + 0,0,114,114,0,0,0,218,6,99,97,99,104,101,100,218, + 12,104,97,115,95,108,111,99,97,116,105,111,110,114,107,0, + 0,0,218,14,78,111,116,73,109,112,108,101,109,101,110,116, + 101,100,41,3,114,30,0,0,0,90,5,111,116,104,101,114, + 90,4,115,109,115,108,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,218,6,95,95,101,113,95,95,117,1,0, + 0,115,30,0,0,0,0,1,6,1,2,1,12,1,10,255, + 2,2,10,254,2,3,8,253,2,4,10,252,2,5,10,251, + 4,6,12,1,122,17,77,111,100,117,108,101,83,112,101,99, + 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,58,0,0,0,124,0,106,0,100,0,117,0,114,52,124, + 0,106,1,100,0,117,1,114,52,124,0,106,2,114,52,116, + 3,100,0,117,0,114,38,116,4,130,1,116,3,160,5,124, + 0,106,1,161,1,124,0,95,0,124,0,106,0,83,0,114, + 13,0,0,0,41,6,114,119,0,0,0,114,114,0,0,0, + 114,118,0,0,0,218,19,95,98,111,111,116,115,116,114,97, + 112,95,101,120,116,101,114,110,97,108,218,19,78,111,116,73, + 109,112,108,101,109,101,110,116,101,100,69,114,114,111,114,90, + 11,95,103,101,116,95,99,97,99,104,101,100,114,48,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,123,0,0,0,129,1,0,0,115,12,0,0,0,0,2, + 10,1,16,1,8,1,4,1,14,1,122,17,77,111,100,117, + 108,101,83,112,101,99,46,99,97,99,104,101,100,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,10,0,0,0,124,1,124,0,95, + 0,100,0,83,0,114,13,0,0,0,41,1,114,119,0,0, + 0,41,2,114,30,0,0,0,114,123,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,123,0,0, + 0,138,1,0,0,115,2,0,0,0,0,2,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,36,0,0,0,124,0,106,0,100,1, + 117,0,114,26,124,0,106,1,160,2,100,2,161,1,100,3, + 25,0,83,0,124,0,106,1,83,0,100,1,83,0,41,4, + 122,32,84,104,101,32,110,97,109,101,32,111,102,32,116,104, + 101,32,109,111,100,117,108,101,39,115,32,112,97,114,101,110, + 116,46,78,218,1,46,114,22,0,0,0,41,3,114,117,0, + 0,0,114,17,0,0,0,218,10,114,112,97,114,116,105,116, + 105,111,110,114,48,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,6,112,97,114,101,110,116,142, + 1,0,0,115,6,0,0,0,0,3,10,1,16,2,122,17, + 77,111,100,117,108,101,83,112,101,99,46,112,97,114,101,110, + 116,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,1,0,0,0,67,0,0,0,115,6,0,0,0,124, + 0,106,0,83,0,114,13,0,0,0,41,1,114,118,0,0, + 0,114,48,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,124,0,0,0,150,1,0,0,115,2, + 0,0,0,0,2,122,23,77,111,100,117,108,101,83,112,101, + 99,46,104,97,115,95,108,111,99,97,116,105,111,110,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,14,0,0,0,116,0,124,1, + 131,1,124,0,95,1,100,0,83,0,114,13,0,0,0,41, + 2,218,4,98,111,111,108,114,118,0,0,0,41,2,114,30, + 0,0,0,218,5,118,97,108,117,101,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,124,0,0,0,154,1, + 0,0,115,2,0,0,0,0,2,41,12,114,1,0,0,0, + 114,0,0,0,0,114,2,0,0,0,114,3,0,0,0,114, + 31,0,0,0,114,49,0,0,0,114,126,0,0,0,218,8, + 112,114,111,112,101,114,116,121,114,123,0,0,0,218,6,115, + 101,116,116,101,114,114,131,0,0,0,114,124,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,113,0,0,0,58,1,0,0,115,32,0,0, + 0,8,1,4,36,4,1,2,255,12,12,8,10,8,12,2, + 1,10,8,4,1,10,3,2,1,10,7,2,1,10,3,4, + 1,114,113,0,0,0,169,2,114,114,0,0,0,114,116,0, + 0,0,99,2,0,0,0,0,0,0,0,2,0,0,0,6, + 0,0,0,8,0,0,0,67,0,0,0,115,152,0,0,0, + 116,0,124,1,100,1,131,2,114,74,116,1,100,2,117,0, + 114,22,116,2,130,1,116,1,106,3,125,4,124,3,100,2, + 117,0,114,48,124,4,124,0,124,1,100,3,141,2,83,0, + 124,3,114,56,103,0,110,2,100,2,125,5,124,4,124,0, + 124,1,124,5,100,4,141,3,83,0,124,3,100,2,117,0, + 114,136,116,0,124,1,100,5,131,2,114,132,122,14,124,1, + 160,4,124,0,161,1,125,3,87,0,113,136,4,0,116,5, + 121,128,1,0,1,0,1,0,100,2,125,3,89,0,113,136, + 48,0,110,4,100,6,125,3,116,6,124,0,124,1,124,2, + 124,3,100,7,141,4,83,0,41,8,122,53,82,101,116,117, + 114,110,32,97,32,109,111,100,117,108,101,32,115,112,101,99, + 32,98,97,115,101,100,32,111,110,32,118,97,114,105,111,117, + 115,32,108,111,97,100,101,114,32,109,101,116,104,111,100,115, + 46,90,12,103,101,116,95,102,105,108,101,110,97,109,101,78, + 41,1,114,110,0,0,0,41,2,114,110,0,0,0,114,117, + 0,0,0,114,116,0,0,0,70,114,136,0,0,0,41,7, + 114,4,0,0,0,114,127,0,0,0,114,128,0,0,0,218, + 23,115,112,101,99,95,102,114,111,109,95,102,105,108,101,95, + 108,111,99,97,116,105,111,110,114,116,0,0,0,114,80,0, + 0,0,114,113,0,0,0,41,6,114,17,0,0,0,114,110, + 0,0,0,114,114,0,0,0,114,116,0,0,0,114,137,0, + 0,0,90,6,115,101,97,114,99,104,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,92,0,0,0,159,1, + 0,0,115,36,0,0,0,0,2,10,1,8,1,4,1,6, + 2,8,1,12,1,12,1,6,1,2,255,6,3,8,1,10, + 1,2,1,14,1,12,1,12,3,4,2,114,92,0,0,0, + 99,3,0,0,0,0,0,0,0,0,0,0,0,8,0,0, + 0,8,0,0,0,67,0,0,0,115,42,1,0,0,122,10, + 124,0,106,0,125,3,87,0,110,18,4,0,116,1,121,28, + 1,0,1,0,1,0,89,0,110,14,48,0,124,3,100,0, + 117,1,114,42,124,3,83,0,124,0,106,2,125,4,124,1, + 100,0,117,0,114,86,122,10,124,0,106,3,125,1,87,0, + 110,18,4,0,116,1,121,84,1,0,1,0,1,0,89,0, + 110,2,48,0,122,10,124,0,106,4,125,5,87,0,110,22, + 4,0,116,1,121,118,1,0,1,0,1,0,100,0,125,5, + 89,0,110,2,48,0,124,2,100,0,117,0,114,176,124,5, + 100,0,117,0,114,172,122,10,124,1,106,5,125,2,87,0, + 113,176,4,0,116,1,121,168,1,0,1,0,1,0,100,0, + 125,2,89,0,113,176,48,0,110,4,124,5,125,2,122,10, + 124,0,106,6,125,6,87,0,110,22,4,0,116,1,121,208, + 1,0,1,0,1,0,100,0,125,6,89,0,110,2,48,0, + 122,14,116,7,124,0,106,8,131,1,125,7,87,0,110,22, + 4,0,116,1,121,246,1,0,1,0,1,0,100,0,125,7, + 89,0,110,2,48,0,116,9,124,4,124,1,124,2,100,1, + 141,3,125,3,124,5,100,0,117,0,144,1,114,20,100,2, + 110,2,100,3,124,3,95,10,124,6,124,3,95,11,124,7, + 124,3,95,12,124,3,83,0,41,4,78,169,1,114,114,0, + 0,0,70,84,41,13,114,106,0,0,0,114,107,0,0,0, + 114,1,0,0,0,114,99,0,0,0,114,109,0,0,0,218, + 7,95,79,82,73,71,73,78,218,10,95,95,99,97,99,104, + 101,100,95,95,218,4,108,105,115,116,218,8,95,95,112,97, + 116,104,95,95,114,113,0,0,0,114,118,0,0,0,114,123, + 0,0,0,114,117,0,0,0,41,8,114,97,0,0,0,114, + 110,0,0,0,114,114,0,0,0,114,96,0,0,0,114,17, + 0,0,0,90,8,108,111,99,97,116,105,111,110,114,123,0, + 0,0,114,117,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,17,95,115,112,101,99,95,102,114, + 111,109,95,109,111,100,117,108,101,185,1,0,0,115,72,0, + 0,0,0,2,2,1,10,1,12,1,6,2,8,1,4,2, + 6,1,8,1,2,1,10,1,12,2,6,1,2,1,10,1, + 12,1,10,1,8,1,8,1,2,1,10,1,12,1,12,2, + 4,1,2,1,10,1,12,1,10,1,2,1,14,1,12,1, + 10,2,14,1,20,1,6,1,6,1,114,143,0,0,0,70, + 169,1,218,8,111,118,101,114,114,105,100,101,99,2,0,0, + 0,0,0,0,0,1,0,0,0,5,0,0,0,8,0,0, + 0,67,0,0,0,115,210,1,0,0,124,2,115,20,116,0, + 124,1,100,1,100,0,131,3,100,0,117,0,114,52,122,12, + 124,0,106,1,124,1,95,2,87,0,110,18,4,0,116,3, + 121,50,1,0,1,0,1,0,89,0,110,2,48,0,124,2, + 115,72,116,0,124,1,100,2,100,0,131,3,100,0,117,0, + 114,174,124,0,106,4,125,3,124,3,100,0,117,0,114,144, + 124,0,106,5,100,0,117,1,114,144,116,6,100,0,117,0, + 114,108,116,7,130,1,116,6,106,8,125,4,124,4,160,9, + 124,4,161,1,125,3,124,0,106,5,124,3,95,10,124,3, + 124,0,95,4,100,0,124,1,95,11,122,10,124,3,124,1, + 95,12,87,0,110,18,4,0,116,3,121,172,1,0,1,0, + 1,0,89,0,110,2,48,0,124,2,115,194,116,0,124,1, + 100,3,100,0,131,3,100,0,117,0,114,226,122,12,124,0, + 106,13,124,1,95,14,87,0,110,18,4,0,116,3,121,224, + 1,0,1,0,1,0,89,0,110,2,48,0,122,10,124,0, + 124,1,95,15,87,0,110,18,4,0,116,3,121,254,1,0, + 1,0,1,0,89,0,110,2,48,0,124,2,144,1,115,24, + 116,0,124,1,100,4,100,0,131,3,100,0,117,0,144,1, + 114,70,124,0,106,5,100,0,117,1,144,1,114,70,122,12, + 124,0,106,5,124,1,95,16,87,0,110,20,4,0,116,3, + 144,1,121,68,1,0,1,0,1,0,89,0,110,2,48,0, + 124,0,106,17,144,1,114,206,124,2,144,1,115,102,116,0, + 124,1,100,5,100,0,131,3,100,0,117,0,144,1,114,136, + 122,12,124,0,106,18,124,1,95,11,87,0,110,20,4,0, + 116,3,144,1,121,134,1,0,1,0,1,0,89,0,110,2, + 48,0,124,2,144,1,115,160,116,0,124,1,100,6,100,0, + 131,3,100,0,117,0,144,1,114,206,124,0,106,19,100,0, + 117,1,144,1,114,206,122,12,124,0,106,19,124,1,95,20, + 87,0,110,20,4,0,116,3,144,1,121,204,1,0,1,0, + 1,0,89,0,110,2,48,0,124,1,83,0,41,7,78,114, + 1,0,0,0,114,99,0,0,0,218,11,95,95,112,97,99, + 107,97,103,101,95,95,114,142,0,0,0,114,109,0,0,0, + 114,140,0,0,0,41,21,114,6,0,0,0,114,17,0,0, + 0,114,1,0,0,0,114,107,0,0,0,114,110,0,0,0, + 114,117,0,0,0,114,127,0,0,0,114,128,0,0,0,218, + 16,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, + 114,218,7,95,95,110,101,119,95,95,90,5,95,112,97,116, + 104,114,109,0,0,0,114,99,0,0,0,114,131,0,0,0, + 114,146,0,0,0,114,106,0,0,0,114,142,0,0,0,114, + 124,0,0,0,114,114,0,0,0,114,123,0,0,0,114,140, + 0,0,0,41,5,114,96,0,0,0,114,97,0,0,0,114, + 145,0,0,0,114,110,0,0,0,114,147,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,218,18,95, + 105,110,105,116,95,109,111,100,117,108,101,95,97,116,116,114, + 115,230,1,0,0,115,96,0,0,0,0,4,20,1,2,1, + 12,1,12,1,6,2,20,1,6,1,8,2,10,1,8,1, + 4,1,6,2,10,1,8,1,6,11,6,1,2,1,10,1, + 12,1,6,2,20,1,2,1,12,1,12,1,6,2,2,1, + 10,1,12,1,6,2,24,1,12,1,2,1,12,1,14,1, + 6,2,8,1,24,1,2,1,12,1,14,1,6,2,24,1, + 12,1,2,1,12,1,14,1,6,1,114,149,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 3,0,0,0,67,0,0,0,115,82,0,0,0,100,1,125, + 1,116,0,124,0,106,1,100,2,131,2,114,30,124,0,106, + 1,160,2,124,0,161,1,125,1,110,20,116,0,124,0,106, + 1,100,3,131,2,114,50,116,3,100,4,131,1,130,1,124, + 1,100,1,117,0,114,68,116,4,124,0,106,5,131,1,125, + 1,116,6,124,0,124,1,131,2,1,0,124,1,83,0,41, + 5,122,43,67,114,101,97,116,101,32,97,32,109,111,100,117, + 108,101,32,98,97,115,101,100,32,111,110,32,116,104,101,32, + 112,114,111,118,105,100,101,100,32,115,112,101,99,46,78,218, + 13,99,114,101,97,116,101,95,109,111,100,117,108,101,218,11, + 101,120,101,99,95,109,111,100,117,108,101,122,66,108,111,97, + 100,101,114,115,32,116,104,97,116,32,100,101,102,105,110,101, + 32,101,120,101,99,95,109,111,100,117,108,101,40,41,32,109, + 117,115,116,32,97,108,115,111,32,100,101,102,105,110,101,32, + 99,114,101,97,116,101,95,109,111,100,117,108,101,40,41,41, + 7,114,4,0,0,0,114,110,0,0,0,114,150,0,0,0, + 114,80,0,0,0,114,18,0,0,0,114,17,0,0,0,114, + 149,0,0,0,169,2,114,96,0,0,0,114,97,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 16,109,111,100,117,108,101,95,102,114,111,109,95,115,112,101, + 99,46,2,0,0,115,18,0,0,0,0,3,4,1,12,3, + 14,1,12,1,8,2,8,1,10,1,10,1,114,153,0,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,106,0,0,0,124, + 0,106,0,100,1,117,0,114,14,100,2,110,4,124,0,106, + 0,125,1,124,0,106,1,100,1,117,0,114,66,124,0,106, + 2,100,1,117,0,114,50,100,3,160,3,124,1,161,1,83, + 0,100,4,160,3,124,1,124,0,106,2,161,2,83,0,110, + 36,124,0,106,4,114,86,100,5,160,3,124,1,124,0,106, + 1,161,2,83,0,100,6,160,3,124,0,106,0,124,0,106, + 1,161,2,83,0,100,1,83,0,41,7,122,38,82,101,116, + 117,114,110,32,116,104,101,32,114,101,112,114,32,116,111,32, + 117,115,101,32,102,111,114,32,116,104,101,32,109,111,100,117, + 108,101,46,78,114,101,0,0,0,114,102,0,0,0,114,103, + 0,0,0,114,104,0,0,0,250,18,60,109,111,100,117,108, + 101,32,123,33,114,125,32,40,123,125,41,62,41,5,114,17, + 0,0,0,114,114,0,0,0,114,110,0,0,0,114,46,0, + 0,0,114,124,0,0,0,41,2,114,96,0,0,0,114,17, 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,17,95,115,112,101,99,95,102,114,111,109,95,109, - 111,100,117,108,101,176,1,0,0,115,72,0,0,0,0,2, - 2,1,10,1,14,1,6,2,8,1,4,2,6,1,8,1, - 2,1,10,1,14,2,6,1,2,1,10,1,14,1,10,1, - 8,1,8,1,2,1,10,1,14,1,12,2,4,1,2,1, - 10,1,14,1,10,1,2,1,14,1,16,1,10,2,14,1, - 20,1,6,1,6,1,114,142,0,0,0,70,169,1,218,8, - 111,118,101,114,114,105,100,101,99,2,0,0,0,0,0,0, - 0,1,0,0,0,5,0,0,0,8,0,0,0,67,0,0, - 0,115,226,1,0,0,124,2,115,20,116,0,124,1,100,1, - 100,0,131,3,100,0,107,8,114,54,122,12,124,0,106,1, - 124,1,95,2,87,0,110,20,4,0,116,3,107,10,114,52, - 1,0,1,0,1,0,89,0,110,2,88,0,124,2,115,74, - 116,0,124,1,100,2,100,0,131,3,100,0,107,8,114,178, - 124,0,106,4,125,3,124,3,100,0,107,8,114,146,124,0, - 106,5,100,0,107,9,114,146,116,6,100,0,107,8,114,110, - 116,7,130,1,116,6,106,8,125,4,124,4,160,9,124,4, - 161,1,125,3,124,0,106,5,124,3,95,10,124,3,124,0, - 95,4,100,0,124,1,95,11,122,10,124,3,124,1,95,12, - 87,0,110,20,4,0,116,3,107,10,114,176,1,0,1,0, - 1,0,89,0,110,2,88,0,124,2,115,198,116,0,124,1, - 100,3,100,0,131,3,100,0,107,8,114,232,122,12,124,0, - 106,13,124,1,95,14,87,0,110,20,4,0,116,3,107,10, - 114,230,1,0,1,0,1,0,89,0,110,2,88,0,122,10, - 124,0,124,1,95,15,87,0,110,22,4,0,116,3,107,10, - 144,1,114,8,1,0,1,0,1,0,89,0,110,2,88,0, - 124,2,144,1,115,34,116,0,124,1,100,4,100,0,131,3, - 100,0,107,8,144,1,114,82,124,0,106,5,100,0,107,9, - 144,1,114,82,122,12,124,0,106,5,124,1,95,16,87,0, - 110,22,4,0,116,3,107,10,144,1,114,80,1,0,1,0, - 1,0,89,0,110,2,88,0,124,0,106,17,144,1,114,222, - 124,2,144,1,115,114,116,0,124,1,100,5,100,0,131,3, - 100,0,107,8,144,1,114,150,122,12,124,0,106,18,124,1, - 95,11,87,0,110,22,4,0,116,3,107,10,144,1,114,148, - 1,0,1,0,1,0,89,0,110,2,88,0,124,2,144,1, - 115,174,116,0,124,1,100,6,100,0,131,3,100,0,107,8, - 144,1,114,222,124,0,106,19,100,0,107,9,144,1,114,222, - 122,12,124,0,106,19,124,1,95,20,87,0,110,22,4,0, - 116,3,107,10,144,1,114,220,1,0,1,0,1,0,89,0, - 110,2,88,0,124,1,83,0,41,7,78,114,1,0,0,0, - 114,98,0,0,0,218,11,95,95,112,97,99,107,97,103,101, - 95,95,114,141,0,0,0,114,108,0,0,0,114,139,0,0, - 0,41,21,114,6,0,0,0,114,17,0,0,0,114,1,0, - 0,0,114,106,0,0,0,114,109,0,0,0,114,117,0,0, - 0,114,126,0,0,0,114,127,0,0,0,218,16,95,78,97, - 109,101,115,112,97,99,101,76,111,97,100,101,114,218,7,95, - 95,110,101,119,95,95,90,5,95,112,97,116,104,114,108,0, - 0,0,114,98,0,0,0,114,130,0,0,0,114,145,0,0, - 0,114,105,0,0,0,114,141,0,0,0,114,124,0,0,0, - 114,113,0,0,0,114,123,0,0,0,114,139,0,0,0,41, - 5,114,95,0,0,0,114,96,0,0,0,114,144,0,0,0, - 114,109,0,0,0,114,146,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,18,95,105,110,105,116, - 95,109,111,100,117,108,101,95,97,116,116,114,115,221,1,0, - 0,115,96,0,0,0,0,4,20,1,2,1,12,1,14,1, - 6,2,20,1,6,1,8,2,10,1,8,1,4,1,6,2, - 10,1,8,1,6,11,6,1,2,1,10,1,14,1,6,2, - 20,1,2,1,12,1,14,1,6,2,2,1,10,1,16,1, - 6,2,24,1,12,1,2,1,12,1,16,1,6,2,8,1, - 24,1,2,1,12,1,16,1,6,2,24,1,12,1,2,1, - 12,1,16,1,6,1,114,148,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, - 67,0,0,0,115,82,0,0,0,100,1,125,1,116,0,124, - 0,106,1,100,2,131,2,114,30,124,0,106,1,160,2,124, - 0,161,1,125,1,110,20,116,0,124,0,106,1,100,3,131, - 2,114,50,116,3,100,4,131,1,130,1,124,1,100,1,107, - 8,114,68,116,4,124,0,106,5,131,1,125,1,116,6,124, - 0,124,1,131,2,1,0,124,1,83,0,41,5,122,43,67, - 114,101,97,116,101,32,97,32,109,111,100,117,108,101,32,98, - 97,115,101,100,32,111,110,32,116,104,101,32,112,114,111,118, - 105,100,101,100,32,115,112,101,99,46,78,218,13,99,114,101, - 97,116,101,95,109,111,100,117,108,101,218,11,101,120,101,99, - 95,109,111,100,117,108,101,122,66,108,111,97,100,101,114,115, - 32,116,104,97,116,32,100,101,102,105,110,101,32,101,120,101, - 99,95,109,111,100,117,108,101,40,41,32,109,117,115,116,32, - 97,108,115,111,32,100,101,102,105,110,101,32,99,114,101,97, - 116,101,95,109,111,100,117,108,101,40,41,41,7,114,4,0, - 0,0,114,109,0,0,0,114,149,0,0,0,114,79,0,0, - 0,114,18,0,0,0,114,17,0,0,0,114,148,0,0,0, - 169,2,114,95,0,0,0,114,96,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,16,109,111,100, - 117,108,101,95,102,114,111,109,95,115,112,101,99,37,2,0, - 0,115,18,0,0,0,0,3,4,1,12,3,14,1,12,1, - 8,2,8,1,10,1,10,1,114,152,0,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,106,0,0,0,124,0,106,0,100, - 1,107,8,114,14,100,2,110,4,124,0,106,0,125,1,124, - 0,106,1,100,1,107,8,114,66,124,0,106,2,100,1,107, - 8,114,50,100,3,160,3,124,1,161,1,83,0,100,4,160, - 3,124,1,124,0,106,2,161,2,83,0,110,36,124,0,106, - 4,114,86,100,5,160,3,124,1,124,0,106,1,161,2,83, - 0,100,6,160,3,124,0,106,0,124,0,106,1,161,2,83, - 0,100,1,83,0,41,7,122,38,82,101,116,117,114,110,32, - 116,104,101,32,114,101,112,114,32,116,111,32,117,115,101,32, - 102,111,114,32,116,104,101,32,109,111,100,117,108,101,46,78, - 114,100,0,0,0,114,101,0,0,0,114,102,0,0,0,114, - 103,0,0,0,250,18,60,109,111,100,117,108,101,32,123,33, - 114,125,32,40,123,125,41,62,41,5,114,17,0,0,0,114, - 113,0,0,0,114,109,0,0,0,114,45,0,0,0,114,124, - 0,0,0,41,2,114,95,0,0,0,114,17,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,107, - 0,0,0,54,2,0,0,115,16,0,0,0,0,3,20,1, - 10,1,10,1,10,2,16,2,6,1,14,2,114,107,0,0, - 0,99,2,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,10,0,0,0,67,0,0,0,115,204,0,0,0,124, - 0,106,0,125,2,116,1,124,2,131,1,143,180,1,0,116, - 2,106,3,160,4,124,2,161,1,124,1,107,9,114,54,100, - 1,160,5,124,2,161,1,125,3,116,6,124,3,124,2,100, - 2,141,2,130,1,122,106,124,0,106,8,100,3,107,8,114, - 106,124,0,106,9,100,3,107,8,114,90,116,6,100,4,124, - 0,106,0,100,2,141,2,130,1,116,10,124,0,124,1,100, - 5,100,6,141,3,1,0,110,52,116,10,124,0,124,1,100, - 5,100,6,141,3,1,0,116,11,124,0,106,8,100,7,131, - 2,115,146,124,0,106,8,160,12,124,2,161,1,1,0,110, - 12,124,0,106,8,160,13,124,1,161,1,1,0,87,0,53, - 0,116,2,106,3,160,7,124,0,106,0,161,1,125,1,124, - 1,116,2,106,3,124,0,106,0,60,0,88,0,87,0,53, - 0,81,0,82,0,88,0,124,1,83,0,41,8,122,70,69, - 120,101,99,117,116,101,32,116,104,101,32,115,112,101,99,39, - 115,32,115,112,101,99,105,102,105,101,100,32,109,111,100,117, - 108,101,32,105,110,32,97,110,32,101,120,105,115,116,105,110, - 103,32,109,111,100,117,108,101,39,115,32,110,97,109,101,115, - 112,97,99,101,46,122,30,109,111,100,117,108,101,32,123,33, - 114,125,32,110,111,116,32,105,110,32,115,121,115,46,109,111, - 100,117,108,101,115,114,16,0,0,0,78,250,14,109,105,115, - 115,105,110,103,32,108,111,97,100,101,114,84,114,143,0,0, - 0,114,150,0,0,0,41,14,114,17,0,0,0,114,50,0, - 0,0,114,15,0,0,0,114,92,0,0,0,114,34,0,0, - 0,114,45,0,0,0,114,79,0,0,0,218,3,112,111,112, - 114,109,0,0,0,114,117,0,0,0,114,148,0,0,0,114, - 4,0,0,0,218,11,108,111,97,100,95,109,111,100,117,108, - 101,114,150,0,0,0,41,4,114,95,0,0,0,114,96,0, - 0,0,114,17,0,0,0,218,3,109,115,103,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,93,0,0,0, - 71,2,0,0,115,34,0,0,0,0,2,6,1,10,1,16, - 1,10,1,12,1,2,1,10,1,10,1,14,2,16,2,14, - 1,12,4,14,2,16,4,14,1,24,1,114,93,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,8,0,0,0,67,0,0,0,115,26,1,0,0,122,18, - 124,0,106,0,160,1,124,0,106,2,161,1,1,0,87,0, - 110,52,1,0,1,0,1,0,124,0,106,2,116,3,106,4, - 107,6,114,64,116,3,106,4,160,5,124,0,106,2,161,1, - 125,1,124,1,116,3,106,4,124,0,106,2,60,0,130,0, - 89,0,110,2,88,0,116,3,106,4,160,5,124,0,106,2, - 161,1,125,1,124,1,116,3,106,4,124,0,106,2,60,0, - 116,6,124,1,100,1,100,0,131,3,100,0,107,8,114,148, - 122,12,124,0,106,0,124,1,95,7,87,0,110,20,4,0, - 116,8,107,10,114,146,1,0,1,0,1,0,89,0,110,2, - 88,0,116,6,124,1,100,2,100,0,131,3,100,0,107,8, - 114,226,122,40,124,1,106,9,124,1,95,10,116,11,124,1, - 100,3,131,2,115,202,124,0,106,2,160,12,100,4,161,1, - 100,5,25,0,124,1,95,10,87,0,110,20,4,0,116,8, - 107,10,114,224,1,0,1,0,1,0,89,0,110,2,88,0, - 116,6,124,1,100,6,100,0,131,3,100,0,107,8,144,1, - 114,22,122,10,124,0,124,1,95,13,87,0,110,22,4,0, - 116,8,107,10,144,1,114,20,1,0,1,0,1,0,89,0, - 110,2,88,0,124,1,83,0,41,7,78,114,98,0,0,0, - 114,145,0,0,0,114,141,0,0,0,114,128,0,0,0,114, - 22,0,0,0,114,105,0,0,0,41,14,114,109,0,0,0, + 0,0,114,108,0,0,0,63,2,0,0,115,16,0,0,0, + 0,3,20,1,10,1,10,1,10,2,16,2,6,1,14,2, + 114,108,0,0,0,99,2,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,10,0,0,0,67,0,0,0,115,250, + 0,0,0,124,0,106,0,125,2,116,1,124,2,131,1,143, + 216,1,0,116,2,106,3,160,4,124,2,161,1,124,1,117, + 1,114,54,100,1,160,5,124,2,161,1,125,3,116,6,124, + 3,124,2,100,2,141,2,130,1,122,132,124,0,106,7,100, + 3,117,0,114,106,124,0,106,8,100,3,117,0,114,90,116, + 6,100,4,124,0,106,0,100,2,141,2,130,1,116,9,124, + 0,124,1,100,5,100,6,141,3,1,0,110,52,116,9,124, + 0,124,1,100,5,100,6,141,3,1,0,116,10,124,0,106, + 7,100,7,131,2,115,146,124,0,106,7,160,11,124,2,161, + 1,1,0,110,12,124,0,106,7,160,12,124,1,161,1,1, + 0,87,0,116,2,106,3,160,13,124,0,106,0,161,1,125, + 1,124,1,116,2,106,3,124,0,106,0,60,0,110,28,116, + 2,106,3,160,13,124,0,106,0,161,1,125,1,124,1,116, + 2,106,3,124,0,106,0,60,0,48,0,87,0,100,3,4, + 0,4,0,131,3,1,0,110,16,49,0,115,236,48,0,1, + 0,1,0,1,0,89,0,1,0,124,1,83,0,41,8,122, + 70,69,120,101,99,117,116,101,32,116,104,101,32,115,112,101, + 99,39,115,32,115,112,101,99,105,102,105,101,100,32,109,111, + 100,117,108,101,32,105,110,32,97,110,32,101,120,105,115,116, + 105,110,103,32,109,111,100,117,108,101,39,115,32,110,97,109, + 101,115,112,97,99,101,46,122,30,109,111,100,117,108,101,32, + 123,33,114,125,32,110,111,116,32,105,110,32,115,121,115,46, + 109,111,100,117,108,101,115,114,16,0,0,0,78,250,14,109, + 105,115,115,105,110,103,32,108,111,97,100,101,114,84,114,144, + 0,0,0,114,151,0,0,0,41,14,114,17,0,0,0,114, + 51,0,0,0,114,15,0,0,0,114,93,0,0,0,114,35, + 0,0,0,114,46,0,0,0,114,80,0,0,0,114,110,0, + 0,0,114,117,0,0,0,114,149,0,0,0,114,4,0,0, + 0,218,11,108,111,97,100,95,109,111,100,117,108,101,114,151, + 0,0,0,218,3,112,111,112,41,4,114,96,0,0,0,114, + 97,0,0,0,114,17,0,0,0,218,3,109,115,103,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,94,0, + 0,0,80,2,0,0,115,38,0,0,0,0,2,6,1,10, + 1,16,1,10,1,12,1,2,1,10,1,10,1,14,2,16, + 2,14,1,12,4,14,2,14,4,14,1,14,255,14,1,44, + 1,114,94,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,8,0,0,0,67,0,0,0,115, + 20,1,0,0,122,18,124,0,106,0,160,1,124,0,106,2, + 161,1,1,0,87,0,110,52,1,0,1,0,1,0,124,0, + 106,2,116,3,106,4,118,0,114,64,116,3,106,4,160,5, + 124,0,106,2,161,1,125,1,124,1,116,3,106,4,124,0, + 106,2,60,0,130,0,89,0,110,2,48,0,116,3,106,4, + 160,5,124,0,106,2,161,1,125,1,124,1,116,3,106,4, + 124,0,106,2,60,0,116,6,124,1,100,1,100,0,131,3, + 100,0,117,0,114,146,122,12,124,0,106,0,124,1,95,7, + 87,0,110,18,4,0,116,8,121,144,1,0,1,0,1,0, + 89,0,110,2,48,0,116,6,124,1,100,2,100,0,131,3, + 100,0,117,0,114,222,122,40,124,1,106,9,124,1,95,10, + 116,11,124,1,100,3,131,2,115,200,124,0,106,2,160,12, + 100,4,161,1,100,5,25,0,124,1,95,10,87,0,110,18, + 4,0,116,8,121,220,1,0,1,0,1,0,89,0,110,2, + 48,0,116,6,124,1,100,6,100,0,131,3,100,0,117,0, + 144,1,114,16,122,10,124,0,124,1,95,13,87,0,110,20, + 4,0,116,8,144,1,121,14,1,0,1,0,1,0,89,0, + 110,2,48,0,124,1,83,0,41,7,78,114,99,0,0,0, + 114,146,0,0,0,114,142,0,0,0,114,129,0,0,0,114, + 22,0,0,0,114,106,0,0,0,41,14,114,110,0,0,0, 114,156,0,0,0,114,17,0,0,0,114,15,0,0,0,114, - 92,0,0,0,114,155,0,0,0,114,6,0,0,0,114,98, - 0,0,0,114,106,0,0,0,114,1,0,0,0,114,145,0, - 0,0,114,4,0,0,0,114,129,0,0,0,114,105,0,0, - 0,114,151,0,0,0,114,10,0,0,0,114,10,0,0,0, + 93,0,0,0,114,157,0,0,0,114,6,0,0,0,114,99, + 0,0,0,114,107,0,0,0,114,1,0,0,0,114,146,0, + 0,0,114,4,0,0,0,114,130,0,0,0,114,106,0,0, + 0,114,152,0,0,0,114,10,0,0,0,114,10,0,0,0, 114,11,0,0,0,218,25,95,108,111,97,100,95,98,97,99, 107,119,97,114,100,95,99,111,109,112,97,116,105,98,108,101, - 101,2,0,0,115,54,0,0,0,0,4,2,1,18,1,6, + 110,2,0,0,115,54,0,0,0,0,4,2,1,18,1,6, 1,12,1,14,1,12,1,8,3,14,1,12,1,16,1,2, - 1,12,1,14,1,6,1,16,1,2,4,8,1,10,1,22, - 1,14,1,6,1,18,1,2,1,10,1,16,1,6,1,114, - 158,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,11,0,0,0,67,0,0,0,115,220,0, - 0,0,124,0,106,0,100,0,107,9,114,30,116,1,124,0, + 1,12,1,12,1,6,1,16,1,2,4,8,1,10,1,22, + 1,12,1,6,1,18,1,2,1,10,1,14,1,6,1,114, + 159,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,11,0,0,0,67,0,0,0,115,224,0, + 0,0,124,0,106,0,100,0,117,1,114,30,116,1,124,0, 106,0,100,1,131,2,115,30,116,2,124,0,131,1,83,0, - 116,3,124,0,131,1,125,1,100,2,124,0,95,4,122,162, + 116,3,124,0,131,1,125,1,100,2,124,0,95,4,122,166, 124,1,116,5,106,6,124,0,106,7,60,0,122,52,124,0, - 106,0,100,0,107,8,114,96,124,0,106,8,100,0,107,8, - 114,108,116,9,100,4,124,0,106,7,100,5,141,2,130,1, + 106,0,100,0,117,0,114,96,124,0,106,8,100,0,117,0, + 114,108,116,9,100,3,124,0,106,7,100,4,141,2,130,1, 110,12,124,0,106,0,160,10,124,1,161,1,1,0,87,0, - 110,50,1,0,1,0,1,0,122,14,116,5,106,6,124,0, - 106,7,61,0,87,0,110,20,4,0,116,11,107,10,114,152, - 1,0,1,0,1,0,89,0,110,2,88,0,130,0,89,0, - 110,2,88,0,116,5,106,6,160,12,124,0,106,7,161,1, - 125,1,124,1,116,5,106,6,124,0,106,7,60,0,116,13, - 100,6,124,0,106,7,124,0,106,0,131,3,1,0,87,0, - 53,0,100,3,124,0,95,4,88,0,124,1,83,0,41,7, - 78,114,150,0,0,0,84,70,114,154,0,0,0,114,16,0, - 0,0,122,18,105,109,112,111,114,116,32,123,33,114,125,32, - 35,32,123,33,114,125,41,14,114,109,0,0,0,114,4,0, - 0,0,114,158,0,0,0,114,152,0,0,0,90,13,95,105, - 110,105,116,105,97,108,105,122,105,110,103,114,15,0,0,0, - 114,92,0,0,0,114,17,0,0,0,114,117,0,0,0,114, - 79,0,0,0,114,150,0,0,0,114,63,0,0,0,114,155, - 0,0,0,114,76,0,0,0,114,151,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,14,95,108, - 111,97,100,95,117,110,108,111,99,107,101,100,138,2,0,0, - 115,46,0,0,0,0,2,10,2,12,1,8,2,8,5,6, - 1,2,1,12,1,2,1,10,1,10,1,16,3,16,1,6, - 1,2,1,14,1,14,1,6,1,8,5,14,1,12,1,20, - 2,8,2,114,159,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,10,0,0,0,67,0,0, - 0,115,42,0,0,0,116,0,124,0,106,1,131,1,143,22, - 1,0,116,2,124,0,131,1,87,0,2,0,53,0,81,0, - 82,0,163,0,83,0,81,0,82,0,88,0,100,1,83,0, + 110,48,1,0,1,0,1,0,122,14,116,5,106,6,124,0, + 106,7,61,0,87,0,110,18,4,0,116,11,121,150,1,0, + 1,0,1,0,89,0,110,2,48,0,130,0,89,0,110,2, + 48,0,116,5,106,6,160,12,124,0,106,7,161,1,125,1, + 124,1,116,5,106,6,124,0,106,7,60,0,116,13,100,5, + 124,0,106,7,124,0,106,0,131,3,1,0,87,0,100,6, + 124,0,95,4,110,8,100,6,124,0,95,4,48,0,124,1, + 83,0,41,7,78,114,151,0,0,0,84,114,155,0,0,0, + 114,16,0,0,0,122,18,105,109,112,111,114,116,32,123,33, + 114,125,32,35,32,123,33,114,125,70,41,14,114,110,0,0, + 0,114,4,0,0,0,114,159,0,0,0,114,153,0,0,0, + 90,13,95,105,110,105,116,105,97,108,105,122,105,110,103,114, + 15,0,0,0,114,93,0,0,0,114,17,0,0,0,114,117, + 0,0,0,114,80,0,0,0,114,151,0,0,0,114,64,0, + 0,0,114,157,0,0,0,114,77,0,0,0,114,152,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 218,14,95,108,111,97,100,95,117,110,108,111,99,107,101,100, + 147,2,0,0,115,46,0,0,0,0,2,10,2,12,1,8, + 2,8,5,6,1,2,1,12,1,2,1,10,1,10,1,16, + 3,16,1,6,1,2,1,14,1,12,1,6,1,8,5,14, + 1,12,1,18,2,16,2,114,160,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0, + 0,67,0,0,0,115,54,0,0,0,116,0,124,0,106,1, + 131,1,143,24,1,0,116,2,124,0,131,1,87,0,2,0, + 100,1,4,0,4,0,131,3,1,0,83,0,49,0,115,40, + 48,0,1,0,1,0,1,0,89,0,1,0,100,1,83,0, 41,2,122,191,82,101,116,117,114,110,32,97,32,110,101,119, 32,109,111,100,117,108,101,32,111,98,106,101,99,116,44,32, 108,111,97,100,101,100,32,98,121,32,116,104,101,32,115,112, @@ -1018,772 +1027,786 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 108,101,115,44,32,116,104,97,116,32,101,120,105,115,116,105, 110,103,32,109,111,100,117,108,101,32,103,101,116,115,10,32, 32,32,32,99,108,111,98,98,101,114,101,100,46,10,10,32, - 32,32,32,78,41,3,114,50,0,0,0,114,17,0,0,0, - 114,159,0,0,0,41,1,114,95,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,94,0,0,0, - 180,2,0,0,115,4,0,0,0,0,9,12,1,114,94,0, + 32,32,32,78,41,3,114,51,0,0,0,114,17,0,0,0, + 114,160,0,0,0,41,1,114,96,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,95,0,0,0, + 189,2,0,0,115,4,0,0,0,0,9,12,1,114,95,0, 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,136,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,6,100,19,100,5,100,6, - 132,1,131,1,90,7,101,6,100,20,100,7,100,8,132,1, - 131,1,90,8,101,6,100,9,100,10,132,0,131,1,90,9, - 101,6,100,11,100,12,132,0,131,1,90,10,101,6,101,11, - 100,13,100,14,132,0,131,1,131,1,90,12,101,6,101,11, - 100,15,100,16,132,0,131,1,131,1,90,13,101,6,101,11, - 100,17,100,18,132,0,131,1,131,1,90,14,101,6,101,15, - 131,1,90,16,100,4,83,0,41,21,218,15,66,117,105,108, - 116,105,110,73,109,112,111,114,116,101,114,122,144,77,101,116, - 97,32,112,97,116,104,32,105,109,112,111,114,116,32,102,111, - 114,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, + 0,0,0,4,0,0,0,64,0,0,0,115,140,0,0,0, + 101,0,90,1,100,0,90,2,100,1,90,3,100,2,90,4, + 101,5,100,3,100,4,132,0,131,1,90,6,101,7,100,20, + 100,6,100,7,132,1,131,1,90,8,101,7,100,21,100,8, + 100,9,132,1,131,1,90,9,101,7,100,10,100,11,132,0, + 131,1,90,10,101,7,100,12,100,13,132,0,131,1,90,11, + 101,7,101,12,100,14,100,15,132,0,131,1,131,1,90,13, + 101,7,101,12,100,16,100,17,132,0,131,1,131,1,90,14, + 101,7,101,12,100,18,100,19,132,0,131,1,131,1,90,15, + 101,7,101,16,131,1,90,17,100,5,83,0,41,22,218,15, + 66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,122, + 144,77,101,116,97,32,112,97,116,104,32,105,109,112,111,114, + 116,32,102,111,114,32,98,117,105,108,116,45,105,110,32,109, + 111,100,117,108,101,115,46,10,10,32,32,32,32,65,108,108, + 32,109,101,116,104,111,100,115,32,97,114,101,32,101,105,116, + 104,101,114,32,99,108,97,115,115,32,111,114,32,115,116,97, + 116,105,99,32,109,101,116,104,111,100,115,32,116,111,32,97, + 118,111,105,100,32,116,104,101,32,110,101,101,100,32,116,111, + 10,32,32,32,32,105,110,115,116,97,110,116,105,97,116,101, + 32,116,104,101,32,99,108,97,115,115,46,10,10,32,32,32, + 32,122,8,98,117,105,108,116,45,105,110,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,22,0,0,0,100,1,124,0,106,0,155, + 2,100,2,116,1,106,2,155,0,100,3,157,5,83,0,41, + 4,250,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,8,60,109,111,100,117,108,101,32, + 122,2,32,40,122,2,41,62,41,3,114,1,0,0,0,114, + 161,0,0,0,114,139,0,0,0,41,1,114,97,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 100,0,0,0,215,2,0,0,115,2,0,0,0,0,7,122, + 27,66,117,105,108,116,105,110,73,109,112,111,114,116,101,114, + 46,109,111,100,117,108,101,95,114,101,112,114,78,99,4,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0, + 0,0,67,0,0,0,115,46,0,0,0,124,2,100,0,117, + 1,114,12,100,0,83,0,116,0,160,1,124,1,161,1,114, + 38,116,2,124,1,124,0,124,0,106,3,100,1,141,3,83, + 0,100,0,83,0,100,0,83,0,169,2,78,114,138,0,0, + 0,41,4,114,58,0,0,0,90,10,105,115,95,98,117,105, + 108,116,105,110,114,92,0,0,0,114,139,0,0,0,169,4, + 218,3,99,108,115,114,82,0,0,0,218,4,112,97,116,104, + 218,6,116,97,114,103,101,116,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,9,102,105,110,100,95,115,112, + 101,99,224,2,0,0,115,10,0,0,0,0,2,8,1,4, + 1,10,1,16,2,122,25,66,117,105,108,116,105,110,73,109, + 112,111,114,116,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,117,1, + 114,26,124,3,106,1,83,0,100,1,83,0,41,2,122,175, + 70,105,110,100,32,116,104,101,32,98,117,105,108,116,45,105, + 110,32,109,111,100,117,108,101,46,10,10,32,32,32,32,32, + 32,32,32,73,102,32,39,112,97,116,104,39,32,105,115,32, + 101,118,101,114,32,115,112,101,99,105,102,105,101,100,32,116, + 104,101,110,32,116,104,101,32,115,101,97,114,99,104,32,105, + 115,32,99,111,110,115,105,100,101,114,101,100,32,97,32,102, + 97,105,108,117,114,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, + 41,2,114,168,0,0,0,114,110,0,0,0,41,4,114,165, + 0,0,0,114,82,0,0,0,114,166,0,0,0,114,96,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,218,11,102,105,110,100,95,109,111,100,117,108,101,233,2, + 0,0,115,4,0,0,0,0,9,12,1,122,27,66,117,105, + 108,116,105,110,73,109,112,111,114,116,101,114,46,102,105,110, + 100,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,46,0,0,0,124,1,106,0,116,1,106,2,118,1, + 114,34,116,3,100,1,160,4,124,1,106,0,161,1,124,1, + 106,0,100,2,141,2,130,1,116,5,116,6,106,7,124,1, + 131,2,83,0,41,3,122,24,67,114,101,97,116,101,32,97, + 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, + 114,78,0,0,0,114,16,0,0,0,41,8,114,17,0,0, + 0,114,15,0,0,0,114,79,0,0,0,114,80,0,0,0, + 114,46,0,0,0,114,68,0,0,0,114,58,0,0,0,90, + 14,99,114,101,97,116,101,95,98,117,105,108,116,105,110,41, + 2,114,30,0,0,0,114,96,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,150,0,0,0,245, + 2,0,0,115,10,0,0,0,0,3,12,1,12,1,4,255, + 6,2,122,29,66,117,105,108,116,105,110,73,109,112,111,114, + 116,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,3,0,0,0,67,0,0,0,115,16,0,0,0,116, + 0,116,1,106,2,124,1,131,2,1,0,100,1,83,0,41, + 2,122,22,69,120,101,99,32,97,32,98,117,105,108,116,45, + 105,110,32,109,111,100,117,108,101,78,41,3,114,68,0,0, + 0,114,58,0,0,0,90,12,101,120,101,99,95,98,117,105, + 108,116,105,110,41,2,114,30,0,0,0,114,97,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 151,0,0,0,253,2,0,0,115,2,0,0,0,0,3,122, + 27,66,117,105,108,116,105,110,73,109,112,111,114,116,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,1,0,0, + 0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,2, + 122,57,82,101,116,117,114,110,32,78,111,110,101,32,97,115, + 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, + 115,32,100,111,32,110,111,116,32,104,97,118,101,32,99,111, + 100,101,32,111,98,106,101,99,116,115,46,78,114,10,0,0, + 0,169,2,114,165,0,0,0,114,82,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,8,103,101, + 116,95,99,111,100,101,2,3,0,0,115,2,0,0,0,0, + 4,122,24,66,117,105,108,116,105,110,73,109,112,111,114,116, + 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, + 56,82,101,116,117,114,110,32,78,111,110,101,32,97,115,32, + 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,115, + 32,100,111,32,110,111,116,32,104,97,118,101,32,115,111,117, + 114,99,101,32,99,111,100,101,46,78,114,10,0,0,0,114, + 170,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,10,103,101,116,95,115,111,117,114,99,101,8, + 3,0,0,115,2,0,0,0,0,4,122,26,66,117,105,108, + 116,105,110,73,109,112,111,114,116,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, + 4,0,0,0,100,1,83,0,41,2,122,52,82,101,116,117, + 114,110,32,70,97,108,115,101,32,97,115,32,98,117,105,108, + 116,45,105,110,32,109,111,100,117,108,101,115,32,97,114,101, + 32,110,101,118,101,114,32,112,97,99,107,97,103,101,115,46, + 70,114,10,0,0,0,114,170,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,116,0,0,0,14, + 3,0,0,115,2,0,0,0,0,4,122,26,66,117,105,108, + 116,105,110,73,109,112,111,114,116,101,114,46,105,115,95,112, + 97,99,107,97,103,101,41,2,78,78,41,1,78,41,18,114, + 1,0,0,0,114,0,0,0,0,114,2,0,0,0,114,3, + 0,0,0,114,139,0,0,0,218,12,115,116,97,116,105,99, + 109,101,116,104,111,100,114,100,0,0,0,218,11,99,108,97, + 115,115,109,101,116,104,111,100,114,168,0,0,0,114,169,0, + 0,0,114,150,0,0,0,114,151,0,0,0,114,87,0,0, + 0,114,171,0,0,0,114,172,0,0,0,114,116,0,0,0, + 114,98,0,0,0,114,156,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,161, + 0,0,0,204,2,0,0,115,44,0,0,0,8,2,4,7, + 4,2,2,1,10,8,2,1,12,8,2,1,12,11,2,1, + 10,7,2,1,10,4,2,1,2,1,12,4,2,1,2,1, + 12,4,2,1,2,1,12,4,114,161,0,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,144,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,100,2,90,4,101,5,100,3,100, + 4,132,0,131,1,90,6,101,7,100,22,100,6,100,7,132, + 1,131,1,90,8,101,7,100,23,100,8,100,9,132,1,131, + 1,90,9,101,7,100,10,100,11,132,0,131,1,90,10,101, + 5,100,12,100,13,132,0,131,1,90,11,101,7,100,14,100, + 15,132,0,131,1,90,12,101,7,101,13,100,16,100,17,132, + 0,131,1,131,1,90,14,101,7,101,13,100,18,100,19,132, + 0,131,1,131,1,90,15,101,7,101,13,100,20,100,21,132, + 0,131,1,131,1,90,16,100,5,83,0,41,24,218,14,70, + 114,111,122,101,110,73,109,112,111,114,116,101,114,122,142,77, + 101,116,97,32,112,97,116,104,32,105,109,112,111,114,116,32, + 102,111,114,32,102,114,111,122,101,110,32,109,111,100,117,108, 101,115,46,10,10,32,32,32,32,65,108,108,32,109,101,116, 104,111,100,115,32,97,114,101,32,101,105,116,104,101,114,32, 99,108,97,115,115,32,111,114,32,115,116,97,116,105,99,32, 109,101,116,104,111,100,115,32,116,111,32,97,118,111,105,100, 32,116,104,101,32,110,101,101,100,32,116,111,10,32,32,32, 32,105,110,115,116,97,110,116,105,97,116,101,32,116,104,101, - 32,99,108,97,115,115,46,10,10,32,32,32,32,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,250,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,24, - 60,109,111,100,117,108,101,32,123,33,114,125,32,40,98,117, - 105,108,116,45,105,110,41,62,41,2,114,45,0,0,0,114, - 1,0,0,0,41,1,114,96,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,99,0,0,0,204, - 2,0,0,115,2,0,0,0,0,7,122,27,66,117,105,108, - 116,105,110,73,109,112,111,114,116,101,114,46,109,111,100,117, - 108,101,95,114,101,112,114,78,99,4,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,5,0,0,0,67,0,0, - 0,115,44,0,0,0,124,2,100,0,107,9,114,12,100,0, - 83,0,116,0,160,1,124,1,161,1,114,36,116,2,124,1, - 124,0,100,1,100,2,141,3,83,0,100,0,83,0,100,0, - 83,0,41,3,78,122,8,98,117,105,108,116,45,105,110,114, - 137,0,0,0,41,3,114,57,0,0,0,90,10,105,115,95, - 98,117,105,108,116,105,110,114,91,0,0,0,169,4,218,3, - 99,108,115,114,81,0,0,0,218,4,112,97,116,104,218,6, - 116,97,114,103,101,116,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,9,102,105,110,100,95,115,112,101,99, - 213,2,0,0,115,10,0,0,0,0,2,8,1,4,1,10, - 1,14,2,122,25,66,117,105,108,116,105,110,73,109,112,111, - 114,116,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,9,114,26, - 124,3,106,1,83,0,100,1,83,0,41,2,122,175,70,105, - 110,100,32,116,104,101,32,98,117,105,108,116,45,105,110,32, - 109,111,100,117,108,101,46,10,10,32,32,32,32,32,32,32, - 32,73,102,32,39,112,97,116,104,39,32,105,115,32,101,118, - 101,114,32,115,112,101,99,105,102,105,101,100,32,116,104,101, - 110,32,116,104,101,32,115,101,97,114,99,104,32,105,115,32, - 99,111,110,115,105,100,101,114,101,100,32,97,32,102,97,105, - 108,117,114,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,41,2, - 114,166,0,0,0,114,109,0,0,0,41,4,114,163,0,0, - 0,114,81,0,0,0,114,164,0,0,0,114,95,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 11,102,105,110,100,95,109,111,100,117,108,101,222,2,0,0, - 115,4,0,0,0,0,9,12,1,122,27,66,117,105,108,116, - 105,110,73,109,112,111,114,116,101,114,46,102,105,110,100,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, - 46,0,0,0,124,1,106,0,116,1,106,2,107,7,114,34, - 116,3,100,1,160,4,124,1,106,0,161,1,124,1,106,0, - 100,2,141,2,130,1,116,5,116,6,106,7,124,1,131,2, - 83,0,41,3,122,24,67,114,101,97,116,101,32,97,32,98, - 117,105,108,116,45,105,110,32,109,111,100,117,108,101,114,77, - 0,0,0,114,16,0,0,0,41,8,114,17,0,0,0,114, - 15,0,0,0,114,78,0,0,0,114,79,0,0,0,114,45, - 0,0,0,114,67,0,0,0,114,57,0,0,0,90,14,99, - 114,101,97,116,101,95,98,117,105,108,116,105,110,41,2,114, - 30,0,0,0,114,95,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,149,0,0,0,234,2,0, - 0,115,10,0,0,0,0,3,12,1,12,1,4,255,6,2, - 122,29,66,117,105,108,116,105,110,73,109,112,111,114,116,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, - 3,0,0,0,67,0,0,0,115,16,0,0,0,116,0,116, - 1,106,2,124,1,131,2,1,0,100,1,83,0,41,2,122, - 22,69,120,101,99,32,97,32,98,117,105,108,116,45,105,110, - 32,109,111,100,117,108,101,78,41,3,114,67,0,0,0,114, - 57,0,0,0,90,12,101,120,101,99,95,98,117,105,108,116, - 105,110,41,2,114,30,0,0,0,114,96,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,150,0, - 0,0,242,2,0,0,115,2,0,0,0,0,3,122,27,66, - 117,105,108,116,105,110,73,109,112,111,114,116,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,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,57, - 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,98, - 117,105,108,116,45,105,110,32,109,111,100,117,108,101,115,32, - 100,111,32,110,111,116,32,104,97,118,101,32,99,111,100,101, - 32,111,98,106,101,99,116,115,46,78,114,10,0,0,0,169, - 2,114,163,0,0,0,114,81,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,8,103,101,116,95, - 99,111,100,101,247,2,0,0,115,2,0,0,0,0,4,122, - 24,66,117,105,108,116,105,110,73,109,112,111,114,116,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,56,82, - 101,116,117,114,110,32,78,111,110,101,32,97,115,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,115,32,100, - 111,32,110,111,116,32,104,97,118,101,32,115,111,117,114,99, - 101,32,99,111,100,101,46,78,114,10,0,0,0,114,168,0, + 32,99,108,97,115,115,46,10,10,32,32,32,32,90,6,102, + 114,111,122,101,110,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,16, + 0,0,0,100,1,160,0,124,0,106,1,116,2,106,3,161, + 2,83,0,41,2,114,162,0,0,0,114,154,0,0,0,41, + 4,114,46,0,0,0,114,1,0,0,0,114,175,0,0,0, + 114,139,0,0,0,41,1,218,1,109,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,100,0,0,0,34,3, + 0,0,115,2,0,0,0,0,7,122,26,70,114,111,122,101, + 110,73,109,112,111,114,116,101,114,46,109,111,100,117,108,101, + 95,114,101,112,114,78,99,4,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,5,0,0,0,67,0,0,0,115, + 34,0,0,0,116,0,160,1,124,1,161,1,114,26,116,2, + 124,1,124,0,124,0,106,3,100,1,141,3,83,0,100,0, + 83,0,100,0,83,0,114,163,0,0,0,41,4,114,58,0, + 0,0,114,89,0,0,0,114,92,0,0,0,114,139,0,0, + 0,114,164,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,168,0,0,0,43,3,0,0,115,6, + 0,0,0,0,2,10,1,16,2,122,24,70,114,111,122,101, + 110,73,109,112,111,114,116,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, + 3,0,0,0,3,0,0,0,67,0,0,0,115,18,0,0, + 0,116,0,160,1,124,1,161,1,114,14,124,0,83,0,100, + 1,83,0,41,2,122,93,70,105,110,100,32,97,32,102,114, + 111,122,101,110,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,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,2,114,58,0,0,0,114,89,0,0, + 0,41,3,114,165,0,0,0,114,82,0,0,0,114,166,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,218,10,103,101,116,95,115,111,117,114,99,101,253,2,0, - 0,115,2,0,0,0,0,4,122,26,66,117,105,108,116,105, - 110,73,109,112,111,114,116,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,4,0, - 0,0,100,1,83,0,41,2,122,52,82,101,116,117,114,110, - 32,70,97,108,115,101,32,97,115,32,98,117,105,108,116,45, - 105,110,32,109,111,100,117,108,101,115,32,97,114,101,32,110, - 101,118,101,114,32,112,97,99,107,97,103,101,115,46,70,114, - 10,0,0,0,114,168,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,115,0,0,0,3,3,0, - 0,115,2,0,0,0,0,4,122,26,66,117,105,108,116,105, - 110,73,109,112,111,114,116,101,114,46,105,115,95,112,97,99, - 107,97,103,101,41,2,78,78,41,1,78,41,17,114,1,0, - 0,0,114,0,0,0,0,114,2,0,0,0,114,3,0,0, - 0,218,12,115,116,97,116,105,99,109,101,116,104,111,100,114, - 99,0,0,0,218,11,99,108,97,115,115,109,101,116,104,111, - 100,114,166,0,0,0,114,167,0,0,0,114,149,0,0,0, - 114,150,0,0,0,114,86,0,0,0,114,169,0,0,0,114, - 170,0,0,0,114,115,0,0,0,114,97,0,0,0,114,156, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,160,0,0,0,195,2,0,0, - 115,42,0,0,0,8,2,4,7,2,1,10,8,2,1,12, - 8,2,1,12,11,2,1,10,7,2,1,10,4,2,1,2, - 1,12,4,2,1,2,1,12,4,2,1,2,1,12,4,114, - 160,0,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,144,0, - 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, - 90,4,101,5,100,3,100,4,132,0,131,1,90,6,101,7, - 100,22,100,6,100,7,132,1,131,1,90,8,101,7,100,23, - 100,8,100,9,132,1,131,1,90,9,101,7,100,10,100,11, - 132,0,131,1,90,10,101,5,100,12,100,13,132,0,131,1, - 90,11,101,7,100,14,100,15,132,0,131,1,90,12,101,7, - 101,13,100,16,100,17,132,0,131,1,131,1,90,14,101,7, - 101,13,100,18,100,19,132,0,131,1,131,1,90,15,101,7, - 101,13,100,20,100,21,132,0,131,1,131,1,90,16,100,5, - 83,0,41,24,218,14,70,114,111,122,101,110,73,109,112,111, - 114,116,101,114,122,142,77,101,116,97,32,112,97,116,104,32, - 105,109,112,111,114,116,32,102,111,114,32,102,114,111,122,101, - 110,32,109,111,100,117,108,101,115,46,10,10,32,32,32,32, - 65,108,108,32,109,101,116,104,111,100,115,32,97,114,101,32, - 101,105,116,104,101,114,32,99,108,97,115,115,32,111,114,32, - 115,116,97,116,105,99,32,109,101,116,104,111,100,115,32,116, - 111,32,97,118,111,105,100,32,116,104,101,32,110,101,101,100, - 32,116,111,10,32,32,32,32,105,110,115,116,97,110,116,105, - 97,116,101,32,116,104,101,32,99,108,97,115,115,46,10,10, - 32,32,32,32,90,6,102,114,111,122,101,110,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,16,0,0,0,100,1,160,0,124,0, - 106,1,116,2,106,3,161,2,83,0,41,2,114,161,0,0, - 0,114,153,0,0,0,41,4,114,45,0,0,0,114,1,0, - 0,0,114,173,0,0,0,114,138,0,0,0,41,1,218,1, - 109,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,99,0,0,0,23,3,0,0,115,2,0,0,0,0,7, - 122,26,70,114,111,122,101,110,73,109,112,111,114,116,101,114, - 46,109,111,100,117,108,101,95,114,101,112,114,78,99,4,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0, - 0,0,67,0,0,0,115,34,0,0,0,116,0,160,1,124, - 1,161,1,114,26,116,2,124,1,124,0,124,0,106,3,100, - 1,141,3,83,0,100,0,83,0,100,0,83,0,41,2,78, - 114,137,0,0,0,41,4,114,57,0,0,0,114,88,0,0, - 0,114,91,0,0,0,114,138,0,0,0,114,162,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 166,0,0,0,32,3,0,0,115,6,0,0,0,0,2,10, - 1,16,2,122,24,70,114,111,122,101,110,73,109,112,111,114, - 116,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,3,0,0,0,3,0, - 0,0,67,0,0,0,115,18,0,0,0,116,0,160,1,124, - 1,161,1,114,14,124,0,83,0,100,1,83,0,41,2,122, - 93,70,105,110,100,32,97,32,102,114,111,122,101,110,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, - 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, - 2,114,57,0,0,0,114,88,0,0,0,41,3,114,163,0, - 0,0,114,81,0,0,0,114,164,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,167,0,0,0, - 39,3,0,0,115,2,0,0,0,0,7,122,26,70,114,111, - 122,101,110,73,109,112,111,114,116,101,114,46,102,105,110,100, - 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,1,83,0,41,2,122,42,85,115,101, - 32,100,101,102,97,117,108,116,32,115,101,109,97,110,116,105, - 99,115,32,102,111,114,32,109,111,100,117,108,101,32,99,114, - 101,97,116,105,111,110,46,78,114,10,0,0,0,41,2,114, - 163,0,0,0,114,95,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,149,0,0,0,48,3,0, - 0,115,2,0,0,0,0,2,122,28,70,114,111,122,101,110, - 73,109,112,111,114,116,101,114,46,99,114,101,97,116,101,95, - 109,111,100,117,108,101,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,124,0,106,0,106,1,125,1,116,2,160,3, - 124,1,161,1,115,36,116,4,100,1,160,5,124,1,161,1, - 124,1,100,2,141,2,130,1,116,6,116,2,106,7,124,1, - 131,2,125,2,116,8,124,2,124,0,106,9,131,2,1,0, - 100,0,83,0,114,87,0,0,0,41,10,114,105,0,0,0, - 114,17,0,0,0,114,57,0,0,0,114,88,0,0,0,114, - 79,0,0,0,114,45,0,0,0,114,67,0,0,0,218,17, - 103,101,116,95,102,114,111,122,101,110,95,111,98,106,101,99, - 116,218,4,101,120,101,99,114,7,0,0,0,41,3,114,96, - 0,0,0,114,17,0,0,0,218,4,99,111,100,101,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,150,0, - 0,0,52,3,0,0,115,14,0,0,0,0,2,8,1,10, - 1,10,1,2,255,6,2,12,1,122,26,70,114,111,122,101, - 110,73,109,112,111,114,116,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,3,0,0,0,67,0,0,0,115,10, - 0,0,0,116,0,124,0,124,1,131,2,83,0,41,1,122, - 95,76,111,97,100,32,97,32,102,114,111,122,101,110,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, - 41,1,114,97,0,0,0,114,168,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,156,0,0,0, - 61,3,0,0,115,2,0,0,0,0,7,122,26,70,114,111, - 122,101,110,73,109,112,111,114,116,101,114,46,108,111,97,100, - 95,109,111,100,117,108,101,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,10,0,0,0,116,0,160,1,124,1,161,1,83,0,41, - 1,122,45,82,101,116,117,114,110,32,116,104,101,32,99,111, - 100,101,32,111,98,106,101,99,116,32,102,111,114,32,116,104, - 101,32,102,114,111,122,101,110,32,109,111,100,117,108,101,46, - 41,2,114,57,0,0,0,114,175,0,0,0,114,168,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,169,0,0,0,70,3,0,0,115,2,0,0,0,0,4, - 122,23,70,114,111,122,101,110,73,109,112,111,114,116,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,54,82, - 101,116,117,114,110,32,78,111,110,101,32,97,115,32,102,114, - 111,122,101,110,32,109,111,100,117,108,101,115,32,100,111,32, - 110,111,116,32,104,97,118,101,32,115,111,117,114,99,101,32, - 99,111,100,101,46,78,114,10,0,0,0,114,168,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 170,0,0,0,76,3,0,0,115,2,0,0,0,0,4,122, - 25,70,114,111,122,101,110,73,109,112,111,114,116,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,3,0,0,0,67, - 0,0,0,115,10,0,0,0,116,0,160,1,124,1,161,1, - 83,0,41,1,122,46,82,101,116,117,114,110,32,84,114,117, - 101,32,105,102,32,116,104,101,32,102,114,111,122,101,110,32, - 109,111,100,117,108,101,32,105,115,32,97,32,112,97,99,107, - 97,103,101,46,41,2,114,57,0,0,0,90,17,105,115,95, - 102,114,111,122,101,110,95,112,97,99,107,97,103,101,114,168, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,115,0,0,0,82,3,0,0,115,2,0,0,0, - 0,4,122,25,70,114,111,122,101,110,73,109,112,111,114,116, - 101,114,46,105,115,95,112,97,99,107,97,103,101,41,2,78, - 78,41,1,78,41,17,114,1,0,0,0,114,0,0,0,0, - 114,2,0,0,0,114,3,0,0,0,114,138,0,0,0,114, - 171,0,0,0,114,99,0,0,0,114,172,0,0,0,114,166, - 0,0,0,114,167,0,0,0,114,149,0,0,0,114,150,0, - 0,0,114,156,0,0,0,114,90,0,0,0,114,169,0,0, - 0,114,170,0,0,0,114,115,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 173,0,0,0,12,3,0,0,115,46,0,0,0,8,2,4, - 7,4,2,2,1,10,8,2,1,12,6,2,1,12,8,2, - 1,10,3,2,1,10,8,2,1,10,8,2,1,2,1,12, - 4,2,1,2,1,12,4,2,1,2,1,114,173,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,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,18,95,73,109,112,111,114,116,76,111,99,107,67,111,110, - 116,101,120,116,122,36,67,111,110,116,101,120,116,32,109,97, - 110,97,103,101,114,32,102,111,114,32,116,104,101,32,105,109, - 112,111,114,116,32,108,111,99,107,46,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,12,0,0,0,116,0,160,1,161,0,1,0, - 100,1,83,0,41,2,122,24,65,99,113,117,105,114,101,32, - 116,104,101,32,105,109,112,111,114,116,32,108,111,99,107,46, - 78,41,2,114,57,0,0,0,114,58,0,0,0,114,47,0, + 0,114,169,0,0,0,50,3,0,0,115,2,0,0,0,0, + 7,122,26,70,114,111,122,101,110,73,109,112,111,114,116,101, + 114,46,102,105,110,100,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,1,83,0,41, + 2,122,42,85,115,101,32,100,101,102,97,117,108,116,32,115, + 101,109,97,110,116,105,99,115,32,102,111,114,32,109,111,100, + 117,108,101,32,99,114,101,97,116,105,111,110,46,78,114,10, + 0,0,0,41,2,114,165,0,0,0,114,96,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,150, + 0,0,0,59,3,0,0,115,2,0,0,0,0,2,122,28, + 70,114,111,122,101,110,73,109,112,111,114,116,101,114,46,99, + 114,101,97,116,101,95,109,111,100,117,108,101,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,124,0,106,0,106,1, + 125,1,116,2,160,3,124,1,161,1,115,36,116,4,100,1, + 160,5,124,1,161,1,124,1,100,2,141,2,130,1,116,6, + 116,2,106,7,124,1,131,2,125,2,116,8,124,2,124,0, + 106,9,131,2,1,0,100,0,83,0,114,88,0,0,0,41, + 10,114,106,0,0,0,114,17,0,0,0,114,58,0,0,0, + 114,89,0,0,0,114,80,0,0,0,114,46,0,0,0,114, + 68,0,0,0,218,17,103,101,116,95,102,114,111,122,101,110, + 95,111,98,106,101,99,116,218,4,101,120,101,99,114,7,0, + 0,0,41,3,114,97,0,0,0,114,17,0,0,0,218,4, + 99,111,100,101,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,151,0,0,0,63,3,0,0,115,14,0,0, + 0,0,2,8,1,10,1,10,1,2,255,6,2,12,1,122, + 26,70,114,111,122,101,110,73,109,112,111,114,116,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,3,0,0,0, + 67,0,0,0,115,10,0,0,0,116,0,124,0,124,1,131, + 2,83,0,41,1,122,95,76,111,97,100,32,97,32,102,114, + 111,122,101,110,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,41,1,114,98,0,0,0,114,170,0, 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,54,0,0,0,95,3,0,0,115,2,0,0,0,0, - 2,122,28,95,73,109,112,111,114,116,76,111,99,107,67,111, - 110,116,101,120,116,46,95,95,101,110,116,101,114,95,95,99, - 4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, - 2,0,0,0,67,0,0,0,115,12,0,0,0,116,0,160, - 1,161,0,1,0,100,1,83,0,41,2,122,60,82,101,108, - 101,97,115,101,32,116,104,101,32,105,109,112,111,114,116,32, - 108,111,99,107,32,114,101,103,97,114,100,108,101,115,115,32, - 111,102,32,97,110,121,32,114,97,105,115,101,100,32,101,120, - 99,101,112,116,105,111,110,115,46,78,41,2,114,57,0,0, - 0,114,59,0,0,0,41,4,114,30,0,0,0,218,8,101, - 120,99,95,116,121,112,101,218,9,101,120,99,95,118,97,108, - 117,101,218,13,101,120,99,95,116,114,97,99,101,98,97,99, - 107,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,56,0,0,0,99,3,0,0,115,2,0,0,0,0,2, - 122,27,95,73,109,112,111,114,116,76,111,99,107,67,111,110, - 116,101,120,116,46,95,95,101,120,105,116,95,95,78,41,6, - 114,1,0,0,0,114,0,0,0,0,114,2,0,0,0,114, - 3,0,0,0,114,54,0,0,0,114,56,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,178,0,0,0,91,3,0,0,115,6,0,0,0, - 8,2,4,2,8,4,114,178,0,0,0,99,3,0,0,0, - 0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,0, - 67,0,0,0,115,64,0,0,0,124,1,160,0,100,1,124, - 2,100,2,24,0,161,2,125,3,116,1,124,3,131,1,124, - 2,107,0,114,36,116,2,100,3,131,1,130,1,124,3,100, - 4,25,0,125,4,124,0,114,60,100,5,160,3,124,4,124, - 0,161,2,83,0,124,4,83,0,41,6,122,50,82,101,115, - 111,108,118,101,32,97,32,114,101,108,97,116,105,118,101,32, - 109,111,100,117,108,101,32,110,97,109,101,32,116,111,32,97, - 110,32,97,98,115,111,108,117,116,101,32,111,110,101,46,114, - 128,0,0,0,114,37,0,0,0,122,50,97,116,116,101,109, - 112,116,101,100,32,114,101,108,97,116,105,118,101,32,105,109, - 112,111,114,116,32,98,101,121,111,110,100,32,116,111,112,45, - 108,101,118,101,108,32,112,97,99,107,97,103,101,114,22,0, - 0,0,250,5,123,125,46,123,125,41,4,218,6,114,115,112, - 108,105,116,218,3,108,101,110,218,10,86,97,108,117,101,69, - 114,114,111,114,114,45,0,0,0,41,5,114,17,0,0,0, - 218,7,112,97,99,107,97,103,101,218,5,108,101,118,101,108, - 90,4,98,105,116,115,90,4,98,97,115,101,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,13,95,114,101, - 115,111,108,118,101,95,110,97,109,101,104,3,0,0,115,10, - 0,0,0,0,2,16,1,12,1,8,1,8,1,114,188,0, - 0,0,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,34,0,0,0, - 124,0,160,0,124,1,124,2,161,2,125,3,124,3,100,0, - 107,8,114,24,100,0,83,0,116,1,124,1,124,3,131,2, - 83,0,114,13,0,0,0,41,2,114,167,0,0,0,114,91, - 0,0,0,41,4,218,6,102,105,110,100,101,114,114,17,0, - 0,0,114,164,0,0,0,114,109,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,17,95,102,105, - 110,100,95,115,112,101,99,95,108,101,103,97,99,121,113,3, - 0,0,115,8,0,0,0,0,3,12,1,8,1,4,1,114, - 190,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, - 0,10,0,0,0,10,0,0,0,67,0,0,0,115,12,1, - 0,0,116,0,106,1,125,3,124,3,100,1,107,8,114,22, - 116,2,100,2,131,1,130,1,124,3,115,38,116,3,160,4, - 100,3,116,5,161,2,1,0,124,0,116,0,106,6,107,6, - 125,4,124,3,68,0,93,210,125,5,116,7,131,0,143,84, - 1,0,122,10,124,5,106,8,125,6,87,0,110,54,4,0, - 116,9,107,10,114,128,1,0,1,0,1,0,116,10,124,5, - 124,0,124,1,131,3,125,7,124,7,100,1,107,8,114,124, - 89,0,87,0,53,0,81,0,82,0,163,0,113,52,89,0, - 110,14,88,0,124,6,124,0,124,1,124,2,131,3,125,7, - 87,0,53,0,81,0,82,0,88,0,124,7,100,1,107,9, - 114,52,124,4,144,0,115,254,124,0,116,0,106,6,107,6, - 144,0,114,254,116,0,106,6,124,0,25,0,125,8,122,10, - 124,8,106,11,125,9,87,0,110,28,4,0,116,9,107,10, - 114,226,1,0,1,0,1,0,124,7,6,0,89,0,2,0, - 1,0,83,0,88,0,124,9,100,1,107,8,114,244,124,7, - 2,0,1,0,83,0,124,9,2,0,1,0,83,0,113,52, - 124,7,2,0,1,0,83,0,113,52,100,1,83,0,41,4, - 122,21,70,105,110,100,32,97,32,109,111,100,117,108,101,39, - 115,32,115,112,101,99,46,78,122,53,115,121,115,46,109,101, - 116,97,95,112,97,116,104,32,105,115,32,78,111,110,101,44, - 32,80,121,116,104,111,110,32,105,115,32,108,105,107,101,108, - 121,32,115,104,117,116,116,105,110,103,32,100,111,119,110,122, - 22,115,121,115,46,109,101,116,97,95,112,97,116,104,32,105, - 115,32,101,109,112,116,121,41,12,114,15,0,0,0,218,9, - 109,101,116,97,95,112,97,116,104,114,79,0,0,0,218,9, - 95,119,97,114,110,105,110,103,115,218,4,119,97,114,110,218, - 13,73,109,112,111,114,116,87,97,114,110,105,110,103,114,92, - 0,0,0,114,178,0,0,0,114,166,0,0,0,114,106,0, - 0,0,114,190,0,0,0,114,105,0,0,0,41,10,114,17, - 0,0,0,114,164,0,0,0,114,165,0,0,0,114,191,0, - 0,0,90,9,105,115,95,114,101,108,111,97,100,114,189,0, - 0,0,114,166,0,0,0,114,95,0,0,0,114,96,0,0, - 0,114,105,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,10,95,102,105,110,100,95,115,112,101, - 99,122,3,0,0,115,54,0,0,0,0,2,6,1,8,2, - 8,3,4,1,12,5,10,1,8,1,8,1,2,1,10,1, - 14,1,12,1,8,1,20,2,22,1,8,2,18,1,10,1, - 2,1,10,1,14,4,14,2,8,1,8,2,10,2,10,2, - 114,195,0,0,0,99,3,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,5,0,0,0,67,0,0,0,115,108, - 0,0,0,116,0,124,0,116,1,131,2,115,28,116,2,100, - 1,160,3,116,4,124,0,131,1,161,1,131,1,130,1,124, - 2,100,2,107,0,114,44,116,5,100,3,131,1,130,1,124, - 2,100,2,107,4,114,84,116,0,124,1,116,1,131,2,115, - 72,116,2,100,4,131,1,130,1,110,12,124,1,115,84,116, - 6,100,5,131,1,130,1,124,0,115,104,124,2,100,2,107, - 2,114,104,116,5,100,6,131,1,130,1,100,7,83,0,41, - 8,122,28,86,101,114,105,102,121,32,97,114,103,117,109,101, - 110,116,115,32,97,114,101,32,34,115,97,110,101,34,46,122, - 31,109,111,100,117,108,101,32,110,97,109,101,32,109,117,115, - 116,32,98,101,32,115,116,114,44,32,110,111,116,32,123,125, - 114,22,0,0,0,122,18,108,101,118,101,108,32,109,117,115, - 116,32,98,101,32,62,61,32,48,122,31,95,95,112,97,99, - 107,97,103,101,95,95,32,110,111,116,32,115,101,116,32,116, - 111,32,97,32,115,116,114,105,110,103,122,54,97,116,116,101, - 109,112,116,101,100,32,114,101,108,97,116,105,118,101,32,105, - 109,112,111,114,116,32,119,105,116,104,32,110,111,32,107,110, - 111,119,110,32,112,97,114,101,110,116,32,112,97,99,107,97, - 103,101,122,17,69,109,112,116,121,32,109,111,100,117,108,101, - 32,110,97,109,101,78,41,7,218,10,105,115,105,110,115,116, - 97,110,99,101,218,3,115,116,114,218,9,84,121,112,101,69, - 114,114,111,114,114,45,0,0,0,114,14,0,0,0,114,185, - 0,0,0,114,79,0,0,0,169,3,114,17,0,0,0,114, - 186,0,0,0,114,187,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,13,95,115,97,110,105,116, - 121,95,99,104,101,99,107,169,3,0,0,115,22,0,0,0, - 0,2,10,1,18,1,8,1,8,1,8,1,10,1,10,1, - 4,1,8,2,12,1,114,200,0,0,0,122,16,78,111,32, - 109,111,100,117,108,101,32,110,97,109,101,100,32,122,4,123, - 33,114,125,99,2,0,0,0,0,0,0,0,0,0,0,0, - 8,0,0,0,8,0,0,0,67,0,0,0,115,220,0,0, - 0,100,0,125,2,124,0,160,0,100,1,161,1,100,2,25, - 0,125,3,124,3,114,134,124,3,116,1,106,2,107,7,114, - 42,116,3,124,1,124,3,131,2,1,0,124,0,116,1,106, - 2,107,6,114,62,116,1,106,2,124,0,25,0,83,0,116, - 1,106,2,124,3,25,0,125,4,122,10,124,4,106,4,125, - 2,87,0,110,50,4,0,116,5,107,10,114,132,1,0,1, - 0,1,0,116,6,100,3,23,0,160,7,124,0,124,3,161, - 2,125,5,116,8,124,5,124,0,100,4,141,2,100,0,130, - 2,89,0,110,2,88,0,116,9,124,0,124,2,131,2,125, - 6,124,6,100,0,107,8,114,172,116,8,116,6,160,7,124, - 0,161,1,124,0,100,4,141,2,130,1,110,8,116,10,124, - 6,131,1,125,7,124,3,114,216,116,1,106,2,124,3,25, - 0,125,4,116,11,124,4,124,0,160,0,100,1,161,1,100, - 5,25,0,124,7,131,3,1,0,124,7,83,0,41,6,78, - 114,128,0,0,0,114,22,0,0,0,122,23,59,32,123,33, - 114,125,32,105,115,32,110,111,116,32,97,32,112,97,99,107, - 97,103,101,114,16,0,0,0,233,2,0,0,0,41,12,114, - 129,0,0,0,114,15,0,0,0,114,92,0,0,0,114,67, - 0,0,0,114,141,0,0,0,114,106,0,0,0,218,8,95, - 69,82,82,95,77,83,71,114,45,0,0,0,218,19,77,111, - 100,117,108,101,78,111,116,70,111,117,110,100,69,114,114,111, - 114,114,195,0,0,0,114,159,0,0,0,114,5,0,0,0, - 41,8,114,17,0,0,0,218,7,105,109,112,111,114,116,95, - 114,164,0,0,0,114,130,0,0,0,90,13,112,97,114,101, - 110,116,95,109,111,100,117,108,101,114,157,0,0,0,114,95, - 0,0,0,114,96,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,23,95,102,105,110,100,95,97, - 110,100,95,108,111,97,100,95,117,110,108,111,99,107,101,100, - 188,3,0,0,115,42,0,0,0,0,1,4,1,14,1,4, - 1,10,1,10,2,10,1,10,1,10,1,2,1,10,1,14, - 1,16,1,20,1,10,1,8,1,20,2,8,1,4,2,10, - 1,22,1,114,205,0,0,0,99,2,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,10,0,0,0,67,0,0, - 0,115,106,0,0,0,116,0,124,0,131,1,143,50,1,0, - 116,1,106,2,160,3,124,0,116,4,161,2,125,2,124,2, - 116,4,107,8,114,54,116,5,124,0,124,1,131,2,87,0, - 2,0,53,0,81,0,82,0,163,0,83,0,87,0,53,0, - 81,0,82,0,88,0,124,2,100,1,107,8,114,94,100,2, - 160,6,124,0,161,1,125,3,116,7,124,3,124,0,100,3, - 141,2,130,1,116,8,124,0,131,1,1,0,124,2,83,0, - 41,4,122,25,70,105,110,100,32,97,110,100,32,108,111,97, - 100,32,116,104,101,32,109,111,100,117,108,101,46,78,122,40, - 105,109,112,111,114,116,32,111,102,32,123,125,32,104,97,108, - 116,101,100,59,32,78,111,110,101,32,105,110,32,115,121,115, - 46,109,111,100,117,108,101,115,114,16,0,0,0,41,9,114, - 50,0,0,0,114,15,0,0,0,114,92,0,0,0,114,34, - 0,0,0,218,14,95,78,69,69,68,83,95,76,79,65,68, - 73,78,71,114,205,0,0,0,114,45,0,0,0,114,203,0, - 0,0,114,65,0,0,0,41,4,114,17,0,0,0,114,204, - 0,0,0,114,96,0,0,0,114,75,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,14,95,102, - 105,110,100,95,97,110,100,95,108,111,97,100,218,3,0,0, - 115,22,0,0,0,0,2,10,1,14,1,8,1,32,2,8, - 1,4,1,2,255,4,2,12,2,8,1,114,207,0,0,0, - 114,22,0,0,0,99,3,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,42, - 0,0,0,116,0,124,0,124,1,124,2,131,3,1,0,124, - 2,100,1,107,4,114,32,116,1,124,0,124,1,124,2,131, - 3,125,0,116,2,124,0,116,3,131,2,83,0,41,2,97, - 50,1,0,0,73,109,112,111,114,116,32,97,110,100,32,114, - 101,116,117,114,110,32,116,104,101,32,109,111,100,117,108,101, - 32,98,97,115,101,100,32,111,110,32,105,116,115,32,110,97, - 109,101,44,32,116,104,101,32,112,97,99,107,97,103,101,32, - 116,104,101,32,99,97,108,108,32,105,115,10,32,32,32,32, - 98,101,105,110,103,32,109,97,100,101,32,102,114,111,109,44, - 32,97,110,100,32,116,104,101,32,108,101,118,101,108,32,97, - 100,106,117,115,116,109,101,110,116,46,10,10,32,32,32,32, - 84,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101, - 112,114,101,115,101,110,116,115,32,116,104,101,32,103,114,101, - 97,116,101,115,116,32,99,111,109,109,111,110,32,100,101,110, - 111,109,105,110,97,116,111,114,32,111,102,32,102,117,110,99, - 116,105,111,110,97,108,105,116,121,10,32,32,32,32,98,101, - 116,119,101,101,110,32,105,109,112,111,114,116,95,109,111,100, - 117,108,101,32,97,110,100,32,95,95,105,109,112,111,114,116, - 95,95,46,32,84,104,105,115,32,105,110,99,108,117,100,101, - 115,32,115,101,116,116,105,110,103,32,95,95,112,97,99,107, - 97,103,101,95,95,32,105,102,10,32,32,32,32,116,104,101, - 32,108,111,97,100,101,114,32,100,105,100,32,110,111,116,46, - 10,10,32,32,32,32,114,22,0,0,0,41,4,114,200,0, - 0,0,114,188,0,0,0,114,207,0,0,0,218,11,95,103, - 99,100,95,105,109,112,111,114,116,114,199,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,208,0, - 0,0,234,3,0,0,115,8,0,0,0,0,9,12,1,8, - 1,12,1,114,208,0,0,0,169,1,218,9,114,101,99,117, - 114,115,105,118,101,99,3,0,0,0,0,0,0,0,1,0, - 0,0,8,0,0,0,11,0,0,0,67,0,0,0,115,226, - 0,0,0,124,1,68,0,93,216,125,4,116,0,124,4,116, - 1,131,2,115,66,124,3,114,34,124,0,106,2,100,1,23, - 0,125,5,110,4,100,2,125,5,116,3,100,3,124,5,155, - 0,100,4,116,4,124,4,131,1,106,2,155,0,157,4,131, - 1,130,1,113,4,124,4,100,5,107,2,114,108,124,3,115, - 220,116,5,124,0,100,6,131,2,114,220,116,6,124,0,124, - 0,106,7,124,2,100,7,100,8,141,4,1,0,113,4,116, - 5,124,0,124,4,131,2,115,4,100,9,160,8,124,0,106, - 2,124,4,161,2,125,6,122,14,116,9,124,2,124,6,131, - 2,1,0,87,0,113,4,4,0,116,10,107,10,114,218,1, - 0,125,7,1,0,122,42,124,7,106,11,124,6,107,2,114, - 200,116,12,106,13,160,14,124,6,116,15,161,2,100,10,107, - 9,114,200,87,0,89,0,162,8,113,4,130,0,87,0,53, - 0,100,10,125,7,126,7,88,0,89,0,113,4,88,0,113, - 4,124,0,83,0,41,11,122,238,70,105,103,117,114,101,32, - 111,117,116,32,119,104,97,116,32,95,95,105,109,112,111,114, - 116,95,95,32,115,104,111,117,108,100,32,114,101,116,117,114, - 110,46,10,10,32,32,32,32,84,104,101,32,105,109,112,111, - 114,116,95,32,112,97,114,97,109,101,116,101,114,32,105,115, - 32,97,32,99,97,108,108,97,98,108,101,32,119,104,105,99, - 104,32,116,97,107,101,115,32,116,104,101,32,110,97,109,101, - 32,111,102,32,109,111,100,117,108,101,32,116,111,10,32,32, - 32,32,105,109,112,111,114,116,46,32,73,116,32,105,115,32, - 114,101,113,117,105,114,101,100,32,116,111,32,100,101,99,111, - 117,112,108,101,32,116,104,101,32,102,117,110,99,116,105,111, - 110,32,102,114,111,109,32,97,115,115,117,109,105,110,103,32, - 105,109,112,111,114,116,108,105,98,39,115,10,32,32,32,32, - 105,109,112,111,114,116,32,105,109,112,108,101,109,101,110,116, - 97,116,105,111,110,32,105,115,32,100,101,115,105,114,101,100, - 46,10,10,32,32,32,32,122,8,46,95,95,97,108,108,95, - 95,122,13,96,96,102,114,111,109,32,108,105,115,116,39,39, - 122,8,73,116,101,109,32,105,110,32,122,18,32,109,117,115, - 116,32,98,101,32,115,116,114,44,32,110,111,116,32,250,1, - 42,218,7,95,95,97,108,108,95,95,84,114,209,0,0,0, - 114,182,0,0,0,78,41,16,114,196,0,0,0,114,197,0, - 0,0,114,1,0,0,0,114,198,0,0,0,114,14,0,0, - 0,114,4,0,0,0,218,16,95,104,97,110,100,108,101,95, - 102,114,111,109,108,105,115,116,114,212,0,0,0,114,45,0, - 0,0,114,67,0,0,0,114,203,0,0,0,114,17,0,0, - 0,114,15,0,0,0,114,92,0,0,0,114,34,0,0,0, - 114,206,0,0,0,41,8,114,96,0,0,0,218,8,102,114, - 111,109,108,105,115,116,114,204,0,0,0,114,210,0,0,0, - 218,1,120,90,5,119,104,101,114,101,90,9,102,114,111,109, - 95,110,97,109,101,90,3,101,120,99,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,213,0,0,0,249,3, - 0,0,115,44,0,0,0,0,10,8,1,10,1,4,1,12, - 2,4,1,28,2,8,1,14,1,10,1,2,255,8,2,10, - 1,14,1,2,1,14,1,16,4,10,1,16,255,2,2,8, - 1,22,1,114,213,0,0,0,99,1,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,6,0,0,0,67,0,0, - 0,115,146,0,0,0,124,0,160,0,100,1,161,1,125,1, - 124,0,160,0,100,2,161,1,125,2,124,1,100,3,107,9, - 114,82,124,2,100,3,107,9,114,78,124,1,124,2,106,1, - 107,3,114,78,116,2,106,3,100,4,124,1,155,2,100,5, - 124,2,106,1,155,2,100,6,157,5,116,4,100,7,100,8, - 141,3,1,0,124,1,83,0,124,2,100,3,107,9,114,96, - 124,2,106,1,83,0,116,2,106,3,100,9,116,4,100,7, - 100,8,141,3,1,0,124,0,100,10,25,0,125,1,100,11, - 124,0,107,7,114,142,124,1,160,5,100,12,161,1,100,13, - 25,0,125,1,124,1,83,0,41,14,122,167,67,97,108,99, - 117,108,97,116,101,32,119,104,97,116,32,95,95,112,97,99, - 107,97,103,101,95,95,32,115,104,111,117,108,100,32,98,101, - 46,10,10,32,32,32,32,95,95,112,97,99,107,97,103,101, - 95,95,32,105,115,32,110,111,116,32,103,117,97,114,97,110, - 116,101,101,100,32,116,111,32,98,101,32,100,101,102,105,110, - 101,100,32,111,114,32,99,111,117,108,100,32,98,101,32,115, - 101,116,32,116,111,32,78,111,110,101,10,32,32,32,32,116, - 111,32,114,101,112,114,101,115,101,110,116,32,116,104,97,116, - 32,105,116,115,32,112,114,111,112,101,114,32,118,97,108,117, - 101,32,105,115,32,117,110,107,110,111,119,110,46,10,10,32, - 32,32,32,114,145,0,0,0,114,105,0,0,0,78,122,32, - 95,95,112,97,99,107,97,103,101,95,95,32,33,61,32,95, - 95,115,112,101,99,95,95,46,112,97,114,101,110,116,32,40, - 122,4,32,33,61,32,250,1,41,233,3,0,0,0,41,1, - 90,10,115,116,97,99,107,108,101,118,101,108,122,89,99,97, - 110,39,116,32,114,101,115,111,108,118,101,32,112,97,99,107, - 97,103,101,32,102,114,111,109,32,95,95,115,112,101,99,95, - 95,32,111,114,32,95,95,112,97,99,107,97,103,101,95,95, - 44,32,102,97,108,108,105,110,103,32,98,97,99,107,32,111, - 110,32,95,95,110,97,109,101,95,95,32,97,110,100,32,95, - 95,112,97,116,104,95,95,114,1,0,0,0,114,141,0,0, - 0,114,128,0,0,0,114,22,0,0,0,41,6,114,34,0, - 0,0,114,130,0,0,0,114,192,0,0,0,114,193,0,0, - 0,114,194,0,0,0,114,129,0,0,0,41,3,218,7,103, - 108,111,98,97,108,115,114,186,0,0,0,114,95,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 17,95,99,97,108,99,95,95,95,112,97,99,107,97,103,101, - 95,95,30,4,0,0,115,38,0,0,0,0,7,10,1,10, - 1,8,1,18,1,22,2,2,0,2,254,6,3,4,1,8, - 1,6,2,6,2,2,0,2,254,6,3,8,1,8,1,14, - 1,114,219,0,0,0,114,10,0,0,0,99,5,0,0,0, - 0,0,0,0,0,0,0,0,9,0,0,0,5,0,0,0, - 67,0,0,0,115,180,0,0,0,124,4,100,1,107,2,114, - 18,116,0,124,0,131,1,125,5,110,36,124,1,100,2,107, - 9,114,30,124,1,110,2,105,0,125,6,116,1,124,6,131, - 1,125,7,116,0,124,0,124,7,124,4,131,3,125,5,124, - 3,115,150,124,4,100,1,107,2,114,84,116,0,124,0,160, - 2,100,3,161,1,100,1,25,0,131,1,83,0,124,0,115, - 92,124,5,83,0,116,3,124,0,131,1,116,3,124,0,160, - 2,100,3,161,1,100,1,25,0,131,1,24,0,125,8,116, - 4,106,5,124,5,106,6,100,2,116,3,124,5,106,6,131, - 1,124,8,24,0,133,2,25,0,25,0,83,0,110,26,116, - 7,124,5,100,4,131,2,114,172,116,8,124,5,124,3,116, - 0,131,3,83,0,124,5,83,0,100,2,83,0,41,5,97, - 215,1,0,0,73,109,112,111,114,116,32,97,32,109,111,100, - 117,108,101,46,10,10,32,32,32,32,84,104,101,32,39,103, - 108,111,98,97,108,115,39,32,97,114,103,117,109,101,110,116, - 32,105,115,32,117,115,101,100,32,116,111,32,105,110,102,101, - 114,32,119,104,101,114,101,32,116,104,101,32,105,109,112,111, - 114,116,32,105,115,32,111,99,99,117,114,114,105,110,103,32, - 102,114,111,109,10,32,32,32,32,116,111,32,104,97,110,100, - 108,101,32,114,101,108,97,116,105,118,101,32,105,109,112,111, - 114,116,115,46,32,84,104,101,32,39,108,111,99,97,108,115, - 39,32,97,114,103,117,109,101,110,116,32,105,115,32,105,103, - 110,111,114,101,100,46,32,84,104,101,10,32,32,32,32,39, - 102,114,111,109,108,105,115,116,39,32,97,114,103,117,109,101, - 110,116,32,115,112,101,99,105,102,105,101,115,32,119,104,97, - 116,32,115,104,111,117,108,100,32,101,120,105,115,116,32,97, - 115,32,97,116,116,114,105,98,117,116,101,115,32,111,110,32, - 116,104,101,32,109,111,100,117,108,101,10,32,32,32,32,98, - 101,105,110,103,32,105,109,112,111,114,116,101,100,32,40,101, - 46,103,46,32,96,96,102,114,111,109,32,109,111,100,117,108, - 101,32,105,109,112,111,114,116,32,60,102,114,111,109,108,105, - 115,116,62,96,96,41,46,32,32,84,104,101,32,39,108,101, - 118,101,108,39,10,32,32,32,32,97,114,103,117,109,101,110, - 116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101, - 32,112,97,99,107,97,103,101,32,108,111,99,97,116,105,111, - 110,32,116,111,32,105,109,112,111,114,116,32,102,114,111,109, - 32,105,110,32,97,32,114,101,108,97,116,105,118,101,10,32, - 32,32,32,105,109,112,111,114,116,32,40,101,46,103,46,32, - 96,96,102,114,111,109,32,46,46,112,107,103,32,105,109,112, - 111,114,116,32,109,111,100,96,96,32,119,111,117,108,100,32, - 104,97,118,101,32,97,32,39,108,101,118,101,108,39,32,111, - 102,32,50,41,46,10,10,32,32,32,32,114,22,0,0,0, - 78,114,128,0,0,0,114,141,0,0,0,41,9,114,208,0, - 0,0,114,219,0,0,0,218,9,112,97,114,116,105,116,105, - 111,110,114,184,0,0,0,114,15,0,0,0,114,92,0,0, - 0,114,1,0,0,0,114,4,0,0,0,114,213,0,0,0, - 41,9,114,17,0,0,0,114,218,0,0,0,218,6,108,111, - 99,97,108,115,114,214,0,0,0,114,187,0,0,0,114,96, - 0,0,0,90,8,103,108,111,98,97,108,115,95,114,186,0, - 0,0,90,7,99,117,116,95,111,102,102,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,10,95,95,105,109, - 112,111,114,116,95,95,57,4,0,0,115,30,0,0,0,0, - 11,8,1,10,2,16,1,8,1,12,1,4,3,8,1,18, - 1,4,1,4,4,26,3,32,1,10,1,12,2,114,222,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, - 116,0,160,1,124,0,161,1,125,1,124,1,100,0,107,8, - 114,30,116,2,100,1,124,0,23,0,131,1,130,1,116,3, - 124,1,131,1,83,0,41,2,78,122,25,110,111,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,32,110,97, - 109,101,100,32,41,4,114,160,0,0,0,114,166,0,0,0, - 114,79,0,0,0,114,159,0,0,0,41,2,114,17,0,0, - 0,114,95,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,18,95,98,117,105,108,116,105,110,95, - 102,114,111,109,95,110,97,109,101,94,4,0,0,115,8,0, - 0,0,0,1,10,1,8,1,12,1,114,223,0,0,0,99, - 2,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0, - 5,0,0,0,67,0,0,0,115,166,0,0,0,124,1,97, - 0,124,0,97,1,116,2,116,1,131,1,125,2,116,1,106, - 3,160,4,161,0,68,0,93,72,92,2,125,3,125,4,116, - 5,124,4,124,2,131,2,114,26,124,3,116,1,106,6,107, - 6,114,60,116,7,125,5,110,18,116,0,160,8,124,3,161, - 1,114,26,116,9,125,5,110,2,113,26,116,10,124,4,124, - 5,131,2,125,6,116,11,124,6,124,4,131,2,1,0,113, - 26,116,1,106,3,116,12,25,0,125,7,100,1,68,0,93, - 46,125,8,124,8,116,1,106,3,107,7,114,138,116,13,124, - 8,131,1,125,9,110,10,116,1,106,3,124,8,25,0,125, - 9,116,14,124,7,124,8,124,9,131,3,1,0,113,114,100, - 2,83,0,41,3,122,250,83,101,116,117,112,32,105,109,112, - 111,114,116,108,105,98,32,98,121,32,105,109,112,111,114,116, - 105,110,103,32,110,101,101,100,101,100,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,10,32, - 32,32,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,65,115,32,115,121,115,32,105,115,32,110,101,101, - 100,101,100,32,102,111,114,32,115,121,115,46,109,111,100,117, - 108,101,115,32,97,99,99,101,115,115,32,97,110,100,32,95, - 105,109,112,32,105,115,32,110,101,101,100,101,100,32,116,111, - 32,108,111,97,100,32,98,117,105,108,116,45,105,110,10,32, - 32,32,32,109,111,100,117,108,101,115,44,32,116,104,111,115, - 101,32,116,119,111,32,109,111,100,117,108,101,115,32,109,117, - 115,116,32,98,101,32,101,120,112,108,105,99,105,116,108,121, - 32,112,97,115,115,101,100,32,105,110,46,10,10,32,32,32, - 32,41,3,114,23,0,0,0,114,192,0,0,0,114,64,0, - 0,0,78,41,15,114,57,0,0,0,114,15,0,0,0,114, - 14,0,0,0,114,92,0,0,0,218,5,105,116,101,109,115, - 114,196,0,0,0,114,78,0,0,0,114,160,0,0,0,114, - 88,0,0,0,114,173,0,0,0,114,142,0,0,0,114,148, - 0,0,0,114,1,0,0,0,114,223,0,0,0,114,5,0, - 0,0,41,10,218,10,115,121,115,95,109,111,100,117,108,101, - 218,11,95,105,109,112,95,109,111,100,117,108,101,90,11,109, - 111,100,117,108,101,95,116,121,112,101,114,17,0,0,0,114, - 96,0,0,0,114,109,0,0,0,114,95,0,0,0,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,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,6,95,115,101,116,117,112, - 101,4,0,0,115,36,0,0,0,0,9,4,1,4,3,8, - 1,18,1,10,1,10,1,6,1,10,1,6,2,2,1,10, - 1,12,3,10,1,8,1,10,1,10,2,10,1,114,227,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,38,0,0,0, - 116,0,124,0,124,1,131,2,1,0,116,1,106,2,160,3, - 116,4,161,1,1,0,116,1,106,2,160,3,116,5,161,1, - 1,0,100,1,83,0,41,2,122,48,73,110,115,116,97,108, - 108,32,105,109,112,111,114,116,101,114,115,32,102,111,114,32, - 98,117,105,108,116,105,110,32,97,110,100,32,102,114,111,122, - 101,110,32,109,111,100,117,108,101,115,78,41,6,114,227,0, - 0,0,114,15,0,0,0,114,191,0,0,0,114,120,0,0, - 0,114,160,0,0,0,114,173,0,0,0,41,2,114,225,0, - 0,0,114,226,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,8,95,105,110,115,116,97,108,108, - 136,4,0,0,115,6,0,0,0,0,2,10,2,12,1,114, - 228,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,4,0,0,0,67,0,0,0,115,32,0, - 0,0,100,1,100,2,108,0,125,0,124,0,97,1,124,0, - 160,2,116,3,106,4,116,5,25,0,161,1,1,0,100,2, - 83,0,41,3,122,57,73,110,115,116,97,108,108,32,105,109, - 112,111,114,116,101,114,115,32,116,104,97,116,32,114,101,113, - 117,105,114,101,32,101,120,116,101,114,110,97,108,32,102,105, - 108,101,115,121,115,116,101,109,32,97,99,99,101,115,115,114, - 22,0,0,0,78,41,6,218,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,126,0,0,0,114,228,0,0,0,114,15,0, - 0,0,114,92,0,0,0,114,1,0,0,0,41,1,114,229, + 0,114,156,0,0,0,72,3,0,0,115,2,0,0,0,0, + 7,122,26,70,114,111,122,101,110,73,109,112,111,114,116,101, + 114,46,108,111,97,100,95,109,111,100,117,108,101,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,10,0,0,0,116,0,160,1,124, + 1,161,1,83,0,41,1,122,45,82,101,116,117,114,110,32, + 116,104,101,32,99,111,100,101,32,111,98,106,101,99,116,32, + 102,111,114,32,116,104,101,32,102,114,111,122,101,110,32,109, + 111,100,117,108,101,46,41,2,114,58,0,0,0,114,177,0, + 0,0,114,170,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,171,0,0,0,81,3,0,0,115, + 2,0,0,0,0,4,122,23,70,114,111,122,101,110,73,109, + 112,111,114,116,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,54,82,101,116,117,114,110,32,78,111,110,101, + 32,97,115,32,102,114,111,122,101,110,32,109,111,100,117,108, + 101,115,32,100,111,32,110,111,116,32,104,97,118,101,32,115, + 111,117,114,99,101,32,99,111,100,101,46,78,114,10,0,0, + 0,114,170,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,172,0,0,0,87,3,0,0,115,2, + 0,0,0,0,4,122,25,70,114,111,122,101,110,73,109,112, + 111,114,116,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,3,0,0,0,67,0,0,0,115,10,0,0,0,116,0, + 160,1,124,1,161,1,83,0,41,1,122,46,82,101,116,117, + 114,110,32,84,114,117,101,32,105,102,32,116,104,101,32,102, + 114,111,122,101,110,32,109,111,100,117,108,101,32,105,115,32, + 97,32,112,97,99,107,97,103,101,46,41,2,114,58,0,0, + 0,90,17,105,115,95,102,114,111,122,101,110,95,112,97,99, + 107,97,103,101,114,170,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,116,0,0,0,93,3,0, + 0,115,2,0,0,0,0,4,122,25,70,114,111,122,101,110, + 73,109,112,111,114,116,101,114,46,105,115,95,112,97,99,107, + 97,103,101,41,2,78,78,41,1,78,41,17,114,1,0,0, + 0,114,0,0,0,0,114,2,0,0,0,114,3,0,0,0, + 114,139,0,0,0,114,173,0,0,0,114,100,0,0,0,114, + 174,0,0,0,114,168,0,0,0,114,169,0,0,0,114,150, + 0,0,0,114,151,0,0,0,114,156,0,0,0,114,91,0, + 0,0,114,171,0,0,0,114,172,0,0,0,114,116,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,175,0,0,0,23,3,0,0,115,46, + 0,0,0,8,2,4,7,4,2,2,1,10,8,2,1,12, + 6,2,1,12,8,2,1,10,3,2,1,10,8,2,1,10, + 8,2,1,2,1,12,4,2,1,2,1,12,4,2,1,2, + 1,114,175,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, + 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,18,95,73,109,112,111,114,116,76, + 111,99,107,67,111,110,116,101,120,116,122,36,67,111,110,116, + 101,120,116,32,109,97,110,97,103,101,114,32,102,111,114,32, + 116,104,101,32,105,109,112,111,114,116,32,108,111,99,107,46, + 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,12,0,0,0,116,0, + 160,1,161,0,1,0,100,1,83,0,41,2,122,24,65,99, + 113,117,105,114,101,32,116,104,101,32,105,109,112,111,114,116, + 32,108,111,99,107,46,78,41,2,114,58,0,0,0,114,59, + 0,0,0,114,48,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,55,0,0,0,106,3,0,0, + 115,2,0,0,0,0,2,122,28,95,73,109,112,111,114,116, + 76,111,99,107,67,111,110,116,101,120,116,46,95,95,101,110, + 116,101,114,95,95,99,4,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,2,0,0,0,67,0,0,0,115,12, + 0,0,0,116,0,160,1,161,0,1,0,100,1,83,0,41, + 2,122,60,82,101,108,101,97,115,101,32,116,104,101,32,105, + 109,112,111,114,116,32,108,111,99,107,32,114,101,103,97,114, + 100,108,101,115,115,32,111,102,32,97,110,121,32,114,97,105, + 115,101,100,32,101,120,99,101,112,116,105,111,110,115,46,78, + 41,2,114,58,0,0,0,114,61,0,0,0,41,4,114,30, + 0,0,0,218,8,101,120,99,95,116,121,112,101,218,9,101, + 120,99,95,118,97,108,117,101,218,13,101,120,99,95,116,114, + 97,99,101,98,97,99,107,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,57,0,0,0,110,3,0,0,115, + 2,0,0,0,0,2,122,27,95,73,109,112,111,114,116,76, + 111,99,107,67,111,110,116,101,120,116,46,95,95,101,120,105, + 116,95,95,78,41,6,114,1,0,0,0,114,0,0,0,0, + 114,2,0,0,0,114,3,0,0,0,114,55,0,0,0,114, + 57,0,0,0,114,10,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,180,0,0,0,102,3,0, + 0,115,6,0,0,0,8,2,4,2,8,4,114,180,0,0, + 0,99,3,0,0,0,0,0,0,0,0,0,0,0,5,0, + 0,0,5,0,0,0,67,0,0,0,115,64,0,0,0,124, + 1,160,0,100,1,124,2,100,2,24,0,161,2,125,3,116, + 1,124,3,131,1,124,2,107,0,114,36,116,2,100,3,131, + 1,130,1,124,3,100,4,25,0,125,4,124,0,114,60,100, + 5,160,3,124,4,124,0,161,2,83,0,124,4,83,0,41, + 6,122,50,82,101,115,111,108,118,101,32,97,32,114,101,108, + 97,116,105,118,101,32,109,111,100,117,108,101,32,110,97,109, + 101,32,116,111,32,97,110,32,97,98,115,111,108,117,116,101, + 32,111,110,101,46,114,129,0,0,0,114,39,0,0,0,122, + 50,97,116,116,101,109,112,116,101,100,32,114,101,108,97,116, + 105,118,101,32,105,109,112,111,114,116,32,98,101,121,111,110, + 100,32,116,111,112,45,108,101,118,101,108,32,112,97,99,107, + 97,103,101,114,22,0,0,0,250,5,123,125,46,123,125,41, + 4,218,6,114,115,112,108,105,116,218,3,108,101,110,114,80, + 0,0,0,114,46,0,0,0,41,5,114,17,0,0,0,218, + 7,112,97,99,107,97,103,101,218,5,108,101,118,101,108,90, + 4,98,105,116,115,90,4,98,97,115,101,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,13,95,114,101,115, + 111,108,118,101,95,110,97,109,101,115,3,0,0,115,10,0, + 0,0,0,2,16,1,12,1,8,1,8,1,114,189,0,0, + 0,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,34,0,0,0,124, + 0,160,0,124,1,124,2,161,2,125,3,124,3,100,0,117, + 0,114,24,100,0,83,0,116,1,124,1,124,3,131,2,83, + 0,114,13,0,0,0,41,2,114,169,0,0,0,114,92,0, + 0,0,41,4,218,6,102,105,110,100,101,114,114,17,0,0, + 0,114,166,0,0,0,114,110,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,17,95,102,105,110, + 100,95,115,112,101,99,95,108,101,103,97,99,121,124,3,0, + 0,115,8,0,0,0,0,3,12,1,8,1,4,1,114,191, + 0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0, + 10,0,0,0,10,0,0,0,67,0,0,0,115,32,1,0, + 0,116,0,106,1,125,3,124,3,100,1,117,0,114,22,116, + 2,100,2,131,1,130,1,124,3,115,38,116,3,160,4,100, + 3,116,5,161,2,1,0,124,0,116,0,106,6,118,0,125, + 4,124,3,68,0,93,230,125,5,116,7,131,0,143,94,1, + 0,122,10,124,5,106,8,125,6,87,0,110,54,4,0,116, + 9,121,128,1,0,1,0,1,0,116,10,124,5,124,0,124, + 1,131,3,125,7,124,7,100,1,117,0,114,124,89,0,87, + 0,100,1,4,0,4,0,131,3,1,0,113,52,89,0,110, + 14,48,0,124,6,124,0,124,1,124,2,131,3,125,7,87, + 0,100,1,4,0,4,0,131,3,1,0,110,16,49,0,115, + 162,48,0,1,0,1,0,1,0,89,0,1,0,124,7,100, + 1,117,1,114,52,124,4,144,1,115,18,124,0,116,0,106, + 6,118,0,144,1,114,18,116,0,106,6,124,0,25,0,125, + 8,122,10,124,8,106,11,125,9,87,0,110,26,4,0,116, + 9,121,244,1,0,1,0,1,0,124,7,6,0,89,0,2, + 0,1,0,83,0,48,0,124,9,100,1,117,0,144,1,114, + 8,124,7,2,0,1,0,83,0,124,9,2,0,1,0,83, + 0,113,52,124,7,2,0,1,0,83,0,113,52,100,1,83, + 0,41,4,122,21,70,105,110,100,32,97,32,109,111,100,117, + 108,101,39,115,32,115,112,101,99,46,78,122,53,115,121,115, + 46,109,101,116,97,95,112,97,116,104,32,105,115,32,78,111, + 110,101,44,32,80,121,116,104,111,110,32,105,115,32,108,105, + 107,101,108,121,32,115,104,117,116,116,105,110,103,32,100,111, + 119,110,122,22,115,121,115,46,109,101,116,97,95,112,97,116, + 104,32,105,115,32,101,109,112,116,121,41,12,114,15,0,0, + 0,218,9,109,101,116,97,95,112,97,116,104,114,80,0,0, + 0,218,9,95,119,97,114,110,105,110,103,115,218,4,119,97, + 114,110,218,13,73,109,112,111,114,116,87,97,114,110,105,110, + 103,114,93,0,0,0,114,180,0,0,0,114,168,0,0,0, + 114,107,0,0,0,114,191,0,0,0,114,106,0,0,0,41, + 10,114,17,0,0,0,114,166,0,0,0,114,167,0,0,0, + 114,192,0,0,0,90,9,105,115,95,114,101,108,111,97,100, + 114,190,0,0,0,114,168,0,0,0,114,96,0,0,0,114, + 97,0,0,0,114,106,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,218,10,95,102,105,110,100,95, + 115,112,101,99,133,3,0,0,115,54,0,0,0,0,2,6, + 1,8,2,8,3,4,1,12,5,10,1,8,1,8,1,2, + 1,10,1,12,1,12,1,8,1,22,2,42,1,8,2,18, + 1,10,1,2,1,10,1,12,4,14,2,10,1,8,2,10, + 2,10,2,114,196,0,0,0,99,3,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,5,0,0,0,67,0,0, + 0,115,108,0,0,0,116,0,124,0,116,1,131,2,115,28, + 116,2,100,1,160,3,116,4,124,0,131,1,161,1,131,1, + 130,1,124,2,100,2,107,0,114,44,116,5,100,3,131,1, + 130,1,124,2,100,2,107,4,114,84,116,0,124,1,116,1, + 131,2,115,72,116,2,100,4,131,1,130,1,110,12,124,1, + 115,84,116,6,100,5,131,1,130,1,124,0,115,104,124,2, + 100,2,107,2,114,104,116,5,100,6,131,1,130,1,100,7, + 83,0,41,8,122,28,86,101,114,105,102,121,32,97,114,103, + 117,109,101,110,116,115,32,97,114,101,32,34,115,97,110,101, + 34,46,122,31,109,111,100,117,108,101,32,110,97,109,101,32, + 109,117,115,116,32,98,101,32,115,116,114,44,32,110,111,116, + 32,123,125,114,22,0,0,0,122,18,108,101,118,101,108,32, + 109,117,115,116,32,98,101,32,62,61,32,48,122,31,95,95, + 112,97,99,107,97,103,101,95,95,32,110,111,116,32,115,101, + 116,32,116,111,32,97,32,115,116,114,105,110,103,122,54,97, + 116,116,101,109,112,116,101,100,32,114,101,108,97,116,105,118, + 101,32,105,109,112,111,114,116,32,119,105,116,104,32,110,111, + 32,107,110,111,119,110,32,112,97,114,101,110,116,32,112,97, + 99,107,97,103,101,122,17,69,109,112,116,121,32,109,111,100, + 117,108,101,32,110,97,109,101,78,41,7,218,10,105,115,105, + 110,115,116,97,110,99,101,218,3,115,116,114,218,9,84,121, + 112,101,69,114,114,111,114,114,46,0,0,0,114,14,0,0, + 0,218,10,86,97,108,117,101,69,114,114,111,114,114,80,0, + 0,0,169,3,114,17,0,0,0,114,187,0,0,0,114,188, 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,27,95,105,110,115,116,97,108,108,95,101,120,116, - 101,114,110,97,108,95,105,109,112,111,114,116,101,114,115,144, - 4,0,0,115,6,0,0,0,0,3,8,1,4,1,114,230, - 0,0,0,41,2,78,78,41,1,78,41,2,78,114,22,0, - 0,0,41,4,78,78,114,10,0,0,0,114,22,0,0,0, - 41,50,114,3,0,0,0,114,126,0,0,0,114,12,0,0, - 0,114,18,0,0,0,114,60,0,0,0,114,33,0,0,0, - 114,42,0,0,0,114,19,0,0,0,114,20,0,0,0,114, - 49,0,0,0,114,50,0,0,0,114,53,0,0,0,114,65, - 0,0,0,114,67,0,0,0,114,76,0,0,0,114,86,0, - 0,0,114,90,0,0,0,114,97,0,0,0,114,111,0,0, - 0,114,112,0,0,0,114,91,0,0,0,114,142,0,0,0, - 114,148,0,0,0,114,152,0,0,0,114,107,0,0,0,114, - 93,0,0,0,114,158,0,0,0,114,159,0,0,0,114,94, - 0,0,0,114,160,0,0,0,114,173,0,0,0,114,178,0, - 0,0,114,188,0,0,0,114,190,0,0,0,114,195,0,0, - 0,114,200,0,0,0,90,15,95,69,82,82,95,77,83,71, - 95,80,82,69,70,73,88,114,202,0,0,0,114,205,0,0, - 0,218,6,111,98,106,101,99,116,114,206,0,0,0,114,207, - 0,0,0,114,208,0,0,0,114,213,0,0,0,114,219,0, - 0,0,114,222,0,0,0,114,223,0,0,0,114,227,0,0, - 0,114,228,0,0,0,114,230,0,0,0,114,10,0,0,0, + 0,0,218,13,95,115,97,110,105,116,121,95,99,104,101,99, + 107,180,3,0,0,115,22,0,0,0,0,2,10,1,18,1, + 8,1,8,1,8,1,10,1,10,1,4,1,8,2,12,1, + 114,202,0,0,0,122,16,78,111,32,109,111,100,117,108,101, + 32,110,97,109,101,100,32,122,4,123,33,114,125,99,2,0, + 0,0,0,0,0,0,0,0,0,0,9,0,0,0,8,0, + 0,0,67,0,0,0,115,22,1,0,0,100,0,125,2,124, + 0,160,0,100,1,161,1,100,2,25,0,125,3,124,3,114, + 132,124,3,116,1,106,2,118,1,114,42,116,3,124,1,124, + 3,131,2,1,0,124,0,116,1,106,2,118,0,114,62,116, + 1,106,2,124,0,25,0,83,0,116,1,106,2,124,3,25, + 0,125,4,122,10,124,4,106,4,125,2,87,0,110,48,4, + 0,116,5,121,130,1,0,1,0,1,0,116,6,100,3,23, + 0,160,7,124,0,124,3,161,2,125,5,116,8,124,5,124, + 0,100,4,141,2,100,0,130,2,89,0,110,2,48,0,116, + 9,124,0,124,2,131,2,125,6,124,6,100,0,117,0,114, + 170,116,8,116,6,160,7,124,0,161,1,124,0,100,4,141, + 2,130,1,110,8,116,10,124,6,131,1,125,7,124,3,144, + 1,114,18,116,1,106,2,124,3,25,0,125,4,124,0,160, + 0,100,1,161,1,100,5,25,0,125,8,122,16,116,11,124, + 4,124,8,124,7,131,3,1,0,87,0,110,48,4,0,116, + 5,144,1,121,16,1,0,1,0,1,0,100,6,124,3,155, + 2,100,7,124,8,155,2,157,4,125,5,116,12,160,13,124, + 5,116,14,161,2,1,0,89,0,110,2,48,0,124,7,83, + 0,41,8,78,114,129,0,0,0,114,22,0,0,0,122,23, + 59,32,123,33,114,125,32,105,115,32,110,111,116,32,97,32, + 112,97,99,107,97,103,101,114,16,0,0,0,233,2,0,0, + 0,122,27,67,97,110,110,111,116,32,115,101,116,32,97,110, + 32,97,116,116,114,105,98,117,116,101,32,111,110,32,122,18, + 32,102,111,114,32,99,104,105,108,100,32,109,111,100,117,108, + 101,32,41,15,114,130,0,0,0,114,15,0,0,0,114,93, + 0,0,0,114,68,0,0,0,114,142,0,0,0,114,107,0, + 0,0,218,8,95,69,82,82,95,77,83,71,114,46,0,0, + 0,218,19,77,111,100,117,108,101,78,111,116,70,111,117,110, + 100,69,114,114,111,114,114,196,0,0,0,114,160,0,0,0, + 114,5,0,0,0,114,193,0,0,0,114,194,0,0,0,114, + 195,0,0,0,41,9,114,17,0,0,0,218,7,105,109,112, + 111,114,116,95,114,166,0,0,0,114,131,0,0,0,90,13, + 112,97,114,101,110,116,95,109,111,100,117,108,101,114,158,0, + 0,0,114,96,0,0,0,114,97,0,0,0,90,5,99,104, + 105,108,100,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,23,95,102,105,110,100,95,97,110,100,95,108,111, + 97,100,95,117,110,108,111,99,107,101,100,199,3,0,0,115, + 52,0,0,0,0,1,4,1,14,1,4,1,10,1,10,2, + 10,1,10,1,10,1,2,1,10,1,12,1,16,1,20,1, + 10,1,8,1,20,2,8,1,6,2,10,1,14,1,2,1, + 16,1,14,1,16,1,18,1,114,207,0,0,0,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,128,0,0,0,116,0,124,0,131, + 1,143,62,1,0,116,1,106,2,160,3,124,0,116,4,161, + 2,125,2,124,2,116,4,117,0,114,56,116,5,124,0,124, + 1,131,2,87,0,2,0,100,1,4,0,4,0,131,3,1, + 0,83,0,87,0,100,1,4,0,4,0,131,3,1,0,110, + 16,49,0,115,76,48,0,1,0,1,0,1,0,89,0,1, + 0,124,2,100,1,117,0,114,116,100,2,160,6,124,0,161, + 1,125,3,116,7,124,3,124,0,100,3,141,2,130,1,116, + 8,124,0,131,1,1,0,124,2,83,0,41,4,122,25,70, + 105,110,100,32,97,110,100,32,108,111,97,100,32,116,104,101, + 32,109,111,100,117,108,101,46,78,122,40,105,109,112,111,114, + 116,32,111,102,32,123,125,32,104,97,108,116,101,100,59,32, + 78,111,110,101,32,105,110,32,115,121,115,46,109,111,100,117, + 108,101,115,114,16,0,0,0,41,9,114,51,0,0,0,114, + 15,0,0,0,114,93,0,0,0,114,35,0,0,0,218,14, + 95,78,69,69,68,83,95,76,79,65,68,73,78,71,114,207, + 0,0,0,114,46,0,0,0,114,205,0,0,0,114,66,0, + 0,0,41,4,114,17,0,0,0,114,206,0,0,0,114,97, + 0,0,0,114,76,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,14,95,102,105,110,100,95,97, + 110,100,95,108,111,97,100,234,3,0,0,115,22,0,0,0, + 0,2,10,1,14,1,8,1,54,2,8,1,4,1,2,255, + 4,2,12,2,8,1,114,209,0,0,0,114,22,0,0,0, + 99,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,4,0,0,0,67,0,0,0,115,42,0,0,0,116,0, + 124,0,124,1,124,2,131,3,1,0,124,2,100,1,107,4, + 114,32,116,1,124,0,124,1,124,2,131,3,125,0,116,2, + 124,0,116,3,131,2,83,0,41,2,97,50,1,0,0,73, + 109,112,111,114,116,32,97,110,100,32,114,101,116,117,114,110, + 32,116,104,101,32,109,111,100,117,108,101,32,98,97,115,101, + 100,32,111,110,32,105,116,115,32,110,97,109,101,44,32,116, + 104,101,32,112,97,99,107,97,103,101,32,116,104,101,32,99, + 97,108,108,32,105,115,10,32,32,32,32,98,101,105,110,103, + 32,109,97,100,101,32,102,114,111,109,44,32,97,110,100,32, + 116,104,101,32,108,101,118,101,108,32,97,100,106,117,115,116, + 109,101,110,116,46,10,10,32,32,32,32,84,104,105,115,32, + 102,117,110,99,116,105,111,110,32,114,101,112,114,101,115,101, + 110,116,115,32,116,104,101,32,103,114,101,97,116,101,115,116, + 32,99,111,109,109,111,110,32,100,101,110,111,109,105,110,97, + 116,111,114,32,111,102,32,102,117,110,99,116,105,111,110,97, + 108,105,116,121,10,32,32,32,32,98,101,116,119,101,101,110, + 32,105,109,112,111,114,116,95,109,111,100,117,108,101,32,97, + 110,100,32,95,95,105,109,112,111,114,116,95,95,46,32,84, + 104,105,115,32,105,110,99,108,117,100,101,115,32,115,101,116, + 116,105,110,103,32,95,95,112,97,99,107,97,103,101,95,95, + 32,105,102,10,32,32,32,32,116,104,101,32,108,111,97,100, + 101,114,32,100,105,100,32,110,111,116,46,10,10,32,32,32, + 32,114,22,0,0,0,41,4,114,202,0,0,0,114,189,0, + 0,0,114,209,0,0,0,218,11,95,103,99,100,95,105,109, + 112,111,114,116,114,201,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,210,0,0,0,250,3,0, + 0,115,8,0,0,0,0,9,12,1,8,1,12,1,114,210, + 0,0,0,169,1,218,9,114,101,99,117,114,115,105,118,101, + 99,3,0,0,0,0,0,0,0,1,0,0,0,8,0,0, + 0,11,0,0,0,67,0,0,0,115,232,0,0,0,124,1, + 68,0,93,222,125,4,116,0,124,4,116,1,131,2,115,66, + 124,3,114,34,124,0,106,2,100,1,23,0,125,5,110,4, + 100,2,125,5,116,3,100,3,124,5,155,0,100,4,116,4, + 124,4,131,1,106,2,155,0,157,4,131,1,130,1,113,4, + 124,4,100,5,107,2,114,108,124,3,115,226,116,5,124,0, + 100,6,131,2,114,226,116,6,124,0,124,0,106,7,124,2, + 100,7,100,8,141,4,1,0,113,4,116,5,124,0,124,4, + 131,2,115,4,100,9,160,8,124,0,106,2,124,4,161,2, + 125,6,122,14,116,9,124,2,124,6,131,2,1,0,87,0, + 113,4,4,0,116,10,121,224,1,0,125,7,1,0,122,54, + 124,7,106,11,124,6,107,2,114,202,116,12,106,13,160,14, + 124,6,116,15,161,2,100,10,117,1,114,202,87,0,89,0, + 100,10,125,7,126,7,113,4,130,0,87,0,89,0,100,10, + 125,7,126,7,113,4,100,10,125,7,126,7,48,0,48,0, + 113,4,124,0,83,0,41,11,122,238,70,105,103,117,114,101, + 32,111,117,116,32,119,104,97,116,32,95,95,105,109,112,111, + 114,116,95,95,32,115,104,111,117,108,100,32,114,101,116,117, + 114,110,46,10,10,32,32,32,32,84,104,101,32,105,109,112, + 111,114,116,95,32,112,97,114,97,109,101,116,101,114,32,105, + 115,32,97,32,99,97,108,108,97,98,108,101,32,119,104,105, + 99,104,32,116,97,107,101,115,32,116,104,101,32,110,97,109, + 101,32,111,102,32,109,111,100,117,108,101,32,116,111,10,32, + 32,32,32,105,109,112,111,114,116,46,32,73,116,32,105,115, + 32,114,101,113,117,105,114,101,100,32,116,111,32,100,101,99, + 111,117,112,108,101,32,116,104,101,32,102,117,110,99,116,105, + 111,110,32,102,114,111,109,32,97,115,115,117,109,105,110,103, + 32,105,109,112,111,114,116,108,105,98,39,115,10,32,32,32, + 32,105,109,112,111,114,116,32,105,109,112,108,101,109,101,110, + 116,97,116,105,111,110,32,105,115,32,100,101,115,105,114,101, + 100,46,10,10,32,32,32,32,122,8,46,95,95,97,108,108, + 95,95,122,13,96,96,102,114,111,109,32,108,105,115,116,39, + 39,122,8,73,116,101,109,32,105,110,32,122,18,32,109,117, + 115,116,32,98,101,32,115,116,114,44,32,110,111,116,32,250, + 1,42,218,7,95,95,97,108,108,95,95,84,114,211,0,0, + 0,114,184,0,0,0,78,41,16,114,197,0,0,0,114,198, + 0,0,0,114,1,0,0,0,114,199,0,0,0,114,14,0, + 0,0,114,4,0,0,0,218,16,95,104,97,110,100,108,101, + 95,102,114,111,109,108,105,115,116,114,214,0,0,0,114,46, + 0,0,0,114,68,0,0,0,114,205,0,0,0,114,17,0, + 0,0,114,15,0,0,0,114,93,0,0,0,114,35,0,0, + 0,114,208,0,0,0,41,8,114,97,0,0,0,218,8,102, + 114,111,109,108,105,115,116,114,206,0,0,0,114,212,0,0, + 0,218,1,120,90,5,119,104,101,114,101,90,9,102,114,111, + 109,95,110,97,109,101,90,3,101,120,99,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,215,0,0,0,9, + 4,0,0,115,48,0,0,0,0,10,8,1,10,1,4,1, + 12,2,4,1,10,1,8,255,10,2,8,1,14,1,10,1, + 2,255,8,2,10,1,14,1,2,1,14,1,14,4,10,1, + 16,255,2,2,12,1,26,1,114,215,0,0,0,99,1,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,6,0, + 0,0,67,0,0,0,115,146,0,0,0,124,0,160,0,100, + 1,161,1,125,1,124,0,160,0,100,2,161,1,125,2,124, + 1,100,3,117,1,114,82,124,2,100,3,117,1,114,78,124, + 1,124,2,106,1,107,3,114,78,116,2,106,3,100,4,124, + 1,155,2,100,5,124,2,106,1,155,2,100,6,157,5,116, + 4,100,7,100,8,141,3,1,0,124,1,83,0,124,2,100, + 3,117,1,114,96,124,2,106,1,83,0,116,2,106,3,100, + 9,116,4,100,7,100,8,141,3,1,0,124,0,100,10,25, + 0,125,1,100,11,124,0,118,1,114,142,124,1,160,5,100, + 12,161,1,100,13,25,0,125,1,124,1,83,0,41,14,122, + 167,67,97,108,99,117,108,97,116,101,32,119,104,97,116,32, + 95,95,112,97,99,107,97,103,101,95,95,32,115,104,111,117, + 108,100,32,98,101,46,10,10,32,32,32,32,95,95,112,97, + 99,107,97,103,101,95,95,32,105,115,32,110,111,116,32,103, + 117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32, + 100,101,102,105,110,101,100,32,111,114,32,99,111,117,108,100, + 32,98,101,32,115,101,116,32,116,111,32,78,111,110,101,10, + 32,32,32,32,116,111,32,114,101,112,114,101,115,101,110,116, + 32,116,104,97,116,32,105,116,115,32,112,114,111,112,101,114, + 32,118,97,108,117,101,32,105,115,32,117,110,107,110,111,119, + 110,46,10,10,32,32,32,32,114,146,0,0,0,114,106,0, + 0,0,78,122,32,95,95,112,97,99,107,97,103,101,95,95, + 32,33,61,32,95,95,115,112,101,99,95,95,46,112,97,114, + 101,110,116,32,40,122,4,32,33,61,32,250,1,41,233,3, + 0,0,0,41,1,90,10,115,116,97,99,107,108,101,118,101, + 108,122,89,99,97,110,39,116,32,114,101,115,111,108,118,101, + 32,112,97,99,107,97,103,101,32,102,114,111,109,32,95,95, + 115,112,101,99,95,95,32,111,114,32,95,95,112,97,99,107, + 97,103,101,95,95,44,32,102,97,108,108,105,110,103,32,98, + 97,99,107,32,111,110,32,95,95,110,97,109,101,95,95,32, + 97,110,100,32,95,95,112,97,116,104,95,95,114,1,0,0, + 0,114,142,0,0,0,114,129,0,0,0,114,22,0,0,0, + 41,6,114,35,0,0,0,114,131,0,0,0,114,193,0,0, + 0,114,194,0,0,0,114,195,0,0,0,114,130,0,0,0, + 41,3,218,7,103,108,111,98,97,108,115,114,187,0,0,0, + 114,96,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,17,95,99,97,108,99,95,95,95,112,97, + 99,107,97,103,101,95,95,46,4,0,0,115,42,0,0,0, + 0,7,10,1,10,1,8,1,18,1,6,1,2,255,4,1, + 4,255,6,2,4,254,6,3,4,1,8,1,6,2,6,2, + 4,254,6,3,8,1,8,1,14,1,114,221,0,0,0,114, + 10,0,0,0,99,5,0,0,0,0,0,0,0,0,0,0, + 0,9,0,0,0,5,0,0,0,67,0,0,0,115,180,0, + 0,0,124,4,100,1,107,2,114,18,116,0,124,0,131,1, + 125,5,110,36,124,1,100,2,117,1,114,30,124,1,110,2, + 105,0,125,6,116,1,124,6,131,1,125,7,116,0,124,0, + 124,7,124,4,131,3,125,5,124,3,115,150,124,4,100,1, + 107,2,114,84,116,0,124,0,160,2,100,3,161,1,100,1, + 25,0,131,1,83,0,124,0,115,92,124,5,83,0,116,3, + 124,0,131,1,116,3,124,0,160,2,100,3,161,1,100,1, + 25,0,131,1,24,0,125,8,116,4,106,5,124,5,106,6, + 100,2,116,3,124,5,106,6,131,1,124,8,24,0,133,2, + 25,0,25,0,83,0,110,26,116,7,124,5,100,4,131,2, + 114,172,116,8,124,5,124,3,116,0,131,3,83,0,124,5, + 83,0,100,2,83,0,41,5,97,215,1,0,0,73,109,112, + 111,114,116,32,97,32,109,111,100,117,108,101,46,10,10,32, + 32,32,32,84,104,101,32,39,103,108,111,98,97,108,115,39, + 32,97,114,103,117,109,101,110,116,32,105,115,32,117,115,101, + 100,32,116,111,32,105,110,102,101,114,32,119,104,101,114,101, + 32,116,104,101,32,105,109,112,111,114,116,32,105,115,32,111, + 99,99,117,114,114,105,110,103,32,102,114,111,109,10,32,32, + 32,32,116,111,32,104,97,110,100,108,101,32,114,101,108,97, + 116,105,118,101,32,105,109,112,111,114,116,115,46,32,84,104, + 101,32,39,108,111,99,97,108,115,39,32,97,114,103,117,109, + 101,110,116,32,105,115,32,105,103,110,111,114,101,100,46,32, + 84,104,101,10,32,32,32,32,39,102,114,111,109,108,105,115, + 116,39,32,97,114,103,117,109,101,110,116,32,115,112,101,99, + 105,102,105,101,115,32,119,104,97,116,32,115,104,111,117,108, + 100,32,101,120,105,115,116,32,97,115,32,97,116,116,114,105, + 98,117,116,101,115,32,111,110,32,116,104,101,32,109,111,100, + 117,108,101,10,32,32,32,32,98,101,105,110,103,32,105,109, + 112,111,114,116,101,100,32,40,101,46,103,46,32,96,96,102, + 114,111,109,32,109,111,100,117,108,101,32,105,109,112,111,114, + 116,32,60,102,114,111,109,108,105,115,116,62,96,96,41,46, + 32,32,84,104,101,32,39,108,101,118,101,108,39,10,32,32, + 32,32,97,114,103,117,109,101,110,116,32,114,101,112,114,101, + 115,101,110,116,115,32,116,104,101,32,112,97,99,107,97,103, + 101,32,108,111,99,97,116,105,111,110,32,116,111,32,105,109, + 112,111,114,116,32,102,114,111,109,32,105,110,32,97,32,114, + 101,108,97,116,105,118,101,10,32,32,32,32,105,109,112,111, + 114,116,32,40,101,46,103,46,32,96,96,102,114,111,109,32, + 46,46,112,107,103,32,105,109,112,111,114,116,32,109,111,100, + 96,96,32,119,111,117,108,100,32,104,97,118,101,32,97,32, + 39,108,101,118,101,108,39,32,111,102,32,50,41,46,10,10, + 32,32,32,32,114,22,0,0,0,78,114,129,0,0,0,114, + 142,0,0,0,41,9,114,210,0,0,0,114,221,0,0,0, + 218,9,112,97,114,116,105,116,105,111,110,114,186,0,0,0, + 114,15,0,0,0,114,93,0,0,0,114,1,0,0,0,114, + 4,0,0,0,114,215,0,0,0,41,9,114,17,0,0,0, + 114,220,0,0,0,218,6,108,111,99,97,108,115,114,216,0, + 0,0,114,188,0,0,0,114,97,0,0,0,90,8,103,108, + 111,98,97,108,115,95,114,187,0,0,0,90,7,99,117,116, + 95,111,102,102,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,10,95,95,105,109,112,111,114,116,95,95,73, + 4,0,0,115,30,0,0,0,0,11,8,1,10,2,16,1, + 8,1,12,1,4,3,8,1,18,1,4,1,4,4,26,3, + 32,1,10,1,12,2,114,224,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, + 67,0,0,0,115,38,0,0,0,116,0,160,1,124,0,161, + 1,125,1,124,1,100,0,117,0,114,30,116,2,100,1,124, + 0,23,0,131,1,130,1,116,3,124,1,131,1,83,0,41, + 2,78,122,25,110,111,32,98,117,105,108,116,45,105,110,32, + 109,111,100,117,108,101,32,110,97,109,101,100,32,41,4,114, + 161,0,0,0,114,168,0,0,0,114,80,0,0,0,114,160, + 0,0,0,41,2,114,17,0,0,0,114,96,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,18, + 95,98,117,105,108,116,105,110,95,102,114,111,109,95,110,97, + 109,101,110,4,0,0,115,8,0,0,0,0,1,10,1,8, + 1,12,1,114,225,0,0,0,99,2,0,0,0,0,0,0, + 0,0,0,0,0,10,0,0,0,5,0,0,0,67,0,0, + 0,115,166,0,0,0,124,1,97,0,124,0,97,1,116,2, + 116,1,131,1,125,2,116,1,106,3,160,4,161,0,68,0, + 93,72,92,2,125,3,125,4,116,5,124,4,124,2,131,2, + 114,26,124,3,116,1,106,6,118,0,114,60,116,7,125,5, + 110,18,116,0,160,8,124,3,161,1,114,26,116,9,125,5, + 110,2,113,26,116,10,124,4,124,5,131,2,125,6,116,11, + 124,6,124,4,131,2,1,0,113,26,116,1,106,3,116,12, + 25,0,125,7,100,1,68,0,93,46,125,8,124,8,116,1, + 106,3,118,1,114,138,116,13,124,8,131,1,125,9,110,10, + 116,1,106,3,124,8,25,0,125,9,116,14,124,7,124,8, + 124,9,131,3,1,0,113,114,100,2,83,0,41,3,122,250, + 83,101,116,117,112,32,105,109,112,111,114,116,108,105,98,32, + 98,121,32,105,109,112,111,114,116,105,110,103,32,110,101,101, + 100,101,100,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,10,32,32,32,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,65,115,32,115, + 121,115,32,105,115,32,110,101,101,100,101,100,32,102,111,114, + 32,115,121,115,46,109,111,100,117,108,101,115,32,97,99,99, + 101,115,115,32,97,110,100,32,95,105,109,112,32,105,115,32, + 110,101,101,100,101,100,32,116,111,32,108,111,97,100,32,98, + 117,105,108,116,45,105,110,10,32,32,32,32,109,111,100,117, + 108,101,115,44,32,116,104,111,115,101,32,116,119,111,32,109, + 111,100,117,108,101,115,32,109,117,115,116,32,98,101,32,101, + 120,112,108,105,99,105,116,108,121,32,112,97,115,115,101,100, + 32,105,110,46,10,10,32,32,32,32,41,3,114,23,0,0, + 0,114,193,0,0,0,114,65,0,0,0,78,41,15,114,58, + 0,0,0,114,15,0,0,0,114,14,0,0,0,114,93,0, + 0,0,218,5,105,116,101,109,115,114,197,0,0,0,114,79, + 0,0,0,114,161,0,0,0,114,89,0,0,0,114,175,0, + 0,0,114,143,0,0,0,114,149,0,0,0,114,1,0,0, + 0,114,225,0,0,0,114,5,0,0,0,41,10,218,10,115, + 121,115,95,109,111,100,117,108,101,218,11,95,105,109,112,95, + 109,111,100,117,108,101,90,11,109,111,100,117,108,101,95,116, + 121,112,101,114,17,0,0,0,114,97,0,0,0,114,110,0, + 0,0,114,96,0,0,0,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,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,218,6,95,115,101,116,117,112,117,4,0,0,115,36,0, + 0,0,0,9,4,1,4,3,8,1,18,1,10,1,10,1, + 6,1,10,1,6,2,2,1,10,1,12,3,10,1,8,1, + 10,1,10,2,10,1,114,229,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,38,0,0,0,116,0,124,0,124,1,131, + 2,1,0,116,1,106,2,160,3,116,4,161,1,1,0,116, + 1,106,2,160,3,116,5,161,1,1,0,100,1,83,0,41, + 2,122,48,73,110,115,116,97,108,108,32,105,109,112,111,114, + 116,101,114,115,32,102,111,114,32,98,117,105,108,116,105,110, + 32,97,110,100,32,102,114,111,122,101,110,32,109,111,100,117, + 108,101,115,78,41,6,114,229,0,0,0,114,15,0,0,0, + 114,192,0,0,0,114,120,0,0,0,114,161,0,0,0,114, + 175,0,0,0,41,2,114,227,0,0,0,114,228,0,0,0, 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 8,60,109,111,100,117,108,101,62,1,0,0,0,115,94,0, - 0,0,4,24,4,2,8,8,8,8,4,2,4,3,16,4, - 14,68,14,21,14,16,8,37,8,17,8,11,14,8,8,11, - 8,12,8,16,8,36,14,101,16,26,10,45,14,72,8,17, - 8,17,8,30,8,37,8,42,8,15,14,73,14,79,14,13, - 8,9,8,9,10,47,8,16,4,1,8,2,8,27,6,3, - 8,16,10,15,14,37,8,27,10,37,8,7,8,35,8,8, + 8,95,105,110,115,116,97,108,108,152,4,0,0,115,6,0, + 0,0,0,2,10,2,12,1,114,230,0,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0, + 0,0,67,0,0,0,115,32,0,0,0,100,1,100,2,108, + 0,125,0,124,0,97,1,124,0,160,2,116,3,106,4,116, + 5,25,0,161,1,1,0,100,2,83,0,41,3,122,57,73, + 110,115,116,97,108,108,32,105,109,112,111,114,116,101,114,115, + 32,116,104,97,116,32,114,101,113,117,105,114,101,32,101,120, + 116,101,114,110,97,108,32,102,105,108,101,115,121,115,116,101, + 109,32,97,99,99,101,115,115,114,22,0,0,0,78,41,6, + 218,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,127,0,0, + 0,114,230,0,0,0,114,15,0,0,0,114,93,0,0,0, + 114,1,0,0,0,41,1,114,231,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,27,95,105,110, + 115,116,97,108,108,95,101,120,116,101,114,110,97,108,95,105, + 109,112,111,114,116,101,114,115,160,4,0,0,115,6,0,0, + 0,0,3,8,1,4,1,114,232,0,0,0,41,2,78,78, + 41,1,78,41,2,78,114,22,0,0,0,41,4,78,78,114, + 10,0,0,0,114,22,0,0,0,41,50,114,3,0,0,0, + 114,127,0,0,0,114,12,0,0,0,114,18,0,0,0,114, + 60,0,0,0,114,34,0,0,0,114,44,0,0,0,114,19, + 0,0,0,114,20,0,0,0,114,50,0,0,0,114,51,0, + 0,0,114,54,0,0,0,114,66,0,0,0,114,68,0,0, + 0,114,77,0,0,0,114,87,0,0,0,114,91,0,0,0, + 114,98,0,0,0,114,112,0,0,0,114,113,0,0,0,114, + 92,0,0,0,114,143,0,0,0,114,149,0,0,0,114,153, + 0,0,0,114,108,0,0,0,114,94,0,0,0,114,159,0, + 0,0,114,160,0,0,0,114,95,0,0,0,114,161,0,0, + 0,114,175,0,0,0,114,180,0,0,0,114,189,0,0,0, + 114,191,0,0,0,114,196,0,0,0,114,202,0,0,0,90, + 15,95,69,82,82,95,77,83,71,95,80,82,69,70,73,88, + 114,204,0,0,0,114,207,0,0,0,218,6,111,98,106,101, + 99,116,114,208,0,0,0,114,209,0,0,0,114,210,0,0, + 0,114,215,0,0,0,114,221,0,0,0,114,224,0,0,0, + 114,225,0,0,0,114,229,0,0,0,114,230,0,0,0,114, + 232,0,0,0,114,10,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,218,8,60,109,111,100,117,108, + 101,62,1,0,0,0,115,94,0,0,0,4,24,4,2,8, + 8,8,8,4,2,4,3,16,4,14,77,14,21,14,16,8, + 37,8,17,8,11,14,8,8,11,8,12,8,16,8,36,14, + 101,16,26,10,45,14,72,8,17,8,17,8,30,8,37,8, + 42,8,15,14,75,14,79,14,13,8,9,8,9,10,47,8, + 16,4,1,8,2,8,32,6,3,8,16,10,15,14,37,8, + 27,10,37,8,7,8,35,8,8, }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index 74d98bdebab5ea47b35b7a682a1a10544052bfb1..a8d5d9aaba0df82c741265c6bdf7bb9137b9dcd9 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -69,796 +69,805 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 78,67,65,83,69,79,75,115,12,0,0,0,80,89,84,72, 79,78,67,65,83,69,79,75,99,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,2,0,0,0,19,0,0, - 0,115,10,0,0,0,136,0,116,0,106,1,107,6,83,0, - 41,1,250,53,84,114,117,101,32,105,102,32,102,105,108,101, - 110,97,109,101,115,32,109,117,115,116,32,98,101,32,99,104, - 101,99,107,101,100,32,99,97,115,101,45,105,110,115,101,110, - 115,105,116,105,118,101,108,121,46,41,2,218,3,95,111,115, - 90,7,101,110,118,105,114,111,110,169,0,169,1,218,3,107, - 101,121,114,3,0,0,0,250,38,60,102,114,111,122,101,110, - 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, - 115,116,114,97,112,95,101,120,116,101,114,110,97,108,62,218, - 11,95,114,101,108,97,120,95,99,97,115,101,36,0,0,0, - 115,2,0,0,0,0,2,122,37,95,109,97,107,101,95,114, - 101,108,97,120,95,99,97,115,101,46,60,108,111,99,97,108, - 115,62,46,95,114,101,108,97,120,95,99,97,115,101,99,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,83,0,0,0,115,4,0,0,0,100,1,83,0, - 41,2,114,1,0,0,0,70,114,3,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,7,0,0,0,40,0,0,0,115,2,0,0,0,0, - 2,41,5,218,3,115,121,115,218,8,112,108,97,116,102,111, - 114,109,218,10,115,116,97,114,116,115,119,105,116,104,218,27, - 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,218,35,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,83,84,82,95,75,69,89, - 41,1,114,7,0,0,0,114,3,0,0,0,114,4,0,0, - 0,114,6,0,0,0,218,16,95,109,97,107,101,95,114,101, - 108,97,120,95,99,97,115,101,29,0,0,0,115,14,0,0, - 0,0,1,12,1,12,1,6,2,4,2,14,4,8,3,114, - 13,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,20,0, - 0,0,116,0,124,0,131,1,100,1,64,0,160,1,100,2, - 100,3,161,2,83,0,41,4,122,42,67,111,110,118,101,114, - 116,32,97,32,51,50,45,98,105,116,32,105,110,116,101,103, - 101,114,32,116,111,32,108,105,116,116,108,101,45,101,110,100, - 105,97,110,46,236,3,0,0,0,255,127,255,127,3,0,233, - 4,0,0,0,218,6,108,105,116,116,108,101,41,2,218,3, - 105,110,116,218,8,116,111,95,98,121,116,101,115,41,1,218, - 1,120,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,12,95,112,97,99,107,95,117,105,110,116,51,50,46, - 0,0,0,115,2,0,0,0,0,2,114,20,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,116,0,124, - 0,131,1,100,1,107,2,115,16,116,1,130,1,116,2,160, - 3,124,0,100,2,161,2,83,0,41,3,122,47,67,111,110, - 118,101,114,116,32,52,32,98,121,116,101,115,32,105,110,32, - 108,105,116,116,108,101,45,101,110,100,105,97,110,32,116,111, - 32,97,110,32,105,110,116,101,103,101,114,46,114,15,0,0, - 0,114,16,0,0,0,169,4,218,3,108,101,110,218,14,65, - 115,115,101,114,116,105,111,110,69,114,114,111,114,114,17,0, - 0,0,218,10,102,114,111,109,95,98,121,116,101,115,169,1, - 218,4,100,97,116,97,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,14,95,117,110,112,97,99,107,95,117, - 105,110,116,51,50,51,0,0,0,115,4,0,0,0,0,2, - 16,1,114,27,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,116,0,124,0,131,1,100,1,107,2,115, - 16,116,1,130,1,116,2,160,3,124,0,100,2,161,2,83, - 0,41,3,122,47,67,111,110,118,101,114,116,32,50,32,98, - 121,116,101,115,32,105,110,32,108,105,116,116,108,101,45,101, - 110,100,105,97,110,32,116,111,32,97,110,32,105,110,116,101, - 103,101,114,46,233,2,0,0,0,114,16,0,0,0,114,21, - 0,0,0,114,25,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,14,95,117,110,112,97,99,107, - 95,117,105,110,116,49,54,56,0,0,0,115,4,0,0,0, - 0,2,16,1,114,29,0,0,0,99,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,4,0,0,0,71,0, - 0,0,115,20,0,0,0,116,0,160,1,100,1,100,2,132, - 0,124,0,68,0,131,1,161,1,83,0,41,3,122,31,82, - 101,112,108,97,99,101,109,101,110,116,32,102,111,114,32,111, - 115,46,112,97,116,104,46,106,111,105,110,40,41,46,99,1, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,5, - 0,0,0,83,0,0,0,115,26,0,0,0,103,0,124,0, - 93,18,125,1,124,1,114,4,124,1,160,0,116,1,161,1, - 145,2,113,4,83,0,114,3,0,0,0,41,2,218,6,114, - 115,116,114,105,112,218,15,112,97,116,104,95,115,101,112,97, - 114,97,116,111,114,115,41,2,218,2,46,48,218,4,112,97, - 114,116,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,10,60,108,105,115,116,99,111,109,112,62,64,0,0, - 0,115,6,0,0,0,6,1,2,0,4,255,122,30,95,112, - 97,116,104,95,106,111,105,110,46,60,108,111,99,97,108,115, - 62,46,60,108,105,115,116,99,111,109,112,62,41,2,218,8, - 112,97,116,104,95,115,101,112,218,4,106,111,105,110,41,1, - 218,10,112,97,116,104,95,112,97,114,116,115,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,10,95,112,97, - 116,104,95,106,111,105,110,62,0,0,0,115,6,0,0,0, - 0,2,10,1,2,255,114,38,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,0, - 67,0,0,0,115,96,0,0,0,116,0,116,1,131,1,100, - 1,107,2,114,36,124,0,160,2,116,3,161,1,92,3,125, - 1,125,2,125,3,124,1,124,3,102,2,83,0,116,4,124, - 0,131,1,68,0,93,42,125,4,124,4,116,1,107,6,114, - 44,124,0,106,5,124,4,100,1,100,2,141,2,92,2,125, - 1,125,3,124,1,124,3,102,2,2,0,1,0,83,0,113, - 44,100,3,124,0,102,2,83,0,41,4,122,32,82,101,112, - 108,97,99,101,109,101,110,116,32,102,111,114,32,111,115,46, - 112,97,116,104,46,115,112,108,105,116,40,41,46,233,1,0, - 0,0,41,1,90,8,109,97,120,115,112,108,105,116,218,0, - 41,6,114,22,0,0,0,114,31,0,0,0,218,10,114,112, - 97,114,116,105,116,105,111,110,114,35,0,0,0,218,8,114, - 101,118,101,114,115,101,100,218,6,114,115,112,108,105,116,41, - 5,218,4,112,97,116,104,90,5,102,114,111,110,116,218,1, - 95,218,4,116,97,105,108,114,19,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,11,95,112,97, - 116,104,95,115,112,108,105,116,68,0,0,0,115,16,0,0, - 0,0,2,12,1,16,1,8,1,12,1,8,1,18,1,14, - 1,114,47,0,0,0,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, - 10,0,0,0,116,0,160,1,124,0,161,1,83,0,41,1, - 122,126,83,116,97,116,32,116,104,101,32,112,97,116,104,46, - 10,10,32,32,32,32,77,97,100,101,32,97,32,115,101,112, - 97,114,97,116,101,32,102,117,110,99,116,105,111,110,32,116, - 111,32,109,97,107,101,32,105,116,32,101,97,115,105,101,114, - 32,116,111,32,111,118,101,114,114,105,100,101,32,105,110,32, - 101,120,112,101,114,105,109,101,110,116,115,10,32,32,32,32, - 40,101,46,103,46,32,99,97,99,104,101,32,115,116,97,116, - 32,114,101,115,117,108,116,115,41,46,10,10,32,32,32,32, - 41,2,114,2,0,0,0,90,4,115,116,97,116,169,1,114, - 44,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,10,95,112,97,116,104,95,115,116,97,116,80, - 0,0,0,115,2,0,0,0,0,7,114,49,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,50,0,0,0,122,12,116, - 0,124,0,131,1,125,2,87,0,110,22,4,0,116,1,107, - 10,114,34,1,0,1,0,1,0,89,0,100,1,83,0,88, - 0,124,2,106,2,100,2,64,0,124,1,107,2,83,0,41, - 3,122,49,84,101,115,116,32,119,104,101,116,104,101,114,32, - 116,104,101,32,112,97,116,104,32,105,115,32,116,104,101,32, - 115,112,101,99,105,102,105,101,100,32,109,111,100,101,32,116, - 121,112,101,46,70,105,0,240,0,0,41,3,114,49,0,0, - 0,218,7,79,83,69,114,114,111,114,218,7,115,116,95,109, - 111,100,101,41,3,114,44,0,0,0,218,4,109,111,100,101, - 90,9,115,116,97,116,95,105,110,102,111,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,18,95,112,97,116, - 104,95,105,115,95,109,111,100,101,95,116,121,112,101,90,0, - 0,0,115,10,0,0,0,0,2,2,1,12,1,14,1,8, - 1,114,53,0,0,0,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, - 10,0,0,0,116,0,124,0,100,1,131,2,83,0,41,2, - 122,31,82,101,112,108,97,99,101,109,101,110,116,32,102,111, - 114,32,111,115,46,112,97,116,104,46,105,115,102,105,108,101, - 46,105,0,128,0,0,41,1,114,53,0,0,0,114,48,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,12,95,112,97,116,104,95,105,115,102,105,108,101,99, - 0,0,0,115,2,0,0,0,0,2,114,54,0,0,0,99, + 0,115,20,0,0,0,116,0,106,1,106,2,12,0,111,18, + 136,0,116,3,106,4,118,0,83,0,41,1,122,94,84,114, + 117,101,32,105,102,32,102,105,108,101,110,97,109,101,115,32, + 109,117,115,116,32,98,101,32,99,104,101,99,107,101,100,32, + 99,97,115,101,45,105,110,115,101,110,115,105,116,105,118,101, + 108,121,32,97,110,100,32,105,103,110,111,114,101,32,101,110, + 118,105,114,111,110,109,101,110,116,32,102,108,97,103,115,32, + 97,114,101,32,110,111,116,32,115,101,116,46,41,5,218,3, + 115,121,115,218,5,102,108,97,103,115,218,18,105,103,110,111, + 114,101,95,101,110,118,105,114,111,110,109,101,110,116,218,3, + 95,111,115,90,7,101,110,118,105,114,111,110,169,0,169,1, + 218,3,107,101,121,114,5,0,0,0,250,38,60,102,114,111, + 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, + 111,111,116,115,116,114,97,112,95,101,120,116,101,114,110,97, + 108,62,218,11,95,114,101,108,97,120,95,99,97,115,101,36, + 0,0,0,115,2,0,0,0,0,2,122,37,95,109,97,107, + 101,95,114,101,108,97,120,95,99,97,115,101,46,60,108,111, + 99,97,108,115,62,46,95,114,101,108,97,120,95,99,97,115, + 101,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,83,0,0,0,115,4,0,0,0,100, + 1,83,0,41,2,122,53,84,114,117,101,32,105,102,32,102, + 105,108,101,110,97,109,101,115,32,109,117,115,116,32,98,101, + 32,99,104,101,99,107,101,100,32,99,97,115,101,45,105,110, + 115,101,110,115,105,116,105,118,101,108,121,46,70,114,5,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,114,9,0,0,0,40,0,0,0,115, + 2,0,0,0,0,2,41,5,114,1,0,0,0,218,8,112, + 108,97,116,102,111,114,109,218,10,115,116,97,114,116,115,119, + 105,116,104,218,27,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, + 218,35,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,83,84, + 82,95,75,69,89,41,1,114,9,0,0,0,114,5,0,0, + 0,114,6,0,0,0,114,8,0,0,0,218,16,95,109,97, + 107,101,95,114,101,108,97,120,95,99,97,115,101,29,0,0, + 0,115,14,0,0,0,0,1,12,1,12,1,6,2,4,2, + 14,4,8,3,114,14,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,20,0,0,0,116,0,124,0,131,1,100,1,64, + 0,160,1,100,2,100,3,161,2,83,0,41,4,122,42,67, + 111,110,118,101,114,116,32,97,32,51,50,45,98,105,116,32, + 105,110,116,101,103,101,114,32,116,111,32,108,105,116,116,108, + 101,45,101,110,100,105,97,110,46,236,3,0,0,0,255,127, + 255,127,3,0,233,4,0,0,0,218,6,108,105,116,116,108, + 101,41,2,218,3,105,110,116,218,8,116,111,95,98,121,116, + 101,115,41,1,218,1,120,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,218,12,95,112,97,99,107,95,117,105, + 110,116,51,50,46,0,0,0,115,2,0,0,0,0,2,114, + 21,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,116,0,124,0,131,1,100,1,107,2,115,16,74,0, + 130,1,116,1,160,2,124,0,100,2,161,2,83,0,41,3, + 122,47,67,111,110,118,101,114,116,32,52,32,98,121,116,101, + 115,32,105,110,32,108,105,116,116,108,101,45,101,110,100,105, + 97,110,32,116,111,32,97,110,32,105,110,116,101,103,101,114, + 46,114,16,0,0,0,114,17,0,0,0,169,3,218,3,108, + 101,110,114,18,0,0,0,218,10,102,114,111,109,95,98,121, + 116,101,115,169,1,218,4,100,97,116,97,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,218,14,95,117,110,112, + 97,99,107,95,117,105,110,116,51,50,51,0,0,0,115,4, + 0,0,0,0,2,16,1,114,27,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,116,0,124,0,131,1, + 100,1,107,2,115,16,74,0,130,1,116,1,160,2,124,0, + 100,2,161,2,83,0,41,3,122,47,67,111,110,118,101,114, + 116,32,50,32,98,121,116,101,115,32,105,110,32,108,105,116, + 116,108,101,45,101,110,100,105,97,110,32,116,111,32,97,110, + 32,105,110,116,101,103,101,114,46,233,2,0,0,0,114,17, + 0,0,0,114,22,0,0,0,114,25,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,218,14,95,117, + 110,112,97,99,107,95,117,105,110,116,49,54,56,0,0,0, + 115,4,0,0,0,0,2,16,1,114,29,0,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4, + 0,0,0,71,0,0,0,115,20,0,0,0,116,0,160,1, + 100,1,100,2,132,0,124,0,68,0,131,1,161,1,83,0, + 41,3,122,31,82,101,112,108,97,99,101,109,101,110,116,32, + 102,111,114,32,111,115,46,112,97,116,104,46,106,111,105,110, + 40,41,46,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,5,0,0,0,83,0,0,0,115,26,0,0, + 0,103,0,124,0,93,18,125,1,124,1,114,4,124,1,160, + 0,116,1,161,1,145,2,113,4,83,0,114,5,0,0,0, + 41,2,218,6,114,115,116,114,105,112,218,15,112,97,116,104, + 95,115,101,112,97,114,97,116,111,114,115,41,2,218,2,46, + 48,218,4,112,97,114,116,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,218,10,60,108,105,115,116,99,111,109, + 112,62,64,0,0,0,115,4,0,0,0,6,1,6,255,122, + 30,95,112,97,116,104,95,106,111,105,110,46,60,108,111,99, + 97,108,115,62,46,60,108,105,115,116,99,111,109,112,62,41, + 2,218,8,112,97,116,104,95,115,101,112,218,4,106,111,105, + 110,41,1,218,10,112,97,116,104,95,112,97,114,116,115,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,10, + 95,112,97,116,104,95,106,111,105,110,62,0,0,0,115,6, + 0,0,0,0,2,10,1,2,255,114,38,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5, + 0,0,0,67,0,0,0,115,96,0,0,0,116,0,116,1, + 131,1,100,1,107,2,114,36,124,0,160,2,116,3,161,1, + 92,3,125,1,125,2,125,3,124,1,124,3,102,2,83,0, + 116,4,124,0,131,1,68,0,93,42,125,4,124,4,116,1, + 118,0,114,44,124,0,106,5,124,4,100,1,100,2,141,2, + 92,2,125,1,125,3,124,1,124,3,102,2,2,0,1,0, + 83,0,113,44,100,3,124,0,102,2,83,0,41,4,122,32, + 82,101,112,108,97,99,101,109,101,110,116,32,102,111,114,32, + 111,115,46,112,97,116,104,46,115,112,108,105,116,40,41,46, + 233,1,0,0,0,41,1,90,8,109,97,120,115,112,108,105, + 116,218,0,41,6,114,23,0,0,0,114,31,0,0,0,218, + 10,114,112,97,114,116,105,116,105,111,110,114,35,0,0,0, + 218,8,114,101,118,101,114,115,101,100,218,6,114,115,112,108, + 105,116,41,5,218,4,112,97,116,104,90,5,102,114,111,110, + 116,218,1,95,218,4,116,97,105,108,114,20,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,11, + 95,112,97,116,104,95,115,112,108,105,116,68,0,0,0,115, + 16,0,0,0,0,2,12,1,16,1,8,1,12,1,8,1, + 18,1,14,1,114,47,0,0,0,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,10,0,0,0,116,0,160,1,124,0,161,1,83, + 0,41,1,122,126,83,116,97,116,32,116,104,101,32,112,97, + 116,104,46,10,10,32,32,32,32,77,97,100,101,32,97,32, + 115,101,112,97,114,97,116,101,32,102,117,110,99,116,105,111, + 110,32,116,111,32,109,97,107,101,32,105,116,32,101,97,115, + 105,101,114,32,116,111,32,111,118,101,114,114,105,100,101,32, + 105,110,32,101,120,112,101,114,105,109,101,110,116,115,10,32, + 32,32,32,40,101,46,103,46,32,99,97,99,104,101,32,115, + 116,97,116,32,114,101,115,117,108,116,115,41,46,10,10,32, + 32,32,32,41,2,114,4,0,0,0,90,4,115,116,97,116, + 169,1,114,44,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,218,10,95,112,97,116,104,95,115,116, + 97,116,80,0,0,0,115,2,0,0,0,0,7,114,49,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,48,0,0,0, + 122,12,116,0,124,0,131,1,125,2,87,0,110,20,4,0, + 116,1,121,32,1,0,1,0,1,0,89,0,100,1,83,0, + 48,0,124,2,106,2,100,2,64,0,124,1,107,2,83,0, + 41,3,122,49,84,101,115,116,32,119,104,101,116,104,101,114, + 32,116,104,101,32,112,97,116,104,32,105,115,32,116,104,101, + 32,115,112,101,99,105,102,105,101,100,32,109,111,100,101,32, + 116,121,112,101,46,70,105,0,240,0,0,41,3,114,49,0, + 0,0,218,7,79,83,69,114,114,111,114,218,7,115,116,95, + 109,111,100,101,41,3,114,44,0,0,0,218,4,109,111,100, + 101,90,9,115,116,97,116,95,105,110,102,111,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,218,18,95,112,97, + 116,104,95,105,115,95,109,111,100,101,95,116,121,112,101,90, + 0,0,0,115,10,0,0,0,0,2,2,1,12,1,12,1, + 8,1,114,53,0,0,0,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,10,0,0,0,116,0,124,0,100,1,131,2,83,0,41, + 2,122,31,82,101,112,108,97,99,101,109,101,110,116,32,102, + 111,114,32,111,115,46,112,97,116,104,46,105,115,102,105,108, + 101,46,105,0,128,0,0,41,1,114,53,0,0,0,114,48, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,218,12,95,112,97,116,104,95,105,115,102,105,108,101, + 99,0,0,0,115,2,0,0,0,0,2,114,54,0,0,0, + 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,22,0,0,0,124,0, + 115,12,116,0,160,1,161,0,125,0,116,2,124,0,100,1, + 131,2,83,0,41,2,122,30,82,101,112,108,97,99,101,109, + 101,110,116,32,102,111,114,32,111,115,46,112,97,116,104,46, + 105,115,100,105,114,46,105,0,64,0,0,41,3,114,4,0, + 0,0,218,6,103,101,116,99,119,100,114,53,0,0,0,114, + 48,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,11,95,112,97,116,104,95,105,115,100,105,114, + 104,0,0,0,115,6,0,0,0,0,2,4,1,8,1,114, + 56,0,0,0,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,26,0, + 0,0,124,0,160,0,116,1,161,1,112,24,124,0,100,1, + 100,2,133,2,25,0,116,2,118,0,83,0,41,3,122,142, + 82,101,112,108,97,99,101,109,101,110,116,32,102,111,114,32, + 111,115,46,112,97,116,104,46,105,115,97,98,115,46,10,10, + 32,32,32,32,67,111,110,115,105,100,101,114,115,32,97,32, + 87,105,110,100,111,119,115,32,100,114,105,118,101,45,114,101, + 108,97,116,105,118,101,32,112,97,116,104,32,40,110,111,32, + 100,114,105,118,101,44,32,98,117,116,32,115,116,97,114,116, + 115,32,119,105,116,104,32,115,108,97,115,104,41,32,116,111, + 10,32,32,32,32,115,116,105,108,108,32,98,101,32,34,97, + 98,115,111,108,117,116,101,34,46,10,32,32,32,32,114,39, + 0,0,0,233,3,0,0,0,41,3,114,11,0,0,0,114, + 31,0,0,0,218,20,95,112,97,116,104,115,101,112,115,95, + 119,105,116,104,95,99,111,108,111,110,114,48,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,218,11, + 95,112,97,116,104,95,105,115,97,98,115,111,0,0,0,115, + 2,0,0,0,0,6,114,59,0,0,0,233,182,1,0,0, + 99,3,0,0,0,0,0,0,0,0,0,0,0,6,0,0, + 0,11,0,0,0,67,0,0,0,115,178,0,0,0,100,1, + 160,0,124,0,116,1,124,0,131,1,161,2,125,3,116,2, + 160,3,124,3,116,2,106,4,116,2,106,5,66,0,116,2, + 106,6,66,0,124,2,100,2,64,0,161,3,125,4,122,70, + 116,7,160,8,124,4,100,3,161,2,143,26,125,5,124,5, + 160,9,124,1,161,1,1,0,87,0,100,4,4,0,4,0, + 131,3,1,0,110,16,49,0,115,94,48,0,1,0,1,0, + 1,0,89,0,1,0,116,2,160,10,124,3,124,0,161,2, + 1,0,87,0,110,54,4,0,116,11,121,172,1,0,1,0, + 1,0,122,14,116,2,160,12,124,3,161,1,1,0,87,0, + 110,18,4,0,116,11,121,164,1,0,1,0,1,0,89,0, + 110,2,48,0,130,0,89,0,110,2,48,0,100,4,83,0, + 41,5,122,162,66,101,115,116,45,101,102,102,111,114,116,32, + 102,117,110,99,116,105,111,110,32,116,111,32,119,114,105,116, + 101,32,100,97,116,97,32,116,111,32,97,32,112,97,116,104, + 32,97,116,111,109,105,99,97,108,108,121,46,10,32,32,32, + 32,66,101,32,112,114,101,112,97,114,101,100,32,116,111,32, + 104,97,110,100,108,101,32,97,32,70,105,108,101,69,120,105, + 115,116,115,69,114,114,111,114,32,105,102,32,99,111,110,99, + 117,114,114,101,110,116,32,119,114,105,116,105,110,103,32,111, + 102,32,116,104,101,10,32,32,32,32,116,101,109,112,111,114, + 97,114,121,32,102,105,108,101,32,105,115,32,97,116,116,101, + 109,112,116,101,100,46,250,5,123,125,46,123,125,114,60,0, + 0,0,90,2,119,98,78,41,13,218,6,102,111,114,109,97, + 116,218,2,105,100,114,4,0,0,0,90,4,111,112,101,110, + 90,6,79,95,69,88,67,76,90,7,79,95,67,82,69,65, + 84,90,8,79,95,87,82,79,78,76,89,218,3,95,105,111, + 218,6,70,105,108,101,73,79,218,5,119,114,105,116,101,218, + 7,114,101,112,108,97,99,101,114,50,0,0,0,90,6,117, + 110,108,105,110,107,41,6,114,44,0,0,0,114,26,0,0, + 0,114,52,0,0,0,90,8,112,97,116,104,95,116,109,112, + 90,2,102,100,218,4,102,105,108,101,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,218,13,95,119,114,105,116, + 101,95,97,116,111,109,105,99,120,0,0,0,115,28,0,0, + 0,0,5,16,1,6,1,22,255,4,2,2,3,14,1,40, + 1,16,1,12,1,2,1,14,1,12,1,6,1,114,69,0, + 0,0,105,97,13,0,0,114,28,0,0,0,114,17,0,0, + 0,115,2,0,0,0,13,10,90,11,95,95,112,121,99,97, + 99,104,101,95,95,122,4,111,112,116,45,122,3,46,112,121, + 122,4,46,112,121,99,78,41,1,218,12,111,112,116,105,109, + 105,122,97,116,105,111,110,99,2,0,0,0,0,0,0,0, + 1,0,0,0,12,0,0,0,5,0,0,0,67,0,0,0, + 115,88,1,0,0,124,1,100,1,117,1,114,52,116,0,160, + 1,100,2,116,2,161,2,1,0,124,2,100,1,117,1,114, + 40,100,3,125,3,116,3,124,3,131,1,130,1,124,1,114, + 48,100,4,110,2,100,5,125,2,116,4,160,5,124,0,161, + 1,125,0,116,6,124,0,131,1,92,2,125,4,125,5,124, + 5,160,7,100,6,161,1,92,3,125,6,125,7,125,8,116, + 8,106,9,106,10,125,9,124,9,100,1,117,0,114,114,116, + 11,100,7,131,1,130,1,100,4,160,12,124,6,114,126,124, + 6,110,2,124,8,124,7,124,9,103,3,161,1,125,10,124, + 2,100,1,117,0,114,172,116,8,106,13,106,14,100,8,107, + 2,114,164,100,4,125,2,110,8,116,8,106,13,106,14,125, + 2,116,15,124,2,131,1,125,2,124,2,100,4,107,3,114, + 224,124,2,160,16,161,0,115,210,116,17,100,9,160,18,124, + 2,161,1,131,1,130,1,100,10,160,18,124,10,116,19,124, + 2,161,3,125,10,124,10,116,20,100,8,25,0,23,0,125, + 11,116,8,106,21,100,1,117,1,144,1,114,76,116,22,124, + 4,131,1,144,1,115,16,116,23,116,4,160,24,161,0,124, + 4,131,2,125,4,124,4,100,5,25,0,100,11,107,2,144, + 1,114,56,124,4,100,8,25,0,116,25,118,1,144,1,114, + 56,124,4,100,12,100,1,133,2,25,0,125,4,116,23,116, + 8,106,21,124,4,160,26,116,25,161,1,124,11,131,3,83, + 0,116,23,124,4,116,27,124,11,131,3,83,0,41,13,97, + 254,2,0,0,71,105,118,101,110,32,116,104,101,32,112,97, + 116,104,32,116,111,32,97,32,46,112,121,32,102,105,108,101, + 44,32,114,101,116,117,114,110,32,116,104,101,32,112,97,116, + 104,32,116,111,32,105,116,115,32,46,112,121,99,32,102,105, + 108,101,46,10,10,32,32,32,32,84,104,101,32,46,112,121, + 32,102,105,108,101,32,100,111,101,115,32,110,111,116,32,110, + 101,101,100,32,116,111,32,101,120,105,115,116,59,32,116,104, + 105,115,32,115,105,109,112,108,121,32,114,101,116,117,114,110, + 115,32,116,104,101,32,112,97,116,104,32,116,111,32,116,104, + 101,10,32,32,32,32,46,112,121,99,32,102,105,108,101,32, + 99,97,108,99,117,108,97,116,101,100,32,97,115,32,105,102, + 32,116,104,101,32,46,112,121,32,102,105,108,101,32,119,101, + 114,101,32,105,109,112,111,114,116,101,100,46,10,10,32,32, + 32,32,84,104,101,32,39,111,112,116,105,109,105,122,97,116, + 105,111,110,39,32,112,97,114,97,109,101,116,101,114,32,99, + 111,110,116,114,111,108,115,32,116,104,101,32,112,114,101,115, + 117,109,101,100,32,111,112,116,105,109,105,122,97,116,105,111, + 110,32,108,101,118,101,108,32,111,102,10,32,32,32,32,116, + 104,101,32,98,121,116,101,99,111,100,101,32,102,105,108,101, + 46,32,73,102,32,39,111,112,116,105,109,105,122,97,116,105, + 111,110,39,32,105,115,32,110,111,116,32,78,111,110,101,44, + 32,116,104,101,32,115,116,114,105,110,103,32,114,101,112,114, + 101,115,101,110,116,97,116,105,111,110,10,32,32,32,32,111, + 102,32,116,104,101,32,97,114,103,117,109,101,110,116,32,105, + 115,32,116,97,107,101,110,32,97,110,100,32,118,101,114,105, + 102,105,101,100,32,116,111,32,98,101,32,97,108,112,104,97, + 110,117,109,101,114,105,99,32,40,101,108,115,101,32,86,97, + 108,117,101,69,114,114,111,114,10,32,32,32,32,105,115,32, + 114,97,105,115,101,100,41,46,10,10,32,32,32,32,84,104, + 101,32,100,101,98,117,103,95,111,118,101,114,114,105,100,101, + 32,112,97,114,97,109,101,116,101,114,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,32,73,102,32,100,101,98, + 117,103,95,111,118,101,114,114,105,100,101,32,105,115,32,110, + 111,116,32,78,111,110,101,44,10,32,32,32,32,97,32,84, + 114,117,101,32,118,97,108,117,101,32,105,115,32,116,104,101, + 32,115,97,109,101,32,97,115,32,115,101,116,116,105,110,103, + 32,39,111,112,116,105,109,105,122,97,116,105,111,110,39,32, + 116,111,32,116,104,101,32,101,109,112,116,121,32,115,116,114, + 105,110,103,10,32,32,32,32,119,104,105,108,101,32,97,32, + 70,97,108,115,101,32,118,97,108,117,101,32,105,115,32,101, + 113,117,105,118,97,108,101,110,116,32,116,111,32,115,101,116, + 116,105,110,103,32,39,111,112,116,105,109,105,122,97,116,105, + 111,110,39,32,116,111,32,39,49,39,46,10,10,32,32,32, + 32,73,102,32,115,121,115,46,105,109,112,108,101,109,101,110, + 116,97,116,105,111,110,46,99,97,99,104,101,95,116,97,103, + 32,105,115,32,78,111,110,101,32,116,104,101,110,32,78,111, + 116,73,109,112,108,101,109,101,110,116,101,100,69,114,114,111, + 114,32,105,115,32,114,97,105,115,101,100,46,10,10,32,32, + 32,32,78,122,70,116,104,101,32,100,101,98,117,103,95,111, + 118,101,114,114,105,100,101,32,112,97,114,97,109,101,116,101, + 114,32,105,115,32,100,101,112,114,101,99,97,116,101,100,59, + 32,117,115,101,32,39,111,112,116,105,109,105,122,97,116,105, + 111,110,39,32,105,110,115,116,101,97,100,122,50,100,101,98, + 117,103,95,111,118,101,114,114,105,100,101,32,111,114,32,111, + 112,116,105,109,105,122,97,116,105,111,110,32,109,117,115,116, + 32,98,101,32,115,101,116,32,116,111,32,78,111,110,101,114, + 40,0,0,0,114,39,0,0,0,218,1,46,250,36,115,121, + 115,46,105,109,112,108,101,109,101,110,116,97,116,105,111,110, + 46,99,97,99,104,101,95,116,97,103,32,105,115,32,78,111, + 110,101,233,0,0,0,0,122,24,123,33,114,125,32,105,115, + 32,110,111,116,32,97,108,112,104,97,110,117,109,101,114,105, + 99,122,7,123,125,46,123,125,123,125,250,1,58,114,28,0, + 0,0,41,28,218,9,95,119,97,114,110,105,110,103,115,218, + 4,119,97,114,110,218,18,68,101,112,114,101,99,97,116,105, + 111,110,87,97,114,110,105,110,103,218,9,84,121,112,101,69, + 114,114,111,114,114,4,0,0,0,218,6,102,115,112,97,116, + 104,114,47,0,0,0,114,41,0,0,0,114,1,0,0,0, + 218,14,105,109,112,108,101,109,101,110,116,97,116,105,111,110, + 218,9,99,97,99,104,101,95,116,97,103,218,19,78,111,116, + 73,109,112,108,101,109,101,110,116,101,100,69,114,114,111,114, + 114,36,0,0,0,114,2,0,0,0,218,8,111,112,116,105, + 109,105,122,101,218,3,115,116,114,218,7,105,115,97,108,110, + 117,109,218,10,86,97,108,117,101,69,114,114,111,114,114,62, + 0,0,0,218,4,95,79,80,84,218,17,66,89,84,69,67, + 79,68,69,95,83,85,70,70,73,88,69,83,218,14,112,121, + 99,97,99,104,101,95,112,114,101,102,105,120,114,59,0,0, + 0,114,38,0,0,0,114,55,0,0,0,114,31,0,0,0, + 218,6,108,115,116,114,105,112,218,8,95,80,89,67,65,67, + 72,69,41,12,114,44,0,0,0,90,14,100,101,98,117,103, + 95,111,118,101,114,114,105,100,101,114,70,0,0,0,218,7, + 109,101,115,115,97,103,101,218,4,104,101,97,100,114,46,0, + 0,0,90,4,98,97,115,101,218,3,115,101,112,218,4,114, + 101,115,116,90,3,116,97,103,90,15,97,108,109,111,115,116, + 95,102,105,108,101,110,97,109,101,218,8,102,105,108,101,110, + 97,109,101,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,218,17,99,97,99,104,101,95,102,114,111,109,95,115, + 111,117,114,99,101,45,1,0,0,115,72,0,0,0,0,18, + 8,1,6,1,2,255,4,2,8,1,4,1,8,1,12,1, + 10,1,12,1,16,1,8,1,8,1,8,1,24,1,8,1, + 12,1,6,2,8,1,8,1,8,1,8,1,14,1,14,1, + 12,1,12,9,10,1,14,5,28,1,12,4,2,1,4,1, + 8,1,2,253,4,5,114,97,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,10,0,0,0,5,0,0,0, + 67,0,0,0,115,46,1,0,0,116,0,106,1,106,2,100, + 1,117,0,114,20,116,3,100,2,131,1,130,1,116,4,160, + 5,124,0,161,1,125,0,116,6,124,0,131,1,92,2,125, + 1,125,2,100,3,125,3,116,0,106,7,100,1,117,1,114, + 102,116,0,106,7,160,8,116,9,161,1,125,4,124,1,160, + 10,124,4,116,11,23,0,161,1,114,102,124,1,116,12,124, + 4,131,1,100,1,133,2,25,0,125,1,100,4,125,3,124, + 3,115,144,116,6,124,1,131,1,92,2,125,1,125,5,124, + 5,116,13,107,3,114,144,116,14,116,13,155,0,100,5,124, + 0,155,2,157,3,131,1,130,1,124,2,160,15,100,6,161, + 1,125,6,124,6,100,7,118,1,114,178,116,14,100,8,124, + 2,155,2,157,2,131,1,130,1,110,92,124,6,100,9,107, + 2,144,1,114,14,124,2,160,16,100,6,100,10,161,2,100, + 11,25,0,125,7,124,7,160,10,116,17,161,1,115,228,116, + 14,100,12,116,17,155,2,157,2,131,1,130,1,124,7,116, + 12,116,17,131,1,100,1,133,2,25,0,125,8,124,8,160, + 18,161,0,144,1,115,14,116,14,100,13,124,7,155,2,100, + 14,157,3,131,1,130,1,124,2,160,19,100,6,161,1,100, + 15,25,0,125,9,116,20,124,1,124,9,116,21,100,15,25, + 0,23,0,131,2,83,0,41,16,97,110,1,0,0,71,105, + 118,101,110,32,116,104,101,32,112,97,116,104,32,116,111,32, + 97,32,46,112,121,99,46,32,102,105,108,101,44,32,114,101, + 116,117,114,110,32,116,104,101,32,112,97,116,104,32,116,111, + 32,105,116,115,32,46,112,121,32,102,105,108,101,46,10,10, + 32,32,32,32,84,104,101,32,46,112,121,99,32,102,105,108, + 101,32,100,111,101,115,32,110,111,116,32,110,101,101,100,32, + 116,111,32,101,120,105,115,116,59,32,116,104,105,115,32,115, + 105,109,112,108,121,32,114,101,116,117,114,110,115,32,116,104, + 101,32,112,97,116,104,32,116,111,10,32,32,32,32,116,104, + 101,32,46,112,121,32,102,105,108,101,32,99,97,108,99,117, + 108,97,116,101,100,32,116,111,32,99,111,114,114,101,115,112, + 111,110,100,32,116,111,32,116,104,101,32,46,112,121,99,32, + 102,105,108,101,46,32,32,73,102,32,112,97,116,104,32,100, + 111,101,115,10,32,32,32,32,110,111,116,32,99,111,110,102, + 111,114,109,32,116,111,32,80,69,80,32,51,49,52,55,47, + 52,56,56,32,102,111,114,109,97,116,44,32,86,97,108,117, + 101,69,114,114,111,114,32,119,105,108,108,32,98,101,32,114, + 97,105,115,101,100,46,32,73,102,10,32,32,32,32,115,121, + 115,46,105,109,112,108,101,109,101,110,116,97,116,105,111,110, + 46,99,97,99,104,101,95,116,97,103,32,105,115,32,78,111, + 110,101,32,116,104,101,110,32,78,111,116,73,109,112,108,101, + 109,101,110,116,101,100,69,114,114,111,114,32,105,115,32,114, + 97,105,115,101,100,46,10,10,32,32,32,32,78,114,72,0, + 0,0,70,84,122,31,32,110,111,116,32,98,111,116,116,111, + 109,45,108,101,118,101,108,32,100,105,114,101,99,116,111,114, + 121,32,105,110,32,114,71,0,0,0,62,2,0,0,0,114, + 28,0,0,0,114,57,0,0,0,122,29,101,120,112,101,99, + 116,101,100,32,111,110,108,121,32,50,32,111,114,32,51,32, + 100,111,116,115,32,105,110,32,114,57,0,0,0,114,28,0, + 0,0,233,254,255,255,255,122,53,111,112,116,105,109,105,122, + 97,116,105,111,110,32,112,111,114,116,105,111,110,32,111,102, + 32,102,105,108,101,110,97,109,101,32,100,111,101,115,32,110, + 111,116,32,115,116,97,114,116,32,119,105,116,104,32,122,19, + 111,112,116,105,109,105,122,97,116,105,111,110,32,108,101,118, + 101,108,32,122,29,32,105,115,32,110,111,116,32,97,110,32, + 97,108,112,104,97,110,117,109,101,114,105,99,32,118,97,108, + 117,101,114,73,0,0,0,41,22,114,1,0,0,0,114,80, + 0,0,0,114,81,0,0,0,114,82,0,0,0,114,4,0, + 0,0,114,79,0,0,0,114,47,0,0,0,114,89,0,0, + 0,114,30,0,0,0,114,31,0,0,0,114,11,0,0,0, + 114,35,0,0,0,114,23,0,0,0,114,91,0,0,0,114, + 86,0,0,0,218,5,99,111,117,110,116,114,43,0,0,0, + 114,87,0,0,0,114,85,0,0,0,218,9,112,97,114,116, + 105,116,105,111,110,114,38,0,0,0,218,15,83,79,85,82, + 67,69,95,83,85,70,70,73,88,69,83,41,10,114,44,0, + 0,0,114,93,0,0,0,90,16,112,121,99,97,99,104,101, + 95,102,105,108,101,110,97,109,101,90,23,102,111,117,110,100, + 95,105,110,95,112,121,99,97,99,104,101,95,112,114,101,102, + 105,120,90,13,115,116,114,105,112,112,101,100,95,112,97,116, + 104,90,7,112,121,99,97,99,104,101,90,9,100,111,116,95, + 99,111,117,110,116,114,70,0,0,0,90,9,111,112,116,95, + 108,101,118,101,108,90,13,98,97,115,101,95,102,105,108,101, + 110,97,109,101,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,17,115,111,117,114,99,101,95,102,114,111,109, + 95,99,97,99,104,101,116,1,0,0,115,60,0,0,0,0, + 9,12,1,8,1,10,1,12,1,4,1,10,1,12,1,14, + 1,16,1,4,1,4,1,12,1,8,1,8,1,2,255,8, + 2,10,1,8,1,16,1,10,1,16,1,10,1,4,1,2, + 255,8,2,16,1,10,1,16,2,14,1,114,102,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,5,0,0, + 0,9,0,0,0,67,0,0,0,115,124,0,0,0,116,0, + 124,0,131,1,100,1,107,2,114,16,100,2,83,0,124,0, + 160,1,100,3,161,1,92,3,125,1,125,2,125,3,124,1, + 114,56,124,3,160,2,161,0,100,4,100,5,133,2,25,0, + 100,6,107,3,114,60,124,0,83,0,122,12,116,3,124,0, + 131,1,125,4,87,0,110,34,4,0,116,4,116,5,102,2, + 121,106,1,0,1,0,1,0,124,0,100,2,100,5,133,2, + 25,0,125,4,89,0,110,2,48,0,116,6,124,4,131,1, + 114,120,124,4,83,0,124,0,83,0,41,7,122,188,67,111, + 110,118,101,114,116,32,97,32,98,121,116,101,99,111,100,101, + 32,102,105,108,101,32,112,97,116,104,32,116,111,32,97,32, + 115,111,117,114,99,101,32,112,97,116,104,32,40,105,102,32, + 112,111,115,115,105,98,108,101,41,46,10,10,32,32,32,32, + 84,104,105,115,32,102,117,110,99,116,105,111,110,32,101,120, + 105,115,116,115,32,112,117,114,101,108,121,32,102,111,114,32, + 98,97,99,107,119,97,114,100,115,45,99,111,109,112,97,116, + 105,98,105,108,105,116,121,32,102,111,114,10,32,32,32,32, + 80,121,73,109,112,111,114,116,95,69,120,101,99,67,111,100, + 101,77,111,100,117,108,101,87,105,116,104,70,105,108,101,110, + 97,109,101,115,40,41,32,105,110,32,116,104,101,32,67,32, + 65,80,73,46,10,10,32,32,32,32,114,73,0,0,0,78, + 114,71,0,0,0,233,253,255,255,255,233,255,255,255,255,90, + 2,112,121,41,7,114,23,0,0,0,114,41,0,0,0,218, + 5,108,111,119,101,114,114,102,0,0,0,114,82,0,0,0, + 114,86,0,0,0,114,54,0,0,0,41,5,218,13,98,121, + 116,101,99,111,100,101,95,112,97,116,104,114,95,0,0,0, + 114,45,0,0,0,90,9,101,120,116,101,110,115,105,111,110, + 218,11,115,111,117,114,99,101,95,112,97,116,104,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,218,15,95,103, + 101,116,95,115,111,117,114,99,101,102,105,108,101,156,1,0, + 0,115,20,0,0,0,0,7,12,1,4,1,16,1,24,1, + 4,1,2,1,12,1,16,1,18,1,114,108,0,0,0,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,22,0,0,0,124,0,115, - 12,116,0,160,1,161,0,125,0,116,2,124,0,100,1,131, - 2,83,0,41,2,122,30,82,101,112,108,97,99,101,109,101, - 110,116,32,102,111,114,32,111,115,46,112,97,116,104,46,105, - 115,100,105,114,46,105,0,64,0,0,41,3,114,2,0,0, - 0,218,6,103,101,116,99,119,100,114,53,0,0,0,114,48, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,11,95,112,97,116,104,95,105,115,100,105,114,104, - 0,0,0,115,6,0,0,0,0,2,4,1,8,1,114,56, + 8,0,0,0,67,0,0,0,115,72,0,0,0,124,0,160, + 0,116,1,116,2,131,1,161,1,114,46,122,10,116,3,124, + 0,131,1,87,0,83,0,4,0,116,4,121,42,1,0,1, + 0,1,0,89,0,113,68,48,0,110,22,124,0,160,0,116, + 1,116,5,131,1,161,1,114,64,124,0,83,0,100,0,83, + 0,100,0,83,0,169,1,78,41,6,218,8,101,110,100,115, + 119,105,116,104,218,5,116,117,112,108,101,114,101,0,0,0, + 114,97,0,0,0,114,82,0,0,0,114,88,0,0,0,41, + 1,114,96,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,218,11,95,103,101,116,95,99,97,99,104, + 101,100,175,1,0,0,115,16,0,0,0,0,1,14,1,2, + 1,10,1,12,1,8,1,14,1,4,2,114,112,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,8,0,0,0,67,0,0,0,115,50,0,0,0,122,14, + 116,0,124,0,131,1,106,1,125,1,87,0,110,22,4,0, + 116,2,121,36,1,0,1,0,1,0,100,1,125,1,89,0, + 110,2,48,0,124,1,100,2,79,0,125,1,124,1,83,0, + 41,3,122,51,67,97,108,99,117,108,97,116,101,32,116,104, + 101,32,109,111,100,101,32,112,101,114,109,105,115,115,105,111, + 110,115,32,102,111,114,32,97,32,98,121,116,101,99,111,100, + 101,32,102,105,108,101,46,114,60,0,0,0,233,128,0,0, + 0,41,3,114,49,0,0,0,114,51,0,0,0,114,50,0, + 0,0,41,2,114,44,0,0,0,114,52,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,218,10,95, + 99,97,108,99,95,109,111,100,101,187,1,0,0,115,12,0, + 0,0,0,2,2,1,14,1,12,1,10,3,8,1,114,114, 0,0,0,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,26,0,0, - 0,124,0,160,0,116,1,161,1,112,24,124,0,100,1,100, - 2,133,2,25,0,116,2,107,6,83,0,41,3,122,142,82, - 101,112,108,97,99,101,109,101,110,116,32,102,111,114,32,111, - 115,46,112,97,116,104,46,105,115,97,98,115,46,10,10,32, - 32,32,32,67,111,110,115,105,100,101,114,115,32,97,32,87, - 105,110,100,111,119,115,32,100,114,105,118,101,45,114,101,108, - 97,116,105,118,101,32,112,97,116,104,32,40,110,111,32,100, - 114,105,118,101,44,32,98,117,116,32,115,116,97,114,116,115, - 32,119,105,116,104,32,115,108,97,115,104,41,32,116,111,10, - 32,32,32,32,115,116,105,108,108,32,98,101,32,34,97,98, - 115,111,108,117,116,101,34,46,10,32,32,32,32,114,39,0, - 0,0,233,3,0,0,0,41,3,114,10,0,0,0,114,31, - 0,0,0,218,20,95,112,97,116,104,115,101,112,115,95,119, - 105,116,104,95,99,111,108,111,110,114,48,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,11,95, - 112,97,116,104,95,105,115,97,98,115,111,0,0,0,115,2, - 0,0,0,0,6,114,59,0,0,0,233,182,1,0,0,99, - 3,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, - 11,0,0,0,67,0,0,0,115,162,0,0,0,100,1,160, - 0,124,0,116,1,124,0,131,1,161,2,125,3,116,2,160, - 3,124,3,116,2,106,4,116,2,106,5,66,0,116,2,106, - 6,66,0,124,2,100,2,64,0,161,3,125,4,122,50,116, - 7,160,8,124,4,100,3,161,2,143,16,125,5,124,5,160, - 9,124,1,161,1,1,0,87,0,53,0,81,0,82,0,88, - 0,116,2,160,10,124,3,124,0,161,2,1,0,87,0,110, - 58,4,0,116,11,107,10,114,156,1,0,1,0,1,0,122, - 14,116,2,160,12,124,3,161,1,1,0,87,0,110,20,4, - 0,116,11,107,10,114,148,1,0,1,0,1,0,89,0,110, - 2,88,0,130,0,89,0,110,2,88,0,100,4,83,0,41, - 5,122,162,66,101,115,116,45,101,102,102,111,114,116,32,102, - 117,110,99,116,105,111,110,32,116,111,32,119,114,105,116,101, - 32,100,97,116,97,32,116,111,32,97,32,112,97,116,104,32, - 97,116,111,109,105,99,97,108,108,121,46,10,32,32,32,32, - 66,101,32,112,114,101,112,97,114,101,100,32,116,111,32,104, - 97,110,100,108,101,32,97,32,70,105,108,101,69,120,105,115, - 116,115,69,114,114,111,114,32,105,102,32,99,111,110,99,117, - 114,114,101,110,116,32,119,114,105,116,105,110,103,32,111,102, - 32,116,104,101,10,32,32,32,32,116,101,109,112,111,114,97, - 114,121,32,102,105,108,101,32,105,115,32,97,116,116,101,109, - 112,116,101,100,46,250,5,123,125,46,123,125,114,60,0,0, - 0,90,2,119,98,78,41,13,218,6,102,111,114,109,97,116, - 218,2,105,100,114,2,0,0,0,90,4,111,112,101,110,90, - 6,79,95,69,88,67,76,90,7,79,95,67,82,69,65,84, - 90,8,79,95,87,82,79,78,76,89,218,3,95,105,111,218, - 6,70,105,108,101,73,79,218,5,119,114,105,116,101,218,7, - 114,101,112,108,97,99,101,114,50,0,0,0,90,6,117,110, - 108,105,110,107,41,6,114,44,0,0,0,114,26,0,0,0, - 114,52,0,0,0,90,8,112,97,116,104,95,116,109,112,90, - 2,102,100,218,4,102,105,108,101,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,13,95,119,114,105,116,101, - 95,97,116,111,109,105,99,120,0,0,0,115,30,0,0,0, - 0,5,16,1,6,1,16,0,6,255,4,2,2,3,14,1, - 20,1,16,1,14,1,2,1,14,1,14,1,6,1,114,69, - 0,0,0,105,85,13,0,0,114,28,0,0,0,114,16,0, - 0,0,115,2,0,0,0,13,10,90,11,95,95,112,121,99, - 97,99,104,101,95,95,122,4,111,112,116,45,122,3,46,112, - 121,122,4,46,112,121,99,78,41,1,218,12,111,112,116,105, - 109,105,122,97,116,105,111,110,99,2,0,0,0,0,0,0, - 0,1,0,0,0,12,0,0,0,5,0,0,0,67,0,0, - 0,115,88,1,0,0,124,1,100,1,107,9,114,52,116,0, - 160,1,100,2,116,2,161,2,1,0,124,2,100,1,107,9, - 114,40,100,3,125,3,116,3,124,3,131,1,130,1,124,1, - 114,48,100,4,110,2,100,5,125,2,116,4,160,5,124,0, - 161,1,125,0,116,6,124,0,131,1,92,2,125,4,125,5, - 124,5,160,7,100,6,161,1,92,3,125,6,125,7,125,8, - 116,8,106,9,106,10,125,9,124,9,100,1,107,8,114,114, - 116,11,100,7,131,1,130,1,100,4,160,12,124,6,114,126, - 124,6,110,2,124,8,124,7,124,9,103,3,161,1,125,10, - 124,2,100,1,107,8,114,172,116,8,106,13,106,14,100,8, - 107,2,114,164,100,4,125,2,110,8,116,8,106,13,106,14, - 125,2,116,15,124,2,131,1,125,2,124,2,100,4,107,3, - 114,224,124,2,160,16,161,0,115,210,116,17,100,9,160,18, - 124,2,161,1,131,1,130,1,100,10,160,18,124,10,116,19, - 124,2,161,3,125,10,124,10,116,20,100,8,25,0,23,0, - 125,11,116,8,106,21,100,1,107,9,144,1,114,76,116,22, - 124,4,131,1,144,1,115,16,116,23,116,4,160,24,161,0, - 124,4,131,2,125,4,124,4,100,5,25,0,100,11,107,2, - 144,1,114,56,124,4,100,8,25,0,116,25,107,7,144,1, - 114,56,124,4,100,12,100,1,133,2,25,0,125,4,116,23, - 116,8,106,21,124,4,160,26,116,25,161,1,124,11,131,3, - 83,0,116,23,124,4,116,27,124,11,131,3,83,0,41,13, - 97,254,2,0,0,71,105,118,101,110,32,116,104,101,32,112, - 97,116,104,32,116,111,32,97,32,46,112,121,32,102,105,108, - 101,44,32,114,101,116,117,114,110,32,116,104,101,32,112,97, - 116,104,32,116,111,32,105,116,115,32,46,112,121,99,32,102, - 105,108,101,46,10,10,32,32,32,32,84,104,101,32,46,112, - 121,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32, - 110,101,101,100,32,116,111,32,101,120,105,115,116,59,32,116, - 104,105,115,32,115,105,109,112,108,121,32,114,101,116,117,114, - 110,115,32,116,104,101,32,112,97,116,104,32,116,111,32,116, - 104,101,10,32,32,32,32,46,112,121,99,32,102,105,108,101, - 32,99,97,108,99,117,108,97,116,101,100,32,97,115,32,105, - 102,32,116,104,101,32,46,112,121,32,102,105,108,101,32,119, - 101,114,101,32,105,109,112,111,114,116,101,100,46,10,10,32, - 32,32,32,84,104,101,32,39,111,112,116,105,109,105,122,97, - 116,105,111,110,39,32,112,97,114,97,109,101,116,101,114,32, - 99,111,110,116,114,111,108,115,32,116,104,101,32,112,114,101, - 115,117,109,101,100,32,111,112,116,105,109,105,122,97,116,105, - 111,110,32,108,101,118,101,108,32,111,102,10,32,32,32,32, - 116,104,101,32,98,121,116,101,99,111,100,101,32,102,105,108, - 101,46,32,73,102,32,39,111,112,116,105,109,105,122,97,116, - 105,111,110,39,32,105,115,32,110,111,116,32,78,111,110,101, - 44,32,116,104,101,32,115,116,114,105,110,103,32,114,101,112, - 114,101,115,101,110,116,97,116,105,111,110,10,32,32,32,32, - 111,102,32,116,104,101,32,97,114,103,117,109,101,110,116,32, - 105,115,32,116,97,107,101,110,32,97,110,100,32,118,101,114, - 105,102,105,101,100,32,116,111,32,98,101,32,97,108,112,104, - 97,110,117,109,101,114,105,99,32,40,101,108,115,101,32,86, - 97,108,117,101,69,114,114,111,114,10,32,32,32,32,105,115, - 32,114,97,105,115,101,100,41,46,10,10,32,32,32,32,84, - 104,101,32,100,101,98,117,103,95,111,118,101,114,114,105,100, - 101,32,112,97,114,97,109,101,116,101,114,32,105,115,32,100, - 101,112,114,101,99,97,116,101,100,46,32,73,102,32,100,101, - 98,117,103,95,111,118,101,114,114,105,100,101,32,105,115,32, - 110,111,116,32,78,111,110,101,44,10,32,32,32,32,97,32, - 84,114,117,101,32,118,97,108,117,101,32,105,115,32,116,104, - 101,32,115,97,109,101,32,97,115,32,115,101,116,116,105,110, - 103,32,39,111,112,116,105,109,105,122,97,116,105,111,110,39, - 32,116,111,32,116,104,101,32,101,109,112,116,121,32,115,116, - 114,105,110,103,10,32,32,32,32,119,104,105,108,101,32,97, - 32,70,97,108,115,101,32,118,97,108,117,101,32,105,115,32, - 101,113,117,105,118,97,108,101,110,116,32,116,111,32,115,101, - 116,116,105,110,103,32,39,111,112,116,105,109,105,122,97,116, - 105,111,110,39,32,116,111,32,39,49,39,46,10,10,32,32, - 32,32,73,102,32,115,121,115,46,105,109,112,108,101,109,101, - 110,116,97,116,105,111,110,46,99,97,99,104,101,95,116,97, - 103,32,105,115,32,78,111,110,101,32,116,104,101,110,32,78, - 111,116,73,109,112,108,101,109,101,110,116,101,100,69,114,114, + 3,0,0,0,8,0,0,0,3,0,0,0,115,66,0,0, + 0,100,6,135,0,102,1,100,2,100,3,132,9,125,1,122, + 10,116,0,106,1,125,2,87,0,110,26,4,0,116,2,121, + 50,1,0,1,0,1,0,100,4,100,5,132,0,125,2,89, + 0,110,2,48,0,124,2,124,1,136,0,131,2,1,0,124, + 1,83,0,41,7,122,252,68,101,99,111,114,97,116,111,114, + 32,116,111,32,118,101,114,105,102,121,32,116,104,97,116,32, + 116,104,101,32,109,111,100,117,108,101,32,98,101,105,110,103, + 32,114,101,113,117,101,115,116,101,100,32,109,97,116,99,104, + 101,115,32,116,104,101,32,111,110,101,32,116,104,101,10,32, + 32,32,32,108,111,97,100,101,114,32,99,97,110,32,104,97, + 110,100,108,101,46,10,10,32,32,32,32,84,104,101,32,102, + 105,114,115,116,32,97,114,103,117,109,101,110,116,32,40,115, + 101,108,102,41,32,109,117,115,116,32,100,101,102,105,110,101, + 32,95,110,97,109,101,32,119,104,105,99,104,32,116,104,101, + 32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116, + 32,105,115,10,32,32,32,32,99,111,109,112,97,114,101,100, + 32,97,103,97,105,110,115,116,46,32,73,102,32,116,104,101, + 32,99,111,109,112,97,114,105,115,111,110,32,102,97,105,108, + 115,32,116,104,101,110,32,73,109,112,111,114,116,69,114,114, 111,114,32,105,115,32,114,97,105,115,101,100,46,10,10,32, - 32,32,32,78,122,70,116,104,101,32,100,101,98,117,103,95, - 111,118,101,114,114,105,100,101,32,112,97,114,97,109,101,116, - 101,114,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 59,32,117,115,101,32,39,111,112,116,105,109,105,122,97,116, - 105,111,110,39,32,105,110,115,116,101,97,100,122,50,100,101, - 98,117,103,95,111,118,101,114,114,105,100,101,32,111,114,32, - 111,112,116,105,109,105,122,97,116,105,111,110,32,109,117,115, - 116,32,98,101,32,115,101,116,32,116,111,32,78,111,110,101, - 114,40,0,0,0,114,39,0,0,0,218,1,46,250,36,115, - 121,115,46,105,109,112,108,101,109,101,110,116,97,116,105,111, - 110,46,99,97,99,104,101,95,116,97,103,32,105,115,32,78, - 111,110,101,233,0,0,0,0,122,24,123,33,114,125,32,105, - 115,32,110,111,116,32,97,108,112,104,97,110,117,109,101,114, - 105,99,122,7,123,125,46,123,125,123,125,250,1,58,114,28, - 0,0,0,41,28,218,9,95,119,97,114,110,105,110,103,115, - 218,4,119,97,114,110,218,18,68,101,112,114,101,99,97,116, - 105,111,110,87,97,114,110,105,110,103,218,9,84,121,112,101, - 69,114,114,111,114,114,2,0,0,0,218,6,102,115,112,97, - 116,104,114,47,0,0,0,114,41,0,0,0,114,8,0,0, - 0,218,14,105,109,112,108,101,109,101,110,116,97,116,105,111, - 110,218,9,99,97,99,104,101,95,116,97,103,218,19,78,111, - 116,73,109,112,108,101,109,101,110,116,101,100,69,114,114,111, - 114,114,36,0,0,0,218,5,102,108,97,103,115,218,8,111, - 112,116,105,109,105,122,101,218,3,115,116,114,218,7,105,115, - 97,108,110,117,109,218,10,86,97,108,117,101,69,114,114,111, - 114,114,62,0,0,0,218,4,95,79,80,84,218,17,66,89, - 84,69,67,79,68,69,95,83,85,70,70,73,88,69,83,218, - 14,112,121,99,97,99,104,101,95,112,114,101,102,105,120,114, - 59,0,0,0,114,38,0,0,0,114,55,0,0,0,114,31, - 0,0,0,218,6,108,115,116,114,105,112,218,8,95,80,89, - 67,65,67,72,69,41,12,114,44,0,0,0,90,14,100,101, - 98,117,103,95,111,118,101,114,114,105,100,101,114,70,0,0, - 0,218,7,109,101,115,115,97,103,101,218,4,104,101,97,100, - 114,46,0,0,0,90,4,98,97,115,101,218,3,115,101,112, - 218,4,114,101,115,116,90,3,116,97,103,90,15,97,108,109, - 111,115,116,95,102,105,108,101,110,97,109,101,218,8,102,105, - 108,101,110,97,109,101,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,17,99,97,99,104,101,95,102,114,111, - 109,95,115,111,117,114,99,101,38,1,0,0,115,72,0,0, - 0,0,18,8,1,6,1,2,255,4,2,8,1,4,1,8, - 1,12,1,10,1,12,1,16,1,8,1,8,1,8,1,24, - 1,8,1,12,1,6,2,8,1,8,1,8,1,8,1,14, - 1,14,1,12,1,12,9,10,1,14,5,28,1,12,4,2, - 1,4,1,8,1,2,253,4,5,114,98,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,5, - 0,0,0,67,0,0,0,115,46,1,0,0,116,0,106,1, - 106,2,100,1,107,8,114,20,116,3,100,2,131,1,130,1, - 116,4,160,5,124,0,161,1,125,0,116,6,124,0,131,1, - 92,2,125,1,125,2,100,3,125,3,116,0,106,7,100,1, - 107,9,114,102,116,0,106,7,160,8,116,9,161,1,125,4, - 124,1,160,10,124,4,116,11,23,0,161,1,114,102,124,1, - 116,12,124,4,131,1,100,1,133,2,25,0,125,1,100,4, - 125,3,124,3,115,144,116,6,124,1,131,1,92,2,125,1, - 125,5,124,5,116,13,107,3,114,144,116,14,116,13,155,0, - 100,5,124,0,155,2,157,3,131,1,130,1,124,2,160,15, - 100,6,161,1,125,6,124,6,100,7,107,7,114,178,116,14, - 100,8,124,2,155,2,157,2,131,1,130,1,110,92,124,6, - 100,9,107,2,144,1,114,14,124,2,160,16,100,6,100,10, - 161,2,100,11,25,0,125,7,124,7,160,10,116,17,161,1, - 115,228,116,14,100,12,116,17,155,2,157,2,131,1,130,1, - 124,7,116,12,116,17,131,1,100,1,133,2,25,0,125,8, - 124,8,160,18,161,0,144,1,115,14,116,14,100,13,124,7, - 155,2,100,14,157,3,131,1,130,1,124,2,160,19,100,6, - 161,1,100,15,25,0,125,9,116,20,124,1,124,9,116,21, - 100,15,25,0,23,0,131,2,83,0,41,16,97,110,1,0, - 0,71,105,118,101,110,32,116,104,101,32,112,97,116,104,32, - 116,111,32,97,32,46,112,121,99,46,32,102,105,108,101,44, - 32,114,101,116,117,114,110,32,116,104,101,32,112,97,116,104, - 32,116,111,32,105,116,115,32,46,112,121,32,102,105,108,101, - 46,10,10,32,32,32,32,84,104,101,32,46,112,121,99,32, - 102,105,108,101,32,100,111,101,115,32,110,111,116,32,110,101, - 101,100,32,116,111,32,101,120,105,115,116,59,32,116,104,105, - 115,32,115,105,109,112,108,121,32,114,101,116,117,114,110,115, - 32,116,104,101,32,112,97,116,104,32,116,111,10,32,32,32, - 32,116,104,101,32,46,112,121,32,102,105,108,101,32,99,97, - 108,99,117,108,97,116,101,100,32,116,111,32,99,111,114,114, - 101,115,112,111,110,100,32,116,111,32,116,104,101,32,46,112, - 121,99,32,102,105,108,101,46,32,32,73,102,32,112,97,116, - 104,32,100,111,101,115,10,32,32,32,32,110,111,116,32,99, - 111,110,102,111,114,109,32,116,111,32,80,69,80,32,51,49, - 52,55,47,52,56,56,32,102,111,114,109,97,116,44,32,86, - 97,108,117,101,69,114,114,111,114,32,119,105,108,108,32,98, - 101,32,114,97,105,115,101,100,46,32,73,102,10,32,32,32, - 32,115,121,115,46,105,109,112,108,101,109,101,110,116,97,116, - 105,111,110,46,99,97,99,104,101,95,116,97,103,32,105,115, - 32,78,111,110,101,32,116,104,101,110,32,78,111,116,73,109, - 112,108,101,109,101,110,116,101,100,69,114,114,111,114,32,105, - 115,32,114,97,105,115,101,100,46,10,10,32,32,32,32,78, - 114,72,0,0,0,70,84,122,31,32,110,111,116,32,98,111, - 116,116,111,109,45,108,101,118,101,108,32,100,105,114,101,99, - 116,111,114,121,32,105,110,32,114,71,0,0,0,62,2,0, - 0,0,114,28,0,0,0,114,57,0,0,0,122,29,101,120, - 112,101,99,116,101,100,32,111,110,108,121,32,50,32,111,114, - 32,51,32,100,111,116,115,32,105,110,32,114,57,0,0,0, - 114,28,0,0,0,233,254,255,255,255,122,53,111,112,116,105, - 109,105,122,97,116,105,111,110,32,112,111,114,116,105,111,110, - 32,111,102,32,102,105,108,101,110,97,109,101,32,100,111,101, - 115,32,110,111,116,32,115,116,97,114,116,32,119,105,116,104, - 32,122,19,111,112,116,105,109,105,122,97,116,105,111,110,32, - 108,101,118,101,108,32,122,29,32,105,115,32,110,111,116,32, - 97,110,32,97,108,112,104,97,110,117,109,101,114,105,99,32, - 118,97,108,117,101,114,73,0,0,0,41,22,114,8,0,0, - 0,114,80,0,0,0,114,81,0,0,0,114,82,0,0,0, - 114,2,0,0,0,114,79,0,0,0,114,47,0,0,0,114, - 90,0,0,0,114,30,0,0,0,114,31,0,0,0,114,10, - 0,0,0,114,35,0,0,0,114,22,0,0,0,114,92,0, - 0,0,114,87,0,0,0,218,5,99,111,117,110,116,114,43, - 0,0,0,114,88,0,0,0,114,86,0,0,0,218,9,112, - 97,114,116,105,116,105,111,110,114,38,0,0,0,218,15,83, - 79,85,82,67,69,95,83,85,70,70,73,88,69,83,41,10, - 114,44,0,0,0,114,94,0,0,0,90,16,112,121,99,97, - 99,104,101,95,102,105,108,101,110,97,109,101,90,23,102,111, - 117,110,100,95,105,110,95,112,121,99,97,99,104,101,95,112, - 114,101,102,105,120,90,13,115,116,114,105,112,112,101,100,95, - 112,97,116,104,90,7,112,121,99,97,99,104,101,90,9,100, - 111,116,95,99,111,117,110,116,114,70,0,0,0,90,9,111, - 112,116,95,108,101,118,101,108,90,13,98,97,115,101,95,102, - 105,108,101,110,97,109,101,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,17,115,111,117,114,99,101,95,102, - 114,111,109,95,99,97,99,104,101,109,1,0,0,115,52,0, - 0,0,0,9,12,1,8,1,10,1,12,1,4,1,10,1, - 12,1,14,1,16,1,4,1,4,1,12,1,8,1,18,2, - 10,1,8,1,16,1,10,1,16,1,10,1,14,2,16,1, - 10,1,16,2,14,1,114,103,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,5,0,0,0,9,0,0,0, - 67,0,0,0,115,126,0,0,0,116,0,124,0,131,1,100, - 1,107,2,114,16,100,2,83,0,124,0,160,1,100,3,161, - 1,92,3,125,1,125,2,125,3,124,1,114,56,124,3,160, - 2,161,0,100,4,100,5,133,2,25,0,100,6,107,3,114, - 60,124,0,83,0,122,12,116,3,124,0,131,1,125,4,87, - 0,110,36,4,0,116,4,116,5,102,2,107,10,114,108,1, - 0,1,0,1,0,124,0,100,2,100,5,133,2,25,0,125, - 4,89,0,110,2,88,0,116,6,124,4,131,1,114,122,124, - 4,83,0,124,0,83,0,41,7,122,188,67,111,110,118,101, - 114,116,32,97,32,98,121,116,101,99,111,100,101,32,102,105, - 108,101,32,112,97,116,104,32,116,111,32,97,32,115,111,117, - 114,99,101,32,112,97,116,104,32,40,105,102,32,112,111,115, - 115,105,98,108,101,41,46,10,10,32,32,32,32,84,104,105, - 115,32,102,117,110,99,116,105,111,110,32,101,120,105,115,116, - 115,32,112,117,114,101,108,121,32,102,111,114,32,98,97,99, - 107,119,97,114,100,115,45,99,111,109,112,97,116,105,98,105, - 108,105,116,121,32,102,111,114,10,32,32,32,32,80,121,73, - 109,112,111,114,116,95,69,120,101,99,67,111,100,101,77,111, - 100,117,108,101,87,105,116,104,70,105,108,101,110,97,109,101, - 115,40,41,32,105,110,32,116,104,101,32,67,32,65,80,73, - 46,10,10,32,32,32,32,114,73,0,0,0,78,114,71,0, - 0,0,233,253,255,255,255,233,255,255,255,255,90,2,112,121, - 41,7,114,22,0,0,0,114,41,0,0,0,218,5,108,111, - 119,101,114,114,103,0,0,0,114,82,0,0,0,114,87,0, - 0,0,114,54,0,0,0,41,5,218,13,98,121,116,101,99, - 111,100,101,95,112,97,116,104,114,96,0,0,0,114,45,0, - 0,0,90,9,101,120,116,101,110,115,105,111,110,218,11,115, - 111,117,114,99,101,95,112,97,116,104,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,15,95,103,101,116,95, - 115,111,117,114,99,101,102,105,108,101,149,1,0,0,115,20, - 0,0,0,0,7,12,1,4,1,16,1,24,1,4,1,2, - 1,12,1,18,1,18,1,114,109,0,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0, - 0,67,0,0,0,115,74,0,0,0,124,0,160,0,116,1, - 116,2,131,1,161,1,114,48,122,10,116,3,124,0,131,1, - 87,0,83,0,4,0,116,4,107,10,114,44,1,0,1,0, - 1,0,89,0,113,70,88,0,110,22,124,0,160,0,116,1, - 116,5,131,1,161,1,114,66,124,0,83,0,100,0,83,0, - 100,0,83,0,169,1,78,41,6,218,8,101,110,100,115,119, - 105,116,104,218,5,116,117,112,108,101,114,102,0,0,0,114, - 98,0,0,0,114,82,0,0,0,114,89,0,0,0,41,1, - 114,97,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,11,95,103,101,116,95,99,97,99,104,101, - 100,168,1,0,0,115,16,0,0,0,0,1,14,1,2,1, - 10,1,14,1,8,1,14,1,4,2,114,113,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 8,0,0,0,67,0,0,0,115,52,0,0,0,122,14,116, - 0,124,0,131,1,106,1,125,1,87,0,110,24,4,0,116, - 2,107,10,114,38,1,0,1,0,1,0,100,1,125,1,89, - 0,110,2,88,0,124,1,100,2,79,0,125,1,124,1,83, - 0,41,3,122,51,67,97,108,99,117,108,97,116,101,32,116, - 104,101,32,109,111,100,101,32,112,101,114,109,105,115,115,105, - 111,110,115,32,102,111,114,32,97,32,98,121,116,101,99,111, - 100,101,32,102,105,108,101,46,114,60,0,0,0,233,128,0, - 0,0,41,3,114,49,0,0,0,114,51,0,0,0,114,50, - 0,0,0,41,2,114,44,0,0,0,114,52,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,10, - 95,99,97,108,99,95,109,111,100,101,180,1,0,0,115,12, - 0,0,0,0,2,2,1,14,1,14,1,10,3,8,1,114, - 115,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,8,0,0,0,3,0,0,0,115,68,0, - 0,0,100,6,135,0,102,1,100,2,100,3,132,9,125,1, - 122,10,116,0,106,1,125,2,87,0,110,28,4,0,116,2, - 107,10,114,52,1,0,1,0,1,0,100,4,100,5,132,0, - 125,2,89,0,110,2,88,0,124,2,124,1,136,0,131,2, - 1,0,124,1,83,0,41,7,122,252,68,101,99,111,114,97, - 116,111,114,32,116,111,32,118,101,114,105,102,121,32,116,104, - 97,116,32,116,104,101,32,109,111,100,117,108,101,32,98,101, - 105,110,103,32,114,101,113,117,101,115,116,101,100,32,109,97, - 116,99,104,101,115,32,116,104,101,32,111,110,101,32,116,104, - 101,10,32,32,32,32,108,111,97,100,101,114,32,99,97,110, - 32,104,97,110,100,108,101,46,10,10,32,32,32,32,84,104, - 101,32,102,105,114,115,116,32,97,114,103,117,109,101,110,116, - 32,40,115,101,108,102,41,32,109,117,115,116,32,100,101,102, - 105,110,101,32,95,110,97,109,101,32,119,104,105,99,104,32, - 116,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109, - 101,110,116,32,105,115,10,32,32,32,32,99,111,109,112,97, - 114,101,100,32,97,103,97,105,110,115,116,46,32,73,102,32, - 116,104,101,32,99,111,109,112,97,114,105,115,111,110,32,102, - 97,105,108,115,32,116,104,101,110,32,73,109,112,111,114,116, - 69,114,114,111,114,32,105,115,32,114,97,105,115,101,100,46, - 10,10,32,32,32,32,78,99,2,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,4,0,0,0,31,0,0,0, - 115,66,0,0,0,124,1,100,0,107,8,114,16,124,0,106, - 0,125,1,110,32,124,0,106,0,124,1,107,3,114,48,116, - 1,100,1,124,0,106,0,124,1,102,2,22,0,124,1,100, - 2,141,2,130,1,136,0,124,0,124,1,102,2,124,2,158, - 2,124,3,142,1,83,0,41,3,78,122,30,108,111,97,100, - 101,114,32,102,111,114,32,37,115,32,99,97,110,110,111,116, - 32,104,97,110,100,108,101,32,37,115,169,1,218,4,110,97, - 109,101,41,2,114,117,0,0,0,218,11,73,109,112,111,114, - 116,69,114,114,111,114,41,4,218,4,115,101,108,102,114,117, - 0,0,0,218,4,97,114,103,115,218,6,107,119,97,114,103, - 115,169,1,218,6,109,101,116,104,111,100,114,3,0,0,0, - 114,6,0,0,0,218,19,95,99,104,101,99,107,95,110,97, - 109,101,95,119,114,97,112,112,101,114,200,1,0,0,115,18, - 0,0,0,0,1,8,1,8,1,10,1,4,1,8,255,2, - 1,2,255,6,2,122,40,95,99,104,101,99,107,95,110,97, - 109,101,46,60,108,111,99,97,108,115,62,46,95,99,104,101, - 99,107,95,110,97,109,101,95,119,114,97,112,112,101,114,99, - 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 7,0,0,0,83,0,0,0,115,56,0,0,0,100,1,68, - 0,93,32,125,2,116,0,124,1,124,2,131,2,114,4,116, - 1,124,0,124,2,116,2,124,1,124,2,131,2,131,3,1, - 0,113,4,124,0,106,3,160,4,124,1,106,3,161,1,1, - 0,100,0,83,0,41,2,78,41,4,218,10,95,95,109,111, - 100,117,108,101,95,95,218,8,95,95,110,97,109,101,95,95, - 218,12,95,95,113,117,97,108,110,97,109,101,95,95,218,7, - 95,95,100,111,99,95,95,41,5,218,7,104,97,115,97,116, - 116,114,218,7,115,101,116,97,116,116,114,218,7,103,101,116, - 97,116,116,114,218,8,95,95,100,105,99,116,95,95,218,6, - 117,112,100,97,116,101,41,3,90,3,110,101,119,90,3,111, - 108,100,114,67,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,5,95,119,114,97,112,211,1,0, - 0,115,8,0,0,0,0,1,8,1,10,1,20,1,122,26, - 95,99,104,101,99,107,95,110,97,109,101,46,60,108,111,99, - 97,108,115,62,46,95,119,114,97,112,41,1,78,41,3,218, - 10,95,98,111,111,116,115,116,114,97,112,114,134,0,0,0, - 218,9,78,97,109,101,69,114,114,111,114,41,3,114,123,0, - 0,0,114,124,0,0,0,114,134,0,0,0,114,3,0,0, - 0,114,122,0,0,0,114,6,0,0,0,218,11,95,99,104, - 101,99,107,95,110,97,109,101,192,1,0,0,115,14,0,0, - 0,0,8,14,7,2,1,10,1,14,2,14,5,10,1,114, - 137,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,6,0,0,0,67,0,0,0,115,60,0, - 0,0,124,0,160,0,124,1,161,1,92,2,125,2,125,3, - 124,2,100,1,107,8,114,56,116,1,124,3,131,1,114,56, - 100,2,125,4,116,2,160,3,124,4,160,4,124,3,100,3, - 25,0,161,1,116,5,161,2,1,0,124,2,83,0,41,4, - 122,155,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,32, - 98,121,32,100,101,108,101,103,97,116,105,110,103,32,116,111, - 10,32,32,32,32,115,101,108,102,46,102,105,110,100,95,108, - 111,97,100,101,114,40,41,46,10,10,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,32,105,110,32,102,97,118,111,114, - 32,111,102,32,102,105,110,100,101,114,46,102,105,110,100,95, - 115,112,101,99,40,41,46,10,10,32,32,32,32,78,122,44, - 78,111,116,32,105,109,112,111,114,116,105,110,103,32,100,105, - 114,101,99,116,111,114,121,32,123,125,58,32,109,105,115,115, - 105,110,103,32,95,95,105,110,105,116,95,95,114,73,0,0, - 0,41,6,218,11,102,105,110,100,95,108,111,97,100,101,114, - 114,22,0,0,0,114,75,0,0,0,114,76,0,0,0,114, - 62,0,0,0,218,13,73,109,112,111,114,116,87,97,114,110, - 105,110,103,41,5,114,119,0,0,0,218,8,102,117,108,108, - 110,97,109,101,218,6,108,111,97,100,101,114,218,8,112,111, - 114,116,105,111,110,115,218,3,109,115,103,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,17,95,102,105,110, - 100,95,109,111,100,117,108,101,95,115,104,105,109,220,1,0, - 0,115,10,0,0,0,0,10,14,1,16,1,4,1,22,1, - 114,144,0,0,0,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,158, - 0,0,0,124,0,100,1,100,2,133,2,25,0,125,3,124, - 3,116,0,107,3,114,60,100,3,124,1,155,2,100,4,124, - 3,155,2,157,4,125,4,116,1,160,2,100,5,124,4,161, - 2,1,0,116,3,124,4,102,1,124,2,142,1,130,1,116, - 4,124,0,131,1,100,6,107,0,114,102,100,7,124,1,155, - 2,157,2,125,4,116,1,160,2,100,5,124,4,161,2,1, - 0,116,5,124,4,131,1,130,1,116,6,124,0,100,2,100, - 8,133,2,25,0,131,1,125,5,124,5,100,9,64,0,114, - 154,100,10,124,5,155,2,100,11,124,1,155,2,157,4,125, - 4,116,3,124,4,102,1,124,2,142,1,130,1,124,5,83, - 0,41,12,97,84,2,0,0,80,101,114,102,111,114,109,32, - 98,97,115,105,99,32,118,97,108,105,100,105,116,121,32,99, - 104,101,99,107,105,110,103,32,111,102,32,97,32,112,121,99, - 32,104,101,97,100,101,114,32,97,110,100,32,114,101,116,117, - 114,110,32,116,104,101,32,102,108,97,103,115,32,102,105,101, - 108,100,44,10,32,32,32,32,119,104,105,99,104,32,100,101, - 116,101,114,109,105,110,101,115,32,104,111,119,32,116,104,101, - 32,112,121,99,32,115,104,111,117,108,100,32,98,101,32,102, - 117,114,116,104,101,114,32,118,97,108,105,100,97,116,101,100, - 32,97,103,97,105,110,115,116,32,116,104,101,32,115,111,117, - 114,99,101,46,10,10,32,32,32,32,42,100,97,116,97,42, - 32,105,115,32,116,104,101,32,99,111,110,116,101,110,116,115, - 32,111,102,32,116,104,101,32,112,121,99,32,102,105,108,101, - 46,32,40,79,110,108,121,32,116,104,101,32,102,105,114,115, - 116,32,49,54,32,98,121,116,101,115,32,97,114,101,10,32, - 32,32,32,114,101,113,117,105,114,101,100,44,32,116,104,111, - 117,103,104,46,41,10,10,32,32,32,32,42,110,97,109,101, - 42,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102, - 32,116,104,101,32,109,111,100,117,108,101,32,98,101,105,110, - 103,32,105,109,112,111,114,116,101,100,46,32,73,116,32,105, - 115,32,117,115,101,100,32,102,111,114,32,108,111,103,103,105, - 110,103,46,10,10,32,32,32,32,42,101,120,99,95,100,101, - 116,97,105,108,115,42,32,105,115,32,97,32,100,105,99,116, - 105,111,110,97,114,121,32,112,97,115,115,101,100,32,116,111, - 32,73,109,112,111,114,116,69,114,114,111,114,32,105,102,32, - 105,116,32,114,97,105,115,101,100,32,102,111,114,10,32,32, - 32,32,105,109,112,114,111,118,101,100,32,100,101,98,117,103, - 103,105,110,103,46,10,10,32,32,32,32,73,109,112,111,114, + 32,32,32,78,99,2,0,0,0,0,0,0,0,0,0,0, + 0,4,0,0,0,4,0,0,0,31,0,0,0,115,72,0, + 0,0,124,1,100,0,117,0,114,16,124,0,106,0,125,1, + 110,32,124,0,106,0,124,1,107,3,114,48,116,1,100,1, + 124,0,106,0,124,1,102,2,22,0,124,1,100,2,141,2, + 130,1,136,0,124,0,124,1,103,2,124,2,162,1,82,0, + 105,0,124,3,164,1,142,1,83,0,41,3,78,122,30,108, + 111,97,100,101,114,32,102,111,114,32,37,115,32,99,97,110, + 110,111,116,32,104,97,110,100,108,101,32,37,115,169,1,218, + 4,110,97,109,101,41,2,114,116,0,0,0,218,11,73,109, + 112,111,114,116,69,114,114,111,114,41,4,218,4,115,101,108, + 102,114,116,0,0,0,218,4,97,114,103,115,218,6,107,119, + 97,114,103,115,169,1,218,6,109,101,116,104,111,100,114,5, + 0,0,0,114,8,0,0,0,218,19,95,99,104,101,99,107, + 95,110,97,109,101,95,119,114,97,112,112,101,114,207,1,0, + 0,115,18,0,0,0,0,1,8,1,8,1,10,1,4,1, + 8,255,2,1,2,255,6,2,122,40,95,99,104,101,99,107, + 95,110,97,109,101,46,60,108,111,99,97,108,115,62,46,95, + 99,104,101,99,107,95,110,97,109,101,95,119,114,97,112,112, + 101,114,99,2,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,7,0,0,0,83,0,0,0,115,56,0,0,0, + 100,1,68,0,93,32,125,2,116,0,124,1,124,2,131,2, + 114,4,116,1,124,0,124,2,116,2,124,1,124,2,131,2, + 131,3,1,0,113,4,124,0,106,3,160,4,124,1,106,3, + 161,1,1,0,100,0,83,0,41,2,78,41,4,218,10,95, + 95,109,111,100,117,108,101,95,95,218,8,95,95,110,97,109, + 101,95,95,218,12,95,95,113,117,97,108,110,97,109,101,95, + 95,218,7,95,95,100,111,99,95,95,41,5,218,7,104,97, + 115,97,116,116,114,218,7,115,101,116,97,116,116,114,218,7, + 103,101,116,97,116,116,114,218,8,95,95,100,105,99,116,95, + 95,218,6,117,112,100,97,116,101,41,3,90,3,110,101,119, + 90,3,111,108,100,114,67,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,218,5,95,119,114,97,112, + 218,1,0,0,115,8,0,0,0,0,1,8,1,10,1,20, + 1,122,26,95,99,104,101,99,107,95,110,97,109,101,46,60, + 108,111,99,97,108,115,62,46,95,119,114,97,112,41,1,78, + 41,3,218,10,95,98,111,111,116,115,116,114,97,112,114,133, + 0,0,0,218,9,78,97,109,101,69,114,114,111,114,41,3, + 114,122,0,0,0,114,123,0,0,0,114,133,0,0,0,114, + 5,0,0,0,114,121,0,0,0,114,8,0,0,0,218,11, + 95,99,104,101,99,107,95,110,97,109,101,199,1,0,0,115, + 14,0,0,0,0,8,14,7,2,1,10,1,12,2,14,5, + 10,1,114,136,0,0,0,99,2,0,0,0,0,0,0,0, + 0,0,0,0,5,0,0,0,6,0,0,0,67,0,0,0, + 115,60,0,0,0,124,0,160,0,124,1,161,1,92,2,125, + 2,125,3,124,2,100,1,117,0,114,56,116,1,124,3,131, + 1,114,56,100,2,125,4,116,2,160,3,124,4,160,4,124, + 3,100,3,25,0,161,1,116,5,161,2,1,0,124,2,83, + 0,41,4,122,155,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,32,98,121,32,100,101,108,101,103,97,116,105,110,103, + 32,116,111,10,32,32,32,32,115,101,108,102,46,102,105,110, + 100,95,108,111,97,100,101,114,40,41,46,10,10,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,32,105,110,32,102,97, + 118,111,114,32,111,102,32,102,105,110,100,101,114,46,102,105, + 110,100,95,115,112,101,99,40,41,46,10,10,32,32,32,32, + 78,122,44,78,111,116,32,105,109,112,111,114,116,105,110,103, + 32,100,105,114,101,99,116,111,114,121,32,123,125,58,32,109, + 105,115,115,105,110,103,32,95,95,105,110,105,116,95,95,114, + 73,0,0,0,41,6,218,11,102,105,110,100,95,108,111,97, + 100,101,114,114,23,0,0,0,114,75,0,0,0,114,76,0, + 0,0,114,62,0,0,0,218,13,73,109,112,111,114,116,87, + 97,114,110,105,110,103,41,5,114,118,0,0,0,218,8,102, + 117,108,108,110,97,109,101,218,6,108,111,97,100,101,114,218, + 8,112,111,114,116,105,111,110,115,218,3,109,115,103,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,218,17,95, + 102,105,110,100,95,109,111,100,117,108,101,95,115,104,105,109, + 227,1,0,0,115,10,0,0,0,0,10,14,1,16,1,4, + 1,22,1,114,143,0,0,0,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,166,0,0,0,124,0,100,1,100,2,133,2,25,0, + 125,3,124,3,116,0,107,3,114,64,100,3,124,1,155,2, + 100,4,124,3,155,2,157,4,125,4,116,1,160,2,100,5, + 124,4,161,2,1,0,116,3,124,4,102,1,105,0,124,2, + 164,1,142,1,130,1,116,4,124,0,131,1,100,6,107,0, + 114,106,100,7,124,1,155,2,157,2,125,4,116,1,160,2, + 100,5,124,4,161,2,1,0,116,5,124,4,131,1,130,1, + 116,6,124,0,100,2,100,8,133,2,25,0,131,1,125,5, + 124,5,100,9,64,0,114,162,100,10,124,5,155,2,100,11, + 124,1,155,2,157,4,125,4,116,3,124,4,102,1,105,0, + 124,2,164,1,142,1,130,1,124,5,83,0,41,12,97,84, + 2,0,0,80,101,114,102,111,114,109,32,98,97,115,105,99, + 32,118,97,108,105,100,105,116,121,32,99,104,101,99,107,105, + 110,103,32,111,102,32,97,32,112,121,99,32,104,101,97,100, + 101,114,32,97,110,100,32,114,101,116,117,114,110,32,116,104, + 101,32,102,108,97,103,115,32,102,105,101,108,100,44,10,32, + 32,32,32,119,104,105,99,104,32,100,101,116,101,114,109,105, + 110,101,115,32,104,111,119,32,116,104,101,32,112,121,99,32, + 115,104,111,117,108,100,32,98,101,32,102,117,114,116,104,101, + 114,32,118,97,108,105,100,97,116,101,100,32,97,103,97,105, + 110,115,116,32,116,104,101,32,115,111,117,114,99,101,46,10, + 10,32,32,32,32,42,100,97,116,97,42,32,105,115,32,116, + 104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,116, + 104,101,32,112,121,99,32,102,105,108,101,46,32,40,79,110, + 108,121,32,116,104,101,32,102,105,114,115,116,32,49,54,32, + 98,121,116,101,115,32,97,114,101,10,32,32,32,32,114,101, + 113,117,105,114,101,100,44,32,116,104,111,117,103,104,46,41, + 10,10,32,32,32,32,42,110,97,109,101,42,32,105,115,32, + 116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32, + 109,111,100,117,108,101,32,98,101,105,110,103,32,105,109,112, + 111,114,116,101,100,46,32,73,116,32,105,115,32,117,115,101, + 100,32,102,111,114,32,108,111,103,103,105,110,103,46,10,10, + 32,32,32,32,42,101,120,99,95,100,101,116,97,105,108,115, + 42,32,105,115,32,97,32,100,105,99,116,105,111,110,97,114, + 121,32,112,97,115,115,101,100,32,116,111,32,73,109,112,111, + 114,116,69,114,114,111,114,32,105,102,32,105,116,32,114,97, + 105,115,101,100,32,102,111,114,10,32,32,32,32,105,109,112, + 114,111,118,101,100,32,100,101,98,117,103,103,105,110,103,46, + 10,10,32,32,32,32,73,109,112,111,114,116,69,114,114,111, + 114,32,105,115,32,114,97,105,115,101,100,32,119,104,101,110, + 32,116,104,101,32,109,97,103,105,99,32,110,117,109,98,101, + 114,32,105,115,32,105,110,99,111,114,114,101,99,116,32,111, + 114,32,119,104,101,110,32,116,104,101,32,102,108,97,103,115, + 10,32,32,32,32,102,105,101,108,100,32,105,115,32,105,110, + 118,97,108,105,100,46,32,69,79,70,69,114,114,111,114,32, + 105,115,32,114,97,105,115,101,100,32,119,104,101,110,32,116, + 104,101,32,100,97,116,97,32,105,115,32,102,111,117,110,100, + 32,116,111,32,98,101,32,116,114,117,110,99,97,116,101,100, + 46,10,10,32,32,32,32,78,114,16,0,0,0,122,20,98, + 97,100,32,109,97,103,105,99,32,110,117,109,98,101,114,32, + 105,110,32,122,2,58,32,250,2,123,125,233,16,0,0,0, + 122,40,114,101,97,99,104,101,100,32,69,79,70,32,119,104, + 105,108,101,32,114,101,97,100,105,110,103,32,112,121,99,32, + 104,101,97,100,101,114,32,111,102,32,233,8,0,0,0,233, + 252,255,255,255,122,14,105,110,118,97,108,105,100,32,102,108, + 97,103,115,32,122,4,32,105,110,32,41,7,218,12,77,65, + 71,73,67,95,78,85,77,66,69,82,114,134,0,0,0,218, + 16,95,118,101,114,98,111,115,101,95,109,101,115,115,97,103, + 101,114,117,0,0,0,114,23,0,0,0,218,8,69,79,70, + 69,114,114,111,114,114,27,0,0,0,41,6,114,26,0,0, + 0,114,116,0,0,0,218,11,101,120,99,95,100,101,116,97, + 105,108,115,90,5,109,97,103,105,99,114,92,0,0,0,114, + 2,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,13,95,99,108,97,115,115,105,102,121,95,112, + 121,99,244,1,0,0,115,28,0,0,0,0,16,12,1,8, + 1,16,1,12,1,16,1,12,1,10,1,12,1,8,1,16, + 2,8,1,16,1,16,1,114,152,0,0,0,99,5,0,0, + 0,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0, + 0,67,0,0,0,115,120,0,0,0,116,0,124,0,100,1, + 100,2,133,2,25,0,131,1,124,1,100,3,64,0,107,3, + 114,62,100,4,124,3,155,2,157,2,125,5,116,1,160,2, + 100,5,124,5,161,2,1,0,116,3,124,5,102,1,105,0, + 124,4,164,1,142,1,130,1,124,2,100,6,117,1,114,116, + 116,0,124,0,100,2,100,7,133,2,25,0,131,1,124,2, + 100,3,64,0,107,3,114,116,116,3,100,4,124,3,155,2, + 157,2,102,1,105,0,124,4,164,1,142,1,130,1,100,6, + 83,0,41,8,97,7,2,0,0,86,97,108,105,100,97,116, + 101,32,97,32,112,121,99,32,97,103,97,105,110,115,116,32, + 116,104,101,32,115,111,117,114,99,101,32,108,97,115,116,45, + 109,111,100,105,102,105,101,100,32,116,105,109,101,46,10,10, + 32,32,32,32,42,100,97,116,97,42,32,105,115,32,116,104, + 101,32,99,111,110,116,101,110,116,115,32,111,102,32,116,104, + 101,32,112,121,99,32,102,105,108,101,46,32,40,79,110,108, + 121,32,116,104,101,32,102,105,114,115,116,32,49,54,32,98, + 121,116,101,115,32,97,114,101,10,32,32,32,32,114,101,113, + 117,105,114,101,100,46,41,10,10,32,32,32,32,42,115,111, + 117,114,99,101,95,109,116,105,109,101,42,32,105,115,32,116, + 104,101,32,108,97,115,116,32,109,111,100,105,102,105,101,100, + 32,116,105,109,101,115,116,97,109,112,32,111,102,32,116,104, + 101,32,115,111,117,114,99,101,32,102,105,108,101,46,10,10, + 32,32,32,32,42,115,111,117,114,99,101,95,115,105,122,101, + 42,32,105,115,32,78,111,110,101,32,111,114,32,116,104,101, + 32,115,105,122,101,32,111,102,32,116,104,101,32,115,111,117, + 114,99,101,32,102,105,108,101,32,105,110,32,98,121,116,101, + 115,46,10,10,32,32,32,32,42,110,97,109,101,42,32,105, + 115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104, + 101,32,109,111,100,117,108,101,32,98,101,105,110,103,32,105, + 109,112,111,114,116,101,100,46,32,73,116,32,105,115,32,117, + 115,101,100,32,102,111,114,32,108,111,103,103,105,110,103,46, + 10,10,32,32,32,32,42,101,120,99,95,100,101,116,97,105, + 108,115,42,32,105,115,32,97,32,100,105,99,116,105,111,110, + 97,114,121,32,112,97,115,115,101,100,32,116,111,32,73,109, + 112,111,114,116,69,114,114,111,114,32,105,102,32,105,116,32, + 114,97,105,115,101,100,32,102,111,114,10,32,32,32,32,105, + 109,112,114,111,118,101,100,32,100,101,98,117,103,103,105,110, + 103,46,10,10,32,32,32,32,65,110,32,73,109,112,111,114, 116,69,114,114,111,114,32,105,115,32,114,97,105,115,101,100, - 32,119,104,101,110,32,116,104,101,32,109,97,103,105,99,32, - 110,117,109,98,101,114,32,105,115,32,105,110,99,111,114,114, - 101,99,116,32,111,114,32,119,104,101,110,32,116,104,101,32, - 102,108,97,103,115,10,32,32,32,32,102,105,101,108,100,32, - 105,115,32,105,110,118,97,108,105,100,46,32,69,79,70,69, - 114,114,111,114,32,105,115,32,114,97,105,115,101,100,32,119, - 104,101,110,32,116,104,101,32,100,97,116,97,32,105,115,32, - 102,111,117,110,100,32,116,111,32,98,101,32,116,114,117,110, - 99,97,116,101,100,46,10,10,32,32,32,32,78,114,15,0, - 0,0,122,20,98,97,100,32,109,97,103,105,99,32,110,117, - 109,98,101,114,32,105,110,32,122,2,58,32,250,2,123,125, - 233,16,0,0,0,122,40,114,101,97,99,104,101,100,32,69, - 79,70,32,119,104,105,108,101,32,114,101,97,100,105,110,103, - 32,112,121,99,32,104,101,97,100,101,114,32,111,102,32,233, - 8,0,0,0,233,252,255,255,255,122,14,105,110,118,97,108, - 105,100,32,102,108,97,103,115,32,122,4,32,105,110,32,41, - 7,218,12,77,65,71,73,67,95,78,85,77,66,69,82,114, - 135,0,0,0,218,16,95,118,101,114,98,111,115,101,95,109, - 101,115,115,97,103,101,114,118,0,0,0,114,22,0,0,0, - 218,8,69,79,70,69,114,114,111,114,114,27,0,0,0,41, - 6,114,26,0,0,0,114,117,0,0,0,218,11,101,120,99, - 95,100,101,116,97,105,108,115,90,5,109,97,103,105,99,114, - 93,0,0,0,114,83,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,13,95,99,108,97,115,115, - 105,102,121,95,112,121,99,237,1,0,0,115,28,0,0,0, - 0,16,12,1,8,1,16,1,12,1,12,1,12,1,10,1, - 12,1,8,1,16,2,8,1,16,1,12,1,114,153,0,0, - 0,99,5,0,0,0,0,0,0,0,0,0,0,0,6,0, - 0,0,4,0,0,0,67,0,0,0,115,112,0,0,0,116, - 0,124,0,100,1,100,2,133,2,25,0,131,1,124,1,100, - 3,64,0,107,3,114,58,100,4,124,3,155,2,157,2,125, - 5,116,1,160,2,100,5,124,5,161,2,1,0,116,3,124, - 5,102,1,124,4,142,1,130,1,124,2,100,6,107,9,114, - 108,116,0,124,0,100,2,100,7,133,2,25,0,131,1,124, - 2,100,3,64,0,107,3,114,108,116,3,100,4,124,3,155, - 2,157,2,102,1,124,4,142,1,130,1,100,6,83,0,41, - 8,97,7,2,0,0,86,97,108,105,100,97,116,101,32,97, - 32,112,121,99,32,97,103,97,105,110,115,116,32,116,104,101, - 32,115,111,117,114,99,101,32,108,97,115,116,45,109,111,100, - 105,102,105,101,100,32,116,105,109,101,46,10,10,32,32,32, - 32,42,100,97,116,97,42,32,105,115,32,116,104,101,32,99, - 111,110,116,101,110,116,115,32,111,102,32,116,104,101,32,112, - 121,99,32,102,105,108,101,46,32,40,79,110,108,121,32,116, - 104,101,32,102,105,114,115,116,32,49,54,32,98,121,116,101, - 115,32,97,114,101,10,32,32,32,32,114,101,113,117,105,114, - 101,100,46,41,10,10,32,32,32,32,42,115,111,117,114,99, - 101,95,109,116,105,109,101,42,32,105,115,32,116,104,101,32, - 108,97,115,116,32,109,111,100,105,102,105,101,100,32,116,105, - 109,101,115,116,97,109,112,32,111,102,32,116,104,101,32,115, - 111,117,114,99,101,32,102,105,108,101,46,10,10,32,32,32, - 32,42,115,111,117,114,99,101,95,115,105,122,101,42,32,105, - 115,32,78,111,110,101,32,111,114,32,116,104,101,32,115,105, - 122,101,32,111,102,32,116,104,101,32,115,111,117,114,99,101, - 32,102,105,108,101,32,105,110,32,98,121,116,101,115,46,10, - 10,32,32,32,32,42,110,97,109,101,42,32,105,115,32,116, - 104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,109, - 111,100,117,108,101,32,98,101,105,110,103,32,105,109,112,111, - 114,116,101,100,46,32,73,116,32,105,115,32,117,115,101,100, - 32,102,111,114,32,108,111,103,103,105,110,103,46,10,10,32, - 32,32,32,42,101,120,99,95,100,101,116,97,105,108,115,42, - 32,105,115,32,97,32,100,105,99,116,105,111,110,97,114,121, - 32,112,97,115,115,101,100,32,116,111,32,73,109,112,111,114, - 116,69,114,114,111,114,32,105,102,32,105,116,32,114,97,105, - 115,101,100,32,102,111,114,10,32,32,32,32,105,109,112,114, - 111,118,101,100,32,100,101,98,117,103,103,105,110,103,46,10, - 10,32,32,32,32,65,110,32,73,109,112,111,114,116,69,114, - 114,111,114,32,105,115,32,114,97,105,115,101,100,32,105,102, - 32,116,104,101,32,98,121,116,101,99,111,100,101,32,105,115, - 32,115,116,97,108,101,46,10,10,32,32,32,32,114,147,0, - 0,0,233,12,0,0,0,114,14,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,114,145,0,0,0,78,114,146,0,0,0,41, - 4,114,27,0,0,0,114,135,0,0,0,114,150,0,0,0, - 114,118,0,0,0,41,6,114,26,0,0,0,218,12,115,111, - 117,114,99,101,95,109,116,105,109,101,218,11,115,111,117,114, - 99,101,95,115,105,122,101,114,117,0,0,0,114,152,0,0, - 0,114,93,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,23,95,118,97,108,105,100,97,116,101, - 95,116,105,109,101,115,116,97,109,112,95,112,121,99,14,2, - 0,0,115,16,0,0,0,0,19,24,1,10,1,12,1,12, - 1,8,1,22,255,2,2,114,157,0,0,0,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,38,0,0,0,124,0,100,1,100,2, - 133,2,25,0,124,1,107,3,114,34,116,0,100,3,124,2, - 155,2,157,2,102,1,124,3,142,1,130,1,100,4,83,0, - 41,5,97,243,1,0,0,86,97,108,105,100,97,116,101,32, - 97,32,104,97,115,104,45,98,97,115,101,100,32,112,121,99, - 32,98,121,32,99,104,101,99,107,105,110,103,32,116,104,101, - 32,114,101,97,108,32,115,111,117,114,99,101,32,104,97,115, - 104,32,97,103,97,105,110,115,116,32,116,104,101,32,111,110, - 101,32,105,110,10,32,32,32,32,116,104,101,32,112,121,99, - 32,104,101,97,100,101,114,46,10,10,32,32,32,32,42,100, - 97,116,97,42,32,105,115,32,116,104,101,32,99,111,110,116, - 101,110,116,115,32,111,102,32,116,104,101,32,112,121,99,32, - 102,105,108,101,46,32,40,79,110,108,121,32,116,104,101,32, - 102,105,114,115,116,32,49,54,32,98,121,116,101,115,32,97, - 114,101,10,32,32,32,32,114,101,113,117,105,114,101,100,46, - 41,10,10,32,32,32,32,42,115,111,117,114,99,101,95,104, - 97,115,104,42,32,105,115,32,116,104,101,32,105,109,112,111, - 114,116,108,105,98,46,117,116,105,108,46,115,111,117,114,99, - 101,95,104,97,115,104,40,41,32,111,102,32,116,104,101,32, - 115,111,117,114,99,101,32,102,105,108,101,46,10,10,32,32, - 32,32,42,110,97,109,101,42,32,105,115,32,116,104,101,32, - 110,97,109,101,32,111,102,32,116,104,101,32,109,111,100,117, - 108,101,32,98,101,105,110,103,32,105,109,112,111,114,116,101, - 100,46,32,73,116,32,105,115,32,117,115,101,100,32,102,111, - 114,32,108,111,103,103,105,110,103,46,10,10,32,32,32,32, - 42,101,120,99,95,100,101,116,97,105,108,115,42,32,105,115, - 32,97,32,100,105,99,116,105,111,110,97,114,121,32,112,97, - 115,115,101,100,32,116,111,32,73,109,112,111,114,116,69,114, - 114,111,114,32,105,102,32,105,116,32,114,97,105,115,101,100, - 32,102,111,114,10,32,32,32,32,105,109,112,114,111,118,101, - 100,32,100,101,98,117,103,103,105,110,103,46,10,10,32,32, - 32,32,65,110,32,73,109,112,111,114,116,69,114,114,111,114, - 32,105,115,32,114,97,105,115,101,100,32,105,102,32,116,104, - 101,32,98,121,116,101,99,111,100,101,32,105,115,32,115,116, - 97,108,101,46,10,10,32,32,32,32,114,147,0,0,0,114, - 146,0,0,0,122,46,104,97,115,104,32,105,110,32,98,121, - 116,101,99,111,100,101,32,100,111,101,115,110,39,116,32,109, - 97,116,99,104,32,104,97,115,104,32,111,102,32,115,111,117, - 114,99,101,32,78,41,1,114,118,0,0,0,41,4,114,26, - 0,0,0,218,11,115,111,117,114,99,101,95,104,97,115,104, - 114,117,0,0,0,114,152,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,18,95,118,97,108,105, - 100,97,116,101,95,104,97,115,104,95,112,121,99,42,2,0, - 0,115,12,0,0,0,0,17,16,1,2,1,8,255,2,2, - 2,254,114,159,0,0,0,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,80,0,0,0,116,0,160,1,124,0,161,1,125,4,116, - 2,124,4,116,3,131,2,114,56,116,4,160,5,100,1,124, - 2,161,2,1,0,124,3,100,2,107,9,114,52,116,6,160, - 7,124,4,124,3,161,2,1,0,124,4,83,0,116,8,100, - 3,160,9,124,2,161,1,124,1,124,2,100,4,141,3,130, - 1,100,2,83,0,41,5,122,35,67,111,109,112,105,108,101, - 32,98,121,116,101,99,111,100,101,32,97,115,32,102,111,117, - 110,100,32,105,110,32,97,32,112,121,99,46,122,21,99,111, - 100,101,32,111,98,106,101,99,116,32,102,114,111,109,32,123, - 33,114,125,78,122,23,78,111,110,45,99,111,100,101,32,111, - 98,106,101,99,116,32,105,110,32,123,33,114,125,169,2,114, - 117,0,0,0,114,44,0,0,0,41,10,218,7,109,97,114, - 115,104,97,108,90,5,108,111,97,100,115,218,10,105,115,105, - 110,115,116,97,110,99,101,218,10,95,99,111,100,101,95,116, - 121,112,101,114,135,0,0,0,114,150,0,0,0,218,4,95, - 105,109,112,90,16,95,102,105,120,95,99,111,95,102,105,108, - 101,110,97,109,101,114,118,0,0,0,114,62,0,0,0,41, - 5,114,26,0,0,0,114,117,0,0,0,114,107,0,0,0, - 114,108,0,0,0,218,4,99,111,100,101,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,17,95,99,111,109, - 112,105,108,101,95,98,121,116,101,99,111,100,101,66,2,0, - 0,115,20,0,0,0,0,2,10,1,10,1,12,1,8,1, - 12,1,4,2,10,1,2,0,2,255,114,166,0,0,0,114, - 73,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,5,0,0,0,67,0,0,0,115,70,0, - 0,0,116,0,116,1,131,1,125,3,124,3,160,2,116,3, - 100,1,131,1,161,1,1,0,124,3,160,2,116,3,124,1, - 131,1,161,1,1,0,124,3,160,2,116,3,124,2,131,1, - 161,1,1,0,124,3,160,2,116,4,160,5,124,0,161,1, - 161,1,1,0,124,3,83,0,41,2,122,43,80,114,111,100, - 117,99,101,32,116,104,101,32,100,97,116,97,32,102,111,114, - 32,97,32,116,105,109,101,115,116,97,109,112,45,98,97,115, - 101,100,32,112,121,99,46,114,73,0,0,0,41,6,218,9, - 98,121,116,101,97,114,114,97,121,114,149,0,0,0,218,6, - 101,120,116,101,110,100,114,20,0,0,0,114,161,0,0,0, - 218,5,100,117,109,112,115,41,4,114,165,0,0,0,218,5, - 109,116,105,109,101,114,156,0,0,0,114,26,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,22, - 95,99,111,100,101,95,116,111,95,116,105,109,101,115,116,97, - 109,112,95,112,121,99,79,2,0,0,115,12,0,0,0,0, - 2,8,1,14,1,14,1,14,1,16,1,114,171,0,0,0, - 84,99,3,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,5,0,0,0,67,0,0,0,115,80,0,0,0,116, - 0,116,1,131,1,125,3,100,1,124,2,100,1,62,0,66, - 0,125,4,124,3,160,2,116,3,124,4,131,1,161,1,1, - 0,116,4,124,1,131,1,100,2,107,2,115,50,116,5,130, - 1,124,3,160,2,124,1,161,1,1,0,124,3,160,2,116, - 6,160,7,124,0,161,1,161,1,1,0,124,3,83,0,41, - 3,122,38,80,114,111,100,117,99,101,32,116,104,101,32,100, - 97,116,97,32,102,111,114,32,97,32,104,97,115,104,45,98, - 97,115,101,100,32,112,121,99,46,114,39,0,0,0,114,147, - 0,0,0,41,8,114,167,0,0,0,114,149,0,0,0,114, - 168,0,0,0,114,20,0,0,0,114,22,0,0,0,114,23, - 0,0,0,114,161,0,0,0,114,169,0,0,0,41,5,114, - 165,0,0,0,114,158,0,0,0,90,7,99,104,101,99,107, - 101,100,114,26,0,0,0,114,83,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,17,95,99,111, - 100,101,95,116,111,95,104,97,115,104,95,112,121,99,89,2, + 32,105,102,32,116,104,101,32,98,121,116,101,99,111,100,101, + 32,105,115,32,115,116,97,108,101,46,10,10,32,32,32,32, + 114,146,0,0,0,233,12,0,0,0,114,15,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,114,144,0,0,0,78,114,145,0, + 0,0,41,4,114,27,0,0,0,114,134,0,0,0,114,149, + 0,0,0,114,117,0,0,0,41,6,114,26,0,0,0,218, + 12,115,111,117,114,99,101,95,109,116,105,109,101,218,11,115, + 111,117,114,99,101,95,115,105,122,101,114,116,0,0,0,114, + 151,0,0,0,114,92,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,23,95,118,97,108,105,100, + 97,116,101,95,116,105,109,101,115,116,97,109,112,95,112,121, + 99,21,2,0,0,115,16,0,0,0,0,19,24,1,10,1, + 12,1,16,1,8,1,22,255,2,2,114,156,0,0,0,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,42,0,0,0,124,0,100, + 1,100,2,133,2,25,0,124,1,107,3,114,38,116,0,100, + 3,124,2,155,2,157,2,102,1,105,0,124,3,164,1,142, + 1,130,1,100,4,83,0,41,5,97,243,1,0,0,86,97, + 108,105,100,97,116,101,32,97,32,104,97,115,104,45,98,97, + 115,101,100,32,112,121,99,32,98,121,32,99,104,101,99,107, + 105,110,103,32,116,104,101,32,114,101,97,108,32,115,111,117, + 114,99,101,32,104,97,115,104,32,97,103,97,105,110,115,116, + 32,116,104,101,32,111,110,101,32,105,110,10,32,32,32,32, + 116,104,101,32,112,121,99,32,104,101,97,100,101,114,46,10, + 10,32,32,32,32,42,100,97,116,97,42,32,105,115,32,116, + 104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,116, + 104,101,32,112,121,99,32,102,105,108,101,46,32,40,79,110, + 108,121,32,116,104,101,32,102,105,114,115,116,32,49,54,32, + 98,121,116,101,115,32,97,114,101,10,32,32,32,32,114,101, + 113,117,105,114,101,100,46,41,10,10,32,32,32,32,42,115, + 111,117,114,99,101,95,104,97,115,104,42,32,105,115,32,116, + 104,101,32,105,109,112,111,114,116,108,105,98,46,117,116,105, + 108,46,115,111,117,114,99,101,95,104,97,115,104,40,41,32, + 111,102,32,116,104,101,32,115,111,117,114,99,101,32,102,105, + 108,101,46,10,10,32,32,32,32,42,110,97,109,101,42,32, + 105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116, + 104,101,32,109,111,100,117,108,101,32,98,101,105,110,103,32, + 105,109,112,111,114,116,101,100,46,32,73,116,32,105,115,32, + 117,115,101,100,32,102,111,114,32,108,111,103,103,105,110,103, + 46,10,10,32,32,32,32,42,101,120,99,95,100,101,116,97, + 105,108,115,42,32,105,115,32,97,32,100,105,99,116,105,111, + 110,97,114,121,32,112,97,115,115,101,100,32,116,111,32,73, + 109,112,111,114,116,69,114,114,111,114,32,105,102,32,105,116, + 32,114,97,105,115,101,100,32,102,111,114,10,32,32,32,32, + 105,109,112,114,111,118,101,100,32,100,101,98,117,103,103,105, + 110,103,46,10,10,32,32,32,32,65,110,32,73,109,112,111, + 114,116,69,114,114,111,114,32,105,115,32,114,97,105,115,101, + 100,32,105,102,32,116,104,101,32,98,121,116,101,99,111,100, + 101,32,105,115,32,115,116,97,108,101,46,10,10,32,32,32, + 32,114,146,0,0,0,114,145,0,0,0,122,46,104,97,115, + 104,32,105,110,32,98,121,116,101,99,111,100,101,32,100,111, + 101,115,110,39,116,32,109,97,116,99,104,32,104,97,115,104, + 32,111,102,32,115,111,117,114,99,101,32,78,41,1,114,117, + 0,0,0,41,4,114,26,0,0,0,218,11,115,111,117,114, + 99,101,95,104,97,115,104,114,116,0,0,0,114,151,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 218,18,95,118,97,108,105,100,97,116,101,95,104,97,115,104, + 95,112,121,99,49,2,0,0,115,12,0,0,0,0,17,16, + 1,2,1,8,255,4,2,2,254,114,158,0,0,0,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,80,0,0,0,116,0,160,1, + 124,0,161,1,125,4,116,2,124,4,116,3,131,2,114,56, + 116,4,160,5,100,1,124,2,161,2,1,0,124,3,100,2, + 117,1,114,52,116,6,160,7,124,4,124,3,161,2,1,0, + 124,4,83,0,116,8,100,3,160,9,124,2,161,1,124,1, + 124,2,100,4,141,3,130,1,100,2,83,0,41,5,122,35, + 67,111,109,112,105,108,101,32,98,121,116,101,99,111,100,101, + 32,97,115,32,102,111,117,110,100,32,105,110,32,97,32,112, + 121,99,46,122,21,99,111,100,101,32,111,98,106,101,99,116, + 32,102,114,111,109,32,123,33,114,125,78,122,23,78,111,110, + 45,99,111,100,101,32,111,98,106,101,99,116,32,105,110,32, + 123,33,114,125,169,2,114,116,0,0,0,114,44,0,0,0, + 41,10,218,7,109,97,114,115,104,97,108,90,5,108,111,97, + 100,115,218,10,105,115,105,110,115,116,97,110,99,101,218,10, + 95,99,111,100,101,95,116,121,112,101,114,134,0,0,0,114, + 149,0,0,0,218,4,95,105,109,112,90,16,95,102,105,120, + 95,99,111,95,102,105,108,101,110,97,109,101,114,117,0,0, + 0,114,62,0,0,0,41,5,114,26,0,0,0,114,116,0, + 0,0,114,106,0,0,0,114,107,0,0,0,218,4,99,111, + 100,101,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,218,17,95,99,111,109,112,105,108,101,95,98,121,116,101, + 99,111,100,101,73,2,0,0,115,18,0,0,0,0,2,10, + 1,10,1,12,1,8,1,12,1,4,2,10,1,4,255,114, + 165,0,0,0,114,73,0,0,0,99,3,0,0,0,0,0, + 0,0,0,0,0,0,4,0,0,0,5,0,0,0,67,0, + 0,0,115,70,0,0,0,116,0,116,1,131,1,125,3,124, + 3,160,2,116,3,100,1,131,1,161,1,1,0,124,3,160, + 2,116,3,124,1,131,1,161,1,1,0,124,3,160,2,116, + 3,124,2,131,1,161,1,1,0,124,3,160,2,116,4,160, + 5,124,0,161,1,161,1,1,0,124,3,83,0,41,2,122, + 43,80,114,111,100,117,99,101,32,116,104,101,32,100,97,116, + 97,32,102,111,114,32,97,32,116,105,109,101,115,116,97,109, + 112,45,98,97,115,101,100,32,112,121,99,46,114,73,0,0, + 0,41,6,218,9,98,121,116,101,97,114,114,97,121,114,148, + 0,0,0,218,6,101,120,116,101,110,100,114,21,0,0,0, + 114,160,0,0,0,218,5,100,117,109,112,115,41,4,114,164, + 0,0,0,218,5,109,116,105,109,101,114,155,0,0,0,114, + 26,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,22,95,99,111,100,101,95,116,111,95,116,105, + 109,101,115,116,97,109,112,95,112,121,99,86,2,0,0,115, + 12,0,0,0,0,2,8,1,14,1,14,1,14,1,16,1, + 114,170,0,0,0,84,99,3,0,0,0,0,0,0,0,0, + 0,0,0,5,0,0,0,5,0,0,0,67,0,0,0,115, + 80,0,0,0,116,0,116,1,131,1,125,3,100,1,124,2, + 100,1,62,0,66,0,125,4,124,3,160,2,116,3,124,4, + 131,1,161,1,1,0,116,4,124,1,131,1,100,2,107,2, + 115,50,74,0,130,1,124,3,160,2,124,1,161,1,1,0, + 124,3,160,2,116,5,160,6,124,0,161,1,161,1,1,0, + 124,3,83,0,41,3,122,38,80,114,111,100,117,99,101,32, + 116,104,101,32,100,97,116,97,32,102,111,114,32,97,32,104, + 97,115,104,45,98,97,115,101,100,32,112,121,99,46,114,39, + 0,0,0,114,146,0,0,0,41,7,114,166,0,0,0,114, + 148,0,0,0,114,167,0,0,0,114,21,0,0,0,114,23, + 0,0,0,114,160,0,0,0,114,168,0,0,0,41,5,114, + 164,0,0,0,114,157,0,0,0,90,7,99,104,101,99,107, + 101,100,114,26,0,0,0,114,2,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,218,17,95,99,111, + 100,101,95,116,111,95,104,97,115,104,95,112,121,99,96,2, 0,0,115,14,0,0,0,0,2,8,1,12,1,14,1,16, - 1,10,1,16,1,114,172,0,0,0,99,1,0,0,0,0, + 1,10,1,16,1,114,171,0,0,0,99,1,0,0,0,0, 0,0,0,0,0,0,0,5,0,0,0,6,0,0,0,67, 0,0,0,115,62,0,0,0,100,1,100,2,108,0,125,1, 116,1,160,2,124,0,161,1,106,3,125,2,124,1,160,4, @@ -879,1856 +888,1847 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 25,73,110,99,114,101,109,101,110,116,97,108,78,101,119,108, 105,110,101,68,101,99,111,100,101,114,218,6,100,101,99,111, 100,101,41,5,218,12,115,111,117,114,99,101,95,98,121,116, - 101,115,114,173,0,0,0,90,21,115,111,117,114,99,101,95, + 101,115,114,172,0,0,0,90,21,115,111,117,114,99,101,95, 98,121,116,101,115,95,114,101,97,100,108,105,110,101,218,8, 101,110,99,111,100,105,110,103,90,15,110,101,119,108,105,110, - 101,95,100,101,99,111,100,101,114,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,13,100,101,99,111,100,101, - 95,115,111,117,114,99,101,100,2,0,0,115,10,0,0,0, - 0,5,8,1,12,1,10,1,12,1,114,177,0,0,0,169, - 2,114,141,0,0,0,218,26,115,117,98,109,111,100,117,108, + 101,95,100,101,99,111,100,101,114,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,13,100,101,99,111,100,101, + 95,115,111,117,114,99,101,107,2,0,0,115,10,0,0,0, + 0,5,8,1,12,1,10,1,12,1,114,176,0,0,0,169, + 2,114,140,0,0,0,218,26,115,117,98,109,111,100,117,108, 101,95,115,101,97,114,99,104,95,108,111,99,97,116,105,111, 110,115,99,2,0,0,0,0,0,0,0,2,0,0,0,9, - 0,0,0,8,0,0,0,67,0,0,0,115,16,1,0,0, - 124,1,100,1,107,8,114,60,100,2,125,1,116,0,124,2, - 100,3,131,2,114,70,122,14,124,2,160,1,124,0,161,1, - 125,1,87,0,113,70,4,0,116,2,107,10,114,56,1,0, - 1,0,1,0,89,0,113,70,88,0,110,10,116,3,160,4, - 124,1,161,1,125,1,116,5,106,6,124,0,124,2,124,1, - 100,4,141,3,125,4,100,5,124,4,95,7,124,2,100,1, - 107,8,114,154,116,8,131,0,68,0,93,42,92,2,125,5, - 125,6,124,1,160,9,116,10,124,6,131,1,161,1,114,106, - 124,5,124,0,124,1,131,2,125,2,124,2,124,4,95,11, - 1,0,113,154,113,106,100,1,83,0,124,3,116,12,107,8, - 114,220,116,0,124,2,100,6,131,2,114,226,122,14,124,2, - 160,13,124,0,161,1,125,7,87,0,110,20,4,0,116,2, - 107,10,114,206,1,0,1,0,1,0,89,0,113,226,88,0, - 124,7,114,226,103,0,124,4,95,14,110,6,124,3,124,4, - 95,14,124,4,106,14,103,0,107,2,144,1,114,12,124,1, - 144,1,114,12,116,15,124,1,131,1,100,7,25,0,125,8, - 124,4,106,14,160,16,124,8,161,1,1,0,124,4,83,0, - 41,8,97,61,1,0,0,82,101,116,117,114,110,32,97,32, - 109,111,100,117,108,101,32,115,112,101,99,32,98,97,115,101, - 100,32,111,110,32,97,32,102,105,108,101,32,108,111,99,97, - 116,105,111,110,46,10,10,32,32,32,32,84,111,32,105,110, - 100,105,99,97,116,101,32,116,104,97,116,32,116,104,101,32, - 109,111,100,117,108,101,32,105,115,32,97,32,112,97,99,107, - 97,103,101,44,32,115,101,116,10,32,32,32,32,115,117,98, - 109,111,100,117,108,101,95,115,101,97,114,99,104,95,108,111, - 99,97,116,105,111,110,115,32,116,111,32,97,32,108,105,115, - 116,32,111,102,32,100,105,114,101,99,116,111,114,121,32,112, - 97,116,104,115,46,32,32,65,110,10,32,32,32,32,101,109, - 112,116,121,32,108,105,115,116,32,105,115,32,115,117,102,102, - 105,99,105,101,110,116,44,32,116,104,111,117,103,104,32,105, - 116,115,32,110,111,116,32,111,116,104,101,114,119,105,115,101, - 32,117,115,101,102,117,108,32,116,111,32,116,104,101,10,32, - 32,32,32,105,109,112,111,114,116,32,115,121,115,116,101,109, - 46,10,10,32,32,32,32,84,104,101,32,108,111,97,100,101, - 114,32,109,117,115,116,32,116,97,107,101,32,97,32,115,112, - 101,99,32,97,115,32,105,116,115,32,111,110,108,121,32,95, - 95,105,110,105,116,95,95,40,41,32,97,114,103,46,10,10, - 32,32,32,32,78,122,9,60,117,110,107,110,111,119,110,62, - 218,12,103,101,116,95,102,105,108,101,110,97,109,101,169,1, - 218,6,111,114,105,103,105,110,84,218,10,105,115,95,112,97, - 99,107,97,103,101,114,73,0,0,0,41,17,114,129,0,0, - 0,114,180,0,0,0,114,118,0,0,0,114,2,0,0,0, - 114,79,0,0,0,114,135,0,0,0,218,10,77,111,100,117, - 108,101,83,112,101,99,90,13,95,115,101,116,95,102,105,108, - 101,97,116,116,114,218,27,95,103,101,116,95,115,117,112,112, - 111,114,116,101,100,95,102,105,108,101,95,108,111,97,100,101, - 114,115,114,111,0,0,0,114,112,0,0,0,114,141,0,0, - 0,218,9,95,80,79,80,85,76,65,84,69,114,183,0,0, - 0,114,179,0,0,0,114,47,0,0,0,218,6,97,112,112, - 101,110,100,41,9,114,117,0,0,0,90,8,108,111,99,97, - 116,105,111,110,114,141,0,0,0,114,179,0,0,0,218,4, - 115,112,101,99,218,12,108,111,97,100,101,114,95,99,108,97, - 115,115,218,8,115,117,102,102,105,120,101,115,114,183,0,0, - 0,90,7,100,105,114,110,97,109,101,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,23,115,112,101,99,95, - 102,114,111,109,95,102,105,108,101,95,108,111,99,97,116,105, - 111,110,117,2,0,0,115,62,0,0,0,0,12,8,4,4, - 1,10,2,2,1,14,1,14,1,8,2,10,8,16,1,6, - 3,8,1,14,1,14,1,10,1,6,1,6,2,4,3,8, - 2,10,1,2,1,14,1,14,1,6,2,4,1,8,2,6, - 1,12,1,6,1,12,1,12,2,114,191,0,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,80,0,0,0,101,0,90,1, - 100,0,90,2,100,1,90,3,100,2,90,4,100,3,90,5, - 100,4,90,6,101,7,100,5,100,6,132,0,131,1,90,8, - 101,7,100,7,100,8,132,0,131,1,90,9,101,7,100,14, - 100,10,100,11,132,1,131,1,90,10,101,7,100,15,100,12, - 100,13,132,1,131,1,90,11,100,9,83,0,41,16,218,21, - 87,105,110,100,111,119,115,82,101,103,105,115,116,114,121,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,109,111,100,117, - 108,101,115,32,100,101,99,108,97,114,101,100,32,105,110,32, - 116,104,101,32,87,105,110,100,111,119,115,32,114,101,103,105, - 115,116,114,121,46,122,59,83,111,102,116,119,97,114,101,92, - 80,121,116,104,111,110,92,80,121,116,104,111,110,67,111,114, - 101,92,123,115,121,115,95,118,101,114,115,105,111,110,125,92, - 77,111,100,117,108,101,115,92,123,102,117,108,108,110,97,109, - 101,125,122,65,83,111,102,116,119,97,114,101,92,80,121,116, - 104,111,110,92,80,121,116,104,111,110,67,111,114,101,92,123, - 115,121,115,95,118,101,114,115,105,111,110,125,92,77,111,100, - 117,108,101,115,92,123,102,117,108,108,110,97,109,101,125,92, - 68,101,98,117,103,70,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,8,0,0,0,67,0,0,0,115, - 56,0,0,0,122,16,116,0,160,1,116,0,106,2,124,1, - 161,2,87,0,83,0,4,0,116,3,107,10,114,50,1,0, - 1,0,1,0,116,0,160,1,116,0,106,4,124,1,161,2, - 6,0,89,0,83,0,88,0,100,0,83,0,114,110,0,0, - 0,41,5,218,7,95,119,105,110,114,101,103,90,7,79,112, - 101,110,75,101,121,90,17,72,75,69,89,95,67,85,82,82, - 69,78,84,95,85,83,69,82,114,50,0,0,0,90,18,72, - 75,69,89,95,76,79,67,65,76,95,77,65,67,72,73,78, - 69,41,2,218,3,99,108,115,114,5,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,14,95,111, - 112,101,110,95,114,101,103,105,115,116,114,121,197,2,0,0, - 115,8,0,0,0,0,2,2,1,16,1,14,1,122,36,87, - 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, - 110,100,101,114,46,95,111,112,101,110,95,114,101,103,105,115, - 116,114,121,99,2,0,0,0,0,0,0,0,0,0,0,0, - 6,0,0,0,9,0,0,0,67,0,0,0,115,114,0,0, - 0,124,0,106,0,114,14,124,0,106,1,125,2,110,6,124, - 0,106,2,125,2,124,2,106,3,124,1,100,1,116,4,106, - 5,100,0,100,2,133,2,25,0,22,0,100,3,141,2,125, - 3,122,38,124,0,160,6,124,3,161,1,143,18,125,4,116, - 7,160,8,124,4,100,4,161,2,125,5,87,0,53,0,81, - 0,82,0,88,0,87,0,110,22,4,0,116,9,107,10,114, - 108,1,0,1,0,1,0,89,0,100,0,83,0,88,0,124, - 5,83,0,41,5,78,122,5,37,100,46,37,100,114,28,0, - 0,0,41,2,114,140,0,0,0,90,11,115,121,115,95,118, - 101,114,115,105,111,110,114,40,0,0,0,41,10,218,11,68, - 69,66,85,71,95,66,85,73,76,68,218,18,82,69,71,73, - 83,84,82,89,95,75,69,89,95,68,69,66,85,71,218,12, - 82,69,71,73,83,84,82,89,95,75,69,89,114,62,0,0, - 0,114,8,0,0,0,218,12,118,101,114,115,105,111,110,95, - 105,110,102,111,114,195,0,0,0,114,193,0,0,0,90,10, - 81,117,101,114,121,86,97,108,117,101,114,50,0,0,0,41, - 6,114,194,0,0,0,114,140,0,0,0,90,12,114,101,103, - 105,115,116,114,121,95,107,101,121,114,5,0,0,0,90,4, - 104,107,101,121,218,8,102,105,108,101,112,97,116,104,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,16,95, - 115,101,97,114,99,104,95,114,101,103,105,115,116,114,121,204, - 2,0,0,115,24,0,0,0,0,2,6,1,8,2,6,1, - 6,1,16,255,6,2,2,1,12,1,26,1,14,1,8,1, - 122,38,87,105,110,100,111,119,115,82,101,103,105,115,116,114, - 121,70,105,110,100,101,114,46,95,115,101,97,114,99,104,95, - 114,101,103,105,115,116,114,121,78,99,4,0,0,0,0,0, - 0,0,0,0,0,0,8,0,0,0,8,0,0,0,67,0, - 0,0,115,122,0,0,0,124,0,160,0,124,1,161,1,125, - 4,124,4,100,0,107,8,114,22,100,0,83,0,122,12,116, - 1,124,4,131,1,1,0,87,0,110,22,4,0,116,2,107, - 10,114,56,1,0,1,0,1,0,89,0,100,0,83,0,88, - 0,116,3,131,0,68,0,93,52,92,2,125,5,125,6,124, - 4,160,4,116,5,124,6,131,1,161,1,114,64,116,6,106, - 7,124,1,124,5,124,1,124,4,131,2,124,4,100,1,141, - 3,125,7,124,7,2,0,1,0,83,0,113,64,100,0,83, - 0,41,2,78,114,181,0,0,0,41,8,114,201,0,0,0, - 114,49,0,0,0,114,50,0,0,0,114,185,0,0,0,114, - 111,0,0,0,114,112,0,0,0,114,135,0,0,0,218,16, - 115,112,101,99,95,102,114,111,109,95,108,111,97,100,101,114, - 41,8,114,194,0,0,0,114,140,0,0,0,114,44,0,0, - 0,218,6,116,97,114,103,101,116,114,200,0,0,0,114,141, - 0,0,0,114,190,0,0,0,114,188,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,9,102,105, - 110,100,95,115,112,101,99,219,2,0,0,115,28,0,0,0, - 0,2,10,1,8,1,4,1,2,1,12,1,14,1,8,1, - 14,1,14,1,6,1,8,1,2,254,6,3,122,31,87,105, - 110,100,111,119,115,82,101,103,105,115,116,114,121,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,34,0,0,0,124,0,160,0,124, - 1,124,2,161,2,125,3,124,3,100,1,107,9,114,26,124, - 3,106,1,83,0,100,1,83,0,100,1,83,0,41,2,122, - 108,70,105,110,100,32,109,111,100,117,108,101,32,110,97,109, - 101,100,32,105,110,32,116,104,101,32,114,101,103,105,115,116, - 114,121,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,78,169,2, - 114,204,0,0,0,114,141,0,0,0,169,4,114,194,0,0, - 0,114,140,0,0,0,114,44,0,0,0,114,188,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 11,102,105,110,100,95,109,111,100,117,108,101,235,2,0,0, - 115,8,0,0,0,0,7,12,1,8,1,6,2,122,33,87, - 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, - 110,100,101,114,46,102,105,110,100,95,109,111,100,117,108,101, - 41,2,78,78,41,1,78,41,12,114,126,0,0,0,114,125, - 0,0,0,114,127,0,0,0,114,128,0,0,0,114,198,0, - 0,0,114,197,0,0,0,114,196,0,0,0,218,11,99,108, - 97,115,115,109,101,116,104,111,100,114,195,0,0,0,114,201, - 0,0,0,114,204,0,0,0,114,207,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,192,0,0,0,185,2,0,0,115,28,0,0,0,8, - 2,4,3,2,255,2,4,2,255,2,3,4,2,2,1,10, - 6,2,1,10,14,2,1,12,15,2,1,114,192,0,0,0, + 0,0,0,8,0,0,0,67,0,0,0,115,12,1,0,0, + 124,1,100,1,117,0,114,58,100,2,125,1,116,0,124,2, + 100,3,131,2,114,68,122,14,124,2,160,1,124,0,161,1, + 125,1,87,0,113,68,4,0,116,2,121,54,1,0,1,0, + 1,0,89,0,113,68,48,0,110,10,116,3,160,4,124,1, + 161,1,125,1,116,5,106,6,124,0,124,2,124,1,100,4, + 141,3,125,4,100,5,124,4,95,7,124,2,100,1,117,0, + 114,152,116,8,131,0,68,0,93,42,92,2,125,5,125,6, + 124,1,160,9,116,10,124,6,131,1,161,1,114,104,124,5, + 124,0,124,1,131,2,125,2,124,2,124,4,95,11,1,0, + 113,152,113,104,100,1,83,0,124,3,116,12,117,0,114,216, + 116,0,124,2,100,6,131,2,114,222,122,14,124,2,160,13, + 124,0,161,1,125,7,87,0,110,18,4,0,116,2,121,202, + 1,0,1,0,1,0,89,0,113,222,48,0,124,7,114,222, + 103,0,124,4,95,14,110,6,124,3,124,4,95,14,124,4, + 106,14,103,0,107,2,144,1,114,8,124,1,144,1,114,8, + 116,15,124,1,131,1,100,7,25,0,125,8,124,4,106,14, + 160,16,124,8,161,1,1,0,124,4,83,0,41,8,97,61, + 1,0,0,82,101,116,117,114,110,32,97,32,109,111,100,117, + 108,101,32,115,112,101,99,32,98,97,115,101,100,32,111,110, + 32,97,32,102,105,108,101,32,108,111,99,97,116,105,111,110, + 46,10,10,32,32,32,32,84,111,32,105,110,100,105,99,97, + 116,101,32,116,104,97,116,32,116,104,101,32,109,111,100,117, + 108,101,32,105,115,32,97,32,112,97,99,107,97,103,101,44, + 32,115,101,116,10,32,32,32,32,115,117,98,109,111,100,117, + 108,101,95,115,101,97,114,99,104,95,108,111,99,97,116,105, + 111,110,115,32,116,111,32,97,32,108,105,115,116,32,111,102, + 32,100,105,114,101,99,116,111,114,121,32,112,97,116,104,115, + 46,32,32,65,110,10,32,32,32,32,101,109,112,116,121,32, + 108,105,115,116,32,105,115,32,115,117,102,102,105,99,105,101, + 110,116,44,32,116,104,111,117,103,104,32,105,116,115,32,110, + 111,116,32,111,116,104,101,114,119,105,115,101,32,117,115,101, + 102,117,108,32,116,111,32,116,104,101,10,32,32,32,32,105, + 109,112,111,114,116,32,115,121,115,116,101,109,46,10,10,32, + 32,32,32,84,104,101,32,108,111,97,100,101,114,32,109,117, + 115,116,32,116,97,107,101,32,97,32,115,112,101,99,32,97, + 115,32,105,116,115,32,111,110,108,121,32,95,95,105,110,105, + 116,95,95,40,41,32,97,114,103,46,10,10,32,32,32,32, + 78,122,9,60,117,110,107,110,111,119,110,62,218,12,103,101, + 116,95,102,105,108,101,110,97,109,101,169,1,218,6,111,114, + 105,103,105,110,84,218,10,105,115,95,112,97,99,107,97,103, + 101,114,73,0,0,0,41,17,114,128,0,0,0,114,179,0, + 0,0,114,117,0,0,0,114,4,0,0,0,114,79,0,0, + 0,114,134,0,0,0,218,10,77,111,100,117,108,101,83,112, + 101,99,90,13,95,115,101,116,95,102,105,108,101,97,116,116, + 114,218,27,95,103,101,116,95,115,117,112,112,111,114,116,101, + 100,95,102,105,108,101,95,108,111,97,100,101,114,115,114,110, + 0,0,0,114,111,0,0,0,114,140,0,0,0,218,9,95, + 80,79,80,85,76,65,84,69,114,182,0,0,0,114,178,0, + 0,0,114,47,0,0,0,218,6,97,112,112,101,110,100,41, + 9,114,116,0,0,0,90,8,108,111,99,97,116,105,111,110, + 114,140,0,0,0,114,178,0,0,0,218,4,115,112,101,99, + 218,12,108,111,97,100,101,114,95,99,108,97,115,115,218,8, + 115,117,102,102,105,120,101,115,114,182,0,0,0,90,7,100, + 105,114,110,97,109,101,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,218,23,115,112,101,99,95,102,114,111,109, + 95,102,105,108,101,95,108,111,99,97,116,105,111,110,124,2, + 0,0,115,62,0,0,0,0,12,8,4,4,1,10,2,2, + 1,14,1,12,1,8,2,10,8,16,1,6,3,8,1,14, + 1,14,1,10,1,6,1,6,2,4,3,8,2,10,1,2, + 1,14,1,12,1,6,2,4,1,8,2,6,1,12,1,6, + 1,12,1,12,2,114,190,0,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,80,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,90,4,100,3,90,5,100,4,90,6, + 101,7,100,5,100,6,132,0,131,1,90,8,101,7,100,7, + 100,8,132,0,131,1,90,9,101,7,100,14,100,10,100,11, + 132,1,131,1,90,10,101,7,100,15,100,12,100,13,132,1, + 131,1,90,11,100,9,83,0,41,16,218,21,87,105,110,100, + 111,119,115,82,101,103,105,115,116,114,121,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,109,111,100,117,108,101,115,32, + 100,101,99,108,97,114,101,100,32,105,110,32,116,104,101,32, + 87,105,110,100,111,119,115,32,114,101,103,105,115,116,114,121, + 46,122,59,83,111,102,116,119,97,114,101,92,80,121,116,104, + 111,110,92,80,121,116,104,111,110,67,111,114,101,92,123,115, + 121,115,95,118,101,114,115,105,111,110,125,92,77,111,100,117, + 108,101,115,92,123,102,117,108,108,110,97,109,101,125,122,65, + 83,111,102,116,119,97,114,101,92,80,121,116,104,111,110,92, + 80,121,116,104,111,110,67,111,114,101,92,123,115,121,115,95, + 118,101,114,115,105,111,110,125,92,77,111,100,117,108,101,115, + 92,123,102,117,108,108,110,97,109,101,125,92,68,101,98,117, + 103,70,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,8,0,0,0,67,0,0,0,115,54,0,0,0, + 122,16,116,0,160,1,116,0,106,2,124,1,161,2,87,0, + 83,0,4,0,116,3,121,48,1,0,1,0,1,0,116,0, + 160,1,116,0,106,4,124,1,161,2,6,0,89,0,83,0, + 48,0,100,0,83,0,114,109,0,0,0,41,5,218,6,119, + 105,110,114,101,103,90,7,79,112,101,110,75,101,121,90,17, + 72,75,69,89,95,67,85,82,82,69,78,84,95,85,83,69, + 82,114,50,0,0,0,90,18,72,75,69,89,95,76,79,67, + 65,76,95,77,65,67,72,73,78,69,41,2,218,3,99,108, + 115,114,7,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,218,14,95,111,112,101,110,95,114,101,103, + 105,115,116,114,121,204,2,0,0,115,8,0,0,0,0,2, + 2,1,16,1,12,1,122,36,87,105,110,100,111,119,115,82, + 101,103,105,115,116,114,121,70,105,110,100,101,114,46,95,111, + 112,101,110,95,114,101,103,105,115,116,114,121,99,2,0,0, + 0,0,0,0,0,0,0,0,0,6,0,0,0,8,0,0, + 0,67,0,0,0,115,132,0,0,0,124,0,106,0,114,14, + 124,0,106,1,125,2,110,6,124,0,106,2,125,2,124,2, + 106,3,124,1,100,1,116,4,106,5,100,0,100,2,133,2, + 25,0,22,0,100,3,141,2,125,3,122,58,124,0,160,6, + 124,3,161,1,143,28,125,4,116,7,160,8,124,4,100,4, + 161,2,125,5,87,0,100,0,4,0,4,0,131,3,1,0, + 110,16,49,0,115,94,48,0,1,0,1,0,1,0,89,0, + 1,0,87,0,110,20,4,0,116,9,121,126,1,0,1,0, + 1,0,89,0,100,0,83,0,48,0,124,5,83,0,41,5, + 78,122,5,37,100,46,37,100,114,28,0,0,0,41,2,114, + 139,0,0,0,90,11,115,121,115,95,118,101,114,115,105,111, + 110,114,40,0,0,0,41,10,218,11,68,69,66,85,71,95, + 66,85,73,76,68,218,18,82,69,71,73,83,84,82,89,95, + 75,69,89,95,68,69,66,85,71,218,12,82,69,71,73,83, + 84,82,89,95,75,69,89,114,62,0,0,0,114,1,0,0, + 0,218,12,118,101,114,115,105,111,110,95,105,110,102,111,114, + 194,0,0,0,114,192,0,0,0,90,10,81,117,101,114,121, + 86,97,108,117,101,114,50,0,0,0,41,6,114,193,0,0, + 0,114,139,0,0,0,90,12,114,101,103,105,115,116,114,121, + 95,107,101,121,114,7,0,0,0,90,4,104,107,101,121,218, + 8,102,105,108,101,112,97,116,104,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,16,95,115,101,97,114,99, + 104,95,114,101,103,105,115,116,114,121,211,2,0,0,115,24, + 0,0,0,0,2,6,1,8,2,6,1,6,1,16,255,6, + 2,2,1,12,1,46,1,12,1,8,1,122,38,87,105,110, + 100,111,119,115,82,101,103,105,115,116,114,121,70,105,110,100, + 101,114,46,95,115,101,97,114,99,104,95,114,101,103,105,115, + 116,114,121,78,99,4,0,0,0,0,0,0,0,0,0,0, + 0,8,0,0,0,8,0,0,0,67,0,0,0,115,120,0, + 0,0,124,0,160,0,124,1,161,1,125,4,124,4,100,0, + 117,0,114,22,100,0,83,0,122,12,116,1,124,4,131,1, + 1,0,87,0,110,20,4,0,116,2,121,54,1,0,1,0, + 1,0,89,0,100,0,83,0,48,0,116,3,131,0,68,0, + 93,52,92,2,125,5,125,6,124,4,160,4,116,5,124,6, + 131,1,161,1,114,62,116,6,106,7,124,1,124,5,124,1, + 124,4,131,2,124,4,100,1,141,3,125,7,124,7,2,0, + 1,0,83,0,113,62,100,0,83,0,41,2,78,114,180,0, + 0,0,41,8,114,200,0,0,0,114,49,0,0,0,114,50, + 0,0,0,114,184,0,0,0,114,110,0,0,0,114,111,0, + 0,0,114,134,0,0,0,218,16,115,112,101,99,95,102,114, + 111,109,95,108,111,97,100,101,114,41,8,114,193,0,0,0, + 114,139,0,0,0,114,44,0,0,0,218,6,116,97,114,103, + 101,116,114,199,0,0,0,114,140,0,0,0,114,189,0,0, + 0,114,187,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,218,9,102,105,110,100,95,115,112,101,99, + 226,2,0,0,115,28,0,0,0,0,2,10,1,8,1,4, + 1,2,1,12,1,12,1,8,1,14,1,14,1,6,1,8, + 1,2,254,6,3,122,31,87,105,110,100,111,119,115,82,101, + 103,105,115,116,114,121,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, + 34,0,0,0,124,0,160,0,124,1,124,2,161,2,125,3, + 124,3,100,1,117,1,114,26,124,3,106,1,83,0,100,1, + 83,0,100,1,83,0,41,2,122,108,70,105,110,100,32,109, + 111,100,117,108,101,32,110,97,109,101,100,32,105,110,32,116, + 104,101,32,114,101,103,105,115,116,114,121,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,78,169,2,114,203,0,0,0,114,140, + 0,0,0,169,4,114,193,0,0,0,114,139,0,0,0,114, + 44,0,0,0,114,187,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,11,102,105,110,100,95,109, + 111,100,117,108,101,242,2,0,0,115,8,0,0,0,0,7, + 12,1,8,1,6,2,122,33,87,105,110,100,111,119,115,82, + 101,103,105,115,116,114,121,70,105,110,100,101,114,46,102,105, + 110,100,95,109,111,100,117,108,101,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,197,0,0,0,114,196,0,0,0, + 114,195,0,0,0,218,11,99,108,97,115,115,109,101,116,104, + 111,100,114,194,0,0,0,114,200,0,0,0,114,203,0,0, + 0,114,206,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,114,191,0,0,0,192, + 2,0,0,115,28,0,0,0,8,2,4,3,2,255,2,4, + 2,255,2,3,4,2,2,1,10,6,2,1,10,14,2,1, + 12,15,2,1,114,191,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,48,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,83,0,41,11,218,13,95,76,111,97,100, + 101,114,66,97,115,105,99,115,122,83,66,97,115,101,32,99, + 108,97,115,115,32,111,102,32,99,111,109,109,111,110,32,99, + 111,100,101,32,110,101,101,100,101,100,32,98,121,32,98,111, + 116,104,32,83,111,117,114,99,101,76,111,97,100,101,114,32, + 97,110,100,10,32,32,32,32,83,111,117,114,99,101,108,101, + 115,115,70,105,108,101,76,111,97,100,101,114,46,99,2,0, + 0,0,0,0,0,0,0,0,0,0,5,0,0,0,4,0, + 0,0,67,0,0,0,115,64,0,0,0,116,0,124,0,160, + 1,124,1,161,1,131,1,100,1,25,0,125,2,124,2,160, + 2,100,2,100,1,161,2,100,3,25,0,125,3,124,1,160, + 3,100,2,161,1,100,4,25,0,125,4,124,3,100,5,107, + 2,111,62,124,4,100,5,107,3,83,0,41,6,122,141,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,73,110,115,112,101,99, + 116,76,111,97,100,101,114,46,105,115,95,112,97,99,107,97, + 103,101,32,98,121,32,99,104,101,99,107,105,110,103,32,105, + 102,10,32,32,32,32,32,32,32,32,116,104,101,32,112,97, + 116,104,32,114,101,116,117,114,110,101,100,32,98,121,32,103, + 101,116,95,102,105,108,101,110,97,109,101,32,104,97,115,32, + 97,32,102,105,108,101,110,97,109,101,32,111,102,32,39,95, + 95,105,110,105,116,95,95,46,112,121,39,46,114,39,0,0, + 0,114,71,0,0,0,114,73,0,0,0,114,28,0,0,0, + 218,8,95,95,105,110,105,116,95,95,41,4,114,47,0,0, + 0,114,179,0,0,0,114,43,0,0,0,114,41,0,0,0, + 41,5,114,118,0,0,0,114,139,0,0,0,114,96,0,0, + 0,90,13,102,105,108,101,110,97,109,101,95,98,97,115,101, + 90,9,116,97,105,108,95,110,97,109,101,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,114,182,0,0,0,5, + 3,0,0,115,8,0,0,0,0,3,18,1,16,1,14,1, + 122,24,95,76,111,97,100,101,114,66,97,115,105,99,115,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,169,2,122,42, + 85,115,101,32,100,101,102,97,117,108,116,32,115,101,109,97, + 110,116,105,99,115,32,102,111,114,32,109,111,100,117,108,101, + 32,99,114,101,97,116,105,111,110,46,78,114,5,0,0,0, + 169,2,114,118,0,0,0,114,187,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,218,13,99,114,101, + 97,116,101,95,109,111,100,117,108,101,13,3,0,0,115,2, + 0,0,0,0,1,122,27,95,76,111,97,100,101,114,66,97, + 115,105,99,115,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,3, + 0,0,0,5,0,0,0,67,0,0,0,115,56,0,0,0, + 124,0,160,0,124,1,106,1,161,1,125,2,124,2,100,1, + 117,0,114,36,116,2,100,2,160,3,124,1,106,1,161,1, + 131,1,130,1,116,4,160,5,116,6,124,2,124,1,106,7, + 161,3,1,0,100,1,83,0,41,3,122,19,69,120,101,99, + 117,116,101,32,116,104,101,32,109,111,100,117,108,101,46,78, + 122,52,99,97,110,110,111,116,32,108,111,97,100,32,109,111, + 100,117,108,101,32,123,33,114,125,32,119,104,101,110,32,103, + 101,116,95,99,111,100,101,40,41,32,114,101,116,117,114,110, + 115,32,78,111,110,101,41,8,218,8,103,101,116,95,99,111, + 100,101,114,125,0,0,0,114,117,0,0,0,114,62,0,0, + 0,114,134,0,0,0,218,25,95,99,97,108,108,95,119,105, + 116,104,95,102,114,97,109,101,115,95,114,101,109,111,118,101, + 100,218,4,101,120,101,99,114,131,0,0,0,41,3,114,118, + 0,0,0,218,6,109,111,100,117,108,101,114,164,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, + 11,101,120,101,99,95,109,111,100,117,108,101,16,3,0,0, + 115,12,0,0,0,0,2,12,1,8,1,6,1,4,255,6, + 2,122,25,95,76,111,97,100,101,114,66,97,115,105,99,115, + 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,12,0,0,0,116,0,160,1,124,0, + 124,1,161,2,83,0,41,1,122,26,84,104,105,115,32,109, + 111,100,117,108,101,32,105,115,32,100,101,112,114,101,99,97, + 116,101,100,46,41,2,114,134,0,0,0,218,17,95,108,111, + 97,100,95,109,111,100,117,108,101,95,115,104,105,109,169,2, + 114,118,0,0,0,114,139,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,218,11,108,111,97,100,95, + 109,111,100,117,108,101,24,3,0,0,115,2,0,0,0,0, + 2,122,25,95,76,111,97,100,101,114,66,97,115,105,99,115, + 46,108,111,97,100,95,109,111,100,117,108,101,78,41,8,114, + 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127, + 0,0,0,114,182,0,0,0,114,212,0,0,0,114,217,0, + 0,0,114,220,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,114,208,0,0,0, + 0,3,0,0,115,10,0,0,0,8,2,4,3,8,8,8, + 3,8,8,114,208,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,74,0,0,0,101,0,90,1,100,0,90,2,100,1, + 100,2,132,0,90,3,100,3,100,4,132,0,90,4,100,5, + 100,6,132,0,90,5,100,7,100,8,132,0,90,6,100,9, + 100,10,132,0,90,7,100,11,100,12,156,1,100,13,100,14, + 132,2,90,8,100,15,100,16,132,0,90,9,100,17,83,0, + 41,18,218,12,83,111,117,114,99,101,76,111,97,100,101,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,8,0,0,0,116,0, + 130,1,100,1,83,0,41,2,122,165,79,112,116,105,111,110, + 97,108,32,109,101,116,104,111,100,32,116,104,97,116,32,114, + 101,116,117,114,110,115,32,116,104,101,32,109,111,100,105,102, + 105,99,97,116,105,111,110,32,116,105,109,101,32,40,97,110, + 32,105,110,116,41,32,102,111,114,32,116,104,101,10,32,32, + 32,32,32,32,32,32,115,112,101,99,105,102,105,101,100,32, + 112,97,116,104,32,40,97,32,115,116,114,41,46,10,10,32, + 32,32,32,32,32,32,32,82,97,105,115,101,115,32,79,83, + 69,114,114,111,114,32,119,104,101,110,32,116,104,101,32,112, + 97,116,104,32,99,97,110,110,111,116,32,98,101,32,104,97, + 110,100,108,101,100,46,10,32,32,32,32,32,32,32,32,78, + 41,1,114,50,0,0,0,169,2,114,118,0,0,0,114,44, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,218,10,112,97,116,104,95,109,116,105,109,101,31,3, + 0,0,115,2,0,0,0,0,6,122,23,83,111,117,114,99, + 101,76,111,97,100,101,114,46,112,97,116,104,95,109,116,105, + 109,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,14,0,0,0, + 100,1,124,0,160,0,124,1,161,1,105,1,83,0,41,2, + 97,158,1,0,0,79,112,116,105,111,110,97,108,32,109,101, + 116,104,111,100,32,114,101,116,117,114,110,105,110,103,32,97, + 32,109,101,116,97,100,97,116,97,32,100,105,99,116,32,102, + 111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100, + 10,32,32,32,32,32,32,32,32,112,97,116,104,32,40,97, + 32,115,116,114,41,46,10,10,32,32,32,32,32,32,32,32, + 80,111,115,115,105,98,108,101,32,107,101,121,115,58,10,32, + 32,32,32,32,32,32,32,45,32,39,109,116,105,109,101,39, + 32,40,109,97,110,100,97,116,111,114,121,41,32,105,115,32, + 116,104,101,32,110,117,109,101,114,105,99,32,116,105,109,101, + 115,116,97,109,112,32,111,102,32,108,97,115,116,32,115,111, + 117,114,99,101,10,32,32,32,32,32,32,32,32,32,32,99, + 111,100,101,32,109,111,100,105,102,105,99,97,116,105,111,110, + 59,10,32,32,32,32,32,32,32,32,45,32,39,115,105,122, + 101,39,32,40,111,112,116,105,111,110,97,108,41,32,105,115, + 32,116,104,101,32,115,105,122,101,32,105,110,32,98,121,116, + 101,115,32,111,102,32,116,104,101,32,115,111,117,114,99,101, + 32,99,111,100,101,46,10,10,32,32,32,32,32,32,32,32, + 73,109,112,108,101,109,101,110,116,105,110,103,32,116,104,105, + 115,32,109,101,116,104,111,100,32,97,108,108,111,119,115,32, + 116,104,101,32,108,111,97,100,101,114,32,116,111,32,114,101, + 97,100,32,98,121,116,101,99,111,100,101,32,102,105,108,101, + 115,46,10,32,32,32,32,32,32,32,32,82,97,105,115,101, + 115,32,79,83,69,114,114,111,114,32,119,104,101,110,32,116, + 104,101,32,112,97,116,104,32,99,97,110,110,111,116,32,98, + 101,32,104,97,110,100,108,101,100,46,10,32,32,32,32,32, + 32,32,32,114,169,0,0,0,41,1,114,223,0,0,0,114, + 222,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,10,112,97,116,104,95,115,116,97,116,115,39, + 3,0,0,115,2,0,0,0,0,12,122,23,83,111,117,114, + 99,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, + 4,0,0,0,4,0,0,0,67,0,0,0,115,12,0,0, + 0,124,0,160,0,124,2,124,3,161,2,83,0,41,1,122, + 228,79,112,116,105,111,110,97,108,32,109,101,116,104,111,100, + 32,119,104,105,99,104,32,119,114,105,116,101,115,32,100,97, + 116,97,32,40,98,121,116,101,115,41,32,116,111,32,97,32, + 102,105,108,101,32,112,97,116,104,32,40,97,32,115,116,114, + 41,46,10,10,32,32,32,32,32,32,32,32,73,109,112,108, + 101,109,101,110,116,105,110,103,32,116,104,105,115,32,109,101, + 116,104,111,100,32,97,108,108,111,119,115,32,102,111,114,32, + 116,104,101,32,119,114,105,116,105,110,103,32,111,102,32,98, + 121,116,101,99,111,100,101,32,102,105,108,101,115,46,10,10, + 32,32,32,32,32,32,32,32,84,104,101,32,115,111,117,114, + 99,101,32,112,97,116,104,32,105,115,32,110,101,101,100,101, + 100,32,105,110,32,111,114,100,101,114,32,116,111,32,99,111, + 114,114,101,99,116,108,121,32,116,114,97,110,115,102,101,114, + 32,112,101,114,109,105,115,115,105,111,110,115,10,32,32,32, + 32,32,32,32,32,41,1,218,8,115,101,116,95,100,97,116, + 97,41,4,114,118,0,0,0,114,107,0,0,0,90,10,99, + 97,99,104,101,95,112,97,116,104,114,26,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,218,15,95, + 99,97,99,104,101,95,98,121,116,101,99,111,100,101,53,3, + 0,0,115,2,0,0,0,0,8,122,28,83,111,117,114,99, + 101,76,111,97,100,101,114,46,95,99,97,99,104,101,95,98, + 121,116,101,99,111,100,101,99,3,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,1,0,0,0,67,0,0,0, + 115,4,0,0,0,100,1,83,0,41,2,122,150,79,112,116, + 105,111,110,97,108,32,109,101,116,104,111,100,32,119,104,105, + 99,104,32,119,114,105,116,101,115,32,100,97,116,97,32,40, + 98,121,116,101,115,41,32,116,111,32,97,32,102,105,108,101, + 32,112,97,116,104,32,40,97,32,115,116,114,41,46,10,10, + 32,32,32,32,32,32,32,32,73,109,112,108,101,109,101,110, + 116,105,110,103,32,116,104,105,115,32,109,101,116,104,111,100, + 32,97,108,108,111,119,115,32,102,111,114,32,116,104,101,32, + 119,114,105,116,105,110,103,32,111,102,32,98,121,116,101,99, + 111,100,101,32,102,105,108,101,115,46,10,32,32,32,32,32, + 32,32,32,78,114,5,0,0,0,41,3,114,118,0,0,0, + 114,44,0,0,0,114,26,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,114,225,0,0,0,63,3, + 0,0,115,2,0,0,0,0,1,122,21,83,111,117,114,99, + 101,76,111,97,100,101,114,46,115,101,116,95,100,97,116,97, + 99,2,0,0,0,0,0,0,0,0,0,0,0,5,0,0, + 0,10,0,0,0,67,0,0,0,115,84,0,0,0,124,0, + 160,0,124,1,161,1,125,2,122,14,124,0,160,1,124,2, + 161,1,125,3,87,0,110,50,4,0,116,2,121,74,1,0, + 125,4,1,0,122,26,116,3,100,1,124,1,100,2,141,2, + 124,4,130,2,87,0,89,0,100,3,125,4,126,4,110,10, + 100,3,125,4,126,4,48,0,48,0,116,4,124,3,131,1, + 83,0,41,4,122,52,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,73,110,115,112,101,99,116,76,111,97,100,101,114,46,103, + 101,116,95,115,111,117,114,99,101,46,122,39,115,111,117,114, + 99,101,32,110,111,116,32,97,118,97,105,108,97,98,108,101, + 32,116,104,114,111,117,103,104,32,103,101,116,95,100,97,116, + 97,40,41,114,115,0,0,0,78,41,5,114,179,0,0,0, + 218,8,103,101,116,95,100,97,116,97,114,50,0,0,0,114, + 117,0,0,0,114,176,0,0,0,41,5,114,118,0,0,0, + 114,139,0,0,0,114,44,0,0,0,114,174,0,0,0,218, + 3,101,120,99,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,218,10,103,101,116,95,115,111,117,114,99,101,70, + 3,0,0,115,20,0,0,0,0,2,10,1,2,1,14,1, + 14,1,4,1,2,255,4,1,2,255,24,2,122,23,83,111, + 117,114,99,101,76,111,97,100,101,114,46,103,101,116,95,115, + 111,117,114,99,101,114,104,0,0,0,41,1,218,9,95,111, + 112,116,105,109,105,122,101,99,3,0,0,0,0,0,0,0, + 1,0,0,0,4,0,0,0,8,0,0,0,67,0,0,0, + 115,22,0,0,0,116,0,106,1,116,2,124,1,124,2,100, + 1,100,2,124,3,100,3,141,6,83,0,41,4,122,130,82, + 101,116,117,114,110,32,116,104,101,32,99,111,100,101,32,111, + 98,106,101,99,116,32,99,111,109,112,105,108,101,100,32,102, + 114,111,109,32,115,111,117,114,99,101,46,10,10,32,32,32, + 32,32,32,32,32,84,104,101,32,39,100,97,116,97,39,32, + 97,114,103,117,109,101,110,116,32,99,97,110,32,98,101,32, + 97,110,121,32,111,98,106,101,99,116,32,116,121,112,101,32, + 116,104,97,116,32,99,111,109,112,105,108,101,40,41,32,115, + 117,112,112,111,114,116,115,46,10,32,32,32,32,32,32,32, + 32,114,215,0,0,0,84,41,2,218,12,100,111,110,116,95, + 105,110,104,101,114,105,116,114,83,0,0,0,41,3,114,134, + 0,0,0,114,214,0,0,0,218,7,99,111,109,112,105,108, + 101,41,4,114,118,0,0,0,114,26,0,0,0,114,44,0, + 0,0,114,230,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,218,14,115,111,117,114,99,101,95,116, + 111,95,99,111,100,101,80,3,0,0,115,6,0,0,0,0, + 5,12,1,4,255,122,27,83,111,117,114,99,101,76,111,97, + 100,101,114,46,115,111,117,114,99,101,95,116,111,95,99,111, + 100,101,99,2,0,0,0,0,0,0,0,0,0,0,0,15, + 0,0,0,9,0,0,0,67,0,0,0,115,24,2,0,0, + 124,0,160,0,124,1,161,1,125,2,100,1,125,3,100,1, + 125,4,100,1,125,5,100,2,125,6,100,3,125,7,122,12, + 116,1,124,2,131,1,125,8,87,0,110,24,4,0,116,2, + 121,66,1,0,1,0,1,0,100,1,125,8,89,0,144,1, + 110,42,48,0,122,14,124,0,160,3,124,2,161,1,125,9, + 87,0,110,20,4,0,116,4,121,102,1,0,1,0,1,0, + 89,0,144,1,110,6,48,0,116,5,124,9,100,4,25,0, + 131,1,125,3,122,14,124,0,160,6,124,8,161,1,125,10, + 87,0,110,18,4,0,116,4,121,148,1,0,1,0,1,0, + 89,0,110,216,48,0,124,1,124,8,100,5,156,2,125,11, + 122,148,116,7,124,10,124,1,124,11,131,3,125,12,116,8, + 124,10,131,1,100,6,100,1,133,2,25,0,125,13,124,12, + 100,7,64,0,100,8,107,3,125,6,124,6,144,1,114,30, + 124,12,100,9,64,0,100,8,107,3,125,7,116,9,106,10, + 100,10,107,3,144,1,114,50,124,7,115,248,116,9,106,10, + 100,11,107,2,144,1,114,50,124,0,160,6,124,2,161,1, + 125,4,116,9,160,11,116,12,124,4,161,2,125,5,116,13, + 124,10,124,5,124,1,124,11,131,4,1,0,110,20,116,14, + 124,10,124,3,124,9,100,12,25,0,124,1,124,11,131,5, + 1,0,87,0,110,24,4,0,116,15,116,16,102,2,144,1, + 121,76,1,0,1,0,1,0,89,0,110,32,48,0,116,17, + 160,18,100,13,124,8,124,2,161,3,1,0,116,19,124,13, + 124,1,124,8,124,2,100,14,141,4,83,0,124,4,100,1, + 117,0,144,1,114,128,124,0,160,6,124,2,161,1,125,4, + 124,0,160,20,124,4,124,2,161,2,125,14,116,17,160,18, + 100,15,124,2,161,2,1,0,116,21,106,22,144,2,115,20, + 124,8,100,1,117,1,144,2,114,20,124,3,100,1,117,1, + 144,2,114,20,124,6,144,1,114,220,124,5,100,1,117,0, + 144,1,114,206,116,9,160,11,124,4,161,1,125,5,116,23, + 124,14,124,5,124,7,131,3,125,10,110,16,116,24,124,14, + 124,3,116,25,124,4,131,1,131,3,125,10,122,18,124,0, + 160,26,124,2,124,8,124,10,161,3,1,0,87,0,110,20, + 4,0,116,2,144,2,121,18,1,0,1,0,1,0,89,0, + 110,2,48,0,124,14,83,0,41,16,122,190,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,73,110,115,112,101,99,116,76,111, + 97,100,101,114,46,103,101,116,95,99,111,100,101,46,10,10, + 32,32,32,32,32,32,32,32,82,101,97,100,105,110,103,32, + 111,102,32,98,121,116,101,99,111,100,101,32,114,101,113,117, + 105,114,101,115,32,112,97,116,104,95,115,116,97,116,115,32, + 116,111,32,98,101,32,105,109,112,108,101,109,101,110,116,101, + 100,46,32,84,111,32,119,114,105,116,101,10,32,32,32,32, + 32,32,32,32,98,121,116,101,99,111,100,101,44,32,115,101, + 116,95,100,97,116,97,32,109,117,115,116,32,97,108,115,111, + 32,98,101,32,105,109,112,108,101,109,101,110,116,101,100,46, + 10,10,32,32,32,32,32,32,32,32,78,70,84,114,169,0, + 0,0,114,159,0,0,0,114,145,0,0,0,114,39,0,0, + 0,114,73,0,0,0,114,28,0,0,0,90,5,110,101,118, + 101,114,90,6,97,108,119,97,121,115,218,4,115,105,122,101, + 122,13,123,125,32,109,97,116,99,104,101,115,32,123,125,41, + 3,114,116,0,0,0,114,106,0,0,0,114,107,0,0,0, + 122,19,99,111,100,101,32,111,98,106,101,99,116,32,102,114, + 111,109,32,123,125,41,27,114,179,0,0,0,114,97,0,0, + 0,114,82,0,0,0,114,224,0,0,0,114,50,0,0,0, + 114,18,0,0,0,114,227,0,0,0,114,152,0,0,0,218, + 10,109,101,109,111,114,121,118,105,101,119,114,163,0,0,0, + 90,21,99,104,101,99,107,95,104,97,115,104,95,98,97,115, + 101,100,95,112,121,99,115,114,157,0,0,0,218,17,95,82, + 65,87,95,77,65,71,73,67,95,78,85,77,66,69,82,114, + 158,0,0,0,114,156,0,0,0,114,117,0,0,0,114,150, + 0,0,0,114,134,0,0,0,114,149,0,0,0,114,165,0, + 0,0,114,233,0,0,0,114,1,0,0,0,218,19,100,111, + 110,116,95,119,114,105,116,101,95,98,121,116,101,99,111,100, + 101,114,171,0,0,0,114,170,0,0,0,114,23,0,0,0, + 114,226,0,0,0,41,15,114,118,0,0,0,114,139,0,0, + 0,114,107,0,0,0,114,154,0,0,0,114,174,0,0,0, + 114,157,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,114, + 106,0,0,0,218,2,115,116,114,26,0,0,0,114,151,0, + 0,0,114,2,0,0,0,90,10,98,121,116,101,115,95,100, + 97,116,97,90,11,99,111,100,101,95,111,98,106,101,99,116, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, + 213,0,0,0,88,3,0,0,115,152,0,0,0,0,7,10, + 1,4,1,4,1,4,1,4,1,4,1,2,1,12,1,12, + 1,12,2,2,1,14,1,12,1,8,2,12,1,2,1,14, + 1,12,1,6,3,2,1,2,254,6,4,2,1,12,1,16, + 1,12,1,6,1,12,1,12,1,2,255,2,2,8,254,4, + 3,10,1,4,1,2,1,2,254,4,4,8,1,2,255,6, + 3,2,1,2,1,2,1,6,1,2,1,2,251,8,7,18, + 1,6,2,8,1,2,255,4,2,6,1,2,1,2,254,6, + 3,10,1,10,1,12,1,12,1,18,1,6,255,4,2,6, + 1,10,1,10,1,14,2,6,1,6,255,4,2,2,1,18, + 1,14,1,6,1,122,21,83,111,117,114,99,101,76,111,97, + 100,101,114,46,103,101,116,95,99,111,100,101,78,41,10,114, + 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,223, + 0,0,0,114,224,0,0,0,114,226,0,0,0,114,225,0, + 0,0,114,229,0,0,0,114,233,0,0,0,114,213,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,221,0,0,0,29,3,0,0,115,14, + 0,0,0,8,2,8,8,8,14,8,10,8,7,8,10,14, + 8,114,221,0,0,0,99,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,115, + 124,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,101,7,135,0,102,1,100,8, + 100,9,132,8,131,1,90,8,101,7,100,10,100,11,132,0, + 131,1,90,9,100,12,100,13,132,0,90,10,101,7,100,14, + 100,15,132,0,131,1,90,11,100,16,100,17,132,0,90,12, + 100,18,100,19,132,0,90,13,100,20,100,21,132,0,90,14, + 100,22,100,23,132,0,90,15,135,0,4,0,90,16,83,0, + 41,24,218,10,70,105,108,101,76,111,97,100,101,114,122,103, + 66,97,115,101,32,102,105,108,101,32,108,111,97,100,101,114, + 32,99,108,97,115,115,32,119,104,105,99,104,32,105,109,112, + 108,101,109,101,110,116,115,32,116,104,101,32,108,111,97,100, + 101,114,32,112,114,111,116,111,99,111,108,32,109,101,116,104, + 111,100,115,32,116,104,97,116,10,32,32,32,32,114,101,113, + 117,105,114,101,32,102,105,108,101,32,115,121,115,116,101,109, + 32,117,115,97,103,101,46,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,1,83,0,41,2,122,75,67,97,99,104,101,32,116, + 104,101,32,109,111,100,117,108,101,32,110,97,109,101,32,97, + 110,100,32,116,104,101,32,112,97,116,104,32,116,111,32,116, + 104,101,32,102,105,108,101,32,102,111,117,110,100,32,98,121, + 32,116,104,101,10,32,32,32,32,32,32,32,32,102,105,110, + 100,101,114,46,78,114,159,0,0,0,41,3,114,118,0,0, + 0,114,139,0,0,0,114,44,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,114,209,0,0,0,178, + 3,0,0,115,4,0,0,0,0,3,6,1,122,19,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,109,0,0,0,169,2,218,9, + 95,95,99,108,97,115,115,95,95,114,131,0,0,0,169,2, + 114,118,0,0,0,90,5,111,116,104,101,114,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,218,6,95,95,101, + 113,95,95,184,3,0,0,115,6,0,0,0,0,1,12,1, + 10,255,122,17,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,109,0,0,0,169,3,218,4, + 104,97,115,104,114,116,0,0,0,114,44,0,0,0,169,1, + 114,118,0,0,0,114,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,218,8,95,95,104,97,115,104,95,95,188,3, + 0,0,115,2,0,0,0,0,1,122,19,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,2,0,0,0,3, + 0,0,0,3,0,0,0,115,16,0,0,0,116,0,116,1, + 124,0,131,2,160,2,124,1,161,1,83,0,41,1,122,100, + 76,111,97,100,32,97,32,109,111,100,117,108,101,32,102,114, + 111,109,32,97,32,102,105,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,41,3,218,5,115,117,112,101,114,114,239,0, + 0,0,114,220,0,0,0,114,219,0,0,0,169,1,114,241, + 0,0,0,114,5,0,0,0,114,8,0,0,0,114,220,0, + 0,0,191,3,0,0,115,2,0,0,0,0,10,122,22,70, + 105,108,101,76,111,97,100,101,114,46,108,111,97,100,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,6, + 0,0,0,124,0,106,0,83,0,169,1,122,58,82,101,116, + 117,114,110,32,116,104,101,32,112,97,116,104,32,116,111,32, + 116,104,101,32,115,111,117,114,99,101,32,102,105,108,101,32, + 97,115,32,102,111,117,110,100,32,98,121,32,116,104,101,32, + 102,105,110,100,101,114,46,114,48,0,0,0,114,219,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 114,179,0,0,0,203,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,8,0,0,0,67,0, + 0,0,115,126,0,0,0,116,0,124,0,116,1,116,2,102, + 2,131,2,114,70,116,3,160,4,116,5,124,1,131,1,161, + 1,143,24,125,2,124,2,160,6,161,0,87,0,2,0,100, + 1,4,0,4,0,131,3,1,0,83,0,49,0,115,58,48, + 0,1,0,1,0,1,0,89,0,1,0,110,52,116,3,160, + 7,124,1,100,2,161,2,143,24,125,2,124,2,160,6,161, + 0,87,0,2,0,100,1,4,0,4,0,131,3,1,0,83, + 0,49,0,115,112,48,0,1,0,1,0,1,0,89,0,1, + 0,100,1,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, + 78,218,1,114,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,84,0,0,0,90,4,114,101,97,100, + 114,65,0,0,0,41,3,114,118,0,0,0,114,44,0,0, + 0,114,68,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,227,0,0,0,208,3,0,0,115,10, + 0,0,0,0,2,14,1,16,1,40,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,109,0,0,0,41,1,114,182,0,0,0,169,2, + 114,118,0,0,0,114,216,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,218,19,103,101,116,95,114, + 101,115,111,117,114,99,101,95,114,101,97,100,101,114,219,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,118,0,0,0,90,8,114,101,115,111, + 117,114,99,101,114,44,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,0,0,0,218,13,111,112,101,110,95,114, + 101,115,111,117,114,99,101,225,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,255,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, + 13,114,101,115,111,117,114,99,101,95,112,97,116,104,229,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,118,0,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,118,0,0,0,114,116,0,0,0,114, + 44,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,114,2,1,0,0,235,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,4,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,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 218,8,99,111,110,116,101,110,116,115,241,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,5,0,0,0, + 114,5,0,0,0,114,249,0,0,0,114,8,0,0,0,114, + 239,0,0,0,173,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,118,0,0,0,114,44,0,0,0,114,238,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, + 224,0,0,0,249,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,114,0,0,0,114,225,0,0,0,41,5,114,118, + 0,0,0,114,107,0,0,0,114,106,0,0,0,114,26,0, + 0,0,114,52,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,114,226,0,0,0,254,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,252,0, + 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,104, + 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,113,60,4,0,116,7, + 121,110,1,0,1,0,1,0,89,0,113,60,89,0,113,60, + 4,0,116,8,121,162,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, + 100,2,125,8,126,8,1,0,100,2,83,0,100,2,125,8, + 126,8,48,0,48,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,52,4,0,116,8,144,0,121,246,1,0, + 125,8,1,0,122,26,116,9,160,10,100,1,124,1,124,8, + 161,3,1,0,87,0,89,0,100,2,125,8,126,8,110,10, + 100,2,125,8,126,8,48,0,48,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,4,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,118,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,96,0,0,0,114,37,0,0,0,114,33,0, + 0,0,114,228,0,0,0,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,114,225,0,0,0,3,4,0,0,115, + 46,0,0,0,0,2,12,1,4,2,12,1,12,1,12,2, + 12,1,10,1,2,1,14,1,12,2,8,1,14,3,6,1, + 4,255,4,2,28,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,5,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,114,9,1,0,0,245,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,116,0,0,0,114,106,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, + 118,0,0,0,114,139,0,0,0,114,44,0,0,0,114,26, + 0,0,0,114,151,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,114,213,0,0,0,38,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,5,0,0,0,114,219,0, + 0,0,114,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,114,229,0,0,0,54,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,5,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,114,15,1,0,0,34,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,2,0,0,0,64,0,0,0,115,48,0,0,0,101,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,83,0,41,11, - 218,13,95,76,111,97,100,101,114,66,97,115,105,99,115,122, - 83,66,97,115,101,32,99,108,97,115,115,32,111,102,32,99, - 111,109,109,111,110,32,99,111,100,101,32,110,101,101,100,101, - 100,32,98,121,32,98,111,116,104,32,83,111,117,114,99,101, - 76,111,97,100,101,114,32,97,110,100,10,32,32,32,32,83, - 111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,97, - 100,101,114,46,99,2,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,4,0,0,0,67,0,0,0,115,64,0, - 0,0,116,0,124,0,160,1,124,1,161,1,131,1,100,1, - 25,0,125,2,124,2,160,2,100,2,100,1,161,2,100,3, - 25,0,125,3,124,1,160,3,100,2,161,1,100,4,25,0, - 125,4,124,3,100,5,107,2,111,62,124,4,100,5,107,3, - 83,0,41,6,122,141,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,73,110,115,112,101,99,116,76,111,97,100,101,114,46,105, - 115,95,112,97,99,107,97,103,101,32,98,121,32,99,104,101, - 99,107,105,110,103,32,105,102,10,32,32,32,32,32,32,32, - 32,116,104,101,32,112,97,116,104,32,114,101,116,117,114,110, - 101,100,32,98,121,32,103,101,116,95,102,105,108,101,110,97, - 109,101,32,104,97,115,32,97,32,102,105,108,101,110,97,109, - 101,32,111,102,32,39,95,95,105,110,105,116,95,95,46,112, - 121,39,46,114,39,0,0,0,114,71,0,0,0,114,73,0, - 0,0,114,28,0,0,0,218,8,95,95,105,110,105,116,95, - 95,41,4,114,47,0,0,0,114,180,0,0,0,114,43,0, - 0,0,114,41,0,0,0,41,5,114,119,0,0,0,114,140, - 0,0,0,114,97,0,0,0,90,13,102,105,108,101,110,97, - 109,101,95,98,97,115,101,90,9,116,97,105,108,95,110,97, - 109,101,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,183,0,0,0,254,2,0,0,115,8,0,0,0,0, - 3,18,1,16,1,14,1,122,24,95,76,111,97,100,101,114, - 66,97,115,105,99,115,46,105,115,95,112,97,99,107,97,103, + 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,109, + 0,0,0,114,159,0,0,0,114,5,1,0,0,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,114,209,0,0, + 0,71,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,109,0,0,0,114,240,0,0,0,114,242,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 114,243,0,0,0,75,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,109,0,0,0,114,244,0,0,0,114,246,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 114,247,0,0,0,79,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,116,0,0,0,114,44,0, + 0,0,41,3,114,118,0,0,0,114,187,0,0,0,114,216, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,114,212,0,0,0,82,4,0,0,115,14,0,0,0, + 0,2,4,1,6,255,4,2,6,1,8,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,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,169,2,122,42,85,115,101,32,100,101,102,97,117, - 108,116,32,115,101,109,97,110,116,105,99,115,32,102,111,114, - 32,109,111,100,117,108,101,32,99,114,101,97,116,105,111,110, - 46,78,114,3,0,0,0,169,2,114,119,0,0,0,114,188, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,13,99,114,101,97,116,101,95,109,111,100,117,108, - 101,6,3,0,0,115,2,0,0,0,0,1,122,27,95,76, - 111,97,100,101,114,66,97,115,105,99,115,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,3,0,0,0,5,0,0,0,67,0, - 0,0,115,56,0,0,0,124,0,160,0,124,1,106,1,161, - 1,125,2,124,2,100,1,107,8,114,36,116,2,100,2,160, - 3,124,1,106,1,161,1,131,1,130,1,116,4,160,5,116, - 6,124,2,124,1,106,7,161,3,1,0,100,1,83,0,41, - 3,122,19,69,120,101,99,117,116,101,32,116,104,101,32,109, - 111,100,117,108,101,46,78,122,52,99,97,110,110,111,116,32, - 108,111,97,100,32,109,111,100,117,108,101,32,123,33,114,125, - 32,119,104,101,110,32,103,101,116,95,99,111,100,101,40,41, - 32,114,101,116,117,114,110,115,32,78,111,110,101,41,8,218, - 8,103,101,116,95,99,111,100,101,114,126,0,0,0,114,118, - 0,0,0,114,62,0,0,0,114,135,0,0,0,218,25,95, - 99,97,108,108,95,119,105,116,104,95,102,114,97,109,101,115, - 95,114,101,109,111,118,101,100,218,4,101,120,101,99,114,132, - 0,0,0,41,3,114,119,0,0,0,218,6,109,111,100,117, - 108,101,114,165,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,11,101,120,101,99,95,109,111,100, - 117,108,101,9,3,0,0,115,12,0,0,0,0,2,12,1, - 8,1,6,1,4,255,6,2,122,25,95,76,111,97,100,101, - 114,66,97,115,105,99,115,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,12,0,0, - 0,116,0,160,1,124,0,124,1,161,2,83,0,41,1,122, - 26,84,104,105,115,32,109,111,100,117,108,101,32,105,115,32, - 100,101,112,114,101,99,97,116,101,100,46,41,2,114,135,0, - 0,0,218,17,95,108,111,97,100,95,109,111,100,117,108,101, - 95,115,104,105,109,169,2,114,119,0,0,0,114,140,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,11,108,111,97,100,95,109,111,100,117,108,101,17,3,0, - 0,115,2,0,0,0,0,2,122,25,95,76,111,97,100,101, - 114,66,97,115,105,99,115,46,108,111,97,100,95,109,111,100, - 117,108,101,78,41,8,114,126,0,0,0,114,125,0,0,0, - 114,127,0,0,0,114,128,0,0,0,114,183,0,0,0,114, - 213,0,0,0,114,218,0,0,0,114,221,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,209,0,0,0,249,2,0,0,115,10,0,0,0, - 8,2,4,3,8,8,8,3,8,8,114,209,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,74,0,0,0,101,0,90, - 1,100,0,90,2,100,1,100,2,132,0,90,3,100,3,100, - 4,132,0,90,4,100,5,100,6,132,0,90,5,100,7,100, - 8,132,0,90,6,100,9,100,10,132,0,90,7,100,11,100, - 12,156,1,100,13,100,14,132,2,90,8,100,15,100,16,132, - 0,90,9,100,17,83,0,41,18,218,12,83,111,117,114,99, - 101,76,111,97,100,101,114,99,2,0,0,0,0,0,0,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,116,0,0,0,114,44,0,0,0,114,253, + 0,0,0,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,114,217,0,0,0,90,4,0,0,115,8,0,0,0, + 0,2,14,1,6,1,8,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,5,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,5,0,0,0,114,8,0,0,0, + 218,9,60,103,101,110,101,120,112,114,62,99,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,5,0,0,0,114,18,1,0,0,114, + 8,0,0,0,114,182,0,0,0,96,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,5,0,0,0,114,219,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,114,213,0,0,0,102,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,8,0,0,0,116,0,130,1,100,1,83,0,41,2,122, - 165,79,112,116,105,111,110,97,108,32,109,101,116,104,111,100, - 32,116,104,97,116,32,114,101,116,117,114,110,115,32,116,104, - 101,32,109,111,100,105,102,105,99,97,116,105,111,110,32,116, - 105,109,101,32,40,97,110,32,105,110,116,41,32,102,111,114, - 32,116,104,101,10,32,32,32,32,32,32,32,32,115,112,101, - 99,105,102,105,101,100,32,112,97,116,104,32,40,97,32,115, - 116,114,41,46,10,10,32,32,32,32,32,32,32,32,82,97, - 105,115,101,115,32,79,83,69,114,114,111,114,32,119,104,101, - 110,32,116,104,101,32,112,97,116,104,32,99,97,110,110,111, - 116,32,98,101,32,104,97,110,100,108,101,100,46,10,32,32, - 32,32,32,32,32,32,78,41,1,114,50,0,0,0,169,2, - 114,119,0,0,0,114,44,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,10,112,97,116,104,95, - 109,116,105,109,101,24,3,0,0,115,2,0,0,0,0,6, - 122,23,83,111,117,114,99,101,76,111,97,100,101,114,46,112, - 97,116,104,95,109,116,105,109,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,14,0,0,0,100,1,124,0,160,0,124,1,161, - 1,105,1,83,0,41,2,97,158,1,0,0,79,112,116,105, - 111,110,97,108,32,109,101,116,104,111,100,32,114,101,116,117, - 114,110,105,110,103,32,97,32,109,101,116,97,100,97,116,97, - 32,100,105,99,116,32,102,111,114,32,116,104,101,32,115,112, - 101,99,105,102,105,101,100,10,32,32,32,32,32,32,32,32, - 112,97,116,104,32,40,97,32,115,116,114,41,46,10,10,32, - 32,32,32,32,32,32,32,80,111,115,115,105,98,108,101,32, - 107,101,121,115,58,10,32,32,32,32,32,32,32,32,45,32, - 39,109,116,105,109,101,39,32,40,109,97,110,100,97,116,111, - 114,121,41,32,105,115,32,116,104,101,32,110,117,109,101,114, - 105,99,32,116,105,109,101,115,116,97,109,112,32,111,102,32, - 108,97,115,116,32,115,111,117,114,99,101,10,32,32,32,32, - 32,32,32,32,32,32,99,111,100,101,32,109,111,100,105,102, - 105,99,97,116,105,111,110,59,10,32,32,32,32,32,32,32, - 32,45,32,39,115,105,122,101,39,32,40,111,112,116,105,111, - 110,97,108,41,32,105,115,32,116,104,101,32,115,105,122,101, - 32,105,110,32,98,121,116,101,115,32,111,102,32,116,104,101, - 32,115,111,117,114,99,101,32,99,111,100,101,46,10,10,32, - 32,32,32,32,32,32,32,73,109,112,108,101,109,101,110,116, - 105,110,103,32,116,104,105,115,32,109,101,116,104,111,100,32, - 97,108,108,111,119,115,32,116,104,101,32,108,111,97,100,101, - 114,32,116,111,32,114,101,97,100,32,98,121,116,101,99,111, - 100,101,32,102,105,108,101,115,46,10,32,32,32,32,32,32, - 32,32,82,97,105,115,101,115,32,79,83,69,114,114,111,114, - 32,119,104,101,110,32,116,104,101,32,112,97,116,104,32,99, - 97,110,110,111,116,32,98,101,32,104,97,110,100,108,101,100, - 46,10,32,32,32,32,32,32,32,32,114,170,0,0,0,41, - 1,114,224,0,0,0,114,223,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,10,112,97,116,104, - 95,115,116,97,116,115,32,3,0,0,115,2,0,0,0,0, - 12,122,23,83,111,117,114,99,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,4,0,0,0,4,0,0,0,67, - 0,0,0,115,12,0,0,0,124,0,160,0,124,2,124,3, - 161,2,83,0,41,1,122,228,79,112,116,105,111,110,97,108, - 32,109,101,116,104,111,100,32,119,104,105,99,104,32,119,114, - 105,116,101,115,32,100,97,116,97,32,40,98,121,116,101,115, - 41,32,116,111,32,97,32,102,105,108,101,32,112,97,116,104, - 32,40,97,32,115,116,114,41,46,10,10,32,32,32,32,32, - 32,32,32,73,109,112,108,101,109,101,110,116,105,110,103,32, - 116,104,105,115,32,109,101,116,104,111,100,32,97,108,108,111, - 119,115,32,102,111,114,32,116,104,101,32,119,114,105,116,105, - 110,103,32,111,102,32,98,121,116,101,99,111,100,101,32,102, - 105,108,101,115,46,10,10,32,32,32,32,32,32,32,32,84, - 104,101,32,115,111,117,114,99,101,32,112,97,116,104,32,105, - 115,32,110,101,101,100,101,100,32,105,110,32,111,114,100,101, - 114,32,116,111,32,99,111,114,114,101,99,116,108,121,32,116, - 114,97,110,115,102,101,114,32,112,101,114,109,105,115,115,105, - 111,110,115,10,32,32,32,32,32,32,32,32,41,1,218,8, - 115,101,116,95,100,97,116,97,41,4,114,119,0,0,0,114, - 108,0,0,0,90,10,99,97,99,104,101,95,112,97,116,104, - 114,26,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,15,95,99,97,99,104,101,95,98,121,116, - 101,99,111,100,101,46,3,0,0,115,2,0,0,0,0,8, - 122,28,83,111,117,114,99,101,76,111,97,100,101,114,46,95, - 99,97,99,104,101,95,98,121,116,101,99,111,100,101,99,3, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,1, - 0,0,0,67,0,0,0,115,4,0,0,0,100,1,83,0, - 41,2,122,150,79,112,116,105,111,110,97,108,32,109,101,116, - 104,111,100,32,119,104,105,99,104,32,119,114,105,116,101,115, - 32,100,97,116,97,32,40,98,121,116,101,115,41,32,116,111, - 32,97,32,102,105,108,101,32,112,97,116,104,32,40,97,32, - 115,116,114,41,46,10,10,32,32,32,32,32,32,32,32,73, - 109,112,108,101,109,101,110,116,105,110,103,32,116,104,105,115, - 32,109,101,116,104,111,100,32,97,108,108,111,119,115,32,102, - 111,114,32,116,104,101,32,119,114,105,116,105,110,103,32,111, - 102,32,98,121,116,101,99,111,100,101,32,102,105,108,101,115, - 46,10,32,32,32,32,32,32,32,32,78,114,3,0,0,0, - 41,3,114,119,0,0,0,114,44,0,0,0,114,26,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,226,0,0,0,56,3,0,0,115,2,0,0,0,0,1, - 122,21,83,111,117,114,99,101,76,111,97,100,101,114,46,115, - 101,116,95,100,97,116,97,99,2,0,0,0,0,0,0,0, - 0,0,0,0,5,0,0,0,10,0,0,0,67,0,0,0, - 115,82,0,0,0,124,0,160,0,124,1,161,1,125,2,122, - 14,124,0,160,1,124,2,161,1,125,3,87,0,110,48,4, - 0,116,2,107,10,114,72,1,0,125,4,1,0,122,18,116, - 3,100,1,124,1,100,2,141,2,124,4,130,2,87,0,53, - 0,100,3,125,4,126,4,88,0,89,0,110,2,88,0,116, - 4,124,3,131,1,83,0,41,4,122,52,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,73,110,115,112,101,99,116,76,111,97, - 100,101,114,46,103,101,116,95,115,111,117,114,99,101,46,122, - 39,115,111,117,114,99,101,32,110,111,116,32,97,118,97,105, - 108,97,98,108,101,32,116,104,114,111,117,103,104,32,103,101, - 116,95,100,97,116,97,40,41,114,116,0,0,0,78,41,5, - 114,180,0,0,0,218,8,103,101,116,95,100,97,116,97,114, - 50,0,0,0,114,118,0,0,0,114,177,0,0,0,41,5, - 114,119,0,0,0,114,140,0,0,0,114,44,0,0,0,114, - 175,0,0,0,218,3,101,120,99,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,10,103,101,116,95,115,111, - 117,114,99,101,63,3,0,0,115,20,0,0,0,0,2,10, - 1,2,1,14,1,16,1,4,1,2,255,4,1,2,255,20, - 2,122,23,83,111,117,114,99,101,76,111,97,100,101,114,46, - 103,101,116,95,115,111,117,114,99,101,114,105,0,0,0,41, - 1,218,9,95,111,112,116,105,109,105,122,101,99,3,0,0, - 0,0,0,0,0,1,0,0,0,4,0,0,0,8,0,0, - 0,67,0,0,0,115,22,0,0,0,116,0,106,1,116,2, - 124,1,124,2,100,1,100,2,124,3,100,3,141,6,83,0, - 41,4,122,130,82,101,116,117,114,110,32,116,104,101,32,99, - 111,100,101,32,111,98,106,101,99,116,32,99,111,109,112,105, - 108,101,100,32,102,114,111,109,32,115,111,117,114,99,101,46, - 10,10,32,32,32,32,32,32,32,32,84,104,101,32,39,100, - 97,116,97,39,32,97,114,103,117,109,101,110,116,32,99,97, - 110,32,98,101,32,97,110,121,32,111,98,106,101,99,116,32, - 116,121,112,101,32,116,104,97,116,32,99,111,109,112,105,108, - 101,40,41,32,115,117,112,112,111,114,116,115,46,10,32,32, - 32,32,32,32,32,32,114,216,0,0,0,84,41,2,218,12, - 100,111,110,116,95,105,110,104,101,114,105,116,114,84,0,0, - 0,41,3,114,135,0,0,0,114,215,0,0,0,218,7,99, - 111,109,112,105,108,101,41,4,114,119,0,0,0,114,26,0, - 0,0,114,44,0,0,0,114,231,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,14,115,111,117, - 114,99,101,95,116,111,95,99,111,100,101,73,3,0,0,115, - 8,0,0,0,0,5,12,1,2,0,2,255,122,27,83,111, - 117,114,99,101,76,111,97,100,101,114,46,115,111,117,114,99, - 101,95,116,111,95,99,111,100,101,99,2,0,0,0,0,0, - 0,0,0,0,0,0,15,0,0,0,9,0,0,0,67,0, - 0,0,115,34,2,0,0,124,0,160,0,124,1,161,1,125, - 2,100,1,125,3,100,1,125,4,100,1,125,5,100,2,125, - 6,100,3,125,7,122,12,116,1,124,2,131,1,125,8,87, - 0,110,26,4,0,116,2,107,10,114,68,1,0,1,0,1, - 0,100,1,125,8,89,0,144,1,110,48,88,0,122,14,124, - 0,160,3,124,2,161,1,125,9,87,0,110,22,4,0,116, - 4,107,10,114,106,1,0,1,0,1,0,89,0,144,1,110, - 10,88,0,116,5,124,9,100,4,25,0,131,1,125,3,122, - 14,124,0,160,6,124,8,161,1,125,10,87,0,110,20,4, - 0,116,4,107,10,114,154,1,0,1,0,1,0,89,0,110, - 218,88,0,124,1,124,8,100,5,156,2,125,11,122,148,116, - 7,124,10,124,1,124,11,131,3,125,12,116,8,124,10,131, - 1,100,6,100,1,133,2,25,0,125,13,124,12,100,7,64, - 0,100,8,107,3,125,6,124,6,144,1,114,36,124,12,100, - 9,64,0,100,8,107,3,125,7,116,9,106,10,100,10,107, - 3,144,1,114,56,124,7,115,254,116,9,106,10,100,11,107, - 2,144,1,114,56,124,0,160,6,124,2,161,1,125,4,116, - 9,160,11,116,12,124,4,161,2,125,5,116,13,124,10,124, - 5,124,1,124,11,131,4,1,0,110,20,116,14,124,10,124, - 3,124,9,100,12,25,0,124,1,124,11,131,5,1,0,87, - 0,110,26,4,0,116,15,116,16,102,2,107,10,144,1,114, - 84,1,0,1,0,1,0,89,0,110,32,88,0,116,17,160, - 18,100,13,124,8,124,2,161,3,1,0,116,19,124,13,124, - 1,124,8,124,2,100,14,141,4,83,0,124,4,100,1,107, - 8,144,1,114,136,124,0,160,6,124,2,161,1,125,4,124, - 0,160,20,124,4,124,2,161,2,125,14,116,17,160,18,100, - 15,124,2,161,2,1,0,116,21,106,22,144,2,115,30,124, - 8,100,1,107,9,144,2,114,30,124,3,100,1,107,9,144, - 2,114,30,124,6,144,1,114,228,124,5,100,1,107,8,144, - 1,114,214,116,9,160,11,124,4,161,1,125,5,116,23,124, - 14,124,5,124,7,131,3,125,10,110,16,116,24,124,14,124, - 3,116,25,124,4,131,1,131,3,125,10,122,18,124,0,160, - 26,124,2,124,8,124,10,161,3,1,0,87,0,110,22,4, - 0,116,2,107,10,144,2,114,28,1,0,1,0,1,0,89, - 0,110,2,88,0,124,14,83,0,41,16,122,190,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,73,110,115,112,101,99,116,76, - 111,97,100,101,114,46,103,101,116,95,99,111,100,101,46,10, - 10,32,32,32,32,32,32,32,32,82,101,97,100,105,110,103, - 32,111,102,32,98,121,116,101,99,111,100,101,32,114,101,113, - 117,105,114,101,115,32,112,97,116,104,95,115,116,97,116,115, - 32,116,111,32,98,101,32,105,109,112,108,101,109,101,110,116, - 101,100,46,32,84,111,32,119,114,105,116,101,10,32,32,32, - 32,32,32,32,32,98,121,116,101,99,111,100,101,44,32,115, - 101,116,95,100,97,116,97,32,109,117,115,116,32,97,108,115, - 111,32,98,101,32,105,109,112,108,101,109,101,110,116,101,100, - 46,10,10,32,32,32,32,32,32,32,32,78,70,84,114,170, - 0,0,0,114,160,0,0,0,114,146,0,0,0,114,39,0, - 0,0,114,73,0,0,0,114,28,0,0,0,90,5,110,101, - 118,101,114,90,6,97,108,119,97,121,115,218,4,115,105,122, - 101,122,13,123,125,32,109,97,116,99,104,101,115,32,123,125, - 41,3,114,117,0,0,0,114,107,0,0,0,114,108,0,0, - 0,122,19,99,111,100,101,32,111,98,106,101,99,116,32,102, - 114,111,109,32,123,125,41,27,114,180,0,0,0,114,98,0, - 0,0,114,82,0,0,0,114,225,0,0,0,114,50,0,0, - 0,114,17,0,0,0,114,228,0,0,0,114,153,0,0,0, - 218,10,109,101,109,111,114,121,118,105,101,119,114,164,0,0, - 0,90,21,99,104,101,99,107,95,104,97,115,104,95,98,97, - 115,101,100,95,112,121,99,115,114,158,0,0,0,218,17,95, - 82,65,87,95,77,65,71,73,67,95,78,85,77,66,69,82, - 114,159,0,0,0,114,157,0,0,0,114,118,0,0,0,114, - 151,0,0,0,114,135,0,0,0,114,150,0,0,0,114,166, - 0,0,0,114,234,0,0,0,114,8,0,0,0,218,19,100, - 111,110,116,95,119,114,105,116,101,95,98,121,116,101,99,111, - 100,101,114,172,0,0,0,114,171,0,0,0,114,22,0,0, - 0,114,227,0,0,0,41,15,114,119,0,0,0,114,140,0, - 0,0,114,108,0,0,0,114,155,0,0,0,114,175,0,0, - 0,114,158,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, - 114,107,0,0,0,218,2,115,116,114,26,0,0,0,114,152, - 0,0,0,114,83,0,0,0,90,10,98,121,116,101,115,95, - 100,97,116,97,90,11,99,111,100,101,95,111,98,106,101,99, - 116,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,214,0,0,0,81,3,0,0,115,152,0,0,0,0,7, - 10,1,4,1,4,1,4,1,4,1,4,1,2,1,12,1, - 14,1,12,2,2,1,14,1,14,1,8,2,12,1,2,1, - 14,1,14,1,6,3,2,1,2,254,6,4,2,1,12,1, - 16,1,12,1,6,1,12,1,12,1,2,255,2,2,8,254, - 4,3,10,1,4,1,2,1,2,254,4,4,8,1,2,255, - 6,3,2,1,2,1,2,1,6,1,2,1,2,251,8,7, - 20,1,6,2,8,1,2,255,4,2,6,1,2,1,2,254, - 6,3,10,1,10,1,12,1,12,1,18,1,6,255,4,2, - 6,1,10,1,10,1,14,2,6,1,6,255,4,2,2,1, - 18,1,16,1,6,1,122,21,83,111,117,114,99,101,76,111, - 97,100,101,114,46,103,101,116,95,99,111,100,101,78,41,10, - 114,126,0,0,0,114,125,0,0,0,114,127,0,0,0,114, - 224,0,0,0,114,225,0,0,0,114,227,0,0,0,114,226, - 0,0,0,114,230,0,0,0,114,234,0,0,0,114,214,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,222,0,0,0,22,3,0,0,115, - 14,0,0,0,8,2,8,8,8,14,8,10,8,7,8,10, - 14,8,114,222,0,0,0,99,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0, - 115,124,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,101,7,135,0,102,1,100, - 8,100,9,132,8,131,1,90,8,101,7,100,10,100,11,132, - 0,131,1,90,9,100,12,100,13,132,0,90,10,101,7,100, - 14,100,15,132,0,131,1,90,11,100,16,100,17,132,0,90, - 12,100,18,100,19,132,0,90,13,100,20,100,21,132,0,90, - 14,100,22,100,23,132,0,90,15,135,0,4,0,90,16,83, - 0,41,24,218,10,70,105,108,101,76,111,97,100,101,114,122, - 103,66,97,115,101,32,102,105,108,101,32,108,111,97,100,101, - 114,32,99,108,97,115,115,32,119,104,105,99,104,32,105,109, - 112,108,101,109,101,110,116,115,32,116,104,101,32,108,111,97, - 100,101,114,32,112,114,111,116,111,99,111,108,32,109,101,116, - 104,111,100,115,32,116,104,97,116,10,32,32,32,32,114,101, - 113,117,105,114,101,32,102,105,108,101,32,115,121,115,116,101, - 109,32,117,115,97,103,101,46,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,1,83,0,41,2,122,75,67,97,99,104,101,32, - 116,104,101,32,109,111,100,117,108,101,32,110,97,109,101,32, - 97,110,100,32,116,104,101,32,112,97,116,104,32,116,111,32, - 116,104,101,32,102,105,108,101,32,102,111,117,110,100,32,98, - 121,32,116,104,101,10,32,32,32,32,32,32,32,32,102,105, - 110,100,101,114,46,78,114,160,0,0,0,41,3,114,119,0, - 0,0,114,140,0,0,0,114,44,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,210,0,0,0, - 171,3,0,0,115,4,0,0,0,0,3,6,1,122,19,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,169,2,218, - 9,95,95,99,108,97,115,115,95,95,114,132,0,0,0,169, - 2,114,119,0,0,0,90,5,111,116,104,101,114,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,6,95,95, - 101,113,95,95,177,3,0,0,115,6,0,0,0,0,1,12, - 1,10,255,122,17,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,169,3,218, - 4,104,97,115,104,114,117,0,0,0,114,44,0,0,0,169, - 1,114,119,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,8,95,95,104,97,115,104,95,95,181, - 3,0,0,115,2,0,0,0,0,1,122,19,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,2,0,0,0, - 3,0,0,0,3,0,0,0,115,16,0,0,0,116,0,116, - 1,124,0,131,2,160,2,124,1,161,1,83,0,41,1,122, - 100,76,111,97,100,32,97,32,109,111,100,117,108,101,32,102, - 114,111,109,32,97,32,102,105,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,41,3,218,5,115,117,112,101,114,114,240, - 0,0,0,114,221,0,0,0,114,220,0,0,0,169,1,114, - 242,0,0,0,114,3,0,0,0,114,6,0,0,0,114,221, - 0,0,0,184,3,0,0,115,2,0,0,0,0,10,122,22, - 70,105,108,101,76,111,97,100,101,114,46,108,111,97,100,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, - 6,0,0,0,124,0,106,0,83,0,169,1,122,58,82,101, - 116,117,114,110,32,116,104,101,32,112,97,116,104,32,116,111, - 32,116,104,101,32,115,111,117,114,99,101,32,102,105,108,101, - 32,97,115,32,102,111,117,110,100,32,98,121,32,116,104,101, - 32,102,105,110,100,101,114,46,114,48,0,0,0,114,220,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,180,0,0,0,196,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,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, - 162,0,0,0,114,222,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,228, - 0,0,0,201,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,183,0,0,0,169,2,114,119,0,0,0,114,217, - 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,212,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,252,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, - 218,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,0,1,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,222,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,3,1,0, - 0,228,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,2,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,247,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,234,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,126,0,0,0,114,125,0,0,0,114, - 127,0,0,0,114,128,0,0,0,114,210,0,0,0,114,244, - 0,0,0,114,248,0,0,0,114,137,0,0,0,114,221,0, - 0,0,114,180,0,0,0,114,228,0,0,0,114,255,0,0, - 0,114,1,1,0,0,114,5,1,0,0,114,3,1,0,0, - 114,9,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,250, - 0,0,0,114,6,0,0,0,114,240,0,0,0,166,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,240,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,170,0,0,0,114,235,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,239,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,225,0,0,0,242,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,226,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, - 227,0,0,0,247,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,12,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,252,0,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,108,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,113,60,4,0,116,7,107,10,114,112,1,0,1, - 0,1,0,89,0,113,60,89,0,113,60,4,0,116,8,107, - 10,114,166,1,0,125,8,1,0,122,26,116,9,160,10,100, - 1,124,4,124,8,161,3,1,0,87,0,89,0,162,6,1, - 0,100,2,83,0,100,2,125,8,126,8,88,0,89,0,113, - 60,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,246,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,187, - 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, - 135,0,0,0,114,150,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, - 13,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,229,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 226,0,0,0,252,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,28, - 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,126,0,0,0, - 114,125,0,0,0,114,127,0,0,0,114,128,0,0,0,114, - 225,0,0,0,114,227,0,0,0,114,226,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,10,1,0,0,238,3,0,0,115,8,0,0,0, - 8,2,4,2,8,5,8,5,114,10,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,160,0,0,0,114,146,0,0, - 0,41,2,114,117,0,0,0,114,107,0,0,0,41,5,114, - 180,0,0,0,114,228,0,0,0,114,153,0,0,0,114,166, - 0,0,0,114,236,0,0,0,41,5,114,119,0,0,0,114, - 140,0,0,0,114,44,0,0,0,114,26,0,0,0,114,152, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,214,0,0,0,31,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,220,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,230,0,0, - 0,47,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,126,0,0,0,114,125,0,0,0,114,127,0,0,0,114, - 128,0,0,0,114,214,0,0,0,114,230,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,16,1,0,0,27,4,0,0,115,6,0,0,0, - 8,2,4,2,8,16,114,16,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,253,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,160, - 0,0,0,114,6,1,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,210,0,0,0,64,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,241,0,0,0,114,243,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,244,0,0,0, - 68,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, + 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,5,0,0,0,114,219,0,0,0,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,114,229,0,0, + 0,106,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, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,179, + 0,0,0,110,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,5,0,0,0,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,114,252,0, + 0,0,63,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,109,0,0,0, + 41,6,218,5,95,110,97,109,101,218,5,95,112,97,116,104, + 114,111,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,118,0,0,0,114, + 116,0,0,0,114,44,0,0,0,90,11,112,97,116,104,95, + 102,105,110,100,101,114,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,209,0,0,0,123,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,1,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,118,0,0,0,114,14,1, + 0,0,218,3,100,111,116,90,2,109,101,114,5,0,0,0, + 114,5,0,0,0,114,8,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,129,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,109,0,0,0,41,4,114,30,1, + 0,0,114,130,0,0,0,114,1,0,0,0,218,7,109,111, + 100,117,108,101,115,41,3,114,118,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,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, + 25,1,0,0,139,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,117,1,114,68,124,2,106,5, + 100,0,117,0,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,109,0,0,0,41,8,114,111,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,118,0,0,0,90,11,112,97,114,101,110,116,95,112, + 97,116,104,114,187,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,218,12,95,114,101,99,97,108,99, + 117,108,97,116,101,143,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,245,0,0,0,114,247,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,248,0,0,0, - 72,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, - 135,0,0,0,114,215,0,0,0,114,164,0,0,0,90,14, - 99,114,101,97,116,101,95,100,121,110,97,109,105,99,114,150, - 0,0,0,114,117,0,0,0,114,44,0,0,0,41,3,114, - 119,0,0,0,114,188,0,0,0,114,217,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,213,0, - 0,0,75,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,135,0,0,0,114,215,0,0,0,114,164,0,0,0, - 90,12,101,120,101,99,95,100,121,110,97,109,105,99,114,150, - 0,0,0,114,117,0,0,0,114,44,0,0,0,114,254,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,218,0,0,0,83,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,210,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,92,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,220,0,0,0,114,3,0,0,0,114,19,1,0,0, - 114,6,0,0,0,114,183,0,0,0,89,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,220,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,214,0,0,0,95, - 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,220,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,230,0, - 0,0,99,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,251,0,0,0,114,48,0,0,0,114,220,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 180,0,0,0,103,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,126,0,0,0,114,125,0,0,0,114,127, - 0,0,0,114,128,0,0,0,114,210,0,0,0,114,244,0, - 0,0,114,248,0,0,0,114,213,0,0,0,114,218,0,0, - 0,114,183,0,0,0,114,214,0,0,0,114,230,0,0,0, - 114,137,0,0,0,114,180,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,253, - 0,0,0,56,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,253,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,210,0,0,0,116,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,24,1, - 0,0,114,41,0,0,0,41,4,114,119,0,0,0,114,15, - 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,122,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,31, - 1,0,0,114,131,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,26,1,0,0,132,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,26,1, - 0,0,114,27,1,0,0,114,28,1,0,0,114,24,1,0, - 0,114,141,0,0,0,114,179,0,0,0,114,25,1,0,0, - 41,3,114,119,0,0,0,90,11,112,97,114,101,110,116,95, - 112,97,116,104,114,188,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,136,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,7,1, - 0,0,114,33,1,0,0,114,247,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,149,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,33,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,152,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,25,1,0,0,41,3,114,119,0,0,0,114, - 36,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,155,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,33,1,0,0,114,247,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,158,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,25,1,0,0,114,247,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,161,4,0,0,115,2,0,0,0,0,1,122, + 67,0,0,0,115,12,0,0,0,116,0,124,0,160,1,161, + 0,131,1,83,0,114,109,0,0,0,41,2,114,6,1,0, + 0,114,32,1,0,0,114,246,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,218,8,95,95,105,116, + 101,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,35,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,164,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,25,1,0,0,114,187,0,0,0,114,41,1, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,187,0,0,0,167,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,126,0,0,0, - 114,125,0,0,0,114,127,0,0,0,114,128,0,0,0,114, - 210,0,0,0,114,31,1,0,0,114,26,1,0,0,114,33, - 1,0,0,114,34,1,0,0,114,37,1,0,0,114,38,1, - 0,0,114,39,1,0,0,114,40,1,0,0,114,43,1,0, - 0,114,187,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,23,1,0,0,109, - 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,23,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,23, - 1,0,0,114,25,1,0,0,114,29,1,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,210,0,0, - 0,173,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, + 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,109,0,0,0,169,1,114,32,1,0,0,41,2, + 114,118,0,0,0,218,5,105,110,100,101,120,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,218,11,95,95,103, + 101,116,105,116,101,109,95,95,159,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,109,0,0,0, + 41,1,114,24,1,0,0,41,3,114,118,0,0,0,114,35, + 1,0,0,114,44,0,0,0,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,218,11,95,95,115,101,116,105,116, + 101,109,95,95,162,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,109,0,0,0,41,2,114,23,0,0, + 0,114,32,1,0,0,114,246,0,0,0,114,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,218,7,95,95,108,101, + 110,95,95,165,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,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,218,8,95,95,114,101,112, + 114,95,95,168,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,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,126,0,0,0,41, - 2,114,194,0,0,0,114,217,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,176,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,220,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 183,0,0,0,185,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,220,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 230,0,0,0,188,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,216,0,0, - 0,84,41,1,114,232,0,0,0,41,1,114,233,0,0,0, - 114,220,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,214,0,0,0,191,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, + 115,12,0,0,0,124,1,124,0,160,0,161,0,118,0,83, + 0,114,109,0,0,0,114,34,1,0,0,169,2,114,118,0, + 0,0,218,4,105,116,101,109,114,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,218,12,95,95,99,111,110,116,97, + 105,110,115,95,95,171,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,109,0,0,0, + 41,2,114,24,1,0,0,114,186,0,0,0,114,40,1,0, + 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 114,186,0,0,0,174,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,5,0,0,0,114,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,114,22,1,0,0,116,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,109,0,0,0,41,2,114,22,1, + 0,0,114,24,1,0,0,114,28,1,0,0,114,5,0,0, + 0,114,5,0,0,0,114,8,0,0,0,114,209,0,0,0, + 180,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,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,218,11,109,111,100,117,108, + 101,95,114,101,112,114,183,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,114,211,0,0,0,114,3,0,0,0,114,212,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 213,0,0,0,194,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,254,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 218,0,0,0,197,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,135,0,0,0,114,150,0,0,0,114, - 25,1,0,0,114,219,0,0,0,114,220,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,221,0, - 0,0,200,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,126,0,0,0,114,125,0,0,0,114,127, - 0,0,0,114,210,0,0,0,114,208,0,0,0,114,45,1, - 0,0,114,183,0,0,0,114,230,0,0,0,114,214,0,0, - 0,114,213,0,0,0,114,218,0,0,0,114,221,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,44,1,0,0,172,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,44,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,118,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,19,100,11,100,12,132,1,131,1,90, - 9,101,4,100,20,100,13,100,14,132,1,131,1,90,10,101, - 4,100,21,100,15,100,16,132,1,131,1,90,11,101,4,100, - 17,100,18,132,0,131,1,90,12,100,10,83,0,41,22,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,129,0,0,0,114,47,1,0, - 0,41,3,114,194,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,47,1,0,0,218,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,139,0,0,0,114,118,0,0,0,41, - 3,114,194,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,228,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,4,1,0, - 0,114,8,0,0,0,114,49,1,0,0,218,8,75,101,121, - 69,114,114,111,114,114,53,1,0,0,41,3,114,194,0,0, - 0,114,44,0,0,0,114,51,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, - 241,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,138,0,0,0,41,7,114,129,0,0,0,114, - 138,0,0,0,114,207,0,0,0,114,135,0,0,0,114,202, - 0,0,0,114,184,0,0,0,114,179,0,0,0,41,6,114, - 194,0,0,0,114,140,0,0,0,114,51,1,0,0,114,141, - 0,0,0,114,142,0,0,0,114,188,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,7,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, - 204,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,162,0,0,0, - 114,85,0,0,0,218,5,98,121,116,101,115,114,55,1,0, - 0,114,129,0,0,0,114,204,0,0,0,114,56,1,0,0, - 114,141,0,0,0,114,179,0,0,0,114,118,0,0,0,114, - 168,0,0,0,114,135,0,0,0,114,184,0,0,0,41,9, - 114,194,0,0,0,114,140,0,0,0,114,44,0,0,0,114, - 203,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,51,1,0,0, - 114,188,0,0,0,114,142,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,22,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,59,1,0,0, - 114,141,0,0,0,114,179,0,0,0,114,182,0,0,0,114, - 23,1,0,0,41,6,114,194,0,0,0,114,140,0,0,0, - 114,44,0,0,0,114,203,0,0,0,114,188,0,0,0,114, - 58,1,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,204,0,0,0,54,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,205,0,0, - 0,114,206,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,207,0,0,0,78,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,99,1,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,3,0,0,0,79,0,0,0,115,24,0,0, - 0,100,1,100,2,108,0,109,1,125,3,1,0,124,3,106, - 2,124,1,124,2,142,1,83,0,41,3,97,32,1,0,0, - 10,32,32,32,32,32,32,32,32,70,105,110,100,32,100,105, - 115,116,114,105,98,117,116,105,111,110,115,46,10,10,32,32, - 32,32,32,32,32,32,82,101,116,117,114,110,32,97,110,32, - 105,116,101,114,97,98,108,101,32,111,102,32,97,108,108,32, - 68,105,115,116,114,105,98,117,116,105,111,110,32,105,110,115, - 116,97,110,99,101,115,32,99,97,112,97,98,108,101,32,111, - 102,10,32,32,32,32,32,32,32,32,108,111,97,100,105,110, - 103,32,116,104,101,32,109,101,116,97,100,97,116,97,32,102, - 111,114,32,112,97,99,107,97,103,101,115,32,109,97,116,99, - 104,105,110,103,32,96,96,99,111,110,116,101,120,116,46,110, - 97,109,101,96,96,10,32,32,32,32,32,32,32,32,40,111, - 114,32,97,108,108,32,110,97,109,101,115,32,105,102,32,96, - 96,78,111,110,101,96,96,32,105,110,100,105,99,97,116,101, - 100,41,32,97,108,111,110,103,32,116,104,101,32,112,97,116, - 104,115,32,105,110,32,116,104,101,32,108,105,115,116,10,32, - 32,32,32,32,32,32,32,111,102,32,100,105,114,101,99,116, - 111,114,105,101,115,32,96,96,99,111,110,116,101,120,116,46, - 112,97,116,104,96,96,46,10,32,32,32,32,32,32,32,32, - 114,73,0,0,0,41,1,218,18,77,101,116,97,100,97,116, - 97,80,97,116,104,70,105,110,100,101,114,41,3,90,18,105, - 109,112,111,114,116,108,105,98,46,109,101,116,97,100,97,116, - 97,114,60,1,0,0,218,18,102,105,110,100,95,100,105,115, - 116,114,105,98,117,116,105,111,110,115,41,4,114,194,0,0, - 0,114,120,0,0,0,114,121,0,0,0,114,60,1,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 61,1,0,0,91,5,0,0,115,4,0,0,0,0,10,12, - 1,122,29,80,97,116,104,70,105,110,100,101,114,46,102,105, - 110,100,95,100,105,115,116,114,105,98,117,116,105,111,110,115, - 41,1,78,41,2,78,78,41,1,78,41,13,114,126,0,0, - 0,114,125,0,0,0,114,127,0,0,0,114,128,0,0,0, - 114,208,0,0,0,114,47,1,0,0,114,53,1,0,0,114, - 55,1,0,0,114,56,1,0,0,114,59,1,0,0,114,204, - 0,0,0,114,207,0,0,0,114,61,1,0,0,114,3,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,46,1,0,0,214,4,0,0,115,34,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,12,12,2, - 1,114,46,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,17,1,0,0,169,1,114, - 141,0,0,0,114,3,0,0,0,114,6,0,0,0,114,20, - 1,0,0,120,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,168,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,190,0,0,0,114,3,0,0,0,114,63,1,0, - 0,114,6,0,0,0,114,210,0,0,0,114,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,65,1,0, - 0,114,247,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,47,1,0,0,128,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, + 0,41,2,78,84,114,5,0,0,0,114,219,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,182, + 0,0,0,192,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,5,0,0,0,114,219,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,229, + 0,0,0,195,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,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,114,213,0,0,0,198,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,5,0,0,0,114,211,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,212, + 0,0,0,201,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,109,0,0,0,114,5,0,0,0,114,253,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,217, + 0,0,0,204,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,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,114,220,0,0, + 0,207,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, + 5,0,0,0,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,114,43,1,0,0,179,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,118,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,19,100,11,100,12,132,1,131,1,90,9, + 101,4,100,20,100,13,100,14,132,1,131,1,90,10,101,4, + 100,21,100,15,100,16,132,1,131,1,90,11,101,4,100,17, + 100,18,132,0,131,1,90,12,100,10,83,0,41,22,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,117,0,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,1,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,116,0,0,0,218,6,102,105, + 110,100,101,114,114,5,0,0,0,114,5,0,0,0,114,8, + 0,0,0,114,46,1,0,0,225,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,82,0,0,0,116,0,106,1,100,1,117,1,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,42,125,2,122,14,124, + 2,124,1,131,1,87,0,2,0,1,0,83,0,4,0,116, + 5,121,74,1,0,1,0,1,0,89,0,113,34,89,0,113, + 34,48,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,1,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,117,0,0,0,41,3,114,193, + 0,0,0,114,44,0,0,0,90,4,104,111,111,107,114,5, + 0,0,0,114,5,0,0,0,114,8,0,0,0,218,11,95, + 112,97,116,104,95,104,111,111,107,115,235,4,0,0,115,16, + 0,0,0,0,3,16,1,12,1,10,1,2,1,14,1,12, + 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,100,0,0,0,124,1,100,1,107,2,114, + 42,122,12,116,0,160,1,161,0,125,1,87,0,110,20,4, + 0,116,2,121,40,1,0,1,0,1,0,89,0,100,2,83, + 0,48,0,122,14,116,3,106,4,124,1,25,0,125,2,87, + 0,110,38,4,0,116,5,121,94,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,48,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,4,0,0,0, + 114,55,0,0,0,114,3,1,0,0,114,1,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,5,0,0,0,114,5,0,0,0,114,8, + 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,248,4,0,0,115,22,0, + 0,0,0,8,8,1,2,1,12,1,12,3,8,1,2,1, + 14,1,12,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,117,1,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,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,218,16,95,108,101,103,97,99,121,95,103, + 101,116,95,115,112,101,99,14,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,117,1,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,117,0,114,92,113,8,124,7,106,7,100,1, + 117,1,114,110,124,7,2,0,1,0,83,0,124,7,106,8, + 125,8,124,8,100,1,117,0,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,84,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,117,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,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,218,9,95,103,101,116,95,115,112,101,99,29,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,117,0,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,117,0,114,40,100,1,83,0,124,4,106,3,100,1, + 117,0,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,1,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,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,114,203,0,0, + 0,61,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,117,0,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,41,3,114,204,0,0,0,114,141,0,0, - 0,114,179,0,0,0,41,3,114,119,0,0,0,114,140,0, - 0,0,114,188,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,138,0,0,0,134,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, - 178,0,0,0,41,1,114,191,0,0,0,41,7,114,119,0, - 0,0,114,189,0,0,0,114,140,0,0,0,114,44,0,0, - 0,90,4,115,109,115,108,114,203,0,0,0,114,141,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,59,1,0,0,146,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,98,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,150,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,82,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,114,224,116, - 15,124,12,131,1,114,224,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,94,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,210,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,11,1,0,0,114,50,0,0,0,114,65, - 1,0,0,218,11,95,102,105,108,108,95,99,97,99,104,101, - 114,7,0,0,0,114,68,1,0,0,114,106,0,0,0,114, - 67,1,0,0,114,38,0,0,0,114,64,1,0,0,114,54, - 0,0,0,114,59,1,0,0,114,56,0,0,0,114,135,0, - 0,0,114,150,0,0,0,114,184,0,0,0,114,179,0,0, - 0,41,14,114,119,0,0,0,114,140,0,0,0,114,203,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,170,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,18,1,0,0,114,189,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,188,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,204,0,0,0,151, - 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,12,1,8,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, + 32,32,32,32,78,114,204,0,0,0,114,205,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,206, + 0,0,0,85,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,99,1,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0, + 0,79,0,0,0,115,28,0,0,0,100,1,100,2,108,0, + 109,1,125,3,1,0,124,3,106,2,124,1,105,0,124,2, + 164,1,142,1,83,0,41,3,97,32,1,0,0,10,32,32, + 32,32,32,32,32,32,70,105,110,100,32,100,105,115,116,114, + 105,98,117,116,105,111,110,115,46,10,10,32,32,32,32,32, + 32,32,32,82,101,116,117,114,110,32,97,110,32,105,116,101, + 114,97,98,108,101,32,111,102,32,97,108,108,32,68,105,115, + 116,114,105,98,117,116,105,111,110,32,105,110,115,116,97,110, + 99,101,115,32,99,97,112,97,98,108,101,32,111,102,10,32, + 32,32,32,32,32,32,32,108,111,97,100,105,110,103,32,116, + 104,101,32,109,101,116,97,100,97,116,97,32,102,111,114,32, + 112,97,99,107,97,103,101,115,32,109,97,116,99,104,105,110, + 103,32,96,96,99,111,110,116,101,120,116,46,110,97,109,101, + 96,96,10,32,32,32,32,32,32,32,32,40,111,114,32,97, + 108,108,32,110,97,109,101,115,32,105,102,32,96,96,78,111, + 110,101,96,96,32,105,110,100,105,99,97,116,101,100,41,32, + 97,108,111,110,103,32,116,104,101,32,112,97,116,104,115,32, + 105,110,32,116,104,101,32,108,105,115,116,10,32,32,32,32, + 32,32,32,32,111,102,32,100,105,114,101,99,116,111,114,105, + 101,115,32,96,96,99,111,110,116,101,120,116,46,112,97,116, + 104,96,96,46,10,32,32,32,32,32,32,32,32,114,73,0, + 0,0,41,1,218,18,77,101,116,97,100,97,116,97,80,97, + 116,104,70,105,110,100,101,114,41,3,90,18,105,109,112,111, + 114,116,108,105,98,46,109,101,116,97,100,97,116,97,114,59, + 1,0,0,218,18,102,105,110,100,95,100,105,115,116,114,105, + 98,117,116,105,111,110,115,41,4,114,193,0,0,0,114,119, + 0,0,0,114,120,0,0,0,114,59,1,0,0,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,114,60,1,0, + 0,98,5,0,0,115,4,0,0,0,0,10,12,1,122,29, + 80,97,116,104,70,105,110,100,101,114,46,102,105,110,100,95, + 100,105,115,116,114,105,98,117,116,105,111,110,115,41,1,78, + 41,2,78,78,41,1,78,41,13,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,60,1,0,0,114,5,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,45, + 1,0,0,221,4,0,0,115,34,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,12,12,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,109,0,0,0, + 114,5,0,0,0,114,16,1,0,0,169,1,114,140,0,0, + 0,114,5,0,0,0,114,8,0,0,0,114,19,1,0,0, + 127,5,0,0,243,0,0,0,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,104,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,118,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,5,0,0,0,114,62,1,0,0,114,8,0,0,0,114, + 209,0,0,0,121,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,104,0, + 0,0,78,41,1,114,65,1,0,0,114,246,0,0,0,114, + 5,0,0,0,114,5,0,0,0,114,8,0,0,0,114,46, + 1,0,0,135,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,117,0,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,118,0,0,0,114,139,0,0,0,114,187,0,0,0, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,114, + 137,0,0,0,141,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,118,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,5,0,0,0,114, + 5,0,0,0,114,8,0,0,0,114,58,1,0,0,153,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, + 96,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,22, + 4,0,116,6,121,64,1,0,1,0,1,0,100,4,125,5, + 89,0,110,2,48,0,124,5,124,0,106,7,107,3,114,90, + 124,0,160,8,161,0,1,0,124,5,124,0,95,7,116,9, + 131,0,114,112,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,118,0,114,216,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,148,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,148,116,17,124,8,131,1,125,3,124,0,106,14, + 68,0,93,82,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,118,0,114,222,116,15,124,12,131,1,114,222,124,0, + 160,16,124,10,124,1,124,12,100,8,124,2,161,5,2,0, + 1,0,83,0,113,222,124,3,144,1,114,92,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,104,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,4,0,0,0,114,55,0,0,0,114,10,1,0,0, + 114,50,0,0,0,114,65,1,0,0,218,11,95,102,105,108, + 108,95,99,97,99,104,101,114,9,0,0,0,114,68,1,0, + 0,114,105,0,0,0,114,67,1,0,0,114,38,0,0,0, + 114,64,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,118,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,5,0,0,0,114,5,0,0,0,114,8,0,0, + 0,114,203,0,0,0,158,5,0,0,115,72,0,0,0,0, + 5,4,1,14,1,2,1,24,1,12,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,12,1,8,1,10,1,4,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,188,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,28,4,0,116,4,116,5,116, + 6,102,3,121,56,1,0,1,0,1,0,103,0,125,2,89, + 0,110,2,48,0,116,7,106,8,160,9,100,1,161,1,115, + 82,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,134,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, + 92,124,3,124,0,95,11,116,7,106,8,160,9,116,16,161, + 1,114,184,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,5,0,0,0,41,1,114,105,0,0,0,41,2,114,32, + 0,0,0,90,2,102,110,114,5,0,0,0,114,5,0,0, + 0,114,8,0,0,0,218,9,60,115,101,116,99,111,109,112, + 62,235,5,0,0,114,63,1,0,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,4,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,1,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,66,1,0,0,114,67,1,0,0,114, + 100,0,0,0,114,62,0,0,0,114,105,0,0,0,218,3, + 97,100,100,114,12,0,0,0,114,68,1,0,0,41,9,114, + 118,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,116,0,0,0,114, + 29,1,0,0,114,17,1,0,0,90,8,110,101,119,95,110, + 97,109,101,114,5,0,0,0,114,5,0,0,0,114,8,0, + 0,0,114,70,1,0,0,206,5,0,0,115,34,0,0,0, + 0,2,6,1,2,1,22,1,18,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,36, + 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,103,1,136,1,162, + 1,82,0,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,117,0,0,0,114,48,0,0,0,169,2, + 114,193,0,0,0,114,69,1,0,0,114,5,0,0,0,114, + 8,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,247,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,5,0,0,0,41,3,114,193,0,0, + 0,114,69,1,0,0,114,76,1,0,0,114,5,0,0,0, + 114,75,1,0,0,114,8,0,0,0,218,9,112,97,116,104, + 95,104,111,111,107,237,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,5,0,0,0,114,5,0, + 0,0,114,8,0,0,0,114,39,1,0,0,255,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,70,1,0,0,114,207,0, + 0,0,114,77,1,0,0,114,39,1,0,0,114,5,0,0, + 0,114,5,0,0,0,114,5,0,0,0,114,8,0,0,0, + 114,61,1,0,0,112,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,61,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,144,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, + 18,4,0,116,5,121,138,1,0,1,0,1,0,89,0,110, + 2,48,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,62,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,116,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,5,0,0,0, + 114,5,0,0,0,114,8,0,0,0,218,14,95,102,105,120, + 95,117,112,95,109,111,100,117,108,101,5,6,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,12,2,114,82,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,101,0,0,0,114,15,1,0,0, + 114,88,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,5,0,0,0,114,5,0,0,0,114, + 8,0,0,0,114,184,0,0,0,28,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,10,0,0,0, + 9,0,0,0,67,0,0,0,115,132,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,100,2,103,1,102,2,100, + 3,100,4,100,2,103,2,102,2,102,2,125,2,124,2,68, + 0,93,108,92,2,125,3,125,4,116,5,100,5,100,6,132, + 0,124,4,68,0,131,1,131,1,115,82,74,0,130,1,124, + 4,100,7,25,0,125,5,124,3,116,1,106,3,118,0,114, + 116,116,1,106,3,124,3,25,0,125,6,1,0,113,170,113, + 52,122,20,116,0,160,6,124,3,161,1,125,6,87,0,1, + 0,113,170,87,0,113,52,4,0,116,7,121,158,1,0,1, + 0,1,0,89,0,113,52,89,0,113,52,48,0,113,52,116, + 7,100,8,131,1,130,1,116,8,124,1,100,9,124,6,131, + 3,1,0,116,8,124,1,100,10,124,5,131,3,1,0,116, + 8,124,1,100,11,100,12,160,9,124,4,161,1,131,3,1, + 0,116,8,124,1,100,13,100,14,100,15,132,0,124,4,68, + 0,131,1,131,3,1,0,103,0,100,16,162,1,125,7,124, + 3,100,3,107,2,144,1,114,6,124,7,160,10,100,17,161, + 1,1,0,124,7,68,0,93,52,125,8,124,8,116,1,106, + 3,118,1,144,1,114,38,116,0,160,6,124,8,161,1,125, + 9,110,10,116,1,106,3,124,8,25,0,125,9,116,8,124, + 1,124,8,124,9,131,3,1,0,144,1,113,10,116,8,124, + 1,100,18,116,11,131,0,131,3,1,0,116,12,160,13,116, + 2,160,14,161,0,161,1,1,0,124,3,100,3,107,2,144, + 1,114,128,116,15,160,10,100,19,161,1,1,0,100,20,116, + 12,118,0,144,1,114,128,100,21,116,16,95,17,100,22,83, + 0,41,23,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,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,23,0,0,0,41,2,114,32,0,0, + 0,114,94,0,0,0,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,19,1,0,0,57,6,0,0,114,63, + 1,0,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,4,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,5,0,0,0,41,2,114,32, + 0,0,0,218,1,115,114,5,0,0,0,114,5,0,0,0, + 114,8,0,0,0,114,71,1,0,0,74,6,0,0,114,63, + 1,0,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,41,3, + 114,64,0,0,0,114,75,0,0,0,114,160,0,0,0,114, + 192,0,0,0,114,9,0,0,0,122,4,46,112,121,119,122, + 6,95,100,46,112,121,100,84,78,41,18,114,134,0,0,0, + 114,1,0,0,0,114,163,0,0,0,114,31,1,0,0,114, + 125,0,0,0,218,3,97,108,108,90,18,95,98,117,105,108, + 116,105,110,95,102,114,111,109,95,110,97,109,101,114,117,0, + 0,0,114,129,0,0,0,114,36,0,0,0,114,186,0,0, + 0,114,14,0,0,0,114,21,1,0,0,114,167,0,0,0, + 114,83,1,0,0,114,101,0,0,0,114,191,0,0,0,114, + 195,0,0,0,41,10,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,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,98,117,105,108,116,105,110,95,110,97,109, + 101,115,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, + 114,5,0,0,0,114,5,0,0,0,114,8,0,0,0,218, + 6,95,115,101,116,117,112,39,6,0,0,115,70,0,0,0, + 0,8,4,1,6,1,6,2,10,3,22,1,12,2,22,1, + 8,1,10,1,10,1,6,2,2,1,10,1,10,1,12,1, + 12,2,8,2,12,1,12,1,18,1,22,3,8,1,10,1, + 10,1,8,1,12,1,12,2,10,1,16,3,14,1,14,1, + 10,1,10,1,10,1,114,89,1,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,228,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,8,1,0,0,114,55,0,0,0,114,4,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,66,1,0,0,114,67,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,68,1,0,0,41,9, - 114,119,0,0,0,114,44,0,0,0,114,9,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,42,1,0,0,114,117,0,0,0, - 114,30,1,0,0,114,18,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,70,1,0,0,199,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, - 194,0,0,0,114,69,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,240,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,194,0,0,0, - 114,69,1,0,0,114,76,1,0,0,114,3,0,0,0,114, - 75,1,0,0,114,6,0,0,0,218,9,112,97,116,104,95, - 104,111,111,107,230,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,247,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,40,1,0,0,248,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,126,0,0,0,114,125,0,0,0,114,127,0,0,0,114, - 128,0,0,0,114,210,0,0,0,114,47,1,0,0,114,144, - 0,0,0,114,207,0,0,0,114,138,0,0,0,114,59,1, - 0,0,114,204,0,0,0,114,70,1,0,0,114,208,0,0, - 0,114,77,1,0,0,114,40,1,0,0,114,3,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 62,1,0,0,105,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,62,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,63,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,141,0,0,0,114,16,1,0,0,114,10,1, - 0,0,114,191,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,141,0,0,0,114,188,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,254,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,82,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,253,0,0,0,114,164,0,0,0,218,18, - 101,120,116,101,110,115,105,111,110,95,115,117,102,102,105,120, - 101,115,114,10,1,0,0,114,102,0,0,0,114,16,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,185,0,0,0,21,6,0,0,115,8, - 0,0,0,0,5,12,1,8,1,8,1,114,185,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,161,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, - 20,1,0,0,57,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,71,1,0,0,73,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,193,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,135,0,0,0,114,8,0,0, - 0,114,164,0,0,0,114,32,1,0,0,114,126,0,0,0, - 90,18,95,98,117,105,108,116,105,110,95,102,114,111,109,95, - 110,97,109,101,114,130,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,22,1,0,0,114,168,0,0,0,114,83,1,0, - 0,114,102,0,0,0,114,187,0,0,0,114,192,0,0,0, - 114,196,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,32,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,90, - 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,90,1,0,0,114,185,0,0,0,114,8,0, - 0,0,114,52,1,0,0,114,168,0,0,0,114,62,1,0, - 0,114,77,1,0,0,218,9,109,101,116,97,95,112,97,116, - 104,114,187,0,0,0,114,46,1,0,0,41,2,114,89,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,97,6, - 0,0,115,8,0,0,0,0,2,8,1,6,1,20,1,114, - 92,1,0,0,41,1,114,60,0,0,0,41,1,78,41,3, - 78,78,78,41,2,114,73,0,0,0,114,73,0,0,0,41, - 1,84,41,1,78,41,1,78,41,63,114,128,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,163,0,0, - 0,114,18,0,0,0,114,149,0,0,0,114,17,0,0,0, - 114,24,0,0,0,114,237,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,137,0, - 0,0,114,144,0,0,0,114,153,0,0,0,114,157,0,0, - 0,114,159,0,0,0,114,166,0,0,0,114,171,0,0,0, - 114,172,0,0,0,114,177,0,0,0,218,6,111,98,106,101, - 99,116,114,186,0,0,0,114,191,0,0,0,114,192,0,0, - 0,114,209,0,0,0,114,222,0,0,0,114,240,0,0,0, - 114,10,1,0,0,114,16,1,0,0,114,22,1,0,0,114, - 253,0,0,0,114,23,1,0,0,114,44,1,0,0,114,46, - 1,0,0,114,62,1,0,0,114,82,1,0,0,114,185,0, - 0,0,114,90,1,0,0,114,92,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,10,22,10,127,0,13,16,1,12,2,4, - 1,4,2,6,2,6,2,8,2,16,71,8,40,8,19,8, - 12,8,12,8,28,8,17,8,33,8,28,8,24,10,13,10, - 10,10,11,8,14,6,3,4,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,20,14,127,0,22,10,23,8,11,8, - 65, + 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,89,1,0,0, + 114,184,0,0,0,114,1,0,0,0,114,51,1,0,0,114, + 167,0,0,0,114,61,1,0,0,114,77,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,88,1,0,0,90,17,115,117,112,112, + 111,114,116,101,100,95,108,111,97,100,101,114,115,114,5,0, + 0,0,114,5,0,0,0,114,8,0,0,0,218,8,95,105, + 110,115,116,97,108,108,96,6,0,0,115,8,0,0,0,0, + 2,8,1,6,1,20,1,114,91,1,0,0,41,1,114,60, + 0,0,0,41,1,78,41,3,78,78,78,41,2,114,73,0, + 0,0,114,73,0,0,0,41,1,84,41,1,78,41,1,78, + 41,63,114,127,0,0,0,114,13,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,12,0,0,0,114,14,0,0,0,114,21,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,19,0,0,0,114,148, + 0,0,0,114,18,0,0,0,114,24,0,0,0,114,236,0, + 0,0,114,91,0,0,0,114,87,0,0,0,114,101,0,0, + 0,114,88,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,97,0,0, + 0,114,102,0,0,0,114,108,0,0,0,114,112,0,0,0, + 114,114,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,61,1,0,0, + 114,82,1,0,0,114,184,0,0,0,114,89,1,0,0,114, + 91,1,0,0,114,5,0,0,0,114,5,0,0,0,114,5, + 0,0,0,114,8,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,10,22,10, + 127,0,20,16,1,12,2,4,1,4,2,6,2,6,2,8, + 2,16,71,8,40,8,19,8,12,8,12,8,28,8,17,8, + 33,8,28,8,24,10,13,10,10,10,11,8,14,6,3,4, + 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,20,14, + 127,0,22,10,23,8,11,8,57, }; diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index f013b41457fd4343be4e489572f9b360ef366889..373b1366bdea30d3fef5742f9834873d11949741 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -117,965 +117,963 @@ const unsigned char _Py_M__zipimport[] = { 111,102,32,116,104,101,10,32,32,32,32,122,105,112,102,105, 108,101,32,116,97,114,103,101,116,101,100,46,10,32,32,32, 32,99,2,0,0,0,0,0,0,0,0,0,0,0,8,0, - 0,0,9,0,0,0,67,0,0,0,115,36,1,0,0,116, + 0,0,9,0,0,0,67,0,0,0,115,32,1,0,0,116, 0,124,1,116,1,131,2,115,28,100,1,100,0,108,2,125, 2,124,2,160,3,124,1,161,1,125,1,124,1,115,44,116, 4,100,2,124,1,100,3,141,2,130,1,116,5,114,60,124, 1,160,6,116,5,116,7,161,2,125,1,103,0,125,3,122, - 14,116,8,160,9,124,1,161,1,125,4,87,0,110,72,4, - 0,116,10,116,11,102,2,107,10,114,150,1,0,1,0,1, - 0,116,8,160,12,124,1,161,1,92,2,125,5,125,6,124, - 5,124,1,107,2,114,132,116,4,100,4,124,1,100,3,141, - 2,130,1,124,5,125,1,124,3,160,13,124,6,161,1,1, - 0,89,0,113,64,88,0,124,4,106,14,100,5,64,0,100, - 6,107,3,114,182,116,4,100,4,124,1,100,3,141,2,130, - 1,113,182,113,64,122,12,116,15,124,1,25,0,125,7,87, - 0,110,36,4,0,116,16,107,10,114,230,1,0,1,0,1, - 0,116,17,124,1,131,1,125,7,124,7,116,15,124,1,60, - 0,89,0,110,2,88,0,124,7,124,0,95,18,124,1,124, - 0,95,19,116,8,106,20,124,3,100,0,100,0,100,7,133, - 3,25,0,142,0,124,0,95,21,124,0,106,21,144,1,114, - 32,124,0,4,0,106,21,116,7,55,0,2,0,95,21,100, - 0,83,0,41,8,78,114,0,0,0,0,122,21,97,114,99, - 104,105,118,101,32,112,97,116,104,32,105,115,32,101,109,112, - 116,121,169,1,218,4,112,97,116,104,122,14,110,111,116,32, - 97,32,90,105,112,32,102,105,108,101,105,0,240,0,0,105, - 0,128,0,0,233,255,255,255,255,41,22,218,10,105,115,105, - 110,115,116,97,110,99,101,218,3,115,116,114,218,2,111,115, - 90,8,102,115,100,101,99,111,100,101,114,3,0,0,0,218, - 12,97,108,116,95,112,97,116,104,95,115,101,112,218,7,114, - 101,112,108,97,99,101,218,8,112,97,116,104,95,115,101,112, - 218,19,95,98,111,111,116,115,116,114,97,112,95,101,120,116, - 101,114,110,97,108,90,10,95,112,97,116,104,95,115,116,97, - 116,218,7,79,83,69,114,114,111,114,218,10,86,97,108,117, - 101,69,114,114,111,114,90,11,95,112,97,116,104,95,115,112, - 108,105,116,218,6,97,112,112,101,110,100,90,7,115,116,95, - 109,111,100,101,218,20,95,122,105,112,95,100,105,114,101,99, - 116,111,114,121,95,99,97,99,104,101,218,8,75,101,121,69, - 114,114,111,114,218,15,95,114,101,97,100,95,100,105,114,101, - 99,116,111,114,121,218,6,95,102,105,108,101,115,218,7,97, - 114,99,104,105,118,101,218,10,95,112,97,116,104,95,106,111, - 105,110,218,6,112,114,101,102,105,120,41,8,218,4,115,101, - 108,102,114,13,0,0,0,114,17,0,0,0,114,31,0,0, - 0,90,2,115,116,90,7,100,105,114,110,97,109,101,90,8, - 98,97,115,101,110,97,109,101,218,5,102,105,108,101,115,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,8, - 95,95,105,110,105,116,95,95,63,0,0,0,115,58,0,0, - 0,0,1,10,1,8,1,10,1,4,1,12,1,4,1,12, - 2,4,2,2,1,14,1,18,3,14,1,8,1,12,1,4, - 1,16,3,14,2,12,1,4,2,2,1,12,1,14,1,8, - 1,14,1,6,1,6,2,22,1,8,1,122,20,122,105,112, - 105,109,112,111,114,116,101,114,46,95,95,105,110,105,116,95, - 95,78,99,3,0,0,0,0,0,0,0,0,0,0,0,5, - 0,0,0,4,0,0,0,67,0,0,0,115,78,0,0,0, - 116,0,124,0,124,1,131,2,125,3,124,3,100,1,107,9, - 114,26,124,0,103,0,102,2,83,0,116,1,124,0,124,1, - 131,2,125,4,116,2,124,0,124,4,131,2,114,70,100,1, - 124,0,106,3,155,0,116,4,155,0,124,4,155,0,157,3, - 103,1,102,2,83,0,100,1,103,0,102,2,83,0,41,2, - 97,239,1,0,0,102,105,110,100,95,108,111,97,100,101,114, - 40,102,117,108,108,110,97,109,101,44,32,112,97,116,104,61, - 78,111,110,101,41,32,45,62,32,115,101,108,102,44,32,115, - 116,114,32,111,114,32,78,111,110,101,46,10,10,32,32,32, - 32,32,32,32,32,83,101,97,114,99,104,32,102,111,114,32, - 97,32,109,111,100,117,108,101,32,115,112,101,99,105,102,105, - 101,100,32,98,121,32,39,102,117,108,108,110,97,109,101,39, - 46,32,39,102,117,108,108,110,97,109,101,39,32,109,117,115, - 116,32,98,101,32,116,104,101,10,32,32,32,32,32,32,32, - 32,102,117,108,108,121,32,113,117,97,108,105,102,105,101,100, - 32,40,100,111,116,116,101,100,41,32,109,111,100,117,108,101, - 32,110,97,109,101,46,32,73,116,32,114,101,116,117,114,110, - 115,32,116,104,101,32,122,105,112,105,109,112,111,114,116,101, - 114,10,32,32,32,32,32,32,32,32,105,110,115,116,97,110, - 99,101,32,105,116,115,101,108,102,32,105,102,32,116,104,101, - 32,109,111,100,117,108,101,32,119,97,115,32,102,111,117,110, - 100,44,32,97,32,115,116,114,105,110,103,32,99,111,110,116, - 97,105,110,105,110,103,32,116,104,101,10,32,32,32,32,32, - 32,32,32,102,117,108,108,32,112,97,116,104,32,110,97,109, - 101,32,105,102,32,105,116,39,115,32,112,111,115,115,105,98, - 108,121,32,97,32,112,111,114,116,105,111,110,32,111,102,32, - 97,32,110,97,109,101,115,112,97,99,101,32,112,97,99,107, - 97,103,101,44,10,32,32,32,32,32,32,32,32,111,114,32, - 78,111,110,101,32,111,116,104,101,114,119,105,115,101,46,32, - 84,104,101,32,111,112,116,105,111,110,97,108,32,39,112,97, - 116,104,39,32,97,114,103,117,109,101,110,116,32,105,115,32, - 105,103,110,111,114,101,100,32,45,45,32,105,116,39,115,10, - 32,32,32,32,32,32,32,32,116,104,101,114,101,32,102,111, - 114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32, - 119,105,116,104,32,116,104,101,32,105,109,112,111,114,116,101, - 114,32,112,114,111,116,111,99,111,108,46,10,32,32,32,32, - 32,32,32,32,78,41,5,218,16,95,103,101,116,95,109,111, - 100,117,108,101,95,105,110,102,111,218,16,95,103,101,116,95, - 109,111,100,117,108,101,95,112,97,116,104,218,7,95,105,115, - 95,100,105,114,114,29,0,0,0,114,20,0,0,0,41,5, - 114,32,0,0,0,218,8,102,117,108,108,110,97,109,101,114, - 13,0,0,0,218,2,109,105,218,7,109,111,100,112,97,116, - 104,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 218,11,102,105,110,100,95,108,111,97,100,101,114,109,0,0, - 0,115,14,0,0,0,0,10,10,1,8,2,8,7,10,1, - 10,4,24,2,122,23,122,105,112,105,109,112,111,114,116,101, - 114,46,102,105,110,100,95,108,111,97,100,101,114,99,3,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0, - 0,0,67,0,0,0,115,16,0,0,0,124,0,160,0,124, - 1,124,2,161,2,100,1,25,0,83,0,41,2,97,139,1, - 0,0,102,105,110,100,95,109,111,100,117,108,101,40,102,117, - 108,108,110,97,109,101,44,32,112,97,116,104,61,78,111,110, - 101,41,32,45,62,32,115,101,108,102,32,111,114,32,78,111, - 110,101,46,10,10,32,32,32,32,32,32,32,32,83,101,97, - 114,99,104,32,102,111,114,32,97,32,109,111,100,117,108,101, - 32,115,112,101,99,105,102,105,101,100,32,98,121,32,39,102, - 117,108,108,110,97,109,101,39,46,32,39,102,117,108,108,110, - 97,109,101,39,32,109,117,115,116,32,98,101,32,116,104,101, - 10,32,32,32,32,32,32,32,32,102,117,108,108,121,32,113, - 117,97,108,105,102,105,101,100,32,40,100,111,116,116,101,100, - 41,32,109,111,100,117,108,101,32,110,97,109,101,46,32,73, - 116,32,114,101,116,117,114,110,115,32,116,104,101,32,122,105, - 112,105,109,112,111,114,116,101,114,10,32,32,32,32,32,32, - 32,32,105,110,115,116,97,110,99,101,32,105,116,115,101,108, - 102,32,105,102,32,116,104,101,32,109,111,100,117,108,101,32, - 119,97,115,32,102,111,117,110,100,44,32,111,114,32,78,111, - 110,101,32,105,102,32,105,116,32,119,97,115,110,39,116,46, - 10,32,32,32,32,32,32,32,32,84,104,101,32,111,112,116, - 105,111,110,97,108,32,39,112,97,116,104,39,32,97,114,103, - 117,109,101,110,116,32,105,115,32,105,103,110,111,114,101,100, - 32,45,45,32,105,116,39,115,32,116,104,101,114,101,32,102, - 111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121, - 10,32,32,32,32,32,32,32,32,119,105,116,104,32,116,104, - 101,32,105,109,112,111,114,116,101,114,32,112,114,111,116,111, - 99,111,108,46,10,32,32,32,32,32,32,32,32,114,0,0, - 0,0,41,1,114,41,0,0,0,41,3,114,32,0,0,0, - 114,38,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,102,105,110,100,95, - 109,111,100,117,108,101,141,0,0,0,115,2,0,0,0,0, - 9,122,23,122,105,112,105,109,112,111,114,116,101,114,46,102, - 105,110,100,95,109,111,100,117,108,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,5,0,0,0,3,0,0,0,67, - 0,0,0,115,20,0,0,0,116,0,124,0,124,1,131,2, - 92,3,125,2,125,3,125,4,124,2,83,0,41,1,122,163, - 103,101,116,95,99,111,100,101,40,102,117,108,108,110,97,109, - 101,41,32,45,62,32,99,111,100,101,32,111,98,106,101,99, - 116,46,10,10,32,32,32,32,32,32,32,32,82,101,116,117, - 114,110,32,116,104,101,32,99,111,100,101,32,111,98,106,101, - 99,116,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,32,82,97,105, - 115,101,32,90,105,112,73,109,112,111,114,116,69,114,114,111, - 114,10,32,32,32,32,32,32,32,32,105,102,32,116,104,101, - 32,109,111,100,117,108,101,32,99,111,117,108,100,110,39,116, - 32,98,101,32,102,111,117,110,100,46,10,32,32,32,32,32, - 32,32,32,169,1,218,16,95,103,101,116,95,109,111,100,117, - 108,101,95,99,111,100,101,169,5,114,32,0,0,0,114,38, - 0,0,0,218,4,99,111,100,101,218,9,105,115,112,97,99, - 107,97,103,101,114,40,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,218,8,103,101,116,95,99,111, - 100,101,153,0,0,0,115,4,0,0,0,0,6,16,1,122, - 20,122,105,112,105,109,112,111,114,116,101,114,46,103,101,116, - 95,99,111,100,101,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,118, - 0,0,0,116,0,114,16,124,1,160,1,116,0,116,2,161, - 2,125,1,124,1,125,2,124,1,160,3,124,0,106,4,116, - 2,23,0,161,1,114,58,124,1,116,5,124,0,106,4,116, - 2,23,0,131,1,100,1,133,2,25,0,125,2,122,14,124, - 0,106,6,124,2,25,0,125,3,87,0,110,32,4,0,116, - 7,107,10,114,104,1,0,1,0,1,0,116,8,100,2,100, - 3,124,2,131,3,130,1,89,0,110,2,88,0,116,9,124, - 0,106,4,124,3,131,2,83,0,41,4,122,154,103,101,116, - 95,100,97,116,97,40,112,97,116,104,110,97,109,101,41,32, - 45,62,32,115,116,114,105,110,103,32,119,105,116,104,32,102, - 105,108,101,32,100,97,116,97,46,10,10,32,32,32,32,32, - 32,32,32,82,101,116,117,114,110,32,116,104,101,32,100,97, - 116,97,32,97,115,115,111,99,105,97,116,101,100,32,119,105, - 116,104,32,39,112,97,116,104,110,97,109,101,39,46,32,82, - 97,105,115,101,32,79,83,69,114,114,111,114,32,105,102,10, - 32,32,32,32,32,32,32,32,116,104,101,32,102,105,108,101, - 32,119,97,115,110,39,116,32,102,111,117,110,100,46,10,32, - 32,32,32,32,32,32,32,78,114,0,0,0,0,218,0,41, - 10,114,18,0,0,0,114,19,0,0,0,114,20,0,0,0, - 218,10,115,116,97,114,116,115,119,105,116,104,114,29,0,0, - 0,218,3,108,101,110,114,28,0,0,0,114,26,0,0,0, - 114,22,0,0,0,218,9,95,103,101,116,95,100,97,116,97, - 41,4,114,32,0,0,0,218,8,112,97,116,104,110,97,109, - 101,90,3,107,101,121,218,9,116,111,99,95,101,110,116,114, - 121,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 218,8,103,101,116,95,100,97,116,97,163,0,0,0,115,20, - 0,0,0,0,6,4,1,12,2,4,1,16,1,22,2,2, - 1,14,1,14,1,18,1,122,20,122,105,112,105,109,112,111, - 114,116,101,114,46,103,101,116,95,100,97,116,97,99,2,0, - 0,0,0,0,0,0,0,0,0,0,5,0,0,0,3,0, - 0,0,67,0,0,0,115,20,0,0,0,116,0,124,0,124, - 1,131,2,92,3,125,2,125,3,125,4,124,4,83,0,41, - 1,122,106,103,101,116,95,102,105,108,101,110,97,109,101,40, - 102,117,108,108,110,97,109,101,41,32,45,62,32,102,105,108, - 101,110,97,109,101,32,115,116,114,105,110,103,46,10,10,32, - 32,32,32,32,32,32,32,82,101,116,117,114,110,32,116,104, - 101,32,102,105,108,101,110,97,109,101,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,32,32,32,32,32,32,32,32,114,43,0, - 0,0,114,45,0,0,0,114,9,0,0,0,114,9,0,0, - 0,114,10,0,0,0,218,12,103,101,116,95,102,105,108,101, - 110,97,109,101,184,0,0,0,115,4,0,0,0,0,7,16, - 1,122,24,122,105,112,105,109,112,111,114,116,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,6,0,0,0,8,0,0,0, - 67,0,0,0,115,128,0,0,0,116,0,124,0,124,1,131, - 2,125,2,124,2,100,1,107,8,114,36,116,1,100,2,124, - 1,155,2,157,2,124,1,100,3,141,2,130,1,116,2,124, - 0,124,1,131,2,125,3,124,2,114,64,116,3,160,4,124, - 3,100,4,161,2,125,4,110,10,124,3,155,0,100,5,157, - 2,125,4,122,14,124,0,106,5,124,4,25,0,125,5,87, - 0,110,22,4,0,116,6,107,10,114,110,1,0,1,0,1, - 0,89,0,100,1,83,0,88,0,116,7,124,0,106,8,124, - 5,131,2,160,9,161,0,83,0,41,6,122,253,103,101,116, - 95,115,111,117,114,99,101,40,102,117,108,108,110,97,109,101, - 41,32,45,62,32,115,111,117,114,99,101,32,115,116,114,105, - 110,103,46,10,10,32,32,32,32,32,32,32,32,82,101,116, - 117,114,110,32,116,104,101,32,115,111,117,114,99,101,32,99, - 111,100,101,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,32,82,97, - 105,115,101,32,90,105,112,73,109,112,111,114,116,69,114,114, - 111,114,10,32,32,32,32,32,32,32,32,105,102,32,116,104, - 101,32,109,111,100,117,108,101,32,99,111,117,108,100,110,39, - 116,32,98,101,32,102,111,117,110,100,44,32,114,101,116,117, - 114,110,32,78,111,110,101,32,105,102,32,116,104,101,32,97, - 114,99,104,105,118,101,32,100,111,101,115,10,32,32,32,32, - 32,32,32,32,99,111,110,116,97,105,110,32,116,104,101,32, - 109,111,100,117,108,101,44,32,98,117,116,32,104,97,115,32, - 110,111,32,115,111,117,114,99,101,32,102,111,114,32,105,116, - 46,10,32,32,32,32,32,32,32,32,78,250,18,99,97,110, - 39,116,32,102,105,110,100,32,109,111,100,117,108,101,32,169, - 1,218,4,110,97,109,101,250,11,95,95,105,110,105,116,95, - 95,46,112,121,250,3,46,112,121,41,10,114,35,0,0,0, - 114,3,0,0,0,114,36,0,0,0,114,21,0,0,0,114, - 30,0,0,0,114,28,0,0,0,114,26,0,0,0,114,52, - 0,0,0,114,29,0,0,0,218,6,100,101,99,111,100,101, - 41,6,114,32,0,0,0,114,38,0,0,0,114,39,0,0, - 0,114,13,0,0,0,218,8,102,117,108,108,112,97,116,104, - 114,54,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,218,10,103,101,116,95,115,111,117,114,99,101, - 195,0,0,0,115,24,0,0,0,0,7,10,1,8,1,18, - 2,10,1,4,1,14,2,10,2,2,1,14,1,14,2,8, - 1,122,22,122,105,112,105,109,112,111,114,116,101,114,46,103, - 101,116,95,115,111,117,114,99,101,99,2,0,0,0,0,0, + 14,116,8,160,9,124,1,161,1,125,4,87,0,110,70,4, + 0,116,10,116,11,102,2,121,148,1,0,1,0,1,0,116, + 8,160,12,124,1,161,1,92,2,125,5,125,6,124,5,124, + 1,107,2,114,130,116,4,100,4,124,1,100,3,141,2,130, + 1,124,5,125,1,124,3,160,13,124,6,161,1,1,0,89, + 0,113,64,48,0,124,4,106,14,100,5,64,0,100,6,107, + 3,114,180,116,4,100,4,124,1,100,3,141,2,130,1,113, + 180,113,64,122,12,116,15,124,1,25,0,125,7,87,0,110, + 34,4,0,116,16,121,226,1,0,1,0,1,0,116,17,124, + 1,131,1,125,7,124,7,116,15,124,1,60,0,89,0,110, + 2,48,0,124,7,124,0,95,18,124,1,124,0,95,19,116, + 8,106,20,124,3,100,0,100,0,100,7,133,3,25,0,142, + 0,124,0,95,21,124,0,106,21,144,1,114,28,124,0,4, + 0,106,21,116,7,55,0,2,0,95,21,100,0,83,0,41, + 8,78,114,0,0,0,0,122,21,97,114,99,104,105,118,101, + 32,112,97,116,104,32,105,115,32,101,109,112,116,121,169,1, + 218,4,112,97,116,104,122,14,110,111,116,32,97,32,90,105, + 112,32,102,105,108,101,105,0,240,0,0,105,0,128,0,0, + 233,255,255,255,255,41,22,218,10,105,115,105,110,115,116,97, + 110,99,101,218,3,115,116,114,218,2,111,115,90,8,102,115, + 100,101,99,111,100,101,114,3,0,0,0,218,12,97,108,116, + 95,112,97,116,104,95,115,101,112,218,7,114,101,112,108,97, + 99,101,218,8,112,97,116,104,95,115,101,112,218,19,95,98, + 111,111,116,115,116,114,97,112,95,101,120,116,101,114,110,97, + 108,90,10,95,112,97,116,104,95,115,116,97,116,218,7,79, + 83,69,114,114,111,114,218,10,86,97,108,117,101,69,114,114, + 111,114,90,11,95,112,97,116,104,95,115,112,108,105,116,218, + 6,97,112,112,101,110,100,90,7,115,116,95,109,111,100,101, + 218,20,95,122,105,112,95,100,105,114,101,99,116,111,114,121, + 95,99,97,99,104,101,218,8,75,101,121,69,114,114,111,114, + 218,15,95,114,101,97,100,95,100,105,114,101,99,116,111,114, + 121,218,6,95,102,105,108,101,115,218,7,97,114,99,104,105, + 118,101,218,10,95,112,97,116,104,95,106,111,105,110,218,6, + 112,114,101,102,105,120,41,8,218,4,115,101,108,102,114,13, + 0,0,0,114,17,0,0,0,114,31,0,0,0,90,2,115, + 116,90,7,100,105,114,110,97,109,101,90,8,98,97,115,101, + 110,97,109,101,218,5,102,105,108,101,115,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,8,95,95,105,110, + 105,116,95,95,63,0,0,0,115,58,0,0,0,0,1,10, + 1,8,1,10,1,4,1,12,1,4,1,12,2,4,2,2, + 1,14,1,16,3,14,1,8,1,12,1,4,1,16,3,14, + 2,12,1,4,2,2,1,12,1,12,1,8,1,14,1,6, + 1,6,2,22,1,8,1,122,20,122,105,112,105,109,112,111, + 114,116,101,114,46,95,95,105,110,105,116,95,95,78,99,3, + 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,4, + 0,0,0,67,0,0,0,115,78,0,0,0,116,0,124,0, + 124,1,131,2,125,3,124,3,100,1,117,1,114,26,124,0, + 103,0,102,2,83,0,116,1,124,0,124,1,131,2,125,4, + 116,2,124,0,124,4,131,2,114,70,100,1,124,0,106,3, + 155,0,116,4,155,0,124,4,155,0,157,3,103,1,102,2, + 83,0,100,1,103,0,102,2,83,0,41,2,97,239,1,0, + 0,102,105,110,100,95,108,111,97,100,101,114,40,102,117,108, + 108,110,97,109,101,44,32,112,97,116,104,61,78,111,110,101, + 41,32,45,62,32,115,101,108,102,44,32,115,116,114,32,111, + 114,32,78,111,110,101,46,10,10,32,32,32,32,32,32,32, + 32,83,101,97,114,99,104,32,102,111,114,32,97,32,109,111, + 100,117,108,101,32,115,112,101,99,105,102,105,101,100,32,98, + 121,32,39,102,117,108,108,110,97,109,101,39,46,32,39,102, + 117,108,108,110,97,109,101,39,32,109,117,115,116,32,98,101, + 32,116,104,101,10,32,32,32,32,32,32,32,32,102,117,108, + 108,121,32,113,117,97,108,105,102,105,101,100,32,40,100,111, + 116,116,101,100,41,32,109,111,100,117,108,101,32,110,97,109, + 101,46,32,73,116,32,114,101,116,117,114,110,115,32,116,104, + 101,32,122,105,112,105,109,112,111,114,116,101,114,10,32,32, + 32,32,32,32,32,32,105,110,115,116,97,110,99,101,32,105, + 116,115,101,108,102,32,105,102,32,116,104,101,32,109,111,100, + 117,108,101,32,119,97,115,32,102,111,117,110,100,44,32,97, + 32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105, + 110,103,32,116,104,101,10,32,32,32,32,32,32,32,32,102, + 117,108,108,32,112,97,116,104,32,110,97,109,101,32,105,102, + 32,105,116,39,115,32,112,111,115,115,105,98,108,121,32,97, + 32,112,111,114,116,105,111,110,32,111,102,32,97,32,110,97, + 109,101,115,112,97,99,101,32,112,97,99,107,97,103,101,44, + 10,32,32,32,32,32,32,32,32,111,114,32,78,111,110,101, + 32,111,116,104,101,114,119,105,115,101,46,32,84,104,101,32, + 111,112,116,105,111,110,97,108,32,39,112,97,116,104,39,32, + 97,114,103,117,109,101,110,116,32,105,115,32,105,103,110,111, + 114,101,100,32,45,45,32,105,116,39,115,10,32,32,32,32, + 32,32,32,32,116,104,101,114,101,32,102,111,114,32,99,111, + 109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104, + 32,116,104,101,32,105,109,112,111,114,116,101,114,32,112,114, + 111,116,111,99,111,108,46,10,32,32,32,32,32,32,32,32, + 78,41,5,218,16,95,103,101,116,95,109,111,100,117,108,101, + 95,105,110,102,111,218,16,95,103,101,116,95,109,111,100,117, + 108,101,95,112,97,116,104,218,7,95,105,115,95,100,105,114, + 114,29,0,0,0,114,20,0,0,0,41,5,114,32,0,0, + 0,218,8,102,117,108,108,110,97,109,101,114,13,0,0,0, + 218,2,109,105,218,7,109,111,100,112,97,116,104,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,218,11,102,105, + 110,100,95,108,111,97,100,101,114,109,0,0,0,115,14,0, + 0,0,0,10,10,1,8,2,8,7,10,1,10,4,24,2, + 122,23,122,105,112,105,109,112,111,114,116,101,114,46,102,105, + 110,100,95,108,111,97,100,101,114,99,3,0,0,0,0,0, 0,0,0,0,0,0,3,0,0,0,4,0,0,0,67,0, - 0,0,115,40,0,0,0,116,0,124,0,124,1,131,2,125, - 2,124,2,100,1,107,8,114,36,116,1,100,2,124,1,155, - 2,157,2,124,1,100,3,141,2,130,1,124,2,83,0,41, - 4,122,171,105,115,95,112,97,99,107,97,103,101,40,102,117, - 108,108,110,97,109,101,41,32,45,62,32,98,111,111,108,46, - 10,10,32,32,32,32,32,32,32,32,82,101,116,117,114,110, - 32,84,114,117,101,32,105,102,32,116,104,101,32,109,111,100, - 117,108,101,32,115,112,101,99,105,102,105,101,100,32,98,121, - 32,102,117,108,108,110,97,109,101,32,105,115,32,97,32,112, - 97,99,107,97,103,101,46,10,32,32,32,32,32,32,32,32, - 82,97,105,115,101,32,90,105,112,73,109,112,111,114,116,69, - 114,114,111,114,32,105,102,32,116,104,101,32,109,111,100,117, - 108,101,32,99,111,117,108,100,110,39,116,32,98,101,32,102, - 111,117,110,100,46,10,32,32,32,32,32,32,32,32,78,114, - 57,0,0,0,114,58,0,0,0,41,2,114,35,0,0,0, - 114,3,0,0,0,41,3,114,32,0,0,0,114,38,0,0, - 0,114,39,0,0,0,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,218,10,105,115,95,112,97,99,107,97,103, - 101,221,0,0,0,115,8,0,0,0,0,6,10,1,8,1, - 18,1,122,22,122,105,112,105,109,112,111,114,116,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,8,0,0,0,8,0,0,0,67, - 0,0,0,115,248,0,0,0,116,0,124,0,124,1,131,2, - 92,3,125,2,125,3,125,4,116,1,106,2,160,3,124,1, - 161,1,125,5,124,5,100,1,107,8,115,46,116,4,124,5, - 116,5,131,2,115,64,116,5,124,1,131,1,125,5,124,5, - 116,1,106,2,124,1,60,0,124,0,124,5,95,6,122,84, - 124,3,114,108,116,7,124,0,124,1,131,2,125,6,116,8, - 160,9,124,0,106,10,124,6,161,2,125,7,124,7,103,1, - 124,5,95,11,116,12,124,5,100,2,131,2,115,124,116,13, - 124,5,95,13,116,8,160,14,124,5,106,15,124,1,124,4, - 161,3,1,0,116,16,124,2,124,5,106,15,131,2,1,0, - 87,0,110,22,1,0,1,0,1,0,116,1,106,2,124,1, - 61,0,130,0,89,0,110,2,88,0,122,14,116,1,106,2, - 124,1,25,0,125,5,87,0,110,36,4,0,116,17,107,10, - 114,228,1,0,1,0,1,0,116,18,100,3,124,1,155,2, - 100,4,157,3,131,1,130,1,89,0,110,2,88,0,116,19, - 160,20,100,5,124,1,124,4,161,3,1,0,124,5,83,0, - 41,6,122,245,108,111,97,100,95,109,111,100,117,108,101,40, - 102,117,108,108,110,97,109,101,41,32,45,62,32,109,111,100, - 117,108,101,46,10,10,32,32,32,32,32,32,32,32,76,111, - 97,100,32,116,104,101,32,109,111,100,117,108,101,32,115,112, - 101,99,105,102,105,101,100,32,98,121,32,39,102,117,108,108, - 110,97,109,101,39,46,32,39,102,117,108,108,110,97,109,101, - 39,32,109,117,115,116,32,98,101,32,116,104,101,10,32,32, - 32,32,32,32,32,32,102,117,108,108,121,32,113,117,97,108, - 105,102,105,101,100,32,40,100,111,116,116,101,100,41,32,109, - 111,100,117,108,101,32,110,97,109,101,46,32,73,116,32,114, - 101,116,117,114,110,115,32,116,104,101,32,105,109,112,111,114, - 116,101,100,10,32,32,32,32,32,32,32,32,109,111,100,117, - 108,101,44,32,111,114,32,114,97,105,115,101,115,32,90,105, + 0,0,115,16,0,0,0,124,0,160,0,124,1,124,2,161, + 2,100,1,25,0,83,0,41,2,97,139,1,0,0,102,105, + 110,100,95,109,111,100,117,108,101,40,102,117,108,108,110,97, + 109,101,44,32,112,97,116,104,61,78,111,110,101,41,32,45, + 62,32,115,101,108,102,32,111,114,32,78,111,110,101,46,10, + 10,32,32,32,32,32,32,32,32,83,101,97,114,99,104,32, + 102,111,114,32,97,32,109,111,100,117,108,101,32,115,112,101, + 99,105,102,105,101,100,32,98,121,32,39,102,117,108,108,110, + 97,109,101,39,46,32,39,102,117,108,108,110,97,109,101,39, + 32,109,117,115,116,32,98,101,32,116,104,101,10,32,32,32, + 32,32,32,32,32,102,117,108,108,121,32,113,117,97,108,105, + 102,105,101,100,32,40,100,111,116,116,101,100,41,32,109,111, + 100,117,108,101,32,110,97,109,101,46,32,73,116,32,114,101, + 116,117,114,110,115,32,116,104,101,32,122,105,112,105,109,112, + 111,114,116,101,114,10,32,32,32,32,32,32,32,32,105,110, + 115,116,97,110,99,101,32,105,116,115,101,108,102,32,105,102, + 32,116,104,101,32,109,111,100,117,108,101,32,119,97,115,32, + 102,111,117,110,100,44,32,111,114,32,78,111,110,101,32,105, + 102,32,105,116,32,119,97,115,110,39,116,46,10,32,32,32, + 32,32,32,32,32,84,104,101,32,111,112,116,105,111,110,97, + 108,32,39,112,97,116,104,39,32,97,114,103,117,109,101,110, + 116,32,105,115,32,105,103,110,111,114,101,100,32,45,45,32, + 105,116,39,115,32,116,104,101,114,101,32,102,111,114,32,99, + 111,109,112,97,116,105,98,105,108,105,116,121,10,32,32,32, + 32,32,32,32,32,119,105,116,104,32,116,104,101,32,105,109, + 112,111,114,116,101,114,32,112,114,111,116,111,99,111,108,46, + 10,32,32,32,32,32,32,32,32,114,0,0,0,0,41,1, + 114,41,0,0,0,41,3,114,32,0,0,0,114,38,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,102,105,110,100,95,109,111,100,117, + 108,101,141,0,0,0,115,2,0,0,0,0,9,122,23,122, + 105,112,105,109,112,111,114,116,101,114,46,102,105,110,100,95, + 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,5,0,0,0,3,0,0,0,67,0,0,0,115, + 20,0,0,0,116,0,124,0,124,1,131,2,92,3,125,2, + 125,3,125,4,124,2,83,0,41,1,122,163,103,101,116,95, + 99,111,100,101,40,102,117,108,108,110,97,109,101,41,32,45, + 62,32,99,111,100,101,32,111,98,106,101,99,116,46,10,10, + 32,32,32,32,32,32,32,32,82,101,116,117,114,110,32,116, + 104,101,32,99,111,100,101,32,111,98,106,101,99,116,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,32,82,97,105,115,101,32,90, + 105,112,73,109,112,111,114,116,69,114,114,111,114,10,32,32, + 32,32,32,32,32,32,105,102,32,116,104,101,32,109,111,100, + 117,108,101,32,99,111,117,108,100,110,39,116,32,98,101,32, + 102,111,117,110,100,46,10,32,32,32,32,32,32,32,32,169, + 1,218,16,95,103,101,116,95,109,111,100,117,108,101,95,99, + 111,100,101,169,5,114,32,0,0,0,114,38,0,0,0,218, + 4,99,111,100,101,218,9,105,115,112,97,99,107,97,103,101, + 114,40,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,218,8,103,101,116,95,99,111,100,101,153,0, + 0,0,115,4,0,0,0,0,6,16,1,122,20,122,105,112, + 105,109,112,111,114,116,101,114,46,103,101,116,95,99,111,100, + 101,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,116,0,0,0,116, + 0,114,16,124,1,160,1,116,0,116,2,161,2,125,1,124, + 1,125,2,124,1,160,3,124,0,106,4,116,2,23,0,161, + 1,114,58,124,1,116,5,124,0,106,4,116,2,23,0,131, + 1,100,1,133,2,25,0,125,2,122,14,124,0,106,6,124, + 2,25,0,125,3,87,0,110,30,4,0,116,7,121,102,1, + 0,1,0,1,0,116,8,100,2,100,3,124,2,131,3,130, + 1,89,0,110,2,48,0,116,9,124,0,106,4,124,3,131, + 2,83,0,41,4,122,154,103,101,116,95,100,97,116,97,40, + 112,97,116,104,110,97,109,101,41,32,45,62,32,115,116,114, + 105,110,103,32,119,105,116,104,32,102,105,108,101,32,100,97, + 116,97,46,10,10,32,32,32,32,32,32,32,32,82,101,116, + 117,114,110,32,116,104,101,32,100,97,116,97,32,97,115,115, + 111,99,105,97,116,101,100,32,119,105,116,104,32,39,112,97, + 116,104,110,97,109,101,39,46,32,82,97,105,115,101,32,79, + 83,69,114,114,111,114,32,105,102,10,32,32,32,32,32,32, + 32,32,116,104,101,32,102,105,108,101,32,119,97,115,110,39, + 116,32,102,111,117,110,100,46,10,32,32,32,32,32,32,32, + 32,78,114,0,0,0,0,218,0,41,10,114,18,0,0,0, + 114,19,0,0,0,114,20,0,0,0,218,10,115,116,97,114, + 116,115,119,105,116,104,114,29,0,0,0,218,3,108,101,110, + 114,28,0,0,0,114,26,0,0,0,114,22,0,0,0,218, + 9,95,103,101,116,95,100,97,116,97,41,4,114,32,0,0, + 0,218,8,112,97,116,104,110,97,109,101,90,3,107,101,121, + 218,9,116,111,99,95,101,110,116,114,121,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,218,8,103,101,116,95, + 100,97,116,97,163,0,0,0,115,20,0,0,0,0,6,4, + 1,12,2,4,1,16,1,22,2,2,1,14,1,12,1,18, + 1,122,20,122,105,112,105,109,112,111,114,116,101,114,46,103, + 101,116,95,100,97,116,97,99,2,0,0,0,0,0,0,0, + 0,0,0,0,5,0,0,0,3,0,0,0,67,0,0,0, + 115,20,0,0,0,116,0,124,0,124,1,131,2,92,3,125, + 2,125,3,125,4,124,4,83,0,41,1,122,106,103,101,116, + 95,102,105,108,101,110,97,109,101,40,102,117,108,108,110,97, + 109,101,41,32,45,62,32,102,105,108,101,110,97,109,101,32, + 115,116,114,105,110,103,46,10,10,32,32,32,32,32,32,32, + 32,82,101,116,117,114,110,32,116,104,101,32,102,105,108,101, + 110,97,109,101,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,32, + 32,32,32,32,32,32,32,114,43,0,0,0,114,45,0,0, + 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 218,12,103,101,116,95,102,105,108,101,110,97,109,101,184,0, + 0,0,115,4,0,0,0,0,7,16,1,122,24,122,105,112, + 105,109,112,111,114,116,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,6,0,0,0,8,0,0,0,67,0,0,0,115,126, + 0,0,0,116,0,124,0,124,1,131,2,125,2,124,2,100, + 1,117,0,114,36,116,1,100,2,124,1,155,2,157,2,124, + 1,100,3,141,2,130,1,116,2,124,0,124,1,131,2,125, + 3,124,2,114,64,116,3,160,4,124,3,100,4,161,2,125, + 4,110,10,124,3,155,0,100,5,157,2,125,4,122,14,124, + 0,106,5,124,4,25,0,125,5,87,0,110,20,4,0,116, + 6,121,108,1,0,1,0,1,0,89,0,100,1,83,0,48, + 0,116,7,124,0,106,8,124,5,131,2,160,9,161,0,83, + 0,41,6,122,253,103,101,116,95,115,111,117,114,99,101,40, + 102,117,108,108,110,97,109,101,41,32,45,62,32,115,111,117, + 114,99,101,32,115,116,114,105,110,103,46,10,10,32,32,32, + 32,32,32,32,32,82,101,116,117,114,110,32,116,104,101,32, + 115,111,117,114,99,101,32,99,111,100,101,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,32,82,97,105,115,101,32,90,105,112,73, + 109,112,111,114,116,69,114,114,111,114,10,32,32,32,32,32, + 32,32,32,105,102,32,116,104,101,32,109,111,100,117,108,101, + 32,99,111,117,108,100,110,39,116,32,98,101,32,102,111,117, + 110,100,44,32,114,101,116,117,114,110,32,78,111,110,101,32, + 105,102,32,116,104,101,32,97,114,99,104,105,118,101,32,100, + 111,101,115,10,32,32,32,32,32,32,32,32,99,111,110,116, + 97,105,110,32,116,104,101,32,109,111,100,117,108,101,44,32, + 98,117,116,32,104,97,115,32,110,111,32,115,111,117,114,99, + 101,32,102,111,114,32,105,116,46,10,32,32,32,32,32,32, + 32,32,78,250,18,99,97,110,39,116,32,102,105,110,100,32, + 109,111,100,117,108,101,32,169,1,218,4,110,97,109,101,250, + 11,95,95,105,110,105,116,95,95,46,112,121,250,3,46,112, + 121,41,10,114,35,0,0,0,114,3,0,0,0,114,36,0, + 0,0,114,21,0,0,0,114,30,0,0,0,114,28,0,0, + 0,114,26,0,0,0,114,52,0,0,0,114,29,0,0,0, + 218,6,100,101,99,111,100,101,41,6,114,32,0,0,0,114, + 38,0,0,0,114,39,0,0,0,114,13,0,0,0,218,8, + 102,117,108,108,112,97,116,104,114,54,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,218,10,103,101, + 116,95,115,111,117,114,99,101,195,0,0,0,115,24,0,0, + 0,0,7,10,1,8,1,18,2,10,1,4,1,14,2,10, + 2,2,1,14,1,12,2,8,1,122,22,122,105,112,105,109, + 112,111,114,116,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,3,0, + 0,0,4,0,0,0,67,0,0,0,115,40,0,0,0,116, + 0,124,0,124,1,131,2,125,2,124,2,100,1,117,0,114, + 36,116,1,100,2,124,1,155,2,157,2,124,1,100,3,141, + 2,130,1,124,2,83,0,41,4,122,171,105,115,95,112,97, + 99,107,97,103,101,40,102,117,108,108,110,97,109,101,41,32, + 45,62,32,98,111,111,108,46,10,10,32,32,32,32,32,32, + 32,32,82,101,116,117,114,110,32,84,114,117,101,32,105,102, + 32,116,104,101,32,109,111,100,117,108,101,32,115,112,101,99, + 105,102,105,101,100,32,98,121,32,102,117,108,108,110,97,109, + 101,32,105,115,32,97,32,112,97,99,107,97,103,101,46,10, + 32,32,32,32,32,32,32,32,82,97,105,115,101,32,90,105, 112,73,109,112,111,114,116,69,114,114,111,114,32,105,102,32, - 105,116,32,119,97,115,110,39,116,32,102,111,117,110,100,46, - 10,32,32,32,32,32,32,32,32,78,218,12,95,95,98,117, - 105,108,116,105,110,115,95,95,122,14,76,111,97,100,101,100, - 32,109,111,100,117,108,101,32,122,25,32,110,111,116,32,102, - 111,117,110,100,32,105,110,32,115,121,115,46,109,111,100,117, - 108,101,115,122,30,105,109,112,111,114,116,32,123,125,32,35, - 32,108,111,97,100,101,100,32,102,114,111,109,32,90,105,112, - 32,123,125,41,21,114,44,0,0,0,218,3,115,121,115,218, - 7,109,111,100,117,108,101,115,218,3,103,101,116,114,15,0, - 0,0,218,12,95,109,111,100,117,108,101,95,116,121,112,101, - 218,10,95,95,108,111,97,100,101,114,95,95,114,36,0,0, - 0,114,21,0,0,0,114,30,0,0,0,114,29,0,0,0, - 90,8,95,95,112,97,116,104,95,95,218,7,104,97,115,97, - 116,116,114,114,66,0,0,0,90,14,95,102,105,120,95,117, - 112,95,109,111,100,117,108,101,218,8,95,95,100,105,99,116, - 95,95,218,4,101,120,101,99,114,26,0,0,0,218,11,73, - 109,112,111,114,116,69,114,114,111,114,218,10,95,98,111,111, - 116,115,116,114,97,112,218,16,95,118,101,114,98,111,115,101, - 95,109,101,115,115,97,103,101,41,8,114,32,0,0,0,114, - 38,0,0,0,114,46,0,0,0,114,47,0,0,0,114,40, - 0,0,0,90,3,109,111,100,114,13,0,0,0,114,63,0, + 116,104,101,32,109,111,100,117,108,101,32,99,111,117,108,100, + 110,39,116,32,98,101,32,102,111,117,110,100,46,10,32,32, + 32,32,32,32,32,32,78,114,57,0,0,0,114,58,0,0, + 0,41,2,114,35,0,0,0,114,3,0,0,0,41,3,114, + 32,0,0,0,114,38,0,0,0,114,39,0,0,0,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,218,10,105, + 115,95,112,97,99,107,97,103,101,221,0,0,0,115,8,0, + 0,0,0,6,10,1,8,1,18,1,122,22,122,105,112,105, + 109,112,111,114,116,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,8, + 0,0,0,8,0,0,0,67,0,0,0,115,246,0,0,0, + 116,0,124,0,124,1,131,2,92,3,125,2,125,3,125,4, + 116,1,106,2,160,3,124,1,161,1,125,5,124,5,100,1, + 117,0,115,46,116,4,124,5,116,5,131,2,115,64,116,5, + 124,1,131,1,125,5,124,5,116,1,106,2,124,1,60,0, + 124,0,124,5,95,6,122,84,124,3,114,108,116,7,124,0, + 124,1,131,2,125,6,116,8,160,9,124,0,106,10,124,6, + 161,2,125,7,124,7,103,1,124,5,95,11,116,12,124,5, + 100,2,131,2,115,124,116,13,124,5,95,13,116,8,160,14, + 124,5,106,15,124,1,124,4,161,3,1,0,116,16,124,2, + 124,5,106,15,131,2,1,0,87,0,110,22,1,0,1,0, + 1,0,116,1,106,2,124,1,61,0,130,0,89,0,110,2, + 48,0,122,14,116,1,106,2,124,1,25,0,125,5,87,0, + 110,34,4,0,116,17,121,226,1,0,1,0,1,0,116,18, + 100,3,124,1,155,2,100,4,157,3,131,1,130,1,89,0, + 110,2,48,0,116,19,160,20,100,5,124,1,124,4,161,3, + 1,0,124,5,83,0,41,6,122,245,108,111,97,100,95,109, + 111,100,117,108,101,40,102,117,108,108,110,97,109,101,41,32, + 45,62,32,109,111,100,117,108,101,46,10,10,32,32,32,32, + 32,32,32,32,76,111,97,100,32,116,104,101,32,109,111,100, + 117,108,101,32,115,112,101,99,105,102,105,101,100,32,98,121, + 32,39,102,117,108,108,110,97,109,101,39,46,32,39,102,117, + 108,108,110,97,109,101,39,32,109,117,115,116,32,98,101,32, + 116,104,101,10,32,32,32,32,32,32,32,32,102,117,108,108, + 121,32,113,117,97,108,105,102,105,101,100,32,40,100,111,116, + 116,101,100,41,32,109,111,100,117,108,101,32,110,97,109,101, + 46,32,73,116,32,114,101,116,117,114,110,115,32,116,104,101, + 32,105,109,112,111,114,116,101,100,10,32,32,32,32,32,32, + 32,32,109,111,100,117,108,101,44,32,111,114,32,114,97,105, + 115,101,115,32,90,105,112,73,109,112,111,114,116,69,114,114, + 111,114,32,105,102,32,105,116,32,119,97,115,110,39,116,32, + 102,111,117,110,100,46,10,32,32,32,32,32,32,32,32,78, + 218,12,95,95,98,117,105,108,116,105,110,115,95,95,122,14, + 76,111,97,100,101,100,32,109,111,100,117,108,101,32,122,25, + 32,110,111,116,32,102,111,117,110,100,32,105,110,32,115,121, + 115,46,109,111,100,117,108,101,115,122,30,105,109,112,111,114, + 116,32,123,125,32,35,32,108,111,97,100,101,100,32,102,114, + 111,109,32,90,105,112,32,123,125,41,21,114,44,0,0,0, + 218,3,115,121,115,218,7,109,111,100,117,108,101,115,218,3, + 103,101,116,114,15,0,0,0,218,12,95,109,111,100,117,108, + 101,95,116,121,112,101,218,10,95,95,108,111,97,100,101,114, + 95,95,114,36,0,0,0,114,21,0,0,0,114,30,0,0, + 0,114,29,0,0,0,90,8,95,95,112,97,116,104,95,95, + 218,7,104,97,115,97,116,116,114,114,66,0,0,0,90,14, + 95,102,105,120,95,117,112,95,109,111,100,117,108,101,218,8, + 95,95,100,105,99,116,95,95,218,4,101,120,101,99,114,26, + 0,0,0,218,11,73,109,112,111,114,116,69,114,114,111,114, + 218,10,95,98,111,111,116,115,116,114,97,112,218,16,95,118, + 101,114,98,111,115,101,95,109,101,115,115,97,103,101,41,8, + 114,32,0,0,0,114,38,0,0,0,114,46,0,0,0,114, + 47,0,0,0,114,40,0,0,0,90,3,109,111,100,114,13, + 0,0,0,114,63,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,11,108,111,97,100,95,109,111, + 100,117,108,101,234,0,0,0,115,48,0,0,0,0,7,16, + 1,12,1,18,1,8,1,10,1,6,2,2,1,4,3,10, + 1,14,1,8,2,10,1,6,1,16,1,16,1,6,1,8, + 1,8,2,2,1,14,1,12,1,22,1,14,1,122,23,122, + 105,112,105,109,112,111,114,116,101,114,46,108,111,97,100,95, + 109,111,100,117,108,101,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,122,20,124,0,160,0,124,1,161,1,115,18, + 87,0,100,1,83,0,87,0,110,20,4,0,116,1,121,40, + 1,0,1,0,1,0,89,0,100,1,83,0,48,0,116,2, + 106,3,115,76,100,2,100,3,108,4,109,5,125,2,1,0, + 124,2,160,6,116,2,161,1,1,0,100,4,116,2,95,3, + 116,2,124,0,124,1,131,2,83,0,41,5,122,204,82,101, + 116,117,114,110,32,116,104,101,32,82,101,115,111,117,114,99, + 101,82,101,97,100,101,114,32,102,111,114,32,97,32,112,97, + 99,107,97,103,101,32,105,110,32,97,32,122,105,112,32,102, + 105,108,101,46,10,10,32,32,32,32,32,32,32,32,73,102, + 32,39,102,117,108,108,110,97,109,101,39,32,105,115,32,97, + 32,112,97,99,107,97,103,101,32,119,105,116,104,105,110,32, + 116,104,101,32,122,105,112,32,102,105,108,101,44,32,114,101, + 116,117,114,110,32,116,104,101,10,32,32,32,32,32,32,32, + 32,39,82,101,115,111,117,114,99,101,82,101,97,100,101,114, + 39,32,111,98,106,101,99,116,32,102,111,114,32,116,104,101, + 32,112,97,99,107,97,103,101,46,32,32,79,116,104,101,114, + 119,105,115,101,32,114,101,116,117,114,110,32,78,111,110,101, + 46,10,32,32,32,32,32,32,32,32,78,114,0,0,0,0, + 41,1,218,14,82,101,115,111,117,114,99,101,82,101,97,100, + 101,114,84,41,7,114,65,0,0,0,114,3,0,0,0,218, + 24,95,90,105,112,73,109,112,111,114,116,82,101,115,111,117, + 114,99,101,82,101,97,100,101,114,218,11,95,114,101,103,105, + 115,116,101,114,101,100,90,13,105,109,112,111,114,116,108,105, + 98,46,97,98,99,114,79,0,0,0,90,8,114,101,103,105, + 115,116,101,114,41,3,114,32,0,0,0,114,38,0,0,0, + 114,79,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,218,19,103,101,116,95,114,101,115,111,117,114, + 99,101,95,114,101,97,100,101,114,16,1,0,0,115,20,0, + 0,0,0,6,2,1,10,1,10,1,12,1,8,1,6,1, + 12,1,10,1,6,1,122,31,122,105,112,105,109,112,111,114, + 116,101,114,46,103,101,116,95,114,101,115,111,117,114,99,101, + 95,114,101,97,100,101,114,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,100,1,124,0,106,0,155,0,116,1,155, + 0,124,0,106,2,155,0,100,2,157,5,83,0,41,3,78, + 122,21,60,122,105,112,105,109,112,111,114,116,101,114,32,111, + 98,106,101,99,116,32,34,122,2,34,62,41,3,114,29,0, + 0,0,114,20,0,0,0,114,31,0,0,0,41,1,114,32, + 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, + 0,0,218,8,95,95,114,101,112,114,95,95,34,1,0,0, + 115,2,0,0,0,0,1,122,20,122,105,112,105,109,112,111, + 114,116,101,114,46,95,95,114,101,112,114,95,95,41,1,78, + 41,1,78,41,15,114,6,0,0,0,114,7,0,0,0,114, + 8,0,0,0,218,7,95,95,100,111,99,95,95,114,34,0, + 0,0,114,41,0,0,0,114,42,0,0,0,114,48,0,0, + 0,114,55,0,0,0,114,56,0,0,0,114,64,0,0,0, + 114,65,0,0,0,114,78,0,0,0,114,82,0,0,0,114, + 83,0,0,0,114,9,0,0,0,114,9,0,0,0,114,9, + 0,0,0,114,10,0,0,0,114,4,0,0,0,45,0,0, + 0,115,24,0,0,0,8,1,4,17,8,46,10,32,10,12, + 8,10,8,21,8,11,8,26,8,13,8,38,8,18,122,12, + 95,95,105,110,105,116,95,95,46,112,121,99,84,114,60,0, + 0,0,70,41,3,122,4,46,112,121,99,84,70,41,3,114, + 61,0,0,0,70,70,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, + 20,0,0,0,124,0,106,0,124,1,160,1,100,1,161,1, + 100,2,25,0,23,0,83,0,41,3,78,218,1,46,233,2, + 0,0,0,41,2,114,31,0,0,0,218,10,114,112,97,114, + 116,105,116,105,111,110,41,2,114,32,0,0,0,114,38,0, 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, - 0,218,11,108,111,97,100,95,109,111,100,117,108,101,234,0, - 0,0,115,48,0,0,0,0,7,16,1,12,1,18,1,8, - 1,10,1,6,2,2,1,4,3,10,1,14,1,8,2,10, - 1,6,1,16,1,16,1,6,1,8,1,8,2,2,1,14, - 1,14,1,22,1,14,1,122,23,122,105,112,105,109,112,111, - 114,116,101,114,46,108,111,97,100,95,109,111,100,117,108,101, - 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,88,0,0,0,122,20, - 124,0,160,0,124,1,161,1,115,18,87,0,100,1,83,0, - 87,0,110,22,4,0,116,1,107,10,114,42,1,0,1,0, - 1,0,89,0,100,1,83,0,88,0,116,2,106,3,115,78, - 100,2,100,3,108,4,109,5,125,2,1,0,124,2,160,6, - 116,2,161,1,1,0,100,4,116,2,95,3,116,2,124,0, - 124,1,131,2,83,0,41,5,122,204,82,101,116,117,114,110, - 32,116,104,101,32,82,101,115,111,117,114,99,101,82,101,97, - 100,101,114,32,102,111,114,32,97,32,112,97,99,107,97,103, - 101,32,105,110,32,97,32,122,105,112,32,102,105,108,101,46, - 10,10,32,32,32,32,32,32,32,32,73,102,32,39,102,117, - 108,108,110,97,109,101,39,32,105,115,32,97,32,112,97,99, - 107,97,103,101,32,119,105,116,104,105,110,32,116,104,101,32, - 122,105,112,32,102,105,108,101,44,32,114,101,116,117,114,110, - 32,116,104,101,10,32,32,32,32,32,32,32,32,39,82,101, - 115,111,117,114,99,101,82,101,97,100,101,114,39,32,111,98, - 106,101,99,116,32,102,111,114,32,116,104,101,32,112,97,99, - 107,97,103,101,46,32,32,79,116,104,101,114,119,105,115,101, - 32,114,101,116,117,114,110,32,78,111,110,101,46,10,32,32, - 32,32,32,32,32,32,78,114,0,0,0,0,41,1,218,14, - 82,101,115,111,117,114,99,101,82,101,97,100,101,114,84,41, - 7,114,65,0,0,0,114,3,0,0,0,218,24,95,90,105, - 112,73,109,112,111,114,116,82,101,115,111,117,114,99,101,82, - 101,97,100,101,114,218,11,95,114,101,103,105,115,116,101,114, - 101,100,90,13,105,109,112,111,114,116,108,105,98,46,97,98, - 99,114,79,0,0,0,90,8,114,101,103,105,115,116,101,114, - 41,3,114,32,0,0,0,114,38,0,0,0,114,79,0,0, - 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, - 218,19,103,101,116,95,114,101,115,111,117,114,99,101,95,114, - 101,97,100,101,114,16,1,0,0,115,20,0,0,0,0,6, - 2,1,10,1,10,1,14,1,8,1,6,1,12,1,10,1, - 6,1,122,31,122,105,112,105,109,112,111,114,116,101,114,46, - 103,101,116,95,114,101,115,111,117,114,99,101,95,114,101,97, - 100,101,114,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,100,1,124,0,106,0,155,0,116,1,155,0,124,0,106, - 2,155,0,100,2,157,5,83,0,41,3,78,122,21,60,122, - 105,112,105,109,112,111,114,116,101,114,32,111,98,106,101,99, - 116,32,34,122,2,34,62,41,3,114,29,0,0,0,114,20, - 0,0,0,114,31,0,0,0,41,1,114,32,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,8, - 95,95,114,101,112,114,95,95,34,1,0,0,115,2,0,0, - 0,0,1,122,20,122,105,112,105,109,112,111,114,116,101,114, - 46,95,95,114,101,112,114,95,95,41,1,78,41,1,78,41, - 15,114,6,0,0,0,114,7,0,0,0,114,8,0,0,0, - 218,7,95,95,100,111,99,95,95,114,34,0,0,0,114,41, - 0,0,0,114,42,0,0,0,114,48,0,0,0,114,55,0, - 0,0,114,56,0,0,0,114,64,0,0,0,114,65,0,0, - 0,114,78,0,0,0,114,82,0,0,0,114,83,0,0,0, - 114,9,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,114,4,0,0,0,45,0,0,0,115,24,0, - 0,0,8,1,4,17,8,46,10,32,10,12,8,10,8,21, - 8,11,8,26,8,13,8,38,8,18,122,12,95,95,105,110, - 105,116,95,95,46,112,121,99,84,114,60,0,0,0,70,41, - 3,122,4,46,112,121,99,84,70,41,3,114,61,0,0,0, - 70,70,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,20,0,0,0, - 124,0,106,0,124,1,160,1,100,1,161,1,100,2,25,0, - 23,0,83,0,41,3,78,218,1,46,233,2,0,0,0,41, - 2,114,31,0,0,0,218,10,114,112,97,114,116,105,116,105, - 111,110,41,2,114,32,0,0,0,114,38,0,0,0,114,9, - 0,0,0,114,9,0,0,0,114,10,0,0,0,114,36,0, - 0,0,52,1,0,0,115,2,0,0,0,0,1,114,36,0, - 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,2,0,0,0,67,0,0,0,115,18,0,0,0, - 124,1,116,0,23,0,125,2,124,2,124,0,106,1,107,6, - 83,0,169,1,78,41,2,114,20,0,0,0,114,28,0,0, - 0,41,3,114,32,0,0,0,114,13,0,0,0,90,7,100, - 105,114,112,97,116,104,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,114,37,0,0,0,56,1,0,0,115,4, - 0,0,0,0,4,8,2,114,37,0,0,0,99,2,0,0, - 0,0,0,0,0,0,0,0,0,7,0,0,0,4,0,0, - 0,67,0,0,0,115,56,0,0,0,116,0,124,0,124,1, - 131,2,125,2,116,1,68,0,93,36,92,3,125,3,125,4, - 125,5,124,2,124,3,23,0,125,6,124,6,124,0,106,2, - 107,6,114,14,124,5,2,0,1,0,83,0,113,14,100,0, - 83,0,114,88,0,0,0,41,3,114,36,0,0,0,218,16, - 95,122,105,112,95,115,101,97,114,99,104,111,114,100,101,114, - 114,28,0,0,0,41,7,114,32,0,0,0,114,38,0,0, - 0,114,13,0,0,0,218,6,115,117,102,102,105,120,218,10, - 105,115,98,121,116,101,99,111,100,101,114,47,0,0,0,114, - 63,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, - 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,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, + 0,114,36,0,0,0,52,1,0,0,115,2,0,0,0,0, + 1,114,36,0,0,0,99,2,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,2,0,0,0,67,0,0,0,115, + 18,0,0,0,124,1,116,0,23,0,125,2,124,2,124,0, + 106,1,118,0,83,0,169,1,78,41,2,114,20,0,0,0, + 114,28,0,0,0,41,3,114,32,0,0,0,114,13,0,0, + 0,90,7,100,105,114,112,97,116,104,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,114,37,0,0,0,56,1, + 0,0,115,4,0,0,0,0,4,8,2,114,37,0,0,0, + 99,2,0,0,0,0,0,0,0,0,0,0,0,7,0,0, + 0,4,0,0,0,67,0,0,0,115,56,0,0,0,116,0, + 124,0,124,1,131,2,125,2,116,1,68,0,93,36,92,3, + 125,3,125,4,125,5,124,2,124,3,23,0,125,6,124,6, + 124,0,106,2,118,0,114,14,124,5,2,0,1,0,83,0, + 113,14,100,0,83,0,114,88,0,0,0,41,3,114,36,0, + 0,0,218,16,95,122,105,112,95,115,101,97,114,99,104,111, + 114,100,101,114,114,28,0,0,0,41,7,114,32,0,0,0, + 114,38,0,0,0,114,13,0,0,0,218,6,115,117,102,102, + 105,120,218,10,105,115,98,121,116,101,99,111,100,101,114,47, + 0,0,0,114,63,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,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, + 2,5,0,0,122,14,116,0,160,1,124,0,161,1,125,1, + 87,0,110,36,4,0,116,2,121,50,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,48,0,124,1,144,4,143,164,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,36,4,0,116,2,121,132,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, + 141,2,130,1,89,0,110,2,48,0,116,8,124,3,131,1, + 116,5,107,3,114,164,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, + 25,0,116,9,107,3,144,1,114,170,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, + 87,0,110,36,4,0,116,2,121,242,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,48,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,38,4,0,116,2,144,1,121,66,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,48,0,124,6,160,12,116,9,161,1, + 125,7,124,7,100,6,107,0,144,1,114,106,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,154,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,230,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,2,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,46, + 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,38,4,0,116,2,144,2, + 121,106,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,48,0, + 124,1,160,7,100,15,161,1,125,3,116,8,124,3,131,1, + 100,5,107,0,144,2,114,140,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,162,144,4,113,208,116,8,124,3,131,1,100,15,107,3, + 144,2,114,184,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,144,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,38,4,0,116,2, + 144,3,121,204,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, + 48,0,116,8,124,23,131,1,124,19,107,3,144,3,114,238, + 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,30, + 116,3,100,4,124,0,155,2,157,2,124,0,100,2,141,2, + 130,1,87,0,110,38,4,0,116,2,144,4,121,70,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,5,100, - 6,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,4,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,70,114,0,0,0,0,169,1,218, - 10,100,101,99,111,109,112,114,101,115,115,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,60,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,22,4,0,116,2,107,10, - 114,50,1,0,1,0,1,0,89,0,100,0,83,0,88,0, - 124,6,100,2,64,0,100,3,107,3,125,7,124,7,114,182, - 124,6,100,4,64,0,100,3,107,3,125,8,116,3,106,4, - 100,5,107,3,114,180,124,8,115,104,116,3,106,4,100,6, - 107,2,114,180,116,5,124,0,124,2,131,2,125,9,124,9, - 100,0,107,9,114,180,116,3,160,6,116,0,106,7,124,9, - 161,2,125,10,122,20,116,0,160,8,124,4,124,10,124,3, - 124,5,161,4,1,0,87,0,110,22,4,0,116,2,107,10, - 114,178,1,0,1,0,1,0,89,0,100,0,83,0,88,0, - 110,84,116,9,124,0,124,2,131,2,92,2,125,11,125,12, - 124,11,144,1,114,10,116,10,116,11,124,4,100,7,100,8, - 133,2,25,0,131,1,124,11,131,2,114,246,116,11,124,4, - 100,8,100,9,133,2,25,0,131,1,124,12,107,3,144,1, - 114,10,116,12,160,13,100,10,124,3,155,2,157,2,161,1, - 1,0,100,0,83,0,116,14,160,15,124,4,100,9,100,0, - 133,2,25,0,161,1,125,13,116,16,124,13,116,17,131,2, - 144,1,115,56,116,18,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,19,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,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,8,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, - 10,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, + 100,2,141,2,130,1,89,0,110,2,48,0,124,13,100,28, + 64,0,144,4,114,92,124,23,160,16,161,0,125,23,110,52, + 122,14,124,23,160,16,100,29,161,1,125,23,87,0,110,36, + 4,0,116,17,144,4,121,142,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,48,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,108,87,0,100,0,4,0,4,0,131,3,1,0, + 110,18,49,0,144,4,115,230,48,0,1,0,1,0,1,0, + 89,0,1,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,12,1,24,2,8,1,2,1,14,1,8, + 1,14,1,12,1,24,1,12,1,18,1,18,3,2,1,12, + 1,12,1,12,1,10,1,2,255,12,2,8,1,2,255,2, + 1,2,255,4,2,2,1,10,1,12,1,14,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,14,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,14,1,24,1,14,1,18, + 4,2,1,28,1,22,1,14,1,24,2,10,2,10,3,2, + 1,14,1,14,1,22,2,12,1,12,1,20,1,8,1,44, + 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,110,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,62,122,16,100,4,100,5,108,4,109,5,125, + 0,1,0,87,0,110,36,4,0,116,6,121,80,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,48,0,87,0,100,6,97, + 0,110,6,100,6,97,0,48,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,12,1,10,1,16, + 2,12,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,144,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,14,125,10,122,14,124,10,160,3, + 124,6,161,1,1,0,87,0,110,36,4,0,116,4,121,100, + 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,48,0,124,10, + 160,5,100,5,161,1,125,11,116,6,124,11,131,1,100,5, + 107,3,114,132,116,7,100,6,131,1,130,1,124,11,100,0, + 100,7,133,2,25,0,100,8,107,3,114,166,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,38,4,0,116,4,144,1,121,14,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,48,0,124,10,160,5,124,4,161,1, + 125,15,116,6,124,15,131,1,124,4,107,3,144,1,114,48, + 116,4,100,12,131,1,130,1,87,0,100,0,4,0,4,0, + 131,3,1,0,110,18,49,0,144,1,115,70,48,0,1,0, + 1,0,1,0,89,0,1,0,124,3,100,1,107,2,144,1, + 114,94,124,15,83,0,122,10,116,9,131,0,125,16,87,0, + 110,28,4,0,116,10,144,1,121,132,1,0,1,0,1,0, + 116,0,100,13,131,1,130,1,89,0,110,2,48,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,12,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,14,1, + 24,1,10,1,14,1,40,2,10,2,4,3,2,1,10,1, + 14,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, - 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, + 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,56,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,20,4,0,116,2,121,48,1,0,1,0, + 1,0,89,0,100,0,83,0,48,0,124,6,100,2,64,0, + 100,3,107,3,125,7,124,7,114,178,124,6,100,4,64,0, + 100,3,107,3,125,8,116,3,106,4,100,5,107,3,114,176, + 124,8,115,102,116,3,106,4,100,6,107,2,114,176,116,5, + 124,0,124,2,131,2,125,9,124,9,100,0,117,1,114,176, + 116,3,160,6,116,0,106,7,124,9,161,2,125,10,122,20, + 116,0,160,8,124,4,124,10,124,3,124,5,161,4,1,0, + 87,0,110,20,4,0,116,2,121,174,1,0,1,0,1,0, + 89,0,100,0,83,0,48,0,110,84,116,9,124,0,124,2, + 131,2,92,2,125,11,125,12,124,11,144,1,114,6,116,10, + 116,11,124,4,100,7,100,8,133,2,25,0,131,1,124,11, + 131,2,114,242,116,11,124,4,100,8,100,9,133,2,25,0, + 131,1,124,12,107,3,144,1,114,6,116,12,160,13,100,10, + 124,3,155,2,157,2,161,1,1,0,100,0,83,0,116,14, + 160,15,124,4,100,9,100,0,133,2,25,0,161,1,125,13, + 116,16,124,13,116,17,131,2,144,1,115,52,116,18,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,19,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,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,82,0,0,0,0,2,2,1, + 2,254,6,5,2,1,18,1,12,1,8,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,8,255,8,2, + 12,1,10,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,18,0,0,0, + 0,1,4,1,10,1,10,1,6,1,6,1,10,1,10,1, + 6,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,114,0,0,0,122,82,124,1,100,1,100,0,133,2,25, + 0,100,2,118,0,115,22,74,0,130,1,124,1,100,0,100, + 1,133,2,25,0,125,1,124,0,106,0,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,1,124,4,124,3,131, + 2,124,5,102,2,87,0,83,0,4,0,116,2,116,3,116, + 4,102,3,121,108,1,0,1,0,1,0,89,0,100,6,83, + 0,48,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,5,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,18,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,84,0,0,0,124,1,100,1,100,0,133,2,25,0, + 100,2,118,0,115,20,74,0,130,1,124,1,100,0,100,1, + 133,2,25,0,125,1,122,14,124,0,106,0,124,1,25,0, + 125,2,87,0,110,20,4,0,116,1,121,66,1,0,1,0, + 1,0,89,0,100,0,83,0,48,0,116,2,124,0,106,3, + 124,2,131,2,83,0,100,0,83,0,41,3,78,114,14,0, + 0,0,114,170,0,0,0,41,4,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,12,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,196,0,0,0,116,0,124,0, + 124,1,131,2,125,2,116,1,68,0,93,158,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,18,4,0,116,7,121,86,1,0,1,0,1,0,89,0, + 113,14,48,0,124,7,100,4,25,0,125,8,116,8,124,0, + 106,4,124,7,131,2,125,9,124,4,114,130,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,117,0,114,150, + 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,12,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,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, + 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,90,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,121,84,1,0,1, + 0,1,0,116,7,124,3,131,1,130,1,89,0,110,2,48, + 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,176,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,176,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,12,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,177,0,0,0,41,2,114,32,0,0,0,114,178,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, + 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,70,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,20,4,0, + 116,4,121,64,1,0,1,0,1,0,89,0,100,3,83,0, + 48,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,179,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,12,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,184,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,74,0,130,1,124,3,106,8,125,4,116,9,131, + 0,125,5,124,0,106,2,106,10,68,0,93,100,125,6,122, + 18,124,1,124,6,131,1,160,5,124,4,161,1,125,7,87, + 0,110,22,4,0,116,11,121,122,1,0,1,0,1,0,89, + 0,113,78,89,0,110,2,48,0,124,7,106,8,106,7,125, + 8,116,12,124,8,131,1,100,1,107,2,114,154,124,7,106, + 7,86,0,1,0,113,78,124,8,124,5,118,1,114,78,124, + 5,160,13,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,14,90,7,112,97, + 116,104,108,105,98,114,183,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, + 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,183,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,12,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,180,0,0,0,114,181,0,0,0,114,182,0,0,0,114, + 187,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/initconfig.c b/Python/initconfig.c index a930b5d38fa26ba9ae16b98bddbd11efff35d08f..3caed385ef6af5b9bf86ff8184151def31c7cedd 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -1,27 +1,33 @@ #include "Python.h" -#include "osdefs.h" /* DELIM */ -#include "pycore_fileutils.h" -#include "pycore_getopt.h" -#include "pycore_initconfig.h" -#include "pycore_pathconfig.h" -#include "pycore_pyerrors.h" -#include "pycore_pylifecycle.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" /* _PyRuntime */ -#include /* setlocale() */ +#include "pycore_fileutils.h" // _Py_HasFileSystemDefaultEncodeErrors +#include "pycore_getopt.h" // _PyOS_GetOpt() +#include "pycore_initconfig.h" // _PyStatus_OK() +#include "pycore_interp.h" // _PyInterpreterState.runtime +#include "pycore_pathconfig.h" // _Py_path_config +#include "pycore_pyerrors.h" // _PyErr_Fetch() +#include "pycore_pylifecycle.h" // _Py_PreInitializeFromConfig() +#include "pycore_pymem.h" // _PyMem_SetDefaultAllocator() +#include "pycore_pystate.h" // _PyThreadState_GET() + +#include "osdefs.h" // DELIM +#include // setlocale() #ifdef HAVE_LANGINFO_H -# include /* nl_langinfo(CODESET) */ +# include // nl_langinfo(CODESET) #endif #if defined(MS_WINDOWS) || defined(__CYGWIN__) -# include /* GetACP() */ +# include // GetACP() # ifdef HAVE_IO_H # include # endif # ifdef HAVE_FCNTL_H -# include /* O_BINARY */ +# include // O_BINARY # endif #endif +#ifndef PLATLIBDIR +# error "PLATLIBDIR macro must be defined" +#endif + /* --- Command line options --------------------------------------- */ @@ -36,7 +42,8 @@ Options and arguments (and corresponding environment variables):\n\ and comparing bytes/bytearray with str. (-bb: issue errors)\n\ -B : don't write .pyc files on import; also PYTHONDONTWRITEBYTECODE=x\n\ -c cmd : program passed in as string (terminates option list)\n\ --d : debug output from parser; also PYTHONDEBUG=x\n\ +-d : turn on parser debugging output (for experts only, only works on\n\ + debug builds); also PYTHONDEBUG=x\n\ -E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\ -h : print this help message and exit (also --help)\n\ "; @@ -66,6 +73,7 @@ static const char usage_3[] = "\ -X opt : set implementation-specific option. The following options are available:\n\ \n\ -X faulthandler: enable faulthandler\n\ + -X oldparser: enable the traditional LL(1) parser; also PYTHONOLDPARSER\n\ -X showrefcount: output the total reference count and number of used\n\ memory blocks when the program finishes or after each statement in the\n\ interactive interpreter. This only works on debug builds\n\ @@ -73,14 +81,11 @@ static const char usage_3[] = "\ tracemalloc module. By default, only the most recent frame is stored in a\n\ traceback of a trace. Use -X tracemalloc=NFRAME to start tracing with a\n\ traceback limit of NFRAME frames\n\ - -X showalloccount: output the total count of allocated objects for each\n\ - type when the program finishes. This only works when Python was built with\n\ - COUNT_ALLOCS defined\n\ -X importtime: show how long each import takes. It shows module name,\n\ cumulative time (including nested imports) and self time (excluding\n\ nested imports). Note that its output may be broken in multi-threaded\n\ application. Typical usage is python3 -X importtime -c 'import asyncio'\n\ - -X dev: enable CPython’s “development mode”, introducing additional runtime\n\ + -X dev: enable CPython's \"development mode\", introducing additional runtime\n\ checks which are too expensive to be enabled by default. Effect of the\n\ developer mode:\n\ * Add default warning filter, as -W default\n\ @@ -110,6 +115,7 @@ PYTHONPATH : '%lc'-separated list of directories prefixed to the\n\ static const char usage_5[] = "PYTHONHOME : alternate directory (or %lc).\n" " The default module search path uses %s.\n" +"PYTHONPLATLIBDIR : override sys.platlibdir.\n" "PYTHONCASEOK : ignore case in 'import' statements (Windows).\n" "PYTHONUTF8: if set to 1, enable the UTF-8 mode.\n" "PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n" @@ -543,8 +549,6 @@ _Py_SetArgcArgv(Py_ssize_t argc, wchar_t * const *argv) } -/* Make the *original* argc/argv available to other modules. - This is rare, but it is needed by the secureware extension. */ void Py_GetArgcArgv(int *argc, wchar_t ***argv) { @@ -588,6 +592,7 @@ PyConfig_Clear(PyConfig *config) CLEAR(config->base_prefix); CLEAR(config->exec_prefix); CLEAR(config->base_exec_prefix); + CLEAR(config->platlibdir); CLEAR(config->filesystem_encoding); CLEAR(config->filesystem_errors); @@ -597,6 +602,8 @@ PyConfig_Clear(PyConfig *config) CLEAR(config->run_module); CLEAR(config->run_filename); CLEAR(config->check_hash_pycs_mode); + + _PyWideStringList_Clear(&config->_orig_argv); #undef CLEAR } @@ -632,9 +639,11 @@ _PyConfig_InitCompatConfig(PyConfig *config) config->check_hash_pycs_mode = NULL; config->pathconfig_warnings = -1; config->_init_main = 1; + config->_isolated_interpreter = 0; #ifdef MS_WINDOWS config->legacy_windows_stdio = -1; #endif + config->_use_peg_parser = 1; } @@ -792,6 +801,7 @@ _PyConfig_Copy(PyConfig *config, const PyConfig *config2) COPY_ATTR(isolated); COPY_ATTR(use_environment); COPY_ATTR(dev_mode); + COPY_ATTR(_use_peg_parser); COPY_ATTR(install_signal_handlers); COPY_ATTR(use_hash_seed); COPY_ATTR(hash_seed); @@ -800,7 +810,6 @@ _PyConfig_Copy(PyConfig *config, const PyConfig *config2) COPY_ATTR(tracemalloc); COPY_ATTR(import_time); COPY_ATTR(show_ref_count); - COPY_ATTR(show_alloc_count); COPY_ATTR(dump_refs); COPY_ATTR(malloc_stats); @@ -822,6 +831,7 @@ _PyConfig_Copy(PyConfig *config, const PyConfig *config2) COPY_WSTR_ATTR(base_prefix); COPY_WSTR_ATTR(exec_prefix); COPY_WSTR_ATTR(base_exec_prefix); + COPY_WSTR_ATTR(platlibdir); COPY_ATTR(site_import); COPY_ATTR(bytes_warning); @@ -849,6 +859,8 @@ _PyConfig_Copy(PyConfig *config, const PyConfig *config2) COPY_WSTR_ATTR(check_hash_pycs_mode); COPY_ATTR(pathconfig_warnings); COPY_ATTR(_init_main); + COPY_ATTR(_isolated_interpreter); + COPY_WSTRLIST(_orig_argv); #undef COPY_ATTR #undef COPY_WSTR_ATTR @@ -896,6 +908,7 @@ config_as_dict(const PyConfig *config) SET_ITEM_INT(isolated); SET_ITEM_INT(use_environment); SET_ITEM_INT(dev_mode); + SET_ITEM_INT(_use_peg_parser); SET_ITEM_INT(install_signal_handlers); SET_ITEM_INT(use_hash_seed); SET_ITEM_UINT(hash_seed); @@ -903,7 +916,6 @@ config_as_dict(const PyConfig *config) SET_ITEM_INT(tracemalloc); SET_ITEM_INT(import_time); SET_ITEM_INT(show_ref_count); - SET_ITEM_INT(show_alloc_count); SET_ITEM_INT(dump_refs); SET_ITEM_INT(malloc_stats); SET_ITEM_WSTR(filesystem_encoding); @@ -923,6 +935,7 @@ config_as_dict(const PyConfig *config) SET_ITEM_WSTR(base_prefix); SET_ITEM_WSTR(exec_prefix); SET_ITEM_WSTR(base_exec_prefix); + SET_ITEM_WSTR(platlibdir); SET_ITEM_INT(site_import); SET_ITEM_INT(bytes_warning); SET_ITEM_INT(inspect); @@ -948,6 +961,8 @@ config_as_dict(const PyConfig *config) SET_ITEM_WSTR(check_hash_pycs_mode); SET_ITEM_INT(pathconfig_warnings); SET_ITEM_INT(_init_main); + SET_ITEM_INT(_isolated_interpreter); + SET_ITEM_WSTRLIST(_orig_argv); return dict; @@ -1119,7 +1134,7 @@ config_init_program_name(PyConfig *config) or rather, to work around Apple's overly strict requirements of the process name. However, we still need a usable sys.executable, so the actual executable path is passed in an environment variable. - See Lib/plat-mac/bundlebuiler.py for details about the bootstrap + See Lib/plat-mac/bundlebuilder.py for details about the bootstrap script. */ const char *p = config_get_env(config, "PYTHONEXECUTABLE"); if (p != NULL) { @@ -1332,6 +1347,14 @@ config_read_env_vars(PyConfig *config) } } + if(config->platlibdir == NULL) { + status = CONFIG_GET_ENV_DUP(config, &config->platlibdir, + L"PYTHONPLATLIBDIR", "PYTHONPLATLIBDIR"); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + } + if (config->use_hash_seed < 0) { status = config_init_hash_seed(config); if (_PyStatus_EXCEPTION(status)) { @@ -1431,6 +1454,11 @@ config_read_complex_options(PyConfig *config) config->import_time = 1; } + if (config_get_env(config, "PYTHONOLDPARSER") + || config_get_xoption(config, L"oldparser")) { + config->_use_peg_parser = 0; + } + PyStatus status; if (config->tracemalloc < 0) { status = config_init_tracemalloc(config); @@ -1450,7 +1478,7 @@ config_read_complex_options(PyConfig *config) static const wchar_t * -config_get_stdio_errors(const PyConfig *config) +config_get_stdio_errors(void) { #ifndef MS_WINDOWS const char *loc = setlocale(LC_CTYPE, NULL); @@ -1606,7 +1634,7 @@ config_init_stdio_encoding(PyConfig *config, } } if (config->stdio_errors == NULL) { - const wchar_t *errors = config_get_stdio_errors(config); + const wchar_t *errors = config_get_stdio_errors(); assert(errors != NULL); status = PyConfig_SetString(config, &config->stdio_errors, errors); @@ -1702,9 +1730,6 @@ config_read(PyConfig *config) if (config_get_xoption(config, L"showrefcount")) { config->show_ref_count = 1; } - if (config_get_xoption(config, L"showalloccount")) { - config->show_alloc_count = 1; - } status = config_read_complex_options(config); if (_PyStatus_EXCEPTION(status)) { @@ -1725,6 +1750,14 @@ config_read(PyConfig *config) } } + if(config->platlibdir == NULL) { + status = CONFIG_SET_BYTES_STR(config, &config->platlibdir, PLATLIBDIR, + "PLATLIBDIR macro"); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + } + if (config->_install_importlib) { status = _PyConfig_InitPathConfig(config); if (_PyStatus_EXCEPTION(status)) { @@ -1826,7 +1859,7 @@ config_init_stdio(const PyConfig *config) - set Py_xxx global configuration variables - initialize C standard streams (stdin, stdout, stderr) */ -void +PyStatus _PyConfig_Write(const PyConfig *config, _PyRuntimeState *runtime) { config_set_global_vars(config); @@ -1840,6 +1873,13 @@ _PyConfig_Write(const PyConfig *config, _PyRuntimeState *runtime) preconfig->isolated = config->isolated; preconfig->use_environment = config->use_environment; preconfig->dev_mode = config->dev_mode; + + if (_Py_SetArgcArgv(config->_orig_argv.length, + config->_orig_argv.items) < 0) + { + return _PyStatus_NO_MEMORY(); + } + return _PyStatus_OK(); } @@ -2241,6 +2281,7 @@ config_update_argv(PyConfig *config, Py_ssize_t opt_index) /* Force sys.argv[0] = '-m'*/ arg0 = L"-m"; } + if (arg0 != NULL) { arg0 = _PyMem_RawWcsdup(arg0); if (arg0 == NULL) { @@ -2291,6 +2332,37 @@ core_read_precmdline(PyConfig *config, _PyPreCmdline *precmdline) } +/* Get run_filename absolute path */ +static PyStatus +config_run_filename_abspath(PyConfig *config) +{ + if (!config->run_filename) { + return _PyStatus_OK(); + } + +#ifndef MS_WINDOWS + if (_Py_isabs(config->run_filename)) { + /* path is already absolute */ + return _PyStatus_OK(); + } +#endif + + wchar_t *abs_filename; + if (_Py_abspath(config->run_filename, &abs_filename) < 0) { + /* failed to get the absolute path of the command line filename: + ignore the error, keep the relative path */ + return _PyStatus_OK(); + } + if (abs_filename == NULL) { + return _PyStatus_NO_MEMORY(); + } + + PyMem_RawFree(config->run_filename); + config->run_filename = abs_filename; + return _PyStatus_OK(); +} + + static PyStatus config_read_cmdline(PyConfig *config) { @@ -2317,11 +2389,22 @@ config_read_cmdline(PyConfig *config) goto done; } + status = config_run_filename_abspath(config); + if (_PyStatus_EXCEPTION(status)) { + goto done; + } + status = config_update_argv(config, opt_index); if (_PyStatus_EXCEPTION(status)) { goto done; } } + else { + status = config_run_filename_abspath(config); + if (_PyStatus_EXCEPTION(status)) { + goto done; + } + } if (config->use_environment) { status = config_init_env_warnoptions(config, &env_warnoptions); @@ -2420,7 +2503,6 @@ PyStatus PyConfig_Read(PyConfig *config) { PyStatus status; - PyWideStringList orig_argv = _PyWideStringList_INIT; status = _Py_PreInitializeFromConfig(config, NULL); if (_PyStatus_EXCEPTION(status)) { @@ -2429,8 +2511,13 @@ PyConfig_Read(PyConfig *config) config_get_global_vars(config); - if (_PyWideStringList_Copy(&orig_argv, &config->argv) < 0) { - return _PyStatus_NO_MEMORY(); + if (config->_orig_argv.length == 0 + && !(config->argv.length == 1 + && wcscmp(config->argv.items[0], L"") == 0)) + { + if (_PyWideStringList_Copy(&config->_orig_argv, &config->argv) < 0) { + return _PyStatus_NO_MEMORY(); + } } _PyPreCmdline precmdline = _PyPreCmdline_INIT; @@ -2461,15 +2548,11 @@ PyConfig_Read(PyConfig *config) goto done; } - if (_Py_SetArgcArgv(orig_argv.length, orig_argv.items) < 0) { - status = _PyStatus_NO_MEMORY(); - goto done; - } - /* Check config consistency */ assert(config->isolated >= 0); assert(config->use_environment >= 0); assert(config->dev_mode >= 0); + assert(config->_use_peg_parser >= 0); assert(config->install_signal_handlers >= 0); assert(config->use_hash_seed >= 0); assert(config->faulthandler >= 0); @@ -2504,6 +2587,7 @@ PyConfig_Read(PyConfig *config) assert(config->exec_prefix != NULL); assert(config->base_exec_prefix != NULL); } + assert(config->platlibdir != NULL); assert(config->filesystem_encoding != NULL); assert(config->filesystem_errors != NULL); assert(config->stdio_encoding != NULL); @@ -2516,11 +2600,11 @@ PyConfig_Read(PyConfig *config) assert(config->check_hash_pycs_mode != NULL); assert(config->_install_importlib >= 0); assert(config->pathconfig_warnings >= 0); + assert(_PyWideStringList_CheckConsistency(&config->_orig_argv)); status = _PyStatus_OK(); done: - _PyWideStringList_Clear(&orig_argv); _PyPreCmdline_Clear(&precmdline); return status; } @@ -2548,8 +2632,8 @@ _Py_GetConfigsAsDict(void) Py_CLEAR(dict); /* pre config */ - PyInterpreterState *interp = _PyInterpreterState_Get(); - const PyPreConfig *pre_config = &_PyRuntime.preconfig; + PyThreadState *tstate = _PyThreadState_GET(); + const PyPreConfig *pre_config = &tstate->interp->runtime->preconfig; dict = _PyPreConfig_AsDict(pre_config); if (dict == NULL) { goto error; @@ -2560,7 +2644,7 @@ _Py_GetConfigsAsDict(void) Py_CLEAR(dict); /* core config */ - const PyConfig *config = &interp->config; + const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); dict = config_as_dict(config); if (dict == NULL) { goto error; @@ -2589,11 +2673,11 @@ init_dump_ascii_wstr(const wchar_t *str) PySys_WriteStderr("'"); for (; *str != L'\0'; str++) { - wchar_t ch = *str; + unsigned int ch = (unsigned int)*str; if (ch == L'\'') { PySys_WriteStderr("\\'"); } else if (0x20 <= ch && ch < 0x7f) { - PySys_WriteStderr("%lc", ch); + PySys_WriteStderr("%c", ch); } else if (ch <= 0xff) { PySys_WriteStderr("\\x%02x", ch); @@ -2627,7 +2711,7 @@ _Py_DumpPathConfig(PyThreadState *tstate) PySys_WriteStderr("\n"); \ } while (0) - PyConfig *config = &tstate->interp->config; + const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); DUMP_CONFIG("PYTHONHOME", home); DUMP_CONFIG("PYTHONPATH", pythonpath_env); DUMP_CONFIG("program name", program_name); @@ -2654,6 +2738,7 @@ _Py_DumpPathConfig(PyThreadState *tstate) DUMP_SYS(_base_executable); DUMP_SYS(base_prefix); DUMP_SYS(base_exec_prefix); + DUMP_SYS(platlibdir); DUMP_SYS(executable); DUMP_SYS(prefix); DUMP_SYS(exec_prefix); diff --git a/Python/marshal.c b/Python/marshal.c index a9ba7a436fd19d279f1e70483e5c41af0da76097..c4538bd373a82ef09cea343d5d210fa22dad8608 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -12,7 +12,7 @@ #include "longintrepr.h" #include "code.h" #include "marshal.h" -#include "../Modules/hashtable.h" +#include "pycore_hashtable.h" /*[clinic input] module marshal @@ -83,7 +83,7 @@ typedef struct { int depth; PyObject *str; char *ptr; - char *end; + const char *end; char *buf; _Py_hashtable_t *hashtable; int version; @@ -114,7 +114,7 @@ w_reserve(WFILE *p, Py_ssize_t needed) } assert(p->str != NULL); pos = p->ptr - p->buf; - size = PyBytes_Size(p->str); + size = PyBytes_GET_SIZE(p->str); if (size > 16*1024*1024) delta = (size >> 3); /* 12.5% overallocation */ else @@ -126,7 +126,7 @@ w_reserve(WFILE *p, Py_ssize_t needed) } size += delta; if (_PyBytes_Resize(&p->str, size) != 0) { - p->ptr = p->buf = p->end = NULL; + p->end = p->ptr = p->buf = NULL; return 0; } else { @@ -138,7 +138,7 @@ w_reserve(WFILE *p, Py_ssize_t needed) } static void -w_string(const char *s, Py_ssize_t n, WFILE *p) +w_string(const void *s, Py_ssize_t n, WFILE *p) { Py_ssize_t m; if (!n || p->ptr == NULL) @@ -194,14 +194,14 @@ w_long(long x, WFILE *p) #endif static void -w_pstring(const char *s, Py_ssize_t n, WFILE *p) +w_pstring(const void *s, Py_ssize_t n, WFILE *p) { W_SIZE(n, p); w_string(s, n, p); } static void -w_short_pstring(const char *s, Py_ssize_t n, WFILE *p) +w_short_pstring(const void *s, Py_ssize_t n, WFILE *p) { w_byte(Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char), p); w_string(s, n, p); @@ -274,21 +274,18 @@ w_float_bin(double v, WFILE *p) p->error = WFERR_UNMARSHALLABLE; return; } - w_string((const char *)buf, 8, p); + w_string(buf, 8, p); } static void w_float_str(double v, WFILE *p) { - int n; char *buf = PyOS_double_to_string(v, 'g', 17, 0, NULL); if (!buf) { p->error = WFERR_NOMEMORY; return; } - n = (int)strlen(buf); - w_byte(n, p); - w_string(buf, n, p); + w_short_pstring(buf, strlen(buf), p); PyMem_Free(buf); } @@ -305,17 +302,17 @@ w_ref(PyObject *v, char *flag, WFILE *p) if (Py_REFCNT(v) == 1) return 0; - entry = _Py_HASHTABLE_GET_ENTRY(p->hashtable, v); + entry = _Py_hashtable_get_entry(p->hashtable, v); if (entry != NULL) { /* write the reference index to the stream */ - _Py_HASHTABLE_ENTRY_READ_DATA(p->hashtable, entry, w); + w = (int)(uintptr_t)entry->value; /* we don't store "long" indices in the dict */ assert(0 <= w && w <= 0x7fffffff); w_byte(TYPE_REF, p); w_long(w, p); return 1; } else { - size_t s = p->hashtable->entries; + size_t s = p->hashtable->nentries; /* we don't support long indices */ if (s >= 0x7fffffff) { PyErr_SetString(PyExc_ValueError, "too many objects"); @@ -323,7 +320,7 @@ w_ref(PyObject *v, char *flag, WFILE *p) } w = (int)s; Py_INCREF(v); - if (_Py_HASHTABLE_SET(p->hashtable, v, w) < 0) { + if (_Py_hashtable_set(p->hashtable, v, (void *)(uintptr_t)w) < 0) { Py_DECREF(v); goto err; } @@ -378,11 +375,10 @@ w_complex_object(PyObject *v, char flag, WFILE *p) Py_ssize_t i, n; if (PyLong_CheckExact(v)) { - long x = PyLong_AsLong(v); - if ((x == -1) && PyErr_Occurred()) { - PyLongObject *ob = (PyLongObject *)v; - PyErr_Clear(); - w_PyLong(ob, flag, p); + int overflow; + long x = PyLong_AsLongAndOverflow(v, &overflow); + if (overflow) { + w_PyLong((PyLongObject *)v, flag, p); } else { #if SIZEOF_LONG > 4 @@ -433,7 +429,7 @@ w_complex_object(PyObject *v, char flag, WFILE *p) W_TYPE(TYPE_SHORT_ASCII_INTERNED, p); else W_TYPE(TYPE_SHORT_ASCII, p); - w_short_pstring((char *) PyUnicode_1BYTE_DATA(v), + w_short_pstring(PyUnicode_1BYTE_DATA(v), PyUnicode_GET_LENGTH(v), p); } else { @@ -441,7 +437,7 @@ w_complex_object(PyObject *v, char flag, WFILE *p) W_TYPE(TYPE_ASCII_INTERNED, p); else W_TYPE(TYPE_ASCII, p); - w_pstring((char *) PyUnicode_1BYTE_DATA(v), + w_pstring(PyUnicode_1BYTE_DATA(v), PyUnicode_GET_LENGTH(v), p); } } @@ -462,7 +458,7 @@ w_complex_object(PyObject *v, char flag, WFILE *p) } } else if (PyTuple_CheckExact(v)) { - n = PyTuple_Size(v); + n = PyTuple_GET_SIZE(v); if (p->version >= 4 && n < 256) { W_TYPE(TYPE_SMALL_TUPLE, p); w_byte((unsigned char)n, p); @@ -496,34 +492,18 @@ w_complex_object(PyObject *v, char flag, WFILE *p) w_object((PyObject *)NULL, p); } else if (PyAnySet_CheckExact(v)) { - PyObject *value, *it; + PyObject *value; + Py_ssize_t pos = 0; + Py_hash_t hash; - if (PyObject_TypeCheck(v, &PySet_Type)) - W_TYPE(TYPE_SET, p); - else + if (PyFrozenSet_CheckExact(v)) W_TYPE(TYPE_FROZENSET, p); - n = PyObject_Size(v); - if (n == -1) { - p->depth--; - p->error = WFERR_UNMARSHALLABLE; - return; - } + else + W_TYPE(TYPE_SET, p); + n = PySet_GET_SIZE(v); W_SIZE(n, p); - it = PyObject_GetIter(v); - if (it == NULL) { - p->depth--; - p->error = WFERR_UNMARSHALLABLE; - return; - } - while ((value = PyIter_Next(it)) != NULL) { + while (_PySet_NextEntry(v, &pos, &value, &hash)) { w_object(value, p); - Py_DECREF(value); - } - Py_DECREF(it); - if (PyErr_Occurred()) { - p->depth--; - p->error = WFERR_UNMARSHALLABLE; - return; } } else if (PyCode_Check(v)) { @@ -565,13 +545,20 @@ w_complex_object(PyObject *v, char flag, WFILE *p) } } +static void +w_decref_entry(void *key) +{ + PyObject *entry_key = (PyObject *)key; + Py_XDECREF(entry_key); +} + static int w_init_refs(WFILE *wf, int version) { if (version >= 3) { - wf->hashtable = _Py_hashtable_new(sizeof(PyObject *), sizeof(int), - _Py_hashtable_hash_ptr, - _Py_hashtable_compare_direct); + wf->hashtable = _Py_hashtable_new_full(_Py_hashtable_hash_ptr, + _Py_hashtable_compare_direct, + w_decref_entry, NULL, NULL); if (wf->hashtable == NULL) { PyErr_NoMemory(); return -1; @@ -580,22 +567,10 @@ w_init_refs(WFILE *wf, int version) return 0; } -static int -w_decref_entry(_Py_hashtable_t *ht, _Py_hashtable_entry_t *entry, - void *Py_UNUSED(data)) -{ - PyObject *entry_key; - - _Py_HASHTABLE_ENTRY_READ_KEY(ht, entry, entry_key); - Py_XDECREF(entry_key); - return 0; -} - static void w_clear_refs(WFILE *wf) { if (wf->hashtable != NULL) { - _Py_hashtable_foreach(wf->hashtable, w_decref_entry, NULL); _Py_hashtable_destroy(wf->hashtable); } } @@ -638,8 +613,8 @@ typedef struct { FILE *fp; int depth; PyObject *readable; /* Stream-like object being read from */ - char *ptr; - char *end; + const char *ptr; + const char *end; char *buf; Py_ssize_t buf_size; PyObject *refs; /* a list */ @@ -652,7 +627,7 @@ r_string(Py_ssize_t n, RFILE *p) if (p->ptr != NULL) { /* Fast path for loads() */ - char *res = p->ptr; + const char *res = p->ptr; Py_ssize_t left = p->end - p->ptr; if (left < n) { PyErr_SetString(PyExc_EOFError, @@ -813,7 +788,7 @@ r_PyLong(RFILE *p) if (ob == NULL) return NULL; - Py_SIZE(ob) = n > 0 ? size : -size; + Py_SET_SIZE(ob, n > 0 ? size : -size); for (i = 0; i < size-1; i++) { d = 0; @@ -1570,8 +1545,8 @@ PyMarshal_ReadObjectFromString(const char *str, Py_ssize_t len) PyObject *result; rf.fp = NULL; rf.readable = NULL; - rf.ptr = (char *)str; - rf.end = (char *)str + len; + rf.ptr = str; + rf.end = str + len; rf.buf = NULL; rf.depth = 0; rf.refs = PyList_New(0); @@ -1593,8 +1568,8 @@ PyMarshal_WriteObjectToString(PyObject *x, int version) wf.str = PyBytes_FromStringAndSize((char *)NULL, 50); if (wf.str == NULL) return NULL; - wf.ptr = wf.buf = PyBytes_AS_STRING((PyBytesObject *)wf.str); - wf.end = wf.ptr + PyBytes_Size(wf.str); + wf.ptr = wf.buf = PyBytes_AS_STRING(wf.str); + wf.end = wf.ptr + PyBytes_GET_SIZE(wf.str); wf.error = WFERR_OK; wf.version = version; if (w_init_refs(&wf, version)) { @@ -1604,13 +1579,7 @@ PyMarshal_WriteObjectToString(PyObject *x, int version) w_object(x, &wf); w_clear_refs(&wf); if (wf.str != NULL) { - char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str); - if (wf.ptr - base > PY_SSIZE_T_MAX) { - Py_DECREF(wf.str); - PyErr_SetString(PyExc_OverflowError, - "too much marshal data for a bytes object"); - return NULL; - } + const char *base = PyBytes_AS_STRING(wf.str); if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0) return NULL; } @@ -1659,7 +1628,7 @@ marshal_dump_impl(PyObject *module, PyObject *value, PyObject *file, s = PyMarshal_WriteObjectToString(value, version); if (s == NULL) return NULL; - res = _PyObject_CallMethodIdObjArgs(file, &PyId_write, s, NULL); + res = _PyObject_CallMethodIdOneArg(file, &PyId_write, s); Py_DECREF(s); return res; } @@ -1702,7 +1671,7 @@ marshal_load(PyObject *module, PyObject *file) if (!PyBytes_Check(data)) { PyErr_Format(PyExc_TypeError, "file.read() returned not bytes but %.100s", - data->ob_type->tp_name); + Py_TYPE(data)->tp_name); result = NULL; } else { diff --git a/Python/modsupport.c b/Python/modsupport.c index 7271af3ac5332f7b103ff39fca903e76ffadc479..13482c65083ffa75ec6bd2184938adbea826b768 100644 --- a/Python/modsupport.c +++ b/Python/modsupport.c @@ -2,6 +2,7 @@ /* Module support implementation */ #include "Python.h" +#include "pycore_abstract.h" // _PyIndex_Check() #define FLAG_SIZE_T 1 typedef double va_double; @@ -20,7 +21,7 @@ _Py_convert_optional_to_ssize_t(PyObject *obj, void *result) if (obj == Py_None) { return 1; } - else if (PyIndex_Check(obj)) { + else if (_PyIndex_Check(obj)) { limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError); if (limit == -1 && PyErr_Occurred()) { return 0; @@ -618,6 +619,9 @@ va_build_stack(PyObject **small_stack, Py_ssize_t small_stack_len, va_end(lva); if (res < 0) { + if (stack != small_stack) { + PyMem_Free(stack); + } return NULL; } @@ -678,3 +682,22 @@ PyModule_AddStringConstant(PyObject *m, const char *name, const char *value) Py_DECREF(o); return -1; } + +int +PyModule_AddType(PyObject *module, PyTypeObject *type) +{ + if (PyType_Ready(type) < 0) { + return -1; + } + + const char *name = _PyType_Name(type); + assert(name != NULL); + + Py_INCREF(type); + if (PyModule_AddObject(module, name, (PyObject *)type) < 0) { + Py_DECREF(type); + return -1; + } + + return 0; +} diff --git a/Python/mysnprintf.c b/Python/mysnprintf.c index a08e249b42b1ef25a268c6f6c500d7aacc6227ce..458ca14d5c611e08401640dc2d196935437b9b67 100644 --- a/Python/mysnprintf.c +++ b/Python/mysnprintf.c @@ -1,6 +1,8 @@ #include "Python.h" -/* snprintf() wrappers. If the platform has vsnprintf, we use it, else we +/* snprintf() and vsnprintf() wrappers. + + If the platform has vsnprintf, we use it, else we emulate it in a half-hearted way. Even if the platform has it, we wrap it because platforms differ in what vsnprintf does in case the buffer is too small: C99 behavior is to return the number of characters that @@ -52,16 +54,17 @@ PyOS_snprintf(char *str, size_t size, const char *format, ...) int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) { + assert(str != NULL); + assert(size > 0); + assert(format != NULL); + int len; /* # bytes written, excluding \0 */ -#ifdef HAVE_SNPRINTF -#define _PyOS_vsnprintf_EXTRA_SPACE 1 +#if defined(_MSC_VER) || defined(HAVE_SNPRINTF) +# define _PyOS_vsnprintf_EXTRA_SPACE 1 #else -#define _PyOS_vsnprintf_EXTRA_SPACE 512 +# define _PyOS_vsnprintf_EXTRA_SPACE 512 char *buffer; #endif - assert(str != NULL); - assert(size > 0); - assert(format != NULL); /* We take a size_t as input but return an int. Sanity check * our input so that it won't cause an overflow in the * vsnprintf return value or the buffer malloc size. */ @@ -70,10 +73,12 @@ PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) goto Done; } -#ifdef HAVE_SNPRINTF +#if defined(_MSC_VER) + len = _vsnprintf(str, size, format, va); +#elif defined(HAVE_SNPRINTF) len = vsnprintf(str, size, format, va); #else - /* Emulate it. */ + /* Emulate vsnprintf(). */ buffer = PyMem_MALLOC(size + _PyOS_vsnprintf_EXTRA_SPACE); if (buffer == NULL) { len = -666; @@ -81,12 +86,12 @@ PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) } len = vsprintf(buffer, format, va); - if (len < 0) + if (len < 0) { /* ignore the error */; - - else if ((size_t)len >= size + _PyOS_vsnprintf_EXTRA_SPACE) - Py_FatalError("Buffer overflow in PyOS_snprintf/PyOS_vsnprintf"); - + } + else if ((size_t)len >= size + _PyOS_vsnprintf_EXTRA_SPACE) { + _Py_FatalErrorFunc(__func__, "Buffer overflow"); + } else { const size_t to_copy = (size_t)len < size ? (size_t)len : size - 1; @@ -96,9 +101,11 @@ PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) } PyMem_FREE(buffer); #endif + Done: - if (size > 0) + if (size > 0) { str[size-1] = '\0'; + } return len; #undef _PyOS_vsnprintf_EXTRA_SPACE } diff --git a/Python/mystrtoul.c b/Python/mystrtoul.c index 7ab5814272d55a45792d865821c12e423e6167f6..19fa57aa144e2ac9f53f22e6cbc92fc7faa0808e 100644 --- a/Python/mystrtoul.c +++ b/Python/mystrtoul.c @@ -99,7 +99,7 @@ PyOS_strtoul(const char *str, char **ptr, int base) int ovlimit; /* required digits to overflow */ /* skip leading white space */ - while (*str && Py_ISSPACE(Py_CHARMASK(*str))) + while (*str && Py_ISSPACE(*str)) ++str; /* check for leading 0b, 0o or 0x for auto-base or base 16 */ @@ -138,7 +138,7 @@ PyOS_strtoul(const char *str, char **ptr, int base) /* skip all zeroes... */ while (*str == '0') ++str; - while (Py_ISSPACE(Py_CHARMASK(*str))) + while (Py_ISSPACE(*str)) ++str; if (ptr) *ptr = (char *)str; @@ -266,7 +266,7 @@ PyOS_strtol(const char *str, char **ptr, int base) unsigned long uresult; char sign; - while (*str && Py_ISSPACE(Py_CHARMASK(*str))) + while (*str && Py_ISSPACE(*str)) str++; sign = *str; diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index e82959be086455f7487f092820f1de0a1dbf777b..538fdbe3e0b5ae65b2bf829c526ddfdba93dec29 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -47,12 +47,12 @@ static void *opcode_targets[256] = { &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, + &&TARGET_RERAISE, + &&TARGET_WITH_EXCEPT_START, &&TARGET_GET_AITER, &&TARGET_GET_ANEXT, &&TARGET_BEFORE_ASYNC_WITH, - &&TARGET_BEGIN_FINALLY, + &&_unknown_opcode, &&TARGET_END_ASYNC_FOR, &&TARGET_INPLACE_ADD, &&TARGET_INPLACE_SUBTRACT, @@ -73,21 +73,21 @@ static void *opcode_targets[256] = { &&TARGET_LOAD_BUILD_CLASS, &&TARGET_YIELD_FROM, &&TARGET_GET_AWAITABLE, - &&_unknown_opcode, + &&TARGET_LOAD_ASSERTION_ERROR, &&TARGET_INPLACE_LSHIFT, &&TARGET_INPLACE_RSHIFT, &&TARGET_INPLACE_AND, &&TARGET_INPLACE_XOR, &&TARGET_INPLACE_OR, &&_unknown_opcode, - &&TARGET_WITH_CLEANUP_START, - &&TARGET_WITH_CLEANUP_FINISH, + &&_unknown_opcode, + &&TARGET_LIST_TO_TUPLE, &&TARGET_RETURN_VALUE, &&TARGET_IMPORT_STAR, &&TARGET_SETUP_ANNOTATIONS, &&TARGET_YIELD_VALUE, &&TARGET_POP_BLOCK, - &&TARGET_END_FINALLY, + &&_unknown_opcode, &&TARGET_POP_EXCEPT, &&TARGET_STORE_NAME, &&TARGET_DELETE_NAME, @@ -116,11 +116,11 @@ static void *opcode_targets[256] = { &&TARGET_POP_JUMP_IF_FALSE, &&TARGET_POP_JUMP_IF_TRUE, &&TARGET_LOAD_GLOBAL, + &&TARGET_IS_OP, + &&TARGET_CONTAINS_OP, &&_unknown_opcode, &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, + &&TARGET_JUMP_IF_NOT_EXC_MATCH, &&TARGET_SETUP_FINALLY, &&_unknown_opcode, &&TARGET_LOAD_FAST, @@ -148,23 +148,23 @@ static void *opcode_targets[256] = { &&TARGET_SET_ADD, &&TARGET_MAP_ADD, &&TARGET_LOAD_CLASSDEREF, - &&TARGET_BUILD_LIST_UNPACK, - &&TARGET_BUILD_MAP_UNPACK, - &&TARGET_BUILD_MAP_UNPACK_WITH_CALL, - &&TARGET_BUILD_TUPLE_UNPACK, - &&TARGET_BUILD_SET_UNPACK, + &&_unknown_opcode, + &&_unknown_opcode, + &&_unknown_opcode, + &&_unknown_opcode, + &&_unknown_opcode, &&TARGET_SETUP_ASYNC_WITH, &&TARGET_FORMAT_VALUE, &&TARGET_BUILD_CONST_KEY_MAP, &&TARGET_BUILD_STRING, - &&TARGET_BUILD_TUPLE_UNPACK_WITH_CALL, + &&_unknown_opcode, &&_unknown_opcode, &&TARGET_LOAD_METHOD, &&TARGET_CALL_METHOD, - &&TARGET_CALL_FINALLY, - &&TARGET_POP_FINALLY, - &&_unknown_opcode, - &&_unknown_opcode, + &&TARGET_LIST_EXTEND, + &&TARGET_SET_UPDATE, + &&TARGET_DICT_MERGE, + &&TARGET_DICT_UPDATE, &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, diff --git a/Python/pathconfig.c b/Python/pathconfig.c index 60c104492d6468da7721c0487bc6b48e49235174..9a302213e77b654cee0595bd448b263d91c22e10 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -1,13 +1,15 @@ /* Path configuration like module_search_path (sys.path) */ #include "Python.h" -#include "osdefs.h" +#include "osdefs.h" // DELIM #include "pycore_initconfig.h" #include "pycore_fileutils.h" #include "pycore_pathconfig.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" +#include "pycore_pymem.h" // _PyMem_SetDefaultAllocator() #include +#ifdef MS_WINDOWS +# include // GetFullPathNameW(), MAX_PATH +#endif #ifdef __cplusplus extern "C" { @@ -201,9 +203,8 @@ config_init_module_search_paths(PyConfig *config, _PyPathConfig *pathconfig) const wchar_t *sys_path = pathconfig->module_search_path; const wchar_t delim = DELIM; - const wchar_t *p = sys_path; while (1) { - p = wcschr(sys_path, delim); + const wchar_t *p = wcschr(sys_path, delim); if (p == NULL) { p = sys_path + wcslen(sys_path); /* End of string */ } @@ -439,6 +440,12 @@ pathconfig_global_init(void) /* External interface */ +static void _Py_NO_RETURN +path_out_of_memory(const char *func) +{ + _Py_FatalErrorFunc(func, "out of memory"); +} + void Py_SetPath(const wchar_t *path) { @@ -470,7 +477,7 @@ Py_SetPath(const wchar_t *path) || _Py_path_config.exec_prefix == NULL || _Py_path_config.module_search_path == NULL) { - Py_FatalError("Py_SetPath() failed: out of memory"); + path_out_of_memory(__func__); } } @@ -491,7 +498,7 @@ Py_SetPythonHome(const wchar_t *home) PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); if (_Py_path_config.home == NULL) { - Py_FatalError("Py_SetPythonHome() failed: out of memory"); + path_out_of_memory(__func__); } } @@ -512,7 +519,7 @@ Py_SetProgramName(const wchar_t *program_name) PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); if (_Py_path_config.program_name == NULL) { - Py_FatalError("Py_SetProgramName() failed: out of memory"); + path_out_of_memory(__func__); } } @@ -532,7 +539,7 @@ _Py_SetProgramFullPath(const wchar_t *program_full_path) PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); if (_Py_path_config.program_full_path == NULL) { - Py_FatalError("_Py_SetProgramFullPath() failed: out of memory"); + path_out_of_memory(__func__); } } @@ -731,16 +738,20 @@ _PyPathConfig_ComputeSysPath0(const PyWideStringList *argv, PyObject **path0_p) #endif /* Search for a prefix value in an environment file (pyvenv.cfg). - If found, copy it into the provided buffer. */ -int + + - If found, copy it into *value_p: string which must be freed by + PyMem_RawFree(). + - If not found, *value_p is set to NULL. +*/ +PyStatus _Py_FindEnvConfigValue(FILE *env_file, const wchar_t *key, - wchar_t *value, size_t value_size) + wchar_t **value_p) { - int result = 0; /* meaning not found */ + *value_p = NULL; + char buffer[MAXPATHLEN * 2 + 1]; /* allow extra for key, '=', etc. */ buffer[Py_ARRAY_LENGTH(buffer)-1] = '\0'; - fseek(env_file, 0, SEEK_SET); while (!feof(env_file)) { char * p = fgets(buffer, Py_ARRAY_LENGTH(buffer) - 1, env_file); @@ -767,18 +778,24 @@ _Py_FindEnvConfigValue(FILE *env_file, const wchar_t *key, if ((tok != NULL) && !wcscmp(tok, L"=")) { tok = WCSTOK(NULL, L"\r\n", &state); if (tok != NULL) { - wcsncpy(value, tok, value_size - 1); - value[value_size - 1] = L'\0'; - result = 1; + *value_p = _PyMem_RawWcsdup(tok); PyMem_RawFree(tmpbuffer); - break; + + if (*value_p == NULL) { + return _PyStatus_NO_MEMORY(); + } + + /* found */ + return _PyStatus_OK(); } } } PyMem_RawFree(tmpbuffer); } } - return result; + + /* not found */ + return _PyStatus_OK(); } #ifdef __cplusplus diff --git a/Python/peephole.c b/Python/peephole.c index d859648411fa3f6452caf400a39fb68f56625b0a..6954c87b13bfbf5f35f5d5682839e94e1fea80ef 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -15,7 +15,7 @@ || op==JUMP_IF_FALSE_OR_POP || op==JUMP_IF_TRUE_OR_POP) #define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE \ || op==POP_JUMP_IF_FALSE || op==POP_JUMP_IF_TRUE \ - || op==JUMP_IF_FALSE_OR_POP || op==JUMP_IF_TRUE_OR_POP) + || op==JUMP_IF_FALSE_OR_POP || op==JUMP_IF_TRUE_OR_POP || op==JUMP_IF_NOT_EXC_MATCH) #define JUMPS_ON_TRUE(op) (op==POP_JUMP_IF_TRUE || op==JUMP_IF_TRUE_OR_POP) #define GETJUMPTGT(arr, i) (get_arg(arr, i) / sizeof(_Py_CODEUNIT) + \ (ABSOLUTE_JUMP(_Py_OPCODE(arr[i])) ? 0 : i+1)) @@ -194,11 +194,11 @@ markblocks(_Py_CODEUNIT *code, Py_ssize_t len) case JUMP_IF_TRUE_OR_POP: case POP_JUMP_IF_FALSE: case POP_JUMP_IF_TRUE: + case JUMP_IF_NOT_EXC_MATCH: case JUMP_ABSOLUTE: case SETUP_FINALLY: case SETUP_WITH: case SETUP_ASYNC_WITH: - case CALL_FINALLY: j = GETJUMPTGT(code, i); assert(j < len); blocks[j] = 1; @@ -432,14 +432,10 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, /* Remove unreachable ops after RETURN */ case RETURN_VALUE: h = i + 1; - /* END_FINALLY should be kept since it denotes the end of - the 'finally' block in frame_setlineno() in frameobject.c. - SETUP_FINALLY should be kept for balancing. - */ - while (h < codelen && ISBASICBLOCK(blocks, i, h) && - _Py_OPCODE(codestr[h]) != END_FINALLY) + while (h < codelen && ISBASICBLOCK(blocks, i, h)) { - if (_Py_OPCODE(codestr[h]) == SETUP_FINALLY) { + /* Leave SETUP_FINALLY and RERAISE in place to help find block limits. */ + if (_Py_OPCODE(codestr[h]) == SETUP_FINALLY || _Py_OPCODE(codestr[h]) == RERAISE) { while (h > i + 1 && _Py_OPCODE(codestr[h - 1]) == EXTENDED_ARG) { @@ -498,6 +494,7 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, case POP_JUMP_IF_TRUE: case JUMP_IF_FALSE_OR_POP: case JUMP_IF_TRUE_OR_POP: + case JUMP_IF_NOT_EXC_MATCH: j = blocks[j / sizeof(_Py_CODEUNIT)] * sizeof(_Py_CODEUNIT); break; @@ -506,7 +503,6 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, case SETUP_FINALLY: case SETUP_WITH: case SETUP_ASYNC_WITH: - case CALL_FINALLY: j = blocks[j / sizeof(_Py_CODEUNIT) + i + 1] - blocks[i] - 1; j *= sizeof(_Py_CODEUNIT); break; @@ -515,8 +511,12 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, if (instrsize(j) > ilen) { goto exitUnchanged; } - assert(ilen <= INT_MAX); /* If instrsize(j) < ilen, we'll emit EXTENDED_ARG 0 */ + if (ilen > 4) { + /* Can only happen when PyCode_Optimize() is called with + malformed bytecode. */ + goto exitUnchanged; + } write_op_arg(codestr + h, opcode, j, (int)ilen); h += ilen; } diff --git a/Python/preconfig.c b/Python/preconfig.c index 89a6227fa67218dc428eeb53815eb1fb82e6a3b8..262738fa57da56f676ca55e43faf6545d070243b 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -1,8 +1,9 @@ #include "Python.h" -#include "pycore_initconfig.h" -#include "pycore_getopt.h" -#include "pycore_pystate.h" /* _PyRuntime_Initialize() */ -#include /* setlocale() */ +#include "pycore_getopt.h" // _PyOS_GetOpt() +#include "pycore_initconfig.h" // _PyArgv +#include "pycore_pymem.h" // _PyMem_GetAllocatorName() +#include "pycore_runtime.h" // _PyRuntime_Initialize() +#include // setlocale() #define DECODE_LOCALE_ERR(NAME, LEN) \ diff --git a/Python/pyhash.c b/Python/pyhash.c index c0355ae686afd2272b2ad1639b2021544b8b4bae..3843079fbbce14ea13b7702e2c3e38adfc247dfc 100644 --- a/Python/pyhash.c +++ b/Python/pyhash.c @@ -129,16 +129,22 @@ _Py_HashDouble(double v) } Py_hash_t -_Py_HashPointer(void *p) +_Py_HashPointerRaw(const void *p) { - Py_hash_t x; size_t y = (size_t)p; /* bottom 3 or 4 bits are likely to be 0; rotate y by 4 to avoid excessive hash collisions for dicts and sets */ y = (y >> 4) | (y << (8 * SIZEOF_VOID_P - 4)); - x = (Py_hash_t)y; - if (x == -1) + return (Py_hash_t)y; +} + +Py_hash_t +_Py_HashPointer(const void *p) +{ + Py_hash_t x = _Py_HashPointerRaw(p); + if (x == -1) { x = -2; + } return x; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index dc2d13db419e5e68a049e09c027337eebd0fdb7c..60f091cbbea14535ae2191f6bea96f1d97e2aee1 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -4,48 +4,41 @@ #include "Python-ast.h" #undef Yield /* undefine macro conflicting with */ -#include "pycore_ceval.h" -#include "pycore_context.h" -#include "pycore_initconfig.h" -#include "pycore_fileutils.h" -#include "pycore_hamt.h" -#include "pycore_pathconfig.h" -#include "pycore_pylifecycle.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" -#include "pycore_traceback.h" -#include "grammar.h" -#include "node.h" -#include "token.h" -#include "parsetok.h" -#include "errcode.h" -#include "code.h" -#include "symtable.h" -#include "ast.h" -#include "marshal.h" -#include "osdefs.h" -#include -#ifdef HAVE_SIGNAL_H -#include -#endif +#include "pycore_ceval.h" // _PyEval_FiniGIL() +#include "pycore_context.h" // _PyContext_Init() +#include "pycore_fileutils.h" // _Py_ResetForceASCII() +#include "pycore_import.h" // _PyImport_Cleanup() +#include "pycore_initconfig.h" // _PyStatus_OK() +#include "pycore_object.h" // _PyDebug_PrintTotalRefs() +#include "pycore_pathconfig.h" // _PyConfig_WritePathConfig() +#include "pycore_pyerrors.h" // _PyErr_Occurred() +#include "pycore_pylifecycle.h" // _PyErr_Print() +#include "pycore_pystate.h" // _PyThreadState_GET() +#include "pycore_sysmodule.h" // _PySys_ClearAuditHooks() +#include "pycore_traceback.h" // _Py_DumpTracebackThreads() + +#include "grammar.h" // PyGrammar_RemoveAccelerators() +#include // setlocale() -#ifdef MS_WINDOWS -#include "malloc.h" /* for alloca */ +#ifdef HAVE_SIGNAL_H +# include // SIG_IGN #endif #ifdef HAVE_LANGINFO_H -#include +# include // nl_langinfo(CODESET) #endif #ifdef MS_WINDOWS -#undef BYTE -#include "windows.h" +# undef BYTE +# include "windows.h" -extern PyTypeObject PyWindowsConsoleIO_Type; -#define PyWindowsConsoleIO_Check(op) (PyObject_TypeCheck((op), &PyWindowsConsoleIO_Type)) + extern PyTypeObject PyWindowsConsoleIO_Type; +# define PyWindowsConsoleIO_Check(op) \ + (PyObject_TypeCheck((op), &PyWindowsConsoleIO_Type)) #endif + _Py_IDENTIFIER(flush); _Py_IDENTIFIER(name); _Py_IDENTIFIER(stdin); @@ -59,13 +52,13 @@ extern "C" { extern grammar _PyParser_Grammar; /* From graminit.c */ -/* Forward */ +/* Forward declarations */ static PyStatus add_main_module(PyInterpreterState *interp); -static PyStatus init_import_size(void); -static PyStatus init_sys_streams(PyInterpreterState *interp); -static PyStatus init_signals(void); -static void call_py_exitfuncs(PyInterpreterState *); -static void wait_for_thread_shutdown(void); +static PyStatus init_import_site(void); +static PyStatus init_set_builtins_open(void); +static PyStatus init_sys_streams(PyThreadState *tstate); +static void call_py_exitfuncs(PyThreadState *tstate); +static void wait_for_thread_shutdown(PyThreadState *tstate); static void call_ll_exitfuncs(_PyRuntimeState *runtime); int _Py_UnhandledKeyboardInterrupt = 0; @@ -99,7 +92,7 @@ _PyRuntime_Finalize(void) int _Py_IsFinalizing(void) { - return _PyRuntime.finalizing != NULL; + return _PyRuntimeState_GetFinalizing(&_PyRuntime) != NULL; } /* Hack to force loading of object files */ @@ -146,12 +139,13 @@ Py_IsInitialized(void) */ static PyStatus -init_importlib(PyInterpreterState *interp, PyObject *sysmod) +init_importlib(PyThreadState *tstate, PyObject *sysmod) { PyObject *importlib; PyObject *impmod; PyObject *value; - int verbose = interp->config.verbose; + PyInterpreterState *interp = tstate->interp; + int verbose = _PyInterpreterState_GetConfig(interp)->verbose; /* Import _importlib through its frozen version, _frozen_importlib. */ if (PyImport_ImportFrozenModule("_frozen_importlib") <= 0) { @@ -187,7 +181,7 @@ init_importlib(PyInterpreterState *interp, PyObject *sysmod) /* Install importlib as the implementation of import */ value = PyObject_CallMethod(importlib, "_install", "OO", sysmod, impmod); if (value == NULL) { - PyErr_Print(); + _PyErr_Print(tstate); return _PyStatus_ERR("importlib install failed"); } Py_DECREF(value); @@ -197,17 +191,17 @@ init_importlib(PyInterpreterState *interp, PyObject *sysmod) } static PyStatus -init_importlib_external(PyInterpreterState *interp) +init_importlib_external(PyThreadState *tstate) { PyObject *value; - value = PyObject_CallMethod(interp->importlib, + value = PyObject_CallMethod(tstate->interp->importlib, "_install_external_importers", ""); if (value == NULL) { - PyErr_Print(); + _PyErr_Print(tstate); return _PyStatus_ERR("external importer setup failed"); } Py_DECREF(value); - return _PyImportZip_Init(interp); + return _PyImportZip_Init(tstate); } /* Helper functions to better handle the legacy C locale @@ -256,6 +250,7 @@ _Py_LegacyLocaleDetected(int warn) #endif } +#ifndef MS_WINDOWS static const char *_C_LOCALE_WARNING = "Python runtime initialized with LC_CTYPE=C (a locale with default ASCII " "encoding), which may cause Unicode compatibility problems. Using C.UTF-8, " @@ -270,6 +265,7 @@ emit_stderr_warning_for_legacy_locale(_PyRuntimeState *runtime) PySys_FormatStderr("%s", _C_LOCALE_WARNING); } } +#endif /* !defined(MS_WINDOWS) */ typedef struct _CandidateLocale { const char *locale_name; /* The locale to try as a coercion target */ @@ -448,7 +444,7 @@ _Py_SetLocaleFromEnv(int category) static PyStatus pyinit_core_reconfigure(_PyRuntimeState *runtime, - PyInterpreterState **interp_p, + PyThreadState **tstate_p, const PyConfig *config) { PyStatus status; @@ -456,20 +452,23 @@ pyinit_core_reconfigure(_PyRuntimeState *runtime, if (!tstate) { return _PyStatus_ERR("failed to read thread state"); } + *tstate_p = tstate; PyInterpreterState *interp = tstate->interp; if (interp == NULL) { return _PyStatus_ERR("can't make main interpreter"); } - *interp_p = interp; - _PyConfig_Write(config, runtime); + status = _PyConfig_Write(config, runtime); + if (_PyStatus_EXCEPTION(status)) { + return status; + } - status = _PyConfig_Copy(&interp->config, config); + status = _PyInterpreterState_SetConfig(interp, config); if (_PyStatus_EXCEPTION(status)) { return status; } - config = &interp->config; + config = _PyInterpreterState_GetConfig(interp); if (config->_install_importlib) { status = _PyConfig_WritePathConfig(config); @@ -489,7 +488,10 @@ pycore_init_runtime(_PyRuntimeState *runtime, return _PyStatus_ERR("main interpreter already initialized"); } - _PyConfig_Write(config, runtime); + PyStatus status = _PyConfig_Write(config, runtime); + if (_PyStatus_EXCEPTION(status)) { + return status; + } /* Py_Finalize leaves _Py_Finalizing set in order to help daemon * threads behave a little more gracefully at interpreter shutdown. @@ -500,9 +502,9 @@ pycore_init_runtime(_PyRuntimeState *runtime, * threads still hanging around from a previous Py_Initialize/Finalize * pair :( */ - runtime->finalizing = NULL; + _PyRuntimeState_SetFinalizing(runtime, NULL); - PyStatus status = _Py_HashRandomization_Init(config); + status = _Py_HashRandomization_Init(config); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -515,77 +517,105 @@ pycore_init_runtime(_PyRuntimeState *runtime, } +static PyStatus +init_interp_create_gil(PyThreadState *tstate) +{ + PyStatus status; + + /* finalize_interp_delete() comment explains why _PyEval_FiniGIL() is + only called here. */ + _PyEval_FiniGIL(tstate); + + /* Auto-thread-state API */ + status = _PyGILState_Init(tstate); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + + /* Create the GIL and take it */ + status = _PyEval_InitGIL(tstate); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + + return _PyStatus_OK(); +} + + static PyStatus pycore_create_interpreter(_PyRuntimeState *runtime, const PyConfig *config, - PyInterpreterState **interp_p) + PyThreadState **tstate_p) { PyInterpreterState *interp = PyInterpreterState_New(); if (interp == NULL) { return _PyStatus_ERR("can't make main interpreter"); } - *interp_p = interp; - PyStatus status = _PyConfig_Copy(&interp->config, config); + PyStatus status = _PyInterpreterState_SetConfig(interp, config); if (_PyStatus_EXCEPTION(status)) { return status; } - config = &interp->config; PyThreadState *tstate = PyThreadState_New(interp); - if (tstate == NULL) + if (tstate == NULL) { return _PyStatus_ERR("can't make first thread"); + } (void) PyThreadState_Swap(tstate); - /* We can't call _PyEval_FiniThreads() in Py_FinalizeEx because - destroying the GIL might fail when it is being referenced from - another running thread (see issue #9901). - Instead we destroy the previously created GIL here, which ensures - that we can call Py_Initialize / Py_FinalizeEx multiple times. */ - _PyEval_FiniThreads(&runtime->ceval); - - /* Auto-thread-state API */ - _PyGILState_Init(runtime, interp, tstate); - - /* Create the GIL */ - PyEval_InitThreads(); + status = init_interp_create_gil(tstate); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + *tstate_p = tstate; return _PyStatus_OK(); } static PyStatus -pycore_init_types(void) +pycore_init_types(PyThreadState *tstate) { - PyStatus status = _PyTypes_Init(); - if (_PyStatus_EXCEPTION(status)) { - return status; - } + PyStatus status; + int is_main_interp = _Py_IsMainInterpreter(tstate); - status = _PyUnicode_Init(); + status = _PyGC_Init(tstate); if (_PyStatus_EXCEPTION(status)) { return status; } - if (_PyStructSequence_Init() < 0) { - return _PyStatus_ERR("can't initialize structseq"); + if (is_main_interp) { + status = _PyTypes_Init(); + if (_PyStatus_EXCEPTION(status)) { + return status; + } } - if (!_PyLong_Init()) { + + if (!_PyLong_Init(tstate)) { return _PyStatus_ERR("can't init longs"); } + if (is_main_interp) { + status = _PyUnicode_Init(); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + } + status = _PyExc_Init(); if (_PyStatus_EXCEPTION(status)) { return status; } - if (!_PyFloat_Init()) { - return _PyStatus_ERR("can't init float"); - } + if (is_main_interp) { + if (!_PyFloat_Init()) { + return _PyStatus_ERR("can't init float"); + } - if (!_PyContext_Init()) { - return _PyStatus_ERR("can't init context"); + if (_PyStructSequence_Init() < 0) { + return _PyStatus_ERR("can't initialize structseq"); + } } status = _PyErr_Init(); @@ -593,109 +623,147 @@ pycore_init_types(void) return status; } + if (is_main_interp) { + if (!_PyContext_Init()) { + return _PyStatus_ERR("can't init context"); + } + } + return _PyStatus_OK(); } static PyStatus -pycore_init_builtins(PyInterpreterState *interp) +pycore_init_builtins(PyThreadState *tstate) { - PyObject *bimod = _PyBuiltin_Init(); + assert(!_PyErr_Occurred(tstate)); + + PyObject *bimod = _PyBuiltin_Init(tstate); if (bimod == NULL) { - return _PyStatus_ERR("can't initialize builtins modules"); + goto error; + } + + PyInterpreterState *interp = tstate->interp; + if (_PyImport_FixupBuiltin(bimod, "builtins", interp->modules) < 0) { + goto error; } - _PyImport_FixupBuiltin(bimod, "builtins", interp->modules); - interp->builtins = PyModule_GetDict(bimod); - if (interp->builtins == NULL) { - return _PyStatus_ERR("can't initialize builtins dict"); + PyObject *builtins_dict = PyModule_GetDict(bimod); + if (builtins_dict == NULL) { + goto error; } - Py_INCREF(interp->builtins); + Py_INCREF(builtins_dict); + interp->builtins = builtins_dict; PyStatus status = _PyBuiltins_AddExceptions(bimod); if (_PyStatus_EXCEPTION(status)) { return status; } + + interp->builtins_copy = PyDict_Copy(interp->builtins); + if (interp->builtins_copy == NULL) { + goto error; + } + Py_DECREF(bimod); + + assert(!_PyErr_Occurred(tstate)); + return _PyStatus_OK(); + +error: + Py_XDECREF(bimod); + return _PyStatus_ERR("can't initialize builtins module"); } static PyStatus -pycore_init_import_warnings(PyInterpreterState *interp, PyObject *sysmod) +pycore_init_import_warnings(PyThreadState *tstate, PyObject *sysmod) { - const PyConfig *config = &interp->config; - - PyStatus status = _PyImport_Init(interp); - if (_PyStatus_EXCEPTION(status)) { - return status; - } + assert(!_PyErr_Occurred(tstate)); - status = _PyImportHooks_Init(); + PyStatus status = _PyImportHooks_Init(tstate); if (_PyStatus_EXCEPTION(status)) { return status; } - /* Initialize _warnings. */ - if (_PyWarnings_Init() == NULL) { - return _PyStatus_ERR("can't initialize warnings"); - } - - if (config->_install_importlib) { - status = _PyConfig_WritePathConfig(config); + const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); + if (_Py_IsMainInterpreter(tstate)) { + /* Initialize _warnings. */ + status = _PyWarnings_InitState(tstate); if (_PyStatus_EXCEPTION(status)) { return status; } + + if (config->_install_importlib) { + status = _PyConfig_WritePathConfig(config); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + } } /* This call sets up builtin and frozen import support */ if (config->_install_importlib) { - status = init_importlib(interp, sysmod); + status = init_importlib(tstate, sysmod); if (_PyStatus_EXCEPTION(status)) { return status; } } + + assert(!_PyErr_Occurred(tstate)); + return _PyStatus_OK(); } static PyStatus -pyinit_config(_PyRuntimeState *runtime, - PyInterpreterState **interp_p, - const PyConfig *config) +pycore_interp_init(PyThreadState *tstate) { - PyInterpreterState *interp; - - _PyConfig_Write(config, runtime); + PyStatus status; + PyObject *sysmod = NULL; - PyStatus status = pycore_init_runtime(runtime, config); + status = pycore_init_types(tstate); if (_PyStatus_EXCEPTION(status)) { - return status; + goto done; } - status = pycore_create_interpreter(runtime, config, &interp); + status = _PySys_Create(tstate, &sysmod); if (_PyStatus_EXCEPTION(status)) { - return status; + goto done; } - config = &interp->config; - *interp_p = interp; - status = pycore_init_types(); + status = pycore_init_builtins(tstate); if (_PyStatus_EXCEPTION(status)) { - return status; + goto done; } - PyObject *sysmod; - status = _PySys_Create(runtime, interp, &sysmod); + status = pycore_init_import_warnings(tstate, sysmod); + +done: + /* sys.modules['sys'] contains a strong reference to the module */ + Py_XDECREF(sysmod); + return status; +} + + +static PyStatus +pyinit_config(_PyRuntimeState *runtime, + PyThreadState **tstate_p, + const PyConfig *config) +{ + PyStatus status = pycore_init_runtime(runtime, config); if (_PyStatus_EXCEPTION(status)) { return status; } - status = pycore_init_builtins(interp); + PyThreadState *tstate; + status = pycore_create_interpreter(runtime, config, &tstate); if (_PyStatus_EXCEPTION(status)) { return status; } + *tstate_p = tstate; - status = pycore_init_import_warnings(interp, sysmod); + status = pycore_interp_init(tstate); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -833,7 +901,7 @@ _Py_PreInitializeFromConfig(const PyConfig *config, static PyStatus pyinit_core(_PyRuntimeState *runtime, const PyConfig *src_config, - PyInterpreterState **interp_p) + PyThreadState **tstate_p) { PyStatus status; @@ -856,10 +924,10 @@ pyinit_core(_PyRuntimeState *runtime, } if (!runtime->core_initialized) { - status = pyinit_config(runtime, interp_p, &config); + status = pyinit_config(runtime, tstate_p, &config); } else { - status = pyinit_core_reconfigure(runtime, interp_p, &config); + status = pyinit_core_reconfigure(runtime, tstate_p, &config); } if (_PyStatus_EXCEPTION(status)) { goto done; @@ -875,16 +943,16 @@ pyinit_core(_PyRuntimeState *runtime, configuration. Example of bpo-34008: Py_Main() called after Py_Initialize(). */ static PyStatus -_Py_ReconfigureMainInterpreter(PyInterpreterState *interp) +_Py_ReconfigureMainInterpreter(PyThreadState *tstate) { - PyConfig *config = &interp->config; + const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); PyObject *argv = _PyWideStringList_AsList(&config->argv); if (argv == NULL) { return _PyStatus_NO_MEMORY(); \ } - int res = PyDict_SetItemString(interp->sysdict, "argv", argv); + int res = PyDict_SetItemString(tstate->interp->sysdict, "argv", argv); Py_DECREF(argv); if (res < 0) { return _PyStatus_ERR("fail to set sys.argv"); @@ -892,30 +960,16 @@ _Py_ReconfigureMainInterpreter(PyInterpreterState *interp) return _PyStatus_OK(); } -/* Update interpreter state based on supplied configuration settings - * - * After calling this function, most of the restrictions on the interpreter - * are lifted. The only remaining incomplete settings are those related - * to the main module (sys.argv[0], __main__ metadata) - * - * Calling this when the interpreter is not initializing, is already - * initialized or without a valid current thread state is a fatal error. - * Other errors should be reported as normal Python exceptions with a - * non-zero return code. - */ + static PyStatus -pyinit_main(_PyRuntimeState *runtime, PyInterpreterState *interp) +init_interp_main(PyThreadState *tstate) { - if (!runtime->core_initialized) { - return _PyStatus_ERR("runtime core not initialized"); - } + assert(!_PyErr_Occurred(tstate)); - /* Configure the main interpreter */ - PyConfig *config = &interp->config; - - if (runtime->initialized) { - return _Py_ReconfigureMainInterpreter(interp); - } + PyStatus status; + int is_main_interp = _Py_IsMainInterpreter(tstate); + PyInterpreterState *interp = tstate->interp; + const PyConfig *config = _PyInterpreterState_GetConfig(interp); if (!config->_install_importlib) { /* Special mode for freeze_importlib: run with no import system @@ -923,85 +977,131 @@ pyinit_main(_PyRuntimeState *runtime, PyInterpreterState *interp) * This means anything which needs support from extension modules * or pure Python code in the standard library won't work. */ - runtime->initialized = 1; + if (is_main_interp) { + interp->runtime->initialized = 1; + } return _PyStatus_OK(); } - if (_PyTime_Init() < 0) { - return _PyStatus_ERR("can't initialize time"); + if (is_main_interp) { + if (_PyTime_Init() < 0) { + return _PyStatus_ERR("can't initialize time"); + } } - if (_PySys_InitMain(runtime, interp) < 0) { + if (_PySys_InitMain(tstate) < 0) { return _PyStatus_ERR("can't finish initializing sys"); } - PyStatus status = init_importlib_external(interp); + status = init_importlib_external(tstate); if (_PyStatus_EXCEPTION(status)) { return status; } - /* initialize the faulthandler module */ - status = _PyFaulthandler_Init(config->faulthandler); - if (_PyStatus_EXCEPTION(status)) { - return status; + if (is_main_interp) { + /* initialize the faulthandler module */ + status = _PyFaulthandler_Init(config->faulthandler); + if (_PyStatus_EXCEPTION(status)) { + return status; + } } - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); status = _PyUnicode_InitEncodings(tstate); if (_PyStatus_EXCEPTION(status)) { return status; } - if (config->install_signal_handlers) { - status = init_signals(); - if (_PyStatus_EXCEPTION(status)) { - return status; + if (is_main_interp) { + if (_PySignal_Init(config->install_signal_handlers) < 0) { + return _PyStatus_ERR("can't initialize signals"); + } + + if (_PyTraceMalloc_Init(config->tracemalloc) < 0) { + return _PyStatus_ERR("can't initialize tracemalloc"); } } - if (_PyTraceMalloc_Init(config->tracemalloc) < 0) { - return _PyStatus_ERR("can't initialize tracemalloc"); + status = init_sys_streams(tstate); + if (_PyStatus_EXCEPTION(status)) { + return status; } - status = add_main_module(interp); + status = init_set_builtins_open(); if (_PyStatus_EXCEPTION(status)) { return status; } - status = init_sys_streams(interp); + status = add_main_module(interp); if (_PyStatus_EXCEPTION(status)) { return status; } - /* Initialize warnings. */ - PyObject *warnoptions = PySys_GetObject("warnoptions"); - if (warnoptions != NULL && PyList_Size(warnoptions) > 0) - { - PyObject *warnings_module = PyImport_ImportModule("warnings"); - if (warnings_module == NULL) { - fprintf(stderr, "'import warnings' failed; traceback:\n"); - PyErr_Print(); + if (is_main_interp) { + /* Initialize warnings. */ + PyObject *warnoptions = PySys_GetObject("warnoptions"); + if (warnoptions != NULL && PyList_Size(warnoptions) > 0) + { + PyObject *warnings_module = PyImport_ImportModule("warnings"); + if (warnings_module == NULL) { + fprintf(stderr, "'import warnings' failed; traceback:\n"); + _PyErr_Print(tstate); + } + Py_XDECREF(warnings_module); } - Py_XDECREF(warnings_module); - } - runtime->initialized = 1; + interp->runtime->initialized = 1; + } if (config->site_import) { - status = init_import_size(); /* Module site */ + status = init_import_site(); if (_PyStatus_EXCEPTION(status)) { return status; } } + if (is_main_interp) { #ifndef MS_WINDOWS - emit_stderr_warning_for_legacy_locale(runtime); + emit_stderr_warning_for_legacy_locale(interp->runtime); #endif + } + + assert(!_PyErr_Occurred(tstate)); return _PyStatus_OK(); } +/* Update interpreter state based on supplied configuration settings + * + * After calling this function, most of the restrictions on the interpreter + * are lifted. The only remaining incomplete settings are those related + * to the main module (sys.argv[0], __main__ metadata) + * + * Calling this when the interpreter is not initializing, is already + * initialized or without a valid current thread state is a fatal error. + * Other errors should be reported as normal Python exceptions with a + * non-zero return code. + */ +static PyStatus +pyinit_main(PyThreadState *tstate) +{ + PyInterpreterState *interp = tstate->interp; + if (!interp->runtime->core_initialized) { + return _PyStatus_ERR("runtime core not initialized"); + } + + if (interp->runtime->initialized) { + return _Py_ReconfigureMainInterpreter(tstate); + } + + PyStatus status = init_interp_main(tstate); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + return _PyStatus_OK(); +} + + PyStatus _Py_InitializeMain(void) { @@ -1010,9 +1110,8 @@ _Py_InitializeMain(void) return status; } _PyRuntimeState *runtime = &_PyRuntime; - PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp; - - return pyinit_main(runtime, interp); + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + return pyinit_main(tstate); } @@ -1031,15 +1130,15 @@ Py_InitializeFromConfig(const PyConfig *config) } _PyRuntimeState *runtime = &_PyRuntime; - PyInterpreterState *interp = NULL; - status = pyinit_core(runtime, config, &interp); + PyThreadState *tstate = NULL; + status = pyinit_core(runtime, config, &tstate); if (_PyStatus_EXCEPTION(status)) { return status; } - config = &interp->config; + config = _PyInterpreterState_GetConfig(tstate->interp); if (config->_init_main) { - status = pyinit_main(runtime, interp); + status = pyinit_main(tstate); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -1083,10 +1182,6 @@ Py_Initialize(void) } -#ifdef COUNT_ALLOCS -extern void _Py_dump_counts(FILE*); -#endif - /* Flush stdout and stderr */ static int @@ -1114,7 +1209,7 @@ flush_std_files(void) int status = 0; if (fout != NULL && fout != Py_None && !file_is_closed(fout)) { - tmp = _PyObject_CallMethodId(fout, &PyId_flush, NULL); + tmp = _PyObject_CallMethodIdNoArgs(fout, &PyId_flush); if (tmp == NULL) { PyErr_WriteUnraisable(fout); status = -1; @@ -1124,7 +1219,7 @@ flush_std_files(void) } if (ferr != NULL && ferr != Py_None && !file_is_closed(ferr)) { - tmp = _PyObject_CallMethodId(ferr, &PyId_flush, NULL); + tmp = _PyObject_CallMethodIdNoArgs(ferr, &PyId_flush); if (tmp == NULL) { PyErr_Clear(); status = -1; @@ -1150,6 +1245,102 @@ flush_std_files(void) */ + +static void +finalize_interp_types(PyThreadState *tstate, int is_main_interp) +{ + if (is_main_interp) { + /* Sundry finalizers */ + _PyAST_Fini(); + _PyFrame_Fini(); + _PyTuple_Fini(); + _PyList_Fini(); + _PySet_Fini(); + _PyBytes_Fini(); + } + + _PyLong_Fini(tstate); + + if (is_main_interp) { + _PyFloat_Fini(); + _PyDict_Fini(); + _PySlice_Fini(); + } + + _PyWarnings_Fini(tstate->interp); + + if (is_main_interp) { + _Py_HashRandomization_Fini(); + _PyArg_Fini(); + _PyAsyncGen_Fini(); + _PyContext_Fini(); + } + + /* Cleanup Unicode implementation */ + _PyUnicode_Fini(tstate); + + if (is_main_interp) { + _Py_ClearFileSystemEncoding(); + } +} + + +static void +finalize_interp_clear(PyThreadState *tstate) +{ + int is_main_interp = _Py_IsMainInterpreter(tstate); + + /* Clear interpreter state and all thread states */ + PyInterpreterState_Clear(tstate->interp); + + /* Trigger a GC collection on subinterpreters*/ + if (!is_main_interp) { + _PyGC_CollectNoFail(); + } + + /* Clear all loghooks */ + /* Both _PySys_Audit function and users still need PyObject, such as tuple. + Call _PySys_ClearAuditHooks when PyObject available. */ + if (is_main_interp) { + _PySys_ClearAuditHooks(tstate); + } + + finalize_interp_types(tstate, is_main_interp); + + if (is_main_interp) { + /* XXX Still allocated: + - various static ad-hoc pointers to interned strings + - int and float free list blocks + - whatever various modules and libraries allocate + */ + + PyGrammar_RemoveAccelerators(&_PyParser_Grammar); + + _PyExc_Fini(); + } + + _PyGC_Fini(tstate); +} + + +static void +finalize_interp_delete(PyThreadState *tstate) +{ + if (_Py_IsMainInterpreter(tstate)) { + /* Cleanup auto-thread-state */ + _PyGILState_Fini(tstate); + } + + /* We can't call _PyEval_FiniGIL() here because destroying the GIL lock can + fail when it is being awaited by another running daemon thread (see + bpo-9901). Instead pycore_create_interpreter() destroys the previously + created GIL, which ensures that Py_Initialize / Py_FinalizeEx can be + called multiple times. */ + + PyInterpreterState_Delete(tstate->interp); +} + + int Py_FinalizeEx(void) { @@ -1160,15 +1351,14 @@ Py_FinalizeEx(void) return status; } + /* Get current thread state and interpreter pointer */ + PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + // Wrap up existing "threading"-module-created, non-daemon threads. - wait_for_thread_shutdown(); + wait_for_thread_shutdown(tstate); // Make any remaining pending calls. - _Py_FinishPendingCalls(runtime); - - /* Get current thread state and interpreter pointer */ - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); - PyInterpreterState *interp = tstate->interp; + _Py_FinishPendingCalls(tstate); /* The interpreter is still entirely intact at this point, and the * exit funcs may be relying on that. In particular, if some thread @@ -1180,26 +1370,36 @@ Py_FinalizeEx(void) * the threads created via Threading. */ - call_py_exitfuncs(interp); + call_py_exitfuncs(tstate); /* Copy the core config, PyInterpreterState_Delete() free the core config memory */ #ifdef Py_REF_DEBUG - int show_ref_count = interp->config.show_ref_count; + int show_ref_count = tstate->interp->config.show_ref_count; #endif #ifdef Py_TRACE_REFS - int dump_refs = interp->config.dump_refs; + int dump_refs = tstate->interp->config.dump_refs; #endif #ifdef WITH_PYMALLOC - int malloc_stats = interp->config.malloc_stats; + int malloc_stats = tstate->interp->config.malloc_stats; #endif - /* Remaining threads (e.g. daemon threads) will automatically exit - after taking the GIL (in PyEval_RestoreThread()). */ - runtime->finalizing = tstate; + /* Remaining daemon threads will automatically exit + when they attempt to take the GIL (ex: PyEval_RestoreThread()). */ + _PyRuntimeState_SetFinalizing(runtime, tstate); runtime->initialized = 0; runtime->core_initialized = 0; + /* Destroy the state of all threads of the interpreter, except of the + current thread. In practice, only daemon threads should still be alive, + except if wait_for_thread_shutdown() has been cancelled by CTRL+C. + Clear frames of other threads to call objects destructors. Destructors + will be called in the current Python thread. Since + _PyRuntimeState_SetFinalizing() has been called, no other Python thread + can take the GIL at this point: if they try, they will exit + immediately. */ + _PyThreadState_DeleteExcept(runtime, tstate); + /* Flush sys.stdout and sys.stderr */ if (flush_std_files() < 0) { status = -1; @@ -1221,16 +1421,9 @@ Py_FinalizeEx(void) * XXX I haven't seen a real-life report of either of these. */ _PyGC_CollectIfEnabled(); -#ifdef COUNT_ALLOCS - /* With COUNT_ALLOCS, it helps to run GC multiple times: - each collection might release some types from the type - list, so they become garbage. */ - while (_PyGC_CollectIfEnabled() > 0) - /* nothing */; -#endif /* Destroy all modules */ - PyImport_Cleanup(); + _PyImport_Cleanup(tstate); /* Print debug stats if any */ _PyEval_Fini(); @@ -1272,10 +1465,6 @@ Py_FinalizeEx(void) /* unload faulthandler module */ _PyFaulthandler_Fini(); - /* Debugging stuff */ -#ifdef COUNT_ALLOCS - _Py_dump_counts(stderr); -#endif /* dump hash stats */ _PyHash_Fini(); @@ -1296,63 +1485,8 @@ Py_FinalizeEx(void) } #endif /* Py_TRACE_REFS */ - /* Clear interpreter state and all thread states. */ - PyInterpreterState_Clear(interp); - - /* 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(); - - /* Now we decref the exception classes. After this point nothing - can raise an exception. That's okay, because each Fini() method - below has been checked to make sure no exceptions are ever - raised. - */ - - _PyExc_Fini(); - - /* Sundry finalizers */ - PyMethod_Fini(); - PyFrame_Fini(); - PyCFunction_Fini(); - PyTuple_Fini(); - PyList_Fini(); - PySet_Fini(); - PyBytes_Fini(); - PyLong_Fini(); - PyFloat_Fini(); - PyDict_Fini(); - PySlice_Fini(); - _PyGC_Fini(runtime); - _PyWarnings_Fini(interp); - _Py_HashRandomization_Fini(); - _PyArg_Fini(); - PyAsyncGen_Fini(); - _PyContext_Fini(); - - /* Cleanup Unicode implementation */ - _PyUnicode_Fini(); - - _Py_ClearFileSystemEncoding(); - - /* XXX Still allocated: - - various static ad-hoc pointers to interned strings - - int and float free list blocks - - whatever various modules and libraries allocate - */ - - PyGrammar_RemoveAccelerators(&_PyParser_Grammar); - - /* Cleanup auto-thread-state */ - _PyGILState_Fini(runtime); - - /* Delete current thread. After this, many C API calls become crashy. */ - PyThreadState_Swap(NULL); - - PyInterpreterState_Delete(interp); + finalize_interp_clear(tstate); + finalize_interp_delete(tstate); #ifdef Py_TRACE_REFS /* Display addresses (& refcnts) of all objects still alive. @@ -1381,6 +1515,7 @@ Py_Finalize(void) Py_FinalizeEx(); } + /* Create and initialize a new interpreter and thread, and return the new thread. This requires that Py_Initialize() has been called first. @@ -1395,7 +1530,7 @@ Py_Finalize(void) */ static PyStatus -new_interpreter(PyThreadState **tstate_p) +new_interpreter(PyThreadState **tstate_p, int isolated_subinterpreter) { PyStatus status; @@ -1411,7 +1546,7 @@ new_interpreter(PyThreadState **tstate_p) /* Issue #10915, #15751: The GIL API doesn't work with multiple interpreters: disable PyGILState_Check(). */ - _PyGILState_check_enabled = 0; + runtime->gilstate.check_enabled = 0; PyInterpreterState *interp = PyInterpreterState_New(); if (interp == NULL) { @@ -1429,140 +1564,59 @@ new_interpreter(PyThreadState **tstate_p) PyThreadState *save_tstate = PyThreadState_Swap(tstate); /* Copy the current interpreter config into the new interpreter */ - PyConfig *config; + const PyConfig *config; if (save_tstate != NULL) { - config = &save_tstate->interp->config; - } else { + config = _PyInterpreterState_GetConfig(save_tstate->interp); + } + else + { /* No current thread state, copy from the main interpreter */ PyInterpreterState *main_interp = PyInterpreterState_Main(); - config = &main_interp->config; + config = _PyInterpreterState_GetConfig(main_interp); } - status = _PyConfig_Copy(&interp->config, config); + status = _PyInterpreterState_SetConfig(interp, config); if (_PyStatus_EXCEPTION(status)) { - return status; + goto error; } - config = &interp->config; + interp->config._isolated_interpreter = isolated_subinterpreter; - status = _PyExc_Init(); + status = init_interp_create_gil(tstate); if (_PyStatus_EXCEPTION(status)) { - return status; + goto error; } - status = _PyErr_Init(); + status = pycore_interp_init(tstate); if (_PyStatus_EXCEPTION(status)) { - return status; - } - - - /* XXX The following is lax in error checking */ - PyObject *modules = PyDict_New(); - if (modules == NULL) { - return _PyStatus_ERR("can't make modules dictionary"); - } - interp->modules = modules; - - PyObject *sysmod = _PyImport_FindBuiltin("sys", modules); - if (sysmod != NULL) { - interp->sysdict = PyModule_GetDict(sysmod); - if (interp->sysdict == NULL) { - goto handle_error; - } - Py_INCREF(interp->sysdict); - PyDict_SetItemString(interp->sysdict, "modules", modules); - if (_PySys_InitMain(runtime, interp) < 0) { - return _PyStatus_ERR("can't finish initializing sys"); - } - } - else if (PyErr_Occurred()) { - goto handle_error; - } - - PyObject *bimod = _PyImport_FindBuiltin("builtins", modules); - if (bimod != NULL) { - interp->builtins = PyModule_GetDict(bimod); - if (interp->builtins == NULL) - goto handle_error; - Py_INCREF(interp->builtins); - } - else if (PyErr_Occurred()) { - goto handle_error; - } - - if (bimod != NULL && sysmod != NULL) { - status = _PyBuiltins_AddExceptions(bimod); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = _PySys_SetPreliminaryStderr(interp->sysdict); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = _PyImportHooks_Init(); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = init_importlib(interp, sysmod); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = init_importlib_external(interp); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = _PyUnicode_InitEncodings(tstate); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = init_sys_streams(interp); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = add_main_module(interp); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - if (config->site_import) { - status = init_import_size(); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - } + goto error; } - if (PyErr_Occurred()) { - goto handle_error; + status = init_interp_main(tstate); + if (_PyStatus_EXCEPTION(status)) { + goto error; } *tstate_p = tstate; return _PyStatus_OK(); -handle_error: - /* Oops, it didn't work. Undo it all. */ +error: + *tstate_p = NULL; + /* Oops, it didn't work. Undo it all. */ PyErr_PrintEx(0); PyThreadState_Clear(tstate); - PyThreadState_Swap(save_tstate); PyThreadState_Delete(tstate); PyInterpreterState_Delete(interp); + PyThreadState_Swap(save_tstate); - *tstate_p = NULL; - return _PyStatus_OK(); + return status; } PyThreadState * -Py_NewInterpreter(void) +_Py_NewInterpreter(int isolated_subinterpreter) { PyThreadState *tstate = NULL; - PyStatus status = new_interpreter(&tstate); + PyStatus status = new_interpreter(&tstate, isolated_subinterpreter); if (_PyStatus_EXCEPTION(status)) { Py_ExitStatusException(status); } @@ -1570,6 +1624,12 @@ Py_NewInterpreter(void) } +PyThreadState * +Py_NewInterpreter(void) +{ + return _Py_NewInterpreter(0); +} + /* Delete an interpreter and its last thread. This requires that the given thread state is current, that the thread has no remaining frames, and that it is its interpreter's only remaining thread. @@ -1587,24 +1647,26 @@ Py_EndInterpreter(PyThreadState *tstate) { PyInterpreterState *interp = tstate->interp; - if (tstate != _PyThreadState_GET()) - Py_FatalError("Py_EndInterpreter: thread is not current"); - if (tstate->frame != NULL) - Py_FatalError("Py_EndInterpreter: thread still has a frame"); + if (tstate != _PyThreadState_GET()) { + Py_FatalError("thread is not current"); + } + if (tstate->frame != NULL) { + Py_FatalError("thread still has a frame"); + } interp->finalizing = 1; // Wrap up existing "threading"-module-created, non-daemon threads. - wait_for_thread_shutdown(); + wait_for_thread_shutdown(tstate); - call_py_exitfuncs(interp); + call_py_exitfuncs(tstate); - if (tstate != interp->tstate_head || tstate->next != NULL) - Py_FatalError("Py_EndInterpreter: not the last thread"); + if (tstate != interp->tstate_head || tstate->next != NULL) { + Py_FatalError("not the last thread"); + } - PyImport_Cleanup(); - PyInterpreterState_Clear(interp); - PyThreadState_Swap(NULL); - PyInterpreterState_Delete(interp); + _PyImport_Cleanup(tstate); + finalize_interp_clear(tstate); + finalize_interp_delete(tstate); } /* Add the __main__ module */ @@ -1660,7 +1722,7 @@ add_main_module(PyInterpreterState *interp) /* Import the site module (not into __main__ though) */ static PyStatus -init_import_size(void) +init_import_site(void) { PyObject *m; m = PyImport_ImportModule("site"); @@ -1740,10 +1802,10 @@ create_stdio(const PyConfig *config, PyObject* io, mode = "wb"; else mode = "rb"; - buf = _PyObject_CallMethodId(io, &PyId_open, "isiOOOi", + buf = _PyObject_CallMethodId(io, &PyId_open, "isiOOOO", fd, mode, buffering, Py_None, Py_None, /* encoding, errors */ - Py_None, 0); /* newline, closefd */ + Py_None, Py_False); /* newline, closefd */ if (buf == NULL) goto error; @@ -1767,7 +1829,7 @@ create_stdio(const PyConfig *config, PyObject* io, text = PyUnicode_FromString(name); if (text == NULL || _PyObject_SetAttrId(raw, &PyId_name, text) < 0) goto error; - res = _PyObject_CallMethodId(raw, &PyId_isatty, NULL); + res = _PyObject_CallMethodIdNoArgs(raw, &PyId_isatty); if (res == NULL) goto error; isatty = PyObject_IsTrue(res); @@ -1778,7 +1840,7 @@ create_stdio(const PyConfig *config, PyObject* io, write_through = Py_True; else write_through = Py_False; - if (isatty && buffered_stdio) + if (buffered_stdio && (isatty || fd == fileno(stderr))) line_buffering = Py_True; else line_buffering = Py_False; @@ -1845,18 +1907,55 @@ create_stdio(const PyConfig *config, PyObject* io, return NULL; } -/* Initialize sys.stdin, stdout, stderr and builtins.open */ +/* Set builtins.open to io.OpenWrapper */ static PyStatus -init_sys_streams(PyInterpreterState *interp) +init_set_builtins_open(void) { PyObject *iomod = NULL, *wrapper; PyObject *bimod = NULL; + PyStatus res = _PyStatus_OK(); + + if (!(iomod = PyImport_ImportModule("io"))) { + goto error; + } + + if (!(bimod = PyImport_ImportModule("builtins"))) { + goto error; + } + + if (!(wrapper = PyObject_GetAttrString(iomod, "OpenWrapper"))) { + goto error; + } + + /* Set builtins.open */ + if (PyObject_SetAttrString(bimod, "open", wrapper) == -1) { + Py_DECREF(wrapper); + goto error; + } + Py_DECREF(wrapper); + goto done; + +error: + res = _PyStatus_ERR("can't initialize io.open"); + +done: + Py_XDECREF(bimod); + Py_XDECREF(iomod); + return res; +} + + +/* Initialize sys.stdin, stdout, stderr and builtins.open */ +static PyStatus +init_sys_streams(PyThreadState *tstate) +{ + PyObject *iomod = NULL; PyObject *m; PyObject *std = NULL; int fd; PyObject * encoding_attr; PyStatus res = _PyStatus_OK(); - PyConfig *config = &interp->config; + const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); /* Check that stdin is not a directory Using shell redirection, you can redirect stdin to a directory, @@ -1883,23 +1982,9 @@ init_sys_streams(PyInterpreterState *interp) } Py_DECREF(m); - if (!(bimod = PyImport_ImportModule("builtins"))) { - goto error; - } - if (!(iomod = PyImport_ImportModule("io"))) { goto error; } - if (!(wrapper = PyObject_GetAttrString(iomod, "OpenWrapper"))) { - goto error; - } - - /* Set builtins.open */ - if (PyObject_SetAttrString(bimod, "open", wrapper) == -1) { - Py_DECREF(wrapper); - goto error; - } - Py_DECREF(wrapper); /* Set sys.stdin */ fd = fileno(stdin); @@ -1947,7 +2032,7 @@ init_sys_streams(PyInterpreterState *interp) } Py_DECREF(encoding_attr); } - PyErr_Clear(); /* Not a fatal error if codec isn't available */ + _PyErr_Clear(tstate); /* Not a fatal error if codec isn't available */ if (PySys_SetObject("__stderr__", std) < 0) { Py_DECREF(std); @@ -1967,8 +2052,6 @@ init_sys_streams(PyInterpreterState *interp) done: _Py_ClearStandardStreamEncoding(); - - Py_XDECREF(bimod); Py_XDECREF(iomod); return res; } @@ -1994,13 +2077,13 @@ _Py_FatalError_DumpTracebacks(int fd, PyInterpreterState *interp, Return 1 if the traceback was displayed, 0 otherwise. */ static int -_Py_FatalError_PrintExc(int fd) +_Py_FatalError_PrintExc(PyThreadState *tstate) { PyObject *ferr, *res; PyObject *exception, *v, *tb; int has_tb; - PyErr_Fetch(&exception, &v, &tb); + _PyErr_Fetch(tstate, &exception, &v, &tb); if (exception == NULL) { /* No current exception */ return 0; @@ -2013,7 +2096,7 @@ _Py_FatalError_PrintExc(int fd) return 0; } - PyErr_NormalizeException(&exception, &v, &tb); + _PyErr_NormalizeException(tstate, &exception, &v, &tb); if (tb == NULL) { tb = Py_None; Py_INCREF(tb); @@ -2031,11 +2114,13 @@ _Py_FatalError_PrintExc(int fd) Py_XDECREF(tb); /* sys.stderr may be buffered: call sys.stderr.flush() */ - res = _PyObject_CallMethodId(ferr, &PyId_flush, NULL); - if (res == NULL) - PyErr_Clear(); - else + res = _PyObject_CallMethodIdNoArgs(ferr, &PyId_flush); + if (res == NULL) { + _PyErr_Clear(tstate); + } + else { Py_DECREF(res); + } return has_tb; } @@ -2082,8 +2167,9 @@ static void fatal_error_dump_runtime(FILE *stream, _PyRuntimeState *runtime) { fprintf(stream, "Python runtime state: "); - if (runtime->finalizing) { - fprintf(stream, "finalizing (tstate=%p)", runtime->finalizing); + PyThreadState *finalizing = _PyRuntimeState_GetFinalizing(runtime); + if (finalizing) { + fprintf(stream, "finalizing (tstate=%p)", finalizing); } else if (runtime->initialized) { fprintf(stream, "initialized"); @@ -2105,33 +2191,50 @@ fatal_error_dump_runtime(FILE *stream, _PyRuntimeState *runtime) } +static inline void _Py_NO_RETURN +fatal_error_exit(int status) +{ + if (status < 0) { +#if defined(MS_WINDOWS) && defined(_DEBUG) + DebugBreak(); +#endif + abort(); + } + else { + exit(status); + } +} + + static void _Py_NO_RETURN -fatal_error(const char *prefix, const char *msg, int status) +fatal_error(FILE *stream, int header, const char *prefix, const char *msg, + int status) { - FILE *stream = stderr; const int fd = fileno(stream); static int reentrant = 0; if (reentrant) { /* Py_FatalError() caused a second fatal error. Example: flush_std_files() raises a recursion error. */ - goto exit; + fatal_error_exit(status); } reentrant = 1; - fprintf(stream, "Fatal Python error: "); - if (prefix) { - fputs(prefix, stream); - fputs(": ", stream); - } - if (msg) { - fputs(msg, stream); - } - else { - fprintf(stream, ""); + if (header) { + fprintf(stream, "Fatal Python error: "); + if (prefix) { + fputs(prefix, stream); + fputs(": ", stream); + } + if (msg) { + fputs(msg, stream); + } + else { + fprintf(stream, ""); + } + fputs("\n", stream); + fflush(stream); } - fputs("\n", stream); - fflush(stream); /* it helps in Windows debug build */ _PyRuntimeState *runtime = &_PyRuntime; fatal_error_dump_runtime(stream, runtime); @@ -2154,7 +2257,7 @@ fatal_error(const char *prefix, const char *msg, int status) int has_tstate_and_gil = (tss_tstate != NULL && tss_tstate == tstate); if (has_tstate_and_gil) { /* If an exception is set, print the exception with its traceback */ - if (!_Py_FatalError_PrintExc(fd)) { + if (!_Py_FatalError_PrintExc(tss_tstate)) { /* No exception is set, or an exception is set without traceback */ _Py_FatalError_DumpTracebacks(fd, interp, tss_tstate); } @@ -2179,24 +2282,60 @@ fatal_error(const char *prefix, const char *msg, int status) fatal_output_debug(msg); #endif /* MS_WINDOWS */ -exit: - if (status < 0) { -#if defined(MS_WINDOWS) && defined(_DEBUG) - DebugBreak(); -#endif - abort(); - } - else { - exit(status); - } + fatal_error_exit(status); } + +#undef Py_FatalError + void _Py_NO_RETURN Py_FatalError(const char *msg) { - fatal_error(NULL, msg, -1); + fatal_error(stderr, 1, NULL, msg, -1); +} + + +void _Py_NO_RETURN +_Py_FatalErrorFunc(const char *func, const char *msg) +{ + fatal_error(stderr, 1, func, msg, -1); +} + + +void _Py_NO_RETURN +_Py_FatalErrorFormat(const char *func, const char *format, ...) +{ + static int reentrant = 0; + if (reentrant) { + /* _Py_FatalErrorFormat() caused a second fatal error */ + fatal_error_exit(-1); + } + reentrant = 1; + + FILE *stream = stderr; + fprintf(stream, "Fatal Python error: "); + if (func) { + fputs(func, stream); + fputs(": ", stream); + } + fflush(stream); + + va_list vargs; +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, format); +#else + va_start(vargs); +#endif + vfprintf(stream, format, vargs); + va_end(vargs); + + fputs("\n", stream); + fflush(stream); + + fatal_error(stream, 0, NULL, NULL, -1); } + void _Py_NO_RETURN Py_ExitStatusException(PyStatus status) { @@ -2204,7 +2343,7 @@ Py_ExitStatusException(PyStatus status) exit(status.exitcode); } else if (_PyStatus_IS_ERROR(status)) { - fatal_error(status.func, status.err_msg, 1); + fatal_error(stderr, 1, status.func, status.err_msg, 1); } else { Py_FatalError("Py_ExitStatusException() must not be called on success"); @@ -2213,12 +2352,10 @@ Py_ExitStatusException(PyStatus status) /* Clean up and exit */ -# include "pythread.h" - /* For the atexit module. */ void _Py_PyAtExit(void (*func)(PyObject *), PyObject *module) { - PyInterpreterState *is = _PyInterpreterState_Get(); + PyInterpreterState *is = _PyInterpreterState_GET(); /* Guard against API misuse (see bpo-17852) */ assert(is->pyexitfunc == NULL || is->pyexitfunc == func); @@ -2228,13 +2365,14 @@ void _Py_PyAtExit(void (*func)(PyObject *), PyObject *module) } static void -call_py_exitfuncs(PyInterpreterState *istate) +call_py_exitfuncs(PyThreadState *tstate) { - if (istate->pyexitfunc == NULL) + PyInterpreterState *interp = tstate->interp; + if (interp->pyexitfunc == NULL) return; - (*istate->pyexitfunc)(istate->pyexitmodule); - PyErr_Clear(); + (*interp->pyexitfunc)(interp->pyexitmodule); + _PyErr_Clear(tstate); } /* Wait until threading._shutdown completes, provided @@ -2242,19 +2380,19 @@ call_py_exitfuncs(PyInterpreterState *istate) The shutdown routine will wait until all non-daemon "threading" threads have completed. */ static void -wait_for_thread_shutdown(void) +wait_for_thread_shutdown(PyThreadState *tstate) { _Py_IDENTIFIER(_shutdown); PyObject *result; PyObject *threading = _PyImport_GetModuleId(&PyId_threading); if (threading == NULL) { - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { PyErr_WriteUnraisable(NULL); } /* else: threading not imported */ return; } - result = _PyObject_CallMethodId(threading, &PyId__shutdown, NULL); + result = _PyObject_CallMethodIdNoArgs(threading, &PyId__shutdown); if (result == NULL) { PyErr_WriteUnraisable(threading); } @@ -2299,31 +2437,14 @@ Py_Exit(int sts) exit(sts); } -static PyStatus -init_signals(void) -{ -#ifdef SIGPIPE - PyOS_setsig(SIGPIPE, SIG_IGN); -#endif -#ifdef SIGXFZ - PyOS_setsig(SIGXFZ, SIG_IGN); -#endif -#ifdef SIGXFSZ - PyOS_setsig(SIGXFSZ, SIG_IGN); -#endif - PyOS_InitInterrupts(); /* May imply init_signals() */ - if (PyErr_Occurred()) { - return _PyStatus_ERR("can't import signal"); - } - return _PyStatus_OK(); -} - /* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL. * * All of the code in this function must only use async-signal-safe functions, * listed at `man 7 signal` or * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html. + * + * If this function is updated, update also _posix_spawn() of subprocess.py. */ void _Py_RestoreSignals(void) diff --git a/Python/pymath.c b/Python/pymath.c index 24b804223eef19a9e551d6916ea1230f7bfd7644..a08a0e796156f7f0f87083e1067ebace4cb2b3e8 100644 --- a/Python/pymath.c +++ b/Python/pymath.c @@ -79,3 +79,18 @@ round(double x) return copysign(y, x); } #endif /* HAVE_ROUND */ + +static const unsigned int BitLengthTable[32] = { + 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 +}; + +unsigned int _Py_bit_length(unsigned long d) { + unsigned int d_bits = 0; + while (d >= 32) { + d_bits += 6; + d >>= 6; + } + d_bits += BitLengthTable[d]; + return d_bits; +} diff --git a/Python/pystate.c b/Python/pystate.c index b1d0f1cbec428a1579b913d6167be913ca1901b2..9beefa8e20c444d1664f65c70782bf1239e61bdf 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -4,9 +4,11 @@ #include "Python.h" #include "pycore_ceval.h" #include "pycore_initconfig.h" -#include "pycore_pymem.h" -#include "pycore_pystate.h" +#include "pycore_pyerrors.h" #include "pycore_pylifecycle.h" +#include "pycore_pymem.h" // _PyMem_SetDefaultAllocator() +#include "pycore_pystate.h" // _PyThreadState_GET() +#include "pycore_sysmodule.h" /* -------------------------------------------------------------------------- CAUTION @@ -39,7 +41,7 @@ extern "C" { /* Forward declarations */ static PyThreadState *_PyGILState_GetThisThreadState(struct _gilstate_runtime_state *gilstate); -static void _PyThreadState_Delete(_PyRuntimeState *runtime, PyThreadState *tstate); +static void _PyThreadState_Delete(PyThreadState *tstate, int check_current); static PyStatus @@ -58,8 +60,7 @@ _PyRuntimeState_Init_impl(_PyRuntimeState *runtime) runtime->open_code_userdata = open_code_userdata; runtime->audit_hook_head = audit_hook_head; - _PyGC_Initialize(&runtime->gc); - _PyEval_Initialize(&runtime->ceval); + _PyEval_InitRuntimeState(&runtime->ceval); PyPreConfig_InitPythonConfig(&runtime->preconfig); @@ -121,6 +122,7 @@ _PyRuntimeState_Fini(_PyRuntimeState *runtime) PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); } +#ifdef HAVE_FORK /* This function is called from PyOS_AfterFork_Child to ensure that * newly created child processes do not share locks with the parent. */ @@ -136,24 +138,25 @@ _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime) PyMemAllocatorEx old_alloc; _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - runtime->interpreters.mutex = PyThread_allocate_lock(); - runtime->interpreters.main->id_mutex = PyThread_allocate_lock(); - runtime->xidregistry.mutex = PyThread_allocate_lock(); + int interp_mutex = _PyThread_at_fork_reinit(&runtime->interpreters.mutex); + int main_interp_id_mutex = _PyThread_at_fork_reinit(&runtime->interpreters.main->id_mutex); + int xidregistry_mutex = _PyThread_at_fork_reinit(&runtime->xidregistry.mutex); PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); - if (runtime->interpreters.mutex == NULL) { + if (interp_mutex < 0) { Py_FatalError("Can't initialize lock for runtime interpreters"); } - if (runtime->interpreters.main->id_mutex == NULL) { + if (main_interp_id_mutex < 0) { Py_FatalError("Can't initialize ID lock for main interpreter"); } - if (runtime->xidregistry.mutex == NULL) { + if (xidregistry_mutex < 0) { Py_FatalError("Can't initialize lock for cross-interpreter data registry"); } } +#endif #define HEAD_LOCK(runtime) \ PyThread_acquire_lock((runtime)->interpreters.mutex, WAIT_LOCK) @@ -193,19 +196,29 @@ _PyInterpreterState_Enable(_PyRuntimeState *runtime) PyInterpreterState * PyInterpreterState_New(void) { - if (PySys_Audit("cpython.PyInterpreterState_New", NULL) < 0) { + PyThreadState *tstate = _PyThreadState_GET(); + /* tstate is NULL when Py_InitializeFromConfig() calls + PyInterpreterState_New() to create the main interpreter. */ + if (_PySys_Audit(tstate, "cpython.PyInterpreterState_New", NULL) < 0) { return NULL; } - PyInterpreterState *interp = PyMem_RawMalloc(sizeof(PyInterpreterState)); + PyInterpreterState *interp = PyMem_RawCalloc(1, sizeof(PyInterpreterState)); if (interp == NULL) { return NULL; } - memset(interp, 0, sizeof(*interp)); interp->id_refcount = -1; - interp->check_interval = 100; + /* Don't get runtime from tstate since tstate can be NULL */ + _PyRuntimeState *runtime = &_PyRuntime; + interp->runtime = runtime; + + if (_PyEval_InitState(&interp->ceval) < 0) { + goto out_of_memory; + } + + _PyGC_InitState(&interp->gc); PyConfig_InitPythonConfig(&interp->config); interp->eval_frame = _PyEval_EvalFrameDefault; @@ -217,14 +230,15 @@ PyInterpreterState_New(void) #endif #endif - _PyRuntimeState *runtime = &_PyRuntime; struct pyinterpreters *interpreters = &runtime->interpreters; HEAD_LOCK(runtime); if (interpreters->next_id < 0) { /* overflow or Py_Initialize() not called! */ - PyErr_SetString(PyExc_RuntimeError, - "failed to get an interpreter ID"); + if (tstate != NULL) { + _PyErr_SetString(tstate, PyExc_RuntimeError, + "failed to get an interpreter ID"); + } PyMem_RawFree(interp); interp = NULL; } @@ -248,14 +262,27 @@ PyInterpreterState_New(void) interp->audit_hooks = NULL; return interp; + +out_of_memory: + if (tstate != NULL) { + _PyErr_NoMemory(tstate); + } + + PyMem_RawFree(interp); + return NULL; } -static void -_PyInterpreterState_Clear(_PyRuntimeState *runtime, PyInterpreterState *interp) +void +PyInterpreterState_Clear(PyInterpreterState *interp) { - if (PySys_Audit("cpython.PyInterpreterState_Clear", NULL) < 0) { - PyErr_Clear(); + _PyRuntimeState *runtime = interp->runtime; + + /* Use the current Python thread state to call audit hooks, + not the current Python thread state of 'interp'. */ + PyThreadState *tstate = _PyThreadState_GET(); + if (_PySys_Audit(tstate, "cpython.PyInterpreterState_Clear", NULL) < 0) { + _PyErr_Clear(tstate); } HEAD_LOCK(runtime); @@ -283,7 +310,7 @@ _PyInterpreterState_Clear(_PyRuntimeState *runtime, PyInterpreterState *interp) Py_CLEAR(interp->after_forkers_parent); Py_CLEAR(interp->after_forkers_child); #endif - if (runtime->finalizing == NULL) { + if (_PyRuntimeState_GetFinalizing(runtime) == NULL) { _PyWarnings_Fini(interp); } // XXX Once we have one allocator per interpreter (i.e. @@ -291,52 +318,54 @@ _PyInterpreterState_Clear(_PyRuntimeState *runtime, PyInterpreterState *interp) // objects have been cleaned up at the point. } -void -PyInterpreterState_Clear(PyInterpreterState *interp) -{ - _PyInterpreterState_Clear(&_PyRuntime, interp); -} - static void -zapthreads(_PyRuntimeState *runtime, PyInterpreterState *interp) +zapthreads(PyInterpreterState *interp, int check_current) { - PyThreadState *p; + PyThreadState *tstate; /* No need to lock the mutex here because this should only happen when the threads are all really dead (XXX famous last words). */ - while ((p = interp->tstate_head) != NULL) { - _PyThreadState_Delete(runtime, p); + while ((tstate = interp->tstate_head) != NULL) { + _PyThreadState_Delete(tstate, check_current); } } -static void -_PyInterpreterState_Delete(_PyRuntimeState *runtime, - PyInterpreterState *interp) +void +PyInterpreterState_Delete(PyInterpreterState *interp) { + _PyRuntimeState *runtime = interp->runtime; struct pyinterpreters *interpreters = &runtime->interpreters; - zapthreads(runtime, interp); + zapthreads(interp, 0); + + _PyEval_FiniState(&interp->ceval); + + /* Delete current thread. After this, many C API calls become crashy. */ + _PyThreadState_Swap(&runtime->gilstate, NULL); + HEAD_LOCK(runtime); PyInterpreterState **p; for (p = &interpreters->head; ; p = &(*p)->next) { if (*p == NULL) { - Py_FatalError("PyInterpreterState_Delete: invalid interp"); + Py_FatalError("NULL interpreter"); } if (*p == interp) { break; } } if (interp->tstate_head != NULL) { - Py_FatalError("PyInterpreterState_Delete: remaining threads"); + Py_FatalError("remaining threads"); } *p = interp->next; + if (interpreters->main == interp) { interpreters->main = NULL; if (interpreters->head != NULL) { - Py_FatalError("PyInterpreterState_Delete: remaining subinterpreters"); + Py_FatalError("remaining subinterpreters"); } } HEAD_UNLOCK(runtime); + if (interp->id_mutex != NULL) { PyThread_free_lock(interp->id_mutex); } @@ -344,13 +373,6 @@ _PyInterpreterState_Delete(_PyRuntimeState *runtime, } -void -PyInterpreterState_Delete(PyInterpreterState *interp) -{ - _PyInterpreterState_Delete(&_PyRuntime, interp); -} - - /* * Delete all interpreter states except the main interpreter. If there * is a current interpreter state, it *must* be the main interpreter. @@ -363,7 +385,7 @@ _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime) PyThreadState *tstate = _PyThreadState_Swap(gilstate, NULL); if (tstate != NULL && tstate->interp != interpreters->main) { - Py_FatalError("PyInterpreterState_DeleteExceptMain: not main interpreter"); + Py_FatalError("not main interpreter"); } HEAD_LOCK(runtime); @@ -377,8 +399,8 @@ _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime) continue; } - _PyInterpreterState_Clear(runtime, interp); // XXX must activate? - zapthreads(runtime, interp); + PyInterpreterState_Clear(interp); // XXX must activate? + zapthreads(interp, 1); if (interp->id_mutex != NULL) { PyThread_free_lock(interp->id_mutex); } @@ -389,22 +411,20 @@ _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime) HEAD_UNLOCK(runtime); if (interpreters->head == NULL) { - Py_FatalError("PyInterpreterState_DeleteExceptMain: missing main"); + Py_FatalError("missing main interpreter"); } _PyThreadState_Swap(gilstate, tstate); } PyInterpreterState * -_PyInterpreterState_Get(void) +PyInterpreterState_Get(void) { PyThreadState *tstate = _PyThreadState_GET(); - if (tstate == NULL) { - Py_FatalError("_PyInterpreterState_Get(): no current thread state"); - } + _Py_EnsureTstateNotNULL(tstate); PyInterpreterState *interp = tstate->interp; if (interp == NULL) { - Py_FatalError("_PyInterpreterState_Get(): no current interpreter"); + Py_FatalError("no current interpreter"); } return interp; } @@ -422,11 +442,11 @@ PyInterpreterState_GetID(PyInterpreterState *interp) static PyInterpreterState * -interp_look_up_id(_PyRuntimeState *runtime, PY_INT64_T requested_id) +interp_look_up_id(_PyRuntimeState *runtime, int64_t requested_id) { PyInterpreterState *interp = runtime->interpreters.head; while (interp != NULL) { - PY_INT64_T id = PyInterpreterState_GetID(interp); + int64_t id = PyInterpreterState_GetID(interp); if (id < 0) { return NULL; } @@ -439,7 +459,7 @@ interp_look_up_id(_PyRuntimeState *runtime, PY_INT64_T requested_id) } PyInterpreterState * -_PyInterpreterState_LookUpID(PY_INT64_T requested_id) +_PyInterpreterState_LookUpID(int64_t requested_id) { PyInterpreterState *interp = NULL; if (requested_id >= 0) { @@ -543,26 +563,15 @@ PyInterpreterState_GetDict(PyInterpreterState *interp) return interp->dict; } -/* Default implementation for _PyThreadState_GetFrame */ -static struct _frame * -threadstate_getframe(PyThreadState *self) -{ - return self->frame; -} - static PyThreadState * new_threadstate(PyInterpreterState *interp, int init) { - _PyRuntimeState *runtime = &_PyRuntime; + _PyRuntimeState *runtime = interp->runtime; PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState)); if (tstate == NULL) { return NULL; } - if (_PyThreadState_GetFrame == NULL) { - _PyThreadState_GetFrame = threadstate_getframe; - } - tstate->interp = interp; tstate->frame = NULL; @@ -607,7 +616,7 @@ new_threadstate(PyInterpreterState *interp, int init) tstate->context_ver = 1; if (init) { - _PyThreadState_Init(runtime, tstate); + _PyThreadState_Init(tstate); } HEAD_LOCK(runtime); @@ -635,16 +644,16 @@ _PyThreadState_Prealloc(PyInterpreterState *interp) } void -_PyThreadState_Init(_PyRuntimeState *runtime, PyThreadState *tstate) +_PyThreadState_Init(PyThreadState *tstate) { - _PyGILState_NoteThreadState(&runtime->gilstate, tstate); + _PyGILState_NoteThreadState(&tstate->interp->runtime->gilstate, tstate); } PyObject* PyState_FindModule(struct PyModuleDef* module) { Py_ssize_t index = module->m_base.m_index; - PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE(); + PyInterpreterState *state = _PyInterpreterState_GET(); PyObject *res; if (module->m_slots) { return NULL; @@ -660,107 +669,120 @@ PyState_FindModule(struct PyModuleDef* module) } int -_PyState_AddModule(PyObject* module, struct PyModuleDef* def) +_PyState_AddModule(PyThreadState *tstate, PyObject* module, struct PyModuleDef* def) { - PyInterpreterState *state; if (!def) { - assert(PyErr_Occurred()); + assert(_PyErr_Occurred(tstate)); return -1; } if (def->m_slots) { - PyErr_SetString(PyExc_SystemError, - "PyState_AddModule called on module with slots"); + _PyErr_SetString(tstate, + PyExc_SystemError, + "PyState_AddModule called on module with slots"); return -1; } - state = _PyInterpreterState_GET_UNSAFE(); - if (!state->modules_by_index) { - state->modules_by_index = PyList_New(0); - if (!state->modules_by_index) + + PyInterpreterState *interp = tstate->interp; + if (!interp->modules_by_index) { + interp->modules_by_index = PyList_New(0); + if (!interp->modules_by_index) { return -1; + } } - while (PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index) - if (PyList_Append(state->modules_by_index, Py_None) < 0) + + while (PyList_GET_SIZE(interp->modules_by_index) <= def->m_base.m_index) { + if (PyList_Append(interp->modules_by_index, Py_None) < 0) { return -1; + } + } + Py_INCREF(module); - return PyList_SetItem(state->modules_by_index, + return PyList_SetItem(interp->modules_by_index, def->m_base.m_index, module); } int PyState_AddModule(PyObject* module, struct PyModuleDef* def) { - Py_ssize_t index; - PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE(); if (!def) { - Py_FatalError("PyState_AddModule: Module Definition is NULL"); + Py_FatalError("module definition is NULL"); return -1; } - index = def->m_base.m_index; - if (state->modules_by_index && - index < PyList_GET_SIZE(state->modules_by_index) && - module == PyList_GET_ITEM(state->modules_by_index, index)) { - Py_FatalError("PyState_AddModule: Module already added!"); + + PyThreadState *tstate = _PyThreadState_GET(); + PyInterpreterState *interp = tstate->interp; + Py_ssize_t index = def->m_base.m_index; + if (interp->modules_by_index && + index < PyList_GET_SIZE(interp->modules_by_index) && + module == PyList_GET_ITEM(interp->modules_by_index, index)) + { + _Py_FatalErrorFormat(__func__, "module %p already added", module); return -1; } - return _PyState_AddModule(module, def); + return _PyState_AddModule(tstate, module, def); } int PyState_RemoveModule(struct PyModuleDef* def) { - PyInterpreterState *state; - Py_ssize_t index = def->m_base.m_index; + PyThreadState *tstate = _PyThreadState_GET(); + PyInterpreterState *interp = tstate->interp; + if (def->m_slots) { - PyErr_SetString(PyExc_SystemError, - "PyState_RemoveModule called on module with slots"); + _PyErr_SetString(tstate, + PyExc_SystemError, + "PyState_RemoveModule called on module with slots"); return -1; } - state = _PyInterpreterState_GET_UNSAFE(); + + Py_ssize_t index = def->m_base.m_index; if (index == 0) { - Py_FatalError("PyState_RemoveModule: Module index invalid."); - return -1; + Py_FatalError("invalid module index"); } - if (state->modules_by_index == NULL) { - Py_FatalError("PyState_RemoveModule: Interpreters module-list not accessible."); - return -1; + if (interp->modules_by_index == NULL) { + Py_FatalError("Interpreters module-list not accessible."); } - if (index > PyList_GET_SIZE(state->modules_by_index)) { - Py_FatalError("PyState_RemoveModule: Module index out of bounds."); - return -1; + if (index > PyList_GET_SIZE(interp->modules_by_index)) { + Py_FatalError("Module index out of bounds."); } + Py_INCREF(Py_None); - return PyList_SetItem(state->modules_by_index, index, Py_None); + return PyList_SetItem(interp->modules_by_index, index, Py_None); } -/* used by import.c:PyImport_Cleanup */ +/* Used by PyImport_Cleanup() */ void -_PyState_ClearModules(void) -{ - PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE(); - if (state->modules_by_index) { - Py_ssize_t i; - for (i = 0; i < PyList_GET_SIZE(state->modules_by_index); i++) { - PyObject *m = PyList_GET_ITEM(state->modules_by_index, i); - if (PyModule_Check(m)) { - /* cleanup the saved copy of module dicts */ - PyModuleDef *md = PyModule_GetDef(m); - if (md) - Py_CLEAR(md->m_base.m_copy); +_PyInterpreterState_ClearModules(PyInterpreterState *interp) +{ + if (!interp->modules_by_index) { + return; + } + + Py_ssize_t i; + for (i = 0; i < PyList_GET_SIZE(interp->modules_by_index); i++) { + PyObject *m = PyList_GET_ITEM(interp->modules_by_index, i); + if (PyModule_Check(m)) { + /* cleanup the saved copy of module dicts */ + PyModuleDef *md = PyModule_GetDef(m); + if (md) { + Py_CLEAR(md->m_base.m_copy); } } - /* Setting modules_by_index to NULL could be dangerous, so we - clear the list instead. */ - if (PyList_SetSlice(state->modules_by_index, - 0, PyList_GET_SIZE(state->modules_by_index), - NULL)) - PyErr_WriteUnraisable(state->modules_by_index); + } + + /* Setting modules_by_index to NULL could be dangerous, so we + clear the list instead. */ + if (PyList_SetSlice(interp->modules_by_index, + 0, PyList_GET_SIZE(interp->modules_by_index), + NULL)) { + PyErr_WriteUnraisable(interp->modules_by_index); } } void PyThreadState_Clear(PyThreadState *tstate) { - int verbose = tstate->interp->config.verbose; + int verbose = _PyInterpreterState_GetConfig(tstate->interp)->verbose; if (verbose && tstate->frame != NULL) { /* bpo-20526: After the main thread calls @@ -802,80 +824,83 @@ PyThreadState_Clear(PyThreadState *tstate) Py_CLEAR(tstate->async_gen_finalizer); Py_CLEAR(tstate->context); + + if (tstate->on_delete != NULL) { + tstate->on_delete(tstate->on_delete_data); + } } /* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */ static void -tstate_delete_common(_PyRuntimeState *runtime, PyThreadState *tstate) +tstate_delete_common(PyThreadState *tstate, + struct _gilstate_runtime_state *gilstate) { - if (tstate == NULL) { - Py_FatalError("PyThreadState_Delete: NULL tstate"); - } + _Py_EnsureTstateNotNULL(tstate); PyInterpreterState *interp = tstate->interp; if (interp == NULL) { - Py_FatalError("PyThreadState_Delete: NULL interp"); + Py_FatalError("NULL interpreter"); } + _PyRuntimeState *runtime = interp->runtime; + HEAD_LOCK(runtime); - if (tstate->prev) + if (tstate->prev) { tstate->prev->next = tstate->next; - else + } + else { interp->tstate_head = tstate->next; - if (tstate->next) + } + if (tstate->next) { tstate->next->prev = tstate->prev; + } HEAD_UNLOCK(runtime); - if (tstate->on_delete != NULL) { - tstate->on_delete(tstate->on_delete_data); + + if (gilstate->autoInterpreterState && + PyThread_tss_get(&gilstate->autoTSSkey) == tstate) + { + PyThread_tss_set(&gilstate->autoTSSkey, NULL); } - PyMem_RawFree(tstate); } static void -_PyThreadState_Delete(_PyRuntimeState *runtime, PyThreadState *tstate) +_PyThreadState_Delete(PyThreadState *tstate, int check_current) { - struct _gilstate_runtime_state *gilstate = &runtime->gilstate; - if (tstate == _PyRuntimeGILState_GetThreadState(gilstate)) { - Py_FatalError("PyThreadState_Delete: tstate is still current"); - } - if (gilstate->autoInterpreterState && - PyThread_tss_get(&gilstate->autoTSSkey) == tstate) - { - PyThread_tss_set(&gilstate->autoTSSkey, NULL); + struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate; + if (check_current) { + if (tstate == _PyRuntimeGILState_GetThreadState(gilstate)) { + _Py_FatalErrorFormat(__func__, "tstate %p is still current", tstate); + } } - tstate_delete_common(runtime, tstate); + tstate_delete_common(tstate, gilstate); + PyMem_RawFree(tstate); } void PyThreadState_Delete(PyThreadState *tstate) { - _PyThreadState_Delete(&_PyRuntime, tstate); + _PyThreadState_Delete(tstate, 1); } -static void -_PyThreadState_DeleteCurrent(_PyRuntimeState *runtime) +void +_PyThreadState_DeleteCurrent(PyThreadState *tstate) { - struct _gilstate_runtime_state *gilstate = &runtime->gilstate; - PyThreadState *tstate = _PyRuntimeGILState_GetThreadState(gilstate); - if (tstate == NULL) - Py_FatalError( - "PyThreadState_DeleteCurrent: no current tstate"); - tstate_delete_common(runtime, tstate); - if (gilstate->autoInterpreterState && - PyThread_tss_get(&gilstate->autoTSSkey) == tstate) - { - PyThread_tss_set(&gilstate->autoTSSkey, NULL); - } + _Py_EnsureTstateNotNULL(tstate); + struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate; + tstate_delete_common(tstate, gilstate); _PyRuntimeGILState_SetThreadState(gilstate, NULL); - PyEval_ReleaseLock(); + _PyEval_ReleaseLock(tstate); + PyMem_RawFree(tstate); } void -PyThreadState_DeleteCurrent() +PyThreadState_DeleteCurrent(void) { - _PyThreadState_DeleteCurrent(&_PyRuntime); + struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate; + PyThreadState *tstate = _PyRuntimeGILState_GetThreadState(gilstate); + _PyThreadState_DeleteCurrent(tstate); } @@ -890,25 +915,30 @@ void _PyThreadState_DeleteExcept(_PyRuntimeState *runtime, PyThreadState *tstate) { PyInterpreterState *interp = tstate->interp; - PyThreadState *p, *next, *garbage; + HEAD_LOCK(runtime); /* Remove all thread states, except tstate, from the linked list of thread states. This will allow calling PyThreadState_Clear() without holding the lock. */ - garbage = interp->tstate_head; - if (garbage == tstate) - garbage = tstate->next; - if (tstate->prev) + PyThreadState *list = interp->tstate_head; + if (list == tstate) { + list = tstate->next; + } + if (tstate->prev) { tstate->prev->next = tstate->next; - if (tstate->next) + } + if (tstate->next) { tstate->next->prev = tstate->prev; + } tstate->prev = tstate->next = NULL; interp->tstate_head = tstate; HEAD_UNLOCK(runtime); + /* Clear and deallocate all stale thread states. Even if this executes Python code, we should be safe since it executes in the current thread, not one of the stale threads. */ - for (p = garbage; p; p = next) { + PyThreadState *p, *next; + for (p = list; p; p = next) { next = p->next; PyThreadState_Clear(p); PyMem_RawFree(p); @@ -927,9 +957,7 @@ PyThreadState * PyThreadState_Get(void) { PyThreadState *tstate = _PyThreadState_GET(); - if (tstate == NULL) - Py_FatalError("PyThreadState_Get: no current thread"); - + _Py_EnsureTstateNotNULL(tstate); return tstate; } @@ -971,20 +999,54 @@ PyThreadState_Swap(PyThreadState *newts) PyThreadState_GetDict() returns NULL, an exception has *not* been raised and the caller should assume no per-thread state is available. */ +PyObject * +_PyThreadState_GetDict(PyThreadState *tstate) +{ + assert(tstate != NULL); + if (tstate->dict == NULL) { + tstate->dict = PyDict_New(); + if (tstate->dict == NULL) { + _PyErr_Clear(tstate); + } + } + return tstate->dict; +} + + PyObject * PyThreadState_GetDict(void) { PyThreadState *tstate = _PyThreadState_GET(); - if (tstate == NULL) + if (tstate == NULL) { return NULL; - - if (tstate->dict == NULL) { - PyObject *d; - tstate->dict = d = PyDict_New(); - if (d == NULL) - PyErr_Clear(); } - return tstate->dict; + return _PyThreadState_GetDict(tstate); +} + + +PyInterpreterState * +PyThreadState_GetInterpreter(PyThreadState *tstate) +{ + assert(tstate != NULL); + return tstate->interp; +} + + +PyFrameObject* +PyThreadState_GetFrame(PyThreadState *tstate) +{ + assert(tstate != NULL); + PyFrameObject *frame = tstate->frame; + Py_XINCREF(frame); + return frame; +} + + +uint64_t +PyThreadState_GetID(PyThreadState *tstate) +{ + assert(tstate != NULL); + return tstate->id; } @@ -1009,23 +1071,26 @@ PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc) * head_mutex for the duration. */ HEAD_LOCK(runtime); - for (PyThreadState *p = interp->tstate_head; p != NULL; p = p->next) { - if (p->thread_id == id) { - /* Tricky: we need to decref the current value - * (if any) in p->async_exc, but that can in turn - * allow arbitrary Python code to run, including - * perhaps calls to this function. To prevent - * deadlock, we need to release head_mutex before - * the decref. - */ - PyObject *old_exc = p->async_exc; - Py_XINCREF(exc); - p->async_exc = exc; - HEAD_UNLOCK(runtime); - Py_XDECREF(old_exc); - _PyEval_SignalAsyncExc(&runtime->ceval); - return 1; + for (PyThreadState *tstate = interp->tstate_head; tstate != NULL; tstate = tstate->next) { + if (tstate->thread_id != id) { + continue; } + + /* Tricky: we need to decref the current value + * (if any) in tstate->async_exc, but that can in turn + * allow arbitrary Python code to run, including + * perhaps calls to this function. To prevent + * deadlock, we need to release head_mutex before + * the decref. + */ + PyObject *old_exc = tstate->async_exc; + Py_XINCREF(exc); + tstate->async_exc = exc; + HEAD_UNLOCK(runtime); + + Py_XDECREF(old_exc); + _PyEval_SignalAsyncExc(tstate); + return 1; } HEAD_UNLOCK(runtime); return 0; @@ -1070,16 +1135,15 @@ PyThreadState_Next(PyThreadState *tstate) { PyObject * _PyThread_CurrentFrames(void) { - PyObject *result; - PyInterpreterState *i; - - if (PySys_Audit("sys._current_frames", NULL) < 0) { + PyThreadState *tstate = _PyThreadState_GET(); + if (_PySys_Audit(tstate, "sys._current_frames", NULL) < 0) { return NULL; } - result = PyDict_New(); - if (result == NULL) + PyObject *result = PyDict_New(); + if (result == NULL) { return NULL; + } /* for i in all interpreters: * for t in all of i's thread states: @@ -1087,32 +1151,35 @@ _PyThread_CurrentFrames(void) * Because these lists can mutate even when the GIL is held, we * need to grab head_mutex for the duration. */ - _PyRuntimeState *runtime = &_PyRuntime; + _PyRuntimeState *runtime = tstate->interp->runtime; HEAD_LOCK(runtime); + PyInterpreterState *i; for (i = runtime->interpreters.head; i != NULL; i = i->next) { PyThreadState *t; for (t = i->tstate_head; t != NULL; t = t->next) { - PyObject *id; - int stat; - struct _frame *frame = t->frame; - if (frame == NULL) + PyFrameObject *frame = t->frame; + if (frame == NULL) { continue; - id = PyLong_FromUnsignedLong(t->thread_id); - if (id == NULL) - goto Fail; - stat = PyDict_SetItem(result, id, (PyObject *)frame); + } + PyObject *id = PyLong_FromUnsignedLong(t->thread_id); + if (id == NULL) { + goto fail; + } + int stat = PyDict_SetItem(result, id, (PyObject *)frame); Py_DECREF(id); - if (stat < 0) - goto Fail; + if (stat < 0) { + goto fail; + } } } - HEAD_UNLOCK(runtime); - return result; + goto done; + +fail: + Py_CLEAR(result); - Fail: +done: HEAD_UNLOCK(runtime); - Py_DECREF(result); - return NULL; + return result; } /* Python "auto thread state" API. */ @@ -1137,24 +1204,30 @@ PyThreadState_IsCurrent(PyThreadState *tstate) /* Internal initialization/finalization functions called by Py_Initialize/Py_FinalizeEx */ -void -_PyGILState_Init(_PyRuntimeState *runtime, - PyInterpreterState *interp, PyThreadState *tstate) +PyStatus +_PyGILState_Init(PyThreadState *tstate) { + if (!_Py_IsMainInterpreter(tstate)) { + /* Currently, PyGILState is shared by all interpreters. The main + * interpreter is responsible to initialize it. */ + return _PyStatus_OK(); + } + /* must init with valid states */ - assert(interp != NULL); assert(tstate != NULL); + assert(tstate->interp != NULL); - struct _gilstate_runtime_state *gilstate = &runtime->gilstate; + struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate; if (PyThread_tss_create(&gilstate->autoTSSkey) != 0) { - Py_FatalError("Could not allocate TSS entry"); + return _PyStatus_NO_MEMORY(); } - gilstate->autoInterpreterState = interp; + gilstate->autoInterpreterState = tstate->interp; assert(PyThread_tss_get(&gilstate->autoTSSkey) == NULL); assert(tstate->gilstate_counter == 0); _PyGILState_NoteThreadState(gilstate, tstate); + return _PyStatus_OK(); } PyInterpreterState * @@ -1164,9 +1237,9 @@ _PyGILState_GetInterpreterStateUnsafe(void) } void -_PyGILState_Fini(_PyRuntimeState *runtime) +_PyGILState_Fini(PyThreadState *tstate) { - struct _gilstate_runtime_state *gilstate = &runtime->gilstate; + struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate; PyThread_tss_delete(&gilstate->autoTSSkey); gilstate->autoInterpreterState = NULL; } @@ -1250,12 +1323,11 @@ PyGILState_GetThisThreadState(void) int PyGILState_Check(void) { - - if (!_PyGILState_check_enabled) { + struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate; + if (!gilstate->check_enabled) { return 1; } - struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate; if (!PyThread_tss_is_created(&gilstate->autoTSSkey)) { return 1; } @@ -1271,27 +1343,28 @@ PyGILState_Check(void) PyGILState_STATE PyGILState_Ensure(void) { - struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate; - int current; - PyThreadState *tcur; - int need_init_threads = 0; + _PyRuntimeState *runtime = &_PyRuntime; + struct _gilstate_runtime_state *gilstate = &runtime->gilstate; /* Note that we do not auto-init Python here - apart from potential races with 2 threads auto-initializing, pep-311 spells out other issues. Embedders are expected to have - called Py_Initialize() and usually PyEval_InitThreads(). - */ - /* Py_Initialize() hasn't been called! */ + called Py_Initialize(). */ + + /* Ensure that _PyEval_InitThreads() and _PyGILState_Init() have been + called by Py_Initialize() */ + assert(_PyEval_ThreadsInitialized(runtime)); assert(gilstate->autoInterpreterState); - tcur = (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey); + PyThreadState *tcur = (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey); + int current; if (tcur == NULL) { - need_init_threads = 1; - - /* Create a new thread state for this thread */ + /* Create a new Python thread state for this thread */ tcur = PyThreadState_New(gilstate->autoInterpreterState); - if (tcur == NULL) + if (tcur == NULL) { Py_FatalError("Couldn't create thread-state for new thread"); + } + /* This is our thread state! We'll need to delete it in the matching call to PyGILState_Release(). */ tcur->gilstate_counter = 0; @@ -1312,13 +1385,6 @@ PyGILState_Ensure(void) */ ++tcur->gilstate_counter; - if (need_init_threads) { - /* At startup, Python has no concrete GIL. If PyGILState_Ensure() is - called from a new thread for the first time, we need the create the - GIL. */ - PyEval_InitThreads(); - } - return current ? PyGILState_LOCKED : PyGILState_UNLOCKED; } @@ -1326,8 +1392,8 @@ void PyGILState_Release(PyGILState_STATE oldstate) { _PyRuntimeState *runtime = &_PyRuntime; - PyThreadState *tcur = PyThread_tss_get(&runtime->gilstate.autoTSSkey); - if (tcur == NULL) { + PyThreadState *tstate = PyThread_tss_get(&runtime->gilstate.autoTSSkey); + if (tstate == NULL) { Py_FatalError("auto-releasing thread-state, " "but no thread-state for this thread"); } @@ -1337,26 +1403,29 @@ PyGILState_Release(PyGILState_STATE oldstate) but while this is very new (April 2003), the extra check by release-only users can't hurt. */ - if (!PyThreadState_IsCurrent(tcur)) { - Py_FatalError("This thread state must be current when releasing"); + if (!PyThreadState_IsCurrent(tstate)) { + _Py_FatalErrorFormat(__func__, + "thread state %p must be current when releasing", + tstate); } - assert(PyThreadState_IsCurrent(tcur)); - --tcur->gilstate_counter; - assert(tcur->gilstate_counter >= 0); /* illegal counter value */ + assert(PyThreadState_IsCurrent(tstate)); + --tstate->gilstate_counter; + assert(tstate->gilstate_counter >= 0); /* illegal counter value */ /* If we're going to destroy this thread-state, we must * clear it while the GIL is held, as destructors may run. */ - if (tcur->gilstate_counter == 0) { + if (tstate->gilstate_counter == 0) { /* can't have been locked when we created it */ assert(oldstate == PyGILState_UNLOCKED); - PyThreadState_Clear(tcur); + PyThreadState_Clear(tstate); /* Delete the thread-state. Note this releases the GIL too! * It's vital that the GIL be held here, to avoid shutdown * races; see bugs 225673 and 1061968 (that nasty bug has a * habit of coming back). */ - _PyThreadState_DeleteCurrent(runtime); + assert(_PyRuntimeGILState_GetThreadState(&runtime->gilstate) == tstate); + _PyThreadState_DeleteCurrent(tstate); } /* Release the lock if necessary */ else if (oldstate == PyGILState_UNLOCKED) @@ -1395,19 +1464,19 @@ _PyObject_CheckCrossInterpreterData(PyObject *obj) } static int -_check_xidata(_PyCrossInterpreterData *data) +_check_xidata(PyThreadState *tstate, _PyCrossInterpreterData *data) { // data->data can be anything, including NULL, so we don't check it. // data->obj may be NULL, so we don't check it. if (data->interp < 0) { - PyErr_SetString(PyExc_SystemError, "missing interp"); + _PyErr_SetString(tstate, PyExc_SystemError, "missing interp"); return -1; } if (data->new_object == NULL) { - PyErr_SetString(PyExc_SystemError, "missing new_object func"); + _PyErr_SetString(tstate, PyExc_SystemError, "missing new_object func"); return -1; } @@ -1419,9 +1488,9 @@ _check_xidata(_PyCrossInterpreterData *data) int _PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data) { - // _PyInterpreterState_Get() aborts if lookup fails, so we don't need - // to check the result for NULL. - PyInterpreterState *interp = _PyInterpreterState_Get(); + // PyThreadState_Get() aborts if tstate is NULL. + PyThreadState *tstate = PyThreadState_Get(); + PyInterpreterState *interp = tstate->interp; // Reset data before re-populating. *data = (_PyCrossInterpreterData){0}; @@ -1442,7 +1511,7 @@ _PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data) // Fill in the blanks and validate the result. data->interp = interp->id; - if (_check_xidata(data) != 0) { + if (_check_xidata(tstate, data) != 0) { _PyCrossInterpreterData_Release(data); return -1; } @@ -1496,7 +1565,7 @@ _PyCrossInterpreterData_Release(_PyCrossInterpreterData *data) // Switch to the original interpreter. PyInterpreterState *interp = _PyInterpreterState_LookUpID(data->interp); if (interp == NULL) { - // The intepreter was already destroyed. + // The interpreter was already destroyed. if (data->free != NULL) { // XXX Someone leaked some memory... } @@ -1718,6 +1787,44 @@ _register_builtins_for_crossinterpreter_data(struct _xidregistry *xidregistry) } +_PyFrameEvalFunction +_PyInterpreterState_GetEvalFrameFunc(PyInterpreterState *interp) +{ + return interp->eval_frame; +} + + +void +_PyInterpreterState_SetEvalFrameFunc(PyInterpreterState *interp, + _PyFrameEvalFunction eval_frame) +{ + interp->eval_frame = eval_frame; +} + + +const PyConfig* +_PyInterpreterState_GetConfig(PyInterpreterState *interp) +{ + return &interp->config; +} + + +PyStatus +_PyInterpreterState_SetConfig(PyInterpreterState *interp, + const PyConfig *config) +{ + return _PyConfig_Copy(&interp->config, config); +} + + +const PyConfig* +_Py_GetConfig(void) +{ + assert(PyGILState_Check()); + PyThreadState *tstate = _PyThreadState_GET(); + return _PyInterpreterState_GetConfig(tstate->interp); +} + #ifdef __cplusplus } #endif diff --git a/Python/pystrcmp.c b/Python/pystrcmp.c index f9c2277cb56dc7096c4d8ac460879d6b0d0909c3..9224ce4c70605526dca14bc2bbe26b4280e6b543 100644 --- a/Python/pystrcmp.c +++ b/Python/pystrcmp.c @@ -6,21 +6,25 @@ int PyOS_mystrnicmp(const char *s1, const char *s2, Py_ssize_t size) { + const unsigned char *p1, *p2; if (size == 0) return 0; - while ((--size > 0) && - (tolower((unsigned)*s1) == tolower((unsigned)*s2))) { - if (!*s1++ || !*s2++) - break; + p1 = (const unsigned char *)s1; + p2 = (const unsigned char *)s2; + for (; (--size > 0) && *p1 && *p2 && (tolower(*p1) == tolower(*p2)); + p1++, p2++) { + ; } - return tolower((unsigned)*s1) - tolower((unsigned)*s2); + return tolower(*p1) - tolower(*p2); } int PyOS_mystricmp(const char *s1, const char *s2) { - while (*s1 && (tolower((unsigned)*s1++) == tolower((unsigned)*s2++))) { + const unsigned char *p1 = (const unsigned char *)s1; + const unsigned char *p2 = (const unsigned char *)s2; + for (; *p1 && *p2 && (tolower(*p1) == tolower(*p2)); p1++, p2++) { ; } - return (tolower((unsigned)*s1) - tolower((unsigned)*s2)); + return (tolower(*p1) - tolower(*p2)); } diff --git a/Python/pystrhex.c b/Python/pystrhex.c index 9d34f71a2e9cf3e33f4fdd8d7185a1a7d7746068..b74e57ad913b11109f32f7a183e932836a784696 100644 --- a/Python/pystrhex.c +++ b/Python/pystrhex.c @@ -8,12 +8,9 @@ static PyObject *_Py_strhex_impl(const char* argbuf, const Py_ssize_t arglen, const PyObject* sep, int bytes_per_sep_group, const int return_bytes) { - PyObject *retval; - Py_UCS1* retbuf; - Py_ssize_t i, j, resultlen = 0; - Py_UCS1 sep_char = 0; - unsigned int abs_bytes_per_sep; + assert(arglen >= 0); + Py_UCS1 sep_char = 0; if (sep) { Py_ssize_t seplen = PyObject_Length((PyObject*)sep); if (seplen < 0) { @@ -31,9 +28,11 @@ static PyObject *_Py_strhex_impl(const char* argbuf, const Py_ssize_t arglen, return NULL; } sep_char = PyUnicode_READ_CHAR(sep, 0); - } else if (PyBytes_Check(sep)) { + } + else if (PyBytes_Check(sep)) { sep_char = PyBytes_AS_STRING(sep)[0]; - } else { + } + else { PyErr_SetString(PyExc_TypeError, "sep must be str or bytes."); return NULL; } @@ -41,12 +40,13 @@ static PyObject *_Py_strhex_impl(const char* argbuf, const Py_ssize_t arglen, PyErr_SetString(PyExc_ValueError, "sep must be ASCII."); return NULL; } - } else { + } + else { bytes_per_sep_group = 0; } - assert(arglen >= 0); - abs_bytes_per_sep = abs(bytes_per_sep_group); + unsigned int abs_bytes_per_sep = abs(bytes_per_sep_group); + Py_ssize_t resultlen = 0; if (bytes_per_sep_group && arglen > 0) { /* How many sep characters we'll be inserting. */ resultlen = (arglen - 1) / abs_bytes_per_sep; @@ -62,43 +62,82 @@ static PyObject *_Py_strhex_impl(const char* argbuf, const Py_ssize_t arglen, abs_bytes_per_sep = 0; } + PyObject *retval; + Py_UCS1 *retbuf; if (return_bytes) { /* If _PyBytes_FromSize() were public we could avoid malloc+copy. */ - retbuf = (Py_UCS1*) PyMem_Malloc(resultlen); - if (!retbuf) - return PyErr_NoMemory(); - retval = NULL; /* silence a compiler warning, assigned later. */ - } else { + retval = PyBytes_FromStringAndSize(NULL, resultlen); + if (!retval) { + return NULL; + } + retbuf = (Py_UCS1 *)PyBytes_AS_STRING(retval); + } + else { retval = PyUnicode_New(resultlen, 127); - if (!retval) + if (!retval) { return NULL; + } retbuf = PyUnicode_1BYTE_DATA(retval); } /* Hexlify */ - for (i=j=0; i < arglen; ++i) { - assert(j < resultlen); - unsigned char c; - c = (argbuf[i] >> 4) & 0xf; - retbuf[j++] = Py_hexdigits[c]; - c = argbuf[i] & 0xf; - retbuf[j++] = Py_hexdigits[c]; - if (bytes_per_sep_group && i < arglen - 1) { - Py_ssize_t anchor; - anchor = (bytes_per_sep_group > 0) ? (arglen - 1 - i) : (i + 1); - if (anchor % abs_bytes_per_sep == 0) { + Py_ssize_t i, j; + unsigned char c; + + if (bytes_per_sep_group == 0) { + for (i = j = 0; i < arglen; ++i) { + assert((j + 1) < resultlen); + c = argbuf[i]; + retbuf[j++] = Py_hexdigits[c >> 4]; + retbuf[j++] = Py_hexdigits[c & 0x0f]; + } + assert(j == resultlen); + } + else { + /* The number of complete chunk+sep periods */ + Py_ssize_t chunks = (arglen - 1) / abs_bytes_per_sep; + Py_ssize_t chunk; + unsigned int k; + + if (bytes_per_sep_group < 0) { + i = j = 0; + for (chunk = 0; chunk < chunks; chunk++) { + for (k = 0; k < abs_bytes_per_sep; k++) { + c = argbuf[i++]; + retbuf[j++] = Py_hexdigits[c >> 4]; + retbuf[j++] = Py_hexdigits[c & 0x0f]; + } retbuf[j++] = sep_char; } + while (i < arglen) { + c = argbuf[i++]; + retbuf[j++] = Py_hexdigits[c >> 4]; + retbuf[j++] = Py_hexdigits[c & 0x0f]; + } + assert(j == resultlen); + } + else { + i = arglen - 1; + j = resultlen - 1; + for (chunk = 0; chunk < chunks; chunk++) { + for (k = 0; k < abs_bytes_per_sep; k++) { + c = argbuf[i--]; + retbuf[j--] = Py_hexdigits[c & 0x0f]; + retbuf[j--] = Py_hexdigits[c >> 4]; + } + retbuf[j--] = sep_char; + } + while (i >= 0) { + c = argbuf[i--]; + retbuf[j--] = Py_hexdigits[c & 0x0f]; + retbuf[j--] = Py_hexdigits[c >> 4]; + } + assert(j == -1); } } - assert(j == resultlen); - if (return_bytes) { - retval = PyBytes_FromStringAndSize((const char *)retbuf, resultlen); - PyMem_Free(retbuf); - } #ifdef Py_DEBUG - else { + if (!return_bytes) { assert(_PyUnicode_CheckConsistency(retval, 1)); } #endif diff --git a/Python/pystrtod.c b/Python/pystrtod.c index 4aa99d546caf9e7286c5e59bebc2e5e5cf5015b8..1c8202c776188489ac835c6d0eab57a7e8d06286 100644 --- a/Python/pystrtod.c +++ b/Python/pystrtod.c @@ -1,6 +1,7 @@ /* -*- Mode: C; c-file-style: "python" -*- */ #include +#include "pycore_dtoa.h" #include /* Case-insensitive string match used for nan and inf detection; t should be @@ -342,9 +343,7 @@ PyOS_string_to_double(const char *s, char *fail_pos; errno = 0; - PyFPE_START_PROTECT("PyOS_string_to_double", return -1.0) x = _PyOS_ascii_strtod(s, &fail_pos); - PyFPE_END_PROTECT(x) if (errno == ENOMEM) { PyErr_NoMemory(); diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 6cdd8ea7a6ab19da538eb7c86763df79884880e3..04540989f3043371a1493b624e6aa257f50dfd33 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -12,34 +12,35 @@ #include "Python-ast.h" #undef Yield /* undefine macro conflicting with */ -#include "pycore_pyerrors.h" -#include "pycore_pylifecycle.h" -#include "pycore_pystate.h" -#include "grammar.h" -#include "node.h" -#include "token.h" -#include "parsetok.h" -#include "errcode.h" -#include "code.h" -#include "symtable.h" -#include "ast.h" -#include "marshal.h" -#include "osdefs.h" -#include - -#ifdef HAVE_SIGNAL_H -#include -#endif + +#include "pycore_interp.h" // PyInterpreterState.importlib +#include "pycore_object.h" // _PyDebug_PrintTotalRefs() +#include "pycore_pyerrors.h" // _PyErr_Fetch +#include "pycore_pylifecycle.h" // _Py_UnhandledKeyboardInterrupt +#include "pycore_pystate.h" // _PyInterpreterState_GET() +#include "pycore_sysmodule.h" // _PySys_Audit() + +#include "node.h" // node +#include "token.h" // INDENT +#include "parsetok.h" // perrdetail +#include "errcode.h" // E_EOF +#include "code.h" // PyCodeObject +#include "symtable.h" // PySymtable_BuildObject() +#include "ast.h" // PyAST_FromNodeObject() +#include "marshal.h" // PyMarshal_ReadLongFromFile() + +#include "pegen_interface.h" // PyPegen_ASTFrom* #ifdef MS_WINDOWS -#include "malloc.h" /* for alloca */ +# include "malloc.h" // alloca() #endif #ifdef MS_WINDOWS -#undef BYTE -#include "windows.h" +# undef BYTE +# include "windows.h" #endif + _Py_IDENTIFIER(builtins); _Py_IDENTIFIER(excepthook); _Py_IDENTIFIER(flush); @@ -57,17 +58,21 @@ _Py_static_string(PyId_string, ""); extern "C" { #endif -extern grammar _PyParser_Grammar; /* From graminit.c */ +extern Py_EXPORTED_SYMBOL grammar _PyParser_Grammar; /* From graminit.c */ /* Forward */ static void flush_io(void); static PyObject *run_mod(mod_ty, PyObject *, PyObject *, PyObject *, PyCompilerFlags *, PyArena *); -static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *, +static PyObject *run_pyc_file(FILE *, PyObject *, PyObject *, PyCompilerFlags *); static void err_input(perrdetail *); static void err_free(perrdetail *); static int PyRun_InteractiveOneObjectEx(FILE *, PyObject *, PyCompilerFlags *); +static PyObject* pyrun_file(FILE *fp, PyObject *filename, int start, + PyObject *globals, PyObject *locals, int closeit, + PyCompilerFlags *flags); + /* Parse input from a file and execute it */ int @@ -94,7 +99,7 @@ PyRun_InteractiveLoopFlags(FILE *fp, const char *filename_str, PyCompilerFlags * PyCompilerFlags local_flags = _PyCompilerFlags_INIT; int nomem_count = 0; #ifdef Py_REF_DEBUG - int show_ref_count = _PyInterpreterState_Get()->config.show_ref_count; + int show_ref_count = _Py_GetConfig()->show_ref_count; #endif filename = PyUnicode_DecodeFSDefault(filename_str); @@ -184,6 +189,7 @@ PyRun_InteractiveOneObjectEx(FILE *fp, PyObject *filename, PyArena *arena; const char *ps1 = "", *ps2 = "", *enc = NULL; int errcode = 0; + int use_peg = _PyInterpreterState_GET()->config._use_peg_parser; _Py_IDENTIFIER(encoding); _Py_IDENTIFIER(__main__); @@ -236,9 +242,17 @@ PyRun_InteractiveOneObjectEx(FILE *fp, PyObject *filename, Py_XDECREF(oenc); return -1; } - mod = PyParser_ASTFromFileObject(fp, filename, enc, - Py_single_input, ps1, ps2, - flags, &errcode, arena); + + if (use_peg) { + mod = PyPegen_ASTFromFileObject(fp, filename, Py_single_input, + enc, ps1, ps2, flags, &errcode, arena); + } + else { + mod = PyParser_ASTFromFileObject(fp, filename, enc, + Py_single_input, ps1, ps2, + flags, &errcode, arena); + } + Py_XDECREF(v); Py_XDECREF(w); Py_XDECREF(oenc); @@ -300,82 +314,89 @@ PyRun_InteractiveOneFlags(FILE *fp, const char *filename_str, PyCompilerFlags *f the file type, and, if we may close it, at the first few bytes. */ static int -maybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit) +maybe_pyc_file(FILE *fp, PyObject *filename, int closeit) { - if (strcmp(ext, ".pyc") == 0) + PyObject *ext = PyUnicode_FromString(".pyc"); + if (ext == NULL) { + return -1; + } + Py_ssize_t endswith = PyUnicode_Tailmatch(filename, ext, 0, PY_SSIZE_T_MAX, +1); + Py_DECREF(ext); + if (endswith) { return 1; + } /* Only look into the file if we are allowed to close it, since it then should also be seekable. */ - if (closeit) { - /* Read only two bytes of the magic. If the file was opened in - text mode, the bytes 3 and 4 of the magic (\r\n) might not - be read as they are on disk. */ - unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF; - unsigned char buf[2]; - /* Mess: In case of -x, the stream is NOT at its start now, - and ungetc() was used to push back the first newline, - which makes the current stream position formally undefined, - and a x-platform nightmare. - Unfortunately, we have no direct way to know whether -x - was specified. So we use a terrible hack: if the current - stream position is not 0, we assume -x was specified, and - give up. Bug 132850 on SourceForge spells out the - hopelessness of trying anything else (fseek and ftell - don't work predictably x-platform for text-mode files). - */ - int ispyc = 0; - if (ftell(fp) == 0) { - if (fread(buf, 1, 2, fp) == 2 && - ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic) - ispyc = 1; - rewind(fp); - } - return ispyc; + if (!closeit) { + return 0; } - return 0; + + /* Read only two bytes of the magic. If the file was opened in + text mode, the bytes 3 and 4 of the magic (\r\n) might not + be read as they are on disk. */ + unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF; + unsigned char buf[2]; + /* Mess: In case of -x, the stream is NOT at its start now, + and ungetc() was used to push back the first newline, + which makes the current stream position formally undefined, + and a x-platform nightmare. + Unfortunately, we have no direct way to know whether -x + was specified. So we use a terrible hack: if the current + stream position is not 0, we assume -x was specified, and + give up. Bug 132850 on SourceForge spells out the + hopelessness of trying anything else (fseek and ftell + don't work predictably x-platform for text-mode files). + */ + int ispyc = 0; + if (ftell(fp) == 0) { + if (fread(buf, 1, 2, fp) == 2 && + ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic) + ispyc = 1; + rewind(fp); + } + return ispyc; } + static int -set_main_loader(PyObject *d, const char *filename, const char *loader_name) +set_main_loader(PyObject *d, PyObject *filename, const char *loader_name) { - PyObject *filename_obj, *bootstrap, *loader_type = NULL, *loader; - int result = 0; - - filename_obj = PyUnicode_DecodeFSDefault(filename); - if (filename_obj == NULL) + PyInterpreterState *interp = _PyInterpreterState_GET(); + PyObject *bootstrap = PyObject_GetAttrString(interp->importlib, + "_bootstrap_external"); + if (bootstrap == NULL) { return -1; - PyInterpreterState *interp = _PyInterpreterState_Get(); - bootstrap = PyObject_GetAttrString(interp->importlib, - "_bootstrap_external"); - if (bootstrap != NULL) { - loader_type = PyObject_GetAttrString(bootstrap, loader_name); - Py_DECREF(bootstrap); } + + PyObject *loader_type = PyObject_GetAttrString(bootstrap, loader_name); + Py_DECREF(bootstrap); if (loader_type == NULL) { - Py_DECREF(filename_obj); return -1; } - loader = PyObject_CallFunction(loader_type, "sN", "__main__", filename_obj); + + PyObject *loader = PyObject_CallFunction(loader_type, + "sO", "__main__", filename); Py_DECREF(loader_type); if (loader == NULL) { return -1; } + if (PyDict_SetItemString(d, "__loader__", loader) < 0) { - result = -1; + Py_DECREF(loader); + return -1; } Py_DECREF(loader); - return result; + return 0; } -int -PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, - PyCompilerFlags *flags) + +static int +pyrun_simple_file(FILE *fp, PyObject *filename, int closeit, + PyCompilerFlags *flags) { PyObject *m, *d, *v; - const char *ext; int set_file_name = 0, ret = -1; - size_t len; m = PyImport_AddModule("__main__"); if (m == NULL) @@ -383,29 +404,29 @@ PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, Py_INCREF(m); d = PyModule_GetDict(m); if (PyDict_GetItemString(d, "__file__") == NULL) { - PyObject *f; - f = PyUnicode_DecodeFSDefault(filename); - if (f == NULL) - goto done; - if (PyDict_SetItemString(d, "__file__", f) < 0) { - Py_DECREF(f); + if (PyDict_SetItemString(d, "__file__", filename) < 0) { goto done; } if (PyDict_SetItemString(d, "__cached__", Py_None) < 0) { - Py_DECREF(f); goto done; } set_file_name = 1; - Py_DECREF(f); } - len = strlen(filename); - ext = filename + len - (len > 4 ? 4 : 0); - if (maybe_pyc_file(fp, filename, ext, closeit)) { + + int pyc = maybe_pyc_file(fp, filename, closeit); + if (pyc < 0) { + goto done; + } + + if (pyc) { FILE *pyc_fp; /* Try to run a pyc file. First, re-open in binary */ - if (closeit) + if (closeit) { fclose(fp); - if ((pyc_fp = _Py_fopen(filename, "rb")) == NULL) { + } + + pyc_fp = _Py_fopen_obj(filename, "rb"); + if (pyc_fp == NULL) { fprintf(stderr, "python: Can't reopen .pyc file\n"); goto done; } @@ -416,17 +437,17 @@ PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, fclose(pyc_fp); goto done; } - v = run_pyc_file(pyc_fp, filename, d, d, flags); + v = run_pyc_file(pyc_fp, d, d, flags); } else { /* When running from stdin, leave __main__.__loader__ alone */ - if (strcmp(filename, "") != 0 && + if (PyUnicode_CompareWithASCIIString(filename, "") != 0 && set_main_loader(d, filename, "SourceFileLoader") < 0) { fprintf(stderr, "python: failed to set __main__.__loader__\n"); ret = -1; goto done; } - v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d, - closeit, flags); + v = pyrun_file(fp, filename, Py_file_input, d, d, + closeit, flags); } flush_io(); if (v == NULL) { @@ -449,6 +470,21 @@ PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, return ret; } + +int +PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, + PyCompilerFlags *flags) +{ + PyObject *filename_obj = PyUnicode_DecodeFSDefault(filename); + if (filename_obj == NULL) { + return -1; + } + int res = pyrun_simple_file(fp, filename_obj, closeit, flags); + Py_DECREF(filename_obj); + return res; +} + + int PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags) { @@ -468,9 +504,9 @@ PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags) static int parse_syntax_error(PyObject *err, PyObject **message, PyObject **filename, - int *lineno, int *offset, PyObject **text) + Py_ssize_t *lineno, Py_ssize_t *offset, PyObject **text) { - int hold; + Py_ssize_t hold; PyObject *v; _Py_IDENTIFIER(msg); _Py_IDENTIFIER(filename); @@ -503,7 +539,7 @@ parse_syntax_error(PyObject *err, PyObject **message, PyObject **filename, v = _PyObject_GetAttrId(err, &PyId_lineno); if (!v) goto finally; - hold = _PyLong_AsInt(v); + hold = PyLong_AsSsize_t(v); Py_DECREF(v); if (hold < 0 && PyErr_Occurred()) goto finally; @@ -516,7 +552,7 @@ parse_syntax_error(PyObject *err, PyObject **message, PyObject **filename, *offset = -1; Py_DECREF(v); } else { - hold = _PyLong_AsInt(v); + hold = PyLong_AsSsize_t(v); Py_DECREF(v); if (hold < 0 && PyErr_Occurred()) goto finally; @@ -542,39 +578,67 @@ parse_syntax_error(PyObject *err, PyObject **message, PyObject **filename, } static void -print_error_text(PyObject *f, int offset, PyObject *text_obj) +print_error_text(PyObject *f, Py_ssize_t offset, PyObject *text_obj) { - const char *text; - const char *nl; - - text = PyUnicode_AsUTF8(text_obj); + /* Convert text to a char pointer; return if error */ + const char *text = PyUnicode_AsUTF8(text_obj); if (text == NULL) return; - if (offset >= 0) { - if (offset > 0 && (size_t)offset == strlen(text) && text[offset - 1] == '\n') - offset--; - for (;;) { - nl = strchr(text, '\n'); - if (nl == NULL || nl-text >= offset) - break; - offset -= (int)(nl+1-text); - text = nl+1; + /* Convert offset from 1-based to 0-based */ + offset--; + + /* Strip leading whitespace from text, adjusting offset as we go */ + while (*text == ' ' || *text == '\t' || *text == '\f') { + text++; + offset--; + } + + /* Calculate text length excluding trailing newline */ + Py_ssize_t len = strlen(text); + if (len > 0 && text[len-1] == '\n') { + len--; + } + + /* Clip offset to at most len */ + if (offset > len) { + offset = len; + } + + /* Skip past newlines embedded in text */ + for (;;) { + const char *nl = strchr(text, '\n'); + if (nl == NULL) { + break; } - while (*text == ' ' || *text == '\t' || *text == '\f') { - text++; - offset--; + Py_ssize_t inl = nl - text; + if (inl >= offset) { + break; } + inl += 1; + text += inl; + len -= inl; + offset -= (int)inl; } + + /* Print text */ PyFile_WriteString(" ", f); PyFile_WriteString(text, f); - if (*text == '\0' || text[strlen(text)-1] != '\n') + + /* Make sure there's a newline at the end */ + if (text[len] != '\n') { PyFile_WriteString("\n", f); - if (offset == -1) + } + + /* Don't print caret if it points to the left of the text */ + if (offset < 0) return; + + /* Write caret line */ PyFile_WriteString(" ", f); - while (--offset > 0) + while (--offset >= 0) { PyFile_WriteString(" ", f); + } PyFile_WriteString("^\n", f); } @@ -582,7 +646,7 @@ print_error_text(PyObject *f, int offset, PyObject *text_obj) int _Py_HandleSystemExit(int *exitcode_p) { - int inspect = _PyInterpreterState_GET_UNSAFE()->config.inspect; + int inspect = _Py_GetConfig()->inspect; if (inspect) { /* Don't exit if -i flag was given. This flag is set to 0 * when entering interactive mode for inspecting. */ @@ -695,8 +759,8 @@ _PyErr_PrintEx(PyThreadState *tstate, int set_sys_last_vars) } } hook = _PySys_GetObjectId(&PyId_excepthook); - if (PySys_Audit("sys.excepthook", "OOOO", hook ? hook : Py_None, - exception, v, tb) < 0) { + if (_PySys_Audit(tstate, "sys.excepthook", "OOOO", hook ? hook : Py_None, + exception, v, tb) < 0) { if (PyErr_ExceptionMatches(PyExc_RuntimeError)) { PyErr_Clear(); goto done; @@ -795,7 +859,7 @@ print_exception(PyObject *f, PyObject *value) _PyObject_HasAttrId(value, &PyId_print_file_and_line)) { PyObject *message, *filename, *text; - int lineno, offset; + Py_ssize_t lineno, offset; if (!parse_syntax_error(value, &message, &filename, &lineno, &offset, &text)) PyErr_Clear(); @@ -805,7 +869,7 @@ print_exception(PyObject *f, PyObject *value) Py_DECREF(value); value = message; - line = PyUnicode_FromFormat(" File \"%S\", line %d\n", + line = PyUnicode_FromFormat(" File \"%S\", line %zd\n", filename, lineno); Py_DECREF(filename); if (line != NULL) { @@ -986,7 +1050,7 @@ _PyErr_Display(PyObject *file, PyObject *exception, PyObject *value, PyObject *t Py_XDECREF(seen); /* Call file.flush() */ - PyObject *res = _PyObject_CallMethodId(file, &PyId_flush, NULL); + PyObject *res = _PyObject_CallMethodIdNoArgs(file, &PyId_flush); if (!res) { /* Silently ignore file.flush() error */ PyErr_Clear(); @@ -1020,6 +1084,7 @@ PyRun_StringFlags(const char *str, int start, PyObject *globals, mod_ty mod; PyArena *arena; PyObject *filename; + int use_peg = _PyInterpreterState_GET()->config._use_peg_parser; filename = _PyUnicode_FromId(&PyId_string); /* borrowed */ if (filename == NULL) @@ -1029,46 +1094,74 @@ PyRun_StringFlags(const char *str, int start, PyObject *globals, if (arena == NULL) return NULL; - mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena); + if (use_peg) { + mod = PyPegen_ASTFromStringObject(str, filename, start, flags, arena); + } + else { + mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena); + } + if (mod != NULL) ret = run_mod(mod, filename, globals, locals, flags, arena); PyArena_Free(arena); return ret; } -PyObject * -PyRun_FileExFlags(FILE *fp, const char *filename_str, int start, PyObject *globals, - PyObject *locals, int closeit, PyCompilerFlags *flags) -{ - PyObject *ret = NULL; - mod_ty mod; - PyArena *arena = NULL; - PyObject *filename; - filename = PyUnicode_DecodeFSDefault(filename_str); - if (filename == NULL) - goto exit; +static PyObject * +pyrun_file(FILE *fp, PyObject *filename, int start, PyObject *globals, + PyObject *locals, int closeit, PyCompilerFlags *flags) +{ + PyArena *arena = PyArena_New(); + if (arena == NULL) { + return NULL; + } - arena = PyArena_New(); - if (arena == NULL) - goto exit; + mod_ty mod; + int use_peg = _PyInterpreterState_GET()->config._use_peg_parser; + if (use_peg) { + mod = PyPegen_ASTFromFileObject(fp, filename, start, NULL, NULL, NULL, + flags, NULL, arena); + } + else { + mod = PyParser_ASTFromFileObject(fp, filename, NULL, start, 0, 0, + flags, NULL, arena); + } - mod = PyParser_ASTFromFileObject(fp, filename, NULL, start, 0, 0, - flags, NULL, arena); - if (closeit) + if (closeit) { fclose(fp); - if (mod == NULL) { - goto exit; } - ret = run_mod(mod, filename, globals, locals, flags, arena); -exit: - Py_XDECREF(filename); - if (arena != NULL) - PyArena_Free(arena); + PyObject *ret; + if (mod != NULL) { + ret = run_mod(mod, filename, globals, locals, flags, arena); + } + else { + ret = NULL; + } + PyArena_Free(arena); + return ret; } + +PyObject * +PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals, + PyObject *locals, int closeit, PyCompilerFlags *flags) +{ + PyObject *filename_obj = PyUnicode_DecodeFSDefault(filename); + if (filename_obj == NULL) { + return NULL; + } + + PyObject *res = pyrun_file(fp, filename_obj, start, globals, + locals, closeit, flags); + Py_DECREF(filename_obj); + return res; + +} + + static void flush_io(void) { @@ -1080,7 +1173,7 @@ flush_io(void) f = _PySys_GetObjectId(&PyId_stderr); if (f != NULL) { - r = _PyObject_CallMethodId(f, &PyId_flush, NULL); + r = _PyObject_CallMethodIdNoArgs(f, &PyId_flush); if (r) Py_DECREF(r); else @@ -1088,7 +1181,7 @@ flush_io(void) } f = _PySys_GetObjectId(&PyId_stdout); if (f != NULL) { - r = _PyObject_CallMethodId(f, &PyId_flush, NULL); + r = _PyObject_CallMethodIdNoArgs(f, &PyId_flush); if (r) Py_DECREF(r); else @@ -1099,7 +1192,7 @@ flush_io(void) } static PyObject * -run_eval_code_obj(PyCodeObject *co, PyObject *globals, PyObject *locals) +run_eval_code_obj(PyThreadState *tstate, PyCodeObject *co, PyObject *globals, PyObject *locals) { PyObject *v; /* @@ -1116,14 +1209,14 @@ run_eval_code_obj(PyCodeObject *co, PyObject *globals, PyObject *locals) /* Set globals['__builtins__'] if it doesn't exist */ if (globals != NULL && PyDict_GetItemString(globals, "__builtins__") == NULL) { - PyInterpreterState *interp = _PyInterpreterState_Get(); - if (PyDict_SetItemString(globals, "__builtins__", interp->builtins) < 0) { + if (PyDict_SetItemString(globals, "__builtins__", + tstate->interp->builtins) < 0) { return NULL; } } v = PyEval_EvalCode((PyObject*)co, globals, locals); - if (!v && PyErr_Occurred() == PyExc_KeyboardInterrupt) { + if (!v && _PyErr_Occurred(tstate) == PyExc_KeyboardInterrupt) { _Py_UnhandledKeyboardInterrupt = 1; } return v; @@ -1133,26 +1226,26 @@ static PyObject * run_mod(mod_ty mod, PyObject *filename, PyObject *globals, PyObject *locals, PyCompilerFlags *flags, PyArena *arena) { - PyCodeObject *co; - PyObject *v; - co = PyAST_CompileObject(mod, filename, flags, -1, arena); + PyThreadState *tstate = _PyThreadState_GET(); + PyCodeObject *co = PyAST_CompileObject(mod, filename, flags, -1, arena); if (co == NULL) return NULL; - if (PySys_Audit("exec", "O", co) < 0) { + if (_PySys_Audit(tstate, "exec", "O", co) < 0) { Py_DECREF(co); return NULL; } - v = run_eval_code_obj(co, globals, locals); + PyObject *v = run_eval_code_obj(tstate, co, globals, locals); Py_DECREF(co); return v; } static PyObject * -run_pyc_file(FILE *fp, const char *filename, PyObject *globals, - PyObject *locals, PyCompilerFlags *flags) +run_pyc_file(FILE *fp, PyObject *globals, PyObject *locals, + PyCompilerFlags *flags) { + PyThreadState *tstate = _PyThreadState_GET(); PyCodeObject *co; PyObject *v; long magic; @@ -1181,7 +1274,7 @@ run_pyc_file(FILE *fp, const char *filename, PyObject *globals, } fclose(fp); co = (PyCodeObject *)v; - v = run_eval_code_obj(co, globals, locals); + v = run_eval_code_obj(tstate, co, globals, locals); if (v && flags) flags->cf_flags |= (co->co_flags & PyCF_MASK); Py_DECREF(co); @@ -1197,11 +1290,17 @@ Py_CompileStringObject(const char *str, PyObject *filename, int start, { PyCodeObject *co; mod_ty mod; + int use_peg = _PyInterpreterState_GET()->config._use_peg_parser; PyArena *arena = PyArena_New(); if (arena == NULL) return NULL; - mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena); + if (use_peg) { + mod = PyPegen_ASTFromStringObject(str, filename, start, flags, arena); + } + else { + mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena); + } if (mod == NULL) { PyArena_Free(arena); return NULL; @@ -1298,13 +1397,19 @@ _Py_SymtableStringObjectFlags(const char *str, PyObject *filename, int start, Py { struct symtable *st; mod_ty mod; + int use_peg = _PyInterpreterState_GET()->config._use_peg_parser; PyArena *arena; arena = PyArena_New(); if (arena == NULL) return NULL; - mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena); + if (use_peg) { + mod = PyPegen_ASTFromStringObject(str, filename, start, flags, arena); + } + else { + mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena); + } if (mod == NULL) { PyArena_Free(arena); return NULL; @@ -1566,9 +1671,6 @@ err_input(perrdetail *err) msg = "unexpected character after line continuation character"; break; - case E_IDENTIFIER: - msg = "invalid character in identifier"; - break; case E_BADSINGLE: msg = "multiple statements found while compiling a single statement"; break; diff --git a/Python/pytime.c b/Python/pytime.c index 109d52692ce4860e16b38638872227eba3c1d007..89d63e080422b34e20257549b4edd5ee680c35ad 100644 --- a/Python/pytime.c +++ b/Python/pytime.c @@ -5,6 +5,12 @@ #if defined(__APPLE__) #include /* mach_absolute_time(), mach_timebase_info() */ + +#if defined(__APPLE__) && defined(__has_builtin) +# if __has_builtin(__builtin_available) +# define HAVE_CLOCK_GETTIME_RUNTIME __builtin_available(macOS 10.12, iOS 10.0, tvOS 10.0, watchOS 3.0, *) +# endif +#endif #endif #define _PyTime_check_mul_overflow(a, b) \ @@ -683,15 +689,22 @@ pygettimeofday(_PyTime_t *tp, _Py_clock_info_t *info, int raise) #else /* MS_WINDOWS */ int err; -#ifdef HAVE_CLOCK_GETTIME +#if defined(HAVE_CLOCK_GETTIME) struct timespec ts; -#else +#endif + +#if !defined(HAVE_CLOCK_GETTIME) || defined(__APPLE__) struct timeval tv; #endif assert(info == NULL || raise); #ifdef HAVE_CLOCK_GETTIME + +#ifdef HAVE_CLOCK_GETTIME_RUNTIME + if (HAVE_CLOCK_GETTIME_RUNTIME) { +#endif + err = clock_gettime(CLOCK_REALTIME, &ts); if (err) { if (raise) { @@ -715,14 +728,17 @@ pygettimeofday(_PyTime_t *tp, _Py_clock_info_t *info, int raise) info->resolution = 1e-9; } } -#else /* HAVE_CLOCK_GETTIME */ + +#ifdef HAVE_CLOCK_GETTIME_RUNTIME + } else { +#endif + +#endif + +#if !defined(HAVE_CLOCK_GETTIME) || defined(HAVE_CLOCK_GETTIME_RUNTIME) /* test gettimeofday() */ -#ifdef GETTIMEOFDAY_NO_TZ - err = gettimeofday(&tv); -#else err = gettimeofday(&tv, (struct timezone *)NULL); -#endif if (err) { if (raise) { PyErr_SetFromErrno(PyExc_OSError); @@ -739,6 +755,11 @@ pygettimeofday(_PyTime_t *tp, _Py_clock_info_t *info, int raise) info->monotonic = 0; info->adjustable = 1; } + +#if defined(HAVE_CLOCK_GETTIME_RUNTIME) && defined(HAVE_CLOCK_GETTIME) + } /* end of availibity block */ +#endif + #endif /* !HAVE_CLOCK_GETTIME */ #endif /* !MS_WINDOWS */ return 0; @@ -750,7 +771,7 @@ _PyTime_GetSystemClock(void) _PyTime_t t; if (pygettimeofday(&t, NULL, 0) < 0) { /* should not happen, _PyTime_Init() checked the clock at startup */ - Py_UNREACHABLE(); + Py_FatalError("pygettimeofday() failed"); } return t; } @@ -780,7 +801,7 @@ pymonotonic(_PyTime_t *tp, _Py_clock_info_t *info, int raise) return -1; } /* Hello, time traveler! */ - Py_UNREACHABLE(); + Py_FatalError("pymonotonic: integer overflow"); } *tp = t * MS_TO_NS; @@ -922,7 +943,7 @@ _PyTime_GetMonotonicClock(void) if (pymonotonic(&t, NULL, 0) < 0) { /* should not happen, _PyTime_Init() checked that monotonic clock at startup */ - Py_UNREACHABLE(); + Py_FatalError("pymonotonic() failed"); } return t; } @@ -1023,7 +1044,7 @@ _PyTime_GetPerfCounter(void) { _PyTime_t t; if (_PyTime_GetPerfCounterWithInfo(&t, NULL)) { - Py_UNREACHABLE(); + Py_FatalError("_PyTime_GetPerfCounterWithInfo() failed"); } return t; } @@ -1063,7 +1084,7 @@ _PyTime_localtime(time_t t, struct tm *tm) return 0; #else /* !MS_WINDOWS */ -#ifdef _AIX +#if defined(_AIX) && (SIZEOF_TIME_T < 8) /* bpo-34373: AIX does not return NULL if t is too small or too large */ if (t < -2145916800 /* 1902-01-01 */ || t > 2145916800 /* 2038-01-01 */) { diff --git a/Python/structmember.c b/Python/structmember.c index e653d0277c1a106398546b832677bb865faea9ee..ba88e15f9386911d31eee3b76e02db9148e0b352 100644 --- a/Python/structmember.c +++ b/Python/structmember.c @@ -2,8 +2,7 @@ /* Map C struct members to Python object attributes */ #include "Python.h" - -#include "structmember.h" +#include "structmember.h" // PyMemberDef PyObject * PyMember_GetOne(const char *addr, PyMemberDef *l) diff --git a/Python/symtable.c b/Python/symtable.c index 30482d99b3ca927c2034c0e3e84fb202179b2756..d192f31deefb77ae03f0aac11930ccf3b8455b5e 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -1,8 +1,8 @@ #include "Python.h" -#include "pycore_pystate.h" +#include "pycore_pystate.h" // _PyThreadState_GET() #include "symtable.h" #undef Yield /* undefine macro conflicting with */ -#include "structmember.h" +#include "structmember.h" // PyMemberDef /* error strings used for warnings */ #define GLOBAL_PARAM \ @@ -190,7 +190,7 @@ static int symtable_analyze(struct symtable *st); static int symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block, void *ast, int lineno, int col_offset); -static int symtable_exit_block(struct symtable *st, void *ast); +static int symtable_exit_block(struct symtable *st); static int symtable_visit_stmt(struct symtable *st, stmt_ty s); static int symtable_visit_expr(struct symtable *st, expr_ty s); static int symtable_visit_genexp(struct symtable *st, expr_ty s); @@ -202,11 +202,10 @@ static int symtable_visit_excepthandler(struct symtable *st, excepthandler_ty); static int symtable_visit_alias(struct symtable *st, alias_ty); static int symtable_visit_comprehension(struct symtable *st, comprehension_ty); static int symtable_visit_keyword(struct symtable *st, keyword_ty); -static int symtable_visit_slice(struct symtable *st, slice_ty); static int symtable_visit_params(struct symtable *st, asdl_seq *args); static int symtable_visit_argannotations(struct symtable *st, asdl_seq *args); static int symtable_implicit_arg(struct symtable *st, int pos); -static int symtable_visit_annotations(struct symtable *st, stmt_ty s, arguments_ty, expr_ty); +static int symtable_visit_annotations(struct symtable *st, arguments_ty, expr_ty); static int symtable_visit_withitem(struct symtable *st, withitem_ty item); @@ -318,16 +317,12 @@ PySymtable_BuildObject(mod_ty mod, PyObject *filename, PyFutureFeatures *future) (stmt_ty)asdl_seq_GET(seq, i))) goto error; break; - case Suite_kind: - PyErr_SetString(PyExc_RuntimeError, - "this compiler does not handle Suites"); - goto error; case FunctionType_kind: PyErr_SetString(PyExc_RuntimeError, "this compiler does not handle FunctionTypes"); goto error; } - if (!symtable_exit_block(st, (void *)mod)) { + if (!symtable_exit_block(st)) { PySymtable_Free(st); return NULL; } @@ -345,7 +340,7 @@ PySymtable_BuildObject(mod_ty mod, PyObject *filename, PyFutureFeatures *future) PySymtable_Free(st); return NULL; error: - (void) symtable_exit_block(st, (void *)mod); + (void) symtable_exit_block(st); PySymtable_Free(st); return NULL; } @@ -954,7 +949,7 @@ symtable_analyze(struct symtable *st) */ static int -symtable_exit_block(struct symtable *st, void *ast) +symtable_exit_block(struct symtable *st) { Py_ssize_t size; @@ -1188,7 +1183,7 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) VISIT_SEQ(st, expr, s->v.FunctionDef.args->defaults); if (s->v.FunctionDef.args->kw_defaults) VISIT_SEQ_WITH_NULL(st, expr, s->v.FunctionDef.args->kw_defaults); - if (!symtable_visit_annotations(st, s, s->v.FunctionDef.args, + if (!symtable_visit_annotations(st, s->v.FunctionDef.args, s->v.FunctionDef.returns)) VISIT_QUIT(st, 0); if (s->v.FunctionDef.decorator_list) @@ -1199,7 +1194,7 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) VISIT_QUIT(st, 0); VISIT(st, arguments, s->v.FunctionDef.args); VISIT_SEQ(st, stmt, s->v.FunctionDef.body); - if (!symtable_exit_block(st, s)) + if (!symtable_exit_block(st)) VISIT_QUIT(st, 0); break; case ClassDef_kind: { @@ -1217,7 +1212,7 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) st->st_private = s->v.ClassDef.name; VISIT_SEQ(st, stmt, s->v.ClassDef.body); st->st_private = tmp; - if (!symtable_exit_block(st, s)) + if (!symtable_exit_block(st)) VISIT_QUIT(st, 0); break; } @@ -1406,7 +1401,7 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) if (s->v.AsyncFunctionDef.args->kw_defaults) VISIT_SEQ_WITH_NULL(st, expr, s->v.AsyncFunctionDef.args->kw_defaults); - if (!symtable_visit_annotations(st, s, s->v.AsyncFunctionDef.args, + if (!symtable_visit_annotations(st, s->v.AsyncFunctionDef.args, s->v.AsyncFunctionDef.returns)) VISIT_QUIT(st, 0); if (s->v.AsyncFunctionDef.decorator_list) @@ -1418,7 +1413,7 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) st->st_cur->ste_coroutine = 1; VISIT(st, arguments, s->v.AsyncFunctionDef.args); VISIT_SEQ(st, stmt, s->v.AsyncFunctionDef.body); - if (!symtable_exit_block(st, s)) + if (!symtable_exit_block(st)) VISIT_QUIT(st, 0); break; case AsyncWith_kind: @@ -1565,7 +1560,7 @@ symtable_visit_expr(struct symtable *st, expr_ty e) VISIT_QUIT(st, 0); VISIT(st, arguments, e->v.Lambda.args); VISIT(st, expr, e->v.Lambda.body); - if (!symtable_exit_block(st, (void *)e)) + if (!symtable_exit_block(st)) VISIT_QUIT(st, 0); break; } @@ -1636,11 +1631,19 @@ symtable_visit_expr(struct symtable *st, expr_ty e) break; case Subscript_kind: VISIT(st, expr, e->v.Subscript.value); - VISIT(st, slice, e->v.Subscript.slice); + VISIT(st, expr, e->v.Subscript.slice); break; case Starred_kind: VISIT(st, expr, e->v.Starred.value); break; + case Slice_kind: + if (e->v.Slice.lower) + VISIT(st, expr, e->v.Slice.lower) + if (e->v.Slice.upper) + VISIT(st, expr, e->v.Slice.upper) + if (e->v.Slice.step) + VISIT(st, expr, e->v.Slice.step) + break; case Name_kind: if (!symtable_add_def(st, e->v.Name.id, e->v.Name.ctx == Load ? USE : DEF_LOCAL)) @@ -1714,8 +1717,7 @@ symtable_visit_argannotations(struct symtable *st, asdl_seq *args) } static int -symtable_visit_annotations(struct symtable *st, stmt_ty s, - arguments_ty a, expr_ty returns) +symtable_visit_annotations(struct symtable *st, arguments_ty a, expr_ty returns) { if (a->posonlyargs && !symtable_visit_argannotations(st, a->posonlyargs)) return 0; @@ -1846,28 +1848,6 @@ symtable_visit_keyword(struct symtable *st, keyword_ty k) } -static int -symtable_visit_slice(struct symtable *st, slice_ty s) -{ - switch (s->kind) { - case Slice_kind: - if (s->v.Slice.lower) - VISIT(st, expr, s->v.Slice.lower) - if (s->v.Slice.upper) - VISIT(st, expr, s->v.Slice.upper) - if (s->v.Slice.step) - VISIT(st, expr, s->v.Slice.step) - break; - case ExtSlice_kind: - VISIT_SEQ(st, slice, s->v.ExtSlice.dims) - break; - case Index_kind: - VISIT(st, expr, s->v.Index.value) - break; - } - return 1; -} - static int symtable_handle_comprehension(struct symtable *st, expr_ty e, identifier scope_name, asdl_seq *generators, @@ -1893,7 +1873,7 @@ symtable_handle_comprehension(struct symtable *st, expr_ty e, /* Outermost iter is received as an argument */ if (!symtable_implicit_arg(st, 0)) { - symtable_exit_block(st, (void *)e); + symtable_exit_block(st); return 0; } /* Visit iteration variable target, and mark them as such */ @@ -1915,11 +1895,11 @@ symtable_handle_comprehension(struct symtable *st, expr_ty e, PyErr_SyntaxLocationObject(st->st_filename, st->st_cur->ste_lineno, st->st_cur->ste_col_offset + 1); - symtable_exit_block(st, (void *)e); + symtable_exit_block(st); return 0; } st->st_cur->ste_generator = is_generator; - return symtable_exit_block(st, (void *)e); + return symtable_exit_block(st); } static int diff --git a/Python/sysmodule.c b/Python/sysmodule.c index b544f2b793ec99860ed2c5d61a8ae6d9e6ed80f1..3e4115fe8e1f93676d067b0f91934b7992d008e5 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -16,17 +16,19 @@ Data members: #include "Python.h" #include "code.h" -#include "frameobject.h" +#include "frameobject.h" // PyFrame_GetBack() +#include "pycore_ceval.h" // _Py_RecursionLimitLowerWaterMark() #include "pycore_initconfig.h" -#include "pycore_pylifecycle.h" -#include "pycore_pymem.h" +#include "pycore_object.h" #include "pycore_pathconfig.h" -#include "pycore_pystate.h" +#include "pycore_pyerrors.h" +#include "pycore_pylifecycle.h" +#include "pycore_pymem.h" // _PyMem_SetDefaultAllocator() +#include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_tupleobject.h" -#include "pythread.h" -#include "pydtrace.h" -#include "osdefs.h" +#include "pydtrace.h" +#include "osdefs.h" // DELIM #include #ifdef MS_WINDOWS @@ -59,30 +61,38 @@ _Py_IDENTIFIER(stderr); _Py_IDENTIFIER(warnoptions); _Py_IDENTIFIER(write); -PyObject * -_PySys_GetObjectId(_Py_Identifier *key) +static PyObject * +sys_get_object_id(PyThreadState *tstate, _Py_Identifier *key) { - PyObject *sd = _PyInterpreterState_GET_UNSAFE()->sysdict; + PyObject *sd = tstate->interp->sysdict; if (sd == NULL) { return NULL; } return _PyDict_GetItemId(sd, key); } +PyObject * +_PySys_GetObjectId(_Py_Identifier *key) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return sys_get_object_id(tstate, key); +} + PyObject * PySys_GetObject(const char *name) { - PyObject *sd = _PyInterpreterState_GET_UNSAFE()->sysdict; + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *sd = tstate->interp->sysdict; if (sd == NULL) { return NULL; } return PyDict_GetItemString(sd, name); } -int -_PySys_SetObjectId(_Py_Identifier *key, PyObject *v) +static int +sys_set_object_id(PyThreadState *tstate, _Py_Identifier *key, PyObject *v) { - PyObject *sd = _PyInterpreterState_GET_UNSAFE()->sysdict; + PyObject *sd = tstate->interp->sysdict; if (v == NULL) { if (_PyDict_GetItemId(sd, key) == NULL) { return 0; @@ -97,9 +107,16 @@ _PySys_SetObjectId(_Py_Identifier *key, PyObject *v) } int -PySys_SetObject(const char *name, PyObject *v) +_PySys_SetObjectId(_Py_Identifier *key, PyObject *v) { - PyObject *sd = _PyInterpreterState_GET_UNSAFE()->sysdict; + PyThreadState *tstate = _PyThreadState_GET(); + return sys_set_object_id(tstate, key, v); +} + +static int +sys_set_object(PyThreadState *tstate, const char *name, PyObject *v) +{ + PyObject *sd = tstate->interp->sysdict; if (v == NULL) { if (PyDict_GetItemString(sd, name) == NULL) { return 0; @@ -113,60 +130,74 @@ PySys_SetObject(const char *name, PyObject *v) } } +int +PySys_SetObject(const char *name, PyObject *v) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return sys_set_object(tstate, name, v); +} + + static int -should_audit(void) +should_audit(PyInterpreterState *is) { - PyThreadState *ts = _PyThreadState_GET(); - if (!ts) { + /* tstate->interp cannot be NULL, but test it just in case + for extra safety */ + assert(is != NULL); + if (!is) { return 0; } - PyInterpreterState *is = ts ? ts->interp : NULL; - return _PyRuntime.audit_hook_head - || (is && is->audit_hooks) - || PyDTrace_AUDIT_ENABLED(); + return (is->runtime->audit_hook_head + || 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; +static int +sys_audit_tstate(PyThreadState *ts, const char *event, + const char *argFormat, va_list vargs) +{ /* 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')); + if (!ts) { + /* Audit hooks cannot be called with a NULL thread state */ + return 0; + } + + /* The current implementation cannot be called if tstate is not + the current Python thread state. */ + assert(ts == _PyThreadState_GET()); + /* Early exit when no hooks are registered */ - if (!should_audit()) { + PyInterpreterState *is = ts->interp; + if (!should_audit(is)) { return 0; } - _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head; - PyThreadState *ts = _PyThreadState_GET(); - PyInterpreterState *is = ts ? ts->interp : NULL; + PyObject *eventName = NULL; + PyObject *eventArgs = NULL; + PyObject *hooks = NULL; + PyObject *hook = NULL; + int res = -1; + int dtrace = PyDTrace_AUDIT_ENABLED(); PyObject *exc_type, *exc_value, *exc_tb; - if (ts) { - PyErr_Fetch(&exc_type, &exc_value, &exc_tb); - } + _PyErr_Fetch(ts, &exc_type, &exc_value, &exc_tb); /* Initialize event args now */ if (argFormat && argFormat[0]) { - va_list args; - va_start(args, argFormat); - eventArgs = _Py_VaBuildValue_SizeT(argFormat, args); - va_end(args); + eventArgs = _Py_VaBuildValue_SizeT(argFormat, vargs); if (eventArgs && !PyTuple_Check(eventArgs)) { PyObject *argTuple = PyTuple_Pack(1, eventArgs); Py_DECREF(eventArgs); eventArgs = argTuple; } - } else { + } + else { eventArgs = PyTuple_New(0); } if (!eventArgs) { @@ -174,6 +205,7 @@ PySys_Audit(const char *event, const char *argFormat, ...) } /* Call global hooks */ + _Py_AuditHookEntry *e = is->runtime->audit_hook_head; for (; e; e = e->next) { if (e->hookCFunction(event, eventArgs, e->userData) < 0) { goto exit; @@ -186,7 +218,7 @@ PySys_Audit(const char *event, const char *argFormat, ...) } /* Call interpreter hooks */ - if (is && is->audit_hooks) { + if (is->audit_hooks) { eventName = PyUnicode_FromString(event); if (!eventName) { goto exit; @@ -215,8 +247,8 @@ PySys_Audit(const char *event, const char *argFormat, ...) ts->use_tracing = (ts->c_tracefunc || ts->c_profilefunc); ts->tracing--; } - o = PyObject_CallFunctionObjArgs(hook, eventName, - eventArgs, NULL); + PyObject* args[2] = {eventName, eventArgs}; + o = _PyObject_FastCallTstate(ts, hook, args, 2); if (canTrace) { ts->tracing++; ts->use_tracing = 0; @@ -229,7 +261,7 @@ PySys_Audit(const char *event, const char *argFormat, ...) } ts->use_tracing = (ts->c_tracefunc || ts->c_profilefunc); ts->tracing--; - if (PyErr_Occurred()) { + if (_PyErr_Occurred(ts)) { goto exit; } } @@ -242,43 +274,81 @@ PySys_Audit(const char *event, const char *argFormat, ...) 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); - } + if (!res) { + _PyErr_Restore(ts, exc_type, exc_value, exc_tb); + } + else { + assert(_PyErr_Occurred(ts)); + Py_XDECREF(exc_type); + Py_XDECREF(exc_value); + Py_XDECREF(exc_tb); } return res; } +int +_PySys_Audit(PyThreadState *tstate, const char *event, + const char *argFormat, ...) +{ + va_list vargs; +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, argFormat); +#else + va_start(vargs); +#endif + int res = sys_audit_tstate(tstate, event, argFormat, vargs); + va_end(vargs); + return res; +} + +int +PySys_Audit(const char *event, const char *argFormat, ...) +{ + PyThreadState *tstate = _PyThreadState_GET(); + va_list vargs; +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, argFormat); +#else + va_start(vargs); +#endif + int res = sys_audit_tstate(tstate, event, argFormat, vargs); + va_end(vargs); + 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)) + * and as such the function is not exported. + * + * Must be finalizing to clear hooks */ +void +_PySys_ClearAuditHooks(PyThreadState *ts) +{ + assert(ts != NULL); + if (!ts) { return; + } - if (Py_VerboseFlag) { + _PyRuntimeState *runtime = ts->interp->runtime; + PyThreadState *finalizing = _PyRuntimeState_GetFinalizing(runtime); + assert(finalizing == ts); + if (finalizing != ts) { + return; + } + + const PyConfig *config = _PyInterpreterState_GetConfig(ts->interp); + if (config->verbose) { 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(); + _PySys_Audit(ts, "cpython._PySys_ClearAuditHooks", NULL); + _PyErr_Clear(ts); - _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head, *n; - _PyRuntime.audit_hook_head = NULL; + _Py_AuditHookEntry *e = runtime->audit_hook_head, *n; + runtime->audit_hook_head = NULL; while (e) { n = e->next; PyMem_RawFree(e); @@ -289,33 +359,46 @@ void _PySys_ClearAuditHooks(void) { int PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData) { + /* tstate can be NULL, so access directly _PyRuntime: + PySys_AddAuditHook() can be called before Python is initialized. */ + _PyRuntimeState *runtime = &_PyRuntime; + PyThreadState *tstate; + if (runtime->initialized) { + tstate = _PyRuntimeState_GetThreadState(runtime); + } + else { + tstate = NULL; + } + /* 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_RuntimeError)) { + if (tstate != NULL) { + if (_PySys_Audit(tstate, "sys.addaudithook", NULL) < 0) { + if (_PyErr_ExceptionMatches(tstate, PyExc_RuntimeError)) { /* We do not report errors derived from RuntimeError */ - PyErr_Clear(); + _PyErr_Clear(tstate); return 0; } return -1; } } - _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head; + _Py_AuditHookEntry *e = runtime->audit_hook_head; if (!e) { e = (_Py_AuditHookEntry*)PyMem_RawMalloc(sizeof(_Py_AuditHookEntry)); - _PyRuntime.audit_hook_head = e; + runtime->audit_hook_head = e; } else { - while (e->next) + while (e->next) { e = e->next; + } e = e->next = (_Py_AuditHookEntry*)PyMem_RawMalloc( sizeof(_Py_AuditHookEntry)); } if (!e) { - if (Py_IsInitialized()) - PyErr_NoMemory(); + if (tstate != NULL) { + _PyErr_NoMemory(tstate); + } return -1; } @@ -338,18 +421,19 @@ static PyObject * sys_addaudithook_impl(PyObject *module, PyObject *hook) /*[clinic end generated code: output=4f9c17aaeb02f44e input=0f3e191217a45e34]*/ { + PyThreadState *tstate = _PyThreadState_GET(); + /* Invoke existing audit hooks to allow them an opportunity to abort. */ - if (PySys_Audit("sys.addaudithook", NULL) < 0) { - if (PyErr_ExceptionMatches(PyExc_Exception)) { + if (_PySys_Audit(tstate, "sys.addaudithook", NULL) < 0) { + if (_PyErr_ExceptionMatches(tstate, PyExc_Exception)) { /* We do not report errors derived from Exception */ - PyErr_Clear(); + _PyErr_Clear(tstate); Py_RETURN_NONE; } return NULL; } - PyInterpreterState *is = _PyInterpreterState_Get(); - + PyInterpreterState *is = tstate->interp; if (is->audit_hooks == NULL) { is->audit_hooks = PyList_New(0); if (is->audit_hooks == NULL) { @@ -372,23 +456,30 @@ Passes the event to any audit hooks that are attached."); static PyObject * sys_audit(PyObject *self, PyObject *const *args, Py_ssize_t argc) { + PyThreadState *tstate = _PyThreadState_GET(); + _Py_EnsureTstateNotNULL(tstate); + if (argc == 0) { - PyErr_SetString(PyExc_TypeError, "audit() missing 1 required positional argument: 'event'"); + _PyErr_SetString(tstate, PyExc_TypeError, + "audit() missing 1 required positional argument: " + "'event'"); return NULL; } - if (!should_audit()) { + if (!should_audit(tstate->interp)) { Py_RETURN_NONE; } PyObject *auditEvent = args[0]; if (!auditEvent) { - PyErr_SetString(PyExc_TypeError, "expected str for argument 'event'"); + _PyErr_SetString(tstate, 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); + _PyErr_Format(tstate, PyExc_TypeError, + "expected str for argument 'event', not %.200s", + Py_TYPE(auditEvent)->tp_name); return NULL; } const char *event = PyUnicode_AsUTF8(auditEvent); @@ -401,7 +492,7 @@ sys_audit(PyObject *self, PyObject *const *args, Py_ssize_t argc) return NULL; } - int res = PySys_Audit(event, "O", auditArgs); + int res = _PySys_Audit(tstate, event, "O", auditArgs); Py_DECREF(auditArgs); if (res < 0) { @@ -415,7 +506,8 @@ sys_audit(PyObject *self, PyObject *const *args, Py_ssize_t argc) static PyObject * sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords) { - assert(!PyErr_Occurred()); + PyThreadState *tstate = _PyThreadState_GET(); + assert(!_PyErr_Occurred(tstate)); char *envar = Py_GETENV("PYTHONBREAKPOINT"); if (envar == NULL || strlen(envar) == 0) { @@ -431,7 +523,7 @@ sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb * we need to save a copy of envar. */ envar = _PyMem_RawStrdup(envar); if (envar == NULL) { - PyErr_NoMemory(); + _PyErr_NoMemory(tstate); return NULL; } const char *last_dot = strrchr(envar, '.'); @@ -460,7 +552,7 @@ sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb Py_DECREF(modulepath); if (module == NULL) { - if (PyErr_ExceptionMatches(PyExc_ImportError)) { + if (_PyErr_ExceptionMatches(tstate, PyExc_ImportError)) { goto warn; } PyMem_RawFree(envar); @@ -471,20 +563,20 @@ sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb Py_DECREF(module); if (hook == NULL) { - if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { goto warn; } PyMem_RawFree(envar); return NULL; } PyMem_RawFree(envar); - PyObject *retval = _PyObject_Vectorcall(hook, args, nargs, keywords); + PyObject *retval = PyObject_Vectorcall(hook, args, nargs, keywords); Py_DECREF(hook); return retval; warn: /* If any of the imports went wrong, then warn and ignore. */ - PyErr_Clear(); + _PyErr_Clear(tstate); int status = PyErr_WarnFormat( PyExc_RuntimeWarning, 0, "Ignoring unimportable $PYTHONBREAKPOINT: \"%s\"", envar); @@ -539,7 +631,7 @@ sys_displayhook_unencodable(PyObject *outf, PyObject *o) goto error; } if (buffer) { - result = _PyObject_CallMethodIdObjArgs(buffer, &PyId_write, encoded, NULL); + result = _PyObject_CallMethodIdOneArg(buffer, &PyId_write, encoded); Py_DECREF(buffer); Py_DECREF(encoded); if (result == NULL) @@ -583,12 +675,13 @@ sys_displayhook(PyObject *module, PyObject *o) PyObject *outf; PyObject *builtins; static PyObject *newline = NULL; - int err; + PyThreadState *tstate = _PyThreadState_GET(); builtins = _PyImport_GetModuleId(&PyId_builtins); if (builtins == NULL) { - if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_RuntimeError, "lost builtins module"); + if (!_PyErr_Occurred(tstate)) { + _PyErr_SetString(tstate, PyExc_RuntimeError, + "lost builtins module"); } return NULL; } @@ -602,19 +695,21 @@ sys_displayhook(PyObject *module, PyObject *o) } if (_PyObject_SetAttrId(builtins, &PyId__, Py_None) != 0) return NULL; - outf = _PySys_GetObjectId(&PyId_stdout); + outf = sys_get_object_id(tstate, &PyId_stdout); if (outf == NULL || outf == Py_None) { - PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout"); + _PyErr_SetString(tstate, PyExc_RuntimeError, "lost sys.stdout"); return NULL; } if (PyFile_WriteObject(o, outf, 0) != 0) { - if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError)) { + if (_PyErr_ExceptionMatches(tstate, PyExc_UnicodeEncodeError)) { + int err; /* repr(o) is not encodable to sys.stdout.encoding with * sys.stdout.errors error handler (which is probably 'strict') */ - PyErr_Clear(); + _PyErr_Clear(tstate); err = sys_displayhook_unencodable(outf, o); - if (err) + if (err) { return NULL; + } } else { return NULL; @@ -721,7 +816,8 @@ sys_exit_impl(PyObject *module, PyObject *status) /*[clinic end generated code: output=13870986c1ab2ec0 input=b86ca9497baa94f2]*/ { /* Raise SystemExit so callers may catch it or clean up. */ - PyErr_SetObject(PyExc_SystemExit, status); + PyThreadState *tstate = _PyThreadState_GET(); + _PyErr_SetObject(tstate, PyExc_SystemExit, status); return NULL; } @@ -750,8 +846,8 @@ static PyObject * sys_getfilesystemencoding_impl(PyObject *module) /*[clinic end generated code: output=1dc4bdbe9be44aa7 input=8475f8649b8c7d8c]*/ { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - const PyConfig *config = &interp->config; + PyInterpreterState *interp = _PyInterpreterState_GET(); + const PyConfig *config = _PyInterpreterState_GetConfig(interp); return PyUnicode_FromWideChar(config->filesystem_encoding, -1); } @@ -765,8 +861,8 @@ static PyObject * sys_getfilesystemencodeerrors_impl(PyObject *module) /*[clinic end generated code: output=ba77b36bbf7c96f5 input=22a1e8365566f1e5]*/ { - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - const PyConfig *config = &interp->config; + PyInterpreterState *interp = _PyInterpreterState_GET(); + const PyConfig *config = _PyInterpreterState_GetConfig(interp); return PyUnicode_FromWideChar(config->filesystem_errors, -1); } @@ -787,14 +883,15 @@ static PyObject * sys_intern_impl(PyObject *module, PyObject *s) /*[clinic end generated code: output=be680c24f5c9e5d6 input=849483c006924e2f]*/ { + PyThreadState *tstate = _PyThreadState_GET(); if (PyUnicode_CheckExact(s)) { Py_INCREF(s); PyUnicode_InternInPlace(&s); return s; } else { - PyErr_Format(PyExc_TypeError, - "can't intern %.400s", s->ob_type->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "can't intern %.400s", Py_TYPE(s)->tp_name); return NULL; } } @@ -829,22 +926,20 @@ trace_init(void) static PyObject * -call_trampoline(PyObject* callback, +call_trampoline(PyThreadState *tstate, PyObject* callback, PyFrameObject *frame, int what, PyObject *arg) { - PyObject *result; - PyObject *stack[3]; - if (PyFrame_FastToLocalsWithError(frame) < 0) { return NULL; } + PyObject *stack[3]; stack[0] = (PyObject *)frame; stack[1] = whatstrings[what]; stack[2] = (arg != NULL) ? arg : Py_None; /* call the Python-level function */ - result = _PyObject_FastCall(callback, stack, 3); + PyObject *result = _PyObject_FastCallTstate(tstate, callback, stack, 3); PyFrame_LocalsToFast(frame, 1); if (result == NULL) { @@ -858,15 +953,17 @@ static int profile_trampoline(PyObject *self, PyFrameObject *frame, int what, PyObject *arg) { - PyObject *result; - - if (arg == NULL) + if (arg == NULL) { arg = Py_None; - result = call_trampoline(self, frame, what, arg); + } + + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *result = call_trampoline(tstate, self, frame, what, arg); if (result == NULL) { - PyEval_SetProfile(NULL, NULL); + _PyEval_SetProfile(tstate, NULL, NULL); return -1; } + Py_DECREF(result); return 0; } @@ -876,20 +973,24 @@ trace_trampoline(PyObject *self, PyFrameObject *frame, int what, PyObject *arg) { PyObject *callback; - PyObject *result; - - if (what == PyTrace_CALL) + if (what == PyTrace_CALL) { callback = self; - else + } + else { callback = frame->f_trace; - if (callback == NULL) + } + if (callback == NULL) { return 0; - result = call_trampoline(callback, frame, what, arg); + } + + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *result = call_trampoline(tstate, callback, frame, what, arg); if (result == NULL) { - PyEval_SetTrace(NULL, NULL); + _PyEval_SetTrace(tstate, NULL, NULL); Py_CLEAR(frame->f_trace); return -1; } + if (result != Py_None) { Py_XSETREF(frame->f_trace, result); } @@ -902,12 +1003,21 @@ trace_trampoline(PyObject *self, PyFrameObject *frame, static PyObject * sys_settrace(PyObject *self, PyObject *args) { - if (trace_init() == -1) + if (trace_init() == -1) { return NULL; - if (args == Py_None) - PyEval_SetTrace(NULL, NULL); - else - PyEval_SetTrace(trace_trampoline, args); + } + + PyThreadState *tstate = _PyThreadState_GET(); + if (args == Py_None) { + if (_PyEval_SetTrace(tstate, NULL, NULL) < 0) { + return NULL; + } + } + else { + if (_PyEval_SetTrace(tstate, trace_trampoline, args) < 0) { + return NULL; + } + } Py_RETURN_NONE; } @@ -942,12 +1052,21 @@ sys_gettrace_impl(PyObject *module) static PyObject * sys_setprofile(PyObject *self, PyObject *args) { - if (trace_init() == -1) + if (trace_init() == -1) { return NULL; - if (args == Py_None) - PyEval_SetProfile(NULL, NULL); - else - PyEval_SetProfile(profile_trampoline, args); + } + + PyThreadState *tstate = _PyThreadState_GET(); + if (args == Py_None) { + if (_PyEval_SetProfile(tstate, NULL, NULL) < 0) { + return NULL; + } + } + else { + if (_PyEval_SetProfile(tstate, profile_trampoline, args) < 0) { + return NULL; + } + } Py_RETURN_NONE; } @@ -979,53 +1098,6 @@ sys_getprofile_impl(PyObject *module) return temp; } -/*[clinic input] -sys.setcheckinterval - - n: int - / - -Set the async event check interval to n instructions. - -This tells the Python interpreter to check for asynchronous events -every n instructions. - -This also affects how often thread switches occur. -[clinic start generated code]*/ - -static PyObject * -sys_setcheckinterval_impl(PyObject *module, int n) -/*[clinic end generated code: output=3f686cef07e6e178 input=7a35b17bf22a6227]*/ -{ - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "sys.getcheckinterval() and sys.setcheckinterval() " - "are deprecated. Use sys.setswitchinterval() " - "instead.", 1) < 0) - return NULL; - - PyInterpreterState *interp = _PyInterpreterState_Get(); - interp->check_interval = n; - Py_RETURN_NONE; -} - -/*[clinic input] -sys.getcheckinterval - -Return the current check interval; see sys.setcheckinterval(). -[clinic start generated code]*/ - -static PyObject * -sys_getcheckinterval_impl(PyObject *module) -/*[clinic end generated code: output=1b5060bf2b23a47c input=4b6589cbcca1db4e]*/ -{ - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "sys.getcheckinterval() and sys.setcheckinterval() " - "are deprecated. Use sys.getswitchinterval() " - "instead.", 1) < 0) - return NULL; - PyInterpreterState *interp = _PyInterpreterState_Get(); - return PyLong_FromLong(interp->check_interval); -} /*[clinic input] sys.setswitchinterval @@ -1047,9 +1119,10 @@ static PyObject * sys_setswitchinterval_impl(PyObject *module, double interval) /*[clinic end generated code: output=65a19629e5153983 input=561b477134df91d9]*/ { + PyThreadState *tstate = _PyThreadState_GET(); if (interval <= 0.0) { - PyErr_SetString(PyExc_ValueError, - "switch interval must be strictly positive"); + _PyErr_SetString(tstate, PyExc_ValueError, + "switch interval must be strictly positive"); return NULL; } _PyEval_SetSwitchInterval((unsigned long) (1e6 * interval)); @@ -1088,11 +1161,11 @@ sys_setrecursionlimit_impl(PyObject *module, int new_limit) /*[clinic end generated code: output=35e1c64754800ace input=b0f7a23393924af3]*/ { int mark; - PyThreadState *tstate; + PyThreadState *tstate = _PyThreadState_GET(); if (new_limit < 1) { - PyErr_SetString(PyExc_ValueError, - "recursion limit must be greater or equal than 1"); + _PyErr_SetString(tstate, PyExc_ValueError, + "recursion limit must be greater or equal than 1"); return NULL; } @@ -1106,12 +1179,11 @@ sys_setrecursionlimit_impl(PyObject *module, int new_limit) the new low-water mark. Otherwise it may not be possible anymore to reset the overflowed flag to 0. */ mark = _Py_RecursionLimitLowerWaterMark(new_limit); - tstate = _PyThreadState_GET(); if (tstate->recursion_depth >= mark) { - PyErr_Format(PyExc_RecursionError, - "cannot set the recursion limit to %i at " - "the recursion depth %i: the limit is too low", - new_limit, tstate->recursion_depth); + _PyErr_Format(tstate, PyExc_RecursionError, + "cannot set the recursion limit to %i at " + "the recursion depth %i: the limit is too low", + new_limit, tstate->recursion_depth); return NULL; } @@ -1136,11 +1208,12 @@ static PyObject * sys_set_coroutine_origin_tracking_depth_impl(PyObject *module, int depth) /*[clinic end generated code: output=0a2123c1cc6759c5 input=a1d0a05f89d2c426]*/ { + PyThreadState *tstate = _PyThreadState_GET(); if (depth < 0) { - PyErr_SetString(PyExc_ValueError, "depth must be >= 0"); + _PyErr_SetString(tstate, PyExc_ValueError, "depth must be >= 0"); return NULL; } - _PyEval_SetCoroutineOriginTrackingDepth(depth); + _PyEval_SetCoroutineOriginTrackingDepth(tstate, depth); Py_RETURN_NONE; } @@ -1178,57 +1251,13 @@ static PyStructSequence_Desc asyncgen_hooks_desc = { 2 }; -static int -set_async_gen_firstiter(PyObject *firstiter) -{ - PyThreadState *tstate = _PyThreadState_GET(); - - if (PySys_Audit("sys.set_asyncgen_hook_firstiter", NULL) < 0) { - return -1; - } - - Py_XINCREF(firstiter); - Py_XSETREF(tstate->async_gen_firstiter, firstiter); - return 0; -} - -void -_PyEval_SetAsyncGenFirstiter(PyObject *firstiter) -{ - if (set_async_gen_firstiter(firstiter) < 0) { - PyErr_WriteUnraisable(NULL); - } -} - -static int -set_async_gen_finalizer(PyObject *finalizer) -{ - PyThreadState *tstate = _PyThreadState_GET(); - - if (PySys_Audit("sys.set_asyncgen_hook_finalizer", NULL) < 0) { - return -1; - } - - Py_XINCREF(finalizer); - Py_XSETREF(tstate->async_gen_finalizer, finalizer); - return 0; -} - -void -_PyEval_SetAsyncGenFinalizer(PyObject *finalizer) -{ - if (set_async_gen_finalizer(finalizer) < 0) { - PyErr_WriteUnraisable(NULL); - } -} - - static PyObject * sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw) { static char *keywords[] = {"firstiter", "finalizer", NULL}; PyObject *firstiter = NULL; PyObject *finalizer = NULL; + PyThreadState *tstate = _PyThreadState_GET(); if (!PyArg_ParseTupleAndKeywords( args, kw, "|OO", keywords, @@ -1238,31 +1267,31 @@ sys_set_asyncgen_hooks(PyObject *self, PyObject *args, PyObject *kw) if (finalizer && finalizer != Py_None) { if (!PyCallable_Check(finalizer)) { - PyErr_Format(PyExc_TypeError, - "callable finalizer expected, got %.50s", - Py_TYPE(finalizer)->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "callable finalizer expected, got %.50s", + Py_TYPE(finalizer)->tp_name); return NULL; } - if (set_async_gen_finalizer(finalizer) < 0) { + if (_PyEval_SetAsyncGenFinalizer(finalizer) < 0) { return NULL; } } - else if (finalizer == Py_None && set_async_gen_finalizer(NULL) < 0) { + else if (finalizer == Py_None && _PyEval_SetAsyncGenFinalizer(NULL) < 0) { return NULL; } if (firstiter && firstiter != Py_None) { if (!PyCallable_Check(firstiter)) { - PyErr_Format(PyExc_TypeError, - "callable firstiter expected, got %.50s", - Py_TYPE(firstiter)->tp_name); + _PyErr_Format(tstate, PyExc_TypeError, + "callable firstiter expected, got %.50s", + Py_TYPE(firstiter)->tp_name); return NULL; } - if (set_async_gen_firstiter(firstiter) < 0) { + if (_PyEval_SetAsyncGenFirstiter(firstiter) < 0) { return NULL; } } - else if (firstiter == Py_None && set_async_gen_firstiter(NULL) < 0) { + else if (firstiter == Py_None && _PyEval_SetAsyncGenFirstiter(NULL) < 0) { return NULL; } @@ -1345,7 +1374,7 @@ static PyStructSequence_Desc hash_info_desc = { }; static PyObject * -get_hash_info(void) +get_hash_info(PyThreadState *tstate) { PyObject *hash_info; int field = 0; @@ -1372,7 +1401,7 @@ get_hash_info(void) PyLong_FromLong(hashfunc->seed_bits)); PyStructSequence_SET_ITEM(hash_info, field++, PyLong_FromLong(Py_HASH_CUTOFF)); - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { Py_CLEAR(hash_info); return NULL; } @@ -1456,6 +1485,7 @@ sys_getwindowsversion_impl(PyObject *module) wchar_t kernel32_path[MAX_PATH]; LPVOID verblock; DWORD verblock_size; + PyThreadState *tstate = _PyThreadState_GET(); ver.dwOSVersionInfoSize = sizeof(ver); if (!GetVersionExW((OSVERSIONINFOW*) &ver)) @@ -1506,7 +1536,7 @@ sys_getwindowsversion_impl(PyObject *module) realBuild )); - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { Py_DECREF(version); return NULL; } @@ -1563,8 +1593,8 @@ static PyObject * sys_setdlopenflags_impl(PyObject *module, int new_val) /*[clinic end generated code: output=ec918b7fe0a37281 input=4c838211e857a77f]*/ { - PyInterpreterState *interp = _PyInterpreterState_Get(); - interp->dlopenflags = new_val; + PyThreadState *tstate = _PyThreadState_GET(); + tstate->interp->dlopenflags = new_val; Py_RETURN_NONE; } @@ -1581,8 +1611,8 @@ static PyObject * sys_getdlopenflags_impl(PyObject *module) /*[clinic end generated code: output=e92cd1bc5005da6e input=dc4ea0899c53b4b6]*/ { - PyInterpreterState *interp = _PyInterpreterState_Get(); - return PyLong_FromLong(interp->dlopenflags); + PyThreadState *tstate = _PyThreadState_GET(); + return PyLong_FromLong(tstate->interp->dlopenflags); } #endif /* HAVE_DLOPEN */ @@ -1614,17 +1644,20 @@ _PySys_GetSizeOf(PyObject *o) PyObject *res = NULL; PyObject *method; Py_ssize_t size; + PyThreadState *tstate = _PyThreadState_GET(); /* Make sure the type is initialized. float gets initialized late */ - if (PyType_Ready(Py_TYPE(o)) < 0) + if (PyType_Ready(Py_TYPE(o)) < 0) { return (size_t)-1; + } method = _PyObject_LookupSpecial(o, &PyId___sizeof__); if (method == NULL) { - if (!PyErr_Occurred()) - PyErr_Format(PyExc_TypeError, - "Type %.100s doesn't define __sizeof__", - Py_TYPE(o)->tp_name); + if (!_PyErr_Occurred(tstate)) { + _PyErr_Format(tstate, PyExc_TypeError, + "Type %.100s doesn't define __sizeof__", + Py_TYPE(o)->tp_name); + } } else { res = _PyObject_CallNoArg(method); @@ -1636,16 +1669,17 @@ _PySys_GetSizeOf(PyObject *o) size = PyLong_AsSsize_t(res); Py_DECREF(res); - if (size == -1 && PyErr_Occurred()) + if (size == -1 && _PyErr_Occurred(tstate)) return (size_t)-1; if (size < 0) { - PyErr_SetString(PyExc_ValueError, "__sizeof__() should return >= 0"); + _PyErr_SetString(tstate, PyExc_ValueError, + "__sizeof__() should return >= 0"); return (size_t)-1; } /* add gc_head size */ - if (PyObject_IS_GC(o)) + if (_PyObject_IS_GC(o)) return ((size_t)size) + sizeof(PyGC_Head); return (size_t)size; } @@ -1656,17 +1690,19 @@ sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds) static char *kwlist[] = {"object", "default", 0}; size_t size; PyObject *o, *dflt = NULL; + PyThreadState *tstate = _PyThreadState_GET(); if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof", - kwlist, &o, &dflt)) + kwlist, &o, &dflt)) { return NULL; + } size = _PySys_GetSizeOf(o); - if (size == (size_t)-1 && PyErr_Occurred()) { + if (size == (size_t)-1 && _PyErr_Occurred(tstate)) { /* Has a default value been given */ - if (dflt != NULL && PyErr_ExceptionMatches(PyExc_TypeError)) { - PyErr_Clear(); + if (dflt != NULL && _PyErr_ExceptionMatches(tstate, PyExc_TypeError)) { + _PyErr_Clear(tstate); Py_INCREF(dflt); return dflt; } @@ -1699,7 +1735,7 @@ static Py_ssize_t sys_getrefcount_impl(PyObject *module, PyObject *object) /*[clinic end generated code: output=5fd477f2264b85b2 input=bf474efd50a21535]*/ { - return object->ob_refcnt; + return Py_REFCNT(object); } #ifdef Py_REF_DEBUG @@ -1728,20 +1764,6 @@ sys_getallocatedblocks_impl(PyObject *module) return _Py_GetAllocatedBlocks(); } -#ifdef COUNT_ALLOCS -/*[clinic input] -sys.getcounts -[clinic start generated code]*/ - -static PyObject * -sys_getcounts_impl(PyObject *module) -/*[clinic end generated code: output=20df00bc164f43cb input=ad2ec7bda5424953]*/ -{ - extern PyObject *_Py_get_counts(void); - - return _Py_get_counts(); -} -#endif /*[clinic input] sys._getframe @@ -1764,22 +1786,25 @@ static PyObject * sys__getframe_impl(PyObject *module, int depth) /*[clinic end generated code: output=d438776c04d59804 input=c1be8a6464b11ee5]*/ { - PyFrameObject *f = _PyThreadState_GET()->frame; + PyThreadState *tstate = _PyThreadState_GET(); + PyFrameObject *f = PyThreadState_GetFrame(tstate); - if (PySys_Audit("sys._getframe", "O", f) < 0) { + if (_PySys_Audit(tstate, "sys._getframe", "O", f) < 0) { + Py_DECREF(f); return NULL; } while (depth > 0 && f != NULL) { - f = f->f_back; + PyFrameObject *back = PyFrame_GetBack(f); + Py_DECREF(f); + f = back; --depth; } if (f == NULL) { - PyErr_SetString(PyExc_ValueError, - "call stack is not deep enough"); + _PyErr_SetString(tstate, PyExc_ValueError, + "call stack is not deep enough"); return NULL; } - Py_INCREF(f); return (PyObject*)f; } @@ -1819,44 +1844,6 @@ sys_call_tracing_impl(PyObject *module, PyObject *func, PyObject *funcargs) return _PyEval_CallTracing(func, funcargs); } -/*[clinic input] -sys.callstats - -Return a tuple of function call statistics. - -A tuple is returned only if CALL_PROFILE was defined when Python was -built. Otherwise, this returns None. - -When enabled, this function returns detailed, implementation-specific -details about the number of function calls executed. The return value -is a 11-tuple where the entries in the tuple are counts of: -0. all function calls -1. calls to PyFunction_Type objects -2. PyFunction calls that do not create an argument tuple -3. PyFunction calls that do not create an argument tuple - and bypass PyEval_EvalCodeEx() -4. PyMethod calls -5. PyMethod calls on bound methods -6. PyType calls -7. PyCFunction calls -8. generator calls -9. All other calls -10. Number of stack pops performed by call_function() -[clinic start generated code]*/ - -static PyObject * -sys_callstats_impl(PyObject *module) -/*[clinic end generated code: output=edc4a74957fa8def input=d447d8d224d5d175]*/ -{ - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "sys.callstats() has been deprecated in Python 3.7 " - "and will be removed in the future", 1) < 0) { - return NULL; - } - - Py_RETURN_NONE; -} - #ifdef __cplusplus extern "C" { @@ -1950,7 +1937,6 @@ static PyMethodDef sys_methods[] = { {"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 SYS__CLEAR_TYPE_CACHE_METHODDEF SYS__CURRENT_FRAMES_METHODDEF SYS_DISPLAYHOOK_METHODDEF @@ -1960,7 +1946,6 @@ static PyMethodDef sys_methods[] = { SYS_GETDEFAULTENCODING_METHODDEF SYS_GETDLOPENFLAGS_METHODDEF SYS_GETALLOCATEDBLOCKS_METHODDEF - SYS_GETCOUNTS_METHODDEF #ifdef DYNAMIC_EXECUTION_PROFILE {"getdxp", _Py_GetDXProfile, METH_VARARGS}, #endif @@ -1980,8 +1965,6 @@ static PyMethodDef sys_methods[] = { SYS_INTERN_METHODDEF SYS_IS_FINALIZING_METHODDEF SYS_MDEBUG_METHODDEF - SYS_SETCHECKINTERVAL_METHODDEF - SYS_GETCHECKINTERVAL_METHODDEF SYS_SETSWITCHINTERVAL_METHODDEF SYS_GETSWITCHINTERVAL_METHODDEF SYS_SETDLOPENFLAGS_METHODDEF @@ -2156,9 +2139,9 @@ _PySys_ReadPreinitXOptions(PyConfig *config) static PyObject * -get_warnoptions(void) +get_warnoptions(PyThreadState *tstate) { - PyObject *warnoptions = _PySys_GetObjectId(&PyId_warnoptions); + PyObject *warnoptions = sys_get_object_id(tstate, &PyId_warnoptions); if (warnoptions == NULL || !PyList_Check(warnoptions)) { /* PEP432 TODO: we can reach this if warnoptions is NULL in the main * interpreter config. When that happens, we need to properly set @@ -2171,9 +2154,10 @@ get_warnoptions(void) * reachable again. */ warnoptions = PyList_New(0); - if (warnoptions == NULL) + if (warnoptions == NULL) { return NULL; - if (_PySys_SetObjectId(&PyId_warnoptions, warnoptions)) { + } + if (sys_set_object_id(tstate, &PyId_warnoptions, warnoptions)) { Py_DECREF(warnoptions); return NULL; } @@ -2191,16 +2175,16 @@ PySys_ResetWarnOptions(void) return; } - PyObject *warnoptions = _PySys_GetObjectId(&PyId_warnoptions); + PyObject *warnoptions = sys_get_object_id(tstate, &PyId_warnoptions); if (warnoptions == NULL || !PyList_Check(warnoptions)) return; PyList_SetSlice(warnoptions, 0, PyList_GET_SIZE(warnoptions), NULL); } static int -_PySys_AddWarnOptionWithError(PyObject *option) +_PySys_AddWarnOptionWithError(PyThreadState *tstate, PyObject *option) { - PyObject *warnoptions = get_warnoptions(); + PyObject *warnoptions = get_warnoptions(tstate); if (warnoptions == NULL) { return -1; } @@ -2213,10 +2197,11 @@ _PySys_AddWarnOptionWithError(PyObject *option) void PySys_AddWarnOptionUnicode(PyObject *option) { - if (_PySys_AddWarnOptionWithError(option) < 0) { + PyThreadState *tstate = _PyThreadState_GET(); + if (_PySys_AddWarnOptionWithError(tstate, option) < 0) { /* No return value, therefore clear error state if possible */ - if (_PyThreadState_UncheckedGet()) { - PyErr_Clear(); + if (tstate) { + _PyErr_Clear(tstate); } } } @@ -2240,15 +2225,16 @@ PySys_AddWarnOption(const wchar_t *s) int PySys_HasWarnOptions(void) { - PyObject *warnoptions = _PySys_GetObjectId(&PyId_warnoptions); + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *warnoptions = sys_get_object_id(tstate, &PyId_warnoptions); return (warnoptions != NULL && PyList_Check(warnoptions) && PyList_GET_SIZE(warnoptions) > 0); } static PyObject * -get_xoptions(void) +get_xoptions(PyThreadState *tstate) { - PyObject *xoptions = _PySys_GetObjectId(&PyId__xoptions); + PyObject *xoptions = sys_get_object_id(tstate, &PyId__xoptions); if (xoptions == NULL || !PyDict_Check(xoptions)) { /* PEP432 TODO: we can reach this if xoptions is NULL in the main * interpreter config. When that happens, we need to properly set @@ -2261,9 +2247,10 @@ get_xoptions(void) * reachable again. */ xoptions = PyDict_New(); - if (xoptions == NULL) + if (xoptions == NULL) { return NULL; - if (_PySys_SetObjectId(&PyId__xoptions, xoptions)) { + } + if (sys_set_object_id(tstate, &PyId__xoptions, xoptions)) { Py_DECREF(xoptions); return NULL; } @@ -2277,7 +2264,8 @@ _PySys_AddXOptionWithError(const wchar_t *s) { PyObject *name = NULL, *value = NULL; - PyObject *opts = get_xoptions(); + PyThreadState *tstate = _PyThreadState_GET(); + PyObject *opts = get_xoptions(tstate); if (opts == NULL) { goto error; } @@ -2318,14 +2306,15 @@ PySys_AddXOption(const wchar_t *s) } if (_PySys_AddXOptionWithError(s) < 0) { /* No return value, therefore clear error state if possible */ - PyErr_Clear(); + _PyErr_Clear(tstate); } } PyObject * PySys_GetXOptions(void) { - return get_xoptions(); + PyThreadState *tstate = _PyThreadState_GET(); + return get_xoptions(tstate); } /* XXX This doc string is too long to be a single string literal in VC++ 5.0. @@ -2419,7 +2408,6 @@ getrefcount() -- return the reference count for an object (plus one :-)\n\ getrecursionlimit() -- return the max recursion depth for the interpreter\n\ getsizeof() -- return the size of an object in bytes\n\ gettrace() -- get the global debug tracing function\n\ -setcheckinterval() -- control how often the interpreter checks for events\n\ setdlopenflags() -- set the flags to be used for dlopen() calls\n\ setprofile() -- set the global profiling function\n\ setrecursionlimit() -- set the max recursion depth for the interpreter\n\ @@ -2465,17 +2453,18 @@ static PyStructSequence_Desc flags_desc = { }; static PyObject* -make_flags(_PyRuntimeState *runtime, PyInterpreterState *interp) +make_flags(PyThreadState *tstate) { - int pos = 0; - PyObject *seq; - const PyPreConfig *preconfig = &runtime->preconfig; - const PyConfig *config = &interp->config; + PyInterpreterState *interp = tstate->interp; + const PyPreConfig *preconfig = &interp->runtime->preconfig; + const PyConfig *config = _PyInterpreterState_GetConfig(interp); - seq = PyStructSequence_New(&FlagsType); - if (seq == NULL) + PyObject *seq = PyStructSequence_New(&FlagsType); + if (seq == NULL) { return NULL; + } + int pos = 0; #define SetFlag(flag) \ PyStructSequence_SET_ITEM(seq, pos++, PyLong_FromLong(flag)) @@ -2498,7 +2487,7 @@ make_flags(_PyRuntimeState *runtime, PyInterpreterState *interp) SetFlag(preconfig->utf8_mode); #undef SetFlag - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { Py_DECREF(seq); return NULL; } @@ -2529,7 +2518,7 @@ static PyStructSequence_Desc version_info_desc = { }; static PyObject * -make_version_info(void) +make_version_info(PyThreadState *tstate) { PyObject *version_info; char *s; @@ -2567,7 +2556,7 @@ make_version_info(void) #undef SetIntItem #undef SetStrItem - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { Py_CLEAR(version_info); return NULL; } @@ -2685,8 +2674,7 @@ static struct PyModuleDef sysmodule = { } while (0) static PyStatus -_PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, - PyObject *sysdict) +_PySys_InitCore(PyThreadState *tstate, PyObject *sysdict) { PyObject *version_info; int res; @@ -2730,7 +2718,7 @@ _PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, } } SET_SYS_FROM_STRING("hash_info", - get_hash_info()); + get_hash_info(tstate)); SET_SYS_FROM_STRING("maxunicode", PyLong_FromLong(0x10FFFF)); SET_SYS_FROM_STRING("builtin_module_names", @@ -2761,14 +2749,15 @@ _PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, goto type_init_failed; } } - version_info = make_version_info(); + version_info = make_version_info(tstate); SET_SYS_FROM_STRING("version_info", version_info); /* prevent user from creating new instances */ VersionInfoType.tp_init = NULL; VersionInfoType.tp_new = NULL; res = PyDict_DelItemString(VersionInfoType.tp_dict, "__new__"); - if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError)) - PyErr_Clear(); + if (res < 0 && _PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { + _PyErr_Clear(tstate); + } /* implementation */ SET_SYS_FROM_STRING("implementation", make_impl_info(version_info)); @@ -2780,7 +2769,7 @@ _PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, } } /* Set flags to their default values (updated by _PySys_InitMain()) */ - SET_SYS_FROM_STRING("flags", make_flags(runtime, interp)); + SET_SYS_FROM_STRING("flags", make_flags(tstate)); #if defined(MS_WINDOWS) /* getwindowsversion */ @@ -2792,10 +2781,10 @@ _PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, /* prevent user from creating new instances */ WindowsVersionType.tp_init = NULL; WindowsVersionType.tp_new = NULL; - assert(!PyErr_Occurred()); + assert(!_PyErr_Occurred(tstate)); res = PyDict_DelItemString(WindowsVersionType.tp_dict, "__new__"); - if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError)) { - PyErr_Clear(); + if (res < 0 && _PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { + _PyErr_Clear(tstate); } #endif @@ -2818,7 +2807,7 @@ _PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, } } - if (PyErr_Occurred()) { + if (_PyErr_Occurred(tstate)) { goto err_occurred; } return _PyStatus_OK(); @@ -2830,8 +2819,6 @@ _PySys_InitCore(_PyRuntimeState *runtime, PyInterpreterState *interp, return _PyStatus_ERR("can't initialize sys module"); } -#undef SET_SYS_FROM_STRING - /* Updating the sys namespace, returning integer error codes */ #define SET_SYS_FROM_STRING_INT_RESULT(key, value) \ do { \ @@ -2901,10 +2888,10 @@ sys_create_xoptions_dict(const PyConfig *config) int -_PySys_InitMain(_PyRuntimeState *runtime, PyInterpreterState *interp) +_PySys_InitMain(PyThreadState *tstate) { - PyObject *sysdict = interp->sysdict; - const PyConfig *config = &interp->config; + PyObject *sysdict = tstate->interp->sysdict; + const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp); int res; #define COPY_LIST(KEY, VALUE) \ @@ -2935,6 +2922,7 @@ _PySys_InitMain(_PyRuntimeState *runtime, PyInterpreterState *interp) SET_SYS_FROM_WSTR("base_prefix", config->base_prefix); SET_SYS_FROM_WSTR("exec_prefix", config->exec_prefix); SET_SYS_FROM_WSTR("base_exec_prefix", config->base_exec_prefix); + SET_SYS_FROM_WSTR("platlibdir", config->platlibdir); if (config->pycache_prefix != NULL) { SET_SYS_FROM_WSTR("pycache_prefix", config->pycache_prefix); @@ -2955,30 +2943,33 @@ _PySys_InitMain(_PyRuntimeState *runtime, PyInterpreterState *interp) #undef COPY_LIST #undef SET_SYS_FROM_WSTR + /* Set flags to their final values */ - SET_SYS_FROM_STRING_INT_RESULT("flags", make_flags(runtime, interp)); + SET_SYS_FROM_STRING_INT_RESULT("flags", make_flags(tstate)); /* prevent user from creating new instances */ FlagsType.tp_init = NULL; FlagsType.tp_new = NULL; res = PyDict_DelItemString(FlagsType.tp_dict, "__new__"); if (res < 0) { - if (!PyErr_ExceptionMatches(PyExc_KeyError)) { + if (!_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { return res; } - PyErr_Clear(); + _PyErr_Clear(tstate); } SET_SYS_FROM_STRING_INT_RESULT("dont_write_bytecode", PyBool_FromLong(!config->write_bytecode)); - if (get_warnoptions() == NULL) + if (get_warnoptions(tstate) == NULL) { return -1; + } - if (get_xoptions() == NULL) + if (get_xoptions(tstate) == NULL) return -1; - if (PyErr_Occurred()) - return -1; + if (_PyErr_Occurred(tstate)) { + goto err_occurred; + } return 0; @@ -2986,6 +2977,7 @@ _PySys_InitMain(_PyRuntimeState *runtime, PyInterpreterState *interp) return -1; } +#undef SET_SYS_FROM_STRING #undef SET_SYS_FROM_STRING_BORROW #undef SET_SYS_FROM_STRING_INT_RESULT @@ -2994,7 +2986,7 @@ _PySys_InitMain(_PyRuntimeState *runtime, PyInterpreterState *interp) infrastructure for the io module in place. Use UTF-8/surrogateescape and ignore EAGAIN errors. */ -PyStatus +static PyStatus _PySys_SetPreliminaryStderr(PyObject *sysdict) { PyObject *pstderr = PyFile_NewStdPrinter(fileno(stderr)); @@ -3019,12 +3011,15 @@ _PySys_SetPreliminaryStderr(PyObject *sysdict) /* Create sys module without all attributes: _PySys_InitMain() should be called later to add remaining attributes. */ PyStatus -_PySys_Create(_PyRuntimeState *runtime, PyInterpreterState *interp, - PyObject **sysmod_p) +_PySys_Create(PyThreadState *tstate, PyObject **sysmod_p) { + assert(!_PyErr_Occurred(tstate)); + + PyInterpreterState *interp = tstate->interp; + PyObject *modules = PyDict_New(); if (modules == NULL) { - return _PyStatus_ERR("can't make modules dictionary"); + goto error; } interp->modules = modules; @@ -3035,13 +3030,13 @@ _PySys_Create(_PyRuntimeState *runtime, PyInterpreterState *interp, PyObject *sysdict = PyModule_GetDict(sysmod); if (sysdict == NULL) { - return _PyStatus_ERR("can't initialize sys dict"); + goto error; } Py_INCREF(sysdict); interp->sysdict = sysdict; if (PyDict_SetItemString(sysdict, "modules", interp->modules) < 0) { - return _PyStatus_ERR("can't initialize sys module"); + goto error; } PyStatus status = _PySys_SetPreliminaryStderr(sysdict); @@ -3049,15 +3044,22 @@ _PySys_Create(_PyRuntimeState *runtime, PyInterpreterState *interp, return status; } - status = _PySys_InitCore(runtime, interp, sysdict); + status = _PySys_InitCore(tstate, sysdict); if (_PyStatus_EXCEPTION(status)) { return status; } - _PyImport_FixupBuiltin(sysmod, "sys", interp->modules); + if (_PyImport_FixupBuiltin(sysmod, "sys", interp->modules) < 0) { + goto error; + } + + assert(!_PyErr_Occurred(tstate)); *sysmod_p = sysmod; return _PyStatus_OK(); + +error: + return _PyStatus_ERR("can't initialize sys module"); } @@ -3100,8 +3102,10 @@ PySys_SetPath(const wchar_t *path) PyObject *v; if ((v = makepathobject(path, DELIM)) == NULL) Py_FatalError("can't create sys.path"); - if (_PySys_SetObjectId(&PyId_path, v) != 0) + PyThreadState *tstate = _PyThreadState_GET(); + if (sys_set_object_id(tstate, &PyId_path, v) != 0) { Py_FatalError("can't assign sys.path"); + } Py_DECREF(v); } @@ -3128,6 +3132,7 @@ void PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) { wchar_t* empty_argv[1] = {L""}; + PyThreadState *tstate = _PyThreadState_GET(); if (argc < 1 || argv == NULL) { /* Ensure at least one (empty) argument is seen */ @@ -3139,7 +3144,7 @@ PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) if (av == NULL) { Py_FatalError("no mem for sys.argv"); } - if (PySys_SetObject("argv", av) != 0) { + if (sys_set_object(tstate, "argv", av) != 0) { Py_DECREF(av); Py_FatalError("can't assign sys.argv"); } @@ -3155,7 +3160,7 @@ PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath) Py_FatalError("can't compute path0 from argv"); } - PyObject *sys_path = _PySys_GetObjectId(&PyId_path); + PyObject *sys_path = sys_get_object_id(tstate, &PyId_path); if (sys_path != NULL) { if (PyList_Insert(sys_path, 0, path0) < 0) { Py_DECREF(path0); @@ -3179,30 +3184,15 @@ PySys_SetArgv(int argc, wchar_t **argv) static int sys_pyfile_write_unicode(PyObject *unicode, PyObject *file) { - PyObject *writer = NULL, *result = NULL; - int err; - if (file == NULL) return -1; - - writer = _PyObject_GetAttrId(file, &PyId_write); - if (writer == NULL) - goto error; - - result = PyObject_CallFunctionObjArgs(writer, unicode, NULL); + assert(unicode != NULL); + PyObject *result = _PyObject_CallMethodIdOneArg(file, &PyId_write, unicode); if (result == NULL) { - goto error; - } else { - err = 0; - goto finally; + return -1; } - -error: - err = -1; -finally: - Py_XDECREF(writer); - Py_XDECREF(result); - return err; + Py_DECREF(result); + return 0; } static int @@ -3258,12 +3248,13 @@ sys_write(_Py_Identifier *key, FILE *fp, const char *format, va_list va) PyObject *error_type, *error_value, *error_traceback; char buffer[1001]; int written; + PyThreadState *tstate = _PyThreadState_GET(); - PyErr_Fetch(&error_type, &error_value, &error_traceback); - file = _PySys_GetObjectId(key); + _PyErr_Fetch(tstate, &error_type, &error_value, &error_traceback); + file = sys_get_object_id(tstate, key); written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va); if (sys_pyfile_write(buffer, file) != 0) { - PyErr_Clear(); + _PyErr_Clear(tstate); fputs(buffer, fp); } if (written < 0 || (size_t)written >= sizeof(buffer)) { @@ -3271,7 +3262,7 @@ sys_write(_Py_Identifier *key, FILE *fp, const char *format, va_list va) if (sys_pyfile_write(truncated, file) != 0) fputs(truncated, fp); } - PyErr_Restore(error_type, error_value, error_traceback); + _PyErr_Restore(tstate, error_type, error_value, error_traceback); } void @@ -3300,20 +3291,21 @@ sys_format(_Py_Identifier *key, FILE *fp, const char *format, va_list va) PyObject *file, *message; PyObject *error_type, *error_value, *error_traceback; const char *utf8; + PyThreadState *tstate = _PyThreadState_GET(); - PyErr_Fetch(&error_type, &error_value, &error_traceback); - file = _PySys_GetObjectId(key); + _PyErr_Fetch(tstate, &error_type, &error_value, &error_traceback); + file = sys_get_object_id(tstate, key); message = PyUnicode_FromFormatV(format, va); if (message != NULL) { if (sys_pyfile_write_unicode(message, file) != 0) { - PyErr_Clear(); + _PyErr_Clear(tstate); utf8 = PyUnicode_AsUTF8(message); if (utf8 != NULL) fputs(utf8, fp); } Py_DECREF(message); } - PyErr_Restore(error_type, error_value, error_traceback); + _PyErr_Restore(tstate, error_type, error_value, error_traceback); } void diff --git a/Python/thread.c b/Python/thread.c index c36ce6ff9835d869d94c9e8f3c9057d101a4b881..a10f5728dc0ceb8cc560cf830851da862c680679 100644 --- a/Python/thread.c +++ b/Python/thread.c @@ -6,7 +6,7 @@ Stuff shared by all thread_*.h files is collected here. */ #include "Python.h" -#include "pycore_pystate.h" +#include "pycore_pystate.h" // _PyInterpreterState_GET() #ifndef _POSIX_THREADS /* This means pthreads are not implemented in libc headers, hence the macro @@ -23,8 +23,6 @@ #include -#include "pythread.h" - #ifndef _POSIX_THREADS /* Check if we're running on HP-UX and _SC_THREADS is defined. If so, then @@ -92,7 +90,7 @@ PyThread_init_thread(void) size_t PyThread_get_stacksize(void) { - return _PyInterpreterState_Get()->pythread_stacksize; + return _PyInterpreterState_GET()->pythread_stacksize; } /* Only platforms defining a THREAD_SET_STACKSIZE() macro diff --git a/Python/thread_nt.h b/Python/thread_nt.h index 23d585cf9fa6c00f3038ef48a83a5b9fac236440..05b982d32dc52602ffc9616b78018e1850d438ba 100644 --- a/Python/thread_nt.h +++ b/Python/thread_nt.h @@ -1,3 +1,4 @@ +#include "pycore_interp.h" // _PyInterpreterState.pythread_stacksize /* This code implemented by Dag.Gruneau@elsa.preseco.comm.se */ /* Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru */ @@ -358,13 +359,13 @@ _pythread_nt_set_stacksize(size_t size) { /* set to default */ if (size == 0) { - _PyInterpreterState_GET_UNSAFE()->pythread_stacksize = 0; + _PyInterpreterState_GET()->pythread_stacksize = 0; return 0; } /* valid range? */ if (size >= THREAD_MIN_STACKSIZE && size < THREAD_MAX_STACKSIZE) { - _PyInterpreterState_GET_UNSAFE()->pythread_stacksize = size; + _PyInterpreterState_GET()->pythread_stacksize = size; return 0; } diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 78b99a77206c9485a04fce70ec205df55a76e702..e6910b3083a892042f6bc656cc69dde37fc0709f 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -1,3 +1,4 @@ +#include "pycore_interp.h" // _PyInterpreterState.pythread_stacksize /* Posix threads interface */ @@ -51,6 +52,16 @@ #undef THREAD_STACK_SIZE #define THREAD_STACK_SIZE 0x200000 #endif +/* bpo-38852: test_threading.test_recursion_limit() checks that 1000 recursive + Python calls (default recursion limit) doesn't crash, but raise a regular + RecursionError exception. In debug mode, Python function calls allocates + more memory on the stack, so use a stack of 8 MiB. */ +#if defined(__ANDROID__) && defined(THREAD_STACK_SIZE) && THREAD_STACK_SIZE == 0 +# ifdef Py_DEBUG +# undef THREAD_STACK_SIZE +# define THREAD_STACK_SIZE 0x800000 +# endif +#endif /* for safety, ensure a viable minimum stacksize */ #define THREAD_STACK_MIN 0x8000 /* 32 KiB */ #else /* !_POSIX_THREAD_ATTR_STACKSIZE */ @@ -97,17 +108,10 @@ #endif -/* We assume all modern POSIX systems have gettimeofday() */ -#ifdef GETTIMEOFDAY_NO_TZ -#define GETTIMEOFDAY(ptv) gettimeofday(ptv) -#else -#define GETTIMEOFDAY(ptv) gettimeofday(ptv, (struct timezone *)NULL) -#endif - #define MICROSECONDS_TO_TIMESPEC(microseconds, ts) \ do { \ struct timeval tv; \ - GETTIMEOFDAY(&tv); \ + gettimeofday(&tv, NULL); \ tv.tv_usec += microseconds % 1000000; \ tv.tv_sec += microseconds / 1000000; \ tv.tv_sec += tv.tv_usec / 1000000; \ @@ -544,9 +548,8 @@ PyThread_allocate_lock(void) if (!initialized) PyThread_init_thread(); - lock = (pthread_lock *) PyMem_RawMalloc(sizeof(pthread_lock)); + lock = (pthread_lock *) PyMem_RawCalloc(1, sizeof(pthread_lock)); if (lock) { - memset((void *)lock, '\0', sizeof(pthread_lock)); lock->locked = 0; status = pthread_mutex_init(&lock->mut, NULL); @@ -691,6 +694,26 @@ PyThread_release_lock(PyThread_type_lock lock) #endif /* USE_SEMAPHORES */ +int +_PyThread_at_fork_reinit(PyThread_type_lock *lock) +{ + PyThread_type_lock new_lock = PyThread_allocate_lock(); + if (new_lock == NULL) { + return -1; + } + + /* bpo-6721, bpo-40089: The old lock can be in an inconsistent state. + fork() can be called in the middle of an operation on the lock done by + another thread. So don't call PyThread_free_lock(*lock). + + Leak memory on purpose. Don't release the memory either since the + address of a mutex is relevant. Putting two mutexes at the same address + can lead to problems. */ + + *lock = new_lock; + return 0; +} + int PyThread_acquire_lock(PyThread_type_lock lock, int waitflag) { @@ -712,7 +735,7 @@ _pythread_pthread_set_stacksize(size_t size) /* set to default */ if (size == 0) { - _PyInterpreterState_GET_UNSAFE()->pythread_stacksize = 0; + _PyInterpreterState_GET()->pythread_stacksize = 0; return 0; } @@ -729,7 +752,7 @@ _pythread_pthread_set_stacksize(size_t size) rc = pthread_attr_setstacksize(&attrs, size); pthread_attr_destroy(&attrs); if (rc == 0) { - _PyInterpreterState_GET_UNSAFE()->pythread_stacksize = size; + _PyInterpreterState_GET()->pythread_stacksize = size; return 0; } } diff --git a/Python/traceback.c b/Python/traceback.c index 8e2f15e85d6b5dc462743677243c7ac80d08403c..5d3a65cc160e04a46161c0caa50179c6ba65f65c 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -2,12 +2,11 @@ /* Traceback implementation */ #include "Python.h" -#include "pycore_pystate.h" #include "code.h" -#include "frameobject.h" -#include "structmember.h" -#include "osdefs.h" +#include "frameobject.h" // PyFrame_GetBack() +#include "structmember.h" // PyMemberDef +#include "osdefs.h" // SEP #ifdef HAVE_FCNTL_H #include #endif @@ -376,7 +375,7 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent) int fd; int i; char *found_encoding; - char *encoding; + const char *encoding; PyObject *io; PyObject *binary; PyObject *fob = NULL; @@ -384,7 +383,7 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent) PyObject *res; char buf[MAXPATHLEN+1]; int kind; - void *data; + const void *data; /* open the file */ if (filename == NULL) @@ -430,7 +429,7 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent) if (fob == NULL) { PyErr_Clear(); - res = _PyObject_CallMethodId(binary, &PyId_close, NULL); + res = _PyObject_CallMethodIdNoArgs(binary, &PyId_close); Py_DECREF(binary); if (res) Py_DECREF(res); @@ -450,7 +449,7 @@ _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent) break; } } - res = _PyObject_CallMethodId(fob, &PyId_close, NULL); + res = _PyObject_CallMethodIdNoArgs(fob, &PyId_close); if (res) Py_DECREF(res); else @@ -561,28 +560,28 @@ tb_printinternal(PyTracebackObject *tb, PyObject *f, long limit) tb = tb->tb_next; } while (tb != NULL && err == 0) { + PyCodeObject *code = PyFrame_GetCode(tb->tb_frame); if (last_file == NULL || - tb->tb_frame->f_code->co_filename != last_file || + code->co_filename != last_file || last_line == -1 || tb->tb_lineno != last_line || - last_name == NULL || tb->tb_frame->f_code->co_name != last_name) { + last_name == NULL || code->co_name != last_name) { if (cnt > TB_RECURSIVE_CUTOFF) { err = tb_print_line_repeated(f, cnt); } - last_file = tb->tb_frame->f_code->co_filename; + last_file = code->co_filename; last_line = tb->tb_lineno; - last_name = tb->tb_frame->f_code->co_name; + last_name = code->co_name; cnt = 0; } cnt++; if (err == 0 && cnt <= TB_RECURSIVE_CUTOFF) { - err = tb_displayline(f, - tb->tb_frame->f_code->co_filename, - tb->tb_lineno, - tb->tb_frame->f_code->co_name); + err = tb_displayline(f, code->co_filename, tb->tb_lineno, + code->co_name); if (err == 0) { err = PyErr_CheckSignals(); } } + Py_DECREF(code); tb = tb->tb_next; } if (err == 0 && cnt > TB_RECURSIVE_CUTOFF) { @@ -623,7 +622,8 @@ PyTraceBack_Print(PyObject *v, PyObject *f) return err; } -/* Reverse a string. For example, "abcd" becomes "dcba". +/* Format an integer in range [0; 0xffffffff] to decimal and write it + into the file fd. This function is signal safe. */ @@ -754,12 +754,9 @@ _Py_DumpASCII(int fd, PyObject *text) static void dump_frame(int fd, PyFrameObject *frame) { - PyCodeObject *code; - int lineno; - - code = frame->f_code; + PyCodeObject *code = PyFrame_GetCode(frame); PUTS(fd, " File "); - if (code != NULL && code->co_filename != NULL + if (code->co_filename != NULL && PyUnicode_Check(code->co_filename)) { PUTS(fd, "\""); @@ -770,7 +767,7 @@ dump_frame(int fd, PyFrameObject *frame) } /* PyFrame_GetLineNumber() was introduced in Python 2.7.0 and 3.2.0 */ - lineno = PyCode_Addr2Line(code, frame->f_lasti); + int lineno = PyCode_Addr2Line(code, frame->f_lasti); PUTS(fd, ", line "); if (lineno >= 0) { _Py_DumpDecimal(fd, (unsigned long)lineno); @@ -780,7 +777,7 @@ dump_frame(int fd, PyFrameObject *frame) } PUTS(fd, " in "); - if (code != NULL && code->co_name != NULL + if (code->co_name != NULL && PyUnicode_Check(code->co_name)) { _Py_DumpASCII(fd, code->co_name); } @@ -789,6 +786,7 @@ dump_frame(int fd, PyFrameObject *frame) } PUTS(fd, "\n"); + Py_DECREF(code); } static void @@ -801,22 +799,31 @@ dump_traceback(int fd, PyThreadState *tstate, int write_header) PUTS(fd, "Stack (most recent call first):\n"); } - frame = _PyThreadState_GetFrame(tstate); + frame = PyThreadState_GetFrame(tstate); if (frame == NULL) { PUTS(fd, "\n"); return; } depth = 0; - while (frame != NULL) { + while (1) { if (MAX_FRAME_DEPTH <= depth) { + Py_DECREF(frame); PUTS(fd, " ...\n"); break; } - if (!PyFrame_Check(frame)) + if (!PyFrame_Check(frame)) { + Py_DECREF(frame); break; + } dump_frame(fd, frame); - frame = frame->f_back; + PyFrameObject *back = PyFrame_GetBack(frame); + Py_DECREF(frame); + + if (back == NULL) { + break; + } + frame = back; depth++; } } diff --git a/README.OpenSource b/README.OpenSource index f4fe7c7f2cf05072a51d2668ee5d7b7313c97b3e..ccdab8bd6d53a7d474a24fe3799ce564426569c2 100644 --- a/README.OpenSource +++ b/README.OpenSource @@ -3,8 +3,8 @@ "Name": "python", "License": "Python Software Foundation License V2", "License File": "LICENSE", - "Version Number": "3.8.5", - "Owner": "wangweichao2@huawei.com", + "Version Number": "3.9.2", + "Owner": "anguanglin@huawei.com", "Upstream URL": "https://www.python.org", "Description": "Python is a programming language that lets you work quickly and integrate systems more effectively." } diff --git a/README.rst b/README.rst index 862a24d5efc03ea2dddca506c88e76039dfc1d61..0a36bc16a958b839444089992eaf0e02cfb0eea7 100644 --- a/README.rst +++ b/README.rst @@ -1,24 +1,28 @@ -This is Python version 3.8.5 +This is Python version 3.9.2 ============================ -.. image:: https://travis-ci.org/python/cpython.svg?branch=3.8 +.. image:: https://travis-ci.org/python/cpython.svg?branch=3.9 :alt: CPython build status on Travis CI - :target: https://travis-ci.org/python/cpython/branches + :target: https://travis-ci.org/python/cpython -.. image:: https://dev.azure.com/python/cpython/_apis/build/status/Azure%20Pipelines%20CI?branchName=3.8 +.. image:: https://github.com/python/cpython/workflows/Tests/badge.svg + :alt: CPython build status on GitHub Actions + :target: https://github.com/python/cpython/actions + +.. image:: https://dev.azure.com/python/cpython/_apis/build/status/Azure%20Pipelines%20CI?branchName=3.9 :alt: CPython build status on Azure DevOps - :target: https://dev.azure.com/python/cpython/_build/latest?definitionId=4&branchName=3.8 + :target: https://dev.azure.com/python/cpython/_build/latest?definitionId=4&branchName=3.9 -.. image:: https://codecov.io/gh/python/cpython/branch/3.8/graph/badge.svg +.. image:: https://codecov.io/gh/python/cpython/branch/3.9/graph/badge.svg :alt: CPython code coverage on Codecov - :target: https://codecov.io/gh/python/cpython/branch/3.8 + :target: https://codecov.io/gh/python/cpython .. image:: https://img.shields.io/badge/zulip-join_chat-brightgreen.svg :alt: Python Zulip chat :target: https://python.zulipchat.com -Copyright (c) 2001-2020 Python Software Foundation. All rights reserved. +Copyright (c) 2001-2021 Python Software Foundation. All rights reserved. See the end of this file for further copyright and license information. @@ -75,10 +79,10 @@ dependencies for various Linux distributions and macOS. On macOS, there are additional configure and build options related to macOS framework and universal builds. Refer to `Mac/README.rst -`_. +`_. On Windows, see `PCbuild/readme.txt -`_. +`_. If you wish, you can create a subdirectory and invoke configure from there. For example:: @@ -137,11 +141,11 @@ What's New ---------- We have a comprehensive overview of the changes in the `What's New in Python -3.8 `_ document. For a more +3.9 `_ document. For a more detailed change log, read `Misc/NEWS -`_, but a full +`_, but a full accounting of changes can only be gleaned from the `commit history -`_. +`_. If you want to install multiple versions of Python, see the section below entitled "Installing multiple versions". @@ -150,7 +154,7 @@ entitled "Installing multiple versions". Documentation ------------- -`Documentation for Python 3.8 `_ is online, +`Documentation for Python 3.9 `_ is online, updated daily. It can also be downloaded in many formats for faster access. The documentation @@ -159,7 +163,7 @@ is primarily for documentation authors, translators, and people with special formatting requirements. For information about building Python's documentation, refer to `Doc/README.rst -`_. +`_. Converting From Python 2.x to 3.x @@ -209,8 +213,8 @@ intend to install multiple versions using the same prefix you must decide which version (if any) is your "primary" version. Install that version using ``make install``. Install all other versions using ``make altinstall``. -For example, if you want to install Python 2.7, 3.6, and 3.8 with 3.8 being the -primary version, you would execute ``make install`` in your 3.8 build directory +For example, if you want to install Python 2.7, 3.6, and 3.9 with 3.9 being the +primary version, you would execute ``make install`` in your 3.9 build directory and ``make altinstall`` in the others. @@ -240,13 +244,13 @@ All current PEPs, as well as guidelines for submitting a new PEP, are listed at Release Schedule ---------------- -See :pep:`569` for Python 3.8 release details. +See :pep:`596` for Python 3.9 release details. Copyright and License Information --------------------------------- -Copyright (c) 2001-2020 Python Software Foundation. All rights reserved. +Copyright (c) 2001-2021 Python Software Foundation. All rights reserved. Copyright (c) 2000 BeOpen.com. All rights reserved. diff --git a/Tools/README b/Tools/README index 6c5fb20818120d5fa74c9bd1ddd47dc5ee4032ea..b6d0b18e5a5c27492a7e5f6de574f16adeb0c0ce 100644 --- a/Tools/README +++ b/Tools/README @@ -23,6 +23,8 @@ msi Support for packaging Python as an MSI package on Windows. parser Un-parsing tool to generate code from an AST. +peg_generator PEG-based parser generator (pegen) used for new parser. + pynche A Tkinter-based color editor. scripts A number of useful single-file programs, e.g. tabnanny.py diff --git a/Tools/buildbot/remoteDeploy.bat b/Tools/buildbot/remoteDeploy.bat index 6b86e1e59b077d4b900d2d5c5662815a20ad427e..31f151921b3f73380ce6c37ea14614d72483ec38 100644 --- a/Tools/buildbot/remoteDeploy.bat +++ b/Tools/buildbot/remoteDeploy.bat @@ -24,11 +24,18 @@ if NOT "%REMOTE_PYTHON_DIR:~-1,1%"=="\" (set REMOTE_PYTHON_DIR=%REMOTE_PYTHON_DI echo PYTHON_SOURCE = %PYTHON_SOURCE% echo REMOTE_PYTHON_DIR = %REMOTE_PYTHON_DIR% +REM stop Python processes and remove existing files if found +ssh %SSH_SERVER% "kill python.exe" +ssh %SSH_SERVER% "kill python_d.exe" ssh %SSH_SERVER% "if EXIST %REMOTE_PYTHON_DIR% (rd %REMOTE_PYTHON_DIR% /s/q)" + +REM Create Python directories ssh %SSH_SERVER% "md %REMOTE_PYTHON_DIR%PCBuild\arm32" ssh %SSH_SERVER% "md %REMOTE_PYTHON_DIR%temp" ssh %SSH_SERVER% "md %REMOTE_PYTHON_DIR%Modules" ssh %SSH_SERVER% "md %REMOTE_PYTHON_DIR%PC" + +REM Copy Python files for /f "USEBACKQ" %%i in (`dir PCbuild\*.bat /b`) do @scp PCBuild\%%i "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PCBuild" for /f "USEBACKQ" %%i in (`dir PCbuild\*.py /b`) do @scp PCBuild\%%i "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PCBuild" for /f "USEBACKQ" %%i in (`dir PCbuild\arm32\*.exe /b`) do @scp PCBuild\arm32\%%i "%SSH_SERVER%:%REMOTE_PYTHON_DIR%PCBuild\arm32" diff --git a/Tools/buildbot/test.bat b/Tools/buildbot/test.bat index a0fc6b9a9458bc81b576999ed5c7549760bc8d32..25c796a60e173d289267aabcb72411e5651ace3c 100644 --- a/Tools/buildbot/test.bat +++ b/Tools/buildbot/test.bat @@ -36,8 +36,10 @@ if NOT "%REMOTE_PYTHON_DIR:~-1,1%"=="\" (set REMOTE_PYTHON_DIR=%REMOTE_PYTHON_DI set TEMP_ARGS=--temp %REMOTE_PYTHON_DIR%temp set rt_args=%rt_opts% %dashU% -rwW --slowest --timeout=1200 --fail-env-changed %regrtest_args% %TEMP_ARGS% -ssh %SSH_SERVER% "set TEMP=%REMOTE_PYTHON_DIR%temp& %REMOTE_PYTHON_DIR%PCbuild\rt.bat" %rt_args% -exit /b %ERRORLEVEL% +ssh %SSH_SERVER% "set TEMP=%REMOTE_PYTHON_DIR%temp& cd %REMOTE_PYTHON_DIR% & %REMOTE_PYTHON_DIR%PCbuild\rt.bat" %rt_args% +set ERR=%ERRORLEVEL% +scp %SSH_SERVER%:"%REMOTE_PYTHON_DIR%test-results.xml" "%PYTHON_SOURCE%\test-results.xml" +exit /b %ERR% :Arm32SshHelp echo SSH_SERVER environment variable must be set to administrator@[ip address] diff --git a/Tools/c-globals/README b/Tools/c-analyzer/README similarity index 97% rename from Tools/c-globals/README rename to Tools/c-analyzer/README index 0ee8ac3800bc6e893712e66a80ba2429e9735544..8cf20e276d927bab090a09543a01fe41dda2a4ec 100644 --- a/Tools/c-globals/README +++ b/Tools/c-analyzer/README @@ -34,7 +34,7 @@ should be added for runtime state. Instead, they should be added to _PyRuntimeState or one of its sub-structs. The check-c-globals script should be run to ensure that no new globals have been added: - python3 Tools/c-globals/check-c-globals.py + python3 Tools/c-analyzer/check-c-globals.py If it reports any globals then they should be resolved. If the globals are runtime state then they should be folded into _PyRuntimeState. diff --git a/Tools/c-analyzer/TODO b/Tools/c-analyzer/TODO new file mode 100644 index 0000000000000000000000000000000000000000..829daba291463c99fc1accbbf9ac63250f45beff --- /dev/null +++ b/Tools/c-analyzer/TODO @@ -0,0 +1,1072 @@ + +# allocator (16) +Objects/obmalloc.c:_PyMem static PyMemAllocatorEx _PyMem +Objects/obmalloc.c:_PyMem_Debug static struct { debug_alloc_api_t raw; debug_alloc_api_t mem; debug_alloc_api_t obj; } _PyMem_Debug +Objects/obmalloc.c:_PyMem_Raw static PyMemAllocatorEx _PyMem_Raw +Objects/obmalloc.c:_PyObject static PyMemAllocatorEx _PyObject +Objects/obmalloc.c:_PyObject_Arena static PyObjectArenaAllocator _PyObject_Arena +Objects/obmalloc.c:_Py_tracemalloc_config struct _PyTraceMalloc_Config _Py_tracemalloc_config +Objects/obmalloc.c:arenas static struct arena_object* arenas +Objects/obmalloc.c:maxarenas static uint maxarenas +Objects/obmalloc.c:narenas_currently_allocated static size_t narenas_currently_allocated +Objects/obmalloc.c:narenas_highwater static size_t narenas_highwater +Objects/obmalloc.c:nfp2lasta static struct arena_object* nfp2lasta[MAX_POOLS_IN_ARENA + 1] +Objects/obmalloc.c:ntimes_arena_allocated static size_t ntimes_arena_allocated +Objects/obmalloc.c:unused_arena_objects static struct arena_object* unused_arena_objects +Objects/obmalloc.c:usable_arenas static struct arena_object* usable_arenas +Objects/obmalloc.c:usedpools static poolp usedpools[2 * ((NB_SMALL_SIZE_CLASSES + 7) / 8) * 8] +Objects/obmalloc.c:new_arena():debug_stats static int debug_stats + + +# counters +Modules/_abc.c:abc_invalidation_counter static unsigned long long abc_invalidation_counter +Objects/bytesobject.c:_Py_null_strings Py_ssize_t _Py_null_strings +Objects/bytesobject.c:_Py_onel_strings Py_ssize_t _Py_one_strings + + +# constants (effectively) +Objects/dictobject.c:empty_keys_struct static PyDictKeysObject empty_keys_struct + + +# "initialized" +Python/fileutils.c:_Py_open_cloexec_works int _Py_open_cloexec_works + + +# freelists +Objects/dictobject.c:keys_free_list static PyDictKeysObject *keys_free_list[PyDict_MAXFREELIST] +Objects/dictobject.c:numfreekeys static int numfreekeys + + +# other non-object (43) +Modules/_tracemalloc.c:allocators static struct { PyMemAllocatorEx mem; PyMemAllocatorEx raw; PyMemAllocatorEx obj; } allocators +Modules/_tracemalloc.c:tables_lock static PyThread_type_lock tables_lock +Modules/_tracemalloc.c:tracemalloc_filenames static _Py_hashtable_t *tracemalloc_filenames +Modules/_tracemalloc.c:tracemalloc_peak_traced_memory static size_t tracemalloc_peak_traced_memory +Modules/_tracemalloc.c:tracemalloc_reentrant_key static Py_tss_t tracemalloc_reentrant_key +Modules/_tracemalloc.c:tracemalloc_tracebacks static _Py_hashtable_t *tracemalloc_tracebacks +Modules/_tracemalloc.c:tracemalloc_traced_memory static size_t tracemalloc_traced_memory +Modules/_tracemalloc.c:tracemalloc_traces static _Py_hashtable_t *tracemalloc_traces +Modules/faulthandler.c:old_stack static stack_t old_stack +Modules/faulthandler.c:stack static stack_t stack +Modules/faulthandler.c:faulthandler_dump_traceback():reentrant static volatile int reentrant +Modules/posixmodule.c:initialized static int initialized +Modules/signalmodule.c:initialized static int initialized +Modules/timemodule.c:initialized static int initialized +Objects/dictobject.c:pydict_global_version static uint64_t pydict_global_version +Objects/floatobject.c:detected_double_format static float_format_type detected_double_format +Objects/floatobject.c:detected_float_format static float_format_type detected_float_format +Objects/floatobject.c:double_format static float_format_type double_format +Objects/floatobject.c:float_format static float_format_type +Objects.longobject.c:_Py_quick_int_allocs Py_ssize_t _Py_quick_int_allocs +Objects.longobject.c:_Py_quick_neg_int_allocs Py_ssize_t _Py_quick_neg_int_allocs +Objects/moduleobject.c:max_module_number static Py_ssize_t max_module_number +Objects/object.c:_Py_RefTotal Py_ssize_t _Py_RefTotal +Objects/tupleobject.c:_Py_fast_tuple_allocs Py_ssize_t _Py_fast_tuple_allocs +Objects/tupleobject.c:_Py_tuple_zero_allocs Py_ssize_t _Py_tuple_zero_allocs +Objects/typeobject.c:next_version_tag static unsigned int next_version_tag +Parser/listnode.c:atbol static int atbol +Parser/listnode.c:level static int level +Python/Python-ast.c:init_types():initialized static int initialized +Python/bootstrap_hash.c:urandom_cache static struct { int fd; dev_t st_dev; ino_t st_ino; } urandom_cache +Python/ceval.c:_Py_CheckRecursionLimit int _Py_CheckRecursionLimit +Python/ceval.c:lltrace static int lltrace +Python/ceval.c:make_pending_calls():busy static int busy +Python/dynload_shlib.c:handles static struct { dev_t dev; ino_t ino; void *handle; } handles[128] +Python/dynload_shlib.c:nhandles static int nhandles +Python/import.c:import_lock static PyThread_type_lock import_lock +Python/import.c:import_lock_level static int import_lock_level +Python/import.c:import_lock_thread static unsigned long import_lock_thread +Python/import.c:import_find_and_load():accumulated static _PyTime_t accumulated +Python/import.c:import_find_and_load():header static int header +Python/import.c:import_find_and_load():import_level static int import_level +Python/pylifecycle.c:_Py_UnhandledKeyboardInterrupt int _Py_UnhandledKeyboardInterrupt +Python/pylifecycle.c:fatal_error():reentrant static int reentrant + + +####################################### +# PyObject (960) + +# freelists (10 + 10) +Modules/_collectionsmodule.c:freeblocks static block *freeblocks[MAXFREEBLOCKS] +Modules/_collectionsmodule.c:numfreeblocks static Py_ssize_t numfreeblocks +Objects/dictobject.c:free_list static PyDictObject *free_list[PyDict_MAXFREELIST] +Objects/dictobject.c:numfree static int numfree +Objects/exceptions.c:memerrors_freelist static PyBaseExceptionObject *memerrors_freelist +Objects/exceptions.c:memerrors_numfree static int memerrors_numfree +Objects/floatobject.c:free_list static PyFloatObject *free_list +Objects/floatobject.c:numfree static int numfree +Objects/frameobject.c:free_list static PyFrameObject *free_list +Objects/frameobject.c:numfree static int numfree +Objects/genobject.c:ag_asend_freelist static PyAsyncGenASend *ag_asend_freelist[_PyAsyncGen_MAXFREELIST] +Objects/genobject.c:ag_asend_freelist_free static int ag_asend_freelist_free +Objects/genobject.c:ag_value_freelist static _PyAsyncGenWrappedValue *ag_value_freelist[_PyAsyncGen_MAXFREELIST] +Objects/genobject.c:ag_value_freelist_free static int ag_value_freelist_free +Objects/listobject.c:free_list static PyListObject *free_list[PyList_MAXFREELIST] +Objects/listobject.c:numfree static int numfree +Objects/tupleobject.c:free_list static PyTupleObject *free_list[PyTuple_MAXSAVESIZE] +Objects/tupleobject.c:numfree static int numfree[PyTuple_MAXSAVESIZE] +Python/context.c:ctx_freelist static PyContext *ctx_freelist +Python/context.c:ctx_freelist_len static int ctx_freelist_len + + +# singletons (7) +Objects/boolobject.c:_Py_FalseStruct static struct _longobject _Py_FalseStruct +Objects/boolobject.c:_Py_TrueStruct static struct _longobject _Py_TrueStruct +Objects/boolobject.c:false_str static PyObject *false_str +Objects/boolobject.c:true_str static PyObject *true_str +Objects/object.c:_Py_NoneStruct PyObject _Py_NoneStruct +Objects/object.c:_Py_NotImplementedStruct PyObject _Py_NotImplementedStruct +Objects/sliceobject.c:_Py_EllipsisObject PyObject _Py_EllipsisObject + + +# module vars (9) +Modules/_functoolsmodule.c:kwd_mark static PyObject *kwd_mark +Modules/_localemodule.c:Error static PyObject *Error +Modules/_threadmodule.c:ThreadError static PyObject *ThreadError +Modules/_tracemalloc.c:unknown_filename static PyObject *unknown_filename +Modules/signalmodule.c:DefaultHandler static PyObject *DefaultHandler +Modules/signalmodule.c:IgnoreHandler static PyObject *IgnoreHandler +Modules/signalmodule.c:IntHandler static PyObject *IntHandler +Modules/signalmodule.c:ItimerError static PyObject *ItimerError +Objects/exceptions.c:errnomap static PyObject *errnomap + + +# other (non-cache) (5) +Modules/_tracemalloc.c:tracemalloc_traceback static traceback_t *tracemalloc_traceback +Modules/faulthandler.c:fatal_error static struct { int enabled; PyObject *file; int fd; int all_threads; PyInterpreterState *interp; void *exc_handler; } fatal_error +Modules/faulthandler.c:thread static struct { PyObject *file; int fd; PY_TIMEOUT_T timeout_us; int repeat; PyInterpreterState *interp; int exit; char *header; size_t header_len; PyThread_type_lock cancel_event; PyThread_type_lock running; } thread +Modules/signalmodule.c:Handlers static volatile struct { _Py_atomic_int tripped; PyObject *func; } Handlers[NSIG] +Objects/setobject.c:_dummy_struct static PyObject _dummy_struct + + +# caches (5) +Modules/posixmodule.c:posix_putenv_garbage static PyObject *posix_putenv_garbage +Objects/sliceobject.c:slice_cache static PySliceObject *slice_cache +Objects/typeobject.c:method_cache static struct method_cache_entry method_cache[1 << MCACHE_SIZE_EXP] +Objects/unicodeobject.c:interned static PyObject *interned +Python/import.c:extensions static PyObject *extensions + + +# cached constants - non-str (15) +Modules/_io/_iomodule.c:_PyIO_empty_bytes PyObject *_PyIO_empty_bytes +Modules/_io/bufferedio.c:_PyIO_trap_eintr():eintr_int static PyObject *eintr_int +Modules/posixmodule.c:billion static PyObject *billion +Modules/posixmodule.c:wait_helper():struct_rusage static PyObject *struct_rusage +Objects/bytesobject.c:characters static PyBytesObject *characters[UCHAR_MAX + 1] +Objects/bytesobject.c:nullstring static PyBytesObject *nullstring +Objects/codeobject.c:PyCode_NewEmpty():nulltuple static PyObject *nulltuple +Objects/dictobject.c:empty_values static PyObject *empty_values[1] +Objects/listobject.c:indexerr static PyObject *indexerr +Objects/longobject.c:_PyLong_One PyObject *_PyLong_One +Objects/longobject.c:_PyLong_Zero PyObject *_PyLong_Zero +Objects/longobject.c:small_ints static PyLongObject small_ints[NSMALLNEGINTS + NSMALLPOSINTS] +Objects/setobject.c:emptyfrozenset static PyObject *emptyfrozenset +Python/context.c:_token_missing static PyObject *_token_missing +Python/hamt.c:_empty_hamt static PyHamtObject *_empty_hamt + + +# cached constants - str (441) +Modules/_io/_iomodule.c:_PyIO_empty_str PyObject *_PyIO_empty_str +Modules/_io/_iomodule.c:_PyIO_str_close PyObject *_PyIO_str_close +Modules/_io/_iomodule.c:_PyIO_str_closed PyObject *_PyIO_str_closed +Modules/_io/_iomodule.c:_PyIO_str_decode PyObject *_PyIO_str_decode +Modules/_io/_iomodule.c:_PyIO_str_encode PyObject *_PyIO_str_encode +Modules/_io/_iomodule.c:_PyIO_str_fileno PyObject *_PyIO_str_fileno +Modules/_io/_iomodule.c:_PyIO_str_flush PyObject *_PyIO_str_flush +Modules/_io/_iomodule.c:_PyIO_str_getstate PyObject *_PyIO_str_getstate +Modules/_io/_iomodule.c:_PyIO_str_isatty PyObject *_PyIO_str_isatty +Modules/_io/_iomodule.c:_PyIO_str_newlines PyObject *_PyIO_str_newlines +Modules/_io/_iomodule.c:_PyIO_str_nl PyObject *_PyIO_str_nl +Modules/_io/_iomodule.c:_PyIO_str_peek PyObject *_PyIO_str_peek +Modules/_io/_iomodule.c:_PyIO_str_read PyObject *_PyIO_str_read +Modules/_io/_iomodule.c:_PyIO_str_read1 PyObject *_PyIO_str_read1 +Modules/_io/_iomodule.c:_PyIO_str_readable PyObject *_PyIO_str_readable +Modules/_io/_iomodule.c:_PyIO_str_readall PyObject *_PyIO_str_readall +Modules/_io/_iomodule.c:_PyIO_str_readinto PyObject *_PyIO_str_readinto +Modules/_io/_iomodule.c:_PyIO_str_readline PyObject *_PyIO_str_readline +Modules/_io/_iomodule.c:_PyIO_str_reset PyObject *_PyIO_str_reset +Modules/_io/_iomodule.c:_PyIO_str_seek PyObject *_PyIO_str_seek +Modules/_io/_iomodule.c:_PyIO_str_seekable PyObject *_PyIO_str_seekable +Modules/_io/_iomodule.c:_PyIO_str_setstate PyObject *_PyIO_str_setstate +Modules/_io/_iomodule.c:_PyIO_str_tell PyObject *_PyIO_str_tell +Modules/_io/_iomodule.c:_PyIO_str_truncate PyObject *_PyIO_str_truncate +Modules/_io/_iomodule.c:_PyIO_str_writable PyObject *_PyIO_str_writable +Modules/_io/_iomodule.c:_PyIO_str_write PyObject *_PyIO_str_write +Modules/_threadmodule.c:str_dict static PyObject *str_dict +Modules/gcmodule.c:gc_str static PyObject *gc_str +Objects/classobject.c:instancemethod_get_doc():docstr static PyObject *docstr +Objects/classobject.c:method_get_doc():docstr static PyObject *docstr +Objects/codeobject.c:PyCode_NewEmpty():emptystring static PyObject *emptystring +Objects/exceptions.c:_check_for_legacy_statements():exec_prefix static PyObject *exec_prefix +Objects/exceptions.c:_check_for_legacy_statements():print_prefix static PyObject *print_prefix +Objects/funcobject.c:PyFunction_NewWithQualName():__name__ static PyObject *__name__ +Objects/typeobject.c:object___reduce_ex___impl():objreduce static PyObject *objreduce +Objects/typeobject.c:resolve_slotdups():pname static PyObject *pname +Objects/unicodeobject.c:unicode_empty static PyObject *unicode_empty +Objects/unicodeobject.c:unicode_latin1 static PyObject *unicode_latin1[256] +Python/_warnings.c:is_internal_frame():bootstrap_string static PyObject *bootstrap_string +Python/_warnings.c:is_internal_frame():importlib_string static PyObject *importlib_string +Python/ast.c:u_kind static PyObject *u_kind +Python/ast_unparse.c:_str_close_br static PyObject *_str_close_br +Python/ast_unparse.c:_str_dbl_close_br static PyObject *_str_dbl_close_br +Python/ast_unparse.c:_str_dbl_open_br static PyObject *_str_dbl_open_br +Python/ast_unparse.c:_str_open_br static PyObject *_str_open_br +Python/compile.c:__annotations__ static PyObject *__annotations__ +Python/compile.c:__doc__ static PyObject *__doc__ +Python/compile.c:compiler_dictcomp():name static identifier name +Python/compile.c:compiler_from_import():empty_string static PyObject *empty_string +Python/compile.c:compiler_genexp():name static identifier name +Python/compile.c:compiler_lambda():name static identifier name +Python/compile.c:compiler_listcomp():name static identifier name +Python/compile.c:compiler_setcomp():name static identifier name +Python/compile.c:compiler_visit_annotations():return_str static identifier return_str +Python/import.c:PyImport_Import():builtins_str static PyObject *builtins_str +Python/import.c:PyImport_Import():import_str static PyObject *import_str +Python/import.c:PyImport_Import():silly_list static PyObject *silly_list +Python/sysmodule.c:whatstrings static PyObject *whatstrings[8] +Python/sysmodule.c:sys_displayhook():newline static PyObject *newline +Objects/typeobject.c:object_new():comma_id _Py_static_string(comma_id, "", "") +Objects/typeobject.c:slot_nb_add():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_add():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_and():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_and():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_divmod():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_divmod():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_floor_divide():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_floor_divide():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_lshift():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_lshift():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_matrix_multiply():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_matrix_multiply():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_multiply():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_multiply():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_or():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_or():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_power_binary():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_power_binary():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_remainder():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_remainder():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_rshift():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_rshift():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_subtract():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_subtract():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_true_divide():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_true_divide():rop_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_xor():op_id _Py_static_string(op_id, OPSTR) +Objects/typeobject.c:slot_nb_xor():rop_id _Py_static_string(op_id, OPSTR) +Python/compile.c:compiler_set_qualname():dot _Py_static_string(dot, ""."") +Python/compile.c:compiler_set_qualname():dot_locals _Py_static_string(dot_locals, ""."") +Python/pythonrun.c:PyId_string _Py_static_string(PyId_string, """") +Modules/_abc.c:PyId___abstractmethods__ _Py_IDENTIFIER(__abstractmethods__) +Modules/_abc.c:PyId___bases__ _Py_IDENTIFIER(__bases__) +Modules/_abc.c:PyId___class__ _Py_IDENTIFIER(__class__) +Modules/_abc.c:PyId___dict__ _Py_IDENTIFIER(__dict__) +Modules/_abc.c:PyId___subclasscheck__ _Py_IDENTIFIER(__subclasscheck__) +Modules/_abc.c:PyId___subclasshook__ _Py_IDENTIFIER(__subclasshook__) +Modules/_abc.c:PyId__abc_impl _Py_IDENTIFIER(_abc_impl) +Modules/_collectionsmodule.c:_count_elements():PyId___setitem__ _Py_IDENTIFIER(__setitem__) +Modules/_collectionsmodule.c:_count_elements():PyId_get _Py_IDENTIFIER(get) +Modules/_collectionsmodule.c:defdict_reduce():PyId_items _Py_IDENTIFIER(items) +Modules/_dbmmodule.c:dbm__exit__():PyId_close _Py_IDENTIFIER(close) +Modules/_gdbmmodule.c:dbm__exit__():PyId_close _Py_IDENTIFIER(close) +Modules/_io/_iomodule.c:_io_open_impl():PyId__blksize _Py_IDENTIFIER(_blksize) +Modules/_io/_iomodule.c:_io_open_impl():PyId_isatty _Py_IDENTIFIER(isatty) +Modules/_io/_iomodule.c:_io_open_impl():PyId_mode _Py_IDENTIFIER(mode) +Modules/_io/bufferedio.c:PyId__dealloc_warn _Py_IDENTIFIER(_dealloc_warn) +Modules/_io/bufferedio.c:PyId_close _Py_IDENTIFIER(close) +Modules/_io/bufferedio.c:PyId_flush _Py_IDENTIFIER(flush) +Modules/_io/bufferedio.c:PyId_isatty _Py_IDENTIFIER(isatty) +Modules/_io/bufferedio.c:PyId_mode _Py_IDENTIFIER(mode) +Modules/_io/bufferedio.c:PyId_name _Py_IDENTIFIER(name) +Modules/_io/bufferedio.c:PyId_peek _Py_IDENTIFIER(peek) +Modules/_io/bufferedio.c:PyId_read _Py_IDENTIFIER(read) +Modules/_io/bufferedio.c:PyId_read1 _Py_IDENTIFIER(read1) +Modules/_io/bufferedio.c:PyId_readable _Py_IDENTIFIER(readable) +Modules/_io/bufferedio.c:PyId_readinto _Py_IDENTIFIER(readinto) +Modules/_io/bufferedio.c:PyId_readinto1 _Py_IDENTIFIER(readinto1) +Modules/_io/bufferedio.c:PyId_writable _Py_IDENTIFIER(writable) +Modules/_io/bufferedio.c:PyId_write _Py_IDENTIFIER(write) +Modules/_io/fileio.c:PyId_name _Py_IDENTIFIER(name) +Modules/_io/iobase.c:PyId___IOBase_closed _Py_IDENTIFIER(__IOBase_closed) +Modules/_io/iobase.c:PyId_read _Py_IDENTIFIER(read) +Modules/_io/iobase.c:_io__IOBase_tell_impl():PyId_seek _Py_IDENTIFIER(seek) +Modules/_io/iobase.c:_io__RawIOBase_read_impl():PyId_readall _Py_IDENTIFIER(readall) +Modules/_io/iobase.c:iobase_finalize():PyId__finalizing _Py_IDENTIFIER(_finalizing) +Modules/_io/textio.c:PyId__dealloc_warn _Py_IDENTIFIER(_dealloc_warn) +Modules/_io/textio.c:PyId_close _Py_IDENTIFIER(close) +Modules/_io/textio.c:PyId_decode _Py_IDENTIFIER(decode) +Modules/_io/textio.c:PyId_fileno _Py_IDENTIFIER(fileno) +Modules/_io/textio.c:PyId_flush _Py_IDENTIFIER(flush) +Modules/_io/textio.c:PyId_getpreferredencoding _Py_IDENTIFIER(getpreferredencoding) +Modules/_io/textio.c:PyId_isatty _Py_IDENTIFIER(isatty) +Modules/_io/textio.c:PyId_mode _Py_IDENTIFIER(mode) +Modules/_io/textio.c:PyId_name _Py_IDENTIFIER(name) +Modules/_io/textio.c:PyId_raw _Py_IDENTIFIER(raw) +Modules/_io/textio.c:PyId_read _Py_IDENTIFIER(read) +Modules/_io/textio.c:PyId_readable _Py_IDENTIFIER(readable) +Modules/_io/textio.c:PyId_replace _Py_IDENTIFIER(replace) +Modules/_io/textio.c:PyId_reset _Py_IDENTIFIER(reset) +Modules/_io/textio.c:PyId_seek _Py_IDENTIFIER(seek) +Modules/_io/textio.c:PyId_seekable _Py_IDENTIFIER(seekable) +Modules/_io/textio.c:PyId_setstate _Py_IDENTIFIER(setstate) +Modules/_io/textio.c:PyId_strict _Py_IDENTIFIER(strict) +Modules/_io/textio.c:PyId_tell _Py_IDENTIFIER(tell) +Modules/_io/textio.c:PyId_writable _Py_IDENTIFIER(writable) +Modules/_operator.c:methodcaller_reduce():PyId_partial _Py_IDENTIFIER(partial) +Modules/_pickle.c:do_append():PyId_extend _Py_IDENTIFIER(extend) +Modules/_pickle.c:load_build():PyId___setstate__ _Py_IDENTIFIER(__setstate__) +Modules/_threadmodule.c:PyId_flush _Py_IDENTIFIER(flush) +Modules/_threadmodule.c:PyId_stderr _Py_IDENTIFIER(stderr) +Modules/arraymodule.c:array_arrayiterator___reduce___impl():PyId_iter _Py_IDENTIFIER(iter) +Modules/faulthandler.c:PyId_enable _Py_IDENTIFIER(enable) +Modules/faulthandler.c:PyId_fileno _Py_IDENTIFIER(fileno) +Modules/faulthandler.c:PyId_flush _Py_IDENTIFIER(flush) +Modules/faulthandler.c:PyId_stderr _Py_IDENTIFIER(stderr) +Modules/itertoolsmodule.c:itertools_tee_impl():PyId___copy__ _Py_IDENTIFIER(__copy__) +Modules/itertoolsmodule.c:zip_longest_new():PyId_fillvalue _Py_IDENTIFIER(fillvalue) +Modules/main.c:pymain_sys_path_add_path0():PyId_path _Py_IDENTIFIER(path) +Modules/posixmodule.c:DirEntry_test_mode():PyId_st_mode _Py_IDENTIFIER(st_mode) +Modules/posixmodule.c:PyOS_FSPath():PyId___fspath__ _Py_IDENTIFIER(__fspath__) +Modules/posixmodule.c:path_converter():PyId___fspath__ _Py_IDENTIFIER(__fspath__) +Modules/posixmodule.c:wait_helper():PyId_struct_rusage _Py_IDENTIFIER(struct_rusage) +Modules/timemodule.c:time_strptime():PyId__strptime_time _Py_IDENTIFIER(_strptime_time) +Objects/abstract.c:PyMapping_Items():PyId_items _Py_IDENTIFIER(items) +Objects/abstract.c:PyMapping_Keys():PyId_keys _Py_IDENTIFIER(keys) +Objects/abstract.c:PyMapping_Values():PyId_values _Py_IDENTIFIER(values) +Objects/abstract.c:PyNumber_Long():PyId___trunc__ _Py_IDENTIFIER(__trunc__) +Objects/abstract.c:PyObject_Format():PyId___format__ _Py_IDENTIFIER(__format__) +Objects/abstract.c:PyObject_GetItem():PyId___class_getitem__ _Py_IDENTIFIER(__class_getitem__) +Objects/abstract.c:PyObject_IsInstance():PyId___instancecheck__ _Py_IDENTIFIER(__instancecheck__) +Objects/abstract.c:PyObject_IsSubclass():PyId___subclasscheck__ _Py_IDENTIFIER(__subclasscheck__) +Objects/abstract.c:PyObject_LengthHint():PyId___length_hint__ _Py_IDENTIFIER(__length_hint__) +Objects/abstract.c:abstract_get_bases():PyId___bases__ _Py_IDENTIFIER(__bases__) +Objects/abstract.c:recursive_isinstance():PyId___class__ _Py_IDENTIFIER(__class__) +Objects/bytearrayobject.c:_common_reduce():PyId___dict__ _Py_IDENTIFIER(__dict__) +Objects/bytearrayobject.c:bytearrayiter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/bytesobject.c:bytes_new():PyId___bytes__ _Py_IDENTIFIER(__bytes__) +Objects/bytesobject.c:format_obj():PyId___bytes__ _Py_IDENTIFIER(__bytes__) +Objects/bytesobject.c:striter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/classobject.c:PyId___name__ _Py_IDENTIFIER(__name__) +Objects/classobject.c:PyId___qualname__ _Py_IDENTIFIER(__qualname__) +Objects/classobject.c:method_reduce():PyId_getattr _Py_IDENTIFIER(getattr) +Objects/complexobject.c:try_complex_special_method():PyId___complex__ _Py_IDENTIFIER(__complex__) +Objects/descrobject.c:calculate_qualname():PyId___qualname__ _Py_IDENTIFIER(__qualname__) +Objects/descrobject.c:descr_reduce():PyId_getattr _Py_IDENTIFIER(getattr) +Objects/descrobject.c:mappingproxy_copy():PyId_copy _Py_IDENTIFIER(copy) +Objects/descrobject.c:mappingproxy_get():PyId_get _Py_IDENTIFIER(get) +Objects/descrobject.c:mappingproxy_items():PyId_items _Py_IDENTIFIER(items) +Objects/descrobject.c:mappingproxy_keys():PyId_keys _Py_IDENTIFIER(keys) +Objects/descrobject.c:mappingproxy_values():PyId_values _Py_IDENTIFIER(values) +Objects/descrobject.c:property_init_impl():PyId___doc__ _Py_IDENTIFIER(__doc__) +Objects/descrobject.c:wrapper_reduce():PyId_getattr _Py_IDENTIFIER(getattr) +Objects/dictobject.c:_PyDictView_Intersect():PyId_intersection_update _Py_IDENTIFIER(intersection_update) +Objects/dictobject.c:dict_subscript():PyId___missing__ _Py_IDENTIFIER(__missing__) +Objects/dictobject.c:dict_update_common():PyId_keys _Py_IDENTIFIER(keys) +Objects/dictobject.c:dictiter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/dictobject.c:dictviews_or():PyId_update _Py_IDENTIFIER(update) +Objects/dictobject.c:dictviews_sub():PyId_difference_update _Py_IDENTIFIER(difference_update) +Objects/dictobject.c:dictviews_xor():PyId_symmetric_difference_update _Py_IDENTIFIER(symmetric_difference_update) +Objects/enumobject.c:reversed_new_impl():PyId___reversed__ _Py_IDENTIFIER(__reversed__) +Objects/exceptions.c:ImportError_getstate():PyId_name _Py_IDENTIFIER(name) +Objects/exceptions.c:ImportError_getstate():PyId_path _Py_IDENTIFIER(path) +Objects/fileobject.c:PyFile_FromFd():PyId_open _Py_IDENTIFIER(open) +Objects/fileobject.c:PyFile_GetLine():PyId_readline _Py_IDENTIFIER(readline) +Objects/fileobject.c:PyFile_OpenCodeObject():PyId_open _Py_IDENTIFIER(open) +Objects/fileobject.c:PyFile_WriteObject():PyId_write _Py_IDENTIFIER(write) +Objects/fileobject.c:PyObject_AsFileDescriptor():PyId_fileno _Py_IDENTIFIER(fileno) +Objects/frameobject.c:PyId___builtins__ _Py_IDENTIFIER(__builtins__) +Objects/genobject.c:_gen_throw():PyId_throw _Py_IDENTIFIER(throw) +Objects/genobject.c:gen_close_iter():PyId_close _Py_IDENTIFIER(close) +Objects/iterobject.c:calliter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/iterobject.c:iter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/listobject.c:listiter_reduce_general():PyId_iter _Py_IDENTIFIER(iter) +Objects/listobject.c:listiter_reduce_general():PyId_reversed _Py_IDENTIFIER(reversed) +Objects/longobject.c:PyId_big _Py_IDENTIFIER(big) +Objects/longobject.c:PyId_little _Py_IDENTIFIER(little) +Objects/methodobject.c:meth_get__qualname__():PyId___qualname__ _Py_IDENTIFIER(__qualname__) +Objects/methodobject.c:meth_reduce():PyId_getattr _Py_IDENTIFIER(getattr) +Objects/moduleobject.c:PyModule_GetFilenameObject():PyId___file__ _Py_IDENTIFIER(__file__) +Objects/moduleobject.c:PyModule_GetNameObject():PyId___name__ _Py_IDENTIFIER(__name__) +Objects/moduleobject.c:PyModule_SetDocString():PyId___doc__ _Py_IDENTIFIER(__doc__) +Objects/moduleobject.c:_PyModuleSpec_IsInitializing():PyId__initializing _Py_IDENTIFIER(_initializing) +Objects/moduleobject.c:module_dir():PyId___dict__ _Py_IDENTIFIER(__dict__) +Objects/moduleobject.c:module_dir():PyId___dir__ _Py_IDENTIFIER(__dir__) +Objects/moduleobject.c:module_getattro():PyId___getattr__ _Py_IDENTIFIER(__getattr__) +Objects/moduleobject.c:module_getattro():PyId___name__ _Py_IDENTIFIER(__name__) +Objects/moduleobject.c:module_getattro():PyId___spec__ _Py_IDENTIFIER(__spec__) +Objects/moduleobject.c:module_init_dict():PyId___doc__ _Py_IDENTIFIER(__doc__) +Objects/moduleobject.c:module_init_dict():PyId___loader__ _Py_IDENTIFIER(__loader__) +Objects/moduleobject.c:module_init_dict():PyId___name__ _Py_IDENTIFIER(__name__) +Objects/moduleobject.c:module_init_dict():PyId___package__ _Py_IDENTIFIER(__package__) +Objects/moduleobject.c:module_init_dict():PyId___spec__ _Py_IDENTIFIER(__spec__) +Objects/object.c:PyId_Py_Repr _Py_IDENTIFIER(Py_Repr) +Objects/object.c:PyId___bytes__ _Py_IDENTIFIER(__bytes__) +Objects/object.c:PyId___dir__ _Py_IDENTIFIER(__dir__) +Objects/object.c:PyId___isabstractmethod__ _Py_IDENTIFIER(__isabstractmethod__) +Objects/odictobject.c:mutablemapping_update():PyId_items _Py_IDENTIFIER(items) +Objects/odictobject.c:mutablemapping_update():PyId_keys _Py_IDENTIFIER(keys) +Objects/odictobject.c:odict_reduce():PyId___dict__ _Py_IDENTIFIER(__dict__) +Objects/odictobject.c:odict_reduce():PyId_items _Py_IDENTIFIER(items) +Objects/odictobject.c:odict_repr():PyId_items _Py_IDENTIFIER(items) +Objects/odictobject.c:odictiter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/rangeobject.c:longrangeiter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/rangeobject.c:rangeiter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/setobject.c:set_reduce():PyId___dict__ _Py_IDENTIFIER(__dict__) +Objects/setobject.c:setiter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/structseq.c:PyId_n_fields _Py_IDENTIFIER(n_fields) +Objects/structseq.c:PyId_n_sequence_fields _Py_IDENTIFIER(n_sequence_fields) +Objects/structseq.c:PyId_n_unnamed_fields _Py_IDENTIFIER(n_unnamed_fields) +Objects/tupleobject.c:tupleiter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/typeobject.c:PyId___abstractmethods__ _Py_IDENTIFIER(__abstractmethods__) +Objects/typeobject.c:PyId___class__ _Py_IDENTIFIER(__class__) +Objects/typeobject.c:PyId___class_getitem__ _Py_IDENTIFIER(__class_getitem__) +Objects/typeobject.c:PyId___delitem__ _Py_IDENTIFIER(__delitem__) +Objects/typeobject.c:PyId___dict__ _Py_IDENTIFIER(__dict__) +Objects/typeobject.c:PyId___doc__ _Py_IDENTIFIER(__doc__) +Objects/typeobject.c:PyId___getattribute__ _Py_IDENTIFIER(__getattribute__) +Objects/typeobject.c:PyId___getitem__ _Py_IDENTIFIER(__getitem__) +Objects/typeobject.c:PyId___hash__ _Py_IDENTIFIER(__hash__) +Objects/typeobject.c:PyId___init_subclass__ _Py_IDENTIFIER(__init_subclass__) +Objects/typeobject.c:PyId___len__ _Py_IDENTIFIER(__len__) +Objects/typeobject.c:PyId___module__ _Py_IDENTIFIER(__module__) +Objects/typeobject.c:PyId___name__ _Py_IDENTIFIER(__name__) +Objects/typeobject.c:PyId___new__ _Py_IDENTIFIER(__new__) +Objects/typeobject.c:PyId___set_name__ _Py_IDENTIFIER(__set_name__) +Objects/typeobject.c:PyId___setitem__ _Py_IDENTIFIER(__setitem__) +Objects/typeobject.c:PyId_builtins _Py_IDENTIFIER(builtins) +Objects/typeobject.c:_PyObject_GetItemsIter():PyId_items _Py_IDENTIFIER(items) +Objects/typeobject.c:_PyObject_GetNewArguments():PyId___getnewargs__ _Py_IDENTIFIER(__getnewargs__) +Objects/typeobject.c:_PyObject_GetNewArguments():PyId___getnewargs_ex__ _Py_IDENTIFIER(__getnewargs_ex__) +Objects/typeobject.c:_PyObject_GetState():PyId___getstate__ _Py_IDENTIFIER(__getstate__) +Objects/typeobject.c:_PyType_GetSlotNames():PyId___slotnames__ _Py_IDENTIFIER(__slotnames__) +Objects/typeobject.c:_PyType_GetSlotNames():PyId__slotnames _Py_IDENTIFIER(_slotnames) +Objects/typeobject.c:import_copyreg():PyId_copyreg _Py_IDENTIFIER(copyreg) +Objects/typeobject.c:merge_class_dict():PyId___bases__ _Py_IDENTIFIER(__bases__) +Objects/typeobject.c:mro_invoke():PyId_mro _Py_IDENTIFIER(mro) +Objects/typeobject.c:object___reduce_ex___impl():PyId___reduce__ _Py_IDENTIFIER(__reduce__) +Objects/typeobject.c:overrides_hash():PyId___eq__ _Py_IDENTIFIER(__eq__) +Objects/typeobject.c:reduce_newobj():PyId___newobj__ _Py_IDENTIFIER(__newobj__) +Objects/typeobject.c:reduce_newobj():PyId___newobj_ex__ _Py_IDENTIFIER(__newobj_ex__) +Objects/typeobject.c:slot_am_aiter():PyId___aiter__ _Py_IDENTIFIER(__aiter__) +Objects/typeobject.c:slot_am_anext():PyId___anext__ _Py_IDENTIFIER(__anext__) +Objects/typeobject.c:slot_am_await():PyId___await__ _Py_IDENTIFIER(__await__) +Objects/typeobject.c:slot_nb_bool():PyId___bool__ _Py_IDENTIFIER(__bool__) +Objects/typeobject.c:slot_nb_index():PyId___index__ _Py_IDENTIFIER(__index__) +Objects/typeobject.c:slot_nb_inplace_power():PyId___ipow__ _Py_IDENTIFIER(__ipow__) +Objects/typeobject.c:slot_nb_power():PyId___pow__ _Py_IDENTIFIER(__pow__) +Objects/typeobject.c:slot_sq_contains():PyId___contains__ _Py_IDENTIFIER(__contains__) +Objects/typeobject.c:slot_tp_call():PyId___call__ _Py_IDENTIFIER(__call__) +Objects/typeobject.c:slot_tp_descr_get():PyId___get__ _Py_IDENTIFIER(__get__) +Objects/typeobject.c:slot_tp_descr_set():PyId___delete__ _Py_IDENTIFIER(__delete__) +Objects/typeobject.c:slot_tp_descr_set():PyId___set__ _Py_IDENTIFIER(__set__) +Objects/typeobject.c:slot_tp_finalize():PyId___del__ _Py_IDENTIFIER(__del__) +Objects/typeobject.c:slot_tp_getattr_hook():PyId___getattr__ _Py_IDENTIFIER(__getattr__) +Objects/typeobject.c:slot_tp_init():PyId___init__ _Py_IDENTIFIER(__init__) +Objects/typeobject.c:slot_tp_iter():PyId___iter__ _Py_IDENTIFIER(__iter__) +Objects/typeobject.c:slot_tp_iternext():PyId___next__ _Py_IDENTIFIER(__next__) +Objects/typeobject.c:slot_tp_repr():PyId___repr__ _Py_IDENTIFIER(__repr__) +Objects/typeobject.c:slot_tp_setattro():PyId___delattr__ _Py_IDENTIFIER(__delattr__) +Objects/typeobject.c:slot_tp_setattro():PyId___setattr__ _Py_IDENTIFIER(__setattr__) +Objects/typeobject.c:type_mro_modified():PyId_mro _Py_IDENTIFIER(mro) +Objects/typeobject.c:type_new():PyId___classcell__ _Py_IDENTIFIER(__classcell__) +Objects/typeobject.c:type_new():PyId___mro_entries__ _Py_IDENTIFIER(__mro_entries__) +Objects/typeobject.c:type_new():PyId___qualname__ _Py_IDENTIFIER(__qualname__) +Objects/typeobject.c:type_new():PyId___slots__ _Py_IDENTIFIER(__slots__) +Objects/unicodeobject.c:unicodeiter_reduce():PyId_iter _Py_IDENTIFIER(iter) +Objects/weakrefobject.c:proxy_bytes():PyId___bytes__ _Py_IDENTIFIER(__bytes__) +Objects/weakrefobject.c:weakref_repr():PyId___name__ _Py_IDENTIFIER(__name__) +Parser/tokenizer.c:fp_setreadl():PyId_open _Py_IDENTIFIER(open) +Parser/tokenizer.c:fp_setreadl():PyId_readline _Py_IDENTIFIER(readline) +Python/Python-ast.c:ast_type_reduce():PyId___dict__ _Py_IDENTIFIER(__dict__) +Python/Python-ast.c:make_type():PyId___module__ _Py_IDENTIFIER(__module__) +Python/_warnings.c:PyId_stderr _Py_IDENTIFIER(stderr) +Python/_warnings.c:_PyErr_WarnUnawaitedCoroutine():PyId__warn_unawaited_coroutine _Py_IDENTIFIER(_warn_unawaited_coroutine) +Python/_warnings.c:already_warned():PyId_version _Py_IDENTIFIER(version) +Python/_warnings.c:call_show_warning():PyId_WarningMessage _Py_IDENTIFIER(WarningMessage) +Python/_warnings.c:call_show_warning():PyId__showwarnmsg _Py_IDENTIFIER(_showwarnmsg) +Python/_warnings.c:check_matched():PyId_match _Py_IDENTIFIER(match) +Python/_warnings.c:get_default_action():PyId_defaultaction _Py_IDENTIFIER(defaultaction) +Python/_warnings.c:get_filter():PyId_filters _Py_IDENTIFIER(filters) +Python/_warnings.c:get_once_registry():PyId_onceregistry _Py_IDENTIFIER(onceregistry) +Python/_warnings.c:get_source_line():PyId___loader__ _Py_IDENTIFIER(__loader__) +Python/_warnings.c:get_source_line():PyId___name__ _Py_IDENTIFIER(__name__) +Python/_warnings.c:get_source_line():PyId_get_source _Py_IDENTIFIER(get_source) +Python/_warnings.c:get_warnings_attr():PyId_warnings _Py_IDENTIFIER(warnings) +Python/_warnings.c:setup_context():PyId___name__ _Py_IDENTIFIER(__name__) +Python/_warnings.c:setup_context():PyId___warningregistry__ _Py_IDENTIFIER(__warningregistry__) +Python/_warnings.c:show_warning():PyId___name__ _Py_IDENTIFIER(__name__) +Python/bltinmodule.c:PyId___builtins__ _Py_IDENTIFIER(__builtins__) +Python/bltinmodule.c:PyId___dict__ _Py_IDENTIFIER(__dict__) +Python/bltinmodule.c:PyId___mro_entries__ _Py_IDENTIFIER(__mro_entries__) +Python/bltinmodule.c:PyId___prepare__ _Py_IDENTIFIER(__prepare__) +Python/bltinmodule.c:PyId___round__ _Py_IDENTIFIER(__round__) +Python/bltinmodule.c:PyId_encoding _Py_IDENTIFIER(encoding) +Python/bltinmodule.c:PyId_errors _Py_IDENTIFIER(errors) +Python/bltinmodule.c:PyId_fileno _Py_IDENTIFIER(fileno) +Python/bltinmodule.c:PyId_flush _Py_IDENTIFIER(flush) +Python/bltinmodule.c:PyId_metaclass _Py_IDENTIFIER(metaclass) +Python/bltinmodule.c:PyId_sort _Py_IDENTIFIER(sort) +Python/bltinmodule.c:PyId_stderr _Py_IDENTIFIER(stderr) +Python/bltinmodule.c:PyId_stdin _Py_IDENTIFIER(stdin) +Python/bltinmodule.c:PyId_stdout _Py_IDENTIFIER(stdout) +Python/ceval.c:_PyEval_EvalFrameDefault():PyId___aenter__ _Py_IDENTIFIER(__aenter__) +Python/ceval.c:_PyEval_EvalFrameDefault():PyId___aexit__ _Py_IDENTIFIER(__aexit__) +Python/ceval.c:_PyEval_EvalFrameDefault():PyId___annotations__ _Py_IDENTIFIER(__annotations__) +Python/ceval.c:_PyEval_EvalFrameDefault():PyId___build_class__ _Py_IDENTIFIER(__build_class__) +Python/ceval.c:_PyEval_EvalFrameDefault():PyId___enter__ _Py_IDENTIFIER(__enter__) +Python/ceval.c:_PyEval_EvalFrameDefault():PyId___exit__ _Py_IDENTIFIER(__exit__) +Python/ceval.c:_PyEval_EvalFrameDefault():PyId___ltrace__ _Py_IDENTIFIER(__ltrace__) +Python/ceval.c:_PyEval_EvalFrameDefault():PyId_displayhook _Py_IDENTIFIER(displayhook) +Python/ceval.c:_PyEval_EvalFrameDefault():PyId_send _Py_IDENTIFIER(send) +Python/ceval.c:import_all_from():PyId___all__ _Py_IDENTIFIER(__all__) +Python/ceval.c:import_all_from():PyId___dict__ _Py_IDENTIFIER(__dict__) +Python/ceval.c:import_all_from():PyId___name__ _Py_IDENTIFIER(__name__) +Python/ceval.c:import_from():PyId___name__ _Py_IDENTIFIER(__name__) +Python/ceval.c:import_name():PyId___import__ _Py_IDENTIFIER(__import__) +Python/codecs.c:_PyCodec_LookupTextEncoding():PyId__is_text_encoding _Py_IDENTIFIER(_is_text_encoding) +Python/compile.c:compiler_enter_scope():PyId___class__ _Py_IDENTIFIER(__class__) +Python/errors.c:PyId_builtins _Py_IDENTIFIER(builtins) +Python/errors.c:PyId_flush _Py_IDENTIFIER(flush) +Python/errors.c:PyId_stderr _Py_IDENTIFIER(stderr) +Python/errors.c:PyErr_NewException():PyId___module__ _Py_IDENTIFIER(__module__) +Python/errors.c:PyErr_SyntaxLocationObject():PyId_filename _Py_IDENTIFIER(filename) +Python/errors.c:PyErr_SyntaxLocationObject():PyId_lineno _Py_IDENTIFIER(lineno) +Python/errors.c:PyErr_SyntaxLocationObject():PyId_msg _Py_IDENTIFIER(msg) +Python/errors.c:PyErr_SyntaxLocationObject():PyId_offset _Py_IDENTIFIER(offset) +Python/errors.c:PyErr_SyntaxLocationObject():PyId_print_file_and_line _Py_IDENTIFIER(print_file_and_line) +Python/errors.c:PyErr_SyntaxLocationObject():PyId_text _Py_IDENTIFIER(text) +Python/errors.c:_PyErr_WriteUnraisableMsg():PyId_unraisablehook _Py_IDENTIFIER(unraisablehook) +Python/import.c:PyImport_Cleanup():PyId_clear _Py_IDENTIFIER(clear) +Python/import.c:PyImport_ExecCodeModuleObject():PyId__fix_up_module _Py_IDENTIFIER(_fix_up_module) +Python/import.c:PyImport_ExecCodeModuleWithPathnames():PyId__get_sourcefile _Py_IDENTIFIER(_get_sourcefile) +Python/import.c:PyImport_ImportModuleLevelObject():PyId___path__ _Py_IDENTIFIER(__path__) +Python/import.c:PyImport_ImportModuleLevelObject():PyId___spec__ _Py_IDENTIFIER(__spec__) +Python/import.c:PyImport_ImportModuleLevelObject():PyId__handle_fromlist _Py_IDENTIFIER(_handle_fromlist) +Python/import.c:PyImport_ImportModuleLevelObject():PyId__lock_unlock_module _Py_IDENTIFIER(_lock_unlock_module) +Python/import.c:PyImport_ReloadModule():PyId_imp _Py_IDENTIFIER(imp) +Python/import.c:PyImport_ReloadModule():PyId_reload _Py_IDENTIFIER(reload) +Python/import.c:_PyImportZip_Init():PyId_zipimporter _Py_IDENTIFIER(zipimporter) +Python/import.c:import_find_and_load():PyId__find_and_load _Py_IDENTIFIER(_find_and_load) +Python/import.c:module_dict_for_exec():PyId___builtins__ _Py_IDENTIFIER(__builtins__) +Python/import.c:resolve_name():PyId___name__ _Py_IDENTIFIER(__name__) +Python/import.c:resolve_name():PyId___package__ _Py_IDENTIFIER(__package__) +Python/import.c:resolve_name():PyId___path__ _Py_IDENTIFIER(__path__) +Python/import.c:resolve_name():PyId___spec__ _Py_IDENTIFIER(__spec__) +Python/import.c:resolve_name():PyId_parent _Py_IDENTIFIER(parent) +Python/importdl.c:get_encoded_name():PyId_replace _Py_IDENTIFIER(replace) +Python/marshal.c:marshal_dump_impl():PyId_write _Py_IDENTIFIER(write) +Python/marshal.c:marshal_load():PyId_read _Py_IDENTIFIER(read) +Python/marshal.c:r_string():PyId_readinto _Py_IDENTIFIER(readinto) +Python/pylifecycle.c:PyId_flush _Py_IDENTIFIER(flush) +Python/pylifecycle.c:PyId_name _Py_IDENTIFIER(name) +Python/pylifecycle.c:PyId_stderr _Py_IDENTIFIER(stderr) +Python/pylifecycle.c:PyId_stdin _Py_IDENTIFIER(stdin) +Python/pylifecycle.c:PyId_stdout _Py_IDENTIFIER(stdout) +Python/pylifecycle.c:PyId_threading _Py_IDENTIFIER(threading) +Python/pylifecycle.c:create_stdio():PyId_TextIOWrapper _Py_IDENTIFIER(TextIOWrapper) +Python/pylifecycle.c:create_stdio():PyId_isatty _Py_IDENTIFIER(isatty) +Python/pylifecycle.c:create_stdio():PyId_mode _Py_IDENTIFIER(mode) +Python/pylifecycle.c:create_stdio():PyId_open _Py_IDENTIFIER(open) +Python/pylifecycle.c:create_stdio():PyId_raw _Py_IDENTIFIER(raw) +Python/pylifecycle.c:wait_for_thread_shutdown():PyId__shutdown _Py_IDENTIFIER(_shutdown) +Python/pythonrun.c:PyId_builtins _Py_IDENTIFIER(builtins) +Python/pythonrun.c:PyId_excepthook _Py_IDENTIFIER(excepthook) +Python/pythonrun.c:PyId_flush _Py_IDENTIFIER(flush) +Python/pythonrun.c:PyId_last_traceback _Py_IDENTIFIER(last_traceback) +Python/pythonrun.c:PyId_last_type _Py_IDENTIFIER(last_type) +Python/pythonrun.c:PyId_last_value _Py_IDENTIFIER(last_value) +Python/pythonrun.c:PyId_ps1 _Py_IDENTIFIER(ps1) +Python/pythonrun.c:PyId_ps2 _Py_IDENTIFIER(ps2) +Python/pythonrun.c:PyId_stderr _Py_IDENTIFIER(stderr) +Python/pythonrun.c:PyId_stdin _Py_IDENTIFIER(stdin) +Python/pythonrun.c:PyId_stdout _Py_IDENTIFIER(stdout) +Python/pythonrun.c:PyRun_InteractiveOneObjectEx():PyId___main__ _Py_IDENTIFIER(__main__) +Python/pythonrun.c:PyRun_InteractiveOneObjectEx():PyId_encoding _Py_IDENTIFIER(encoding) +Python/pythonrun.c:_Py_HandleSystemExit():PyId_code _Py_IDENTIFIER(code) +Python/pythonrun.c:parse_syntax_error():PyId_filename _Py_IDENTIFIER(filename) +Python/pythonrun.c:parse_syntax_error():PyId_lineno _Py_IDENTIFIER(lineno) +Python/pythonrun.c:parse_syntax_error():PyId_msg _Py_IDENTIFIER(msg) +Python/pythonrun.c:parse_syntax_error():PyId_offset _Py_IDENTIFIER(offset) +Python/pythonrun.c:parse_syntax_error():PyId_text _Py_IDENTIFIER(text) +Python/pythonrun.c:print_exception():PyId___module__ _Py_IDENTIFIER(__module__) +Python/pythonrun.c:print_exception():PyId_print_file_and_line _Py_IDENTIFIER(print_file_and_line) +Python/sysmodule.c:PyId__ _Py_IDENTIFIER(_) +Python/sysmodule.c:PyId___sizeof__ _Py_IDENTIFIER(__sizeof__) +Python/sysmodule.c:PyId__xoptions _Py_IDENTIFIER(_xoptions) +Python/sysmodule.c:PyId_buffer _Py_IDENTIFIER(buffer) +Python/sysmodule.c:PyId_builtins _Py_IDENTIFIER(builtins) +Python/sysmodule.c:PyId_encoding _Py_IDENTIFIER(encoding) +Python/sysmodule.c:PyId_path _Py_IDENTIFIER(path) +Python/sysmodule.c:PyId_stderr _Py_IDENTIFIER(stderr) +Python/sysmodule.c:PyId_stdout _Py_IDENTIFIER(stdout) +Python/sysmodule.c:PyId_warnoptions _Py_IDENTIFIER(warnoptions) +Python/sysmodule.c:PyId_write _Py_IDENTIFIER(write) +Python/traceback.c:PyId_TextIOWrapper _Py_IDENTIFIER(TextIOWrapper) +Python/traceback.c:PyId_close _Py_IDENTIFIER(close) +Python/traceback.c:PyId_open _Py_IDENTIFIER(open) +Python/traceback.c:PyId_path _Py_IDENTIFIER(path) +Objects/typeobject.c:name_op static _Py_Identifier name_op[] +Objects/unicodeobject.c:static_strings static _Py_Identifier *static_strings + + +# PyTypeObject (311) +Modules/_abc.c:_abc_data_type static PyTypeObject _abc_data_type +Modules/_blake2/blake2b_impl.c:PyBlake2_BLAKE2bType PyTypeObject PyBlake2_BLAKE2bType +Modules/_blake2/blake2s_impl.c:PyBlake2_BLAKE2sType PyTypeObject PyBlake2_BLAKE2sType +Modules/_collectionsmodule.c:defdict_type static PyTypeObject defdict_type +Modules/_collectionsmodule.c:deque_type static PyTypeObject deque_type +Modules/_collectionsmodule.c:dequeiter_type static PyTypeObject dequeiter_type +Modules/_collectionsmodule.c:dequereviter_type static PyTypeObject dequereviter_type +Modules/_collectionsmodule.c:tuplegetter_type static PyTypeObject tuplegetter_type +Modules/_functoolsmodule.c:keyobject_type static PyTypeObject keyobject_type +Modules/_functoolsmodule.c:lru_cache_type static PyTypeObject lru_cache_type +Modules/_functoolsmodule.c:lru_list_elem_type static PyTypeObject lru_list_elem_type +Modules/_functoolsmodule.c:partial_type static PyTypeObject partial_type +Modules/_io/bufferedio.c:PyBufferedIOBase_Type PyTypeObject PyBufferedIOBase_Type +Modules/_io/bufferedio.c:PyBufferedRWPair_Type PyTypeObject PyBufferedRWPair_Type +Modules/_io/bufferedio.c:PyBufferedRandom_Type PyTypeObject PyBufferedRandom_Type +Modules/_io/bufferedio.c:PyBufferedReader_Type PyTypeObject PyBufferedReader_Type +Modules/_io/bufferedio.c:PyBufferedWriter_Type PyTypeObject PyBufferedWriter_Type +Modules/_io/bytesio.c:PyBytesIO_Type PyTypeObject PyBytesIO_Type +Modules/_io/bytesio.c:_PyBytesIOBuffer_Type PyTypeObject _PyBytesIOBuffer_Type +Modules/_io/fileio.c:PyFileIO_Type PyTypeObject PyFileIO_Type +Modules/_io/iobase.c:PyIOBase_Type PyTypeObject PyIOBase_Type +Modules/_io/iobase.c:PyRawIOBase_Type PyTypeObject PyRawIOBase_Type +Modules/_io/stringio.c:PyStringIO_Type PyTypeObject PyStringIO_Type +Modules/_io/textio.c:PyIncrementalNewlineDecoder_Type PyTypeObject PyIncrementalNewlineDecoder_Type +Modules/_io/textio.c:PyTextIOBase_Type PyTypeObject PyTextIOBase_Type +Modules/_io/textio.c:PyTextIOWrapper_Type PyTypeObject PyTextIOWrapper_Type +Modules/_operator.c:attrgetter_type static PyTypeObject attrgetter_type +Modules/_operator.c:itemgetter_type static PyTypeObject itemgetter_type +Modules/_operator.c:methodcaller_type static PyTypeObject methodcaller_type +Modules/_sre.c:Match_Type static PyTypeObject Match_Type +Modules/_sre.c:Pattern_Type static PyTypeObject Pattern_Type +Modules/_sre.c:Scanner_Type static PyTypeObject Scanner_Type +Modules/_threadmodule.c:ExceptHookArgsType static PyTypeObject ExceptHookArgsType +Modules/_threadmodule.c:Locktype static PyTypeObject Locktype +Modules/_threadmodule.c:RLocktype static PyTypeObject RLocktype +Modules/_threadmodule.c:localdummytype static PyTypeObject localdummytype +Modules/_threadmodule.c:localtype static PyTypeObject localtype +Modules/itertoolsmodule.c:_grouper_type static PyTypeObject _grouper_type +Modules/itertoolsmodule.c:accumulate_type static PyTypeObject accumulate_type +Modules/itertoolsmodule.c:chain_type static PyTypeObject chain_type +Modules/itertoolsmodule.c:combinations_type static PyTypeObject combinations_type +Modules/itertoolsmodule.c:compress_type static PyTypeObject compress_type +Modules/itertoolsmodule.c:count_type static PyTypeObject count_type +Modules/itertoolsmodule.c:cwr_type static PyTypeObject cwr_type +Modules/itertoolsmodule.c:cycle_type static PyTypeObject cycle_type +Modules/itertoolsmodule.c:dropwhile_type static PyTypeObject dropwhile_type +Modules/itertoolsmodule.c:filterfalse_type static PyTypeObject filterfalse_type +Modules/itertoolsmodule.c:groupby_type static PyTypeObject groupby_type +Modules/itertoolsmodule.c:islice_type static PyTypeObject islice_type +Modules/itertoolsmodule.c:permutations_type static PyTypeObject permutations_type +Modules/itertoolsmodule.c:product_type static PyTypeObject product_type +Modules/itertoolsmodule.c:repeat_type static PyTypeObject repeat_type +Modules/itertoolsmodule.c:starmap_type static PyTypeObject starmap_type +Modules/itertoolsmodule.c:takewhile_type static PyTypeObject takewhile_type +Modules/itertoolsmodule.c:tee_type static PyTypeObject tee_type +Modules/itertoolsmodule.c:teedataobject_type static PyTypeObject teedataobject_type +Modules/itertoolsmodule.c:ziplongest_type static PyTypeObject ziplongest_type +Modules/posixmodule.c:DirEntryType static PyTypeObject DirEntryType +Modules/posixmodule.c:ScandirIteratorType static PyTypeObject ScandirIteratorType +Modules/posixmodule.c:SchedParamType static PyTypeObject* SchedParamType +Modules/posixmodule.c:StatResultType static PyTypeObject* StatResultType +Modules/posixmodule.c:StatVFSResultType static PyTypeObject* StatVFSResultType +Modules/posixmodule.c:TerminalSizeType static PyTypeObject* TerminalSizeType +Modules/posixmodule.c:TimesResultType static PyTypeObject* TimesResultType +Modules/posixmodule.c:UnameResultType static PyTypeObject* UnameResultType +Modules/posixmodule.c:WaitidResultType static PyTypeObject* WaitidResultType +Modules/signalmodule.c:SiginfoType static PyTypeObject SiginfoType +Modules/timemodule.c:StructTimeType static PyTypeObject StructTimeType +Modules/xxsubtype.c:spamdict_type static PyTypeObject spamdict_type +Modules/xxsubtype.c:spamlist_type static PyTypeObject spamlist_type +Objects/boolobject.c:PyBool_Type PyTypeObject PyBool_Type +Objects/bytearrayobject.c:PyByteArrayIter_Type PyTypeObject PyByteArrayIter_Type +Objects/bytearrayobject.c:PyByteArray_Type PyTypeObject PyByteArray_Type +Objects/bytesobject.c:PyBytesIter_Type PyTypeObject PyBytesIter_Type +Objects/bytesobject.c:PyBytes_Type PyTypeObject PyBytes_Type +Objects/capsule.c:PyCapsule_Type PyTypeObject PyCapsule_Type +Objects/cellobject.c:PyCell_Type PyTypeObject PyCell_Type +Objects/classobject.c:PyInstanceMethod_Type PyTypeObject PyInstanceMethod_Type +Objects/classobject.c:PyMethod_Type PyTypeObject PyMethod_Type +Objects/codeobject.c:PyCode_Type PyTypeObject PyCode_Type +Objects/complexobject.c:PyComplex_Type PyTypeObject PyComplex_Type +Objects/descrobject.c:PyClassMethodDescr_Type PyTypeObject PyClassMethodDescr_Type +Objects/descrobject.c:PyDictProxy_Type PyTypeObject PyDictProxy_Type +Objects/descrobject.c:PyGetSetDescr_Type PyTypeObject PyGetSetDescr_Type +Objects/descrobject.c:PyMemberDescr_Type PyTypeObject PyMemberDescr_Type +Objects/descrobject.c:PyMethodDescr_Type PyTypeObject PyMethodDescr_Type +Objects/descrobject.c:PyProperty_Type PyTypeObject PyProperty_Type +Objects/descrobject.c:PyWrapperDescr_Type PyTypeObject PyWrapperDescr_Type +Objects/descrobject.c:_PyMethodWrapper_Type PyTypeObject _PyMethodWrapper_Type +Objects/dictobject.c:PyDictItems_Type PyTypeObject PyDictItems_Type +Objects/dictobject.c:PyDictIterItem_Type PyTypeObject PyDictIterItem_Type +Objects/dictobject.c:PyDictIterKey_Type PyTypeObject PyDictIterKey_Type +Objects/dictobject.c:PyDictIterValue_Type PyTypeObject PyDictIterValue_Type +Objects/dictobject.c:PyDictKeys_Type PyTypeObject PyDictKeys_Type +Objects/dictobject.c:PyDictRevIterItem_Type PyTypeObject PyDictRevIterItem_Type +Objects/dictobject.c:PyDictRevIterKey_Type PyTypeObject PyDictRevIterKey_Type +Objects/dictobject.c:PyDictRevIterValue_Type PyTypeObject PyDictRevIterValue_Type +Objects/dictobject.c:PyDictValues_Type PyTypeObject PyDictValues_Type +Objects/dictobject.c:PyDict_Type PyTypeObject PyDict_Type +Objects/enumobject.c:PyEnum_Type PyTypeObject PyEnum_Type +Objects/enumobject.c:PyReversed_Type PyTypeObject PyReversed_Type +Objects/exceptions.c:PyExc_ArithmeticError static PyTypeObject PyExc_ArithmeticError +Objects/exceptions.c:PyExc_AssertionError static PyTypeObject PyExc_AssertionError +Objects/exceptions.c:PyExc_AttributeError static PyTypeObject PyExc_AttributeError +Objects/exceptions.c:PyExc_BaseException static PyTypeObject PyExc_BaseException +Objects/exceptions.c:PyExc_BlockingIOError static PyTypeObject PyExc_BlockingIOError +Objects/exceptions.c:PyExc_BrokenPipeError static PyTypeObject PyExc_BrokenPipeError +Objects/exceptions.c:PyExc_BufferError static PyTypeObject PyExc_BufferError +Objects/exceptions.c:PyExc_BytesWarning static PyTypeObject PyExc_BytesWarning +Objects/exceptions.c:PyExc_ChildProcessError static PyTypeObject PyExc_ChildProcessError +Objects/exceptions.c:PyExc_ConnectionAbortedError static PyTypeObject PyExc_ConnectionAbortedError +Objects/exceptions.c:PyExc_ConnectionError static PyTypeObject PyExc_ConnectionError +Objects/exceptions.c:PyExc_ConnectionRefusedError static PyTypeObject PyExc_ConnectionRefusedError +Objects/exceptions.c:PyExc_ConnectionResetError static PyTypeObject PyExc_ConnectionResetError +Objects/exceptions.c:PyExc_DeprecationWarning static PyTypeObject PyExc_DeprecationWarning +Objects/exceptions.c:PyExc_EOFError static PyTypeObject PyExc_EOFError +Objects/exceptions.c:PyExc_EnvironmentError static PyTypeObject PyExc_EnvironmentError +Objects/exceptions.c:PyExc_Exception static PyTypeObject PyExc_Exception +Objects/exceptions.c:PyExc_FileExistsError static PyTypeObject PyExc_FileExistsError +Objects/exceptions.c:PyExc_FileNotFoundError static PyTypeObject PyExc_FileNotFoundError +Objects/exceptions.c:PyExc_FloatingPointError static PyTypeObject PyExc_FloatingPointError +Objects/exceptions.c:PyExc_FutureWarning static PyTypeObject PyExc_FutureWarning +Objects/exceptions.c:PyExc_GeneratorExit static PyTypeObject PyExc_GeneratorExit +Objects/exceptions.c:PyExc_IOError static PyTypeObject PyExc_IOError +Objects/exceptions.c:PyExc_ImportError static PyTypeObject PyExc_ImportError +Objects/exceptions.c:PyExc_ImportWarning static PyTypeObject PyExc_ImportWarning +Objects/exceptions.c:PyExc_IndentationError static PyTypeObject PyExc_IndentationError +Objects/exceptions.c:PyExc_IndexError static PyTypeObject PyExc_IndexError +Objects/exceptions.c:PyExc_InterruptedError static PyTypeObject PyExc_InterruptedError +Objects/exceptions.c:PyExc_IsADirectoryError static PyTypeObject PyExc_IsADirectoryError +Objects/exceptions.c:PyExc_KeyError static PyTypeObject PyExc_KeyError +Objects/exceptions.c:PyExc_KeyboardInterrupt static PyTypeObject PyExc_KeyboardInterrupt +Objects/exceptions.c:PyExc_LookupError static PyTypeObject PyExc_LookupError +Objects/exceptions.c:PyExc_MemoryError static PyTypeObject PyExc_MemoryError +Objects/exceptions.c:PyExc_ModuleNotFoundError static PyTypeObject PyExc_ModuleNotFoundError +Objects/exceptions.c:PyExc_NameError static PyTypeObject PyExc_NameError +Objects/exceptions.c:PyExc_NotADirectoryError static PyTypeObject PyExc_NotADirectoryError +Objects/exceptions.c:PyExc_NotImplementedError static PyTypeObject PyExc_NotImplementedError +Objects/exceptions.c:PyExc_OSError static PyTypeObject PyExc_OSError +Objects/exceptions.c:PyExc_OverflowError static PyTypeObject PyExc_OverflowError +Objects/exceptions.c:PyExc_PendingDeprecationWarning static PyTypeObject PyExc_PendingDeprecationWarning +Objects/exceptions.c:PyExc_PermissionError static PyTypeObject PyExc_PermissionError +Objects/exceptions.c:PyExc_ProcessLookupError static PyTypeObject PyExc_ProcessLookupError +Objects/exceptions.c:PyExc_RecursionError static PyTypeObject PyExc_RecursionError +Objects/exceptions.c:PyExc_ReferenceError static PyTypeObject PyExc_ReferenceError +Objects/exceptions.c:PyExc_ResourceWarning static PyTypeObject PyExc_ResourceWarning +Objects/exceptions.c:PyExc_RuntimeError static PyTypeObject PyExc_RuntimeError +Objects/exceptions.c:PyExc_RuntimeWarning static PyTypeObject PyExc_RuntimeWarning +Objects/exceptions.c:PyExc_StopAsyncIteration static PyTypeObject PyExc_StopAsyncIteration +Objects/exceptions.c:PyExc_StopIteration static PyTypeObject PyExc_StopIteration +Objects/exceptions.c:PyExc_SyntaxError static PyTypeObject PyExc_SyntaxError +Objects/exceptions.c:PyExc_SyntaxWarning static PyTypeObject PyExc_SyntaxWarning +Objects/exceptions.c:PyExc_SystemError static PyTypeObject PyExc_SystemError +Objects/exceptions.c:PyExc_SystemExit static PyTypeObject PyExc_SystemExit +Objects/exceptions.c:PyExc_TabError static PyTypeObject PyExc_TabError +Objects/exceptions.c:PyExc_TimeoutError static PyTypeObject PyExc_TimeoutError +Objects/exceptions.c:PyExc_TypeError static PyTypeObject PyExc_TypeError +Objects/exceptions.c:PyExc_UnboundLocalError static PyTypeObject PyExc_UnboundLocalError +Objects/exceptions.c:PyExc_UnicodeDecodeError static PyTypeObject PyExc_UnicodeDecodeError +Objects/exceptions.c:PyExc_UnicodeEncodeError static PyTypeObject PyExc_UnicodeEncodeError +Objects/exceptions.c:PyExc_UnicodeError static PyTypeObject PyExc_UnicodeError +Objects/exceptions.c:PyExc_UnicodeTranslateError static PyTypeObject PyExc_UnicodeTranslateError +Objects/exceptions.c:PyExc_UnicodeWarning static PyTypeObject PyExc_UnicodeWarning +Objects/exceptions.c:PyExc_UserWarning static PyTypeObject PyExc_UserWarning +Objects/exceptions.c:PyExc_ValueError static PyTypeObject PyExc_ValueError +Objects/exceptions.c:PyExc_Warning static PyTypeObject PyExc_Warning +Objects/exceptions.c:PyExc_ZeroDivisionError static PyTypeObject PyExc_ZeroDivisionError +Objects/exceptions.c:_PyExc_ArithmeticError static PyTypeObject _PyExc_ArithmeticError +Objects/exceptions.c:_PyExc_AssertionError static PyTypeObject _PyExc_AssertionError +Objects/exceptions.c:_PyExc_AttributeError static PyTypeObject _PyExc_AttributeError +Objects/exceptions.c:_PyExc_BaseException static PyTypeObject _PyExc_BaseException +Objects/exceptions.c:_PyExc_BlockingIOError static PyTypeObject _PyExc_BlockingIOError +Objects/exceptions.c:_PyExc_BrokenPipeError static PyTypeObject _PyExc_BrokenPipeError +Objects/exceptions.c:_PyExc_BufferError static PyTypeObject _PyExc_BufferError +Objects/exceptions.c:_PyExc_BytesWarning static PyTypeObject _PyExc_BytesWarning +Objects/exceptions.c:_PyExc_ChildProcessError static PyTypeObject _PyExc_ChildProcessError +Objects/exceptions.c:_PyExc_ConnectionAbortedError static PyTypeObject _PyExc_ConnectionAbortedError +Objects/exceptions.c:_PyExc_ConnectionError static PyTypeObject _PyExc_ConnectionError +Objects/exceptions.c:_PyExc_ConnectionRefusedError static PyTypeObject _PyExc_ConnectionRefusedError +Objects/exceptions.c:_PyExc_ConnectionResetError static PyTypeObject _PyExc_ConnectionResetError +Objects/exceptions.c:_PyExc_DeprecationWarning static PyTypeObject _PyExc_DeprecationWarning +Objects/exceptions.c:_PyExc_EOFError static PyTypeObject _PyExc_EOFError +Objects/exceptions.c:_PyExc_Exception static PyTypeObject _PyExc_Exception +Objects/exceptions.c:_PyExc_FileExistsError static PyTypeObject _PyExc_FileExistsError +Objects/exceptions.c:_PyExc_FileNotFoundError static PyTypeObject _PyExc_FileNotFoundError +Objects/exceptions.c:_PyExc_FloatingPointError static PyTypeObject _PyExc_FloatingPointError +Objects/exceptions.c:_PyExc_FutureWarning static PyTypeObject _PyExc_FutureWarning +Objects/exceptions.c:_PyExc_GeneratorExit static PyTypeObject _PyExc_GeneratorExit +Objects/exceptions.c:_PyExc_ImportError static PyTypeObject _PyExc_ImportError +Objects/exceptions.c:_PyExc_ImportWarning static PyTypeObject _PyExc_ImportWarning +Objects/exceptions.c:_PyExc_IndentationError static PyTypeObject _PyExc_IndentationError +Objects/exceptions.c:_PyExc_IndexError static PyTypeObject _PyExc_IndexError +Objects/exceptions.c:_PyExc_InterruptedError static PyTypeObject _PyExc_InterruptedError +Objects/exceptions.c:_PyExc_IsADirectoryError static PyTypeObject _PyExc_IsADirectoryError +Objects/exceptions.c:_PyExc_KeyError static PyTypeObject _PyExc_KeyError +Objects/exceptions.c:_PyExc_KeyboardInterrupt static PyTypeObject _PyExc_KeyboardInterrupt +Objects/exceptions.c:_PyExc_LookupError static PyTypeObject _PyExc_LookupError +Objects/exceptions.c:_PyExc_MemoryError static PyTypeObject _PyExc_MemoryError +Objects/exceptions.c:_PyExc_ModuleNotFoundError static PyTypeObject _PyExc_ModuleNotFoundError +Objects/exceptions.c:_PyExc_NameError static PyTypeObject _PyExc_NameError +Objects/exceptions.c:_PyExc_NotADirectoryError static PyTypeObject _PyExc_NotADirectoryError +Objects/exceptions.c:_PyExc_NotImplementedError static PyTypeObject _PyExc_NotImplementedError +Objects/exceptions.c:_PyExc_OSError static PyTypeObject _PyExc_OSError +Objects/exceptions.c:_PyExc_OverflowError static PyTypeObject _PyExc_OverflowError +Objects/exceptions.c:_PyExc_PendingDeprecationWarning static PyTypeObject _PyExc_PendingDeprecationWarning +Objects/exceptions.c:_PyExc_PermissionError static PyTypeObject _PyExc_PermissionError +Objects/exceptions.c:_PyExc_ProcessLookupError static PyTypeObject _PyExc_ProcessLookupError +Objects/exceptions.c:_PyExc_RecursionError static PyTypeObject _PyExc_RecursionError +Objects/exceptions.c:_PyExc_ReferenceError static PyTypeObject _PyExc_ReferenceError +Objects/exceptions.c:_PyExc_ResourceWarning static PyTypeObject _PyExc_ResourceWarning +Objects/exceptions.c:_PyExc_RuntimeError static PyTypeObject _PyExc_RuntimeError +Objects/exceptions.c:_PyExc_RuntimeWarning static PyTypeObject _PyExc_RuntimeWarning +Objects/exceptions.c:_PyExc_StopAsyncIteration static PyTypeObject _PyExc_StopAsyncIteration +Objects/exceptions.c:_PyExc_StopIteration static PyTypeObject _PyExc_StopIteration +Objects/exceptions.c:_PyExc_SyntaxError static PyTypeObject _PyExc_SyntaxError +Objects/exceptions.c:_PyExc_SyntaxWarning static PyTypeObject _PyExc_SyntaxWarning +Objects/exceptions.c:_PyExc_SystemError static PyTypeObject _PyExc_SystemError +Objects/exceptions.c:_PyExc_SystemExit static PyTypeObject _PyExc_SystemExit +Objects/exceptions.c:_PyExc_TabError static PyTypeObject _PyExc_TabError +Objects/exceptions.c:_PyExc_TimeoutError static PyTypeObject _PyExc_TimeoutError +Objects/exceptions.c:_PyExc_TypeError static PyTypeObject _PyExc_TypeError +Objects/exceptions.c:_PyExc_UnboundLocalError static PyTypeObject _PyExc_UnboundLocalError +Objects/exceptions.c:_PyExc_UnicodeDecodeError static PyTypeObject _PyExc_UnicodeDecodeError +Objects/exceptions.c:_PyExc_UnicodeEncodeError static PyTypeObject _PyExc_UnicodeEncodeError +Objects/exceptions.c:_PyExc_UnicodeError static PyTypeObject _PyExc_UnicodeError +Objects/exceptions.c:_PyExc_UnicodeTranslateError static PyTypeObject _PyExc_UnicodeTranslateError +Objects/exceptions.c:_PyExc_UnicodeWarning static PyTypeObject _PyExc_UnicodeWarning +Objects/exceptions.c:_PyExc_UserWarning static PyTypeObject _PyExc_UserWarning +Objects/exceptions.c:_PyExc_ValueError static PyTypeObject _PyExc_ValueError +Objects/exceptions.c:_PyExc_Warning static PyTypeObject _PyExc_Warning +Objects/exceptions.c:_PyExc_ZeroDivisionError static PyTypeObject _PyExc_ZeroDivisionError +Objects/fileobject.c:PyStdPrinter_Type PyTypeObject PyStdPrinter_Type +Objects/floatobject.c:FloatInfoType static PyTypeObject FloatInfoType +Objects/floatobject.c:PyFloat_Type PyTypeObject PyFloat_Type +Objects/frameobject.c:PyFrame_Type PyTypeObject PyFrame_Type +Objects/funcobject.c:PyClassMethod_Type PyTypeObject PyClassMethod_Type +Objects/funcobject.c:PyFunction_Type PyTypeObject PyFunction_Type +Objects/funcobject.c:PyStaticMethod_Type PyTypeObject PyStaticMethod_Type +Objects/genobject.c:PyAsyncGen_Type PyTypeObject PyAsyncGen_Type +Objects/genobject.c:PyCoro_Type PyTypeObject PyCoro_Type +Objects/genobject.c:PyGen_Type PyTypeObject PyGen_Type +Objects/genobject.c:_PyAsyncGenASend_Type PyTypeObject _PyAsyncGenASend_Type +Objects/genobject.c:_PyAsyncGenAThrow_Type PyTypeObject _PyAsyncGenAThrow_Type +Objects/genobject.c:_PyAsyncGenWrappedValue_Type PyTypeObject _PyAsyncGenWrappedValue_Type +Objects/genobject.c:_PyCoroWrapper_Type PyTypeObject _PyCoroWrapper_Type +Objects/interpreteridobject.c:_PyInterpreterID_Type PyTypeObject _PyInterpreterID_Type +Objects/iterobject.c:PyCallIter_Type PyTypeObject PyCallIter_Type +Objects/iterobject.c:PySeqIter_Type PyTypeObject PySeqIter_Type +Objects/listobject.c:PyListIter_Type PyTypeObject PyListIter_Type +Objects/listobject.c:PyListRevIter_Type PyTypeObject PyListRevIter_Type +Objects/listobject.c:PyList_Type PyTypeObject PyList_Type +Objects/longobject.c:Int_InfoType static PyTypeObject Int_InfoType +Objects/longobject.c:PyLong_Type PyTypeObject PyLong_Type +Objects/memoryobject.c:PyMemoryView_Type PyTypeObject PyMemoryView_Type +Objects/memoryobject.c:_PyManagedBuffer_Type PyTypeObject _PyManagedBuffer_Type +Objects/methodobject.c:PyCFunction_Type PyTypeObject PyCFunction_Type +Objects/moduleobject.c:PyModuleDef_Type PyTypeObject PyModuleDef_Type +Objects/moduleobject.c:PyModule_Type PyTypeObject PyModule_Type +Objects/namespaceobject.c:_PyNamespace_Type PyTypeObject _PyNamespace_Type +Objects/object.c:_PyNone_Type PyTypeObject _PyNone_Type +Objects/object.c:_PyNotImplemented_Type PyTypeObject _PyNotImplemented_Type +Objects/odictobject.c:PyODictItems_Type PyTypeObject PyODictItems_Type +Objects/odictobject.c:PyODictIter_Type PyTypeObject PyODictIter_Type +Objects/odictobject.c:PyODictKeys_Type PyTypeObject PyODictKeys_Type +Objects/odictobject.c:PyODictValues_Type PyTypeObject PyODictValues_Type +Objects/odictobject.c:PyODict_Type PyTypeObject PyODict_Type +Objects/picklebufobject.c:PyPickleBuffer_Type PyTypeObject PyPickleBuffer_Type +Objects/rangeobject.c:PyLongRangeIter_Type PyTypeObject PyLongRangeIter_Type +Objects/rangeobject.c:PyRangeIter_Type PyTypeObject PyRangeIter_Type +Objects/rangeobject.c:PyRange_Type PyTypeObject PyRange_Type +Objects/setobject.c:PyFrozenSet_Type PyTypeObject PyFrozenSet_Type +Objects/setobject.c:PySetIter_Type PyTypeObject PySetIter_Type +Objects/setobject.c:PySet_Type PyTypeObject PySet_Type +Objects/setobject.c:_PySetDummy_Type static PyTypeObject _PySetDummy_Type +Objects/sliceobject.c:PyEllipsis_Type PyTypeObject PyEllipsis_Type +Objects/sliceobject.c:PySlice_Type PyTypeObject PySlice_Type +Objects/stringlib/unicode_format.h:PyFieldNameIter_Type static PyTypeObject PyFieldNameIter_Type +Objects/stringlib/unicode_format.h:PyFormatterIter_Type static PyTypeObject PyFormatterIter_Type +Objects/tupleobject.c:PyTupleIter_Type PyTypeObject PyTupleIter_Type +Objects/tupleobject.c:PyTuple_Type PyTypeObject PyTuple_Type +Objects/typeobject.c:PyBaseObject_Type PyTypeObject PyBaseObject_Type +Objects/typeobject.c:PySuper_Type PyTypeObject PySuper_Type +Objects/typeobject.c:PyType_Type PyTypeObject PyType_Type +Objects/unicodeobject.c:EncodingMapType static PyTypeObject EncodingMapType +Objects/unicodeobject.c:PyUnicodeIter_Type PyTypeObject PyUnicodeIter_Type +Objects/unicodeobject.c:PyUnicode_Type PyTypeObject PyUnicode_Type +Objects/weakrefobject.c:_PyWeakref_CallableProxyType PyTypeObject _PyWeakref_CallableProxyType +Objects/weakrefobject.c:_PyWeakref_ProxyType PyTypeObject _PyWeakref_ProxyType +Objects/weakrefobject.c:_PyWeakref_RefType PyTypeObject _PyWeakref_RefType +Python/bltinmodule.c:PyFilter_Type PyTypeObject PyFilter_Type +Python/bltinmodule.c:PyMap_Type PyTypeObject PyMap_Type +Python/bltinmodule.c:PyZip_Type PyTypeObject PyZip_Type +Python/context.c:PyContextTokenMissing_Type PyTypeObject PyContextTokenMissing_Type +Python/context.c:PyContextToken_Type PyTypeObject PyContextToken_Type +Python/context.c:PyContextVar_Type PyTypeObject PyContextVar_Type +Python/context.c:PyContext_Type PyTypeObject PyContext_Type +Python/errors.c:UnraisableHookArgsType static PyTypeObject UnraisableHookArgsType +Python/hamt.c:_PyHamtItems_Type PyTypeObject _PyHamtItems_Type +Python/hamt.c:_PyHamtKeys_Type PyTypeObject _PyHamtKeys_Type +Python/hamt.c:_PyHamtValues_Type PyTypeObject _PyHamtValues_Type +Python/hamt.c:_PyHamt_ArrayNode_Type PyTypeObject _PyHamt_ArrayNode_Type +Python/hamt.c:_PyHamt_BitmapNode_Type PyTypeObject _PyHamt_BitmapNode_Type +Python/hamt.c:_PyHamt_CollisionNode_Type PyTypeObject _PyHamt_CollisionNode_Type +Python/hamt.c:_PyHamt_Type PyTypeObject _PyHamt_Type +Python/symtable.c:PySTEntry_Type PyTypeObject PySTEntry_Type +Python/sysmodule.c:AsyncGenHooksType static PyTypeObject AsyncGenHooksType +Python/sysmodule.c:FlagsType static PyTypeObject FlagsType +Python/sysmodule.c:Hash_InfoType static PyTypeObject Hash_InfoType +Python/sysmodule.c:VersionInfoType static PyTypeObject VersionInfoType +Python/thread.c:ThreadInfoType static PyTypeObject ThreadInfoType +Python/traceback.c:PyTraceBack_Type PyTypeObject PyTraceBack_Type + + +# _PyArg_Parser (147) +Modules/_blake2/clinic/blake2b_impl.c.h:py_blake2b_new():_parser static _PyArg_Parser _parser +Modules/_blake2/clinic/blake2s_impl.c.h:py_blake2s_new():_parser static _PyArg_Parser _parser +Modules/_io/clinic/_iomodule.c.h:_io_open():_parser static _PyArg_Parser _parser +Modules/_io/clinic/_iomodule.c.h:_io_open_code():_parser static _PyArg_Parser _parser +Modules/_io/clinic/bufferedio.c.h:_io_BufferedRandom___init__():_parser static _PyArg_Parser _parser +Modules/_io/clinic/bufferedio.c.h:_io_BufferedReader___init__():_parser static _PyArg_Parser _parser +Modules/_io/clinic/bufferedio.c.h:_io_BufferedWriter___init__():_parser static _PyArg_Parser _parser +Modules/_io/clinic/bytesio.c.h:_io_BytesIO___init__():_parser static _PyArg_Parser _parser +Modules/_io/clinic/fileio.c.h:_io_FileIO___init__():_parser static _PyArg_Parser _parser +Modules/_io/clinic/stringio.c.h:_io_StringIO___init__():_parser static _PyArg_Parser _parser +Modules/_io/clinic/textio.c.h:_io_IncrementalNewlineDecoder___init__():_parser static _PyArg_Parser _parser +Modules/_io/clinic/textio.c.h:_io_IncrementalNewlineDecoder_decode():_parser static _PyArg_Parser _parser +Modules/_io/clinic/textio.c.h:_io_TextIOWrapper___init__():_parser static _PyArg_Parser _parser +Modules/_io/clinic/textio.c.h:_io_TextIOWrapper_reconfigure():_parser static _PyArg_Parser _parser +Modules/_io/clinic/winconsoleio.c.h:_io__WindowsConsoleIO___init__():_parser static _PyArg_Parser _parser +Modules/_multiprocessing/clinic/posixshmem.c.h:_posixshmem_shm_open():_parser static _PyArg_Parser _parser +Modules/_multiprocessing/clinic/posixshmem.c.h:_posixshmem_shm_unlink():_parser static _PyArg_Parser _parser +Modules/cjkcodecs/clinic/multibytecodec.c.h:_multibytecodec_MultibyteCodec_decode():_parser static _PyArg_Parser _parser +Modules/cjkcodecs/clinic/multibytecodec.c.h:_multibytecodec_MultibyteCodec_encode():_parser static _PyArg_Parser _parser +Modules/cjkcodecs/clinic/multibytecodec.c.h:_multibytecodec_MultibyteIncrementalDecoder_decode():_parser static _PyArg_Parser _parser +Modules/cjkcodecs/clinic/multibytecodec.c.h:_multibytecodec_MultibyteIncrementalEncoder_encode():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio_Future___init__():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio_Future_add_done_callback():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio_Task___init__():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio_Task_all_tasks():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio_Task_current_task():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio_Task_get_stack():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio_Task_print_stack():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio__enter_task():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio__leave_task():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio__register_task():_parser static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h:_asyncio__unregister_task():_parser static _PyArg_Parser _parser +Modules/clinic/_bz2module.c.h:_bz2_BZ2Decompressor_decompress():_parser static _PyArg_Parser _parser +Modules/clinic/_codecsmodule.c.h:_codecs_decode():_parser static _PyArg_Parser _parser +Modules/clinic/_codecsmodule.c.h:_codecs_encode():_parser static _PyArg_Parser _parser +Modules/clinic/_cursesmodule.c.h:_curses_setupterm():_parser static _PyArg_Parser _parser +Modules/clinic/_datetimemodule.c.h:datetime_datetime_now():_parser static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h:_elementtree_Element_find():_parser static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h:_elementtree_Element_findall():_parser static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h:_elementtree_Element_findtext():_parser static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h:_elementtree_Element_get():_parser static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h:_elementtree_Element_getiterator():_parser static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h:_elementtree_Element_iter():_parser static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h:_elementtree_Element_iterfind():_parser static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h:_elementtree_TreeBuilder___init__():_parser static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h:_elementtree_XMLParser___init__():_parser static _PyArg_Parser _parser +Modules/clinic/_hashopenssl.c.h:EVP_new():_parser static _PyArg_Parser _parser +Modules/clinic/_hashopenssl.c.h:_hashlib_hmac_digest():_parser static _PyArg_Parser _parser +Modules/clinic/_hashopenssl.c.h:_hashlib_scrypt():_parser static _PyArg_Parser _parser +Modules/clinic/_hashopenssl.c.h:pbkdf2_hmac():_parser static _PyArg_Parser _parser +Modules/clinic/_lzmamodule.c.h:_lzma_LZMADecompressor___init__():_parser static _PyArg_Parser _parser +Modules/clinic/_lzmamodule.c.h:_lzma_LZMADecompressor_decompress():_parser static _PyArg_Parser _parser +Modules/clinic/_opcode.c.h:_opcode_stack_effect():_parser static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h:_pickle_Pickler___init__():_parser static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h:_pickle_Unpickler___init__():_parser static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h:_pickle_dump():_parser static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h:_pickle_dumps():_parser static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h:_pickle_load():_parser static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h:_pickle_loads():_parser static _PyArg_Parser _parser +Modules/clinic/_queuemodule.c.h:_queue_SimpleQueue_get():_parser static _PyArg_Parser _parser +Modules/clinic/_queuemodule.c.h:_queue_SimpleQueue_put():_parser static _PyArg_Parser _parser +Modules/clinic/_queuemodule.c.h:_queue_SimpleQueue_put_nowait():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Match_expand():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Match_groupdict():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Match_groups():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Pattern_findall():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Pattern_finditer():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Pattern_fullmatch():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Pattern_match():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Pattern_scanner():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Pattern_search():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Pattern_split():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Pattern_sub():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_SRE_Pattern_subn():_parser static _PyArg_Parser _parser +Modules/clinic/_sre.c.h:_sre_compile():_parser static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h:_ssl__SSLContext__wrap_bio():_parser static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h:_ssl__SSLContext__wrap_socket():_parser static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h:_ssl__SSLContext_get_ca_certs():_parser static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h:_ssl__SSLContext_load_cert_chain():_parser static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h:_ssl__SSLContext_load_verify_locations():_parser static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h:_ssl__SSLSocket_get_channel_binding():_parser static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h:_ssl_enum_certificates():_parser static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h:_ssl_enum_crls():_parser static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h:_ssl_txt2obj():_parser static _PyArg_Parser _parser +Modules/clinic/_struct.c.h:Struct___init__():_parser static _PyArg_Parser _parser +Modules/clinic/_struct.c.h:Struct_unpack_from():_parser static _PyArg_Parser _parser +Modules/clinic/_struct.c.h:unpack_from():_parser static _PyArg_Parser _parser +Modules/clinic/_winapi.c.h:_winapi_ConnectNamedPipe():_parser static _PyArg_Parser _parser +Modules/clinic/_winapi.c.h:_winapi_GetFileType():_parser static _PyArg_Parser _parser +Modules/clinic/_winapi.c.h:_winapi_ReadFile():_parser static _PyArg_Parser _parser +Modules/clinic/_winapi.c.h:_winapi_WriteFile():_parser static _PyArg_Parser _parser +Modules/clinic/binascii.c.h:binascii_a2b_qp():_parser static _PyArg_Parser _parser +Modules/clinic/binascii.c.h:binascii_b2a_base64():_parser static _PyArg_Parser _parser +Modules/clinic/binascii.c.h:binascii_b2a_hex():_parser static _PyArg_Parser _parser +Modules/clinic/binascii.c.h:binascii_b2a_qp():_parser static _PyArg_Parser _parser +Modules/clinic/binascii.c.h:binascii_b2a_uu():_parser static _PyArg_Parser _parser +Modules/clinic/binascii.c.h:binascii_hexlify():_parser static _PyArg_Parser _parser +Modules/clinic/cmathmodule.c.h:cmath_isclose():_parser static _PyArg_Parser _parser +Modules/clinic/gcmodule.c.h:gc_collect():_parser static _PyArg_Parser _parser +Modules/clinic/gcmodule.c.h:gc_get_objects():_parser static _PyArg_Parser _parser +Modules/clinic/grpmodule.c.h:grp_getgrgid():_parser static _PyArg_Parser _parser +Modules/clinic/grpmodule.c.h:grp_getgrnam():_parser static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h:bytearray_decode():_parser static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h:bytearray_hex():_parser static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h:bytearray_rsplit():_parser static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h:bytearray_split():_parser static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h:bytearray_splitlines():_parser static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h:bytearray_translate():_parser static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h:bytes_decode():_parser static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h:bytes_hex():_parser static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h:bytes_rsplit():_parser static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h:bytes_split():_parser static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h:bytes_splitlines():_parser static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h:bytes_translate():_parser static _PyArg_Parser _parser +Objects/clinic/codeobject.c.h:code_replace():_parser static _PyArg_Parser _parser +Objects/clinic/complexobject.c.h:complex_new():_parser static _PyArg_Parser _parser +Objects/clinic/descrobject.c.h:mappingproxy_new():_parser static _PyArg_Parser _parser +Objects/clinic/descrobject.c.h:property_init():_parser static _PyArg_Parser _parser +Objects/clinic/enumobject.c.h:enum_new():_parser static _PyArg_Parser _parser +Objects/clinic/funcobject.c.h:func_new():_parser static _PyArg_Parser _parser +Objects/clinic/listobject.c.h:list_sort():_parser static _PyArg_Parser _parser +Objects/clinic/longobject.c.h:int_from_bytes():_parser static _PyArg_Parser _parser +Objects/clinic/longobject.c.h:int_to_bytes():_parser static _PyArg_Parser _parser +Objects/clinic/longobject.c.h:long_new():_parser static _PyArg_Parser _parser +Objects/clinic/memoryobject.c.h:memoryview_hex():_parser static _PyArg_Parser _parser +Objects/clinic/moduleobject.c.h:module___init__():_parser static _PyArg_Parser _parser +Objects/clinic/odictobject.c.h:OrderedDict_fromkeys():_parser static _PyArg_Parser _parser +Objects/clinic/odictobject.c.h:OrderedDict_move_to_end():_parser static _PyArg_Parser _parser +Objects/clinic/odictobject.c.h:OrderedDict_popitem():_parser static _PyArg_Parser _parser +Objects/clinic/odictobject.c.h:OrderedDict_setdefault():_parser static _PyArg_Parser _parser +Objects/clinic/structseq.c.h:structseq_new():_parser static _PyArg_Parser _parser +Objects/clinic/unicodeobject.c.h:unicode_encode():_parser static _PyArg_Parser _parser +Objects/clinic/unicodeobject.c.h:unicode_expandtabs():_parser static _PyArg_Parser _parser +Objects/clinic/unicodeobject.c.h:unicode_rsplit():_parser static _PyArg_Parser _parser +Objects/clinic/unicodeobject.c.h:unicode_split():_parser static _PyArg_Parser _parser +Objects/clinic/unicodeobject.c.h:unicode_splitlines():_parser static _PyArg_Parser _parser +Objects/stringlib/clinic/transmogrify.h.h:stringlib_expandtabs():_parser static _PyArg_Parser _parser +Python/bltinmodule.c:builtin_print():_parser static struct _PyArg_Parser _parser +Python/clinic/_warnings.c.h:warnings_warn():_parser static _PyArg_Parser _parser +Python/clinic/bltinmodule.c.h:builtin_compile():_parser static _PyArg_Parser _parser +Python/clinic/bltinmodule.c.h:builtin_round():_parser static _PyArg_Parser _parser +Python/clinic/bltinmodule.c.h:builtin_sum():_parser static _PyArg_Parser _parser +Python/clinic/import.c.h:_imp_source_hash():_parser static _PyArg_Parser _parser +Python/clinic/sysmodule.c.h:sys_addaudithook():_parser static _PyArg_Parser _parser +Python/clinic/sysmodule.c.h:sys_set_coroutine_origin_tracking_depth():_parser static _PyArg_Parser _parser +Python/clinic/traceback.c.h:tb_new():_parser static _PyArg_Parser _parser diff --git a/Tools/c-analyzer/c-globals.py b/Tools/c-analyzer/c-globals.py new file mode 100644 index 0000000000000000000000000000000000000000..b36b791241d5396243ece0e9eae9e282b043ef35 --- /dev/null +++ b/Tools/c-analyzer/c-globals.py @@ -0,0 +1,9 @@ +# This is a script equivalent of running "python -m test.test_c_globals.cg". + +from cpython.__main__ import parse_args, main + + +# This is effectively copied from cg/__main__.py: +if __name__ == '__main__': + cmd, cmdkwargs = parse_args() + main(cmd, cmdkwargs) diff --git a/Tools/c-analyzer/c_analyzer/__init__.py b/Tools/c-analyzer/c_analyzer/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Tools/c-analyzer/c_analyzer/common/__init__.py b/Tools/c-analyzer/c_analyzer/common/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Tools/c-analyzer/c_analyzer/common/files.py b/Tools/c-analyzer/c_analyzer/common/files.py new file mode 100644 index 0000000000000000000000000000000000000000..a8a044757d00b2bf86693e922a9a6a51cfde0394 --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/common/files.py @@ -0,0 +1,124 @@ +import glob +import os +import os.path + +# XXX need tests: +# * walk_tree() +# * glob_tree() +# * iter_files_by_suffix() + + +C_SOURCE_SUFFIXES = ('.c', '.h') + + +def _walk_tree(root, *, + _walk=os.walk, + ): + # A wrapper around os.walk that resolves the filenames. + for parent, _, names in _walk(root): + for name in names: + yield os.path.join(parent, name) + + +def walk_tree(root, *, + suffix=None, + walk=_walk_tree, + ): + """Yield each file in the tree under the given directory name. + + If "suffix" is provided then only files with that suffix will + be included. + """ + if suffix and not isinstance(suffix, str): + raise ValueError('suffix must be a string') + + for filename in walk(root): + if suffix and not filename.endswith(suffix): + continue + yield filename + + +def glob_tree(root, *, + suffix=None, + _glob=glob.iglob, + _escape=glob.escape, + _join=os.path.join, + ): + """Yield each file in the tree under the given directory name. + + If "suffix" is provided then only files with that suffix will + be included. + """ + suffix = suffix or '' + if not isinstance(suffix, str): + raise ValueError('suffix must be a string') + + for filename in _glob(_join(_escape(root), f'*{suffix}')): + yield filename + for filename in _glob(_join(_escape(root), f'**/*{suffix}')): + yield filename + + +def iter_files(root, suffix=None, relparent=None, *, + get_files=None, + _glob=glob_tree, + _walk=walk_tree, + ): + """Yield each file in the tree under the given directory name. + + If "root" is a non-string iterable then do the same for each of + those trees. + + If "suffix" is provided then only files with that suffix will + be included. + + if "relparent" is provided then it is used to resolve each + filename as a relative path. + """ + if get_files is None: + get_files = os.walk + if not isinstance(root, str): + roots = root + for root in roots: + yield from iter_files(root, suffix, relparent, + get_files=get_files, + _glob=_glob, _walk=_walk) + return + + # Use the right "walk" function. + if get_files in (glob.glob, glob.iglob, glob_tree): + get_files = _glob + else: + _files = _walk_tree if get_files in (os.walk, walk_tree) else get_files + get_files = (lambda *a, **k: _walk(*a, walk=_files, **k)) + + # Handle a single suffix. + if suffix and not isinstance(suffix, str): + filenames = get_files(root) + suffix = tuple(suffix) + else: + filenames = get_files(root, suffix=suffix) + suffix = None + + for filename in filenames: + if suffix and not isinstance(suffix, str): # multiple suffixes + if not filename.endswith(suffix): + continue + if relparent: + filename = os.path.relpath(filename, relparent) + yield filename + + +def iter_files_by_suffix(root, suffixes, relparent=None, *, + walk=walk_tree, + _iter_files=iter_files, + ): + """Yield each file in the tree that has the given suffixes. + + Unlike iter_files(), the results are in the original suffix order. + """ + if isinstance(suffixes, str): + suffixes = [suffixes] + # XXX Ignore repeated suffixes? + for suffix in suffixes: + yield from _iter_files(root, suffix, relparent) diff --git a/Tools/c-analyzer/c_analyzer/common/info.py b/Tools/c-analyzer/c_analyzer/common/info.py new file mode 100644 index 0000000000000000000000000000000000000000..3f3f8c5b05de594916f3f82ca804c02a4a6f5464 --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/common/info.py @@ -0,0 +1,138 @@ +from collections import namedtuple +import re + +from .util import classonly, _NTBase + +# XXX need tests: +# * ID.match() + + +UNKNOWN = '???' + +NAME_RE = re.compile(r'^([a-zA-Z]|_\w*[a-zA-Z]\w*|[a-zA-Z]\w*)$') + + +class ID(_NTBase, namedtuple('ID', 'filename funcname name')): + """A unique ID for a single symbol or declaration.""" + + __slots__ = () + # XXX Add optional conditions (tuple of strings) field. + #conditions = Slot() + + @classonly + def from_raw(cls, raw): + if not raw: + return None + if isinstance(raw, str): + return cls(None, None, raw) + try: + name, = raw + filename = None + except ValueError: + try: + filename, name = raw + except ValueError: + return super().from_raw(raw) + return cls(filename, None, name) + + def __new__(cls, filename, funcname, name): + self = super().__new__( + cls, + filename=str(filename) if filename else None, + funcname=str(funcname) if funcname else None, + name=str(name) if name else None, + ) + #cls.conditions.set(self, tuple(str(s) if s else None + # for s in conditions or ())) + return self + + def validate(self): + """Fail if the object is invalid (i.e. init with bad data).""" + if not self.name: + raise TypeError('missing name') + else: + if not NAME_RE.match(self.name): + raise ValueError( + f'name must be an identifier, got {self.name!r}') + + # Symbols from a binary might not have filename/funcname info. + + if self.funcname: + if not self.filename: + raise TypeError('missing filename') + if not NAME_RE.match(self.funcname) and self.funcname != UNKNOWN: + raise ValueError( + f'name must be an identifier, got {self.funcname!r}') + + # XXX Require the filename (at least UNKONWN)? + # XXX Check the filename? + + @property + def islocal(self): + return self.funcname is not None + + def match(self, other, *, + match_files=(lambda f1, f2: f1 == f2), + ): + """Return True if the two match. + + At least one of the two must be completely valid (no UNKNOWN + anywhere). Otherwise False is returned. The remaining one + *may* have UNKNOWN for both funcname and filename. It must + have a valid name though. + + The caller is responsible for knowing which of the two is valid + (and which to use if both are valid). + """ + # First check the name. + if self.name is None: + return False + if other.name != self.name: + return False + + # Then check the filename. + if self.filename is None: + return False + if other.filename is None: + return False + if self.filename == UNKNOWN: + # "other" must be the valid one. + if other.funcname == UNKNOWN: + return False + elif self.funcname != UNKNOWN: + # XXX Try matching funcname even though we don't + # know the filename? + raise NotImplementedError + else: + return True + elif other.filename == UNKNOWN: + # "self" must be the valid one. + if self.funcname == UNKNOWN: + return False + elif other.funcname != UNKNOWN: + # XXX Try matching funcname even though we don't + # know the filename? + raise NotImplementedError + else: + return True + elif not match_files(self.filename, other.filename): + return False + + # Finally, check the funcname. + if self.funcname == UNKNOWN: + # "other" must be the valid one. + if other.funcname == UNKNOWN: + return False + else: + return other.funcname is not None + elif other.funcname == UNKNOWN: + # "self" must be the valid one. + if self.funcname == UNKNOWN: + return False + else: + return self.funcname is not None + elif self.funcname == other.funcname: + # Both are valid. + return True + + return False diff --git a/Tools/c-analyzer/c_analyzer/common/show.py b/Tools/c-analyzer/c_analyzer/common/show.py new file mode 100644 index 0000000000000000000000000000000000000000..5f3cb1c2fb0b5919945ce695db7732c4e099e257 --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/common/show.py @@ -0,0 +1,11 @@ + +def basic(variables, *, + _print=print): + """Print each row simply.""" + for var in variables: + if var.funcname: + line = f'{var.filename}:{var.funcname}():{var.name}' + else: + line = f'{var.filename}:{var.name}' + line = f'{line:<64} {var.vartype}' + _print(line) diff --git a/Tools/c-analyzer/c_analyzer/common/util.py b/Tools/c-analyzer/c_analyzer/common/util.py new file mode 100644 index 0000000000000000000000000000000000000000..43d0bb6e66565a255a8770061ed5a4de37e196ae --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/common/util.py @@ -0,0 +1,243 @@ +import csv +import subprocess + + +_NOT_SET = object() + + +def run_cmd(argv, **kwargs): + proc = subprocess.run( + argv, + #capture_output=True, + #stderr=subprocess.STDOUT, + stdout=subprocess.PIPE, + text=True, + check=True, + **kwargs + ) + return proc.stdout + + +def read_tsv(infile, header, *, + _open=open, + _get_reader=csv.reader, + ): + """Yield each row of the given TSV (tab-separated) file.""" + if isinstance(infile, str): + with _open(infile, newline='') as infile: + yield from read_tsv(infile, header, + _open=_open, + _get_reader=_get_reader, + ) + return + lines = iter(infile) + + # Validate the header. + try: + actualheader = next(lines).strip() + except StopIteration: + actualheader = '' + if actualheader != header: + raise ValueError(f'bad header {actualheader!r}') + + for row in _get_reader(lines, delimiter='\t'): + yield tuple(v.strip() for v in row) + + +def write_tsv(outfile, header, rows, *, + _open=open, + _get_writer=csv.writer, + ): + """Write each of the rows to the given TSV (tab-separated) file.""" + if isinstance(outfile, str): + with _open(outfile, 'w', newline='') as outfile: + return write_tsv(outfile, header, rows, + _open=_open, + _get_writer=_get_writer, + ) + + if isinstance(header, str): + header = header.split('\t') + writer = _get_writer(outfile, delimiter='\t') + writer.writerow(header) + for row in rows: + writer.writerow('' if v is None else str(v) + for v in row) + + +class Slot: + """A descriptor that provides a slot. + + This is useful for types that can't have slots via __slots__, + e.g. tuple subclasses. + """ + + __slots__ = ('initial', 'default', 'readonly', 'instances', 'name') + + def __init__(self, initial=_NOT_SET, *, + default=_NOT_SET, + readonly=False, + ): + self.initial = initial + self.default = default + self.readonly = readonly + + # The instance cache is not inherently tied to the normal + # lifetime of the instances. So must do something in order to + # avoid keeping the instances alive by holding a reference here. + # Ideally we would use weakref.WeakValueDictionary to do this. + # However, most builtin types do not support weakrefs. So + # instead we monkey-patch __del__ on the attached class to clear + # the instance. + self.instances = {} + self.name = None + + def __set_name__(self, cls, name): + if self.name is not None: + raise TypeError('already used') + self.name = name + try: + slotnames = cls.__slot_names__ + except AttributeError: + slotnames = cls.__slot_names__ = [] + slotnames.append(name) + self._ensure___del__(cls, slotnames) + + def __get__(self, obj, cls): + if obj is None: # called on the class + return self + try: + value = self.instances[id(obj)] + except KeyError: + if self.initial is _NOT_SET: + value = self.default + else: + value = self.initial + self.instances[id(obj)] = value + if value is _NOT_SET: + raise AttributeError(self.name) + # XXX Optionally make a copy? + return value + + def __set__(self, obj, value): + if self.readonly: + raise AttributeError(f'{self.name} is readonly') + # XXX Optionally coerce? + self.instances[id(obj)] = value + + def __delete__(self, obj): + if self.readonly: + raise AttributeError(f'{self.name} is readonly') + self.instances[id(obj)] = self.default # XXX refleak? + + def _ensure___del__(self, cls, slotnames): # See the comment in __init__(). + try: + old___del__ = cls.__del__ + except AttributeError: + old___del__ = (lambda s: None) + else: + if getattr(old___del__, '_slotted', False): + return + + def __del__(_self): + for name in slotnames: + delattr(_self, name) + old___del__(_self) + __del__._slotted = True + cls.__del__ = __del__ + + def set(self, obj, value): + """Update the cached value for an object. + + This works even if the descriptor is read-only. This is + particularly useful when initializing the object (e.g. in + its __new__ or __init__). + """ + self.instances[id(obj)] = value + + +class classonly: + """A non-data descriptor that makes a value only visible on the class. + + This is like the "classmethod" builtin, but does not show up on + instances of the class. It may be used as a decorator. + """ + + def __init__(self, value): + self.value = value + self.getter = classmethod(value).__get__ + self.name = None + + def __set_name__(self, cls, name): + if self.name is not None: + raise TypeError('already used') + self.name = name + + def __get__(self, obj, cls): + if obj is not None: + raise AttributeError(self.name) + # called on the class + return self.getter(None, cls) + + +class _NTBase: + + __slots__ = () + + @classonly + def from_raw(cls, raw): + if not raw: + return None + elif isinstance(raw, cls): + return raw + elif isinstance(raw, str): + return cls.from_string(raw) + else: + if hasattr(raw, 'items'): + return cls(**raw) + try: + args = tuple(raw) + except TypeError: + pass + else: + return cls(*args) + raise NotImplementedError + + @classonly + def from_string(cls, value): + """Return a new instance based on the given string.""" + raise NotImplementedError + + @classmethod + def _make(cls, iterable): # The default _make() is not subclass-friendly. + return cls.__new__(cls, *iterable) + + # XXX Always validate? + #def __init__(self, *args, **kwargs): + # self.validate() + + # XXX The default __repr__() is not subclass-friendly (where the name changes). + #def __repr__(self): + # _, _, sig = super().__repr__().partition('(') + # return f'{self.__class__.__name__}({sig}' + + # To make sorting work with None: + def __lt__(self, other): + try: + return super().__lt__(other) + except TypeError: + if None in self: + return True + elif None in other: + return False + else: + raise + + def validate(self): + return + + # XXX Always validate? + #def _replace(self, **kwargs): + # obj = super()._replace(**kwargs) + # obj.validate() + # return obj diff --git a/Tools/c-analyzer/c_analyzer/parser/__init__.py b/Tools/c-analyzer/c_analyzer/parser/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Tools/c-analyzer/c_analyzer/parser/declarations.py b/Tools/c-analyzer/c_analyzer/parser/declarations.py new file mode 100644 index 0000000000000000000000000000000000000000..f37072cccad8641aeee948e962242b27a90b857a --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/parser/declarations.py @@ -0,0 +1,339 @@ +import re +import shlex +import subprocess + +from ..common.info import UNKNOWN + +from . import source + + +IDENTIFIER = r'(?:[a-zA-z]|_+[a-zA-Z0-9]\w*)' + +TYPE_QUAL = r'(?:const|volatile)' + +VAR_TYPE_SPEC = r'''(?: + void | + (?: + (?:(?:un)?signed\s+)? + (?: + char | + short | + int | + long | + long\s+int | + long\s+long + ) | + ) | + float | + double | + {IDENTIFIER} | + (?:struct|union)\s+{IDENTIFIER} + )''' + +POINTER = rf'''(?: + (?:\s+const)?\s*[*] + )''' + +#STRUCT = r'''(?: +# (?:struct|(struct\s+%s))\s*[{] +# [^}]* +# [}] +# )''' % (IDENTIFIER) +#UNION = r'''(?: +# (?:union|(union\s+%s))\s*[{] +# [^}]* +# [}] +# )''' % (IDENTIFIER) +#DECL_SPEC = rf'''(?: +# ({VAR_TYPE_SPEC}) | +# ({STRUCT}) | +# ({UNION}) +# )''' + +FUNC_START = rf'''(?: + (?: + (?: + extern | + static | + static\s+inline + )\s+ + )? + #(?:const\s+)? + {VAR_TYPE_SPEC} + )''' +#GLOBAL_VAR_START = rf'''(?: +# (?: +# (?: +# extern | +# static +# )\s+ +# )? +# (?: +# {TYPE_QUAL} +# (?:\s+{TYPE_QUAL})? +# )?\s+ +# {VAR_TYPE_SPEC} +# )''' +GLOBAL_DECL_START_RE = re.compile(rf''' + ^ + (?: + ({FUNC_START}) + ) + ''', re.VERBOSE) + +LOCAL_VAR_START = rf'''(?: + (?: + (?: + register | + static + )\s+ + )? + (?: + (?: + {TYPE_QUAL} + (?:\s+{TYPE_QUAL})? + )\s+ + )? + {VAR_TYPE_SPEC} + {POINTER}? + )''' +LOCAL_STMT_START_RE = re.compile(rf''' + ^ + (?: + ({LOCAL_VAR_START}) + ) + ''', re.VERBOSE) + + +def iter_global_declarations(lines): + """Yield (decl, body) for each global declaration in the given lines. + + For function definitions the header is reduced to one line and + the body is provided as-is. For other compound declarations (e.g. + struct) the entire declaration is reduced to one line and "body" + is None. Likewise for simple declarations (e.g. variables). + + Declarations inside function bodies are ignored, though their text + is provided in the function body. + """ + # XXX Bail out upon bogus syntax. + lines = source.iter_clean_lines(lines) + for line in lines: + if not GLOBAL_DECL_START_RE.match(line): + continue + # We only need functions here, since we only need locals for now. + if line.endswith(';'): + continue + if line.endswith('{') and '(' not in line: + continue + + # Capture the function. + # (assume no func is a one-liner) + decl = line + while '{' not in line: # assume no inline structs, etc. + try: + line = next(lines) + except StopIteration: + return + decl += ' ' + line + + body, end = _extract_block(lines) + if end is None: + return + assert end == '}' + yield (f'{decl}\n{body}\n{end}', body) + + +def iter_local_statements(lines): + """Yield (lines, blocks) for each statement in the given lines. + + For simple statements, "blocks" is None and the statement is reduced + to a single line. For compound statements, "blocks" is a pair of + (header, body) for each block in the statement. The headers are + reduced to a single line each, but the bpdies are provided as-is. + """ + # XXX Bail out upon bogus syntax. + lines = source.iter_clean_lines(lines) + for line in lines: + if not LOCAL_STMT_START_RE.match(line): + continue + + stmt = line + blocks = None + if not line.endswith(';'): + # XXX Support compound & multiline simple statements. + #blocks = [] + continue + + yield (stmt, blocks) + + +def _extract_block(lines): + end = None + depth = 1 + body = [] + for line in lines: + depth += line.count('{') - line.count('}') + if depth == 0: + end = line + break + body.append(line) + return '\n'.join(body), end + + +def parse_func(stmt, body): + """Return (name, signature) for the given function definition.""" + header, _, end = stmt.partition(body) + assert end.strip() == '}' + assert header.strip().endswith('{') + header, _, _= header.rpartition('{') + + signature = ' '.join(header.strip().splitlines()) + + _, _, name = signature.split('(')[0].strip().rpartition(' ') + assert name + + return name, signature + + +#TYPE_SPEC = rf'''(?: +# )''' +#VAR_DECLARATOR = rf'''(?: +# )''' +#VAR_DECL = rf'''(?: +# {TYPE_SPEC}+ +# {VAR_DECLARATOR} +# \s* +# )''' +#VAR_DECLARATION = rf'''(?: +# {VAR_DECL} +# (?: = [^=] [^;]* )? +# ; +# )''' +# +# +#def parse_variable(decl, *, inFunc=False): +# """Return [(name, storage, vartype)] for the given variable declaration.""" +# ... + + +def _parse_var(stmt): + """Return (name, vartype) for the given variable declaration.""" + stmt = stmt.rstrip(';') + m = LOCAL_STMT_START_RE.match(stmt) + assert m + vartype = m.group(0) + name = stmt[len(vartype):].partition('=')[0].strip() + + if name.startswith('('): + name, _, after = name[1:].partition(')') + assert after + name = name.replace('*', '* ') + inside, _, name = name.strip().rpartition(' ') + vartype = f'{vartype} ({inside.strip()}){after}' + else: + name = name.replace('*', '* ') + before, _, name = name.rpartition(' ') + vartype = f'{vartype} {before}' + + vartype = vartype.strip() + while ' ' in vartype: + vartype = vartype.replace(' ', ' ') + + return name, vartype + + +def extract_storage(decl, *, infunc=None): + """Return (storage, vartype) based on the given declaration. + + The default storage is "implicit" (or "local" if infunc is True). + """ + if decl == UNKNOWN: + return decl + if decl.startswith('static '): + return 'static' + #return 'static', decl.partition(' ')[2].strip() + elif decl.startswith('extern '): + return 'extern' + #return 'extern', decl.partition(' ')[2].strip() + elif re.match('.*\b(static|extern)\b', decl): + raise NotImplementedError + elif infunc: + return 'local' + else: + return 'implicit' + + +def parse_compound(stmt, blocks): + """Return (headers, bodies) for the given compound statement.""" + # XXX Identify declarations inside compound statements + # (if/switch/for/while). + raise NotImplementedError + + +def iter_variables(filename, *, + preprocessed=False, + _iter_source_lines=source.iter_lines, + _iter_global=iter_global_declarations, + _iter_local=iter_local_statements, + _parse_func=parse_func, + _parse_var=_parse_var, + _parse_compound=parse_compound, + ): + """Yield (funcname, name, vartype) for every variable in the given file.""" + if preprocessed: + raise NotImplementedError + lines = _iter_source_lines(filename) + for stmt, body in _iter_global(lines): + # At the file top-level we only have to worry about vars & funcs. + if not body: + name, vartype = _parse_var(stmt) + if name: + yield (None, name, vartype) + else: + funcname, _ = _parse_func(stmt, body) + localvars = _iter_locals(body, + _iter_statements=_iter_local, + _parse_var=_parse_var, + _parse_compound=_parse_compound, + ) + for name, vartype in localvars: + yield (funcname, name, vartype) + + +def _iter_locals(lines, *, + _iter_statements=iter_local_statements, + _parse_var=_parse_var, + _parse_compound=parse_compound, + ): + compound = [lines] + while compound: + body = compound.pop(0) + bodylines = body.splitlines() + for stmt, blocks in _iter_statements(bodylines): + if not blocks: + name, vartype = _parse_var(stmt) + if name: + yield (name, vartype) + else: + headers, bodies = _parse_compound(stmt, blocks) + for header in headers: + for line in header: + name, vartype = _parse_var(line) + if name: + yield (name, vartype) + compound.extend(bodies) + + +def iter_all(filename, *, + preprocessed=False, + ): + """Yield a Declaration for each one found. + + If there are duplicates, due to preprocessor conditionals, then + they are checked to make sure they are the same. + """ + # XXX For the moment we cheat. + for funcname, name, decl in iter_variables(filename, + preprocessed=preprocessed): + yield 'variable', funcname, name, decl diff --git a/Tools/c-analyzer/c_analyzer/parser/find.py b/Tools/c-analyzer/c_analyzer/parser/find.py new file mode 100644 index 0000000000000000000000000000000000000000..3860d3d459b18df7d73ab65204d2e48bac5fd17d --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/parser/find.py @@ -0,0 +1,107 @@ +from ..common.info import UNKNOWN, ID + +from . import declarations + +# XXX need tests: +# * variables +# * variable +# * variable_from_id + + +def _iter_vars(filenames, preprocessed, *, + handle_id=None, + _iter_decls=declarations.iter_all, + ): + if handle_id is None: + handle_id = ID + + for filename in filenames or (): + for kind, funcname, name, decl in _iter_decls(filename, + preprocessed=preprocessed, + ): + if kind != 'variable': + continue + varid = handle_id(filename, funcname, name) + yield varid, decl + + +# XXX Add a "handle_var" arg like we did for get_resolver()? + +def variables(*filenames, + perfilecache=None, + preprocessed=False, + known=None, # for types + handle_id=None, + _iter_vars=_iter_vars, + ): + """Yield (varid, decl) for each variable found in the given files. + + If "preprocessed" is provided (and not False/None) then it is used + to decide which tool to use to parse the source code after it runs + through the C preprocessor. Otherwise the raw + """ + if len(filenames) == 1 and not (filenames[0], str): + filenames, = filenames + + if perfilecache is None: + yield from _iter_vars(filenames, preprocessed) + else: + # XXX Cache per-file variables (e.g. `{filename: [(varid, decl)]}`). + raise NotImplementedError + + +def variable(name, filenames, *, + local=False, + perfilecache=None, + preprocessed=False, + handle_id=None, + _iter_vars=variables, + ): + """Return (varid, decl) for the first found variable that matches. + + If "local" is True then the first matching local variable in the + file will always be returned. To avoid that, pass perfilecache and + pop each variable from the cache after using it. + """ + for varid, decl in _iter_vars(filenames, + perfilecache=perfilecache, + preprocessed=preprocessed, + ): + if varid.name != name: + continue + if local: + if varid.funcname: + if varid.funcname == UNKNOWN: + raise NotImplementedError + return varid, decl + elif not varid.funcname: + return varid, decl + else: + return None, None # No matching variable was found. + + +def variable_from_id(id, filenames, *, + perfilecache=None, + preprocessed=False, + handle_id=None, + _get_var=variable, + ): + """Return (varid, decl) for the first found variable that matches.""" + local = False + if isinstance(id, str): + name = id + else: + if id.funcname == UNKNOWN: + local = True + elif id.funcname: + raise NotImplementedError + + name = id.name + if id.filename and id.filename != UNKNOWN: + filenames = [id.filename] + return _get_var(name, filenames, + local=local, + perfilecache=perfilecache, + preprocessed=preprocessed, + handle_id=handle_id, + ) diff --git a/Tools/c-analyzer/c_analyzer/parser/naive.py b/Tools/c-analyzer/c_analyzer/parser/naive.py new file mode 100644 index 0000000000000000000000000000000000000000..4a4822d84ff54d9264617e211b9f765c88285527 --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/parser/naive.py @@ -0,0 +1,179 @@ +import re + +from ..common.info import UNKNOWN, ID + +from .preprocessor import _iter_clean_lines + + +_NOT_SET = object() + + +def get_srclines(filename, *, + cache=None, + _open=open, + _iter_lines=_iter_clean_lines, + ): + """Return the file's lines as a list. + + Each line will have trailing whitespace removed (including newline). + + If a cache is given the it is used. + """ + if cache is not None: + try: + return cache[filename] + except KeyError: + pass + + with _open(filename) as srcfile: + srclines = [line + for _, line in _iter_lines(srcfile) + if not line.startswith('#')] + for i, line in enumerate(srclines): + srclines[i] = line.rstrip() + + if cache is not None: + cache[filename] = srclines + return srclines + + +def parse_variable_declaration(srcline): + """Return (name, decl) for the given declaration line.""" + # XXX possible false negatives... + decl, sep, _ = srcline.partition('=') + if not sep: + if not srcline.endswith(';'): + return None, None + decl = decl.strip(';') + decl = decl.strip() + m = re.match(r'.*\b(\w+)\s*(?:\[[^\]]*\])?$', decl) + if not m: + return None, None + name = m.group(1) + return name, decl + + +def parse_variable(srcline, funcname=None): + """Return (varid, decl) for the variable declared on the line (or None).""" + line = srcline.strip() + + # XXX Handle more than just static variables. + if line.startswith('static '): + if '(' in line and '[' not in line: + # a function + return None, None + return parse_variable_declaration(line) + else: + return None, None + + +def iter_variables(filename, *, + srccache=None, + parse_variable=None, + _get_srclines=get_srclines, + _default_parse_variable=parse_variable, + ): + """Yield (varid, decl) for each variable in the given source file.""" + if parse_variable is None: + parse_variable = _default_parse_variable + + indent = '' + prev = '' + funcname = None + for line in _get_srclines(filename, cache=srccache): + # remember current funcname + if funcname: + if line == indent + '}': + funcname = None + continue + else: + if '(' in prev and line == indent + '{': + if not prev.startswith('__attribute__'): + funcname = prev.split('(')[0].split()[-1] + prev = '' + continue + indent = line[:-len(line.lstrip())] + prev = line + + info = parse_variable(line, funcname) + if isinstance(info, list): + for name, _funcname, decl in info: + yield ID(filename, _funcname, name), decl + continue + name, decl = info + + if name is None: + continue + yield ID(filename, funcname, name), decl + + +def _match_varid(variable, name, funcname, ignored=None): + if ignored and variable in ignored: + return False + + if variable.name != name: + return False + + if funcname == UNKNOWN: + if not variable.funcname: + return False + elif variable.funcname != funcname: + return False + + return True + + +def find_variable(filename, funcname, name, *, + ignored=None, + srccache=None, # {filename: lines} + parse_variable=None, + _iter_variables=iter_variables, + ): + """Return the matching variable. + + Return None if the variable is not found. + """ + for varid, decl in _iter_variables(filename, + srccache=srccache, + parse_variable=parse_variable, + ): + if _match_varid(varid, name, funcname, ignored): + return varid, decl + else: + return None + + +def find_variables(varids, filenames=None, *, + srccache=_NOT_SET, + parse_variable=None, + _find_symbol=find_variable, + ): + """Yield (varid, decl) for each ID. + + If the variable is not found then its decl will be UNKNOWN. That + way there will be one resulting variable per given ID. + """ + if srccache is _NOT_SET: + srccache = {} + + used = set() + for varid in varids: + if varid.filename and varid.filename != UNKNOWN: + srcfiles = [varid.filename] + else: + if not filenames: + yield varid, UNKNOWN + continue + srcfiles = filenames + for filename in srcfiles: + varid, decl = _find_varid(filename, varid.funcname, varid.name, + ignored=used, + srccache=srccache, + parse_variable=parse_variable, + ) + if varid: + yield varid, decl + used.add(varid) + break + else: + yield varid, UNKNOWN diff --git a/Tools/c-analyzer/c_analyzer/parser/preprocessor.py b/Tools/c-analyzer/c_analyzer/parser/preprocessor.py new file mode 100644 index 0000000000000000000000000000000000000000..41f306e5f8022bd142ba7f0edaafde1193b8afc1 --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/parser/preprocessor.py @@ -0,0 +1,511 @@ +from collections import namedtuple +import shlex +import os +import re + +from ..common import util, info + + +CONTINUATION = '\\' + os.linesep + +IDENTIFIER = r'(?:\w*[a-zA-Z]\w*)' +IDENTIFIER_RE = re.compile('^' + IDENTIFIER + '$') + + +def _coerce_str(value): + if not value: + return '' + return str(value).strip() + + +############################# +# directives + +DIRECTIVE_START = r''' + (?: + ^ \s* + [#] \s* + )''' +DIRECTIVE_TEXT = r''' + (?: + (?: \s+ ( .*\S ) )? + \s* $ + )''' +DIRECTIVE = rf''' + (?: + {DIRECTIVE_START} + ( + include | + error | warning | + pragma | + define | undef | + if | ifdef | ifndef | elseif | else | endif | + __FILE__ | __LINE__ | __DATE __ | __TIME__ | __TIMESTAMP__ + ) + {DIRECTIVE_TEXT} + )''' +# (?: +# [^\\\n] | +# \\ [^\n] | +# \\ \n +# )+ +# ) \n +# )''' +DIRECTIVE_RE = re.compile(DIRECTIVE, re.VERBOSE) + +DEFINE = rf''' + (?: + {DIRECTIVE_START} define \s+ + (?: + ( \w*[a-zA-Z]\w* ) + (?: \s* [(] ([^)]*) [)] )? + ) + {DIRECTIVE_TEXT} + )''' +DEFINE_RE = re.compile(DEFINE, re.VERBOSE) + + +def parse_directive(line): + """Return the appropriate directive for the given line.""" + line = line.strip() + if line.startswith('#'): + line = line[1:].lstrip() + line = '#' + line + directive = line + #directive = '#' + line + while ' ' in directive: + directive = directive.replace(' ', ' ') + return _parse_directive(directive) + + +def _parse_directive(line): + m = DEFINE_RE.match(line) + if m: + name, args, text = m.groups() + if args: + args = [a.strip() for a in args.split(',')] + return Macro(name, args, text) + else: + return Constant(name, text) + + m = DIRECTIVE_RE.match(line) + if not m: + raise ValueError(f'unsupported directive {line!r}') + kind, text = m.groups() + if not text: + if kind not in ('else', 'endif'): + raise ValueError(f'missing text in directive {line!r}') + elif kind in ('else', 'endif', 'define'): + raise ValueError(f'unexpected text in directive {line!r}') + if kind == 'include': + directive = Include(text) + elif kind in IfDirective.KINDS: + directive = IfDirective(kind, text) + else: + directive = OtherDirective(kind, text) + directive.validate() + return directive + + +class PreprocessorDirective(util._NTBase): + """The base class for directives.""" + + __slots__ = () + + KINDS = frozenset([ + 'include', + 'pragma', + 'error', 'warning', + 'define', 'undef', + 'if', 'ifdef', 'ifndef', 'elseif', 'else', 'endif', + '__FILE__', '__DATE__', '__LINE__', '__TIME__', '__TIMESTAMP__', + ]) + + @property + def text(self): + return ' '.join(v for v in self[1:] if v and v.strip()) or None + + def validate(self): + """Fail if the object is invalid (i.e. init with bad data).""" + super().validate() + + if not self.kind: + raise TypeError('missing kind') + elif self.kind not in self.KINDS: + raise ValueError + + # text can be anything, including None. + + +class Constant(PreprocessorDirective, + namedtuple('Constant', 'kind name value')): + """A single "constant" directive ("define").""" + + __slots__ = () + + def __new__(cls, name, value=None): + self = super().__new__( + cls, + 'define', + name=_coerce_str(name) or None, + value=_coerce_str(value) or None, + ) + return self + + def validate(self): + """Fail if the object is invalid (i.e. init with bad data).""" + super().validate() + + if not self.name: + raise TypeError('missing name') + elif not IDENTIFIER_RE.match(self.name): + raise ValueError(f'name must be identifier, got {self.name!r}') + + # value can be anything, including None + + +class Macro(PreprocessorDirective, + namedtuple('Macro', 'kind name args body')): + """A single "macro" directive ("define").""" + + __slots__ = () + + def __new__(cls, name, args, body=None): + # "args" must be a string or an iterable of strings (or "empty"). + if isinstance(args, str): + args = [v.strip() for v in args.split(',')] + if args: + args = tuple(_coerce_str(a) or None for a in args) + self = super().__new__( + cls, + kind='define', + name=_coerce_str(name) or None, + args=args if args else (), + body=_coerce_str(body) or None, + ) + return self + + @property + def text(self): + if self.body: + return f'{self.name}({", ".join(self.args)}) {self.body}' + else: + return f'{self.name}({", ".join(self.args)})' + + def validate(self): + """Fail if the object is invalid (i.e. init with bad data).""" + super().validate() + + if not self.name: + raise TypeError('missing name') + elif not IDENTIFIER_RE.match(self.name): + raise ValueError(f'name must be identifier, got {self.name!r}') + + for arg in self.args: + if not arg: + raise ValueError(f'missing arg in {self.args}') + elif not IDENTIFIER_RE.match(arg): + raise ValueError(f'arg must be identifier, got {arg!r}') + + # body can be anything, including None + + +class IfDirective(PreprocessorDirective, + namedtuple('IfDirective', 'kind condition')): + """A single conditional directive (e.g. "if", "ifdef"). + + This only includes directives that actually provide conditions. The + related directives "else" and "endif" are covered by OtherDirective + instead. + """ + + __slots__ = () + + KINDS = frozenset([ + 'if', + 'ifdef', + 'ifndef', + 'elseif', + ]) + + @classmethod + def _condition_from_raw(cls, raw, kind): + #return Condition.from_raw(raw, _kind=kind) + condition = _coerce_str(raw) + if not condition: + return None + + if kind == 'ifdef': + condition = f'defined({condition})' + elif kind == 'ifndef': + condition = f'! defined({condition})' + + return condition + + def __new__(cls, kind, condition): + kind = _coerce_str(kind) + self = super().__new__( + cls, + kind=kind or None, + condition=cls._condition_from_raw(condition, kind), + ) + return self + + @property + def text(self): + if self.kind == 'ifdef': + return self.condition[8:-1] # strip "defined(" + elif self.kind == 'ifndef': + return self.condition[10:-1] # strip "! defined(" + else: + return self.condition + #return str(self.condition) + + def validate(self): + """Fail if the object is invalid (i.e. init with bad data).""" + super().validate() + + if not self.condition: + raise TypeError('missing condition') + #else: + # for cond in self.condition: + # if not cond: + # raise ValueError(f'missing condition in {self.condition}') + # cond.validate() + # if self.kind in ('ifdef', 'ifndef'): + # if len(self.condition) != 1: + # raise ValueError('too many condition') + # if self.kind == 'ifdef': + # if not self.condition[0].startswith('defined '): + # raise ValueError('bad condition') + # else: + # if not self.condition[0].startswith('! defined '): + # raise ValueError('bad condition') + + +class Include(PreprocessorDirective, + namedtuple('Include', 'kind file')): + """A single "include" directive. + + Supported "file" values are either follow the bracket style + () or double quotes ("spam.h"). + """ + + __slots__ = () + + def __new__(cls, file): + self = super().__new__( + cls, + kind='include', + file=_coerce_str(file) or None, + ) + return self + + def validate(self): + """Fail if the object is invalid (i.e. init with bad data).""" + super().validate() + + if not self.file: + raise TypeError('missing file') + + +class OtherDirective(PreprocessorDirective, + namedtuple('OtherDirective', 'kind text')): + """A single directive not covered by another class. + + This includes the "else", "endif", and "undef" directives, which are + otherwise inherently related to the directives covered by the + Constant, Macro, and IfCondition classes. + + Note that all directives must have a text value, except for "else" + and "endif" (which must have no text). + """ + + __slots__ = () + + KINDS = PreprocessorDirective.KINDS - {'include', 'define'} - IfDirective.KINDS + + def __new__(cls, kind, text): + self = super().__new__( + cls, + kind=_coerce_str(kind) or None, + text=_coerce_str(text) or None, + ) + return self + + def validate(self): + """Fail if the object is invalid (i.e. init with bad data).""" + super().validate() + + if self.text: + if self.kind in ('else', 'endif'): + raise ValueError('unexpected text in directive') + elif self.kind not in ('else', 'endif'): + raise TypeError('missing text') + + +############################# +# iterating lines + +def _recompute_conditions(directive, ifstack): + if directive.kind in ('if', 'ifdef', 'ifndef'): + ifstack.append( + ([], directive.condition)) + elif directive.kind == 'elseif': + if ifstack: + negated, active = ifstack.pop() + if active: + negated.append(active) + else: + negated = [] + ifstack.append( + (negated, directive.condition)) + elif directive.kind == 'else': + if ifstack: + negated, active = ifstack.pop() + if active: + negated.append(active) + ifstack.append( + (negated, None)) + elif directive.kind == 'endif': + if ifstack: + ifstack.pop() + + conditions = [] + for negated, active in ifstack: + for condition in negated: + conditions.append(f'! ({condition})') + if active: + conditions.append(active) + return tuple(conditions) + + +def _iter_clean_lines(lines): + lines = iter(enumerate(lines, 1)) + for lno, line in lines: + # Handle line continuations. + while line.endswith(CONTINUATION): + try: + lno, _line = next(lines) + except StopIteration: + break + line = line[:-len(CONTINUATION)] + ' ' + _line + + # Deal with comments. + after = line + line = '' + while True: + # Look for a comment. + before, begin, remainder = after.partition('/*') + if '//' in before: + before, _, _ = before.partition('//') + line += before + ' ' # per the C99 spec + break + line += before + if not begin: + break + line += ' ' # per the C99 spec + + # Go until we find the end of the comment. + _, end, after = remainder.partition('*/') + while not end: + try: + lno, remainder = next(lines) + except StopIteration: + raise Exception('unterminated comment') + _, end, after = remainder.partition('*/') + + yield lno, line + + +def iter_lines(lines, *, + _iter_clean_lines=_iter_clean_lines, + _parse_directive=_parse_directive, + _recompute_conditions=_recompute_conditions, + ): + """Yield (lno, line, directive, active conditions) for each given line. + + This is effectively a subset of the operations taking place in + translation phases 2-4 from the C99 spec (ISO/IEC 9899:TC2); see + section 5.1.1.2. Line continuations are removed and comments + replaced with a single space. (In both cases "lno" will be the last + line involved.) Otherwise each line is returned as-is. + + "lno" is the (1-indexed) line number for the line. + + "directive" will be a PreprocessorDirective or None, depending on + whether or not there is a directive on the line. + + "active conditions" is the set of preprocessor conditions (e.g. + "defined()") under which the current line of code will be included + in compilation. That set is derived from every conditional + directive block (e.g. "if defined()", "ifdef", "else") containing + that line. That includes nested directives. Note that the + current line does not affect the active conditions for iteself. + It only impacts subsequent lines. That applies to directives + that close blocks (e.g. "endif") just as much as conditional + directvies. Also note that "else" and "elseif" directives + update the active conditions (for later lines), rather than + adding to them. + """ + ifstack = [] + conditions = () + for lno, line in _iter_clean_lines(lines): + stripped = line.strip() + if not stripped.startswith('#'): + yield lno, line, None, conditions + continue + + directive = '#' + stripped[1:].lstrip() + while ' ' in directive: + directive = directive.replace(' ', ' ') + directive = _parse_directive(directive) + yield lno, line, directive, conditions + + if directive.kind in ('else', 'endif'): + conditions = _recompute_conditions(directive, ifstack) + elif isinstance(directive, IfDirective): + conditions = _recompute_conditions(directive, ifstack) + + +############################# +# running (platform-specific?) + +def _gcc(filename, *, + _get_argv=(lambda: _get_gcc_argv()), + _run=util.run_cmd, + ): + argv = _get_argv() + argv.extend([ + '-E', filename, + ]) + output = _run(argv) + return output + + +def _get_gcc_argv(*, + _open=open, + _run=util.run_cmd, + ): + with _open('/tmp/print.mk', 'w') as tmpfile: + tmpfile.write('print-%:\n') + #tmpfile.write('\t@echo $* = $($*)\n') + tmpfile.write('\t@echo $($*)\n') + argv = ['/usr/bin/make', + '-f', 'Makefile', + '-f', '/tmp/print.mk', + 'print-CC', + 'print-PY_CORE_CFLAGS', + ] + output = _run(argv) + gcc, cflags = output.strip().splitlines() + argv = shlex.split(gcc.strip()) + cflags = shlex.split(cflags.strip()) + return argv + cflags + + +def run(filename, *, + _gcc=_gcc, + ): + """Return the text of the given file after running the preprocessor.""" + return _gcc(filename) diff --git a/Tools/c-analyzer/c_analyzer/parser/source.py b/Tools/c-analyzer/c_analyzer/parser/source.py new file mode 100644 index 0000000000000000000000000000000000000000..f8998c8a338b20a79890c457e62b5af8e066a409 --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/parser/source.py @@ -0,0 +1,34 @@ +from . import preprocessor + + +def iter_clean_lines(lines): + incomment = False + for line in lines: + # Deal with comments. + if incomment: + _, sep, line = line.partition('*/') + if sep: + incomment = False + continue + line, _, _ = line.partition('//') + line, sep, remainder = line.partition('/*') + if sep: + _, sep, after = remainder.partition('*/') + if not sep: + incomment = True + continue + line += ' ' + after + + # Ignore blank lines and leading/trailing whitespace. + line = line.strip() + if not line: + continue + + yield line + + +def iter_lines(filename, *, + preprocess=preprocessor.run, + ): + content = preprocess(filename) + return iter(content.splitlines()) diff --git a/Tools/c-analyzer/c_analyzer/symbols/__init__.py b/Tools/c-analyzer/c_analyzer/symbols/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Tools/c-analyzer/c_analyzer/symbols/_nm.py b/Tools/c-analyzer/c_analyzer/symbols/_nm.py new file mode 100644 index 0000000000000000000000000000000000000000..f3a75a6d4ba8241900e94a8c8f52df7327ebc3a8 --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/symbols/_nm.py @@ -0,0 +1,117 @@ +import os.path +import shutil + +from c_analyzer.common import util, info + +from .info import Symbol + + +# XXX need tests: +# * iter_symbols + +NM_KINDS = { + 'b': Symbol.KIND.VARIABLE, # uninitialized + 'd': Symbol.KIND.VARIABLE, # initialized + #'g': Symbol.KIND.VARIABLE, # uninitialized + #'s': Symbol.KIND.VARIABLE, # initialized + 't': Symbol.KIND.FUNCTION, + } + +SPECIAL_SYMBOLS = { + # binary format (e.g. ELF) + '__bss_start', + '__data_start', + '__dso_handle', + '_DYNAMIC', + '_edata', + '_end', + '__environ@@GLIBC_2.2.5', + '_GLOBAL_OFFSET_TABLE_', + '__JCR_END__', + '__JCR_LIST__', + '__TMC_END__', + } + + +def _is_special_symbol(name): + if name in SPECIAL_SYMBOLS: + return True + if '@@GLIBC' in name: + return True + return False + + +def iter_symbols(binfile, *, + nm=None, + handle_id=None, + _which=shutil.which, + _run=util.run_cmd, + ): + """Yield a Symbol for each relevant entry reported by the "nm" command.""" + if nm is None: + nm = _which('nm') + if not nm: + raise NotImplementedError + if handle_id is None: + handle_id = info.ID + + argv = [nm, + '--line-numbers', + binfile, + ] + try: + output = _run(argv) + except Exception: + if nm is None: + # XXX Use dumpbin.exe /SYMBOLS on Windows. + raise NotImplementedError + raise + for line in output.splitlines(): + (name, kind, external, filename, funcname, + ) = _parse_nm_line(line) + if kind != Symbol.KIND.VARIABLE: + continue + elif _is_special_symbol(name): + continue + yield Symbol( + id=handle_id(filename, funcname, name), + kind=kind, + external=external, + ) + + +def _parse_nm_line(line): + _origline = line + _, _, line = line.partition(' ') # strip off the address + line = line.strip() + + kind, _, line = line.partition(' ') + line = line.strip() + external = kind.isupper() + kind = NM_KINDS.get(kind.lower(), Symbol.KIND.OTHER) + + name, _, filename = line.partition('\t') + name = name.strip() + if filename: + filename = os.path.relpath(filename.partition(':')[0]) + else: + filename = info.UNKNOWN + + name, islocal = _parse_nm_name(name, kind) + funcname = info.UNKNOWN if islocal else None + return name, kind, external, filename, funcname + + +def _parse_nm_name(name, kind): + if kind != Symbol.KIND.VARIABLE: + return name, None + if _is_special_symbol(name): + return name, None + + actual, sep, digits = name.partition('.') + if not sep: + return name, False + + if not digits.isdigit(): + raise Exception(f'got bogus name {name}') + return actual, True diff --git a/Tools/c-analyzer/c_analyzer/symbols/find.py b/Tools/c-analyzer/c_analyzer/symbols/find.py new file mode 100644 index 0000000000000000000000000000000000000000..85646523f7a60b1567228556be364945ff51cf7e --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/symbols/find.py @@ -0,0 +1,175 @@ +import os +import os.path +import shutil + +from ..common import files +from ..common.info import UNKNOWN, ID +from ..parser import find as p_find + +from . import _nm +from .info import Symbol + +# XXX need tests: +# * get_resolver() +# * get_resolver_from_dirs() +# * symbol() +# * symbols() +# * variables() + + +def _resolve_known(symbol, knownvars): + for varid in knownvars: + if symbol.match(varid): + break + else: + return None + return knownvars.pop(varid) + + +def get_resolver(filenames=None, known=None, *, + handle_var, + check_filename=None, + perfilecache=None, + preprocessed=False, + _from_source=p_find.variable_from_id, + ): + """Return a "resolver" func for the given known vars/types and filenames. + + "handle_var" is a callable that takes (ID, decl) and returns a + Variable. Variable.from_id is a suitable callable. + + The returned func takes a single Symbol and returns a corresponding + Variable. If the symbol was located then the variable will be + valid, populated with the corresponding information. Otherwise None + is returned. + """ + knownvars = (known or {}).get('variables') + if knownvars: + knownvars = dict(knownvars) # a copy + if filenames: + if check_filename is None: + filenames = list(filenames) + def check_filename(filename): + return filename in filenames + def resolve(symbol): + # XXX Check "found" instead? + if not check_filename(symbol.filename): + return None + found = _resolve_known(symbol, knownvars) + if found is None: + #return None + varid, decl = _from_source(symbol, filenames, + perfilecache=perfilecache, + preprocessed=preprocessed, + ) + found = handle_var(varid, decl) + return found + else: + def resolve(symbol): + return _resolve_known(symbol, knownvars) + elif filenames: + def resolve(symbol): + varid, decl = _from_source(symbol, filenames, + perfilecache=perfilecache, + preprocessed=preprocessed, + ) + return handle_var(varid, decl) + else: + def resolve(symbol): + return None + return resolve + + +def get_resolver_from_dirs(dirnames, known=None, *, + handle_var, + suffixes=('.c',), + perfilecache=None, + preprocessed=False, + _iter_files=files.iter_files_by_suffix, + _get_resolver=get_resolver, + ): + """Return a "resolver" func for the given known vars/types and filenames. + + "dirnames" should be absolute paths. If not then they will be + resolved relative to CWD. + + See get_resolver(). + """ + dirnames = [d if d.endswith(os.path.sep) else d + os.path.sep + for d in dirnames] + filenames = _iter_files(dirnames, suffixes) + def check_filename(filename): + for dirname in dirnames: + if filename.startswith(dirname): + return True + else: + return False + return _get_resolver(filenames, known, + handle_var=handle_var, + check_filename=check_filename, + perfilecache=perfilecache, + preprocessed=preprocessed, + ) + + +def symbol(symbol, filenames, known=None, *, + perfilecache=None, + preprocessed=False, + handle_id=None, + _get_resolver=get_resolver, + ): + """Return a Variable for the one matching the given symbol. + + "symbol" can be one of several objects: + + * Symbol - use the contained info + * name (str) - look for a global variable with that name + * (filename, name) - look for named global in file + * (filename, funcname, name) - look for named local in file + + A name is always required. If the filename is None, "", or + "UNKNOWN" then all files will be searched. If the funcname is + "" or "UNKNOWN" then only local variables will be searched for. + """ + resolve = _get_resolver(known, filenames, + handle_id=handle_id, + perfilecache=perfilecache, + preprocessed=preprocessed, + ) + return resolve(symbol) + + +def _get_platform_tool(): + if os.name == 'nt': + # XXX Support this. + raise NotImplementedError + elif nm := shutil.which('nm'): + return lambda b, hi: _nm.iter_symbols(b, nm=nm, handle_id=hi) + else: + raise NotImplementedError + + +def symbols(binfile, *, + handle_id=None, + _file_exists=os.path.exists, + _get_platform_tool=_get_platform_tool, + ): + """Yield a Symbol for each one found in the binary.""" + if not _file_exists(binfile): + raise Exception('executable missing (need to build it first?)') + + _iter_symbols = _get_platform_tool() + yield from _iter_symbols(binfile, handle_id) + + +def variables(binfile, *, + resolve, + handle_id=None, + _iter_symbols=symbols, + ): + """Yield (Variable, Symbol) for each found symbol.""" + for symbol in _iter_symbols(binfile, handle_id=handle_id): + if symbol.kind != Symbol.KIND.VARIABLE: + continue + var = resolve(symbol) or None + yield var, symbol diff --git a/Tools/c-analyzer/c_analyzer/symbols/info.py b/Tools/c-analyzer/c_analyzer/symbols/info.py new file mode 100644 index 0000000000000000000000000000000000000000..96a251abb7c7fdfe625b9eed2cba3f65d768d36d --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/symbols/info.py @@ -0,0 +1,51 @@ +from collections import namedtuple + +from c_analyzer.common.info import ID +from c_analyzer.common.util import classonly, _NTBase + + +class Symbol(_NTBase, namedtuple('Symbol', 'id kind external')): + """Info for a single compilation symbol.""" + + __slots__ = () + + class KIND: + VARIABLE = 'variable' + FUNCTION = 'function' + OTHER = 'other' + + @classonly + def from_name(cls, name, filename=None, kind=KIND.VARIABLE, external=None): + """Return a new symbol based on the given name.""" + id = ID(filename, None, name) + return cls(id, kind, external) + + def __new__(cls, id, kind=KIND.VARIABLE, external=None): + self = super().__new__( + cls, + id=ID.from_raw(id), + kind=str(kind) if kind else None, + external=bool(external) if external is not None else None, + ) + return self + + def __hash__(self): + return hash(self.id) + + def __getattr__(self, name): + return getattr(self.id, name) + + def validate(self): + """Fail if the object is invalid (i.e. init with bad data).""" + if not self.id: + raise TypeError('missing id') + else: + self.id.validate() + + if not self.kind: + raise TypeError('missing kind') + elif self.kind not in vars(self.KIND).values(): + raise ValueError(f'unsupported kind {self.kind}') + + if self.external is None: + raise TypeError('missing external') diff --git a/Tools/c-analyzer/c_analyzer/variables/__init__.py b/Tools/c-analyzer/c_analyzer/variables/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Tools/c-analyzer/c_analyzer/variables/find.py b/Tools/c-analyzer/c_analyzer/variables/find.py new file mode 100644 index 0000000000000000000000000000000000000000..3fe7284fc00a7950bddec992a89fe1de1fb072dc --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/variables/find.py @@ -0,0 +1,75 @@ +from ..common import files +from ..common.info import UNKNOWN +from ..parser import ( + find as p_find, + ) +from ..symbols import ( + info as s_info, + find as s_find, + ) +from .info import Variable + +# XXX need tests: +# * vars_from_source + + +def _remove_cached(cache, var): + if not cache: + return + try: + cached = cache[var.filename] + cached.remove(var) + except (KeyError, IndexError): + pass + + +def vars_from_binary(binfile, *, + known=None, + filenames=None, + handle_id=None, + check_filename=None, + handle_var=Variable.from_id, + _iter_vars=s_find.variables, + _get_symbol_resolver=s_find.get_resolver, + ): + """Yield a Variable for each found Symbol. + + Details are filled in from the given "known" variables and types. + """ + cache = {} + resolve = _get_symbol_resolver(filenames, known, + handle_var=handle_var, + check_filename=check_filename, + perfilecache=cache, + ) + for var, symbol in _iter_vars(binfile, + resolve=resolve, + handle_id=handle_id, + ): + if var is None: + var = Variable(symbol.id, UNKNOWN, UNKNOWN) + yield var + _remove_cached(cache, var) + + +def vars_from_source(filenames, *, + preprocessed=None, + known=None, + handle_id=None, + handle_var=Variable.from_id, + iter_vars=p_find.variables, + ): + """Yield a Variable for each declaration in the raw source code. + + Details are filled in from the given "known" variables and types. + """ + cache = {} + for varid, decl in iter_vars(filenames or (), + perfilecache=cache, + preprocessed=preprocessed, + known=known, + handle_id=handle_id, + ): + var = handle_var(varid, decl) + yield var + _remove_cached(cache, var) diff --git a/Tools/c-analyzer/c_analyzer/variables/info.py b/Tools/c-analyzer/c_analyzer/variables/info.py new file mode 100644 index 0000000000000000000000000000000000000000..336a523c7a2dba05068cdf25e5fb0d91cc55c4fd --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/variables/info.py @@ -0,0 +1,93 @@ +from collections import namedtuple + +from ..common.info import ID, UNKNOWN +from ..common.util import classonly, _NTBase + + +def normalize_vartype(vartype): + """Return the canonical form for a variable type (or func signature).""" + # We allow empty strring through for semantic reasons. + if vartype is None: + return None + + # XXX finish! + # XXX Return (modifiers, type, pointer)? + return str(vartype) + + +# XXX Variable.vartype -> decl (Declaration). + +class Variable(_NTBase, + namedtuple('Variable', 'id storage vartype')): + """Information about a single variable declaration.""" + + __slots__ = () + + STORAGE = ( + 'static', + 'extern', + 'implicit', + 'local', + ) + + @classonly + def from_parts(cls, filename, funcname, name, decl, storage=None): + varid = ID(filename, funcname, name) + if storage is None: + self = cls.from_id(varid, decl) + else: + self = cls(varid, storage, decl) + return self + + @classonly + def from_id(cls, varid, decl): + from ..parser.declarations import extract_storage + storage = extract_storage(decl, infunc=varid.funcname) + return cls(varid, storage, decl) + + def __new__(cls, id, storage, vartype): + self = super().__new__( + cls, + id=ID.from_raw(id), + storage=str(storage) if storage else None, + vartype=normalize_vartype(vartype) if vartype else None, + ) + return self + + def __hash__(self): + return hash(self.id) + + def __getattr__(self, name): + return getattr(self.id, name) + + def _validate_id(self): + if not self.id: + raise TypeError('missing id') + + if not self.filename or self.filename == UNKNOWN: + raise TypeError(f'id missing filename ({self.id})') + + if self.funcname and self.funcname == UNKNOWN: + raise TypeError(f'id missing funcname ({self.id})') + + self.id.validate() + + def validate(self): + """Fail if the object is invalid (i.e. init with bad data).""" + self._validate_id() + + if self.storage is None or self.storage == UNKNOWN: + raise TypeError('missing storage') + elif self.storage not in self.STORAGE: + raise ValueError(f'unsupported storage {self.storage:r}') + + if self.vartype is None or self.vartype == UNKNOWN: + raise TypeError('missing vartype') + + @property + def isglobal(self): + return self.storage != 'local' + + @property + def isconst(self): + return 'const' in self.vartype.split() diff --git a/Tools/c-analyzer/c_analyzer/variables/known.py b/Tools/c-analyzer/c_analyzer/variables/known.py new file mode 100644 index 0000000000000000000000000000000000000000..aa2934a069e16b70a7f67adcd76a1fd736bbade0 --- /dev/null +++ b/Tools/c-analyzer/c_analyzer/variables/known.py @@ -0,0 +1,91 @@ +import csv + +from ..common.info import ID, UNKNOWN +from ..common.util import read_tsv +from .info import Variable + + +# XXX need tests: +# * read_file() +# * look_up_variable() + + +COLUMNS = ('filename', 'funcname', 'name', 'kind', 'declaration') +HEADER = '\t'.join(COLUMNS) + + +def read_file(infile, *, + _read_tsv=read_tsv, + ): + """Yield (kind, id, decl) for each row in the data file. + + The caller is responsible for validating each row. + """ + for row in _read_tsv(infile, HEADER): + filename, funcname, name, kind, declaration = row + if not funcname or funcname == '-': + funcname = None + id = ID(filename, funcname, name) + yield kind, id, declaration + + +def from_file(infile, *, + handle_var=Variable.from_id, + _read_file=read_file, + ): + """Return the info for known declarations in the given file.""" + known = { + 'variables': {}, + #'types': {}, + #'constants': {}, + #'macros': {}, + } + for kind, id, decl in _read_file(infile): + if kind == 'variable': + values = known['variables'] + value = handle_var(id, decl) + else: + raise ValueError(f'unsupported kind in row {row}') + value.validate() + values[id] = value + return known + + +def look_up_variable(varid, knownvars, *, + match_files=(lambda f1, f2: f1 == f2), + ): + """Return the known Variable matching the given ID. + + "knownvars" is a mapping of ID to Variable. + + "match_files" is used to verify if two filenames point to + the same file. + + If no match is found then None is returned. + """ + if not knownvars: + return None + + if varid.funcname == UNKNOWN: + if not varid.filename or varid.filename == UNKNOWN: + for varid in knownvars: + if not varid.funcname: + continue + if varid.name == varid.name: + return knownvars[varid] + else: + return None + else: + for varid in knownvars: + if not varid.funcname: + continue + if not match_files(varid.filename, varid.filename): + continue + if varid.name == varid.name: + return knownvars[varid] + else: + return None + elif not varid.filename or varid.filename == UNKNOWN: + raise NotImplementedError + else: + return knownvars.get(varid.id) diff --git a/Tools/c-globals/check-c-globals.py b/Tools/c-analyzer/check-c-globals.py similarity index 100% rename from Tools/c-globals/check-c-globals.py rename to Tools/c-analyzer/check-c-globals.py diff --git a/Tools/c-analyzer/cpython/README b/Tools/c-analyzer/cpython/README new file mode 100644 index 0000000000000000000000000000000000000000..772b8be27008bd1370315d250b3e8f98f852fff1 --- /dev/null +++ b/Tools/c-analyzer/cpython/README @@ -0,0 +1,72 @@ +####################################### +# C Globals and CPython Runtime State. + +CPython's C code makes extensive use of global variables (whether static +globals or static locals). Each such variable falls into one of several +categories: + +* strictly const data +* used exclusively in main or in the REPL +* process-global state (e.g. managing process-level resources + like signals and file descriptors) +* Python "global" runtime state +* per-interpreter runtime state + +The last one can be a problem as soon as anyone creates a second +interpreter (AKA "subinterpreter") in a process. It is definitely a +problem under subinterpreters if they are no longer sharing the GIL, +since the GIL protects us from a lot of race conditions. Keep in mind +that ultimately *all* objects (PyObject) should be treated as +per-interpreter state. This includes "static types", freelists, +_PyIdentifier, and singletons. Take that in for a second. It has +significant implications on where we use static variables! + +Be aware that module-global state (stored in C statics) is a kind of +per-interpreter state. There have been efforts across many years, and +still going, to provide extension module authors mechanisms to store +that state safely (see PEPs 3121, 489, etc.). + +(Note that there has been discussion around support for running multiple +Python runtimes in the same process. That would ends up with the same +problems, relative to static variables, that subinterpreters have.) + +Historically we have been bad at keeping per-interpreter state out of +static variables, mostly because until recently subinterpreters were +not widely used nor even factored in to solutions. However, the +feature is growing in popularity and use in the community. + +Mandate: "Eliminate use of static variables for per-interpreter state." + +The "c-statics.py" script in this directory, along with its accompanying +data files, are part of the effort to resolve existing problems with +our use of static variables and to prevent future problems. + +#------------------------- +## statics for actually-global state (and runtime state consolidation) + +In general, holding any kind of state in static variables +increases maintenance burden and increases the complexity of code (e.g. +we use TSS to identify the active thread state). So it is a good idea +to avoid using statics for state even if for the "global" runtime or +for process-global state. + +Relative to maintenance burden, one problem is where the runtime +state is spread throughout the codebase in dozens of individual +globals. Unlike the other globals, the runtime state represents a set +of values that are constantly shifting in a complex way. When they are +spread out it's harder to get a clear picture of what the runtime +involves. Furthermore, when they are spread out it complicates efforts +that change the runtime. + +Consequently, the globals for Python's runtime state have been +consolidated under a single top-level _PyRuntime global. No new globals +should be added for runtime state. Instead, they should be added to +_PyRuntimeState or one of its sub-structs. The tools in this directory +are run as part of the test suite to ensure that no new globals have +been added. The script can be run manually as well: + + ./python Lib/test/test_c_statics/c-statics.py check + +If it reports any globals then they should be resolved. If the globals +are runtime state then they should be folded into _PyRuntimeState. +Otherwise they should be marked as ignored. diff --git a/Tools/c-analyzer/cpython/__init__.py b/Tools/c-analyzer/cpython/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..ae45b424e3cc8efa04f3424b65d135cbc785128c --- /dev/null +++ b/Tools/c-analyzer/cpython/__init__.py @@ -0,0 +1,29 @@ +import os.path +import sys + + +TOOL_ROOT = os.path.abspath( + os.path.dirname( # c-analyzer/ + os.path.dirname(__file__))) # cpython/ +DATA_DIR = TOOL_ROOT +REPO_ROOT = ( + os.path.dirname( # .. + os.path.dirname(TOOL_ROOT))) # Tools/ + +INCLUDE_DIRS = [os.path.join(REPO_ROOT, name) for name in [ + 'Include', + ]] +SOURCE_DIRS = [os.path.join(REPO_ROOT, name) for name in [ + 'Python', + 'Parser', + 'Objects', + 'Modules', + ]] + +#PYTHON = os.path.join(REPO_ROOT, 'python') +PYTHON = sys.executable + + +# Clean up the namespace. +del sys +del os diff --git a/Tools/c-analyzer/cpython/__main__.py b/Tools/c-analyzer/cpython/__main__.py new file mode 100644 index 0000000000000000000000000000000000000000..6b0f9bcb9687fbfab440ec6f9b15fe42d9c89899 --- /dev/null +++ b/Tools/c-analyzer/cpython/__main__.py @@ -0,0 +1,212 @@ +import argparse +import re +import sys + +from c_analyzer.common import show +from c_analyzer.common.info import UNKNOWN + +from . import SOURCE_DIRS +from .find import supported_vars +from .known import ( + from_file as known_from_file, + DATA_FILE as KNOWN_FILE, + ) +from .supported import IGNORED_FILE + + +def _check_results(unknown, knownvars, used): + def _match_unused_global(variable): + found = [] + for varid in knownvars: + if varid in used: + continue + if varid.funcname is not None: + continue + if varid.name != variable.name: + continue + if variable.filename and variable.filename != UNKNOWN: + if variable.filename == varid.filename: + found.append(varid) + else: + found.append(varid) + return found + + badknown = set() + for variable in sorted(unknown): + msg = None + if variable.funcname != UNKNOWN: + msg = f'could not find global symbol {variable.id}' + elif m := _match_unused_global(variable): + assert isinstance(m, list) + badknown.update(m) + elif variable.name in ('completed', 'id'): # XXX Figure out where these variables are. + unknown.remove(variable) + else: + msg = f'could not find local symbol {variable.id}' + if msg: + #raise Exception(msg) + print(msg) + if badknown: + print('---') + print(f'{len(badknown)} globals in known.tsv, but may actually be local:') + for varid in sorted(badknown): + print(f'{varid.filename:30} {varid.name}') + unused = sorted(varid + for varid in set(knownvars) - used + if varid.name != 'id') # XXX Figure out where these variables are. + if unused: + print('---') + print(f'did not use {len(unused)} known vars:') + for varid in unused: + print(f'{varid.filename:30} {varid.funcname or "-":20} {varid.name}') + raise Exception('not all known symbols used') + if unknown: + print('---') + raise Exception('could not find all symbols') + + +# XXX Move this check to its own command. +def cmd_check_cache(cmd, *, + known=KNOWN_FILE, + ignored=IGNORED_FILE, + _known_from_file=known_from_file, + _find=supported_vars, + ): + known = _known_from_file(known) + + used = set() + unknown = set() + for var, supported in _find(known=known, ignored=ignored): + if supported is None: + unknown.add(var) + continue + used.add(var.id) + _check_results(unknown, known['variables'], used) + + +def cmd_check(cmd, *, + known=KNOWN_FILE, + ignored=IGNORED_FILE, + _find=supported_vars, + _show=show.basic, + _print=print, + ): + """ + Fail if there are unsupported globals variables. + + In the failure case, the list of unsupported variables + will be printed out. + """ + unsupported = [] + for var, supported in _find(known=known, ignored=ignored): + if not supported: + unsupported.append(var) + + if not unsupported: + #_print('okay') + return + + _print('ERROR: found unsupported global variables') + _print() + _show(sorted(unsupported)) + _print(f' ({len(unsupported)} total)') + sys.exit(1) + + +def cmd_show(cmd, *, + known=KNOWN_FILE, + ignored=IGNORED_FILE, + skip_objects=False, + _find=supported_vars, + _show=show.basic, + _print=print, + ): + """ + Print out the list of found global variables. + + The variables will be distinguished as "supported" or "unsupported". + """ + allsupported = [] + allunsupported = [] + for found, supported in _find(known=known, + ignored=ignored, + skip_objects=skip_objects, + ): + if supported is None: + continue + (allsupported if supported else allunsupported + ).append(found) + + _print('supported:') + _print('----------') + _show(sorted(allsupported)) + _print(f' ({len(allsupported)} total)') + _print() + _print('unsupported:') + _print('------------') + _show(sorted(allunsupported)) + _print(f' ({len(allunsupported)} total)') + + +############################# +# the script + +COMMANDS = { + 'check': cmd_check, + 'show': cmd_show, + } + +PROG = sys.argv[0] +PROG = 'c-globals.py' + + +def parse_args(prog=PROG, argv=sys.argv[1:], *, _fail=None): + common = argparse.ArgumentParser(add_help=False) + common.add_argument('--ignored', metavar='FILE', + default=IGNORED_FILE, + help='path to file that lists ignored vars') + common.add_argument('--known', metavar='FILE', + default=KNOWN_FILE, + help='path to file that lists known types') + #common.add_argument('dirs', metavar='DIR', nargs='*', + # default=SOURCE_DIRS, + # help='a directory to check') + + parser = argparse.ArgumentParser( + prog=prog, + ) + subs = parser.add_subparsers(dest='cmd') + + check = subs.add_parser('check', parents=[common]) + + show = subs.add_parser('show', parents=[common]) + show.add_argument('--skip-objects', action='store_true') + + if _fail is None: + def _fail(msg): + parser.error(msg) + + # Now parse the args. + args = parser.parse_args(argv) + ns = vars(args) + + cmd = ns.pop('cmd') + if not cmd: + _fail('missing command') + + return cmd, ns + + +def main(cmd, cmdkwargs=None, *, _COMMANDS=COMMANDS): + try: + cmdfunc = _COMMANDS[cmd] + except KeyError: + raise ValueError( + f'unsupported cmd {cmd!r}' if cmd else 'missing cmd') + + cmdfunc(cmd, **cmdkwargs or {}) + + +if __name__ == '__main__': + cmd, cmdkwargs = parse_args() + main(cmd, cmdkwargs) diff --git a/Tools/c-analyzer/cpython/_generate.py b/Tools/c-analyzer/cpython/_generate.py new file mode 100644 index 0000000000000000000000000000000000000000..4c340acf99e1c37c877082e445d33e2c06a7ec05 --- /dev/null +++ b/Tools/c-analyzer/cpython/_generate.py @@ -0,0 +1,329 @@ +# The code here consists of hacks for pre-populating the known.tsv file. + +from c_analyzer.parser.preprocessor import _iter_clean_lines +from c_analyzer.parser.naive import ( + iter_variables, parse_variable_declaration, find_variables, + ) +from c_analyzer.common.known import HEADER as KNOWN_HEADER +from c_analyzer.common.info import UNKNOWN, ID +from c_analyzer.variables import Variable +from c_analyzer.util import write_tsv + +from . import SOURCE_DIRS, REPO_ROOT +from .known import DATA_FILE as KNOWN_FILE +from .files import iter_cpython_files + + +POTS = ('char ', 'wchar_t ', 'int ', 'Py_ssize_t ') +POTS += tuple('const ' + v for v in POTS) +STRUCTS = ('PyTypeObject', 'PyObject', 'PyMethodDef', 'PyModuleDef', 'grammar') + + +def _parse_global(line, funcname=None): + line = line.strip() + if line.startswith('static '): + if '(' in line and '[' not in line and ' = ' not in line: + return None, None + name, decl = parse_variable_declaration(line) + elif line.startswith(('Py_LOCAL(', 'Py_LOCAL_INLINE(')): + name, decl = parse_variable_declaration(line) + elif line.startswith('_Py_static_string('): + decl = line.strip(';').strip() + name = line.split('(')[1].split(',')[0].strip() + elif line.startswith('_Py_IDENTIFIER('): + decl = line.strip(';').strip() + name = 'PyId_' + line.split('(')[1].split(')')[0].strip() + elif funcname: + return None, None + + # global-only + elif line.startswith('PyAPI_DATA('): # only in .h files + name, decl = parse_variable_declaration(line) + elif line.startswith('extern '): # only in .h files + name, decl = parse_variable_declaration(line) + elif line.startswith('PyDoc_VAR('): + decl = line.strip(';').strip() + name = line.split('(')[1].split(')')[0].strip() + elif line.startswith(POTS): # implied static + if '(' in line and '[' not in line and ' = ' not in line: + return None, None + name, decl = parse_variable_declaration(line) + elif line.startswith(STRUCTS) and line.endswith(' = {'): # implied static + name, decl = parse_variable_declaration(line) + elif line.startswith(STRUCTS) and line.endswith(' = NULL;'): # implied static + name, decl = parse_variable_declaration(line) + elif line.startswith('struct '): + if not line.endswith(' = {'): + return None, None + if not line.partition(' ')[2].startswith(STRUCTS): + return None, None + # implied static + name, decl = parse_variable_declaration(line) + + # file-specific + elif line.startswith(('SLOT1BINFULL(', 'SLOT1BIN(')): + # Objects/typeobject.c + funcname = line.split('(')[1].split(',')[0] + return [ + ('op_id', funcname, '_Py_static_string(op_id, OPSTR)'), + ('rop_id', funcname, '_Py_static_string(op_id, OPSTR)'), + ] + elif line.startswith('WRAP_METHOD('): + # Objects/weakrefobject.c + funcname, name = (v.strip() for v in line.split('(')[1].split(')')[0].split(',')) + return [ + ('PyId_' + name, funcname, f'_Py_IDENTIFIER({name})'), + ] + + else: + return None, None + return name, decl + + +def _pop_cached(varcache, filename, funcname, name, *, + _iter_variables=iter_variables, + ): + # Look for the file. + try: + cached = varcache[filename] + except KeyError: + cached = varcache[filename] = {} + for variable in _iter_variables(filename, + parse_variable=_parse_global, + ): + variable._isglobal = True + cached[variable.id] = variable + for var in cached: + print(' ', var) + + # Look for the variable. + if funcname == UNKNOWN: + for varid in cached: + if varid.name == name: + break + else: + return None + return cached.pop(varid) + else: + return cached.pop((filename, funcname, name), None) + + +def find_matching_variable(varid, varcache, allfilenames, *, + _pop_cached=_pop_cached, + ): + if varid.filename and varid.filename != UNKNOWN: + filenames = [varid.filename] + else: + filenames = allfilenames + for filename in filenames: + variable = _pop_cached(varcache, filename, varid.funcname, varid.name) + if variable is not None: + return variable + else: + if varid.filename and varid.filename != UNKNOWN and varid.funcname is None: + for filename in allfilenames: + if not filename.endswith('.h'): + continue + variable = _pop_cached(varcache, filename, None, varid.name) + if variable is not None: + return variable + return None + + +MULTILINE = { + # Python/Python-ast.c + 'Load_singleton': 'PyObject *', + 'Store_singleton': 'PyObject *', + 'Del_singleton': 'PyObject *', + 'AugLoad_singleton': 'PyObject *', + 'AugStore_singleton': 'PyObject *', + 'Param_singleton': 'PyObject *', + 'And_singleton': 'PyObject *', + 'Or_singleton': 'PyObject *', + 'Add_singleton': 'static PyObject *', + 'Sub_singleton': 'static PyObject *', + 'Mult_singleton': 'static PyObject *', + 'MatMult_singleton': 'static PyObject *', + 'Div_singleton': 'static PyObject *', + 'Mod_singleton': 'static PyObject *', + 'Pow_singleton': 'static PyObject *', + 'LShift_singleton': 'static PyObject *', + 'RShift_singleton': 'static PyObject *', + 'BitOr_singleton': 'static PyObject *', + 'BitXor_singleton': 'static PyObject *', + 'BitAnd_singleton': 'static PyObject *', + 'FloorDiv_singleton': 'static PyObject *', + 'Invert_singleton': 'static PyObject *', + 'Not_singleton': 'static PyObject *', + 'UAdd_singleton': 'static PyObject *', + 'USub_singleton': 'static PyObject *', + 'Eq_singleton': 'static PyObject *', + 'NotEq_singleton': 'static PyObject *', + 'Lt_singleton': 'static PyObject *', + 'LtE_singleton': 'static PyObject *', + 'Gt_singleton': 'static PyObject *', + 'GtE_singleton': 'static PyObject *', + 'Is_singleton': 'static PyObject *', + 'IsNot_singleton': 'static PyObject *', + 'In_singleton': 'static PyObject *', + 'NotIn_singleton': 'static PyObject *', + # Python/symtable.c + 'top': 'static identifier ', + 'lambda': 'static identifier ', + 'genexpr': 'static identifier ', + 'listcomp': 'static identifier ', + 'setcomp': 'static identifier ', + 'dictcomp': 'static identifier ', + '__class__': 'static identifier ', + # Python/compile.c + '__doc__': 'static PyObject *', + '__annotations__': 'static PyObject *', + # Objects/floatobject.c + 'double_format': 'static float_format_type ', + 'float_format': 'static float_format_type ', + 'detected_double_format': 'static float_format_type ', + 'detected_float_format': 'static float_format_type ', + # Parser/listnode.c + 'level': 'static int ', + 'atbol': 'static int ', + # Python/dtoa.c + 'private_mem': 'static double private_mem[PRIVATE_mem]', + 'pmem_next': 'static double *', + # Modules/_weakref.c + 'weakref_functions': 'static PyMethodDef ', +} +INLINE = { + # Modules/_tracemalloc.c + 'allocators': 'static struct { PyMemAllocatorEx mem; PyMemAllocatorEx raw; PyMemAllocatorEx obj; } ', + # Modules/faulthandler.c + 'fatal_error': 'static struct { int enabled; PyObject *file; int fd; int all_threads; PyInterpreterState *interp; void *exc_handler; } ', + 'thread': 'static struct { PyObject *file; int fd; PY_TIMEOUT_T timeout_us; int repeat; PyInterpreterState *interp; int exit; char *header; size_t header_len; PyThread_type_lock cancel_event; PyThread_type_lock running; } ', + # Modules/signalmodule.c + 'Handlers': 'static volatile struct { _Py_atomic_int tripped; PyObject *func; } Handlers[NSIG]', + 'wakeup': 'static volatile struct { SOCKET_T fd; int warn_on_full_buffer; int use_send; } ', + # Python/dynload_shlib.c + 'handles': 'static struct { dev_t dev; ino_t ino; void *handle; } handles[128]', + # Objects/obmalloc.c + '_PyMem_Debug': 'static struct { debug_alloc_api_t raw; debug_alloc_api_t mem; debug_alloc_api_t obj; } ', + # Python/bootstrap_hash.c + 'urandom_cache': 'static struct { int fd; dev_t st_dev; ino_t st_ino; } ', + } +FUNC = { + # Objects/object.c + '_Py_abstract_hack': 'Py_ssize_t (*_Py_abstract_hack)(PyObject *)', + # Parser/myreadline.c + 'PyOS_InputHook': 'int (*PyOS_InputHook)(void)', + # Python/pylifecycle.c + '_PyOS_mystrnicmp_hack': 'int (*_PyOS_mystrnicmp_hack)(const char *, const char *, Py_ssize_t)', + # Parser/myreadline.c + 'PyOS_ReadlineFunctionPointer': 'char *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, const char *)', + } +IMPLIED = { + # Objects/boolobject.c + '_Py_FalseStruct': 'static struct _longobject ', + '_Py_TrueStruct': 'static struct _longobject ', + # Modules/config.c + '_PyImport_Inittab': 'struct _inittab _PyImport_Inittab[]', + } +GLOBALS = {} +GLOBALS.update(MULTILINE) +GLOBALS.update(INLINE) +GLOBALS.update(FUNC) +GLOBALS.update(IMPLIED) + +LOCALS = { + 'buildinfo': ('Modules/getbuildinfo.c', + 'Py_GetBuildInfo', + 'static char buildinfo[50 + sizeof(GITVERSION) + ((sizeof(GITTAG) > sizeof(GITBRANCH)) ? sizeof(GITTAG) : sizeof(GITBRANCH))]'), + 'methods': ('Python/codecs.c', + '_PyCodecRegistry_Init', + 'static struct { char *name; PyMethodDef def; } methods[]'), + } + + +def _known(symbol): + if symbol.funcname: + if symbol.funcname != UNKNOWN or symbol.filename != UNKNOWN: + raise KeyError(symbol.name) + filename, funcname, decl = LOCALS[symbol.name] + varid = ID(filename, funcname, symbol.name) + elif not symbol.filename or symbol.filename == UNKNOWN: + raise KeyError(symbol.name) + else: + varid = symbol.id + try: + decl = GLOBALS[symbol.name] + except KeyError: + + if symbol.name.endswith('_methods'): + decl = 'static PyMethodDef ' + elif symbol.filename == 'Objects/exceptions.c' and symbol.name.startswith(('PyExc_', '_PyExc_')): + decl = 'static PyTypeObject ' + else: + raise + if symbol.name not in decl: + decl = decl + symbol.name + return Variable(varid, 'static', decl) + + +def known_row(varid, decl): + return ( + varid.filename, + varid.funcname or '-', + varid.name, + 'variable', + decl, + ) + + +def known_rows(symbols, *, + cached=True, + _get_filenames=iter_cpython_files, + _find_match=find_matching_variable, + _find_symbols=find_variables, + _as_known=known_row, + ): + filenames = list(_get_filenames()) + cache = {} + if cached: + for symbol in symbols: + try: + found = _known(symbol) + except KeyError: + found = _find_match(symbol, cache, filenames) + if found is None: + found = Variable(symbol.id, UNKNOWN, UNKNOWN) + yield _as_known(found.id, found.vartype) + else: + raise NotImplementedError # XXX incorporate KNOWN + for variable in _find_symbols(symbols, filenames, + srccache=cache, + parse_variable=_parse_global, + ): + #variable = variable._replace( + # filename=os.path.relpath(variable.filename, REPO_ROOT)) + if variable.funcname == UNKNOWN: + print(variable) + if variable.vartype== UNKNOWN: + print(variable) + yield _as_known(variable.id, variable.vartype) + + +def generate(symbols, filename=None, *, + _generate_rows=known_rows, + _write_tsv=write_tsv, + ): + if not filename: + filename = KNOWN_FILE + '.new' + + rows = _generate_rows(symbols) + _write_tsv(filename, KNOWN_HEADER, rows) + + +if __name__ == '__main__': + from c_symbols import binary + symbols = binary.iter_symbols( + binary.PYTHON, + find_local_symbol=None, + ) + generate(symbols) diff --git a/Tools/c-analyzer/cpython/files.py b/Tools/c-analyzer/cpython/files.py new file mode 100644 index 0000000000000000000000000000000000000000..543097af7bcd5092bea9bd187163b3775984f29f --- /dev/null +++ b/Tools/c-analyzer/cpython/files.py @@ -0,0 +1,29 @@ +from c_analyzer.common.files import ( + C_SOURCE_SUFFIXES, walk_tree, iter_files_by_suffix, + ) + +from . import SOURCE_DIRS, REPO_ROOT + +# XXX need tests: +# * iter_files() + + +def iter_files(*, + walk=walk_tree, + _files=iter_files_by_suffix, + ): + """Yield each file in the tree for each of the given directory names.""" + excludedtrees = [ + os.path.join('Include', 'cpython', ''), + ] + def is_excluded(filename): + for root in excludedtrees: + if filename.startswith(root): + return True + return False + for filename in _files(SOURCE_DIRS, C_SOURCE_SUFFIXES, REPO_ROOT, + walk=walk, + ): + if is_excluded(filename): + continue + yield filename diff --git a/Tools/c-analyzer/cpython/find.py b/Tools/c-analyzer/cpython/find.py new file mode 100644 index 0000000000000000000000000000000000000000..a7bc0b477b839cbff6f28154d50b80e35368b6d7 --- /dev/null +++ b/Tools/c-analyzer/cpython/find.py @@ -0,0 +1,101 @@ +import os.path + +from c_analyzer.common import files +from c_analyzer.common.info import UNKNOWN, ID +from c_analyzer.variables import find as _common + +from . import SOURCE_DIRS, PYTHON, REPO_ROOT +from .known import ( + from_file as known_from_file, + DATA_FILE as KNOWN_FILE, + ) +from .supported import ( + ignored_from_file, IGNORED_FILE, is_supported, _is_object, + ) + +# XXX need tests: +# * vars_from_binary() +# * vars_from_source() +# * supported_vars() + + +def _handle_id(filename, funcname, name, *, + _relpath=os.path.relpath, + ): + filename = _relpath(filename, REPO_ROOT) + return ID(filename, funcname, name) + + +def vars_from_binary(*, + known=KNOWN_FILE, + _known_from_file=known_from_file, + _iter_files=files.iter_files_by_suffix, + _iter_vars=_common.vars_from_binary, + ): + """Yield a Variable for each found Symbol. + + Details are filled in from the given "known" variables and types. + """ + if isinstance(known, str): + known = _known_from_file(known) + dirnames = SOURCE_DIRS + suffixes = ('.c',) + filenames = _iter_files(dirnames, suffixes) + # XXX For now we only use known variables (no source lookup). + filenames = None + yield from _iter_vars(PYTHON, + known=known, + filenames=filenames, + handle_id=_handle_id, + check_filename=(lambda n: True), + ) + + +def vars_from_source(*, + preprocessed=None, + known=KNOWN_FILE, + _known_from_file=known_from_file, + _iter_files=files.iter_files_by_suffix, + _iter_vars=_common.vars_from_source, + ): + """Yield a Variable for each declaration in the raw source code. + + Details are filled in from the given "known" variables and types. + """ + if isinstance(known, str): + known = _known_from_file(known) + dirnames = SOURCE_DIRS + suffixes = ('.c',) + filenames = _iter_files(dirnames, suffixes) + yield from _iter_vars(filenames, + preprocessed=preprocessed, + known=known, + handle_id=_handle_id, + ) + + +def supported_vars(*, + known=KNOWN_FILE, + ignored=IGNORED_FILE, + skip_objects=False, + _known_from_file=known_from_file, + _ignored_from_file=ignored_from_file, + _iter_vars=vars_from_binary, + _is_supported=is_supported, + ): + """Yield (var, is supported) for each found variable.""" + if isinstance(known, str): + known = _known_from_file(known) + if isinstance(ignored, str): + ignored = _ignored_from_file(ignored) + + for var in _iter_vars(known=known): + if not var.isglobal: + continue + elif var.vartype == UNKNOWN: + yield var, None + # XXX Support proper filters instead. + elif skip_objects and _is_object(found.vartype): + continue + else: + yield var, _is_supported(var, ignored, known) diff --git a/Tools/c-analyzer/cpython/known.py b/Tools/c-analyzer/cpython/known.py new file mode 100644 index 0000000000000000000000000000000000000000..c3cc2c06026ce1d4f1efac5d588608aa1a10e014 --- /dev/null +++ b/Tools/c-analyzer/cpython/known.py @@ -0,0 +1,66 @@ +import csv +import os.path + +from c_analyzer.parser.declarations import extract_storage +from c_analyzer.variables import known as _common +from c_analyzer.variables.info import Variable + +from . import DATA_DIR + + +# XXX need tests: +# * from_file() +# * look_up_variable() + + +DATA_FILE = os.path.join(DATA_DIR, 'known.tsv') + + +def _get_storage(decl, infunc): + # statics + if decl.startswith(('Py_LOCAL(', 'Py_LOCAL_INLINE(')): + return 'static' + if decl.startswith(('_Py_IDENTIFIER(', '_Py_static_string(')): + return 'static' + if decl.startswith('PyDoc_VAR('): + return 'static' + if decl.startswith(('SLOT1BINFULL(', 'SLOT1BIN(')): + return 'static' + if decl.startswith('WRAP_METHOD('): + return 'static' + # public extern + if decl.startswith('PyAPI_DATA('): + return 'extern' + # Fall back to the normal handler. + return extract_storage(decl, infunc=infunc) + + +def _handle_var(varid, decl): +# if varid.name == 'id' and decl == UNKNOWN: +# # None of these are variables. +# decl = 'int id'; + storage = _get_storage(decl, varid.funcname) + return Variable(varid, storage, decl) + + +def from_file(infile=DATA_FILE, *, + _from_file=_common.from_file, + _handle_var=_handle_var, + ): + """Return the info for known declarations in the given file.""" + return _from_file(infile, handle_var=_handle_var) + + +def look_up_variable(varid, knownvars, *, + _lookup=_common.look_up_variable, + ): + """Return the known variable matching the given ID. + + "knownvars" is a mapping of ID to Variable. + + "match_files" is used to verify if two filenames point to + the same file. + + If no match is found then None is returned. + """ + return _lookup(varid, knownvars) diff --git a/Tools/c-analyzer/cpython/supported.py b/Tools/c-analyzer/cpython/supported.py new file mode 100644 index 0000000000000000000000000000000000000000..18786eefd8dedcc45087debf00a0186ba8da647a --- /dev/null +++ b/Tools/c-analyzer/cpython/supported.py @@ -0,0 +1,398 @@ +import os.path +import re + +from c_analyzer.common.info import ID +from c_analyzer.common.util import read_tsv, write_tsv + +from . import DATA_DIR + +# XXX need tests: +# * generate / script + + +IGNORED_FILE = os.path.join(DATA_DIR, 'ignored.tsv') + +IGNORED_COLUMNS = ('filename', 'funcname', 'name', 'kind', 'reason') +IGNORED_HEADER = '\t'.join(IGNORED_COLUMNS) + +# XXX Move these to ignored.tsv. +IGNORED = { + # global + 'PyImport_FrozenModules': 'process-global', + 'M___hello__': 'process-global', + 'inittab_copy': 'process-global', + 'PyHash_Func': 'process-global', + '_Py_HashSecret_Initialized': 'process-global', + '_TARGET_LOCALES': 'process-global', + + # startup (only changed before/during) + '_PyRuntime': 'runtime startup', + 'runtime_initialized': 'runtime startup', + 'static_arg_parsers': 'runtime startup', + 'orig_argv': 'runtime startup', + 'opt_ptr': 'runtime startup', + '_preinit_warnoptions': 'runtime startup', + '_Py_StandardStreamEncoding': 'runtime startup', + 'Py_FileSystemDefaultEncoding': 'runtime startup', + '_Py_StandardStreamErrors': 'runtime startup', + 'Py_FileSystemDefaultEncodeErrors': 'runtime startup', + 'Py_BytesWarningFlag': 'runtime startup', + 'Py_DebugFlag': 'runtime startup', + 'Py_DontWriteBytecodeFlag': 'runtime startup', + 'Py_FrozenFlag': 'runtime startup', + 'Py_HashRandomizationFlag': 'runtime startup', + 'Py_IgnoreEnvironmentFlag': 'runtime startup', + 'Py_InspectFlag': 'runtime startup', + 'Py_InteractiveFlag': 'runtime startup', + 'Py_IsolatedFlag': 'runtime startup', + 'Py_NoSiteFlag': 'runtime startup', + 'Py_NoUserSiteDirectory': 'runtime startup', + 'Py_OptimizeFlag': 'runtime startup', + 'Py_QuietFlag': 'runtime startup', + 'Py_UTF8Mode': 'runtime startup', + 'Py_UnbufferedStdioFlag': 'runtime startup', + 'Py_VerboseFlag': 'runtime startup', + '_Py_path_config': 'runtime startup', + '_PyOS_optarg': 'runtime startup', + '_PyOS_opterr': 'runtime startup', + '_PyOS_optind': 'runtime startup', + '_Py_HashSecret': 'runtime startup', + + # REPL + '_PyOS_ReadlineLock': 'repl', + '_PyOS_ReadlineTState': 'repl', + + # effectively const + 'tracemalloc_empty_traceback': 'const', + '_empty_bitmap_node': 'const', + 'posix_constants_pathconf': 'const', + 'posix_constants_confstr': 'const', + 'posix_constants_sysconf': 'const', + '_PySys_ImplCacheTag': 'const', + '_PySys_ImplName': 'const', + 'PyImport_Inittab': 'const', + '_PyImport_DynLoadFiletab': 'const', + '_PyParser_Grammar': 'const', + 'Py_hexdigits': 'const', + '_PyImport_Inittab': 'const', + '_PyByteArray_empty_string': 'const', + '_PyLong_DigitValue': 'const', + '_Py_SwappedOp': 'const', + 'PyStructSequence_UnnamedField': 'const', + + # signals are main-thread only + 'faulthandler_handlers': 'signals are main-thread only', + 'user_signals': 'signals are main-thread only', + 'wakeup': 'signals are main-thread only', + + # hacks + '_PySet_Dummy': 'only used as a placeholder', + } + +BENIGN = 'races here are benign and unlikely' + + +def is_supported(variable, ignored=None, known=None, *, + _ignored=(lambda *a, **k: _is_ignored(*a, **k)), + _vartype_okay=(lambda *a, **k: _is_vartype_okay(*a, **k)), + ): + """Return True if the given global variable is okay in CPython.""" + if _ignored(variable, + ignored and ignored.get('variables')): + return True + elif _vartype_okay(variable.vartype, + ignored.get('types')): + return True + else: + return False + + +def _is_ignored(variable, ignoredvars=None, *, + _IGNORED=IGNORED, + ): + """Return the reason if the variable is a supported global. + + Return None if the variable is not a supported global. + """ + if ignoredvars and (reason := ignoredvars.get(variable.id)): + return reason + + if variable.funcname is None: + if reason := _IGNORED.get(variable.name): + return reason + + # compiler + if variable.filename == 'Python/graminit.c': + if variable.vartype.startswith('static state '): + return 'compiler' + if variable.filename == 'Python/symtable.c': + if variable.vartype.startswith('static identifier '): + return 'compiler' + if variable.filename == 'Python/Python-ast.c': + # These should be const. + if variable.name.endswith('_field'): + return 'compiler' + if variable.name.endswith('_attribute'): + return 'compiler' + + # other + if variable.filename == 'Python/dtoa.c': + # guarded by lock? + if variable.name in ('p5s', 'freelist'): + return 'dtoa is thread-safe?' + if variable.name in ('private_mem', 'pmem_next'): + return 'dtoa is thread-safe?' + if variable.filename == 'Python/thread.c': + # Threads do not become an issue until after these have been set + # and these never get changed after that. + if variable.name in ('initialized', 'thread_debug'): + return 'thread-safe' + if variable.filename == 'Python/getversion.c': + if variable.name == 'version': + # Races are benign here, as well as unlikely. + return BENIGN + if variable.filename == 'Python/fileutils.c': + if variable.name == 'force_ascii': + return BENIGN + if variable.name == 'ioctl_works': + return BENIGN + if variable.name == '_Py_open_cloexec_works': + return BENIGN + if variable.filename == 'Python/codecs.c': + if variable.name == 'ucnhash_CAPI': + return BENIGN + if variable.filename == 'Python/bootstrap_hash.c': + if variable.name == 'getrandom_works': + return BENIGN + if variable.filename == 'Objects/unicodeobject.c': + if variable.name == 'ucnhash_CAPI': + return BENIGN + if variable.name == 'bloom_linebreak': + # *mostly* benign + return BENIGN + if variable.filename == 'Modules/getbuildinfo.c': + if variable.name == 'buildinfo': + # The static is used for pre-allocation. + return BENIGN + if variable.filename == 'Modules/posixmodule.c': + if variable.name == 'ticks_per_second': + return BENIGN + if variable.name == 'dup3_works': + return BENIGN + if variable.filename == 'Modules/timemodule.c': + if variable.name == 'ticks_per_second': + return BENIGN + if variable.filename == 'Objects/longobject.c': + if variable.name == 'log_base_BASE': + return BENIGN + if variable.name == 'convwidth_base': + return BENIGN + if variable.name == 'convmultmax_base': + return BENIGN + + return None + + +def _is_vartype_okay(vartype, ignoredtypes=None): + if _is_object(vartype): + return None + + if vartype.startswith('static const '): + return 'const' + if vartype.startswith('const '): + return 'const' + + # components for TypeObject definitions + for name in ('PyMethodDef', 'PyGetSetDef', 'PyMemberDef'): + if name in vartype: + return 'const' + for name in ('PyNumberMethods', 'PySequenceMethods', 'PyMappingMethods', + 'PyBufferProcs', 'PyAsyncMethods'): + if name in vartype: + return 'const' + for name in ('slotdef', 'newfunc'): + if name in vartype: + return 'const' + + # structseq + for name in ('PyStructSequence_Desc', 'PyStructSequence_Field'): + if name in vartype: + return 'const' + + # other definiitions + if 'PyModuleDef' in vartype: + return 'const' + + # thread-safe + if '_Py_atomic_int' in vartype: + return 'thread-safe' + if 'pthread_condattr_t' in vartype: + return 'thread-safe' + + # startup + if '_Py_PreInitEntry' in vartype: + return 'startup' + + # global +# if 'PyMemAllocatorEx' in vartype: +# return True + + # others +# if 'PyThread_type_lock' in vartype: +# return True + + # XXX ??? + # _Py_tss_t + # _Py_hashtable_t + # stack_t + # _PyUnicode_Name_CAPI + + # functions + if '(' in vartype and '[' not in vartype: + return 'function pointer' + + # XXX finish! + # * allow const values? + #raise NotImplementedError + return None + + +PYOBJECT_RE = re.compile(r''' + ^ + ( + # must start with "static " + static \s+ + ( + identifier + ) + \b + ) | + ( + # may start with "static " + ( static \s+ )? + ( + .* + ( + PyObject | + PyTypeObject | + _? Py \w+ Object | + _PyArg_Parser | + _Py_Identifier | + traceback_t | + PyAsyncGenASend | + _PyAsyncGenWrappedValue | + PyContext | + method_cache_entry + ) + \b + ) | + ( + ( + _Py_IDENTIFIER | + _Py_static_string + ) + [(] + ) + ) + ''', re.VERBOSE) + + +def _is_object(vartype): + if 'PyDictKeysObject' in vartype: + return False + if PYOBJECT_RE.match(vartype): + return True + if vartype.endswith((' _Py_FalseStruct', ' _Py_TrueStruct')): + return True + + # XXX Add more? + + #for part in vartype.split(): + # # XXX const is automatic True? + # if part == 'PyObject' or part.startswith('PyObject['): + # return True + return False + + +def ignored_from_file(infile, *, + _read_tsv=read_tsv, + ): + """Yield a Variable for each ignored var in the file.""" + ignored = { + 'variables': {}, + #'types': {}, + #'constants': {}, + #'macros': {}, + } + for row in _read_tsv(infile, IGNORED_HEADER): + filename, funcname, name, kind, reason = row + if not funcname or funcname == '-': + funcname = None + id = ID(filename, funcname, name) + if kind == 'variable': + values = ignored['variables'] + else: + raise ValueError(f'unsupported kind in row {row}') + values[id] = reason + return ignored + + +################################## +# generate + +def _get_row(varid, reason): + return ( + varid.filename, + varid.funcname or '-', + varid.name, + 'variable', + str(reason), + ) + + +def _get_rows(variables, ignored=None, *, + _as_row=_get_row, + _is_ignored=_is_ignored, + _vartype_okay=_is_vartype_okay, + ): + count = 0 + for variable in variables: + reason = _is_ignored(variable, + ignored and ignored.get('variables'), + ) + if not reason: + reason = _vartype_okay(variable.vartype, + ignored and ignored.get('types')) + if not reason: + continue + + print(' ', variable, repr(reason)) + yield _as_row(variable.id, reason) + count += 1 + print(f'total: {count}') + + +def _generate_ignored_file(variables, filename=None, *, + _generate_rows=_get_rows, + _write_tsv=write_tsv, + ): + if not filename: + filename = IGNORED_FILE + '.new' + rows = _generate_rows(variables) + _write_tsv(filename, IGNORED_HEADER, rows) + + +if __name__ == '__main__': + from cpython import SOURCE_DIRS + from cpython.known import ( + from_file as known_from_file, + DATA_FILE as KNOWN_FILE, + ) + # XXX This is wrong! + from . import find + known = known_from_file(KNOWN_FILE) + knownvars = (known or {}).get('variables') + variables = find.globals_from_binary(knownvars=knownvars, + dirnames=SOURCE_DIRS) + + _generate_ignored_file(variables) diff --git a/Tools/c-globals/ignored-globals.txt b/Tools/c-analyzer/ignored-globals.txt similarity index 100% rename from Tools/c-globals/ignored-globals.txt rename to Tools/c-analyzer/ignored-globals.txt diff --git a/Tools/c-analyzer/ignored.tsv b/Tools/c-analyzer/ignored.tsv new file mode 100644 index 0000000000000000000000000000000000000000..a0e0e503da6ab0f5aa2e21078e401a025876ca0c --- /dev/null +++ b/Tools/c-analyzer/ignored.tsv @@ -0,0 +1 @@ +filename funcname name kind reason diff --git a/Tools/c-analyzer/known.tsv b/Tools/c-analyzer/known.tsv new file mode 100644 index 0000000000000000000000000000000000000000..db44080bc2e312fc7c06fdb1f7da7656f919ebf2 --- /dev/null +++ b/Tools/c-analyzer/known.tsv @@ -0,0 +1,1930 @@ +filename funcname name kind declaration +Modules/_abc.c - _abc_data_type variable static PyTypeObject _abc_data_type +Modules/_abc.c - abc_invalidation_counter variable static unsigned long long abc_invalidation_counter +Modules/_abc.c - _abcmodule variable static struct PyModuleDef _abcmodule +Python/import.c import_find_and_load accumulated variable static _PyTime_t accumulated +Modules/itertoolsmodule.c - accumulate_methods variable static PyMethodDef accumulate_methods +Modules/itertoolsmodule.c - accumulate_type variable static PyTypeObject accumulate_type +Python/Python-ast.c - Add_singleton variable static PyObject *Add_singleton +Python/Python-ast.c - Add_type variable static PyTypeObject *Add_type +Objects/genobject.c - ag_asend_freelist variable static PyAsyncGenASend *ag_asend_freelist[_PyAsyncGen_MAXFREELIST] +Objects/genobject.c - ag_asend_freelist_free variable static int ag_asend_freelist_free +Objects/genobject.c - ag_value_freelist variable static _PyAsyncGenWrappedValue *ag_value_freelist[_PyAsyncGen_MAXFREELIST] +Objects/genobject.c - ag_value_freelist_free variable static int ag_value_freelist_free +Python/Python-ast.c - alias_fields variable static const char *alias_fields[] +Python/Python-ast.c - alias_type variable static PyTypeObject *alias_type +Modules/_tracemalloc.c - allocators variable static struct { PyMemAllocatorEx mem; PyMemAllocatorEx raw; PyMemAllocatorEx obj; } allocators +Python/Python-ast.c - And_singleton variable static PyObject *And_singleton +Python/Python-ast.c - And_type variable static PyTypeObject *And_type +Python/Python-ast.c - AnnAssign_fields variable static const char *AnnAssign_fields[] +Python/Python-ast.c - AnnAssign_type variable static PyTypeObject *AnnAssign_type +Python/compile.c - __annotations__ variable static PyObject *__annotations__ +Objects/obmalloc.c - arenas variable static struct arena_object* arenas +Python/Python-ast.c - arg_attributes variable static const char *arg_attributes[] +Python/Python-ast.c - arg_fields variable static const char *arg_fields[] +Python/Python-ast.c - arg_type variable static PyTypeObject *arg_type +Python/Python-ast.c - arguments_fields variable static const char *arguments_fields[] +Python/Python-ast.c - arguments_type variable static PyTypeObject *arguments_type +Python/Python-ast.c - Assert_fields variable static const char *Assert_fields[] +Python/compile.c compiler_assert assertion_error variable static PyObject *assertion_error +Python/Python-ast.c - Assert_type variable static PyTypeObject *Assert_type +Python/Python-ast.c - Assign_fields variable static const char *Assign_fields[] +Python/Python-ast.c - Assign_type variable static PyTypeObject *Assign_type +Python/Python-ast.c - _astmodule variable static struct PyModuleDef _astmodule +Python/Python-ast.c - AST_type variable static PyTypeObject AST_type +Python/Python-ast.c - ast_type_getsets variable static PyGetSetDef ast_type_getsets[] +Python/Python-ast.c - ast_type_methods variable static PyMethodDef ast_type_methods +Python/Python-ast.c - AsyncFor_fields variable static const char *AsyncFor_fields[] +Python/Python-ast.c - AsyncFor_type variable static PyTypeObject *AsyncFor_type +Python/Python-ast.c - AsyncFunctionDef_fields variable static const char *AsyncFunctionDef_fields[] +Python/Python-ast.c - AsyncFunctionDef_type variable static PyTypeObject *AsyncFunctionDef_type +Objects/genobject.c - async_gen_as_async variable static PyAsyncMethods async_gen_as_async +Objects/genobject.c - async_gen_asend_as_async variable static PyAsyncMethods async_gen_asend_as_async +Objects/genobject.c - async_gen_asend_methods variable static PyMethodDef async_gen_asend_methods +Objects/genobject.c - async_gen_athrow_as_async variable static PyAsyncMethods async_gen_athrow_as_async +Objects/genobject.c - async_gen_athrow_methods variable static PyMethodDef async_gen_athrow_methods +Objects/genobject.c - async_gen_getsetlist variable static PyGetSetDef async_gen_getsetlist[] +Python/sysmodule.c - asyncgen_hooks_desc variable static PyStructSequence_Desc asyncgen_hooks_desc +Python/sysmodule.c - asyncgen_hooks_fields variable static PyStructSequence_Field asyncgen_hooks_fields[] +Python/sysmodule.c - AsyncGenHooksType variable static PyTypeObject AsyncGenHooksType +Objects/genobject.c - async_gen_memberlist variable static PyMemberDef async_gen_memberlist[] +Objects/genobject.c - async_gen_methods variable static PyMethodDef async_gen_methods +Python/Python-ast.c - AsyncWith_fields variable static const char *AsyncWith_fields[] +Python/Python-ast.c - AsyncWith_type variable static PyTypeObject *AsyncWith_type +Parser/listnode.c - atbol variable static int atbol +Modules/atexitmodule.c - atexit_methods variable static PyMethodDef atexit_methods +Modules/atexitmodule.c - atexitmodule variable static struct PyModuleDef atexitmodule +Modules/atexitmodule.c - atexit_slots variable static PyModuleDef_Slot atexit_slots[] +Modules/_operator.c - attrgetter_methods variable static PyMethodDef attrgetter_methods +Modules/_operator.c - attrgetter_type variable static PyTypeObject attrgetter_type +Python/Python-ast.c - Attribute_fields variable static const char *Attribute_fields[] +Python/Python-ast.c - Attribute_type variable static PyTypeObject *Attribute_type +Python/Python-ast.c - AugAssign_fields variable static const char *AugAssign_fields[] +Python/Python-ast.c - AugAssign_type variable static PyTypeObject *AugAssign_type +Python/Python-ast.c - AugLoad_singleton variable static PyObject *AugLoad_singleton +Python/Python-ast.c - AugLoad_type variable static PyTypeObject *AugLoad_type +Python/Python-ast.c - AugStore_singleton variable static PyObject *AugStore_singleton +Python/Python-ast.c - AugStore_type variable static PyTypeObject *AugStore_type +Python/Python-ast.c - Await_fields variable static const char *Await_fields[] +Python/Python-ast.c - Await_type variable static PyTypeObject *Await_type +Objects/exceptions.c - BaseException_getset variable static PyGetSetDef BaseException_getset[] +Objects/exceptions.c - BaseException_members variable static struct PyMemberDef BaseException_members[] +Objects/exceptions.c - BaseException_methods variable static PyMethodDef BaseException_methods +Modules/posixmodule.c - billion variable static PyObject *billion +Python/Python-ast.c - BinOp_fields variable static const char *BinOp_fields[] +Python/Python-ast.c - BinOp_type variable static PyTypeObject *BinOp_type +Python/Python-ast.c - BitAnd_singleton variable static PyObject *BitAnd_singleton +Python/Python-ast.c - BitAnd_type variable static PyTypeObject *BitAnd_type +Python/Python-ast.c - BitOr_singleton variable static PyObject *BitOr_singleton +Python/Python-ast.c - BitOr_type variable static PyTypeObject *BitOr_type +Python/Python-ast.c - BitXor_singleton variable static PyObject *BitXor_singleton +Python/Python-ast.c - BitXor_type variable static PyTypeObject *BitXor_type +Objects/unicodeobject.c - bloom_linebreak variable static BLOOM_MASK bloom_linebreak +Objects/boolobject.c - bool_as_number variable static PyNumberMethods bool_as_number +Python/Python-ast.c - BoolOp_fields variable static const char *BoolOp_fields[] +Python/Python-ast.c - boolop_type variable static PyTypeObject *boolop_type +Python/Python-ast.c - BoolOp_type variable static PyTypeObject *BoolOp_type +Python/_warnings.c is_internal_frame bootstrap_string variable static PyObject *bootstrap_string +Python/Python-ast.c - Break_type variable static PyTypeObject *Break_type +Modules/_io/bufferedio.c - bufferediobase_methods variable static PyMethodDef bufferediobase_methods +Modules/_io/bufferedio.c - bufferedrandom_getset variable static PyGetSetDef bufferedrandom_getset[] +Modules/_io/bufferedio.c - bufferedrandom_members variable static PyMemberDef bufferedrandom_members[] +Modules/_io/bufferedio.c - bufferedrandom_methods variable static PyMethodDef bufferedrandom_methods +Modules/_io/bufferedio.c - bufferedreader_getset variable static PyGetSetDef bufferedreader_getset[] +Modules/_io/bufferedio.c - bufferedreader_members variable static PyMemberDef bufferedreader_members[] +Modules/_io/bufferedio.c - bufferedreader_methods variable static PyMethodDef bufferedreader_methods +Modules/_io/bufferedio.c - bufferedrwpair_getset variable static PyGetSetDef bufferedrwpair_getset[] +Modules/_io/bufferedio.c - bufferedrwpair_methods variable static PyMethodDef bufferedrwpair_methods +Modules/_io/bufferedio.c - bufferedwriter_getset variable static PyGetSetDef bufferedwriter_getset[] +Modules/_io/bufferedio.c - bufferedwriter_members variable static PyMemberDef bufferedwriter_members[] +Modules/_io/bufferedio.c - bufferedwriter_methods variable static PyMethodDef bufferedwriter_methods +Modules/getbuildinfo.c Py_GetBuildInfo buildinfo variable static char buildinfo[50 + sizeof(GITVERSION) + ((sizeof(GITTAG) > sizeof(GITBRANCH)) ? sizeof(GITTAG) : sizeof(GITBRANCH))] +Python/bltinmodule.c - builtin_methods variable static PyMethodDef builtin_methods +Python/bltinmodule.c - builtinsmodule variable static struct PyModuleDef builtinsmodule +Python/import.c PyImport_Import builtins_str variable static PyObject *builtins_str +Python/ceval.c make_pending_calls busy variable static int busy +Objects/bytearrayobject.c - bytearray_as_buffer variable static PyBufferProcs bytearray_as_buffer +Objects/bytearrayobject.c - bytearray_as_mapping variable static PyMappingMethods bytearray_as_mapping +Objects/bytearrayobject.c - bytearray_as_number variable static PyNumberMethods bytearray_as_number +Objects/bytearrayobject.c - bytearray_as_sequence variable static PySequenceMethods bytearray_as_sequence +Objects/bytearrayobject.c - bytearrayiter_methods variable static PyMethodDef bytearrayiter_methods +Objects/bytearrayobject.c - bytearray_methods variable static PyMethodDef bytearray_methods +Objects/bytesobject.c - bytes_as_buffer variable static PyBufferProcs bytes_as_buffer +Objects/bytesobject.c - bytes_as_mapping variable static PyMappingMethods bytes_as_mapping +Objects/bytesobject.c - bytes_as_number variable static PyNumberMethods bytes_as_number +Objects/bytesobject.c - bytes_as_sequence variable static PySequenceMethods bytes_as_sequence +Modules/_io/bytesio.c - bytesiobuf_as_buffer variable static PyBufferProcs bytesiobuf_as_buffer +Modules/_io/bytesio.c - bytesio_getsetlist variable static PyGetSetDef bytesio_getsetlist[] +Modules/_io/bytesio.c - bytesio_methods variable static PyMethodDef bytesio_methods +Objects/bytesobject.c - bytes_methods variable static PyMethodDef bytes_methods +Python/thread_pthread.h init_condattr ca variable static pthread_condattr_t ca +Python/Python-ast.c - Call_fields variable static const char *Call_fields[] +Objects/iterobject.c - calliter_methods variable static PyMethodDef calliter_methods +Python/Python-ast.c - Call_type variable static PyTypeObject *Call_type +Objects/cellobject.c - cell_getsetlist variable static PyGetSetDef cell_getsetlist[] +Modules/itertoolsmodule.c - chain_methods variable static PyMethodDef chain_methods +Modules/itertoolsmodule.c - chain_type variable static PyTypeObject chain_type +Objects/bytesobject.c - characters variable static PyBytesObject *characters[UCHAR_MAX + 1] +Python/symtable.c - __class__ variable static identifier __class__ +Python/Python-ast.c - ClassDef_fields variable static const char *ClassDef_fields[] +Python/Python-ast.c - ClassDef_type variable static PyTypeObject *ClassDef_type +Objects/funcobject.c - cm_getsetlist variable static PyGetSetDef cm_getsetlist[] +Objects/funcobject.c - cm_memberlist variable static PyMemberDef cm_memberlist[] +Python/Python-ast.c - cmpop_type variable static PyTypeObject *cmpop_type +Modules/_codecsmodule.c - _codecs_functions variable static PyMethodDef _codecs_functions[] +Modules/_codecsmodule.c - codecsmodule variable static struct PyModuleDef codecsmodule +Objects/codeobject.c - code_memberlist variable static PyMemberDef code_memberlist[] +Objects/codeobject.c - code_methods variable static PyMethodDef code_methods +Modules/_collectionsmodule.c - _collectionsmodule variable static struct PyModuleDef _collectionsmodule +Modules/itertoolsmodule.c - combinations_methods variable static PyMethodDef combinations_methods +Modules/itertoolsmodule.c - combinations_type variable static PyTypeObject combinations_type +Objects/typeobject.c object_new comma_id variable _Py_static_string(comma_id, "", "") +Python/Python-ast.c - Compare_fields variable static const char *Compare_fields[] +Python/Python-ast.c - Compare_type variable static PyTypeObject *Compare_type +Objects/complexobject.c - complex_as_number variable static PyNumberMethods complex_as_number +Objects/complexobject.c - complex_members variable static PyMemberDef complex_members[] +Objects/complexobject.c - complex_methods variable static PyMethodDef complex_methods +Python/Python-ast.c - comprehension_fields variable static const char *comprehension_fields[] +Python/Python-ast.c - comprehension_type variable static PyTypeObject *comprehension_type +Modules/itertoolsmodule.c - compress_methods variable static PyMethodDef compress_methods +Modules/itertoolsmodule.c - compress_type variable static PyTypeObject compress_type +Python/thread_pthread.h - condattr_monotonic variable static pthread_condattr_t *condattr_monotonic +Python/Python-ast.c - Constant_fields variable static const char *Constant_fields[] +Python/Python-ast.c - Constant_type variable static PyTypeObject *Constant_type +Python/Python-ast.c - Continue_type variable static PyTypeObject *Continue_type +Objects/longobject.c PyLong_FromString convmultmax_base variable static twodigits convmultmax_base[37] +Objects/longobject.c PyLong_FromString convwidth_base variable static int convwidth_base[37] +Objects/genobject.c - coro_as_async variable static PyAsyncMethods coro_as_async +Objects/genobject.c - coro_getsetlist variable static PyGetSetDef coro_getsetlist[] +Objects/genobject.c - coro_memberlist variable static PyMemberDef coro_memberlist[] +Objects/genobject.c - coro_methods variable static PyMethodDef coro_methods +Objects/genobject.c - coro_wrapper_methods variable static PyMethodDef coro_wrapper_methods +Modules/itertoolsmodule.c - count_methods variable static PyMethodDef count_methods +Modules/itertoolsmodule.c - count_type variable static PyTypeObject count_type +Python/context.c - ctx_freelist variable static PyContext *ctx_freelist +Python/context.c - ctx_freelist_len variable static int ctx_freelist_len +Modules/itertoolsmodule.c - cwr_methods variable static PyMethodDef cwr_methods +Modules/itertoolsmodule.c - cwr_type variable static PyTypeObject cwr_type +Modules/itertoolsmodule.c - cycle_methods variable static PyMethodDef cycle_methods +Modules/itertoolsmodule.c - cycle_type variable static PyTypeObject cycle_type +Objects/obmalloc.c new_arena debug_stats variable static int debug_stats +Modules/signalmodule.c - DefaultHandler variable static PyObject *DefaultHandler +Modules/_collectionsmodule.c - defdict_members variable static PyMemberDef defdict_members[] +Modules/_collectionsmodule.c - defdict_methods variable static PyMethodDef defdict_methods +Modules/_collectionsmodule.c - defdict_type variable static PyTypeObject defdict_type +Python/Python-ast.c - Delete_fields variable static const char *Delete_fields[] +Python/Python-ast.c - Delete_type variable static PyTypeObject *Delete_type +Python/Python-ast.c - Del_singleton variable static PyObject *Del_singleton +Python/Python-ast.c - Del_type variable static PyTypeObject *Del_type +Modules/_collectionsmodule.c - deque_as_number variable static PyNumberMethods deque_as_number +Modules/_collectionsmodule.c - deque_as_sequence variable static PySequenceMethods deque_as_sequence +Modules/_collectionsmodule.c - deque_getset variable static PyGetSetDef deque_getset[] +Modules/_collectionsmodule.c - dequeiter_methods variable static PyMethodDef dequeiter_methods +Modules/_collectionsmodule.c - dequeiter_type variable static PyTypeObject dequeiter_type +Modules/_collectionsmodule.c - deque_methods variable static PyMethodDef deque_methods +Modules/_collectionsmodule.c - dequereviter_type variable static PyTypeObject dequereviter_type +Modules/_collectionsmodule.c - deque_type variable static PyTypeObject deque_type +Objects/descrobject.c - descr_members variable static PyMemberDef descr_members[] +Objects/descrobject.c - descr_methods variable static PyMethodDef descr_methods +Modules/_abc.c - _destroy_def variable static PyMethodDef _destroy_def +Objects/floatobject.c - detected_double_format variable static float_format_type detected_double_format +Objects/floatobject.c - detected_float_format variable static float_format_type detected_float_format +Objects/dictobject.c - dict_as_mapping variable static PyMappingMethods dict_as_mapping +Objects/dictobject.c - dict_as_sequence variable static PySequenceMethods dict_as_sequence +Python/symtable.c - dictcomp variable static identifier dictcomp +Python/Python-ast.c - DictComp_fields variable static const char *DictComp_fields[] +Python/Python-ast.c - DictComp_type variable static PyTypeObject *DictComp_type +Python/Python-ast.c - Dict_fields variable static const char *Dict_fields[] +Objects/dictobject.c - dictitems_as_sequence variable static PySequenceMethods dictitems_as_sequence +Objects/dictobject.c - dictitems_methods variable static PyMethodDef dictitems_methods +Objects/dictobject.c - dictiter_methods variable static PyMethodDef dictiter_methods +Objects/dictobject.c - dictkeys_as_sequence variable static PySequenceMethods dictkeys_as_sequence +Objects/dictobject.c - dictkeys_methods variable static PyMethodDef dictkeys_methods +Python/Python-ast.c - Dict_type variable static PyTypeObject *Dict_type +Objects/dictobject.c - dictvalues_as_sequence variable static PySequenceMethods dictvalues_as_sequence +Objects/dictobject.c - dictvalues_methods variable static PyMethodDef dictvalues_methods +Objects/dictobject.c - dictviews_as_number variable static PyNumberMethods dictviews_as_number +Modules/posixmodule.c - DirEntry_members variable static PyMemberDef DirEntry_members[] +Modules/posixmodule.c - DirEntry_methods variable static PyMethodDef DirEntry_methods +Modules/posixmodule.c - DirEntryType variable static PyTypeObject DirEntryType +Python/Python-ast.c - Div_singleton variable static PyObject *Div_singleton +Python/Python-ast.c - Div_type variable static PyTypeObject *Div_type +Python/compile.c - __doc__ variable static PyObject *__doc__ +Objects/classobject.c method_get_doc docstr variable static PyObject *docstr +Objects/classobject.c instancemethod_get_doc docstr variable static PyObject *docstr +Python/compile.c compiler_set_qualname dot variable _Py_static_string(dot, ""."") +Python/compile.c compiler_set_qualname dot_locals variable _Py_static_string(dot_locals, ""."") +Objects/floatobject.c - double_format variable static float_format_type double_format +Modules/itertoolsmodule.c - dropwhile_methods variable static PyMethodDef dropwhile_methods +Modules/itertoolsmodule.c - dropwhile_type variable static PyTypeObject dropwhile_type +Objects/setobject.c - _dummy_struct variable static PyObject _dummy_struct +Modules/posixmodule.c os_dup2_impl dup3_works variable static int dup3_works +Modules/_io/bufferedio.c _PyIO_trap_eintr eintr_int variable static PyObject *eintr_int +Objects/sliceobject.c - ellipsis_methods variable static PyMethodDef ellipsis_methods +Python/hamt.c - _empty_bitmap_node variable static PyHamtNode_Bitmap *_empty_bitmap_node +Objects/setobject.c - emptyfrozenset variable static PyObject *emptyfrozenset +Python/hamt.c - _empty_hamt variable static PyHamtObject *_empty_hamt +Objects/dictobject.c - empty_keys_struct variable static PyDictKeysObject empty_keys_struct +Objects/codeobject.c PyCode_NewEmpty emptystring variable static PyObject *emptystring +Python/compile.c compiler_from_import empty_string variable static PyObject *empty_string +Objects/dictobject.c - empty_values variable static PyObject *empty_values[1] +Objects/unicodeobject.c - encoding_map_methods variable static PyMethodDef encoding_map_methods +Objects/unicodeobject.c - EncodingMapType variable static PyTypeObject EncodingMapType +Objects/enumobject.c - enum_methods variable static PyMethodDef enum_methods +Python/Python-ast.c - Eq_singleton variable static PyObject *Eq_singleton +Python/Python-ast.c - Eq_type variable static PyTypeObject *Eq_type +Objects/exceptions.c - errnomap variable static PyObject *errnomap +Modules/errnomodule.c - errno_methods variable static PyMethodDef errno_methods +Modules/errnomodule.c - errnomodule variable static struct PyModuleDef errnomodule +Modules/_localemodule.c - Error variable static PyObject *Error +Python/Python-ast.c - excepthandler_attributes variable static const char *excepthandler_attributes[] +Python/Python-ast.c - ExceptHandler_fields variable static const char *ExceptHandler_fields[] +Python/Python-ast.c - excepthandler_type variable static PyTypeObject *excepthandler_type +Python/Python-ast.c - ExceptHandler_type variable static PyTypeObject *ExceptHandler_type +Modules/_threadmodule.c - ExceptHookArgs_desc variable static PyStructSequence_Desc ExceptHookArgs_desc +Modules/_threadmodule.c - ExceptHookArgs_fields variable static PyStructSequence_Field ExceptHookArgs_fields[] +Modules/_threadmodule.c - ExceptHookArgsType variable static PyTypeObject ExceptHookArgsType +Objects/exceptions.c _check_for_legacy_statements exec_prefix variable static PyObject *exec_prefix +Python/Python-ast.c - expr_attributes variable static const char *expr_attributes[] +Python/Python-ast.c - expr_context_type variable static PyTypeObject *expr_context_type +Python/Python-ast.c - Expression_fields variable static const char *Expression_fields[] +Python/Python-ast.c - Expression_type variable static PyTypeObject *Expression_type +Python/Python-ast.c - Expr_fields variable static const char *Expr_fields[] +Python/Python-ast.c - expr_type variable static PyTypeObject *expr_type +Python/Python-ast.c - Expr_type variable static PyTypeObject *Expr_type +Python/import.c - extensions variable static PyObject *extensions +Python/Python-ast.c - ExtSlice_fields variable static const char *ExtSlice_fields[] +Python/Python-ast.c - ExtSlice_type variable static PyTypeObject *ExtSlice_type +Objects/boolobject.c - false_str variable static PyObject *false_str +Modules/faulthandler.c - fatal_error variable static struct { int enabled; PyObject *file; int fd; int all_threads; PyInterpreterState *interp; void *exc_handler; } fatal_error +Modules/faulthandler.c - faulthandler_handlers variable static fault_handler_t faulthandler_handlers[] +Objects/stringlib/unicode_format.h - fieldnameiter_methods variable static PyMethodDef fieldnameiter_methods +Modules/_io/fileio.c - fileio_getsetlist variable static PyGetSetDef fileio_getsetlist[] +Modules/_io/fileio.c - fileio_members variable static PyMemberDef fileio_members[] +Modules/_io/fileio.c - fileio_methods variable static PyMethodDef fileio_methods +Modules/itertoolsmodule.c - filterfalse_methods variable static PyMethodDef filterfalse_methods +Modules/itertoolsmodule.c - filterfalse_type variable static PyTypeObject filterfalse_type +Python/bltinmodule.c - filter_methods variable static PyMethodDef filter_methods +Python/sysmodule.c - flags_desc variable static PyStructSequence_Desc flags_desc +Python/sysmodule.c - flags_fields variable static PyStructSequence_Field flags_fields[] +Python/sysmodule.c - FlagsType variable static PyTypeObject FlagsType +Objects/floatobject.c - float_as_number variable static PyNumberMethods float_as_number +Objects/floatobject.c - float_format variable static float_format_type +Objects/floatobject.c - float_getset variable static PyGetSetDef float_getset[] +Objects/floatobject.c - floatinfo_desc variable static PyStructSequence_Desc floatinfo_desc +Objects/floatobject.c - floatinfo_fields variable static PyStructSequence_Field floatinfo_fields[] +Objects/floatobject.c - FloatInfoType variable static PyTypeObject FloatInfoType +Objects/floatobject.c - float_methods variable static PyMethodDef float_methods +Python/Python-ast.c - FloorDiv_singleton variable static PyObject *FloorDiv_singleton +Python/Python-ast.c - FloorDiv_type variable static PyTypeObject *FloorDiv_type +Python/fileutils.c - force_ascii variable static int force_ascii +Python/Python-ast.c - For_fields variable static const char *For_fields[] +Python/Python-ast.c - FormattedValue_fields variable static const char *FormattedValue_fields[] +Python/Python-ast.c - FormattedValue_type variable static PyTypeObject *FormattedValue_type +Objects/stringlib/unicode_format.h - formatteriter_methods variable static PyMethodDef formatteriter_methods +Python/Python-ast.c - For_type variable static PyTypeObject *For_type +Objects/frameobject.c - frame_getsetlist variable static PyGetSetDef frame_getsetlist[] +Objects/frameobject.c - frame_memberlist variable static PyMemberDef frame_memberlist[] +Objects/frameobject.c - frame_methods variable static PyMethodDef frame_methods +Modules/_collectionsmodule.c - freeblocks variable static block *freeblocks[MAXFREEBLOCKS] +Python/dtoa.c - freelist variable static Bigint *freelist[Kmax+1] +Objects/floatobject.c - free_list variable static PyFloatObject *free_list +Objects/frameobject.c - free_list variable static PyFrameObject *free_list +Objects/listobject.c - free_list variable static PyListObject *free_list[PyList_MAXFREELIST] +Objects/dictobject.c - free_list variable static PyDictObject *free_list[PyDict_MAXFREELIST] +Objects/methodobject.c - free_list variable static PyCFunctionObject *free_list +Objects/tupleobject.c - free_list variable static PyTupleObject *free_list[PyTuple_MAXSAVESIZE] +Objects/classobject.c - free_list variable static PyMethodObject *free_list +Objects/setobject.c - frozenset_as_number variable static PyNumberMethods frozenset_as_number +Objects/setobject.c - frozenset_methods variable static PyMethodDef frozenset_methods +Objects/funcobject.c - func_getsetlist variable static PyGetSetDef func_getsetlist[] +Objects/funcobject.c - func_memberlist variable static PyMemberDef func_memberlist[] +Python/Python-ast.c - FunctionDef_fields variable static const char *FunctionDef_fields[] +Python/Python-ast.c - FunctionDef_type variable static PyTypeObject *FunctionDef_type +Modules/_sre.c - _functions variable static PyMethodDef _functions[] +Python/Python-ast.c - FunctionType_fields variable static const char *FunctionType_fields[] +Python/Python-ast.c - FunctionType_type variable static PyTypeObject *FunctionType_type +Modules/_functoolsmodule.c - _functoolsmodule variable static struct PyModuleDef _functoolsmodule +Modules/gcmodule.c - GcMethods variable static PyMethodDef GcMethods[] +Modules/gcmodule.c - gcmodule variable static struct PyModuleDef gcmodule +Modules/gcmodule.c - gc_str variable static PyObject *gc_str +Python/Python-ast.c - GeneratorExp_fields variable static const char *GeneratorExp_fields[] +Python/Python-ast.c - GeneratorExp_type variable static PyTypeObject *GeneratorExp_type +Python/symtable.c - genexpr variable static identifier genexpr +Objects/genobject.c - gen_getsetlist variable static PyGetSetDef gen_getsetlist[] +Objects/genobject.c - gen_memberlist variable static PyMemberDef gen_memberlist[] +Objects/genobject.c - gen_methods variable static PyMethodDef gen_methods +Python/bootstrap_hash.c py_getrandom getrandom_works variable static int getrandom_works +Objects/descrobject.c - getset_getset variable static PyGetSetDef getset_getset[] +Python/Python-ast.c - Global_fields variable static const char *Global_fields[] +Python/Python-ast.c - Global_type variable static PyTypeObject *Global_type +Modules/itertoolsmodule.c - groupby_methods variable static PyMethodDef groupby_methods +Modules/itertoolsmodule.c - groupby_type variable static PyTypeObject groupby_type +Modules/itertoolsmodule.c - _grouper_methods variable static PyMethodDef _grouper_methods +Modules/itertoolsmodule.c - _grouper_type variable static PyTypeObject _grouper_type +Python/Python-ast.c - GtE_singleton variable static PyObject *GtE_singleton +Python/Python-ast.c - GtE_type variable static PyTypeObject *GtE_type +Python/Python-ast.c - Gt_singleton variable static PyObject *Gt_singleton +Python/Python-ast.c - Gt_type variable static PyTypeObject *Gt_type +Modules/signalmodule.c - Handlers variable static volatile struct { _Py_atomic_int tripped; PyObject *func; } Handlers[NSIG] +Python/dynload_shlib.c - handles variable static struct { dev_t dev; ino_t ino; void *handle; } handles[128] +Python/sysmodule.c - hash_info_desc variable static PyStructSequence_Desc hash_info_desc +Python/sysmodule.c - hash_info_fields variable static PyStructSequence_Field hash_info_fields[] +Python/sysmodule.c - Hash_InfoType variable static PyTypeObject Hash_InfoType +Python/import.c import_find_and_load header variable static int header +Python/Python-ast.c - IfExp_fields variable static const char *IfExp_fields[] +Python/Python-ast.c - IfExp_type variable static PyTypeObject *IfExp_type +Python/Python-ast.c - If_fields variable static const char *If_fields[] +Python/Python-ast.c - If_type variable static PyTypeObject *If_type +Modules/signalmodule.c - IgnoreHandler variable static PyObject *IgnoreHandler +Python/import.c - imp_methods variable static PyMethodDef imp_methods +Python/import.c - impmodule variable static struct PyModuleDef impmodule +Objects/exceptions.c - ImportError_members variable static PyMemberDef ImportError_members[] +Objects/exceptions.c - ImportError_methods variable static PyMethodDef ImportError_methods +Python/Python-ast.c - Import_fields variable static const char *Import_fields[] +Python/Python-ast.c - ImportFrom_fields variable static const char *ImportFrom_fields[] +Python/Python-ast.c - ImportFrom_type variable static PyTypeObject *ImportFrom_type +Python/import.c import_find_and_load import_level variable static int import_level +Python/_warnings.c is_internal_frame importlib_string variable static PyObject *importlib_string +Python/import.c - import_lock variable static PyThread_type_lock import_lock +Python/import.c - import_lock_level variable static int import_lock_level +Python/import.c - import_lock_thread variable static unsigned long import_lock_thread +Python/import.c PyImport_Import import_str variable static PyObject *import_str +Python/Python-ast.c - Import_type variable static PyTypeObject *Import_type +Modules/_io/textio.c - incrementalnewlinedecoder_getset variable static PyGetSetDef incrementalnewlinedecoder_getset[] +Modules/_io/textio.c - incrementalnewlinedecoder_methods variable static PyMethodDef incrementalnewlinedecoder_methods +Objects/listobject.c - indexerr variable static PyObject *indexerr +Python/Python-ast.c - Index_fields variable static const char *Index_fields[] +Python/Python-ast.c - Index_type variable static PyTypeObject *Index_type +Python/thread.c - initialized variable static int initialized +Modules/posixmodule.c - initialized variable static int initialized +Modules/pwdmodule.c - initialized variable static int initialized +Modules/signalmodule.c - initialized variable static int initialized +Modules/timemodule.c - initialized variable static int initialized +Python/Python-ast.c init_types initialized variable static int initialized +Objects/listobject.c PyList_New initialized variable static int initialized +Python/import.c - inittab_copy variable static struct _inittab *inittab_copy +Python/Python-ast.c - In_singleton variable static PyObject *In_singleton +Objects/classobject.c - instancemethod_getset variable static PyGetSetDef instancemethod_getset[] +Objects/classobject.c - instancemethod_memberlist variable static PyMemberDef instancemethod_memberlist[] +Python/Python-ast.c - Interactive_fields variable static const char *Interactive_fields[] +Python/Python-ast.c - Interactive_type variable static PyTypeObject *Interactive_type +Objects/unicodeobject.c - interned variable static PyObject *interned +Objects/interpreteridobject.c - interpid_as_number variable static PyNumberMethods interpid_as_number +Modules/signalmodule.c - IntHandler variable static PyObject *IntHandler +Objects/longobject.c - int_info_desc variable static PyStructSequence_Desc int_info_desc +Objects/longobject.c - int_info_fields variable static PyStructSequence_Field int_info_fields[] +Objects/longobject.c - Int_InfoType variable static PyTypeObject Int_InfoType +Python/Python-ast.c - In_type variable static PyTypeObject *In_type +Python/Python-ast.c - Invert_singleton variable static PyObject *Invert_singleton +Python/Python-ast.c - Invert_type variable static PyTypeObject *Invert_type +Modules/_io/iobase.c - iobase_getset variable static PyGetSetDef iobase_getset[] +Modules/_io/iobase.c - iobase_methods variable static PyMethodDef iobase_methods +Python/fileutils.c set_inheritable ioctl_works variable static int ioctl_works +Modules/itertoolsmodule.c - islice_methods variable static PyMethodDef islice_methods +Modules/itertoolsmodule.c - islice_type variable static PyTypeObject islice_type +Python/Python-ast.c - IsNot_singleton variable static PyObject *IsNot_singleton +Python/Python-ast.c - IsNot_type variable static PyTypeObject *IsNot_type +Python/Python-ast.c - Is_singleton variable static PyObject *Is_singleton +Modules/signalmodule.c - is_tripped variable static _Py_atomic_int is_tripped +Python/Python-ast.c - Is_type variable static PyTypeObject *Is_type +Modules/_operator.c - itemgetter_methods variable static PyMethodDef itemgetter_methods +Modules/_operator.c - itemgetter_type variable static PyTypeObject itemgetter_type +Modules/itertoolsmodule.c - itertoolsmodule variable static struct PyModuleDef itertoolsmodule +Modules/signalmodule.c - ItimerError variable static PyObject *ItimerError +Python/Python-ast.c - JoinedStr_fields variable static const char *JoinedStr_fields[] +Python/Python-ast.c - JoinedStr_type variable static PyTypeObject *JoinedStr_type +Modules/_functoolsmodule.c - keyobject_members variable static PyMemberDef keyobject_members[] +Modules/_functoolsmodule.c - keyobject_type variable static PyTypeObject keyobject_type +Objects/dictobject.c - keys_free_list variable static PyDictKeysObject *keys_free_list[PyDict_MAXFREELIST] +Python/Python-ast.c - keyword_fields variable static const char *keyword_fields[] +Python/sysmodule.c sys_set_asyncgen_hooks keywords variable static const char *keywords[] +Modules/_bisectmodule.c bisect_right keywords variable static const char *keywords[] +Modules/_bisectmodule.c insort_right keywords variable static const char *keywords[] +Python/Python-ast.c - keyword_type variable static PyTypeObject *keyword_type +Modules/_functoolsmodule.c keyobject_call kwargs variable static const char *kwargs[] +Modules/_functoolsmodule.c functools_cmp_to_key kwargs variable static const char *kwargs[] +Modules/itertoolsmodule.c repeat_new kwargs variable static const char *kwargs[] +Python/_warnings.c warnings_warn_explicit kwd_list variable static const char *kwd_list[] +Modules/_functoolsmodule.c - kwd_mark variable static PyObject *kwd_mark +Python/bltinmodule.c builtin___import__ kwlist variable static const char *kwlist[] +Python/bltinmodule.c min_max kwlist variable static const char *kwlist[] +Python/context.c contextvar_tp_new kwlist variable static const char *kwlist[] +Python/sysmodule.c sys_getsizeof kwlist variable static const char *kwlist[] +Objects/bytearrayobject.c bytearray_init kwlist variable static const char *kwlist[] +Objects/bytesobject.c bytes_new kwlist variable static const char *kwlist[] +Objects/exceptions.c ImportError_init kwlist variable static const char *kwlist[] +Objects/interpreteridobject.c interpid_new kwlist variable static const char *kwlist[] +Objects/memoryobject.c memory_new kwlist variable static const char *kwlist[] +Objects/memoryobject.c memory_cast kwlist variable static const char *kwlist[] +Objects/memoryobject.c memory_tobytes kwlist variable static const char *kwlist[] +Objects/odictobject.c odict_pop kwlist variable static const char *kwlist[] +Objects/unicodeobject.c unicode_new kwlist variable static const char *kwlist[] +Objects/weakrefobject.c weakref_call kwlist variable static const char *kwlist[] +Modules/_elementtree.c element_setstate_from_Python kwlist variable static const char *kwlist[] +Modules/_json.c scanner_call kwlist variable static const char *kwlist[] +Modules/_json.c scanner_new kwlist variable static const char *kwlist[] +Modules/_json.c encoder_new kwlist variable static const char *kwlist[] +Modules/_json.c encoder_call kwlist variable static const char *kwlist[] +Python/symtable.c - lambda variable static identifier lambda +Python/Python-ast.c - Lambda_fields variable static const char *Lambda_fields[] +Python/Python-ast.c - Lambda_type variable static PyTypeObject *Lambda_type +Parser/listnode.c - level variable static int level +Objects/listobject.c - list_as_mapping variable static PyMappingMethods list_as_mapping +Objects/listobject.c - list_as_sequence variable static PySequenceMethods list_as_sequence +Python/symtable.c - listcomp variable static identifier listcomp +Python/Python-ast.c - ListComp_fields variable static const char *ListComp_fields[] +Python/Python-ast.c - ListComp_type variable static PyTypeObject *ListComp_type +Python/Python-ast.c - List_fields variable static const char *List_fields[] +Objects/listobject.c - listiter_methods variable static PyMethodDef listiter_methods +Objects/listobject.c - list_methods variable static PyMethodDef list_methods +Objects/listobject.c - listreviter_methods variable static PyMethodDef listreviter_methods +Python/Python-ast.c - List_type variable static PyTypeObject *List_type +Python/ceval.c - lltrace variable static int lltrace +Python/Python-ast.c - Load_singleton variable static PyObject *Load_singleton +Python/Python-ast.c - Load_type variable static PyTypeObject *Load_type +Modules/_threadmodule.c - localdummytype variable static PyTypeObject localdummytype +Modules/_localemodule.c - _localemodule variable static struct PyModuleDef _localemodule +Modules/_threadmodule.c - localtype variable static PyTypeObject localtype +Modules/_threadmodule.c - lock_methods variable static PyMethodDef lock_methods +Modules/_threadmodule.c - Locktype variable static PyTypeObject Locktype +Objects/longobject.c PyLong_FromString log_base_BASE variable static double log_base_BASE[37] +Objects/longobject.c - long_as_number variable static PyNumberMethods long_as_number +Objects/longobject.c - long_getset variable static PyGetSetDef long_getset[] +Objects/longobject.c - long_methods variable static PyMethodDef long_methods +Objects/rangeobject.c - longrangeiter_methods variable static PyMethodDef longrangeiter_methods +Modules/_functoolsmodule.c - lru_cache_getsetlist variable static PyGetSetDef lru_cache_getsetlist[] +Modules/_functoolsmodule.c - lru_cache_methods variable static PyMethodDef lru_cache_methods +Modules/_functoolsmodule.c - lru_cache_type variable static PyTypeObject lru_cache_type +Modules/_functoolsmodule.c - lru_list_elem_type variable static PyTypeObject lru_list_elem_type +Python/Python-ast.c - LShift_singleton variable static PyObject *LShift_singleton +Python/Python-ast.c - LShift_type variable static PyTypeObject *LShift_type +Python/Python-ast.c - LtE_singleton variable static PyObject *LtE_singleton +Python/Python-ast.c - LtE_type variable static PyTypeObject *LtE_type +Python/Python-ast.c - Lt_singleton variable static PyObject *Lt_singleton +Python/Python-ast.c - Lt_type variable static PyTypeObject *Lt_type +Python/bltinmodule.c - map_methods variable static PyMethodDef map_methods +Objects/descrobject.c - mappingproxy_as_mapping variable static PyMappingMethods mappingproxy_as_mapping +Objects/descrobject.c - mappingproxy_as_sequence variable static PySequenceMethods mappingproxy_as_sequence +Objects/descrobject.c - mappingproxy_methods variable static PyMethodDef mappingproxy_methods +Objects/dictobject.c - mapp_methods variable static PyMethodDef mapp_methods +Python/marshal.c - marshal_methods variable static PyMethodDef marshal_methods +Python/marshal.c - marshalmodule variable static struct PyModuleDef marshalmodule +Modules/_sre.c - match_as_mapping variable static PyMappingMethods match_as_mapping +Modules/_sre.c - match_getset variable static PyGetSetDef match_getset[] +Modules/_sre.c - match_members variable static PyMemberDef match_members[] +Modules/_sre.c - match_methods variable static PyMethodDef match_methods +Modules/_sre.c - Match_Type variable static PyTypeObject Match_Type +Python/Python-ast.c - MatMult_singleton variable static PyObject *MatMult_singleton +Python/Python-ast.c - MatMult_type variable static PyTypeObject *MatMult_type +Objects/obmalloc.c - maxarenas variable static uint maxarenas +Objects/moduleobject.c - max_module_number variable static Py_ssize_t max_module_number +Objects/descrobject.c - member_getset variable static PyGetSetDef member_getset[] +Objects/exceptions.c - memerrors_freelist variable static PyBaseExceptionObject *memerrors_freelist +Objects/exceptions.c - memerrors_numfree variable static int memerrors_numfree +Objects/memoryobject.c - memory_as_buffer variable static PyBufferProcs memory_as_buffer +Objects/memoryobject.c - memory_as_mapping variable static PyMappingMethods memory_as_mapping +Objects/memoryobject.c - memory_as_sequence variable static PySequenceMethods memory_as_sequence +Objects/memoryobject.c - memory_getsetlist variable static PyGetSetDef memory_getsetlist[] +Objects/memoryobject.c - memory_methods variable static PyMethodDef memory_methods +Objects/methodobject.c - meth_getsets variable static PyGetSetDef meth_getsets [] +Objects/methodobject.c - meth_members variable static PyMemberDef meth_members[] +Objects/methodobject.c - meth_methods variable static PyMethodDef meth_methods +Objects/typeobject.c - method_cache variable static struct method_cache_entry method_cache[1 << MCACHE_SIZE_EXP] +Modules/_operator.c - methodcaller_methods variable static PyMethodDef methodcaller_methods +Modules/_operator.c - methodcaller_type variable static PyTypeObject methodcaller_type +Objects/classobject.c - method_getset variable static PyGetSetDef method_getset[] +Objects/descrobject.c - method_getset variable static PyGetSetDef method_getset[] +Objects/classobject.c - method_memberlist variable static PyMemberDef method_memberlist[] +Objects/classobject.c - method_methods variable static PyMethodDef method_methods +Python/codecs.c _PyCodecRegistry_Init methods variable static struct { char *name; PyMethodDef def; } methods[] +Python/frozen.c - M___hello__ variable static unsigned char M___hello__[] +Python/Python-ast.c - Mod_singleton variable static PyObject *Mod_singleton +Python/Python-ast.c - mod_type variable static PyTypeObject *mod_type +Python/Python-ast.c - Mod_type variable static PyTypeObject *Mod_type +Modules/faulthandler.c - module_def variable static struct PyModuleDef module_def +Modules/_tracemalloc.c - module_def variable static struct PyModuleDef module_def +Python/Python-ast.c - Module_fields variable static const char *Module_fields[] +Modules/_collectionsmodule.c - module_functions variable static struct PyMethodDef module_functions[] +Modules/_abc.c - module_functions variable static struct PyMethodDef module_functions[] +Objects/moduleobject.c - module_members variable static PyMemberDef module_members[] +Objects/moduleobject.c - module_methods variable static PyMethodDef module_methods +Modules/_functoolsmodule.c - module_methods variable static PyMethodDef module_methods +Modules/itertoolsmodule.c - module_methods variable static PyMethodDef module_methods +Modules/_io/_iomodule.c - module_methods variable static PyMethodDef module_methods +Modules/faulthandler.c - module_methods variable static PyMethodDef module_methods +Modules/_tracemalloc.c - module_methods variable static PyMethodDef module_methods +Python/Python-ast.c - Module_type variable static PyTypeObject *Module_type +Python/Python-ast.c - Mult_singleton variable static PyObject *Mult_singleton +Python/Python-ast.c - Mult_type variable static PyTypeObject *Mult_type +Objects/funcobject.c PyFunction_NewWithQualName __name__ variable static PyObject *__name__ +Python/compile.c compiler_lambda name variable static identifier name +Python/compile.c compiler_genexp name variable static identifier name +Python/compile.c compiler_listcomp name variable static identifier name +Python/compile.c compiler_setcomp name variable static identifier name +Python/compile.c compiler_dictcomp name variable static identifier name +Python/Python-ast.c - NamedExpr_fields variable static const char *NamedExpr_fields[] +Python/Python-ast.c - NamedExpr_type variable static PyTypeObject *NamedExpr_type +Python/Python-ast.c - Name_fields variable static const char *Name_fields[] +Objects/typeobject.c - name_op variable static _Py_Identifier name_op[] +Objects/namespaceobject.c - namespace_members variable static PyMemberDef namespace_members[] +Objects/namespaceobject.c - namespace_methods variable static PyMethodDef namespace_methods +Python/Python-ast.c - Name_type variable static PyTypeObject *Name_type +Objects/obmalloc.c - narenas_currently_allocated variable static size_t narenas_currently_allocated +Objects/obmalloc.c - narenas_highwater variable static size_t narenas_highwater +Python/sysmodule.c sys_displayhook newline variable static PyObject *newline +Objects/typeobject.c - next_version_tag variable static unsigned int next_version_tag +Objects/obmalloc.c - nfp2lasta variable static struct arena_object* nfp2lasta[MAX_POOLS_IN_ARENA + 1] +Python/dynload_shlib.c - nhandles variable static int nhandles +Objects/object.c - none_as_number variable static PyNumberMethods none_as_number +Python/Python-ast.c - Nonlocal_fields variable static const char *Nonlocal_fields[] +Python/Python-ast.c - Nonlocal_type variable static PyTypeObject *Nonlocal_type +Python/Python-ast.c - NotEq_singleton variable static PyObject *NotEq_singleton +Python/Python-ast.c - NotEq_type variable static PyTypeObject *NotEq_type +Objects/object.c - notimplemented_methods variable static PyMethodDef notimplemented_methods +Python/Python-ast.c - NotIn_singleton variable static PyObject *NotIn_singleton +Python/Python-ast.c - NotIn_type variable static PyTypeObject *NotIn_type +Python/Python-ast.c - Not_singleton variable static PyObject *Not_singleton +Python/Python-ast.c - Not_type variable static PyTypeObject *Not_type +Objects/obmalloc.c - ntimes_arena_allocated variable static size_t ntimes_arena_allocated +Objects/bytesobject.c - nullstring variable static PyBytesObject *nullstring +Objects/codeobject.c PyCode_NewEmpty nulltuple variable static PyObject *nulltuple +Objects/floatobject.c - numfree variable static int numfree +Objects/frameobject.c - numfree variable static int numfree +Objects/listobject.c - numfree variable static int numfree +Objects/dictobject.c - numfree variable static int numfree +Objects/methodobject.c - numfree variable static int numfree +Objects/tupleobject.c - numfree variable static int numfree[PyTuple_MAXSAVESIZE] +Objects/classobject.c - numfree variable static int numfree +Modules/_collectionsmodule.c - numfreeblocks variable static Py_ssize_t numfreeblocks +Objects/dictobject.c - numfreekeys variable static int numfreekeys +Objects/typeobject.c - object_getsets variable static PyGetSetDef object_getsets[] +Objects/typeobject.c - object_methods variable static PyMethodDef object_methods +Objects/typeobject.c object___reduce_ex___impl objreduce variable static PyObject *objreduce +Objects/odictobject.c - odict_as_mapping variable static PyMappingMethods odict_as_mapping +Objects/odictobject.c - odict_getset variable static PyGetSetDef odict_getset[] +Objects/odictobject.c - odictitems_methods variable static PyMethodDef odictitems_methods +Objects/odictobject.c - odictiter_methods variable static PyMethodDef odictiter_methods +Objects/odictobject.c - odictkeys_methods variable static PyMethodDef odictkeys_methods +Objects/odictobject.c - odict_methods variable static PyMethodDef odict_methods +Objects/odictobject.c - odictvalues_methods variable static PyMethodDef odictvalues_methods +Modules/faulthandler.c - old_stack variable static stack_t old_stack +Modules/_operator.c - operator_methods variable static PyMethodDef operator_methods +Modules/_operator.c - operatormodule variable static struct PyModuleDef operatormodule +Python/Python-ast.c - operator_type variable static PyTypeObject *operator_type +Objects/typeobject.c slot_nb_add op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_subtract op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_multiply op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_matrix_multiply op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_remainder op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_divmod op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_power_binary op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_lshift op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_rshift op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_and op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_xor op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_or op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_floor_divide op_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_true_divide op_id variable _Py_static_string(op_id, OPSTR) +Python/getopt.c - opt_ptr variable static const wchar_t *opt_ptr +Python/initconfig.c - orig_argv variable static PyWideStringList orig_argv +Python/Python-ast.c - Or_singleton variable static PyObject *Or_singleton +Python/Python-ast.c - Or_type variable static PyTypeObject *Or_type +Objects/exceptions.c - OSError_getset variable static PyGetSetDef OSError_getset[] +Objects/exceptions.c - OSError_members variable static PyMemberDef OSError_members[] +Objects/exceptions.c - OSError_methods variable static PyMethodDef OSError_methods +Python/dtoa.c - p5s variable static Bigint *p5s +Python/Python-ast.c - Param_singleton variable static PyObject *Param_singleton +Python/Python-ast.c - Param_type variable static PyTypeObject *Param_type +Python/bltinmodule.c builtin_print _parser variable static struct _PyArg_Parser _parser +Python/clinic/_warnings.c.h warnings_warn _parser variable static _PyArg_Parser _parser +Python/clinic/bltinmodule.c.h builtin_compile _parser variable static _PyArg_Parser _parser +Python/clinic/bltinmodule.c.h builtin_round _parser variable static _PyArg_Parser _parser +Python/clinic/bltinmodule.c.h builtin_sum _parser variable static _PyArg_Parser _parser +Python/clinic/import.c.h _imp_source_hash _parser variable static _PyArg_Parser _parser +Python/clinic/sysmodule.c.h sys_addaudithook _parser variable static _PyArg_Parser _parser +Python/clinic/sysmodule.c.h sys_set_coroutine_origin_tracking_depth _parser variable static _PyArg_Parser _parser +Python/clinic/traceback.c.h tb_new _parser variable static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h bytearray_translate _parser variable static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h bytearray_split _parser variable static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h bytearray_rsplit _parser variable static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h bytearray_decode _parser variable static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h bytearray_splitlines _parser variable static _PyArg_Parser _parser +Objects/clinic/bytearrayobject.c.h bytearray_hex _parser variable static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h bytes_split _parser variable static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h bytes_rsplit _parser variable static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h bytes_translate _parser variable static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h bytes_decode _parser variable static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h bytes_splitlines _parser variable static _PyArg_Parser _parser +Objects/clinic/bytesobject.c.h bytes_hex _parser variable static _PyArg_Parser _parser +Objects/clinic/codeobject.c.h code_replace _parser variable static _PyArg_Parser _parser +Objects/clinic/complexobject.c.h complex_new _parser variable static _PyArg_Parser _parser +Objects/clinic/descrobject.c.h mappingproxy_new _parser variable static _PyArg_Parser _parser +Objects/clinic/descrobject.c.h property_init _parser variable static _PyArg_Parser _parser +Objects/clinic/enumobject.c.h enum_new _parser variable static _PyArg_Parser _parser +Objects/clinic/funcobject.c.h func_new _parser variable static _PyArg_Parser _parser +Objects/clinic/listobject.c.h list_sort _parser variable static _PyArg_Parser _parser +Objects/clinic/longobject.c.h long_new _parser variable static _PyArg_Parser _parser +Objects/clinic/longobject.c.h int_to_bytes _parser variable static _PyArg_Parser _parser +Objects/clinic/longobject.c.h int_from_bytes _parser variable static _PyArg_Parser _parser +Objects/clinic/memoryobject.c.h memoryview_hex _parser variable static _PyArg_Parser _parser +Objects/clinic/moduleobject.c.h module___init__ _parser variable static _PyArg_Parser _parser +Objects/clinic/odictobject.c.h OrderedDict_fromkeys _parser variable static _PyArg_Parser _parser +Objects/clinic/odictobject.c.h OrderedDict_setdefault _parser variable static _PyArg_Parser _parser +Objects/clinic/odictobject.c.h OrderedDict_popitem _parser variable static _PyArg_Parser _parser +Objects/clinic/odictobject.c.h OrderedDict_move_to_end _parser variable static _PyArg_Parser _parser +Objects/clinic/structseq.c.h structseq_new _parser variable static _PyArg_Parser _parser +Objects/clinic/unicodeobject.c.h unicode_encode _parser variable static _PyArg_Parser _parser +Objects/clinic/unicodeobject.c.h unicode_expandtabs _parser variable static _PyArg_Parser _parser +Objects/clinic/unicodeobject.c.h unicode_split _parser variable static _PyArg_Parser _parser +Objects/clinic/unicodeobject.c.h unicode_rsplit _parser variable static _PyArg_Parser _parser +Objects/clinic/unicodeobject.c.h unicode_splitlines _parser variable static _PyArg_Parser _parser +Objects/stringlib/clinic/transmogrify.h.h stringlib_expandtabs _parser variable static _PyArg_Parser _parser +Modules/_blake2/clinic/blake2b_impl.c.h py_blake2b_new _parser variable static _PyArg_Parser _parser +Modules/_blake2/clinic/blake2s_impl.c.h py_blake2s_new _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/_iomodule.c.h _io_open _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/_iomodule.c.h _io_open_code _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/bufferedio.c.h _io_BufferedReader___init__ _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/bufferedio.c.h _io_BufferedWriter___init__ _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/bufferedio.c.h _io_BufferedRandom___init__ _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/bytesio.c.h _io_BytesIO___init__ _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/fileio.c.h _io_FileIO___init__ _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/stringio.c.h _io_StringIO___init__ _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/textio.c.h _io_IncrementalNewlineDecoder___init__ _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/textio.c.h _io_IncrementalNewlineDecoder_decode _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/textio.c.h _io_TextIOWrapper___init__ _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/textio.c.h _io_TextIOWrapper_reconfigure _parser variable static _PyArg_Parser _parser +Modules/_io/clinic/winconsoleio.c.h _io__WindowsConsoleIO___init__ _parser variable static _PyArg_Parser _parser +Modules/_multiprocessing/clinic/posixshmem.c.h _posixshmem_shm_open _parser variable static _PyArg_Parser _parser +Modules/_multiprocessing/clinic/posixshmem.c.h _posixshmem_shm_unlink _parser variable static _PyArg_Parser _parser +Modules/cjkcodecs/clinic/multibytecodec.c.h _multibytecodec_MultibyteCodec_encode _parser variable static _PyArg_Parser _parser +Modules/cjkcodecs/clinic/multibytecodec.c.h _multibytecodec_MultibyteCodec_decode _parser variable static _PyArg_Parser _parser +Modules/cjkcodecs/clinic/multibytecodec.c.h _multibytecodec_MultibyteIncrementalEncoder_encode _parser variable static _PyArg_Parser _parser +Modules/cjkcodecs/clinic/multibytecodec.c.h _multibytecodec_MultibyteIncrementalDecoder_decode _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio_Future___init__ _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio_Future_add_done_callback _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio_Task___init__ _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio_Task_current_task _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio_Task_all_tasks _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio_Task_get_stack _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio_Task_print_stack _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio__register_task _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio__unregister_task _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio__enter_task _parser variable static _PyArg_Parser _parser +Modules/clinic/_asynciomodule.c.h _asyncio__leave_task _parser variable static _PyArg_Parser _parser +Modules/clinic/_bz2module.c.h _bz2_BZ2Decompressor_decompress _parser variable static _PyArg_Parser _parser +Modules/clinic/_codecsmodule.c.h _codecs_encode _parser variable static _PyArg_Parser _parser +Modules/clinic/_codecsmodule.c.h _codecs_decode _parser variable static _PyArg_Parser _parser +Modules/clinic/_cursesmodule.c.h _curses_setupterm _parser variable static _PyArg_Parser _parser +Modules/clinic/_datetimemodule.c.h datetime_datetime_now _parser variable static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h _elementtree_Element_find _parser variable static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h _elementtree_Element_findtext _parser variable static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h _elementtree_Element_findall _parser variable static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h _elementtree_Element_iterfind _parser variable static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h _elementtree_Element_get _parser variable static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h _elementtree_Element_iter _parser variable static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h _elementtree_Element_getiterator _parser variable static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h _elementtree_TreeBuilder___init__ _parser variable static _PyArg_Parser _parser +Modules/clinic/_elementtree.c.h _elementtree_XMLParser___init__ _parser variable static _PyArg_Parser _parser +Modules/clinic/_hashopenssl.c.h EVP_new _parser variable static _PyArg_Parser _parser +Modules/clinic/_hashopenssl.c.h pbkdf2_hmac _parser variable static _PyArg_Parser _parser +Modules/clinic/_hashopenssl.c.h _hashlib_scrypt _parser variable static _PyArg_Parser _parser +Modules/clinic/_hashopenssl.c.h _hashlib_hmac_digest _parser variable static _PyArg_Parser _parser +Modules/clinic/_lzmamodule.c.h _lzma_LZMADecompressor_decompress _parser variable static _PyArg_Parser _parser +Modules/clinic/_lzmamodule.c.h _lzma_LZMADecompressor___init__ _parser variable static _PyArg_Parser _parser +Modules/clinic/_opcode.c.h _opcode_stack_effect _parser variable static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h _pickle_Pickler___init__ _parser variable static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h _pickle_Unpickler___init__ _parser variable static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h _pickle_dump _parser variable static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h _pickle_dumps _parser variable static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h _pickle_load _parser variable static _PyArg_Parser _parser +Modules/clinic/_pickle.c.h _pickle_loads _parser variable static _PyArg_Parser _parser +Modules/clinic/_queuemodule.c.h _queue_SimpleQueue_put _parser variable static _PyArg_Parser _parser +Modules/clinic/_queuemodule.c.h _queue_SimpleQueue_put_nowait _parser variable static _PyArg_Parser _parser +Modules/clinic/_queuemodule.c.h _queue_SimpleQueue_get _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Pattern_match _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Pattern_fullmatch _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Pattern_search _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Pattern_findall _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Pattern_finditer _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Pattern_scanner _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Pattern_split _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Pattern_sub _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Pattern_subn _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_compile _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Match_expand _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Match_groups _parser variable static _PyArg_Parser _parser +Modules/clinic/_sre.c.h _sre_SRE_Match_groupdict _parser variable static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h _ssl__SSLSocket_get_channel_binding _parser variable static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h _ssl__SSLContext_load_cert_chain _parser variable static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h _ssl__SSLContext_load_verify_locations _parser variable static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h _ssl__SSLContext__wrap_socket _parser variable static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h _ssl__SSLContext__wrap_bio _parser variable static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h _ssl__SSLContext_get_ca_certs _parser variable static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h _ssl_txt2obj _parser variable static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h _ssl_enum_certificates _parser variable static _PyArg_Parser _parser +Modules/clinic/_ssl.c.h _ssl_enum_crls _parser variable static _PyArg_Parser _parser +Modules/clinic/_struct.c.h Struct___init__ _parser variable static _PyArg_Parser _parser +Modules/clinic/_struct.c.h Struct_unpack_from _parser variable static _PyArg_Parser _parser +Modules/clinic/_struct.c.h unpack_from _parser variable static _PyArg_Parser _parser +Modules/clinic/_winapi.c.h _winapi_ConnectNamedPipe _parser variable static _PyArg_Parser _parser +Modules/clinic/_winapi.c.h _winapi_ReadFile _parser variable static _PyArg_Parser _parser +Modules/clinic/_winapi.c.h _winapi_WriteFile _parser variable static _PyArg_Parser _parser +Modules/clinic/_winapi.c.h _winapi_GetFileType _parser variable static _PyArg_Parser _parser +Modules/clinic/binascii.c.h binascii_b2a_uu _parser variable static _PyArg_Parser _parser +Modules/clinic/binascii.c.h binascii_b2a_base64 _parser variable static _PyArg_Parser _parser +Modules/clinic/binascii.c.h binascii_b2a_hex _parser variable static _PyArg_Parser _parser +Modules/clinic/binascii.c.h binascii_hexlify _parser variable static _PyArg_Parser _parser +Modules/clinic/binascii.c.h binascii_a2b_qp _parser variable static _PyArg_Parser _parser +Modules/clinic/binascii.c.h binascii_b2a_qp _parser variable static _PyArg_Parser _parser +Modules/clinic/cmathmodule.c.h cmath_isclose _parser variable static _PyArg_Parser _parser +Modules/clinic/gcmodule.c.h gc_collect _parser variable static _PyArg_Parser _parser +Modules/clinic/gcmodule.c.h gc_get_objects _parser variable static _PyArg_Parser _parser +Modules/clinic/grpmodule.c.h grp_getgrgid _parser variable static _PyArg_Parser _parser +Modules/clinic/grpmodule.c.h grp_getgrnam _parser variable static _PyArg_Parser _parser +Modules/_functoolsmodule.c - partial_getsetlist variable static PyGetSetDef partial_getsetlist[] +Modules/_functoolsmodule.c - partial_memberlist variable static PyMemberDef partial_memberlist[] +Modules/_functoolsmodule.c - partial_methods variable static PyMethodDef partial_methods +Modules/_functoolsmodule.c - partial_type variable static PyTypeObject partial_type +Python/Python-ast.c - Pass_type variable static PyTypeObject *Pass_type +Modules/_sre.c - pattern_getset variable static PyGetSetDef pattern_getset[] +Modules/_sre.c - pattern_members variable static PyMemberDef pattern_members[] +Modules/_sre.c - pattern_methods variable static PyMethodDef pattern_methods +Modules/_sre.c - Pattern_Type variable static PyTypeObject Pattern_Type +Modules/itertoolsmodule.c - permuations_methods variable static PyMethodDef permuations_methods +Modules/itertoolsmodule.c - permutations_type variable static PyTypeObject permutations_type +Objects/picklebufobject.c - picklebuf_as_buffer variable static PyBufferProcs picklebuf_as_buffer +Objects/picklebufobject.c - picklebuf_methods variable static PyMethodDef picklebuf_methods +Python/dtoa.c - pmem_next variable static double *pmem_next +Objects/typeobject.c resolve_slotdups pname variable static PyObject *pname +Modules/posixmodule.c - posix_constants_confstr variable static struct constdef posix_constants_confstr[] +Modules/posixmodule.c - posix_constants_pathconf variable static struct constdef posix_constants_pathconf[] +Modules/posixmodule.c - posix_constants_sysconf variable static struct constdef posix_constants_sysconf[] +Modules/posixmodule.c - posix_methods variable static PyMethodDef posix_methods +Modules/posixmodule.c - posixmodule variable static struct PyModuleDef posixmodule +Modules/posixmodule.c - posix_putenv_garbage variable static PyObject *posix_putenv_garbage +Python/Python-ast.c - Pow_singleton variable static PyObject *Pow_singleton +Python/Python-ast.c - Pow_type variable static PyTypeObject *Pow_type +Python/sysmodule.c - _preinit_warnoptions variable static _Py_PreInitEntry _preinit_warnoptions +Python/sysmodule.c - _preinit_xoptions variable static _Py_PreInitEntry _preinit_xoptions +Objects/exceptions.c _check_for_legacy_statements print_prefix variable static PyObject *print_prefix +Python/dtoa.c - private_mem variable static double private_mem[PRIVATE_mem] +Modules/itertoolsmodule.c - product_methods variable static PyMethodDef product_methods +Modules/itertoolsmodule.c - product_type variable static PyTypeObject product_type +Objects/descrobject.c - property_getsetlist variable static PyGetSetDef property_getsetlist[] +Objects/descrobject.c - property_members variable static PyMemberDef property_members[] +Objects/descrobject.c - property_methods variable static PyMethodDef property_methods +Objects/weakrefobject.c - proxy_as_mapping variable static PyMappingMethods proxy_as_mapping +Objects/weakrefobject.c - proxy_as_number variable static PyNumberMethods proxy_as_number +Objects/weakrefobject.c - proxy_as_sequence variable static PySequenceMethods proxy_as_sequence +Objects/weakrefobject.c - proxy_methods variable static PyMethodDef proxy_methods +Objects/typeobject.c resolve_slotdups ptrs variable static slotdef *ptrs[MAX_EQUIV] +Modules/pwdmodule.c - pwd_methods variable static PyMethodDef pwd_methods +Modules/pwdmodule.c - pwdmodule variable static struct PyModuleDef pwdmodule +Objects/obmalloc.c - _Py_AllocatedBlocks variable static Py_ssize_t _Py_AllocatedBlocks +Objects/genobject.c - _PyAsyncGenASend_Type variable PyTypeObject _PyAsyncGenASend_Type +Objects/genobject.c - _PyAsyncGenAThrow_Type variable PyTypeObject _PyAsyncGenAThrow_Type +Objects/genobject.c - PyAsyncGen_Type variable PyTypeObject PyAsyncGen_Type +Objects/genobject.c - _PyAsyncGenWrappedValue_Type variable PyTypeObject _PyAsyncGenWrappedValue_Type +Objects/typeobject.c - PyBaseObject_Type variable PyTypeObject PyBaseObject_Type +Modules/_blake2/blake2b_impl.c - PyBlake2_BLAKE2bType variable PyTypeObject PyBlake2_BLAKE2bType +Modules/_blake2/blake2s_impl.c - PyBlake2_BLAKE2sType variable PyTypeObject PyBlake2_BLAKE2sType +Objects/boolobject.c - PyBool_Type variable PyTypeObject PyBool_Type +Modules/_io/bufferedio.c - PyBufferedIOBase_Type variable PyTypeObject PyBufferedIOBase_Type +Modules/_io/bufferedio.c - PyBufferedRandom_Type variable PyTypeObject PyBufferedRandom_Type +Modules/_io/bufferedio.c - PyBufferedReader_Type variable PyTypeObject PyBufferedReader_Type +Modules/_io/bufferedio.c - PyBufferedRWPair_Type variable PyTypeObject PyBufferedRWPair_Type +Modules/_io/bufferedio.c - PyBufferedWriter_Type variable PyTypeObject PyBufferedWriter_Type +Objects/bytearrayobject.c - _PyByteArray_empty_string variable char _PyByteArray_empty_string[] +Objects/bytearrayobject.c - PyByteArrayIter_Type variable PyTypeObject PyByteArrayIter_Type +Objects/bytearrayobject.c - PyByteArray_Type variable PyTypeObject PyByteArray_Type +Modules/_io/bytesio.c - _PyBytesIOBuffer_Type variable PyTypeObject _PyBytesIOBuffer_Type +Modules/_io/bytesio.c - PyBytesIO_Type variable PyTypeObject PyBytesIO_Type +Objects/bytesobject.c - PyBytesIter_Type variable PyTypeObject PyBytesIter_Type +Objects/bytesobject.c - PyBytes_Type variable PyTypeObject PyBytes_Type +Python/initconfig.c - Py_BytesWarningFlag variable int Py_BytesWarningFlag +Objects/iterobject.c - PyCallIter_Type variable PyTypeObject PyCallIter_Type +Objects/capsule.c - PyCapsule_Type variable PyTypeObject PyCapsule_Type +Objects/cellobject.c - PyCell_Type variable PyTypeObject PyCell_Type +Objects/methodobject.c - PyCFunction_Type variable PyTypeObject PyCFunction_Type +Python/ceval.c - _Py_CheckRecursionLimit variable int _Py_CheckRecursionLimit +Objects/descrobject.c - PyClassMethodDescr_Type variable PyTypeObject PyClassMethodDescr_Type +Objects/funcobject.c - PyClassMethod_Type variable PyTypeObject PyClassMethod_Type +Objects/codeobject.c - PyCode_Type variable PyTypeObject PyCode_Type +Objects/complexobject.c - PyComplex_Type variable PyTypeObject PyComplex_Type +Python/context.c - PyContext_as_mapping variable static PyMappingMethods PyContext_as_mapping +Python/context.c - PyContext_as_sequence variable static PySequenceMethods PyContext_as_sequence +Python/context.c - PyContext_methods variable static PyMethodDef PyContext_methods +Python/context.c - PyContextTokenMissing_Type variable PyTypeObject PyContextTokenMissing_Type +Python/context.c - PyContextToken_Type variable PyTypeObject PyContextToken_Type +Python/context.c - PyContextTokenType_getsetlist variable static PyGetSetDef PyContextTokenType_getsetlist[] +Python/context.c - PyContext_Type variable PyTypeObject PyContext_Type +Python/context.c - PyContextVar_members variable static PyMemberDef PyContextVar_members[] +Python/context.c - PyContextVar_methods variable static PyMethodDef PyContextVar_methods +Python/context.c - PyContextVar_Type variable PyTypeObject PyContextVar_Type +Objects/genobject.c - PyCoro_Type variable PyTypeObject PyCoro_Type +Objects/genobject.c - _PyCoroWrapper_Type variable PyTypeObject _PyCoroWrapper_Type +Python/initconfig.c - Py_DebugFlag variable int Py_DebugFlag +Objects/dictobject.c - pydict_global_version variable static uint64_t pydict_global_version +Objects/dictobject.c - PyDictItems_Type variable PyTypeObject PyDictItems_Type +Objects/dictobject.c - PyDictIterItem_Type variable PyTypeObject PyDictIterItem_Type +Objects/dictobject.c - PyDictIterKey_Type variable PyTypeObject PyDictIterKey_Type +Objects/dictobject.c - PyDictIterValue_Type variable PyTypeObject PyDictIterValue_Type +Objects/dictobject.c - PyDictKeys_Type variable PyTypeObject PyDictKeys_Type +Objects/descrobject.c - PyDictProxy_Type variable PyTypeObject PyDictProxy_Type +Objects/dictobject.c - PyDictRevIterItem_Type variable PyTypeObject PyDictRevIterItem_Type +Objects/dictobject.c - PyDictRevIterKey_Type variable PyTypeObject PyDictRevIterKey_Type +Objects/dictobject.c - PyDictRevIterValue_Type variable PyTypeObject PyDictRevIterValue_Type +Objects/dictobject.c - PyDict_Type variable PyTypeObject PyDict_Type +Objects/dictobject.c - PyDictValues_Type variable PyTypeObject PyDictValues_Type +Python/initconfig.c - Py_DontWriteBytecodeFlag variable int Py_DontWriteBytecodeFlag +Objects/sliceobject.c - _Py_EllipsisObject variable PyObject _Py_EllipsisObject +Objects/sliceobject.c - PyEllipsis_Type variable PyTypeObject PyEllipsis_Type +Objects/enumobject.c - PyEnum_Type variable PyTypeObject PyEnum_Type +Objects/exceptions.c - _PyExc_ArithmeticError variable static PyTypeObject _PyExc_ArithmeticError +Objects/exceptions.c - PyExc_ArithmeticError variable static PyTypeObject PyExc_ArithmeticError +Objects/exceptions.c - _PyExc_AssertionError variable static PyTypeObject _PyExc_AssertionError +Objects/exceptions.c - PyExc_AssertionError variable static PyTypeObject PyExc_AssertionError +Objects/exceptions.c - _PyExc_AttributeError variable static PyTypeObject _PyExc_AttributeError +Objects/exceptions.c - PyExc_AttributeError variable static PyTypeObject PyExc_AttributeError +Objects/exceptions.c - _PyExc_BaseException variable static PyTypeObject _PyExc_BaseException +Objects/exceptions.c - PyExc_BaseException variable static PyTypeObject PyExc_BaseException +Objects/exceptions.c - _PyExc_BlockingIOError variable static PyTypeObject _PyExc_BlockingIOError +Objects/exceptions.c - PyExc_BlockingIOError variable static PyTypeObject PyExc_BlockingIOError +Objects/exceptions.c - _PyExc_BrokenPipeError variable static PyTypeObject _PyExc_BrokenPipeError +Objects/exceptions.c - PyExc_BrokenPipeError variable static PyTypeObject PyExc_BrokenPipeError +Objects/exceptions.c - _PyExc_BufferError variable static PyTypeObject _PyExc_BufferError +Objects/exceptions.c - PyExc_BufferError variable static PyTypeObject PyExc_BufferError +Objects/exceptions.c - _PyExc_BytesWarning variable static PyTypeObject _PyExc_BytesWarning +Objects/exceptions.c - PyExc_BytesWarning variable static PyTypeObject PyExc_BytesWarning +Objects/exceptions.c - _PyExc_ChildProcessError variable static PyTypeObject _PyExc_ChildProcessError +Objects/exceptions.c - PyExc_ChildProcessError variable static PyTypeObject PyExc_ChildProcessError +Objects/exceptions.c - _PyExc_ConnectionAbortedError variable static PyTypeObject _PyExc_ConnectionAbortedError +Objects/exceptions.c - PyExc_ConnectionAbortedError variable static PyTypeObject PyExc_ConnectionAbortedError +Objects/exceptions.c - _PyExc_ConnectionError variable static PyTypeObject _PyExc_ConnectionError +Objects/exceptions.c - PyExc_ConnectionError variable static PyTypeObject PyExc_ConnectionError +Objects/exceptions.c - _PyExc_ConnectionRefusedError variable static PyTypeObject _PyExc_ConnectionRefusedError +Objects/exceptions.c - PyExc_ConnectionRefusedError variable static PyTypeObject PyExc_ConnectionRefusedError +Objects/exceptions.c - _PyExc_ConnectionResetError variable static PyTypeObject _PyExc_ConnectionResetError +Objects/exceptions.c - PyExc_ConnectionResetError variable static PyTypeObject PyExc_ConnectionResetError +Objects/exceptions.c - _PyExc_DeprecationWarning variable static PyTypeObject _PyExc_DeprecationWarning +Objects/exceptions.c - PyExc_DeprecationWarning variable static PyTypeObject PyExc_DeprecationWarning +Objects/exceptions.c - PyExc_EnvironmentError variable static PyTypeObject PyExc_EnvironmentError +Objects/exceptions.c - _PyExc_EOFError variable static PyTypeObject _PyExc_EOFError +Objects/exceptions.c - PyExc_EOFError variable static PyTypeObject PyExc_EOFError +Objects/exceptions.c - _PyExc_Exception variable static PyTypeObject _PyExc_Exception +Objects/exceptions.c - PyExc_Exception variable static PyTypeObject PyExc_Exception +Objects/exceptions.c - _PyExc_FileExistsError variable static PyTypeObject _PyExc_FileExistsError +Objects/exceptions.c - PyExc_FileExistsError variable static PyTypeObject PyExc_FileExistsError +Objects/exceptions.c - _PyExc_FileNotFoundError variable static PyTypeObject _PyExc_FileNotFoundError +Objects/exceptions.c - PyExc_FileNotFoundError variable static PyTypeObject PyExc_FileNotFoundError +Objects/exceptions.c - _PyExc_FloatingPointError variable static PyTypeObject _PyExc_FloatingPointError +Objects/exceptions.c - PyExc_FloatingPointError variable static PyTypeObject PyExc_FloatingPointError +Objects/exceptions.c - _PyExc_FutureWarning variable static PyTypeObject _PyExc_FutureWarning +Objects/exceptions.c - PyExc_FutureWarning variable static PyTypeObject PyExc_FutureWarning +Objects/exceptions.c - _PyExc_GeneratorExit variable static PyTypeObject _PyExc_GeneratorExit +Objects/exceptions.c - PyExc_GeneratorExit variable static PyTypeObject PyExc_GeneratorExit +Objects/exceptions.c - _PyExc_ImportError variable static PyTypeObject _PyExc_ImportError +Objects/exceptions.c - PyExc_ImportError variable static PyTypeObject PyExc_ImportError +Objects/exceptions.c - _PyExc_ImportWarning variable static PyTypeObject _PyExc_ImportWarning +Objects/exceptions.c - PyExc_ImportWarning variable static PyTypeObject PyExc_ImportWarning +Objects/exceptions.c - _PyExc_IndentationError variable static PyTypeObject _PyExc_IndentationError +Objects/exceptions.c - PyExc_IndentationError variable static PyTypeObject PyExc_IndentationError +Objects/exceptions.c - _PyExc_IndexError variable static PyTypeObject _PyExc_IndexError +Objects/exceptions.c - PyExc_IndexError variable static PyTypeObject PyExc_IndexError +Objects/exceptions.c - _PyExc_InterruptedError variable static PyTypeObject _PyExc_InterruptedError +Objects/exceptions.c - PyExc_InterruptedError variable static PyTypeObject PyExc_InterruptedError +Objects/exceptions.c - PyExc_IOError variable static PyTypeObject PyExc_IOError +Objects/exceptions.c - _PyExc_IsADirectoryError variable static PyTypeObject _PyExc_IsADirectoryError +Objects/exceptions.c - PyExc_IsADirectoryError variable static PyTypeObject PyExc_IsADirectoryError +Objects/exceptions.c - _PyExc_KeyboardInterrupt variable static PyTypeObject _PyExc_KeyboardInterrupt +Objects/exceptions.c - PyExc_KeyboardInterrupt variable static PyTypeObject PyExc_KeyboardInterrupt +Objects/exceptions.c - _PyExc_KeyError variable static PyTypeObject _PyExc_KeyError +Objects/exceptions.c - PyExc_KeyError variable static PyTypeObject PyExc_KeyError +Objects/exceptions.c - _PyExc_LookupError variable static PyTypeObject _PyExc_LookupError +Objects/exceptions.c - PyExc_LookupError variable static PyTypeObject PyExc_LookupError +Objects/exceptions.c - _PyExc_MemoryError variable static PyTypeObject _PyExc_MemoryError +Objects/exceptions.c - PyExc_MemoryError variable static PyTypeObject PyExc_MemoryError +Objects/exceptions.c - _PyExc_ModuleNotFoundError variable static PyTypeObject _PyExc_ModuleNotFoundError +Objects/exceptions.c - PyExc_ModuleNotFoundError variable static PyTypeObject PyExc_ModuleNotFoundError +Objects/exceptions.c - _PyExc_NameError variable static PyTypeObject _PyExc_NameError +Objects/exceptions.c - PyExc_NameError variable static PyTypeObject PyExc_NameError +Objects/exceptions.c - _PyExc_NotADirectoryError variable static PyTypeObject _PyExc_NotADirectoryError +Objects/exceptions.c - PyExc_NotADirectoryError variable static PyTypeObject PyExc_NotADirectoryError +Objects/exceptions.c - _PyExc_NotImplementedError variable static PyTypeObject _PyExc_NotImplementedError +Objects/exceptions.c - PyExc_NotImplementedError variable static PyTypeObject PyExc_NotImplementedError +Objects/exceptions.c - _PyExc_OSError variable static PyTypeObject _PyExc_OSError +Objects/exceptions.c - PyExc_OSError variable static PyTypeObject PyExc_OSError +Objects/exceptions.c - _PyExc_OverflowError variable static PyTypeObject _PyExc_OverflowError +Objects/exceptions.c - PyExc_OverflowError variable static PyTypeObject PyExc_OverflowError +Objects/exceptions.c - _PyExc_PendingDeprecationWarning variable static PyTypeObject _PyExc_PendingDeprecationWarning +Objects/exceptions.c - PyExc_PendingDeprecationWarning variable static PyTypeObject PyExc_PendingDeprecationWarning +Objects/exceptions.c - _PyExc_PermissionError variable static PyTypeObject _PyExc_PermissionError +Objects/exceptions.c - PyExc_PermissionError variable static PyTypeObject PyExc_PermissionError +Objects/exceptions.c - _PyExc_ProcessLookupError variable static PyTypeObject _PyExc_ProcessLookupError +Objects/exceptions.c - PyExc_ProcessLookupError variable static PyTypeObject PyExc_ProcessLookupError +Objects/exceptions.c - _PyExc_RecursionError variable static PyTypeObject _PyExc_RecursionError +Objects/exceptions.c - PyExc_RecursionError variable static PyTypeObject PyExc_RecursionError +Objects/exceptions.c - _PyExc_ReferenceError variable static PyTypeObject _PyExc_ReferenceError +Objects/exceptions.c - PyExc_ReferenceError variable static PyTypeObject PyExc_ReferenceError +Objects/exceptions.c - _PyExc_ResourceWarning variable static PyTypeObject _PyExc_ResourceWarning +Objects/exceptions.c - PyExc_ResourceWarning variable static PyTypeObject PyExc_ResourceWarning +Objects/exceptions.c - _PyExc_RuntimeError variable static PyTypeObject _PyExc_RuntimeError +Objects/exceptions.c - PyExc_RuntimeError variable static PyTypeObject PyExc_RuntimeError +Objects/exceptions.c - _PyExc_RuntimeWarning variable static PyTypeObject _PyExc_RuntimeWarning +Objects/exceptions.c - PyExc_RuntimeWarning variable static PyTypeObject PyExc_RuntimeWarning +Objects/exceptions.c - _PyExc_StopAsyncIteration variable static PyTypeObject _PyExc_StopAsyncIteration +Objects/exceptions.c - PyExc_StopAsyncIteration variable static PyTypeObject PyExc_StopAsyncIteration +Objects/exceptions.c - _PyExc_StopIteration variable static PyTypeObject _PyExc_StopIteration +Objects/exceptions.c - PyExc_StopIteration variable static PyTypeObject PyExc_StopIteration +Objects/exceptions.c - _PyExc_SyntaxError variable static PyTypeObject _PyExc_SyntaxError +Objects/exceptions.c - PyExc_SyntaxError variable static PyTypeObject PyExc_SyntaxError +Objects/exceptions.c - _PyExc_SyntaxWarning variable static PyTypeObject _PyExc_SyntaxWarning +Objects/exceptions.c - PyExc_SyntaxWarning variable static PyTypeObject PyExc_SyntaxWarning +Objects/exceptions.c - _PyExc_SystemError variable static PyTypeObject _PyExc_SystemError +Objects/exceptions.c - PyExc_SystemError variable static PyTypeObject PyExc_SystemError +Objects/exceptions.c - _PyExc_SystemExit variable static PyTypeObject _PyExc_SystemExit +Objects/exceptions.c - PyExc_SystemExit variable static PyTypeObject PyExc_SystemExit +Objects/exceptions.c - _PyExc_TabError variable static PyTypeObject _PyExc_TabError +Objects/exceptions.c - PyExc_TabError variable static PyTypeObject PyExc_TabError +Objects/exceptions.c - _PyExc_TargetScopeError variable static PyTypeObject _PyExc_TargetScopeError +Objects/exceptions.c - PyExc_TargetScopeError variable static PyTypeObject PyExc_TargetScopeError +Objects/exceptions.c - _PyExc_TimeoutError variable static PyTypeObject _PyExc_TimeoutError +Objects/exceptions.c - PyExc_TimeoutError variable static PyTypeObject PyExc_TimeoutError +Objects/exceptions.c - _PyExc_TypeError variable static PyTypeObject _PyExc_TypeError +Objects/exceptions.c - PyExc_TypeError variable static PyTypeObject PyExc_TypeError +Objects/exceptions.c - _PyExc_UnboundLocalError variable static PyTypeObject _PyExc_UnboundLocalError +Objects/exceptions.c - PyExc_UnboundLocalError variable static PyTypeObject PyExc_UnboundLocalError +Objects/exceptions.c - _PyExc_UnicodeDecodeError variable static PyTypeObject _PyExc_UnicodeDecodeError +Objects/exceptions.c - PyExc_UnicodeDecodeError variable static PyTypeObject PyExc_UnicodeDecodeError +Objects/exceptions.c - _PyExc_UnicodeEncodeError variable static PyTypeObject _PyExc_UnicodeEncodeError +Objects/exceptions.c - PyExc_UnicodeEncodeError variable static PyTypeObject PyExc_UnicodeEncodeError +Objects/exceptions.c - _PyExc_UnicodeError variable static PyTypeObject _PyExc_UnicodeError +Objects/exceptions.c - PyExc_UnicodeError variable static PyTypeObject PyExc_UnicodeError +Objects/exceptions.c - _PyExc_UnicodeTranslateError variable static PyTypeObject _PyExc_UnicodeTranslateError +Objects/exceptions.c - PyExc_UnicodeTranslateError variable static PyTypeObject PyExc_UnicodeTranslateError +Objects/exceptions.c - _PyExc_UnicodeWarning variable static PyTypeObject _PyExc_UnicodeWarning +Objects/exceptions.c - PyExc_UnicodeWarning variable static PyTypeObject PyExc_UnicodeWarning +Objects/exceptions.c - _PyExc_UserWarning variable static PyTypeObject _PyExc_UserWarning +Objects/exceptions.c - PyExc_UserWarning variable static PyTypeObject PyExc_UserWarning +Objects/exceptions.c - _PyExc_ValueError variable static PyTypeObject _PyExc_ValueError +Objects/exceptions.c - PyExc_ValueError variable static PyTypeObject PyExc_ValueError +Objects/exceptions.c - _PyExc_Warning variable static PyTypeObject _PyExc_Warning +Objects/exceptions.c - PyExc_Warning variable static PyTypeObject PyExc_Warning +Objects/exceptions.c - _PyExc_ZeroDivisionError variable static PyTypeObject _PyExc_ZeroDivisionError +Objects/exceptions.c - PyExc_ZeroDivisionError variable static PyTypeObject PyExc_ZeroDivisionError +Objects/boolobject.c - _Py_FalseStruct variable static struct _longobject _Py_FalseStruct +Objects/tupleobject.c - _Py_fast_tuple_allocs variable Py_ssize_t _Py_fast_tuple_allocs +Objects/stringlib/unicode_format.h - PyFieldNameIter_Type variable static PyTypeObject PyFieldNameIter_Type +Modules/_io/fileio.c - PyFileIO_Type variable PyTypeObject PyFileIO_Type +Python/preconfig.c - Py_FileSystemDefaultEncodeErrors variable const char *Py_FileSystemDefaultEncodeErrors +Python/preconfig.c - Py_FileSystemDefaultEncoding variable const char * Py_FileSystemDefaultEncoding +Python/bltinmodule.c - PyFilter_Type variable PyTypeObject PyFilter_Type +Objects/floatobject.c - PyFloat_Type variable PyTypeObject PyFloat_Type +Objects/stringlib/unicode_format.h - PyFormatterIter_Type variable static PyTypeObject PyFormatterIter_Type +Objects/frameobject.c - PyFrame_Type variable PyTypeObject PyFrame_Type +Python/initconfig.c - Py_FrozenFlag variable int Py_FrozenFlag +Objects/setobject.c - PyFrozenSet_Type variable PyTypeObject PyFrozenSet_Type +Objects/funcobject.c - PyFunction_Type variable PyTypeObject PyFunction_Type +Objects/genobject.c - PyGen_Type variable PyTypeObject PyGen_Type +Objects/descrobject.c - PyGetSetDescr_Type variable PyTypeObject PyGetSetDescr_Type +Python/hamt.c - _PyHamt_ArrayNode_Type variable PyTypeObject _PyHamt_ArrayNode_Type +Python/hamt.c - PyHamt_as_mapping variable static PyMappingMethods PyHamt_as_mapping +Python/hamt.c - PyHamt_as_sequence variable static PySequenceMethods PyHamt_as_sequence +Python/hamt.c - _PyHamt_BitmapNode_Type variable PyTypeObject _PyHamt_BitmapNode_Type +Python/hamt.c - _PyHamt_CollisionNode_Type variable PyTypeObject _PyHamt_CollisionNode_Type +Python/hamt.c - _PyHamtItems_Type variable PyTypeObject _PyHamtItems_Type +Python/hamt.c - PyHamtIterator_as_mapping variable static PyMappingMethods PyHamtIterator_as_mapping +Python/hamt.c - _PyHamtKeys_Type variable PyTypeObject _PyHamtKeys_Type +Python/hamt.c - PyHamt_methods variable static PyMethodDef PyHamt_methods +Python/hamt.c - _PyHamt_Type variable PyTypeObject _PyHamt_Type +Python/hamt.c - _PyHamtValues_Type variable PyTypeObject _PyHamtValues_Type +Python/preconfig.c - _Py_HasFileSystemDefaultEncodeErrors variable const(int) _Py_HasFileSystemDefaultEncodeErrors +Python/preconfig.c - Py_HasFileSystemDefaultEncoding variable const(int) Py_HasFileSystemDefaultEncoding +Python/pyhash.c - PyHash_Func variable static PyHash_FuncDef PyHash_Func +Python/initconfig.c - Py_HashRandomizationFlag variable int Py_HashRandomizationFlag +Python/pyhash.c - _Py_HashSecret variable _Py_HashSecret_t _Py_HashSecret +Python/bootstrap_hash.c - _Py_HashSecret_Initialized variable static int _Py_HashSecret_Initialized +Python/codecs.c - Py_hexdigits variable const char * Py_hexdigits +Python/sysmodule.c - PyId__ variable _Py_IDENTIFIER(_) +Modules/_abc.c - PyId__abc_impl variable _Py_IDENTIFIER(_abc_impl) +Objects/typeobject.c - PyId___abstractmethods__ variable _Py_IDENTIFIER(__abstractmethods__) +Modules/_abc.c - PyId___abstractmethods__ variable _Py_IDENTIFIER(__abstractmethods__) +Python/ceval.c _PyEval_EvalFrameDefault PyId___aenter__ variable _Py_IDENTIFIER(__aenter__) +Python/ceval.c _PyEval_EvalFrameDefault PyId___aexit__ variable _Py_IDENTIFIER(__aexit__) +Objects/typeobject.c slot_am_aiter PyId___aiter__ variable _Py_IDENTIFIER(__aiter__) +Python/ceval.c import_all_from PyId___all__ variable _Py_IDENTIFIER(__all__) +Objects/typeobject.c slot_am_anext PyId___anext__ variable _Py_IDENTIFIER(__anext__) +Python/Python-ast.c - PyId_annotation variable _Py_IDENTIFIER(annotation) +Python/ceval.c _PyEval_EvalFrameDefault PyId___annotations__ variable _Py_IDENTIFIER(__annotations__) +Python/Python-ast.c - PyId_arg variable _Py_IDENTIFIER(arg) +Python/Python-ast.c - PyId_args variable _Py_IDENTIFIER(args) +Python/Python-ast.c - PyId_argtypes variable _Py_IDENTIFIER(argtypes) +Python/Python-ast.c - PyId_asname variable _Py_IDENTIFIER(asname) +Python/Python-ast.c make_type PyId__ast variable _Py_IDENTIFIER(_ast) +Python/Python-ast.c - PyId_attr variable _Py_IDENTIFIER(attr) +Python/Python-ast.c - PyId__attributes variable _Py_IDENTIFIER(_attributes) +Objects/typeobject.c slot_am_await PyId___await__ variable _Py_IDENTIFIER(__await__) +Python/Python-ast.c - PyId_bases variable _Py_IDENTIFIER(bases) +Modules/_abc.c - PyId___bases__ variable _Py_IDENTIFIER(__bases__) +Objects/abstract.c abstract_get_bases PyId___bases__ variable _Py_IDENTIFIER(__bases__) +Objects/typeobject.c merge_class_dict PyId___bases__ variable _Py_IDENTIFIER(__bases__) +Objects/longobject.c - PyId_big variable _Py_IDENTIFIER(big) +Modules/_io/_iomodule.c _io_open_impl PyId__blksize variable _Py_IDENTIFIER(_blksize) +Python/Python-ast.c - PyId_body variable _Py_IDENTIFIER(body) +Objects/typeobject.c slot_nb_bool PyId___bool__ variable _Py_IDENTIFIER(__bool__) +Python/sysmodule.c - PyId_buffer variable _Py_IDENTIFIER(buffer) +Python/ceval.c _PyEval_EvalFrameDefault PyId___build_class__ variable _Py_IDENTIFIER(__build_class__) +Objects/typeobject.c - PyId_builtins variable _Py_IDENTIFIER(builtins) +Python/errors.c - PyId_builtins variable _Py_IDENTIFIER(builtins) +Python/pythonrun.c - PyId_builtins variable _Py_IDENTIFIER(builtins) +Python/sysmodule.c - PyId_builtins variable _Py_IDENTIFIER(builtins) +Objects/frameobject.c - PyId___builtins__ variable _Py_IDENTIFIER(__builtins__) +Python/bltinmodule.c - PyId___builtins__ variable _Py_IDENTIFIER(__builtins__) +Python/import.c module_dict_for_exec PyId___builtins__ variable _Py_IDENTIFIER(__builtins__) +Objects/object.c - PyId___bytes__ variable _Py_IDENTIFIER(__bytes__) +Objects/bytesobject.c format_obj PyId___bytes__ variable _Py_IDENTIFIER(__bytes__) +Objects/bytesobject.c bytes_new PyId___bytes__ variable _Py_IDENTIFIER(__bytes__) +Objects/weakrefobject.c proxy_bytes PyId___bytes__ variable _Py_IDENTIFIER(__bytes__) +Objects/typeobject.c slot_tp_call PyId___call__ variable _Py_IDENTIFIER(__call__) +Python/Python-ast.c - PyId_cause variable _Py_IDENTIFIER(cause) +Objects/typeobject.c - PyId___class__ variable _Py_IDENTIFIER(__class__) +Modules/_abc.c - PyId___class__ variable _Py_IDENTIFIER(__class__) +Python/compile.c compiler_enter_scope PyId___class__ variable _Py_IDENTIFIER(__class__) +Objects/abstract.c recursive_isinstance PyId___class__ variable _Py_IDENTIFIER(__class__) +Objects/typeobject.c type_new PyId___classcell__ variable _Py_IDENTIFIER(__classcell__) +Objects/typeobject.c - PyId___class_getitem__ variable _Py_IDENTIFIER(__class_getitem__) +Objects/abstract.c PyObject_GetItem PyId___class_getitem__ variable _Py_IDENTIFIER(__class_getitem__) +Python/import.c PyImport_Cleanup PyId_clear variable _Py_IDENTIFIER(clear) +Python/traceback.c - PyId_close variable _Py_IDENTIFIER(close) +Modules/_io/bufferedio.c - PyId_close variable _Py_IDENTIFIER(close) +Modules/_io/textio.c - PyId_close variable _Py_IDENTIFIER(close) +Objects/genobject.c gen_close_iter PyId_close variable _Py_IDENTIFIER(close) +Modules/_dbmmodule.c dbm__exit__ PyId_close variable _Py_IDENTIFIER(close) +Modules/_gdbmmodule.c dbm__exit__ PyId_close variable _Py_IDENTIFIER(close) +Python/pythonrun.c _Py_HandleSystemExit PyId_code variable _Py_IDENTIFIER(code) +Python/Python-ast.c - PyId_col_offset variable _Py_IDENTIFIER(col_offset) +Python/Python-ast.c - PyId_comparators variable _Py_IDENTIFIER(comparators) +Objects/complexobject.c try_complex_special_method PyId___complex__ variable _Py_IDENTIFIER(__complex__) +Objects/typeobject.c slot_sq_contains PyId___contains__ variable _Py_IDENTIFIER(__contains__) +Python/Python-ast.c - PyId_context_expr variable _Py_IDENTIFIER(context_expr) +Python/Python-ast.c - PyId_conversion variable _Py_IDENTIFIER(conversion) +Modules/itertoolsmodule.c itertools_tee_impl PyId___copy__ variable _Py_IDENTIFIER(__copy__) +Objects/descrobject.c mappingproxy_copy PyId_copy variable _Py_IDENTIFIER(copy) +Objects/typeobject.c import_copyreg PyId_copyreg variable _Py_IDENTIFIER(copyreg) +Python/Python-ast.c - PyId_ctx variable _Py_IDENTIFIER(ctx) +Modules/_io/bufferedio.c - PyId__dealloc_warn variable _Py_IDENTIFIER(_dealloc_warn) +Modules/_io/textio.c - PyId__dealloc_warn variable _Py_IDENTIFIER(_dealloc_warn) +Modules/_io/textio.c - PyId_decode variable _Py_IDENTIFIER(decode) +Python/Python-ast.c - PyId_decorator_list variable _Py_IDENTIFIER(decorator_list) +Python/_warnings.c get_default_action PyId_defaultaction variable _Py_IDENTIFIER(defaultaction) +Python/Python-ast.c - PyId_defaults variable _Py_IDENTIFIER(defaults) +Objects/typeobject.c slot_tp_finalize PyId___del__ variable _Py_IDENTIFIER(__del__) +Objects/typeobject.c slot_tp_setattro PyId___delattr__ variable _Py_IDENTIFIER(__delattr__) +Objects/typeobject.c slot_tp_descr_set PyId___delete__ variable _Py_IDENTIFIER(__delete__) +Objects/typeobject.c - PyId___delitem__ variable _Py_IDENTIFIER(__delitem__) +Objects/typeobject.c - PyId___dict__ variable _Py_IDENTIFIER(__dict__) +Modules/_abc.c - PyId___dict__ variable _Py_IDENTIFIER(__dict__) +Python/bltinmodule.c - PyId___dict__ variable _Py_IDENTIFIER(__dict__) +Python/Python-ast.c ast_type_reduce PyId___dict__ variable _Py_IDENTIFIER(__dict__) +Python/ceval.c import_all_from PyId___dict__ variable _Py_IDENTIFIER(__dict__) +Objects/bytearrayobject.c _common_reduce PyId___dict__ variable _Py_IDENTIFIER(__dict__) +Objects/moduleobject.c module_dir PyId___dict__ variable _Py_IDENTIFIER(__dict__) +Objects/odictobject.c odict_reduce PyId___dict__ variable _Py_IDENTIFIER(__dict__) +Objects/setobject.c set_reduce PyId___dict__ variable _Py_IDENTIFIER(__dict__) +Modules/_collectionsmodule.c deque_reduce PyId___dict__ variable _Py_IDENTIFIER(__dict__) +Objects/dictobject.c dictviews_sub PyId_difference_update variable _Py_IDENTIFIER(difference_update) +Python/Python-ast.c - PyId_dims variable _Py_IDENTIFIER(dims) +Objects/object.c - PyId___dir__ variable _Py_IDENTIFIER(__dir__) +Objects/moduleobject.c module_dir PyId___dir__ variable _Py_IDENTIFIER(__dir__) +Python/ceval.c _PyEval_EvalFrameDefault PyId_displayhook variable _Py_IDENTIFIER(displayhook) +Objects/typeobject.c - PyId___doc__ variable _Py_IDENTIFIER(__doc__) +Objects/descrobject.c property_init_impl PyId___doc__ variable _Py_IDENTIFIER(__doc__) +Objects/moduleobject.c module_init_dict PyId___doc__ variable _Py_IDENTIFIER(__doc__) +Objects/moduleobject.c PyModule_SetDocString PyId___doc__ variable _Py_IDENTIFIER(__doc__) +Python/Python-ast.c - PyId_elt variable _Py_IDENTIFIER(elt) +Python/Python-ast.c - PyId_elts variable _Py_IDENTIFIER(elts) +Modules/faulthandler.c - PyId_enable variable _Py_IDENTIFIER(enable) +Python/sysmodule.c - PyId_encoding variable _Py_IDENTIFIER(encoding) +Python/bltinmodule.c - PyId_encoding variable _Py_IDENTIFIER(encoding) +Python/pythonrun.c PyRun_InteractiveOneObjectEx PyId_encoding variable _Py_IDENTIFIER(encoding) +Python/Python-ast.c - PyId_end_col_offset variable _Py_IDENTIFIER(end_col_offset) +Python/Python-ast.c - PyId_end_lineno variable _Py_IDENTIFIER(end_lineno) +Python/ceval.c _PyEval_EvalFrameDefault PyId___enter__ variable _Py_IDENTIFIER(__enter__) +Objects/typeobject.c overrides_hash PyId___eq__ variable _Py_IDENTIFIER(__eq__) +Python/bltinmodule.c - PyId_errors variable _Py_IDENTIFIER(errors) +Python/Python-ast.c - PyId_exc variable _Py_IDENTIFIER(exc) +Python/pythonrun.c - PyId_excepthook variable _Py_IDENTIFIER(excepthook) +Python/ceval.c _PyEval_EvalFrameDefault PyId___exit__ variable _Py_IDENTIFIER(__exit__) +Modules/_pickle.c do_append PyId_extend variable _Py_IDENTIFIER(extend) +Python/Python-ast.c - PyId__fields variable _Py_IDENTIFIER(_fields) +Objects/moduleobject.c PyModule_GetFilenameObject PyId___file__ variable _Py_IDENTIFIER(__file__) +Python/errors.c PyErr_SyntaxLocationObject PyId_filename variable _Py_IDENTIFIER(filename) +Python/pythonrun.c parse_syntax_error PyId_filename variable _Py_IDENTIFIER(filename) +Modules/_io/textio.c - PyId_fileno variable _Py_IDENTIFIER(fileno) +Modules/faulthandler.c - PyId_fileno variable _Py_IDENTIFIER(fileno) +Python/bltinmodule.c - PyId_fileno variable _Py_IDENTIFIER(fileno) +Objects/fileobject.c PyObject_AsFileDescriptor PyId_fileno variable _Py_IDENTIFIER(fileno) +Modules/itertoolsmodule.c zip_longest_new PyId_fillvalue variable _Py_IDENTIFIER(fillvalue) +Python/_warnings.c get_filter PyId_filters variable _Py_IDENTIFIER(filters) +Python/Python-ast.c - PyId_finalbody variable _Py_IDENTIFIER(finalbody) +Modules/_io/iobase.c iobase_finalize PyId__finalizing variable _Py_IDENTIFIER(_finalizing) +Python/import.c import_find_and_load PyId__find_and_load variable _Py_IDENTIFIER(_find_and_load) +Python/import.c PyImport_ExecCodeModuleObject PyId__fix_up_module variable _Py_IDENTIFIER(_fix_up_module) +Python/errors.c - PyId_flush variable _Py_IDENTIFIER(flush) +Python/pylifecycle.c - PyId_flush variable _Py_IDENTIFIER(flush) +Python/pythonrun.c - PyId_flush variable _Py_IDENTIFIER(flush) +Modules/_threadmodule.c - PyId_flush variable _Py_IDENTIFIER(flush) +Modules/_io/bufferedio.c - PyId_flush variable _Py_IDENTIFIER(flush) +Modules/_io/textio.c - PyId_flush variable _Py_IDENTIFIER(flush) +Modules/faulthandler.c - PyId_flush variable _Py_IDENTIFIER(flush) +Python/bltinmodule.c - PyId_flush variable _Py_IDENTIFIER(flush) +Objects/abstract.c PyObject_Format PyId___format__ variable _Py_IDENTIFIER(__format__) +Python/Python-ast.c - PyId_format_spec variable _Py_IDENTIFIER(format_spec) +Modules/posixmodule.c path_converter PyId___fspath__ variable _Py_IDENTIFIER(__fspath__) +Modules/posixmodule.c PyOS_FSPath PyId___fspath__ variable _Py_IDENTIFIER(__fspath__) +Python/Python-ast.c - PyId_func variable _Py_IDENTIFIER(func) +Python/Python-ast.c - PyId_generators variable _Py_IDENTIFIER(generators) +Objects/descrobject.c mappingproxy_get PyId_get variable _Py_IDENTIFIER(get) +Modules/_collectionsmodule.c _count_elements PyId_get variable _Py_IDENTIFIER(get) +Objects/typeobject.c slot_tp_descr_get PyId___get__ variable _Py_IDENTIFIER(__get__) +Objects/classobject.c method_reduce PyId_getattr variable _Py_IDENTIFIER(getattr) +Objects/descrobject.c descr_reduce PyId_getattr variable _Py_IDENTIFIER(getattr) +Objects/descrobject.c wrapper_reduce PyId_getattr variable _Py_IDENTIFIER(getattr) +Objects/moduleobject.c module_getattro PyId___getattr__ variable _Py_IDENTIFIER(__getattr__) +Objects/methodobject.c meth_reduce PyId_getattr variable _Py_IDENTIFIER(getattr) +Objects/typeobject.c slot_tp_getattr_hook PyId___getattr__ variable _Py_IDENTIFIER(__getattr__) +Objects/typeobject.c - PyId___getattribute__ variable _Py_IDENTIFIER(__getattribute__) +Objects/typeobject.c - PyId___getitem__ variable _Py_IDENTIFIER(__getitem__) +Objects/typeobject.c _PyObject_GetNewArguments PyId___getnewargs__ variable _Py_IDENTIFIER(__getnewargs__) +Objects/typeobject.c _PyObject_GetNewArguments PyId___getnewargs_ex__ variable _Py_IDENTIFIER(__getnewargs_ex__) +Modules/_io/textio.c - PyId_getpreferredencoding variable _Py_IDENTIFIER(getpreferredencoding) +Python/_warnings.c get_source_line PyId_get_source variable _Py_IDENTIFIER(get_source) +Python/import.c PyImport_ExecCodeModuleWithPathnames PyId__get_sourcefile variable _Py_IDENTIFIER(_get_sourcefile) +Objects/typeobject.c _PyObject_GetState PyId___getstate__ variable _Py_IDENTIFIER(__getstate__) +Python/import.c PyImport_ImportModuleLevelObject PyId__handle_fromlist variable _Py_IDENTIFIER(_handle_fromlist) +Python/Python-ast.c - PyId_handlers variable _Py_IDENTIFIER(handlers) +Objects/typeobject.c - PyId___hash__ variable _Py_IDENTIFIER(__hash__) +Python/Python-ast.c - PyId_id variable _Py_IDENTIFIER(id) +Python/Python-ast.c - PyId_ifs variable _Py_IDENTIFIER(ifs) +Python/import.c PyImport_ReloadModule PyId_imp variable _Py_IDENTIFIER(imp) +Python/ceval.c import_name PyId___import__ variable _Py_IDENTIFIER(__import__) +Objects/typeobject.c slot_nb_index PyId___index__ variable _Py_IDENTIFIER(__index__) +Objects/typeobject.c slot_tp_init PyId___init__ variable _Py_IDENTIFIER(__init__) +Objects/moduleobject.c _PyModuleSpec_IsInitializing PyId__initializing variable _Py_IDENTIFIER(_initializing) +Objects/typeobject.c - PyId___init_subclass__ variable _Py_IDENTIFIER(__init_subclass__) +Objects/abstract.c PyObject_IsInstance PyId___instancecheck__ variable _Py_IDENTIFIER(__instancecheck__) +Objects/dictobject.c _PyDictView_Intersect PyId_intersection_update variable _Py_IDENTIFIER(intersection_update) +Modules/_io/iobase.c - PyId___IOBase_closed variable _Py_IDENTIFIER(__IOBase_closed) +Objects/typeobject.c slot_nb_inplace_power PyId___ipow__ variable _Py_IDENTIFIER(__ipow__) +Objects/object.c - PyId___isabstractmethod__ variable _Py_IDENTIFIER(__isabstractmethod__) +Python/Python-ast.c - PyId_is_async variable _Py_IDENTIFIER(is_async) +Modules/_io/bufferedio.c - PyId_isatty variable _Py_IDENTIFIER(isatty) +Modules/_io/textio.c - PyId_isatty variable _Py_IDENTIFIER(isatty) +Python/pylifecycle.c create_stdio PyId_isatty variable _Py_IDENTIFIER(isatty) +Modules/_io/_iomodule.c _io_open_impl PyId_isatty variable _Py_IDENTIFIER(isatty) +Python/codecs.c _PyCodec_LookupTextEncoding PyId__is_text_encoding variable _Py_IDENTIFIER(_is_text_encoding) +Python/Python-ast.c - PyId_items variable _Py_IDENTIFIER(items) +Objects/abstract.c PyMapping_Items PyId_items variable _Py_IDENTIFIER(items) +Objects/descrobject.c mappingproxy_items PyId_items variable _Py_IDENTIFIER(items) +Objects/odictobject.c odict_reduce PyId_items variable _Py_IDENTIFIER(items) +Objects/odictobject.c odict_repr PyId_items variable _Py_IDENTIFIER(items) +Objects/odictobject.c mutablemapping_update PyId_items variable _Py_IDENTIFIER(items) +Objects/typeobject.c _PyObject_GetItemsIter PyId_items variable _Py_IDENTIFIER(items) +Modules/_collectionsmodule.c defdict_reduce PyId_items variable _Py_IDENTIFIER(items) +Python/Python-ast.c - PyId_iter variable _Py_IDENTIFIER(iter) +Objects/bytearrayobject.c bytearrayiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/bytesobject.c striter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/dictobject.c dictiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/iterobject.c iter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/iterobject.c calliter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/listobject.c listiter_reduce_general PyId_iter variable _Py_IDENTIFIER(iter) +Objects/odictobject.c odictiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/rangeobject.c rangeiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/rangeobject.c longrangeiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/setobject.c setiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/tupleobject.c tupleiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/unicodeobject.c unicodeiter_reduce PyId_iter variable _Py_IDENTIFIER(iter) +Objects/typeobject.c slot_tp_iter PyId___iter__ variable _Py_IDENTIFIER(__iter__) +Modules/arraymodule.c array_arrayiterator___reduce___impl PyId_iter variable _Py_IDENTIFIER(iter) +Python/Python-ast.c - PyId_key variable _Py_IDENTIFIER(key) +Python/Python-ast.c - PyId_keys variable _Py_IDENTIFIER(keys) +Objects/abstract.c PyMapping_Keys PyId_keys variable _Py_IDENTIFIER(keys) +Objects/descrobject.c mappingproxy_keys PyId_keys variable _Py_IDENTIFIER(keys) +Objects/dictobject.c dict_update_common PyId_keys variable _Py_IDENTIFIER(keys) +Objects/odictobject.c mutablemapping_update PyId_keys variable _Py_IDENTIFIER(keys) +Python/Python-ast.c - PyId_keywords variable _Py_IDENTIFIER(keywords) +Python/Python-ast.c - PyId_kind variable _Py_IDENTIFIER(kind) +Python/Python-ast.c - PyId_kwarg variable _Py_IDENTIFIER(kwarg) +Python/Python-ast.c - PyId_kw_defaults variable _Py_IDENTIFIER(kw_defaults) +Python/Python-ast.c - PyId_kwonlyargs variable _Py_IDENTIFIER(kwonlyargs) +Python/pythonrun.c - PyId_last_traceback variable _Py_IDENTIFIER(last_traceback) +Python/pythonrun.c - PyId_last_type variable _Py_IDENTIFIER(last_type) +Python/pythonrun.c - PyId_last_value variable _Py_IDENTIFIER(last_value) +Python/Python-ast.c - PyId_left variable _Py_IDENTIFIER(left) +Objects/typeobject.c - PyId___len__ variable _Py_IDENTIFIER(__len__) +Objects/abstract.c PyObject_LengthHint PyId___length_hint__ variable _Py_IDENTIFIER(__length_hint__) +Python/Python-ast.c - PyId_level variable _Py_IDENTIFIER(level) +Python/Python-ast.c - PyId_lineno variable _Py_IDENTIFIER(lineno) +Python/errors.c PyErr_SyntaxLocationObject PyId_lineno variable _Py_IDENTIFIER(lineno) +Python/pythonrun.c parse_syntax_error PyId_lineno variable _Py_IDENTIFIER(lineno) +Objects/longobject.c - PyId_little variable _Py_IDENTIFIER(little) +Python/_warnings.c get_source_line PyId___loader__ variable _Py_IDENTIFIER(__loader__) +Objects/moduleobject.c module_init_dict PyId___loader__ variable _Py_IDENTIFIER(__loader__) +Python/import.c PyImport_ImportModuleLevelObject PyId__lock_unlock_module variable _Py_IDENTIFIER(_lock_unlock_module) +Python/Python-ast.c - PyId_lower variable _Py_IDENTIFIER(lower) +Python/ceval.c _PyEval_EvalFrameDefault PyId___ltrace__ variable _Py_IDENTIFIER(__ltrace__) +Python/pythonrun.c PyRun_InteractiveOneObjectEx PyId___main__ variable _Py_IDENTIFIER(__main__) +Python/_warnings.c check_matched PyId_match variable _Py_IDENTIFIER(match) +Python/bltinmodule.c - PyId_metaclass variable _Py_IDENTIFIER(metaclass) +Objects/dictobject.c dict_subscript PyId___missing__ variable _Py_IDENTIFIER(__missing__) +Modules/_io/bufferedio.c - PyId_mode variable _Py_IDENTIFIER(mode) +Modules/_io/textio.c - PyId_mode variable _Py_IDENTIFIER(mode) +Python/pylifecycle.c create_stdio PyId_mode variable _Py_IDENTIFIER(mode) +Modules/_io/_iomodule.c _io_open_impl PyId_mode variable _Py_IDENTIFIER(mode) +Python/Python-ast.c - PyId_module variable _Py_IDENTIFIER(module) +Objects/typeobject.c - PyId___module__ variable _Py_IDENTIFIER(__module__) +Python/Python-ast.c make_type PyId___module__ variable _Py_IDENTIFIER(__module__) +Python/errors.c PyErr_NewException PyId___module__ variable _Py_IDENTIFIER(__module__) +Python/errors.c PyErr_NewException PyId___module__ variable _Py_IDENTIFIER(__module__) +Python/pythonrun.c print_exception PyId___module__ variable _Py_IDENTIFIER(__module__) +Modules/_pickle.c whichmodule PyId___module__ variable _Py_IDENTIFIER(__module__) +Objects/typeobject.c type_mro_modified PyId_mro variable _Py_IDENTIFIER(mro) +Objects/typeobject.c mro_invoke PyId_mro variable _Py_IDENTIFIER(mro) +Python/bltinmodule.c - PyId___mro_entries__ variable _Py_IDENTIFIER(__mro_entries__) +Objects/typeobject.c type_new PyId___mro_entries__ variable _Py_IDENTIFIER(__mro_entries__) +Python/Python-ast.c - PyId_msg variable _Py_IDENTIFIER(msg) +Python/errors.c PyErr_SyntaxLocationObject PyId_msg variable _Py_IDENTIFIER(msg) +Python/pythonrun.c parse_syntax_error PyId_msg variable _Py_IDENTIFIER(msg) +Python/pylifecycle.c - PyId_name variable _Py_IDENTIFIER(name) +Modules/_io/fileio.c - PyId_name variable _Py_IDENTIFIER(name) +Modules/_io/bufferedio.c - PyId_name variable _Py_IDENTIFIER(name) +Modules/_io/textio.c - PyId_name variable _Py_IDENTIFIER(name) +Python/Python-ast.c - PyId_name variable _Py_IDENTIFIER(name) +Objects/exceptions.c ImportError_getstate PyId_name variable _Py_IDENTIFIER(name) +Objects/typeobject.c - PyId___name__ variable _Py_IDENTIFIER(__name__) +Objects/classobject.c - PyId___name__ variable _Py_IDENTIFIER(__name__) +Python/_warnings.c setup_context PyId___name__ variable _Py_IDENTIFIER(__name__) +Python/_warnings.c get_source_line PyId___name__ variable _Py_IDENTIFIER(__name__) +Python/_warnings.c show_warning PyId___name__ variable _Py_IDENTIFIER(__name__) +Python/ceval.c import_from PyId___name__ variable _Py_IDENTIFIER(__name__) +Python/ceval.c import_all_from PyId___name__ variable _Py_IDENTIFIER(__name__) +Python/import.c resolve_name PyId___name__ variable _Py_IDENTIFIER(__name__) +Objects/moduleobject.c module_init_dict PyId___name__ variable _Py_IDENTIFIER(__name__) +Objects/moduleobject.c PyModule_GetNameObject PyId___name__ variable _Py_IDENTIFIER(__name__) +Objects/moduleobject.c module_getattro PyId___name__ variable _Py_IDENTIFIER(__name__) +Objects/weakrefobject.c weakref_repr PyId___name__ variable _Py_IDENTIFIER(__name__) +Modules/_pickle.c save_global PyId___name__ variable _Py_IDENTIFIER(__name__) +Modules/_pickle.c save_reduce PyId___name__ variable _Py_IDENTIFIER(__name__) +Python/Python-ast.c - PyId_names variable _Py_IDENTIFIER(names) +Objects/typeobject.c - PyId___new__ variable _Py_IDENTIFIER(__new__) +Objects/typeobject.c reduce_newobj PyId___newobj__ variable _Py_IDENTIFIER(__newobj__) +Objects/typeobject.c reduce_newobj PyId___newobj_ex__ variable _Py_IDENTIFIER(__newobj_ex__) +Objects/typeobject.c slot_tp_iternext PyId___next__ variable _Py_IDENTIFIER(__next__) +Objects/structseq.c - PyId_n_fields variable _Py_IDENTIFIER(n_fields) +Python/ast.c new_identifier PyId_NFKC variable _Py_IDENTIFIER(NFKC) +Objects/structseq.c - PyId_n_sequence_fields variable _Py_IDENTIFIER(n_sequence_fields) +Objects/structseq.c - PyId_n_unnamed_fields variable _Py_IDENTIFIER(n_unnamed_fields) +Python/errors.c PyErr_SyntaxLocationObject PyId_offset variable _Py_IDENTIFIER(offset) +Python/pythonrun.c parse_syntax_error PyId_offset variable _Py_IDENTIFIER(offset) +Python/_warnings.c get_once_registry PyId_onceregistry variable _Py_IDENTIFIER(onceregistry) +Python/Python-ast.c - PyId_op variable _Py_IDENTIFIER(op) +Python/traceback.c - PyId_open variable _Py_IDENTIFIER(open) +Python/pylifecycle.c create_stdio PyId_open variable _Py_IDENTIFIER(open) +Parser/tokenizer.c fp_setreadl PyId_open variable _Py_IDENTIFIER(open) +Objects/fileobject.c PyFile_FromFd PyId_open variable _Py_IDENTIFIER(open) +Objects/fileobject.c PyFile_OpenCodeObject PyId_open variable _Py_IDENTIFIER(open) +Python/Python-ast.c - PyId_operand variable _Py_IDENTIFIER(operand) +Python/Python-ast.c - PyId_ops variable _Py_IDENTIFIER(ops) +Python/Python-ast.c - PyId_optional_vars variable _Py_IDENTIFIER(optional_vars) +Python/Python-ast.c - PyId_orelse variable _Py_IDENTIFIER(orelse) +Python/import.c resolve_name PyId___package__ variable _Py_IDENTIFIER(__package__) +Objects/moduleobject.c module_init_dict PyId___package__ variable _Py_IDENTIFIER(__package__) +Python/import.c resolve_name PyId_parent variable _Py_IDENTIFIER(parent) +Modules/_operator.c methodcaller_reduce PyId_partial variable _Py_IDENTIFIER(partial) +Python/sysmodule.c - PyId_path variable _Py_IDENTIFIER(path) +Python/traceback.c - PyId_path variable _Py_IDENTIFIER(path) +Objects/exceptions.c ImportError_getstate PyId_path variable _Py_IDENTIFIER(path) +Modules/main.c pymain_sys_path_add_path0 PyId_path variable _Py_IDENTIFIER(path) +Python/import.c resolve_name PyId___path__ variable _Py_IDENTIFIER(__path__) +Python/import.c PyImport_ImportModuleLevelObject PyId___path__ variable _Py_IDENTIFIER(__path__) +Modules/_io/bufferedio.c - PyId_peek variable _Py_IDENTIFIER(peek) +Python/Python-ast.c - PyId_posonlyargs variable _Py_IDENTIFIER(posonlyargs) +Objects/typeobject.c slot_nb_power PyId___pow__ variable _Py_IDENTIFIER(__pow__) +Python/bltinmodule.c - PyId___prepare__ variable _Py_IDENTIFIER(__prepare__) +Python/errors.c PyErr_SyntaxLocationObject PyId_print_file_and_line variable _Py_IDENTIFIER(print_file_and_line) +Python/pythonrun.c print_exception PyId_print_file_and_line variable _Py_IDENTIFIER(print_file_and_line) +Python/pythonrun.c - PyId_ps1 variable _Py_IDENTIFIER(ps1) +Python/pythonrun.c - PyId_ps2 variable _Py_IDENTIFIER(ps2) +Objects/object.c - PyId_Py_Repr variable _Py_IDENTIFIER(Py_Repr) +Objects/classobject.c - PyId___qualname__ variable _Py_IDENTIFIER(__qualname__) +Objects/descrobject.c calculate_qualname PyId___qualname__ variable _Py_IDENTIFIER(__qualname__) +Objects/methodobject.c meth_get__qualname__ PyId___qualname__ variable _Py_IDENTIFIER(__qualname__) +Objects/typeobject.c type_new PyId___qualname__ variable _Py_IDENTIFIER(__qualname__) +Modules/_io/textio.c - PyId_raw variable _Py_IDENTIFIER(raw) +Python/pylifecycle.c create_stdio PyId_raw variable _Py_IDENTIFIER(raw) +Modules/_io/iobase.c - PyId_read variable _Py_IDENTIFIER(read) +Modules/_io/bufferedio.c - PyId_read variable _Py_IDENTIFIER(read) +Modules/_io/textio.c - PyId_read variable _Py_IDENTIFIER(read) +Modules/_io/bufferedio.c - PyId_read1 variable _Py_IDENTIFIER(read1) +Python/marshal.c marshal_load PyId_read variable _Py_IDENTIFIER(read) +Modules/_io/bufferedio.c - PyId_readable variable _Py_IDENTIFIER(readable) +Modules/_io/textio.c - PyId_readable variable _Py_IDENTIFIER(readable) +Modules/_io/iobase.c _io__RawIOBase_read_impl PyId_readall variable _Py_IDENTIFIER(readall) +Modules/_io/bufferedio.c - PyId_readinto variable _Py_IDENTIFIER(readinto) +Modules/_io/bufferedio.c - PyId_readinto1 variable _Py_IDENTIFIER(readinto1) +Python/marshal.c r_string PyId_readinto variable _Py_IDENTIFIER(readinto) +Parser/tokenizer.c fp_setreadl PyId_readline variable _Py_IDENTIFIER(readline) +Objects/fileobject.c PyFile_GetLine PyId_readline variable _Py_IDENTIFIER(readline) +Objects/typeobject.c object___reduce_ex___impl PyId___reduce__ variable _Py_IDENTIFIER(__reduce__) +Python/import.c PyImport_ReloadModule PyId_reload variable _Py_IDENTIFIER(reload) +Modules/_io/textio.c - PyId_replace variable _Py_IDENTIFIER(replace) +Python/importdl.c get_encoded_name PyId_replace variable _Py_IDENTIFIER(replace) +Objects/typeobject.c slot_tp_repr PyId___repr__ variable _Py_IDENTIFIER(__repr__) +Modules/_io/textio.c - PyId_reset variable _Py_IDENTIFIER(reset) +Python/Python-ast.c - PyId_returns variable _Py_IDENTIFIER(returns) +Objects/enumobject.c reversed_new_impl PyId___reversed__ variable _Py_IDENTIFIER(__reversed__) +Objects/listobject.c listiter_reduce_general PyId_reversed variable _Py_IDENTIFIER(reversed) +Python/Python-ast.c - PyId_right variable _Py_IDENTIFIER(right) +Python/bltinmodule.c - PyId___round__ variable _Py_IDENTIFIER(__round__) +Modules/_io/textio.c - PyId_seek variable _Py_IDENTIFIER(seek) +Modules/_io/iobase.c _io__IOBase_tell_impl PyId_seek variable _Py_IDENTIFIER(seek) +Modules/_io/textio.c - PyId_seekable variable _Py_IDENTIFIER(seekable) +Python/ceval.c _PyEval_EvalFrameDefault PyId_send variable _Py_IDENTIFIER(send) +Objects/typeobject.c slot_tp_descr_set PyId___set__ variable _Py_IDENTIFIER(__set__) +Objects/typeobject.c slot_tp_setattro PyId___setattr__ variable _Py_IDENTIFIER(__setattr__) +Objects/typeobject.c - PyId___setitem__ variable _Py_IDENTIFIER(__setitem__) +Modules/_collectionsmodule.c _count_elements PyId___setitem__ variable _Py_IDENTIFIER(__setitem__) +Objects/typeobject.c - PyId___set_name__ variable _Py_IDENTIFIER(__set_name__) +Modules/_io/textio.c - PyId_setstate variable _Py_IDENTIFIER(setstate) +Modules/_pickle.c load_build PyId___setstate__ variable _Py_IDENTIFIER(__setstate__) +Python/_warnings.c call_show_warning PyId__showwarnmsg variable _Py_IDENTIFIER(_showwarnmsg) +Python/pylifecycle.c wait_for_thread_shutdown PyId__shutdown variable _Py_IDENTIFIER(_shutdown) +Python/Python-ast.c - PyId_simple variable _Py_IDENTIFIER(simple) +Python/sysmodule.c - PyId___sizeof__ variable _Py_IDENTIFIER(__sizeof__) +Python/Python-ast.c - PyId_slice variable _Py_IDENTIFIER(slice) +Objects/typeobject.c _PyType_GetSlotNames PyId___slotnames__ variable _Py_IDENTIFIER(__slotnames__) +Objects/typeobject.c _PyType_GetSlotNames PyId__slotnames variable _Py_IDENTIFIER(_slotnames) +Objects/typeobject.c type_new PyId___slots__ variable _Py_IDENTIFIER(__slots__) +Python/bltinmodule.c - PyId_sort variable _Py_IDENTIFIER(sort) +Python/import.c resolve_name PyId___spec__ variable _Py_IDENTIFIER(__spec__) +Python/import.c PyImport_ImportModuleLevelObject PyId___spec__ variable _Py_IDENTIFIER(__spec__) +Objects/moduleobject.c module_init_dict PyId___spec__ variable _Py_IDENTIFIER(__spec__) +Objects/moduleobject.c module_getattro PyId___spec__ variable _Py_IDENTIFIER(__spec__) +Python/_warnings.c - PyId_stderr variable _Py_IDENTIFIER(stderr) +Python/errors.c - PyId_stderr variable _Py_IDENTIFIER(stderr) +Python/pylifecycle.c - PyId_stderr variable _Py_IDENTIFIER(stderr) +Python/pythonrun.c - PyId_stderr variable _Py_IDENTIFIER(stderr) +Python/sysmodule.c - PyId_stderr variable _Py_IDENTIFIER(stderr) +Modules/_threadmodule.c - PyId_stderr variable _Py_IDENTIFIER(stderr) +Modules/faulthandler.c - PyId_stderr variable _Py_IDENTIFIER(stderr) +Python/bltinmodule.c - PyId_stderr variable _Py_IDENTIFIER(stderr) +Python/pylifecycle.c - PyId_stdin variable _Py_IDENTIFIER(stdin) +Python/pythonrun.c - PyId_stdin variable _Py_IDENTIFIER(stdin) +Python/bltinmodule.c - PyId_stdin variable _Py_IDENTIFIER(stdin) +Python/pylifecycle.c - PyId_stdout variable _Py_IDENTIFIER(stdout) +Python/pythonrun.c - PyId_stdout variable _Py_IDENTIFIER(stdout) +Python/sysmodule.c - PyId_stdout variable _Py_IDENTIFIER(stdout) +Python/bltinmodule.c - PyId_stdout variable _Py_IDENTIFIER(stdout) +Python/Python-ast.c - PyId_step variable _Py_IDENTIFIER(step) +Modules/posixmodule.c DirEntry_test_mode PyId_st_mode variable _Py_IDENTIFIER(st_mode) +Modules/_io/textio.c - PyId_strict variable _Py_IDENTIFIER(strict) +Python/pythonrun.c - PyId_string variable _Py_static_string(PyId_string, """") +Modules/timemodule.c time_strptime PyId__strptime_time variable _Py_IDENTIFIER(_strptime_time) +Modules/posixmodule.c wait_helper PyId_struct_rusage variable _Py_IDENTIFIER(struct_rusage) +Modules/_abc.c - PyId___subclasscheck__ variable _Py_IDENTIFIER(__subclasscheck__) +Objects/abstract.c PyObject_IsSubclass PyId___subclasscheck__ variable _Py_IDENTIFIER(__subclasscheck__) +Modules/_abc.c - PyId___subclasshook__ variable _Py_IDENTIFIER(__subclasshook__) +Objects/dictobject.c dictviews_xor PyId_symmetric_difference_update variable _Py_IDENTIFIER(symmetric_difference_update) +Python/Python-ast.c - PyId_tag variable _Py_IDENTIFIER(tag) +Python/Python-ast.c - PyId_target variable _Py_IDENTIFIER(target) +Python/Python-ast.c - PyId_targets variable _Py_IDENTIFIER(targets) +Modules/_io/textio.c - PyId_tell variable _Py_IDENTIFIER(tell) +Python/Python-ast.c - PyId_test variable _Py_IDENTIFIER(test) +Python/errors.c PyErr_SyntaxLocationObject PyId_text variable _Py_IDENTIFIER(text) +Python/pythonrun.c parse_syntax_error PyId_text variable _Py_IDENTIFIER(text) +Python/traceback.c - PyId_TextIOWrapper variable _Py_IDENTIFIER(TextIOWrapper) +Python/pylifecycle.c create_stdio PyId_TextIOWrapper variable _Py_IDENTIFIER(TextIOWrapper) +Python/pylifecycle.c - PyId_threading variable _Py_IDENTIFIER(threading) +Objects/genobject.c _gen_throw PyId_throw variable _Py_IDENTIFIER(throw) +Objects/abstract.c PyNumber_Long PyId___trunc__ variable _Py_IDENTIFIER(__trunc__) +Python/Python-ast.c - PyId_type variable _Py_IDENTIFIER(type) +Python/Python-ast.c - PyId_type_comment variable _Py_IDENTIFIER(type_comment) +Python/Python-ast.c - PyId_type_ignores variable _Py_IDENTIFIER(type_ignores) +Python/errors.c _PyErr_WriteUnraisableMsg PyId_unraisablehook variable _Py_IDENTIFIER(unraisablehook) +Objects/dictobject.c dictviews_or PyId_update variable _Py_IDENTIFIER(update) +Python/Python-ast.c - PyId_upper variable _Py_IDENTIFIER(upper) +Python/Python-ast.c - PyId_value variable _Py_IDENTIFIER(value) +Python/Python-ast.c - PyId_values variable _Py_IDENTIFIER(values) +Objects/abstract.c PyMapping_Values PyId_values variable _Py_IDENTIFIER(values) +Objects/descrobject.c mappingproxy_values PyId_values variable _Py_IDENTIFIER(values) +Python/Python-ast.c - PyId_vararg variable _Py_IDENTIFIER(vararg) +Python/_warnings.c already_warned PyId_version variable _Py_IDENTIFIER(version) +Python/_warnings.c call_show_warning PyId_WarningMessage variable _Py_IDENTIFIER(WarningMessage) +Python/_warnings.c setup_context PyId___warningregistry__ variable _Py_IDENTIFIER(__warningregistry__) +Python/_warnings.c get_warnings_attr PyId_warnings variable _Py_IDENTIFIER(warnings) +Python/sysmodule.c - PyId_warnoptions variable _Py_IDENTIFIER(warnoptions) +Python/_warnings.c _PyErr_WarnUnawaitedCoroutine PyId__warn_unawaited_coroutine variable _Py_IDENTIFIER(_warn_unawaited_coroutine) +Modules/_io/bufferedio.c - PyId_writable variable _Py_IDENTIFIER(writable) +Modules/_io/textio.c - PyId_writable variable _Py_IDENTIFIER(writable) +Python/sysmodule.c - PyId_write variable _Py_IDENTIFIER(write) +Modules/_io/bufferedio.c - PyId_write variable _Py_IDENTIFIER(write) +Python/marshal.c marshal_dump_impl PyId_write variable _Py_IDENTIFIER(write) +Objects/fileobject.c PyFile_WriteObject PyId_write variable _Py_IDENTIFIER(write) +Python/sysmodule.c - PyId__xoptions variable _Py_IDENTIFIER(_xoptions) +Python/import.c _PyImportZip_Init PyId_zipimporter variable _Py_IDENTIFIER(zipimporter) +Python/initconfig.c - Py_IgnoreEnvironmentFlag variable int Py_IgnoreEnvironmentFlag +Python/dynload_shlib.c - _PyImport_DynLoadFiletab variable const char *_PyImport_DynLoadFiletab[] +Python/frozen.c - PyImport_FrozenModules variable const struct _frozen * PyImport_FrozenModules +Modules/config.c - _PyImport_Inittab variable struct _inittab _PyImport_Inittab[] +Python/import.c - PyImport_Inittab variable struct _inittab * PyImport_Inittab +Modules/_io/textio.c - PyIncrementalNewlineDecoder_Type variable PyTypeObject PyIncrementalNewlineDecoder_Type +Python/initconfig.c - Py_InspectFlag variable int Py_InspectFlag +Objects/classobject.c - PyInstanceMethod_Type variable PyTypeObject PyInstanceMethod_Type +Python/initconfig.c - Py_InteractiveFlag variable int Py_InteractiveFlag +Objects/interpreteridobject.c - _PyInterpreterID_Type variable PyTypeObject _PyInterpreterID_Type +Modules/_io/iobase.c - PyIOBase_Type variable PyTypeObject PyIOBase_Type +Modules/_io/_iomodule.c - _PyIO_empty_bytes variable PyObject *_PyIO_empty_bytes +Modules/_io/_iomodule.c - _PyIO_empty_str variable PyObject *_PyIO_empty_str +Modules/_io/_iomodule.c - _PyIO_Module variable struct PyModuleDef _PyIO_Module +Modules/_io/_iomodule.c - _PyIO_str_close variable PyObject *_PyIO_str_close +Modules/_io/_iomodule.c - _PyIO_str_closed variable PyObject *_PyIO_str_closed +Modules/_io/_iomodule.c - _PyIO_str_decode variable PyObject *_PyIO_str_decode +Modules/_io/_iomodule.c - _PyIO_str_encode variable PyObject *_PyIO_str_encode +Modules/_io/_iomodule.c - _PyIO_str_fileno variable PyObject *_PyIO_str_fileno +Modules/_io/_iomodule.c - _PyIO_str_flush variable PyObject *_PyIO_str_flush +Modules/_io/_iomodule.c - _PyIO_str_getstate variable PyObject *_PyIO_str_getstate +Modules/_io/_iomodule.c - _PyIO_str_isatty variable PyObject *_PyIO_str_isatty +Modules/_io/_iomodule.c - _PyIO_str_newlines variable PyObject *_PyIO_str_newlines +Modules/_io/_iomodule.c - _PyIO_str_nl variable PyObject *_PyIO_str_nl +Modules/_io/_iomodule.c - _PyIO_str_peek variable PyObject *_PyIO_str_peek +Modules/_io/_iomodule.c - _PyIO_str_read variable PyObject *_PyIO_str_read +Modules/_io/_iomodule.c - _PyIO_str_read1 variable PyObject *_PyIO_str_read1 +Modules/_io/_iomodule.c - _PyIO_str_readable variable PyObject *_PyIO_str_readable +Modules/_io/_iomodule.c - _PyIO_str_readall variable PyObject *_PyIO_str_readall +Modules/_io/_iomodule.c - _PyIO_str_readinto variable PyObject *_PyIO_str_readinto +Modules/_io/_iomodule.c - _PyIO_str_readline variable PyObject *_PyIO_str_readline +Modules/_io/_iomodule.c - _PyIO_str_reset variable PyObject *_PyIO_str_reset +Modules/_io/_iomodule.c - _PyIO_str_seek variable PyObject *_PyIO_str_seek +Modules/_io/_iomodule.c - _PyIO_str_seekable variable PyObject *_PyIO_str_seekable +Modules/_io/_iomodule.c - _PyIO_str_setstate variable PyObject *_PyIO_str_setstate +Modules/_io/_iomodule.c - _PyIO_str_tell variable PyObject *_PyIO_str_tell +Modules/_io/_iomodule.c - _PyIO_str_truncate variable PyObject *_PyIO_str_truncate +Modules/_io/_iomodule.c - _PyIO_str_writable variable PyObject *_PyIO_str_writable +Modules/_io/_iomodule.c - _PyIO_str_write variable PyObject *_PyIO_str_write +Python/initconfig.c - Py_IsolatedFlag variable int Py_IsolatedFlag +Objects/listobject.c - PyListIter_Type variable PyTypeObject PyListIter_Type +Objects/listobject.c - PyListRevIter_Type variable PyTypeObject PyListRevIter_Type +Objects/listobject.c - PyList_Type variable PyTypeObject PyList_Type +Modules/_localemodule.c - PyLocale_Methods variable static struct PyMethodDef PyLocale_Methods[] +Objects/longobject.c - _PyLong_DigitValue variable unsigned char _PyLong_DigitValue[256] +Objects/longobject.c - _PyLong_One variable PyObject *_PyLong_One +Objects/rangeobject.c - PyLongRangeIter_Type variable PyTypeObject PyLongRangeIter_Type +Objects/longobject.c - PyLong_Type variable PyTypeObject PyLong_Type +Objects/longobject.c - _PyLong_Zero variable PyObject *_PyLong_Zero +Objects/memoryobject.c - _PyManagedBuffer_Type variable PyTypeObject _PyManagedBuffer_Type +Python/bltinmodule.c - PyMap_Type variable PyTypeObject PyMap_Type +Objects/obmalloc.c - _PyMem variable static PyMemAllocatorEx _PyMem +Objects/descrobject.c - PyMemberDescr_Type variable PyTypeObject PyMemberDescr_Type +Objects/obmalloc.c - _PyMem_Debug variable static struct { debug_alloc_api_t raw; debug_alloc_api_t mem; debug_alloc_api_t obj; } _PyMem_Debug +Objects/memoryobject.c - PyMemoryView_Type variable PyTypeObject PyMemoryView_Type +Objects/obmalloc.c - _PyMem_Raw variable static PyMemAllocatorEx _PyMem_Raw +Objects/descrobject.c - PyMethodDescr_Type variable PyTypeObject PyMethodDescr_Type +Objects/classobject.c - PyMethod_Type variable PyTypeObject PyMethod_Type +Objects/descrobject.c - _PyMethodWrapper_Type variable PyTypeObject _PyMethodWrapper_Type +Objects/moduleobject.c - PyModuleDef_Type variable PyTypeObject PyModuleDef_Type +Objects/moduleobject.c - PyModule_Type variable PyTypeObject PyModule_Type +Objects/namespaceobject.c - _PyNamespace_Type variable PyTypeObject _PyNamespace_Type +Objects/object.c - _Py_NoneStruct variable PyObject _Py_NoneStruct +Objects/object.c - _PyNone_Type variable PyTypeObject _PyNone_Type +Python/initconfig.c - Py_NoSiteFlag variable int Py_NoSiteFlag +Objects/object.c - _Py_NotImplementedStruct variable PyObject _Py_NotImplementedStruct +Objects/object.c - _PyNotImplemented_Type variable PyTypeObject _PyNotImplemented_Type +Python/initconfig.c - Py_NoUserSiteDirectory variable int Py_NoUserSiteDirectory +Objects/bytesobject.c - _Py_null_strings variable Py_ssize_t _Py_null_strings +Objects/obmalloc.c - _PyObject variable static PyMemAllocatorEx _PyObject +Objects/obmalloc.c - _PyObject_Arena variable static PyObjectArenaAllocator _PyObject_Arena +Objects/odictobject.c - PyODictItems_Type variable PyTypeObject PyODictItems_Type +Objects/odictobject.c - PyODictIter_Type variable PyTypeObject PyODictIter_Type +Objects/odictobject.c - PyODictKeys_Type variable PyTypeObject PyODictKeys_Type +Objects/odictobject.c - PyODict_Type variable PyTypeObject PyODict_Type +Objects/odictobject.c - PyODictValues_Type variable PyTypeObject PyODictValues_Type +Python/fileutils.c - _Py_open_cloexec_works variable int _Py_open_cloexec_works +Objects/bytesobject.c - _Py_one_strings variable Py_ssize_t _Py_one_strings +Python/initconfig.c - Py_OptimizeFlag variable int Py_OptimizeFlag +Parser/myreadline.c - PyOS_InputHook variable int (*PyOS_InputHook)(void) +Python/pylifecycle.c - _PyOS_mystrnicmp_hack variable int (*_PyOS_mystrnicmp_hack)(const char *, const char *, Py_ssize_t) +Python/getopt.c - _PyOS_optarg variable const wchar_t *_PyOS_optarg +Python/getopt.c - _PyOS_opterr variable int _PyOS_opterr +Python/getopt.c - _PyOS_optind variable Py_ssize_t _PyOS_optind +Parser/myreadline.c - PyOS_ReadlineFunctionPointer variable char *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, const char *) +Parser/myreadline.c - _PyOS_ReadlineLock variable static PyThread_type_lock _PyOS_ReadlineLock +Parser/myreadline.c - _PyOS_ReadlineTState variable PyThreadState* _PyOS_ReadlineTState +Python/modsupport.c - _Py_PackageContext variable const char *_Py_PackageContext +Python/graminit.c - _PyParser_Grammar variable grammar _PyParser_Grammar +Python/pathconfig.c - _Py_path_config variable _PyPathConfig _Py_path_config +Objects/picklebufobject.c - PyPickleBuffer_Type variable PyTypeObject PyPickleBuffer_Type +Objects/descrobject.c - PyProperty_Type variable PyTypeObject PyProperty_Type +Python/initconfig.c - Py_QuietFlag variable int Py_QuietFlag +Objects.longobject.c - _Py_quick_int_allocs variable Py_ssize_t _Py_quick_int_allocs +Objects.longobject.c - _Py_quick_new_int_allocs variable Py_ssize_t _Py_quick_new_int_allocs +Objects/rangeobject.c - PyRangeIter_Type variable PyTypeObject PyRangeIter_Type +Objects/rangeobject.c - PyRange_Type variable PyTypeObject PyRange_Type +Modules/_io/iobase.c - PyRawIOBase_Type variable PyTypeObject PyRawIOBase_Type +Objects/object.c - _Py_RefTotal variable Py_ssize_t _Py_RefTotal +Objects/enumobject.c - PyReversed_Type variable PyTypeObject PyReversed_Type +Python/pylifecycle.c - _PyRuntime variable _PyRuntimeState _PyRuntime +Objects/iterobject.c - PySeqIter_Type variable PyTypeObject PySeqIter_Type +Objects/setobject.c - _PySet_Dummy variable PyObject * _PySet_Dummy +Objects/setobject.c - _PySetDummy_Type variable static PyTypeObject _PySetDummy_Type +Objects/setobject.c - PySetIter_Type variable PyTypeObject PySetIter_Type +Objects/setobject.c - PySet_Type variable PyTypeObject PySet_Type +Objects/sliceobject.c - PySlice_Type variable PyTypeObject PySlice_Type +Python/initconfig.c - _Py_StandardStreamEncoding variable static char *_Py_StandardStreamEncoding +Python/initconfig.c - _Py_StandardStreamErrors variable static char *_Py_StandardStreamErrors +Objects/funcobject.c - PyStaticMethod_Type variable PyTypeObject PyStaticMethod_Type +Objects/fileobject.c - PyStdPrinter_Type variable PyTypeObject PyStdPrinter_Type +Python/symtable.c - PySTEntry_Type variable PyTypeObject PySTEntry_Type +Modules/_io/stringio.c - PyStringIO_Type variable PyTypeObject PyStringIO_Type +Objects/structseq.c - PyStructSequence_UnnamedField variable char *PyStructSequence_UnnamedField +Objects/typeobject.c - PySuper_Type variable PyTypeObject PySuper_Type +Objects/object.c - _Py_SwappedOp variable int _Py_SwappedOp[] +Python/sysmodule.c - _PySys_ImplCacheTag variable const char *_PySys_ImplCacheTag +Python/sysmodule.c - _PySys_ImplName variable const char *_PySys_ImplName +Modules/_io/textio.c - PyTextIOBase_Type variable PyTypeObject PyTextIOBase_Type +Modules/_io/textio.c - PyTextIOWrapper_Type variable PyTypeObject PyTextIOWrapper_Type +Python/traceback.c - PyTraceBack_Type variable PyTypeObject PyTraceBack_Type +Objects/obmalloc.c - _Py_tracemalloc_config variable struct _PyTraceMalloc_Config _Py_tracemalloc_config +Objects/boolobject.c - _Py_TrueStruct variable static struct _longobject _Py_TrueStruct +Objects/tupleobject.c - PyTupleIter_Type variable PyTypeObject PyTupleIter_Type +Objects/tupleobject.c - PyTuple_Type variable PyTypeObject PyTuple_Type +Objects/tupleobject.c - _Py_tuple_zero_allocs variable Py_ssize_t _Py_tuple_zero_allocs +Objects/typeobject.c - PyType_Type variable PyTypeObject PyType_Type +Python/initconfig.c - Py_UnbufferedStdioFlag variable int Py_UnbufferedStdioFlag +Python/pylifecycle.c - _Py_UnhandledKeyboardInterrupt variable int _Py_UnhandledKeyboardInterrupt +Objects/unicodeobject.c - PyUnicodeIter_Type variable PyTypeObject PyUnicodeIter_Type +Objects/unicodeobject.c - PyUnicode_Type variable PyTypeObject PyUnicode_Type +Python/initconfig.c - Py_UTF8Mode variable int Py_UTF8Mode +Python/initconfig.c - Py_VerboseFlag variable int Py_VerboseFlag +Objects/weakrefobject.c - _PyWeakref_CallableProxyType variable PyTypeObject _PyWeakref_CallableProxyType +Objects/weakrefobject.c - _PyWeakref_ProxyType variable PyTypeObject _PyWeakref_ProxyType +Objects/weakrefobject.c - _PyWeakref_RefType variable PyTypeObject _PyWeakref_RefType +Objects/weakrefobject.c - _PyWeakref_RefType variable PyTypeObject _PyWeakref_RefType +Objects/descrobject.c - PyWrapperDescr_Type variable PyTypeObject PyWrapperDescr_Type +Python/bltinmodule.c - PyZip_Type variable PyTypeObject PyZip_Type +Python/Python-ast.c - Raise_fields variable static const char *Raise_fields[] +Python/Python-ast.c - Raise_type variable static PyTypeObject *Raise_type +Objects/rangeobject.c - range_as_mapping variable static PyMappingMethods range_as_mapping +Objects/rangeobject.c - range_as_number variable static PyNumberMethods range_as_number +Objects/rangeobject.c - range_as_sequence variable static PySequenceMethods range_as_sequence +Objects/rangeobject.c - rangeiter_methods variable static PyMethodDef rangeiter_methods +Objects/rangeobject.c - range_members variable static PyMemberDef range_members[] +Objects/rangeobject.c - range_methods variable static PyMethodDef range_methods +Modules/_io/iobase.c - rawiobase_methods variable static PyMethodDef rawiobase_methods +Python/pylifecycle.c fatal_error reentrant variable static int reentrant +Modules/faulthandler.c faulthandler_dump_traceback reentrant variable static volatile int reentrant +Modules/itertoolsmodule.c - repeat_methods variable static PyMethodDef repeat_methods +Modules/itertoolsmodule.c - repeat_type variable static PyTypeObject repeat_type +Python/Python-ast.c - Return_fields variable static const char *Return_fields[] +Python/compile.c compiler_visit_annotations return_str variable static identifier return_str +Python/Python-ast.c - Return_type variable static PyTypeObject *Return_type +Objects/enumobject.c - reversediter_methods variable static PyMethodDef reversediter_methods +Modules/_threadmodule.c - rlock_methods variable static PyMethodDef rlock_methods +Modules/_threadmodule.c - RLocktype variable static PyTypeObject RLocktype +Objects/typeobject.c slot_nb_add rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_subtract rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_multiply rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_matrix_multiply rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_remainder rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_divmod rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_power_binary rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_lshift rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_rshift rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_and rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_xor rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_or rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_floor_divide rop_id variable _Py_static_string(op_id, OPSTR) +Objects/typeobject.c slot_nb_true_divide rop_id variable _Py_static_string(op_id, OPSTR) +Python/Python-ast.c - RShift_singleton variable static PyObject *RShift_singleton +Python/Python-ast.c - RShift_type variable static PyTypeObject *RShift_type +Python/pylifecycle.c - runtime_initialized variable static int runtime_initialized +Modules/posixmodule.c - ScandirIterator_methods variable static PyMethodDef ScandirIterator_methods +Modules/posixmodule.c - ScandirIteratorType variable static PyTypeObject ScandirIteratorType +Modules/_sre.c - scanner_members variable static PyMemberDef scanner_members[] +Modules/_sre.c - scanner_methods variable static PyMethodDef scanner_methods +Modules/_sre.c - Scanner_Type variable static PyTypeObject Scanner_Type +Modules/posixmodule.c - sched_param_desc variable static PyStructSequence_Desc sched_param_desc +Modules/posixmodule.c - sched_param_fields variable static PyStructSequence_Field sched_param_fields[] +Modules/posixmodule.c - SchedParamType variable static PyTypeObject* SchedParamType +Objects/iterobject.c - seqiter_methods variable static PyMethodDef seqiter_methods +Objects/setobject.c - set_as_number variable static PyNumberMethods set_as_number +Objects/setobject.c - set_as_sequence variable static PySequenceMethods set_as_sequence +Python/symtable.c - setcomp variable static identifier setcomp +Python/Python-ast.c - SetComp_fields variable static const char *SetComp_fields[] +Python/Python-ast.c - SetComp_type variable static PyTypeObject *SetComp_type +Python/Python-ast.c - Set_fields variable static const char *Set_fields[] +Objects/setobject.c - setiter_methods variable static PyMethodDef setiter_methods +Objects/setobject.c - set_methods variable static PyMethodDef set_methods +Python/Python-ast.c - Set_type variable static PyTypeObject *Set_type +Modules/signalmodule.c - SiginfoType variable static PyTypeObject SiginfoType +Modules/signalmodule.c - signal_methods variable static PyMethodDef signal_methods +Modules/signalmodule.c - signalmodule variable static struct PyModuleDef signalmodule +Python/import.c PyImport_Import silly_list variable static PyObject *silly_list +Objects/sliceobject.c - slice_cache variable static PySliceObject *slice_cache +Python/Python-ast.c - Slice_fields variable static const char *Slice_fields[] +Objects/sliceobject.c - slice_members variable static PyMemberDef slice_members[] +Objects/sliceobject.c - slice_methods variable static PyMethodDef slice_methods +Python/Python-ast.c - slice_type variable static PyTypeObject *slice_type +Python/Python-ast.c - Slice_type variable static PyTypeObject *Slice_type +Objects/typeobject.c - slotdefs variable static slotdef slotdefs[] +Objects/typeobject.c - slotdefs_initialized variable static int slotdefs_initialized +Objects/longobject.c - small_ints variable static PyLongObject small_ints[NSMALLNEGINTS + NSMALLPOSINTS] +Objects/funcobject.c - sm_getsetlist variable static PyGetSetDef sm_getsetlist[] +Objects/funcobject.c - sm_memberlist variable static PyMemberDef sm_memberlist[] +Modules/xxsubtype.c - spamdict_members variable static PyMemberDef spamdict_members[] +Modules/xxsubtype.c - spamdict_methods variable static PyMethodDef spamdict_methods +Modules/xxsubtype.c - spamdict_type variable static PyTypeObject spamdict_type +Modules/xxsubtype.c - spamlist_getsets variable static PyGetSetDef spamlist_getsets[] +Modules/xxsubtype.c - spamlist_methods variable static PyMethodDef spamlist_methods +Modules/xxsubtype.c - spamlist_type variable static PyTypeObject spamlist_type +Modules/_sre.c - sremodule variable static struct PyModuleDef sremodule +Modules/faulthandler.c - stack variable static stack_t stack +Modules/itertoolsmodule.c - starmap_methods variable static PyMethodDef starmap_methods +Modules/itertoolsmodule.c - starmap_type variable static PyTypeObject starmap_type +Python/Python-ast.c - Starred_fields variable static const char *Starred_fields[] +Python/Python-ast.c - Starred_type variable static PyTypeObject *Starred_type +Python/graminit.c - states_0 variable static state states_0[3] +Python/graminit.c - states_1 variable static state states_1[2] +Python/graminit.c - states_10 variable static state states_10[4] +Python/graminit.c - states_11 variable static state states_11[34] +Python/graminit.c - states_12 variable static state states_12[2] +Python/graminit.c - states_13 variable static state states_13[2] +Python/graminit.c - states_14 variable static state states_14[4] +Python/graminit.c - states_15 variable static state states_15[2] +Python/graminit.c - states_16 variable static state states_16[6] +Python/graminit.c - states_17 variable static state states_17[5] +Python/graminit.c - states_18 variable static state states_18[3] +Python/graminit.c - states_19 variable static state states_19[2] +Python/graminit.c - states_2 variable static state states_2[3] +Python/graminit.c - states_20 variable static state states_20[3] +Python/graminit.c - states_21 variable static state states_21[2] +Python/graminit.c - states_22 variable static state states_22[2] +Python/graminit.c - states_23 variable static state states_23[2] +Python/graminit.c - states_24 variable static state states_24[2] +Python/graminit.c - states_25 variable static state states_25[3] +Python/graminit.c - states_26 variable static state states_26[2] +Python/graminit.c - states_27 variable static state states_27[5] +Python/graminit.c - states_28 variable static state states_28[2] +Python/graminit.c - states_29 variable static state states_29[3] +Python/graminit.c - states_3 variable static state states_3[7] +Python/graminit.c - states_30 variable static state states_30[8] +Python/graminit.c - states_31 variable static state states_31[4] +Python/graminit.c - states_32 variable static state states_32[4] +Python/graminit.c - states_33 variable static state states_33[3] +Python/graminit.c - states_34 variable static state states_34[2] +Python/graminit.c - states_35 variable static state states_35[2] +Python/graminit.c - states_36 variable static state states_36[3] +Python/graminit.c - states_37 variable static state states_37[3] +Python/graminit.c - states_38 variable static state states_38[5] +Python/graminit.c - states_39 variable static state states_39[2] +Python/graminit.c - states_4 variable static state states_4[2] +Python/graminit.c - states_40 variable static state states_40[3] +Python/graminit.c - states_41 variable static state states_41[8] +Python/graminit.c - states_42 variable static state states_42[8] +Python/graminit.c - states_43 variable static state states_43[11] +Python/graminit.c - states_44 variable static state states_44[13] +Python/graminit.c - states_45 variable static state states_45[6] +Python/graminit.c - states_46 variable static state states_46[4] +Python/graminit.c - states_47 variable static state states_47[5] +Python/graminit.c - states_48 variable static state states_48[5] +Python/graminit.c - states_49 variable static state states_49[4] +Python/graminit.c - states_5 variable static state states_5[3] +Python/graminit.c - states_50 variable static state states_50[6] +Python/graminit.c - states_51 variable static state states_51[2] +Python/graminit.c - states_52 variable static state states_52[5] +Python/graminit.c - states_53 variable static state states_53[5] +Python/graminit.c - states_54 variable static state states_54[2] +Python/graminit.c - states_55 variable static state states_55[2] +Python/graminit.c - states_56 variable static state states_56[3] +Python/graminit.c - states_57 variable static state states_57[2] +Python/graminit.c - states_58 variable static state states_58[4] +Python/graminit.c - states_59 variable static state states_59[3] +Python/graminit.c - states_6 variable static state states_6[3] +Python/graminit.c - states_60 variable static state states_60[2] +Python/graminit.c - states_61 variable static state states_61[2] +Python/graminit.c - states_62 variable static state states_62[2] +Python/graminit.c - states_63 variable static state states_63[2] +Python/graminit.c - states_64 variable static state states_64[2] +Python/graminit.c - states_65 variable static state states_65[2] +Python/graminit.c - states_66 variable static state states_66[3] +Python/graminit.c - states_67 variable static state states_67[4] +Python/graminit.c - states_68 variable static state states_68[3] +Python/graminit.c - states_69 variable static state states_69[9] +Python/graminit.c - states_7 variable static state states_7[9] +Python/graminit.c - states_70 variable static state states_70[5] +Python/graminit.c - states_71 variable static state states_71[7] +Python/graminit.c - states_72 variable static state states_72[3] +Python/graminit.c - states_73 variable static state states_73[5] +Python/graminit.c - states_74 variable static state states_74[3] +Python/graminit.c - states_75 variable static state states_75[3] +Python/graminit.c - states_76 variable static state states_76[3] +Python/graminit.c - states_77 variable static state states_77[14] +Python/graminit.c - states_78 variable static state states_78[8] +Python/graminit.c - states_79 variable static state states_79[3] +Python/graminit.c - states_8 variable static state states_8[4] +Python/graminit.c - states_80 variable static state states_80[4] +Python/graminit.c - states_81 variable static state states_81[2] +Python/graminit.c - states_82 variable static state states_82[6] +Python/graminit.c - states_83 variable static state states_83[3] +Python/graminit.c - states_84 variable static state states_84[4] +Python/graminit.c - states_85 variable static state states_85[2] +Python/graminit.c - states_86 variable static state states_86[3] +Python/graminit.c - states_87 variable static state states_87[3] +Python/graminit.c - states_88 variable static state states_88[7] +Python/graminit.c - states_89 variable static state states_89[3] +Python/graminit.c - states_9 variable static state states_9[42] +Python/graminit.c - states_90 variable static state states_90[6] +Python/graminit.c - states_91 variable static state states_91[11] +Python/getargs.c - static_arg_parsers variable static struct _PyArg_Parser *static_arg_parsers +Objects/unicodeobject.c - static_strings variable static _Py_Identifier *static_strings +Modules/_stat.c - stat_methods variable static PyMethodDef stat_methods +Modules/_stat.c - statmodule variable static struct PyModuleDef statmodule +Modules/posixmodule.c - stat_result_desc variable static PyStructSequence_Desc stat_result_desc +Modules/posixmodule.c - stat_result_fields variable static PyStructSequence_Field stat_result_fields[] +Modules/posixmodule.c - StatResultType variable static PyTypeObject* StatResultType +Modules/posixmodule.c - statvfs_result_desc variable static PyStructSequence_Desc statvfs_result_desc +Modules/posixmodule.c - statvfs_result_fields variable static PyStructSequence_Field statvfs_result_fields[] +Modules/posixmodule.c - StatVFSResultType variable static PyTypeObject* StatVFSResultType +Objects/fileobject.c - stdprinter_getsetlist variable static PyGetSetDef stdprinter_getsetlist[] +Objects/fileobject.c - stdprinter_methods variable static PyMethodDef stdprinter_methods +Python/symtable.c - ste_memberlist variable static PyMemberDef ste_memberlist[] +Python/Python-ast.c - stmt_attributes variable static const char *stmt_attributes[] +Python/Python-ast.c - stmt_type variable static PyTypeObject *stmt_type +Objects/exceptions.c - StopIteration_members variable static PyMemberDef StopIteration_members[] +Python/Python-ast.c - Store_singleton variable static PyObject *Store_singleton +Python/Python-ast.c - Store_type variable static PyTypeObject *Store_type +Python/ast_unparse.c - _str_close_br variable static PyObject *_str_close_br +Python/ast_unparse.c - _str_dbl_close_br variable static PyObject *_str_dbl_close_br +Python/ast_unparse.c - _str_dbl_open_br variable static PyObject *_str_dbl_open_br +Modules/_threadmodule.c - str_dict variable static PyObject *str_dict +Modules/_io/stringio.c - stringio_getset variable static PyGetSetDef stringio_getset[] +Modules/_io/stringio.c - stringio_methods variable static PyMethodDef stringio_methods +Objects/unicodeobject.c - _string_methods variable static PyMethodDef _string_methods +Objects/unicodeobject.c - _string_module variable static struct PyModuleDef _string_module +Objects/bytesobject.c - striter_methods variable static PyMethodDef striter_methods +Python/ast_unparse.c - _str_open_br variable static PyObject *_str_open_br +Modules/pwdmodule.c - StructPwdType variable static PyTypeObject StructPwdType +Modules/pwdmodule.c - struct_pwd_type_desc variable static PyStructSequence_Desc struct_pwd_type_desc +Modules/pwdmodule.c - struct_pwd_type_fields variable static PyStructSequence_Field struct_pwd_type_fields[] +Modules/posixmodule.c wait_helper struct_rusage variable static PyObject *struct_rusage +Objects/structseq.c - structseq_methods variable static PyMethodDef structseq_methods +Modules/posixmodule.c - structseq_new variable static newfunc structseq_new +Modules/signalmodule.c - struct_siginfo_desc variable static PyStructSequence_Desc struct_siginfo_desc +Modules/signalmodule.c - struct_siginfo_fields variable static PyStructSequence_Field struct_siginfo_fields[] +Modules/timemodule.c - StructTimeType variable static PyTypeObject StructTimeType +Modules/timemodule.c - struct_time_type_desc variable static PyStructSequence_Desc struct_time_type_desc +Modules/timemodule.c - struct_time_type_fields variable static PyStructSequence_Field struct_time_type_fields[] +Python/Python-ast.c - Subscript_fields variable static const char *Subscript_fields[] +Python/Python-ast.c - Subscript_type variable static PyTypeObject *Subscript_type +Python/Python-ast.c - Sub_singleton variable static PyObject *Sub_singleton +Python/Python-ast.c - Sub_type variable static PyTypeObject *Sub_type +Objects/typeobject.c - subtype_getsets_dict_only variable static PyGetSetDef subtype_getsets_dict_only[] +Objects/typeobject.c - subtype_getsets_full variable static PyGetSetDef subtype_getsets_full[] +Objects/typeobject.c - subtype_getsets_weakref_only variable static PyGetSetDef subtype_getsets_weakref_only[] +Python/Python-ast.c - Suite_fields variable static const char *Suite_fields[] +Python/Python-ast.c - Suite_type variable static PyTypeObject *Suite_type +Objects/typeobject.c - super_members variable static PyMemberDef super_members[] +Modules/symtablemodule.c - symtable_methods variable static PyMethodDef symtable_methods +Modules/symtablemodule.c - symtablemodule variable static struct PyModuleDef symtablemodule +Objects/exceptions.c - SyntaxError_members variable static PyMemberDef SyntaxError_members[] +Python/sysmodule.c - sys_methods variable static PyMethodDef sys_methods +Python/sysmodule.c - sysmodule variable static struct PyModuleDef sysmodule +Objects/exceptions.c - SystemExit_members variable static PyMemberDef SystemExit_members[] +Modules/_tracemalloc.c - tables_lock variable static PyThread_type_lock tables_lock +Modules/itertoolsmodule.c - takewhile_reduce_methods variable static PyMethodDef takewhile_reduce_methods +Modules/itertoolsmodule.c - takewhile_type variable static PyTypeObject takewhile_type +Python/pylifecycle.c - _TARGET_LOCALES variable static _LocaleCoercionTarget _TARGET_LOCALES[] +Python/traceback.c - tb_getsetters variable static PyGetSetDef tb_getsetters[] +Python/traceback.c - tb_memberlist variable static PyMemberDef tb_memberlist[] +Python/traceback.c - tb_methods variable static PyMethodDef tb_methods +Modules/itertoolsmodule.c - teedataobject_methods variable static PyMethodDef teedataobject_methods +Modules/itertoolsmodule.c - teedataobject_type variable static PyTypeObject teedataobject_type +Modules/itertoolsmodule.c - tee_methods variable static PyMethodDef tee_methods +Modules/itertoolsmodule.c - tee_type variable static PyTypeObject tee_type +Modules/posixmodule.c - TerminalSize_desc variable static PyStructSequence_Desc TerminalSize_desc +Modules/posixmodule.c - TerminalSize_fields variable static PyStructSequence_Field TerminalSize_fields[] +Modules/posixmodule.c - TerminalSizeType variable static PyTypeObject* TerminalSizeType +Modules/_io/textio.c - textiobase_getset variable static PyGetSetDef textiobase_getset[] +Modules/_io/textio.c - textiobase_methods variable static PyMethodDef textiobase_methods +Modules/_io/textio.c - textiowrapper_getset variable static PyGetSetDef textiowrapper_getset[] +Modules/_io/textio.c - textiowrapper_members variable static PyMemberDef textiowrapper_members[] +Modules/_io/textio.c - textiowrapper_methods variable static PyMethodDef textiowrapper_methods +Modules/faulthandler.c - thread variable static struct { PyObject *file; int fd; PY_TIMEOUT_T timeout_us; int repeat; PyInterpreterState *interp; int exit; char *header; size_t header_len; PyThread_type_lock cancel_event; PyThread_type_lock running; } thread +Python/thread.c - thread_debug variable static int thread_debug +Modules/_threadmodule.c - ThreadError variable static PyObject *ThreadError +Python/thread.c - threadinfo_desc variable static PyStructSequence_Desc threadinfo_desc +Python/thread.c - threadinfo_fields variable static PyStructSequence_Field threadinfo_fields[] +Python/thread.c - ThreadInfoType variable static PyTypeObject ThreadInfoType +Modules/_threadmodule.c - thread_methods variable static PyMethodDef thread_methods +Modules/_threadmodule.c - threadmodule variable static struct PyModuleDef threadmodule +Modules/posixmodule.c - ticks_per_second variable static long ticks_per_second +Modules/timemodule.c _PyTime_GetProcessTimeWithInfo ticks_per_second variable static long ticks_per_second +Modules/timemodule.c - time_methods variable static PyMethodDef time_methods +Modules/timemodule.c - timemodule variable static struct PyModuleDef timemodule +Modules/posixmodule.c - times_result_desc variable static PyStructSequence_Desc times_result_desc +Modules/posixmodule.c - times_result_fields variable static PyStructSequence_Field times_result_fields[] +Modules/posixmodule.c - TimesResultType variable static PyTypeObject* TimesResultType +Python/context.c - _token_missing variable static PyObject *_token_missing +Python/symtable.c - top variable static identifier top +Objects/typeobject.c - tp_new_methoddef variable static struct PyMethodDef tp_new_methoddef[] +Modules/_tracemalloc.c - tracemalloc_empty_traceback variable static traceback_t tracemalloc_empty_traceback +Modules/_tracemalloc.c - tracemalloc_filenames variable static _Py_hashtable_t *tracemalloc_filenames +Modules/_tracemalloc.c - tracemalloc_peak_traced_memory variable static size_t tracemalloc_peak_traced_memory +Modules/_tracemalloc.c - tracemalloc_reentrant_key variable static Py_tss_t tracemalloc_reentrant_key +Modules/_tracemalloc.c - tracemalloc_traceback variable static traceback_t *tracemalloc_traceback +Modules/_tracemalloc.c - tracemalloc_tracebacks variable static _Py_hashtable_t *tracemalloc_tracebacks +Modules/_tracemalloc.c - tracemalloc_traced_memory variable static size_t tracemalloc_traced_memory +Modules/_tracemalloc.c - tracemalloc_traces variable static _Py_hashtable_t *tracemalloc_traces +Objects/boolobject.c - true_str variable static PyObject *true_str +Python/Python-ast.c - Try_fields variable static const char *Try_fields[] +Python/Python-ast.c - Try_type variable static PyTypeObject *Try_type +Objects/tupleobject.c - tuple_as_mapping variable static PyMappingMethods tuple_as_mapping +Objects/tupleobject.c - tuple_as_sequence variable static PySequenceMethods tuple_as_sequence +Python/Python-ast.c - Tuple_fields variable static const char *Tuple_fields[] +Modules/_collectionsmodule.c - tuplegetter_members variable static PyMemberDef tuplegetter_members[] +Modules/_collectionsmodule.c - tuplegetter_methods variable static PyMethodDef tuplegetter_methods +Modules/_collectionsmodule.c - tuplegetter_type variable static PyTypeObject tuplegetter_type +Objects/tupleobject.c - tupleiter_methods variable static PyMethodDef tupleiter_methods +Objects/tupleobject.c - tuple_methods variable static PyMethodDef tuple_methods +Python/Python-ast.c - Tuple_type variable static PyTypeObject *Tuple_type +Objects/typeobject.c - type_getsets variable static PyGetSetDef type_getsets[] +Python/Python-ast.c - TypeIgnore_fields variable static const char *TypeIgnore_fields[] +Python/Python-ast.c - type_ignore_type variable static PyTypeObject *type_ignore_type +Python/Python-ast.c - TypeIgnore_type variable static PyTypeObject *TypeIgnore_type +Objects/typeobject.c - type_members variable static PyMemberDef type_members[] +Objects/typeobject.c - type_methods variable static PyMethodDef type_methods +Python/Python-ast.c - UAdd_singleton variable static PyObject *UAdd_singleton +Python/Python-ast.c - UAdd_type variable static PyTypeObject *UAdd_type +Objects/unicodeobject.c - ucnhash_CAPI variable static _PyUnicode_Name_CAPI *ucnhash_CAPI +Python/codecs.c - ucnhash_CAPI variable static _PyUnicode_Name_CAPI *ucnhash_CAPI +Python/ast.c - u_kind variable static PyObject *u_kind +Modules/posixmodule.c - uname_result_desc variable static PyStructSequence_Desc uname_result_desc +Modules/posixmodule.c - uname_result_fields variable static PyStructSequence_Field uname_result_fields[] +Modules/posixmodule.c - UnameResultType variable static PyTypeObject* UnameResultType +Python/Python-ast.c - UnaryOp_fields variable static const char *UnaryOp_fields[] +Python/Python-ast.c - unaryop_type variable static PyTypeObject *unaryop_type +Python/Python-ast.c - UnaryOp_type variable static PyTypeObject *UnaryOp_type +Objects/unicodeobject.c - unicode_as_mapping variable static PyMappingMethods unicode_as_mapping +Objects/unicodeobject.c - unicode_as_number variable static PyNumberMethods unicode_as_number +Objects/unicodeobject.c - unicode_as_sequence variable static PySequenceMethods unicode_as_sequence +Objects/unicodeobject.c - unicode_empty variable static PyObject *unicode_empty +Objects/exceptions.c - UnicodeError_members variable static PyMemberDef UnicodeError_members[] +Objects/unicodeobject.c - unicodeiter_methods variable static PyMethodDef unicodeiter_methods +Objects/unicodeobject.c - unicode_latin1 variable static PyObject *unicode_latin1[256] +Objects/unicodeobject.c - unicode_methods variable static PyMethodDef unicode_methods +Modules/_tracemalloc.c - unknown_filename variable static PyObject *unknown_filename +Python/errors.c - UnraisableHookArgs_desc variable static PyStructSequence_Desc UnraisableHookArgs_desc +Python/errors.c - UnraisableHookArgs_fields variable static PyStructSequence_Field UnraisableHookArgs_fields[] +Python/errors.c - UnraisableHookArgsType variable static PyTypeObject UnraisableHookArgsType +Objects/obmalloc.c - unused_arena_objects variable static struct arena_object* unused_arena_objects +Python/bootstrap_hash.c - urandom_cache variable static struct { int fd; dev_t st_dev; ino_t st_ino; } urandom_cache +Objects/obmalloc.c - usable_arenas variable static struct arena_object* usable_arenas +Objects/obmalloc.c - usedpools variable static poolp usedpools[2 * ((NB_SMALL_SIZE_CLASSES + 7) / 8) * 8] +Modules/faulthandler.c - user_signals variable static user_signal_t *user_signals +Python/Python-ast.c - USub_singleton variable static PyObject *USub_singleton +Python/Python-ast.c - USub_type variable static PyTypeObject *USub_type +Python/getversion.c Py_GetVersion version variable static char version[250] +Python/sysmodule.c - version_info_desc variable static PyStructSequence_Desc version_info_desc +Python/sysmodule.c - version_info_fields variable static PyStructSequence_Field version_info_fields[] +Python/sysmodule.c - VersionInfoType variable static PyTypeObject VersionInfoType +Modules/posixmodule.c - waitid_result_desc variable static PyStructSequence_Desc waitid_result_desc +Modules/posixmodule.c - waitid_result_fields variable static PyStructSequence_Field waitid_result_fields[] +Modules/posixmodule.c - WaitidResultType variable static PyTypeObject* WaitidResultType +Modules/signalmodule.c - wakeup variable static volatile struct { SOCKET_T fd; int warn_on_full_buffer; int use_send; } wakeup +Python/_warnings.c - warnings_functions variable static PyMethodDef warnings_functions[] +Python/_warnings.c - warningsmodule variable static struct PyModuleDef warningsmodule +Modules/_weakref.c - weakref_functions variable static PyMethodDef weakref_functions +Objects/weakrefobject.c - weakref_members variable static PyMemberDef weakref_members[] +Modules/_weakref.c - weakrefmodule variable static struct PyModuleDef weakrefmodule +Python/sysmodule.c - whatstrings variable static PyObject *whatstrings[8] +Python/Python-ast.c - While_fields variable static const char *While_fields[] +Python/Python-ast.c - While_type variable static PyTypeObject *While_type +Python/Python-ast.c - With_fields variable static const char *With_fields[] +Python/Python-ast.c - withitem_fields variable static const char *withitem_fields[] +Python/Python-ast.c - withitem_type variable static PyTypeObject *withitem_type +Python/Python-ast.c - With_type variable static PyTypeObject *With_type +Objects/descrobject.c - wrapperdescr_getset variable static PyGetSetDef wrapperdescr_getset[] +Objects/descrobject.c - wrapper_getsets variable static PyGetSetDef wrapper_getsets[] +Objects/descrobject.c - wrapper_members variable static PyMemberDef wrapper_members[] +Objects/descrobject.c - wrapper_methods variable static PyMethodDef wrapper_methods +Modules/_threadmodule.c local_new wr_callback_def variable static PyMethodDef wr_callback_def +Modules/xxsubtype.c - xxsubtype_functions variable static PyMethodDef xxsubtype_functions[] +Modules/xxsubtype.c - xxsubtypemodule variable static struct PyModuleDef xxsubtypemodule +Modules/xxsubtype.c - xxsubtype_slots variable static struct PyModuleDef_Slot xxsubtype_slots[] +Python/Python-ast.c - Yield_fields variable static const char *Yield_fields[] +Python/Python-ast.c - YieldFrom_fields variable static const char *YieldFrom_fields[] +Python/Python-ast.c - YieldFrom_type variable static PyTypeObject *YieldFrom_type +Python/Python-ast.c - Yield_type variable static PyTypeObject *Yield_type +Modules/itertoolsmodule.c - zip_longest_methods variable static PyMethodDef zip_longest_methods +Modules/itertoolsmodule.c - ziplongest_type variable static PyTypeObject ziplongest_type +Python/bltinmodule.c - zip_methods variable static PyMethodDef zip_methods diff --git a/Tools/ccbench/ccbench.py b/Tools/ccbench/ccbench.py index 60cec3e9cbefa2f46c18ef9921d96f6250618927..ab1465a276092310cd85654aa51b1c1298c52f36 100644 --- a/Tools/ccbench/ccbench.py +++ b/Tools/ccbench/ccbench.py @@ -84,13 +84,6 @@ def task_regex(): pat = re.compile(r'^(\s*def\s)|(.*(?= newbottom: break c.move(p, 0, 1) diff --git a/Tools/demo/rpythond.py b/Tools/demo/rpythond.py index a885b3e946a1fc2437c23aaa0ff17fe59b136b77..a18de137fa1cf888e43c2824923de235f8e52af3 100755 --- a/Tools/demo/rpythond.py +++ b/Tools/demo/rpythond.py @@ -29,7 +29,7 @@ def main(): with conn: print('connection from', remotehost, remoteport) request = b'' - while 1: + while True: data = conn.recv(BUFSIZE) if not data: break diff --git a/Tools/demo/sortvisu.py b/Tools/demo/sortvisu.py index 8447bc757e630dc6e3f12e563f0408cff3c0690e..056a0e05fb1ed2e988262d3baf0ec0a08699fefa 100755 --- a/Tools/demo/sortvisu.py +++ b/Tools/demo/sortvisu.py @@ -444,7 +444,7 @@ def quicksort(array): array.wait(1000) left = first right = last - while 1: + while True: array.message("Sweep right pointer") right = right-1 array.show_right(right) @@ -473,7 +473,7 @@ def quicksort(array): array.hide_partition() def demosort(array): - while 1: + while True: for alg in [quicksort, insertionsort, selectionsort, bubblesort]: randomize(array) alg(array) diff --git a/Tools/demo/ss1.py b/Tools/demo/spreadsheet.py old mode 100755 new mode 100644 similarity index 100% rename from Tools/demo/ss1.py rename to Tools/demo/spreadsheet.py diff --git a/Tools/freeze/freeze.py b/Tools/freeze/freeze.py index 83aa508a46a93e79664d02fc09be9b3be0489ed4..d66e1e2708e758de448e1d31923294272761fdc0 100755 --- a/Tools/freeze/freeze.py +++ b/Tools/freeze/freeze.py @@ -93,6 +93,7 @@ import getopt import os import sys +import sysconfig # Import the freeze-private modules @@ -226,7 +227,7 @@ def main(): extensions_c = 'frozen_extensions.c' if ishome: print("(Using Python source directory)") - binlib = exec_prefix + configdir = exec_prefix incldir = os.path.join(prefix, 'Include') config_h_dir = exec_prefix config_c_in = os.path.join(prefix, 'Modules', 'config.c.in') @@ -235,22 +236,21 @@ def main(): if win: frozendllmain_c = os.path.join(exec_prefix, 'Pc\\frozen_dllmain.c') else: - binlib = os.path.join(exec_prefix, - 'lib', 'python%s' % version, - 'config-%s' % flagged_version) + configdir = sysconfig.get_config_var('LIBPL') incldir = os.path.join(prefix, 'include', 'python%s' % flagged_version) config_h_dir = os.path.join(exec_prefix, 'include', 'python%s' % flagged_version) - config_c_in = os.path.join(binlib, 'config.c.in') - frozenmain_c = os.path.join(binlib, 'frozenmain.c') - makefile_in = os.path.join(binlib, 'Makefile') - frozendllmain_c = os.path.join(binlib, 'frozen_dllmain.c') + config_c_in = os.path.join(configdir, 'config.c.in') + frozenmain_c = os.path.join(configdir, 'frozenmain.c') + makefile_in = os.path.join(configdir, 'Makefile') + frozendllmain_c = os.path.join(configdir, 'frozen_dllmain.c') + libdir = sysconfig.get_config_var('LIBDIR') supp_sources = [] defines = [] includes = ['-I' + incldir, '-I' + config_h_dir] # sanity check of directories and files - check_dirs = [prefix, exec_prefix, binlib, incldir] + check_dirs = [prefix, exec_prefix, configdir, incldir] if not win: # These are not directories on Windows. check_dirs = check_dirs + extensions @@ -457,7 +457,7 @@ def main(): cflags = ['$(OPT)'] cppflags = defines + includes - libs = [os.path.join(binlib, '$(LDLIBRARY)')] + libs = [os.path.join(libdir, '$(LDLIBRARY)')] somevars = {} if os.path.exists(makefile_in): diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py index ffb1813720e45b8c6a8f626b77b025c70a353d93..aeaa63e540d8b54b8296f429d77b68a985d5acbe 100755 --- a/Tools/gdb/libpython.py +++ b/Tools/gdb/libpython.py @@ -468,7 +468,7 @@ def __init__(self, cl_name, attrdict, address): def __repr__(self): if isinstance(self.attrdict, dict): kwargs = ', '.join(["%s=%r" % (arg, val) - for arg, val in self.attrdict.iteritems()]) + for arg, val in self.attrdict.items()]) return '<%s(%s) at remote 0x%x>' % (self.cl_name, kwargs, self.address) else: @@ -1566,7 +1566,7 @@ def is_other_python_frame(self): return False if (caller.startswith('cfunction_vectorcall_') or - caller == 'cfunction_call_varargs'): + caller == 'cfunction_call'): arg_name = 'func' # Within that frame: # "func" is the local containing the PyObject* of the diff --git a/Tools/msi/README.txt b/Tools/msi/README.txt index f5656b971b3cecf6ce2fcf573be33e7f18997b6b..82635f3d2c2a14e546258c2eaf62a8323b27b7e9 100644 --- a/Tools/msi/README.txt +++ b/Tools/msi/README.txt @@ -11,7 +11,7 @@ Tools/msi/buildrelease.bat script and environment variables: set PYTHON= set SPHINXBUILD= - set PATH=; + set PATH=; ;%PATH% buildrelease.bat [-x86] [-x64] [-D] [-B] @@ -106,7 +106,7 @@ Tools/msi/buildrelease.bat script: set PYTHON= set SPHINXBUILD= - set PATH=; + set PATH=; ;%PATH% buildrelease.bat [-x86] [-x64] [-D] [-B] @@ -131,7 +131,7 @@ installer. Official releases of Python must be signed. Ensure %PYTHON% and %SPHINXBUILD% are set when passing this option. You may also set %HTMLHELP% to the Html Help Compiler (hhc.exe), or put HHC -on your PATH or in externals/. You will also need Mercurial (hg.exe) on +on your PATH or in externals/. You will also need Git (git.exe) on your PATH. If WiX is not found on your system, it will be automatically downloaded diff --git a/Tools/msi/bundle/Default.thm b/Tools/msi/bundle/Default.thm index 1c0bd08eec941532b1a177964c013c4fe0c0f0d3..f5ba43d838fcf7ca7d37987f554174f81be9fad1 100644 --- a/Tools/msi/bundle/Default.thm +++ b/Tools/msi/bundle/Default.thm @@ -116,9 +116,9 @@ #(loc.SuccessHeader) - + - + #(loc.SuccessRestartText) diff --git a/Tools/msi/bundle/Default.wxl b/Tools/msi/bundle/Default.wxl index 43506d61004a5708facbfcf92a79f16e1b6e2295..791ce6eab74745c756a9b0ce8f22b6c11367083e 100644 --- a/Tools/msi/bundle/Default.wxl +++ b/Tools/msi/bundle/Default.wxl @@ -89,7 +89,7 @@ Select Customize to review current options. Install &launcher for all users (recommended) &Precompile standard library Download debugging &symbols - Download debu&g binaries (requires VS 2015 or later) + Download debu&g binaries (requires VS 2017 or later) [ActionLikeInstallation] Progress [ActionLikeInstalling]: @@ -105,11 +105,9 @@ Select Customize to review current options. &Launch You may need to restart your computer to finish updating files. &Restart - Special thanks to Mark Hammond, without whose years of freely shared Windows expertise, Python for Windows would still be Python for DOS. + New to Python? Start with the <a href="https://docs.python.org/[ShortVersion]/tutorial/index.html">online tutorial</a> and <a href="https://docs.python.org/[ShortVersion]/index.html">documentation</a>. At your terminal, type "py" to launch Python, or search for Python in your Start menu. -New to Python? Start with the <a href="https://docs.python.org/[ShortVersion]/tutorial/index.html">online tutorial</a> and <a href="https://docs.python.org/[ShortVersion]/index.html">documentation</a>. - -See <a href="https://docs.python.org/[ShortVersion]/whatsnew/[ShortVersion].html">what's new</a> in this release. +See <a href="https://docs.python.org/[ShortVersion]/whatsnew/[ShortVersion].html">what's new</a> in this release, or find more info about <a href="https://docs.python.org/[ShortVersion]/using/windows.html">using Python on Windows</a>. Thank you for using [WixBundleName]. Thank you for using [WixBundleName]. @@ -123,26 +121,9 @@ Feel free to email <a href="mailto:python-list@python.org">python-list@pyt &Restart Unable to install [WixBundleName] due to an existing install. Use Programs and Features to modify, repair or remove [WixBundleName]. - Windows 7 Service Pack 1 and all applicable updates are required to install [WixBundleName]. - -Please <a href="https://www.bing.com/search?q=how%20to%20install%20windows%207%20service%20pack%201">update your machine</a> and then restart the installation. - Windows Vista Service Pack 2 and all applicable updates are required to install [WixBundleName]. - -Please <a href="https://www.bing.com/search?q=how%20to%20install%20windows%20vista%20service%20pack%202">update your machine</a> and then restart the installation. - Windows Vista or later is required to install and use [WixBundleName]. - -Visit <a href="https://www.python.org/">python.org</a> to download Python 3.4. - - Windows Server 2008 R2 Service Pack 1 and all applicable updates are required to install [WixBundleName]. - -Please <a href="https://www.bing.com/search?q=how%20to%20install%20windows%20server%202008%20r2%20service%20pack%201">update your machine</a> and then restart the installation. - Windows Server 2008 Service Pack 2 and all applicable updates are required to install [WixBundleName]. - -Please <a href="https://www.bing.com/search?q=how%20to%20install%20windows%20server%202008%20service%20pack%202">update your machine</a> and then restart the installation. - Windows Server 2008 SP2 or later is required to install and use [WixBundleName]. - -Visit <a href="https://www.python.org/">python.org</a> to download Python 3.4. + At least Windows 8.1 or Windows Server 2012 are required to install [WixBundleName] +Visit <a href="https://www.python.org/">python.org</a> to download an earlier version of Python. Disable path length limit Changes your machine configuration to allow programs, including Python, to bypass the 260 character "MAX_PATH" limitation. diff --git a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp index fbdf7b6424d617940712b6e8d70f15fd1ab482a9..3c54e401330cfde05f6a2fcb1345380706224809 100644 --- a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp +++ b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp @@ -3011,65 +3011,35 @@ private: BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Target OS is Windows Server 2012 or later"); return; } else if (IsWindowsVersionOrGreater(6, 1, 1)) { - HMODULE hKernel32 = GetModuleHandleW(L"kernel32"); - if (hKernel32 && !GetProcAddress(hKernel32, "AddDllDirectory")) { - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows Server 2008 R2 without KB2533623"); - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "KB2533623 update is required to continue."); - /* The "MissingSP1" error also specifies updates are required */ - LocGetString(_wixLoc, L"#(loc.FailureWS2K8R2MissingSP1)", &pLocString); - } else { - BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Target OS is Windows Server 2008 R2 or later"); - return; - } + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Detected Windows Server 2008 R2"); } else if (IsWindowsVersionOrGreater(6, 1, 0)) { BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows Server 2008 R2"); - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Service Pack 1 is required to continue installation"); - LocGetString(_wixLoc, L"#(loc.FailureWS2K8R2MissingSP1)", &pLocString); - } else if (IsWindowsVersionOrGreater(6, 0, 2)) { - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Target OS is Windows Server 2008 SP2 or later"); - return; } else if (IsWindowsVersionOrGreater(6, 0, 0)) { BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows Server 2008"); - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Service Pack 2 is required to continue installation"); - LocGetString(_wixLoc, L"#(loc.FailureWS2K8MissingSP2)", &pLocString); } else { BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows Server 2003 or earlier"); - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Windows Server 2008 SP2 or later is required to continue installation"); - LocGetString(_wixLoc, L"#(loc.FailureWS2K3OrEarlier)", &pLocString); } + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Windows Server 2012 or later is required to continue installation"); } else { - if (IsWindows8OrGreater()) { - BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Target OS is Windows 8 or later"); + if (IsWindows10OrGreater()) { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Target OS is Windows 10 or later"); return; - } else if (IsWindows7SP1OrGreater()) { - HMODULE hKernel32 = GetModuleHandleW(L"kernel32"); - if (hKernel32 && !GetProcAddress(hKernel32, "AddDllDirectory")) { - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows 7 SP1 without KB2533623"); - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "KB2533623 update is required to continue."); - /* The "MissingSP1" error also specifies updates are required */ - LocGetString(_wixLoc, L"#(loc.FailureWin7MissingSP1)", &pLocString); - } else { - BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Target OS is Windows 7 SP1 or later"); - return; - } - } else if (IsWindows7OrGreater()) { - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows 7 RTM"); - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Service Pack 1 is required to continue installation"); - LocGetString(_wixLoc, L"#(loc.FailureWin7MissingSP1)", &pLocString); - } else if (IsWindowsVistaSP2OrGreater()) { - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Target OS is Windows Vista SP2"); + } else if (IsWindows8Point1OrGreater()) { + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Target OS is Windows 8.1"); return; + } else if (IsWindows8OrGreater()) { + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows 8"); + } else if (IsWindows7OrGreater()) { + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows 7"); } else if (IsWindowsVistaOrGreater()) { - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows Vista RTM or SP1"); - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Service Pack 2 is required to continue installation"); - LocGetString(_wixLoc, L"#(loc.FailureVistaMissingSP2)", &pLocString); + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows Vista"); } else { BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows XP or earlier"); - BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Windows Vista SP2 or later is required to continue installation"); - LocGetString(_wixLoc, L"#(loc.FailureXPOrEarlier)", &pLocString); } + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Windows 8.1 or later is required to continue installation"); } + LocGetString(_wixLoc, L"#(loc.FailureOldOS)", &pLocString); if (pLocString && pLocString->wzText) { BalFormatString(pLocString->wzText, &_failedMessage); } diff --git a/Tools/msi/bundle/packagegroups/crt.wxs b/Tools/msi/bundle/packagegroups/crt.wxs index 61b756fc2558bc26bad5d2b1192c2b91c67e6cd7..f931da1403b22787b92df152c2c46f8ef61835cc 100644 --- a/Tools/msi/bundle/packagegroups/crt.wxs +++ b/Tools/msi/bundle/packagegroups/crt.wxs @@ -4,7 +4,7 @@ @@ -12,7 +12,7 @@ diff --git a/Tools/msi/lib/lib_files.wxs b/Tools/msi/lib/lib_files.wxs index b462372512f6de0d5bf985900c4da983e4e22003..037fc38f1d9cbf6b461a869d1bad31ed5c00d03d 100644 --- a/Tools/msi/lib/lib_files.wxs +++ b/Tools/msi/lib/lib_files.wxs @@ -1,6 +1,6 @@  - + diff --git a/Tools/msi/sdktools.psm1 b/Tools/msi/sdktools.psm1 index 8081b104d85a7fdd56e069f97a2aede59903f5ff..c5973f9abc6abf0c652e54306c58a250a76ac93d 100644 --- a/Tools/msi/sdktools.psm1 +++ b/Tools/msi/sdktools.psm1 @@ -37,11 +37,11 @@ function Sign-File { foreach ($a in $files) { if ($certsha1) { - SignTool sign /sha1 $certsha1 /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d $description $a + SignTool sign /sha1 $certsha1 /fd sha256 /tr http://timestamp.digicert.com/ /td sha256 /d $description $a } elseif ($certname) { - SignTool sign /a /n $certname /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d $description $a + SignTool sign /a /n $certname /fd sha256 /tr http://timestamp.digicert.com/ /td sha256 /d $description $a } elseif ($certfile) { - SignTool sign /f $certfile /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d $description $a + SignTool sign /f $certfile /fd sha256 /tr http://timestamp.digicert.com/ /td sha256 /d $description $a } } } diff --git a/Tools/msi/test/test_files.wxs b/Tools/msi/test/test_files.wxs index 82a9115f75902311892573c8353e2cdc73cc70d7..9127ce894819e53427c19d0f2894ad0ed1cdb873 100644 --- a/Tools/msi/test/test_files.wxs +++ b/Tools/msi/test/test_files.wxs @@ -1,6 +1,6 @@ - + - + diff --git a/Tools/msi/uploadrelease.ps1 b/Tools/msi/uploadrelease.ps1 index d3673b4582983c9c7c54646638ce49aebfb89a12..7c825c443f22876c69417721981c703eac13ff54 100644 --- a/Tools/msi/uploadrelease.ps1 +++ b/Tools/msi/uploadrelease.ps1 @@ -90,7 +90,7 @@ if (-not $skipupload) { $d = "$target/$($p[0])/" & $plink -batch $user@$server mkdir $d & $plink -batch $user@$server chgrp downloads $d - & $plink -batch $user@$server chmod g-x,o+rx $d + & $plink -batch $user@$server chmod o+rx $d & $pscp -batch $chm.FullName "$user@${server}:$d" if (-not $?) { throw "Failed to upload $chm" } @@ -115,7 +115,7 @@ if (-not $skipupload) { $sd = "$d$($a.Name)$($p[1])/" & $plink -batch $user@$server mkdir $sd & $plink -batch $user@$server chgrp downloads $sd - & $plink -batch $user@$server chmod g-x,o+rx $sd + & $plink -batch $user@$server chmod o+rx $sd & $pscp -batch $msi.FullName "$user@${server}:$sd" if (-not $?) { throw "Failed to upload $msi" } & $plink -batch $user@$server chgrp downloads $sd* diff --git a/Tools/nuget/python.nuspec b/Tools/nuget/python.nuspec index 8f98e808916a3203f9e018ea7fcee2449088f321..2da5f2037eb23420f507aa662af4a3a2c9ecef4e 100644 --- a/Tools/nuget/python.nuspec +++ b/Tools/nuget/python.nuspec @@ -13,6 +13,6 @@ - + diff --git a/Tools/nuget/pythonarm32.nuspec b/Tools/nuget/pythonarm32.nuspec index 273d79a0312bd94b0da41a1598628cb5fee507db..2d197931edb32c3efce2a06917b6dafb1ebd198b 100644 --- a/Tools/nuget/pythonarm32.nuspec +++ b/Tools/nuget/pythonarm32.nuspec @@ -14,6 +14,7 @@ - + + diff --git a/Tools/nuget/pythondaily.nuspec b/Tools/nuget/pythondaily.nuspec index 5cf55806ddfb39c413cdf7f6966eea078d14b01c..7df1983f42a6fe203e267dc52715f27acbb0a078 100644 --- a/Tools/nuget/pythondaily.nuspec +++ b/Tools/nuget/pythondaily.nuspec @@ -13,6 +13,7 @@ - + + diff --git a/Tools/nuget/pythonx86.nuspec b/Tools/nuget/pythonx86.nuspec index 27ef67e7f5d3637d6f9a8c007a28c43fc8d9fe3b..ea878ba0bf390b6301d89eaea8653accf3fd3f85 100644 --- a/Tools/nuget/pythonx86.nuspec +++ b/Tools/nuget/pythonx86.nuspec @@ -13,6 +13,7 @@ - + + diff --git a/Tools/parser/unparse.py b/Tools/parser/unparse.py deleted file mode 100644 index 0642b84dcfc8288741df547a249d36ecdc69ea47..0000000000000000000000000000000000000000 --- a/Tools/parser/unparse.py +++ /dev/null @@ -1,719 +0,0 @@ -"Usage: unparse.py " -import sys -import ast -import tokenize -import io -import os - -# Large float and imaginary literals get turned into infinities in the AST. -# We unparse those infinities to INFSTR. -INFSTR = "1e" + repr(sys.float_info.max_10_exp + 1) - -def interleave(inter, f, seq): - """Call f on each item in seq, calling inter() in between. - """ - seq = iter(seq) - try: - f(next(seq)) - except StopIteration: - pass - else: - for x in seq: - inter() - f(x) - -class Unparser: - """Methods in this class recursively traverse an AST and - output source code for the abstract syntax; original formatting - is disregarded. """ - - def __init__(self, tree, file = sys.stdout): - """Unparser(tree, file=sys.stdout) -> None. - Print the source for tree to file.""" - self.f = file - self._indent = 0 - self.dispatch(tree) - print("", file=self.f) - self.f.flush() - - def fill(self, text = ""): - "Indent a piece of text, according to the current indentation level" - self.f.write("\n"+" "*self._indent + text) - - def write(self, text): - "Append a piece of text to the current line." - self.f.write(text) - - def enter(self): - "Print ':', and increase the indentation." - self.write(":") - self._indent += 1 - - def leave(self): - "Decrease the indentation level." - self._indent -= 1 - - def dispatch(self, tree): - "Dispatcher function, dispatching tree type T to method _T." - if isinstance(tree, list): - for t in tree: - self.dispatch(t) - return - meth = getattr(self, "_"+tree.__class__.__name__) - meth(tree) - - - ############### Unparsing methods ###################### - # There should be one method per concrete grammar type # - # Constructors should be grouped by sum type. Ideally, # - # this would follow the order in the grammar, but # - # currently doesn't. # - ######################################################## - - def _Module(self, tree): - for stmt in tree.body: - self.dispatch(stmt) - - # stmt - def _Expr(self, tree): - self.fill() - self.dispatch(tree.value) - - def _NamedExpr(self, tree): - self.write("(") - self.dispatch(tree.target) - self.write(" := ") - self.dispatch(tree.value) - self.write(")") - - def _Import(self, t): - self.fill("import ") - interleave(lambda: self.write(", "), self.dispatch, t.names) - - def _ImportFrom(self, t): - self.fill("from ") - self.write("." * t.level) - if t.module: - self.write(t.module) - self.write(" import ") - interleave(lambda: self.write(", "), self.dispatch, t.names) - - def _Assign(self, t): - self.fill() - for target in t.targets: - self.dispatch(target) - self.write(" = ") - self.dispatch(t.value) - - def _AugAssign(self, t): - self.fill() - self.dispatch(t.target) - self.write(" "+self.binop[t.op.__class__.__name__]+"= ") - self.dispatch(t.value) - - def _AnnAssign(self, t): - self.fill() - if not t.simple and isinstance(t.target, ast.Name): - self.write('(') - self.dispatch(t.target) - if not t.simple and isinstance(t.target, ast.Name): - self.write(')') - self.write(": ") - self.dispatch(t.annotation) - if t.value: - self.write(" = ") - self.dispatch(t.value) - - def _Return(self, t): - self.fill("return") - if t.value: - self.write(" ") - self.dispatch(t.value) - - def _Pass(self, t): - self.fill("pass") - - def _Break(self, t): - self.fill("break") - - def _Continue(self, t): - self.fill("continue") - - def _Delete(self, t): - self.fill("del ") - interleave(lambda: self.write(", "), self.dispatch, t.targets) - - def _Assert(self, t): - self.fill("assert ") - self.dispatch(t.test) - if t.msg: - self.write(", ") - self.dispatch(t.msg) - - def _Global(self, t): - self.fill("global ") - interleave(lambda: self.write(", "), self.write, t.names) - - def _Nonlocal(self, t): - self.fill("nonlocal ") - interleave(lambda: self.write(", "), self.write, t.names) - - def _Await(self, t): - self.write("(") - self.write("await") - if t.value: - self.write(" ") - self.dispatch(t.value) - self.write(")") - - def _Yield(self, t): - self.write("(") - self.write("yield") - if t.value: - self.write(" ") - self.dispatch(t.value) - self.write(")") - - def _YieldFrom(self, t): - self.write("(") - self.write("yield from") - if t.value: - self.write(" ") - self.dispatch(t.value) - self.write(")") - - def _Raise(self, t): - self.fill("raise") - if not t.exc: - assert not t.cause - return - self.write(" ") - self.dispatch(t.exc) - if t.cause: - self.write(" from ") - self.dispatch(t.cause) - - def _Try(self, t): - self.fill("try") - self.enter() - self.dispatch(t.body) - self.leave() - for ex in t.handlers: - self.dispatch(ex) - if t.orelse: - self.fill("else") - self.enter() - self.dispatch(t.orelse) - self.leave() - if t.finalbody: - self.fill("finally") - self.enter() - self.dispatch(t.finalbody) - self.leave() - - def _ExceptHandler(self, t): - self.fill("except") - if t.type: - self.write(" ") - self.dispatch(t.type) - if t.name: - self.write(" as ") - self.write(t.name) - self.enter() - self.dispatch(t.body) - self.leave() - - def _ClassDef(self, t): - self.write("\n") - for deco in t.decorator_list: - self.fill("@") - self.dispatch(deco) - self.fill("class "+t.name) - self.write("(") - comma = False - for e in t.bases: - if comma: self.write(", ") - else: comma = True - self.dispatch(e) - for e in t.keywords: - if comma: self.write(", ") - else: comma = True - self.dispatch(e) - self.write(")") - - self.enter() - self.dispatch(t.body) - self.leave() - - def _FunctionDef(self, t): - self.__FunctionDef_helper(t, "def") - - def _AsyncFunctionDef(self, t): - self.__FunctionDef_helper(t, "async def") - - def __FunctionDef_helper(self, t, fill_suffix): - self.write("\n") - for deco in t.decorator_list: - self.fill("@") - self.dispatch(deco) - def_str = fill_suffix+" "+t.name + "(" - self.fill(def_str) - self.dispatch(t.args) - self.write(")") - if t.returns: - self.write(" -> ") - self.dispatch(t.returns) - self.enter() - self.dispatch(t.body) - self.leave() - - def _For(self, t): - self.__For_helper("for ", t) - - def _AsyncFor(self, t): - self.__For_helper("async for ", t) - - def __For_helper(self, fill, t): - self.fill(fill) - self.dispatch(t.target) - self.write(" in ") - self.dispatch(t.iter) - self.enter() - self.dispatch(t.body) - self.leave() - if t.orelse: - self.fill("else") - self.enter() - self.dispatch(t.orelse) - self.leave() - - def _If(self, t): - self.fill("if ") - self.dispatch(t.test) - self.enter() - self.dispatch(t.body) - self.leave() - # collapse nested ifs into equivalent elifs. - while (t.orelse and len(t.orelse) == 1 and - isinstance(t.orelse[0], ast.If)): - t = t.orelse[0] - self.fill("elif ") - self.dispatch(t.test) - self.enter() - self.dispatch(t.body) - self.leave() - # final else - if t.orelse: - self.fill("else") - self.enter() - self.dispatch(t.orelse) - self.leave() - - def _While(self, t): - self.fill("while ") - self.dispatch(t.test) - self.enter() - self.dispatch(t.body) - self.leave() - if t.orelse: - self.fill("else") - self.enter() - self.dispatch(t.orelse) - self.leave() - - def _With(self, t): - self.fill("with ") - interleave(lambda: self.write(", "), self.dispatch, t.items) - self.enter() - self.dispatch(t.body) - self.leave() - - def _AsyncWith(self, t): - self.fill("async with ") - interleave(lambda: self.write(", "), self.dispatch, t.items) - self.enter() - self.dispatch(t.body) - self.leave() - - # expr - def _JoinedStr(self, t): - self.write("f") - string = io.StringIO() - self._fstring_JoinedStr(t, string.write) - self.write(repr(string.getvalue())) - - def _FormattedValue(self, t): - self.write("f") - string = io.StringIO() - self._fstring_FormattedValue(t, string.write) - self.write(repr(string.getvalue())) - - def _fstring_JoinedStr(self, t, write): - for value in t.values: - meth = getattr(self, "_fstring_" + type(value).__name__) - meth(value, write) - - def _fstring_Constant(self, t, write): - assert isinstance(t.value, str) - value = t.value.replace("{", "{{").replace("}", "}}") - write(value) - - def _fstring_FormattedValue(self, t, write): - write("{") - expr = io.StringIO() - Unparser(t.value, expr) - expr = expr.getvalue().rstrip("\n") - if expr.startswith("{"): - write(" ") # Separate pair of opening brackets as "{ {" - write(expr) - if t.conversion != -1: - conversion = chr(t.conversion) - assert conversion in "sra" - write(f"!{conversion}") - if t.format_spec: - write(":") - meth = getattr(self, "_fstring_" + type(t.format_spec).__name__) - meth(t.format_spec, write) - write("}") - - def _Name(self, t): - self.write(t.id) - - def _write_constant(self, value): - if isinstance(value, (float, complex)): - # Substitute overflowing decimal literal for AST infinities. - self.write(repr(value).replace("inf", INFSTR)) - else: - self.write(repr(value)) - - def _Constant(self, t): - value = t.value - if isinstance(value, tuple): - self.write("(") - if len(value) == 1: - self._write_constant(value[0]) - self.write(",") - else: - interleave(lambda: self.write(", "), self._write_constant, value) - self.write(")") - elif value is ...: - self.write("...") - else: - if t.kind == "u": - self.write("u") - self._write_constant(t.value) - - def _List(self, t): - self.write("[") - interleave(lambda: self.write(", "), self.dispatch, t.elts) - self.write("]") - - def _ListComp(self, t): - self.write("[") - self.dispatch(t.elt) - for gen in t.generators: - self.dispatch(gen) - self.write("]") - - def _GeneratorExp(self, t): - self.write("(") - self.dispatch(t.elt) - for gen in t.generators: - self.dispatch(gen) - self.write(")") - - def _SetComp(self, t): - self.write("{") - self.dispatch(t.elt) - for gen in t.generators: - self.dispatch(gen) - self.write("}") - - def _DictComp(self, t): - self.write("{") - self.dispatch(t.key) - self.write(": ") - self.dispatch(t.value) - for gen in t.generators: - self.dispatch(gen) - self.write("}") - - def _comprehension(self, t): - if t.is_async: - self.write(" async for ") - else: - self.write(" for ") - self.dispatch(t.target) - self.write(" in ") - self.dispatch(t.iter) - for if_clause in t.ifs: - self.write(" if ") - self.dispatch(if_clause) - - def _IfExp(self, t): - self.write("(") - self.dispatch(t.body) - self.write(" if ") - self.dispatch(t.test) - self.write(" else ") - self.dispatch(t.orelse) - self.write(")") - - def _Set(self, t): - assert(t.elts) # should be at least one element - self.write("{") - interleave(lambda: self.write(", "), self.dispatch, t.elts) - self.write("}") - - def _Dict(self, t): - self.write("{") - def write_key_value_pair(k, v): - self.dispatch(k) - self.write(": ") - self.dispatch(v) - - def write_item(item): - k, v = item - if k is None: - # for dictionary unpacking operator in dicts {**{'y': 2}} - # see PEP 448 for details - self.write("**") - self.dispatch(v) - else: - write_key_value_pair(k, v) - interleave(lambda: self.write(", "), write_item, zip(t.keys, t.values)) - self.write("}") - - def _Tuple(self, t): - self.write("(") - if len(t.elts) == 1: - elt = t.elts[0] - self.dispatch(elt) - self.write(",") - else: - interleave(lambda: self.write(", "), self.dispatch, t.elts) - self.write(")") - - unop = {"Invert":"~", "Not": "not", "UAdd":"+", "USub":"-"} - def _UnaryOp(self, t): - self.write("(") - self.write(self.unop[t.op.__class__.__name__]) - self.write(" ") - self.dispatch(t.operand) - self.write(")") - - binop = { "Add":"+", "Sub":"-", "Mult":"*", "MatMult":"@", "Div":"/", "Mod":"%", - "LShift":"<<", "RShift":">>", "BitOr":"|", "BitXor":"^", "BitAnd":"&", - "FloorDiv":"//", "Pow": "**"} - def _BinOp(self, t): - self.write("(") - self.dispatch(t.left) - self.write(" " + self.binop[t.op.__class__.__name__] + " ") - self.dispatch(t.right) - self.write(")") - - cmpops = {"Eq":"==", "NotEq":"!=", "Lt":"<", "LtE":"<=", "Gt":">", "GtE":">=", - "Is":"is", "IsNot":"is not", "In":"in", "NotIn":"not in"} - def _Compare(self, t): - self.write("(") - self.dispatch(t.left) - for o, e in zip(t.ops, t.comparators): - self.write(" " + self.cmpops[o.__class__.__name__] + " ") - self.dispatch(e) - self.write(")") - - boolops = {ast.And: 'and', ast.Or: 'or'} - def _BoolOp(self, t): - self.write("(") - s = " %s " % self.boolops[t.op.__class__] - interleave(lambda: self.write(s), self.dispatch, t.values) - self.write(")") - - def _Attribute(self,t): - self.dispatch(t.value) - # Special case: 3.__abs__() is a syntax error, so if t.value - # is an integer literal then we need to either parenthesize - # it or add an extra space to get 3 .__abs__(). - if isinstance(t.value, ast.Constant) and isinstance(t.value.value, int): - self.write(" ") - self.write(".") - self.write(t.attr) - - def _Call(self, t): - self.dispatch(t.func) - self.write("(") - comma = False - for e in t.args: - if comma: self.write(", ") - else: comma = True - self.dispatch(e) - for e in t.keywords: - if comma: self.write(", ") - else: comma = True - self.dispatch(e) - self.write(")") - - def _Subscript(self, t): - self.dispatch(t.value) - self.write("[") - if (isinstance(t.slice, ast.Index) - and isinstance(t.slice.value, ast.Tuple) - and t.slice.value.elts): - if len(t.slice.value.elts) == 1: - elt = t.slice.value.elts[0] - self.dispatch(elt) - self.write(",") - else: - interleave(lambda: self.write(", "), self.dispatch, t.slice.value.elts) - else: - self.dispatch(t.slice) - self.write("]") - - def _Starred(self, t): - self.write("*") - self.dispatch(t.value) - - # slice - def _Ellipsis(self, t): - self.write("...") - - def _Index(self, t): - self.dispatch(t.value) - - def _Slice(self, t): - if t.lower: - self.dispatch(t.lower) - self.write(":") - if t.upper: - self.dispatch(t.upper) - if t.step: - self.write(":") - self.dispatch(t.step) - - def _ExtSlice(self, t): - if len(t.dims) == 1: - elt = t.dims[0] - self.dispatch(elt) - self.write(",") - else: - interleave(lambda: self.write(', '), self.dispatch, t.dims) - - # argument - def _arg(self, t): - self.write(t.arg) - if t.annotation: - self.write(": ") - self.dispatch(t.annotation) - - # others - def _arguments(self, t): - first = True - # normal arguments - all_args = t.posonlyargs + t.args - defaults = [None] * (len(all_args) - len(t.defaults)) + t.defaults - for index, elements in enumerate(zip(all_args, defaults), 1): - a, d = elements - if first:first = False - else: self.write(", ") - self.dispatch(a) - if d: - self.write("=") - self.dispatch(d) - if index == len(t.posonlyargs): - self.write(", /") - - # varargs, or bare '*' if no varargs but keyword-only arguments present - if t.vararg or t.kwonlyargs: - if first:first = False - else: self.write(", ") - self.write("*") - if t.vararg: - self.write(t.vararg.arg) - if t.vararg.annotation: - self.write(": ") - self.dispatch(t.vararg.annotation) - - # keyword-only arguments - if t.kwonlyargs: - for a, d in zip(t.kwonlyargs, t.kw_defaults): - if first:first = False - else: self.write(", ") - self.dispatch(a), - if d: - self.write("=") - self.dispatch(d) - - # kwargs - if t.kwarg: - if first:first = False - else: self.write(", ") - self.write("**"+t.kwarg.arg) - if t.kwarg.annotation: - self.write(": ") - self.dispatch(t.kwarg.annotation) - - def _keyword(self, t): - if t.arg is None: - self.write("**") - else: - self.write(t.arg) - self.write("=") - self.dispatch(t.value) - - def _Lambda(self, t): - self.write("(") - self.write("lambda ") - self.dispatch(t.args) - self.write(": ") - self.dispatch(t.body) - self.write(")") - - def _alias(self, t): - self.write(t.name) - if t.asname: - self.write(" as "+t.asname) - - def _withitem(self, t): - self.dispatch(t.context_expr) - if t.optional_vars: - self.write(" as ") - self.dispatch(t.optional_vars) - -def roundtrip(filename, output=sys.stdout): - with open(filename, "rb") as pyfile: - encoding = tokenize.detect_encoding(pyfile.readline)[0] - with open(filename, "r", encoding=encoding) as pyfile: - source = pyfile.read() - tree = compile(source, filename, "exec", ast.PyCF_ONLY_AST) - Unparser(tree, output) - - - -def testdir(a): - try: - names = [n for n in os.listdir(a) if n.endswith('.py')] - except OSError: - print("Directory not readable: %s" % a, file=sys.stderr) - else: - for n in names: - fullname = os.path.join(a, n) - if os.path.isfile(fullname): - output = io.StringIO() - print('Testing %s' % fullname) - try: - roundtrip(fullname, output) - except Exception as e: - print(' Failed to compile, exception is %s' % repr(e)) - elif os.path.isdir(fullname): - testdir(fullname) - -def main(args): - if args[0] == '--testdir': - for a in args[1:]: - testdir(a) - else: - for a in args: - roundtrip(a) - -if __name__=='__main__': - main(sys.argv[1:]) diff --git a/Tools/peg_generator/.clang-format b/Tools/peg_generator/.clang-format new file mode 100644 index 0000000000000000000000000000000000000000..b2bb93dbd059b4f706a86570de41fa1f197af5f1 --- /dev/null +++ b/Tools/peg_generator/.clang-format @@ -0,0 +1,17 @@ +# A clang-format style that approximates Python's PEP 7 +BasedOnStyle: Google +AlwaysBreakAfterReturnType: All +AllowShortIfStatementsOnASingleLine: false +AlignAfterOpenBracket: Align +BreakBeforeBraces: Stroustrup +ColumnLimit: 95 +DerivePointerAlignment: false +IndentWidth: 4 +Language: Cpp +PointerAlignment: Right +ReflowComments: true +SpaceBeforeParens: ControlStatements +SpacesInParentheses: false +TabWidth: 4 +UseTab: Never +SortIncludes: false diff --git a/Tools/peg_generator/.gitignore b/Tools/peg_generator/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..f25e54195e4c94fde7371129c22b4fbc0ae71c94 --- /dev/null +++ b/Tools/peg_generator/.gitignore @@ -0,0 +1,4 @@ +peg_extension/parse.c +data/xxl.py +venv/ +@data diff --git a/Tools/peg_generator/Makefile b/Tools/peg_generator/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..fb727c048b3118cd81e72cae1fd8a43251d6a6ef --- /dev/null +++ b/Tools/peg_generator/Makefile @@ -0,0 +1,115 @@ +UNAME_S := $(shell uname -s) +ifeq ($(UNAME_S),Linux) + PYTHON ?= ../../python +endif +ifeq ($(UNAME_S),Darwin) + PYTHON ?= ../../python.exe +endif +VENVDIR ?= ./venv +VENVPYTHON ?= $(VENVDIR)/bin/python +CPYTHON ?= ../../Lib +MYPY ?= mypy + +GRAMMAR = ../../Grammar/python.gram +TOKENS = ../../Grammar/Tokens +TESTFILE = data/cprog.py +TIMEFILE = data/xxl.py +TESTDIR = . +TESTFLAGS = --short + +data/xxl.py: + $(PYTHON) -m zipfile -e data/xxl.zip data + +build: peg_extension/parse.c + +peg_extension/parse.c: $(GRAMMAR) $(TOKENS) pegen/*.py peg_extension/peg_extension.c ../../Parser/pegen/pegen.c ../../Parser/pegen/parse_string.c ../../Parser/pegen/*.h pegen/grammar_parser.py + $(PYTHON) -m pegen -q c $(GRAMMAR) $(TOKENS) -o peg_extension/parse.c --compile-extension + +clean: + -rm -f peg_extension/*.o peg_extension/*.so peg_extension/parse.c + -rm -f data/xxl.py + -rm -rf $(VENVDIR) + +dump: peg_extension/parse.c + cat -n $(TESTFILE) + $(PYTHON) -c "from peg_extension import parse; import ast; t = parse.parse_file('$(TESTFILE)', mode=1); print(ast.dump(t))" + +regen-metaparser: pegen/metagrammar.gram pegen/*.py + $(PYTHON) -m pegen -q python pegen/metagrammar.gram -o pegen/grammar_parser.py + +# Note: These targets really depend on the generated shared object in peg_extension/parse.*.so but +# this has different names in different systems so we are abusing the implicit dependency on +# parse.c by the use of --compile-extension. + +.PHONY: test + +venv: + $(PYTHON) -m venv $(VENVDIR) + $(VENVPYTHON) -m pip install -U pip setuptools + $(VENVPYTHON) -m pip install -r requirements.pip + @echo "The venv has been created in the $(VENVDIR) directory" + +test: run + +run: peg_extension/parse.c + $(PYTHON) -c "from peg_extension import parse; t = parse.parse_file('$(TESTFILE)'); exec(t)" + +compile: peg_extension/parse.c + $(PYTHON) -c "from peg_extension import parse; t = parse.parse_file('$(TESTFILE)', mode=2)" + +parse: peg_extension/parse.c + $(PYTHON) -c "from peg_extension import parse; t = parse.parse_file('$(TESTFILE)', mode=1)" + +check: peg_extension/parse.c + $(PYTHON) -c "from peg_extension import parse; t = parse.parse_file('$(TESTFILE)', mode=0)" + +stats: peg_extension/parse.c data/xxl.py + $(PYTHON) -c "from peg_extension import parse; t = parse.parse_file('$(TIMEFILE)', mode=0); parse.dump_memo_stats()" >@data + $(PYTHON) scripts/joinstats.py @data + +time: time_compile + +time_compile: venv data/xxl.py + $(VENVPYTHON) scripts/benchmark.py --parser=new --target=xxl compile + +time_parse: venv data/xxl.py + $(VENVPYTHON) scripts/benchmark.py --parser=new --target=xxl parse + +time_old: time_old_compile + +time_old_compile: venv data/xxl.py + $(VENVPYTHON) scripts/benchmark.py --parser=old --target=xxl compile + +time_old_parse: venv data/xxl.py + $(VENVPYTHON) scripts/benchmark.py --parser=old --target=xxl parse + +time_peg_dir: venv + $(VENVPYTHON) scripts/test_parse_directory.py \ + -d $(TESTDIR) \ + $(TESTFLAGS) \ + --exclude "*/failset/*" \ + --exclude "*/failset/**" \ + --exclude "*/failset/**/*" + +time_stdlib: $(CPYTHON) venv + $(VENVPYTHON) scripts/test_parse_directory.py \ + -d $(CPYTHON) \ + $(TESTFLAGS) \ + --exclude "*/bad*" \ + --exclude "*/lib2to3/tests/data/*" + +mypy: regen-metaparser + $(MYPY) # For list of files, see mypy.ini + +format-python: + black pegen scripts + +format: format-python + +find_max_nesting: + $(PYTHON) scripts/find_max_nesting.py + +tags: TAGS + +TAGS: pegen/*.py test/test_pegen.py + etags pegen/*.py test/test_pegen.py diff --git a/Tools/peg_generator/data/cprog.py b/Tools/peg_generator/data/cprog.py new file mode 100644 index 0000000000000000000000000000000000000000..79a42983dbd236323850ac399175161bf0338d43 --- /dev/null +++ b/Tools/peg_generator/data/cprog.py @@ -0,0 +1,11 @@ +if 1: + print("Hello " + "world") + if 0: + print("then") + print("clause") + elif 1: + pass + elif 1: + pass + else: + print("else-clause") diff --git a/Tools/peg_generator/data/top-pypi-packages-365-days.json b/Tools/peg_generator/data/top-pypi-packages-365-days.json new file mode 100644 index 0000000000000000000000000000000000000000..63ff08436a6647a114889bca99f6d87d8663656b --- /dev/null +++ b/Tools/peg_generator/data/top-pypi-packages-365-days.json @@ -0,0 +1,16011 @@ +{ + "last_update": "2020-01-17 15:34:44", + "query": { + "bytes_billed": 646188105728, + "bytes_processed": 646187256701, + "cached": false, + "estimated_cost": "2.94" + }, + "rows": [ + { + "download_count": 910195765, + "project": "urllib3" + }, + { + "download_count": 749120890, + "project": "six" + }, + { + "download_count": 670113460, + "project": "botocore" + }, + { + "download_count": 629757389, + "project": "python-dateutil" + }, + { + "download_count": 629606070, + "project": "pip" + }, + { + "download_count": 626954494, + "project": "requests" + }, + { + "download_count": 595019137, + "project": "s3transfer" + }, + { + "download_count": 570148733, + "project": "certifi" + }, + { + "download_count": 542241710, + "project": "idna" + }, + { + "download_count": 534393540, + "project": "pyyaml" + }, + { + "download_count": 531342983, + "project": "pyasn1" + }, + { + "download_count": 518080177, + "project": "docutils" + }, + { + "download_count": 516892347, + "project": "chardet" + }, + { + "download_count": 502956749, + "project": "rsa" + }, + { + "download_count": 480905080, + "project": "jmespath" + }, + { + "download_count": 410856025, + "project": "setuptools" + }, + { + "download_count": 410196551, + "project": "pytz" + }, + { + "download_count": 397671253, + "project": "awscli" + }, + { + "download_count": 392932234, + "project": "futures" + }, + { + "download_count": 375594752, + "project": "colorama" + }, + { + "download_count": 346035749, + "project": "simplejson" + }, + { + "download_count": 337185380, + "project": "boto3" + }, + { + "download_count": 305750769, + "project": "numpy" + }, + { + "download_count": 304101394, + "project": "wheel" + }, + { + "download_count": 264199809, + "project": "protobuf" + }, + { + "download_count": 244941990, + "project": "markupsafe" + }, + { + "download_count": 242351858, + "project": "cffi" + }, + { + "download_count": 214070466, + "project": "jinja2" + }, + { + "download_count": 212238740, + "project": "pyasn1-modules" + }, + { + "download_count": 210982876, + "project": "cryptography" + }, + { + "download_count": 190156825, + "project": "attrs" + }, + { + "download_count": 182755695, + "project": "cachetools" + }, + { + "download_count": 178075863, + "project": "google-api-core" + }, + { + "download_count": 177966855, + "project": "enum34" + }, + { + "download_count": 173568874, + "project": "click" + }, + { + "download_count": 168990924, + "project": "future" + }, + { + "download_count": 168313449, + "project": "google-auth" + }, + { + "download_count": 165064404, + "project": "pandas" + }, + { + "download_count": 161184509, + "project": "grpcio" + }, + { + "download_count": 153694077, + "project": "google-cloud-core" + }, + { + "download_count": 152780068, + "project": "pycparser" + }, + { + "download_count": 150391523, + "project": "googleapis-common-protos" + }, + { + "download_count": 145133278, + "project": "pyparsing" + }, + { + "download_count": 143193200, + "project": "werkzeug" + }, + { + "download_count": 136092386, + "project": "pytest" + }, + { + "download_count": 135106914, + "project": "decorator" + }, + { + "download_count": 128924918, + "project": "asn1crypto" + }, + { + "download_count": 126657878, + "project": "more-itertools" + }, + { + "download_count": 126309809, + "project": "awscli-cwlogs" + }, + { + "download_count": 120300118, + "project": "pluggy" + }, + { + "download_count": 117455899, + "project": "flask" + }, + { + "download_count": 116968652, + "project": "scipy" + }, + { + "download_count": 113639938, + "project": "itsdangerous" + }, + { + "download_count": 111213522, + "project": "oauthlib" + }, + { + "download_count": 106969182, + "project": "py" + }, + { + "download_count": 106245186, + "project": "coverage" + }, + { + "download_count": 104256236, + "project": "virtualenv" + }, + { + "download_count": 102765613, + "project": "requests-oauthlib" + }, + { + "download_count": 102590841, + "project": "psutil" + }, + { + "download_count": 102589154, + "project": "ipaddress" + }, + { + "download_count": 102291693, + "project": "jsonschema" + }, + { + "download_count": 100560003, + "project": "scikit-learn" + }, + { + "download_count": 99249602, + "project": "importlib-metadata" + }, + { + "download_count": 95618798, + "project": "pygments" + }, + { + "download_count": 94913658, + "project": "wcwidth" + }, + { + "download_count": 93958133, + "project": "zipp" + }, + { + "download_count": 93185870, + "project": "pyopenssl" + }, + { + "download_count": 92353815, + "project": "pyjwt" + }, + { + "download_count": 92018680, + "project": "mock" + }, + { + "download_count": 90635179, + "project": "wrapt" + }, + { + "download_count": 90150749, + "project": "google-cloud-storage" + }, + { + "download_count": 86097386, + "project": "pillow" + }, + { + "download_count": 85698334, + "project": "websocket-client" + }, + { + "download_count": 84842257, + "project": "packaging" + }, + { + "download_count": 84475934, + "project": "pbr" + }, + { + "download_count": 82019683, + "project": "ipython" + }, + { + "download_count": 81402313, + "project": "prompt-toolkit" + }, + { + "download_count": 80731622, + "project": "matplotlib" + }, + { + "download_count": 80443033, + "project": "httplib2" + }, + { + "download_count": 78391981, + "project": "boto" + }, + { + "download_count": 77428445, + "project": "lxml" + }, + { + "download_count": 76599773, + "project": "docker" + }, + { + "download_count": 75883487, + "project": "atomicwrites" + }, + { + "download_count": 73114976, + "project": "google-resumable-media" + }, + { + "download_count": 72286328, + "project": "sqlalchemy" + }, + { + "download_count": 71355694, + "project": "argparse" + }, + { + "download_count": 70247997, + "project": "kiwisolver" + }, + { + "download_count": 70157529, + "project": "mccabe" + }, + { + "download_count": 69616809, + "project": "configparser" + }, + { + "download_count": 68080016, + "project": "multidict" + }, + { + "download_count": 65738785, + "project": "tqdm" + }, + { + "download_count": 65716434, + "project": "tornado" + }, + { + "download_count": 65152549, + "project": "funcsigs" + }, + { + "download_count": 64373372, + "project": "beautifulsoup4" + }, + { + "download_count": 64241326, + "project": "paramiko" + }, + { + "download_count": 63570436, + "project": "psycopg2" + }, + { + "download_count": 63544025, + "project": "pyrsistent" + }, + { + "download_count": 63424037, + "project": "typing" + }, + { + "download_count": 62605787, + "project": "markdown" + }, + { + "download_count": 62535342, + "project": "google-api-python-client" + }, + { + "download_count": 61655343, + "project": "redis" + }, + { + "download_count": 61634970, + "project": "bcrypt" + }, + { + "download_count": 60696872, + "project": "pexpect" + }, + { + "download_count": 60144339, + "project": "pycodestyle" + }, + { + "download_count": 60125614, + "project": "absl-py" + }, + { + "download_count": 59496247, + "project": "ptyprocess" + }, + { + "download_count": 59137610, + "project": "aiohttp" + }, + { + "download_count": 59052497, + "project": "entrypoints" + }, + { + "download_count": 58282657, + "project": "oauth2client" + }, + { + "download_count": 57910701, + "project": "docopt" + }, + { + "download_count": 57238190, + "project": "pynacl" + }, + { + "download_count": 55087716, + "project": "traitlets" + }, + { + "download_count": 55005408, + "project": "tabulate" + }, + { + "download_count": 54655331, + "project": "backports-functools-lru-cache" + }, + { + "download_count": 54439203, + "project": "lazy-object-proxy" + }, + { + "download_count": 54278961, + "project": "dill" + }, + { + "download_count": 53875643, + "project": "ipython-genutils" + }, + { + "download_count": 53414364, + "project": "pathlib2" + }, + { + "download_count": 53208142, + "project": "isodate" + }, + { + "download_count": 52918821, + "project": "azure-common" + }, + { + "download_count": 52876560, + "project": "gunicorn" + }, + { + "download_count": 52367394, + "project": "uritemplate" + }, + { + "download_count": 52356165, + "project": "cycler" + }, + { + "download_count": 52009177, + "project": "defusedxml" + }, + { + "download_count": 51204829, + "project": "psycopg2-binary" + }, + { + "download_count": 51194283, + "project": "h5py" + }, + { + "download_count": 51011471, + "project": "termcolor" + }, + { + "download_count": 50365341, + "project": "pickleshare" + }, + { + "download_count": 50282815, + "project": "soupsieve" + }, + { + "download_count": 50184503, + "project": "pyflakes" + }, + { + "download_count": 49235593, + "project": "requests-toolbelt" + }, + { + "download_count": 48265870, + "project": "google-cloud-bigquery" + }, + { + "download_count": 47092132, + "project": "tensorboard" + }, + { + "download_count": 46785233, + "project": "typed-ast" + }, + { + "download_count": 46639206, + "project": "networkx" + }, + { + "download_count": 45991420, + "project": "webencodings" + }, + { + "download_count": 45685686, + "project": "async-timeout" + }, + { + "download_count": 45449338, + "project": "tensorflow" + }, + { + "download_count": 45435235, + "project": "gitpython" + }, + { + "download_count": 45275021, + "project": "pymongo" + }, + { + "download_count": 45205520, + "project": "azure-storage-blob" + }, + { + "download_count": 45085736, + "project": "flake8" + }, + { + "download_count": 44565799, + "project": "isort" + }, + { + "download_count": 44491717, + "project": "contextlib2" + }, + { + "download_count": 44308938, + "project": "scandir" + }, + { + "download_count": 44265261, + "project": "functools32" + }, + { + "download_count": 44039749, + "project": "gevent" + }, + { + "download_count": 42987880, + "project": "pytest-cov" + }, + { + "download_count": 42298933, + "project": "docker-pycreds" + }, + { + "download_count": 42280978, + "project": "joblib" + }, + { + "download_count": 42125807, + "project": "yarl" + }, + { + "download_count": 42105718, + "project": "grpc-google-iam-v1" + }, + { + "download_count": 42070985, + "project": "greenlet" + }, + { + "download_count": 41679952, + "project": "zope-interface" + }, + { + "download_count": 41396597, + "project": "pyzmq" + }, + { + "download_count": 41281740, + "project": "pymysql" + }, + { + "download_count": 41194733, + "project": "django" + }, + { + "download_count": 41174124, + "project": "datadog" + }, + { + "download_count": 41132868, + "project": "bleach" + }, + { + "download_count": 40599053, + "project": "astroid" + }, + { + "download_count": 40529351, + "project": "gitdb2" + }, + { + "download_count": 40342805, + "project": "pylint" + }, + { + "download_count": 40116789, + "project": "babel" + }, + { + "download_count": 39847400, + "project": "azure-storage-common" + }, + { + "download_count": 39689270, + "project": "keras-applications" + }, + { + "download_count": 39395842, + "project": "keras-preprocessing" + }, + { + "download_count": 39184540, + "project": "smmap2" + }, + { + "download_count": 38876199, + "project": "opencv-python" + }, + { + "download_count": 38852272, + "project": "subprocess32" + }, + { + "download_count": 38836392, + "project": "msrest" + }, + { + "download_count": 38732044, + "project": "google-auth-httplib2" + }, + { + "download_count": 38166504, + "project": "parso" + }, + { + "download_count": 37940669, + "project": "jedi" + }, + { + "download_count": 37805943, + "project": "pycryptodome" + }, + { + "download_count": 37739739, + "project": "astor" + }, + { + "download_count": 37110085, + "project": "gast" + }, + { + "download_count": 36881409, + "project": "retrying" + }, + { + "download_count": 35451582, + "project": "elasticsearch" + }, + { + "download_count": 35263938, + "project": "jsonpickle" + }, + { + "download_count": 34975483, + "project": "sqlparse" + }, + { + "download_count": 34879648, + "project": "pyarrow" + }, + { + "download_count": 34858569, + "project": "ordereddict" + }, + { + "download_count": 33824794, + "project": "scikit-image" + }, + { + "download_count": 33775490, + "project": "pycrypto" + }, + { + "download_count": 32742937, + "project": "appdirs" + }, + { + "download_count": 32689782, + "project": "toml" + }, + { + "download_count": 32684718, + "project": "adal" + }, + { + "download_count": 32591485, + "project": "azure-nspkg" + }, + { + "download_count": 32103427, + "project": "xlrd" + }, + { + "download_count": 32000159, + "project": "jupyter-core" + }, + { + "download_count": 31774601, + "project": "xmltodict" + }, + { + "download_count": 31736336, + "project": "toolz" + }, + { + "download_count": 31576642, + "project": "cached-property" + }, + { + "download_count": 31550164, + "project": "prometheus-client" + }, + { + "download_count": 31302562, + "project": "tensorflow-estimator" + }, + { + "download_count": 31010564, + "project": "py4j" + }, + { + "download_count": 30527374, + "project": "websockets" + }, + { + "download_count": 30383292, + "project": "dnspython" + }, + { + "download_count": 30245623, + "project": "nbformat" + }, + { + "download_count": 30162734, + "project": "monotonic" + }, + { + "download_count": 29978338, + "project": "nose" + }, + { + "download_count": 29531870, + "project": "typing-extensions" + }, + { + "download_count": 29443454, + "project": "sklearn" + }, + { + "download_count": 29064516, + "project": "cloudpickle" + }, + { + "download_count": 28794637, + "project": "pywavelets" + }, + { + "download_count": 28710649, + "project": "pycryptodomex" + }, + { + "download_count": 28533182, + "project": "ansible" + }, + { + "download_count": 28501824, + "project": "singledispatch" + }, + { + "download_count": 28281846, + "project": "ply" + }, + { + "download_count": 27973857, + "project": "cython" + }, + { + "download_count": 27913607, + "project": "mako" + }, + { + "download_count": 27864029, + "project": "selenium" + }, + { + "download_count": 27848508, + "project": "html5lib" + }, + { + "download_count": 27745677, + "project": "simplegeneric" + }, + { + "download_count": 27671952, + "project": "apache-beam" + }, + { + "download_count": 27579084, + "project": "backcall" + }, + { + "download_count": 26844011, + "project": "msgpack" + }, + { + "download_count": 26331607, + "project": "dask" + }, + { + "download_count": 26266166, + "project": "regex" + }, + { + "download_count": 26239282, + "project": "ipykernel" + }, + { + "download_count": 25952891, + "project": "ujson" + }, + { + "download_count": 25898723, + "project": "mistune" + }, + { + "download_count": 25796973, + "project": "backports-ssl-match-hostname" + }, + { + "download_count": 25756543, + "project": "amqp" + }, + { + "download_count": 25750485, + "project": "jupyter-client" + }, + { + "download_count": 25701706, + "project": "docker-compose" + }, + { + "download_count": 25315661, + "project": "kombu" + }, + { + "download_count": 25281035, + "project": "ruamel-yaml" + }, + { + "download_count": 25271754, + "project": "nltk" + }, + { + "download_count": 25075126, + "project": "alembic" + }, + { + "download_count": 24664889, + "project": "google-auth-oauthlib" + }, + { + "download_count": 24499399, + "project": "raven" + }, + { + "download_count": 24483899, + "project": "python-editor" + }, + { + "download_count": 24388318, + "project": "sortedcontainers" + }, + { + "download_count": 24375921, + "project": "nbconvert" + }, + { + "download_count": 24045975, + "project": "thrift" + }, + { + "download_count": 23835990, + "project": "notebook" + }, + { + "download_count": 23817589, + "project": "hdfs" + }, + { + "download_count": 23689627, + "project": "slackclient" + }, + { + "download_count": 23619686, + "project": "testpath" + }, + { + "download_count": 23536824, + "project": "s3fs" + }, + { + "download_count": 23476069, + "project": "keras" + }, + { + "download_count": 23364791, + "project": "celery" + }, + { + "download_count": 23339282, + "project": "discord-py" + }, + { + "download_count": 23232254, + "project": "billiard" + }, + { + "download_count": 23210897, + "project": "filelock" + }, + { + "download_count": 23187414, + "project": "snowballstemmer" + }, + { + "download_count": 23088875, + "project": "unidecode" + }, + { + "download_count": 23011985, + "project": "netaddr" + }, + { + "download_count": 22993463, + "project": "pandocfilters" + }, + { + "download_count": 22747435, + "project": "send2trash" + }, + { + "download_count": 22715519, + "project": "terminado" + }, + { + "download_count": 22431738, + "project": "backports-shutil-get-terminal-size" + }, + { + "download_count": 22409669, + "project": "backports-weakref" + }, + { + "download_count": 22231171, + "project": "msrestazure" + }, + { + "download_count": 21906531, + "project": "sentry-sdk" + }, + { + "download_count": 21817254, + "project": "ipywidgets" + }, + { + "download_count": 21711592, + "project": "tzlocal" + }, + { + "download_count": 21626474, + "project": "widgetsnbextension" + }, + { + "download_count": 21533795, + "project": "ijson" + }, + { + "download_count": 21335834, + "project": "mysqlclient" + }, + { + "download_count": 20939369, + "project": "tox" + }, + { + "download_count": 20733637, + "project": "lockfile" + }, + { + "download_count": 20642115, + "project": "xgboost" + }, + { + "download_count": 20630795, + "project": "arrow" + }, + { + "download_count": 20559416, + "project": "vine" + }, + { + "download_count": 20399386, + "project": "google-cloud-pubsub" + }, + { + "download_count": 20372136, + "project": "sphinx" + }, + { + "download_count": 20261684, + "project": "djangorestframework" + }, + { + "download_count": 20222772, + "project": "openpyxl" + }, + { + "download_count": 20101811, + "project": "ecdsa" + }, + { + "download_count": 20081473, + "project": "xlsxwriter" + }, + { + "download_count": 20021156, + "project": "snowflake-connector-python" + }, + { + "download_count": 19972964, + "project": "pyhamcrest" + }, + { + "download_count": 19806017, + "project": "google-cloud-firestore" + }, + { + "download_count": 19717486, + "project": "google-cloud-datastore" + }, + { + "download_count": 19580510, + "project": "google-pasta" + }, + { + "download_count": 19191080, + "project": "qtconsole" + }, + { + "download_count": 19179159, + "project": "bs4" + }, + { + "download_count": 19098496, + "project": "text-unidecode" + }, + { + "download_count": 19089305, + "project": "prettytable" + }, + { + "download_count": 19018504, + "project": "jdcal" + }, + { + "download_count": 19002384, + "project": "google-cloud-logging" + }, + { + "download_count": 18962785, + "project": "backports-abc" + }, + { + "download_count": 18918332, + "project": "jupyter-console" + }, + { + "download_count": 18706905, + "project": "smart-open" + }, + { + "download_count": 18670352, + "project": "alabaster" + }, + { + "download_count": 18664013, + "project": "pyspark" + }, + { + "download_count": 18533388, + "project": "jupyter" + }, + { + "download_count": 18480060, + "project": "statsmodels" + }, + { + "download_count": 18431746, + "project": "unicodecsv" + }, + { + "download_count": 18351262, + "project": "dockerpty" + }, + { + "download_count": 18303864, + "project": "shapely" + }, + { + "download_count": 18289269, + "project": "twisted" + }, + { + "download_count": 18288202, + "project": "hiredis" + }, + { + "download_count": 18166239, + "project": "virtualenv-clone" + }, + { + "download_count": 18139397, + "project": "imagesize" + }, + { + "download_count": 18056871, + "project": "idna-ssl" + }, + { + "download_count": 18052633, + "project": "fasteners" + }, + { + "download_count": 18027552, + "project": "marshmallow" + }, + { + "download_count": 18017517, + "project": "plotly" + }, + { + "download_count": 17675962, + "project": "pytest-forked" + }, + { + "download_count": 17577035, + "project": "texttable" + }, + { + "download_count": 17473671, + "project": "et-xmlfile" + }, + { + "download_count": 17113449, + "project": "kubernetes" + }, + { + "download_count": 17078526, + "project": "incremental" + }, + { + "download_count": 16916001, + "project": "iso8601" + }, + { + "download_count": 16883776, + "project": "applicationinsights" + }, + { + "download_count": 16840538, + "project": "google-cloud-bigtable" + }, + { + "download_count": 16823748, + "project": "pathlib" + }, + { + "download_count": 16759673, + "project": "constantly" + }, + { + "download_count": 16691118, + "project": "automat" + }, + { + "download_count": 16638971, + "project": "hyperlink" + }, + { + "download_count": 16463703, + "project": "azure-mgmt-resource" + }, + { + "download_count": 16410162, + "project": "croniter" + }, + { + "download_count": 16390810, + "project": "python-jose" + }, + { + "download_count": 16303498, + "project": "pipenv" + }, + { + "download_count": 15658966, + "project": "pathspec" + }, + { + "download_count": 15520321, + "project": "nvidia-ml-py3" + }, + { + "download_count": 15364508, + "project": "execnet" + }, + { + "download_count": 15314360, + "project": "aniso8601" + }, + { + "download_count": 15247809, + "project": "python-magic" + }, + { + "download_count": 15213240, + "project": "flask-cors" + }, + { + "download_count": 15203298, + "project": "inflection" + }, + { + "download_count": 15113541, + "project": "gym" + }, + { + "download_count": 14999608, + "project": "mypy" + }, + { + "download_count": 14927461, + "project": "azure-mgmt-storage" + }, + { + "download_count": 14835131, + "project": "flask-sqlalchemy" + }, + { + "download_count": 14822442, + "project": "service-identity" + }, + { + "download_count": 14807088, + "project": "mozrunner" + }, + { + "download_count": 14682178, + "project": "argcomplete" + }, + { + "download_count": 14637155, + "project": "faker" + }, + { + "download_count": 14609350, + "project": "uvloop" + }, + { + "download_count": 14582824, + "project": "apipkg" + }, + { + "download_count": 14479520, + "project": "stevedore" + }, + { + "download_count": 14469933, + "project": "azure-storage-nspkg" + }, + { + "download_count": 14356576, + "project": "ndg-httpsclient" + }, + { + "download_count": 14226382, + "project": "pyserial" + }, + { + "download_count": 14190037, + "project": "seaborn" + }, + { + "download_count": 14151070, + "project": "distro" + }, + { + "download_count": 14141290, + "project": "pytest-timeout" + }, + { + "download_count": 14122087, + "project": "bz2file" + }, + { + "download_count": 14098838, + "project": "patsy" + }, + { + "download_count": 14036101, + "project": "cssselect" + }, + { + "download_count": 13956987, + "project": "tenacity" + }, + { + "download_count": 13927328, + "project": "tensorflow-metadata" + }, + { + "download_count": 13870715, + "project": "graphviz" + }, + { + "download_count": 13850391, + "project": "pydot" + }, + { + "download_count": 13813387, + "project": "azure-mgmt-nspkg" + }, + { + "download_count": 13809809, + "project": "avro" + }, + { + "download_count": 13771055, + "project": "imageio" + }, + { + "download_count": 13764392, + "project": "fastavro" + }, + { + "download_count": 13686467, + "project": "gensim" + }, + { + "download_count": 13643493, + "project": "trueskill" + }, + { + "download_count": 13548711, + "project": "statsd" + }, + { + "download_count": 13505330, + "project": "pytest-xdist" + }, + { + "download_count": 13453212, + "project": "azure-mgmt-containerregistry" + }, + { + "download_count": 13380441, + "project": "mypy-extensions" + }, + { + "download_count": 13340370, + "project": "azure-mgmt-keyvault" + }, + { + "download_count": 13259227, + "project": "ua-parser" + }, + { + "download_count": 13241753, + "project": "configobj" + }, + { + "download_count": 13193523, + "project": "mozlog" + }, + { + "download_count": 13161090, + "project": "fuzzywuzzy" + }, + { + "download_count": 13153967, + "project": "google-gax" + }, + { + "download_count": 12999681, + "project": "responses" + }, + { + "download_count": 12946906, + "project": "aliyun-python-sdk-core" + }, + { + "download_count": 12863346, + "project": "azure-datalake-store" + }, + { + "download_count": 12839810, + "project": "pytest-mock" + }, + { + "download_count": 12835022, + "project": "aliyun-python-sdk-ecs" + }, + { + "download_count": 12816025, + "project": "elasticsearch-dsl" + }, + { + "download_count": 12792645, + "project": "azure-mgmt-authorization" + }, + { + "download_count": 12780433, + "project": "google-apitools" + }, + { + "download_count": 12772525, + "project": "python-daemon" + }, + { + "download_count": 12766382, + "project": "azure-graphrbac" + }, + { + "download_count": 12561149, + "project": "netifaces" + }, + { + "download_count": 12538305, + "project": "s3cmd" + }, + { + "download_count": 12534903, + "project": "python-json-logger" + }, + { + "download_count": 12484719, + "project": "aliyunsdkcore" + }, + { + "download_count": 12406280, + "project": "manhole" + }, + { + "download_count": 12261609, + "project": "hvac" + }, + { + "download_count": 12253367, + "project": "humanfriendly" + }, + { + "download_count": 12246930, + "project": "ipdb" + }, + { + "download_count": 12209179, + "project": "deepdiff" + }, + { + "download_count": 12207990, + "project": "freezegun" + }, + { + "download_count": 12098216, + "project": "maxminddb" + }, + { + "download_count": 12042231, + "project": "uwsgi" + }, + { + "download_count": 11947362, + "project": "pykube" + }, + { + "download_count": 11860617, + "project": "appnope" + }, + { + "download_count": 11805813, + "project": "databricks-cli" + }, + { + "download_count": 11788737, + "project": "python-levenshtein" + }, + { + "download_count": 11778504, + "project": "tensorflow-transform" + }, + { + "download_count": 11612558, + "project": "tldextract" + }, + { + "download_count": 11569388, + "project": "pyodbc" + }, + { + "download_count": 11561349, + "project": "autopep8" + }, + { + "download_count": 11432600, + "project": "pendulum" + }, + { + "download_count": 11383453, + "project": "newrelic" + }, + { + "download_count": 11361327, + "project": "python-dotenv" + }, + { + "download_count": 11334209, + "project": "pytzdata" + }, + { + "download_count": 11270038, + "project": "wtforms" + }, + { + "download_count": 11224152, + "project": "pytest-runner" + }, + { + "download_count": 11104163, + "project": "libtmux" + }, + { + "download_count": 11089587, + "project": "zope-deprecation" + }, + { + "download_count": 11017907, + "project": "jsonpointer" + }, + { + "download_count": 10994575, + "project": "webob" + }, + { + "download_count": 10990219, + "project": "retry" + }, + { + "download_count": 10987260, + "project": "blinker" + }, + { + "download_count": 10973921, + "project": "semantic-version" + }, + { + "download_count": 10843556, + "project": "requests-file" + }, + { + "download_count": 10781388, + "project": "graphql-core" + }, + { + "download_count": 10728518, + "project": "blessings" + }, + { + "download_count": 10716974, + "project": "backoff" + }, + { + "download_count": 10695298, + "project": "black" + }, + { + "download_count": 10686016, + "project": "geopy" + }, + { + "download_count": 10629161, + "project": "google-cloud" + }, + { + "download_count": 10551343, + "project": "bottle" + }, + { + "download_count": 10527245, + "project": "pep8" + }, + { + "download_count": 10511519, + "project": "geoip2" + }, + { + "download_count": 10451332, + "project": "grpcio-tools" + }, + { + "download_count": 10410102, + "project": "traceback2" + }, + { + "download_count": 10386312, + "project": "linecache2" + }, + { + "download_count": 10351287, + "project": "django-extensions" + }, + { + "download_count": 10318239, + "project": "sphinxcontrib-websupport" + }, + { + "download_count": 10239847, + "project": "unittest2" + }, + { + "download_count": 10187032, + "project": "fsspec" + }, + { + "download_count": 10146539, + "project": "django-cors-headers" + }, + { + "download_count": 10119472, + "project": "pkginfo" + }, + { + "download_count": 10077843, + "project": "django-filter" + }, + { + "download_count": 10057055, + "project": "secretstorage" + }, + { + "download_count": 10050204, + "project": "user-agents" + }, + { + "download_count": 10001744, + "project": "configargparse" + }, + { + "download_count": 9957349, + "project": "scp" + }, + { + "download_count": 9942530, + "project": "azure-devops" + }, + { + "download_count": 9938936, + "project": "azure-mgmt-compute" + }, + { + "download_count": 9934159, + "project": "azure-mgmt-network" + }, + { + "download_count": 9904711, + "project": "msgpack-python" + }, + { + "download_count": 9827614, + "project": "azure-mgmt-datalake-nspkg" + }, + { + "download_count": 9735081, + "project": "azure-mgmt-datalake-store" + }, + { + "download_count": 9706197, + "project": "google-cloud-monitoring" + }, + { + "download_count": 9674967, + "project": "mpi4py" + }, + { + "download_count": 9609045, + "project": "mozdevice" + }, + { + "download_count": 9561083, + "project": "azure-keyvault" + }, + { + "download_count": 9523786, + "project": "pysocks" + }, + { + "download_count": 9521848, + "project": "azure-cli" + }, + { + "download_count": 9493349, + "project": "jsondiff" + }, + { + "download_count": 9467938, + "project": "cherrypy" + }, + { + "download_count": 9467625, + "project": "pika" + }, + { + "download_count": 9410911, + "project": "parsedatetime" + }, + { + "download_count": 9399772, + "project": "azure-mgmt-batch" + }, + { + "download_count": 9376391, + "project": "lightgbm" + }, + { + "download_count": 9375734, + "project": "querystring-parser" + }, + { + "download_count": 9342152, + "project": "pyrfc3339" + }, + { + "download_count": 9319192, + "project": "argh" + }, + { + "download_count": 9315946, + "project": "pyproj" + }, + { + "download_count": 9307163, + "project": "mozprofile" + }, + { + "download_count": 9301729, + "project": "pycurl" + }, + { + "download_count": 9288555, + "project": "dictdiffer" + }, + { + "download_count": 9274785, + "project": "flask-wtf" + }, + { + "download_count": 9274704, + "project": "mysql-connector-python" + }, + { + "download_count": 9272854, + "project": "cheroot" + }, + { + "download_count": 9261620, + "project": "codecov" + }, + { + "download_count": 9224842, + "project": "mozinfo" + }, + { + "download_count": 9222371, + "project": "jsonpatch" + }, + { + "download_count": 9217176, + "project": "glob2" + }, + { + "download_count": 9059754, + "project": "azure-batch" + }, + { + "download_count": 9057979, + "project": "crcmod" + }, + { + "download_count": 9033939, + "project": "jaraco-functools" + }, + { + "download_count": 8995380, + "project": "tempora" + }, + { + "download_count": 8959399, + "project": "azure-mgmt-dns" + }, + { + "download_count": 8945640, + "project": "pyhive" + }, + { + "download_count": 8906609, + "project": "azure-mgmt-rdbms" + }, + { + "download_count": 8891960, + "project": "azure-mgmt-sql" + }, + { + "download_count": 8888437, + "project": "mozprocess" + }, + { + "download_count": 8874708, + "project": "portend" + }, + { + "download_count": 8853246, + "project": "geographiclib" + }, + { + "download_count": 8803957, + "project": "azure-mgmt-web" + }, + { + "download_count": 8753999, + "project": "deprecated" + }, + { + "download_count": 8739361, + "project": "munch" + }, + { + "download_count": 8687617, + "project": "jpype1" + }, + { + "download_count": 8659485, + "project": "pysftp" + }, + { + "download_count": 8648248, + "project": "watchdog" + }, + { + "download_count": 8644057, + "project": "ruamel-yaml-clib" + }, + { + "download_count": 8628293, + "project": "mlflow" + }, + { + "download_count": 8605163, + "project": "kafka-python" + }, + { + "download_count": 8593398, + "project": "google" + }, + { + "download_count": 8591157, + "project": "gapic-google-cloud-logging-v2" + }, + { + "download_count": 8565550, + "project": "mujoco-py" + }, + { + "download_count": 8557624, + "project": "zeep" + }, + { + "download_count": 8557527, + "project": "proto-google-cloud-logging-v2" + }, + { + "download_count": 8555221, + "project": "azure-storage" + }, + { + "download_count": 8548889, + "project": "pathtools" + }, + { + "download_count": 8547554, + "project": "django-storages" + }, + { + "download_count": 8493425, + "project": "spacy" + }, + { + "download_count": 8479997, + "project": "pytest-instafail" + }, + { + "download_count": 8476835, + "project": "thinc" + }, + { + "download_count": 8468171, + "project": "factory-boy" + }, + { + "download_count": 8466351, + "project": "preshed" + }, + { + "download_count": 8433752, + "project": "google-cloud-spanner" + }, + { + "download_count": 8433718, + "project": "simpleflock" + }, + { + "download_count": 8402292, + "project": "cymem" + }, + { + "download_count": 8374248, + "project": "azure-storage-queue" + }, + { + "download_count": 8367380, + "project": "azure-mgmt-monitor" + }, + { + "download_count": 8361234, + "project": "murmurhash" + }, + { + "download_count": 8360473, + "project": "jeepney" + }, + { + "download_count": 8358801, + "project": "azure-mgmt-containerservice" + }, + { + "download_count": 8334989, + "project": "zc-lockfile" + }, + { + "download_count": 8334854, + "project": "numpy-stl" + }, + { + "download_count": 8334779, + "project": "requests-mock" + }, + { + "download_count": 8331547, + "project": "tensorflow-serving-api" + }, + { + "download_count": 8316359, + "project": "passlib" + }, + { + "download_count": 8257864, + "project": "aws-xray-sdk" + }, + { + "download_count": 8253117, + "project": "waitress" + }, + { + "download_count": 8213115, + "project": "azure-mgmt-containerinstance" + }, + { + "download_count": 8194190, + "project": "oauth" + }, + { + "download_count": 8192420, + "project": "azure-mgmt-redis" + }, + { + "download_count": 8182626, + "project": "azure-mgmt-cognitiveservices" + }, + { + "download_count": 8169888, + "project": "fabric" + }, + { + "download_count": 8160603, + "project": "sphinx-rtd-theme" + }, + { + "download_count": 8151766, + "project": "azure-mgmt-trafficmanager" + }, + { + "download_count": 8146427, + "project": "pystache" + }, + { + "download_count": 8142774, + "project": "python-slugify" + }, + { + "download_count": 8104254, + "project": "azure-mgmt-devtestlabs" + }, + { + "download_count": 8101969, + "project": "sh" + }, + { + "download_count": 8100079, + "project": "azure-mgmt-cdn" + }, + { + "download_count": 8084499, + "project": "azure-mgmt-datalake-analytics" + }, + { + "download_count": 8068973, + "project": "pyaml" + }, + { + "download_count": 8068659, + "project": "azure-mgmt-iothub" + }, + { + "download_count": 8045085, + "project": "azure-mgmt-cosmosdb" + }, + { + "download_count": 8043637, + "project": "jira" + }, + { + "download_count": 8016426, + "project": "mozterm" + }, + { + "download_count": 8000597, + "project": "flask-login" + }, + { + "download_count": 7983143, + "project": "pycairo" + }, + { + "download_count": 7981647, + "project": "invoke" + }, + { + "download_count": 7969857, + "project": "pyxdg" + }, + { + "download_count": 7896477, + "project": "flask-restful" + }, + { + "download_count": 7892342, + "project": "pymssql" + }, + { + "download_count": 7872871, + "project": "plac" + }, + { + "download_count": 7871712, + "project": "colorlog" + }, + { + "download_count": 7841110, + "project": "stripe" + }, + { + "download_count": 7795667, + "project": "pygobject" + }, + { + "download_count": 7793570, + "project": "vsts" + }, + { + "download_count": 7786931, + "project": "azure-mgmt-applicationinsights" + }, + { + "download_count": 7755436, + "project": "azure-cosmosdb-table" + }, + { + "download_count": 7751414, + "project": "zope-event" + }, + { + "download_count": 7745717, + "project": "gspread" + }, + { + "download_count": 7724172, + "project": "phonenumbers" + }, + { + "download_count": 7698105, + "project": "torch" + }, + { + "download_count": 7677484, + "project": "django-debug-toolbar" + }, + { + "download_count": 7669014, + "project": "azure-mgmt-eventhub" + }, + { + "download_count": 7653695, + "project": "sendgrid" + }, + { + "download_count": 7621120, + "project": "azure-core" + }, + { + "download_count": 7618409, + "project": "requests-aws4auth" + }, + { + "download_count": 7606270, + "project": "zope-component" + }, + { + "download_count": 7602809, + "project": "azure-mgmt-marketplaceordering" + }, + { + "download_count": 7589910, + "project": "holidays" + }, + { + "download_count": 7568947, + "project": "azure-cosmosdb-nspkg" + }, + { + "download_count": 7560913, + "project": "azure-mgmt-servicebus" + }, + { + "download_count": 7555791, + "project": "azure-mgmt-loganalytics" + }, + { + "download_count": 7533328, + "project": "azure-mgmt-recoveryservices" + }, + { + "download_count": 7532133, + "project": "azure-mgmt-recoveryservicesbackup" + }, + { + "download_count": 7519987, + "project": "azure-mgmt-eventgrid" + }, + { + "download_count": 7511851, + "project": "simple-salesforce" + }, + { + "download_count": 7493612, + "project": "azure-mgmt-reservations" + }, + { + "download_count": 7490404, + "project": "mysql-python" + }, + { + "download_count": 7471849, + "project": "azure-mgmt-advisor" + }, + { + "download_count": 7470909, + "project": "azure-mgmt-media" + }, + { + "download_count": 7461600, + "project": "backports-tempfile" + }, + { + "download_count": 7452831, + "project": "azure-mgmt-msi" + }, + { + "download_count": 7444403, + "project": "azure-mgmt-batchai" + }, + { + "download_count": 7443190, + "project": "azure-mgmt-iothubprovisioningservices" + }, + { + "download_count": 7427082, + "project": "azure-mgmt-search" + }, + { + "download_count": 7426073, + "project": "azure-mgmt-consumption" + }, + { + "download_count": 7421118, + "project": "azure-mgmt-servicefabric" + }, + { + "download_count": 7420661, + "project": "azure-mgmt-billing" + }, + { + "download_count": 7410977, + "project": "semver" + }, + { + "download_count": 7399599, + "project": "w3lib" + }, + { + "download_count": 7377445, + "project": "supervisor" + }, + { + "download_count": 7371140, + "project": "moto" + }, + { + "download_count": 7360517, + "project": "josepy" + }, + { + "download_count": 7359916, + "project": "azure-mgmt-relay" + }, + { + "download_count": 7325634, + "project": "pandas-gbq" + }, + { + "download_count": 7317868, + "project": "acme" + }, + { + "download_count": 7308144, + "project": "azure-servicebus" + }, + { + "download_count": 7271321, + "project": "xlwt" + }, + { + "download_count": 7270699, + "project": "structlog" + }, + { + "download_count": 7268987, + "project": "sphinxcontrib-serializinghtml" + }, + { + "download_count": 7268175, + "project": "sphinxcontrib-htmlhelp" + }, + { + "download_count": 7251725, + "project": "keyring" + }, + { + "download_count": 7251674, + "project": "sphinxcontrib-qthelp" + }, + { + "download_count": 7251256, + "project": "sphinxcontrib-devhelp" + }, + { + "download_count": 7251076, + "project": "sphinxcontrib-applehelp" + }, + { + "download_count": 7250627, + "project": "sphinxcontrib-jsmath" + }, + { + "download_count": 7239285, + "project": "pytest-django" + }, + { + "download_count": 7236146, + "project": "voluptuous" + }, + { + "download_count": 7235602, + "project": "llvmlite" + }, + { + "download_count": 7112734, + "project": "theano" + }, + { + "download_count": 7042677, + "project": "numba" + }, + { + "download_count": 7038235, + "project": "shellingham" + }, + { + "download_count": 7023740, + "project": "pydocumentdb" + }, + { + "download_count": 7014759, + "project": "parse" + }, + { + "download_count": 7011858, + "project": "coloredlogs" + }, + { + "download_count": 6991011, + "project": "certbot" + }, + { + "download_count": 6989202, + "project": "google-cloud-vision" + }, + { + "download_count": 6983443, + "project": "influxdb" + }, + { + "download_count": 6981795, + "project": "azure-mgmt-managementgroups" + }, + { + "download_count": 6962527, + "project": "azure-mgmt-datamigration" + }, + { + "download_count": 6935874, + "project": "cheetah" + }, + { + "download_count": 6931267, + "project": "azure-mgmt-policyinsights" + }, + { + "download_count": 6910342, + "project": "python-augeas" + }, + { + "download_count": 6902895, + "project": "tblib" + }, + { + "download_count": 6885492, + "project": "azure-mgmt-iotcentral" + }, + { + "download_count": 6882533, + "project": "azure-mgmt-signalr" + }, + { + "download_count": 6879787, + "project": "instana" + }, + { + "download_count": 6848658, + "project": "uptime" + }, + { + "download_count": 6823328, + "project": "azure-mgmt-maps" + }, + { + "download_count": 6811121, + "project": "coreapi" + }, + { + "download_count": 6805884, + "project": "setproctitle" + }, + { + "download_count": 6803339, + "project": "pymemcache" + }, + { + "download_count": 6790921, + "project": "opt-einsum" + }, + { + "download_count": 6746204, + "project": "coreschema" + }, + { + "download_count": 6733204, + "project": "dicttoxml" + }, + { + "download_count": 6709540, + "project": "python-mimeparse" + }, + { + "download_count": 6686487, + "project": "letsencrypt" + }, + { + "download_count": 6671209, + "project": "pypdf2" + }, + { + "download_count": 6659143, + "project": "certbot-apache" + }, + { + "download_count": 6650051, + "project": "feedparser" + }, + { + "download_count": 6629341, + "project": "itypes" + }, + { + "download_count": 6607528, + "project": "datetime" + }, + { + "download_count": 6595896, + "project": "pyglet" + }, + { + "download_count": 6565703, + "project": "pywin32" + }, + { + "download_count": 6555587, + "project": "cachecontrol" + }, + { + "download_count": 6537738, + "project": "whichcraft" + }, + { + "download_count": 6493687, + "project": "repoze-lru" + }, + { + "download_count": 6483589, + "project": "opentracing" + }, + { + "download_count": 6471332, + "project": "yapf" + }, + { + "download_count": 6470521, + "project": "reportlab" + }, + { + "download_count": 6454108, + "project": "pyperclip" + }, + { + "download_count": 6427226, + "project": "sasl" + }, + { + "download_count": 6416154, + "project": "pydocstyle" + }, + { + "download_count": 6412179, + "project": "ldap3" + }, + { + "download_count": 6364528, + "project": "python-http-client" + }, + { + "download_count": 6363103, + "project": "pycountry" + }, + { + "download_count": 6348755, + "project": "azure-servicemanagement-legacy" + }, + { + "download_count": 6348419, + "project": "certbot-nginx" + }, + { + "download_count": 6347386, + "project": "python-gnupg" + }, + { + "download_count": 6338642, + "project": "suds-jurko" + }, + { + "download_count": 6325028, + "project": "promise" + }, + { + "download_count": 6321828, + "project": "twine" + }, + { + "download_count": 6310843, + "project": "django-redis" + }, + { + "download_count": 6310630, + "project": "redis-py-cluster" + }, + { + "download_count": 6301931, + "project": "mysql-connector" + }, + { + "download_count": 6295377, + "project": "python-jenkins" + }, + { + "download_count": 6275920, + "project": "azure-servicefabric" + }, + { + "download_count": 6251258, + "project": "expiringdict" + }, + { + "download_count": 6237744, + "project": "pyvcf" + }, + { + "download_count": 6217846, + "project": "watchtower" + }, + { + "download_count": 6191358, + "project": "poyo" + }, + { + "download_count": 6177944, + "project": "html2text" + }, + { + "download_count": 6167605, + "project": "binaryornot" + }, + { + "download_count": 6156388, + "project": "azure-mgmt" + }, + { + "download_count": 6141630, + "project": "bokeh" + }, + { + "download_count": 6124335, + "project": "python3-openid" + }, + { + "download_count": 6124110, + "project": "azure-storage-file" + }, + { + "download_count": 6123086, + "project": "oscrypto" + }, + { + "download_count": 6089609, + "project": "kazoo" + }, + { + "download_count": 6087309, + "project": "cookiecutter" + }, + { + "download_count": 6069231, + "project": "jinja2-time" + }, + { + "download_count": 6060397, + "project": "azure" + }, + { + "download_count": 6048114, + "project": "google-cloud-translate" + }, + { + "download_count": 6041366, + "project": "humanize" + }, + { + "download_count": 6039221, + "project": "numexpr" + }, + { + "download_count": 6020894, + "project": "twilio" + }, + { + "download_count": 6012401, + "project": "cerberus" + }, + { + "download_count": 6012147, + "project": "azure-mgmt-logic" + }, + { + "download_count": 6006198, + "project": "google-cloud-language" + }, + { + "download_count": 6003966, + "project": "nodeenv" + }, + { + "download_count": 5973514, + "project": "azure-mgmt-scheduler" + }, + { + "download_count": 5943411, + "project": "backports-csv" + }, + { + "download_count": 5918171, + "project": "multi-key-dict" + }, + { + "download_count": 5880962, + "project": "python-memcached" + }, + { + "download_count": 5873333, + "project": "srsly" + }, + { + "download_count": 5867465, + "project": "cx-oracle" + }, + { + "download_count": 5859924, + "project": "blis" + }, + { + "download_count": 5855262, + "project": "azure-mgmt-datafactory" + }, + { + "download_count": 5829317, + "project": "identify" + }, + { + "download_count": 5817248, + "project": "pydata-google-auth" + }, + { + "download_count": 5816751, + "project": "parsel" + }, + { + "download_count": 5808925, + "project": "setuptools-scm" + }, + { + "download_count": 5798570, + "project": "confluent-kafka" + }, + { + "download_count": 5780362, + "project": "lunardate" + }, + { + "download_count": 5770962, + "project": "eventlet" + }, + { + "download_count": 5764369, + "project": "webtest" + }, + { + "download_count": 5762114, + "project": "sqlalchemy-utils" + }, + { + "download_count": 5748385, + "project": "pre-commit" + }, + { + "download_count": 5744591, + "project": "flask-restplus" + }, + { + "download_count": 5741800, + "project": "google-cloud-error-reporting" + }, + { + "download_count": 5727692, + "project": "gapic-google-cloud-datastore-v1" + }, + { + "download_count": 5726258, + "project": "google-cloud-speech" + }, + { + "download_count": 5696390, + "project": "tensorflow-gpu" + }, + { + "download_count": 5671626, + "project": "youtube-dl" + }, + { + "download_count": 5669862, + "project": "zope-proxy" + }, + { + "download_count": 5668657, + "project": "zope-hookable" + }, + { + "download_count": 5666674, + "project": "aspy-yaml" + }, + { + "download_count": 5665846, + "project": "pystan" + }, + { + "download_count": 5658876, + "project": "meld3" + }, + { + "download_count": 5657136, + "project": "zope-deferredimport" + }, + { + "download_count": 5646525, + "project": "altgraph" + }, + { + "download_count": 5638012, + "project": "yamllint" + }, + { + "download_count": 5627465, + "project": "pydispatcher" + }, + { + "download_count": 5598597, + "project": "pytest-html" + }, + { + "download_count": 5589472, + "project": "queuelib" + }, + { + "download_count": 5580580, + "project": "mpmath" + }, + { + "download_count": 5556096, + "project": "wasabi" + }, + { + "download_count": 5538810, + "project": "dateparser" + }, + { + "download_count": 5522745, + "project": "azure-mgmt-subscription" + }, + { + "download_count": 5500243, + "project": "flask-migrate" + }, + { + "download_count": 5494861, + "project": "cfgv" + }, + { + "download_count": 5490908, + "project": "azure-mgmt-notificationhubs" + }, + { + "download_count": 5479229, + "project": "azure-mgmt-managementpartner" + }, + { + "download_count": 5477766, + "project": "azure-mgmt-powerbiembedded" + }, + { + "download_count": 5471458, + "project": "azure-eventgrid" + }, + { + "download_count": 5469115, + "project": "azure-mgmt-commerce" + }, + { + "download_count": 5465959, + "project": "azure-mgmt-machinelearningcompute" + }, + { + "download_count": 5462201, + "project": "readme-renderer" + }, + { + "download_count": 5461957, + "project": "azure-mgmt-hanaonazure" + }, + { + "download_count": 5447652, + "project": "rfc3986" + }, + { + "download_count": 5440586, + "project": "scrapy" + }, + { + "download_count": 5434695, + "project": "aenum" + }, + { + "download_count": 5420091, + "project": "anyjson" + }, + { + "download_count": 5407106, + "project": "proto-google-cloud-datastore-v1" + }, + { + "download_count": 5387258, + "project": "sympy" + }, + { + "download_count": 5374203, + "project": "pygithub" + }, + { + "download_count": 5373585, + "project": "pytest-metadata" + }, + { + "download_count": 5340852, + "project": "paho-mqtt" + }, + { + "download_count": 5335035, + "project": "multiprocess" + }, + { + "download_count": 5333251, + "project": "googledatastore" + }, + { + "download_count": 5328607, + "project": "phoenixdb" + }, + { + "download_count": 5322559, + "project": "nose-exclude" + }, + { + "download_count": 5309246, + "project": "importlib-resources" + }, + { + "download_count": 5299450, + "project": "cookies" + }, + { + "download_count": 5277019, + "project": "tensorflow-tensorboard" + }, + { + "download_count": 5255084, + "project": "thrift-sasl" + }, + { + "download_count": 5249244, + "project": "jsonpath-rw" + }, + { + "download_count": 5245636, + "project": "oslo-i18n" + }, + { + "download_count": 5245466, + "project": "s2sphere" + }, + { + "download_count": 5245010, + "project": "whitenoise" + }, + { + "download_count": 5236181, + "project": "google-cloud-dns" + }, + { + "download_count": 5223390, + "project": "aws-sam-translator" + }, + { + "download_count": 5213027, + "project": "slacker" + }, + { + "download_count": 5165706, + "project": "hypothesis" + }, + { + "download_count": 5155283, + "project": "google-cloud-resource-manager" + }, + { + "download_count": 5152438, + "project": "debtcollector" + }, + { + "download_count": 5141790, + "project": "ruamel-ordereddict" + }, + { + "download_count": 5136659, + "project": "azure-loganalytics" + }, + { + "download_count": 5089358, + "project": "rx" + }, + { + "download_count": 5083806, + "project": "discord" + }, + { + "download_count": 5082337, + "project": "click-plugins" + }, + { + "download_count": 5069136, + "project": "google-cloud-videointelligence" + }, + { + "download_count": 5067821, + "project": "google-cloud-runtimeconfig" + }, + { + "download_count": 5043933, + "project": "inflect" + }, + { + "download_count": 5006490, + "project": "pulp" + }, + { + "download_count": 5001567, + "project": "oslo-utils" + }, + { + "download_count": 4965630, + "project": "azure-mgmt-devspaces" + }, + { + "download_count": 4949806, + "project": "stringcase" + }, + { + "download_count": 4926195, + "project": "django-appconf" + }, + { + "download_count": 4913373, + "project": "pynamodb" + }, + { + "download_count": 4913090, + "project": "dogpile-cache" + }, + { + "download_count": 4899768, + "project": "python-consul" + }, + { + "download_count": 4896198, + "project": "milksnake" + }, + { + "download_count": 4875874, + "project": "pypng" + }, + { + "download_count": 4868256, + "project": "oslo-config" + }, + { + "download_count": 4857940, + "project": "haversine" + }, + { + "download_count": 4854545, + "project": "azure-applicationinsights" + }, + { + "download_count": 4830085, + "project": "flower" + }, + { + "download_count": 4787508, + "project": "bandit" + }, + { + "download_count": 4766743, + "project": "strict-rfc3339" + }, + { + "download_count": 4744246, + "project": "findspark" + }, + { + "download_count": 4742234, + "project": "flask-admin" + }, + { + "download_count": 4742026, + "project": "qds-sdk" + }, + { + "download_count": 4735803, + "project": "pip-tools" + }, + { + "download_count": 4701984, + "project": "cliff" + }, + { + "download_count": 4701803, + "project": "ddtrace" + }, + { + "download_count": 4693878, + "project": "progressbar2" + }, + { + "download_count": 4652633, + "project": "python-utils" + }, + { + "download_count": 4645712, + "project": "cairocffi" + }, + { + "download_count": 4645547, + "project": "google-cloud-trace" + }, + { + "download_count": 4636704, + "project": "docker-py" + }, + { + "download_count": 4632853, + "project": "tinycss2" + }, + { + "download_count": 4627762, + "project": "apscheduler" + }, + { + "download_count": 4606642, + "project": "python-pam" + }, + { + "download_count": 4606137, + "project": "grpcio-gcp" + }, + { + "download_count": 4605186, + "project": "parse-type" + }, + { + "download_count": 4601072, + "project": "parameterized" + }, + { + "download_count": 4600206, + "project": "avro-python3" + }, + { + "download_count": 4589906, + "project": "pypiwin32" + }, + { + "download_count": 4587705, + "project": "olefile" + }, + { + "download_count": 4586230, + "project": "testtools" + }, + { + "download_count": 4583482, + "project": "dj-database-url" + }, + { + "download_count": 4572193, + "project": "basictracer" + }, + { + "download_count": 4567533, + "project": "macholib" + }, + { + "download_count": 4563623, + "project": "cligj" + }, + { + "download_count": 4560977, + "project": "google-cloud-container" + }, + { + "download_count": 4553683, + "project": "oslo-serialization" + }, + { + "download_count": 4544031, + "project": "logging" + }, + { + "download_count": 4543347, + "project": "click-completion" + }, + { + "download_count": 4542581, + "project": "pycares" + }, + { + "download_count": 4461143, + "project": "fiona" + }, + { + "download_count": 4454845, + "project": "mmh3" + }, + { + "download_count": 4447608, + "project": "jws" + }, + { + "download_count": 4433310, + "project": "python-docx" + }, + { + "download_count": 4432803, + "project": "mleap" + }, + { + "download_count": 4430881, + "project": "extras" + }, + { + "download_count": 4394588, + "project": "dataclasses" + }, + { + "download_count": 4384805, + "project": "fixtures" + }, + { + "download_count": 4368983, + "project": "cfn-lint" + }, + { + "download_count": 4347507, + "project": "cairosvg" + }, + { + "download_count": 4345671, + "project": "lz4" + }, + { + "download_count": 4341286, + "project": "flask-script" + }, + { + "download_count": 4335840, + "project": "statistics" + }, + { + "download_count": 4332342, + "project": "fbprophet" + }, + { + "download_count": 4329185, + "project": "cmd2" + }, + { + "download_count": 4323965, + "project": "brotli" + }, + { + "download_count": 4323647, + "project": "cytoolz" + }, + { + "download_count": 4315817, + "project": "polyaxon-client" + }, + { + "download_count": 4309639, + "project": "portalocker" + }, + { + "download_count": 4302427, + "project": "torchvision" + }, + { + "download_count": 4299923, + "project": "bumpversion" + }, + { + "download_count": 4291946, + "project": "python-jwt" + }, + { + "download_count": 4264873, + "project": "polyaxon-cli" + }, + { + "download_count": 4263296, + "project": "polyaxon-deploy" + }, + { + "download_count": 4260496, + "project": "coveralls" + }, + { + "download_count": 4256821, + "project": "python-geohash" + }, + { + "download_count": 4247442, + "project": "flask-caching" + }, + { + "download_count": 4223430, + "project": "cssselect2" + }, + { + "download_count": 4217166, + "project": "behave" + }, + { + "download_count": 4198998, + "project": "mozfile" + }, + { + "download_count": 4198846, + "project": "ddt" + }, + { + "download_count": 4192314, + "project": "aiodns" + }, + { + "download_count": 4180658, + "project": "googleads" + }, + { + "download_count": 4151629, + "project": "flake8-polyfill" + }, + { + "download_count": 4142826, + "project": "pyphen" + }, + { + "download_count": 4130090, + "project": "fastparquet" + }, + { + "download_count": 4125828, + "project": "flask-babel" + }, + { + "download_count": 4114954, + "project": "gcloud" + }, + { + "download_count": 4098408, + "project": "google-cloud-bigquery-datatransfer" + }, + { + "download_count": 4088308, + "project": "gorilla" + }, + { + "download_count": 4081407, + "project": "keystoneauth1" + }, + { + "download_count": 4077553, + "project": "requests-futures" + }, + { + "download_count": 4054249, + "project": "azureml-core" + }, + { + "download_count": 4042252, + "project": "python-ldap" + }, + { + "download_count": 4007776, + "project": "pathos" + }, + { + "download_count": 3999757, + "project": "ephem" + }, + { + "download_count": 3969692, + "project": "hyperopt" + }, + { + "download_count": 3949966, + "project": "testfixtures" + }, + { + "download_count": 3937830, + "project": "fonttools" + }, + { + "download_count": 3935226, + "project": "terminaltables" + }, + { + "download_count": 3927254, + "project": "easyprocess" + }, + { + "download_count": 3922990, + "project": "python-gflags" + }, + { + "download_count": 3912801, + "project": "deprecation" + }, + { + "download_count": 3905705, + "project": "nvidia-ml-py" + }, + { + "download_count": 3885807, + "project": "google-cloud-kms" + }, + { + "download_count": 3865843, + "project": "geojson" + }, + { + "download_count": 3828132, + "project": "robotframework" + }, + { + "download_count": 3820453, + "project": "gcsfs" + }, + { + "download_count": 3810489, + "project": "convertdate" + }, + { + "download_count": 3809802, + "project": "sockjs-tornado" + }, + { + "download_count": 3799689, + "project": "multipledispatch" + }, + { + "download_count": 3798810, + "project": "weasyprint" + }, + { + "download_count": 3793665, + "project": "tomlkit" + }, + { + "download_count": 3792308, + "project": "python-snappy" + }, + { + "download_count": 3787259, + "project": "django-model-utils" + }, + { + "download_count": 3780397, + "project": "distributed" + }, + { + "download_count": 3775038, + "project": "grequests" + }, + { + "download_count": 3771741, + "project": "flask-bcrypt" + }, + { + "download_count": 3769931, + "project": "fakeredis" + }, + { + "download_count": 3752939, + "project": "schedule" + }, + { + "download_count": 3746896, + "project": "validators" + }, + { + "download_count": 3721493, + "project": "knack" + }, + { + "download_count": 3693854, + "project": "pox" + }, + { + "download_count": 3682964, + "project": "sshtunnel" + }, + { + "download_count": 3681065, + "project": "tftpy" + }, + { + "download_count": 3676291, + "project": "pdfminer" + }, + { + "download_count": 3664933, + "project": "google-compute-engine" + }, + { + "download_count": 3647507, + "project": "graphene" + }, + { + "download_count": 3639253, + "project": "setuptools-git" + }, + { + "download_count": 3630380, + "project": "unittest-xml-reporting" + }, + { + "download_count": 3627156, + "project": "ciso8601" + }, + { + "download_count": 3627033, + "project": "sockjs" + }, + { + "download_count": 3625069, + "project": "shortuuid" + }, + { + "download_count": 3616592, + "project": "ray" + }, + { + "download_count": 3613699, + "project": "ppft" + }, + { + "download_count": 3597147, + "project": "shap" + }, + { + "download_count": 3590917, + "project": "azureml-model-management-sdk" + }, + { + "download_count": 3588391, + "project": "pygsheets" + }, + { + "download_count": 3584999, + "project": "flask-swagger" + }, + { + "download_count": 3575551, + "project": "cssutils" + }, + { + "download_count": 3568283, + "project": "pattern" + }, + { + "download_count": 3549188, + "project": "pylev" + }, + { + "download_count": 3544798, + "project": "ibm-db-sa" + }, + { + "download_count": 3526181, + "project": "pyathenajdbc" + }, + { + "download_count": 3518011, + "project": "pylint-plugin-utils" + }, + { + "download_count": 3517988, + "project": "pg8000" + }, + { + "download_count": 3517712, + "project": "tensorflow-model-analysis" + }, + { + "download_count": 3507991, + "project": "os-service-types" + }, + { + "download_count": 3489788, + "project": "python-swiftclient" + }, + { + "download_count": 3477450, + "project": "openstacksdk" + }, + { + "download_count": 3465240, + "project": "cfn-flip" + }, + { + "download_count": 3459223, + "project": "catkin-pkg" + }, + { + "download_count": 3455963, + "project": "cleo" + }, + { + "download_count": 3448945, + "project": "python-keystoneclient" + }, + { + "download_count": 3448335, + "project": "jellyfish" + }, + { + "download_count": 3444950, + "project": "apispec" + }, + { + "download_count": 3443490, + "project": "pastel" + }, + { + "download_count": 3434078, + "project": "django-tables2" + }, + { + "download_count": 3429540, + "project": "qrcode" + }, + { + "download_count": 3426160, + "project": "collectd-nvidianvml" + }, + { + "download_count": 3420045, + "project": "apache-airflow" + }, + { + "download_count": 3411604, + "project": "prison" + }, + { + "download_count": 3402478, + "project": "pefile" + }, + { + "download_count": 3393690, + "project": "commonmark" + }, + { + "download_count": 3388484, + "project": "tablib" + }, + { + "download_count": 3384168, + "project": "ntlm-auth" + }, + { + "download_count": 3377675, + "project": "geopandas" + }, + { + "download_count": 3366350, + "project": "jsmin" + }, + { + "download_count": 3361635, + "project": "antlr4-python3-runtime" + }, + { + "download_count": 3340033, + "project": "polyaxon-dockerizer" + }, + { + "download_count": 3293582, + "project": "odfpy" + }, + { + "download_count": 3269264, + "project": "openapi-codec" + }, + { + "download_count": 3258675, + "project": "utm" + }, + { + "download_count": 3251855, + "project": "pyvmomi" + }, + { + "download_count": 3251588, + "project": "poetry" + }, + { + "download_count": 3247520, + "project": "bitarray" + }, + { + "download_count": 3244587, + "project": "python-crontab" + }, + { + "download_count": 3243979, + "project": "django-mysql" + }, + { + "download_count": 3242901, + "project": "databricks-pypi1" + }, + { + "download_count": 3238235, + "project": "marshmallow-sqlalchemy" + }, + { + "download_count": 3226761, + "project": "emoji" + }, + { + "download_count": 3224704, + "project": "initools" + }, + { + "download_count": 3209542, + "project": "capstone" + }, + { + "download_count": 3200795, + "project": "djangorestframework-jwt" + }, + { + "download_count": 3184641, + "project": "django-rest-swagger" + }, + { + "download_count": 3181604, + "project": "tensorflow-hub" + }, + { + "download_count": 3179141, + "project": "ratelimit" + }, + { + "download_count": 3176283, + "project": "asyncio" + }, + { + "download_count": 3176119, + "project": "spark-sklearn" + }, + { + "download_count": 3173008, + "project": "paste" + }, + { + "download_count": 3169917, + "project": "pytest-asyncio" + }, + { + "download_count": 3159532, + "project": "django-crispy-forms" + }, + { + "download_count": 3156134, + "project": "cachy" + }, + { + "download_count": 3150001, + "project": "asgiref" + }, + { + "download_count": 3138323, + "project": "django-environ" + }, + { + "download_count": 3127100, + "project": "fire" + }, + { + "download_count": 3123851, + "project": "salesforce-bulk" + }, + { + "download_count": 3117730, + "project": "lightstep" + }, + { + "download_count": 3116358, + "project": "azure-cli-core" + }, + { + "download_count": 3110959, + "project": "recommonmark" + }, + { + "download_count": 3095813, + "project": "pysqlite" + }, + { + "download_count": 3088484, + "project": "clickclick" + }, + { + "download_count": 3077942, + "project": "heapdict" + }, + { + "download_count": 3077928, + "project": "google-cloud-dataflow" + }, + { + "download_count": 3073863, + "project": "spotinst-agent" + }, + { + "download_count": 3073217, + "project": "analytics-python" + }, + { + "download_count": 3065872, + "project": "nose-timer" + }, + { + "download_count": 3064209, + "project": "rq" + }, + { + "download_count": 3062467, + "project": "wandb" + }, + { + "download_count": 3060966, + "project": "jsonfield" + }, + { + "download_count": 3050206, + "project": "pyinotify" + }, + { + "download_count": 3048455, + "project": "pygame" + }, + { + "download_count": 3043542, + "project": "intel-openmp" + }, + { + "download_count": 3042574, + "project": "zict" + }, + { + "download_count": 3040916, + "project": "pytest-split-tests" + }, + { + "download_count": 3036872, + "project": "pep8-naming" + }, + { + "download_count": 3029439, + "project": "ordered-set" + }, + { + "download_count": 3025549, + "project": "graphql-relay" + }, + { + "download_count": 3019093, + "project": "troposphere" + }, + { + "download_count": 3009250, + "project": "azure-kusto-data" + }, + { + "download_count": 3008025, + "project": "opencv-contrib-python" + }, + { + "download_count": 3003750, + "project": "requests-ntlm" + }, + { + "download_count": 3003003, + "project": "tb-nightly" + }, + { + "download_count": 2996766, + "project": "credstash" + }, + { + "download_count": 2989520, + "project": "flask-appbuilder" + }, + { + "download_count": 2980537, + "project": "plumbum" + }, + { + "download_count": 2973597, + "project": "pager" + }, + { + "download_count": 2967237, + "project": "schema" + }, + { + "download_count": 2965535, + "project": "mkl" + }, + { + "download_count": 2963377, + "project": "blessed" + }, + { + "download_count": 2953182, + "project": "datashape" + }, + { + "download_count": 2941855, + "project": "validate-email" + }, + { + "download_count": 2939744, + "project": "pylint-django" + }, + { + "download_count": 2938945, + "project": "webapp2" + }, + { + "download_count": 2936891, + "project": "livereload" + }, + { + "download_count": 2935073, + "project": "cvxopt" + }, + { + "download_count": 2934589, + "project": "cement" + }, + { + "download_count": 2931314, + "project": "tfx-bsl" + }, + { + "download_count": 2922270, + "project": "rospkg" + }, + { + "download_count": 2912677, + "project": "flaky" + }, + { + "download_count": 2909121, + "project": "filemagic" + }, + { + "download_count": 2902933, + "project": "msgpack-numpy" + }, + { + "download_count": 2895921, + "project": "uamqp" + }, + { + "download_count": 2895636, + "project": "accumulation-tree" + }, + { + "download_count": 2894366, + "project": "pyudorandom" + }, + { + "download_count": 2892673, + "project": "tdigest" + }, + { + "download_count": 2888615, + "project": "tensorflow-data-validation" + }, + { + "download_count": 2886531, + "project": "python-subunit" + }, + { + "download_count": 2878388, + "project": "gitdb" + }, + { + "download_count": 2874189, + "project": "python-novaclient" + }, + { + "download_count": 2857065, + "project": "asyncpg" + }, + { + "download_count": 2847295, + "project": "social-auth-core" + }, + { + "download_count": 2838600, + "project": "azure-cli-nspkg" + }, + { + "download_count": 2838428, + "project": "requestsexceptions" + }, + { + "download_count": 2834024, + "project": "filechunkio" + }, + { + "download_count": 2828975, + "project": "argon2-cffi" + }, + { + "download_count": 2822266, + "project": "beautifulsoup" + }, + { + "download_count": 2821979, + "project": "smmap" + }, + { + "download_count": 2819754, + "project": "django-multiselectfield" + }, + { + "download_count": 2815640, + "project": "drf-yasg" + }, + { + "download_count": 2813694, + "project": "boltons" + }, + { + "download_count": 2810269, + "project": "httpretty" + }, + { + "download_count": 2806190, + "project": "pyqt5" + }, + { + "download_count": 2802770, + "project": "hashids" + }, + { + "download_count": 2792830, + "project": "pdfrw" + }, + { + "download_count": 2792334, + "project": "flask-openid" + }, + { + "download_count": 2791834, + "project": "gapic-google-cloud-error-reporting-v1beta1" + }, + { + "download_count": 2790983, + "project": "cookiejar" + }, + { + "download_count": 2788259, + "project": "proto-google-cloud-error-reporting-v1beta1" + }, + { + "download_count": 2779755, + "project": "flask-marshmallow" + }, + { + "download_count": 2753420, + "project": "pyinstaller" + }, + { + "download_count": 2752867, + "project": "sqlalchemy-redshift" + }, + { + "download_count": 2749279, + "project": "python-logstash" + }, + { + "download_count": 2747409, + "project": "django-nose" + }, + { + "download_count": 2744486, + "project": "azure-cosmos" + }, + { + "download_count": 2738853, + "project": "verboselogs" + }, + { + "download_count": 2724920, + "project": "googlemaps" + }, + { + "download_count": 2722861, + "project": "social-auth-app-django" + }, + { + "download_count": 2706844, + "project": "async-generator" + }, + { + "download_count": 2704711, + "project": "funcy" + }, + { + "download_count": 2703274, + "project": "clint" + }, + { + "download_count": 2701212, + "project": "pytest-sugar" + }, + { + "download_count": 2699840, + "project": "django-timezone-field" + }, + { + "download_count": 2697450, + "project": "jaydebeapi" + }, + { + "download_count": 2693049, + "project": "brotlipy" + }, + { + "download_count": 2686973, + "project": "args" + }, + { + "download_count": 2683870, + "project": "vcrpy" + }, + { + "download_count": 2677855, + "project": "marshmallow-enum" + }, + { + "download_count": 2673327, + "project": "peewee" + }, + { + "download_count": 2670889, + "project": "osc-lib" + }, + { + "download_count": 2670484, + "project": "langdetect" + }, + { + "download_count": 2663228, + "project": "enum" + }, + { + "download_count": 2655265, + "project": "azure-cli-telemetry" + }, + { + "download_count": 2651881, + "project": "tables" + }, + { + "download_count": 2649758, + "project": "pastedeploy" + }, + { + "download_count": 2646163, + "project": "swagger-spec-validator" + }, + { + "download_count": 2644724, + "project": "tld" + }, + { + "download_count": 2642975, + "project": "kafka" + }, + { + "download_count": 2641270, + "project": "cchardet" + }, + { + "download_count": 2636532, + "project": "timezonefinder" + }, + { + "download_count": 2634114, + "project": "mongoengine" + }, + { + "download_count": 2615568, + "project": "python-crfsuite" + }, + { + "download_count": 2600491, + "project": "timeout-decorator" + }, + { + "download_count": 2592520, + "project": "rjsmin" + }, + { + "download_count": 2589546, + "project": "brunel" + }, + { + "download_count": 2585708, + "project": "autobahn" + }, + { + "download_count": 2584709, + "project": "webargs" + }, + { + "download_count": 2584111, + "project": "pyvirtualdisplay" + }, + { + "download_count": 2580140, + "project": "descartes" + }, + { + "download_count": 2551557, + "project": "cassandra-driver" + }, + { + "download_count": 2549257, + "project": "aws-requests-auth" + }, + { + "download_count": 2540875, + "project": "rope" + }, + { + "download_count": 2538617, + "project": "aiofiles" + }, + { + "download_count": 2532557, + "project": "pycountry-convert" + }, + { + "download_count": 2528277, + "project": "branca" + }, + { + "download_count": 2524264, + "project": "mechanize" + }, + { + "download_count": 2519234, + "project": "mysql-connector-python-rf" + }, + { + "download_count": 2517497, + "project": "pywebhdfs" + }, + { + "download_count": 2503645, + "project": "folium" + }, + { + "download_count": 2498263, + "project": "aiohttp-cors" + }, + { + "download_count": 2497590, + "project": "flask-httpauth" + }, + { + "download_count": 2495242, + "project": "django-ipware" + }, + { + "download_count": 2494397, + "project": "jupyterlab" + }, + { + "download_count": 2493673, + "project": "pybind11" + }, + { + "download_count": 2492477, + "project": "diff-match-patch" + }, + { + "download_count": 2491248, + "project": "jupyter-pip" + }, + { + "download_count": 2488659, + "project": "dpath" + }, + { + "download_count": 2488591, + "project": "marionette-driver" + }, + { + "download_count": 2484149, + "project": "dotnetcore2" + }, + { + "download_count": 2478052, + "project": "pythonwhois" + }, + { + "download_count": 2470002, + "project": "google-cloud-dataproc" + }, + { + "download_count": 2458163, + "project": "enum-compat" + }, + { + "download_count": 2455272, + "project": "awsebcli" + }, + { + "download_count": 2454145, + "project": "django-celery-beat" + }, + { + "download_count": 2453795, + "project": "rfc3987" + }, + { + "download_count": 2447431, + "project": "py-bcrypt" + }, + { + "download_count": 2442569, + "project": "python-gitlab" + }, + { + "download_count": 2439713, + "project": "translationstring" + }, + { + "download_count": 2439355, + "project": "yq" + }, + { + "download_count": 2435098, + "project": "pysnmp" + }, + { + "download_count": 2432521, + "project": "first" + }, + { + "download_count": 2429585, + "project": "hpack" + }, + { + "download_count": 2428283, + "project": "python-glanceclient" + }, + { + "download_count": 2422100, + "project": "venusian" + }, + { + "download_count": 2416591, + "project": "bitstring" + }, + { + "download_count": 2408841, + "project": "flake8-docstrings" + }, + { + "download_count": 2407495, + "project": "attrdict" + }, + { + "download_count": 2404932, + "project": "ws4py" + }, + { + "download_count": 2402857, + "project": "os-client-config" + }, + { + "download_count": 2401078, + "project": "locustio" + }, + { + "download_count": 2398281, + "project": "junit-xml" + }, + { + "download_count": 2395343, + "project": "mozversion" + }, + { + "download_count": 2395052, + "project": "azureml-dataprep" + }, + { + "download_count": 2390036, + "project": "sshpubkeys" + }, + { + "download_count": 2387469, + "project": "h2" + }, + { + "download_count": 2386629, + "project": "ansible-lint" + }, + { + "download_count": 2381639, + "project": "txaio" + }, + { + "download_count": 2380783, + "project": "wget" + }, + { + "download_count": 2375129, + "project": "pytest-rerunfailures" + }, + { + "download_count": 2371842, + "project": "oslo-log" + }, + { + "download_count": 2370221, + "project": "hyperframe" + }, + { + "download_count": 2364172, + "project": "python-openid" + }, + { + "download_count": 2357263, + "project": "flask-jwt-extended" + }, + { + "download_count": 2354920, + "project": "azureml-dataprep-native" + }, + { + "download_count": 2346411, + "project": "flake8-import-order" + }, + { + "download_count": 2334525, + "project": "pypandoc" + }, + { + "download_count": 2329461, + "project": "pysmi" + }, + { + "download_count": 2328121, + "project": "json-merge-patch" + }, + { + "download_count": 2325050, + "project": "falcon" + }, + { + "download_count": 2314962, + "project": "google-cloud-automl" + }, + { + "download_count": 2313548, + "project": "azure-kusto-ingest" + }, + { + "download_count": 2311574, + "project": "aioredis" + }, + { + "download_count": 2307595, + "project": "py-cpuinfo" + }, + { + "download_count": 2305070, + "project": "imbalanced-learn" + }, + { + "download_count": 2304296, + "project": "django-compressor" + }, + { + "download_count": 2304263, + "project": "memoized-property" + }, + { + "download_count": 2304114, + "project": "azureml-telemetry" + }, + { + "download_count": 2301461, + "project": "textblob" + }, + { + "download_count": 2299510, + "project": "snowflake-sqlalchemy" + }, + { + "download_count": 2287102, + "project": "schematics" + }, + { + "download_count": 2276329, + "project": "virtualenvwrapper" + }, + { + "download_count": 2272329, + "project": "aws-encryption-sdk" + }, + { + "download_count": 2272227, + "project": "opencensus" + }, + { + "download_count": 2267894, + "project": "django-allauth" + }, + { + "download_count": 2267072, + "project": "ibm-db" + }, + { + "download_count": 2258528, + "project": "python-cinderclient" + }, + { + "download_count": 2252312, + "project": "objectpath" + }, + { + "download_count": 2242218, + "project": "tf-estimator-nightly" + }, + { + "download_count": 2231619, + "project": "flask-compress" + }, + { + "download_count": 2224267, + "project": "azureml-pipeline-core" + }, + { + "download_count": 2221757, + "project": "connexion" + }, + { + "download_count": 2219740, + "project": "django-phonenumber-field" + }, + { + "download_count": 2214496, + "project": "warlock" + }, + { + "download_count": 2213923, + "project": "pyqt5-sip" + }, + { + "download_count": 2210221, + "project": "phonenumberslite" + }, + { + "download_count": 2209512, + "project": "oslo-context" + }, + { + "download_count": 2194021, + "project": "azure-cli-command-modules-nspkg" + }, + { + "download_count": 2185051, + "project": "pathlib-mate" + }, + { + "download_count": 2184347, + "project": "jsonref" + }, + { + "download_count": 2182555, + "project": "pytimeparse" + }, + { + "download_count": 2180696, + "project": "databricks-pypi2" + }, + { + "download_count": 2178821, + "project": "natsort" + }, + { + "download_count": 2176243, + "project": "ipaddr" + }, + { + "download_count": 2171374, + "project": "path-py" + }, + { + "download_count": 2170378, + "project": "azure-mgmt-hdinsight" + }, + { + "download_count": 2153590, + "project": "firebase-admin" + }, + { + "download_count": 2150903, + "project": "azureml-train-core" + }, + { + "download_count": 2148663, + "project": "pypyodbc" + }, + { + "download_count": 2145885, + "project": "uszipcode" + }, + { + "download_count": 2145383, + "project": "azureml-train-restclients-hyperdrive" + }, + { + "download_count": 2142865, + "project": "premailer" + }, + { + "download_count": 2137325, + "project": "h11" + }, + { + "download_count": 2132743, + "project": "pyformance" + }, + { + "download_count": 2132535, + "project": "shellescape" + }, + { + "download_count": 2130341, + "project": "django-import-export" + }, + { + "download_count": 2127667, + "project": "wsaccel" + }, + { + "download_count": 2126611, + "project": "django-js-asset" + }, + { + "download_count": 2126191, + "project": "snakebite" + }, + { + "download_count": 2124659, + "project": "wordcloud" + }, + { + "download_count": 2109163, + "project": "antlr4-python2-runtime" + }, + { + "download_count": 2099008, + "project": "naked" + }, + { + "download_count": 2098854, + "project": "jinja2-cli" + }, + { + "download_count": 2097764, + "project": "onnx" + }, + { + "download_count": 2081320, + "project": "pytesseract" + }, + { + "download_count": 2076961, + "project": "azureml-pipeline-steps" + }, + { + "download_count": 2073133, + "project": "flask-testing" + }, + { + "download_count": 2072907, + "project": "pytest-env" + }, + { + "download_count": 2072150, + "project": "django-widget-tweaks" + }, + { + "download_count": 2070728, + "project": "django-webpack-loader" + }, + { + "download_count": 2069730, + "project": "azureml-pipeline" + }, + { + "download_count": 2069241, + "project": "mrjob" + }, + { + "download_count": 2055974, + "project": "public" + }, + { + "download_count": 2053631, + "project": "python-whois" + }, + { + "download_count": 2052521, + "project": "safety" + }, + { + "download_count": 2038912, + "project": "azure-multiapi-storage" + }, + { + "download_count": 2038114, + "project": "google-cloud-tasks" + }, + { + "download_count": 2037912, + "project": "partd" + }, + { + "download_count": 2033573, + "project": "rcssmin" + }, + { + "download_count": 2032537, + "project": "uuid" + }, + { + "download_count": 2030463, + "project": "azureml-train" + }, + { + "download_count": 2028467, + "project": "vsts-cd-manager" + }, + { + "download_count": 2025661, + "project": "pyjks" + }, + { + "download_count": 2025022, + "project": "flake8-quotes" + }, + { + "download_count": 2022199, + "project": "python-socketio" + }, + { + "download_count": 2021994, + "project": "slimit" + }, + { + "download_count": 2021337, + "project": "pygeocoder" + }, + { + "download_count": 2020656, + "project": "javaobj-py3" + }, + { + "download_count": 2019345, + "project": "tweepy" + }, + { + "download_count": 2015977, + "project": "grpc-google-logging-v2" + }, + { + "download_count": 2013359, + "project": "twofish" + }, + { + "download_count": 2010440, + "project": "urwid" + }, + { + "download_count": 2008501, + "project": "pyathena" + }, + { + "download_count": 2004648, + "project": "azureml-sdk" + }, + { + "download_count": 2002586, + "project": "pdfminer-six" + }, + { + "download_count": 2000934, + "project": "grpc-google-pubsub-v1" + }, + { + "download_count": 1999960, + "project": "astral" + }, + { + "download_count": 1996773, + "project": "python-box" + }, + { + "download_count": 1992382, + "project": "python-openstackclient" + }, + { + "download_count": 1987939, + "project": "toposort" + }, + { + "download_count": 1984547, + "project": "httptools" + }, + { + "download_count": 1980989, + "project": "asynctest" + }, + { + "download_count": 1978811, + "project": "pycalverter" + }, + { + "download_count": 1975990, + "project": "django-mptt" + }, + { + "download_count": 1974600, + "project": "nameparser" + }, + { + "download_count": 1974472, + "project": "geomet" + }, + { + "download_count": 1974084, + "project": "rtree" + }, + { + "download_count": 1970886, + "project": "gax-google-logging-v2" + }, + { + "download_count": 1967604, + "project": "openapi-spec-validator" + }, + { + "download_count": 1966141, + "project": "simpleeval" + }, + { + "download_count": 1965371, + "project": "gax-google-pubsub-v1" + }, + { + "download_count": 1964155, + "project": "pympler" + }, + { + "download_count": 1957946, + "project": "pint" + }, + { + "download_count": 1954321, + "project": "django-celery-results" + }, + { + "download_count": 1950586, + "project": "oauth2" + }, + { + "download_count": 1947313, + "project": "collections-extended" + }, + { + "download_count": 1943588, + "project": "dparse" + }, + { + "download_count": 1937747, + "project": "azure-mgmt-botservice" + }, + { + "download_count": 1935888, + "project": "facebook-business" + }, + { + "download_count": 1932910, + "project": "django-localflavor" + }, + { + "download_count": 1931470, + "project": "slackweb" + }, + { + "download_count": 1919103, + "project": "azure-eventhub" + }, + { + "download_count": 1918652, + "project": "django-braces" + }, + { + "download_count": 1917375, + "project": "fake-useragent" + }, + { + "download_count": 1916732, + "project": "python-engineio" + }, + { + "download_count": 1904465, + "project": "django-countries" + }, + { + "download_count": 1901273, + "project": "ptvsd" + }, + { + "download_count": 1899393, + "project": "orderedmultidict" + }, + { + "download_count": 1897121, + "project": "jwcrypto" + }, + { + "download_count": 1895022, + "project": "azure-mgmt-security" + }, + { + "download_count": 1893082, + "project": "awacs" + }, + { + "download_count": 1889385, + "project": "azure-functions-devops-build" + }, + { + "download_count": 1884376, + "project": "locket" + }, + { + "download_count": 1882404, + "project": "ctutlz" + }, + { + "download_count": 1875062, + "project": "snapshottest" + }, + { + "download_count": 1874184, + "project": "pdfkit" + }, + { + "download_count": 1870591, + "project": "scapy" + }, + { + "download_count": 1869037, + "project": "opencensus-context" + }, + { + "download_count": 1862753, + "project": "flask-mail" + }, + { + "download_count": 1860985, + "project": "intervaltree" + }, + { + "download_count": 1856012, + "project": "azure-mgmt-sqlvirtualmachine" + }, + { + "download_count": 1853788, + "project": "azure-mgmt-kusto" + }, + { + "download_count": 1853245, + "project": "luigi" + }, + { + "download_count": 1852083, + "project": "pylru" + }, + { + "download_count": 1848356, + "project": "sklearn-pandas" + }, + { + "download_count": 1846838, + "project": "pydantic" + }, + { + "download_count": 1845633, + "project": "email-validator" + }, + { + "download_count": 1844376, + "project": "pyquery" + }, + { + "download_count": 1841139, + "project": "django-oauth-toolkit" + }, + { + "download_count": 1839835, + "project": "memory-profiler" + }, + { + "download_count": 1839825, + "project": "jupyterlab-server" + }, + { + "download_count": 1835726, + "project": "sqlalchemy-migrate" + }, + { + "download_count": 1832053, + "project": "retry-decorator" + }, + { + "download_count": 1830194, + "project": "robotframework-seleniumlibrary" + }, + { + "download_count": 1825914, + "project": "koalas" + }, + { + "download_count": 1822090, + "project": "amazon-dax-client" + }, + { + "download_count": 1821759, + "project": "python-nvd3" + }, + { + "download_count": 1818147, + "project": "utlz" + }, + { + "download_count": 1813328, + "project": "requests-kerberos" + }, + { + "download_count": 1803051, + "project": "ftfy" + }, + { + "download_count": 1798001, + "project": "crypto" + }, + { + "download_count": 1792237, + "project": "distlib" + }, + { + "download_count": 1791068, + "project": "wordsegment" + }, + { + "download_count": 1790178, + "project": "django-taggit" + }, + { + "download_count": 1783750, + "project": "suds" + }, + { + "download_count": 1782898, + "project": "fabric3" + }, + { + "download_count": 1782756, + "project": "socksipy-branch" + }, + { + "download_count": 1778530, + "project": "webcolors" + }, + { + "download_count": 1773769, + "project": "orderedset" + }, + { + "download_count": 1770892, + "project": "mxnet" + }, + { + "download_count": 1767740, + "project": "mixpanel" + }, + { + "download_count": 1766756, + "project": "python-stdnum" + }, + { + "download_count": 1765611, + "project": "polib" + }, + { + "download_count": 1762017, + "project": "pysaml2" + }, + { + "download_count": 1760938, + "project": "pywinpty" + }, + { + "download_count": 1760472, + "project": "curlify" + }, + { + "download_count": 1759532, + "project": "dulwich" + }, + { + "download_count": 1755858, + "project": "tzwhere" + }, + { + "download_count": 1753697, + "project": "pyotp" + }, + { + "download_count": 1752520, + "project": "dropbox" + }, + { + "download_count": 1748789, + "project": "thriftpy" + }, + { + "download_count": 1744492, + "project": "yattag" + }, + { + "download_count": 1744207, + "project": "xxhash" + }, + { + "download_count": 1740901, + "project": "colorlover" + }, + { + "download_count": 1740812, + "project": "mkdocs" + }, + { + "download_count": 1723311, + "project": "iso3166" + }, + { + "download_count": 1722795, + "project": "gcs-oauth2-boto-plugin" + }, + { + "download_count": 1720946, + "project": "protorpc" + }, + { + "download_count": 1717972, + "project": "sentinels" + }, + { + "download_count": 1716396, + "project": "pykalman" + }, + { + "download_count": 1715123, + "project": "pkgconfig" + }, + { + "download_count": 1714704, + "project": "geohash" + }, + { + "download_count": 1712854, + "project": "google-cloud-dlp" + }, + { + "download_count": 1711556, + "project": "resampy" + }, + { + "download_count": 1705164, + "project": "request" + }, + { + "download_count": 1696070, + "project": "usaddress" + }, + { + "download_count": 1694720, + "project": "superlance" + }, + { + "download_count": 1692010, + "project": "librato-metrics" + }, + { + "download_count": 1690356, + "project": "flask-oauthlib" + }, + { + "download_count": 1686047, + "project": "google-cloud-texttospeech" + }, + { + "download_count": 1677666, + "project": "post" + }, + { + "download_count": 1675876, + "project": "get" + }, + { + "download_count": 1669578, + "project": "daphne" + }, + { + "download_count": 1665895, + "project": "librosa" + }, + { + "download_count": 1665557, + "project": "pyelftools" + }, + { + "download_count": 1665384, + "project": "query-string" + }, + { + "download_count": 1663244, + "project": "pywinrm" + }, + { + "download_count": 1660863, + "project": "pyreadline" + }, + { + "download_count": 1657504, + "project": "ez-setup" + }, + { + "download_count": 1656438, + "project": "channels" + }, + { + "download_count": 1640299, + "project": "node-semver" + }, + { + "download_count": 1638276, + "project": "tensorboardx" + }, + { + "download_count": 1631659, + "project": "htmlmin" + }, + { + "download_count": 1625146, + "project": "tensorflow-datasets" + }, + { + "download_count": 1624914, + "project": "audioread" + }, + { + "download_count": 1621703, + "project": "couchdb" + }, + { + "download_count": 1618223, + "project": "google-reauth" + }, + { + "download_count": 1616648, + "project": "google-cloud-redis" + }, + { + "download_count": 1615335, + "project": "autograd" + }, + { + "download_count": 1609038, + "project": "rollbar" + }, + { + "download_count": 1608426, + "project": "pyu2f" + }, + { + "download_count": 1603406, + "project": "iptools" + }, + { + "download_count": 1601716, + "project": "compatibility-lib" + }, + { + "download_count": 1599718, + "project": "google-cloud-asset" + }, + { + "download_count": 1599709, + "project": "azure-mgmt-privatedns" + }, + { + "download_count": 1596670, + "project": "python-decouple" + }, + { + "download_count": 1592734, + "project": "oslo-concurrency" + }, + { + "download_count": 1590149, + "project": "mongomock" + }, + { + "download_count": 1590067, + "project": "fluent-logger" + }, + { + "download_count": 1589332, + "project": "pygrok" + }, + { + "download_count": 1586920, + "project": "rauth" + }, + { + "download_count": 1585024, + "project": "probableparsing" + }, + { + "download_count": 1580625, + "project": "dominate" + }, + { + "download_count": 1577725, + "project": "pykerberos" + }, + { + "download_count": 1577380, + "project": "pyramid" + }, + { + "download_count": 1575279, + "project": "flask-cache" + }, + { + "download_count": 1575048, + "project": "pytest-cache" + }, + { + "download_count": 1574450, + "project": "pyee" + }, + { + "download_count": 1572539, + "project": "bingads" + }, + { + "download_count": 1569151, + "project": "appium-python-client" + }, + { + "download_count": 1567159, + "project": "pygam" + }, + { + "download_count": 1564680, + "project": "fysom" + }, + { + "download_count": 1563117, + "project": "tempita" + }, + { + "download_count": 1561979, + "project": "pywin32-ctypes" + }, + { + "download_count": 1561323, + "project": "diskcache" + }, + { + "download_count": 1558407, + "project": "pyhs2" + }, + { + "download_count": 1556417, + "project": "frozendict" + }, + { + "download_count": 1556392, + "project": "immutables" + }, + { + "download_count": 1550611, + "project": "python-neutronclient" + }, + { + "download_count": 1549879, + "project": "gspread-dataframe" + }, + { + "download_count": 1545947, + "project": "pyro4" + }, + { + "download_count": 1539049, + "project": "vertica-python" + }, + { + "download_count": 1538249, + "project": "google-cloud-securitycenter" + }, + { + "download_count": 1532048, + "project": "m3u8" + }, + { + "download_count": 1530674, + "project": "serpent" + }, + { + "download_count": 1527389, + "project": "aiobotocore" + }, + { + "download_count": 1526900, + "project": "django-reversion" + }, + { + "download_count": 1525911, + "project": "tox-travis" + }, + { + "download_count": 1524549, + "project": "pluginbase" + }, + { + "download_count": 1523680, + "project": "google-cloud-iot" + }, + { + "download_count": 1523139, + "project": "pykafka" + }, + { + "download_count": 1522621, + "project": "anyconfig" + }, + { + "download_count": 1520539, + "project": "pyjwkest" + }, + { + "download_count": 1520176, + "project": "django-formtools" + }, + { + "download_count": 1519701, + "project": "vowpalwabbit" + }, + { + "download_count": 1518864, + "project": "gprof2dot" + }, + { + "download_count": 1517841, + "project": "presto-python-client" + }, + { + "download_count": 1515284, + "project": "delorean" + }, + { + "download_count": 1514817, + "project": "json5" + }, + { + "download_count": 1511462, + "project": "num2words" + }, + { + "download_count": 1507178, + "project": "pylibmc" + }, + { + "download_count": 1505966, + "project": "httpagentparser" + }, + { + "download_count": 1504331, + "project": "drf-nested-routers" + }, + { + "download_count": 1504075, + "project": "icalendar" + }, + { + "download_count": 1503765, + "project": "google-cloud-websecurityscanner" + }, + { + "download_count": 1501399, + "project": "lru-dict" + }, + { + "download_count": 1496923, + "project": "cloudant" + }, + { + "download_count": 1493340, + "project": "keyrings-alt" + }, + { + "download_count": 1492739, + "project": "cattrs" + }, + { + "download_count": 1491297, + "project": "model-mommy" + }, + { + "download_count": 1490933, + "project": "jenkinsapi" + }, + { + "download_count": 1488901, + "project": "workalendar" + }, + { + "download_count": 1486683, + "project": "lifetimes" + }, + { + "download_count": 1484449, + "project": "sseclient-py" + }, + { + "download_count": 1481519, + "project": "python-etcd" + }, + { + "download_count": 1480386, + "project": "testinfra" + }, + { + "download_count": 1479219, + "project": "sentencepiece" + }, + { + "download_count": 1479194, + "project": "scikit-optimize" + }, + { + "download_count": 1477712, + "project": "flask-responses" + }, + { + "download_count": 1468207, + "project": "django-polymorphic" + }, + { + "download_count": 1467601, + "project": "azure-mgmt-deploymentmanager" + }, + { + "download_count": 1464092, + "project": "routes" + }, + { + "download_count": 1463152, + "project": "editdistance" + }, + { + "download_count": 1460523, + "project": "bugsnag" + }, + { + "download_count": 1453426, + "project": "conan" + }, + { + "download_count": 1449766, + "project": "autowrapt" + }, + { + "download_count": 1448235, + "project": "fasttext" + }, + { + "download_count": 1445709, + "project": "django-rest-auth" + }, + { + "download_count": 1444092, + "project": "catboost" + }, + { + "download_count": 1442809, + "project": "pydash" + }, + { + "download_count": 1442503, + "project": "libsass" + }, + { + "download_count": 1441996, + "project": "importlib" + }, + { + "download_count": 1440920, + "project": "pytest-flask" + }, + { + "download_count": 1440731, + "project": "django-simple-history" + }, + { + "download_count": 1439129, + "project": "django-picklefield" + }, + { + "download_count": 1437255, + "project": "trollius" + }, + { + "download_count": 1433413, + "project": "ml-metadata" + }, + { + "download_count": 1428493, + "project": "port-for" + }, + { + "download_count": 1426881, + "project": "flake8-bugbear" + }, + { + "download_count": 1425070, + "project": "python-nmap" + }, + { + "download_count": 1424275, + "project": "newlinejson" + }, + { + "download_count": 1423507, + "project": "pytest-benchmark" + }, + { + "download_count": 1422061, + "project": "hacking" + }, + { + "download_count": 1420833, + "project": "ratelim" + }, + { + "download_count": 1416683, + "project": "rdflib" + }, + { + "download_count": 1415247, + "project": "ninja" + }, + { + "download_count": 1413811, + "project": "geocoder" + }, + { + "download_count": 1413778, + "project": "parsimonious" + }, + { + "download_count": 1409060, + "project": "xmlsec" + }, + { + "download_count": 1407612, + "project": "jsonpath-ng" + }, + { + "download_count": 1404958, + "project": "authy" + }, + { + "download_count": 1399670, + "project": "python3-saml" + }, + { + "download_count": 1399023, + "project": "django-ratelimit" + }, + { + "download_count": 1398229, + "project": "watson-machine-learning-client" + }, + { + "download_count": 1397882, + "project": "motor" + }, + { + "download_count": 1397503, + "project": "pyusb" + }, + { + "download_count": 1393071, + "project": "eli5" + }, + { + "download_count": 1392124, + "project": "facebook-sdk" + }, + { + "download_count": 1391265, + "project": "py-zabbix" + }, + { + "download_count": 1390039, + "project": "threatconnect" + }, + { + "download_count": 1389772, + "project": "github3-py" + }, + { + "download_count": 1384962, + "project": "dash-renderer" + }, + { + "download_count": 1384373, + "project": "pyzipcode3" + }, + { + "download_count": 1384208, + "project": "transaction" + }, + { + "download_count": 1377748, + "project": "dash" + }, + { + "download_count": 1377392, + "project": "contextvars" + }, + { + "download_count": 1375491, + "project": "pyppeteer" + }, + { + "download_count": 1374745, + "project": "imutils" + }, + { + "download_count": 1373022, + "project": "predicthq" + }, + { + "download_count": 1371449, + "project": "furl" + }, + { + "download_count": 1370079, + "project": "graypy" + }, + { + "download_count": 1368582, + "project": "ipy" + }, + { + "download_count": 1365609, + "project": "apache-libcloud" + }, + { + "download_count": 1363504, + "project": "langid" + }, + { + "download_count": 1362248, + "project": "happybase" + }, + { + "download_count": 1362080, + "project": "wand" + }, + { + "download_count": 1359167, + "project": "dash-core-components" + }, + { + "download_count": 1355835, + "project": "teamcity-messages" + }, + { + "download_count": 1353938, + "project": "django-treebeard" + }, + { + "download_count": 1353094, + "project": "bottleneck" + }, + { + "download_count": 1347193, + "project": "pipdeptree" + }, + { + "download_count": 1346804, + "project": "flask-socketio" + }, + { + "download_count": 1345086, + "project": "feather-format" + }, + { + "download_count": 1345015, + "project": "pyshp" + }, + { + "download_count": 1340081, + "project": "cerberus-python-client" + }, + { + "download_count": 1339531, + "project": "pytest-ordering" + }, + { + "download_count": 1337974, + "project": "dateutils" + }, + { + "download_count": 1337690, + "project": "ccy" + }, + { + "download_count": 1336766, + "project": "ec2-metadata" + }, + { + "download_count": 1336028, + "project": "gevent-websocket" + }, + { + "download_count": 1333439, + "project": "pyenchant" + }, + { + "download_count": 1333043, + "project": "pykwalify" + }, + { + "download_count": 1331164, + "project": "ptable" + }, + { + "download_count": 1324399, + "project": "dash-html-components" + }, + { + "download_count": 1323369, + "project": "wmctrl" + }, + { + "download_count": 1322854, + "project": "markdown2" + }, + { + "download_count": 1320709, + "project": "fancycompleter" + }, + { + "download_count": 1320502, + "project": "genson" + }, + { + "download_count": 1317756, + "project": "pyhocon" + }, + { + "download_count": 1317236, + "project": "pdbpp" + }, + { + "download_count": 1316522, + "project": "crc16" + }, + { + "download_count": 1310312, + "project": "gnupg" + }, + { + "download_count": 1306934, + "project": "palettable" + }, + { + "download_count": 1306842, + "project": "fake-factory" + }, + { + "download_count": 1302234, + "project": "bson" + }, + { + "download_count": 1293536, + "project": "jsonpath-rw-ext" + }, + { + "download_count": 1291830, + "project": "graphene-django" + }, + { + "download_count": 1288532, + "project": "elasticsearch-curator" + }, + { + "download_count": 1287159, + "project": "agate" + }, + { + "download_count": 1286419, + "project": "pyluach" + }, + { + "download_count": 1276264, + "project": "pytoml" + }, + { + "download_count": 1275859, + "project": "xhtml2pdf" + }, + { + "download_count": 1275165, + "project": "mandrill" + }, + { + "download_count": 1274724, + "project": "aws-sam-cli" + }, + { + "download_count": 1274476, + "project": "aws-lambda-builders" + }, + { + "download_count": 1274226, + "project": "algoliasearch" + }, + { + "download_count": 1273921, + "project": "hupper" + }, + { + "download_count": 1261688, + "project": "testscenarios" + }, + { + "download_count": 1259972, + "project": "cufflinks" + }, + { + "download_count": 1258105, + "project": "signalfx" + }, + { + "download_count": 1257144, + "project": "moviepy" + }, + { + "download_count": 1255798, + "project": "objgraph" + }, + { + "download_count": 1252062, + "project": "chevron" + }, + { + "download_count": 1235194, + "project": "pdf2image" + }, + { + "download_count": 1234160, + "project": "uvicorn" + }, + { + "download_count": 1233486, + "project": "tlslite" + }, + { + "download_count": 1231831, + "project": "pybase64" + }, + { + "download_count": 1230654, + "project": "createsend" + }, + { + "download_count": 1230170, + "project": "gql" + }, + { + "download_count": 1230039, + "project": "imagehash" + }, + { + "download_count": 1228048, + "project": "azureml-defaults" + }, + { + "download_count": 1227477, + "project": "azure-mgmt-imagebuilder" + }, + { + "download_count": 1226165, + "project": "serverlessrepo" + }, + { + "download_count": 1221206, + "project": "pytest-watch" + }, + { + "download_count": 1220741, + "project": "google-cloud-bigquery-storage" + }, + { + "download_count": 1218278, + "project": "django-ses" + }, + { + "download_count": 1217113, + "project": "luminol" + }, + { + "download_count": 1213653, + "project": "pyaes" + }, + { + "download_count": 1213392, + "project": "flask-mongoalchemy" + }, + { + "download_count": 1212483, + "project": "flake8-print" + }, + { + "download_count": 1208573, + "project": "resource" + }, + { + "download_count": 1207795, + "project": "stemming" + }, + { + "download_count": 1206452, + "project": "python-easyconfig" + }, + { + "download_count": 1206109, + "project": "jsonform" + }, + { + "download_count": 1205968, + "project": "jsonsir" + }, + { + "download_count": 1202856, + "project": "logbook" + }, + { + "download_count": 1198077, + "project": "import-from-github-com" + }, + { + "download_count": 1195471, + "project": "mss" + }, + { + "download_count": 1195405, + "project": "robotframework-requests" + }, + { + "download_count": 1194828, + "project": "nose2" + }, + { + "download_count": 1194314, + "project": "fusepy" + }, + { + "download_count": 1193288, + "project": "cmake" + }, + { + "download_count": 1192641, + "project": "httpbin" + }, + { + "download_count": 1190084, + "project": "graphql-server-core" + }, + { + "download_count": 1189375, + "project": "stestr" + }, + { + "download_count": 1188229, + "project": "recordclass" + }, + { + "download_count": 1186101, + "project": "django-bootstrap4" + }, + { + "download_count": 1181472, + "project": "tree-format" + }, + { + "download_count": 1180564, + "project": "django-guardian" + }, + { + "download_count": 1180286, + "project": "django-celery" + }, + { + "download_count": 1179046, + "project": "publicsuffix" + }, + { + "download_count": 1178235, + "project": "astropy" + }, + { + "download_count": 1177835, + "project": "konlpy" + }, + { + "download_count": 1174516, + "project": "threadloop" + }, + { + "download_count": 1174367, + "project": "radon" + }, + { + "download_count": 1172767, + "project": "azure-cli-profile" + }, + { + "download_count": 1172663, + "project": "jieba" + }, + { + "download_count": 1172300, + "project": "pyfakefs" + }, + { + "download_count": 1172278, + "project": "namedlist" + }, + { + "download_count": 1171988, + "project": "pubnub" + }, + { + "download_count": 1170778, + "project": "flasgger" + }, + { + "download_count": 1168270, + "project": "pymeeus" + }, + { + "download_count": 1164230, + "project": "transitions" + }, + { + "download_count": 1163775, + "project": "visitor" + }, + { + "download_count": 1161777, + "project": "django-redis-cache" + }, + { + "download_count": 1161264, + "project": "lmdb" + }, + { + "download_count": 1160572, + "project": "json-logging-py" + }, + { + "download_count": 1159436, + "project": "protobuf3-to-dict" + }, + { + "download_count": 1153262, + "project": "patch" + }, + { + "download_count": 1152875, + "project": "horovod" + }, + { + "download_count": 1152461, + "project": "pyzabbix" + }, + { + "download_count": 1148339, + "project": "tailer" + }, + { + "download_count": 1146680, + "project": "azure-cli-resource" + }, + { + "download_count": 1145300, + "project": "etcd3" + }, + { + "download_count": 1143148, + "project": "azure-cli-iot" + }, + { + "download_count": 1143069, + "project": "djangorestframework-xml" + }, + { + "download_count": 1139676, + "project": "logutils" + }, + { + "download_count": 1138222, + "project": "javaproperties" + }, + { + "download_count": 1137231, + "project": "azure-cli-extension" + }, + { + "download_count": 1137033, + "project": "python-telegram-bot" + }, + { + "download_count": 1135140, + "project": "platformio" + }, + { + "download_count": 1134846, + "project": "xvfbwrapper" + }, + { + "download_count": 1133241, + "project": "pytest-pythonpath" + }, + { + "download_count": 1129508, + "project": "google-cloud-iam" + }, + { + "download_count": 1129177, + "project": "pydrive" + }, + { + "download_count": 1128895, + "project": "minio" + }, + { + "download_count": 1128310, + "project": "python-heatclient" + }, + { + "download_count": 1127447, + "project": "azure-cli-dls" + }, + { + "download_count": 1127383, + "project": "demjson" + }, + { + "download_count": 1126928, + "project": "pygal" + }, + { + "download_count": 1123556, + "project": "azure-cli-role" + }, + { + "download_count": 1123087, + "project": "azure-cli-monitor" + }, + { + "download_count": 1121560, + "project": "azure-cli-storage" + }, + { + "download_count": 1121500, + "project": "azure-cli-sql" + }, + { + "download_count": 1121354, + "project": "azure-cli-keyvault" + }, + { + "download_count": 1121021, + "project": "azure-cli-network" + }, + { + "download_count": 1120955, + "project": "azure-cli-interactive" + }, + { + "download_count": 1120732, + "project": "azure-cli-container" + }, + { + "download_count": 1120661, + "project": "azure-cli-appservice" + }, + { + "download_count": 1120619, + "project": "azure-cli-lab" + }, + { + "download_count": 1120596, + "project": "pydub" + }, + { + "download_count": 1120448, + "project": "azure-cli-acr" + }, + { + "download_count": 1120440, + "project": "pem" + }, + { + "download_count": 1119943, + "project": "azure-cli-acs" + }, + { + "download_count": 1119731, + "project": "azure-cli-cognitiveservices" + }, + { + "download_count": 1118667, + "project": "azure-cli-batch" + }, + { + "download_count": 1118554, + "project": "azure-cli-rdbms" + }, + { + "download_count": 1118179, + "project": "dumbyaml" + }, + { + "download_count": 1118164, + "project": "azure-cli-cosmosdb" + }, + { + "download_count": 1117990, + "project": "azure-cli-dla" + }, + { + "download_count": 1117671, + "project": "azure-cli-vm" + }, + { + "download_count": 1117663, + "project": "graphite-web" + }, + { + "download_count": 1117633, + "project": "easy-thumbnails" + }, + { + "download_count": 1117629, + "project": "ggplot" + }, + { + "download_count": 1117326, + "project": "ncclient" + }, + { + "download_count": 1115734, + "project": "azure-cli-cdn" + }, + { + "download_count": 1115095, + "project": "ipyparallel" + }, + { + "download_count": 1114052, + "project": "uritemplate-py" + }, + { + "download_count": 1113849, + "project": "azure-cli-servicefabric" + }, + { + "download_count": 1112830, + "project": "azure-cli-batchai" + }, + { + "download_count": 1112111, + "project": "colander" + }, + { + "download_count": 1112004, + "project": "libhoney" + }, + { + "download_count": 1111031, + "project": "robotframework-selenium2library" + }, + { + "download_count": 1110924, + "project": "azure-cli-reservations" + }, + { + "download_count": 1110554, + "project": "selectors34" + }, + { + "download_count": 1109781, + "project": "python-redis-lock" + }, + { + "download_count": 1109474, + "project": "django-waffle" + }, + { + "download_count": 1109341, + "project": "construct" + }, + { + "download_count": 1107612, + "project": "pyhcl" + }, + { + "download_count": 1107023, + "project": "allure-python-commons" + }, + { + "download_count": 1106855, + "project": "opencv-python-headless" + }, + { + "download_count": 1104732, + "project": "nibabel" + }, + { + "download_count": 1104394, + "project": "ntplib" + }, + { + "download_count": 1101855, + "project": "gsutil" + }, + { + "download_count": 1099271, + "project": "python-redis" + }, + { + "download_count": 1099171, + "project": "honeycomb-beeline" + }, + { + "download_count": 1095266, + "project": "google-cloud-profiler" + }, + { + "download_count": 1094548, + "project": "djangorestframework-csv" + }, + { + "download_count": 1093507, + "project": "imageio-ffmpeg" + }, + { + "download_count": 1093006, + "project": "rpyc" + }, + { + "download_count": 1092127, + "project": "databricks-api" + }, + { + "download_count": 1091012, + "project": "django-otp" + }, + { + "download_count": 1089786, + "project": "atlassian-jwt-auth" + }, + { + "download_count": 1089668, + "project": "pyscreeze" + }, + { + "download_count": 1088119, + "project": "jsonlines" + }, + { + "download_count": 1087785, + "project": "google-cloud-scheduler" + }, + { + "download_count": 1086837, + "project": "py-moneyed" + }, + { + "download_count": 1086168, + "project": "prospector" + }, + { + "download_count": 1084845, + "project": "pyfcm" + }, + { + "download_count": 1084588, + "project": "leather" + }, + { + "download_count": 1083842, + "project": "flask-session" + }, + { + "download_count": 1083772, + "project": "flask-principal" + }, + { + "download_count": 1081797, + "project": "azure-mgmt-managedservices" + }, + { + "download_count": 1080061, + "project": "zope-sqlalchemy" + }, + { + "download_count": 1079118, + "project": "wikipedia" + }, + { + "download_count": 1078680, + "project": "pyopengl" + }, + { + "download_count": 1077281, + "project": "django-anymail" + }, + { + "download_count": 1075981, + "project": "cov-core" + }, + { + "download_count": 1075897, + "project": "azure-mgmt-netapp" + }, + { + "download_count": 1074798, + "project": "pytest-flake8" + }, + { + "download_count": 1071887, + "project": "requests-cache" + }, + { + "download_count": 1071617, + "project": "plaster-pastedeploy" + }, + { + "download_count": 1071057, + "project": "boxsdk" + }, + { + "download_count": 1070181, + "project": "numpydoc" + }, + { + "download_count": 1069130, + "project": "dodgy" + }, + { + "download_count": 1067802, + "project": "sphinxcontrib-httpdomain" + }, + { + "download_count": 1067667, + "project": "git-url-parse" + }, + { + "download_count": 1065839, + "project": "restructuredtext-lint" + }, + { + "download_count": 1063327, + "project": "django-storages-redux" + }, + { + "download_count": 1061635, + "project": "h2o-pysparkling-2-4" + }, + { + "download_count": 1060942, + "project": "flatbuffers" + }, + { + "download_count": 1059650, + "project": "webassets" + }, + { + "download_count": 1057175, + "project": "gdata" + }, + { + "download_count": 1055836, + "project": "pytest-pep8" + }, + { + "download_count": 1054787, + "project": "setoptconf" + }, + { + "download_count": 1053777, + "project": "flask-graphql" + }, + { + "download_count": 1051978, + "project": "lark-parser" + }, + { + "download_count": 1046552, + "project": "google-cloud-datacatalog" + }, + { + "download_count": 1045356, + "project": "requirements-detector" + }, + { + "download_count": 1043870, + "project": "google-cloud-talent" + }, + { + "download_count": 1043546, + "project": "utils" + }, + { + "download_count": 1043075, + "project": "google-cloud-datalabeling" + }, + { + "download_count": 1042791, + "project": "django-mailgun" + }, + { + "download_count": 1041833, + "project": "google-cloud-os-login" + }, + { + "download_count": 1040789, + "project": "plaster" + }, + { + "download_count": 1040645, + "project": "google-cloud-webrisk" + }, + { + "download_count": 1040329, + "project": "beaker" + }, + { + "download_count": 1039677, + "project": "django-fsm" + }, + { + "download_count": 1039618, + "project": "grpcio-health-checking" + }, + { + "download_count": 1039569, + "project": "flask-apispec" + }, + { + "download_count": 1037586, + "project": "flake8-comprehensions" + }, + { + "download_count": 1036471, + "project": "pylint-flask" + }, + { + "download_count": 1036185, + "project": "pygerduty" + }, + { + "download_count": 1036096, + "project": "pudb" + }, + { + "download_count": 1036044, + "project": "biopython" + }, + { + "download_count": 1035148, + "project": "brewer2mpl" + }, + { + "download_count": 1034346, + "project": "rpy2" + }, + { + "download_count": 1033958, + "project": "dash-table" + }, + { + "download_count": 1033827, + "project": "base58" + }, + { + "download_count": 1033818, + "project": "proto-google-cloud-pubsub-v1" + }, + { + "download_count": 1033419, + "project": "maxminddb-geolite2" + }, + { + "download_count": 1032216, + "project": "bravado-core" + }, + { + "download_count": 1031978, + "project": "starlette" + }, + { + "download_count": 1031797, + "project": "cftime" + }, + { + "download_count": 1030527, + "project": "papermill" + }, + { + "download_count": 1030356, + "project": "pytest-aiohttp" + }, + { + "download_count": 1028784, + "project": "neotime" + }, + { + "download_count": 1028024, + "project": "django-grappelli" + }, + { + "download_count": 1026556, + "project": "csvkit" + }, + { + "download_count": 1026453, + "project": "azure-mgmt-appconfiguration" + }, + { + "download_count": 1025532, + "project": "mando" + }, + { + "download_count": 1025061, + "project": "python-pptx" + }, + { + "download_count": 1024849, + "project": "futurist" + }, + { + "download_count": 1024564, + "project": "tfx" + }, + { + "download_count": 1023148, + "project": "shyaml" + }, + { + "download_count": 1020560, + "project": "whoosh" + }, + { + "download_count": 1019249, + "project": "netcdf4" + }, + { + "download_count": 1018441, + "project": "braintree" + }, + { + "download_count": 1017498, + "project": "pylint-celery" + }, + { + "download_count": 1015935, + "project": "pyautogui" + }, + { + "download_count": 1015329, + "project": "uritools" + }, + { + "download_count": 1014941, + "project": "openshift" + }, + { + "download_count": 1014682, + "project": "jinjasql" + }, + { + "download_count": 1011470, + "project": "bunch" + }, + { + "download_count": 1011345, + "project": "tribool" + }, + { + "download_count": 1010041, + "project": "shade" + }, + { + "download_count": 1009923, + "project": "geoalchemy2" + }, + { + "download_count": 1007914, + "project": "stups-tokens" + }, + { + "download_count": 1007728, + "project": "django-health-check" + }, + { + "download_count": 1006511, + "project": "ansiwrap" + }, + { + "download_count": 1005973, + "project": "djangorestframework-simplejwt" + }, + { + "download_count": 1004447, + "project": "repoze-who" + }, + { + "download_count": 1003341, + "project": "u-msgpack-python" + }, + { + "download_count": 1002884, + "project": "psycogreen" + }, + { + "download_count": 1002180, + "project": "pyroute2" + }, + { + "download_count": 997107, + "project": "impyla" + }, + { + "download_count": 997057, + "project": "functools" + }, + { + "download_count": 995470, + "project": "rq-scheduler" + }, + { + "download_count": 995174, + "project": "xarray" + }, + { + "download_count": 995018, + "project": "dictionaries" + }, + { + "download_count": 995017, + "project": "django-haystack" + }, + { + "download_count": 992160, + "project": "check-manifest" + }, + { + "download_count": 990507, + "project": "python-rapidjson" + }, + { + "download_count": 989611, + "project": "py-vapid" + }, + { + "download_count": 989525, + "project": "textwrap3" + }, + { + "download_count": 988451, + "project": "soundfile" + }, + { + "download_count": 987924, + "project": "python-string-utils" + }, + { + "download_count": 987136, + "project": "pywinauto" + }, + { + "download_count": 985267, + "project": "oslo-db" + }, + { + "download_count": 984514, + "project": "xmlrunner" + }, + { + "download_count": 983293, + "project": "pymdown-extensions" + }, + { + "download_count": 982272, + "project": "sphinx-autobuild" + }, + { + "download_count": 981717, + "project": "django-ckeditor" + }, + { + "download_count": 979521, + "project": "sorl-thumbnail" + }, + { + "download_count": 979220, + "project": "pysmb" + }, + { + "download_count": 978290, + "project": "pymsgbox" + }, + { + "download_count": 977363, + "project": "gapic-google-cloud-pubsub-v1" + }, + { + "download_count": 977316, + "project": "flake8-isort" + }, + { + "download_count": 976939, + "project": "tensorflow-probability" + }, + { + "download_count": 976069, + "project": "oslo-messaging" + }, + { + "download_count": 975772, + "project": "python-coveralls" + }, + { + "download_count": 975418, + "project": "flex" + }, + { + "download_count": 973597, + "project": "seleniumbase" + }, + { + "download_count": 972851, + "project": "flake8-commas" + }, + { + "download_count": 972025, + "project": "dirq" + }, + { + "download_count": 971725, + "project": "glfw" + }, + { + "download_count": 968128, + "project": "trains" + }, + { + "download_count": 967325, + "project": "hjson" + }, + { + "download_count": 966886, + "project": "fs" + }, + { + "download_count": 965395, + "project": "pyahocorasick" + }, + { + "download_count": 965068, + "project": "pytest-repeat" + }, + { + "download_count": 964628, + "project": "swagger-ui-bundle" + }, + { + "download_count": 964597, + "project": "typing-inspect" + }, + { + "download_count": 964448, + "project": "sagemaker" + }, + { + "download_count": 964057, + "project": "vobject" + }, + { + "download_count": 963489, + "project": "dbfread" + }, + { + "download_count": 962456, + "project": "bidict" + }, + { + "download_count": 960677, + "project": "google-python-cloud-debugger" + }, + { + "download_count": 958036, + "project": "cognite-sdk" + }, + { + "download_count": 957690, + "project": "vulture" + }, + { + "download_count": 957559, + "project": "pytweening" + }, + { + "download_count": 954913, + "project": "circleci" + }, + { + "download_count": 954734, + "project": "onnxmltools" + }, + { + "download_count": 953896, + "project": "django-jsonfield" + }, + { + "download_count": 952673, + "project": "skl2onnx" + }, + { + "download_count": 951906, + "project": "azure-cli-configure" + }, + { + "download_count": 951530, + "project": "readerwriterlock" + }, + { + "download_count": 951124, + "project": "django-silk" + }, + { + "download_count": 948790, + "project": "json-log-formatter" + }, + { + "download_count": 948696, + "project": "stups-zign" + }, + { + "download_count": 948084, + "project": "commentjson" + }, + { + "download_count": 947759, + "project": "opentracing-instrumentation" + }, + { + "download_count": 947140, + "project": "hurry-filesize" + }, + { + "download_count": 946596, + "project": "httpie" + }, + { + "download_count": 945434, + "project": "comtypes" + }, + { + "download_count": 944648, + "project": "azure-cli-cloud" + }, + { + "download_count": 942122, + "project": "stups-cli-support" + }, + { + "download_count": 941812, + "project": "textfsm" + }, + { + "download_count": 941227, + "project": "django-bulk-update" + }, + { + "download_count": 940485, + "project": "pydotplus" + }, + { + "download_count": 939994, + "project": "logilab-common" + }, + { + "download_count": 939219, + "project": "thriftpy2" + }, + { + "download_count": 937977, + "project": "pyldap" + }, + { + "download_count": 937103, + "project": "progressbar" + }, + { + "download_count": 936822, + "project": "limits" + }, + { + "download_count": 935302, + "project": "empy" + }, + { + "download_count": 933336, + "project": "interval" + }, + { + "download_count": 933102, + "project": "twitter-common-lang" + }, + { + "download_count": 932594, + "project": "sanic" + }, + { + "download_count": 932344, + "project": "twitter-common-dirutil" + }, + { + "download_count": 931618, + "project": "uhashring" + }, + { + "download_count": 929734, + "project": "asana" + }, + { + "download_count": 926851, + "project": "base64io" + }, + { + "download_count": 925789, + "project": "django-user-agents" + }, + { + "download_count": 924447, + "project": "reno" + }, + { + "download_count": 923715, + "project": "netmiko" + }, + { + "download_count": 923299, + "project": "twitter-common-options" + }, + { + "download_count": 923153, + "project": "twitter-common-log" + }, + { + "download_count": 923141, + "project": "parsley" + }, + { + "download_count": 921602, + "project": "azure-cli-find" + }, + { + "download_count": 920951, + "project": "azure-cli-redis" + }, + { + "download_count": 920654, + "project": "aws-encryption-sdk-cli" + }, + { + "download_count": 920109, + "project": "stop-words" + }, + { + "download_count": 919963, + "project": "azure-cli-consumption" + }, + { + "download_count": 919735, + "project": "pydevd" + }, + { + "download_count": 919608, + "project": "azure-cli-billing" + }, + { + "download_count": 919364, + "project": "azure-cli-feedback" + }, + { + "download_count": 919204, + "project": "click-log" + }, + { + "download_count": 916168, + "project": "pypd" + }, + { + "download_count": 914683, + "project": "azure-cli-advisor" + }, + { + "download_count": 914682, + "project": "neobolt" + }, + { + "download_count": 911537, + "project": "azure-cli-eventgrid" + }, + { + "download_count": 911471, + "project": "annoy" + }, + { + "download_count": 910544, + "project": "scramp" + }, + { + "download_count": 910046, + "project": "azure-cli-backup" + }, + { + "download_count": 908651, + "project": "flask-assets" + }, + { + "download_count": 908244, + "project": "oslo-service" + }, + { + "download_count": 905587, + "project": "flask-bootstrap" + }, + { + "download_count": 903282, + "project": "proglog" + }, + { + "download_count": 903200, + "project": "keras2onnx" + }, + { + "download_count": 902334, + "project": "plyvel" + }, + { + "download_count": 900779, + "project": "pybluez" + }, + { + "download_count": 899502, + "project": "pyudev" + }, + { + "download_count": 899012, + "project": "testrepository" + }, + { + "download_count": 898793, + "project": "oslo-policy" + }, + { + "download_count": 897914, + "project": "pmdarima" + }, + { + "download_count": 897653, + "project": "django-autocomplete-light" + }, + { + "download_count": 895791, + "project": "artifactory" + }, + { + "download_count": 895766, + "project": "pytest-variables" + }, + { + "download_count": 895437, + "project": "azure-cli-eventhubs" + }, + { + "download_count": 895142, + "project": "twitter-common-collections" + }, + { + "download_count": 894979, + "project": "azure-cli-servicebus" + }, + { + "download_count": 894815, + "project": "testresources" + }, + { + "download_count": 894191, + "project": "pybs" + }, + { + "download_count": 893842, + "project": "azure-cli-dms" + }, + { + "download_count": 893592, + "project": "channels-redis" + }, + { + "download_count": 893412, + "project": "junitparser" + }, + { + "download_count": 891540, + "project": "tifffile" + }, + { + "download_count": 891533, + "project": "easydict" + }, + { + "download_count": 891481, + "project": "json2parquet" + }, + { + "download_count": 891341, + "project": "pyicu" + }, + { + "download_count": 888690, + "project": "azure-cli-ams" + }, + { + "download_count": 886402, + "project": "pyeapi" + }, + { + "download_count": 885171, + "project": "python-gilt" + }, + { + "download_count": 884033, + "project": "azure-cli-search" + }, + { + "download_count": 882989, + "project": "jupyter-nbextensions-configurator" + }, + { + "download_count": 881790, + "project": "monthdelta" + }, + { + "download_count": 880765, + "project": "pynput" + }, + { + "download_count": 880406, + "project": "pyfiglet" + }, + { + "download_count": 878563, + "project": "jsonnet" + }, + { + "download_count": 874987, + "project": "pvlib" + }, + { + "download_count": 874000, + "project": "jupyter-contrib-core" + }, + { + "download_count": 872790, + "project": "mockito" + }, + { + "download_count": 872554, + "project": "nosexcover" + }, + { + "download_count": 872485, + "project": "peakutils" + }, + { + "download_count": 872331, + "project": "rednose" + }, + { + "download_count": 872127, + "project": "ansicolors" + }, + { + "download_count": 871498, + "project": "j2cli" + }, + { + "download_count": 868629, + "project": "awsiotpythonsdk" + }, + { + "download_count": 867297, + "project": "pywfm" + }, + { + "download_count": 866741, + "project": "lml" + }, + { + "download_count": 865346, + "project": "imblearn" + }, + { + "download_count": 863870, + "project": "openstackdocstheme" + }, + { + "download_count": 863120, + "project": "jupyter-contrib-nbextensions" + }, + { + "download_count": 860421, + "project": "molecule" + }, + { + "download_count": 858716, + "project": "zstandard" + }, + { + "download_count": 858408, + "project": "pyqrcode" + }, + { + "download_count": 856466, + "project": "line-profiler" + }, + { + "download_count": 856334, + "project": "flask-api" + }, + { + "download_count": 856299, + "project": "honcho" + }, + { + "download_count": 856226, + "project": "jplephem" + }, + { + "download_count": 855767, + "project": "rpqueue" + }, + { + "download_count": 854839, + "project": "autoflake" + }, + { + "download_count": 854260, + "project": "azure-mgmt-apimanagement" + }, + { + "download_count": 854182, + "project": "cognite-model-hosting" + }, + { + "download_count": 852933, + "project": "pytest-dependency" + }, + { + "download_count": 852580, + "project": "pytest-pylint" + }, + { + "download_count": 852418, + "project": "deepmerge" + }, + { + "download_count": 850683, + "project": "jupyter-latex-envs" + }, + { + "download_count": 849484, + "project": "polyline" + }, + { + "download_count": 849092, + "project": "yappi" + }, + { + "download_count": 849002, + "project": "logmatic-python" + }, + { + "download_count": 848508, + "project": "sgp4" + }, + { + "download_count": 848205, + "project": "onnxconverter-common" + }, + { + "download_count": 847724, + "project": "django-pipeline" + }, + { + "download_count": 847508, + "project": "envs" + }, + { + "download_count": 847487, + "project": "jupyter-highlight-selected-word" + }, + { + "download_count": 846088, + "project": "googletrans" + }, + { + "download_count": 845652, + "project": "mkdocs-material" + }, + { + "download_count": 845331, + "project": "django-bootstrap3" + }, + { + "download_count": 843583, + "project": "isoweek" + }, + { + "download_count": 843510, + "project": "image" + }, + { + "download_count": 842232, + "project": "solartime" + }, + { + "download_count": 841714, + "project": "flask-debugtoolbar" + }, + { + "download_count": 840214, + "project": "rasterio" + }, + { + "download_count": 839139, + "project": "diamond" + }, + { + "download_count": 837673, + "project": "mailchimp3" + }, + { + "download_count": 835610, + "project": "oslo-middleware" + }, + { + "download_count": 835257, + "project": "mutagen" + }, + { + "download_count": 834695, + "project": "catalogue" + }, + { + "download_count": 834133, + "project": "faulthandler" + }, + { + "download_count": 832671, + "project": "sacrebleu" + }, + { + "download_count": 832545, + "project": "python-jose-cryptodome" + }, + { + "download_count": 831517, + "project": "zeroconf" + }, + { + "download_count": 830534, + "project": "jinja2-pluralize" + }, + { + "download_count": 829948, + "project": "suds-py3" + }, + { + "download_count": 829228, + "project": "pandasql" + }, + { + "download_count": 828892, + "project": "logstash-formatter" + }, + { + "download_count": 828549, + "project": "lifelines" + }, + { + "download_count": 827727, + "project": "liac-arff" + }, + { + "download_count": 827554, + "project": "diff-cover" + }, + { + "download_count": 826205, + "project": "elastic-apm" + }, + { + "download_count": 826135, + "project": "django-coverage-plugin" + }, + { + "download_count": 825300, + "project": "skyfield" + }, + { + "download_count": 824924, + "project": "drf-extensions" + }, + { + "download_count": 823613, + "project": "databricks-pypi-extras" + }, + { + "download_count": 823180, + "project": "azure-cli-relay" + }, + { + "download_count": 822954, + "project": "azure-cli-iotcentral" + }, + { + "download_count": 822898, + "project": "azure-cli-hdinsight" + }, + { + "download_count": 822664, + "project": "azure-cli-maps" + }, + { + "download_count": 822562, + "project": "azure-cli-botservice" + }, + { + "download_count": 822180, + "project": "azure-cli-signalr" + }, + { + "download_count": 822129, + "project": "lime" + }, + { + "download_count": 821534, + "project": "transifex-client" + }, + { + "download_count": 820293, + "project": "azure-cli-policyinsights" + }, + { + "download_count": 819714, + "project": "django-classy-tags" + }, + { + "download_count": 818561, + "project": "clickhouse-driver" + }, + { + "download_count": 815459, + "project": "scrapy-splash" + }, + { + "download_count": 815166, + "project": "pybrake" + }, + { + "download_count": 814136, + "project": "carbon" + }, + { + "download_count": 813628, + "project": "wmi" + }, + { + "download_count": 810452, + "project": "python-ironicclient" + }, + { + "download_count": 808082, + "project": "pusher" + }, + { + "download_count": 806951, + "project": "datadiff" + }, + { + "download_count": 806876, + "project": "js2py" + }, + { + "download_count": 805430, + "project": "urlobject" + }, + { + "download_count": 804845, + "project": "tinydb" + }, + { + "download_count": 804621, + "project": "pytest-randomly" + }, + { + "download_count": 804371, + "project": "placebo" + }, + { + "download_count": 804270, + "project": "progress" + }, + { + "download_count": 804201, + "project": "nimbusml" + }, + { + "download_count": 803677, + "project": "ffmpeg-python" + }, + { + "download_count": 803390, + "project": "pandas-profiling" + }, + { + "download_count": 803033, + "project": "pyspark-flame" + }, + { + "download_count": 802518, + "project": "nose-xunitmp" + }, + { + "download_count": 801270, + "project": "ftputil" + }, + { + "download_count": 800466, + "project": "pyexcel-io" + }, + { + "download_count": 800452, + "project": "pysam" + }, + { + "download_count": 800033, + "project": "oslo-cache" + }, + { + "download_count": 799400, + "project": "jinja2schema" + }, + { + "download_count": 797811, + "project": "skyfield-data" + }, + { + "download_count": 797080, + "project": "bashate" + }, + { + "download_count": 796778, + "project": "pytest-base-url" + }, + { + "download_count": 795722, + "project": "mpld3" + }, + { + "download_count": 795138, + "project": "pytest-selenium" + }, + { + "download_count": 794945, + "project": "facebookads" + }, + { + "download_count": 792726, + "project": "testing-common-database" + }, + { + "download_count": 792699, + "project": "requests-unixsocket" + }, + { + "download_count": 791454, + "project": "ansible-tower-cli" + }, + { + "download_count": 790178, + "project": "dlib" + }, + { + "download_count": 788016, + "project": "web3" + }, + { + "download_count": 787379, + "project": "pygresql" + }, + { + "download_count": 786501, + "project": "update-checker" + }, + { + "download_count": 784385, + "project": "pygetwindow" + }, + { + "download_count": 783264, + "project": "allure-pytest" + }, + { + "download_count": 782719, + "project": "pycontracts" + }, + { + "download_count": 782492, + "project": "wsgi-request-logger" + }, + { + "download_count": 780141, + "project": "m2crypto" + }, + { + "download_count": 779854, + "project": "scrapyd" + }, + { + "download_count": 779681, + "project": "centrosome" + }, + { + "download_count": 779517, + "project": "flask-mongoengine" + }, + { + "download_count": 778027, + "project": "dataclasses-json" + }, + { + "download_count": 777762, + "project": "splinter" + }, + { + "download_count": 777345, + "project": "htmlparser" + }, + { + "download_count": 775376, + "project": "loguru" + }, + { + "download_count": 774793, + "project": "dumb-init" + }, + { + "download_count": 774504, + "project": "python-designateclient" + }, + { + "download_count": 774495, + "project": "speaklater" + }, + { + "download_count": 773679, + "project": "eth-utils" + }, + { + "download_count": 772719, + "project": "spark-df-profiling" + }, + { + "download_count": 772355, + "project": "javabridge" + }, + { + "download_count": 771179, + "project": "us" + }, + { + "download_count": 769552, + "project": "xdg" + }, + { + "download_count": 769306, + "project": "librabbitmq" + }, + { + "download_count": 769240, + "project": "lepl" + }, + { + "download_count": 769163, + "project": "pysolr" + }, + { + "download_count": 768526, + "project": "google-cloud-happybase" + }, + { + "download_count": 768426, + "project": "graphene-sqlalchemy" + }, + { + "download_count": 768057, + "project": "google-endpoints-api-management" + }, + { + "download_count": 767991, + "project": "affine" + }, + { + "download_count": 767570, + "project": "colour" + }, + { + "download_count": 764562, + "project": "django-constance" + }, + { + "download_count": 762359, + "project": "infinity" + }, + { + "download_count": 761920, + "project": "djangorestframework-filters" + }, + { + "download_count": 760164, + "project": "robotremoteserver" + }, + { + "download_count": 759992, + "project": "keystonemiddleware" + }, + { + "download_count": 758677, + "project": "distribute" + }, + { + "download_count": 757044, + "project": "hyper" + }, + { + "download_count": 755707, + "project": "pyscreenshot" + }, + { + "download_count": 755554, + "project": "google-endpoints" + }, + { + "download_count": 754592, + "project": "intervals" + }, + { + "download_count": 754564, + "project": "pysal" + }, + { + "download_count": 754317, + "project": "svgwrite" + }, + { + "download_count": 753732, + "project": "cognite-logger" + }, + { + "download_count": 753586, + "project": "pytest-spark" + }, + { + "download_count": 753503, + "project": "nose-parallel" + }, + { + "download_count": 753048, + "project": "dynaconf" + }, + { + "download_count": 752651, + "project": "mahotas" + }, + { + "download_count": 751112, + "project": "databricks-pypi" + }, + { + "download_count": 749141, + "project": "mysql" + }, + { + "download_count": 749102, + "project": "flake8-builtins" + }, + { + "download_count": 748778, + "project": "humpty" + }, + { + "download_count": 748490, + "project": "pyspark-dist-explore" + }, + { + "download_count": 746836, + "project": "django-annoying" + }, + { + "download_count": 746781, + "project": "tinyrpc" + }, + { + "download_count": 746415, + "project": "wincertstore" + }, + { + "download_count": 745591, + "project": "django-axes" + }, + { + "download_count": 742692, + "project": "aerospike" + }, + { + "download_count": 739560, + "project": "pycadf" + }, + { + "download_count": 739333, + "project": "django-csp" + }, + { + "download_count": 737212, + "project": "django-compat" + }, + { + "download_count": 735567, + "project": "azure-cli-security" + }, + { + "download_count": 735347, + "project": "asyncssh" + }, + { + "download_count": 734370, + "project": "robotframework-sshlibrary" + }, + { + "download_count": 734265, + "project": "concurrentloghandler" + }, + { + "download_count": 734033, + "project": "django-object-actions" + }, + { + "download_count": 733362, + "project": "azure-cli-kusto" + }, + { + "download_count": 733347, + "project": "tensorflowonspark" + }, + { + "download_count": 732849, + "project": "aioresponses" + }, + { + "download_count": 731576, + "project": "jenkins-job-builder" + }, + { + "download_count": 731088, + "project": "bravado" + }, + { + "download_count": 728665, + "project": "prometheus-flask-exporter" + }, + { + "download_count": 727540, + "project": "pprint" + }, + { + "download_count": 726931, + "project": "jaeger-client" + }, + { + "download_count": 726893, + "project": "nose-parameterized" + }, + { + "download_count": 726613, + "project": "pyrect" + }, + { + "download_count": 726590, + "project": "htcondor" + }, + { + "download_count": 723307, + "project": "pip-licenses" + }, + { + "download_count": 723172, + "project": "mlxtend" + }, + { + "download_count": 721353, + "project": "py2-ipaddress" + }, + { + "download_count": 719973, + "project": "osprofiler" + }, + { + "download_count": 719532, + "project": "pandas-datareader" + }, + { + "download_count": 718534, + "project": "ngram" + }, + { + "download_count": 718362, + "project": "h2o" + }, + { + "download_count": 717198, + "project": "homeassistant" + }, + { + "download_count": 716605, + "project": "pytest-mypy" + }, + { + "download_count": 716398, + "project": "eth-typing" + }, + { + "download_count": 716263, + "project": "django-auth-ldap" + }, + { + "download_count": 714558, + "project": "jsonmerge" + }, + { + "download_count": 714088, + "project": "django-cacheops" + }, + { + "download_count": 713825, + "project": "python-bioformats" + }, + { + "download_count": 713644, + "project": "stomp-py" + }, + { + "download_count": 713346, + "project": "scrypt" + }, + { + "download_count": 710233, + "project": "prokaryote" + }, + { + "download_count": 709352, + "project": "testing-postgresql" + }, + { + "download_count": 708670, + "project": "azure-cli-sqlvm" + }, + { + "download_count": 708401, + "project": "shrub-py" + }, + { + "download_count": 708219, + "project": "django-tinymce" + }, + { + "download_count": 708181, + "project": "scrapyd-client" + }, + { + "download_count": 707527, + "project": "apiclient" + }, + { + "download_count": 707254, + "project": "imgaug" + }, + { + "download_count": 707113, + "project": "nbsphinx" + }, + { + "download_count": 707083, + "project": "waiting" + }, + { + "download_count": 705264, + "project": "colorclass" + }, + { + "download_count": 703706, + "project": "consul-kv" + }, + { + "download_count": 702978, + "project": "html" + }, + { + "download_count": 702738, + "project": "rlp" + }, + { + "download_count": 702351, + "project": "nose-cov" + }, + { + "download_count": 702193, + "project": "python-twitter" + }, + { + "download_count": 701163, + "project": "splunk-sdk" + }, + { + "download_count": 700250, + "project": "fastcluster" + }, + { + "download_count": 698719, + "project": "yamale" + }, + { + "download_count": 698219, + "project": "pyramid-arima" + }, + { + "download_count": 697868, + "project": "termstyle" + }, + { + "download_count": 697474, + "project": "xstatic-bootstrap-scss" + }, + { + "download_count": 695211, + "project": "pyrouge" + }, + { + "download_count": 694603, + "project": "snuggs" + }, + { + "download_count": 693279, + "project": "python-barbicanclient" + }, + { + "download_count": 693249, + "project": "pyaudio" + }, + { + "download_count": 692957, + "project": "cvxpy" + }, + { + "download_count": 692001, + "project": "async-lru" + }, + { + "download_count": 691907, + "project": "mizani" + }, + { + "download_count": 691307, + "project": "petname" + }, + { + "download_count": 691300, + "project": "rouge" + }, + { + "download_count": 689543, + "project": "agate-dbf" + }, + { + "download_count": 688981, + "project": "fastapi" + }, + { + "download_count": 687783, + "project": "category-encoders" + }, + { + "download_count": 687548, + "project": "oyaml" + }, + { + "download_count": 687522, + "project": "gnureadline" + }, + { + "download_count": 687081, + "project": "rake-nltk" + }, + { + "download_count": 686921, + "project": "titlecase" + }, + { + "download_count": 685900, + "project": "robotframework-pabot" + }, + { + "download_count": 685000, + "project": "pygraphviz" + }, + { + "download_count": 684549, + "project": "awesome-slugify" + }, + { + "download_count": 684157, + "project": "ibmiotf" + }, + { + "download_count": 683792, + "project": "cpplint" + }, + { + "download_count": 683191, + "project": "transforms3d" + }, + { + "download_count": 681681, + "project": "junos-eznc" + }, + { + "download_count": 680817, + "project": "edn-format" + }, + { + "download_count": 680484, + "project": "kappa" + }, + { + "download_count": 680439, + "project": "dist-keras" + }, + { + "download_count": 679352, + "project": "wagtail" + }, + { + "download_count": 679107, + "project": "xstatic" + }, + { + "download_count": 678488, + "project": "sparkpost" + }, + { + "download_count": 677907, + "project": "django-configurations" + }, + { + "download_count": 676671, + "project": "warrant" + }, + { + "download_count": 675669, + "project": "coremltools" + }, + { + "download_count": 675660, + "project": "pystemmer" + }, + { + "download_count": 674957, + "project": "piexif" + }, + { + "download_count": 674880, + "project": "xstatic-jquery" + }, + { + "download_count": 674487, + "project": "ebaysdk" + }, + { + "download_count": 672829, + "project": "durationpy" + }, + { + "download_count": 670913, + "project": "odo" + }, + { + "download_count": 670060, + "project": "django-admin-rangefilter" + }, + { + "download_count": 669445, + "project": "pytrie" + }, + { + "download_count": 669083, + "project": "wxpython" + }, + { + "download_count": 667717, + "project": "ovs" + }, + { + "download_count": 667474, + "project": "ecos" + }, + { + "download_count": 666906, + "project": "tinycss" + }, + { + "download_count": 666871, + "project": "osqp" + }, + { + "download_count": 666786, + "project": "eth-hash" + }, + { + "download_count": 666275, + "project": "requirements-parser" + }, + { + "download_count": 665693, + "project": "glom" + }, + { + "download_count": 661492, + "project": "cbor" + }, + { + "download_count": 661312, + "project": "typeguard" + }, + { + "download_count": 660570, + "project": "auth0-python" + }, + { + "download_count": 660013, + "project": "grpcio-opentracing" + }, + { + "download_count": 659377, + "project": "fastcache" + }, + { + "download_count": 659193, + "project": "eth-abi" + }, + { + "download_count": 659114, + "project": "django-modelcluster" + }, + { + "download_count": 657030, + "project": "jgscm" + }, + { + "download_count": 656904, + "project": "xlocal" + }, + { + "download_count": 656475, + "project": "plotnine" + }, + { + "download_count": 655373, + "project": "oslo-reports" + }, + { + "download_count": 654961, + "project": "selectors2" + }, + { + "download_count": 653743, + "project": "pyexcel" + }, + { + "download_count": 653621, + "project": "mongoalchemy" + }, + { + "download_count": 652980, + "project": "django-celery-monitor" + }, + { + "download_count": 652428, + "project": "django-modeltranslation" + }, + { + "download_count": 651995, + "project": "m3-cdecimal" + }, + { + "download_count": 651743, + "project": "django-prometheus" + }, + { + "download_count": 649810, + "project": "pylama" + }, + { + "download_count": 649753, + "project": "pygtrie" + }, + { + "download_count": 649300, + "project": "zappa" + }, + { + "download_count": 648596, + "project": "lambda-packages" + }, + { + "download_count": 648298, + "project": "chainmap" + }, + { + "download_count": 648259, + "project": "sqlitedict" + }, + { + "download_count": 646634, + "project": "weakrefmethod" + }, + { + "download_count": 646583, + "project": "pyephem" + }, + { + "download_count": 646316, + "project": "pecan" + }, + { + "download_count": 646192, + "project": "grpcio-testing" + }, + { + "download_count": 645984, + "project": "ptpython" + }, + { + "download_count": 645726, + "project": "uwsgitop" + }, + { + "download_count": 645705, + "project": "xattr" + }, + { + "download_count": 645542, + "project": "sseclient" + }, + { + "download_count": 644773, + "project": "distance" + }, + { + "download_count": 641990, + "project": "crayons" + }, + { + "download_count": 641666, + "project": "scs" + }, + { + "download_count": 641155, + "project": "youtube-dl-server" + }, + { + "download_count": 640583, + "project": "pydicom" + }, + { + "download_count": 640562, + "project": "disklist" + }, + { + "download_count": 640283, + "project": "oslo-versionedobjects" + }, + { + "download_count": 639381, + "project": "property-manager" + }, + { + "download_count": 639343, + "project": "pyramid-tm" + }, + { + "download_count": 638235, + "project": "civis" + }, + { + "download_count": 638153, + "project": "flask-sslify" + }, + { + "download_count": 637064, + "project": "tflearn" + }, + { + "download_count": 635676, + "project": "pygeoif" + }, + { + "download_count": 635375, + "project": "anytree" + }, + { + "download_count": 634585, + "project": "prawcore" + }, + { + "download_count": 633579, + "project": "httmock" + }, + { + "download_count": 633551, + "project": "praw" + }, + { + "download_count": 633536, + "project": "blaze" + }, + { + "download_count": 630085, + "project": "dogstatsd-python" + }, + { + "download_count": 629789, + "project": "df2gspread" + }, + { + "download_count": 629728, + "project": "intelhex" + }, + { + "download_count": 628881, + "project": "flask-pymongo" + }, + { + "download_count": 628208, + "project": "ara" + }, + { + "download_count": 628016, + "project": "supervisor-checks" + }, + { + "download_count": 626928, + "project": "portpicker" + }, + { + "download_count": 626822, + "project": "willow" + }, + { + "download_count": 624147, + "project": "django-admin-sortable2" + }, + { + "download_count": 623219, + "project": "py2neo" + }, + { + "download_count": 622538, + "project": "dis3" + }, + { + "download_count": 621132, + "project": "dask-ml" + }, + { + "download_count": 620942, + "project": "doc8" + }, + { + "download_count": 620211, + "project": "duo-client" + }, + { + "download_count": 620141, + "project": "django-rq" + }, + { + "download_count": 619804, + "project": "cronex" + }, + { + "download_count": 619350, + "project": "quandl" + }, + { + "download_count": 616490, + "project": "fpdf" + }, + { + "download_count": 615575, + "project": "dpkt" + }, + { + "download_count": 615407, + "project": "img2pdf" + }, + { + "download_count": 614677, + "project": "twython" + }, + { + "download_count": 612945, + "project": "django-tastypie" + }, + { + "download_count": 612710, + "project": "fastkml" + }, + { + "download_count": 611741, + "project": "pychef" + }, + { + "download_count": 611286, + "project": "pbkdf2" + }, + { + "download_count": 611114, + "project": "envparse" + }, + { + "download_count": 610989, + "project": "pytest-profiling" + }, + { + "download_count": 610971, + "project": "face" + }, + { + "download_count": 609341, + "project": "sphinxcontrib-plantuml" + }, + { + "download_count": 609245, + "project": "pockets" + }, + { + "download_count": 609190, + "project": "pex" + }, + { + "download_count": 607985, + "project": "codacy-coverage" + }, + { + "download_count": 607915, + "project": "smtpapi" + }, + { + "download_count": 607247, + "project": "recordtype" + }, + { + "download_count": 604747, + "project": "django-sekizai" + }, + { + "download_count": 604376, + "project": "glances" + }, + { + "download_count": 603378, + "project": "pysha3" + }, + { + "download_count": 602654, + "project": "sphinxcontrib-napoleon" + }, + { + "download_count": 601446, + "project": "authlib" + }, + { + "download_count": 601374, + "project": "python-intercom" + }, + { + "download_count": 600575, + "project": "flask-limiter" + }, + { + "download_count": 600277, + "project": "python-statsd" + }, + { + "download_count": 599602, + "project": "draftjs-exporter" + }, + { + "download_count": 598699, + "project": "flake8-debugger" + }, + { + "download_count": 598674, + "project": "oslo-upgradecheck" + }, + { + "download_count": 598119, + "project": "libvirt-python" + }, + { + "download_count": 597629, + "project": "cron-descriptor" + }, + { + "download_count": 597332, + "project": "wsproto" + }, + { + "download_count": 597238, + "project": "asyncio-nats-client" + }, + { + "download_count": 597234, + "project": "pytorch-pretrained-bert" + }, + { + "download_count": 597090, + "project": "fixture" + }, + { + "download_count": 596614, + "project": "alpha-vantage" + }, + { + "download_count": 596308, + "project": "edgegrid-python" + }, + { + "download_count": 596233, + "project": "eth-keys" + }, + { + "download_count": 596043, + "project": "impacket" + }, + { + "download_count": 595545, + "project": "win-inet-pton" + }, + { + "download_count": 595350, + "project": "mox3" + }, + { + "download_count": 595102, + "project": "rarfile" + }, + { + "download_count": 593426, + "project": "yarn-api-client" + }, + { + "download_count": 593291, + "project": "colored" + }, + { + "download_count": 592042, + "project": "txaws" + }, + { + "download_count": 591199, + "project": "speechrecognition" + }, + { + "download_count": 591134, + "project": "frozen-flask" + }, + { + "download_count": 590993, + "project": "django-log-request-id" + }, + { + "download_count": 589804, + "project": "funcparserlib" + }, + { + "download_count": 589445, + "project": "djangorestframework-camel-case" + }, + { + "download_count": 588165, + "project": "oslo-privsep" + }, + { + "download_count": 587455, + "project": "tf-nightly" + }, + { + "download_count": 587372, + "project": "caniusepython3" + }, + { + "download_count": 586559, + "project": "envtpl" + }, + { + "download_count": 586159, + "project": "mockredispy" + }, + { + "download_count": 586076, + "project": "properties" + }, + { + "download_count": 585723, + "project": "ansi2html" + }, + { + "download_count": 585253, + "project": "pyzipcode" + }, + { + "download_count": 584788, + "project": "sphinx-autodoc-typehints" + }, + { + "download_count": 583551, + "project": "environs" + }, + { + "download_count": 583517, + "project": "junit2html" + }, + { + "download_count": 583339, + "project": "yoyo-migrations" + }, + { + "download_count": 582030, + "project": "junitxml" + }, + { + "download_count": 580290, + "project": "django-heroku" + }, + { + "download_count": 579947, + "project": "chart-studio" + }, + { + "download_count": 579171, + "project": "pyexecjs" + }, + { + "download_count": 578063, + "project": "datasketch" + }, + { + "download_count": 577373, + "project": "django-autoslug" + }, + { + "download_count": 577155, + "project": "pyrepl" + }, + { + "download_count": 576195, + "project": "polygon-geohasher" + }, + { + "download_count": 575933, + "project": "addict" + }, + { + "download_count": 575932, + "project": "tooz" + }, + { + "download_count": 575622, + "project": "mecab-python3" + }, + { + "download_count": 575453, + "project": "shippo" + }, + { + "download_count": 575188, + "project": "bindep" + }, + { + "download_count": 574250, + "project": "requests-html" + }, + { + "download_count": 573651, + "project": "python-louvain" + }, + { + "download_count": 572787, + "project": "zmq" + }, + { + "download_count": 571317, + "project": "eth-account" + }, + { + "download_count": 571250, + "project": "ortools" + }, + { + "download_count": 570798, + "project": "automaton" + }, + { + "download_count": 570379, + "project": "django-cors-middleware" + }, + { + "download_count": 570213, + "project": "rq-dashboard" + }, + { + "download_count": 569967, + "project": "oslo-rootwrap" + }, + { + "download_count": 569775, + "project": "pilkit" + }, + { + "download_count": 569584, + "project": "readthedocs-sphinx-ext" + }, + { + "download_count": 569334, + "project": "latexcodec" + }, + { + "download_count": 568887, + "project": "south" + }, + { + "download_count": 568427, + "project": "agate-excel" + }, + { + "download_count": 568046, + "project": "hexbytes" + }, + { + "download_count": 567653, + "project": "django-money" + }, + { + "download_count": 567483, + "project": "agate-sql" + }, + { + "download_count": 566872, + "project": "kitchen" + }, + { + "download_count": 566696, + "project": "unipath" + }, + { + "download_count": 566631, + "project": "sshuttle" + }, + { + "download_count": 566158, + "project": "robotframework-faker" + }, + { + "download_count": 565395, + "project": "pybtex" + }, + { + "download_count": 565136, + "project": "django-nested-admin" + }, + { + "download_count": 564284, + "project": "eth-keyfile" + }, + { + "download_count": 564232, + "project": "djangorestframework-bulk" + }, + { + "download_count": 564010, + "project": "dataset" + }, + { + "download_count": 563254, + "project": "trafaret" + }, + { + "download_count": 562622, + "project": "cheetah3" + }, + { + "download_count": 561733, + "project": "flask-security" + }, + { + "download_count": 560775, + "project": "aliyun-python-sdk-core-v3" + }, + { + "download_count": 560763, + "project": "azureml-train-automl" + }, + { + "download_count": 559850, + "project": "control" + }, + { + "download_count": 559644, + "project": "implicit" + }, + { + "download_count": 559092, + "project": "dependency-injector" + }, + { + "download_count": 558284, + "project": "lazy" + }, + { + "download_count": 558189, + "project": "unidiff" + }, + { + "download_count": 557350, + "project": "textdistance" + }, + { + "download_count": 557098, + "project": "python-monkey-business" + }, + { + "download_count": 556600, + "project": "untangle" + }, + { + "download_count": 556409, + "project": "reverse-geocoder" + }, + { + "download_count": 556261, + "project": "pygeoip" + }, + { + "download_count": 554953, + "project": "eth-rlp" + }, + { + "download_count": 552622, + "project": "databricks" + }, + { + "download_count": 552459, + "project": "pyvim" + }, + { + "download_count": 551935, + "project": "taskflow" + }, + { + "download_count": 551365, + "project": "ifaddr" + }, + { + "download_count": 549608, + "project": "eeweather" + }, + { + "download_count": 549360, + "project": "clickhouse-cityhash" + }, + { + "download_count": 548549, + "project": "django-hijack" + }, + { + "download_count": 547813, + "project": "names" + }, + { + "download_count": 547796, + "project": "castellan" + }, + { + "download_count": 547711, + "project": "sacremoses" + }, + { + "download_count": 547488, + "project": "flake8-blind-except" + }, + { + "download_count": 547363, + "project": "mozdebug" + }, + { + "download_count": 547215, + "project": "ofxparse" + }, + { + "download_count": 546668, + "project": "vatnumber" + }, + { + "download_count": 546665, + "project": "remoto" + }, + { + "download_count": 546052, + "project": "checksumdir" + }, + { + "download_count": 545735, + "project": "pyowm" + }, + { + "download_count": 545330, + "project": "poster" + }, + { + "download_count": 543997, + "project": "lzstring" + }, + { + "download_count": 543850, + "project": "pyminizip" + }, + { + "download_count": 543634, + "project": "np-utils" + }, + { + "download_count": 543596, + "project": "injector" + }, + { + "download_count": 543183, + "project": "django-imagekit" + }, + { + "download_count": 542497, + "project": "five9" + }, + { + "download_count": 542414, + "project": "static3" + }, + { + "download_count": 541667, + "project": "oset" + }, + { + "download_count": 540962, + "project": "jsbeautifier" + }, + { + "download_count": 540750, + "project": "hdbscan" + }, + { + "download_count": 540280, + "project": "os-testr" + }, + { + "download_count": 540000, + "project": "flask-babelex" + }, + { + "download_count": 539901, + "project": "positional" + }, + { + "download_count": 539021, + "project": "profilehooks" + }, + { + "download_count": 538332, + "project": "flask-rq2" + }, + { + "download_count": 538314, + "project": "pygpgme" + }, + { + "download_count": 538159, + "project": "ts-flint" + }, + { + "download_count": 538112, + "project": "google-api-helper" + }, + { + "download_count": 537857, + "project": "markuppy" + }, + { + "download_count": 537565, + "project": "keras-mxnet" + }, + { + "download_count": 535795, + "project": "kwargs-only" + }, + { + "download_count": 534335, + "project": "django-mathfilters" + }, + { + "download_count": 534222, + "project": "dj-static" + }, + { + "download_count": 533502, + "project": "web-py" + }, + { + "download_count": 533322, + "project": "zenpy" + }, + { + "download_count": 533300, + "project": "django-enumfields" + }, + { + "download_count": 533281, + "project": "georaptor" + }, + { + "download_count": 533198, + "project": "heroku3" + }, + { + "download_count": 533034, + "project": "oci" + }, + { + "download_count": 532545, + "project": "django-fernet-fields" + }, + { + "download_count": 531368, + "project": "pyftpdlib" + }, + { + "download_count": 529065, + "project": "neutron-lib" + }, + { + "download_count": 529026, + "project": "grpcio-reflection" + }, + { + "download_count": 528753, + "project": "python-jsonschema-objects" + }, + { + "download_count": 528555, + "project": "django-dynamic-fixture" + }, + { + "download_count": 528426, + "project": "pyod" + }, + { + "download_count": 528307, + "project": "simplekml" + }, + { + "download_count": 527593, + "project": "overrides" + }, + { + "download_count": 526989, + "project": "ovsdbapp" + }, + { + "download_count": 526603, + "project": "tavern" + }, + { + "download_count": 526180, + "project": "peppercorn" + }, + { + "download_count": 526018, + "project": "cbapi" + }, + { + "download_count": 525952, + "project": "twitter-common-contextutil" + }, + { + "download_count": 523345, + "project": "pypdf" + }, + { + "download_count": 523091, + "project": "couchbase" + }, + { + "download_count": 522723, + "project": "profanityfilter" + }, + { + "download_count": 522269, + "project": "blist" + }, + { + "download_count": 522185, + "project": "pydns" + }, + { + "download_count": 521431, + "project": "stopit" + }, + { + "download_count": 521064, + "project": "keyboard" + }, + { + "download_count": 520346, + "project": "twitter-common-util" + }, + { + "download_count": 520255, + "project": "flatten-json" + }, + { + "download_count": 519427, + "project": "twitter-common-string" + }, + { + "download_count": 519406, + "project": "tableauserverclient" + }, + { + "download_count": 519368, + "project": "m2r" + }, + { + "download_count": 519326, + "project": "twitter-common-process" + }, + { + "download_count": 519222, + "project": "twitter-common-app" + }, + { + "download_count": 518985, + "project": "json-rpc" + }, + { + "download_count": 517770, + "project": "slack-webhook-cli" + }, + { + "download_count": 517297, + "project": "antigate" + }, + { + "download_count": 516754, + "project": "sphinxcontrib-bibtex" + }, + { + "download_count": 516195, + "project": "pybtex-docutils" + }, + { + "download_count": 515133, + "project": "rfc6266-parser" + }, + { + "download_count": 514541, + "project": "nflx-genie-client" + }, + { + "download_count": 513202, + "project": "missingno" + }, + { + "download_count": 513069, + "project": "mitmproxy" + }, + { + "download_count": 512838, + "project": "conan-package-tools" + }, + { + "download_count": 512668, + "project": "xlutils" + }, + { + "download_count": 512441, + "project": "pprintpp" + }, + { + "download_count": 512440, + "project": "os-traits" + }, + { + "download_count": 512397, + "project": "svglib" + }, + { + "download_count": 510713, + "project": "btrees" + }, + { + "download_count": 510636, + "project": "graphframes" + }, + { + "download_count": 509946, + "project": "sarge" + }, + { + "download_count": 509466, + "project": "shadowsocks" + }, + { + "download_count": 509388, + "project": "hmsclient" + }, + { + "download_count": 509166, + "project": "azure-mgmt-servermanager" + }, + { + "download_count": 508757, + "project": "elasticache-pyclient" + }, + { + "download_count": 508756, + "project": "xstatic-patternfly" + }, + { + "download_count": 508352, + "project": "pep257" + }, + { + "download_count": 508010, + "project": "xstatic-patternfly-bootstrap-treeview" + }, + { + "download_count": 507803, + "project": "xstatic-datatables" + }, + { + "download_count": 507499, + "project": "django-recaptcha" + }, + { + "download_count": 507473, + "project": "persistent" + }, + { + "download_count": 507135, + "project": "altair" + }, + { + "download_count": 505888, + "project": "edx-enterprise" + }, + { + "download_count": 505690, + "project": "graphy" + }, + { + "download_count": 505101, + "project": "redlock-py" + }, + { + "download_count": 504911, + "project": "pymc3" + }, + { + "download_count": 504787, + "project": "mercantile" + }, + { + "download_count": 504175, + "project": "lftools" + }, + { + "download_count": 502985, + "project": "robotframework-httplibrary" + }, + { + "download_count": 501914, + "project": "tsfresh" + }, + { + "download_count": 501627, + "project": "fitbit" + }, + { + "download_count": 501439, + "project": "lightfm" + }, + { + "download_count": 501354, + "project": "djoser" + }, + { + "download_count": 501217, + "project": "pytest-faulthandler" + }, + { + "download_count": 500476, + "project": "formencode" + }, + { + "download_count": 500465, + "project": "spyne" + }, + { + "download_count": 500288, + "project": "backports-os" + }, + { + "download_count": 500147, + "project": "customerio" + }, + { + "download_count": 499726, + "project": "os-win" + }, + { + "download_count": 499639, + "project": "neptune-client" + }, + { + "download_count": 499204, + "project": "googleappenginecloudstorageclient" + }, + { + "download_count": 498658, + "project": "sparqlwrapper" + }, + { + "download_count": 498519, + "project": "sphinxcontrib-spelling" + }, + { + "download_count": 498177, + "project": "geotext" + }, + { + "download_count": 497560, + "project": "pytest-lazy-fixture" + }, + { + "download_count": 497085, + "project": "pyarabic" + }, + { + "download_count": 497017, + "project": "auditwheel" + }, + { + "download_count": 496676, + "project": "django-debug-panel" + }, + { + "download_count": 495919, + "project": "cssmin" + }, + { + "download_count": 495656, + "project": "nose-progressive" + }, + { + "download_count": 495187, + "project": "django-suit" + }, + { + "download_count": 495183, + "project": "mercurial" + }, + { + "download_count": 495032, + "project": "python-hosts" + }, + { + "download_count": 494652, + "project": "pywatchman" + }, + { + "download_count": 494192, + "project": "pip-lock" + }, + { + "download_count": 494177, + "project": "clikit" + }, + { + "download_count": 494100, + "project": "flake8-per-file-ignores" + }, + { + "download_count": 493208, + "project": "os-brick" + }, + { + "download_count": 492737, + "project": "cloudinary" + }, + { + "download_count": 492342, + "project": "pyroma" + }, + { + "download_count": 491821, + "project": "aiohttp-jinja2" + }, + { + "download_count": 491668, + "project": "func-timeout" + }, + { + "download_count": 491557, + "project": "ldapdomaindump" + }, + { + "download_count": 490771, + "project": "logzio-python-handler" + }, + { + "download_count": 490651, + "project": "yarg" + }, + { + "download_count": 490261, + "project": "python-geoip" + }, + { + "download_count": 489169, + "project": "gremlinpython" + }, + { + "download_count": 488646, + "project": "uplink" + }, + { + "download_count": 487621, + "project": "pyjarowinkler" + }, + { + "download_count": 485859, + "project": "qt4reactor" + }, + { + "download_count": 485712, + "project": "records" + }, + { + "download_count": 485512, + "project": "flake8-string-format" + }, + { + "download_count": 485371, + "project": "django-rest-framework" + }, + { + "download_count": 485084, + "project": "pydruid" + }, + { + "download_count": 484914, + "project": "meson" + }, + { + "download_count": 484556, + "project": "django-select2" + }, + { + "download_count": 484267, + "project": "pamqp" + }, + { + "download_count": 484090, + "project": "xmljson" + }, + { + "download_count": 483920, + "project": "slots" + }, + { + "download_count": 483748, + "project": "doublemetaphone" + }, + { + "download_count": 483545, + "project": "pycli" + }, + { + "download_count": 483354, + "project": "jupyterlab-launcher" + }, + { + "download_count": 482936, + "project": "editorconfig" + }, + { + "download_count": 482719, + "project": "pamela" + }, + { + "download_count": 482539, + "project": "rdpy" + }, + { + "download_count": 482395, + "project": "word2number" + }, + { + "download_count": 482346, + "project": "pykmip" + }, + { + "download_count": 480460, + "project": "recurly" + }, + { + "download_count": 479945, + "project": "datarobot" + }, + { + "download_count": 479251, + "project": "email-reply-parser" + }, + { + "download_count": 479059, + "project": "geohash2" + }, + { + "download_count": 478838, + "project": "readchar" + }, + { + "download_count": 478822, + "project": "mohawk" + }, + { + "download_count": 478394, + "project": "orjson" + }, + { + "download_count": 478032, + "project": "pycocotools" + }, + { + "download_count": 477626, + "project": "pythonnet" + }, + { + "download_count": 477384, + "project": "deap" + }, + { + "download_count": 476311, + "project": "cursor" + }, + { + "download_count": 475480, + "project": "django-jenkins" + }, + { + "download_count": 475049, + "project": "azureml-automl-core" + }, + { + "download_count": 474562, + "project": "sklearn-crfsuite" + }, + { + "download_count": 472571, + "project": "azure-mgmt-documentdb" + }, + { + "download_count": 471293, + "project": "paretochart" + }, + { + "download_count": 471137, + "project": "python-debian" + }, + { + "download_count": 471045, + "project": "rply" + }, + { + "download_count": 469934, + "project": "pynliner" + }, + { + "download_count": 469110, + "project": "ipwhois" + }, + { + "download_count": 468984, + "project": "pylint-quotes" + }, + { + "download_count": 468853, + "project": "sfmergeutility" + }, + { + "download_count": 468745, + "project": "pyside2" + }, + { + "download_count": 468673, + "project": "cupy-cuda100" + }, + { + "download_count": 468012, + "project": "tokenize-rt" + }, + { + "download_count": 467174, + "project": "halo" + }, + { + "download_count": 467029, + "project": "pyblake2" + }, + { + "download_count": 466658, + "project": "python-keyczar" + }, + { + "download_count": 466596, + "project": "pytest-factoryboy" + }, + { + "download_count": 466322, + "project": "pyramid-mako" + }, + { + "download_count": 465692, + "project": "speedtest-cli" + }, + { + "download_count": 465559, + "project": "ansible-vault" + }, + { + "download_count": 465439, + "project": "sure" + }, + { + "download_count": 465170, + "project": "h3" + }, + { + "download_count": 464606, + "project": "pysolar" + }, + { + "download_count": 464135, + "project": "os-vif" + }, + { + "download_count": 462962, + "project": "gcovr" + }, + { + "download_count": 462652, + "project": "gputil" + }, + { + "download_count": 462649, + "project": "pyexcel-xlsx" + }, + { + "download_count": 462258, + "project": "pytest-bdd" + }, + { + "download_count": 462062, + "project": "qtpy" + }, + { + "download_count": 461447, + "project": "marshmallow-jsonschema" + }, + { + "download_count": 461130, + "project": "xmlschema" + }, + { + "download_count": 461066, + "project": "log-symbols" + }, + { + "download_count": 461026, + "project": "aiopg" + }, + { + "download_count": 461021, + "project": "paypalrestsdk" + }, + { + "download_count": 459361, + "project": "bpython" + }, + { + "download_count": 459221, + "project": "django-memoize" + }, + { + "download_count": 458741, + "project": "pastescript" + }, + { + "download_count": 458467, + "project": "djangorestframework-gis" + }, + { + "download_count": 458421, + "project": "yamlordereddictloader" + }, + { + "download_count": 458237, + "project": "azure-cli-privatedns" + }, + { + "download_count": 457094, + "project": "jupyterhub" + }, + { + "download_count": 457021, + "project": "pytest-random-order" + }, + { + "download_count": 456889, + "project": "cli-helpers" + }, + { + "download_count": 456492, + "project": "django-jet" + }, + { + "download_count": 456487, + "project": "django-solo" + }, + { + "download_count": 455927, + "project": "easypkg" + }, + { + "download_count": 455745, + "project": "oslotest" + }, + { + "download_count": 455660, + "project": "td-client" + }, + { + "download_count": 455550, + "project": "docker-buildtool" + }, + { + "download_count": 455228, + "project": "pyactiveresource" + }, + { + "download_count": 455148, + "project": "filetype" + }, + { + "download_count": 454275, + "project": "integrationhelper" + }, + { + "download_count": 454060, + "project": "treeinterpreter" + }, + { + "download_count": 453726, + "project": "spinners" + }, + { + "download_count": 453478, + "project": "tinys3" + }, + { + "download_count": 452911, + "project": "google-nucleus" + }, + { + "download_count": 452905, + "project": "sfctl" + }, + { + "download_count": 452659, + "project": "wsme" + }, + { + "download_count": 452548, + "project": "cloudml-hypertune" + }, + { + "download_count": 452284, + "project": "djrill" + }, + { + "download_count": 451894, + "project": "rdflib-jsonld" + }, + { + "download_count": 451751, + "project": "pyhull" + }, + { + "download_count": 451388, + "project": "weka-easypy" + }, + { + "download_count": 451340, + "project": "zerorpc" + }, + { + "download_count": 450074, + "project": "requests-aws-sign" + }, + { + "download_count": 449859, + "project": "apns2" + }, + { + "download_count": 449829, + "project": "pytest-freezegun" + }, + { + "download_count": 449733, + "project": "logentries" + }, + { + "download_count": 449274, + "project": "polling" + }, + { + "download_count": 449144, + "project": "ner" + }, + { + "download_count": 448946, + "project": "pycuber" + }, + { + "download_count": 448187, + "project": "dfply" + }, + { + "download_count": 447960, + "project": "elasticsearch5" + }, + { + "download_count": 447647, + "project": "pyramid-debugtoolbar" + }, + { + "download_count": 447433, + "project": "dohq-artifactory" + }, + { + "download_count": 447042, + "project": "graphyte" + }, + { + "download_count": 446699, + "project": "gtts-token" + }, + { + "download_count": 446599, + "project": "s3io" + }, + { + "download_count": 446457, + "project": "pyldavis" + }, + { + "download_count": 446070, + "project": "dm-xmlsec-binding" + }, + { + "download_count": 445558, + "project": "oslo-vmware" + }, + { + "download_count": 445493, + "project": "mkdocs-minify-plugin" + }, + { + "download_count": 442789, + "project": "systemd-python" + }, + { + "download_count": 441825, + "project": "django-daterange-filter" + }, + { + "download_count": 441288, + "project": "pycld2" + }, + { + "download_count": 441011, + "project": "ffmpy" + }, + { + "download_count": 440747, + "project": "onnxruntime" + }, + { + "download_count": 440442, + "project": "pathmatch" + }, + { + "download_count": 440074, + "project": "beatbox" + }, + { + "download_count": 439695, + "project": "dotmap" + }, + { + "download_count": 439566, + "project": "atari-py" + }, + { + "download_count": 436976, + "project": "pytest-socket" + }, + { + "download_count": 436145, + "project": "matplotlib-venn" + }, + { + "download_count": 434595, + "project": "dnslib" + }, + { + "download_count": 434167, + "project": "leveldb" + }, + { + "download_count": 433865, + "project": "django-dirtyfields" + }, + { + "download_count": 433860, + "project": "shiboken2" + }, + { + "download_count": 433596, + "project": "chameleon" + }, + { + "download_count": 433574, + "project": "python-social-auth" + }, + { + "download_count": 433514, + "project": "xunitparser" + }, + { + "download_count": 433494, + "project": "tempest" + }, + { + "download_count": 433330, + "project": "django-extra-views" + }, + { + "download_count": 433032, + "project": "django-sslserver" + }, + { + "download_count": 432924, + "project": "netstorageapi" + }, + { + "download_count": 432577, + "project": "django-bootstrap-form" + }, + { + "download_count": 431716, + "project": "aio-pika" + }, + { + "download_count": 431533, + "project": "curtsies" + }, + { + "download_count": 431368, + "project": "edx-proctoring" + }, + { + "download_count": 429918, + "project": "rules" + }, + { + "download_count": 429501, + "project": "treq" + }, + { + "download_count": 429446, + "project": "python2-pythondialog" + }, + { + "download_count": 429251, + "project": "shopifyapi" + }, + { + "download_count": 429239, + "project": "pyros-genmsg" + }, + { + "download_count": 428668, + "project": "pyros-genpy" + }, + { + "download_count": 427728, + "project": "django-webtest" + }, + { + "download_count": 427374, + "project": "cpp-coveralls" + }, + { + "download_count": 426629, + "project": "hyperloglog" + }, + { + "download_count": 425518, + "project": "pathvalidate" + }, + { + "download_count": 424129, + "project": "marisa-trie" + }, + { + "download_count": 423827, + "project": "graphene-file-upload" + }, + { + "download_count": 423528, + "project": "wurlitzer" + }, + { + "download_count": 423446, + "project": "geoip" + }, + { + "download_count": 423400, + "project": "nameko" + }, + { + "download_count": 422280, + "project": "pipreqs" + }, + { + "download_count": 422034, + "project": "airbrake" + }, + { + "download_count": 421423, + "project": "python-barcode" + }, + { + "download_count": 420487, + "project": "featuretools" + }, + { + "download_count": 420463, + "project": "pydes" + }, + { + "download_count": 420080, + "project": "oss2" + }, + { + "download_count": 419064, + "project": "win-unicode-console" + }, + { + "download_count": 418651, + "project": "aiocontextvars" + }, + { + "download_count": 417979, + "project": "flake8-logging-format" + }, + { + "download_count": 417452, + "project": "aiokafka" + }, + { + "download_count": 416219, + "project": "astunparse" + }, + { + "download_count": 414872, + "project": "doit" + }, + { + "download_count": 414706, + "project": "scikit-surprise" + }, + { + "download_count": 414280, + "project": "flask-mysql" + }, + { + "download_count": 414268, + "project": "pygerrit2" + }, + { + "download_count": 412851, + "project": "requests-http-signature" + }, + { + "download_count": 412476, + "project": "django-dotenv" + }, + { + "download_count": 412152, + "project": "ffmpeg-quality-metrics" + }, + { + "download_count": 412022, + "project": "spotify-tensorflow" + }, + { + "download_count": 411026, + "project": "wsgi-intercept" + }, + { + "download_count": 410904, + "project": "breathe" + }, + { + "download_count": 410783, + "project": "google-api-python-client-uritemplate" + }, + { + "download_count": 408750, + "project": "django-ajax-selects" + }, + { + "download_count": 408606, + "project": "websocket" + }, + { + "download_count": 408486, + "project": "healthcheck" + }, + { + "download_count": 408427, + "project": "redo" + }, + { + "download_count": 408117, + "project": "pypiserver" + }, + { + "download_count": 408017, + "project": "localstack-client" + }, + { + "download_count": 407856, + "project": "fastai" + }, + { + "download_count": 407560, + "project": "django-impersonate" + }, + { + "download_count": 407287, + "project": "zipcodes" + }, + { + "download_count": 407121, + "project": "treelib" + }, + { + "download_count": 407028, + "project": "django-stubs" + }, + { + "download_count": 406712, + "project": "django-two-factor-auth" + }, + { + "download_count": 405396, + "project": "json-delta" + }, + { + "download_count": 405170, + "project": "socketio-client" + }, + { + "download_count": 405065, + "project": "gin-config" + }, + { + "download_count": 405060, + "project": "coverage-badge" + }, + { + "download_count": 404993, + "project": "django-sendgrid-v5" + }, + { + "download_count": 404902, + "project": "shutilwhich" + }, + { + "download_count": 404866, + "project": "flask-redis" + }, + { + "download_count": 404373, + "project": "pep562" + }, + { + "download_count": 404209, + "project": "niet" + }, + { + "download_count": 403508, + "project": "dask-glm" + }, + { + "download_count": 402928, + "project": "evergreen-py" + }, + { + "download_count": 402697, + "project": "zxcvbn" + }, + { + "download_count": 402692, + "project": "dataproperty" + }, + { + "download_count": 402398, + "project": "pygeohash" + }, + { + "download_count": 401062, + "project": "ast" + }, + { + "download_count": 400982, + "project": "pyobjc-core" + }, + { + "download_count": 400958, + "project": "http-ece" + }, + { + "download_count": 400803, + "project": "readline" + }, + { + "download_count": 400450, + "project": "django-elasticsearch-dsl" + }, + { + "download_count": 400436, + "project": "python-xlib" + }, + { + "download_count": 400407, + "project": "flatten-dict" + }, + { + "download_count": 399614, + "project": "gherkin-official" + }, + { + "download_count": 399263, + "project": "elementpath" + }, + { + "download_count": 399214, + "project": "gdal" + }, + { + "download_count": 399000, + "project": "roman" + }, + { + "download_count": 398885, + "project": "click-spinner" + }, + { + "download_count": 398873, + "project": "chalice" + }, + { + "download_count": 398463, + "project": "django-filer" + }, + { + "download_count": 398402, + "project": "ldclient-py" + }, + { + "download_count": 398269, + "project": "gtts" + }, + { + "download_count": 397948, + "project": "django-registration" + }, + { + "download_count": 397646, + "project": "collectfast" + }, + { + "download_count": 396999, + "project": "django-jinja" + }, + { + "download_count": 396968, + "project": "eradicate" + }, + { + "download_count": 396714, + "project": "neo4j-driver" + }, + { + "download_count": 396369, + "project": "cybox" + }, + { + "download_count": 396364, + "project": "asgi-redis" + }, + { + "download_count": 396056, + "project": "boto3-type-annotations" + }, + { + "download_count": 395861, + "project": "etcd3gw" + }, + { + "download_count": 395415, + "project": "face-recognition" + }, + { + "download_count": 395184, + "project": "os-xenapi" + }, + { + "download_count": 395153, + "project": "neo4j" + }, + { + "download_count": 394185, + "project": "pytrends" + }, + { + "download_count": 393950, + "project": "grpcio-status" + }, + { + "download_count": 393467, + "project": "sailthru-client" + }, + { + "download_count": 393315, + "project": "repoze-sendmail" + }, + { + "download_count": 393244, + "project": "bayesian-optimization" + }, + { + "download_count": 393069, + "project": "pillow-simd" + }, + { + "download_count": 392655, + "project": "inquirer" + }, + { + "download_count": 391989, + "project": "watson-developer-cloud" + }, + { + "download_count": 391807, + "project": "assertpy" + }, + { + "download_count": 391722, + "project": "chainer" + }, + { + "download_count": 391162, + "project": "aiogithubapi" + }, + { + "download_count": 391117, + "project": "pyclustering" + }, + { + "download_count": 390635, + "project": "django-test-plus" + }, + { + "download_count": 389572, + "project": "azureml-explain-model" + }, + { + "download_count": 389554, + "project": "param" + }, + { + "download_count": 388843, + "project": "smartsheet-python-sdk" + }, + { + "download_count": 388646, + "project": "google-ads" + }, + { + "download_count": 387346, + "project": "unicode-slugify" + }, + { + "download_count": 387007, + "project": "django-smtp-ssl" + }, + { + "download_count": 386636, + "project": "udatetime" + }, + { + "download_count": 386540, + "project": "pyobjc-framework-cocoa" + }, + { + "download_count": 386296, + "project": "confuse" + }, + { + "download_count": 386037, + "project": "hdfs3" + }, + { + "download_count": 385593, + "project": "moznetwork" + }, + { + "download_count": 385320, + "project": "pydot2" + }, + { + "download_count": 385150, + "project": "djangocms-admin-style" + }, + { + "download_count": 384650, + "project": "pyquaternion" + }, + { + "download_count": 384272, + "project": "xblock" + }, + { + "download_count": 384195, + "project": "flask-talisman" + }, + { + "download_count": 383670, + "project": "paver" + }, + { + "download_count": 383579, + "project": "pytorch-transformers" + }, + { + "download_count": 383499, + "project": "netdisco" + }, + { + "download_count": 383345, + "project": "kivy" + }, + { + "download_count": 383182, + "project": "django-uuidfield" + }, + { + "download_count": 382848, + "project": "jwt" + }, + { + "download_count": 382404, + "project": "logdna" + }, + { + "download_count": 382235, + "project": "relativetimebuilder" + }, + { + "download_count": 381845, + "project": "json2html" + }, + { + "download_count": 381570, + "project": "pytest-helpers-namespace" + }, + { + "download_count": 381409, + "project": "codespell" + }, + { + "download_count": 381241, + "project": "open3d-python" + }, + { + "download_count": 381173, + "project": "aws" + }, + { + "download_count": 381129, + "project": "plyfile" + }, + { + "download_count": 380993, + "project": "py-spy" + }, + { + "download_count": 380964, + "project": "aliyun-python-sdk-kms" + }, + { + "download_count": 380771, + "project": "stix" + }, + { + "download_count": 379960, + "project": "pywebpush" + }, + { + "download_count": 379915, + "project": "paramiko-expect" + }, + { + "download_count": 379467, + "project": "face-recognition-models" + }, + { + "download_count": 379302, + "project": "umap-learn" + }, + { + "download_count": 378977, + "project": "cbor2" + }, + { + "download_count": 378025, + "project": "django-redis-sessions" + }, + { + "download_count": 377737, + "project": "pymisp" + }, + { + "download_count": 377661, + "project": "django-test-without-migrations" + }, + { + "download_count": 377526, + "project": "readability-lxml" + }, + { + "download_count": 377300, + "project": "python-jsonrpc-server" + }, + { + "download_count": 377259, + "project": "yara-python" + }, + { + "download_count": 376371, + "project": "scikit-build" + }, + { + "download_count": 376213, + "project": "wasmer" + }, + { + "download_count": 376182, + "project": "django-templated-email" + }, + { + "download_count": 375778, + "project": "www-authenticate" + }, + { + "download_count": 375656, + "project": "plaid-python" + }, + { + "download_count": 375163, + "project": "mixbox" + }, + { + "download_count": 374823, + "project": "fastdiff" + }, + { + "download_count": 374712, + "project": "pyang" + }, + { + "download_count": 373785, + "project": "flake8-tidy-imports" + }, + { + "download_count": 373672, + "project": "dnspython3" + }, + { + "download_count": 373668, + "project": "twitter-common-confluence" + }, + { + "download_count": 373502, + "project": "cursive" + }, + { + "download_count": 372891, + "project": "requests-oauth" + }, + { + "download_count": 372768, + "project": "edx-opaque-keys" + }, + { + "download_count": 372679, + "project": "flake8-mutable" + }, + { + "download_count": 372516, + "project": "docxtpl" + }, + { + "download_count": 372505, + "project": "reloader" + }, + { + "download_count": 371987, + "project": "ibm-cos-sdk" + }, + { + "download_count": 371891, + "project": "python-multipart" + }, + { + "download_count": 371361, + "project": "shodan" + }, + { + "download_count": 370894, + "project": "glance-store" + }, + { + "download_count": 370618, + "project": "blobxfer" + }, + { + "download_count": 370307, + "project": "mailchimp" + }, + { + "download_count": 370281, + "project": "amazon-kclpy" + }, + { + "download_count": 369713, + "project": "azure-cli-deploymentmanager" + }, + { + "download_count": 369303, + "project": "cfscrape" + }, + { + "download_count": 369271, + "project": "gabbi" + }, + { + "download_count": 368704, + "project": "docker-registry-client" + }, + { + "download_count": 368627, + "project": "visdom" + }, + { + "download_count": 368133, + "project": "djangosaml2" + }, + { + "download_count": 367774, + "project": "torchfile" + }, + { + "download_count": 367743, + "project": "python-language-server" + }, + { + "download_count": 367741, + "project": "django-registration-redux" + }, + { + "download_count": 366408, + "project": "pypowervm" + }, + { + "download_count": 365959, + "project": "pypubsub" + }, + { + "download_count": 365726, + "project": "flake8-mypy" + }, + { + "download_count": 365550, + "project": "mixer" + }, + { + "download_count": 365313, + "project": "config" + }, + { + "download_count": 365224, + "project": "pytorch" + }, + { + "download_count": 364756, + "project": "py-geohash-any" + }, + { + "download_count": 364330, + "project": "pantsbuild-pants" + }, + { + "download_count": 364200, + "project": "strif" + }, + { + "download_count": 364189, + "project": "pgc-interface" + }, + { + "download_count": 363919, + "project": "pyrasite" + }, + { + "download_count": 363463, + "project": "browsermob-proxy" + }, + { + "download_count": 362770, + "project": "marshmallow-oneofschema" + }, + { + "download_count": 362569, + "project": "python-saml" + }, + { + "download_count": 362447, + "project": "pymc" + }, + { + "download_count": 362409, + "project": "vadersentiment" + }, + { + "download_count": 362107, + "project": "pyxero" + }, + { + "download_count": 361277, + "project": "ccxt" + }, + { + "download_count": 361145, + "project": "executor" + }, + { + "download_count": 360517, + "project": "requests-pkcs12" + }, + { + "download_count": 360423, + "project": "instaclone" + }, + { + "download_count": 360015, + "project": "exchangelib" + }, + { + "download_count": 359650, + "project": "lomond" + }, + { + "download_count": 359422, + "project": "mibian" + }, + { + "download_count": 359376, + "project": "sip" + }, + { + "download_count": 358575, + "project": "django-ordered-model" + }, + { + "download_count": 358484, + "project": "eyed3" + }, + { + "download_count": 358443, + "project": "pysendfile" + }, + { + "download_count": 358260, + "project": "nose-testconfig" + }, + { + "download_count": 358034, + "project": "delegator-py" + }, + { + "download_count": 357573, + "project": "currencyconverter" + }, + { + "download_count": 356478, + "project": "backports-lzma" + }, + { + "download_count": 356429, + "project": "p4python" + }, + { + "download_count": 356412, + "project": "zope-index" + }, + { + "download_count": 356169, + "project": "cloudflare" + }, + { + "download_count": 356004, + "project": "cql" + }, + { + "download_count": 355945, + "project": "dacite" + }, + { + "download_count": 355827, + "project": "python-cjson" + }, + { + "download_count": 355794, + "project": "marshmallow-arrow" + }, + { + "download_count": 355729, + "project": "mbstrdecoder" + }, + { + "download_count": 354987, + "project": "urlextract" + }, + { + "download_count": 354886, + "project": "typepy" + }, + { + "download_count": 354885, + "project": "htpasswd" + }, + { + "download_count": 354555, + "project": "mod-wsgi" + }, + { + "download_count": 354506, + "project": "django-cms" + }, + { + "download_count": 353955, + "project": "flask-apscheduler" + }, + { + "download_count": 353201, + "project": "pymobiledetect" + }, + { + "download_count": 353184, + "project": "times" + }, + { + "download_count": 352996, + "project": "zabbix-api" + }, + { + "download_count": 352927, + "project": "bcdoc" + }, + { + "download_count": 352725, + "project": "torchtext" + }, + { + "download_count": 352313, + "project": "flashtext" + }, + { + "download_count": 351678, + "project": "referer-parser" + }, + { + "download_count": 350758, + "project": "pyexcel-xls" + }, + { + "download_count": 350681, + "project": "edx-drf-extensions" + }, + { + "download_count": 350665, + "project": "falcon-multipart" + }, + { + "download_count": 350619, + "project": "inotify" + }, + { + "download_count": 350184, + "project": "tpot" + }, + { + "download_count": 349490, + "project": "mypy-protobuf" + }, + { + "download_count": 349330, + "project": "pygit2" + }, + { + "download_count": 348567, + "project": "robotbackgroundlogger" + }, + { + "download_count": 348256, + "project": "traces" + }, + { + "download_count": 348166, + "project": "django-extra-fields" + }, + { + "download_count": 348009, + "project": "rook" + }, + { + "download_count": 348008, + "project": "ssh2-python" + }, + { + "download_count": 347979, + "project": "jupytext" + }, + { + "download_count": 347497, + "project": "optunity" + }, + { + "download_count": 347125, + "project": "django-safedelete" + }, + { + "download_count": 347040, + "project": "django-jsonview" + }, + { + "download_count": 347003, + "project": "allure-behave" + }, + { + "download_count": 346883, + "project": "forex-python" + }, + { + "download_count": 346742, + "project": "logger" + }, + { + "download_count": 346329, + "project": "django-choices" + }, + { + "download_count": 345484, + "project": "xdis" + }, + { + "download_count": 345296, + "project": "django-babel" + }, + { + "download_count": 345262, + "project": "parse-accept-language" + }, + { + "download_count": 344856, + "project": "scons" + }, + { + "download_count": 344819, + "project": "klein" + }, + { + "download_count": 344742, + "project": "flask-shell-ipython" + }, + { + "download_count": 344586, + "project": "amqplib" + }, + { + "download_count": 344301, + "project": "betamax" + }, + { + "download_count": 344260, + "project": "flask-basicauth" + }, + { + "download_count": 344021, + "project": "pybarcode" + }, + { + "download_count": 343992, + "project": "pytest-json" + }, + { + "download_count": 343912, + "project": "uiautomation" + }, + { + "download_count": 343788, + "project": "pyemd" + }, + { + "download_count": 343547, + "project": "flufl-enum" + }, + { + "download_count": 342092, + "project": "normality" + }, + { + "download_count": 341312, + "project": "osc-placement" + }, + { + "download_count": 340998, + "project": "pytest-parallel" + }, + { + "download_count": 340763, + "project": "crochet" + }, + { + "download_count": 340105, + "project": "proximityhash" + }, + { + "download_count": 339952, + "project": "pyscss" + }, + { + "download_count": 339480, + "project": "python-qpid-proton" + }, + { + "download_count": 339302, + "project": "vtk" + }, + { + "download_count": 338910, + "project": "hmmlearn" + }, + { + "download_count": 338542, + "project": "pyqtwebengine" + }, + { + "download_count": 337957, + "project": "django-watchman" + }, + { + "download_count": 337701, + "project": "python-igraph" + }, + { + "download_count": 337586, + "project": "edxval" + }, + { + "download_count": 337501, + "project": "ibm-cos-sdk-core" + }, + { + "download_count": 337200, + "project": "edx-django-utils" + }, + { + "download_count": 336856, + "project": "ibm-cos-sdk-s3transfer" + }, + { + "download_count": 336294, + "project": "spark-nlp" + }, + { + "download_count": 335964, + "project": "rhea" + }, + { + "download_count": 335873, + "project": "exifread" + }, + { + "download_count": 335709, + "project": "tensorflow-estimator-2-0-preview" + }, + { + "download_count": 335463, + "project": "python-binary-memcached" + }, + { + "download_count": 335218, + "project": "spyder" + }, + { + "download_count": 334977, + "project": "rstr" + }, + { + "download_count": 334204, + "project": "asteval" + }, + { + "download_count": 333818, + "project": "uncompyle6" + }, + { + "download_count": 333754, + "project": "requests-async" + }, + { + "download_count": 333266, + "project": "kaitaistruct" + }, + { + "download_count": 332129, + "project": "multiprocessing" + }, + { + "download_count": 332061, + "project": "chromedriver" + }, + { + "download_count": 332013, + "project": "iso-639" + }, + { + "download_count": 331946, + "project": "daiquiri" + }, + { + "download_count": 331588, + "project": "tendo" + }, + { + "download_count": 331525, + "project": "spark-parser" + }, + { + "download_count": 331379, + "project": "setuptools-git-version" + }, + { + "download_count": 331153, + "project": "priority" + }, + { + "download_count": 330940, + "project": "cachelib" + }, + { + "download_count": 330879, + "project": "os-ken" + }, + { + "download_count": 330608, + "project": "microversion-parse" + }, + { + "download_count": 329253, + "project": "django-contrib-comments" + }, + { + "download_count": 329155, + "project": "o365" + }, + { + "download_count": 328801, + "project": "panda" + }, + { + "download_count": 328625, + "project": "ed25519" + }, + { + "download_count": 327877, + "project": "pyxb" + }, + { + "download_count": 327798, + "project": "rest-condition" + }, + { + "download_count": 327008, + "project": "pandavro" + }, + { + "download_count": 326932, + "project": "flask-autoindex" + }, + { + "download_count": 326745, + "project": "jieba3k" + }, + { + "download_count": 326444, + "project": "pipfile" + }, + { + "download_count": 325679, + "project": "js2xml" + }, + { + "download_count": 325610, + "project": "freetype-py" + }, + { + "download_count": 325570, + "project": "sigopt" + }, + { + "download_count": 325566, + "project": "flask-silk" + }, + { + "download_count": 325431, + "project": "pynvim" + }, + { + "download_count": 324936, + "project": "hunspell" + }, + { + "download_count": 324782, + "project": "pytest-localserver" + }, + { + "download_count": 324466, + "project": "genshi" + }, + { + "download_count": 324252, + "project": "pyqtgraph" + }, + { + "download_count": 324239, + "project": "backport-collections" + }, + { + "download_count": 324070, + "project": "daemonize" + }, + { + "download_count": 324045, + "project": "pafy" + }, + { + "download_count": 323910, + "project": "pyvcloud" + }, + { + "download_count": 322541, + "project": "imapclient" + }, + { + "download_count": 321480, + "project": "tika" + }, + { + "download_count": 321355, + "project": "simplekv" + }, + { + "download_count": 321196, + "project": "rtslib-fb" + }, + { + "download_count": 321126, + "project": "flake8-colors" + }, + { + "download_count": 321035, + "project": "helper" + }, + { + "download_count": 320909, + "project": "guessit" + }, + { + "download_count": 320580, + "project": "ryu" + }, + { + "download_count": 320316, + "project": "salt" + }, + { + "download_count": 320262, + "project": "flexmock" + }, + { + "download_count": 320230, + "project": "pytils" + }, + { + "download_count": 320212, + "project": "phik" + }, + { + "download_count": 319164, + "project": "sphinx-bootstrap-theme" + }, + { + "download_count": 319042, + "project": "flake8-pep3101" + }, + { + "download_count": 318722, + "project": "turicreate" + }, + { + "download_count": 318705, + "project": "attr" + }, + { + "download_count": 318586, + "project": "spyder-kernels" + }, + { + "download_count": 318398, + "project": "drf-writable-nested" + }, + { + "download_count": 318092, + "project": "future-fstrings" + }, + { + "download_count": 317793, + "project": "python-mistralclient" + }, + { + "download_count": 317688, + "project": "fuzzy" + }, + { + "download_count": 317529, + "project": "pyxlsb" + }, + { + "download_count": 317467, + "project": "twitter" + }, + { + "download_count": 317447, + "project": "slumber" + }, + { + "download_count": 316898, + "project": "protobuf-to-dict" + }, + { + "download_count": 316783, + "project": "djangorestframework-recursive" + }, + { + "download_count": 316760, + "project": "treeherder-client" + }, + { + "download_count": 316758, + "project": "python-nomad" + }, + { + "download_count": 316352, + "project": "click-default-group" + }, + { + "download_count": 316307, + "project": "logzero" + }, + { + "download_count": 316290, + "project": "orionsdk" + }, + { + "download_count": 316243, + "project": "sanic-cors" + }, + { + "download_count": 316239, + "project": "fastdtw" + }, + { + "download_count": 315929, + "project": "python-moztelemetry" + }, + { + "download_count": 315911, + "project": "pytest-azurepipelines" + }, + { + "download_count": 315673, + "project": "expects" + }, + { + "download_count": 314691, + "project": "feedfinder2" + }, + { + "download_count": 314446, + "project": "multimethod" + }, + { + "download_count": 314259, + "project": "janome" + }, + { + "download_count": 314133, + "project": "voluptuous-serialize" + }, + { + "download_count": 314097, + "project": "pyculiar" + }, + { + "download_count": 314051, + "project": "mozdownload" + }, + { + "download_count": 313826, + "project": "pylzma" + }, + { + "download_count": 313796, + "project": "qtawesome" + }, + { + "download_count": 313736, + "project": "everett" + }, + { + "download_count": 313653, + "project": "coincurve" + }, + { + "download_count": 313244, + "project": "characteristic" + }, + { + "download_count": 312696, + "project": "python-can" + }, + { + "download_count": 312614, + "project": "planout" + }, + { + "download_count": 312044, + "project": "submit50" + }, + { + "download_count": 312044, + "project": "transformers" + }, + { + "download_count": 311745, + "project": "django-celery-email" + }, + { + "download_count": 311632, + "project": "check50" + }, + { + "download_count": 311531, + "project": "ansimarkup" + }, + { + "download_count": 311273, + "project": "flatdict" + }, + { + "download_count": 311140, + "project": "minimal-snowplow-tracker" + }, + { + "download_count": 311122, + "project": "python-troveclient" + }, + { + "download_count": 310826, + "project": "pycpfcnpj" + }, + { + "download_count": 310446, + "project": "python-lzf" + }, + { + "download_count": 310429, + "project": "apsw" + }, + { + "download_count": 310269, + "project": "stem" + }, + { + "download_count": 310019, + "project": "mozinstall" + }, + { + "download_count": 309655, + "project": "os-resource-classes" + }, + { + "download_count": 309355, + "project": "mimeparse" + }, + { + "download_count": 309293, + "project": "comet-ml" + }, + { + "download_count": 309286, + "project": "serpy" + }, + { + "download_count": 309092, + "project": "skimage" + }, + { + "download_count": 308894, + "project": "pandas-ml" + }, + { + "download_count": 308548, + "project": "python-magnumclient" + }, + { + "download_count": 307984, + "project": "azure-devtools" + }, + { + "download_count": 307690, + "project": "typesentry" + }, + { + "download_count": 307277, + "project": "awslogs" + }, + { + "download_count": 306928, + "project": "pytest-flakes" + }, + { + "download_count": 306784, + "project": "thespian" + }, + { + "download_count": 305826, + "project": "pykcs11" + }, + { + "download_count": 305226, + "project": "singer-python" + }, + { + "download_count": 304755, + "project": "pyprind" + }, + { + "download_count": 304717, + "project": "abbyy" + }, + { + "download_count": 304490, + "project": "flask-restful-swagger" + }, + { + "download_count": 304399, + "project": "os-api-ref" + }, + { + "download_count": 304195, + "project": "simpleitk" + }, + { + "download_count": 304060, + "project": "unicorn" + }, + { + "download_count": 304021, + "project": "jobspy" + }, + { + "download_count": 303998, + "project": "devpi-common" + }, + { + "download_count": 303970, + "project": "jsonpath" + }, + { + "download_count": 303806, + "project": "pysubnettree" + }, + { + "download_count": 303693, + "project": "hypercorn" + }, + { + "download_count": 303592, + "project": "scrapy-random-useragent" + }, + { + "download_count": 303497, + "project": "zope-schema" + }, + { + "download_count": 303260, + "project": "newspaper3k" + }, + { + "download_count": 302739, + "project": "pyspellchecker" + }, + { + "download_count": 302714, + "project": "password" + }, + { + "download_count": 302400, + "project": "testlink-api-python-client" + }, + { + "download_count": 302299, + "project": "dogpile-core" + }, + { + "download_count": 302266, + "project": "nilearn" + }, + { + "download_count": 302076, + "project": "pylibftdi" + }, + { + "download_count": 301868, + "project": "python-termstyle" + }, + { + "download_count": 301830, + "project": "pybreaker" + }, + { + "download_count": 301435, + "project": "django-wkhtmltopdf" + }, + { + "download_count": 300585, + "project": "pyxdameraulevenshtein" + }, + { + "download_count": 300425, + "project": "hpsklearn" + }, + { + "download_count": 300421, + "project": "tesserocr" + }, + { + "download_count": 300359, + "project": "django-templated-mail" + }, + { + "download_count": 300207, + "project": "comet-git-pure" + }, + { + "download_count": 299910, + "project": "httpcore" + }, + { + "download_count": 299706, + "project": "simhash" + }, + { + "download_count": 299276, + "project": "aspy-refactor-imports" + }, + { + "download_count": 298943, + "project": "fcm-django" + }, + { + "download_count": 298927, + "project": "flask-jwt" + }, + { + "download_count": 298823, + "project": "serial" + }, + { + "download_count": 298802, + "project": "binary" + }, + { + "download_count": 298544, + "project": "plaidml" + }, + { + "download_count": 298085, + "project": "python-oauth2" + }, + { + "download_count": 297969, + "project": "opencv-contrib-python-headless" + }, + { + "download_count": 297585, + "project": "djangocms-text-ckeditor" + }, + { + "download_count": 297361, + "project": "better-exceptions-fork" + }, + { + "download_count": 297253, + "project": "dynamodb-json" + }, + { + "download_count": 297052, + "project": "bitmath" + }, + { + "download_count": 296269, + "project": "condor-git-config" + }, + { + "download_count": 296162, + "project": "cornice" + }, + { + "download_count": 295986, + "project": "polyglot" + }, + { + "download_count": 295722, + "project": "pytelegrambotapi" + }, + { + "download_count": 295667, + "project": "mbed-cloud-sdk" + }, + { + "download_count": 295592, + "project": "behave-django" + }, + { + "download_count": 295509, + "project": "modernize" + }, + { + "download_count": 295419, + "project": "libusb1" + }, + { + "download_count": 295355, + "project": "edx-organizations" + }, + { + "download_count": 294743, + "project": "sendgrid-django" + }, + { + "download_count": 294453, + "project": "sniffio" + }, + { + "download_count": 294364, + "project": "slugid" + }, + { + "download_count": 294093, + "project": "pypika" + }, + { + "download_count": 293799, + "project": "oci-cli" + }, + { + "download_count": 293404, + "project": "django-rosetta" + }, + { + "download_count": 293277, + "project": "proxmoxer" + }, + { + "download_count": 292761, + "project": "anytemplate" + }, + { + "download_count": 292649, + "project": "raven-aiohttp" + }, + { + "download_count": 292327, + "project": "bbcode" + }, + { + "download_count": 292281, + "project": "protego" + }, + { + "download_count": 292277, + "project": "securesystemslib" + }, + { + "download_count": 292249, + "project": "outcome" + }, + { + "download_count": 291695, + "project": "crontab" + }, + { + "download_count": 291636, + "project": "pytelegraf" + }, + { + "download_count": 291495, + "project": "pylbfgs" + }, + { + "download_count": 291341, + "project": "asttokens" + }, + { + "download_count": 291275, + "project": "wtforms-components" + }, + { + "download_count": 291039, + "project": "elasticsearch-async" + }, + { + "download_count": 290811, + "project": "py-dateutil" + }, + { + "download_count": 290793, + "project": "buildbot-worker" + }, + { + "download_count": 290753, + "project": "atpublic" + }, + { + "download_count": 290628, + "project": "django-cleanup" + }, + { + "download_count": 290574, + "project": "urlopen" + }, + { + "download_count": 290457, + "project": "cleanco" + }, + { + "download_count": 290025, + "project": "home-assistant-frontend" + }, + { + "download_count": 289983, + "project": "azureml-widgets" + }, + { + "download_count": 289907, + "project": "pycallgraph" + }, + { + "download_count": 289633, + "project": "biplist" + }, + { + "download_count": 289587, + "project": "django-datatables-view" + }, + { + "download_count": 289573, + "project": "guppy" + }, + { + "download_count": 289366, + "project": "kaggle" + }, + { + "download_count": 289053, + "project": "ratelimiter" + }, + { + "download_count": 288392, + "project": "requests-aws" + }, + { + "download_count": 288145, + "project": "prov" + }, + { + "download_count": 288066, + "project": "xmodem" + }, + { + "download_count": 287756, + "project": "pyobjc-framework-fsevents" + }, + { + "download_count": 287736, + "project": "djangorestframework-stubs" + }, + { + "download_count": 287716, + "project": "dailymotion" + }, + { + "download_count": 287610, + "project": "airspeed" + }, + { + "download_count": 287211, + "project": "pdfminer3k" + }, + { + "download_count": 286932, + "project": "django-admin-tools" + }, + { + "download_count": 286676, + "project": "rfc3339" + }, + { + "download_count": 286568, + "project": "runlike" + }, + { + "download_count": 286494, + "project": "pyobjc-framework-systemconfiguration" + }, + { + "download_count": 286287, + "project": "flask-swagger-ui" + }, + { + "download_count": 286286, + "project": "pyrabbit" + }, + { + "download_count": 286217, + "project": "pyobjc-framework-cfnetwork" + }, + { + "download_count": 285962, + "project": "django-htmlmin" + }, + { + "download_count": 285937, + "project": "affinegap" + }, + { + "download_count": 285640, + "project": "django-smart-selects" + }, + { + "download_count": 285368, + "project": "jaraco-classes" + }, + { + "download_count": 285182, + "project": "pyjq" + }, + { + "download_count": 284862, + "project": "plaidml-keras" + }, + { + "download_count": 284806, + "project": "pyobjc-framework-webkit" + }, + { + "download_count": 284790, + "project": "jq" + }, + { + "download_count": 284781, + "project": "django-taggit-serializer" + }, + { + "download_count": 284424, + "project": "robotframework-databaselibrary" + }, + { + "download_count": 284410, + "project": "httpsig-cffi" + }, + { + "download_count": 284050, + "project": "instaloader" + }, + { + "download_count": 284049, + "project": "powerline-status" + }, + { + "download_count": 283986, + "project": "tap-py" + }, + { + "download_count": 283939, + "project": "devpi-client" + }, + { + "download_count": 283785, + "project": "banal" + }, + { + "download_count": 283663, + "project": "docx" + }, + { + "download_count": 283563, + "project": "python-geoip-geolite2" + }, + { + "download_count": 283441, + "project": "bitstruct" + }, + { + "download_count": 283402, + "project": "pyramid-jinja2" + }, + { + "download_count": 283279, + "project": "graphitesend" + }, + { + "download_count": 283227, + "project": "metafone" + }, + { + "download_count": 283149, + "project": "tinysegmenter" + }, + { + "download_count": 282747, + "project": "sqlalchemy-continuum" + }, + { + "download_count": 282696, + "project": "opencensus-ext-stackdriver" + }, + { + "download_count": 282668, + "project": "waiter" + }, + { + "download_count": 282655, + "project": "sphinx-gallery" + }, + { + "download_count": 282575, + "project": "git-pylint-commit-hook" + }, + { + "download_count": 282479, + "project": "fuzzyset" + }, + { + "download_count": 282254, + "project": "pytest-custom-exit-code" + }, + { + "download_count": 281823, + "project": "hyperas" + }, + { + "download_count": 281726, + "project": "django-simple-captcha" + }, + { + "download_count": 281640, + "project": "dynamodb-encryption-sdk" + }, + { + "download_count": 281597, + "project": "openexr" + }, + { + "download_count": 281522, + "project": "pid" + }, + { + "download_count": 281467, + "project": "irc3-plugins-test" + }, + { + "download_count": 280788, + "project": "murmurhash3" + }, + { + "download_count": 280402, + "project": "quart" + }, + { + "download_count": 280081, + "project": "salesforce-bulkipy" + }, + { + "download_count": 279935, + "project": "sphinx-argparse" + }, + { + "download_count": 279690, + "project": "pptree" + }, + { + "download_count": 279227, + "project": "djangorestframework-jsonapi" + }, + { + "download_count": 279117, + "project": "marshmallow-polyfield" + }, + { + "download_count": 278996, + "project": "tls-syslog" + }, + { + "download_count": 278801, + "project": "fastprogress" + }, + { + "download_count": 278661, + "project": "style" + }, + { + "download_count": 278616, + "project": "pyjsparser" + }, + { + "download_count": 278381, + "project": "celery-redbeat" + }, + { + "download_count": 278041, + "project": "dbutils" + }, + { + "download_count": 277922, + "project": "zvmcloudconnector" + }, + { + "download_count": 277703, + "project": "blockdiag" + }, + { + "download_count": 277555, + "project": "jsl" + }, + { + "download_count": 277355, + "project": "aiomysql" + }, + { + "download_count": 277155, + "project": "softlayer" + }, + { + "download_count": 276993, + "project": "levenshtein-search" + }, + { + "download_count": 276886, + "project": "gender-guesser" + }, + { + "download_count": 276825, + "project": "msal" + }, + { + "download_count": 276567, + "project": "sqlalchemy-stubs" + }, + { + "download_count": 276536, + "project": "pyliblzma" + }, + { + "download_count": 276486, + "project": "django-sass-processor" + }, + { + "download_count": 276464, + "project": "django-url-filter" + }, + { + "download_count": 276353, + "project": "sanic-plugins-framework" + }, + { + "download_count": 276240, + "project": "jxmlease" + }, + { + "download_count": 275861, + "project": "purl" + }, + { + "download_count": 275254, + "project": "base36" + }, + { + "download_count": 275159, + "project": "pytools" + }, + { + "download_count": 275147, + "project": "datrie" + }, + { + "download_count": 274643, + "project": "zxcvbn-python" + }, + { + "download_count": 274395, + "project": "pytest-datafiles" + }, + { + "download_count": 273920, + "project": "pyspark-stubs" + }, + { + "download_count": 273728, + "project": "natto-py" + }, + { + "download_count": 273719, + "project": "mechanicalsoup" + }, + { + "download_count": 273603, + "project": "sqlalchemy-postgres-copy" + }, + { + "download_count": 273574, + "project": "pycosat" + }, + { + "download_count": 273348, + "project": "q" + }, + { + "download_count": 273202, + "project": "backpack" + }, + { + "download_count": 273056, + "project": "gmplot" + }, + { + "download_count": 273050, + "project": "websockify" + }, + { + "download_count": 273001, + "project": "measurement" + }, + { + "download_count": 272990, + "project": "hass-nabucasa" + }, + { + "download_count": 272948, + "project": "virtualenvwrapper-win" + }, + { + "download_count": 272942, + "project": "email" + }, + { + "download_count": 272542, + "project": "pyobjc-framework-launchservices" + }, + { + "download_count": 272383, + "project": "webdriver-manager" + }, + { + "download_count": 272315, + "project": "google-oauth" + }, + { + "download_count": 272029, + "project": "django-js-reverse" + }, + { + "download_count": 271929, + "project": "meinheld" + }, + { + "download_count": 271914, + "project": "yapsy" + }, + { + "download_count": 271877, + "project": "nteract-scrapbook" + }, + { + "download_count": 271874, + "project": "mouseinfo" + }, + { + "download_count": 271864, + "project": "pyobjc-framework-exceptionhandling" + }, + { + "download_count": 271786, + "project": "dbt" + }, + { + "download_count": 271483, + "project": "django-tagging" + }, + { + "download_count": 271439, + "project": "taskcluster" + }, + { + "download_count": 271349, + "project": "evdev" + }, + { + "download_count": 270918, + "project": "dedupe-hcluster" + }, + { + "download_count": 270898, + "project": "tensor2tensor" + }, + { + "download_count": 270014, + "project": "pymacaroons" + }, + { + "download_count": 269770, + "project": "kivy-garden" + }, + { + "download_count": 269533, + "project": "nine" + }, + { + "download_count": 269249, + "project": "highered" + }, + { + "download_count": 269216, + "project": "sounddevice" + }, + { + "download_count": 268421, + "project": "docx2txt" + }, + { + "download_count": 268411, + "project": "robotframework-debuglibrary" + }, + { + "download_count": 268172, + "project": "aioamqp" + }, + { + "download_count": 268107, + "project": "cma" + }, + { + "download_count": 267772, + "project": "netstruct" + }, + { + "download_count": 267766, + "project": "pyhacrf-datamade" + }, + { + "download_count": 267588, + "project": "flake8-junit-report" + }, + { + "download_count": 267292, + "project": "wptools" + }, + { + "download_count": 266807, + "project": "bump2version" + }, + { + "download_count": 266733, + "project": "lesscpy" + }, + { + "download_count": 266561, + "project": "pytest-vcr" + }, + { + "download_count": 266544, + "project": "pyexcel-webio" + }, + { + "download_count": 266422, + "project": "maya" + }, + { + "download_count": 266355, + "project": "robotframework-xvfb" + }, + { + "download_count": 266132, + "project": "dedupe" + }, + { + "download_count": 266017, + "project": "pyminifier" + }, + { + "download_count": 265818, + "project": "winkerberos" + }, + { + "download_count": 265798, + "project": "mozanalysis" + }, + { + "download_count": 265437, + "project": "username-generator" + }, + { + "download_count": 265328, + "project": "phpserialize" + }, + { + "download_count": 265105, + "project": "crc32c" + }, + { + "download_count": 264933, + "project": "pretrainedmodels" + }, + { + "download_count": 264845, + "project": "pytest-remotedata" + }, + { + "download_count": 264729, + "project": "python-owasp-zap-v2-4" + }, + { + "download_count": 264669, + "project": "nexpose" + }, + { + "download_count": 264414, + "project": "http-parser" + }, + { + "download_count": 264412, + "project": "pyobjc-framework-diskarbitration" + }, + { + "download_count": 264322, + "project": "dsp3" + }, + { + "download_count": 264189, + "project": "rlr" + }, + { + "download_count": 263902, + "project": "pyqt5-tools" + }, + { + "download_count": 263840, + "project": "json-tricks" + }, + { + "download_count": 263390, + "project": "categorical-distance" + }, + { + "download_count": 263282, + "project": "datalab" + }, + { + "download_count": 263021, + "project": "update" + }, + { + "download_count": 262783, + "project": "blobfile" + }, + { + "download_count": 262644, + "project": "zc-buildout" + }, + { + "download_count": 262529, + "project": "dedupe-variable-datetime" + }, + { + "download_count": 262152, + "project": "simplecosine" + }, + { + "download_count": 261988, + "project": "pytest-mockito" + }, + { + "download_count": 261860, + "project": "django-otp-twilio" + }, + { + "download_count": 261797, + "project": "django-chartit" + }, + { + "download_count": 261611, + "project": "datetime-distance" + }, + { + "download_count": 260878, + "project": "jaraco-text" + }, + { + "download_count": 260837, + "project": "fastrlock" + }, + { + "download_count": 260816, + "project": "flake8-future-import" + }, + { + "download_count": 260795, + "project": "pyghmi" + }, + { + "download_count": 260576, + "project": "orator" + }, + { + "download_count": 260536, + "project": "flake8-tuple" + }, + { + "download_count": 260250, + "project": "aiocache" + }, + { + "download_count": 260202, + "project": "cli53" + }, + { + "download_count": 260043, + "project": "untokenize" + }, + { + "download_count": 259904, + "project": "newrelic-plugin-agent" + }, + { + "download_count": 259773, + "project": "pyangbind" + }, + { + "download_count": 259756, + "project": "django-pyodbc-azure" + }, + { + "download_count": 259273, + "project": "zstd" + }, + { + "download_count": 258974, + "project": "pymodbus" + }, + { + "download_count": 258942, + "project": "jupyter-spark" + }, + { + "download_count": 258875, + "project": "django-sortedm2m" + }, + { + "download_count": 258300, + "project": "python-logstash-async" + }, + { + "download_count": 258254, + "project": "django-graphql-jwt" + }, + { + "download_count": 257389, + "project": "elasticquery" + }, + { + "download_count": 257227, + "project": "python-keycloak" + }, + { + "download_count": 257086, + "project": "dbus-python" + }, + { + "download_count": 257005, + "project": "cmarkgfm" + }, + { + "download_count": 256972, + "project": "pysrt" + }, + { + "download_count": 256801, + "project": "pyobjc-framework-coreservices" + }, + { + "download_count": 256683, + "project": "django-paypal" + }, + { + "download_count": 256576, + "project": "spur" + }, + { + "download_count": 256447, + "project": "iniparse" + }, + { + "download_count": 256111, + "project": "python-terraform" + }, + { + "download_count": 255860, + "project": "djangorestframework-jsonp" + }, + { + "download_count": 255835, + "project": "rethinkdb" + }, + { + "download_count": 255719, + "project": "mozcrash" + }, + { + "download_count": 255201, + "project": "pyobjc-framework-quartz" + }, + { + "download_count": 254935, + "project": "django-organizations" + }, + { + "download_count": 254677, + "project": "django-colorfield" + }, + { + "download_count": 254646, + "project": "marshmallow-jsonapi" + }, + { + "download_count": 254107, + "project": "djangorestframework-expander" + }, + { + "download_count": 253885, + "project": "dci-utils" + }, + { + "download_count": 253884, + "project": "pql" + }, + { + "download_count": 253867, + "project": "tf-nightly-2-0-preview" + }, + { + "download_count": 253608, + "project": "django-parler" + }, + { + "download_count": 253475, + "project": "telethon" + }, + { + "download_count": 253099, + "project": "celery-once" + }, + { + "download_count": 253054, + "project": "scales" + }, + { + "download_count": 253035, + "project": "rocketchat-api" + }, + { + "download_count": 252896, + "project": "jaraco-collections" + }, + { + "download_count": 252760, + "project": "yaql" + }, + { + "download_count": 252588, + "project": "pyinquirer" + }, + { + "download_count": 252471, + "project": "django-session-security" + }, + { + "download_count": 252413, + "project": "django-rest-knox" + }, + { + "download_count": 252295, + "project": "django-redshift-backend" + }, + { + "download_count": 251901, + "project": "sphinx-markdown-tables" + }, + { + "download_count": 251862, + "project": "sceptre" + }, + { + "download_count": 251840, + "project": "py-mini-racer" + }, + { + "download_count": 251759, + "project": "python-rake" + }, + { + "download_count": 251594, + "project": "oauth2-client" + }, + { + "download_count": 251347, + "project": "env" + }, + { + "download_count": 251337, + "project": "timedelta" + }, + { + "download_count": 250784, + "project": "awkward" + }, + { + "download_count": 250362, + "project": "edx-rbac" + }, + { + "download_count": 250192, + "project": "flask-log-request-id" + }, + { + "download_count": 250110, + "project": "globre" + }, + { + "download_count": 249752, + "project": "django-easy-pdf" + }, + { + "download_count": 249646, + "project": "prettyexc" + }, + { + "download_count": 249416, + "project": "django-notifications-hq" + }, + { + "download_count": 249316, + "project": "mozleak" + }, + { + "download_count": 249286, + "project": "autograd-gamma" + }, + { + "download_count": 249216, + "project": "flask-injector" + }, + { + "download_count": 249101, + "project": "holoviews" + }, + { + "download_count": 249064, + "project": "inflector" + }, + { + "download_count": 248895, + "project": "django-honeypot" + }, + { + "download_count": 248839, + "project": "pip-api" + }, + { + "download_count": 248670, + "project": "pytest-testmon" + }, + { + "download_count": 248527, + "project": "pycapnp" + }, + { + "download_count": 248395, + "project": "pgpy" + }, + { + "download_count": 248134, + "project": "pretend" + }, + { + "download_count": 247952, + "project": "webhelpers" + }, + { + "download_count": 247612, + "project": "iso4217" + }, + { + "download_count": 247588, + "project": "chargebee" + }, + { + "download_count": 247194, + "project": "logging-tree" + }, + { + "download_count": 247097, + "project": "bcolz" + }, + { + "download_count": 247095, + "project": "pydomo" + }, + { + "download_count": 247093, + "project": "pyviz-comms" + }, + { + "download_count": 246905, + "project": "pyes" + }, + { + "download_count": 246637, + "project": "patool" + }, + { + "download_count": 246609, + "project": "django-saml2-auth" + }, + { + "download_count": 246442, + "project": "lorem" + }, + { + "download_count": 246345, + "project": "kociemba" + }, + { + "download_count": 245924, + "project": "nylas" + }, + { + "download_count": 245599, + "project": "urlparse3" + }, + { + "download_count": 245592, + "project": "pytest-tornado" + }, + { + "download_count": 245425, + "project": "inject" + }, + { + "download_count": 244242, + "project": "tabledata" + }, + { + "download_count": 244197, + "project": "percy" + }, + { + "download_count": 243680, + "project": "snitun" + }, + { + "download_count": 243665, + "project": "django-debug-toolbar-line-profiler" + }, + { + "download_count": 243077, + "project": "bottlenose" + }, + { + "download_count": 242781, + "project": "infi-clickhouse-orm" + }, + { + "download_count": 242659, + "project": "reppy" + }, + { + "download_count": 242378, + "project": "in-toto" + }, + { + "download_count": 242112, + "project": "azureml" + }, + { + "download_count": 242067, + "project": "django-common-helpers" + }, + { + "download_count": 241994, + "project": "django-hijack-admin" + }, + { + "download_count": 241868, + "project": "cmreshandler" + }, + { + "download_count": 241645, + "project": "ruptures" + }, + { + "download_count": 241594, + "project": "goslate" + }, + { + "download_count": 241370, + "project": "aggdraw" + }, + { + "download_count": 241223, + "project": "django-boto" + }, + { + "download_count": 240546, + "project": "svn" + }, + { + "download_count": 240121, + "project": "ssh" + }, + { + "download_count": 240049, + "project": "py3dns" + }, + { + "download_count": 239971, + "project": "pymonkey" + }, + { + "download_count": 239838, + "project": "great-expectations" + }, + { + "download_count": 239830, + "project": "pip-custom-platform" + }, + { + "download_count": 239729, + "project": "django-libsass" + }, + { + "download_count": 239683, + "project": "mirakuru" + }, + { + "download_count": 239680, + "project": "microsoftgraph-python" + }, + { + "download_count": 239524, + "project": "gnocchiclient" + }, + { + "download_count": 239407, + "project": "pyct" + }, + { + "download_count": 239390, + "project": "ansible-runner" + }, + { + "download_count": 239360, + "project": "dbt-core" + }, + { + "download_count": 239183, + "project": "hellosign-python-sdk" + }, + { + "download_count": 239095, + "project": "pyaudioanalysis" + }, + { + "download_count": 239001, + "project": "reportportal-client" + }, + { + "download_count": 238983, + "project": "itunes-iap" + }, + { + "download_count": 238603, + "project": "terminalone" + }, + { + "download_count": 238597, + "project": "snaptime" + }, + { + "download_count": 238394, + "project": "aiormq" + }, + { + "download_count": 238154, + "project": "djangocms-attributes-field" + }, + { + "download_count": 238141, + "project": "django-versatileimagefield" + }, + { + "download_count": 237972, + "project": "django-push-notifications" + }, + { + "download_count": 237750, + "project": "transliterate" + }, + { + "download_count": 237652, + "project": "whaaaaat" + }, + { + "download_count": 237622, + "project": "django-sslify" + }, + { + "download_count": 237558, + "project": "towncrier" + }, + { + "download_count": 237018, + "project": "py-lz4framed" + }, + { + "download_count": 236912, + "project": "uproot-methods" + }, + { + "download_count": 236619, + "project": "django-statici18n" + }, + { + "download_count": 236529, + "project": "pytd" + }, + { + "download_count": 236270, + "project": "pep517" + }, + { + "download_count": 236180, + "project": "py-ecc" + }, + { + "download_count": 236180, + "project": "layered-yaml-attrdict-config" + }, + { + "download_count": 235952, + "project": "varint" + }, + { + "download_count": 235921, + "project": "spotipy" + }, + { + "download_count": 235732, + "project": "django-markdown-deux" + }, + { + "download_count": 235635, + "project": "geventhttpclient-wheels" + }, + { + "download_count": 235481, + "project": "parallel-ssh" + }, + { + "download_count": 235241, + "project": "event-tracking" + }, + { + "download_count": 234835, + "project": "jupyterthemes" + }, + { + "download_count": 234721, + "project": "django-pandas" + }, + { + "download_count": 234582, + "project": "stackprinter" + }, + { + "download_count": 234393, + "project": "probablepeople" + }, + { + "download_count": 234334, + "project": "flake8-eradicate" + }, + { + "download_count": 234277, + "project": "mode" + }, + { + "download_count": 234271, + "project": "asset" + }, + { + "download_count": 234150, + "project": "loggly-python-handler" + }, + { + "download_count": 233705, + "project": "supervisor-wildcards" + }, + { + "download_count": 233601, + "project": "edx-bulk-grades" + }, + { + "download_count": 233407, + "project": "glean-parser" + }, + { + "download_count": 233242, + "project": "morfessor" + }, + { + "download_count": 233191, + "project": "pyzbar" + }, + { + "download_count": 232874, + "project": "nbstripout" + }, + { + "download_count": 232838, + "project": "mnemonic" + }, + { + "download_count": 232704, + "project": "pyeclib" + }, + { + "download_count": 232607, + "project": "flask-sockets" + }, + { + "download_count": 232578, + "project": "esrally" + }, + { + "download_count": 232565, + "project": "django-crontab" + }, + { + "download_count": 232517, + "project": "standardjson" + }, + { + "download_count": 232389, + "project": "sphinxcontrib-svg2pdfconverter" + }, + { + "download_count": 232208, + "project": "jep" + }, + { + "download_count": 231947, + "project": "contractions" + }, + { + "download_count": 231914, + "project": "hashlib" + }, + { + "download_count": 231894, + "project": "hdrhistogram" + }, + { + "download_count": 231873, + "project": "pydoe" + }, + { + "download_count": 231818, + "project": "colorhash" + }, + { + "download_count": 231678, + "project": "venv-update" + }, + { + "download_count": 231678, + "project": "pytidylib" + }, + { + "download_count": 231634, + "project": "sas7bdat" + }, + { + "download_count": 231555, + "project": "pybrain" + }, + { + "download_count": 231491, + "project": "locust" + }, + { + "download_count": 231449, + "project": "easygui" + }, + { + "download_count": 231322, + "project": "pytest-qt" + }, + { + "download_count": 231297, + "project": "prance" + }, + { + "download_count": 231250, + "project": "nose-ignore-docstring" + }, + { + "download_count": 231113, + "project": "snakeviz" + }, + { + "download_count": 231027, + "project": "pygaljs" + }, + { + "download_count": 230954, + "project": "rainbow-saddle" + }, + { + "download_count": 230879, + "project": "wsgiref" + }, + { + "download_count": 230659, + "project": "django-config-models" + }, + { + "download_count": 230631, + "project": "django-partial-index" + }, + { + "download_count": 230614, + "project": "restrictedpython" + }, + { + "download_count": 230470, + "project": "consulate" + }, + { + "download_count": 230441, + "project": "django-s3-storage" + }, + { + "download_count": 230436, + "project": "jenkins" + }, + { + "download_count": 230427, + "project": "mtranslate" + }, + { + "download_count": 230393, + "project": "aiosmtplib" + }, + { + "download_count": 230248, + "project": "django-statsd-mozilla" + }, + { + "download_count": 229850, + "project": "ffmpeg" + }, + { + "download_count": 229620, + "project": "django-ranged-response" + }, + { + "download_count": 229579, + "project": "pytest-cover" + }, + { + "download_count": 229403, + "project": "flexget" + }, + { + "download_count": 229292, + "project": "django-cachalot" + }, + { + "download_count": 229142, + "project": "django-activity-stream" + }, + { + "download_count": 229046, + "project": "daemonocle" + }, + { + "download_count": 228702, + "project": "mimerender" + }, + { + "download_count": 228552, + "project": "mathematics-dataset" + }, + { + "download_count": 228521, + "project": "money" + }, + { + "download_count": 228488, + "project": "flake8-formatter-junit-xml" + }, + { + "download_count": 228281, + "project": "python-vagrant" + }, + { + "download_count": 228240, + "project": "parquet" + }, + { + "download_count": 228235, + "project": "asciimatics" + }, + { + "download_count": 228066, + "project": "singleton-decorator" + }, + { + "download_count": 228004, + "project": "petl" + }, + { + "download_count": 227997, + "project": "dogpile" + }, + { + "download_count": 227746, + "project": "beaver" + }, + { + "download_count": 227738, + "project": "dbt-postgres" + }, + { + "download_count": 227570, + "project": "patch-ng" + }, + { + "download_count": 227212, + "project": "pytest-replay" + }, + { + "download_count": 227202, + "project": "django-settings-export" + }, + { + "download_count": 227048, + "project": "traittypes" + }, + { + "download_count": 227010, + "project": "ipcalc" + }, + { + "download_count": 226931, + "project": "django-elasticache" + }, + { + "download_count": 226656, + "project": "pywsd" + }, + { + "download_count": 226426, + "project": "flask-kvsession" + }, + { + "download_count": 226328, + "project": "pytest-logging" + }, + { + "download_count": 226143, + "project": "java-random" + }, + { + "download_count": 226134, + "project": "flask-seasurf" + }, + { + "download_count": 226129, + "project": "posix-ipc" + }, + { + "download_count": 226063, + "project": "zconfig" + }, + { + "download_count": 225964, + "project": "flask-uuid" + }, + { + "download_count": 225932, + "project": "djangorestframework-oauth" + }, + { + "download_count": 225898, + "project": "nest-asyncio" + }, + { + "download_count": 225852, + "project": "flock" + }, + { + "download_count": 225551, + "project": "taskcluster-urls" + }, + { + "download_count": 225391, + "project": "cntk" + }, + { + "download_count": 224972, + "project": "lolcat" + }, + { + "download_count": 224933, + "project": "pyramid-beaker" + }, + { + "download_count": 224799, + "project": "pytest-allure-adaptor" + }, + { + "download_count": 224606, + "project": "openapi-core" + }, + { + "download_count": 224528, + "project": "jaraco-itertools" + }, + { + "download_count": 224426, + "project": "emcee" + }, + { + "download_count": 224246, + "project": "trio" + }, + { + "download_count": 224218, + "project": "plotly-express" + }, + { + "download_count": 224064, + "project": "hexdump" + }, + { + "download_count": 224043, + "project": "binpacking" + }, + { + "download_count": 224021, + "project": "babelfish" + }, + { + "download_count": 223853, + "project": "bincrafters-package-tools" + }, + { + "download_count": 223736, + "project": "edx-rest-api-client" + }, + { + "download_count": 223721, + "project": "rstcheck" + }, + { + "download_count": 223494, + "project": "pylogo" + }, + { + "download_count": 223248, + "project": "h2o-pysparkling-2-3" + }, + { + "download_count": 223214, + "project": "pybloom" + }, + { + "download_count": 222931, + "project": "python3-memcached" + }, + { + "download_count": 222858, + "project": "conda" + }, + { + "download_count": 222781, + "project": "confusable-homoglyphs" + }, + { + "download_count": 222739, + "project": "loky" + }, + { + "download_count": 222684, + "project": "super-csv" + }, + { + "download_count": 222634, + "project": "jprops" + }, + { + "download_count": 222587, + "project": "keyvaultlib" + }, + { + "download_count": 222554, + "project": "fbmessenger" + }, + { + "download_count": 222508, + "project": "wiremock" + }, + { + "download_count": 222412, + "project": "django-prettyjson" + }, + { + "download_count": 222176, + "project": "hug" + }, + { + "download_count": 222175, + "project": "mws" + }, + { + "download_count": 221970, + "project": "dash-daq" + }, + { + "download_count": 221895, + "project": "slycot" + }, + { + "download_count": 221892, + "project": "flask-uploads" + }, + { + "download_count": 221647, + "project": "alooma" + }, + { + "download_count": 221631, + "project": "muffnn" + }, + { + "download_count": 221604, + "project": "python-gettext" + }, + { + "download_count": 221598, + "project": "civisml-extensions" + }, + { + "download_count": 221440, + "project": "jaydebeapi3" + }, + { + "download_count": 221407, + "project": "scikit-plot" + }, + { + "download_count": 220993, + "project": "twitter-ads" + }, + { + "download_count": 220495, + "project": "pandoc" + }, + { + "download_count": 220301, + "project": "nplusone" + }, + { + "download_count": 220198, + "project": "sudachipy" + }, + { + "download_count": 220107, + "project": "django-render-block" + }, + { + "download_count": 219983, + "project": "pyrebase" + }, + { + "download_count": 219731, + "project": "fabric2" + }, + { + "download_count": 219711, + "project": "cloudfoundry-client" + }, + { + "download_count": 219544, + "project": "edx-completion" + }, + { + "download_count": 219404, + "project": "tabulator" + }, + { + "download_count": 219376, + "project": "django-cron" + }, + { + "download_count": 219261, + "project": "sk-video" + }, + { + "download_count": 219216, + "project": "zope-i18nmessageid" + }, + { + "download_count": 218973, + "project": "colorful" + }, + { + "download_count": 218307, + "project": "s4cmd" + }, + { + "download_count": 218171, + "project": "pychromecast" + }, + { + "download_count": 218073, + "project": "pyvisa" + }, + { + "download_count": 217824, + "project": "bok-choy" + }, + { + "download_count": 217614, + "project": "py-zipkin" + }, + { + "download_count": 217311, + "project": "ansible-modules-hashivault" + }, + { + "download_count": 217201, + "project": "datefinder" + }, + { + "download_count": 217188, + "project": "json-logic-qubit" + }, + { + "download_count": 216980, + "project": "sparse-dot-topn" + }, + { + "download_count": 216825, + "project": "flask-dance" + }, + { + "download_count": 216707, + "project": "aiml" + }, + { + "download_count": 216645, + "project": "certipy" + }, + { + "download_count": 216205, + "project": "area" + }, + { + "download_count": 216115, + "project": "sphinx-click" + }, + { + "download_count": 215902, + "project": "pylint-common" + }, + { + "download_count": 215763, + "project": "stompest" + }, + { + "download_count": 215715, + "project": "questionary" + }, + { + "download_count": 215011, + "project": "lupa" + }, + { + "download_count": 214880, + "project": "usbinfo" + }, + { + "download_count": 214864, + "project": "marshmallow-objects" + }, + { + "download_count": 214855, + "project": "django-encrypted-filefield" + }, + { + "download_count": 214793, + "project": "kerberos" + }, + { + "download_count": 214757, + "project": "isim" + }, + { + "download_count": 214507, + "project": "flask-moment" + }, + { + "download_count": 214468, + "project": "boto3-session-cache" + }, + { + "download_count": 214280, + "project": "yacs" + }, + { + "download_count": 214088, + "project": "bigquery-python" + }, + { + "download_count": 213952, + "project": "mobly" + }, + { + "download_count": 213688, + "project": "pyethash" + }, + { + "download_count": 213494, + "project": "django-colorful" + }, + { + "download_count": 213445, + "project": "ics" + }, + { + "download_count": 213185, + "project": "eyes-selenium" + }, + { + "download_count": 213156, + "project": "zdesk" + }, + { + "download_count": 213151, + "project": "requests-credssp" + }, + { + "download_count": 213071, + "project": "autosemver" + }, + { + "download_count": 212879, + "project": "ffx" + }, + { + "download_count": 212740, + "project": "wn" + }, + { + "download_count": 212739, + "project": "linear-tsv" + }, + { + "download_count": 212738, + "project": "webexteamssdk" + }, + { + "download_count": 212640, + "project": "circus" + }, + { + "download_count": 212529, + "project": "multiaddr" + }, + { + "download_count": 212516, + "project": "zipcode" + }, + { + "download_count": 212435, + "project": "dbt-bigquery" + }, + { + "download_count": 212295, + "project": "androguard" + }, + { + "download_count": 212275, + "project": "gapic-google-cloud-spanner-v1" + }, + { + "download_count": 212211, + "project": "gapic-google-cloud-spanner-admin-database-v1" + }, + { + "download_count": 212204, + "project": "gapic-google-cloud-spanner-admin-instance-v1" + }, + { + "download_count": 212074, + "project": "proto-google-cloud-spanner-v1" + }, + { + "download_count": 211988, + "project": "pip-review" + }, + { + "download_count": 211861, + "project": "passwordmeter" + }, + { + "download_count": 211783, + "project": "dbt-redshift" + }, + { + "download_count": 211766, + "project": "proto-google-cloud-spanner-admin-database-v1" + }, + { + "download_count": 211758, + "project": "proto-google-cloud-spanner-admin-instance-v1" + }, + { + "download_count": 211695, + "project": "python-prctl" + }, + { + "download_count": 211523, + "project": "dbt-snowflake" + }, + { + "download_count": 211483, + "project": "aws-kinesis-agg" + }, + { + "download_count": 211368, + "project": "pwntools" + }, + { + "download_count": 211309, + "project": "fs-s3fs" + }, + { + "download_count": 211286, + "project": "cloudshell-automation-api" + }, + { + "download_count": 211188, + "project": "postgres" + }, + { + "download_count": 211130, + "project": "pymeta3" + }, + { + "download_count": 210970, + "project": "robotframework-jsonlibrary" + }, + { + "download_count": 210929, + "project": "conllu" + }, + { + "download_count": 210633, + "project": "rpi-gpio" + }, + { + "download_count": 210596, + "project": "aresponses" + }, + { + "download_count": 210520, + "project": "textacy" + }, + { + "download_count": 210501, + "project": "djangocms-link" + }, + { + "download_count": 210080, + "project": "uproot" + }, + { + "download_count": 209987, + "project": "django-fsm-admin" + }, + { + "download_count": 209975, + "project": "anybadge" + }, + { + "download_count": 209424, + "project": "clearbit" + }, + { + "download_count": 209150, + "project": "fakenewsredis" + }, + { + "download_count": 209126, + "project": "sdnotify" + }, + { + "download_count": 209028, + "project": "python-baseconv" + }, + { + "download_count": 208950, + "project": "pytest-dotenv" + }, + { + "download_count": 208654, + "project": "pytest-logger" + }, + { + "download_count": 208524, + "project": "c7n" + }, + { + "download_count": 208338, + "project": "webium" + }, + { + "download_count": 208232, + "project": "eliot" + }, + { + "download_count": 208191, + "project": "anaconda" + }, + { + "download_count": 208167, + "project": "zope-configuration" + }, + { + "download_count": 208131, + "project": "talon" + }, + { + "download_count": 208092, + "project": "django-split-settings" + }, + { + "download_count": 207912, + "project": "elasticsearch6" + }, + { + "download_count": 207665, + "project": "cx-freeze" + }, + { + "download_count": 207551, + "project": "pyclipper" + }, + { + "download_count": 207474, + "project": "duo-web" + }, + { + "download_count": 207412, + "project": "django-easy-select2" + }, + { + "download_count": 207319, + "project": "pytricia" + }, + { + "download_count": 207241, + "project": "pyecharts" + }, + { + "download_count": 207068, + "project": "zendesk" + }, + { + "download_count": 206988, + "project": "zodbpickle" + }, + { + "download_count": 206923, + "project": "scout-apm" + }, + { + "download_count": 206832, + "project": "contexttimer" + }, + { + "download_count": 206379, + "project": "ngxtop" + }, + { + "download_count": 206215, + "project": "python-xmp-toolkit" + }, + { + "download_count": 205992, + "project": "redlock" + }, + { + "download_count": 205889, + "project": "smartypants" + }, + { + "download_count": 205562, + "project": "flake8-coding" + }, + { + "download_count": 205284, + "project": "zodb" + }, + { + "download_count": 205270, + "project": "django-reversion-compare" + }, + { + "download_count": 205192, + "project": "html-linter" + }, + { + "download_count": 205141, + "project": "client" + }, + { + "download_count": 205070, + "project": "backports-shutil-which" + }, + { + "download_count": 204937, + "project": "frida" + }, + { + "download_count": 204809, + "project": "dawg-python" + }, + { + "download_count": 204696, + "project": "django-transaction-hooks" + }, + { + "download_count": 204486, + "project": "aiotask-context" + }, + { + "download_count": 204328, + "project": "lazy-property" + }, + { + "download_count": 204268, + "project": "urlparse2" + }, + { + "download_count": 204251, + "project": "template-remover" + }, + { + "download_count": 204130, + "project": "pyttsx3" + }, + { + "download_count": 204053, + "project": "mesh-tensorflow" + }, + { + "download_count": 203892, + "project": "django-crum" + }, + { + "download_count": 203786, + "project": "asciitree" + }, + { + "download_count": 203548, + "project": "flake8-deprecated" + }, + { + "download_count": 203495, + "project": "weberror" + }, + { + "download_count": 203493, + "project": "shudder" + }, + { + "download_count": 203310, + "project": "dash-auth" + }, + { + "download_count": 203161, + "project": "rasa-nlu" + }, + { + "download_count": 203073, + "project": "conf-d" + }, + { + "download_count": 202765, + "project": "django-slack" + }, + { + "download_count": 202648, + "project": "pocketsphinx" + }, + { + "download_count": 202044, + "project": "pydivert" + }, + { + "download_count": 202007, + "project": "blosc" + }, + { + "download_count": 201958, + "project": "zipstream" + }, + { + "download_count": 201831, + "project": "parallel-sync" + }, + { + "download_count": 201651, + "project": "pycuda" + }, + { + "download_count": 201622, + "project": "ta-lib" + }, + { + "download_count": 201459, + "project": "jmxquery" + }, + { + "download_count": 201457, + "project": "tabula-py" + }, + { + "download_count": 201395, + "project": "pytest-flask-sqlalchemy" + }, + { + "download_count": 201101, + "project": "collectd" + }, + { + "download_count": 201096, + "project": "django-rest-multiple-models" + }, + { + "download_count": 201084, + "project": "pyobjc-framework-coretext" + }, + { + "download_count": 200633, + "project": "smart-getenv" + }, + { + "download_count": 200507, + "project": "pyramid-retry" + }, + { + "download_count": 200444, + "project": "codeclimate-test-reporter" + }, + { + "download_count": 200411, + "project": "publicsuffixlist" + }, + { + "download_count": 200394, + "project": "algoliasearch-django" + }, + { + "download_count": 200267, + "project": "pytest-salt" + }, + { + "download_count": 200235, + "project": "pytest-doctestplus" + }, + { + "download_count": 200035, + "project": "zope-lifecycleevent" + }, + { + "download_count": 199808, + "project": "python-zaqarclient" + }, + { + "download_count": 199774, + "project": "iniherit" + }, + { + "download_count": 199753, + "project": "pymorphy2-dicts" + }, + { + "download_count": 199695, + "project": "hanging-threads" + }, + { + "download_count": 199645, + "project": "flask-classful" + }, + { + "download_count": 199602, + "project": "pyrad" + }, + { + "download_count": 199568, + "project": "jsoncompare" + }, + { + "download_count": 199376, + "project": "python-graph-core" + }, + { + "download_count": 199234, + "project": "flask-mysqldb" + }, + { + "download_count": 199123, + "project": "pymorphy2" + }, + { + "download_count": 199116, + "project": "uncertainties" + }, + { + "download_count": 198904, + "project": "jdatetime" + }, + { + "download_count": 198768, + "project": "package" + }, + { + "download_count": 198699, + "project": "django-user-sessions" + }, + { + "download_count": 198662, + "project": "jproperties" + }, + { + "download_count": 198655, + "project": "optional-django" + }, + { + "download_count": 198573, + "project": "azure-mgmt-common" + }, + { + "download_count": 198386, + "project": "csscompressor" + }, + { + "download_count": 198360, + "project": "robotframework-lint" + }, + { + "download_count": 198297, + "project": "bintrees" + }, + { + "download_count": 198099, + "project": "esptool" + }, + { + "download_count": 198014, + "project": "sox" + }, + { + "download_count": 197847, + "project": "cotyledon" + }, + { + "download_count": 197484, + "project": "kafka-utils" + }, + { + "download_count": 197448, + "project": "pingparsing" + }, + { + "download_count": 197436, + "project": "semidbm" + }, + { + "download_count": 197405, + "project": "polyaxon-schemas" + }, + { + "download_count": 196830, + "project": "python-mozaggregator" + }, + { + "download_count": 196757, + "project": "pandas-summary" + }, + { + "download_count": 196390, + "project": "nbval" + }, + { + "download_count": 196154, + "project": "python3-xlib" + }, + { + "download_count": 195862, + "project": "pyobjc-framework-coredata" + }, + { + "download_count": 195697, + "project": "django-json-widget" + }, + { + "download_count": 194638, + "project": "trimesh" + }, + { + "download_count": 194604, + "project": "pyobjc-framework-addressbook" + }, + { + "download_count": 194552, + "project": "sq-blocks" + }, + { + "download_count": 194524, + "project": "simple-crypt" + }, + { + "download_count": 194469, + "project": "imgkit" + }, + { + "download_count": 194216, + "project": "pytype" + }, + { + "download_count": 193866, + "project": "aiohttp-session" + }, + { + "download_count": 193810, + "project": "lib" + }, + { + "download_count": 193713, + "project": "pyobjc-framework-screensaver" + }, + { + "download_count": 193702, + "project": "remote-pdb" + }, + { + "download_count": 193646, + "project": "pyobjc-framework-syncservices" + }, + { + "download_count": 193463, + "project": "pyobjc-framework-scriptingbridge" + }, + { + "download_count": 193206, + "project": "glmnet-py" + }, + { + "download_count": 193173, + "project": "edx-django-release-util" + }, + { + "download_count": 193118, + "project": "pyobjc-framework-corelocation" + }, + { + "download_count": 193105, + "project": "pyobjc-framework-inputmethodkit" + }, + { + "download_count": 193099, + "project": "lob" + }, + { + "download_count": 192939, + "project": "deb-pkg-tools" + }, + { + "download_count": 192929, + "project": "traits" + }, + { + "download_count": 192741, + "project": "django-revproxy" + }, + { + "download_count": 192721, + "project": "edx-submissions" + }, + { + "download_count": 192662, + "project": "simpy" + }, + { + "download_count": 192636, + "project": "ebooklib" + }, + { + "download_count": 192632, + "project": "importlab" + }, + { + "download_count": 192581, + "project": "tweet-preprocessor" + }, + { + "download_count": 192462, + "project": "eight" + }, + { + "download_count": 192349, + "project": "edx-when" + }, + { + "download_count": 192282, + "project": "telepot" + }, + { + "download_count": 192227, + "project": "django-recaptcha2" + }, + { + "download_count": 192174, + "project": "fastjsonschema" + }, + { + "download_count": 191971, + "project": "rebulk" + }, + { + "download_count": 191767, + "project": "zope-dottedname" + }, + { + "download_count": 191702, + "project": "cli-proton-python" + }, + { + "download_count": 191581, + "project": "schema-salad" + }, + { + "download_count": 191533, + "project": "progressbar33" + }, + { + "download_count": 191495, + "project": "libnacl" + }, + { + "download_count": 191407, + "project": "mattermostwrapper" + }, + { + "download_count": 191403, + "project": "mox" + }, + { + "download_count": 191379, + "project": "esprima" + }, + { + "download_count": 191100, + "project": "tf-nightly-gpu" + }, + { + "download_count": 191091, + "project": "python-firebase" + }, + { + "download_count": 190890, + "project": "flake8-bandit" + }, + { + "download_count": 190752, + "project": "python3-logstash" + }, + { + "download_count": 190743, + "project": "pyutilib" + }, + { + "download_count": 190491, + "project": "easypost" + }, + { + "download_count": 190474, + "project": "web-fragments" + }, + { + "download_count": 190430, + "project": "pytest-coverage" + }, + { + "download_count": 190275, + "project": "mailjet-rest" + }, + { + "download_count": 190267, + "project": "riemann-client" + }, + { + "download_count": 190168, + "project": "pytest-test-groups" + }, + { + "download_count": 189997, + "project": "dialogflow" + }, + { + "download_count": 189912, + "project": "tableschema" + }, + { + "download_count": 189480, + "project": "segtok" + }, + { + "download_count": 189475, + "project": "contentful" + }, + { + "download_count": 189290, + "project": "ropgadget" + }, + { + "download_count": 189289, + "project": "user-agent" + }, + { + "download_count": 189193, + "project": "django-profiler" + }, + { + "download_count": 189156, + "project": "devstack-tools" + }, + { + "download_count": 188865, + "project": "django-leaflet" + }, + { + "download_count": 188683, + "project": "datetime-truncate" + }, + { + "download_count": 188451, + "project": "pyjslint" + }, + { + "download_count": 188348, + "project": "dvc" + }, + { + "download_count": 188172, + "project": "zope-cachedescriptors" + }, + { + "download_count": 188122, + "project": "onetoken" + }, + { + "download_count": 188063, + "project": "ipfshttpclient" + }, + { + "download_count": 187976, + "project": "azure-functions" + }, + { + "download_count": 187875, + "project": "optimizely-sdk" + }, + { + "download_count": 187858, + "project": "cwltool" + }, + { + "download_count": 187574, + "project": "seqdiag" + }, + { + "download_count": 187547, + "project": "libthumbor" + }, + { + "download_count": 187440, + "project": "atlassian-python-api" + }, + { + "download_count": 187397, + "project": "pyobjc-framework-corewlan" + }, + { + "download_count": 187363, + "project": "azure-cli-natgateway" + }, + { + "download_count": 187117, + "project": "pyobjc-framework-imagecapturecore" + }, + { + "download_count": 186984, + "project": "django-hosts" + }, + { + "download_count": 186865, + "project": "pytest-reportportal" + }, + { + "download_count": 186711, + "project": "pyobjc-framework-avfoundation" + }, + { + "download_count": 186705, + "project": "pyobjc-framework-corebluetooth" + }, + { + "download_count": 186590, + "project": "glog" + }, + { + "download_count": 186547, + "project": "pyobjc-framework-mapkit" + }, + { + "download_count": 186536, + "project": "pyobjc-framework-avkit" + }, + { + "download_count": 186474, + "project": "pyobjc-framework-storekit" + }, + { + "download_count": 186445, + "project": "pypom" + }, + { + "download_count": 186363, + "project": "pyobjc-framework-multipeerconnectivity" + }, + { + "download_count": 186349, + "project": "pyobjc-framework-scenekit" + }, + { + "download_count": 186324, + "project": "richenum" + }, + { + "download_count": 186299, + "project": "pyobjc-framework-imserviceplugin" + }, + { + "download_count": 186260, + "project": "pyobjc-framework-gamecenter" + }, + { + "download_count": 186239, + "project": "boto3-type-annotations-with-docs" + }, + { + "download_count": 186229, + "project": "pyobjc-framework-spritekit" + }, + { + "download_count": 186187, + "project": "pyobjc-framework-notificationcenter" + }, + { + "download_count": 186170, + "project": "salttesting" + }, + { + "download_count": 186131, + "project": "you-get" + }, + { + "download_count": 186067, + "project": "pyobjc-framework-cryptotokenkit" + }, + { + "download_count": 186058, + "project": "pytest-catchlog" + }, + { + "download_count": 185930, + "project": "iptcinfo" + }, + { + "download_count": 185874, + "project": "hashin" + }, + { + "download_count": 185785, + "project": "colormath" + }, + { + "download_count": 185776, + "project": "nanotime" + }, + { + "download_count": 185712, + "project": "python-saharaclient" + }, + { + "download_count": 185687, + "project": "yanc" + }, + { + "download_count": 185684, + "project": "methodtools" + }, + { + "download_count": 185575, + "project": "pytest-openfiles" + }, + { + "download_count": 185568, + "project": "zope-security" + }, + { + "download_count": 185489, + "project": "django-crequest" + }, + { + "download_count": 185383, + "project": "pymemoize" + }, + { + "download_count": 185321, + "project": "django-fsm-log" + }, + { + "download_count": 185307, + "project": "django-warrant" + }, + { + "download_count": 185226, + "project": "acora" + }, + { + "download_count": 184984, + "project": "python-hpilo" + }, + { + "download_count": 184866, + "project": "zope-exceptions" + }, + { + "download_count": 184842, + "project": "ase" + }, + { + "download_count": 184834, + "project": "django-debug-toolbar-request-history" + }, + { + "download_count": 184816, + "project": "clipboard" + }, + { + "download_count": 184780, + "project": "manifest-tool" + }, + { + "download_count": 184769, + "project": "pdftotext" + }, + { + "download_count": 184767, + "project": "events" + }, + { + "download_count": 184609, + "project": "zope-contenttype" + }, + { + "download_count": 184473, + "project": "django-discover-runner" + }, + { + "download_count": 184469, + "project": "libtiff" + }, + { + "download_count": 184406, + "project": "sqlacodegen" + }, + { + "download_count": 184172, + "project": "pyomo" + }, + { + "download_count": 184107, + "project": "django-admin-sortable" + }, + { + "download_count": 183722, + "project": "oic" + }, + { + "download_count": 183626, + "project": "django-user-tasks" + }, + { + "download_count": 183425, + "project": "edx-lint" + }, + { + "download_count": 183383, + "project": "netfilterqueue" + }, + { + "download_count": 183355, + "project": "zope-location" + }, + { + "download_count": 183073, + "project": "pyobjc-framework-qtkit" + }, + { + "download_count": 183058, + "project": "apispec-webframeworks" + }, + { + "download_count": 183054, + "project": "django-dbbackup" + }, + { + "download_count": 182995, + "project": "interpret-core" + }, + { + "download_count": 182971, + "project": "docker-compose-wait" + }, + { + "download_count": 182913, + "project": "socketpool" + }, + { + "download_count": 182775, + "project": "qgrid" + }, + { + "download_count": 182678, + "project": "localstack-ext" + }, + { + "download_count": 182643, + "project": "munkres" + }, + { + "download_count": 182633, + "project": "django-admin-list-filter-dropdown" + }, + { + "download_count": 182500, + "project": "edx-ccx-keys" + }, + { + "download_count": 182205, + "project": "jsonrpclib" + }, + { + "download_count": 182178, + "project": "pyinstrument-cext" + }, + { + "download_count": 182161, + "project": "wsgiproxy2" + }, + { + "download_count": 182080, + "project": "msgfy" + }, + { + "download_count": 182061, + "project": "localstack" + }, + { + "download_count": 182033, + "project": "mpl-finance" + }, + { + "download_count": 182028, + "project": "sinon" + }, + { + "download_count": 181902, + "project": "pyobjc-framework-photos" + }, + { + "download_count": 181883, + "project": "pyobjc-framework-contacts" + }, + { + "download_count": 181832, + "project": "pyobjc-framework-safariservices" + }, + { + "download_count": 181822, + "project": "nagiosplugin" + }, + { + "download_count": 181811, + "project": "hbmqtt" + }, + { + "download_count": 181809, + "project": "pyobjc-framework-photosui" + }, + { + "download_count": 181782, + "project": "rfc6266" + }, + { + "download_count": 181770, + "project": "wtforms-alchemy" + }, + { + "download_count": 181753, + "project": "pyobjc-framework-modelio" + }, + { + "download_count": 181752, + "project": "gocardless-pro" + }, + { + "download_count": 181742, + "project": "pyobjc-framework-applicationservices" + }, + { + "download_count": 181658, + "project": "datadog-checks-base" + }, + { + "download_count": 181619, + "project": "pyobjc-framework-contactsui" + }, + { + "download_count": 181492, + "project": "zope-publisher" + }, + { + "download_count": 181460, + "project": "pyobjc-framework-applescriptkit" + }, + { + "download_count": 181449, + "project": "pyobjc-framework-networkextension" + }, + { + "download_count": 181408, + "project": "zope-i18n" + }, + { + "download_count": 181315, + "project": "recordio" + }, + { + "download_count": 181306, + "project": "pyobjc-framework-preferencepanes" + }, + { + "download_count": 181204, + "project": "pyobjc-framework-installerplugins" + }, + { + "download_count": 181198, + "project": "pyobjc-framework-automator" + }, + { + "download_count": 181194, + "project": "python-interface" + }, + { + "download_count": 181178, + "project": "dogslow" + }, + { + "download_count": 181007, + "project": "s3pypi" + }, + { + "download_count": 180930, + "project": "arpeggio" + }, + { + "download_count": 180918, + "project": "pyobjc-framework-searchkit" + }, + { + "download_count": 180910, + "project": "pyobjc-framework-latentsemanticmapping" + }, + { + "download_count": 180898, + "project": "imgurpython" + }, + { + "download_count": 180787, + "project": "huey" + }, + { + "download_count": 180646, + "project": "pyobjc-framework-applescriptobjc" + }, + { + "download_count": 180541, + "project": "pyobjc-framework-instantmessage" + }, + { + "download_count": 180484, + "project": "pyclamd" + }, + { + "download_count": 180478, + "project": "pyobjc-framework-accounts" + }, + { + "download_count": 180443, + "project": "pyobjc-framework-servicemanagement" + }, + { + "download_count": 180359, + "project": "sortedcollections" + }, + { + "download_count": 180352, + "project": "pyobjc-framework-dictionaryservices" + }, + { + "download_count": 180326, + "project": "pyobjc-framework-pubsub" + }, + { + "download_count": 180234, + "project": "pyobjc-framework-collaboration" + }, + { + "download_count": 180184, + "project": "cqlsh" + }, + { + "download_count": 180108, + "project": "hacs-frontend" + }, + { + "download_count": 179819, + "project": "pyobjc-framework-social" + }, + { + "download_count": 179803, + "project": "pybars3" + }, + { + "download_count": 179768, + "project": "pyobjc-framework-eventkit" + }, + { + "download_count": 179757, + "project": "pyobjc-framework-opendirectory" + }, + { + "download_count": 179716, + "project": "chatterbot" + }, + { + "download_count": 179610, + "project": "neovim" + }, + { + "download_count": 179540, + "project": "json-logging" + }, + { + "download_count": 179401, + "project": "pytest-splinter" + }, + { + "download_count": 179317, + "project": "fig" + }, + { + "download_count": 179255, + "project": "pyte" + }, + { + "download_count": 179193, + "project": "bagit" + }, + { + "download_count": 179031, + "project": "aiohttp-swagger" + }, + { + "download_count": 178930, + "project": "django-cronman" + }, + { + "download_count": 178836, + "project": "robotframework-pageobjectlibrary" + }, + { + "download_count": 178805, + "project": "django-tenant-schemas" + }, + { + "download_count": 178606, + "project": "pypcd" + }, + { + "download_count": 178579, + "project": "s3contents" + }, + { + "download_count": 178532, + "project": "pytube" + }, + { + "download_count": 178420, + "project": "srvlookup" + }, + { + "download_count": 178249, + "project": "django-cache-url" + }, + { + "download_count": 178237, + "project": "pytest-sanic" + }, + { + "download_count": 178164, + "project": "pybase62" + }, + { + "download_count": 178040, + "project": "modulegraph" + }, + { + "download_count": 177513, + "project": "flufl-lock" + }, + { + "download_count": 177343, + "project": "pyobjc-framework-intents" + }, + { + "download_count": 177128, + "project": "playsound" + }, + { + "download_count": 177060, + "project": "django-sql-explorer" + }, + { + "download_count": 177040, + "project": "pymavlink" + }, + { + "download_count": 176939, + "project": "snowflake" + }, + { + "download_count": 176684, + "project": "drfdocs" + }, + { + "download_count": 176663, + "project": "django-sendfile" + }, + { + "download_count": 176504, + "project": "zope-testing" + }, + { + "download_count": 176439, + "project": "autocorrect" + }, + { + "download_count": 176429, + "project": "django-filters" + }, + { + "download_count": 176316, + "project": "delighted" + }, + { + "download_count": 176189, + "project": "pick" + }, + { + "download_count": 176166, + "project": "restricted-pkg" + }, + { + "download_count": 176069, + "project": "tlslite-ng" + }, + { + "download_count": 175910, + "project": "click-datetime" + }, + { + "download_count": 175901, + "project": "mapbox" + }, + { + "download_count": 175833, + "project": "zope-traversing" + }, + { + "download_count": 175827, + "project": "yagmail" + }, + { + "download_count": 175386, + "project": "os-diskconfig-python-novaclient-ext" + }, + { + "download_count": 175252, + "project": "env-utils" + }, + { + "download_count": 175153, + "project": "pyramid-chameleon" + }, + { + "download_count": 175039, + "project": "pysphere" + }, + { + "download_count": 174995, + "project": "pyobjc-framework-calendarstore" + }, + { + "download_count": 174675, + "project": "tfrecord-lite" + }, + { + "download_count": 174598, + "project": "zope-container" + }, + { + "download_count": 174537, + "project": "pyobjc-framework-iosurface" + }, + { + "download_count": 174516, + "project": "pyobjc-framework-netfs" + }, + { + "download_count": 174283, + "project": "zope-browser" + }, + { + "download_count": 174221, + "project": "cymysql" + }, + { + "download_count": 174210, + "project": "scrapy-fake-useragent" + }, + { + "download_count": 174182, + "project": "pysnooper" + }, + { + "download_count": 174143, + "project": "allennlp" + }, + { + "download_count": 174141, + "project": "itchat" + }, + { + "download_count": 174002, + "project": "pytest-arraydiff" + }, + { + "download_count": 174001, + "project": "multimethods" + }, + { + "download_count": 173985, + "project": "concurrencytest" + }, + { + "download_count": 173985, + "project": "pyxattr" + }, + { + "download_count": 173977, + "project": "pyobjc-framework-medialibrary" + }, + { + "download_count": 173974, + "project": "python-vlc" + }, + { + "download_count": 173922, + "project": "django-summernote" + }, + { + "download_count": 173897, + "project": "msal-extensions" + }, + { + "download_count": 173878, + "project": "pyobjc-framework-gamecontroller" + }, + { + "download_count": 173812, + "project": "pyobjc-framework-findersync" + }, + { + "download_count": 173771, + "project": "pyobjc-framework-cloudkit" + }, + { + "download_count": 173753, + "project": "pyobjc-framework-localauthentication" + }, + { + "download_count": 173686, + "project": "pyobjc-framework-mediaaccessibility" + }, + { + "download_count": 173647, + "project": "vega" + }, + { + "download_count": 173582, + "project": "textstat" + }, + { + "download_count": 173469, + "project": "neomodel" + }, + { + "download_count": 173417, + "project": "pyobjc" + }, + { + "download_count": 173414, + "project": "check-puppet-agent" + }, + { + "download_count": 173066, + "project": "os-networksv2-python-novaclient-ext" + }, + { + "download_count": 173034, + "project": "vcd-cli" + }, + { + "download_count": 172953, + "project": "numdifftools" + }, + { + "download_count": 172704, + "project": "tensorflow-graphics" + }, + { + "download_count": 172697, + "project": "pysqslistener" + }, + { + "download_count": 172681, + "project": "kazurator" + }, + { + "download_count": 172661, + "project": "xstatic-roboto-fontface" + }, + { + "download_count": 172595, + "project": "asyncio-nats-streaming" + }, + { + "download_count": 172285, + "project": "slugify" + }, + { + "download_count": 172276, + "project": "jupyter-notebook-gist" + }, + { + "download_count": 172213, + "project": "awsretry" + }, + { + "download_count": 172075, + "project": "flup" + }, + { + "download_count": 172011, + "project": "tornado-aws" + }, + { + "download_count": 171812, + "project": "rackspace-novaclient" + }, + { + "download_count": 171679, + "project": "django-q" + }, + { + "download_count": 171593, + "project": "rax-default-network-flags-python-novaclient-ext" + }, + { + "download_count": 171548, + "project": "object-pool" + }, + { + "download_count": 171504, + "project": "xstatic-font-awesome" + }, + { + "download_count": 171492, + "project": "rackspace-auth-openstack" + }, + { + "download_count": 171339, + "project": "qdarkstyle" + }, + { + "download_count": 171275, + "project": "tox-monorepo" + } + ] +} diff --git a/Tools/peg_generator/data/xxl.zip b/Tools/peg_generator/data/xxl.zip new file mode 100644 index 0000000000000000000000000000000000000000..879a41aafa9ef31a3acdd9823010e0520fb8a2a0 Binary files /dev/null and b/Tools/peg_generator/data/xxl.zip differ diff --git a/Tools/peg_generator/mypy.ini b/Tools/peg_generator/mypy.ini new file mode 100644 index 0000000000000000000000000000000000000000..80d5c057ca1a9a408bbb9cab91e7caaf268bfb93 --- /dev/null +++ b/Tools/peg_generator/mypy.ini @@ -0,0 +1,26 @@ +[mypy] +files = pegen, scripts + +follow_imports = error +no_implicit_optional = True +strict_optional = True + +#check_untyped_defs = True +disallow_untyped_calls = True +disallow_untyped_defs = True + +disallow_any_generics = true +disallow_any_unimported = True +disallow_incomplete_defs = True +disallow_subclassing_any = True + +warn_unused_configs = True +warn_unused_ignores = true +warn_redundant_casts = true +warn_no_return = True + +show_traceback = True +show_error_codes = True + +[mypy-pegen.grammar_parser] +strict_optional = False diff --git a/Tools/peg_generator/peg_extension/__init__.py b/Tools/peg_generator/peg_extension/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Tools/peg_generator/peg_extension/peg_extension.c b/Tools/peg_generator/peg_extension/peg_extension.c new file mode 100644 index 0000000000000000000000000000000000000000..96d3a52b8808803af3b3c9fbb45c48725e56aa93 --- /dev/null +++ b/Tools/peg_generator/peg_extension/peg_extension.c @@ -0,0 +1,154 @@ +#include "pegen.h" + +PyObject * +_build_return_object(mod_ty module, int mode, PyObject *filename_ob, PyArena *arena) +{ + PyObject *result = NULL; + + if (mode == 2) { + result = (PyObject *)PyAST_CompileObject(module, filename_ob, NULL, -1, arena); + } else if (mode == 1) { + result = PyAST_mod2obj(module); + } else { + result = Py_None; + Py_INCREF(result); + } + + return result; +} + +static PyObject * +parse_file(PyObject *self, PyObject *args, PyObject *kwds) +{ + static char *keywords[] = {"file", "mode", NULL}; + const char *filename; + int mode = 2; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|i", keywords, &filename, &mode)) { + return NULL; + } + if (mode < 0 || mode > 2) { + return PyErr_Format(PyExc_ValueError, "Bad mode, must be 0 <= mode <= 2"); + } + + PyArena *arena = PyArena_New(); + if (arena == NULL) { + return NULL; + } + + PyObject *result = NULL; + + PyObject *filename_ob = PyUnicode_FromString(filename); + if (filename_ob == NULL) { + goto error; + } + + PyCompilerFlags flags = _PyCompilerFlags_INIT; + mod_ty res = _PyPegen_run_parser_from_file(filename, Py_file_input, filename_ob, &flags, arena); + if (res == NULL) { + goto error; + } + + result = _build_return_object(res, mode, filename_ob, arena); + +error: + Py_XDECREF(filename_ob); + PyArena_Free(arena); + return result; +} + +static PyObject * +parse_string(PyObject *self, PyObject *args, PyObject *kwds) +{ + static char *keywords[] = {"str", "mode", NULL}; + const char *the_string; + int mode = 2; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|i", keywords, &the_string, &mode)) { + return NULL; + } + if (mode < 0 || mode > 2) { + return PyErr_Format(PyExc_ValueError, "Bad mode, must be 0 <= mode <= 2"); + } + + PyArena *arena = PyArena_New(); + if (arena == NULL) { + return NULL; + } + + PyObject *result = NULL; + + PyObject *filename_ob = PyUnicode_FromString(""); + if (filename_ob == NULL) { + goto error; + } + + PyCompilerFlags flags = _PyCompilerFlags_INIT; + mod_ty res = _PyPegen_run_parser_from_string(the_string, Py_file_input, filename_ob, + &flags, arena); + if (res == NULL) { + goto error; + } + result = _build_return_object(res, mode, filename_ob, arena); + +error: + Py_XDECREF(filename_ob); + PyArena_Free(arena); + return result; +} + +static PyObject * +clear_memo_stats(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored)) +{ + _PyPegen_clear_memo_statistics(); + Py_RETURN_NONE; +} + +static PyObject * +get_memo_stats(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored)) +{ + return _PyPegen_get_memo_statistics(); +} + +// TODO: Write to Python's sys.stdout instead of C's stdout. +static PyObject * +dump_memo_stats(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(ignored)) +{ + PyObject *list = _PyPegen_get_memo_statistics(); + if (list == NULL) { + return NULL; + } + Py_ssize_t len = PyList_Size(list); + for (Py_ssize_t i = 0; i < len; i++) { + PyObject *value = PyList_GetItem(list, i); // Borrowed reference. + long count = PyLong_AsLong(value); + if (count < 0) { + break; + } + if (count > 0) { + printf("%4zd %9ld\n", i, count); + } + } + Py_DECREF(list); + Py_RETURN_NONE; +} + +static PyMethodDef ParseMethods[] = { + {"parse_file", (PyCFunction)(void(*)(void))parse_file, METH_VARARGS|METH_KEYWORDS, "Parse a file."}, + {"parse_string", (PyCFunction)(void(*)(void))parse_string, METH_VARARGS|METH_KEYWORDS, "Parse a string."}, + {"clear_memo_stats", clear_memo_stats, METH_NOARGS}, + {"dump_memo_stats", dump_memo_stats, METH_NOARGS}, + {"get_memo_stats", get_memo_stats, METH_NOARGS}, + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + +static struct PyModuleDef parsemodule = { + PyModuleDef_HEAD_INIT, + .m_name = "parse", + .m_doc = "A parser.", + .m_methods = ParseMethods, +}; + +PyMODINIT_FUNC +PyInit_parse(void) +{ + return PyModule_Create(&parsemodule); +} diff --git a/Tools/peg_generator/pegen/__init__.py b/Tools/peg_generator/pegen/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Tools/peg_generator/pegen/__main__.py b/Tools/peg_generator/pegen/__main__.py new file mode 100644 index 0000000000000000000000000000000000000000..1dcbaad1c38870a3e40be0772c756a7d61a00376 --- /dev/null +++ b/Tools/peg_generator/pegen/__main__.py @@ -0,0 +1,182 @@ +#!/usr/bin/env python3.8 + +"""pegen -- PEG Generator. + +Search the web for PEG Parsers for reference. +""" + +import argparse +import sys +import time +import token +import traceback + +from typing import Tuple + +from pegen.build import Grammar, Parser, Tokenizer, ParserGenerator + + +def generate_c_code( + args: argparse.Namespace, +) -> Tuple[Grammar, Parser, Tokenizer, ParserGenerator]: + from pegen.build import build_c_parser_and_generator + + verbose = args.verbose + verbose_tokenizer = verbose >= 3 + verbose_parser = verbose == 2 or verbose >= 4 + try: + grammar, parser, tokenizer, gen = build_c_parser_and_generator( + args.grammar_filename, + args.tokens_filename, + args.output, + args.compile_extension, + verbose_tokenizer, + verbose_parser, + args.verbose, + keep_asserts_in_extension=False if args.optimized else True, + skip_actions=args.skip_actions, + ) + return grammar, parser, tokenizer, gen + except Exception as err: + if args.verbose: + raise # Show traceback + traceback.print_exception(err.__class__, err, None) + sys.stderr.write("For full traceback, use -v\n") + sys.exit(1) + + +def generate_python_code( + args: argparse.Namespace, +) -> Tuple[Grammar, Parser, Tokenizer, ParserGenerator]: + from pegen.build import build_python_parser_and_generator + + verbose = args.verbose + verbose_tokenizer = verbose >= 3 + verbose_parser = verbose == 2 or verbose >= 4 + try: + grammar, parser, tokenizer, gen = build_python_parser_and_generator( + args.grammar_filename, + args.output, + verbose_tokenizer, + verbose_parser, + skip_actions=args.skip_actions, + ) + return grammar, parser, tokenizer, gen + except Exception as err: + if args.verbose: + raise # Show traceback + traceback.print_exception(err.__class__, err, None) + sys.stderr.write("For full traceback, use -v\n") + sys.exit(1) + + +argparser = argparse.ArgumentParser( + prog="pegen", description="Experimental PEG-like parser generator" +) +argparser.add_argument("-q", "--quiet", action="store_true", help="Don't print the parsed grammar") +argparser.add_argument( + "-v", + "--verbose", + action="count", + default=0, + help="Print timing stats; repeat for more debug output", +) +subparsers = argparser.add_subparsers(help="target language for the generated code") + +c_parser = subparsers.add_parser("c", help="Generate C code for inclusion into CPython") +c_parser.set_defaults(func=generate_c_code) +c_parser.add_argument("grammar_filename", help="Grammar description") +c_parser.add_argument("tokens_filename", help="Tokens description") +c_parser.add_argument( + "-o", "--output", metavar="OUT", default="parse.c", help="Where to write the generated parser" +) +c_parser.add_argument( + "--compile-extension", + action="store_true", + help="Compile generated C code into an extension module", +) +c_parser.add_argument( + "--optimized", action="store_true", help="Compile the extension in optimized mode" +) +c_parser.add_argument( + "--skip-actions", action="store_true", help="Suppress code emission for rule actions", +) + +python_parser = subparsers.add_parser("python", help="Generate Python code") +python_parser.set_defaults(func=generate_python_code) +python_parser.add_argument("grammar_filename", help="Grammar description") +python_parser.add_argument( + "-o", + "--output", + metavar="OUT", + default="parse.py", + help="Where to write the generated parser", +) +python_parser.add_argument( + "--skip-actions", action="store_true", help="Suppress code emission for rule actions", +) + + +def main() -> None: + from pegen.testutil import print_memstats + + args = argparser.parse_args() + if "func" not in args: + argparser.error("Must specify the target language mode ('c' or 'python')") + + t0 = time.time() + grammar, parser, tokenizer, gen = args.func(args) + t1 = time.time() + + if not args.quiet: + if args.verbose: + print("Raw Grammar:") + for line in repr(grammar).splitlines(): + print(" ", line) + + print("Clean Grammar:") + for line in str(grammar).splitlines(): + print(" ", line) + + if args.verbose: + print("First Graph:") + for src, dsts in gen.first_graph.items(): + print(f" {src} -> {', '.join(dsts)}") + print("First SCCS:") + for scc in gen.first_sccs: + print(" ", scc, end="") + if len(scc) > 1: + print( + " # Indirectly left-recursive; leaders:", + {name for name in scc if grammar.rules[name].leader}, + ) + else: + name = next(iter(scc)) + if name in gen.first_graph[name]: + print(" # Left-recursive") + else: + print() + + if args.verbose: + dt = t1 - t0 + diag = tokenizer.diagnose() + nlines = diag.end[0] + if diag.type == token.ENDMARKER: + nlines -= 1 + print(f"Total time: {dt:.3f} sec; {nlines} lines", end="") + if dt: + print(f"; {nlines / dt:.0f} lines/sec") + else: + print() + print("Caches sizes:") + print(f" token array : {len(tokenizer._tokens):10}") + print(f" cache : {len(parser._cache):10}") + if not print_memstats(): + print("(Can't find psutil; install it for memory stats.)") + + +if __name__ == "__main__": + if sys.version_info < (3, 8): + print("ERROR: using pegen requires at least Python 3.8!", file=sys.stderr) + sys.exit(1) + main() diff --git a/Tools/peg_generator/pegen/ast_dump.py b/Tools/peg_generator/pegen/ast_dump.py new file mode 100644 index 0000000000000000000000000000000000000000..93dfbfd963ca6d18bef428b1ee6593f8ba9ba705 --- /dev/null +++ b/Tools/peg_generator/pegen/ast_dump.py @@ -0,0 +1,63 @@ +""" +Copy-parse of ast.dump, removing the `isinstance` checks. This is needed, +because testing pegen requires generating a C extension module, which contains +a copy of the symbols defined in Python-ast.c. Thus, the isinstance check would +always fail. We rely on string comparison of the base classes instead. +TODO: Remove the above-described hack. +""" + + +def ast_dump(node, annotate_fields=True, include_attributes=False, *, indent=None): + def _format(node, level=0): + if indent is not None: + level += 1 + prefix = "\n" + indent * level + sep = ",\n" + indent * level + else: + prefix = "" + sep = ", " + if any(cls.__name__ == "AST" for cls in node.__class__.__mro__): + cls = type(node) + args = [] + allsimple = True + keywords = annotate_fields + for name in node._fields: + try: + value = getattr(node, name) + except AttributeError: + keywords = True + continue + if value is None and getattr(cls, name, ...) is None: + keywords = True + continue + value, simple = _format(value, level) + allsimple = allsimple and simple + if keywords: + args.append("%s=%s" % (name, value)) + else: + args.append(value) + if include_attributes and node._attributes: + for name in node._attributes: + try: + value = getattr(node, name) + except AttributeError: + continue + if value is None and getattr(cls, name, ...) is None: + continue + value, simple = _format(value, level) + allsimple = allsimple and simple + args.append("%s=%s" % (name, value)) + if allsimple and len(args) <= 3: + return "%s(%s)" % (node.__class__.__name__, ", ".join(args)), not args + return "%s(%s%s)" % (node.__class__.__name__, prefix, sep.join(args)), False + elif isinstance(node, list): + if not node: + return "[]", True + return "[%s%s]" % (prefix, sep.join(_format(x, level)[0] for x in node)), False + return repr(node), True + + if all(cls.__name__ != "AST" for cls in node.__class__.__mro__): + raise TypeError("expected AST, got %r" % node.__class__.__name__) + if indent is not None and not isinstance(indent, str): + indent = " " * indent + return _format(node)[0] diff --git a/Tools/peg_generator/pegen/build.py b/Tools/peg_generator/pegen/build.py new file mode 100644 index 0000000000000000000000000000000000000000..931ffc787523b541287171bba667c424ca4fd340 --- /dev/null +++ b/Tools/peg_generator/pegen/build.py @@ -0,0 +1,248 @@ +import pathlib +import shutil +import tokenize +import sysconfig +import tempfile +import itertools + +from typing import Optional, Tuple, List, IO, Set, Dict + +from pegen.c_generator import CParserGenerator +from pegen.grammar import Grammar +from pegen.grammar_parser import GeneratedParser as GrammarParser +from pegen.parser import Parser +from pegen.parser_generator import ParserGenerator +from pegen.python_generator import PythonParserGenerator +from pegen.tokenizer import Tokenizer + +MOD_DIR = pathlib.Path(__file__).resolve().parent + +TokenDefinitions = Tuple[Dict[int, str], Dict[str, int], Set[str]] + + +def get_extra_flags(compiler_flags: str, compiler_py_flags_nodist: str) -> List[str]: + flags = sysconfig.get_config_var(compiler_flags) + py_flags_nodist = sysconfig.get_config_var(compiler_py_flags_nodist) + if flags is None or py_flags_nodist is None: + return [] + return f"{flags} {py_flags_nodist}".split() + + +def compile_c_extension( + generated_source_path: str, + build_dir: Optional[str] = None, + verbose: bool = False, + keep_asserts: bool = True, +) -> str: + """Compile the generated source for a parser generator into an extension module. + + The extension module will be generated in the same directory as the provided path + for the generated source, with the same basename (in addition to extension module + metadata). For example, for the source mydir/parser.c the generated extension + in a darwin system with python 3.8 will be mydir/parser.cpython-38-darwin.so. + + If *build_dir* is provided, that path will be used as the temporary build directory + of distutils (this is useful in case you want to use a temporary directory). + """ + import distutils.log + from distutils.core import Distribution, Extension + from distutils.command.clean import clean # type: ignore + from distutils.command.build_ext import build_ext # type: ignore + from distutils.tests.support import fixup_build_ext # type: ignore + + if verbose: + distutils.log.set_verbosity(distutils.log.DEBUG) + + source_file_path = pathlib.Path(generated_source_path) + extension_name = source_file_path.stem + extra_compile_args = get_extra_flags("CFLAGS", "PY_CFLAGS_NODIST") + extra_link_args = get_extra_flags("LDFLAGS", "PY_LDFLAGS_NODIST") + if keep_asserts: + extra_compile_args.append("-UNDEBUG") + extension = [ + Extension( + extension_name, + sources=[ + str(MOD_DIR.parent.parent.parent / "Python" / "Python-ast.c"), + str(MOD_DIR.parent.parent.parent / "Python" / "asdl.c"), + str(MOD_DIR.parent.parent.parent / "Parser" / "tokenizer.c"), + str(MOD_DIR.parent.parent.parent / "Parser" / "pegen" / "pegen.c"), + str(MOD_DIR.parent.parent.parent / "Parser" / "pegen" / "parse_string.c"), + str(MOD_DIR.parent / "peg_extension" / "peg_extension.c"), + generated_source_path, + ], + include_dirs=[ + str(MOD_DIR.parent.parent.parent / "Include" / "internal"), + str(MOD_DIR.parent.parent.parent / "Parser"), + str(MOD_DIR.parent.parent.parent / "Parser" / "pegen"), + ], + extra_compile_args=extra_compile_args, + extra_link_args=extra_link_args, + ) + ] + dist = Distribution({"name": extension_name, "ext_modules": extension}) + cmd = build_ext(dist) + fixup_build_ext(cmd) + cmd.inplace = True + if build_dir: + cmd.build_temp = build_dir + cmd.build_lib = build_dir + cmd.ensure_finalized() + cmd.run() + + extension_path = source_file_path.parent / cmd.get_ext_filename(extension_name) + shutil.move(cmd.get_ext_fullpath(extension_name), extension_path) + + cmd = clean(dist) + cmd.finalize_options() + cmd.run() + + return extension_path + + +def build_parser( + grammar_file: str, verbose_tokenizer: bool = False, verbose_parser: bool = False +) -> Tuple[Grammar, Parser, Tokenizer]: + with open(grammar_file) as file: + tokenizer = Tokenizer(tokenize.generate_tokens(file.readline), verbose=verbose_tokenizer) + parser = GrammarParser(tokenizer, verbose=verbose_parser) + grammar = parser.start() + + if not grammar: + raise parser.make_syntax_error(grammar_file) + + return grammar, parser, tokenizer + + +def generate_token_definitions(tokens: IO[str]) -> TokenDefinitions: + all_tokens = {} + exact_tokens = {} + non_exact_tokens = set() + numbers = itertools.count(0) + + for line in tokens: + line = line.strip() + + if not line or line.startswith("#"): + continue + + pieces = line.split() + index = next(numbers) + + if len(pieces) == 1: + (token,) = pieces + non_exact_tokens.add(token) + all_tokens[index] = token + elif len(pieces) == 2: + token, op = pieces + exact_tokens[op.strip("'")] = index + all_tokens[index] = token + else: + raise ValueError(f"Unexpected line found in Tokens file: {line}") + + return all_tokens, exact_tokens, non_exact_tokens + + +def build_c_generator( + grammar: Grammar, + grammar_file: str, + tokens_file: str, + output_file: str, + compile_extension: bool = False, + verbose_c_extension: bool = False, + keep_asserts_in_extension: bool = True, + skip_actions: bool = False, +) -> ParserGenerator: + with open(tokens_file, "r") as tok_file: + all_tokens, exact_tok, non_exact_tok = generate_token_definitions(tok_file) + with open(output_file, "w") as file: + gen: ParserGenerator = CParserGenerator( + grammar, all_tokens, exact_tok, non_exact_tok, file, skip_actions=skip_actions + ) + gen.generate(grammar_file) + + if compile_extension: + with tempfile.TemporaryDirectory() as build_dir: + compile_c_extension( + output_file, + build_dir=build_dir, + verbose=verbose_c_extension, + keep_asserts=keep_asserts_in_extension, + ) + return gen + + +def build_python_generator( + grammar: Grammar, grammar_file: str, output_file: str, skip_actions: bool = False, +) -> ParserGenerator: + with open(output_file, "w") as file: + gen: ParserGenerator = PythonParserGenerator(grammar, file) # TODO: skip_actions + gen.generate(grammar_file) + return gen + + +def build_c_parser_and_generator( + grammar_file: str, + tokens_file: str, + output_file: str, + compile_extension: bool = False, + verbose_tokenizer: bool = False, + verbose_parser: bool = False, + verbose_c_extension: bool = False, + keep_asserts_in_extension: bool = True, + skip_actions: bool = False, +) -> Tuple[Grammar, Parser, Tokenizer, ParserGenerator]: + """Generate rules, C parser, tokenizer, parser generator for a given grammar + + Args: + grammar_file (string): Path for the grammar file + tokens_file (string): Path for the tokens file + output_file (string): Path for the output file + compile_extension (bool, optional): Whether to compile the C extension. + Defaults to False. + verbose_tokenizer (bool, optional): Whether to display additional output + when generating the tokenizer. Defaults to False. + verbose_parser (bool, optional): Whether to display additional output + when generating the parser. Defaults to False. + verbose_c_extension (bool, optional): Whether to display additional + output when compiling the C extension . Defaults to False. + keep_asserts_in_extension (bool, optional): Whether to keep the assert statements + when compiling the extension module. Defaults to True. + skip_actions (bool, optional): Whether to pretend no rule has any actions. + """ + grammar, parser, tokenizer = build_parser(grammar_file, verbose_tokenizer, verbose_parser) + gen = build_c_generator( + grammar, + grammar_file, + tokens_file, + output_file, + compile_extension, + verbose_c_extension, + keep_asserts_in_extension, + skip_actions=skip_actions, + ) + + return grammar, parser, tokenizer, gen + + +def build_python_parser_and_generator( + grammar_file: str, + output_file: str, + verbose_tokenizer: bool = False, + verbose_parser: bool = False, + skip_actions: bool = False, +) -> Tuple[Grammar, Parser, Tokenizer, ParserGenerator]: + """Generate rules, python parser, tokenizer, parser generator for a given grammar + + Args: + grammar_file (string): Path for the grammar file + output_file (string): Path for the output file + verbose_tokenizer (bool, optional): Whether to display additional output + when generating the tokenizer. Defaults to False. + verbose_parser (bool, optional): Whether to display additional output + when generating the parser. Defaults to False. + skip_actions (bool, optional): Whether to pretend no rule has any actions. + """ + grammar, parser, tokenizer = build_parser(grammar_file, verbose_tokenizer, verbose_parser) + gen = build_python_generator(grammar, grammar_file, output_file, skip_actions=skip_actions,) + return grammar, parser, tokenizer, gen diff --git a/Tools/peg_generator/pegen/c_generator.py b/Tools/peg_generator/pegen/c_generator.py new file mode 100644 index 0000000000000000000000000000000000000000..b4d6a0bab51f4a941c2d35cbcb5f830793bc34d6 --- /dev/null +++ b/Tools/peg_generator/pegen/c_generator.py @@ -0,0 +1,791 @@ +import ast +from dataclasses import field, dataclass +import re +from typing import Any, Dict, IO, Optional, List, Text, Tuple, Set +from enum import Enum + +from pegen import grammar +from pegen.grammar import ( + Alt, + Cut, + Gather, + GrammarVisitor, + Group, + Lookahead, + NamedItem, + NameLeaf, + NegativeLookahead, + Opt, + PositiveLookahead, + Repeat0, + Repeat1, + Rhs, + Rule, + StringLeaf, +) +from pegen.parser_generator import ParserGenerator + + +EXTENSION_PREFIX = """\ +#include "pegen.h" + +#if defined(Py_DEBUG) && defined(Py_BUILD_CORE) +extern int Py_DebugFlag; +#define D(x) if (Py_DebugFlag) x; +#else +#define D(x) +#endif + +""" + + +EXTENSION_SUFFIX = """ +void * +_PyPegen_parse(Parser *p) +{ + // Initialize keywords + p->keywords = reserved_keywords; + p->n_keyword_lists = n_keyword_lists; + + return start_rule(p); +} +""" + + +class NodeTypes(Enum): + NAME_TOKEN = 0 + NUMBER_TOKEN = 1 + STRING_TOKEN = 2 + GENERIC_TOKEN = 3 + KEYWORD = 4 + SOFT_KEYWORD = 5 + CUT_OPERATOR = 6 + + +BASE_NODETYPES = { + "NAME": NodeTypes.NAME_TOKEN, + "NUMBER": NodeTypes.NUMBER_TOKEN, + "STRING": NodeTypes.STRING_TOKEN, +} + + +@dataclass +class FunctionCall: + function: str + arguments: List[Any] = field(default_factory=list) + assigned_variable: Optional[str] = None + return_type: Optional[str] = None + nodetype: Optional[NodeTypes] = None + force_true: bool = False + comment: Optional[str] = None + + def __str__(self) -> str: + parts = [] + parts.append(self.function) + if self.arguments: + parts.append(f"({', '.join(map(str, self.arguments))})") + if self.force_true: + parts.append(", 1") + if self.assigned_variable: + parts = ["(", self.assigned_variable, " = ", *parts, ")"] + if self.comment: + parts.append(f" // {self.comment}") + return "".join(parts) + + +class CCallMakerVisitor(GrammarVisitor): + def __init__( + self, + parser_generator: ParserGenerator, + exact_tokens: Dict[str, int], + non_exact_tokens: Set[str], + ): + self.gen = parser_generator + self.exact_tokens = exact_tokens + self.non_exact_tokens = non_exact_tokens + self.cache: Dict[Any, FunctionCall] = {} + self.keyword_cache: Dict[str, int] = {} + self.soft_keywords: Set[str] = set() + + def keyword_helper(self, keyword: str) -> FunctionCall: + if keyword not in self.keyword_cache: + self.keyword_cache[keyword] = self.gen.keyword_type() + return FunctionCall( + assigned_variable="_keyword", + function="_PyPegen_expect_token", + arguments=["p", self.keyword_cache[keyword]], + return_type="Token *", + nodetype=NodeTypes.KEYWORD, + comment=f"token='{keyword}'", + ) + + def soft_keyword_helper(self, value: str) -> FunctionCall: + self.soft_keywords.add(value.replace('"', "")) + return FunctionCall( + assigned_variable="_keyword", + function="_PyPegen_expect_soft_keyword", + arguments=["p", value], + return_type="expr_ty", + nodetype=NodeTypes.SOFT_KEYWORD, + comment=f"soft_keyword='{value}'", + ) + + def visit_NameLeaf(self, node: NameLeaf) -> FunctionCall: + name = node.value + if name in self.non_exact_tokens: + if name in BASE_NODETYPES: + return FunctionCall( + assigned_variable=f"{name.lower()}_var", + function=f"_PyPegen_{name.lower()}_token", + arguments=["p"], + nodetype=BASE_NODETYPES[name], + return_type="expr_ty", + comment=name, + ) + return FunctionCall( + assigned_variable=f"{name.lower()}_var", + function=f"_PyPegen_expect_token", + arguments=["p", name], + nodetype=NodeTypes.GENERIC_TOKEN, + return_type="Token *", + comment=f"token='{name}'", + ) + + type = None + rule = self.gen.all_rules.get(name.lower()) + if rule is not None: + type = "asdl_seq *" if rule.is_loop() or rule.is_gather() else rule.type + + return FunctionCall( + assigned_variable=f"{name}_var", + function=f"{name}_rule", + arguments=["p"], + return_type=type, + comment=f"{node}", + ) + + def visit_StringLeaf(self, node: StringLeaf) -> FunctionCall: + val = ast.literal_eval(node.value) + if re.match(r"[a-zA-Z_]\w*\Z", val): # This is a keyword + if node.value.endswith("'"): + return self.keyword_helper(val) + else: + return self.soft_keyword_helper(node.value) + else: + assert val in self.exact_tokens, f"{node.value} is not a known literal" + type = self.exact_tokens[val] + return FunctionCall( + assigned_variable="_literal", + function=f"_PyPegen_expect_token", + arguments=["p", type], + nodetype=NodeTypes.GENERIC_TOKEN, + return_type="Token *", + comment=f"token='{val}'", + ) + + def visit_Rhs(self, node: Rhs) -> FunctionCall: + def can_we_inline(node: Rhs) -> int: + if len(node.alts) != 1 or len(node.alts[0].items) != 1: + return False + # If the alternative has an action we cannot inline + if getattr(node.alts[0], "action", None) is not None: + return False + return True + + if node in self.cache: + return self.cache[node] + if can_we_inline(node): + self.cache[node] = self.generate_call(node.alts[0].items[0]) + else: + name = self.gen.name_node(node) + self.cache[node] = FunctionCall( + assigned_variable=f"{name}_var", + function=f"{name}_rule", + arguments=["p"], + comment=f"{node}", + ) + return self.cache[node] + + def visit_NamedItem(self, node: NamedItem) -> FunctionCall: + call = self.generate_call(node.item) + if node.name: + call.assigned_variable = node.name + return call + + def lookahead_call_helper(self, node: Lookahead, positive: int) -> FunctionCall: + call = self.generate_call(node.node) + if call.nodetype == NodeTypes.NAME_TOKEN: + return FunctionCall( + function=f"_PyPegen_lookahead_with_name", + arguments=[positive, call.function, *call.arguments], + return_type="int", + ) + elif call.nodetype == NodeTypes.SOFT_KEYWORD: + return FunctionCall( + function=f"_PyPegen_lookahead_with_string", + arguments=[positive, call.function, *call.arguments], + return_type="int", + ) + elif call.nodetype in {NodeTypes.GENERIC_TOKEN, NodeTypes.KEYWORD}: + return FunctionCall( + function=f"_PyPegen_lookahead_with_int", + arguments=[positive, call.function, *call.arguments], + return_type="int", + comment=f"token={node.node}", + ) + else: + return FunctionCall( + function=f"_PyPegen_lookahead", + arguments=[positive, call.function, *call.arguments], + return_type="int", + ) + + def visit_PositiveLookahead(self, node: PositiveLookahead) -> FunctionCall: + return self.lookahead_call_helper(node, 1) + + def visit_NegativeLookahead(self, node: NegativeLookahead) -> FunctionCall: + return self.lookahead_call_helper(node, 0) + + def visit_Opt(self, node: Opt) -> FunctionCall: + call = self.generate_call(node.node) + return FunctionCall( + assigned_variable="_opt_var", + function=call.function, + arguments=call.arguments, + force_true=True, + comment=f"{node}", + ) + + def visit_Repeat0(self, node: Repeat0) -> FunctionCall: + if node in self.cache: + return self.cache[node] + name = self.gen.name_loop(node.node, False) + self.cache[node] = FunctionCall( + assigned_variable=f"{name}_var", + function=f"{name}_rule", + arguments=["p"], + return_type="asdl_seq *", + comment=f"{node}", + ) + return self.cache[node] + + def visit_Repeat1(self, node: Repeat1) -> FunctionCall: + if node in self.cache: + return self.cache[node] + name = self.gen.name_loop(node.node, True) + self.cache[node] = FunctionCall( + assigned_variable=f"{name}_var", + function=f"{name}_rule", + arguments=["p"], + return_type="asdl_seq *", + comment=f"{node}", + ) + return self.cache[node] + + def visit_Gather(self, node: Gather) -> FunctionCall: + if node in self.cache: + return self.cache[node] + name = self.gen.name_gather(node) + self.cache[node] = FunctionCall( + assigned_variable=f"{name}_var", + function=f"{name}_rule", + arguments=["p"], + return_type="asdl_seq *", + comment=f"{node}", + ) + return self.cache[node] + + def visit_Group(self, node: Group) -> FunctionCall: + return self.generate_call(node.rhs) + + def visit_Cut(self, node: Cut) -> FunctionCall: + return FunctionCall( + assigned_variable="_cut_var", + return_type="int", + function="1", + nodetype=NodeTypes.CUT_OPERATOR, + ) + + def generate_call(self, node: Any) -> FunctionCall: + return super().visit(node) + + +class CParserGenerator(ParserGenerator, GrammarVisitor): + def __init__( + self, + grammar: grammar.Grammar, + tokens: Dict[int, str], + exact_tokens: Dict[str, int], + non_exact_tokens: Set[str], + file: Optional[IO[Text]], + debug: bool = False, + skip_actions: bool = False, + ): + super().__init__(grammar, tokens, file) + self.callmakervisitor: CCallMakerVisitor = CCallMakerVisitor( + self, exact_tokens, non_exact_tokens + ) + self._varname_counter = 0 + self.debug = debug + self.skip_actions = skip_actions + + def add_level(self) -> None: + self.print("D(p->level++);") + + def remove_level(self) -> None: + self.print("D(p->level--);") + + def add_return(self, ret_val: str) -> None: + self.remove_level() + self.print(f"return {ret_val};") + + def unique_varname(self, name: str = "tmpvar") -> str: + new_var = name + "_" + str(self._varname_counter) + self._varname_counter += 1 + return new_var + + def call_with_errorcheck_return(self, call_text: str, returnval: str) -> None: + error_var = self.unique_varname() + self.print(f"int {error_var} = {call_text};") + self.print(f"if ({error_var}) {{") + with self.indent(): + self.add_return(returnval) + self.print("}") + + def call_with_errorcheck_goto(self, call_text: str, goto_target: str) -> None: + error_var = self.unique_varname() + self.print(f"int {error_var} = {call_text};") + self.print(f"if ({error_var}) {{") + with self.indent(): + self.print(f"goto {goto_target};") + self.print(f"}}") + + def out_of_memory_return(self, expr: str, cleanup_code: Optional[str] = None,) -> None: + self.print(f"if ({expr}) {{") + with self.indent(): + if cleanup_code is not None: + self.print(cleanup_code) + self.print("p->error_indicator = 1;") + self.print("PyErr_NoMemory();") + self.add_return("NULL") + self.print(f"}}") + + def out_of_memory_goto(self, expr: str, goto_target: str) -> None: + self.print(f"if ({expr}) {{") + with self.indent(): + self.print("PyErr_NoMemory();") + self.print(f"goto {goto_target};") + self.print(f"}}") + + def generate(self, filename: str) -> None: + self.collect_todo() + self.print(f"// @generated by pegen.py from {filename}") + header = self.grammar.metas.get("header", EXTENSION_PREFIX) + if header: + self.print(header.rstrip("\n")) + subheader = self.grammar.metas.get("subheader", "") + if subheader: + self.print(subheader) + self._setup_keywords() + for i, (rulename, rule) in enumerate(self.todo.items(), 1000): + comment = " // Left-recursive" if rule.left_recursive else "" + self.print(f"#define {rulename}_type {i}{comment}") + self.print() + for rulename, rule in self.todo.items(): + if rule.is_loop() or rule.is_gather(): + type = "asdl_seq *" + elif rule.type: + type = rule.type + " " + else: + type = "void *" + self.print(f"static {type}{rulename}_rule(Parser *p);") + self.print() + while self.todo: + for rulename, rule in list(self.todo.items()): + del self.todo[rulename] + self.print() + if rule.left_recursive: + self.print("// Left-recursive") + self.visit(rule) + if self.skip_actions: + mode = 0 + else: + mode = int(self.rules["start"].type == "mod_ty") if "start" in self.rules else 1 + if mode == 1 and self.grammar.metas.get("bytecode"): + mode += 1 + modulename = self.grammar.metas.get("modulename", "parse") + trailer = self.grammar.metas.get("trailer", EXTENSION_SUFFIX) + if trailer: + self.print(trailer.rstrip("\n") % dict(mode=mode, modulename=modulename)) + + def _group_keywords_by_length(self) -> Dict[int, List[Tuple[str, int]]]: + groups: Dict[int, List[Tuple[str, int]]] = {} + for keyword_str, keyword_type in self.callmakervisitor.keyword_cache.items(): + length = len(keyword_str) + if length in groups: + groups[length].append((keyword_str, keyword_type)) + else: + groups[length] = [(keyword_str, keyword_type)] + return groups + + def _setup_keywords(self) -> None: + keyword_cache = self.callmakervisitor.keyword_cache + n_keyword_lists = ( + len(max(keyword_cache.keys(), key=len)) + 1 if len(keyword_cache) > 0 else 0 + ) + self.print(f"static const int n_keyword_lists = {n_keyword_lists};") + groups = self._group_keywords_by_length() + self.print("static KeywordToken *reserved_keywords[] = {") + with self.indent(): + num_groups = max(groups) + 1 if groups else 1 + for keywords_length in range(num_groups): + if keywords_length not in groups.keys(): + self.print("(KeywordToken[]) {{NULL, -1}},") + else: + self.print("(KeywordToken[]) {") + with self.indent(): + for keyword_str, keyword_type in groups[keywords_length]: + self.print(f'{{"{keyword_str}", {keyword_type}}},') + self.print("{NULL, -1},") + self.print("},") + self.print("};") + + def _set_up_token_start_metadata_extraction(self) -> None: + self.print("if (p->mark == p->fill && _PyPegen_fill_token(p) < 0) {") + with self.indent(): + self.print("p->error_indicator = 1;") + self.add_return("NULL") + self.print("}") + self.print("int _start_lineno = p->tokens[_mark]->lineno;") + self.print("UNUSED(_start_lineno); // Only used by EXTRA macro") + self.print("int _start_col_offset = p->tokens[_mark]->col_offset;") + self.print("UNUSED(_start_col_offset); // Only used by EXTRA macro") + + def _set_up_token_end_metadata_extraction(self) -> None: + self.print("Token *_token = _PyPegen_get_last_nonnwhitespace_token(p);") + self.print("if (_token == NULL) {") + with self.indent(): + self.add_return("NULL") + self.print("}") + self.print("int _end_lineno = _token->end_lineno;") + self.print("UNUSED(_end_lineno); // Only used by EXTRA macro") + self.print("int _end_col_offset = _token->end_col_offset;") + self.print("UNUSED(_end_col_offset); // Only used by EXTRA macro") + + def _check_for_errors(self) -> None: + self.print("if (p->error_indicator) {") + with self.indent(): + self.add_return("NULL") + self.print("}") + + def _set_up_rule_memoization(self, node: Rule, result_type: str) -> None: + self.print("{") + with self.indent(): + self.add_level() + self.print(f"{result_type} _res = NULL;") + self.print(f"if (_PyPegen_is_memoized(p, {node.name}_type, &_res)) {{") + with self.indent(): + self.add_return("_res") + self.print("}") + self.print("int _mark = p->mark;") + self.print("int _resmark = p->mark;") + self.print("while (1) {") + with self.indent(): + self.call_with_errorcheck_return( + f"_PyPegen_update_memo(p, _mark, {node.name}_type, _res)", "_res" + ) + self.print("p->mark = _mark;") + self.print(f"void *_raw = {node.name}_raw(p);") + self.print("if (p->error_indicator)") + with self.indent(): + self.print("return NULL;") + self.print("if (_raw == NULL || p->mark <= _resmark)") + with self.indent(): + self.print("break;") + self.print(f"_resmark = p->mark;") + self.print("_res = _raw;") + self.print("}") + self.print(f"p->mark = _resmark;") + self.add_return("_res") + self.print("}") + self.print(f"static {result_type}") + self.print(f"{node.name}_raw(Parser *p)") + + def _should_memoize(self, node: Rule) -> bool: + return node.memo and not node.left_recursive + + def _handle_default_rule_body(self, node: Rule, rhs: Rhs, result_type: str) -> None: + memoize = self._should_memoize(node) + + with self.indent(): + self.add_level() + self._check_for_errors() + self.print(f"{result_type} _res = NULL;") + if memoize: + self.print(f"if (_PyPegen_is_memoized(p, {node.name}_type, &_res)) {{") + with self.indent(): + self.add_return("_res") + self.print("}") + self.print("int _mark = p->mark;") + if any(alt.action and "EXTRA" in alt.action for alt in rhs.alts): + self._set_up_token_start_metadata_extraction() + self.visit( + rhs, is_loop=False, is_gather=node.is_gather(), rulename=node.name, + ) + if self.debug: + self.print(f'D(fprintf(stderr, "Fail at %d: {node.name}\\n", p->mark));') + self.print("_res = NULL;") + self.print(" done:") + with self.indent(): + if memoize: + self.print(f"_PyPegen_insert_memo(p, _mark, {node.name}_type, _res);") + self.add_return("_res") + + def _handle_loop_rule_body(self, node: Rule, rhs: Rhs) -> None: + memoize = self._should_memoize(node) + is_repeat1 = node.name.startswith("_loop1") + + with self.indent(): + self.add_level() + self._check_for_errors() + self.print("void *_res = NULL;") + if memoize: + self.print(f"if (_PyPegen_is_memoized(p, {node.name}_type, &_res)) {{") + with self.indent(): + self.add_return("_res") + self.print("}") + self.print("int _mark = p->mark;") + self.print("int _start_mark = p->mark;") + self.print("void **_children = PyMem_Malloc(sizeof(void *));") + self.out_of_memory_return(f"!_children") + self.print("ssize_t _children_capacity = 1;") + self.print("ssize_t _n = 0;") + if any(alt.action and "EXTRA" in alt.action for alt in rhs.alts): + self._set_up_token_start_metadata_extraction() + self.visit( + rhs, is_loop=True, is_gather=node.is_gather(), rulename=node.name, + ) + if is_repeat1: + self.print("if (_n == 0 || p->error_indicator) {") + with self.indent(): + self.print("PyMem_Free(_children);") + self.add_return("NULL") + self.print("}") + self.print("asdl_seq *_seq = _Py_asdl_seq_new(_n, p->arena);") + self.out_of_memory_return(f"!_seq", cleanup_code="PyMem_Free(_children);") + self.print("for (int i = 0; i < _n; i++) asdl_seq_SET(_seq, i, _children[i]);") + self.print("PyMem_Free(_children);") + if node.name: + self.print(f"_PyPegen_insert_memo(p, _start_mark, {node.name}_type, _seq);") + self.add_return("_seq") + + def visit_Rule(self, node: Rule) -> None: + is_loop = node.is_loop() + is_gather = node.is_gather() + rhs = node.flatten() + if is_loop or is_gather: + result_type = "asdl_seq *" + elif node.type: + result_type = node.type + else: + result_type = "void *" + + for line in str(node).splitlines(): + self.print(f"// {line}") + if node.left_recursive and node.leader: + self.print(f"static {result_type} {node.name}_raw(Parser *);") + + self.print(f"static {result_type}") + self.print(f"{node.name}_rule(Parser *p)") + + if node.left_recursive and node.leader: + self._set_up_rule_memoization(node, result_type) + + self.print("{") + if is_loop: + self._handle_loop_rule_body(node, rhs) + else: + self._handle_default_rule_body(node, rhs, result_type) + self.print("}") + + def visit_NamedItem(self, node: NamedItem) -> None: + call = self.callmakervisitor.generate_call(node) + if call.assigned_variable: + call.assigned_variable = self.dedupe(call.assigned_variable) + self.print(call) + + def visit_Rhs( + self, node: Rhs, is_loop: bool, is_gather: bool, rulename: Optional[str] + ) -> None: + if is_loop: + assert len(node.alts) == 1 + for alt in node.alts: + self.visit(alt, is_loop=is_loop, is_gather=is_gather, rulename=rulename) + + def join_conditions(self, keyword: str, node: Any) -> None: + self.print(f"{keyword} (") + with self.indent(): + first = True + for item in node.items: + if first: + first = False + else: + self.print("&&") + self.visit(item) + self.print(")") + + def emit_action(self, node: Alt, cleanup_code: Optional[str] = None) -> None: + self.print(f"_res = {node.action};") + + self.print("if (_res == NULL && PyErr_Occurred()) {") + with self.indent(): + self.print("p->error_indicator = 1;") + if cleanup_code: + self.print(cleanup_code) + self.add_return("NULL") + self.print("}") + + if self.debug: + self.print( + f'D(fprintf(stderr, "Hit with action [%d-%d]: %s\\n", _mark, p->mark, "{node}"));' + ) + + def emit_default_action(self, is_gather: bool, node: Alt) -> None: + if len(self.local_variable_names) > 1: + if is_gather: + assert len(self.local_variable_names) == 2 + self.print( + f"_res = _PyPegen_seq_insert_in_front(p, " + f"{self.local_variable_names[0]}, {self.local_variable_names[1]});" + ) + else: + if self.debug: + self.print( + f'D(fprintf(stderr, "Hit without action [%d:%d]: %s\\n", _mark, p->mark, "{node}"));' + ) + self.print( + f"_res = _PyPegen_dummy_name(p, {', '.join(self.local_variable_names)});" + ) + else: + if self.debug: + self.print( + f'D(fprintf(stderr, "Hit with default action [%d:%d]: %s\\n", _mark, p->mark, "{node}"));' + ) + self.print(f"_res = {self.local_variable_names[0]};") + + def emit_dummy_action(self) -> None: + self.print("_res = _PyPegen_dummy_name(p);") + + def handle_alt_normal(self, node: Alt, is_gather: bool, rulename: Optional[str]) -> None: + self.join_conditions(keyword="if", node=node) + self.print("{") + # We have parsed successfully all the conditions for the option. + with self.indent(): + node_str = str(node).replace('"', '\\"') + self.print( + f'D(fprintf(stderr, "%*c+ {rulename}[%d-%d]: %s succeeded!\\n", p->level, \' \', _mark, p->mark, "{node_str}"));' + ) + # Prepare to emmit the rule action and do so + if node.action and "EXTRA" in node.action: + self._set_up_token_end_metadata_extraction() + if self.skip_actions: + self.emit_dummy_action() + elif node.action: + self.emit_action(node) + else: + self.emit_default_action(is_gather, node) + + # As the current option has parsed correctly, do not continue with the rest. + self.print(f"goto done;") + self.print("}") + + def handle_alt_loop(self, node: Alt, is_gather: bool, rulename: Optional[str]) -> None: + # Condition of the main body of the alternative + self.join_conditions(keyword="while", node=node) + self.print("{") + # We have parsed successfully one item! + with self.indent(): + # Prepare to emit the rule action and do so + if node.action and "EXTRA" in node.action: + self._set_up_token_end_metadata_extraction() + if self.skip_actions: + self.emit_dummy_action() + elif node.action: + self.emit_action(node, cleanup_code="PyMem_Free(_children);") + else: + self.emit_default_action(is_gather, node) + + # Add the result of rule to the temporary buffer of children. This buffer + # will populate later an asdl_seq with all elements to return. + self.print("if (_n == _children_capacity) {") + with self.indent(): + self.print("_children_capacity *= 2;") + self.print( + "void **_new_children = PyMem_Realloc(_children, _children_capacity*sizeof(void *));" + ) + self.out_of_memory_return(f"!_new_children") + self.print("_children = _new_children;") + self.print("}") + self.print("_children[_n++] = _res;") + self.print("_mark = p->mark;") + self.print("}") + + def visit_Alt( + self, node: Alt, is_loop: bool, is_gather: bool, rulename: Optional[str] + ) -> None: + if len(node.items) == 1 and str(node.items[0]).startswith('invalid_'): + self.print(f"if (p->call_invalid_rules) {{ // {node}") + else: + self.print(f"{{ // {node}") + with self.indent(): + self._check_for_errors() + node_str = str(node).replace('"', '\\"') + self.print( + f'D(fprintf(stderr, "%*c> {rulename}[%d-%d]: %s\\n", p->level, \' \', _mark, p->mark, "{node_str}"));' + ) + # Prepare variable declarations for the alternative + vars = self.collect_vars(node) + for v, var_type in sorted(item for item in vars.items() if item[0] is not None): + if not var_type: + var_type = "void *" + else: + var_type += " " + if v == "_cut_var": + v += " = 0" # cut_var must be initialized + self.print(f"{var_type}{v};") + if v.startswith("_opt_var"): + self.print(f"UNUSED({v}); // Silence compiler warnings") + + with self.local_variable_context(): + if is_loop: + self.handle_alt_loop(node, is_gather, rulename) + else: + self.handle_alt_normal(node, is_gather, rulename) + + self.print("p->mark = _mark;") + node_str = str(node).replace('"', '\\"') + self.print( + f"D(fprintf(stderr, \"%*c%s {rulename}[%d-%d]: %s failed!\\n\", p->level, ' ',\n" + f' p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "{node_str}"));' + ) + if "_cut_var" in vars: + self.print("if (_cut_var) {") + with self.indent(): + self.add_return("NULL") + self.print("}") + self.print("}") + + def collect_vars(self, node: Alt) -> Dict[Optional[str], Optional[str]]: + types = {} + with self.local_variable_context(): + for item in node.items: + name, type = self.add_var(item) + types[name] = type + return types + + def add_var(self, node: NamedItem) -> Tuple[Optional[str], Optional[str]]: + call = self.callmakervisitor.generate_call(node.item) + name = node.name if node.name else call.assigned_variable + if name is not None: + name = self.dedupe(name) + return name, call.return_type diff --git a/Tools/peg_generator/pegen/first_sets.py b/Tools/peg_generator/pegen/first_sets.py new file mode 100644 index 0000000000000000000000000000000000000000..71be5a2e7cbf4c0501b6d2c7e3820e165768ccf1 --- /dev/null +++ b/Tools/peg_generator/pegen/first_sets.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python3.8 + +import argparse +import pprint +import sys +from typing import Set, Dict + +from pegen.build import build_parser +from pegen.grammar import ( + Alt, + Cut, + Gather, + Grammar, + GrammarVisitor, + Group, + Leaf, + Lookahead, + NamedItem, + NameLeaf, + NegativeLookahead, + Opt, + Repeat, + Repeat0, + Repeat1, + Rhs, + Rule, + StringLeaf, + PositiveLookahead, +) + +argparser = argparse.ArgumentParser( + prog="calculate_first_sets", description="Calculate the first sets of a grammar", +) +argparser.add_argument("grammar_file", help="The grammar file") + + +class FirstSetCalculator(GrammarVisitor): + def __init__(self, rules: Dict[str, Rule]) -> None: + self.rules = rules + for rule in rules.values(): + rule.nullable_visit(rules) + self.first_sets: Dict[str, Set[str]] = dict() + self.in_process: Set[str] = set() + + def calculate(self) -> Dict[str, Set[str]]: + for name, rule in self.rules.items(): + self.visit(rule) + return self.first_sets + + def visit_Alt(self, item: Alt) -> Set[str]: + result: Set[str] = set() + to_remove: Set[str] = set() + for other in item.items: + new_terminals = self.visit(other) + if isinstance(other.item, NegativeLookahead): + to_remove |= new_terminals + result |= new_terminals + if to_remove: + result -= to_remove + + # If the set of new terminals can start with the empty string, + # it means that the item is completelly nullable and we should + # also considering at least the next item in case the current + # one fails to parse. + + if "" in new_terminals: + continue + + if not isinstance(other.item, (Opt, NegativeLookahead, Repeat0)): + break + + # Do not allow the empty string to propagate. + result.discard("") + + return result + + def visit_Cut(self, item: Cut) -> Set[str]: + return set() + + def visit_Group(self, item: Group) -> Set[str]: + return self.visit(item.rhs) + + def visit_PositiveLookahead(self, item: Lookahead) -> Set[str]: + return self.visit(item.node) + + def visit_NegativeLookahead(self, item: NegativeLookahead) -> Set[str]: + return self.visit(item.node) + + def visit_NamedItem(self, item: NamedItem) -> Set[str]: + return self.visit(item.item) + + def visit_Opt(self, item: Opt) -> Set[str]: + return self.visit(item.node) + + def visit_Gather(self, item: Gather) -> Set[str]: + return self.visit(item.node) + + def visit_Repeat0(self, item: Repeat0) -> Set[str]: + return self.visit(item.node) + + def visit_Repeat1(self, item: Repeat1) -> Set[str]: + return self.visit(item.node) + + def visit_NameLeaf(self, item: NameLeaf) -> Set[str]: + if item.value not in self.rules: + return {item.value} + + if item.value not in self.first_sets: + self.first_sets[item.value] = self.visit(self.rules[item.value]) + return self.first_sets[item.value] + elif item.value in self.in_process: + return set() + + return self.first_sets[item.value] + + def visit_StringLeaf(self, item: StringLeaf) -> Set[str]: + return {item.value} + + def visit_Rhs(self, item: Rhs) -> Set[str]: + result: Set[str] = set() + for alt in item.alts: + result |= self.visit(alt) + return result + + def visit_Rule(self, item: Rule) -> Set[str]: + if item.name in self.in_process: + return set() + elif item.name not in self.first_sets: + self.in_process.add(item.name) + terminals = self.visit(item.rhs) + if item.nullable: + terminals.add("") + self.first_sets[item.name] = terminals + self.in_process.remove(item.name) + return self.first_sets[item.name] + + +def main() -> None: + args = argparser.parse_args() + + try: + grammar, parser, tokenizer = build_parser(args.grammar_file) + except Exception as err: + print("ERROR: Failed to parse grammar file", file=sys.stderr) + sys.exit(1) + + firs_sets = FirstSetCalculator(grammar.rules).calculate() + pprint.pprint(firs_sets) + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/pegen/grammar.py b/Tools/peg_generator/pegen/grammar.py new file mode 100644 index 0000000000000000000000000000000000000000..78edf412ea6e4739fb58c5b4635eb2326d423ccf --- /dev/null +++ b/Tools/peg_generator/pegen/grammar.py @@ -0,0 +1,467 @@ +from __future__ import annotations + +from abc import abstractmethod +from typing import ( + AbstractSet, + Any, + Dict, + Iterable, + Iterator, + List, + Optional, + Set, + Tuple, + TYPE_CHECKING, + Union, +) + + +if TYPE_CHECKING: + from pegen.parser_generator import ParserGenerator + + +class GrammarError(Exception): + pass + + +class GrammarVisitor: + def visit(self, node: Any, *args: Any, **kwargs: Any) -> Any: + """Visit a node.""" + method = "visit_" + node.__class__.__name__ + visitor = getattr(self, method, self.generic_visit) + return visitor(node, *args, **kwargs) + + def generic_visit(self, node: Iterable[Any], *args: Any, **kwargs: Any) -> None: + """Called if no explicit visitor function exists for a node.""" + for value in node: + if isinstance(value, list): + for item in value: + self.visit(item, *args, **kwargs) + else: + self.visit(value, *args, **kwargs) + + +class Grammar: + def __init__(self, rules: Iterable[Rule], metas: Iterable[Tuple[str, Optional[str]]]): + self.rules = {rule.name: rule for rule in rules} + self.metas = dict(metas) + + def __str__(self) -> str: + return "\n".join(str(rule) for name, rule in self.rules.items()) + + def __repr__(self) -> str: + lines = ["Grammar("] + lines.append(" [") + for rule in self.rules.values(): + lines.append(f" {repr(rule)},") + lines.append(" ],") + lines.append(" {repr(list(self.metas.items()))}") + lines.append(")") + return "\n".join(lines) + + def __iter__(self) -> Iterator[Rule]: + yield from self.rules.values() + + +# Global flag whether we want actions in __str__() -- default off. +SIMPLE_STR = True + + +class Rule: + def __init__(self, name: str, type: Optional[str], rhs: Rhs, memo: Optional[object] = None): + self.name = name + self.type = type + self.rhs = rhs + self.memo = bool(memo) + self.visited = False + self.nullable = False + self.left_recursive = False + self.leader = False + + def is_loop(self) -> bool: + return self.name.startswith("_loop") + + def is_gather(self) -> bool: + return self.name.startswith("_gather") + + def __str__(self) -> str: + if SIMPLE_STR or self.type is None: + res = f"{self.name}: {self.rhs}" + else: + res = f"{self.name}[{self.type}]: {self.rhs}" + if len(res) < 88: + return res + lines = [res.split(":")[0] + ":"] + lines += [f" | {alt}" for alt in self.rhs.alts] + return "\n".join(lines) + + def __repr__(self) -> str: + return f"Rule({self.name!r}, {self.type!r}, {self.rhs!r})" + + def __iter__(self) -> Iterator[Rhs]: + yield self.rhs + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + if self.visited: + # A left-recursive rule is considered non-nullable. + return False + self.visited = True + self.nullable = self.rhs.nullable_visit(rules) + return self.nullable + + def initial_names(self) -> AbstractSet[str]: + return self.rhs.initial_names() + + def flatten(self) -> Rhs: + # If it's a single parenthesized group, flatten it. + rhs = self.rhs + if ( + not self.is_loop() + and len(rhs.alts) == 1 + and len(rhs.alts[0].items) == 1 + and isinstance(rhs.alts[0].items[0].item, Group) + ): + rhs = rhs.alts[0].items[0].item.rhs + return rhs + + def collect_todo(self, gen: ParserGenerator) -> None: + rhs = self.flatten() + rhs.collect_todo(gen) + + +class Leaf: + def __init__(self, value: str): + self.value = value + + def __str__(self) -> str: + return self.value + + def __iter__(self) -> Iterable[str]: + if False: + yield + + @abstractmethod + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + raise NotImplementedError + + @abstractmethod + def initial_names(self) -> AbstractSet[str]: + raise NotImplementedError + + +class NameLeaf(Leaf): + """The value is the name.""" + + def __str__(self) -> str: + if self.value == "ENDMARKER": + return "$" + return super().__str__() + + def __repr__(self) -> str: + return f"NameLeaf({self.value!r})" + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + if self.value in rules: + return rules[self.value].nullable_visit(rules) + # Token or unknown; never empty. + return False + + def initial_names(self) -> AbstractSet[str]: + return {self.value} + + +class StringLeaf(Leaf): + """The value is a string literal, including quotes.""" + + def __repr__(self) -> str: + return f"StringLeaf({self.value!r})" + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + # The string token '' is considered empty. + return not self.value + + def initial_names(self) -> AbstractSet[str]: + return set() + + +class Rhs: + def __init__(self, alts: List[Alt]): + self.alts = alts + self.memo: Optional[Tuple[Optional[str], str]] = None + + def __str__(self) -> str: + return " | ".join(str(alt) for alt in self.alts) + + def __repr__(self) -> str: + return f"Rhs({self.alts!r})" + + def __iter__(self) -> Iterator[List[Alt]]: + yield self.alts + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + for alt in self.alts: + if alt.nullable_visit(rules): + return True + return False + + def initial_names(self) -> AbstractSet[str]: + names: Set[str] = set() + for alt in self.alts: + names |= alt.initial_names() + return names + + def collect_todo(self, gen: ParserGenerator) -> None: + for alt in self.alts: + alt.collect_todo(gen) + + +class Alt: + def __init__(self, items: List[NamedItem], *, icut: int = -1, action: Optional[str] = None): + self.items = items + self.icut = icut + self.action = action + + def __str__(self) -> str: + core = " ".join(str(item) for item in self.items) + if not SIMPLE_STR and self.action: + return f"{core} {{ {self.action} }}" + else: + return core + + def __repr__(self) -> str: + args = [repr(self.items)] + if self.icut >= 0: + args.append(f"icut={self.icut}") + if self.action: + args.append(f"action={self.action!r}") + return f"Alt({', '.join(args)})" + + def __iter__(self) -> Iterator[List[NamedItem]]: + yield self.items + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + for item in self.items: + if not item.nullable_visit(rules): + return False + return True + + def initial_names(self) -> AbstractSet[str]: + names: Set[str] = set() + for item in self.items: + names |= item.initial_names() + if not item.nullable: + break + return names + + def collect_todo(self, gen: ParserGenerator) -> None: + for item in self.items: + item.collect_todo(gen) + + +class NamedItem: + def __init__(self, name: Optional[str], item: Item): + self.name = name + self.item = item + self.nullable = False + + def __str__(self) -> str: + if not SIMPLE_STR and self.name: + return f"{self.name}={self.item}" + else: + return str(self.item) + + def __repr__(self) -> str: + return f"NamedItem({self.name!r}, {self.item!r})" + + def __iter__(self) -> Iterator[Item]: + yield self.item + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + self.nullable = self.item.nullable_visit(rules) + return self.nullable + + def initial_names(self) -> AbstractSet[str]: + return self.item.initial_names() + + def collect_todo(self, gen: ParserGenerator) -> None: + gen.callmakervisitor.visit(self.item) + + +class Lookahead: + def __init__(self, node: Plain, sign: str): + self.node = node + self.sign = sign + + def __str__(self) -> str: + return f"{self.sign}{self.node}" + + def __iter__(self) -> Iterator[Plain]: + yield self.node + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + return True + + def initial_names(self) -> AbstractSet[str]: + return set() + + +class PositiveLookahead(Lookahead): + def __init__(self, node: Plain): + super().__init__(node, "&") + + def __repr__(self) -> str: + return f"PositiveLookahead({self.node!r})" + + +class NegativeLookahead(Lookahead): + def __init__(self, node: Plain): + super().__init__(node, "!") + + def __repr__(self) -> str: + return f"NegativeLookahead({self.node!r})" + + +class Opt: + def __init__(self, node: Item): + self.node = node + + def __str__(self) -> str: + s = str(self.node) + # TODO: Decide whether to use [X] or X? based on type of X + if " " in s: + return f"[{s}]" + else: + return f"{s}?" + + def __repr__(self) -> str: + return f"Opt({self.node!r})" + + def __iter__(self) -> Iterator[Item]: + yield self.node + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + return True + + def initial_names(self) -> AbstractSet[str]: + return self.node.initial_names() + + +class Repeat: + """Shared base class for x* and x+.""" + + def __init__(self, node: Plain): + self.node = node + self.memo: Optional[Tuple[Optional[str], str]] = None + + @abstractmethod + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + raise NotImplementedError + + def __iter__(self) -> Iterator[Plain]: + yield self.node + + def initial_names(self) -> AbstractSet[str]: + return self.node.initial_names() + + +class Repeat0(Repeat): + def __str__(self) -> str: + s = str(self.node) + # TODO: Decide whether to use (X)* or X* based on type of X + if " " in s: + return f"({s})*" + else: + return f"{s}*" + + def __repr__(self) -> str: + return f"Repeat0({self.node!r})" + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + return True + + +class Repeat1(Repeat): + def __str__(self) -> str: + s = str(self.node) + # TODO: Decide whether to use (X)+ or X+ based on type of X + if " " in s: + return f"({s})+" + else: + return f"{s}+" + + def __repr__(self) -> str: + return f"Repeat1({self.node!r})" + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + return False + + +class Gather(Repeat): + def __init__(self, separator: Plain, node: Plain): + self.separator = separator + self.node = node + + def __str__(self) -> str: + return f"{self.separator!s}.{self.node!s}+" + + def __repr__(self) -> str: + return f"Gather({self.separator!r}, {self.node!r})" + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + return False + + +class Group: + def __init__(self, rhs: Rhs): + self.rhs = rhs + + def __str__(self) -> str: + return f"({self.rhs})" + + def __repr__(self) -> str: + return f"Group({self.rhs!r})" + + def __iter__(self) -> Iterator[Rhs]: + yield self.rhs + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + return self.rhs.nullable_visit(rules) + + def initial_names(self) -> AbstractSet[str]: + return self.rhs.initial_names() + + +class Cut: + def __init__(self) -> None: + pass + + def __repr__(self) -> str: + return f"Cut()" + + def __str__(self) -> str: + return f"~" + + def __iter__(self) -> Iterator[Tuple[str, str]]: + if False: + yield + + def __eq__(self, other: object) -> bool: + if not isinstance(other, Cut): + return NotImplemented + return True + + def nullable_visit(self, rules: Dict[str, Rule]) -> bool: + return True + + def initial_names(self) -> AbstractSet[str]: + return set() + + +Plain = Union[Leaf, Group] +Item = Union[Plain, Opt, Repeat, Lookahead, Rhs, Cut] +RuleName = Tuple[str, str] +MetaTuple = Tuple[str, Optional[str]] +MetaList = List[MetaTuple] +RuleList = List[Rule] +NamedItemList = List[NamedItem] +LookaheadOrCut = Union[Lookahead, Cut] diff --git a/Tools/peg_generator/pegen/grammar_parser.py b/Tools/peg_generator/pegen/grammar_parser.py new file mode 100644 index 0000000000000000000000000000000000000000..c784cfdf3b26673fab2207bb6c066f4fb9401b5c --- /dev/null +++ b/Tools/peg_generator/pegen/grammar_parser.py @@ -0,0 +1,677 @@ +#!/usr/bin/env python3.8 +# @generated by pegen from ./Tools/peg_generator/pegen/metagrammar.gram + +import ast +import sys +import tokenize + +from typing import Any, Optional + +from pegen.parser import memoize, memoize_left_rec, logger, Parser +from ast import literal_eval + +from pegen.grammar import ( + Alt, + Cut, + Gather, + Group, + Item, + Lookahead, + LookaheadOrCut, + MetaTuple, + MetaList, + NameLeaf, + NamedItem, + NamedItemList, + NegativeLookahead, + Opt, + Plain, + PositiveLookahead, + Repeat0, + Repeat1, + Rhs, + Rule, + RuleList, + RuleName, + Grammar, + StringLeaf, +) + +class GeneratedParser(Parser): + + @memoize + def start(self) -> Optional[Grammar]: + # start: grammar $ + mark = self.mark() + cut = False + if ( + (grammar := self.grammar()) + and + (endmarker := self.expect('ENDMARKER')) + ): + return grammar + self.reset(mark) + if cut: return None + return None + + @memoize + def grammar(self) -> Optional[Grammar]: + # grammar: metas rules | rules + mark = self.mark() + cut = False + if ( + (metas := self.metas()) + and + (rules := self.rules()) + ): + return Grammar ( rules , metas ) + self.reset(mark) + if cut: return None + cut = False + if ( + (rules := self.rules()) + ): + return Grammar ( rules , [ ] ) + self.reset(mark) + if cut: return None + return None + + @memoize + def metas(self) -> Optional[MetaList]: + # metas: meta metas | meta + mark = self.mark() + cut = False + if ( + (meta := self.meta()) + and + (metas := self.metas()) + ): + return [ meta ] + metas + self.reset(mark) + if cut: return None + cut = False + if ( + (meta := self.meta()) + ): + return [ meta ] + self.reset(mark) + if cut: return None + return None + + @memoize + def meta(self) -> Optional[MetaTuple]: + # meta: "@" NAME NEWLINE | "@" NAME NAME NEWLINE | "@" NAME STRING NEWLINE + mark = self.mark() + cut = False + if ( + (literal := self.expect("@")) + and + (name := self.name()) + and + (newline := self.expect('NEWLINE')) + ): + return ( name . string , None ) + self.reset(mark) + if cut: return None + cut = False + if ( + (literal := self.expect("@")) + and + (a := self.name()) + and + (b := self.name()) + and + (newline := self.expect('NEWLINE')) + ): + return ( a . string , b . string ) + self.reset(mark) + if cut: return None + cut = False + if ( + (literal := self.expect("@")) + and + (name := self.name()) + and + (string := self.string()) + and + (newline := self.expect('NEWLINE')) + ): + return ( name . string , literal_eval ( string . string ) ) + self.reset(mark) + if cut: return None + return None + + @memoize + def rules(self) -> Optional[RuleList]: + # rules: rule rules | rule + mark = self.mark() + cut = False + if ( + (rule := self.rule()) + and + (rules := self.rules()) + ): + return [ rule ] + rules + self.reset(mark) + if cut: return None + cut = False + if ( + (rule := self.rule()) + ): + return [ rule ] + self.reset(mark) + if cut: return None + return None + + @memoize + def rule(self) -> Optional[Rule]: + # rule: rulename memoflag? ":" alts NEWLINE INDENT more_alts DEDENT | rulename memoflag? ":" NEWLINE INDENT more_alts DEDENT | rulename memoflag? ":" alts NEWLINE + mark = self.mark() + cut = False + if ( + (rulename := self.rulename()) + and + (opt := self.memoflag(),) + and + (literal := self.expect(":")) + and + (alts := self.alts()) + and + (newline := self.expect('NEWLINE')) + and + (indent := self.expect('INDENT')) + and + (more_alts := self.more_alts()) + and + (dedent := self.expect('DEDENT')) + ): + return Rule ( rulename [ 0 ] , rulename [ 1 ] , Rhs ( alts . alts + more_alts . alts ) , memo = opt ) + self.reset(mark) + if cut: return None + cut = False + if ( + (rulename := self.rulename()) + and + (opt := self.memoflag(),) + and + (literal := self.expect(":")) + and + (newline := self.expect('NEWLINE')) + and + (indent := self.expect('INDENT')) + and + (more_alts := self.more_alts()) + and + (dedent := self.expect('DEDENT')) + ): + return Rule ( rulename [ 0 ] , rulename [ 1 ] , more_alts , memo = opt ) + self.reset(mark) + if cut: return None + cut = False + if ( + (rulename := self.rulename()) + and + (opt := self.memoflag(),) + and + (literal := self.expect(":")) + and + (alts := self.alts()) + and + (newline := self.expect('NEWLINE')) + ): + return Rule ( rulename [ 0 ] , rulename [ 1 ] , alts , memo = opt ) + self.reset(mark) + if cut: return None + return None + + @memoize + def rulename(self) -> Optional[RuleName]: + # rulename: NAME '[' NAME '*' ']' | NAME '[' NAME ']' | NAME + mark = self.mark() + cut = False + if ( + (name := self.name()) + and + (literal := self.expect('[')) + and + (type := self.name()) + and + (literal_1 := self.expect('*')) + and + (literal_2 := self.expect(']')) + ): + return ( name . string , type . string + "*" ) + self.reset(mark) + if cut: return None + cut = False + if ( + (name := self.name()) + and + (literal := self.expect('[')) + and + (type := self.name()) + and + (literal_1 := self.expect(']')) + ): + return ( name . string , type . string ) + self.reset(mark) + if cut: return None + cut = False + if ( + (name := self.name()) + ): + return ( name . string , None ) + self.reset(mark) + if cut: return None + return None + + @memoize + def memoflag(self) -> Optional[str]: + # memoflag: '(' 'memo' ')' + mark = self.mark() + cut = False + if ( + (literal := self.expect('(')) + and + (literal_1 := self.expect('memo')) + and + (literal_2 := self.expect(')')) + ): + return "memo" + self.reset(mark) + if cut: return None + return None + + @memoize + def alts(self) -> Optional[Rhs]: + # alts: alt "|" alts | alt + mark = self.mark() + cut = False + if ( + (alt := self.alt()) + and + (literal := self.expect("|")) + and + (alts := self.alts()) + ): + return Rhs ( [ alt ] + alts . alts ) + self.reset(mark) + if cut: return None + cut = False + if ( + (alt := self.alt()) + ): + return Rhs ( [ alt ] ) + self.reset(mark) + if cut: return None + return None + + @memoize + def more_alts(self) -> Optional[Rhs]: + # more_alts: "|" alts NEWLINE more_alts | "|" alts NEWLINE + mark = self.mark() + cut = False + if ( + (literal := self.expect("|")) + and + (alts := self.alts()) + and + (newline := self.expect('NEWLINE')) + and + (more_alts := self.more_alts()) + ): + return Rhs ( alts . alts + more_alts . alts ) + self.reset(mark) + if cut: return None + cut = False + if ( + (literal := self.expect("|")) + and + (alts := self.alts()) + and + (newline := self.expect('NEWLINE')) + ): + return Rhs ( alts . alts ) + self.reset(mark) + if cut: return None + return None + + @memoize + def alt(self) -> Optional[Alt]: + # alt: items '$' action | items '$' | items action | items + mark = self.mark() + cut = False + if ( + (items := self.items()) + and + (literal := self.expect('$')) + and + (action := self.action()) + ): + return Alt ( items + [ NamedItem ( None , NameLeaf ( 'ENDMARKER' ) ) ] , action = action ) + self.reset(mark) + if cut: return None + cut = False + if ( + (items := self.items()) + and + (literal := self.expect('$')) + ): + return Alt ( items + [ NamedItem ( None , NameLeaf ( 'ENDMARKER' ) ) ] , action = None ) + self.reset(mark) + if cut: return None + cut = False + if ( + (items := self.items()) + and + (action := self.action()) + ): + return Alt ( items , action = action ) + self.reset(mark) + if cut: return None + cut = False + if ( + (items := self.items()) + ): + return Alt ( items , action = None ) + self.reset(mark) + if cut: return None + return None + + @memoize + def items(self) -> Optional[NamedItemList]: + # items: named_item items | named_item + mark = self.mark() + cut = False + if ( + (named_item := self.named_item()) + and + (items := self.items()) + ): + return [ named_item ] + items + self.reset(mark) + if cut: return None + cut = False + if ( + (named_item := self.named_item()) + ): + return [ named_item ] + self.reset(mark) + if cut: return None + return None + + @memoize + def named_item(self) -> Optional[NamedItem]: + # named_item: NAME '=' ~ item | item | lookahead + mark = self.mark() + cut = False + if ( + (name := self.name()) + and + (literal := self.expect('=')) + and + (cut := True) + and + (item := self.item()) + ): + return NamedItem ( name . string , item ) + self.reset(mark) + if cut: return None + cut = False + if ( + (item := self.item()) + ): + return NamedItem ( None , item ) + self.reset(mark) + if cut: return None + cut = False + if ( + (it := self.lookahead()) + ): + return NamedItem ( None , it ) + self.reset(mark) + if cut: return None + return None + + @memoize + def lookahead(self) -> Optional[LookaheadOrCut]: + # lookahead: '&' ~ atom | '!' ~ atom | '~' + mark = self.mark() + cut = False + if ( + (literal := self.expect('&')) + and + (cut := True) + and + (atom := self.atom()) + ): + return PositiveLookahead ( atom ) + self.reset(mark) + if cut: return None + cut = False + if ( + (literal := self.expect('!')) + and + (cut := True) + and + (atom := self.atom()) + ): + return NegativeLookahead ( atom ) + self.reset(mark) + if cut: return None + cut = False + if ( + (literal := self.expect('~')) + ): + return Cut ( ) + self.reset(mark) + if cut: return None + return None + + @memoize + def item(self) -> Optional[Item]: + # item: '[' ~ alts ']' | atom '?' | atom '*' | atom '+' | atom '.' atom '+' | atom + mark = self.mark() + cut = False + if ( + (literal := self.expect('[')) + and + (cut := True) + and + (alts := self.alts()) + and + (literal_1 := self.expect(']')) + ): + return Opt ( alts ) + self.reset(mark) + if cut: return None + cut = False + if ( + (atom := self.atom()) + and + (literal := self.expect('?')) + ): + return Opt ( atom ) + self.reset(mark) + if cut: return None + cut = False + if ( + (atom := self.atom()) + and + (literal := self.expect('*')) + ): + return Repeat0 ( atom ) + self.reset(mark) + if cut: return None + cut = False + if ( + (atom := self.atom()) + and + (literal := self.expect('+')) + ): + return Repeat1 ( atom ) + self.reset(mark) + if cut: return None + cut = False + if ( + (sep := self.atom()) + and + (literal := self.expect('.')) + and + (node := self.atom()) + and + (literal_1 := self.expect('+')) + ): + return Gather ( sep , node ) + self.reset(mark) + if cut: return None + cut = False + if ( + (atom := self.atom()) + ): + return atom + self.reset(mark) + if cut: return None + return None + + @memoize + def atom(self) -> Optional[Plain]: + # atom: '(' ~ alts ')' | NAME | STRING + mark = self.mark() + cut = False + if ( + (literal := self.expect('(')) + and + (cut := True) + and + (alts := self.alts()) + and + (literal_1 := self.expect(')')) + ): + return Group ( alts ) + self.reset(mark) + if cut: return None + cut = False + if ( + (name := self.name()) + ): + return NameLeaf ( name . string ) + self.reset(mark) + if cut: return None + cut = False + if ( + (string := self.string()) + ): + return StringLeaf ( string . string ) + self.reset(mark) + if cut: return None + return None + + @memoize + def action(self) -> Optional[str]: + # action: "{" ~ target_atoms "}" + mark = self.mark() + cut = False + if ( + (literal := self.expect("{")) + and + (cut := True) + and + (target_atoms := self.target_atoms()) + and + (literal_1 := self.expect("}")) + ): + return target_atoms + self.reset(mark) + if cut: return None + return None + + @memoize + def target_atoms(self) -> Optional[str]: + # target_atoms: target_atom target_atoms | target_atom + mark = self.mark() + cut = False + if ( + (target_atom := self.target_atom()) + and + (target_atoms := self.target_atoms()) + ): + return target_atom + " " + target_atoms + self.reset(mark) + if cut: return None + cut = False + if ( + (target_atom := self.target_atom()) + ): + return target_atom + self.reset(mark) + if cut: return None + return None + + @memoize + def target_atom(self) -> Optional[str]: + # target_atom: "{" ~ target_atoms "}" | NAME | NUMBER | STRING | "?" | ":" | !"}" OP + mark = self.mark() + cut = False + if ( + (literal := self.expect("{")) + and + (cut := True) + and + (target_atoms := self.target_atoms()) + and + (literal_1 := self.expect("}")) + ): + return "{" + target_atoms + "}" + self.reset(mark) + if cut: return None + cut = False + if ( + (name := self.name()) + ): + return name . string + self.reset(mark) + if cut: return None + cut = False + if ( + (number := self.number()) + ): + return number . string + self.reset(mark) + if cut: return None + cut = False + if ( + (string := self.string()) + ): + return string . string + self.reset(mark) + if cut: return None + cut = False + if ( + (literal := self.expect("?")) + ): + return "?" + self.reset(mark) + if cut: return None + cut = False + if ( + (literal := self.expect(":")) + ): + return ":" + self.reset(mark) + if cut: return None + cut = False + if ( + self.negative_lookahead(self.expect, "}") + and + (op := self.op()) + ): + return op . string + self.reset(mark) + if cut: return None + return None + + +if __name__ == '__main__': + from pegen.parser import simple_parser_main + simple_parser_main(GeneratedParser) diff --git a/Tools/peg_generator/pegen/grammar_visualizer.py b/Tools/peg_generator/pegen/grammar_visualizer.py new file mode 100644 index 0000000000000000000000000000000000000000..7362ec5fa0f4dec3b793c180fcfb0d1e69c7be44 --- /dev/null +++ b/Tools/peg_generator/pegen/grammar_visualizer.py @@ -0,0 +1,65 @@ +import argparse +import sys + +from typing import Any, Iterator, Callable + +from pegen.build import build_parser +from pegen.grammar import Grammar, Rule + +argparser = argparse.ArgumentParser( + prog="pegen", description="Pretty print the AST for a given PEG grammar" +) +argparser.add_argument("filename", help="Grammar description") + + +class ASTGrammarPrinter: + def children(self, node: Rule) -> Iterator[Any]: + for value in node: + if isinstance(value, list): + yield from value + else: + yield value + + def name(self, node: Rule) -> str: + if not list(self.children(node)): + return repr(node) + return node.__class__.__name__ + + def print_grammar_ast(self, grammar: Grammar, printer: Callable[..., None] = print) -> None: + for rule in grammar.rules.values(): + printer(self.print_nodes_recursively(rule)) + + def print_nodes_recursively(self, node: Rule, prefix: str = "", istail: bool = True) -> str: + + children = list(self.children(node)) + value = self.name(node) + + line = prefix + ("└──" if istail else "├──") + value + "\n" + sufix = " " if istail else "│ " + + if not children: + return line + + *children, last = children + for child in children: + line += self.print_nodes_recursively(child, prefix + sufix, False) + line += self.print_nodes_recursively(last, prefix + sufix, True) + + return line + + +def main() -> None: + args = argparser.parse_args() + + try: + grammar, parser, tokenizer = build_parser(args.filename) + except Exception as err: + print("ERROR: Failed to parse grammar file", file=sys.stderr) + sys.exit(1) + + visitor = ASTGrammarPrinter() + visitor.print_grammar_ast(grammar) + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/pegen/keywordgen.py b/Tools/peg_generator/pegen/keywordgen.py new file mode 100644 index 0000000000000000000000000000000000000000..fa57770df4b9fd75d2124437ecd7f94b35d88160 --- /dev/null +++ b/Tools/peg_generator/pegen/keywordgen.py @@ -0,0 +1,78 @@ +"""Generate Lib/keyword.py from the Grammar and Tokens files using pgen""" + +import argparse + +from .build import build_parser, generate_token_definitions +from .c_generator import CParserGenerator + +TEMPLATE = r''' +"""Keywords (from "Grammar/python.gram") + +This file is automatically generated; please don't muck it up! + +To update the symbols in this file, 'cd' to the top directory of +the python source tree and run: + + PYTHONPATH=Tools/peg_generator python3 -m pegen.keywordgen \ + Grammar/Grammar \ + Grammar/Tokens \ + Lib/keyword.py + +Alternatively, you can run 'make regen-keyword'. +""" + +__all__ = ["iskeyword", "issoftkeyword", "kwlist", "softkwlist"] + +kwlist = [ +{keywords} +] + +softkwlist = [ +{soft_keywords} +] + +iskeyword = frozenset(kwlist).__contains__ +issoftkeyword = frozenset(softkwlist).__contains__ +'''.lstrip() + +EXTRA_KEYWORDS = ["async", "await"] + + +def main(): + parser = argparse.ArgumentParser( + description="Generate the Lib/keywords.py file from the grammar." + ) + parser.add_argument( + "grammar", type=str, help="The file with the grammar definition in PEG format" + ) + parser.add_argument( + "tokens_file", + type=argparse.FileType("r"), + help="The file with the token definitions" + ) + parser.add_argument( + "keyword_file", + type=argparse.FileType("w"), + help="The path to write the keyword definitions", + ) + args = parser.parse_args() + + grammar, _, _ = build_parser(args.grammar) + with args.tokens_file as tok_file: + all_tokens, exact_tok, non_exact_tok = generate_token_definitions(tok_file) + gen: ParserGenerator = CParserGenerator( + grammar, all_tokens, exact_tok, non_exact_tok, file=None + ) + gen.collect_todo() + + with args.keyword_file as thefile: + all_keywords = sorted(list(gen.callmakervisitor.keyword_cache.keys()) + EXTRA_KEYWORDS) + all_soft_keywords = sorted(gen.callmakervisitor.soft_keywords) + + keywords = "" if not all_keywords else " " + ",\n ".join(map(repr, all_keywords)) + soft_keywords = "" if not all_soft_keywords else " " + ",\n ".join(map(repr, all_soft_keywords)) + thefile.write(TEMPLATE.format(keywords=keywords, soft_keywords=soft_keywords)) + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/pegen/metagrammar.gram b/Tools/peg_generator/pegen/metagrammar.gram new file mode 100644 index 0000000000000000000000000000000000000000..f0c5ac3ab390fb83e32c19f754bc003423858e85 --- /dev/null +++ b/Tools/peg_generator/pegen/metagrammar.gram @@ -0,0 +1,123 @@ +@subheader """\ +from ast import literal_eval + +from pegen.grammar import ( + Alt, + Cut, + Gather, + Group, + Item, + Lookahead, + LookaheadOrCut, + MetaTuple, + MetaList, + NameLeaf, + NamedItem, + NamedItemList, + NegativeLookahead, + Opt, + Plain, + PositiveLookahead, + Repeat0, + Repeat1, + Rhs, + Rule, + RuleList, + RuleName, + Grammar, + StringLeaf, +) +""" + +start[Grammar]: grammar ENDMARKER { grammar } + +grammar[Grammar]: + | metas rules { Grammar(rules, metas) } + | rules { Grammar(rules, []) } + +metas[MetaList]: + | meta metas { [meta] + metas } + | meta { [meta] } + +meta[MetaTuple]: + | "@" NAME NEWLINE { (name.string, None) } + | "@" a=NAME b=NAME NEWLINE { (a.string, b.string) } + | "@" NAME STRING NEWLINE { (name.string, literal_eval(string.string)) } + +rules[RuleList]: + | rule rules { [rule] + rules } + | rule { [rule] } + +rule[Rule]: + | rulename memoflag? ":" alts NEWLINE INDENT more_alts DEDENT { + Rule(rulename[0], rulename[1], Rhs(alts.alts + more_alts.alts), memo=opt) } + | rulename memoflag? ":" NEWLINE INDENT more_alts DEDENT { + Rule(rulename[0], rulename[1], more_alts, memo=opt) } + | rulename memoflag? ":" alts NEWLINE { Rule(rulename[0], rulename[1], alts, memo=opt) } + +rulename[RuleName]: + | NAME '[' type=NAME '*' ']' { (name.string, type.string+"*") } + | NAME '[' type=NAME ']' { (name.string, type.string) } + | NAME { (name.string, None) } + +# In the future this may return something more complicated +memoflag[str]: + | '(' 'memo' ')' { "memo" } + +alts[Rhs]: + | alt "|" alts { Rhs([alt] + alts.alts)} + | alt { Rhs([alt]) } + +more_alts[Rhs]: + | "|" alts NEWLINE more_alts { Rhs(alts.alts + more_alts.alts) } + | "|" alts NEWLINE { Rhs(alts.alts) } + +alt[Alt]: + | items '$' action { Alt(items + [NamedItem(None, NameLeaf('ENDMARKER'))], action=action) } + | items '$' { Alt(items + [NamedItem(None, NameLeaf('ENDMARKER'))], action=None) } + | items action { Alt(items, action=action) } + | items { Alt(items, action=None) } + +items[NamedItemList]: + | named_item items { [named_item] + items } + | named_item { [named_item] } + +named_item[NamedItem]: + | NAME '=' ~ item {NamedItem(name.string, item)} + | item {NamedItem(None, item)} + | it=lookahead {NamedItem(None, it)} + +lookahead[LookaheadOrCut]: + | '&' ~ atom {PositiveLookahead(atom)} + | '!' ~ atom {NegativeLookahead(atom)} + | '~' {Cut()} + +item[Item]: + | '[' ~ alts ']' {Opt(alts)} + | atom '?' {Opt(atom)} + | atom '*' {Repeat0(atom)} + | atom '+' {Repeat1(atom)} + | sep=atom '.' node=atom '+' {Gather(sep, node)} + | atom {atom} + +atom[Plain]: + | '(' ~ alts ')' {Group(alts)} + | NAME {NameLeaf(name.string) } + | STRING {StringLeaf(string.string)} + +# Mini-grammar for the actions + +action[str]: "{" ~ target_atoms "}" { target_atoms } + +target_atoms[str]: + | target_atom target_atoms { target_atom + " " + target_atoms } + | target_atom { target_atom } + +target_atom[str]: + | "{" ~ target_atoms "}" { "{" + target_atoms + "}" } + | NAME { name.string } + | NUMBER { number.string } + | STRING { string.string } + | "?" { "?" } + | ":" { ":" } + | !"}" OP { op.string } diff --git a/Tools/peg_generator/pegen/parser.py b/Tools/peg_generator/pegen/parser.py new file mode 100644 index 0000000000000000000000000000000000000000..16d954dce89f7e51d20bb9d442661a59c7f2dd5a --- /dev/null +++ b/Tools/peg_generator/pegen/parser.py @@ -0,0 +1,310 @@ +import argparse +import sys +import time +import token +import tokenize +import traceback + +from abc import abstractmethod +from typing import Any, Callable, cast, Dict, Optional, Tuple, Type, TypeVar + +from pegen.tokenizer import exact_token_types +from pegen.tokenizer import Mark +from pegen.tokenizer import Tokenizer + +T = TypeVar("T") +P = TypeVar("P", bound="Parser") +F = TypeVar("F", bound=Callable[..., Any]) + + +def logger(method: F) -> F: + """For non-memoized functions that we want to be logged. + + (In practice this is only non-leader left-recursive functions.) + """ + method_name = method.__name__ + + def logger_wrapper(self: P, *args: object) -> T: + if not self._verbose: + return method(self, *args) + argsr = ",".join(repr(arg) for arg in args) + fill = " " * self._level + print(f"{fill}{method_name}({argsr}) .... (looking at {self.showpeek()})") + self._level += 1 + tree = method(self, *args) + self._level -= 1 + print(f"{fill}... {method_name}({argsr}) --> {tree!s:.200}") + return tree + + logger_wrapper.__wrapped__ = method # type: ignore + return cast(F, logger_wrapper) + + +def memoize(method: F) -> F: + """Memoize a symbol method.""" + method_name = method.__name__ + + def memoize_wrapper(self: P, *args: object) -> T: + mark = self.mark() + key = mark, method_name, args + # Fast path: cache hit, and not verbose. + if key in self._cache and not self._verbose: + tree, endmark = self._cache[key] + self.reset(endmark) + return tree + # Slow path: no cache hit, or verbose. + verbose = self._verbose + argsr = ",".join(repr(arg) for arg in args) + fill = " " * self._level + if key not in self._cache: + if verbose: + print(f"{fill}{method_name}({argsr}) ... (looking at {self.showpeek()})") + self._level += 1 + tree = method(self, *args) + self._level -= 1 + if verbose: + print(f"{fill}... {method_name}({argsr}) -> {tree!s:.200}") + endmark = self.mark() + self._cache[key] = tree, endmark + else: + tree, endmark = self._cache[key] + if verbose: + print(f"{fill}{method_name}({argsr}) -> {tree!s:.200}") + self.reset(endmark) + return tree + + memoize_wrapper.__wrapped__ = method # type: ignore + return cast(F, memoize_wrapper) + + +def memoize_left_rec(method: Callable[[P], Optional[T]]) -> Callable[[P], Optional[T]]: + """Memoize a left-recursive symbol method.""" + method_name = method.__name__ + + def memoize_left_rec_wrapper(self: P) -> Optional[T]: + mark = self.mark() + key = mark, method_name, () + # Fast path: cache hit, and not verbose. + if key in self._cache and not self._verbose: + tree, endmark = self._cache[key] + self.reset(endmark) + return tree + # Slow path: no cache hit, or verbose. + verbose = self._verbose + fill = " " * self._level + if key not in self._cache: + if verbose: + print(f"{fill}{method_name} ... (looking at {self.showpeek()})") + self._level += 1 + + # For left-recursive rules we manipulate the cache and + # loop until the rule shows no progress, then pick the + # previous result. For an explanation why this works, see + # https://github.com/PhilippeSigaud/Pegged/wiki/Left-Recursion + # (But we use the memoization cache instead of a static + # variable; perhaps this is similar to a paper by Warth et al. + # (http://web.cs.ucla.edu/~todd/research/pub.php?id=pepm08). + + # Prime the cache with a failure. + self._cache[key] = None, mark + lastresult, lastmark = None, mark + depth = 0 + if verbose: + print(f"{fill}Recursive {method_name} at {mark} depth {depth}") + + while True: + self.reset(mark) + result = method(self) + endmark = self.mark() + depth += 1 + if verbose: + print( + f"{fill}Recursive {method_name} at {mark} depth {depth}: {result!s:.200} to {endmark}" + ) + if not result: + if verbose: + print(f"{fill}Fail with {lastresult!s:.200} to {lastmark}") + break + if endmark <= lastmark: + if verbose: + print(f"{fill}Bailing with {lastresult!s:.200} to {lastmark}") + break + self._cache[key] = lastresult, lastmark = result, endmark + + self.reset(lastmark) + tree = lastresult + + self._level -= 1 + if verbose: + print(f"{fill}{method_name}() -> {tree!s:.200} [cached]") + if tree: + endmark = self.mark() + else: + endmark = mark + self.reset(endmark) + self._cache[key] = tree, endmark + else: + tree, endmark = self._cache[key] + if verbose: + print(f"{fill}{method_name}() -> {tree!s:.200} [fresh]") + if tree: + self.reset(endmark) + return tree + + memoize_left_rec_wrapper.__wrapped__ = method # type: ignore + return memoize_left_rec_wrapper + + +class Parser: + """Parsing base class.""" + + def __init__(self, tokenizer: Tokenizer, *, verbose: bool = False): + self._tokenizer = tokenizer + self._verbose = verbose + self._level = 0 + self._cache: Dict[Tuple[Mark, str, Tuple[Any, ...]], Tuple[Any, Mark]] = {} + # Pass through common tokenizer methods. + # TODO: Rename to _mark and _reset. + self.mark = self._tokenizer.mark + self.reset = self._tokenizer.reset + + @abstractmethod + def start(self) -> Any: + pass + + def showpeek(self) -> str: + tok = self._tokenizer.peek() + return f"{tok.start[0]}.{tok.start[1]}: {token.tok_name[tok.type]}:{tok.string!r}" + + @memoize + def name(self) -> Optional[tokenize.TokenInfo]: + tok = self._tokenizer.peek() + if tok.type == token.NAME: + return self._tokenizer.getnext() + return None + + @memoize + def number(self) -> Optional[tokenize.TokenInfo]: + tok = self._tokenizer.peek() + if tok.type == token.NUMBER: + return self._tokenizer.getnext() + return None + + @memoize + def string(self) -> Optional[tokenize.TokenInfo]: + tok = self._tokenizer.peek() + if tok.type == token.STRING: + return self._tokenizer.getnext() + return None + + @memoize + def op(self) -> Optional[tokenize.TokenInfo]: + tok = self._tokenizer.peek() + if tok.type == token.OP: + return self._tokenizer.getnext() + return None + + @memoize + def expect(self, type: str) -> Optional[tokenize.TokenInfo]: + tok = self._tokenizer.peek() + if tok.string == type: + return self._tokenizer.getnext() + if type in exact_token_types: + if tok.type == exact_token_types[type]: + return self._tokenizer.getnext() + if type in token.__dict__: + if tok.type == token.__dict__[type]: + return self._tokenizer.getnext() + if tok.type == token.OP and tok.string == type: + return self._tokenizer.getnext() + return None + + def positive_lookahead(self, func: Callable[..., T], *args: object) -> T: + mark = self.mark() + ok = func(*args) + self.reset(mark) + return ok + + def negative_lookahead(self, func: Callable[..., object], *args: object) -> bool: + mark = self.mark() + ok = func(*args) + self.reset(mark) + return not ok + + def make_syntax_error(self, filename: str = "") -> SyntaxError: + tok = self._tokenizer.diagnose() + return SyntaxError( + "pegen parse failure", (filename, tok.start[0], 1 + tok.start[1], tok.line) + ) + + +def simple_parser_main(parser_class: Type[Parser]) -> None: + argparser = argparse.ArgumentParser() + argparser.add_argument( + "-v", + "--verbose", + action="count", + default=0, + help="Print timing stats; repeat for more debug output", + ) + argparser.add_argument( + "-q", "--quiet", action="store_true", help="Don't print the parsed program" + ) + argparser.add_argument("filename", help="Input file ('-' to use stdin)") + + args = argparser.parse_args() + verbose = args.verbose + verbose_tokenizer = verbose >= 3 + verbose_parser = verbose == 2 or verbose >= 4 + + t0 = time.time() + + filename = args.filename + if filename == "" or filename == "-": + filename = "" + file = sys.stdin + else: + file = open(args.filename) + try: + tokengen = tokenize.generate_tokens(file.readline) + tokenizer = Tokenizer(tokengen, verbose=verbose_tokenizer) + parser = parser_class(tokenizer, verbose=verbose_parser) + tree = parser.start() + try: + if file.isatty(): + endpos = 0 + else: + endpos = file.tell() + except IOError: + endpos = 0 + finally: + if file is not sys.stdin: + file.close() + + t1 = time.time() + + if not tree: + err = parser.make_syntax_error(filename) + traceback.print_exception(err.__class__, err, None) + sys.exit(1) + + if not args.quiet: + print(tree) + + if verbose: + dt = t1 - t0 + diag = tokenizer.diagnose() + nlines = diag.end[0] + if diag.type == token.ENDMARKER: + nlines -= 1 + print(f"Total time: {dt:.3f} sec; {nlines} lines", end="") + if endpos: + print(f" ({endpos} bytes)", end="") + if dt: + print(f"; {nlines / dt:.0f} lines/sec") + else: + print() + print("Caches sizes:") + print(f" token array : {len(tokenizer._tokens):10}") + print(f" cache : {len(parser._cache):10}") + ## print_memstats() diff --git a/Tools/peg_generator/pegen/parser_generator.py b/Tools/peg_generator/pegen/parser_generator.py new file mode 100644 index 0000000000000000000000000000000000000000..364eccb84f4792b9309a05cac5698e1837f2da5b --- /dev/null +++ b/Tools/peg_generator/pegen/parser_generator.py @@ -0,0 +1,209 @@ +import contextlib +from abc import abstractmethod + +from typing import AbstractSet, Dict, IO, Iterator, List, Optional, Set, Text, Tuple + +from pegen import sccutils +from pegen.grammar import ( + Grammar, + Rule, + Rhs, + Alt, + NamedItem, + Plain, + NameLeaf, + Gather, +) +from pegen.grammar import GrammarError, GrammarVisitor + + +class RuleCheckingVisitor(GrammarVisitor): + def __init__(self, rules: Dict[str, Rule], tokens: Dict[int, str]): + self.rules = rules + self.tokens = tokens + + def visit_NameLeaf(self, node: NameLeaf) -> None: + if node.value not in self.rules and node.value not in self.tokens.values(): + # TODO: Add line/col info to (leaf) nodes + raise GrammarError(f"Dangling reference to rule {node.value!r}") + + def visit_NamedItem(self, node: NamedItem) -> None: + if node.name and node.name.startswith("_"): + raise GrammarError(f"Variable names cannot start with underscore: '{node.name}'") + self.visit(node.item) + + +class ParserGenerator: + + callmakervisitor: GrammarVisitor + + def __init__(self, grammar: Grammar, tokens: Dict[int, str], file: Optional[IO[Text]]): + self.grammar = grammar + self.tokens = tokens + self.rules = grammar.rules + self.validate_rule_names() + if "trailer" not in grammar.metas and "start" not in self.rules: + raise GrammarError("Grammar without a trailer must have a 'start' rule") + checker = RuleCheckingVisitor(self.rules, self.tokens) + for rule in self.rules.values(): + checker.visit(rule) + self.file = file + self.level = 0 + compute_nullables(self.rules) + self.first_graph, self.first_sccs = compute_left_recursives(self.rules) + self.todo = self.rules.copy() # Rules to generate + self.counter = 0 # For name_rule()/name_loop() + self.keyword_counter = 499 # For keyword_type() + self.all_rules: Dict[str, Rule] = {} # Rules + temporal rules + self._local_variable_stack: List[List[str]] = [] + + def validate_rule_names(self) -> None: + for rule in self.rules: + if rule.startswith("_"): + raise GrammarError(f"Rule names cannot start with underscore: '{rule}'") + + @contextlib.contextmanager + def local_variable_context(self) -> Iterator[None]: + self._local_variable_stack.append([]) + yield + self._local_variable_stack.pop() + + @property + def local_variable_names(self) -> List[str]: + return self._local_variable_stack[-1] + + @abstractmethod + def generate(self, filename: str) -> None: + raise NotImplementedError + + @contextlib.contextmanager + def indent(self) -> Iterator[None]: + self.level += 1 + try: + yield + finally: + self.level -= 1 + + def print(self, *args: object) -> None: + if not args: + print(file=self.file) + else: + print(" " * self.level, end="", file=self.file) + print(*args, file=self.file) + + def printblock(self, lines: str) -> None: + for line in lines.splitlines(): + self.print(line) + + def collect_todo(self) -> None: + done: Set[str] = set() + while True: + alltodo = list(self.todo) + self.all_rules.update(self.todo) + todo = [i for i in alltodo if i not in done] + if not todo: + break + for rulename in todo: + self.todo[rulename].collect_todo(self) + done = set(alltodo) + + def keyword_type(self) -> int: + self.keyword_counter += 1 + return self.keyword_counter + + def name_node(self, rhs: Rhs) -> str: + self.counter += 1 + name = f"_tmp_{self.counter}" # TODO: Pick a nicer name. + self.todo[name] = Rule(name, None, rhs) + return name + + def name_loop(self, node: Plain, is_repeat1: bool) -> str: + self.counter += 1 + if is_repeat1: + prefix = "_loop1_" + else: + prefix = "_loop0_" + name = f"{prefix}{self.counter}" # TODO: It's ugly to signal via the name. + self.todo[name] = Rule(name, None, Rhs([Alt([NamedItem(None, node)])])) + return name + + def name_gather(self, node: Gather) -> str: + self.counter += 1 + name = f"_gather_{self.counter}" + self.counter += 1 + extra_function_name = f"_loop0_{self.counter}" + extra_function_alt = Alt( + [NamedItem(None, node.separator), NamedItem("elem", node.node)], action="elem", + ) + self.todo[extra_function_name] = Rule( + extra_function_name, None, Rhs([extra_function_alt]), + ) + alt = Alt([NamedItem("elem", node.node), NamedItem("seq", NameLeaf(extra_function_name))],) + self.todo[name] = Rule(name, None, Rhs([alt]),) + return name + + def dedupe(self, name: str) -> str: + origname = name + counter = 0 + while name in self.local_variable_names: + counter += 1 + name = f"{origname}_{counter}" + self.local_variable_names.append(name) + return name + + +def compute_nullables(rules: Dict[str, Rule]) -> None: + """Compute which rules in a grammar are nullable. + + Thanks to TatSu (tatsu/leftrec.py) for inspiration. + """ + for rule in rules.values(): + rule.nullable_visit(rules) + + +def compute_left_recursives( + rules: Dict[str, Rule] +) -> Tuple[Dict[str, AbstractSet[str]], List[AbstractSet[str]]]: + graph = make_first_graph(rules) + sccs = list(sccutils.strongly_connected_components(graph.keys(), graph)) + for scc in sccs: + if len(scc) > 1: + for name in scc: + rules[name].left_recursive = True + # Try to find a leader such that all cycles go through it. + leaders = set(scc) + for start in scc: + for cycle in sccutils.find_cycles_in_scc(graph, scc, start): + # print("Cycle:", " -> ".join(cycle)) + leaders -= scc - set(cycle) + if not leaders: + raise ValueError( + f"SCC {scc} has no leadership candidate (no element is included in all cycles)" + ) + # print("Leaders:", leaders) + leader = min(leaders) # Pick an arbitrary leader from the candidates. + rules[leader].leader = True + else: + name = min(scc) # The only element. + if name in graph[name]: + rules[name].left_recursive = True + rules[name].leader = True + return graph, sccs + + +def make_first_graph(rules: Dict[str, Rule]) -> Dict[str, AbstractSet[str]]: + """Compute the graph of left-invocations. + + There's an edge from A to B if A may invoke B at its initial + position. + + Note that this requires the nullable flags to have been computed. + """ + graph = {} + vertices: Set[str] = set() + for rulename, rhs in rules.items(): + graph[rulename] = names = rhs.initial_names() + vertices |= names + for vertex in vertices: + graph.setdefault(vertex, set()) + return graph diff --git a/Tools/peg_generator/pegen/python_generator.py b/Tools/peg_generator/pegen/python_generator.py new file mode 100644 index 0000000000000000000000000000000000000000..b786de7fee5b43ce9fdf71e3fbf174f6b8ccd37f --- /dev/null +++ b/Tools/peg_generator/pegen/python_generator.py @@ -0,0 +1,241 @@ +import token +from typing import Any, Dict, Optional, IO, Text, Tuple + +from pegen.grammar import ( + Cut, + GrammarVisitor, + NameLeaf, + StringLeaf, + Rhs, + NamedItem, + Lookahead, + PositiveLookahead, + NegativeLookahead, + Opt, + Repeat0, + Repeat1, + Gather, + Group, + Rule, + Alt, +) +from pegen import grammar +from pegen.parser_generator import ParserGenerator + +MODULE_PREFIX = """\ +#!/usr/bin/env python3.8 +# @generated by pegen from {filename} + +import ast +import sys +import tokenize + +from typing import Any, Optional + +from pegen.parser import memoize, memoize_left_rec, logger, Parser + +""" +MODULE_SUFFIX = """ + +if __name__ == '__main__': + from pegen.parser import simple_parser_main + simple_parser_main(GeneratedParser) +""" + + +class PythonCallMakerVisitor(GrammarVisitor): + def __init__(self, parser_generator: ParserGenerator): + self.gen = parser_generator + self.cache: Dict[Any, Any] = {} + + def visit_NameLeaf(self, node: NameLeaf) -> Tuple[Optional[str], str]: + name = node.value + if name in ("NAME", "NUMBER", "STRING", "OP"): + name = name.lower() + return name, f"self.{name}()" + if name in ("NEWLINE", "DEDENT", "INDENT", "ENDMARKER", "ASYNC", "AWAIT"): + return name.lower(), f"self.expect({name!r})" + return name, f"self.{name}()" + + def visit_StringLeaf(self, node: StringLeaf) -> Tuple[str, str]: + return "literal", f"self.expect({node.value})" + + def visit_Rhs(self, node: Rhs) -> Tuple[Optional[str], str]: + if node in self.cache: + return self.cache[node] + if len(node.alts) == 1 and len(node.alts[0].items) == 1: + self.cache[node] = self.visit(node.alts[0].items[0]) + else: + name = self.gen.name_node(node) + self.cache[node] = name, f"self.{name}()" + return self.cache[node] + + def visit_NamedItem(self, node: NamedItem) -> Tuple[Optional[str], str]: + name, call = self.visit(node.item) + if node.name: + name = node.name + return name, call + + def lookahead_call_helper(self, node: Lookahead) -> Tuple[str, str]: + name, call = self.visit(node.node) + head, tail = call.split("(", 1) + assert tail[-1] == ")" + tail = tail[:-1] + return head, tail + + def visit_PositiveLookahead(self, node: PositiveLookahead) -> Tuple[None, str]: + head, tail = self.lookahead_call_helper(node) + return None, f"self.positive_lookahead({head}, {tail})" + + def visit_NegativeLookahead(self, node: NegativeLookahead) -> Tuple[None, str]: + head, tail = self.lookahead_call_helper(node) + return None, f"self.negative_lookahead({head}, {tail})" + + def visit_Opt(self, node: Opt) -> Tuple[str, str]: + name, call = self.visit(node.node) + # Note trailing comma (the call may already have one comma + # at the end, for example when rules have both repeat0 and optional + # markers, e.g: [rule*]) + if call.endswith(","): + return "opt", call + else: + return "opt", f"{call}," + + def visit_Repeat0(self, node: Repeat0) -> Tuple[str, str]: + if node in self.cache: + return self.cache[node] + name = self.gen.name_loop(node.node, False) + self.cache[node] = name, f"self.{name}()," # Also a trailing comma! + return self.cache[node] + + def visit_Repeat1(self, node: Repeat1) -> Tuple[str, str]: + if node in self.cache: + return self.cache[node] + name = self.gen.name_loop(node.node, True) + self.cache[node] = name, f"self.{name}()" # But no trailing comma here! + return self.cache[node] + + def visit_Gather(self, node: Gather) -> Tuple[str, str]: + if node in self.cache: + return self.cache[node] + name = self.gen.name_gather(node) + self.cache[node] = name, f"self.{name}()" # No trailing comma here either! + return self.cache[node] + + def visit_Group(self, node: Group) -> Tuple[Optional[str], str]: + return self.visit(node.rhs) + + def visit_Cut(self, node: Cut) -> Tuple[str, str]: + return "cut", "True" + + +class PythonParserGenerator(ParserGenerator, GrammarVisitor): + def __init__( + self, + grammar: grammar.Grammar, + file: Optional[IO[Text]], + tokens: Dict[int, str] = token.tok_name, + ): + super().__init__(grammar, tokens, file) + self.callmakervisitor = PythonCallMakerVisitor(self) + + def generate(self, filename: str) -> None: + header = self.grammar.metas.get("header", MODULE_PREFIX) + if header is not None: + self.print(header.rstrip("\n").format(filename=filename)) + subheader = self.grammar.metas.get("subheader", "") + if subheader: + self.print(subheader.format(filename=filename)) + self.print("class GeneratedParser(Parser):") + while self.todo: + for rulename, rule in list(self.todo.items()): + del self.todo[rulename] + self.print() + with self.indent(): + self.visit(rule) + trailer = self.grammar.metas.get("trailer", MODULE_SUFFIX) + if trailer is not None: + self.print(trailer.rstrip("\n")) + + def visit_Rule(self, node: Rule) -> None: + is_loop = node.is_loop() + is_gather = node.is_gather() + rhs = node.flatten() + if node.left_recursive: + if node.leader: + self.print("@memoize_left_rec") + else: + # Non-leader rules in a cycle are not memoized, + # but they must still be logged. + self.print("@logger") + else: + self.print("@memoize") + node_type = node.type or "Any" + self.print(f"def {node.name}(self) -> Optional[{node_type}]:") + with self.indent(): + self.print(f"# {node.name}: {rhs}") + if node.nullable: + self.print(f"# nullable={node.nullable}") + self.print("mark = self.mark()") + if is_loop: + self.print("children = []") + self.visit(rhs, is_loop=is_loop, is_gather=is_gather) + if is_loop: + self.print("return children") + else: + self.print("return None") + + def visit_NamedItem(self, node: NamedItem) -> None: + name, call = self.callmakervisitor.visit(node.item) + if node.name: + name = node.name + if not name: + self.print(call) + else: + if name != "cut": + name = self.dedupe(name) + self.print(f"({name} := {call})") + + def visit_Rhs(self, node: Rhs, is_loop: bool = False, is_gather: bool = False) -> None: + if is_loop: + assert len(node.alts) == 1 + for alt in node.alts: + self.visit(alt, is_loop=is_loop, is_gather=is_gather) + + def visit_Alt(self, node: Alt, is_loop: bool, is_gather: bool) -> None: + with self.local_variable_context(): + self.print("cut = False") # TODO: Only if needed. + if is_loop: + self.print("while (") + else: + self.print("if (") + with self.indent(): + first = True + for item in node.items: + if first: + first = False + else: + self.print("and") + self.visit(item) + if is_gather: + self.print("is not None") + + self.print("):") + with self.indent(): + action = node.action + if not action: + if is_gather: + assert len(self.local_variable_names) == 2 + action = ( + f"[{self.local_variable_names[0]}] + {self.local_variable_names[1]}" + ) + else: + action = f"[{', '.join(self.local_variable_names)}]" + if is_loop: + self.print(f"children.append({action})") + self.print(f"mark = self.mark()") + else: + self.print(f"return {action}") + self.print("self.reset(mark)") + # Skip remaining alternatives if a cut was reached. + self.print("if cut: return None") # TODO: Only if needed. diff --git a/Tools/peg_generator/pegen/sccutils.py b/Tools/peg_generator/pegen/sccutils.py new file mode 100644 index 0000000000000000000000000000000000000000..1f0586bb2f7d6dbd895e87c590990660deaf941c --- /dev/null +++ b/Tools/peg_generator/pegen/sccutils.py @@ -0,0 +1,128 @@ +# Adapted from mypy (mypy/build.py) under the MIT license. + +from typing import * + + +def strongly_connected_components( + vertices: AbstractSet[str], edges: Dict[str, AbstractSet[str]] +) -> Iterator[AbstractSet[str]]: + """Compute Strongly Connected Components of a directed graph. + + Args: + vertices: the labels for the vertices + edges: for each vertex, gives the target vertices of its outgoing edges + + Returns: + An iterator yielding strongly connected components, each + represented as a set of vertices. Each input vertex will occur + exactly once; vertices not part of a SCC are returned as + singleton sets. + + From http://code.activestate.com/recipes/578507/. + """ + identified: Set[str] = set() + stack: List[str] = [] + index: Dict[str, int] = {} + boundaries: List[int] = [] + + def dfs(v: str) -> Iterator[Set[str]]: + index[v] = len(stack) + stack.append(v) + boundaries.append(index[v]) + + for w in edges[v]: + if w not in index: + yield from dfs(w) + elif w not in identified: + while index[w] < boundaries[-1]: + boundaries.pop() + + if boundaries[-1] == index[v]: + boundaries.pop() + scc = set(stack[index[v] :]) + del stack[index[v] :] + identified.update(scc) + yield scc + + for v in vertices: + if v not in index: + yield from dfs(v) + + +def topsort( + data: Dict[AbstractSet[str], Set[AbstractSet[str]]] +) -> Iterable[AbstractSet[AbstractSet[str]]]: + """Topological sort. + + Args: + data: A map from SCCs (represented as frozen sets of strings) to + sets of SCCs, its dependencies. NOTE: This data structure + is modified in place -- for normalization purposes, + self-dependencies are removed and entries representing + orphans are added. + + Returns: + An iterator yielding sets of SCCs that have an equivalent + ordering. NOTE: The algorithm doesn't care about the internal + structure of SCCs. + + Example: + Suppose the input has the following structure: + + {A: {B, C}, B: {D}, C: {D}} + + This is normalized to: + + {A: {B, C}, B: {D}, C: {D}, D: {}} + + The algorithm will yield the following values: + + {D} + {B, C} + {A} + + From http://code.activestate.com/recipes/577413/. + """ + # TODO: Use a faster algorithm? + for k, v in data.items(): + v.discard(k) # Ignore self dependencies. + for item in set.union(*data.values()) - set(data.keys()): + data[item] = set() + while True: + ready = {item for item, dep in data.items() if not dep} + if not ready: + break + yield ready + data = {item: (dep - ready) for item, dep in data.items() if item not in ready} + assert not data, "A cyclic dependency exists amongst %r" % data + + +def find_cycles_in_scc( + graph: Dict[str, AbstractSet[str]], scc: AbstractSet[str], start: str +) -> Iterable[List[str]]: + """Find cycles in SCC emanating from start. + + Yields lists of the form ['A', 'B', 'C', 'A'], which means there's + a path from A -> B -> C -> A. The first item is always the start + argument, but the last item may be another element, e.g. ['A', + 'B', 'C', 'B'] means there's a path from A to B and there's a + cycle from B to C and back. + """ + # Basic input checks. + assert start in scc, (start, scc) + assert scc <= graph.keys(), scc - graph.keys() + + # Reduce the graph to nodes in the SCC. + graph = {src: {dst for dst in dsts if dst in scc} for src, dsts in graph.items() if src in scc} + assert start in graph + + # Recursive helper that yields cycles. + def dfs(node: str, path: List[str]) -> Iterator[List[str]]: + if node in path: + yield path + [node] + return + path = path + [node] # TODO: Make this not quadratic. + for child in graph[node]: + yield from dfs(child, path) + + yield from dfs(start, []) diff --git a/Tools/peg_generator/pegen/testutil.py b/Tools/peg_generator/pegen/testutil.py new file mode 100644 index 0000000000000000000000000000000000000000..920d24657c5edf65d0a0198bfa24421977b69dc0 --- /dev/null +++ b/Tools/peg_generator/pegen/testutil.py @@ -0,0 +1,133 @@ +import importlib.util +import io +import os +import pathlib +import sys +import textwrap +import tokenize +import token + +from typing import Any, cast, Dict, IO, Type, Final + +from pegen.build import compile_c_extension +from pegen.c_generator import CParserGenerator +from pegen.grammar import Grammar +from pegen.grammar_parser import GeneratedParser as GrammarParser +from pegen.parser import Parser +from pegen.python_generator import PythonParserGenerator +from pegen.tokenizer import Tokenizer + +ALL_TOKENS = token.tok_name +EXACT_TOKENS = token.EXACT_TOKEN_TYPES # type: ignore +NON_EXACT_TOKENS = { + name for index, name in token.tok_name.items() if index not in EXACT_TOKENS.values() +} + + +def generate_parser(grammar: Grammar) -> Type[Parser]: + # Generate a parser. + out = io.StringIO() + genr = PythonParserGenerator(grammar, out) + genr.generate("") + + # Load the generated parser class. + ns: Dict[str, Any] = {} + exec(out.getvalue(), ns) + return ns["GeneratedParser"] + + +def run_parser(file: IO[bytes], parser_class: Type[Parser], *, verbose: bool = False) -> Any: + # Run a parser on a file (stream). + tokenizer = Tokenizer(tokenize.generate_tokens(file.readline)) # type: ignore # typeshed issue #3515 + parser = parser_class(tokenizer, verbose=verbose) + result = parser.start() + if result is None: + raise parser.make_syntax_error() + return result + + +def parse_string( + source: str, parser_class: Type[Parser], *, dedent: bool = True, verbose: bool = False +) -> Any: + # Run the parser on a string. + if dedent: + source = textwrap.dedent(source) + file = io.StringIO(source) + return run_parser(file, parser_class, verbose=verbose) # type: ignore # typeshed issue #3515 + + +def make_parser(source: str) -> Type[Parser]: + # Combine parse_string() and generate_parser(). + grammar = parse_string(source, GrammarParser) + return generate_parser(grammar) + + +def import_file(full_name: str, path: str) -> Any: + """Import a python module from a path""" + + spec = importlib.util.spec_from_file_location(full_name, path) + mod = importlib.util.module_from_spec(spec) + + # We assume this is not None and has an exec_module() method. + # See https://docs.python.org/3/reference/import.html?highlight=exec_module#loading + loader = cast(Any, spec.loader) + loader.exec_module(mod) + return mod + + +def generate_c_parser_source(grammar: Grammar) -> str: + out = io.StringIO() + genr = CParserGenerator(grammar, ALL_TOKENS, EXACT_TOKENS, NON_EXACT_TOKENS, out) + genr.generate("") + return out.getvalue() + + +def generate_parser_c_extension( + grammar: Grammar, path: pathlib.PurePath, debug: bool = False +) -> Any: + """Generate a parser c extension for the given grammar in the given path + + Returns a module object with a parse_string() method. + TODO: express that using a Protocol. + """ + # Make sure that the working directory is empty: reusing non-empty temporary + # directories when generating extensions can lead to segmentation faults. + # Check issue #95 (https://github.com/gvanrossum/pegen/issues/95) for more + # context. + assert not os.listdir(path) + source = path / "parse.c" + with open(source, "w", encoding="utf-8") as file: + genr = CParserGenerator( + grammar, ALL_TOKENS, EXACT_TOKENS, NON_EXACT_TOKENS, file, debug=debug + ) + genr.generate("parse.c") + compile_c_extension(str(source), build_dir=str(path)) + + +def print_memstats() -> bool: + MiB: Final = 2 ** 20 + try: + import psutil # type: ignore + except ImportError: + return False + print("Memory stats:") + process = psutil.Process() + meminfo = process.memory_info() + res = {} + res["rss"] = meminfo.rss / MiB + res["vms"] = meminfo.vms / MiB + if sys.platform == "win32": + res["maxrss"] = meminfo.peak_wset / MiB + else: + # See https://stackoverflow.com/questions/938733/total-memory-used-by-python-process + import resource # Since it doesn't exist on Windows. + + rusage = resource.getrusage(resource.RUSAGE_SELF) + if sys.platform == "darwin": + factor = 1 + else: + factor = 1024 # Linux + res["maxrss"] = rusage.ru_maxrss * factor / MiB + for key, value in res.items(): + print(f" {key:12.12s}: {value:10.0f} MiB") + return True diff --git a/Tools/peg_generator/pegen/tokenizer.py b/Tools/peg_generator/pegen/tokenizer.py new file mode 100644 index 0000000000000000000000000000000000000000..61a28efc84b62b667dbe7cf97039fbfe103b25bd --- /dev/null +++ b/Tools/peg_generator/pegen/tokenizer.py @@ -0,0 +1,86 @@ +import token +import tokenize +from typing import List, Iterator + +Mark = int # NewType('Mark', int) + +exact_token_types = token.EXACT_TOKEN_TYPES # type: ignore + + +def shorttok(tok: tokenize.TokenInfo) -> str: + return "%-25.25s" % f"{tok.start[0]}.{tok.start[1]}: {token.tok_name[tok.type]}:{tok.string!r}" + + +class Tokenizer: + """Caching wrapper for the tokenize module. + + This is pretty tied to Python's syntax. + """ + + _tokens: List[tokenize.TokenInfo] + + def __init__(self, tokengen: Iterator[tokenize.TokenInfo], *, verbose: bool = False): + self._tokengen = tokengen + self._tokens = [] + self._index = 0 + self._verbose = verbose + if verbose: + self.report(False, False) + + def getnext(self) -> tokenize.TokenInfo: + """Return the next token and updates the index.""" + cached = True + while self._index == len(self._tokens): + tok = next(self._tokengen) + if tok.type in (tokenize.NL, tokenize.COMMENT): + continue + if tok.type == token.ERRORTOKEN and tok.string.isspace(): + continue + self._tokens.append(tok) + cached = False + tok = self._tokens[self._index] + self._index += 1 + if self._verbose: + self.report(cached, False) + return tok + + def peek(self) -> tokenize.TokenInfo: + """Return the next token *without* updating the index.""" + while self._index == len(self._tokens): + tok = next(self._tokengen) + if tok.type in (tokenize.NL, tokenize.COMMENT): + continue + if tok.type == token.ERRORTOKEN and tok.string.isspace(): + continue + self._tokens.append(tok) + return self._tokens[self._index] + + def diagnose(self) -> tokenize.TokenInfo: + if not self._tokens: + self.getnext() + return self._tokens[-1] + + def mark(self) -> Mark: + return self._index + + def reset(self, index: Mark) -> None: + if index == self._index: + return + assert 0 <= index <= len(self._tokens), (index, len(self._tokens)) + old_index = self._index + self._index = index + if self._verbose: + self.report(True, index < old_index) + + def report(self, cached: bool, back: bool) -> None: + if back: + fill = "-" * self._index + "-" + elif cached: + fill = "-" * self._index + ">" + else: + fill = "-" * self._index + "*" + if self._index == 0: + print(f"{fill} (Bof)") + else: + tok = self._tokens[self._index - 1] + print(f"{fill} {shorttok(tok)}") diff --git a/Tools/peg_generator/pyproject.toml b/Tools/peg_generator/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..f69c5b5e82faf3f0229e1b695d9210df98451cf0 --- /dev/null +++ b/Tools/peg_generator/pyproject.toml @@ -0,0 +1,9 @@ +[tool.black] +line-length = 99 +target_version = ['py38'] +exclude = ''' +( + /pegen/grammar_parser.py # generated file + | /test/test_data/ # test files +) +''' diff --git a/Tools/peg_generator/requirements.pip b/Tools/peg_generator/requirements.pip new file mode 100644 index 0000000000000000000000000000000000000000..190b3488f7bc128d03a06d27e528ef0ab4eb4e09 --- /dev/null +++ b/Tools/peg_generator/requirements.pip @@ -0,0 +1,2 @@ +memory-profiler==0.57.0 +psutil==5.7.0 diff --git a/Tools/peg_generator/scripts/__init__.py b/Tools/peg_generator/scripts/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..1e423f483844b16980627c78de52b66ccdef25e6 --- /dev/null +++ b/Tools/peg_generator/scripts/__init__.py @@ -0,0 +1 @@ +# This exists to let mypy find modules here diff --git a/Tools/peg_generator/scripts/ast_timings.py b/Tools/peg_generator/scripts/ast_timings.py new file mode 100644 index 0000000000000000000000000000000000000000..ca252208f283eda69eb848067628ff82cac2a084 --- /dev/null +++ b/Tools/peg_generator/scripts/ast_timings.py @@ -0,0 +1,26 @@ +import ast +import sys +import time + +from pegen.testutil import print_memstats + + +def main() -> None: + t0 = time.time() + for filename in sys.argv[1:]: + print(filename, end="\r") + try: + with open(filename) as file: + source = file.read() + tree = ast.parse(source, filename) + except Exception as err: + print(f"{filename}: {err.__class__.__name__}: {err}", file=sys.stderr) + tok = None + t1 = time.time() + dt = t1 - t0 + print(f"Parsed in {dt:.3f} secs", file=sys.stderr) + print_memstats() + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/scripts/benchmark.py b/Tools/peg_generator/scripts/benchmark.py new file mode 100644 index 0000000000000000000000000000000000000000..af356bed78391d57f85755c8dc35272a6ba47c6f --- /dev/null +++ b/Tools/peg_generator/scripts/benchmark.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python3 + +import argparse +import ast +import sys +import os +from time import time + +import _peg_parser + +try: + import memory_profiler +except ModuleNotFoundError: + print("Please run `make venv` to create a virtual environment and install" + " all the dependencies, before running this script.") + sys.exit(1) + +sys.path.insert(0, os.getcwd()) +from scripts.test_parse_directory import parse_directory + +argparser = argparse.ArgumentParser( + prog="benchmark", description="Reproduce the various pegen benchmarks" +) +argparser.add_argument( + "--parser", + action="store", + choices=["new", "old"], + default="pegen", + help="Which parser to benchmark (default is pegen)", +) +argparser.add_argument( + "--target", + action="store", + choices=["xxl", "stdlib"], + default="xxl", + help="Which target to use for the benchmark (default is xxl.py)", +) + +subcommands = argparser.add_subparsers(title="Benchmarks", dest="subcommand") +command_compile = subcommands.add_parser( + "compile", help="Benchmark parsing and compiling to bytecode" +) +command_parse = subcommands.add_parser( + "parse", help="Benchmark parsing and generating an ast.AST" +) +command_notree = subcommands.add_parser( + "notree", help="Benchmark parsing and dumping the tree" +) + + +def benchmark(func): + def wrapper(*args): + times = list() + for _ in range(3): + start = time() + result = func(*args) + end = time() + times.append(end - start) + memory = memory_profiler.memory_usage((func, args)) + print(f"{func.__name__}") + print(f"\tTime: {sum(times)/3:.3f} seconds on an average of 3 runs") + print(f"\tMemory: {max(memory)} MiB on an average of 3 runs") + return result + + return wrapper + + +@benchmark +def time_compile(source, parser): + if parser == "old": + return _peg_parser.compile_string( + source, + oldparser=True, + ) + else: + return _peg_parser.compile_string(source) + + +@benchmark +def time_parse(source, parser): + if parser == "old": + return _peg_parser.parse_string(source, oldparser=True) + else: + return _peg_parser.parse_string(source) + + +@benchmark +def time_notree(source, parser): + if parser == "old": + return _peg_parser.parse_string(source, oldparser=True, ast=False) + else: + return _peg_parser.parse_string(source, ast=False) + + +def run_benchmark_xxl(subcommand, parser, source): + if subcommand == "compile": + time_compile(source, parser) + elif subcommand == "parse": + time_parse(source, parser) + elif subcommand == "notree": + time_notree(source, parser) + + +def run_benchmark_stdlib(subcommand, parser): + modes = {"compile": 2, "parse": 1, "notree": 0} + for _ in range(3): + parse_directory( + "../../Lib", + verbose=False, + excluded_files=["*/bad*", "*/lib2to3/tests/data/*",], + tree_arg=0, + short=True, + mode=modes[subcommand], + oldparser=(parser == "old"), + ) + + +def main(): + args = argparser.parse_args() + subcommand = args.subcommand + parser = args.parser + target = args.target + + if subcommand is None: + argparser.error("A benchmark to run is required") + + if target == "xxl": + with open(os.path.join("data", "xxl.py"), "r") as f: + source = f.read() + run_benchmark_xxl(subcommand, parser, source) + elif target == "stdlib": + run_benchmark_stdlib(subcommand, parser) + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/scripts/download_pypi_packages.py b/Tools/peg_generator/scripts/download_pypi_packages.py new file mode 100644 index 0000000000000000000000000000000000000000..9874202d379eef0ec9b9deeb9d3671ccddaabac2 --- /dev/null +++ b/Tools/peg_generator/scripts/download_pypi_packages.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3.8 + +import argparse +import os +import json + +from typing import Dict, Any +from urllib.request import urlretrieve + +argparser = argparse.ArgumentParser( + prog="download_pypi_packages", description="Helper program to download PyPI packages", +) +argparser.add_argument( + "-n", "--number", type=int, default=100, help="Number of packages to download" +) +argparser.add_argument( + "-a", "--all", action="store_true", help="Download all packages listed in the json file" +) + + +def load_json(filename: str) -> Dict[Any, Any]: + with open(os.path.join("data", f"{filename}.json"), "r") as f: + j = json.loads(f.read()) + return j + + +def remove_json(filename: str) -> None: + path = os.path.join("data", f"{filename}.json") + os.remove(path) + + +def download_package_json(package_name: str) -> None: + url = f"https://pypi.org/pypi/{package_name}/json" + urlretrieve(url, os.path.join("data", f"{package_name}.json")) + + +def download_package_code(name: str, package_json: Dict[Any, Any]) -> None: + source_index = -1 + for idx, url_info in enumerate(package_json["urls"]): + if url_info["python_version"] == "source": + source_index = idx + break + filename = package_json["urls"][source_index]["filename"] + url = package_json["urls"][source_index]["url"] + urlretrieve(url, os.path.join("data", "pypi", filename)) + + +def main() -> None: + args = argparser.parse_args() + number_packages = args.number + all_packages = args.all + + top_pypi_packages = load_json("top-pypi-packages-365-days") + if all_packages: + top_pypi_packages = top_pypi_packages["rows"] + elif number_packages >= 0 and number_packages <= 4000: + top_pypi_packages = top_pypi_packages["rows"][:number_packages] + else: + raise AssertionError("Unknown value for NUMBER_OF_PACKAGES") + + try: + os.mkdir(os.path.join("data", "pypi")) + except FileExistsError: + pass + + for package in top_pypi_packages: + package_name = package["project"] + + print(f"Downloading JSON Data for {package_name}... ", end="") + download_package_json(package_name) + print("Done") + + package_json = load_json(package_name) + try: + print(f"Dowloading and compressing package {package_name} ... ", end="") + download_package_code(package_name, package_json) + print("Done") + except (IndexError, KeyError): + print(f"Could not locate source for {package_name}") + continue + finally: + remove_json(package_name) + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/scripts/find_max_nesting.py b/Tools/peg_generator/scripts/find_max_nesting.py new file mode 100644 index 0000000000000000000000000000000000000000..f2fdd00bfb7cd21242778240065804cff130d184 --- /dev/null +++ b/Tools/peg_generator/scripts/find_max_nesting.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python3.8 +"""Find the maximum amount of nesting for an expression that can be parsed +without causing a parse error. + +Starting at the INITIAL_NESTING_DEPTH, an expression containing n parenthesis +around a 0 is generated then tested with both the C and Python parsers. We +continue incrementing the number of parenthesis by 10 until both parsers have +failed. As soon as a single parser fails, we stop testing that parser. + +The grammar file, initial nesting size, and amount by which the nested size is +incremented on each success can be controlled by changing the GRAMMAR_FILE, +INITIAL_NESTING_DEPTH, or NESTED_INCR_AMT variables. + +Usage: python -m scripts.find_max_nesting +""" +import sys + +from _peg_parser import parse_string + +GRAMMAR_FILE = "data/python.gram" +INITIAL_NESTING_DEPTH = 10 +NESTED_INCR_AMT = 10 + + +FAIL = "\033[91m" +ENDC = "\033[0m" + + +def check_nested_expr(nesting_depth: int) -> bool: + expr = f"{'(' * nesting_depth}0{')' * nesting_depth}" + + try: + parse_string(expr) + print(f"Nesting depth of {nesting_depth} is successful") + return True + except Exception as err: + print(f"{FAIL}(Failed with nesting depth of {nesting_depth}{ENDC}") + print(f"{FAIL}\t{err}{ENDC}") + return False + + +def main() -> None: + print(f"Testing {GRAMMAR_FILE} starting at nesting depth of {INITIAL_NESTING_DEPTH}...") + + nesting_depth = INITIAL_NESTING_DEPTH + succeeded = True + while succeeded: + expr = f"{'(' * nesting_depth}0{')' * nesting_depth}" + if succeeded: + succeeded = check_nested_expr(nesting_depth) + nesting_depth += NESTED_INCR_AMT + + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/scripts/grammar_grapher.py b/Tools/peg_generator/scripts/grammar_grapher.py new file mode 100644 index 0000000000000000000000000000000000000000..4afdbce8f966f2c7ca0b17820445c30124498ba6 --- /dev/null +++ b/Tools/peg_generator/scripts/grammar_grapher.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python3.8 + +""" Convert a grammar into a dot-file suitable for use with GraphViz + + For example: + Generate the GraphViz file: + # scripts/grammar_grapher.py data/python.gram > python.gv + + Then generate the graph... + + # twopi python.gv -Tpng > python_twopi.png + + or + + # dot python.gv -Tpng > python_dot.png + + NOTE: The _dot_ and _twopi_ tools seem to produce the most useful results. + The _circo_ tool is the worst of the bunch. Don't even bother. +""" + +import argparse +import sys + +from typing import Any, List + +sys.path.insert(0, ".") + +from pegen.build import build_parser +from pegen.grammar import ( + Alt, + Cut, + Grammar, + Group, + Leaf, + Lookahead, + Rule, + NameLeaf, + NamedItem, + Opt, + Repeat, + Rhs, +) + +argparser = argparse.ArgumentParser(prog="graph_grammar", description="Graph a grammar tree",) +argparser.add_argument( + "-s", + "--start", + choices=["exec", "eval", "single"], + default="exec", + help="Choose the grammar's start rule (exec, eval or single)", +) +argparser.add_argument("grammar_file", help="The grammar file to graph") + + +def references_for_item(item: Any) -> List[Any]: + if isinstance(item, Alt): + return [_ref for _item in item.items for _ref in references_for_item(_item)] + elif isinstance(item, Cut): + return [] + elif isinstance(item, Group): + return references_for_item(item.rhs) + elif isinstance(item, Lookahead): + return references_for_item(item.node) + elif isinstance(item, NamedItem): + return references_for_item(item.item) + + # NOTE NameLeaf must be before Leaf + elif isinstance(item, NameLeaf): + if item.value == "ENDMARKER": + return [] + return [item.value] + elif isinstance(item, Leaf): + return [] + + elif isinstance(item, Opt): + return references_for_item(item.node) + elif isinstance(item, Repeat): + return references_for_item(item.node) + elif isinstance(item, Rhs): + return [_ref for alt in item.alts for _ref in references_for_item(alt)] + elif isinstance(item, Rule): + return references_for_item(item.rhs) + else: + raise RuntimeError(f"Unknown item: {type(item)}") + + +def main() -> None: + args = argparser.parse_args() + + try: + grammar, parser, tokenizer = build_parser(args.grammar_file) + except Exception as err: + print("ERROR: Failed to parse grammar file", file=sys.stderr) + sys.exit(1) + + references = {} + for name, rule in grammar.rules.items(): + references[name] = set(references_for_item(rule)) + + # Flatten the start node if has only a single reference + root_node = {"exec": "file", "eval": "eval", "single": "interactive"}[args.start] + + print("digraph g1 {") + print('\toverlap="scale";') # Force twopi to scale the graph to avoid overlaps + print(f'\troot="{root_node}";') + print(f"\t{root_node} [color=green, shape=circle];") + for name, refs in references.items(): + for ref in refs: + print(f"\t{name} -> {ref};") + print("}") + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/scripts/joinstats.py b/Tools/peg_generator/scripts/joinstats.py new file mode 100644 index 0000000000000000000000000000000000000000..b2d762b3d4286a47d030348a954551880a1b07ae --- /dev/null +++ b/Tools/peg_generator/scripts/joinstats.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3.8 + +"""Produce a report about the most-memoable types. + +Reads a list of statistics from stdin. Each line must be two numbers, +being a type and a count. We then read some other files and produce a +list sorted by most frequent type. + +There should also be something to recognize left-recursive rules. +""" + +import os +import re +import sys + +from typing import Dict + +reporoot = os.path.dirname(os.path.dirname(__file__)) +parse_c = os.path.join(reporoot, "peg_extension", "parse.c") + + +class TypeMapper: + """State used to map types to names.""" + + def __init__(self, filename: str) -> None: + self.table: Dict[int, str] = {} + with open(filename) as f: + for line in f: + match = re.match(r"#define (\w+)_type (\d+)", line) + if match: + name, type = match.groups() + if "left" in line.lower(): + name += " // Left-recursive" + self.table[int(type)] = name + + def lookup(self, type: int) -> str: + return self.table.get(type, str(type)) + + +def main() -> None: + mapper = TypeMapper(parse_c) + table = [] + filename = sys.argv[1] + with open(filename) as f: + for lineno, line in enumerate(f, 1): + line = line.strip() + if not line or line.startswith("#"): + continue + parts = line.split() + # Extra fields ignored + if len(parts) < 2: + print(f"{lineno}: bad input ({line!r})") + continue + try: + type, count = map(int, parts[:2]) + except ValueError as err: + print(f"{lineno}: non-integer input ({line!r})") + continue + table.append((type, count)) + table.sort(key=lambda values: -values[1]) + for type, count in table: + print(f"{type:4d} {count:9d} {mapper.lookup(type)}") + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/scripts/show_parse.py b/Tools/peg_generator/scripts/show_parse.py new file mode 100644 index 0000000000000000000000000000000000000000..b4ee5a1b357f74eb5a22b2373c97bd62e6cb84c8 --- /dev/null +++ b/Tools/peg_generator/scripts/show_parse.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python3.8 + +"""Show the parse tree for a given program, nicely formatted. + +Example: + +$ scripts/show_parse.py a+b +Module( + body=[ + Expr( + value=BinOp( + left=Name(id="a", ctx=Load()), op=Add(), right=Name(id="b", ctx=Load()) + ) + ) + ], + type_ignores=[], +) +$ + +Use -v to show line numbers and column offsets. + +The formatting is done using black. You can also import this module +and call one of its functions. +""" + +import argparse +import ast +import difflib +import os +import sys +import tempfile + +import _peg_parser + +from typing import List + +sys.path.insert(0, os.getcwd()) +from pegen.ast_dump import ast_dump + +parser = argparse.ArgumentParser() +parser.add_argument( + "-d", "--diff", action="store_true", help="show diff between grammar and ast (requires -g)" +) +parser.add_argument( + "-p", + "--parser", + choices=["new", "old"], + default="new", + help="choose the parser to use" +) +parser.add_argument( + "-m", + "--multiline", + action="store_true", + help="concatenate program arguments using newline instead of space", +) +parser.add_argument("-v", "--verbose", action="store_true", help="show line/column numbers") +parser.add_argument("program", nargs="+", help="program to parse (will be concatenated)") + + +def format_tree(tree: ast.AST, verbose: bool = False) -> str: + with tempfile.NamedTemporaryFile("w+") as tf: + tf.write(ast_dump(tree, include_attributes=verbose)) + tf.write("\n") + tf.flush() + cmd = f"black -q {tf.name}" + sts = os.system(cmd) + if sts: + raise RuntimeError(f"Command {cmd!r} failed with status 0x{sts:x}") + tf.seek(0) + return tf.read() + + +def diff_trees(a: ast.AST, b: ast.AST, verbose: bool = False) -> List[str]: + sa = format_tree(a, verbose) + sb = format_tree(b, verbose) + la = sa.splitlines() + lb = sb.splitlines() + return list(difflib.unified_diff(la, lb, "a", "b", lineterm="")) + + +def show_parse(source: str, verbose: bool = False) -> str: + tree = _peg_parser.parse_string(source, oldparser=True) + return format_tree(tree, verbose).rstrip("\n") + + +def print_parse(source: str, verbose: bool = False) -> None: + print(show_parse(source, verbose)) + + +def main() -> None: + args = parser.parse_args() + new_parser = args.parser == "new" + if args.multiline: + sep = "\n" + else: + sep = " " + program = sep.join(args.program) + if new_parser: + tree = _peg_parser.parse_string(program) + + if args.diff: + a = _peg_parser.parse_string(program, oldparser=True) + b = tree + diff = diff_trees(a, b, args.verbose) + if diff: + for line in diff: + print(line) + else: + print("# Trees are the same") + else: + print("# Parsed using the new parser") + print(format_tree(tree, args.verbose)) + else: + tree = _peg_parser.parse_string(program, oldparser=True) + print("# Parsed using the old parser") + print(format_tree(tree, args.verbose)) + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/scripts/test_parse_directory.py b/Tools/peg_generator/scripts/test_parse_directory.py new file mode 100644 index 0000000000000000000000000000000000000000..6dfdbb9170e6e7b87043023c936a8c01970d9f50 --- /dev/null +++ b/Tools/peg_generator/scripts/test_parse_directory.py @@ -0,0 +1,254 @@ +#!/usr/bin/env python3.8 + +import argparse +import ast +import os +import sys +import time +import tokenize +import _peg_parser +from glob import glob, escape +from pathlib import PurePath + +from typing import List, Optional, Any, Tuple + +sys.path.insert(0, os.getcwd()) +from pegen.ast_dump import ast_dump +from pegen.testutil import print_memstats +from scripts import show_parse + +SUCCESS = "\033[92m" +FAIL = "\033[91m" +ENDC = "\033[0m" + +COMPILE = 2 +PARSE = 1 +NOTREE = 0 + +argparser = argparse.ArgumentParser( + prog="test_parse_directory", + description="Helper program to test directories or files for pegen", +) +argparser.add_argument("-d", "--directory", help="Directory path containing files to test") +argparser.add_argument( + "-e", "--exclude", action="append", default=[], help="Glob(s) for matching files to exclude" +) +argparser.add_argument( + "-s", "--short", action="store_true", help="Only show errors, in a more Emacs-friendly format" +) +argparser.add_argument( + "-v", "--verbose", action="store_true", help="Display detailed errors for failures" +) +argparser.add_argument( + "-t", "--tree", action="count", help="Compare parse tree to official AST", default=0 +) + + +def report_status( + succeeded: bool, + file: str, + verbose: bool, + error: Optional[Exception] = None, + short: bool = False, +) -> None: + if short and succeeded: + return + + if succeeded is True: + status = "OK" + COLOR = SUCCESS + else: + status = "Fail" + COLOR = FAIL + + if short: + lineno = 0 + offset = 0 + if isinstance(error, SyntaxError): + lineno = error.lineno or 1 + offset = error.offset or 1 + message = error.args[0] + else: + message = f"{error.__class__.__name__}: {error}" + print(f"{file}:{lineno}:{offset}: {message}") + else: + print(f"{COLOR}{file:60} {status}{ENDC}") + + if error and verbose: + print(f" {str(error.__class__.__name__)}: {error}") + + +def compare_trees( + actual_tree: ast.AST, file: str, verbose: bool, include_attributes: bool = False, +) -> int: + with open(file) as f: + expected_tree = _peg_parser.parse_string(f.read(), oldparser=True) + + expected_text = ast_dump(expected_tree, include_attributes=include_attributes) + actual_text = ast_dump(actual_tree, include_attributes=include_attributes) + if actual_text == expected_text: + if verbose: + print("Tree for {file}:") + print(show_parse.format_tree(actual_tree, include_attributes)) + return 0 + + print(f"Diffing ASTs for {file} ...") + + expected = show_parse.format_tree(expected_tree, include_attributes) + actual = show_parse.format_tree(actual_tree, include_attributes) + + if verbose: + print("Expected for {file}:") + print(expected) + print("Actual for {file}:") + print(actual) + print(f"Diff for {file}:") + + diff = show_parse.diff_trees(expected_tree, actual_tree, include_attributes) + for line in diff: + print(line) + + return 1 + + +def parse_file(source: str, file: str, mode: int, oldparser: bool) -> Tuple[Any, float]: + t0 = time.time() + if mode == COMPILE: + result = _peg_parser.compile_string( + source, + filename=file, + oldparser=oldparser, + ) + else: + result = _peg_parser.parse_string( + source, + filename=file, + oldparser=oldparser, + ast=(mode == PARSE), + ) + t1 = time.time() + return result, t1 - t0 + + +def is_parsing_failure(source: str) -> bool: + try: + _peg_parser.parse_string(source, mode="exec", oldparser=True) + except SyntaxError: + return False + return True + + +def generate_time_stats(files, total_seconds) -> None: + total_files = len(files) + total_bytes = 0 + total_lines = 0 + for file in files: + # Count lines and bytes separately + with open(file, "rb") as f: + total_lines += sum(1 for _ in f) + total_bytes += f.tell() + + print( + f"Checked {total_files:,} files, {total_lines:,} lines,", + f"{total_bytes:,} bytes in {total_seconds:,.3f} seconds.", + ) + if total_seconds > 0: + print( + f"That's {total_lines / total_seconds :,.0f} lines/sec,", + f"or {total_bytes / total_seconds :,.0f} bytes/sec.", + ) + + +def parse_directory( + directory: str, + verbose: bool, + excluded_files: List[str], + tree_arg: int, + short: bool, + mode: int, + oldparser: bool, +) -> int: + if tree_arg: + assert mode == PARSE, "Mode should be 1 (parse), when comparing the generated trees" + + if oldparser and tree_arg: + print("Cannot specify tree argument with the cpython parser.", file=sys.stderr) + return 1 + + # For a given directory, traverse files and attempt to parse each one + # - Output success/failure for each file + errors = 0 + files = [] + trees = {} # Trees to compare (after everything else is done) + total_seconds = 0 + + for file in sorted(glob(os.path.join(escape(directory), f"**/*.py"), recursive=True)): + # Only attempt to parse Python files and files that are not excluded + if any(PurePath(file).match(pattern) for pattern in excluded_files): + continue + + with tokenize.open(file) as f: + source = f.read() + + try: + result, dt = parse_file(source, file, mode, oldparser) + total_seconds += dt + if tree_arg: + trees[file] = result + report_status(succeeded=True, file=file, verbose=verbose, short=short) + except SyntaxError as error: + if is_parsing_failure(source): + print(f"File {file} cannot be parsed by either parser.") + else: + report_status( + succeeded=False, file=file, verbose=verbose, error=error, short=short + ) + errors += 1 + files.append(file) + + t1 = time.time() + + generate_time_stats(files, total_seconds) + if short: + print_memstats() + + if errors: + print(f"Encountered {errors} failures.", file=sys.stderr) + + # Compare trees (the dict is empty unless -t is given) + compare_trees_errors = 0 + for file, tree in trees.items(): + if not short: + print("Comparing ASTs for", file) + if compare_trees(tree, file, verbose, tree_arg >= 2) == 1: + compare_trees_errors += 1 + + if errors or compare_trees_errors: + return 1 + + return 0 + + +def main() -> None: + args = argparser.parse_args() + directory = args.directory + verbose = args.verbose + excluded_files = args.exclude + tree = args.tree + short = args.short + mode = 1 if args.tree else 2 + sys.exit( + parse_directory( + directory, + verbose, + excluded_files, + tree, + short, + mode, + oldparser=False, + ) + ) + + +if __name__ == "__main__": + main() diff --git a/Tools/peg_generator/scripts/test_pypi_packages.py b/Tools/peg_generator/scripts/test_pypi_packages.py new file mode 100644 index 0000000000000000000000000000000000000000..f014753b3cd23e7975842022c81d1673835729ee --- /dev/null +++ b/Tools/peg_generator/scripts/test_pypi_packages.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3.8 + +import argparse +import os +import glob +import tarfile +import zipfile +import shutil +import pathlib +import sys + +from typing import Generator, Any + +sys.path.insert(0, ".") + +from pegen import build +from scripts import test_parse_directory + +HERE = pathlib.Path(__file__).resolve().parent + +argparser = argparse.ArgumentParser( + prog="test_pypi_packages", description="Helper program to test parsing PyPI packages", +) +argparser.add_argument( + "-t", "--tree", action="count", help="Compare parse tree to official AST", default=0 +) + + +def get_packages() -> Generator[str, None, None]: + all_packages = ( + glob.glob("./data/pypi/*.tar.gz") + + glob.glob("./data/pypi/*.zip") + + glob.glob("./data/pypi/*.tgz") + ) + for package in all_packages: + yield package + + +def extract_files(filename: str) -> None: + savedir = os.path.join("data", "pypi") + if tarfile.is_tarfile(filename): + tarfile.open(filename).extractall(savedir) + elif zipfile.is_zipfile(filename): + zipfile.ZipFile(filename).extractall(savedir) + else: + raise ValueError(f"Could not identify type of compressed file {filename}") + + +def find_dirname(package_name: str) -> str: + for name in os.listdir(os.path.join("data", "pypi")): + full_path = os.path.join("data", "pypi", name) + if os.path.isdir(full_path) and name in package_name: + return full_path + assert False # This is to fix mypy, should never be reached + + +def run_tests(dirname: str, tree: int) -> int: + return test_parse_directory.parse_directory( + dirname, + verbose=False, + excluded_files=[], + tree_arg=tree, + short=True, + mode=1 if tree else 0, + parser="pegen", + ) + + +def main() -> None: + args = argparser.parse_args() + tree = args.tree + + for package in get_packages(): + print(f"Extracting files from {package}... ", end="") + try: + extract_files(package) + print("Done") + except ValueError as e: + print(e) + continue + + print(f"Trying to parse all python files ... ") + dirname = find_dirname(package) + status = run_tests(dirname, tree) + if status == 0: + shutil.rmtree(dirname) + else: + print(f"Failed to parse {dirname}") + + +if __name__ == "__main__": + main() diff --git a/Tools/pynche/PyncheWidget.py b/Tools/pynche/PyncheWidget.py index 364f22b0b2095c078c7a4fd8c2ca30a647c9cb6c..ea456e577e12a991a265ed0df98adcffc2940afa 100644 --- a/Tools/pynche/PyncheWidget.py +++ b/Tools/pynche/PyncheWidget.py @@ -36,15 +36,11 @@ def __init__(self, version, switchboard, master=None, extrapath=[]): else: # Is there already a default root for Tk, say because we're # running under Guido's IDE? :-) Two conditions say no, either the - # import fails or _default_root is None. - tkroot = None - try: - from Tkinter import _default_root - tkroot = self.__tkroot = _default_root - except ImportError: - pass + # _default_root is None or it is unset. + tkroot = getattr(tkinter, '_default_root', None) if not tkroot: - tkroot = self.__tkroot = Tk(className='Pynche') + tkroot = Tk(className='Pynche') + self.__tkroot = tkroot # but this isn't our top level widget, so make it invisible tkroot.withdraw() # create the menubar @@ -281,10 +277,14 @@ def popup(self, event=None): self.__window.deiconify() def __eq__(self, other): - return self.__menutext == other.__menutext + if isinstance(self, PopupViewer): + return self.__menutext == other.__menutext + return NotImplemented def __lt__(self, other): - return self.__menutext < other.__menutext + if isinstance(self, PopupViewer): + return self.__menutext < other.__menutext + return NotImplemented def make_view_popups(switchboard, root, extrapath): diff --git a/Tools/pynche/StripViewer.py b/Tools/pynche/StripViewer.py index 2b0ede39eeeff55cbb2b21f40ca75c9254a6c45d..6914ca94b2bd36947a2b1128fe173fd63fdf0655 100644 --- a/Tools/pynche/StripViewer.py +++ b/Tools/pynche/StripViewer.py @@ -371,22 +371,6 @@ def __init__(self, switchboard, master=None): command=self.__togglehex) hexbtn.grid(row=1, column=1, sticky=W) - # XXX: ignore this feature for now; it doesn't work quite right yet - -## gentypevar = self.__gentypevar = IntVar() -## self.__variations = Radiobutton(frame, -## text='Variations', -## variable=gentypevar, -## value=0, -## command=self.__togglegentype) -## self.__variations.grid(row=0, column=1, sticky=W) -## self.__constants = Radiobutton(frame, -## text='Constants', -## variable=gentypevar, -## value=1, -## command=self.__togglegentype) -## self.__constants.grid(row=1, column=1, sticky=W) - # create the white button whitebtn = Button(frame2, text='White', @@ -402,26 +386,6 @@ def __togglehex(self, event=None): red, green, blue = self.__sb.current_rgb() self.update_yourself(red, green, blue) -## def __togglegentype(self, event=None): -## which = self.__gentypevar.get() -## if which == 0: -## self.__reds.set(label='Red Variations', -## generator=constant_cyan_generator) -## self.__greens.set(label='Green Variations', -## generator=constant_magenta_generator) -## self.__blues.set(label='Blue Variations', -## generator=constant_yellow_generator) -## elif which == 1: -## self.__reds.set(label='Red Constant', -## generator=constant_red_generator) -## self.__greens.set(label='Green Constant', -## generator=constant_green_generator) -## self.__blues.set(label='Blue Constant', -## generator=constant_blue_generator) -## else: -## assert 0 -## self.__sb.update_views_current() - def __toblack(self, event=None): self.__sb.update_views(0, 0, 0) diff --git a/Tools/scripts/README b/Tools/scripts/README index d4ac2ade25ef8491ccb2543291e12b5c56cfd89d..7fc51a10ee902c0db6635034f028f7d28236abe0 100644 --- a/Tools/scripts/README +++ b/Tools/scripts/README @@ -7,7 +7,6 @@ abitype.py Converts a C file to use the PEP 384 type definition A analyze_dxp.py Analyzes the result of sys.getdxp() byext.py Print lines/words/chars stats of files by extension byteyears.py Print product of a file's size and age -checkpyc.py Check presence and validity of ".pyc" files cleanfuture.py Fix redundant Python __future__ statements combinerefs.py A helper for analyzing PYTHONDUMPREFS output copytime.py Copy one file's atime and mtime to another @@ -30,7 +29,6 @@ ftpmirror.py FTP mirror script get-remote-certificate.py Fetch the certificate that the server(s) are providing in PEM form google.py Open a webbrowser with Google gprof2html.py Transform gprof(1) output into useful HTML -h2py.py Translate #define's into Python assignments highlight.py Python syntax highlighting with HTML output idle3 Main program to start IDLE ifdef.py Remove #if(n)def groups from C sources diff --git a/Tools/scripts/checkpyc.py b/Tools/scripts/checkpyc.py deleted file mode 100755 index bbaa3d1328fe52f2960a78a1fda10ddae104950d..0000000000000000000000000000000000000000 --- a/Tools/scripts/checkpyc.py +++ /dev/null @@ -1,69 +0,0 @@ -#! /usr/bin/env python3 -# Check that all ".pyc" files exist and are up-to-date -# Uses module 'os' - -import sys -import os -from stat import ST_MTIME -import importlib.util - -# PEP 3147 compatibility (PYC Repository Directories) -cache_from_source = (importlib.util.cache_from_source if sys.implementation.cache_tag - else lambda path: path + 'c') - - -def main(): - if len(sys.argv) > 1: - verbose = (sys.argv[1] == '-v') - silent = (sys.argv[1] == '-s') - else: - verbose = silent = False - MAGIC = importlib.util.MAGIC_NUMBER - if not silent: - print('Using MAGIC word', repr(MAGIC)) - for dirname in sys.path: - try: - names = os.listdir(dirname) - except OSError: - print('Cannot list directory', repr(dirname)) - continue - if not silent: - print('Checking ', repr(dirname), '...') - for name in sorted(names): - if name.endswith('.py'): - name = os.path.join(dirname, name) - try: - st = os.stat(name) - except OSError: - print('Cannot stat', repr(name)) - continue - if verbose: - print('Check', repr(name), '...') - name_c = cache_from_source(name) - try: - with open(name_c, 'rb') as f: - magic_str = f.read(4) - mtime_str = f.read(4) - except IOError: - print('Cannot open', repr(name_c)) - continue - if magic_str != MAGIC: - print('Bad MAGIC word in ".pyc" file', end=' ') - print(repr(name_c)) - continue - mtime = get_long(mtime_str) - if mtime in {0, -1}: - print('Bad ".pyc" file', repr(name_c)) - elif mtime != st[ST_MTIME]: - print('Out-of-date ".pyc" file', end=' ') - print(repr(name_c)) - - -def get_long(s): - if len(s) != 4: - return -1 - return s[0] + (s[1] << 8) + (s[2] << 16) + (s[3] << 24) - - -if __name__ == '__main__': - main() diff --git a/Tools/scripts/generate_opcode_h.py b/Tools/scripts/generate_opcode_h.py index b184ffa17093426827f882e3294912fccee150bd..873f82156e217bf25038c45ac2d3534144de267f 100644 --- a/Tools/scripts/generate_opcode_h.py +++ b/Tools/scripts/generate_opcode_h.py @@ -22,11 +22,6 @@ remaining private.*/ #define EXCEPT_HANDLER 257 - -enum cmp_op {PyCmp_LT=Py_LT, PyCmp_LE=Py_LE, PyCmp_EQ=Py_EQ, PyCmp_NE=Py_NE, - PyCmp_GT=Py_GT, PyCmp_GE=Py_GE, PyCmp_IN, PyCmp_NOT_IN, - PyCmp_IS, PyCmp_IS_NOT, PyCmp_EXC_MATCH, PyCmp_BAD}; - #define HAS_ARG(op) ((op) >= HAVE_ARGUMENT) #ifdef __cplusplus diff --git a/Tools/scripts/generate_token.py b/Tools/scripts/generate_token.py index f2745e8353fc3777da8240da850ea8605fc4daad..77bb5bd5eca02c1dc5482eb7319559d113d38cc3 100644 --- a/Tools/scripts/generate_token.py +++ b/Tools/scripts/generate_token.py @@ -69,6 +69,10 @@ def update_file(file, content): #define ISTERMINAL(x) ((x) < NT_OFFSET) #define ISNONTERMINAL(x) ((x) >= NT_OFFSET) #define ISEOF(x) ((x) == ENDMARKER) +#define ISWHITESPACE(x) ((x) == ENDMARKER || \\ + (x) == NEWLINE || \\ + (x) == INDENT || \\ + (x) == DEDENT) PyAPI_DATA(const char * const) _PyParser_TokenNames[]; /* Token names */ diff --git a/Tools/scripts/h2py.py b/Tools/scripts/h2py.py deleted file mode 100755 index ea37c04d4c56ca36ca420c76c64d206d68064cf3..0000000000000000000000000000000000000000 --- a/Tools/scripts/h2py.py +++ /dev/null @@ -1,171 +0,0 @@ -#! /usr/bin/env python3 - -# Read #define's and translate to Python code. -# Handle #include statements. -# Handle #define macros with one argument. -# Anything that isn't recognized or doesn't translate into valid -# Python is ignored. - -# Without filename arguments, acts as a filter. -# If one or more filenames are given, output is written to corresponding -# filenames in the local directory, translated to all uppercase, with -# the extension replaced by ".py". - -# By passing one or more options of the form "-i regular_expression" -# you can specify additional strings to be ignored. This is useful -# e.g. to ignore casts to u_long: simply specify "-i '(u_long)'". - -# XXX To do: -# - turn trailing C comments into Python comments -# - turn C Boolean operators "&& || !" into Python "and or not" -# - what to do about #if(def)? -# - what to do about macros with multiple parameters? - -import sys, re, getopt, os - -p_define = re.compile(r'^[\t ]*#[\t ]*define[\t ]+([a-zA-Z0-9_]+)[\t ]+') - -p_macro = re.compile( - r'^[\t ]*#[\t ]*define[\t ]+' - r'([a-zA-Z0-9_]+)\(([_a-zA-Z][_a-zA-Z0-9]*)\)[\t ]+') - -p_include = re.compile(r'^[\t ]*#[\t ]*include[\t ]+<([^>\n]+)>') - -p_comment = re.compile(r'/\*([^*]+|\*+[^/])*(\*+/)?') -p_cpp_comment = re.compile('//.*') - -ignores = [p_comment, p_cpp_comment] - -p_char = re.compile(r"'(\\.[^\\]*|[^\\])'") - -p_hex = re.compile(r"0x([0-9a-fA-F]+)L?") - -filedict = {} -importable = {} - -try: - searchdirs=os.environ['include'].split(';') -except KeyError: - try: - searchdirs=os.environ['INCLUDE'].split(';') - except KeyError: - searchdirs=['/usr/include'] - try: - searchdirs.insert(0, os.path.join('/usr/include', - os.environ['MULTIARCH'])) - except KeyError: - pass - -def main(): - global filedict - opts, args = getopt.getopt(sys.argv[1:], 'i:') - for o, a in opts: - if o == '-i': - ignores.append(re.compile(a)) - if not args: - args = ['-'] - for filename in args: - if filename == '-': - sys.stdout.write('# Generated by h2py from stdin\n') - process(sys.stdin, sys.stdout) - else: - with open(filename) as fp: - outfile = os.path.basename(filename) - i = outfile.rfind('.') - if i > 0: outfile = outfile[:i] - modname = outfile.upper() - outfile = modname + '.py' - with open(outfile, 'w') as outfp: - outfp.write('# Generated by h2py from %s\n' % filename) - filedict = {} - for dir in searchdirs: - if filename[:len(dir)] == dir: - filedict[filename[len(dir)+1:]] = None # no '/' trailing - importable[filename[len(dir)+1:]] = modname - break - process(fp, outfp) - -def pytify(body): - # replace ignored patterns by spaces - for p in ignores: - body = p.sub(' ', body) - # replace char literals by ord(...) - body = p_char.sub("ord('\\1')", body) - # Compute negative hexadecimal constants - start = 0 - UMAX = 2*(sys.maxsize+1) - while 1: - m = p_hex.search(body, start) - if not m: break - s,e = m.span() - val = int(body[slice(*m.span(1))], 16) - if val > sys.maxsize: - val -= UMAX - body = body[:s] + "(" + str(val) + ")" + body[e:] - start = s + 1 - return body - -def process(fp, outfp, env = {}): - lineno = 0 - while 1: - line = fp.readline() - if not line: break - lineno = lineno + 1 - match = p_define.match(line) - if match: - # gobble up continuation lines - while line[-2:] == '\\\n': - nextline = fp.readline() - if not nextline: break - lineno = lineno + 1 - line = line + nextline - name = match.group(1) - body = line[match.end():] - body = pytify(body) - ok = 0 - stmt = '%s = %s\n' % (name, body.strip()) - try: - exec(stmt, env) - except: - sys.stderr.write('Skipping: %s' % stmt) - else: - outfp.write(stmt) - match = p_macro.match(line) - if match: - macro, arg = match.group(1, 2) - body = line[match.end():] - body = pytify(body) - stmt = 'def %s(%s): return %s\n' % (macro, arg, body) - try: - exec(stmt, env) - except: - sys.stderr.write('Skipping: %s' % stmt) - else: - outfp.write(stmt) - match = p_include.match(line) - if match: - regs = match.regs - a, b = regs[1] - filename = line[a:b] - if filename in importable: - outfp.write('from %s import *\n' % importable[filename]) - elif filename not in filedict: - filedict[filename] = None - inclfp = None - for dir in searchdirs: - try: - inclfp = open(dir + '/' + filename) - break - except IOError: - pass - if inclfp: - with inclfp: - outfp.write( - '\n# Included from %s\n' % filename) - process(inclfp, outfp, env) - else: - sys.stderr.write('Warning - could not find file %s\n' % - filename) - -if __name__ == '__main__': - main() diff --git a/Tools/scripts/run_tests.py b/Tools/scripts/run_tests.py index 3c1c3bd060bff87e163b411253a178c9a87fafa4..bcfa5e943b347d59c035278b1c473eb37bc7a96d 100644 --- a/Tools/scripts/run_tests.py +++ b/Tools/scripts/run_tests.py @@ -25,8 +25,10 @@ def main(regrtest_args): '-u', # Unbuffered stdout and stderr '-W', 'default', # Warnings set to 'default' '-bb', # Warnings about bytes/bytearray - '-E', # Ignore environment variables ] + if 'PYTHONOLDPARSER' not in os.environ: + args.append('-E') # Ignore environment variables + # Allow user-specified interpreter options to override our defaults. args.extend(test.support.args_from_interpreter_flags()) diff --git a/Tools/scripts/which.py b/Tools/scripts/which.py index df54ce032cbc8d42ffa791d005a7ba1f2eafa0c8..b42e07c74ecac838f9bdcea088fb680e962aac1a 100755 --- a/Tools/scripts/which.py +++ b/Tools/scripts/which.py @@ -49,6 +49,7 @@ def main(): msg(filename + ': not executable') if longlist: sts = os.system('ls ' + longlist + ' ' + filename) + sts = os.waitstatus_to_exitcode(sts) if sts: msg('"ls -l" exit status: ' + repr(sts)) if not ident: msg(prog + ': not found') diff --git a/Tools/ssl/make_ssl_data.py b/Tools/ssl/make_ssl_data.py index c39e38c5069d58715908f35a81c8a0b5f3e31340..1dc234f5232b132ccda3d7a5d636de636ac958a6 100755 --- a/Tools/ssl/make_ssl_data.py +++ b/Tools/ssl/make_ssl_data.py @@ -2,7 +2,7 @@ """ This script should be called *manually* when we want to upgrade SSLError -`library` and `reason` mnemnonics to a more recent OpenSSL version. +`library` and `reason` mnemonics to a more recent OpenSSL version. It takes two arguments: - the path to the OpenSSL source tree (e.g. git checkout) diff --git a/Tools/unicode/genmap_japanese.py b/Tools/unicode/genmap_japanese.py new file mode 100644 index 0000000000000000000000000000000000000000..21de37b62bced0b2fc571b1e427f64bafee180f3 --- /dev/null +++ b/Tools/unicode/genmap_japanese.py @@ -0,0 +1,251 @@ +# +# genmap_ja_codecs.py: Japanese Codecs Map Generator +# +# Original Author: Hye-Shik Chang +# Modified Author: Dong-hee Na +# +import os + +from genmap_support import * + +JISX0208_C1 = (0x21, 0x74) +JISX0208_C2 = (0x21, 0x7e) +JISX0212_C1 = (0x22, 0x6d) +JISX0212_C2 = (0x21, 0x7e) +JISX0213_C1 = (0x21, 0x7e) +JISX0213_C2 = (0x21, 0x7e) +CP932P0_C1 = (0x81, 0x81) # patches between shift-jis and cp932 +CP932P0_C2 = (0x5f, 0xca) +CP932P1_C1 = (0x87, 0x87) # CP932 P1 +CP932P1_C2 = (0x40, 0x9c) +CP932P2_C1 = (0xed, 0xfc) # CP932 P2 +CP932P2_C2 = (0x40, 0xfc) + +MAPPINGS_JIS0208 = 'http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0208.TXT' +MAPPINGS_JIS0212 = 'http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0212.TXT' +MAPPINGS_CP932 = 'http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT' +MAPPINGS_JISX0213_2004 = 'http://wakaba-web.hp.infoseek.co.jp/table/jisx0213-2004-std.txt' + + +def loadmap_jisx0213(fo): + decmap3, decmap4 = {}, {} # maps to BMP for level 3 and 4 + decmap3_2, decmap4_2 = {}, {} # maps to U+2xxxx for level 3 and 4 + decmap3_pair = {} # maps to BMP-pair for level 3 + for line in fo: + line = line.split('#', 1)[0].strip() + if not line or len(line.split()) < 2: + continue + + row = line.split() + loc = eval('0x' + row[0][2:]) + level = eval(row[0][0]) + m = None + if len(row[1].split('+')) == 2: # single unicode + uni = eval('0x' + row[1][2:]) + if level == 3: + if uni < 0x10000: + m = decmap3 + elif 0x20000 <= uni < 0x30000: + uni -= 0x20000 + m = decmap3_2 + elif level == 4: + if uni < 0x10000: + m = decmap4 + elif 0x20000 <= uni < 0x30000: + uni -= 0x20000 + m = decmap4_2 + m.setdefault((loc >> 8), {}) + m[(loc >> 8)][(loc & 0xff)] = uni + else: # pair + uniprefix = eval('0x' + row[1][2:6]) # body + uni = eval('0x' + row[1][7:11]) # modifier + if level != 3: + raise ValueError("invalid map") + decmap3_pair.setdefault(uniprefix, {}) + m = decmap3_pair[uniprefix] + + if m is None: + raise ValueError("invalid map") + m.setdefault((loc >> 8), {}) + m[(loc >> 8)][(loc & 0xff)] = uni + + return decmap3, decmap4, decmap3_2, decmap4_2, decmap3_pair + + +def main(): + jisx0208file = open_mapping_file('python-mappings/JIS0208.TXT', MAPPINGS_JIS0208) + jisx0212file = open_mapping_file('python-mappings/JIS0212.TXT', MAPPINGS_JIS0212) + cp932file = open_mapping_file('python-mappings/CP932.TXT', MAPPINGS_CP932) + jisx0213file = open_mapping_file('python-mappings/jisx0213-2004-std.txt', MAPPINGS_JISX0213_2004) + + print("Loading Mapping File...") + + sjisdecmap = loadmap(jisx0208file, natcol=0, unicol=2) + jisx0208decmap = loadmap(jisx0208file, natcol=1, unicol=2) + jisx0212decmap = loadmap(jisx0212file) + cp932decmap = loadmap(cp932file) + jis3decmap, jis4decmap, jis3_2_decmap, jis4_2_decmap, jis3_pairdecmap = loadmap_jisx0213(jisx0213file) + + if jis3decmap[0x21][0x24] != 0xff0c: + raise SystemExit('Please adjust your JIS X 0213 map using jisx0213-2000-std.txt.diff') + + sjisencmap, cp932encmap = {}, {} + jisx0208_0212encmap = {} + for c1, m in sjisdecmap.items(): + for c2, code in m.items(): + sjisencmap.setdefault(code >> 8, {}) + sjisencmap[code >> 8][code & 0xff] = c1 << 8 | c2 + for c1, m in cp932decmap.items(): + for c2, code in m.items(): + cp932encmap.setdefault(code >> 8, {}) + if (code & 0xff) not in cp932encmap[code >> 8]: + cp932encmap[code >> 8][code & 0xff] = c1 << 8 | c2 + for c1, m in cp932encmap.copy().items(): + for c2, code in m.copy().items(): + if c1 in sjisencmap and c2 in sjisencmap[c1] and sjisencmap[c1][c2] == code: + del cp932encmap[c1][c2] + if not cp932encmap[c1]: + del cp932encmap[c1] + + jisx0213pairdecmap = {} + jisx0213pairencmap = [] + for unibody, m1 in jis3_pairdecmap.items(): + for c1, m2 in m1.items(): + for c2, modifier in m2.items(): + jisx0213pairencmap.append((unibody, modifier, c1 << 8 | c2)) + jisx0213pairdecmap.setdefault(c1, {}) + jisx0213pairdecmap[c1][c2] = unibody << 16 | modifier + + # Twinmap for both of JIS X 0208 (MSB unset) and JIS X 0212 (MSB set) + for c1, m in jisx0208decmap.items(): + for c2, code in m.items(): + jisx0208_0212encmap.setdefault(code >> 8, {}) + jisx0208_0212encmap[code >> 8][code & 0xff] = c1 << 8 | c2 + + for c1, m in jisx0212decmap.items(): + for c2, code in m.items(): + jisx0208_0212encmap.setdefault(code >> 8, {}) + if (code & 0xff) in jisx0208_0212encmap[code >> 8]: + print("OOPS!!!", (code)) + jisx0208_0212encmap[code >> 8][code & 0xff] = 0x8000 | c1 << 8 | c2 + + jisx0213bmpencmap = {} + for c1, m in jis3decmap.copy().items(): + for c2, code in m.copy().items(): + if c1 in jisx0208decmap and c2 in jisx0208decmap[c1]: + if code in jis3_pairdecmap: + jisx0213bmpencmap[code >> 8][code & 0xff] = (0,) # pair + jisx0213pairencmap.append((code, 0, c1 << 8 | c2)) + elif jisx0208decmap[c1][c2] == code: + del jis3decmap[c1][c2] + if not jis3decmap[c1]: + del jis3decmap[c1] + else: + raise ValueError("Difference between JIS X 0208 and JIS X 0213 Plane 1 is found.") + else: + jisx0213bmpencmap.setdefault(code >> 8, {}) + if code not in jis3_pairdecmap: + jisx0213bmpencmap[code >> 8][code & 0xff] = c1 << 8 | c2 + else: + jisx0213bmpencmap[code >> 8][code & 0xff] = (0,) # pair + jisx0213pairencmap.append((code, 0, c1 << 8 | c2)) + + for c1, m in jis4decmap.items(): + for c2, code in m.items(): + jisx0213bmpencmap.setdefault(code >> 8, {}) + jisx0213bmpencmap[code >> 8][code & 0xff] = 0x8000 | c1 << 8 | c2 + + jisx0213empencmap = {} + for c1, m in jis3_2_decmap.items(): + for c2, code in m.items(): + jisx0213empencmap.setdefault(code >> 8, {}) + jisx0213empencmap[code >> 8][code & 0xff] = c1 << 8 | c2 + for c1, m in jis4_2_decmap.items(): + for c2, code in m.items(): + jisx0213empencmap.setdefault(code >> 8, {}) + jisx0213empencmap[code >> 8][code & 0xff] = 0x8000 | c1 << 8 | c2 + + with open("mappings_jp.h", "w") as fp: + print_autogen(fp, os.path.basename(__file__)) + print("Generating JIS X 0208 decode map...") + writer = DecodeMapWriter(fp, "jisx0208", jisx0208decmap) + writer.update_decode_map(JISX0208_C1, JISX0208_C2) + writer.generate() + + print("Generating JIS X 0212 decode map...") + writer = DecodeMapWriter(fp, "jisx0212", jisx0212decmap) + writer.update_decode_map(JISX0212_C1, JISX0212_C2) + writer.generate() + + print("Generating JIS X 0208 && JIS X 0212 encode map...") + writer = EncodeMapWriter(fp, "jisxcommon", jisx0208_0212encmap) + writer.generate() + + print("Generating CP932 Extension decode map...") + writer = DecodeMapWriter(fp, "cp932ext", cp932decmap) + writer.update_decode_map(CP932P0_C1, CP932P0_C2) + writer.update_decode_map(CP932P1_C1, CP932P1_C2) + writer.update_decode_map(CP932P2_C1, CP932P2_C2) + writer.generate() + + print("Generating CP932 Extension encode map...") + writer = EncodeMapWriter(fp, "cp932ext", cp932encmap) + writer.generate() + + print("Generating JIS X 0213 Plane 1 BMP decode map...") + writer = DecodeMapWriter(fp, "jisx0213_1_bmp", jis3decmap) + writer.update_decode_map(JISX0213_C1, JISX0213_C2) + writer.generate() + + print("Generating JIS X 0213 Plane 2 BMP decode map...") + writer = DecodeMapWriter(fp, "jisx0213_2_bmp", jis4decmap) + writer.update_decode_map(JISX0213_C1, JISX0213_C2) + writer.generate() + + print("Generating JIS X 0213 BMP encode map...") + writer = EncodeMapWriter(fp, "jisx0213_bmp", jisx0213bmpencmap) + writer.generate() + + print("Generating JIS X 0213 Plane 1 EMP decode map...") + writer = DecodeMapWriter(fp, "jisx0213_1_emp", jis3_2_decmap) + writer.update_decode_map(JISX0213_C1, JISX0213_C2) + writer.generate() + + print("Generating JIS X 0213 Plane 2 EMP decode map...") + writer = DecodeMapWriter(fp, "jisx0213_2_emp", jis4_2_decmap) + writer.update_decode_map(JISX0213_C1, JISX0213_C2) + writer.generate() + + print("Generating JIS X 0213 EMP encode map...") + writer = EncodeMapWriter(fp, "jisx0213_emp", jisx0213empencmap) + writer.generate() + + with open('mappings_jisx0213_pair.h', 'w') as fp: + print_autogen(fp, os.path.basename(__file__)) + fp.write(f"#define JISX0213_ENCPAIRS {len(jisx0213pairencmap)}\n") + fp.write("""\ +#ifdef EXTERN_JISX0213_PAIR +static const struct widedbcs_index *jisx0213_pair_decmap; +static const struct pair_encodemap *jisx0213_pair_encmap; +#else +""") + + print("Generating JIS X 0213 unicode-pair decode map...") + writer = DecodeMapWriter(fp, "jisx0213_pair", jisx0213pairdecmap) + writer.update_decode_map(JISX0213_C1, JISX0213_C2) + writer.generate(wide=True) + + print("Generating JIS X 0213 unicode-pair encode map...") + jisx0213pairencmap.sort() + fp.write("static const struct pair_encodemap jisx0213_pair_encmap[JISX0213_ENCPAIRS] = {\n") + filler = BufferedFiller() + for body, modifier, jis in jisx0213pairencmap: + filler.write('{', '0x%04x%04x,' % (body, modifier), '0x%04x' % jis, '},') + filler.printout(fp) + fp.write("};\n") + fp.write("#endif\n") + + print("Done!") + +if __name__ == '__main__': + main() diff --git a/Tools/unicode/genmap_korean.py b/Tools/unicode/genmap_korean.py new file mode 100644 index 0000000000000000000000000000000000000000..4b94a6c43e5382423b7f23710676dcff19dbb5ce --- /dev/null +++ b/Tools/unicode/genmap_korean.py @@ -0,0 +1,62 @@ +# +# genmap_korean.py: Korean Codecs Map Generator +# +# Original Author: Hye-Shik Chang +# Modified Author: Dong-hee Na +# +import os + +from genmap_support import * + + +KSX1001_C1 = (0x21, 0x7e) +KSX1001_C2 = (0x21, 0x7e) +UHCL1_C1 = (0x81, 0xa0) +UHCL1_C2 = (0x41, 0xfe) +UHCL2_C1 = (0xa1, 0xfe) +UHCL2_C2 = (0x41, 0xa0) +MAPPINGS_CP949 = 'http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP949.TXT' + + +def main(): + mapfile = open_mapping_file('python-mappings/CP949.TXT', MAPPINGS_CP949) + print("Loading Mapping File...") + decmap = loadmap(mapfile) + uhcdecmap, ksx1001decmap, cp949encmap = {}, {}, {} + for c1, c2map in decmap.items(): + for c2, code in c2map.items(): + if c1 >= 0xa1 and c2 >= 0xa1: + ksx1001decmap.setdefault(c1 & 0x7f, {}) + ksx1001decmap[c1 & 0x7f][c2 & 0x7f] = c2map[c2] + cp949encmap.setdefault(code >> 8, {}) + cp949encmap[code >> 8][code & 0xFF] = (c1 << 8 | c2) & 0x7f7f + else: + # uhc + uhcdecmap.setdefault(c1, {}) + uhcdecmap[c1][c2] = c2map[c2] + cp949encmap.setdefault(code >> 8, {}) # MSB set + cp949encmap[code >> 8][code & 0xFF] = (c1 << 8 | c2) + + with open('mappings_kr.h', 'w') as fp: + print_autogen(fp, os.path.basename(__file__)) + + print("Generating KS X 1001 decode map...") + writer = DecodeMapWriter(fp, "ksx1001", ksx1001decmap) + writer.update_decode_map(KSX1001_C1, KSX1001_C2) + writer.generate() + + print("Generating UHC decode map...") + writer = DecodeMapWriter(fp, "cp949ext", uhcdecmap) + writer.update_decode_map(UHCL1_C1, UHCL1_C2) + writer.update_decode_map(UHCL2_C1, UHCL2_C2) + writer.generate() + + print("Generating CP949 (includes KS X 1001) encode map...") + writer = EncodeMapWriter(fp, "cp949", cp949encmap) + writer.generate() + + print("Done!") + + +if __name__ == '__main__': + main() diff --git a/Tools/unicode/genmap_schinese.py b/Tools/unicode/genmap_schinese.py new file mode 100644 index 0000000000000000000000000000000000000000..647c0333ed272840db5b14266231f0259f903d71 --- /dev/null +++ b/Tools/unicode/genmap_schinese.py @@ -0,0 +1,149 @@ +# +# genmap_schinese.py: Simplified Chinese Codecs Map Generator +# +# Original Author: Hye-Shik Chang +# Modified Author: Dong-hee Na +# +import os +import re + +from genmap_support import * + + +GB2312_C1 = (0x21, 0x7e) +GB2312_C2 = (0x21, 0x7e) +GBKL1_C1 = (0x81, 0xa8) +GBKL1_C2 = (0x40, 0xfe) +GBKL2_C1 = (0xa9, 0xfe) +GBKL2_C2 = (0x40, 0xa0) +GB18030EXTP1_C1 = (0xa1, 0xa9) +GB18030EXTP1_C2 = (0x40, 0xfe) +GB18030EXTP2_C1 = (0xaa, 0xaf) +GB18030EXTP2_C2 = (0xa1, 0xfe) +GB18030EXTP3_C1 = (0xd7, 0xd7) +GB18030EXTP3_C2 = (0xfa, 0xfe) +GB18030EXTP4_C1 = (0xf8, 0xfd) +GB18030EXTP4_C2 = (0xa1, 0xfe) +GB18030EXTP5_C1 = (0xfe, 0xfe) +GB18030EXTP5_C2 = (0x50, 0xfe) + +MAPPINGS_GB2312 = 'http://people.freebsd.org/~perky/i18n/GB2312.TXT' +MAPPINGS_CP936 = 'http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP936.TXT' +MAPPINGS_GB18030 = 'http://oss.software.ibm.com/cvs/icu/~checkout~/charset/data/xml/gb-18030-2000.xml' + +re_gb18030ass = re.compile('') + + +def parse_gb18030map(fo): + m, gbuni = {}, {} + for i in range(65536): + if i < 0xd800 or i > 0xdfff: # exclude unicode surrogate area + gbuni[i] = None + for uni, native in re_gb18030ass.findall(fo.read()): + uni = eval('0x'+uni) + native = [eval('0x'+u) for u in native.split()] + if len(native) <= 2: + del gbuni[uni] + if len(native) == 2: # we can decode algorithmically for 1 or 4 bytes + m.setdefault(native[0], {}) + m[native[0]][native[1]] = uni + gbuni = [k for k in gbuni.keys()] + gbuni.sort() + return m, gbuni + +def main(): + print("Loading Mapping File...") + gb2312map = open_mapping_file('python-mappings/GB2312.TXT', MAPPINGS_GB2312) + cp936map = open_mapping_file('python-mappings/CP936.TXT', MAPPINGS_CP936) + gb18030map = open_mapping_file('python-mappings/gb-18030-2000.xml', MAPPINGS_GB18030) + + gb18030decmap, gb18030unilinear = parse_gb18030map(gb18030map) + gbkdecmap = loadmap(cp936map) + gb2312decmap = loadmap(gb2312map) + difmap = {} + for c1, m in gbkdecmap.items(): + for c2, code in m.items(): + del gb18030decmap[c1][c2] + if not gb18030decmap[c1]: + del gb18030decmap[c1] + for c1, m in gb2312decmap.items(): + for c2, code in m.items(): + gbkc1, gbkc2 = c1 | 0x80, c2 | 0x80 + if gbkdecmap[gbkc1][gbkc2] == code: + del gbkdecmap[gbkc1][gbkc2] + if not gbkdecmap[gbkc1]: + del gbkdecmap[gbkc1] + + gb2312_gbkencmap, gb18030encmap = {}, {} + for c1, m in gbkdecmap.items(): + for c2, code in m.items(): + gb2312_gbkencmap.setdefault(code >> 8, {}) + gb2312_gbkencmap[code >> 8][code & 0xff] = c1 << 8 | c2 # MSB set + for c1, m in gb2312decmap.items(): + for c2, code in m.items(): + gb2312_gbkencmap.setdefault(code >> 8, {}) + gb2312_gbkencmap[code >> 8][code & 0xff] = c1 << 8 | c2 # MSB unset + for c1, m in gb18030decmap.items(): + for c2, code in m.items(): + gb18030encmap.setdefault(code >> 8, {}) + gb18030encmap[code >> 8][code & 0xff] = c1 << 8 | c2 + + with open('mappings_cn.h', 'w') as fp: + print_autogen(fp, os.path.basename(__file__)) + + print("Generating GB2312 decode map...") + writer = DecodeMapWriter(fp, "gb2312", gb2312decmap) + writer.update_decode_map(GB2312_C1, GB2312_C2) + writer.generate() + + print("Generating GBK decode map...") + writer = DecodeMapWriter(fp, "gbkext", gbkdecmap) + writer.update_decode_map(GBKL1_C1, GBKL1_C2) + writer.update_decode_map(GBKL2_C1, GBKL2_C2) + writer.generate() + + print("Generating GB2312 && GBK encode map...") + writer = EncodeMapWriter(fp, "gbcommon", gb2312_gbkencmap) + writer.generate() + + print("Generating GB18030 extension decode map...") + writer = DecodeMapWriter(fp, "gb18030ext", gb18030decmap) + for i in range(1, 6): + writer.update_decode_map(eval("GB18030EXTP%d_C1" % i), eval("GB18030EXTP%d_C2" % i)) + + writer.generate() + + print("Generating GB18030 extension encode map...") + writer = EncodeMapWriter(fp, "gb18030ext", gb18030encmap) + writer.generate() + + print("Generating GB18030 Unicode BMP Mapping Ranges...") + ranges = [[-1, -1, -1]] + gblinnum = 0 + fp.write(""" +static const struct _gb18030_to_unibmp_ranges { + Py_UCS4 first, last; + DBCHAR base; +} gb18030_to_unibmp_ranges[] = { +""") + + for uni in gb18030unilinear: + if uni == ranges[-1][1] + 1: + ranges[-1][1] = uni + else: + ranges.append([uni, uni, gblinnum]) + gblinnum += 1 + + filler = BufferedFiller() + for first, last, base in ranges[1:]: + filler.write('{', str(first), ',', str(last), ',', str(base), '},') + + filler.write('{', '0,', '0,', str( + ranges[-1][2] + ranges[-1][1] - ranges[-1][0] + 1), '}', '};') + filler.printout(fp) + + print("Done!") + + +if __name__ == '__main__': + main() diff --git a/Tools/unicode/genmap_support.py b/Tools/unicode/genmap_support.py new file mode 100644 index 0000000000000000000000000000000000000000..5e1d9ee77b00022f4700b24ef8893c1143b97d6b --- /dev/null +++ b/Tools/unicode/genmap_support.py @@ -0,0 +1,198 @@ +# +# genmap_support.py: Multibyte Codec Map Generator +# +# Original Author: Hye-Shik Chang +# Modified Author: Dong-hee Na +# + + +class BufferedFiller: + def __init__(self, column=78): + self.column = column + self.buffered = [] + self.cline = [] + self.clen = 0 + self.count = 0 + + def write(self, *data): + for s in data: + if len(s) > self.column: + raise ValueError("token is too long") + if len(s) + self.clen > self.column: + self.flush() + self.clen += len(s) + self.cline.append(s) + self.count += 1 + + def flush(self): + if not self.cline: + return + self.buffered.append(''.join(self.cline)) + self.clen = 0 + del self.cline[:] + + def printout(self, fp): + self.flush() + for l in self.buffered: + fp.write(f'{l}\n') + del self.buffered[:] + + def __len__(self): + return self.count + + +class DecodeMapWriter: + filler_class = BufferedFiller + + def __init__(self, fp, prefix, decode_map): + self.fp = fp + self.prefix = prefix + self.decode_map = decode_map + self.filler = self.filler_class() + + def update_decode_map(self, c1range, c2range, onlymask=(), wide=0): + c2values = range(c2range[0], c2range[1] + 1) + + for c1 in range(c1range[0], c1range[1] + 1): + if c1 not in self.decode_map or (onlymask and c1 not in onlymask): + continue + c2map = self.decode_map[c1] + rc2values = [n for n in c2values if n in c2map] + if not rc2values: + continue + + c2map[self.prefix] = True + c2map['min'] = rc2values[0] + c2map['max'] = rc2values[-1] + c2map['midx'] = len(self.filler) + + for v in range(rc2values[0], rc2values[-1] + 1): + if v in c2map: + self.filler.write('%d,' % c2map[v]) + else: + self.filler.write('U,') + + def generate(self, wide=False): + if not wide: + self.fp.write(f"static const ucs2_t __{self.prefix}_decmap[{len(self.filler)}] = {{\n") + else: + self.fp.write(f"static const Py_UCS4 __{self.prefix}_decmap[{len(self.filler)}] = {{\n") + + self.filler.printout(self.fp) + self.fp.write("};\n\n") + + if not wide: + self.fp.write(f"static const struct dbcs_index {self.prefix}_decmap[256] = {{\n") + else: + self.fp.write(f"static const struct widedbcs_index {self.prefix}_decmap[256] = {{\n") + + for i in range(256): + if i in self.decode_map and self.prefix in self.decode_map[i]: + m = self.decode_map + prefix = self.prefix + else: + self.filler.write("{", "0,", "0,", "0", "},") + continue + + self.filler.write("{", "__%s_decmap" % prefix, "+", "%d" % m[i]['midx'], + ",", "%d," % m[i]['min'], "%d" % m[i]['max'], "},") + self.filler.printout(self.fp) + self.fp.write("};\n\n") + + +class EncodeMapWriter: + filler_class = BufferedFiller + elemtype = 'DBCHAR' + indextype = 'struct unim_index' + + def __init__(self, fp, prefix, encode_map): + self.fp = fp + self.prefix = prefix + self.encode_map = encode_map + self.filler = self.filler_class() + + def generate(self): + self.buildmap() + self.printmap() + + def buildmap(self): + for c1 in range(0, 256): + if c1 not in self.encode_map: + continue + c2map = self.encode_map[c1] + rc2values = [k for k in c2map.keys()] + rc2values.sort() + if not rc2values: + continue + + c2map[self.prefix] = True + c2map['min'] = rc2values[0] + c2map['max'] = rc2values[-1] + c2map['midx'] = len(self.filler) + + for v in range(rc2values[0], rc2values[-1] + 1): + if v not in c2map: + self.write_nochar() + elif isinstance(c2map[v], int): + self.write_char(c2map[v]) + elif isinstance(c2map[v], tuple): + self.write_multic(c2map[v]) + else: + raise ValueError + + def write_nochar(self): + self.filler.write('N,') + + def write_multic(self, point): + self.filler.write('M,') + + def write_char(self, point): + self.filler.write(str(point) + ',') + + def printmap(self): + self.fp.write(f"static const {self.elemtype} __{self.prefix}_encmap[{len(self.filler)}] = {{\n") + self.filler.printout(self.fp) + self.fp.write("};\n\n") + self.fp.write(f"static const {self.indextype} {self.prefix}_encmap[256] = {{\n") + + for i in range(256): + if i in self.encode_map and self.prefix in self.encode_map[i]: + self.filler.write("{", "__%s_encmap" % self.prefix, "+", + "%d" % self.encode_map[i]['midx'], ",", + "%d," % self.encode_map[i]['min'], + "%d" % self.encode_map[i]['max'], "},") + else: + self.filler.write("{", "0,", "0,", "0", "},") + continue + self.filler.printout(self.fp) + self.fp.write("};\n\n") + + +def open_mapping_file(path, source): + try: + f = open(path) + except IOError: + raise SystemExit(f'{source} is needed') + return f + + +def print_autogen(fo, source): + fo.write(f'// AUTO-GENERATED FILE FROM {source}: DO NOT EDIT\n') + + +def loadmap(fo, natcol=0, unicol=1, sbcs=0): + print("Loading from", fo) + fo.seek(0, 0) + decmap = {} + for line in fo: + line = line.split('#', 1)[0].strip() + if not line or len(line.split()) < 2: + continue + + row = [eval(e) for e in line.split()] + loc, uni = row[natcol], row[unicol] + if loc >= 0x100 or sbcs: + decmap.setdefault((loc >> 8), {}) + decmap[(loc >> 8)][(loc & 0xff)] = uni + + return decmap diff --git a/Tools/unicode/makeunicodedata.py b/Tools/unicode/makeunicodedata.py index 5b9427acd3900342413cb9b245157221b9a1de4e..810b285de2c91e3ee50591d99347077f0ad8e5fe 100644 --- a/Tools/unicode/makeunicodedata.py +++ b/Tools/unicode/makeunicodedata.py @@ -26,12 +26,14 @@ # written by Fredrik Lundh (fredrik@pythonware.com) # +import dataclasses import os import sys import zipfile -from textwrap import dedent from functools import partial +from textwrap import dedent +from typing import Iterator, List, Optional, Set, Tuple SCRIPT = sys.argv[0] VERSION = "3.3" @@ -42,7 +44,7 @@ # * Doc/library/stdtypes.rst, and # * Doc/library/unicodedata.rst # * Doc/reference/lexical_analysis.rst (two occurrences) -UNIDATA_VERSION = "12.1.0" +UNIDATA_VERSION = "13.0.0" UNICODE_DATA = "UnicodeData%s.txt" COMPOSITION_EXCLUSIONS = "CompositionExclusions%s.txt" EASTASIAN_WIDTH = "EastAsianWidth%s.txt" @@ -98,13 +100,14 @@ # these ranges need to match unicodedata.c:is_unified_ideograph cjk_ranges = [ - ('3400', '4DB5'), - ('4E00', '9FEF'), - ('20000', '2A6D6'), + ('3400', '4DBF'), + ('4E00', '9FFC'), + ('20000', '2A6DD'), ('2A700', '2B734'), ('2B740', '2B81D'), ('2B820', '2CEA1'), ('2CEB0', '2EBE0'), + ('30000', '3134A'), ] @@ -147,12 +150,12 @@ def makeunicodedata(unicode, trace): record = unicode.table[char] if record: # extract database properties - category = CATEGORY_NAMES.index(record[2]) - combining = int(record[3]) - bidirectional = BIDIRECTIONAL_NAMES.index(record[4]) - mirrored = record[9] == "Y" - eastasianwidth = EASTASIANWIDTH_NAMES.index(record[15]) - normalizationquickcheck = record[17] + category = CATEGORY_NAMES.index(record.general_category) + combining = int(record.canonical_combining_class) + bidirectional = BIDIRECTIONAL_NAMES.index(record.bidi_class) + mirrored = record.bidi_mirrored == "Y" + eastasianwidth = EASTASIANWIDTH_NAMES.index(record.east_asian_width) + normalizationquickcheck = record.quick_check item = ( category, combining, bidirectional, mirrored, eastasianwidth, normalizationquickcheck @@ -178,8 +181,8 @@ def makeunicodedata(unicode, trace): for char in unicode.chars: record = unicode.table[char] if record: - if record[5]: - decomp = record[5].split() + if record.decomposition_type: + decomp = record.decomposition_type.split() if len(decomp) > 19: raise Exception("character %x has a decomposition too large for nfd_nfkd" % char) # prefix @@ -199,7 +202,7 @@ def makeunicodedata(unicode, trace): # Collect NFC pairs if not prefix and len(decomp) == 3 and \ char not in unicode.exclusions and \ - unicode.table[decomp[1]][3] == "0": + unicode.table[decomp[1]].canonical_combining_class == "0": p, l, r = decomp comp_first[l] = 1 comp_last[r] = 1 @@ -403,9 +406,9 @@ def makeunicodetype(unicode, trace): record = unicode.table[char] if record: # extract database properties - category = record[2] - bidirectional = record[4] - properties = record[16] + category = record.general_category + bidirectional = record.bidi_class + properties = record.binary_properties flags = 0 if category in ["Lm", "Lt", "Lu", "Ll", "Lo"]: flags |= ALPHA_MASK @@ -433,16 +436,16 @@ def makeunicodetype(unicode, trace): flags |= CASE_IGNORABLE_MASK sc = unicode.special_casing.get(char) cf = unicode.case_folding.get(char, [char]) - if record[12]: - upper = int(record[12], 16) + if record.simple_uppercase_mapping: + upper = int(record.simple_uppercase_mapping, 16) else: upper = char - if record[13]: - lower = int(record[13], 16) + if record.simple_lowercase_mapping: + lower = int(record.simple_lowercase_mapping, 16) else: lower = char - if record[14]: - title = int(record[14], 16) + if record.simple_titlecase_mapping: + title = int(record.simple_titlecase_mapping, 16) else: title = upper if sc is None and cf != [lower]: @@ -479,16 +482,16 @@ def makeunicodetype(unicode, trace): extra_casing.extend(sc[1]) # decimal digit, integer digit decimal = 0 - if record[6]: + if record.decomposition_mapping: flags |= DECIMAL_MASK - decimal = int(record[6]) + decimal = int(record.decomposition_mapping) digit = 0 - if record[7]: + if record.numeric_type: flags |= DIGIT_MASK - digit = int(record[7]) - if record[8]: + digit = int(record.numeric_type) + if record.numeric_value: flags |= NUMERIC_MASK - numeric.setdefault(record[8], []).append(char) + numeric.setdefault(record.numeric_value, []).append(char) item = ( upper, lower, title, decimal, digit, flags ) @@ -608,7 +611,7 @@ def makeunicodename(unicode, trace): for char in unicode.chars: record = unicode.table[char] if record: - name = record[1].strip() + name = record.name.strip() if name and name[0] != "<": names[char] = name + chr(0) @@ -718,7 +721,7 @@ def word_key(a): for char in unicode.chars: record = unicode.table[char] if record: - name = record[1].strip() + name = record.name.strip() if name and name[0] != "<": data.append((name, char)) @@ -818,31 +821,27 @@ def merge_old_version(version, new, old): continue # check characters that differ if old.table[i] != new.table[i]: - for k in range(len(old.table[i])): - if old.table[i][k] != new.table[i][k]: - value = old.table[i][k] + for k, field in enumerate(dataclasses.fields(UcdRecord)): + value = getattr(old.table[i], field.name) + new_value = getattr(new.table[i], field.name) + if value != new_value: if k == 1 and i in PUA_15: # the name is not set in the old.table, but in the # new.table we are using it for aliases and named seq assert value == '' elif k == 2: - #print "CATEGORY",hex(i), old.table[i][k], new.table[i][k] category_changes[i] = CATEGORY_NAMES.index(value) elif k == 4: - #print "BIDIR",hex(i), old.table[i][k], new.table[i][k] bidir_changes[i] = BIDIRECTIONAL_NAMES.index(value) elif k == 5: - #print "DECOMP",hex(i), old.table[i][k], new.table[i][k] # We assume that all normalization changes are in 1:1 mappings assert " " not in value normalization_changes.append((i, value)) elif k == 6: - #print "DECIMAL",hex(i), old.table[i][k], new.table[i][k] # we only support changes where the old value is a single digit assert value in "0123456789" decimal_changes[i] = int(value) elif k == 8: - # print "NUMERIC",hex(i), `old.table[i][k]`, new.table[i][k] # Since 0 encodes "no change", the old value is better not 0 if not value: numeric_changes[i] = -1 @@ -886,15 +885,18 @@ class Difference(Exception):pass normalization_changes)) +DATA_DIR = os.path.join('Tools', 'unicode', 'data') + def open_data(template, version): - local = template % ('-'+version,) + local = os.path.join(DATA_DIR, template % ('-'+version,)) if not os.path.exists(local): import urllib.request if version == '3.2.0': # irregular url structure - url = 'http://www.unicode.org/Public/3.2-Update/' + local + url = ('https://www.unicode.org/Public/3.2-Update/'+template) % ('-'+version,) else: - url = ('http://www.unicode.org/Public/%s/ucd/'+template) % (version, '') + url = ('https://www.unicode.org/Public/%s/ucd/'+template) % (version, '') + os.makedirs(DATA_DIR, exist_ok=True) urllib.request.urlretrieve(url, filename=local) if local.endswith('.txt'): return open(local, encoding='utf-8') @@ -903,6 +905,90 @@ def open_data(template, version): return open(local, 'rb') +def expand_range(char_range: str) -> Iterator[int]: + ''' + Parses ranges of code points, as described in UAX #44: + https://www.unicode.org/reports/tr44/#Code_Point_Ranges + ''' + if '..' in char_range: + first, last = [int(c, 16) for c in char_range.split('..')] + else: + first = last = int(char_range, 16) + for char in range(first, last+1): + yield char + + +class UcdFile: + ''' + A file in the standard format of the UCD. + + See: https://www.unicode.org/reports/tr44/#Format_Conventions + + Note that, as described there, the Unihan data files have their + own separate format. + ''' + + def __init__(self, template: str, version: str) -> None: + self.template = template + self.version = version + + def records(self) -> Iterator[List[str]]: + with open_data(self.template, self.version) as file: + for line in file: + line = line.split('#', 1)[0].strip() + if not line: + continue + yield [field.strip() for field in line.split(';')] + + def __iter__(self) -> Iterator[List[str]]: + return self.records() + + def expanded(self) -> Iterator[Tuple[int, List[str]]]: + for record in self.records(): + char_range, rest = record[0], record[1:] + for char in expand_range(char_range): + yield char, rest + + +@dataclasses.dataclass +class UcdRecord: + # 15 fields from UnicodeData.txt . See: + # https://www.unicode.org/reports/tr44/#UnicodeData.txt + codepoint: str + name: str + general_category: str + canonical_combining_class: str + bidi_class: str + decomposition_type: str + decomposition_mapping: str + numeric_type: str + numeric_value: str + bidi_mirrored: str + unicode_1_name: str # obsolete + iso_comment: str # obsolete + simple_uppercase_mapping: str + simple_lowercase_mapping: str + simple_titlecase_mapping: str + + # https://www.unicode.org/reports/tr44/#EastAsianWidth.txt + east_asian_width: Optional[str] + + # Binary properties, as a set of those that are true. + # Taken from multiple files: + # https://www.unicode.org/reports/tr44/#DerivedCoreProperties.txt + # https://www.unicode.org/reports/tr44/#LineBreak.txt + binary_properties: Set[str] + + # The Quick_Check properties related to normalization: + # https://www.unicode.org/reports/tr44/#Decompositions_and_Normalization + # We store them as a bitmask. + quick_check: int + + +def from_row(row: List[str]) -> UcdRecord: + return UcdRecord(*row, None, set(), 0) + + # -------------------------------------------------------------------- # the following support code is taken from the unidb utilities # Copyright (c) 1999-2000 by Secret Labs AB @@ -910,50 +996,38 @@ def open_data(template, version): # load a unicode-data file from disk class UnicodeData: - # Record structure: - # [ID, name, category, combining, bidi, decomp, (6) - # decimal, digit, numeric, bidi-mirrored, Unicode-1-name, (11) - # ISO-comment, uppercase, lowercase, titlecase, ea-width, (16) - # derived-props] (17) - - def __init__(self, version, - linebreakprops=False, - expand=1, - cjk_check=True): + # table: List[Optional[UcdRecord]] # index is codepoint; None means unassigned + + def __init__(self, version, cjk_check=True): self.changed = [] table = [None] * 0x110000 - with open_data(UNICODE_DATA, version) as file: - while 1: - s = file.readline() - if not s: - break - s = s.strip().split(";") - char = int(s[0], 16) - table[char] = s + for s in UcdFile(UNICODE_DATA, version): + char = int(s[0], 16) + table[char] = from_row(s) cjk_ranges_found = [] # expand first-last ranges - if expand: - field = None - for i in range(0, 0x110000): - s = table[i] - if s: - if s[1][-6:] == "First>": - s[1] = "" - field = s - elif s[1][-5:] == "Last>": - if s[1].startswith("": + s.name = "" + field = dataclasses.astuple(s)[:15] + elif s.name[-5:] == "Last>": + if s.name.startswith(">quickcheck_shift)&3 - quickchecks[char] |= quickcheck + for s in UcdFile(DERIVEDNORMALIZATION_PROPS, version): + if len(s) < 2 or s[1] not in qc_order: + continue + quickcheck = 'MN'.index(s[2]) + 1 # Maybe or No + quickcheck_shift = qc_order.index(s[1])*2 + quickcheck <<= quickcheck_shift + for char in expand_range(s[0]): + assert not (quickchecks[char]>>quickcheck_shift)&3 + quickchecks[char] |= quickcheck for i in range(0, 0x110000): if table[i] is not None: - table[i].append(quickchecks[i]) + table[i].quick_check = quickchecks[i] with open_data(UNIHAN, version) as file: zip = zipfile.ZipFile(file) @@ -1121,35 +1133,27 @@ def __init__(self, version, i = int(code[2:], 16) # Patch the numeric field if table[i] is not None: - table[i][8] = value + table[i].numeric_value = value + sc = self.special_casing = {} - with open_data(SPECIAL_CASING, version) as file: - for s in file: - s = s[:-1].split('#', 1)[0] - if not s: - continue - data = s.split("; ") - if data[4]: - # We ignore all conditionals (since they depend on - # languages) except for one, which is hardcoded. See - # handle_capital_sigma in unicodeobject.c. - continue - c = int(data[0], 16) - lower = [int(char, 16) for char in data[1].split()] - title = [int(char, 16) for char in data[2].split()] - upper = [int(char, 16) for char in data[3].split()] - sc[c] = (lower, title, upper) + for data in UcdFile(SPECIAL_CASING, version): + if data[4]: + # We ignore all conditionals (since they depend on + # languages) except for one, which is hardcoded. See + # handle_capital_sigma in unicodeobject.c. + continue + c = int(data[0], 16) + lower = [int(char, 16) for char in data[1].split()] + title = [int(char, 16) for char in data[2].split()] + upper = [int(char, 16) for char in data[3].split()] + sc[c] = (lower, title, upper) + cf = self.case_folding = {} if version != '3.2.0': - with open_data(CASE_FOLDING, version) as file: - for s in file: - s = s[:-1].split('#', 1)[0] - if not s: - continue - data = s.split("; ") - if data[1] in "CF": - c = int(data[0], 16) - cf[c] = [int(char, 16) for char in data[2].split()] + for data in UcdFile(CASE_FOLDING, version): + if data[1] in "CF": + c = int(data[0], 16) + cf[c] = [int(char, 16) for char in data[2].split()] def uselatin1(self): # restrict character range to ISO Latin 1 diff --git a/Tools/unicode/mkstringprep.py b/Tools/unicode/mkstringprep.py index ead020c3a7a4bbc75ffc96f3f23fe1d798d38d08..427188389a3b87cf485837c203f35a430e41d464 100644 --- a/Tools/unicode/mkstringprep.py +++ b/Tools/unicode/mkstringprep.py @@ -1,9 +1,6 @@ -import re, sys +import re from unicodedata import ucd_3_2_0 as unicodedata -if sys.maxunicode == 65535: - raise RuntimeError("need UCS-4 Python") - def gen_category(cats): for i in range(0, 0x110000): if unicodedata.category(chr(i)) in cats: diff --git a/Tools/unicode/python-mappings/GB2312.TXT b/Tools/unicode/python-mappings/GB2312.TXT new file mode 100644 index 0000000000000000000000000000000000000000..334b4cdb94863dcb4001f199d27d915e881f3c6f --- /dev/null +++ b/Tools/unicode/python-mappings/GB2312.TXT @@ -0,0 +1,7515 @@ +# +# Name: GB2312-80 to Unicode table (complete, hex format) +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 October 8 +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# +# This table contains one set of mappings from GB2312-80 into Unicode. +# Note that these data are *possible* mappings only and may not be the +# same as those used by actual products, nor may they be the best suited +# for all uses. For more information on the mappings between various code +# pages incorporating the repertoire of GB2312-80 and Unicode, consult the +# VENDORS mapping data. Normative information on the mapping between +# GB2312-80 and Unicode may be found in the Unihan.txt file in the +# latest Unicode Character Database. +# +# If you have carefully considered the fact that the mappings in +# this table are only one possible set of mappings between GB2312-80 and +# Unicode and have no normative status, but still feel that you +# have located an error in the table that requires fixing, you may +# report any such error to errata@unicode.org. +# +# +# Format: Three tab-separated columns +# Column #1 is the GB2312 code (in hex as 0xXXXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# The official names for Unicode characters U+4E00 +# to U+9FA5, inclusive, is "CJK UNIFIED IDEOGRAPH-XXXX", +# where XXXX is the code point. Including all these +# names in this file increases its size substantially +# and needlessly. The token "" is used for the +# name of these characters. If necessary, it can be +# expanded algorithmically by a parser or editor. +# +# The entries are in GB2312 order +# +# The following algorithms can be used to change the hex form +# of GB2312 to other standard forms: +# +# To change hex to EUC form, add 0x8080 +# To change hex to kuten form, first subtract 0x2020. Then +# the high and low bytes correspond to the ku and ten of +# the kuten form. For example, 0x2121 -> 0x0101 -> 0101; +# 0x777E -> 0x575E -> 8794 +# +# Version history +# 1.0 version updates 0.0d2 version by correcting mapping for 0x212C +# from U+2225 to U+2016. +# +# +0x2121 0x3000 # IDEOGRAPHIC SPACE +0x2122 0x3001 # IDEOGRAPHIC COMMA +0x2123 0x3002 # IDEOGRAPHIC FULL STOP +0x2124 0x30FB # KATAKANA MIDDLE DOT +0x2125 0x02C9 # MODIFIER LETTER MACRON (Mandarin Chinese first tone) +0x2126 0x02C7 # CARON (Mandarin Chinese third tone) +0x2127 0x00A8 # DIAERESIS +0x2128 0x3003 # DITTO MARK +0x2129 0x3005 # IDEOGRAPHIC ITERATION MARK +0x212A 0x2015 # HORIZONTAL BAR +0x212B 0xFF5E # FULLWIDTH TILDE +0x212C 0x2016 # DOUBLE VERTICAL LINE +0x212D 0x2026 # HORIZONTAL ELLIPSIS +0x212E 0x2018 # LEFT SINGLE QUOTATION MARK +0x212F 0x2019 # RIGHT SINGLE QUOTATION MARK +0x2130 0x201C # LEFT DOUBLE QUOTATION MARK +0x2131 0x201D # RIGHT DOUBLE QUOTATION MARK +0x2132 0x3014 # LEFT TORTOISE SHELL BRACKET +0x2133 0x3015 # RIGHT TORTOISE SHELL BRACKET +0x2134 0x3008 # LEFT ANGLE BRACKET +0x2135 0x3009 # RIGHT ANGLE BRACKET +0x2136 0x300A # LEFT DOUBLE ANGLE BRACKET +0x2137 0x300B # RIGHT DOUBLE ANGLE BRACKET +0x2138 0x300C # LEFT CORNER BRACKET +0x2139 0x300D # RIGHT CORNER BRACKET +0x213A 0x300E # LEFT WHITE CORNER BRACKET +0x213B 0x300F # RIGHT WHITE CORNER BRACKET +0x213C 0x3016 # LEFT WHITE LENTICULAR BRACKET +0x213D 0x3017 # RIGHT WHITE LENTICULAR BRACKET +0x213E 0x3010 # LEFT BLACK LENTICULAR BRACKET +0x213F 0x3011 # RIGHT BLACK LENTICULAR BRACKET +0x2140 0x00B1 # PLUS-MINUS SIGN +0x2141 0x00D7 # MULTIPLICATION SIGN +0x2142 0x00F7 # DIVISION SIGN +0x2143 0x2236 # RATIO +0x2144 0x2227 # LOGICAL AND +0x2145 0x2228 # LOGICAL OR +0x2146 0x2211 # N-ARY SUMMATION +0x2147 0x220F # N-ARY PRODUCT +0x2148 0x222A # UNION +0x2149 0x2229 # INTERSECTION +0x214A 0x2208 # ELEMENT OF +0x214B 0x2237 # PROPORTION +0x214C 0x221A # SQUARE ROOT +0x214D 0x22A5 # UP TACK +0x214E 0x2225 # PARALLEL TO +0x214F 0x2220 # ANGLE +0x2150 0x2312 # ARC +0x2151 0x2299 # CIRCLED DOT OPERATOR +0x2152 0x222B # INTEGRAL +0x2153 0x222E # CONTOUR INTEGRAL +0x2154 0x2261 # IDENTICAL TO +0x2155 0x224C # ALL EQUAL TO +0x2156 0x2248 # ALMOST EQUAL TO +0x2157 0x223D # REVERSED TILDE +0x2158 0x221D # PROPORTIONAL TO +0x2159 0x2260 # NOT EQUAL TO +0x215A 0x226E # NOT LESS-THAN +0x215B 0x226F # NOT GREATER-THAN +0x215C 0x2264 # LESS-THAN OR EQUAL TO +0x215D 0x2265 # GREATER-THAN OR EQUAL TO +0x215E 0x221E # INFINITY +0x215F 0x2235 # BECAUSE +0x2160 0x2234 # THEREFORE +0x2161 0x2642 # MALE SIGN +0x2162 0x2640 # FEMALE SIGN +0x2163 0x00B0 # DEGREE SIGN +0x2164 0x2032 # PRIME +0x2165 0x2033 # DOUBLE PRIME +0x2166 0x2103 # DEGREE CELSIUS +0x2167 0xFF04 # FULLWIDTH DOLLAR SIGN +0x2168 0x00A4 # CURRENCY SIGN +0x2169 0xFFE0 # FULLWIDTH CENT SIGN +0x216A 0xFFE1 # FULLWIDTH POUND SIGN +0x216B 0x2030 # PER MILLE SIGN +0x216C 0x00A7 # SECTION SIGN +0x216D 0x2116 # NUMERO SIGN +0x216E 0x2606 # WHITE STAR +0x216F 0x2605 # BLACK STAR +0x2170 0x25CB # WHITE CIRCLE +0x2171 0x25CF # BLACK CIRCLE +0x2172 0x25CE # BULLSEYE +0x2173 0x25C7 # WHITE DIAMOND +0x2174 0x25C6 # BLACK DIAMOND +0x2175 0x25A1 # WHITE SQUARE +0x2176 0x25A0 # BLACK SQUARE +0x2177 0x25B3 # WHITE UP-POINTING TRIANGLE +0x2178 0x25B2 # BLACK UP-POINTING TRIANGLE +0x2179 0x203B # REFERENCE MARK +0x217A 0x2192 # RIGHTWARDS ARROW +0x217B 0x2190 # LEFTWARDS ARROW +0x217C 0x2191 # UPWARDS ARROW +0x217D 0x2193 # DOWNWARDS ARROW +0x217E 0x3013 # GETA MARK +0x2231 0x2488 # DIGIT ONE FULL STOP +0x2232 0x2489 # DIGIT TWO FULL STOP +0x2233 0x248A # DIGIT THREE FULL STOP +0x2234 0x248B # DIGIT FOUR FULL STOP +0x2235 0x248C # DIGIT FIVE FULL STOP +0x2236 0x248D # DIGIT SIX FULL STOP +0x2237 0x248E # DIGIT SEVEN FULL STOP +0x2238 0x248F # DIGIT EIGHT FULL STOP +0x2239 0x2490 # DIGIT NINE FULL STOP +0x223A 0x2491 # NUMBER TEN FULL STOP +0x223B 0x2492 # NUMBER ELEVEN FULL STOP +0x223C 0x2493 # NUMBER TWELVE FULL STOP +0x223D 0x2494 # NUMBER THIRTEEN FULL STOP +0x223E 0x2495 # NUMBER FOURTEEN FULL STOP +0x223F 0x2496 # NUMBER FIFTEEN FULL STOP +0x2240 0x2497 # NUMBER SIXTEEN FULL STOP +0x2241 0x2498 # NUMBER SEVENTEEN FULL STOP +0x2242 0x2499 # NUMBER EIGHTEEN FULL STOP +0x2243 0x249A # NUMBER NINETEEN FULL STOP +0x2244 0x249B # NUMBER TWENTY FULL STOP +0x2245 0x2474 # PARENTHESIZED DIGIT ONE +0x2246 0x2475 # PARENTHESIZED DIGIT TWO +0x2247 0x2476 # PARENTHESIZED DIGIT THREE +0x2248 0x2477 # PARENTHESIZED DIGIT FOUR +0x2249 0x2478 # PARENTHESIZED DIGIT FIVE +0x224A 0x2479 # PARENTHESIZED DIGIT SIX +0x224B 0x247A # PARENTHESIZED DIGIT SEVEN +0x224C 0x247B # PARENTHESIZED DIGIT EIGHT +0x224D 0x247C # PARENTHESIZED DIGIT NINE +0x224E 0x247D # PARENTHESIZED NUMBER TEN +0x224F 0x247E # PARENTHESIZED NUMBER ELEVEN +0x2250 0x247F # PARENTHESIZED NUMBER TWELVE +0x2251 0x2480 # PARENTHESIZED NUMBER THIRTEEN +0x2252 0x2481 # PARENTHESIZED NUMBER FOURTEEN +0x2253 0x2482 # PARENTHESIZED NUMBER FIFTEEN +0x2254 0x2483 # PARENTHESIZED NUMBER SIXTEEN +0x2255 0x2484 # PARENTHESIZED NUMBER SEVENTEEN +0x2256 0x2485 # PARENTHESIZED NUMBER EIGHTEEN +0x2257 0x2486 # PARENTHESIZED NUMBER NINETEEN +0x2258 0x2487 # PARENTHESIZED NUMBER TWENTY +0x2259 0x2460 # CIRCLED DIGIT ONE +0x225A 0x2461 # CIRCLED DIGIT TWO +0x225B 0x2462 # CIRCLED DIGIT THREE +0x225C 0x2463 # CIRCLED DIGIT FOUR +0x225D 0x2464 # CIRCLED DIGIT FIVE +0x225E 0x2465 # CIRCLED DIGIT SIX +0x225F 0x2466 # CIRCLED DIGIT SEVEN +0x2260 0x2467 # CIRCLED DIGIT EIGHT +0x2261 0x2468 # CIRCLED DIGIT NINE +0x2262 0x2469 # CIRCLED NUMBER TEN +0x2265 0x3220 # PARENTHESIZED IDEOGRAPH ONE +0x2266 0x3221 # PARENTHESIZED IDEOGRAPH TWO +0x2267 0x3222 # PARENTHESIZED IDEOGRAPH THREE +0x2268 0x3223 # PARENTHESIZED IDEOGRAPH FOUR +0x2269 0x3224 # PARENTHESIZED IDEOGRAPH FIVE +0x226A 0x3225 # PARENTHESIZED IDEOGRAPH SIX +0x226B 0x3226 # PARENTHESIZED IDEOGRAPH SEVEN +0x226C 0x3227 # PARENTHESIZED IDEOGRAPH EIGHT +0x226D 0x3228 # PARENTHESIZED IDEOGRAPH NINE +0x226E 0x3229 # PARENTHESIZED IDEOGRAPH TEN +0x2271 0x2160 # ROMAN NUMERAL ONE +0x2272 0x2161 # ROMAN NUMERAL TWO +0x2273 0x2162 # ROMAN NUMERAL THREE +0x2274 0x2163 # ROMAN NUMERAL FOUR +0x2275 0x2164 # ROMAN NUMERAL FIVE +0x2276 0x2165 # ROMAN NUMERAL SIX +0x2277 0x2166 # ROMAN NUMERAL SEVEN +0x2278 0x2167 # ROMAN NUMERAL EIGHT +0x2279 0x2168 # ROMAN NUMERAL NINE +0x227A 0x2169 # ROMAN NUMERAL TEN +0x227B 0x216A # ROMAN NUMERAL ELEVEN +0x227C 0x216B # ROMAN NUMERAL TWELVE +0x2321 0xFF01 # FULLWIDTH EXCLAMATION MARK +0x2322 0xFF02 # FULLWIDTH QUOTATION MARK +0x2323 0xFF03 # FULLWIDTH NUMBER SIGN +0x2324 0xFFE5 # FULLWIDTH YEN SIGN +0x2325 0xFF05 # FULLWIDTH PERCENT SIGN +0x2326 0xFF06 # FULLWIDTH AMPERSAND +0x2327 0xFF07 # FULLWIDTH APOSTROPHE +0x2328 0xFF08 # FULLWIDTH LEFT PARENTHESIS +0x2329 0xFF09 # FULLWIDTH RIGHT PARENTHESIS +0x232A 0xFF0A # FULLWIDTH ASTERISK +0x232B 0xFF0B # FULLWIDTH PLUS SIGN +0x232C 0xFF0C # FULLWIDTH COMMA +0x232D 0xFF0D # FULLWIDTH HYPHEN-MINUS +0x232E 0xFF0E # FULLWIDTH FULL STOP +0x232F 0xFF0F # FULLWIDTH SOLIDUS +0x2330 0xFF10 # FULLWIDTH DIGIT ZERO +0x2331 0xFF11 # FULLWIDTH DIGIT ONE +0x2332 0xFF12 # FULLWIDTH DIGIT TWO +0x2333 0xFF13 # FULLWIDTH DIGIT THREE +0x2334 0xFF14 # FULLWIDTH DIGIT FOUR +0x2335 0xFF15 # FULLWIDTH DIGIT FIVE +0x2336 0xFF16 # FULLWIDTH DIGIT SIX +0x2337 0xFF17 # FULLWIDTH DIGIT SEVEN +0x2338 0xFF18 # FULLWIDTH DIGIT EIGHT +0x2339 0xFF19 # FULLWIDTH DIGIT NINE +0x233A 0xFF1A # FULLWIDTH COLON +0x233B 0xFF1B # FULLWIDTH SEMICOLON +0x233C 0xFF1C # FULLWIDTH LESS-THAN SIGN +0x233D 0xFF1D # FULLWIDTH EQUALS SIGN +0x233E 0xFF1E # FULLWIDTH GREATER-THAN SIGN +0x233F 0xFF1F # FULLWIDTH QUESTION MARK +0x2340 0xFF20 # FULLWIDTH COMMERCIAL AT +0x2341 0xFF21 # FULLWIDTH LATIN CAPITAL LETTER A +0x2342 0xFF22 # FULLWIDTH LATIN CAPITAL LETTER B +0x2343 0xFF23 # FULLWIDTH LATIN CAPITAL LETTER C +0x2344 0xFF24 # FULLWIDTH LATIN CAPITAL LETTER D +0x2345 0xFF25 # FULLWIDTH LATIN CAPITAL LETTER E +0x2346 0xFF26 # FULLWIDTH LATIN CAPITAL LETTER F +0x2347 0xFF27 # FULLWIDTH LATIN CAPITAL LETTER G +0x2348 0xFF28 # FULLWIDTH LATIN CAPITAL LETTER H +0x2349 0xFF29 # FULLWIDTH LATIN CAPITAL LETTER I +0x234A 0xFF2A # FULLWIDTH LATIN CAPITAL LETTER J +0x234B 0xFF2B # FULLWIDTH LATIN CAPITAL LETTER K +0x234C 0xFF2C # FULLWIDTH LATIN CAPITAL LETTER L +0x234D 0xFF2D # FULLWIDTH LATIN CAPITAL LETTER M +0x234E 0xFF2E # FULLWIDTH LATIN CAPITAL LETTER N +0x234F 0xFF2F # FULLWIDTH LATIN CAPITAL LETTER O +0x2350 0xFF30 # FULLWIDTH LATIN CAPITAL LETTER P +0x2351 0xFF31 # FULLWIDTH LATIN CAPITAL LETTER Q +0x2352 0xFF32 # FULLWIDTH LATIN CAPITAL LETTER R +0x2353 0xFF33 # FULLWIDTH LATIN CAPITAL LETTER S +0x2354 0xFF34 # FULLWIDTH LATIN CAPITAL LETTER T +0x2355 0xFF35 # FULLWIDTH LATIN CAPITAL LETTER U +0x2356 0xFF36 # FULLWIDTH LATIN CAPITAL LETTER V +0x2357 0xFF37 # FULLWIDTH LATIN CAPITAL LETTER W +0x2358 0xFF38 # FULLWIDTH LATIN CAPITAL LETTER X +0x2359 0xFF39 # FULLWIDTH LATIN CAPITAL LETTER Y +0x235A 0xFF3A # FULLWIDTH LATIN CAPITAL LETTER Z +0x235B 0xFF3B # FULLWIDTH LEFT SQUARE BRACKET +0x235C 0xFF3C # FULLWIDTH REVERSE SOLIDUS +0x235D 0xFF3D # FULLWIDTH RIGHT SQUARE BRACKET +0x235E 0xFF3E # FULLWIDTH CIRCUMFLEX ACCENT +0x235F 0xFF3F # FULLWIDTH LOW LINE +0x2360 0xFF40 # FULLWIDTH GRAVE ACCENT +0x2361 0xFF41 # FULLWIDTH LATIN SMALL LETTER A +0x2362 0xFF42 # FULLWIDTH LATIN SMALL LETTER B +0x2363 0xFF43 # FULLWIDTH LATIN SMALL LETTER C +0x2364 0xFF44 # FULLWIDTH LATIN SMALL LETTER D +0x2365 0xFF45 # FULLWIDTH LATIN SMALL LETTER E +0x2366 0xFF46 # FULLWIDTH LATIN SMALL LETTER F +0x2367 0xFF47 # FULLWIDTH LATIN SMALL LETTER G +0x2368 0xFF48 # FULLWIDTH LATIN SMALL LETTER H +0x2369 0xFF49 # FULLWIDTH LATIN SMALL LETTER I +0x236A 0xFF4A # FULLWIDTH LATIN SMALL LETTER J +0x236B 0xFF4B # FULLWIDTH LATIN SMALL LETTER K +0x236C 0xFF4C # FULLWIDTH LATIN SMALL LETTER L +0x236D 0xFF4D # FULLWIDTH LATIN SMALL LETTER M +0x236E 0xFF4E # FULLWIDTH LATIN SMALL LETTER N +0x236F 0xFF4F # FULLWIDTH LATIN SMALL LETTER O +0x2370 0xFF50 # FULLWIDTH LATIN SMALL LETTER P +0x2371 0xFF51 # FULLWIDTH LATIN SMALL LETTER Q +0x2372 0xFF52 # FULLWIDTH LATIN SMALL LETTER R +0x2373 0xFF53 # FULLWIDTH LATIN SMALL LETTER S +0x2374 0xFF54 # FULLWIDTH LATIN SMALL LETTER T +0x2375 0xFF55 # FULLWIDTH LATIN SMALL LETTER U +0x2376 0xFF56 # FULLWIDTH LATIN SMALL LETTER V +0x2377 0xFF57 # FULLWIDTH LATIN SMALL LETTER W +0x2378 0xFF58 # FULLWIDTH LATIN SMALL LETTER X +0x2379 0xFF59 # FULLWIDTH LATIN SMALL LETTER Y +0x237A 0xFF5A # FULLWIDTH LATIN SMALL LETTER Z +0x237B 0xFF5B # FULLWIDTH LEFT CURLY BRACKET +0x237C 0xFF5C # FULLWIDTH VERTICAL LINE +0x237D 0xFF5D # FULLWIDTH RIGHT CURLY BRACKET +0x237E 0xFFE3 # FULLWIDTH MACRON +0x2421 0x3041 # HIRAGANA LETTER SMALL A +0x2422 0x3042 # HIRAGANA LETTER A +0x2423 0x3043 # HIRAGANA LETTER SMALL I +0x2424 0x3044 # HIRAGANA LETTER I +0x2425 0x3045 # HIRAGANA LETTER SMALL U +0x2426 0x3046 # HIRAGANA LETTER U +0x2427 0x3047 # HIRAGANA LETTER SMALL E +0x2428 0x3048 # HIRAGANA LETTER E +0x2429 0x3049 # HIRAGANA LETTER SMALL O +0x242A 0x304A # HIRAGANA LETTER O +0x242B 0x304B # HIRAGANA LETTER KA +0x242C 0x304C # HIRAGANA LETTER GA +0x242D 0x304D # HIRAGANA LETTER KI +0x242E 0x304E # HIRAGANA LETTER GI +0x242F 0x304F # HIRAGANA LETTER KU +0x2430 0x3050 # HIRAGANA LETTER GU +0x2431 0x3051 # HIRAGANA LETTER KE +0x2432 0x3052 # HIRAGANA LETTER GE +0x2433 0x3053 # HIRAGANA LETTER KO +0x2434 0x3054 # HIRAGANA LETTER GO +0x2435 0x3055 # HIRAGANA LETTER SA +0x2436 0x3056 # HIRAGANA LETTER ZA +0x2437 0x3057 # HIRAGANA LETTER SI +0x2438 0x3058 # HIRAGANA LETTER ZI +0x2439 0x3059 # HIRAGANA LETTER SU +0x243A 0x305A # HIRAGANA LETTER ZU +0x243B 0x305B # HIRAGANA LETTER SE +0x243C 0x305C # HIRAGANA LETTER ZE +0x243D 0x305D # HIRAGANA LETTER SO +0x243E 0x305E # HIRAGANA LETTER ZO +0x243F 0x305F # HIRAGANA LETTER TA +0x2440 0x3060 # HIRAGANA LETTER DA +0x2441 0x3061 # HIRAGANA LETTER TI +0x2442 0x3062 # HIRAGANA LETTER DI +0x2443 0x3063 # HIRAGANA LETTER SMALL TU +0x2444 0x3064 # HIRAGANA LETTER TU +0x2445 0x3065 # HIRAGANA LETTER DU +0x2446 0x3066 # HIRAGANA LETTER TE +0x2447 0x3067 # HIRAGANA LETTER DE +0x2448 0x3068 # HIRAGANA LETTER TO +0x2449 0x3069 # HIRAGANA LETTER DO +0x244A 0x306A # HIRAGANA LETTER NA +0x244B 0x306B # HIRAGANA LETTER NI +0x244C 0x306C # HIRAGANA LETTER NU +0x244D 0x306D # HIRAGANA LETTER NE +0x244E 0x306E # HIRAGANA LETTER NO +0x244F 0x306F # HIRAGANA LETTER HA +0x2450 0x3070 # HIRAGANA LETTER BA +0x2451 0x3071 # HIRAGANA LETTER PA +0x2452 0x3072 # HIRAGANA LETTER HI +0x2453 0x3073 # HIRAGANA LETTER BI +0x2454 0x3074 # HIRAGANA LETTER PI +0x2455 0x3075 # HIRAGANA LETTER HU +0x2456 0x3076 # HIRAGANA LETTER BU +0x2457 0x3077 # HIRAGANA LETTER PU +0x2458 0x3078 # HIRAGANA LETTER HE +0x2459 0x3079 # HIRAGANA LETTER BE +0x245A 0x307A # HIRAGANA LETTER PE +0x245B 0x307B # HIRAGANA LETTER HO +0x245C 0x307C # HIRAGANA LETTER BO +0x245D 0x307D # HIRAGANA LETTER PO +0x245E 0x307E # HIRAGANA LETTER MA +0x245F 0x307F # HIRAGANA LETTER MI +0x2460 0x3080 # HIRAGANA LETTER MU +0x2461 0x3081 # HIRAGANA LETTER ME +0x2462 0x3082 # HIRAGANA LETTER MO +0x2463 0x3083 # HIRAGANA LETTER SMALL YA +0x2464 0x3084 # HIRAGANA LETTER YA +0x2465 0x3085 # HIRAGANA LETTER SMALL YU +0x2466 0x3086 # HIRAGANA LETTER YU +0x2467 0x3087 # HIRAGANA LETTER SMALL YO +0x2468 0x3088 # HIRAGANA LETTER YO +0x2469 0x3089 # HIRAGANA LETTER RA +0x246A 0x308A # HIRAGANA LETTER RI +0x246B 0x308B # HIRAGANA LETTER RU +0x246C 0x308C # HIRAGANA LETTER RE +0x246D 0x308D # HIRAGANA LETTER RO +0x246E 0x308E # HIRAGANA LETTER SMALL WA +0x246F 0x308F # HIRAGANA LETTER WA +0x2470 0x3090 # HIRAGANA LETTER WI +0x2471 0x3091 # HIRAGANA LETTER WE +0x2472 0x3092 # HIRAGANA LETTER WO +0x2473 0x3093 # HIRAGANA LETTER N +0x2521 0x30A1 # KATAKANA LETTER SMALL A +0x2522 0x30A2 # KATAKANA LETTER A +0x2523 0x30A3 # KATAKANA LETTER SMALL I +0x2524 0x30A4 # KATAKANA LETTER I +0x2525 0x30A5 # KATAKANA LETTER SMALL U +0x2526 0x30A6 # KATAKANA LETTER U +0x2527 0x30A7 # KATAKANA LETTER SMALL E +0x2528 0x30A8 # KATAKANA LETTER E +0x2529 0x30A9 # KATAKANA LETTER SMALL O +0x252A 0x30AA # KATAKANA LETTER O +0x252B 0x30AB # KATAKANA LETTER KA +0x252C 0x30AC # KATAKANA LETTER GA +0x252D 0x30AD # KATAKANA LETTER KI +0x252E 0x30AE # KATAKANA LETTER GI +0x252F 0x30AF # KATAKANA LETTER KU +0x2530 0x30B0 # KATAKANA LETTER GU +0x2531 0x30B1 # KATAKANA LETTER KE +0x2532 0x30B2 # KATAKANA LETTER GE +0x2533 0x30B3 # KATAKANA LETTER KO +0x2534 0x30B4 # KATAKANA LETTER GO +0x2535 0x30B5 # KATAKANA LETTER SA +0x2536 0x30B6 # KATAKANA LETTER ZA +0x2537 0x30B7 # KATAKANA LETTER SI +0x2538 0x30B8 # KATAKANA LETTER ZI +0x2539 0x30B9 # KATAKANA LETTER SU +0x253A 0x30BA # KATAKANA LETTER ZU +0x253B 0x30BB # KATAKANA LETTER SE +0x253C 0x30BC # KATAKANA LETTER ZE +0x253D 0x30BD # KATAKANA LETTER SO +0x253E 0x30BE # KATAKANA LETTER ZO +0x253F 0x30BF # KATAKANA LETTER TA +0x2540 0x30C0 # KATAKANA LETTER DA +0x2541 0x30C1 # KATAKANA LETTER TI +0x2542 0x30C2 # KATAKANA LETTER DI +0x2543 0x30C3 # KATAKANA LETTER SMALL TU +0x2544 0x30C4 # KATAKANA LETTER TU +0x2545 0x30C5 # KATAKANA LETTER DU +0x2546 0x30C6 # KATAKANA LETTER TE +0x2547 0x30C7 # KATAKANA LETTER DE +0x2548 0x30C8 # KATAKANA LETTER TO +0x2549 0x30C9 # KATAKANA LETTER DO +0x254A 0x30CA # KATAKANA LETTER NA +0x254B 0x30CB # KATAKANA LETTER NI +0x254C 0x30CC # KATAKANA LETTER NU +0x254D 0x30CD # KATAKANA LETTER NE +0x254E 0x30CE # KATAKANA LETTER NO +0x254F 0x30CF # KATAKANA LETTER HA +0x2550 0x30D0 # KATAKANA LETTER BA +0x2551 0x30D1 # KATAKANA LETTER PA +0x2552 0x30D2 # KATAKANA LETTER HI +0x2553 0x30D3 # KATAKANA LETTER BI +0x2554 0x30D4 # KATAKANA LETTER PI +0x2555 0x30D5 # KATAKANA LETTER HU +0x2556 0x30D6 # KATAKANA LETTER BU +0x2557 0x30D7 # KATAKANA LETTER PU +0x2558 0x30D8 # KATAKANA LETTER HE +0x2559 0x30D9 # KATAKANA LETTER BE +0x255A 0x30DA # KATAKANA LETTER PE +0x255B 0x30DB # KATAKANA LETTER HO +0x255C 0x30DC # KATAKANA LETTER BO +0x255D 0x30DD # KATAKANA LETTER PO +0x255E 0x30DE # KATAKANA LETTER MA +0x255F 0x30DF # KATAKANA LETTER MI +0x2560 0x30E0 # KATAKANA LETTER MU +0x2561 0x30E1 # KATAKANA LETTER ME +0x2562 0x30E2 # KATAKANA LETTER MO +0x2563 0x30E3 # KATAKANA LETTER SMALL YA +0x2564 0x30E4 # KATAKANA LETTER YA +0x2565 0x30E5 # KATAKANA LETTER SMALL YU +0x2566 0x30E6 # KATAKANA LETTER YU +0x2567 0x30E7 # KATAKANA LETTER SMALL YO +0x2568 0x30E8 # KATAKANA LETTER YO +0x2569 0x30E9 # KATAKANA LETTER RA +0x256A 0x30EA # KATAKANA LETTER RI +0x256B 0x30EB # KATAKANA LETTER RU +0x256C 0x30EC # KATAKANA LETTER RE +0x256D 0x30ED # KATAKANA LETTER RO +0x256E 0x30EE # KATAKANA LETTER SMALL WA +0x256F 0x30EF # KATAKANA LETTER WA +0x2570 0x30F0 # KATAKANA LETTER WI +0x2571 0x30F1 # KATAKANA LETTER WE +0x2572 0x30F2 # KATAKANA LETTER WO +0x2573 0x30F3 # KATAKANA LETTER N +0x2574 0x30F4 # KATAKANA LETTER VU +0x2575 0x30F5 # KATAKANA LETTER SMALL KA +0x2576 0x30F6 # KATAKANA LETTER SMALL KE +0x2621 0x0391 # GREEK CAPITAL LETTER ALPHA +0x2622 0x0392 # GREEK CAPITAL LETTER BETA +0x2623 0x0393 # GREEK CAPITAL LETTER GAMMA +0x2624 0x0394 # GREEK CAPITAL LETTER DELTA +0x2625 0x0395 # GREEK CAPITAL LETTER EPSILON +0x2626 0x0396 # GREEK CAPITAL LETTER ZETA +0x2627 0x0397 # GREEK CAPITAL LETTER ETA +0x2628 0x0398 # GREEK CAPITAL LETTER THETA +0x2629 0x0399 # GREEK CAPITAL LETTER IOTA +0x262A 0x039A # GREEK CAPITAL LETTER KAPPA +0x262B 0x039B # GREEK CAPITAL LETTER LAMDA +0x262C 0x039C # GREEK CAPITAL LETTER MU +0x262D 0x039D # GREEK CAPITAL LETTER NU +0x262E 0x039E # GREEK CAPITAL LETTER XI +0x262F 0x039F # GREEK CAPITAL LETTER OMICRON +0x2630 0x03A0 # GREEK CAPITAL LETTER PI +0x2631 0x03A1 # GREEK CAPITAL LETTER RHO +0x2632 0x03A3 # GREEK CAPITAL LETTER SIGMA +0x2633 0x03A4 # GREEK CAPITAL LETTER TAU +0x2634 0x03A5 # GREEK CAPITAL LETTER UPSILON +0x2635 0x03A6 # GREEK CAPITAL LETTER PHI +0x2636 0x03A7 # GREEK CAPITAL LETTER CHI +0x2637 0x03A8 # GREEK CAPITAL LETTER PSI +0x2638 0x03A9 # GREEK CAPITAL LETTER OMEGA +0x2641 0x03B1 # GREEK SMALL LETTER ALPHA +0x2642 0x03B2 # GREEK SMALL LETTER BETA +0x2643 0x03B3 # GREEK SMALL LETTER GAMMA +0x2644 0x03B4 # GREEK SMALL LETTER DELTA +0x2645 0x03B5 # GREEK SMALL LETTER EPSILON +0x2646 0x03B6 # GREEK SMALL LETTER ZETA +0x2647 0x03B7 # GREEK SMALL LETTER ETA +0x2648 0x03B8 # GREEK SMALL LETTER THETA +0x2649 0x03B9 # GREEK SMALL LETTER IOTA +0x264A 0x03BA # GREEK SMALL LETTER KAPPA +0x264B 0x03BB # GREEK SMALL LETTER LAMDA +0x264C 0x03BC # GREEK SMALL LETTER MU +0x264D 0x03BD # GREEK SMALL LETTER NU +0x264E 0x03BE # GREEK SMALL LETTER XI +0x264F 0x03BF # GREEK SMALL LETTER OMICRON +0x2650 0x03C0 # GREEK SMALL LETTER PI +0x2651 0x03C1 # GREEK SMALL LETTER RHO +0x2652 0x03C3 # GREEK SMALL LETTER SIGMA +0x2653 0x03C4 # GREEK SMALL LETTER TAU +0x2654 0x03C5 # GREEK SMALL LETTER UPSILON +0x2655 0x03C6 # GREEK SMALL LETTER PHI +0x2656 0x03C7 # GREEK SMALL LETTER CHI +0x2657 0x03C8 # GREEK SMALL LETTER PSI +0x2658 0x03C9 # GREEK SMALL LETTER OMEGA +0x2721 0x0410 # CYRILLIC CAPITAL LETTER A +0x2722 0x0411 # CYRILLIC CAPITAL LETTER BE +0x2723 0x0412 # CYRILLIC CAPITAL LETTER VE +0x2724 0x0413 # CYRILLIC CAPITAL LETTER GHE +0x2725 0x0414 # CYRILLIC CAPITAL LETTER DE +0x2726 0x0415 # CYRILLIC CAPITAL LETTER IE +0x2727 0x0401 # CYRILLIC CAPITAL LETTER IO +0x2728 0x0416 # CYRILLIC CAPITAL LETTER ZHE +0x2729 0x0417 # CYRILLIC CAPITAL LETTER ZE +0x272A 0x0418 # CYRILLIC CAPITAL LETTER I +0x272B 0x0419 # CYRILLIC CAPITAL LETTER SHORT I +0x272C 0x041A # CYRILLIC CAPITAL LETTER KA +0x272D 0x041B # CYRILLIC CAPITAL LETTER EL +0x272E 0x041C # CYRILLIC CAPITAL LETTER EM +0x272F 0x041D # CYRILLIC CAPITAL LETTER EN +0x2730 0x041E # CYRILLIC CAPITAL LETTER O +0x2731 0x041F # CYRILLIC CAPITAL LETTER PE +0x2732 0x0420 # CYRILLIC CAPITAL LETTER ER +0x2733 0x0421 # CYRILLIC CAPITAL LETTER ES +0x2734 0x0422 # CYRILLIC CAPITAL LETTER TE +0x2735 0x0423 # CYRILLIC CAPITAL LETTER U +0x2736 0x0424 # CYRILLIC CAPITAL LETTER EF +0x2737 0x0425 # CYRILLIC CAPITAL LETTER HA +0x2738 0x0426 # CYRILLIC CAPITAL LETTER TSE +0x2739 0x0427 # CYRILLIC CAPITAL LETTER CHE +0x273A 0x0428 # CYRILLIC CAPITAL LETTER SHA +0x273B 0x0429 # CYRILLIC CAPITAL LETTER SHCHA +0x273C 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN +0x273D 0x042B # CYRILLIC CAPITAL LETTER YERU +0x273E 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN +0x273F 0x042D # CYRILLIC CAPITAL LETTER E +0x2740 0x042E # CYRILLIC CAPITAL LETTER YU +0x2741 0x042F # CYRILLIC CAPITAL LETTER YA +0x2751 0x0430 # CYRILLIC SMALL LETTER A +0x2752 0x0431 # CYRILLIC SMALL LETTER BE +0x2753 0x0432 # CYRILLIC SMALL LETTER VE +0x2754 0x0433 # CYRILLIC SMALL LETTER GHE +0x2755 0x0434 # CYRILLIC SMALL LETTER DE +0x2756 0x0435 # CYRILLIC SMALL LETTER IE +0x2757 0x0451 # CYRILLIC SMALL LETTER IO +0x2758 0x0436 # CYRILLIC SMALL LETTER ZHE +0x2759 0x0437 # CYRILLIC SMALL LETTER ZE +0x275A 0x0438 # CYRILLIC SMALL LETTER I +0x275B 0x0439 # CYRILLIC SMALL LETTER SHORT I +0x275C 0x043A # CYRILLIC SMALL LETTER KA +0x275D 0x043B # CYRILLIC SMALL LETTER EL +0x275E 0x043C # CYRILLIC SMALL LETTER EM +0x275F 0x043D # CYRILLIC SMALL LETTER EN +0x2760 0x043E # CYRILLIC SMALL LETTER O +0x2761 0x043F # CYRILLIC SMALL LETTER PE +0x2762 0x0440 # CYRILLIC SMALL LETTER ER +0x2763 0x0441 # CYRILLIC SMALL LETTER ES +0x2764 0x0442 # CYRILLIC SMALL LETTER TE +0x2765 0x0443 # CYRILLIC SMALL LETTER U +0x2766 0x0444 # CYRILLIC SMALL LETTER EF +0x2767 0x0445 # CYRILLIC SMALL LETTER HA +0x2768 0x0446 # CYRILLIC SMALL LETTER TSE +0x2769 0x0447 # CYRILLIC SMALL LETTER CHE +0x276A 0x0448 # CYRILLIC SMALL LETTER SHA +0x276B 0x0449 # CYRILLIC SMALL LETTER SHCHA +0x276C 0x044A # CYRILLIC SMALL LETTER HARD SIGN +0x276D 0x044B # CYRILLIC SMALL LETTER YERU +0x276E 0x044C # CYRILLIC SMALL LETTER SOFT SIGN +0x276F 0x044D # CYRILLIC SMALL LETTER E +0x2770 0x044E # CYRILLIC SMALL LETTER YU +0x2771 0x044F # CYRILLIC SMALL LETTER YA +0x2821 0x0101 # LATIN SMALL LETTER A WITH MACRON +0x2822 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0x2823 0x01CE # LATIN SMALL LETTER A WITH CARON +0x2824 0x00E0 # LATIN SMALL LETTER A WITH GRAVE +0x2825 0x0113 # LATIN SMALL LETTER E WITH MACRON +0x2826 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0x2827 0x011B # LATIN SMALL LETTER E WITH CARON +0x2828 0x00E8 # LATIN SMALL LETTER E WITH GRAVE +0x2829 0x012B # LATIN SMALL LETTER I WITH MACRON +0x282A 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0x282B 0x01D0 # LATIN SMALL LETTER I WITH CARON +0x282C 0x00EC # LATIN SMALL LETTER I WITH GRAVE +0x282D 0x014D # LATIN SMALL LETTER O WITH MACRON +0x282E 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0x282F 0x01D2 # LATIN SMALL LETTER O WITH CARON +0x2830 0x00F2 # LATIN SMALL LETTER O WITH GRAVE +0x2831 0x016B # LATIN SMALL LETTER U WITH MACRON +0x2832 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0x2833 0x01D4 # LATIN SMALL LETTER U WITH CARON +0x2834 0x00F9 # LATIN SMALL LETTER U WITH GRAVE +0x2835 0x01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +0x2836 0x01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +0x2837 0x01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON +0x2838 0x01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE +0x2839 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0x283A 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +0x2845 0x3105 # BOPOMOFO LETTER B +0x2846 0x3106 # BOPOMOFO LETTER P +0x2847 0x3107 # BOPOMOFO LETTER M +0x2848 0x3108 # BOPOMOFO LETTER F +0x2849 0x3109 # BOPOMOFO LETTER D +0x284A 0x310A # BOPOMOFO LETTER T +0x284B 0x310B # BOPOMOFO LETTER N +0x284C 0x310C # BOPOMOFO LETTER L +0x284D 0x310D # BOPOMOFO LETTER G +0x284E 0x310E # BOPOMOFO LETTER K +0x284F 0x310F # BOPOMOFO LETTER H +0x2850 0x3110 # BOPOMOFO LETTER J +0x2851 0x3111 # BOPOMOFO LETTER Q +0x2852 0x3112 # BOPOMOFO LETTER X +0x2853 0x3113 # BOPOMOFO LETTER ZH +0x2854 0x3114 # BOPOMOFO LETTER CH +0x2855 0x3115 # BOPOMOFO LETTER SH +0x2856 0x3116 # BOPOMOFO LETTER R +0x2857 0x3117 # BOPOMOFO LETTER Z +0x2858 0x3118 # BOPOMOFO LETTER C +0x2859 0x3119 # BOPOMOFO LETTER S +0x285A 0x311A # BOPOMOFO LETTER A +0x285B 0x311B # BOPOMOFO LETTER O +0x285C 0x311C # BOPOMOFO LETTER E +0x285D 0x311D # BOPOMOFO LETTER EH +0x285E 0x311E # BOPOMOFO LETTER AI +0x285F 0x311F # BOPOMOFO LETTER EI +0x2860 0x3120 # BOPOMOFO LETTER AU +0x2861 0x3121 # BOPOMOFO LETTER OU +0x2862 0x3122 # BOPOMOFO LETTER AN +0x2863 0x3123 # BOPOMOFO LETTER EN +0x2864 0x3124 # BOPOMOFO LETTER ANG +0x2865 0x3125 # BOPOMOFO LETTER ENG +0x2866 0x3126 # BOPOMOFO LETTER ER +0x2867 0x3127 # BOPOMOFO LETTER I +0x2868 0x3128 # BOPOMOFO LETTER U +0x2869 0x3129 # BOPOMOFO LETTER IU +0x2924 0x2500 # BOX DRAWINGS LIGHT HORIZONTAL +0x2925 0x2501 # BOX DRAWINGS HEAVY HORIZONTAL +0x2926 0x2502 # BOX DRAWINGS LIGHT VERTICAL +0x2927 0x2503 # BOX DRAWINGS HEAVY VERTICAL +0x2928 0x2504 # BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL +0x2929 0x2505 # BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL +0x292A 0x2506 # BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL +0x292B 0x2507 # BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL +0x292C 0x2508 # BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL +0x292D 0x2509 # BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL +0x292E 0x250A # BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL +0x292F 0x250B # BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL +0x2930 0x250C # BOX DRAWINGS LIGHT DOWN AND RIGHT +0x2931 0x250D # BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY +0x2932 0x250E # BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT +0x2933 0x250F # BOX DRAWINGS HEAVY DOWN AND RIGHT +0x2934 0x2510 # BOX DRAWINGS LIGHT DOWN AND LEFT +0x2935 0x2511 # BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY +0x2936 0x2512 # BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT +0x2937 0x2513 # BOX DRAWINGS HEAVY DOWN AND LEFT +0x2938 0x2514 # BOX DRAWINGS LIGHT UP AND RIGHT +0x2939 0x2515 # BOX DRAWINGS UP LIGHT AND RIGHT HEAVY +0x293A 0x2516 # BOX DRAWINGS UP HEAVY AND RIGHT LIGHT +0x293B 0x2517 # BOX DRAWINGS HEAVY UP AND RIGHT +0x293C 0x2518 # BOX DRAWINGS LIGHT UP AND LEFT +0x293D 0x2519 # BOX DRAWINGS UP LIGHT AND LEFT HEAVY +0x293E 0x251A # BOX DRAWINGS UP HEAVY AND LEFT LIGHT +0x293F 0x251B # BOX DRAWINGS HEAVY UP AND LEFT +0x2940 0x251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0x2941 0x251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY +0x2942 0x251E # BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT +0x2943 0x251F # BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT +0x2944 0x2520 # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT +0x2945 0x2521 # BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY +0x2946 0x2522 # BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY +0x2947 0x2523 # BOX DRAWINGS HEAVY VERTICAL AND RIGHT +0x2948 0x2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT +0x2949 0x2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY +0x294A 0x2526 # BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT +0x294B 0x2527 # BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT +0x294C 0x2528 # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT +0x294D 0x2529 # BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY +0x294E 0x252A # BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY +0x294F 0x252B # BOX DRAWINGS HEAVY VERTICAL AND LEFT +0x2950 0x252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0x2951 0x252D # BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT +0x2952 0x252E # BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT +0x2953 0x252F # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY +0x2954 0x2530 # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT +0x2955 0x2531 # BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY +0x2956 0x2532 # BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY +0x2957 0x2533 # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL +0x2958 0x2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL +0x2959 0x2535 # BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT +0x295A 0x2536 # BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT +0x295B 0x2537 # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY +0x295C 0x2538 # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT +0x295D 0x2539 # BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY +0x295E 0x253A # BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY +0x295F 0x253B # BOX DRAWINGS HEAVY UP AND HORIZONTAL +0x2960 0x253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0x2961 0x253D # BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT +0x2962 0x253E # BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT +0x2963 0x253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY +0x2964 0x2540 # BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT +0x2965 0x2541 # BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT +0x2966 0x2542 # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT +0x2967 0x2543 # BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT +0x2968 0x2544 # BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT +0x2969 0x2545 # BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT +0x296A 0x2546 # BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT +0x296B 0x2547 # BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY +0x296C 0x2548 # BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY +0x296D 0x2549 # BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY +0x296E 0x254A # BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY +0x296F 0x254B # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +0x3021 0x554A # +0x3022 0x963F # +0x3023 0x57C3 # +0x3024 0x6328 # +0x3025 0x54CE # +0x3026 0x5509 # +0x3027 0x54C0 # +0x3028 0x7691 # +0x3029 0x764C # +0x302A 0x853C # +0x302B 0x77EE # +0x302C 0x827E # +0x302D 0x788D # +0x302E 0x7231 # +0x302F 0x9698 # +0x3030 0x978D # +0x3031 0x6C28 # +0x3032 0x5B89 # +0x3033 0x4FFA # +0x3034 0x6309 # +0x3035 0x6697 # +0x3036 0x5CB8 # +0x3037 0x80FA # +0x3038 0x6848 # +0x3039 0x80AE # +0x303A 0x6602 # +0x303B 0x76CE # +0x303C 0x51F9 # +0x303D 0x6556 # +0x303E 0x71AC # +0x303F 0x7FF1 # +0x3040 0x8884 # +0x3041 0x50B2 # +0x3042 0x5965 # +0x3043 0x61CA # +0x3044 0x6FB3 # +0x3045 0x82AD # +0x3046 0x634C # +0x3047 0x6252 # +0x3048 0x53ED # +0x3049 0x5427 # +0x304A 0x7B06 # +0x304B 0x516B # +0x304C 0x75A4 # +0x304D 0x5DF4 # +0x304E 0x62D4 # +0x304F 0x8DCB # +0x3050 0x9776 # +0x3051 0x628A # +0x3052 0x8019 # +0x3053 0x575D # +0x3054 0x9738 # +0x3055 0x7F62 # +0x3056 0x7238 # +0x3057 0x767D # +0x3058 0x67CF # +0x3059 0x767E # +0x305A 0x6446 # +0x305B 0x4F70 # +0x305C 0x8D25 # +0x305D 0x62DC # +0x305E 0x7A17 # +0x305F 0x6591 # +0x3060 0x73ED # +0x3061 0x642C # +0x3062 0x6273 # +0x3063 0x822C # +0x3064 0x9881 # +0x3065 0x677F # +0x3066 0x7248 # +0x3067 0x626E # +0x3068 0x62CC # +0x3069 0x4F34 # +0x306A 0x74E3 # +0x306B 0x534A # +0x306C 0x529E # +0x306D 0x7ECA # +0x306E 0x90A6 # +0x306F 0x5E2E # +0x3070 0x6886 # +0x3071 0x699C # +0x3072 0x8180 # +0x3073 0x7ED1 # +0x3074 0x68D2 # +0x3075 0x78C5 # +0x3076 0x868C # +0x3077 0x9551 # +0x3078 0x508D # +0x3079 0x8C24 # +0x307A 0x82DE # +0x307B 0x80DE # +0x307C 0x5305 # +0x307D 0x8912 # +0x307E 0x5265 # +0x3121 0x8584 # +0x3122 0x96F9 # +0x3123 0x4FDD # +0x3124 0x5821 # +0x3125 0x9971 # +0x3126 0x5B9D # +0x3127 0x62B1 # +0x3128 0x62A5 # +0x3129 0x66B4 # +0x312A 0x8C79 # +0x312B 0x9C8D # +0x312C 0x7206 # +0x312D 0x676F # +0x312E 0x7891 # +0x312F 0x60B2 # +0x3130 0x5351 # +0x3131 0x5317 # +0x3132 0x8F88 # +0x3133 0x80CC # +0x3134 0x8D1D # +0x3135 0x94A1 # +0x3136 0x500D # +0x3137 0x72C8 # +0x3138 0x5907 # +0x3139 0x60EB # +0x313A 0x7119 # +0x313B 0x88AB # +0x313C 0x5954 # +0x313D 0x82EF # +0x313E 0x672C # +0x313F 0x7B28 # +0x3140 0x5D29 # +0x3141 0x7EF7 # +0x3142 0x752D # +0x3143 0x6CF5 # +0x3144 0x8E66 # +0x3145 0x8FF8 # +0x3146 0x903C # +0x3147 0x9F3B # +0x3148 0x6BD4 # +0x3149 0x9119 # +0x314A 0x7B14 # +0x314B 0x5F7C # +0x314C 0x78A7 # +0x314D 0x84D6 # +0x314E 0x853D # +0x314F 0x6BD5 # +0x3150 0x6BD9 # +0x3151 0x6BD6 # +0x3152 0x5E01 # +0x3153 0x5E87 # +0x3154 0x75F9 # +0x3155 0x95ED # +0x3156 0x655D # +0x3157 0x5F0A # +0x3158 0x5FC5 # +0x3159 0x8F9F # +0x315A 0x58C1 # +0x315B 0x81C2 # +0x315C 0x907F # +0x315D 0x965B # +0x315E 0x97AD # +0x315F 0x8FB9 # +0x3160 0x7F16 # +0x3161 0x8D2C # +0x3162 0x6241 # +0x3163 0x4FBF # +0x3164 0x53D8 # +0x3165 0x535E # +0x3166 0x8FA8 # +0x3167 0x8FA9 # +0x3168 0x8FAB # +0x3169 0x904D # +0x316A 0x6807 # +0x316B 0x5F6A # +0x316C 0x8198 # +0x316D 0x8868 # +0x316E 0x9CD6 # +0x316F 0x618B # +0x3170 0x522B # +0x3171 0x762A # +0x3172 0x5F6C # +0x3173 0x658C # +0x3174 0x6FD2 # +0x3175 0x6EE8 # +0x3176 0x5BBE # +0x3177 0x6448 # +0x3178 0x5175 # +0x3179 0x51B0 # +0x317A 0x67C4 # +0x317B 0x4E19 # +0x317C 0x79C9 # +0x317D 0x997C # +0x317E 0x70B3 # +0x3221 0x75C5 # +0x3222 0x5E76 # +0x3223 0x73BB # +0x3224 0x83E0 # +0x3225 0x64AD # +0x3226 0x62E8 # +0x3227 0x94B5 # +0x3228 0x6CE2 # +0x3229 0x535A # +0x322A 0x52C3 # +0x322B 0x640F # +0x322C 0x94C2 # +0x322D 0x7B94 # +0x322E 0x4F2F # +0x322F 0x5E1B # +0x3230 0x8236 # +0x3231 0x8116 # +0x3232 0x818A # +0x3233 0x6E24 # +0x3234 0x6CCA # +0x3235 0x9A73 # +0x3236 0x6355 # +0x3237 0x535C # +0x3238 0x54FA # +0x3239 0x8865 # +0x323A 0x57E0 # +0x323B 0x4E0D # +0x323C 0x5E03 # +0x323D 0x6B65 # +0x323E 0x7C3F # +0x323F 0x90E8 # +0x3240 0x6016 # +0x3241 0x64E6 # +0x3242 0x731C # +0x3243 0x88C1 # +0x3244 0x6750 # +0x3245 0x624D # +0x3246 0x8D22 # +0x3247 0x776C # +0x3248 0x8E29 # +0x3249 0x91C7 # +0x324A 0x5F69 # +0x324B 0x83DC # +0x324C 0x8521 # +0x324D 0x9910 # +0x324E 0x53C2 # +0x324F 0x8695 # +0x3250 0x6B8B # +0x3251 0x60ED # +0x3252 0x60E8 # +0x3253 0x707F # +0x3254 0x82CD # +0x3255 0x8231 # +0x3256 0x4ED3 # +0x3257 0x6CA7 # +0x3258 0x85CF # +0x3259 0x64CD # +0x325A 0x7CD9 # +0x325B 0x69FD # +0x325C 0x66F9 # +0x325D 0x8349 # +0x325E 0x5395 # +0x325F 0x7B56 # +0x3260 0x4FA7 # +0x3261 0x518C # +0x3262 0x6D4B # +0x3263 0x5C42 # +0x3264 0x8E6D # +0x3265 0x63D2 # +0x3266 0x53C9 # +0x3267 0x832C # +0x3268 0x8336 # +0x3269 0x67E5 # +0x326A 0x78B4 # +0x326B 0x643D # +0x326C 0x5BDF # +0x326D 0x5C94 # +0x326E 0x5DEE # +0x326F 0x8BE7 # +0x3270 0x62C6 # +0x3271 0x67F4 # +0x3272 0x8C7A # +0x3273 0x6400 # +0x3274 0x63BA # +0x3275 0x8749 # +0x3276 0x998B # +0x3277 0x8C17 # +0x3278 0x7F20 # +0x3279 0x94F2 # +0x327A 0x4EA7 # +0x327B 0x9610 # +0x327C 0x98A4 # +0x327D 0x660C # +0x327E 0x7316 # +0x3321 0x573A # +0x3322 0x5C1D # +0x3323 0x5E38 # +0x3324 0x957F # +0x3325 0x507F # +0x3326 0x80A0 # +0x3327 0x5382 # +0x3328 0x655E # +0x3329 0x7545 # +0x332A 0x5531 # +0x332B 0x5021 # +0x332C 0x8D85 # +0x332D 0x6284 # +0x332E 0x949E # +0x332F 0x671D # +0x3330 0x5632 # +0x3331 0x6F6E # +0x3332 0x5DE2 # +0x3333 0x5435 # +0x3334 0x7092 # +0x3335 0x8F66 # +0x3336 0x626F # +0x3337 0x64A4 # +0x3338 0x63A3 # +0x3339 0x5F7B # +0x333A 0x6F88 # +0x333B 0x90F4 # +0x333C 0x81E3 # +0x333D 0x8FB0 # +0x333E 0x5C18 # +0x333F 0x6668 # +0x3340 0x5FF1 # +0x3341 0x6C89 # +0x3342 0x9648 # +0x3343 0x8D81 # +0x3344 0x886C # +0x3345 0x6491 # +0x3346 0x79F0 # +0x3347 0x57CE # +0x3348 0x6A59 # +0x3349 0x6210 # +0x334A 0x5448 # +0x334B 0x4E58 # +0x334C 0x7A0B # +0x334D 0x60E9 # +0x334E 0x6F84 # +0x334F 0x8BDA # +0x3350 0x627F # +0x3351 0x901E # +0x3352 0x9A8B # +0x3353 0x79E4 # +0x3354 0x5403 # +0x3355 0x75F4 # +0x3356 0x6301 # +0x3357 0x5319 # +0x3358 0x6C60 # +0x3359 0x8FDF # +0x335A 0x5F1B # +0x335B 0x9A70 # +0x335C 0x803B # +0x335D 0x9F7F # +0x335E 0x4F88 # +0x335F 0x5C3A # +0x3360 0x8D64 # +0x3361 0x7FC5 # +0x3362 0x65A5 # +0x3363 0x70BD # +0x3364 0x5145 # +0x3365 0x51B2 # +0x3366 0x866B # +0x3367 0x5D07 # +0x3368 0x5BA0 # +0x3369 0x62BD # +0x336A 0x916C # +0x336B 0x7574 # +0x336C 0x8E0C # +0x336D 0x7A20 # +0x336E 0x6101 # +0x336F 0x7B79 # +0x3370 0x4EC7 # +0x3371 0x7EF8 # +0x3372 0x7785 # +0x3373 0x4E11 # +0x3374 0x81ED # +0x3375 0x521D # +0x3376 0x51FA # +0x3377 0x6A71 # +0x3378 0x53A8 # +0x3379 0x8E87 # +0x337A 0x9504 # +0x337B 0x96CF # +0x337C 0x6EC1 # +0x337D 0x9664 # +0x337E 0x695A # +0x3421 0x7840 # +0x3422 0x50A8 # +0x3423 0x77D7 # +0x3424 0x6410 # +0x3425 0x89E6 # +0x3426 0x5904 # +0x3427 0x63E3 # +0x3428 0x5DDD # +0x3429 0x7A7F # +0x342A 0x693D # +0x342B 0x4F20 # +0x342C 0x8239 # +0x342D 0x5598 # +0x342E 0x4E32 # +0x342F 0x75AE # +0x3430 0x7A97 # +0x3431 0x5E62 # +0x3432 0x5E8A # +0x3433 0x95EF # +0x3434 0x521B # +0x3435 0x5439 # +0x3436 0x708A # +0x3437 0x6376 # +0x3438 0x9524 # +0x3439 0x5782 # +0x343A 0x6625 # +0x343B 0x693F # +0x343C 0x9187 # +0x343D 0x5507 # +0x343E 0x6DF3 # +0x343F 0x7EAF # +0x3440 0x8822 # +0x3441 0x6233 # +0x3442 0x7EF0 # +0x3443 0x75B5 # +0x3444 0x8328 # +0x3445 0x78C1 # +0x3446 0x96CC # +0x3447 0x8F9E # +0x3448 0x6148 # +0x3449 0x74F7 # +0x344A 0x8BCD # +0x344B 0x6B64 # +0x344C 0x523A # +0x344D 0x8D50 # +0x344E 0x6B21 # +0x344F 0x806A # +0x3450 0x8471 # +0x3451 0x56F1 # +0x3452 0x5306 # +0x3453 0x4ECE # +0x3454 0x4E1B # +0x3455 0x51D1 # +0x3456 0x7C97 # +0x3457 0x918B # +0x3458 0x7C07 # +0x3459 0x4FC3 # +0x345A 0x8E7F # +0x345B 0x7BE1 # +0x345C 0x7A9C # +0x345D 0x6467 # +0x345E 0x5D14 # +0x345F 0x50AC # +0x3460 0x8106 # +0x3461 0x7601 # +0x3462 0x7CB9 # +0x3463 0x6DEC # +0x3464 0x7FE0 # +0x3465 0x6751 # +0x3466 0x5B58 # +0x3467 0x5BF8 # +0x3468 0x78CB # +0x3469 0x64AE # +0x346A 0x6413 # +0x346B 0x63AA # +0x346C 0x632B # +0x346D 0x9519 # +0x346E 0x642D # +0x346F 0x8FBE # +0x3470 0x7B54 # +0x3471 0x7629 # +0x3472 0x6253 # +0x3473 0x5927 # +0x3474 0x5446 # +0x3475 0x6B79 # +0x3476 0x50A3 # +0x3477 0x6234 # +0x3478 0x5E26 # +0x3479 0x6B86 # +0x347A 0x4EE3 # +0x347B 0x8D37 # +0x347C 0x888B # +0x347D 0x5F85 # +0x347E 0x902E # +0x3521 0x6020 # +0x3522 0x803D # +0x3523 0x62C5 # +0x3524 0x4E39 # +0x3525 0x5355 # +0x3526 0x90F8 # +0x3527 0x63B8 # +0x3528 0x80C6 # +0x3529 0x65E6 # +0x352A 0x6C2E # +0x352B 0x4F46 # +0x352C 0x60EE # +0x352D 0x6DE1 # +0x352E 0x8BDE # +0x352F 0x5F39 # +0x3530 0x86CB # +0x3531 0x5F53 # +0x3532 0x6321 # +0x3533 0x515A # +0x3534 0x8361 # +0x3535 0x6863 # +0x3536 0x5200 # +0x3537 0x6363 # +0x3538 0x8E48 # +0x3539 0x5012 # +0x353A 0x5C9B # +0x353B 0x7977 # +0x353C 0x5BFC # +0x353D 0x5230 # +0x353E 0x7A3B # +0x353F 0x60BC # +0x3540 0x9053 # +0x3541 0x76D7 # +0x3542 0x5FB7 # +0x3543 0x5F97 # +0x3544 0x7684 # +0x3545 0x8E6C # +0x3546 0x706F # +0x3547 0x767B # +0x3548 0x7B49 # +0x3549 0x77AA # +0x354A 0x51F3 # +0x354B 0x9093 # +0x354C 0x5824 # +0x354D 0x4F4E # +0x354E 0x6EF4 # +0x354F 0x8FEA # +0x3550 0x654C # +0x3551 0x7B1B # +0x3552 0x72C4 # +0x3553 0x6DA4 # +0x3554 0x7FDF # +0x3555 0x5AE1 # +0x3556 0x62B5 # +0x3557 0x5E95 # +0x3558 0x5730 # +0x3559 0x8482 # +0x355A 0x7B2C # +0x355B 0x5E1D # +0x355C 0x5F1F # +0x355D 0x9012 # +0x355E 0x7F14 # +0x355F 0x98A0 # +0x3560 0x6382 # +0x3561 0x6EC7 # +0x3562 0x7898 # +0x3563 0x70B9 # +0x3564 0x5178 # +0x3565 0x975B # +0x3566 0x57AB # +0x3567 0x7535 # +0x3568 0x4F43 # +0x3569 0x7538 # +0x356A 0x5E97 # +0x356B 0x60E6 # +0x356C 0x5960 # +0x356D 0x6DC0 # +0x356E 0x6BBF # +0x356F 0x7889 # +0x3570 0x53FC # +0x3571 0x96D5 # +0x3572 0x51CB # +0x3573 0x5201 # +0x3574 0x6389 # +0x3575 0x540A # +0x3576 0x9493 # +0x3577 0x8C03 # +0x3578 0x8DCC # +0x3579 0x7239 # +0x357A 0x789F # +0x357B 0x8776 # +0x357C 0x8FED # +0x357D 0x8C0D # +0x357E 0x53E0 # +0x3621 0x4E01 # +0x3622 0x76EF # +0x3623 0x53EE # +0x3624 0x9489 # +0x3625 0x9876 # +0x3626 0x9F0E # +0x3627 0x952D # +0x3628 0x5B9A # +0x3629 0x8BA2 # +0x362A 0x4E22 # +0x362B 0x4E1C # +0x362C 0x51AC # +0x362D 0x8463 # +0x362E 0x61C2 # +0x362F 0x52A8 # +0x3630 0x680B # +0x3631 0x4F97 # +0x3632 0x606B # +0x3633 0x51BB # +0x3634 0x6D1E # +0x3635 0x515C # +0x3636 0x6296 # +0x3637 0x6597 # +0x3638 0x9661 # +0x3639 0x8C46 # +0x363A 0x9017 # +0x363B 0x75D8 # +0x363C 0x90FD # +0x363D 0x7763 # +0x363E 0x6BD2 # +0x363F 0x728A # +0x3640 0x72EC # +0x3641 0x8BFB # +0x3642 0x5835 # +0x3643 0x7779 # +0x3644 0x8D4C # +0x3645 0x675C # +0x3646 0x9540 # +0x3647 0x809A # +0x3648 0x5EA6 # +0x3649 0x6E21 # +0x364A 0x5992 # +0x364B 0x7AEF # +0x364C 0x77ED # +0x364D 0x953B # +0x364E 0x6BB5 # +0x364F 0x65AD # +0x3650 0x7F0E # +0x3651 0x5806 # +0x3652 0x5151 # +0x3653 0x961F # +0x3654 0x5BF9 # +0x3655 0x58A9 # +0x3656 0x5428 # +0x3657 0x8E72 # +0x3658 0x6566 # +0x3659 0x987F # +0x365A 0x56E4 # +0x365B 0x949D # +0x365C 0x76FE # +0x365D 0x9041 # +0x365E 0x6387 # +0x365F 0x54C6 # +0x3660 0x591A # +0x3661 0x593A # +0x3662 0x579B # +0x3663 0x8EB2 # +0x3664 0x6735 # +0x3665 0x8DFA # +0x3666 0x8235 # +0x3667 0x5241 # +0x3668 0x60F0 # +0x3669 0x5815 # +0x366A 0x86FE # +0x366B 0x5CE8 # +0x366C 0x9E45 # +0x366D 0x4FC4 # +0x366E 0x989D # +0x366F 0x8BB9 # +0x3670 0x5A25 # +0x3671 0x6076 # +0x3672 0x5384 # +0x3673 0x627C # +0x3674 0x904F # +0x3675 0x9102 # +0x3676 0x997F # +0x3677 0x6069 # +0x3678 0x800C # +0x3679 0x513F # +0x367A 0x8033 # +0x367B 0x5C14 # +0x367C 0x9975 # +0x367D 0x6D31 # +0x367E 0x4E8C # +0x3721 0x8D30 # +0x3722 0x53D1 # +0x3723 0x7F5A # +0x3724 0x7B4F # +0x3725 0x4F10 # +0x3726 0x4E4F # +0x3727 0x9600 # +0x3728 0x6CD5 # +0x3729 0x73D0 # +0x372A 0x85E9 # +0x372B 0x5E06 # +0x372C 0x756A # +0x372D 0x7FFB # +0x372E 0x6A0A # +0x372F 0x77FE # +0x3730 0x9492 # +0x3731 0x7E41 # +0x3732 0x51E1 # +0x3733 0x70E6 # +0x3734 0x53CD # +0x3735 0x8FD4 # +0x3736 0x8303 # +0x3737 0x8D29 # +0x3738 0x72AF # +0x3739 0x996D # +0x373A 0x6CDB # +0x373B 0x574A # +0x373C 0x82B3 # +0x373D 0x65B9 # +0x373E 0x80AA # +0x373F 0x623F # +0x3740 0x9632 # +0x3741 0x59A8 # +0x3742 0x4EFF # +0x3743 0x8BBF # +0x3744 0x7EBA # +0x3745 0x653E # +0x3746 0x83F2 # +0x3747 0x975E # +0x3748 0x5561 # +0x3749 0x98DE # +0x374A 0x80A5 # +0x374B 0x532A # +0x374C 0x8BFD # +0x374D 0x5420 # +0x374E 0x80BA # +0x374F 0x5E9F # +0x3750 0x6CB8 # +0x3751 0x8D39 # +0x3752 0x82AC # +0x3753 0x915A # +0x3754 0x5429 # +0x3755 0x6C1B # +0x3756 0x5206 # +0x3757 0x7EB7 # +0x3758 0x575F # +0x3759 0x711A # +0x375A 0x6C7E # +0x375B 0x7C89 # +0x375C 0x594B # +0x375D 0x4EFD # +0x375E 0x5FFF # +0x375F 0x6124 # +0x3760 0x7CAA # +0x3761 0x4E30 # +0x3762 0x5C01 # +0x3763 0x67AB # +0x3764 0x8702 # +0x3765 0x5CF0 # +0x3766 0x950B # +0x3767 0x98CE # +0x3768 0x75AF # +0x3769 0x70FD # +0x376A 0x9022 # +0x376B 0x51AF # +0x376C 0x7F1D # +0x376D 0x8BBD # +0x376E 0x5949 # +0x376F 0x51E4 # +0x3770 0x4F5B # +0x3771 0x5426 # +0x3772 0x592B # +0x3773 0x6577 # +0x3774 0x80A4 # +0x3775 0x5B75 # +0x3776 0x6276 # +0x3777 0x62C2 # +0x3778 0x8F90 # +0x3779 0x5E45 # +0x377A 0x6C1F # +0x377B 0x7B26 # +0x377C 0x4F0F # +0x377D 0x4FD8 # +0x377E 0x670D # +0x3821 0x6D6E # +0x3822 0x6DAA # +0x3823 0x798F # +0x3824 0x88B1 # +0x3825 0x5F17 # +0x3826 0x752B # +0x3827 0x629A # +0x3828 0x8F85 # +0x3829 0x4FEF # +0x382A 0x91DC # +0x382B 0x65A7 # +0x382C 0x812F # +0x382D 0x8151 # +0x382E 0x5E9C # +0x382F 0x8150 # +0x3830 0x8D74 # +0x3831 0x526F # +0x3832 0x8986 # +0x3833 0x8D4B # +0x3834 0x590D # +0x3835 0x5085 # +0x3836 0x4ED8 # +0x3837 0x961C # +0x3838 0x7236 # +0x3839 0x8179 # +0x383A 0x8D1F # +0x383B 0x5BCC # +0x383C 0x8BA3 # +0x383D 0x9644 # +0x383E 0x5987 # +0x383F 0x7F1A # +0x3840 0x5490 # +0x3841 0x5676 # +0x3842 0x560E # +0x3843 0x8BE5 # +0x3844 0x6539 # +0x3845 0x6982 # +0x3846 0x9499 # +0x3847 0x76D6 # +0x3848 0x6E89 # +0x3849 0x5E72 # +0x384A 0x7518 # +0x384B 0x6746 # +0x384C 0x67D1 # +0x384D 0x7AFF # +0x384E 0x809D # +0x384F 0x8D76 # +0x3850 0x611F # +0x3851 0x79C6 # +0x3852 0x6562 # +0x3853 0x8D63 # +0x3854 0x5188 # +0x3855 0x521A # +0x3856 0x94A2 # +0x3857 0x7F38 # +0x3858 0x809B # +0x3859 0x7EB2 # +0x385A 0x5C97 # +0x385B 0x6E2F # +0x385C 0x6760 # +0x385D 0x7BD9 # +0x385E 0x768B # +0x385F 0x9AD8 # +0x3860 0x818F # +0x3861 0x7F94 # +0x3862 0x7CD5 # +0x3863 0x641E # +0x3864 0x9550 # +0x3865 0x7A3F # +0x3866 0x544A # +0x3867 0x54E5 # +0x3868 0x6B4C # +0x3869 0x6401 # +0x386A 0x6208 # +0x386B 0x9E3D # +0x386C 0x80F3 # +0x386D 0x7599 # +0x386E 0x5272 # +0x386F 0x9769 # +0x3870 0x845B # +0x3871 0x683C # +0x3872 0x86E4 # +0x3873 0x9601 # +0x3874 0x9694 # +0x3875 0x94EC # +0x3876 0x4E2A # +0x3877 0x5404 # +0x3878 0x7ED9 # +0x3879 0x6839 # +0x387A 0x8DDF # +0x387B 0x8015 # +0x387C 0x66F4 # +0x387D 0x5E9A # +0x387E 0x7FB9 # +0x3921 0x57C2 # +0x3922 0x803F # +0x3923 0x6897 # +0x3924 0x5DE5 # +0x3925 0x653B # +0x3926 0x529F # +0x3927 0x606D # +0x3928 0x9F9A # +0x3929 0x4F9B # +0x392A 0x8EAC # +0x392B 0x516C # +0x392C 0x5BAB # +0x392D 0x5F13 # +0x392E 0x5DE9 # +0x392F 0x6C5E # +0x3930 0x62F1 # +0x3931 0x8D21 # +0x3932 0x5171 # +0x3933 0x94A9 # +0x3934 0x52FE # +0x3935 0x6C9F # +0x3936 0x82DF # +0x3937 0x72D7 # +0x3938 0x57A2 # +0x3939 0x6784 # +0x393A 0x8D2D # +0x393B 0x591F # +0x393C 0x8F9C # +0x393D 0x83C7 # +0x393E 0x5495 # +0x393F 0x7B8D # +0x3940 0x4F30 # +0x3941 0x6CBD # +0x3942 0x5B64 # +0x3943 0x59D1 # +0x3944 0x9F13 # +0x3945 0x53E4 # +0x3946 0x86CA # +0x3947 0x9AA8 # +0x3948 0x8C37 # +0x3949 0x80A1 # +0x394A 0x6545 # +0x394B 0x987E # +0x394C 0x56FA # +0x394D 0x96C7 # +0x394E 0x522E # +0x394F 0x74DC # +0x3950 0x5250 # +0x3951 0x5BE1 # +0x3952 0x6302 # +0x3953 0x8902 # +0x3954 0x4E56 # +0x3955 0x62D0 # +0x3956 0x602A # +0x3957 0x68FA # +0x3958 0x5173 # +0x3959 0x5B98 # +0x395A 0x51A0 # +0x395B 0x89C2 # +0x395C 0x7BA1 # +0x395D 0x9986 # +0x395E 0x7F50 # +0x395F 0x60EF # +0x3960 0x704C # +0x3961 0x8D2F # +0x3962 0x5149 # +0x3963 0x5E7F # +0x3964 0x901B # +0x3965 0x7470 # +0x3966 0x89C4 # +0x3967 0x572D # +0x3968 0x7845 # +0x3969 0x5F52 # +0x396A 0x9F9F # +0x396B 0x95FA # +0x396C 0x8F68 # +0x396D 0x9B3C # +0x396E 0x8BE1 # +0x396F 0x7678 # +0x3970 0x6842 # +0x3971 0x67DC # +0x3972 0x8DEA # +0x3973 0x8D35 # +0x3974 0x523D # +0x3975 0x8F8A # +0x3976 0x6EDA # +0x3977 0x68CD # +0x3978 0x9505 # +0x3979 0x90ED # +0x397A 0x56FD # +0x397B 0x679C # +0x397C 0x88F9 # +0x397D 0x8FC7 # +0x397E 0x54C8 # +0x3A21 0x9AB8 # +0x3A22 0x5B69 # +0x3A23 0x6D77 # +0x3A24 0x6C26 # +0x3A25 0x4EA5 # +0x3A26 0x5BB3 # +0x3A27 0x9A87 # +0x3A28 0x9163 # +0x3A29 0x61A8 # +0x3A2A 0x90AF # +0x3A2B 0x97E9 # +0x3A2C 0x542B # +0x3A2D 0x6DB5 # +0x3A2E 0x5BD2 # +0x3A2F 0x51FD # +0x3A30 0x558A # +0x3A31 0x7F55 # +0x3A32 0x7FF0 # +0x3A33 0x64BC # +0x3A34 0x634D # +0x3A35 0x65F1 # +0x3A36 0x61BE # +0x3A37 0x608D # +0x3A38 0x710A # +0x3A39 0x6C57 # +0x3A3A 0x6C49 # +0x3A3B 0x592F # +0x3A3C 0x676D # +0x3A3D 0x822A # +0x3A3E 0x58D5 # +0x3A3F 0x568E # +0x3A40 0x8C6A # +0x3A41 0x6BEB # +0x3A42 0x90DD # +0x3A43 0x597D # +0x3A44 0x8017 # +0x3A45 0x53F7 # +0x3A46 0x6D69 # +0x3A47 0x5475 # +0x3A48 0x559D # +0x3A49 0x8377 # +0x3A4A 0x83CF # +0x3A4B 0x6838 # +0x3A4C 0x79BE # +0x3A4D 0x548C # +0x3A4E 0x4F55 # +0x3A4F 0x5408 # +0x3A50 0x76D2 # +0x3A51 0x8C89 # +0x3A52 0x9602 # +0x3A53 0x6CB3 # +0x3A54 0x6DB8 # +0x3A55 0x8D6B # +0x3A56 0x8910 # +0x3A57 0x9E64 # +0x3A58 0x8D3A # +0x3A59 0x563F # +0x3A5A 0x9ED1 # +0x3A5B 0x75D5 # +0x3A5C 0x5F88 # +0x3A5D 0x72E0 # +0x3A5E 0x6068 # +0x3A5F 0x54FC # +0x3A60 0x4EA8 # +0x3A61 0x6A2A # +0x3A62 0x8861 # +0x3A63 0x6052 # +0x3A64 0x8F70 # +0x3A65 0x54C4 # +0x3A66 0x70D8 # +0x3A67 0x8679 # +0x3A68 0x9E3F # +0x3A69 0x6D2A # +0x3A6A 0x5B8F # +0x3A6B 0x5F18 # +0x3A6C 0x7EA2 # +0x3A6D 0x5589 # +0x3A6E 0x4FAF # +0x3A6F 0x7334 # +0x3A70 0x543C # +0x3A71 0x539A # +0x3A72 0x5019 # +0x3A73 0x540E # +0x3A74 0x547C # +0x3A75 0x4E4E # +0x3A76 0x5FFD # +0x3A77 0x745A # +0x3A78 0x58F6 # +0x3A79 0x846B # +0x3A7A 0x80E1 # +0x3A7B 0x8774 # +0x3A7C 0x72D0 # +0x3A7D 0x7CCA # +0x3A7E 0x6E56 # +0x3B21 0x5F27 # +0x3B22 0x864E # +0x3B23 0x552C # +0x3B24 0x62A4 # +0x3B25 0x4E92 # +0x3B26 0x6CAA # +0x3B27 0x6237 # +0x3B28 0x82B1 # +0x3B29 0x54D7 # +0x3B2A 0x534E # +0x3B2B 0x733E # +0x3B2C 0x6ED1 # +0x3B2D 0x753B # +0x3B2E 0x5212 # +0x3B2F 0x5316 # +0x3B30 0x8BDD # +0x3B31 0x69D0 # +0x3B32 0x5F8A # +0x3B33 0x6000 # +0x3B34 0x6DEE # +0x3B35 0x574F # +0x3B36 0x6B22 # +0x3B37 0x73AF # +0x3B38 0x6853 # +0x3B39 0x8FD8 # +0x3B3A 0x7F13 # +0x3B3B 0x6362 # +0x3B3C 0x60A3 # +0x3B3D 0x5524 # +0x3B3E 0x75EA # +0x3B3F 0x8C62 # +0x3B40 0x7115 # +0x3B41 0x6DA3 # +0x3B42 0x5BA6 # +0x3B43 0x5E7B # +0x3B44 0x8352 # +0x3B45 0x614C # +0x3B46 0x9EC4 # +0x3B47 0x78FA # +0x3B48 0x8757 # +0x3B49 0x7C27 # +0x3B4A 0x7687 # +0x3B4B 0x51F0 # +0x3B4C 0x60F6 # +0x3B4D 0x714C # +0x3B4E 0x6643 # +0x3B4F 0x5E4C # +0x3B50 0x604D # +0x3B51 0x8C0E # +0x3B52 0x7070 # +0x3B53 0x6325 # +0x3B54 0x8F89 # +0x3B55 0x5FBD # +0x3B56 0x6062 # +0x3B57 0x86D4 # +0x3B58 0x56DE # +0x3B59 0x6BC1 # +0x3B5A 0x6094 # +0x3B5B 0x6167 # +0x3B5C 0x5349 # +0x3B5D 0x60E0 # +0x3B5E 0x6666 # +0x3B5F 0x8D3F # +0x3B60 0x79FD # +0x3B61 0x4F1A # +0x3B62 0x70E9 # +0x3B63 0x6C47 # +0x3B64 0x8BB3 # +0x3B65 0x8BF2 # +0x3B66 0x7ED8 # +0x3B67 0x8364 # +0x3B68 0x660F # +0x3B69 0x5A5A # +0x3B6A 0x9B42 # +0x3B6B 0x6D51 # +0x3B6C 0x6DF7 # +0x3B6D 0x8C41 # +0x3B6E 0x6D3B # +0x3B6F 0x4F19 # +0x3B70 0x706B # +0x3B71 0x83B7 # +0x3B72 0x6216 # +0x3B73 0x60D1 # +0x3B74 0x970D # +0x3B75 0x8D27 # +0x3B76 0x7978 # +0x3B77 0x51FB # +0x3B78 0x573E # +0x3B79 0x57FA # +0x3B7A 0x673A # +0x3B7B 0x7578 # +0x3B7C 0x7A3D # +0x3B7D 0x79EF # +0x3B7E 0x7B95 # +0x3C21 0x808C # +0x3C22 0x9965 # +0x3C23 0x8FF9 # +0x3C24 0x6FC0 # +0x3C25 0x8BA5 # +0x3C26 0x9E21 # +0x3C27 0x59EC # +0x3C28 0x7EE9 # +0x3C29 0x7F09 # +0x3C2A 0x5409 # +0x3C2B 0x6781 # +0x3C2C 0x68D8 # +0x3C2D 0x8F91 # +0x3C2E 0x7C4D # +0x3C2F 0x96C6 # +0x3C30 0x53CA # +0x3C31 0x6025 # +0x3C32 0x75BE # +0x3C33 0x6C72 # +0x3C34 0x5373 # +0x3C35 0x5AC9 # +0x3C36 0x7EA7 # +0x3C37 0x6324 # +0x3C38 0x51E0 # +0x3C39 0x810A # +0x3C3A 0x5DF1 # +0x3C3B 0x84DF # +0x3C3C 0x6280 # +0x3C3D 0x5180 # +0x3C3E 0x5B63 # +0x3C3F 0x4F0E # +0x3C40 0x796D # +0x3C41 0x5242 # +0x3C42 0x60B8 # +0x3C43 0x6D4E # +0x3C44 0x5BC4 # +0x3C45 0x5BC2 # +0x3C46 0x8BA1 # +0x3C47 0x8BB0 # +0x3C48 0x65E2 # +0x3C49 0x5FCC # +0x3C4A 0x9645 # +0x3C4B 0x5993 # +0x3C4C 0x7EE7 # +0x3C4D 0x7EAA # +0x3C4E 0x5609 # +0x3C4F 0x67B7 # +0x3C50 0x5939 # +0x3C51 0x4F73 # +0x3C52 0x5BB6 # +0x3C53 0x52A0 # +0x3C54 0x835A # +0x3C55 0x988A # +0x3C56 0x8D3E # +0x3C57 0x7532 # +0x3C58 0x94BE # +0x3C59 0x5047 # +0x3C5A 0x7A3C # +0x3C5B 0x4EF7 # +0x3C5C 0x67B6 # +0x3C5D 0x9A7E # +0x3C5E 0x5AC1 # +0x3C5F 0x6B7C # +0x3C60 0x76D1 # +0x3C61 0x575A # +0x3C62 0x5C16 # +0x3C63 0x7B3A # +0x3C64 0x95F4 # +0x3C65 0x714E # +0x3C66 0x517C # +0x3C67 0x80A9 # +0x3C68 0x8270 # +0x3C69 0x5978 # +0x3C6A 0x7F04 # +0x3C6B 0x8327 # +0x3C6C 0x68C0 # +0x3C6D 0x67EC # +0x3C6E 0x78B1 # +0x3C6F 0x7877 # +0x3C70 0x62E3 # +0x3C71 0x6361 # +0x3C72 0x7B80 # +0x3C73 0x4FED # +0x3C74 0x526A # +0x3C75 0x51CF # +0x3C76 0x8350 # +0x3C77 0x69DB # +0x3C78 0x9274 # +0x3C79 0x8DF5 # +0x3C7A 0x8D31 # +0x3C7B 0x89C1 # +0x3C7C 0x952E # +0x3C7D 0x7BAD # +0x3C7E 0x4EF6 # +0x3D21 0x5065 # +0x3D22 0x8230 # +0x3D23 0x5251 # +0x3D24 0x996F # +0x3D25 0x6E10 # +0x3D26 0x6E85 # +0x3D27 0x6DA7 # +0x3D28 0x5EFA # +0x3D29 0x50F5 # +0x3D2A 0x59DC # +0x3D2B 0x5C06 # +0x3D2C 0x6D46 # +0x3D2D 0x6C5F # +0x3D2E 0x7586 # +0x3D2F 0x848B # +0x3D30 0x6868 # +0x3D31 0x5956 # +0x3D32 0x8BB2 # +0x3D33 0x5320 # +0x3D34 0x9171 # +0x3D35 0x964D # +0x3D36 0x8549 # +0x3D37 0x6912 # +0x3D38 0x7901 # +0x3D39 0x7126 # +0x3D3A 0x80F6 # +0x3D3B 0x4EA4 # +0x3D3C 0x90CA # +0x3D3D 0x6D47 # +0x3D3E 0x9A84 # +0x3D3F 0x5A07 # +0x3D40 0x56BC # +0x3D41 0x6405 # +0x3D42 0x94F0 # +0x3D43 0x77EB # +0x3D44 0x4FA5 # +0x3D45 0x811A # +0x3D46 0x72E1 # +0x3D47 0x89D2 # +0x3D48 0x997A # +0x3D49 0x7F34 # +0x3D4A 0x7EDE # +0x3D4B 0x527F # +0x3D4C 0x6559 # +0x3D4D 0x9175 # +0x3D4E 0x8F7F # +0x3D4F 0x8F83 # +0x3D50 0x53EB # +0x3D51 0x7A96 # +0x3D52 0x63ED # +0x3D53 0x63A5 # +0x3D54 0x7686 # +0x3D55 0x79F8 # +0x3D56 0x8857 # +0x3D57 0x9636 # +0x3D58 0x622A # +0x3D59 0x52AB # +0x3D5A 0x8282 # +0x3D5B 0x6854 # +0x3D5C 0x6770 # +0x3D5D 0x6377 # +0x3D5E 0x776B # +0x3D5F 0x7AED # +0x3D60 0x6D01 # +0x3D61 0x7ED3 # +0x3D62 0x89E3 # +0x3D63 0x59D0 # +0x3D64 0x6212 # +0x3D65 0x85C9 # +0x3D66 0x82A5 # +0x3D67 0x754C # +0x3D68 0x501F # +0x3D69 0x4ECB # +0x3D6A 0x75A5 # +0x3D6B 0x8BEB # +0x3D6C 0x5C4A # +0x3D6D 0x5DFE # +0x3D6E 0x7B4B # +0x3D6F 0x65A4 # +0x3D70 0x91D1 # +0x3D71 0x4ECA # +0x3D72 0x6D25 # +0x3D73 0x895F # +0x3D74 0x7D27 # +0x3D75 0x9526 # +0x3D76 0x4EC5 # +0x3D77 0x8C28 # +0x3D78 0x8FDB # +0x3D79 0x9773 # +0x3D7A 0x664B # +0x3D7B 0x7981 # +0x3D7C 0x8FD1 # +0x3D7D 0x70EC # +0x3D7E 0x6D78 # +0x3E21 0x5C3D # +0x3E22 0x52B2 # +0x3E23 0x8346 # +0x3E24 0x5162 # +0x3E25 0x830E # +0x3E26 0x775B # +0x3E27 0x6676 # +0x3E28 0x9CB8 # +0x3E29 0x4EAC # +0x3E2A 0x60CA # +0x3E2B 0x7CBE # +0x3E2C 0x7CB3 # +0x3E2D 0x7ECF # +0x3E2E 0x4E95 # +0x3E2F 0x8B66 # +0x3E30 0x666F # +0x3E31 0x9888 # +0x3E32 0x9759 # +0x3E33 0x5883 # +0x3E34 0x656C # +0x3E35 0x955C # +0x3E36 0x5F84 # +0x3E37 0x75C9 # +0x3E38 0x9756 # +0x3E39 0x7ADF # +0x3E3A 0x7ADE # +0x3E3B 0x51C0 # +0x3E3C 0x70AF # +0x3E3D 0x7A98 # +0x3E3E 0x63EA # +0x3E3F 0x7A76 # +0x3E40 0x7EA0 # +0x3E41 0x7396 # +0x3E42 0x97ED # +0x3E43 0x4E45 # +0x3E44 0x7078 # +0x3E45 0x4E5D # +0x3E46 0x9152 # +0x3E47 0x53A9 # +0x3E48 0x6551 # +0x3E49 0x65E7 # +0x3E4A 0x81FC # +0x3E4B 0x8205 # +0x3E4C 0x548E # +0x3E4D 0x5C31 # +0x3E4E 0x759A # +0x3E4F 0x97A0 # +0x3E50 0x62D8 # +0x3E51 0x72D9 # +0x3E52 0x75BD # +0x3E53 0x5C45 # +0x3E54 0x9A79 # +0x3E55 0x83CA # +0x3E56 0x5C40 # +0x3E57 0x5480 # +0x3E58 0x77E9 # +0x3E59 0x4E3E # +0x3E5A 0x6CAE # +0x3E5B 0x805A # +0x3E5C 0x62D2 # +0x3E5D 0x636E # +0x3E5E 0x5DE8 # +0x3E5F 0x5177 # +0x3E60 0x8DDD # +0x3E61 0x8E1E # +0x3E62 0x952F # +0x3E63 0x4FF1 # +0x3E64 0x53E5 # +0x3E65 0x60E7 # +0x3E66 0x70AC # +0x3E67 0x5267 # +0x3E68 0x6350 # +0x3E69 0x9E43 # +0x3E6A 0x5A1F # +0x3E6B 0x5026 # +0x3E6C 0x7737 # +0x3E6D 0x5377 # +0x3E6E 0x7EE2 # +0x3E6F 0x6485 # +0x3E70 0x652B # +0x3E71 0x6289 # +0x3E72 0x6398 # +0x3E73 0x5014 # +0x3E74 0x7235 # +0x3E75 0x89C9 # +0x3E76 0x51B3 # +0x3E77 0x8BC0 # +0x3E78 0x7EDD # +0x3E79 0x5747 # +0x3E7A 0x83CC # +0x3E7B 0x94A7 # +0x3E7C 0x519B # +0x3E7D 0x541B # +0x3E7E 0x5CFB # +0x3F21 0x4FCA # +0x3F22 0x7AE3 # +0x3F23 0x6D5A # +0x3F24 0x90E1 # +0x3F25 0x9A8F # +0x3F26 0x5580 # +0x3F27 0x5496 # +0x3F28 0x5361 # +0x3F29 0x54AF # +0x3F2A 0x5F00 # +0x3F2B 0x63E9 # +0x3F2C 0x6977 # +0x3F2D 0x51EF # +0x3F2E 0x6168 # +0x3F2F 0x520A # +0x3F30 0x582A # +0x3F31 0x52D8 # +0x3F32 0x574E # +0x3F33 0x780D # +0x3F34 0x770B # +0x3F35 0x5EB7 # +0x3F36 0x6177 # +0x3F37 0x7CE0 # +0x3F38 0x625B # +0x3F39 0x6297 # +0x3F3A 0x4EA2 # +0x3F3B 0x7095 # +0x3F3C 0x8003 # +0x3F3D 0x62F7 # +0x3F3E 0x70E4 # +0x3F3F 0x9760 # +0x3F40 0x5777 # +0x3F41 0x82DB # +0x3F42 0x67EF # +0x3F43 0x68F5 # +0x3F44 0x78D5 # +0x3F45 0x9897 # +0x3F46 0x79D1 # +0x3F47 0x58F3 # +0x3F48 0x54B3 # +0x3F49 0x53EF # +0x3F4A 0x6E34 # +0x3F4B 0x514B # +0x3F4C 0x523B # +0x3F4D 0x5BA2 # +0x3F4E 0x8BFE # +0x3F4F 0x80AF # +0x3F50 0x5543 # +0x3F51 0x57A6 # +0x3F52 0x6073 # +0x3F53 0x5751 # +0x3F54 0x542D # +0x3F55 0x7A7A # +0x3F56 0x6050 # +0x3F57 0x5B54 # +0x3F58 0x63A7 # +0x3F59 0x62A0 # +0x3F5A 0x53E3 # +0x3F5B 0x6263 # +0x3F5C 0x5BC7 # +0x3F5D 0x67AF # +0x3F5E 0x54ED # +0x3F5F 0x7A9F # +0x3F60 0x82E6 # +0x3F61 0x9177 # +0x3F62 0x5E93 # +0x3F63 0x88E4 # +0x3F64 0x5938 # +0x3F65 0x57AE # +0x3F66 0x630E # +0x3F67 0x8DE8 # +0x3F68 0x80EF # +0x3F69 0x5757 # +0x3F6A 0x7B77 # +0x3F6B 0x4FA9 # +0x3F6C 0x5FEB # +0x3F6D 0x5BBD # +0x3F6E 0x6B3E # +0x3F6F 0x5321 # +0x3F70 0x7B50 # +0x3F71 0x72C2 # +0x3F72 0x6846 # +0x3F73 0x77FF # +0x3F74 0x7736 # +0x3F75 0x65F7 # +0x3F76 0x51B5 # +0x3F77 0x4E8F # +0x3F78 0x76D4 # +0x3F79 0x5CBF # +0x3F7A 0x7AA5 # +0x3F7B 0x8475 # +0x3F7C 0x594E # +0x3F7D 0x9B41 # +0x3F7E 0x5080 # +0x4021 0x9988 # +0x4022 0x6127 # +0x4023 0x6E83 # +0x4024 0x5764 # +0x4025 0x6606 # +0x4026 0x6346 # +0x4027 0x56F0 # +0x4028 0x62EC # +0x4029 0x6269 # +0x402A 0x5ED3 # +0x402B 0x9614 # +0x402C 0x5783 # +0x402D 0x62C9 # +0x402E 0x5587 # +0x402F 0x8721 # +0x4030 0x814A # +0x4031 0x8FA3 # +0x4032 0x5566 # +0x4033 0x83B1 # +0x4034 0x6765 # +0x4035 0x8D56 # +0x4036 0x84DD # +0x4037 0x5A6A # +0x4038 0x680F # +0x4039 0x62E6 # +0x403A 0x7BEE # +0x403B 0x9611 # +0x403C 0x5170 # +0x403D 0x6F9C # +0x403E 0x8C30 # +0x403F 0x63FD # +0x4040 0x89C8 # +0x4041 0x61D2 # +0x4042 0x7F06 # +0x4043 0x70C2 # +0x4044 0x6EE5 # +0x4045 0x7405 # +0x4046 0x6994 # +0x4047 0x72FC # +0x4048 0x5ECA # +0x4049 0x90CE # +0x404A 0x6717 # +0x404B 0x6D6A # +0x404C 0x635E # +0x404D 0x52B3 # +0x404E 0x7262 # +0x404F 0x8001 # +0x4050 0x4F6C # +0x4051 0x59E5 # +0x4052 0x916A # +0x4053 0x70D9 # +0x4054 0x6D9D # +0x4055 0x52D2 # +0x4056 0x4E50 # +0x4057 0x96F7 # +0x4058 0x956D # +0x4059 0x857E # +0x405A 0x78CA # +0x405B 0x7D2F # +0x405C 0x5121 # +0x405D 0x5792 # +0x405E 0x64C2 # +0x405F 0x808B # +0x4060 0x7C7B # +0x4061 0x6CEA # +0x4062 0x68F1 # +0x4063 0x695E # +0x4064 0x51B7 # +0x4065 0x5398 # +0x4066 0x68A8 # +0x4067 0x7281 # +0x4068 0x9ECE # +0x4069 0x7BF1 # +0x406A 0x72F8 # +0x406B 0x79BB # +0x406C 0x6F13 # +0x406D 0x7406 # +0x406E 0x674E # +0x406F 0x91CC # +0x4070 0x9CA4 # +0x4071 0x793C # +0x4072 0x8389 # +0x4073 0x8354 # +0x4074 0x540F # +0x4075 0x6817 # +0x4076 0x4E3D # +0x4077 0x5389 # +0x4078 0x52B1 # +0x4079 0x783E # +0x407A 0x5386 # +0x407B 0x5229 # +0x407C 0x5088 # +0x407D 0x4F8B # +0x407E 0x4FD0 # +0x4121 0x75E2 # +0x4122 0x7ACB # +0x4123 0x7C92 # +0x4124 0x6CA5 # +0x4125 0x96B6 # +0x4126 0x529B # +0x4127 0x7483 # +0x4128 0x54E9 # +0x4129 0x4FE9 # +0x412A 0x8054 # +0x412B 0x83B2 # +0x412C 0x8FDE # +0x412D 0x9570 # +0x412E 0x5EC9 # +0x412F 0x601C # +0x4130 0x6D9F # +0x4131 0x5E18 # +0x4132 0x655B # +0x4133 0x8138 # +0x4134 0x94FE # +0x4135 0x604B # +0x4136 0x70BC # +0x4137 0x7EC3 # +0x4138 0x7CAE # +0x4139 0x51C9 # +0x413A 0x6881 # +0x413B 0x7CB1 # +0x413C 0x826F # +0x413D 0x4E24 # +0x413E 0x8F86 # +0x413F 0x91CF # +0x4140 0x667E # +0x4141 0x4EAE # +0x4142 0x8C05 # +0x4143 0x64A9 # +0x4144 0x804A # +0x4145 0x50DA # +0x4146 0x7597 # +0x4147 0x71CE # +0x4148 0x5BE5 # +0x4149 0x8FBD # +0x414A 0x6F66 # +0x414B 0x4E86 # +0x414C 0x6482 # +0x414D 0x9563 # +0x414E 0x5ED6 # +0x414F 0x6599 # +0x4150 0x5217 # +0x4151 0x88C2 # +0x4152 0x70C8 # +0x4153 0x52A3 # +0x4154 0x730E # +0x4155 0x7433 # +0x4156 0x6797 # +0x4157 0x78F7 # +0x4158 0x9716 # +0x4159 0x4E34 # +0x415A 0x90BB # +0x415B 0x9CDE # +0x415C 0x6DCB # +0x415D 0x51DB # +0x415E 0x8D41 # +0x415F 0x541D # +0x4160 0x62CE # +0x4161 0x73B2 # +0x4162 0x83F1 # +0x4163 0x96F6 # +0x4164 0x9F84 # +0x4165 0x94C3 # +0x4166 0x4F36 # +0x4167 0x7F9A # +0x4168 0x51CC # +0x4169 0x7075 # +0x416A 0x9675 # +0x416B 0x5CAD # +0x416C 0x9886 # +0x416D 0x53E6 # +0x416E 0x4EE4 # +0x416F 0x6E9C # +0x4170 0x7409 # +0x4171 0x69B4 # +0x4172 0x786B # +0x4173 0x998F # +0x4174 0x7559 # +0x4175 0x5218 # +0x4176 0x7624 # +0x4177 0x6D41 # +0x4178 0x67F3 # +0x4179 0x516D # +0x417A 0x9F99 # +0x417B 0x804B # +0x417C 0x5499 # +0x417D 0x7B3C # +0x417E 0x7ABF # +0x4221 0x9686 # +0x4222 0x5784 # +0x4223 0x62E2 # +0x4224 0x9647 # +0x4225 0x697C # +0x4226 0x5A04 # +0x4227 0x6402 # +0x4228 0x7BD3 # +0x4229 0x6F0F # +0x422A 0x964B # +0x422B 0x82A6 # +0x422C 0x5362 # +0x422D 0x9885 # +0x422E 0x5E90 # +0x422F 0x7089 # +0x4230 0x63B3 # +0x4231 0x5364 # +0x4232 0x864F # +0x4233 0x9C81 # +0x4234 0x9E93 # +0x4235 0x788C # +0x4236 0x9732 # +0x4237 0x8DEF # +0x4238 0x8D42 # +0x4239 0x9E7F # +0x423A 0x6F5E # +0x423B 0x7984 # +0x423C 0x5F55 # +0x423D 0x9646 # +0x423E 0x622E # +0x423F 0x9A74 # +0x4240 0x5415 # +0x4241 0x94DD # +0x4242 0x4FA3 # +0x4243 0x65C5 # +0x4244 0x5C65 # +0x4245 0x5C61 # +0x4246 0x7F15 # +0x4247 0x8651 # +0x4248 0x6C2F # +0x4249 0x5F8B # +0x424A 0x7387 # +0x424B 0x6EE4 # +0x424C 0x7EFF # +0x424D 0x5CE6 # +0x424E 0x631B # +0x424F 0x5B6A # +0x4250 0x6EE6 # +0x4251 0x5375 # +0x4252 0x4E71 # +0x4253 0x63A0 # +0x4254 0x7565 # +0x4255 0x62A1 # +0x4256 0x8F6E # +0x4257 0x4F26 # +0x4258 0x4ED1 # +0x4259 0x6CA6 # +0x425A 0x7EB6 # +0x425B 0x8BBA # +0x425C 0x841D # +0x425D 0x87BA # +0x425E 0x7F57 # +0x425F 0x903B # +0x4260 0x9523 # +0x4261 0x7BA9 # +0x4262 0x9AA1 # +0x4263 0x88F8 # +0x4264 0x843D # +0x4265 0x6D1B # +0x4266 0x9A86 # +0x4267 0x7EDC # +0x4268 0x5988 # +0x4269 0x9EBB # +0x426A 0x739B # +0x426B 0x7801 # +0x426C 0x8682 # +0x426D 0x9A6C # +0x426E 0x9A82 # +0x426F 0x561B # +0x4270 0x5417 # +0x4271 0x57CB # +0x4272 0x4E70 # +0x4273 0x9EA6 # +0x4274 0x5356 # +0x4275 0x8FC8 # +0x4276 0x8109 # +0x4277 0x7792 # +0x4278 0x9992 # +0x4279 0x86EE # +0x427A 0x6EE1 # +0x427B 0x8513 # +0x427C 0x66FC # +0x427D 0x6162 # +0x427E 0x6F2B # +0x4321 0x8C29 # +0x4322 0x8292 # +0x4323 0x832B # +0x4324 0x76F2 # +0x4325 0x6C13 # +0x4326 0x5FD9 # +0x4327 0x83BD # +0x4328 0x732B # +0x4329 0x8305 # +0x432A 0x951A # +0x432B 0x6BDB # +0x432C 0x77DB # +0x432D 0x94C6 # +0x432E 0x536F # +0x432F 0x8302 # +0x4330 0x5192 # +0x4331 0x5E3D # +0x4332 0x8C8C # +0x4333 0x8D38 # +0x4334 0x4E48 # +0x4335 0x73AB # +0x4336 0x679A # +0x4337 0x6885 # +0x4338 0x9176 # +0x4339 0x9709 # +0x433A 0x7164 # +0x433B 0x6CA1 # +0x433C 0x7709 # +0x433D 0x5A92 # +0x433E 0x9541 # +0x433F 0x6BCF # +0x4340 0x7F8E # +0x4341 0x6627 # +0x4342 0x5BD0 # +0x4343 0x59B9 # +0x4344 0x5A9A # +0x4345 0x95E8 # +0x4346 0x95F7 # +0x4347 0x4EEC # +0x4348 0x840C # +0x4349 0x8499 # +0x434A 0x6AAC # +0x434B 0x76DF # +0x434C 0x9530 # +0x434D 0x731B # +0x434E 0x68A6 # +0x434F 0x5B5F # +0x4350 0x772F # +0x4351 0x919A # +0x4352 0x9761 # +0x4353 0x7CDC # +0x4354 0x8FF7 # +0x4355 0x8C1C # +0x4356 0x5F25 # +0x4357 0x7C73 # +0x4358 0x79D8 # +0x4359 0x89C5 # +0x435A 0x6CCC # +0x435B 0x871C # +0x435C 0x5BC6 # +0x435D 0x5E42 # +0x435E 0x68C9 # +0x435F 0x7720 # +0x4360 0x7EF5 # +0x4361 0x5195 # +0x4362 0x514D # +0x4363 0x52C9 # +0x4364 0x5A29 # +0x4365 0x7F05 # +0x4366 0x9762 # +0x4367 0x82D7 # +0x4368 0x63CF # +0x4369 0x7784 # +0x436A 0x85D0 # +0x436B 0x79D2 # +0x436C 0x6E3A # +0x436D 0x5E99 # +0x436E 0x5999 # +0x436F 0x8511 # +0x4370 0x706D # +0x4371 0x6C11 # +0x4372 0x62BF # +0x4373 0x76BF # +0x4374 0x654F # +0x4375 0x60AF # +0x4376 0x95FD # +0x4377 0x660E # +0x4378 0x879F # +0x4379 0x9E23 # +0x437A 0x94ED # +0x437B 0x540D # +0x437C 0x547D # +0x437D 0x8C2C # +0x437E 0x6478 # +0x4421 0x6479 # +0x4422 0x8611 # +0x4423 0x6A21 # +0x4424 0x819C # +0x4425 0x78E8 # +0x4426 0x6469 # +0x4427 0x9B54 # +0x4428 0x62B9 # +0x4429 0x672B # +0x442A 0x83AB # +0x442B 0x58A8 # +0x442C 0x9ED8 # +0x442D 0x6CAB # +0x442E 0x6F20 # +0x442F 0x5BDE # +0x4430 0x964C # +0x4431 0x8C0B # +0x4432 0x725F # +0x4433 0x67D0 # +0x4434 0x62C7 # +0x4435 0x7261 # +0x4436 0x4EA9 # +0x4437 0x59C6 # +0x4438 0x6BCD # +0x4439 0x5893 # +0x443A 0x66AE # +0x443B 0x5E55 # +0x443C 0x52DF # +0x443D 0x6155 # +0x443E 0x6728 # +0x443F 0x76EE # +0x4440 0x7766 # +0x4441 0x7267 # +0x4442 0x7A46 # +0x4443 0x62FF # +0x4444 0x54EA # +0x4445 0x5450 # +0x4446 0x94A0 # +0x4447 0x90A3 # +0x4448 0x5A1C # +0x4449 0x7EB3 # +0x444A 0x6C16 # +0x444B 0x4E43 # +0x444C 0x5976 # +0x444D 0x8010 # +0x444E 0x5948 # +0x444F 0x5357 # +0x4450 0x7537 # +0x4451 0x96BE # +0x4452 0x56CA # +0x4453 0x6320 # +0x4454 0x8111 # +0x4455 0x607C # +0x4456 0x95F9 # +0x4457 0x6DD6 # +0x4458 0x5462 # +0x4459 0x9981 # +0x445A 0x5185 # +0x445B 0x5AE9 # +0x445C 0x80FD # +0x445D 0x59AE # +0x445E 0x9713 # +0x445F 0x502A # +0x4460 0x6CE5 # +0x4461 0x5C3C # +0x4462 0x62DF # +0x4463 0x4F60 # +0x4464 0x533F # +0x4465 0x817B # +0x4466 0x9006 # +0x4467 0x6EBA # +0x4468 0x852B # +0x4469 0x62C8 # +0x446A 0x5E74 # +0x446B 0x78BE # +0x446C 0x64B5 # +0x446D 0x637B # +0x446E 0x5FF5 # +0x446F 0x5A18 # +0x4470 0x917F # +0x4471 0x9E1F # +0x4472 0x5C3F # +0x4473 0x634F # +0x4474 0x8042 # +0x4475 0x5B7D # +0x4476 0x556E # +0x4477 0x954A # +0x4478 0x954D # +0x4479 0x6D85 # +0x447A 0x60A8 # +0x447B 0x67E0 # +0x447C 0x72DE # +0x447D 0x51DD # +0x447E 0x5B81 # +0x4521 0x62E7 # +0x4522 0x6CDE # +0x4523 0x725B # +0x4524 0x626D # +0x4525 0x94AE # +0x4526 0x7EBD # +0x4527 0x8113 # +0x4528 0x6D53 # +0x4529 0x519C # +0x452A 0x5F04 # +0x452B 0x5974 # +0x452C 0x52AA # +0x452D 0x6012 # +0x452E 0x5973 # +0x452F 0x6696 # +0x4530 0x8650 # +0x4531 0x759F # +0x4532 0x632A # +0x4533 0x61E6 # +0x4534 0x7CEF # +0x4535 0x8BFA # +0x4536 0x54E6 # +0x4537 0x6B27 # +0x4538 0x9E25 # +0x4539 0x6BB4 # +0x453A 0x85D5 # +0x453B 0x5455 # +0x453C 0x5076 # +0x453D 0x6CA4 # +0x453E 0x556A # +0x453F 0x8DB4 # +0x4540 0x722C # +0x4541 0x5E15 # +0x4542 0x6015 # +0x4543 0x7436 # +0x4544 0x62CD # +0x4545 0x6392 # +0x4546 0x724C # +0x4547 0x5F98 # +0x4548 0x6E43 # +0x4549 0x6D3E # +0x454A 0x6500 # +0x454B 0x6F58 # +0x454C 0x76D8 # +0x454D 0x78D0 # +0x454E 0x76FC # +0x454F 0x7554 # +0x4550 0x5224 # +0x4551 0x53DB # +0x4552 0x4E53 # +0x4553 0x5E9E # +0x4554 0x65C1 # +0x4555 0x802A # +0x4556 0x80D6 # +0x4557 0x629B # +0x4558 0x5486 # +0x4559 0x5228 # +0x455A 0x70AE # +0x455B 0x888D # +0x455C 0x8DD1 # +0x455D 0x6CE1 # +0x455E 0x5478 # +0x455F 0x80DA # +0x4560 0x57F9 # +0x4561 0x88F4 # +0x4562 0x8D54 # +0x4563 0x966A # +0x4564 0x914D # +0x4565 0x4F69 # +0x4566 0x6C9B # +0x4567 0x55B7 # +0x4568 0x76C6 # +0x4569 0x7830 # +0x456A 0x62A8 # +0x456B 0x70F9 # +0x456C 0x6F8E # +0x456D 0x5F6D # +0x456E 0x84EC # +0x456F 0x68DA # +0x4570 0x787C # +0x4571 0x7BF7 # +0x4572 0x81A8 # +0x4573 0x670B # +0x4574 0x9E4F # +0x4575 0x6367 # +0x4576 0x78B0 # +0x4577 0x576F # +0x4578 0x7812 # +0x4579 0x9739 # +0x457A 0x6279 # +0x457B 0x62AB # +0x457C 0x5288 # +0x457D 0x7435 # +0x457E 0x6BD7 # +0x4621 0x5564 # +0x4622 0x813E # +0x4623 0x75B2 # +0x4624 0x76AE # +0x4625 0x5339 # +0x4626 0x75DE # +0x4627 0x50FB # +0x4628 0x5C41 # +0x4629 0x8B6C # +0x462A 0x7BC7 # +0x462B 0x504F # +0x462C 0x7247 # +0x462D 0x9A97 # +0x462E 0x98D8 # +0x462F 0x6F02 # +0x4630 0x74E2 # +0x4631 0x7968 # +0x4632 0x6487 # +0x4633 0x77A5 # +0x4634 0x62FC # +0x4635 0x9891 # +0x4636 0x8D2B # +0x4637 0x54C1 # +0x4638 0x8058 # +0x4639 0x4E52 # +0x463A 0x576A # +0x463B 0x82F9 # +0x463C 0x840D # +0x463D 0x5E73 # +0x463E 0x51ED # +0x463F 0x74F6 # +0x4640 0x8BC4 # +0x4641 0x5C4F # +0x4642 0x5761 # +0x4643 0x6CFC # +0x4644 0x9887 # +0x4645 0x5A46 # +0x4646 0x7834 # +0x4647 0x9B44 # +0x4648 0x8FEB # +0x4649 0x7C95 # +0x464A 0x5256 # +0x464B 0x6251 # +0x464C 0x94FA # +0x464D 0x4EC6 # +0x464E 0x8386 # +0x464F 0x8461 # +0x4650 0x83E9 # +0x4651 0x84B2 # +0x4652 0x57D4 # +0x4653 0x6734 # +0x4654 0x5703 # +0x4655 0x666E # +0x4656 0x6D66 # +0x4657 0x8C31 # +0x4658 0x66DD # +0x4659 0x7011 # +0x465A 0x671F # +0x465B 0x6B3A # +0x465C 0x6816 # +0x465D 0x621A # +0x465E 0x59BB # +0x465F 0x4E03 # +0x4660 0x51C4 # +0x4661 0x6F06 # +0x4662 0x67D2 # +0x4663 0x6C8F # +0x4664 0x5176 # +0x4665 0x68CB # +0x4666 0x5947 # +0x4667 0x6B67 # +0x4668 0x7566 # +0x4669 0x5D0E # +0x466A 0x8110 # +0x466B 0x9F50 # +0x466C 0x65D7 # +0x466D 0x7948 # +0x466E 0x7941 # +0x466F 0x9A91 # +0x4670 0x8D77 # +0x4671 0x5C82 # +0x4672 0x4E5E # +0x4673 0x4F01 # +0x4674 0x542F # +0x4675 0x5951 # +0x4676 0x780C # +0x4677 0x5668 # +0x4678 0x6C14 # +0x4679 0x8FC4 # +0x467A 0x5F03 # +0x467B 0x6C7D # +0x467C 0x6CE3 # +0x467D 0x8BAB # +0x467E 0x6390 # +0x4721 0x6070 # +0x4722 0x6D3D # +0x4723 0x7275 # +0x4724 0x6266 # +0x4725 0x948E # +0x4726 0x94C5 # +0x4727 0x5343 # +0x4728 0x8FC1 # +0x4729 0x7B7E # +0x472A 0x4EDF # +0x472B 0x8C26 # +0x472C 0x4E7E # +0x472D 0x9ED4 # +0x472E 0x94B1 # +0x472F 0x94B3 # +0x4730 0x524D # +0x4731 0x6F5C # +0x4732 0x9063 # +0x4733 0x6D45 # +0x4734 0x8C34 # +0x4735 0x5811 # +0x4736 0x5D4C # +0x4737 0x6B20 # +0x4738 0x6B49 # +0x4739 0x67AA # +0x473A 0x545B # +0x473B 0x8154 # +0x473C 0x7F8C # +0x473D 0x5899 # +0x473E 0x8537 # +0x473F 0x5F3A # +0x4740 0x62A2 # +0x4741 0x6A47 # +0x4742 0x9539 # +0x4743 0x6572 # +0x4744 0x6084 # +0x4745 0x6865 # +0x4746 0x77A7 # +0x4747 0x4E54 # +0x4748 0x4FA8 # +0x4749 0x5DE7 # +0x474A 0x9798 # +0x474B 0x64AC # +0x474C 0x7FD8 # +0x474D 0x5CED # +0x474E 0x4FCF # +0x474F 0x7A8D # +0x4750 0x5207 # +0x4751 0x8304 # +0x4752 0x4E14 # +0x4753 0x602F # +0x4754 0x7A83 # +0x4755 0x94A6 # +0x4756 0x4FB5 # +0x4757 0x4EB2 # +0x4758 0x79E6 # +0x4759 0x7434 # +0x475A 0x52E4 # +0x475B 0x82B9 # +0x475C 0x64D2 # +0x475D 0x79BD # +0x475E 0x5BDD # +0x475F 0x6C81 # +0x4760 0x9752 # +0x4761 0x8F7B # +0x4762 0x6C22 # +0x4763 0x503E # +0x4764 0x537F # +0x4765 0x6E05 # +0x4766 0x64CE # +0x4767 0x6674 # +0x4768 0x6C30 # +0x4769 0x60C5 # +0x476A 0x9877 # +0x476B 0x8BF7 # +0x476C 0x5E86 # +0x476D 0x743C # +0x476E 0x7A77 # +0x476F 0x79CB # +0x4770 0x4E18 # +0x4771 0x90B1 # +0x4772 0x7403 # +0x4773 0x6C42 # +0x4774 0x56DA # +0x4775 0x914B # +0x4776 0x6CC5 # +0x4777 0x8D8B # +0x4778 0x533A # +0x4779 0x86C6 # +0x477A 0x66F2 # +0x477B 0x8EAF # +0x477C 0x5C48 # +0x477D 0x9A71 # +0x477E 0x6E20 # +0x4821 0x53D6 # +0x4822 0x5A36 # +0x4823 0x9F8B # +0x4824 0x8DA3 # +0x4825 0x53BB # +0x4826 0x5708 # +0x4827 0x98A7 # +0x4828 0x6743 # +0x4829 0x919B # +0x482A 0x6CC9 # +0x482B 0x5168 # +0x482C 0x75CA # +0x482D 0x62F3 # +0x482E 0x72AC # +0x482F 0x5238 # +0x4830 0x529D # +0x4831 0x7F3A # +0x4832 0x7094 # +0x4833 0x7638 # +0x4834 0x5374 # +0x4835 0x9E4A # +0x4836 0x69B7 # +0x4837 0x786E # +0x4838 0x96C0 # +0x4839 0x88D9 # +0x483A 0x7FA4 # +0x483B 0x7136 # +0x483C 0x71C3 # +0x483D 0x5189 # +0x483E 0x67D3 # +0x483F 0x74E4 # +0x4840 0x58E4 # +0x4841 0x6518 # +0x4842 0x56B7 # +0x4843 0x8BA9 # +0x4844 0x9976 # +0x4845 0x6270 # +0x4846 0x7ED5 # +0x4847 0x60F9 # +0x4848 0x70ED # +0x4849 0x58EC # +0x484A 0x4EC1 # +0x484B 0x4EBA # +0x484C 0x5FCD # +0x484D 0x97E7 # +0x484E 0x4EFB # +0x484F 0x8BA4 # +0x4850 0x5203 # +0x4851 0x598A # +0x4852 0x7EAB # +0x4853 0x6254 # +0x4854 0x4ECD # +0x4855 0x65E5 # +0x4856 0x620E # +0x4857 0x8338 # +0x4858 0x84C9 # +0x4859 0x8363 # +0x485A 0x878D # +0x485B 0x7194 # +0x485C 0x6EB6 # +0x485D 0x5BB9 # +0x485E 0x7ED2 # +0x485F 0x5197 # +0x4860 0x63C9 # +0x4861 0x67D4 # +0x4862 0x8089 # +0x4863 0x8339 # +0x4864 0x8815 # +0x4865 0x5112 # +0x4866 0x5B7A # +0x4867 0x5982 # +0x4868 0x8FB1 # +0x4869 0x4E73 # +0x486A 0x6C5D # +0x486B 0x5165 # +0x486C 0x8925 # +0x486D 0x8F6F # +0x486E 0x962E # +0x486F 0x854A # +0x4870 0x745E # +0x4871 0x9510 # +0x4872 0x95F0 # +0x4873 0x6DA6 # +0x4874 0x82E5 # +0x4875 0x5F31 # +0x4876 0x6492 # +0x4877 0x6D12 # +0x4878 0x8428 # +0x4879 0x816E # +0x487A 0x9CC3 # +0x487B 0x585E # +0x487C 0x8D5B # +0x487D 0x4E09 # +0x487E 0x53C1 # +0x4921 0x4F1E # +0x4922 0x6563 # +0x4923 0x6851 # +0x4924 0x55D3 # +0x4925 0x4E27 # +0x4926 0x6414 # +0x4927 0x9A9A # +0x4928 0x626B # +0x4929 0x5AC2 # +0x492A 0x745F # +0x492B 0x8272 # +0x492C 0x6DA9 # +0x492D 0x68EE # +0x492E 0x50E7 # +0x492F 0x838E # +0x4930 0x7802 # +0x4931 0x6740 # +0x4932 0x5239 # +0x4933 0x6C99 # +0x4934 0x7EB1 # +0x4935 0x50BB # +0x4936 0x5565 # +0x4937 0x715E # +0x4938 0x7B5B # +0x4939 0x6652 # +0x493A 0x73CA # +0x493B 0x82EB # +0x493C 0x6749 # +0x493D 0x5C71 # +0x493E 0x5220 # +0x493F 0x717D # +0x4940 0x886B # +0x4941 0x95EA # +0x4942 0x9655 # +0x4943 0x64C5 # +0x4944 0x8D61 # +0x4945 0x81B3 # +0x4946 0x5584 # +0x4947 0x6C55 # +0x4948 0x6247 # +0x4949 0x7F2E # +0x494A 0x5892 # +0x494B 0x4F24 # +0x494C 0x5546 # +0x494D 0x8D4F # +0x494E 0x664C # +0x494F 0x4E0A # +0x4950 0x5C1A # +0x4951 0x88F3 # +0x4952 0x68A2 # +0x4953 0x634E # +0x4954 0x7A0D # +0x4955 0x70E7 # +0x4956 0x828D # +0x4957 0x52FA # +0x4958 0x97F6 # +0x4959 0x5C11 # +0x495A 0x54E8 # +0x495B 0x90B5 # +0x495C 0x7ECD # +0x495D 0x5962 # +0x495E 0x8D4A # +0x495F 0x86C7 # +0x4960 0x820C # +0x4961 0x820D # +0x4962 0x8D66 # +0x4963 0x6444 # +0x4964 0x5C04 # +0x4965 0x6151 # +0x4966 0x6D89 # +0x4967 0x793E # +0x4968 0x8BBE # +0x4969 0x7837 # +0x496A 0x7533 # +0x496B 0x547B # +0x496C 0x4F38 # +0x496D 0x8EAB # +0x496E 0x6DF1 # +0x496F 0x5A20 # +0x4970 0x7EC5 # +0x4971 0x795E # +0x4972 0x6C88 # +0x4973 0x5BA1 # +0x4974 0x5A76 # +0x4975 0x751A # +0x4976 0x80BE # +0x4977 0x614E # +0x4978 0x6E17 # +0x4979 0x58F0 # +0x497A 0x751F # +0x497B 0x7525 # +0x497C 0x7272 # +0x497D 0x5347 # +0x497E 0x7EF3 # +0x4A21 0x7701 # +0x4A22 0x76DB # +0x4A23 0x5269 # +0x4A24 0x80DC # +0x4A25 0x5723 # +0x4A26 0x5E08 # +0x4A27 0x5931 # +0x4A28 0x72EE # +0x4A29 0x65BD # +0x4A2A 0x6E7F # +0x4A2B 0x8BD7 # +0x4A2C 0x5C38 # +0x4A2D 0x8671 # +0x4A2E 0x5341 # +0x4A2F 0x77F3 # +0x4A30 0x62FE # +0x4A31 0x65F6 # +0x4A32 0x4EC0 # +0x4A33 0x98DF # +0x4A34 0x8680 # +0x4A35 0x5B9E # +0x4A36 0x8BC6 # +0x4A37 0x53F2 # +0x4A38 0x77E2 # +0x4A39 0x4F7F # +0x4A3A 0x5C4E # +0x4A3B 0x9A76 # +0x4A3C 0x59CB # +0x4A3D 0x5F0F # +0x4A3E 0x793A # +0x4A3F 0x58EB # +0x4A40 0x4E16 # +0x4A41 0x67FF # +0x4A42 0x4E8B # +0x4A43 0x62ED # +0x4A44 0x8A93 # +0x4A45 0x901D # +0x4A46 0x52BF # +0x4A47 0x662F # +0x4A48 0x55DC # +0x4A49 0x566C # +0x4A4A 0x9002 # +0x4A4B 0x4ED5 # +0x4A4C 0x4F8D # +0x4A4D 0x91CA # +0x4A4E 0x9970 # +0x4A4F 0x6C0F # +0x4A50 0x5E02 # +0x4A51 0x6043 # +0x4A52 0x5BA4 # +0x4A53 0x89C6 # +0x4A54 0x8BD5 # +0x4A55 0x6536 # +0x4A56 0x624B # +0x4A57 0x9996 # +0x4A58 0x5B88 # +0x4A59 0x5BFF # +0x4A5A 0x6388 # +0x4A5B 0x552E # +0x4A5C 0x53D7 # +0x4A5D 0x7626 # +0x4A5E 0x517D # +0x4A5F 0x852C # +0x4A60 0x67A2 # +0x4A61 0x68B3 # +0x4A62 0x6B8A # +0x4A63 0x6292 # +0x4A64 0x8F93 # +0x4A65 0x53D4 # +0x4A66 0x8212 # +0x4A67 0x6DD1 # +0x4A68 0x758F # +0x4A69 0x4E66 # +0x4A6A 0x8D4E # +0x4A6B 0x5B70 # +0x4A6C 0x719F # +0x4A6D 0x85AF # +0x4A6E 0x6691 # +0x4A6F 0x66D9 # +0x4A70 0x7F72 # +0x4A71 0x8700 # +0x4A72 0x9ECD # +0x4A73 0x9F20 # +0x4A74 0x5C5E # +0x4A75 0x672F # +0x4A76 0x8FF0 # +0x4A77 0x6811 # +0x4A78 0x675F # +0x4A79 0x620D # +0x4A7A 0x7AD6 # +0x4A7B 0x5885 # +0x4A7C 0x5EB6 # +0x4A7D 0x6570 # +0x4A7E 0x6F31 # +0x4B21 0x6055 # +0x4B22 0x5237 # +0x4B23 0x800D # +0x4B24 0x6454 # +0x4B25 0x8870 # +0x4B26 0x7529 # +0x4B27 0x5E05 # +0x4B28 0x6813 # +0x4B29 0x62F4 # +0x4B2A 0x971C # +0x4B2B 0x53CC # +0x4B2C 0x723D # +0x4B2D 0x8C01 # +0x4B2E 0x6C34 # +0x4B2F 0x7761 # +0x4B30 0x7A0E # +0x4B31 0x542E # +0x4B32 0x77AC # +0x4B33 0x987A # +0x4B34 0x821C # +0x4B35 0x8BF4 # +0x4B36 0x7855 # +0x4B37 0x6714 # +0x4B38 0x70C1 # +0x4B39 0x65AF # +0x4B3A 0x6495 # +0x4B3B 0x5636 # +0x4B3C 0x601D # +0x4B3D 0x79C1 # +0x4B3E 0x53F8 # +0x4B3F 0x4E1D # +0x4B40 0x6B7B # +0x4B41 0x8086 # +0x4B42 0x5BFA # +0x4B43 0x55E3 # +0x4B44 0x56DB # +0x4B45 0x4F3A # +0x4B46 0x4F3C # +0x4B47 0x9972 # +0x4B48 0x5DF3 # +0x4B49 0x677E # +0x4B4A 0x8038 # +0x4B4B 0x6002 # +0x4B4C 0x9882 # +0x4B4D 0x9001 # +0x4B4E 0x5B8B # +0x4B4F 0x8BBC # +0x4B50 0x8BF5 # +0x4B51 0x641C # +0x4B52 0x8258 # +0x4B53 0x64DE # +0x4B54 0x55FD # +0x4B55 0x82CF # +0x4B56 0x9165 # +0x4B57 0x4FD7 # +0x4B58 0x7D20 # +0x4B59 0x901F # +0x4B5A 0x7C9F # +0x4B5B 0x50F3 # +0x4B5C 0x5851 # +0x4B5D 0x6EAF # +0x4B5E 0x5BBF # +0x4B5F 0x8BC9 # +0x4B60 0x8083 # +0x4B61 0x9178 # +0x4B62 0x849C # +0x4B63 0x7B97 # +0x4B64 0x867D # +0x4B65 0x968B # +0x4B66 0x968F # +0x4B67 0x7EE5 # +0x4B68 0x9AD3 # +0x4B69 0x788E # +0x4B6A 0x5C81 # +0x4B6B 0x7A57 # +0x4B6C 0x9042 # +0x4B6D 0x96A7 # +0x4B6E 0x795F # +0x4B6F 0x5B59 # +0x4B70 0x635F # +0x4B71 0x7B0B # +0x4B72 0x84D1 # +0x4B73 0x68AD # +0x4B74 0x5506 # +0x4B75 0x7F29 # +0x4B76 0x7410 # +0x4B77 0x7D22 # +0x4B78 0x9501 # +0x4B79 0x6240 # +0x4B7A 0x584C # +0x4B7B 0x4ED6 # +0x4B7C 0x5B83 # +0x4B7D 0x5979 # +0x4B7E 0x5854 # +0x4C21 0x736D # +0x4C22 0x631E # +0x4C23 0x8E4B # +0x4C24 0x8E0F # +0x4C25 0x80CE # +0x4C26 0x82D4 # +0x4C27 0x62AC # +0x4C28 0x53F0 # +0x4C29 0x6CF0 # +0x4C2A 0x915E # +0x4C2B 0x592A # +0x4C2C 0x6001 # +0x4C2D 0x6C70 # +0x4C2E 0x574D # +0x4C2F 0x644A # +0x4C30 0x8D2A # +0x4C31 0x762B # +0x4C32 0x6EE9 # +0x4C33 0x575B # +0x4C34 0x6A80 # +0x4C35 0x75F0 # +0x4C36 0x6F6D # +0x4C37 0x8C2D # +0x4C38 0x8C08 # +0x4C39 0x5766 # +0x4C3A 0x6BEF # +0x4C3B 0x8892 # +0x4C3C 0x78B3 # +0x4C3D 0x63A2 # +0x4C3E 0x53F9 # +0x4C3F 0x70AD # +0x4C40 0x6C64 # +0x4C41 0x5858 # +0x4C42 0x642A # +0x4C43 0x5802 # +0x4C44 0x68E0 # +0x4C45 0x819B # +0x4C46 0x5510 # +0x4C47 0x7CD6 # +0x4C48 0x5018 # +0x4C49 0x8EBA # +0x4C4A 0x6DCC # +0x4C4B 0x8D9F # +0x4C4C 0x70EB # +0x4C4D 0x638F # +0x4C4E 0x6D9B # +0x4C4F 0x6ED4 # +0x4C50 0x7EE6 # +0x4C51 0x8404 # +0x4C52 0x6843 # +0x4C53 0x9003 # +0x4C54 0x6DD8 # +0x4C55 0x9676 # +0x4C56 0x8BA8 # +0x4C57 0x5957 # +0x4C58 0x7279 # +0x4C59 0x85E4 # +0x4C5A 0x817E # +0x4C5B 0x75BC # +0x4C5C 0x8A8A # +0x4C5D 0x68AF # +0x4C5E 0x5254 # +0x4C5F 0x8E22 # +0x4C60 0x9511 # +0x4C61 0x63D0 # +0x4C62 0x9898 # +0x4C63 0x8E44 # +0x4C64 0x557C # +0x4C65 0x4F53 # +0x4C66 0x66FF # +0x4C67 0x568F # +0x4C68 0x60D5 # +0x4C69 0x6D95 # +0x4C6A 0x5243 # +0x4C6B 0x5C49 # +0x4C6C 0x5929 # +0x4C6D 0x6DFB # +0x4C6E 0x586B # +0x4C6F 0x7530 # +0x4C70 0x751C # +0x4C71 0x606C # +0x4C72 0x8214 # +0x4C73 0x8146 # +0x4C74 0x6311 # +0x4C75 0x6761 # +0x4C76 0x8FE2 # +0x4C77 0x773A # +0x4C78 0x8DF3 # +0x4C79 0x8D34 # +0x4C7A 0x94C1 # +0x4C7B 0x5E16 # +0x4C7C 0x5385 # +0x4C7D 0x542C # +0x4C7E 0x70C3 # +0x4D21 0x6C40 # +0x4D22 0x5EF7 # +0x4D23 0x505C # +0x4D24 0x4EAD # +0x4D25 0x5EAD # +0x4D26 0x633A # +0x4D27 0x8247 # +0x4D28 0x901A # +0x4D29 0x6850 # +0x4D2A 0x916E # +0x4D2B 0x77B3 # +0x4D2C 0x540C # +0x4D2D 0x94DC # +0x4D2E 0x5F64 # +0x4D2F 0x7AE5 # +0x4D30 0x6876 # +0x4D31 0x6345 # +0x4D32 0x7B52 # +0x4D33 0x7EDF # +0x4D34 0x75DB # +0x4D35 0x5077 # +0x4D36 0x6295 # +0x4D37 0x5934 # +0x4D38 0x900F # +0x4D39 0x51F8 # +0x4D3A 0x79C3 # +0x4D3B 0x7A81 # +0x4D3C 0x56FE # +0x4D3D 0x5F92 # +0x4D3E 0x9014 # +0x4D3F 0x6D82 # +0x4D40 0x5C60 # +0x4D41 0x571F # +0x4D42 0x5410 # +0x4D43 0x5154 # +0x4D44 0x6E4D # +0x4D45 0x56E2 # +0x4D46 0x63A8 # +0x4D47 0x9893 # +0x4D48 0x817F # +0x4D49 0x8715 # +0x4D4A 0x892A # +0x4D4B 0x9000 # +0x4D4C 0x541E # +0x4D4D 0x5C6F # +0x4D4E 0x81C0 # +0x4D4F 0x62D6 # +0x4D50 0x6258 # +0x4D51 0x8131 # +0x4D52 0x9E35 # +0x4D53 0x9640 # +0x4D54 0x9A6E # +0x4D55 0x9A7C # +0x4D56 0x692D # +0x4D57 0x59A5 # +0x4D58 0x62D3 # +0x4D59 0x553E # +0x4D5A 0x6316 # +0x4D5B 0x54C7 # +0x4D5C 0x86D9 # +0x4D5D 0x6D3C # +0x4D5E 0x5A03 # +0x4D5F 0x74E6 # +0x4D60 0x889C # +0x4D61 0x6B6A # +0x4D62 0x5916 # +0x4D63 0x8C4C # +0x4D64 0x5F2F # +0x4D65 0x6E7E # +0x4D66 0x73A9 # +0x4D67 0x987D # +0x4D68 0x4E38 # +0x4D69 0x70F7 # +0x4D6A 0x5B8C # +0x4D6B 0x7897 # +0x4D6C 0x633D # +0x4D6D 0x665A # +0x4D6E 0x7696 # +0x4D6F 0x60CB # +0x4D70 0x5B9B # +0x4D71 0x5A49 # +0x4D72 0x4E07 # +0x4D73 0x8155 # +0x4D74 0x6C6A # +0x4D75 0x738B # +0x4D76 0x4EA1 # +0x4D77 0x6789 # +0x4D78 0x7F51 # +0x4D79 0x5F80 # +0x4D7A 0x65FA # +0x4D7B 0x671B # +0x4D7C 0x5FD8 # +0x4D7D 0x5984 # +0x4D7E 0x5A01 # +0x4E21 0x5DCD # +0x4E22 0x5FAE # +0x4E23 0x5371 # +0x4E24 0x97E6 # +0x4E25 0x8FDD # +0x4E26 0x6845 # +0x4E27 0x56F4 # +0x4E28 0x552F # +0x4E29 0x60DF # +0x4E2A 0x4E3A # +0x4E2B 0x6F4D # +0x4E2C 0x7EF4 # +0x4E2D 0x82C7 # +0x4E2E 0x840E # +0x4E2F 0x59D4 # +0x4E30 0x4F1F # +0x4E31 0x4F2A # +0x4E32 0x5C3E # +0x4E33 0x7EAC # +0x4E34 0x672A # +0x4E35 0x851A # +0x4E36 0x5473 # +0x4E37 0x754F # +0x4E38 0x80C3 # +0x4E39 0x5582 # +0x4E3A 0x9B4F # +0x4E3B 0x4F4D # +0x4E3C 0x6E2D # +0x4E3D 0x8C13 # +0x4E3E 0x5C09 # +0x4E3F 0x6170 # +0x4E40 0x536B # +0x4E41 0x761F # +0x4E42 0x6E29 # +0x4E43 0x868A # +0x4E44 0x6587 # +0x4E45 0x95FB # +0x4E46 0x7EB9 # +0x4E47 0x543B # +0x4E48 0x7A33 # +0x4E49 0x7D0A # +0x4E4A 0x95EE # +0x4E4B 0x55E1 # +0x4E4C 0x7FC1 # +0x4E4D 0x74EE # +0x4E4E 0x631D # +0x4E4F 0x8717 # +0x4E50 0x6DA1 # +0x4E51 0x7A9D # +0x4E52 0x6211 # +0x4E53 0x65A1 # +0x4E54 0x5367 # +0x4E55 0x63E1 # +0x4E56 0x6C83 # +0x4E57 0x5DEB # +0x4E58 0x545C # +0x4E59 0x94A8 # +0x4E5A 0x4E4C # +0x4E5B 0x6C61 # +0x4E5C 0x8BEC # +0x4E5D 0x5C4B # +0x4E5E 0x65E0 # +0x4E5F 0x829C # +0x4E60 0x68A7 # +0x4E61 0x543E # +0x4E62 0x5434 # +0x4E63 0x6BCB # +0x4E64 0x6B66 # +0x4E65 0x4E94 # +0x4E66 0x6342 # +0x4E67 0x5348 # +0x4E68 0x821E # +0x4E69 0x4F0D # +0x4E6A 0x4FAE # +0x4E6B 0x575E # +0x4E6C 0x620A # +0x4E6D 0x96FE # +0x4E6E 0x6664 # +0x4E6F 0x7269 # +0x4E70 0x52FF # +0x4E71 0x52A1 # +0x4E72 0x609F # +0x4E73 0x8BEF # +0x4E74 0x6614 # +0x4E75 0x7199 # +0x4E76 0x6790 # +0x4E77 0x897F # +0x4E78 0x7852 # +0x4E79 0x77FD # +0x4E7A 0x6670 # +0x4E7B 0x563B # +0x4E7C 0x5438 # +0x4E7D 0x9521 # +0x4E7E 0x727A # +0x4F21 0x7A00 # +0x4F22 0x606F # +0x4F23 0x5E0C # +0x4F24 0x6089 # +0x4F25 0x819D # +0x4F26 0x5915 # +0x4F27 0x60DC # +0x4F28 0x7184 # +0x4F29 0x70EF # +0x4F2A 0x6EAA # +0x4F2B 0x6C50 # +0x4F2C 0x7280 # +0x4F2D 0x6A84 # +0x4F2E 0x88AD # +0x4F2F 0x5E2D # +0x4F30 0x4E60 # +0x4F31 0x5AB3 # +0x4F32 0x559C # +0x4F33 0x94E3 # +0x4F34 0x6D17 # +0x4F35 0x7CFB # +0x4F36 0x9699 # +0x4F37 0x620F # +0x4F38 0x7EC6 # +0x4F39 0x778E # +0x4F3A 0x867E # +0x4F3B 0x5323 # +0x4F3C 0x971E # +0x4F3D 0x8F96 # +0x4F3E 0x6687 # +0x4F3F 0x5CE1 # +0x4F40 0x4FA0 # +0x4F41 0x72ED # +0x4F42 0x4E0B # +0x4F43 0x53A6 # +0x4F44 0x590F # +0x4F45 0x5413 # +0x4F46 0x6380 # +0x4F47 0x9528 # +0x4F48 0x5148 # +0x4F49 0x4ED9 # +0x4F4A 0x9C9C # +0x4F4B 0x7EA4 # +0x4F4C 0x54B8 # +0x4F4D 0x8D24 # +0x4F4E 0x8854 # +0x4F4F 0x8237 # +0x4F50 0x95F2 # +0x4F51 0x6D8E # +0x4F52 0x5F26 # +0x4F53 0x5ACC # +0x4F54 0x663E # +0x4F55 0x9669 # +0x4F56 0x73B0 # +0x4F57 0x732E # +0x4F58 0x53BF # +0x4F59 0x817A # +0x4F5A 0x9985 # +0x4F5B 0x7FA1 # +0x4F5C 0x5BAA # +0x4F5D 0x9677 # +0x4F5E 0x9650 # +0x4F5F 0x7EBF # +0x4F60 0x76F8 # +0x4F61 0x53A2 # +0x4F62 0x9576 # +0x4F63 0x9999 # +0x4F64 0x7BB1 # +0x4F65 0x8944 # +0x4F66 0x6E58 # +0x4F67 0x4E61 # +0x4F68 0x7FD4 # +0x4F69 0x7965 # +0x4F6A 0x8BE6 # +0x4F6B 0x60F3 # +0x4F6C 0x54CD # +0x4F6D 0x4EAB # +0x4F6E 0x9879 # +0x4F6F 0x5DF7 # +0x4F70 0x6A61 # +0x4F71 0x50CF # +0x4F72 0x5411 # +0x4F73 0x8C61 # +0x4F74 0x8427 # +0x4F75 0x785D # +0x4F76 0x9704 # +0x4F77 0x524A # +0x4F78 0x54EE # +0x4F79 0x56A3 # +0x4F7A 0x9500 # +0x4F7B 0x6D88 # +0x4F7C 0x5BB5 # +0x4F7D 0x6DC6 # +0x4F7E 0x6653 # +0x5021 0x5C0F # +0x5022 0x5B5D # +0x5023 0x6821 # +0x5024 0x8096 # +0x5025 0x5578 # +0x5026 0x7B11 # +0x5027 0x6548 # +0x5028 0x6954 # +0x5029 0x4E9B # +0x502A 0x6B47 # +0x502B 0x874E # +0x502C 0x978B # +0x502D 0x534F # +0x502E 0x631F # +0x502F 0x643A # +0x5030 0x90AA # +0x5031 0x659C # +0x5032 0x80C1 # +0x5033 0x8C10 # +0x5034 0x5199 # +0x5035 0x68B0 # +0x5036 0x5378 # +0x5037 0x87F9 # +0x5038 0x61C8 # +0x5039 0x6CC4 # +0x503A 0x6CFB # +0x503B 0x8C22 # +0x503C 0x5C51 # +0x503D 0x85AA # +0x503E 0x82AF # +0x503F 0x950C # +0x5040 0x6B23 # +0x5041 0x8F9B # +0x5042 0x65B0 # +0x5043 0x5FFB # +0x5044 0x5FC3 # +0x5045 0x4FE1 # +0x5046 0x8845 # +0x5047 0x661F # +0x5048 0x8165 # +0x5049 0x7329 # +0x504A 0x60FA # +0x504B 0x5174 # +0x504C 0x5211 # +0x504D 0x578B # +0x504E 0x5F62 # +0x504F 0x90A2 # +0x5050 0x884C # +0x5051 0x9192 # +0x5052 0x5E78 # +0x5053 0x674F # +0x5054 0x6027 # +0x5055 0x59D3 # +0x5056 0x5144 # +0x5057 0x51F6 # +0x5058 0x80F8 # +0x5059 0x5308 # +0x505A 0x6C79 # +0x505B 0x96C4 # +0x505C 0x718A # +0x505D 0x4F11 # +0x505E 0x4FEE # +0x505F 0x7F9E # +0x5060 0x673D # +0x5061 0x55C5 # +0x5062 0x9508 # +0x5063 0x79C0 # +0x5064 0x8896 # +0x5065 0x7EE3 # +0x5066 0x589F # +0x5067 0x620C # +0x5068 0x9700 # +0x5069 0x865A # +0x506A 0x5618 # +0x506B 0x987B # +0x506C 0x5F90 # +0x506D 0x8BB8 # +0x506E 0x84C4 # +0x506F 0x9157 # +0x5070 0x53D9 # +0x5071 0x65ED # +0x5072 0x5E8F # +0x5073 0x755C # +0x5074 0x6064 # +0x5075 0x7D6E # +0x5076 0x5A7F # +0x5077 0x7EEA # +0x5078 0x7EED # +0x5079 0x8F69 # +0x507A 0x55A7 # +0x507B 0x5BA3 # +0x507C 0x60AC # +0x507D 0x65CB # +0x507E 0x7384 # +0x5121 0x9009 # +0x5122 0x7663 # +0x5123 0x7729 # +0x5124 0x7EDA # +0x5125 0x9774 # +0x5126 0x859B # +0x5127 0x5B66 # +0x5128 0x7A74 # +0x5129 0x96EA # +0x512A 0x8840 # +0x512B 0x52CB # +0x512C 0x718F # +0x512D 0x5FAA # +0x512E 0x65EC # +0x512F 0x8BE2 # +0x5130 0x5BFB # +0x5131 0x9A6F # +0x5132 0x5DE1 # +0x5133 0x6B89 # +0x5134 0x6C5B # +0x5135 0x8BAD # +0x5136 0x8BAF # +0x5137 0x900A # +0x5138 0x8FC5 # +0x5139 0x538B # +0x513A 0x62BC # +0x513B 0x9E26 # +0x513C 0x9E2D # +0x513D 0x5440 # +0x513E 0x4E2B # +0x513F 0x82BD # +0x5140 0x7259 # +0x5141 0x869C # +0x5142 0x5D16 # +0x5143 0x8859 # +0x5144 0x6DAF # +0x5145 0x96C5 # +0x5146 0x54D1 # +0x5147 0x4E9A # +0x5148 0x8BB6 # +0x5149 0x7109 # +0x514A 0x54BD # +0x514B 0x9609 # +0x514C 0x70DF # +0x514D 0x6DF9 # +0x514E 0x76D0 # +0x514F 0x4E25 # +0x5150 0x7814 # +0x5151 0x8712 # +0x5152 0x5CA9 # +0x5153 0x5EF6 # +0x5154 0x8A00 # +0x5155 0x989C # +0x5156 0x960E # +0x5157 0x708E # +0x5158 0x6CBF # +0x5159 0x5944 # +0x515A 0x63A9 # +0x515B 0x773C # +0x515C 0x884D # +0x515D 0x6F14 # +0x515E 0x8273 # +0x515F 0x5830 # +0x5160 0x71D5 # +0x5161 0x538C # +0x5162 0x781A # +0x5163 0x96C1 # +0x5164 0x5501 # +0x5165 0x5F66 # +0x5166 0x7130 # +0x5167 0x5BB4 # +0x5168 0x8C1A # +0x5169 0x9A8C # +0x516A 0x6B83 # +0x516B 0x592E # +0x516C 0x9E2F # +0x516D 0x79E7 # +0x516E 0x6768 # +0x516F 0x626C # +0x5170 0x4F6F # +0x5171 0x75A1 # +0x5172 0x7F8A # +0x5173 0x6D0B # +0x5174 0x9633 # +0x5175 0x6C27 # +0x5176 0x4EF0 # +0x5177 0x75D2 # +0x5178 0x517B # +0x5179 0x6837 # +0x517A 0x6F3E # +0x517B 0x9080 # +0x517C 0x8170 # +0x517D 0x5996 # +0x517E 0x7476 # +0x5221 0x6447 # +0x5222 0x5C27 # +0x5223 0x9065 # +0x5224 0x7A91 # +0x5225 0x8C23 # +0x5226 0x59DA # +0x5227 0x54AC # +0x5228 0x8200 # +0x5229 0x836F # +0x522A 0x8981 # +0x522B 0x8000 # +0x522C 0x6930 # +0x522D 0x564E # +0x522E 0x8036 # +0x522F 0x7237 # +0x5230 0x91CE # +0x5231 0x51B6 # +0x5232 0x4E5F # +0x5233 0x9875 # +0x5234 0x6396 # +0x5235 0x4E1A # +0x5236 0x53F6 # +0x5237 0x66F3 # +0x5238 0x814B # +0x5239 0x591C # +0x523A 0x6DB2 # +0x523B 0x4E00 # +0x523C 0x58F9 # +0x523D 0x533B # +0x523E 0x63D6 # +0x523F 0x94F1 # +0x5240 0x4F9D # +0x5241 0x4F0A # +0x5242 0x8863 # +0x5243 0x9890 # +0x5244 0x5937 # +0x5245 0x9057 # +0x5246 0x79FB # +0x5247 0x4EEA # +0x5248 0x80F0 # +0x5249 0x7591 # +0x524A 0x6C82 # +0x524B 0x5B9C # +0x524C 0x59E8 # +0x524D 0x5F5D # +0x524E 0x6905 # +0x524F 0x8681 # +0x5250 0x501A # +0x5251 0x5DF2 # +0x5252 0x4E59 # +0x5253 0x77E3 # +0x5254 0x4EE5 # +0x5255 0x827A # +0x5256 0x6291 # +0x5257 0x6613 # +0x5258 0x9091 # +0x5259 0x5C79 # +0x525A 0x4EBF # +0x525B 0x5F79 # +0x525C 0x81C6 # +0x525D 0x9038 # +0x525E 0x8084 # +0x525F 0x75AB # +0x5260 0x4EA6 # +0x5261 0x88D4 # +0x5262 0x610F # +0x5263 0x6BC5 # +0x5264 0x5FC6 # +0x5265 0x4E49 # +0x5266 0x76CA # +0x5267 0x6EA2 # +0x5268 0x8BE3 # +0x5269 0x8BAE # +0x526A 0x8C0A # +0x526B 0x8BD1 # +0x526C 0x5F02 # +0x526D 0x7FFC # +0x526E 0x7FCC # +0x526F 0x7ECE # +0x5270 0x8335 # +0x5271 0x836B # +0x5272 0x56E0 # +0x5273 0x6BB7 # +0x5274 0x97F3 # +0x5275 0x9634 # +0x5276 0x59FB # +0x5277 0x541F # +0x5278 0x94F6 # +0x5279 0x6DEB # +0x527A 0x5BC5 # +0x527B 0x996E # +0x527C 0x5C39 # +0x527D 0x5F15 # +0x527E 0x9690 # +0x5321 0x5370 # +0x5322 0x82F1 # +0x5323 0x6A31 # +0x5324 0x5A74 # +0x5325 0x9E70 # +0x5326 0x5E94 # +0x5327 0x7F28 # +0x5328 0x83B9 # +0x5329 0x8424 # +0x532A 0x8425 # +0x532B 0x8367 # +0x532C 0x8747 # +0x532D 0x8FCE # +0x532E 0x8D62 # +0x532F 0x76C8 # +0x5330 0x5F71 # +0x5331 0x9896 # +0x5332 0x786C # +0x5333 0x6620 # +0x5334 0x54DF # +0x5335 0x62E5 # +0x5336 0x4F63 # +0x5337 0x81C3 # +0x5338 0x75C8 # +0x5339 0x5EB8 # +0x533A 0x96CD # +0x533B 0x8E0A # +0x533C 0x86F9 # +0x533D 0x548F # +0x533E 0x6CF3 # +0x533F 0x6D8C # +0x5340 0x6C38 # +0x5341 0x607F # +0x5342 0x52C7 # +0x5343 0x7528 # +0x5344 0x5E7D # +0x5345 0x4F18 # +0x5346 0x60A0 # +0x5347 0x5FE7 # +0x5348 0x5C24 # +0x5349 0x7531 # +0x534A 0x90AE # +0x534B 0x94C0 # +0x534C 0x72B9 # +0x534D 0x6CB9 # +0x534E 0x6E38 # +0x534F 0x9149 # +0x5350 0x6709 # +0x5351 0x53CB # +0x5352 0x53F3 # +0x5353 0x4F51 # +0x5354 0x91C9 # +0x5355 0x8BF1 # +0x5356 0x53C8 # +0x5357 0x5E7C # +0x5358 0x8FC2 # +0x5359 0x6DE4 # +0x535A 0x4E8E # +0x535B 0x76C2 # +0x535C 0x6986 # +0x535D 0x865E # +0x535E 0x611A # +0x535F 0x8206 # +0x5360 0x4F59 # +0x5361 0x4FDE # +0x5362 0x903E # +0x5363 0x9C7C # +0x5364 0x6109 # +0x5365 0x6E1D # +0x5366 0x6E14 # +0x5367 0x9685 # +0x5368 0x4E88 # +0x5369 0x5A31 # +0x536A 0x96E8 # +0x536B 0x4E0E # +0x536C 0x5C7F # +0x536D 0x79B9 # +0x536E 0x5B87 # +0x536F 0x8BED # +0x5370 0x7FBD # +0x5371 0x7389 # +0x5372 0x57DF # +0x5373 0x828B # +0x5374 0x90C1 # +0x5375 0x5401 # +0x5376 0x9047 # +0x5377 0x55BB # +0x5378 0x5CEA # +0x5379 0x5FA1 # +0x537A 0x6108 # +0x537B 0x6B32 # +0x537C 0x72F1 # +0x537D 0x80B2 # +0x537E 0x8A89 # +0x5421 0x6D74 # +0x5422 0x5BD3 # +0x5423 0x88D5 # +0x5424 0x9884 # +0x5425 0x8C6B # +0x5426 0x9A6D # +0x5427 0x9E33 # +0x5428 0x6E0A # +0x5429 0x51A4 # +0x542A 0x5143 # +0x542B 0x57A3 # +0x542C 0x8881 # +0x542D 0x539F # +0x542E 0x63F4 # +0x542F 0x8F95 # +0x5430 0x56ED # +0x5431 0x5458 # +0x5432 0x5706 # +0x5433 0x733F # +0x5434 0x6E90 # +0x5435 0x7F18 # +0x5436 0x8FDC # +0x5437 0x82D1 # +0x5438 0x613F # +0x5439 0x6028 # +0x543A 0x9662 # +0x543B 0x66F0 # +0x543C 0x7EA6 # +0x543D 0x8D8A # +0x543E 0x8DC3 # +0x543F 0x94A5 # +0x5440 0x5CB3 # +0x5441 0x7CA4 # +0x5442 0x6708 # +0x5443 0x60A6 # +0x5444 0x9605 # +0x5445 0x8018 # +0x5446 0x4E91 # +0x5447 0x90E7 # +0x5448 0x5300 # +0x5449 0x9668 # +0x544A 0x5141 # +0x544B 0x8FD0 # +0x544C 0x8574 # +0x544D 0x915D # +0x544E 0x6655 # +0x544F 0x97F5 # +0x5450 0x5B55 # +0x5451 0x531D # +0x5452 0x7838 # +0x5453 0x6742 # +0x5454 0x683D # +0x5455 0x54C9 # +0x5456 0x707E # +0x5457 0x5BB0 # +0x5458 0x8F7D # +0x5459 0x518D # +0x545A 0x5728 # +0x545B 0x54B1 # +0x545C 0x6512 # +0x545D 0x6682 # +0x545E 0x8D5E # +0x545F 0x8D43 # +0x5460 0x810F # +0x5461 0x846C # +0x5462 0x906D # +0x5463 0x7CDF # +0x5464 0x51FF # +0x5465 0x85FB # +0x5466 0x67A3 # +0x5467 0x65E9 # +0x5468 0x6FA1 # +0x5469 0x86A4 # +0x546A 0x8E81 # +0x546B 0x566A # +0x546C 0x9020 # +0x546D 0x7682 # +0x546E 0x7076 # +0x546F 0x71E5 # +0x5470 0x8D23 # +0x5471 0x62E9 # +0x5472 0x5219 # +0x5473 0x6CFD # +0x5474 0x8D3C # +0x5475 0x600E # +0x5476 0x589E # +0x5477 0x618E # +0x5478 0x66FE # +0x5479 0x8D60 # +0x547A 0x624E # +0x547B 0x55B3 # +0x547C 0x6E23 # +0x547D 0x672D # +0x547E 0x8F67 # +0x5521 0x94E1 # +0x5522 0x95F8 # +0x5523 0x7728 # +0x5524 0x6805 # +0x5525 0x69A8 # +0x5526 0x548B # +0x5527 0x4E4D # +0x5528 0x70B8 # +0x5529 0x8BC8 # +0x552A 0x6458 # +0x552B 0x658B # +0x552C 0x5B85 # +0x552D 0x7A84 # +0x552E 0x503A # +0x552F 0x5BE8 # +0x5530 0x77BB # +0x5531 0x6BE1 # +0x5532 0x8A79 # +0x5533 0x7C98 # +0x5534 0x6CBE # +0x5535 0x76CF # +0x5536 0x65A9 # +0x5537 0x8F97 # +0x5538 0x5D2D # +0x5539 0x5C55 # +0x553A 0x8638 # +0x553B 0x6808 # +0x553C 0x5360 # +0x553D 0x6218 # +0x553E 0x7AD9 # +0x553F 0x6E5B # +0x5540 0x7EFD # +0x5541 0x6A1F # +0x5542 0x7AE0 # +0x5543 0x5F70 # +0x5544 0x6F33 # +0x5545 0x5F20 # +0x5546 0x638C # +0x5547 0x6DA8 # +0x5548 0x6756 # +0x5549 0x4E08 # +0x554A 0x5E10 # +0x554B 0x8D26 # +0x554C 0x4ED7 # +0x554D 0x80C0 # +0x554E 0x7634 # +0x554F 0x969C # +0x5550 0x62DB # +0x5551 0x662D # +0x5552 0x627E # +0x5553 0x6CBC # +0x5554 0x8D75 # +0x5555 0x7167 # +0x5556 0x7F69 # +0x5557 0x5146 # +0x5558 0x8087 # +0x5559 0x53EC # +0x555A 0x906E # +0x555B 0x6298 # +0x555C 0x54F2 # +0x555D 0x86F0 # +0x555E 0x8F99 # +0x555F 0x8005 # +0x5560 0x9517 # +0x5561 0x8517 # +0x5562 0x8FD9 # +0x5563 0x6D59 # +0x5564 0x73CD # +0x5565 0x659F # +0x5566 0x771F # +0x5567 0x7504 # +0x5568 0x7827 # +0x5569 0x81FB # +0x556A 0x8D1E # +0x556B 0x9488 # +0x556C 0x4FA6 # +0x556D 0x6795 # +0x556E 0x75B9 # +0x556F 0x8BCA # +0x5570 0x9707 # +0x5571 0x632F # +0x5572 0x9547 # +0x5573 0x9635 # +0x5574 0x84B8 # +0x5575 0x6323 # +0x5576 0x7741 # +0x5577 0x5F81 # +0x5578 0x72F0 # +0x5579 0x4E89 # +0x557A 0x6014 # +0x557B 0x6574 # +0x557C 0x62EF # +0x557D 0x6B63 # +0x557E 0x653F # +0x5621 0x5E27 # +0x5622 0x75C7 # +0x5623 0x90D1 # +0x5624 0x8BC1 # +0x5625 0x829D # +0x5626 0x679D # +0x5627 0x652F # +0x5628 0x5431 # +0x5629 0x8718 # +0x562A 0x77E5 # +0x562B 0x80A2 # +0x562C 0x8102 # +0x562D 0x6C41 # +0x562E 0x4E4B # +0x562F 0x7EC7 # +0x5630 0x804C # +0x5631 0x76F4 # +0x5632 0x690D # +0x5633 0x6B96 # +0x5634 0x6267 # +0x5635 0x503C # +0x5636 0x4F84 # +0x5637 0x5740 # +0x5638 0x6307 # +0x5639 0x6B62 # +0x563A 0x8DBE # +0x563B 0x53EA # +0x563C 0x65E8 # +0x563D 0x7EB8 # +0x563E 0x5FD7 # +0x563F 0x631A # +0x5640 0x63B7 # +0x5641 0x81F3 # +0x5642 0x81F4 # +0x5643 0x7F6E # +0x5644 0x5E1C # +0x5645 0x5CD9 # +0x5646 0x5236 # +0x5647 0x667A # +0x5648 0x79E9 # +0x5649 0x7A1A # +0x564A 0x8D28 # +0x564B 0x7099 # +0x564C 0x75D4 # +0x564D 0x6EDE # +0x564E 0x6CBB # +0x564F 0x7A92 # +0x5650 0x4E2D # +0x5651 0x76C5 # +0x5652 0x5FE0 # +0x5653 0x949F # +0x5654 0x8877 # +0x5655 0x7EC8 # +0x5656 0x79CD # +0x5657 0x80BF # +0x5658 0x91CD # +0x5659 0x4EF2 # +0x565A 0x4F17 # +0x565B 0x821F # +0x565C 0x5468 # +0x565D 0x5DDE # +0x565E 0x6D32 # +0x565F 0x8BCC # +0x5660 0x7CA5 # +0x5661 0x8F74 # +0x5662 0x8098 # +0x5663 0x5E1A # +0x5664 0x5492 # +0x5665 0x76B1 # +0x5666 0x5B99 # +0x5667 0x663C # +0x5668 0x9AA4 # +0x5669 0x73E0 # +0x566A 0x682A # +0x566B 0x86DB # +0x566C 0x6731 # +0x566D 0x732A # +0x566E 0x8BF8 # +0x566F 0x8BDB # +0x5670 0x9010 # +0x5671 0x7AF9 # +0x5672 0x70DB # +0x5673 0x716E # +0x5674 0x62C4 # +0x5675 0x77A9 # +0x5676 0x5631 # +0x5677 0x4E3B # +0x5678 0x8457 # +0x5679 0x67F1 # +0x567A 0x52A9 # +0x567B 0x86C0 # +0x567C 0x8D2E # +0x567D 0x94F8 # +0x567E 0x7B51 # +0x5721 0x4F4F # +0x5722 0x6CE8 # +0x5723 0x795D # +0x5724 0x9A7B # +0x5725 0x6293 # +0x5726 0x722A # +0x5727 0x62FD # +0x5728 0x4E13 # +0x5729 0x7816 # +0x572A 0x8F6C # +0x572B 0x64B0 # +0x572C 0x8D5A # +0x572D 0x7BC6 # +0x572E 0x6869 # +0x572F 0x5E84 # +0x5730 0x88C5 # +0x5731 0x5986 # +0x5732 0x649E # +0x5733 0x58EE # +0x5734 0x72B6 # +0x5735 0x690E # +0x5736 0x9525 # +0x5737 0x8FFD # +0x5738 0x8D58 # +0x5739 0x5760 # +0x573A 0x7F00 # +0x573B 0x8C06 # +0x573C 0x51C6 # +0x573D 0x6349 # +0x573E 0x62D9 # +0x573F 0x5353 # +0x5740 0x684C # +0x5741 0x7422 # +0x5742 0x8301 # +0x5743 0x914C # +0x5744 0x5544 # +0x5745 0x7740 # +0x5746 0x707C # +0x5747 0x6D4A # +0x5748 0x5179 # +0x5749 0x54A8 # +0x574A 0x8D44 # +0x574B 0x59FF # +0x574C 0x6ECB # +0x574D 0x6DC4 # +0x574E 0x5B5C # +0x574F 0x7D2B # +0x5750 0x4ED4 # +0x5751 0x7C7D # +0x5752 0x6ED3 # +0x5753 0x5B50 # +0x5754 0x81EA # +0x5755 0x6E0D # +0x5756 0x5B57 # +0x5757 0x9B03 # +0x5758 0x68D5 # +0x5759 0x8E2A # +0x575A 0x5B97 # +0x575B 0x7EFC # +0x575C 0x603B # +0x575D 0x7EB5 # +0x575E 0x90B9 # +0x575F 0x8D70 # +0x5760 0x594F # +0x5761 0x63CD # +0x5762 0x79DF # +0x5763 0x8DB3 # +0x5764 0x5352 # +0x5765 0x65CF # +0x5766 0x7956 # +0x5767 0x8BC5 # +0x5768 0x963B # +0x5769 0x7EC4 # +0x576A 0x94BB # +0x576B 0x7E82 # +0x576C 0x5634 # +0x576D 0x9189 # +0x576E 0x6700 # +0x576F 0x7F6A # +0x5770 0x5C0A # +0x5771 0x9075 # +0x5772 0x6628 # +0x5773 0x5DE6 # +0x5774 0x4F50 # +0x5775 0x67DE # +0x5776 0x505A # +0x5777 0x4F5C # +0x5778 0x5750 # +0x5779 0x5EA7 # +0x5821 0x4E8D # +0x5822 0x4E0C # +0x5823 0x5140 # +0x5824 0x4E10 # +0x5825 0x5EFF # +0x5826 0x5345 # +0x5827 0x4E15 # +0x5828 0x4E98 # +0x5829 0x4E1E # +0x582A 0x9B32 # +0x582B 0x5B6C # +0x582C 0x5669 # +0x582D 0x4E28 # +0x582E 0x79BA # +0x582F 0x4E3F # +0x5830 0x5315 # +0x5831 0x4E47 # +0x5832 0x592D # +0x5833 0x723B # +0x5834 0x536E # +0x5835 0x6C10 # +0x5836 0x56DF # +0x5837 0x80E4 # +0x5838 0x9997 # +0x5839 0x6BD3 # +0x583A 0x777E # +0x583B 0x9F17 # +0x583C 0x4E36 # +0x583D 0x4E9F # +0x583E 0x9F10 # +0x583F 0x4E5C # +0x5840 0x4E69 # +0x5841 0x4E93 # +0x5842 0x8288 # +0x5843 0x5B5B # +0x5844 0x556C # +0x5845 0x560F # +0x5846 0x4EC4 # +0x5847 0x538D # +0x5848 0x539D # +0x5849 0x53A3 # +0x584A 0x53A5 # +0x584B 0x53AE # +0x584C 0x9765 # +0x584D 0x8D5D # +0x584E 0x531A # +0x584F 0x53F5 # +0x5850 0x5326 # +0x5851 0x532E # +0x5852 0x533E # +0x5853 0x8D5C # +0x5854 0x5366 # +0x5855 0x5363 # +0x5856 0x5202 # +0x5857 0x5208 # +0x5858 0x520E # +0x5859 0x522D # +0x585A 0x5233 # +0x585B 0x523F # +0x585C 0x5240 # +0x585D 0x524C # +0x585E 0x525E # +0x585F 0x5261 # +0x5860 0x525C # +0x5861 0x84AF # +0x5862 0x527D # +0x5863 0x5282 # +0x5864 0x5281 # +0x5865 0x5290 # +0x5866 0x5293 # +0x5867 0x5182 # +0x5868 0x7F54 # +0x5869 0x4EBB # +0x586A 0x4EC3 # +0x586B 0x4EC9 # +0x586C 0x4EC2 # +0x586D 0x4EE8 # +0x586E 0x4EE1 # +0x586F 0x4EEB # +0x5870 0x4EDE # +0x5871 0x4F1B # +0x5872 0x4EF3 # +0x5873 0x4F22 # +0x5874 0x4F64 # +0x5875 0x4EF5 # +0x5876 0x4F25 # +0x5877 0x4F27 # +0x5878 0x4F09 # +0x5879 0x4F2B # +0x587A 0x4F5E # +0x587B 0x4F67 # +0x587C 0x6538 # +0x587D 0x4F5A # +0x587E 0x4F5D # +0x5921 0x4F5F # +0x5922 0x4F57 # +0x5923 0x4F32 # +0x5924 0x4F3D # +0x5925 0x4F76 # +0x5926 0x4F74 # +0x5927 0x4F91 # +0x5928 0x4F89 # +0x5929 0x4F83 # +0x592A 0x4F8F # +0x592B 0x4F7E # +0x592C 0x4F7B # +0x592D 0x4FAA # +0x592E 0x4F7C # +0x592F 0x4FAC # +0x5930 0x4F94 # +0x5931 0x4FE6 # +0x5932 0x4FE8 # +0x5933 0x4FEA # +0x5934 0x4FC5 # +0x5935 0x4FDA # +0x5936 0x4FE3 # +0x5937 0x4FDC # +0x5938 0x4FD1 # +0x5939 0x4FDF # +0x593A 0x4FF8 # +0x593B 0x5029 # +0x593C 0x504C # +0x593D 0x4FF3 # +0x593E 0x502C # +0x593F 0x500F # +0x5940 0x502E # +0x5941 0x502D # +0x5942 0x4FFE # +0x5943 0x501C # +0x5944 0x500C # +0x5945 0x5025 # +0x5946 0x5028 # +0x5947 0x507E # +0x5948 0x5043 # +0x5949 0x5055 # +0x594A 0x5048 # +0x594B 0x504E # +0x594C 0x506C # +0x594D 0x507B # +0x594E 0x50A5 # +0x594F 0x50A7 # +0x5950 0x50A9 # +0x5951 0x50BA # +0x5952 0x50D6 # +0x5953 0x5106 # +0x5954 0x50ED # +0x5955 0x50EC # +0x5956 0x50E6 # +0x5957 0x50EE # +0x5958 0x5107 # +0x5959 0x510B # +0x595A 0x4EDD # +0x595B 0x6C3D # +0x595C 0x4F58 # +0x595D 0x4F65 # +0x595E 0x4FCE # +0x595F 0x9FA0 # +0x5960 0x6C46 # +0x5961 0x7C74 # +0x5962 0x516E # +0x5963 0x5DFD # +0x5964 0x9EC9 # +0x5965 0x9998 # +0x5966 0x5181 # +0x5967 0x5914 # +0x5968 0x52F9 # +0x5969 0x530D # +0x596A 0x8A07 # +0x596B 0x5310 # +0x596C 0x51EB # +0x596D 0x5919 # +0x596E 0x5155 # +0x596F 0x4EA0 # +0x5970 0x5156 # +0x5971 0x4EB3 # +0x5972 0x886E # +0x5973 0x88A4 # +0x5974 0x4EB5 # +0x5975 0x8114 # +0x5976 0x88D2 # +0x5977 0x7980 # +0x5978 0x5B34 # +0x5979 0x8803 # +0x597A 0x7FB8 # +0x597B 0x51AB # +0x597C 0x51B1 # +0x597D 0x51BD # +0x597E 0x51BC # +0x5A21 0x51C7 # +0x5A22 0x5196 # +0x5A23 0x51A2 # +0x5A24 0x51A5 # +0x5A25 0x8BA0 # +0x5A26 0x8BA6 # +0x5A27 0x8BA7 # +0x5A28 0x8BAA # +0x5A29 0x8BB4 # +0x5A2A 0x8BB5 # +0x5A2B 0x8BB7 # +0x5A2C 0x8BC2 # +0x5A2D 0x8BC3 # +0x5A2E 0x8BCB # +0x5A2F 0x8BCF # +0x5A30 0x8BCE # +0x5A31 0x8BD2 # +0x5A32 0x8BD3 # +0x5A33 0x8BD4 # +0x5A34 0x8BD6 # +0x5A35 0x8BD8 # +0x5A36 0x8BD9 # +0x5A37 0x8BDC # +0x5A38 0x8BDF # +0x5A39 0x8BE0 # +0x5A3A 0x8BE4 # +0x5A3B 0x8BE8 # +0x5A3C 0x8BE9 # +0x5A3D 0x8BEE # +0x5A3E 0x8BF0 # +0x5A3F 0x8BF3 # +0x5A40 0x8BF6 # +0x5A41 0x8BF9 # +0x5A42 0x8BFC # +0x5A43 0x8BFF # +0x5A44 0x8C00 # +0x5A45 0x8C02 # +0x5A46 0x8C04 # +0x5A47 0x8C07 # +0x5A48 0x8C0C # +0x5A49 0x8C0F # +0x5A4A 0x8C11 # +0x5A4B 0x8C12 # +0x5A4C 0x8C14 # +0x5A4D 0x8C15 # +0x5A4E 0x8C16 # +0x5A4F 0x8C19 # +0x5A50 0x8C1B # +0x5A51 0x8C18 # +0x5A52 0x8C1D # +0x5A53 0x8C1F # +0x5A54 0x8C20 # +0x5A55 0x8C21 # +0x5A56 0x8C25 # +0x5A57 0x8C27 # +0x5A58 0x8C2A # +0x5A59 0x8C2B # +0x5A5A 0x8C2E # +0x5A5B 0x8C2F # +0x5A5C 0x8C32 # +0x5A5D 0x8C33 # +0x5A5E 0x8C35 # +0x5A5F 0x8C36 # +0x5A60 0x5369 # +0x5A61 0x537A # +0x5A62 0x961D # +0x5A63 0x9622 # +0x5A64 0x9621 # +0x5A65 0x9631 # +0x5A66 0x962A # +0x5A67 0x963D # +0x5A68 0x963C # +0x5A69 0x9642 # +0x5A6A 0x9649 # +0x5A6B 0x9654 # +0x5A6C 0x965F # +0x5A6D 0x9667 # +0x5A6E 0x966C # +0x5A6F 0x9672 # +0x5A70 0x9674 # +0x5A71 0x9688 # +0x5A72 0x968D # +0x5A73 0x9697 # +0x5A74 0x96B0 # +0x5A75 0x9097 # +0x5A76 0x909B # +0x5A77 0x909D # +0x5A78 0x9099 # +0x5A79 0x90AC # +0x5A7A 0x90A1 # +0x5A7B 0x90B4 # +0x5A7C 0x90B3 # +0x5A7D 0x90B6 # +0x5A7E 0x90BA # +0x5B21 0x90B8 # +0x5B22 0x90B0 # +0x5B23 0x90CF # +0x5B24 0x90C5 # +0x5B25 0x90BE # +0x5B26 0x90D0 # +0x5B27 0x90C4 # +0x5B28 0x90C7 # +0x5B29 0x90D3 # +0x5B2A 0x90E6 # +0x5B2B 0x90E2 # +0x5B2C 0x90DC # +0x5B2D 0x90D7 # +0x5B2E 0x90DB # +0x5B2F 0x90EB # +0x5B30 0x90EF # +0x5B31 0x90FE # +0x5B32 0x9104 # +0x5B33 0x9122 # +0x5B34 0x911E # +0x5B35 0x9123 # +0x5B36 0x9131 # +0x5B37 0x912F # +0x5B38 0x9139 # +0x5B39 0x9143 # +0x5B3A 0x9146 # +0x5B3B 0x520D # +0x5B3C 0x5942 # +0x5B3D 0x52A2 # +0x5B3E 0x52AC # +0x5B3F 0x52AD # +0x5B40 0x52BE # +0x5B41 0x54FF # +0x5B42 0x52D0 # +0x5B43 0x52D6 # +0x5B44 0x52F0 # +0x5B45 0x53DF # +0x5B46 0x71EE # +0x5B47 0x77CD # +0x5B48 0x5EF4 # +0x5B49 0x51F5 # +0x5B4A 0x51FC # +0x5B4B 0x9B2F # +0x5B4C 0x53B6 # +0x5B4D 0x5F01 # +0x5B4E 0x755A # +0x5B4F 0x5DEF # +0x5B50 0x574C # +0x5B51 0x57A9 # +0x5B52 0x57A1 # +0x5B53 0x587E # +0x5B54 0x58BC # +0x5B55 0x58C5 # +0x5B56 0x58D1 # +0x5B57 0x5729 # +0x5B58 0x572C # +0x5B59 0x572A # +0x5B5A 0x5733 # +0x5B5B 0x5739 # +0x5B5C 0x572E # +0x5B5D 0x572F # +0x5B5E 0x575C # +0x5B5F 0x573B # +0x5B60 0x5742 # +0x5B61 0x5769 # +0x5B62 0x5785 # +0x5B63 0x576B # +0x5B64 0x5786 # +0x5B65 0x577C # +0x5B66 0x577B # +0x5B67 0x5768 # +0x5B68 0x576D # +0x5B69 0x5776 # +0x5B6A 0x5773 # +0x5B6B 0x57AD # +0x5B6C 0x57A4 # +0x5B6D 0x578C # +0x5B6E 0x57B2 # +0x5B6F 0x57CF # +0x5B70 0x57A7 # +0x5B71 0x57B4 # +0x5B72 0x5793 # +0x5B73 0x57A0 # +0x5B74 0x57D5 # +0x5B75 0x57D8 # +0x5B76 0x57DA # +0x5B77 0x57D9 # +0x5B78 0x57D2 # +0x5B79 0x57B8 # +0x5B7A 0x57F4 # +0x5B7B 0x57EF # +0x5B7C 0x57F8 # +0x5B7D 0x57E4 # +0x5B7E 0x57DD # +0x5C21 0x580B # +0x5C22 0x580D # +0x5C23 0x57FD # +0x5C24 0x57ED # +0x5C25 0x5800 # +0x5C26 0x581E # +0x5C27 0x5819 # +0x5C28 0x5844 # +0x5C29 0x5820 # +0x5C2A 0x5865 # +0x5C2B 0x586C # +0x5C2C 0x5881 # +0x5C2D 0x5889 # +0x5C2E 0x589A # +0x5C2F 0x5880 # +0x5C30 0x99A8 # +0x5C31 0x9F19 # +0x5C32 0x61FF # +0x5C33 0x8279 # +0x5C34 0x827D # +0x5C35 0x827F # +0x5C36 0x828F # +0x5C37 0x828A # +0x5C38 0x82A8 # +0x5C39 0x8284 # +0x5C3A 0x828E # +0x5C3B 0x8291 # +0x5C3C 0x8297 # +0x5C3D 0x8299 # +0x5C3E 0x82AB # +0x5C3F 0x82B8 # +0x5C40 0x82BE # +0x5C41 0x82B0 # +0x5C42 0x82C8 # +0x5C43 0x82CA # +0x5C44 0x82E3 # +0x5C45 0x8298 # +0x5C46 0x82B7 # +0x5C47 0x82AE # +0x5C48 0x82CB # +0x5C49 0x82CC # +0x5C4A 0x82C1 # +0x5C4B 0x82A9 # +0x5C4C 0x82B4 # +0x5C4D 0x82A1 # +0x5C4E 0x82AA # +0x5C4F 0x829F # +0x5C50 0x82C4 # +0x5C51 0x82CE # +0x5C52 0x82A4 # +0x5C53 0x82E1 # +0x5C54 0x8309 # +0x5C55 0x82F7 # +0x5C56 0x82E4 # +0x5C57 0x830F # +0x5C58 0x8307 # +0x5C59 0x82DC # +0x5C5A 0x82F4 # +0x5C5B 0x82D2 # +0x5C5C 0x82D8 # +0x5C5D 0x830C # +0x5C5E 0x82FB # +0x5C5F 0x82D3 # +0x5C60 0x8311 # +0x5C61 0x831A # +0x5C62 0x8306 # +0x5C63 0x8314 # +0x5C64 0x8315 # +0x5C65 0x82E0 # +0x5C66 0x82D5 # +0x5C67 0x831C # +0x5C68 0x8351 # +0x5C69 0x835B # +0x5C6A 0x835C # +0x5C6B 0x8308 # +0x5C6C 0x8392 # +0x5C6D 0x833C # +0x5C6E 0x8334 # +0x5C6F 0x8331 # +0x5C70 0x839B # +0x5C71 0x835E # +0x5C72 0x832F # +0x5C73 0x834F # +0x5C74 0x8347 # +0x5C75 0x8343 # +0x5C76 0x835F # +0x5C77 0x8340 # +0x5C78 0x8317 # +0x5C79 0x8360 # +0x5C7A 0x832D # +0x5C7B 0x833A # +0x5C7C 0x8333 # +0x5C7D 0x8366 # +0x5C7E 0x8365 # +0x5D21 0x8368 # +0x5D22 0x831B # +0x5D23 0x8369 # +0x5D24 0x836C # +0x5D25 0x836A # +0x5D26 0x836D # +0x5D27 0x836E # +0x5D28 0x83B0 # +0x5D29 0x8378 # +0x5D2A 0x83B3 # +0x5D2B 0x83B4 # +0x5D2C 0x83A0 # +0x5D2D 0x83AA # +0x5D2E 0x8393 # +0x5D2F 0x839C # +0x5D30 0x8385 # +0x5D31 0x837C # +0x5D32 0x83B6 # +0x5D33 0x83A9 # +0x5D34 0x837D # +0x5D35 0x83B8 # +0x5D36 0x837B # +0x5D37 0x8398 # +0x5D38 0x839E # +0x5D39 0x83A8 # +0x5D3A 0x83BA # +0x5D3B 0x83BC # +0x5D3C 0x83C1 # +0x5D3D 0x8401 # +0x5D3E 0x83E5 # +0x5D3F 0x83D8 # +0x5D40 0x5807 # +0x5D41 0x8418 # +0x5D42 0x840B # +0x5D43 0x83DD # +0x5D44 0x83FD # +0x5D45 0x83D6 # +0x5D46 0x841C # +0x5D47 0x8438 # +0x5D48 0x8411 # +0x5D49 0x8406 # +0x5D4A 0x83D4 # +0x5D4B 0x83DF # +0x5D4C 0x840F # +0x5D4D 0x8403 # +0x5D4E 0x83F8 # +0x5D4F 0x83F9 # +0x5D50 0x83EA # +0x5D51 0x83C5 # +0x5D52 0x83C0 # +0x5D53 0x8426 # +0x5D54 0x83F0 # +0x5D55 0x83E1 # +0x5D56 0x845C # +0x5D57 0x8451 # +0x5D58 0x845A # +0x5D59 0x8459 # +0x5D5A 0x8473 # +0x5D5B 0x8487 # +0x5D5C 0x8488 # +0x5D5D 0x847A # +0x5D5E 0x8489 # +0x5D5F 0x8478 # +0x5D60 0x843C # +0x5D61 0x8446 # +0x5D62 0x8469 # +0x5D63 0x8476 # +0x5D64 0x848C # +0x5D65 0x848E # +0x5D66 0x8431 # +0x5D67 0x846D # +0x5D68 0x84C1 # +0x5D69 0x84CD # +0x5D6A 0x84D0 # +0x5D6B 0x84E6 # +0x5D6C 0x84BD # +0x5D6D 0x84D3 # +0x5D6E 0x84CA # +0x5D6F 0x84BF # +0x5D70 0x84BA # +0x5D71 0x84E0 # +0x5D72 0x84A1 # +0x5D73 0x84B9 # +0x5D74 0x84B4 # +0x5D75 0x8497 # +0x5D76 0x84E5 # +0x5D77 0x84E3 # +0x5D78 0x850C # +0x5D79 0x750D # +0x5D7A 0x8538 # +0x5D7B 0x84F0 # +0x5D7C 0x8539 # +0x5D7D 0x851F # +0x5D7E 0x853A # +0x5E21 0x8556 # +0x5E22 0x853B # +0x5E23 0x84FF # +0x5E24 0x84FC # +0x5E25 0x8559 # +0x5E26 0x8548 # +0x5E27 0x8568 # +0x5E28 0x8564 # +0x5E29 0x855E # +0x5E2A 0x857A # +0x5E2B 0x77A2 # +0x5E2C 0x8543 # +0x5E2D 0x8572 # +0x5E2E 0x857B # +0x5E2F 0x85A4 # +0x5E30 0x85A8 # +0x5E31 0x8587 # +0x5E32 0x858F # +0x5E33 0x8579 # +0x5E34 0x85AE # +0x5E35 0x859C # +0x5E36 0x8585 # +0x5E37 0x85B9 # +0x5E38 0x85B7 # +0x5E39 0x85B0 # +0x5E3A 0x85D3 # +0x5E3B 0x85C1 # +0x5E3C 0x85DC # +0x5E3D 0x85FF # +0x5E3E 0x8627 # +0x5E3F 0x8605 # +0x5E40 0x8629 # +0x5E41 0x8616 # +0x5E42 0x863C # +0x5E43 0x5EFE # +0x5E44 0x5F08 # +0x5E45 0x593C # +0x5E46 0x5941 # +0x5E47 0x8037 # +0x5E48 0x5955 # +0x5E49 0x595A # +0x5E4A 0x5958 # +0x5E4B 0x530F # +0x5E4C 0x5C22 # +0x5E4D 0x5C25 # +0x5E4E 0x5C2C # +0x5E4F 0x5C34 # +0x5E50 0x624C # +0x5E51 0x626A # +0x5E52 0x629F # +0x5E53 0x62BB # +0x5E54 0x62CA # +0x5E55 0x62DA # +0x5E56 0x62D7 # +0x5E57 0x62EE # +0x5E58 0x6322 # +0x5E59 0x62F6 # +0x5E5A 0x6339 # +0x5E5B 0x634B # +0x5E5C 0x6343 # +0x5E5D 0x63AD # +0x5E5E 0x63F6 # +0x5E5F 0x6371 # +0x5E60 0x637A # +0x5E61 0x638E # +0x5E62 0x63B4 # +0x5E63 0x636D # +0x5E64 0x63AC # +0x5E65 0x638A # +0x5E66 0x6369 # +0x5E67 0x63AE # +0x5E68 0x63BC # +0x5E69 0x63F2 # +0x5E6A 0x63F8 # +0x5E6B 0x63E0 # +0x5E6C 0x63FF # +0x5E6D 0x63C4 # +0x5E6E 0x63DE # +0x5E6F 0x63CE # +0x5E70 0x6452 # +0x5E71 0x63C6 # +0x5E72 0x63BE # +0x5E73 0x6445 # +0x5E74 0x6441 # +0x5E75 0x640B # +0x5E76 0x641B # +0x5E77 0x6420 # +0x5E78 0x640C # +0x5E79 0x6426 # +0x5E7A 0x6421 # +0x5E7B 0x645E # +0x5E7C 0x6484 # +0x5E7D 0x646D # +0x5E7E 0x6496 # +0x5F21 0x647A # +0x5F22 0x64B7 # +0x5F23 0x64B8 # +0x5F24 0x6499 # +0x5F25 0x64BA # +0x5F26 0x64C0 # +0x5F27 0x64D0 # +0x5F28 0x64D7 # +0x5F29 0x64E4 # +0x5F2A 0x64E2 # +0x5F2B 0x6509 # +0x5F2C 0x6525 # +0x5F2D 0x652E # +0x5F2E 0x5F0B # +0x5F2F 0x5FD2 # +0x5F30 0x7519 # +0x5F31 0x5F11 # +0x5F32 0x535F # +0x5F33 0x53F1 # +0x5F34 0x53FD # +0x5F35 0x53E9 # +0x5F36 0x53E8 # +0x5F37 0x53FB # +0x5F38 0x5412 # +0x5F39 0x5416 # +0x5F3A 0x5406 # +0x5F3B 0x544B # +0x5F3C 0x5452 # +0x5F3D 0x5453 # +0x5F3E 0x5454 # +0x5F3F 0x5456 # +0x5F40 0x5443 # +0x5F41 0x5421 # +0x5F42 0x5457 # +0x5F43 0x5459 # +0x5F44 0x5423 # +0x5F45 0x5432 # +0x5F46 0x5482 # +0x5F47 0x5494 # +0x5F48 0x5477 # +0x5F49 0x5471 # +0x5F4A 0x5464 # +0x5F4B 0x549A # +0x5F4C 0x549B # +0x5F4D 0x5484 # +0x5F4E 0x5476 # +0x5F4F 0x5466 # +0x5F50 0x549D # +0x5F51 0x54D0 # +0x5F52 0x54AD # +0x5F53 0x54C2 # +0x5F54 0x54B4 # +0x5F55 0x54D2 # +0x5F56 0x54A7 # +0x5F57 0x54A6 # +0x5F58 0x54D3 # +0x5F59 0x54D4 # +0x5F5A 0x5472 # +0x5F5B 0x54A3 # +0x5F5C 0x54D5 # +0x5F5D 0x54BB # +0x5F5E 0x54BF # +0x5F5F 0x54CC # +0x5F60 0x54D9 # +0x5F61 0x54DA # +0x5F62 0x54DC # +0x5F63 0x54A9 # +0x5F64 0x54AA # +0x5F65 0x54A4 # +0x5F66 0x54DD # +0x5F67 0x54CF # +0x5F68 0x54DE # +0x5F69 0x551B # +0x5F6A 0x54E7 # +0x5F6B 0x5520 # +0x5F6C 0x54FD # +0x5F6D 0x5514 # +0x5F6E 0x54F3 # +0x5F6F 0x5522 # +0x5F70 0x5523 # +0x5F71 0x550F # +0x5F72 0x5511 # +0x5F73 0x5527 # +0x5F74 0x552A # +0x5F75 0x5567 # +0x5F76 0x558F # +0x5F77 0x55B5 # +0x5F78 0x5549 # +0x5F79 0x556D # +0x5F7A 0x5541 # +0x5F7B 0x5555 # +0x5F7C 0x553F # +0x5F7D 0x5550 # +0x5F7E 0x553C # +0x6021 0x5537 # +0x6022 0x5556 # +0x6023 0x5575 # +0x6024 0x5576 # +0x6025 0x5577 # +0x6026 0x5533 # +0x6027 0x5530 # +0x6028 0x555C # +0x6029 0x558B # +0x602A 0x55D2 # +0x602B 0x5583 # +0x602C 0x55B1 # +0x602D 0x55B9 # +0x602E 0x5588 # +0x602F 0x5581 # +0x6030 0x559F # +0x6031 0x557E # +0x6032 0x55D6 # +0x6033 0x5591 # +0x6034 0x557B # +0x6035 0x55DF # +0x6036 0x55BD # +0x6037 0x55BE # +0x6038 0x5594 # +0x6039 0x5599 # +0x603A 0x55EA # +0x603B 0x55F7 # +0x603C 0x55C9 # +0x603D 0x561F # +0x603E 0x55D1 # +0x603F 0x55EB # +0x6040 0x55EC # +0x6041 0x55D4 # +0x6042 0x55E6 # +0x6043 0x55DD # +0x6044 0x55C4 # +0x6045 0x55EF # +0x6046 0x55E5 # +0x6047 0x55F2 # +0x6048 0x55F3 # +0x6049 0x55CC # +0x604A 0x55CD # +0x604B 0x55E8 # +0x604C 0x55F5 # +0x604D 0x55E4 # +0x604E 0x8F94 # +0x604F 0x561E # +0x6050 0x5608 # +0x6051 0x560C # +0x6052 0x5601 # +0x6053 0x5624 # +0x6054 0x5623 # +0x6055 0x55FE # +0x6056 0x5600 # +0x6057 0x5627 # +0x6058 0x562D # +0x6059 0x5658 # +0x605A 0x5639 # +0x605B 0x5657 # +0x605C 0x562C # +0x605D 0x564D # +0x605E 0x5662 # +0x605F 0x5659 # +0x6060 0x565C # +0x6061 0x564C # +0x6062 0x5654 # +0x6063 0x5686 # +0x6064 0x5664 # +0x6065 0x5671 # +0x6066 0x566B # +0x6067 0x567B # +0x6068 0x567C # +0x6069 0x5685 # +0x606A 0x5693 # +0x606B 0x56AF # +0x606C 0x56D4 # +0x606D 0x56D7 # +0x606E 0x56DD # +0x606F 0x56E1 # +0x6070 0x56F5 # +0x6071 0x56EB # +0x6072 0x56F9 # +0x6073 0x56FF # +0x6074 0x5704 # +0x6075 0x570A # +0x6076 0x5709 # +0x6077 0x571C # +0x6078 0x5E0F # +0x6079 0x5E19 # +0x607A 0x5E14 # +0x607B 0x5E11 # +0x607C 0x5E31 # +0x607D 0x5E3B # +0x607E 0x5E3C # +0x6121 0x5E37 # +0x6122 0x5E44 # +0x6123 0x5E54 # +0x6124 0x5E5B # +0x6125 0x5E5E # +0x6126 0x5E61 # +0x6127 0x5C8C # +0x6128 0x5C7A # +0x6129 0x5C8D # +0x612A 0x5C90 # +0x612B 0x5C96 # +0x612C 0x5C88 # +0x612D 0x5C98 # +0x612E 0x5C99 # +0x612F 0x5C91 # +0x6130 0x5C9A # +0x6131 0x5C9C # +0x6132 0x5CB5 # +0x6133 0x5CA2 # +0x6134 0x5CBD # +0x6135 0x5CAC # +0x6136 0x5CAB # +0x6137 0x5CB1 # +0x6138 0x5CA3 # +0x6139 0x5CC1 # +0x613A 0x5CB7 # +0x613B 0x5CC4 # +0x613C 0x5CD2 # +0x613D 0x5CE4 # +0x613E 0x5CCB # +0x613F 0x5CE5 # +0x6140 0x5D02 # +0x6141 0x5D03 # +0x6142 0x5D27 # +0x6143 0x5D26 # +0x6144 0x5D2E # +0x6145 0x5D24 # +0x6146 0x5D1E # +0x6147 0x5D06 # +0x6148 0x5D1B # +0x6149 0x5D58 # +0x614A 0x5D3E # +0x614B 0x5D34 # +0x614C 0x5D3D # +0x614D 0x5D6C # +0x614E 0x5D5B # +0x614F 0x5D6F # +0x6150 0x5D5D # +0x6151 0x5D6B # +0x6152 0x5D4B # +0x6153 0x5D4A # +0x6154 0x5D69 # +0x6155 0x5D74 # +0x6156 0x5D82 # +0x6157 0x5D99 # +0x6158 0x5D9D # +0x6159 0x8C73 # +0x615A 0x5DB7 # +0x615B 0x5DC5 # +0x615C 0x5F73 # +0x615D 0x5F77 # +0x615E 0x5F82 # +0x615F 0x5F87 # +0x6160 0x5F89 # +0x6161 0x5F8C # +0x6162 0x5F95 # +0x6163 0x5F99 # +0x6164 0x5F9C # +0x6165 0x5FA8 # +0x6166 0x5FAD # +0x6167 0x5FB5 # +0x6168 0x5FBC # +0x6169 0x8862 # +0x616A 0x5F61 # +0x616B 0x72AD # +0x616C 0x72B0 # +0x616D 0x72B4 # +0x616E 0x72B7 # +0x616F 0x72B8 # +0x6170 0x72C3 # +0x6171 0x72C1 # +0x6172 0x72CE # +0x6173 0x72CD # +0x6174 0x72D2 # +0x6175 0x72E8 # +0x6176 0x72EF # +0x6177 0x72E9 # +0x6178 0x72F2 # +0x6179 0x72F4 # +0x617A 0x72F7 # +0x617B 0x7301 # +0x617C 0x72F3 # +0x617D 0x7303 # +0x617E 0x72FA # +0x6221 0x72FB # +0x6222 0x7317 # +0x6223 0x7313 # +0x6224 0x7321 # +0x6225 0x730A # +0x6226 0x731E # +0x6227 0x731D # +0x6228 0x7315 # +0x6229 0x7322 # +0x622A 0x7339 # +0x622B 0x7325 # +0x622C 0x732C # +0x622D 0x7338 # +0x622E 0x7331 # +0x622F 0x7350 # +0x6230 0x734D # +0x6231 0x7357 # +0x6232 0x7360 # +0x6233 0x736C # +0x6234 0x736F # +0x6235 0x737E # +0x6236 0x821B # +0x6237 0x5925 # +0x6238 0x98E7 # +0x6239 0x5924 # +0x623A 0x5902 # +0x623B 0x9963 # +0x623C 0x9967 # +0x623D 0x9968 # +0x623E 0x9969 # +0x623F 0x996A # +0x6240 0x996B # +0x6241 0x996C # +0x6242 0x9974 # +0x6243 0x9977 # +0x6244 0x997D # +0x6245 0x9980 # +0x6246 0x9984 # +0x6247 0x9987 # +0x6248 0x998A # +0x6249 0x998D # +0x624A 0x9990 # +0x624B 0x9991 # +0x624C 0x9993 # +0x624D 0x9994 # +0x624E 0x9995 # +0x624F 0x5E80 # +0x6250 0x5E91 # +0x6251 0x5E8B # +0x6252 0x5E96 # +0x6253 0x5EA5 # +0x6254 0x5EA0 # +0x6255 0x5EB9 # +0x6256 0x5EB5 # +0x6257 0x5EBE # +0x6258 0x5EB3 # +0x6259 0x8D53 # +0x625A 0x5ED2 # +0x625B 0x5ED1 # +0x625C 0x5EDB # +0x625D 0x5EE8 # +0x625E 0x5EEA # +0x625F 0x81BA # +0x6260 0x5FC4 # +0x6261 0x5FC9 # +0x6262 0x5FD6 # +0x6263 0x5FCF # +0x6264 0x6003 # +0x6265 0x5FEE # +0x6266 0x6004 # +0x6267 0x5FE1 # +0x6268 0x5FE4 # +0x6269 0x5FFE # +0x626A 0x6005 # +0x626B 0x6006 # +0x626C 0x5FEA # +0x626D 0x5FED # +0x626E 0x5FF8 # +0x626F 0x6019 # +0x6270 0x6035 # +0x6271 0x6026 # +0x6272 0x601B # +0x6273 0x600F # +0x6274 0x600D # +0x6275 0x6029 # +0x6276 0x602B # +0x6277 0x600A # +0x6278 0x603F # +0x6279 0x6021 # +0x627A 0x6078 # +0x627B 0x6079 # +0x627C 0x607B # +0x627D 0x607A # +0x627E 0x6042 # +0x6321 0x606A # +0x6322 0x607D # +0x6323 0x6096 # +0x6324 0x609A # +0x6325 0x60AD # +0x6326 0x609D # +0x6327 0x6083 # +0x6328 0x6092 # +0x6329 0x608C # +0x632A 0x609B # +0x632B 0x60EC # +0x632C 0x60BB # +0x632D 0x60B1 # +0x632E 0x60DD # +0x632F 0x60D8 # +0x6330 0x60C6 # +0x6331 0x60DA # +0x6332 0x60B4 # +0x6333 0x6120 # +0x6334 0x6126 # +0x6335 0x6115 # +0x6336 0x6123 # +0x6337 0x60F4 # +0x6338 0x6100 # +0x6339 0x610E # +0x633A 0x612B # +0x633B 0x614A # +0x633C 0x6175 # +0x633D 0x61AC # +0x633E 0x6194 # +0x633F 0x61A7 # +0x6340 0x61B7 # +0x6341 0x61D4 # +0x6342 0x61F5 # +0x6343 0x5FDD # +0x6344 0x96B3 # +0x6345 0x95E9 # +0x6346 0x95EB # +0x6347 0x95F1 # +0x6348 0x95F3 # +0x6349 0x95F5 # +0x634A 0x95F6 # +0x634B 0x95FC # +0x634C 0x95FE # +0x634D 0x9603 # +0x634E 0x9604 # +0x634F 0x9606 # +0x6350 0x9608 # +0x6351 0x960A # +0x6352 0x960B # +0x6353 0x960C # +0x6354 0x960D # +0x6355 0x960F # +0x6356 0x9612 # +0x6357 0x9615 # +0x6358 0x9616 # +0x6359 0x9617 # +0x635A 0x9619 # +0x635B 0x961A # +0x635C 0x4E2C # +0x635D 0x723F # +0x635E 0x6215 # +0x635F 0x6C35 # +0x6360 0x6C54 # +0x6361 0x6C5C # +0x6362 0x6C4A # +0x6363 0x6CA3 # +0x6364 0x6C85 # +0x6365 0x6C90 # +0x6366 0x6C94 # +0x6367 0x6C8C # +0x6368 0x6C68 # +0x6369 0x6C69 # +0x636A 0x6C74 # +0x636B 0x6C76 # +0x636C 0x6C86 # +0x636D 0x6CA9 # +0x636E 0x6CD0 # +0x636F 0x6CD4 # +0x6370 0x6CAD # +0x6371 0x6CF7 # +0x6372 0x6CF8 # +0x6373 0x6CF1 # +0x6374 0x6CD7 # +0x6375 0x6CB2 # +0x6376 0x6CE0 # +0x6377 0x6CD6 # +0x6378 0x6CFA # +0x6379 0x6CEB # +0x637A 0x6CEE # +0x637B 0x6CB1 # +0x637C 0x6CD3 # +0x637D 0x6CEF # +0x637E 0x6CFE # +0x6421 0x6D39 # +0x6422 0x6D27 # +0x6423 0x6D0C # +0x6424 0x6D43 # +0x6425 0x6D48 # +0x6426 0x6D07 # +0x6427 0x6D04 # +0x6428 0x6D19 # +0x6429 0x6D0E # +0x642A 0x6D2B # +0x642B 0x6D4D # +0x642C 0x6D2E # +0x642D 0x6D35 # +0x642E 0x6D1A # +0x642F 0x6D4F # +0x6430 0x6D52 # +0x6431 0x6D54 # +0x6432 0x6D33 # +0x6433 0x6D91 # +0x6434 0x6D6F # +0x6435 0x6D9E # +0x6436 0x6DA0 # +0x6437 0x6D5E # +0x6438 0x6D93 # +0x6439 0x6D94 # +0x643A 0x6D5C # +0x643B 0x6D60 # +0x643C 0x6D7C # +0x643D 0x6D63 # +0x643E 0x6E1A # +0x643F 0x6DC7 # +0x6440 0x6DC5 # +0x6441 0x6DDE # +0x6442 0x6E0E # +0x6443 0x6DBF # +0x6444 0x6DE0 # +0x6445 0x6E11 # +0x6446 0x6DE6 # +0x6447 0x6DDD # +0x6448 0x6DD9 # +0x6449 0x6E16 # +0x644A 0x6DAB # +0x644B 0x6E0C # +0x644C 0x6DAE # +0x644D 0x6E2B # +0x644E 0x6E6E # +0x644F 0x6E4E # +0x6450 0x6E6B # +0x6451 0x6EB2 # +0x6452 0x6E5F # +0x6453 0x6E86 # +0x6454 0x6E53 # +0x6455 0x6E54 # +0x6456 0x6E32 # +0x6457 0x6E25 # +0x6458 0x6E44 # +0x6459 0x6EDF # +0x645A 0x6EB1 # +0x645B 0x6E98 # +0x645C 0x6EE0 # +0x645D 0x6F2D # +0x645E 0x6EE2 # +0x645F 0x6EA5 # +0x6460 0x6EA7 # +0x6461 0x6EBD # +0x6462 0x6EBB # +0x6463 0x6EB7 # +0x6464 0x6ED7 # +0x6465 0x6EB4 # +0x6466 0x6ECF # +0x6467 0x6E8F # +0x6468 0x6EC2 # +0x6469 0x6E9F # +0x646A 0x6F62 # +0x646B 0x6F46 # +0x646C 0x6F47 # +0x646D 0x6F24 # +0x646E 0x6F15 # +0x646F 0x6EF9 # +0x6470 0x6F2F # +0x6471 0x6F36 # +0x6472 0x6F4B # +0x6473 0x6F74 # +0x6474 0x6F2A # +0x6475 0x6F09 # +0x6476 0x6F29 # +0x6477 0x6F89 # +0x6478 0x6F8D # +0x6479 0x6F8C # +0x647A 0x6F78 # +0x647B 0x6F72 # +0x647C 0x6F7C # +0x647D 0x6F7A # +0x647E 0x6FD1 # +0x6521 0x6FC9 # +0x6522 0x6FA7 # +0x6523 0x6FB9 # +0x6524 0x6FB6 # +0x6525 0x6FC2 # +0x6526 0x6FE1 # +0x6527 0x6FEE # +0x6528 0x6FDE # +0x6529 0x6FE0 # +0x652A 0x6FEF # +0x652B 0x701A # +0x652C 0x7023 # +0x652D 0x701B # +0x652E 0x7039 # +0x652F 0x7035 # +0x6530 0x704F # +0x6531 0x705E # +0x6532 0x5B80 # +0x6533 0x5B84 # +0x6534 0x5B95 # +0x6535 0x5B93 # +0x6536 0x5BA5 # +0x6537 0x5BB8 # +0x6538 0x752F # +0x6539 0x9A9E # +0x653A 0x6434 # +0x653B 0x5BE4 # +0x653C 0x5BEE # +0x653D 0x8930 # +0x653E 0x5BF0 # +0x653F 0x8E47 # +0x6540 0x8B07 # +0x6541 0x8FB6 # +0x6542 0x8FD3 # +0x6543 0x8FD5 # +0x6544 0x8FE5 # +0x6545 0x8FEE # +0x6546 0x8FE4 # +0x6547 0x8FE9 # +0x6548 0x8FE6 # +0x6549 0x8FF3 # +0x654A 0x8FE8 # +0x654B 0x9005 # +0x654C 0x9004 # +0x654D 0x900B # +0x654E 0x9026 # +0x654F 0x9011 # +0x6550 0x900D # +0x6551 0x9016 # +0x6552 0x9021 # +0x6553 0x9035 # +0x6554 0x9036 # +0x6555 0x902D # +0x6556 0x902F # +0x6557 0x9044 # +0x6558 0x9051 # +0x6559 0x9052 # +0x655A 0x9050 # +0x655B 0x9068 # +0x655C 0x9058 # +0x655D 0x9062 # +0x655E 0x905B # +0x655F 0x66B9 # +0x6560 0x9074 # +0x6561 0x907D # +0x6562 0x9082 # +0x6563 0x9088 # +0x6564 0x9083 # +0x6565 0x908B # +0x6566 0x5F50 # +0x6567 0x5F57 # +0x6568 0x5F56 # +0x6569 0x5F58 # +0x656A 0x5C3B # +0x656B 0x54AB # +0x656C 0x5C50 # +0x656D 0x5C59 # +0x656E 0x5B71 # +0x656F 0x5C63 # +0x6570 0x5C66 # +0x6571 0x7FBC # +0x6572 0x5F2A # +0x6573 0x5F29 # +0x6574 0x5F2D # +0x6575 0x8274 # +0x6576 0x5F3C # +0x6577 0x9B3B # +0x6578 0x5C6E # +0x6579 0x5981 # +0x657A 0x5983 # +0x657B 0x598D # +0x657C 0x59A9 # +0x657D 0x59AA # +0x657E 0x59A3 # +0x6621 0x5997 # +0x6622 0x59CA # +0x6623 0x59AB # +0x6624 0x599E # +0x6625 0x59A4 # +0x6626 0x59D2 # +0x6627 0x59B2 # +0x6628 0x59AF # +0x6629 0x59D7 # +0x662A 0x59BE # +0x662B 0x5A05 # +0x662C 0x5A06 # +0x662D 0x59DD # +0x662E 0x5A08 # +0x662F 0x59E3 # +0x6630 0x59D8 # +0x6631 0x59F9 # +0x6632 0x5A0C # +0x6633 0x5A09 # +0x6634 0x5A32 # +0x6635 0x5A34 # +0x6636 0x5A11 # +0x6637 0x5A23 # +0x6638 0x5A13 # +0x6639 0x5A40 # +0x663A 0x5A67 # +0x663B 0x5A4A # +0x663C 0x5A55 # +0x663D 0x5A3C # +0x663E 0x5A62 # +0x663F 0x5A75 # +0x6640 0x80EC # +0x6641 0x5AAA # +0x6642 0x5A9B # +0x6643 0x5A77 # +0x6644 0x5A7A # +0x6645 0x5ABE # +0x6646 0x5AEB # +0x6647 0x5AB2 # +0x6648 0x5AD2 # +0x6649 0x5AD4 # +0x664A 0x5AB8 # +0x664B 0x5AE0 # +0x664C 0x5AE3 # +0x664D 0x5AF1 # +0x664E 0x5AD6 # +0x664F 0x5AE6 # +0x6650 0x5AD8 # +0x6651 0x5ADC # +0x6652 0x5B09 # +0x6653 0x5B17 # +0x6654 0x5B16 # +0x6655 0x5B32 # +0x6656 0x5B37 # +0x6657 0x5B40 # +0x6658 0x5C15 # +0x6659 0x5C1C # +0x665A 0x5B5A # +0x665B 0x5B65 # +0x665C 0x5B73 # +0x665D 0x5B51 # +0x665E 0x5B53 # +0x665F 0x5B62 # +0x6660 0x9A75 # +0x6661 0x9A77 # +0x6662 0x9A78 # +0x6663 0x9A7A # +0x6664 0x9A7F # +0x6665 0x9A7D # +0x6666 0x9A80 # +0x6667 0x9A81 # +0x6668 0x9A85 # +0x6669 0x9A88 # +0x666A 0x9A8A # +0x666B 0x9A90 # +0x666C 0x9A92 # +0x666D 0x9A93 # +0x666E 0x9A96 # +0x666F 0x9A98 # +0x6670 0x9A9B # +0x6671 0x9A9C # +0x6672 0x9A9D # +0x6673 0x9A9F # +0x6674 0x9AA0 # +0x6675 0x9AA2 # +0x6676 0x9AA3 # +0x6677 0x9AA5 # +0x6678 0x9AA7 # +0x6679 0x7E9F # +0x667A 0x7EA1 # +0x667B 0x7EA3 # +0x667C 0x7EA5 # +0x667D 0x7EA8 # +0x667E 0x7EA9 # +0x6721 0x7EAD # +0x6722 0x7EB0 # +0x6723 0x7EBE # +0x6724 0x7EC0 # +0x6725 0x7EC1 # +0x6726 0x7EC2 # +0x6727 0x7EC9 # +0x6728 0x7ECB # +0x6729 0x7ECC # +0x672A 0x7ED0 # +0x672B 0x7ED4 # +0x672C 0x7ED7 # +0x672D 0x7EDB # +0x672E 0x7EE0 # +0x672F 0x7EE1 # +0x6730 0x7EE8 # +0x6731 0x7EEB # +0x6732 0x7EEE # +0x6733 0x7EEF # +0x6734 0x7EF1 # +0x6735 0x7EF2 # +0x6736 0x7F0D # +0x6737 0x7EF6 # +0x6738 0x7EFA # +0x6739 0x7EFB # +0x673A 0x7EFE # +0x673B 0x7F01 # +0x673C 0x7F02 # +0x673D 0x7F03 # +0x673E 0x7F07 # +0x673F 0x7F08 # +0x6740 0x7F0B # +0x6741 0x7F0C # +0x6742 0x7F0F # +0x6743 0x7F11 # +0x6744 0x7F12 # +0x6745 0x7F17 # +0x6746 0x7F19 # +0x6747 0x7F1C # +0x6748 0x7F1B # +0x6749 0x7F1F # +0x674A 0x7F21 # +0x674B 0x7F22 # +0x674C 0x7F23 # +0x674D 0x7F24 # +0x674E 0x7F25 # +0x674F 0x7F26 # +0x6750 0x7F27 # +0x6751 0x7F2A # +0x6752 0x7F2B # +0x6753 0x7F2C # +0x6754 0x7F2D # +0x6755 0x7F2F # +0x6756 0x7F30 # +0x6757 0x7F31 # +0x6758 0x7F32 # +0x6759 0x7F33 # +0x675A 0x7F35 # +0x675B 0x5E7A # +0x675C 0x757F # +0x675D 0x5DDB # +0x675E 0x753E # +0x675F 0x9095 # +0x6760 0x738E # +0x6761 0x7391 # +0x6762 0x73AE # +0x6763 0x73A2 # +0x6764 0x739F # +0x6765 0x73CF # +0x6766 0x73C2 # +0x6767 0x73D1 # +0x6768 0x73B7 # +0x6769 0x73B3 # +0x676A 0x73C0 # +0x676B 0x73C9 # +0x676C 0x73C8 # +0x676D 0x73E5 # +0x676E 0x73D9 # +0x676F 0x987C # +0x6770 0x740A # +0x6771 0x73E9 # +0x6772 0x73E7 # +0x6773 0x73DE # +0x6774 0x73BA # +0x6775 0x73F2 # +0x6776 0x740F # +0x6777 0x742A # +0x6778 0x745B # +0x6779 0x7426 # +0x677A 0x7425 # +0x677B 0x7428 # +0x677C 0x7430 # +0x677D 0x742E # +0x677E 0x742C # +0x6821 0x741B # +0x6822 0x741A # +0x6823 0x7441 # +0x6824 0x745C # +0x6825 0x7457 # +0x6826 0x7455 # +0x6827 0x7459 # +0x6828 0x7477 # +0x6829 0x746D # +0x682A 0x747E # +0x682B 0x749C # +0x682C 0x748E # +0x682D 0x7480 # +0x682E 0x7481 # +0x682F 0x7487 # +0x6830 0x748B # +0x6831 0x749E # +0x6832 0x74A8 # +0x6833 0x74A9 # +0x6834 0x7490 # +0x6835 0x74A7 # +0x6836 0x74D2 # +0x6837 0x74BA # +0x6838 0x97EA # +0x6839 0x97EB # +0x683A 0x97EC # +0x683B 0x674C # +0x683C 0x6753 # +0x683D 0x675E # +0x683E 0x6748 # +0x683F 0x6769 # +0x6840 0x67A5 # +0x6841 0x6787 # +0x6842 0x676A # +0x6843 0x6773 # +0x6844 0x6798 # +0x6845 0x67A7 # +0x6846 0x6775 # +0x6847 0x67A8 # +0x6848 0x679E # +0x6849 0x67AD # +0x684A 0x678B # +0x684B 0x6777 # +0x684C 0x677C # +0x684D 0x67F0 # +0x684E 0x6809 # +0x684F 0x67D8 # +0x6850 0x680A # +0x6851 0x67E9 # +0x6852 0x67B0 # +0x6853 0x680C # +0x6854 0x67D9 # +0x6855 0x67B5 # +0x6856 0x67DA # +0x6857 0x67B3 # +0x6858 0x67DD # +0x6859 0x6800 # +0x685A 0x67C3 # +0x685B 0x67B8 # +0x685C 0x67E2 # +0x685D 0x680E # +0x685E 0x67C1 # +0x685F 0x67FD # +0x6860 0x6832 # +0x6861 0x6833 # +0x6862 0x6860 # +0x6863 0x6861 # +0x6864 0x684E # +0x6865 0x6862 # +0x6866 0x6844 # +0x6867 0x6864 # +0x6868 0x6883 # +0x6869 0x681D # +0x686A 0x6855 # +0x686B 0x6866 # +0x686C 0x6841 # +0x686D 0x6867 # +0x686E 0x6840 # +0x686F 0x683E # +0x6870 0x684A # +0x6871 0x6849 # +0x6872 0x6829 # +0x6873 0x68B5 # +0x6874 0x688F # +0x6875 0x6874 # +0x6876 0x6877 # +0x6877 0x6893 # +0x6878 0x686B # +0x6879 0x68C2 # +0x687A 0x696E # +0x687B 0x68FC # +0x687C 0x691F # +0x687D 0x6920 # +0x687E 0x68F9 # +0x6921 0x6924 # +0x6922 0x68F0 # +0x6923 0x690B # +0x6924 0x6901 # +0x6925 0x6957 # +0x6926 0x68E3 # +0x6927 0x6910 # +0x6928 0x6971 # +0x6929 0x6939 # +0x692A 0x6960 # +0x692B 0x6942 # +0x692C 0x695D # +0x692D 0x6984 # +0x692E 0x696B # +0x692F 0x6980 # +0x6930 0x6998 # +0x6931 0x6978 # +0x6932 0x6934 # +0x6933 0x69CC # +0x6934 0x6987 # +0x6935 0x6988 # +0x6936 0x69CE # +0x6937 0x6989 # +0x6938 0x6966 # +0x6939 0x6963 # +0x693A 0x6979 # +0x693B 0x699B # +0x693C 0x69A7 # +0x693D 0x69BB # +0x693E 0x69AB # +0x693F 0x69AD # +0x6940 0x69D4 # +0x6941 0x69B1 # +0x6942 0x69C1 # +0x6943 0x69CA # +0x6944 0x69DF # +0x6945 0x6995 # +0x6946 0x69E0 # +0x6947 0x698D # +0x6948 0x69FF # +0x6949 0x6A2F # +0x694A 0x69ED # +0x694B 0x6A17 # +0x694C 0x6A18 # +0x694D 0x6A65 # +0x694E 0x69F2 # +0x694F 0x6A44 # +0x6950 0x6A3E # +0x6951 0x6AA0 # +0x6952 0x6A50 # +0x6953 0x6A5B # +0x6954 0x6A35 # +0x6955 0x6A8E # +0x6956 0x6A79 # +0x6957 0x6A3D # +0x6958 0x6A28 # +0x6959 0x6A58 # +0x695A 0x6A7C # +0x695B 0x6A91 # +0x695C 0x6A90 # +0x695D 0x6AA9 # +0x695E 0x6A97 # +0x695F 0x6AAB # +0x6960 0x7337 # +0x6961 0x7352 # +0x6962 0x6B81 # +0x6963 0x6B82 # +0x6964 0x6B87 # +0x6965 0x6B84 # +0x6966 0x6B92 # +0x6967 0x6B93 # +0x6968 0x6B8D # +0x6969 0x6B9A # +0x696A 0x6B9B # +0x696B 0x6BA1 # +0x696C 0x6BAA # +0x696D 0x8F6B # +0x696E 0x8F6D # +0x696F 0x8F71 # +0x6970 0x8F72 # +0x6971 0x8F73 # +0x6972 0x8F75 # +0x6973 0x8F76 # +0x6974 0x8F78 # +0x6975 0x8F77 # +0x6976 0x8F79 # +0x6977 0x8F7A # +0x6978 0x8F7C # +0x6979 0x8F7E # +0x697A 0x8F81 # +0x697B 0x8F82 # +0x697C 0x8F84 # +0x697D 0x8F87 # +0x697E 0x8F8B # +0x6A21 0x8F8D # +0x6A22 0x8F8E # +0x6A23 0x8F8F # +0x6A24 0x8F98 # +0x6A25 0x8F9A # +0x6A26 0x8ECE # +0x6A27 0x620B # +0x6A28 0x6217 # +0x6A29 0x621B # +0x6A2A 0x621F # +0x6A2B 0x6222 # +0x6A2C 0x6221 # +0x6A2D 0x6225 # +0x6A2E 0x6224 # +0x6A2F 0x622C # +0x6A30 0x81E7 # +0x6A31 0x74EF # +0x6A32 0x74F4 # +0x6A33 0x74FF # +0x6A34 0x750F # +0x6A35 0x7511 # +0x6A36 0x7513 # +0x6A37 0x6534 # +0x6A38 0x65EE # +0x6A39 0x65EF # +0x6A3A 0x65F0 # +0x6A3B 0x660A # +0x6A3C 0x6619 # +0x6A3D 0x6772 # +0x6A3E 0x6603 # +0x6A3F 0x6615 # +0x6A40 0x6600 # +0x6A41 0x7085 # +0x6A42 0x66F7 # +0x6A43 0x661D # +0x6A44 0x6634 # +0x6A45 0x6631 # +0x6A46 0x6636 # +0x6A47 0x6635 # +0x6A48 0x8006 # +0x6A49 0x665F # +0x6A4A 0x6654 # +0x6A4B 0x6641 # +0x6A4C 0x664F # +0x6A4D 0x6656 # +0x6A4E 0x6661 # +0x6A4F 0x6657 # +0x6A50 0x6677 # +0x6A51 0x6684 # +0x6A52 0x668C # +0x6A53 0x66A7 # +0x6A54 0x669D # +0x6A55 0x66BE # +0x6A56 0x66DB # +0x6A57 0x66DC # +0x6A58 0x66E6 # +0x6A59 0x66E9 # +0x6A5A 0x8D32 # +0x6A5B 0x8D33 # +0x6A5C 0x8D36 # +0x6A5D 0x8D3B # +0x6A5E 0x8D3D # +0x6A5F 0x8D40 # +0x6A60 0x8D45 # +0x6A61 0x8D46 # +0x6A62 0x8D48 # +0x6A63 0x8D49 # +0x6A64 0x8D47 # +0x6A65 0x8D4D # +0x6A66 0x8D55 # +0x6A67 0x8D59 # +0x6A68 0x89C7 # +0x6A69 0x89CA # +0x6A6A 0x89CB # +0x6A6B 0x89CC # +0x6A6C 0x89CE # +0x6A6D 0x89CF # +0x6A6E 0x89D0 # +0x6A6F 0x89D1 # +0x6A70 0x726E # +0x6A71 0x729F # +0x6A72 0x725D # +0x6A73 0x7266 # +0x6A74 0x726F # +0x6A75 0x727E # +0x6A76 0x727F # +0x6A77 0x7284 # +0x6A78 0x728B # +0x6A79 0x728D # +0x6A7A 0x728F # +0x6A7B 0x7292 # +0x6A7C 0x6308 # +0x6A7D 0x6332 # +0x6A7E 0x63B0 # +0x6B21 0x643F # +0x6B22 0x64D8 # +0x6B23 0x8004 # +0x6B24 0x6BEA # +0x6B25 0x6BF3 # +0x6B26 0x6BFD # +0x6B27 0x6BF5 # +0x6B28 0x6BF9 # +0x6B29 0x6C05 # +0x6B2A 0x6C07 # +0x6B2B 0x6C06 # +0x6B2C 0x6C0D # +0x6B2D 0x6C15 # +0x6B2E 0x6C18 # +0x6B2F 0x6C19 # +0x6B30 0x6C1A # +0x6B31 0x6C21 # +0x6B32 0x6C29 # +0x6B33 0x6C24 # +0x6B34 0x6C2A # +0x6B35 0x6C32 # +0x6B36 0x6535 # +0x6B37 0x6555 # +0x6B38 0x656B # +0x6B39 0x724D # +0x6B3A 0x7252 # +0x6B3B 0x7256 # +0x6B3C 0x7230 # +0x6B3D 0x8662 # +0x6B3E 0x5216 # +0x6B3F 0x809F # +0x6B40 0x809C # +0x6B41 0x8093 # +0x6B42 0x80BC # +0x6B43 0x670A # +0x6B44 0x80BD # +0x6B45 0x80B1 # +0x6B46 0x80AB # +0x6B47 0x80AD # +0x6B48 0x80B4 # +0x6B49 0x80B7 # +0x6B4A 0x80E7 # +0x6B4B 0x80E8 # +0x6B4C 0x80E9 # +0x6B4D 0x80EA # +0x6B4E 0x80DB # +0x6B4F 0x80C2 # +0x6B50 0x80C4 # +0x6B51 0x80D9 # +0x6B52 0x80CD # +0x6B53 0x80D7 # +0x6B54 0x6710 # +0x6B55 0x80DD # +0x6B56 0x80EB # +0x6B57 0x80F1 # +0x6B58 0x80F4 # +0x6B59 0x80ED # +0x6B5A 0x810D # +0x6B5B 0x810E # +0x6B5C 0x80F2 # +0x6B5D 0x80FC # +0x6B5E 0x6715 # +0x6B5F 0x8112 # +0x6B60 0x8C5A # +0x6B61 0x8136 # +0x6B62 0x811E # +0x6B63 0x812C # +0x6B64 0x8118 # +0x6B65 0x8132 # +0x6B66 0x8148 # +0x6B67 0x814C # +0x6B68 0x8153 # +0x6B69 0x8174 # +0x6B6A 0x8159 # +0x6B6B 0x815A # +0x6B6C 0x8171 # +0x6B6D 0x8160 # +0x6B6E 0x8169 # +0x6B6F 0x817C # +0x6B70 0x817D # +0x6B71 0x816D # +0x6B72 0x8167 # +0x6B73 0x584D # +0x6B74 0x5AB5 # +0x6B75 0x8188 # +0x6B76 0x8182 # +0x6B77 0x8191 # +0x6B78 0x6ED5 # +0x6B79 0x81A3 # +0x6B7A 0x81AA # +0x6B7B 0x81CC # +0x6B7C 0x6726 # +0x6B7D 0x81CA # +0x6B7E 0x81BB # +0x6C21 0x81C1 # +0x6C22 0x81A6 # +0x6C23 0x6B24 # +0x6C24 0x6B37 # +0x6C25 0x6B39 # +0x6C26 0x6B43 # +0x6C27 0x6B46 # +0x6C28 0x6B59 # +0x6C29 0x98D1 # +0x6C2A 0x98D2 # +0x6C2B 0x98D3 # +0x6C2C 0x98D5 # +0x6C2D 0x98D9 # +0x6C2E 0x98DA # +0x6C2F 0x6BB3 # +0x6C30 0x5F40 # +0x6C31 0x6BC2 # +0x6C32 0x89F3 # +0x6C33 0x6590 # +0x6C34 0x9F51 # +0x6C35 0x6593 # +0x6C36 0x65BC # +0x6C37 0x65C6 # +0x6C38 0x65C4 # +0x6C39 0x65C3 # +0x6C3A 0x65CC # +0x6C3B 0x65CE # +0x6C3C 0x65D2 # +0x6C3D 0x65D6 # +0x6C3E 0x7080 # +0x6C3F 0x709C # +0x6C40 0x7096 # +0x6C41 0x709D # +0x6C42 0x70BB # +0x6C43 0x70C0 # +0x6C44 0x70B7 # +0x6C45 0x70AB # +0x6C46 0x70B1 # +0x6C47 0x70E8 # +0x6C48 0x70CA # +0x6C49 0x7110 # +0x6C4A 0x7113 # +0x6C4B 0x7116 # +0x6C4C 0x712F # +0x6C4D 0x7131 # +0x6C4E 0x7173 # +0x6C4F 0x715C # +0x6C50 0x7168 # +0x6C51 0x7145 # +0x6C52 0x7172 # +0x6C53 0x714A # +0x6C54 0x7178 # +0x6C55 0x717A # +0x6C56 0x7198 # +0x6C57 0x71B3 # +0x6C58 0x71B5 # +0x6C59 0x71A8 # +0x6C5A 0x71A0 # +0x6C5B 0x71E0 # +0x6C5C 0x71D4 # +0x6C5D 0x71E7 # +0x6C5E 0x71F9 # +0x6C5F 0x721D # +0x6C60 0x7228 # +0x6C61 0x706C # +0x6C62 0x7118 # +0x6C63 0x7166 # +0x6C64 0x71B9 # +0x6C65 0x623E # +0x6C66 0x623D # +0x6C67 0x6243 # +0x6C68 0x6248 # +0x6C69 0x6249 # +0x6C6A 0x793B # +0x6C6B 0x7940 # +0x6C6C 0x7946 # +0x6C6D 0x7949 # +0x6C6E 0x795B # +0x6C6F 0x795C # +0x6C70 0x7953 # +0x6C71 0x795A # +0x6C72 0x7962 # +0x6C73 0x7957 # +0x6C74 0x7960 # +0x6C75 0x796F # +0x6C76 0x7967 # +0x6C77 0x797A # +0x6C78 0x7985 # +0x6C79 0x798A # +0x6C7A 0x799A # +0x6C7B 0x79A7 # +0x6C7C 0x79B3 # +0x6C7D 0x5FD1 # +0x6C7E 0x5FD0 # +0x6D21 0x603C # +0x6D22 0x605D # +0x6D23 0x605A # +0x6D24 0x6067 # +0x6D25 0x6041 # +0x6D26 0x6059 # +0x6D27 0x6063 # +0x6D28 0x60AB # +0x6D29 0x6106 # +0x6D2A 0x610D # +0x6D2B 0x615D # +0x6D2C 0x61A9 # +0x6D2D 0x619D # +0x6D2E 0x61CB # +0x6D2F 0x61D1 # +0x6D30 0x6206 # +0x6D31 0x8080 # +0x6D32 0x807F # +0x6D33 0x6C93 # +0x6D34 0x6CF6 # +0x6D35 0x6DFC # +0x6D36 0x77F6 # +0x6D37 0x77F8 # +0x6D38 0x7800 # +0x6D39 0x7809 # +0x6D3A 0x7817 # +0x6D3B 0x7818 # +0x6D3C 0x7811 # +0x6D3D 0x65AB # +0x6D3E 0x782D # +0x6D3F 0x781C # +0x6D40 0x781D # +0x6D41 0x7839 # +0x6D42 0x783A # +0x6D43 0x783B # +0x6D44 0x781F # +0x6D45 0x783C # +0x6D46 0x7825 # +0x6D47 0x782C # +0x6D48 0x7823 # +0x6D49 0x7829 # +0x6D4A 0x784E # +0x6D4B 0x786D # +0x6D4C 0x7856 # +0x6D4D 0x7857 # +0x6D4E 0x7826 # +0x6D4F 0x7850 # +0x6D50 0x7847 # +0x6D51 0x784C # +0x6D52 0x786A # +0x6D53 0x789B # +0x6D54 0x7893 # +0x6D55 0x789A # +0x6D56 0x7887 # +0x6D57 0x789C # +0x6D58 0x78A1 # +0x6D59 0x78A3 # +0x6D5A 0x78B2 # +0x6D5B 0x78B9 # +0x6D5C 0x78A5 # +0x6D5D 0x78D4 # +0x6D5E 0x78D9 # +0x6D5F 0x78C9 # +0x6D60 0x78EC # +0x6D61 0x78F2 # +0x6D62 0x7905 # +0x6D63 0x78F4 # +0x6D64 0x7913 # +0x6D65 0x7924 # +0x6D66 0x791E # +0x6D67 0x7934 # +0x6D68 0x9F9B # +0x6D69 0x9EF9 # +0x6D6A 0x9EFB # +0x6D6B 0x9EFC # +0x6D6C 0x76F1 # +0x6D6D 0x7704 # +0x6D6E 0x770D # +0x6D6F 0x76F9 # +0x6D70 0x7707 # +0x6D71 0x7708 # +0x6D72 0x771A # +0x6D73 0x7722 # +0x6D74 0x7719 # +0x6D75 0x772D # +0x6D76 0x7726 # +0x6D77 0x7735 # +0x6D78 0x7738 # +0x6D79 0x7750 # +0x6D7A 0x7751 # +0x6D7B 0x7747 # +0x6D7C 0x7743 # +0x6D7D 0x775A # +0x6D7E 0x7768 # +0x6E21 0x7762 # +0x6E22 0x7765 # +0x6E23 0x777F # +0x6E24 0x778D # +0x6E25 0x777D # +0x6E26 0x7780 # +0x6E27 0x778C # +0x6E28 0x7791 # +0x6E29 0x779F # +0x6E2A 0x77A0 # +0x6E2B 0x77B0 # +0x6E2C 0x77B5 # +0x6E2D 0x77BD # +0x6E2E 0x753A # +0x6E2F 0x7540 # +0x6E30 0x754E # +0x6E31 0x754B # +0x6E32 0x7548 # +0x6E33 0x755B # +0x6E34 0x7572 # +0x6E35 0x7579 # +0x6E36 0x7583 # +0x6E37 0x7F58 # +0x6E38 0x7F61 # +0x6E39 0x7F5F # +0x6E3A 0x8A48 # +0x6E3B 0x7F68 # +0x6E3C 0x7F74 # +0x6E3D 0x7F71 # +0x6E3E 0x7F79 # +0x6E3F 0x7F81 # +0x6E40 0x7F7E # +0x6E41 0x76CD # +0x6E42 0x76E5 # +0x6E43 0x8832 # +0x6E44 0x9485 # +0x6E45 0x9486 # +0x6E46 0x9487 # +0x6E47 0x948B # +0x6E48 0x948A # +0x6E49 0x948C # +0x6E4A 0x948D # +0x6E4B 0x948F # +0x6E4C 0x9490 # +0x6E4D 0x9494 # +0x6E4E 0x9497 # +0x6E4F 0x9495 # +0x6E50 0x949A # +0x6E51 0x949B # +0x6E52 0x949C # +0x6E53 0x94A3 # +0x6E54 0x94A4 # +0x6E55 0x94AB # +0x6E56 0x94AA # +0x6E57 0x94AD # +0x6E58 0x94AC # +0x6E59 0x94AF # +0x6E5A 0x94B0 # +0x6E5B 0x94B2 # +0x6E5C 0x94B4 # +0x6E5D 0x94B6 # +0x6E5E 0x94B7 # +0x6E5F 0x94B8 # +0x6E60 0x94B9 # +0x6E61 0x94BA # +0x6E62 0x94BC # +0x6E63 0x94BD # +0x6E64 0x94BF # +0x6E65 0x94C4 # +0x6E66 0x94C8 # +0x6E67 0x94C9 # +0x6E68 0x94CA # +0x6E69 0x94CB # +0x6E6A 0x94CC # +0x6E6B 0x94CD # +0x6E6C 0x94CE # +0x6E6D 0x94D0 # +0x6E6E 0x94D1 # +0x6E6F 0x94D2 # +0x6E70 0x94D5 # +0x6E71 0x94D6 # +0x6E72 0x94D7 # +0x6E73 0x94D9 # +0x6E74 0x94D8 # +0x6E75 0x94DB # +0x6E76 0x94DE # +0x6E77 0x94DF # +0x6E78 0x94E0 # +0x6E79 0x94E2 # +0x6E7A 0x94E4 # +0x6E7B 0x94E5 # +0x6E7C 0x94E7 # +0x6E7D 0x94E8 # +0x6E7E 0x94EA # +0x6F21 0x94E9 # +0x6F22 0x94EB # +0x6F23 0x94EE # +0x6F24 0x94EF # +0x6F25 0x94F3 # +0x6F26 0x94F4 # +0x6F27 0x94F5 # +0x6F28 0x94F7 # +0x6F29 0x94F9 # +0x6F2A 0x94FC # +0x6F2B 0x94FD # +0x6F2C 0x94FF # +0x6F2D 0x9503 # +0x6F2E 0x9502 # +0x6F2F 0x9506 # +0x6F30 0x9507 # +0x6F31 0x9509 # +0x6F32 0x950A # +0x6F33 0x950D # +0x6F34 0x950E # +0x6F35 0x950F # +0x6F36 0x9512 # +0x6F37 0x9513 # +0x6F38 0x9514 # +0x6F39 0x9515 # +0x6F3A 0x9516 # +0x6F3B 0x9518 # +0x6F3C 0x951B # +0x6F3D 0x951D # +0x6F3E 0x951E # +0x6F3F 0x951F # +0x6F40 0x9522 # +0x6F41 0x952A # +0x6F42 0x952B # +0x6F43 0x9529 # +0x6F44 0x952C # +0x6F45 0x9531 # +0x6F46 0x9532 # +0x6F47 0x9534 # +0x6F48 0x9536 # +0x6F49 0x9537 # +0x6F4A 0x9538 # +0x6F4B 0x953C # +0x6F4C 0x953E # +0x6F4D 0x953F # +0x6F4E 0x9542 # +0x6F4F 0x9535 # +0x6F50 0x9544 # +0x6F51 0x9545 # +0x6F52 0x9546 # +0x6F53 0x9549 # +0x6F54 0x954C # +0x6F55 0x954E # +0x6F56 0x954F # +0x6F57 0x9552 # +0x6F58 0x9553 # +0x6F59 0x9554 # +0x6F5A 0x9556 # +0x6F5B 0x9557 # +0x6F5C 0x9558 # +0x6F5D 0x9559 # +0x6F5E 0x955B # +0x6F5F 0x955E # +0x6F60 0x955F # +0x6F61 0x955D # +0x6F62 0x9561 # +0x6F63 0x9562 # +0x6F64 0x9564 # +0x6F65 0x9565 # +0x6F66 0x9566 # +0x6F67 0x9567 # +0x6F68 0x9568 # +0x6F69 0x9569 # +0x6F6A 0x956A # +0x6F6B 0x956B # +0x6F6C 0x956C # +0x6F6D 0x956F # +0x6F6E 0x9571 # +0x6F6F 0x9572 # +0x6F70 0x9573 # +0x6F71 0x953A # +0x6F72 0x77E7 # +0x6F73 0x77EC # +0x6F74 0x96C9 # +0x6F75 0x79D5 # +0x6F76 0x79ED # +0x6F77 0x79E3 # +0x6F78 0x79EB # +0x6F79 0x7A06 # +0x6F7A 0x5D47 # +0x6F7B 0x7A03 # +0x6F7C 0x7A02 # +0x6F7D 0x7A1E # +0x6F7E 0x7A14 # +0x7021 0x7A39 # +0x7022 0x7A37 # +0x7023 0x7A51 # +0x7024 0x9ECF # +0x7025 0x99A5 # +0x7026 0x7A70 # +0x7027 0x7688 # +0x7028 0x768E # +0x7029 0x7693 # +0x702A 0x7699 # +0x702B 0x76A4 # +0x702C 0x74DE # +0x702D 0x74E0 # +0x702E 0x752C # +0x702F 0x9E20 # +0x7030 0x9E22 # +0x7031 0x9E28 # +0x7032 0x9E29 # +0x7033 0x9E2A # +0x7034 0x9E2B # +0x7035 0x9E2C # +0x7036 0x9E32 # +0x7037 0x9E31 # +0x7038 0x9E36 # +0x7039 0x9E38 # +0x703A 0x9E37 # +0x703B 0x9E39 # +0x703C 0x9E3A # +0x703D 0x9E3E # +0x703E 0x9E41 # +0x703F 0x9E42 # +0x7040 0x9E44 # +0x7041 0x9E46 # +0x7042 0x9E47 # +0x7043 0x9E48 # +0x7044 0x9E49 # +0x7045 0x9E4B # +0x7046 0x9E4C # +0x7047 0x9E4E # +0x7048 0x9E51 # +0x7049 0x9E55 # +0x704A 0x9E57 # +0x704B 0x9E5A # +0x704C 0x9E5B # +0x704D 0x9E5C # +0x704E 0x9E5E # +0x704F 0x9E63 # +0x7050 0x9E66 # +0x7051 0x9E67 # +0x7052 0x9E68 # +0x7053 0x9E69 # +0x7054 0x9E6A # +0x7055 0x9E6B # +0x7056 0x9E6C # +0x7057 0x9E71 # +0x7058 0x9E6D # +0x7059 0x9E73 # +0x705A 0x7592 # +0x705B 0x7594 # +0x705C 0x7596 # +0x705D 0x75A0 # +0x705E 0x759D # +0x705F 0x75AC # +0x7060 0x75A3 # +0x7061 0x75B3 # +0x7062 0x75B4 # +0x7063 0x75B8 # +0x7064 0x75C4 # +0x7065 0x75B1 # +0x7066 0x75B0 # +0x7067 0x75C3 # +0x7068 0x75C2 # +0x7069 0x75D6 # +0x706A 0x75CD # +0x706B 0x75E3 # +0x706C 0x75E8 # +0x706D 0x75E6 # +0x706E 0x75E4 # +0x706F 0x75EB # +0x7070 0x75E7 # +0x7071 0x7603 # +0x7072 0x75F1 # +0x7073 0x75FC # +0x7074 0x75FF # +0x7075 0x7610 # +0x7076 0x7600 # +0x7077 0x7605 # +0x7078 0x760C # +0x7079 0x7617 # +0x707A 0x760A # +0x707B 0x7625 # +0x707C 0x7618 # +0x707D 0x7615 # +0x707E 0x7619 # +0x7121 0x761B # +0x7122 0x763C # +0x7123 0x7622 # +0x7124 0x7620 # +0x7125 0x7640 # +0x7126 0x762D # +0x7127 0x7630 # +0x7128 0x763F # +0x7129 0x7635 # +0x712A 0x7643 # +0x712B 0x763E # +0x712C 0x7633 # +0x712D 0x764D # +0x712E 0x765E # +0x712F 0x7654 # +0x7130 0x765C # +0x7131 0x7656 # +0x7132 0x766B # +0x7133 0x766F # +0x7134 0x7FCA # +0x7135 0x7AE6 # +0x7136 0x7A78 # +0x7137 0x7A79 # +0x7138 0x7A80 # +0x7139 0x7A86 # +0x713A 0x7A88 # +0x713B 0x7A95 # +0x713C 0x7AA6 # +0x713D 0x7AA0 # +0x713E 0x7AAC # +0x713F 0x7AA8 # +0x7140 0x7AAD # +0x7141 0x7AB3 # +0x7142 0x8864 # +0x7143 0x8869 # +0x7144 0x8872 # +0x7145 0x887D # +0x7146 0x887F # +0x7147 0x8882 # +0x7148 0x88A2 # +0x7149 0x88C6 # +0x714A 0x88B7 # +0x714B 0x88BC # +0x714C 0x88C9 # +0x714D 0x88E2 # +0x714E 0x88CE # +0x714F 0x88E3 # +0x7150 0x88E5 # +0x7151 0x88F1 # +0x7152 0x891A # +0x7153 0x88FC # +0x7154 0x88E8 # +0x7155 0x88FE # +0x7156 0x88F0 # +0x7157 0x8921 # +0x7158 0x8919 # +0x7159 0x8913 # +0x715A 0x891B # +0x715B 0x890A # +0x715C 0x8934 # +0x715D 0x892B # +0x715E 0x8936 # +0x715F 0x8941 # +0x7160 0x8966 # +0x7161 0x897B # +0x7162 0x758B # +0x7163 0x80E5 # +0x7164 0x76B2 # +0x7165 0x76B4 # +0x7166 0x77DC # +0x7167 0x8012 # +0x7168 0x8014 # +0x7169 0x8016 # +0x716A 0x801C # +0x716B 0x8020 # +0x716C 0x8022 # +0x716D 0x8025 # +0x716E 0x8026 # +0x716F 0x8027 # +0x7170 0x8029 # +0x7171 0x8028 # +0x7172 0x8031 # +0x7173 0x800B # +0x7174 0x8035 # +0x7175 0x8043 # +0x7176 0x8046 # +0x7177 0x804D # +0x7178 0x8052 # +0x7179 0x8069 # +0x717A 0x8071 # +0x717B 0x8983 # +0x717C 0x9878 # +0x717D 0x9880 # +0x717E 0x9883 # +0x7221 0x9889 # +0x7222 0x988C # +0x7223 0x988D # +0x7224 0x988F # +0x7225 0x9894 # +0x7226 0x989A # +0x7227 0x989B # +0x7228 0x989E # +0x7229 0x989F # +0x722A 0x98A1 # +0x722B 0x98A2 # +0x722C 0x98A5 # +0x722D 0x98A6 # +0x722E 0x864D # +0x722F 0x8654 # +0x7230 0x866C # +0x7231 0x866E # +0x7232 0x867F # +0x7233 0x867A # +0x7234 0x867C # +0x7235 0x867B # +0x7236 0x86A8 # +0x7237 0x868D # +0x7238 0x868B # +0x7239 0x86AC # +0x723A 0x869D # +0x723B 0x86A7 # +0x723C 0x86A3 # +0x723D 0x86AA # +0x723E 0x8693 # +0x723F 0x86A9 # +0x7240 0x86B6 # +0x7241 0x86C4 # +0x7242 0x86B5 # +0x7243 0x86CE # +0x7244 0x86B0 # +0x7245 0x86BA # +0x7246 0x86B1 # +0x7247 0x86AF # +0x7248 0x86C9 # +0x7249 0x86CF # +0x724A 0x86B4 # +0x724B 0x86E9 # +0x724C 0x86F1 # +0x724D 0x86F2 # +0x724E 0x86ED # +0x724F 0x86F3 # +0x7250 0x86D0 # +0x7251 0x8713 # +0x7252 0x86DE # +0x7253 0x86F4 # +0x7254 0x86DF # +0x7255 0x86D8 # +0x7256 0x86D1 # +0x7257 0x8703 # +0x7258 0x8707 # +0x7259 0x86F8 # +0x725A 0x8708 # +0x725B 0x870A # +0x725C 0x870D # +0x725D 0x8709 # +0x725E 0x8723 # +0x725F 0x873B # +0x7260 0x871E # +0x7261 0x8725 # +0x7262 0x872E # +0x7263 0x871A # +0x7264 0x873E # +0x7265 0x8748 # +0x7266 0x8734 # +0x7267 0x8731 # +0x7268 0x8729 # +0x7269 0x8737 # +0x726A 0x873F # +0x726B 0x8782 # +0x726C 0x8722 # +0x726D 0x877D # +0x726E 0x877E # +0x726F 0x877B # +0x7270 0x8760 # +0x7271 0x8770 # +0x7272 0x874C # +0x7273 0x876E # +0x7274 0x878B # +0x7275 0x8753 # +0x7276 0x8763 # +0x7277 0x877C # +0x7278 0x8764 # +0x7279 0x8759 # +0x727A 0x8765 # +0x727B 0x8793 # +0x727C 0x87AF # +0x727D 0x87A8 # +0x727E 0x87D2 # +0x7321 0x87C6 # +0x7322 0x8788 # +0x7323 0x8785 # +0x7324 0x87AD # +0x7325 0x8797 # +0x7326 0x8783 # +0x7327 0x87AB # +0x7328 0x87E5 # +0x7329 0x87AC # +0x732A 0x87B5 # +0x732B 0x87B3 # +0x732C 0x87CB # +0x732D 0x87D3 # +0x732E 0x87BD # +0x732F 0x87D1 # +0x7330 0x87C0 # +0x7331 0x87CA # +0x7332 0x87DB # +0x7333 0x87EA # +0x7334 0x87E0 # +0x7335 0x87EE # +0x7336 0x8816 # +0x7337 0x8813 # +0x7338 0x87FE # +0x7339 0x880A # +0x733A 0x881B # +0x733B 0x8821 # +0x733C 0x8839 # +0x733D 0x883C # +0x733E 0x7F36 # +0x733F 0x7F42 # +0x7340 0x7F44 # +0x7341 0x7F45 # +0x7342 0x8210 # +0x7343 0x7AFA # +0x7344 0x7AFD # +0x7345 0x7B08 # +0x7346 0x7B03 # +0x7347 0x7B04 # +0x7348 0x7B15 # +0x7349 0x7B0A # +0x734A 0x7B2B # +0x734B 0x7B0F # +0x734C 0x7B47 # +0x734D 0x7B38 # +0x734E 0x7B2A # +0x734F 0x7B19 # +0x7350 0x7B2E # +0x7351 0x7B31 # +0x7352 0x7B20 # +0x7353 0x7B25 # +0x7354 0x7B24 # +0x7355 0x7B33 # +0x7356 0x7B3E # +0x7357 0x7B1E # +0x7358 0x7B58 # +0x7359 0x7B5A # +0x735A 0x7B45 # +0x735B 0x7B75 # +0x735C 0x7B4C # +0x735D 0x7B5D # +0x735E 0x7B60 # +0x735F 0x7B6E # +0x7360 0x7B7B # +0x7361 0x7B62 # +0x7362 0x7B72 # +0x7363 0x7B71 # +0x7364 0x7B90 # +0x7365 0x7BA6 # +0x7366 0x7BA7 # +0x7367 0x7BB8 # +0x7368 0x7BAC # +0x7369 0x7B9D # +0x736A 0x7BA8 # +0x736B 0x7B85 # +0x736C 0x7BAA # +0x736D 0x7B9C # +0x736E 0x7BA2 # +0x736F 0x7BAB # +0x7370 0x7BB4 # +0x7371 0x7BD1 # +0x7372 0x7BC1 # +0x7373 0x7BCC # +0x7374 0x7BDD # +0x7375 0x7BDA # +0x7376 0x7BE5 # +0x7377 0x7BE6 # +0x7378 0x7BEA # +0x7379 0x7C0C # +0x737A 0x7BFE # +0x737B 0x7BFC # +0x737C 0x7C0F # +0x737D 0x7C16 # +0x737E 0x7C0B # +0x7421 0x7C1F # +0x7422 0x7C2A # +0x7423 0x7C26 # +0x7424 0x7C38 # +0x7425 0x7C41 # +0x7426 0x7C40 # +0x7427 0x81FE # +0x7428 0x8201 # +0x7429 0x8202 # +0x742A 0x8204 # +0x742B 0x81EC # +0x742C 0x8844 # +0x742D 0x8221 # +0x742E 0x8222 # +0x742F 0x8223 # +0x7430 0x822D # +0x7431 0x822F # +0x7432 0x8228 # +0x7433 0x822B # +0x7434 0x8238 # +0x7435 0x823B # +0x7436 0x8233 # +0x7437 0x8234 # +0x7438 0x823E # +0x7439 0x8244 # +0x743A 0x8249 # +0x743B 0x824B # +0x743C 0x824F # +0x743D 0x825A # +0x743E 0x825F # +0x743F 0x8268 # +0x7440 0x887E # +0x7441 0x8885 # +0x7442 0x8888 # +0x7443 0x88D8 # +0x7444 0x88DF # +0x7445 0x895E # +0x7446 0x7F9D # +0x7447 0x7F9F # +0x7448 0x7FA7 # +0x7449 0x7FAF # +0x744A 0x7FB0 # +0x744B 0x7FB2 # +0x744C 0x7C7C # +0x744D 0x6549 # +0x744E 0x7C91 # +0x744F 0x7C9D # +0x7450 0x7C9C # +0x7451 0x7C9E # +0x7452 0x7CA2 # +0x7453 0x7CB2 # +0x7454 0x7CBC # +0x7455 0x7CBD # +0x7456 0x7CC1 # +0x7457 0x7CC7 # +0x7458 0x7CCC # +0x7459 0x7CCD # +0x745A 0x7CC8 # +0x745B 0x7CC5 # +0x745C 0x7CD7 # +0x745D 0x7CE8 # +0x745E 0x826E # +0x745F 0x66A8 # +0x7460 0x7FBF # +0x7461 0x7FCE # +0x7462 0x7FD5 # +0x7463 0x7FE5 # +0x7464 0x7FE1 # +0x7465 0x7FE6 # +0x7466 0x7FE9 # +0x7467 0x7FEE # +0x7468 0x7FF3 # +0x7469 0x7CF8 # +0x746A 0x7D77 # +0x746B 0x7DA6 # +0x746C 0x7DAE # +0x746D 0x7E47 # +0x746E 0x7E9B # +0x746F 0x9EB8 # +0x7470 0x9EB4 # +0x7471 0x8D73 # +0x7472 0x8D84 # +0x7473 0x8D94 # +0x7474 0x8D91 # +0x7475 0x8DB1 # +0x7476 0x8D67 # +0x7477 0x8D6D # +0x7478 0x8C47 # +0x7479 0x8C49 # +0x747A 0x914A # +0x747B 0x9150 # +0x747C 0x914E # +0x747D 0x914F # +0x747E 0x9164 # +0x7521 0x9162 # +0x7522 0x9161 # +0x7523 0x9170 # +0x7524 0x9169 # +0x7525 0x916F # +0x7526 0x917D # +0x7527 0x917E # +0x7528 0x9172 # +0x7529 0x9174 # +0x752A 0x9179 # +0x752B 0x918C # +0x752C 0x9185 # +0x752D 0x9190 # +0x752E 0x918D # +0x752F 0x9191 # +0x7530 0x91A2 # +0x7531 0x91A3 # +0x7532 0x91AA # +0x7533 0x91AD # +0x7534 0x91AE # +0x7535 0x91AF # +0x7536 0x91B5 # +0x7537 0x91B4 # +0x7538 0x91BA # +0x7539 0x8C55 # +0x753A 0x9E7E # +0x753B 0x8DB8 # +0x753C 0x8DEB # +0x753D 0x8E05 # +0x753E 0x8E59 # +0x753F 0x8E69 # +0x7540 0x8DB5 # +0x7541 0x8DBF # +0x7542 0x8DBC # +0x7543 0x8DBA # +0x7544 0x8DC4 # +0x7545 0x8DD6 # +0x7546 0x8DD7 # +0x7547 0x8DDA # +0x7548 0x8DDE # +0x7549 0x8DCE # +0x754A 0x8DCF # +0x754B 0x8DDB # +0x754C 0x8DC6 # +0x754D 0x8DEC # +0x754E 0x8DF7 # +0x754F 0x8DF8 # +0x7550 0x8DE3 # +0x7551 0x8DF9 # +0x7552 0x8DFB # +0x7553 0x8DE4 # +0x7554 0x8E09 # +0x7555 0x8DFD # +0x7556 0x8E14 # +0x7557 0x8E1D # +0x7558 0x8E1F # +0x7559 0x8E2C # +0x755A 0x8E2E # +0x755B 0x8E23 # +0x755C 0x8E2F # +0x755D 0x8E3A # +0x755E 0x8E40 # +0x755F 0x8E39 # +0x7560 0x8E35 # +0x7561 0x8E3D # +0x7562 0x8E31 # +0x7563 0x8E49 # +0x7564 0x8E41 # +0x7565 0x8E42 # +0x7566 0x8E51 # +0x7567 0x8E52 # +0x7568 0x8E4A # +0x7569 0x8E70 # +0x756A 0x8E76 # +0x756B 0x8E7C # +0x756C 0x8E6F # +0x756D 0x8E74 # +0x756E 0x8E85 # +0x756F 0x8E8F # +0x7570 0x8E94 # +0x7571 0x8E90 # +0x7572 0x8E9C # +0x7573 0x8E9E # +0x7574 0x8C78 # +0x7575 0x8C82 # +0x7576 0x8C8A # +0x7577 0x8C85 # +0x7578 0x8C98 # +0x7579 0x8C94 # +0x757A 0x659B # +0x757B 0x89D6 # +0x757C 0x89DE # +0x757D 0x89DA # +0x757E 0x89DC # +0x7621 0x89E5 # +0x7622 0x89EB # +0x7623 0x89EF # +0x7624 0x8A3E # +0x7625 0x8B26 # +0x7626 0x9753 # +0x7627 0x96E9 # +0x7628 0x96F3 # +0x7629 0x96EF # +0x762A 0x9706 # +0x762B 0x9701 # +0x762C 0x9708 # +0x762D 0x970F # +0x762E 0x970E # +0x762F 0x972A # +0x7630 0x972D # +0x7631 0x9730 # +0x7632 0x973E # +0x7633 0x9F80 # +0x7634 0x9F83 # +0x7635 0x9F85 # +0x7636 0x9F86 # +0x7637 0x9F87 # +0x7638 0x9F88 # +0x7639 0x9F89 # +0x763A 0x9F8A # +0x763B 0x9F8C # +0x763C 0x9EFE # +0x763D 0x9F0B # +0x763E 0x9F0D # +0x763F 0x96B9 # +0x7640 0x96BC # +0x7641 0x96BD # +0x7642 0x96CE # +0x7643 0x96D2 # +0x7644 0x77BF # +0x7645 0x96E0 # +0x7646 0x928E # +0x7647 0x92AE # +0x7648 0x92C8 # +0x7649 0x933E # +0x764A 0x936A # +0x764B 0x93CA # +0x764C 0x938F # +0x764D 0x943E # +0x764E 0x946B # +0x764F 0x9C7F # +0x7650 0x9C82 # +0x7651 0x9C85 # +0x7652 0x9C86 # +0x7653 0x9C87 # +0x7654 0x9C88 # +0x7655 0x7A23 # +0x7656 0x9C8B # +0x7657 0x9C8E # +0x7658 0x9C90 # +0x7659 0x9C91 # +0x765A 0x9C92 # +0x765B 0x9C94 # +0x765C 0x9C95 # +0x765D 0x9C9A # +0x765E 0x9C9B # +0x765F 0x9C9E # +0x7660 0x9C9F # +0x7661 0x9CA0 # +0x7662 0x9CA1 # +0x7663 0x9CA2 # +0x7664 0x9CA3 # +0x7665 0x9CA5 # +0x7666 0x9CA6 # +0x7667 0x9CA7 # +0x7668 0x9CA8 # +0x7669 0x9CA9 # +0x766A 0x9CAB # +0x766B 0x9CAD # +0x766C 0x9CAE # +0x766D 0x9CB0 # +0x766E 0x9CB1 # +0x766F 0x9CB2 # +0x7670 0x9CB3 # +0x7671 0x9CB4 # +0x7672 0x9CB5 # +0x7673 0x9CB6 # +0x7674 0x9CB7 # +0x7675 0x9CBA # +0x7676 0x9CBB # +0x7677 0x9CBC # +0x7678 0x9CBD # +0x7679 0x9CC4 # +0x767A 0x9CC5 # +0x767B 0x9CC6 # +0x767C 0x9CC7 # +0x767D 0x9CCA # +0x767E 0x9CCB # +0x7721 0x9CCC # +0x7722 0x9CCD # +0x7723 0x9CCE # +0x7724 0x9CCF # +0x7725 0x9CD0 # +0x7726 0x9CD3 # +0x7727 0x9CD4 # +0x7728 0x9CD5 # +0x7729 0x9CD7 # +0x772A 0x9CD8 # +0x772B 0x9CD9 # +0x772C 0x9CDC # +0x772D 0x9CDD # +0x772E 0x9CDF # +0x772F 0x9CE2 # +0x7730 0x977C # +0x7731 0x9785 # +0x7732 0x9791 # +0x7733 0x9792 # +0x7734 0x9794 # +0x7735 0x97AF # +0x7736 0x97AB # +0x7737 0x97A3 # +0x7738 0x97B2 # +0x7739 0x97B4 # +0x773A 0x9AB1 # +0x773B 0x9AB0 # +0x773C 0x9AB7 # +0x773D 0x9E58 # +0x773E 0x9AB6 # +0x773F 0x9ABA # +0x7740 0x9ABC # +0x7741 0x9AC1 # +0x7742 0x9AC0 # +0x7743 0x9AC5 # +0x7744 0x9AC2 # +0x7745 0x9ACB # +0x7746 0x9ACC # +0x7747 0x9AD1 # +0x7748 0x9B45 # +0x7749 0x9B43 # +0x774A 0x9B47 # +0x774B 0x9B49 # +0x774C 0x9B48 # +0x774D 0x9B4D # +0x774E 0x9B51 # +0x774F 0x98E8 # +0x7750 0x990D # +0x7751 0x992E # +0x7752 0x9955 # +0x7753 0x9954 # +0x7754 0x9ADF # +0x7755 0x9AE1 # +0x7756 0x9AE6 # +0x7757 0x9AEF # +0x7758 0x9AEB # +0x7759 0x9AFB # +0x775A 0x9AED # +0x775B 0x9AF9 # +0x775C 0x9B08 # +0x775D 0x9B0F # +0x775E 0x9B13 # +0x775F 0x9B1F # +0x7760 0x9B23 # +0x7761 0x9EBD # +0x7762 0x9EBE # +0x7763 0x7E3B # +0x7764 0x9E82 # +0x7765 0x9E87 # +0x7766 0x9E88 # +0x7767 0x9E8B # +0x7768 0x9E92 # +0x7769 0x93D6 # +0x776A 0x9E9D # +0x776B 0x9E9F # +0x776C 0x9EDB # +0x776D 0x9EDC # +0x776E 0x9EDD # +0x776F 0x9EE0 # +0x7770 0x9EDF # +0x7771 0x9EE2 # +0x7772 0x9EE9 # +0x7773 0x9EE7 # +0x7774 0x9EE5 # +0x7775 0x9EEA # +0x7776 0x9EEF # +0x7777 0x9F22 # +0x7778 0x9F2C # +0x7779 0x9F2F # +0x777A 0x9F39 # +0x777B 0x9F37 # +0x777C 0x9F3D # +0x777D 0x9F3E # +0x777E 0x9F44 # diff --git a/Tools/unicode/python-mappings/diff/jisx0213-2000-std.txt.diff b/Tools/unicode/python-mappings/diff/jisx0213-2000-std.txt.diff new file mode 100644 index 0000000000000000000000000000000000000000..e4171d5ee1c241c05946601713903addc244111c --- /dev/null +++ b/Tools/unicode/python-mappings/diff/jisx0213-2000-std.txt.diff @@ -0,0 +1,271 @@ +--- jisx0213-2000-std.txt.orig Tue Apr 16 23:32:38 2002 ++++ jisx0213-2000-std.txt Wed Jun 16 14:49:05 2004 +@@ -23,21 +23,21 @@ + 3-2121 U+3000 # IDEOGRAPHIC SPACE + 3-2122 U+3001 # IDEOGRAPHIC COMMA + 3-2123 U+3002 # IDEOGRAPHIC FULL STOP +-3-2124 U+002C # COMMA Fullwidth: U+FF0C +-3-2125 U+002E # FULL STOP Fullwidth: U+FF0E ++3-2124 U+FF0C # COMMA Fullwidth: U+FF0C ++3-2125 U+FF0E # FULL STOP Fullwidth: U+FF0E + 3-2126 U+30FB # KATAKANA MIDDLE DOT +-3-2127 U+003A # COLON Fullwidth: U+FF1A +-3-2128 U+003B # SEMICOLON Fullwidth: U+FF1B +-3-2129 U+003F # QUESTION MARK Fullwidth: U+FF1F +-3-212A U+0021 # EXCLAMATION MARK Fullwidth: U+FF01 ++3-2127 U+FF1A # COLON Fullwidth: U+FF1A ++3-2128 U+FF1B # SEMICOLON Fullwidth: U+FF1B ++3-2129 U+FF1F # QUESTION MARK Fullwidth: U+FF1F ++3-212A U+FF01 # EXCLAMATION MARK Fullwidth: U+FF01 + 3-212B U+309B # KATAKANA-HIRAGANA VOICED SOUND MARK + 3-212C U+309C # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + 3-212D U+00B4 # ACUTE ACCENT +-3-212E U+0060 # GRAVE ACCENT Fullwidth: U+FF40 ++3-212E U+FF40 # GRAVE ACCENT Fullwidth: U+FF40 + 3-212F U+00A8 # DIAERESIS +-3-2130 U+005E # CIRCUMFLEX ACCENT Fullwidth: U+FF3E +-3-2131 U+203E # OVERLINE Windows: U+FFE3 +-3-2132 U+005F # LOW LINE Fullwidth: U+FF3F ++3-2130 U+FF3E # CIRCUMFLEX ACCENT Fullwidth: U+FF3E ++3-2131 U+FFE3 # OVERLINE Windows: U+FFE3 ++3-2132 U+FF3F # LOW LINE Fullwidth: U+FF3F + 3-2133 U+30FD # KATAKANA ITERATION MARK + 3-2134 U+30FE # KATAKANA VOICED ITERATION MARK + 3-2135 U+309D # HIRAGANA ITERATION MARK +@@ -48,27 +48,27 @@ + 3-213A U+3006 # IDEOGRAPHIC CLOSING MARK + 3-213B U+3007 # IDEOGRAPHIC NUMBER ZERO + 3-213C U+30FC # KATAKANA-HIRAGANA PROLONGED SOUND MARK +-3-213D U+2014 # EM DASH Windows: U+2015 ++3-213D U+2015 # EM DASH Windows: U+2015 + 3-213E U+2010 # HYPHEN +-3-213F U+002F # SOLIDUS Fullwidth: U+FF0F ++3-213F U+FF0F # SOLIDUS Fullwidth: U+FF0F + 3-2140 U+005C # REVERSE SOLIDUS Fullwidth: U+FF3C + 3-2141 U+301C # WAVE DASH Windows: U+FF5E + 3-2142 U+2016 # DOUBLE VERTICAL LINE Windows: U+2225 +-3-2143 U+007C # VERTICAL LINE Fullwidth: U+FF5C ++3-2143 U+FF5C # VERTICAL LINE Fullwidth: U+FF5C + 3-2144 U+2026 # HORIZONTAL ELLIPSIS + 3-2145 U+2025 # TWO DOT LEADER + 3-2146 U+2018 # LEFT SINGLE QUOTATION MARK + 3-2147 U+2019 # RIGHT SINGLE QUOTATION MARK + 3-2148 U+201C # LEFT DOUBLE QUOTATION MARK + 3-2149 U+201D # RIGHT DOUBLE QUOTATION MARK +-3-214A U+0028 # LEFT PARENTHESIS Fullwidth: U+FF08 +-3-214B U+0029 # RIGHT PARENTHESIS Fullwidth: U+FF09 ++3-214A U+FF08 # LEFT PARENTHESIS Fullwidth: U+FF08 ++3-214B U+FF09 # RIGHT PARENTHESIS Fullwidth: U+FF09 + 3-214C U+3014 # LEFT TORTOISE SHELL BRACKET + 3-214D U+3015 # RIGHT TORTOISE SHELL BRACKET +-3-214E U+005B # LEFT SQUARE BRACKET Fullwidth: U+FF3B +-3-214F U+005D # RIGHT SQUARE BRACKET Fullwidth: U+FF3D +-3-2150 U+007B # LEFT CURLY BRACKET Fullwidth: U+FF5B +-3-2151 U+007D # RIGHT CURLY BRACKET Fullwidth: U+FF5D ++3-214E U+FF3B # LEFT SQUARE BRACKET Fullwidth: U+FF3B ++3-214F U+FF3D # RIGHT SQUARE BRACKET Fullwidth: U+FF3D ++3-2150 U+FF5B # LEFT CURLY BRACKET Fullwidth: U+FF5B ++3-2151 U+FF5D # RIGHT CURLY BRACKET Fullwidth: U+FF5D + 3-2152 U+3008 # LEFT ANGLE BRACKET + 3-2153 U+3009 # RIGHT ANGLE BRACKET + 3-2154 U+300A # LEFT DOUBLE ANGLE BRACKET +@@ -79,15 +79,15 @@ + 3-2159 U+300F # RIGHT WHITE CORNER BRACKET + 3-215A U+3010 # LEFT BLACK LENTICULAR BRACKET + 3-215B U+3011 # RIGHT BLACK LENTICULAR BRACKET +-3-215C U+002B # PLUS SIGN Fullwidth: U+FF0B ++3-215C U+FF0B # PLUS SIGN Fullwidth: U+FF0B + 3-215D U+2212 # MINUS SIGN Windows: U+FF0D + 3-215E U+00B1 # PLUS-MINUS SIGN + 3-215F U+00D7 # MULTIPLICATION SIGN + 3-2160 U+00F7 # DIVISION SIGN +-3-2161 U+003D # EQUALS SIGN Fullwidth: U+FF1D ++3-2161 U+FF1D # EQUALS SIGN Fullwidth: U+FF1D + 3-2162 U+2260 # NOT EQUAL TO +-3-2163 U+003C # LESS-THAN SIGN Fullwidth: U+FF1C +-3-2164 U+003E # GREATER-THAN SIGN Fullwidth: U+FF1E ++3-2163 U+FF1C # LESS-THAN SIGN Fullwidth: U+FF1C ++3-2164 U+FF1E # GREATER-THAN SIGN Fullwidth: U+FF1E + 3-2165 U+2266 # LESS-THAN OVER EQUAL TO + 3-2166 U+2267 # GREATER-THAN OVER EQUAL TO + 3-2167 U+221E # INFINITY +@@ -98,15 +98,15 @@ + 3-216C U+2032 # PRIME + 3-216D U+2033 # DOUBLE PRIME + 3-216E U+2103 # DEGREE CELSIUS +-3-216F U+00A5 # YEN SIGN Windows: U+FFE5 +-3-2170 U+0024 # DOLLAR SIGN Fullwidth: U+FF04 ++3-216F U+FFE5 # YEN SIGN Windows: U+FFE5 ++3-2170 U+FF04 # DOLLAR SIGN Fullwidth: U+FF04 + 3-2171 U+00A2 # CENT SIGN Windows: U+FFE0 + 3-2172 U+00A3 # POUND SIGN Windows: U+FFE1 +-3-2173 U+0025 # PERCENT SIGN Fullwidth: U+FF05 +-3-2174 U+0023 # NUMBER SIGN Fullwidth: U+FF03 +-3-2175 U+0026 # AMPERSAND Fullwidth: U+FF06 +-3-2176 U+002A # ASTERISK Fullwidth: U+FF0A +-3-2177 U+0040 # COMMERCIAL AT Fullwidth: U+FF20 ++3-2173 U+FF05 # PERCENT SIGN Fullwidth: U+FF05 ++3-2174 U+FF03 # NUMBER SIGN Fullwidth: U+FF03 ++3-2175 U+FF06 # AMPERSAND Fullwidth: U+FF06 ++3-2176 U+FF0A # ASTERISK Fullwidth: U+FF0A ++3-2177 U+FF20 # COMMERCIAL AT Fullwidth: U+FF20 + 3-2178 U+00A7 # SECTION SIGN + 3-2179 U+2606 # WHITE STAR + 3-217A U+2605 # BLACK STAR +@@ -128,9 +128,9 @@ + 3-222C U+2191 # UPWARDS ARROW + 3-222D U+2193 # DOWNWARDS ARROW + 3-222E U+3013 # GETA MARK +-3-222F U+0027 # APOSTROPHE Fullwidth: U+FF07 +-3-2230 U+0022 # QUOTATION MARK [2000] Fullwidth: U+FF02 +-3-2231 U+002D # HYPHEN-MINUS [2000] Fullwidth: U+FF0D ++3-222F U+FF07 # APOSTROPHE Fullwidth: U+FF07 ++3-2230 U+FF02 # QUOTATION MARK [2000] Fullwidth: U+FF02 ++3-2231 U+FF0D # HYPHEN-MINUS [2000] Fullwidth: U+FF0D + 3-2232 U+007E # TILDE [2000] Fullwidth: U+FF5E + 3-2233 U+3033 # VERTICAL KANA REPEAT MARK UPPER HALF [2000] + 3-2234 U+3034 # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF [2000] +@@ -223,16 +223,16 @@ + 3-232D U+21E9 # DOWNWARDS WHITE ARROW [2000] + 3-232E U+2934 # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS [2000] [Unicode3.2] + 3-232F U+2935 # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS [2000] [Unicode3.2] +-3-2330 U+0030 # DIGIT ZERO Fullwidth: U+FF10 +-3-2331 U+0031 # DIGIT ONE Fullwidth: U+FF11 +-3-2332 U+0032 # DIGIT TWO Fullwidth: U+FF12 +-3-2333 U+0033 # DIGIT THREE Fullwidth: U+FF13 +-3-2334 U+0034 # DIGIT FOUR Fullwidth: U+FF14 +-3-2335 U+0035 # DIGIT FIVE Fullwidth: U+FF15 +-3-2336 U+0036 # DIGIT SIX Fullwidth: U+FF16 +-3-2337 U+0037 # DIGIT SEVEN Fullwidth: U+FF17 +-3-2338 U+0038 # DIGIT EIGHT Fullwidth: U+FF18 +-3-2339 U+0039 # DIGIT NINE Fullwidth: U+FF19 ++3-2330 U+FF10 # DIGIT ZERO Fullwidth: U+FF10 ++3-2331 U+FF11 # DIGIT ONE Fullwidth: U+FF11 ++3-2332 U+FF12 # DIGIT TWO Fullwidth: U+FF12 ++3-2333 U+FF13 # DIGIT THREE Fullwidth: U+FF13 ++3-2334 U+FF14 # DIGIT FOUR Fullwidth: U+FF14 ++3-2335 U+FF15 # DIGIT FIVE Fullwidth: U+FF15 ++3-2336 U+FF16 # DIGIT SIX Fullwidth: U+FF16 ++3-2337 U+FF17 # DIGIT SEVEN Fullwidth: U+FF17 ++3-2338 U+FF18 # DIGIT EIGHT Fullwidth: U+FF18 ++3-2339 U+FF19 # DIGIT NINE Fullwidth: U+FF19 + 3-233A U+29BF # CIRCLED BULLET [2000] [Unicode3.2] + 3-233B U+25C9 # FISHEYE [2000] + 3-233C U+303D # PART ALTERNATION MARK [2000] [Unicode3.2] +@@ -240,64 +240,64 @@ + 3-233E U+FE45 # SESAME DOT [2000] [Unicode3.2] + 3-233F U+25E6 # WHITE BULLET [2000] + 3-2340 U+2022 # BULLET [2000] +-3-2341 U+0041 # LATIN CAPITAL LETTER A Fullwidth: U+FF21 +-3-2342 U+0042 # LATIN CAPITAL LETTER B Fullwidth: U+FF22 +-3-2343 U+0043 # LATIN CAPITAL LETTER C Fullwidth: U+FF23 +-3-2344 U+0044 # LATIN CAPITAL LETTER D Fullwidth: U+FF24 +-3-2345 U+0045 # LATIN CAPITAL LETTER E Fullwidth: U+FF25 +-3-2346 U+0046 # LATIN CAPITAL LETTER F Fullwidth: U+FF26 +-3-2347 U+0047 # LATIN CAPITAL LETTER G Fullwidth: U+FF27 +-3-2348 U+0048 # LATIN CAPITAL LETTER H Fullwidth: U+FF28 +-3-2349 U+0049 # LATIN CAPITAL LETTER I Fullwidth: U+FF29 +-3-234A U+004A # LATIN CAPITAL LETTER J Fullwidth: U+FF2A +-3-234B U+004B # LATIN CAPITAL LETTER K Fullwidth: U+FF2B +-3-234C U+004C # LATIN CAPITAL LETTER L Fullwidth: U+FF2C +-3-234D U+004D # LATIN CAPITAL LETTER M Fullwidth: U+FF2D +-3-234E U+004E # LATIN CAPITAL LETTER N Fullwidth: U+FF2E +-3-234F U+004F # LATIN CAPITAL LETTER O Fullwidth: U+FF2F +-3-2350 U+0050 # LATIN CAPITAL LETTER P Fullwidth: U+FF30 +-3-2351 U+0051 # LATIN CAPITAL LETTER Q Fullwidth: U+FF31 +-3-2352 U+0052 # LATIN CAPITAL LETTER R Fullwidth: U+FF32 +-3-2353 U+0053 # LATIN CAPITAL LETTER S Fullwidth: U+FF33 +-3-2354 U+0054 # LATIN CAPITAL LETTER T Fullwidth: U+FF34 +-3-2355 U+0055 # LATIN CAPITAL LETTER U Fullwidth: U+FF35 +-3-2356 U+0056 # LATIN CAPITAL LETTER V Fullwidth: U+FF36 +-3-2357 U+0057 # LATIN CAPITAL LETTER W Fullwidth: U+FF37 +-3-2358 U+0058 # LATIN CAPITAL LETTER X Fullwidth: U+FF38 +-3-2359 U+0059 # LATIN CAPITAL LETTER Y Fullwidth: U+FF39 +-3-235A U+005A # LATIN CAPITAL LETTER Z Fullwidth: U+FF3A ++3-2341 U+FF21 # LATIN CAPITAL LETTER A Fullwidth: U+FF21 ++3-2342 U+FF22 # LATIN CAPITAL LETTER B Fullwidth: U+FF22 ++3-2343 U+FF23 # LATIN CAPITAL LETTER C Fullwidth: U+FF23 ++3-2344 U+FF24 # LATIN CAPITAL LETTER D Fullwidth: U+FF24 ++3-2345 U+FF25 # LATIN CAPITAL LETTER E Fullwidth: U+FF25 ++3-2346 U+FF26 # LATIN CAPITAL LETTER F Fullwidth: U+FF26 ++3-2347 U+FF27 # LATIN CAPITAL LETTER G Fullwidth: U+FF27 ++3-2348 U+FF28 # LATIN CAPITAL LETTER H Fullwidth: U+FF28 ++3-2349 U+FF29 # LATIN CAPITAL LETTER I Fullwidth: U+FF29 ++3-234A U+FF2A # LATIN CAPITAL LETTER J Fullwidth: U+FF2A ++3-234B U+FF2B # LATIN CAPITAL LETTER K Fullwidth: U+FF2B ++3-234C U+FF2C # LATIN CAPITAL LETTER L Fullwidth: U+FF2C ++3-234D U+FF2D # LATIN CAPITAL LETTER M Fullwidth: U+FF2D ++3-234E U+FF2E # LATIN CAPITAL LETTER N Fullwidth: U+FF2E ++3-234F U+FF2F # LATIN CAPITAL LETTER O Fullwidth: U+FF2F ++3-2350 U+FF30 # LATIN CAPITAL LETTER P Fullwidth: U+FF30 ++3-2351 U+FF31 # LATIN CAPITAL LETTER Q Fullwidth: U+FF31 ++3-2352 U+FF32 # LATIN CAPITAL LETTER R Fullwidth: U+FF32 ++3-2353 U+FF33 # LATIN CAPITAL LETTER S Fullwidth: U+FF33 ++3-2354 U+FF34 # LATIN CAPITAL LETTER T Fullwidth: U+FF34 ++3-2355 U+FF35 # LATIN CAPITAL LETTER U Fullwidth: U+FF35 ++3-2356 U+FF36 # LATIN CAPITAL LETTER V Fullwidth: U+FF36 ++3-2357 U+FF37 # LATIN CAPITAL LETTER W Fullwidth: U+FF37 ++3-2358 U+FF38 # LATIN CAPITAL LETTER X Fullwidth: U+FF38 ++3-2359 U+FF39 # LATIN CAPITAL LETTER Y Fullwidth: U+FF39 ++3-235A U+FF3A # LATIN CAPITAL LETTER Z Fullwidth: U+FF3A + 3-235B U+2213 # MINUS-OR-PLUS SIGN [2000] + 3-235C U+2135 # ALEF SYMBOL [2000] + 3-235D U+210F # PLANCK CONSTANT OVER TWO PI [2000] + 3-235E U+33CB # SQUARE HP [2000] + 3-235F U+2113 # SCRIPT SMALL L [2000] + 3-2360 U+2127 # INVERTED OHM SIGN [2000] +-3-2361 U+0061 # LATIN SMALL LETTER A Fullwidth: U+FF41 +-3-2362 U+0062 # LATIN SMALL LETTER B Fullwidth: U+FF42 +-3-2363 U+0063 # LATIN SMALL LETTER C Fullwidth: U+FF43 +-3-2364 U+0064 # LATIN SMALL LETTER D Fullwidth: U+FF44 +-3-2365 U+0065 # LATIN SMALL LETTER E Fullwidth: U+FF45 +-3-2366 U+0066 # LATIN SMALL LETTER F Fullwidth: U+FF46 +-3-2367 U+0067 # LATIN SMALL LETTER G Fullwidth: U+FF47 +-3-2368 U+0068 # LATIN SMALL LETTER H Fullwidth: U+FF48 +-3-2369 U+0069 # LATIN SMALL LETTER I Fullwidth: U+FF49 +-3-236A U+006A # LATIN SMALL LETTER J Fullwidth: U+FF4A +-3-236B U+006B # LATIN SMALL LETTER K Fullwidth: U+FF4B +-3-236C U+006C # LATIN SMALL LETTER L Fullwidth: U+FF4C +-3-236D U+006D # LATIN SMALL LETTER M Fullwidth: U+FF4D +-3-236E U+006E # LATIN SMALL LETTER N Fullwidth: U+FF4E +-3-236F U+006F # LATIN SMALL LETTER O Fullwidth: U+FF4F +-3-2370 U+0070 # LATIN SMALL LETTER P Fullwidth: U+FF50 +-3-2371 U+0071 # LATIN SMALL LETTER Q Fullwidth: U+FF51 +-3-2372 U+0072 # LATIN SMALL LETTER R Fullwidth: U+FF52 +-3-2373 U+0073 # LATIN SMALL LETTER S Fullwidth: U+FF53 +-3-2374 U+0074 # LATIN SMALL LETTER T Fullwidth: U+FF54 +-3-2375 U+0075 # LATIN SMALL LETTER U Fullwidth: U+FF55 +-3-2376 U+0076 # LATIN SMALL LETTER V Fullwidth: U+FF56 +-3-2377 U+0077 # LATIN SMALL LETTER W Fullwidth: U+FF57 +-3-2378 U+0078 # LATIN SMALL LETTER X Fullwidth: U+FF58 +-3-2379 U+0079 # LATIN SMALL LETTER Y Fullwidth: U+FF59 +-3-237A U+007A # LATIN SMALL LETTER Z Fullwidth: U+FF5A ++3-2361 U+FF41 # LATIN SMALL LETTER A Fullwidth: U+FF41 ++3-2362 U+FF42 # LATIN SMALL LETTER B Fullwidth: U+FF42 ++3-2363 U+FF43 # LATIN SMALL LETTER C Fullwidth: U+FF43 ++3-2364 U+FF44 # LATIN SMALL LETTER D Fullwidth: U+FF44 ++3-2365 U+FF45 # LATIN SMALL LETTER E Fullwidth: U+FF45 ++3-2366 U+FF46 # LATIN SMALL LETTER F Fullwidth: U+FF46 ++3-2367 U+FF47 # LATIN SMALL LETTER G Fullwidth: U+FF47 ++3-2368 U+FF48 # LATIN SMALL LETTER H Fullwidth: U+FF48 ++3-2369 U+FF49 # LATIN SMALL LETTER I Fullwidth: U+FF49 ++3-236A U+FF4A # LATIN SMALL LETTER J Fullwidth: U+FF4A ++3-236B U+FF4B # LATIN SMALL LETTER K Fullwidth: U+FF4B ++3-236C U+FF4C # LATIN SMALL LETTER L Fullwidth: U+FF4C ++3-236D U+FF4D # LATIN SMALL LETTER M Fullwidth: U+FF4D ++3-236E U+FF4E # LATIN SMALL LETTER N Fullwidth: U+FF4E ++3-236F U+FF4F # LATIN SMALL LETTER O Fullwidth: U+FF4F ++3-2370 U+FF50 # LATIN SMALL LETTER P Fullwidth: U+FF50 ++3-2371 U+FF51 # LATIN SMALL LETTER Q Fullwidth: U+FF51 ++3-2372 U+FF52 # LATIN SMALL LETTER R Fullwidth: U+FF52 ++3-2373 U+FF53 # LATIN SMALL LETTER S Fullwidth: U+FF53 ++3-2374 U+FF54 # LATIN SMALL LETTER T Fullwidth: U+FF54 ++3-2375 U+FF55 # LATIN SMALL LETTER U Fullwidth: U+FF55 ++3-2376 U+FF56 # LATIN SMALL LETTER V Fullwidth: U+FF56 ++3-2377 U+FF57 # LATIN SMALL LETTER W Fullwidth: U+FF57 ++3-2378 U+FF58 # LATIN SMALL LETTER X Fullwidth: U+FF58 ++3-2379 U+FF59 # LATIN SMALL LETTER Y Fullwidth: U+FF59 ++3-237A U+FF5A # LATIN SMALL LETTER Z Fullwidth: U+FF5A + 3-237B U+30A0 # KATAKANA-HIRAGANA DOUBLE HYPHEN [2000] [Unicode3.2] + 3-237C U+2013 # EN DASH [2000] + 3-237D U+29FA # DOUBLE PLUS [2000] [Unicode3.2] diff --git a/Tools/unicode/python-mappings/diff/jisx0213-2004-std.txt.diff b/Tools/unicode/python-mappings/diff/jisx0213-2004-std.txt.diff new file mode 100644 index 0000000000000000000000000000000000000000..f862a49e8b1382db711a3a4e13416e5e0c638a65 --- /dev/null +++ b/Tools/unicode/python-mappings/diff/jisx0213-2004-std.txt.diff @@ -0,0 +1,351 @@ +--- jisx0213-2000-std.txt.orig Tue Apr 16 23:32:38 2002 ++++ jisx0213-2004-std.txt Thu Jul 8 11:51:54 2004 +@@ -1,6 +1,6 @@ +-## JIS X 0213:2000 vs Unicode mapping table ++## JIS X 0213:2004 vs Unicode mapping table + ## +-## Date: 16 Apr 2002 13:09:49 GMT ++## Date: 7 Jul 2004 13:09:49 GMT + ## License: + ## Copyright (C) 2001 earthian@tama.or.jp, All Rights Reserved. + ## Copyright (C) 2001 I'O, All Rights Reserved. +@@ -23,21 +23,21 @@ + 3-2121 U+3000 # IDEOGRAPHIC SPACE + 3-2122 U+3001 # IDEOGRAPHIC COMMA + 3-2123 U+3002 # IDEOGRAPHIC FULL STOP +-3-2124 U+002C # COMMA Fullwidth: U+FF0C +-3-2125 U+002E # FULL STOP Fullwidth: U+FF0E ++3-2124 U+FF0C # COMMA Fullwidth: U+FF0C ++3-2125 U+FF0E # FULL STOP Fullwidth: U+FF0E + 3-2126 U+30FB # KATAKANA MIDDLE DOT +-3-2127 U+003A # COLON Fullwidth: U+FF1A +-3-2128 U+003B # SEMICOLON Fullwidth: U+FF1B +-3-2129 U+003F # QUESTION MARK Fullwidth: U+FF1F +-3-212A U+0021 # EXCLAMATION MARK Fullwidth: U+FF01 ++3-2127 U+FF1A # COLON Fullwidth: U+FF1A ++3-2128 U+FF1B # SEMICOLON Fullwidth: U+FF1B ++3-2129 U+FF1F # QUESTION MARK Fullwidth: U+FF1F ++3-212A U+FF01 # EXCLAMATION MARK Fullwidth: U+FF01 + 3-212B U+309B # KATAKANA-HIRAGANA VOICED SOUND MARK + 3-212C U+309C # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + 3-212D U+00B4 # ACUTE ACCENT +-3-212E U+0060 # GRAVE ACCENT Fullwidth: U+FF40 ++3-212E U+FF40 # GRAVE ACCENT Fullwidth: U+FF40 + 3-212F U+00A8 # DIAERESIS +-3-2130 U+005E # CIRCUMFLEX ACCENT Fullwidth: U+FF3E +-3-2131 U+203E # OVERLINE Windows: U+FFE3 +-3-2132 U+005F # LOW LINE Fullwidth: U+FF3F ++3-2130 U+FF3E # CIRCUMFLEX ACCENT Fullwidth: U+FF3E ++3-2131 U+FFE3 # OVERLINE Windows: U+FFE3 ++3-2132 U+FF3F # LOW LINE Fullwidth: U+FF3F + 3-2133 U+30FD # KATAKANA ITERATION MARK + 3-2134 U+30FE # KATAKANA VOICED ITERATION MARK + 3-2135 U+309D # HIRAGANA ITERATION MARK +@@ -48,27 +48,27 @@ + 3-213A U+3006 # IDEOGRAPHIC CLOSING MARK + 3-213B U+3007 # IDEOGRAPHIC NUMBER ZERO + 3-213C U+30FC # KATAKANA-HIRAGANA PROLONGED SOUND MARK +-3-213D U+2014 # EM DASH Windows: U+2015 ++3-213D U+2015 # EM DASH Windows: U+2015 + 3-213E U+2010 # HYPHEN +-3-213F U+002F # SOLIDUS Fullwidth: U+FF0F ++3-213F U+FF0F # SOLIDUS Fullwidth: U+FF0F + 3-2140 U+005C # REVERSE SOLIDUS Fullwidth: U+FF3C + 3-2141 U+301C # WAVE DASH Windows: U+FF5E + 3-2142 U+2016 # DOUBLE VERTICAL LINE Windows: U+2225 +-3-2143 U+007C # VERTICAL LINE Fullwidth: U+FF5C ++3-2143 U+FF5C # VERTICAL LINE Fullwidth: U+FF5C + 3-2144 U+2026 # HORIZONTAL ELLIPSIS + 3-2145 U+2025 # TWO DOT LEADER + 3-2146 U+2018 # LEFT SINGLE QUOTATION MARK + 3-2147 U+2019 # RIGHT SINGLE QUOTATION MARK + 3-2148 U+201C # LEFT DOUBLE QUOTATION MARK + 3-2149 U+201D # RIGHT DOUBLE QUOTATION MARK +-3-214A U+0028 # LEFT PARENTHESIS Fullwidth: U+FF08 +-3-214B U+0029 # RIGHT PARENTHESIS Fullwidth: U+FF09 ++3-214A U+FF08 # LEFT PARENTHESIS Fullwidth: U+FF08 ++3-214B U+FF09 # RIGHT PARENTHESIS Fullwidth: U+FF09 + 3-214C U+3014 # LEFT TORTOISE SHELL BRACKET + 3-214D U+3015 # RIGHT TORTOISE SHELL BRACKET +-3-214E U+005B # LEFT SQUARE BRACKET Fullwidth: U+FF3B +-3-214F U+005D # RIGHT SQUARE BRACKET Fullwidth: U+FF3D +-3-2150 U+007B # LEFT CURLY BRACKET Fullwidth: U+FF5B +-3-2151 U+007D # RIGHT CURLY BRACKET Fullwidth: U+FF5D ++3-214E U+FF3B # LEFT SQUARE BRACKET Fullwidth: U+FF3B ++3-214F U+FF3D # RIGHT SQUARE BRACKET Fullwidth: U+FF3D ++3-2150 U+FF5B # LEFT CURLY BRACKET Fullwidth: U+FF5B ++3-2151 U+FF5D # RIGHT CURLY BRACKET Fullwidth: U+FF5D + 3-2152 U+3008 # LEFT ANGLE BRACKET + 3-2153 U+3009 # RIGHT ANGLE BRACKET + 3-2154 U+300A # LEFT DOUBLE ANGLE BRACKET +@@ -79,15 +79,15 @@ + 3-2159 U+300F # RIGHT WHITE CORNER BRACKET + 3-215A U+3010 # LEFT BLACK LENTICULAR BRACKET + 3-215B U+3011 # RIGHT BLACK LENTICULAR BRACKET +-3-215C U+002B # PLUS SIGN Fullwidth: U+FF0B ++3-215C U+FF0B # PLUS SIGN Fullwidth: U+FF0B + 3-215D U+2212 # MINUS SIGN Windows: U+FF0D + 3-215E U+00B1 # PLUS-MINUS SIGN + 3-215F U+00D7 # MULTIPLICATION SIGN + 3-2160 U+00F7 # DIVISION SIGN +-3-2161 U+003D # EQUALS SIGN Fullwidth: U+FF1D ++3-2161 U+FF1D # EQUALS SIGN Fullwidth: U+FF1D + 3-2162 U+2260 # NOT EQUAL TO +-3-2163 U+003C # LESS-THAN SIGN Fullwidth: U+FF1C +-3-2164 U+003E # GREATER-THAN SIGN Fullwidth: U+FF1E ++3-2163 U+FF1C # LESS-THAN SIGN Fullwidth: U+FF1C ++3-2164 U+FF1E # GREATER-THAN SIGN Fullwidth: U+FF1E + 3-2165 U+2266 # LESS-THAN OVER EQUAL TO + 3-2166 U+2267 # GREATER-THAN OVER EQUAL TO + 3-2167 U+221E # INFINITY +@@ -98,15 +98,15 @@ + 3-216C U+2032 # PRIME + 3-216D U+2033 # DOUBLE PRIME + 3-216E U+2103 # DEGREE CELSIUS +-3-216F U+00A5 # YEN SIGN Windows: U+FFE5 +-3-2170 U+0024 # DOLLAR SIGN Fullwidth: U+FF04 ++3-216F U+FFE5 # YEN SIGN Windows: U+FFE5 ++3-2170 U+FF04 # DOLLAR SIGN Fullwidth: U+FF04 + 3-2171 U+00A2 # CENT SIGN Windows: U+FFE0 + 3-2172 U+00A3 # POUND SIGN Windows: U+FFE1 +-3-2173 U+0025 # PERCENT SIGN Fullwidth: U+FF05 +-3-2174 U+0023 # NUMBER SIGN Fullwidth: U+FF03 +-3-2175 U+0026 # AMPERSAND Fullwidth: U+FF06 +-3-2176 U+002A # ASTERISK Fullwidth: U+FF0A +-3-2177 U+0040 # COMMERCIAL AT Fullwidth: U+FF20 ++3-2173 U+FF05 # PERCENT SIGN Fullwidth: U+FF05 ++3-2174 U+FF03 # NUMBER SIGN Fullwidth: U+FF03 ++3-2175 U+FF06 # AMPERSAND Fullwidth: U+FF06 ++3-2176 U+FF0A # ASTERISK Fullwidth: U+FF0A ++3-2177 U+FF20 # COMMERCIAL AT Fullwidth: U+FF20 + 3-2178 U+00A7 # SECTION SIGN + 3-2179 U+2606 # WHITE STAR + 3-217A U+2605 # BLACK STAR +@@ -128,9 +128,9 @@ + 3-222C U+2191 # UPWARDS ARROW + 3-222D U+2193 # DOWNWARDS ARROW + 3-222E U+3013 # GETA MARK +-3-222F U+0027 # APOSTROPHE Fullwidth: U+FF07 +-3-2230 U+0022 # QUOTATION MARK [2000] Fullwidth: U+FF02 +-3-2231 U+002D # HYPHEN-MINUS [2000] Fullwidth: U+FF0D ++3-222F U+FF07 # APOSTROPHE Fullwidth: U+FF07 ++3-2230 U+FF02 # QUOTATION MARK [2000] Fullwidth: U+FF02 ++3-2231 U+FF0D # HYPHEN-MINUS [2000] Fullwidth: U+FF0D + 3-2232 U+007E # TILDE [2000] Fullwidth: U+FF5E + 3-2233 U+3033 # VERTICAL KANA REPEAT MARK UPPER HALF [2000] + 3-2234 U+3034 # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF [2000] +@@ -223,16 +223,16 @@ + 3-232D U+21E9 # DOWNWARDS WHITE ARROW [2000] + 3-232E U+2934 # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS [2000] [Unicode3.2] + 3-232F U+2935 # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS [2000] [Unicode3.2] +-3-2330 U+0030 # DIGIT ZERO Fullwidth: U+FF10 +-3-2331 U+0031 # DIGIT ONE Fullwidth: U+FF11 +-3-2332 U+0032 # DIGIT TWO Fullwidth: U+FF12 +-3-2333 U+0033 # DIGIT THREE Fullwidth: U+FF13 +-3-2334 U+0034 # DIGIT FOUR Fullwidth: U+FF14 +-3-2335 U+0035 # DIGIT FIVE Fullwidth: U+FF15 +-3-2336 U+0036 # DIGIT SIX Fullwidth: U+FF16 +-3-2337 U+0037 # DIGIT SEVEN Fullwidth: U+FF17 +-3-2338 U+0038 # DIGIT EIGHT Fullwidth: U+FF18 +-3-2339 U+0039 # DIGIT NINE Fullwidth: U+FF19 ++3-2330 U+FF10 # DIGIT ZERO Fullwidth: U+FF10 ++3-2331 U+FF11 # DIGIT ONE Fullwidth: U+FF11 ++3-2332 U+FF12 # DIGIT TWO Fullwidth: U+FF12 ++3-2333 U+FF13 # DIGIT THREE Fullwidth: U+FF13 ++3-2334 U+FF14 # DIGIT FOUR Fullwidth: U+FF14 ++3-2335 U+FF15 # DIGIT FIVE Fullwidth: U+FF15 ++3-2336 U+FF16 # DIGIT SIX Fullwidth: U+FF16 ++3-2337 U+FF17 # DIGIT SEVEN Fullwidth: U+FF17 ++3-2338 U+FF18 # DIGIT EIGHT Fullwidth: U+FF18 ++3-2339 U+FF19 # DIGIT NINE Fullwidth: U+FF19 + 3-233A U+29BF # CIRCLED BULLET [2000] [Unicode3.2] + 3-233B U+25C9 # FISHEYE [2000] + 3-233C U+303D # PART ALTERNATION MARK [2000] [Unicode3.2] +@@ -240,64 +240,64 @@ + 3-233E U+FE45 # SESAME DOT [2000] [Unicode3.2] + 3-233F U+25E6 # WHITE BULLET [2000] + 3-2340 U+2022 # BULLET [2000] +-3-2341 U+0041 # LATIN CAPITAL LETTER A Fullwidth: U+FF21 +-3-2342 U+0042 # LATIN CAPITAL LETTER B Fullwidth: U+FF22 +-3-2343 U+0043 # LATIN CAPITAL LETTER C Fullwidth: U+FF23 +-3-2344 U+0044 # LATIN CAPITAL LETTER D Fullwidth: U+FF24 +-3-2345 U+0045 # LATIN CAPITAL LETTER E Fullwidth: U+FF25 +-3-2346 U+0046 # LATIN CAPITAL LETTER F Fullwidth: U+FF26 +-3-2347 U+0047 # LATIN CAPITAL LETTER G Fullwidth: U+FF27 +-3-2348 U+0048 # LATIN CAPITAL LETTER H Fullwidth: U+FF28 +-3-2349 U+0049 # LATIN CAPITAL LETTER I Fullwidth: U+FF29 +-3-234A U+004A # LATIN CAPITAL LETTER J Fullwidth: U+FF2A +-3-234B U+004B # LATIN CAPITAL LETTER K Fullwidth: U+FF2B +-3-234C U+004C # LATIN CAPITAL LETTER L Fullwidth: U+FF2C +-3-234D U+004D # LATIN CAPITAL LETTER M Fullwidth: U+FF2D +-3-234E U+004E # LATIN CAPITAL LETTER N Fullwidth: U+FF2E +-3-234F U+004F # LATIN CAPITAL LETTER O Fullwidth: U+FF2F +-3-2350 U+0050 # LATIN CAPITAL LETTER P Fullwidth: U+FF30 +-3-2351 U+0051 # LATIN CAPITAL LETTER Q Fullwidth: U+FF31 +-3-2352 U+0052 # LATIN CAPITAL LETTER R Fullwidth: U+FF32 +-3-2353 U+0053 # LATIN CAPITAL LETTER S Fullwidth: U+FF33 +-3-2354 U+0054 # LATIN CAPITAL LETTER T Fullwidth: U+FF34 +-3-2355 U+0055 # LATIN CAPITAL LETTER U Fullwidth: U+FF35 +-3-2356 U+0056 # LATIN CAPITAL LETTER V Fullwidth: U+FF36 +-3-2357 U+0057 # LATIN CAPITAL LETTER W Fullwidth: U+FF37 +-3-2358 U+0058 # LATIN CAPITAL LETTER X Fullwidth: U+FF38 +-3-2359 U+0059 # LATIN CAPITAL LETTER Y Fullwidth: U+FF39 +-3-235A U+005A # LATIN CAPITAL LETTER Z Fullwidth: U+FF3A ++3-2341 U+FF21 # LATIN CAPITAL LETTER A Fullwidth: U+FF21 ++3-2342 U+FF22 # LATIN CAPITAL LETTER B Fullwidth: U+FF22 ++3-2343 U+FF23 # LATIN CAPITAL LETTER C Fullwidth: U+FF23 ++3-2344 U+FF24 # LATIN CAPITAL LETTER D Fullwidth: U+FF24 ++3-2345 U+FF25 # LATIN CAPITAL LETTER E Fullwidth: U+FF25 ++3-2346 U+FF26 # LATIN CAPITAL LETTER F Fullwidth: U+FF26 ++3-2347 U+FF27 # LATIN CAPITAL LETTER G Fullwidth: U+FF27 ++3-2348 U+FF28 # LATIN CAPITAL LETTER H Fullwidth: U+FF28 ++3-2349 U+FF29 # LATIN CAPITAL LETTER I Fullwidth: U+FF29 ++3-234A U+FF2A # LATIN CAPITAL LETTER J Fullwidth: U+FF2A ++3-234B U+FF2B # LATIN CAPITAL LETTER K Fullwidth: U+FF2B ++3-234C U+FF2C # LATIN CAPITAL LETTER L Fullwidth: U+FF2C ++3-234D U+FF2D # LATIN CAPITAL LETTER M Fullwidth: U+FF2D ++3-234E U+FF2E # LATIN CAPITAL LETTER N Fullwidth: U+FF2E ++3-234F U+FF2F # LATIN CAPITAL LETTER O Fullwidth: U+FF2F ++3-2350 U+FF30 # LATIN CAPITAL LETTER P Fullwidth: U+FF30 ++3-2351 U+FF31 # LATIN CAPITAL LETTER Q Fullwidth: U+FF31 ++3-2352 U+FF32 # LATIN CAPITAL LETTER R Fullwidth: U+FF32 ++3-2353 U+FF33 # LATIN CAPITAL LETTER S Fullwidth: U+FF33 ++3-2354 U+FF34 # LATIN CAPITAL LETTER T Fullwidth: U+FF34 ++3-2355 U+FF35 # LATIN CAPITAL LETTER U Fullwidth: U+FF35 ++3-2356 U+FF36 # LATIN CAPITAL LETTER V Fullwidth: U+FF36 ++3-2357 U+FF37 # LATIN CAPITAL LETTER W Fullwidth: U+FF37 ++3-2358 U+FF38 # LATIN CAPITAL LETTER X Fullwidth: U+FF38 ++3-2359 U+FF39 # LATIN CAPITAL LETTER Y Fullwidth: U+FF39 ++3-235A U+FF3A # LATIN CAPITAL LETTER Z Fullwidth: U+FF3A + 3-235B U+2213 # MINUS-OR-PLUS SIGN [2000] + 3-235C U+2135 # ALEF SYMBOL [2000] + 3-235D U+210F # PLANCK CONSTANT OVER TWO PI [2000] + 3-235E U+33CB # SQUARE HP [2000] + 3-235F U+2113 # SCRIPT SMALL L [2000] + 3-2360 U+2127 # INVERTED OHM SIGN [2000] +-3-2361 U+0061 # LATIN SMALL LETTER A Fullwidth: U+FF41 +-3-2362 U+0062 # LATIN SMALL LETTER B Fullwidth: U+FF42 +-3-2363 U+0063 # LATIN SMALL LETTER C Fullwidth: U+FF43 +-3-2364 U+0064 # LATIN SMALL LETTER D Fullwidth: U+FF44 +-3-2365 U+0065 # LATIN SMALL LETTER E Fullwidth: U+FF45 +-3-2366 U+0066 # LATIN SMALL LETTER F Fullwidth: U+FF46 +-3-2367 U+0067 # LATIN SMALL LETTER G Fullwidth: U+FF47 +-3-2368 U+0068 # LATIN SMALL LETTER H Fullwidth: U+FF48 +-3-2369 U+0069 # LATIN SMALL LETTER I Fullwidth: U+FF49 +-3-236A U+006A # LATIN SMALL LETTER J Fullwidth: U+FF4A +-3-236B U+006B # LATIN SMALL LETTER K Fullwidth: U+FF4B +-3-236C U+006C # LATIN SMALL LETTER L Fullwidth: U+FF4C +-3-236D U+006D # LATIN SMALL LETTER M Fullwidth: U+FF4D +-3-236E U+006E # LATIN SMALL LETTER N Fullwidth: U+FF4E +-3-236F U+006F # LATIN SMALL LETTER O Fullwidth: U+FF4F +-3-2370 U+0070 # LATIN SMALL LETTER P Fullwidth: U+FF50 +-3-2371 U+0071 # LATIN SMALL LETTER Q Fullwidth: U+FF51 +-3-2372 U+0072 # LATIN SMALL LETTER R Fullwidth: U+FF52 +-3-2373 U+0073 # LATIN SMALL LETTER S Fullwidth: U+FF53 +-3-2374 U+0074 # LATIN SMALL LETTER T Fullwidth: U+FF54 +-3-2375 U+0075 # LATIN SMALL LETTER U Fullwidth: U+FF55 +-3-2376 U+0076 # LATIN SMALL LETTER V Fullwidth: U+FF56 +-3-2377 U+0077 # LATIN SMALL LETTER W Fullwidth: U+FF57 +-3-2378 U+0078 # LATIN SMALL LETTER X Fullwidth: U+FF58 +-3-2379 U+0079 # LATIN SMALL LETTER Y Fullwidth: U+FF59 +-3-237A U+007A # LATIN SMALL LETTER Z Fullwidth: U+FF5A ++3-2361 U+FF41 # LATIN SMALL LETTER A Fullwidth: U+FF41 ++3-2362 U+FF42 # LATIN SMALL LETTER B Fullwidth: U+FF42 ++3-2363 U+FF43 # LATIN SMALL LETTER C Fullwidth: U+FF43 ++3-2364 U+FF44 # LATIN SMALL LETTER D Fullwidth: U+FF44 ++3-2365 U+FF45 # LATIN SMALL LETTER E Fullwidth: U+FF45 ++3-2366 U+FF46 # LATIN SMALL LETTER F Fullwidth: U+FF46 ++3-2367 U+FF47 # LATIN SMALL LETTER G Fullwidth: U+FF47 ++3-2368 U+FF48 # LATIN SMALL LETTER H Fullwidth: U+FF48 ++3-2369 U+FF49 # LATIN SMALL LETTER I Fullwidth: U+FF49 ++3-236A U+FF4A # LATIN SMALL LETTER J Fullwidth: U+FF4A ++3-236B U+FF4B # LATIN SMALL LETTER K Fullwidth: U+FF4B ++3-236C U+FF4C # LATIN SMALL LETTER L Fullwidth: U+FF4C ++3-236D U+FF4D # LATIN SMALL LETTER M Fullwidth: U+FF4D ++3-236E U+FF4E # LATIN SMALL LETTER N Fullwidth: U+FF4E ++3-236F U+FF4F # LATIN SMALL LETTER O Fullwidth: U+FF4F ++3-2370 U+FF50 # LATIN SMALL LETTER P Fullwidth: U+FF50 ++3-2371 U+FF51 # LATIN SMALL LETTER Q Fullwidth: U+FF51 ++3-2372 U+FF52 # LATIN SMALL LETTER R Fullwidth: U+FF52 ++3-2373 U+FF53 # LATIN SMALL LETTER S Fullwidth: U+FF53 ++3-2374 U+FF54 # LATIN SMALL LETTER T Fullwidth: U+FF54 ++3-2375 U+FF55 # LATIN SMALL LETTER U Fullwidth: U+FF55 ++3-2376 U+FF56 # LATIN SMALL LETTER V Fullwidth: U+FF56 ++3-2377 U+FF57 # LATIN SMALL LETTER W Fullwidth: U+FF57 ++3-2378 U+FF58 # LATIN SMALL LETTER X Fullwidth: U+FF58 ++3-2379 U+FF59 # LATIN SMALL LETTER Y Fullwidth: U+FF59 ++3-237A U+FF5A # LATIN SMALL LETTER Z Fullwidth: U+FF5A + 3-237B U+30A0 # KATAKANA-HIRAGANA DOUBLE HYPHEN [2000] [Unicode3.2] + 3-237C U+2013 # EN DASH [2000] + 3-237D U+29FA # DOUBLE PLUS [2000] [Unicode3.2] +@@ -1242,7 +1242,7 @@ + 3-2D7C # Windows: U+222A + 3-2D7D U+2756 # BLACK DIAMOND MINUS WHITE X [2000] + 3-2D7E U+261E # WHITE RIGHT POINTING INDEX [2000] +-3-2E21 # ++3-2E21 U+4FF1 # [2004] + 3-2E22 U+2000B # [2000] [Unicode3.1] Private: U+F780 + 3-2E23 U+3402 # [2000] + 3-2E24 U+4E28 # [2000] +@@ -1429,7 +1429,7 @@ + 3-2F7B U+218BD # [2000] [Unicode3.1] Private: U+F78F + 3-2F7C U+5B19 # [2000] + 3-2F7D U+5B25 # [2000] +-3-2F7E # ++3-2F7E U+525D # [2004] + 3-3021 U+4E9C # + 3-3022 U+5516 # + 3-3023 U+5A03 # +@@ -4395,7 +4395,7 @@ + 3-4F51 U+6E7E # + 3-4F52 U+7897 # + 3-4F53 U+8155 # +-3-4F54 # ++3-4F54 U+20B9F # [2004] + 3-4F55 U+5B41 # [2000] + 3-4F56 U+5B56 # [2000] + 3-4F57 U+5B7D # [2000] +@@ -4437,7 +4437,7 @@ + 3-4F7B U+5DA7 # [2000] + 3-4F7C U+5DB8 # [2000] + 3-4F7D U+5DCB # [2000] +-3-4F7E # ++3-4F7E U+541E # [2004] + 3-5021 U+5F0C # + 3-5022 U+4E10 # + 3-5023 U+4E15 # +@@ -7828,7 +7828,7 @@ + 3-7424 U+7464 # [1983] + 3-7425 U+51DC # [1990] + 3-7426 U+7199 # [1990] +-3-7427 # ++3-7427 U+5653 # [2004] + 3-7428 U+5DE2 # [2000] + 3-7429 U+5E14 # [2000] + 3-742A U+5E18 # [2000] +@@ -8851,11 +8851,11 @@ + 3-7E77 U+9F94 # [2000] + 3-7E78 U+9F97 # [2000] + 3-7E79 U+9FA2 # [2000] +-3-7E7A # +-3-7E7B # +-3-7E7C # +-3-7E7D # +-3-7E7E # ++3-7E7A U+59F8 # [2004] ++3-7E7B U+5C5B # [2004] ++3-7E7C U+5E77 # [2004] ++3-7E7D U+7626 # [2004] ++3-7E7E U+7E6B # [2004] + 4-2121 U+20089 # [2000] [Unicode3.1] Private: U+F7D1 + 4-2122 U+4E02 # [2000] + 4-2123 U+4E0F # [2000] +@@ -11138,7 +11138,7 @@ + 4-7D38 U+9B10 # [2000] + 4-7D39 U+9B12 # [2000] + 4-7D3A U+9B16 # [2000] +-4-7D3B U+9B1D # [2000] ++4-7D3B U+9B1C # [2000] + 4-7D3C U+9B2B # [2000] + 4-7D3D U+9B33 # [2000] + 4-7D3E U+9B3D # [2000] diff --git a/Tools/unicode/python-mappings/gb-18030-2000.xml b/Tools/unicode/python-mappings/gb-18030-2000.xml new file mode 100644 index 0000000000000000000000000000000000000000..ef86d83e87456bf9210e6e3a5bdf686aa95c8b6f --- /dev/null +++ b/Tools/unicode/python-mappings/gb-18030-2000.xml @@ -0,0 +1,30917 @@ + + + + + + 0x80 appears to be a valid (and unassigned) single-byte code, added to the validity. + + + New mapping data, changing all four-byte mappings to the BMP. + Removed mappings to single surrogates. + + + Original table. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tools/unicode/python-mappings/jisx0213-2004-std.txt b/Tools/unicode/python-mappings/jisx0213-2004-std.txt new file mode 100644 index 0000000000000000000000000000000000000000..a302fa19ff9bd26d98cf80202b0a6228bc5c8517 --- /dev/null +++ b/Tools/unicode/python-mappings/jisx0213-2004-std.txt @@ -0,0 +1,11294 @@ +## JIS X 0213:2004 vs Unicode mapping table +## +## Date: 7 Jul 2004 13:09:49 GMT +## License: +## Copyright (C) 2001 earthian@tama.or.jp, All Rights Reserved. +## Copyright (C) 2001 I'O, All Rights Reserved. +## You can use, modify, distribute this table freely. +## Note: +## 3-XXXX JIS X 0213:2000 plane 1 (GL encoding) +## 4-XXXX JIS X 0213:2000 plane 2 (GL encoding) +## [1983] JIS codepoint defined by JIS X 0208-1983 +## [1990] JIS codepoint defined by JIS X 0208-1990 +## [2000] JIS codepoint defined by JIS X 0213:2000 +## [Unicode3.1] UCS codepoint defined by Unicode 3.1 +## [Unicode3.2] UCS codepoint defined by Unicode 3.2 +## Fullwidth UCS fullwidth form (U+Fxxx) +## Windows Windows (CP932) mapping +## Private UCS private area mapping +## Some 0213 character can't represent by one UCS character. +## In this table, such characters are described as 'U+xxxx+xxxx'. +## +## JIS Unicode Name Note +3-2121 U+3000 # IDEOGRAPHIC SPACE +3-2122 U+3001 # IDEOGRAPHIC COMMA +3-2123 U+3002 # IDEOGRAPHIC FULL STOP +3-2124 U+FF0C # COMMA Fullwidth: U+FF0C +3-2125 U+FF0E # FULL STOP Fullwidth: U+FF0E +3-2126 U+30FB # KATAKANA MIDDLE DOT +3-2127 U+FF1A # COLON Fullwidth: U+FF1A +3-2128 U+FF1B # SEMICOLON Fullwidth: U+FF1B +3-2129 U+FF1F # QUESTION MARK Fullwidth: U+FF1F +3-212A U+FF01 # EXCLAMATION MARK Fullwidth: U+FF01 +3-212B U+309B # KATAKANA-HIRAGANA VOICED SOUND MARK +3-212C U+309C # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +3-212D U+00B4 # ACUTE ACCENT +3-212E U+FF40 # GRAVE ACCENT Fullwidth: U+FF40 +3-212F U+00A8 # DIAERESIS +3-2130 U+FF3E # CIRCUMFLEX ACCENT Fullwidth: U+FF3E +3-2131 U+FFE3 # OVERLINE Windows: U+FFE3 +3-2132 U+FF3F # LOW LINE Fullwidth: U+FF3F +3-2133 U+30FD # KATAKANA ITERATION MARK +3-2134 U+30FE # KATAKANA VOICED ITERATION MARK +3-2135 U+309D # HIRAGANA ITERATION MARK +3-2136 U+309E # HIRAGANA VOICED ITERATION MARK +3-2137 U+3003 # DITTO MARK +3-2138 U+4EDD # +3-2139 U+3005 # IDEOGRAPHIC ITERATION MARK +3-213A U+3006 # IDEOGRAPHIC CLOSING MARK +3-213B U+3007 # IDEOGRAPHIC NUMBER ZERO +3-213C U+30FC # KATAKANA-HIRAGANA PROLONGED SOUND MARK +3-213D U+2015 # EM DASH Windows: U+2015 +3-213E U+2010 # HYPHEN +3-213F U+FF0F # SOLIDUS Fullwidth: U+FF0F +3-2140 U+005C # REVERSE SOLIDUS Fullwidth: U+FF3C +3-2141 U+301C # WAVE DASH Windows: U+FF5E +3-2142 U+2016 # DOUBLE VERTICAL LINE Windows: U+2225 +3-2143 U+FF5C # VERTICAL LINE Fullwidth: U+FF5C +3-2144 U+2026 # HORIZONTAL ELLIPSIS +3-2145 U+2025 # TWO DOT LEADER +3-2146 U+2018 # LEFT SINGLE QUOTATION MARK +3-2147 U+2019 # RIGHT SINGLE QUOTATION MARK +3-2148 U+201C # LEFT DOUBLE QUOTATION MARK +3-2149 U+201D # RIGHT DOUBLE QUOTATION MARK +3-214A U+FF08 # LEFT PARENTHESIS Fullwidth: U+FF08 +3-214B U+FF09 # RIGHT PARENTHESIS Fullwidth: U+FF09 +3-214C U+3014 # LEFT TORTOISE SHELL BRACKET +3-214D U+3015 # RIGHT TORTOISE SHELL BRACKET +3-214E U+FF3B # LEFT SQUARE BRACKET Fullwidth: U+FF3B +3-214F U+FF3D # RIGHT SQUARE BRACKET Fullwidth: U+FF3D +3-2150 U+FF5B # LEFT CURLY BRACKET Fullwidth: U+FF5B +3-2151 U+FF5D # RIGHT CURLY BRACKET Fullwidth: U+FF5D +3-2152 U+3008 # LEFT ANGLE BRACKET +3-2153 U+3009 # RIGHT ANGLE BRACKET +3-2154 U+300A # LEFT DOUBLE ANGLE BRACKET +3-2155 U+300B # RIGHT DOUBLE ANGLE BRACKET +3-2156 U+300C # LEFT CORNER BRACKET +3-2157 U+300D # RIGHT CORNER BRACKET +3-2158 U+300E # LEFT WHITE CORNER BRACKET +3-2159 U+300F # RIGHT WHITE CORNER BRACKET +3-215A U+3010 # LEFT BLACK LENTICULAR BRACKET +3-215B U+3011 # RIGHT BLACK LENTICULAR BRACKET +3-215C U+FF0B # PLUS SIGN Fullwidth: U+FF0B +3-215D U+2212 # MINUS SIGN Windows: U+FF0D +3-215E U+00B1 # PLUS-MINUS SIGN +3-215F U+00D7 # MULTIPLICATION SIGN +3-2160 U+00F7 # DIVISION SIGN +3-2161 U+FF1D # EQUALS SIGN Fullwidth: U+FF1D +3-2162 U+2260 # NOT EQUAL TO +3-2163 U+FF1C # LESS-THAN SIGN Fullwidth: U+FF1C +3-2164 U+FF1E # GREATER-THAN SIGN Fullwidth: U+FF1E +3-2165 U+2266 # LESS-THAN OVER EQUAL TO +3-2166 U+2267 # GREATER-THAN OVER EQUAL TO +3-2167 U+221E # INFINITY +3-2168 U+2234 # THEREFORE +3-2169 U+2642 # MALE SIGN +3-216A U+2640 # FEMALE SIGN +3-216B U+00B0 # DEGREE SIGN +3-216C U+2032 # PRIME +3-216D U+2033 # DOUBLE PRIME +3-216E U+2103 # DEGREE CELSIUS +3-216F U+FFE5 # YEN SIGN Windows: U+FFE5 +3-2170 U+FF04 # DOLLAR SIGN Fullwidth: U+FF04 +3-2171 U+00A2 # CENT SIGN Windows: U+FFE0 +3-2172 U+00A3 # POUND SIGN Windows: U+FFE1 +3-2173 U+FF05 # PERCENT SIGN Fullwidth: U+FF05 +3-2174 U+FF03 # NUMBER SIGN Fullwidth: U+FF03 +3-2175 U+FF06 # AMPERSAND Fullwidth: U+FF06 +3-2176 U+FF0A # ASTERISK Fullwidth: U+FF0A +3-2177 U+FF20 # COMMERCIAL AT Fullwidth: U+FF20 +3-2178 U+00A7 # SECTION SIGN +3-2179 U+2606 # WHITE STAR +3-217A U+2605 # BLACK STAR +3-217B U+25CB # WHITE CIRCLE +3-217C U+25CF # BLACK CIRCLE +3-217D U+25CE # BULLSEYE +3-217E U+25C7 # WHITE DIAMOND +3-2221 U+25C6 # BLACK DIAMOND +3-2222 U+25A1 # WHITE SQUARE +3-2223 U+25A0 # BLACK SQUARE +3-2224 U+25B3 # WHITE UP-POINTING TRIANGLE +3-2225 U+25B2 # BLACK UP-POINTING TRIANGLE +3-2226 U+25BD # WHITE DOWN-POINTING TRIANGLE +3-2227 U+25BC # BLACK DOWN-POINTING TRIANGLE +3-2228 U+203B # REFERENCE MARK +3-2229 U+3012 # POSTAL MARK +3-222A U+2192 # RIGHTWARDS ARROW +3-222B U+2190 # LEFTWARDS ARROW +3-222C U+2191 # UPWARDS ARROW +3-222D U+2193 # DOWNWARDS ARROW +3-222E U+3013 # GETA MARK +3-222F U+FF07 # APOSTROPHE Fullwidth: U+FF07 +3-2230 U+FF02 # QUOTATION MARK [2000] Fullwidth: U+FF02 +3-2231 U+FF0D # HYPHEN-MINUS [2000] Fullwidth: U+FF0D +3-2232 U+007E # TILDE [2000] Fullwidth: U+FF5E +3-2233 U+3033 # VERTICAL KANA REPEAT MARK UPPER HALF [2000] +3-2234 U+3034 # VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF [2000] +3-2235 U+3035 # VERTICAL KANA REPEAT MARK LOWER HALF [2000] +3-2236 U+303B # VERTICAL IDEOGRAPHIC ITERATION MARK [2000] [Unicode3.2] +3-2237 U+303C # MASU MARK [2000] [Unicode3.2] +3-2238 U+30FF # KATAKANA DIGRAPH KOTO [2000] [Unicode3.2] +3-2239 U+309F # HIRAGANA DIGRAPH YORI [2000] [Unicode3.2] +3-223A U+2208 # ELEMENT OF [1983] +3-223B U+220B # CONTAINS AS MEMBER [1983] +3-223C U+2286 # SUBSET OF OR EQUAL TO [1983] +3-223D U+2287 # SUPERSET OF OR EQUAL TO [1983] +3-223E U+2282 # SUBSET OF [1983] +3-223F U+2283 # SUPERSET OF [1983] +3-2240 U+222A # UNION [1983] +3-2241 U+2229 # INTERSECTION [1983] +3-2242 U+2284 # NOT A SUBSET OF [2000] +3-2243 U+2285 # NOT A SUPERSET OF [2000] +3-2244 U+228A # SUBSET OF WITH NOT EQUAL TO [2000] +3-2245 U+228B # SUPERSET OF WITH NOT EQUAL TO [2000] +3-2246 U+2209 # NOT AN ELEMENT OF [2000] +3-2247 U+2205 # EMPTY SET [2000] +3-2248 U+2305 # PROJECTIVE [2000] +3-2249 U+2306 # PERSPECTIVE [2000] +3-224A U+2227 # LOGICAL AND [1983] +3-224B U+2228 # LOGICAL OR [1983] +3-224C U+00AC # NOT SIGN [1983] Windows: U+FFE2 +3-224D U+21D2 # RIGHTWARDS DOUBLE ARROW [1983] +3-224E U+21D4 # LEFT RIGHT DOUBLE ARROW [1983] +3-224F U+2200 # FOR ALL [1983] +3-2250 U+2203 # THERE EXISTS [1983] +3-2251 U+2295 # CIRCLED PLUS [2000] +3-2252 U+2296 # CIRCLED MINUS [2000] +3-2253 U+2297 # CIRCLED TIMES [2000] +3-2254 U+2225 # PARALLEL TO [2000] +3-2255 U+2226 # NOT PARALLEL TO [2000] +3-2256 U+2985 # LEFT WHITE PARENTHESIS [2000] [Unicode3.2] +3-2257 U+2986 # RIGHT WHITE PARENTHESIS [2000] [Unicode3.2] +3-2258 U+3018 # LEFT WHITE TORTOISE SHELL BRACKET [2000] +3-2259 U+3019 # RIGHT WHITE TORTOISE SHELL BRACKET [2000] +3-225A U+3016 # LEFT WHITE LENTICULAR BRACKET [2000] +3-225B U+3017 # RIGHT WHITE LENTICULAR BRACKET [2000] +3-225C U+2220 # ANGLE [1983] +3-225D U+22A5 # UP TACK [1983] +3-225E U+2312 # ARC [1983] +3-225F U+2202 # PARTIAL DIFFERENTIAL [1983] +3-2260 U+2207 # NABLA [1983] +3-2261 U+2261 # IDENTICAL TO [1983] +3-2262 U+2252 # APPROXIMATELY EQUAL TO OR THE IMAGE OF [1983] +3-2263 U+226A # MUCH LESS-THAN [1983] +3-2264 U+226B # MUCH GREATER-THAN [1983] +3-2265 U+221A # SQUARE ROOT [1983] +3-2266 U+223D # REVERSED TILDE [1983] +3-2267 U+221D # PROPORTIONAL TO [1983] +3-2268 U+2235 # BECAUSE [1983] +3-2269 U+222B # INTEGRAL [1983] +3-226A U+222C # DOUBLE INTEGRAL [1983] +3-226B U+2262 # NOT IDENTICAL TO [2000] +3-226C U+2243 # ASYMPTOTICALLY EQUAL TO [2000] +3-226D U+2245 # APPROXIMATELY EQUAL TO [2000] +3-226E U+2248 # ALMOST EQUAL TO [2000] +3-226F U+2276 # LESS-THAN OR GREATER-THAN [2000] +3-2270 U+2277 # GREATER-THAN OR LESS-THAN [2000] +3-2271 U+2194 # LEFT RIGHT ARROW [2000] +3-2272 U+212B # ANGSTROM SIGN [1983] +3-2273 U+2030 # PER MILLE SIGN [1983] +3-2274 U+266F # MUSIC SHARP SIGN [1983] +3-2275 U+266D # MUSIC FLAT SIGN [1983] +3-2276 U+266A # EIGHTH NOTE [1983] +3-2277 U+2020 # DAGGER [1983] +3-2278 U+2021 # DOUBLE DAGGER [1983] +3-2279 U+00B6 # PILCROW SIGN [1983] +3-227A U+266E # MUSIC NATURAL SIGN [2000] +3-227B U+266B # BEAMED EIGHTH NOTES [2000] +3-227C U+266C # BEAMED SIXTEENTH NOTES [2000] +3-227D U+2669 # QUARTER NOTE [2000] +3-227E U+25EF # LARGE CIRCLE [1983] +3-2321 U+25B7 # WHITE RIGHT-POINTING TRIANGLE [2000] +3-2322 U+25B6 # BLACK RIGHT-POINTING TRIANGLE [2000] +3-2323 U+25C1 # WHITE LEFT-POINTING TRIANGLE [2000] +3-2324 U+25C0 # BLACK LEFT-POINTING TRIANGLE [2000] +3-2325 U+2197 # NORTH EAST ARROW [2000] +3-2326 U+2198 # SOUTH EAST ARROW [2000] +3-2327 U+2196 # NORTH WEST ARROW [2000] +3-2328 U+2199 # SOUTH WEST ARROW [2000] +3-2329 U+21C4 # RIGHTWARDS ARROW OVER LEFTWARDS ARROW [2000] +3-232A U+21E8 # RIGHTWARDS WHITE ARROW [2000] +3-232B U+21E6 # LEFTWARDS WHITE ARROW [2000] +3-232C U+21E7 # UPWARDS WHITE ARROW [2000] +3-232D U+21E9 # DOWNWARDS WHITE ARROW [2000] +3-232E U+2934 # ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS [2000] [Unicode3.2] +3-232F U+2935 # ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS [2000] [Unicode3.2] +3-2330 U+FF10 # DIGIT ZERO Fullwidth: U+FF10 +3-2331 U+FF11 # DIGIT ONE Fullwidth: U+FF11 +3-2332 U+FF12 # DIGIT TWO Fullwidth: U+FF12 +3-2333 U+FF13 # DIGIT THREE Fullwidth: U+FF13 +3-2334 U+FF14 # DIGIT FOUR Fullwidth: U+FF14 +3-2335 U+FF15 # DIGIT FIVE Fullwidth: U+FF15 +3-2336 U+FF16 # DIGIT SIX Fullwidth: U+FF16 +3-2337 U+FF17 # DIGIT SEVEN Fullwidth: U+FF17 +3-2338 U+FF18 # DIGIT EIGHT Fullwidth: U+FF18 +3-2339 U+FF19 # DIGIT NINE Fullwidth: U+FF19 +3-233A U+29BF # CIRCLED BULLET [2000] [Unicode3.2] +3-233B U+25C9 # FISHEYE [2000] +3-233C U+303D # PART ALTERNATION MARK [2000] [Unicode3.2] +3-233D U+FE46 # WHITE SESAME DOT [2000] [Unicode3.2] +3-233E U+FE45 # SESAME DOT [2000] [Unicode3.2] +3-233F U+25E6 # WHITE BULLET [2000] +3-2340 U+2022 # BULLET [2000] +3-2341 U+FF21 # LATIN CAPITAL LETTER A Fullwidth: U+FF21 +3-2342 U+FF22 # LATIN CAPITAL LETTER B Fullwidth: U+FF22 +3-2343 U+FF23 # LATIN CAPITAL LETTER C Fullwidth: U+FF23 +3-2344 U+FF24 # LATIN CAPITAL LETTER D Fullwidth: U+FF24 +3-2345 U+FF25 # LATIN CAPITAL LETTER E Fullwidth: U+FF25 +3-2346 U+FF26 # LATIN CAPITAL LETTER F Fullwidth: U+FF26 +3-2347 U+FF27 # LATIN CAPITAL LETTER G Fullwidth: U+FF27 +3-2348 U+FF28 # LATIN CAPITAL LETTER H Fullwidth: U+FF28 +3-2349 U+FF29 # LATIN CAPITAL LETTER I Fullwidth: U+FF29 +3-234A U+FF2A # LATIN CAPITAL LETTER J Fullwidth: U+FF2A +3-234B U+FF2B # LATIN CAPITAL LETTER K Fullwidth: U+FF2B +3-234C U+FF2C # LATIN CAPITAL LETTER L Fullwidth: U+FF2C +3-234D U+FF2D # LATIN CAPITAL LETTER M Fullwidth: U+FF2D +3-234E U+FF2E # LATIN CAPITAL LETTER N Fullwidth: U+FF2E +3-234F U+FF2F # LATIN CAPITAL LETTER O Fullwidth: U+FF2F +3-2350 U+FF30 # LATIN CAPITAL LETTER P Fullwidth: U+FF30 +3-2351 U+FF31 # LATIN CAPITAL LETTER Q Fullwidth: U+FF31 +3-2352 U+FF32 # LATIN CAPITAL LETTER R Fullwidth: U+FF32 +3-2353 U+FF33 # LATIN CAPITAL LETTER S Fullwidth: U+FF33 +3-2354 U+FF34 # LATIN CAPITAL LETTER T Fullwidth: U+FF34 +3-2355 U+FF35 # LATIN CAPITAL LETTER U Fullwidth: U+FF35 +3-2356 U+FF36 # LATIN CAPITAL LETTER V Fullwidth: U+FF36 +3-2357 U+FF37 # LATIN CAPITAL LETTER W Fullwidth: U+FF37 +3-2358 U+FF38 # LATIN CAPITAL LETTER X Fullwidth: U+FF38 +3-2359 U+FF39 # LATIN CAPITAL LETTER Y Fullwidth: U+FF39 +3-235A U+FF3A # LATIN CAPITAL LETTER Z Fullwidth: U+FF3A +3-235B U+2213 # MINUS-OR-PLUS SIGN [2000] +3-235C U+2135 # ALEF SYMBOL [2000] +3-235D U+210F # PLANCK CONSTANT OVER TWO PI [2000] +3-235E U+33CB # SQUARE HP [2000] +3-235F U+2113 # SCRIPT SMALL L [2000] +3-2360 U+2127 # INVERTED OHM SIGN [2000] +3-2361 U+FF41 # LATIN SMALL LETTER A Fullwidth: U+FF41 +3-2362 U+FF42 # LATIN SMALL LETTER B Fullwidth: U+FF42 +3-2363 U+FF43 # LATIN SMALL LETTER C Fullwidth: U+FF43 +3-2364 U+FF44 # LATIN SMALL LETTER D Fullwidth: U+FF44 +3-2365 U+FF45 # LATIN SMALL LETTER E Fullwidth: U+FF45 +3-2366 U+FF46 # LATIN SMALL LETTER F Fullwidth: U+FF46 +3-2367 U+FF47 # LATIN SMALL LETTER G Fullwidth: U+FF47 +3-2368 U+FF48 # LATIN SMALL LETTER H Fullwidth: U+FF48 +3-2369 U+FF49 # LATIN SMALL LETTER I Fullwidth: U+FF49 +3-236A U+FF4A # LATIN SMALL LETTER J Fullwidth: U+FF4A +3-236B U+FF4B # LATIN SMALL LETTER K Fullwidth: U+FF4B +3-236C U+FF4C # LATIN SMALL LETTER L Fullwidth: U+FF4C +3-236D U+FF4D # LATIN SMALL LETTER M Fullwidth: U+FF4D +3-236E U+FF4E # LATIN SMALL LETTER N Fullwidth: U+FF4E +3-236F U+FF4F # LATIN SMALL LETTER O Fullwidth: U+FF4F +3-2370 U+FF50 # LATIN SMALL LETTER P Fullwidth: U+FF50 +3-2371 U+FF51 # LATIN SMALL LETTER Q Fullwidth: U+FF51 +3-2372 U+FF52 # LATIN SMALL LETTER R Fullwidth: U+FF52 +3-2373 U+FF53 # LATIN SMALL LETTER S Fullwidth: U+FF53 +3-2374 U+FF54 # LATIN SMALL LETTER T Fullwidth: U+FF54 +3-2375 U+FF55 # LATIN SMALL LETTER U Fullwidth: U+FF55 +3-2376 U+FF56 # LATIN SMALL LETTER V Fullwidth: U+FF56 +3-2377 U+FF57 # LATIN SMALL LETTER W Fullwidth: U+FF57 +3-2378 U+FF58 # LATIN SMALL LETTER X Fullwidth: U+FF58 +3-2379 U+FF59 # LATIN SMALL LETTER Y Fullwidth: U+FF59 +3-237A U+FF5A # LATIN SMALL LETTER Z Fullwidth: U+FF5A +3-237B U+30A0 # KATAKANA-HIRAGANA DOUBLE HYPHEN [2000] [Unicode3.2] +3-237C U+2013 # EN DASH [2000] +3-237D U+29FA # DOUBLE PLUS [2000] [Unicode3.2] +3-237E U+29FB # TRIPLE PLUS [2000] [Unicode3.2] +3-2421 U+3041 # HIRAGANA LETTER SMALL A +3-2422 U+3042 # HIRAGANA LETTER A +3-2423 U+3043 # HIRAGANA LETTER SMALL I +3-2424 U+3044 # HIRAGANA LETTER I +3-2425 U+3045 # HIRAGANA LETTER SMALL U +3-2426 U+3046 # HIRAGANA LETTER U +3-2427 U+3047 # HIRAGANA LETTER SMALL E +3-2428 U+3048 # HIRAGANA LETTER E +3-2429 U+3049 # HIRAGANA LETTER SMALL O +3-242A U+304A # HIRAGANA LETTER O +3-242B U+304B # HIRAGANA LETTER KA +3-242C U+304C # HIRAGANA LETTER GA +3-242D U+304D # HIRAGANA LETTER KI +3-242E U+304E # HIRAGANA LETTER GI +3-242F U+304F # HIRAGANA LETTER KU +3-2430 U+3050 # HIRAGANA LETTER GU +3-2431 U+3051 # HIRAGANA LETTER KE +3-2432 U+3052 # HIRAGANA LETTER GE +3-2433 U+3053 # HIRAGANA LETTER KO +3-2434 U+3054 # HIRAGANA LETTER GO +3-2435 U+3055 # HIRAGANA LETTER SA +3-2436 U+3056 # HIRAGANA LETTER ZA +3-2437 U+3057 # HIRAGANA LETTER SI +3-2438 U+3058 # HIRAGANA LETTER ZI +3-2439 U+3059 # HIRAGANA LETTER SU +3-243A U+305A # HIRAGANA LETTER ZU +3-243B U+305B # HIRAGANA LETTER SE +3-243C U+305C # HIRAGANA LETTER ZE +3-243D U+305D # HIRAGANA LETTER SO +3-243E U+305E # HIRAGANA LETTER ZO +3-243F U+305F # HIRAGANA LETTER TA +3-2440 U+3060 # HIRAGANA LETTER DA +3-2441 U+3061 # HIRAGANA LETTER TI +3-2442 U+3062 # HIRAGANA LETTER DI +3-2443 U+3063 # HIRAGANA LETTER SMALL TU +3-2444 U+3064 # HIRAGANA LETTER TU +3-2445 U+3065 # HIRAGANA LETTER DU +3-2446 U+3066 # HIRAGANA LETTER TE +3-2447 U+3067 # HIRAGANA LETTER DE +3-2448 U+3068 # HIRAGANA LETTER TO +3-2449 U+3069 # HIRAGANA LETTER DO +3-244A U+306A # HIRAGANA LETTER NA +3-244B U+306B # HIRAGANA LETTER NI +3-244C U+306C # HIRAGANA LETTER NU +3-244D U+306D # HIRAGANA LETTER NE +3-244E U+306E # HIRAGANA LETTER NO +3-244F U+306F # HIRAGANA LETTER HA +3-2450 U+3070 # HIRAGANA LETTER BA +3-2451 U+3071 # HIRAGANA LETTER PA +3-2452 U+3072 # HIRAGANA LETTER HI +3-2453 U+3073 # HIRAGANA LETTER BI +3-2454 U+3074 # HIRAGANA LETTER PI +3-2455 U+3075 # HIRAGANA LETTER HU +3-2456 U+3076 # HIRAGANA LETTER BU +3-2457 U+3077 # HIRAGANA LETTER PU +3-2458 U+3078 # HIRAGANA LETTER HE +3-2459 U+3079 # HIRAGANA LETTER BE +3-245A U+307A # HIRAGANA LETTER PE +3-245B U+307B # HIRAGANA LETTER HO +3-245C U+307C # HIRAGANA LETTER BO +3-245D U+307D # HIRAGANA LETTER PO +3-245E U+307E # HIRAGANA LETTER MA +3-245F U+307F # HIRAGANA LETTER MI +3-2460 U+3080 # HIRAGANA LETTER MU +3-2461 U+3081 # HIRAGANA LETTER ME +3-2462 U+3082 # HIRAGANA LETTER MO +3-2463 U+3083 # HIRAGANA LETTER SMALL YA +3-2464 U+3084 # HIRAGANA LETTER YA +3-2465 U+3085 # HIRAGANA LETTER SMALL YU +3-2466 U+3086 # HIRAGANA LETTER YU +3-2467 U+3087 # HIRAGANA LETTER SMALL YO +3-2468 U+3088 # HIRAGANA LETTER YO +3-2469 U+3089 # HIRAGANA LETTER RA +3-246A U+308A # HIRAGANA LETTER RI +3-246B U+308B # HIRAGANA LETTER RU +3-246C U+308C # HIRAGANA LETTER RE +3-246D U+308D # HIRAGANA LETTER RO +3-246E U+308E # HIRAGANA LETTER SMALL WA +3-246F U+308F # HIRAGANA LETTER WA +3-2470 U+3090 # HIRAGANA LETTER WI +3-2471 U+3091 # HIRAGANA LETTER WE +3-2472 U+3092 # HIRAGANA LETTER WO +3-2473 U+3093 # HIRAGANA LETTER N +3-2474 U+3094 # HIRAGANA LETTER VU [2000] +3-2475 U+3095 # HIRAGANA LETTER SMALL KA [2000] [Unicode3.2] +3-2476 U+3096 # HIRAGANA LETTER SMALL KE [2000] [Unicode3.2] +3-2477 U+304B+309A # [2000] Private: U+F711 +3-2478 U+304D+309A # [2000] Private: U+F712 +3-2479 U+304F+309A # [2000] Private: U+F713 +3-247A U+3051+309A # [2000] Private: U+F714 +3-247B U+3053+309A # [2000] Private: U+F715 +3-247C # +3-247D # +3-247E # +3-2521 U+30A1 # KATAKANA LETTER SMALL A +3-2522 U+30A2 # KATAKANA LETTER A +3-2523 U+30A3 # KATAKANA LETTER SMALL I +3-2524 U+30A4 # KATAKANA LETTER I +3-2525 U+30A5 # KATAKANA LETTER SMALL U +3-2526 U+30A6 # KATAKANA LETTER U +3-2527 U+30A7 # KATAKANA LETTER SMALL E +3-2528 U+30A8 # KATAKANA LETTER E +3-2529 U+30A9 # KATAKANA LETTER SMALL O +3-252A U+30AA # KATAKANA LETTER O +3-252B U+30AB # KATAKANA LETTER KA +3-252C U+30AC # KATAKANA LETTER GA +3-252D U+30AD # KATAKANA LETTER KI +3-252E U+30AE # KATAKANA LETTER GI +3-252F U+30AF # KATAKANA LETTER KU +3-2530 U+30B0 # KATAKANA LETTER GU +3-2531 U+30B1 # KATAKANA LETTER KE +3-2532 U+30B2 # KATAKANA LETTER GE +3-2533 U+30B3 # KATAKANA LETTER KO +3-2534 U+30B4 # KATAKANA LETTER GO +3-2535 U+30B5 # KATAKANA LETTER SA +3-2536 U+30B6 # KATAKANA LETTER ZA +3-2537 U+30B7 # KATAKANA LETTER SI +3-2538 U+30B8 # KATAKANA LETTER ZI +3-2539 U+30B9 # KATAKANA LETTER SU +3-253A U+30BA # KATAKANA LETTER ZU +3-253B U+30BB # KATAKANA LETTER SE +3-253C U+30BC # KATAKANA LETTER ZE +3-253D U+30BD # KATAKANA LETTER SO +3-253E U+30BE # KATAKANA LETTER ZO +3-253F U+30BF # KATAKANA LETTER TA +3-2540 U+30C0 # KATAKANA LETTER DA +3-2541 U+30C1 # KATAKANA LETTER TI +3-2542 U+30C2 # KATAKANA LETTER DI +3-2543 U+30C3 # KATAKANA LETTER SMALL TU +3-2544 U+30C4 # KATAKANA LETTER TU +3-2545 U+30C5 # KATAKANA LETTER DU +3-2546 U+30C6 # KATAKANA LETTER TE +3-2547 U+30C7 # KATAKANA LETTER DE +3-2548 U+30C8 # KATAKANA LETTER TO +3-2549 U+30C9 # KATAKANA LETTER DO +3-254A U+30CA # KATAKANA LETTER NA +3-254B U+30CB # KATAKANA LETTER NI +3-254C U+30CC # KATAKANA LETTER NU +3-254D U+30CD # KATAKANA LETTER NE +3-254E U+30CE # KATAKANA LETTER NO +3-254F U+30CF # KATAKANA LETTER HA +3-2550 U+30D0 # KATAKANA LETTER BA +3-2551 U+30D1 # KATAKANA LETTER PA +3-2552 U+30D2 # KATAKANA LETTER HI +3-2553 U+30D3 # KATAKANA LETTER BI +3-2554 U+30D4 # KATAKANA LETTER PI +3-2555 U+30D5 # KATAKANA LETTER HU +3-2556 U+30D6 # KATAKANA LETTER BU +3-2557 U+30D7 # KATAKANA LETTER PU +3-2558 U+30D8 # KATAKANA LETTER HE +3-2559 U+30D9 # KATAKANA LETTER BE +3-255A U+30DA # KATAKANA LETTER PE +3-255B U+30DB # KATAKANA LETTER HO +3-255C U+30DC # KATAKANA LETTER BO +3-255D U+30DD # KATAKANA LETTER PO +3-255E U+30DE # KATAKANA LETTER MA +3-255F U+30DF # KATAKANA LETTER MI +3-2560 U+30E0 # KATAKANA LETTER MU +3-2561 U+30E1 # KATAKANA LETTER ME +3-2562 U+30E2 # KATAKANA LETTER MO +3-2563 U+30E3 # KATAKANA LETTER SMALL YA +3-2564 U+30E4 # KATAKANA LETTER YA +3-2565 U+30E5 # KATAKANA LETTER SMALL YU +3-2566 U+30E6 # KATAKANA LETTER YU +3-2567 U+30E7 # KATAKANA LETTER SMALL YO +3-2568 U+30E8 # KATAKANA LETTER YO +3-2569 U+30E9 # KATAKANA LETTER RA +3-256A U+30EA # KATAKANA LETTER RI +3-256B U+30EB # KATAKANA LETTER RU +3-256C U+30EC # KATAKANA LETTER RE +3-256D U+30ED # KATAKANA LETTER RO +3-256E U+30EE # KATAKANA LETTER SMALL WA +3-256F U+30EF # KATAKANA LETTER WA +3-2570 U+30F0 # KATAKANA LETTER WI +3-2571 U+30F1 # KATAKANA LETTER WE +3-2572 U+30F2 # KATAKANA LETTER WO +3-2573 U+30F3 # KATAKANA LETTER N +3-2574 U+30F4 # KATAKANA LETTER VU +3-2575 U+30F5 # KATAKANA LETTER SMALL KA +3-2576 U+30F6 # KATAKANA LETTER SMALL KE +3-2577 U+30AB+309A # [2000] Private: U+F716 +3-2578 U+30AD+309A # [2000] Private: U+F717 +3-2579 U+30AF+309A # [2000] Private: U+F718 +3-257A U+30B1+309A # [2000] Private: U+F719 +3-257B U+30B3+309A # [2000] Private: U+F71A +3-257C U+30BB+309A # [2000] Private: U+F71B +3-257D U+30C4+309A # [2000] Private: U+F71C +3-257E U+30C8+309A # [2000] Private: U+F71D +3-2621 U+0391 # GREEK CAPITAL LETTER ALPHA +3-2622 U+0392 # GREEK CAPITAL LETTER BETA +3-2623 U+0393 # GREEK CAPITAL LETTER GAMMA +3-2624 U+0394 # GREEK CAPITAL LETTER DELTA +3-2625 U+0395 # GREEK CAPITAL LETTER EPSILON +3-2626 U+0396 # GREEK CAPITAL LETTER ZETA +3-2627 U+0397 # GREEK CAPITAL LETTER ETA +3-2628 U+0398 # GREEK CAPITAL LETTER THETA +3-2629 U+0399 # GREEK CAPITAL LETTER IOTA +3-262A U+039A # GREEK CAPITAL LETTER KAPPA +3-262B U+039B # GREEK CAPITAL LETTER LAMDA +3-262C U+039C # GREEK CAPITAL LETTER MU +3-262D U+039D # GREEK CAPITAL LETTER NU +3-262E U+039E # GREEK CAPITAL LETTER XI +3-262F U+039F # GREEK CAPITAL LETTER OMICRON +3-2630 U+03A0 # GREEK CAPITAL LETTER PI +3-2631 U+03A1 # GREEK CAPITAL LETTER RHO +3-2632 U+03A3 # GREEK CAPITAL LETTER SIGMA +3-2633 U+03A4 # GREEK CAPITAL LETTER TAU +3-2634 U+03A5 # GREEK CAPITAL LETTER UPSILON +3-2635 U+03A6 # GREEK CAPITAL LETTER PHI +3-2636 U+03A7 # GREEK CAPITAL LETTER CHI +3-2637 U+03A8 # GREEK CAPITAL LETTER PSI +3-2638 U+03A9 # GREEK CAPITAL LETTER OMEGA +3-2639 U+2664 # WHITE SPADE SUIT [2000] +3-263A U+2660 # BLACK SPADE SUIT [2000] +3-263B U+2662 # WHITE DIAMOND SUIT [2000] +3-263C U+2666 # BLACK DIAMOND SUIT [2000] +3-263D U+2661 # WHITE HEART SUIT [2000] +3-263E U+2665 # BLACK HEART SUIT [2000] +3-263F U+2667 # WHITE CLUB SUIT [2000] +3-2640 U+2663 # BLACK CLUB SUIT [2000] +3-2641 U+03B1 # GREEK SMALL LETTER ALPHA +3-2642 U+03B2 # GREEK SMALL LETTER BETA +3-2643 U+03B3 # GREEK SMALL LETTER GAMMA +3-2644 U+03B4 # GREEK SMALL LETTER DELTA +3-2645 U+03B5 # GREEK SMALL LETTER EPSILON +3-2646 U+03B6 # GREEK SMALL LETTER ZETA +3-2647 U+03B7 # GREEK SMALL LETTER ETA +3-2648 U+03B8 # GREEK SMALL LETTER THETA +3-2649 U+03B9 # GREEK SMALL LETTER IOTA +3-264A U+03BA # GREEK SMALL LETTER KAPPA +3-264B U+03BB # GREEK SMALL LETTER LAMDA +3-264C U+03BC # GREEK SMALL LETTER MU +3-264D U+03BD # GREEK SMALL LETTER NU +3-264E U+03BE # GREEK SMALL LETTER XI +3-264F U+03BF # GREEK SMALL LETTER OMICRON +3-2650 U+03C0 # GREEK SMALL LETTER PI +3-2651 U+03C1 # GREEK SMALL LETTER RHO +3-2652 U+03C3 # GREEK SMALL LETTER SIGMA +3-2653 U+03C4 # GREEK SMALL LETTER TAU +3-2654 U+03C5 # GREEK SMALL LETTER UPSILON +3-2655 U+03C6 # GREEK SMALL LETTER PHI +3-2656 U+03C7 # GREEK SMALL LETTER CHI +3-2657 U+03C8 # GREEK SMALL LETTER PSI +3-2658 U+03C9 # GREEK SMALL LETTER OMEGA +3-2659 U+03C2 # GREEK SMALL LETTER FINAL SIGMA [2000] +3-265A U+24F5 # DOUBLE CIRCLED DIGIT ONE [2000] [Unicode3.2] +3-265B U+24F6 # DOUBLE CIRCLED DIGIT TWO [2000] [Unicode3.2] +3-265C U+24F7 # DOUBLE CIRCLED DIGIT THREE [2000] [Unicode3.2] +3-265D U+24F8 # DOUBLE CIRCLED DIGIT FOUR [2000] [Unicode3.2] +3-265E U+24F9 # DOUBLE CIRCLED DIGIT FIVE [2000] [Unicode3.2] +3-265F U+24FA # DOUBLE CIRCLED DIGIT SIX [2000] [Unicode3.2] +3-2660 U+24FB # DOUBLE CIRCLED DIGIT SEVEN [2000] [Unicode3.2] +3-2661 U+24FC # DOUBLE CIRCLED DIGIT EIGHT [2000] [Unicode3.2] +3-2662 U+24FD # DOUBLE CIRCLED DIGIT NINE [2000] [Unicode3.2] +3-2663 U+24FE # DOUBLE CIRCLED NUMBER TEN [2000] [Unicode3.2] +3-2664 U+2616 # WHITE SHOGI PIECE [2000] [Unicode3.2] +3-2665 U+2617 # BLACK SHOGI PIECE [2000] [Unicode3.2] +3-2666 U+3020 # POSTAL MARK FACE [2000] +3-2667 U+260E # BLACK TELEPHONE [2000] +3-2668 U+2600 # BLACK SUN WITH RAYS [2000] +3-2669 U+2601 # CLOUD [2000] +3-266A U+2602 # UMBRELLA [2000] +3-266B U+2603 # SNOWMAN [2000] +3-266C U+2668 # HOT SPRINGS [2000] +3-266D U+25B1 # WHITE PARALLELOGRAM [2000] +3-266E U+31F0 # KATAKANA LETTER SMALL KU [2000] [Unicode3.2] +3-266F U+31F1 # KATAKANA LETTER SMALL SI [2000] [Unicode3.2] +3-2670 U+31F2 # KATAKANA LETTER SMALL SU [2000] [Unicode3.2] +3-2671 U+31F3 # KATAKANA LETTER SMALL TO [2000] [Unicode3.2] +3-2672 U+31F4 # KATAKANA LETTER SMALL NU [2000] [Unicode3.2] +3-2673 U+31F5 # KATAKANA LETTER SMALL HA [2000] [Unicode3.2] +3-2674 U+31F6 # KATAKANA LETTER SMALL HI [2000] [Unicode3.2] +3-2675 U+31F7 # KATAKANA LETTER SMALL HU [2000] [Unicode3.2] +3-2676 U+31F8 # KATAKANA LETTER SMALL HE [2000] [Unicode3.2] +3-2677 U+31F9 # KATAKANA LETTER SMALL HO [2000] [Unicode3.2] +3-2678 U+31F7+309A # [2000] Private: U+F734 +3-2679 U+31FA # KATAKANA LETTER SMALL MU [2000] [Unicode3.2] +3-267A U+31FB # KATAKANA LETTER SMALL RA [2000] [Unicode3.2] +3-267B U+31FC # KATAKANA LETTER SMALL RI [2000] [Unicode3.2] +3-267C U+31FD # KATAKANA LETTER SMALL RU [2000] [Unicode3.2] +3-267D U+31FE # KATAKANA LETTER SMALL RE [2000] [Unicode3.2] +3-267E U+31FF # KATAKANA LETTER SMALL RO [2000] [Unicode3.2] +3-2721 U+0410 # CYRILLIC CAPITAL LETTER A +3-2722 U+0411 # CYRILLIC CAPITAL LETTER BE +3-2723 U+0412 # CYRILLIC CAPITAL LETTER VE +3-2724 U+0413 # CYRILLIC CAPITAL LETTER GHE +3-2725 U+0414 # CYRILLIC CAPITAL LETTER DE +3-2726 U+0415 # CYRILLIC CAPITAL LETTER IE +3-2727 U+0401 # CYRILLIC CAPITAL LETTER IO +3-2728 U+0416 # CYRILLIC CAPITAL LETTER ZHE +3-2729 U+0417 # CYRILLIC CAPITAL LETTER ZE +3-272A U+0418 # CYRILLIC CAPITAL LETTER I +3-272B U+0419 # CYRILLIC CAPITAL LETTER SHORT I +3-272C U+041A # CYRILLIC CAPITAL LETTER KA +3-272D U+041B # CYRILLIC CAPITAL LETTER EL +3-272E U+041C # CYRILLIC CAPITAL LETTER EM +3-272F U+041D # CYRILLIC CAPITAL LETTER EN +3-2730 U+041E # CYRILLIC CAPITAL LETTER O +3-2731 U+041F # CYRILLIC CAPITAL LETTER PE +3-2732 U+0420 # CYRILLIC CAPITAL LETTER ER +3-2733 U+0421 # CYRILLIC CAPITAL LETTER ES +3-2734 U+0422 # CYRILLIC CAPITAL LETTER TE +3-2735 U+0423 # CYRILLIC CAPITAL LETTER U +3-2736 U+0424 # CYRILLIC CAPITAL LETTER EF +3-2737 U+0425 # CYRILLIC CAPITAL LETTER HA +3-2738 U+0426 # CYRILLIC CAPITAL LETTER TSE +3-2739 U+0427 # CYRILLIC CAPITAL LETTER CHE +3-273A U+0428 # CYRILLIC CAPITAL LETTER SHA +3-273B U+0429 # CYRILLIC CAPITAL LETTER SHCHA +3-273C U+042A # CYRILLIC CAPITAL LETTER HARD SIGN +3-273D U+042B # CYRILLIC CAPITAL LETTER YERU +3-273E U+042C # CYRILLIC CAPITAL LETTER SOFT SIGN +3-273F U+042D # CYRILLIC CAPITAL LETTER E +3-2740 U+042E # CYRILLIC CAPITAL LETTER YU +3-2741 U+042F # CYRILLIC CAPITAL LETTER YA +3-2742 U+23BE # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT [2000] [Unicode3.2] +3-2743 U+23BF # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT [2000] [Unicode3.2] +3-2744 U+23C0 # DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE [2000] [Unicode3.2] +3-2745 U+23C1 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE [2000] [Unicode3.2] +3-2746 U+23C2 # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE [2000] [Unicode3.2] +3-2747 U+23C3 # DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE [2000] [Unicode3.2] +3-2748 U+23C4 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE [2000] [Unicode3.2] +3-2749 U+23C5 # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE [2000] [Unicode3.2] +3-274A U+23C6 # DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE [2000] [Unicode3.2] +3-274B U+23C7 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE [2000] [Unicode3.2] +3-274C U+23C8 # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE [2000] [Unicode3.2] +3-274D U+23C9 # DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL [2000] [Unicode3.2] +3-274E U+23CA # DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL [2000] [Unicode3.2] +3-274F U+23CB # DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT [2000] [Unicode3.2] +3-2750 U+23CC # DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT [2000] [Unicode3.2] +3-2751 U+0430 # CYRILLIC SMALL LETTER A +3-2752 U+0431 # CYRILLIC SMALL LETTER BE +3-2753 U+0432 # CYRILLIC SMALL LETTER VE +3-2754 U+0433 # CYRILLIC SMALL LETTER GHE +3-2755 U+0434 # CYRILLIC SMALL LETTER DE +3-2756 U+0435 # CYRILLIC SMALL LETTER IE +3-2757 U+0451 # CYRILLIC SMALL LETTER IO +3-2758 U+0436 # CYRILLIC SMALL LETTER ZHE +3-2759 U+0437 # CYRILLIC SMALL LETTER ZE +3-275A U+0438 # CYRILLIC SMALL LETTER I +3-275B U+0439 # CYRILLIC SMALL LETTER SHORT I +3-275C U+043A # CYRILLIC SMALL LETTER KA +3-275D U+043B # CYRILLIC SMALL LETTER EL +3-275E U+043C # CYRILLIC SMALL LETTER EM +3-275F U+043D # CYRILLIC SMALL LETTER EN +3-2760 U+043E # CYRILLIC SMALL LETTER O +3-2761 U+043F # CYRILLIC SMALL LETTER PE +3-2762 U+0440 # CYRILLIC SMALL LETTER ER +3-2763 U+0441 # CYRILLIC SMALL LETTER ES +3-2764 U+0442 # CYRILLIC SMALL LETTER TE +3-2765 U+0443 # CYRILLIC SMALL LETTER U +3-2766 U+0444 # CYRILLIC SMALL LETTER EF +3-2767 U+0445 # CYRILLIC SMALL LETTER HA +3-2768 U+0446 # CYRILLIC SMALL LETTER TSE +3-2769 U+0447 # CYRILLIC SMALL LETTER CHE +3-276A U+0448 # CYRILLIC SMALL LETTER SHA +3-276B U+0449 # CYRILLIC SMALL LETTER SHCHA +3-276C U+044A # CYRILLIC SMALL LETTER HARD SIGN +3-276D U+044B # CYRILLIC SMALL LETTER YERU +3-276E U+044C # CYRILLIC SMALL LETTER SOFT SIGN +3-276F U+044D # CYRILLIC SMALL LETTER E +3-2770 U+044E # CYRILLIC SMALL LETTER YU +3-2771 U+044F # CYRILLIC SMALL LETTER YA +3-2772 U+30F7 # KATAKANA LETTER VA [2000] +3-2773 U+30F8 # KATAKANA LETTER VI [2000] +3-2774 U+30F9 # KATAKANA LETTER VE [2000] +3-2775 U+30FA # KATAKANA LETTER VO [2000] +3-2776 U+22DA # LESS-THAN EQUAL TO OR GREATER-THAN [2000] +3-2777 U+22DB # GREATER-THAN EQUAL TO OR LESS-THAN [2000] +3-2778 U+2153 # VULGAR FRACTION ONE THIRD [2000] +3-2779 U+2154 # VULGAR FRACTION TWO THIRDS [2000] +3-277A U+2155 # VULGAR FRACTION ONE FIFTH [2000] +3-277B U+2713 # CHECK MARK [2000] +3-277C U+2318 # PLACE OF INTEREST SIGN [2000] +3-277D U+2423 # OPEN BOX [2000] +3-277E U+23CE # RETURN SYMBOL [2000] [Unicode3.2] +3-2821 U+2500 # BOX DRAWINGS LIGHT HORIZONTAL [1983] +3-2822 U+2502 # BOX DRAWINGS LIGHT VERTICAL [1983] +3-2823 U+250C # BOX DRAWINGS LIGHT DOWN AND RIGHT [1983] +3-2824 U+2510 # BOX DRAWINGS LIGHT DOWN AND LEFT [1983] +3-2825 U+2518 # BOX DRAWINGS LIGHT UP AND LEFT [1983] +3-2826 U+2514 # BOX DRAWINGS LIGHT UP AND RIGHT [1983] +3-2827 U+251C # BOX DRAWINGS LIGHT VERTICAL AND RIGHT [1983] +3-2828 U+252C # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL [1983] +3-2829 U+2524 # BOX DRAWINGS LIGHT VERTICAL AND LEFT [1983] +3-282A U+2534 # BOX DRAWINGS LIGHT UP AND HORIZONTAL [1983] +3-282B U+253C # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL [1983] +3-282C U+2501 # BOX DRAWINGS HEAVY HORIZONTAL [1983] +3-282D U+2503 # BOX DRAWINGS HEAVY VERTICAL [1983] +3-282E U+250F # BOX DRAWINGS HEAVY DOWN AND RIGHT [1983] +3-282F U+2513 # BOX DRAWINGS HEAVY DOWN AND LEFT [1983] +3-2830 U+251B # BOX DRAWINGS HEAVY UP AND LEFT [1983] +3-2831 U+2517 # BOX DRAWINGS HEAVY UP AND RIGHT [1983] +3-2832 U+2523 # BOX DRAWINGS HEAVY VERTICAL AND RIGHT [1983] +3-2833 U+2533 # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL [1983] +3-2834 U+252B # BOX DRAWINGS HEAVY VERTICAL AND LEFT [1983] +3-2835 U+253B # BOX DRAWINGS HEAVY UP AND HORIZONTAL [1983] +3-2836 U+254B # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL [1983] +3-2837 U+2520 # BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT [1983] +3-2838 U+252F # BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY [1983] +3-2839 U+2528 # BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT [1983] +3-283A U+2537 # BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY [1983] +3-283B U+253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY [1983] +3-283C U+251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY [1983] +3-283D U+2530 # BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT [1983] +3-283E U+2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY [1983] +3-283F U+2538 # BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT [1983] +3-2840 U+2542 # BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT [1983] +3-2841 U+3251 # CIRCLED NUMBER TWENTY ONE [2000] [Unicode3.2] +3-2842 U+3252 # CIRCLED NUMBER TWENTY TWO [2000] [Unicode3.2] +3-2843 U+3253 # CIRCLED NUMBER TWENTY THREE [2000] [Unicode3.2] +3-2844 U+3254 # CIRCLED NUMBER TWENTY FOUR [2000] [Unicode3.2] +3-2845 U+3255 # CIRCLED NUMBER TWENTY FIVE [2000] [Unicode3.2] +3-2846 U+3256 # CIRCLED NUMBER TWENTY SIX [2000] [Unicode3.2] +3-2847 U+3257 # CIRCLED NUMBER TWENTY SEVEN [2000] [Unicode3.2] +3-2848 U+3258 # CIRCLED NUMBER TWENTY EIGHT [2000] [Unicode3.2] +3-2849 U+3259 # CIRCLED NUMBER TWENTY NINE [2000] [Unicode3.2] +3-284A U+325A # CIRCLED NUMBER THIRTY [2000] [Unicode3.2] +3-284B U+325B # CIRCLED NUMBER THIRTY ONE [2000] [Unicode3.2] +3-284C U+325C # CIRCLED NUMBER THIRTY TWO [2000] [Unicode3.2] +3-284D U+325D # CIRCLED NUMBER THIRTY THREE [2000] [Unicode3.2] +3-284E U+325E # CIRCLED NUMBER THIRTY FOUR [2000] [Unicode3.2] +3-284F U+325F # CIRCLED NUMBER THIRTY FIVE [2000] [Unicode3.2] +3-2850 U+32B1 # CIRCLED NUMBER THIRTY SIX [2000] [Unicode3.2] +3-2851 U+32B2 # CIRCLED NUMBER THIRTY SEVEN [2000] [Unicode3.2] +3-2852 U+32B3 # CIRCLED NUMBER THIRTY EIGHT [2000] [Unicode3.2] +3-2853 U+32B4 # CIRCLED NUMBER THIRTY NINE [2000] [Unicode3.2] +3-2854 U+32B5 # CIRCLED NUMBER FORTY [2000] [Unicode3.2] +3-2855 U+32B6 # CIRCLED NUMBER FORTY ONE [2000] [Unicode3.2] +3-2856 U+32B7 # CIRCLED NUMBER FORTY TWO [2000] [Unicode3.2] +3-2857 U+32B8 # CIRCLED NUMBER FORTY THREE [2000] [Unicode3.2] +3-2858 U+32B9 # CIRCLED NUMBER FORTY FOUR [2000] [Unicode3.2] +3-2859 U+32BA # CIRCLED NUMBER FORTY FIVE [2000] [Unicode3.2] +3-285A U+32BB # CIRCLED NUMBER FORTY SIX [2000] [Unicode3.2] +3-285B U+32BC # CIRCLED NUMBER FORTY SEVEN [2000] [Unicode3.2] +3-285C U+32BD # CIRCLED NUMBER FORTY EIGHT [2000] [Unicode3.2] +3-285D U+32BE # CIRCLED NUMBER FORTY NINE [2000] [Unicode3.2] +3-285E U+32BF # CIRCLED NUMBER FIFTY [2000] [Unicode3.2] +3-285F # +3-2860 # +3-2861 # +3-2862 # +3-2863 # +3-2864 # +3-2865 # +3-2866 # +3-2867 U+25D0 # CIRCLE WITH LEFT HALF BLACK [2000] +3-2868 U+25D1 # CIRCLE WITH RIGHT HALF BLACK [2000] +3-2869 U+25D2 # CIRCLE WITH LOWER HALF BLACK [2000] +3-286A U+25D3 # CIRCLE WITH UPPER HALF BLACK [2000] +3-286B U+203C # DOUBLE EXCLAMATION MARK [2000] +3-286C U+2047 # DOUBLE QUESTION MARK [2000] [Unicode3.2] +3-286D U+2048 # QUESTION EXCLAMATION MARK [2000] +3-286E U+2049 # EXCLAMATION QUESTION MARK [2000] +3-286F U+01CD # LATIN CAPITAL LETTER A WITH CARON [2000] +3-2870 U+01CE # LATIN SMALL LETTER A WITH CARON [2000] +3-2871 U+01D0 # LATIN SMALL LETTER I WITH CARON [2000] +3-2872 U+1E3E # LATIN CAPITAL LETTER M WITH ACUTE [2000] +3-2873 U+1E3F # LATIN SMALL LETTER M WITH ACUTE [2000] +3-2874 U+01F8 # LATIN CAPITAL LETTER N WITH GRAVE [2000] +3-2875 U+01F9 # LATIN SMALL LETTER N WITH GRAVE [2000] +3-2876 U+01D1 # LATIN CAPITAL LETTER O WITH CARON [2000] +3-2877 U+01D2 # LATIN SMALL LETTER O WITH CARON [2000] +3-2878 U+01D4 # LATIN SMALL LETTER U WITH CARON [2000] +3-2879 U+01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON [2000] +3-287A U+01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE [2000] +3-287B U+01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON [2000] +3-287C U+01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE [2000] +3-287D # +3-287E # +3-2921 U+20AC # EURO SIGN [2000] +3-2922 U+00A0 # NO-BREAK SPACE [2000] +3-2923 U+00A1 # INVERTED EXCLAMATION MARK [2000] +3-2924 U+00A4 # CURRENCY SIGN [2000] +3-2925 U+00A6 # BROKEN BAR [2000] +3-2926 U+00A9 # COPYRIGHT SIGN [2000] +3-2927 U+00AA # FEMININE ORDINAL INDICATOR [2000] +3-2928 U+00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK [2000] +3-2929 U+00AD # SOFT HYPHEN [2000] +3-292A U+00AE # REGISTERED SIGN [2000] +3-292B U+00AF # MACRON [2000] +3-292C U+00B2 # SUPERSCRIPT TWO [2000] +3-292D U+00B3 # SUPERSCRIPT THREE [2000] +3-292E U+00B7 # MIDDLE DOT [2000] +3-292F U+00B8 # CEDILLA [2000] +3-2930 U+00B9 # SUPERSCRIPT ONE [2000] +3-2931 U+00BA # MASCULINE ORDINAL INDICATOR [2000] +3-2932 U+00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK [2000] +3-2933 U+00BC # VULGAR FRACTION ONE QUARTER [2000] +3-2934 U+00BD # VULGAR FRACTION ONE HALF [2000] +3-2935 U+00BE # VULGAR FRACTION THREE QUARTERS [2000] +3-2936 U+00BF # INVERTED QUESTION MARK [2000] +3-2937 U+00C0 # LATIN CAPITAL LETTER A WITH GRAVE [2000] +3-2938 U+00C1 # LATIN CAPITAL LETTER A WITH ACUTE [2000] +3-2939 U+00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX [2000] +3-293A U+00C3 # LATIN CAPITAL LETTER A WITH TILDE [2000] +3-293B U+00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS [2000] +3-293C U+00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE [2000] +3-293D U+00C6 # LATIN CAPITAL LETTER AE [2000] +3-293E U+00C7 # LATIN CAPITAL LETTER C WITH CEDILLA [2000] +3-293F U+00C8 # LATIN CAPITAL LETTER E WITH GRAVE [2000] +3-2940 U+00C9 # LATIN CAPITAL LETTER E WITH ACUTE [2000] +3-2941 U+00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX [2000] +3-2942 U+00CB # LATIN CAPITAL LETTER E WITH DIAERESIS [2000] +3-2943 U+00CC # LATIN CAPITAL LETTER I WITH GRAVE [2000] +3-2944 U+00CD # LATIN CAPITAL LETTER I WITH ACUTE [2000] +3-2945 U+00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX [2000] +3-2946 U+00CF # LATIN CAPITAL LETTER I WITH DIAERESIS [2000] +3-2947 U+00D0 # LATIN CAPITAL LETTER ETH [2000] +3-2948 U+00D1 # LATIN CAPITAL LETTER N WITH TILDE [2000] +3-2949 U+00D2 # LATIN CAPITAL LETTER O WITH GRAVE [2000] +3-294A U+00D3 # LATIN CAPITAL LETTER O WITH ACUTE [2000] +3-294B U+00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX [2000] +3-294C U+00D5 # LATIN CAPITAL LETTER O WITH TILDE [2000] +3-294D U+00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS [2000] +3-294E U+00D8 # LATIN CAPITAL LETTER O WITH STROKE [2000] +3-294F U+00D9 # LATIN CAPITAL LETTER U WITH GRAVE [2000] +3-2950 U+00DA # LATIN CAPITAL LETTER U WITH ACUTE [2000] +3-2951 U+00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX [2000] +3-2952 U+00DC # LATIN CAPITAL LETTER U WITH DIAERESIS [2000] +3-2953 U+00DD # LATIN CAPITAL LETTER Y WITH ACUTE [2000] +3-2954 U+00DE # LATIN CAPITAL LETTER THORN [2000] +3-2955 U+00DF # LATIN SMALL LETTER SHARP S [2000] +3-2956 U+00E0 # LATIN SMALL LETTER A WITH GRAVE [2000] +3-2957 U+00E1 # LATIN SMALL LETTER A WITH ACUTE [2000] +3-2958 U+00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX [2000] +3-2959 U+00E3 # LATIN SMALL LETTER A WITH TILDE [2000] +3-295A U+00E4 # LATIN SMALL LETTER A WITH DIAERESIS [2000] +3-295B U+00E5 # LATIN SMALL LETTER A WITH RING ABOVE [2000] +3-295C U+00E6 # LATIN SMALL LETTER AE [2000] +3-295D U+00E7 # LATIN SMALL LETTER C WITH CEDILLA [2000] +3-295E U+00E8 # LATIN SMALL LETTER E WITH GRAVE [2000] +3-295F U+00E9 # LATIN SMALL LETTER E WITH ACUTE [2000] +3-2960 U+00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX [2000] +3-2961 U+00EB # LATIN SMALL LETTER E WITH DIAERESIS [2000] +3-2962 U+00EC # LATIN SMALL LETTER I WITH GRAVE [2000] +3-2963 U+00ED # LATIN SMALL LETTER I WITH ACUTE [2000] +3-2964 U+00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX [2000] +3-2965 U+00EF # LATIN SMALL LETTER I WITH DIAERESIS [2000] +3-2966 U+00F0 # LATIN SMALL LETTER ETH [2000] +3-2967 U+00F1 # LATIN SMALL LETTER N WITH TILDE [2000] +3-2968 U+00F2 # LATIN SMALL LETTER O WITH GRAVE [2000] +3-2969 U+00F3 # LATIN SMALL LETTER O WITH ACUTE [2000] +3-296A U+00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX [2000] +3-296B U+00F5 # LATIN SMALL LETTER O WITH TILDE [2000] +3-296C U+00F6 # LATIN SMALL LETTER O WITH DIAERESIS [2000] +3-296D U+00F8 # LATIN SMALL LETTER O WITH STROKE [2000] +3-296E U+00F9 # LATIN SMALL LETTER U WITH GRAVE [2000] +3-296F U+00FA # LATIN SMALL LETTER U WITH ACUTE [2000] +3-2970 U+00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX [2000] +3-2971 U+00FC # LATIN SMALL LETTER U WITH DIAERESIS [2000] +3-2972 U+00FD # LATIN SMALL LETTER Y WITH ACUTE [2000] +3-2973 U+00FE # LATIN SMALL LETTER THORN [2000] +3-2974 U+00FF # LATIN SMALL LETTER Y WITH DIAERESIS [2000] +3-2975 U+0100 # LATIN CAPITAL LETTER A WITH MACRON [2000] +3-2976 U+012A # LATIN CAPITAL LETTER I WITH MACRON [2000] +3-2977 U+016A # LATIN CAPITAL LETTER U WITH MACRON [2000] +3-2978 U+0112 # LATIN CAPITAL LETTER E WITH MACRON [2000] +3-2979 U+014C # LATIN CAPITAL LETTER O WITH MACRON [2000] +3-297A U+0101 # LATIN SMALL LETTER A WITH MACRON [2000] +3-297B U+012B # LATIN SMALL LETTER I WITH MACRON [2000] +3-297C U+016B # LATIN SMALL LETTER U WITH MACRON [2000] +3-297D U+0113 # LATIN SMALL LETTER E WITH MACRON [2000] +3-297E U+014D # LATIN SMALL LETTER O WITH MACRON [2000] +3-2A21 U+0104 # LATIN CAPITAL LETTER A WITH OGONEK [2000] +3-2A22 U+02D8 # BREVE [2000] +3-2A23 U+0141 # LATIN CAPITAL LETTER L WITH STROKE [2000] +3-2A24 U+013D # LATIN CAPITAL LETTER L WITH CARON [2000] +3-2A25 U+015A # LATIN CAPITAL LETTER S WITH ACUTE [2000] +3-2A26 U+0160 # LATIN CAPITAL LETTER S WITH CARON [2000] +3-2A27 U+015E # LATIN CAPITAL LETTER S WITH CEDILLA [2000] +3-2A28 U+0164 # LATIN CAPITAL LETTER T WITH CARON [2000] +3-2A29 U+0179 # LATIN CAPITAL LETTER Z WITH ACUTE [2000] +3-2A2A U+017D # LATIN CAPITAL LETTER Z WITH CARON [2000] +3-2A2B U+017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE [2000] +3-2A2C U+0105 # LATIN SMALL LETTER A WITH OGONEK [2000] +3-2A2D U+02DB # OGONEK [2000] +3-2A2E U+0142 # LATIN SMALL LETTER L WITH STROKE [2000] +3-2A2F U+013E # LATIN SMALL LETTER L WITH CARON [2000] +3-2A30 U+015B # LATIN SMALL LETTER S WITH ACUTE [2000] +3-2A31 U+02C7 # CARON [2000] +3-2A32 U+0161 # LATIN SMALL LETTER S WITH CARON [2000] +3-2A33 U+015F # LATIN SMALL LETTER S WITH CEDILLA [2000] +3-2A34 U+0165 # LATIN SMALL LETTER T WITH CARON [2000] +3-2A35 U+017A # LATIN SMALL LETTER Z WITH ACUTE [2000] +3-2A36 U+02DD # DOUBLE ACUTE ACCENT [2000] +3-2A37 U+017E # LATIN SMALL LETTER Z WITH CARON [2000] +3-2A38 U+017C # LATIN SMALL LETTER Z WITH DOT ABOVE [2000] +3-2A39 U+0154 # LATIN CAPITAL LETTER R WITH ACUTE [2000] +3-2A3A U+0102 # LATIN CAPITAL LETTER A WITH BREVE [2000] +3-2A3B U+0139 # LATIN CAPITAL LETTER L WITH ACUTE [2000] +3-2A3C U+0106 # LATIN CAPITAL LETTER C WITH ACUTE [2000] +3-2A3D U+010C # LATIN CAPITAL LETTER C WITH CARON [2000] +3-2A3E U+0118 # LATIN CAPITAL LETTER E WITH OGONEK [2000] +3-2A3F U+011A # LATIN CAPITAL LETTER E WITH CARON [2000] +3-2A40 U+010E # LATIN CAPITAL LETTER D WITH CARON [2000] +3-2A41 U+0143 # LATIN CAPITAL LETTER N WITH ACUTE [2000] +3-2A42 U+0147 # LATIN CAPITAL LETTER N WITH CARON [2000] +3-2A43 U+0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE [2000] +3-2A44 U+0158 # LATIN CAPITAL LETTER R WITH CARON [2000] +3-2A45 U+016E # LATIN CAPITAL LETTER U WITH RING ABOVE [2000] +3-2A46 U+0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE [2000] +3-2A47 U+0162 # LATIN CAPITAL LETTER T WITH CEDILLA [2000] +3-2A48 U+0155 # LATIN SMALL LETTER R WITH ACUTE [2000] +3-2A49 U+0103 # LATIN SMALL LETTER A WITH BREVE [2000] +3-2A4A U+013A # LATIN SMALL LETTER L WITH ACUTE [2000] +3-2A4B U+0107 # LATIN SMALL LETTER C WITH ACUTE [2000] +3-2A4C U+010D # LATIN SMALL LETTER C WITH CARON [2000] +3-2A4D U+0119 # LATIN SMALL LETTER E WITH OGONEK [2000] +3-2A4E U+011B # LATIN SMALL LETTER E WITH CARON [2000] +3-2A4F U+010F # LATIN SMALL LETTER D WITH CARON [2000] +3-2A50 U+0111 # LATIN SMALL LETTER D WITH STROKE [2000] +3-2A51 U+0144 # LATIN SMALL LETTER N WITH ACUTE [2000] +3-2A52 U+0148 # LATIN SMALL LETTER N WITH CARON [2000] +3-2A53 U+0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE [2000] +3-2A54 U+0159 # LATIN SMALL LETTER R WITH CARON [2000] +3-2A55 U+016F # LATIN SMALL LETTER U WITH RING ABOVE [2000] +3-2A56 U+0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE [2000] +3-2A57 U+0163 # LATIN SMALL LETTER T WITH CEDILLA [2000] +3-2A58 U+02D9 # DOT ABOVE [2000] +3-2A59 U+0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX [2000] +3-2A5A U+011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX [2000] +3-2A5B U+0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX [2000] +3-2A5C U+0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX [2000] +3-2A5D U+015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX [2000] +3-2A5E U+016C # LATIN CAPITAL LETTER U WITH BREVE [2000] +3-2A5F U+0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX [2000] +3-2A60 U+011D # LATIN SMALL LETTER G WITH CIRCUMFLEX [2000] +3-2A61 U+0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX [2000] +3-2A62 U+0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX [2000] +3-2A63 U+015D # LATIN SMALL LETTER S WITH CIRCUMFLEX [2000] +3-2A64 U+016D # LATIN SMALL LETTER U WITH BREVE [2000] +3-2A65 U+0271 # LATIN SMALL LETTER M WITH HOOK [2000] +3-2A66 U+028B # LATIN SMALL LETTER V WITH HOOK [2000] +3-2A67 U+027E # LATIN SMALL LETTER R WITH FISHHOOK [2000] +3-2A68 U+0283 # LATIN SMALL LETTER ESH [2000] +3-2A69 U+0292 # LATIN SMALL LETTER EZH [2000] +3-2A6A U+026C # LATIN SMALL LETTER L WITH BELT [2000] +3-2A6B U+026E # LATIN SMALL LETTER LEZH [2000] +3-2A6C U+0279 # LATIN SMALL LETTER TURNED R [2000] +3-2A6D U+0288 # LATIN SMALL LETTER T WITH RETROFLEX HOOK [2000] +3-2A6E U+0256 # LATIN SMALL LETTER D WITH TAIL [2000] +3-2A6F U+0273 # LATIN SMALL LETTER N WITH RETROFLEX HOOK [2000] +3-2A70 U+027D # LATIN SMALL LETTER R WITH TAIL [2000] +3-2A71 U+0282 # LATIN SMALL LETTER S WITH HOOK [2000] +3-2A72 U+0290 # LATIN SMALL LETTER Z WITH RETROFLEX HOOK [2000] +3-2A73 U+027B # LATIN SMALL LETTER TURNED R WITH HOOK [2000] +3-2A74 U+026D # LATIN SMALL LETTER L WITH RETROFLEX HOOK [2000] +3-2A75 U+025F # LATIN SMALL LETTER DOTLESS J WITH STROKE [2000] +3-2A76 U+0272 # LATIN SMALL LETTER N WITH LEFT HOOK [2000] +3-2A77 U+029D # LATIN SMALL LETTER J WITH CROSSED-TAIL [2000] +3-2A78 U+028E # LATIN SMALL LETTER TURNED Y [2000] +3-2A79 U+0261 # LATIN SMALL LETTER SCRIPT G [2000] +3-2A7A U+014B # LATIN SMALL LETTER ENG [2000] +3-2A7B U+0270 # LATIN SMALL LETTER TURNED M WITH LONG LEG [2000] +3-2A7C U+0281 # LATIN LETTER SMALL CAPITAL INVERTED R [2000] +3-2A7D U+0127 # LATIN SMALL LETTER H WITH STROKE [2000] +3-2A7E U+0295 # LATIN LETTER PHARYNGEAL VOICED FRICATIVE [2000] +3-2B21 U+0294 # LATIN LETTER GLOTTAL STOP [2000] +3-2B22 U+0266 # LATIN SMALL LETTER H WITH HOOK [2000] +3-2B23 U+0298 # LATIN LETTER BILABIAL CLICK [2000] +3-2B24 U+01C2 # LATIN LETTER ALVEOLAR CLICK [2000] +3-2B25 U+0253 # LATIN SMALL LETTER B WITH HOOK [2000] +3-2B26 U+0257 # LATIN SMALL LETTER D WITH HOOK [2000] +3-2B27 U+0284 # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK [2000] +3-2B28 U+0260 # LATIN SMALL LETTER G WITH HOOK [2000] +3-2B29 U+0193 # LATIN CAPITAL LETTER G WITH HOOK [2000] +3-2B2A U+0153 # LATIN SMALL LIGATURE OE [2000] +3-2B2B U+0152 # LATIN CAPITAL LIGATURE OE [2000] +3-2B2C U+0268 # LATIN SMALL LETTER I WITH STROKE [2000] +3-2B2D U+0289 # LATIN SMALL LETTER U BAR [2000] +3-2B2E U+0258 # LATIN SMALL LETTER REVERSED E [2000] +3-2B2F U+0275 # LATIN SMALL LETTER BARRED O [2000] +3-2B30 U+0259 # LATIN SMALL LETTER SCHWA [2000] +3-2B31 U+025C # LATIN SMALL LETTER REVERSED OPEN E [2000] +3-2B32 U+025E # LATIN SMALL LETTER CLOSED REVERSED OPEN E [2000] +3-2B33 U+0250 # LATIN SMALL LETTER TURNED A [2000] +3-2B34 U+026F # LATIN SMALL LETTER TURNED M [2000] +3-2B35 U+028A # LATIN SMALL LETTER UPSILON [2000] +3-2B36 U+0264 # LATIN SMALL LETTER RAMS HORN [2000] +3-2B37 U+028C # LATIN SMALL LETTER TURNED V [2000] +3-2B38 U+0254 # LATIN SMALL LETTER OPEN O [2000] +3-2B39 U+0251 # LATIN SMALL LETTER ALPHA [2000] +3-2B3A U+0252 # LATIN SMALL LETTER TURNED ALPHA [2000] +3-2B3B U+028D # LATIN SMALL LETTER TURNED W [2000] +3-2B3C U+0265 # LATIN SMALL LETTER TURNED H [2000] +3-2B3D U+02A2 # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE [2000] +3-2B3E U+02A1 # LATIN LETTER GLOTTAL STOP WITH STROKE [2000] +3-2B3F U+0255 # LATIN SMALL LETTER C WITH CURL [2000] +3-2B40 U+0291 # LATIN SMALL LETTER Z WITH CURL [2000] +3-2B41 U+027A # LATIN SMALL LETTER TURNED R WITH LONG LEG [2000] +3-2B42 U+0267 # LATIN SMALL LETTER HENG WITH HOOK [2000] +3-2B43 U+025A # LATIN SMALL LETTER SCHWA WITH HOOK [2000] +3-2B44 U+00E6+0300 # [2000] Private: U+F76A +3-2B45 U+01FD # LATIN SMALL LETTER AE WITH ACUTE [2000] +3-2B46 U+1F70 # GREEK SMALL LETTER ALPHA WITH VARIA [2000] +3-2B47 U+1F71 # GREEK SMALL LETTER ALPHA WITH OXIA [2000] +3-2B48 U+0254+0300 # [2000] Private: U+F76B +3-2B49 U+0254+0301 # [2000] Private: U+F76C +3-2B4A U+028C+0300 # [2000] Private: U+F76D +3-2B4B U+028C+0301 # [2000] Private: U+F76E +3-2B4C U+0259+0300 # [2000] Private: U+F76F +3-2B4D U+0259+0301 # [2000] Private: U+F770 +3-2B4E U+025A+0300 # [2000] Private: U+F771 +3-2B4F U+025A+0301 # [2000] Private: U+F772 +3-2B50 U+1F72 # GREEK SMALL LETTER EPSILON WITH VARIA [2000] +3-2B51 U+1F73 # GREEK SMALL LETTER EPSILON WITH OXIA [2000] +3-2B52 U+0361 # COMBINING DOUBLE INVERTED BREVE [2000] +3-2B53 U+02C8 # MODIFIER LETTER VERTICAL LINE [2000] +3-2B54 U+02CC # MODIFIER LETTER LOW VERTICAL LINE [2000] +3-2B55 U+02D0 # MODIFIER LETTER TRIANGULAR COLON [2000] +3-2B56 U+02D1 # MODIFIER LETTER HALF TRIANGULAR COLON [2000] +3-2B57 U+0306 # COMBINING BREVE [2000] +3-2B58 U+203F # UNDERTIE [2000] +3-2B59 U+030B # COMBINING DOUBLE ACUTE ACCENT [2000] +3-2B5A U+0301 # COMBINING ACUTE ACCENT [2000] +3-2B5B U+0304 # COMBINING MACRON [2000] +3-2B5C U+0300 # COMBINING GRAVE ACCENT [2000] +3-2B5D U+030F # COMBINING DOUBLE GRAVE ACCENT [2000] +3-2B5E U+030C # COMBINING CARON [2000] +3-2B5F U+0302 # COMBINING CIRCUMFLEX ACCENT [2000] +3-2B60 U+02E5 # MODIFIER LETTER EXTRA-HIGH TONE BAR [2000] +3-2B61 U+02E6 # MODIFIER LETTER HIGH TONE BAR [2000] +3-2B62 U+02E7 # MODIFIER LETTER MID TONE BAR [2000] +3-2B63 U+02E8 # MODIFIER LETTER LOW TONE BAR [2000] +3-2B64 U+02E9 # MODIFIER LETTER EXTRA-LOW TONE BAR [2000] +3-2B65 U+02E9+02E5 # [2000] Private: U+F773 +3-2B66 U+02E5+02E9 # [2000] Private: U+F774 +3-2B67 U+0325 # COMBINING RING BELOW [2000] +3-2B68 U+032C # COMBINING CARON BELOW [2000] +3-2B69 U+0339 # COMBINING RIGHT HALF RING BELOW [2000] +3-2B6A U+031C # COMBINING LEFT HALF RING BELOW [2000] +3-2B6B U+031F # COMBINING PLUS SIGN BELOW [2000] +3-2B6C U+0320 # COMBINING MINUS SIGN BELOW [2000] +3-2B6D U+0308 # COMBINING DIAERESIS [2000] +3-2B6E U+033D # COMBINING X ABOVE [2000] +3-2B6F U+0329 # COMBINING VERTICAL LINE BELOW [2000] +3-2B70 U+032F # COMBINING INVERTED BREVE BELOW [2000] +3-2B71 U+02DE # MODIFIER LETTER RHOTIC HOOK [2000] +3-2B72 U+0324 # COMBINING DIAERESIS BELOW [2000] +3-2B73 U+0330 # COMBINING TILDE BELOW [2000] +3-2B74 U+033C # COMBINING SEAGULL BELOW [2000] +3-2B75 U+0334 # COMBINING TILDE OVERLAY [2000] +3-2B76 U+031D # COMBINING UP TACK BELOW [2000] +3-2B77 U+031E # COMBINING DOWN TACK BELOW [2000] +3-2B78 U+0318 # COMBINING LEFT TACK BELOW [2000] +3-2B79 U+0319 # COMBINING RIGHT TACK BELOW [2000] +3-2B7A U+032A # COMBINING BRIDGE BELOW [2000] +3-2B7B U+033A # COMBINING INVERTED BRIDGE BELOW [2000] +3-2B7C U+033B # COMBINING SQUARE BELOW [2000] +3-2B7D U+0303 # COMBINING TILDE [2000] +3-2B7E U+031A # COMBINING LEFT ANGLE ABOVE [2000] +3-2C21 U+2776 # DINGBAT NEGATIVE CIRCLED DIGIT ONE [2000] +3-2C22 U+2777 # DINGBAT NEGATIVE CIRCLED DIGIT TWO [2000] +3-2C23 U+2778 # DINGBAT NEGATIVE CIRCLED DIGIT THREE [2000] +3-2C24 U+2779 # DINGBAT NEGATIVE CIRCLED DIGIT FOUR [2000] +3-2C25 U+277A # DINGBAT NEGATIVE CIRCLED DIGIT FIVE [2000] +3-2C26 U+277B # DINGBAT NEGATIVE CIRCLED DIGIT SIX [2000] +3-2C27 U+277C # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN [2000] +3-2C28 U+277D # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT [2000] +3-2C29 U+277E # DINGBAT NEGATIVE CIRCLED DIGIT NINE [2000] +3-2C2A U+277F # DINGBAT NEGATIVE CIRCLED NUMBER TEN [2000] +3-2C2B U+24EB # NEGATIVE CIRCLED NUMBER ELEVEN [2000] [Unicode3.2] +3-2C2C U+24EC # NEGATIVE CIRCLED NUMBER TWELVE [2000] [Unicode3.2] +3-2C2D U+24ED # NEGATIVE CIRCLED NUMBER THIRTEEN [2000] [Unicode3.2] +3-2C2E U+24EE # NEGATIVE CIRCLED NUMBER FOURTEEN [2000] [Unicode3.2] +3-2C2F U+24EF # NEGATIVE CIRCLED NUMBER FIFTEEN [2000] [Unicode3.2] +3-2C30 U+24F0 # NEGATIVE CIRCLED NUMBER SIXTEEN [2000] [Unicode3.2] +3-2C31 U+24F1 # NEGATIVE CIRCLED NUMBER SEVENTEEN [2000] [Unicode3.2] +3-2C32 U+24F2 # NEGATIVE CIRCLED NUMBER EIGHTEEN [2000] [Unicode3.2] +3-2C33 U+24F3 # NEGATIVE CIRCLED NUMBER NINETEEN [2000] [Unicode3.2] +3-2C34 U+24F4 # NEGATIVE CIRCLED NUMBER TWENTY [2000] [Unicode3.2] +3-2C35 U+2170 # SMALL ROMAN NUMERAL ONE [2000] +3-2C36 U+2171 # SMALL ROMAN NUMERAL TWO [2000] +3-2C37 U+2172 # SMALL ROMAN NUMERAL THREE [2000] +3-2C38 U+2173 # SMALL ROMAN NUMERAL FOUR [2000] +3-2C39 U+2174 # SMALL ROMAN NUMERAL FIVE [2000] +3-2C3A U+2175 # SMALL ROMAN NUMERAL SIX [2000] +3-2C3B U+2176 # SMALL ROMAN NUMERAL SEVEN [2000] +3-2C3C U+2177 # SMALL ROMAN NUMERAL EIGHT [2000] +3-2C3D U+2178 # SMALL ROMAN NUMERAL NINE [2000] +3-2C3E U+2179 # SMALL ROMAN NUMERAL TEN [2000] +3-2C3F U+217A # SMALL ROMAN NUMERAL ELEVEN [2000] +3-2C40 U+217B # SMALL ROMAN NUMERAL TWELVE [2000] +3-2C41 U+24D0 # CIRCLED LATIN SMALL LETTER A [2000] +3-2C42 U+24D1 # CIRCLED LATIN SMALL LETTER B [2000] +3-2C43 U+24D2 # CIRCLED LATIN SMALL LETTER C [2000] +3-2C44 U+24D3 # CIRCLED LATIN SMALL LETTER D [2000] +3-2C45 U+24D4 # CIRCLED LATIN SMALL LETTER E [2000] +3-2C46 U+24D5 # CIRCLED LATIN SMALL LETTER F [2000] +3-2C47 U+24D6 # CIRCLED LATIN SMALL LETTER G [2000] +3-2C48 U+24D7 # CIRCLED LATIN SMALL LETTER H [2000] +3-2C49 U+24D8 # CIRCLED LATIN SMALL LETTER I [2000] +3-2C4A U+24D9 # CIRCLED LATIN SMALL LETTER J [2000] +3-2C4B U+24DA # CIRCLED LATIN SMALL LETTER K [2000] +3-2C4C U+24DB # CIRCLED LATIN SMALL LETTER L [2000] +3-2C4D U+24DC # CIRCLED LATIN SMALL LETTER M [2000] +3-2C4E U+24DD # CIRCLED LATIN SMALL LETTER N [2000] +3-2C4F U+24DE # CIRCLED LATIN SMALL LETTER O [2000] +3-2C50 U+24DF # CIRCLED LATIN SMALL LETTER P [2000] +3-2C51 U+24E0 # CIRCLED LATIN SMALL LETTER Q [2000] +3-2C52 U+24E1 # CIRCLED LATIN SMALL LETTER R [2000] +3-2C53 U+24E2 # CIRCLED LATIN SMALL LETTER S [2000] +3-2C54 U+24E3 # CIRCLED LATIN SMALL LETTER T [2000] +3-2C55 U+24E4 # CIRCLED LATIN SMALL LETTER U [2000] +3-2C56 U+24E5 # CIRCLED LATIN SMALL LETTER V [2000] +3-2C57 U+24E6 # CIRCLED LATIN SMALL LETTER W [2000] +3-2C58 U+24E7 # CIRCLED LATIN SMALL LETTER X [2000] +3-2C59 U+24E8 # CIRCLED LATIN SMALL LETTER Y [2000] +3-2C5A U+24E9 # CIRCLED LATIN SMALL LETTER Z [2000] +3-2C5B U+32D0 # CIRCLED KATAKANA A [2000] +3-2C5C U+32D1 # CIRCLED KATAKANA I [2000] +3-2C5D U+32D2 # CIRCLED KATAKANA U [2000] +3-2C5E U+32D3 # CIRCLED KATAKANA E [2000] +3-2C5F U+32D4 # CIRCLED KATAKANA O [2000] +3-2C60 U+32D5 # CIRCLED KATAKANA KA [2000] +3-2C61 U+32D6 # CIRCLED KATAKANA KI [2000] +3-2C62 U+32D7 # CIRCLED KATAKANA KU [2000] +3-2C63 U+32D8 # CIRCLED KATAKANA KE [2000] +3-2C64 U+32D9 # CIRCLED KATAKANA KO [2000] +3-2C65 U+32DA # CIRCLED KATAKANA SA [2000] +3-2C66 U+32DB # CIRCLED KATAKANA SI [2000] +3-2C67 U+32DC # CIRCLED KATAKANA SU [2000] +3-2C68 U+32DD # CIRCLED KATAKANA SE [2000] +3-2C69 U+32DE # CIRCLED KATAKANA SO [2000] +3-2C6A U+32DF # CIRCLED KATAKANA TA [2000] +3-2C6B U+32E0 # CIRCLED KATAKANA TI [2000] +3-2C6C U+32E1 # CIRCLED KATAKANA TU [2000] +3-2C6D U+32E2 # CIRCLED KATAKANA TE [2000] +3-2C6E U+32E3 # CIRCLED KATAKANA TO [2000] +3-2C6F U+32FA # CIRCLED KATAKANA RO [2000] +3-2C70 U+32E9 # CIRCLED KATAKANA HA [2000] +3-2C71 U+32E5 # CIRCLED KATAKANA NI [2000] +3-2C72 U+32ED # CIRCLED KATAKANA HO [2000] +3-2C73 U+32EC # CIRCLED KATAKANA HE [2000] +3-2C74 # +3-2C75 # +3-2C76 # +3-2C77 # +3-2C78 # +3-2C79 # +3-2C7A # +3-2C7B # +3-2C7C # +3-2C7D U+2051 # TWO ASTERISKS ALIGNED VERTICALLY [2000] [Unicode3.2] +3-2C7E U+2042 # ASTERISM [2000] +3-2D21 U+2460 # CIRCLED DIGIT ONE [2000] +3-2D22 U+2461 # CIRCLED DIGIT TWO [2000] +3-2D23 U+2462 # CIRCLED DIGIT THREE [2000] +3-2D24 U+2463 # CIRCLED DIGIT FOUR [2000] +3-2D25 U+2464 # CIRCLED DIGIT FIVE [2000] +3-2D26 U+2465 # CIRCLED DIGIT SIX [2000] +3-2D27 U+2466 # CIRCLED DIGIT SEVEN [2000] +3-2D28 U+2467 # CIRCLED DIGIT EIGHT [2000] +3-2D29 U+2468 # CIRCLED DIGIT NINE [2000] +3-2D2A U+2469 # CIRCLED NUMBER TEN [2000] +3-2D2B U+246A # CIRCLED NUMBER ELEVEN [2000] +3-2D2C U+246B # CIRCLED NUMBER TWELVE [2000] +3-2D2D U+246C # CIRCLED NUMBER THIRTEEN [2000] +3-2D2E U+246D # CIRCLED NUMBER FOURTEEN [2000] +3-2D2F U+246E # CIRCLED NUMBER FIFTEEN [2000] +3-2D30 U+246F # CIRCLED NUMBER SIXTEEN [2000] +3-2D31 U+2470 # CIRCLED NUMBER SEVENTEEN [2000] +3-2D32 U+2471 # CIRCLED NUMBER EIGHTEEN [2000] +3-2D33 U+2472 # CIRCLED NUMBER NINETEEN [2000] +3-2D34 U+2473 # CIRCLED NUMBER TWENTY [2000] +3-2D35 U+2160 # ROMAN NUMERAL ONE [2000] +3-2D36 U+2161 # ROMAN NUMERAL TWO [2000] +3-2D37 U+2162 # ROMAN NUMERAL THREE [2000] +3-2D38 U+2163 # ROMAN NUMERAL FOUR [2000] +3-2D39 U+2164 # ROMAN NUMERAL FIVE [2000] +3-2D3A U+2165 # ROMAN NUMERAL SIX [2000] +3-2D3B U+2166 # ROMAN NUMERAL SEVEN [2000] +3-2D3C U+2167 # ROMAN NUMERAL EIGHT [2000] +3-2D3D U+2168 # ROMAN NUMERAL NINE [2000] +3-2D3E U+2169 # ROMAN NUMERAL TEN [2000] +3-2D3F U+216A # ROMAN NUMERAL ELEVEN [2000] +3-2D40 U+3349 # SQUARE MIRI [2000] +3-2D41 U+3314 # SQUARE KIRO [2000] +3-2D42 U+3322 # SQUARE SENTI [2000] +3-2D43 U+334D # SQUARE MEETORU [2000] +3-2D44 U+3318 # SQUARE GURAMU [2000] +3-2D45 U+3327 # SQUARE TON [2000] +3-2D46 U+3303 # SQUARE AARU [2000] +3-2D47 U+3336 # SQUARE HEKUTAARU [2000] +3-2D48 U+3351 # SQUARE RITTORU [2000] +3-2D49 U+3357 # SQUARE WATTO [2000] +3-2D4A U+330D # SQUARE KARORII [2000] +3-2D4B U+3326 # SQUARE DORU [2000] +3-2D4C U+3323 # SQUARE SENTO [2000] +3-2D4D U+332B # SQUARE PAASENTO [2000] +3-2D4E U+334A # SQUARE MIRIBAARU [2000] +3-2D4F U+333B # SQUARE PEEZI [2000] +3-2D50 U+339C # SQUARE MM [2000] +3-2D51 U+339D # SQUARE CM [2000] +3-2D52 U+339E # SQUARE KM [2000] +3-2D53 U+338E # SQUARE MG [2000] +3-2D54 U+338F # SQUARE KG [2000] +3-2D55 U+33C4 # SQUARE CC [2000] +3-2D56 U+33A1 # SQUARE M SQUARED [2000] +3-2D57 U+216B # ROMAN NUMERAL TWELVE [2000] +3-2D58 # +3-2D59 # +3-2D5A # +3-2D5B # +3-2D5C # +3-2D5D # +3-2D5E # +3-2D5F U+337B # SQUARE ERA NAME HEISEI [2000] +3-2D60 U+301D # REVERSED DOUBLE PRIME QUOTATION MARK [2000] +3-2D61 U+301F # LOW DOUBLE PRIME QUOTATION MARK [2000] +3-2D62 U+2116 # NUMERO SIGN [2000] +3-2D63 U+33CD # SQUARE KK [2000] +3-2D64 U+2121 # TELEPHONE SIGN [2000] +3-2D65 U+32A4 # CIRCLED IDEOGRAPH HIGH [2000] +3-2D66 U+32A5 # CIRCLED IDEOGRAPH CENTRE [2000] +3-2D67 U+32A6 # CIRCLED IDEOGRAPH LOW [2000] +3-2D68 U+32A7 # CIRCLED IDEOGRAPH LEFT [2000] +3-2D69 U+32A8 # CIRCLED IDEOGRAPH RIGHT [2000] +3-2D6A U+3231 # PARENTHESIZED IDEOGRAPH STOCK [2000] +3-2D6B U+3232 # PARENTHESIZED IDEOGRAPH HAVE [2000] +3-2D6C U+3239 # PARENTHESIZED IDEOGRAPH REPRESENT [2000] +3-2D6D U+337E # SQUARE ERA NAME MEIZI [2000] +3-2D6E U+337D # SQUARE ERA NAME TAISYOU [2000] +3-2D6F U+337C # SQUARE ERA NAME SYOUWA [2000] +3-2D70 # Windows: U+2252 +3-2D71 # Windows: U+2261 +3-2D72 # Windows: U+222B +3-2D73 U+222E # CONTOUR INTEGRAL [2000] +3-2D74 # Windows: U+2211 +3-2D75 # Windows: U+221A +3-2D76 # Windows: U+22A5 +3-2D77 # Windows: U+2220 +3-2D78 U+221F # RIGHT ANGLE [2000] +3-2D79 U+22BF # RIGHT TRIANGLE [2000] +3-2D7A # Windows: U+2235 +3-2D7B # Windows: U+2229 +3-2D7C # Windows: U+222A +3-2D7D U+2756 # BLACK DIAMOND MINUS WHITE X [2000] +3-2D7E U+261E # WHITE RIGHT POINTING INDEX [2000] +3-2E21 U+4FF1 # [2004] +3-2E22 U+2000B # [2000] [Unicode3.1] Private: U+F780 +3-2E23 U+3402 # [2000] +3-2E24 U+4E28 # [2000] +3-2E25 U+4E2F # [2000] +3-2E26 U+4E30 # [2000] +3-2E27 U+4E8D # [2000] +3-2E28 U+4EE1 # [2000] +3-2E29 U+4EFD # [2000] +3-2E2A U+4EFF # [2000] +3-2E2B U+4F03 # [2000] +3-2E2C U+4F0B # [2000] +3-2E2D U+4F60 # [2000] +3-2E2E U+4F48 # [2000] +3-2E2F U+4F49 # [2000] +3-2E30 U+4F56 # [2000] +3-2E31 U+4F5F # [2000] +3-2E32 U+4F6A # [2000] +3-2E33 U+4F6C # [2000] +3-2E34 U+4F7E # [2000] +3-2E35 U+4F8A # [2000] +3-2E36 U+4F94 # [2000] +3-2E37 U+4F97 # [2000] +3-2E38 U+FA30 # CJK COMPATIBILITY IDEOGRAPH-FA30 [2000] [Unicode3.2] +3-2E39 U+4FC9 # [2000] +3-2E3A U+4FE0 # [2000] +3-2E3B U+5001 # [2000] +3-2E3C U+5002 # [2000] +3-2E3D U+500E # [2000] +3-2E3E U+5018 # [2000] +3-2E3F U+5027 # [2000] +3-2E40 U+502E # [2000] +3-2E41 U+5040 # [2000] +3-2E42 U+503B # [2000] +3-2E43 U+5041 # [2000] +3-2E44 U+5094 # [2000] +3-2E45 U+50CC # [2000] +3-2E46 U+50F2 # [2000] +3-2E47 U+50D0 # [2000] +3-2E48 U+50E6 # [2000] +3-2E49 U+FA31 # CJK COMPATIBILITY IDEOGRAPH-FA31 [2000] [Unicode3.2] +3-2E4A U+5106 # [2000] +3-2E4B U+5103 # [2000] +3-2E4C U+510B # [2000] +3-2E4D U+511E # [2000] +3-2E4E U+5135 # [2000] +3-2E4F U+514A # [2000] +3-2E50 U+FA32 # CJK COMPATIBILITY IDEOGRAPH-FA32 [2000] [Unicode3.2] +3-2E51 U+5155 # [2000] +3-2E52 U+5157 # [2000] +3-2E53 U+34B5 # [2000] +3-2E54 U+519D # [2000] +3-2E55 U+51C3 # [2000] +3-2E56 U+51CA # [2000] +3-2E57 U+51DE # [2000] +3-2E58 U+51E2 # [2000] +3-2E59 U+51EE # [2000] +3-2E5A U+5201 # [2000] +3-2E5B U+34DB # [2000] +3-2E5C U+5213 # [2000] +3-2E5D U+5215 # [2000] +3-2E5E U+5249 # [2000] +3-2E5F U+5257 # [2000] +3-2E60 U+5261 # [2000] +3-2E61 U+5293 # [2000] +3-2E62 U+52C8 # [2000] +3-2E63 U+FA33 # CJK COMPATIBILITY IDEOGRAPH-FA33 [2000] [Unicode3.2] +3-2E64 U+52CC # [2000] +3-2E65 U+52D0 # [2000] +3-2E66 U+52D6 # [2000] +3-2E67 U+52DB # [2000] +3-2E68 U+FA34 # CJK COMPATIBILITY IDEOGRAPH-FA34 [2000] [Unicode3.2] +3-2E69 U+52F0 # [2000] +3-2E6A U+52FB # [2000] +3-2E6B U+5300 # [2000] +3-2E6C U+5307 # [2000] +3-2E6D U+531C # [2000] +3-2E6E U+FA35 # CJK COMPATIBILITY IDEOGRAPH-FA35 [2000] [Unicode3.2] +3-2E6F U+5361 # [2000] +3-2E70 U+5363 # [2000] +3-2E71 U+537D # [2000] +3-2E72 U+5393 # [2000] +3-2E73 U+539D # [2000] +3-2E74 U+53B2 # [2000] +3-2E75 U+5412 # [2000] +3-2E76 U+5427 # [2000] +3-2E77 U+544D # [2000] +3-2E78 U+549C # [2000] +3-2E79 U+546B # [2000] +3-2E7A U+5474 # [2000] +3-2E7B U+547F # [2000] +3-2E7C U+5488 # [2000] +3-2E7D U+5496 # [2000] +3-2E7E U+54A1 # [2000] +3-2F21 U+54A9 # [2000] +3-2F22 U+54C6 # [2000] +3-2F23 U+54FF # [2000] +3-2F24 U+550E # [2000] +3-2F25 U+552B # [2000] +3-2F26 U+5535 # [2000] +3-2F27 U+5550 # [2000] +3-2F28 U+555E # [2000] +3-2F29 U+5581 # [2000] +3-2F2A U+5586 # [2000] +3-2F2B U+558E # [2000] +3-2F2C U+FA36 # CJK COMPATIBILITY IDEOGRAPH-FA36 [2000] [Unicode3.2] +3-2F2D U+55AD # [2000] +3-2F2E U+55CE # [2000] +3-2F2F U+FA37 # CJK COMPATIBILITY IDEOGRAPH-FA37 [2000] [Unicode3.2] +3-2F30 U+5608 # [2000] +3-2F31 U+560E # [2000] +3-2F32 U+563B # [2000] +3-2F33 U+5649 # [2000] +3-2F34 U+5676 # [2000] +3-2F35 U+5666 # [2000] +3-2F36 U+FA38 # CJK COMPATIBILITY IDEOGRAPH-FA38 [2000] [Unicode3.2] +3-2F37 U+566F # [2000] +3-2F38 U+5671 # [2000] +3-2F39 U+5672 # [2000] +3-2F3A U+5699 # [2000] +3-2F3B U+569E # [2000] +3-2F3C U+56A9 # [2000] +3-2F3D U+56AC # [2000] +3-2F3E U+56B3 # [2000] +3-2F3F U+56C9 # [2000] +3-2F40 U+56CA # [2000] +3-2F41 U+570A # [2000] +3-2F42 U+2123D # [2000] [Unicode3.1] Private: U+F78A +3-2F43 U+5721 # [2000] +3-2F44 U+572F # [2000] +3-2F45 U+5733 # [2000] +3-2F46 U+5734 # [2000] +3-2F47 U+5770 # [2000] +3-2F48 U+5777 # [2000] +3-2F49 U+577C # [2000] +3-2F4A U+579C # [2000] +3-2F4B U+FA0F # CJK COMPATIBILITY IDEOGRAPH-FA0F [2000] +3-2F4C U+2131B # [2000] [Unicode3.1] Private: U+F78B +3-2F4D U+57B8 # [2000] +3-2F4E U+57C7 # [2000] +3-2F4F U+57C8 # [2000] +3-2F50 U+57CF # [2000] +3-2F51 U+57E4 # [2000] +3-2F52 U+57ED # [2000] +3-2F53 U+57F5 # [2000] +3-2F54 U+57F6 # [2000] +3-2F55 U+57FF # [2000] +3-2F56 U+5809 # [2000] +3-2F57 U+FA10 # CJK COMPATIBILITY IDEOGRAPH-FA10 [2000] +3-2F58 U+5861 # [2000] +3-2F59 U+5864 # [2000] +3-2F5A U+FA39 # CJK COMPATIBILITY IDEOGRAPH-FA39 [2000] [Unicode3.2] +3-2F5B U+587C # [2000] +3-2F5C U+5889 # [2000] +3-2F5D U+589E # [2000] +3-2F5E U+FA3A # CJK COMPATIBILITY IDEOGRAPH-FA3A [2000] [Unicode3.2] +3-2F5F U+58A9 # [2000] +3-2F60 U+2146E # [2000] [Unicode3.1] Private: U+F78E +3-2F61 U+58D2 # [2000] +3-2F62 U+58CE # [2000] +3-2F63 U+58D4 # [2000] +3-2F64 U+58DA # [2000] +3-2F65 U+58E0 # [2000] +3-2F66 U+58E9 # [2000] +3-2F67 U+590C # [2000] +3-2F68 U+8641 # [2000] +3-2F69 U+595D # [2000] +3-2F6A U+596D # [2000] +3-2F6B U+598B # [2000] +3-2F6C U+5992 # [2000] +3-2F6D U+59A4 # [2000] +3-2F6E U+59C3 # [2000] +3-2F6F U+59D2 # [2000] +3-2F70 U+59DD # [2000] +3-2F71 U+5A13 # [2000] +3-2F72 U+5A23 # [2000] +3-2F73 U+5A67 # [2000] +3-2F74 U+5A6D # [2000] +3-2F75 U+5A77 # [2000] +3-2F76 U+5A7E # [2000] +3-2F77 U+5A84 # [2000] +3-2F78 U+5A9E # [2000] +3-2F79 U+5AA7 # [2000] +3-2F7A U+5AC4 # [2000] +3-2F7B U+218BD # [2000] [Unicode3.1] Private: U+F78F +3-2F7C U+5B19 # [2000] +3-2F7D U+5B25 # [2000] +3-2F7E U+525D # [2004] +3-3021 U+4E9C # +3-3022 U+5516 # +3-3023 U+5A03 # +3-3024 U+963F # +3-3025 U+54C0 # +3-3026 U+611B # +3-3027 U+6328 # +3-3028 U+59F6 # +3-3029 U+9022 # +3-302A U+8475 # +3-302B U+831C # +3-302C U+7A50 # +3-302D U+60AA # +3-302E U+63E1 # +3-302F U+6E25 # +3-3030 U+65ED # +3-3031 U+8466 # +3-3032 U+82A6 # +3-3033 U+9BF5 # +3-3034 U+6893 # +3-3035 U+5727 # +3-3036 U+65A1 # +3-3037 U+6271 # +3-3038 U+5B9B # +3-3039 U+59D0 # +3-303A U+867B # +3-303B U+98F4 # +3-303C U+7D62 # +3-303D U+7DBE # +3-303E U+9B8E # +3-303F U+6216 # +3-3040 U+7C9F # +3-3041 U+88B7 # +3-3042 U+5B89 # +3-3043 U+5EB5 # +3-3044 U+6309 # +3-3045 U+6697 # +3-3046 U+6848 # +3-3047 U+95C7 # +3-3048 U+978D # +3-3049 U+674F # +3-304A U+4EE5 # +3-304B U+4F0A # +3-304C U+4F4D # +3-304D U+4F9D # +3-304E U+5049 # +3-304F U+56F2 # +3-3050 U+5937 # +3-3051 U+59D4 # +3-3052 U+5A01 # +3-3053 U+5C09 # +3-3054 U+60DF # +3-3055 U+610F # +3-3056 U+6170 # +3-3057 U+6613 # +3-3058 U+6905 # +3-3059 U+70BA # +3-305A U+754F # +3-305B U+7570 # +3-305C U+79FB # +3-305D U+7DAD # +3-305E U+7DEF # +3-305F U+80C3 # +3-3060 U+840E # +3-3061 U+8863 # +3-3062 U+8B02 # +3-3063 U+9055 # +3-3064 U+907A # +3-3065 U+533B # +3-3066 U+4E95 # +3-3067 U+4EA5 # +3-3068 U+57DF # +3-3069 U+80B2 # +3-306A U+90C1 # +3-306B U+78EF # +3-306C U+4E00 # +3-306D U+58F1 # +3-306E U+6EA2 # +3-306F U+9038 # +3-3070 U+7A32 # +3-3071 U+8328 # +3-3072 U+828B # +3-3073 U+9C2F # +3-3074 U+5141 # +3-3075 U+5370 # +3-3076 U+54BD # +3-3077 U+54E1 # +3-3078 U+56E0 # +3-3079 U+59FB # +3-307A U+5F15 # +3-307B U+98F2 # +3-307C U+6DEB # +3-307D U+80E4 # +3-307E U+852D # +3-3121 U+9662 # +3-3122 U+9670 # +3-3123 U+96A0 # +3-3124 U+97FB # +3-3125 U+540B # +3-3126 U+53F3 # +3-3127 U+5B87 # +3-3128 U+70CF # +3-3129 U+7FBD # +3-312A U+8FC2 # +3-312B U+96E8 # +3-312C U+536F # +3-312D U+9D5C # +3-312E U+7ABA # +3-312F U+4E11 # +3-3130 U+7893 # +3-3131 U+81FC # +3-3132 U+6E26 # +3-3133 U+5618 # +3-3134 U+5504 # +3-3135 U+6B1D # +3-3136 U+851A # +3-3137 U+9C3B # +3-3138 U+59E5 # +3-3139 U+53A9 # +3-313A U+6D66 # +3-313B U+74DC # +3-313C U+958F # +3-313D U+5642 # +3-313E U+4E91 # +3-313F U+904B # +3-3140 U+96F2 # +3-3141 U+834F # +3-3142 U+990C # +3-3143 U+53E1 # +3-3144 U+55B6 # +3-3145 U+5B30 # +3-3146 U+5F71 # +3-3147 U+6620 # +3-3148 U+66F3 # +3-3149 U+6804 # +3-314A U+6C38 # +3-314B U+6CF3 # +3-314C U+6D29 # +3-314D U+745B # +3-314E U+76C8 # +3-314F U+7A4E # +3-3150 U+9834 # +3-3151 U+82F1 # +3-3152 U+885B # +3-3153 U+8A60 # +3-3154 U+92ED # +3-3155 U+6DB2 # +3-3156 U+75AB # +3-3157 U+76CA # +3-3158 U+99C5 # +3-3159 U+60A6 # +3-315A U+8B01 # +3-315B U+8D8A # +3-315C U+95B2 # +3-315D U+698E # +3-315E U+53AD # +3-315F U+5186 # +3-3160 U+5712 # +3-3161 U+5830 # +3-3162 U+5944 # +3-3163 U+5BB4 # +3-3164 U+5EF6 # +3-3165 U+6028 # +3-3166 U+63A9 # +3-3167 U+63F4 # +3-3168 U+6CBF # +3-3169 U+6F14 # +3-316A U+708E # +3-316B U+7114 # +3-316C U+7159 # +3-316D U+71D5 # +3-316E U+733F # +3-316F U+7E01 # +3-3170 U+8276 # +3-3171 U+82D1 # +3-3172 U+8597 # +3-3173 U+9060 # +3-3174 U+925B # +3-3175 U+9D1B # +3-3176 U+5869 # +3-3177 U+65BC # +3-3178 U+6C5A # +3-3179 U+7525 # +3-317A U+51F9 # +3-317B U+592E # +3-317C U+5965 # +3-317D U+5F80 # +3-317E U+5FDC # +3-3221 U+62BC # +3-3222 U+65FA # +3-3223 U+6A2A # +3-3224 U+6B27 # +3-3225 U+6BB4 # +3-3226 U+738B # +3-3227 U+7FC1 # +3-3228 U+8956 # +3-3229 U+9D2C # +3-322A U+9D0E # +3-322B U+9EC4 # +3-322C U+5CA1 # +3-322D U+6C96 # +3-322E U+837B # +3-322F U+5104 # +3-3230 U+5C4B # +3-3231 U+61B6 # +3-3232 U+81C6 # +3-3233 U+6876 # +3-3234 U+7261 # +3-3235 U+4E59 # +3-3236 U+4FFA # +3-3237 U+5378 # +3-3238 U+6069 # +3-3239 U+6E29 # +3-323A U+7A4F # +3-323B U+97F3 # +3-323C U+4E0B # +3-323D U+5316 # +3-323E U+4EEE # +3-323F U+4F55 # +3-3240 U+4F3D # +3-3241 U+4FA1 # +3-3242 U+4F73 # +3-3243 U+52A0 # +3-3244 U+53EF # +3-3245 U+5609 # +3-3246 U+590F # +3-3247 U+5AC1 # +3-3248 U+5BB6 # +3-3249 U+5BE1 # +3-324A U+79D1 # +3-324B U+6687 # +3-324C U+679C # +3-324D U+67B6 # +3-324E U+6B4C # +3-324F U+6CB3 # +3-3250 U+706B # +3-3251 U+73C2 # +3-3252 U+798D # +3-3253 U+79BE # +3-3254 U+7A3C # +3-3255 U+7B87 # +3-3256 U+82B1 # +3-3257 U+82DB # +3-3258 U+8304 # +3-3259 U+8377 # +3-325A U+83EF # +3-325B U+83D3 # +3-325C U+8766 # +3-325D U+8AB2 # +3-325E U+5629 # +3-325F U+8CA8 # +3-3260 U+8FE6 # +3-3261 U+904E # +3-3262 U+971E # +3-3263 U+868A # +3-3264 U+4FC4 # +3-3265 U+5CE8 # +3-3266 U+6211 # +3-3267 U+7259 # +3-3268 U+753B # +3-3269 U+81E5 # +3-326A U+82BD # +3-326B U+86FE # +3-326C U+8CC0 # +3-326D U+96C5 # +3-326E U+9913 # +3-326F U+99D5 # +3-3270 U+4ECB # +3-3271 U+4F1A # +3-3272 U+89E3 # +3-3273 U+56DE # +3-3274 U+584A # +3-3275 U+58CA # +3-3276 U+5EFB # +3-3277 U+5FEB # +3-3278 U+602A # +3-3279 U+6094 # +3-327A U+6062 # +3-327B U+61D0 # +3-327C U+6212 # +3-327D U+62D0 # +3-327E U+6539 # +3-3321 U+9B41 # +3-3322 U+6666 # +3-3323 U+68B0 # +3-3324 U+6D77 # +3-3325 U+7070 # +3-3326 U+754C # +3-3327 U+7686 # +3-3328 U+7D75 # +3-3329 U+82A5 # +3-332A U+87F9 # +3-332B U+958B # +3-332C U+968E # +3-332D U+8C9D # +3-332E U+51F1 # +3-332F U+52BE # +3-3330 U+5916 # +3-3331 U+54B3 # +3-3332 U+5BB3 # +3-3333 U+5D16 # +3-3334 U+6168 # +3-3335 U+6982 # +3-3336 U+6DAF # +3-3337 U+788D # +3-3338 U+84CB # +3-3339 U+8857 # +3-333A U+8A72 # +3-333B U+93A7 # +3-333C U+9AB8 # +3-333D U+6D6C # +3-333E U+99A8 # +3-333F U+86D9 # +3-3340 U+57A3 # +3-3341 U+67FF # +3-3342 U+86CE # +3-3343 U+920E # +3-3344 U+5283 # +3-3345 U+5687 # +3-3346 U+5404 # +3-3347 U+5ED3 # +3-3348 U+62E1 # +3-3349 U+64B9 # +3-334A U+683C # +3-334B U+6838 # +3-334C U+6BBB # +3-334D U+7372 # +3-334E U+78BA # +3-334F U+7A6B # +3-3350 U+899A # +3-3351 U+89D2 # +3-3352 U+8D6B # +3-3353 U+8F03 # +3-3354 U+90ED # +3-3355 U+95A3 # +3-3356 U+9694 # +3-3357 U+9769 # +3-3358 U+5B66 # +3-3359 U+5CB3 # +3-335A U+697D # +3-335B U+984D # +3-335C U+984E # +3-335D U+639B # +3-335E U+7B20 # +3-335F U+6A2B # +3-3360 U+6A7F # +3-3361 U+68B6 # +3-3362 U+9C0D # +3-3363 U+6F5F # +3-3364 U+5272 # +3-3365 U+559D # +3-3366 U+6070 # +3-3367 U+62EC # +3-3368 U+6D3B # +3-3369 U+6E07 # +3-336A U+6ED1 # +3-336B U+845B # +3-336C U+8910 # +3-336D U+8F44 # +3-336E U+4E14 # +3-336F U+9C39 # +3-3370 U+53F6 # +3-3371 U+691B # +3-3372 U+6A3A # +3-3373 U+9784 # +3-3374 U+682A # +3-3375 U+515C # +3-3376 U+7AC3 # +3-3377 U+84B2 # +3-3378 U+91DC # +3-3379 U+938C # +3-337A U+565B # +3-337B U+9D28 # +3-337C U+6822 # +3-337D U+8305 # +3-337E U+8431 # +3-3421 U+7CA5 # +3-3422 U+5208 # +3-3423 U+82C5 # +3-3424 U+74E6 # +3-3425 U+4E7E # +3-3426 U+4F83 # +3-3427 U+51A0 # +3-3428 U+5BD2 # +3-3429 U+520A # +3-342A U+52D8 # +3-342B U+52E7 # +3-342C U+5DFB # +3-342D U+559A # +3-342E U+582A # +3-342F U+59E6 # +3-3430 U+5B8C # +3-3431 U+5B98 # +3-3432 U+5BDB # +3-3433 U+5E72 # +3-3434 U+5E79 # +3-3435 U+60A3 # +3-3436 U+611F # +3-3437 U+6163 # +3-3438 U+61BE # +3-3439 U+63DB # +3-343A U+6562 # +3-343B U+67D1 # +3-343C U+6853 # +3-343D U+68FA # +3-343E U+6B3E # +3-343F U+6B53 # +3-3440 U+6C57 # +3-3441 U+6F22 # +3-3442 U+6F97 # +3-3443 U+6F45 # +3-3444 U+74B0 # +3-3445 U+7518 # +3-3446 U+76E3 # +3-3447 U+770B # +3-3448 U+7AFF # +3-3449 U+7BA1 # +3-344A U+7C21 # +3-344B U+7DE9 # +3-344C U+7F36 # +3-344D U+7FF0 # +3-344E U+809D # +3-344F U+8266 # +3-3450 U+839E # +3-3451 U+89B3 # +3-3452 U+8ACC # +3-3453 U+8CAB # +3-3454 U+9084 # +3-3455 U+9451 # +3-3456 U+9593 # +3-3457 U+9591 # +3-3458 U+95A2 # +3-3459 U+9665 # +3-345A U+97D3 # +3-345B U+9928 # +3-345C U+8218 # +3-345D U+4E38 # +3-345E U+542B # +3-345F U+5CB8 # +3-3460 U+5DCC # +3-3461 U+73A9 # +3-3462 U+764C # +3-3463 U+773C # +3-3464 U+5CA9 # +3-3465 U+7FEB # +3-3466 U+8D0B # +3-3467 U+96C1 # +3-3468 U+9811 # +3-3469 U+9854 # +3-346A U+9858 # +3-346B U+4F01 # +3-346C U+4F0E # +3-346D U+5371 # +3-346E U+559C # +3-346F U+5668 # +3-3470 U+57FA # +3-3471 U+5947 # +3-3472 U+5B09 # +3-3473 U+5BC4 # +3-3474 U+5C90 # +3-3475 U+5E0C # +3-3476 U+5E7E # +3-3477 U+5FCC # +3-3478 U+63EE # +3-3479 U+673A # +3-347A U+65D7 # +3-347B U+65E2 # +3-347C U+671F # +3-347D U+68CB # +3-347E U+68C4 # +3-3521 U+6A5F # +3-3522 U+5E30 # +3-3523 U+6BC5 # +3-3524 U+6C17 # +3-3525 U+6C7D # +3-3526 U+757F # +3-3527 U+7948 # +3-3528 U+5B63 # +3-3529 U+7A00 # +3-352A U+7D00 # +3-352B U+5FBD # +3-352C U+898F # +3-352D U+8A18 # +3-352E U+8CB4 # +3-352F U+8D77 # +3-3530 U+8ECC # +3-3531 U+8F1D # +3-3532 U+98E2 # +3-3533 U+9A0E # +3-3534 U+9B3C # +3-3535 U+4E80 # +3-3536 U+507D # +3-3537 U+5100 # +3-3538 U+5993 # +3-3539 U+5B9C # +3-353A U+622F # +3-353B U+6280 # +3-353C U+64EC # +3-353D U+6B3A # +3-353E U+72A0 # +3-353F U+7591 # +3-3540 U+7947 # +3-3541 U+7FA9 # +3-3542 U+87FB # +3-3543 U+8ABC # +3-3544 U+8B70 # +3-3545 U+63AC # +3-3546 U+83CA # +3-3547 U+97A0 # +3-3548 U+5409 # +3-3549 U+5403 # +3-354A U+55AB # +3-354B U+6854 # +3-354C U+6A58 # +3-354D U+8A70 # +3-354E U+7827 # +3-354F U+6775 # +3-3550 U+9ECD # +3-3551 U+5374 # +3-3552 U+5BA2 # +3-3553 U+811A # +3-3554 U+8650 # +3-3555 U+9006 # +3-3556 U+4E18 # +3-3557 U+4E45 # +3-3558 U+4EC7 # +3-3559 U+4F11 # +3-355A U+53CA # +3-355B U+5438 # +3-355C U+5BAE # +3-355D U+5F13 # +3-355E U+6025 # +3-355F U+6551 # +3-3560 U+673D # +3-3561 U+6C42 # +3-3562 U+6C72 # +3-3563 U+6CE3 # +3-3564 U+7078 # +3-3565 U+7403 # +3-3566 U+7A76 # +3-3567 U+7AAE # +3-3568 U+7B08 # +3-3569 U+7D1A # +3-356A U+7CFE # +3-356B U+7D66 # +3-356C U+65E7 # +3-356D U+725B # +3-356E U+53BB # +3-356F U+5C45 # +3-3570 U+5DE8 # +3-3571 U+62D2 # +3-3572 U+62E0 # +3-3573 U+6319 # +3-3574 U+6E20 # +3-3575 U+865A # +3-3576 U+8A31 # +3-3577 U+8DDD # +3-3578 U+92F8 # +3-3579 U+6F01 # +3-357A U+79A6 # +3-357B U+9B5A # +3-357C U+4EA8 # +3-357D U+4EAB # +3-357E U+4EAC # +3-3621 U+4F9B # +3-3622 U+4FA0 # +3-3623 U+50D1 # +3-3624 U+5147 # +3-3625 U+7AF6 # +3-3626 U+5171 # +3-3627 U+51F6 # +3-3628 U+5354 # +3-3629 U+5321 # +3-362A U+537F # +3-362B U+53EB # +3-362C U+55AC # +3-362D U+5883 # +3-362E U+5CE1 # +3-362F U+5F37 # +3-3630 U+5F4A # +3-3631 U+602F # +3-3632 U+6050 # +3-3633 U+606D # +3-3634 U+631F # +3-3635 U+6559 # +3-3636 U+6A4B # +3-3637 U+6CC1 # +3-3638 U+72C2 # +3-3639 U+72ED # +3-363A U+77EF # +3-363B U+80F8 # +3-363C U+8105 # +3-363D U+8208 # +3-363E U+854E # +3-363F U+90F7 # +3-3640 U+93E1 # +3-3641 U+97FF # +3-3642 U+9957 # +3-3643 U+9A5A # +3-3644 U+4EF0 # +3-3645 U+51DD # +3-3646 U+5C2D # +3-3647 U+6681 # +3-3648 U+696D # +3-3649 U+5C40 # +3-364A U+66F2 # +3-364B U+6975 # +3-364C U+7389 # +3-364D U+6850 # +3-364E U+7C81 # +3-364F U+50C5 # +3-3650 U+52E4 # +3-3651 U+5747 # +3-3652 U+5DFE # +3-3653 U+9326 # +3-3654 U+65A4 # +3-3655 U+6B23 # +3-3656 U+6B3D # +3-3657 U+7434 # +3-3658 U+7981 # +3-3659 U+79BD # +3-365A U+7B4B # +3-365B U+7DCA # +3-365C U+82B9 # +3-365D U+83CC # +3-365E U+887F # +3-365F U+895F # +3-3660 U+8B39 # +3-3661 U+8FD1 # +3-3662 U+91D1 # +3-3663 U+541F # +3-3664 U+9280 # +3-3665 U+4E5D # +3-3666 U+5036 # +3-3667 U+53E5 # +3-3668 U+533A # +3-3669 U+72D7 # +3-366A U+7396 # +3-366B U+77E9 # +3-366C U+82E6 # +3-366D U+8EAF # +3-366E U+99C6 # +3-366F U+99C8 # +3-3670 U+99D2 # +3-3671 U+5177 # +3-3672 U+611A # +3-3673 U+865E # +3-3674 U+55B0 # +3-3675 U+7A7A # +3-3676 U+5076 # +3-3677 U+5BD3 # +3-3678 U+9047 # +3-3679 U+9685 # +3-367A U+4E32 # +3-367B U+6ADB # +3-367C U+91E7 # +3-367D U+5C51 # +3-367E U+5C48 # +3-3721 U+6398 # +3-3722 U+7A9F # +3-3723 U+6C93 # +3-3724 U+9774 # +3-3725 U+8F61 # +3-3726 U+7AAA # +3-3727 U+718A # +3-3728 U+9688 # +3-3729 U+7C82 # +3-372A U+6817 # +3-372B U+7E70 # +3-372C U+6851 # +3-372D U+936C # +3-372E U+52F2 # +3-372F U+541B # +3-3730 U+85AB # +3-3731 U+8A13 # +3-3732 U+7FA4 # +3-3733 U+8ECD # +3-3734 U+90E1 # +3-3735 U+5366 # +3-3736 U+8888 # +3-3737 U+7941 # +3-3738 U+4FC2 # +3-3739 U+50BE # +3-373A U+5211 # +3-373B U+5144 # +3-373C U+5553 # +3-373D U+572D # +3-373E U+73EA # +3-373F U+578B # +3-3740 U+5951 # +3-3741 U+5F62 # +3-3742 U+5F84 # +3-3743 U+6075 # +3-3744 U+6176 # +3-3745 U+6167 # +3-3746 U+61A9 # +3-3747 U+63B2 # +3-3748 U+643A # +3-3749 U+656C # +3-374A U+666F # +3-374B U+6842 # +3-374C U+6E13 # +3-374D U+7566 # +3-374E U+7A3D # +3-374F U+7CFB # +3-3750 U+7D4C # +3-3751 U+7D99 # +3-3752 U+7E4B # +3-3753 U+7F6B # +3-3754 U+830E # +3-3755 U+834A # +3-3756 U+86CD # +3-3757 U+8A08 # +3-3758 U+8A63 # +3-3759 U+8B66 # +3-375A U+8EFD # +3-375B U+981A # +3-375C U+9D8F # +3-375D U+82B8 # +3-375E U+8FCE # +3-375F U+9BE8 # +3-3760 U+5287 # +3-3761 U+621F # +3-3762 U+6483 # +3-3763 U+6FC0 # +3-3764 U+9699 # +3-3765 U+6841 # +3-3766 U+5091 # +3-3767 U+6B20 # +3-3768 U+6C7A # +3-3769 U+6F54 # +3-376A U+7A74 # +3-376B U+7D50 # +3-376C U+8840 # +3-376D U+8A23 # +3-376E U+6708 # +3-376F U+4EF6 # +3-3770 U+5039 # +3-3771 U+5026 # +3-3772 U+5065 # +3-3773 U+517C # +3-3774 U+5238 # +3-3775 U+5263 # +3-3776 U+55A7 # +3-3777 U+570F # +3-3778 U+5805 # +3-3779 U+5ACC # +3-377A U+5EFA # +3-377B U+61B2 # +3-377C U+61F8 # +3-377D U+62F3 # +3-377E U+6372 # +3-3821 U+691C # +3-3822 U+6A29 # +3-3823 U+727D # +3-3824 U+72AC # +3-3825 U+732E # +3-3826 U+7814 # +3-3827 U+786F # +3-3828 U+7D79 # +3-3829 U+770C # +3-382A U+80A9 # +3-382B U+898B # +3-382C U+8B19 # +3-382D U+8CE2 # +3-382E U+8ED2 # +3-382F U+9063 # +3-3830 U+9375 # +3-3831 U+967A # +3-3832 U+9855 # +3-3833 U+9A13 # +3-3834 U+9E78 # +3-3835 U+5143 # +3-3836 U+539F # +3-3837 U+53B3 # +3-3838 U+5E7B # +3-3839 U+5F26 # +3-383A U+6E1B # +3-383B U+6E90 # +3-383C U+7384 # +3-383D U+73FE # +3-383E U+7D43 # +3-383F U+8237 # +3-3840 U+8A00 # +3-3841 U+8AFA # +3-3842 U+9650 # +3-3843 U+4E4E # +3-3844 U+500B # +3-3845 U+53E4 # +3-3846 U+547C # +3-3847 U+56FA # +3-3848 U+59D1 # +3-3849 U+5B64 # +3-384A U+5DF1 # +3-384B U+5EAB # +3-384C U+5F27 # +3-384D U+6238 # +3-384E U+6545 # +3-384F U+67AF # +3-3850 U+6E56 # +3-3851 U+72D0 # +3-3852 U+7CCA # +3-3853 U+88B4 # +3-3854 U+80A1 # +3-3855 U+80E1 # +3-3856 U+83F0 # +3-3857 U+864E # +3-3858 U+8A87 # +3-3859 U+8DE8 # +3-385A U+9237 # +3-385B U+96C7 # +3-385C U+9867 # +3-385D U+9F13 # +3-385E U+4E94 # +3-385F U+4E92 # +3-3860 U+4F0D # +3-3861 U+5348 # +3-3862 U+5449 # +3-3863 U+543E # +3-3864 U+5A2F # +3-3865 U+5F8C # +3-3866 U+5FA1 # +3-3867 U+609F # +3-3868 U+68A7 # +3-3869 U+6A8E # +3-386A U+745A # +3-386B U+7881 # +3-386C U+8A9E # +3-386D U+8AA4 # +3-386E U+8B77 # +3-386F U+9190 # +3-3870 U+4E5E # +3-3871 U+9BC9 # +3-3872 U+4EA4 # +3-3873 U+4F7C # +3-3874 U+4FAF # +3-3875 U+5019 # +3-3876 U+5016 # +3-3877 U+5149 # +3-3878 U+516C # +3-3879 U+529F # +3-387A U+52B9 # +3-387B U+52FE # +3-387C U+539A # +3-387D U+53E3 # +3-387E U+5411 # +3-3921 U+540E # +3-3922 U+5589 # +3-3923 U+5751 # +3-3924 U+57A2 # +3-3925 U+597D # +3-3926 U+5B54 # +3-3927 U+5B5D # +3-3928 U+5B8F # +3-3929 U+5DE5 # +3-392A U+5DE7 # +3-392B U+5DF7 # +3-392C U+5E78 # +3-392D U+5E83 # +3-392E U+5E9A # +3-392F U+5EB7 # +3-3930 U+5F18 # +3-3931 U+6052 # +3-3932 U+614C # +3-3933 U+6297 # +3-3934 U+62D8 # +3-3935 U+63A7 # +3-3936 U+653B # +3-3937 U+6602 # +3-3938 U+6643 # +3-3939 U+66F4 # +3-393A U+676D # +3-393B U+6821 # +3-393C U+6897 # +3-393D U+69CB # +3-393E U+6C5F # +3-393F U+6D2A # +3-3940 U+6D69 # +3-3941 U+6E2F # +3-3942 U+6E9D # +3-3943 U+7532 # +3-3944 U+7687 # +3-3945 U+786C # +3-3946 U+7A3F # +3-3947 U+7CE0 # +3-3948 U+7D05 # +3-3949 U+7D18 # +3-394A U+7D5E # +3-394B U+7DB1 # +3-394C U+8015 # +3-394D U+8003 # +3-394E U+80AF # +3-394F U+80B1 # +3-3950 U+8154 # +3-3951 U+818F # +3-3952 U+822A # +3-3953 U+8352 # +3-3954 U+884C # +3-3955 U+8861 # +3-3956 U+8B1B # +3-3957 U+8CA2 # +3-3958 U+8CFC # +3-3959 U+90CA # +3-395A U+9175 # +3-395B U+9271 # +3-395C U+783F # +3-395D U+92FC # +3-395E U+95A4 # +3-395F U+964D # +3-3960 U+9805 # +3-3961 U+9999 # +3-3962 U+9AD8 # +3-3963 U+9D3B # +3-3964 U+525B # +3-3965 U+52AB # +3-3966 U+53F7 # +3-3967 U+5408 # +3-3968 U+58D5 # +3-3969 U+62F7 # +3-396A U+6FE0 # +3-396B U+8C6A # +3-396C U+8F5F # +3-396D U+9EB9 # +3-396E U+514B # +3-396F U+523B # +3-3970 U+544A # +3-3971 U+56FD # +3-3972 U+7A40 # +3-3973 U+9177 # +3-3974 U+9D60 # +3-3975 U+9ED2 # +3-3976 U+7344 # +3-3977 U+6F09 # +3-3978 U+8170 # +3-3979 U+7511 # +3-397A U+5FFD # +3-397B U+60DA # +3-397C U+9AA8 # +3-397D U+72DB # +3-397E U+8FBC # +3-3A21 U+6B64 # +3-3A22 U+9803 # +3-3A23 U+4ECA # +3-3A24 U+56F0 # +3-3A25 U+5764 # +3-3A26 U+58BE # +3-3A27 U+5A5A # +3-3A28 U+6068 # +3-3A29 U+61C7 # +3-3A2A U+660F # +3-3A2B U+6606 # +3-3A2C U+6839 # +3-3A2D U+68B1 # +3-3A2E U+6DF7 # +3-3A2F U+75D5 # +3-3A30 U+7D3A # +3-3A31 U+826E # +3-3A32 U+9B42 # +3-3A33 U+4E9B # +3-3A34 U+4F50 # +3-3A35 U+53C9 # +3-3A36 U+5506 # +3-3A37 U+5D6F # +3-3A38 U+5DE6 # +3-3A39 U+5DEE # +3-3A3A U+67FB # +3-3A3B U+6C99 # +3-3A3C U+7473 # +3-3A3D U+7802 # +3-3A3E U+8A50 # +3-3A3F U+9396 # +3-3A40 U+88DF # +3-3A41 U+5750 # +3-3A42 U+5EA7 # +3-3A43 U+632B # +3-3A44 U+50B5 # +3-3A45 U+50AC # +3-3A46 U+518D # +3-3A47 U+6700 # +3-3A48 U+54C9 # +3-3A49 U+585E # +3-3A4A U+59BB # +3-3A4B U+5BB0 # +3-3A4C U+5F69 # +3-3A4D U+624D # +3-3A4E U+63A1 # +3-3A4F U+683D # +3-3A50 U+6B73 # +3-3A51 U+6E08 # +3-3A52 U+707D # +3-3A53 U+91C7 # +3-3A54 U+7280 # +3-3A55 U+7815 # +3-3A56 U+7826 # +3-3A57 U+796D # +3-3A58 U+658E # +3-3A59 U+7D30 # +3-3A5A U+83DC # +3-3A5B U+88C1 # +3-3A5C U+8F09 # +3-3A5D U+969B # +3-3A5E U+5264 # +3-3A5F U+5728 # +3-3A60 U+6750 # +3-3A61 U+7F6A # +3-3A62 U+8CA1 # +3-3A63 U+51B4 # +3-3A64 U+5742 # +3-3A65 U+962A # +3-3A66 U+583A # +3-3A67 U+698A # +3-3A68 U+80B4 # +3-3A69 U+54B2 # +3-3A6A U+5D0E # +3-3A6B U+57FC # +3-3A6C U+7895 # +3-3A6D U+9DFA # +3-3A6E U+4F5C # +3-3A6F U+524A # +3-3A70 U+548B # +3-3A71 U+643E # +3-3A72 U+6628 # +3-3A73 U+6714 # +3-3A74 U+67F5 # +3-3A75 U+7A84 # +3-3A76 U+7B56 # +3-3A77 U+7D22 # +3-3A78 U+932F # +3-3A79 U+685C # +3-3A7A U+9BAD # +3-3A7B U+7B39 # +3-3A7C U+5319 # +3-3A7D U+518A # +3-3A7E U+5237 # +3-3B21 U+5BDF # +3-3B22 U+62F6 # +3-3B23 U+64AE # +3-3B24 U+64E6 # +3-3B25 U+672D # +3-3B26 U+6BBA # +3-3B27 U+85A9 # +3-3B28 U+96D1 # +3-3B29 U+7690 # +3-3B2A U+9BD6 # +3-3B2B U+634C # +3-3B2C U+9306 # +3-3B2D U+9BAB # +3-3B2E U+76BF # +3-3B2F U+6652 # +3-3B30 U+4E09 # +3-3B31 U+5098 # +3-3B32 U+53C2 # +3-3B33 U+5C71 # +3-3B34 U+60E8 # +3-3B35 U+6492 # +3-3B36 U+6563 # +3-3B37 U+685F # +3-3B38 U+71E6 # +3-3B39 U+73CA # +3-3B3A U+7523 # +3-3B3B U+7B97 # +3-3B3C U+7E82 # +3-3B3D U+8695 # +3-3B3E U+8B83 # +3-3B3F U+8CDB # +3-3B40 U+9178 # +3-3B41 U+9910 # +3-3B42 U+65AC # +3-3B43 U+66AB # +3-3B44 U+6B8B # +3-3B45 U+4ED5 # +3-3B46 U+4ED4 # +3-3B47 U+4F3A # +3-3B48 U+4F7F # +3-3B49 U+523A # +3-3B4A U+53F8 # +3-3B4B U+53F2 # +3-3B4C U+55E3 # +3-3B4D U+56DB # +3-3B4E U+58EB # +3-3B4F U+59CB # +3-3B50 U+59C9 # +3-3B51 U+59FF # +3-3B52 U+5B50 # +3-3B53 U+5C4D # +3-3B54 U+5E02 # +3-3B55 U+5E2B # +3-3B56 U+5FD7 # +3-3B57 U+601D # +3-3B58 U+6307 # +3-3B59 U+652F # +3-3B5A U+5B5C # +3-3B5B U+65AF # +3-3B5C U+65BD # +3-3B5D U+65E8 # +3-3B5E U+679D # +3-3B5F U+6B62 # +3-3B60 U+6B7B # +3-3B61 U+6C0F # +3-3B62 U+7345 # +3-3B63 U+7949 # +3-3B64 U+79C1 # +3-3B65 U+7CF8 # +3-3B66 U+7D19 # +3-3B67 U+7D2B # +3-3B68 U+80A2 # +3-3B69 U+8102 # +3-3B6A U+81F3 # +3-3B6B U+8996 # +3-3B6C U+8A5E # +3-3B6D U+8A69 # +3-3B6E U+8A66 # +3-3B6F U+8A8C # +3-3B70 U+8AEE # +3-3B71 U+8CC7 # +3-3B72 U+8CDC # +3-3B73 U+96CC # +3-3B74 U+98FC # +3-3B75 U+6B6F # +3-3B76 U+4E8B # +3-3B77 U+4F3C # +3-3B78 U+4F8D # +3-3B79 U+5150 # +3-3B7A U+5B57 # +3-3B7B U+5BFA # +3-3B7C U+6148 # +3-3B7D U+6301 # +3-3B7E U+6642 # +3-3C21 U+6B21 # +3-3C22 U+6ECB # +3-3C23 U+6CBB # +3-3C24 U+723E # +3-3C25 U+74BD # +3-3C26 U+75D4 # +3-3C27 U+78C1 # +3-3C28 U+793A # +3-3C29 U+800C # +3-3C2A U+8033 # +3-3C2B U+81EA # +3-3C2C U+8494 # +3-3C2D U+8F9E # +3-3C2E U+6C50 # +3-3C2F U+9E7F # +3-3C30 U+5F0F # +3-3C31 U+8B58 # +3-3C32 U+9D2B # +3-3C33 U+7AFA # +3-3C34 U+8EF8 # +3-3C35 U+5B8D # +3-3C36 U+96EB # +3-3C37 U+4E03 # +3-3C38 U+53F1 # +3-3C39 U+57F7 # +3-3C3A U+5931 # +3-3C3B U+5AC9 # +3-3C3C U+5BA4 # +3-3C3D U+6089 # +3-3C3E U+6E7F # +3-3C3F U+6F06 # +3-3C40 U+75BE # +3-3C41 U+8CEA # +3-3C42 U+5B9F # +3-3C43 U+8500 # +3-3C44 U+7BE0 # +3-3C45 U+5072 # +3-3C46 U+67F4 # +3-3C47 U+829D # +3-3C48 U+5C61 # +3-3C49 U+854A # +3-3C4A U+7E1E # +3-3C4B U+820E # +3-3C4C U+5199 # +3-3C4D U+5C04 # +3-3C4E U+6368 # +3-3C4F U+8D66 # +3-3C50 U+659C # +3-3C51 U+716E # +3-3C52 U+793E # +3-3C53 U+7D17 # +3-3C54 U+8005 # +3-3C55 U+8B1D # +3-3C56 U+8ECA # +3-3C57 U+906E # +3-3C58 U+86C7 # +3-3C59 U+90AA # +3-3C5A U+501F # +3-3C5B U+52FA # +3-3C5C U+5C3A # +3-3C5D U+6753 # +3-3C5E U+707C # +3-3C5F U+7235 # +3-3C60 U+914C # +3-3C61 U+91C8 # +3-3C62 U+932B # +3-3C63 U+82E5 # +3-3C64 U+5BC2 # +3-3C65 U+5F31 # +3-3C66 U+60F9 # +3-3C67 U+4E3B # +3-3C68 U+53D6 # +3-3C69 U+5B88 # +3-3C6A U+624B # +3-3C6B U+6731 # +3-3C6C U+6B8A # +3-3C6D U+72E9 # +3-3C6E U+73E0 # +3-3C6F U+7A2E # +3-3C70 U+816B # +3-3C71 U+8DA3 # +3-3C72 U+9152 # +3-3C73 U+9996 # +3-3C74 U+5112 # +3-3C75 U+53D7 # +3-3C76 U+546A # +3-3C77 U+5BFF # +3-3C78 U+6388 # +3-3C79 U+6A39 # +3-3C7A U+7DAC # +3-3C7B U+9700 # +3-3C7C U+56DA # +3-3C7D U+53CE # +3-3C7E U+5468 # +3-3D21 U+5B97 # +3-3D22 U+5C31 # +3-3D23 U+5DDE # +3-3D24 U+4FEE # +3-3D25 U+6101 # +3-3D26 U+62FE # +3-3D27 U+6D32 # +3-3D28 U+79C0 # +3-3D29 U+79CB # +3-3D2A U+7D42 # +3-3D2B U+7E4D # +3-3D2C U+7FD2 # +3-3D2D U+81ED # +3-3D2E U+821F # +3-3D2F U+8490 # +3-3D30 U+8846 # +3-3D31 U+8972 # +3-3D32 U+8B90 # +3-3D33 U+8E74 # +3-3D34 U+8F2F # +3-3D35 U+9031 # +3-3D36 U+914B # +3-3D37 U+916C # +3-3D38 U+96C6 # +3-3D39 U+919C # +3-3D3A U+4EC0 # +3-3D3B U+4F4F # +3-3D3C U+5145 # +3-3D3D U+5341 # +3-3D3E U+5F93 # +3-3D3F U+620E # +3-3D40 U+67D4 # +3-3D41 U+6C41 # +3-3D42 U+6E0B # +3-3D43 U+7363 # +3-3D44 U+7E26 # +3-3D45 U+91CD # +3-3D46 U+9283 # +3-3D47 U+53D4 # +3-3D48 U+5919 # +3-3D49 U+5BBF # +3-3D4A U+6DD1 # +3-3D4B U+795D # +3-3D4C U+7E2E # +3-3D4D U+7C9B # +3-3D4E U+587E # +3-3D4F U+719F # +3-3D50 U+51FA # +3-3D51 U+8853 # +3-3D52 U+8FF0 # +3-3D53 U+4FCA # +3-3D54 U+5CFB # +3-3D55 U+6625 # +3-3D56 U+77AC # +3-3D57 U+7AE3 # +3-3D58 U+821C # +3-3D59 U+99FF # +3-3D5A U+51C6 # +3-3D5B U+5FAA # +3-3D5C U+65EC # +3-3D5D U+696F # +3-3D5E U+6B89 # +3-3D5F U+6DF3 # +3-3D60 U+6E96 # +3-3D61 U+6F64 # +3-3D62 U+76FE # +3-3D63 U+7D14 # +3-3D64 U+5DE1 # +3-3D65 U+9075 # +3-3D66 U+9187 # +3-3D67 U+9806 # +3-3D68 U+51E6 # +3-3D69 U+521D # +3-3D6A U+6240 # +3-3D6B U+6691 # +3-3D6C U+66D9 # +3-3D6D U+6E1A # +3-3D6E U+5EB6 # +3-3D6F U+7DD2 # +3-3D70 U+7F72 # +3-3D71 U+66F8 # +3-3D72 U+85AF # +3-3D73 U+85F7 # +3-3D74 U+8AF8 # +3-3D75 U+52A9 # +3-3D76 U+53D9 # +3-3D77 U+5973 # +3-3D78 U+5E8F # +3-3D79 U+5F90 # +3-3D7A U+6055 # +3-3D7B U+92E4 # +3-3D7C U+9664 # +3-3D7D U+50B7 # +3-3D7E U+511F # +3-3E21 U+52DD # +3-3E22 U+5320 # +3-3E23 U+5347 # +3-3E24 U+53EC # +3-3E25 U+54E8 # +3-3E26 U+5546 # +3-3E27 U+5531 # +3-3E28 U+5617 # +3-3E29 U+5968 # +3-3E2A U+59BE # +3-3E2B U+5A3C # +3-3E2C U+5BB5 # +3-3E2D U+5C06 # +3-3E2E U+5C0F # +3-3E2F U+5C11 # +3-3E30 U+5C1A # +3-3E31 U+5E84 # +3-3E32 U+5E8A # +3-3E33 U+5EE0 # +3-3E34 U+5F70 # +3-3E35 U+627F # +3-3E36 U+6284 # +3-3E37 U+62DB # +3-3E38 U+638C # +3-3E39 U+6377 # +3-3E3A U+6607 # +3-3E3B U+660C # +3-3E3C U+662D # +3-3E3D U+6676 # +3-3E3E U+677E # +3-3E3F U+68A2 # +3-3E40 U+6A1F # +3-3E41 U+6A35 # +3-3E42 U+6CBC # +3-3E43 U+6D88 # +3-3E44 U+6E09 # +3-3E45 U+6E58 # +3-3E46 U+713C # +3-3E47 U+7126 # +3-3E48 U+7167 # +3-3E49 U+75C7 # +3-3E4A U+7701 # +3-3E4B U+785D # +3-3E4C U+7901 # +3-3E4D U+7965 # +3-3E4E U+79F0 # +3-3E4F U+7AE0 # +3-3E50 U+7B11 # +3-3E51 U+7CA7 # +3-3E52 U+7D39 # +3-3E53 U+8096 # +3-3E54 U+83D6 # +3-3E55 U+848B # +3-3E56 U+8549 # +3-3E57 U+885D # +3-3E58 U+88F3 # +3-3E59 U+8A1F # +3-3E5A U+8A3C # +3-3E5B U+8A54 # +3-3E5C U+8A73 # +3-3E5D U+8C61 # +3-3E5E U+8CDE # +3-3E5F U+91A4 # +3-3E60 U+9266 # +3-3E61 U+937E # +3-3E62 U+9418 # +3-3E63 U+969C # +3-3E64 U+9798 # +3-3E65 U+4E0A # +3-3E66 U+4E08 # +3-3E67 U+4E1E # +3-3E68 U+4E57 # +3-3E69 U+5197 # +3-3E6A U+5270 # +3-3E6B U+57CE # +3-3E6C U+5834 # +3-3E6D U+58CC # +3-3E6E U+5B22 # +3-3E6F U+5E38 # +3-3E70 U+60C5 # +3-3E71 U+64FE # +3-3E72 U+6761 # +3-3E73 U+6756 # +3-3E74 U+6D44 # +3-3E75 U+72B6 # +3-3E76 U+7573 # +3-3E77 U+7A63 # +3-3E78 U+84B8 # +3-3E79 U+8B72 # +3-3E7A U+91B8 # +3-3E7B U+9320 # +3-3E7C U+5631 # +3-3E7D U+57F4 # +3-3E7E U+98FE # +3-3F21 U+62ED # +3-3F22 U+690D # +3-3F23 U+6B96 # +3-3F24 U+71ED # +3-3F25 U+7E54 # +3-3F26 U+8077 # +3-3F27 U+8272 # +3-3F28 U+89E6 # +3-3F29 U+98DF # +3-3F2A U+8755 # +3-3F2B U+8FB1 # +3-3F2C U+5C3B # +3-3F2D U+4F38 # +3-3F2E U+4FE1 # +3-3F2F U+4FB5 # +3-3F30 U+5507 # +3-3F31 U+5A20 # +3-3F32 U+5BDD # +3-3F33 U+5BE9 # +3-3F34 U+5FC3 # +3-3F35 U+614E # +3-3F36 U+632F # +3-3F37 U+65B0 # +3-3F38 U+664B # +3-3F39 U+68EE # +3-3F3A U+699B # +3-3F3B U+6D78 # +3-3F3C U+6DF1 # +3-3F3D U+7533 # +3-3F3E U+75B9 # +3-3F3F U+771F # +3-3F40 U+795E # +3-3F41 U+79E6 # +3-3F42 U+7D33 # +3-3F43 U+81E3 # +3-3F44 U+82AF # +3-3F45 U+85AA # +3-3F46 U+89AA # +3-3F47 U+8A3A # +3-3F48 U+8EAB # +3-3F49 U+8F9B # +3-3F4A U+9032 # +3-3F4B U+91DD # +3-3F4C U+9707 # +3-3F4D U+4EBA # +3-3F4E U+4EC1 # +3-3F4F U+5203 # +3-3F50 U+5875 # +3-3F51 U+58EC # +3-3F52 U+5C0B # +3-3F53 U+751A # +3-3F54 U+5C3D # +3-3F55 U+814E # +3-3F56 U+8A0A # +3-3F57 U+8FC5 # +3-3F58 U+9663 # +3-3F59 U+976D # +3-3F5A U+7B25 # +3-3F5B U+8ACF # +3-3F5C U+9808 # +3-3F5D U+9162 # +3-3F5E U+56F3 # +3-3F5F U+53A8 # +3-3F60 U+9017 # +3-3F61 U+5439 # +3-3F62 U+5782 # +3-3F63 U+5E25 # +3-3F64 U+63A8 # +3-3F65 U+6C34 # +3-3F66 U+708A # +3-3F67 U+7761 # +3-3F68 U+7C8B # +3-3F69 U+7FE0 # +3-3F6A U+8870 # +3-3F6B U+9042 # +3-3F6C U+9154 # +3-3F6D U+9310 # +3-3F6E U+9318 # +3-3F6F U+968F # +3-3F70 U+745E # +3-3F71 U+9AC4 # +3-3F72 U+5D07 # +3-3F73 U+5D69 # +3-3F74 U+6570 # +3-3F75 U+67A2 # +3-3F76 U+8DA8 # +3-3F77 U+96DB # +3-3F78 U+636E # +3-3F79 U+6749 # +3-3F7A U+6919 # +3-3F7B U+83C5 # +3-3F7C U+9817 # +3-3F7D U+96C0 # +3-3F7E U+88FE # +3-4021 U+6F84 # +3-4022 U+647A # +3-4023 U+5BF8 # +3-4024 U+4E16 # +3-4025 U+702C # +3-4026 U+755D # +3-4027 U+662F # +3-4028 U+51C4 # +3-4029 U+5236 # +3-402A U+52E2 # +3-402B U+59D3 # +3-402C U+5F81 # +3-402D U+6027 # +3-402E U+6210 # +3-402F U+653F # +3-4030 U+6574 # +3-4031 U+661F # +3-4032 U+6674 # +3-4033 U+68F2 # +3-4034 U+6816 # +3-4035 U+6B63 # +3-4036 U+6E05 # +3-4037 U+7272 # +3-4038 U+751F # +3-4039 U+76DB # +3-403A U+7CBE # +3-403B U+8056 # +3-403C U+58F0 # +3-403D U+88FD # +3-403E U+897F # +3-403F U+8AA0 # +3-4040 U+8A93 # +3-4041 U+8ACB # +3-4042 U+901D # +3-4043 U+9192 # +3-4044 U+9752 # +3-4045 U+9759 # +3-4046 U+6589 # +3-4047 U+7A0E # +3-4048 U+8106 # +3-4049 U+96BB # +3-404A U+5E2D # +3-404B U+60DC # +3-404C U+621A # +3-404D U+65A5 # +3-404E U+6614 # +3-404F U+6790 # +3-4050 U+77F3 # +3-4051 U+7A4D # +3-4052 U+7C4D # +3-4053 U+7E3E # +3-4054 U+810A # +3-4055 U+8CAC # +3-4056 U+8D64 # +3-4057 U+8DE1 # +3-4058 U+8E5F # +3-4059 U+78A9 # +3-405A U+5207 # +3-405B U+62D9 # +3-405C U+63A5 # +3-405D U+6442 # +3-405E U+6298 # +3-405F U+8A2D # +3-4060 U+7A83 # +3-4061 U+7BC0 # +3-4062 U+8AAC # +3-4063 U+96EA # +3-4064 U+7D76 # +3-4065 U+820C # +3-4066 U+8749 # +3-4067 U+4ED9 # +3-4068 U+5148 # +3-4069 U+5343 # +3-406A U+5360 # +3-406B U+5BA3 # +3-406C U+5C02 # +3-406D U+5C16 # +3-406E U+5DDD # +3-406F U+6226 # +3-4070 U+6247 # +3-4071 U+64B0 # +3-4072 U+6813 # +3-4073 U+6834 # +3-4074 U+6CC9 # +3-4075 U+6D45 # +3-4076 U+6D17 # +3-4077 U+67D3 # +3-4078 U+6F5C # +3-4079 U+714E # +3-407A U+717D # +3-407B U+65CB # +3-407C U+7A7F # +3-407D U+7BAD # +3-407E U+7DDA # +3-4121 U+7E4A # +3-4122 U+7FA8 # +3-4123 U+817A # +3-4124 U+821B # +3-4125 U+8239 # +3-4126 U+85A6 # +3-4127 U+8A6E # +3-4128 U+8CCE # +3-4129 U+8DF5 # +3-412A U+9078 # +3-412B U+9077 # +3-412C U+92AD # +3-412D U+9291 # +3-412E U+9583 # +3-412F U+9BAE # +3-4130 U+524D # +3-4131 U+5584 # +3-4132 U+6F38 # +3-4133 U+7136 # +3-4134 U+5168 # +3-4135 U+7985 # +3-4136 U+7E55 # +3-4137 U+81B3 # +3-4138 U+7CCE # +3-4139 U+564C # +3-413A U+5851 # +3-413B U+5CA8 # +3-413C U+63AA # +3-413D U+66FE # +3-413E U+66FD # +3-413F U+695A # +3-4140 U+72D9 # +3-4141 U+758F # +3-4142 U+758E # +3-4143 U+790E # +3-4144 U+7956 # +3-4145 U+79DF # +3-4146 U+7C97 # +3-4147 U+7D20 # +3-4148 U+7D44 # +3-4149 U+8607 # +3-414A U+8A34 # +3-414B U+963B # +3-414C U+9061 # +3-414D U+9F20 # +3-414E U+50E7 # +3-414F U+5275 # +3-4150 U+53CC # +3-4151 U+53E2 # +3-4152 U+5009 # +3-4153 U+55AA # +3-4154 U+58EE # +3-4155 U+594F # +3-4156 U+723D # +3-4157 U+5B8B # +3-4158 U+5C64 # +3-4159 U+531D # +3-415A U+60E3 # +3-415B U+60F3 # +3-415C U+635C # +3-415D U+6383 # +3-415E U+633F # +3-415F U+63BB # +3-4160 U+64CD # +3-4161 U+65E9 # +3-4162 U+66F9 # +3-4163 U+5DE3 # +3-4164 U+69CD # +3-4165 U+69FD # +3-4166 U+6F15 # +3-4167 U+71E5 # +3-4168 U+4E89 # +3-4169 U+75E9 # +3-416A U+76F8 # +3-416B U+7A93 # +3-416C U+7CDF # +3-416D U+7DCF # +3-416E U+7D9C # +3-416F U+8061 # +3-4170 U+8349 # +3-4171 U+8358 # +3-4172 U+846C # +3-4173 U+84BC # +3-4174 U+85FB # +3-4175 U+88C5 # +3-4176 U+8D70 # +3-4177 U+9001 # +3-4178 U+906D # +3-4179 U+9397 # +3-417A U+971C # +3-417B U+9A12 # +3-417C U+50CF # +3-417D U+5897 # +3-417E U+618E # +3-4221 U+81D3 # +3-4222 U+8535 # +3-4223 U+8D08 # +3-4224 U+9020 # +3-4225 U+4FC3 # +3-4226 U+5074 # +3-4227 U+5247 # +3-4228 U+5373 # +3-4229 U+606F # +3-422A U+6349 # +3-422B U+675F # +3-422C U+6E2C # +3-422D U+8DB3 # +3-422E U+901F # +3-422F U+4FD7 # +3-4230 U+5C5E # +3-4231 U+8CCA # +3-4232 U+65CF # +3-4233 U+7D9A # +3-4234 U+5352 # +3-4235 U+8896 # +3-4236 U+5176 # +3-4237 U+63C3 # +3-4238 U+5B58 # +3-4239 U+5B6B # +3-423A U+5C0A # +3-423B U+640D # +3-423C U+6751 # +3-423D U+905C # +3-423E U+4ED6 # +3-423F U+591A # +3-4240 U+592A # +3-4241 U+6C70 # +3-4242 U+8A51 # +3-4243 U+553E # +3-4244 U+5815 # +3-4245 U+59A5 # +3-4246 U+60F0 # +3-4247 U+6253 # +3-4248 U+67C1 # +3-4249 U+8235 # +3-424A U+6955 # +3-424B U+9640 # +3-424C U+99C4 # +3-424D U+9A28 # +3-424E U+4F53 # +3-424F U+5806 # +3-4250 U+5BFE # +3-4251 U+8010 # +3-4252 U+5CB1 # +3-4253 U+5E2F # +3-4254 U+5F85 # +3-4255 U+6020 # +3-4256 U+614B # +3-4257 U+6234 # +3-4258 U+66FF # +3-4259 U+6CF0 # +3-425A U+6EDE # +3-425B U+80CE # +3-425C U+817F # +3-425D U+82D4 # +3-425E U+888B # +3-425F U+8CB8 # +3-4260 U+9000 # +3-4261 U+902E # +3-4262 U+968A # +3-4263 U+9EDB # +3-4264 U+9BDB # +3-4265 U+4EE3 # +3-4266 U+53F0 # +3-4267 U+5927 # +3-4268 U+7B2C # +3-4269 U+918D # +3-426A U+984C # +3-426B U+9DF9 # +3-426C U+6EDD # +3-426D U+7027 # +3-426E U+5353 # +3-426F U+5544 # +3-4270 U+5B85 # +3-4271 U+6258 # +3-4272 U+629E # +3-4273 U+62D3 # +3-4274 U+6CA2 # +3-4275 U+6FEF # +3-4276 U+7422 # +3-4277 U+8A17 # +3-4278 U+9438 # +3-4279 U+6FC1 # +3-427A U+8AFE # +3-427B U+8338 # +3-427C U+51E7 # +3-427D U+86F8 # +3-427E U+53EA # +3-4321 U+53E9 # +3-4322 U+4F46 # +3-4323 U+9054 # +3-4324 U+8FB0 # +3-4325 U+596A # +3-4326 U+8131 # +3-4327 U+5DFD # +3-4328 U+7AEA # +3-4329 U+8FBF # +3-432A U+68DA # +3-432B U+8C37 # +3-432C U+72F8 # +3-432D U+9C48 # +3-432E U+6A3D # +3-432F U+8AB0 # +3-4330 U+4E39 # +3-4331 U+5358 # +3-4332 U+5606 # +3-4333 U+5766 # +3-4334 U+62C5 # +3-4335 U+63A2 # +3-4336 U+65E6 # +3-4337 U+6B4E # +3-4338 U+6DE1 # +3-4339 U+6E5B # +3-433A U+70AD # +3-433B U+77ED # +3-433C U+7AEF # +3-433D U+7BAA # +3-433E U+7DBB # +3-433F U+803D # +3-4340 U+80C6 # +3-4341 U+86CB # +3-4342 U+8A95 # +3-4343 U+935B # +3-4344 U+56E3 # +3-4345 U+58C7 # +3-4346 U+5F3E # +3-4347 U+65AD # +3-4348 U+6696 # +3-4349 U+6A80 # +3-434A U+6BB5 # +3-434B U+7537 # +3-434C U+8AC7 # +3-434D U+5024 # +3-434E U+77E5 # +3-434F U+5730 # +3-4350 U+5F1B # +3-4351 U+6065 # +3-4352 U+667A # +3-4353 U+6C60 # +3-4354 U+75F4 # +3-4355 U+7A1A # +3-4356 U+7F6E # +3-4357 U+81F4 # +3-4358 U+8718 # +3-4359 U+9045 # +3-435A U+99B3 # +3-435B U+7BC9 # +3-435C U+755C # +3-435D U+7AF9 # +3-435E U+7B51 # +3-435F U+84C4 # +3-4360 U+9010 # +3-4361 U+79E9 # +3-4362 U+7A92 # +3-4363 U+8336 # +3-4364 U+5AE1 # +3-4365 U+7740 # +3-4366 U+4E2D # +3-4367 U+4EF2 # +3-4368 U+5B99 # +3-4369 U+5FE0 # +3-436A U+62BD # +3-436B U+663C # +3-436C U+67F1 # +3-436D U+6CE8 # +3-436E U+866B # +3-436F U+8877 # +3-4370 U+8A3B # +3-4371 U+914E # +3-4372 U+92F3 # +3-4373 U+99D0 # +3-4374 U+6A17 # +3-4375 U+7026 # +3-4376 U+732A # +3-4377 U+82E7 # +3-4378 U+8457 # +3-4379 U+8CAF # +3-437A U+4E01 # +3-437B U+5146 # +3-437C U+51CB # +3-437D U+558B # +3-437E U+5BF5 # +3-4421 U+5E16 # +3-4422 U+5E33 # +3-4423 U+5E81 # +3-4424 U+5F14 # +3-4425 U+5F35 # +3-4426 U+5F6B # +3-4427 U+5FB4 # +3-4428 U+61F2 # +3-4429 U+6311 # +3-442A U+66A2 # +3-442B U+671D # +3-442C U+6F6E # +3-442D U+7252 # +3-442E U+753A # +3-442F U+773A # +3-4430 U+8074 # +3-4431 U+8139 # +3-4432 U+8178 # +3-4433 U+8776 # +3-4434 U+8ABF # +3-4435 U+8ADC # +3-4436 U+8D85 # +3-4437 U+8DF3 # +3-4438 U+929A # +3-4439 U+9577 # +3-443A U+9802 # +3-443B U+9CE5 # +3-443C U+52C5 # +3-443D U+6357 # +3-443E U+76F4 # +3-443F U+6715 # +3-4440 U+6C88 # +3-4441 U+73CD # +3-4442 U+8CC3 # +3-4443 U+93AE # +3-4444 U+9673 # +3-4445 U+6D25 # +3-4446 U+589C # +3-4447 U+690E # +3-4448 U+69CC # +3-4449 U+8FFD # +3-444A U+939A # +3-444B U+75DB # +3-444C U+901A # +3-444D U+585A # +3-444E U+6802 # +3-444F U+63B4 # +3-4450 U+69FB # +3-4451 U+4F43 # +3-4452 U+6F2C # +3-4453 U+67D8 # +3-4454 U+8FBB # +3-4455 U+8526 # +3-4456 U+7DB4 # +3-4457 U+9354 # +3-4458 U+693F # +3-4459 U+6F70 # +3-445A U+576A # +3-445B U+58F7 # +3-445C U+5B2C # +3-445D U+7D2C # +3-445E U+722A # +3-445F U+540A # +3-4460 U+91E3 # +3-4461 U+9DB4 # +3-4462 U+4EAD # +3-4463 U+4F4E # +3-4464 U+505C # +3-4465 U+5075 # +3-4466 U+5243 # +3-4467 U+8C9E # +3-4468 U+5448 # +3-4469 U+5824 # +3-446A U+5B9A # +3-446B U+5E1D # +3-446C U+5E95 # +3-446D U+5EAD # +3-446E U+5EF7 # +3-446F U+5F1F # +3-4470 U+608C # +3-4471 U+62B5 # +3-4472 U+633A # +3-4473 U+63D0 # +3-4474 U+68AF # +3-4475 U+6C40 # +3-4476 U+7887 # +3-4477 U+798E # +3-4478 U+7A0B # +3-4479 U+7DE0 # +3-447A U+8247 # +3-447B U+8A02 # +3-447C U+8AE6 # +3-447D U+8E44 # +3-447E U+9013 # +3-4521 U+90B8 # +3-4522 U+912D # +3-4523 U+91D8 # +3-4524 U+9F0E # +3-4525 U+6CE5 # +3-4526 U+6458 # +3-4527 U+64E2 # +3-4528 U+6575 # +3-4529 U+6EF4 # +3-452A U+7684 # +3-452B U+7B1B # +3-452C U+9069 # +3-452D U+93D1 # +3-452E U+6EBA # +3-452F U+54F2 # +3-4530 U+5FB9 # +3-4531 U+64A4 # +3-4532 U+8F4D # +3-4533 U+8FED # +3-4534 U+9244 # +3-4535 U+5178 # +3-4536 U+586B # +3-4537 U+5929 # +3-4538 U+5C55 # +3-4539 U+5E97 # +3-453A U+6DFB # +3-453B U+7E8F # +3-453C U+751C # +3-453D U+8CBC # +3-453E U+8EE2 # +3-453F U+985B # +3-4540 U+70B9 # +3-4541 U+4F1D # +3-4542 U+6BBF # +3-4543 U+6FB1 # +3-4544 U+7530 # +3-4545 U+96FB # +3-4546 U+514E # +3-4547 U+5410 # +3-4548 U+5835 # +3-4549 U+5857 # +3-454A U+59AC # +3-454B U+5C60 # +3-454C U+5F92 # +3-454D U+6597 # +3-454E U+675C # +3-454F U+6E21 # +3-4550 U+767B # +3-4551 U+83DF # +3-4552 U+8CED # +3-4553 U+9014 # +3-4554 U+90FD # +3-4555 U+934D # +3-4556 U+7825 # +3-4557 U+783A # +3-4558 U+52AA # +3-4559 U+5EA6 # +3-455A U+571F # +3-455B U+5974 # +3-455C U+6012 # +3-455D U+5012 # +3-455E U+515A # +3-455F U+51AC # +3-4560 U+51CD # +3-4561 U+5200 # +3-4562 U+5510 # +3-4563 U+5854 # +3-4564 U+5858 # +3-4565 U+5957 # +3-4566 U+5B95 # +3-4567 U+5CF6 # +3-4568 U+5D8B # +3-4569 U+60BC # +3-456A U+6295 # +3-456B U+642D # +3-456C U+6771 # +3-456D U+6843 # +3-456E U+68BC # +3-456F U+68DF # +3-4570 U+76D7 # +3-4571 U+6DD8 # +3-4572 U+6E6F # +3-4573 U+6D9B # +3-4574 U+706F # +3-4575 U+71C8 # +3-4576 U+5F53 # +3-4577 U+75D8 # +3-4578 U+7977 # +3-4579 U+7B49 # +3-457A U+7B54 # +3-457B U+7B52 # +3-457C U+7CD6 # +3-457D U+7D71 # +3-457E U+5230 # +3-4621 U+8463 # +3-4622 U+8569 # +3-4623 U+85E4 # +3-4624 U+8A0E # +3-4625 U+8B04 # +3-4626 U+8C46 # +3-4627 U+8E0F # +3-4628 U+9003 # +3-4629 U+900F # +3-462A U+9419 # +3-462B U+9676 # +3-462C U+982D # +3-462D U+9A30 # +3-462E U+95D8 # +3-462F U+50CD # +3-4630 U+52D5 # +3-4631 U+540C # +3-4632 U+5802 # +3-4633 U+5C0E # +3-4634 U+61A7 # +3-4635 U+649E # +3-4636 U+6D1E # +3-4637 U+77B3 # +3-4638 U+7AE5 # +3-4639 U+80F4 # +3-463A U+8404 # +3-463B U+9053 # +3-463C U+9285 # +3-463D U+5CE0 # +3-463E U+9D07 # +3-463F U+533F # +3-4640 U+5F97 # +3-4641 U+5FB3 # +3-4642 U+6D9C # +3-4643 U+7279 # +3-4644 U+7763 # +3-4645 U+79BF # +3-4646 U+7BE4 # +3-4647 U+6BD2 # +3-4648 U+72EC # +3-4649 U+8AAD # +3-464A U+6803 # +3-464B U+6A61 # +3-464C U+51F8 # +3-464D U+7A81 # +3-464E U+6934 # +3-464F U+5C4A # +3-4650 U+9CF6 # +3-4651 U+82EB # +3-4652 U+5BC5 # +3-4653 U+9149 # +3-4654 U+701E # +3-4655 U+5678 # +3-4656 U+5C6F # +3-4657 U+60C7 # +3-4658 U+6566 # +3-4659 U+6C8C # +3-465A U+8C5A # +3-465B U+9041 # +3-465C U+9813 # +3-465D U+5451 # +3-465E U+66C7 # +3-465F U+920D # +3-4660 U+5948 # +3-4661 U+90A3 # +3-4662 U+5185 # +3-4663 U+4E4D # +3-4664 U+51EA # +3-4665 U+8599 # +3-4666 U+8B0E # +3-4667 U+7058 # +3-4668 U+637A # +3-4669 U+934B # +3-466A U+6962 # +3-466B U+99B4 # +3-466C U+7E04 # +3-466D U+7577 # +3-466E U+5357 # +3-466F U+6960 # +3-4670 U+8EDF # +3-4671 U+96E3 # +3-4672 U+6C5D # +3-4673 U+4E8C # +3-4674 U+5C3C # +3-4675 U+5F10 # +3-4676 U+8FE9 # +3-4677 U+5302 # +3-4678 U+8CD1 # +3-4679 U+8089 # +3-467A U+8679 # +3-467B U+5EFF # +3-467C U+65E5 # +3-467D U+4E73 # +3-467E U+5165 # +3-4721 U+5982 # +3-4722 U+5C3F # +3-4723 U+97EE # +3-4724 U+4EFB # +3-4725 U+598A # +3-4726 U+5FCD # +3-4727 U+8A8D # +3-4728 U+6FE1 # +3-4729 U+79B0 # +3-472A U+7962 # +3-472B U+5BE7 # +3-472C U+8471 # +3-472D U+732B # +3-472E U+71B1 # +3-472F U+5E74 # +3-4730 U+5FF5 # +3-4731 U+637B # +3-4732 U+649A # +3-4733 U+71C3 # +3-4734 U+7C98 # +3-4735 U+4E43 # +3-4736 U+5EFC # +3-4737 U+4E4B # +3-4738 U+57DC # +3-4739 U+56A2 # +3-473A U+60A9 # +3-473B U+6FC3 # +3-473C U+7D0D # +3-473D U+80FD # +3-473E U+8133 # +3-473F U+81BF # +3-4740 U+8FB2 # +3-4741 U+8997 # +3-4742 U+86A4 # +3-4743 U+5DF4 # +3-4744 U+628A # +3-4745 U+64AD # +3-4746 U+8987 # +3-4747 U+6777 # +3-4748 U+6CE2 # +3-4749 U+6D3E # +3-474A U+7436 # +3-474B U+7834 # +3-474C U+5A46 # +3-474D U+7F75 # +3-474E U+82AD # +3-474F U+99AC # +3-4750 U+4FF3 # +3-4751 U+5EC3 # +3-4752 U+62DD # +3-4753 U+6392 # +3-4754 U+6557 # +3-4755 U+676F # +3-4756 U+76C3 # +3-4757 U+724C # +3-4758 U+80CC # +3-4759 U+80BA # +3-475A U+8F29 # +3-475B U+914D # +3-475C U+500D # +3-475D U+57F9 # +3-475E U+5A92 # +3-475F U+6885 # +3-4760 U+6973 # +3-4761 U+7164 # +3-4762 U+72FD # +3-4763 U+8CB7 # +3-4764 U+58F2 # +3-4765 U+8CE0 # +3-4766 U+966A # +3-4767 U+9019 # +3-4768 U+877F # +3-4769 U+79E4 # +3-476A U+77E7 # +3-476B U+8429 # +3-476C U+4F2F # +3-476D U+5265 # +3-476E U+535A # +3-476F U+62CD # +3-4770 U+67CF # +3-4771 U+6CCA # +3-4772 U+767D # +3-4773 U+7B94 # +3-4774 U+7C95 # +3-4775 U+8236 # +3-4776 U+8584 # +3-4777 U+8FEB # +3-4778 U+66DD # +3-4779 U+6F20 # +3-477A U+7206 # +3-477B U+7E1B # +3-477C U+83AB # +3-477D U+99C1 # +3-477E U+9EA6 # +3-4821 U+51FD # +3-4822 U+7BB1 # +3-4823 U+7872 # +3-4824 U+7BB8 # +3-4825 U+8087 # +3-4826 U+7B48 # +3-4827 U+6AE8 # +3-4828 U+5E61 # +3-4829 U+808C # +3-482A U+7551 # +3-482B U+7560 # +3-482C U+516B # +3-482D U+9262 # +3-482E U+6E8C # +3-482F U+767A # +3-4830 U+9197 # +3-4831 U+9AEA # +3-4832 U+4F10 # +3-4833 U+7F70 # +3-4834 U+629C # +3-4835 U+7B4F # +3-4836 U+95A5 # +3-4837 U+9CE9 # +3-4838 U+567A # +3-4839 U+5859 # +3-483A U+86E4 # +3-483B U+96BC # +3-483C U+4F34 # +3-483D U+5224 # +3-483E U+534A # +3-483F U+53CD # +3-4840 U+53DB # +3-4841 U+5E06 # +3-4842 U+642C # +3-4843 U+6591 # +3-4844 U+677F # +3-4845 U+6C3E # +3-4846 U+6C4E # +3-4847 U+7248 # +3-4848 U+72AF # +3-4849 U+73ED # +3-484A U+7554 # +3-484B U+7E41 # +3-484C U+822C # +3-484D U+85E9 # +3-484E U+8CA9 # +3-484F U+7BC4 # +3-4850 U+91C6 # +3-4851 U+7169 # +3-4852 U+9812 # +3-4853 U+98EF # +3-4854 U+633D # +3-4855 U+6669 # +3-4856 U+756A # +3-4857 U+76E4 # +3-4858 U+78D0 # +3-4859 U+8543 # +3-485A U+86EE # +3-485B U+532A # +3-485C U+5351 # +3-485D U+5426 # +3-485E U+5983 # +3-485F U+5E87 # +3-4860 U+5F7C # +3-4861 U+60B2 # +3-4862 U+6249 # +3-4863 U+6279 # +3-4864 U+62AB # +3-4865 U+6590 # +3-4866 U+6BD4 # +3-4867 U+6CCC # +3-4868 U+75B2 # +3-4869 U+76AE # +3-486A U+7891 # +3-486B U+79D8 # +3-486C U+7DCB # +3-486D U+7F77 # +3-486E U+80A5 # +3-486F U+88AB # +3-4870 U+8AB9 # +3-4871 U+8CBB # +3-4872 U+907F # +3-4873 U+975E # +3-4874 U+98DB # +3-4875 U+6A0B # +3-4876 U+7C38 # +3-4877 U+5099 # +3-4878 U+5C3E # +3-4879 U+5FAE # +3-487A U+6787 # +3-487B U+6BD8 # +3-487C U+7435 # +3-487D U+7709 # +3-487E U+7F8E # +3-4921 U+9F3B # +3-4922 U+67CA # +3-4923 U+7A17 # +3-4924 U+5339 # +3-4925 U+758B # +3-4926 U+9AED # +3-4927 U+5F66 # +3-4928 U+819D # +3-4929 U+83F1 # +3-492A U+8098 # +3-492B U+5F3C # +3-492C U+5FC5 # +3-492D U+7562 # +3-492E U+7B46 # +3-492F U+903C # +3-4930 U+6867 # +3-4931 U+59EB # +3-4932 U+5A9B # +3-4933 U+7D10 # +3-4934 U+767E # +3-4935 U+8B2C # +3-4936 U+4FF5 # +3-4937 U+5F6A # +3-4938 U+6A19 # +3-4939 U+6C37 # +3-493A U+6F02 # +3-493B U+74E2 # +3-493C U+7968 # +3-493D U+8868 # +3-493E U+8A55 # +3-493F U+8C79 # +3-4940 U+5EDF # +3-4941 U+63CF # +3-4942 U+75C5 # +3-4943 U+79D2 # +3-4944 U+82D7 # +3-4945 U+9328 # +3-4946 U+92F2 # +3-4947 U+849C # +3-4948 U+86ED # +3-4949 U+9C2D # +3-494A U+54C1 # +3-494B U+5F6C # +3-494C U+658C # +3-494D U+6D5C # +3-494E U+7015 # +3-494F U+8CA7 # +3-4950 U+8CD3 # +3-4951 U+983B # +3-4952 U+654F # +3-4953 U+74F6 # +3-4954 U+4E0D # +3-4955 U+4ED8 # +3-4956 U+57E0 # +3-4957 U+592B # +3-4958 U+5A66 # +3-4959 U+5BCC # +3-495A U+51A8 # +3-495B U+5E03 # +3-495C U+5E9C # +3-495D U+6016 # +3-495E U+6276 # +3-495F U+6577 # +3-4960 U+65A7 # +3-4961 U+666E # +3-4962 U+6D6E # +3-4963 U+7236 # +3-4964 U+7B26 # +3-4965 U+8150 # +3-4966 U+819A # +3-4967 U+8299 # +3-4968 U+8B5C # +3-4969 U+8CA0 # +3-496A U+8CE6 # +3-496B U+8D74 # +3-496C U+961C # +3-496D U+9644 # +3-496E U+4FAE # +3-496F U+64AB # +3-4970 U+6B66 # +3-4971 U+821E # +3-4972 U+8461 # +3-4973 U+856A # +3-4974 U+90E8 # +3-4975 U+5C01 # +3-4976 U+6953 # +3-4977 U+98A8 # +3-4978 U+847A # +3-4979 U+8557 # +3-497A U+4F0F # +3-497B U+526F # +3-497C U+5FA9 # +3-497D U+5E45 # +3-497E U+670D # +3-4A21 U+798F # +3-4A22 U+8179 # +3-4A23 U+8907 # +3-4A24 U+8986 # +3-4A25 U+6DF5 # +3-4A26 U+5F17 # +3-4A27 U+6255 # +3-4A28 U+6CB8 # +3-4A29 U+4ECF # +3-4A2A U+7269 # +3-4A2B U+9B92 # +3-4A2C U+5206 # +3-4A2D U+543B # +3-4A2E U+5674 # +3-4A2F U+58B3 # +3-4A30 U+61A4 # +3-4A31 U+626E # +3-4A32 U+711A # +3-4A33 U+596E # +3-4A34 U+7C89 # +3-4A35 U+7CDE # +3-4A36 U+7D1B # +3-4A37 U+96F0 # +3-4A38 U+6587 # +3-4A39 U+805E # +3-4A3A U+4E19 # +3-4A3B U+4F75 # +3-4A3C U+5175 # +3-4A3D U+5840 # +3-4A3E U+5E63 # +3-4A3F U+5E73 # +3-4A40 U+5F0A # +3-4A41 U+67C4 # +3-4A42 U+4E26 # +3-4A43 U+853D # +3-4A44 U+9589 # +3-4A45 U+965B # +3-4A46 U+7C73 # +3-4A47 U+9801 # +3-4A48 U+50FB # +3-4A49 U+58C1 # +3-4A4A U+7656 # +3-4A4B U+78A7 # +3-4A4C U+5225 # +3-4A4D U+77A5 # +3-4A4E U+8511 # +3-4A4F U+7B86 # +3-4A50 U+504F # +3-4A51 U+5909 # +3-4A52 U+7247 # +3-4A53 U+7BC7 # +3-4A54 U+7DE8 # +3-4A55 U+8FBA # +3-4A56 U+8FD4 # +3-4A57 U+904D # +3-4A58 U+4FBF # +3-4A59 U+52C9 # +3-4A5A U+5A29 # +3-4A5B U+5F01 # +3-4A5C U+97AD # +3-4A5D U+4FDD # +3-4A5E U+8217 # +3-4A5F U+92EA # +3-4A60 U+5703 # +3-4A61 U+6355 # +3-4A62 U+6B69 # +3-4A63 U+752B # +3-4A64 U+88DC # +3-4A65 U+8F14 # +3-4A66 U+7A42 # +3-4A67 U+52DF # +3-4A68 U+5893 # +3-4A69 U+6155 # +3-4A6A U+620A # +3-4A6B U+66AE # +3-4A6C U+6BCD # +3-4A6D U+7C3F # +3-4A6E U+83E9 # +3-4A6F U+5023 # +3-4A70 U+4FF8 # +3-4A71 U+5305 # +3-4A72 U+5446 # +3-4A73 U+5831 # +3-4A74 U+5949 # +3-4A75 U+5B9D # +3-4A76 U+5CF0 # +3-4A77 U+5CEF # +3-4A78 U+5D29 # +3-4A79 U+5E96 # +3-4A7A U+62B1 # +3-4A7B U+6367 # +3-4A7C U+653E # +3-4A7D U+65B9 # +3-4A7E U+670B # +3-4B21 U+6CD5 # +3-4B22 U+6CE1 # +3-4B23 U+70F9 # +3-4B24 U+7832 # +3-4B25 U+7E2B # +3-4B26 U+80DE # +3-4B27 U+82B3 # +3-4B28 U+840C # +3-4B29 U+84EC # +3-4B2A U+8702 # +3-4B2B U+8912 # +3-4B2C U+8A2A # +3-4B2D U+8C4A # +3-4B2E U+90A6 # +3-4B2F U+92D2 # +3-4B30 U+98FD # +3-4B31 U+9CF3 # +3-4B32 U+9D6C # +3-4B33 U+4E4F # +3-4B34 U+4EA1 # +3-4B35 U+508D # +3-4B36 U+5256 # +3-4B37 U+574A # +3-4B38 U+59A8 # +3-4B39 U+5E3D # +3-4B3A U+5FD8 # +3-4B3B U+5FD9 # +3-4B3C U+623F # +3-4B3D U+66B4 # +3-4B3E U+671B # +3-4B3F U+67D0 # +3-4B40 U+68D2 # +3-4B41 U+5192 # +3-4B42 U+7D21 # +3-4B43 U+80AA # +3-4B44 U+81A8 # +3-4B45 U+8B00 # +3-4B46 U+8C8C # +3-4B47 U+8CBF # +3-4B48 U+927E # +3-4B49 U+9632 # +3-4B4A U+5420 # +3-4B4B U+982C # +3-4B4C U+5317 # +3-4B4D U+50D5 # +3-4B4E U+535C # +3-4B4F U+58A8 # +3-4B50 U+64B2 # +3-4B51 U+6734 # +3-4B52 U+7267 # +3-4B53 U+7766 # +3-4B54 U+7A46 # +3-4B55 U+91E6 # +3-4B56 U+52C3 # +3-4B57 U+6CA1 # +3-4B58 U+6B86 # +3-4B59 U+5800 # +3-4B5A U+5E4C # +3-4B5B U+5954 # +3-4B5C U+672C # +3-4B5D U+7FFB # +3-4B5E U+51E1 # +3-4B5F U+76C6 # +3-4B60 U+6469 # +3-4B61 U+78E8 # +3-4B62 U+9B54 # +3-4B63 U+9EBB # +3-4B64 U+57CB # +3-4B65 U+59B9 # +3-4B66 U+6627 # +3-4B67 U+679A # +3-4B68 U+6BCE # +3-4B69 U+54E9 # +3-4B6A U+69D9 # +3-4B6B U+5E55 # +3-4B6C U+819C # +3-4B6D U+6795 # +3-4B6E U+9BAA # +3-4B6F U+67FE # +3-4B70 U+9C52 # +3-4B71 U+685D # +3-4B72 U+4EA6 # +3-4B73 U+4FE3 # +3-4B74 U+53C8 # +3-4B75 U+62B9 # +3-4B76 U+672B # +3-4B77 U+6CAB # +3-4B78 U+8FC4 # +3-4B79 U+4FAD # +3-4B7A U+7E6D # +3-4B7B U+9EBF # +3-4B7C U+4E07 # +3-4B7D U+6162 # +3-4B7E U+6E80 # +3-4C21 U+6F2B # +3-4C22 U+8513 # +3-4C23 U+5473 # +3-4C24 U+672A # +3-4C25 U+9B45 # +3-4C26 U+5DF3 # +3-4C27 U+7B95 # +3-4C28 U+5CAC # +3-4C29 U+5BC6 # +3-4C2A U+871C # +3-4C2B U+6E4A # +3-4C2C U+84D1 # +3-4C2D U+7A14 # +3-4C2E U+8108 # +3-4C2F U+5999 # +3-4C30 U+7C8D # +3-4C31 U+6C11 # +3-4C32 U+7720 # +3-4C33 U+52D9 # +3-4C34 U+5922 # +3-4C35 U+7121 # +3-4C36 U+725F # +3-4C37 U+77DB # +3-4C38 U+9727 # +3-4C39 U+9D61 # +3-4C3A U+690B # +3-4C3B U+5A7F # +3-4C3C U+5A18 # +3-4C3D U+51A5 # +3-4C3E U+540D # +3-4C3F U+547D # +3-4C40 U+660E # +3-4C41 U+76DF # +3-4C42 U+8FF7 # +3-4C43 U+9298 # +3-4C44 U+9CF4 # +3-4C45 U+59EA # +3-4C46 U+725D # +3-4C47 U+6EC5 # +3-4C48 U+514D # +3-4C49 U+68C9 # +3-4C4A U+7DBF # +3-4C4B U+7DEC # +3-4C4C U+9762 # +3-4C4D U+9EBA # +3-4C4E U+6478 # +3-4C4F U+6A21 # +3-4C50 U+8302 # +3-4C51 U+5984 # +3-4C52 U+5B5F # +3-4C53 U+6BDB # +3-4C54 U+731B # +3-4C55 U+76F2 # +3-4C56 U+7DB2 # +3-4C57 U+8017 # +3-4C58 U+8499 # +3-4C59 U+5132 # +3-4C5A U+6728 # +3-4C5B U+9ED9 # +3-4C5C U+76EE # +3-4C5D U+6762 # +3-4C5E U+52FF # +3-4C5F U+9905 # +3-4C60 U+5C24 # +3-4C61 U+623B # +3-4C62 U+7C7E # +3-4C63 U+8CB0 # +3-4C64 U+554F # +3-4C65 U+60B6 # +3-4C66 U+7D0B # +3-4C67 U+9580 # +3-4C68 U+5301 # +3-4C69 U+4E5F # +3-4C6A U+51B6 # +3-4C6B U+591C # +3-4C6C U+723A # +3-4C6D U+8036 # +3-4C6E U+91CE # +3-4C6F U+5F25 # +3-4C70 U+77E2 # +3-4C71 U+5384 # +3-4C72 U+5F79 # +3-4C73 U+7D04 # +3-4C74 U+85AC # +3-4C75 U+8A33 # +3-4C76 U+8E8D # +3-4C77 U+9756 # +3-4C78 U+67F3 # +3-4C79 U+85AE # +3-4C7A U+9453 # +3-4C7B U+6109 # +3-4C7C U+6108 # +3-4C7D U+6CB9 # +3-4C7E U+7652 # +3-4D21 U+8AED # +3-4D22 U+8F38 # +3-4D23 U+552F # +3-4D24 U+4F51 # +3-4D25 U+512A # +3-4D26 U+52C7 # +3-4D27 U+53CB # +3-4D28 U+5BA5 # +3-4D29 U+5E7D # +3-4D2A U+60A0 # +3-4D2B U+6182 # +3-4D2C U+63D6 # +3-4D2D U+6709 # +3-4D2E U+67DA # +3-4D2F U+6E67 # +3-4D30 U+6D8C # +3-4D31 U+7336 # +3-4D32 U+7337 # +3-4D33 U+7531 # +3-4D34 U+7950 # +3-4D35 U+88D5 # +3-4D36 U+8A98 # +3-4D37 U+904A # +3-4D38 U+9091 # +3-4D39 U+90F5 # +3-4D3A U+96C4 # +3-4D3B U+878D # +3-4D3C U+5915 # +3-4D3D U+4E88 # +3-4D3E U+4F59 # +3-4D3F U+4E0E # +3-4D40 U+8A89 # +3-4D41 U+8F3F # +3-4D42 U+9810 # +3-4D43 U+50AD # +3-4D44 U+5E7C # +3-4D45 U+5996 # +3-4D46 U+5BB9 # +3-4D47 U+5EB8 # +3-4D48 U+63DA # +3-4D49 U+63FA # +3-4D4A U+64C1 # +3-4D4B U+66DC # +3-4D4C U+694A # +3-4D4D U+69D8 # +3-4D4E U+6D0B # +3-4D4F U+6EB6 # +3-4D50 U+7194 # +3-4D51 U+7528 # +3-4D52 U+7AAF # +3-4D53 U+7F8A # +3-4D54 U+8000 # +3-4D55 U+8449 # +3-4D56 U+84C9 # +3-4D57 U+8981 # +3-4D58 U+8B21 # +3-4D59 U+8E0A # +3-4D5A U+9065 # +3-4D5B U+967D # +3-4D5C U+990A # +3-4D5D U+617E # +3-4D5E U+6291 # +3-4D5F U+6B32 # +3-4D60 U+6C83 # +3-4D61 U+6D74 # +3-4D62 U+7FCC # +3-4D63 U+7FFC # +3-4D64 U+6DC0 # +3-4D65 U+7F85 # +3-4D66 U+87BA # +3-4D67 U+88F8 # +3-4D68 U+6765 # +3-4D69 U+83B1 # +3-4D6A U+983C # +3-4D6B U+96F7 # +3-4D6C U+6D1B # +3-4D6D U+7D61 # +3-4D6E U+843D # +3-4D6F U+916A # +3-4D70 U+4E71 # +3-4D71 U+5375 # +3-4D72 U+5D50 # +3-4D73 U+6B04 # +3-4D74 U+6FEB # +3-4D75 U+85CD # +3-4D76 U+862D # +3-4D77 U+89A7 # +3-4D78 U+5229 # +3-4D79 U+540F # +3-4D7A U+5C65 # +3-4D7B U+674E # +3-4D7C U+68A8 # +3-4D7D U+7406 # +3-4D7E U+7483 # +3-4E21 U+75E2 # +3-4E22 U+88CF # +3-4E23 U+88E1 # +3-4E24 U+91CC # +3-4E25 U+96E2 # +3-4E26 U+9678 # +3-4E27 U+5F8B # +3-4E28 U+7387 # +3-4E29 U+7ACB # +3-4E2A U+844E # +3-4E2B U+63A0 # +3-4E2C U+7565 # +3-4E2D U+5289 # +3-4E2E U+6D41 # +3-4E2F U+6E9C # +3-4E30 U+7409 # +3-4E31 U+7559 # +3-4E32 U+786B # +3-4E33 U+7C92 # +3-4E34 U+9686 # +3-4E35 U+7ADC # +3-4E36 U+9F8D # +3-4E37 U+4FB6 # +3-4E38 U+616E # +3-4E39 U+65C5 # +3-4E3A U+865C # +3-4E3B U+4E86 # +3-4E3C U+4EAE # +3-4E3D U+50DA # +3-4E3E U+4E21 # +3-4E3F U+51CC # +3-4E40 U+5BEE # +3-4E41 U+6599 # +3-4E42 U+6881 # +3-4E43 U+6DBC # +3-4E44 U+731F # +3-4E45 U+7642 # +3-4E46 U+77AD # +3-4E47 U+7A1C # +3-4E48 U+7CE7 # +3-4E49 U+826F # +3-4E4A U+8AD2 # +3-4E4B U+907C # +3-4E4C U+91CF # +3-4E4D U+9675 # +3-4E4E U+9818 # +3-4E4F U+529B # +3-4E50 U+7DD1 # +3-4E51 U+502B # +3-4E52 U+5398 # +3-4E53 U+6797 # +3-4E54 U+6DCB # +3-4E55 U+71D0 # +3-4E56 U+7433 # +3-4E57 U+81E8 # +3-4E58 U+8F2A # +3-4E59 U+96A3 # +3-4E5A U+9C57 # +3-4E5B U+9E9F # +3-4E5C U+7460 # +3-4E5D U+5841 # +3-4E5E U+6D99 # +3-4E5F U+7D2F # +3-4E60 U+985E # +3-4E61 U+4EE4 # +3-4E62 U+4F36 # +3-4E63 U+4F8B # +3-4E64 U+51B7 # +3-4E65 U+52B1 # +3-4E66 U+5DBA # +3-4E67 U+601C # +3-4E68 U+73B2 # +3-4E69 U+793C # +3-4E6A U+82D3 # +3-4E6B U+9234 # +3-4E6C U+96B7 # +3-4E6D U+96F6 # +3-4E6E U+970A # +3-4E6F U+9E97 # +3-4E70 U+9F62 # +3-4E71 U+66A6 # +3-4E72 U+6B74 # +3-4E73 U+5217 # +3-4E74 U+52A3 # +3-4E75 U+70C8 # +3-4E76 U+88C2 # +3-4E77 U+5EC9 # +3-4E78 U+604B # +3-4E79 U+6190 # +3-4E7A U+6F23 # +3-4E7B U+7149 # +3-4E7C U+7C3E # +3-4E7D U+7DF4 # +3-4E7E U+806F # +3-4F21 U+84EE # +3-4F22 U+9023 # +3-4F23 U+932C # +3-4F24 U+5442 # +3-4F25 U+9B6F # +3-4F26 U+6AD3 # +3-4F27 U+7089 # +3-4F28 U+8CC2 # +3-4F29 U+8DEF # +3-4F2A U+9732 # +3-4F2B U+52B4 # +3-4F2C U+5A41 # +3-4F2D U+5ECA # +3-4F2E U+5F04 # +3-4F2F U+6717 # +3-4F30 U+697C # +3-4F31 U+6994 # +3-4F32 U+6D6A # +3-4F33 U+6F0F # +3-4F34 U+7262 # +3-4F35 U+72FC # +3-4F36 U+7BED # +3-4F37 U+8001 # +3-4F38 U+807E # +3-4F39 U+874B # +3-4F3A U+90CE # +3-4F3B U+516D # +3-4F3C U+9E93 # +3-4F3D U+7984 # +3-4F3E U+808B # +3-4F3F U+9332 # +3-4F40 U+8AD6 # +3-4F41 U+502D # +3-4F42 U+548C # +3-4F43 U+8A71 # +3-4F44 U+6B6A # +3-4F45 U+8CC4 # +3-4F46 U+8107 # +3-4F47 U+60D1 # +3-4F48 U+67A0 # +3-4F49 U+9DF2 # +3-4F4A U+4E99 # +3-4F4B U+4E98 # +3-4F4C U+9C10 # +3-4F4D U+8A6B # +3-4F4E U+85C1 # +3-4F4F U+8568 # +3-4F50 U+6900 # +3-4F51 U+6E7E # +3-4F52 U+7897 # +3-4F53 U+8155 # +3-4F54 U+20B9F # [2004] +3-4F55 U+5B41 # [2000] +3-4F56 U+5B56 # [2000] +3-4F57 U+5B7D # [2000] +3-4F58 U+5B93 # [2000] +3-4F59 U+5BD8 # [2000] +3-4F5A U+5BEC # [2000] +3-4F5B U+5C12 # [2000] +3-4F5C U+5C1E # [2000] +3-4F5D U+5C23 # [2000] +3-4F5E U+5C2B # [2000] +3-4F5F U+378D # [2000] +3-4F60 U+5C62 # [2000] +3-4F61 U+FA3B # CJK COMPATIBILITY IDEOGRAPH-FA3B [2000] [Unicode3.2] +3-4F62 U+FA3C # CJK COMPATIBILITY IDEOGRAPH-FA3C [2000] [Unicode3.2] +3-4F63 U+216B4 # [2000] [Unicode3.1] Private: U+F792 +3-4F64 U+5C7A # [2000] +3-4F65 U+5C8F # [2000] +3-4F66 U+5C9F # [2000] +3-4F67 U+5CA3 # [2000] +3-4F68 U+5CAA # [2000] +3-4F69 U+5CBA # [2000] +3-4F6A U+5CCB # [2000] +3-4F6B U+5CD0 # [2000] +3-4F6C U+5CD2 # [2000] +3-4F6D U+5CF4 # [2000] +3-4F6E U+21E34 # [2000] [Unicode3.1] Private: U+F793 +3-4F6F U+37E2 # [2000] +3-4F70 U+5D0D # [2000] +3-4F71 U+5D27 # [2000] +3-4F72 U+FA11 # CJK COMPATIBILITY IDEOGRAPH-FA11 [2000] +3-4F73 U+5D46 # [2000] +3-4F74 U+5D47 # [2000] +3-4F75 U+5D53 # [2000] +3-4F76 U+5D4A # [2000] +3-4F77 U+5D6D # [2000] +3-4F78 U+5D81 # [2000] +3-4F79 U+5DA0 # [2000] +3-4F7A U+5DA4 # [2000] +3-4F7B U+5DA7 # [2000] +3-4F7C U+5DB8 # [2000] +3-4F7D U+5DCB # [2000] +3-4F7E U+541E # [2004] +3-5021 U+5F0C # +3-5022 U+4E10 # +3-5023 U+4E15 # +3-5024 U+4E2A # +3-5025 U+4E31 # +3-5026 U+4E36 # +3-5027 U+4E3C # +3-5028 U+4E3F # +3-5029 U+4E42 # +3-502A U+4E56 # +3-502B U+4E58 # +3-502C U+4E82 # +3-502D U+4E85 # +3-502E U+8C6B # +3-502F U+4E8A # +3-5030 U+8212 # +3-5031 U+5F0D # +3-5032 U+4E8E # +3-5033 U+4E9E # +3-5034 U+4E9F # +3-5035 U+4EA0 # +3-5036 U+4EA2 # +3-5037 U+4EB0 # +3-5038 U+4EB3 # +3-5039 U+4EB6 # +3-503A U+4ECE # +3-503B U+4ECD # +3-503C U+4EC4 # +3-503D U+4EC6 # +3-503E U+4EC2 # +3-503F U+4ED7 # +3-5040 U+4EDE # +3-5041 U+4EED # +3-5042 U+4EDF # +3-5043 U+4EF7 # +3-5044 U+4F09 # +3-5045 U+4F5A # +3-5046 U+4F30 # +3-5047 U+4F5B # +3-5048 U+4F5D # +3-5049 U+4F57 # +3-504A U+4F47 # +3-504B U+4F76 # +3-504C U+4F88 # +3-504D U+4F8F # +3-504E U+4F98 # +3-504F U+4F7B # +3-5050 U+4F69 # +3-5051 U+4F70 # +3-5052 U+4F91 # +3-5053 U+4F6F # +3-5054 U+4F86 # +3-5055 U+4F96 # +3-5056 U+5118 # +3-5057 U+4FD4 # +3-5058 U+4FDF # +3-5059 U+4FCE # +3-505A U+4FD8 # +3-505B U+4FDB # +3-505C U+4FD1 # +3-505D U+4FDA # +3-505E U+4FD0 # +3-505F U+4FE4 # +3-5060 U+4FE5 # +3-5061 U+501A # +3-5062 U+5028 # +3-5063 U+5014 # +3-5064 U+502A # +3-5065 U+5025 # +3-5066 U+5005 # +3-5067 U+4F1C # +3-5068 U+4FF6 # +3-5069 U+5021 # +3-506A U+5029 # +3-506B U+502C # +3-506C U+4FFE # +3-506D U+4FEF # +3-506E U+5011 # +3-506F U+5006 # +3-5070 U+5043 # +3-5071 U+5047 # +3-5072 U+6703 # +3-5073 U+5055 # +3-5074 U+5050 # +3-5075 U+5048 # +3-5076 U+505A # +3-5077 U+5056 # +3-5078 U+506C # +3-5079 U+5078 # +3-507A U+5080 # +3-507B U+509A # +3-507C U+5085 # +3-507D U+50B4 # +3-507E U+50B2 # +3-5121 U+50C9 # +3-5122 U+50CA # +3-5123 U+50B3 # +3-5124 U+50C2 # +3-5125 U+50D6 # +3-5126 U+50DE # +3-5127 U+50E5 # +3-5128 U+50ED # +3-5129 U+50E3 # +3-512A U+50EE # +3-512B U+50F9 # +3-512C U+50F5 # +3-512D U+5109 # +3-512E U+5101 # +3-512F U+5102 # +3-5130 U+5116 # +3-5131 U+5115 # +3-5132 U+5114 # +3-5133 U+511A # +3-5134 U+5121 # +3-5135 U+513A # +3-5136 U+5137 # +3-5137 U+513C # +3-5138 U+513B # +3-5139 U+513F # +3-513A U+5140 # +3-513B U+5152 # +3-513C U+514C # +3-513D U+5154 # +3-513E U+5162 # +3-513F U+7AF8 # +3-5140 U+5169 # +3-5141 U+516A # +3-5142 U+516E # +3-5143 U+5180 # +3-5144 U+5182 # +3-5145 U+56D8 # +3-5146 U+518C # +3-5147 U+5189 # +3-5148 U+518F # +3-5149 U+5191 # +3-514A U+5193 # +3-514B U+5195 # +3-514C U+5196 # +3-514D U+51A4 # +3-514E U+51A6 # +3-514F U+51A2 # +3-5150 U+51A9 # +3-5151 U+51AA # +3-5152 U+51AB # +3-5153 U+51B3 # +3-5154 U+51B1 # +3-5155 U+51B2 # +3-5156 U+51B0 # +3-5157 U+51B5 # +3-5158 U+51BD # +3-5159 U+51C5 # +3-515A U+51C9 # +3-515B U+51DB # +3-515C U+51E0 # +3-515D U+8655 # +3-515E U+51E9 # +3-515F U+51ED # +3-5160 U+51F0 # +3-5161 U+51F5 # +3-5162 U+51FE # +3-5163 U+5204 # +3-5164 U+520B # +3-5165 U+5214 # +3-5166 U+520E # +3-5167 U+5227 # +3-5168 U+522A # +3-5169 U+522E # +3-516A U+5233 # +3-516B U+5239 # +3-516C U+524F # +3-516D U+5244 # +3-516E U+524B # +3-516F U+524C # +3-5170 U+525E # +3-5171 U+5254 # +3-5172 U+526A # +3-5173 U+5274 # +3-5174 U+5269 # +3-5175 U+5273 # +3-5176 U+527F # +3-5177 U+527D # +3-5178 U+528D # +3-5179 U+5294 # +3-517A U+5292 # +3-517B U+5271 # +3-517C U+5288 # +3-517D U+5291 # +3-517E U+8FA8 # +3-5221 U+8FA7 # +3-5222 U+52AC # +3-5223 U+52AD # +3-5224 U+52BC # +3-5225 U+52B5 # +3-5226 U+52C1 # +3-5227 U+52CD # +3-5228 U+52D7 # +3-5229 U+52DE # +3-522A U+52E3 # +3-522B U+52E6 # +3-522C U+98ED # +3-522D U+52E0 # +3-522E U+52F3 # +3-522F U+52F5 # +3-5230 U+52F8 # +3-5231 U+52F9 # +3-5232 U+5306 # +3-5233 U+5308 # +3-5234 U+7538 # +3-5235 U+530D # +3-5236 U+5310 # +3-5237 U+530F # +3-5238 U+5315 # +3-5239 U+531A # +3-523A U+5323 # +3-523B U+532F # +3-523C U+5331 # +3-523D U+5333 # +3-523E U+5338 # +3-523F U+5340 # +3-5240 U+5346 # +3-5241 U+5345 # +3-5242 U+4E17 # +3-5243 U+5349 # +3-5244 U+534D # +3-5245 U+51D6 # +3-5246 U+535E # +3-5247 U+5369 # +3-5248 U+536E # +3-5249 U+5918 # +3-524A U+537B # +3-524B U+5377 # +3-524C U+5382 # +3-524D U+5396 # +3-524E U+53A0 # +3-524F U+53A6 # +3-5250 U+53A5 # +3-5251 U+53AE # +3-5252 U+53B0 # +3-5253 U+53B6 # +3-5254 U+53C3 # +3-5255 U+7C12 # +3-5256 U+96D9 # +3-5257 U+53DF # +3-5258 U+66FC # +3-5259 U+71EE # +3-525A U+53EE # +3-525B U+53E8 # +3-525C U+53ED # +3-525D U+53FA # +3-525E U+5401 # +3-525F U+543D # +3-5260 U+5440 # +3-5261 U+542C # +3-5262 U+542D # +3-5263 U+543C # +3-5264 U+542E # +3-5265 U+5436 # +3-5266 U+5429 # +3-5267 U+541D # +3-5268 U+544E # +3-5269 U+548F # +3-526A U+5475 # +3-526B U+548E # +3-526C U+545F # +3-526D U+5471 # +3-526E U+5477 # +3-526F U+5470 # +3-5270 U+5492 # +3-5271 U+547B # +3-5272 U+5480 # +3-5273 U+5476 # +3-5274 U+5484 # +3-5275 U+5490 # +3-5276 U+5486 # +3-5277 U+54C7 # +3-5278 U+54A2 # +3-5279 U+54B8 # +3-527A U+54A5 # +3-527B U+54AC # +3-527C U+54C4 # +3-527D U+54C8 # +3-527E U+54A8 # +3-5321 U+54AB # +3-5322 U+54C2 # +3-5323 U+54A4 # +3-5324 U+54BE # +3-5325 U+54BC # +3-5326 U+54D8 # +3-5327 U+54E5 # +3-5328 U+54E6 # +3-5329 U+550F # +3-532A U+5514 # +3-532B U+54FD # +3-532C U+54EE # +3-532D U+54ED # +3-532E U+54FA # +3-532F U+54E2 # +3-5330 U+5539 # +3-5331 U+5540 # +3-5332 U+5563 # +3-5333 U+554C # +3-5334 U+552E # +3-5335 U+555C # +3-5336 U+5545 # +3-5337 U+5556 # +3-5338 U+5557 # +3-5339 U+5538 # +3-533A U+5533 # +3-533B U+555D # +3-533C U+5599 # +3-533D U+5580 # +3-533E U+54AF # +3-533F U+558A # +3-5340 U+559F # +3-5341 U+557B # +3-5342 U+557E # +3-5343 U+5598 # +3-5344 U+559E # +3-5345 U+55AE # +3-5346 U+557C # +3-5347 U+5583 # +3-5348 U+55A9 # +3-5349 U+5587 # +3-534A U+55A8 # +3-534B U+55DA # +3-534C U+55C5 # +3-534D U+55DF # +3-534E U+55C4 # +3-534F U+55DC # +3-5350 U+55E4 # +3-5351 U+55D4 # +3-5352 U+5614 # +3-5353 U+55F7 # +3-5354 U+5616 # +3-5355 U+55FE # +3-5356 U+55FD # +3-5357 U+561B # +3-5358 U+55F9 # +3-5359 U+564E # +3-535A U+5650 # +3-535B U+71DF # +3-535C U+5634 # +3-535D U+5636 # +3-535E U+5632 # +3-535F U+5638 # +3-5360 U+566B # +3-5361 U+5664 # +3-5362 U+562F # +3-5363 U+566C # +3-5364 U+566A # +3-5365 U+5686 # +3-5366 U+5680 # +3-5367 U+568A # +3-5368 U+56A0 # +3-5369 U+5694 # +3-536A U+568F # +3-536B U+56A5 # +3-536C U+56AE # +3-536D U+56B6 # +3-536E U+56B4 # +3-536F U+56C2 # +3-5370 U+56BC # +3-5371 U+56C1 # +3-5372 U+56C3 # +3-5373 U+56C0 # +3-5374 U+56C8 # +3-5375 U+56CE # +3-5376 U+56D1 # +3-5377 U+56D3 # +3-5378 U+56D7 # +3-5379 U+56EE # +3-537A U+56F9 # +3-537B U+5700 # +3-537C U+56FF # +3-537D U+5704 # +3-537E U+5709 # +3-5421 U+5708 # +3-5422 U+570B # +3-5423 U+570D # +3-5424 U+5713 # +3-5425 U+5718 # +3-5426 U+5716 # +3-5427 U+55C7 # +3-5428 U+571C # +3-5429 U+5726 # +3-542A U+5737 # +3-542B U+5738 # +3-542C U+574E # +3-542D U+573B # +3-542E U+5740 # +3-542F U+574F # +3-5430 U+5769 # +3-5431 U+57C0 # +3-5432 U+5788 # +3-5433 U+5761 # +3-5434 U+577F # +3-5435 U+5789 # +3-5436 U+5793 # +3-5437 U+57A0 # +3-5438 U+57B3 # +3-5439 U+57A4 # +3-543A U+57AA # +3-543B U+57B0 # +3-543C U+57C3 # +3-543D U+57C6 # +3-543E U+57D4 # +3-543F U+57D2 # +3-5440 U+57D3 # +3-5441 U+580A # +3-5442 U+57D6 # +3-5443 U+57E3 # +3-5444 U+580B # +3-5445 U+5819 # +3-5446 U+581D # +3-5447 U+5872 # +3-5448 U+5821 # +3-5449 U+5862 # +3-544A U+584B # +3-544B U+5870 # +3-544C U+6BC0 # +3-544D U+5852 # +3-544E U+583D # +3-544F U+5879 # +3-5450 U+5885 # +3-5451 U+58B9 # +3-5452 U+589F # +3-5453 U+58AB # +3-5454 U+58BA # +3-5455 U+58DE # +3-5456 U+58BB # +3-5457 U+58B8 # +3-5458 U+58AE # +3-5459 U+58C5 # +3-545A U+58D3 # +3-545B U+58D1 # +3-545C U+58D7 # +3-545D U+58D9 # +3-545E U+58D8 # +3-545F U+58E5 # +3-5460 U+58DC # +3-5461 U+58E4 # +3-5462 U+58DF # +3-5463 U+58EF # +3-5464 U+58FA # +3-5465 U+58F9 # +3-5466 U+58FB # +3-5467 U+58FC # +3-5468 U+58FD # +3-5469 U+5902 # +3-546A U+590A # +3-546B U+5910 # +3-546C U+591B # +3-546D U+68A6 # +3-546E U+5925 # +3-546F U+592C # +3-5470 U+592D # +3-5471 U+5932 # +3-5472 U+5938 # +3-5473 U+593E # +3-5474 U+7AD2 # +3-5475 U+5955 # +3-5476 U+5950 # +3-5477 U+594E # +3-5478 U+595A # +3-5479 U+5958 # +3-547A U+5962 # +3-547B U+5960 # +3-547C U+5967 # +3-547D U+596C # +3-547E U+5969 # +3-5521 U+5978 # +3-5522 U+5981 # +3-5523 U+599D # +3-5524 U+4F5E # +3-5525 U+4FAB # +3-5526 U+59A3 # +3-5527 U+59B2 # +3-5528 U+59C6 # +3-5529 U+59E8 # +3-552A U+59DC # +3-552B U+598D # +3-552C U+59D9 # +3-552D U+59DA # +3-552E U+5A25 # +3-552F U+5A1F # +3-5530 U+5A11 # +3-5531 U+5A1C # +3-5532 U+5A09 # +3-5533 U+5A1A # +3-5534 U+5A40 # +3-5535 U+5A6C # +3-5536 U+5A49 # +3-5537 U+5A35 # +3-5538 U+5A36 # +3-5539 U+5A62 # +3-553A U+5A6A # +3-553B U+5A9A # +3-553C U+5ABC # +3-553D U+5ABE # +3-553E U+5ACB # +3-553F U+5AC2 # +3-5540 U+5ABD # +3-5541 U+5AE3 # +3-5542 U+5AD7 # +3-5543 U+5AE6 # +3-5544 U+5AE9 # +3-5545 U+5AD6 # +3-5546 U+5AFA # +3-5547 U+5AFB # +3-5548 U+5B0C # +3-5549 U+5B0B # +3-554A U+5B16 # +3-554B U+5B32 # +3-554C U+5AD0 # +3-554D U+5B2A # +3-554E U+5B36 # +3-554F U+5B3E # +3-5550 U+5B43 # +3-5551 U+5B45 # +3-5552 U+5B40 # +3-5553 U+5B51 # +3-5554 U+5B55 # +3-5555 U+5B5A # +3-5556 U+5B5B # +3-5557 U+5B65 # +3-5558 U+5B69 # +3-5559 U+5B70 # +3-555A U+5B73 # +3-555B U+5B75 # +3-555C U+5B78 # +3-555D U+6588 # +3-555E U+5B7A # +3-555F U+5B80 # +3-5560 U+5B83 # +3-5561 U+5BA6 # +3-5562 U+5BB8 # +3-5563 U+5BC3 # +3-5564 U+5BC7 # +3-5565 U+5BC9 # +3-5566 U+5BD4 # +3-5567 U+5BD0 # +3-5568 U+5BE4 # +3-5569 U+5BE6 # +3-556A U+5BE2 # +3-556B U+5BDE # +3-556C U+5BE5 # +3-556D U+5BEB # +3-556E U+5BF0 # +3-556F U+5BF6 # +3-5570 U+5BF3 # +3-5571 U+5C05 # +3-5572 U+5C07 # +3-5573 U+5C08 # +3-5574 U+5C0D # +3-5575 U+5C13 # +3-5576 U+5C20 # +3-5577 U+5C22 # +3-5578 U+5C28 # +3-5579 U+5C38 # +3-557A U+5C39 # +3-557B U+5C41 # +3-557C U+5C46 # +3-557D U+5C4E # +3-557E U+5C53 # +3-5621 U+5C50 # +3-5622 U+5C4F # +3-5623 U+5B71 # +3-5624 U+5C6C # +3-5625 U+5C6E # +3-5626 U+4E62 # +3-5627 U+5C76 # +3-5628 U+5C79 # +3-5629 U+5C8C # +3-562A U+5C91 # +3-562B U+5C94 # +3-562C U+599B # +3-562D U+5CAB # +3-562E U+5CBB # +3-562F U+5CB6 # +3-5630 U+5CBC # +3-5631 U+5CB7 # +3-5632 U+5CC5 # +3-5633 U+5CBE # +3-5634 U+5CC7 # +3-5635 U+5CD9 # +3-5636 U+5CE9 # +3-5637 U+5CFD # +3-5638 U+5CFA # +3-5639 U+5CED # +3-563A U+5D8C # +3-563B U+5CEA # +3-563C U+5D0B # +3-563D U+5D15 # +3-563E U+5D17 # +3-563F U+5D5C # +3-5640 U+5D1F # +3-5641 U+5D1B # +3-5642 U+5D11 # +3-5643 U+5D14 # +3-5644 U+5D22 # +3-5645 U+5D1A # +3-5646 U+5D19 # +3-5647 U+5D18 # +3-5648 U+5D4C # +3-5649 U+5D52 # +3-564A U+5D4E # +3-564B U+5D4B # +3-564C U+5D6C # +3-564D U+5D73 # +3-564E U+5D76 # +3-564F U+5D87 # +3-5650 U+5D84 # +3-5651 U+5D82 # +3-5652 U+5DA2 # +3-5653 U+5D9D # +3-5654 U+5DAC # +3-5655 U+5DAE # +3-5656 U+5DBD # +3-5657 U+5D90 # +3-5658 U+5DB7 # +3-5659 U+5DBC # +3-565A U+5DC9 # +3-565B U+5DCD # +3-565C U+5DD3 # +3-565D U+5DD2 # +3-565E U+5DD6 # +3-565F U+5DDB # +3-5660 U+5DEB # +3-5661 U+5DF2 # +3-5662 U+5DF5 # +3-5663 U+5E0B # +3-5664 U+5E1A # +3-5665 U+5E19 # +3-5666 U+5E11 # +3-5667 U+5E1B # +3-5668 U+5E36 # +3-5669 U+5E37 # +3-566A U+5E44 # +3-566B U+5E43 # +3-566C U+5E40 # +3-566D U+5E4E # +3-566E U+5E57 # +3-566F U+5E54 # +3-5670 U+5E5F # +3-5671 U+5E62 # +3-5672 U+5E64 # +3-5673 U+5E47 # +3-5674 U+5E75 # +3-5675 U+5E76 # +3-5676 U+5E7A # +3-5677 U+9EBC # +3-5678 U+5E7F # +3-5679 U+5EA0 # +3-567A U+5EC1 # +3-567B U+5EC2 # +3-567C U+5EC8 # +3-567D U+5ED0 # +3-567E U+5ECF # +3-5721 U+5ED6 # +3-5722 U+5EE3 # +3-5723 U+5EDD # +3-5724 U+5EDA # +3-5725 U+5EDB # +3-5726 U+5EE2 # +3-5727 U+5EE1 # +3-5728 U+5EE8 # +3-5729 U+5EE9 # +3-572A U+5EEC # +3-572B U+5EF1 # +3-572C U+5EF3 # +3-572D U+5EF0 # +3-572E U+5EF4 # +3-572F U+5EF8 # +3-5730 U+5EFE # +3-5731 U+5F03 # +3-5732 U+5F09 # +3-5733 U+5F5D # +3-5734 U+5F5C # +3-5735 U+5F0B # +3-5736 U+5F11 # +3-5737 U+5F16 # +3-5738 U+5F29 # +3-5739 U+5F2D # +3-573A U+5F38 # +3-573B U+5F41 # +3-573C U+5F48 # +3-573D U+5F4C # +3-573E U+5F4E # +3-573F U+5F2F # +3-5740 U+5F51 # +3-5741 U+5F56 # +3-5742 U+5F57 # +3-5743 U+5F59 # +3-5744 U+5F61 # +3-5745 U+5F6D # +3-5746 U+5F73 # +3-5747 U+5F77 # +3-5748 U+5F83 # +3-5749 U+5F82 # +3-574A U+5F7F # +3-574B U+5F8A # +3-574C U+5F88 # +3-574D U+5F91 # +3-574E U+5F87 # +3-574F U+5F9E # +3-5750 U+5F99 # +3-5751 U+5F98 # +3-5752 U+5FA0 # +3-5753 U+5FA8 # +3-5754 U+5FAD # +3-5755 U+5FBC # +3-5756 U+5FD6 # +3-5757 U+5FFB # +3-5758 U+5FE4 # +3-5759 U+5FF8 # +3-575A U+5FF1 # +3-575B U+5FDD # +3-575C U+60B3 # +3-575D U+5FFF # +3-575E U+6021 # +3-575F U+6060 # +3-5760 U+6019 # +3-5761 U+6010 # +3-5762 U+6029 # +3-5763 U+600E # +3-5764 U+6031 # +3-5765 U+601B # +3-5766 U+6015 # +3-5767 U+602B # +3-5768 U+6026 # +3-5769 U+600F # +3-576A U+603A # +3-576B U+605A # +3-576C U+6041 # +3-576D U+606A # +3-576E U+6077 # +3-576F U+605F # +3-5770 U+604A # +3-5771 U+6046 # +3-5772 U+604D # +3-5773 U+6063 # +3-5774 U+6043 # +3-5775 U+6064 # +3-5776 U+6042 # +3-5777 U+606C # +3-5778 U+606B # +3-5779 U+6059 # +3-577A U+6081 # +3-577B U+608D # +3-577C U+60E7 # +3-577D U+6083 # +3-577E U+609A # +3-5821 U+6084 # +3-5822 U+609B # +3-5823 U+6096 # +3-5824 U+6097 # +3-5825 U+6092 # +3-5826 U+60A7 # +3-5827 U+608B # +3-5828 U+60E1 # +3-5829 U+60B8 # +3-582A U+60E0 # +3-582B U+60D3 # +3-582C U+60B4 # +3-582D U+5FF0 # +3-582E U+60BD # +3-582F U+60C6 # +3-5830 U+60B5 # +3-5831 U+60D8 # +3-5832 U+614D # +3-5833 U+6115 # +3-5834 U+6106 # +3-5835 U+60F6 # +3-5836 U+60F7 # +3-5837 U+6100 # +3-5838 U+60F4 # +3-5839 U+60FA # +3-583A U+6103 # +3-583B U+6121 # +3-583C U+60FB # +3-583D U+60F1 # +3-583E U+610D # +3-583F U+610E # +3-5840 U+6147 # +3-5841 U+613E # +3-5842 U+6128 # +3-5843 U+6127 # +3-5844 U+614A # +3-5845 U+613F # +3-5846 U+613C # +3-5847 U+612C # +3-5848 U+6134 # +3-5849 U+613D # +3-584A U+6142 # +3-584B U+6144 # +3-584C U+6173 # +3-584D U+6177 # +3-584E U+6158 # +3-584F U+6159 # +3-5850 U+615A # +3-5851 U+616B # +3-5852 U+6174 # +3-5853 U+616F # +3-5854 U+6165 # +3-5855 U+6171 # +3-5856 U+615F # +3-5857 U+615D # +3-5858 U+6153 # +3-5859 U+6175 # +3-585A U+6199 # +3-585B U+6196 # +3-585C U+6187 # +3-585D U+61AC # +3-585E U+6194 # +3-585F U+619A # +3-5860 U+618A # +3-5861 U+6191 # +3-5862 U+61AB # +3-5863 U+61AE # +3-5864 U+61CC # +3-5865 U+61CA # +3-5866 U+61C9 # +3-5867 U+61F7 # +3-5868 U+61C8 # +3-5869 U+61C3 # +3-586A U+61C6 # +3-586B U+61BA # +3-586C U+61CB # +3-586D U+7F79 # +3-586E U+61CD # +3-586F U+61E6 # +3-5870 U+61E3 # +3-5871 U+61F6 # +3-5872 U+61FA # +3-5873 U+61F4 # +3-5874 U+61FF # +3-5875 U+61FD # +3-5876 U+61FC # +3-5877 U+61FE # +3-5878 U+6200 # +3-5879 U+6208 # +3-587A U+6209 # +3-587B U+620D # +3-587C U+620C # +3-587D U+6214 # +3-587E U+621B # +3-5921 U+621E # +3-5922 U+6221 # +3-5923 U+622A # +3-5924 U+622E # +3-5925 U+6230 # +3-5926 U+6232 # +3-5927 U+6233 # +3-5928 U+6241 # +3-5929 U+624E # +3-592A U+625E # +3-592B U+6263 # +3-592C U+625B # +3-592D U+6260 # +3-592E U+6268 # +3-592F U+627C # +3-5930 U+6282 # +3-5931 U+6289 # +3-5932 U+627E # +3-5933 U+6292 # +3-5934 U+6293 # +3-5935 U+6296 # +3-5936 U+62D4 # +3-5937 U+6283 # +3-5938 U+6294 # +3-5939 U+62D7 # +3-593A U+62D1 # +3-593B U+62BB # +3-593C U+62CF # +3-593D U+62FF # +3-593E U+62C6 # +3-593F U+64D4 # +3-5940 U+62C8 # +3-5941 U+62DC # +3-5942 U+62CC # +3-5943 U+62CA # +3-5944 U+62C2 # +3-5945 U+62C7 # +3-5946 U+629B # +3-5947 U+62C9 # +3-5948 U+630C # +3-5949 U+62EE # +3-594A U+62F1 # +3-594B U+6327 # +3-594C U+6302 # +3-594D U+6308 # +3-594E U+62EF # +3-594F U+62F5 # +3-5950 U+6350 # +3-5951 U+633E # +3-5952 U+634D # +3-5953 U+641C # +3-5954 U+634F # +3-5955 U+6396 # +3-5956 U+638E # +3-5957 U+6380 # +3-5958 U+63AB # +3-5959 U+6376 # +3-595A U+63A3 # +3-595B U+638F # +3-595C U+6389 # +3-595D U+639F # +3-595E U+63B5 # +3-595F U+636B # +3-5960 U+6369 # +3-5961 U+63BE # +3-5962 U+63E9 # +3-5963 U+63C0 # +3-5964 U+63C6 # +3-5965 U+63E3 # +3-5966 U+63C9 # +3-5967 U+63D2 # +3-5968 U+63F6 # +3-5969 U+63C4 # +3-596A U+6416 # +3-596B U+6434 # +3-596C U+6406 # +3-596D U+6413 # +3-596E U+6426 # +3-596F U+6436 # +3-5970 U+651D # +3-5971 U+6417 # +3-5972 U+6428 # +3-5973 U+640F # +3-5974 U+6467 # +3-5975 U+646F # +3-5976 U+6476 # +3-5977 U+644E # +3-5978 U+652A # +3-5979 U+6495 # +3-597A U+6493 # +3-597B U+64A5 # +3-597C U+64A9 # +3-597D U+6488 # +3-597E U+64BC # +3-5A21 U+64DA # +3-5A22 U+64D2 # +3-5A23 U+64C5 # +3-5A24 U+64C7 # +3-5A25 U+64BB # +3-5A26 U+64D8 # +3-5A27 U+64C2 # +3-5A28 U+64F1 # +3-5A29 U+64E7 # +3-5A2A U+8209 # +3-5A2B U+64E0 # +3-5A2C U+64E1 # +3-5A2D U+62AC # +3-5A2E U+64E3 # +3-5A2F U+64EF # +3-5A30 U+652C # +3-5A31 U+64F6 # +3-5A32 U+64F4 # +3-5A33 U+64F2 # +3-5A34 U+64FA # +3-5A35 U+6500 # +3-5A36 U+64FD # +3-5A37 U+6518 # +3-5A38 U+651C # +3-5A39 U+6505 # +3-5A3A U+6524 # +3-5A3B U+6523 # +3-5A3C U+652B # +3-5A3D U+6534 # +3-5A3E U+6535 # +3-5A3F U+6537 # +3-5A40 U+6536 # +3-5A41 U+6538 # +3-5A42 U+754B # +3-5A43 U+6548 # +3-5A44 U+6556 # +3-5A45 U+6555 # +3-5A46 U+654D # +3-5A47 U+6558 # +3-5A48 U+655E # +3-5A49 U+655D # +3-5A4A U+6572 # +3-5A4B U+6578 # +3-5A4C U+6582 # +3-5A4D U+6583 # +3-5A4E U+8B8A # +3-5A4F U+659B # +3-5A50 U+659F # +3-5A51 U+65AB # +3-5A52 U+65B7 # +3-5A53 U+65C3 # +3-5A54 U+65C6 # +3-5A55 U+65C1 # +3-5A56 U+65C4 # +3-5A57 U+65CC # +3-5A58 U+65D2 # +3-5A59 U+65DB # +3-5A5A U+65D9 # +3-5A5B U+65E0 # +3-5A5C U+65E1 # +3-5A5D U+65F1 # +3-5A5E U+6772 # +3-5A5F U+660A # +3-5A60 U+6603 # +3-5A61 U+65FB # +3-5A62 U+6773 # +3-5A63 U+6635 # +3-5A64 U+6636 # +3-5A65 U+6634 # +3-5A66 U+661C # +3-5A67 U+664F # +3-5A68 U+6644 # +3-5A69 U+6649 # +3-5A6A U+6641 # +3-5A6B U+665E # +3-5A6C U+665D # +3-5A6D U+6664 # +3-5A6E U+6667 # +3-5A6F U+6668 # +3-5A70 U+665F # +3-5A71 U+6662 # +3-5A72 U+6670 # +3-5A73 U+6683 # +3-5A74 U+6688 # +3-5A75 U+668E # +3-5A76 U+6689 # +3-5A77 U+6684 # +3-5A78 U+6698 # +3-5A79 U+669D # +3-5A7A U+66C1 # +3-5A7B U+66B9 # +3-5A7C U+66C9 # +3-5A7D U+66BE # +3-5A7E U+66BC # +3-5B21 U+66C4 # +3-5B22 U+66B8 # +3-5B23 U+66D6 # +3-5B24 U+66DA # +3-5B25 U+66E0 # +3-5B26 U+663F # +3-5B27 U+66E6 # +3-5B28 U+66E9 # +3-5B29 U+66F0 # +3-5B2A U+66F5 # +3-5B2B U+66F7 # +3-5B2C U+670F # +3-5B2D U+6716 # +3-5B2E U+671E # +3-5B2F U+6726 # +3-5B30 U+6727 # +3-5B31 U+9738 # +3-5B32 U+672E # +3-5B33 U+673F # +3-5B34 U+6736 # +3-5B35 U+6741 # +3-5B36 U+6738 # +3-5B37 U+6737 # +3-5B38 U+6746 # +3-5B39 U+675E # +3-5B3A U+6760 # +3-5B3B U+6759 # +3-5B3C U+6763 # +3-5B3D U+6764 # +3-5B3E U+6789 # +3-5B3F U+6770 # +3-5B40 U+67A9 # +3-5B41 U+677C # +3-5B42 U+676A # +3-5B43 U+678C # +3-5B44 U+678B # +3-5B45 U+67A6 # +3-5B46 U+67A1 # +3-5B47 U+6785 # +3-5B48 U+67B7 # +3-5B49 U+67EF # +3-5B4A U+67B4 # +3-5B4B U+67EC # +3-5B4C U+67B3 # +3-5B4D U+67E9 # +3-5B4E U+67B8 # +3-5B4F U+67E4 # +3-5B50 U+67DE # +3-5B51 U+67DD # +3-5B52 U+67E2 # +3-5B53 U+67EE # +3-5B54 U+67B9 # +3-5B55 U+67CE # +3-5B56 U+67C6 # +3-5B57 U+67E7 # +3-5B58 U+6A9C # +3-5B59 U+681E # +3-5B5A U+6846 # +3-5B5B U+6829 # +3-5B5C U+6840 # +3-5B5D U+684D # +3-5B5E U+6832 # +3-5B5F U+684E # +3-5B60 U+68B3 # +3-5B61 U+682B # +3-5B62 U+6859 # +3-5B63 U+6863 # +3-5B64 U+6877 # +3-5B65 U+687F # +3-5B66 U+689F # +3-5B67 U+688F # +3-5B68 U+68AD # +3-5B69 U+6894 # +3-5B6A U+689D # +3-5B6B U+689B # +3-5B6C U+6883 # +3-5B6D U+6AAE # +3-5B6E U+68B9 # +3-5B6F U+6874 # +3-5B70 U+68B5 # +3-5B71 U+68A0 # +3-5B72 U+68BA # +3-5B73 U+690F # +3-5B74 U+688D # +3-5B75 U+687E # +3-5B76 U+6901 # +3-5B77 U+68CA # +3-5B78 U+6908 # +3-5B79 U+68D8 # +3-5B7A U+6922 # +3-5B7B U+6926 # +3-5B7C U+68E1 # +3-5B7D U+690C # +3-5B7E U+68CD # +3-5C21 U+68D4 # +3-5C22 U+68E7 # +3-5C23 U+68D5 # +3-5C24 U+6936 # +3-5C25 U+6912 # +3-5C26 U+6904 # +3-5C27 U+68D7 # +3-5C28 U+68E3 # +3-5C29 U+6925 # +3-5C2A U+68F9 # +3-5C2B U+68E0 # +3-5C2C U+68EF # +3-5C2D U+6928 # +3-5C2E U+692A # +3-5C2F U+691A # +3-5C30 U+6923 # +3-5C31 U+6921 # +3-5C32 U+68C6 # +3-5C33 U+6979 # +3-5C34 U+6977 # +3-5C35 U+695C # +3-5C36 U+6978 # +3-5C37 U+696B # +3-5C38 U+6954 # +3-5C39 U+697E # +3-5C3A U+696E # +3-5C3B U+6939 # +3-5C3C U+6974 # +3-5C3D U+693D # +3-5C3E U+6959 # +3-5C3F U+6930 # +3-5C40 U+6961 # +3-5C41 U+695E # +3-5C42 U+695D # +3-5C43 U+6981 # +3-5C44 U+696A # +3-5C45 U+69B2 # +3-5C46 U+69AE # +3-5C47 U+69D0 # +3-5C48 U+69BF # +3-5C49 U+69C1 # +3-5C4A U+69D3 # +3-5C4B U+69BE # +3-5C4C U+69CE # +3-5C4D U+5BE8 # +3-5C4E U+69CA # +3-5C4F U+69DD # +3-5C50 U+69BB # +3-5C51 U+69C3 # +3-5C52 U+69A7 # +3-5C53 U+6A2E # +3-5C54 U+6991 # +3-5C55 U+69A0 # +3-5C56 U+699C # +3-5C57 U+6995 # +3-5C58 U+69B4 # +3-5C59 U+69DE # +3-5C5A U+69E8 # +3-5C5B U+6A02 # +3-5C5C U+6A1B # +3-5C5D U+69FF # +3-5C5E U+6B0A # +3-5C5F U+69F9 # +3-5C60 U+69F2 # +3-5C61 U+69E7 # +3-5C62 U+6A05 # +3-5C63 U+69B1 # +3-5C64 U+6A1E # +3-5C65 U+69ED # +3-5C66 U+6A14 # +3-5C67 U+69EB # +3-5C68 U+6A0A # +3-5C69 U+6A12 # +3-5C6A U+6AC1 # +3-5C6B U+6A23 # +3-5C6C U+6A13 # +3-5C6D U+6A44 # +3-5C6E U+6A0C # +3-5C6F U+6A72 # +3-5C70 U+6A36 # +3-5C71 U+6A78 # +3-5C72 U+6A47 # +3-5C73 U+6A62 # +3-5C74 U+6A59 # +3-5C75 U+6A66 # +3-5C76 U+6A48 # +3-5C77 U+6A38 # +3-5C78 U+6A22 # +3-5C79 U+6A90 # +3-5C7A U+6A8D # +3-5C7B U+6AA0 # +3-5C7C U+6A84 # +3-5C7D U+6AA2 # +3-5C7E U+6AA3 # +3-5D21 U+6A97 # +3-5D22 U+8617 # +3-5D23 U+6ABB # +3-5D24 U+6AC3 # +3-5D25 U+6AC2 # +3-5D26 U+6AB8 # +3-5D27 U+6AB3 # +3-5D28 U+6AAC # +3-5D29 U+6ADE # +3-5D2A U+6AD1 # +3-5D2B U+6ADF # +3-5D2C U+6AAA # +3-5D2D U+6ADA # +3-5D2E U+6AEA # +3-5D2F U+6AFB # +3-5D30 U+6B05 # +3-5D31 U+8616 # +3-5D32 U+6AFA # +3-5D33 U+6B12 # +3-5D34 U+6B16 # +3-5D35 U+9B31 # +3-5D36 U+6B1F # +3-5D37 U+6B38 # +3-5D38 U+6B37 # +3-5D39 U+76DC # +3-5D3A U+6B39 # +3-5D3B U+98EE # +3-5D3C U+6B47 # +3-5D3D U+6B43 # +3-5D3E U+6B49 # +3-5D3F U+6B50 # +3-5D40 U+6B59 # +3-5D41 U+6B54 # +3-5D42 U+6B5B # +3-5D43 U+6B5F # +3-5D44 U+6B61 # +3-5D45 U+6B78 # +3-5D46 U+6B79 # +3-5D47 U+6B7F # +3-5D48 U+6B80 # +3-5D49 U+6B84 # +3-5D4A U+6B83 # +3-5D4B U+6B8D # +3-5D4C U+6B98 # +3-5D4D U+6B95 # +3-5D4E U+6B9E # +3-5D4F U+6BA4 # +3-5D50 U+6BAA # +3-5D51 U+6BAB # +3-5D52 U+6BAF # +3-5D53 U+6BB2 # +3-5D54 U+6BB1 # +3-5D55 U+6BB3 # +3-5D56 U+6BB7 # +3-5D57 U+6BBC # +3-5D58 U+6BC6 # +3-5D59 U+6BCB # +3-5D5A U+6BD3 # +3-5D5B U+6BDF # +3-5D5C U+6BEC # +3-5D5D U+6BEB # +3-5D5E U+6BF3 # +3-5D5F U+6BEF # +3-5D60 U+9EBE # +3-5D61 U+6C08 # +3-5D62 U+6C13 # +3-5D63 U+6C14 # +3-5D64 U+6C1B # +3-5D65 U+6C24 # +3-5D66 U+6C23 # +3-5D67 U+6C5E # +3-5D68 U+6C55 # +3-5D69 U+6C62 # +3-5D6A U+6C6A # +3-5D6B U+6C82 # +3-5D6C U+6C8D # +3-5D6D U+6C9A # +3-5D6E U+6C81 # +3-5D6F U+6C9B # +3-5D70 U+6C7E # +3-5D71 U+6C68 # +3-5D72 U+6C73 # +3-5D73 U+6C92 # +3-5D74 U+6C90 # +3-5D75 U+6CC4 # +3-5D76 U+6CF1 # +3-5D77 U+6CD3 # +3-5D78 U+6CBD # +3-5D79 U+6CD7 # +3-5D7A U+6CC5 # +3-5D7B U+6CDD # +3-5D7C U+6CAE # +3-5D7D U+6CB1 # +3-5D7E U+6CBE # +3-5E21 U+6CBA # +3-5E22 U+6CDB # +3-5E23 U+6CEF # +3-5E24 U+6CD9 # +3-5E25 U+6CEA # +3-5E26 U+6D1F # +3-5E27 U+884D # +3-5E28 U+6D36 # +3-5E29 U+6D2B # +3-5E2A U+6D3D # +3-5E2B U+6D38 # +3-5E2C U+6D19 # +3-5E2D U+6D35 # +3-5E2E U+6D33 # +3-5E2F U+6D12 # +3-5E30 U+6D0C # +3-5E31 U+6D63 # +3-5E32 U+6D93 # +3-5E33 U+6D64 # +3-5E34 U+6D5A # +3-5E35 U+6D79 # +3-5E36 U+6D59 # +3-5E37 U+6D8E # +3-5E38 U+6D95 # +3-5E39 U+6FE4 # +3-5E3A U+6D85 # +3-5E3B U+6DF9 # +3-5E3C U+6E15 # +3-5E3D U+6E0A # +3-5E3E U+6DB5 # +3-5E3F U+6DC7 # +3-5E40 U+6DE6 # +3-5E41 U+6DB8 # +3-5E42 U+6DC6 # +3-5E43 U+6DEC # +3-5E44 U+6DDE # +3-5E45 U+6DCC # +3-5E46 U+6DE8 # +3-5E47 U+6DD2 # +3-5E48 U+6DC5 # +3-5E49 U+6DFA # +3-5E4A U+6DD9 # +3-5E4B U+6DE4 # +3-5E4C U+6DD5 # +3-5E4D U+6DEA # +3-5E4E U+6DEE # +3-5E4F U+6E2D # +3-5E50 U+6E6E # +3-5E51 U+6E2E # +3-5E52 U+6E19 # +3-5E53 U+6E72 # +3-5E54 U+6E5F # +3-5E55 U+6E3E # +3-5E56 U+6E23 # +3-5E57 U+6E6B # +3-5E58 U+6E2B # +3-5E59 U+6E76 # +3-5E5A U+6E4D # +3-5E5B U+6E1F # +3-5E5C U+6E43 # +3-5E5D U+6E3A # +3-5E5E U+6E4E # +3-5E5F U+6E24 # +3-5E60 U+6EFF # +3-5E61 U+6E1D # +3-5E62 U+6E38 # +3-5E63 U+6E82 # +3-5E64 U+6EAA # +3-5E65 U+6E98 # +3-5E66 U+6EC9 # +3-5E67 U+6EB7 # +3-5E68 U+6ED3 # +3-5E69 U+6EBD # +3-5E6A U+6EAF # +3-5E6B U+6EC4 # +3-5E6C U+6EB2 # +3-5E6D U+6ED4 # +3-5E6E U+6ED5 # +3-5E6F U+6E8F # +3-5E70 U+6EA5 # +3-5E71 U+6EC2 # +3-5E72 U+6E9F # +3-5E73 U+6F41 # +3-5E74 U+6F11 # +3-5E75 U+704C # +3-5E76 U+6EEC # +3-5E77 U+6EF8 # +3-5E78 U+6EFE # +3-5E79 U+6F3F # +3-5E7A U+6EF2 # +3-5E7B U+6F31 # +3-5E7C U+6EEF # +3-5E7D U+6F32 # +3-5E7E U+6ECC # +3-5F21 U+6F3E # +3-5F22 U+6F13 # +3-5F23 U+6EF7 # +3-5F24 U+6F86 # +3-5F25 U+6F7A # +3-5F26 U+6F78 # +3-5F27 U+6F81 # +3-5F28 U+6F80 # +3-5F29 U+6F6F # +3-5F2A U+6F5B # +3-5F2B U+6FF3 # +3-5F2C U+6F6D # +3-5F2D U+6F82 # +3-5F2E U+6F7C # +3-5F2F U+6F58 # +3-5F30 U+6F8E # +3-5F31 U+6F91 # +3-5F32 U+6FC2 # +3-5F33 U+6F66 # +3-5F34 U+6FB3 # +3-5F35 U+6FA3 # +3-5F36 U+6FA1 # +3-5F37 U+6FA4 # +3-5F38 U+6FB9 # +3-5F39 U+6FC6 # +3-5F3A U+6FAA # +3-5F3B U+6FDF # +3-5F3C U+6FD5 # +3-5F3D U+6FEC # +3-5F3E U+6FD4 # +3-5F3F U+6FD8 # +3-5F40 U+6FF1 # +3-5F41 U+6FEE # +3-5F42 U+6FDB # +3-5F43 U+7009 # +3-5F44 U+700B # +3-5F45 U+6FFA # +3-5F46 U+7011 # +3-5F47 U+7001 # +3-5F48 U+700F # +3-5F49 U+6FFE # +3-5F4A U+701B # +3-5F4B U+701A # +3-5F4C U+6F74 # +3-5F4D U+701D # +3-5F4E U+7018 # +3-5F4F U+701F # +3-5F50 U+7030 # +3-5F51 U+703E # +3-5F52 U+7032 # +3-5F53 U+7051 # +3-5F54 U+7063 # +3-5F55 U+7099 # +3-5F56 U+7092 # +3-5F57 U+70AF # +3-5F58 U+70F1 # +3-5F59 U+70AC # +3-5F5A U+70B8 # +3-5F5B U+70B3 # +3-5F5C U+70AE # +3-5F5D U+70DF # +3-5F5E U+70CB # +3-5F5F U+70DD # +3-5F60 U+70D9 # +3-5F61 U+7109 # +3-5F62 U+70FD # +3-5F63 U+711C # +3-5F64 U+7119 # +3-5F65 U+7165 # +3-5F66 U+7155 # +3-5F67 U+7188 # +3-5F68 U+7166 # +3-5F69 U+7162 # +3-5F6A U+714C # +3-5F6B U+7156 # +3-5F6C U+716C # +3-5F6D U+718F # +3-5F6E U+71FB # +3-5F6F U+7184 # +3-5F70 U+7195 # +3-5F71 U+71A8 # +3-5F72 U+71AC # +3-5F73 U+71D7 # +3-5F74 U+71B9 # +3-5F75 U+71BE # +3-5F76 U+71D2 # +3-5F77 U+71C9 # +3-5F78 U+71D4 # +3-5F79 U+71CE # +3-5F7A U+71E0 # +3-5F7B U+71EC # +3-5F7C U+71E7 # +3-5F7D U+71F5 # +3-5F7E U+71FC # +3-6021 U+71F9 # +3-6022 U+71FF # +3-6023 U+720D # +3-6024 U+7210 # +3-6025 U+721B # +3-6026 U+7228 # +3-6027 U+722D # +3-6028 U+722C # +3-6029 U+7230 # +3-602A U+7232 # +3-602B U+723B # +3-602C U+723C # +3-602D U+723F # +3-602E U+7240 # +3-602F U+7246 # +3-6030 U+724B # +3-6031 U+7258 # +3-6032 U+7274 # +3-6033 U+727E # +3-6034 U+7282 # +3-6035 U+7281 # +3-6036 U+7287 # +3-6037 U+7292 # +3-6038 U+7296 # +3-6039 U+72A2 # +3-603A U+72A7 # +3-603B U+72B9 # +3-603C U+72B2 # +3-603D U+72C3 # +3-603E U+72C6 # +3-603F U+72C4 # +3-6040 U+72CE # +3-6041 U+72D2 # +3-6042 U+72E2 # +3-6043 U+72E0 # +3-6044 U+72E1 # +3-6045 U+72F9 # +3-6046 U+72F7 # +3-6047 U+500F # +3-6048 U+7317 # +3-6049 U+730A # +3-604A U+731C # +3-604B U+7316 # +3-604C U+731D # +3-604D U+7334 # +3-604E U+732F # +3-604F U+7329 # +3-6050 U+7325 # +3-6051 U+733E # +3-6052 U+734E # +3-6053 U+734F # +3-6054 U+9ED8 # +3-6055 U+7357 # +3-6056 U+736A # +3-6057 U+7368 # +3-6058 U+7370 # +3-6059 U+7378 # +3-605A U+7375 # +3-605B U+737B # +3-605C U+737A # +3-605D U+73C8 # +3-605E U+73B3 # +3-605F U+73CE # +3-6060 U+73BB # +3-6061 U+73C0 # +3-6062 U+73E5 # +3-6063 U+73EE # +3-6064 U+73DE # +3-6065 U+74A2 # +3-6066 U+7405 # +3-6067 U+746F # +3-6068 U+7425 # +3-6069 U+73F8 # +3-606A U+7432 # +3-606B U+743A # +3-606C U+7455 # +3-606D U+743F # +3-606E U+745F # +3-606F U+7459 # +3-6070 U+7441 # +3-6071 U+745C # +3-6072 U+7469 # +3-6073 U+7470 # +3-6074 U+7463 # +3-6075 U+746A # +3-6076 U+7476 # +3-6077 U+747E # +3-6078 U+748B # +3-6079 U+749E # +3-607A U+74A7 # +3-607B U+74CA # +3-607C U+74CF # +3-607D U+74D4 # +3-607E U+73F1 # +3-6121 U+74E0 # +3-6122 U+74E3 # +3-6123 U+74E7 # +3-6124 U+74E9 # +3-6125 U+74EE # +3-6126 U+74F2 # +3-6127 U+74F0 # +3-6128 U+74F1 # +3-6129 U+74F8 # +3-612A U+74F7 # +3-612B U+7504 # +3-612C U+7503 # +3-612D U+7505 # +3-612E U+750C # +3-612F U+750E # +3-6130 U+750D # +3-6131 U+7515 # +3-6132 U+7513 # +3-6133 U+751E # +3-6134 U+7526 # +3-6135 U+752C # +3-6136 U+753C # +3-6137 U+7544 # +3-6138 U+754D # +3-6139 U+754A # +3-613A U+7549 # +3-613B U+755B # +3-613C U+7546 # +3-613D U+755A # +3-613E U+7569 # +3-613F U+7564 # +3-6140 U+7567 # +3-6141 U+756B # +3-6142 U+756D # +3-6143 U+7578 # +3-6144 U+7576 # +3-6145 U+7586 # +3-6146 U+7587 # +3-6147 U+7574 # +3-6148 U+758A # +3-6149 U+7589 # +3-614A U+7582 # +3-614B U+7594 # +3-614C U+759A # +3-614D U+759D # +3-614E U+75A5 # +3-614F U+75A3 # +3-6150 U+75C2 # +3-6151 U+75B3 # +3-6152 U+75C3 # +3-6153 U+75B5 # +3-6154 U+75BD # +3-6155 U+75B8 # +3-6156 U+75BC # +3-6157 U+75B1 # +3-6158 U+75CD # +3-6159 U+75CA # +3-615A U+75D2 # +3-615B U+75D9 # +3-615C U+75E3 # +3-615D U+75DE # +3-615E U+75FE # +3-615F U+75FF # +3-6160 U+75FC # +3-6161 U+7601 # +3-6162 U+75F0 # +3-6163 U+75FA # +3-6164 U+75F2 # +3-6165 U+75F3 # +3-6166 U+760B # +3-6167 U+760D # +3-6168 U+7609 # +3-6169 U+761F # +3-616A U+7627 # +3-616B U+7620 # +3-616C U+7621 # +3-616D U+7622 # +3-616E U+7624 # +3-616F U+7634 # +3-6170 U+7630 # +3-6171 U+763B # +3-6172 U+7647 # +3-6173 U+7648 # +3-6174 U+7646 # +3-6175 U+765C # +3-6176 U+7658 # +3-6177 U+7661 # +3-6178 U+7662 # +3-6179 U+7668 # +3-617A U+7669 # +3-617B U+766A # +3-617C U+7667 # +3-617D U+766C # +3-617E U+7670 # +3-6221 U+7672 # +3-6222 U+7676 # +3-6223 U+7678 # +3-6224 U+767C # +3-6225 U+7680 # +3-6226 U+7683 # +3-6227 U+7688 # +3-6228 U+768B # +3-6229 U+768E # +3-622A U+7696 # +3-622B U+7693 # +3-622C U+7699 # +3-622D U+769A # +3-622E U+76B0 # +3-622F U+76B4 # +3-6230 U+76B8 # +3-6231 U+76B9 # +3-6232 U+76BA # +3-6233 U+76C2 # +3-6234 U+76CD # +3-6235 U+76D6 # +3-6236 U+76D2 # +3-6237 U+76DE # +3-6238 U+76E1 # +3-6239 U+76E5 # +3-623A U+76E7 # +3-623B U+76EA # +3-623C U+862F # +3-623D U+76FB # +3-623E U+7708 # +3-623F U+7707 # +3-6240 U+7704 # +3-6241 U+7729 # +3-6242 U+7724 # +3-6243 U+771E # +3-6244 U+7725 # +3-6245 U+7726 # +3-6246 U+771B # +3-6247 U+7737 # +3-6248 U+7738 # +3-6249 U+7747 # +3-624A U+775A # +3-624B U+7768 # +3-624C U+776B # +3-624D U+775B # +3-624E U+7765 # +3-624F U+777F # +3-6250 U+777E # +3-6251 U+7779 # +3-6252 U+778E # +3-6253 U+778B # +3-6254 U+7791 # +3-6255 U+77A0 # +3-6256 U+779E # +3-6257 U+77B0 # +3-6258 U+77B6 # +3-6259 U+77B9 # +3-625A U+77BF # +3-625B U+77BC # +3-625C U+77BD # +3-625D U+77BB # +3-625E U+77C7 # +3-625F U+77CD # +3-6260 U+77D7 # +3-6261 U+77DA # +3-6262 U+77DC # +3-6263 U+77E3 # +3-6264 U+77EE # +3-6265 U+77FC # +3-6266 U+780C # +3-6267 U+7812 # +3-6268 U+7926 # +3-6269 U+7820 # +3-626A U+792A # +3-626B U+7845 # +3-626C U+788E # +3-626D U+7874 # +3-626E U+7886 # +3-626F U+787C # +3-6270 U+789A # +3-6271 U+788C # +3-6272 U+78A3 # +3-6273 U+78B5 # +3-6274 U+78AA # +3-6275 U+78AF # +3-6276 U+78D1 # +3-6277 U+78C6 # +3-6278 U+78CB # +3-6279 U+78D4 # +3-627A U+78BE # +3-627B U+78BC # +3-627C U+78C5 # +3-627D U+78CA # +3-627E U+78EC # +3-6321 U+78E7 # +3-6322 U+78DA # +3-6323 U+78FD # +3-6324 U+78F4 # +3-6325 U+7907 # +3-6326 U+7912 # +3-6327 U+7911 # +3-6328 U+7919 # +3-6329 U+792C # +3-632A U+792B # +3-632B U+7940 # +3-632C U+7960 # +3-632D U+7957 # +3-632E U+795F # +3-632F U+795A # +3-6330 U+7955 # +3-6331 U+7953 # +3-6332 U+797A # +3-6333 U+797F # +3-6334 U+798A # +3-6335 U+799D # +3-6336 U+79A7 # +3-6337 U+9F4B # +3-6338 U+79AA # +3-6339 U+79AE # +3-633A U+79B3 # +3-633B U+79B9 # +3-633C U+79BA # +3-633D U+79C9 # +3-633E U+79D5 # +3-633F U+79E7 # +3-6340 U+79EC # +3-6341 U+79E1 # +3-6342 U+79E3 # +3-6343 U+7A08 # +3-6344 U+7A0D # +3-6345 U+7A18 # +3-6346 U+7A19 # +3-6347 U+7A20 # +3-6348 U+7A1F # +3-6349 U+7980 # +3-634A U+7A31 # +3-634B U+7A3B # +3-634C U+7A3E # +3-634D U+7A37 # +3-634E U+7A43 # +3-634F U+7A57 # +3-6350 U+7A49 # +3-6351 U+7A61 # +3-6352 U+7A62 # +3-6353 U+7A69 # +3-6354 U+9F9D # +3-6355 U+7A70 # +3-6356 U+7A79 # +3-6357 U+7A7D # +3-6358 U+7A88 # +3-6359 U+7A97 # +3-635A U+7A95 # +3-635B U+7A98 # +3-635C U+7A96 # +3-635D U+7AA9 # +3-635E U+7AC8 # +3-635F U+7AB0 # +3-6360 U+7AB6 # +3-6361 U+7AC5 # +3-6362 U+7AC4 # +3-6363 U+7ABF # +3-6364 U+9083 # +3-6365 U+7AC7 # +3-6366 U+7ACA # +3-6367 U+7ACD # +3-6368 U+7ACF # +3-6369 U+7AD5 # +3-636A U+7AD3 # +3-636B U+7AD9 # +3-636C U+7ADA # +3-636D U+7ADD # +3-636E U+7AE1 # +3-636F U+7AE2 # +3-6370 U+7AE6 # +3-6371 U+7AED # +3-6372 U+7AF0 # +3-6373 U+7B02 # +3-6374 U+7B0F # +3-6375 U+7B0A # +3-6376 U+7B06 # +3-6377 U+7B33 # +3-6378 U+7B18 # +3-6379 U+7B19 # +3-637A U+7B1E # +3-637B U+7B35 # +3-637C U+7B28 # +3-637D U+7B36 # +3-637E U+7B50 # +3-6421 U+7B7A # +3-6422 U+7B04 # +3-6423 U+7B4D # +3-6424 U+7B0B # +3-6425 U+7B4C # +3-6426 U+7B45 # +3-6427 U+7B75 # +3-6428 U+7B65 # +3-6429 U+7B74 # +3-642A U+7B67 # +3-642B U+7B70 # +3-642C U+7B71 # +3-642D U+7B6C # +3-642E U+7B6E # +3-642F U+7B9D # +3-6430 U+7B98 # +3-6431 U+7B9F # +3-6432 U+7B8D # +3-6433 U+7B9C # +3-6434 U+7B9A # +3-6435 U+7B8B # +3-6436 U+7B92 # +3-6437 U+7B8F # +3-6438 U+7B5D # +3-6439 U+7B99 # +3-643A U+7BCB # +3-643B U+7BC1 # +3-643C U+7BCC # +3-643D U+7BCF # +3-643E U+7BB4 # +3-643F U+7BC6 # +3-6440 U+7BDD # +3-6441 U+7BE9 # +3-6442 U+7C11 # +3-6443 U+7C14 # +3-6444 U+7BE6 # +3-6445 U+7BE5 # +3-6446 U+7C60 # +3-6447 U+7C00 # +3-6448 U+7C07 # +3-6449 U+7C13 # +3-644A U+7BF3 # +3-644B U+7BF7 # +3-644C U+7C17 # +3-644D U+7C0D # +3-644E U+7BF6 # +3-644F U+7C23 # +3-6450 U+7C27 # +3-6451 U+7C2A # +3-6452 U+7C1F # +3-6453 U+7C37 # +3-6454 U+7C2B # +3-6455 U+7C3D # +3-6456 U+7C4C # +3-6457 U+7C43 # +3-6458 U+7C54 # +3-6459 U+7C4F # +3-645A U+7C40 # +3-645B U+7C50 # +3-645C U+7C58 # +3-645D U+7C5F # +3-645E U+7C64 # +3-645F U+7C56 # +3-6460 U+7C65 # +3-6461 U+7C6C # +3-6462 U+7C75 # +3-6463 U+7C83 # +3-6464 U+7C90 # +3-6465 U+7CA4 # +3-6466 U+7CAD # +3-6467 U+7CA2 # +3-6468 U+7CAB # +3-6469 U+7CA1 # +3-646A U+7CA8 # +3-646B U+7CB3 # +3-646C U+7CB2 # +3-646D U+7CB1 # +3-646E U+7CAE # +3-646F U+7CB9 # +3-6470 U+7CBD # +3-6471 U+7CC0 # +3-6472 U+7CC5 # +3-6473 U+7CC2 # +3-6474 U+7CD8 # +3-6475 U+7CD2 # +3-6476 U+7CDC # +3-6477 U+7CE2 # +3-6478 U+9B3B # +3-6479 U+7CEF # +3-647A U+7CF2 # +3-647B U+7CF4 # +3-647C U+7CF6 # +3-647D U+7CFA # +3-647E U+7D06 # +3-6521 U+7D02 # +3-6522 U+7D1C # +3-6523 U+7D15 # +3-6524 U+7D0A # +3-6525 U+7D45 # +3-6526 U+7D4B # +3-6527 U+7D2E # +3-6528 U+7D32 # +3-6529 U+7D3F # +3-652A U+7D35 # +3-652B U+7D46 # +3-652C U+7D73 # +3-652D U+7D56 # +3-652E U+7D4E # +3-652F U+7D72 # +3-6530 U+7D68 # +3-6531 U+7D6E # +3-6532 U+7D4F # +3-6533 U+7D63 # +3-6534 U+7D93 # +3-6535 U+7D89 # +3-6536 U+7D5B # +3-6537 U+7D8F # +3-6538 U+7D7D # +3-6539 U+7D9B # +3-653A U+7DBA # +3-653B U+7DAE # +3-653C U+7DA3 # +3-653D U+7DB5 # +3-653E U+7DC7 # +3-653F U+7DBD # +3-6540 U+7DAB # +3-6541 U+7E3D # +3-6542 U+7DA2 # +3-6543 U+7DAF # +3-6544 U+7DDC # +3-6545 U+7DB8 # +3-6546 U+7D9F # +3-6547 U+7DB0 # +3-6548 U+7DD8 # +3-6549 U+7DDD # +3-654A U+7DE4 # +3-654B U+7DDE # +3-654C U+7DFB # +3-654D U+7DF2 # +3-654E U+7DE1 # +3-654F U+7E05 # +3-6550 U+7E0A # +3-6551 U+7E23 # +3-6552 U+7E21 # +3-6553 U+7E12 # +3-6554 U+7E31 # +3-6555 U+7E1F # +3-6556 U+7E09 # +3-6557 U+7E0B # +3-6558 U+7E22 # +3-6559 U+7E46 # +3-655A U+7E66 # +3-655B U+7E3B # +3-655C U+7E35 # +3-655D U+7E39 # +3-655E U+7E43 # +3-655F U+7E37 # +3-6560 U+7E32 # +3-6561 U+7E3A # +3-6562 U+7E67 # +3-6563 U+7E5D # +3-6564 U+7E56 # +3-6565 U+7E5E # +3-6566 U+7E59 # +3-6567 U+7E5A # +3-6568 U+7E79 # +3-6569 U+7E6A # +3-656A U+7E69 # +3-656B U+7E7C # +3-656C U+7E7B # +3-656D U+7E83 # +3-656E U+7DD5 # +3-656F U+7E7D # +3-6570 U+8FAE # +3-6571 U+7E7F # +3-6572 U+7E88 # +3-6573 U+7E89 # +3-6574 U+7E8C # +3-6575 U+7E92 # +3-6576 U+7E90 # +3-6577 U+7E93 # +3-6578 U+7E94 # +3-6579 U+7E96 # +3-657A U+7E8E # +3-657B U+7E9B # +3-657C U+7E9C # +3-657D U+7F38 # +3-657E U+7F3A # +3-6621 U+7F45 # +3-6622 U+7F4C # +3-6623 U+7F4D # +3-6624 U+7F4E # +3-6625 U+7F50 # +3-6626 U+7F51 # +3-6627 U+7F55 # +3-6628 U+7F54 # +3-6629 U+7F58 # +3-662A U+7F5F # +3-662B U+7F60 # +3-662C U+7F68 # +3-662D U+7F69 # +3-662E U+7F67 # +3-662F U+7F78 # +3-6630 U+7F82 # +3-6631 U+7F86 # +3-6632 U+7F83 # +3-6633 U+7F88 # +3-6634 U+7F87 # +3-6635 U+7F8C # +3-6636 U+7F94 # +3-6637 U+7F9E # +3-6638 U+7F9D # +3-6639 U+7F9A # +3-663A U+7FA3 # +3-663B U+7FAF # +3-663C U+7FB2 # +3-663D U+7FB9 # +3-663E U+7FAE # +3-663F U+7FB6 # +3-6640 U+7FB8 # +3-6641 U+8B71 # +3-6642 U+7FC5 # +3-6643 U+7FC6 # +3-6644 U+7FCA # +3-6645 U+7FD5 # +3-6646 U+7FD4 # +3-6647 U+7FE1 # +3-6648 U+7FE6 # +3-6649 U+7FE9 # +3-664A U+7FF3 # +3-664B U+7FF9 # +3-664C U+98DC # +3-664D U+8006 # +3-664E U+8004 # +3-664F U+800B # +3-6650 U+8012 # +3-6651 U+8018 # +3-6652 U+8019 # +3-6653 U+801C # +3-6654 U+8021 # +3-6655 U+8028 # +3-6656 U+803F # +3-6657 U+803B # +3-6658 U+804A # +3-6659 U+8046 # +3-665A U+8052 # +3-665B U+8058 # +3-665C U+805A # +3-665D U+805F # +3-665E U+8062 # +3-665F U+8068 # +3-6660 U+8073 # +3-6661 U+8072 # +3-6662 U+8070 # +3-6663 U+8076 # +3-6664 U+8079 # +3-6665 U+807D # +3-6666 U+807F # +3-6667 U+8084 # +3-6668 U+8086 # +3-6669 U+8085 # +3-666A U+809B # +3-666B U+8093 # +3-666C U+809A # +3-666D U+80AD # +3-666E U+5190 # +3-666F U+80AC # +3-6670 U+80DB # +3-6671 U+80E5 # +3-6672 U+80D9 # +3-6673 U+80DD # +3-6674 U+80C4 # +3-6675 U+80DA # +3-6676 U+80D6 # +3-6677 U+8109 # +3-6678 U+80EF # +3-6679 U+80F1 # +3-667A U+811B # +3-667B U+8129 # +3-667C U+8123 # +3-667D U+812F # +3-667E U+814B # +3-6721 U+968B # +3-6722 U+8146 # +3-6723 U+813E # +3-6724 U+8153 # +3-6725 U+8151 # +3-6726 U+80FC # +3-6727 U+8171 # +3-6728 U+816E # +3-6729 U+8165 # +3-672A U+8166 # +3-672B U+8174 # +3-672C U+8183 # +3-672D U+8188 # +3-672E U+818A # +3-672F U+8180 # +3-6730 U+8182 # +3-6731 U+81A0 # +3-6732 U+8195 # +3-6733 U+81A4 # +3-6734 U+81A3 # +3-6735 U+815F # +3-6736 U+8193 # +3-6737 U+81A9 # +3-6738 U+81B0 # +3-6739 U+81B5 # +3-673A U+81BE # +3-673B U+81B8 # +3-673C U+81BD # +3-673D U+81C0 # +3-673E U+81C2 # +3-673F U+81BA # +3-6740 U+81C9 # +3-6741 U+81CD # +3-6742 U+81D1 # +3-6743 U+81D9 # +3-6744 U+81D8 # +3-6745 U+81C8 # +3-6746 U+81DA # +3-6747 U+81DF # +3-6748 U+81E0 # +3-6749 U+81E7 # +3-674A U+81FA # +3-674B U+81FB # +3-674C U+81FE # +3-674D U+8201 # +3-674E U+8202 # +3-674F U+8205 # +3-6750 U+8207 # +3-6751 U+820A # +3-6752 U+820D # +3-6753 U+8210 # +3-6754 U+8216 # +3-6755 U+8229 # +3-6756 U+822B # +3-6757 U+8238 # +3-6758 U+8233 # +3-6759 U+8240 # +3-675A U+8259 # +3-675B U+8258 # +3-675C U+825D # +3-675D U+825A # +3-675E U+825F # +3-675F U+8264 # +3-6760 U+8262 # +3-6761 U+8268 # +3-6762 U+826A # +3-6763 U+826B # +3-6764 U+822E # +3-6765 U+8271 # +3-6766 U+8277 # +3-6767 U+8278 # +3-6768 U+827E # +3-6769 U+828D # +3-676A U+8292 # +3-676B U+82AB # +3-676C U+829F # +3-676D U+82BB # +3-676E U+82AC # +3-676F U+82E1 # +3-6770 U+82E3 # +3-6771 U+82DF # +3-6772 U+82D2 # +3-6773 U+82F4 # +3-6774 U+82F3 # +3-6775 U+82FA # +3-6776 U+8393 # +3-6777 U+8303 # +3-6778 U+82FB # +3-6779 U+82F9 # +3-677A U+82DE # +3-677B U+8306 # +3-677C U+82DC # +3-677D U+8309 # +3-677E U+82D9 # +3-6821 U+8335 # +3-6822 U+8334 # +3-6823 U+8316 # +3-6824 U+8332 # +3-6825 U+8331 # +3-6826 U+8340 # +3-6827 U+8339 # +3-6828 U+8350 # +3-6829 U+8345 # +3-682A U+832F # +3-682B U+832B # +3-682C U+8317 # +3-682D U+8318 # +3-682E U+8385 # +3-682F U+839A # +3-6830 U+83AA # +3-6831 U+839F # +3-6832 U+83A2 # +3-6833 U+8396 # +3-6834 U+8323 # +3-6835 U+838E # +3-6836 U+8387 # +3-6837 U+838A # +3-6838 U+837C # +3-6839 U+83B5 # +3-683A U+8373 # +3-683B U+8375 # +3-683C U+83A0 # +3-683D U+8389 # +3-683E U+83A8 # +3-683F U+83F4 # +3-6840 U+8413 # +3-6841 U+83EB # +3-6842 U+83CE # +3-6843 U+83FD # +3-6844 U+8403 # +3-6845 U+83D8 # +3-6846 U+840B # +3-6847 U+83C1 # +3-6848 U+83F7 # +3-6849 U+8407 # +3-684A U+83E0 # +3-684B U+83F2 # +3-684C U+840D # +3-684D U+8422 # +3-684E U+8420 # +3-684F U+83BD # +3-6850 U+8438 # +3-6851 U+8506 # +3-6852 U+83FB # +3-6853 U+846D # +3-6854 U+842A # +3-6855 U+843C # +3-6856 U+855A # +3-6857 U+8484 # +3-6858 U+8477 # +3-6859 U+846B # +3-685A U+84AD # +3-685B U+846E # +3-685C U+8482 # +3-685D U+8469 # +3-685E U+8446 # +3-685F U+842C # +3-6860 U+846F # +3-6861 U+8479 # +3-6862 U+8435 # +3-6863 U+84CA # +3-6864 U+8462 # +3-6865 U+84B9 # +3-6866 U+84BF # +3-6867 U+849F # +3-6868 U+84D9 # +3-6869 U+84CD # +3-686A U+84BB # +3-686B U+84DA # +3-686C U+84D0 # +3-686D U+84C1 # +3-686E U+84C6 # +3-686F U+84D6 # +3-6870 U+84A1 # +3-6871 U+8521 # +3-6872 U+84FF # +3-6873 U+84F4 # +3-6874 U+8517 # +3-6875 U+8518 # +3-6876 U+852C # +3-6877 U+851F # +3-6878 U+8515 # +3-6879 U+8514 # +3-687A U+84FC # +3-687B U+8540 # +3-687C U+8563 # +3-687D U+8558 # +3-687E U+8548 # +3-6921 U+8541 # +3-6922 U+8602 # +3-6923 U+854B # +3-6924 U+8555 # +3-6925 U+8580 # +3-6926 U+85A4 # +3-6927 U+8588 # +3-6928 U+8591 # +3-6929 U+858A # +3-692A U+85A8 # +3-692B U+856D # +3-692C U+8594 # +3-692D U+859B # +3-692E U+85EA # +3-692F U+8587 # +3-6930 U+859C # +3-6931 U+8577 # +3-6932 U+857E # +3-6933 U+8590 # +3-6934 U+85C9 # +3-6935 U+85BA # +3-6936 U+85CF # +3-6937 U+85B9 # +3-6938 U+85D0 # +3-6939 U+85D5 # +3-693A U+85DD # +3-693B U+85E5 # +3-693C U+85DC # +3-693D U+85F9 # +3-693E U+860A # +3-693F U+8613 # +3-6940 U+860B # +3-6941 U+85FE # +3-6942 U+85FA # +3-6943 U+8606 # +3-6944 U+8622 # +3-6945 U+861A # +3-6946 U+8630 # +3-6947 U+863F # +3-6948 U+864D # +3-6949 U+4E55 # +3-694A U+8654 # +3-694B U+865F # +3-694C U+8667 # +3-694D U+8671 # +3-694E U+8693 # +3-694F U+86A3 # +3-6950 U+86A9 # +3-6951 U+86AA # +3-6952 U+868B # +3-6953 U+868C # +3-6954 U+86B6 # +3-6955 U+86AF # +3-6956 U+86C4 # +3-6957 U+86C6 # +3-6958 U+86B0 # +3-6959 U+86C9 # +3-695A U+8823 # +3-695B U+86AB # +3-695C U+86D4 # +3-695D U+86DE # +3-695E U+86E9 # +3-695F U+86EC # +3-6960 U+86DF # +3-6961 U+86DB # +3-6962 U+86EF # +3-6963 U+8712 # +3-6964 U+8706 # +3-6965 U+8708 # +3-6966 U+8700 # +3-6967 U+8703 # +3-6968 U+86FB # +3-6969 U+8711 # +3-696A U+8709 # +3-696B U+870D # +3-696C U+86F9 # +3-696D U+870A # +3-696E U+8734 # +3-696F U+873F # +3-6970 U+8737 # +3-6971 U+873B # +3-6972 U+8725 # +3-6973 U+8729 # +3-6974 U+871A # +3-6975 U+8760 # +3-6976 U+875F # +3-6977 U+8778 # +3-6978 U+874C # +3-6979 U+874E # +3-697A U+8774 # +3-697B U+8757 # +3-697C U+8768 # +3-697D U+876E # +3-697E U+8759 # +3-6A21 U+8753 # +3-6A22 U+8763 # +3-6A23 U+876A # +3-6A24 U+8805 # +3-6A25 U+87A2 # +3-6A26 U+879F # +3-6A27 U+8782 # +3-6A28 U+87AF # +3-6A29 U+87CB # +3-6A2A U+87BD # +3-6A2B U+87C0 # +3-6A2C U+87D0 # +3-6A2D U+96D6 # +3-6A2E U+87AB # +3-6A2F U+87C4 # +3-6A30 U+87B3 # +3-6A31 U+87C7 # +3-6A32 U+87C6 # +3-6A33 U+87BB # +3-6A34 U+87EF # +3-6A35 U+87F2 # +3-6A36 U+87E0 # +3-6A37 U+880F # +3-6A38 U+880D # +3-6A39 U+87FE # +3-6A3A U+87F6 # +3-6A3B U+87F7 # +3-6A3C U+880E # +3-6A3D U+87D2 # +3-6A3E U+8811 # +3-6A3F U+8816 # +3-6A40 U+8815 # +3-6A41 U+8822 # +3-6A42 U+8821 # +3-6A43 U+8831 # +3-6A44 U+8836 # +3-6A45 U+8839 # +3-6A46 U+8827 # +3-6A47 U+883B # +3-6A48 U+8844 # +3-6A49 U+8842 # +3-6A4A U+8852 # +3-6A4B U+8859 # +3-6A4C U+885E # +3-6A4D U+8862 # +3-6A4E U+886B # +3-6A4F U+8881 # +3-6A50 U+887E # +3-6A51 U+889E # +3-6A52 U+8875 # +3-6A53 U+887D # +3-6A54 U+88B5 # +3-6A55 U+8872 # +3-6A56 U+8882 # +3-6A57 U+8897 # +3-6A58 U+8892 # +3-6A59 U+88AE # +3-6A5A U+8899 # +3-6A5B U+88A2 # +3-6A5C U+888D # +3-6A5D U+88A4 # +3-6A5E U+88B0 # +3-6A5F U+88BF # +3-6A60 U+88B1 # +3-6A61 U+88C3 # +3-6A62 U+88C4 # +3-6A63 U+88D4 # +3-6A64 U+88D8 # +3-6A65 U+88D9 # +3-6A66 U+88DD # +3-6A67 U+88F9 # +3-6A68 U+8902 # +3-6A69 U+88FC # +3-6A6A U+88F4 # +3-6A6B U+88E8 # +3-6A6C U+88F2 # +3-6A6D U+8904 # +3-6A6E U+890C # +3-6A6F U+890A # +3-6A70 U+8913 # +3-6A71 U+8943 # +3-6A72 U+891E # +3-6A73 U+8925 # +3-6A74 U+892A # +3-6A75 U+892B # +3-6A76 U+8941 # +3-6A77 U+8944 # +3-6A78 U+893B # +3-6A79 U+8936 # +3-6A7A U+8938 # +3-6A7B U+894C # +3-6A7C U+891D # +3-6A7D U+8960 # +3-6A7E U+895E # +3-6B21 U+8966 # +3-6B22 U+8964 # +3-6B23 U+896D # +3-6B24 U+896A # +3-6B25 U+896F # +3-6B26 U+8974 # +3-6B27 U+8977 # +3-6B28 U+897E # +3-6B29 U+8983 # +3-6B2A U+8988 # +3-6B2B U+898A # +3-6B2C U+8993 # +3-6B2D U+8998 # +3-6B2E U+89A1 # +3-6B2F U+89A9 # +3-6B30 U+89A6 # +3-6B31 U+89AC # +3-6B32 U+89AF # +3-6B33 U+89B2 # +3-6B34 U+89BA # +3-6B35 U+89BD # +3-6B36 U+89BF # +3-6B37 U+89C0 # +3-6B38 U+89DA # +3-6B39 U+89DC # +3-6B3A U+89DD # +3-6B3B U+89E7 # +3-6B3C U+89F4 # +3-6B3D U+89F8 # +3-6B3E U+8A03 # +3-6B3F U+8A16 # +3-6B40 U+8A10 # +3-6B41 U+8A0C # +3-6B42 U+8A1B # +3-6B43 U+8A1D # +3-6B44 U+8A25 # +3-6B45 U+8A36 # +3-6B46 U+8A41 # +3-6B47 U+8A5B # +3-6B48 U+8A52 # +3-6B49 U+8A46 # +3-6B4A U+8A48 # +3-6B4B U+8A7C # +3-6B4C U+8A6D # +3-6B4D U+8A6C # +3-6B4E U+8A62 # +3-6B4F U+8A85 # +3-6B50 U+8A82 # +3-6B51 U+8A84 # +3-6B52 U+8AA8 # +3-6B53 U+8AA1 # +3-6B54 U+8A91 # +3-6B55 U+8AA5 # +3-6B56 U+8AA6 # +3-6B57 U+8A9A # +3-6B58 U+8AA3 # +3-6B59 U+8AC4 # +3-6B5A U+8ACD # +3-6B5B U+8AC2 # +3-6B5C U+8ADA # +3-6B5D U+8AEB # +3-6B5E U+8AF3 # +3-6B5F U+8AE7 # +3-6B60 U+8AE4 # +3-6B61 U+8AF1 # +3-6B62 U+8B14 # +3-6B63 U+8AE0 # +3-6B64 U+8AE2 # +3-6B65 U+8AF7 # +3-6B66 U+8ADE # +3-6B67 U+8ADB # +3-6B68 U+8B0C # +3-6B69 U+8B07 # +3-6B6A U+8B1A # +3-6B6B U+8AE1 # +3-6B6C U+8B16 # +3-6B6D U+8B10 # +3-6B6E U+8B17 # +3-6B6F U+8B20 # +3-6B70 U+8B33 # +3-6B71 U+97AB # +3-6B72 U+8B26 # +3-6B73 U+8B2B # +3-6B74 U+8B3E # +3-6B75 U+8B28 # +3-6B76 U+8B41 # +3-6B77 U+8B4C # +3-6B78 U+8B4F # +3-6B79 U+8B4E # +3-6B7A U+8B49 # +3-6B7B U+8B56 # +3-6B7C U+8B5B # +3-6B7D U+8B5A # +3-6B7E U+8B6B # +3-6C21 U+8B5F # +3-6C22 U+8B6C # +3-6C23 U+8B6F # +3-6C24 U+8B74 # +3-6C25 U+8B7D # +3-6C26 U+8B80 # +3-6C27 U+8B8C # +3-6C28 U+8B8E # +3-6C29 U+8B92 # +3-6C2A U+8B93 # +3-6C2B U+8B96 # +3-6C2C U+8B99 # +3-6C2D U+8B9A # +3-6C2E U+8C3A # +3-6C2F U+8C41 # +3-6C30 U+8C3F # +3-6C31 U+8C48 # +3-6C32 U+8C4C # +3-6C33 U+8C4E # +3-6C34 U+8C50 # +3-6C35 U+8C55 # +3-6C36 U+8C62 # +3-6C37 U+8C6C # +3-6C38 U+8C78 # +3-6C39 U+8C7A # +3-6C3A U+8C82 # +3-6C3B U+8C89 # +3-6C3C U+8C85 # +3-6C3D U+8C8A # +3-6C3E U+8C8D # +3-6C3F U+8C8E # +3-6C40 U+8C94 # +3-6C41 U+8C7C # +3-6C42 U+8C98 # +3-6C43 U+621D # +3-6C44 U+8CAD # +3-6C45 U+8CAA # +3-6C46 U+8CBD # +3-6C47 U+8CB2 # +3-6C48 U+8CB3 # +3-6C49 U+8CAE # +3-6C4A U+8CB6 # +3-6C4B U+8CC8 # +3-6C4C U+8CC1 # +3-6C4D U+8CE4 # +3-6C4E U+8CE3 # +3-6C4F U+8CDA # +3-6C50 U+8CFD # +3-6C51 U+8CFA # +3-6C52 U+8CFB # +3-6C53 U+8D04 # +3-6C54 U+8D05 # +3-6C55 U+8D0A # +3-6C56 U+8D07 # +3-6C57 U+8D0F # +3-6C58 U+8D0D # +3-6C59 U+8D10 # +3-6C5A U+9F4E # +3-6C5B U+8D13 # +3-6C5C U+8CCD # +3-6C5D U+8D14 # +3-6C5E U+8D16 # +3-6C5F U+8D67 # +3-6C60 U+8D6D # +3-6C61 U+8D71 # +3-6C62 U+8D73 # +3-6C63 U+8D81 # +3-6C64 U+8D99 # +3-6C65 U+8DC2 # +3-6C66 U+8DBE # +3-6C67 U+8DBA # +3-6C68 U+8DCF # +3-6C69 U+8DDA # +3-6C6A U+8DD6 # +3-6C6B U+8DCC # +3-6C6C U+8DDB # +3-6C6D U+8DCB # +3-6C6E U+8DEA # +3-6C6F U+8DEB # +3-6C70 U+8DDF # +3-6C71 U+8DE3 # +3-6C72 U+8DFC # +3-6C73 U+8E08 # +3-6C74 U+8E09 # +3-6C75 U+8DFF # +3-6C76 U+8E1D # +3-6C77 U+8E1E # +3-6C78 U+8E10 # +3-6C79 U+8E1F # +3-6C7A U+8E42 # +3-6C7B U+8E35 # +3-6C7C U+8E30 # +3-6C7D U+8E34 # +3-6C7E U+8E4A # +3-6D21 U+8E47 # +3-6D22 U+8E49 # +3-6D23 U+8E4C # +3-6D24 U+8E50 # +3-6D25 U+8E48 # +3-6D26 U+8E59 # +3-6D27 U+8E64 # +3-6D28 U+8E60 # +3-6D29 U+8E2A # +3-6D2A U+8E63 # +3-6D2B U+8E55 # +3-6D2C U+8E76 # +3-6D2D U+8E72 # +3-6D2E U+8E7C # +3-6D2F U+8E81 # +3-6D30 U+8E87 # +3-6D31 U+8E85 # +3-6D32 U+8E84 # +3-6D33 U+8E8B # +3-6D34 U+8E8A # +3-6D35 U+8E93 # +3-6D36 U+8E91 # +3-6D37 U+8E94 # +3-6D38 U+8E99 # +3-6D39 U+8EAA # +3-6D3A U+8EA1 # +3-6D3B U+8EAC # +3-6D3C U+8EB0 # +3-6D3D U+8EC6 # +3-6D3E U+8EB1 # +3-6D3F U+8EBE # +3-6D40 U+8EC5 # +3-6D41 U+8EC8 # +3-6D42 U+8ECB # +3-6D43 U+8EDB # +3-6D44 U+8EE3 # +3-6D45 U+8EFC # +3-6D46 U+8EFB # +3-6D47 U+8EEB # +3-6D48 U+8EFE # +3-6D49 U+8F0A # +3-6D4A U+8F05 # +3-6D4B U+8F15 # +3-6D4C U+8F12 # +3-6D4D U+8F19 # +3-6D4E U+8F13 # +3-6D4F U+8F1C # +3-6D50 U+8F1F # +3-6D51 U+8F1B # +3-6D52 U+8F0C # +3-6D53 U+8F26 # +3-6D54 U+8F33 # +3-6D55 U+8F3B # +3-6D56 U+8F39 # +3-6D57 U+8F45 # +3-6D58 U+8F42 # +3-6D59 U+8F3E # +3-6D5A U+8F4C # +3-6D5B U+8F49 # +3-6D5C U+8F46 # +3-6D5D U+8F4E # +3-6D5E U+8F57 # +3-6D5F U+8F5C # +3-6D60 U+8F62 # +3-6D61 U+8F63 # +3-6D62 U+8F64 # +3-6D63 U+8F9C # +3-6D64 U+8F9F # +3-6D65 U+8FA3 # +3-6D66 U+8FAD # +3-6D67 U+8FAF # +3-6D68 U+8FB7 # +3-6D69 U+8FDA # +3-6D6A U+8FE5 # +3-6D6B U+8FE2 # +3-6D6C U+8FEA # +3-6D6D U+8FEF # +3-6D6E U+9087 # +3-6D6F U+8FF4 # +3-6D70 U+9005 # +3-6D71 U+8FF9 # +3-6D72 U+8FFA # +3-6D73 U+9011 # +3-6D74 U+9015 # +3-6D75 U+9021 # +3-6D76 U+900D # +3-6D77 U+901E # +3-6D78 U+9016 # +3-6D79 U+900B # +3-6D7A U+9027 # +3-6D7B U+9036 # +3-6D7C U+9035 # +3-6D7D U+9039 # +3-6D7E U+8FF8 # +3-6E21 U+904F # +3-6E22 U+9050 # +3-6E23 U+9051 # +3-6E24 U+9052 # +3-6E25 U+900E # +3-6E26 U+9049 # +3-6E27 U+903E # +3-6E28 U+9056 # +3-6E29 U+9058 # +3-6E2A U+905E # +3-6E2B U+9068 # +3-6E2C U+906F # +3-6E2D U+9076 # +3-6E2E U+96A8 # +3-6E2F U+9072 # +3-6E30 U+9082 # +3-6E31 U+907D # +3-6E32 U+9081 # +3-6E33 U+9080 # +3-6E34 U+908A # +3-6E35 U+9089 # +3-6E36 U+908F # +3-6E37 U+90A8 # +3-6E38 U+90AF # +3-6E39 U+90B1 # +3-6E3A U+90B5 # +3-6E3B U+90E2 # +3-6E3C U+90E4 # +3-6E3D U+6248 # +3-6E3E U+90DB # +3-6E3F U+9102 # +3-6E40 U+9112 # +3-6E41 U+9119 # +3-6E42 U+9132 # +3-6E43 U+9130 # +3-6E44 U+914A # +3-6E45 U+9156 # +3-6E46 U+9158 # +3-6E47 U+9163 # +3-6E48 U+9165 # +3-6E49 U+9169 # +3-6E4A U+9173 # +3-6E4B U+9172 # +3-6E4C U+918B # +3-6E4D U+9189 # +3-6E4E U+9182 # +3-6E4F U+91A2 # +3-6E50 U+91AB # +3-6E51 U+91AF # +3-6E52 U+91AA # +3-6E53 U+91B5 # +3-6E54 U+91B4 # +3-6E55 U+91BA # +3-6E56 U+91C0 # +3-6E57 U+91C1 # +3-6E58 U+91C9 # +3-6E59 U+91CB # +3-6E5A U+91D0 # +3-6E5B U+91D6 # +3-6E5C U+91DF # +3-6E5D U+91E1 # +3-6E5E U+91DB # +3-6E5F U+91FC # +3-6E60 U+91F5 # +3-6E61 U+91F6 # +3-6E62 U+921E # +3-6E63 U+91FF # +3-6E64 U+9214 # +3-6E65 U+922C # +3-6E66 U+9215 # +3-6E67 U+9211 # +3-6E68 U+925E # +3-6E69 U+9257 # +3-6E6A U+9245 # +3-6E6B U+9249 # +3-6E6C U+9264 # +3-6E6D U+9248 # +3-6E6E U+9295 # +3-6E6F U+923F # +3-6E70 U+924B # +3-6E71 U+9250 # +3-6E72 U+929C # +3-6E73 U+9296 # +3-6E74 U+9293 # +3-6E75 U+929B # +3-6E76 U+925A # +3-6E77 U+92CF # +3-6E78 U+92B9 # +3-6E79 U+92B7 # +3-6E7A U+92E9 # +3-6E7B U+930F # +3-6E7C U+92FA # +3-6E7D U+9344 # +3-6E7E U+932E # +3-6F21 U+9319 # +3-6F22 U+9322 # +3-6F23 U+931A # +3-6F24 U+9323 # +3-6F25 U+933A # +3-6F26 U+9335 # +3-6F27 U+933B # +3-6F28 U+935C # +3-6F29 U+9360 # +3-6F2A U+937C # +3-6F2B U+936E # +3-6F2C U+9356 # +3-6F2D U+93B0 # +3-6F2E U+93AC # +3-6F2F U+93AD # +3-6F30 U+9394 # +3-6F31 U+93B9 # +3-6F32 U+93D6 # +3-6F33 U+93D7 # +3-6F34 U+93E8 # +3-6F35 U+93E5 # +3-6F36 U+93D8 # +3-6F37 U+93C3 # +3-6F38 U+93DD # +3-6F39 U+93D0 # +3-6F3A U+93C8 # +3-6F3B U+93E4 # +3-6F3C U+941A # +3-6F3D U+9414 # +3-6F3E U+9413 # +3-6F3F U+9403 # +3-6F40 U+9407 # +3-6F41 U+9410 # +3-6F42 U+9436 # +3-6F43 U+942B # +3-6F44 U+9435 # +3-6F45 U+9421 # +3-6F46 U+943A # +3-6F47 U+9441 # +3-6F48 U+9452 # +3-6F49 U+9444 # +3-6F4A U+945B # +3-6F4B U+9460 # +3-6F4C U+9462 # +3-6F4D U+945E # +3-6F4E U+946A # +3-6F4F U+9229 # +3-6F50 U+9470 # +3-6F51 U+9475 # +3-6F52 U+9477 # +3-6F53 U+947D # +3-6F54 U+945A # +3-6F55 U+947C # +3-6F56 U+947E # +3-6F57 U+9481 # +3-6F58 U+947F # +3-6F59 U+9582 # +3-6F5A U+9587 # +3-6F5B U+958A # +3-6F5C U+9594 # +3-6F5D U+9596 # +3-6F5E U+9598 # +3-6F5F U+9599 # +3-6F60 U+95A0 # +3-6F61 U+95A8 # +3-6F62 U+95A7 # +3-6F63 U+95AD # +3-6F64 U+95BC # +3-6F65 U+95BB # +3-6F66 U+95B9 # +3-6F67 U+95BE # +3-6F68 U+95CA # +3-6F69 U+6FF6 # +3-6F6A U+95C3 # +3-6F6B U+95CD # +3-6F6C U+95CC # +3-6F6D U+95D5 # +3-6F6E U+95D4 # +3-6F6F U+95D6 # +3-6F70 U+95DC # +3-6F71 U+95E1 # +3-6F72 U+95E5 # +3-6F73 U+95E2 # +3-6F74 U+9621 # +3-6F75 U+9628 # +3-6F76 U+962E # +3-6F77 U+962F # +3-6F78 U+9642 # +3-6F79 U+964C # +3-6F7A U+964F # +3-6F7B U+964B # +3-6F7C U+9677 # +3-6F7D U+965C # +3-6F7E U+965E # +3-7021 U+965D # +3-7022 U+965F # +3-7023 U+9666 # +3-7024 U+9672 # +3-7025 U+966C # +3-7026 U+968D # +3-7027 U+9698 # +3-7028 U+9695 # +3-7029 U+9697 # +3-702A U+96AA # +3-702B U+96A7 # +3-702C U+96B1 # +3-702D U+96B2 # +3-702E U+96B0 # +3-702F U+96B4 # +3-7030 U+96B6 # +3-7031 U+96B8 # +3-7032 U+96B9 # +3-7033 U+96CE # +3-7034 U+96CB # +3-7035 U+96C9 # +3-7036 U+96CD # +3-7037 U+894D # +3-7038 U+96DC # +3-7039 U+970D # +3-703A U+96D5 # +3-703B U+96F9 # +3-703C U+9704 # +3-703D U+9706 # +3-703E U+9708 # +3-703F U+9713 # +3-7040 U+970E # +3-7041 U+9711 # +3-7042 U+970F # +3-7043 U+9716 # +3-7044 U+9719 # +3-7045 U+9724 # +3-7046 U+972A # +3-7047 U+9730 # +3-7048 U+9739 # +3-7049 U+973D # +3-704A U+973E # +3-704B U+9744 # +3-704C U+9746 # +3-704D U+9748 # +3-704E U+9742 # +3-704F U+9749 # +3-7050 U+975C # +3-7051 U+9760 # +3-7052 U+9764 # +3-7053 U+9766 # +3-7054 U+9768 # +3-7055 U+52D2 # +3-7056 U+976B # +3-7057 U+9771 # +3-7058 U+9779 # +3-7059 U+9785 # +3-705A U+977C # +3-705B U+9781 # +3-705C U+977A # +3-705D U+9786 # +3-705E U+978B # +3-705F U+978F # +3-7060 U+9790 # +3-7061 U+979C # +3-7062 U+97A8 # +3-7063 U+97A6 # +3-7064 U+97A3 # +3-7065 U+97B3 # +3-7066 U+97B4 # +3-7067 U+97C3 # +3-7068 U+97C6 # +3-7069 U+97C8 # +3-706A U+97CB # +3-706B U+97DC # +3-706C U+97ED # +3-706D U+9F4F # +3-706E U+97F2 # +3-706F U+7ADF # +3-7070 U+97F6 # +3-7071 U+97F5 # +3-7072 U+980F # +3-7073 U+980C # +3-7074 U+9838 # +3-7075 U+9824 # +3-7076 U+9821 # +3-7077 U+9837 # +3-7078 U+983D # +3-7079 U+9846 # +3-707A U+984F # +3-707B U+984B # +3-707C U+986B # +3-707D U+986F # +3-707E U+9870 # +3-7121 U+9871 # +3-7122 U+9874 # +3-7123 U+9873 # +3-7124 U+98AA # +3-7125 U+98AF # +3-7126 U+98B1 # +3-7127 U+98B6 # +3-7128 U+98C4 # +3-7129 U+98C3 # +3-712A U+98C6 # +3-712B U+98E9 # +3-712C U+98EB # +3-712D U+9903 # +3-712E U+9909 # +3-712F U+9912 # +3-7130 U+9914 # +3-7131 U+9918 # +3-7132 U+9921 # +3-7133 U+991D # +3-7134 U+991E # +3-7135 U+9924 # +3-7136 U+9920 # +3-7137 U+992C # +3-7138 U+992E # +3-7139 U+993D # +3-713A U+993E # +3-713B U+9942 # +3-713C U+9949 # +3-713D U+9945 # +3-713E U+9950 # +3-713F U+994B # +3-7140 U+9951 # +3-7141 U+9952 # +3-7142 U+994C # +3-7143 U+9955 # +3-7144 U+9997 # +3-7145 U+9998 # +3-7146 U+99A5 # +3-7147 U+99AD # +3-7148 U+99AE # +3-7149 U+99BC # +3-714A U+99DF # +3-714B U+99DB # +3-714C U+99DD # +3-714D U+99D8 # +3-714E U+99D1 # +3-714F U+99ED # +3-7150 U+99EE # +3-7151 U+99F1 # +3-7152 U+99F2 # +3-7153 U+99FB # +3-7154 U+99F8 # +3-7155 U+9A01 # +3-7156 U+9A0F # +3-7157 U+9A05 # +3-7158 U+99E2 # +3-7159 U+9A19 # +3-715A U+9A2B # +3-715B U+9A37 # +3-715C U+9A45 # +3-715D U+9A42 # +3-715E U+9A40 # +3-715F U+9A43 # +3-7160 U+9A3E # +3-7161 U+9A55 # +3-7162 U+9A4D # +3-7163 U+9A5B # +3-7164 U+9A57 # +3-7165 U+9A5F # +3-7166 U+9A62 # +3-7167 U+9A65 # +3-7168 U+9A64 # +3-7169 U+9A69 # +3-716A U+9A6B # +3-716B U+9A6A # +3-716C U+9AAD # +3-716D U+9AB0 # +3-716E U+9ABC # +3-716F U+9AC0 # +3-7170 U+9ACF # +3-7171 U+9AD1 # +3-7172 U+9AD3 # +3-7173 U+9AD4 # +3-7174 U+9ADE # +3-7175 U+9ADF # +3-7176 U+9AE2 # +3-7177 U+9AE3 # +3-7178 U+9AE6 # +3-7179 U+9AEF # +3-717A U+9AEB # +3-717B U+9AEE # +3-717C U+9AF4 # +3-717D U+9AF1 # +3-717E U+9AF7 # +3-7221 U+9AFB # +3-7222 U+9B06 # +3-7223 U+9B18 # +3-7224 U+9B1A # +3-7225 U+9B1F # +3-7226 U+9B22 # +3-7227 U+9B23 # +3-7228 U+9B25 # +3-7229 U+9B27 # +3-722A U+9B28 # +3-722B U+9B29 # +3-722C U+9B2A # +3-722D U+9B2E # +3-722E U+9B2F # +3-722F U+9B32 # +3-7230 U+9B44 # +3-7231 U+9B43 # +3-7232 U+9B4F # +3-7233 U+9B4D # +3-7234 U+9B4E # +3-7235 U+9B51 # +3-7236 U+9B58 # +3-7237 U+9B74 # +3-7238 U+9B93 # +3-7239 U+9B83 # +3-723A U+9B91 # +3-723B U+9B96 # +3-723C U+9B97 # +3-723D U+9B9F # +3-723E U+9BA0 # +3-723F U+9BA8 # +3-7240 U+9BB4 # +3-7241 U+9BC0 # +3-7242 U+9BCA # +3-7243 U+9BB9 # +3-7244 U+9BC6 # +3-7245 U+9BCF # +3-7246 U+9BD1 # +3-7247 U+9BD2 # +3-7248 U+9BE3 # +3-7249 U+9BE2 # +3-724A U+9BE4 # +3-724B U+9BD4 # +3-724C U+9BE1 # +3-724D U+9C3A # +3-724E U+9BF2 # +3-724F U+9BF1 # +3-7250 U+9BF0 # +3-7251 U+9C15 # +3-7252 U+9C14 # +3-7253 U+9C09 # +3-7254 U+9C13 # +3-7255 U+9C0C # +3-7256 U+9C06 # +3-7257 U+9C08 # +3-7258 U+9C12 # +3-7259 U+9C0A # +3-725A U+9C04 # +3-725B U+9C2E # +3-725C U+9C1B # +3-725D U+9C25 # +3-725E U+9C24 # +3-725F U+9C21 # +3-7260 U+9C30 # +3-7261 U+9C47 # +3-7262 U+9C32 # +3-7263 U+9C46 # +3-7264 U+9C3E # +3-7265 U+9C5A # +3-7266 U+9C60 # +3-7267 U+9C67 # +3-7268 U+9C76 # +3-7269 U+9C78 # +3-726A U+9CE7 # +3-726B U+9CEC # +3-726C U+9CF0 # +3-726D U+9D09 # +3-726E U+9D08 # +3-726F U+9CEB # +3-7270 U+9D03 # +3-7271 U+9D06 # +3-7272 U+9D2A # +3-7273 U+9D26 # +3-7274 U+9DAF # +3-7275 U+9D23 # +3-7276 U+9D1F # +3-7277 U+9D44 # +3-7278 U+9D15 # +3-7279 U+9D12 # +3-727A U+9D41 # +3-727B U+9D3F # +3-727C U+9D3E # +3-727D U+9D46 # +3-727E U+9D48 # +3-7321 U+9D5D # +3-7322 U+9D5E # +3-7323 U+9D64 # +3-7324 U+9D51 # +3-7325 U+9D50 # +3-7326 U+9D59 # +3-7327 U+9D72 # +3-7328 U+9D89 # +3-7329 U+9D87 # +3-732A U+9DAB # +3-732B U+9D6F # +3-732C U+9D7A # +3-732D U+9D9A # +3-732E U+9DA4 # +3-732F U+9DA9 # +3-7330 U+9DB2 # +3-7331 U+9DC4 # +3-7332 U+9DC1 # +3-7333 U+9DBB # +3-7334 U+9DB8 # +3-7335 U+9DBA # +3-7336 U+9DC6 # +3-7337 U+9DCF # +3-7338 U+9DC2 # +3-7339 U+9DD9 # +3-733A U+9DD3 # +3-733B U+9DF8 # +3-733C U+9DE6 # +3-733D U+9DED # +3-733E U+9DEF # +3-733F U+9DFD # +3-7340 U+9E1A # +3-7341 U+9E1B # +3-7342 U+9E1E # +3-7343 U+9E75 # +3-7344 U+9E79 # +3-7345 U+9E7D # +3-7346 U+9E81 # +3-7347 U+9E88 # +3-7348 U+9E8B # +3-7349 U+9E8C # +3-734A U+9E92 # +3-734B U+9E95 # +3-734C U+9E91 # +3-734D U+9E9D # +3-734E U+9EA5 # +3-734F U+9EA9 # +3-7350 U+9EB8 # +3-7351 U+9EAA # +3-7352 U+9EAD # +3-7353 U+9761 # +3-7354 U+9ECC # +3-7355 U+9ECE # +3-7356 U+9ECF # +3-7357 U+9ED0 # +3-7358 U+9ED4 # +3-7359 U+9EDC # +3-735A U+9EDE # +3-735B U+9EDD # +3-735C U+9EE0 # +3-735D U+9EE5 # +3-735E U+9EE8 # +3-735F U+9EEF # +3-7360 U+9EF4 # +3-7361 U+9EF6 # +3-7362 U+9EF7 # +3-7363 U+9EF9 # +3-7364 U+9EFB # +3-7365 U+9EFC # +3-7366 U+9EFD # +3-7367 U+9F07 # +3-7368 U+9F08 # +3-7369 U+76B7 # +3-736A U+9F15 # +3-736B U+9F21 # +3-736C U+9F2C # +3-736D U+9F3E # +3-736E U+9F4A # +3-736F U+9F52 # +3-7370 U+9F54 # +3-7371 U+9F63 # +3-7372 U+9F5F # +3-7373 U+9F60 # +3-7374 U+9F61 # +3-7375 U+9F66 # +3-7376 U+9F67 # +3-7377 U+9F6C # +3-7378 U+9F6A # +3-7379 U+9F77 # +3-737A U+9F72 # +3-737B U+9F76 # +3-737C U+9F95 # +3-737D U+9F9C # +3-737E U+9FA0 # +3-7421 U+582F # [1983] +3-7422 U+69C7 # [1983] +3-7423 U+9059 # [1983] +3-7424 U+7464 # [1983] +3-7425 U+51DC # [1990] +3-7426 U+7199 # [1990] +3-7427 U+5653 # [2004] +3-7428 U+5DE2 # [2000] +3-7429 U+5E14 # [2000] +3-742A U+5E18 # [2000] +3-742B U+5E58 # [2000] +3-742C U+5E5E # [2000] +3-742D U+5EBE # [2000] +3-742E U+F928 # CJK COMPATIBILITY IDEOGRAPH-F928 [2000] +3-742F U+5ECB # [2000] +3-7430 U+5EF9 # [2000] +3-7431 U+5F00 # [2000] +3-7432 U+5F02 # [2000] +3-7433 U+5F07 # [2000] +3-7434 U+5F1D # [2000] +3-7435 U+5F23 # [2000] +3-7436 U+5F34 # [2000] +3-7437 U+5F36 # [2000] +3-7438 U+5F3D # [2000] +3-7439 U+5F40 # [2000] +3-743A U+5F45 # [2000] +3-743B U+5F54 # [2000] +3-743C U+5F58 # [2000] +3-743D U+5F64 # [2000] +3-743E U+5F67 # [2000] +3-743F U+5F7D # [2000] +3-7440 U+5F89 # [2000] +3-7441 U+5F9C # [2000] +3-7442 U+5FA7 # [2000] +3-7443 U+5FAF # [2000] +3-7444 U+5FB5 # [2000] +3-7445 U+5FB7 # [2000] +3-7446 U+5FC9 # [2000] +3-7447 U+5FDE # [2000] +3-7448 U+5FE1 # [2000] +3-7449 U+5FE9 # [2000] +3-744A U+600D # [2000] +3-744B U+6014 # [2000] +3-744C U+6018 # [2000] +3-744D U+6033 # [2000] +3-744E U+6035 # [2000] +3-744F U+6047 # [2000] +3-7450 U+FA3D # CJK COMPATIBILITY IDEOGRAPH-FA3D [2000] [Unicode3.2] +3-7451 U+609D # [2000] +3-7452 U+609E # [2000] +3-7453 U+60CB # [2000] +3-7454 U+60D4 # [2000] +3-7455 U+60D5 # [2000] +3-7456 U+60DD # [2000] +3-7457 U+60F8 # [2000] +3-7458 U+611C # [2000] +3-7459 U+612B # [2000] +3-745A U+6130 # [2000] +3-745B U+6137 # [2000] +3-745C U+FA3E # CJK COMPATIBILITY IDEOGRAPH-FA3E [2000] [Unicode3.2] +3-745D U+618D # [2000] +3-745E U+FA3F # CJK COMPATIBILITY IDEOGRAPH-FA3F [2000] [Unicode3.2] +3-745F U+61BC # [2000] +3-7460 U+61B9 # [2000] +3-7461 U+FA40 # CJK COMPATIBILITY IDEOGRAPH-FA40 [2000] [Unicode3.2] +3-7462 U+6222 # [2000] +3-7463 U+623E # [2000] +3-7464 U+6243 # [2000] +3-7465 U+6256 # [2000] +3-7466 U+625A # [2000] +3-7467 U+626F # [2000] +3-7468 U+6285 # [2000] +3-7469 U+62C4 # [2000] +3-746A U+62D6 # [2000] +3-746B U+62FC # [2000] +3-746C U+630A # [2000] +3-746D U+6318 # [2000] +3-746E U+6339 # [2000] +3-746F U+6343 # [2000] +3-7470 U+6365 # [2000] +3-7471 U+637C # [2000] +3-7472 U+63E5 # [2000] +3-7473 U+63ED # [2000] +3-7474 U+63F5 # [2000] +3-7475 U+6410 # [2000] +3-7476 U+6414 # [2000] +3-7477 U+6422 # [2000] +3-7478 U+6479 # [2000] +3-7479 U+6451 # [2000] +3-747A U+6460 # [2000] +3-747B U+646D # [2000] +3-747C U+64CE # [2000] +3-747D U+64BE # [2000] +3-747E U+64BF # [2000] +3-7521 U+64C4 # [2000] +3-7522 U+64CA # [2000] +3-7523 U+64D0 # [2000] +3-7524 U+64F7 # [2000] +3-7525 U+64FB # [2000] +3-7526 U+6522 # [2000] +3-7527 U+6529 # [2000] +3-7528 U+FA41 # CJK COMPATIBILITY IDEOGRAPH-FA41 [2000] [Unicode3.2] +3-7529 U+6567 # [2000] +3-752A U+659D # [2000] +3-752B U+FA42 # CJK COMPATIBILITY IDEOGRAPH-FA42 [2000] [Unicode3.2] +3-752C U+6600 # [2000] +3-752D U+6609 # [2000] +3-752E U+6615 # [2000] +3-752F U+661E # [2000] +3-7530 U+663A # [2000] +3-7531 U+6622 # [2000] +3-7532 U+6624 # [2000] +3-7533 U+662B # [2000] +3-7534 U+6630 # [2000] +3-7535 U+6631 # [2000] +3-7536 U+6633 # [2000] +3-7537 U+66FB # [2000] +3-7538 U+6648 # [2000] +3-7539 U+664C # [2000] +3-753A U+231C4 # [2000] [Unicode3.1] Private: U+F79A +3-753B U+6659 # [2000] +3-753C U+665A # [2000] +3-753D U+6661 # [2000] +3-753E U+6665 # [2000] +3-753F U+6673 # [2000] +3-7540 U+6677 # [2000] +3-7541 U+6678 # [2000] +3-7542 U+668D # [2000] +3-7543 U+FA43 # CJK COMPATIBILITY IDEOGRAPH-FA43 [2000] [Unicode3.2] +3-7544 U+66A0 # [2000] +3-7545 U+66B2 # [2000] +3-7546 U+66BB # [2000] +3-7547 U+66C6 # [2000] +3-7548 U+66C8 # [2000] +3-7549 U+3B22 # [2000] +3-754A U+66DB # [2000] +3-754B U+66E8 # [2000] +3-754C U+66FA # [2000] +3-754D U+6713 # [2000] +3-754E U+F929 # CJK COMPATIBILITY IDEOGRAPH-F929 [2000] +3-754F U+6733 # [2000] +3-7550 U+6766 # [2000] +3-7551 U+6747 # [2000] +3-7552 U+6748 # [2000] +3-7553 U+677B # [2000] +3-7554 U+6781 # [2000] +3-7555 U+6793 # [2000] +3-7556 U+6798 # [2000] +3-7557 U+679B # [2000] +3-7558 U+67BB # [2000] +3-7559 U+67F9 # [2000] +3-755A U+67C0 # [2000] +3-755B U+67D7 # [2000] +3-755C U+67FC # [2000] +3-755D U+6801 # [2000] +3-755E U+6852 # [2000] +3-755F U+681D # [2000] +3-7560 U+682C # [2000] +3-7561 U+6831 # [2000] +3-7562 U+685B # [2000] +3-7563 U+6872 # [2000] +3-7564 U+6875 # [2000] +3-7565 U+FA44 # CJK COMPATIBILITY IDEOGRAPH-FA44 [2000] [Unicode3.2] +3-7566 U+68A3 # [2000] +3-7567 U+68A5 # [2000] +3-7568 U+68B2 # [2000] +3-7569 U+68C8 # [2000] +3-756A U+68D0 # [2000] +3-756B U+68E8 # [2000] +3-756C U+68ED # [2000] +3-756D U+68F0 # [2000] +3-756E U+68F1 # [2000] +3-756F U+68FC # [2000] +3-7570 U+690A # [2000] +3-7571 U+6949 # [2000] +3-7572 U+235C4 # [2000] [Unicode3.1] Private: U+F79D +3-7573 U+6935 # [2000] +3-7574 U+6942 # [2000] +3-7575 U+6957 # [2000] +3-7576 U+6963 # [2000] +3-7577 U+6964 # [2000] +3-7578 U+6968 # [2000] +3-7579 U+6980 # [2000] +3-757A U+FA14 # CJK COMPATIBILITY IDEOGRAPH-FA14 [2000] +3-757B U+69A5 # [2000] +3-757C U+69AD # [2000] +3-757D U+69CF # [2000] +3-757E U+3BB6 # [2000] +3-7621 U+3BC3 # [2000] +3-7622 U+69E2 # [2000] +3-7623 U+69E9 # [2000] +3-7624 U+69EA # [2000] +3-7625 U+69F5 # [2000] +3-7626 U+69F6 # [2000] +3-7627 U+6A0F # [2000] +3-7628 U+6A15 # [2000] +3-7629 U+2373F # [2000] [Unicode3.1] Private: U+F79F +3-762A U+6A3B # [2000] +3-762B U+6A3E # [2000] +3-762C U+6A45 # [2000] +3-762D U+6A50 # [2000] +3-762E U+6A56 # [2000] +3-762F U+6A5B # [2000] +3-7630 U+6A6B # [2000] +3-7631 U+6A73 # [2000] +3-7632 U+23763 # [2000] [Unicode3.1] Private: U+F7A0 +3-7633 U+6A89 # [2000] +3-7634 U+6A94 # [2000] +3-7635 U+6A9D # [2000] +3-7636 U+6A9E # [2000] +3-7637 U+6AA5 # [2000] +3-7638 U+6AE4 # [2000] +3-7639 U+6AE7 # [2000] +3-763A U+3C0F # [2000] +3-763B U+F91D # CJK COMPATIBILITY IDEOGRAPH-F91D [2000] +3-763C U+6B1B # [2000] +3-763D U+6B1E # [2000] +3-763E U+6B2C # [2000] +3-763F U+6B35 # [2000] +3-7640 U+6B46 # [2000] +3-7641 U+6B56 # [2000] +3-7642 U+6B60 # [2000] +3-7643 U+6B65 # [2000] +3-7644 U+6B67 # [2000] +3-7645 U+6B77 # [2000] +3-7646 U+6B82 # [2000] +3-7647 U+6BA9 # [2000] +3-7648 U+6BAD # [2000] +3-7649 U+F970 # CJK COMPATIBILITY IDEOGRAPH-F970 [2000] +3-764A U+6BCF # [2000] +3-764B U+6BD6 # [2000] +3-764C U+6BD7 # [2000] +3-764D U+6BFF # [2000] +3-764E U+6C05 # [2000] +3-764F U+6C10 # [2000] +3-7650 U+6C33 # [2000] +3-7651 U+6C59 # [2000] +3-7652 U+6C5C # [2000] +3-7653 U+6CAA # [2000] +3-7654 U+6C74 # [2000] +3-7655 U+6C76 # [2000] +3-7656 U+6C85 # [2000] +3-7657 U+6C86 # [2000] +3-7658 U+6C98 # [2000] +3-7659 U+6C9C # [2000] +3-765A U+6CFB # [2000] +3-765B U+6CC6 # [2000] +3-765C U+6CD4 # [2000] +3-765D U+6CE0 # [2000] +3-765E U+6CEB # [2000] +3-765F U+6CEE # [2000] +3-7660 U+23CFE # [2000] [Unicode3.1] Private: U+F7A1 +3-7661 U+6D04 # [2000] +3-7662 U+6D0E # [2000] +3-7663 U+6D2E # [2000] +3-7664 U+6D31 # [2000] +3-7665 U+6D39 # [2000] +3-7666 U+6D3F # [2000] +3-7667 U+6D58 # [2000] +3-7668 U+6D65 # [2000] +3-7669 U+FA45 # CJK COMPATIBILITY IDEOGRAPH-FA45 [2000] [Unicode3.2] +3-766A U+6D82 # [2000] +3-766B U+6D87 # [2000] +3-766C U+6D89 # [2000] +3-766D U+6D94 # [2000] +3-766E U+6DAA # [2000] +3-766F U+6DAC # [2000] +3-7670 U+6DBF # [2000] +3-7671 U+6DC4 # [2000] +3-7672 U+6DD6 # [2000] +3-7673 U+6DDA # [2000] +3-7674 U+6DDB # [2000] +3-7675 U+6DDD # [2000] +3-7676 U+6DFC # [2000] +3-7677 U+FA46 # CJK COMPATIBILITY IDEOGRAPH-FA46 [2000] [Unicode3.2] +3-7678 U+6E34 # [2000] +3-7679 U+6E44 # [2000] +3-767A U+6E5C # [2000] +3-767B U+6E5E # [2000] +3-767C U+6EAB # [2000] +3-767D U+6EB1 # [2000] +3-767E U+6EC1 # [2000] +3-7721 U+6EC7 # [2000] +3-7722 U+6ECE # [2000] +3-7723 U+6F10 # [2000] +3-7724 U+6F1A # [2000] +3-7725 U+FA47 # CJK COMPATIBILITY IDEOGRAPH-FA47 [2000] [Unicode3.2] +3-7726 U+6F2A # [2000] +3-7727 U+6F2F # [2000] +3-7728 U+6F33 # [2000] +3-7729 U+6F51 # [2000] +3-772A U+6F59 # [2000] +3-772B U+6F5E # [2000] +3-772C U+6F61 # [2000] +3-772D U+6F62 # [2000] +3-772E U+6F7E # [2000] +3-772F U+6F88 # [2000] +3-7730 U+6F8C # [2000] +3-7731 U+6F8D # [2000] +3-7732 U+6F94 # [2000] +3-7733 U+6FA0 # [2000] +3-7734 U+6FA7 # [2000] +3-7735 U+6FB6 # [2000] +3-7736 U+6FBC # [2000] +3-7737 U+6FC7 # [2000] +3-7738 U+6FCA # [2000] +3-7739 U+6FF9 # [2000] +3-773A U+6FF0 # [2000] +3-773B U+6FF5 # [2000] +3-773C U+7005 # [2000] +3-773D U+7006 # [2000] +3-773E U+7028 # [2000] +3-773F U+704A # [2000] +3-7740 U+705D # [2000] +3-7741 U+705E # [2000] +3-7742 U+704E # [2000] +3-7743 U+7064 # [2000] +3-7744 U+7075 # [2000] +3-7745 U+7085 # [2000] +3-7746 U+70A4 # [2000] +3-7747 U+70AB # [2000] +3-7748 U+70B7 # [2000] +3-7749 U+70D4 # [2000] +3-774A U+70D8 # [2000] +3-774B U+70E4 # [2000] +3-774C U+710F # [2000] +3-774D U+712B # [2000] +3-774E U+711E # [2000] +3-774F U+7120 # [2000] +3-7750 U+712E # [2000] +3-7751 U+7130 # [2000] +3-7752 U+7146 # [2000] +3-7753 U+7147 # [2000] +3-7754 U+7151 # [2000] +3-7755 U+FA48 # CJK COMPATIBILITY IDEOGRAPH-FA48 [2000] [Unicode3.2] +3-7756 U+7152 # [2000] +3-7757 U+715C # [2000] +3-7758 U+7160 # [2000] +3-7759 U+7168 # [2000] +3-775A U+FA15 # CJK COMPATIBILITY IDEOGRAPH-FA15 [2000] +3-775B U+7185 # [2000] +3-775C U+7187 # [2000] +3-775D U+7192 # [2000] +3-775E U+71C1 # [2000] +3-775F U+71BA # [2000] +3-7760 U+71C4 # [2000] +3-7761 U+71FE # [2000] +3-7762 U+7200 # [2000] +3-7763 U+7215 # [2000] +3-7764 U+7255 # [2000] +3-7765 U+7256 # [2000] +3-7766 U+3E3F # [2000] +3-7767 U+728D # [2000] +3-7768 U+729B # [2000] +3-7769 U+72BE # [2000] +3-776A U+72C0 # [2000] +3-776B U+72FB # [2000] +3-776C U+247F1 # [2000] [Unicode3.1] Private: U+F7A6 +3-776D U+7327 # [2000] +3-776E U+7328 # [2000] +3-776F U+FA16 # CJK COMPATIBILITY IDEOGRAPH-FA16 [2000] +3-7770 U+7350 # [2000] +3-7771 U+7366 # [2000] +3-7772 U+737C # [2000] +3-7773 U+7395 # [2000] +3-7774 U+739F # [2000] +3-7775 U+73A0 # [2000] +3-7776 U+73A2 # [2000] +3-7777 U+73A6 # [2000] +3-7778 U+73AB # [2000] +3-7779 U+73C9 # [2000] +3-777A U+73CF # [2000] +3-777B U+73D6 # [2000] +3-777C U+73D9 # [2000] +3-777D U+73E3 # [2000] +3-777E U+73E9 # [2000] +3-7821 U+7407 # [2000] +3-7822 U+740A # [2000] +3-7823 U+741A # [2000] +3-7824 U+741B # [2000] +3-7825 U+FA4A # CJK COMPATIBILITY IDEOGRAPH-FA4A [2000] [Unicode3.2] +3-7826 U+7426 # [2000] +3-7827 U+7428 # [2000] +3-7828 U+742A # [2000] +3-7829 U+742B # [2000] +3-782A U+742C # [2000] +3-782B U+742E # [2000] +3-782C U+742F # [2000] +3-782D U+7430 # [2000] +3-782E U+7444 # [2000] +3-782F U+7446 # [2000] +3-7830 U+7447 # [2000] +3-7831 U+744B # [2000] +3-7832 U+7457 # [2000] +3-7833 U+7462 # [2000] +3-7834 U+746B # [2000] +3-7835 U+746D # [2000] +3-7836 U+7486 # [2000] +3-7837 U+7487 # [2000] +3-7838 U+7489 # [2000] +3-7839 U+7498 # [2000] +3-783A U+749C # [2000] +3-783B U+749F # [2000] +3-783C U+74A3 # [2000] +3-783D U+7490 # [2000] +3-783E U+74A6 # [2000] +3-783F U+74A8 # [2000] +3-7840 U+74A9 # [2000] +3-7841 U+74B5 # [2000] +3-7842 U+74BF # [2000] +3-7843 U+74C8 # [2000] +3-7844 U+74C9 # [2000] +3-7845 U+74DA # [2000] +3-7846 U+74FF # [2000] +3-7847 U+7501 # [2000] +3-7848 U+7517 # [2000] +3-7849 U+752F # [2000] +3-784A U+756F # [2000] +3-784B U+7579 # [2000] +3-784C U+7592 # [2000] +3-784D U+3F72 # [2000] +3-784E U+75CE # [2000] +3-784F U+75E4 # [2000] +3-7850 U+7600 # [2000] +3-7851 U+7602 # [2000] +3-7852 U+7608 # [2000] +3-7853 U+7615 # [2000] +3-7854 U+7616 # [2000] +3-7855 U+7619 # [2000] +3-7856 U+761E # [2000] +3-7857 U+762D # [2000] +3-7858 U+7635 # [2000] +3-7859 U+7643 # [2000] +3-785A U+764B # [2000] +3-785B U+7664 # [2000] +3-785C U+7665 # [2000] +3-785D U+766D # [2000] +3-785E U+766F # [2000] +3-785F U+7671 # [2000] +3-7860 U+7681 # [2000] +3-7861 U+769B # [2000] +3-7862 U+769D # [2000] +3-7863 U+769E # [2000] +3-7864 U+76A6 # [2000] +3-7865 U+76AA # [2000] +3-7866 U+76B6 # [2000] +3-7867 U+76C5 # [2000] +3-7868 U+76CC # [2000] +3-7869 U+76CE # [2000] +3-786A U+76D4 # [2000] +3-786B U+76E6 # [2000] +3-786C U+76F1 # [2000] +3-786D U+76FC # [2000] +3-786E U+770A # [2000] +3-786F U+7719 # [2000] +3-7870 U+7734 # [2000] +3-7871 U+7736 # [2000] +3-7872 U+7746 # [2000] +3-7873 U+774D # [2000] +3-7874 U+774E # [2000] +3-7875 U+775C # [2000] +3-7876 U+775F # [2000] +3-7877 U+7762 # [2000] +3-7878 U+777A # [2000] +3-7879 U+7780 # [2000] +3-787A U+7794 # [2000] +3-787B U+77AA # [2000] +3-787C U+77E0 # [2000] +3-787D U+782D # [2000] +3-787E U+2548E # [2000] [Unicode3.1] Private: U+F7A8 +3-7921 U+7843 # [2000] +3-7922 U+784E # [2000] +3-7923 U+784F # [2000] +3-7924 U+7851 # [2000] +3-7925 U+7868 # [2000] +3-7926 U+786E # [2000] +3-7927 U+FA4B # CJK COMPATIBILITY IDEOGRAPH-FA4B [2000] [Unicode3.2] +3-7928 U+78B0 # [2000] +3-7929 U+2550E # [2000] [Unicode3.1] Private: U+F7AA +3-792A U+78AD # [2000] +3-792B U+78E4 # [2000] +3-792C U+78F2 # [2000] +3-792D U+7900 # [2000] +3-792E U+78F7 # [2000] +3-792F U+791C # [2000] +3-7930 U+792E # [2000] +3-7931 U+7931 # [2000] +3-7932 U+7934 # [2000] +3-7933 U+FA4C # CJK COMPATIBILITY IDEOGRAPH-FA4C [2000] [Unicode3.2] +3-7934 U+FA4D # CJK COMPATIBILITY IDEOGRAPH-FA4D [2000] [Unicode3.2] +3-7935 U+7945 # [2000] +3-7936 U+7946 # [2000] +3-7937 U+FA4E # CJK COMPATIBILITY IDEOGRAPH-FA4E [2000] [Unicode3.2] +3-7938 U+FA4F # CJK COMPATIBILITY IDEOGRAPH-FA4F [2000] [Unicode3.2] +3-7939 U+FA50 # CJK COMPATIBILITY IDEOGRAPH-FA50 [2000] [Unicode3.2] +3-793A U+795C # [2000] +3-793B U+FA51 # CJK COMPATIBILITY IDEOGRAPH-FA51 [2000] [Unicode3.2] +3-793C U+FA19 # CJK COMPATIBILITY IDEOGRAPH-FA19 [2000] +3-793D U+FA1A # CJK COMPATIBILITY IDEOGRAPH-FA1A [2000] +3-793E U+7979 # [2000] +3-793F U+FA52 # CJK COMPATIBILITY IDEOGRAPH-FA52 [2000] [Unicode3.2] +3-7940 U+FA53 # CJK COMPATIBILITY IDEOGRAPH-FA53 [2000] [Unicode3.2] +3-7941 U+FA1B # CJK COMPATIBILITY IDEOGRAPH-FA1B [2000] +3-7942 U+7998 # [2000] +3-7943 U+79B1 # [2000] +3-7944 U+79B8 # [2000] +3-7945 U+79C8 # [2000] +3-7946 U+79CA # [2000] +3-7947 U+25771 # [2000] [Unicode3.1] Private: U+F7B3 +3-7948 U+79D4 # [2000] +3-7949 U+79DE # [2000] +3-794A U+79EB # [2000] +3-794B U+79ED # [2000] +3-794C U+7A03 # [2000] +3-794D U+FA54 # CJK COMPATIBILITY IDEOGRAPH-FA54 [2000] [Unicode3.2] +3-794E U+7A39 # [2000] +3-794F U+7A5D # [2000] +3-7950 U+7A6D # [2000] +3-7951 U+FA55 # CJK COMPATIBILITY IDEOGRAPH-FA55 [2000] [Unicode3.2] +3-7952 U+7A85 # [2000] +3-7953 U+7AA0 # [2000] +3-7954 U+259C4 # [2000] [Unicode3.1] Private: U+F7B6 +3-7955 U+7AB3 # [2000] +3-7956 U+7ABB # [2000] +3-7957 U+7ACE # [2000] +3-7958 U+7AEB # [2000] +3-7959 U+7AFD # [2000] +3-795A U+7B12 # [2000] +3-795B U+7B2D # [2000] +3-795C U+7B3B # [2000] +3-795D U+7B47 # [2000] +3-795E U+7B4E # [2000] +3-795F U+7B60 # [2000] +3-7960 U+7B6D # [2000] +3-7961 U+7B6F # [2000] +3-7962 U+7B72 # [2000] +3-7963 U+7B9E # [2000] +3-7964 U+FA56 # CJK COMPATIBILITY IDEOGRAPH-FA56 [2000] [Unicode3.2] +3-7965 U+7BD7 # [2000] +3-7966 U+7BD9 # [2000] +3-7967 U+7C01 # [2000] +3-7968 U+7C31 # [2000] +3-7969 U+7C1E # [2000] +3-796A U+7C20 # [2000] +3-796B U+7C33 # [2000] +3-796C U+7C36 # [2000] +3-796D U+4264 # [2000] +3-796E U+25DA1 # [2000] [Unicode3.1] Private: U+F7B8 +3-796F U+7C59 # [2000] +3-7970 U+7C6D # [2000] +3-7971 U+7C79 # [2000] +3-7972 U+7C8F # [2000] +3-7973 U+7C94 # [2000] +3-7974 U+7CA0 # [2000] +3-7975 U+7CBC # [2000] +3-7976 U+7CD5 # [2000] +3-7977 U+7CD9 # [2000] +3-7978 U+7CDD # [2000] +3-7979 U+7D07 # [2000] +3-797A U+7D08 # [2000] +3-797B U+7D13 # [2000] +3-797C U+7D1D # [2000] +3-797D U+7D23 # [2000] +3-797E U+7D31 # [2000] +3-7A21 U+7D41 # [2000] +3-7A22 U+7D48 # [2000] +3-7A23 U+7D53 # [2000] +3-7A24 U+7D5C # [2000] +3-7A25 U+7D7A # [2000] +3-7A26 U+7D83 # [2000] +3-7A27 U+7D8B # [2000] +3-7A28 U+7DA0 # [2000] +3-7A29 U+7DA6 # [2000] +3-7A2A U+7DC2 # [2000] +3-7A2B U+7DCC # [2000] +3-7A2C U+7DD6 # [2000] +3-7A2D U+7DE3 # [2000] +3-7A2E U+FA57 # CJK COMPATIBILITY IDEOGRAPH-FA57 [2000] [Unicode3.2] +3-7A2F U+7E28 # [2000] +3-7A30 U+7E08 # [2000] +3-7A31 U+7E11 # [2000] +3-7A32 U+7E15 # [2000] +3-7A33 U+FA59 # CJK COMPATIBILITY IDEOGRAPH-FA59 [2000] [Unicode3.2] +3-7A34 U+7E47 # [2000] +3-7A35 U+7E52 # [2000] +3-7A36 U+7E61 # [2000] +3-7A37 U+7E8A # [2000] +3-7A38 U+7E8D # [2000] +3-7A39 U+7F47 # [2000] +3-7A3A U+FA5A # CJK COMPATIBILITY IDEOGRAPH-FA5A [2000] [Unicode3.2] +3-7A3B U+7F91 # [2000] +3-7A3C U+7F97 # [2000] +3-7A3D U+7FBF # [2000] +3-7A3E U+7FCE # [2000] +3-7A3F U+7FDB # [2000] +3-7A40 U+7FDF # [2000] +3-7A41 U+7FEC # [2000] +3-7A42 U+7FEE # [2000] +3-7A43 U+7FFA # [2000] +3-7A44 U+FA5B # CJK COMPATIBILITY IDEOGRAPH-FA5B [2000] [Unicode3.2] +3-7A45 U+8014 # [2000] +3-7A46 U+8026 # [2000] +3-7A47 U+8035 # [2000] +3-7A48 U+8037 # [2000] +3-7A49 U+803C # [2000] +3-7A4A U+80CA # [2000] +3-7A4B U+80D7 # [2000] +3-7A4C U+80E0 # [2000] +3-7A4D U+80F3 # [2000] +3-7A4E U+8118 # [2000] +3-7A4F U+814A # [2000] +3-7A50 U+8160 # [2000] +3-7A51 U+8167 # [2000] +3-7A52 U+8168 # [2000] +3-7A53 U+816D # [2000] +3-7A54 U+81BB # [2000] +3-7A55 U+81CA # [2000] +3-7A56 U+81CF # [2000] +3-7A57 U+81D7 # [2000] +3-7A58 U+FA5C # CJK COMPATIBILITY IDEOGRAPH-FA5C [2000] [Unicode3.2] +3-7A59 U+4453 # [2000] +3-7A5A U+445B # [2000] +3-7A5B U+8260 # [2000] +3-7A5C U+8274 # [2000] +3-7A5D U+26AFF # [2000] [Unicode3.1] Private: U+F7BE +3-7A5E U+828E # [2000] +3-7A5F U+82A1 # [2000] +3-7A60 U+82A3 # [2000] +3-7A61 U+82A4 # [2000] +3-7A62 U+82A9 # [2000] +3-7A63 U+82AE # [2000] +3-7A64 U+82B7 # [2000] +3-7A65 U+82BE # [2000] +3-7A66 U+82BF # [2000] +3-7A67 U+82C6 # [2000] +3-7A68 U+82D5 # [2000] +3-7A69 U+82FD # [2000] +3-7A6A U+82FE # [2000] +3-7A6B U+8300 # [2000] +3-7A6C U+8301 # [2000] +3-7A6D U+8362 # [2000] +3-7A6E U+8322 # [2000] +3-7A6F U+832D # [2000] +3-7A70 U+833A # [2000] +3-7A71 U+8343 # [2000] +3-7A72 U+8347 # [2000] +3-7A73 U+8351 # [2000] +3-7A74 U+8355 # [2000] +3-7A75 U+837D # [2000] +3-7A76 U+8386 # [2000] +3-7A77 U+8392 # [2000] +3-7A78 U+8398 # [2000] +3-7A79 U+83A7 # [2000] +3-7A7A U+83A9 # [2000] +3-7A7B U+83BF # [2000] +3-7A7C U+83C0 # [2000] +3-7A7D U+83C7 # [2000] +3-7A7E U+83CF # [2000] +3-7B21 U+83D1 # [2000] +3-7B22 U+83E1 # [2000] +3-7B23 U+83EA # [2000] +3-7B24 U+8401 # [2000] +3-7B25 U+8406 # [2000] +3-7B26 U+840A # [2000] +3-7B27 U+FA5F # CJK COMPATIBILITY IDEOGRAPH-FA5F [2000] [Unicode3.2] +3-7B28 U+8448 # [2000] +3-7B29 U+845F # [2000] +3-7B2A U+8470 # [2000] +3-7B2B U+8473 # [2000] +3-7B2C U+8485 # [2000] +3-7B2D U+849E # [2000] +3-7B2E U+84AF # [2000] +3-7B2F U+84B4 # [2000] +3-7B30 U+84BA # [2000] +3-7B31 U+84C0 # [2000] +3-7B32 U+84C2 # [2000] +3-7B33 U+26E40 # [2000] [Unicode3.1] Private: U+F7C0 +3-7B34 U+8532 # [2000] +3-7B35 U+851E # [2000] +3-7B36 U+8523 # [2000] +3-7B37 U+852F # [2000] +3-7B38 U+8559 # [2000] +3-7B39 U+8564 # [2000] +3-7B3A U+FA1F # CJK COMPATIBILITY IDEOGRAPH-FA1F [2000] +3-7B3B U+85AD # [2000] +3-7B3C U+857A # [2000] +3-7B3D U+858C # [2000] +3-7B3E U+858F # [2000] +3-7B3F U+85A2 # [2000] +3-7B40 U+85B0 # [2000] +3-7B41 U+85CB # [2000] +3-7B42 U+85CE # [2000] +3-7B43 U+85ED # [2000] +3-7B44 U+8612 # [2000] +3-7B45 U+85FF # [2000] +3-7B46 U+8604 # [2000] +3-7B47 U+8605 # [2000] +3-7B48 U+8610 # [2000] +3-7B49 U+270F4 # [2000] [Unicode3.1] Private: U+F7C1 +3-7B4A U+8618 # [2000] +3-7B4B U+8629 # [2000] +3-7B4C U+8638 # [2000] +3-7B4D U+8657 # [2000] +3-7B4E U+865B # [2000] +3-7B4F U+F936 # CJK COMPATIBILITY IDEOGRAPH-F936 [2000] +3-7B50 U+8662 # [2000] +3-7B51 U+459D # [2000] +3-7B52 U+866C # [2000] +3-7B53 U+8675 # [2000] +3-7B54 U+8698 # [2000] +3-7B55 U+86B8 # [2000] +3-7B56 U+86FA # [2000] +3-7B57 U+86FC # [2000] +3-7B58 U+86FD # [2000] +3-7B59 U+870B # [2000] +3-7B5A U+8771 # [2000] +3-7B5B U+8787 # [2000] +3-7B5C U+8788 # [2000] +3-7B5D U+87AC # [2000] +3-7B5E U+87AD # [2000] +3-7B5F U+87B5 # [2000] +3-7B60 U+45EA # [2000] +3-7B61 U+87D6 # [2000] +3-7B62 U+87EC # [2000] +3-7B63 U+8806 # [2000] +3-7B64 U+880A # [2000] +3-7B65 U+8810 # [2000] +3-7B66 U+8814 # [2000] +3-7B67 U+881F # [2000] +3-7B68 U+8898 # [2000] +3-7B69 U+88AA # [2000] +3-7B6A U+88CA # [2000] +3-7B6B U+88CE # [2000] +3-7B6C U+27684 # [2000] [Unicode3.1] Private: U+F7C2 +3-7B6D U+88F5 # [2000] +3-7B6E U+891C # [2000] +3-7B6F U+FA60 # CJK COMPATIBILITY IDEOGRAPH-FA60 [2000] [Unicode3.2] +3-7B70 U+8918 # [2000] +3-7B71 U+8919 # [2000] +3-7B72 U+891A # [2000] +3-7B73 U+8927 # [2000] +3-7B74 U+8930 # [2000] +3-7B75 U+8932 # [2000] +3-7B76 U+8939 # [2000] +3-7B77 U+8940 # [2000] +3-7B78 U+8994 # [2000] +3-7B79 U+FA61 # CJK COMPATIBILITY IDEOGRAPH-FA61 [2000] [Unicode3.2] +3-7B7A U+89D4 # [2000] +3-7B7B U+89E5 # [2000] +3-7B7C U+89F6 # [2000] +3-7B7D U+8A12 # [2000] +3-7B7E U+8A15 # [2000] +3-7C21 U+8A22 # [2000] +3-7C22 U+8A37 # [2000] +3-7C23 U+8A47 # [2000] +3-7C24 U+8A4E # [2000] +3-7C25 U+8A5D # [2000] +3-7C26 U+8A61 # [2000] +3-7C27 U+8A75 # [2000] +3-7C28 U+8A79 # [2000] +3-7C29 U+8AA7 # [2000] +3-7C2A U+8AD0 # [2000] +3-7C2B U+8ADF # [2000] +3-7C2C U+8AF4 # [2000] +3-7C2D U+8AF6 # [2000] +3-7C2E U+FA22 # CJK COMPATIBILITY IDEOGRAPH-FA22 [2000] +3-7C2F U+FA62 # CJK COMPATIBILITY IDEOGRAPH-FA62 [2000] [Unicode3.2] +3-7C30 U+FA63 # CJK COMPATIBILITY IDEOGRAPH-FA63 [2000] [Unicode3.2] +3-7C31 U+8B46 # [2000] +3-7C32 U+8B54 # [2000] +3-7C33 U+8B59 # [2000] +3-7C34 U+8B69 # [2000] +3-7C35 U+8B9D # [2000] +3-7C36 U+8C49 # [2000] +3-7C37 U+8C68 # [2000] +3-7C38 U+FA64 # CJK COMPATIBILITY IDEOGRAPH-FA64 [2000] [Unicode3.2] +3-7C39 U+8CE1 # [2000] +3-7C3A U+8CF4 # [2000] +3-7C3B U+8CF8 # [2000] +3-7C3C U+8CFE # [2000] +3-7C3D U+FA65 # CJK COMPATIBILITY IDEOGRAPH-FA65 [2000] [Unicode3.2] +3-7C3E U+8D12 # [2000] +3-7C3F U+8D1B # [2000] +3-7C40 U+8DAF # [2000] +3-7C41 U+8DCE # [2000] +3-7C42 U+8DD1 # [2000] +3-7C43 U+8DD7 # [2000] +3-7C44 U+8E20 # [2000] +3-7C45 U+8E23 # [2000] +3-7C46 U+8E3D # [2000] +3-7C47 U+8E70 # [2000] +3-7C48 U+8E7B # [2000] +3-7C49 U+28277 # [2000] [Unicode3.1] Private: U+F7C9 +3-7C4A U+8EC0 # [2000] +3-7C4B U+4844 # [2000] +3-7C4C U+8EFA # [2000] +3-7C4D U+8F1E # [2000] +3-7C4E U+8F2D # [2000] +3-7C4F U+8F36 # [2000] +3-7C50 U+8F54 # [2000] +3-7C51 U+283CD # [2000] [Unicode3.1] Private: U+F7CA +3-7C52 U+8FA6 # [2000] +3-7C53 U+8FB5 # [2000] +3-7C54 U+8FE4 # [2000] +3-7C55 U+8FE8 # [2000] +3-7C56 U+8FEE # [2000] +3-7C57 U+9008 # [2000] +3-7C58 U+902D # [2000] +3-7C59 U+FA67 # CJK COMPATIBILITY IDEOGRAPH-FA67 [2000] [Unicode3.2] +3-7C5A U+9088 # [2000] +3-7C5B U+9095 # [2000] +3-7C5C U+9097 # [2000] +3-7C5D U+9099 # [2000] +3-7C5E U+909B # [2000] +3-7C5F U+90A2 # [2000] +3-7C60 U+90B3 # [2000] +3-7C61 U+90BE # [2000] +3-7C62 U+90C4 # [2000] +3-7C63 U+90C5 # [2000] +3-7C64 U+90C7 # [2000] +3-7C65 U+90D7 # [2000] +3-7C66 U+90DD # [2000] +3-7C67 U+90DE # [2000] +3-7C68 U+90EF # [2000] +3-7C69 U+90F4 # [2000] +3-7C6A U+FA26 # CJK COMPATIBILITY IDEOGRAPH-FA26 [2000] +3-7C6B U+9114 # [2000] +3-7C6C U+9115 # [2000] +3-7C6D U+9116 # [2000] +3-7C6E U+9122 # [2000] +3-7C6F U+9123 # [2000] +3-7C70 U+9127 # [2000] +3-7C71 U+912F # [2000] +3-7C72 U+9131 # [2000] +3-7C73 U+9134 # [2000] +3-7C74 U+913D # [2000] +3-7C75 U+9148 # [2000] +3-7C76 U+915B # [2000] +3-7C77 U+9183 # [2000] +3-7C78 U+919E # [2000] +3-7C79 U+91AC # [2000] +3-7C7A U+91B1 # [2000] +3-7C7B U+91BC # [2000] +3-7C7C U+91D7 # [2000] +3-7C7D U+91FB # [2000] +3-7C7E U+91E4 # [2000] +3-7D21 U+91E5 # [2000] +3-7D22 U+91ED # [2000] +3-7D23 U+91F1 # [2000] +3-7D24 U+9207 # [2000] +3-7D25 U+9210 # [2000] +3-7D26 U+9238 # [2000] +3-7D27 U+9239 # [2000] +3-7D28 U+923A # [2000] +3-7D29 U+923C # [2000] +3-7D2A U+9240 # [2000] +3-7D2B U+9243 # [2000] +3-7D2C U+924F # [2000] +3-7D2D U+9278 # [2000] +3-7D2E U+9288 # [2000] +3-7D2F U+92C2 # [2000] +3-7D30 U+92CB # [2000] +3-7D31 U+92CC # [2000] +3-7D32 U+92D3 # [2000] +3-7D33 U+92E0 # [2000] +3-7D34 U+92FF # [2000] +3-7D35 U+9304 # [2000] +3-7D36 U+931F # [2000] +3-7D37 U+9321 # [2000] +3-7D38 U+9325 # [2000] +3-7D39 U+9348 # [2000] +3-7D3A U+9349 # [2000] +3-7D3B U+934A # [2000] +3-7D3C U+9364 # [2000] +3-7D3D U+9365 # [2000] +3-7D3E U+936A # [2000] +3-7D3F U+9370 # [2000] +3-7D40 U+939B # [2000] +3-7D41 U+93A3 # [2000] +3-7D42 U+93BA # [2000] +3-7D43 U+93C6 # [2000] +3-7D44 U+93DE # [2000] +3-7D45 U+93DF # [2000] +3-7D46 U+9404 # [2000] +3-7D47 U+93FD # [2000] +3-7D48 U+9433 # [2000] +3-7D49 U+944A # [2000] +3-7D4A U+9463 # [2000] +3-7D4B U+946B # [2000] +3-7D4C U+9471 # [2000] +3-7D4D U+9472 # [2000] +3-7D4E U+958E # [2000] +3-7D4F U+959F # [2000] +3-7D50 U+95A6 # [2000] +3-7D51 U+95A9 # [2000] +3-7D52 U+95AC # [2000] +3-7D53 U+95B6 # [2000] +3-7D54 U+95BD # [2000] +3-7D55 U+95CB # [2000] +3-7D56 U+95D0 # [2000] +3-7D57 U+95D3 # [2000] +3-7D58 U+49B0 # [2000] +3-7D59 U+95DA # [2000] +3-7D5A U+95DE # [2000] +3-7D5B U+9658 # [2000] +3-7D5C U+9684 # [2000] +3-7D5D U+F9DC # CJK COMPATIBILITY IDEOGRAPH-F9DC [2000] +3-7D5E U+969D # [2000] +3-7D5F U+96A4 # [2000] +3-7D60 U+96A5 # [2000] +3-7D61 U+96D2 # [2000] +3-7D62 U+96DE # [2000] +3-7D63 U+FA68 # CJK COMPATIBILITY IDEOGRAPH-FA68 [2000] [Unicode3.2] +3-7D64 U+96E9 # [2000] +3-7D65 U+96EF # [2000] +3-7D66 U+9733 # [2000] +3-7D67 U+973B # [2000] +3-7D68 U+974D # [2000] +3-7D69 U+974E # [2000] +3-7D6A U+974F # [2000] +3-7D6B U+975A # [2000] +3-7D6C U+976E # [2000] +3-7D6D U+9773 # [2000] +3-7D6E U+9795 # [2000] +3-7D6F U+97AE # [2000] +3-7D70 U+97BA # [2000] +3-7D71 U+97C1 # [2000] +3-7D72 U+97C9 # [2000] +3-7D73 U+97DE # [2000] +3-7D74 U+97DB # [2000] +3-7D75 U+97F4 # [2000] +3-7D76 U+FA69 # CJK COMPATIBILITY IDEOGRAPH-FA69 [2000] [Unicode3.2] +3-7D77 U+980A # [2000] +3-7D78 U+981E # [2000] +3-7D79 U+982B # [2000] +3-7D7A U+9830 # [2000] +3-7D7B U+FA6A # CJK COMPATIBILITY IDEOGRAPH-FA6A [2000] [Unicode3.2] +3-7D7C U+9852 # [2000] +3-7D7D U+9853 # [2000] +3-7D7E U+9856 # [2000] +3-7E21 U+9857 # [2000] +3-7E22 U+9859 # [2000] +3-7E23 U+985A # [2000] +3-7E24 U+F9D0 # CJK COMPATIBILITY IDEOGRAPH-F9D0 [2000] +3-7E25 U+9865 # [2000] +3-7E26 U+986C # [2000] +3-7E27 U+98BA # [2000] +3-7E28 U+98C8 # [2000] +3-7E29 U+98E7 # [2000] +3-7E2A U+9958 # [2000] +3-7E2B U+999E # [2000] +3-7E2C U+9A02 # [2000] +3-7E2D U+9A03 # [2000] +3-7E2E U+9A24 # [2000] +3-7E2F U+9A2D # [2000] +3-7E30 U+9A2E # [2000] +3-7E31 U+9A38 # [2000] +3-7E32 U+9A4A # [2000] +3-7E33 U+9A4E # [2000] +3-7E34 U+9A52 # [2000] +3-7E35 U+9AB6 # [2000] +3-7E36 U+9AC1 # [2000] +3-7E37 U+9AC3 # [2000] +3-7E38 U+9ACE # [2000] +3-7E39 U+9AD6 # [2000] +3-7E3A U+9AF9 # [2000] +3-7E3B U+9B02 # [2000] +3-7E3C U+9B08 # [2000] +3-7E3D U+9B20 # [2000] +3-7E3E U+4C17 # [2000] +3-7E3F U+9B2D # [2000] +3-7E40 U+9B5E # [2000] +3-7E41 U+9B79 # [2000] +3-7E42 U+9B66 # [2000] +3-7E43 U+9B72 # [2000] +3-7E44 U+9B75 # [2000] +3-7E45 U+9B84 # [2000] +3-7E46 U+9B8A # [2000] +3-7E47 U+9B8F # [2000] +3-7E48 U+9B9E # [2000] +3-7E49 U+9BA7 # [2000] +3-7E4A U+9BC1 # [2000] +3-7E4B U+9BCE # [2000] +3-7E4C U+9BE5 # [2000] +3-7E4D U+9BF8 # [2000] +3-7E4E U+9BFD # [2000] +3-7E4F U+9C00 # [2000] +3-7E50 U+9C23 # [2000] +3-7E51 U+9C41 # [2000] +3-7E52 U+9C4F # [2000] +3-7E53 U+9C50 # [2000] +3-7E54 U+9C53 # [2000] +3-7E55 U+9C63 # [2000] +3-7E56 U+9C65 # [2000] +3-7E57 U+9C77 # [2000] +3-7E58 U+9D1D # [2000] +3-7E59 U+9D1E # [2000] +3-7E5A U+9D43 # [2000] +3-7E5B U+9D47 # [2000] +3-7E5C U+9D52 # [2000] +3-7E5D U+9D63 # [2000] +3-7E5E U+9D70 # [2000] +3-7E5F U+9D7C # [2000] +3-7E60 U+9D8A # [2000] +3-7E61 U+9D96 # [2000] +3-7E62 U+9DC0 # [2000] +3-7E63 U+9DAC # [2000] +3-7E64 U+9DBC # [2000] +3-7E65 U+9DD7 # [2000] +3-7E66 U+2A190 # [2000] [Unicode3.1] Private: U+F7D0 +3-7E67 U+9DE7 # [2000] +3-7E68 U+9E07 # [2000] +3-7E69 U+9E15 # [2000] +3-7E6A U+9E7C # [2000] +3-7E6B U+9E9E # [2000] +3-7E6C U+9EA4 # [2000] +3-7E6D U+9EAC # [2000] +3-7E6E U+9EAF # [2000] +3-7E6F U+9EB4 # [2000] +3-7E70 U+9EB5 # [2000] +3-7E71 U+9EC3 # [2000] +3-7E72 U+9ED1 # [2000] +3-7E73 U+9F10 # [2000] +3-7E74 U+9F39 # [2000] +3-7E75 U+9F57 # [2000] +3-7E76 U+9F90 # [2000] +3-7E77 U+9F94 # [2000] +3-7E78 U+9F97 # [2000] +3-7E79 U+9FA2 # [2000] +3-7E7A U+59F8 # [2004] +3-7E7B U+5C5B # [2004] +3-7E7C U+5E77 # [2004] +3-7E7D U+7626 # [2004] +3-7E7E U+7E6B # [2004] +4-2121 U+20089 # [2000] [Unicode3.1] Private: U+F7D1 +4-2122 U+4E02 # [2000] +4-2123 U+4E0F # [2000] +4-2124 U+4E12 # [2000] +4-2125 U+4E29 # [2000] +4-2126 U+4E2B # [2000] +4-2127 U+4E2E # [2000] +4-2128 U+4E40 # [2000] +4-2129 U+4E47 # [2000] +4-212A U+4E48 # [2000] +4-212B U+200A2 # [2000] [Unicode3.1] Private: U+F7D2 +4-212C U+4E51 # [2000] +4-212D U+3406 # [2000] +4-212E U+200A4 # [2000] [Unicode3.1] Private: U+F7D3 +4-212F U+4E5A # [2000] +4-2130 U+4E69 # [2000] +4-2131 U+4E9D # [2000] +4-2132 U+342C # [2000] +4-2133 U+342E # [2000] +4-2134 U+4EB9 # [2000] +4-2135 U+4EBB # [2000] +4-2136 U+201A2 # [2000] [Unicode3.1] Private: U+F7D4 +4-2137 U+4EBC # [2000] +4-2138 U+4EC3 # [2000] +4-2139 U+4EC8 # [2000] +4-213A U+4ED0 # [2000] +4-213B U+4EEB # [2000] +4-213C U+4EDA # [2000] +4-213D U+4EF1 # [2000] +4-213E U+4EF5 # [2000] +4-213F U+4F00 # [2000] +4-2140 U+4F16 # [2000] +4-2141 U+4F64 # [2000] +4-2142 U+4F37 # [2000] +4-2143 U+4F3E # [2000] +4-2144 U+4F54 # [2000] +4-2145 U+4F58 # [2000] +4-2146 U+20213 # [2000] [Unicode3.1] Private: U+F7D5 +4-2147 U+4F77 # [2000] +4-2148 U+4F78 # [2000] +4-2149 U+4F7A # [2000] +4-214A U+4F7D # [2000] +4-214B U+4F82 # [2000] +4-214C U+4F85 # [2000] +4-214D U+4F92 # [2000] +4-214E U+4F9A # [2000] +4-214F U+4FE6 # [2000] +4-2150 U+4FB2 # [2000] +4-2151 U+4FBE # [2000] +4-2152 U+4FC5 # [2000] +4-2153 U+4FCB # [2000] +4-2154 U+4FCF # [2000] +4-2155 U+4FD2 # [2000] +4-2156 U+346A # [2000] +4-2157 U+4FF2 # [2000] +4-2158 U+5000 # [2000] +4-2159 U+5010 # [2000] +4-215A U+5013 # [2000] +4-215B U+501C # [2000] +4-215C U+501E # [2000] +4-215D U+5022 # [2000] +4-215E U+3468 # [2000] +4-215F U+5042 # [2000] +4-2160 U+5046 # [2000] +4-2161 U+504E # [2000] +4-2162 U+5053 # [2000] +4-2163 U+5057 # [2000] +4-2164 U+5063 # [2000] +4-2165 U+5066 # [2000] +4-2166 U+506A # [2000] +4-2167 U+5070 # [2000] +4-2168 U+50A3 # [2000] +4-2169 U+5088 # [2000] +4-216A U+5092 # [2000] +4-216B U+5093 # [2000] +4-216C U+5095 # [2000] +4-216D U+5096 # [2000] +4-216E U+509C # [2000] +4-216F U+50AA # [2000] +4-2170 U+2032B # [2000] [Unicode3.1] Private: U+F7D6 +4-2171 U+50B1 # [2000] +4-2172 U+50BA # [2000] +4-2173 U+50BB # [2000] +4-2174 U+50C4 # [2000] +4-2175 U+50C7 # [2000] +4-2176 U+50F3 # [2000] +4-2177 U+20381 # [2000] [Unicode3.1] Private: U+F7D7 +4-2178 U+50CE # [2000] +4-2179 U+20371 # [2000] [Unicode3.1] Private: U+F7D8 +4-217A U+50D4 # [2000] +4-217B U+50D9 # [2000] +4-217C U+50E1 # [2000] +4-217D U+50E9 # [2000] +4-217E U+3492 # [2000] +4-2321 U+5108 # [2000] +4-2322 U+203F9 # [2000] [Unicode3.1] Private: U+F7D9 +4-2323 U+5117 # [2000] +4-2324 U+511B # [2000] +4-2325 U+2044A # [2000] [Unicode3.1] Private: U+F7DA +4-2326 U+5160 # [2000] +4-2327 U+20509 # [2000] [Unicode3.1] Private: U+F7DB +4-2328 U+5173 # [2000] +4-2329 U+5183 # [2000] +4-232A U+518B # [2000] +4-232B U+34BC # [2000] +4-232C U+5198 # [2000] +4-232D U+51A3 # [2000] +4-232E U+51AD # [2000] +4-232F U+34C7 # [2000] +4-2330 U+51BC # [2000] +4-2331 U+205D6 # [2000] [Unicode3.1] Private: U+F7DC +4-2332 U+20628 # [2000] [Unicode3.1] Private: U+F7DD +4-2333 U+51F3 # [2000] +4-2334 U+51F4 # [2000] +4-2335 U+5202 # [2000] +4-2336 U+5212 # [2000] +4-2337 U+5216 # [2000] +4-2338 U+2074F # [2000] [Unicode3.1] Private: U+F7DE +4-2339 U+5255 # [2000] +4-233A U+525C # [2000] +4-233B U+526C # [2000] +4-233C U+5277 # [2000] +4-233D U+5284 # [2000] +4-233E U+5282 # [2000] +4-233F U+20807 # [2000] [Unicode3.1] Private: U+F7DF +4-2340 U+5298 # [2000] +4-2341 U+2083A # [2000] [Unicode3.1] Private: U+F7E0 +4-2342 U+52A4 # [2000] +4-2343 U+52A6 # [2000] +4-2344 U+52AF # [2000] +4-2345 U+52BA # [2000] +4-2346 U+52BB # [2000] +4-2347 U+52CA # [2000] +4-2348 U+351F # [2000] +4-2349 U+52D1 # [2000] +4-234A U+208B9 # [2000] [Unicode3.1] Private: U+F7E1 +4-234B U+52F7 # [2000] +4-234C U+530A # [2000] +4-234D U+530B # [2000] +4-234E U+5324 # [2000] +4-234F U+5335 # [2000] +4-2350 U+533E # [2000] +4-2351 U+5342 # [2000] +4-2352 U+2097C # [2000] [Unicode3.1] Private: U+F7E2 +4-2353 U+2099D # [2000] [Unicode3.1] Private: U+F7E3 +4-2354 U+5367 # [2000] +4-2355 U+536C # [2000] +4-2356 U+537A # [2000] +4-2357 U+53A4 # [2000] +4-2358 U+53B4 # [2000] +4-2359 U+20AD3 # [2000] [Unicode3.1] Private: U+F7E4 +4-235A U+53B7 # [2000] +4-235B U+53C0 # [2000] +4-235C U+20B1D # [2000] [Unicode3.1] Private: U+F7E5 +4-235D U+355D # [2000] +4-235E U+355E # [2000] +4-235F U+53D5 # [2000] +4-2360 U+53DA # [2000] +4-2361 U+3563 # [2000] +4-2362 U+53F4 # [2000] +4-2363 U+53F5 # [2000] +4-2364 U+5455 # [2000] +4-2365 U+5424 # [2000] +4-2366 U+5428 # [2000] +4-2367 U+356E # [2000] +4-2368 U+5443 # [2000] +4-2369 U+5462 # [2000] +4-236A U+5466 # [2000] +4-236B U+546C # [2000] +4-236C U+548A # [2000] +4-236D U+548D # [2000] +4-236E U+5495 # [2000] +4-236F U+54A0 # [2000] +4-2370 U+54A6 # [2000] +4-2371 U+54AD # [2000] +4-2372 U+54AE # [2000] +4-2373 U+54B7 # [2000] +4-2374 U+54BA # [2000] +4-2375 U+54BF # [2000] +4-2376 U+54C3 # [2000] +4-2377 U+20D45 # [2000] [Unicode3.1] Private: U+F7E6 +4-2378 U+54EC # [2000] +4-2379 U+54EF # [2000] +4-237A U+54F1 # [2000] +4-237B U+54F3 # [2000] +4-237C U+5500 # [2000] +4-237D U+5501 # [2000] +4-237E U+5509 # [2000] +4-2421 U+553C # [2000] +4-2422 U+5541 # [2000] +4-2423 U+35A6 # [2000] +4-2424 U+5547 # [2000] +4-2425 U+554A # [2000] +4-2426 U+35A8 # [2000] +4-2427 U+5560 # [2000] +4-2428 U+5561 # [2000] +4-2429 U+5564 # [2000] +4-242A U+20DE1 # [2000] [Unicode3.1] Private: U+F7E7 +4-242B U+557D # [2000] +4-242C U+5582 # [2000] +4-242D U+5588 # [2000] +4-242E U+5591 # [2000] +4-242F U+35C5 # [2000] +4-2430 U+55D2 # [2000] +4-2431 U+20E95 # [2000] [Unicode3.1] Private: U+F7E8 +4-2432 U+20E6D # [2000] [Unicode3.1] Private: U+F7E9 +4-2433 U+55BF # [2000] +4-2434 U+55C9 # [2000] +4-2435 U+55CC # [2000] +4-2436 U+55D1 # [2000] +4-2437 U+55DD # [2000] +4-2438 U+35DA # [2000] +4-2439 U+55E2 # [2000] +4-243A U+20E64 # [2000] [Unicode3.1] Private: U+F7EA +4-243B U+55E9 # [2000] +4-243C U+5628 # [2000] +4-243D U+20F5F # [2000] [Unicode3.1] Private: U+F7EB +4-243E U+5607 # [2000] +4-243F U+5610 # [2000] +4-2440 U+5630 # [2000] +4-2441 U+5637 # [2000] +4-2442 U+35F4 # [2000] +4-2443 U+563D # [2000] +4-2444 U+563F # [2000] +4-2445 U+5640 # [2000] +4-2446 U+5647 # [2000] +4-2447 U+565E # [2000] +4-2448 U+5660 # [2000] +4-2449 U+566D # [2000] +4-244A U+3605 # [2000] +4-244B U+5688 # [2000] +4-244C U+568C # [2000] +4-244D U+5695 # [2000] +4-244E U+569A # [2000] +4-244F U+569D # [2000] +4-2450 U+56A8 # [2000] +4-2451 U+56AD # [2000] +4-2452 U+56B2 # [2000] +4-2453 U+56C5 # [2000] +4-2454 U+56CD # [2000] +4-2455 U+56DF # [2000] +4-2456 U+56E8 # [2000] +4-2457 U+56F6 # [2000] +4-2458 U+56F7 # [2000] +4-2459 U+21201 # [2000] [Unicode3.1] Private: U+F7EC +4-245A U+5715 # [2000] +4-245B U+5723 # [2000] +4-245C U+21255 # [2000] [Unicode3.1] Private: U+F7ED +4-245D U+5729 # [2000] +4-245E U+2127B # [2000] [Unicode3.1] Private: U+F7EE +4-245F U+5745 # [2000] +4-2460 U+5746 # [2000] +4-2461 U+574C # [2000] +4-2462 U+574D # [2000] +4-2463 U+21274 # [2000] [Unicode3.1] Private: U+F7EF +4-2464 U+5768 # [2000] +4-2465 U+576F # [2000] +4-2466 U+5773 # [2000] +4-2467 U+5774 # [2000] +4-2468 U+5775 # [2000] +4-2469 U+577B # [2000] +4-246A U+212E4 # [2000] [Unicode3.1] Private: U+F7F0 +4-246B U+212D7 # [2000] [Unicode3.1] Private: U+F7F1 +4-246C U+57AC # [2000] +4-246D U+579A # [2000] +4-246E U+579D # [2000] +4-246F U+579E # [2000] +4-2470 U+57A8 # [2000] +4-2471 U+57D7 # [2000] +4-2472 U+212FD # [2000] [Unicode3.1] Private: U+F7F2 +4-2473 U+57CC # [2000] +4-2474 U+21336 # [2000] [Unicode3.1] Private: U+F7F3 +4-2475 U+21344 # [2000] [Unicode3.1] Private: U+F7F4 +4-2476 U+57DE # [2000] +4-2477 U+57E6 # [2000] +4-2478 U+57F0 # [2000] +4-2479 U+364A # [2000] +4-247A U+57F8 # [2000] +4-247B U+57FB # [2000] +4-247C U+57FD # [2000] +4-247D U+5804 # [2000] +4-247E U+581E # [2000] +4-2521 U+5820 # [2000] +4-2522 U+5827 # [2000] +4-2523 U+5832 # [2000] +4-2524 U+5839 # [2000] +4-2525 U+213C4 # [2000] [Unicode3.1] Private: U+F7F5 +4-2526 U+5849 # [2000] +4-2527 U+584C # [2000] +4-2528 U+5867 # [2000] +4-2529 U+588A # [2000] +4-252A U+588B # [2000] +4-252B U+588D # [2000] +4-252C U+588F # [2000] +4-252D U+5890 # [2000] +4-252E U+5894 # [2000] +4-252F U+589D # [2000] +4-2530 U+58AA # [2000] +4-2531 U+58B1 # [2000] +4-2532 U+2146D # [2000] [Unicode3.1] Private: U+F7F6 +4-2533 U+58C3 # [2000] +4-2534 U+58CD # [2000] +4-2535 U+58E2 # [2000] +4-2536 U+58F3 # [2000] +4-2537 U+58F4 # [2000] +4-2538 U+5905 # [2000] +4-2539 U+5906 # [2000] +4-253A U+590B # [2000] +4-253B U+590D # [2000] +4-253C U+5914 # [2000] +4-253D U+5924 # [2000] +4-253E U+215D7 # [2000] [Unicode3.1] Private: U+F7F7 +4-253F U+3691 # [2000] +4-2540 U+593D # [2000] +4-2541 U+3699 # [2000] +4-2542 U+5946 # [2000] +4-2543 U+3696 # [2000] +4-2544 U+26C29 # [2000] [Unicode3.1] Private: U+F7F8 +4-2545 U+595B # [2000] +4-2546 U+595F # [2000] +4-2547 U+21647 # [2000] [Unicode3.1] Private: U+F7F9 +4-2548 U+5975 # [2000] +4-2549 U+5976 # [2000] +4-254A U+597C # [2000] +4-254B U+599F # [2000] +4-254C U+59AE # [2000] +4-254D U+59BC # [2000] +4-254E U+59C8 # [2000] +4-254F U+59CD # [2000] +4-2550 U+59DE # [2000] +4-2551 U+59E3 # [2000] +4-2552 U+59E4 # [2000] +4-2553 U+59E7 # [2000] +4-2554 U+59EE # [2000] +4-2555 U+21706 # [2000] [Unicode3.1] Private: U+F7FA +4-2556 U+21742 # [2000] [Unicode3.1] Private: U+F7FB +4-2557 U+36CF # [2000] +4-2558 U+5A0C # [2000] +4-2559 U+5A0D # [2000] +4-255A U+5A17 # [2000] +4-255B U+5A27 # [2000] +4-255C U+5A2D # [2000] +4-255D U+5A55 # [2000] +4-255E U+5A65 # [2000] +4-255F U+5A7A # [2000] +4-2560 U+5A8B # [2000] +4-2561 U+5A9C # [2000] +4-2562 U+5A9F # [2000] +4-2563 U+5AA0 # [2000] +4-2564 U+5AA2 # [2000] +4-2565 U+5AB1 # [2000] +4-2566 U+5AB3 # [2000] +4-2567 U+5AB5 # [2000] +4-2568 U+5ABA # [2000] +4-2569 U+5ABF # [2000] +4-256A U+5ADA # [2000] +4-256B U+5ADC # [2000] +4-256C U+5AE0 # [2000] +4-256D U+5AE5 # [2000] +4-256E U+5AF0 # [2000] +4-256F U+5AEE # [2000] +4-2570 U+5AF5 # [2000] +4-2571 U+5B00 # [2000] +4-2572 U+5B08 # [2000] +4-2573 U+5B17 # [2000] +4-2574 U+5B34 # [2000] +4-2575 U+5B2D # [2000] +4-2576 U+5B4C # [2000] +4-2577 U+5B52 # [2000] +4-2578 U+5B68 # [2000] +4-2579 U+5B6F # [2000] +4-257A U+5B7C # [2000] +4-257B U+5B7F # [2000] +4-257C U+5B81 # [2000] +4-257D U+5B84 # [2000] +4-257E U+219C3 # [2000] [Unicode3.1] Private: U+F7FC +4-2821 U+5B96 # [2000] +4-2822 U+5BAC # [2000] +4-2823 U+3761 # [2000] +4-2824 U+5BC0 # [2000] +4-2825 U+3762 # [2000] +4-2826 U+5BCE # [2000] +4-2827 U+5BD6 # [2000] +4-2828 U+376C # [2000] +4-2829 U+376B # [2000] +4-282A U+5BF1 # [2000] +4-282B U+5BFD # [2000] +4-282C U+3775 # [2000] +4-282D U+5C03 # [2000] +4-282E U+5C29 # [2000] +4-282F U+5C30 # [2000] +4-2830 U+21C56 # [2000] [Unicode3.1] Private: U+F7FD +4-2831 U+5C5F # [2000] +4-2832 U+5C63 # [2000] +4-2833 U+5C67 # [2000] +4-2834 U+5C68 # [2000] +4-2835 U+5C69 # [2000] +4-2836 U+5C70 # [2000] +4-2837 U+21D2D # [2000] [Unicode3.1] Private: U+F7FE +4-2838 U+21D45 # [2000] [Unicode3.1] Private: U+F7FF +4-2839 U+5C7C # [2000] +4-283A U+21D78 # [2000] [Unicode3.1] Private: U+F800 +4-283B U+21D62 # [2000] [Unicode3.1] Private: U+F801 +4-283C U+5C88 # [2000] +4-283D U+5C8A # [2000] +4-283E U+37C1 # [2000] +4-283F U+21DA1 # [2000] [Unicode3.1] Private: U+F802 +4-2840 U+21D9C # [2000] [Unicode3.1] Private: U+F803 +4-2841 U+5CA0 # [2000] +4-2842 U+5CA2 # [2000] +4-2843 U+5CA6 # [2000] +4-2844 U+5CA7 # [2000] +4-2845 U+21D92 # [2000] [Unicode3.1] Private: U+F804 +4-2846 U+5CAD # [2000] +4-2847 U+5CB5 # [2000] +4-2848 U+21DB7 # [2000] [Unicode3.1] Private: U+F805 +4-2849 U+5CC9 # [2000] +4-284A U+21DE0 # [2000] [Unicode3.1] Private: U+F806 +4-284B U+21E33 # [2000] [Unicode3.1] Private: U+F807 +4-284C U+5D06 # [2000] +4-284D U+5D10 # [2000] +4-284E U+5D2B # [2000] +4-284F U+5D1D # [2000] +4-2850 U+5D20 # [2000] +4-2851 U+5D24 # [2000] +4-2852 U+5D26 # [2000] +4-2853 U+5D31 # [2000] +4-2854 U+5D39 # [2000] +4-2855 U+5D42 # [2000] +4-2856 U+37E8 # [2000] +4-2857 U+5D61 # [2000] +4-2858 U+5D6A # [2000] +4-2859 U+37F4 # [2000] +4-285A U+5D70 # [2000] +4-285B U+21F1E # [2000] [Unicode3.1] Private: U+F808 +4-285C U+37FD # [2000] +4-285D U+5D88 # [2000] +4-285E U+3800 # [2000] +4-285F U+5D92 # [2000] +4-2860 U+5D94 # [2000] +4-2861 U+5D97 # [2000] +4-2862 U+5D99 # [2000] +4-2863 U+5DB0 # [2000] +4-2864 U+5DB2 # [2000] +4-2865 U+5DB4 # [2000] +4-2866 U+21F76 # [2000] [Unicode3.1] Private: U+F809 +4-2867 U+5DB9 # [2000] +4-2868 U+5DD1 # [2000] +4-2869 U+5DD7 # [2000] +4-286A U+5DD8 # [2000] +4-286B U+5DE0 # [2000] +4-286C U+21FFA # [2000] [Unicode3.1] Private: U+F80A +4-286D U+5DE4 # [2000] +4-286E U+5DE9 # [2000] +4-286F U+382F # [2000] +4-2870 U+5E00 # [2000] +4-2871 U+3836 # [2000] +4-2872 U+5E12 # [2000] +4-2873 U+5E15 # [2000] +4-2874 U+3840 # [2000] +4-2875 U+5E1F # [2000] +4-2876 U+5E2E # [2000] +4-2877 U+5E3E # [2000] +4-2878 U+5E49 # [2000] +4-2879 U+385C # [2000] +4-287A U+5E56 # [2000] +4-287B U+3861 # [2000] +4-287C U+5E6B # [2000] +4-287D U+5E6C # [2000] +4-287E U+5E6D # [2000] +4-2C21 U+5E6E # [2000] +4-2C22 U+2217B # [2000] [Unicode3.1] Private: U+F80B +4-2C23 U+5EA5 # [2000] +4-2C24 U+5EAA # [2000] +4-2C25 U+5EAC # [2000] +4-2C26 U+5EB9 # [2000] +4-2C27 U+5EBF # [2000] +4-2C28 U+5EC6 # [2000] +4-2C29 U+5ED2 # [2000] +4-2C2A U+5ED9 # [2000] +4-2C2B U+2231E # [2000] [Unicode3.1] Private: U+F80C +4-2C2C U+5EFD # [2000] +4-2C2D U+5F08 # [2000] +4-2C2E U+5F0E # [2000] +4-2C2F U+5F1C # [2000] +4-2C30 U+223AD # [2000] [Unicode3.1] Private: U+F80D +4-2C31 U+5F1E # [2000] +4-2C32 U+5F47 # [2000] +4-2C33 U+5F63 # [2000] +4-2C34 U+5F72 # [2000] +4-2C35 U+5F7E # [2000] +4-2C36 U+5F8F # [2000] +4-2C37 U+5FA2 # [2000] +4-2C38 U+5FA4 # [2000] +4-2C39 U+5FB8 # [2000] +4-2C3A U+5FC4 # [2000] +4-2C3B U+38FA # [2000] +4-2C3C U+5FC7 # [2000] +4-2C3D U+5FCB # [2000] +4-2C3E U+5FD2 # [2000] +4-2C3F U+5FD3 # [2000] +4-2C40 U+5FD4 # [2000] +4-2C41 U+5FE2 # [2000] +4-2C42 U+5FEE # [2000] +4-2C43 U+5FEF # [2000] +4-2C44 U+5FF3 # [2000] +4-2C45 U+5FFC # [2000] +4-2C46 U+3917 # [2000] +4-2C47 U+6017 # [2000] +4-2C48 U+6022 # [2000] +4-2C49 U+6024 # [2000] +4-2C4A U+391A # [2000] +4-2C4B U+604C # [2000] +4-2C4C U+607F # [2000] +4-2C4D U+608A # [2000] +4-2C4E U+6095 # [2000] +4-2C4F U+60A8 # [2000] +4-2C50 U+226F3 # [2000] [Unicode3.1] Private: U+F80E +4-2C51 U+60B0 # [2000] +4-2C52 U+60B1 # [2000] +4-2C53 U+60BE # [2000] +4-2C54 U+60C8 # [2000] +4-2C55 U+60D9 # [2000] +4-2C56 U+60DB # [2000] +4-2C57 U+60EE # [2000] +4-2C58 U+60F2 # [2000] +4-2C59 U+60F5 # [2000] +4-2C5A U+6110 # [2000] +4-2C5B U+6112 # [2000] +4-2C5C U+6113 # [2000] +4-2C5D U+6119 # [2000] +4-2C5E U+611E # [2000] +4-2C5F U+613A # [2000] +4-2C60 U+396F # [2000] +4-2C61 U+6141 # [2000] +4-2C62 U+6146 # [2000] +4-2C63 U+6160 # [2000] +4-2C64 U+617C # [2000] +4-2C65 U+2285B # [2000] [Unicode3.1] Private: U+F80F +4-2C66 U+6192 # [2000] +4-2C67 U+6193 # [2000] +4-2C68 U+6197 # [2000] +4-2C69 U+6198 # [2000] +4-2C6A U+61A5 # [2000] +4-2C6B U+61A8 # [2000] +4-2C6C U+61AD # [2000] +4-2C6D U+228AB # [2000] [Unicode3.1] Private: U+F810 +4-2C6E U+61D5 # [2000] +4-2C6F U+61DD # [2000] +4-2C70 U+61DF # [2000] +4-2C71 U+61F5 # [2000] +4-2C72 U+2298F # [2000] [Unicode3.1] Private: U+F811 +4-2C73 U+6215 # [2000] +4-2C74 U+6223 # [2000] +4-2C75 U+6229 # [2000] +4-2C76 U+6246 # [2000] +4-2C77 U+624C # [2000] +4-2C78 U+6251 # [2000] +4-2C79 U+6252 # [2000] +4-2C7A U+6261 # [2000] +4-2C7B U+6264 # [2000] +4-2C7C U+627B # [2000] +4-2C7D U+626D # [2000] +4-2C7E U+6273 # [2000] +4-2D21 U+6299 # [2000] +4-2D22 U+62A6 # [2000] +4-2D23 U+62D5 # [2000] +4-2D24 U+22AB8 # [2000] [Unicode3.1] Private: U+F812 +4-2D25 U+62FD # [2000] +4-2D26 U+6303 # [2000] +4-2D27 U+630D # [2000] +4-2D28 U+6310 # [2000] +4-2D29 U+22B4F # [2000] [Unicode3.1] Private: U+F813 +4-2D2A U+22B50 # [2000] [Unicode3.1] Private: U+F814 +4-2D2B U+6332 # [2000] +4-2D2C U+6335 # [2000] +4-2D2D U+633B # [2000] +4-2D2E U+633C # [2000] +4-2D2F U+6341 # [2000] +4-2D30 U+6344 # [2000] +4-2D31 U+634E # [2000] +4-2D32 U+22B46 # [2000] [Unicode3.1] Private: U+F815 +4-2D33 U+6359 # [2000] +4-2D34 U+22C1D # [2000] [Unicode3.1] Private: U+F816 +4-2D35 U+22BA6 # [2000] [Unicode3.1] Private: U+F817 +4-2D36 U+636C # [2000] +4-2D37 U+6384 # [2000] +4-2D38 U+6399 # [2000] +4-2D39 U+22C24 # [2000] [Unicode3.1] Private: U+F818 +4-2D3A U+6394 # [2000] +4-2D3B U+63BD # [2000] +4-2D3C U+63F7 # [2000] +4-2D3D U+63D4 # [2000] +4-2D3E U+63D5 # [2000] +4-2D3F U+63DC # [2000] +4-2D40 U+63E0 # [2000] +4-2D41 U+63EB # [2000] +4-2D42 U+63EC # [2000] +4-2D43 U+63F2 # [2000] +4-2D44 U+6409 # [2000] +4-2D45 U+641E # [2000] +4-2D46 U+6425 # [2000] +4-2D47 U+6429 # [2000] +4-2D48 U+642F # [2000] +4-2D49 U+645A # [2000] +4-2D4A U+645B # [2000] +4-2D4B U+645D # [2000] +4-2D4C U+6473 # [2000] +4-2D4D U+647D # [2000] +4-2D4E U+6487 # [2000] +4-2D4F U+6491 # [2000] +4-2D50 U+649D # [2000] +4-2D51 U+649F # [2000] +4-2D52 U+64CB # [2000] +4-2D53 U+64CC # [2000] +4-2D54 U+64D5 # [2000] +4-2D55 U+64D7 # [2000] +4-2D56 U+22DE1 # [2000] [Unicode3.1] Private: U+F819 +4-2D57 U+64E4 # [2000] +4-2D58 U+64E5 # [2000] +4-2D59 U+64FF # [2000] +4-2D5A U+6504 # [2000] +4-2D5B U+3A6E # [2000] +4-2D5C U+650F # [2000] +4-2D5D U+6514 # [2000] +4-2D5E U+6516 # [2000] +4-2D5F U+3A73 # [2000] +4-2D60 U+651E # [2000] +4-2D61 U+6532 # [2000] +4-2D62 U+6544 # [2000] +4-2D63 U+6554 # [2000] +4-2D64 U+656B # [2000] +4-2D65 U+657A # [2000] +4-2D66 U+6581 # [2000] +4-2D67 U+6584 # [2000] +4-2D68 U+6585 # [2000] +4-2D69 U+658A # [2000] +4-2D6A U+65B2 # [2000] +4-2D6B U+65B5 # [2000] +4-2D6C U+65B8 # [2000] +4-2D6D U+65BF # [2000] +4-2D6E U+65C2 # [2000] +4-2D6F U+65C9 # [2000] +4-2D70 U+65D4 # [2000] +4-2D71 U+3AD6 # [2000] +4-2D72 U+65F2 # [2000] +4-2D73 U+65F9 # [2000] +4-2D74 U+65FC # [2000] +4-2D75 U+6604 # [2000] +4-2D76 U+6608 # [2000] +4-2D77 U+6621 # [2000] +4-2D78 U+662A # [2000] +4-2D79 U+6645 # [2000] +4-2D7A U+6651 # [2000] +4-2D7B U+664E # [2000] +4-2D7C U+3AEA # [2000] +4-2D7D U+231C3 # [2000] [Unicode3.1] Private: U+F81A +4-2D7E U+6657 # [2000] +4-2E21 U+665B # [2000] +4-2E22 U+6663 # [2000] +4-2E23 U+231F5 # [2000] [Unicode3.1] Private: U+F81B +4-2E24 U+231B6 # [2000] [Unicode3.1] Private: U+F81C +4-2E25 U+666A # [2000] +4-2E26 U+666B # [2000] +4-2E27 U+666C # [2000] +4-2E28 U+666D # [2000] +4-2E29 U+667B # [2000] +4-2E2A U+6680 # [2000] +4-2E2B U+6690 # [2000] +4-2E2C U+6692 # [2000] +4-2E2D U+6699 # [2000] +4-2E2E U+3B0E # [2000] +4-2E2F U+66AD # [2000] +4-2E30 U+66B1 # [2000] +4-2E31 U+66B5 # [2000] +4-2E32 U+3B1A # [2000] +4-2E33 U+66BF # [2000] +4-2E34 U+3B1C # [2000] +4-2E35 U+66EC # [2000] +4-2E36 U+3AD7 # [2000] +4-2E37 U+6701 # [2000] +4-2E38 U+6705 # [2000] +4-2E39 U+6712 # [2000] +4-2E3A U+23372 # [2000] [Unicode3.1] Private: U+F81D +4-2E3B U+6719 # [2000] +4-2E3C U+233D3 # [2000] [Unicode3.1] Private: U+F81E +4-2E3D U+233D2 # [2000] [Unicode3.1] Private: U+F81F +4-2E3E U+674C # [2000] +4-2E3F U+674D # [2000] +4-2E40 U+6754 # [2000] +4-2E41 U+675D # [2000] +4-2E42 U+233D0 # [2000] [Unicode3.1] Private: U+F820 +4-2E43 U+233E4 # [2000] [Unicode3.1] Private: U+F821 +4-2E44 U+233D5 # [2000] [Unicode3.1] Private: U+F822 +4-2E45 U+6774 # [2000] +4-2E46 U+6776 # [2000] +4-2E47 U+233DA # [2000] [Unicode3.1] Private: U+F823 +4-2E48 U+6792 # [2000] +4-2E49 U+233DF # [2000] [Unicode3.1] Private: U+F824 +4-2E4A U+8363 # [2000] +4-2E4B U+6810 # [2000] +4-2E4C U+67B0 # [2000] +4-2E4D U+67B2 # [2000] +4-2E4E U+67C3 # [2000] +4-2E4F U+67C8 # [2000] +4-2E50 U+67D2 # [2000] +4-2E51 U+67D9 # [2000] +4-2E52 U+67DB # [2000] +4-2E53 U+67F0 # [2000] +4-2E54 U+67F7 # [2000] +4-2E55 U+2344A # [2000] [Unicode3.1] Private: U+F825 +4-2E56 U+23451 # [2000] [Unicode3.1] Private: U+F826 +4-2E57 U+2344B # [2000] [Unicode3.1] Private: U+F827 +4-2E58 U+6818 # [2000] +4-2E59 U+681F # [2000] +4-2E5A U+682D # [2000] +4-2E5B U+23465 # [2000] [Unicode3.1] Private: U+F828 +4-2E5C U+6833 # [2000] +4-2E5D U+683B # [2000] +4-2E5E U+683E # [2000] +4-2E5F U+6844 # [2000] +4-2E60 U+6845 # [2000] +4-2E61 U+6849 # [2000] +4-2E62 U+684C # [2000] +4-2E63 U+6855 # [2000] +4-2E64 U+6857 # [2000] +4-2E65 U+3B77 # [2000] +4-2E66 U+686B # [2000] +4-2E67 U+686E # [2000] +4-2E68 U+687A # [2000] +4-2E69 U+687C # [2000] +4-2E6A U+6882 # [2000] +4-2E6B U+6890 # [2000] +4-2E6C U+6896 # [2000] +4-2E6D U+3B6D # [2000] +4-2E6E U+6898 # [2000] +4-2E6F U+6899 # [2000] +4-2E70 U+689A # [2000] +4-2E71 U+689C # [2000] +4-2E72 U+68AA # [2000] +4-2E73 U+68AB # [2000] +4-2E74 U+68B4 # [2000] +4-2E75 U+68BB # [2000] +4-2E76 U+68FB # [2000] +4-2E77 U+234E4 # [2000] [Unicode3.1] Private: U+F829 +4-2E78 U+2355A # [2000] [Unicode3.1] Private: U+F82A +4-2E79 U+FA13 # CJK COMPATIBILITY IDEOGRAPH-FA13 [2000] +4-2E7A U+68C3 # [2000] +4-2E7B U+68C5 # [2000] +4-2E7C U+68CC # [2000] +4-2E7D U+68CF # [2000] +4-2E7E U+68D6 # [2000] +4-2F21 U+68D9 # [2000] +4-2F22 U+68E4 # [2000] +4-2F23 U+68E5 # [2000] +4-2F24 U+68EC # [2000] +4-2F25 U+68F7 # [2000] +4-2F26 U+6903 # [2000] +4-2F27 U+6907 # [2000] +4-2F28 U+3B87 # [2000] +4-2F29 U+3B88 # [2000] +4-2F2A U+23594 # [2000] [Unicode3.1] Private: U+F82B +4-2F2B U+693B # [2000] +4-2F2C U+3B8D # [2000] +4-2F2D U+6946 # [2000] +4-2F2E U+6969 # [2000] +4-2F2F U+696C # [2000] +4-2F30 U+6972 # [2000] +4-2F31 U+697A # [2000] +4-2F32 U+697F # [2000] +4-2F33 U+6992 # [2000] +4-2F34 U+3BA4 # [2000] +4-2F35 U+6996 # [2000] +4-2F36 U+6998 # [2000] +4-2F37 U+69A6 # [2000] +4-2F38 U+69B0 # [2000] +4-2F39 U+69B7 # [2000] +4-2F3A U+69BA # [2000] +4-2F3B U+69BC # [2000] +4-2F3C U+69C0 # [2000] +4-2F3D U+69D1 # [2000] +4-2F3E U+69D6 # [2000] +4-2F3F U+23639 # [2000] [Unicode3.1] Private: U+F82C +4-2F40 U+23647 # [2000] [Unicode3.1] Private: U+F82D +4-2F41 U+6A30 # [2000] +4-2F42 U+23638 # [2000] [Unicode3.1] Private: U+F82E +4-2F43 U+2363A # [2000] [Unicode3.1] Private: U+F82F +4-2F44 U+69E3 # [2000] +4-2F45 U+69EE # [2000] +4-2F46 U+69EF # [2000] +4-2F47 U+69F3 # [2000] +4-2F48 U+3BCD # [2000] +4-2F49 U+69F4 # [2000] +4-2F4A U+69FE # [2000] +4-2F4B U+6A11 # [2000] +4-2F4C U+6A1A # [2000] +4-2F4D U+6A1D # [2000] +4-2F4E U+2371C # [2000] [Unicode3.1] Private: U+F830 +4-2F4F U+6A32 # [2000] +4-2F50 U+6A33 # [2000] +4-2F51 U+6A34 # [2000] +4-2F52 U+6A3F # [2000] +4-2F53 U+6A46 # [2000] +4-2F54 U+6A49 # [2000] +4-2F55 U+6A7A # [2000] +4-2F56 U+6A4E # [2000] +4-2F57 U+6A52 # [2000] +4-2F58 U+6A64 # [2000] +4-2F59 U+2370C # [2000] [Unicode3.1] Private: U+F831 +4-2F5A U+6A7E # [2000] +4-2F5B U+6A83 # [2000] +4-2F5C U+6A8B # [2000] +4-2F5D U+3BF0 # [2000] +4-2F5E U+6A91 # [2000] +4-2F5F U+6A9F # [2000] +4-2F60 U+6AA1 # [2000] +4-2F61 U+23764 # [2000] [Unicode3.1] Private: U+F832 +4-2F62 U+6AAB # [2000] +4-2F63 U+6ABD # [2000] +4-2F64 U+6AC6 # [2000] +4-2F65 U+6AD4 # [2000] +4-2F66 U+6AD0 # [2000] +4-2F67 U+6ADC # [2000] +4-2F68 U+6ADD # [2000] +4-2F69 U+237FF # [2000] [Unicode3.1] Private: U+F833 +4-2F6A U+237E7 # [2000] [Unicode3.1] Private: U+F834 +4-2F6B U+6AEC # [2000] +4-2F6C U+6AF1 # [2000] +4-2F6D U+6AF2 # [2000] +4-2F6E U+6AF3 # [2000] +4-2F6F U+6AFD # [2000] +4-2F70 U+23824 # [2000] [Unicode3.1] Private: U+F835 +4-2F71 U+6B0B # [2000] +4-2F72 U+6B0F # [2000] +4-2F73 U+6B10 # [2000] +4-2F74 U+6B11 # [2000] +4-2F75 U+2383D # [2000] [Unicode3.1] Private: U+F836 +4-2F76 U+6B17 # [2000] +4-2F77 U+3C26 # [2000] +4-2F78 U+6B2F # [2000] +4-2F79 U+6B4A # [2000] +4-2F7A U+6B58 # [2000] +4-2F7B U+6B6C # [2000] +4-2F7C U+6B75 # [2000] +4-2F7D U+6B7A # [2000] +4-2F7E U+6B81 # [2000] +4-6E21 U+6B9B # [2000] +4-6E22 U+6BAE # [2000] +4-6E23 U+23A98 # [2000] [Unicode3.1] Private: U+F837 +4-6E24 U+6BBD # [2000] +4-6E25 U+6BBE # [2000] +4-6E26 U+6BC7 # [2000] +4-6E27 U+6BC8 # [2000] +4-6E28 U+6BC9 # [2000] +4-6E29 U+6BDA # [2000] +4-6E2A U+6BE6 # [2000] +4-6E2B U+6BE7 # [2000] +4-6E2C U+6BEE # [2000] +4-6E2D U+6BF1 # [2000] +4-6E2E U+6C02 # [2000] +4-6E2F U+6C0A # [2000] +4-6E30 U+6C0E # [2000] +4-6E31 U+6C35 # [2000] +4-6E32 U+6C36 # [2000] +4-6E33 U+6C3A # [2000] +4-6E34 U+23C7F # [2000] [Unicode3.1] Private: U+F838 +4-6E35 U+6C3F # [2000] +4-6E36 U+6C4D # [2000] +4-6E37 U+6C5B # [2000] +4-6E38 U+6C6D # [2000] +4-6E39 U+6C84 # [2000] +4-6E3A U+6C89 # [2000] +4-6E3B U+3CC3 # [2000] +4-6E3C U+6C94 # [2000] +4-6E3D U+6C95 # [2000] +4-6E3E U+6C97 # [2000] +4-6E3F U+6CAD # [2000] +4-6E40 U+6CC2 # [2000] +4-6E41 U+6CD0 # [2000] +4-6E42 U+3CD2 # [2000] +4-6E43 U+6CD6 # [2000] +4-6E44 U+6CDA # [2000] +4-6E45 U+6CDC # [2000] +4-6E46 U+6CE9 # [2000] +4-6E47 U+6CEC # [2000] +4-6E48 U+6CED # [2000] +4-6E49 U+23D00 # [2000] [Unicode3.1] Private: U+F839 +4-6E4A U+6D00 # [2000] +4-6E4B U+6D0A # [2000] +4-6E4C U+6D24 # [2000] +4-6E4D U+6D26 # [2000] +4-6E4E U+6D27 # [2000] +4-6E4F U+6C67 # [2000] +4-6E50 U+6D2F # [2000] +4-6E51 U+6D3C # [2000] +4-6E52 U+6D5B # [2000] +4-6E53 U+6D5E # [2000] +4-6E54 U+6D60 # [2000] +4-6E55 U+6D70 # [2000] +4-6E56 U+6D80 # [2000] +4-6E57 U+6D81 # [2000] +4-6E58 U+6D8A # [2000] +4-6E59 U+6D8D # [2000] +4-6E5A U+6D91 # [2000] +4-6E5B U+6D98 # [2000] +4-6E5C U+23D40 # [2000] [Unicode3.1] Private: U+F83A +4-6E5D U+6E17 # [2000] +4-6E5E U+23DFA # [2000] [Unicode3.1] Private: U+F83B +4-6E5F U+23DF9 # [2000] [Unicode3.1] Private: U+F83C +4-6E60 U+23DD3 # [2000] [Unicode3.1] Private: U+F83D +4-6E61 U+6DAB # [2000] +4-6E62 U+6DAE # [2000] +4-6E63 U+6DB4 # [2000] +4-6E64 U+6DC2 # [2000] +4-6E65 U+6D34 # [2000] +4-6E66 U+6DC8 # [2000] +4-6E67 U+6DCE # [2000] +4-6E68 U+6DCF # [2000] +4-6E69 U+6DD0 # [2000] +4-6E6A U+6DDF # [2000] +4-6E6B U+6DE9 # [2000] +4-6E6C U+6DF6 # [2000] +4-6E6D U+6E36 # [2000] +4-6E6E U+6E1E # [2000] +4-6E6F U+6E22 # [2000] +4-6E70 U+6E27 # [2000] +4-6E71 U+3D11 # [2000] +4-6E72 U+6E32 # [2000] +4-6E73 U+6E3C # [2000] +4-6E74 U+6E48 # [2000] +4-6E75 U+6E49 # [2000] +4-6E76 U+6E4B # [2000] +4-6E77 U+6E4C # [2000] +4-6E78 U+6E4F # [2000] +4-6E79 U+6E51 # [2000] +4-6E7A U+6E53 # [2000] +4-6E7B U+6E54 # [2000] +4-6E7C U+6E57 # [2000] +4-6E7D U+6E63 # [2000] +4-6E7E U+3D1E # [2000] +4-6F21 U+6E93 # [2000] +4-6F22 U+6EA7 # [2000] +4-6F23 U+6EB4 # [2000] +4-6F24 U+6EBF # [2000] +4-6F25 U+6EC3 # [2000] +4-6F26 U+6ECA # [2000] +4-6F27 U+6ED9 # [2000] +4-6F28 U+6F35 # [2000] +4-6F29 U+6EEB # [2000] +4-6F2A U+6EF9 # [2000] +4-6F2B U+6EFB # [2000] +4-6F2C U+6F0A # [2000] +4-6F2D U+6F0C # [2000] +4-6F2E U+6F18 # [2000] +4-6F2F U+6F25 # [2000] +4-6F30 U+6F36 # [2000] +4-6F31 U+6F3C # [2000] +4-6F32 U+23F7E # [2000] [Unicode3.1] Private: U+F83E +4-6F33 U+6F52 # [2000] +4-6F34 U+6F57 # [2000] +4-6F35 U+6F5A # [2000] +4-6F36 U+6F60 # [2000] +4-6F37 U+6F68 # [2000] +4-6F38 U+6F98 # [2000] +4-6F39 U+6F7D # [2000] +4-6F3A U+6F90 # [2000] +4-6F3B U+6F96 # [2000] +4-6F3C U+6FBE # [2000] +4-6F3D U+6F9F # [2000] +4-6F3E U+6FA5 # [2000] +4-6F3F U+6FAF # [2000] +4-6F40 U+3D64 # [2000] +4-6F41 U+6FB5 # [2000] +4-6F42 U+6FC8 # [2000] +4-6F43 U+6FC9 # [2000] +4-6F44 U+6FDA # [2000] +4-6F45 U+6FDE # [2000] +4-6F46 U+6FE9 # [2000] +4-6F47 U+24096 # [2000] [Unicode3.1] Private: U+F83F +4-6F48 U+6FFC # [2000] +4-6F49 U+7000 # [2000] +4-6F4A U+7007 # [2000] +4-6F4B U+700A # [2000] +4-6F4C U+7023 # [2000] +4-6F4D U+24103 # [2000] [Unicode3.1] Private: U+F840 +4-6F4E U+7039 # [2000] +4-6F4F U+703A # [2000] +4-6F50 U+703C # [2000] +4-6F51 U+7043 # [2000] +4-6F52 U+7047 # [2000] +4-6F53 U+704B # [2000] +4-6F54 U+3D9A # [2000] +4-6F55 U+7054 # [2000] +4-6F56 U+7065 # [2000] +4-6F57 U+7069 # [2000] +4-6F58 U+706C # [2000] +4-6F59 U+706E # [2000] +4-6F5A U+7076 # [2000] +4-6F5B U+707E # [2000] +4-6F5C U+7081 # [2000] +4-6F5D U+7086 # [2000] +4-6F5E U+7095 # [2000] +4-6F5F U+7097 # [2000] +4-6F60 U+70BB # [2000] +4-6F61 U+241C6 # [2000] [Unicode3.1] Private: U+F841 +4-6F62 U+709F # [2000] +4-6F63 U+70B1 # [2000] +4-6F64 U+241FE # [2000] [Unicode3.1] Private: U+F842 +4-6F65 U+70EC # [2000] +4-6F66 U+70CA # [2000] +4-6F67 U+70D1 # [2000] +4-6F68 U+70D3 # [2000] +4-6F69 U+70DC # [2000] +4-6F6A U+7103 # [2000] +4-6F6B U+7104 # [2000] +4-6F6C U+7106 # [2000] +4-6F6D U+7107 # [2000] +4-6F6E U+7108 # [2000] +4-6F6F U+710C # [2000] +4-6F70 U+3DC0 # [2000] +4-6F71 U+712F # [2000] +4-6F72 U+7131 # [2000] +4-6F73 U+7150 # [2000] +4-6F74 U+714A # [2000] +4-6F75 U+7153 # [2000] +4-6F76 U+715E # [2000] +4-6F77 U+3DD4 # [2000] +4-6F78 U+7196 # [2000] +4-6F79 U+7180 # [2000] +4-6F7A U+719B # [2000] +4-6F7B U+71A0 # [2000] +4-6F7C U+71A2 # [2000] +4-6F7D U+71AE # [2000] +4-6F7E U+71AF # [2000] +4-7021 U+71B3 # [2000] +4-7022 U+243BC # [2000] [Unicode3.1] Private: U+F843 +4-7023 U+71CB # [2000] +4-7024 U+71D3 # [2000] +4-7025 U+71D9 # [2000] +4-7026 U+71DC # [2000] +4-7027 U+7207 # [2000] +4-7028 U+3E05 # [2000] +4-7029 U+FA49 # CJK COMPATIBILITY IDEOGRAPH-FA49 [2000] [Unicode3.2] +4-702A U+722B # [2000] +4-702B U+7234 # [2000] +4-702C U+7238 # [2000] +4-702D U+7239 # [2000] +4-702E U+4E2C # [2000] +4-702F U+7242 # [2000] +4-7030 U+7253 # [2000] +4-7031 U+7257 # [2000] +4-7032 U+7263 # [2000] +4-7033 U+24629 # [2000] [Unicode3.1] Private: U+F845 +4-7034 U+726E # [2000] +4-7035 U+726F # [2000] +4-7036 U+7278 # [2000] +4-7037 U+727F # [2000] +4-7038 U+728E # [2000] +4-7039 U+246A5 # [2000] [Unicode3.1] Private: U+F846 +4-703A U+72AD # [2000] +4-703B U+72AE # [2000] +4-703C U+72B0 # [2000] +4-703D U+72B1 # [2000] +4-703E U+72C1 # [2000] +4-703F U+3E60 # [2000] +4-7040 U+72CC # [2000] +4-7041 U+3E66 # [2000] +4-7042 U+3E68 # [2000] +4-7043 U+72F3 # [2000] +4-7044 U+72FA # [2000] +4-7045 U+7307 # [2000] +4-7046 U+7312 # [2000] +4-7047 U+7318 # [2000] +4-7048 U+7319 # [2000] +4-7049 U+3E83 # [2000] +4-704A U+7339 # [2000] +4-704B U+732C # [2000] +4-704C U+7331 # [2000] +4-704D U+7333 # [2000] +4-704E U+733D # [2000] +4-704F U+7352 # [2000] +4-7050 U+3E94 # [2000] +4-7051 U+736B # [2000] +4-7052 U+736C # [2000] +4-7053 U+24896 # [2000] [Unicode3.1] Private: U+F847 +4-7054 U+736E # [2000] +4-7055 U+736F # [2000] +4-7056 U+7371 # [2000] +4-7057 U+7377 # [2000] +4-7058 U+7381 # [2000] +4-7059 U+7385 # [2000] +4-705A U+738A # [2000] +4-705B U+7394 # [2000] +4-705C U+7398 # [2000] +4-705D U+739C # [2000] +4-705E U+739E # [2000] +4-705F U+73A5 # [2000] +4-7060 U+73A8 # [2000] +4-7061 U+73B5 # [2000] +4-7062 U+73B7 # [2000] +4-7063 U+73B9 # [2000] +4-7064 U+73BC # [2000] +4-7065 U+73BF # [2000] +4-7066 U+73C5 # [2000] +4-7067 U+73CB # [2000] +4-7068 U+73E1 # [2000] +4-7069 U+73E7 # [2000] +4-706A U+73F9 # [2000] +4-706B U+7413 # [2000] +4-706C U+73FA # [2000] +4-706D U+7401 # [2000] +4-706E U+7424 # [2000] +4-706F U+7431 # [2000] +4-7070 U+7439 # [2000] +4-7071 U+7453 # [2000] +4-7072 U+7440 # [2000] +4-7073 U+7443 # [2000] +4-7074 U+744D # [2000] +4-7075 U+7452 # [2000] +4-7076 U+745D # [2000] +4-7077 U+7471 # [2000] +4-7078 U+7481 # [2000] +4-7079 U+7485 # [2000] +4-707A U+7488 # [2000] +4-707B U+24A4D # [2000] [Unicode3.1] Private: U+F848 +4-707C U+7492 # [2000] +4-707D U+7497 # [2000] +4-707E U+7499 # [2000] +4-7121 U+74A0 # [2000] +4-7122 U+74A1 # [2000] +4-7123 U+74A5 # [2000] +4-7124 U+74AA # [2000] +4-7125 U+74AB # [2000] +4-7126 U+74B9 # [2000] +4-7127 U+74BB # [2000] +4-7128 U+74BA # [2000] +4-7129 U+74D6 # [2000] +4-712A U+74D8 # [2000] +4-712B U+74DE # [2000] +4-712C U+74EF # [2000] +4-712D U+74EB # [2000] +4-712E U+24B56 # [2000] [Unicode3.1] Private: U+F849 +4-712F U+74FA # [2000] +4-7130 U+24B6F # [2000] [Unicode3.1] Private: U+F84A +4-7131 U+7520 # [2000] +4-7132 U+7524 # [2000] +4-7133 U+752A # [2000] +4-7134 U+3F57 # [2000] +4-7135 U+24C16 # [2000] [Unicode3.1] Private: U+F84B +4-7136 U+753D # [2000] +4-7137 U+753E # [2000] +4-7138 U+7540 # [2000] +4-7139 U+7548 # [2000] +4-713A U+754E # [2000] +4-713B U+7550 # [2000] +4-713C U+7552 # [2000] +4-713D U+756C # [2000] +4-713E U+7572 # [2000] +4-713F U+7571 # [2000] +4-7140 U+757A # [2000] +4-7141 U+757D # [2000] +4-7142 U+757E # [2000] +4-7143 U+7581 # [2000] +4-7144 U+24D14 # [2000] [Unicode3.1] Private: U+F84C +4-7145 U+758C # [2000] +4-7146 U+3F75 # [2000] +4-7147 U+75A2 # [2000] +4-7148 U+3F77 # [2000] +4-7149 U+75B0 # [2000] +4-714A U+75B7 # [2000] +4-714B U+75BF # [2000] +4-714C U+75C0 # [2000] +4-714D U+75C6 # [2000] +4-714E U+75CF # [2000] +4-714F U+75D3 # [2000] +4-7150 U+75DD # [2000] +4-7151 U+75DF # [2000] +4-7152 U+75E0 # [2000] +4-7153 U+75E7 # [2000] +4-7154 U+75EC # [2000] +4-7155 U+75EE # [2000] +4-7156 U+75F1 # [2000] +4-7157 U+75F9 # [2000] +4-7158 U+7603 # [2000] +4-7159 U+7618 # [2000] +4-715A U+7607 # [2000] +4-715B U+760F # [2000] +4-715C U+3FAE # [2000] +4-715D U+24E0E # [2000] [Unicode3.1] Private: U+F84D +4-715E U+7613 # [2000] +4-715F U+761B # [2000] +4-7160 U+761C # [2000] +4-7161 U+24E37 # [2000] [Unicode3.1] Private: U+F84E +4-7162 U+7625 # [2000] +4-7163 U+7628 # [2000] +4-7164 U+763C # [2000] +4-7165 U+7633 # [2000] +4-7166 U+24E6A # [2000] [Unicode3.1] Private: U+F84F +4-7167 U+3FC9 # [2000] +4-7168 U+7641 # [2000] +4-7169 U+24E8B # [2000] [Unicode3.1] Private: U+F850 +4-716A U+7649 # [2000] +4-716B U+7655 # [2000] +4-716C U+3FD7 # [2000] +4-716D U+766E # [2000] +4-716E U+7695 # [2000] +4-716F U+769C # [2000] +4-7170 U+76A1 # [2000] +4-7171 U+76A0 # [2000] +4-7172 U+76A7 # [2000] +4-7173 U+76A8 # [2000] +4-7174 U+76AF # [2000] +4-7175 U+2504A # [2000] [Unicode3.1] Private: U+F851 +4-7176 U+76C9 # [2000] +4-7177 U+25055 # [2000] [Unicode3.1] Private: U+F852 +4-7178 U+76E8 # [2000] +4-7179 U+76EC # [2000] +4-717A U+25122 # [2000] [Unicode3.1] Private: U+F853 +4-717B U+7717 # [2000] +4-717C U+771A # [2000] +4-717D U+772D # [2000] +4-717E U+7735 # [2000] +4-7221 U+251A9 # [2000] [Unicode3.1] Private: U+F854 +4-7222 U+4039 # [2000] +4-7223 U+251E5 # [2000] [Unicode3.1] Private: U+F855 +4-7224 U+251CD # [2000] [Unicode3.1] Private: U+F856 +4-7225 U+7758 # [2000] +4-7226 U+7760 # [2000] +4-7227 U+776A # [2000] +4-7228 U+2521E # [2000] [Unicode3.1] Private: U+F857 +4-7229 U+7772 # [2000] +4-722A U+777C # [2000] +4-722B U+777D # [2000] +4-722C U+2524C # [2000] [Unicode3.1] Private: U+F858 +4-722D U+4058 # [2000] +4-722E U+779A # [2000] +4-722F U+779F # [2000] +4-7230 U+77A2 # [2000] +4-7231 U+77A4 # [2000] +4-7232 U+77A9 # [2000] +4-7233 U+77DE # [2000] +4-7234 U+77DF # [2000] +4-7235 U+77E4 # [2000] +4-7236 U+77E6 # [2000] +4-7237 U+77EA # [2000] +4-7238 U+77EC # [2000] +4-7239 U+4093 # [2000] +4-723A U+77F0 # [2000] +4-723B U+77F4 # [2000] +4-723C U+77FB # [2000] +4-723D U+2542E # [2000] [Unicode3.1] Private: U+F859 +4-723E U+7805 # [2000] +4-723F U+7806 # [2000] +4-7240 U+7809 # [2000] +4-7241 U+780D # [2000] +4-7242 U+7819 # [2000] +4-7243 U+7821 # [2000] +4-7244 U+782C # [2000] +4-7245 U+7847 # [2000] +4-7246 U+7864 # [2000] +4-7247 U+786A # [2000] +4-7248 U+254D9 # [2000] [Unicode3.1] Private: U+F85A +4-7249 U+788A # [2000] +4-724A U+7894 # [2000] +4-724B U+78A4 # [2000] +4-724C U+789D # [2000] +4-724D U+789E # [2000] +4-724E U+789F # [2000] +4-724F U+78BB # [2000] +4-7250 U+78C8 # [2000] +4-7251 U+78CC # [2000] +4-7252 U+78CE # [2000] +4-7253 U+78D5 # [2000] +4-7254 U+78E0 # [2000] +4-7255 U+78E1 # [2000] +4-7256 U+78E6 # [2000] +4-7257 U+78F9 # [2000] +4-7258 U+78FA # [2000] +4-7259 U+78FB # [2000] +4-725A U+78FE # [2000] +4-725B U+255A7 # [2000] [Unicode3.1] Private: U+F85B +4-725C U+7910 # [2000] +4-725D U+791B # [2000] +4-725E U+7930 # [2000] +4-725F U+7925 # [2000] +4-7260 U+793B # [2000] +4-7261 U+794A # [2000] +4-7262 U+7958 # [2000] +4-7263 U+795B # [2000] +4-7264 U+4105 # [2000] +4-7265 U+7967 # [2000] +4-7266 U+7972 # [2000] +4-7267 U+7994 # [2000] +4-7268 U+7995 # [2000] +4-7269 U+7996 # [2000] +4-726A U+799B # [2000] +4-726B U+79A1 # [2000] +4-726C U+79A9 # [2000] +4-726D U+79B4 # [2000] +4-726E U+79BB # [2000] +4-726F U+79C2 # [2000] +4-7270 U+79C7 # [2000] +4-7271 U+79CC # [2000] +4-7272 U+79CD # [2000] +4-7273 U+79D6 # [2000] +4-7274 U+4148 # [2000] +4-7275 U+257A9 # [2000] [Unicode3.1] Private: U+F85C +4-7276 U+257B4 # [2000] [Unicode3.1] Private: U+F85D +4-7277 U+414F # [2000] +4-7278 U+7A0A # [2000] +4-7279 U+7A11 # [2000] +4-727A U+7A15 # [2000] +4-727B U+7A1B # [2000] +4-727C U+7A1E # [2000] +4-727D U+4163 # [2000] +4-727E U+7A2D # [2000] +4-7321 U+7A38 # [2000] +4-7322 U+7A47 # [2000] +4-7323 U+7A4C # [2000] +4-7324 U+7A56 # [2000] +4-7325 U+7A59 # [2000] +4-7326 U+7A5C # [2000] +4-7327 U+7A5F # [2000] +4-7328 U+7A60 # [2000] +4-7329 U+7A67 # [2000] +4-732A U+7A6A # [2000] +4-732B U+7A75 # [2000] +4-732C U+7A78 # [2000] +4-732D U+7A82 # [2000] +4-732E U+7A8A # [2000] +4-732F U+7A90 # [2000] +4-7330 U+7AA3 # [2000] +4-7331 U+7AAC # [2000] +4-7332 U+259D4 # [2000] [Unicode3.1] Private: U+F85E +4-7333 U+41B4 # [2000] +4-7334 U+7AB9 # [2000] +4-7335 U+7ABC # [2000] +4-7336 U+7ABE # [2000] +4-7337 U+41BF # [2000] +4-7338 U+7ACC # [2000] +4-7339 U+7AD1 # [2000] +4-733A U+7AE7 # [2000] +4-733B U+7AE8 # [2000] +4-733C U+7AF4 # [2000] +4-733D U+25AE4 # [2000] [Unicode3.1] Private: U+F85F +4-733E U+25AE3 # [2000] [Unicode3.1] Private: U+F860 +4-733F U+7B07 # [2000] +4-7340 U+25AF1 # [2000] [Unicode3.1] Private: U+F861 +4-7341 U+7B3D # [2000] +4-7342 U+7B27 # [2000] +4-7343 U+7B2A # [2000] +4-7344 U+7B2E # [2000] +4-7345 U+7B2F # [2000] +4-7346 U+7B31 # [2000] +4-7347 U+41E6 # [2000] +4-7348 U+41F3 # [2000] +4-7349 U+7B7F # [2000] +4-734A U+7B41 # [2000] +4-734B U+41EE # [2000] +4-734C U+7B55 # [2000] +4-734D U+7B79 # [2000] +4-734E U+7B64 # [2000] +4-734F U+7B66 # [2000] +4-7350 U+7B69 # [2000] +4-7351 U+7B73 # [2000] +4-7352 U+25BB2 # [2000] [Unicode3.1] Private: U+F862 +4-7353 U+4207 # [2000] +4-7354 U+7B90 # [2000] +4-7355 U+7B91 # [2000] +4-7356 U+7B9B # [2000] +4-7357 U+420E # [2000] +4-7358 U+7BAF # [2000] +4-7359 U+7BB5 # [2000] +4-735A U+7BBC # [2000] +4-735B U+7BC5 # [2000] +4-735C U+7BCA # [2000] +4-735D U+25C4B # [2000] [Unicode3.1] Private: U+F863 +4-735E U+25C64 # [2000] [Unicode3.1] Private: U+F864 +4-735F U+7BD4 # [2000] +4-7360 U+7BD6 # [2000] +4-7361 U+7BDA # [2000] +4-7362 U+7BEA # [2000] +4-7363 U+7BF0 # [2000] +4-7364 U+7C03 # [2000] +4-7365 U+7C0B # [2000] +4-7366 U+7C0E # [2000] +4-7367 U+7C0F # [2000] +4-7368 U+7C26 # [2000] +4-7369 U+7C45 # [2000] +4-736A U+7C4A # [2000] +4-736B U+7C51 # [2000] +4-736C U+7C57 # [2000] +4-736D U+7C5E # [2000] +4-736E U+7C61 # [2000] +4-736F U+7C69 # [2000] +4-7370 U+7C6E # [2000] +4-7371 U+7C6F # [2000] +4-7372 U+7C70 # [2000] +4-7373 U+25E2E # [2000] [Unicode3.1] Private: U+F865 +4-7374 U+25E56 # [2000] [Unicode3.1] Private: U+F866 +4-7375 U+25E65 # [2000] [Unicode3.1] Private: U+F867 +4-7376 U+7CA6 # [2000] +4-7377 U+25E62 # [2000] [Unicode3.1] Private: U+F868 +4-7378 U+7CB6 # [2000] +4-7379 U+7CB7 # [2000] +4-737A U+7CBF # [2000] +4-737B U+25ED8 # [2000] [Unicode3.1] Private: U+F869 +4-737C U+7CC4 # [2000] +4-737D U+25EC2 # [2000] [Unicode3.1] Private: U+F86A +4-737E U+7CC8 # [2000] +4-7421 U+7CCD # [2000] +4-7422 U+25EE8 # [2000] [Unicode3.1] Private: U+F86B +4-7423 U+7CD7 # [2000] +4-7424 U+25F23 # [2000] [Unicode3.1] Private: U+F86C +4-7425 U+7CE6 # [2000] +4-7426 U+7CEB # [2000] +4-7427 U+25F5C # [2000] [Unicode3.1] Private: U+F86D +4-7428 U+7CF5 # [2000] +4-7429 U+7D03 # [2000] +4-742A U+7D09 # [2000] +4-742B U+42C6 # [2000] +4-742C U+7D12 # [2000] +4-742D U+7D1E # [2000] +4-742E U+25FE0 # [2000] [Unicode3.1] Private: U+F86E +4-742F U+25FD4 # [2000] [Unicode3.1] Private: U+F86F +4-7430 U+7D3D # [2000] +4-7431 U+7D3E # [2000] +4-7432 U+7D40 # [2000] +4-7433 U+7D47 # [2000] +4-7434 U+2600C # [2000] [Unicode3.1] Private: U+F870 +4-7435 U+25FFB # [2000] [Unicode3.1] Private: U+F871 +4-7436 U+42D6 # [2000] +4-7437 U+7D59 # [2000] +4-7438 U+7D5A # [2000] +4-7439 U+7D6A # [2000] +4-743A U+7D70 # [2000] +4-743B U+42DD # [2000] +4-743C U+7D7F # [2000] +4-743D U+26017 # [2000] [Unicode3.1] Private: U+F872 +4-743E U+7D86 # [2000] +4-743F U+7D88 # [2000] +4-7440 U+7D8C # [2000] +4-7441 U+7D97 # [2000] +4-7442 U+26060 # [2000] [Unicode3.1] Private: U+F873 +4-7443 U+7D9D # [2000] +4-7444 U+7DA7 # [2000] +4-7445 U+7DAA # [2000] +4-7446 U+7DB6 # [2000] +4-7447 U+7DB7 # [2000] +4-7448 U+7DC0 # [2000] +4-7449 U+7DD7 # [2000] +4-744A U+7DD9 # [2000] +4-744B U+7DE6 # [2000] +4-744C U+7DF1 # [2000] +4-744D U+7DF9 # [2000] +4-744E U+4302 # [2000] +4-744F U+260ED # [2000] [Unicode3.1] Private: U+F874 +4-7450 U+FA58 # CJK COMPATIBILITY IDEOGRAPH-FA58 [2000] [Unicode3.2] +4-7451 U+7E10 # [2000] +4-7452 U+7E17 # [2000] +4-7453 U+7E1D # [2000] +4-7454 U+7E20 # [2000] +4-7455 U+7E27 # [2000] +4-7456 U+7E2C # [2000] +4-7457 U+7E45 # [2000] +4-7458 U+7E73 # [2000] +4-7459 U+7E75 # [2000] +4-745A U+7E7E # [2000] +4-745B U+7E86 # [2000] +4-745C U+7E87 # [2000] +4-745D U+432B # [2000] +4-745E U+7E91 # [2000] +4-745F U+7E98 # [2000] +4-7460 U+7E9A # [2000] +4-7461 U+4343 # [2000] +4-7462 U+7F3C # [2000] +4-7463 U+7F3B # [2000] +4-7464 U+7F3E # [2000] +4-7465 U+7F43 # [2000] +4-7466 U+7F44 # [2000] +4-7467 U+7F4F # [2000] +4-7468 U+34C1 # [2000] +4-7469 U+26270 # [2000] [Unicode3.1] Private: U+F876 +4-746A U+7F52 # [2000] +4-746B U+26286 # [2000] [Unicode3.1] Private: U+F877 +4-746C U+7F61 # [2000] +4-746D U+7F63 # [2000] +4-746E U+7F64 # [2000] +4-746F U+7F6D # [2000] +4-7470 U+7F7D # [2000] +4-7471 U+7F7E # [2000] +4-7472 U+2634C # [2000] [Unicode3.1] Private: U+F878 +4-7473 U+7F90 # [2000] +4-7474 U+517B # [2000] +4-7475 U+23D0E # [2000] [Unicode3.1] Private: U+F879 +4-7476 U+7F96 # [2000] +4-7477 U+7F9C # [2000] +4-7478 U+7FAD # [2000] +4-7479 U+26402 # [2000] [Unicode3.1] Private: U+F87A +4-747A U+7FC3 # [2000] +4-747B U+7FCF # [2000] +4-747C U+7FE3 # [2000] +4-747D U+7FE5 # [2000] +4-747E U+7FEF # [2000] +4-7521 U+7FF2 # [2000] +4-7522 U+8002 # [2000] +4-7523 U+800A # [2000] +4-7524 U+8008 # [2000] +4-7525 U+800E # [2000] +4-7526 U+8011 # [2000] +4-7527 U+8016 # [2000] +4-7528 U+8024 # [2000] +4-7529 U+802C # [2000] +4-752A U+8030 # [2000] +4-752B U+8043 # [2000] +4-752C U+8066 # [2000] +4-752D U+8071 # [2000] +4-752E U+8075 # [2000] +4-752F U+807B # [2000] +4-7530 U+8099 # [2000] +4-7531 U+809C # [2000] +4-7532 U+80A4 # [2000] +4-7533 U+80A7 # [2000] +4-7534 U+80B8 # [2000] +4-7535 U+2667E # [2000] [Unicode3.1] Private: U+F87B +4-7536 U+80C5 # [2000] +4-7537 U+80D5 # [2000] +4-7538 U+80D8 # [2000] +4-7539 U+80E6 # [2000] +4-753A U+266B0 # [2000] [Unicode3.1] Private: U+F87C +4-753B U+810D # [2000] +4-753C U+80F5 # [2000] +4-753D U+80FB # [2000] +4-753E U+43EE # [2000] +4-753F U+8135 # [2000] +4-7540 U+8116 # [2000] +4-7541 U+811E # [2000] +4-7542 U+43F0 # [2000] +4-7543 U+8124 # [2000] +4-7544 U+8127 # [2000] +4-7545 U+812C # [2000] +4-7546 U+2671D # [2000] [Unicode3.1] Private: U+F87D +4-7547 U+813D # [2000] +4-7548 U+4408 # [2000] +4-7549 U+8169 # [2000] +4-754A U+4417 # [2000] +4-754B U+8181 # [2000] +4-754C U+441C # [2000] +4-754D U+8184 # [2000] +4-754E U+8185 # [2000] +4-754F U+4422 # [2000] +4-7550 U+8198 # [2000] +4-7551 U+81B2 # [2000] +4-7552 U+81C1 # [2000] +4-7553 U+81C3 # [2000] +4-7554 U+81D6 # [2000] +4-7555 U+81DB # [2000] +4-7556 U+268DD # [2000] [Unicode3.1] Private: U+F87E +4-7557 U+81E4 # [2000] +4-7558 U+268EA # [2000] [Unicode3.1] Private: U+F87F +4-7559 U+81EC # [2000] +4-755A U+26951 # [2000] [Unicode3.1] Private: U+F880 +4-755B U+81FD # [2000] +4-755C U+81FF # [2000] +4-755D U+2696F # [2000] [Unicode3.1] Private: U+F881 +4-755E U+8204 # [2000] +4-755F U+269DD # [2000] [Unicode3.1] Private: U+F882 +4-7560 U+8219 # [2000] +4-7561 U+8221 # [2000] +4-7562 U+8222 # [2000] +4-7563 U+26A1E # [2000] [Unicode3.1] Private: U+F883 +4-7564 U+8232 # [2000] +4-7565 U+8234 # [2000] +4-7566 U+823C # [2000] +4-7567 U+8246 # [2000] +4-7568 U+8249 # [2000] +4-7569 U+8245 # [2000] +4-756A U+26A58 # [2000] [Unicode3.1] Private: U+F884 +4-756B U+824B # [2000] +4-756C U+4476 # [2000] +4-756D U+824F # [2000] +4-756E U+447A # [2000] +4-756F U+8257 # [2000] +4-7570 U+26A8C # [2000] [Unicode3.1] Private: U+F885 +4-7571 U+825C # [2000] +4-7572 U+8263 # [2000] +4-7573 U+26AB7 # [2000] [Unicode3.1] Private: U+F886 +4-7574 U+FA5D # CJK COMPATIBILITY IDEOGRAPH-FA5D [2000] [Unicode3.2] +4-7575 U+FA5E # CJK COMPATIBILITY IDEOGRAPH-FA5E [2000] [Unicode3.2] +4-7576 U+8279 # [2000] +4-7577 U+4491 # [2000] +4-7578 U+827D # [2000] +4-7579 U+827F # [2000] +4-757A U+8283 # [2000] +4-757B U+828A # [2000] +4-757C U+8293 # [2000] +4-757D U+82A7 # [2000] +4-757E U+82A8 # [2000] +4-7621 U+82B2 # [2000] +4-7622 U+82B4 # [2000] +4-7623 U+82BA # [2000] +4-7624 U+82BC # [2000] +4-7625 U+82E2 # [2000] +4-7626 U+82E8 # [2000] +4-7627 U+82F7 # [2000] +4-7628 U+8307 # [2000] +4-7629 U+8308 # [2000] +4-762A U+830C # [2000] +4-762B U+8354 # [2000] +4-762C U+831B # [2000] +4-762D U+831D # [2000] +4-762E U+8330 # [2000] +4-762F U+833C # [2000] +4-7630 U+8344 # [2000] +4-7631 U+8357 # [2000] +4-7632 U+44BE # [2000] +4-7633 U+837F # [2000] +4-7634 U+44D4 # [2000] +4-7635 U+44B3 # [2000] +4-7636 U+838D # [2000] +4-7637 U+8394 # [2000] +4-7638 U+8395 # [2000] +4-7639 U+839B # [2000] +4-763A U+839D # [2000] +4-763B U+83C9 # [2000] +4-763C U+83D0 # [2000] +4-763D U+83D4 # [2000] +4-763E U+83DD # [2000] +4-763F U+83E5 # [2000] +4-7640 U+83F9 # [2000] +4-7641 U+840F # [2000] +4-7642 U+8411 # [2000] +4-7643 U+8415 # [2000] +4-7644 U+26C73 # [2000] [Unicode3.1] Private: U+F889 +4-7645 U+8417 # [2000] +4-7646 U+8439 # [2000] +4-7647 U+844A # [2000] +4-7648 U+844F # [2000] +4-7649 U+8451 # [2000] +4-764A U+8452 # [2000] +4-764B U+8459 # [2000] +4-764C U+845A # [2000] +4-764D U+845C # [2000] +4-764E U+26CDD # [2000] [Unicode3.1] Private: U+F88A +4-764F U+8465 # [2000] +4-7650 U+8476 # [2000] +4-7651 U+8478 # [2000] +4-7652 U+847C # [2000] +4-7653 U+8481 # [2000] +4-7654 U+450D # [2000] +4-7655 U+84DC # [2000] +4-7656 U+8497 # [2000] +4-7657 U+84A6 # [2000] +4-7658 U+84BE # [2000] +4-7659 U+4508 # [2000] +4-765A U+84CE # [2000] +4-765B U+84CF # [2000] +4-765C U+84D3 # [2000] +4-765D U+26E65 # [2000] [Unicode3.1] Private: U+F88B +4-765E U+84E7 # [2000] +4-765F U+84EA # [2000] +4-7660 U+84EF # [2000] +4-7661 U+84F0 # [2000] +4-7662 U+84F1 # [2000] +4-7663 U+84FA # [2000] +4-7664 U+84FD # [2000] +4-7665 U+850C # [2000] +4-7666 U+851B # [2000] +4-7667 U+8524 # [2000] +4-7668 U+8525 # [2000] +4-7669 U+852B # [2000] +4-766A U+8534 # [2000] +4-766B U+854F # [2000] +4-766C U+856F # [2000] +4-766D U+4525 # [2000] +4-766E U+4543 # [2000] +4-766F U+853E # [2000] +4-7670 U+8551 # [2000] +4-7671 U+8553 # [2000] +4-7672 U+855E # [2000] +4-7673 U+8561 # [2000] +4-7674 U+8562 # [2000] +4-7675 U+26F94 # [2000] [Unicode3.1] Private: U+F88C +4-7676 U+857B # [2000] +4-7677 U+857D # [2000] +4-7678 U+857F # [2000] +4-7679 U+8581 # [2000] +4-767A U+8586 # [2000] +4-767B U+8593 # [2000] +4-767C U+859D # [2000] +4-767D U+859F # [2000] +4-767E U+26FF8 # [2000] [Unicode3.1] Private: U+F88D +4-7721 U+26FF6 # [2000] [Unicode3.1] Private: U+F88E +4-7722 U+26FF7 # [2000] [Unicode3.1] Private: U+F88F +4-7723 U+85B7 # [2000] +4-7724 U+85BC # [2000] +4-7725 U+85C7 # [2000] +4-7726 U+85CA # [2000] +4-7727 U+85D8 # [2000] +4-7728 U+85D9 # [2000] +4-7729 U+85DF # [2000] +4-772A U+85E1 # [2000] +4-772B U+85E6 # [2000] +4-772C U+85F6 # [2000] +4-772D U+8600 # [2000] +4-772E U+8611 # [2000] +4-772F U+861E # [2000] +4-7730 U+8621 # [2000] +4-7731 U+8624 # [2000] +4-7732 U+8627 # [2000] +4-7733 U+2710D # [2000] [Unicode3.1] Private: U+F890 +4-7734 U+8639 # [2000] +4-7735 U+863C # [2000] +4-7736 U+27139 # [2000] [Unicode3.1] Private: U+F891 +4-7737 U+8640 # [2000] +4-7738 U+FA20 # CJK COMPATIBILITY IDEOGRAPH-FA20 [2000] +4-7739 U+8653 # [2000] +4-773A U+8656 # [2000] +4-773B U+866F # [2000] +4-773C U+8677 # [2000] +4-773D U+867A # [2000] +4-773E U+8687 # [2000] +4-773F U+8689 # [2000] +4-7740 U+868D # [2000] +4-7741 U+8691 # [2000] +4-7742 U+869C # [2000] +4-7743 U+869D # [2000] +4-7744 U+86A8 # [2000] +4-7745 U+FA21 # CJK COMPATIBILITY IDEOGRAPH-FA21 [2000] +4-7746 U+86B1 # [2000] +4-7747 U+86B3 # [2000] +4-7748 U+86C1 # [2000] +4-7749 U+86C3 # [2000] +4-774A U+86D1 # [2000] +4-774B U+86D5 # [2000] +4-774C U+86D7 # [2000] +4-774D U+86E3 # [2000] +4-774E U+86E6 # [2000] +4-774F U+45B8 # [2000] +4-7750 U+8705 # [2000] +4-7751 U+8707 # [2000] +4-7752 U+870E # [2000] +4-7753 U+8710 # [2000] +4-7754 U+8713 # [2000] +4-7755 U+8719 # [2000] +4-7756 U+871F # [2000] +4-7757 U+8721 # [2000] +4-7758 U+8723 # [2000] +4-7759 U+8731 # [2000] +4-775A U+873A # [2000] +4-775B U+873E # [2000] +4-775C U+8740 # [2000] +4-775D U+8743 # [2000] +4-775E U+8751 # [2000] +4-775F U+8758 # [2000] +4-7760 U+8764 # [2000] +4-7761 U+8765 # [2000] +4-7762 U+8772 # [2000] +4-7763 U+877C # [2000] +4-7764 U+273DB # [2000] [Unicode3.1] Private: U+F892 +4-7765 U+273DA # [2000] [Unicode3.1] Private: U+F893 +4-7766 U+87A7 # [2000] +4-7767 U+8789 # [2000] +4-7768 U+878B # [2000] +4-7769 U+8793 # [2000] +4-776A U+87A0 # [2000] +4-776B U+273FE # [2000] [Unicode3.1] Private: U+F894 +4-776C U+45E5 # [2000] +4-776D U+87BE # [2000] +4-776E U+27410 # [2000] [Unicode3.1] Private: U+F895 +4-776F U+87C1 # [2000] +4-7770 U+87CE # [2000] +4-7771 U+87F5 # [2000] +4-7772 U+87DF # [2000] +4-7773 U+27449 # [2000] [Unicode3.1] Private: U+F896 +4-7774 U+87E3 # [2000] +4-7775 U+87E5 # [2000] +4-7776 U+87E6 # [2000] +4-7777 U+87EA # [2000] +4-7778 U+87EB # [2000] +4-7779 U+87ED # [2000] +4-777A U+8801 # [2000] +4-777B U+8803 # [2000] +4-777C U+880B # [2000] +4-777D U+8813 # [2000] +4-777E U+8828 # [2000] +4-7821 U+882E # [2000] +4-7822 U+8832 # [2000] +4-7823 U+883C # [2000] +4-7824 U+460F # [2000] +4-7825 U+884A # [2000] +4-7826 U+8858 # [2000] +4-7827 U+885F # [2000] +4-7828 U+8864 # [2000] +4-7829 U+27615 # [2000] [Unicode3.1] Private: U+F897 +4-782A U+27614 # [2000] [Unicode3.1] Private: U+F898 +4-782B U+8869 # [2000] +4-782C U+27631 # [2000] [Unicode3.1] Private: U+F899 +4-782D U+886F # [2000] +4-782E U+88A0 # [2000] +4-782F U+88BC # [2000] +4-7830 U+88BD # [2000] +4-7831 U+88BE # [2000] +4-7832 U+88C0 # [2000] +4-7833 U+88D2 # [2000] +4-7834 U+27693 # [2000] [Unicode3.1] Private: U+F89A +4-7835 U+88D1 # [2000] +4-7836 U+88D3 # [2000] +4-7837 U+88DB # [2000] +4-7838 U+88F0 # [2000] +4-7839 U+88F1 # [2000] +4-783A U+4641 # [2000] +4-783B U+8901 # [2000] +4-783C U+2770E # [2000] [Unicode3.1] Private: U+F89B +4-783D U+8937 # [2000] +4-783E U+27723 # [2000] [Unicode3.1] Private: U+F89C +4-783F U+8942 # [2000] +4-7840 U+8945 # [2000] +4-7841 U+8949 # [2000] +4-7842 U+27752 # [2000] [Unicode3.1] Private: U+F89D +4-7843 U+4665 # [2000] +4-7844 U+8962 # [2000] +4-7845 U+8980 # [2000] +4-7846 U+8989 # [2000] +4-7847 U+8990 # [2000] +4-7848 U+899F # [2000] +4-7849 U+89B0 # [2000] +4-784A U+89B7 # [2000] +4-784B U+89D6 # [2000] +4-784C U+89D8 # [2000] +4-784D U+89EB # [2000] +4-784E U+46A1 # [2000] +4-784F U+89F1 # [2000] +4-7850 U+89F3 # [2000] +4-7851 U+89FD # [2000] +4-7852 U+89FF # [2000] +4-7853 U+46AF # [2000] +4-7854 U+8A11 # [2000] +4-7855 U+8A14 # [2000] +4-7856 U+27985 # [2000] [Unicode3.1] Private: U+F89E +4-7857 U+8A21 # [2000] +4-7858 U+8A35 # [2000] +4-7859 U+8A3E # [2000] +4-785A U+8A45 # [2000] +4-785B U+8A4D # [2000] +4-785C U+8A58 # [2000] +4-785D U+8AAE # [2000] +4-785E U+8A90 # [2000] +4-785F U+8AB7 # [2000] +4-7860 U+8ABE # [2000] +4-7861 U+8AD7 # [2000] +4-7862 U+8AFC # [2000] +4-7863 U+27A84 # [2000] [Unicode3.1] Private: U+F89F +4-7864 U+8B0A # [2000] +4-7865 U+8B05 # [2000] +4-7866 U+8B0D # [2000] +4-7867 U+8B1C # [2000] +4-7868 U+8B1F # [2000] +4-7869 U+8B2D # [2000] +4-786A U+8B43 # [2000] +4-786B U+470C # [2000] +4-786C U+8B51 # [2000] +4-786D U+8B5E # [2000] +4-786E U+8B76 # [2000] +4-786F U+8B7F # [2000] +4-7870 U+8B81 # [2000] +4-7871 U+8B8B # [2000] +4-7872 U+8B94 # [2000] +4-7873 U+8B95 # [2000] +4-7874 U+8B9C # [2000] +4-7875 U+8B9E # [2000] +4-7876 U+8C39 # [2000] +4-7877 U+27BB3 # [2000] [Unicode3.1] Private: U+F8A0 +4-7878 U+8C3D # [2000] +4-7879 U+27BBE # [2000] [Unicode3.1] Private: U+F8A1 +4-787A U+27BC7 # [2000] [Unicode3.1] Private: U+F8A2 +4-787B U+8C45 # [2000] +4-787C U+8C47 # [2000] +4-787D U+8C4F # [2000] +4-787E U+8C54 # [2000] +4-7921 U+8C57 # [2000] +4-7922 U+8C69 # [2000] +4-7923 U+8C6D # [2000] +4-7924 U+8C73 # [2000] +4-7925 U+27CB8 # [2000] [Unicode3.1] Private: U+F8A3 +4-7926 U+8C93 # [2000] +4-7927 U+8C92 # [2000] +4-7928 U+8C99 # [2000] +4-7929 U+4764 # [2000] +4-792A U+8C9B # [2000] +4-792B U+8CA4 # [2000] +4-792C U+8CD6 # [2000] +4-792D U+8CD5 # [2000] +4-792E U+8CD9 # [2000] +4-792F U+27DA0 # [2000] [Unicode3.1] Private: U+F8A4 +4-7930 U+8CF0 # [2000] +4-7931 U+8CF1 # [2000] +4-7932 U+27E10 # [2000] [Unicode3.1] Private: U+F8A5 +4-7933 U+8D09 # [2000] +4-7934 U+8D0E # [2000] +4-7935 U+8D6C # [2000] +4-7936 U+8D84 # [2000] +4-7937 U+8D95 # [2000] +4-7938 U+8DA6 # [2000] +4-7939 U+27FB7 # [2000] [Unicode3.1] Private: U+F8A6 +4-793A U+8DC6 # [2000] +4-793B U+8DC8 # [2000] +4-793C U+8DD9 # [2000] +4-793D U+8DEC # [2000] +4-793E U+8E0C # [2000] +4-793F U+47FD # [2000] +4-7940 U+8DFD # [2000] +4-7941 U+8E06 # [2000] +4-7942 U+2808A # [2000] [Unicode3.1] Private: U+F8A7 +4-7943 U+8E14 # [2000] +4-7944 U+8E16 # [2000] +4-7945 U+8E21 # [2000] +4-7946 U+8E22 # [2000] +4-7947 U+8E27 # [2000] +4-7948 U+280BB # [2000] [Unicode3.1] Private: U+F8A8 +4-7949 U+4816 # [2000] +4-794A U+8E36 # [2000] +4-794B U+8E39 # [2000] +4-794C U+8E4B # [2000] +4-794D U+8E54 # [2000] +4-794E U+8E62 # [2000] +4-794F U+8E6C # [2000] +4-7950 U+8E6D # [2000] +4-7951 U+8E6F # [2000] +4-7952 U+8E98 # [2000] +4-7953 U+8E9E # [2000] +4-7954 U+8EAE # [2000] +4-7955 U+8EB3 # [2000] +4-7956 U+8EB5 # [2000] +4-7957 U+8EB6 # [2000] +4-7958 U+8EBB # [2000] +4-7959 U+28282 # [2000] [Unicode3.1] Private: U+F8A9 +4-795A U+8ED1 # [2000] +4-795B U+8ED4 # [2000] +4-795C U+484E # [2000] +4-795D U+8EF9 # [2000] +4-795E U+282F3 # [2000] [Unicode3.1] Private: U+F8AA +4-795F U+8F00 # [2000] +4-7960 U+8F08 # [2000] +4-7961 U+8F17 # [2000] +4-7962 U+8F2B # [2000] +4-7963 U+8F40 # [2000] +4-7964 U+8F4A # [2000] +4-7965 U+8F58 # [2000] +4-7966 U+2840C # [2000] [Unicode3.1] Private: U+F8AB +4-7967 U+8FA4 # [2000] +4-7968 U+8FB4 # [2000] +4-7969 U+FA66 # CJK COMPATIBILITY IDEOGRAPH-FA66 [2000] [Unicode3.2] +4-796A U+8FB6 # [2000] +4-796B U+28455 # [2000] [Unicode3.1] Private: U+F8AD +4-796C U+8FC1 # [2000] +4-796D U+8FC6 # [2000] +4-796E U+FA24 # CJK COMPATIBILITY IDEOGRAPH-FA24 [2000] +4-796F U+8FCA # [2000] +4-7970 U+8FCD # [2000] +4-7971 U+8FD3 # [2000] +4-7972 U+8FD5 # [2000] +4-7973 U+8FE0 # [2000] +4-7974 U+8FF1 # [2000] +4-7975 U+8FF5 # [2000] +4-7976 U+8FFB # [2000] +4-7977 U+9002 # [2000] +4-7978 U+900C # [2000] +4-7979 U+9037 # [2000] +4-797A U+2856B # [2000] [Unicode3.1] Private: U+F8AE +4-797B U+9043 # [2000] +4-797C U+9044 # [2000] +4-797D U+905D # [2000] +4-797E U+285C8 # [2000] [Unicode3.1] Private: U+F8AF +4-7A21 U+285C9 # [2000] [Unicode3.1] Private: U+F8B0 +4-7A22 U+9085 # [2000] +4-7A23 U+908C # [2000] +4-7A24 U+9090 # [2000] +4-7A25 U+961D # [2000] +4-7A26 U+90A1 # [2000] +4-7A27 U+48B5 # [2000] +4-7A28 U+90B0 # [2000] +4-7A29 U+90B6 # [2000] +4-7A2A U+90C3 # [2000] +4-7A2B U+90C8 # [2000] +4-7A2C U+286D7 # [2000] [Unicode3.1] Private: U+F8B1 +4-7A2D U+90DC # [2000] +4-7A2E U+90DF # [2000] +4-7A2F U+286FA # [2000] [Unicode3.1] Private: U+F8B2 +4-7A30 U+90F6 # [2000] +4-7A31 U+90F2 # [2000] +4-7A32 U+9100 # [2000] +4-7A33 U+90EB # [2000] +4-7A34 U+90FE # [2000] +4-7A35 U+90FF # [2000] +4-7A36 U+9104 # [2000] +4-7A37 U+9106 # [2000] +4-7A38 U+9118 # [2000] +4-7A39 U+911C # [2000] +4-7A3A U+911E # [2000] +4-7A3B U+9137 # [2000] +4-7A3C U+9139 # [2000] +4-7A3D U+913A # [2000] +4-7A3E U+9146 # [2000] +4-7A3F U+9147 # [2000] +4-7A40 U+9157 # [2000] +4-7A41 U+9159 # [2000] +4-7A42 U+9161 # [2000] +4-7A43 U+9164 # [2000] +4-7A44 U+9174 # [2000] +4-7A45 U+9179 # [2000] +4-7A46 U+9185 # [2000] +4-7A47 U+918E # [2000] +4-7A48 U+91A8 # [2000] +4-7A49 U+91AE # [2000] +4-7A4A U+91B3 # [2000] +4-7A4B U+91B6 # [2000] +4-7A4C U+91C3 # [2000] +4-7A4D U+91C4 # [2000] +4-7A4E U+91DA # [2000] +4-7A4F U+28949 # [2000] [Unicode3.1] Private: U+F8B3 +4-7A50 U+28946 # [2000] [Unicode3.1] Private: U+F8B4 +4-7A51 U+91EC # [2000] +4-7A52 U+91EE # [2000] +4-7A53 U+9201 # [2000] +4-7A54 U+920A # [2000] +4-7A55 U+9216 # [2000] +4-7A56 U+9217 # [2000] +4-7A57 U+2896B # [2000] [Unicode3.1] Private: U+F8B5 +4-7A58 U+9233 # [2000] +4-7A59 U+9242 # [2000] +4-7A5A U+9247 # [2000] +4-7A5B U+924A # [2000] +4-7A5C U+924E # [2000] +4-7A5D U+9251 # [2000] +4-7A5E U+9256 # [2000] +4-7A5F U+9259 # [2000] +4-7A60 U+9260 # [2000] +4-7A61 U+9261 # [2000] +4-7A62 U+9265 # [2000] +4-7A63 U+9267 # [2000] +4-7A64 U+9268 # [2000] +4-7A65 U+28987 # [2000] [Unicode3.1] Private: U+F8B6 +4-7A66 U+28988 # [2000] [Unicode3.1] Private: U+F8B7 +4-7A67 U+927C # [2000] +4-7A68 U+927D # [2000] +4-7A69 U+927F # [2000] +4-7A6A U+9289 # [2000] +4-7A6B U+928D # [2000] +4-7A6C U+9297 # [2000] +4-7A6D U+9299 # [2000] +4-7A6E U+929F # [2000] +4-7A6F U+92A7 # [2000] +4-7A70 U+92AB # [2000] +4-7A71 U+289BA # [2000] [Unicode3.1] Private: U+F8B8 +4-7A72 U+289BB # [2000] [Unicode3.1] Private: U+F8B9 +4-7A73 U+92B2 # [2000] +4-7A74 U+92BF # [2000] +4-7A75 U+92C0 # [2000] +4-7A76 U+92C6 # [2000] +4-7A77 U+92CE # [2000] +4-7A78 U+92D0 # [2000] +4-7A79 U+92D7 # [2000] +4-7A7A U+92D9 # [2000] +4-7A7B U+92E5 # [2000] +4-7A7C U+92E7 # [2000] +4-7A7D U+9311 # [2000] +4-7A7E U+28A1E # [2000] [Unicode3.1] Private: U+F8BA +4-7B21 U+28A29 # [2000] [Unicode3.1] Private: U+F8BB +4-7B22 U+92F7 # [2000] +4-7B23 U+92F9 # [2000] +4-7B24 U+92FB # [2000] +4-7B25 U+9302 # [2000] +4-7B26 U+930D # [2000] +4-7B27 U+9315 # [2000] +4-7B28 U+931D # [2000] +4-7B29 U+931E # [2000] +4-7B2A U+9327 # [2000] +4-7B2B U+9329 # [2000] +4-7B2C U+28A71 # [2000] [Unicode3.1] Private: U+F8BC +4-7B2D U+28A43 # [2000] [Unicode3.1] Private: U+F8BD +4-7B2E U+9347 # [2000] +4-7B2F U+9351 # [2000] +4-7B30 U+9357 # [2000] +4-7B31 U+935A # [2000] +4-7B32 U+936B # [2000] +4-7B33 U+9371 # [2000] +4-7B34 U+9373 # [2000] +4-7B35 U+93A1 # [2000] +4-7B36 U+28A99 # [2000] [Unicode3.1] Private: U+F8BE +4-7B37 U+28ACD # [2000] [Unicode3.1] Private: U+F8BF +4-7B38 U+9388 # [2000] +4-7B39 U+938B # [2000] +4-7B3A U+938F # [2000] +4-7B3B U+939E # [2000] +4-7B3C U+93F5 # [2000] +4-7B3D U+28AE4 # [2000] [Unicode3.1] Private: U+F8C0 +4-7B3E U+28ADD # [2000] [Unicode3.1] Private: U+F8C1 +4-7B3F U+93F1 # [2000] +4-7B40 U+93C1 # [2000] +4-7B41 U+93C7 # [2000] +4-7B42 U+93DC # [2000] +4-7B43 U+93E2 # [2000] +4-7B44 U+93E7 # [2000] +4-7B45 U+9409 # [2000] +4-7B46 U+940F # [2000] +4-7B47 U+9416 # [2000] +4-7B48 U+9417 # [2000] +4-7B49 U+93FB # [2000] +4-7B4A U+9432 # [2000] +4-7B4B U+9434 # [2000] +4-7B4C U+943B # [2000] +4-7B4D U+9445 # [2000] +4-7B4E U+28BC1 # [2000] [Unicode3.1] Private: U+F8C2 +4-7B4F U+28BEF # [2000] [Unicode3.1] Private: U+F8C3 +4-7B50 U+946D # [2000] +4-7B51 U+946F # [2000] +4-7B52 U+9578 # [2000] +4-7B53 U+9579 # [2000] +4-7B54 U+9586 # [2000] +4-7B55 U+958C # [2000] +4-7B56 U+958D # [2000] +4-7B57 U+28D10 # [2000] [Unicode3.1] Private: U+F8C4 +4-7B58 U+95AB # [2000] +4-7B59 U+95B4 # [2000] +4-7B5A U+28D71 # [2000] [Unicode3.1] Private: U+F8C5 +4-7B5B U+95C8 # [2000] +4-7B5C U+28DFB # [2000] [Unicode3.1] Private: U+F8C6 +4-7B5D U+28E1F # [2000] [Unicode3.1] Private: U+F8C7 +4-7B5E U+962C # [2000] +4-7B5F U+9633 # [2000] +4-7B60 U+9634 # [2000] +4-7B61 U+28E36 # [2000] [Unicode3.1] Private: U+F8C8 +4-7B62 U+963C # [2000] +4-7B63 U+9641 # [2000] +4-7B64 U+9661 # [2000] +4-7B65 U+28E89 # [2000] [Unicode3.1] Private: U+F8C9 +4-7B66 U+9682 # [2000] +4-7B67 U+28EEB # [2000] [Unicode3.1] Private: U+F8CA +4-7B68 U+969A # [2000] +4-7B69 U+28F32 # [2000] [Unicode3.1] Private: U+F8CB +4-7B6A U+49E7 # [2000] +4-7B6B U+96A9 # [2000] +4-7B6C U+96AF # [2000] +4-7B6D U+96B3 # [2000] +4-7B6E U+96BA # [2000] +4-7B6F U+96BD # [2000] +4-7B70 U+49FA # [2000] +4-7B71 U+28FF8 # [2000] [Unicode3.1] Private: U+F8CC +4-7B72 U+96D8 # [2000] +4-7B73 U+96DA # [2000] +4-7B74 U+96DD # [2000] +4-7B75 U+4A04 # [2000] +4-7B76 U+9714 # [2000] +4-7B77 U+9723 # [2000] +4-7B78 U+4A29 # [2000] +4-7B79 U+9736 # [2000] +4-7B7A U+9741 # [2000] +4-7B7B U+9747 # [2000] +4-7B7C U+9755 # [2000] +4-7B7D U+9757 # [2000] +4-7B7E U+975B # [2000] +4-7C21 U+976A # [2000] +4-7C22 U+292A0 # [2000] [Unicode3.1] Private: U+F8CD +4-7C23 U+292B1 # [2000] [Unicode3.1] Private: U+F8CE +4-7C24 U+9796 # [2000] +4-7C25 U+979A # [2000] +4-7C26 U+979E # [2000] +4-7C27 U+97A2 # [2000] +4-7C28 U+97B1 # [2000] +4-7C29 U+97B2 # [2000] +4-7C2A U+97BE # [2000] +4-7C2B U+97CC # [2000] +4-7C2C U+97D1 # [2000] +4-7C2D U+97D4 # [2000] +4-7C2E U+97D8 # [2000] +4-7C2F U+97D9 # [2000] +4-7C30 U+97E1 # [2000] +4-7C31 U+97F1 # [2000] +4-7C32 U+9804 # [2000] +4-7C33 U+980D # [2000] +4-7C34 U+980E # [2000] +4-7C35 U+9814 # [2000] +4-7C36 U+9816 # [2000] +4-7C37 U+4ABC # [2000] +4-7C38 U+29490 # [2000] [Unicode3.1] Private: U+F8CF +4-7C39 U+9823 # [2000] +4-7C3A U+9832 # [2000] +4-7C3B U+9833 # [2000] +4-7C3C U+9825 # [2000] +4-7C3D U+9847 # [2000] +4-7C3E U+9866 # [2000] +4-7C3F U+98AB # [2000] +4-7C40 U+98AD # [2000] +4-7C41 U+98B0 # [2000] +4-7C42 U+295CF # [2000] [Unicode3.1] Private: U+F8D0 +4-7C43 U+98B7 # [2000] +4-7C44 U+98B8 # [2000] +4-7C45 U+98BB # [2000] +4-7C46 U+98BC # [2000] +4-7C47 U+98BF # [2000] +4-7C48 U+98C2 # [2000] +4-7C49 U+98C7 # [2000] +4-7C4A U+98CB # [2000] +4-7C4B U+98E0 # [2000] +4-7C4C U+2967F # [2000] [Unicode3.1] Private: U+F8D1 +4-7C4D U+98E1 # [2000] +4-7C4E U+98E3 # [2000] +4-7C4F U+98E5 # [2000] +4-7C50 U+98EA # [2000] +4-7C51 U+98F0 # [2000] +4-7C52 U+98F1 # [2000] +4-7C53 U+98F3 # [2000] +4-7C54 U+9908 # [2000] +4-7C55 U+4B3B # [2000] +4-7C56 U+296F0 # [2000] [Unicode3.1] Private: U+F8D2 +4-7C57 U+9916 # [2000] +4-7C58 U+9917 # [2000] +4-7C59 U+29719 # [2000] [Unicode3.1] Private: U+F8D3 +4-7C5A U+991A # [2000] +4-7C5B U+991B # [2000] +4-7C5C U+991C # [2000] +4-7C5D U+29750 # [2000] [Unicode3.1] Private: U+F8D4 +4-7C5E U+9931 # [2000] +4-7C5F U+9932 # [2000] +4-7C60 U+9933 # [2000] +4-7C61 U+993A # [2000] +4-7C62 U+993B # [2000] +4-7C63 U+993C # [2000] +4-7C64 U+9940 # [2000] +4-7C65 U+9941 # [2000] +4-7C66 U+9946 # [2000] +4-7C67 U+994D # [2000] +4-7C68 U+994E # [2000] +4-7C69 U+995C # [2000] +4-7C6A U+995F # [2000] +4-7C6B U+9960 # [2000] +4-7C6C U+99A3 # [2000] +4-7C6D U+99A6 # [2000] +4-7C6E U+99B9 # [2000] +4-7C6F U+99BD # [2000] +4-7C70 U+99BF # [2000] +4-7C71 U+99C3 # [2000] +4-7C72 U+99C9 # [2000] +4-7C73 U+99D4 # [2000] +4-7C74 U+99D9 # [2000] +4-7C75 U+99DE # [2000] +4-7C76 U+298C6 # [2000] [Unicode3.1] Private: U+F8D5 +4-7C77 U+99F0 # [2000] +4-7C78 U+99F9 # [2000] +4-7C79 U+99FC # [2000] +4-7C7A U+9A0A # [2000] +4-7C7B U+9A11 # [2000] +4-7C7C U+9A16 # [2000] +4-7C7D U+9A1A # [2000] +4-7C7E U+9A20 # [2000] +4-7D21 U+9A31 # [2000] +4-7D22 U+9A36 # [2000] +4-7D23 U+9A44 # [2000] +4-7D24 U+9A4C # [2000] +4-7D25 U+9A58 # [2000] +4-7D26 U+4BC2 # [2000] +4-7D27 U+9AAF # [2000] +4-7D28 U+4BCA # [2000] +4-7D29 U+9AB7 # [2000] +4-7D2A U+4BD2 # [2000] +4-7D2B U+9AB9 # [2000] +4-7D2C U+29A72 # [2000] [Unicode3.1] Private: U+F8D6 +4-7D2D U+9AC6 # [2000] +4-7D2E U+9AD0 # [2000] +4-7D2F U+9AD2 # [2000] +4-7D30 U+9AD5 # [2000] +4-7D31 U+4BE8 # [2000] +4-7D32 U+9ADC # [2000] +4-7D33 U+9AE0 # [2000] +4-7D34 U+9AE5 # [2000] +4-7D35 U+9AE9 # [2000] +4-7D36 U+9B03 # [2000] +4-7D37 U+9B0C # [2000] +4-7D38 U+9B10 # [2000] +4-7D39 U+9B12 # [2000] +4-7D3A U+9B16 # [2000] +4-7D3B U+9B1C # [2000] +4-7D3C U+9B2B # [2000] +4-7D3D U+9B33 # [2000] +4-7D3E U+9B3D # [2000] +4-7D3F U+4C20 # [2000] +4-7D40 U+9B4B # [2000] +4-7D41 U+9B63 # [2000] +4-7D42 U+9B65 # [2000] +4-7D43 U+9B6B # [2000] +4-7D44 U+9B6C # [2000] +4-7D45 U+9B73 # [2000] +4-7D46 U+9B76 # [2000] +4-7D47 U+9B77 # [2000] +4-7D48 U+9BA6 # [2000] +4-7D49 U+9BAC # [2000] +4-7D4A U+9BB1 # [2000] +4-7D4B U+29DDB # [2000] [Unicode3.1] Private: U+F8D7 +4-7D4C U+29E3D # [2000] [Unicode3.1] Private: U+F8D8 +4-7D4D U+9BB2 # [2000] +4-7D4E U+9BB8 # [2000] +4-7D4F U+9BBE # [2000] +4-7D50 U+9BC7 # [2000] +4-7D51 U+9BF3 # [2000] +4-7D52 U+9BD8 # [2000] +4-7D53 U+9BDD # [2000] +4-7D54 U+9BE7 # [2000] +4-7D55 U+9BEA # [2000] +4-7D56 U+9BEB # [2000] +4-7D57 U+9BEF # [2000] +4-7D58 U+9BEE # [2000] +4-7D59 U+29E15 # [2000] [Unicode3.1] Private: U+F8D9 +4-7D5A U+9BFA # [2000] +4-7D5B U+29E8A # [2000] [Unicode3.1] Private: U+F8DA +4-7D5C U+9BF7 # [2000] +4-7D5D U+29E49 # [2000] [Unicode3.1] Private: U+F8DB +4-7D5E U+9C16 # [2000] +4-7D5F U+9C18 # [2000] +4-7D60 U+9C19 # [2000] +4-7D61 U+9C1A # [2000] +4-7D62 U+9C1D # [2000] +4-7D63 U+9C22 # [2000] +4-7D64 U+9C27 # [2000] +4-7D65 U+9C29 # [2000] +4-7D66 U+9C2A # [2000] +4-7D67 U+29EC4 # [2000] [Unicode3.1] Private: U+F8DC +4-7D68 U+9C31 # [2000] +4-7D69 U+9C36 # [2000] +4-7D6A U+9C37 # [2000] +4-7D6B U+9C45 # [2000] +4-7D6C U+9C5C # [2000] +4-7D6D U+29EE9 # [2000] [Unicode3.1] Private: U+F8DD +4-7D6E U+9C49 # [2000] +4-7D6F U+9C4A # [2000] +4-7D70 U+29EDB # [2000] [Unicode3.1] Private: U+F8DE +4-7D71 U+9C54 # [2000] +4-7D72 U+9C58 # [2000] +4-7D73 U+9C5B # [2000] +4-7D74 U+9C5D # [2000] +4-7D75 U+9C5F # [2000] +4-7D76 U+9C69 # [2000] +4-7D77 U+9C6A # [2000] +4-7D78 U+9C6B # [2000] +4-7D79 U+9C6D # [2000] +4-7D7A U+9C6E # [2000] +4-7D7B U+9C70 # [2000] +4-7D7C U+9C72 # [2000] +4-7D7D U+9C75 # [2000] +4-7D7E U+9C7A # [2000] +4-7E21 U+9CE6 # [2000] +4-7E22 U+9CF2 # [2000] +4-7E23 U+9D0B # [2000] +4-7E24 U+9D02 # [2000] +4-7E25 U+29FCE # [2000] [Unicode3.1] Private: U+F8DF +4-7E26 U+9D11 # [2000] +4-7E27 U+9D17 # [2000] +4-7E28 U+9D18 # [2000] +4-7E29 U+2A02F # [2000] [Unicode3.1] Private: U+F8E0 +4-7E2A U+4CC4 # [2000] +4-7E2B U+2A01A # [2000] [Unicode3.1] Private: U+F8E1 +4-7E2C U+9D32 # [2000] +4-7E2D U+4CD1 # [2000] +4-7E2E U+9D42 # [2000] +4-7E2F U+9D4A # [2000] +4-7E30 U+9D5F # [2000] +4-7E31 U+9D62 # [2000] +4-7E32 U+2A0F9 # [2000] [Unicode3.1] Private: U+F8E2 +4-7E33 U+9D69 # [2000] +4-7E34 U+9D6B # [2000] +4-7E35 U+2A082 # [2000] [Unicode3.1] Private: U+F8E3 +4-7E36 U+9D73 # [2000] +4-7E37 U+9D76 # [2000] +4-7E38 U+9D77 # [2000] +4-7E39 U+9D7E # [2000] +4-7E3A U+9D84 # [2000] +4-7E3B U+9D8D # [2000] +4-7E3C U+9D99 # [2000] +4-7E3D U+9DA1 # [2000] +4-7E3E U+9DBF # [2000] +4-7E3F U+9DB5 # [2000] +4-7E40 U+9DB9 # [2000] +4-7E41 U+9DBD # [2000] +4-7E42 U+9DC3 # [2000] +4-7E43 U+9DC7 # [2000] +4-7E44 U+9DC9 # [2000] +4-7E45 U+9DD6 # [2000] +4-7E46 U+9DDA # [2000] +4-7E47 U+9DDF # [2000] +4-7E48 U+9DE0 # [2000] +4-7E49 U+9DE3 # [2000] +4-7E4A U+9DF4 # [2000] +4-7E4B U+4D07 # [2000] +4-7E4C U+9E0A # [2000] +4-7E4D U+9E02 # [2000] +4-7E4E U+9E0D # [2000] +4-7E4F U+9E19 # [2000] +4-7E50 U+9E1C # [2000] +4-7E51 U+9E1D # [2000] +4-7E52 U+9E7B # [2000] +4-7E53 U+22218 # [2000] [Unicode3.1] Private: U+F8E4 +4-7E54 U+9E80 # [2000] +4-7E55 U+9E85 # [2000] +4-7E56 U+9E9B # [2000] +4-7E57 U+9EA8 # [2000] +4-7E58 U+2A38C # [2000] [Unicode3.1] Private: U+F8E5 +4-7E59 U+9EBD # [2000] +4-7E5A U+2A437 # [2000] [Unicode3.1] Private: U+F8E6 +4-7E5B U+9EDF # [2000] +4-7E5C U+9EE7 # [2000] +4-7E5D U+9EEE # [2000] +4-7E5E U+9EFF # [2000] +4-7E5F U+9F02 # [2000] +4-7E60 U+4D77 # [2000] +4-7E61 U+9F03 # [2000] +4-7E62 U+9F17 # [2000] +4-7E63 U+9F19 # [2000] +4-7E64 U+9F2F # [2000] +4-7E65 U+9F37 # [2000] +4-7E66 U+9F3A # [2000] +4-7E67 U+9F3D # [2000] +4-7E68 U+9F41 # [2000] +4-7E69 U+9F45 # [2000] +4-7E6A U+9F46 # [2000] +4-7E6B U+9F53 # [2000] +4-7E6C U+9F55 # [2000] +4-7E6D U+9F58 # [2000] +4-7E6E U+2A5F1 # [2000] [Unicode3.1] Private: U+F8E7 +4-7E6F U+9F5D # [2000] +4-7E70 U+2A602 # [2000] [Unicode3.1] Private: U+F8E8 +4-7E71 U+9F69 # [2000] +4-7E72 U+2A61A # [2000] [Unicode3.1] Private: U+F8E9 +4-7E73 U+9F6D # [2000] +4-7E74 U+9F70 # [2000] +4-7E75 U+9F75 # [2000] +4-7E76 U+2A6B2 # [2000] [Unicode3.1] Private: U+F8EA diff --git a/aclocal.m4 b/aclocal.m4 index f98db73656d305f38cefecb8e2765e655d6c6f80..b5f9cb0e8da44fb378e7e082f23025901cb06c6c 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.15 -*- Autoconf -*- +# generated automatically by aclocal 1.16.2 -*- Autoconf -*- -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -12,9 +12,9 @@ # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) -dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -dnl serial 11 (pkg-config-0.29.1) -dnl +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 11 (pkg-config-0.29.1) + dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson dnl @@ -288,5 +288,73 @@ AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR +dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------ +dnl +dnl Prepare a "--with-" configure option using the lowercase +dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and +dnl PKG_CHECK_MODULES in a single macro. +AC_DEFUN([PKG_WITH_MODULES], +[ +m4_pushdef([with_arg], m4_tolower([$1])) + +m4_pushdef([description], + [m4_default([$5], [build with ]with_arg[ support])]) + +m4_pushdef([def_arg], [m4_default([$6], [auto])]) +m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) +m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) + +m4_case(def_arg, + [yes],[m4_pushdef([with_without], [--without-]with_arg)], + [m4_pushdef([with_without],[--with-]with_arg)]) + +AC_ARG_WITH(with_arg, + AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, + [AS_TR_SH([with_]with_arg)=def_arg]) + +AS_CASE([$AS_TR_SH([with_]with_arg)], + [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], + [auto],[PKG_CHECK_MODULES([$1],[$2], + [m4_n([def_action_if_found]) $3], + [m4_n([def_action_if_not_found]) $4])]) + +m4_popdef([with_arg]) +m4_popdef([description]) +m4_popdef([def_arg]) + +])dnl PKG_WITH_MODULES + +dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ----------------------------------------------- +dnl +dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES +dnl check._[VARIABLE-PREFIX] is exported as make variable. +AC_DEFUN([PKG_HAVE_WITH_MODULES], +[ +PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) + +AM_CONDITIONAL([HAVE_][$1], + [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) +])dnl PKG_HAVE_WITH_MODULES + +dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------------------ +dnl +dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after +dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make +dnl and preprocessor variable. +AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], +[ +PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) + +AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], + [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) +])dnl PKG_HAVE_DEFINE_WITH_MODULES + m4_include([m4/ax_c_float_words_bigendian.m4]) m4_include([m4/ax_check_openssl.m4]) diff --git a/configure b/configure index 96dcd0dcd5fec1785bac6f6da6bc9b240b7b26b2..1252335472f561421e81454183ad1af445f9e6fc 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for python 3.8. +# Generated by GNU Autoconf 2.69 for python 3.9. # # Report bugs to . # @@ -580,8 +580,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='python' PACKAGE_TARNAME='python' -PACKAGE_VERSION='3.8' -PACKAGE_STRING='python 3.8' +PACKAGE_VERSION='3.9' +PACKAGE_STRING='python 3.9' PACKAGE_BUGREPORT='https://bugs.python.org/' PACKAGE_URL='' @@ -631,6 +631,8 @@ SRCDIRS THREADHEADERS LIBPL PY_ENABLE_SHARED +PLATLIBDIR +BINLIBDEST LIBPYTHON EXT_SUFFIX ALT_SOABI @@ -657,6 +659,7 @@ LIBFFI_INCLUDEDIR PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG +TZPATH SHLIBS CFLAGSFORSHARED LINKFORSHARED @@ -697,6 +700,8 @@ ARFLAGS ac_ct_AR AR GNULD +EXPORTSFROM +EXPORTSYMS LINKCC LDVERSION RUNSHARED @@ -782,7 +787,6 @@ infodir docdir oldincludedir includedir -runstatedir localstatedir sharedstatedir sysconfdir @@ -819,6 +823,7 @@ with_assertions enable_optimizations with_lto with_hash_algorithm +with_tzpath with_address_sanitizer with_memory_sanitizer with_undefined_behavior_sanitizer @@ -840,10 +845,12 @@ with_dtrace with_libm with_libc enable_big_digits +with_platlibdir with_computed_gotos with_ensurepip with_openssl with_ssl_default_suites +with_builtin_hashlib_hashes ' ac_precious_vars='build_alias host_alias @@ -897,7 +904,6 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' -runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1150,15 +1156,6 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; - -runstatedir | --runstatedir | --runstatedi | --runstated \ - | --runstate | --runstat | --runsta | --runst | --runs \ - | --run | --ru | --r) - ac_prev=runstatedir ;; - -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ - | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ - | --run=* | --ru=* | --r=*) - runstatedir=$ac_optarg ;; - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1296,7 +1293,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir runstatedir + libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1409,7 +1406,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures python 3.8 to adapt to many kinds of systems. +\`configure' configures python 3.9 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1449,7 +1446,6 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -1475,7 +1471,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of python 3.8:";; + short | recursive ) echo "Configuration of python 3.9:";; esac cat <<\_ACEOF @@ -1484,52 +1480,74 @@ Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-universalsdk[=SDKDIR] - Build fat binary against Mac OS X SDK + create a universal binary build. SDKDIR specifies + which macOS SDK should be used to perform the build, + see Mac/README.rst. (default is no) --enable-framework[=INSTALLDIR] - Build (MacOSX|Darwin) framework - --enable-shared disable/enable building shared python library - --enable-profiling enable C-level code profiling - --enable-optimizations Enable expensive, stable optimizations (PGO, etc). - Disabled by default. + create a Python.framework rather than a traditional + Unix install. optional INSTALLDIR specifies the + installation path. see Mac/README.rst (default is + no) + --enable-shared enable building a shared Python library (default is + no) + --enable-profiling enable C-level code profiling with gprof (default is + no) + --enable-optimizations enable expensive, stable optimizations (PGO, etc.) + (default is no) --enable-loadable-sqlite-extensions - support loadable extensions in _sqlite module - --enable-ipv6 Enable ipv6 (with ipv4) support - --disable-ipv6 Disable ipv6 support - --enable-big-digits[=BITS] - use big digits for Python longs [[BITS=30]] + support loadable extensions in _sqlite module, see + Doc/library/sqlite3.rst (default is no) + --enable-ipv6 enable ipv6 (with ipv4) support, see + Doc/library/socket.rst (default is yes if supported) + --enable-big-digits[=15|30] + use big digits (30 or 15 bits) for Python longs + (default is system-dependent)] Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-universal-archs=ARCH - select architectures for universal build ("32-bit", - "64-bit", "3-way", "intel", "intel-32", "intel-64", - or "all") + specify the kind of universal binary that should be + created. this option is only valid when + --enable-universalsdk is set; options are: + ("universal2", "32-bit", "64-bit", "3-way", "intel", + "intel-32", "intel-64", or "all") see Mac/README.rst --with-framework-name=FRAMEWORK - specify an alternate name of the framework built - with --enable-framework - --with-cxx-main= - compile main() and link python executable with C++ - compiler - --with-suffix=.exe set executable suffix - --with-pydebug build with Py_DEBUG defined + specify the name for the python framework on macOS + only valid when --enable-framework is set. see + Mac/README.rst (default is 'Python') + --with-cxx-main[=COMPILER] + compile main() and link Python executable with C++ + compiler specified in COMPILER (default is $CXX) + --with-suffix=SUFFIX set executable suffix to SUFFIX (default is '.exe') + --with-pydebug build with Py_DEBUG defined (default is no) --with-trace-refs enable tracing references for debugging purpose - --with-assertions build with C assertions enabled - --with-lto Enable Link Time Optimization in any build. Disabled - by default. + (default is no) + --with-assertions build with C assertions enabled (default is no) + --with-lto enable Link-Time-Optimization in any build (default + is no) --with-hash-algorithm=[fnv|siphash24] - select hash algorithm + select hash algorithm for use in Python/pyhash.c + (default is SipHash24) + --with-tzpath= + Select the default time zone search path for zoneinfo.TZPATH + --with-address-sanitizer - enable AddressSanitizer (asan) - --with-memory-sanitizer enable MemorySanitizer (msan) + enable AddressSanitizer memory error detector, + 'asan' (default is no) + --with-memory-sanitizer enable MemorySanitizer allocation error detector, + 'msan' (default is no) --with-undefined-behavior-sanitizer - enable UndefinedBehaviorSanitizer (ubsan) - --with-libs='lib1 ...' link against additional libs + enable UndefinedBehaviorSanitizer undefined + behaviour detector, 'ubsan' (default is no) + --with-libs='lib1 ...' link against additional libs (default is no) --with-system-expat build pyexpat module using an installed expat - library - --with-system-ffi build _ctypes module using an installed ffi library + library, see Doc/library/pyexpat.rst (default is no) + --with-system-ffi build _ctypes module using an installed ffi library, + see Doc/library/ctypes.rst (default is + system-dependent) --with-system-libmpdec build _decimal module using an installed libmpdec - library + library, see Doc/library/decimal.rst (default is no) --with-decimal-contextvar build _decimal module using a coroutine-local rather than a thread-local context (default is yes) @@ -1538,29 +1556,37 @@ Optional Packages: --with-tcltk-libs='-L...' override search for Tcl and Tk libs --with-dbmliborder=db1:db2:... - order to check db backends for dbm. Valid value is a - colon separated string with the backend names - `ndbm', `gdbm' and `bdb'. - --with(out)-doc-strings disable/enable documentation strings - --with(out)-pymalloc disable/enable specialized mallocs - --with(out)-c-locale-coercion - disable/enable C locale coercion to a UTF-8 based - locale - --with-valgrind Enable Valgrind support - --with(out)-dtrace disable/enable DTrace support - --with-libm=STRING math library - --with-libc=STRING C library - --with(out)-computed-gotos - Use computed gotos in evaluation loop (enabled by + override order to check db backends for dbm; a valid + value is a colon separated string with the backend + names `ndbm', `gdbm' and `bdb'. + --with-doc-strings enable documentation strings (default is yes) + --with-pymalloc enable specialized mallocs (default is yes) + --with-c-locale-coercion + enable C locale coercion to a UTF-8 based locale + (default is yes) + --with-valgrind enable Valgrind support (default is no) + --with-dtrace enable DTrace support (default is no) + --with-libm=STRING override libm math library to STRING (default is + system-dependent) + --with-libc=STRING override libc C library to STRING (default is + system-dependent) + --with-platlibdir=DIRNAME + Python library directory name (default is "lib") + --with-computed-gotos enable computed gotos in evaluation loop (enabled by default on supported compilers) - --with(out)-ensurepip=[=upgrade] - "install" or "upgrade" using bundled pip - --with-openssl=DIR root of the OpenSSL directory + --with-ensurepip[=install|upgrade|no] + "install" or "upgrade" using bundled pip (default is + upgrade) + --with-openssl=DIR override root of the OpenSSL directory to DIR --with-ssl-default-suites=[python|openssl|STRING] - Override default cipher suites string, python: use + override default cipher suites string, python: use Python's preferred selection (default), openssl: leave OpenSSL's defaults untouched, STRING: use a - custom string, PROTOCOL_SSLv2 ignores the setting + custom string, PROTOCOL_SSLv2 ignores the setting, + see Doc/library/ssl.rst + --with-builtin-hashlib-hashes=md5,sha1,sha256,sha512,sha3,blake2 + builtin hash modules, md5, sha1, sha256, sha512, + sha3 (with shake), blake2 Some influential environment variables: MACHDEP name for machine-dependent library files @@ -1646,7 +1672,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -python configure 3.8 +python configure 3.9 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2355,7 +2381,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by python $as_me 3.8, which was +It was created by python $as_me 3.9, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2975,7 +3001,7 @@ rm confdefs.h mv confdefs.h.new confdefs.h -VERSION=3.8 +VERSION=3.9 # Version number of Python's own shared library file. @@ -3252,7 +3278,7 @@ _ACEOF ##AC_ARG_WITH(dyld, ## AS_HELP_STRING([--with-dyld], -## [Use (OpenStep|Rhapsody) dynamic linker])) +## [use (OpenStep|Rhapsody) dynamic linker])) ## # Set name for machine-dependent library files @@ -5771,8 +5797,6 @@ LDVERSION="$VERSION" # If CXX is set, and if it is needed to link a main function that was # compiled with CXX, LINKCC is CXX instead. Always using CXX is undesirable: # python might then depend on the C++ runtime -# This is altered for AIX in order to build the export list before -# linking. { $as_echo "$as_me:${as_lineno-$LINENO}: checking LINKCC" >&5 $as_echo_n "checking LINKCC... " >&6; } @@ -5780,13 +5804,6 @@ if test -z "$LINKCC" then LINKCC='$(PURIFY) $(MAINCC)' case $ac_sys_system in - AIX*) - exp_extra="\"\"" - if test $ac_sys_release -ge 5 -o \ - $ac_sys_release -eq 4 -a `uname -r` -ge 2 ; then - exp_extra="." - fi - LINKCC="\$(srcdir)/Modules/makexp_aix Modules/python.exp $exp_extra \$(LIBRARY); $LINKCC";; QNX*) # qcc must be used because the other compilers do not # support -N. @@ -5796,6 +5813,26 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINKCC" >&5 $as_echo "$LINKCC" >&6; } +# EXPORTSYMS holds the list of exported symbols for AIX. +# EXPORTSFROM holds the module name exporting symbols on AIX. +EXPORTSYMS= +EXPORTSFROM= + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking EXPORTSYMS" >&5 +$as_echo_n "checking EXPORTSYMS... " >&6; } +case $ac_sys_system in +AIX*) + EXPORTSYMS="Modules/python.exp" + if test $ac_sys_release -ge 5 -o \ + $ac_sys_release -eq 4 -a `uname -r` -ge 2 ; then + EXPORTSFROM=. # the main executable + fi + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $EXPORTSYMS" >&5 +$as_echo "$EXPORTSYMS" >&6; } + # GNULD is set to "yes" if the GNU linker is used. If this goes wrong # make sure we default having it set to "no": this is used by # distutils.unixccompiler to know if it should add --enable-new-dtags @@ -6917,7 +6954,7 @@ fi -# The -arch flags for universal builds on OSX +# The -arch flags for universal builds on macOS UNIVERSAL_ARCH_FLAGS= @@ -7351,6 +7388,47 @@ $as_echo "$ac_cv_enable_implicit_function_declaration_error" >&6; } CFLAGS_NODIST="$CFLAGS_NODIST -Werror=implicit-function-declaration" fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can use visibility in $CC" >&5 +$as_echo_n "checking if we can use visibility in $CC... " >&6; } + ac_save_cc="$CC" + CC="$CC -fvisibility=hidden" + if ${ac_cv_enable_visibility+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ + + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + ac_cv_enable_visibility=yes + +else + + ac_cv_enable_visibility=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + CC="$ac_save_cc" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_visibility" >&5 +$as_echo "$ac_cv_enable_visibility" >&6; } + + if test $ac_cv_enable_visibility = yes + then + CFLAGS_NODIST="$CFLAGS_NODIST -fvisibility=hidden" + fi + # if using gcc on alpha, use -mieee to get (near) full IEEE 754 # support. Without this, treatment of subnormals doesn't follow # the standard. @@ -7403,6 +7481,11 @@ $as_echo "$CC" >&6; } LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ;; + universal2) + UNIVERSAL_ARCH_FLAGS="-arch arm64 -arch x86_64" + LIPO_32BIT_FLAGS="" + ARCH_RUN_32BIT="true" + ;; intel) UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" LIPO_32BIT_FLAGS="-extract i386" @@ -7424,7 +7507,7 @@ $as_echo "$CC" >&6; } ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ;; *) - as_fn_error $? "proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5 + as_fn_error $? "proper usage is --with-universal-arch=universal2|32-bit|64-bit|all|intel|3-way" "$LINENO" 5 ;; esac @@ -7493,6 +7576,31 @@ $as_echo_n "checking which MACOSX_DEPLOYMENT_TARGET to use... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MACOSX_DEPLOYMENT_TARGET" >&5 $as_echo "$MACOSX_DEPLOYMENT_TARGET" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if specified universal architectures work" >&5 +$as_echo_n "checking if specified universal architectures work... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +printf("%d", 42); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + as_fn_error $? "check config.log and use the '--with-universal-archs' option" "$LINENO" 5 + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + # end of Darwin* tests ;; esac @@ -7510,11 +7618,14 @@ $as_echo "$MACOSX_DEPLOYMENT_TARGET" >&6; } ;; esac -# ICC needs -fp-model strict or floats behave badly case "$CC" in *icc*) + # ICC needs -fp-model strict or floats behave badly CFLAGS_NODIST="$CFLAGS_NODIST -fp-model strict" ;; +*xlc*) + CFLAGS_NODIST="$CFLAGS_NODIST -qalias=noansi -qmaxmem=-1" + ;; esac if test "$assertions" = 'true'; then @@ -7898,7 +8009,7 @@ sys/stat.h sys/syscall.h sys/sys_domain.h sys/termio.h sys/time.h \ sys/times.h sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/wait.h pty.h \ libutil.h sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \ linux/tipc.h linux/random.h spawn.h util.h alloca.h endian.h \ -sys/endian.h sys/sysmacros.h linux/memfd.h sys/memfd.h sys/mman.h +sys/endian.h sys/sysmacros.h linux/memfd.h linux/wait.h sys/memfd.h sys/mman.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" @@ -8227,8 +8338,8 @@ fi done -# On Linux, can.h and can/raw.h require sys/socket.h -for ac_header in linux/can.h linux/can/raw.h linux/can/bcm.h +# On Linux, can.h, can/bcm.h, can/j1939.h, can/raw.h require sys/socket.h +for ac_header in linux/can.h linux/can/bcm.h linux/can/j1939.h linux/can/raw.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" " @@ -9253,7 +9364,7 @@ fi MACOSX_DEFAULT_ARCH="ppc" ;; *) - as_fn_error $? "Unexpected output of 'arch' on OSX" "$LINENO" 5 + as_fn_error $? "Unexpected output of 'arch' on macOS" "$LINENO" 5 ;; esac else @@ -9263,9 +9374,12 @@ fi ;; ppc) MACOSX_DEFAULT_ARCH="ppc64" + ;; + arm64) + MACOSX_DEFAULT_ARCH="arm64" ;; *) - as_fn_error $? "Unexpected output of 'arch' on OSX" "$LINENO" 5 + as_fn_error $? "Unexpected output of 'arch' on macOS" "$LINENO" 5 ;; esac @@ -9997,7 +10111,21 @@ $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext;; + conftest$ac_exeext conftest.$ac_ext +# BUILD_GNU_TYPE + AIX_BUILDDATE are used to construct the platform_tag +# of the AIX system used to build/package Python executable. This tag serves +# as a baseline for bdist module packages + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the system builddate" >&5 +$as_echo_n "checking for the system builddate... " >&6; } + AIX_BUILDDATE=$(lslpp -Lcq bos.mp64 | awk -F: '{ print $NF }') + +cat >>confdefs.h <<_ACEOF +#define AIX_BUILDDATE $AIX_BUILDDATE +_ACEOF + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AIX_BUILDDATE" >&5 +$as_echo "$AIX_BUILDDATE" >&6; } + ;; *) ;; esac @@ -10077,6 +10205,47 @@ $as_echo "default" >&6; } fi +validate_tzpath() { + # Checks that each element of hte path is an absolute path + if test -z "$1"; then + # Empty string is allowed: it indicates no system TZPATH + return 0 + fi + + # Bad paths are those that don't start with / + if ( echo $1 | grep -qE '(^|:)([^/]|$)' ); then + as_fn_error $? "--with-tzpath must contain only absolute paths, not $1" "$LINENO" 5 + return 1; + fi +} + +TZPATH="/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-tzpath" >&5 +$as_echo_n "checking for --with-tzpath... " >&6; } + +# Check whether --with-tzpath was given. +if test "${with_tzpath+set}" = set; then : + withval=$with_tzpath; +case "$withval" in + yes) + as_fn_error $? "--with-tzpath requires a value" "$LINENO" 5 + ;; + *) + validate_tzpath "$withval" + TZPATH="$withval" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$withval\"" >&5 +$as_echo "\"$withval\"" >&6; } + ;; +esac + +else + validate_tzpath "$TZPATH" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$TZPATH\"" >&5 +$as_echo "\"$TZPATH\"" >&6; } +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-address-sanitizer" >&5 $as_echo_n "checking for --with-address-sanitizer... " >&6; } @@ -10903,10 +11072,10 @@ else main() { pthread_attr_t attr; pthread_t id; - if (pthread_attr_init(&attr)) exit(-1); - if (pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM)) exit(-1); - if (pthread_create(&id, &attr, foo, NULL)) exit(-1); - exit(0); + if (pthread_attr_init(&attr)) return (-1); + if (pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM)) return (-1); + if (pthread_create(&id, &attr, foo, NULL)) return (-1); + return (0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : @@ -11238,6 +11407,36 @@ $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CAN_RAW_JOIN_FILTERS" >&5 +$as_echo_n "checking for CAN_RAW_JOIN_FILTERS... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +int +main () +{ +int can_raw_join_filters = CAN_RAW_JOIN_FILTERS; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + +$as_echo "#define HAVE_LINUX_CAN_RAW_JOIN_FILTERS 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + # Check for --with-doc-strings { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-doc-strings" >&5 $as_echo_n "checking for --with-doc-strings... " >&6; } @@ -11353,7 +11552,6 @@ $as_echo "$with_dtrace" >&6; } DTRACE= -DFLAGS= DTRACE_HEADERS= DTRACE_OBJS= @@ -11419,7 +11617,7 @@ if ${ac_cv_dtrace_link+:} false; then : else ac_cv_dtrace_link=no echo 'BEGIN{}' > conftest.d - "$DTRACE" -G -s conftest.d -o conftest.o > /dev/null 2>&1 && \ + "$DTRACE" $DFLAGS -G -s conftest.d -o conftest.o > /dev/null 2>&1 && \ ac_cv_dtrace_link=yes fi @@ -11515,7 +11713,7 @@ for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ memrchr mbrtowc mkdirat mkfifo \ madvise mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \ posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \ - pthread_condattr_setclock pthread_init pthread_kill putenv pwrite pwritev pwritev2 \ + pthread_condattr_setclock pthread_init pthread_kill pwrite pwritev pwritev2 \ readlink readlinkat readv realpath renameat \ sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid seteuid \ setgid sethostname \ @@ -11525,7 +11723,7 @@ for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ sigaction sigaltstack sigfillset siginterrupt sigpending sigrelse \ sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy strsignal symlinkat sync \ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ - truncate uname unlinkat unsetenv utimensat utimes waitid waitpid wait3 wait4 \ + truncate uname unlinkat utimensat utimes waitid waitpid wait3 wait4 \ wcscoll wcsftime wcsxfrm wmemcmp writev _getpty rtpSpawn do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` @@ -11822,6 +12020,31 @@ else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _dyld_shared_cache_contains_path" >&5 +$as_echo_n "checking for _dyld_shared_cache_contains_path... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +void *x=_dyld_shared_cache_contains_path + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +$as_echo "#define HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext @@ -12740,37 +12963,6 @@ if ac_fn_c_try_compile "$LINENO"; then : $as_echo "#define SETPGRP_HAVE_ARG 1" >>confdefs.h -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -done - -for ac_func in gettimeofday -do : - ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" -if test "x$ac_cv_func_gettimeofday" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_GETTIMEOFDAY 1 -_ACEOF - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -gettimeofday((struct timeval*)0,(struct timezone*)0); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - -$as_echo "#define GETTIMEOFDAY_NO_TZ 1" >>confdefs.h - - fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext @@ -14891,7 +15083,7 @@ else int main() { /* Success: exit code 0 */ - exit((((wchar_t) -1) < ((wchar_t) 0)) ? 0 : 1); + return ((((wchar_t) -1) < ((wchar_t) 0)) ? 0 : 1); } _ACEOF @@ -15190,13 +15382,7 @@ _ACEOF fi - -case $ac_sys_system in - Linux*|GNU*|Darwin|VxWorks) - EXT_SUFFIX=.${SOABI}${SHLIB_SUFFIX};; - *) - EXT_SUFFIX=${SHLIB_SUFFIX};; -esac +EXT_SUFFIX=.${SOABI}${SHLIB_SUFFIX} { $as_echo "$as_me:${as_lineno-$LINENO}: checking LDVERSION" >&5 $as_echo_n "checking LDVERSION... " >&6; } @@ -15213,10 +15399,46 @@ else fi + +BINLIBDEST='$(LIBDIR)/python$(VERSION)' + + +# Check for --with-platlibdir +# /usr/$LIDIRNAME/python$VERSION + +PLATLIBDIR="lib" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-platlibdir" >&5 +$as_echo_n "checking for --with-platlibdir... " >&6; } + +# Check whether --with-platlibdir was given. +if test "${with_platlibdir+set}" = set; then : + withval=$with_platlibdir; +# ignore 3 options: +# --with-platlibdir +# --with-platlibdir= +# --without-platlibdir +if test -n "$withval" -a "$withval" != yes -a "$withval" != no +then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + PLATLIBDIR="$withval" + BINLIBDEST='${exec_prefix}/${PLATLIBDIR}/python$(VERSION)' +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + if test x$PLATFORM_TRIPLET = x; then - LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}" + LIBPL='$(prefix)'"/${PLATLIBDIR}/python${VERSION}/config-${LDVERSION}" else - LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}" + LIBPL='$(prefix)'"/${PLATLIBDIR}/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}" fi @@ -15236,7 +15458,7 @@ else int main() { - exit(((-1)>>3 == -1) ? 0 : 1); + return (((-1)>>3 == -1) ? 0 : 1); } _ACEOF @@ -15706,6 +15928,7 @@ else /* end confdefs.h. */ #include +#include int main() { @@ -16648,7 +16871,7 @@ do done -SRCDIRS="Parser Objects Python Modules Modules/_io Programs" +SRCDIRS="Parser Parser/pegen Objects Python Modules Modules/_io Programs" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for build directories" >&5 $as_echo_n "checking for build directories... " >&6; } for dir in $SRCDIRS; do @@ -17391,6 +17614,43 @@ $as_echo "#define PY_SSL_DEFAULT_CIPHERS 1" >>confdefs.h fi +# builtin hash modules +default_hashlib_hashes="md5,sha1,sha256,sha512,sha3,blake2" + +$as_echo "#define PY_BUILTIN_HASHLIB_HASHES /**/" >>confdefs.h + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-builtin-hashlib-hashes" >&5 +$as_echo_n "checking for --with-builtin-hashlib-hashes... " >&6; } + +# Check whether --with-builtin-hashlib-hashes was given. +if test "${with_builtin_hashlib_hashes+set}" = set; then : + withval=$with_builtin_hashlib_hashes; +case "$withval" in + yes) + withval=$default_hashlib_hashes + ;; + no) + withval="" + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $withval" >&5 +$as_echo "$withval" >&6; } +cat >>confdefs.h <<_ACEOF +#define PY_BUILTIN_HASHLIB_HASHES "$withval" +_ACEOF + + +else + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $default_hashlib_hashes" >&5 +$as_echo "$default_hashlib_hashes" >&6; }; +cat >>confdefs.h <<_ACEOF +#define PY_BUILTIN_HASHLIB_HASHES "$default_hashlib_hashes" +_ACEOF + + +fi + # generate output files ac_config_files="$ac_config_files Makefile.pre Misc/python.pc Misc/python-embed.pc Misc/python-config.sh" @@ -17904,7 +18164,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by python $as_me 3.8, which was +This file was extended by python $as_me 3.9, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -17966,7 +18226,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -python config.status 3.8 +python config.status 3.9 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index 18a044629a78533505c39ce879783b267410e27c..972287a9c476613fff5deacb7db9e13a99e84485 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ dnl * Please run autoreconf to test your changes! * dnl *********************************************** # Set VERSION so we only need to edit in one place (i.e., here) -m4_define(PYTHON_VERSION, 3.8) +m4_define(PYTHON_VERSION, 3.9) AC_PREREQ([2.69]) @@ -149,7 +149,10 @@ CONFIG_ARGS="$ac_configure_args" AC_MSG_CHECKING([for --enable-universalsdk]) AC_ARG_ENABLE(universalsdk, - AS_HELP_STRING([--enable-universalsdk@<:@=SDKDIR@:>@], [Build fat binary against Mac OS X SDK]), + AS_HELP_STRING([--enable-universalsdk@<:@=SDKDIR@:>@], + [create a universal binary build. + SDKDIR specifies which macOS SDK should be used to perform the build, + see Mac/README.rst. (default is no)]), [ case $enableval in yes) @@ -212,7 +215,11 @@ fi AC_SUBST(LIPO_32BIT_FLAGS) AC_MSG_CHECKING(for --with-universal-archs) AC_ARG_WITH(universal-archs, - AS_HELP_STRING([--with-universal-archs=ARCH], [select architectures for universal build ("32-bit", "64-bit", "3-way", "intel", "intel-32", "intel-64", or "all")]), + AS_HELP_STRING([--with-universal-archs=ARCH], + [specify the kind of universal binary that should be created. this option is + only valid when --enable-universalsdk is set; options are: + ("universal2", "32-bit", "64-bit", "3-way", "intel", "intel-32", "intel-64", or "all") + see Mac/README.rst]), [ UNIVERSAL_ARCHS="$withval" ], @@ -226,7 +233,9 @@ fi AC_ARG_WITH(framework-name, AS_HELP_STRING([--with-framework-name=FRAMEWORK], - [specify an alternate name of the framework built with --enable-framework]), + [specify the name for the python framework on macOS + only valid when --enable-framework is set. see Mac/README.rst + (default is 'Python')]), [ PYTHONFRAMEWORK=${withval} PYTHONFRAMEWORKDIR=${withval}.framework @@ -238,7 +247,10 @@ AC_ARG_WITH(framework-name, ]) dnl quadrigraphs "@<:@" and "@:>@" produce "[" and "]" in the output AC_ARG_ENABLE(framework, - AS_HELP_STRING([--enable-framework@<:@=INSTALLDIR@:>@], [Build (MacOSX|Darwin) framework]), + AS_HELP_STRING([--enable-framework@<:@=INSTALLDIR@:>@], + [create a Python.framework rather than a traditional Unix install. + optional INSTALLDIR specifies the installation path. see Mac/README.rst + (default is no)]), [ case $enableval in yes) @@ -357,7 +369,7 @@ AC_DEFINE_UNQUOTED(_PYTHONFRAMEWORK, "${PYTHONFRAMEWORK}", [framework name]) ##AC_ARG_WITH(dyld, ## AS_HELP_STRING([--with-dyld], -## [Use (OpenStep|Rhapsody) dynamic linker])) +## [use (OpenStep|Rhapsody) dynamic linker])) ## # Set name for machine-dependent library files AC_ARG_VAR([MACHDEP], [name for machine-dependent library files]) @@ -653,8 +665,8 @@ AC_SUBST(CXX) AC_SUBST(MAINCC) AC_MSG_CHECKING(for --with-cxx-main=) AC_ARG_WITH(cxx_main, - AS_HELP_STRING([--with-cxx-main=], - [compile main() and link python executable with C++ compiler]), + AS_HELP_STRING([--with-cxx-main@<:@=COMPILER@:>@], + [compile main() and link Python executable with C++ compiler specified in COMPILER (default is $CXX)]), [ case $withval in @@ -934,7 +946,7 @@ esac AC_EXEEXT AC_MSG_CHECKING(for --with-suffix) AC_ARG_WITH(suffix, - AS_HELP_STRING([--with-suffix=.exe], [set executable suffix]), + AS_HELP_STRING([--with-suffix=SUFFIX], [set executable suffix to SUFFIX (default is '.exe')]), [ case $withval in no) EXEEXT=;; @@ -1012,21 +1024,12 @@ LDVERSION="$VERSION" # If CXX is set, and if it is needed to link a main function that was # compiled with CXX, LINKCC is CXX instead. Always using CXX is undesirable: # python might then depend on the C++ runtime -# This is altered for AIX in order to build the export list before -# linking. AC_SUBST(LINKCC) AC_MSG_CHECKING(LINKCC) if test -z "$LINKCC" then LINKCC='$(PURIFY) $(MAINCC)' case $ac_sys_system in - AIX*) - exp_extra="\"\"" - if test $ac_sys_release -ge 5 -o \ - $ac_sys_release -eq 4 -a `uname -r` -ge 2 ; then - exp_extra="." - fi - LINKCC="\$(srcdir)/Modules/makexp_aix Modules/python.exp $exp_extra \$(LIBRARY); $LINKCC";; QNX*) # qcc must be used because the other compilers do not # support -N. @@ -1035,6 +1038,24 @@ then fi AC_MSG_RESULT($LINKCC) +# EXPORTSYMS holds the list of exported symbols for AIX. +# EXPORTSFROM holds the module name exporting symbols on AIX. +EXPORTSYMS= +EXPORTSFROM= +AC_SUBST(EXPORTSYMS) +AC_SUBST(EXPORTSFROM) +AC_MSG_CHECKING(EXPORTSYMS) +case $ac_sys_system in +AIX*) + EXPORTSYMS="Modules/python.exp" + if test $ac_sys_release -ge 5 -o \ + $ac_sys_release -eq 4 -a `uname -r` -ge 2 ; then + EXPORTSFROM=. # the main executable + fi + ;; +esac +AC_MSG_RESULT($EXPORTSYMS) + # GNULD is set to "yes" if the GNU linker is used. If this goes wrong # make sure we default having it set to "no": this is used by # distutils.unixccompiler to know if it should add --enable-new-dtags @@ -1056,7 +1077,7 @@ AC_MSG_RESULT($GNULD) AC_MSG_CHECKING(for --enable-shared) AC_ARG_ENABLE(shared, - AS_HELP_STRING([--enable-shared], [disable/enable building shared python library])) + AS_HELP_STRING([--enable-shared], [enable building a shared Python library (default is no)])) if test -z "$enable_shared" then @@ -1071,7 +1092,7 @@ AC_MSG_RESULT($enable_shared) AC_MSG_CHECKING(for --enable-profiling) AC_ARG_ENABLE(profiling, - AS_HELP_STRING([--enable-profiling], [enable C-level code profiling])) + AS_HELP_STRING([--enable-profiling], [enable C-level code profiling with gprof (default is no)])) if test "x$enable_profiling" = xyes; then ac_save_cc="$CC" CC="$CC -pg" @@ -1222,7 +1243,7 @@ ABIFLAGS="" # Check for --with-pydebug AC_MSG_CHECKING(for --with-pydebug) AC_ARG_WITH(pydebug, - AS_HELP_STRING([--with-pydebug], [build with Py_DEBUG defined]), + AS_HELP_STRING([--with-pydebug], [build with Py_DEBUG defined (default is no)]), [ if test "$withval" != no then @@ -1239,7 +1260,9 @@ fi], # --with-trace-refs AC_MSG_CHECKING(for --with-trace-refs) AC_ARG_WITH(trace-refs, - AS_HELP_STRING([--with-trace-refs],[enable tracing references for debugging purpose]),, + AS_HELP_STRING( + [--with-trace-refs], + [enable tracing references for debugging purpose (default is no)]),, with_trace_refs=no) AC_MSG_RESULT($with_trace_refs) @@ -1253,7 +1276,7 @@ fi assertions='false' AC_MSG_CHECKING(for --with-assertions) AC_ARG_WITH(assertions, - AS_HELP_STRING([--with-assertions],[build with C assertions enabled]), + AS_HELP_STRING([--with-assertions],[build with C assertions enabled (default is no)]), [ if test "$withval" != no then @@ -1274,7 +1297,9 @@ AC_SUBST(DEF_MAKE_ALL_RULE) AC_SUBST(DEF_MAKE_RULE) Py_OPT='false' AC_MSG_CHECKING(for --enable-optimizations) -AC_ARG_ENABLE(optimizations, AS_HELP_STRING([--enable-optimizations], [Enable expensive, stable optimizations (PGO, etc). Disabled by default.]), +AC_ARG_ENABLE(optimizations, AS_HELP_STRING( + [--enable-optimizations], + [enable expensive, stable optimizations (PGO, etc.) (default is no)]), [ if test "$enableval" != no then @@ -1329,7 +1354,7 @@ fi # Enable LTO flags AC_MSG_CHECKING(for --with-lto) -AC_ARG_WITH(lto, AS_HELP_STRING([--with-lto], [Enable Link Time Optimization in any build. Disabled by default.]), +AC_ARG_WITH(lto, AS_HELP_STRING([--with-lto], [enable Link-Time-Optimization in any build (default is no)]), [ if test "$withval" != no then @@ -1562,7 +1587,7 @@ AC_SUBST(BASECFLAGS) AC_SUBST(CFLAGS_NODIST) AC_SUBST(LDFLAGS_NODIST) -# The -arch flags for universal builds on OSX +# The -arch flags for universal builds on macOS UNIVERSAL_ARCH_FLAGS= AC_SUBST(UNIVERSAL_ARCH_FLAGS) @@ -1793,6 +1818,26 @@ yes) CFLAGS_NODIST="$CFLAGS_NODIST -Werror=implicit-function-declaration" fi + AC_MSG_CHECKING(if we can use visibility in $CC) + ac_save_cc="$CC" + CC="$CC -fvisibility=hidden" + AC_CACHE_VAL(ac_cv_enable_visibility, + AC_COMPILE_IFELSE( + [ + AC_LANG_PROGRAM([[]], [[]]) + ],[ + ac_cv_enable_visibility=yes + ],[ + ac_cv_enable_visibility=no + ])) + CC="$ac_save_cc" + AC_MSG_RESULT($ac_cv_enable_visibility) + + if test $ac_cv_enable_visibility = yes + then + CFLAGS_NODIST="$CFLAGS_NODIST -fvisibility=hidden" + fi + # if using gcc on alpha, use -mieee to get (near) full IEEE 754 # support. Without this, treatment of subnormals doesn't follow # the standard. @@ -1843,6 +1888,11 @@ yes) LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ;; + universal2) + UNIVERSAL_ARCH_FLAGS="-arch arm64 -arch x86_64" + LIPO_32BIT_FLAGS="" + ARCH_RUN_32BIT="true" + ;; intel) UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" LIPO_32BIT_FLAGS="-extract i386" @@ -1864,7 +1914,7 @@ yes) ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ;; *) - AC_MSG_ERROR([proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way]) + AC_MSG_ERROR([proper usage is --with-universal-arch=universal2|32-bit|64-bit|all|intel|3-way]) ;; esac @@ -1931,6 +1981,13 @@ yes) EXPORT_MACOSX_DEPLOYMENT_TARGET='' AC_MSG_RESULT($MACOSX_DEPLOYMENT_TARGET) + AC_MSG_CHECKING(if specified universal architectures work) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[printf("%d", 42);]])], + [AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no) + AC_MSG_ERROR(check config.log and use the '--with-universal-archs' option) + ]) + # end of Darwin* tests ;; esac @@ -1948,11 +2005,14 @@ yes) ;; esac -# ICC needs -fp-model strict or floats behave badly case "$CC" in *icc*) + # ICC needs -fp-model strict or floats behave badly CFLAGS_NODIST="$CFLAGS_NODIST -fp-model strict" ;; +*xlc*) + CFLAGS_NODIST="$CFLAGS_NODIST -qalias=noansi -qmaxmem=-1" + ;; esac if test "$assertions" = 'true'; then @@ -2147,7 +2207,7 @@ sys/stat.h sys/syscall.h sys/sys_domain.h sys/termio.h sys/time.h \ sys/times.h sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/wait.h pty.h \ libutil.h sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \ linux/tipc.h linux/random.h spawn.h util.h alloca.h endian.h \ -sys/endian.h sys/sysmacros.h linux/memfd.h sys/memfd.h sys/mman.h) +sys/endian.h sys/sysmacros.h linux/memfd.h linux/wait.h sys/memfd.h sys/mman.h) AC_HEADER_DIRENT AC_HEADER_MAJOR @@ -2200,8 +2260,8 @@ AC_CHECK_HEADERS(linux/vm_sockets.h,,,[ #endif ]) -# On Linux, can.h and can/raw.h require sys/socket.h -AC_CHECK_HEADERS(linux/can.h linux/can/raw.h linux/can/bcm.h,,,[ +# On Linux, can.h, can/bcm.h, can/j1939.h, can/raw.h require sys/socket.h +AC_CHECK_HEADERS(linux/can.h linux/can/bcm.h linux/can/j1939.h linux/can/raw.h,,,[ #ifdef HAVE_SYS_SOCKET_H #include #endif @@ -2431,7 +2491,7 @@ case $ac_sys_system/$ac_sys_release in MACOSX_DEFAULT_ARCH="ppc" ;; *) - AC_MSG_ERROR([Unexpected output of 'arch' on OSX]) + AC_MSG_ERROR([Unexpected output of 'arch' on macOS]) ;; esac else @@ -2441,9 +2501,12 @@ case $ac_sys_system/$ac_sys_release in ;; ppc) MACOSX_DEFAULT_ARCH="ppc64" + ;; + arm64) + MACOSX_DEFAULT_ARCH="arm64" ;; *) - AC_MSG_ERROR([Unexpected output of 'arch' on OSX]) + AC_MSG_ERROR([Unexpected output of 'arch' on macOS]) ;; esac @@ -2844,7 +2907,17 @@ case "$ac_sys_system" in AC_MSG_RESULT(yes) ],[ AC_MSG_RESULT(no) - ]);; + ]) +dnl The AIX_BUILDDATE is obtained from the kernel fileset - bos.mp64 +# BUILD_GNU_TYPE + AIX_BUILDDATE are used to construct the platform_tag +# of the AIX system used to build/package Python executable. This tag serves +# as a baseline for bdist module packages + AC_MSG_CHECKING(for the system builddate) + AIX_BUILDDATE=$(lslpp -Lcq bos.mp64 | awk -F: '{ print $NF }') + AC_DEFINE_UNQUOTED([AIX_BUILDDATE], [$AIX_BUILDDATE], + [BUILD_GNU_TYPE + AIX_BUILDDATE are used to construct the PEP425 tag of the build system.]) + AC_MSG_RESULT($AIX_BUILDDATE) + ;; *) ;; esac @@ -2883,7 +2956,7 @@ AC_MSG_CHECKING(for --with-hash-algorithm) dnl quadrigraphs "@<:@" and "@:>@" produce "[" and "]" in the output AC_ARG_WITH(hash_algorithm, AS_HELP_STRING([--with-hash-algorithm=@<:@fnv|siphash24@:>@], - [select hash algorithm]), + [select hash algorithm for use in Python/pyhash.c (default is SipHash24)]), [ AC_MSG_RESULT($withval) case "$withval" in @@ -2900,10 +2973,46 @@ esac ], [AC_MSG_RESULT(default)]) +validate_tzpath() { + # Checks that each element of hte path is an absolute path + if test -z "$1"; then + # Empty string is allowed: it indicates no system TZPATH + return 0 + fi + + # Bad paths are those that don't start with / + dnl quadrigraphs "@<:@" and "@:>@" produce "[" and "]" in the output + if ( echo $1 | grep -qE '(^|:)(@<:@^/@:>@|$)' ); then + AC_MSG_ERROR([--with-tzpath must contain only absolute paths, not $1]) + return 1; + fi +} + +TZPATH="/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo" +AC_MSG_CHECKING(for --with-tzpath) +AC_ARG_WITH(tzpath, + AS_HELP_STRING([--with-tzpath=] + [Select the default time zone search path for zoneinfo.TZPATH]), +[ +case "$withval" in + yes) + AC_MSG_ERROR([--with-tzpath requires a value]) + ;; + *) + validate_tzpath "$withval" + TZPATH="$withval" + AC_MSG_RESULT("$withval") + ;; +esac +], +[validate_tzpath "$TZPATH" + AC_MSG_RESULT("$TZPATH")]) +AC_SUBST(TZPATH) + AC_MSG_CHECKING(for --with-address-sanitizer) AC_ARG_WITH(address_sanitizer, AS_HELP_STRING([--with-address-sanitizer], - [enable AddressSanitizer (asan)]), + [enable AddressSanitizer memory error detector, 'asan' (default is no)]), [ AC_MSG_RESULT($withval) BASECFLAGS="-fsanitize=address -fno-omit-frame-pointer $BASECFLAGS" @@ -2916,7 +3025,7 @@ with_pymalloc="no" AC_MSG_CHECKING(for --with-memory-sanitizer) AC_ARG_WITH(memory_sanitizer, AS_HELP_STRING([--with-memory-sanitizer], - [enable MemorySanitizer (msan)]), + [enable MemorySanitizer allocation error detector, 'msan' (default is no)]), [ AC_MSG_RESULT($withval) BASECFLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer $BASECFLAGS" @@ -2929,7 +3038,7 @@ with_pymalloc="no" AC_MSG_CHECKING(for --with-undefined-behavior-sanitizer) AC_ARG_WITH(undefined_behavior_sanitizer, AS_HELP_STRING([--with-undefined-behavior-sanitizer], - [enable UndefinedBehaviorSanitizer (ubsan)]), + [enable UndefinedBehaviorSanitizer undefined behaviour detector, 'ubsan' (default is no)]), [ AC_MSG_RESULT($withval) BASECFLAGS="-fsanitize=undefined $BASECFLAGS" @@ -2943,7 +3052,7 @@ AC_CHECK_LIB(socket, socket, [LIBS="-lsocket $LIBS"], [], $LIBS) # SVR4 sockets AC_MSG_CHECKING(for --with-libs) AC_ARG_WITH(libs, - AS_HELP_STRING([--with-libs='lib1 ...'], [link against additional libs]), + AS_HELP_STRING([--with-libs='lib1 ...'], [link against additional libs (default is no)]), [ AC_MSG_RESULT($withval) LIBS="$withval $LIBS" @@ -2955,7 +3064,7 @@ PKG_PROG_PKG_CONFIG # Check for use of the system expat library AC_MSG_CHECKING(for --with-system-expat) AC_ARG_WITH(system_expat, - AS_HELP_STRING([--with-system-expat], [build pyexpat module using an installed expat library]), + AS_HELP_STRING([--with-system-expat], [build pyexpat module using an installed expat library, see Doc/library/pyexpat.rst (default is no)]), [], [with_system_expat="no"]) @@ -2964,7 +3073,7 @@ AC_MSG_RESULT($with_system_expat) # Check for use of the system libffi library AC_MSG_CHECKING(for --with-system-ffi) AC_ARG_WITH(system_ffi, - AS_HELP_STRING([--with-system-ffi], [build _ctypes module using an installed ffi library]),,,) + AS_HELP_STRING([--with-system-ffi], [build _ctypes module using an installed ffi library, see Doc/library/ctypes.rst (default is system-dependent)]),,,) if test "$ac_sys_system" = "Darwin" then @@ -2998,7 +3107,7 @@ AC_SUBST(LIBFFI_INCLUDEDIR) # Check for use of the system libmpdec library AC_MSG_CHECKING(for --with-system-libmpdec) AC_ARG_WITH(system_libmpdec, - AS_HELP_STRING([--with-system-libmpdec], [build _decimal module using an installed libmpdec library]), + AS_HELP_STRING([--with-system-libmpdec], [build _decimal module using an installed libmpdec library, see Doc/library/decimal.rst (default is no)]), [], [with_system_libmpdec="no"]) @@ -3022,7 +3131,8 @@ AC_MSG_RESULT($with_decimal_contextvar) # Check for support for loadable sqlite extensions AC_MSG_CHECKING(for --enable-loadable-sqlite-extensions) AC_ARG_ENABLE(loadable-sqlite-extensions, - AS_HELP_STRING([--enable-loadable-sqlite-extensions], [support loadable extensions in _sqlite module]), + AS_HELP_STRING([--enable-loadable-sqlite-extensions], + [support loadable extensions in _sqlite module, see Doc/library/sqlite3.rst (default is no)]), [], [enable_loadable_sqlite_extensions="no"]) @@ -3059,7 +3169,7 @@ fi # Check for --with-dbmliborder AC_MSG_CHECKING(for --with-dbmliborder) AC_ARG_WITH(dbmliborder, - AS_HELP_STRING([--with-dbmliborder=db1:db2:...], [order to check db backends for dbm. Valid value is a colon separated string with the backend names `ndbm', `gdbm' and `bdb'.]), + AS_HELP_STRING([--with-dbmliborder=db1:db2:...], [override order to check db backends for dbm; a valid value is a colon separated string with the backend names `ndbm', `gdbm' and `bdb'.]), [ if test x$with_dbmliborder = xyes then @@ -3203,10 +3313,10 @@ if test "$posix_threads" = "yes"; then main() { pthread_attr_t attr; pthread_t id; - if (pthread_attr_init(&attr)) exit(-1); - if (pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM)) exit(-1); - if (pthread_create(&id, &attr, foo, NULL)) exit(-1); - exit(0); + if (pthread_attr_init(&attr)) return (-1); + if (pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM)) return (-1); + if (pthread_create(&id, &attr, foo, NULL)) return (-1); + return (0); }]])], [ac_cv_pthread_system_supported=yes], [ac_cv_pthread_system_supported=no], @@ -3231,8 +3341,8 @@ fi AH_TEMPLATE(ENABLE_IPV6, [Define if --enable-ipv6 is specified]) AC_MSG_CHECKING([if --enable-ipv6 is specified]) AC_ARG_ENABLE(ipv6, -[ --enable-ipv6 Enable ipv6 (with ipv4) support - --disable-ipv6 Disable ipv6 support], + AS_HELP_STRING([--enable-ipv6], + [enable ipv6 (with ipv4) support, see Doc/library/socket.rst (default is yes if supported)]), [ case "$enableval" in no) AC_MSG_RESULT(no) @@ -3400,10 +3510,20 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ /* CAN_RAW_FD_FRAMES available check */ AC_MSG_RESULT(no) ]) +AC_MSG_CHECKING(for CAN_RAW_JOIN_FILTERS) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include ]], +[[int can_raw_join_filters = CAN_RAW_JOIN_FILTERS;]])],[ + AC_DEFINE(HAVE_LINUX_CAN_RAW_JOIN_FILTERS, 1, [Define if compiling using Linux 4.1 or later.]) + AC_MSG_RESULT(yes) +],[ + AC_MSG_RESULT(no) +]) + # Check for --with-doc-strings AC_MSG_CHECKING(for --with-doc-strings) AC_ARG_WITH(doc-strings, - AS_HELP_STRING([--with(out)-doc-strings], [disable/enable documentation strings])) + AS_HELP_STRING([--with-doc-strings], [enable documentation strings (default is yes)])) if test -z "$with_doc_strings" then with_doc_strings="yes" @@ -3418,7 +3538,7 @@ AC_MSG_RESULT($with_doc_strings) # Check for Python-specific malloc support AC_MSG_CHECKING(for --with-pymalloc) AC_ARG_WITH(pymalloc, - AS_HELP_STRING([--with(out)-pymalloc], [disable/enable specialized mallocs])) + AS_HELP_STRING([--with-pymalloc], [enable specialized mallocs (default is yes)])) if test -z "$with_pymalloc" then @@ -3434,8 +3554,8 @@ AC_MSG_RESULT($with_pymalloc) # Check for --with-c-locale-coercion AC_MSG_CHECKING(for --with-c-locale-coercion) AC_ARG_WITH(c-locale-coercion, - AS_HELP_STRING([--with(out)-c-locale-coercion], - [disable/enable C locale coercion to a UTF-8 based locale])) + AS_HELP_STRING([--with-c-locale-coercion], + [enable C locale coercion to a UTF-8 based locale (default is yes)])) if test -z "$with_c_locale_coercion" then @@ -3451,7 +3571,7 @@ AC_MSG_RESULT($with_c_locale_coercion) # Check for Valgrind support AC_MSG_CHECKING([for --with-valgrind]) AC_ARG_WITH([valgrind], - AS_HELP_STRING([--with-valgrind], [Enable Valgrind support]),, + AS_HELP_STRING([--with-valgrind], [enable Valgrind support (default is no)]),, with_valgrind=no) AC_MSG_RESULT([$with_valgrind]) if test "$with_valgrind" != no; then @@ -3465,7 +3585,7 @@ fi # Check for DTrace support AC_MSG_CHECKING(for --with-dtrace) AC_ARG_WITH(dtrace, - AS_HELP_STRING([--with(out)-dtrace],[disable/enable DTrace support]),, + AS_HELP_STRING([--with-dtrace],[enable DTrace support (default is no)]),, with_dtrace=no) AC_MSG_RESULT($with_dtrace) @@ -3474,7 +3594,6 @@ AC_SUBST(DFLAGS) AC_SUBST(DTRACE_HEADERS) AC_SUBST(DTRACE_OBJS) DTRACE= -DFLAGS= DTRACE_HEADERS= DTRACE_OBJS= @@ -3495,7 +3614,7 @@ then [ac_cv_dtrace_link], [dnl ac_cv_dtrace_link=no echo 'BEGIN{}' > conftest.d - "$DTRACE" -G -s conftest.d -o conftest.o > /dev/null 2>&1 && \ + "$DTRACE" $DFLAGS -G -s conftest.d -o conftest.o > /dev/null 2>&1 && \ ac_cv_dtrace_link=yes ]) if test "$ac_cv_dtrace_link" = "yes"; then @@ -3572,7 +3691,7 @@ AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ memrchr mbrtowc mkdirat mkfifo \ madvise mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \ posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \ - pthread_condattr_setclock pthread_init pthread_kill putenv pwrite pwritev pwritev2 \ + pthread_condattr_setclock pthread_init pthread_kill pwrite pwritev pwritev2 \ readlink readlinkat readv realpath renameat \ sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid seteuid \ setgid sethostname \ @@ -3582,7 +3701,7 @@ AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ sigaction sigaltstack sigfillset siginterrupt sigpending sigrelse \ sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy strsignal symlinkat sync \ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ - truncate uname unlinkat unsetenv utimensat utimes waitid waitpid wait3 wait4 \ + truncate uname unlinkat utimensat utimes waitid waitpid wait3 wait4 \ wcscoll wcsftime wcsxfrm wmemcmp writev _getpty rtpSpawn) # Force lchmod off for Linux. Linux disallows changing the mode of symbolic @@ -3666,6 +3785,12 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no) ]) +AC_MSG_CHECKING(for _dyld_shared_cache_contains_path) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[void *x=_dyld_shared_cache_contains_path]])], + [AC_DEFINE(HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH, 1, Define if you have the '_dyld_shared_cache_contains_path' function.) + AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no) +]) AC_MSG_CHECKING(for memfd_create) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ @@ -3889,15 +4014,6 @@ AC_CHECK_FUNCS(setpgrp, [AC_DEFINE(SETPGRP_HAVE_ARG, 1, [Define if setpgrp() must be called as setpgrp(0, 0).])], []) ) -AC_CHECK_FUNCS(gettimeofday, - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], - [[gettimeofday((struct timeval*)0,(struct timezone*)0);]])], - [], - [AC_DEFINE(GETTIMEOFDAY_NO_TZ, 1, - [Define if gettimeofday() does not have second (timezone) argument - This is the case on Motorola V4 (R40V4.2)]) - ]) -) # We search for both crypt and crypt_r as one or the other may be defined # This gets us our -lcrypt in LIBS when required on the target platform. @@ -4321,7 +4437,7 @@ Darwin) ;; esac AC_MSG_CHECKING(for --with-libm=STRING) AC_ARG_WITH(libm, - AS_HELP_STRING([--with-libm=STRING], [math library]), + AS_HELP_STRING([--with-libm=STRING], [override libm math library to STRING (default is system-dependent)]), [ if test "$withval" = no then LIBM= @@ -4337,7 +4453,7 @@ fi], AC_SUBST(LIBC) AC_MSG_CHECKING(for --with-libc=STRING) AC_ARG_WITH(libc, - AS_HELP_STRING([--with-libc=STRING], [C library]), + AS_HELP_STRING([--with-libc=STRING], [override libc C library to STRING (default is system-dependent)]), [ if test "$withval" = no then LIBC= @@ -4555,7 +4671,7 @@ AC_CHECK_DECLS([RTLD_LAZY, RTLD_NOW, RTLD_GLOBAL, RTLD_LOCAL, RTLD_NODELETE, RTL # determine what size digit to use for Python's longs AC_MSG_CHECKING([digit size for Python's longs]) AC_ARG_ENABLE(big-digits, -AS_HELP_STRING([--enable-big-digits@<:@=BITS@:>@],[use big digits for Python longs [[BITS=30]]]), +AS_HELP_STRING([--enable-big-digits@<:@=15|30@:>@],[use big digits (30 or 15 bits) for Python longs (default is system-dependent)]]), [case $enable_big_digits in yes) enable_big_digits=30 ;; @@ -4609,7 +4725,7 @@ then int main() { /* Success: exit code 0 */ - exit((((wchar_t) -1) < ((wchar_t) 0)) ? 0 : 1); + return ((((wchar_t) -1) < ((wchar_t) 0)) ? 0 : 1); } ]])], [ac_cv_wchar_t_signed=yes], @@ -4667,12 +4783,7 @@ if test "$Py_DEBUG" = 'true' -a "$with_trace_refs" != "yes"; then fi AC_SUBST(EXT_SUFFIX) -case $ac_sys_system in - Linux*|GNU*|Darwin|VxWorks) - EXT_SUFFIX=.${SOABI}${SHLIB_SUFFIX};; - *) - EXT_SUFFIX=${SHLIB_SUFFIX};; -esac +EXT_SUFFIX=.${SOABI}${SHLIB_SUFFIX} AC_MSG_CHECKING(LDVERSION) LDVERSION='$(VERSION)$(ABIFLAGS)' @@ -4686,12 +4797,41 @@ else LIBPYTHON='' fi + +AC_SUBST(BINLIBDEST) +BINLIBDEST='$(LIBDIR)/python$(VERSION)' + + +# Check for --with-platlibdir +# /usr/$LIDIRNAME/python$VERSION +AC_SUBST(PLATLIBDIR) +PLATLIBDIR="lib" +AC_MSG_CHECKING(for --with-platlibdir) +AC_ARG_WITH(platlibdir, + AS_HELP_STRING([--with-platlibdir=DIRNAME], + [Python library directory name (default is "lib")]), +[ +# ignore 3 options: +# --with-platlibdir +# --with-platlibdir= +# --without-platlibdir +if test -n "$withval" -a "$withval" != yes -a "$withval" != no +then + AC_MSG_RESULT(yes) + PLATLIBDIR="$withval" + BINLIBDEST='${exec_prefix}/${PLATLIBDIR}/python$(VERSION)' +else + AC_MSG_RESULT(no) +fi], +[AC_MSG_RESULT(no)]) + + dnl define LIBPL after ABIFLAGS and LDVERSION is defined. AC_SUBST(PY_ENABLE_SHARED) if test x$PLATFORM_TRIPLET = x; then - LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}" + LIBPL='$(prefix)'"/${PLATLIBDIR}/python${VERSION}/config-${LDVERSION}" else - LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}" + LIBPL='$(prefix)'"/${PLATLIBDIR}/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}" fi AC_SUBST(LIBPL) @@ -4702,7 +4842,7 @@ AC_CACHE_VAL(ac_cv_rshift_extends_sign, [ AC_RUN_IFELSE([AC_LANG_SOURCE([[ int main() { - exit(((-1)>>3 == -1) ? 0 : 1); + return (((-1)>>3 == -1) ? 0 : 1); } ]])], [ac_cv_rshift_extends_sign=yes], @@ -4849,6 +4989,7 @@ AC_MSG_CHECKING(for broken poll()) AC_CACHE_VAL(ac_cv_broken_poll, AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include +#include int main() { @@ -5267,8 +5408,8 @@ fi # Check for --with-computed-gotos AC_MSG_CHECKING(for --with-computed-gotos) AC_ARG_WITH(computed-gotos, - AS_HELP_STRING([--with(out)-computed-gotos], - [Use computed gotos in evaluation loop (enabled by default on supported compilers)]), + AS_HELP_STRING([--with-computed-gotos], + [enable computed gotos in evaluation loop (enabled by default on supported compilers)]), [ if test "$withval" = yes then @@ -5326,7 +5467,7 @@ do done AC_SUBST(SRCDIRS) -SRCDIRS="Parser Objects Python Modules Modules/_io Programs" +SRCDIRS="Parser Parser/pegen Objects Python Modules Modules/_io Programs" AC_MSG_CHECKING(for build directories) for dir in $SRCDIRS; do if test ! -d $dir; then @@ -5464,8 +5605,8 @@ fi # ensurepip option AC_MSG_CHECKING(for ensurepip) AC_ARG_WITH(ensurepip, - [AS_HELP_STRING([--with(out)-ensurepip=@<:@=upgrade@:>@], - ["install" or "upgrade" using bundled pip])], + [AS_HELP_STRING([--with-ensurepip@<:@=install|upgrade|no@:>@], + ["install" or "upgrade" using bundled pip (default is upgrade)])], [], [with_ensurepip=upgrade]) AS_CASE($with_ensurepip, @@ -5621,11 +5762,11 @@ AH_TEMPLATE(PY_SSL_DEFAULT_CIPHER_STRING, AC_MSG_CHECKING(for --with-ssl-default-suites) AC_ARG_WITH(ssl-default-suites, AS_HELP_STRING([--with-ssl-default-suites=@<:@python|openssl|STRING@:>@], - [Override default cipher suites string, + [override default cipher suites string, python: use Python's preferred selection (default), openssl: leave OpenSSL's defaults untouched, STRING: use a custom string, - PROTOCOL_SSLv2 ignores the setting]), + PROTOCOL_SSLv2 ignores the setting, see Doc/library/ssl.rst]), [ AC_MSG_RESULT($withval) case "$withval" in @@ -5646,6 +5787,31 @@ AC_MSG_RESULT(python) AC_DEFINE(PY_SSL_DEFAULT_CIPHERS, 1) ]) +# builtin hash modules +default_hashlib_hashes="md5,sha1,sha256,sha512,sha3,blake2" +AC_DEFINE([PY_BUILTIN_HASHLIB_HASHES], [], [enabled builtin hash modules] +) +AC_MSG_CHECKING(for --with-builtin-hashlib-hashes) +AC_ARG_WITH(builtin-hashlib-hashes, + AS_HELP_STRING([--with-builtin-hashlib-hashes=md5,sha1,sha256,sha512,sha3,blake2], + [builtin hash modules, + md5, sha1, sha256, sha512, sha3 (with shake), blake2]), +[ +case "$withval" in + yes) + withval=$default_hashlib_hashes + ;; + no) + withval="" + ;; +esac +AC_MSG_RESULT($withval) +AC_DEFINE_UNQUOTED(PY_BUILTIN_HASHLIB_HASHES, "$withval") +], +[ +AC_MSG_RESULT($default_hashlib_hashes); +AC_DEFINE_UNQUOTED(PY_BUILTIN_HASHLIB_HASHES, "$default_hashlib_hashes") +]) # generate output files AC_CONFIG_FILES(Makefile.pre Misc/python.pc Misc/python-embed.pc Misc/python-config.sh) diff --git a/m4/ax_check_openssl.m4 b/m4/ax_check_openssl.m4 index 28e48cbefb68a402a0643d68a38bd5b0aaf848dd..2846fd14c49de49cc8b4a261e0744be57a710d23 100644 --- a/m4/ax_check_openssl.m4 +++ b/m4/ax_check_openssl.m4 @@ -39,7 +39,7 @@ AC_DEFUN([AX_CHECK_OPENSSL], [ found=false AC_ARG_WITH([openssl], [AS_HELP_STRING([--with-openssl=DIR], - [root of the OpenSSL directory])], + [override root of the OpenSSL directory to DIR])], [ case "$withval" in "" | y | ye | yes | n | no) diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 0000000000000000000000000000000000000000..387c8f954ada3cd2bffec1d5905c8ddd3f466d9f --- /dev/null +++ b/netlify.toml @@ -0,0 +1,4 @@ +[build] + base = "Doc/" + command = "make html" + publish = "Doc/build/html" \ No newline at end of file diff --git a/pyconfig.h.in b/pyconfig.h.in index 4263a712c3278f5399d98067167d24afc7a9c0e6..f39858d10c457aec49e25640511ef748e52ca4c9 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -8,6 +8,10 @@ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD +/* BUILD_GNU_TYPE + AIX_BUILDDATE are used to construct the PEP425 tag of the + build system. */ +#undef AIX_BUILDDATE + /* Define for AIX if your compiler is a genuine IBM xlC/xlC_r and you want support for AIX C++ shared extension modules. */ #undef AIX_GENUINE_CPLUSPLUS @@ -44,10 +48,6 @@ /* Define if getpgrp() must be called as getpgrp(0). */ #undef GETPGRP_HAVE_ARG -/* Define if gettimeofday() does not have second (timezone) argument This is - the case on Motorola V4 (R40V4.2) */ -#undef GETTIMEOFDAY_NO_TZ - /* Define to 1 if you have the `accept4' function. */ #undef HAVE_ACCEPT4 @@ -513,9 +513,6 @@ /* Define to 1 if you have the `getspnam' function. */ #undef HAVE_GETSPNAM -/* Define to 1 if you have the `gettimeofday' function. */ -#undef HAVE_GETTIMEOFDAY - /* Define to 1 if you have the `getwd' function. */ #undef HAVE_GETWD @@ -625,12 +622,18 @@ /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_CAN_H +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_CAN_J1939_H + /* Define if compiling using Linux 3.6 or later. */ #undef HAVE_LINUX_CAN_RAW_FD_FRAMES /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_CAN_RAW_H +/* Define if compiling using Linux 4.1 or later. */ +#undef HAVE_LINUX_CAN_RAW_JOIN_FILTERS + /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_MEMFD_H @@ -649,6 +652,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_VM_SOCKETS_H +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_WAIT_H + /* Define to 1 if you have the `lockf' function. */ #undef HAVE_LOCKF @@ -772,6 +778,9 @@ /* Define if you have the 'prlimit' functions. */ #undef HAVE_PRLIMIT +/* Define if you have the '_dyld_shared_cache_contains_path' function. */ +#undef HAVE_DYLD_SHARED_CACHE_CONTAINS_PATH + /* Define to 1 if you have the header file. */ #undef HAVE_PROCESS_H @@ -802,9 +811,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_PTY_H -/* Define to 1 if you have the `putenv' function. */ -#undef HAVE_PUTENV - /* Define to 1 if you have the `pwrite' function. */ #undef HAVE_PWRITE @@ -1263,9 +1269,6 @@ /* Define to 1 if you have the `unlinkat' function. */ #undef HAVE_UNLINKAT -/* Define to 1 if you have the `unsetenv' function. */ -#undef HAVE_UNSETENV - /* Define if you have a useable wchar_t type defined in wchar.h; useable means wchar_t must be an unsigned type with at least 16 bits. (see Include/unicodeobject.h). */ @@ -1382,6 +1385,9 @@ /* Define as the preferred size in bits of long digits */ #undef PYLONG_BITS_IN_DIGIT +/* enabled builtin hash modules */ +#undef PY_BUILTIN_HASHLIB_HASHES + /* Define if you want to coerce the C locale to a UTF-8 based locale */ #undef PY_COERCE_C_LOCALE diff --git a/setup.py b/setup.py index 6340669fffdff3ba386c213e6788c00297b5f803..d42eb9d1174ec5f10488736c428483df217488bd 100644 --- a/setup.py +++ b/setup.py @@ -9,6 +9,26 @@ import sys import sysconfig from glob import glob, escape +import _osx_support + + +try: + import subprocess + del subprocess + SUBPROCESS_BOOTSTRAP = False +except ImportError: + # Bootstrap Python: distutils.spawn uses subprocess to build C extensions, + # subprocess requires C extensions built by setup.py like _posixsubprocess. + # + # Use _bootsubprocess which only uses the os module. + # + # It is dropped from sys.modules as soon as all C extension modules + # are built. + import _bootsubprocess + sys.modules['subprocess'] = _bootsubprocess + del _bootsubprocess + SUBPROCESS_BOOTSTRAP = True + from distutils import log from distutils.command.build_ext import build_ext @@ -76,6 +96,11 @@ def get_platform(): """ +def run_command(cmd): + status = os.system(cmd) + return os.waitstatus_to_exitcode(status) + + # Set common compiler and linker flags derived from the Makefile, # reserved for building the interpreter and the stdlib modules. # See bpo-21121 and bpo-35257 @@ -126,7 +151,9 @@ def sysroot_paths(make_vars, subdirs): break return dirs + MACOS_SDK_ROOT = None +MACOS_SDK_SPECIFIED = None def macosx_sdk_root(): """Return the directory of the current macOS SDK. @@ -138,8 +165,9 @@ def macosx_sdk_root(): (The SDK may be supplied via Xcode or via the Command Line Tools). The SDK paths used by Apple-supplied tool chains depend on the setting of various variables; see the xcrun man page for more info. + Also sets MACOS_SDK_SPECIFIED for use by macosx_sdk_specified(). """ - global MACOS_SDK_ROOT + global MACOS_SDK_ROOT, MACOS_SDK_SPECIFIED # If already called, return cached result. if MACOS_SDK_ROOT: @@ -149,36 +177,37 @@ def macosx_sdk_root(): m = re.search(r'-isysroot\s*(\S+)', cflags) if m is not None: MACOS_SDK_ROOT = m.group(1) + MACOS_SDK_SPECIFIED = MACOS_SDK_ROOT != '/' else: - MACOS_SDK_ROOT = '/' - cc = sysconfig.get_config_var('CC') - tmpfile = '/tmp/setup_sdk_root.%d' % os.getpid() - try: - os.unlink(tmpfile) - except: - pass - ret = os.system('%s -E -v - %s 1>/dev/null' % (cc, tmpfile)) - in_incdirs = False - try: - if ret >> 8 == 0: - with open(tmpfile) as fp: - for line in fp.readlines(): - if line.startswith("#include <...>"): - in_incdirs = True - elif line.startswith("End of search list"): - in_incdirs = False - elif in_incdirs: - line = line.strip() - if line == '/usr/include': - MACOS_SDK_ROOT = '/' - elif line.endswith(".sdk/usr/include"): - MACOS_SDK_ROOT = line[:-12] - finally: - os.unlink(tmpfile) + MACOS_SDK_ROOT = _osx_support._default_sysroot( + sysconfig.get_config_var('CC')) + MACOS_SDK_SPECIFIED = False return MACOS_SDK_ROOT +def macosx_sdk_specified(): + """Returns true if an SDK was explicitly configured. + + True if an SDK was selected at configure time, either by specifying + --enable-universalsdk=(something other than no or /) or by adding a + -isysroot option to CFLAGS. In some cases, like when making + decisions about macOS Tk framework paths, we need to be able to + know whether the user explicitly asked to build with an SDK versus + the implicit use of an SDK when header files are no longer + installed on a running system by the Command Line Tools. + """ + global MACOS_SDK_SPECIFIED + + # If already called, return cached result. + if MACOS_SDK_SPECIFIED: + return MACOS_SDK_SPECIFIED + + # Find the sdk root and set MACOS_SDK_SPECIFIED + macosx_sdk_root() + return MACOS_SDK_SPECIFIED + + def is_macosx_sdk_path(path): """ Returns True if 'path' can be located in an OSX SDK @@ -188,6 +217,13 @@ def is_macosx_sdk_path(path): or path.startswith('/Library/') ) +def grep_headers_for(function, headers): + for header in headers: + with open(header, 'r', errors='surrogateescape') as f: + if function in f.read(): + return True + return False + def find_file(filename, std_dirs, paths): """Searches for the directory where a given file is located, and returns a possibly-empty list of additional directories, or None @@ -280,6 +316,17 @@ def find_library_file(compiler, libname, std_dirs, paths): else: assert False, "Internal error: Path not found in std_dirs or paths" +def validate_tzpath(): + base_tzpath = sysconfig.get_config_var('TZPATH') + if not base_tzpath: + return + + tzpaths = base_tzpath.split(os.pathsep) + bad_paths = [tzpath for tzpath in tzpaths if not os.path.isabs(tzpath)] + if bad_paths: + raise ValueError('TZPATH must contain only absolute paths, ' + + f'found:\n{tzpaths!r}\nwith invalid paths:\n' + + f'{bad_paths!r}') def find_module_file(module, dirlist): """Find a module in a set of possible folders. If it is not found @@ -303,22 +350,21 @@ def __init__(self, dist): self.failed = [] self.failed_on_import = [] self.missing = [] + self.disabled_configure = [] if '-j' in os.environ.get('MAKEFLAGS', ''): self.parallel = True def add(self, ext): self.extensions.append(ext) - def build_extensions(self): + def set_srcdir(self): self.srcdir = sysconfig.get_config_var('srcdir') if not self.srcdir: # Maybe running on Windows but not using CYGWIN? raise ValueError("No source directory; cannot proceed.") self.srcdir = os.path.abspath(self.srcdir) - # Detect which modules should be compiled - self.detect_modules() - + def remove_disabled(self): # Remove modules that are present on the disabled list extensions = [ext for ext in self.extensions if ext.name not in DISABLED_MODULE_LIST] @@ -329,6 +375,7 @@ def build_extensions(self): extensions.append(ctypes) self.extensions = extensions + def update_sources_depends(self): # Fix up the autodetected modules, prefixing all the source files # with Modules/. moddirlist = [os.path.join(self.srcdir, 'Modules')] @@ -341,14 +388,6 @@ def build_extensions(self): headers = [sysconfig.get_config_h_filename()] headers += glob(os.path.join(escape(sysconfig.get_path('include')), "*.h")) - # The sysconfig variables built by makesetup that list the already - # built modules and the disabled modules as configured by the Setup - # files. - sysconf_built = sysconfig.get_config_var('MODBUILT_NAMES').split() - sysconf_dis = sysconfig.get_config_var('MODDISABLED_NAMES').split() - - mods_built = [] - mods_disabled = [] for ext in self.extensions: ext.sources = [ find_module_file(filename, moddirlist) for filename in ext.sources ] @@ -360,6 +399,16 @@ def build_extensions(self): # re-compile extensions if a header file has been changed ext.depends.extend(headers) + def remove_configured_extensions(self): + # The sysconfig variables built by makesetup that list the already + # built modules and the disabled modules as configured by the Setup + # files. + sysconf_built = sysconfig.get_config_var('MODBUILT_NAMES').split() + sysconf_dis = sysconfig.get_config_var('MODDISABLED_NAMES').split() + + mods_built = [] + mods_disabled = [] + for ext in self.extensions: # If a module has already been built or has been disabled in the # Setup files, don't build it here. if ext.name in sysconf_built: @@ -377,6 +426,9 @@ def build_extensions(self): if os.path.exists(fullpath): os.unlink(fullpath) + return (mods_built, mods_disabled) + + def set_compiler_executables(self): # When you run "make CC=altcc" or something similar, you really want # those environment variables passed into the setup.py phase. Here's # a small set of useful ones. @@ -389,11 +441,31 @@ def build_extensions(self): args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags self.compiler.set_executables(**args) + def build_extensions(self): + self.set_srcdir() + + # Detect which modules should be compiled + self.detect_modules() + + self.remove_disabled() + + self.update_sources_depends() + mods_built, mods_disabled = self.remove_configured_extensions() + self.set_compiler_executables() + build_ext.build_extensions(self) + if SUBPROCESS_BOOTSTRAP: + # Drop our custom subprocess module: + # use the newly built subprocess module + del sys.modules['subprocess'] + for ext in self.extensions: self.check_extension_import(ext) + self.summary(mods_built, mods_disabled) + + def summary(self, mods_built, mods_disabled): longest = max([len(e.name) for e in self.extensions], default=0) if self.failed or self.failed_on_import: all_failed = self.failed + self.failed_on_import @@ -435,6 +507,14 @@ def print_three_column(lst): print_three_column([ext.name for ext in mods_disabled]) print() + if self.disabled_configure: + print() + print("The following modules found by detect_modules() in" + " setup.py have not") + print("been built, they are *disabled* by configure:") + print_three_column(self.disabled_configure) + print() + if self.failed: failed = self.failed[:] print() @@ -552,11 +632,11 @@ def add_multiarch_paths(self): tmpfile = os.path.join(self.build_temp, 'multiarch') if not os.path.exists(self.build_temp): os.makedirs(self.build_temp) - ret = os.system( + ret = run_command( '%s -print-multiarch > %s 2> /dev/null' % (cc, tmpfile)) multiarch_path_component = '' try: - if ret >> 8 == 0: + if ret == 0: with open(tmpfile) as fp: multiarch_path_component = fp.readline().strip() finally: @@ -577,11 +657,11 @@ def add_multiarch_paths(self): tmpfile = os.path.join(self.build_temp, 'multiarch') if not os.path.exists(self.build_temp): os.makedirs(self.build_temp) - ret = os.system( + ret = run_command( 'dpkg-architecture %s -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % (opt, tmpfile)) try: - if ret >> 8 == 0: + if ret == 0: with open(tmpfile) as fp: multiarch_path_component = fp.readline().strip() add_dir_to_list(self.compiler.library_dirs, @@ -596,12 +676,12 @@ def add_cross_compiling_paths(self): tmpfile = os.path.join(self.build_temp, 'ccpaths') if not os.path.exists(self.build_temp): os.makedirs(self.build_temp) - ret = os.system('%s -E -v - %s 1>/dev/null' % (cc, tmpfile)) + ret = run_command('%s -E -v - %s 1>/dev/null' % (cc, tmpfile)) is_gcc = False is_clang = False in_incdirs = False try: - if ret >> 8 == 0: + if ret == 0: with open(tmpfile) as fp: for line in fp.readlines(): if line.startswith("gcc version"): @@ -734,12 +814,14 @@ def detect_simple_extensions(self): # math library functions, e.g. sin() self.add(Extension('math', ['mathmodule.c'], + extra_compile_args=['-DPy_BUILD_CORE_MODULE'], extra_objects=[shared_math], depends=['_math.h', shared_math], libraries=['m'])) # complex math library functions self.add(Extension('cmath', ['cmathmodule.c'], + extra_compile_args=['-DPy_BUILD_CORE_MODULE'], extra_objects=[shared_math], depends=['_math.h', shared_math], libraries=['m'])) @@ -757,8 +839,11 @@ def detect_simple_extensions(self): # uses modf(). self.add(Extension('_datetime', ['_datetimemodule.c'], libraries=['m'])) + # zoneinfo module + self.add(Extension('_zoneinfo', ['_zoneinfo.c'])), # random number generator implemented in C - self.add(Extension("_random", ["_randommodule.c"])) + self.add(Extension("_random", ["_randommodule.c"], + extra_compile_args=['-DPy_BUILD_CORE_MODULE'])) # bisect self.add(Extension("_bisect", ["_bisectmodule.c"])) # heapq @@ -780,7 +865,8 @@ def detect_simple_extensions(self): # _opcode module self.add(Extension('_opcode', ['_opcode.c'])) # asyncio speedups - self.add(Extension("_asyncio", ["_asynciomodule.c"])) + self.add(Extension("_asyncio", ["_asynciomodule.c"], + extra_compile_args=['-DPy_BUILD_CORE_MODULE'])) # _abc speedups self.add(Extension("_abc", ["_abc.c"])) # _queue module @@ -887,14 +973,14 @@ def detect_readline_curses(self): # Determine if readline is already linked against curses or tinfo. if do_readline: if CROSS_COMPILING: - ret = os.system("%s -d %s | grep '(NEEDED)' > %s" \ + ret = run_command("%s -d %s | grep '(NEEDED)' > %s" % (sysconfig.get_config_var('READELF'), do_readline, tmpfile)) elif find_executable('ldd'): - ret = os.system("ldd %s > %s" % (do_readline, tmpfile)) + ret = run_command("ldd %s > %s" % (do_readline, tmpfile)) else: - ret = 256 - if ret >> 8 == 0: + ret = 1 + if ret == 0: with open(tmpfile) as fp: for ln in fp: if 'curses' in ln: @@ -1018,9 +1104,9 @@ def detect_readline_curses(self): if (curses_enabled and not skip_curses_panel and self.compiler.find_library_file(self.lib_dirs, panel_library)): self.add(Extension('_curses_panel', ['_curses_panel.c'], - include_dirs=curses_includes, - define_macros=curses_defines, - libraries=[panel_library, *curses_libs])) + include_dirs=curses_includes, + define_macros=curses_defines, + libraries=[panel_library, *curses_libs])) elif not skip_curses_panel: self.missing.append('_curses_panel') @@ -1043,8 +1129,12 @@ def detect_crypt(self): def detect_socket(self): # socket(2) if not VXWORKS: - self.add(Extension('_socket', ['socketmodule.c'], - depends=['socketmodule.h'])) + kwargs = {'depends': ['socketmodule.h']} + if MACOS: + # Issue #35569: Expose RFC 3542 socket options. + kwargs['extra_compile_args'] = ['-D__APPLE_USE_RFC_3542'] + + self.add(Extension('_socket', ['socketmodule.c'], **kwargs)) elif self.compiler.find_library_file(self.lib_dirs, 'net'): libs = ['net'] self.add(Extension('_socket', ['socketmodule.c'], @@ -1609,9 +1699,9 @@ def detect_expat_elementtree(self): ] cc = sysconfig.get_config_var('CC').split()[0] - ret = os.system( + ret = run_command( '"%s" -Werror -Wno-unreachable-code -E -xc /dev/null >/dev/null 2>&1' % cc) - if ret >> 8 == 0: + if ret == 0: extra_compile_args.append('-Wno-unreachable-code') self.add(Extension('pyexpat', @@ -1752,33 +1842,75 @@ def detect_tkinter_explicitly(self): return True def detect_tkinter_darwin(self): - # The _tkinter module, using frameworks. Since frameworks are quite - # different the UNIX search logic is not sharable. + # Build default _tkinter on macOS using Tcl and Tk frameworks. + # + # The macOS native Tk (AKA Aqua Tk) and Tcl are most commonly + # built and installed as macOS framework bundles. However, + # for several reasons, we cannot take full advantage of the + # Apple-supplied compiler chain's -framework options here. + # Instead, we need to find and pass to the compiler the + # absolute paths of the Tcl and Tk headers files we want to use + # and the absolute path to the directory containing the Tcl + # and Tk frameworks for linking. + # + # We want to handle here two common use cases on macOS: + # 1. Build and link with system-wide third-party or user-built + # Tcl and Tk frameworks installed in /Library/Frameworks. + # 2. Build and link using a user-specified macOS SDK so that the + # built Python can be exported to other systems. In this case, + # search only the SDK's /Library/Frameworks (normally empty) + # and /System/Library/Frameworks. + # + # Any other use case should be able to be handled explicitly by + # using the options described above in detect_tkinter_explicitly(). + # In particular it would be good to handle here the case where + # you want to build and link with a framework build of Tcl and Tk + # that is not in /Library/Frameworks, say, in your private + # $HOME/Library/Frameworks directory or elsewhere. It turns + # out to be difficult to make that work automatically here + # without bringing into play more tools and magic. That case + # can be handled using a recipe with the right arguments + # to detect_tkinter_explicitly(). + # + # Note also that the fallback case here is to try to use the + # Apple-supplied Tcl and Tk frameworks in /System/Library but + # be forewarned that they are deprecated by Apple and typically + # out-of-date and buggy; their use should be avoided if at + # all possible by installing a newer version of Tcl and Tk in + # /Library/Frameworks before building Python without + # an explicit SDK or by configuring build arguments explicitly. + from os.path import join, exists - framework_dirs = [ - '/Library/Frameworks', - '/System/Library/Frameworks/', - join(os.getenv('HOME'), '/Library/Frameworks') - ] - sysroot = macosx_sdk_root() + sysroot = macosx_sdk_root() # path to the SDK or '/' - # Find the directory that contains the Tcl.framework and Tk.framework - # bundles. - # XXX distutils should support -F! + if macosx_sdk_specified(): + # Use case #2: an SDK other than '/' was specified. + # Only search there. + framework_dirs = [ + join(sysroot, 'Library', 'Frameworks'), + join(sysroot, 'System', 'Library', 'Frameworks'), + ] + else: + # Use case #1: no explicit SDK selected. + # Search the local system-wide /Library/Frameworks, + # not the one in the default SDK, otherwise fall back to + # /System/Library/Frameworks whose header files may be in + # the default SDK or, on older systems, actually installed. + framework_dirs = [ + join('/', 'Library', 'Frameworks'), + join(sysroot, 'System', 'Library', 'Frameworks'), + ] + + # Find the directory that contains the Tcl.framework and + # Tk.framework bundles. for F in framework_dirs: # both Tcl.framework and Tk.framework should be present - - for fw in 'Tcl', 'Tk': - if is_macosx_sdk_path(F): - if not exists(join(sysroot, F[1:], fw + '.framework')): - break - else: - if not exists(join(F, fw + '.framework')): - break + if not exists(join(F, fw + '.framework')): + break else: - # ok, F is now directory with both frameworks. Continure + # ok, F is now directory with both frameworks. Continue # building break else: @@ -1786,24 +1918,16 @@ def detect_tkinter_darwin(self): # will now resume. return False - # For 8.4a2, we must add -I options that point inside the Tcl and Tk - # frameworks. In later release we should hopefully be able to pass - # the -F option to gcc, which specifies a framework lookup path. - # include_dirs = [ join(F, fw + '.framework', H) for fw in ('Tcl', 'Tk') - for H in ('Headers', 'Versions/Current/PrivateHeaders') + for H in ('Headers',) ] - # For 8.4a2, the X11 headers are not included. Rather than include a - # complicated search, this is a hard-coded path. It could bail out - # if X11 libs are not found... - include_dirs.append('/usr/X11R6/include') - frameworks = ['-framework', 'Tcl', '-framework', 'Tk'] + # Add the base framework directory as well + compile_args = ['-F', F] - # All existing framework builds of Tcl/Tk don't support 64-bit - # architectures. + # Do not build tkinter for archs that this Tk was not built with. cflags = sysconfig.get_config_vars('CFLAGS')[0] archs = re.findall(r'-arch\s+(\w+)', cflags) @@ -1811,13 +1935,9 @@ def detect_tkinter_darwin(self): if not os.path.exists(self.build_temp): os.makedirs(self.build_temp) - # Note: cannot use os.popen or subprocess here, that - # requires extensions that are not available here. - if is_macosx_sdk_path(F): - os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(os.path.join(sysroot, F[1:]), tmpfile)) - else: - os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(F, tmpfile)) - + run_command( + "file {}/Tk.framework/Tk | grep 'for architecture' > {}".format(F, tmpfile) + ) with open(tmpfile) as fp: detected_archs = [] for ln in fp: @@ -1826,16 +1946,26 @@ def detect_tkinter_darwin(self): detected_archs.append(ln.split()[-1]) os.unlink(tmpfile) + arch_args = [] for a in detected_archs: - frameworks.append('-arch') - frameworks.append(a) + arch_args.append('-arch') + arch_args.append(a) + + compile_args += arch_args + link_args = [','.join(['-Wl', '-F', F, '-framework', 'Tcl', '-framework', 'Tk']), *arch_args] + + # The X11/xlib.h file bundled in the Tk sources can cause function + # prototype warnings from the compiler. Since we cannot easily fix + # that, suppress the warnings here instead. + if '-Wstrict-prototypes' in cflags.split(): + compile_args.append('-Wno-strict-prototypes') self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'], define_macros=[('WITH_APPINIT', 1)], include_dirs=include_dirs, libraries=[], - extra_compile_args=frameworks[2:], - extra_link_args=frameworks)) + extra_compile_args=compile_args, + extra_link_args=link_args)) return True def detect_tkinter(self): @@ -1956,45 +2086,19 @@ def detect_tkinter(self): library_dirs=added_lib_dirs)) return True - def configure_ctypes_darwin(self, ext): - # Darwin (OS X) uses preconfigured files, in - # the Modules/_ctypes/libffi_osx directory. - ffi_srcdir = os.path.abspath(os.path.join(self.srcdir, 'Modules', - '_ctypes', 'libffi_osx')) - sources = [os.path.join(ffi_srcdir, p) - for p in ['ffi.c', - 'x86/darwin64.S', - 'x86/x86-darwin.S', - 'x86/x86-ffi_darwin.c', - 'x86/x86-ffi64.c', - 'powerpc/ppc-darwin.S', - 'powerpc/ppc-darwin_closure.S', - 'powerpc/ppc-ffi_darwin.c', - 'powerpc/ppc64-darwin_closure.S', - ]] - - # Add .S (preprocessed assembly) to C compiler source extensions. - self.compiler.src_extensions.append('.S') - - include_dirs = [os.path.join(ffi_srcdir, 'include'), - os.path.join(ffi_srcdir, 'powerpc')] - ext.include_dirs.extend(include_dirs) - ext.sources.extend(sources) - return True - def configure_ctypes(self, ext): - if not self.use_system_libffi: - if MACOS: - return self.configure_ctypes_darwin(ext) - print('INFO: Could not locate ffi libs and/or headers') - return False return True def detect_ctypes(self): # Thomas Heller's _ctypes module - self.use_system_libffi = False + + if (not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and MACOS): + self.use_system_libffi = True + else: + self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") + include_dirs = [] - extra_compile_args = [] + extra_compile_args = ['-DPy_BUILD_CORE_MODULE'] extra_link_args = [] sources = ['_ctypes/_ctypes.c', '_ctypes/callbacks.c', @@ -2005,11 +2109,9 @@ def detect_ctypes(self): if MACOS: sources.append('_ctypes/malloc_closure.c') - sources.append('_ctypes/darwin/dlfcn_simple.c') + extra_compile_args.append('-DUSING_MALLOC_CLOSURE_DOT_C=1') extra_compile_args.append('-DMACOSX') include_dirs.append('_ctypes/darwin') - # XXX Is this still needed? - # extra_link_args.extend(['-read_only_relocs', 'warning']) elif HOST_PLATFORM == 'sunos5': # XXX This shouldn't be necessary; it appears that some @@ -2039,31 +2141,48 @@ def detect_ctypes(self): sources=['_ctypes/_ctypes_test.c'], libraries=['m'])) + ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") + ffi_lib = None + ffi_inc_dirs = self.inc_dirs.copy() if MACOS: - if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"): - return - # OS X 10.5 comes with libffi.dylib; the include files are - # in /usr/include/ffi - ffi_inc_dirs.append('/usr/include/ffi') - - ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] - if not ffi_inc or ffi_inc[0] == '': - ffi_inc = find_file('ffi.h', [], ffi_inc_dirs) - if ffi_inc is not None: - ffi_h = ffi_inc[0] + '/ffi.h' + ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") + + if not ffi_inc: + if os.path.exists(ffi_in_sdk): + ext.extra_compile_args.append("-DUSING_APPLE_OS_LIBFFI=1") + ffi_inc = ffi_in_sdk + ffi_lib = 'ffi' + else: + # OS X 10.5 comes with libffi.dylib; the include files are + # in /usr/include/ffi + ffi_inc_dirs.append('/usr/include/ffi') + + if not ffi_inc: + found = find_file('ffi.h', [], ffi_inc_dirs) + if found: + ffi_inc = found[0] + if ffi_inc: + ffi_h = ffi_inc + '/ffi.h' if not os.path.exists(ffi_h): ffi_inc = None print('Header file {} does not exist'.format(ffi_h)) - ffi_lib = None - if ffi_inc is not None: + if ffi_lib is None and ffi_inc: for lib_name in ('ffi', 'ffi_pic'): if (self.compiler.find_library_file(self.lib_dirs, lib_name)): ffi_lib = lib_name break if ffi_inc and ffi_lib: - ext.include_dirs.extend(ffi_inc) + ffi_headers = glob(os.path.join(ffi_inc, '*.h')) + if grep_headers_for('ffi_prep_cif_var', ffi_headers): + ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") + if grep_headers_for('ffi_prep_closure_loc', ffi_headers): + ext.extra_compile_args.append("-DHAVE_FFI_PREP_CLOSURE_LOC=1") + if grep_headers_for('ffi_closure_alloc', ffi_headers): + ext.extra_compile_args.append("-DHAVE_FFI_CLOSURE_ALLOC=1") + + ext.include_dirs.append(ffi_inc) ext.libraries.append(ffi_lib) self.use_system_libffi = True @@ -2097,7 +2216,7 @@ def detect_decimal(self): '_decimal/libmpdec/fnt.c', '_decimal/libmpdec/fourstep.c', '_decimal/libmpdec/io.c', - '_decimal/libmpdec/memory.c', + '_decimal/libmpdec/mpalloc.c', '_decimal/libmpdec/mpdecimal.c', '_decimal/libmpdec/numbertheory.c', '_decimal/libmpdec/sixstep.c', @@ -2244,34 +2363,73 @@ def split_var(name, sep): libraries=openssl_libs)) def detect_hash_builtins(self): - # We always compile these even when OpenSSL is available (issue #14693). - # It's harmless and the object code is tiny (40-50 KiB per module, - # only loaded when actually used). - self.add(Extension('_sha256', ['sha256module.c'], - depends=['hashlib.h'])) - self.add(Extension('_sha512', ['sha512module.c'], - depends=['hashlib.h'])) - self.add(Extension('_md5', ['md5module.c'], - depends=['hashlib.h'])) - self.add(Extension('_sha1', ['sha1module.c'], - depends=['hashlib.h'])) - - blake2_deps = glob(os.path.join(escape(self.srcdir), - 'Modules/_blake2/impl/*')) - blake2_deps.append('hashlib.h') - - self.add(Extension('_blake2', - ['_blake2/blake2module.c', - '_blake2/blake2b_impl.c', - '_blake2/blake2s_impl.c'], - depends=blake2_deps)) - - sha3_deps = glob(os.path.join(escape(self.srcdir), - 'Modules/_sha3/kcp/*')) - sha3_deps.append('hashlib.h') - self.add(Extension('_sha3', - ['_sha3/sha3module.c'], - depends=sha3_deps)) + # By default we always compile these even when OpenSSL is available + # (issue #14693). It's harmless and the object code is tiny + # (40-50 KiB per module, only loaded when actually used). Modules can + # be disabled via the --with-builtin-hashlib-hashes configure flag. + supported = {"md5", "sha1", "sha256", "sha512", "sha3", "blake2"} + + configured = sysconfig.get_config_var("PY_BUILTIN_HASHLIB_HASHES") + configured = configured.strip('"').lower() + configured = { + m.strip() for m in configured.split(",") + } + + self.disabled_configure.extend( + sorted(supported.difference(configured)) + ) + + if "sha256" in configured: + self.add(Extension( + '_sha256', ['sha256module.c'], + extra_compile_args=['-DPy_BUILD_CORE_MODULE'], + depends=['hashlib.h'] + )) + + if "sha512" in configured: + self.add(Extension( + '_sha512', ['sha512module.c'], + extra_compile_args=['-DPy_BUILD_CORE_MODULE'], + depends=['hashlib.h'] + )) + + if "md5" in configured: + self.add(Extension( + '_md5', ['md5module.c'], + depends=['hashlib.h'] + )) + + if "sha1" in configured: + self.add(Extension( + '_sha1', ['sha1module.c'], + depends=['hashlib.h'] + )) + + if "blake2" in configured: + blake2_deps = glob( + os.path.join(escape(self.srcdir), 'Modules/_blake2/impl/*') + ) + blake2_deps.append('hashlib.h') + self.add(Extension( + '_blake2', + [ + '_blake2/blake2module.c', + '_blake2/blake2b_impl.c', + '_blake2/blake2s_impl.c' + ], + depends=blake2_deps + )) + + if "sha3" in configured: + sha3_deps = glob( + os.path.join(escape(self.srcdir), 'Modules/_sha3/kcp/*') + ) + sha3_deps.append('hashlib.h') + self.add(Extension( + '_sha3', + ['_sha3/sha3module.c'], + depends=sha3_deps + )) def detect_nis(self): if MS_WINDOWS or CYGWIN or HOST_PLATFORM == 'qnx6': @@ -2396,6 +2554,7 @@ class DummyProcess: ProcessPoolExecutor = None sys.modules['concurrent.futures.process'] = DummyProcess + validate_tzpath() # turn off warnings when deprecated modules are imported import warnings